diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..ee5839968a2bf86c93283efc09d40fd050b7cfa2 --- /dev/null +++ b/LICENSE @@ -0,0 +1,127 @@ + 木兰宽松许可证, 第2版 + + 木兰宽松许可证, 第2版 + 2020年1月 http://license.coscl.org.cn/MulanPSL2 + + + 您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第2版(“本许可证”)的如下条款的约束: + + 0. 定义 + + “软件”是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。 + + “贡献”是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。 + + “贡献者”是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。 + + “法人实体”是指提交贡献的机构及其“关联实体”。 + + “关联实体”是指,对“本许可证”下的行为方而言,控制、受控制或与其共同受控制的机构,此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。 + + 1. 授予版权许可 + + 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。 + + 2. 授予专利许可 + + 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。 + + 3. 无商标许可 + + “本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定的声明义务而必须使用除外。 + + 4. 分发限制 + + 您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。 + + 5. 免责声明与责任限制 + + “软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。 + + 6. 语言 + “本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文版为准。 + + 条款结束 + + 如何将木兰宽松许可证,第2版,应用到您的软件 + + 如果您希望将木兰宽松许可证,第2版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步: + + 1, 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字; + + 2, 请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中; + + 3, 请将如下声明文本放入每个源文件的头部注释中。 + + Copyright (c) [Year] [name of copyright holder] + [Software Name] is licensed under Mulan PSL v2. + You can use this software according to the terms and conditions of the Mulan PSL v2. + You may obtain a copy of Mulan PSL v2 at: + http://license.coscl.org.cn/MulanPSL2 + THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + See the Mulan PSL v2 for more details. + + + Mulan Permissive Software License,Version 2 + + Mulan Permissive Software License,Version 2 (Mulan PSL v2) + January 2020 http://license.coscl.org.cn/MulanPSL2 + + Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v2 (this License) with the following terms and conditions: + + 0. Definition + + Software means the program and related documents which are licensed under this License and comprise all Contribution(s). + + Contribution means the copyrightable work licensed by a particular Contributor under this License. + + Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License. + + Legal Entity means the entity making a Contribution and all its Affiliates. + + Affiliates means entities that control, are controlled by, or are under common control with the acting entity under this License, ‘control’ means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity. + + 1. Grant of Copyright License + + Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not. + + 2. Grant of Patent License + + Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution, where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed. The patent license shall not apply to any modification of the Contribution, and any other combination which includes the Contribution. If you or your Affiliates directly or indirectly institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken. + + 3. No Trademark License + + No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in Section 4. + + 4. Distribution Restriction + + You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software. + + 5. Disclaimer of Warranty and Limitation of Liability + + THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO MATTER HOW IT’S CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + 6. Language + + THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION SHALL PREVAIL. + + END OF THE TERMS AND CONDITIONS + + How to Apply the Mulan Permissive Software License,Version 2 (Mulan PSL v2) to Your Software + + To apply the Mulan PSL v2 to your work, for easy identification by recipients, you are suggested to complete following three steps: + + i Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner; + + ii Create a file named “LICENSE” which contains the whole context of this License in the first directory of your software package; + + iii Attach the statement to the appropriate annotated syntax at the beginning of each source file. + + + Copyright (c) [Year] [name of copyright holder] + [Software Name] is licensed under Mulan PSL v2. + You can use this software according to the terms and conditions of the Mulan PSL v2. + You may obtain a copy of Mulan PSL v2 at: + http://license.coscl.org.cn/MulanPSL2 + THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + See the Mulan PSL v2 for more details. diff --git a/README.md b/README.md index 4290b45f8530fb6c1de6fc4933cf0a926f4f44d2..28260b2479adad1dbaf79705a69504a243ffc21a 100644 --- a/README.md +++ b/README.md @@ -2,22 +2,70 @@ #### 介绍 One-stop resource full-cycle management platform. +一站式资源全周期管控平台:基于开源组件进行二次研发,围绕数据中心、机柜、网络以及裸机资源池、硬件巡检、自动部署、带外管理等主要功能模块,结合全生命周期闭环管理理念设计运营流程进行构建,实现部署架构灵活可靠+资源架构兼容可扩的"双可"平台。 #### 软件架构 -软件架构说明 - +软件架构 +![alt text](docs/系统架构图.png) #### 安装教程 +0. 环境 +- 操作系统版本: openEuler release 20.03 (LTS-SP3) +- 容器部署: systemd-nspawn + +1. 下载安装包 + +- https://gitee.com/src-openeuler/CyclOne + +2. 容器部署 +- 解压 cyclone.tar + +```plain +umask 022 +mkdir -p /data/cyclone +tar --numeric-owner -xpf cyclone.tar -C /data/cyclone +``` + +- 创建 systemd-nspawn 服务 + +```plain +cat > /lib/systemd/system/systemd-nspawn@.service <<'EOF' +[Unit] +Description=Container %I +Documentation=man:systemd-nspawn(1) +PartOf=machines.target +Before=machines.target + +[Service] +ExecStart=/usr/bin/systemd-nspawn --quiet --keep-unit --boot --link-journal=try-guest --machine=%I -D /data/%I +KillMode=mixed +Type=notify +RestartForceExitStatus=133 +SuccessExitStatus=133 +Slice=machine.slice +Delegate=yes + +[Install] +WantedBy=machines.target +EOF +``` + + +- 启动 cyclone 容器 + +```plain +systemctl stop firewalld +setenforce 0 +systemctl enable systemd-nspawn@cyclone +systemctl start systemd-nspawn@cyclone + + -1. xxxx -2. xxxx -3. xxxx +``` #### 使用说明 -1. xxxx -2. xxxx -3. xxxx +1.访问项目:http://127.0.0.1 #### 参与贡献 diff --git a/cyclone-server/.gitignore b/cyclone-server/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..439f87f9fd9eb252ab789b6a110e740eaefe7abb --- /dev/null +++ b/cyclone-server/.gitignore @@ -0,0 +1,43 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so +*.db +.idea +cloudboot-server +hw-server + +# Folders +_obj +_test +bin +pkg +doc/doc +src/cmd/cloudboot-license-create-tool/ +.vscode +.cache +release +dist + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +.DS_Store + +# Front +node_modules/ +idcshell-ui/ + + +# vim +*.sw[op] diff --git a/cyclone-server/Makefile b/cyclone-server/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..71bb08794aa47a9298c9131e5452b437b6154b51 --- /dev/null +++ b/cyclone-server/Makefile @@ -0,0 +1,42 @@ +#Makefile for Jenkins +#Copyright (C) to cloudboot +PREFIX=$(shell pwd) +BINDIR=$(PREFIX)/bin +CONFDIR=$(PREFIX)/doc/conf +HOSTOS=$(shell go env GOHOSTOS) +HOSTARCH=$(shell go env GOHOSTARCH) +GOOSS=$(GOOS) + +DST=$(PREFIX)/cmd + + +BINDIRLNAMD64=$(BINDIR)/linux_amd64 +BINDIRLNARM64=$(BINDIR)/linux_arm64 + +ifeq (${HOSTOS}_${HOSTARCH}, linux_amd64) + BINDIRLNAMD64=$(BINDIR) +else ifeq (${HOSTOS}_${HOSTARCH}, linux_arm64) + BINDIRLNARM64=$(BINDIR) +endif + +build: + GOOS=linux GOARCH=amd64 gbb --debug + + @mkdir -p ${DST}/bin/ + @mkdir -p ${DST}/etc/ + + @cp -rf $(CONFDIR)/* ${DST}/etc/ + @cp -rf $(BINDIRLNAMD64)/cloudboot-server ${DST}/bin/ + @cp -rf $(BINDIRLNAMD64)/cloudboot-agent ${DST}/bin/ + @cp -rf $(BINDIRLNAMD64)/hw-server ${DST}/bin/ + + GOOS=linux GOARCH=arm64 gbb --debug + + @cp -rf $(BINDIRLNARM64)/cloudboot-agent ${DST}/bin/cloudboot-agent-arm64 + @cp -rf $(BINDIRLNARM64)/hw-server ${DST}/bin/hw-server-arm64 + +clean: + rm -rf $(BINDIR) + rm -rf ${PREFIX}/cmd/ + +.PHONY: build clean \ No newline at end of file diff --git a/cyclone-server/README.md b/cyclone-server/README.md new file mode 100644 index 0000000000000000000000000000000000000000..840bc7f4c3ef3f4e40431a2dd0301a9a459f4f32 --- /dev/null +++ b/cyclone-server/README.md @@ -0,0 +1,244 @@ +# 目录 +- [Compile & Running](#compile-running) +- [Go code style guide](#go-code-style-guide) +- [REST API guide](#rest-api-guide) +- [Git commit message guide](#git-commit-message-guide) + +# Compile & Running +- 安装go、git(略) + +- 下载源码 + + ```shell + $ cd /home/voidint + $ git clone -b webank git@gitlab.idcos.com:CloudBoot/cloudboot.git cloudboot-webank + ``` + +- 将项目根目录纳入GOPATH环境变量 + + ```shell + $ export GOPATH="$GOPATH:/home/voidint/workspace/cloudboot-webank" + ``` + +- 下载gbb(可选) + + ```shell + $ go get -u -v github.com/voidint/gbb + ``` + +- 使用gbb编译所有可执行文件 + + ```shell + $ cd /home/voidint/workspace/cloudboot-webank + $ gbb -a --debug + ``` + +- 或者使用go原生工具链编译可执行文件 + + ```shell + $ cd /home/voidint/workspace/cloudboot-webank/src/idcos.io/cloudboot/cmd/cloudboot-server + $ go install + ``` + +- 准备MySQL数据库环境 + - 创建数据库 + + ```shell + mysql> CREATE DATABASE IF NOT EXISTS `cloudboot_webank` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; + ``` + - 导入工程内的全量SQL文件 + + ```shell + $ mysql -h 127.0.0.1 -P 3307 -u root -p cloudboot_webank < ./doc/db/webank.sql + ``` + +- 启动cloudboot-server + + ```shell + $ cloudboot-server -c /path/to/cloudboot-server.conf + ``` + +# Go code style guide +戳[这里](https://github.com/voidint/go-style-guide) + +# REST API guide +- URL中集合资源的操作使用名词复数。 + + Don't + + ``` + // 查询所有用户 + GET /examples/user + GET /examples/user/list + + // 查询所有用户的所有图书 + GET /examples/user/book + GET /examples/user/book/list + ``` + + Do + + ``` + // 查询所有用户 + GET/examples/users + + // 查询所有用户的所有图书 + GET /examples/users/books + ``` + +- URL中对单个资源的操作可以使用单数。 + + Don't + + ``` + // 查询id为101的用户的学校信息 + GET /examples/users/101/schools + ``` + + Do + + ``` + // 查询id为101的用户的学校信息(假定某一时刻所在的学校只有一个) + GET /examples/users/101/school + ``` + +- URL中资源的命名需要由多个单词构成时,使用中划线(`-`)连接。 + + Don't + + ``` + // 查询id为101的用户的用户名 + GET /examples/users/101/user_name + GET /examples/users/101/userName + ``` + + Do + + ``` + // 查询id为101的用户的用户名 + GET /examples/users/101/user-name + ``` + + +- URL中不要出现动词,使用`HTTP Methods`表示对URL资源的操作动作。 + + Don't + + ``` + // 更新用户信息 + POST /examples/users/update + POST /examples/updateUser + ``` + + Do + + ``` + // 更新用户信息 + PUT /examples/users + ``` +- 对于资源集合中的某一具体资源的操作,建议将具体资源的标识符放入URL中。 + + Don't + + ``` + // 查询id为101的用户信息 + GET /examples/users?id=101 + + // 查询id为101的用户的所有图书 + GET /examples/users/books?id=101 + ``` + + Do + + ``` + // 查询id为101的用户信息 + GET /examples/users/101 + + // 查询id为101的用户的所有图书 + GET /examples/users/101/books + ``` + +- URL中的每一级遵循资源范围上`从大到小`、`从广到窄`的排列原则,URL的末尾是当前操作的目标。 + + Don't + + ``` + // 查询id为101的用户的所有图书的所有作者 + GET /examples/books/authors/users/101 // 这个查询操作的目标应该是图书作者,而非用户。 + ``` + + Do + + ``` + // 查询id为101的用户的所有图书的所有作者 + // 资源范围从广到窄应该是"所有用户的集合"-->"某个用户"-->"某个用户拥有的所有图书"-->"某个用户拥有图书的作者集合",而当前操作的目标应该是"作者"这一资源 + GET /examples/users/101/books/authors + ``` + +- `Request`和`Response`字段一律小写(若由多个单词组成,则用下划线(`_`)连接多个单词)。 + + Don't + + ``` + GET /examples/users?UserName=voidint + ``` + + Do + + ``` + GET /examples/users?user_name=voidint + ``` + +- 操作失败情况下,不能使用`200`作为`HTTP Status code`,使用合适的[HTTP Status Codes](https://httpstatuses.com/)。 + + Don't + + ``` + // 查询系统中并不存在的id为101的用户 + GET /examples/users/101 + Response HTTP Status Code: 200 + Response Body: {"status": "success", "message": "user(id=101) not found"} + ``` + + Do + + ``` + // 查询系统中并不存在的id为101的用户 + GET /examples/users/101 + Response HTTP Status Code:404 + Response Body: {"status": "success", "message": "user(id=101) not found"} + ``` + +- MIME类型为`Application/json`的`Response Body`要求遵循以下结构 + + ```json + { + "status": "success/failure", + "message": "balabala...", + "content": { + + } + } + ``` + +# Git commit message guide +### 前缀 +- `Add feature`: 新增新特性/功能 +- `Mofidy feature`: 修改原有特性/功能(功能/特性上发生了变化) +- `Fixbug`: bug修复 +- `Add lib`: 新增第三方库 +- `Upgrade lib`: 升级第三方库 +- `Remove lib`: 移除第三方库 +- `Add doc`: 添加文档 +- `Modify doc`: 修改文档 +- `Add comment`: 添加注释 +- `Code refactor`: 代码重构(功能/特性保持不变,代码层面的重构) +- `Code optimization`: 代码优化 +- `Add ut`: 添加单元测试 +- `Fix ut`: 修复单元测试 +- `Modify SQL`: 修改SQL +- `Fix conflict`: 冲突修复 +- `Remove file`: 移除文件/目录 +- ...... + + diff --git a/cyclone-server/VERSION b/cyclone-server/VERSION new file mode 100644 index 0000000000000000000000000000000000000000..5ebba4f08adf9a2c65bd6a54d3ed17792d5fe285 --- /dev/null +++ b/cyclone-server/VERSION @@ -0,0 +1 @@ +1.5.5 \ No newline at end of file diff --git a/cyclone-server/dist.sh b/cyclone-server/dist.sh new file mode 100644 index 0000000000000000000000000000000000000000..0321ae80673591b88e2c536fce3b4a772a8f6260 --- /dev/null +++ b/cyclone-server/dist.sh @@ -0,0 +1,36 @@ +#!/bin/sh +export ROOT_DIR=$PWD +export DST_DIR="$ROOT_DIR/dist" +export NOW=$(date "+%Y%m%d%H%M%S") + + +mkdir -p $DST_DIR +rm -rf $DST_DIR/* +rm -rf $ROOT_DIR/bin/* $ROOT_DIR/pkg/* + +echo "============================交叉编译(Linux-AMD64)============================" +GOOS=linux GOARCH=amd64 gbb --debug +cd $ROOT_DIR/bin/linux_amd64 +tar -czv -f $DST_DIR/cloudboot-server-linux-amd64-$NOW.tar.gz ./cloudboot-server +tar -czv -f $DST_DIR/cloudboot-agent-linux-amd64-$NOW.tar.gz ./cloudboot-agent +tar -czv -f $DST_DIR/hw-server-linux-amd64-$NOW.tar.gz ./hw-server +rm -rf $ROOT_DIR/bin/* $ROOT_DIR/pkg/* +cd $ROOT_DIR + +echo "============================交叉编译(Linux-ARM64)============================" +GOOS=linux GOARCH=arm64 gbb --debug +cd $ROOT_DIR/bin/linux_arm64 +tar -czv -f $DST_DIR/cloudboot-agent-linux-arm64-$NOW.tar.gz ./cloudboot-agent +tar -czv -f $DST_DIR/hw-server-linux-arm64-$NOW.tar.gz ./hw-server +rm -rf $ROOT_DIR/bin/* $ROOT_DIR/pkg/* +cd $ROOT_DIR + +# echo "============================交叉编译(windows-amd64)============================" +# GOOS=windows GOARCH=amd64 gbb --debug +# cd $ROOT_DIR/bin/windows_amd64 +# tar -czv -f $DST_DIR/peagent-windows-amd64-$NOW.tar.gz ./peagent.exe +# tar -czv -f $DST_DIR/peconfig-windows-amd64-$NOW.tar.gz ./peconfig.exe +# tar -czv -f $DST_DIR/winconfig-windows-amd64-$NOW.tar.gz ./winconfig.exe +# tar -czv -f $DST_DIR/win-image-server-windows-amd64-$NOW.tar.gz ./win-image-server.exe +# rm -rf $ROOT_DIR/bin/* $ROOT_DIR/pkg/* +# cd $ROOT_DIR \ No newline at end of file diff --git a/cyclone-server/doc/api/swagger.json b/cyclone-server/doc/api/swagger.json new file mode 100644 index 0000000000000000000000000000000000000000..882cbd0cb9d7909458573859ee7c2a729981404b --- /dev/null +++ b/cyclone-server/doc/api/swagger.json @@ -0,0 +1,8513 @@ +{ + "schemes": [ + "http" + ], + "swagger": "2.0", + "info": { + "description": "Provide cloudboot-server APIs info", + "title": "cloudboot-server APIs", + "version": "webank" + }, + "host": "localhost:8082", + "basePath": "/api/cloudboot/v1", + "paths": { + "/api/cloudboot/v1/device": { + "put": { + "description": "修改物理机", + "tags": [ + "物理机" + ], + "summary": "修改物理机", + "operationId": "UpdateDeviceReq", + "parameters": [ + { + "type": "integer", + "format": "uint64", + "x-go-name": "ID", + "description": "ID", + "name": "id", + "in": "query" + }, + { + "type": "string", + "x-go-name": "FixedAssetNum", + "description": "固资编号", + "name": "fixed_asset_number", + "in": "query" + }, + { + "type": "string", + "x-go-name": "SN", + "description": "序列号", + "name": "sn", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Vendor", + "description": "带外IP 不支持此处修改\nOOBIP string `json:\"oob_ip\"`\n带外用户 不支持此处修改\nOOBUser string `json:\"oob_user\"`\n带外密码 不支持此处修改\nOOBPassword string `json:\"oob_password\"`\n厂商", + "name": "vendor", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Model", + "description": "型号", + "name": "model", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Usage", + "description": "用途 'TDSQL','APP','CVM','TGW','NAS','Other'", + "name": "usage", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Category", + "description": "分类", + "name": "category", + "in": "query" + }, + { + "type": "integer", + "format": "uint64", + "x-go-name": "IDCID", + "description": "数据中心ID", + "name": "idc_id", + "in": "query" + }, + { + "type": "integer", + "format": "uint64", + "x-go-name": "ServerRoomID", + "description": "机房管理单元ID", + "name": "server_room_id", + "in": "query" + }, + { + "type": "integer", + "format": "uint64", + "x-go-name": "CabinetID", + "description": "机架ID", + "name": "server_cabinet_id", + "in": "query" + }, + { + "type": "integer", + "format": "uint64", + "x-go-name": "USiteID", + "description": "机位ID", + "name": "server_usite_id", + "in": "query" + }, + { + "type": "string", + "x-go-name": "HardwareRemark", + "description": "硬件说明", + "name": "hardware_remark", + "in": "query" + }, + { + "type": "string", + "x-go-name": "RAIDRemark", + "description": "RAID说明", + "name": "raid_remark", + "in": "query" + }, + { + "type": "string", + "x-go-name": "StartedAt", + "description": "启用时间", + "name": "started_at", + "in": "query" + }, + { + "type": "string", + "x-go-name": "OnShelveAt", + "description": "上架时间", + "name": "onshelve_at", + "in": "query" + }, + { + "type": "string", + "x-go-name": "OperationStatus", + "description": "部署状态", + "name": "operation_status", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/IDResp" + } + } + } + }, + "/api/cloudboot/v1/devices": { + "delete": { + "description": "删除物理机", + "tags": [ + "物理机" + ], + "summary": "删除物理机", + "operationId": "DeleteDeviceReq", + "parameters": [ + { + "type": "array", + "items": { + "type": "integer", + "format": "uint64" + }, + "x-go-name": "IDs", + "name": "ids", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/UpdateIDCStatusResp" + } + } + } + }, + "/api/cloudboot/v1/devices/settings": { + "delete": { + "description": "批量删除设备装机参数", + "tags": [ + "装机参数" + ], + "summary": "批量删除设备装机参数", + "operationId": "DelBatchReq", + "parameters": [ + { + "name": "Body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/RemoveDeviceSettingsReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/AffectedResp" + }, + "400": { + "$ref": "#/responses/RespFor400" + }, + "401": { + "$ref": "#/responses/RespFor401" + }, + "500": { + "$ref": "#/responses/RespFor500" + } + } + } + }, + "/api/cloudboot/v1/devices/{sn}/oob": { + "get": { + "description": "根据SN查询带外用户及密码", + "tags": [ + "带外管理" + ], + "summary": "根据SN查询带外用户及密码", + "operationId": "GetOOBUserSN", + "parameters": [ + { + "type": "string", + "x-go-name": "SN", + "description": "SNReq", + "name": "sn", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/OOBUserResp" + } + } + } + }, + "/api/cloudboot/v1/devices/{sn}/oob/password": { + "put": { + "description": "修改指定SN的带外用户密码", + "tags": [ + "带外管理" + ], + "summary": "修改指定SN的带外用户密码", + "operationId": "UpdateOOBPasswordReq", + "parameters": [ + { + "name": "JSONBody", + "in": "body", + "schema": { + "$ref": "#/definitions/UpdateOOBPasswordReq" + } + }, + { + "type": "string", + "x-go-name": "SN", + "name": "sn", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/OOBUserResp" + } + } + } + }, + "/devices": { + "get": { + "description": "查询物理机分页列表", + "tags": [ + "物理机" + ], + "summary": "查询物理机分页列表", + "operationId": "GetDevicePageReq", + "parameters": [ + { + "type": "string", + "x-go-name": "FixedAssetNum", + "description": "固资编号", + "name": "fixed_asset_number", + "in": "query" + }, + { + "type": "string", + "x-go-name": "SN", + "description": "序列号", + "name": "sn", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Vendor", + "description": "厂商", + "name": "vendor", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Model", + "description": "型号", + "name": "model", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Usage", + "description": "用途 'TDSQL','APP','CVM','TGW','NAS','Other'", + "name": "usage", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Category", + "description": "分类", + "name": "category", + "in": "query" + }, + { + "type": "string", + "x-go-name": "OperationStatus", + "description": "运营状态:运营中(需告警),运营中(无需告警),重装中,搬迁中,待退役,已退役,待部署,已上架,回收中'('run_with_alarm','run_without_alarm','reinstalling','moving','pre_retire','retired','pre_deploy','on_shelve','recycling')", + "name": "operation_status", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "name": "Page", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "name": "PageSize", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/DevicePageResp" + } + } + } + }, + "/devices/imports": { + "post": { + "description": "导入物理机文件", + "tags": [ + "物理机" + ], + "summary": "导入物理机文件", + "operationId": "DeviceImportReq", + "parameters": [ + { + "name": "JSONBody", + "in": "body", + "schema": { + "$ref": "#/definitions/ImportReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/AffectedResp" + } + } + } + }, + "/devices/imports/previews": { + "post": { + "description": "导入物理机文件预览", + "tags": [ + "物理机" + ], + "summary": "导入物理机文件预览", + "operationId": "DeviceImportPreviewReq", + "parameters": [ + { + "name": "JSONBody", + "in": "body", + "schema": { + "$ref": "#/definitions/ImportReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/ImportPreviewResp" + } + } + } + }, + "/devices/inspections": { + "get": { + "description": "获取巡检分页", + "tags": [ + "巡检" + ], + "summary": "获取巡检分页", + "operationId": "GetInspectionsPageReq", + "parameters": [ + { + "type": "string", + "x-go-name": "Keyword", + "description": "关键词", + "name": "keyword", + "in": "query" + }, + { + "type": "string", + "x-go-name": "SN", + "description": "设备序列号,支持英文逗号分隔多个序列号", + "name": "sn", + "in": "query" + }, + { + "type": "string", + "x-go-name": "StartTime", + "description": "巡检开始时间", + "name": "start_time", + "in": "query" + }, + { + "type": "string", + "x-go-name": "EndTime", + "description": "巡检结束时间", + "name": "end_time", + "in": "query" + }, + { + "type": "string", + "x-go-name": "RuningStatus", + "description": "带外IP\nOOBIP string `json:\"oob_ip\"`\n巡检执行状态", + "name": "running_status", + "in": "query" + }, + { + "type": "string", + "x-go-name": "HealthStatus", + "description": "机器的巡检结果(包含正常,告警,致命,未知)", + "name": "health_status", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "x-go-name": "Page", + "description": "分页页号", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "x-go-name": "PageSize", + "description": "分页大小", + "name": "page_size", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/InspectionFullWithPageResp" + } + } + } + }, + "/devices/inspections/statistics": { + "get": { + "description": "获取巡检结果统计", + "tags": [ + "巡检" + ], + "summary": "获取巡检结果统计", + "operationId": "GetGetInspectionStatisticsReq", + "parameters": [ + { + "type": "string", + "x-go-name": "Period", + "name": "period", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Direction", + "name": "direction", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/InspectionStatisticsResp" + }, + "400": { + "$ref": "#/responses/RespFor400" + }, + "401": { + "$ref": "#/responses/RespFor401" + }, + "500": { + "$ref": "#/responses/RespFor500" + } + } + } + }, + "/devices/installations/cancels": { + "put": { + "description": "批量取消设备安装", + "tags": [ + "装机参数" + ], + "summary": "批量取消设备安装", + "operationId": "CancelBatchReq", + "parameters": [ + { + "name": "Body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/RemoveDeviceSettingsReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/AffectedResp" + }, + "400": { + "$ref": "#/responses/RespFor400" + }, + "401": { + "$ref": "#/responses/RespFor401" + }, + "500": { + "$ref": "#/responses/RespFor500" + } + } + } + }, + "/devices/installations/reinstalls": { + "put": { + "description": "批量重装设备", + "tags": [ + "装机参数" + ], + "summary": "批量重装设备", + "operationId": "ReinstallBatchReq", + "parameters": [ + { + "name": "Body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/RemoveDeviceSettingsReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/AffectedResp" + }, + "400": { + "$ref": "#/responses/RespFor400" + }, + "401": { + "$ref": "#/responses/RespFor401" + }, + "500": { + "$ref": "#/responses/RespFor500" + } + } + } + }, + "/devices/installations/statistics": { + "get": { + "description": "装机信息统计(统计物理机总数、 等待安装物理机数量、 正在安装的物理机数量、安装失败的物理机数量、安装成功的物理机数量)", + "summary": "装机信息统计", + "operationId": "装机参数", + "responses": { + "200": { + "$ref": "#/responses/DeviceInstallStaticCountResp" + } + } + } + }, + "/devices/power": { + "put": { + "description": "带外管理批量重启", + "tags": [ + "带外管理" + ], + "summary": "带外管理批量重启", + "operationId": "OOBPowerBatchRestartReq", + "parameters": [ + { + "name": "JSONBody", + "in": "body", + "schema": { + "$ref": "#/definitions/OOBPowerBatchOperateReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/OOBPowerBatchOperateResp" + } + } + }, + "post": { + "description": "带外管理批量开机", + "tags": [ + "带外管理" + ], + "summary": "带外管理批量开机", + "operationId": "OOBPowerBatchOnReq", + "parameters": [ + { + "name": "JSONBody", + "in": "body", + "schema": { + "$ref": "#/definitions/OOBPowerBatchOperateReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/OOBPowerBatchOperateResp" + } + } + }, + "delete": { + "description": "带外管理批量关机", + "tags": [ + "带外管理" + ], + "summary": "带外管理批量关机", + "operationId": "OOBPowerBatchOffReq", + "parameters": [ + { + "name": "JSONBody", + "in": "body", + "schema": { + "$ref": "#/definitions/OOBPowerBatchOperateReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/OOBPowerBatchOperateResp" + } + } + } + }, + "/devices/power/pxe": { + "post": { + "description": "带外管理批量PXE重启", + "tags": [ + "带外管理" + ], + "summary": "带外管理批量PXE重启", + "operationId": "OOBPowerBatchPxeReq", + "parameters": [ + { + "name": "JSONBody", + "in": "body", + "schema": { + "$ref": "#/definitions/OOBPowerBatchOperateReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/OOBPowerBatchOperateResp" + } + } + } + }, + "/devices/settings": { + "get": { + "description": "分页查询装机参数", + "tags": [ + "装机参数" + ], + "summary": "分页查询装机参数", + "operationId": "DeviceSettingPageReq", + "parameters": [ + { + "type": "string", + "x-go-name": "OriginNode", + "description": "源节点名", + "name": "origin_node", + "in": "query" + }, + { + "type": "integer", + "format": "uint64", + "x-go-name": "IDCID", + "description": "所属数据中心ID", + "name": "idc_id", + "in": "query" + }, + { + "type": "integer", + "format": "uint64", + "x-go-name": "ServerRoomID", + "description": "所属数据中心ID", + "name": "server_room_id", + "in": "query" + }, + { + "type": "integer", + "format": "uint64", + "x-go-name": "ServerCabinetID", + "description": "所属机架ID", + "name": "server_cabinet_id", + "in": "query" + }, + { + "type": "integer", + "format": "uint64", + "x-go-name": "ServerUsiteID", + "description": "所属机位ID", + "name": "server_usite_id", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Sn", + "description": "设备序列号(多个SN用英文逗号分隔)", + "name": "sn", + "in": "query" + }, + { + "type": "integer", + "format": "uint64", + "x-go-name": "HardwareTemplateID", + "description": "硬件配置模板ID", + "name": "hardware_template_id", + "in": "query" + }, + { + "type": "integer", + "format": "uint64", + "x-go-name": "ImageTemplateID", + "description": "镜像配置模板ID", + "name": "image_template_id", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Status", + "description": "装机状态。可选值 pre_install-等待安装; installing-正在安装; failure-安装失败; success-安装成功;", + "name": "status", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "x-go-name": "Page", + "description": "分页页号", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "x-go-name": "PageSize", + "description": "分页大小。默认值:10。阈值 100", + "name": "page_size", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/DeviceSettingPageResp" + } + } + }, + "post": { + "description": "[#715](http://gitlab.idcos.com/CloudBoot/cloudboot/issues/715)", + "tags": [ + "装机参数" + ], + "summary": "批量保存(新增/修改)设备装机参数", + "operationId": "SaveDeviceSettingsReq", + "parameters": [ + { + "name": "Body", + "in": "body", + "required": true, + "schema": { + "type": "array", + "items": { + "type": "object", + "required": [ + "sn", + "install_type", + "os_template_name", + "hardware_template_name", + "need_extranet_ip" + ], + "properties": { + "hardware_template_name": { + "description": "硬件配置模板名", + "type": "string", + "x-go-name": "HardwareTemplateName" + }, + "install_type": { + "description": "安装方式", + "type": "string", + "enum": [ + "image", + "pxe" + ], + "x-go-name": "InstallType" + }, + "need_extranet_ip": { + "description": "是否需要外网IP", + "type": "string", + "enum": [ + "yes", + "no" + ], + "x-go-name": "NeedExtranetIP" + }, + "os_template_name": { + "description": "操作系统安装模板名", + "type": "string", + "x-go-name": "OSTemplateName" + }, + "sn": { + "description": "序列号", + "type": "string", + "x-go-name": "SN" + } + } + } + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/IDResp" + } + } + } + }, + "/devices/upload": { + "post": { + "description": "上传物理机文件", + "tags": [ + "物理机" + ], + "summary": "上传物理机文件", + "operationId": "UploadDeviceFile", + "parameters": [ + { + "x-go-name": "JSONBody", + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/File" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/FileNameResp" + } + } + } + }, + "/devices/{device_setting_id}/installations/logs": { + "get": { + "description": "根据类型查询装机日志信息", + "tags": [ + "装机日志" + ], + "summary": "根据类型查询装机日志信息", + "operationId": "GetDeviceLogsByDeviceSettingID", + "parameters": [ + { + "type": "string", + "x-go-name": "SN", + "name": "sn", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/DeviceLogResp" + } + } + } + }, + "/devices/{sn}/collections": { + "get": { + "description": "根据SN查询物理机采集信息", + "tags": [ + "物理机" + ], + "summary": "根据SN查询物理机采集信息", + "operationId": "GetDeviceBySN", + "parameters": [ + { + "type": "string", + "x-go-name": "SN", + "description": "SNReq", + "name": "sn", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/DeviceResp" + } + } + } + }, + "/devices/{sn}/combined": { + "get": { + "description": "根据SN查询物理机详细信息", + "tags": [ + "物理机" + ], + "summary": "根据SN查询物理机详细信息", + "operationId": "GetDeviceCombinedBySN", + "parameters": [ + { + "type": "string", + "x-go-name": "SN", + "description": "SNReq", + "name": "sn", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/DeviceCombinedResp" + } + } + } + }, + "/devices/{sn}/inspections": { + "get": { + "description": "查询指定SN的巡检结果明细", + "tags": [ + "巡检" + ], + "summary": "查询指定SN的巡检结果明细", + "operationId": "GetInspectionBySNReq", + "parameters": [ + { + "name": "Body", + "in": "body", + "schema": { + "$ref": "#/definitions/GetInspectionBySNReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/GetInspectionBySNResp" + } + } + } + }, + "/devices/{sn}/inspections/start-times": { + "get": { + "description": "查询机房分页请求", + "tags": [ + "巡检" + ], + "summary": "查询机房分页请求", + "operationId": "GetInspectionStartTimesBySNReq", + "parameters": [ + { + "name": "Body", + "in": "body", + "schema": { + "$ref": "#/definitions/GetInspectionStartTimesBySNReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/GetInspectionStartTimesBySNResp" + } + } + } + }, + "/devices/{sn}/power/status": { + "get": { + "description": "根据SN查看物理机开电状态", + "tags": [ + "物理机" + ], + "summary": "根据SN查看物理机开电状态", + "operationId": "GetDevicePowerStatusBySN", + "parameters": [ + { + "type": "string", + "x-go-name": "SN", + "description": "SNReq", + "name": "sn", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/DeviceStatusResp" + } + } + } + }, + "/devices/{sn}/settings/network": { + "get": { + "description": "查询指定SN的装机参数", + "tags": [ + "装机参数" + ], + "summary": "查询指定SN的装机参数", + "operationId": "GetNetworkSettingBySN", + "parameters": [ + { + "type": "string", + "x-go-name": "SN", + "description": "SNReq", + "name": "sn", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/GetNetworkSettingBySNResp" + } + } + } + }, + "/hardware-templates": { + "get": { + "description": "分页查询硬件模板", + "tags": [ + "硬件模板" + ], + "summary": "分页查询硬件模板", + "operationId": "HardwareTemplatePageReq", + "parameters": [ + { + "type": "string", + "x-go-name": "Builtin", + "description": "是否是内置模板'Yes|No'", + "name": "builtin", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Name", + "description": "模板名称", + "name": "name", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Vendor", + "description": "硬件制造厂商", + "name": "vendor", + "in": "query" + }, + { + "type": "string", + "x-go-name": "ModelName", + "description": "型号名称", + "name": "model_name", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "x-go-name": "Page", + "description": "分页页号", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "x-go-name": "PageSize", + "description": "分页大小", + "name": "page_size", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/HardwareTemplatePageResp" + } + } + }, + "post": { + "description": "保存硬件配置模板", + "tags": [ + "硬件模板" + ], + "summary": "保存硬件配置模板", + "operationId": "SaveHardwareTemplate", + "parameters": [ + { + "name": "Body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/SaveHardwareTplReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/IDResp" + } + } + } + }, + "/hardware-templates/{id}": { + "get": { + "description": "查询指定ID的硬件模板", + "tags": [ + "硬件模板" + ], + "summary": "查询指定ID的硬件模板", + "operationId": "GetHardwareTemplateByID", + "parameters": [ + { + "type": "string", + "x-go-name": "ID", + "description": "IDReq", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/HardwareTemplateResp" + } + } + }, + "delete": { + "description": "删除指定ID的硬件模板", + "tags": [ + "硬件模板" + ], + "summary": "删除指定ID的硬件模板", + "operationId": "RemoveHardwareTemplateByID", + "parameters": [ + { + "type": "string", + "x-go-name": "ID", + "description": "IDReq", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/AffectedResp" + } + } + } + }, + "/idcs": { + "get": { + "description": "查询数据中心分页列表", + "tags": [ + "数据中心" + ], + "summary": "查询数据中心分页列表", + "operationId": "GetIDCPageReq", + "parameters": [ + { + "type": "string", + "x-go-name": "Name", + "name": "name", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Usage", + "description": "用途:production-生产; disaster_recovery-容灾; pre_production-准生产; testing-测试;',", + "name": "usage", + "in": "query" + }, + { + "type": "string", + "x-go-name": "FirstServerRoom", + "description": "一级机房", + "name": "first_server_room", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Vendor", + "description": "供应商", + "name": "vendor", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Status", + "description": "建设中under_construction,已验收accepted,已投产production,已裁撤abolished", + "name": "status", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "x-go-name": "Page", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "x-go-name": "PageSize", + "name": "page_size", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/IDCPageResp" + } + } + }, + "post": { + "description": "保存(新增/修改)数据中心", + "tags": [ + "数据中心" + ], + "summary": "保存(新增/修改)数据中心", + "operationId": "SaveIDCReq", + "parameters": [ + { + "name": "JSONBody", + "in": "body", + "schema": { + "$ref": "#/definitions/IDCReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/IDResp" + }, + "400": { + "$ref": "#/responses/RespFor400" + }, + "401": { + "$ref": "#/responses/RespFor401" + }, + "500": { + "$ref": "#/responses/RespFor500" + } + } + } + }, + "/idcs/status": { + "put": { + "description": "批量修改数据中心状态", + "tags": [ + "数据中心" + ], + "summary": "批量修改数据中心状态", + "operationId": "UpdateIDCStatusReq", + "parameters": [ + { + "name": "JSONBody", + "in": "body", + "schema": { + "$ref": "#/definitions/IDCUpdateReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/UpdateIDCStatusResp" + } + } + } + }, + "/idcs/{id}": { + "get": { + "description": "根据ID查询数据中心信息", + "tags": [ + "数据中心" + ], + "summary": "根据ID查询数据中心信息", + "operationId": "GetIDCByID", + "parameters": [ + { + "type": "string", + "x-go-name": "ID", + "description": "IDReq", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/IDCResp" + } + } + }, + "delete": { + "description": "删除数据中心信息", + "tags": [ + "数据中心" + ], + "summary": "删除数据中心信息", + "operationId": "DeleteIDCByID", + "parameters": [ + { + "type": "string", + "x-go-name": "ID", + "description": "IDReq", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/IDResp" + } + } + } + }, + "/idcs/{type}": { + "get": { + "description": "根据类型查询数据字典信息", + "tags": [ + "数据字典" + ], + "summary": "根据类型查询数据字典信息", + "operationId": "GetDataDictByType", + "parameters": [ + { + "type": "string", + "x-go-name": "Type", + "name": "type", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/DataDictResp" + } + } + } + }, + "/image-templates": { + "get": { + "description": "根据ID获取镜像模板", + "tags": [ + "镜像模板" + ], + "summary": "根据ID获取镜像模板", + "operationId": "GetImageTemplateByID", + "parameters": [ + { + "type": "string", + "x-go-name": "ID", + "description": "IDReq", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/ImageTemplateResp" + } + } + } + }, + "/images-templates": { + "post": { + "description": "新增镜像模板接口", + "tags": [ + "镜像模板" + ], + "summary": "新增镜像模板接口", + "operationId": "SaveImageTemplateReq", + "parameters": [ + { + "name": "Body", + "in": "body", + "schema": { + "$ref": "#/definitions/SaveTemplateReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/IDResp" + } + } + }, + "delete": { + "description": "删除模板接口", + "tags": [ + "镜像模板" + ], + "summary": "删除模板接口", + "operationId": "RemoveImageTemplateByID", + "parameters": [ + { + "type": "string", + "x-go-name": "ID", + "description": "IDReq", + "name": "id", + "in": "path", + "required": true + } + ] + } + }, + "/images-templates/{id}": { + "put": { + "description": "更新镜像模板接口", + "tags": [ + "镜像模板" + ], + "summary": "更新镜像模板接口", + "operationId": "UpdateImageTemplateReq", + "parameters": [ + { + "name": "Body", + "in": "body", + "schema": { + "$ref": "#/definitions/SaveImageTemplateReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/IDResp" + } + } + } + }, + "/ip-networks": { + "get": { + "description": "查询网段分页请求", + "tags": [ + "网段" + ], + "summary": "查询网段分页请求", + "operationId": "GetIPNetworkPageReq", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-go-name": "ServerRoomID", + "description": "机房ID", + "name": "server_room_id", + "in": "query" + }, + { + "type": "string", + "x-go-name": "CIDR", + "description": "CIDR网段,支持模糊查询", + "name": "cidr", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Category", + "description": "网段类别。可选值: ilo-服务器ILO; tgw_intranet-服务器TGW内网; tgw_extranet-服务器TGW外网; intranet-服务器普通内网; extranet-服务器普通外网; v_intranet-服务器虚拟化内网;", + "name": "category", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "x-go-name": "Page", + "description": "分页页号", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "x-go-name": "PageSize", + "description": "分页大小", + "name": "page_size", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/GetIPNetworkPageResp" + } + } + }, + "post": { + "description": "保存(新增/修改)网段", + "tags": [ + "网段" + ], + "summary": "保存(新增/修改)网段", + "operationId": "SaveIPNetworkReq", + "parameters": [ + { + "name": "Body", + "in": "body", + "schema": { + "$ref": "#/definitions/SaveIPNetworkReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/IDResp" + }, + "400": { + "$ref": "#/responses/RespFor400" + }, + "401": { + "$ref": "#/responses/RespFor401" + }, + "500": { + "$ref": "#/responses/RespFor500" + } + } + } + }, + "/ip-networks/{id}": { + "get": { + "description": "查询指定ID的网段信息详情", + "tags": [ + "网段" + ], + "summary": "查询指定ID的网段信息详情", + "operationId": "IDReq", + "parameters": [ + { + "type": "string", + "x-go-name": "ID", + "description": "IDReq", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/GetIPNetworkByID" + } + } + }, + "delete": { + "description": "查询指定ID的网段信息详情", + "tags": [ + "网段" + ], + "summary": "查询指定ID的网段信息详情", + "operationId": "IDReq", + "parameters": [ + { + "type": "string", + "x-go-name": "ID", + "description": "IDReq", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/GetIPNetworkByID" + } + } + } + }, + "/ips": { + "get": { + "description": "查询IP列表分页请求", + "tags": [ + "网段" + ], + "summary": "查询IP列表分页请求", + "operationId": "GetIPSPageReq", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-go-name": "IPNetworkID", + "description": "网段ID", + "name": "ip_network_id", + "in": "query" + }, + { + "type": "string", + "x-go-name": "IP", + "description": "ip地址,支持模糊查询", + "name": "ip", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Category", + "description": "网段类别。可选值: pxe-PXE用IP; business-业务用IP;", + "name": "category", + "in": "query" + }, + { + "type": "string", + "x-go-name": "IsUsed", + "description": "是否已经被使用。可选值: yes-是; no-否;", + "name": "is_used", + "in": "query" + }, + { + "type": "string", + "x-go-name": "SN", + "description": "占用IP的设备序列号。(支持模糊查询)", + "name": "sn", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Scope", + "description": "内外网", + "name": "scope", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "x-go-name": "Page", + "description": "分页页号", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "x-go-name": "PageSize", + "description": "分页大小", + "name": "page_size", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/GetIPSPageResp" + } + } + } + }, + "/ips/assigns": { + "put": { + "description": "手动分配IP", + "tags": [ + "IP" + ], + "summary": "手动分配IP", + "operationId": "AssignIPReq", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-go-name": "ID", + "description": "(required)IP的ID", + "name": "id", + "in": "query" + }, + { + "type": "string", + "x-go-name": "SN", + "description": "(required): 设备序列号", + "name": "sn", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Scope", + "description": "(required): IP种类(\"extranet\"/\"intranet\")", + "name": "scope", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/IDResp" + }, + "400": { + "$ref": "#/responses/RespFor400" + }, + "401": { + "$ref": "#/responses/RespFor401" + }, + "500": { + "$ref": "#/responses/RespFor500" + } + } + } + }, + "/ips/unassigns": { + "put": { + "description": "手动取消分配IP", + "tags": [ + "IP" + ], + "summary": "手动取消分配IP", + "operationId": "UnassignIPReq", + "parameters": [ + { + "type": "integer", + "format": "int64", + "x-go-name": "ID", + "description": "IP的ID。", + "name": "id", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/IDResp" + }, + "400": { + "$ref": "#/responses/RespFor400" + }, + "401": { + "$ref": "#/responses/RespFor401" + }, + "500": { + "$ref": "#/responses/RespFor500" + } + } + } + }, + "/jobs/inspections": { + "get": { + "description": "获取巡检结果统计", + "tags": [ + "任务" + ], + "summary": "获取巡检结果统计", + "operationId": "AddInspectionJobReq", + "parameters": [ + { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "SN", + "description": "硬件巡检目标设备", + "name": "sn", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Rate", + "description": "硬件巡检执行频率", + "name": "rate", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Cron", + "description": "硬件巡检", + "name": "cron", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/AffectedResp" + }, + "400": { + "$ref": "#/responses/RespFor400" + }, + "401": { + "$ref": "#/responses/RespFor401" + }, + "500": { + "$ref": "#/responses/RespFor500" + } + } + } + }, + "/network-areas": { + "get": { + "description": "[#659](http://gitlab.idcos.com/CloudBoot/cloudboot/issues/659)", + "tags": [ + "网络区域" + ], + "summary": "查询网络区域分页", + "operationId": "GetNetworkAreaPageReq", + "parameters": [ + { + "type": "integer", + "format": "uint64", + "x-go-name": "IDCID", + "description": "数据中心ID", + "name": "idc_id", + "in": "query" + }, + { + "type": "integer", + "format": "uint64", + "x-go-name": "ServerRoomID", + "description": "机房管理单元ID", + "name": "server_room_id", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Name", + "description": "网络区域名称", + "name": "name", + "in": "query" + }, + { + "type": "string", + "x-go-name": "PhysicalArea", + "description": "关联物理区域", + "name": "physical_area", + "in": "query" + }, + { + "enum": [ + "nonproduction", + "production", + "offline" + ], + "type": "string", + "x-go-name": "Status", + "description": "状态。可选值: nonproduction-未投产; production-已投产; offline-已下线(回收);", + "name": "status", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "x-go-name": "Page", + "description": "分页页号", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "x-go-name": "PageSize", + "description": "分页大小", + "name": "page_size", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/GetNetworkAreaPageResp" + } + } + }, + "post": { + "description": "[#656](http://gitlab.idcos.com/CloudBoot/cloudboot/issues/656)", + "tags": [ + "网络区域" + ], + "summary": "保存(新增/修改)网络区域", + "operationId": "SaveNetworkAreaReq", + "parameters": [ + { + "name": "JSONBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/SaveNetworkAreaReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/IDResp" + } + } + } + }, + "/network-areas/status": { + "put": { + "description": "[#657](http://gitlab.idcos.com/CloudBoot/cloudboot/issues/657)", + "tags": [ + "网络区域" + ], + "summary": "批量修改网络区域状态", + "operationId": "UpdateNetworkAreasStatusReq", + "parameters": [ + { + "name": "JSONBody", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/UpdateNetworkAreasStatusReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/BaseResp" + } + } + } + }, + "/network-areas/{id}": { + "get": { + "description": "[#660](http://gitlab.idcos.com/CloudBoot/cloudboot/issues/660)", + "tags": [ + "网络区域" + ], + "summary": "查询指定网络区域明细", + "operationId": "GetNetworkAreaByID", + "parameters": [ + { + "type": "string", + "x-go-name": "ID", + "description": "IDReq", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/GetNetworkAreaByIDResp" + } + } + }, + "delete": { + "description": "[#658](http://gitlab.idcos.com/CloudBoot/cloudboot/issues/658)", + "tags": [ + "网络区域" + ], + "summary": "删除指定ID网络区域", + "operationId": "RemoveNetworkAreaByID", + "parameters": [ + { + "type": "string", + "x-go-name": "ID", + "description": "IDReq", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/BaseResp" + } + } + } + }, + "/network/devices": { + "get": { + "description": "查询网络设备分页列表", + "tags": [ + "网络设备" + ], + "summary": "查询网络设备分页列表", + "operationId": "GetNetworkDevicePageReq", + "parameters": [ + { + "type": "integer", + "format": "uint64", + "x-go-name": "IDCID", + "description": "所属数据中心ID", + "name": "idc_id", + "in": "query" + }, + { + "type": "integer", + "format": "uint64", + "x-go-name": "ServerRoomID", + "description": "所属机房", + "name": "server_room_id", + "in": "query" + }, + { + "type": "integer", + "format": "uint64", + "x-go-name": "ServerCabinetID", + "description": "所属机架", + "name": "server_cabinet_id", + "in": "query" + }, + { + "type": "string", + "x-go-name": "FixedAssetNumber", + "description": "资产编号", + "name": "fixed_asset_number", + "in": "query" + }, + { + "type": "string", + "x-go-name": "SN", + "description": "SN号", + "name": "sn", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Name", + "description": "名称", + "name": "name", + "in": "query" + }, + { + "type": "string", + "x-go-name": "ModelNumber", + "description": "产品型号", + "name": "model", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Vendor", + "description": "厂商", + "name": "vendor", + "in": "query" + }, + { + "type": "string", + "x-go-name": "OS", + "description": "操作系统", + "name": "os", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Type", + "description": "类型 switch-交换机;", + "name": "type", + "in": "query" + }, + { + "type": "string", + "x-go-name": "TOR", + "description": "TOR", + "name": "tor", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Usage", + "description": "用途", + "name": "usage", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "x-go-name": "Page", + "description": "页号", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "x-go-name": "PageSize", + "description": "页大小", + "name": "page_size", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/NetworkDevideResp" + } + } + }, + "post": { + "description": "保存/修改网络设备", + "tags": [ + "网络设备" + ], + "summary": "保存/修改网络设备", + "operationId": "SaveNetworkDeviceReq", + "parameters": [ + { + "type": "integer", + "format": "uint64", + "x-go-name": "IDCID", + "description": "所属数据中心ID", + "name": "idc_id", + "in": "query" + }, + { + "type": "integer", + "format": "uint64", + "x-go-name": "ServerRoomID", + "description": "所属机房", + "name": "server_room_id", + "in": "query" + }, + { + "type": "integer", + "format": "uint64", + "x-go-name": "ServerCabinetID", + "description": "所属机架", + "name": "server_cabinet_id", + "in": "query" + }, + { + "type": "string", + "x-go-name": "FixedAssetNumber", + "description": "资产编号", + "name": "fixed_asset_number", + "in": "query" + }, + { + "type": "string", + "x-go-name": "SN", + "description": "SN号", + "name": "sn", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Name", + "description": "名称", + "name": "name", + "in": "query" + }, + { + "type": "string", + "x-go-name": "ModelNumber", + "description": "产品型号", + "name": "model", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Vendor", + "description": "厂商", + "name": "vendor", + "in": "query" + }, + { + "type": "string", + "x-go-name": "OS", + "description": "操作系统", + "name": "os", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Type", + "description": "类型 switch-交换机;", + "name": "type", + "in": "query" + }, + { + "type": "string", + "x-go-name": "TOR", + "description": "TOR", + "name": "tor", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Usage", + "description": "用途", + "name": "usage", + "in": "query" + } + ] + } + }, + "/network/devices/{id}": { + "get": { + "description": "查询指定ID的网络设备", + "tags": [ + "网络设备" + ], + "summary": "查询指定ID的网络设备", + "operationId": "GetNetworkDeviceByID", + "parameters": [ + { + "type": "string", + "x-go-name": "ID", + "description": "IDReq", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/NetworkDevideResp" + } + } + }, + "delete": { + "description": "移除网络设备", + "tags": [ + "网络设备" + ], + "summary": "移除网络设备", + "operationId": "DeleteNetworkDeviceByID", + "parameters": [ + { + "type": "string", + "x-go-name": "ID", + "description": "IDReq", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/AffectedResp" + } + } + } + }, + "/operate-log": { + "get": { + "description": "查询操作记录分页列表", + "tags": [ + "操作记录" + ], + "summary": "查询操作记录分页列表", + "operationId": "GetOperateLogPageReq", + "parameters": [ + { + "type": "string", + "x-go-name": "HTTPMethod", + "description": "请求方式", + "name": "http_method", + "in": "query" + }, + { + "type": "string", + "x-go-name": "URL", + "description": "路由", + "name": "url", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Source", + "description": "源数据", + "name": "source", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Destination", + "description": "目标数据", + "name": "destination", + "in": "query" + }, + { + "type": "string", + "x-go-name": "CategoryCode", + "description": "操作类型", + "name": "column:category_code", + "in": "query" + }, + { + "type": "string", + "x-go-name": "CategoryName", + "description": "操作类型名称", + "name": "column:category_name", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "x-go-name": "Page", + "description": "分页页号", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "x-go-name": "PageSize", + "description": "分页大小。默认值:10。阈值: 100。", + "name": "page_size", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/OperatePageResp" + } + } + } + }, + "/os-templates": { + "get": { + "description": "根据条件查询装机模板", + "tags": [ + "装机模板" + ], + "summary": "根据条件查询装机模板", + "operationId": "TemplateReq", + "parameters": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/OsTemplateResp" + }, + "x-go-name": "Records", + "name": "records", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/OsTemplateResp" + } + } + } + }, + "/server-cabinets": { + "get": { + "description": "查询机架(柜)分页请求", + "tags": [ + "机架" + ], + "summary": "查询机架(柜)分页请求", + "operationId": "GetServerCabinetPageReq", + "parameters": [ + { + "type": "integer", + "format": "uint64", + "x-go-name": "IDCID", + "description": "所属数据中心ID", + "name": "idc_id", + "in": "query" + }, + { + "type": "integer", + "format": "uint64", + "x-go-name": "ServerRoomID", + "description": "所属机房ID", + "name": "server_room_id", + "in": "query" + }, + { + "type": "integer", + "format": "uint64", + "x-go-name": "NetworkAreaID", + "description": "网络区域ID", + "name": "network_area_id", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Number", + "description": "机架(柜)编号", + "name": "number", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Type", + "description": "类型", + "name": "type", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Status", + "description": "状态。可选值: under_construction-建设中; not_enabled-未启用; enabled-已启用; offline-已下线;", + "name": "status", + "in": "query" + }, + { + "type": "string", + "x-go-name": "IsEnabled", + "description": "是否启用(yes/no)", + "name": "is_enabled", + "in": "query" + }, + { + "type": "string", + "x-go-name": "IsPowered", + "description": "是否开电(yes/no)", + "name": "is_powered", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "x-go-name": "Page", + "description": "分页页号", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "x-go-name": "PageSize", + "description": "分页大小", + "name": "page_size", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/GetServerCabinetPageResp" + } + } + }, + "post": { + "description": "保存(新增/修改)机架(柜)", + "tags": [ + "机架" + ], + "summary": "保存(新增/修改)机架(柜)", + "operationId": "SaveServerCabinet", + "parameters": [ + { + "name": "Body", + "in": "body", + "schema": { + "$ref": "#/definitions/SaveServerCabinetReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/AffectedResp" + }, + "400": { + "$ref": "#/responses/RespFor400" + }, + "401": { + "$ref": "#/responses/RespFor401" + }, + "500": { + "$ref": "#/responses/RespFor500" + } + } + } + }, + "/server-cabinets/imports": { + "post": { + "description": "导入机位文件", + "tags": [ + "机架" + ], + "summary": "导入机位文件", + "operationId": "ServerCabinetImportReq", + "parameters": [ + { + "name": "JSONBody", + "in": "body", + "schema": { + "$ref": "#/definitions/ImportReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/AffectedResp" + } + } + } + }, + "/server-cabinets/imports/previews": { + "post": { + "description": "导入机架(柜)文件预览", + "tags": [ + "机架" + ], + "summary": "导入机架(柜)文件预览", + "operationId": "ServerCabinetImportPreviewReq", + "responses": { + "200": { + "$ref": "#/responses/ImportPreviewResp" + } + } + } + }, + "/server-cabinets/status": { + "put": { + "description": "批量更新机架(柜)状态请求", + "tags": [ + "机位" + ], + "summary": "批量更新机架(柜)状态请求", + "operationId": "UpdateServerCabinetStatusReq", + "parameters": [ + { + "name": "Body", + "in": "body", + "schema": { + "$ref": "#/definitions/UpdateServerUSiteStatusReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/AffectedResp" + } + } + } + }, + "/server-cabinets/upload": { + "post": { + "description": "加载导入机架(柜)文件", + "tags": [ + "机架" + ], + "summary": "加载导入机架(柜)文件", + "operationId": "UploadServerCabinetPortFile", + "parameters": [ + { + "x-go-name": "JSONBody", + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/File" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/AffectedResp" + } + } + } + }, + "/server-cabinets/{id}": { + "get": { + "description": "查询指定ID的机架(柜)信息详情", + "tags": [ + "机架" + ], + "summary": "查询指定ID的机架(柜)信息详情", + "operationId": "GetServerCabinetByID", + "parameters": [ + { + "type": "string", + "x-go-name": "ID", + "description": "IDReq", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/GetServerCabinetByID" + } + } + }, + "delete": { + "description": "移除机架(柜)", + "tags": [ + "机架" + ], + "summary": "移除机架(柜)", + "operationId": "RemoveServerCabinetByID", + "parameters": [ + { + "type": "string", + "x-go-name": "ID", + "description": "IDReq", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/AffectedResp" + } + } + } + }, + "/server-cabinets/{id}/power": { + "post": { + "description": "机架(柜)开电API", + "tags": [ + "机架" + ], + "summary": "机架(柜)开电API", + "operationId": "PowerOnServerCabinetByID", + "parameters": [ + { + "type": "string", + "x-go-name": "ID", + "description": "IDReq", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/AffectedResp" + } + } + }, + "delete": { + "description": "机架(柜)关电API", + "tags": [ + "机架" + ], + "summary": "机架(柜)关电API", + "operationId": "PowerOffServerCabinetByID", + "parameters": [ + { + "type": "string", + "x-go-name": "ID", + "description": "IDReq", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/AffectedResp" + } + } + } + }, + "/server-rooms": { + "get": { + "description": "查询机房分页请求", + "tags": [ + "机房" + ], + "summary": "查询机房分页请求", + "operationId": "GetServerRoomPageReq", + "parameters": [ + { + "type": "integer", + "format": "uint64", + "x-go-name": "IDCID", + "description": "所属数据中心ID", + "name": "idc_id", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Name", + "description": "机房名称(支持模糊匹配)", + "name": "name", + "in": "query" + }, + { + "type": "integer", + "format": "uint64", + "x-go-name": "FirstServerRoom", + "description": "一级机房ID", + "name": "first_server_room", + "in": "query" + }, + { + "type": "string", + "x-go-name": "City", + "description": "城市(支持模糊匹配)", + "name": "city", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Address", + "description": "地址(支持模糊匹配)", + "name": "address", + "in": "query" + }, + { + "type": "string", + "x-go-name": "ServerRoomManager", + "description": "机房管理单元负责人(支持模糊匹配)", + "name": "server_room_manager", + "in": "query" + }, + { + "type": "string", + "x-go-name": "VendorManager", + "description": "供应商负责人(支持模糊匹配)", + "name": "vendor_manager", + "in": "query" + }, + { + "type": "string", + "x-go-name": "NetworkAssetManager", + "description": "网络资产负责人(支持模糊匹配)", + "name": "network_asset_manager", + "in": "query" + }, + { + "type": "string", + "x-go-name": "SupportPhoneNumber", + "description": "7*24小时保障电话(支持模糊匹配)", + "name": "support_phone_number", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Status", + "description": "状态。可选值: under_construction-建设中; accepted-已验收; production-已投产; abolished-已裁撤;", + "name": "status", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "x-go-name": "Page", + "description": "分页页号", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "x-go-name": "PageSize", + "description": "分页大小。默认值:10。阈值: 100。", + "name": "page_size", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/GetServerRoomPageResp" + } + } + }, + "post": { + "description": "保存(新增/修改)机房", + "tags": [ + "机房" + ], + "summary": "保存(新增/修改)机房", + "operationId": "SaveServerRoom", + "parameters": [ + { + "name": "Body", + "in": "body", + "schema": { + "$ref": "#/definitions/SaveServerRoomReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/IDResp" + }, + "400": { + "$ref": "#/responses/RespFor400" + }, + "401": { + "$ref": "#/responses/RespFor401" + }, + "500": { + "$ref": "#/responses/RespFor500" + } + } + } + }, + "/server-rooms/imports": { + "post": { + "description": "导入机房文件预览", + "tags": [ + "机房" + ], + "summary": "导入机房文件预览", + "operationId": "ImportReq", + "parameters": [ + { + "name": "JSONBody", + "in": "body", + "schema": { + "$ref": "#/definitions/ImportReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/ImportPreviewResp" + } + } + } + }, + "/server-rooms/imports/previews": { + "post": { + "description": "导入机房文件预览", + "tags": [ + "机房" + ], + "summary": "导入机房文件预览", + "operationId": "ImportReq", + "parameters": [ + { + "name": "JSONBody", + "in": "body", + "schema": { + "$ref": "#/definitions/ImportReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/ImportPreviewResp" + } + } + } + }, + "/server-rooms/status": { + "put": { + "description": "批量更新机房状态请求", + "tags": [ + "机房" + ], + "summary": "批量更新机房状态请求", + "operationId": "UpdateServerRoomStatusReq", + "responses": { + "200": { + "$ref": "#/responses/AffectedResp" + } + } + } + }, + "/server-rooms/upload": { + "post": { + "description": "加载导入机房文件", + "tags": [ + "机房" + ], + "summary": "加载导入机房文件", + "operationId": "UploadFile", + "parameters": [ + { + "x-go-name": "JSONBody", + "name": "body", + "in": "body", + "schema": { + "$ref": "#/definitions/File" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/AffectedResp" + } + } + } + }, + "/server-rooms/{id}": { + "get": { + "description": "查询指定ID的机房信息详情", + "tags": [ + "机房" + ], + "summary": "查询指定ID的机房信息详情", + "operationId": "GetServerRoomByID", + "responses": { + "200": { + "$ref": "#/responses/GetServerRoomByID" + } + } + }, + "delete": { + "description": "移除机房", + "tags": [ + "机房" + ], + "summary": "移除机房", + "operationId": "RemoveServerRoomByID", + "responses": { + "200": { + "$ref": "#/responses/AffectedResp" + } + } + } + }, + "/server-usites": { + "get": { + "description": "查询机位(U位)分页列表", + "tags": [ + "机位" + ], + "summary": "查询机位(U位)分页列表", + "operationId": "GetServerUSitePageReq", + "parameters": [ + { + "type": "integer", + "format": "uint64", + "x-go-name": "IDCID", + "description": "所属数据中心ID", + "name": "idc_id", + "in": "query" + }, + { + "type": "integer", + "format": "uint64", + "x-go-name": "ServerRoomID", + "description": "所属机房ID", + "name": "server_room_id", + "in": "query" + }, + { + "type": "integer", + "format": "uint64", + "x-go-name": "ServerCabinetID", + "description": "所属机架ID", + "name": "server_cabinet_id", + "in": "query" + }, + { + "type": "integer", + "format": "uint64", + "x-go-name": "NetAreaID", + "description": "网络区域ID", + "name": "network_area_id", + "in": "query" + }, + { + "type": "string", + "x-go-name": "PhysicalArea", + "description": "物理区域", + "name": "physical_area", + "in": "query" + }, + { + "type": "string", + "x-go-name": "CabinetNumber", + "description": "机架编号", + "name": "cabinet_number", + "in": "query" + }, + { + "type": "string", + "x-go-name": "USiteNumber", + "description": "机位编号", + "name": "usite_number", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Height", + "description": "机位调试", + "name": "height", + "in": "query" + }, + { + "type": "string", + "x-go-name": "Status", + "description": "机位状态\nUSiteStatFree = \"free\" 机位(U位)状态-空闲\nUSiteStatPreOccupied = \"pre_occupied\" 机位(U位)状态-预占用\nUSiteStatUsed = \"used\" 机位(U位)状态-已使用\nUSiteStatDisabled = \"disabled\" 机位(U位)状态-不可用", + "name": "status", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "x-go-name": "Page", + "description": "分页页号", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "format": "int64", + "x-go-name": "PageSize", + "description": "分页大小", + "name": "page_size", + "in": "query" + } + ], + "responses": { + "200": { + "$ref": "#/responses/ServerUSitePageResp" + } + } + }, + "post": { + "description": "保存(新增/修改)机位(U位)", + "tags": [ + "机位" + ], + "summary": "保存(新增/修改)机位(U位)", + "operationId": "SaveServerUSiteReq", + "parameters": [ + { + "name": "Body", + "in": "body", + "schema": { + "$ref": "#/definitions/SaveServerUSiteReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/IDResp" + }, + "400": { + "$ref": "#/responses/RespFor400" + }, + "401": { + "$ref": "#/responses/RespFor401" + }, + "500": { + "$ref": "#/responses/RespFor500" + } + } + } + }, + "/server-usites/imports": { + "post": { + "description": "导入机位文件", + "tags": [ + "机位" + ], + "summary": "导入机位文件", + "operationId": "USiteImportReq", + "parameters": [ + { + "name": "JSONBody", + "in": "body", + "schema": { + "$ref": "#/definitions/ImportReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/AffectedResp" + } + } + } + }, + "/server-usites/imports/previews": { + "post": { + "description": "导入机位文件预览", + "tags": [ + "机位" + ], + "summary": "导入机位文件预览", + "operationId": "USiteImportPreviewReq", + "parameters": [ + { + "name": "JSONBody", + "in": "body", + "schema": { + "$ref": "#/definitions/ImportReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/ImportPreviewResp" + } + } + } + }, + "/server-usites/ports/imports": { + "post": { + "description": "导入机位端口号文件", + "tags": [ + "机位" + ], + "summary": "导入机位端口号文件", + "operationId": "USitePortImportReq", + "parameters": [ + { + "name": "JSONBody", + "in": "body", + "schema": { + "$ref": "#/definitions/ImportReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/AffectedResp" + } + } + } + }, + "/server-usites/ports/imports/previews": { + "post": { + "description": "导入机位端口号文件预览", + "tags": [ + "机位" + ], + "summary": "导入机位端口号文件预览", + "operationId": "USitePortImportPreviewReq", + "parameters": [ + { + "name": "JSONBody", + "in": "body", + "schema": { + "$ref": "#/definitions/ImportReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/ImportPreviewResp" + } + } + } + }, + "/server-usites/status": { + "put": { + "description": "批量修改机位状态入参结构体", + "tags": [ + "机位" + ], + "summary": "批量修改机位状态入参结构体", + "operationId": "UpdateServerUSiteStatusReq", + "parameters": [ + { + "name": "Body", + "in": "body", + "schema": { + "$ref": "#/definitions/UpdateServerUSiteStatusReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/AffectedResp" + } + } + } + }, + "/server-usites/upload": { + "post": { + "description": "导入机位文件", + "tags": [ + "机位" + ], + "summary": "导入机位文件", + "operationId": "UploadUSiteFile", + "responses": { + "200": { + "$ref": "#/responses/FileNameResp" + } + } + } + }, + "/server-usites/{id}": { + "get": { + "description": "根据ID查询机位信息", + "tags": [ + "机位" + ], + "summary": "根据ID查询机位信息", + "operationId": "GetUSiteByID", + "parameters": [ + { + "type": "string", + "x-go-name": "ID", + "description": "IDReq", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/ServerUSiteResp" + } + } + }, + "delete": { + "description": "删除机位信息", + "tags": [ + "机位" + ], + "summary": "删除机位信息", + "operationId": "DeleteUSiteByID", + "parameters": [ + { + "type": "string", + "x-go-name": "ID", + "description": "IDReq", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/IDResp" + } + } + } + }, + "/server-usites/{id}/ports": { + "delete": { + "description": "删除机位端口号", + "tags": [ + "机位" + ], + "summary": "删除机位端口号", + "operationId": "DeleteUSitePortByID", + "parameters": [ + { + "type": "string", + "x-go-name": "ID", + "description": "IDReq", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/IDResp" + } + } + } + }, + "/system-templates": { + "get": { + "description": "根据ID获取系统模板", + "tags": [ + "系统模板" + ], + "summary": "根据ID获取系统模板", + "operationId": "GetSystemTemplateByID", + "parameters": [ + { + "type": "string", + "x-go-name": "ID", + "description": "IDReq", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "$ref": "#/responses/SystemTemplateResp" + } + } + }, + "delete": { + "description": "删除模板接口", + "tags": [ + "系统模板" + ], + "summary": "删除模板接口", + "operationId": "RemoveSystemTemplateByID", + "parameters": [ + { + "type": "string", + "x-go-name": "ID", + "description": "IDReq", + "name": "id", + "in": "path", + "required": true + } + ] + } + }, + "/systems-templates": { + "post": { + "description": "新增系统模板接口", + "tags": [ + "系统模板" + ], + "summary": "新增系统模板接口", + "operationId": "SaveSystemTemplateReq", + "parameters": [ + { + "name": "Body", + "in": "body", + "schema": { + "$ref": "#/definitions/SaveSystemTemplateReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/IDResp" + } + } + } + }, + "/systems-templates/{id}": { + "put": { + "description": "更新系统模板接口", + "tags": [ + "系统模板" + ], + "summary": "更新系统模板接口", + "operationId": "UpdateSystemTemplateReq", + "parameters": [ + { + "name": "Body", + "in": "body", + "schema": { + "$ref": "#/definitions/SaveSystemTemplateReq" + } + } + ], + "responses": { + "200": { + "$ref": "#/responses/IDResp" + } + } + } + } + }, + "definitions": { + "BIOS": { + "description": "BIOS BIOS", + "type": "object", + "properties": { + "vendor": { + "type": "string", + "x-go-name": "Vendor" + }, + "version": { + "type": "string", + "x-go-name": "Version" + } + }, + "x-go-package": "idcos.com/cloudboot/hardware/collector" + }, + "CPU": { + "description": "总核数 = 物理CPU个数 X 每颗物理CPU的核数\n总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数", + "type": "object", + "title": "CPU CPU信息。", + "properties": { + "physicals": { + "type": "array", + "items": { + "$ref": "#/definitions/PhysicalCPU" + }, + "x-go-name": "Physicals" + }, + "threads": { + "type": "integer", + "format": "int64", + "x-go-name": "Threads" + }, + "total_cores": { + "type": "integer", + "format": "int64", + "x-go-name": "TotalCores" + }, + "total_logicals": { + "type": "integer", + "format": "int64", + "x-go-name": "TotalLogicals" + }, + "total_physicals": { + "type": "integer", + "format": "int64", + "x-go-name": "TotalPhysicals" + } + }, + "x-go-package": "idcos.com/cloudboot/hardware/collector" + }, + "CombinedDevice": { + "type": "object", + "properties": { + "bios": { + "$ref": "#/definitions/BIOS" + }, + "bootos_ip": { + "type": "string", + "x-go-name": "BootOSIP" + }, + "bootos_mac": { + "type": "string", + "x-go-name": "BootOSMac" + }, + "cpu": { + "$ref": "#/definitions/CPU" + }, + "deploy_status": { + "type": "string", + "x-go-name": "DeployStatus" + }, + "device_page_resp": { + "$ref": "#/definitions/DevicePageResp" + }, + "disk": { + "$ref": "#/definitions/Disk" + }, + "disk_slot": { + "$ref": "#/definitions/DiskSlot" + }, + "extranet_ip": { + "type": "string", + "x-go-name": "ExtranetIP" + }, + "fan": { + "$ref": "#/definitions/Fan" + }, + "hardware_inspection": { + "$ref": "#/definitions/InspectionSimplify" + }, + "hardware_tpl": { + "$ref": "#/definitions/HardwareTemplateSimplify" + }, + "hba": { + "$ref": "#/definitions/HBA" + }, + "hostname": { + "type": "string", + "x-go-name": "Hostname" + }, + "image_tpl": { + "$ref": "#/definitions/ImageTemplateSimplify" + }, + "install_progress": { + "type": "number", + "format": "double", + "x-go-name": "InstallProgress" + }, + "intranet_ip": { + "description": "IP string `json:\"ip\"` //拆成内外网,因为内网可能有多IP", + "type": "string", + "x-go-name": "IntranetIP" + }, + "lldp": { + "$ref": "#/definitions/LLDP" + }, + "memory": { + "$ref": "#/definitions/Memory" + }, + "motherboard": { + "$ref": "#/definitions/Motherboard" + }, + "nic": { + "$ref": "#/definitions/NIC" + }, + "oob": { + "$ref": "#/definitions/OOB" + }, + "os": { + "type": "string", + "x-go-name": "OS" + }, + "pci": { + "$ref": "#/definitions/PCI" + }, + "power": { + "$ref": "#/definitions/Power" + }, + "power_supply_num": { + "type": "integer", + "format": "int64", + "x-go-name": "PowerSupplyNum" + }, + "raid": { + "$ref": "#/definitions/RAID" + }, + "remark": { + "type": "string", + "x-go-name": "Remark" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "Controller": { + "type": "object", + "title": "Controller RAID控制器,指代一块RAID卡硬件。", + "properties": { + "firmware_version": { + "type": "string", + "x-go-name": "FirmwareVersion" + }, + "id": { + "type": "string", + "x-go-name": "ID" + }, + "mode": { + "type": "string", + "x-go-name": "Mode" + }, + "model_name": { + "type": "string", + "x-go-name": "ModelName" + } + }, + "x-go-package": "idcos.com/cloudboot/hardware/raid" + }, + "Data": { + "type": "array", + "items": { + "type": "object", + "properties": { + "action": { + "type": "string", + "x-go-name": "Action" + }, + "category": { + "type": "string", + "x-go-name": "Category" + }, + "metadata": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "x-go-name": "Metadata" + } + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "DataDict": { + "description": "DataDict 数据字典", + "type": "object", + "properties": { + "id": { + "description": "主键", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "description": "名称", + "type": "string", + "x-go-name": "Name" + }, + "remark": { + "description": "备注", + "type": "string", + "x-go-name": "Remark" + }, + "type": { + "description": "类型", + "type": "string", + "x-go-name": "Type" + }, + "value": { + "description": "值", + "type": "string", + "x-go-name": "Value" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "Device": { + "description": "Device 设备信息采集上报请求数据", + "type": "object", + "properties": { + "arch": { + "type": "string", + "x-go-name": "Arch" + }, + "bios": { + "$ref": "#/definitions/BIOS" + }, + "bootos_ip": { + "type": "string", + "x-go-name": "BootOSIP" + }, + "bootos_mac": { + "type": "string", + "x-go-name": "BootOSMac" + }, + "cpu": { + "$ref": "#/definitions/CPU" + }, + "disk": { + "$ref": "#/definitions/Disk" + }, + "disk_slot": { + "$ref": "#/definitions/DiskSlot" + }, + "extra": { + "$ref": "#/definitions/Extra" + }, + "fan": { + "$ref": "#/definitions/Fan" + }, + "hba": { + "$ref": "#/definitions/HBA" + }, + "lldp": { + "$ref": "#/definitions/LLDP" + }, + "memory": { + "$ref": "#/definitions/Memory" + }, + "model": { + "type": "string", + "x-go-name": "Model" + }, + "motherboard": { + "$ref": "#/definitions/Motherboard" + }, + "nic": { + "$ref": "#/definitions/NIC" + }, + "nic_device": { + "type": "string", + "x-go-name": "NICDevice" + }, + "oob": { + "$ref": "#/definitions/OOB" + }, + "pci": { + "$ref": "#/definitions/PCI" + }, + "power": { + "$ref": "#/definitions/Power" + }, + "raid": { + "$ref": "#/definitions/RAID" + }, + "sn": { + "type": "string", + "x-go-name": "SN" + }, + "vendor": { + "type": "string", + "x-go-name": "Vendor" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/types/device" + }, + "DeviceInstallStaticCountResp": { + "description": "DeviceInstallStaticCountResp 装机信息统计resp", + "type": "object", + "properties": { + "failure_count": { + "description": "安装失败的物理机数量", + "type": "integer", + "format": "int64", + "x-go-name": "FailureCount" + }, + "installing_count": { + "description": "正在安装的物理机数量", + "type": "integer", + "format": "int64", + "x-go-name": "InstallingCount" + }, + "preinstall_count": { + "description": "等待安装物理机数量", + "type": "integer", + "format": "int64", + "x-go-name": "PreInstallCount" + }, + "success_count": { + "description": "安装成功的物理机数量", + "type": "integer", + "format": "int64", + "x-go-name": "SuccessCount" + }, + "total_devices": { + "description": "物理机总数", + "type": "integer", + "format": "int64", + "x-go-name": "TotalDevices" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "DeviceLog": { + "description": "DeviceLog 安装日志信息", + "type": "object", + "properties": { + "content": { + "description": "日志内容", + "type": "string", + "x-go-name": "Content" + }, + "create_at": { + "description": "日志记录创建时间", + "type": "string", + "x-go-name": "CreatedAt" + }, + "id": { + "description": "日志记录ID", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "title": { + "description": "日志标题", + "type": "string", + "x-go-name": "Title" + }, + "updated_at": { + "description": "日志记录更新时间", + "type": "string", + "x-go-name": "UpdatedAt" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "DeviceLogResp": { + "description": "DeviceLogResp 安装日志返回值", + "type": "object", + "properties": { + "device_setting_id": { + "description": "InstallType 系统参数ID", + "type": "integer", + "format": "uint64", + "x-go-name": "DeviceSettingID" + }, + "logs": { + "description": "操作系统安装模板", + "type": "array", + "items": { + "$ref": "#/definitions/DeviceLog" + }, + "x-go-name": "Logs" + }, + "sn": { + "description": "设备序列号", + "type": "string", + "x-go-name": "SN" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "DevicePageResp": { + "type": "object", + "properties": { + "arch": { + "description": "硬件架构", + "type": "string", + "x-go-name": "Arch" + }, + "category": { + "description": "分类", + "type": "string", + "x-go-name": "Category" + }, + "created_at": { + "$ref": "#/definitions/ISOTime" + }, + "extranet_ip": { + "description": "外网IP", + "type": "string", + "x-go-name": "ExtranetIP" + }, + "fixed_asset_number": { + "description": "固资编号", + "type": "string", + "x-go-name": "FixedAssetNum" + }, + "hardware_remark": { + "description": "硬件说明", + "type": "string", + "x-go-name": "HardwareRemark" + }, + "id": { + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "idc": { + "$ref": "#/definitions/IDCSimplify" + }, + "intranet_ip": { + "description": "内网IP", + "type": "string", + "x-go-name": "IntranetIP" + }, + "model": { + "description": "型号", + "type": "string", + "x-go-name": "Model" + }, + "onshelve_at": { + "description": "上架时间", + "type": "string", + "x-go-name": "OnShelveAt" + }, + "oob_ip": { + "description": "带外IP", + "type": "string", + "x-go-name": "OOBIP" + }, + "oob_password": { + "description": "带外密码", + "type": "string", + "x-go-name": "OOBPassword" + }, + "oob_user": { + "description": "带外用户", + "type": "string", + "x-go-name": "OOBUser" + }, + "operation_status": { + "description": "运营状态:运营中(需告警),运营中(无需告警),重装中,搬迁中,待退役,已退役,待部署,已上架,回收中'('run_with_alarm','run_without_alarm','reinstalling','moving','pre_retire','retired','pre_deploy','on_shelve','recycling')", + "type": "string", + "x-go-name": "OperationStatus" + }, + "os": { + "description": "操作系统", + "type": "string", + "x-go-name": "OS" + }, + "power_status": { + "description": "电源状态", + "type": "string", + "x-go-name": "PowerStatus" + }, + "raid_remark": { + "description": "RAID说明", + "type": "string", + "x-go-name": "RAIDRemark" + }, + "server_cabinet": { + "$ref": "#/definitions/ServerCabinetSimplify" + }, + "server_room": { + "$ref": "#/definitions/ServerRoomSimplify" + }, + "server_usite": { + "$ref": "#/definitions/ServerUSiteSimplify" + }, + "sn": { + "description": "序列号", + "type": "string", + "x-go-name": "SN" + }, + "started_at": { + "description": "启用时间", + "type": "string", + "x-go-name": "StartedAt" + }, + "updated_at": { + "$ref": "#/definitions/ISOTime" + }, + "usage": { + "description": "用途 'TDSQL','APP','CVM','TGW','NAS','Other'", + "type": "string", + "x-go-name": "Usage" + }, + "vendor": { + "description": "厂商", + "type": "string", + "x-go-name": "Vendor" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "DeviceSettingResp": { + "description": "DeviceSettingResp 装机参数返回体", + "type": "object", + "properties": { + "device": { + "description": "物理机", + "type": "object", + "properties": { + "fixed_asset_number": { + "description": "设备SN", + "type": "string", + "x-go-name": "FixedAssetNumber" + }, + "id": { + "description": "设备ID", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "sn": { + "description": "设备SN", + "type": "string", + "x-go-name": "SN" + } + }, + "x-go-name": "Device" + }, + "extranet_ip": { + "description": "外网IP", + "type": "string", + "x-go-name": "ExtranetIP" + }, + "hardware_template": { + "description": "硬件模板", + "type": "object", + "properties": { + "id": { + "description": "硬件模板ID", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "description": "硬件模板名称", + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-name": "HardwareTemplate" + }, + "id": { + "description": "设备参数主键", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "idc": { + "description": "数据中心", + "type": "object", + "properties": { + "id": { + "description": "数据中心ID", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "description": "数据中心名称", + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-name": "IDC" + }, + "image_template": { + "description": "镜像模板", + "type": "object", + "properties": { + "id": { + "description": "镜像模板ID", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "description": "镜像模板名称", + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-name": "ImageTemplate" + }, + "install_progress": { + "description": "安装进度", + "type": "number", + "format": "double", + "x-go-name": "InstallProgress" + }, + "install_type": { + "description": "安装类型: image/pxe", + "type": "string", + "x-go-name": "InstallType" + }, + "intranet_ip": { + "description": "内网IP", + "type": "string", + "x-go-name": "IntranetIP" + }, + "server_cabinet": { + "description": "机架", + "type": "object", + "properties": { + "id": { + "description": "机架ID", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "number": { + "description": "机架编号", + "type": "string", + "x-go-name": "Number" + } + }, + "x-go-name": "ServerCabinet" + }, + "server_room": { + "description": "机房", + "type": "object", + "properties": { + "id": { + "description": "机房ID", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "description": "机房名称", + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-name": "ServerRoom" + }, + "server_usite": { + "description": "机位", + "type": "object", + "properties": { + "id": { + "description": "机位ID", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "number": { + "description": "机位编号", + "type": "string", + "x-go-name": "Number" + } + }, + "x-go-name": "ServerUSite" + }, + "sn": { + "description": "设备序列号(多个SN用英文逗号分隔)", + "type": "string", + "x-go-name": "Sn" + }, + "status": { + "description": "装机状态。可选值 pre_install-等待安装; installing-正在安装; failure-安装失败; success-安装成功;", + "type": "string", + "x-go-name": "Status" + }, + "system_template": { + "description": "系统模板", + "type": "object", + "properties": { + "id": { + "description": "系统模板ID", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "description": "系统模板名称", + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-name": "SystemTemplate" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "Disk": { + "description": "Disk 逻辑磁盘", + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/DiskItem" + }, + "x-go-name": "Items" + }, + "total_size": { + "type": "integer", + "format": "int64", + "x-go-name": "TotalSize" + }, + "total_size_gb": { + "type": "integer", + "format": "int64", + "x-go-name": "TotalSizeGB" + } + }, + "x-go-package": "idcos.com/cloudboot/hardware/collector" + }, + "DiskItem": { + "description": "DiskItem 逻辑磁盘条目", + "type": "object", + "properties": { + "name": { + "type": "string", + "x-go-name": "Name" + }, + "size": { + "type": "string", + "x-go-name": "Size" + } + }, + "x-go-package": "idcos.com/cloudboot/hardware/collector" + }, + "DiskSlot": { + "description": "DiskSlot 磁盘槽位(物理驱动器)", + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/PhysicalDrive" + }, + "x-go-name": "Items" + } + }, + "x-go-package": "idcos.com/cloudboot/hardware/collector" + }, + "Extra": { + "description": "Extra 自定义扩展属性", + "type": "object", + "additionalProperties": { + "type": "object" + }, + "x-go-package": "idcos.com/cloudboot/hardware/collector" + }, + "Fan": { + "description": "Fan 风扇", + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/FanItem" + }, + "x-go-name": "Items" + } + }, + "x-go-package": "idcos.com/cloudboot/hardware/collector" + }, + "FanItem": { + "description": "FanItem 风扇", + "type": "object", + "properties": { + "id": { + "type": "string", + "x-go-name": "ID" + }, + "speed": { + "type": "string", + "x-go-name": "Speed" + } + }, + "x-go-package": "idcos.com/cloudboot/hardware/collector" + }, + "File": { + "type": "object", + "title": "File represents an open file descriptor.", + "x-go-package": "os" + }, + "FirstServerRoom": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "FirstServerRooms": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "GetInspectionBySNReq": { + "description": "GetInspectionBySNReq 查询巡检明细请求结构体", + "type": "object", + "properties": { + "sn": { + "description": "硬件巡检目标设备", + "type": "string", + "x-go-name": "SN" + }, + "start_time": { + "description": "硬件巡检开始时间", + "type": "string", + "x-go-name": "StartTime" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "GetInspectionStartTimesBySNReq": { + "description": "GetInspectionStartTimesBySNReq 查询巡检明细请求结构体", + "type": "object", + "properties": { + "RunningStatus": { + "description": "硬件巡检执行状态", + "type": "string" + }, + "SN": { + "description": "硬件巡检目标设备", + "type": "string" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "GetNetworkSettingBySNResp": { + "description": "GetNetworkSettingBySNResp 根据SN请求设备业务网络配置响应结构", + "type": "object", + "properties": { + "bonding_required": { + "type": "string", + "x-go-name": "BondingRequired" + }, + "ip_source": { + "description": "IP来源", + "type": "string", + "x-go-name": "IPSource" + }, + "items": { + "description": "分配给该设备的IP对象数组", + "type": "array", + "items": { + "$ref": "#/definitions/IPAndIPNetworkUnion" + }, + "x-go-name": "Items" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "HBA": { + "description": "HBA HBA卡", + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/HBAItem" + }, + "x-go-name": "Items" + } + }, + "x-go-package": "idcos.com/cloudboot/hardware/collector" + }, + "HBAItem": { + "description": "HBAItem 单块HBA卡", + "type": "object", + "properties": { + "firmware_version": { + "type": "string", + "x-go-name": "FirmwareVersion" + }, + "host": { + "type": "string", + "x-go-name": "Host" + }, + "wwnns": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "WWNNs" + }, + "wwpns": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "WWPNs" + } + }, + "x-go-package": "idcos.com/cloudboot/hardware/collector" + }, + "HardwareTemplateResp": { + "description": "HardwareTemplateResp 硬件模板返回体", + "type": "object", + "properties": { + "builtin": { + "description": "是否内置", + "type": "string", + "x-go-name": "Builtin" + }, + "data": { + "$ref": "#/definitions/Data" + }, + "model_name": { + "description": "型号", + "type": "string", + "x-go-name": "ModelName" + }, + "name": { + "description": "名称", + "type": "string", + "x-go-name": "Name" + }, + "vendor": { + "description": "厂商", + "type": "string", + "x-go-name": "Vendor" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "HardwareTemplateSimplify": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "HardwareTplResp": { + "type": "object", + "properties": { + "builtin": { + "description": "是否是内置模板'Yes|No'", + "type": "string", + "x-go-name": "Builtin" + }, + "created_at": { + "description": "创建时间", + "type": "string", + "x-go-name": "CreatedAt" + }, + "data": { + "$ref": "#/definitions/Data" + }, + "id": { + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "model_name": { + "description": "型号名称", + "type": "string", + "x-go-name": "ModelName" + }, + "name": { + "description": "模板名称", + "type": "string", + "x-go-name": "Name" + }, + "updated_at": { + "description": "修改时间", + "type": "string", + "x-go-name": "UpdatedAt" + }, + "vendor": { + "description": "硬件制造厂商", + "type": "string", + "x-go-name": "Vendor" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "IDCFirstServerRoom": { + "description": "IDCFirstServerRoom 一级机房", + "type": "object", + "properties": { + "id": { + "description": "一级机房ID", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "description": "一级机房名", + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "IDCForServerRoomPage": { + "description": "IDCForServerRoomPage 数据中心", + "type": "object", + "properties": { + "first_server_room": { + "description": "一级机房", + "type": "array", + "items": { + "$ref": "#/definitions/IDCFirstServerRoom" + }, + "x-go-name": "FirstServerRoom" + }, + "id": { + "description": "数据中心ID", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "description": "数据中心名", + "type": "string", + "x-go-name": "Name" + }, + "status": { + "description": "状态", + "type": "string", + "x-go-name": "Status" + }, + "vendor": { + "description": "厂商", + "type": "string", + "x-go-name": "Vendor" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "IDCOrServerRoom": { + "description": "IDCOrServerRoom 网段分页查询专用", + "type": "object", + "properties": { + "id": { + "description": "索引", + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "name": { + "description": "名称", + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "IDCReq": { + "type": "object", + "properties": { + "first_server_room": { + "$ref": "#/definitions/FirstServerRooms" + }, + "id": { + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "status": { + "description": "建设中under_construction,已验收accepted,已投产production,已裁撤abolished", + "type": "string", + "x-go-name": "Status" + }, + "usage": { + "description": "用途", + "type": "string", + "x-go-name": "Usage" + }, + "vendor": { + "description": "供应商", + "type": "string", + "x-go-name": "Vendor" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "IDCResp": { + "type": "object", + "properties": { + "created_at": { + "$ref": "#/definitions/ISOTime" + }, + "first_server_room": { + "type": "array", + "items": { + "$ref": "#/definitions/FirstServerRoom" + }, + "x-go-name": "FirstServerRoom" + }, + "id": { + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "status": { + "type": "string", + "x-go-name": "Status" + }, + "updated_at": { + "$ref": "#/definitions/ISOTime" + }, + "usage": { + "type": "string", + "x-go-name": "Usage" + }, + "vendor": { + "type": "string", + "x-go-name": "Vendor" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "IDCSimplify": { + "type": "object", + "properties": { + "id": { + "description": "数据中心ID", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "description": "数据中心名称", + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "IDCUpdateReq": { + "type": "object", + "properties": { + "ids": { + "description": "指定修改的ID列表", + "type": "array", + "items": { + "type": "integer", + "format": "uint64" + }, + "x-go-name": "IDs" + }, + "status": { + "description": "建设中under_construction,已验收accepted,已投产production,已裁撤abolished", + "type": "string", + "x-go-name": "Status" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "IPAndIPNetworkUnion": { + "description": "IPAndIPNetworkUnion 设备网络配置查询结果", + "type": "object", + "properties": { + "gateway": { + "type": "string", + "x-go-name": "Gateway" + }, + "ip": { + "type": "string", + "x-go-name": "IP" + }, + "netmask": { + "type": "string", + "x-go-name": "Netmask" + }, + "scope": { + "type": "string", + "x-go-name": "Scope" + } + }, + "x-go-package": "idcos.com/cloudboot/model" + }, + "IPNetworkForIPSPage": { + "description": "IPNetworkForIPSPage 为了查询IP分页", + "type": "object", + "properties": { + "cidr": { + "description": "CIDR网段", + "type": "string", + "x-go-name": "CIDR" + }, + "gateway": { + "description": "网关", + "type": "string", + "x-go-name": "Gateway" + }, + "id": { + "description": "IP网段索引", + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "netmask": { + "description": "掩码", + "type": "string", + "x-go-name": "Netmask" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "IPNetworkPage": { + "description": "IPNetworkPage 网段", + "type": "object", + "properties": { + "category": { + "description": "网段类别(ilo-服务器ILO; tgw_intranet-服务器TGW内网; tgw_extranet-服务器TGW外网; intranet-服务器普通内网; extranet-服务器普通外网; v_intranet-服务器虚拟化内网;)", + "type": "string", + "x-go-name": "Category" + }, + "cidr": { + "description": "CIDR网段", + "type": "string", + "x-go-name": "CIDR" + }, + "created_at": { + "$ref": "#/definitions/ISOTime" + }, + "gateway": { + "description": "网关", + "type": "string", + "x-go-name": "Gateway" + }, + "id": { + "description": "网段ID", + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "idc": { + "$ref": "#/definitions/IDCOrServerRoom" + }, + "ip_pool": { + "description": "业务IP资源池", + "type": "string", + "x-go-name": "IPPool" + }, + "netmask": { + "description": "掩码", + "type": "string", + "x-go-name": "Netmask" + }, + "pxe_pool": { + "description": "带外IP资源池", + "type": "string", + "x-go-name": "PXEPool" + }, + "server_room": { + "$ref": "#/definitions/IDCOrServerRoom" + }, + "switchs": { + "description": "交换机设备", + "type": "array", + "items": { + "$ref": "#/definitions/SwitchDetail" + }, + "x-go-name": "Switchs" + }, + "updated_at": { + "$ref": "#/definitions/ISOTime" + }, + "vlan": { + "description": "vlan", + "type": "string", + "x-go-name": "Vlan" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "IPSPage": { + "description": "IPSPage 网段", + "type": "object", + "properties": { + "category": { + "description": "网段类别。可选值: pxe-PXE用IP; business-业务用IP;", + "type": "string", + "x-go-name": "Category" + }, + "created_at": { + "$ref": "#/definitions/ISOTime" + }, + "id": { + "description": "索引", + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "ip": { + "description": "ip地址,支持模糊查询", + "type": "string", + "x-go-name": "IP" + }, + "ip_network": { + "$ref": "#/definitions/IPNetworkForIPSPage" + }, + "is_used": { + "description": "是否已经被使用。可选值: yes-是; no-否;", + "type": "string", + "x-go-name": "IsUsed" + }, + "scope": { + "description": "内外网", + "type": "string", + "x-go-name": "Scope" + }, + "sn": { + "description": "占用IP的设备序列号。(支持模糊查询)", + "type": "string", + "x-go-name": "SN" + }, + "updated_at": { + "$ref": "#/definitions/ISOTime" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "ISOTime": { + "type": "string", + "format": "date-time", + "title": "ISOTime 标准库Time的别名类型。用于格式化为ISO8601标准的时间(形如'2015-09-09 09:09:09')。", + "x-go-package": "idcos.com/cloudboot/utils/times" + }, + "ImageTemplateResp": { + "description": "ImageTemplateResp 镜像安装模板", + "type": "object", + "properties": { + "boot_mode": { + "type": "string", + "x-go-name": "BootMode" + }, + "created_at": { + "type": "string", + "x-go-name": "CreatedAt" + }, + "disks": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "x-go-name": "Name" + }, + "partitions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "fstype": { + "type": "string", + "x-go-name": "Fstype" + }, + "mountpoint": { + "type": "string", + "x-go-name": "Mountpoint" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "size": { + "type": "string", + "x-go-name": "Size" + } + } + }, + "x-go-name": "Partitions" + } + } + }, + "x-go-name": "Disks" + }, + "family": { + "type": "string", + "x-go-name": "Family" + }, + "id": { + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "password": { + "type": "string", + "x-go-name": "Password" + }, + "post_script": { + "type": "string", + "x-go-name": "PostScript" + }, + "pre_script": { + "type": "string", + "x-go-name": "PreScript" + }, + "updated_at": { + "type": "string", + "x-go-name": "UpdatedAt" + }, + "url": { + "type": "string", + "x-go-name": "URL" + }, + "username": { + "type": "string", + "x-go-name": "Username" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "ImageTemplateSimplify": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "ImportReq": { + "description": "ImportReq 导入请求参数", + "type": "object", + "properties": { + "file_name": { + "description": "文件名称", + "type": "string", + "x-go-name": "FileName" + }, + "limit": { + "description": "页大小", + "type": "integer", + "format": "uint64", + "x-go-name": "Limit" + }, + "offset": { + "description": "页号", + "type": "integer", + "format": "uint64", + "x-go-name": "Offset" + } + }, + "x-go-package": "idcos.com/cloudboot/utils/upload" + }, + "InspectionFullWithPage": { + "description": "InspectionFullWithPage 硬件巡检分页查询", + "type": "object", + "properties": { + "created_at": { + "$ref": "#/definitions/ISOTime" + }, + "end_time": { + "$ref": "#/definitions/ISOTime" + }, + "error": { + "description": "带外IP\nOOBIP string `json:\"oob_ip\"`\n巡检错误信息", + "type": "string", + "x-go-name": "Error" + }, + "health_status": { + "description": "健康状态", + "type": "string", + "x-go-name": "HealthStatus" + }, + "id": { + "description": "索引", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "result": { + "description": "巡检结果", + "type": "array", + "items": { + "$ref": "#/definitions/InspectionResultItem" + }, + "x-go-name": "Result" + }, + "running_status": { + "description": "运行状态", + "type": "string", + "x-go-name": "RuningStatus" + }, + "sn": { + "description": "设备序列号", + "type": "string", + "x-go-name": "SN" + }, + "start_time": { + "$ref": "#/definitions/ISOTime" + }, + "updated_at": { + "$ref": "#/definitions/ISOTime" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "InspectionResultItem": { + "description": "InspectionResultItem 单项巡检结果(包括temperature,voltage,fan,memory,power_supply)", + "type": "object", + "properties": { + "status": { + "type": "string", + "x-go-name": "Status" + }, + "type": { + "type": "string", + "x-go-name": "Type" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "InspectionSimplify": { + "type": "object", + "properties": { + "remark": { + "type": "string", + "x-go-name": "Remark" + }, + "result": { + "type": "string", + "x-go-name": "Result" + }, + "run_status": { + "type": "string", + "x-go-name": "RunStatus" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "InspectionStatistics": { + "description": "InspectionStatistics 硬件巡检结果统计", + "type": "object", + "properties": { + "critical_count": { + "description": "异常设备数量", + "type": "integer", + "format": "int64", + "x-go-name": "CriticalCount" + }, + "date": { + "description": "日期", + "type": "string", + "x-go-name": "Date" + }, + "nominal_count": { + "description": "正常设备数量", + "type": "integer", + "format": "int64", + "x-go-name": "NominalCount" + }, + "warning_count": { + "description": "警告设备数量", + "type": "integer", + "format": "int64", + "x-go-name": "WarningCount" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "LLDP": { + "description": "LLDP LLDP采集到的交换机信息", + "type": "object", + "additionalProperties": { + "type": "object" + }, + "x-go-package": "idcos.com/cloudboot/hardware/collector" + }, + "Memory": { + "description": "Memory 内存", + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/MemoryDevice" + }, + "x-go-name": "Items" + }, + "total_size": { + "type": "integer", + "format": "int64", + "x-go-name": "TotalSize" + }, + "total_size_mb": { + "type": "integer", + "format": "int64", + "x-go-name": "TotalSizeMB" + } + }, + "x-go-package": "idcos.com/cloudboot/hardware/collector" + }, + "MemoryDevice": { + "description": "MemoryDevice 插在内存插槽上的内存条", + "type": "object", + "properties": { + "locator": { + "type": "string", + "x-go-name": "Locator" + }, + "size": { + "type": "string", + "x-go-name": "Size" + }, + "speed": { + "type": "string", + "x-go-name": "Speed" + }, + "type": { + "type": "string", + "x-go-name": "Type" + } + }, + "x-go-package": "idcos.com/cloudboot/hardware/collector" + }, + "Motherboard": { + "description": "Motherboard 主板", + "type": "object", + "properties": { + "manufacturer": { + "type": "string", + "x-go-name": "Manufacturer" + }, + "product_name": { + "type": "string", + "x-go-name": "ProductName" + }, + "serial_number": { + "type": "string", + "x-go-name": "SerialNumber" + } + }, + "x-go-package": "idcos.com/cloudboot/hardware/collector" + }, + "NIC": { + "description": "NIC 网卡", + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/NICItem" + }, + "x-go-name": "Items" + } + }, + "x-go-package": "idcos.com/cloudboot/hardware/collector" + }, + "NICItem": { + "description": "NICItem 网卡信息", + "type": "object", + "properties": { + "businfo": { + "type": "string", + "x-go-name": "Businfo" + }, + "company": { + "type": "string", + "x-go-name": "Company" + }, + "designation": { + "type": "string", + "x-go-name": "Designation" + }, + "firmware_version": { + "type": "string", + "x-go-name": "FirmwareVersion" + }, + "ip": { + "type": "string", + "x-go-name": "IP" + }, + "link": { + "type": "string", + "x-go-name": "Link" + }, + "mac": { + "type": "string", + "x-go-name": "Mac" + }, + "model_name": { + "type": "string", + "x-go-name": "ModelName" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "side": { + "type": "string", + "x-go-name": "Side" + }, + "speed": { + "type": "string", + "x-go-name": "Speed" + } + }, + "x-go-package": "idcos.com/cloudboot/hardware/collector" + }, + "NetworkArea": { + "description": "NetworkArea 网络区域", + "type": "object", + "properties": { + "created_at": { + "description": "创建时间", + "type": "string", + "x-go-name": "CreatedAt" + }, + "id": { + "description": "主键ID", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "idc": { + "description": "数据中心", + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-name": "IDC" + }, + "name": { + "description": "网络区域名", + "type": "string", + "x-go-name": "Name" + }, + "physical_area": { + "description": "物理区域", + "type": "array", + "items": { + "$ref": "#/definitions/PhysicalArea" + }, + "x-go-name": "PhysicalArea" + }, + "server_room": { + "description": "机房管理单元", + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-name": "ServerRoom" + }, + "status": { + "description": "Status 状态", + "type": "string", + "x-go-name": "Status" + }, + "updated_at": { + "description": "修改时间", + "type": "string", + "x-go-name": "UpdatedAt" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "NetworkDeviceResp": { + "description": "NetworkDeviceResp 网络设备返回体", + "type": "object", + "properties": { + "created_at": { + "description": "创建时间", + "type": "string", + "x-go-name": "CreatedAt" + }, + "fixed_asset_number": { + "description": "资产编号", + "type": "string", + "x-go-name": "FixedAssetNumber" + }, + "id": { + "description": "主键", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "idc": { + "description": "数据中心", + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-name": "IDC" + }, + "model": { + "description": "产品型号", + "type": "string", + "x-go-name": "ModelNumber" + }, + "name": { + "description": "名称", + "type": "string", + "x-go-name": "Name" + }, + "os": { + "description": "操作系统", + "type": "string", + "x-go-name": "OS" + }, + "server_cabinet": { + "description": "机架信息", + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "number": { + "type": "string", + "x-go-name": "Number" + } + }, + "x-go-name": "ServerCabinet" + }, + "server_room": { + "description": "机房信息", + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-name": "ServerRoom" + }, + "sn": { + "description": "SN号", + "type": "string", + "x-go-name": "SN" + }, + "tor": { + "description": "TOR", + "type": "string", + "x-go-name": "TOR" + }, + "type": { + "description": "类型", + "type": "string", + "x-go-name": "Type" + }, + "updated_at": { + "description": "修改时间", + "type": "string", + "x-go-name": "UpdatedAt" + }, + "usage": { + "description": "用途", + "type": "string", + "x-go-name": "Usage" + }, + "vendor": { + "description": "厂商", + "type": "string", + "x-go-name": "Vendor" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "OOB": { + "description": "OOB OOB", + "type": "object", + "properties": { + "firmware": { + "type": "string", + "x-go-name": "Firmware" + }, + "network": { + "$ref": "#/definitions/OOBNetwork" + }, + "user": { + "type": "array", + "items": { + "$ref": "#/definitions/OOBUser" + }, + "x-go-name": "User" + } + }, + "x-go-package": "idcos.com/cloudboot/hardware/collector" + }, + "OOBInfo": { + "description": "OOBInfo 带外信息", + "type": "object", + "properties": { + "ip": { + "type": "string", + "x-go-name": "IP" + }, + "password": { + "type": "string", + "x-go-name": "Password" + }, + "username": { + "type": "string", + "x-go-name": "Username" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "OOBNetwork": { + "description": "OOBNetwork 带外网络信息", + "type": "object", + "properties": { + "gateway": { + "type": "string", + "x-go-name": "Gateway" + }, + "ip": { + "type": "string", + "x-go-name": "IP" + }, + "ip_src": { + "type": "string", + "x-go-name": "IPSrc" + }, + "netmask": { + "type": "string", + "x-go-name": "Netmask" + } + }, + "x-go-package": "idcos.com/cloudboot/hardware/collector" + }, + "OOBPowerBatchOperateReq": { + "description": "OOBPowerBatchOperateReq 带外管理批量请求结构体", + "type": "object", + "properties": { + "sns": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Sns" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "OOBUser": { + "description": "OOBUser 带外用户信息", + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "password": { + "type": "string", + "x-go-name": "Password" + }, + "privilege_level": { + "type": "string", + "x-go-name": "PrivilegeLevel" + } + }, + "x-go-package": "idcos.com/cloudboot/hardware/collector" + }, + "OperateLog": { + "type": "object", + "properties": { + "category_code": { + "type": "string", + "x-go-name": "CategoryCode" + }, + "category_name": { + "type": "string", + "x-go-name": "CategoryName" + }, + "created_at": { + "type": "string", + "format": "date-time", + "x-go-name": "CreatedAt" + }, + "destination": { + "type": "string", + "x-go-name": "Destination" + }, + "http_method": { + "type": "string", + "x-go-name": "HTTPMethod" + }, + "id": { + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "operator": { + "type": "string", + "x-go-name": "Operator" + }, + "source": { + "type": "string", + "x-go-name": "Source" + }, + "url": { + "type": "string", + "x-go-name": "URL" + } + }, + "x-go-package": "idcos.com/cloudboot/model" + }, + "OsTemplateResp": { + "description": "OsTemplateResp 模板参数返回值", + "type": "object", + "properties": { + "boot_mode": { + "description": "启动模式。可选值: legacy_bios-传统BIOS模式; uefi-UEFI模式;", + "type": "string", + "x-go-name": "BootMode" + }, + "family": { + "description": "操作系统族系", + "type": "string", + "x-go-name": "Family" + }, + "id": { + "description": "主键", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "install_type": { + "description": "安装方式。可选值: image-镜像安装模板; pxe-PXE安装模板;", + "type": "string", + "x-go-name": "InstallType" + }, + "name": { + "description": "模板名(支持模糊查询)", + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "PCI": { + "description": "PCI PCI", + "type": "object", + "properties": { + "slots": { + "type": "array", + "items": { + "$ref": "#/definitions/SlotItem" + }, + "x-go-name": "Items" + }, + "total_slots": { + "type": "integer", + "format": "int64", + "x-go-name": "TotalSlots" + } + }, + "x-go-package": "idcos.com/cloudboot/hardware/collector" + }, + "Page": { + "description": "Page 分页结构体", + "type": "object", + "properties": { + "page": { + "description": "页号", + "type": "integer", + "format": "int64", + "x-go-name": "Page" + }, + "page_size": { + "description": "页大小", + "type": "integer", + "format": "int64", + "x-go-name": "PageSize" + }, + "records": { + "description": "记录", + "type": "array", + "items": { + "type": "object" + }, + "x-go-name": "Records" + }, + "total_page": { + "description": "实际页数", + "type": "integer", + "format": "int64", + "x-go-name": "TotalPage" + }, + "total_records": { + "description": "实际数量", + "type": "integer", + "format": "int64", + "x-go-name": "TotalRecords" + } + }, + "x-go-package": "idcos.com/cloudboot/cmd/cloudboot-server" + }, + "PhysicalArea": { + "description": "PhysicalArea 物理区域", + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "PhysicalCPU": { + "description": "PhysicalCPU 物理CPU", + "type": "object", + "properties": { + "clock_speed": { + "type": "string", + "x-go-name": "ClockSpeed" + }, + "cores": { + "type": "integer", + "format": "int64", + "x-go-name": "Cores" + }, + "model_name": { + "type": "string", + "x-go-name": "ModelName" + } + }, + "x-go-package": "idcos.com/cloudboot/hardware/collector" + }, + "PhysicalDrive": { + "description": "PhysicalDrive 物理驱动器(物理磁盘)", + "type": "object", + "properties": { + "controller_id": { + "type": "string", + "x-go-name": "ControllerID" + }, + "id": { + "type": "string", + "x-go-name": "ID" + }, + "media_type": { + "type": "string", + "x-go-name": "MediaType" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "raw_size": { + "type": "string", + "x-go-name": "RawSize" + } + }, + "x-go-package": "idcos.com/cloudboot/hardware/raid" + }, + "Power": { + "description": "Power 电源", + "type": "object", + "x-go-package": "idcos.com/cloudboot/hardware/collector" + }, + "RAID": { + "description": "RAID RAID", + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/Controller" + }, + "x-go-name": "Items" + } + }, + "x-go-package": "idcos.com/cloudboot/hardware/collector" + }, + "RemoveDeviceSettingsReq": { + "description": "RemoveDeviceSettingsReq 批量删除设备装机参数请求结构体", + "type": "object", + "properties": { + "sns": { + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "SNs" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "SaveHardwareTplReq": { + "type": "object", + "properties": { + "builtin": { + "description": "是否是内置模板'Yes|No'", + "type": "string", + "x-go-name": "Builtin" + }, + "data": { + "$ref": "#/definitions/Data" + }, + "id": { + "description": "主键", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "model_name": { + "description": "型号名称", + "type": "string", + "x-go-name": "ModelName" + }, + "name": { + "description": "模板名称", + "type": "string", + "x-go-name": "Name" + }, + "vendor": { + "description": "硬件制造厂商", + "type": "string", + "x-go-name": "Vendor" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "SaveIPNetworkReq": { + "description": "SaveIPNetworkReq 保存(新增/更新)业务网段请求结构体", + "type": "object", + "properties": { + "IDCID": { + "type": "integer", + "format": "uint64" + }, + "category": { + "description": "(required): 网段类别。可选值: ilo-服务器ILO; tgw_intranet-服务器TGW内网; tgw_extranet-服务器TGW外网; intranet-服务器普通内网; extranet-服务器普通外网; v_intranet-服务器虚拟化内网;", + "type": "string", + "x-go-name": "Category" + }, + "cidr": { + "description": "(required): CIDR网段", + "type": "string", + "x-go-name": "CIDR" + }, + "gateway": { + "description": "(required): 网关", + "type": "string", + "x-go-name": "Gateway" + }, + "id": { + "description": "网段ID。若id=0,则新增。若id\u003e0,则修改", + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "ip_pool": { + "description": "(required): 业务IP池", + "type": "string", + "x-go-name": "IPPool" + }, + "netmask": { + "description": "(required): 掩码", + "type": "string", + "x-go-name": "Netmask" + }, + "pxe_pool": { + "description": "(required): PXE IP资源池", + "type": "string", + "x-go-name": "PXEPool" + }, + "server_room_id": { + "description": "(required): 所属机房管理单元ID", + "type": "integer", + "format": "int64", + "x-go-name": "ServerRoomID" + }, + "switchs": { + "description": "(required): 网段作用范围内的交换机固定资产编号字符串数组", + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "Switchs" + }, + "vlan": { + "description": "(required): VLAN", + "type": "string", + "x-go-name": "Vlan" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "SaveImageTemplateReq": { + "description": "SaveImageTemplateReq 保存镜像安装模板请求结构体", + "type": "object", + "properties": { + "boot_mode": { + "description": "启动模式", + "type": "string", + "x-go-name": "BootMode" + }, + "disks": { + "description": "硬盘信息", + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "x-go-name": "Name" + }, + "partitions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "fstype": { + "type": "string", + "x-go-name": "Fstype" + }, + "mountpoint": { + "type": "string", + "x-go-name": "Mountpoint" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "size": { + "type": "string", + "x-go-name": "Size" + } + } + }, + "x-go-name": "Partitions" + } + } + }, + "x-go-name": "Disks" + }, + "family": { + "description": "操作系统族系", + "type": "string", + "x-go-name": "Family" + }, + "id": { + "description": "注:更新时该属性大于0", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "description": "模板名", + "type": "string", + "x-go-name": "Name" + }, + "password": { + "description": "操作系统用户密码", + "type": "string", + "x-go-name": "Password" + }, + "post_script": { + "description": "后置脚本", + "type": "string", + "x-go-name": "PostScript" + }, + "pre_script": { + "description": "前置脚本", + "type": "string", + "x-go-name": "PreScript" + }, + "url": { + "description": "PXE 引导模板内容", + "type": "string", + "x-go-name": "URL" + }, + "username": { + "description": "操作系统用户名", + "type": "string", + "x-go-name": "Username" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "SaveNetworkAreaReq": { + "description": "SaveNetworkAreaReq 保存网络区域请求结构体", + "type": "object", + "required": [ + "server_room_id", + "name", + "physical_area", + "status" + ], + "properties": { + "id": { + "description": "网络区域ID。若id=0,则新增。若id\u003e0,则修改。", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "description": "网络区域名称", + "type": "string", + "x-go-name": "Name" + }, + "physical_area": { + "description": "关联物理区域", + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "PhysicalArea" + }, + "server_room_id": { + "description": "所属机房ID", + "type": "integer", + "format": "uint64", + "x-go-name": "ServerRoomID" + }, + "status": { + "description": "状态。状态。nonproduction-未投产; production-已投产; offline-已下线(回收)", + "type": "string", + "enum": [ + "nonproduction", + "production", + "offline" + ], + "x-go-name": "Status" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "SaveServerCabinetReq": { + "description": "SaveServerCabinetReq 保存机架(柜)请求结构体", + "type": "object", + "properties": { + "available_power": { + "description": "可用功率", + "type": "string", + "x-go-name": "AvailablePower" + }, + "current": { + "description": "电流", + "type": "string", + "x-go-name": "Current" + }, + "height": { + "description": "机架(柜)高度", + "type": "integer", + "format": "uint64", + "x-go-name": "Height" + }, + "id": { + "description": "机架(柜)ID。若id=0,则新增。若id\u003e0,则修改。", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "idc_id": { + "description": "所属数据中心ID", + "type": "integer", + "format": "uint64", + "x-go-name": "IDCID" + }, + "max_power": { + "description": "峰值功率", + "type": "string", + "x-go-name": "MaxPower" + }, + "network_area_id": { + "description": "网络区域ID", + "type": "integer", + "format": "uint64", + "x-go-name": "NetworkAreaID" + }, + "network_rate": { + "description": "网络速率", + "type": "string", + "x-go-name": "NetworkRate" + }, + "number": { + "description": "机架(柜)编号", + "type": "string", + "x-go-name": "Number" + }, + "remark": { + "description": "备注", + "type": "string", + "x-go-name": "Remark" + }, + "server_room_id": { + "description": "所属机房ID", + "type": "integer", + "format": "uint64", + "x-go-name": "ServerRoomID" + }, + "type": { + "description": "类型(\"server\",\"network_device\", \"reserved\")", + "type": "string", + "x-go-name": "Type" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "SaveServerRoomReq": { + "description": "SaveServerRoomReq 保存机房请求参数", + "type": "object", + "properties": { + "address": { + "description": "(required) 地址", + "type": "string", + "x-go-name": "Address" + }, + "city": { + "description": "(required) 所属城市", + "type": "string", + "x-go-name": "City" + }, + "first_server_room": { + "description": "(required)一级机房ID", + "type": "integer", + "format": "uint64", + "x-go-name": "FirstServerRoom" + }, + "id": { + "description": "机房ID。若id=0,则新增。若id\u003e0,则修改。", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "idc_id": { + "description": "(required) 所属数据中心ID", + "type": "integer", + "format": "uint64", + "x-go-name": "IDCID" + }, + "name": { + "description": "required) 机房名称", + "type": "string", + "x-go-name": "Name" + }, + "network_asset_manager": { + "description": "(required) 网络资产负责人", + "type": "string", + "x-go-name": "NetworkAssetManager" + }, + "server_room_manager": { + "description": "(required) 机房管理单元负责人", + "type": "string", + "x-go-name": "ServerRoomManager" + }, + "support_phone_number": { + "description": "(required) 7*24小时保障电话", + "type": "string", + "x-go-name": "SupportPhoneNumber" + }, + "vendor_manager": { + "description": "(required) 供应商负责人", + "type": "string", + "x-go-name": "VendorManager" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "SaveServerUSiteReq": { + "description": "SaveServerUSiteReq 保存机位(U位)请求结构体", + "type": "object", + "properties": { + "beginning": { + "description": "起始U数", + "type": "integer", + "format": "uint64", + "x-go-name": "Beginning" + }, + "extranet_switches": { + "description": "外网交换机", + "type": "array", + "items": { + "$ref": "#/definitions/SwitchInfo" + }, + "x-go-name": "ExtranetSwitches" + }, + "height": { + "description": "机位(U位)高度", + "type": "integer", + "format": "uint64", + "x-go-name": "Height" + }, + "id": { + "description": "机位(U位)ID。若id=0,则新增。若id\u003e0,则修改。", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "intranet_switches": { + "description": "内网交换机", + "type": "array", + "items": { + "$ref": "#/definitions/SwitchInfo" + }, + "x-go-name": "IntranetSwitches" + }, + "number": { + "description": "机位(U位)编号", + "type": "string", + "x-go-name": "Number" + }, + "oobnet_switches": { + "description": "管理网交换机", + "type": "array", + "items": { + "$ref": "#/definitions/SwitchInfo" + }, + "x-go-name": "OobnetSwitches" + }, + "physical_area": { + "description": "物理区域", + "type": "string", + "x-go-name": "PhysicalArea" + }, + "remark": { + "description": "备注", + "type": "string", + "x-go-name": "Remark" + }, + "server_cabinet_id": { + "description": "所属机架(柜)ID", + "type": "integer", + "format": "uint64", + "x-go-name": "ServerCabinetID" + }, + "server_room_id": { + "description": "所属机房ID", + "type": "integer", + "format": "uint64", + "x-go-name": "ServerRoomID" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "SaveSystemTemplateReq": { + "description": "SaveSystemTemplateReq 保存(新增/更新)系统安装模板请求结构体", + "type": "object", + "properties": { + "boot_mode": { + "description": "启动模式", + "type": "string", + "x-go-name": "BootMode" + }, + "content": { + "description": "模板内容", + "type": "string", + "x-go-name": "Content" + }, + "family": { + "description": "操作系统族系", + "type": "string", + "x-go-name": "Family" + }, + "id": { + "description": "注:更新时该属性大于0", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "description": "模板名", + "type": "string", + "x-go-name": "Name" + }, + "password": { + "description": "操作系统用户密码", + "type": "string", + "x-go-name": "Password" + }, + "pxe": { + "description": "PXE 引导模板内容", + "type": "string", + "x-go-name": "PXE" + }, + "username": { + "description": "操作系统用户名", + "type": "string", + "x-go-name": "Username" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "SaveTemplateReq": { + "description": "SaveTemplateReq 新增、修改模板接口", + "type": "object", + "properties": { + "boot_mode": { + "description": "启动模式。可选值: legacy_bios-传统BIOS模式; uefi-UEFI模式;", + "type": "string", + "x-go-name": "BootMode" + }, + "family": { + "description": "操作系统族系", + "type": "string", + "x-go-name": "Family" + }, + "id": { + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "install_type": { + "description": "安装方式。可选值: image-镜像安装模板; pxe-PXE安装模板;", + "type": "string", + "x-go-name": "InstallType" + }, + "name": { + "description": "模板名(支持模糊查询)", + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "SensorData": { + "description": "SensorData IPMI传感器数据", + "type": "object", + "properties": { + "event": { + "type": "string", + "x-go-name": "Event" + }, + "id": { + "type": "string", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "reading": { + "type": "string", + "x-go-name": "Reading" + }, + "state": { + "type": "string", + "x-go-name": "State" + }, + "type": { + "type": "string", + "x-go-name": "Type" + }, + "units": { + "type": "string", + "x-go-name": "Units" + } + }, + "x-go-package": "idcos.com/cloudboot/model" + }, + "ServerCabinet": { + "description": "ServerCabinet 机架(柜)", + "type": "object", + "properties": { + "available_power": { + "description": "可用功率", + "type": "string", + "x-go-name": "AvailablePower" + }, + "created_at": { + "description": "创建时间", + "type": "string", + "x-go-name": "CreatedAt" + }, + "current": { + "description": "电流", + "type": "string", + "x-go-name": "Current" + }, + "enable_time": { + "description": "启用时间", + "type": "string", + "x-go-name": "EnableTime" + }, + "height": { + "description": "机架(柜)高度", + "type": "integer", + "format": "uint64", + "x-go-name": "Height" + }, + "id": { + "description": "机架(柜)ID", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "idc": { + "description": "数据中心", + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-name": "IDC" + }, + "is_enabled": { + "description": "是否启用", + "type": "string", + "x-go-name": "IsEnabled" + }, + "is_powered": { + "description": "是否上电", + "type": "string", + "x-go-name": "IsPowered" + }, + "max_power": { + "description": "最大功率", + "type": "string", + "x-go-name": "MaxPower" + }, + "network_area": { + "description": "网络区域", + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-name": "NetworkArea" + }, + "network_rate": { + "description": "网络速率", + "type": "string", + "x-go-name": "NetworkRate" + }, + "number": { + "description": "机架(柜)编号", + "type": "string", + "x-go-name": "Number" + }, + "power_off_time": { + "description": "关电时间", + "type": "string", + "x-go-name": "PowerOffTime" + }, + "power_on_time": { + "description": "上电时间", + "type": "string", + "x-go-name": "PowerOnTime" + }, + "remark": { + "description": "备注", + "type": "string", + "x-go-name": "Remark" + }, + "server_room": { + "description": "机房", + "type": "object", + "properties": { + "id": { + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-name": "ServerRoom" + }, + "status": { + "description": "状态", + "type": "string", + "x-go-name": "Status" + }, + "type": { + "description": "机架(柜)类型((\"server\",\"network_device\", \"reserved\"))", + "type": "string", + "x-go-name": "Type" + }, + "updated_at": { + "description": "更新时间", + "type": "string", + "x-go-name": "UpdatedAt" + }, + "usite_count": { + "description": "机位总数", + "type": "integer", + "format": "int64", + "x-go-name": "USiteCount" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "ServerCabinetSimplify": { + "type": "object", + "properties": { + "id": { + "description": "机架ID", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "number": { + "description": "机架编号", + "type": "string", + "x-go-name": "Number" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "ServerRoom": { + "description": "ServerRoom 机房分页查询信息", + "type": "object", + "properties": { + "address": { + "description": "地址", + "type": "string", + "x-go-name": "Address" + }, + "cabinet_count": { + "description": "机架数", + "type": "integer", + "format": "int64", + "x-go-name": "CabinetCount" + }, + "city": { + "description": "所在城市", + "type": "string", + "x-go-name": "City" + }, + "created_at": { + "$ref": "#/definitions/ISOTime" + }, + "creator": { + "description": "创建人", + "type": "string", + "x-go-name": "Creator" + }, + "first_server_room": { + "$ref": "#/definitions/IDCFirstServerRoom" + }, + "id": { + "description": "机房ID", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "idc": { + "$ref": "#/definitions/IDCForServerRoomPage" + }, + "name": { + "description": "机房名", + "type": "string", + "x-go-name": "Name" + }, + "network_asset_manager": { + "description": "网络资产管理人", + "type": "string", + "x-go-name": "NetworkAssetManager" + }, + "server_room_manager": { + "description": "机房管理人", + "type": "string", + "x-go-name": "ServerRoomManager" + }, + "status": { + "description": "机房状态", + "type": "string", + "x-go-name": "Status" + }, + "support_phone_number": { + "description": "支撑电话号码", + "type": "string", + "x-go-name": "SupportPhoneNumber" + }, + "updated_at": { + "$ref": "#/definitions/ISOTime" + }, + "vendor_manager": { + "description": "供应商负责人", + "type": "string", + "x-go-name": "VendorManager" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "ServerRoomSimplify": { + "type": "object", + "properties": { + "id": { + "description": "机房管理单元ID", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "description": "机房管理单元名称", + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "ServerUSiteResp": { + "description": "ServerUSiteResp 机位返回信息体", + "type": "object", + "properties": { + "beginning": { + "description": "起始U数", + "type": "integer", + "format": "uint64", + "x-go-name": "Beginning" + }, + "created_at": { + "description": "创建时间", + "type": "string", + "x-go-name": "CreatedAt" + }, + "creator": { + "description": "状态", + "type": "string", + "x-go-name": "Creator" + }, + "extranet_switches": { + "description": "外网交换机", + "type": "array", + "items": { + "$ref": "#/definitions/SwitchInfo" + }, + "x-go-name": "ExtranetSwitches" + }, + "height": { + "description": "机位(U位)高度", + "type": "integer", + "format": "uint64", + "x-go-name": "Height" + }, + "id": { + "description": "机位(U位)ID。若id=0,则新增。若id\u003e0,则修改。", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "idc": { + "type": "object", + "properties": { + "id": { + "description": "数据中心ID", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "description": "数据中心名称", + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-name": "IDC" + }, + "intranet_switches": { + "description": "内网交换机", + "type": "array", + "items": { + "$ref": "#/definitions/SwitchInfo" + }, + "x-go-name": "IntranetSwitches" + }, + "number": { + "description": "机位(U位)编号", + "type": "string", + "x-go-name": "Number" + }, + "oobnet_switches": { + "description": "管理网交换机", + "type": "array", + "items": { + "$ref": "#/definitions/SwitchInfo" + }, + "x-go-name": "OobnetSwitches" + }, + "physical_area": { + "description": "物理区域", + "type": "string", + "x-go-name": "PhysicalArea" + }, + "remark": { + "description": "备注", + "type": "string", + "x-go-name": "Remark" + }, + "server_cabinet": { + "type": "object", + "properties": { + "id": { + "description": "机架ID", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "number": { + "description": "机架编号", + "type": "string", + "x-go-name": "Number" + } + }, + "x-go-name": "ServerCabinet" + }, + "server_room": { + "type": "object", + "properties": { + "id": { + "description": "机房ID", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "description": "机房名称", + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-name": "ServerRoom" + }, + "status": { + "description": "机位状态\nUSiteStatFree = \"free\" 机位(U位)状态-空闲\nUSiteStatPreOccupied = \"pre_occupied\" 机位(U位)状态-预占用\nUSiteStatUsed = \"used\" 机位(U位)状态-已使用\nUSiteStatDisabled = \"disabled\" 机位(U位)状态-不可用", + "type": "string", + "x-go-name": "Status" + }, + "updated_at": { + "description": "修改时间", + "type": "string", + "x-go-name": "UpdatedAt" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "ServerUSiteSimplify": { + "type": "object", + "properties": { + "id": { + "description": "机位ID", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "number": { + "description": "机位编号", + "type": "string", + "x-go-name": "Number" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "SlotItem": { + "description": "SlotItem PCI插槽", + "type": "object", + "properties": { + "current_usage": { + "type": "string", + "x-go-name": "CurrentUsage" + }, + "designation": { + "type": "string", + "x-go-name": "Designation" + }, + "type": { + "type": "string", + "x-go-name": "Type" + } + }, + "x-go-package": "idcos.com/cloudboot/hardware/collector" + }, + "SwitchDetail": { + "description": "SwitchDetail 交换机详情", + "type": "object", + "properties": { + "fixed_asset_number": { + "description": "资产编号", + "type": "string", + "x-go-name": "FixedAssetNumber" + }, + "name": { + "description": "名称", + "type": "string", + "x-go-name": "Name" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "SwitchInfo": { + "description": "SwitchInfo 交换机信息", + "type": "object", + "properties": { + "name": { + "type": "string", + "x-go-name": "Name" + }, + "port": { + "type": "string", + "x-go-name": "Port" + } + }, + "x-go-package": "idcos.com/cloudboot/model" + }, + "SystemTemplateResp": { + "description": "SystemTemplateResp 系统安装模板", + "type": "object", + "properties": { + "boot_mode": { + "type": "string", + "x-go-name": "BootMode" + }, + "content": { + "type": "string", + "x-go-name": "Content" + }, + "created_at": { + "type": "string", + "x-go-name": "CreatedAt" + }, + "family": { + "type": "string", + "x-go-name": "Family" + }, + "id": { + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + }, + "name": { + "type": "string", + "x-go-name": "Name" + }, + "password": { + "type": "string", + "x-go-name": "Password" + }, + "pxe": { + "type": "string", + "x-go-name": "PXE" + }, + "updated_at": { + "type": "string", + "x-go-name": "UpdatedAt" + }, + "username": { + "type": "string", + "x-go-name": "Username" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "UpdateNetworkAreasStatusReq": { + "description": "UpdateNetworkAreasStatusReq 批量修改网络区域状态API", + "type": "object", + "required": [ + "status", + "ids" + ], + "properties": { + "ids": { + "description": "网络区域ID列表", + "type": "array", + "items": { + "type": "integer", + "format": "uint64" + }, + "x-go-name": "IDs" + }, + "status": { + "description": "状态。状态。nonproduction-未投产; production-已投产; offline-已下线(回收)", + "type": "string", + "enum": [ + "nonproduction", + "production", + "offline" + ], + "x-go-name": "Status" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "UpdateOOBPasswordReq": { + "description": "UpdateOOBPasswordReq 修改带外密码请求体", + "type": "object", + "properties": { + "Remark": { + "description": "备注信息", + "type": "string" + }, + "oob_password_new": { + "description": "带外新密码,置空时且旧密码有效,则修改为一个随机新密码", + "type": "string", + "x-go-name": "PasswordNew" + }, + "oob_password_old": { + "description": "带外原密码,置空时,新密码必须是正确的当前密码,否则修改会失败", + "type": "string", + "x-go-name": "PasswordOld" + }, + "oob_user_name": { + "description": "带外用户名", + "type": "string", + "x-go-name": "Username" + }, + "sn": { + "description": "设备序列号", + "type": "string", + "x-go-name": "SN" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + }, + "UpdateServerUSiteStatusReq": { + "description": "UpdateServerUSiteStatusReq 批量修改机位状态入参结构体", + "type": "object", + "properties": { + "ids": { + "description": "id列表", + "type": "array", + "items": { + "type": "integer", + "format": "uint64" + }, + "x-go-name": "IDs" + }, + "status": { + "description": "状态", + "type": "string", + "x-go-name": "Status" + } + }, + "x-go-package": "idcos.com/cloudboot/server/cloudbootserver/service" + } + }, + "responses": { + "AffectedResp": { + "description": "AffectedResp affected response", + "schema": { + "type": "object", + "properties": { + "content": { + "description": "返回数据信息", + "type": "object", + "properties": { + "affected": { + "type": "integer", + "format": "int64", + "x-go-name": "Affected" + } + }, + "x-go-name": "Content" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/failure", + "type": "string", + "x-go-name": "Status" + } + } + }, + "headers": { + "Body": {} + } + }, + "BaseResp": { + "description": "BaseResp 响应结构", + "schema": { + "type": "object", + "required": [ + "status", + "message" + ], + "properties": { + "message": { + "description": "描述", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "CommonPageResp": { + "description": "CommonPageResp Common page response", + "schema": { + "$ref": "#/definitions/Page" + }, + "headers": { + "Body": {} + } + }, + "DataDictResp": { + "description": "DataDictResp 数据字典返回体", + "schema": { + "type": "object", + "properties": { + "content": { + "$ref": "#/definitions/DataDict" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/failure", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "DeviceCombinedResp": { + "description": "DeviceCombinedResp 物理机开电状态", + "schema": { + "type": "object", + "properties": { + "content": { + "$ref": "#/definitions/CombinedDevice" + }, + "message": { + "type": "string", + "x-go-name": "Message" + }, + "status": { + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "DeviceInstallStaticCountResp": { + "description": "DeviceInstallStaticCountResp 装机信息统计", + "schema": { + "type": "object", + "properties": { + "content": { + "$ref": "#/definitions/DeviceInstallStaticCountResp" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/failure", + "type": "string", + "x-go-name": "Status" + } + } + }, + "headers": { + "Body": {} + } + }, + "DeviceLogResp": { + "description": "DeviceLogResp 装机日志返回", + "schema": { + "type": "object", + "properties": { + "content": { + "$ref": "#/definitions/DeviceLogResp" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/failure", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "DevicePageResp": { + "description": "DevicePageResp 物理机分页列表的返回体", + "schema": { + "type": "object", + "properties": { + "content": { + "description": "返回数据信息", + "type": "object", + "properties": { + "page": { + "description": "页号", + "type": "integer", + "format": "int64", + "x-go-name": "Page" + }, + "page_size": { + "description": "页大小", + "type": "integer", + "format": "int64", + "x-go-name": "PageSize" + }, + "records": { + "description": "记录", + "type": "array", + "items": { + "$ref": "#/definitions/DevicePageResp" + }, + "x-go-name": "Records" + }, + "total_page": { + "description": "实际页数", + "type": "integer", + "format": "int64", + "x-go-name": "TotalPage" + }, + "total_records": { + "description": "实际数量", + "type": "integer", + "format": "int64", + "x-go-name": "TotalRecords" + } + }, + "x-go-name": "Content" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/failure", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "DeviceResp": { + "description": "DeviceResp 物理机采集信息的返回体", + "schema": { + "type": "object", + "properties": { + "content": { + "$ref": "#/definitions/Device" + }, + "message": { + "type": "string", + "x-go-name": "Message" + }, + "status": { + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "DeviceSettingPageResp": { + "description": "DeviceSettingPageResp 设备参数分页返回值", + "schema": { + "type": "object", + "properties": { + "content": { + "description": "返回数据信息", + "type": "object", + "properties": { + "page": { + "description": "页号", + "type": "integer", + "format": "int64", + "x-go-name": "Page" + }, + "page_size": { + "description": "页大小", + "type": "integer", + "format": "int64", + "x-go-name": "PageSize" + }, + "records": { + "description": "记录", + "type": "array", + "items": { + "$ref": "#/definitions/DeviceSettingResp" + }, + "x-go-name": "Records" + }, + "total_page": { + "description": "实际页数", + "type": "integer", + "format": "int64", + "x-go-name": "TotalPage" + }, + "total_records": { + "description": "实际数量", + "type": "integer", + "format": "int64", + "x-go-name": "TotalRecords" + } + }, + "x-go-name": "Content" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/failure", + "type": "string", + "x-go-name": "Status" + } + } + }, + "headers": { + "Body": {} + } + }, + "DeviceStatusResp": { + "description": "DeviceStatusResp 物理机采集信息的返回体", + "schema": { + "type": "object", + "properties": { + "content": { + "type": "object", + "properties": { + "power_status": { + "type": "string", + "x-go-name": "PowerStatus" + } + }, + "x-go-name": "Content" + }, + "message": { + "type": "string", + "x-go-name": "Message" + }, + "status": { + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "FileNameResp": { + "description": "FileNameResp FileNameResp", + "schema": { + "type": "object", + "properties": { + "content": { + "description": "返回数据信息", + "type": "object", + "properties": { + "result": { + "type": "string", + "x-go-name": "Result" + } + }, + "x-go-name": "Content" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/failure", + "type": "string", + "x-go-name": "Status" + } + } + }, + "headers": { + "Body": {} + } + }, + "GetIPNetworkByID": { + "description": "GetIPNetworkByID 网段的返回体", + "schema": { + "type": "object", + "properties": { + "content": { + "$ref": "#/definitions/IPNetworkPage" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/fail", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "GetIPNetworkPageResp": { + "description": "GetIPNetworkPageResp 网段分页查询的返回体", + "schema": { + "type": "object", + "properties": { + "content": { + "description": "返回数据信息", + "type": "object", + "properties": { + "page": { + "description": "页号", + "type": "integer", + "format": "int64", + "x-go-name": "Page" + }, + "page_size": { + "description": "页大小", + "type": "integer", + "format": "int64", + "x-go-name": "PageSize" + }, + "records": { + "description": "记录", + "type": "array", + "items": { + "$ref": "#/definitions/IPNetworkPage" + }, + "x-go-name": "Records" + }, + "total_page": { + "description": "实际页数", + "type": "integer", + "format": "int64", + "x-go-name": "TotalPage" + }, + "total_records": { + "description": "实际数量", + "type": "integer", + "format": "int64", + "x-go-name": "TotalRecords" + } + }, + "x-go-name": "Content" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/fail", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "GetIPSPageResp": { + "description": "GetIPSPageResp IP列表分页查询的返回体", + "schema": { + "type": "object", + "properties": { + "content": { + "description": "返回数据信息", + "type": "object", + "properties": { + "page": { + "description": "页号", + "type": "integer", + "format": "int64", + "x-go-name": "Page" + }, + "page_size": { + "description": "页大小", + "type": "integer", + "format": "int64", + "x-go-name": "PageSize" + }, + "records": { + "description": "记录", + "type": "array", + "items": { + "$ref": "#/definitions/IPSPage" + }, + "x-go-name": "Records" + }, + "total_page": { + "description": "实际页数", + "type": "integer", + "format": "int64", + "x-go-name": "TotalPage" + }, + "total_records": { + "description": "实际数量", + "type": "integer", + "format": "int64", + "x-go-name": "TotalRecords" + } + }, + "x-go-name": "Content" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/fail", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "GetInspectionBySNResp": { + "description": "GetInspectionBySNResp 巡检查询明细的返回体", + "schema": { + "type": "object", + "properties": { + "content": { + "description": "返回数据信息", + "type": "object", + "properties": { + "created_at": { + "$ref": "#/definitions/ISOTime" + }, + "end_time": { + "$ref": "#/definitions/ISOTime" + }, + "error": { + "description": "错误信息", + "type": "array", + "items": { + "$ref": "#/definitions/SensorData" + }, + "x-go-name": "Error" + }, + "id": { + "description": "索引", + "type": "integer", + "format": "int64", + "x-go-name": "ID" + }, + "job_id": { + "description": "任务ID", + "type": "integer", + "format": "int64", + "x-go-name": "JobID" + }, + "result": { + "description": "巡检结果", + "type": "array", + "items": { + "$ref": "#/definitions/SensorData" + }, + "x-go-name": "Result" + }, + "running_status": { + "description": "运行状态", + "type": "string", + "x-go-name": "RunningStatus" + }, + "start_time": { + "$ref": "#/definitions/ISOTime" + }, + "updated_at": { + "$ref": "#/definitions/ISOTime" + } + }, + "x-go-name": "Content" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/fail", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "GetInspectionStartTimesBySNResp": { + "description": "GetInspectionStartTimesBySNResp 巡检分页查询的返回体", + "schema": { + "type": "object", + "properties": { + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "start_time": { + "description": "返回数据信息", + "type": "array", + "items": { + "type": "string" + }, + "x-go-name": "StartTime" + }, + "status": { + "description": "状态, success/fail", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "GetNetworkAreaByIDResp": { + "description": "GetNetworkAreaByIDResp 查询指定网络区域响应结构", + "schema": { + "type": "object", + "required": [ + "status", + "message", + "content" + ], + "properties": { + "content": { + "$ref": "#/definitions/NetworkArea" + }, + "message": { + "description": "描述", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "GetNetworkAreaPageResp": { + "description": "GetNetworkAreaPageResp 网络区域分页结构", + "schema": { + "type": "object", + "required": [ + "status", + "message", + "content" + ], + "properties": { + "content": { + "description": "内容", + "type": "object", + "properties": { + "page": { + "description": "页号", + "type": "integer", + "format": "int64", + "x-go-name": "Page" + }, + "page_size": { + "description": "页大小", + "type": "integer", + "format": "int64", + "x-go-name": "PageSize" + }, + "records": { + "description": "记录", + "type": "array", + "items": { + "$ref": "#/definitions/NetworkArea" + }, + "x-go-name": "Records" + }, + "total_page": { + "description": "实际页数", + "type": "integer", + "format": "int64", + "x-go-name": "TotalPage" + }, + "total_records": { + "description": "实际数量", + "type": "integer", + "format": "int64", + "x-go-name": "TotalRecords" + } + }, + "x-go-name": "Content" + }, + "message": { + "description": "描述", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "GetNetworkSettingBySNResp": { + "description": "GetNetworkSettingBySNResp 根据sn查询装机参数返回体", + "schema": { + "type": "object", + "properties": { + "content": { + "$ref": "#/definitions/GetNetworkSettingBySNResp" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/failure", + "type": "string", + "x-go-name": "Status" + } + } + }, + "headers": { + "Body": {} + } + }, + "GetServerCabinetByID": { + "description": "GetServerCabinetByID 机架的返回体", + "schema": { + "type": "object", + "properties": { + "content": { + "$ref": "#/definitions/ServerCabinet" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/failure", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "GetServerCabinetPageResp": { + "description": "GetServerCabinetPageResp 机架分页查询的返回体", + "schema": { + "type": "object", + "properties": { + "content": { + "description": "返回数据信息", + "type": "object", + "properties": { + "page": { + "description": "页号", + "type": "integer", + "format": "int64", + "x-go-name": "Page" + }, + "page_size": { + "description": "页大小", + "type": "integer", + "format": "int64", + "x-go-name": "PageSize" + }, + "records": { + "description": "记录", + "type": "array", + "items": { + "$ref": "#/definitions/ServerCabinet" + }, + "x-go-name": "Records" + }, + "total_page": { + "description": "实际页数", + "type": "integer", + "format": "int64", + "x-go-name": "TotalPage" + }, + "total_records": { + "description": "实际数量", + "type": "integer", + "format": "int64", + "x-go-name": "TotalRecords" + } + }, + "x-go-name": "Content" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/failure", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "GetServerRoomByID": { + "description": "GetServerRoomByID 机房的返回体", + "schema": { + "type": "object", + "properties": { + "content": { + "$ref": "#/definitions/ServerRoom" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/fail", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "GetServerRoomPageResp": { + "description": "GetServerRoomPageResp 机房分页查询的返回体", + "schema": { + "type": "object", + "properties": { + "content": { + "description": "返回数据信息", + "type": "object", + "properties": { + "page": { + "description": "页号", + "type": "integer", + "format": "int64", + "x-go-name": "Page" + }, + "page_size": { + "description": "页大小", + "type": "integer", + "format": "int64", + "x-go-name": "PageSize" + }, + "records": { + "description": "记录", + "type": "array", + "items": { + "$ref": "#/definitions/ServerRoom" + }, + "x-go-name": "Records" + }, + "total_page": { + "description": "实际页数", + "type": "integer", + "format": "int64", + "x-go-name": "TotalPage" + }, + "total_records": { + "description": "实际数量", + "type": "integer", + "format": "int64", + "x-go-name": "TotalRecords" + } + }, + "x-go-name": "Content" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/fail", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "HardwareTemplatePageResp": { + "description": "HardwareTemplatePageResp 设备参数分页返回值", + "schema": { + "type": "object", + "properties": { + "content": { + "description": "返回数据信息", + "type": "object", + "properties": { + "page": { + "description": "页号", + "type": "integer", + "format": "int64", + "x-go-name": "Page" + }, + "page_size": { + "description": "页大小", + "type": "integer", + "format": "int64", + "x-go-name": "PageSize" + }, + "records": { + "description": "记录", + "type": "array", + "items": { + "$ref": "#/definitions/HardwareTplResp" + }, + "x-go-name": "Records" + }, + "total_page": { + "description": "实际页数", + "type": "integer", + "format": "int64", + "x-go-name": "TotalPage" + }, + "total_records": { + "description": "实际数量", + "type": "integer", + "format": "int64", + "x-go-name": "TotalRecords" + } + }, + "x-go-name": "Content" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/failure", + "type": "string", + "x-go-name": "Status" + } + } + }, + "headers": { + "Body": {} + } + }, + "HardwareTemplateResp": { + "description": "HardwareTemplateResp 硬件模板返回值", + "schema": { + "type": "object", + "properties": { + "Content": { + "$ref": "#/definitions/HardwareTemplateResp" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/failure", + "type": "string", + "x-go-name": "Status" + } + } + }, + "headers": { + "content": {} + } + }, + "IDCPageResp": { + "description": "IDCPageResp 数据中心分页的返回体", + "schema": { + "type": "object", + "properties": { + "content": { + "description": "返回数据信息", + "type": "object", + "properties": { + "page": { + "description": "页号", + "type": "integer", + "format": "int64", + "x-go-name": "Page" + }, + "page_size": { + "description": "页大小", + "type": "integer", + "format": "int64", + "x-go-name": "PageSize" + }, + "records": { + "description": "记录", + "type": "array", + "items": { + "$ref": "#/definitions/IDCResp" + }, + "x-go-name": "Records" + }, + "total_page": { + "description": "实际页数", + "type": "integer", + "format": "int64", + "x-go-name": "TotalPage" + }, + "total_records": { + "description": "实际数量", + "type": "integer", + "format": "int64", + "x-go-name": "TotalRecords" + } + }, + "x-go-name": "Content" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/failure", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "IDCResp": { + "description": "IDCResp 数据中心详情的返回体", + "schema": { + "type": "object", + "properties": { + "content": { + "$ref": "#/definitions/IDCResp" + }, + "message": { + "type": "string", + "x-go-name": "Message" + }, + "status": { + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "IDResp": { + "description": "IDResp 响应结构", + "schema": { + "type": "object", + "properties": { + "content": { + "description": "内容", + "type": "object", + "properties": { + "id": { + "description": "主键ID", + "type": "integer", + "format": "uint64", + "x-go-name": "ID" + } + }, + "x-go-name": "Content" + }, + "message": { + "description": "描述", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态", + "type": "string", + "enum": [ + "success", + "failure" + ], + "x-go-name": "Status" + } + } + } + }, + "ImageTemplatePageResp": { + "description": "ImageTemplatePageResp 机位的返回体", + "schema": { + "type": "object", + "properties": { + "content": { + "description": "返回数据信息", + "type": "object", + "properties": { + "page": { + "description": "页号", + "type": "integer", + "format": "int64", + "x-go-name": "Page" + }, + "page_size": { + "description": "页大小", + "type": "integer", + "format": "int64", + "x-go-name": "PageSize" + }, + "records": { + "description": "记录", + "type": "array", + "items": { + "$ref": "#/definitions/ImageTemplateResp" + }, + "x-go-name": "Records" + }, + "total_page": { + "description": "实际页数", + "type": "integer", + "format": "int64", + "x-go-name": "TotalPage" + }, + "total_records": { + "description": "实际数量", + "type": "integer", + "format": "int64", + "x-go-name": "TotalRecords" + } + }, + "x-go-name": "Content" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/failure", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "ImageTemplateResp": { + "description": "ImageTemplateResp 镜像模板返回体", + "schema": { + "type": "object", + "properties": { + "content": { + "description": "返回数据信息", + "type": "array", + "items": { + "$ref": "#/definitions/ImageTemplateResp" + }, + "x-go-name": "Content" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/fail", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "ImportPreviewResp": { + "description": "ImportPreviewResp ImportPreviewResp", + "schema": { + "type": "object", + "properties": { + "content": { + "description": "返回数据信息", + "type": "object", + "properties": { + "result": { + "type": "array", + "items": { + "type": "object" + }, + "x-go-name": "Result" + } + }, + "x-go-name": "Content" + }, + "import_status": { + "description": "导入结果统计", + "type": "string", + "x-go-name": "ImportStatus" + }, + "message": { + "description": "操作成功/失败信息", + "type": "string", + "x-go-name": "Message" + }, + "record_count": { + "description": "记录统计", + "type": "string", + "x-go-name": "RecordCount" + }, + "status": { + "description": "状态, success/failure/error", + "type": "string", + "x-go-name": "Status" + } + } + }, + "headers": { + "Body": {} + } + }, + "InspectionFullWithPageResp": { + "description": "InspectionFullWithPageResp 巡检分页查询的返回体", + "schema": { + "type": "object", + "properties": { + "content": { + "description": "返回数据信息", + "type": "object", + "properties": { + "page": { + "description": "页号", + "type": "integer", + "format": "int64", + "x-go-name": "Page" + }, + "page_size": { + "description": "页大小", + "type": "integer", + "format": "int64", + "x-go-name": "PageSize" + }, + "records": { + "description": "记录", + "type": "array", + "items": { + "$ref": "#/definitions/InspectionFullWithPage" + }, + "x-go-name": "Records" + }, + "total_page": { + "description": "实际页数", + "type": "integer", + "format": "int64", + "x-go-name": "TotalPage" + }, + "total_records": { + "description": "实际数量", + "type": "integer", + "format": "int64", + "x-go-name": "TotalRecords" + } + }, + "x-go-name": "Content" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/fail", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "InspectionStatisticsResp": { + "description": "InspectionStatisticsResp 机房分页查询的返回体", + "schema": { + "type": "object", + "properties": { + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "statistics": { + "$ref": "#/definitions/InspectionStatistics" + }, + "status": { + "description": "状态, success/fail", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "NetworkDeviceSaveResp": { + "description": "NetworkDeviceSaveResp 网络设备保存结构返回体", + "schema": { + "type": "object", + "properties": { + "content": { + "description": "返回数据信息", + "type": "object", + "properties": { + "fixed_asset_number": { + "type": "string", + "x-go-name": "FixedAssetNumber" + } + }, + "x-go-name": "Content" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/failure", + "type": "string", + "x-go-name": "Status" + } + } + }, + "headers": { + "Body": {} + } + }, + "NetworkDevideResp": { + "description": "NetworkDevideResp 网络设备分页返回体", + "schema": { + "type": "object", + "properties": { + "Records": { + "description": "记录", + "type": "array", + "items": { + "$ref": "#/definitions/NetworkDeviceResp" + } + }, + "page": { + "description": "页号", + "type": "integer", + "format": "int64", + "x-go-name": "Page" + }, + "page_size": { + "description": "页大小", + "type": "integer", + "format": "int64", + "x-go-name": "PageSize" + }, + "total_page": { + "description": "实际页数", + "type": "integer", + "format": "int64", + "x-go-name": "TotalPage" + }, + "total_records": { + "description": "实际数量", + "type": "integer", + "format": "int64", + "x-go-name": "TotalRecords" + } + } + }, + "headers": { + "Body": {} + } + }, + "OOBPowerBatchOperateResp": { + "description": "OOBPowerBatchOperateResp 带外管理批量操作返回值", + "schema": { + "type": "object", + "properties": { + "content": { + "description": "返回数据信息", + "type": "object", + "properties": { + "output": { + "type": "string", + "x-go-name": "Output" + } + }, + "x-go-name": "Content" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/failure", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "OOBUserResp": { + "description": "OOBUserResp 带外密码查询返回值", + "schema": { + "type": "object", + "properties": { + "content": { + "$ref": "#/definitions/OOBInfo" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/failure", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "OperatePageResp": { + "description": "OperatePageResp 操作记录分页的返回体", + "schema": { + "type": "object", + "properties": { + "content": { + "description": "返回数据信息", + "type": "object", + "properties": { + "page": { + "description": "页号", + "type": "integer", + "format": "int64", + "x-go-name": "Page" + }, + "page_size": { + "description": "页大小", + "type": "integer", + "format": "int64", + "x-go-name": "PageSize" + }, + "records": { + "description": "记录", + "type": "array", + "items": { + "$ref": "#/definitions/OperateLog" + }, + "x-go-name": "Records" + }, + "total_page": { + "description": "实际页数", + "type": "integer", + "format": "int64", + "x-go-name": "TotalPage" + }, + "total_records": { + "description": "实际数量", + "type": "integer", + "format": "int64", + "x-go-name": "TotalRecords" + } + }, + "x-go-name": "Content" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/failure", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "OperateResp": { + "description": "OperateResp 操作记录详情的返回体", + "schema": { + "type": "object", + "properties": { + "content": { + "$ref": "#/definitions/OperateLog" + }, + "message": { + "type": "string", + "x-go-name": "Message" + }, + "status": { + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "OsTemplateResp": { + "description": "OsTemplateResp 装机模板返回体", + "schema": { + "type": "object", + "properties": { + "content": { + "description": "返回数据信息", + "type": "array", + "items": { + "$ref": "#/definitions/OsTemplateResp" + }, + "x-go-name": "Content" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/fail", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "RespFor400": { + "description": "RespFor400 not 200 response", + "headers": { + "Error": { + "type": "string", + "description": "接口信息不存在错误" + } + } + }, + "RespFor401": { + "description": "RespFor401 not 200 response", + "schema": { + "type": "object", + "properties": { + "content": { + "description": "返回数据信息", + "type": "object", + "properties": { + "Error": { + "description": "认证信息失败错误", + "type": "string" + } + }, + "x-go-name": "Content" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/failure", + "type": "string", + "x-go-name": "Status" + } + } + }, + "headers": { + "Body": {} + } + }, + "RespFor500": { + "description": "RespFor500 not 200 response", + "schema": { + "type": "object", + "properties": { + "content": { + "description": "返回数据信息", + "type": "object", + "properties": { + "Error": { + "description": "服务器内部错误", + "type": "string" + } + }, + "x-go-name": "Content" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/failure", + "type": "string", + "x-go-name": "Status" + } + } + }, + "headers": { + "Body": {} + } + }, + "ServerUSitePageResp": { + "description": "ServerUSitePageResp 机位的返回体", + "schema": { + "type": "object", + "properties": { + "content": { + "description": "返回数据信息", + "type": "object", + "properties": { + "page": { + "description": "页号", + "type": "integer", + "format": "int64", + "x-go-name": "Page" + }, + "page_size": { + "description": "页大小", + "type": "integer", + "format": "int64", + "x-go-name": "PageSize" + }, + "records": { + "description": "记录", + "type": "array", + "items": { + "$ref": "#/definitions/ServerUSiteResp" + }, + "x-go-name": "Records" + }, + "total_page": { + "description": "实际页数", + "type": "integer", + "format": "int64", + "x-go-name": "TotalPage" + }, + "total_records": { + "description": "实际数量", + "type": "integer", + "format": "int64", + "x-go-name": "TotalRecords" + } + }, + "x-go-name": "Content" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/failure", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "ServerUSiteResp": { + "description": "ServerUSiteResp 机位的返回体", + "schema": { + "type": "object", + "properties": { + "content": { + "$ref": "#/definitions/ServerUSiteResp" + }, + "message": { + "type": "string", + "x-go-name": "Message" + }, + "status": { + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "SystemTemplatePageResp": { + "description": "SystemTemplatePageResp 机位的返回体", + "schema": { + "type": "object", + "properties": { + "content": { + "description": "返回数据信息", + "type": "object", + "properties": { + "page": { + "description": "页号", + "type": "integer", + "format": "int64", + "x-go-name": "Page" + }, + "page_size": { + "description": "页大小", + "type": "integer", + "format": "int64", + "x-go-name": "PageSize" + }, + "records": { + "description": "记录", + "type": "array", + "items": { + "$ref": "#/definitions/SystemTemplateResp" + }, + "x-go-name": "Records" + }, + "total_page": { + "description": "实际页数", + "type": "integer", + "format": "int64", + "x-go-name": "TotalPage" + }, + "total_records": { + "description": "实际数量", + "type": "integer", + "format": "int64", + "x-go-name": "TotalRecords" + } + }, + "x-go-name": "Content" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/failure", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "SystemTemplateResp": { + "description": "SystemTemplateResp 系统模板返回体", + "schema": { + "type": "object", + "properties": { + "content": { + "description": "返回数据信息", + "type": "array", + "items": { + "$ref": "#/definitions/SystemTemplateResp" + }, + "x-go-name": "Content" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/fail", + "type": "string", + "x-go-name": "Status" + } + } + } + }, + "UpdateIDCStatusResp": { + "description": "UpdateIDCStatusResp 更新数据中心返回结构", + "schema": { + "type": "object", + "properties": { + "content": { + "description": "返回数据信息", + "type": "object", + "properties": { + "ids": { + "type": "array", + "items": { + "type": "integer", + "format": "int64" + }, + "x-go-name": "IDs" + } + }, + "x-go-name": "Content" + }, + "message": { + "description": "返回值信息,error或者成功信息", + "type": "string", + "x-go-name": "Message" + }, + "status": { + "description": "状态, success/failure", + "type": "string", + "x-go-name": "Status" + } + } + }, + "headers": { + "Body": {} + } + } + } +} \ No newline at end of file diff --git a/cyclone-server/doc/conf/authorization.json b/cyclone-server/doc/conf/authorization.json new file mode 100644 index 0000000000000000000000000000000000000000..3b8c7d63c94af0d99a37312d9010dd03a5bc14fc --- /dev/null +++ b/cyclone-server/doc/conf/authorization.json @@ -0,0 +1,1573 @@ +[ + { + "api": { + "desc": "查看数据中心", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/idcs$" + }, + "codes": [ + "menu_idc", + "menu_idc_management" + ] + }, + { + "api": { + "desc": "新增数据中心", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/idcs$" + }, + "codes": [ + "button_idc_create" + ] + }, + { + "api": { + "desc": "修改数据中心", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/idcs/[0-9A-Za-z_]+$" + }, + "codes": [ + "button_idc_update" + ] + }, + { + "api": { + "desc": "修改数据中心状态", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/idcs/status$" + }, + "codes": [ + "button_idc_accepted", + "button_idc_abolished", + "button_idc_production" + ] + }, + { + "api": { + "desc": "删除数据中心", + "method": "DELETE", + "uri_regexp": "^/api/cloudboot/v1/idcs/[0-9A-Za-z_]+$" + }, + "codes": [ + "button_idc_delete" + ] + }, + { + "api": { + "desc": "查看机房", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/server-rooms$" + }, + "codes": [ + "menu_server_room" + ] + }, + { + "api": { + "desc": "新增机房", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/server-rooms$" + }, + "codes": [ + "button_server_room_create" + ] + }, + { + "api": { + "desc": "修改机房", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/server-rooms$" + }, + "codes": [ + "button_server_room_update" + ] + }, + { + "api": { + "desc": "修改机房状态", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/server-rooms/status$" + }, + "codes": [ + "button_server_room_production", + "button_server_room_abolished", + "button_server_room_accepted" + ] + }, + { + "api": { + "desc": "删除机房", + "method": "DELETE", + "uri_regexp": "^/api/cloudboot/v1/server-rooms/[0-9A-Za-z_]+$" + }, + "codes": [ + "button_server_room_delete" + ] + }, + { + "api": { + "desc": "加载导入机房文件", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/server-rooms/upload$" + }, + "codes": [ + "button_server_room_import" + ] + }, + { + "api": { + "desc": "导入机房文件预览", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/server-rooms/imports/previews$" + }, + "codes": [ + "button_server_room_import" + ] + }, + { + "api": { + "desc": "导入机房文件", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/server-rooms/imports$" + }, + "codes": [ + "button_server_room_import" + ] + }, + { + "api": { + "desc": "查看网络区域", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/network-areas$" + }, + "codes": [ + "menu_network_area" + ] + }, + { + "api": { + "desc": "新增网络区域", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/network-areas$" + }, + "codes": [ + "button_network_area_create" + ] + }, + { + "api": { + "desc": "修改网络区域", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/network-areas$" + }, + "codes": [ + "button_network_area_update" + ] + }, + { + "api": { + "desc": "修改网络区域状态", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/network-areas/status$" + }, + "codes": [ + "button_network_area_production", + "button_network_area_offline" + ] + }, + { + "api": { + "desc": "删除网络区域", + "method": "DELETE", + "uri_regexp": "^/api/cloudboot/v1/network-areas/[0-9A-Za-z_]+$" + }, + "codes": [ + "button_network_area_delete" + ] + }, + { + "api": { + "desc": "加载导入导入网络区域文件", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/network-areas/upload$" + }, + "codes": [ + "button_network_area_import" + ] + }, + { + "api": { + "desc": "导入网络区域文件预览", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/network-areas/imports/previews$" + }, + "codes": [ + "button_network_area_import" + ] + }, + { + "api": { + "desc": "导入网络区域文件", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/network-areas/imports$" + }, + "codes": [ + "button_network_area_import" + ] + }, + { + "api": { + "desc": "查看机架(柜)", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/server-cabinets$" + }, + "codes": [ + "menu_server_cabinet" + ] + }, + { + "api": { + "desc": "新增机架(柜)", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/server-cabinets$" + }, + "codes": [ + "button_server_cabinet_create" + ] + }, + { + "api": { + "desc": "修改机架(柜)", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/server-cabinets$" + }, + "codes": [ + "button_server_cabinet_update" + ] + }, + { + "api": { + "desc": "修改机架(柜)状态", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/server-cabinets/status$" + }, + "codes": [ + "button_server_cabinet_powerOn", + "button_server_cabinet_powerOff", + "button_server_cabinet_offline", + "button_server_cabinet_enabled" + ] + }, + { + "api": { + "desc": "删除机架(柜)", + "method": "DELETE", + "uri_regexp": "^/api/cloudboot/v1/server-cabinets/[0-9A-Za-z_]+$" + }, + "codes": [ + "button_server_cabinet_delete" + ] + }, + { + "api": { + "desc": "机架开电", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/server-cabinets/[0-9A-Za-z_]+/power$" + }, + "codes": [ + "button_server_cabinet_powerOn" + ] + }, + { + "api": { + "desc": "机架关电", + "method": "DELETE", + "uri_regexp": "^/api/cloudboot/v1/server-cabinets/[0-9A-Za-z_]+/power$" + }, + "codes": [ + "button_server_cabinet_powerOff" + ] + }, + { + "api": { + "desc": "加载导入机架(柜)文件", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/server-cabinets/upload$" + }, + "codes": [ + "button_server_cabinet_import" + ] + }, + { + "api": { + "desc": "导入机架(柜)文件预览", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/server-cabinets/imports/previews$" + }, + "codes": [ + "button_server_cabinet_import" + ] + }, + { + "api": { + "desc": "导入机架(柜)文件", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/server-cabinets/imports$" + }, + "codes": [ + "button_server_cabinet_import" + ] + }, + { + "api": { + "desc": "查看机位(U位)", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/server-usites$" + }, + "codes": [ + "menu_server_usite" + ] + }, + { + "api": { + "desc": "新增机位(U位)", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/server-usites$" + }, + "codes": [ + "button_server_usite_create" + ] + }, + { + "api": { + "desc": "修改机位(U位)", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/server-usites$" + }, + "codes": [ + "button_server_usite_update" + ] + }, + { + "api": { + "desc": "删除机位(U位)", + "method": "DELETE", + "uri_regexp": "^/api/cloudboot/v1/server-usites/[0-9A-Za-z_]+$" + }, + "codes": [ + "button_server_usite_delete" + ] + }, + { + "api": { + "desc": "删除机位(U位)端口号", + "method": "DELETE", + "uri_regexp": "^/api/cloudboot/v1/server-usites/[0-9A-Za-z_]+/ports$" + }, + "codes": [ + "button_server_usite_delete_port" + ] + }, + { + "api": { + "desc": "修改机位(U位)状态", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/server-usites/status$" + }, + "codes": [ + "button_server_usite_status" + ] + }, + { + "api": { + "desc": "加载导入机位(U位)文件", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/server-usites/upload$" + }, + "codes": [ + "button_server_usite_import" + ] + }, + { + "api": { + "desc": "导入机位(U位)文件预览", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/server-usites/imports/previews$" + }, + "codes": [ + "button_server_usite_import" + ] + }, + { + "api": { + "desc": "导入机位(U位)文件", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/server-usites/imports$" + }, + "codes": [ + "button_server_usite_import" + ] + }, + { + "api": { + "desc": "加载导入机位(U位)端口号文件", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/server-usites/ports/upload$" + }, + "codes": [ + "button_server_usite_import_port" + ] + }, + { + "api": { + "desc": "导入机位(U位)端口号文件预览", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/server-usites/ports/imports/previews$" + }, + "codes": [ + "button_server_usite_import_port" + ] + }, + { + "api": { + "desc": "导入机位(U位)端口号文件", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/server-usites/ports/imports$" + }, + "codes": [ + "button_server_usite_import_port" + ] + }, + { + "api": { + "desc": "查看库房管理单元", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/store-rooms$" + }, + "codes": [ + "menu_store_room" + ] + }, + { + "api": { + "desc": "查看库房管理单元明细", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/store-room/[0-9A-Za-z_]+$" + }, + "codes": [ + "menu_store_room" + ] + }, + { + "api": { + "desc": "新增库房管理单元", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/store-room$" + }, + "codes": [ + "button_store_room_create" + ] + }, + { + "api": { + "desc": "上传导入库房管理单元文件", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/store-room/upload$" + }, + "codes": [ + "button_store_room_import" + ] + }, + { + "api": { + "desc": "导入库房管理单元文件预览", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/store-room/imports/previews$" + }, + "codes": [ + "button_store_room_import" + ] + }, + { + "api": { + "desc": "导入库房管理单元", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/store-room/imports$" + }, + "codes": [ + "button_store_room_import" + ] + }, + { + "api": { + "desc": "删除库房管理单元", + "method": "DELETE", + "uri_regexp": "^/api/cloudboot/v1/store-room/[0-9]+$" + }, + "codes": [ + "button_store_room_delete" + ] + }, + { + "api": { + "desc": "修改库房管理单元", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/store-room$" + }, + "codes": [ + "button_store_room_update" + ] + }, + { + "api": { + "desc": "新增虚拟货架", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/virtual-cabinet$" + }, + "codes": [ + "button_virtual_cabinet_create" + ] + }, + { + "api": { + "desc": "删除虚拟货架", + "method": "DELETE", + "uri_regexp": "^/api/cloudboot/v1/virtual-cabinet/[0-9]+$" + }, + "codes": [ + "button_virtual_cabinet_delete" + ] + }, + { + "api": { + "desc": "新增带外管理", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/devices/power$" + }, + "codes": [ + "button_physical_machine_powerOn", + "button_predeploy_physical_machine_powerOn" + ] + }, + { + "api": { + "desc": "带外管理批量PXE重启", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/devices/power/pxe/restart$" + }, + "codes": [ + "button_physical_machine_networkBoot", + "button_predeploy_physical_machine_networkBoot" + ] + }, + { + "api": { + "desc": "带外管理批量重启", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/devices/power/restart$" + }, + "codes": [ + "button_physical_machine_reBoot", + "button_predeploy_physical_machine_reBoot" + ] + }, + { + "api": { + "desc": "带外管理批量关机", + "method": "DELETE", + "uri_regexp": "^/api/cloudboot/v1/devices/power$" + }, + "codes": [ + "button_physical_machine_powerOff", + "button_predeploy_physical_machine_powerOff" + ] + }, + { + "api": { + "desc": "修改带外用户密码", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/devices/[0-9A-Za-z_]+/oob/password$" + }, + "codes": [ + "button_physical_machine_update_oob" + ] + }, + { + "api": { + "desc": "新增物理机", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/devices/[0-9A-Za-z_]+/collections$" + }, + "codes": [] + }, + { + "api": { + "desc": "加载导入物理机文件", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/devices/upload$" + }, + "codes": [ + "button_predeploy_physical_machine_import" + ] + }, + { + "api": { + "desc": "导入物理机文件预览", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/devices/imports/previews$" + }, + "codes": [ + "button_predeploy_physical_machine_import" + ] + }, + { + "api": { + "desc": "加入物理机文件", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/devices/imports$" + }, + "codes": [ + "button_predeploy_physical_machine_import" + ] + }, + { + "api": { + "desc": "查看物理机", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/devices$" + }, + "codes": [ + "menu_physical_machine" + ] + }, + { + "api": { + "desc": "修改物理机", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/device$" + }, + "codes": [ + "button_physical_machine_update" + ] + }, + { + "api": { + "desc": "存量物理机导入", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/devices/stock/upload$" + }, + "codes": [ + "button_physical_machine_import" + ] + }, + { + "api": { + "desc": "存量物理机导入预览", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/devices/stock/imports/previews$" + }, + "codes": [ + "button_physical_machine_import" + ] + }, + { + "api": { + "desc": "加载存量物理机导入文件", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/devices/stock//imports$" + }, + "codes": [ + "button_physical_machine_import" + ] + }, + { + "api": { + "desc": "上传物理机导入到库房文件", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/devices/store/upload$" + }, + "codes": [ + "button_device_store_import" + ] + }, + { + "api": { + "desc": "物理机导入到库房预览", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/devices/store/imports/previews$" + }, + "codes": [ + "button_device_store_import" + ] + }, + { + "api": { + "desc": "物理机导入到库房", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/devices/store/imports$" + }, + "codes": [ + "button_device_store_import" + ] + }, + { + "api": { + "desc": "重新批量纳管带外", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/devices/oob/re-access$" + }, + "codes": [ + "button_oob_re_access" + ] + }, + { + "api": { + "desc": "上传特殊设备文件", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/special-devices/upload$" + }, + "codes": [ + "button_special_device_import" + ] + }, + { + "api": { + "desc": "特殊设备预览", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/special-devices/imports/previews$" + }, + "codes": [ + "button_special_device_import" + ] + }, + { + "api": { + "desc": "导入特殊设备", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/special-devices/imports$" + }, + "codes": [ + "button_special_device_import" + ] + }, + { + "api": { + "desc": "删除物理机", + "method": "DELETE", + "uri_regexp": "^/api/cloudboot/v1/devices/[0-9A-Za-z_]+$" + }, + "codes": [ + "button_physical_machine_delete", + "button_predeploy_physical_machine_delete" + ] + }, + { + "api": { + "desc": "查看订单", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/orders$" + }, + "codes": [ + "menu_order" + ] + }, + { + "api": { + "desc": "查看订单明细", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/order/[0-9A-Za-z_]+$" + }, + "codes": [ + "menu_order" + ] + }, + { + "api": { + "desc": "导出订单", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/orders/export$" + }, + "codes": [ + "menu_order" + ] + }, + { + "api": { + "desc": "新增订单", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/order$" + }, + "codes": [ + "button_order_create" + ] + }, + { + "api": { + "desc": "删除订单", + "method": "DELETE", + "uri_regexp": "^/api/cloudboot/v1/orders$" + }, + "codes": [ + "button_order_delete" + ] + }, + { + "api": { + "desc": "修改订单状态", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/order/status$" + }, + "codes": [ + "button_order_cancel", + "button_order_confirm" + ] + }, + { + "api": { + "desc": "导出订单", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/orders/export$" + }, + "codes": [ + "button_order_export" + ] + }, + { + "api": { + "desc": "查看设备类型", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/device-categories$" + }, + "codes": [ + "menu_device_category" + ] + }, + { + "api": { + "desc": "查看设备类型明细", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/device-category/[0-9A-Za-z_]+$" + }, + "codes": [ + "menu_device_category" + ] + }, + { + "api": { + "desc": "新增设备类型", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/device-category$" + }, + "codes": [ + "button_device_category_create" + ] + }, + { + "api": { + "desc": "修改设备类型", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/device-category$" + }, + "codes": [ + "button_device_category_update" + ] + }, + { + "api": { + "desc": "删除设备类型", + "method": "DELETE", + "uri_regexp": "^/api/cloudboot/v1/device-categories$" + }, + "codes": [ + "button_device_category_delete" + ] + }, + { + "api": { + "desc": "查看网段", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/ip-networks$" + }, + "codes": [ + "menu_ip_network" + ] + }, + { + "api": { + "desc": "新增网段", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/ip-networks$" + }, + "codes": [ + "button_ip_network_create" + ] + }, + { + "api": { + "desc": "修改网段", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/ip-networks$" + }, + "codes": [ + "button_ip_network_update" + ] + }, + { + "api": { + "desc": "删除网段", + "method": "DELETE", + "uri_regexp": "^/api/cloudboot/v1/ip-networks/[0-9A-Za-z_]+$" + }, + "codes": [ + "button_ip_network_delete" + ] + }, + { + "api": { + "desc": "上传导入IP网段文件", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/ip-networks/upload$" + }, + "codes": [ + "button_ip_network_import" + ] + }, + { + "api": { + "desc": "导入IP网段文件预览", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/ip-networks/imports/previews$" + }, + "codes": [ + "button_ip_network_import" + ] + }, + { + "api": { + "desc": "导入IP网段文件", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/ip-networks/imports$" + }, + "codes": [ + "button_ip_network_import" + ] + }, + { + "api": { + "desc": "查看IP列表", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/ips$" + }, + "codes": [ + "menu_ip" + ] + }, + { + "api": { + "desc": "手动分配IP", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/ips/assigns$" + }, + "codes": [ + "button_ip_assign" + ] + }, + { + "api": { + "desc": " 手动取消IP分配", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/ips/unassigns$" + }, + "codes": [ + "button_ip_unassign" + ] + }, + { + "api": { + "desc": "删除网络设备", + "method": "DELETE", + "uri_regexp": "^/api/cloudboot/v1/network/devices/[0-9A-Za-z_]+$" + }, + "codes": [ + "button_network_device_delete" + ] + }, + { + "api": { + "desc": "查看网络设备", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/network/devices$" + }, + "codes": [ + "menu_network_device" + ] + }, + { + "api": { + "desc": "新增网络设备", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/network/devices$" + }, + "codes": [ + "button_network_device_create" + ] + }, + { + "api": { + "desc": "网络设备同步", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/network/devices/sync$" + }, + "codes": [ + "button_network_device_sync" + ] + }, + { + "api": { + "desc": "上传网络设备文件", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/network/devices/upload$" + }, + "codes": [ + "button_ip_network_import" + ] + }, + { + "api": { + "desc": "导入网络设备文件预览", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/network/devices/imports/previews$" + }, + "codes": [ + "button_ip_network_import" + ] + }, + { + "api": { + "desc": "导入网络设备文件", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/network/devices/imports$" + }, + "codes": [ + "button_ip_network_import" + ] + }, + { + "api": { + "desc": "上报安装进度", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/devices/[0-9A-Za-z_]+/installations/progress$" + }, + "codes": [] + }, + { + "api": { + "desc": "查看装机参数", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/devices/settings$" + }, + "codes": [ + "menu_device_setting" + ] + }, + { + "api": { + "desc": "新增装机参数", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/devices/settings$" + }, + "codes": [ + "button_predeploy_physical_machine_osInstall" + ] + }, + { + "api": { + "desc": "批量重装设备", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/devices/installations/reinstalls$" + }, + "codes": [ + "button_device_setting_reInstall" + ] + }, + { + "api": { + "desc": "批量取消安装设备", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/devices/installations/cancels$" + }, + "codes": [ + "button_device_setting_cancelInstall" + ] + }, + { + "api": { + "desc": "批量删除设备装机参数", + "method": "DELETE", + "uri_regexp": "^/api/cloudboot/v1/devices/settings$" + }, + "codes": [ + "button_device_setting_delete" + ] + }, + { + "api": { + "desc": "删除硬件模板", + "method": "DELETE", + "uri_regexp": "^/api/cloudboot/v1/hardware-templates/[0-9A-Za-z_]+$" + }, + "codes": [ + "button_hardware_template_delete" + ] + }, + { + "api": { + "desc": "修改硬件模板", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/hardware-templates$" + }, + "codes": [ + "button_hardware_template_update" + ] + }, + { + "api": { + "desc": "查看硬件模板", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/hardware-templates$" + }, + "codes": [ + "menu_hardware_template" + ] + }, + { + "api": { + "desc": "新增硬件模板", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/hardware-templates$" + }, + "codes": [ + "button_hardware_template_create" + ] + }, + { + "api": { + "desc": "查看镜像模板", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/image-templates$" + }, + "codes": [ + "menu_template_management" + ] + }, + { + "api": { + "desc": "新增镜像模板", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/image-templates$" + }, + "codes": [ + "button_mirror_template_create" + ] + }, + { + "api": { + "desc": "修改镜像模板", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/image-templates$" + }, + "codes": [ + "button_mirror_template_update" + ] + }, + { + "api": { + "desc": "删除镜像模板", + "method": "DELETE", + "uri_regexp": "^/api/cloudboot/v1/image-templates/[0-9A-Za-z_]+$" + }, + "codes": [ + "button_mirror_template_delete" + ] + }, + { + "api": { + "desc": "查看系统模板", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/system-templates$" + }, + "codes": [ + "menu_template_management" + ] + }, + { + "api": { + "desc": "新增系统模板", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/system-templates$" + }, + "codes": [ + "button_system_template_create" + ] + }, + { + "api": { + "desc": "修改系统模板", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/system-templates$" + }, + "codes": [ + "button_system_template_update" + ] + }, + { + "api": { + "desc": "删除系统模板", + "method": "DELETE", + "uri_regexp": "^/api/cloudboot/v1/system-templates/[0-9A-Za-z_]+$" + }, + "codes": [ + "button_system_template_delete" + ] + }, + { + "api": { + "desc": "查看巡检任务", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/jobs/inspections$" + }, + "codes": [ + "menu_inspection" + ] + }, + { + "api": { + "desc": "查看巡检详情", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/devices/inspections$" + }, + "codes": [ + "menu_inspection" + ] + }, + { + "api": { + "desc": "查看巡检详情", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/devices/inspections/[0-9A-Za-z_]+$" + }, + "codes": [ + "menu_inspection" + ] + }, + { + "api": { + "desc": "查看设备巡检详情", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/devices/[0-9A-Za-z_]+/inspections$" + }, + "codes": [ + "menu_inspection" + ] + }, + { + "api": { + "desc": "新增巡检任务", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/jobs/inspections$" + }, + "codes": [ + "button_inspection_addTask", + "button_inspection_inspect", + "button_inspection_inspect_all" + ] + }, + { + "api": { + "desc": "查看任务列表", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/jobs$" + }, + "codes": [ + "menu_task_management" + ] + }, + { + "api": { + "desc": "删除目标任务API", + "method": "DELETE", + "uri_regexp": "^/api/cloudboot/v1/jobs/[0-9A-Za-z_]+$" + }, + "codes": [ + "button_task_delete" + ] + }, + { + "api": { + "desc": "暂停目标任务API", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/jobs/[0-9A-Za-z_]+/pausing$" + }, + "codes": [ + "button_task_pause" + ] + }, + { + "api": { + "desc": "继续已暂停的目标任务API", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/jobs/[0-9A-Za-z_]+/unpausing$" + }, + "codes": [ + "button_task_continue" + ] + }, + { + "api": { + "desc": "为目标设备生成PXE文件", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/devices/[0-9A-Za-z_]+/pxe$" + }, + "codes": [] + }, + { + "api": { + "desc": "生成centos6 pxe模板", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/devices/[0-9A-Za-z_]+/centos6/uefi/pxe$" + }, + "codes": [] + }, + { + "api": { + "desc": "发起数据中心裁撤审批", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/approvals/idc/abolish$" + }, + "codes": [ + "button_approval_idc_abolish" + ] + }, + { + "api": { + "desc": "发起机房裁撤审批", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/approvals/server-room/abolish$" + }, + "codes": [ + "button_approval_server_room_abolish" + ] + }, + { + "api": { + "desc": "发起机架关电审批", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/approvals/server-cabinets/poweroffs$" + }, + "codes": [ + "button_approval_cabinet_powerOff" + ] + }, + { + "api": { + "desc": "发起机架下线审批", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/approvals/server-cabinets/offlines$" + }, + "codes": [ + "button_approval_cabinet_offline" + ] + }, + { + "api": { + "desc": "发起网络区域下线审批", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/approvals/network-area/offline$" + }, + "codes": [ + "button_approval_network_area_offline" + ] + }, + { + "api": { + "desc": "发起物理机搬迁审批", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/approvals/devices/migrations$" + }, + "codes": [ + "button_approval_physical_machine_move" + ] + }, + { + "api": { + "desc": "上传物理机搬迁审批文件", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/approvals/devices/migrations/upload$" + }, + "codes": [ + "button_approval_physical_machine_move_import" + ] + }, + { + "api": { + "desc": "导入物理机搬迁审批预览", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/approvals/devices/migrations/imports/previews$" + }, + "codes": [ + "button_approval_physical_machine_move_import" + ] + }, + { + "api": { + "desc": "导入物理机搬迁审批", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/approvals/devices/migrations/imports$" + }, + "codes": [ + "button_approval_physical_machine_move_import" + ] + }, + { + "api": { + "desc": "发起物理机退役审批", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/approvals/devices/retirements$" + }, + "codes": [ + "button_approval_physical_machine_retirement" + ] + }, + { + "api": { + "desc": "发起物理机重装审批", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/approvals/devices/os-reinstallations$" + }, + "codes": [ + "button_approval_physical_machine_reInstall" + ] + }, + { + "api": { + "desc": "发起物理机关电审批", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/approvals/device/poweroff$" + }, + "codes": [ + "button_approval_physical_machine_power_off" + ] + }, + { + "api": { + "desc": "发起物理机重启审批", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/approvals/device/restart$" + }, + "codes": [ + "button_approval_physical_machine_restart" + ] + }, + { + "api": { + "desc": "发起物理机回收审批", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/approvals/devices/recycle$" + }, + "codes": [ + "button_approval_physical_machine_recycle_retire", + "button_approval_physical_machine_recycle_move", + "button_approval_physical_machine_recycle_reInstall" + ] + }, + { + "api": { + "desc": "发起IP回收审批", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/approvals/ip/unassign$" + }, + "codes": [ + "button_ip_unassign" + ] + }, + { + "api": { + "desc": "归还设备持有的DHCP IP令牌", + "method": "DELETE", + "uri_regexp": "^/api/cloudboot/v1/devices/[0-9A-Za-z_]+/limiters/tokens$" + }, + "codes": [ + "menu_device_setting" + ] + }, + { + "api": { + "desc": "一键归还所有设备持有的DHCP IP令牌", + "method": "DELETE", + "uri_regexp": "^/api/cloudboot/v1/devices/limiters/tokens$" + }, + "codes": [ + "menu_device_setting" + ] + }, + { + "api": { + "desc": "查看装机参数规则", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/device-setting-rules$" + }, + "codes": [ + "menu_device_setting_rule" + ] + }, + { + "api": { + "desc": "新增装机参数规则", + "method": "POST", + "uri_regexp": "^/api/cloudboot/v1/device-setting-rules$" + }, + "codes": [ + "button_device_setting_rule_create" + ] + }, + { + "api": { + "desc": "修改装机参数规则", + "method": "PUT", + "uri_regexp": "^/api/cloudboot/v1/device-setting-rules$" + }, + "codes": [ + "button_device_setting_rule_update" + ] + }, + { + "api": { + "desc": "删除装机参数规则", + "method": "DELETE", + "uri_regexp": "^/api/cloudboot/v1/device-setting-rules$" + }, + "codes": [ + "button_device_setting_rule_delete" + ] + }, + { + "api": { + "desc": "查看操作记录", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/operate/log$" + }, + "codes": [ + "menu_audit_log" + ] + }, + { + "api": { + "desc": "查看API调用记录", + "method": "GET", + "uri_regexp": "^/api/cloudboot/v1/api/log$" + }, + "codes": [ + "menu_audit_api" + ] + } +] \ No newline at end of file diff --git a/cyclone-server/doc/conf/cloudboot-server-proxy.conf b/cyclone-server/doc/conf/cloudboot-server-proxy.conf new file mode 100644 index 0000000000000000000000000000000000000000..a3e220aa5b2bb1807b3609487481d86c35b6dc5e --- /dev/null +++ b/cyclone-server/doc/conf/cloudboot-server-proxy.conf @@ -0,0 +1,17 @@ +{ + "Logger": { + "LogFile": "/usr/local/logs/cloudboot/proxy.log", + "PanicLogFile": "/usr/local/logs/cloudboot/proxy-panic.log", + "FilePerm": "0644", + "Level": "debug", + "ConsoleEnabled": false, + "RotateEnabled": true + }, + "ReverseProxy": { + "Enable": true, + "HTTPPort": 8083, + "URL": "http://#{IP}", + "Origin": "#{NODE}", + "IP": "#{PROXY}" + } +} \ No newline at end of file diff --git a/cyclone-server/doc/conf/cloudboot-server.conf b/cyclone-server/doc/conf/cloudboot-server.conf new file mode 100644 index 0000000000000000000000000000000000000000..99bba481069199c5f4d874ceae0bc33b26e4ee9b --- /dev/null +++ b/cyclone-server/doc/conf/cloudboot-server.conf @@ -0,0 +1,49 @@ +{ + "Server": { + "HttpPort": 8083, + "OOBDomain": "idcos.com", + "NetworkPlatBaseURL":"http://127.0.0.1:9000", + }, + "ExternalService": { + "ESBBaseURL":"http://127.0.0.1:8081" + "ESBAppID":"12345678", + "ESBAppToken":"qweasdzxc" + }, + "Repo": { + "Debug": false, + "LogDestination": "stdout", + "Connection": "root:password@tcp(#{IP}:3306)/cloudboot_webank?charset=utf8&parseTime=True&loc=Local" + }, + "Logger": { + "LogFile": "/usr/local/logs/cloudboot/server.log", + "PanicLogFile": "/usr/local/logs/cloudboot/panic.log", + "FilePerm": "0644", + "Level": "debug", + "ConsoleEnabled": false + }, + "UAM": { + "RootEndpoint": "http://#{IP}:8092", + "PortalURL": "http://#{IP}:92" + }, + "DHCPLimiter": { + "Enable": true, + "Limit": 10, + "WaitingTimeout": 600 + }, + "Crypto":{ + "Key":"" + }, + "DistributedNodes":[ + { + "NodeName": "深圳机房", + "NodeIP": [ + "ddd.ddd.ddd.ddd" + ] + } + ], + "Samba": { + "Server": "ddd.ddd.ddd.ddd", + "User": "samba_user", + "Password": "password" + } +} diff --git a/cyclone-server/doc/conf/cloudboot_button_permission.json b/cyclone-server/doc/conf/cloudboot_button_permission.json new file mode 100644 index 0000000000000000000000000000000000000000..30c178544876b09603a8dd6221ea150c4d8513bd --- /dev/null +++ b/cyclone-server/doc/conf/cloudboot_button_permission.json @@ -0,0 +1,1022 @@ +{ + "content": { + "children": [ + { + "children": [ + { + "children": [ + { + "children": [], + "id": "button_idc_create", + "note": "按钮-数据中心管理-新增", + "title": "新增数据中心" + }, + { + "children": [], + "id": "button_idc_update", + "note": "按钮-数据中心管理-修改", + "title": "修改数据中心" + }, + { + "children": [], + "id": "button_idc_delete", + "note": "按钮-数据中心管理-删除", + "title": "删除数据中心" + }, + { + "children": [], + "id": "button_idc_accepted", + "note": "按钮-数据中心管理-验收", + "title": "验收数据中心" + }, + { + "children": [], + "id": "button_idc_production", + "note": "按钮-数据中心管理-投产", + "title": "投产数据中心" + }, + { + "children": [], + "id": "button_idc_abolished", + "note": "按钮-数据中心管理-裁撤", + "title": "裁撤数据中心" + } + ], + "id": "menu_idc", + "note": "菜单-数据中心管理-数据中心", + "title": "数据中心" + }, + { + "children": [ + { + "children": [], + "id": "button_server_room_create", + "note": "按钮-机房信息管理-新增", + "title": "新增机房信息" + }, + { + "children": [], + "id": "button_server_room_update", + "note": "按钮-机房信息管理-修改", + "title": "修改机房信息" + }, + { + "children": [], + "id": "button_server_room_delete", + "note": "按钮-机房信息管理-删除", + "title": "删除机房信息" + }, + { + "children": [], + "id": "button_server_room_accepted", + "note": "按钮-机房信息管理-验收", + "title": "验收机房信息" + }, + { + "children": [], + "id": "button_server_room_production", + "note": "按钮-机房信息管理-投产", + "title": "投产机房信息" + }, + { + "children": [], + "id": "button_server_room_abolished", + "note": "按钮-机房信息管理-裁撤", + "title": "裁撤机房信息" + }, + { + "children": [], + "id": "button_server_room_import", + "note": "按钮-机房信息管理-导入", + "title": "导入机房信息" + }, + { + "children": [], + "id": "button_server_room_download", + "note": "按钮-机房信息管理-下载模板", + "title": "下载机房信息模板" + } + ], + "id": "menu_server_room", + "note": "菜单-数据中心管理-机房", + "title": "机房" + }, + { + "children": [ + { + "children": [], + "id": "button_network_area_create", + "note": "按钮-网络区域-新增", + "title": "新增网络区域" + }, + { + "children": [], + "id": "button_network_area_update", + "note": "按钮-网络区域-修改", + "title": "修改网络区域" + }, + { + "children": [], + "id": "button_network_area_delete", + "note": "按钮-网络区域-删除", + "title": "删除网络区域" + }, + { + "children": [], + "id": "button_network_area_production", + "note": "按钮-网络区域-投产", + "title": "投产网络区域" + }, + { + "children": [], + "id": "button_network_area_offline", + "note": "按钮-网络区域-下线", + "title": "下线网络区域" + }, + { + "children": [], + "id": "button_network_area_import", + "note": "按钮-网络区域-导入", + "title": "导入网络区域" + }, + { + "children": [], + "id": "button_network_area_download", + "note": "按钮-网络区域-下载模板", + "title": "下载网络区域模板" + } + ], + "id": "menu_network_area", + "note": "菜单-数据中心管理-网络区域", + "title": "网络区域" + }, + { + "children": [ + { + "children": [], + "id": "button_server_cabinet_create", + "note": "按钮-机架-新增", + "title": "新增机架" + }, + { + "children": [], + "id": "button_server_cabinet_update", + "note": "按钮-机架-修改", + "title": "修改机架" + }, + { + "children": [], + "id": "button_server_cabinet_delete", + "note": "按钮-机架-删除", + "title": "删除机架" + }, + { + "children": [], + "id": "button_server_cabinet_enabled", + "note": "按钮-机架-启用", + "title": "启用机架" + }, + { + "children": [], + "id": "button_server_cabinet_powerOn", + "note": "按钮-机架-开电", + "title": "开电机架" + }, + { + "children": [], + "id": "button_server_cabinet_powerOff", + "note": "按钮-机架-关电", + "title": "关电机架" + }, + { + "children": [], + "id": "button_server_cabinet_offline", + "note": "按钮-机架-下线", + "title": "下线机架" + }, + { + "children": [], + "id": "button_server_cabinet_locked", + "note": "按钮-机架-锁定", + "title": "锁定机架" + }, + { + "children": [], + "id": "button_server_cabinet_type", + "note": "按钮-机架-更新机架类型", + "title": "更新机架类型" + }, + { + "children": [], + "id": "button_server_cabinet_remark", + "note": "按钮-机架-备注", + "title": "更新机架备注" + }, + { + "children": [], + "id": "button_server_cabinet_import", + "note": "按钮-机架-导入", + "title": "导入机架" + }, + { + "children": [], + "id": "button_server_cabinet_download", + "note": "按钮-机架-下载模板", + "title": "下载机架模板" + } + ], + "id": "menu_server_cabinet", + "note": "菜单-数据中心管理-机架", + "title": "机架" + }, + { + "children": [ + { + "children": [], + "id": "button_server_usite_create", + "note": "按钮-机位-新增", + "title": "新增机位" + }, + { + "children": [], + "id": "button_server_usite_update", + "note": "按钮-机位-修改", + "title": "修改机位" + }, + { + "children": [], + "id": "button_server_usite_delete", + "note": "按钮-机位-删除", + "title": "删除机位" + }, + { + "children": [], + "id": "button_server_usite_delete_port", + "note": "按钮-机位-删除端口", + "title": "删除机位端口" + }, + { + "children": [], + "id": "button_server_usite_status", + "note": "按钮-机位-更新机位状态", + "title": "更新机位状态" + }, + { + "children": [], + "id": "button_server_usite_remark", + "note": "按钮-机位-备注", + "title": "更新机位备注" + }, + { + "children": [], + "id": "button_server_usite_import", + "note": "按钮-机位-导入", + "title": "导入机位" + }, + { + "children": [], + "id": "button_server_usite_download", + "note": "按钮-机位-下载模板", + "title": "下载机位模板" + }, + { + "children": [], + "id": "button_server_usite_import_port", + "note": "按钮-机位端口-导入", + "title": "导入机位端口" + }, + { + "children": [], + "id": "button_server_usite_download_port", + "note": "按钮-机位端口-下载模板", + "title": "下载机位端口模板" + } + ], + "id": "menu_server_usite", + "note": "菜单-数据中心管理-机位", + "title": "机位" + }, + { + "children": [ + { + "children": [], + "id": "button_store_room_create", + "note": "按钮-库房-新增", + "title": "新增库房管理单元" + }, + { + "children": [], + "id": "button_store_room_import", + "note": "按钮-库房-导入", + "title": "导入库房管理单元" + }, + { + "children": [], + "id": "button_store_room_delete", + "note": "按钮-库房-删除", + "title": "删除库房管理单元" + }, + { + "children": [], + "id": "button_store_room_update", + "note": "按钮-库房-修改", + "title": "修改库房管理单元" + }, + { + "children": [], + "id": "button_virtual_cabinet_create", + "note": "按钮-虚拟货架-新增", + "title": "新增虚拟货架" + }, + { + "children": [], + "id": "button_virtual_cabinet_delete", + "note": "按钮-虚拟货架-删除", + "title": "删除虚拟货架" + } + ], + "id": "menu_store_room", + "note": "菜单-数据中心管理-库房", + "title": "库房信息管理" + } + ], + "id": "menu_idc_management", + "note": "菜单-数据中心管理", + "title": "数据中心管理" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "id": "button_network_device_create", + "note": "按钮-网络设备-新增", + "title": "新增网络设备" + }, + { + "children": [], + "id": "button_network_device_delete", + "note": "按钮-网络设备-删除", + "title": "删除网络设备" + }, + { + "children": [], + "id": "button_network_device_sync", + "note": "按钮-网络设备-同步", + "title": "同步网络设备" + }, + { + "children": [], + "id": "button_network_device_import_download", + "note": "按钮-网络设备-下载导入模板", + "title": "下载导入网络设备模板" + }, + { + "children": [], + "id": "button_network_device_import", + "note": "按钮-网络设备-导入", + "title": "导入网络设备" + } + ], + "id": "menu_network_device", + "note": "菜单-网络管理-网络设备", + "title": "网络设备" + }, + { + "children": [ + { + "children": [], + "id": "button_ip_network_create", + "note": "按钮-IP网段管理-新增", + "title": "新增IP网段管理" + }, + { + "children": [], + "id": "button_ip_network_update", + "note": "按钮-IP网段管理-修改", + "title": "修改IP网段管理" + }, + { + "children": [], + "id": "button_ip_network_delete", + "note": "按钮-IP网段管理-删除", + "title": "删除IP网段管理" + }, + { + "children": [], + "id": "button_ip_network_sync", + "note": "按钮-IP网段管理-同步", + "title": "同步IP网段" + }, + { + "children": [], + "id": "button_ip_network_import_download", + "note": "按钮-IP网段管理-导入模板下载", + "title": "下载导入IP网段模板" + }, + { + "children": [], + "id": "button_ip_network_import", + "note": "按钮-IP网段管理-导入", + "title": "导入IP网段" + } + ], + "id": "menu_ip_network", + "note": "菜单-网络管理-IP网段", + "title": "IP网段" + }, + { + "children": [ + { + "children": [], + "id": "button_ip_assign", + "note": "按钮-IP分配-分配", + "title": "IP分配" + }, + { + "children": [], + "id": "button_ip_unassign", + "note": "按钮-IP分配-取消分配", + "title": "取消IP分配" + } + ], + "id": "menu_ip", + "note": "菜单-网络管理-IP分配", + "title": "IP分配" + } + ], + "id": "menu_network_management", + "note": "菜单-网络管理", + "title": "网络管理" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "id": "button_physical_machine_update_status", + "note": "按钮-物理机列表-修改", + "title": "批量修改物理机状态" + }, + { + "children": [], + "id": "button_physical_machine_update_usage", + "note": "按钮-物理机列表-修改", + "title": "批量修改物理机用途" + }, + { + "children": [], + "id": "button_physical_machine_update", + "note": "按钮-物理机列表-修改", + "title": "修改物理机" + }, + { + "children": [], + "id": "button_physical_machine_import", + "note": "按钮-物理机列表-导入", + "title": "存量物理机导入" + }, + { + "children": [], + "id": "button_physical_machine_download", + "note": "按钮-物理机列表-下载模板", + "title": "存量物理机模板下载" + }, + { + "children": [], + "id": "button_physical_machine_export", + "note": "按钮-物理机列表-导出", + "title": "物理机导出" + }, + { + "children": [], + "id": "button_device_store_import", + "note": "按钮-物理机列表-导入", + "title": "物理机导入到库房" + }, + { + "children": [], + "id": "button_device_store_import_download", + "note": "按钮-物理机列表-下载模板", + "title": "物理机导入到库房模板下载" + } + ], + "id": "menu_physical_machine", + "note": "菜单-物理机管理-物理机列表", + "title": "物理机列表" + }, + { + "children": [ + { + "children": [], + "id": "button_physical_machine_update_oob", + "note": "按钮-带外管理-修改带外", + "title": "修改物理机带外" + }, + { + "children": [], + "id": "button_physical_machine_powerOn", + "note": "按钮-带外管理-开电", + "title": "开电物理机" + }, + { + "children": [], + "id": "button_physical_machine_networkBoot", + "note": "按钮-带外管理-从网卡启动", + "title": "从网卡启动物理机" + }, + { + "children": [], + "id": "button_oob_re_access", + "note": "按钮-带外管理-重新纳管带外", + "title": "重新纳管带外" + }, + { + "children": [], + "id": "button_physical_oob_export", + "note": "按钮-带外管理-导出带外", + "title": "导出带外" + } + ], + "id": "menu_oob_info", + "note": "菜单-物理机管理-带外管理", + "title": "带外管理" + }, + { + "children": [ + { + "children": [], + "id": "button_special_device_create", + "note": "按钮-特殊设备列表-新增", + "title": "新增特殊设备" + }, + { + "children": [], + "id": "button_special_device_delete", + "note": "按钮-特殊设备列表-新增", + "title": "新增特殊设备" + }, + { + "children": [], + "id": "button_special_device_import_download", + "note": "按钮-特殊设备列表-下载模板", + "title": "导入特殊设备模板下载" + }, + { + "children": [], + "id": "button_special_device_import", + "note": "按钮-特殊设备列表-导入", + "title": "导入特殊设备" + } + ], + "id": "menu_special_device", + "note": "菜单-物理机管理-特殊设备列表", + "title": "特殊设备列表" + }, + { + "children": [ + { + "children": [], + "id": "button_predeploy_physical_machine_osInstall", + "note": "按钮-待部署物理机-申请上架部署", + "title": "待部署物理机申请上架部署" + }, + { + "children": [], + "id": "button_predeploy_physical_machine_powerOn", + "note": "按钮-待部署物理机-开电", + "title": "待部署物理机开电" + }, + { + "children": [], + "id": "button_predeploy_physical_machine_powerOff", + "note": "按钮-待部署物理机-关电", + "title": "待部署物理机关电" + }, + { + "children": [], + "id": "button_predeploy_physical_machine_reBoot", + "note": "按钮-待部署物理机-重启", + "title": "待部署物理机重启" + }, + { + "children": [], + "id": "button_predeploy_physical_machine_networkBoot", + "note": "按钮-待部署物理机-从网卡启动", + "title": "待部署物理机从网卡启动" + }, + { + "children": [], + "id": "button_predeploy_physical_machine_download", + "note": "按钮-待部署物理机-下载", + "title": "下载待部署物理机模板" + }, + { + "children": [], + "id": "button_predeploy_physical_machine_import", + "note": "按钮-待部署物理机-导入", + "title": "导入待部署物理机模板" + }, + { + "children": [], + "id": "button_predeploy_physical_machine_delete", + "note": "按钮-待部署物理机-删除", + "title": "删除物理机" + } + ], + "id": "menu_predeploy_physical_machine", + "note": "菜单-物理机管理-待部署物理机", + "title": "待部署物理机" + }, + { + "children": [ + { + "children": [], + "id": "button_device_setting_reInstall", + "note": "按钮-部署列表-重新部署", + "title": "重新部署" + }, + { + "children": [], + "id": "button_dhcp_token_release", + "note": "按钮-部署列表-释放DHCP令牌", + "title": "释放DHCP令牌" + }, + { + "children": [], + "id": "button_dhcp_token_batch_release", + "note": "按钮-部署列表-批量释放DHCP令牌", + "title": "批量释放DHCP令牌" + }, + { + "children": [], + "id": "button_device_setting_cancelInstall", + "note": "按钮-部署列表-取消部署", + "title": "取消部署" + }, + { + "children": [], + "id": "button_device_setting_delete", + "note": "按钮-部署列表-删除", + "title": "删除部署物理机" + } + ], + "id": "menu_device_setting", + "note": "菜单-物理机管理-部署列表", + "title": "部署列表" + }, + { + "children": [ + { + "children": [], + "id": "button_device_setting_rule_create", + "note": "按钮-装机参数规则-新增", + "title": "新增装机参数规则" + }, + { + "children": [], + "id": "button_device_setting_rule_update", + "note": "按钮-装机参数规则-修改", + "title": "修改装机参数规则" + }, + { + "children": [], + "id": "button_device_setting_rule_delete", + "note": "按钮-装机参数规则-删除", + "title": "删除装机参数规则" + } + ], + "id": "menu_device_setting_rule", + "note": "菜单-物理机管理-装机参数规则列表", + "title": "装机参数规则列表" + }, + { + "children": [ + { + "children": [], + "id": "button_inspection_addTask", + "note": "按钮-硬件巡检-新建巡检任务", + "title": "新建巡检任务" + }, + { + "children": [], + "id": "button_inspection_inspect", + "note": "按钮-硬件巡检-重新巡检", + "title": "重新巡检" + }, + { + "children": [], + "id": "button_inspection_inspect_all", + "note": "按钮-硬件巡检-巡检全部", + "title": "巡检全部" + } + ], + "id": "menu_inspection", + "note": "菜单-物理机管理-硬件巡检", + "title": "硬件巡检" + } + ], + "id": "menu_physical_machine_management", + "note": "菜单-物理机管理", + "title": "物理机管理" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "id": "button_order_create", + "note": "按钮-订单列表-新增", + "title": "新增订单" + }, + { + "children": [], + "id": "button_order_delete", + "note": "按钮-订单列表-删除", + "title": "删除订单" + }, + { + "children": [], + "id": "button_order_cancel", + "note": "按钮-订单列表-取消", + "title": "取消订单" + }, + { + "children": [], + "id": "button_order_confirm", + "note": "按钮-订单列表-确认", + "title": "确认订单" + }, + { + "children": [], + "id": "button_order_export", + "note": "按钮-订单列表-导出", + "title": "导出订单" + } + ], + "id": "menu_order", + "note": "菜单-订单管理-订单列表", + "title": "订单列表" + }, + { + "children": [ + { + "children": [], + "id": "button_device_category_create", + "note": "按钮-设备类型列表-新增", + "title": "新增设备类型" + }, + { + "children": [], + "id": "button_device_category_delete", + "note": "按钮-设备类型列表-删除", + "title": "删除设备类型" + }, + { + "children": [], + "id": "button_device_category_update", + "note": "按钮-设备类型列表-修改", + "title": "修改设备类型" + } + ], + "id": "menu_device_category", + "note": "菜单-订单管理-设备类型列表", + "title": "设备类型列表" + } + ], + "id": "menu_order_management", + "note": "菜单-订单管理", + "title": "订单管理" + }, + { + "children": [ + { + "children": [ + { + "children": [], + "id": "button_system_template_create", + "note": "按钮-PXE配置-新建", + "title": "新建PXE配置" + }, + { + "children": [], + "id": "button_system_template_update", + "note": "按钮-PXE配置-修改", + "title": "修改PXE配置" + }, + { + "children": [], + "id": "button_system_template_delete", + "note": "按钮-PXE配置-删除", + "title": "删除PXE配置" + }, + { + "children": [], + "id": "button_mirror_template_create", + "note": "按钮-镜像配置-新建", + "title": "新建镜像配置" + }, + { + "children": [], + "id": "button_mirror_template_update", + "note": "按钮-镜像配置-修改", + "title": "修改镜像配置" + }, + { + "children": [], + "id": "button_mirror_template_delete", + "note": "按钮-镜像配置-删除", + "title": "删除镜像配置" + } + ], + "id": "menu_system_template", + "note": "菜单-装机管理-系统/镜像配置", + "title": "系统/镜像配置" + }, + { + "children": [ + { + "children": [], + "id": "button_hardware_template_create", + "note": "按钮-硬件配置-新建", + "title": "新建/克隆硬件配置" + }, + { + "children": [], + "id": "button_hardware_template_update", + "note": "按钮-硬件配置-修改", + "title": "修改硬件配置" + }, + { + "children": [], + "id": "button_hardware_template_delete", + "note": "按钮-硬件配置-删除", + "title": "删除硬件配置" + } + ], + "id": "menu_hardware_template", + "note": "菜单-配置管理-硬件配置", + "title": "硬件配置" + } + ], + "id": "menu_template_management", + "note": "菜单-配置管理", + "title": "配置管理" + }, + { + "children": [ + { + "children": [], + "id": "button_approval_idc_abolish", + "note": "按钮-审批管理-数据中心裁撤", + "title": "数据中心裁撤审批" + }, + { + "children": [], + "id": "button_approval_server_room_abolish", + "note": "按钮-审批管理-机房裁撤", + "title": "机房裁撤审批" + }, + { + "children": [], + "id": "button_approval_cabinet_offline", + "note": "按钮-审批管理-机架下线", + "title": "机架下线审批" + }, + { + "children": [], + "id": "button_approval_cabinet_powerOff", + "note": "按钮-审批管理-机架关电", + "title": "机架关电审批" + }, + { + "children": [], + "id": "button_approval_network_area_offline", + "note": "按钮-审批管理-网络区域下线", + "title": "网络区域下线审批" + }, + { + "children": [], + "id": "button_approval_physical_machine_move", + "note": "按钮-审批管理-物理机搬迁", + "title": "物理机搬迁审批" + }, + { + "children": [], + "id": "button_approval_physical_machine_move_download", + "note": "按钮-审批管理-物理机搬迁导入模板", + "title": "下载物理机搬迁审批导入模板" + }, + { + "children": [], + "id": "button_approval_physical_machine_move_import", + "note": "按钮-审批管理-导入物理机搬迁", + "title": "导入物理机搬迁审批" + }, + { + "children": [], + "id": "button_approval_physical_machine_retirement", + "note": "按钮-审批管理-物理机退役", + "title": "物理机退役审批" + }, + { + "children": [], + "id": "button_approval_physical_machine_reInstall", + "note": "按钮-审批管理-物理机重装", + "title": "物理机重装审批" + }, + { + "children": [], + "id": "button_approval_physical_machine_power_off", + "note": "按钮-审批管理-物理机关电", + "title": "物理机关电审批" + }, + { + "children": [], + "id": "button_approval_physical_machine_restart", + "note": "按钮-审批管理-物理机重启", + "title": "物理机重启审批" + }, + { + "children": [], + "id": "button_approval_physical_machine_recycle_retire", + "note": "按钮-审批管理-物理机回收退役", + "title": "物理机回收退役审批" + }, + { + "children": [], + "id": "button_approval_physical_machine_recycle_move", + "note": "按钮-审批管理-物理机回收搬迁", + "title": "物理机回收搬迁审批" + }, + { + "children": [], + "id": "button_approval_physical_machine_recycle_reInstall", + "note": "按钮-审批管理-物理机回收重装", + "title": "物理机回收重装审批" + }, + { + "children": [], + "id": "button_ip_unassign", + "note": "按钮-审批管理-IP回收", + "title": "IP回收审批" + }, + { + "children": [], + "id": "button_approval_agree", + "note": "按钮-审批管理-审批通过", + "title": "审批通过" + }, + { + "children": [], + "id": "button_approval_disagree", + "note": "按钮-审批管理-审批拒绝", + "title": "审批拒绝" + }, + { + "children": [], + "id": "button_approval_revoke", + "note": "按钮-审批管理-审批撤销", + "title": "审批撤销" + } + ], + "id": "menu_approval", + "note": "菜单-审批管理", + "title": "审批管理" + }, + { + "children": [ + { + "children": [], + "id": "button_task_pause", + "note": "按钮-任务列表-暂停", + "title": "暂停" + }, + { + "children": [], + "id": "button_task_continue", + "note": "按钮-任务列表-继续", + "title": "继续" + }, + { + "children": [], + "id": "button_task_delete", + "note": "按钮-任务列表-删除", + "title": "删除" + } + ], + "id": "menu_task_management", + "note": "菜单-任务管理", + "title": "任务管理" + } + ], + "id": "", + "note": "", + "title": "所有权限" + }, + "message": "操作成功", + "status": "success" +} \ No newline at end of file diff --git a/cyclone-server/doc/conf/cloudboot_menu_permission.json b/cyclone-server/doc/conf/cloudboot_menu_permission.json new file mode 100644 index 0000000000000000000000000000000000000000..efce3ac0317d259e520275a69957589adef31157 --- /dev/null +++ b/cyclone-server/doc/conf/cloudboot_menu_permission.json @@ -0,0 +1,210 @@ +{ + "content": { + "children": [ + { + "children": [], + "id": "menu_home", + "note": "菜单-概览", + "title": "概览" + }, + { + "children": [ + { + "children": [], + "id": "menu_idc", + "note": "菜单-数据中心管理-数据中心", + "title": "数据中心" + }, + { + "children": [], + "id": "menu_server_room", + "note": "菜单-数据中心管理-机房", + "title": "机房" + }, + { + "children": [], + "id": "menu_network_area", + "note": "菜单-数据中心管理-网络区域", + "title": "网络区域" + }, + { + "children": [], + "id": "menu_server_cabinet", + "note": "菜单-数据中心管理-机架", + "title": "机架" + }, + { + "children": [], + "id": "menu_server_usite", + "note": "菜单-数据中心管理-机位", + "title": "机位" + }, + { + "children": [], + "id": "menu_store_room", + "note": "菜单-数据中心管理-库房", + "title": "库房" + } + ], + "id": "menu_idc_management", + "note": "菜单-数据中心管理", + "title": "数据中心管理" + }, + { + "children": [ + { + "children": [], + "id": "menu_network_device", + "note": "菜单-网络管理-网络设备", + "title": "网络设备" + }, + { + "children": [], + "id": "menu_ip_network", + "note": "菜单-网络管理-IP网段", + "title": "IP网段" + }, + { + "children": [], + "id": "menu_ip", + "note": "菜单-网络管理-IP分配", + "title": "IP分配" + } + ], + "id": "menu_network_management", + "note": "菜单-网络管理", + "title": "网络管理" + }, + { + "children": [ + { + "children": [], + "id": "menu_physical_machine", + "note": "菜单-物理机管理-物理机列表", + "title": "物理机列表" + }, + { + "children": [], + "id": "menu_special_device", + "note": "菜单-物理机管理-特殊设备列表", + "title": "特殊设备列表" + }, + { + "children": [], + "id": "menu_oob_info", + "note": "菜单-物理机管理-带外信息", + "title": "带外信息" + }, + { + "children": [], + "id": "menu_predeploy_physical_machine", + "note": "菜单-物理机管理-待部署物理机", + "title": "待部署物理机" + }, + { + "children": [], + "id": "menu_device_setting", + "note": "菜单-物理机管理-部署列表", + "title": "部署列表" + }, + { + "children": [], + "id": "menu_device_setting_rule", + "note": "菜单-物理机管理-装机参数规则列表", + "title": "装机参数规则列表" + }, + { + "children": [], + "id": "menu_inspection", + "note": "菜单-物理机管理-硬件巡检", + "title": "硬件巡检" + } + ], + "id": "menu_physical_machine_management", + "note": "菜单-物理机管理", + "title": "物理机管理" + }, + { + "children": [ + { + "children": [], + "id": "menu_order", + "note": "菜单-订单管理-订单列表", + "title": "订单列表" + }, + { + "children": [], + "id": "menu_device_category", + "note": "菜单-订单管理-设备类型列表", + "title": "设备类型列表" + } + ], + "id": "menu_order_management", + "note": "菜单-订单管理", + "title": "订单管理" + }, + { + "children": [ + { + "children": [], + "id": "menu_system_template", + "note": "菜单-配置管理-装机配置", + "title": "装机配置" + }, + { + "children": [], + "id": "menu_hardware_template", + "note": "菜单-配置管理-硬件配置", + "title": "硬件配置" + } + ], + "id": "menu_template_management", + "note": "菜单-配置管理", + "title": "配置管理" + }, + { + "children": [], + "id": "menu_approval", + "note": "菜单-审批管理", + "title": "审批管理" + }, + { + "children": [], + "id": "menu_task_management", + "note": "菜单-任务管理", + "title": "任务管理" + }, + { + "children": [ + { + "children": [], + "id": "menu_audit_api", + "note": "菜单-操作审计-接口调用记录", + "title": "接口调用记录" + }, + { + "children": [], + "id": "menu_audit_log", + "note": "菜单-操作审计-操作记录", + "title": "操作记录" + } + ], + "id": "menu_audit", + "note": "菜单-操作审计", + "title": "操作审计" + }, + { + "children": [], + "id": "menu_user_management", + "note": "菜单-用户管理", + "title": "用户管理" + } + + ], + "id": "", + "note": "", + "title": "所有权限" + }, + "message": "操作成功", + "status": "success" +} diff --git a/cyclone-server/doc/conf/route_conf.json b/cyclone-server/doc/conf/route_conf.json new file mode 100644 index 0000000000000000000000000000000000000000..5f1f813d303ca54b582fb33af02e8ae685618577 --- /dev/null +++ b/cyclone-server/doc/conf/route_conf.json @@ -0,0 +1,891 @@ +[ + { + "category_code": "add_idcs", + "category_name": "新增数据中心", + "http_method": "Post", + "method": "GetIDCByID", + "url": "/api/cloudboot/v1/idcs" + }, + { + "category_code": "mod_idcs", + "category_name": "修改数据中心", + "http_method": "Put", + "method": "GetIDCByID", + "url": "/api/cloudboot/v1/idcs/{id}" + }, + { + "category_code": "mod_idcs_status", + "category_name": "修改数据中心状态", + "http_method": "Put", + "method": "", + "url": "/api/cloudboot/v1/idcs/status" + }, + { + "category_code": "rm_idcs", + "category_name": "删除数据中心", + "http_method": "Delete", + "method": "GetIDCByID", + "url": "/api/cloudboot/v1/idcs/{id}" + }, + { + "category_code": "add_server-rooms", + "category_name": "新增机房", + "http_method": "Post", + "method": "GetServerRoomByID", + "url": "/api/cloudboot/v1/server-rooms" + }, + { + "category_code": "mod_server-rooms", + "category_name": "修改机房", + "http_method": "Put", + "method": "GetServerRoomByID", + "url": "/api/cloudboot/v1/server-rooms/{id}" + }, + { + "category_code": "mod_server-rooms_status", + "category_name": "修改机房状态", + "http_method": "Put", + "method": "", + "url": "/api/cloudboot/v1/server-rooms/status" + }, + { + "category_code": "rm_server-rooms", + "category_name": "删除机房", + "http_method": "Delete", + "method": "GetServerRoomByID", + "url": "/api/cloudboot/v1/server-rooms/{id}" + }, + { + "category_code": "add_server-rooms", + "category_name": "加载导入机房文件", + "http_method": "Post", + "method": "GetServerRoomByID", + "url": "/api/cloudboot/v1/server-rooms/upload" + }, + { + "category_code": "add_server-rooms", + "category_name": "导入机房文件预览", + "http_method": "Post", + "url": "/api/cloudboot/v1/server-rooms/imports/previews" + }, + { + "category_code": "import_server-rooms", + "category_name": "导入机房文件", + "http_method": "Post", + "method": "GetServerRoomByID", + "url": "/api/cloudboot/v1/server-rooms/imports" + }, + { + "category_code": "add_network-areas", + "category_name": "新增网络区域", + "http_method": "Post", + "method": "GetNetworkAreaByID", + "url": "/api/cloudboot/v1/network-areas" + }, + { + "category_code": "mod_network-areas", + "category_name": "修改网络区域", + "http_method": "Put", + "method": "GetNetworkAreaByID", + "url": "/api/cloudboot/v1/network-areas/{id}" + }, + { + "category_code": "mod_network-areas_status", + "category_name": "修改网络区域状态", + "http_method": "Put", + "method": "", + "url": "/api/cloudboot/v1/network-areas/status" + }, + { + "category_code": "rm_network-areas", + "category_name": "删除网络区域", + "http_method": "Delete", + "method": "GetNetworkAreaByID", + "url": "/api/cloudboot/v1/network-areas/{id}" + }, + { + "category_code": "add_network-areas", + "category_name": "加载导入导入网络区域文件", + "http_method": "Post", + "method": "GetNetworkAreaByID", + "url": "/api/cloudboot/v1/network-areas/upload" + }, + { + "category_code": "add_network-areas", + "category_name": "导入网络区域文件预览", + "http_method": "Post", + "url": "/api/cloudboot/v1/network-areas/imports/previews" + }, + { + "category_code": "add_network-areas", + "category_name": "导入网络区域文件", + "http_method": "Post", + "url": "/api/cloudboot/v1/network-areas/imports" + }, + { + "category_code": "add_server-cabinets", + "category_name": "新增机架(柜)", + "http_method": "Post", + "method": "GetServerCabinetByID", + "url": "/api/cloudboot/v1/server-cabinets" + }, + { + "category_code": "mod_server-cabinets", + "category_name": "修改机架(柜)", + "http_method": "Put", + "method": "GetServerCabinetByID", + "url": "/api/cloudboot/v1/server-cabinets/{id}" + }, + { + "category_code": "add_server-cabinets_status", + "category_name": "修改机架(柜)状态", + "http_method": "Put", + "method": "", + "url": "/api/cloudboot/v1/server-cabinets/status" + }, + { + "category_code": "rm_server-cabinets", + "category_name": "删除机架(柜)", + "http_method": "Delete", + "method": "GetServerCabinetByID", + "url": "/api/cloudboot/v1/server-cabinets/{id}" + }, + { + "category_code": "power_on_server-cabinets", + "category_name": "机架开电", + "http_method": "Post", + "method": "GetServerCabinetByID", + "url": "/api/cloudboot/v1/server-cabinets/{id}/power" + }, + { + "category_code": "power_off_server-cabinets", + "category_name": "机架关电", + "http_method": "Delete", + "method": "GetServerCabinetByID", + "url": "/api/cloudboot/v1/server-cabinets/{id}/power" + }, + { + "category_code": "add_server-cabinets", + "category_name": "加载导入机架(柜)文件", + "http_method": "Post", + "method": "GetServerCabinetByID", + "url": "/api/cloudboot/v1/server-cabinets/upload" + }, + { + "category_code": "add_server-cabinets", + "category_name": "导入机架(柜)文件预览", + "http_method": "Post", + "url": "/api/cloudboot/v1/server-cabinets/imports/previews" + }, + { + "category_code": "add_server-cabinets", + "category_name": "导入机架(柜)文件", + "http_method": "Post", + "url": "/api/cloudboot/v1/server-cabinets/imports" + }, + { + "category_code": "add_server-usites", + "category_name": "新增机位(U位)", + "http_method": "Post", + "method": "GetServerUSiteByID", + "url": "/api/cloudboot/v1/server-usites" + }, + { + "category_code": "mod_server-usites", + "category_name": "修改机位(U位)", + "http_method": "Put", + "method": "GetServerUSiteByID", + "url": "/api/cloudboot/v1/server-usites/{id}" + }, + { + "category_code": "rm_server-usites", + "category_name": "删除机位(U位)", + "http_method": "Delete", + "method": "GetServerUSiteByID", + "url": "/api/cloudboot/v1/server-usites/{id}" + }, + { + "category_code": "rm_server-usites_ports", + "category_name": "删除机位(U位)端口号", + "http_method": "Delete", + "method": "GetServerUSiteByID", + "url": "/api/cloudboot/v1/server-usites/{id}/ports" + }, + { + "category_code": "mod_server-usites", + "category_name": "修改机位(U位)状态", + "http_method": "Put", + "method": "GetServerUSiteByID", + "url": "/api/cloudboot/v1/server-usites/status" + }, + { + "category_code": "add_server-usites", + "category_name": "加载导入机位(U位)文件", + "http_method": "Post", + "url": "/api/cloudboot/v1/server-usites/upload" + }, + { + "category_code": "add_server-usites", + "category_name": "导入机位(U位)文件预览", + "http_method": "Post", + "url": "/api/cloudboot/v1/server-usites/imports/previews" + }, + { + "category_code": "add_server-usites", + "category_name": "导入机位(U位)文件", + "http_method": "Post", + "url": "/api/cloudboot/v1/server-usites/imports" + }, + { + "category_code": "add_server-usites", + "category_name": "加载导入机位(U位)端口号文件", + "http_method": "Post", + "url": "/api/cloudboot/v1/server-usites/ports/upload" + }, + { + "category_code": "add_server-usites", + "category_name": "导入机位(U位)端口号文件预览", + "http_method": "Post", + "url": "/api/cloudboot/v1/server-usites/ports/imports/previews" + }, + { + "category_code": "add_server-usites", + "category_name": "导入机位(U位)端口号文件", + "http_method": "Post", + "url": "/api/cloudboot/v1/server-usites/ports/imports" + }, + { + "category_code": "add_devices", + "category_name": "新增物理机", + "http_method": "Post", + "url": "/api/cloudboot/v1/devices/{sn}/collections" + }, + { + "category_code": "add_devices", + "category_name": "加载导入物理机文件", + "http_method": "Post", + "url": "/api/cloudboot/v1/devices/upload" + }, + { + "category_code": "add_devices", + "category_name": "导入物理机文件预览", + "http_method": "Post", + "url": "/api/cloudboot/v1/devices/imports/previews" + }, + { + "category_code": "add_devices", + "category_name": "加入物理机文件", + "http_method": "Post", + "url": "/api/cloudboot/v1/devices/imports" + }, + { + "category_code": "mod_device", + "category_name": "修改物理机", + "http_method": "Put", + "url": "/api/cloudboot/v1/device" + }, + { + "category_code": "mod_device", + "category_name": "批量修改物理机状态/用途", + "http_method": "Put", + "url": "/api/cloudboot/v1/devices" + }, + { + "category_code": "rm_devices", + "category_name": "删除物理机", + "http_method": "Delete", + "url": "/api/cloudboot/v1/devices" + }, + { + "category_code": "add_ip-networks", + "category_name": "新增网段", + "http_method": "Post", + "url": "/api/cloudboot/v1/ip-networks" + }, + { + "category_code": "add_ip-networks", + "category_name": "修改网段", + "http_method": "Put", + "url": "/api/cloudboot/v1/ip-networks/{id}" + }, + { + "category_code": "rm_ip-networks", + "category_name": "删除网段", + "http_method": "Delete", + "url": "/api/cloudboot/v1/ip-networks/{id}" + }, + { + "category_code": "sync_ip-networks", + "category_name": "网段同步", + "http_method": "Post", + "method": "", + "url": "/api/cloudboot/v1/ip-networks/sync" + }, + { + "category_code": "mod_ips", + "category_name": "手动分配IP", + "http_method": "Put", + "url": "/api/cloudboot/v1/ips/assigns" + }, + { + "category_code": "mod_ips", + "category_name": " 手动取消IP分配", + "http_method": "Put", + "url": "/api/cloudboot/v1/ips/unassigns" + }, + { + "category_code": "rm_network-device", + "category_name": "删除网络设备", + "http_method": "Delete", + "method": "GetNetworkDeviceByID", + "url": "/api/cloudboot/v1/network/devices/{id}" + }, + { + "category_code": "add_network-device", + "category_name": "新增网络设备", + "http_method": "Post", + "method": "GetNetworkDeviceByID", + "url": "/api/cloudboot/v1/network/devices" + }, + { + "category_code": "sync_network-device", + "category_name": "网段设备同步", + "http_method": "Post", + "method": "", + "url": "/api/cloudboot/v1/network/devices/sync" + }, + { + "category_code": "add_devices", + "category_name": "上报安装进度", + "http_method": "Post", + "url": "/api/cloudboot/v1/devices/{sn}/installations/progress" + }, + { + "category_code": "add_devices", + "category_name": "新增装机参数", + "http_method": "Post", + "url": "/api/cloudboot/v1/devices/settings" + }, + { + "category_code": "mod_devices", + "category_name": "批量重装设备", + "http_method": "Put", + "url": "/api/cloudboot/v1/devices/installations/reinstalls" + }, + { + "category_code": "mod_devices", + "category_name": "设备重装", + "http_method": "Post", + "url": "/api/cloudboot/v1/devices/installations/os-reinstallations" + }, + { + "category_code": "mod_devices", + "category_name": "批量取消安装设备", + "http_method": "Put", + "url": "/api/cloudboot/v1/devices/installations/cancels" + }, + { + "category_code": "rm_devices", + "category_name": "批量删除设备装机参数", + "http_method": "Delete", + "url": "/api/cloudboot/v1/devices/settings" + }, + { + "category_code": "rm_hardware-templates", + "category_name": "删除硬件模板", + "http_method": "Delete", + "url": "/api/cloudboot/v1/hardware-templates/{id}" + }, + { + "category_code": "mod_hardware-templates", + "category_name": "修改硬件模板", + "http_method": "Put", + "url": "/api/cloudboot/v1/hardware-templates/{id}" + }, + { + "category_code": "add_hardware-templates", + "category_name": "新增硬件模板", + "http_method": "Post", + "url": "/api/cloudboot/v1/hardware-templates" + }, + { + "category_code": "add_image-templates", + "category_name": "新增镜像模板", + "http_method": "Post", + "url": "/api/cloudboot/v1/image-templates" + }, + { + "category_code": "mod_image-templates", + "category_name": "修改镜像模板", + "http_method": "Put", + "url": "/api/cloudboot/v1/image-templates/{id}" + }, + { + "category_code": "rm_image-templates", + "category_name": "删除镜像模板", + "http_method": "Delete", + "url": "/api/cloudboot/v1/image-templates/{id}" + }, + { + "category_code": "add_system-templates", + "category_name": "新增系统模板", + "http_method": "Post", + "url": "/api/cloudboot/v1/system-templates" + }, + { + "category_code": "mod_system-templates", + "category_name": "修改系统模板", + "http_method": "Put", + "url": "/api/cloudboot/v1/system-templates/{id}" + }, + { + "category_code": "rm_system-templates", + "category_name": "删除系统模板", + "http_method": "Delete", + "url": "/api/cloudboot/v1/system-templates/{id}" + }, + { + "category_code": "add_devices", + "category_name": "新增带外管理", + "http_method": "Post", + "url": "/api/cloudboot/v1/devices/power" + }, + { + "category_code": "add_devices", + "category_name": "带外管理批量PXE重启", + "http_method": "Put", + "url": "/api/cloudboot/v1/devices/power/pxe/restart" + }, + { + "category_code": "mod_devices", + "category_name": "带外管理批量重启", + "http_method": "Put", + "url": "/api/cloudboot/v1/devices/power/restart" + }, + { + "category_code": "rm_devices", + "category_name": "带外管理批量关机", + "http_method": "Delete", + "url": "/api/cloudboot/v1/devices/power" + }, + { + "category_code": "mod_devices", + "category_name": "修改带外用户密码", + "http_method": "Put", + "req_param_desensitization": "oob_password_old,oob_password_new", + "url": "/api/cloudboot/v1/devices/{sn}/oob/password" + }, + { + "category_code": "add_jobs", + "category_name": "新增巡检任务", + "http_method": "Post", + "url": "/api/cloudboot/v1/jobs/inspections" + }, + { + "category_code": "mod_user_password", + "category_name": "修改用户密码", + "http_method": "Put", + "req_param_desensitization": "old_password,new_password", + "url": "/api/cloudboot/v1/users/password" + }, + { + "category_code": "mod_gen_pxe", + "category_name": "为目标设备生成PXE文件", + "http_method": "Post", + "url": "/api/cloudboot/v1/devices/{sn}/pxe" + }, + { + "category_code": "mod_centos6_uefi_pxe", + "category_name": "生成centos6 pxe模板", + "http_method": "Post", + "url": "/api/cloudboot/v1/devices/{sn}/centos6/uefi/pxe" + }, + { + "category_code": "submit_cabinet_offline_approval", + "category_name": "发起机架下线审批", + "http_method": "Post", + "url": "/api/cloudboot/v1/approvals/server-cabinets/offlines" + }, + { + "category_code": "submit_cabinet_poweroff_approval", + "category_name": "发起机架关电审批", + "http_method": "Post", + "url": "/api/cloudboot/v1/approvals/server-cabinets/poweroffs" + }, + { + "category_code": "submit_device_migrate_approval", + "category_name": "发起物理机迁移审批", + "http_method": "Post", + "url": "/api/cloudboot/v1/approvals/devices/migrations" + }, + { + "category_code": "submit_device_retire_approval", + "category_name": "发起物理机退役审批", + "http_method": "Post", + "url": "/api/cloudboot/v1/approvals/devices/retirements" + }, + { + "category_code": "submit_device_reinstall_approval", + "category_name": "发起物理机重装审批", + "http_method": "Post", + "url": "/api/cloudboot/v1/approvals/devices/os-reinstallations" + }, + { + "category_code": "return_limiter_token", + "category_name": "归还设备持有的DHCP IP令牌", + "http_method": "Delete", + "url": "/api/cloudboot/v1/devices/{sn}/limiters/tokens" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/devices/store/upload", + "category_code": "upload", + "category_name": "上传设备导入到库房文件" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/devices/store/imports/previews", + "category_code": "add_devices", + "category_name": "物理机导入到库房预览" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/devices/store/imports", + "category_code": "add_devices", + "category_name": "物理机导入到库房" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/devices/stock/upload", + "category_code": "add_devices", + "category_name": "上传存量设备文件" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/devices/stock/imports/previews", + "category_code": "add_devices", + "category_name": "存量设备导入预览" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/devices/stock/imports", + "category_code": "add_devices", + "category_name": "存量设备导入" + }, + { + "http_method": "Put", + "url": "/api/cloudboot/v1/device/operation/status", + "category_code": "mod_device", + "category_name": "修改设备运营状态" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/approvals/devices/migrations/upload", + "category_code": "add_approvals", + "category_name": "上传物理机搬迁文件" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/approvals/devices/migrations/imports/previews", + "category_code": "add_approvals", + "category_name": "物理机搬迁导入预览" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/approvals/devices/migrations/imports", + "category_code": "add_approvals", + "category_name": "物理机搬迁导入" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/approvals/idc/abolish", + "category_code": "add_approvals", + "category_name": "数据中心裁撤审批" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/approvals/server-room/abolish", + "category_code": "add_approvals", + "category_name": "机房裁撤审批" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/approvals/network-area/offline", + "category_code": "add_approvals", + "category_name": "网络区域下线审批" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/approvals/ip/unassign", + "category_code": "add_approvals", + "category_name": "IP回收审批" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/approvals/device/poweroff", + "category_code": "add_approvals", + "category_name": "物理机关电审批" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/approvals/device/restart", + "category_code": "add_approvals", + "category_name": "物理机重启审批" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/approvals/devices/recycle", + "category_code": "add_approvals", + "category_name": "物理机回收审批" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/store-room", + "category_code": "add_store-room", + "category_name": "新增库房" + }, + { + "http_method": "Delete", + "url": "/api/cloudboot/v1/store-room/{id}", + "category_code": "rm_store-room", + "category_name": "删除库房" + }, + { + "http_method": "Put", + "url": "/api/cloudboot/v1/store-room", + "category_code": "mod_store-room", + "category_name": "修改库房" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/store-room/upload", + "category_code": "add_store-room", + "category_name": "上传库房导入文件" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/store-room/imports/previews", + "category_code": "add_store-room", + "category_name": "库房导入预览" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/store-room/imports", + "category_code": "add_store-room", + "category_name": "库房导入" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/virtual-cabinet", + "category_code": "add_virtual-cabinet", + "category_name": "新增虚拟货架" + }, + { + "http_method": "Delete", + "url": "/api/cloudboot/v1/virtual-cabinet/{id}", + "category_code": "rm_virtual-cabinet", + "category_name": "删除虚拟货架" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/network/devices/upload", + "category_code": "add_network", + "category_name": "上传网络设备导入文件" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/network/devices/imports/previews", + "category_code": "add_network", + "category_name": "网络设备导入预览" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/network/devices/imports", + "category_code": "add_network", + "category_name": "网络设备导入" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/ip-networks/upload", + "category_code": "add_ip-networks", + "category_name": "上传网段导入文件" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/ip-networks/imports/previews", + "category_code": "add_ip-networks", + "category_name": "网段导入预览" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/ip-networks/imports", + "category_code": "add_ip-networks", + "category_name": "网段导入" + }, + { + "http_method": "Put", + "url": "/api/cloudboot/v1/ips/status/disable", + "category_code": "mod_ips", + "category_name": "禁用IP" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/special-device", + "category_code": "add_special-device", + "category_name": "新增特殊设备" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/special-devices/upload", + "category_code": "add_special-devices", + "category_name": "上传特殊设备导入文件" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/special-devices/imports/previews", + "category_code": "add_special-devices", + "category_name": "特殊设备导入预览" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/special-devices/imports", + "category_code": "add_special-devices", + "category_name": "特殊设备导入" + }, + { + "http_method": "Put", + "url": "/api/cloudboot/v1/devices/oob/re-access", + "category_code": "mod_devices", + "category_name": "重新纳管带外" + }, + { + "http_method": "Delete", + "url": "/api/cloudboot/v1/devices/limiters/tokens", + "category_code": "rm_devices", + "category_name": "一键释放token" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/devices/{sn}/components/hw-server/logs", + "category_code": "add_devices", + "category_name": "保存hw-server组件日志" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/devices/{sn}/components/peconfig/logs", + "category_code": "add_devices", + "category_name": "保存peconfig组件日志" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/devices/{sn}/components/cloudboot-agent/logs", + "category_code": "add_devices", + "category_name": "保存cloudboot-agent组件日志" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/devices/{sn}/components/winconfig/logs", + "category_code": "add_devices", + "category_name": "保存winconfig组件日志" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/devices/{sn}/components/network-config/logs", + "category_code": "add_devices", + "category_name": "保存系统配置日志" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/devices/{sn}/components/image-clone/logs", + "category_code": "add_devices", + "category_name": "保存镜像制作日志" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/order", + "category_code": "add_order", + "category_name": "新增订单" + }, + { + "http_method": "Delete", + "url": "/api/cloudboot/v1/orders", + "category_code": "rm_orders", + "category_name": "删除订单" + }, + { + "http_method": "Put", + "url": "/api/cloudboot/v1/order", + "category_code": "mod_order", + "category_name": "修改订单" + }, + { + "http_method": "Put", + "url": "/api/cloudboot/v1/order/status", + "category_code": "mod_order", + "category_name": "修改订单状态" + }, + { + "http_method": "Post", + "url": "/api/cloudboot/v1/device-category", + "category_code": "add_device-category", + "category_name": "新增设备类型" + }, + { + "http_method": "Delete", + "url": "/api/cloudboot/v1/device-categories", + "category_code": "rm_device-categories", + "category_name": "删除设备类型" + }, + { + "http_method": "Put", + "url": "/api/cloudboot/v1/device-category", + "category_code": "mod_device-category", + "category_name": "修改设备类型" + }, + { + "http_method": "Delete", + "url": "/api/cloudboot/v1/jobs/{job_id}", + "category_code": "rm_jobs", + "category_name": "删除任务" + }, + { + "http_method": "Put", + "url": "/api/cloudboot/v1/jobs/{job_id}/pausing", + "category_code": "mod_jobs", + "category_name": "暂停任务" + }, + { + "http_method": "Put", + "url": "/api/cloudboot/v1/jobs/{job_id}/unpausing", + "category_code": "mod_jobs", + "category_name": "继续已暂停任务" + }, + { + "http_method": "Post", + "method":"", + "url": "/api/cloudboot/v1/device-setting-rules", + "category_code": "add_device-setting-rules", + "category_name": "新增装机参数规则" + }, + { + "http_method": "Delete", + "method":"", + "url": "/api/cloudboot/v1/device-setting-rules", + "category_code": "rm_device-setting-rules", + "category_name": "删除装机参数规则" + }, + { + "http_method": "Put", + "method":"", + "url": "/api/cloudboot/v1/device-setting-rules", + "category_code": "mod_device-setting-rules", + "category_name": "修改装机参数规则" + }, + { + "category_code": "mod_devices", + "category_name": "自动重装设备", + "http_method": "Put", + "method":"", + "url": "/api/cloudboot/v1/devices/installations/autoreinstalls" + } +] \ No newline at end of file diff --git a/cyclone-server/doc/db/cloudboot.sql b/cyclone-server/doc/db/cloudboot.sql new file mode 100644 index 0000000000000000000000000000000000000000..95d1f458a5081ed535f4391b32c1d092e0fe5523 --- /dev/null +++ b/cyclone-server/doc/db/cloudboot.sql @@ -0,0 +1,959 @@ +-- -------------------------------------------------------- +-- 主机: x +-- 服务器版本: 5.7.38-log - MySQL Community Server (GPL) +-- 服务器操作系统: Linux +-- HeidiSQL 版本: 11.0.0.6063 +-- -------------------------------------------------------- + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET NAMES utf8 */; +/*!50503 SET NAMES utf8mb4 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; + + +-- 导出 cloudboot_cyclone 的数据库结构 +CREATE DATABASE IF NOT EXISTS `cloudboot_cyclone` /*!40100 DEFAULT CHARACTER SET utf8 */; +USE `cloudboot_cyclone`; + +-- 导出 表 cloudboot_cyclone.api_log 结构 +CREATE TABLE IF NOT EXISTS `api_log` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id', + `method` varchar(64) NOT NULL COMMENT 'HTTP请求方法', + `api` text NOT NULL COMMENT '接口方法', + `description` varchar(128) DEFAULT NULL COMMENT '描述信息', + `req_body` mediumtext COMMENT '请求参数', + `status` varchar(16) DEFAULT NULL COMMENT '状态', + `remote_addr` varchar(32) NOT NULL COMMENT '请求地址', + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `operator` varchar(64) DEFAULT NULL COMMENT '操作人', + `msg` text COMMENT '返回信息', + `result` text COMMENT '操作结果', + `time` float(8,3) DEFAULT NULL COMMENT '操作耗时', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8 COMMENT='API操作记录'; + +-- 正在导出表 cloudboot_cyclone.api_log 的数据:~36 rows (大约) +/*!40000 ALTER TABLE `api_log` DISABLE KEYS */; +REPLACE INTO `api_log` (`id`, `method`, `api`, `description`, `req_body`, `status`, `remote_addr`, `created_at`, `operator`, `msg`, `result`, `time`) VALUES + (1, 'DELETE', '/api/cloudboot/v1/image-templates/2', '删除镜像模板', '', 'success', 'localhost:8083', '2023-12-06 21:33:03', 'admin', '操作成功', 'null', 0.002), + (2, 'DELETE', '/api/cloudboot/v1/image-templates/1', '删除镜像模板', '', 'success', 'localhost:8083', '2023-12-06 21:33:04', 'admin', '操作成功', 'null', 0.001), + (3, 'PUT', '/api/cloudboot/v1/device-setting-rules', '修改装机参数规则', '{"condition":"[{\\"value\\": [\\"x86\\"], \\"operator\\": \\"equal\\", \\"attribute\\": \\"arch\\"}]","action":"CentOS 7.9","rule_category":"os","id":9}', 'success', 'localhost:8083', '2023-12-06 21:35:46', 'admin', '操作成功', '{"id":9}', 0.001), + (4, 'DELETE', '/api/cloudboot/v1/device-setting-rules', '删除装机参数规则', '{"ids":[8]}', 'success', 'localhost:8083', '2023-12-06 21:36:06', 'admin', '操作成功', '{"affected":1}', 0.001), + (5, 'DELETE', '/api/cloudboot/v1/image-templates/8', '删除镜像模板', '', 'success', 'localhost:8083', '2023-12-06 21:36:59', 'admin', '操作成功', 'null', 0.001), + (6, 'DELETE', '/api/cloudboot/v1/image-templates/1', '删除镜像模板', '', 'success', 'localhost:8083', '2023-12-06 21:37:01', 'admin', '操作成功', 'null', 0.001), + (7, 'DELETE', '/api/cloudboot/v1/image-templates/3', '删除镜像模板', '', 'success', 'localhost:8083', '2023-12-06 21:37:04', 'admin', '操作成功', 'null', 0.001), + (8, 'DELETE', '/api/cloudboot/v1/image-templates/4', '删除镜像模板', '', 'success', 'localhost:8083', '2023-12-06 21:37:06', 'admin', '操作成功', 'null', 0.001), + (9, 'DELETE', '/api/cloudboot/v1/image-templates/5', '删除镜像模板', '', 'success', 'localhost:8083', '2023-12-06 21:37:09', 'admin', '操作成功', 'null', 0.001), + (10, 'DELETE', '/api/cloudboot/v1/image-templates/7', '删除镜像模板', '', 'success', 'localhost:8083', '2023-12-06 21:37:12', 'admin', '操作成功', 'null', 0.001), + (11, 'PUT', '/api/cloudboot/v1/image-templates/6', '修改镜像模板', '{"family":"CentOS","boot_mode":"uefi","arch":"x86_64","os_lifecycle":"active_default","name":"CentOS 7.9","url":"http://osinstall.idcos.com/images/centos7u9.tar.gz","username":"root","password":"Cyclone@1234","disks":[{"name":"/dev/sda","partitions":[{"size":"200","fstype":"vfat","mountpoint":"/boot/efi","name":"/dev/sda1"},{"size":"1024","fstype":"ext4","mountpoint":"/boot","name":"/dev/sda2"},{"size":"30720","fstype":"ext4","mountpoint":"/","name":"/dev/sda3"},{"size":"10240","fstype":"ext4","mountpoint":"/tmp","name":"/dev/sda4"},{"size":"5120","fstype":"ext4","mountpoint":"/home","name":"/dev/sda5"},{"size":"20480","fstype":"ext4","mountpoint":"/usr/local","name":"/dev/sda6"},{"size":"free","fstype":"ext4","mountpoint":"/data","name":"/dev/sda7"}]}],"pre_script":"","post_script":"# dowload commonSetting.py for setting items in OS\\ncurl -o /tmp/commonSetting.py \\"http://osinstall.idcos.com/scripts/commonSetting.py\\"\\n\\n# config network\\npython /tmp/commonSetting.py --network=Y \\n\\n# change root passwd\\npython /tmp/commonSetting.py --osuser=Y\\n\\n# complete\\npython /tmp/commonSetting.py --complete=Y\\n"}', 'success', 'localhost:8083', '2023-12-06 21:37:54', 'admin', '操作成功', '{"id":6}', 0.001), + (12, 'PUT', '/api/cloudboot/v1/image-templates/6', '修改镜像模板', '{"family":"CentOS","boot_mode":"uefi","arch":"x86_64","os_lifecycle":"active","name":"CentOS 7.9","url":"http://osinstall.idcos.com/images/centos7u9.tar.gz","username":"root","password":"Cyclone@1234","disks":[{"name":"/dev/sda","partitions":[{"size":"200","fstype":"vfat","mountpoint":"/boot/efi","name":"/dev/sda1"},{"size":"1024","fstype":"ext4","mountpoint":"/boot","name":"/dev/sda2"},{"size":"30720","fstype":"ext4","mountpoint":"/","name":"/dev/sda3"},{"size":"10240","fstype":"ext4","mountpoint":"/tmp","name":"/dev/sda4"},{"size":"5120","fstype":"ext4","mountpoint":"/home","name":"/dev/sda5"},{"size":"20480","fstype":"ext4","mountpoint":"/usr/local","name":"/dev/sda6"},{"size":"free","fstype":"ext4","mountpoint":"/data","name":"/dev/sda7"}]}],"pre_script":"","post_script":"# dowload commonSetting.py for setting items in OS\\ncurl -o /tmp/commonSetting.py \\"http://osinstall.idcos.com/scripts/commonSetting.py\\"\\n\\n# config network\\npython /tmp/commonSetting.py --network=Y \\n\\n# change root passwd\\npython /tmp/commonSetting.py --osuser=Y\\n\\n# complete\\npython /tmp/commonSetting.py --complete=Y\\n"}', 'success', 'localhost:8083', '2023-12-06 21:38:04', 'admin', '操作成功', '{"id":6}', 0.001), + (13, 'DELETE', '/api/cloudboot/v1/system-templates/27', '删除系统模板', '', 'success', 'localhost:8083', '2023-12-06 21:39:19', 'admin', '操作成功', 'null', 0.001), + (14, 'DELETE', '/api/cloudboot/v1/system-templates/18', '删除系统模板', '', 'success', 'localhost:8083', '2023-12-06 21:39:21', 'admin', '操作成功', 'null', 0.001), + (15, 'DELETE', '/api/cloudboot/v1/system-templates/19', '删除系统模板', '', 'success', 'localhost:8083', '2023-12-06 21:39:24', 'admin', '操作成功', 'null', 0.001), + (16, 'DELETE', '/api/cloudboot/v1/system-templates/31', '删除系统模板', '', 'success', 'localhost:8083', '2023-12-06 21:39:30', 'admin', '操作成功', 'null', 0.001), + (17, 'DELETE', '/api/cloudboot/v1/system-templates/14', '删除系统模板', '', 'success', 'localhost:8083', '2023-12-06 21:39:34', 'admin', '操作成功', 'null', 0.001), + (18, 'DELETE', '/api/cloudboot/v1/system-templates/15', '删除系统模板', '', 'success', 'localhost:8083', '2023-12-06 21:39:37', 'admin', '操作成功', 'null', 0.001), + (19, 'DELETE', '/api/cloudboot/v1/system-templates/3', '删除系统模板', '', 'success', 'localhost:8083', '2023-12-06 21:39:42', 'admin', '操作成功', 'null', 0.001), + (20, 'DELETE', '/api/cloudboot/v1/system-templates/23', '删除系统模板', '', 'success', 'localhost:8083', '2023-12-06 21:39:45', 'admin', '操作成功', 'null', 0.001), + (21, 'DELETE', '/api/cloudboot/v1/system-templates/30', '删除系统模板', '', 'success', 'localhost:8083', '2023-12-06 21:39:48', 'admin', '操作成功', 'null', 0.001), + (22, 'DELETE', '/api/cloudboot/v1/system-templates/29', '删除系统模板', '', 'success', 'localhost:8083', '2023-12-06 21:39:53', 'admin', '操作成功', 'null', 0.001), + (23, 'DELETE', '/api/cloudboot/v1/system-templates/37', '删除系统模板', '', 'success', 'localhost:8083', '2023-12-06 21:39:57', 'admin', '操作成功', 'null', 0.001), + (24, 'DELETE', '/api/cloudboot/v1/system-templates/38', '删除系统模板', '', 'success', 'localhost:8083', '2023-12-06 21:40:01', 'admin', '操作成功', 'null', 0.001), + (25, 'DELETE', '/api/cloudboot/v1/system-templates/13', '删除系统模板', '', 'success', 'localhost:8083', '2023-12-06 21:40:03', 'admin', '操作成功', 'null', 0.001), + (26, 'DELETE', '/api/cloudboot/v1/system-templates/20', '删除系统模板', '', 'success', 'localhost:8083', '2023-12-06 21:40:29', 'admin', '操作成功', 'null', 0.001), + (27, 'DELETE', '/api/cloudboot/v1/system-templates/26', '删除系统模板', '', 'success', 'localhost:8083', '2023-12-06 21:40:41', 'admin', '操作成功', 'null', 0.001), + (28, 'DELETE', '/api/cloudboot/v1/system-templates/21', '删除系统模板', '', 'success', 'localhost:8083', '2023-12-06 21:41:28', 'admin', '操作成功', 'null', 0.001), + (29, 'DELETE', '/api/cloudboot/v1/system-templates/16', '删除系统模板', '', 'success', 'localhost:8083', '2023-12-06 21:42:51', 'admin', '操作成功', 'null', 0.001), + (30, 'PUT', '/api/cloudboot/v1/system-templates/2', '修改系统模板', '{"family":"BootOS","name":"bootos_arm64","boot_mode":"uefi","arch":"aarch64","os_lifecycle":"testing","username":"","password":"","pxe":"#!ipxe\\nkernel http://osinstall.idcos.com/bootos/aarch64/vmlinuz initrd=initrd.img console=tty0 selinux=0 biosdevname=0 SERVER_ADDR=http://osinstall.idcos.com LOOP_INTERVAL=5 DEVELOPER=1 BOOTIF=01-${netX/mac:hexhyp}\\ninitrd http://osinstall.idcos.com/bootos/aarch64/initrd.img\\nboot\\n","content":"#"}', 'success', 'localhost:8083', '2023-12-06 21:46:22', 'admin', '操作成功', '{"id":2}', 0.002), + (31, 'DELETE', '/api/cloudboot/v1/device-setting-rules', '删除装机参数规则', '{"ids":[16]}', 'success', 'localhost:8083', '2023-12-06 21:56:12', 'admin', '操作成功', '{"affected":1}', 0.001), + (32, 'PUT', '/api/cloudboot/v1/system-templates/17', '修改系统模板', '{"family":"CentOS","name":"CentOS_7.6_aarch64","boot_mode":"uefi","arch":"aarch64","os_lifecycle":"active_default","username":"root","password":"Cyclone@1234","pxe":"#!ipxe\\nkernel http://osinstall.idcos.com/centos/7.6/os/aarch64/images/pxeboot/vmlinuz initrd=initrd.img ksdevice=bootif ks=http://osinstall.idcos.com/api/cloudboot/v1/devices/{sn}/settings/system-template console=tty0 selinux=0 net.ifnames=0 biosdevname=0 BOOTIF=01-${netX/mac:hexhyp}\\ninitrd http://osinstall.idcos.com/centos/7.6/os/aarch64/images/pxeboot/initrd.img\\nboot","content":"install\\nurl --url=http://osinstall.idcos.com/centos/7.6/os/aarch64/\\nlang en_US.UTF-8\\nkeyboard us\\nnetwork --onboot yes --device bootif --bootproto dhcp --noipv6\\nrootpw Cyclone@1234\\nfirewall --disabled\\nauthconfig --enableshadow --passalgo=sha512\\nselinux --disabled\\ntimezone Asia/Shanghai\\ntext\\nreboot\\nzerombr\\nbootloader --location=mbr\\nclearpart --all --initlabel\\npart /boot/efi --fstype=efi --size=200 --ondisk=sda \\npart /boot --fstype=xfs --size=1024 --ondisk=sda\\npart swap --size=8192 --ondisk=sda\\npart / --fstype=xfs --size=30720 --ondisk=sda\\npart /tmp --fstype=xfs --size=10240 --ondisk=sda\\npart /home --fstype=xfs --size=5120 --ondisk=sda\\npart /usr/local --fstype=xfs --size=20480 --ondisk=sda\\npart /data --fstype=xfs --size=1 --grow --ondisk=sda\\n\\n%packages --ignoremissing\\n@base\\n@core\\n@development\\ndmidecode\\n%end\\n\\n%pre\\n_sn=$(dmidecode -s system-serial-number 2>/dev/null | awk \'/^[^#]/ { print $1 }\')\\n\\ncurl -H \\"Content-Type: application/json\\" -X POST -d \\"{\\\\\\"title\\\\\\":\\\\\\"启动OS安装程序\\\\\\",\\\\\\"progress\\\\\\":0.6,\\\\\\"log\\\\\\":\\\\\\"SW5zdGFsbCBPUwo=\\\\\\"}\\" http://osinstall.idcos.com/api/cloudboot/v1/devices/$_sn/installations/progress\\ncurl -H \\"Content-Type: application/json\\" -X POST -d \\"{\\\\\\"title\\\\\\":\\\\\\"分区并安装软件包\\\\\\",\\\\\\"progress\\\\\\":0.7,\\\\\\"log\\\\\\":\\\\\\"SW5zdGFsbCBPUwo=\\\\\\"}\\" http://osinstall.idcos.com/api/cloudboot/v1/devices/$_sn/installations/progress\\n%end\\n\\n%post\\n# dowload commonSetting.py for setting items in OS\\ncurl -o /tmp/commonSetting.py \\"http://osinstall.idcos.com/scripts/commonSetting.py\\"\\n\\n# config network\\npython /tmp/commonSetting.py --network=Y \\n\\n# config osuser\\npython /tmp/commonSetting.py --osuser=Y\\n\\n# complete\\npython /tmp/commonSetting.py --complete=Y\\n%end"}', 'success', 'localhost:8083', '2023-12-07 09:17:50', 'admin', '操作成功', '{"id":17}', 0.003), + (33, 'PUT', '/api/cloudboot/v1/system-templates/17', '修改系统模板', '{"family":"CentOS","name":"CentOS_7.6_aarch64","boot_mode":"uefi","arch":"aarch64","os_lifecycle":"active","username":"root","password":"Cyclone@1234","pxe":"#!ipxe\\nkernel http://osinstall.idcos.com/centos/7.6/os/aarch64/images/pxeboot/vmlinuz initrd=initrd.img ksdevice=bootif ks=http://osinstall.idcos.com/api/cloudboot/v1/devices/{sn}/settings/system-template console=tty0 selinux=0 net.ifnames=0 biosdevname=0 BOOTIF=01-${netX/mac:hexhyp}\\ninitrd http://osinstall.idcos.com/centos/7.6/os/aarch64/images/pxeboot/initrd.img\\nboot","content":"install\\nurl --url=http://osinstall.idcos.com/centos/7.6/os/aarch64/\\nlang en_US.UTF-8\\nkeyboard us\\nnetwork --onboot yes --device bootif --bootproto dhcp --noipv6\\nrootpw Cyclone@1234\\nfirewall --disabled\\nauthconfig --enableshadow --passalgo=sha512\\nselinux --disabled\\ntimezone Asia/Shanghai\\ntext\\nreboot\\nzerombr\\nbootloader --location=mbr\\nclearpart --all --initlabel\\npart /boot/efi --fstype=efi --size=200 --ondisk=sda \\npart /boot --fstype=xfs --size=1024 --ondisk=sda\\npart swap --size=8192 --ondisk=sda\\npart / --fstype=xfs --size=30720 --ondisk=sda\\npart /tmp --fstype=xfs --size=10240 --ondisk=sda\\npart /home --fstype=xfs --size=5120 --ondisk=sda\\npart /usr/local --fstype=xfs --size=20480 --ondisk=sda\\npart /data --fstype=xfs --size=1 --grow --ondisk=sda\\n\\n%packages --ignoremissing\\n@base\\n@core\\n@development\\ndmidecode\\n%end\\n\\n%pre\\n_sn=$(dmidecode -s system-serial-number 2>/dev/null | awk \'/^[^#]/ { print $1 }\')\\n\\ncurl -H \\"Content-Type: application/json\\" -X POST -d \\"{\\\\\\"title\\\\\\":\\\\\\"启动OS安装程序\\\\\\",\\\\\\"progress\\\\\\":0.6,\\\\\\"log\\\\\\":\\\\\\"SW5zdGFsbCBPUwo=\\\\\\"}\\" http://osinstall.idcos.com/api/cloudboot/v1/devices/$_sn/installations/progress\\ncurl -H \\"Content-Type: application/json\\" -X POST -d \\"{\\\\\\"title\\\\\\":\\\\\\"分区并安装软件包\\\\\\",\\\\\\"progress\\\\\\":0.7,\\\\\\"log\\\\\\":\\\\\\"SW5zdGFsbCBPUwo=\\\\\\"}\\" http://osinstall.idcos.com/api/cloudboot/v1/devices/$_sn/installations/progress\\n%end\\n\\n%post\\n# dowload commonSetting.py for setting items in OS\\ncurl -o /tmp/commonSetting.py \\"http://osinstall.idcos.com/scripts/commonSetting.py\\"\\n\\n# config network\\npython /tmp/commonSetting.py --network=Y \\n\\n# config osuser\\npython /tmp/commonSetting.py --osuser=Y\\n\\n# complete\\npython /tmp/commonSetting.py --complete=Y\\n%end"}', 'success', 'localhost:8083', '2023-12-07 09:18:01', 'admin', '操作成功', '{"id":17}', 0.001), + (34, 'PUT', '/api/cloudboot/v1/system-templates/32', '修改系统模板', '{"family":"EulerOS","name":"openEuler release 20.03 (LTS-SP3-x86_64)","boot_mode":"uefi","arch":"x86_64","os_lifecycle":"active_default","username":"root","password":"Cyclone@1234","pxe":"#!ipxe\\nkernel http://osinstall.idcos.com/openEuler/20.03_LTS_SP3/os/x86_64/images/pxeboot/vmlinuz initrd=initrd.img ksdevice=bootif ks=http://osinstall.idcos.com/api/cloudboot/v1/devices/{sn}/settings/system-template console=tty0 selinux=0 net.ifnames=0 biosdevname=0 BOOTIF=01-${netX/mac:hexhyp}\\ninitrd http://osinstall.idcos.com/openEuler/20.03_LTS_SP3/os/x86_64/images/pxeboot/initrd.img\\nboot","content":"#version=openEuler release 20.03 (LTS-SP3)\\n# Reboot after installation\\nreboot\\n# Use text mode install\\ntext\\n\\n\\n%pre --log=/tmp/kickstart_pre.log\\n\\necho \\"which dmidecode:\\"\\nwhich dmidecode\\n_sn=$(/usr/sbin/dmidecode -s system-serial-number 2>/dev/null | awk \'/^[^#]/ { print $1 }\')\\necho \\"system-serial-number:$_sn\\"\\necho \\"curl:http://osinstall.idcos.com/api/cloudboot/v1/devices/$_sn/installations/progress\\"\\ncurl -H \\"Content-Type: application/json\\" -X POST -d \\"{\\\\\\"title\\\\\\":\\\\\\"启动OS安装程序\\\\\\",\\\\\\"progress\\\\\\":0.6,\\\\\\"log\\\\\\":\\\\\\"SW5zdGFsbCBPUwo=\\\\\\"}\\" http://osinstall.idcos.com/api/cloudboot/v1/devices/$_sn/installations/progress\\ncurl -H \\"Content-Type: application/json\\" -X POST -d \\"{\\\\\\"title\\\\\\":\\\\\\"分区并安装软件包\\\\\\",\\\\\\"progress\\\\\\":0.7,\\\\\\"log\\\\\\":\\\\\\"SW5zdGFsbCBPUwo=\\\\\\"}\\" http://osinstall.idcos.com/api/cloudboot/v1/devices/$_sn/installations/progress\\n\\n%end\\n\\n\\n%post --nochroot --log=/mnt/sysimage/tmp/kickstart_post_nochroot.log\\n\\necho \\"Copying %pre stage log files\\"\\n/usr/bin/cp -rv /tmp/kickstart_pre.log /mnt/sysimage/tmp/\\n\\n%end\\n\\n\\n%post --log=/tmp/kickstart_post.log\\n#enable kdump\\n#sed -i \\"s/ crashkernel=512M/ crashkernel=1024M,high /\\" /boot/efi/EFI/openEuler/grub.cfg\\n\\necho \\"dowload commonSetting.py for setting items in OS(chroot):\\"\\ncurl -o /tmp/commonSetting.py \\"http://osinstall.idcos.com/scripts/commonSetting.py\\"\\n\\ncurl -o /tmp/driver_upgrade.sh \\"http://osinstall.idcos.com/scripts/driver_upgrade.sh\\"\\nbash /tmp/driver_upgrade.sh\\n\\n# config network\\npython /tmp/commonSetting.py --network=Y\\n\\n# config osuser\\npython /tmp/commonSetting.py --osuser=Y\\n\\n# complete\\npython /tmp/commonSetting.py --complete=Y\\n%end\\n\\n%packages --ignoremissing\\n#@^minimal-environment\\n@^server-product-environment\\n@standard\\n@system-tools\\n#@development\\n#@performance\\n\\n%end\\n\\n# Keyboard layouts\\nkeyboard --vckeymap=us --xlayouts=\'us\'\\n# System language\\nlang en_US.UTF-8\\n\\n# Firewall configuration\\nfirewall --disabled\\n# Network information\\nnetwork --bootproto=dhcp --device=bootif --ipv6=auto --activate\\nnetwork --hostname=openeuler.webank\\n\\n# Use network installation\\nurl --url=\\"http://osinstall.idcos.com/openEuler/20.03_LTS_SP3/os/x86_64/\\"\\n\\n# System authorization information\\nauth --enableshadow --passalgo=sha512\\n# SELinux configuration\\nselinux --disabled\\n\\n# Do not configure the X Window System\\nskipx\\n# System services\\nservices --disabled=\\"chronyd\\"\\n\\nignoredisk --only-use=sda\\n# Partition clearing information\\nclearpart --all --initlabel --drives=sda\\n# Disk partitioning information\\npart /boot/efi --fstype=\\"efi\\" --ondisk=sda --size=200\\npart /boot --fstype=\\"ext4\\" --ondisk=sda --size=1024\\npart / --fstype=\\"ext4\\" --ondisk=sda --size=30720\\npart /tmp --fstype=\\"ext4\\" --ondisk=sda --size=10240\\npart /home --fstype=\\"ext4\\" --ondisk=sda --size=5120\\npart /usr/local --fstype=\\"ext4\\" --ondisk=sda --size=20480\\npart /data --fstype=\\"ext4\\" --size=1 --grow --ondisk=sda\\n\\n\\n# System timezone\\ntimezone Asia/Shanghai --utc\\n\\n# Root password\\nrootpw Cyclone@1234\\n\\n%addon com_redhat_kdump --disable --reserve-mb=\'128\'\\n\\n%end"}', 'success', 'localhost:8083', '2023-12-07 09:18:40', 'admin', '操作成功', '{"id":32}', 0.001), + (35, 'PUT', '/api/cloudboot/v1/system-templates/28', '修改系统模板', '{"family":"EulerOS","name":"openEuler release 20.03 (LTS-SP3-aarch64)","boot_mode":"uefi","arch":"aarch64","os_lifecycle":"active","username":"root","password":"Cyclone@1234","pxe":"#!ipxe\\nkernel http://osinstall.idcos.com/openEuler/20.03_LTS_SP3/os/aarch64/images/pxeboot/vmlinuz initrd=initrd.img ksdevice=bootif ks=http://osinstall.idcos.com/api/cloudboot/v1/devices/{sn}/settings/system-template console=tty0 selinux=0 net.ifnames=0 biosdevname=0 BOOTIF=01-${netX/mac:hexhyp}\\ninitrd http://osinstall.idcos.com/openEuler/20.03_LTS_SP3/os/aarch64/images/pxeboot/initrd.img\\nboot","content":"#version=openEuler release 20.03 (LTS-SP3)\\n# Reboot after installation\\nreboot\\n# Use text mode install\\ntext\\n\\n\\n%pre --log=/tmp/kickstart_pre.log\\n\\necho \\"which dmidecode:\\"\\nwhich dmidecode\\n_sn=$(/usr/sbin/dmidecode -s system-serial-number 2>/dev/null | awk \'/^[^#]/ { print $1 }\')\\necho \\"system-serial-number:$_sn\\"\\necho \\"curl:http://osinstall.idcos.com/api/cloudboot/v1/devices/$_sn/installations/progress\\"\\ncurl -H \\"Content-Type: application/json\\" -X POST -d \\"{\\\\\\"title\\\\\\":\\\\\\"启动OS安装程序\\\\\\",\\\\\\"progress\\\\\\":0.6,\\\\\\"log\\\\\\":\\\\\\"SW5zdGFsbCBPUwo=\\\\\\"}\\" http://osinstall.idcos.com/api/cloudboot/v1/devices/$_sn/installations/progress\\ncurl -H \\"Content-Type: application/json\\" -X POST -d \\"{\\\\\\"title\\\\\\":\\\\\\"分区并安装软件包\\\\\\",\\\\\\"progress\\\\\\":0.7,\\\\\\"log\\\\\\":\\\\\\"SW5zdGFsbCBPUwo=\\\\\\"}\\" http://osinstall.idcos.com/api/cloudboot/v1/devices/$_sn/installations/progress\\n\\n%end\\n\\n\\n%post --nochroot --log=/mnt/sysimage/tmp/kickstart_post_nochroot.log\\n\\necho \\"Copying %pre stage log files\\"\\n/usr/bin/cp -rv /tmp/kickstart_pre.log /mnt/sysimage/tmp/\\n\\n%end\\n\\n\\n%post --log=/tmp/kickstart_post.log\\n#enable kdump\\n#sed -i \\"s/ crashkernel=512M/ crashkernel=1024M,high /\\" /boot/efi/EFI/openEuler/grub.cfg\\n\\nvirsh net-destroy default\\n\\necho \\"dowload commonSetting.py for setting items in OS(chroot):\\"\\ncurl -o /tmp/commonSetting.py \\"http://osinstall.idcos.com/scripts/commonSetting.py\\"\\n#curl -o /tmp/driver_upgrade_aarch64.sh \\"http://osinstall.idcos.com/scripts/driver_upgrade_aarch64.sh\\"\\n#bash /tmp/driver_upgrade_aarch64.sh\\n# config network\\npython /tmp/commonSetting.py --network=Y\\n\\n# config osuser\\npython /tmp/commonSetting.py --osuser=Y\\n\\n# complete\\npython /tmp/commonSetting.py --complete=Y\\n%end\\n\\n%packages --ignoremissing\\n#@^minimal-environment\\n@^server-product-environment\\n@standard\\n@system-tools\\n#@development\\n#@performance\\n\\n%end\\n\\n# Keyboard layouts\\nkeyboard --vckeymap=us --xlayouts=\'us\'\\n# System language\\nlang en_US.UTF-8\\n\\n# Firewall configuration\\nfirewall --disabled\\n# Network information\\nnetwork --bootproto=dhcp --device=bootif --ipv6=auto --activate\\nnetwork --hostname=openeuler.webank\\n\\n# Use network installation\\nurl --url=\\"http://osinstall.idcos.com/openEuler/20.03_LTS_SP3/os/aarch64/\\"\\ndriverdisk --source=\\"http://osinstall.idcos.com/openEuler/20.03_LTS_SP3/drivers/aarch64/openEuler-20.03-LTS-SP3.iso\\"\\n# System authorization information\\nauth --enableshadow --passalgo=sha512\\n# SELinux configuration\\nselinux --disabled\\n\\n# Do not configure the X Window System\\nskipx\\n# System services\\nservices --disabled=\\"chronyd\\"\\n\\nignoredisk --only-use=sda\\n# Partition clearing information\\nclearpart --all --initlabel --drives=sda\\n# Disk partitioning information\\npart /boot/efi --fstype=\\"efi\\" --ondisk=sda --size=200\\npart /boot --fstype=\\"ext4\\" --ondisk=sda --size=1024\\npart / --fstype=\\"ext4\\" --ondisk=sda --size=30720\\npart /tmp --fstype=\\"ext4\\" --ondisk=sda --size=10240\\npart /home --fstype=\\"ext4\\" --ondisk=sda --size=5120\\npart /usr/local --fstype=\\"ext4\\" --ondisk=sda --size=20480\\npart /data --fstype=\\"ext4\\" --size=1 --grow --ondisk=sda\\n\\n\\n# System timezone\\ntimezone Asia/Shanghai --utc\\n\\n# Root password\\nrootpw Cyclone@1234\\n\\n%addon com_redhat_kdump --disable --reserve-mb=\'128\'\\n\\n%end"}', 'success', 'localhost:8083', '2023-12-07 09:18:58', 'admin', '操作成功', '{"id":28}', 0.001), + (36, 'PUT', '/api/cloudboot/v1/system-templates/25', '修改系统模板', '{"family":"CentOS","name":"CentOS 7.9","boot_mode":"uefi","arch":"x86_64","os_lifecycle":"active","username":"root","password":"Cyclone@1234","pxe":"#!ipxe\\nkernel http://osinstall.idcos.com/centos/7.9/os/x86_64/images/pxeboot/vmlinuz initrd=initrd.img ksdevice=bootif ks=http://osinstall.idcos.com/api/cloudboot/v1/devices/${serial}/settings/system-template console=tty0 selinux=0 net.ifnames=0 biosdevname=0 BOOTIF=01-${netX/mac:hexhyp}\\ninitrd http://osinstall.idcos.com/centos/7.9/os/x86_64/images/pxeboot/initrd.img\\nboot\\n","content":"install\\nurl --url=http://osinstall.idcos.com/centos/7.9/os/x86_64/\\nlang en_US.UTF-8\\nkeyboard us\\nnetwork --onboot yes --device bootif --bootproto dhcp --noipv6\\nrootpw Cyclone@1234\\nfirewall --disabled\\nauthconfig --enableshadow --passalgo=sha512\\nselinux --disabled\\ntimezone Asia/Shanghai\\ntext\\nreboot\\nzerombr\\nbootloader --location=mbr\\nclearpart --all --initlabel\\npart /boot/efi --fstype=efi --size=200 --ondisk=sda \\npart /boot --fstype=ext4 --size=1024 --ondisk=sda\\npart swap --size=8192 --ondisk=sda\\npart / --fstype=ext4 --size=30720 --ondisk=sda\\npart /tmp --fstype=ext4 --size=10240 --ondisk=sda\\npart /home --fstype=ext4 --size=5120 --ondisk=sda\\npart /usr/local --fstype=ext4 --size=20480 --ondisk=sda\\npart /data --fstype=ext4 --size=1 --grow --ondisk=sda\\n\\n%packages --ignoremissing\\n@base\\n@core\\n@development\\ndmidecode\\n%end\\n\\n%pre\\n_sn=$(dmidecode -s system-serial-number 2>/dev/null | awk \'/^[^#]/ { print $1 }\')\\n\\ncurl -H \\"Content-Type: application/json\\" -X POST -d \\"{\\\\\\"title\\\\\\":\\\\\\"启动OS安装程序\\\\\\",\\\\\\"progress\\\\\\":0.6,\\\\\\"log\\\\\\":\\\\\\"SW5zdGFsbCBPUwo=\\\\\\"}\\" http://osinstall.idcos.com/api/cloudboot/v1/devices/$_sn/installations/progress\\ncurl -H \\"Content-Type: application/json\\" -X POST -d \\"{\\\\\\"title\\\\\\":\\\\\\"分区并安装软件包\\\\\\",\\\\\\"progress\\\\\\":0.7,\\\\\\"log\\\\\\":\\\\\\"SW5zdGFsbCBPUwo=\\\\\\"}\\" http://osinstall.idcos.com/api/cloudboot/v1/devices/$_sn/installations/progress\\n%end\\n\\n%post\\n# dowload commonSetting.py for setting items in OS\\ncurl -o /tmp/commonSetting.py \\"http://osinstall.idcos.com/scripts/commonSetting.py\\"\\n\\n# config network\\npython /tmp/commonSetting.py --network=Y\\n\\n# change root passwd\\npython /tmp/commonSetting.py --osuser=Y\\n\\n# complete\\npython /tmp/commonSetting.py --complete=Y\\n%end"}', 'success', 'localhost:8083', '2023-12-07 09:19:23', 'admin', '操作成功', '{"id":25}', 0.001); +/*!40000 ALTER TABLE `api_log` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.approval 结构 +CREATE TABLE IF NOT EXISTS `approval` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id', + `title` varchar(255) DEFAULT NULL COMMENT '审批标题', + `type` varchar(255) DEFAULT NULL COMMENT '审批类型', + `metadata` json DEFAULT NULL COMMENT '元数据(JSON对象)', + `front_data` json DEFAULT NULL COMMENT '全量元数据', + `initiator` varchar(255) DEFAULT NULL COMMENT '发起人ID', + `approvers` json DEFAULT NULL COMMENT '审批人ID列表(JSON字符串数组)', + `cc` json DEFAULT NULL COMMENT '抄送人ID列表(JSON字符串数组)', + `remark` varchar(255) DEFAULT NULL COMMENT '备注', + `start_time` timestamp NULL DEFAULT NULL COMMENT '审批开始时间', + `end_time` timestamp NULL DEFAULT NULL COMMENT '审批结束时间', + `is_rejected` enum('yes','no') DEFAULT NULL COMMENT '审批单是否被拒绝', + `status` enum('approval','completed','revoked','failure') DEFAULT NULL COMMENT '审批流水状态。approval-审批中; completed-已完成; revoked-已撤销;failure--失败', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='审批表'; + +-- 正在导出表 cloudboot_cyclone.approval 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `approval` DISABLE KEYS */; +/*!40000 ALTER TABLE `approval` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.approval_step 结构 +CREATE TABLE IF NOT EXISTS `approval_step` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id', + `approval_id` int(11) unsigned NOT NULL COMMENT '所属审批id', + `approver` varchar(255) DEFAULT NULL COMMENT '审批步骤审批人ID', + `next_approver` varchar(255) DEFAULT NULL COMMENT '下一审批步骤审批人ID', + `title` varchar(255) DEFAULT NULL COMMENT '审批步骤标题', + `action` enum('agree','reject') DEFAULT NULL COMMENT '审批步骤动作。agree-同意; reject-拒绝;', + `remark` varchar(2048) DEFAULT NULL COMMENT '审批步骤备注', + `start_time` timestamp NULL DEFAULT NULL COMMENT '审批步骤开始时间', + `end_time` timestamp NULL DEFAULT NULL COMMENT '审批步骤结束时间', + `hooks` json DEFAULT NULL COMMENT '当前步骤审批通过后的钩子字符串数组', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='审批步骤表'; + +-- 正在导出表 cloudboot_cyclone.approval_step 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `approval_step` DISABLE KEYS */; +/*!40000 ALTER TABLE `approval_step` ENABLE KEYS */; + +-- 导出 视图 cloudboot_cyclone.cabinet_power_info 结构 +-- 创建临时表以解决视图依赖性错误 +CREATE TABLE `cabinet_power_info` ( + `id` INT(11) UNSIGNED NOT NULL, + `number` VARCHAR(255) NULL COMMENT '编号' COLLATE 'utf8_general_ci', + `is_enabled` ENUM('yes','no') NULL COMMENT '是否启用' COLLATE 'utf8_general_ci', + `is_powered` ENUM('yes','no') NULL COMMENT '是否开电' COLLATE 'utf8_general_ci', + `idc` VARCHAR(255) NULL COMMENT '名称' COLLATE 'utf8_general_ci', + `server_room` VARCHAR(255) NULL COMMENT '机房管理单元名称' COLLATE 'utf8_general_ci', + `network_area` VARCHAR(255) NULL COMMENT '网络区域名称' COLLATE 'utf8_general_ci', + `max_power` VARCHAR(255) NULL COMMENT '最大功率' COLLATE 'utf8_general_ci', + `usite_total` BIGINT(21) NULL, + `used_count` BIGINT(21) NULL, + `free_count` BIGINT(21) NULL, + `pre_occupied_count` BIGINT(21) NULL, + `disabled_count` BIGINT(21) NULL, + `known_used_power` DECIMAL(65,0) NULL, + `free_power` VARCHAR(255) NULL COLLATE 'utf8_general_ci', + `is_unknown_power_svr_count` DECIMAL(23,0) NULL +) ENGINE=MyISAM; + +-- 导出 表 cloudboot_cyclone.component_log 结构 +CREATE TABLE IF NOT EXISTS `component_log` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `sn` varchar(255) DEFAULT NULL COMMENT '设备序列号', + `component` enum('agent','hw-server','peconfig','winconfig','peagent') DEFAULT NULL COMMENT '日志所属组件', + `log` longtext COMMENT '日志内容', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='设备操作系统安装/配置过程中的文件日志'; + +-- 正在导出表 cloudboot_cyclone.component_log 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `component_log` DISABLE KEYS */; +/*!40000 ALTER TABLE `component_log` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.data_dict 结构 +CREATE TABLE IF NOT EXISTS `data_dict` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `type` varchar(255) NOT NULL COMMENT '类型/标签', + `name` varchar(255) NOT NULL COMMENT '数据字典键', + `value` varchar(255) NOT NULL COMMENT '数据字典值', + `remark` varchar(255) DEFAULT NULL COMMENT '备注/说明', + PRIMARY KEY (`id`), + UNIQUE KEY `type` (`type`,`name`) +) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8 COMMENT='数据字典表'; + +-- 正在导出表 cloudboot_cyclone.data_dict 的数据:~17 rows (大约) +/*!40000 ALTER TABLE `data_dict` DISABLE KEYS */; +REPLACE INTO `data_dict` (`id`, `created_at`, `updated_at`, `deleted_at`, `type`, `name`, `value`, `remark`) VALUES + (1, '2018-06-06 12:00:00', '2018-06-06 12:00:00', NULL, 'firmware', 'bios', 'BIOS', NULL), + (2, '2018-06-06 12:00:00', '2018-06-06 12:00:00', NULL, 'firmware', 'ilo', 'HP iLO', NULL), + (3, '2018-06-06 12:00:00', '2018-06-06 12:00:00', NULL, 'firmware', 'idrac', 'Dell iDRAC', NULL), + (4, '2018-06-06 12:00:00', '2018-06-06 12:00:00', NULL, 'firmware', 'raid', 'RAID', NULL), + (5, '2018-06-06 12:00:00', '2018-06-06 12:00:00', NULL, 'firmware', 'nic', '网卡', NULL), + (6, '2018-06-06 12:00:00', '2018-06-06 12:00:00', NULL, 'firmware', 'hba', 'HBA', NULL), + (7, '2018-06-06 12:00:00', '2018-06-06 12:00:00', NULL, 'firmware', 'backplane_dell', 'Dell Backplane背板', NULL), + (8, '2018-06-06 12:00:00', '2018-06-06 12:00:00', NULL, 'os_family', 'RedHat', 'RedHat', NULL), + (9, '2018-06-06 12:00:00', '2018-06-06 12:00:00', NULL, 'os_family', 'CentOS', 'CentOS', NULL), + (10, '2018-06-06 12:00:00', '2018-06-06 12:00:00', NULL, 'os_family', 'SUSE', 'SUSE', NULL), + (11, '2018-06-06 12:00:00', '2018-06-06 12:00:00', NULL, 'os_family', 'Ubuntu', 'Ubuntu', NULL), + (12, '2018-06-06 12:00:00', '2018-06-06 12:00:00', NULL, 'os_family', 'Windows Server', 'Windows Server', NULL), + (13, '2018-06-06 12:00:00', '2018-06-06 12:00:00', NULL, 'os_family', 'VMware ESXi', 'VMware ESXI', NULL), + (14, '2018-06-06 12:00:00', '2018-06-06 12:00:00', NULL, 'os_family', 'XenServer', 'XenServer', NULL), + (15, '2023-02-17 12:00:00', '2023-02-17 12:00:00', NULL, 'os_family', 'EulerOS', 'EulerOS', NULL), + (16, '2023-02-17 12:00:00', '2023-02-17 12:00:00', NULL, 'os_family', 'BootOS', 'BootOS', NULL), + (17, '2023-02-17 12:00:00', '2023-02-17 12:00:00', NULL, 'os_family', 'Custom', 'Custom', NULL); +/*!40000 ALTER TABLE `data_dict` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.device 结构 +CREATE TABLE IF NOT EXISTS `device` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `fixed_asset_number` varchar(255) DEFAULT NULL COMMENT '固定资产编号', + `sn` varchar(255) DEFAULT NULL COMMENT '序列号', + `vendor` varchar(255) DEFAULT NULL COMMENT '产品厂商', + `model` varchar(255) DEFAULT NULL COMMENT '产品型号', + `power_status` enum('power_on','power_off') DEFAULT 'power_off' COMMENT '电源状态。可选值: power_on-开电; power_off-关电;', + `oob_accessible` enum('yes','no') DEFAULT NULL COMMENT '带外纳管状态', + `arch` varchar(255) DEFAULT NULL COMMENT 'CPU硬件架构', + `usage` varchar(255) DEFAULT NULL COMMENT '用途', + `category` varchar(255) DEFAULT NULL COMMENT '设备类型', + `idc_id` int(11) unsigned DEFAULT NULL COMMENT '数据中心ID', + `server_room_id` int(11) unsigned DEFAULT NULL COMMENT '机房管理单元ID', + `server_cabinet_id` int(11) unsigned DEFAULT NULL COMMENT '机架(柜)ID', + `server_usite_id` int(11) unsigned DEFAULT NULL COMMENT '机位(U位)ID', + `store_room_id` int(11) unsigned DEFAULT NULL COMMENT '库房管理单元ID', + `virtual_cabinet_id` int(11) unsigned DEFAULT NULL COMMENT '虚拟货架ID', + `hardware_remark` varchar(1024) DEFAULT NULL COMMENT '硬件说明', + `raid_remark` varchar(1024) DEFAULT NULL COMMENT 'RAID说明', + `oob_init` json DEFAULT NULL COMMENT 'OOB初始带外用户及密码', + `started_at` datetime DEFAULT NULL COMMENT '启用时间', + `onshelve_at` datetime DEFAULT NULL COMMENT '上架时间', + `operation_status` enum('run_with_alarm','run_without_alarm','reinstalling','moving','pre_retire','retiring','retired','pre_deploy','on_shelve','recycling','maintaining','pre_move','in_store') DEFAULT NULL COMMENT '运营状态:运营中(需告警),运营中(无需告警),重装中,搬迁中,待退役,退役中,已退役,待部署,已上架,回收中,维护中,待搬迁', + `oob_ip` varchar(256) DEFAULT NULL COMMENT '带外IP', + `oob_user` varchar(256) DEFAULT NULL COMMENT '带外用户名', + `oob_password` varchar(256) DEFAULT NULL COMMENT '带外密码', + `cpu_sum` int(11) DEFAULT '0' COMMENT 'CPU总核数', + `cpu` json DEFAULT NULL COMMENT 'CPU列表(JSON)', + `memory_sum` int(11) DEFAULT '0' COMMENT '内存总容量(MB)', + `memory` json DEFAULT NULL COMMENT '内存列表(JSON)', + `disk_sum` int(11) DEFAULT '0' COMMENT '逻辑磁盘总容量(GB)', + `disk` json DEFAULT NULL COMMENT '逻辑磁盘列表(JSON)', + `disk_slot` json DEFAULT NULL COMMENT '物理磁盘列表(JSON)', + `nic` json DEFAULT NULL COMMENT '网卡列表(JSON)', + `nic_device` text COMMENT '网卡厂商', + `bootos_ip` varchar(256) DEFAULT NULL COMMENT 'BootOS IP', + `bootos_mac` varchar(256) DEFAULT NULL COMMENT 'BootOS 网口MAC地址', + `motherboard` json DEFAULT NULL COMMENT '主板(JSON)', + `raid` json DEFAULT NULL COMMENT 'RAID卡', + `oob` json DEFAULT NULL COMMENT '带外', + `bios` json DEFAULT NULL COMMENT 'BIOS', + `fan` json DEFAULT NULL COMMENT '风扇', + `power` json DEFAULT NULL COMMENT '电源', + `hba` json DEFAULT NULL COMMENT 'HBA卡', + `pci` json DEFAULT NULL COMMENT 'PCI插槽', + `switch` json DEFAULT NULL COMMENT '交换机', + `lldp` json DEFAULT NULL COMMENT '交换机信息(JSON)', + `extra` json DEFAULT NULL COMMENT '用户自定义扩展(JSON)', + `origin_node` varchar(255) DEFAULT NULL COMMENT '源节点', + `origin_node_ip` varchar(255) DEFAULT NULL COMMENT '分布式部署下的源节点IP', + `operation_user_id` varchar(255) DEFAULT NULL COMMENT '运维管理用户id', + `creator` varchar(255) DEFAULT NULL COMMENT '记录创建者ID', + `updater` varchar(255) DEFAULT NULL COMMENT '记录更新者ID', + `remark` varchar(1024) DEFAULT NULL COMMENT '备注', + `order_number` varchar(255) DEFAULT NULL COMMENT '订单编号', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_device_sn` (`sn`) USING BTREE, + UNIQUE KEY `uk_device_idc_room_cabinet_usite` (`idc_id`,`server_room_id`,`server_cabinet_id`,`server_usite_id`), + UNIQUE KEY `uk_device_fixed_asset_number` (`fixed_asset_number`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='物理机设备表'; + +-- 正在导出表 cloudboot_cyclone.device 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `device` DISABLE KEYS */; +/*!40000 ALTER TABLE `device` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.device_category 结构 +CREATE TABLE IF NOT EXISTS `device_category` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `category` varchar(255) DEFAULT NULL COMMENT '设备类型', + `hardware` varchar(255) DEFAULT NULL COMMENT '硬件配置', + `central_processor_manufacture` varchar(255) DEFAULT NULL COMMENT '处理器生产商', + `central_processor_arch` varchar(255) DEFAULT NULL COMMENT '处理器架构', + `power` varchar(255) DEFAULT NULL COMMENT '功率', + `unit` int(11) DEFAULT '2' COMMENT '设备U数', + `is_fiti_eco_product` enum('yes','no') DEFAULT 'no' COMMENT '是否金融信创生态产品:yes-是;no-否;', + `remark` varchar(1024) DEFAULT NULL COMMENT '备注', + `creator` varchar(255) DEFAULT NULL COMMENT '记录创建者', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_category` (`category`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='设备类型表'; + +-- 正在导出表 cloudboot_cyclone.device_category 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `device_category` DISABLE KEYS */; +/*!40000 ALTER TABLE `device_category` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.device_lifecycle 结构 +CREATE TABLE IF NOT EXISTS `device_lifecycle` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `fixed_asset_number` varchar(255) DEFAULT NULL COMMENT '固定资产编号', + `sn` varchar(255) NOT NULL COMMENT '序列号', + `asset_belongs` varchar(255) DEFAULT NULL COMMENT '资产归属', + `owner` varchar(255) DEFAULT NULL COMMENT '负责人', + `is_rental` enum('yes','no') DEFAULT 'no' COMMENT '是否租赁:yes-是;no-否;', + `maintenance_service_provider` varchar(255) DEFAULT NULL COMMENT '维保服务供应商', + `maintenance_service` text COMMENT '维保服务详细内容', + `logistics_service` text COMMENT '物流服务详细内容', + `maintenance_service_date_begin` datetime DEFAULT NULL COMMENT '维保服务起始日期', + `maintenance_service_date_end` datetime DEFAULT NULL COMMENT '维保服务截止日期', + `maintenance_service_status` enum('under_warranty','out_of_warranty','inactive') DEFAULT 'under_warranty' COMMENT '维保状态:在保-under_warranty;过保-out_of_warranty;未激活-inactive', + `device_retired_date` date DEFAULT NULL COMMENT '设备退役时间', + `lifecycle_log` json DEFAULT NULL COMMENT '变更记录(JSON)', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_sn` (`sn`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='设备生命周期表'; + +-- 正在导出表 cloudboot_cyclone.device_lifecycle 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `device_lifecycle` DISABLE KEYS */; +/*!40000 ALTER TABLE `device_lifecycle` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.device_log 结构 +CREATE TABLE IF NOT EXISTS `device_log` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id', + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `sn` varchar(255) DEFAULT NULL COMMENT '设备序列号', + `device_setting_id` int(11) unsigned NOT NULL COMMENT '设备装机参数ID', + `type` enum('install','install_history') NOT NULL COMMENT '进度日志类型。install-安装中的进度日志; install_history-历史的装机进度日志;', + `title` varchar(1024) NOT NULL COMMENT '进度日志标题', + `content` longtext COMMENT '进度日志内容', + PRIMARY KEY (`id`), + KEY `idx_device_log_sn` (`sn`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='操作系统安装进度日志表'; + +-- 正在导出表 cloudboot_cyclone.device_log 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `device_log` DISABLE KEYS */; +/*!40000 ALTER TABLE `device_log` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.device_oob_history 结构 +CREATE TABLE IF NOT EXISTS `device_oob_history` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `sn` varchar(255) DEFAULT NULL COMMENT '序列号', + `username_old` varchar(255) NOT NULL COMMENT '修改前带外用户名', + `username_new` varchar(255) NOT NULL COMMENT '修改后带外用户名', + `password_old` varchar(255) NOT NULL COMMENT '修改前带外密码(加密)', + `password_new` varchar(255) NOT NULL COMMENT '修改后带外密码(加密)', + `creator` varchar(255) DEFAULT NULL COMMENT '记录创建者ID', + `remark` varchar(1024) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='带外账户修改的操作历史记录表'; + +-- 正在导出表 cloudboot_cyclone.device_oob_history 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `device_oob_history` DISABLE KEYS */; +/*!40000 ALTER TABLE `device_oob_history` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.device_setting 结构 +CREATE TABLE IF NOT EXISTS `device_setting` ( + `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id', + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `installation_start_time` datetime DEFAULT NULL COMMENT '安装开始时间', + `installation_end_time` datetime DEFAULT NULL COMMENT '安装结束时间', + `sn` varchar(255) NOT NULL COMMENT '设备序列号', + `hardware_template_id` int(11) DEFAULT '0' COMMENT '硬件配置模板ID', + `image_template_id` int(11) DEFAULT '0' COMMENT '镜像安装模板ID', + `system_template_id` int(11) DEFAULT NULL COMMENT '系统安装模板ID', + `need_extranet_ip` enum('yes','no') DEFAULT NULL COMMENT '是否需要外网IP', + `extranet_ip_network_id` int(11) DEFAULT NULL COMMENT '外网IP所属网段ID', + `extranet_ip` varchar(255) DEFAULT NULL COMMENT '外网IP', + `intranet_ip_network_id` int(11) DEFAULT NULL COMMENT '内网IP所属网段ID', + `intranet_ip` varchar(255) DEFAULT NULL COMMENT '内网IP', + `install_type` enum('image','pxe') DEFAULT 'image' COMMENT '系统安装方式。image-镜像安装; pxe-PXE安装;', + `install_progress` decimal(11,4) DEFAULT '0.0000' COMMENT '装机进度值', + `status` enum('pre_install','installing','failure','success') DEFAULT NULL COMMENT '装机状态。pre_install-等待安装; installing-正在安装; failure-安装失败; success-安装成功;', + `creator` varchar(255) DEFAULT NULL COMMENT '记录创建者ID', + `updater` varchar(255) DEFAULT NULL COMMENT '记录更新者ID', + `need_intranet_ipv6` enum('yes','no') DEFAULT 'no' COMMENT '是否需要内网IPv6', + `need_extranet_ipv6` enum('yes','no') DEFAULT 'no' COMMENT '是否需要外网IPv6', + `extranet_ipv6_network_id` int(11) DEFAULT '0' COMMENT '外网IPv6所属网段ID', + `extranet_ipv6` varchar(255) DEFAULT NULL COMMENT '外网IPv6', + `intranet_ipv6_network_id` int(11) DEFAULT '0' COMMENT '内网IPv6所属网段ID', + `intranet_ipv6` varchar(255) DEFAULT NULL COMMENT '内网IPv6', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_device_setting_sn` (`sn`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='设备装机参数表'; + +-- 正在导出表 cloudboot_cyclone.device_setting 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `device_setting` DISABLE KEYS */; +/*!40000 ALTER TABLE `device_setting` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.device_setting_rule 结构 +CREATE TABLE IF NOT EXISTS `device_setting_rule` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `condition` json NOT NULL COMMENT '前件', + `action` text NOT NULL COMMENT '结论', + `rule_category` enum('os','network','raid') NOT NULL COMMENT '规则分类', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8 COMMENT='产生式部署参数规则表'; + +-- 正在导出表 cloudboot_cyclone.device_setting_rule 的数据:~16 rows (大约) +/*!40000 ALTER TABLE `device_setting_rule` DISABLE KEYS */; +REPLACE INTO `device_setting_rule` (`id`, `created_at`, `updated_at`, `deleted_at`, `condition`, `action`, `rule_category`) VALUES + (1, NULL, NULL, NULL, '[{"value": ["DMZ"], "operator": "contains", "attribute": "physical_area"}]', 'la_wa', 'network'), + (2, NULL, NULL, NULL, '[{"value": ["ECN"], "operator": "contains", "attribute": "physical_area"}]', 'la_wa', 'network'), + (3, NULL, NULL, NULL, '[{"value": ["Management"], "operator": "contains", "attribute": "physical_area"}]', 'la', 'network'), + (4, NULL, NULL, NULL, '[{"value": ["BDP"], "operator": "contains", "attribute": "physical_area"}]', 'la', 'network'), + (5, NULL, NULL, NULL, '[{"value": ["ServerFarm"], "operator": "contains", "attribute": "physical_area"}]', 'la', 'network'), + (6, NULL, NULL, NULL, '[{"value": ["Q-Zone"], "operator": "contains", "attribute": "physical_area"}]', 'la_wa', 'network'), + (7, NULL, '2023-11-28 14:30:33', NULL, '[{"value": ["arm"], "operator": "equal", "attribute": "arch"}]', 'openEuler release 20.03 (LTS-SP3-aarch64)', 'os'), + (9, NULL, '2023-12-06 21:35:46', NULL, '[{"value": ["x86"], "operator": "equal", "attribute": "arch"}]', 'CentOS 7.9', 'os'), + (10, NULL, NULL, NULL, '[{"value": ["Y1-WBCN11-10G", "Y1-WBCG11-10G", "Y1-CN01-10G", "Y1-CN02-10G"], "operator": "in", "attribute": "category"}]', '[6+6]RAID50', 'raid'), + (11, NULL, NULL, NULL, '[{"value": ["Y1-WBCG13-10G", "Y1-WBCG12-10G", "Y1-WBCG14-10G", "Y1-WBGI50-10G", "Y1-CG03-10G", "Y1-CG02-10G", "YI-GI30-10G"], "operator": "in", "attribute": "category"}]', 'RAID1', 'raid'), + (12, NULL, NULL, NULL, '[{"value": ["Y1-WBSH15-10G", "Y1-WBSH13-10G", "Y1-WBSH14-10G", "Y1-WBGT1-100G", "SH2-10G"], "operator": "in", "attribute": "category"}]', 'NORAID', 'raid'), + (13, NULL, NULL, NULL, '[{"value": ["Y1-WBBX12-10G"], "operator": "in", "attribute": "category"}, {"value": ["and"], "operator": "equal", "attribute": "logical_operator"}, {"value": ["h3c"], "operator": "equal", "attribute": "vendor"}]', '2RAID1+12RAID0', 'raid'), + (14, NULL, NULL, NULL, '[{"value": ["Y1-WBBX12-10G", "Y1-BX02-10G"], "operator": "in", "attribute": "category"}, {"value": ["and"], "operator": "equal", "attribute": "logical_operator"}, {"value": ["lenovo", "inspur", "huawei", "dell"], "operator": "in", "attribute": "vendor"}]', '12RAID0+2RAID1', 'raid'), + (15, NULL, NULL, NULL, '[{"value": ["GA-B30-10G"], "operator": "in", "attribute": "category"}]', '12RAID0+2RAID1', 'raid'), + (17, NULL, '2021-09-02 17:44:36', NULL, '[{"value": ["GA-F10-10G"], "operator": "in", "attribute": "category"}]', '12RAID0+2RAID1+2RAID1', 'raid'), + (18, '2023-11-28 14:31:54', '2023-11-28 14:31:54', NULL, '[{"value": ["GA-TG10-25G"], "operator": "in", "attribute": "category"}]', '[1-13]RAID0', 'raid'); +/*!40000 ALTER TABLE `device_setting_rule` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.dhcp_token_bucket 结构 +CREATE TABLE IF NOT EXISTS `dhcp_token_bucket` ( + `token` varchar(255) NOT NULL DEFAULT '' COMMENT '令牌', + `bucket` varchar(255) NOT NULL DEFAULT '' COMMENT '所属令牌桶(TOR)', + `sn` varchar(255) DEFAULT NULL COMMENT '关联的设备序列号', + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + PRIMARY KEY (`token`), + UNIQUE KEY `uk_sn_dhcp_token_bucket` (`sn`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='设备请求dhcp ip的令牌记录表'; + +-- 正在导出表 cloudboot_cyclone.dhcp_token_bucket 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `dhcp_token_bucket` DISABLE KEYS */; +/*!40000 ALTER TABLE `dhcp_token_bucket` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.hardware_template 结构 +CREATE TABLE IF NOT EXISTS `hardware_template` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `name` varchar(255) DEFAULT NULL COMMENT '硬件模板名', + `vendor` varchar(255) NOT NULL COMMENT '厂商', + `model` varchar(255) NOT NULL COMMENT '型号', + `builtin` enum('yes','no') NOT NULL DEFAULT 'yes' COMMENT '是否是系统内置模板', + `data` json DEFAULT NULL COMMENT '硬件配置数据', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_hardware_template_name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COMMENT='硬件配置模板表'; + +-- 正在导出表 cloudboot_cyclone.hardware_template 的数据:~10 rows (大约) +/*!40000 ALTER TABLE `hardware_template` DISABLE KEYS */; +REPLACE INTO `hardware_template` (`id`, `created_at`, `updated_at`, `deleted_at`, `name`, `vendor`, `model`, `builtin`, `data`) VALUES + (1, '2018-11-27 09:51:35', '2018-11-27 09:51:35', NULL, '2RAID1+RAID5+RAID5', 'webank', 'webank', 'no', '[{"action": "clear_settings", "category": "raid", "metadata": {"clear": "ON", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid1", "drives": "1-2", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid5", "drives": "3-7", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid5", "drives": "8-", "controller_index": "0"}}, {"action": "init_disk", "category": "raid", "metadata": {"init": "ON", "controller_index": "0"}}]'), + (2, '2018-11-27 09:51:35', '2018-11-27 09:51:35', NULL, '4NORAID', 'webank', 'webank', 'no', '[{"action": "clear_settings", "category": "raid", "metadata": {"clear": "ON", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "1", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "2", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "3", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "4", "controller_index": "0"}}, {"action": "init_disk", "category": "raid", "metadata": {"init": "ON", "controller_index": "0"}}]'), + (3, '2018-11-27 09:51:35', '2018-11-27 09:51:35', NULL, '6NORAID', 'webank', 'webank', 'no', '[{"action": "clear_settings", "category": "raid", "metadata": {"clear": "ON", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "1", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "2", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "3", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "4", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "5", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "6", "controller_index": "0"}}, {"action": "init_disk", "category": "raid", "metadata": {"init": "ON", "controller_index": "0"}}]'), + (4, '2018-11-27 09:51:35', '2018-11-27 09:51:35', NULL, '12NORAID', 'webank', 'webank', 'no', '[{"action": "clear_settings", "category": "raid", "metadata": {"clear": "ON", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "1", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "2", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "3", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "4", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "5", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "6", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "7", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "8", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "9", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "10", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "11", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "12", "controller_index": "0"}}, {"action": "init_disk", "category": "raid", "metadata": {"init": "ON", "controller_index": "0"}}]'), + (5, '2018-11-27 09:51:35', '2018-11-27 09:51:35', NULL, '2+12NORAID', 'webank', 'webank', 'no', '[{"action": "clear_settings", "category": "raid", "metadata": {"clear": "ON", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "1", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "2", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "3", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "4", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "5", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "6", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "7", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "8", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "9", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "10", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "11", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "12", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "13", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "14", "controller_index": "0"}}, {"action": "init_disk", "category": "raid", "metadata": {"init": "ON", "controller_index": "0"}}]'), + (6, '2018-11-27 09:51:35', '2018-11-27 09:51:35', NULL, '2RAID1+10RAID5', 'webank', 'webank', 'no', '[{"action": "clear_settings", "category": "raid", "metadata": {"clear": "ON", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid1", "drives": "1-2", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid5", "drives": "3-12", "controller_index": "0"}}, {"action": "init_disk", "category": "raid", "metadata": {"init": "ON", "controller_index": "0"}}]'), + (7, '2018-11-27 09:51:35', '2018-11-27 09:51:35', NULL, '2RAID1+12单盘RAID0', 'webank', 'webank', 'no', '[{"action": "clear_settings", "category": "raid", "metadata": {"clear": "ON", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid1", "drives": "1-2", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "3", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "4", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "5", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "6", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "7", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "8", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "9", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "10", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "11", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "12", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "13", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid0", "drives": "14", "controller_index": "0"}}, {"action": "init_disk", "category": "raid", "metadata": {"init": "ON", "controller_index": "0"}}]'), + (8, '2018-11-27 09:51:35', '2018-11-27 09:51:35', NULL, 'RAID1', 'webank', 'webank', 'no', '[{"action": "clear_settings", "category": "raid", "metadata": {"clear": "ON", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid1", "drives": "all", "controller_index": "0"}}, {"action": "init_disk", "category": "raid", "metadata": {"init": "ON", "controller_index": "0"}}]'), + (9, '2018-11-27 09:51:35', '2018-11-27 09:51:35', NULL, 'RAID5', 'webank', 'webank', 'no', '[{"action": "clear_settings", "category": "raid", "metadata": {"clear": "ON", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid5", "drives": "all", "controller_index": "0"}}, {"action": "init_disk", "category": "raid", "metadata": {"init": "ON", "controller_index": "0"}}]'), + (10, '2018-11-27 09:51:35', '2018-11-27 09:51:35', NULL, 'RAID10', 'webank', 'webank', 'no', '[{"action": "clear_settings", "category": "raid", "metadata": {"clear": "ON", "controller_index": "0"}}, {"action": "create_array", "category": "raid", "metadata": {"level": "raid10", "drives": "all", "controller_index": "0"}}, {"action": "init_disk", "category": "raid", "metadata": {"init": "ON", "controller_index": "0"}}]'); +/*!40000 ALTER TABLE `hardware_template` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.idc 结构 +CREATE TABLE IF NOT EXISTS `idc` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `name` varchar(255) DEFAULT NULL COMMENT '名称', + `usage` enum('production','disaster_recovery','pre_production','testing') DEFAULT NULL COMMENT '用途。production-生产; disaster_recovery-容灾; pre_production-准生产; testing-测试;', + `first_server_room` json DEFAULT NULL COMMENT '一级机房', + `vendor` varchar(255) DEFAULT NULL COMMENT '供应商', + `status` enum('under_construction','accepted','production','abolished') DEFAULT NULL COMMENT '状态。under_construction-建设中; accepted-已验收; production-已投产; abolished-已裁撤;', + `creator` varchar(255) DEFAULT NULL COMMENT '记录创建者ID', + `updater` varchar(255) DEFAULT NULL COMMENT '记录更新者ID', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_idc` (`name`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='数据中心信息表'; + +-- 正在导出表 cloudboot_cyclone.idc 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `idc` DISABLE KEYS */; +/*!40000 ALTER TABLE `idc` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.image_template 结构 +CREATE TABLE IF NOT EXISTS `image_template` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id', + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `family` varchar(255) DEFAULT NULL COMMENT '族系', + `name` varchar(255) NOT NULL COMMENT '模板名', + `boot_mode` enum('legacy_bios','uefi') DEFAULT 'legacy_bios' COMMENT '启动模式。可选值: legacy_bios-传统BIOS模式; uefi-UEFI模式;', + `image_url` varchar(1024) DEFAULT NULL COMMENT '镜像下载地址', + `username` varchar(255) DEFAULT NULL COMMENT '操作系统用户名', + `password` varchar(255) DEFAULT NULL COMMENT '操作系统用户密码', + `partition` longtext COMMENT '分区配置', + `post_script` longtext COMMENT 'post脚本', + `pre_script` longtext COMMENT 'pre脚本', + `os_lifecycle` enum('testing','active_default','active','containment','end_of_life') DEFAULT 'testing' COMMENT 'OS生命周期:Testing|Active(Default)|Active|Containment|EOL', + `arch` enum('unknown','x86_64','aarch64') DEFAULT NULL COMMENT 'OS架构', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_image_template_name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='镜像安装模板表'; + +-- 正在导出表 cloudboot_cyclone.image_template 的数据:~2 rows (大约) +/*!40000 ALTER TABLE `image_template` DISABLE KEYS */; +REPLACE INTO `image_template` (`id`, `created_at`, `updated_at`, `deleted_at`, `family`, `name`, `boot_mode`, `image_url`, `username`, `password`, `partition`, `post_script`, `pre_script`, `os_lifecycle`, `arch`) VALUES + (2, '2019-09-20 10:09:58', '2023-03-16 16:01:15', NULL, 'SUSE', 'SUSE Linux Enterprise Server 12 SP3', 'uefi', 'http://osinstall.idcos.com/images/sles12sp3.tar.gz', 'root', 'Cyclone@1234', '[{"name":"/dev/sda","partitions":[{"name":"/dev/sda1","size":"200","fstype":"vfat","mountpoint":"/boot/efi"},{"name":"/dev/sda2","size":"1024","fstype":"ext4","mountpoint":"/boot"},{"name":"/dev/sda3","size":"8192","fstype":"swap","mountpoint":"swap"},{"name":"/dev/sda4","size":"30720","fstype":"xfs","mountpoint":"/"},{"name":"/dev/sda5","size":"10240","fstype":"xfs","mountpoint":"/tmp"},{"name":"/dev/sda6","size":"5120","fstype":"xfs","mountpoint":"/home"},{"name":"/dev/sda7","size":"20480","fstype":"xfs","mountpoint":"/usr/local"},{"name":"/dev/sda8","size":"free","fstype":"xfs","mountpoint":"/data"}]}]', '# dowload commonSetting.py for setting items in OS\ncurl -o /tmp/commonSetting.py "http://osinstall.idcos.com/scripts/commonSetting.py"\n\n# config network\npython /tmp/commonSetting.py --network=Y \n\n# change root passwd\npython /tmp/commonSetting.py --osuser=Y\n\n# complete\npython /tmp/commonSetting.py --complete=Y\n', '', 'active', 'x86_64'), + (6, '2021-03-22 17:35:27', '2023-12-06 21:38:04', NULL, 'CentOS', 'CentOS 7.9', 'uefi', 'http://osinstall.idcos.com/images/centos7u9.tar.gz', 'root', 'Cyclone@1234', '[{"name":"/dev/sda","partitions":[{"name":"/dev/sda1","size":"200","fstype":"vfat","mountpoint":"/boot/efi"},{"name":"/dev/sda2","size":"1024","fstype":"ext4","mountpoint":"/boot"},{"name":"/dev/sda3","size":"30720","fstype":"ext4","mountpoint":"/"},{"name":"/dev/sda4","size":"10240","fstype":"ext4","mountpoint":"/tmp"},{"name":"/dev/sda5","size":"5120","fstype":"ext4","mountpoint":"/home"},{"name":"/dev/sda6","size":"20480","fstype":"ext4","mountpoint":"/usr/local"},{"name":"/dev/sda7","size":"free","fstype":"ext4","mountpoint":"/data"}]}]', '# dowload commonSetting.py for setting items in OS\ncurl -o /tmp/commonSetting.py "http://osinstall.idcos.com/scripts/commonSetting.py"\n\n# config network\npython /tmp/commonSetting.py --network=Y \n\n# change root passwd\npython /tmp/commonSetting.py --osuser=Y\n\n# complete\npython /tmp/commonSetting.py --complete=Y\n', '', 'active', 'x86_64'); +/*!40000 ALTER TABLE `image_template` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.inspection 结构 +CREATE TABLE IF NOT EXISTS `inspection` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `job_id` char(36) NOT NULL DEFAULT '' COMMENT '所属任务ID', + `start_time` timestamp NULL DEFAULT NULL COMMENT '任务执行开始时间', + `end_time` timestamp NULL DEFAULT NULL COMMENT '任务执行结束时间', + `origin_node` varchar(255) DEFAULT NULL COMMENT '源节点', + `sn` varchar(255) DEFAULT NULL COMMENT '设备序列号', + `running_status` enum('running','done') DEFAULT NULL COMMENT '任务运行状态', + `health_status` enum('nominal','warning','critical','unknown') DEFAULT 'unknown' COMMENT '设备健康状况: nominal-正常; warning-警告; critical-异常; unknown-未知;', + `error` varchar(2048) DEFAULT NULL COMMENT '任务执行错误信息', + `ipmi_result` json DEFAULT NULL COMMENT '硬件巡检结果(ipmi获取的传感器信息)。由id、name、type、state、reading、units、event等属性组成对象数组。', + `ipmisel_result` json DEFAULT NULL COMMENT 'IPMI系统事件数据 ID,Date,Time,Name,Type,State,Event', + PRIMARY KEY (`id`) USING BTREE, + KEY `insp_sn` (`sn`) USING BTREE, + KEY `insp_start_time` (`start_time`) USING BTREE, + KEY `insp_end_time` (`end_time`) USING BTREE, + KEY `insp_job_id` (`job_id`) USING BTREE, + KEY `insp_running_stat` (`running_status`) USING BTREE, + KEY `insp_health_stat` (`health_status`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='硬件巡检执行明细表'; + +-- 正在导出表 cloudboot_cyclone.inspection 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `inspection` DISABLE KEYS */; +/*!40000 ALTER TABLE `inspection` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.ip 结构 +CREATE TABLE IF NOT EXISTS `ip` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `ip_network_id` int(11) unsigned DEFAULT NULL COMMENT '网段ID', + `ip` varchar(255) DEFAULT NULL COMMENT 'IP地址', + `category` enum('business','pxe') DEFAULT NULL COMMENT 'IP类别。pxe-PXE用IP; business-业务用IP;', + `is_used` enum('yes','no','disabled') DEFAULT 'no' COMMENT '是否已被使用。yes-是; no-否; disabled-不可用;', + `sn` varchar(255) DEFAULT NULL COMMENT '使用IP的设备序列号', + `scope` enum('intranet','extranet') DEFAULT NULL COMMENT 'IP作用范围(分配给内网/外网)', + `remark` varchar(255) DEFAULT NULL COMMENT '备注', + `updater` varchar(255) DEFAULT NULL COMMENT '记录更新者ID', + `release_date` date DEFAULT NULL COMMENT '释放日期', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_ip_ip_network_id_ip` (`ip_network_id`,`ip`), + KEY `idx_ip_sn` (`sn`), + KEY `idx_ip_network_id_category_is_used` (`ip_network_id`,`category`,`is_used`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='IP信息表'; + +-- 正在导出表 cloudboot_cyclone.ip 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `ip` DISABLE KEYS */; +/*!40000 ALTER TABLE `ip` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.ip_network 结构 +CREATE TABLE IF NOT EXISTS `ip_network` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `idc_id` int(11) NOT NULL COMMENT '数据中心ID', + `server_room_id` int(11) unsigned NOT NULL COMMENT '机房管理单元ID', + `category` enum('ilo','tgw_intranet','tgw_extranet','intranet','extranet','v_intranet','v_extranet') DEFAULT NULL COMMENT '网段类别。ilo-服务器ILO; tgw_intranet-服务器TGW内网; tgw_extranet-服务器TGW外网; intranet-服务器普通内网; extranet-服务器普通外网; v_intranet-服务器虚拟化内网; v_extranet-服务器虚拟化外网;', + `cidr` varchar(255) DEFAULT NULL COMMENT 'CIDR网段', + `netmask` varchar(255) DEFAULT NULL COMMENT '掩码', + `gateway` varchar(255) DEFAULT NULL COMMENT '网关', + `ip_pool` varchar(1024) DEFAULT NULL COMMENT 'IP资源池(含PXE IP资源池)', + `pxe_pool` varchar(1024) DEFAULT NULL COMMENT 'PXE IP资源池', + `switches` json DEFAULT NULL COMMENT '网段作用范围内的交换机固定资产编号字符串数组', + `vlan` varchar(255) DEFAULT NULL COMMENT 'VLAN', + `creator` varchar(255) DEFAULT NULL COMMENT '记录创建者ID', + `updater` varchar(255) DEFAULT NULL COMMENT '记录更新者ID', + `version` enum('ipv4','ipv6') DEFAULT 'ipv4' COMMENT 'IP协议版本:v4v6', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_ip_network_room_category_cidr` (`server_room_id`,`category`,`cidr`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='网段信息表'; + +-- 正在导出表 cloudboot_cyclone.ip_network 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `ip_network` DISABLE KEYS */; +/*!40000 ALTER TABLE `ip_network` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.job 结构 +CREATE TABLE IF NOT EXISTS `job` ( + `id` char(36) NOT NULL DEFAULT '' COMMENT '任务全局唯一ID', + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `builtin` enum('yes','no') DEFAULT 'no' COMMENT '是否是内建任务。yes-是; no-否;', + `title` varchar(255) DEFAULT NULL COMMENT '任务描述', + `category` enum('inspection','installation_timeout','release_ip','auto_deploy','mailsend','update_device_lifecycle') DEFAULT NULL, + `rate` enum('immediately','fixed_delay','fixed_rate') DEFAULT NULL COMMENT '任务执行频率。immediately-立即执行; fixed_delay-延迟执行; fixed_rate-固定频率(周期性)执行', + `cron` varchar(255) DEFAULT NULL COMMENT 'cron表达式(一次性任务该值为空)', + `cron_render` text COMMENT 'cron表达式UI渲染信息', + `next_run_time` timestamp NULL DEFAULT NULL COMMENT '任务的下一次运行时间', + `target` json DEFAULT NULL COMMENT '任务的作用目标JSON对象(如设备列表)', + `status` enum('running','paused','stoped','deleted') DEFAULT NULL COMMENT 'running-运行中; paused-已暂停; stoped-已停止; deleted-已删除;', + `creator` varchar(255) DEFAULT NULL COMMENT '任务创建者', + `updater` varchar(255) DEFAULT NULL COMMENT '任务更新者', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='一次性/周期性任务表'; + +-- 正在导出表 cloudboot_cyclone.job 的数据:~6 rows (大约) +/*!40000 ALTER TABLE `job` DISABLE KEYS */; +REPLACE INTO `job` (`id`, `created_at`, `updated_at`, `deleted_at`, `builtin`, `title`, `category`, `rate`, `cron`, `cron_render`, `next_run_time`, `target`, `status`, `creator`, `updater`) VALUES + ('04d0141e-aaed-4c66-8389-3eabb9450b0d', '2022-06-07 15:00:00', NULL, NULL, 'yes', '更新设备维保状态', 'update_device_lifecycle', 'fixed_rate', '0 0 13 * * ?', NULL, NULL, NULL, 'paused', NULL, NULL), + ('8467ac30808311eba709fd0db572a67f', '2021-03-15 15:00:00', NULL, NULL, 'yes', '邮件-待部署设备信息', 'mailsend', 'fixed_rate', '0 30 8 * * ?', NULL, NULL, NULL, 'paused', NULL, NULL), + ('bbd2b0c07c0511eb954efd0db572a67f', '2021-03-15 15:00:00', NULL, NULL, 'yes', '邮件-过保设备信息', 'mailsend', 'fixed_rate', '0 30 9 * * ?', NULL, NULL, NULL, 'paused', NULL, NULL), + ('d801f154c884437a805854412308f3ee', '2018-11-26 01:42:13', NULL, NULL, 'yes', '装机超时处理任务', 'installation_timeout', 'fixed_rate', '0 0/5 * * * ?', NULL, NULL, NULL, 'paused', NULL, NULL), + ('f0ee9638182a464087e6608c95093b27', '2020-07-10 15:00:00', NULL, NULL, 'yes', '释放IP', 'release_ip', 'fixed_rate', '0 0 3 * * ?', NULL, NULL, NULL, 'paused', NULL, NULL), + ('f6d66383cfcb452f9848b3fabf2221d1', '2020-09-08 15:00:00', NULL, NULL, 'yes', '自动部署', 'auto_deploy', 'fixed_rate', '0 0 3 * * ?', NULL, NULL, NULL, 'paused', NULL, NULL); +/*!40000 ALTER TABLE `job` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.network_area 结构 +CREATE TABLE IF NOT EXISTS `network_area` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `idc_id` int(11) DEFAULT NULL COMMENT '所属数据中心ID', + `server_room_id` int(11) unsigned NOT NULL COMMENT '所属机房ID', + `name` varchar(255) DEFAULT NULL COMMENT '网络区域名称', + `physical_area` json DEFAULT NULL COMMENT '关联的物理区域列表', + `status` enum('nonproduction','production','offline') DEFAULT NULL COMMENT '状态。nonproduction-未投产; production-已投产; offline-已下线(回收)', + `creator` varchar(255) DEFAULT NULL COMMENT '记录创建者ID', + `updater` varchar(255) DEFAULT NULL COMMENT '记录更新者ID', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_idc_room_area` (`name`,`server_room_id`,`idc_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='网络区域信息表'; + +-- 正在导出表 cloudboot_cyclone.network_area 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `network_area` DISABLE KEYS */; +/*!40000 ALTER TABLE `network_area` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.network_device 结构 +CREATE TABLE IF NOT EXISTS `network_device` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `idc_id` int(11) unsigned NOT NULL COMMENT '所属数据中心ID', + `server_room_id` int(11) NOT NULL COMMENT '机房管理单元ID', + `server_cabinet_id` int(11) unsigned NOT NULL COMMENT '所属机架(柜)ID', + `fixed_asset_number` varchar(255) DEFAULT NULL COMMENT '固定资产编号', + `sn` varchar(255) DEFAULT NULL COMMENT '序列号', + `type` enum('switch') DEFAULT NULL COMMENT '类型。switch-交换机;', + `tor` varchar(255) DEFAULT NULL COMMENT 'TOR名称', + `name` varchar(255) DEFAULT NULL COMMENT '设备名称', + `model` varchar(255) DEFAULT NULL COMMENT '设备型号', + `vendor` varchar(255) DEFAULT NULL COMMENT '厂商', + `os` varchar(255) DEFAULT NULL COMMENT '操作系统', + `usage` varchar(1024) DEFAULT NULL COMMENT '用途', + `creator` varchar(255) DEFAULT NULL COMMENT '记录创建者ID', + `updater` varchar(255) DEFAULT NULL COMMENT '记录更新者ID', + `status` varchar(255) DEFAULT NULL COMMENT '状态', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_network_device_fixed_asset_number` (`fixed_asset_number`), + UNIQUE KEY `uk_network_device_name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='网络设备信息表'; + +-- 正在导出表 cloudboot_cyclone.network_device 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `network_device` DISABLE KEYS */; +/*!40000 ALTER TABLE `network_device` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.operation_log 结构 +CREATE TABLE IF NOT EXISTS `operation_log` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id', + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `operator` varchar(255) NOT NULL COMMENT '操作人ID', + `url` varchar(255) NOT NULL COMMENT '请求url', + `http_method` varchar(8) NOT NULL COMMENT '请求方式', + `category_name` varchar(64) NOT NULL COMMENT '操作类别名称', + `category_code` varchar(64) NOT NULL COMMENT '操作类别编码', + `source` json DEFAULT NULL COMMENT '操作前的源数据', + `destination` json DEFAULT NULL COMMENT '操作后的数据', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户操作日志表'; + +-- 正在导出表 cloudboot_cyclone.operation_log 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `operation_log` DISABLE KEYS */; +/*!40000 ALTER TABLE `operation_log` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.order 结构 +CREATE TABLE IF NOT EXISTS `order` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `number` varchar(255) DEFAULT NULL COMMENT '订单编号', + `idc_id` int(11) unsigned NOT NULL COMMENT '所属数据中心ID', + `server_room_id` int(11) unsigned NOT NULL COMMENT '所属机房ID', + `physical_area` varchar(255) DEFAULT NULL COMMENT '物理区域', + `usage` varchar(255) DEFAULT NULL COMMENT '用途', + `category` varchar(255) DEFAULT NULL COMMENT '设备类型', + `amount` int(11) DEFAULT NULL COMMENT '数量', + `left_amount` int(11) DEFAULT NULL COMMENT '未到货数量数量', + `expected_arrival_date` date DEFAULT NULL COMMENT '预计到货时间', + `pre_occupied_cabinets` json DEFAULT NULL COMMENT '预占用机架信息', + `pre_occupied_usites` json DEFAULT NULL COMMENT '预占用机位信息', + `status` enum('purchasing','partly_arrived','all_arrived','canceled','finished') DEFAULT NULL COMMENT '状态。采购中|部分到货|全部到货|已取消|已完成', + `remark` varchar(1024) DEFAULT NULL COMMENT '备注', + `creator` varchar(255) DEFAULT NULL COMMENT '订单创建者', + `asset_belongs` varchar(255) DEFAULT NULL COMMENT '资产归属', + `owner` varchar(255) DEFAULT NULL COMMENT '负责人', + `is_rental` enum('yes','no') DEFAULT 'no' COMMENT '是否租赁:yes-是;no-否;', + `maintenance_service_provider` varchar(255) DEFAULT NULL COMMENT '维保服务供应商', + `maintenance_service` text COMMENT '维保服务详细内容', + `logistics_service` text COMMENT '物流服务详细内容', + `maintenance_service_date_begin` datetime DEFAULT NULL COMMENT '维保服务起始日期', + `maintenance_service_date_end` datetime DEFAULT NULL COMMENT '维保服务截止日期', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_number` (`number`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单表'; + +-- 正在导出表 cloudboot_cyclone.order 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `order` DISABLE KEYS */; +/*!40000 ALTER TABLE `order` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.permission_code 结构 +CREATE TABLE IF NOT EXISTS `permission_code` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `code` varchar(255) DEFAULT NULL COMMENT '权限码', + `title` varchar(255) DEFAULT NULL COMMENT '权限码标题', + `note` varchar(255) DEFAULT NULL COMMENT '权限码备注', + `pid` int(11) unsigned NOT NULL COMMENT '父级ID', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `perm_data_dict_code` (`code`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='权限数据字典'; + +-- 正在导出表 cloudboot_cyclone.permission_code 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `permission_code` DISABLE KEYS */; +/*!40000 ALTER TABLE `permission_code` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.server_cabinet 结构 +CREATE TABLE IF NOT EXISTS `server_cabinet` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `idc_id` int(11) unsigned NOT NULL COMMENT '所属数据中心ID', + `server_room_id` int(11) unsigned NOT NULL COMMENT '所属机房ID', + `network_area_id` int(11) unsigned NOT NULL COMMENT '所属网络区域ID', + `number` varchar(255) DEFAULT NULL COMMENT '编号', + `height` int(11) unsigned NOT NULL COMMENT '高度(单位U)', + `type` enum('server','kvm_server','network_device','reserved') DEFAULT NULL COMMENT '类型:server-通用服务器;kvm_server-虚拟化服务器; network_device-网络设备; reserved-预留;', + `network_rate` varchar(255) DEFAULT NULL COMMENT '网络速率', + `current` varchar(255) DEFAULT NULL COMMENT '电流', + `available_power` varchar(255) DEFAULT NULL COMMENT '可用功率', + `max_power` varchar(255) DEFAULT NULL COMMENT '最大功率', + `is_enabled` enum('yes','no') DEFAULT NULL COMMENT '是否启用', + `enable_time` datetime DEFAULT NULL COMMENT '启用时间', + `is_powered` enum('yes','no') DEFAULT NULL COMMENT '是否开电', + `power_on_time` datetime DEFAULT NULL COMMENT '开电时间', + `power_off_time` datetime DEFAULT NULL COMMENT '关电时间', + `status` enum('under_construction','not_enabled','enabled','offline','locked') DEFAULT NULL COMMENT '状态。under_construction-建设中; not_enabled-未启用; enabled-已启用; offline-已下线;', + `remark` varchar(1024) DEFAULT NULL COMMENT '备注', + `creator` varchar(255) DEFAULT NULL COMMENT '记录创建者ID', + `updater` varchar(255) DEFAULT NULL COMMENT '记录更新者ID', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_idc_room_cabinet` (`idc_id`,`server_room_id`,`number`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='机架(柜)信息表'; + +-- 正在导出表 cloudboot_cyclone.server_cabinet 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `server_cabinet` DISABLE KEYS */; +/*!40000 ALTER TABLE `server_cabinet` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.server_room 结构 +CREATE TABLE IF NOT EXISTS `server_room` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `idc_id` int(11) unsigned NOT NULL COMMENT '所属数据中心ID', + `name` varchar(255) DEFAULT NULL COMMENT '机房管理单元名称', + `first_server_room` int(11) DEFAULT NULL COMMENT '一级机房ID', + `city` varchar(255) DEFAULT NULL COMMENT '所属城市', + `address` varchar(255) DEFAULT NULL COMMENT '机房管理单元地址', + `server_room_manager` varchar(255) DEFAULT NULL COMMENT '机房管理单元负责人', + `vendor_manager` varchar(255) DEFAULT NULL COMMENT '供应商负责人', + `network_asset_manager` varchar(255) DEFAULT NULL COMMENT '网络资产负责人', + `support_phone_number` varchar(255) DEFAULT NULL COMMENT '7*24小时保障电话', + `status` enum('under_construction','accepted','production','abolished') DEFAULT NULL COMMENT '状态。under_construction-建设中; accepted-已验收; production-已投产; abolished-已裁撤;', + `creator` varchar(255) DEFAULT NULL COMMENT '记录创建者ID', + `updater` varchar(255) DEFAULT NULL COMMENT '记录更新者ID', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_idc_room` (`name`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='机房信息表'; + +-- 正在导出表 cloudboot_cyclone.server_room 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `server_room` DISABLE KEYS */; +/*!40000 ALTER TABLE `server_room` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.server_usite 结构 +CREATE TABLE IF NOT EXISTS `server_usite` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `idc_id` int(11) unsigned NOT NULL COMMENT '所属数据中心ID', + `server_room_id` int(11) unsigned NOT NULL COMMENT '所属机房ID', + `server_cabinet_id` int(11) unsigned NOT NULL COMMENT '所属机架ID', + `number` varchar(255) DEFAULT NULL COMMENT '编号', + `beginning` int(11) unsigned NOT NULL COMMENT '起始U数', + `height` int(11) DEFAULT NULL COMMENT '高度(单位U)', + `physical_area` varchar(255) DEFAULT NULL COMMENT '物理区域', + `oobnet_switches` json DEFAULT NULL COMMENT '管理网交换机对象数组(对象含name、port属性)', + `intranet_switches` json DEFAULT NULL COMMENT '内网交换机对象数组(对象含name、port属性)', + `extranet_switches` json DEFAULT NULL COMMENT '外网交换机对象数组(对象含name、port属性)', + `la_wa_port_rate` enum('GE','10GE','25GE','40GE') DEFAULT NULL COMMENT '内外网端口速率', + `status` enum('free','pre_occupied','used','disabled') DEFAULT NULL COMMENT '状态。free-空闲; pre_occupied-预占用; used-已使用; disabled-不可用;', + `remark` varchar(1024) DEFAULT NULL COMMENT '备注', + `creator` varchar(255) DEFAULT NULL COMMENT '记录创建者ID', + `updater` varchar(255) DEFAULT NULL COMMENT '记录更新者ID', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_idc_room_cabinet_usite` (`idc_id`,`server_room_id`,`server_cabinet_id`,`number`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='机位(U位)信息表'; + +-- 正在导出表 cloudboot_cyclone.server_usite 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `server_usite` DISABLE KEYS */; +/*!40000 ALTER TABLE `server_usite` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.store_room 结构 +CREATE TABLE IF NOT EXISTS `store_room` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `idc_id` int(11) unsigned NOT NULL COMMENT '所属数据中心ID', + `name` varchar(255) DEFAULT NULL COMMENT '库房管理单元名称', + `first_server_room` varchar(255) DEFAULT NULL COMMENT '一级机房ID', + `city` varchar(255) DEFAULT NULL COMMENT '所属城市', + `address` varchar(255) DEFAULT NULL COMMENT '库房管理单元地址', + `store_room_manager` varchar(255) DEFAULT NULL COMMENT '库房管理单元负责人', + `vendor_manager` varchar(255) DEFAULT NULL COMMENT '供应商负责人', + `status` enum('under_construction','accepted','production','abolished') DEFAULT NULL COMMENT '状态。under_construction-建设中; accepted-已验收; production-已投产; abolished-已裁撤;', + `creator` varchar(255) DEFAULT NULL COMMENT '记录创建者ID', + `updater` varchar(255) DEFAULT NULL COMMENT '记录更新者ID', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_store_room_name` (`name`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='库房管理单元表'; + +-- 正在导出表 cloudboot_cyclone.store_room 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `store_room` DISABLE KEYS */; +/*!40000 ALTER TABLE `store_room` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.system_setting 结构 +CREATE TABLE IF NOT EXISTS `system_setting` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id', + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `key` varchar(255) NOT NULL COMMENT '系统配置名', + `value` mediumtext NOT NULL COMMENT '系统配置值', + `desc` varchar(512) DEFAULT '' COMMENT '系统配置描述', + `updater` varchar(255) DEFAULT NULL COMMENT '记录更新者ID', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_system_setting_key` (`key`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='系统设置信息表'; + +-- 正在导出表 cloudboot_cyclone.system_setting 的数据:~5 rows (大约) +/*!40000 ALTER TABLE `system_setting` DISABLE KEYS */; +REPLACE INTO `system_setting` (`id`, `created_at`, `updated_at`, `deleted_at`, `key`, `value`, `desc`, `updater`) VALUES + (1, '2018-11-26 03:37:20', '2018-11-26 03:37:20', NULL, 'installation_timeout', '3600', '操作系统安装超时时间(单位秒)', NULL), + (2, '2021-09-01 15:00:00', '2021-09-01 15:00:00', NULL, 'route_conf', '[{"category_code":"add_idcs","category_name":"新增数据中心","http_method":"Post","method":"GetIDCByID","url":"/api/cloudboot/v1/idcs"},{"category_code":"mod_idcs","category_name":"修改数据中心","http_method":"Put","method":"GetIDCByID","url":"/api/cloudboot/v1/idcs/{id}"},{"category_code":"mod_idcs_status","category_name":"修改数据中心状态","http_method":"Put","method":"","url":"/api/cloudboot/v1/idcs/status"},{"category_code":"rm_idcs","category_name":"删除数据中心","http_method":"Delete","method":"GetIDCByID","url":"/api/cloudboot/v1/idcs/{id}"},{"category_code":"add_server-rooms","category_name":"新增机房","http_method":"Post","method":"GetServerRoomByID","url":"/api/cloudboot/v1/server-rooms"},{"category_code":"mod_server-rooms","category_name":"修改机房","http_method":"Put","method":"GetServerRoomByID","url":"/api/cloudboot/v1/server-rooms/{id}"},{"category_code":"mod_server-rooms_status","category_name":"修改机房状态","http_method":"Put","method":"","url":"/api/cloudboot/v1/server-rooms/status"},{"category_code":"rm_server-rooms","category_name":"删除机房","http_method":"Delete","method":"GetServerRoomByID","url":"/api/cloudboot/v1/server-rooms/{id}"},{"category_code":"add_server-rooms","category_name":"加载导入机房文件","http_method":"Post","method":"GetServerRoomByID","url":"/api/cloudboot/v1/server-rooms/upload"},{"category_code":"add_server-rooms","category_name":"导入机房文件预览","http_method":"Post","url":"/api/cloudboot/v1/server-rooms/imports/previews"},{"category_code":"import_server-rooms","category_name":"导入机房文件","http_method":"Post","method":"GetServerRoomByID","url":"/api/cloudboot/v1/server-rooms/imports"},{"category_code":"add_network-areas","category_name":"新增网络区域","http_method":"Post","method":"GetNetworkAreaByID","url":"/api/cloudboot/v1/network-areas"},{"category_code":"mod_network-areas","category_name":"修改网络区域","http_method":"Put","method":"GetNetworkAreaByID","url":"/api/cloudboot/v1/network-areas/{id}"},{"category_code":"mod_network-areas_status","category_name":"修改网络区域状态","http_method":"Put","method":"","url":"/api/cloudboot/v1/network-areas/status"},{"category_code":"rm_network-areas","category_name":"删除网络区域","http_method":"Delete","method":"GetNetworkAreaByID","url":"/api/cloudboot/v1/network-areas/{id}"},{"category_code":"add_network-areas","category_name":"加载导入导入网络区域文件","http_method":"Post","method":"GetNetworkAreaByID","url":"/api/cloudboot/v1/network-areas/upload"},{"category_code":"add_network-areas","category_name":"导入网络区域文件预览","http_method":"Post","url":"/api/cloudboot/v1/network-areas/imports/previews"},{"category_code":"add_network-areas","category_name":"导入网络区域文件","http_method":"Post","url":"/api/cloudboot/v1/network-areas/imports"},{"category_code":"add_server-cabinets","category_name":"新增机架(柜)","http_method":"Post","method":"GetServerCabinetByID","url":"/api/cloudboot/v1/server-cabinets"},{"category_code":"mod_server-cabinets","category_name":"修改机架(柜)","http_method":"Put","method":"GetServerCabinetByID","url":"/api/cloudboot/v1/server-cabinets/{id}"},{"category_code":"add_server-cabinets_status","category_name":"修改机架(柜)状态","http_method":"Put","method":"","url":"/api/cloudboot/v1/server-cabinets/status"},{"category_code":"rm_server-cabinets","category_name":"删除机架(柜)","http_method":"Delete","method":"GetServerCabinetByID","url":"/api/cloudboot/v1/server-cabinets/{id}"},{"category_code":"power_on_server-cabinets","category_name":"机架开电","http_method":"Post","method":"GetServerCabinetByID","url":"/api/cloudboot/v1/server-cabinets/{id}/power"},{"category_code":"power_off_server-cabinets","category_name":"机架关电","http_method":"Delete","method":"GetServerCabinetByID","url":"/api/cloudboot/v1/server-cabinets/{id}/power"},{"category_code":"add_server-cabinets","category_name":"加载导入机架(柜)文件","http_method":"Post","method":"GetServerCabinetByID","url":"/api/cloudboot/v1/server-cabinets/upload"},{"category_code":"add_server-cabinets","category_name":"导入机架(柜)文件预览","http_method":"Post","url":"/api/cloudboot/v1/server-cabinets/imports/previews"},{"category_code":"add_server-cabinets","category_name":"导入机架(柜)文件","http_method":"Post","url":"/api/cloudboot/v1/server-cabinets/imports"},{"category_code":"add_server-usites","category_name":"新增机位(U位)","http_method":"Post","method":"GetServerUSiteByID","url":"/api/cloudboot/v1/server-usites"},{"category_code":"mod_server-usites","category_name":"修改机位(U位)","http_method":"Put","method":"GetServerUSiteByID","url":"/api/cloudboot/v1/server-usites/{id}"},{"category_code":"rm_server-usites","category_name":"删除机位(U位)","http_method":"Delete","method":"GetServerUSiteByID","url":"/api/cloudboot/v1/server-usites/{id}"},{"category_code":"rm_server-usites_ports","category_name":"删除机位(U位)端口号","http_method":"Delete","method":"GetServerUSiteByID","url":"/api/cloudboot/v1/server-usites/{id}/ports"},{"category_code":"mod_server-usites","category_name":"修改机位(U位)状态","http_method":"Put","method":"GetServerUSiteByID","url":"/api/cloudboot/v1/server-usites/status"},{"category_code":"add_server-usites","category_name":"加载导入机位(U位)文件","http_method":"Post","url":"/api/cloudboot/v1/server-usites/upload"},{"category_code":"add_server-usites","category_name":"导入机位(U位)文件预览","http_method":"Post","url":"/api/cloudboot/v1/server-usites/imports/previews"},{"category_code":"add_server-usites","category_name":"导入机位(U位)文件","http_method":"Post","url":"/api/cloudboot/v1/server-usites/imports"},{"category_code":"add_server-usites","category_name":"加载导入机位(U位)端口号文件","http_method":"Post","url":"/api/cloudboot/v1/server-usites/ports/upload"},{"category_code":"add_server-usites","category_name":"导入机位(U位)端口号文件预览","http_method":"Post","url":"/api/cloudboot/v1/server-usites/ports/imports/previews"},{"category_code":"add_server-usites","category_name":"导入机位(U位)端口号文件","http_method":"Post","url":"/api/cloudboot/v1/server-usites/ports/imports"},{"category_code":"add_devices","category_name":"新增物理机","http_method":"Post","url":"/api/cloudboot/v1/devices/{sn}/collections"},{"category_code":"add_devices","category_name":"加载导入物理机文件","http_method":"Post","url":"/api/cloudboot/v1/devices/upload"},{"category_code":"add_devices","category_name":"导入物理机文件预览","http_method":"Post","url":"/api/cloudboot/v1/devices/imports/previews"},{"category_code":"add_devices","category_name":"加入物理机文件","http_method":"Post","url":"/api/cloudboot/v1/devices/imports"},{"category_code":"mod_device","category_name":"修改物理机","http_method":"Put","url":"/api/cloudboot/v1/device"},{"category_code":"mod_device","category_name":"批量修改物理机状态/用途","http_method":"Put","url":"/api/cloudboot/v1/devices"},{"category_code":"rm_devices","category_name":"删除物理机","http_method":"Delete","url":"/api/cloudboot/v1/devices"},{"category_code":"add_ip-networks","category_name":"新增网段","http_method":"Post","url":"/api/cloudboot/v1/ip-networks"},{"category_code":"add_ip-networks","category_name":"修改网段","http_method":"Put","url":"/api/cloudboot/v1/ip-networks/{id}"},{"category_code":"rm_ip-networks","category_name":"删除网段","http_method":"Delete","url":"/api/cloudboot/v1/ip-networks/{id}"},{"category_code":"sync_ip-networks","category_name":"网段同步","http_method":"Post","method":"","url":"/api/cloudboot/v1/ip-networks/sync"},{"category_code":"mod_ips","category_name":"手动分配IP","http_method":"Put","url":"/api/cloudboot/v1/ips/assigns"},{"category_code":"mod_ips","category_name":"手动取消IP分配","http_method":"Put","url":"/api/cloudboot/v1/ips/unassigns"},{"category_code":"rm_network-device","category_name":"删除网络设备","http_method":"Delete","method":"GetNetworkDeviceByID","url":"/api/cloudboot/v1/network/devices/{id}"},{"category_code":"add_network-device","category_name":"新增网络设备","http_method":"Post","method":"GetNetworkDeviceByID","url":"/api/cloudboot/v1/network/devices"},{"category_code":"sync_network-device","category_name":"网段设备同步","http_method":"Post","method":"","url":"/api/cloudboot/v1/network/devices/sync"},{"category_code":"add_devices","category_name":"上报安装进度","http_method":"Post","url":"/api/cloudboot/v1/devices/{sn}/installations/progress"},{"category_code":"add_devices","category_name":"新增装机参数","http_method":"Post","url":"/api/cloudboot/v1/devices/settings"},{"category_code":"mod_devices","category_name":"批量重装设备","http_method":"Put","url":"/api/cloudboot/v1/devices/installations/reinstalls"},{"category_code":"mod_devices","category_name":"设备重装","http_method":"Post","url":"/api/cloudboot/v1/devices/installations/os-reinstallations"},{"category_code":"mod_devices","category_name":"批量取消安装设备","http_method":"Put","url":"/api/cloudboot/v1/devices/installations/cancels"},{"category_code":"rm_devices","category_name":"批量删除设备装机参数","http_method":"Delete","url":"/api/cloudboot/v1/devices/settings"},{"category_code":"rm_hardware-templates","category_name":"删除硬件模板","http_method":"Delete","url":"/api/cloudboot/v1/hardware-templates/{id}"},{"category_code":"mod_hardware-templates","category_name":"修改硬件模板","http_method":"Put","url":"/api/cloudboot/v1/hardware-templates/{id}"},{"category_code":"add_hardware-templates","category_name":"新增硬件模板","http_method":"Post","url":"/api/cloudboot/v1/hardware-templates"},{"category_code":"add_image-templates","category_name":"新增镜像模板","http_method":"Post","url":"/api/cloudboot/v1/image-templates"},{"category_code":"mod_image-templates","category_name":"修改镜像模板","http_method":"Put","url":"/api/cloudboot/v1/image-templates/{id}"},{"category_code":"rm_image-templates","category_name":"删除镜像模板","http_method":"Delete","url":"/api/cloudboot/v1/image-templates/{id}"},{"category_code":"add_system-templates","category_name":"新增系统模板","http_method":"Post","url":"/api/cloudboot/v1/system-templates"},{"category_code":"mod_system-templates","category_name":"修改系统模板","http_method":"Put","url":"/api/cloudboot/v1/system-templates/{id}"},{"category_code":"rm_system-templates","category_name":"删除系统模板","http_method":"Delete","url":"/api/cloudboot/v1/system-templates/{id}"},{"category_code":"add_devices","category_name":"新增带外管理","http_method":"Post","url":"/api/cloudboot/v1/devices/power"},{"category_code":"add_devices","category_name":"带外管理批量PXE重启","http_method":"Put","url":"/api/cloudboot/v1/devices/power/pxe/restart"},{"category_code":"mod_devices","category_name":"带外管理批量重启","http_method":"Put","url":"/api/cloudboot/v1/devices/power/restart"},{"category_code":"rm_devices","category_name":"带外管理批量关机","http_method":"Delete","url":"/api/cloudboot/v1/devices/power"},{"category_code":"mod_devices","category_name":"修改带外用户密码","http_method":"Put","req_param_desensitization":"oob_password_old,oob_password_new","url":"/api/cloudboot/v1/devices/{sn}/oob/password"},{"category_code":"add_jobs","category_name":"新增巡检任务","http_method":"Post","url":"/api/cloudboot/v1/jobs/inspections"},{"category_code":"mod_user_password","category_name":"修改用户密码","http_method":"Put","req_param_desensitization":"old_password,new_password","url":"/api/cloudboot/v1/users/password"},{"category_code":"mod_gen_pxe","category_name":"为目标设备生成PXE文件","http_method":"Post","url":"/api/cloudboot/v1/devices/{sn}/pxe"},{"category_code":"mod_centos6_uefi_pxe","category_name":"生成centos6pxe模板","http_method":"Post","url":"/api/cloudboot/v1/devices/{sn}/centos6/uefi/pxe"},{"category_code":"submit_cabinet_offline_approval","category_name":"发起机架下线审批","http_method":"Post","url":"/api/cloudboot/v1/approvals/server-cabinets/offlines"},{"category_code":"submit_cabinet_poweroff_approval","category_name":"发起机架关电审批","http_method":"Post","url":"/api/cloudboot/v1/approvals/server-cabinets/poweroffs"},{"category_code":"submit_device_migrate_approval","category_name":"发起物理机迁移审批","http_method":"Post","url":"/api/cloudboot/v1/approvals/devices/migrations"},{"category_code":"submit_device_retire_approval","category_name":"发起物理机退役审批","http_method":"Post","url":"/api/cloudboot/v1/approvals/devices/retirements"},{"category_code":"submit_device_reinstall_approval","category_name":"发起物理机重装审批","http_method":"Post","url":"/api/cloudboot/v1/approvals/devices/os-reinstallations"},{"category_code":"return_limiter_token","category_name":"归还设备持有的DHCPIP令牌","http_method":"Delete","url":"/api/cloudboot/v1/devices/{sn}/limiters/tokens"},{"http_method":"Post","url":"/api/cloudboot/v1/devices/store/upload","category_code":"upload","category_name":"上传设备导入到库房文件"},{"http_method":"Post","url":"/api/cloudboot/v1/devices/store/imports/previews","category_code":"add_devices","category_name":"物理机导入到库房预览"},{"http_method":"Post","url":"/api/cloudboot/v1/devices/store/imports","category_code":"add_devices","category_name":"物理机导入到库房"},{"http_method":"Post","url":"/api/cloudboot/v1/devices/stock/upload","category_code":"add_devices","category_name":"上传存量设备文件"},{"http_method":"Post","url":"/api/cloudboot/v1/devices/stock/imports/previews","category_code":"add_devices","category_name":"存量设备导入预览"},{"http_method":"Post","url":"/api/cloudboot/v1/devices/stock/imports","category_code":"add_devices","category_name":"存量设备导入"},{"http_method":"Put","url":"/api/cloudboot/v1/device/operation/status","category_code":"mod_device","category_name":"修改设备运营状态"},{"http_method":"Post","url":"/api/cloudboot/v1/approvals/devices/migrations/upload","category_code":"add_approvals","category_name":"上传物理机搬迁文件"},{"http_method":"Post","url":"/api/cloudboot/v1/approvals/devices/migrations/imports/previews","category_code":"add_approvals","category_name":"物理机搬迁导入预览"},{"http_method":"Post","url":"/api/cloudboot/v1/approvals/devices/migrations/imports","category_code":"add_approvals","category_name":"物理机搬迁导入"},{"http_method":"Post","url":"/api/cloudboot/v1/approvals/idc/abolish","category_code":"add_approvals","category_name":"数据中心裁撤审批"},{"http_method":"Post","url":"/api/cloudboot/v1/approvals/server-room/abolish","category_code":"add_approvals","category_name":"机房裁撤审批"},{"http_method":"Post","url":"/api/cloudboot/v1/approvals/network-area/offline","category_code":"add_approvals","category_name":"网络区域下线审批"},{"http_method":"Post","url":"/api/cloudboot/v1/approvals/ip/unassign","category_code":"add_approvals","category_name":"IP回收审批"},{"http_method":"Post","url":"/api/cloudboot/v1/approvals/device/poweroff","category_code":"add_approvals","category_name":"物理机关电审批"},{"http_method":"Post","url":"/api/cloudboot/v1/approvals/device/restart","category_code":"add_approvals","category_name":"物理机重启审批"},{"http_method":"Post","url":"/api/cloudboot/v1/approvals/devices/recycle","category_code":"add_approvals","category_name":"物理机回收审批"},{"http_method":"Post","url":"/api/cloudboot/v1/store-room","category_code":"add_store-room","category_name":"新增库房"},{"http_method":"Delete","url":"/api/cloudboot/v1/store-room/{id}","category_code":"rm_store-room","category_name":"删除库房"},{"http_method":"Put","url":"/api/cloudboot/v1/store-room","category_code":"mod_store-room","category_name":"修改库房"},{"http_method":"Post","url":"/api/cloudboot/v1/store-room/upload","category_code":"add_store-room","category_name":"上传库房导入文件"},{"http_method":"Post","url":"/api/cloudboot/v1/store-room/imports/previews","category_code":"add_store-room","category_name":"库房导入预览"},{"http_method":"Post","url":"/api/cloudboot/v1/store-room/imports","category_code":"add_store-room","category_name":"库房导入"},{"http_method":"Post","url":"/api/cloudboot/v1/virtual-cabinet","category_code":"add_virtual-cabinet","category_name":"新增虚拟货架"},{"http_method":"Delete","url":"/api/cloudboot/v1/virtual-cabinet/{id}","category_code":"rm_virtual-cabinet","category_name":"删除虚拟货架"},{"http_method":"Post","url":"/api/cloudboot/v1/network/devices/upload","category_code":"add_network","category_name":"上传网络设备导入文件"},{"http_method":"Post","url":"/api/cloudboot/v1/network/devices/imports/previews","category_code":"add_network","category_name":"网络设备导入预览"},{"http_method":"Post","url":"/api/cloudboot/v1/network/devices/imports","category_code":"add_network","category_name":"网络设备导入"},{"http_method":"Post","url":"/api/cloudboot/v1/ip-networks/upload","category_code":"add_ip-networks","category_name":"上传网段导入文件"},{"http_method":"Post","url":"/api/cloudboot/v1/ip-networks/imports/previews","category_code":"add_ip-networks","category_name":"网段导入预览"},{"http_method":"Post","url":"/api/cloudboot/v1/ip-networks/imports","category_code":"add_ip-networks","category_name":"网段导入"},{"http_method":"Put","url":"/api/cloudboot/v1/ips/status/disable","category_code":"mod_ips","category_name":"禁用IP"},{"http_method":"Post","url":"/api/cloudboot/v1/special-device","category_code":"add_special-device","category_name":"新增特殊设备"},{"http_method":"Post","url":"/api/cloudboot/v1/special-devices/upload","category_code":"add_special-devices","category_name":"上传特殊设备导入文件"},{"http_method":"Post","url":"/api/cloudboot/v1/special-devices/imports/previews","category_code":"add_special-devices","category_name":"特殊设备导入预览"},{"http_method":"Post","url":"/api/cloudboot/v1/special-devices/imports","category_code":"add_special-devices","category_name":"特殊设备导入"},{"http_method":"Put","url":"/api/cloudboot/v1/devices/oob/re-access","category_code":"mod_devices","category_name":"重新纳管带外"},{"http_method":"Delete","url":"/api/cloudboot/v1/devices/limiters/tokens","category_code":"rm_devices","category_name":"一键释放token"},{"http_method":"Post","url":"/api/cloudboot/v1/devices/{sn}/components/hw-server/logs","category_code":"add_devices","category_name":"保存hw-server组件日志"},{"http_method":"Post","url":"/api/cloudboot/v1/devices/{sn}/components/peconfig/logs","category_code":"add_devices","category_name":"保存peconfig组件日志"},{"http_method":"Post","url":"/api/cloudboot/v1/devices/{sn}/components/cloudboot-agent/logs","category_code":"add_devices","category_name":"保存cloudboot-agent组件日志"},{"http_method":"Post","url":"/api/cloudboot/v1/devices/{sn}/components/winconfig/logs","category_code":"add_devices","category_name":"保存winconfig组件日志"},{"http_method":"Post","url":"/api/cloudboot/v1/devices/{sn}/components/network-config/logs","category_code":"add_devices","category_name":"保存系统配置日志"},{"http_method":"Post","url":"/api/cloudboot/v1/devices/{sn}/components/image-clone/logs","category_code":"add_devices","category_name":"保存镜像制作日志"},{"http_method":"Post","url":"/api/cloudboot/v1/order","category_code":"add_order","category_name":"新增订单"},{"http_method":"Delete","url":"/api/cloudboot/v1/orders","category_code":"rm_orders","category_name":"删除订单"},{"http_method":"Put","url":"/api/cloudboot/v1/order","category_code":"mod_order","category_name":"修改订单"},{"http_method":"Put","url":"/api/cloudboot/v1/order/status","category_code":"mod_order","category_name":"修改订单状态"},{"http_method":"Post","url":"/api/cloudboot/v1/device-category","category_code":"add_device-category","category_name":"新增设备类型"},{"http_method":"Delete","url":"/api/cloudboot/v1/device-categories","category_code":"rm_device-categories","category_name":"删除设备类型"},{"http_method":"Put","url":"/api/cloudboot/v1/device-category","category_code":"mod_device-category","category_name":"修改设备类型"},{"http_method":"Delete","url":"/api/cloudboot/v1/jobs/{job_id}","category_code":"rm_jobs","category_name":"删除任务"},{"http_method":"Put","url":"/api/cloudboot/v1/jobs/{job_id}/pausing","category_code":"mod_jobs","category_name":"暂停任务"},{"http_method":"Put","url":"/api/cloudboot/v1/jobs/{job_id}/unpausing","category_code":"mod_jobs","category_name":"继续已暂停任务"},{"http_method":"Post","method":"","url":"/api/cloudboot/v1/device-setting-rules","category_code":"add_device-setting-rules","category_name":"新增装机参数规则"},{"http_method":"Delete","method":"","url":"/api/cloudboot/v1/device-setting-rules","category_code":"rm_device-setting-rules","category_name":"删除装机参数规则"},{"http_method":"Put","method":"","url":"/api/cloudboot/v1/device-setting-rules","category_code":"mod_device-setting-rules","category_name":"修改装机参数规则"},{"category_code":"mod_devices","category_name":"自动重装设备","http_method":"Put","method":"","url":"/api/cloudboot/v1/devices/installations/autoreinstalls"}]', '操作记录中间件配置', NULL), + (3, '2021-09-01 15:00:00', '2021-09-01 15:00:00', NULL, 'cloudboot_menu_permission', '{"content":{"children":[{"children":[],"id":"menu_home","note":"菜单-概览","title":"概览"},{"children":[{"children":[],"id":"menu_idc","note":"菜单-数据中心管理-数据中心","title":"数据中心"},{"children":[],"id":"menu_server_room","note":"菜单-数据中心管理-机房","title":"机房"},{"children":[],"id":"menu_network_area","note":"菜单-数据中心管理-网络区域","title":"网络区域"},{"children":[],"id":"menu_server_cabinet","note":"菜单-数据中心管理-机架","title":"机架"},{"children":[],"id":"menu_server_usite","note":"菜单-数据中心管理-机位","title":"机位"},{"children":[],"id":"menu_store_room","note":"菜单-数据中心管理-库房","title":"库房"}],"id":"menu_idc_management","note":"菜单-数据中心管理","title":"数据中心管理"},{"children":[{"children":[],"id":"menu_network_device","note":"菜单-网络管理-网络设备","title":"网络设备"},{"children":[],"id":"menu_ip_network","note":"菜单-网络管理-IP网段","title":"IP网段"},{"children":[],"id":"menu_ip","note":"菜单-网络管理-IP分配","title":"IP分配"}],"id":"menu_network_management","note":"菜单-网络管理","title":"网络管理"},{"children":[{"children":[],"id":"menu_physical_machine","note":"菜单-物理机管理-物理机列表","title":"物理机列表"},{"children":[],"id":"menu_special_device","note":"菜单-物理机管理-特殊设备列表","title":"特殊设备列表"},{"children":[],"id":"menu_oob_info","note":"菜单-物理机管理-带外信息","title":"带外信息"},{"children":[],"id":"menu_predeploy_physical_machine","note":"菜单-物理机管理-待部署物理机","title":"待部署物理机"},{"children":[],"id":"menu_device_setting","note":"菜单-物理机管理-部署列表","title":"部署列表"},{"children":[],"id":"menu_device_setting_rule","note":"菜单-物理机管理-装机参数规则列表","title":"装机参数规则列表"},{"children":[],"id":"menu_inspection","note":"菜单-物理机管理-硬件巡检","title":"硬件巡检"}],"id":"menu_physical_machine_management","note":"菜单-物理机管理","title":"物理机管理"},{"children":[{"children":[],"id":"menu_order","note":"菜单-订单管理-订单列表","title":"订单列表"},{"children":[],"id":"menu_device_category","note":"菜单-订单管理-设备类型列表","title":"设备类型列表"}],"id":"menu_order_management","note":"菜单-订单管理","title":"订单管理"},{"children":[{"children":[],"id":"menu_system_template","note":"菜单-配置管理-装机配置","title":"装机配置"},{"children":[],"id":"menu_hardware_template","note":"菜单-配置管理-硬件配置","title":"硬件配置"}],"id":"menu_template_management","note":"菜单-配置管理","title":"配置管理"},{"children":[],"id":"menu_approval","note":"菜单-审批管理","title":"审批管理"},{"children":[],"id":"menu_task_management","note":"菜单-任务管理","title":"任务管理"},{"children":[{"children":[],"id":"menu_audit_api","note":"菜单-操作审计-接口调用记录","title":"接口调用记录"},{"children":[],"id":"menu_audit_log","note":"菜单-操作审计-操作记录","title":"操作记录"}],"id":"menu_audit","note":"菜单-操作审计","title":"操作审计"},{"children":[],"id":"menu_user_management","note":"菜单-用户管理","title":"用户管理"}],"id":"","note":"","title":"所有权限"},"message":"操作成功","status":"success"}', '菜单权限列表', NULL), + (4, '2021-09-01 15:00:00', '2021-09-01 15:00:00', NULL, 'cloudboot_button_permission', '{"content": {"children": [{"children": [{"children": [{"children": [],"id": "button_idc_create","note": "按钮-数据中心管理-新增","title": "新增数据中心"},{"children": [],"id": "button_idc_update","note": "按钮-数据中心管理-修改","title": "修改数据中心"},{"children": [],"id": "button_idc_delete","note": "按钮-数据中心管理-删除","title": "删除数据中心"},{"children": [],"id": "button_idc_accepted","note": "按钮-数据中心管理-验收","title": "验收数据中心"},{"children": [],"id": "button_idc_production","note": "按钮-数据中心管理-投产","title": "投产数据中心"},{"children": [],"id": "button_idc_abolished","note": "按钮-数据中心管理-裁撤","title": "裁撤数据中心"}],"id": "menu_idc","note": "菜单-数据中心管理-数据中心","title": "数据中心"},{"children": [{"children": [],"id": "button_server_room_create","note": "按钮-机房信息管理-新增","title": "新增机房信息"},{"children": [],"id": "button_server_room_update","note": "按钮-机房信息管理-修改","title": "修改机房信息"},{"children": [],"id": "button_server_room_delete","note": "按钮-机房信息管理-删除","title": "删除机房信息"},{"children": [],"id": "button_server_room_accepted","note": "按钮-机房信息管理-验收","title": "验收机房信息"},{"children": [],"id": "button_server_room_production","note": "按钮-机房信息管理-投产","title": "投产机房信息"},{"children": [],"id": "button_server_room_abolished","note": "按钮-机房信息管理-裁撤","title": "裁撤机房信息"},{"children": [],"id": "button_server_room_import","note": "按钮-机房信息管理-导入","title": "导入机房信息"},{"children": [],"id": "button_server_room_download","note": "按钮-机房信息管理-下载模板","title": "下载机房信息模板"}],"id": "menu_server_room","note": "菜单-数据中心管理-机房","title": "机房"},{"children": [{"children": [],"id": "button_network_area_create","note": "按钮-网络区域-新增","title": "新增网络区域"},{"children": [],"id": "button_network_area_update","note": "按钮-网络区域-修改","title": "修改网络区域"},{"children": [],"id": "button_network_area_delete","note": "按钮-网络区域-删除","title": "删除网络区域"},{"children": [],"id": "button_network_area_production","note": "按钮-网络区域-投产","title": "投产网络区域"},{"children": [],"id": "button_network_area_offline","note": "按钮-网络区域-下线","title": "下线网络区域"},{"children": [],"id": "button_network_area_import","note": "按钮-网络区域-导入","title": "导入网络区域"},{"children": [],"id": "button_network_area_download","note": "按钮-网络区域-下载模板","title": "下载网络区域模板"}],"id": "menu_network_area","note": "菜单-数据中心管理-网络区域","title": "网络区域"},{"children": [{"children": [],"id": "button_server_cabinet_create","note": "按钮-机架-新增","title": "新增机架"},{"children": [],"id": "button_server_cabinet_update","note": "按钮-机架-修改","title": "修改机架"},{"children": [],"id": "button_server_cabinet_delete","note": "按钮-机架-删除","title": "删除机架"},{"children": [],"id": "button_server_cabinet_enabled","note": "按钮-机架-启用","title": "启用机架"},{"children": [],"id": "button_server_cabinet_powerOn","note": "按钮-机架-开电","title": "开电机架"},{"children": [],"id": "button_server_cabinet_powerOff","note": "按钮-机架-关电","title": "关电机架"},{"children": [],"id": "button_server_cabinet_offline","note": "按钮-机架-下线","title": "下线机架"},{"children": [],"id": "button_server_cabinet_locked","note": "按钮-机架-锁定","title": "锁定机架"},{"children": [],"id": "button_server_cabinet_type","note": "按钮-机架-更新机架类型","title": "更新机架类型"},{"children": [],"id": "button_server_cabinet_remark","note": "按钮-机架-备注","title": "更新机架备注"},{"children": [],"id": "button_server_cabinet_import","note": "按钮-机架-导入","title": "导入机架"},{"children": [],"id": "button_server_cabinet_download","note": "按钮-机架-下载模板","title": "下载机架模板"}],"id": "menu_server_cabinet","note": "菜单-数据中心管理-机架","title": "机架"},{"children": [{"children": [],"id": "button_server_usite_create","note": "按钮-机位-新增","title": "新增机位"},{"children": [],"id": "button_server_usite_update","note": "按钮-机位-修改","title": "修改机位"},{"children": [],"id": "button_server_usite_delete","note": "按钮-机位-删除","title": "删除机位"},{"children": [],"id": "button_server_usite_delete_port","note": "按钮-机位-删除端口","title": "删除机位端口"},{"children": [],"id": "button_server_usite_status","note": "按钮-机位-更新机位状态","title": "更新机位状态"},{"children": [],"id": "button_server_usite_remark","note": "按钮-机位-备注","title": "更新机位备注"},{"children": [],"id": "button_server_usite_import","note": "按钮-机位-导入","title": "导入机位"},{"children": [],"id": "button_server_usite_download","note": "按钮-机位-下载模板","title": "下载机位模板"},{"children": [],"id": "button_server_usite_import_port","note": "按钮-机位端口-导入","title": "导入机位端口"},{"children": [],"id": "button_server_usite_download_port","note": "按钮-机位端口-下载模板","title": "下载机位端口模板"}],"id": "menu_server_usite","note": "菜单-数据中心管理-机位","title": "机位"},{"children": [{"children": [],"id": "button_store_room_create","note": "按钮-库房-新增","title": "新增库房管理单元"},{"children": [],"id": "button_store_room_import","note": "按钮-库房-导入","title": "导入库房管理单元"},{"children": [],"id": "button_store_room_delete","note": "按钮-库房-删除","title": "删除库房管理单元"},{"children": [],"id": "button_store_room_update","note": "按钮-库房-修改","title": "修改库房管理单元"},{"children": [],"id": "button_virtual_cabinet_create","note": "按钮-虚拟货架-新增","title": "新增虚拟货架"},{"children": [],"id": "button_virtual_cabinet_delete","note": "按钮-虚拟货架-删除","title": "删除虚拟货架"}],"id": "menu_store_room","note": "菜单-数据中心管理-库房","title": "库房信息管理"}],"id": "menu_idc_management","note": "菜单-数据中心管理","title": "数据中心管理"},{"children": [{"children": [{"children": [],"id": "button_network_device_create","note": "按钮-网络设备-新增","title": "新增网络设备"},{"children": [],"id": "button_network_device_delete","note": "按钮-网络设备-删除","title": "删除网络设备"},{"children": [],"id": "button_network_device_sync","note": "按钮-网络设备-同步","title": "同步网络设备"},{"children": [],"id": "button_network_device_import_download","note": "按钮-网络设备-下载导入模板","title": "下载导入网络设备模板"},{"children": [],"id": "button_network_device_import","note": "按钮-网络设备-导入","title": "导入网络设备"}],"id": "menu_network_device","note": "菜单-网络管理-网络设备","title": "网络设备"},{"children": [{"children": [],"id": "button_ip_network_create","note": "按钮-IP网段管理-新增","title": "新增IP网段管理"},{"children": [],"id": "button_ip_network_update","note": "按钮-IP网段管理-修改","title": "修改IP网段管理"},{"children": [],"id": "button_ip_network_delete","note": "按钮-IP网段管理-删除","title": "删除IP网段管理"},{"children": [],"id": "button_ip_network_sync","note": "按钮-IP网段管理-同步","title": "同步IP网段"},{"children": [],"id": "button_ip_network_import_download","note": "按钮-IP网段管理-导入模板下载","title": "下载导入IP网段模板"},{"children": [],"id": "button_ip_network_import","note": "按钮-IP网段管理-导入","title": "导入IP网段"}],"id": "menu_ip_network","note": "菜单-网络管理-IP网段","title": "IP网段"},{"children": [{"children": [],"id": "button_ip_assign","note": "按钮-IP分配-分配","title": "IP分配"},{"children": [],"id": "button_ip_unassign","note": "按钮-IP分配-取消分配","title": "取消IP分配"}],"id": "menu_ip","note": "菜单-网络管理-IP分配","title": "IP分配"}],"id": "menu_network_management","note": "菜单-网络管理","title": "网络管理"},{"children": [{"children": [{"children": [],"id": "button_physical_machine_update_status","note": "按钮-物理机列表-修改","title": "批量修改物理机状态"},{"children": [],"id": "button_physical_machine_update_usage","note": "按钮-物理机列表-修改","title": "批量修改物理机用途"},{"children": [],"id": "button_physical_machine_update","note": "按钮-物理机列表-修改","title": "修改物理机"},{"children": [],"id": "button_physical_machine_import","note": "按钮-物理机列表-导入","title": "存量物理机导入"},{"children": [],"id": "button_physical_machine_download","note": "按钮-物理机列表-下载模板","title": "存量物理机模板下载"},{"children": [],"id": "button_physical_machine_export","note": "按钮-物理机列表-导出","title": "物理机导出"},{"children": [],"id": "button_device_store_import","note": "按钮-物理机列表-导入","title": "物理机导入到库房"},{"children": [],"id": "button_device_store_import_download","note": "按钮-物理机列表-下载模板","title": "物理机导入到库房模板下载"}],"id": "menu_physical_machine","note": "菜单-物理机管理-物理机列表","title": "物理机列表"},{"children": [{"children": [],"id": "button_physical_machine_update_oob","note": "按钮-带外管理-修改带外","title": "修改物理机带外"},{"children": [],"id": "button_physical_machine_powerOn","note": "按钮-带外管理-开电","title": "开电物理机"},{"children": [],"id": "button_physical_machine_networkBoot","note": "按钮-带外管理-从网卡启动","title": "从网卡启动物理机"},{"children": [],"id": "button_oob_re_access","note": "按钮-带外管理-重新纳管带外","title": "重新纳管带外"},{"children": [],"id": "button_physical_oob_export","note": "按钮-带外管理-导出带外","title": "导出带外"}],"id": "menu_oob_info","note": "菜单-物理机管理-带外管理","title": "带外管理"},{"children": [{"children": [],"id": "button_special_device_create","note": "按钮-特殊设备列表-新增","title": "新增特殊设备"},{"children": [],"id": "button_special_device_delete","note": "按钮-特殊设备列表-新增","title": "新增特殊设备"},{"children": [],"id": "button_special_device_import_download","note": "按钮-特殊设备列表-下载模板","title": "导入特殊设备模板下载"},{"children": [],"id": "button_special_device_import","note": "按钮-特殊设备列表-导入","title": "导入特殊设备"}],"id": "menu_special_device","note": "菜单-物理机管理-特殊设备列表","title": "特殊设备列表"},{"children": [{"children": [],"id": "button_predeploy_physical_machine_osInstall","note": "按钮-待部署物理机-申请上架部署","title": "待部署物理机申请上架部署"},{"children": [],"id": "button_predeploy_physical_machine_powerOn","note": "按钮-待部署物理机-开电","title": "待部署物理机开电"},{"children": [],"id": "button_predeploy_physical_machine_powerOff","note": "按钮-待部署物理机-关电","title": "待部署物理机关电"},{"children": [],"id": "button_predeploy_physical_machine_reBoot","note": "按钮-待部署物理机-重启","title": "待部署物理机重启"},{"children": [],"id": "button_predeploy_physical_machine_networkBoot","note": "按钮-待部署物理机-从网卡启动","title": "待部署物理机从网卡启动"},{"children": [],"id": "button_predeploy_physical_machine_download","note": "按钮-待部署物理机-下载","title": "下载待部署物理机模板"},{"children": [],"id": "button_predeploy_physical_machine_import","note": "按钮-待部署物理机-导入","title": "导入待部署物理机模板"},{"children": [],"id": "button_predeploy_physical_machine_delete","note": "按钮-待部署物理机-删除","title": "删除物理机"}],"id": "menu_predeploy_physical_machine","note": "菜单-物理机管理-待部署物理机","title": "待部署物理机"},{"children": [{"children": [],"id": "button_device_setting_reInstall","note": "按钮-部署列表-重新部署","title": "重新部署"},{"children": [],"id": "button_dhcp_token_release","note": "按钮-部署列表-释放DHCP令牌","title": "释放DHCP令牌"},{"children": [],"id": "button_dhcp_token_batch_release","note": "按钮-部署列表-批量释放DHCP令牌","title": "批量释放DHCP令牌"},{"children": [],"id": "button_device_setting_cancelInstall","note": "按钮-部署列表-取消部署","title": "取消部署"},{"children": [],"id": "button_device_setting_delete","note": "按钮-部署列表-删除","title": "删除部署物理机"}],"id": "menu_device_setting","note": "菜单-物理机管理-部署列表","title": "部署列表"},{"children": [{"children": [],"id": "button_device_setting_rule_create","note": "按钮-装机参数规则-新增","title": "新增装机参数规则"},{"children": [],"id": "button_device_setting_rule_update","note": "按钮-装机参数规则-修改","title": "修改装机参数规则"},{"children": [],"id": "button_device_setting_rule_delete","note": "按钮-装机参数规则-删除","title": "删除装机参数规则"}],"id": "menu_device_setting_rule","note": "菜单-物理机管理-装机参数规则列表","title": "装机参数规则列表"},{"children": [{"children": [],"id": "button_inspection_addTask","note": "按钮-硬件巡检-新建巡检任务","title": "新建巡检任务"},{"children": [],"id": "button_inspection_inspect","note": "按钮-硬件巡检-重新巡检","title": "重新巡检"},{"children": [],"id": "button_inspection_inspect_all","note": "按钮-硬件巡检-巡检全部","title": "巡检全部"}],"id": "menu_inspection","note": "菜单-物理机管理-硬件巡检","title": "硬件巡检"}],"id": "menu_physical_machine_management","note": "菜单-物理机管理","title": "物理机管理"},{"children": [{"children": [{"children": [],"id": "button_order_create","note": "按钮-订单列表-新增","title": "新增订单"},{"children": [],"id": "button_order_delete","note": "按钮-订单列表-删除","title": "删除订单"},{"children": [],"id": "button_order_cancel","note": "按钮-订单列表-取消","title": "取消订单"},{"children": [],"id": "button_order_confirm","note": "按钮-订单列表-确认","title": "确认订单"},{"children": [],"id": "button_order_export","note": "按钮-订单列表-导出","title": "导出订单"}],"id": "menu_order","note": "菜单-订单管理-订单列表","title": "订单列表"},{"children": [{"children": [],"id": "button_device_category_create","note": "按钮-设备类型列表-新增","title": "新增设备类型"},{"children": [],"id": "button_device_category_delete","note": "按钮-设备类型列表-删除","title": "删除设备类型"},{"children": [],"id": "button_device_category_update","note": "按钮-设备类型列表-修改","title": "修改设备类型"}],"id": "menu_device_category","note": "菜单-订单管理-设备类型列表","title": "设备类型列表"}],"id": "menu_order_management","note": "菜单-订单管理","title": "订单管理"},{"children": [{"children": [{"children": [],"id": "button_system_template_create","note": "按钮-PXE配置-新建","title": "新建PXE配置"},{"children": [],"id": "button_system_template_update","note": "按钮-PXE配置-修改","title": "修改PXE配置"},{"children": [],"id": "button_system_template_delete","note": "按钮-PXE配置-删除","title": "删除PXE配置"},{"children": [],"id": "button_mirror_template_create","note": "按钮-镜像配置-新建","title": "新建镜像配置"},{"children": [],"id": "button_mirror_template_update","note": "按钮-镜像配置-修改","title": "修改镜像配置"},{"children": [],"id": "button_mirror_template_delete","note": "按钮-镜像配置-删除","title": "删除镜像配置"}],"id": "menu_system_template","note": "菜单-装机管理-系统/镜像配置","title": "系统/镜像配置"},{"children": [{"children": [],"id": "button_hardware_template_create","note": "按钮-硬件配置-新建","title": "新建/克隆硬件配置"},{"children": [],"id": "button_hardware_template_update","note": "按钮-硬件配置-修改","title": "修改硬件配置"},{"children": [],"id": "button_hardware_template_delete","note": "按钮-硬件配置-删除","title": "删除硬件配置"}],"id": "menu_hardware_template","note": "菜单-配置管理-硬件配置","title": "硬件配置"}],"id": "menu_template_management","note": "菜单-配置管理","title": "配置管理"},{"children": [{"children": [],"id": "button_approval_idc_abolish","note": "按钮-审批管理-数据中心裁撤","title": "数据中心裁撤审批"},{"children": [],"id": "button_approval_server_room_abolish","note": "按钮-审批管理-机房裁撤","title": "机房裁撤审批"},{"children": [],"id": "button_approval_cabinet_offline","note": "按钮-审批管理-机架下线","title": "机架下线审批"},{"children": [],"id": "button_approval_cabinet_powerOff","note": "按钮-审批管理-机架关电","title": "机架关电审批"},{"children": [],"id": "button_approval_network_area_offline","note": "按钮-审批管理-网络区域下线","title": "网络区域下线审批"},{"children": [],"id": "button_approval_physical_machine_move","note": "按钮-审批管理-物理机搬迁","title": "物理机搬迁审批"},{"children": [],"id": "button_approval_physical_machine_move_download","note": "按钮-审批管理-物理机搬迁导入模板","title": "下载物理机搬迁审批导入模板"},{"children": [],"id": "button_approval_physical_machine_move_import","note": "按钮-审批管理-导入物理机搬迁","title": "导入物理机搬迁审批"},{"children": [],"id": "button_approval_physical_machine_retirement","note": "按钮-审批管理-物理机退役","title": "物理机退役审批"},{"children": [],"id": "button_approval_physical_machine_reInstall","note": "按钮-审批管理-物理机重装","title": "物理机重装审批"},{"children": [],"id": "button_approval_physical_machine_power_off","note": "按钮-审批管理-物理机关电","title": "物理机关电审批"},{"children": [],"id": "button_approval_physical_machine_restart","note": "按钮-审批管理-物理机重启","title": "物理机重启审批"},{"children": [],"id": "button_approval_physical_machine_recycle_retire","note": "按钮-审批管理-物理机回收退役","title": "物理机回收退役审批"},{"children": [],"id": "button_approval_physical_machine_recycle_move","note": "按钮-审批管理-物理机回收搬迁","title": "物理机回收搬迁审批"},{"children": [],"id": "button_approval_physical_machine_recycle_reInstall","note": "按钮-审批管理-物理机回收重装","title": "物理机回收重装审批"},{"children": [],"id": "button_ip_unassign","note": "按钮-审批管理-IP回收","title": "IP回收审批"},{"children": [],"id": "button_approval_agree","note": "按钮-审批管理-审批通过","title": "审批通过"},{"children": [],"id": "button_approval_disagree","note": "按钮-审批管理-审批拒绝","title": "审批拒绝"},{"children": [],"id": "button_approval_revoke","note": "按钮-审批管理-审批撤销","title": "审批撤销"}],"id": "menu_approval","note": "菜单-审批管理","title": "审批管理"},{"children": [{"children": [],"id": "button_task_pause","note": "按钮-任务列表-暂停","title": "暂停"},{"children": [],"id": "button_task_continue","note": "按钮-任务列表-继续","title": "继续"},{"children": [],"id": "button_task_delete","note": "按钮-任务列表-删除","title": "删除"}],"id": "menu_task_management","note": "菜单-任务管理","title": "任务管理"}],"id": "","note": "","title": "所有权限"},"message": "操作成功","status": "success"}', '按钮权限列表', NULL), + (5, '2021-09-01 15:00:00', '2021-09-01 15:00:00', NULL, 'authorization', '[{"api": {"desc": "查看数据中心","method": "GET","uri_regexp": "^/api/cloudboot/v1/idcs$"},"codes": ["menu_idc","menu_idc_management"]},{"api": {"desc": "新增数据中心","method": "POST","uri_regexp": "^/api/cloudboot/v1/idcs$"},"codes": ["button_idc_create"]},{"api": {"desc": "修改数据中心","method": "PUT","uri_regexp": "^/api/cloudboot/v1/idcs/[0-9A-Za-z_]+$"},"codes": ["button_idc_update"]},{"api": {"desc": "修改数据中心状态","method": "PUT","uri_regexp": "^/api/cloudboot/v1/idcs/status$"},"codes": ["button_idc_accepted","button_idc_abolished","button_idc_production"]},{"api": {"desc": "删除数据中心","method": "DELETE","uri_regexp": "^/api/cloudboot/v1/idcs/[0-9A-Za-z_]+$"},"codes": ["button_idc_delete"]},{"api": {"desc": "查看机房","method": "GET","uri_regexp": "^/api/cloudboot/v1/server-rooms$"},"codes": ["menu_server_room"]},{"api": {"desc": "新增机房","method": "POST","uri_regexp": "^/api/cloudboot/v1/server-rooms$"},"codes": ["button_server_room_create"]},{"api": {"desc": "修改机房","method": "PUT","uri_regexp": "^/api/cloudboot/v1/server-rooms$"},"codes": ["button_server_room_update"]},{"api": {"desc": "修改机房状态","method": "PUT","uri_regexp": "^/api/cloudboot/v1/server-rooms/status$"},"codes": ["button_server_room_production","button_server_room_abolished","button_server_room_accepted"]},{"api": {"desc": "删除机房","method": "DELETE","uri_regexp": "^/api/cloudboot/v1/server-rooms/[0-9A-Za-z_]+$"},"codes": ["button_server_room_delete"]},{"api": {"desc": "加载导入机房文件","method": "POST","uri_regexp": "^/api/cloudboot/v1/server-rooms/upload$"},"codes": ["button_server_room_import"]},{"api": {"desc": "导入机房文件预览","method": "POST","uri_regexp": "^/api/cloudboot/v1/server-rooms/imports/previews$"},"codes": ["button_server_room_import"]},{"api": {"desc": "导入机房文件","method": "POST","uri_regexp": "^/api/cloudboot/v1/server-rooms/imports$"},"codes": ["button_server_room_import"]},{"api": {"desc": "查看网络区域","method": "GET","uri_regexp": "^/api/cloudboot/v1/network-areas$"},"codes": ["menu_network_area"]},{"api": {"desc": "新增网络区域","method": "POST","uri_regexp": "^/api/cloudboot/v1/network-areas$"},"codes": ["button_network_area_create"]},{"api": {"desc": "修改网络区域","method": "PUT","uri_regexp": "^/api/cloudboot/v1/network-areas$"},"codes": ["button_network_area_update"]},{"api": {"desc": "修改网络区域状态","method": "PUT","uri_regexp": "^/api/cloudboot/v1/network-areas/status$"},"codes": ["button_network_area_production","button_network_area_offline"]},{"api": {"desc": "删除网络区域","method": "DELETE","uri_regexp": "^/api/cloudboot/v1/network-areas/[0-9A-Za-z_]+$"},"codes": ["button_network_area_delete"]},{"api": {"desc": "加载导入导入网络区域文件","method": "POST","uri_regexp": "^/api/cloudboot/v1/network-areas/upload$"},"codes": ["button_network_area_import"]},{"api": {"desc": "导入网络区域文件预览","method": "POST","uri_regexp": "^/api/cloudboot/v1/network-areas/imports/previews$"},"codes": ["button_network_area_import"]},{"api": {"desc": "导入网络区域文件","method": "POST","uri_regexp": "^/api/cloudboot/v1/network-areas/imports$"},"codes": ["button_network_area_import"]},{"api": {"desc": "查看机架(柜)","method": "GET","uri_regexp": "^/api/cloudboot/v1/server-cabinets$"},"codes": ["menu_server_cabinet"]},{"api": {"desc": "新增机架(柜)","method": "POST","uri_regexp": "^/api/cloudboot/v1/server-cabinets$"},"codes": ["button_server_cabinet_create"]},{"api": {"desc": "修改机架(柜)","method": "PUT","uri_regexp": "^/api/cloudboot/v1/server-cabinets$"},"codes": ["button_server_cabinet_update"]},{"api": {"desc": "修改机架(柜)状态","method": "PUT","uri_regexp": "^/api/cloudboot/v1/server-cabinets/status$"},"codes": ["button_server_cabinet_powerOn","button_server_cabinet_powerOff","button_server_cabinet_offline","button_server_cabinet_enabled"]},{"api": {"desc": "删除机架(柜)","method": "DELETE","uri_regexp": "^/api/cloudboot/v1/server-cabinets/[0-9A-Za-z_]+$"},"codes": ["button_server_cabinet_delete"]},{"api": {"desc": "机架开电","method": "POST","uri_regexp": "^/api/cloudboot/v1/server-cabinets/[0-9A-Za-z_]+/power$"},"codes": ["button_server_cabinet_powerOn"]},{"api": {"desc": "机架关电","method": "DELETE","uri_regexp": "^/api/cloudboot/v1/server-cabinets/[0-9A-Za-z_]+/power$"},"codes": ["button_server_cabinet_powerOff"]},{"api": {"desc": "加载导入机架(柜)文件","method": "POST","uri_regexp": "^/api/cloudboot/v1/server-cabinets/upload$"},"codes": ["button_server_cabinet_import"]},{"api": {"desc": "导入机架(柜)文件预览","method": "POST","uri_regexp": "^/api/cloudboot/v1/server-cabinets/imports/previews$"},"codes": ["button_server_cabinet_import"]},{"api": {"desc": "导入机架(柜)文件","method": "POST","uri_regexp": "^/api/cloudboot/v1/server-cabinets/imports$"},"codes": ["button_server_cabinet_import"]},{"api": {"desc": "查看机位(U位)","method": "GET","uri_regexp": "^/api/cloudboot/v1/server-usites$"},"codes": ["menu_server_usite"]},{"api": {"desc": "新增机位(U位)","method": "POST","uri_regexp": "^/api/cloudboot/v1/server-usites$"},"codes": ["button_server_usite_create"]},{"api": {"desc": "修改机位(U位)","method": "PUT","uri_regexp": "^/api/cloudboot/v1/server-usites$"},"codes": ["button_server_usite_update"]},{"api": {"desc": "删除机位(U位)","method": "DELETE","uri_regexp": "^/api/cloudboot/v1/server-usites/[0-9A-Za-z_]+$"},"codes": ["button_server_usite_delete"]},{"api": {"desc": "删除机位(U位)端口号","method": "DELETE","uri_regexp": "^/api/cloudboot/v1/server-usites/[0-9A-Za-z_]+/ports$"},"codes": ["button_server_usite_delete_port"]},{"api": {"desc": "修改机位(U位)状态","method": "PUT","uri_regexp": "^/api/cloudboot/v1/server-usites/status$"},"codes": ["button_server_usite_status"]},{"api": {"desc": "加载导入机位(U位)文件","method": "POST","uri_regexp": "^/api/cloudboot/v1/server-usites/upload$"},"codes": ["button_server_usite_import"]},{"api": {"desc": "导入机位(U位)文件预览","method": "POST","uri_regexp": "^/api/cloudboot/v1/server-usites/imports/previews$"},"codes": ["button_server_usite_import"]},{"api": {"desc": "导入机位(U位)文件","method": "POST","uri_regexp": "^/api/cloudboot/v1/server-usites/imports$"},"codes": ["button_server_usite_import"]},{"api": {"desc": "加载导入机位(U位)端口号文件","method": "POST","uri_regexp": "^/api/cloudboot/v1/server-usites/ports/upload$"},"codes": ["button_server_usite_import_port"]},{"api": {"desc": "导入机位(U位)端口号文件预览","method": "POST","uri_regexp": "^/api/cloudboot/v1/server-usites/ports/imports/previews$"},"codes": ["button_server_usite_import_port"]},{"api": {"desc": "导入机位(U位)端口号文件","method": "POST","uri_regexp": "^/api/cloudboot/v1/server-usites/ports/imports$"},"codes": ["button_server_usite_import_port"]},{"api": {"desc": "查看库房管理单元","method": "GET","uri_regexp": "^/api/cloudboot/v1/store-room$"},"codes": ["menu_store_room"]},{"api": {"desc": "新增库房管理单元","method": "POST","uri_regexp": "^/api/cloudboot/v1/store-room$"},"codes": ["button_store_room_create"]},{"api": {"desc": "上传导入库房管理单元文件","method": "POST","uri_regexp": "^/api/cloudboot/v1/store-room/upload$"},"codes": ["button_store_room_import"]},{"api": {"desc": "导入库房管理单元文件预览","method": "POST","uri_regexp": "^/api/cloudboot/v1/store-room/imports/previews$"},"codes": ["button_store_room_import"]},{"api": {"desc": "导入库房管理单元","method": "POST","uri_regexp": "^/api/cloudboot/v1/store-room/imports$"},"codes": ["button_store_room_import"]},{"api": {"desc": "删除库房管理单元","method": "DELETE","uri_regexp": "^/api/cloudboot/v1/store-room/[0-9]+$"},"codes": ["button_store_room_delete"]},{"api": {"desc": "修改库房管理单元","method": "PUT","uri_regexp": "^/api/cloudboot/v1/store-room$"},"codes": ["button_store_room_update"]},{"api": {"desc": "新增虚拟货架","method": "POST","uri_regexp": "^/api/cloudboot/v1/virtual-cabinet$"},"codes": ["button_virtual_cabinet_create"]},{"api": {"desc": "删除虚拟货架","method": "DELETE","uri_regexp": "^/api/cloudboot/v1/virtual-cabinet/[0-9]+$"},"codes": ["button_virtual_cabinet_delete"]},{"api": {"desc": "新增带外管理","method": "POST","uri_regexp": "^/api/cloudboot/v1/devices/power$"},"codes": ["button_physical_machine_powerOn","button_predeploy_physical_machine_powerOn"]},{"api": {"desc": "带外管理批量PXE重启","method": "PUT","uri_regexp": "^/api/cloudboot/v1/devices/power/pxe/restart$"},"codes": ["button_physical_machine_networkBoot","button_predeploy_physical_machine_networkBoot"]},{"api": {"desc": "带外管理批量重启","method": "PUT","uri_regexp": "^/api/cloudboot/v1/devices/power/restart$"},"codes": ["button_physical_machine_reBoot","button_predeploy_physical_machine_reBoot"]},{"api": {"desc": "带外管理批量关机","method": "DELETE","uri_regexp": "^/api/cloudboot/v1/devices/power$"},"codes": ["button_physical_machine_powerOff","button_predeploy_physical_machine_powerOff"]},{"api": {"desc": "修改带外用户密码","method": "PUT","uri_regexp": "^/api/cloudboot/v1/devices/[0-9A-Za-z_]+/oob/password$"},"codes": ["button_physical_machine_update_oob"]},{"api": {"desc": "新增物理机","method": "POST","uri_regexp": "^/api/cloudboot/v1/devices/[0-9A-Za-z_]+/collections$"},"codes": []},{"api": {"desc": "加载导入物理机文件","method": "POST","uri_regexp": "^/api/cloudboot/v1/devices/upload$"},"codes": ["button_predeploy_physical_machine_import"]},{"api": {"desc": "导入物理机文件预览","method": "POST","uri_regexp": "^/api/cloudboot/v1/devices/imports/previews$"},"codes": ["button_predeploy_physical_machine_import"]},{"api": {"desc": "加入物理机文件","method": "POST","uri_regexp": "^/api/cloudboot/v1/devices/imports$"},"codes": ["button_predeploy_physical_machine_import"]},{"api": {"desc": "查看物理机","method": "GET","uri_regexp": "^/api/cloudboot/v1/devices$"},"codes": ["menu_physical_machine"]},{"api": {"desc": "修改物理机","method": "PUT","uri_regexp": "^/api/cloudboot/v1/device$"},"codes": ["button_physical_machine_update"]},{"api": {"desc": "存量物理机导入","method": "POST","uri_regexp": "^/api/cloudboot/v1/devices/stock/upload$"},"codes": ["button_physical_machine_import"]},{"api": {"desc": "存量物理机导入预览","method": "POST","uri_regexp": "^/api/cloudboot/v1/devices/stock/imports/previews$"},"codes": ["button_physical_machine_import"]},{"api": {"desc": "加载存量物理机导入文件","method": "POST","uri_regexp": "^/api/cloudboot/v1/devices/stock//imports$"},"codes": ["button_physical_machine_import"]},{"api": {"desc": "上传物理机导入到库房文件","method": "POST","uri_regexp": "^/api/cloudboot/v1/devices/store/upload$"},"codes": ["button_device_store_import"]},{"api": {"desc": "物理机导入到库房预览","method": "POST","uri_regexp": "^/api/cloudboot/v1/devices/store/imports/previews$"},"codes": ["button_device_store_import"]},{"api": {"desc": "物理机导入到库房","method": "POST","uri_regexp": "^/api/cloudboot/v1/devices/store/imports$"},"codes": ["button_device_store_import"]},{"api": {"desc": "重新批量纳管带外","method": "PUT","uri_regexp": "^/api/cloudboot/v1/devices/oob/re-access$"},"codes": ["button_oob_re_access"]},{"api": {"desc": "上传特殊设备文件","method": "POST","uri_regexp": "^/api/cloudboot/v1/special-devices/upload$"},"codes": ["button_special_device_import"]},{"api": {"desc": "特殊设备预览","method": "POST","uri_regexp": "^/api/cloudboot/v1/special-devices/imports/previews$"},"codes": ["button_special_device_import"]},{"api": {"desc": "导入特殊设备","method": "POST","uri_regexp": "^/api/cloudboot/v1/special-devices/imports$"},"codes": ["button_special_device_import"]},{"api": {"desc": "删除物理机","method": "DELETE","uri_regexp": "^/api/cloudboot/v1/devices/[0-9A-Za-z_]+$"},"codes": ["button_physical_machine_delete","button_predeploy_physical_machine_delete"]},{"api": {"desc": "查看订单","method": "GET","uri_regexp": "^/api/cloudboot/v1/order$"},"codes": ["menu_order"]},{"api": {"desc": "新增订单","method": "POST","uri_regexp": "^/api/cloudboot/v1/order$"},"codes": ["button_order_create"]},{"api": {"desc": "删除订单","method": "DELETE","uri_regexp": "^/api/cloudboot/v1/orders$"},"codes": ["button_order_delete"]},{"api": {"desc": "修改订单状态","method": "PUT","uri_regexp": "^/api/cloudboot/v1/order/status$"},"codes": ["button_order_cancel","button_order_confirm"]},{"api": {"desc": "导出订单","method": "GET","uri_regexp": "^/api/cloudboot/v1/orders/export$"},"codes": ["button_order_export"]},{"api": {"desc": "查看设备类型","method": "GET","uri_regexp": "^/api/cloudboot/v1/device-category$"},"codes": ["menu_device_category"]},{"api": {"desc": "新增设备类型","method": "POST","uri_regexp": "^/api/cloudboot/v1/device-category$"},"codes": ["button_device_category_create"]},{"api": {"desc": "修改设备类型","method": "POST","uri_regexp": "^/api/cloudboot/v1/device-category$"},"codes": ["button_device_category_update"]},{"api": {"desc": "删除设备类型","method": "DELETE","uri_regexp": "^/api/cloudboot/v1/device-categories$"},"codes": ["button_device_category_delete"]},{"api": {"desc": "查看网段","method": "GET","uri_regexp": "^/api/cloudboot/v1/ip-networks$"},"codes": ["menu_ip_network"]},{"api": {"desc": "新增网段","method": "POST","uri_regexp": "^/api/cloudboot/v1/ip-networks$"},"codes": ["button_ip_network_create"]},{"api": {"desc": "修改网段","method": "POST","uri_regexp": "^/api/cloudboot/v1/ip-networks$"},"codes": ["button_ip_network_update"]},{"api": {"desc": "删除网段","method": "DELETE","uri_regexp": "^/api/cloudboot/v1/ip-networks/[0-9A-Za-z_]+$"},"codes": ["button_ip_network_delete"]},{"api": {"desc": "上传导入IP网段文件","method": "POST","uri_regexp": "^/api/cloudboot/v1/ip-networks/upload$"},"codes": ["button_ip_network_import"]},{"api": {"desc": "导入IP网段文件预览","method": "POST","uri_regexp": "^/api/cloudboot/v1/ip-networks/imports/previews$"},"codes": ["button_ip_network_import"]},{"api": {"desc": "导入IP网段文件","method": "POST","uri_regexp": "^/api/cloudboot/v1/ip-networks/imports$"},"codes": ["button_ip_network_import"]},{"api": {"desc": "查看IP列表","method": "GET","uri_regexp": "^/api/cloudboot/v1/ips$"},"codes": ["menu_ip"]},{"api": {"desc": "手动分配IP","method": "PUT","uri_regexp": "^/api/cloudboot/v1/ips/assigns$"},"codes": ["button_ip_assign"]},{"api": {"desc": " 手动取消IP分配","method": "PUT","uri_regexp": "^/api/cloudboot/v1/ips/unassigns$"},"codes": ["button_ip_unassign"]},{"api": {"desc": "删除网络设备","method": "DELETE","uri_regexp": "^/api/cloudboot/v1/network/devices/[0-9A-Za-z_]+$"},"codes": ["button_network_device_delete"]},{"api": {"desc": "查看网络设备","method": "GET","uri_regexp": "^/api/cloudboot/v1/network/devices$"},"codes": ["menu_network_device"]},{"api": {"desc": "新增网络设备","method": "POST","uri_regexp": "^/api/cloudboot/v1/network/devices$"},"codes": ["button_network_device_create"]},{"api": {"desc": "网络设备同步","method": "POST","uri_regexp": "^/api/cloudboot/v1/network/devices/sync$"},"codes": ["button_network_device_sync"]},{"api": {"desc": "上传网络设备文件","method": "POST","uri_regexp": "^/api/cloudboot/v1/network/devices/upload$"},"codes": ["button_ip_network_import"]},{"api": {"desc": "导入网络设备文件预览","method": "POST","uri_regexp": "^/api/cloudboot/v1/network/devices/imports/previews$"},"codes": ["button_ip_network_import"]},{"api": {"desc": "导入网络设备文件","method": "POST","uri_regexp": "^/api/cloudboot/v1/network/devices/imports$"},"codes": ["button_ip_network_import"]},{"api": {"desc": "上报安装进度","method": "POST","uri_regexp": "^/api/cloudboot/v1/devices/[0-9A-Za-z_]+/installations/progress$"},"codes": []},{"api": {"desc": "查看装机参数","method": "GET","uri_regexp": "^/api/cloudboot/v1/devices/settings$"},"codes": ["menu_device_setting"]},{"api": {"desc": "新增装机参数","method": "POST","uri_regexp": "^/api/cloudboot/v1/devices/settings$"},"codes": ["button_predeploy_physical_machine_osInstall"]},{"api": {"desc": "批量重装设备","method": "PUT","uri_regexp": "^/api/cloudboot/v1/devices/installations/reinstalls$"},"codes": ["button_device_setting_reInstall"]},{"api": {"desc": "批量取消安装设备","method": "PUT","uri_regexp": "^/api/cloudboot/v1/devices/installations/cancels$"},"codes": ["button_device_setting_cancelInstall"]},{"api": {"desc": "批量删除设备装机参数","method": "DELETE","uri_regexp": "^/api/cloudboot/v1/devices/settings$"},"codes": ["button_device_setting_delete"]},{"api": {"desc": "删除硬件模板","method": "DELETE","uri_regexp": "^/api/cloudboot/v1/hardware-templates/[0-9A-Za-z_]+$"},"codes": ["button_hardware_template_delete"]},{"api": {"desc": "修改硬件模板","method": "PUT","uri_regexp": "^/api/cloudboot/v1/hardware-templates$"},"codes": ["button_hardware_template_update"]},{"api": {"desc": "查看硬件模板","method": "GET","uri_regexp": "^/api/cloudboot/v1/hardware-templates$"},"codes": ["menu_hardware_template"]},{"api": {"desc": "新增硬件模板","method": "POST","uri_regexp": "^/api/cloudboot/v1/hardware-templates$"},"codes": ["button_hardware_template_create"]},{"api": {"desc": "查看镜像模板","method": "GET","uri_regexp": "^/api/cloudboot/v1/image-templates$"},"codes": ["menu_template_management"]},{"api": {"desc": "新增镜像模板","method": "POST","uri_regexp": "^/api/cloudboot/v1/image-templates$"},"codes": ["button_mirror_template_create"]},{"api": {"desc": "修改镜像模板","method": "PUT","uri_regexp": "^/api/cloudboot/v1/image-templates$"},"codes": ["button_mirror_template_update"]},{"api": {"desc": "删除镜像模板","method": "DELETE","uri_regexp": "^/api/cloudboot/v1/image-templates/[0-9A-Za-z_]+$"},"codes": ["button_mirror_template_delete"]},{"api": {"desc": "查看系统模板","method": "GET","uri_regexp": "^/api/cloudboot/v1/system-templates$"},"codes": ["menu_template_management"]},{"api": {"desc": "新增系统模板","method": "POST","uri_regexp": "^/api/cloudboot/v1/system-templates$"},"codes": ["button_system_template_create"]},{"api": {"desc": "修改系统模板","method": "PUT","uri_regexp": "^/api/cloudboot/v1/system-templates$"},"codes": ["button_system_template_update"]},{"api": {"desc": "删除系统模板","method": "DELETE","uri_regexp": "^/api/cloudboot/v1/system-templates/[0-9A-Za-z_]+$"},"codes": ["button_system_template_delete"]},{"api": {"desc": "查看巡检任务","method": "GET","uri_regexp": "^/api/cloudboot/v1/jobs/inspections$"},"codes": ["menu_inspection"]},{"api": {"desc": "新增巡检任务","method": "POST","uri_regexp": "^/api/cloudboot/v1/jobs/inspections$"},"codes": ["button_inspection_addTask","button_inspection_inspect","button_inspection_inspect_all"]},{"api": {"desc": "查看任务列表","method": "GET","uri_regexp": "^/api/cloudboot/v1/jobs$"},"codes": ["menu_task_management"]},{"api": {"desc": "删除目标任务API","method": "DELETE","uri_regexp": "^/api/cloudboot/v1/jobs/[0-9A-Za-z_]+$"},"codes": ["button_task_delete"]},{"api": {"desc": "暂停目标任务API","method": "PUT","uri_regexp": "^/api/cloudboot/v1/jobs/[0-9A-Za-z_]+/pausing$"},"codes": ["button_task_pause"]},{"api": {"desc": "继续已暂停的目标任务API","method": "PUT","uri_regexp": "^/api/cloudboot/v1/jobs/[0-9A-Za-z_]+/unpausing$"},"codes": ["button_task_continue"]},{"api": {"desc": "为目标设备生成PXE文件","method": "POST","uri_regexp": "^/api/cloudboot/v1/devices/[0-9A-Za-z_]+/pxe$"},"codes": []},{"api": {"desc": "生成centos6 pxe模板","method": "POST","uri_regexp": "^/api/cloudboot/v1/devices/[0-9A-Za-z_]+/centos6/uefi/pxe$"},"codes": []},{"api": {"desc": "发起数据中心裁撤审批","method": "POST","uri_regexp": "^/api/cloudboot/v1/approvals/idc/abolish$"},"codes": ["button_approval_idc_abolish"]},{"api": {"desc": "发起机房裁撤审批","method": "POST","uri_regexp": "^/api/cloudboot/v1/approvals/server-room/abolish$"},"codes": ["button_approval_server_room_abolish"]},{"api": {"desc": "发起机架关电审批","method": "POST","uri_regexp": "^/api/cloudboot/v1/approvals/server-cabinets/poweroffs$"},"codes": ["button_approval_cabinet_powerOff"]},{"api": {"desc": "发起机架下线审批","method": "POST","uri_regexp": "^/api/cloudboot/v1/approvals/server-cabinets/offlines$"},"codes": ["button_approval_cabinet_offline"]},{"api": {"desc": "发起网络区域下线审批","method": "POST","uri_regexp": "^/api/cloudboot/v1/approvals/network-area/offline$"},"codes": ["button_approval_network_area_offline"]},{"api": {"desc": "发起物理机搬迁审批","method": "POST","uri_regexp": "^/api/cloudboot/v1/approvals/devices/migrations$"},"codes": ["button_approval_physical_machine_move"]},{"api": {"desc": "上传物理机搬迁审批文件","method": "POST","uri_regexp": "^/api/cloudboot/v1/approvals/devices/migrations/upload$"},"codes": ["button_approval_physical_machine_move_import"]},{"api": {"desc": "导入物理机搬迁审批预览","method": "POST","uri_regexp": "^/api/cloudboot/v1/approvals/devices/migrations/imports/previews$"},"codes": ["button_approval_physical_machine_move_import"]},{"api": {"desc": "导入物理机搬迁审批","method": "POST","uri_regexp": "^/api/cloudboot/v1/approvals/devices/migrations/imports$"},"codes": ["button_approval_physical_machine_move_import"]},{"api": {"desc": "发起物理机退役审批","method": "POST","uri_regexp": "^/api/cloudboot/v1/approvals/devices/retirements$"},"codes": ["button_approval_physical_machine_retirement"]},{"api": {"desc": "发起物理机重装审批","method": "POST","uri_regexp": "^/api/cloudboot/v1/approvals/devices/os-reinstallations$"},"codes": ["button_approval_physical_machine_reInstall"]},{"api": {"desc": "发起物理机关电审批","method": "POST","uri_regexp": "^/api/cloudboot/v1/approvals/device/poweroff$"},"codes": ["button_approval_physical_machine_power_off"]},{"api": {"desc": "发起物理机重启审批","method": "POST","uri_regexp": "^/api/cloudboot/v1/approvals/device/restart$"},"codes": ["button_approval_physical_machine_restart"]},{"api": {"desc": "发起物理机回收审批","method": "POST","uri_regexp": "^/api/cloudboot/v1/approvals/devices/recycle$"},"codes": ["button_approval_physical_machine_recycle_retire","button_approval_physical_machine_recycle_move","button_approval_physical_machine_recycle_reInstall"]},{"api": {"desc": "发起IP回收审批","method": "POST","uri_regexp": "^/api/cloudboot/v1/approvals/ip/unassign$"},"codes": ["button_ip_unassign"]},{"api": {"desc": "归还设备持有的DHCP IP令牌","method": "DELETE","uri_regexp": "^/api/cloudboot/v1/devices/[0-9A-Za-z_]+/limiters/tokens$"},"codes": ["menu_device_setting"]},{"api": {"desc": "一键归还所有设备持有的DHCP IP令牌","method": "DELETE","uri_regexp": "^/api/cloudboot/v1/devices/limiters/tokens$"},"codes": ["menu_device_setting"]},{"api": {"desc": "查看装机参数规则","method": "GET","uri_regexp": "^/api/cloudboot/v1/device-setting-rules$"},"codes": ["menu_device_setting_rule"]},{"api": {"desc": "新增装机参数规则","method": "POST","uri_regexp": "^/api/cloudboot/v1/device-setting-rules$"},"codes": ["button_device_setting_rule_create"]},{"api": {"desc": "修改装机参数规则","method": "PUT","uri_regexp": "^/api/cloudboot/v1/device-setting-rules$"},"codes": ["button_device_setting_rule_update"]},{"api": {"desc": "删除装机参数规则","method": "DELETE","uri_regexp": "^/api/cloudboot/v1/device-setting-rules$"},"codes": ["button_device_setting_rule_delete"]}]', 'API权限集合', NULL); +/*!40000 ALTER TABLE `system_setting` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.system_template 结构 +CREATE TABLE IF NOT EXISTS `system_template` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id', + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `family` varchar(255) DEFAULT NULL COMMENT '族系', + `name` varchar(255) NOT NULL COMMENT '模板名', + `boot_mode` enum('legacy_bios','uefi') DEFAULT 'legacy_bios' COMMENT '启动模式。可选值: legacy_bios-传统BIOS模式; uefi-UEFI模式;', + `username` varchar(255) DEFAULT NULL COMMENT '操作系统用户名', + `password` varchar(255) DEFAULT NULL COMMENT '操作系统用户密码', + `content` longtext COMMENT '系统模板内容', + `pxe` longtext COMMENT 'PXE引导配置', + `os_lifecycle` enum('testing','active_default','active','containment','end_of_life') DEFAULT 'testing' COMMENT 'OS生命周期:Testing|Active(Default)|Active|Containment|EOL', + `arch` enum('unknown','x86_64','aarch64') DEFAULT NULL COMMENT 'OS架构', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_system_template_name` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8 COMMENT='系统安装模板表'; + +-- 正在导出表 cloudboot_cyclone.system_template 的数据:~12 rows (大约) +/*!40000 ALTER TABLE `system_template` DISABLE KEYS */; +REPLACE INTO `system_template` (`id`, `created_at`, `updated_at`, `deleted_at`, `family`, `name`, `boot_mode`, `username`, `password`, `content`, `pxe`, `os_lifecycle`, `arch`) VALUES + (1, '2018-05-22 06:43:04', '2023-03-16 16:08:22', NULL, 'BootOS', 'bootos_x86_64', 'uefi', '', '', '#', '#!ipxe\nkernel http://osinstall.idcos.com/bootos/x86_64/vmlinuz initrd=initrd.img console=tty0 selinux=0 biosdevname=0 SERVER_ADDR=http://osinstall.idcos.com LOOP_INTERVAL=5 DEVELOPER=1 BOOTIF=01-${netX/mac:hexhyp}\ninitrd http://osinstall.idcos.com/bootos/x86_64/initrd.img\nboot', 'testing', 'x86_64'), + (2, '2018-05-22 06:43:04', '2023-12-06 21:46:22', NULL, 'BootOS', 'bootos_arm64', 'uefi', '', '', '#', '#!ipxe\nkernel http://osinstall.idcos.com/bootos/aarch64/vmlinuz initrd=initrd.img console=tty0 selinux=0 biosdevname=0 SERVER_ADDR=http://osinstall.idcos.com LOOP_INTERVAL=5 DEVELOPER=1 BOOTIF=01-${netX/mac:hexhyp}\ninitrd http://osinstall.idcos.com/bootos/aarch64/initrd.img\nboot\n', 'testing', 'aarch64'), + (4, '2018-05-22 06:53:22', '2023-03-16 16:09:35', NULL, 'BootOS', 'winpe2012_x86_64', 'legacy_bios', '', '', '#', '#!ipxe\nkernel http://osinstall.idcos.com/winpe/wimboot\ninitrd http://osinstall.idcos.com/winpe/2012/Boot/BCD BCD\ninitrd http://osinstall.idcos.com/winpe/2012/Boot/boot.sdi boot.sdi\ninitrd http://osinstall.idcos.com/winpe/2012/sources/boot.wim boot.wim\nboot', 'testing', 'x86_64'), + (17, '2019-11-20 10:51:40', '2023-12-07 09:18:01', NULL, 'CentOS', 'CentOS_7.6_aarch64', 'uefi', 'root', 'Cyclone@1234', 'install\nurl --url=http://osinstall.idcos.com/centos/7.6/os/aarch64/\nlang en_US.UTF-8\nkeyboard us\nnetwork --onboot yes --device bootif --bootproto dhcp --noipv6\nrootpw Cyclone@1234\nfirewall --disabled\nauthconfig --enableshadow --passalgo=sha512\nselinux --disabled\ntimezone Asia/Shanghai\ntext\nreboot\nzerombr\nbootloader --location=mbr\nclearpart --all --initlabel\npart /boot/efi --fstype=efi --size=200 --ondisk=sda \npart /boot --fstype=xfs --size=1024 --ondisk=sda\npart swap --size=8192 --ondisk=sda\npart / --fstype=xfs --size=30720 --ondisk=sda\npart /tmp --fstype=xfs --size=10240 --ondisk=sda\npart /home --fstype=xfs --size=5120 --ondisk=sda\npart /usr/local --fstype=xfs --size=20480 --ondisk=sda\npart /data --fstype=xfs --size=1 --grow --ondisk=sda\n\n%packages --ignoremissing\n@base\n@core\n@development\ndmidecode\n%end\n\n%pre\n_sn=$(dmidecode -s system-serial-number 2>/dev/null | awk \'/^[^#]/ { print $1 }\')\n\ncurl -H "Content-Type: application/json" -X POST -d "{\\"title\\":\\"启动OS安装程序\\",\\"progress\\":0.6,\\"log\\":\\"SW5zdGFsbCBPUwo=\\"}" http://osinstall.idcos.com/api/cloudboot/v1/devices/$_sn/installations/progress\ncurl -H "Content-Type: application/json" -X POST -d "{\\"title\\":\\"分区并安装软件包\\",\\"progress\\":0.7,\\"log\\":\\"SW5zdGFsbCBPUwo=\\"}" http://osinstall.idcos.com/api/cloudboot/v1/devices/$_sn/installations/progress\n%end\n\n%post\n# dowload commonSetting.py for setting items in OS\ncurl -o /tmp/commonSetting.py "http://osinstall.idcos.com/scripts/commonSetting.py"\n\n# config network\npython /tmp/commonSetting.py --network=Y \n\n# config osuser\npython /tmp/commonSetting.py --osuser=Y\n\n# complete\npython /tmp/commonSetting.py --complete=Y\n%end', '#!ipxe\nkernel http://osinstall.idcos.com/centos/7.6/os/aarch64/images/pxeboot/vmlinuz initrd=initrd.img ksdevice=bootif ks=http://osinstall.idcos.com/api/cloudboot/v1/devices/{sn}/settings/system-template console=tty0 selinux=0 net.ifnames=0 biosdevname=0 BOOTIF=01-${netX/mac:hexhyp}\ninitrd http://osinstall.idcos.com/centos/7.6/os/aarch64/images/pxeboot/initrd.img\nboot', 'active', 'aarch64'), + (22, '2020-05-15 17:10:03', '2023-12-06 21:42:41', NULL, 'Windows Server', 'win2012r2', 'uefi', 'administrator', 'Cyclone@1234', '\n\n \n \n true\n \n \n true\n \n \n \n \n 26BKW-N43FC-2B86G-PT2FG-PDJF8\n false\n false\n China Standard Time\n WebankWinServer\n WeBank\n TCTP\n \n \n false\n \n \n \n \n true\n @FirewallAPI.dll,-28752\n all\n \n \n \n \n \n \n \n \n Cyclone@1234\n true</PlainText>\n </Password>\n <Enabled>true</Enabled>\n <LogonCount>1</LogonCount>\n <Username>Administrator</Username>\n </AutoLogon>\n <OOBE>\n <HideEULAPage>true</HideEULAPage>\n </OOBE>\n <UserAccounts>\n <AdministratorPassword>\n <PlainText>true</PlainText>\n <Value>Cyclone@1234</Value>\n </AdministratorPassword>\n </UserAccounts>\n <FirstLogonCommands>\n <SynchronousCommand wcm:action="add">\n <Order>1</Order>\n <CommandLine>C:\\firstboot\\winconfig.exe</CommandLine>\n <Description></Description>\n <RequiresUserInput>false</RequiresUserInput>\n </SynchronousCommand>\n </FirstLogonCommands>\n </component>\n <component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n <SystemLocale>zh-CN</SystemLocale>\n <UILanguage>zh-CN</UILanguage>\n <UILanguageFallback>zh-CN</UILanguageFallback>\n <UserLocale>zh-CN</UserLocale>\n <InputLocale>zh-CN</InputLocale>\n </component>\n </settings>\n <settings pass="windowsPE">\n <component name="Microsoft-Windows-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n <ImageInstall>\n <OSImage>\n <InstallFrom>\n <Path>Z:\\windows\\2012r2\\sources\\install.wim</Path>\n <MetaData wcm:action="add">\n <Key>/IMAGE/NAME</Key>\n <Value>Windows Server 2012 R2 SERVERSTANDARD</Value>\n </MetaData>\n </InstallFrom>\n <InstallTo>\n <DiskID>0</DiskID>\n <PartitionID>3</PartitionID>\n </InstallTo>\n <WillShowUI>OnError</WillShowUI>\n </OSImage>\n </ImageInstall>\n <UserData>\n <ProductKey>\n <WillShowUI>OnError</WillShowUI>\n <Key>26BKW-N43FC-2B86G-PT2FG-PDJF8</Key>\n </ProductKey>\n <AcceptEula>true</AcceptEula>\n </UserData>\n <EnableFirewall>true</EnableFirewall>\n <EnableNetwork>true</EnableNetwork>\n <DiskConfiguration>\n <Disk wcm:action="add">\n <CreatePartitions>\n <CreatePartition wcm:action="add">\n <Extend>false</Extend>\n <Order>1</Order>\n <Size>260</Size>\n <Type>EFI</Type>\n </CreatePartition>\n <CreatePartition wcm:action="add">\n <Extend>false</Extend>\n <Order>2</Order>\n <Size>16</Size>\n <Type>MSR</Type>\n </CreatePartition>\n <CreatePartition wcm:action="add">\n <Extend>false</Extend>\n <Order>3</Order>\n <Size>202400</Size>\n <Type>Primary</Type>\n </CreatePartition>\n <CreatePartition wcm:action="add">\n <Extend>false</Extend>\n <Order>4</Order>\n <Size>202400</Size>\n <Type>Primary</Type>\n </CreatePartition>\n </CreatePartitions>\n <ModifyPartitions>\n <ModifyPartition wcm:action="add">\n <Format>FAT32</Format>\n <Label>System</Label>\n <Order>1</Order>\n <PartitionID>1</PartitionID>\n </ModifyPartition>\n <ModifyPartition wcm:action="add">\n <Format>NTFS</Format>\n <Label>System</Label>\n <Letter>C</Letter>\n <Order>2</Order>\n <PartitionID>3</PartitionID>\n </ModifyPartition>\n <ModifyPartition wcm:action="add">\n <Extend>true</Extend>\n <Format>NTFS</Format>\n <Label>data</Label>\n <Letter>D</Letter>\n <Order>3</Order>\n <PartitionID>4</PartitionID>\n </ModifyPartition>\n </ModifyPartitions>\n <DiskID>0</DiskID>\n <WillWipeDisk>true</WillWipeDisk>\n </Disk>\n <WillShowUI>OnError</WillShowUI>\n </DiskConfiguration>\n </component>\n <component name="Microsoft-Windows-International-Core-WinPE" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n <SetupUILanguage>\n <UILanguage>zh-CN</UILanguage>\n </SetupUILanguage>\n <InputLocale>zh-CN</InputLocale>\n <SystemLocale>zh-CN</SystemLocale>\n <UILanguage>zh-CN</UILanguage>\n <UserLocale>zh-CN</UserLocale>\n <UILanguageFallback>zh-CN</UILanguageFallback>\n </component>\n </settings>\n <settings pass="offlineServicing">\n <component name="Microsoft-Windows-LUA-Settings" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n <EnableLUA>false</EnableLUA>\n </component>\n </settings>\n <cpi:offlineImage cpi:source="catalog://osinstall/image/windows/clg/install_windows server 2012 r2 serverstandard.clg" xmlns:cpi="urn:schemas-microsoft-com:cpi" />\n</unattend>', '#!ipxe\nkernel http://osinstall.idcos.com/winpe/wimboot\ninitrd http://osinstall.idcos.com/winpe/2012/bootmgr bootmgr \ninitrd http://osinstall.idcos.com/winpe/2012/EFI/Boot/bootx64.efi bootx64.efi \ninitrd http://osinstall.idcos.com/winpe/2012/Boot/BCD BCD \ninitrd http://osinstall.idcos.com/winpe/2012/Boot/boot.sdi boot.sdi \ninitrd http://osinstall.idcos.com/winpe/2012/sources/boot.wim boot.wim \nboot', 'testing', 'x86_64'), + (24, '2021-02-24 10:14:17', '2023-12-06 21:42:14', NULL, 'Windows Server', 'win2016', 'uefi', 'administrator', 'Cyclone@1234', '<?xml version="1.0" encoding="utf-8"?>\n<unattend xmlns="urn:schemas-microsoft-com:unattend">\n <settings pass="generalize">\n <component name="Microsoft-Windows-OutOfBoxExperience" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n <DoNotOpenInitialConfigurationTasksAtLogon>true</DoNotOpenInitialConfigurationTasksAtLogon>\n </component>\n <component name="Microsoft-Windows-ServerManager-SvrMgrNc" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n <DoNotOpenServerManagerAtLogon>true</DoNotOpenServerManagerAtLogon>\n </component>\n </settings>\n <settings pass="specialize">\n <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n <ProductKey>NTYKT-H46BX-YH9D7-BJ7M3-GF47P</ProductKey>\n <ShowWindowsLive>false</ShowWindowsLive>\n <DisableAutoDaylightTimeSet>false</DisableAutoDaylightTimeSet>\n <TimeZone>China Standard Time</TimeZone>\n <ComputerName>WebankWinServer</ComputerName>\n <RegisteredOwner>WeBank</RegisteredOwner>\n <RegisteredOrganization>TCTP</RegisteredOrganization>\n </component>\n <component name="Microsoft-Windows-TerminalServices-LocalSessionManager" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n <fDenyTSConnections>false</fDenyTSConnections>\n </component>\n <component name="Networking-MPSSVC-Svc" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n <FirewallGroups>\n <FirewallGroup wcm:action="add" wcm:keyValue="RemoteDesktop">\n <Active>true</Active>\n <Group>@FirewallAPI.dll,-28752</Group>\n <Profile>all</Profile>\n </FirewallGroup>\n </FirewallGroups>\n </component>\n </settings>\n <settings pass="oobeSystem">\n <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n <AutoLogon>\n <Password>\n <Value>Cyclone@1234</Value>\n <PlainText>true</PlainText>\n </Password>\n <Enabled>true</Enabled>\n <LogonCount>1</LogonCount>\n <Username>Administrator</Username>\n </AutoLogon>\n <OOBE>\n <HideEULAPage>true</HideEULAPage>\n </OOBE>\n <UserAccounts>\n <AdministratorPassword>\n <PlainText>true</PlainText>\n <Value>Cyclone@1234</Value>\n </AdministratorPassword>\n </UserAccounts>\n <FirstLogonCommands>\n <SynchronousCommand wcm:action="add">\n <Order>1</Order>\n <CommandLine>C:\\firstboot\\winconfig.exe</CommandLine>\n <Description></Description>\n <RequiresUserInput>false</RequiresUserInput>\n </SynchronousCommand>\n </FirstLogonCommands>\n </component>\n <component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n <SystemLocale>zh-CN</SystemLocale>\n <UILanguage>zh-CN</UILanguage>\n <UILanguageFallback>zh-CN</UILanguageFallback>\n <UserLocale>zh-CN</UserLocale>\n <InputLocale>zh-CN</InputLocale>\n </component>\n </settings>\n <settings pass="windowsPE">\n <component name="Microsoft-Windows-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n <ImageInstall>\n <OSImage>\n <InstallFrom>\n <Path>Z:\\windows\\2016\\sources\\install.wim</Path>\n <MetaData wcm:action="add">\n <Key>/IMAGE/NAME</Key>\n <Value>Windows Server 2016 SERVERSTANDARD</Value>\n </MetaData>\n </InstallFrom>\n <InstallTo>\n <DiskID>0</DiskID>\n <PartitionID>3</PartitionID>\n </InstallTo>\n <WillShowUI>OnError</WillShowUI>\n </OSImage>\n </ImageInstall>\n <UserData>\n <ProductKey>\n <WillShowUI>OnError</WillShowUI>\n <Key>NTYKT-H46BX-YH9D7-BJ7M3-GF47P</Key>\n </ProductKey>\n <AcceptEula>true</AcceptEula>\n </UserData>\n <EnableFirewall>true</EnableFirewall>\n <EnableNetwork>true</EnableNetwork>\n <DiskConfiguration>\n <Disk wcm:action="add">\n <CreatePartitions>\n <CreatePartition wcm:action="add">\n <Extend>false</Extend>\n <Order>1</Order>\n <Size>260</Size>\n <Type>EFI</Type>\n </CreatePartition>\n <CreatePartition wcm:action="add">\n <Extend>false</Extend>\n <Order>2</Order>\n <Size>16</Size>\n <Type>MSR</Type>\n </CreatePartition>\n <CreatePartition wcm:action="add">\n <Extend>false</Extend>\n <Order>3</Order>\n <Size>202400</Size>\n <Type>Primary</Type>\n </CreatePartition>\n <CreatePartition wcm:action="add">\n <Extend>false</Extend>\n <Order>4</Order>\n <Size>202400</Size>\n <Type>Primary</Type>\n </CreatePartition>\n </CreatePartitions>\n <ModifyPartitions>\n <ModifyPartition wcm:action="add">\n <Format>FAT32</Format>\n <Label>System</Label>\n <Order>1</Order>\n <PartitionID>1</PartitionID>\n </ModifyPartition>\n <ModifyPartition wcm:action="add">\n <Format>NTFS</Format>\n <Label>System</Label>\n <Letter>C</Letter>\n <Order>2</Order>\n <PartitionID>3</PartitionID>\n </ModifyPartition>\n <ModifyPartition wcm:action="add">\n <Extend>true</Extend>\n <Format>NTFS</Format>\n <Label>data</Label>\n <Letter>D</Letter>\n <Order>3</Order>\n <PartitionID>4</PartitionID>\n </ModifyPartition>\n </ModifyPartitions>\n <DiskID>0</DiskID>\n <WillWipeDisk>true</WillWipeDisk>\n </Disk>\n <WillShowUI>OnError</WillShowUI>\n </DiskConfiguration>\n </component>\n <component name="Microsoft-Windows-International-Core-WinPE" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n <SetupUILanguage>\n <UILanguage>zh-CN</UILanguage>\n </SetupUILanguage>\n <InputLocale>zh-CN</InputLocale>\n <SystemLocale>zh-CN</SystemLocale>\n <UILanguage>zh-CN</UILanguage>\n <UserLocale>zh-CN</UserLocale>\n <UILanguageFallback>zh-CN</UILanguageFallback>\n </component>\n </settings>\n <settings pass="offlineServicing">\n <component name="Microsoft-Windows-LUA-Settings" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">\n <EnableLUA>false</EnableLUA>\n </component>\n </settings>\n <cpi:offlineImage cpi:source="catalog://osinstall/image/windows/clg/install_windows server 2016 serverstandard.clg" xmlns:cpi="urn:schemas-microsoft-com:cpi" />\n</unattend>', '#!ipxe\nkernel http://osinstall.idcos.com/winpe/wimboot\ninitrd http://osinstall.idcos.com/winpe/2012/bootmgr bootmgr \ninitrd http://osinstall.idcos.com/winpe/2012/EFI/Boot/bootx64.efi bootx64.efi \ninitrd http://osinstall.idcos.com/winpe/2012/Boot/BCD BCD \ninitrd http://osinstall.idcos.com/winpe/2012/Boot/boot.sdi boot.sdi \ninitrd http://osinstall.idcos.com/winpe/2012/sources/boot.wim boot.wim \nboot', 'testing', 'x86_64'), + (25, '2021-03-21 17:07:22', '2023-12-07 09:19:23', NULL, 'CentOS', 'CentOS 7.9', 'uefi', 'root', 'Cyclone@1234', 'install\nurl --url=http://osinstall.idcos.com/centos/7.9/os/x86_64/\nlang en_US.UTF-8\nkeyboard us\nnetwork --onboot yes --device bootif --bootproto dhcp --noipv6\nrootpw Cyclone@1234\nfirewall --disabled\nauthconfig --enableshadow --passalgo=sha512\nselinux --disabled\ntimezone Asia/Shanghai\ntext\nreboot\nzerombr\nbootloader --location=mbr\nclearpart --all --initlabel\npart /boot/efi --fstype=efi --size=200 --ondisk=sda \npart /boot --fstype=ext4 --size=1024 --ondisk=sda\npart swap --size=8192 --ondisk=sda\npart / --fstype=ext4 --size=30720 --ondisk=sda\npart /tmp --fstype=ext4 --size=10240 --ondisk=sda\npart /home --fstype=ext4 --size=5120 --ondisk=sda\npart /usr/local --fstype=ext4 --size=20480 --ondisk=sda\npart /data --fstype=ext4 --size=1 --grow --ondisk=sda\n\n%packages --ignoremissing\n@base\n@core\n@development\ndmidecode\n%end\n\n%pre\n_sn=$(dmidecode -s system-serial-number 2>/dev/null | awk \'/^[^#]/ { print $1 }\')\n\ncurl -H "Content-Type: application/json" -X POST -d "{\\"title\\":\\"启动OS安装程序\\",\\"progress\\":0.6,\\"log\\":\\"SW5zdGFsbCBPUwo=\\"}" http://osinstall.idcos.com/api/cloudboot/v1/devices/$_sn/installations/progress\ncurl -H "Content-Type: application/json" -X POST -d "{\\"title\\":\\"分区并安装软件包\\",\\"progress\\":0.7,\\"log\\":\\"SW5zdGFsbCBPUwo=\\"}" http://osinstall.idcos.com/api/cloudboot/v1/devices/$_sn/installations/progress\n%end\n\n%post\n# dowload commonSetting.py for setting items in OS\ncurl -o /tmp/commonSetting.py "http://osinstall.idcos.com/scripts/commonSetting.py"\n\n# config network\npython /tmp/commonSetting.py --network=Y\n\n# change root passwd\npython /tmp/commonSetting.py --osuser=Y\n\n# complete\npython /tmp/commonSetting.py --complete=Y\n%end', '#!ipxe\nkernel http://osinstall.idcos.com/centos/7.9/os/x86_64/images/pxeboot/vmlinuz initrd=initrd.img ksdevice=bootif ks=http://osinstall.idcos.com/api/cloudboot/v1/devices/${serial}/settings/system-template console=tty0 selinux=0 net.ifnames=0 biosdevname=0 BOOTIF=01-${netX/mac:hexhyp}\ninitrd http://osinstall.idcos.com/centos/7.9/os/x86_64/images/pxeboot/initrd.img\nboot\n', 'active', 'x86_64'), + (28, '2022-04-23 10:11:26', '2023-12-07 09:18:58', NULL, 'EulerOS', 'openEuler release 20.03 (LTS-SP3-aarch64)', 'uefi', 'root', 'Cyclone@1234', '#version=openEuler release 20.03 (LTS-SP3)\n# Reboot after installation\nreboot\n# Use text mode install\ntext\n\n\n%pre --log=/tmp/kickstart_pre.log\n\necho "which dmidecode:"\nwhich dmidecode\n_sn=$(/usr/sbin/dmidecode -s system-serial-number 2>/dev/null | awk \'/^[^#]/ { print $1 }\')\necho "system-serial-number:$_sn"\necho "curl:http://osinstall.idcos.com/api/cloudboot/v1/devices/$_sn/installations/progress"\ncurl -H "Content-Type: application/json" -X POST -d "{\\"title\\":\\"启动OS安装程序\\",\\"progress\\":0.6,\\"log\\":\\"SW5zdGFsbCBPUwo=\\"}" http://osinstall.idcos.com/api/cloudboot/v1/devices/$_sn/installations/progress\ncurl -H "Content-Type: application/json" -X POST -d "{\\"title\\":\\"分区并安装软件包\\",\\"progress\\":0.7,\\"log\\":\\"SW5zdGFsbCBPUwo=\\"}" http://osinstall.idcos.com/api/cloudboot/v1/devices/$_sn/installations/progress\n\n%end\n\n\n%post --nochroot --log=/mnt/sysimage/tmp/kickstart_post_nochroot.log\n\necho "Copying %pre stage log files"\n/usr/bin/cp -rv /tmp/kickstart_pre.log /mnt/sysimage/tmp/\n\n%end\n\n\n%post --log=/tmp/kickstart_post.log\n#enable kdump\n#sed -i "s/ crashkernel=512M/ crashkernel=1024M,high /" /boot/efi/EFI/openEuler/grub.cfg\n\nvirsh net-destroy default\n\necho "dowload commonSetting.py for setting items in OS(chroot):"\ncurl -o /tmp/commonSetting.py "http://osinstall.idcos.com/scripts/commonSetting.py"\n#curl -o /tmp/driver_upgrade_aarch64.sh "http://osinstall.idcos.com/scripts/driver_upgrade_aarch64.sh"\n#bash /tmp/driver_upgrade_aarch64.sh\n# config network\npython /tmp/commonSetting.py --network=Y\n\n# config osuser\npython /tmp/commonSetting.py --osuser=Y\n\n# complete\npython /tmp/commonSetting.py --complete=Y\n%end\n\n%packages --ignoremissing\n#@^minimal-environment\n@^server-product-environment\n@standard\n@system-tools\n#@development\n#@performance\n\n%end\n\n# Keyboard layouts\nkeyboard --vckeymap=us --xlayouts=\'us\'\n# System language\nlang en_US.UTF-8\n\n# Firewall configuration\nfirewall --disabled\n# Network information\nnetwork --bootproto=dhcp --device=bootif --ipv6=auto --activate\nnetwork --hostname=openeuler.webank\n\n# Use network installation\nurl --url="http://osinstall.idcos.com/openEuler/20.03_LTS_SP3/os/aarch64/"\ndriverdisk --source="http://osinstall.idcos.com/openEuler/20.03_LTS_SP3/drivers/aarch64/openEuler-20.03-LTS-SP3.iso"\n# System authorization information\nauth --enableshadow --passalgo=sha512\n# SELinux configuration\nselinux --disabled\n\n# Do not configure the X Window System\nskipx\n# System services\nservices --disabled="chronyd"\n\nignoredisk --only-use=sda\n# Partition clearing information\nclearpart --all --initlabel --drives=sda\n# Disk partitioning information\npart /boot/efi --fstype="efi" --ondisk=sda --size=200\npart /boot --fstype="ext4" --ondisk=sda --size=1024\npart / --fstype="ext4" --ondisk=sda --size=30720\npart /tmp --fstype="ext4" --ondisk=sda --size=10240\npart /home --fstype="ext4" --ondisk=sda --size=5120\npart /usr/local --fstype="ext4" --ondisk=sda --size=20480\npart /data --fstype="ext4" --size=1 --grow --ondisk=sda\n\n\n# System timezone\ntimezone Asia/Shanghai --utc\n\n# Root password\nrootpw Cyclone@1234\n\n%addon com_redhat_kdump --disable --reserve-mb=\'128\'\n\n%end', '#!ipxe\nkernel http://osinstall.idcos.com/openEuler/20.03_LTS_SP3/os/aarch64/images/pxeboot/vmlinuz initrd=initrd.img ksdevice=bootif ks=http://osinstall.idcos.com/api/cloudboot/v1/devices/{sn}/settings/system-template console=tty0 selinux=0 net.ifnames=0 biosdevname=0 BOOTIF=01-${netX/mac:hexhyp}\ninitrd http://osinstall.idcos.com/openEuler/20.03_LTS_SP3/os/aarch64/images/pxeboot/initrd.img\nboot', 'active', 'aarch64'), + (32, '2022-09-07 08:57:15', '2023-12-07 09:18:40', NULL, 'EulerOS', 'openEuler release 20.03 (LTS-SP3-x86_64)', 'uefi', 'root', 'Cyclone@1234', '#version=openEuler release 20.03 (LTS-SP3)\n# Reboot after installation\nreboot\n# Use text mode install\ntext\n\n\n%pre --log=/tmp/kickstart_pre.log\n\necho "which dmidecode:"\nwhich dmidecode\n_sn=$(/usr/sbin/dmidecode -s system-serial-number 2>/dev/null | awk \'/^[^#]/ { print $1 }\')\necho "system-serial-number:$_sn"\necho "curl:http://osinstall.idcos.com/api/cloudboot/v1/devices/$_sn/installations/progress"\ncurl -H "Content-Type: application/json" -X POST -d "{\\"title\\":\\"启动OS安装程序\\",\\"progress\\":0.6,\\"log\\":\\"SW5zdGFsbCBPUwo=\\"}" http://osinstall.idcos.com/api/cloudboot/v1/devices/$_sn/installations/progress\ncurl -H "Content-Type: application/json" -X POST -d "{\\"title\\":\\"分区并安装软件包\\",\\"progress\\":0.7,\\"log\\":\\"SW5zdGFsbCBPUwo=\\"}" http://osinstall.idcos.com/api/cloudboot/v1/devices/$_sn/installations/progress\n\n%end\n\n\n%post --nochroot --log=/mnt/sysimage/tmp/kickstart_post_nochroot.log\n\necho "Copying %pre stage log files"\n/usr/bin/cp -rv /tmp/kickstart_pre.log /mnt/sysimage/tmp/\n\n%end\n\n\n%post --log=/tmp/kickstart_post.log\n#enable kdump\n#sed -i "s/ crashkernel=512M/ crashkernel=1024M,high /" /boot/efi/EFI/openEuler/grub.cfg\n\necho "dowload commonSetting.py for setting items in OS(chroot):"\ncurl -o /tmp/commonSetting.py "http://osinstall.idcos.com/scripts/commonSetting.py"\n\ncurl -o /tmp/driver_upgrade.sh "http://osinstall.idcos.com/scripts/driver_upgrade.sh"\nbash /tmp/driver_upgrade.sh\n\n# config network\npython /tmp/commonSetting.py --network=Y\n\n# config osuser\npython /tmp/commonSetting.py --osuser=Y\n\n# complete\npython /tmp/commonSetting.py --complete=Y\n%end\n\n%packages --ignoremissing\n#@^minimal-environment\n@^server-product-environment\n@standard\n@system-tools\n#@development\n#@performance\n\n%end\n\n# Keyboard layouts\nkeyboard --vckeymap=us --xlayouts=\'us\'\n# System language\nlang en_US.UTF-8\n\n# Firewall configuration\nfirewall --disabled\n# Network information\nnetwork --bootproto=dhcp --device=bootif --ipv6=auto --activate\nnetwork --hostname=openeuler.webank\n\n# Use network installation\nurl --url="http://osinstall.idcos.com/openEuler/20.03_LTS_SP3/os/x86_64/"\n\n# System authorization information\nauth --enableshadow --passalgo=sha512\n# SELinux configuration\nselinux --disabled\n\n# Do not configure the X Window System\nskipx\n# System services\nservices --disabled="chronyd"\n\nignoredisk --only-use=sda\n# Partition clearing information\nclearpart --all --initlabel --drives=sda\n# Disk partitioning information\npart /boot/efi --fstype="efi" --ondisk=sda --size=200\npart /boot --fstype="ext4" --ondisk=sda --size=1024\npart / --fstype="ext4" --ondisk=sda --size=30720\npart /tmp --fstype="ext4" --ondisk=sda --size=10240\npart /home --fstype="ext4" --ondisk=sda --size=5120\npart /usr/local --fstype="ext4" --ondisk=sda --size=20480\npart /data --fstype="ext4" --size=1 --grow --ondisk=sda\n\n\n# System timezone\ntimezone Asia/Shanghai --utc\n\n# Root password\nrootpw Cyclone@1234\n\n%addon com_redhat_kdump --disable --reserve-mb=\'128\'\n\n%end', '#!ipxe\nkernel http://osinstall.idcos.com/openEuler/20.03_LTS_SP3/os/x86_64/images/pxeboot/vmlinuz initrd=initrd.img ksdevice=bootif ks=http://osinstall.idcos.com/api/cloudboot/v1/devices/{sn}/settings/system-template console=tty0 selinux=0 net.ifnames=0 biosdevname=0 BOOTIF=01-${netX/mac:hexhyp}\ninitrd http://osinstall.idcos.com/openEuler/20.03_LTS_SP3/os/x86_64/images/pxeboot/initrd.img\nboot', 'active_default', 'x86_64'), + (33, '2023-03-16 16:05:19', '2023-03-16 16:05:19', NULL, 'BootOS', 'bootos_x86_64_intel', 'uefi', '', '', '#', '#!ipxe\nkernel http://osinstall.idcos.com/bootos/x86_64_intel/vmlinuz initrd=initrd.img console=tty0 selinux=0 biosdevname=0 SERVER_ADDR=http://osinstall.idcos.com LOOP_INTERVAL=5 DEVELOPER=1 BOOTIF=01-${netX/mac:hexhyp}\ninitrd http://osinstall.idcos.com/bootos/x86_64_intel/initrd.img\nboot', 'testing', 'x86_64'), + (34, '2023-03-16 16:06:02', '2023-03-16 16:06:02', NULL, 'BootOS', 'bootos_x86_64_hygon', 'uefi', '', '', '#', '#!ipxe\nkernel http://osinstall.idcos.com/bootos/x86_64_hygon/vmlinuz initrd=initrd.img console=tty0 selinux=0 biosdevname=0 SERVER_ADDR=http://osinstall.idcos.com LOOP_INTERVAL=5 DEVELOPER=1 BOOTIF=01-${netX/mac:hexhyp}\ninitrd http://osinstall.idcos.com/bootos/x86_64_hygon/initrd.img\nboot', 'testing', 'x86_64'), + (36, '2023-03-16 16:07:34', '2023-03-16 16:08:15', NULL, 'BootOS', 'bootos_default', 'uefi', '', '', '#', '#!ipxe\nkernel http://osinstall.idcos.com/bootos/x86_64/vmlinuz initrd=initrd.img console=tty0 selinux=0 biosdevname=0 SERVER_ADDR=http://osinstall.idcos.com LOOP_INTERVAL=5 DEVELOPER=1 BOOTIF=01-${netX/mac:hexhyp}\ninitrd http://osinstall.idcos.com/bootos/x86_64/initrd.img\nboot', 'testing', 'x86_64'); +/*!40000 ALTER TABLE `system_template` ENABLE KEYS */; + +-- 导出 表 cloudboot_cyclone.virtual_cabinet 结构 +CREATE TABLE IF NOT EXISTS `virtual_cabinet` ( + `id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `created_at` timestamp NULL DEFAULT NULL COMMENT '记录创建时间', + `updated_at` timestamp NULL DEFAULT NULL COMMENT '记录修改时间', + `deleted_at` timestamp NULL DEFAULT NULL COMMENT '记录删除时间', + `store_room_id` int(11) unsigned NOT NULL COMMENT '所属库房ID', + `number` varchar(255) DEFAULT NULL COMMENT '编号', + `status` enum('under_construction','not_enabled','enabled','offline') DEFAULT NULL COMMENT '状态。under_construction-建设中; not_enabled-未启用; enabled-已启用; offline-已下线;', + `remark` varchar(1024) DEFAULT NULL COMMENT '备注', + `creator` varchar(255) DEFAULT NULL COMMENT '记录创建者ID', + `updater` varchar(255) DEFAULT NULL COMMENT '记录更新者ID', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE KEY `uk_room_number` (`store_room_id`,`number`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='虚拟货架表'; + +-- 正在导出表 cloudboot_cyclone.virtual_cabinet 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `virtual_cabinet` DISABLE KEYS */; +/*!40000 ALTER TABLE `virtual_cabinet` ENABLE KEYS */; + +-- 导出 触发器 cloudboot_cyclone.trigger_update_device_oob 结构 +SET @OLDTMP_SQL_MODE=@@SQL_MODE, SQL_MODE=''; +DELIMITER // +CREATE TRIGGER trigger_update_device_oob BEFORE UPDATE ON device +FOR EACH ROW +BEGIN + IF NEW.oob_user != OLD.oob_user OR NEW.oob_password != OLD.oob_password THEN + INSERT INTO device_oob_history(created_at,updated_at,sn,username_old,username_new,password_old,password_new,creator) VALUES(NOW(),NOW(),NEW.sn,OLD.oob_user,NEW.oob_user,OLD.oob_password,NEW.oob_password,NEW.creator); + END IF; +END// +DELIMITER ; +SET SQL_MODE=@OLDTMP_SQL_MODE; + +-- 导出 视图 cloudboot_cyclone.cabinet_power_info 结构 +-- 移除临时表并创建最终视图结构 +DROP TABLE IF EXISTS `cabinet_power_info`; +CREATE ALGORITHM=UNDEFINED SQL SECURITY DEFINER VIEW `cabinet_power_info` AS select `sc`.`id` AS `id`,`sc`.`number` AS `number`,`sc`.`is_enabled` AS `is_enabled`,`sc`.`is_powered` AS `is_powered`,`i`.`name` AS `idc`,`sr`.`name` AS `server_room`,`na`.`name` AS `network_area`,`sc`.`max_power` AS `max_power`,(case when isnull(`su`.`usite_total`) then 0 else `su`.`usite_total` end) AS `usite_total`,(case when isnull(`su`.`used_count`) then 0 else `su`.`used_count` end) AS `used_count`,(case when isnull(`su`.`free_count`) then 0 else `su`.`free_count` end) AS `free_count`,(case when isnull(`su`.`pre_occupied_count`) then 0 else `su`.`pre_occupied_count` end) AS `pre_occupied_count`,(case when isnull(`su`.`disabled_count`) then 0 else `su`.`disabled_count` end) AS `disabled_count`,(case when isnull(`cp`.`known_power`) then 0 else `cp`.`known_power` end) AS `known_used_power`,(case when isnull(`cp`.`known_power`) then `sc`.`max_power` else (`sc`.`max_power` - `cp`.`known_power`) end) AS `free_power`,(case when isnull(`cp`.`is_unknown_count`) then 0 else `cp`.`is_unknown_count` end) AS `is_unknown_power_svr_count` from (((((`cloudboot_cyclone`.`server_cabinet` `sc` left join (select `d`.`server_cabinet_id` AS `server_cabinet_id`,sum((case when ((`dc`.`power` = 'unknown') or isnull(`dc`.`power`)) then 0 when (locate('W',`dc`.`power`) > 0) then cast(substring_index(trim(`dc`.`power`),'W',1) as signed) else cast(trim(`dc`.`power`) as signed) end)) AS `known_power`,sum((case when ((`dc`.`power` = 'unknown') or isnull(`dc`.`power`)) then 1 else 0 end)) AS `is_unknown_count` from (`cloudboot_cyclone`.`device` `d` left join `cloudboot_cyclone`.`device_category` `dc` on((`d`.`category` = `dc`.`category`))) group by `d`.`server_cabinet_id`) `cp` on((`sc`.`id` = `cp`.`server_cabinet_id`))) left join `cloudboot_cyclone`.`idc` `i` on((`sc`.`idc_id` = `i`.`id`))) left join `cloudboot_cyclone`.`server_room` `sr` on((`sc`.`server_room_id` = `sr`.`id`))) left join `cloudboot_cyclone`.`network_area` `na` on((`sc`.`network_area_id` = `na`.`id`))) left join (select `u`.`server_cabinet_id` AS `server_cabinet_id`,count(1) AS `usite_total`,count(if((`u`.`status` = 'used'),TRUE,NULL)) AS `used_count`,count(if((`u`.`status` = 'free'),TRUE,NULL)) AS `free_count`,count(if((`u`.`status` = 'pre_occupied'),TRUE,NULL)) AS `pre_occupied_count`,count(if((`u`.`status` = 'disabled'),TRUE,NULL)) AS `disabled_count` from `cloudboot_cyclone`.`server_usite` `u` group by `u`.`server_cabinet_id`) `su` on((`su`.`server_cabinet_id` = `sc`.`id`))); + +/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; +/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; diff --git a/cyclone-server/doc/db/clouduam.sql b/cyclone-server/doc/db/clouduam.sql new file mode 100644 index 0000000000000000000000000000000000000000..3792ccba6e779885b266100295a502f7007a05f0 --- /dev/null +++ b/cyclone-server/doc/db/clouduam.sql @@ -0,0 +1,474 @@ +-- -------------------------------------------------------- +-- 主机: x +-- 服务器版本: 5.7.38-log - MySQL Community Server (GPL) +-- 服务器操作系统: Linux +-- HeidiSQL 版本: 11.0.0.6063 +-- -------------------------------------------------------- + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET NAMES utf8 */; +/*!50503 SET NAMES utf8mb4 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; + + +-- 导出 clouduam 的数据库结构 +CREATE DATABASE IF NOT EXISTS `clouduam` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci */; +USE `clouduam`; + +-- 导出 表 clouduam.PORTAL_DEPT 结构 +CREATE TABLE IF NOT EXISTS `PORTAL_DEPT` ( + `ID` varchar(64) NOT NULL, + `CODE` varchar(255) DEFAULT NULL COMMENT '部门编码', + `DISPLAY_NAME` varchar(64) DEFAULT NULL COMMENT '部门名称', + `PARENT_ID` varchar(64) DEFAULT NULL COMMENT '父项目id', + `STATUS` varchar(64) DEFAULT NULL COMMENT '部门状态', + `MANAGER_ID` varchar(64) DEFAULT NULL, + `REMARK` varchar(255) DEFAULT NULL COMMENT '备注', + `TENANT_ID` varchar(64) DEFAULT NULL COMMENT '租户id', + `SOURCE_TYPE` varchar(64) NOT NULL DEFAULT 'native' COMMENT '数据同步来源来源,默认值native表示本系统,如果来自第三方,则需重新定义该值', + `GMT_CREATE` datetime DEFAULT NULL COMMENT '创建日期', + `GMT_MODIFIED` datetime DEFAULT NULL COMMENT '修改日期', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='部门信息表'; + +-- 正在导出表 clouduam.PORTAL_DEPT 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `PORTAL_DEPT` DISABLE KEYS */; +/*!40000 ALTER TABLE `PORTAL_DEPT` ENABLE KEYS */; + +-- 导出 表 clouduam.PORTAL_DEPT_ROLE_REL 结构 +CREATE TABLE IF NOT EXISTS `PORTAL_DEPT_ROLE_REL` ( + `ID` varchar(64) NOT NULL COMMENT 'id', + `DEPT_ID` varchar(64) NOT NULL COMMENT '部门id', + `ROLE_ID` varchar(64) NOT NULL COMMENT '角色id', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='部门与角色的关系表'; + +-- 正在导出表 clouduam.PORTAL_DEPT_ROLE_REL 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `PORTAL_DEPT_ROLE_REL` DISABLE KEYS */; +/*!40000 ALTER TABLE `PORTAL_DEPT_ROLE_REL` ENABLE KEYS */; + +-- 导出 表 clouduam.PORTAL_GROUP_ROLE_REL 结构 +CREATE TABLE IF NOT EXISTS `PORTAL_GROUP_ROLE_REL` ( + `ID` varchar(64) NOT NULL COMMENT '关系ID', + `ROLE_ID` varchar(64) NOT NULL COMMENT '角色ID', + `GROUP_ID` varchar(64) NOT NULL COMMENT '用户组ID', + `TENANT` varchar(64) DEFAULT NULL COMMENT '租户code', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户组与角色关系表'; + +-- 正在导出表 clouduam.PORTAL_GROUP_ROLE_REL 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `PORTAL_GROUP_ROLE_REL` DISABLE KEYS */; +REPLACE INTO `PORTAL_GROUP_ROLE_REL` (`ID`, `ROLE_ID`, `GROUP_ID`, `TENANT`) VALUES + ('25352137-9405-11ee-a6bb-b4055d569ecd', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', '245c438e-d66a-11e8-bf55-5ce04de286f6', 'default'); +/*!40000 ALTER TABLE `PORTAL_GROUP_ROLE_REL` ENABLE KEYS */; + +-- 导出 表 clouduam.PORTAL_GROUP_USER_REL 结构 +CREATE TABLE IF NOT EXISTS `PORTAL_GROUP_USER_REL` ( + `ID` varchar(64) NOT NULL COMMENT '关系ID', + `USER_ID` varchar(64) NOT NULL COMMENT '用户ID', + `GROUP_ID` varchar(64) NOT NULL COMMENT '用户组ID', + `TENANT` varchar(64) DEFAULT NULL COMMENT '租户code' +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户组用户关系表'; + +-- 正在导出表 clouduam.PORTAL_GROUP_USER_REL 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `PORTAL_GROUP_USER_REL` DISABLE KEYS */; +REPLACE INTO `PORTAL_GROUP_USER_REL` (`ID`, `USER_ID`, `GROUP_ID`, `TENANT`) VALUES + ('253513dd-9405-11ee-a6bb-b4055d569ecd', '59df5960cd6ac35f53135b31', '245c438e-d66a-11e8-bf55-5ce04de286f6', 'default'); +/*!40000 ALTER TABLE `PORTAL_GROUP_USER_REL` ENABLE KEYS */; + +-- 导出 表 clouduam.PORTAL_PERMISSION 结构 +CREATE TABLE IF NOT EXISTS `PORTAL_PERMISSION` ( + `ID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '授权信息ID', + `APP_ID` varchar(64) NOT NULL COMMENT '应用系统名称', + `AUTH_RES_TYPE` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '权限资源类型', + `AUTH_RES_ID` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '权限资源ID', + `AUTH_RES_NAME` varchar(64) DEFAULT NULL, + `AUTH_OBJ_ID` varchar(64) NOT NULL COMMENT '授权对象ID', + `AUTH_OBJ_TYPE` varchar(64) NOT NULL COMMENT '授权对象类型', + `TENANT` varchar(64) DEFAULT NULL COMMENT '租户code', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='授权信息表'; + +-- 正在导出表 clouduam.PORTAL_PERMISSION 的数据:~209 rows (大约) +/*!40000 ALTER TABLE `PORTAL_PERMISSION` DISABLE KEYS */; +REPLACE INTO `PORTAL_PERMISSION` (`ID`, `APP_ID`, `AUTH_RES_TYPE`, `AUTH_RES_ID`, `AUTH_RES_NAME`, `AUTH_OBJ_ID`, `AUTH_OBJ_TYPE`, `TENANT`) VALUES + ('008b6fe2-08db-4b24-8501-9f04a31a6122', 'cloudboot', 'cloudboot_button_permission', 'button_ip_unassign', '取消IP分配', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('008cc5ea-fba6-48f4-b42e-f525e3523c47', 'cloudboot', 'cloudboot_button_permission', 'button_oob_re_access', '重新纳管带外', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('0164e8f6-7259-4167-b3e3-88279b54e9bc', 'cloudboot', 'cloudboot_menu_permission', 'menu_oob_info', '带外信息', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('01b6c6da-c94c-4236-a32d-6b80a3c692bd', 'cloudboot', 'cloudboot_menu_permission', 'menu_special_device', '特殊设备列表', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('02c414c2-13ca-4b4c-9cd2-15cd3dab0b7a', 'cloudboot', 'cloudboot_button_permission', 'button_order_export', '导出订单', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('03baba80-3339-46b6-a633-125a0bd9963f', 'cloudboot', 'cloudboot_button_permission', 'button_device_setting_reInstall', '重新部署', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('03cb37a5-6ae7-4c44-a7e8-76fcea3840de', 'cloudboot', 'cloudboot_menu_permission', 'menu_user_management', '用户管理', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('07fbd788-5ef5-40b8-9de8-e02567652cac', 'cloudboot', 'cloudboot_button_permission', 'button_approval_idc_abolish', '数据中心裁撤审批', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('08d22ddd-2923-4420-9358-326a9e70847d', 'cloudboot', 'cloudboot_button_permission', 'button_server_cabinet_delete', '删除机架', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('0ba142cf-a559-4c6c-9337-b0675b48b5ee', 'cloudboot', 'cloudboot_button_permission', 'button_server_room_production', '投产机房信息', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('0bb9ac7a-4d09-4ad8-8f10-444f67accc19', 'cloudboot', 'cloudboot_button_permission', 'button_idc_create', '新增数据中心', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('0bcf082f-a528-47cf-84db-57e6dedba8d9', 'cloudboot', 'cloudboot_menu_permission', 'menu_audit', '操作审计', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('0c49acec-6168-4317-ba9d-7b1c72bac16f', 'cloudboot', 'cloudboot_menu_permission', 'menu_device_setting_rule', '装机参数规则列表', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('0d44ec17-a614-46a3-b76e-9c79c680608a', 'cloudboot', 'cloudboot_button_permission', 'button_device_category_delete', '删除设备类型', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('0d4f345f-9c0f-4de8-9cf5-9b35a8492356', 'cloudboot', 'cloudboot_button_permission', 'button_server_room_delete', '删除机房信息', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('0ef22348-90eb-4294-8768-e9e1ab6a6cc2', 'cloudboot', 'cloudboot_button_permission', 'button_predeploy_physical_machine_reBoot', '待部署物理机重启', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('10825a54-f82e-46f1-a25d-59343b7b405a', 'cloudboot', 'cloudboot_menu_permission', 'menu_physical_machine', '物理机列表', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('1152433a-b872-42a7-87d7-e7ba7d114757', 'cloudboot', 'cloudboot_button_permission', 'button_server_cabinet_update', '修改机架', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('150b8408-98b5-4da0-874c-f22d4a56c2dd', 'cloudboot', 'cloudboot_button_permission', 'button_special_device_import', '导入特殊设备', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('155d0f55-2aee-4664-b915-553c6320df20', 'cloudboot', 'cloudboot_button_permission', 'button_dhcp_token_release', '释放DHCP令牌', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('18938e6c-f63d-41e6-a4b7-5e2970817b39', 'cloudboot', 'cloudboot_menu_permission', 'menu_network_area', '网络区域', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('1aa701ce-cca9-4c28-a544-79e2663b1990', 'cloudboot', 'cloudboot_button_permission', 'button_virtual_cabinet_delete', '删除虚拟货架', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('1abf64ac-9442-4bf3-9e1b-d640c7c47b91', 'cloudboot', 'cloudboot_button_permission', 'button_network_device_delete', '删除网络设备', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('1afe76fa-feb2-456f-8662-94b17f2fa496', 'cloudboot', 'cloudboot_button_permission', 'button_predeploy_physical_machine_download', '下载待部署物理机模板', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('1bbb97ce-3f2c-43b2-90de-3bf08331a836', 'cloudboot', 'cloudboot_menu_permission', 'menu_ip', 'IP分配', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('1c00804f-8fac-4995-8682-92beb3bb4e9b', 'cloudboot', 'cloudboot_button_permission', 'button_approval_physical_machine_recycle_reInstall', '物理机回收重装审批', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('1c74c354-4e22-4461-84a6-78ad6e4f1db7', 'cloudboot', 'cloudboot_button_permission', 'menu_order', '订单列表', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('1d1bcf39-bdf4-41c4-956b-5e98192a4980', 'cloudboot', 'cloudboot_menu_permission', 'menu_template_management', '配置管理', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('1fe902b4-e65c-4ca7-98ee-e2b128105fee', 'cloudboot', 'cloudboot_button_permission', 'button_approval_agree', '审批通过', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('205bb1e9-7d31-41e1-bb8f-75a374e64c62', 'cloudboot', 'cloudboot_button_permission', 'menu_idc', '数据中心', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('2072266b-3c07-4c2d-a147-22afcc9250bf', 'cloudboot', 'cloudboot_button_permission', 'button_approval_cabinet_powerOff', '机架关电审批', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('22d9c296-8b1b-4652-9a46-1d8672047014', 'cloudboot', 'cloudboot_menu_permission', 'menu_device_setting', '部署列表', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('22e271ac-187b-4b48-a6d7-d6340b6b64db', 'cloudboot', 'cloudboot_button_permission', 'button_predeploy_physical_machine_import', '导入待部署物理机模板', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('240429ef-1927-4325-a82b-40c470be8249', 'cloudboot', 'cloudboot_button_permission', 'menu_special_device', '特殊设备列表', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('253532ff-9405-11ee-a6bb-b4055d569ecd', 'clouduam', 'CLOUDUAM_MENU', 'user', '用户管理', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('253533e2-9405-11ee-a6bb-b4055d569ecd', 'clouduam', 'CLOUDUAM_MENU', 'userGroup', '用户组管理', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('25353448-9405-11ee-a6bb-b4055d569ecd', 'clouduam', 'CLOUDUAM_MENU', 'role', '角色管理', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('2535346e-9405-11ee-a6bb-b4055d569ecd', 'clouduam', 'CLOUDUAM_MENU', 'resource', '权限资源分配', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('25353497-9405-11ee-a6bb-b4055d569ecd', 'clouduam', 'CLOUDUAM_MENU', 'permission', '权限资源管理', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('2957f3ff-9ebd-42b3-83c9-046695577a0e', 'cloudboot', 'cloudboot_button_permission', 'button_server_usite_create', '新增机位', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('2ca6fd26-7543-45fd-b758-b8d5067dd6d2', 'cloudboot', 'cloudboot_button_permission', 'button_ip_network_create', '新增IP网段管理', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('2d2f6b4a-9730-4dd5-b41d-4d3ef073c121', 'cloudboot', 'cloudboot_button_permission', 'button_approval_physical_machine_recycle_move', '物理机回收搬迁审批', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('2d412d01-5495-46c4-bf7d-3111f6449951', 'cloudboot', 'cloudboot_button_permission', 'menu_network_device', '网络设备', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('2dae1e2e-620f-4a6a-b3ab-adc3ed5b382d', 'cloudboot', 'cloudboot_button_permission', 'button_physical_machine_update_usage', '批量修改物理机用途', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('2ed1422a-3e1c-4396-9bd8-e837b394ea0e', 'cloudboot', 'cloudboot_button_permission', 'button_ip_network_import_download', '下载导入IP网段模板', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('31afdabc-601a-44ed-8968-e7d1f4602ed9', 'cloudboot', 'cloudboot_button_permission', 'button_device_setting_rule_delete', '删除装机参数规则', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('31b7f964-20ce-4384-b1af-aff12327a820', 'cloudboot', 'cloudboot_button_permission', 'button_hardware_template_create', '新建/克隆硬件配置', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('31fa3965-a937-48c3-80d3-ce1506437c53', 'CloudUam', 'CLOUDUAM_MENU', 'user.operate', '用户操作(编辑、删除等)', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('32010218-5f6f-45a5-aa7e-88e0f7385776', 'cloudboot', 'cloudboot_button_permission', 'button_server_room_download', '下载机房信息模板', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('32115f99-4f19-4fc5-a81b-4d9bad6c9520', 'cloudboot', 'cloudboot_button_permission', 'button_approval_cabinet_offline', '机架下线审批', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('32abfdcb-fb4b-4be0-8da7-e382b18142d3', 'cloudboot', 'cloudboot_button_permission', 'button_special_device_create', '新增特殊设备', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('32f1943b-4d57-4ee0-9418-93a3a0f25482', 'cloudboot', 'cloudboot_menu_permission', 'menu_server_usite', '机位', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('339cba02-b66b-4217-9120-4b80ad6c8e88', 'cloudboot', 'cloudboot_menu_permission', 'menu_inspection', '硬件巡检', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('34a4a2a3-fd72-4b47-aca1-15ca37adda0f', 'cloudboot', 'cloudboot_button_permission', 'button_device_category_update', '修改设备类型', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('37c9c6ac-90f6-4f50-a908-c1636aaa5b32', 'cloudboot', 'cloudboot_button_permission', 'menu_ip', 'IP分配', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('38986e16-5054-476f-bac0-0ecfa6aa4d88', 'CloudUam', 'CLOUDUAM_MENU', 'user.import', '导入用户', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('391c2c73-95af-43d4-a6d3-11869e6958b0', 'cloudboot', 'cloudboot_button_permission', 'button_predeploy_physical_machine_powerOff', '待部署物理机关电', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('3c0885e6-2074-4d2f-956a-b9ba2810cba4', 'cloudboot', 'cloudboot_button_permission', 'button_network_area_offline', '下线网络区域', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('3dc38034-4b11-4d1f-9cb9-9b7f81f8c922', 'cloudboot', 'cloudboot_button_permission', 'button_server_usite_remark', '更新机位备注', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('3e291a9d-b318-49a4-8226-d00ef829684a', 'cloudboot', 'cloudboot_button_permission', 'button_inspection_inspect_all', '巡检全部', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('3f7a94db-7e79-4bb4-ba33-acf9cf773199', 'cloudboot', 'cloudboot_button_permission', 'menu_approval', '审批管理', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('3f942298-1499-44e6-977d-6cef05fa2b14', 'cloudboot', 'cloudboot_button_permission', 'button_idc_update', '修改数据中心', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('3fcfaa9b-666c-428d-9348-60b33f639e1c', 'cloudboot', 'cloudboot_button_permission', 'button_device_setting_delete', '删除部署物理机', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('43e403f5-15ba-480b-bc8b-fc9372bc14db', 'cloudboot', 'cloudboot_button_permission', 'button_store_room_update', '修改库房管理单元', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('4614567f-a8cb-4f2c-9ddb-224609f56775', 'cloudboot', 'cloudboot_button_permission', 'button_order_create', '新增订单', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('4620b95a-53c7-4b3e-94ff-5109da2b2b02', 'cloudboot', 'cloudboot_button_permission', 'button_network_device_sync', '同步网络设备', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('476ce033-812a-4f35-a46e-e9bd490d8172', 'cloudboot', 'cloudboot_button_permission', 'button_device_setting_rule_create', '新增装机参数规则', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('4846cca0-014b-402c-875f-082a9b4297bd', 'cloudboot', 'cloudboot_button_permission', 'button_mirror_template_create', '新建镜像配置', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('49375f78-6eb0-4de6-bf95-bca359f4a25e', 'cloudboot', 'cloudboot_button_permission', 'menu_network_area', '网络区域', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('4b3d54ed-61cd-493f-951a-8ed4ec67be40', 'cloudboot', 'cloudboot_button_permission', 'button_approval_physical_machine_move_download', '下载物理机搬迁审批导入模板', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('4b95e082-72a5-493c-91e7-b7a6f01287bc', 'cloudboot', 'cloudboot_button_permission', 'button_device_store_import', '物理机导入到库房', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('4bb746c0-957c-4b3c-a34f-d31eadc3f2b5', 'cloudboot', 'cloudboot_button_permission', 'button_idc_production', '投产数据中心', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('4d3fcda6-589d-4756-be83-dcaa98522863', 'cloudboot', 'cloudboot_button_permission', 'button_predeploy_physical_machine_osInstall', '待部署物理机申请上架部署', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('516793ab-212c-46d3-8e97-b07c4c17b250', 'cloudboot', 'cloudboot_menu_permission', 'menu_hardware_template', '硬件配置', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('5392455e-da22-4f3e-89a2-2abcb25807ce', 'cloudboot', 'cloudboot_button_permission', 'menu_physical_machine', '物理机列表', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('54f551e2-fdd1-434d-a4d7-5bc14e2a06b2', 'cloudboot', 'cloudboot_button_permission', 'menu_predeploy_physical_machine', '待部署物理机', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('5600c39d-627c-4fe0-bd6b-1df004fdc3a2', 'cloudboot', 'cloudboot_button_permission', 'button_network_area_create', '新增网络区域', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('575a3d6e-cfdd-48f9-b774-89dac2edf2bd', 'cloudboot', 'cloudboot_button_permission', 'menu_hardware_template', '硬件配置', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('57fcda67-9e95-4054-9185-74a2a4c4b2f6', 'cloudboot', 'cloudboot_menu_permission', 'menu_physical_machine_management', '物理机管理', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('58c4528b-e91f-4ce9-83a6-6fea56396499', 'cloudboot', 'cloudboot_button_permission', 'button_server_cabinet_locked', '锁定机架', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('5b794b4d-9b9d-4ab5-b9ac-82ae52cc65e8', 'cloudboot', 'cloudboot_menu_permission', 'menu_system_template', '装机配置', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('5da07f63-f95a-4aed-872b-a42615903d7a', 'cloudboot', 'cloudboot_button_permission', 'button_approval_physical_machine_retirement', '物理机退役审批', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('60ce6a29-d4e0-4575-a020-49a0f68d9e5a', 'cloudboot', 'cloudboot_button_permission', 'button_server_cabinet_type', '更新机架类型', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('60d5faf0-89e7-4af5-9d50-47ae40839cc4', 'cloudboot', 'cloudboot_menu_permission', 'menu_store_room', '库房', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('61603ed4-e5cd-42d9-8cc6-61168f731aed', 'cloudboot', 'cloudboot_button_permission', 'button_device_category_create', '新增设备类型', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('61a20339-6fd4-477f-beaa-1870ee23ceb4', 'cloudboot', 'cloudboot_button_permission', 'button_server_usite_import', '导入机位', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('63ddc1bd-560f-4e76-b842-08f79e245830', 'cloudboot', 'cloudboot_button_permission', 'menu_template_management', '配置管理', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('640219d8-9476-44f9-b5c7-97d9e248f5d6', 'cloudboot', 'cloudboot_menu_permission', 'menu_server_cabinet', '机架', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('64474fe0-b314-4061-af03-a13280b1917c', 'cloudboot', 'cloudboot_button_permission', 'button_inspection_addTask', '新建巡检任务', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('64e1e28c-0bd2-4a14-b8f8-480cdff222ae', 'cloudboot', 'cloudboot_button_permission', 'menu_server_usite', '机位', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('6519decd-69b1-488f-92f4-058a5976a31b', 'cloudboot', 'cloudboot_button_permission', 'button_order_confirm', '确认订单', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('65a01cf7-4fc5-4a85-878a-0b69b24116ad', 'cloudboot', 'cloudboot_button_permission', 'button_idc_delete', '删除数据中心', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('6612aab8-1273-41a2-afe1-3e98da57bee0', 'cloudboot', 'cloudboot_button_permission', 'button_mirror_template_delete', '删除镜像配置', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('665bd3f2-f777-4895-aefc-c76449dbc157', 'CloudUam', 'CLOUDUAM_MENU', 'user.list', '查看用户列表', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('687b8c82-b495-4b9e-89d9-7f07e775c132', 'cloudboot', 'cloudboot_button_permission', 'menu_ip_network', 'IP网段', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('69e011c4-3628-4562-9cf5-fe4e0685b28d', 'cloudboot', 'cloudboot_button_permission', 'button_approval_physical_machine_reInstall', '物理机重装审批', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('69eb7e0b-c6f4-4578-a27c-8d44eea78335', 'cloudboot', 'cloudboot_button_permission', 'button_server_room_abolished', '裁撤机房信息', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('6a24c0ef-9d6e-458e-9ec9-cd270c65c119', 'cloudboot', 'cloudboot_button_permission', 'button_approval_revoke', '审批撤销', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('6b1eb99c-1715-4a2b-824d-0a5e519b7227', 'cloudboot', 'cloudboot_button_permission', 'button_physical_machine_download', '存量物理机模板下载', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('6c28d1c9-3d04-4670-9c76-8be1d7674c0d', 'cloudboot', 'cloudboot_button_permission', 'button_idc_abolished', '裁撤数据中心', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('6d8a9bd8-5aac-4bc7-86e3-fee1a3783f62', 'cloudboot', 'cloudboot_button_permission', 'button_predeploy_physical_machine_delete', '删除物理机', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('7008b44b-339c-46bf-860c-1f4268f76ec7', 'cloudboot', 'cloudboot_button_permission', 'button_system_template_update', '修改PXE配置', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('716bf4b2-e6cd-433d-960d-27bdb7360ab2', 'cloudboot', 'cloudboot_button_permission', 'menu_oob_info', '带外管理', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('757c0a4c-675d-4849-8c15-ca4f170bf1e8', 'cloudboot', 'cloudboot_button_permission', 'button_idc_accepted', '验收数据中心', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('765e444d-eb62-4665-83dc-72a32dea9e9b', 'cloudboot', 'cloudboot_button_permission', 'menu_device_category', '设备类型列表', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('76de34ce-6f1a-4c3b-b9ed-94be42051521', 'cloudboot', 'cloudboot_button_permission', 'button_server_room_import', '导入机房信息', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('795a0407-377c-4a8f-a6c3-cff29d575ff4', 'cloudboot', 'cloudboot_button_permission', 'menu_inspection', '硬件巡检', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('7a6db539-c1a9-4c53-a1b7-0f3cd0b04938', 'cloudboot', 'cloudboot_button_permission', 'button_server_cabinet_powerOn', '开电机架', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('7b2546bf-c4a2-4d4c-b004-f14e4b08515c', 'cloudboot', 'cloudboot_button_permission', 'button_task_pause', '暂停', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('7c00dea9-f913-4c8f-9c4c-7157b1df730a', 'cloudboot', 'cloudboot_button_permission', 'button_dhcp_token_batch_release', '批量释放DHCP令牌', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('7c13e51f-f585-4303-80a3-e3542038a3c6', 'cloudboot', 'cloudboot_button_permission', 'button_network_area_delete', '删除网络区域', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('7e4000f2-0b60-4c46-a942-cef6bab2d582', 'cloudboot', 'cloudboot_button_permission', 'button_server_usite_delete', '删除机位', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('7eb259e0-16d5-49db-ac39-2f0753cc6950', 'cloudboot', 'cloudboot_button_permission', 'button_network_area_download', '下载网络区域模板', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('7fdf964c-c7d6-46b7-9040-b752ee299101', 'cloudboot', 'cloudboot_button_permission', 'button_predeploy_physical_machine_powerOn', '待部署物理机开电', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('80ee7836-07a1-47ed-b597-3d9f0e4ed101', 'cloudboot', 'cloudboot_button_permission', 'button_network_area_update', '修改网络区域', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('81063b9d-c0e2-44b6-91f8-d2f8ec8e2680', 'cloudboot', 'cloudboot_menu_permission', 'menu_home', '概览', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('81a74a60-6034-4820-8d6d-ae6a27e14b09', 'cloudboot', 'cloudboot_menu_permission', 'menu_order', '订单列表', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('82764f72-74c7-4d60-9d06-95dcf134fbd0', 'cloudboot', 'cloudboot_button_permission', 'button_task_continue', '继续', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('838694b5-f558-49ca-8a6c-cd3fc784783b', 'cloudboot', 'cloudboot_button_permission', 'menu_device_setting_rule', '装机参数规则列表', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('862f2fe0-87a5-42b0-ba7e-abede83ecfdc', 'cloudboot', 'cloudboot_button_permission', 'button_server_cabinet_download', '下载机架模板', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('87190dd4-5cc4-4191-bec4-d5dff399ca34', 'cloudboot', 'cloudboot_button_permission', 'button_approval_physical_machine_power_off', '物理机关电审批', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('8781d800-2095-471c-bfa2-2894621f782f', 'cloudboot', 'cloudboot_menu_permission', 'menu_server_room', '机房', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('886d9326-9a33-4164-a403-00863135d653', 'cloudboot', 'cloudboot_button_permission', 'button_network_device_import', '导入网络设备', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('8dcbcf24-f4b1-449c-a2b6-d74d66736b9c', 'cloudboot', 'cloudboot_button_permission', 'button_hardware_template_delete', '删除硬件配置', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('8f248e02-c9f7-4d01-b8ce-47b46ae29992', 'cloudboot', 'cloudboot_button_permission', 'button_server_usite_import_port', '导入机位端口', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('91b24f3f-84d1-4f14-a5f5-283ab5657257', 'cloudboot', 'cloudboot_button_permission', 'button_physical_machine_update_oob', '修改物理机带外', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('9249de2c-9b47-43bb-84a4-6c12c931fcec', 'cloudboot', 'cloudboot_button_permission', 'button_network_device_create', '新增网络设备', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('9306325f-6741-4ae6-a39a-6211e4d2ff43', 'cloudboot', 'cloudboot_button_permission', 'button_task_delete', '删除', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('938e1772-5779-4c7f-b1cf-6d1093932218', 'CloudUam', 'CLOUDUAM_MENU', 'user.create', '新建用户', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('9411d788-b8dc-4d82-8dc7-461bb7345f7f', 'cloudboot', 'cloudboot_button_permission', 'button_approval_physical_machine_move', '物理机搬迁审批', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('966c2b5a-2fb6-49f1-a3be-733fce3d4224', 'cloudboot', 'cloudboot_button_permission', 'button_ip_network_update', '修改IP网段管理', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('974029b0-0201-48f3-9b04-dc38ae6baf86', 'cloudboot', 'cloudboot_button_permission', 'button_device_store_import_download', '物理机导入到库房模板下载', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('9aa3b53a-07be-4753-b9e0-fecbaa25eabd', 'cloudboot', 'cloudboot_button_permission', 'button_system_template_delete', '删除PXE配置', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('9d83ac48-c61c-42d9-8494-578bd0397c29', 'cloudboot', 'cloudboot_button_permission', 'button_store_room_delete', '删除库房管理单元', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('9f0ab8c1-e9b0-4fce-ad42-930b514623c3', 'cloudboot', 'cloudboot_button_permission', 'button_ip_unassign', 'IP回收审批', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('a0a756ff-d1a1-4bf2-b457-96fb9596b391', 'cloudboot', 'cloudboot_menu_permission', 'menu_task_management', '任务管理', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('a0cbe0b0-b511-434c-ab9d-6e88153195a6', 'CloudUam', 'CLOUDUAM_MENU', 'userGroup.list', '查看用户组列表', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('a189e7b4-b9e2-464c-82d3-73db66eb53f2', 'cloudboot', 'cloudboot_button_permission', 'button_inspection_inspect', '重新巡检', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('a1b46bd7-3bb0-4bec-85d4-e7b1771dfe13', 'cloudboot', 'cloudboot_menu_permission', 'menu_idc', '数据中心', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('a31b593c-3204-4d07-9b3d-a85407d12fa3', 'cloudboot', 'cloudboot_button_permission', 'menu_task_management', '任务管理', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('a3428f07-0193-4ed5-a989-8d5aa80c64ca', 'cloudboot', 'cloudboot_button_permission', 'menu_system_template', '系统/镜像配置', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('a455c488-8c61-4e90-9285-37c151a79970', 'cloudboot', 'cloudboot_button_permission', 'button_server_usite_update', '修改机位', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('a478ca5d-35f2-4e85-b142-320216d3b2e9', 'cloudboot', 'cloudboot_button_permission', 'button_order_cancel', '取消订单', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('a5119e97-b83d-4808-aa71-15da5dce1902', 'cloudboot', 'cloudboot_button_permission', 'button_network_device_import_download', '下载导入网络设备模板', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('a7858387-79ef-4a7f-bd30-a408a305f3fb', 'CloudUam', 'CLOUDUAM_MENU', 'user.export', '导出用户', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('a93aad67-70b5-4e67-9df0-a27c2bb7c491', 'cloudboot', 'cloudboot_button_permission', 'button_network_area_production', '投产网络区域', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('aa12db28-1197-4e27-b50e-b9c1edd39ee9', 'cloudboot', 'cloudboot_button_permission', 'button_server_usite_status', '更新机位状态', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('ab3d8496-269c-4c70-a543-1d7db58b4675', 'cloudboot', 'cloudboot_button_permission', 'button_ip_network_import', '导入IP网段', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('af32d53c-a412-4dd0-ac5e-2e9a2cfd8cda', 'cloudboot', 'cloudboot_button_permission', 'button_special_device_import_download', '导入特殊设备模板下载', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('b06fde8d-bbd6-46e8-8ff1-a72d4718f227', 'cloudboot', 'cloudboot_button_permission', 'button_system_template_create', '新建PXE配置', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('b2a6cad0-18e1-4540-9483-d4c9157cc035', 'cloudboot', 'cloudboot_button_permission', 'button_approval_server_room_abolish', '机房裁撤审批', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('b4417088-e113-4d78-9a26-4b9330e0d085', 'cloudboot', 'cloudboot_button_permission', 'button_server_cabinet_create', '新增机架', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('b4fc2ee4-e727-42ac-ac9b-01b237d7f5b7', 'CloudUam', 'CLOUDUAM_MENU', 'user.deptOperate', '部门操作(编辑、删除等)', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('b585b3b6-46ba-45de-aa59-0669e206b852', 'cloudboot', 'cloudboot_button_permission', 'menu_order_management', '订单管理', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('b59b503b-9f81-4a85-bb99-349a2a56f0d5', 'cloudboot', 'cloudboot_button_permission', 'button_physical_oob_export', '导出带外', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('b5ccf06c-1a9c-45a2-bc47-0b89360ea8de', 'cloudboot', 'cloudboot_menu_permission', 'menu_predeploy_physical_machine', '待部署物理机', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('b68c62c5-df30-4da6-9e9e-cbbfedb99208', 'cloudboot', 'cloudboot_button_permission', 'button_physical_machine_networkBoot', '从网卡启动物理机', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('b696c8ac-fca4-40b0-99f8-4a2081083aec', 'cloudboot', 'cloudboot_button_permission', 'button_mirror_template_update', '修改镜像配置', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('b69ca84f-87e6-4397-a561-24fd98e02431', 'cloudboot', 'cloudboot_button_permission', 'button_hardware_template_update', '修改硬件配置', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('b89cc9ec-e55b-420d-b259-0af77cdd01c4', 'cloudboot', 'cloudboot_button_permission', 'button_physical_machine_powerOn', '开电物理机', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('b93e49c1-19e6-490e-9f7e-71b770a221ec', 'cloudboot', 'cloudboot_button_permission', 'menu_network_management', '网络管理', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('b9d74fa4-15d2-42b1-8e0a-74b13f37792a', 'cloudboot', 'cloudboot_button_permission', 'button_physical_machine_update_status', '批量修改物理机状态', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('bb28fecb-d15a-4756-b681-41ac5c46869a', 'cloudboot', 'cloudboot_menu_permission', 'menu_approval', '审批管理', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('bc709f25-9666-4b4c-bf46-7a869a51547f', 'cloudboot', 'cloudboot_button_permission', 'button_server_room_accepted', '验收机房信息', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('bd56f7fd-33b5-47d9-87f4-d1cee768bf65', 'cloudboot', 'cloudboot_button_permission', 'button_physical_machine_import', '存量物理机导入', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('bd5701c3-ef3c-401d-bd24-9d88c41fe65e', 'cloudboot', 'cloudboot_button_permission', 'button_special_device_delete', '新增特殊设备', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('bf3cc067-efd9-4ee9-bab6-dcbc7f24cb9c', 'cloudboot', 'cloudboot_button_permission', 'button_physical_machine_export', '物理机导出', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('c1ff4521-8694-4ee9-a963-9deb268bf38e', 'cloudboot', 'cloudboot_button_permission', 'menu_server_room', '机房', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('c239d77a-1e4c-4270-a407-702803a5ffe3', 'cloudboot', 'cloudboot_menu_permission', 'menu_network_management', '网络管理', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('c26d5101-2a99-4a5b-b06e-a3882ce6b4af', 'cloudboot', 'cloudboot_menu_permission', 'menu_device_category', '设备类型列表', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('c294b623-40aa-4ed1-a8bb-c7d44993a5f3', 'cloudboot', 'cloudboot_button_permission', 'button_server_cabinet_remark', '更新机架备注', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('c430ad2d-0a26-4f14-a200-e484e76dcc40', 'cloudboot', 'cloudboot_button_permission', 'button_device_setting_rule_update', '修改装机参数规则', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('c4ad9da6-601b-4c1a-b79a-f0395f5ac6d9', 'cloudboot', 'cloudboot_menu_permission', 'menu_ip_network', 'IP网段', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('c59434ea-3c84-4bfd-b4b7-d52f62594029', 'cloudboot', 'cloudboot_button_permission', 'menu_idc_management', '数据中心管理', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('c6f4b165-304e-45ae-807e-566b5b5de858', 'cloudboot', 'cloudboot_button_permission', 'button_server_room_update', '修改机房信息', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('c733c10a-096e-4ea6-918c-b2523c461c06', 'cloudboot', 'cloudboot_button_permission', 'button_network_area_import', '导入网络区域', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('c764de6e-a574-4d2d-adfd-b5984155abc1', 'cloudboot', 'cloudboot_menu_permission', 'menu_audit_api', '接口调用记录', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('c7a0c8ea-bc4c-4407-8ffc-164931667816', 'cloudboot', 'cloudboot_button_permission', 'button_store_room_create', '新增库房管理单元', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('c7ae3bc8-9ce1-4f91-8e34-d0eac33f3540', 'cloudboot', 'cloudboot_button_permission', 'button_server_cabinet_powerOff', '关电机架', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('c88d2e66-bdb3-4d20-af25-8307787cab08', 'cloudboot', 'cloudboot_button_permission', 'button_approval_physical_machine_recycle_retire', '物理机回收退役审批', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('c99e93f1-ad57-4948-b05c-7e6039d5aa88', 'CloudUam', 'CLOUDUAM_MENU', 'login', '登录', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('cb380632-c71a-48c6-a28b-e82ee465b046', 'cloudboot', 'cloudboot_button_permission', 'button_server_usite_delete_port', '删除机位端口', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('cb95c48b-2531-440f-aa54-e9a448bae621', 'cloudboot', 'cloudboot_menu_permission', 'menu_idc_management', '数据中心管理', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('cc0bc233-e679-4bd0-8481-3d74255640ce', 'cloudboot', 'cloudboot_button_permission', 'menu_device_setting', '部署列表', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('d1350200-1aaf-45ab-8fa7-646513d5fabf', 'CloudUam', 'CLOUDUAM_MENU', 'userGroup.operate', '用户组操作(编辑、删除等)', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('d1bd69c2-8de1-4e2b-980a-9414ab6f4fde', 'cloudboot', 'cloudboot_button_permission', 'button_predeploy_physical_machine_networkBoot', '待部署物理机从网卡启动', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('d33f7d03-871a-4b5e-917e-922206a01ff4', 'cloudboot', 'cloudboot_button_permission', 'button_order_delete', '删除订单', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('d51a3796-bbe9-4701-a5ce-91bd556bbea0', 'cloudboot', 'cloudboot_button_permission', 'button_physical_machine_update', '修改物理机', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('d6bf9f40-537c-47c9-a900-0fb9c4d13e03', 'cloudboot', 'cloudboot_button_permission', 'button_approval_physical_machine_move_import', '导入物理机搬迁审批', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('d9a53b9f-dc12-4ab4-9478-2ab446dba580', 'cloudboot', 'cloudboot_button_permission', 'menu_server_cabinet', '机架', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('dadb1dda-faf8-4ddd-82a7-d0390286585d', 'cloudboot', 'cloudboot_menu_permission', 'menu_order_management', '订单管理', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('dadba20a-db4e-4e4c-b6a8-a7f69dae08ee', 'cloudboot', 'cloudboot_menu_permission', 'menu_audit_log', '操作记录', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('dc00afa8-2bde-4131-a9dc-9b130222de81', 'cloudboot', 'cloudboot_button_permission', 'button_server_cabinet_enabled', '启用机架', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('dc7576d2-fbd6-49cb-a66f-792b03084b7b', 'cloudboot', 'cloudboot_button_permission', 'button_server_cabinet_offline', '下线机架', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('ddc0eb42-138c-4175-8061-ecdd8c093e2e', 'cloudboot', 'cloudboot_button_permission', 'button_approval_disagree', '审批拒绝', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('df0fd248-e289-43d2-8c32-804cdfbcb4b3', 'cloudboot', 'cloudboot_button_permission', 'button_server_cabinet_import', '导入机架', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('df1649b2-b577-4a2c-b678-f125de056819', 'cloudboot', 'cloudboot_button_permission', 'button_store_room_import', '导入库房管理单元', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('df7b5fa6-db35-47b4-a3b7-893127c01f9e', 'cloudboot', 'cloudboot_button_permission', 'menu_physical_machine_management', '物理机管理', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('dfab5389-07b5-489e-95f4-792e323fc075', 'cloudboot', 'cloudboot_button_permission', 'button_virtual_cabinet_create', '新增虚拟货架', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('e00db732-81d6-42a9-bf4c-5a844be768cf', 'cloudboot', 'cloudboot_button_permission', 'button_ip_assign', 'IP分配', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('e118501a-25b2-48fc-a66b-94914d772e24', 'cloudboot', 'cloudboot_button_permission', 'button_server_usite_download', '下载机位模板', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('e2d5ee81-2420-4c90-a637-6e9b40d021ee', 'cloudboot', 'cloudboot_button_permission', 'button_approval_network_area_offline', '网络区域下线审批', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('e3b0a4d4-8b45-42f9-b382-e3eb13b55fd0', 'cloudboot', 'cloudboot_button_permission', 'menu_store_room', '库房信息管理', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('e714da44-a718-4659-8d7f-8f204ac23c29', 'cloudboot', 'cloudboot_button_permission', 'button_device_setting_cancelInstall', '取消部署', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('e7aa158c-c14b-423e-aed3-74287537b5aa', 'cloudboot', 'cloudboot_button_permission', 'button_server_room_create', '新增机房信息', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('e8a5e5c6-c4d4-4893-be0c-6bcf7e26b400', 'cloudboot', 'cloudboot_button_permission', 'button_ip_network_delete', '删除IP网段管理', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('ec0bc4b0-0569-4a9a-933e-16d4becc9007', 'cloudboot', 'cloudboot_button_permission', 'button_approval_physical_machine_restart', '物理机重启审批', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('edd85dfd-89aa-46e3-a225-0ea6e5e6f36d', 'cloudboot', 'cloudboot_menu_permission', 'menu_network_device', '网络设备', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('ee45c3b2-748c-4628-89d2-8e95ac33d7c6', 'cloudboot', 'cloudboot_button_permission', 'button_server_usite_download_port', '下载机位端口模板', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('f0ba296a-0082-42b2-99cb-3b44023543a3', 'CloudUam', 'CLOUDUAM_MENU', 'userGroup.create', '新建用户组', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('f4ef743c-d1d1-455e-9d5a-c53482857722', 'CloudUam', 'CLOUDUAM_MENU', 'tenant', '租户管理', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('f5c51fbd-ad26-4a98-903a-5e1c57ad17b6', 'cloudboot', 'cloudboot_button_permission', 'button_ip_network_sync', '同步IP网段', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'), + ('fc6cc7ed-399d-44e5-95de-d0f663aaa131', 'CloudUam', 'CLOUDUAM_MENU', 'user.deptTree', '查看部门树', '3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'ROLE', 'default'); +/*!40000 ALTER TABLE `PORTAL_PERMISSION` ENABLE KEYS */; + +-- 导出 表 clouduam.PORTAL_RESOURCE 结构 +CREATE TABLE IF NOT EXISTS `PORTAL_RESOURCE` ( + `ID` varchar(64) NOT NULL, + `APP_ID` varchar(64) NOT NULL COMMENT '应用系统名称', + `CODE` varchar(64) NOT NULL COMMENT '权限资源类型', + `NAME` varchar(128) NOT NULL COMMENT '权限资源名称', + `URL` varchar(128) NOT NULL COMMENT '权限资源URL', + `REMARK` varchar(256) NOT NULL COMMENT '备注', + `IS_ACTIVE` varchar(1) NOT NULL DEFAULT 'Y', + `TENANT` varchar(64) DEFAULT NULL COMMENT '租户code', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='权限资源表'; + +-- 正在导出表 clouduam.PORTAL_RESOURCE 的数据:~3 rows (大约) +/*!40000 ALTER TABLE `PORTAL_RESOURCE` DISABLE KEYS */; +REPLACE INTO `PORTAL_RESOURCE` (`ID`, `APP_ID`, `CODE`, `NAME`, `URL`, `REMARK`, `IS_ACTIVE`, `TENANT`) VALUES + ('2534b1fb-9405-11ee-a6bb-b4055d569ecd', 'CloudUam', 'CLOUDUAM_MENU', 'CLOUDUAM菜单权限', 'http://127.0.0.1:8092/uam/permission/menuCodes', 'CLOUDUAM菜单权限', 'Y', 'default'), + ('2de4ca83-75a9-4ec3-b3db-bea54ec60f23', 'cloudboot', 'cloudboot_menu_permission', 'cloudboot菜单权限集合', 'http://127.0.0.1:8083/api/cloudboot/v1/permissions/codes?type=cloudboot_menu_permission', 'cloudboot菜单权限集合', 'Y', 'default'), + ('7fa1a8c8-b568-46c7-92d7-cd712e239cc8', 'cloudboot', 'cloudboot_button_permission', 'cloudboot按钮权限集合', 'http://127.0.0.1:8083/api/cloudboot/v1/permissions/codes?type=cloudboot_button_permission', 'cloudboot按钮权限集合', 'Y', 'default'); +/*!40000 ALTER TABLE `PORTAL_RESOURCE` ENABLE KEYS */; + +-- 导出 表 clouduam.PORTAL_ROLE 结构 +CREATE TABLE IF NOT EXISTS `PORTAL_ROLE` ( + `ID` varchar(64) NOT NULL COMMENT '角色ID', + `CODE` varchar(64) DEFAULT NULL COMMENT '角色编码', + `NAME` varchar(64) NOT NULL COMMENT '角色名称', + `REMARK` varchar(256) DEFAULT NULL COMMENT '角色描述', + `CREATE_USER` varchar(64) DEFAULT NULL COMMENT '创建人', + `GMT_CREATE` datetime DEFAULT NULL COMMENT '创建时间', + `GMT_MODIFIED` datetime DEFAULT NULL COMMENT '最后修改时间', + `IS_ACTIVE` char(1) DEFAULT NULL COMMENT '是否有效', + `TENANT` varchar(64) DEFAULT NULL COMMENT '租户code', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色信息表'; + +-- 正在导出表 clouduam.PORTAL_ROLE 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `PORTAL_ROLE` DISABLE KEYS */; +REPLACE INTO `PORTAL_ROLE` (`ID`, `CODE`, `NAME`, `REMARK`, `CREATE_USER`, `GMT_CREATE`, `GMT_MODIFIED`, `IS_ACTIVE`, `TENANT`) VALUES + ('3cb5fde4-d66a-11e8-bf55-5ce04de286f6', 'SUPER_ADMIN', '超级管理员', '超级管理员', 'system', '2023-12-06 15:00:31', '2023-12-06 15:00:31', 'Y', 'default'); +/*!40000 ALTER TABLE `PORTAL_ROLE` ENABLE KEYS */; + +-- 导出 表 clouduam.PORTAL_SYS_DICT 结构 +CREATE TABLE IF NOT EXISTS `PORTAL_SYS_DICT` ( + `TYPE_CODE` varchar(64) NOT NULL COMMENT '系统字典类型编码', + `CODE` varchar(64) NOT NULL COMMENT '系统字典编码', + `VALUE` text COMMENT '参数值', + `TENANT_ID` varchar(64) NOT NULL COMMENT '租户code', + `REMARK` text COMMENT '说明', + PRIMARY KEY (`TENANT_ID`,`CODE`,`TYPE_CODE`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='uam系统参数表'; + +-- 正在导出表 clouduam.PORTAL_SYS_DICT 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `PORTAL_SYS_DICT` DISABLE KEYS */; +REPLACE INTO `PORTAL_SYS_DICT` (`TYPE_CODE`, `CODE`, `VALUE`, `TENANT_ID`, `REMARK`) VALUES + ('userGroupType', 'default', '默认', 'default', '用户组类型default,值为默认'); +/*!40000 ALTER TABLE `PORTAL_SYS_DICT` ENABLE KEYS */; + +-- 导出 表 clouduam.PORTAL_TENANT 结构 +CREATE TABLE IF NOT EXISTS `PORTAL_TENANT` ( + `ID` varchar(64) NOT NULL, + `NAME` varchar(128) DEFAULT NULL COMMENT '租户编码', + `DISPLAY_NAME` varchar(128) DEFAULT NULL COMMENT '租户名称', + `GMT_CREATE` datetime DEFAULT NULL COMMENT '创建日期', + `GMT_MODIFIED` datetime NOT NULL COMMENT '修改日期', + `IS_ACTIVE` char(1) DEFAULT NULL COMMENT '是否可用', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='租户信息表'; + +-- 正在导出表 clouduam.PORTAL_TENANT 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `PORTAL_TENANT` DISABLE KEYS */; +REPLACE INTO `PORTAL_TENANT` (`ID`, `NAME`, `DISPLAY_NAME`, `GMT_CREATE`, `GMT_MODIFIED`, `IS_ACTIVE`) VALUES + ('59df4f30e4b088cbabc4cb4d', 'default', '管理租户', '2023-12-06 15:00:31', '2023-12-06 15:00:31', 'Y'); +/*!40000 ALTER TABLE `PORTAL_TENANT` ENABLE KEYS */; + +-- 导出 表 clouduam.PORTAL_TOKEN 结构 +CREATE TABLE IF NOT EXISTS `PORTAL_TOKEN` ( + `ID` varchar(64) NOT NULL, + `NAME` text NOT NULL COMMENT 'token值', + `TOKEN_CRC` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'token串的crc哈希值', + `LOGIN_ID` varchar(64) DEFAULT NULL COMMENT '登录名', + `TENANT_ID` varchar(64) NOT NULL COMMENT '租户code', + `IS_ACTIVE` char(1) DEFAULT NULL COMMENT '是否可用', + `EXPIRE_TIME` datetime NOT NULL COMMENT 'token过期时间', + `GMT_CREATE` datetime DEFAULT NULL COMMENT '创建日期', + `GMT_MODIFIED` datetime NOT NULL COMMENT '修改日期', + `REMARK` longtext COMMENT '备注', + PRIMARY KEY (`ID`), + KEY `token_hash_crc` (`TOKEN_CRC`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='token信息表'; + +-- 正在导出表 clouduam.PORTAL_TOKEN 的数据:~11 rows (大约) +/*!40000 ALTER TABLE `PORTAL_TOKEN` DISABLE KEYS */; +REPLACE INTO `PORTAL_TOKEN` (`ID`, `NAME`, `TOKEN_CRC`, `LOGIN_ID`, `TENANT_ID`, `IS_ACTIVE`, `EXPIRE_TIME`, `GMT_CREATE`, `GMT_MODIFIED`, `REMARK`) VALUES + ('13e136a7-cfd7-4d51-afa7-a1c9c3c13246', 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiLnrqHnkIblkZgiLCJ1c2VySWQiOiI1OWRmNTk2MGNkNmFjMzVmNTMxMzViMzEiLCJuYW1lIjoi566h55CG5ZGYIiwibG9naW5JZCI6ImFkbWluIiwibG9naW5OYW1lIjoiYWRtaW4iLCJ0ZW5hbnRJZCI6ImRlZmF1bHQiLCJ0aW1lb3V0IjoyMTYwMCwiZXhwIjoxNzAxOTMyNDYxLCJjcmVhdFRpbWUiOjE3MDE5MTA4NjExMzcsInRlbmFudE5hbWUiOiLnrqHnkIbnp5_miLcifQ.zhdFeCAHJFlQHgXNkKACS4Zd3VmTQJtDBwHTIH_qFZQ', 4002311361, 'admin', 'default', 'Y', '2023-12-07 15:01:01', '2023-12-07 09:01:01', '2023-12-07 09:01:01', NULL), + ('20801c97-a049-4054-994c-c3b502ada8c1', 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiLnrqHnkIblkZgiLCJ1c2VySWQiOiI1OWRmNTk2MGNkNmFjMzVmNTMxMzViMzEiLCJuYW1lIjoi566h55CG5ZGYIiwibG9naW5JZCI6ImFkbWluIiwibG9naW5OYW1lIjoiYWRtaW4iLCJ0ZW5hbnRJZCI6ImRlZmF1bHQiLCJ0aW1lb3V0IjoyMTYwMCwiZXhwIjoxNzAyNDY5NzgyLCJjcmVhdFRpbWUiOjE3MDI0NDgxODI1MzAsInRlbmFudE5hbWUiOiLnrqHnkIbnp5_miLcifQ.tt_KhA4owFJsGZApElY6nxkUR_hftNHS0ihnlN_CxjI', 2690808154, 'admin', 'default', 'Y', '2023-12-13 20:16:22', '2023-12-13 14:16:23', '2023-12-13 14:16:23', NULL), + ('25354401-9405-11ee-a6bb-b4055d569ecd', 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiLnrqHnkIblkZgiLCJ1c2VySWQiOiI1OWRmNTk2MGNkNmFjMzVmNTMxMzViMzEiLCJuYW1lIjoi566h55CG5ZGYIiwibG9naW5JZCI6ImFkbWluIiwibG9naW5OYW1lIjoiYWRtaW4iLCJ0ZW5hbnRJZCI6ImRlZmF1bHQiLCJ0aW1lb3V0IjoyNDAwMCwiZXhwIjoxODkzNDkyMDAwLCJjcmVhdFRpbWUiOjE1MjgzNDEwNjA0ODcsInRlbmFudE5hbWUiOiLnrqHnkIbnp5_miLcifQ._Iq6xfjaTfM7OXSJu-pyQycfK3ycGqlV-bm9_mSXh6g', 3062456733, 'admin', 'default', 'Y', '2030-01-01 18:00:00', '2023-12-06 15:00:31', '2023-12-06 15:00:31', '系统配置的永久token'), + ('2c6c79c9-b69a-4c93-a43f-263489cf7aab', 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiLnrqHnkIblkZgiLCJ1c2VySWQiOiI1OWRmNTk2MGNkNmFjMzVmNTMxMzViMzEiLCJuYW1lIjoi566h55CG5ZGYIiwibG9naW5JZCI6ImFkbWluIiwibG9naW5OYW1lIjoiYWRtaW4iLCJ0ZW5hbnRJZCI6ImRlZmF1bHQiLCJ0aW1lb3V0IjoyMTYwMCwiZXhwIjoxNzAyMTA4MzMyLCJjcmVhdFRpbWUiOjE3MDIwODY3MzI3NzMsInRlbmFudE5hbWUiOiLnrqHnkIbnp5_miLcifQ.hXFHQC5fVnfcJlHxuq5Dv6yexl52T11ihHWYsCrFYvE', 2455366502, 'admin', 'default', 'Y', '2023-12-09 15:52:12', '2023-12-09 09:52:13', '2023-12-09 09:52:13', NULL), + ('2e63431b-f8e2-43ca-9a0b-1181a728cd9b', 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiLnrqHnkIblkZgiLCJ1c2VySWQiOiI1OWRmNTk2MGNkNmFjMzVmNTMxMzViMzEiLCJuYW1lIjoi566h55CG5ZGYIiwibG9naW5JZCI6ImFkbWluIiwibG9naW5OYW1lIjoiYWRtaW4iLCJ0ZW5hbnRJZCI6ImRlZmF1bHQiLCJ0aW1lb3V0IjoyMTYwMCwiZXhwIjoxNzAxODg4NzM1LCJjcmVhdFRpbWUiOjE3MDE4NjcxMzU1NzIsInRlbmFudE5hbWUiOiLnrqHnkIbnp5_miLcifQ.R2dyTcDsD5MPWru2bYSN84l2VJ-RQoJIDfhyKCJDbTA', 3527168430, 'admin', 'default', 'Y', '2023-12-07 02:52:15', '2023-12-06 20:52:16', '2023-12-06 20:52:16', NULL), + ('3f17d062-4a74-47be-9ca4-ec41ef390f9f', 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiLnrqHnkIblkZgiLCJ1c2VySWQiOiI1OWRmNTk2MGNkNmFjMzVmNTMxMzViMzEiLCJuYW1lIjoi566h55CG5ZGYIiwibG9naW5JZCI6ImFkbWluIiwibG9naW5OYW1lIjoiYWRtaW4iLCJ0ZW5hbnRJZCI6ImRlZmF1bHQiLCJ0aW1lb3V0IjoyMTYwMCwiZXhwIjoxNzAyNTM1ODAzLCJjcmVhdFRpbWUiOjE3MDI1MTQyMDMzMDYsInRlbmFudE5hbWUiOiLnrqHnkIbnp5_miLcifQ.9t_Ymtik-kQy-ih2WXCV_Qna1M7IvRSYK_rrMOuf_yA', 2463626145, 'admin', 'default', 'Y', '2023-12-14 14:36:43', '2023-12-14 08:36:43', '2023-12-14 08:36:43', NULL), + ('6e07257a-871f-4f9a-ac90-fb99865d3b9d', 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiLnrqHnkIblkZgiLCJ1c2VySWQiOiI1OWRmNTk2MGNkNmFjMzVmNTMxMzViMzEiLCJuYW1lIjoi566h55CG5ZGYIiwibG9naW5JZCI6ImFkbWluIiwibG9naW5OYW1lIjoiYWRtaW4iLCJ0ZW5hbnRJZCI6ImRlZmF1bHQiLCJ0aW1lb3V0IjoyMTYwMCwiZXhwIjoxNzAxOTMwNjY0LCJjcmVhdFRpbWUiOjE3MDE5MDkwNjQyNjcsInRlbmFudE5hbWUiOiLnrqHnkIbnp5_miLcifQ.12FSyVvSfIZ_SG1gKzOSOf3PEPIXoT1KIxaek5YX4Yo', 560336943, 'admin', 'default', 'Y', '2023-12-07 14:31:04', '2023-12-07 08:31:04', '2023-12-07 08:31:04', NULL), + ('74ccc709-797f-437c-9476-4a29bd42204b', 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiLnrqHnkIblkZgiLCJ1c2VySWQiOiI1OWRmNTk2MGNkNmFjMzVmNTMxMzViMzEiLCJuYW1lIjoi566h55CG5ZGYIiwibG9naW5JZCI6ImFkbWluIiwibG9naW5OYW1lIjoiYWRtaW4iLCJ0ZW5hbnRJZCI6ImRlZmF1bHQiLCJ0aW1lb3V0IjoyMTYwMCwiZXhwIjoxNzAyNTY2NjE5LCJjcmVhdFRpbWUiOjE3MDI1NDUwMTkxMTYsInRlbmFudE5hbWUiOiLnrqHnkIbnp5_miLcifQ.osjpGjFxzIrx60oZ6SzvLl2e9ZS1IVjJ429rXcAnejQ', 2560445608, 'admin', 'default', 'Y', '2023-12-14 23:10:19', '2023-12-14 17:10:19', '2023-12-14 17:10:19', NULL), + ('7f53711c-8e55-412c-badd-d7de7827e9bc', 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiLnrqHnkIblkZgiLCJ1c2VySWQiOiI1OWRmNTk2MGNkNmFjMzVmNTMxMzViMzEiLCJuYW1lIjoi566h55CG5ZGYIiwibG9naW5JZCI6ImFkbWluIiwibG9naW5OYW1lIjoiYWRtaW4iLCJ0ZW5hbnRJZCI6ImRlZmF1bHQiLCJ0aW1lb3V0IjoyMTYwMCwiZXhwIjoxNzAxOTMyOTEyLCJjcmVhdFRpbWUiOjE3MDE5MTEzMTIwMjAsInRlbmFudE5hbWUiOiLnrqHnkIbnp5_miLcifQ.-ikjTKeA0-1wy1_BjCYjNRKCmdyue87OEWMbfJqG9iM', 3014900625, 'admin', 'default', 'Y', '2023-12-07 15:08:32', '2023-12-07 09:08:32', '2023-12-07 09:08:32', NULL), + ('afbd4797-c54e-4c9d-97ec-edad10eb511b', 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiLnrqHnkIblkZgiLCJ1c2VySWQiOiI1OWRmNTk2MGNkNmFjMzVmNTMxMzViMzEiLCJuYW1lIjoi566h55CG5ZGYIiwibG9naW5JZCI6ImFkbWluIiwibG9naW5OYW1lIjoiYWRtaW4iLCJ0ZW5hbnRJZCI6ImRlZmF1bHQiLCJ0aW1lb3V0IjoyMTYwMCwiZXhwIjoxNzAxODg5MTU1LCJjcmVhdFRpbWUiOjE3MDE4Njc1NTUzMzcsInRlbmFudE5hbWUiOiLnrqHnkIbnp5_miLcifQ.wWe-5k7FPoTyBY0ShdBgl9L5TpvrLKxAtF1Vzpe0QEI', 3784738346, 'admin', 'default', 'Y', '2023-12-07 02:59:15', '2023-12-06 20:59:15', '2023-12-06 20:59:15', NULL), + ('bbc56d0e-547f-4feb-a4c8-11aaa25f59e8', 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiLnrqHnkIblkZgiLCJ1c2VySWQiOiI1OWRmNTk2MGNkNmFjMzVmNTMxMzViMzEiLCJuYW1lIjoi566h55CG5ZGYIiwibG9naW5JZCI6ImFkbWluIiwibG9naW5OYW1lIjoiYWRtaW4iLCJ0ZW5hbnRJZCI6ImRlZmF1bHQiLCJ0aW1lb3V0IjoyMTYwMCwiZXhwIjoxNzAxODg4NzI1LCJjcmVhdFRpbWUiOjE3MDE4NjcxMjU1NTIsInRlbmFudE5hbWUiOiLnrqHnkIbnp5_miLcifQ.tJZKswRYzikHKuzYpRQe7IG2Qrx7GNrGpAwMaQ5Bhxc', 3261116001, 'admin', 'default', 'Y', '2023-12-07 02:52:05', '2023-12-06 20:52:06', '2023-12-06 20:52:06', NULL); +/*!40000 ALTER TABLE `PORTAL_TOKEN` ENABLE KEYS */; + +-- 导出 表 clouduam.PORTAL_USER 结构 +CREATE TABLE IF NOT EXISTS `PORTAL_USER` ( + `ID` varchar(64) NOT NULL COMMENT '用户ID', + `NAME` varchar(64) DEFAULT NULL, + `LOGIN_ID` varchar(64) DEFAULT NULL COMMENT '登录名', + `DEPT_ID` varchar(64) DEFAULT NULL COMMENT '部门id', + `TITLE` varchar(64) DEFAULT NULL COMMENT '标签', + `MOBILE1` varchar(64) DEFAULT NULL, + `WEIXIN` varchar(64) DEFAULT NULL COMMENT '标签', + `EMAIL` varchar(256) DEFAULT NULL COMMENT '邮箱', + `IS_ACTIVE` char(1) DEFAULT NULL COMMENT '是否有效', + `STATUS` varchar(64) NOT NULL DEFAULT 'INIT' COMMENT '用户类型:INIT、ENABLED、DISABLED、LOCKED', + `REMARK` varchar(256) DEFAULT NULL COMMENT '备注', + `TENANT_ID` varchar(64) DEFAULT NULL COMMENT '租户编码', + `SOURCE_TYPE` varchar(64) NOT NULL DEFAULT 'native' COMMENT '数据同步来源来源,默认值native表示本系统,如果来自第三方,则需重新定义该值', + `LAST_MODIFIED_TIME` datetime DEFAULT NULL COMMENT '最后登录时间', + `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', + `LAST_LOGIN_TIME` datetime DEFAULT NULL COMMENT '最后修改时间', + `PASSWORD` varchar(255) DEFAULT NULL COMMENT '密码', + `SALT` varchar(255) DEFAULT NULL COMMENT '密码盐', + `MOBILE2` varchar(64) DEFAULT NULL, + `RTX` varchar(32) DEFAULT NULL COMMENT 'RTX沟通工具', + `OFFICE_TEL1` varchar(64) DEFAULT NULL, + `OFFICE_TEL2` varchar(64) DEFAULT NULL, + `EMPLOYEE_TYPE` varchar(64) DEFAULT NULL, + `CREATE_USER` varchar(64) DEFAULT NULL COMMENT '创建人', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户信息表'; + +-- 正在导出表 clouduam.PORTAL_USER 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `PORTAL_USER` DISABLE KEYS */; +REPLACE INTO `PORTAL_USER` (`ID`, `NAME`, `LOGIN_ID`, `DEPT_ID`, `TITLE`, `MOBILE1`, `WEIXIN`, `EMAIL`, `IS_ACTIVE`, `STATUS`, `REMARK`, `TENANT_ID`, `SOURCE_TYPE`, `LAST_MODIFIED_TIME`, `CREATE_TIME`, `LAST_LOGIN_TIME`, `PASSWORD`, `SALT`, `MOBILE2`, `RTX`, `OFFICE_TEL1`, `OFFICE_TEL2`, `EMPLOYEE_TYPE`, `CREATE_USER`) VALUES + ('59df5960cd6ac35f53135b31', '管理员', 'admin', NULL, NULL, NULL, NULL, NULL, 'Y', 'ENABLED', NULL, 'default', 'native', '2023-12-06 15:00:31', '2023-12-06 15:00:31', '2023-12-06 15:00:31', 'c10c1a40b6f8956f057cd95ce35519ae', 'yWw1FKf6BZk=', NULL, NULL, NULL, NULL, NULL, 'system'); +/*!40000 ALTER TABLE `PORTAL_USER` ENABLE KEYS */; + +-- 导出 表 clouduam.PORTAL_USER_GROUP 结构 +CREATE TABLE IF NOT EXISTS `PORTAL_USER_GROUP` ( + `ID` varchar(64) NOT NULL COMMENT '用户组ID', + `NAME` varchar(128) DEFAULT NULL COMMENT '用户组名称', + `TYPE` varchar(64) DEFAULT NULL COMMENT '用户组类型', + `REMARK` varchar(256) DEFAULT NULL COMMENT '备注', + `CREATE_USER` varchar(64) DEFAULT NULL COMMENT '创建人', + `GMT_CREATE` datetime DEFAULT NULL COMMENT '创建时间', + `GMT_MODIFIED` datetime NOT NULL COMMENT '最后修改时间', + `IS_ACTIVE` char(1) DEFAULT NULL COMMENT '是否有效', + `TENANT` varchar(64) DEFAULT NULL COMMENT '租户code', + PRIMARY KEY (`ID`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户组信息表'; + +-- 正在导出表 clouduam.PORTAL_USER_GROUP 的数据:~0 rows (大约) +/*!40000 ALTER TABLE `PORTAL_USER_GROUP` DISABLE KEYS */; +REPLACE INTO `PORTAL_USER_GROUP` (`ID`, `NAME`, `TYPE`, `REMARK`, `CREATE_USER`, `GMT_CREATE`, `GMT_MODIFIED`, `IS_ACTIVE`, `TENANT`) VALUES + ('245c438e-d66a-11e8-bf55-5ce04de286f6', '超级用户组', 'default', '超级用户组', 'system', '2023-12-06 15:00:31', '2023-12-06 15:00:31', 'Y', 'default'); +/*!40000 ALTER TABLE `PORTAL_USER_GROUP` ENABLE KEYS */; + +/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; +/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; diff --git a/cyclone-server/doc/scripts/commonSetting.py b/cyclone-server/doc/scripts/commonSetting.py new file mode 100644 index 0000000000000000000000000000000000000000..b2386684acf1103bd2e6e999855303d7820dc940 --- /dev/null +++ b/cyclone-server/doc/scripts/commonSetting.py @@ -0,0 +1,763 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# ========================================================================= +# FileName: commonSetting.py +# Creator: JosingCai +# Mail: caijiaoxing@idcos.com +# Created Time: 2018-08-28 +# Description: 配置操作系统中需更新的项 +# Usage: 1. Master存放路径:/opt/cloudboot/home/www/scripts +# BootOS存放路径:/tmp +# 2. 手动调试: +# (1)下载脚本,curl -o /tmp/commonSetting.py http://osinstall/scripts/commonSetting.py +# (2)执行脚本:python /tmp/commonSetting.py --network=Y --osuser=Y ... +# (3)操作日志路径:/tmp/operator.log +# 参数在装机参数模板中,如:http://osinstall.idcos.com/api/cloudboot/v1/devices/{sn}/settings/os-users +# History: 2018-08-28/Create file +# 2019-03-22/Adapter config network in tlinux distribution +# 2019-03-25/Add function removeOldcfg() to remove old net config file +# 2019-03-25/Add function getDomainIP() to get the IP of Domain Name +# 2019-05-30/Optimized: Adapt to earlier version of dmidecode program +# 2019-07-24/Fit to SuSE python3.x Env; Fit to SueSE network config +# 2019-08-06/Add function to get MAC for eth port in SuSE +# 2019-08-09/Add funtion to restart network after config network +# 2019-10-15/Fit bondTxt: BONDING_MODULES_OPTS to BONDING_MODULE_OPTS +# 2020-01-14/Add Eth4 and eth5 will be added to bond1 when there are 6 ethernet controller +# 2020-02-13/Add modifySSHDConfig set innner ip for ssh listen +# 2020-03-16/Fix modifySSHDConfig set Port 36000 and replace listenaddress anyway +# 2020-04-14/Fix bondTxt,ethTxt: MN_CONTROLLED to NM_CONTROLLED=no +# 2020-05-20/Add mountData: sdb - sdo for /data1 - /dat14 if exist +# 2022-09-26/Add update network for openEuler +# Copyright (c) 2015-2028 iDCOS Tech. All Right Reserved. +# ========================================================================= + +import json +import os +import datetime +import sys +import socket +import time + +if sys.version > '3': + import urllib.request as urllib2 + import subprocess as commands +else: + import urllib2 + import commands + +reload(sys) +sys.setdefaultencoding('utf8') + +DEBUG = False +POST_INTERVAL = 3 # 配置负载均衡后, POST两次请求过快,会导致主动拒绝客户端的连接,出现499 + +host = "osinstall.idcos.com" +pathHead = "http://%s/api/cloudboot/v1" %host + +def getSN(): + cmd = "dmidecode -s system-serial-number | awk '/^[^#]/ { print $1 }'" + status, output = commands.getstatusoutput(cmd) + if status != 0: + return False, output + sn = output.strip() + return True, sn + +class SystemInfo(object): + """docstring for SystemInfo""" + def __init__(self, sn): + self.sn = sn.replace(" ", '') + + def getDomainIP(self): + domainName = host + ret = socket.getaddrinfo(domainName, None) + IP = ret[0][4][0] + self.logRecord("%s: %s" %(host, IP)) + + def uploadProgress(self, item, status=2): + statusDict = {0: "Pass", 1: "Fail", 2: "Skip"} + items = {"network":{"title":"Config Network", "progress":0.8, "log":"Q29uZmlnIE5ldHdvcms="}, + "hostName":{"title":"Config HostName", "progress":0.82, "log":"Q29uZmlnIEhvc3ROYW1l"}, + "OSUser":{"title":"Config OS User", "progress":0.85, "log":"Q29uZmlnIFVzZXI="}, + "firmware":{"title":"Update Firmware", "progress":0.9, "log":"VXBkYXRlIEZpcm13YXJl"}, + "service":{"title":"Config Service", "progress":0.95, "log":"Q29uZmlnIFN5c3RlbSBTZXJ2aWNl"}, + "mountdata":{"title":"Mount Data", "progress":0.96, "log":"TW91bnQgRGF0YQ=="}, + "complete":{"title":"Complete", "progress":1, "log":"SW5zdGFsbCBGaW5pc2hlZA=="} + } + if item == "complete": + cmd = r'curl -H "Content-Type: application/json" -X POST -d "{\"title\":\"%s\",\"progress\":%s,\"log\":\"%s\"}" %s/devices/%s/installations/progress'%(items[item]['title'], items[item]['progress'], items[item]['log'], pathHead, self.sn) + else: + cmd = r'curl -H "Content-Type: application/json" -X POST -d "{\"title\":\"%s %s\",\"progress\":%s,\"log\":\"%s\"}" %s/devices/%s/installations/progress'%(items[item]['title'], statusDict[status], items[item]['progress'], items[item]['log'], pathHead, self.sn) + status, output = commands.getstatusoutput(cmd) + self.logRecord(cmd) + self.logRecord(output) + if "error" in output: + time.sleep(POST_INTERVAL) + status, output = commands.getstatusoutput(cmd) + self.logRecord(output) + if status: + return False + time.sleep(POST_INTERVAL) + return True + + def logRecord(self, string, Type=0): + info = {0: "Info", 1: "Error"} + curTime=datetime.datetime.now().strftime('%Y-%m-%d_%H:%M:%S') + String = "[ %s ] %s: %s\n"%(curTime, info[Type], string) + if DEBUG is True: + print String + with open("/tmp/operator.log", 'a+') as f: + f.write(String) + + def updateOSUser(self): + url = '%s/devices/%s/settings/os-users' %(pathHead,self.sn) + self.logRecord(url, 0) + try: + req = urllib2.Request(url) + result = urllib2.urlopen(req) + except: + self.logRecord("Connect %s Error, Please check it ~ " %host, 1) + self.uploadProgress("OSUser", 1) + return False + + if sys.version > '3': + ret = json.loads(str(result.read(), 'utf-8')) + else: + ret = json.loads(result.read()) + self.logRecord(ret["content"]) + + item = ret['content'] + user_name = item['username'] + passwd = item['password'] + cmd = "cat /etc/passwd | awk -F ':' '{print $1}' | grep %s"%user_name + status, output = commands.getstatusoutput(cmd) + if status != 0 and len(output) == 0: + cmd = 'useradd -d /home/%s -m %s -g root' % (user_name, user_name) + status, output = commands.getstatusoutput(cmd) + if status != 0: + self.logRecord(output, 1) + self.uploadProgress("OSUser", 1) + return False + self.logRecord(output) + cmd = 'echo %s | passwd %s --stdin' % (passwd, user_name) + status, output = commands.getstatusoutput(cmd) + if status != 0: + self.logRecord(output, 1) + self.uploadProgress("OSUser", 1) + return False + self.logRecord(output) + self.uploadProgress("OSUser", 0) + return True + + def removeOldCfg(self, os_type="centos"): + ethList = ["eth0", "eth1", "eth2", "eth3", "eth4", "eth5", "bond0", "bond1"] + if os_type == "sles": + base = "/etc/sysconfig/network/ifcfg" + else: + base = "/etc/sysconfig/network-scripts/ifcfg" + for eth in ethList: + netPath = "%s-%s" %(base, eth) + if os.path.exists(netPath): + os.remove(netPath) + + def remove70File(self): + cmd = "ls /etc/udev/rules.d/70*" + status, output = commands.getstatusoutput(cmd) + self.logRecord(output) + fileList = output.split("\n") + for filePath in fileList: + if os.path.exists(filePath): + os.remove(filePath) + return True + else: + return True + + def getNetMAC(self): + portList = [] + cmd = "ip -4 -o l" + status, output = commands.getstatusoutput(cmd) + self.logRecord(output) + if status != 0 : + return False + tmps = output.split("\n") + portNum = len(tmps) + mac_list = [] + for i in range(len(tmps)): + line = tmps[i] + parts = line.split(":") + name = parts[1].strip() + if name != "lo": + parts = line.split("link/ether") + mac = parts[1].split()[0].strip() + mac_list.append(mac) + self.logRecord(mac_list) + return mac_list + + def modifySSHDConfig(self, intranet_ip): + sshd_config_file = '/etc/ssh/sshd_config' + sshd_listten_ip = intranet_ip + + cmd_check = 'grep "^Port" '+sshd_config_file+' | awk \'{print $2}\'' + status, output = commands.getstatusoutput(cmd_check) + if output == "": + self.logRecord("sshd listen port is not set.") + cmd_modify = "sed -i '/^#Port 22/a\Port 36000' "+sshd_config_file + self.logRecord(cmd_modify) + commands.getstatusoutput(cmd_modify) + + if output != "" and output != "36000": + self.logRecord("sshd listen port is not 36000.") + cmd_modify = "sed -i 's/^Port.*/Port 36000/' "+sshd_config_file + self.logRecord(cmd_modify) + commands.getstatusoutput(cmd_modify) + + cmd_check = 'grep "^ListenAddress" '+sshd_config_file + status, output = commands.getstatusoutput(cmd_check) + if output != "": + self.logRecord("ListenAddress already exist. Replace it.") + cmd_modify = "sed -i 's/^ListenAddress.*/ListenAddress "+sshd_listten_ip+"/' "+sshd_config_file + self.logRecord(cmd_modify) + status, output = commands.getstatusoutput(cmd_modify) + else: + cmd_modify = "sed -i '/^Port 36000/a\ListenAddress "+sshd_listten_ip+"' "+sshd_config_file + self.logRecord(cmd_modify) + status, output = commands.getstatusoutput(cmd_modify) + + def setNetInfo(self, os_type, **info): + if os_type == "sles": + netPath = "/etc/sysconfig/network" + if info["version"] == "ipv4": + gatewayStr = "default %s\n"%info["gateway"] #SuSE网关配置 + with open("%s/routes" %netPath, "w") as f: + f.write(gatewayStr) + else: + netPath = "/etc/sysconfig/network-scripts" + + cmd = "lspci | grep -i Ethernet | wc -l" + status, output = commands.getstatusoutput(cmd) + self.logRecord("There are %s ethernet controller." % output) + countEth = 0 + if output == "6": + countEth = 6 # 针对主板4个网口未禁用,使用外接两网口网卡场景 + self.logRecord("Eth4 and eth5 will be added to bond1 when there are 6 ethernet controller.") + + if info["bonding"] == "yes": + if info["version"] == "ipv4": + # 指定内外网对应的网卡设备 + if info["scope"] == "intranet": + if countEth == 6: + eths = ["eth1", "eth0", "eth4", "eth5"] + else: + eths = ["eth1", "eth0"] + else: + # 简单地规避效的bond配置 + if countEth >=4: + eths = ["eth2", "eth3"] + else: + eths = [] + # sles 网络配置兼容 + if os_type == "sles": + for eth in eths: + ethTxt = "# IP Config for %s:\nDEVICE='%s'\nBOOTPROTO='static'\nSTARTMODE='onboot'\n" %(eth, eth) + with open("%s/ifcfg-%s"%(netPath, eth), 'w') as f: + f.write(ethTxt) + bondTxt = "# IP Config for %s:\nDEVICE=%s\nBOOTPROTO=static\nSTARTMODE=onboot\nIPADDR=%s\nNETMASK=%s\nGATEWAY=%s\nBONDING_MASTER=yes\nBONDING_MODULE_OPTS='miimon=100 mode=4'\nBONDING_SLAVE0=%s\nBONDING_SLAVE1=%s\n"%(info["name"], info["name"], info['ip'], info['netmask'], info['gateway'],eths[0], eths[1]) + with open("%s/ifcfg-%s"%(netPath, info['name']), 'w') as f: + f.write(bondTxt) + # openEuler 网络配置兼容(该发行版使用NetworkManager服务管理网络) + elif os_type == "openEuler": + for eth in eths: + ethTxt = "# IP Config for %s:\nDEVICE=%s\nTYPE=Ethernet\nBOOTPROTO=none\nONBOOT=yes\nSLAVE=yes\nMASTER=%s\n"%(eth, eth, info['name']) + with open("%s/ifcfg-%s"%(netPath, eth), 'w') as f: + f.write(ethTxt) + bondTxt = "# IP Config for %s:\nDEVICE=%s\nTYPE=Bond\nONBOOT=yes\nBOOTPROTO=none\nDELAY=0\nIPADDR=%s\nNETMASK=%s\nGATEWAY=%s\nBONDING_OPTS='mode=4 miimon=100 lacp_rate=fast xmit_hash_policy=layer3+4'\n"%(info["name"], info["name"], info['ip'], info['netmask'], info['gateway']) + with open("%s/ifcfg-%s"%(netPath, info['name']), 'a') as f: + f.write(bondTxt) + # 存在外网时,固化私网网段路由表,修改默认路由指向外网 + if info["scope"] == "extranet": + routeTxt = "9.0.0.0/8 via %s dev %s\n10.0.0.0/8 via %s dev %s\n100.64.0.0/10 via %s dev %s\n"%(info['gateway'], info['name'], info['gateway'], info['name'], info['gateway'], info['name']) + with open("%s/route-%s"%(netPath, "bond1"), 'w') as f: + f.write(routeTxt) + with open("%s/ifcfg-%s"%(netPath, "bond0"), 'a') as f: + f.write("DEFROUTE=yes") + with open("%s/ifcfg-%s"%(netPath, "bond1"), 'a') as f: + f.write("DEFROUTE=no") + else: + for eth in eths: + ethTxt = "# IP Config for %s:\nDEVICE=%s\nTYPE=Ethernet\nBOOTPROTO=none\nONBOOT=yes\nNM_CONTROLLED=no\nSLAVE=yes\nMASTER=%s\n"%(eth, eth, info['name']) + with open("%s/ifcfg-%s"%(netPath, eth), 'w') as f: + f.write(ethTxt) + bondTxt = "# IP Config for %s:\nDEVICE=%s\nONBOOT=yes\nBOOTPROTO=static\nNM_CONTROLLED=no\nDELAY=0\nIPADDR=%s\nNETMASK=%s\nGATEWAY=%s\nBONDING_OPTS='mode=4 miimon=100 lacp_rate=fast xmit_hash_policy=layer3+4'\n"%(info["name"], info["name"], info['ip'], info['netmask'], info['gateway']) + with open("%s/ifcfg-%s"%(netPath, info['name']), 'w') as f: + f.write(bondTxt) + + if info["version"] == "ipv6": + bondTxt = "IPV6INIT=yes\nIPV6_AUTOCONF=no\nIPV6_FAILURE_FATAL=no\nIPV6ADDR=%s\nIPV6_DEFAULTGW=%s\n"%((info['ip']+"/"+info['netmask']), info['gateway']) + with open("%s/ifcfg-%s"%(netPath, info['name']), 'a') as f: + f.write(bondTxt) + else: + if os_type == "sles": + macs = self.getNetMAC() + index = int(info['name'][-1]) + if index <= len(macs): + if info["version"] == "ipv4": + ethText = "# IP Config for %s:\nBOOTPROTO=static\nIPADDR=%s\nNETMASK=%s\nSTARTMODE=auto\nHWADDR=%s\n" %(info['name'], info['ip'], info['netmask'], macs[index]) + with open("%s/ifcfg-%s"%(netPath, info['name']), 'w') as f: + f.write(ethText) + else: + return False + else: + if info["version"] == "ipv4": + ethText = "# IP Config for %s:\nDEVICE=%s\nTYPE=Ethernet\nBOOTPROTO=static\nIPADDR=%s\nNETMASK=%s\nONBOOT=yes\nGATEWAY=%s\n"% (info['name'], info['name'], info['ip'], info['netmask'], info['gateway']) + with open("%s/ifcfg-%s"%(netPath, info['name']), 'w') as f: + f.write(ethText) + return True + + def updateNetwork(self): + url = '%s/devices/%s/settings/networks' %(pathHead, self.sn) + self.logRecord(url, 0) + try: + req = urllib2.Request(url) + result = urllib2.urlopen(req) + except: + self.logRecord("Connect %s Error, Please check it ~ " % host, 1) + self.uploadProgress("network", 1) + return False + if sys.version > '3': + ret = json.loads(str(result.read(), 'utf-8')) + else: + ret = json.loads(result.read()) + self.logRecord(ret["content"]) + + if ret["content"]["ip_source"] == "dhcp": + self.uploadProgress("network", 0) + self.logRecord("DHCP Mode", 0) + return True + + # 网络配置支持的OS-RELEASE + supportList = ["centos", "redhat", "sles", "tlinux", "openEuler"] + if os.path.exists("/etc/os-release"): + cmdSys = "cat /etc/os-release | grep -i '^ID=' | awk -F '=' '{print $2}'" + cmdVer = "cat /etc/os-release | grep -i '^VERSION=' | awk -F '=' '{print $2}'" + status, output = commands.getstatusoutput(cmdSys) + if status != 0: + self.logRecord("Not Support Set Network in Current OS: %s" %output, 1) + self.uploadProgress("network", 1) + return False + ID = output.replace("\"", "") + status, output = commands.getstatusoutput(cmdVer) + if status != 0: + self.logRecord("Not Support Set Network in Current OS: %s" %output, 1) + self.uploadProgress("network", 1) + return False + VERSION = output.replace("\"", "") + elif os.path.exists("/etc/redhat-release"): + ID = "centos" + VERSION = "6" + else: + self.logRecord("Not Support Set Network in Current OS: %s" %output, 1) + self.uploadProgress("network", 1) + return False + + if ID not in supportList: + self.logRecord("Not Support Set Network in Current OS: %s" %ID, 1) + self.uploadProgress("network", 1) + return False + + if ID == "sles": + netPath = "/etc/sysconfig/network" + else: + netPath = "/etc/sysconfig/network-scripts" + self.removeOldCfg(ID) + + netDict = {} + netDict["bonding"] = ret['content']['bonding_required'] + netDict["ip_source"] = ret['content']["ip_source"] + items = ret['content']['items'] + for info in items: + netDict["scope"] = info["scope"] + netDict["version"] = info["version"] + if netDict["bonding"] == "no": + if info["scope"] == "intranet": + netDict["name"] = "eth1" + elif info["scope"] == "extranet": + netDict["name"] = "eth0" + else: + self.logRecord("Not Support Current NetWork Mode [scope]: [%s]…… "%str(info["scope"]), 1) + self.uploadProgress("network", 1) + return False + elif netDict["bonding"] == "yes": + if info["scope"] == "intranet": + netDict["name"] = "bond1" + elif info["scope"] == "extranet": + netDict["name"] = "bond0" + else: + self.logRecord("Not Support Current NetWork Mode [scope]: [%s]…… "%str(info["scope"]), 1) + self.uploadProgress("network", 1) + return False + else: + self.logRecord("Not Support Current NetWork Mode [bonding]:[%s] …… "%str(netDict["bonding"]), 1) + self.uploadProgress("network", 1) + return False + netDict["ip"] = info['ip'] + netDict["netmask"] = info['netmask'] + # there maybe more than one gw ip split by comma + gateway_list = info['gateway'].split(",") + if len(gateway_list) > 1: + netDict["gateway"] = gateway_list[0] + else: + netDict["gateway"] = info['gateway'] + + self.logRecord(str(netDict)) + # set intranet ipv4 for sshd listen + if netDict["scope"] == "intranet" and netDict["version"] == "ipv4": + self.modifySSHDConfig(netDict["ip"]) + # network scripts config + if not self.setNetInfo(ID, **netDict): + self.logRecord("Setting Network Failed, Please Check it ~", 1) + self.uploadProgress("network", 1) + return False + + self.uploadProgress("network", 0) + self.remove70File() + return True + + def updateService(self): + ret = self.uploadProgress("service", 2) + return ret + + def updateComplete(self): + ret = self.uploadProgress("complete", 0) + status, output = commands.getstatusoutput("systemctl restart network") + if status != 0: + self.logRecord(output,1) + status, output = commands.getstatusoutput("service network restart") + if status != 0: + self.logRecord(output, 1) + self.logRecord(output) + self.logRecord(output) + return ret + + def mountData(self): + fail_count = 0 + # 查询设备的硬件配置参数(序列号、厂商、型号、设备类型、硬件备注) + url = '%s/devices/%s/settings/hardwareinfo' %(pathHead, self.sn) + self.logRecord(url, 0) + try: + req = urllib2.Request(url) + result = urllib2.urlopen(req) + except: + self.logRecord("Connect %s Error, Please check it ~ " % host, 1) + self.uploadProgress("mountdata", 2) + return False + if sys.version > '3': + ret = json.loads(str(result.read(), 'utf-8')) + else: + ret = json.loads(result.read()) + self.logRecord(ret["content"]) + + # 预定义块设备、挂载点、文件系统:sdb - sdak : /data1 - /data36 + mountPointList = [ + { + "blockDevice":"/dev/sdb", + "mountPoint":"/data1", + "fsType":"ext4", + "fsTab":"/dev/sdb /data1 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdc", + "mountPoint":"/data2", + "fsType":"ext4", + "fsTab":"/dev/sdc /data2 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdd", + "mountPoint":"/data3", + "fsType":"ext4", + "fsTab":"/dev/sdd /data3 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sde", + "mountPoint":"/data4", + "fsType":"ext4", + "fsTab":"/dev/sde /data4 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdf", + "mountPoint":"/data5", + "fsType":"ext4", + "fsTab":"/dev/sdf /data5 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdg", + "mountPoint":"/data6", + "fsType":"ext4", + "fsTab":"/dev/sdg /data6 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdh", + "mountPoint":"/data7", + "fsType":"ext4", + "fsTab":"/dev/sdh /data7 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdi", + "mountPoint":"/data8", + "fsType":"ext4", + "fsTab":"/dev/sdi /data8 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdj", + "mountPoint":"/data9", + "fsType":"ext4", + "fsTab":"/dev/sdj /data9 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdk", + "mountPoint":"/data10", + "fsType":"ext4", + "fsTab":"/dev/sdk /data10 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdl", + "mountPoint":"/data11", + "fsType":"ext4", + "fsTab":"/dev/sdl /data11 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdm", + "mountPoint":"/data12", + "fsType":"ext4", + "fsTab":"/dev/sdm /data12 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdn", + "mountPoint":"/data13", + "fsType":"ext4", + "fsTab":"/dev/sdn /data13 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdo", + "mountPoint":"/data14", + "fsType":"ext4", + "fsTab":"/dev/sdo /data14 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdp", + "mountPoint":"/data15", + "fsType":"ext4", + "fsTab":"/dev/sdp /data15 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdq", + "mountPoint":"/data16", + "fsType":"ext4", + "fsTab":"/dev/sdq /data16 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdr", + "mountPoint":"/data17", + "fsType":"ext4", + "fsTab":"/dev/sdr /data17 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sds", + "mountPoint":"/data18", + "fsType":"ext4", + "fsTab":"/dev/sds /data18 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdt", + "mountPoint":"/data19", + "fsType":"ext4", + "fsTab":"/dev/sdt /data19 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdu", + "mountPoint":"/data20", + "fsType":"ext4", + "fsTab":"/dev/sdu /data20 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdv", + "mountPoint":"/data21", + "fsType":"ext4", + "fsTab":"/dev/sdv /data21 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdw", + "mountPoint":"/data22", + "fsType":"ext4", + "fsTab":"/dev/sdw /data22 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdx", + "mountPoint":"/data23", + "fsType":"ext4", + "fsTab":"/dev/sdx /data23 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdy", + "mountPoint":"/data24", + "fsType":"ext4", + "fsTab":"/dev/sdy /data24 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdz", + "mountPoint":"/data25", + "fsType":"ext4", + "fsTab":"/dev/sdz /data25 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdaa", + "mountPoint":"/data26", + "fsType":"ext4", + "fsTab":"/dev/sdaa /data26 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdab", + "mountPoint":"/data27", + "fsType":"ext4", + "fsTab":"/dev/sdab /data27 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdac", + "mountPoint":"/data28", + "fsType":"ext4", + "fsTab":"/dev/sdac /data28 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdad", + "mountPoint":"/data29", + "fsType":"ext4", + "fsTab":"/dev/sdad /data29 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdae", + "mountPoint":"/data30", + "fsType":"ext4", + "fsTab":"/dev/sdae /data30 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdaf", + "mountPoint":"/data31", + "fsType":"ext4", + "fsTab":"/dev/sdaf /data31 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdag", + "mountPoint":"/data32", + "fsType":"ext4", + "fsTab":"/dev/sdag /data32 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdah", + "mountPoint":"/data33", + "fsType":"ext4", + "fsTab":"/dev/sdah /data33 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdai", + "mountPoint":"/data34", + "fsType":"ext4", + "fsTab":"/dev/sdai /data34 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdaj", + "mountPoint":"/data35", + "fsType":"ext4", + "fsTab":"/dev/sdaj /data35 ext4 noatime,acl,user_xattr,nofail 0 0" + }, + { + "blockDevice":"/dev/sdak", + "mountPoint":"/data36", + "fsType":"ext4", + "fsTab":"/dev/sdak /data36 ext4 noatime,acl,user_xattr,nofail 0 0" + } + ] + # 每一个块设备进行检查是否存在,存在则格式化并将挂载关系写入fstab + for each in mountPointList: + cmd_check = "if [ -b %s ];then echo 'exist';fi" % each["blockDevice"] + status, output = commands.getstatusoutput(cmd_check) + if status != 0: + self.logRecord(output, 1) + continue + elif output == "": + msg = "%s block device not exist." % each["blockDevice"] + self.logRecord(msg) + continue + elif output == "exist": + cmd_mkfs = "mkfs -F -t %s %s" % (each["fsType"], each["blockDevice"]) + status, output = commands.getstatusoutput(cmd_mkfs) + if status != 0: + self.logRecord(output, 1) + fail_count += 1 + continue + else: + msg = "CMD: %s " % cmd_mkfs + self.logRecord(msg) + self.logRecord(output) + + cmd_check = "grep %s /etc/fstab|wc -l" % each["blockDevice"] + status, output = commands.getstatusoutput(cmd_check) + if status != 0: + self.logRecord(output, 1) + continue + elif output == "0": + msg = "%s not in /etc/fstab. Add one." % each["blockDevice"] + self.logRecord(msg) + cmd_mkdir_addfstab = "umask 022;mkdir -p "+each["mountPoint"]+";echo '"+each["fsTab"]+"' >> /etc/fstab" + status, output = commands.getstatusoutput(cmd_mkdir_addfstab) + if status != 0: + self.logRecord(output, 1) + continue + else: + msg = "%s already in /etc/fstab. Do nothing." % each["blockDevice"] + self.logRecord(msg) + # 不存在格式化失败的硬盘则返回成功 + if fail_count != 0: + ret = self.uploadProgress("mountdata", 1) + return ret + else: + ret = self.uploadProgress("mountdata", 0) + return ret + +if __name__ == '__main__': + status, output = getSN() + if not status: + print "Get Device SN Error: %s" % output + sys.exit(1) + handler = SystemInfo(output) + handler.getDomainIP() + for info in sys.argv[1:]: + if "network" in info: + if info.split("=")[1].upper() == "Y": + handler.logRecord("Start Update Network ... ") + ret = handler.updateNetwork() + if ret is not False: + handler.logRecord("End Update Network ... ") + else: + handler.logRecord("Update Network ... ", 1) + elif "complete" in info: + if info.split("=")[1].upper() == "Y": + handler.logRecord("Start Update Service ... ") + ret = handler.updateComplete() + if ret is not False: + handler.logRecord("End Update Complete ... ") + else: + handler.logRecord("Update Complete ... ", 1) + elif "osuser" in info: + if info.split("=")[1].upper() == "Y": + handler.logRecord("Start Update OSUser ... ") + ret = handler.updateOSUser() + if ret is not False: + handler.logRecord("End Update OSUser ... ") + else: + handler.logRecord("Update OSUser ... ", 1) + elif "mountdata" in info: + if info.split("=")[1].upper() == "Y": + handler.logRecord("Start mount data ... ") + ret = handler.mountData() + if ret is not False: + handler.logRecord("End mount data ... ") + else: + handler.logRecord("mount data ... ", 1) \ No newline at end of file diff --git a/cyclone-server/doc/scripts/win_bond.ps1 b/cyclone-server/doc/scripts/win_bond.ps1 new file mode 100644 index 0000000000000000000000000000000000000000..668207a7fc53940207f299f58948eca14bc8e373 --- /dev/null +++ b/cyclone-server/doc/scripts/win_bond.ps1 @@ -0,0 +1,58 @@ +# 从默认路径获取网络配置信息 +$net_setting = @() +if (Test-Path "C:\firstboot\networkSetting.json") { + $net_setting = Get-Content "C:\firstboot\networkSetting.json" | Out-String | ConvertFrom-Json +} else { + exit 1 +} + +# 若配置文件有误则退出 +if ($net_setting.status -ne "success") { + exit 1 +} + +# get net adapter info {Name InterfaceDescription ifIndex Status MacAddress} +# eth0+eth1=bond1 -- 内网 +# eth2+eth3=bond0 -- 外网 +# 若只有2张网卡则只做bond1 +$bond1_list = @() +$bond0_list = @() +$net_adapters = Get-NetAdapter | Sort-Object -Property ifIndex +if ($net_adapters.length -eq 2) { + $bond1_list += $net_adapters[0].Name + $bond1_list += $net_adapters[1].Name + New-NetLbfoTeam -Name "Bond1" -TeamMembers ($bond1_list) -TeamingMode LACP -Confirm:$false + foreach ($each_one in $net_setting.content) { + if ($each_one.items.scope -eq "intranet") { + netsh interface ip set address "Bond1" static $each_one.items.ip $each_one.items.netmask $each_one.items.gateway + } + } +} +# 若有4张网卡则做bond1 bond0,同时添加默认路由到外网卡 +if ($net_adapters.length -eq 4) { + $bond1_list += $net_adapters[0].Name + $bond1_list += $net_adapters[1].Name + $bond0_list += $net_adapters[2].Name + $bond0_list += $net_adapters[3].Name + New-NetLbfoTeam -Name "Bond1" -TeamMembers ($bond1_list) -TeamingMode LACP -Confirm:$false + New-NetLbfoTeam -Name "Bond0" -TeamMembers ($bond0_list) -TeamingMode LACP -Confirm:$false + foreach ($each_one in $net_setting.content) { + if ($each_one.items.scope -eq "intranet") { + netsh interface ip set address "Bond1" static $each_one.items.ip $each_one.items.netmask $each_one.items.gateway + route add -p 9.0.0.0 mask 255.0.0.0 $each_one.items.gateway + route add -p 10.0.0.0 mask 255.0.0.0 $each_one.items.gateway + route add -p 100.64.0.0 mask 255.192.0.0 $each_one.items.gateway + } + if ($each_one.items.scope -eq "extranet") { + netsh interface ip set address "Bond0" static $each_one.items.ip $each_one.items.netmask $each_one.items.gateway + route delete -p 0.0.0.0 + route add -p 0.0.0.0 mask 0.0.0.0 $each_one.items.gateway + } + } +} + +# 添加防火墙规则,允许ping +$check_rule = Show-NetFirewallRule | findstr AllowPing +if ($check_rule.length -eq 0) { + New-NetFirewallRule -Name "AllowPing" -DisplayName "AllowPing" -Direction Inbound -Action allow -Protocol ICMPv4 +} \ No newline at end of file diff --git a/cyclone-server/gbb.json b/cyclone-server/gbb.json new file mode 100644 index 0000000000000000000000000000000000000000..b94efa607353554b6e53c83adabb99ae0121d670 --- /dev/null +++ b/cyclone-server/gbb.json @@ -0,0 +1,19 @@ +{ + "version": "0.6.0", + "tool": "go install -v -ldflags '-s -w'", + "importpath": "idcos.io/cloudboot/build", + "variables": [ + { + "variable": "Date", + "value": "{{.Date}}" + }, + { + "variable": "Commit", + "value": "{{.GitCommit}}" + }, + { + "variable": "Branch", + "value": "$(git symbolic-ref --short -q HEAD)" + } + ] +} diff --git a/cyclone-server/src/idcos.io/cloudboot/agent/agent.go b/cyclone-server/src/idcos.io/cloudboot/agent/agent.go new file mode 100644 index 0000000000000000000000000000000000000000..5fb1cc2f1e8095b4e4b8ece32cf4458443ec876b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/agent/agent.go @@ -0,0 +1,510 @@ +package agent + +import ( + "bytes" + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "net/http" + "os" + "regexp" + "strconv" + "strings" + "time" + + "github.com/astaxie/beego/httplib" + + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/server/cloudbootserver/service" + "idcos.io/cloudboot/server/cloudbootserver/types/device" + "idcos.io/cloudboot/utils/sh" +) + +// Agent agent data struct +type Agent struct { + Cmdline + log logger.Logger + collected *device.Device // 采集到的设备信息 + settings *service.DeviceSetting // 装机参数 + hwSrvBaseURL string +} + +// Cmdline /proc/cmdline文件信息映射结构体 +type Cmdline struct { + ServerAddr string + HWServerPort int + DevelopeMode string + LoopInterval int + PreInstallURL string + PostInstallURL string +} + +var ( + // 匹配proc/cmdline文件内信息的正则表达式 + srvAddrReg = regexp.MustCompile(`SERVER_ADDR=([^ ]+)`) + hwSrvPortReg = regexp.MustCompile(`HW_SERVER_PORT=([^ ]+)`) + intervalReg = regexp.MustCompile(`LOOP_INTERVAL=([^ ]+)`) + devReg = regexp.MustCompile(`DEVELOPER=([^ ]+)`) + preReg = regexp.MustCompile(`PRE=([^ ]+)`) + postReg = regexp.MustCompile(`POST=([^ ]+)`) +) + +const ( + defaultLoopInterval = 60 + defaultHWSrvPort = 8081 +) + +// LoadCmdline 读取/proc/cmdline文件并解析到结构体 +func LoadCmdline(log logger.Logger) (*Cmdline, error) { + output, err := sh.ExecOutputWithLog(log, "cat /proc/cmdline") + if err != nil { + return nil, err + } + var cLine Cmdline + var pair []string + + // 加载SERVER_ADDR: required + pair = srvAddrReg.FindStringSubmatch(string(output)) + if len(pair) != 2 { // k=v结构 + return nil, errors.New("'SERVER_ADDR' is missing") + } + cLine.ServerAddr = strings.TrimSpace(pair[1]) + + // 加载HW_SERVER_PORT: optional + if pair = hwSrvPortReg.FindStringSubmatch(string(output)); len(pair) == 2 { + if port, err := strconv.Atoi(strings.TrimSpace(pair[1])); err == nil && port > 0 { + cLine.HWServerPort = port + } + } else { + cLine.HWServerPort = defaultHWSrvPort + } + + // 加载LOOP_INTERVAL: optional + if pair = intervalReg.FindStringSubmatch(string(output)); len(pair) == 2 { + cLine.LoopInterval = parseInterval(strings.TrimSpace(pair[1]), defaultLoopInterval) + } else { + log.Warnf("%q is missing, use default value %d", "LOOP_INTERVAL", defaultLoopInterval) + cLine.LoopInterval = defaultLoopInterval + } + + // 加载DEVELOPER: optional + if pair = devReg.FindStringSubmatch(string(output)); len(pair) == 2 { + cLine.DevelopeMode = strings.TrimSpace(pair[1]) + } + + // 加载PRE: optional + if pair = preReg.FindStringSubmatch(string(output)); len(pair) == 2 { + cLine.PreInstallURL = strings.TrimSpace(pair[1]) + } + + // 加载POST: optional + if pair = postReg.FindStringSubmatch(string(output)); len(pair) == 2 { + cLine.PostInstallURL = strings.TrimSpace(pair[1]) + } + return &cLine, nil +} + +// New create agent +func New(log logger.Logger) (*Agent, error) { + cLine, err := LoadCmdline(log) + if err != nil { + return nil, err + } + log.Infof("%#v", cLine) + + return &Agent{ + log: log, + hwSrvBaseURL: fmt.Sprintf("http://localhost:%d/", cLine.HWServerPort), + Cmdline: *cLine, + }, nil +} + +var ( + // ErrSNNotFound 设备序列号信息未采集到 + ErrSNNotFound = errors.New("SN not found") +) + +// Run 运行Agent +func (agent *Agent) Run() (err error) { + agent.runPreInstall() + + if err = agent.runHWServer(); err != nil { + return err + } + + agent.waitHWServerOK() + + if err := agent.collect(); err != nil { + return err + } + + if agent.collected == nil || agent.collected.SN == "" { + agent.log.Error("Unable to collect SN") + return ErrSNNotFound + } + + agent.reportProgress(0.1, "进入BootOS", "已进入BootOS") + _ = agent.postDevice() + agent.reportProgress(0.2, "采集并上报设备信息", "完成") + + for { + // 1、 一直等待,直到设备允许进入安装队列 + agent.waitToEnterQueue() + agent.log.Debug("Enter installation queue") + + // 2、从服务端加载设备的装机参数 + if err = agent.loadDeviceSettings(); err != nil { + agent.reportProgress(-1, "无法从cloudboot-server获取设备装机配置参数信息", err.Error()) + continue + } + agent.reportProgress(0.25, "拉取设备操作系统安装配置", "完成") + + // 3、调用hw-server组件API进行硬件配置实施 + if err = agent.applyHardwareSettings(); err != nil { + agent.reportProgress(-1, "硬件配置失败", "硬件配置失败") + continue + } + + // _ = agent.enableIPMILan() + + agent.runPostInstall() + + // 4、安装并重启 + if agent.isByImage() && !agent.isByWindowsImage() { + // Linux镜像安装 + agent.reportProgress(0.55, "Linux镜像安装", "开始镜像安装") + if _, err = agent.installByLinuxImage(); err != nil { + agent.reportProgress(-1, "Linux镜像安装失败", err.Error()) + continue + } + + if err = agent.reboot(); err != nil { + agent.reportProgress(-1, "重启失败", err.Error()) + continue + } + break + + } else { + if agent.isCentOS6PXE() { + if err = agent.genPXE4CentOS6(); err != nil { + agent.reportProgress(-1, "生成CentOS6.x操作系统(UEFI)特制PXE文件", err.Error()) + continue + } + agent.reportProgress(0.5, "生成CentOS6.x操作系统(UEFI)特制PXE文件", "完成") + } + + time.Sleep(3 * time.Second) + + agent.reportProgress(0.55, "BootOS重启", "重启中...") + if err = agent.rebootFromPXE(); err != nil { + agent.reportProgress(-1, "重启失败", err.Error()) + continue + } + break + } + } + return nil +} + +// isCentOS6PXE 当前设备是否是通过PXE方式安装centos6 +func (agent *Agent) isCentOS6PXE() bool { + return agent.settings != nil && + agent.settings.InstallType == model.InstallationPXE && + agent.settings.OSTemplate != nil && + agent.settings.OSTemplate.BootMode == model.BootModeUEFI && + strings.Contains(strings.ToLower(agent.settings.OSTemplate.Name), "centos6") +} + +// genPXE4CentOS6 为安装centos6.x生成PXE文件 +func (agent *Agent) genPXE4CentOS6() (err error) { + url := fmt.Sprintf("%s/api/cloudboot/v1/devices/%s/centos6/uefi/pxe", agent.ServerAddr, agent.collected.SN) + reqData := map[string]string{ + "mac": agent.collected.BootOSMac, + } + var respData struct { + Status string + Message string + } + if err = agent.doPOSTUnmarshal(url, &reqData, &respData); err != nil { + return err + } + if strings.ToLower(respData.Status) != "success" { + return fmt.Errorf("Status: %s, Message: %s", respData.Status, respData.Message) + } + return nil +} + +// isByImage 是否是镜像安装方式安装OS +func (agent *Agent) isByImage() (yes bool) { + return agent.settings != nil && agent.settings.InstallType == model.InstallationImage +} + +// isByWindowsImage 是否是windows镜像安装方式安装OS +func (agent *Agent) isByWindowsImage() (yes bool) { + return agent.isByImage() && agent.settings.OSTemplate != nil && strings.HasPrefix(strings.ToLower(agent.settings.OSTemplate.Family), "win") +} + +// BootMode 引导模式 +type BootMode string + +var ( + // LegacyBIOS 传统的BIOS引导模式 + LegacyBIOS BootMode = "legacy_bios" + // UEFI UEFI引导模式 + UEFI BootMode = "uefi" +) + +// bootMode 返回系统引导模式 +func (agent *Agent) bootMode() (mode BootMode) { + info, err := os.Stat("/sys/firmware/efi") + if err == nil && info.IsDir() { + return UEFI + } + return LegacyBIOS +} + +// waitToEnterQueue 一直等待,直到进入安装队列。 +func (agent *Agent) waitToEnterQueue() { + t := time.NewTicker(time.Duration(agent.LoopInterval) * time.Second) // 轮询间隔时间 +LOOP: + for { + select { + case <-t.C: + if yes, err := agent.inQueue(agent.collected.SN); err == nil && yes { + t.Stop() + break LOOP + } + } + } +} + +// inQueue 判断设备是否在安装队列 +func (agent *Agent) inQueue(sn string) (yes bool, err error) { + var respData struct { + Status string `json:"status"` + Message string `json:"message"` + Content struct { + Result bool `json:"result"` + } `json:"content"` + } + url := fmt.Sprintf("%s/api/cloudboot/v1/devices/%s/is-in-install-list", agent.ServerAddr, sn) + resp, err := http.Get(url) + if err != nil { + return false, err + } + if err := json.NewDecoder(resp.Body).Decode(&respData); err != nil { + agent.log.Error(err) + return false, err + } + return respData.Content.Result, nil +} + +// loadDeviceSettings 从服务端加载当前设备的装机参数信息 +func (agent *Agent) loadDeviceSettings() (err error) { + agent.log.Infof("Start loading device settings") + if agent.collected == nil || agent.collected.SN == "" { + return ErrCollectDeviceInfoFirst + } + + url := fmt.Sprintf("%s/api/cloudboot/v1/devices/%s/settings", agent.ServerAddr, agent.collected.SN) + var respData struct { + Status string + Message string + Content service.DeviceSetting + } + if err = httplib.Get(url).ToJSON(&respData); err != nil { + agent.log.Error(err) + return err + } + agent.log.Debugf("%#v", respData) + + if strings.ToLower(respData.Status) != "success" { + agent.log.Errorf("GET %s, response status=%s, response message=%s", url, respData.Status, respData.Message) + return fmt.Errorf("response status=%s, response message=%s", respData.Status, respData.Message) + } + + agent.settings = &respData.Content + return nil +} + +// reportProgress 上报执行结果 +func (agent *Agent) reportProgress(installProgress float64, title, installLog string) bool { + var reqData struct { + InstallProgress float64 `json:"progress"` + InstallLog string `json:"log"` + Title string `json:"title"` + } + reqData.InstallProgress = installProgress + reqData.Title = title + reqData.InstallLog = base64.StdEncoding.EncodeToString([]byte(installLog)) // base64编码 + + var respData struct { + Status string `json:"status"` + Message string `json:"message"` + } + + url := fmt.Sprintf("%s/api/cloudboot/v1/devices/%s/installations/progress", agent.ServerAddr, agent.collected.SN) + if err := agent.doPOSTUnmarshal(url, &reqData, &respData); err != nil { + return false + } + //return strings.ToLower(respData.Status) == "success" + if strings.ToLower(respData.Status) == "success" { + return true + } + panic("report progress fail, respData.Status: " + respData.Status) +} + +const ( + pxeboot4uefi = "ipmitool chassis bootdev pxe options=efiboot; ipmitool chassis power cycle; sleep 5s; ipmitool power reset" + pxeboot4bios = "ipmitool chassis bootdev pxe; ipmitool chassis power cycle; sleep 5s; ipmitool power reset" +) + +// rebootFromPXE 从PXE重启系统 +func (agent *Agent) rebootFromPXE() error { + var cmds string + switch agent.bootMode() { + case UEFI: + cmds = pxeboot4uefi + case LegacyBIOS: + cmds = pxeboot4bios + } + + out0, err0 := sh.ExecOutputWithLog(agent.log, cmds) + if err0 == nil { + return nil + } + + // 进行重启的第二选择尝试 + cmds2th := `fdisk -lu | awk '/^Disk.*bytes/ { gsub(/:/, ""); system("dd if=/dev/zero of="$2" bs=512 count=1") }'; reboot -f` + out1, err1 := sh.ExecOutputWithLog(agent.log, cmds2th) + if err1 == nil { + return nil + } + return fmt.Errorf("%s==>\n%s\n%s\n%s==>\n%s\n%s", cmds, err0, string(out0), cmds2th, err1, string(out1)) +} + +// reboot 重启bootos +func (agent *Agent) reboot() error { + cmdArgs := "reboot" + if output, err := sh.ExecOutputWithLog(agent.log, cmdArgs); err != nil { + return fmt.Errorf("reboot error: \n#%s\n%v\n%s", cmdArgs, err, string(output)) + } + return nil +} + +// installByLinuxImage 调用命令进行Linux镜像安装 +func (agent *Agent) installByLinuxImage() (output []byte, err error) { + return sh.ExecOutputWithLog(agent.log, `/usr/local/bin/linuxinstall`) +} + +// doPOSTUnmarshal 将指定数据序列化成JSON并通过HTTP POST发送到远端,并将JSON格式的响应信息反序列化到respData中。 +// respData必须为非nil的指针类型,否则将返回对应的错误。 +func (agent *Agent) doPOSTUnmarshal(url string, reqData, respData interface{}) error { + respBody, err := agent.doPOST(url, reqData) + if err != nil { + return err + } + if err = json.Unmarshal(respBody, respData); err != nil { + agent.log.Error(err) + return err + } + return nil +} + +// doPOST 将指定数据序列化成JSON并通过HTTP POST发送到远端 +func (agent *Agent) doPOST(url string, reqData interface{}) ([]byte, error) { + reqBody, err := json.Marshal(reqData) + if err != nil { + agent.log.Error(err) + return nil, err + } + + agent.log.Debugf("POST %s, request body: %s", url, reqBody) + + req, err := http.NewRequest("POST", url, bytes.NewBuffer(reqBody)) + if err != nil { + agent.log.Error(err) + return nil, err + } + req.Header.Add("Content-Type", "application/json") + + resp, err := http.DefaultClient.Do(req) + if err != nil { + agent.log.Error(err) + return nil, err + } + defer resp.Body.Close() + + respBody, _ := ioutil.ReadAll(resp.Body) + agent.log.Debugf("POST %s, response body: %s", url, respBody) + + if resp.StatusCode != http.StatusOK { + agent.log.Errorf("POST %s, response status code: %d", url, resp.StatusCode) + return nil, fmt.Errorf("http status code: %d", resp.StatusCode) + } + return respBody, nil +} + +// wgetO 模拟'wget -X GET -O',请求一个HTTP URL并将响应信息以文件形式保存。 +func (agent *Agent) wgetO(url, dstFilename string, perm os.FileMode) (err error) { + // 规避风险: 不可信Url作为输入提供给HTTP请求 + domainCheck := "osinstall.idcos.com" + if !strings.HasSuffix(url, domainCheck) { + return fmt.Errorf("URL %s 不满足域名 %s\n", url, domainCheck) + } + resp, err := http.Get(url) + if err != nil { + agent.log.Error(err) + return err + } + defer resp.Body.Close() + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + agent.log.Error(err) + return err + } + if err = ioutil.WriteFile(dstFilename, body, perm); err != nil { + agent.log.Error(err) + return err + } + return nil +} + +func parseInterval(interval string, defValue int) int { + i, err := strconv.Atoi(strings.TrimSpace(interval)) + if err != nil || i <= 0 { + return defValue + } + return i +} + +// InstallationStatus 设备操作系统安装状态 +type InstallationStatus struct { + Type string `json:"type"` + Status string `json:"status"` + Progress float64 `json:"progress"` +} + +// getInstallationStatus 查询设备装机状态 +func (agent *Agent) getInstallationStatus() (status *InstallationStatus, err error) { + var respData struct { + Status string `json:"status"` + Message string `json:"message"` + Content InstallationStatus `json:"content"` + } + + url := fmt.Sprintf("%s/api/cloudboot/v1/devices/%s/installations/status", agent.ServerAddr, agent.collected.SN) + if err = httplib.Get(url).ToJSON(&respData); err != nil { + agent.log.Error(err) + return nil, err + } + + if respData.Status != "success" { + return nil, fmt.Errorf("unexpected response value(status=%s, message=%s)", respData.Status, respData.Message) + } + return &respData.Content, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/agent/collection.go b/cyclone-server/src/idcos.io/cloudboot/agent/collection.go new file mode 100644 index 0000000000000000000000000000000000000000..622c124ef36c2f094db8e79601c46c72dac04001 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/agent/collection.go @@ -0,0 +1,52 @@ +package agent + +import ( + "errors" + "fmt" + "strings" + + "github.com/astaxie/beego/httplib" + "idcos.io/cloudboot/server/cloudbootserver/types/device" +) + +var ( + // ErrCollectDeviceInfoFirst 请先采集设备信息 + ErrCollectDeviceInfoFirst = errors.New("please collect the device information first") +) + +// postDevice 上报设备信息 +func (agent *Agent) postDevice() (err error) { + url := fmt.Sprintf("%s/api/cloudboot/v1/devices/collections?lang=en-US", agent.ServerAddr) + var respData struct { + Status string + Message string + } + if err = agent.doPOSTUnmarshal(url, agent.collected, &respData); err != nil { + return err + } + if strings.ToLower(respData.Status) != "success" { + return fmt.Errorf("status: %s, message: %s", respData.Status, respData.Message) + } + return nil +} + +// collect 调用hw-server的API完成设备信息采集 +func (agent *Agent) collect() (err error) { + url := fmt.Sprintf("%s/api/cloudboot/hw/v1/devices/collections?lang=en-US", strings.TrimSuffix(agent.hwSrvBaseURL, "/")) + + var respData struct { + Status string `json:"status"` + Message string `json:"message"` + Content device.Device `json:"content"` + } + if err = httplib.Get(url).Header("Accept", "application/json").ToJSON(&respData); err != nil { + agent.log.Errorf("GET %s ==>\n%s", url, err.Error()) + return err + } + if respData.Status != "success" { + return errors.New(respData.Message) + } + agent.collected = &respData.Content + agent.collected.Setup() + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/agent/hardware.go b/cyclone-server/src/idcos.io/cloudboot/agent/hardware.go new file mode 100644 index 0000000000000000000000000000000000000000..65167e6c8ea964f9983ee492128f818d88cb61b6 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/agent/hardware.go @@ -0,0 +1,109 @@ +package agent + +import ( + "errors" + "fmt" + "io/ioutil" + "net/http" + "os" + "os/exec" + "strconv" + "strings" + "time" + + "github.com/astaxie/beego/httplib" +) + +const hwServerPath = "/usr/bin/hw-server" + +// arch 返回当前 +func (agent *Agent) arch() string { + out, _ := exec.Command("uname", "-m").Output() + return strings.TrimSpace(string(out)) +} + +// runHWServer 从远端下载hw-server并启动该服务 +func (agent *Agent) runHWServer() (err error) { + url := fmt.Sprintf("%s/hw-tools/%s/hw-server", agent.Cmdline.ServerAddr, agent.arch()) + if err = agent.dumpHWServer(url, hwServerPath); err != nil { + return err + } + _ = os.Chmod(hwServerPath, 0755) + + cmdArgs := []string{ + hwServerPath, + "--base-URL", agent.Cmdline.ServerAddr, + "--port", strconv.Itoa(agent.Cmdline.HWServerPort), + } + agent.log.Debugf("Run hw-server: %s", strings.Join(cmdArgs, " ")) + return exec.Command(cmdArgs[0], cmdArgs[1:]...).Start() +} + +// dumpHWServer 从远端下载hw-server组件并将其转储到指定位置 +func (agent *Agent) dumpHWServer(url string, dstFilename string) (err error) { + agent.log.Debugf("Start dumping hw-server from %s to %s", url, dstFilename) + if err = httplib.Get(url).ToFile(dstFilename); err != nil { + agent.log.Errorf("Dumping hw-server error: %s", err) + return err + } + return nil +} + +// waitHWServerOK 阻塞直到hw-server组件处于ready状态。 +func (agent *Agent) waitHWServerOK() { + t := time.NewTicker(time.Second) +LOOP: + for { + select { + case <-t.C: + if agent.hwServerOK() { + t.Stop() + break LOOP + } + } + } + agent.log.Infof("hw-server is ready") +} + +// hwServerOK 请求hw-serverAPI以确定该服务是否处于ready状态。 +func (agent *Agent) hwServerOK() bool { + url := fmt.Sprintf("%s/api/cloudboot/hw/v1/ping", strings.TrimSuffix(agent.hwSrvBaseURL, "/")) + agent.log.Debugf("GET %s", url) + + resp, err := http.Get(url) + if err != nil { + return false + } + defer resp.Body.Close() + + body, _ := ioutil.ReadAll(resp.Body) + return resp.StatusCode == http.StatusOK && string(body) == "pong" +} + +// applyHardwareSettings 调用hw-server组件API进行硬件配置实施 +func (agent *Agent) applyHardwareSettings() (err error) { + if agent.collected == nil || agent.collected.SN == "" { + return ErrCollectDeviceInfoFirst + } + + agent.log.Infof("Start applying hardware settings") + + var respData struct { + Status string `json:"status"` + Message string `json:"message"` + } + + url := fmt.Sprintf("%s/api/cloudboot/hw/v1/devices/%s/settings/applyings?lang=en-US", strings.TrimSuffix(agent.hwSrvBaseURL, "/"), agent.collected.SN) + agent.log.Debugf("POST %s", url) + + if err = httplib.Post(url).Header("Accept", "application/json").SetTimeout(time.Minute, time.Minute*60).ToJSON(&respData); err != nil { // TODO 依旧存在超时风险 + agent.log.Errorf("POST %s error: %s", url, err) + return err + } + + if respData.Status != "success" { + agent.log.Errorf("POST %s, response error: %s", url, respData.Message) + return errors.New(respData.Message) + } + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/agent/hook.go b/cyclone-server/src/idcos.io/cloudboot/agent/hook.go new file mode 100644 index 0000000000000000000000000000000000000000..fe9c3a295ffd82d8d92fcd0ab1e9e8354c019126 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/agent/hook.go @@ -0,0 +1,52 @@ +package agent + +import "os/exec" + +const ( + preInstallScript = "/tmp/preInstall.cmd" + postInstallScript = "/tmp/postInstall.cmd" +) + +//runPreInstall run pre install script +func (agent *Agent) runPreInstall() { + if agent.PreInstallURL == "" { + agent.log.Info("Skip the preinstall script") + return + } + + agent.log.Debugf("Start fetching(%s) preinstall script", agent.PreInstallURL) + if err := agent.wgetO(agent.PreInstallURL, preInstallScript, 0755); err != nil { + return + } + + agent.log.Debug("Start running pre-install script") + cmd := exec.Command(preInstallScript) // 不能使用bash执行文件方式,因为目标脚本可能并不是shell。 + output, err := cmd.Output() + if err != nil { + agent.log.Errorf("Exec %q err: %s\noutput:\n%s", preInstallScript, err, output) + return + } + agent.log.Infof("%s ==>\n%s", preInstallScript, output) +} + +//runPostInstall run post install script +func (agent *Agent) runPostInstall() { + if agent.PostInstallURL == "" { + agent.log.Info("Skip the postinstall script") + return + } + + agent.log.Debugf("Start fetching(%s) postinstall script", agent.PostInstallURL) + if err := agent.wgetO(agent.PostInstallURL, postInstallScript, 0755); err != nil { + return + } + + agent.log.Debug("Start running post-install script") + cmd := exec.Command(postInstallScript) // 不能使用bash执行文件方式,因为目标脚本可能并不是shell。 + output, err := cmd.Output() + if err != nil { + agent.log.Errorf("Exec %q err: %s\noutput:\n%s", postInstallScript, err, output) + return + } + agent.log.Infof("%s ==>\n%s", postInstallScript, output) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/build/build.go b/cyclone-server/src/idcos.io/cloudboot/build/build.go new file mode 100644 index 0000000000000000000000000000000000000000..4dd7dec0f30b31625a29bab44f5c49a49c4935a0 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/build/build.go @@ -0,0 +1,43 @@ +package build + +import ( + "strings" +) + +const ( + // VersionNumber 版本号 + VersionNumber = "1.5.5" +) + +// The value of variables come from `gb build -ldflags '-X "build.Date=xxxxx" -X "build.CommitID=xxxx"' ` +var ( + // Date build time + Date string + // Branch current git branch + Branch string + // Commit git commit id + Commit string +) + +// Version 生成版本信息 +func Version() string { + var buf strings.Builder + buf.WriteString(VersionNumber) + + if Date != "" { + buf.WriteByte('\n') + buf.WriteString("date: ") + buf.WriteString(Date) + } + if Branch != "" { + buf.WriteByte('\n') + buf.WriteString("branch: ") + buf.WriteString(Branch) + } + if Commit != "" { + buf.WriteByte('\n') + buf.WriteString("commit: ") + buf.WriteString(Commit) + } + return buf.String() +} diff --git a/cyclone-server/src/idcos.io/cloudboot/cmd/cloudboot-agent/main.go b/cyclone-server/src/idcos.io/cloudboot/cmd/cloudboot-agent/main.go new file mode 100644 index 0000000000000000000000000000000000000000..85667d76b822a2f6a5a6ad4294573b7e681220c9 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/cmd/cloudboot-agent/main.go @@ -0,0 +1,80 @@ +package main + +import ( + "fmt" + "os" + "os/exec" + "os/signal" + "path/filepath" + "syscall" + + "github.com/urfave/cli" + + "idcos.io/cloudboot/agent" + "idcos.io/cloudboot/build" + "idcos.io/cloudboot/config" + "idcos.io/cloudboot/logger" +) + +func main() { + app := cli.NewApp() + app.Name = "cloudboot-agent" + app.Description = "cloudboot agent" + app.Version = build.Version() + app.Flags = []cli.Flag{ + cli.StringFlag{ + Name: "log-level", + Usage: "log level, optional values: debug|info|warn|error", + Value: "debug", + }, + cli.StringFlag{ + Name: "log-dir", + Value: "/var/log/cloudboot", + Usage: "log file directory", + }, + } + + app.Action = func(c *cli.Context) error { + return runAgent(c) + } + + // TODO 以下实现待优化 + //catch signal, then do sth like recycle resources, kill child process, etc. + sigs := make(chan os.Signal, 1) + done := make(chan bool, 1) + signal.Notify(sigs, os.Kill, syscall.SIGINT, syscall.SIGTERM) + go func() { + sig := <-sigs + fmt.Println(sig) + done <- true + }() + go func() { + app.Run(os.Args) + done <- true + }() + + <-done + _ = doBeforeExit() +} + +func runAgent(ctx *cli.Context) error { + log := logger.NewBeeLogger(&config.Logger{ + Level: ctx.String("log-level"), + LogFile: filepath.Join(ctx.String("log-dir"), "agent.log"), + ConsoleEnabled: false, + }) + + agent, err := agent.New(log) + if err != nil { + return cli.NewExitError(err, 1) + } + + if err = agent.Run(); err != nil { + return cli.NewExitError(err, 1) + } + return nil +} + +func doBeforeExit() error { + return exec.Command("pkill", "hw-server").Run() +} diff --git a/cyclone-server/src/idcos.io/cloudboot/cmd/gen-dhcp-conf/get_pxe_pool.go b/cyclone-server/src/idcos.io/cloudboot/cmd/gen-dhcp-conf/get_pxe_pool.go new file mode 100644 index 0000000000000000000000000000000000000000..0bb6bbbbaf2665257a4a00dff7b2e79b5ba26236 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/cmd/gen-dhcp-conf/get_pxe_pool.go @@ -0,0 +1,170 @@ +package main + +import ( + "strconv" + //"bytes" + "encoding/json" + "fmt" + "io/ioutil" + "log" + "net/http" + //"net/url" + "os" + "strings" +) + +//IDCOrServerRoom 网段分页查询专用 +type IDCOrServerRoom struct { + //索引 + ID int `json:"id"` + //名称 + Name string `json:"name"` +} + +//SwitchDetail 交换机详情 +type SwitchDetail struct { + // 资产编号 + FixedAssetNumber string `json:"fixed_asset_number"` + // 名称 + Name string `json:"name"` +} + +// IPNetworkPage 网段 +type IPNetworkPage struct { + //数据中心 + IDC IDCOrServerRoom `json:"idc"` + //机房 + ServerRoom IDCOrServerRoom `json:"server_room"` + //网段ID + ID int `json:"id"` + //CIDR网段 + CIDR string `json:"cidr"` + //网段类别(ilo-服务器ILO; tgw_intranet-服务器TGW内网; tgw_extranet-服务器TGW外网; intranet-服务器普通内网; extranet-服务器普通外网; v_intranet-服务器虚拟化内网;) + Category string `json:"category"` + //掩码 + Netmask string `json:"netmask"` + //网关 + Gateway string `json:"gateway"` + //业务IP资源池 + IPPool string `json:"ip_pool"` + //带外IP资源池 + PXEPool string `json:"pxe_pool"` + //交换机设备 + Switchs []SwitchDetail `json:"switchs"` + //vlan + Vlan string `json:"vlan"` + // ipv4 ipv6 + Version string `json:"version"` +} + +// Content 请求网段信息返回内容结构 +type Content struct { + Page int `json:"page"` + PageSize int `json:"page_size"` + Records []IPNetworkPage `json:"records"` + TotalPages int `json:"total_pages"` + TotalRecords int `json:"total_records"` +} + +// IPNetworkResp 请求网段信息返回信息结构 +type IPNetworkResp struct { + Status string `json:"status"` + Message string `json:"message"` + Content Content `json:"content"` +} + +// GetIPNetworkPageReq 查询网段分页请求结构体 +type GetIPNetworkPageReq struct { + //机房 + ServerRoomName string `json:"server_room_name"` + //CIDR网段名称 + CIDR string `json:"cidr"` + Switches string `json:"switches"` + //网段类别。可选值: ilo-服务器ILO; tgw_intranet-服务器TGW内网; tgw_extranet-服务器TGW外网; intranet-服务器普通内网; extranet-服务器普通外网; v_intranet-服务器虚拟化内网; + Category string `json:"category"` + //分页页号 + Page int64 `json:"page"` + //分页大小 + PageSize int64 `json:"page_size"` +} + +var ( + token = "" +) + +func getEnv() string { + dhcpToken := strings.TrimSpace(os.Getenv("DHCP_TOKEN")) + if dhcpToken != "" { + token = dhcpToken + } + return token +} + +// GetIPNetworks 返回满足过滤条件的网段 +func GetIPNetworks(srname, cidr, switches, category, port, ip string) (items []IPNetworkPage, err error) { + //if !checkCategory(category) { + // return nil, nil + //} + var data []byte + var ipnr IPNetworkResp + url := fmt.Sprintf("http://%s:%s/api/cloudboot/v1/ip-networks", ip, port) + if data, err = DoGet(url, &GetIPNetworkPageReq{ + Category: category, + ServerRoomName: srname, + CIDR: cidr, + Switches: switches, + Page: 1, + PageSize: 1000, + }); err == nil { + err = json.Unmarshal(data, &ipnr) + if err != nil { + log.Printf("JSON解析请求数据出错: %s\n", err.Error()) + } + } else { + log.Printf("获取网段信息出错: %s\n", err.Error()) + } + + return ipnr.Content.Records, nil +} + +// DoGet 发送get请求 +func DoGet(myurl string, reqData *GetIPNetworkPageReq) ([]byte, error) { + log.Printf("GET %s, reqData: %v", myurl, reqData) + req, err := http.NewRequest("GET", myurl, nil) + if err != nil { + return nil, err + } + // 拼接参数 + q := req.URL.Query() + q.Add("page",strconv.FormatInt(reqData.Page,10)) + q.Add("page_size",strconv.FormatInt(reqData.PageSize,10)) + if reqData.ServerRoomName != "" { + q.Add("server_room_name", reqData.ServerRoomName) + } + if reqData.CIDR != "" { + q.Add("cidr", reqData.CIDR) + } + if reqData.Switches != "" { + q.Add("switches", reqData.Switches) + } + q.Add("category", reqData.Category) + req.URL.RawQuery = q.Encode() + log.Printf("GET %s, raw quey: %s", myurl, req.URL.RawQuery) + req.Header.Add("Content-Type", "application/json") + req.Header.Add("Authorization", getEnv()) + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + respBody, _ := ioutil.ReadAll(resp.Body) + log.Printf("GET %s, response body: %s", myurl, respBody) + + if resp.StatusCode != http.StatusOK { + log.Printf("GET %s, response status code: %d", myurl, resp.StatusCode) + return nil, fmt.Errorf("http status code: %d", resp.StatusCode) + } + return respBody, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/cmd/gen-dhcp-conf/main.go b/cyclone-server/src/idcos.io/cloudboot/cmd/gen-dhcp-conf/main.go new file mode 100644 index 0000000000000000000000000000000000000000..16acf11bd459ba9372f41541f178e16d4925248a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/cmd/gen-dhcp-conf/main.go @@ -0,0 +1,469 @@ +package main + +import ( + "errors" + "fmt" + "io/ioutil" + "log" + "os" + "strconv" + "strings" + "time" + + _ "github.com/go-sql-driver/mysql" + "github.com/urfave/cli" + + "idcos.io/cloudboot/build" + nw "idcos.io/cloudboot/utils/network" +) + +var ( + name = "gen-dhcp-conf" + usage = "for server pxe,bmc,ilo. you should export DHCP_TOKEN as os env before running." + toFile = "" + port = "8083" + dhcpFile = "/etc/dhcp/dhcpd.conf" + category = "ilo,intranet,tgw_intranet" + server_room_name = "" + cidr = "" + switches = "" + ip = "localhost" +) + +func main() { + app := cli.NewApp() + app.Name = name + app.Usage = usage + app.Version = build.Version() + + app.Flags = []cli.Flag{ + cli.StringFlag{ + Name: "t, to", + Value: toFile, + Usage: "生成的文件放到哪里 (default: 输出到控制台)", + }, + cli.StringFlag{ + Name: "c, category", + Value: category, + Usage: "指定具体网段类别", + }, + cli.StringFlag{ + Name: "srn, server-room-name", + Value: server_room_name, + Usage: "指定机房管理单元涉及的网段", + }, + cli.StringFlag{ + Name: "ci, cidr", + Value: server_room_name, + Usage: "指定网段名称(如:192.168.0.1/26)", + }, + cli.StringFlag{ + Name: "sw, switches", + Value: server_room_name, + Usage: "指定交换机固资编号", + }, + cli.StringFlag{ + Name: "p, port", + Value: port, + Usage: "cloudboot-server 端口号", + }, + cli.StringFlag{ + Name: "i, ip", + Value: ip, + Usage: "cloudboot-server IP地址", + }, + cli.StringFlag{ + Name: "d, dhcp", + Value: dhcpFile, + Usage: "dhcp配置文件路径", + }, + } + app.Action = func(ctx *cli.Context) error { + toFile = ctx.String("t") + category = ctx.String("c") + server_room_name = ctx.String("srn") + cidr = ctx.String("ci") + switches = ctx.String("sw") + port = ctx.String("p") + ip = ctx.String("i") + dhcpFile = ctx.String("d") + + if !checkAvailable(category, dhcpFile) { + return errors.New("") + } + + conf := GenConf(ip, port, toFile, category, server_room_name, cidr, switches) + return Main(conf) + } + + app.Run(os.Args) +} + +var ( + // DhcpConf dhcp ip配置 + DhcpConfILO = `subnet %s netmask %s { + option routers %s; + default-lease-time 7200; + max-lease-time 7200; + pool { + failover peer "failover-dhcp"; + range %s %s; + } +}` + DhcpConfPXE = `subnet %s netmask %s { + option routers %s; + default-lease-time 600; + max-lease-time 600; + pool { + failover peer "failover-dhcp"; + range %s %s; + } +}` +) + +//PxeRange PxeRange +type PxeRange struct { + Start string + End string +} + +// ipToUint ip4 +func ipToUint(ip string) (int, error) { + list := strings.Split(ip, ".") + min1, err := strconv.Atoi(list[0]) + if err != nil { + return 1, err + } + min2, err := strconv.Atoi(list[1]) + if err != nil { + return 1, err + } + min3, err := strconv.Atoi(list[2]) + if err != nil { + return 1, err + } + min4, err := strconv.Atoi(list[3]) + if err != nil { + return 1, err + } + + return min1*256*256*256 + min2*256*256 + min3*256 + min4, nil +} + +func uintToIP(ipu int) string { + ipu1 := ipu / (256 * 256 * 256) + ipum := ipu % (256 * 256 * 256) + ipu2 := ipum / (256 * 256) + ipum = ipum % (256 * 256) + ipu3 := ipum / 256 + ipu4 := ipum % 256 + + return fmt.Sprintf("%d.%d.%d.%d", ipu1, ipu2, ipu3, ipu4) +} + +func checkIntersection(pxeF, pxeS string) (string, bool) { + var start, end int + intersection := false + pxeFS := strings.Split(pxeF, ",") + if len(pxeFS) < 2 { + return "", intersection + } + pxeSS := strings.Split(pxeS, ",") + if len(pxeSS) < 2 { + return "", intersection + } + pxeFSS, _ := ipToUint(pxeFS[0]) + pxeFSE, _ := ipToUint(pxeFS[1]) + pxeSSS, _ := ipToUint(pxeSS[0]) + pxeSSE, _ := ipToUint(pxeSS[1]) + + start = pxeSSS + if pxeFSS <= pxeSSS { + intersection = true + start = pxeFSS + } + + end = pxeSSE + if pxeSSE <= pxeFSE { + intersection = true + end = pxeFSE + } + return uintToIP(start) + "," + uintToIP(end), intersection +} + +func checkRepeat(items []IPNetworkPage) map[string]string { + // 筛查pxe池和CIDR完全一样的 + cidrPxeRange := make(map[string]bool, 1) + for k := range items { + if !cidrPxeRange[items[k].CIDR+":"+items[k].PXEPool] { + cidrPxeRange[items[k].CIDR+":"+items[k].PXEPool] = true + } + } + + // 对于有交集的pxe池合并 + var netmask, min, key string + cidrMapPxeRange := make(map[string]string, 1) + for k := range cidrPxeRange { + cprSplit := strings.Split(k, ":") + if len(cprSplit) < 2 { + continue + } + netmask, _, min, _ = nw.GetCidrIPRouteAndSubNet(cprSplit[0]) + key = netmask + ":" + min + if cidrMapPxeRange[key] != "" { + result, intersection := checkIntersection(cidrMapPxeRange[key], cprSplit[1]) + if intersection { + cidrMapPxeRange[key] = result + } else { + cidrMapPxeRange[key] = cprSplit[1] + } + } else { + cidrMapPxeRange[key] = cprSplit[1] + } + } + return cidrMapPxeRange +} + + +// Main 入口函数 +func Main(conf *Config) error { + var dhcpConf []string + + // 获取网段分页数据 + items, err := GetIPNetworks(conf.DHCP.ServerRoomName, conf.DHCP.CIDR, conf.DHCP.Switches, conf.DHCP.Category, conf.Repo.Port,conf.Repo.IP) + if err != nil || items == nil { + log.Println(err) + return err + } + + for k, _ := range items { + //仅处理ipv4 + if items[k].Version != "ipv4" { + continue + } + //仅处理 服务器普通内网、服务器ILO + switch items[k].Category { + case "intranet": + if items[k].PXEPool != "" { + pxe := strings.Split(items[k].PXEPool, ",") + if len(pxe) < 2 { + continue + } + netmask, _, min, _ := nw.GetCidrIPRouteAndSubNet(items[k].CIDR) + dhcpConf = append(dhcpConf, fmt.Sprintf(DhcpConfPXE, min, netmask, items[k].Gateway, pxe[0], pxe[1])) + } + + case "ilo": + if items[k].IPPool != "" { + ilo := strings.Split(items[k].IPPool, ",") + if len(ilo) < 2 { + continue + } + netmask, _, min, _ := nw.GetCidrIPRouteAndSubNet(items[k].CIDR) + dhcpConf = append(dhcpConf, fmt.Sprintf(DhcpConfILO, min, netmask, items[k].Gateway, ilo[0], ilo[1])) + } + case "tgw_intranet": + if items[k].PXEPool != "" { + pxe := strings.Split(items[k].PXEPool, ",") + if len(pxe) < 2 { + continue + } + netmask, _, min, _ := nw.GetCidrIPRouteAndSubNet(items[k].CIDR) + dhcpConf = append(dhcpConf, fmt.Sprintf(DhcpConfPXE, min, netmask, items[k].Gateway, pxe[0], pxe[1])) + } + } + } + //cpr := checkRepeat(items) + // 生成dhcp子网配置 + //for k, v := range cpr { + // cprSplit := strings.Split(k, ":") + // if len(cprSplit) < 1 { + // continue + // } + // pxe := strings.Split(v, ",") + // if len(pxe) < 2 { + // continue + // } + // if == "ilo" { + // dhcpConf = append(dhcpConf, fmt.Sprintf(DhcpConfILO, cprSplit[1], cprSplit[0], pxe[0], pxe[0], pxe[1])) + // } + //} + // 如果数据库中没有pxe配置,直接跳过 + if len(dhcpConf) < 1 { + return nil + } + subnet := strings.Join(dhcpConf, "\n") + + // 读取dhcp配置文件头部内容并拼接 + //if !Exist(conf.DHCP.Path) { + // fmt.Printf("文件%s不存在\n", conf.DHCP.Path) + // return nil + //} + //content, err := ReadFile(conf.DHCP.Path, conf.DHCP.Copy) + //if err != nil { + // log.Println(err) + // return err + //} + //index := strings.Index(content, "subnet") + //content = content[:index] + //content = content + subnet + + // 写入dhcp配置文件或者打印到控制台 + if conf.DHCP.To == "" || !Exist(conf.DHCP.To) { + fmt.Printf("%s\n", subnet) + return nil + } + err = WriteFile(conf.DHCP.To, subnet) + if err != nil { + log.Println(err) + return err + } + return nil +} + +//ReadFile 读取文件 +func ReadFile(path, copy string) (string, error) { + fi, err := os.Open(path) + if err != nil { + return "", err + } + defer fi.Close() + fd, err := ioutil.ReadAll(fi) + if err != nil { + return "", err + } + content := string(fd) + err = GenerTempFile(copy, []byte(content)) + if err != nil { + return "", err + } + return content, nil +} + +//WriteFile 写文件 +func WriteFile(path, content string) error { + fi, err := os.Open(name) + if err != nil { + return err + } + defer fi.Close() + err = ioutil.WriteFile(path, []byte(content), 766) + return err +} + +//GenerTempFile 生成临时文件 +func GenerTempFile(copy string, content []byte) error { + exten := fmt.Sprintf("dhcp-%s-back", time.Now().Format("2006-01-02-15:04:05")) + tmpfile, err := ioutil.TempFile(copy, exten) + if err != nil { + return err + } + + if _, err := tmpfile.Write(content); err != nil { + return err + } + log.Printf("备份配置文件路径:%s\n", tmpfile.Name()) + err = tmpfile.Close() + return err +} + +//Exist 判断文件是否存在 +func Exist(filename string) bool { + _, err := os.Stat(filename) + return err == nil || os.IsExist(err) +} + +func checkCategory(category []string) bool { + if category == nil { + return true + } + var result string + for k := range category { + switch category[k] { + case "ilo": + case "tgw_intranet": + case "tgw_extranet": + case "intranet": + case "extranet": + case "v_intranet": + case "v_extranet": + default: + result = result + category[k] + "," + } + } + result = strings.TrimRight(result, ",") + if result != "" { + fmt.Printf("category(%s)必须为('ilo','tgw_intranet','tgw_extranet','intranet','extranet','v_intranet','v_extranet')\n", result) + return false + } + return true +} + +func checkAvailable(category, dhcpfile string) bool { + existError := true + if !Exist(dhcpfile) { + fmt.Printf("DHCP配置文件(%s)不存在\n", dhcpfile) + existError = false + } + + if !checkCategory(strings.Split(category, ",")) { + existError = false + } + return existError +} + +// Config config 数据结构体 +type Config struct { + Repo Repo + DHCP DHCP +} + +//Repo 数据库配置 +type Repo struct { + Token string + Port string + IP string +} + +//DHCP DHCP路径配置 +type DHCP struct { + Path string `json:"path"` + To string `json:"to"` + Copy string `json:"copy"` + Category string `json:"category"` + CIDR string `json:"cidr"` + Switches string `json:"switches"` + ServerRoomName string `json:"server_room_name"` +} + +// JSONLoader 从json 文件中加配置数据 +type JSONLoader struct { + path string +} + +// New 新建JSONLoader +func New(path string) *JSONLoader { + return &JSONLoader{path} +} + +// GenConf 构造配置 +func GenConf(ip, port, to, category, server_room_name, cidr, switches string) *Config { + + conf := Config{ + Repo: Repo{ + Token: token, + Port: port, + IP: ip, + }, + DHCP: DHCP{ + To: to, + Category: category, + ServerRoomName: server_room_name, + CIDR: cidr, + Switches: switches, + Path: dhcpFile, + }, + } + + return &conf +} diff --git a/cyclone-server/src/idcos.io/cloudboot/cmd/hwinfo/main.go b/cyclone-server/src/idcos.io/cloudboot/cmd/hwinfo/main.go new file mode 100644 index 0000000000000000000000000000000000000000..79dae1237581bafa1ccaa0ae5b61631c24d28e5b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/cmd/hwinfo/main.go @@ -0,0 +1,284 @@ +package main + +import ( + "bytes" + "strings" + "encoding/json" + "io/ioutil" + "net/http" + "fmt" + "os" + + "github.com/urfave/cli" + "idcos.io/cloudboot/hardware/collector" + "idcos.io/cloudboot/server/cloudbootserver/types/device" + "idcos.io/cloudboot/hardware/raid" + + _ "idcos.io/cloudboot/hardware/collector/bootos" + _ "idcos.io/cloudboot/hardware/oob/ipmi" + _ "idcos.io/cloudboot/hardware/raid/adaptecsmartraid" + _ "idcos.io/cloudboot/hardware/raid/avagomegaraid" + _ "idcos.io/cloudboot/hardware/raid/hpsmartarray" + _ "idcos.io/cloudboot/hardware/raid/lsimegaraid" + _ "idcos.io/cloudboot/hardware/raid/lsisas2" + _ "idcos.io/cloudboot/hardware/raid/lsisas3" +) + + +var ( + name = "hwinfo" + usage = "for testing hwinfo collect and post it." + postServer = "" + version = "1.1.0" // 2023-02-09 新增上报采集数据功能(可选) +) + + +func main() { + app := cli.NewApp() + app.Name = name + app.Usage = usage + app.Version = version + + app.Flags = []cli.Flag{ + cli.StringFlag{ + Name: "p, postserver", + Value: postServer, + Usage: "指定上报采集数据到服务端的IP (默认:仅测试采集不上报数据)", + }, + } + app.Action = func(ctx *cli.Context) error { + postServer = ctx.String("p") + return Main(postServer) + } + + app.Run(os.Args) +} + + +func Main(pServer string) error { + fmt.Println("===========本程序仅用于设备信息采集模块的自测及上报更新===========") + + c := collector.SelectCollector(collector.DefaultCollector) + if c == nil { + fmt.Fprintf(os.Stderr, "Unregistered collector: %s\n", collector.DefaultCollector) + return collector.ErrUnregisteredCollector + } + + var dev device.Device + + fmt.Printf("\n===========BASE===========\n") + isVM, sn, manufacturer, modelName, arch, err := c.BASE() + //_, dev.SN, dev.Vendor, dev.Model, dev.Arch, _ = c.BASE() + if err != nil { + fmt.Fprintf(os.Stderr, "Collect Base error: %s\n", err.Error()) + } + fmt.Println("isVM: ", isVM) + fmt.Println("SN: ", sn) + fmt.Println("Manufacturer: ", manufacturer) + fmt.Println("Model: ", modelName) + fmt.Println("Arch: ", arch) + dev.SN = sn + dev.Vendor = manufacturer + dev.Model = modelName + dev.Arch = arch + + fmt.Printf("\n===========CPU===========\n") + dev.CPU, err = c.CPU() + if err != nil { + fmt.Fprintf(os.Stderr, "Collect CPU error: %s\n", err.Error()) + } + _ = json.NewEncoder(os.Stdout).Encode(dev.CPU) + + fmt.Printf("\n===========Memory===========\n") + dev.Memory, err = c.Memory() + if err != nil { + fmt.Fprintf(os.Stderr, "Collect memory error: %s\n", err.Error()) + } + _ = json.NewEncoder(os.Stdout).Encode(dev.Memory) + + fmt.Printf("\n===========Motherboard===========\n") + dev.Motherboard, err = c.Motherboard() + if err != nil { + fmt.Fprintf(os.Stderr, "Collect motherboard error: %s\n", err.Error()) + } + _ = json.NewEncoder(os.Stdout).Encode(dev.Motherboard) + + fmt.Printf("\n===========Disk===========\n") + dev.Disk, err = c.Disk() + if err != nil { + fmt.Fprintf(os.Stderr, "Collect logical disk error: %s\n", err.Error()) + } + _ = json.NewEncoder(os.Stdout).Encode(dev.Disk) + + fmt.Printf("\n===========Disk Slot===========\n") + name, err := raid.Whoami() + if err != nil { + fmt.Fprintf(os.Stderr, "Get crontroller by lspci error: %s\n", err.Error()) + } + fmt.Println("Controller(lscpi): ", name) + worker := raid.SelectWorker(name) + if worker == nil { + fmt.Fprintf(os.Stderr, "Get worker of crontroller error: %s\n", err.Error()) + } else { + fmt.Println("Controller using cmdline: ", worker.GetCMDLine()) + } + dev.DiskSlot, err = c.DiskSlot() + if err != nil { + fmt.Fprintf(os.Stderr, "Collect disk slot error: %s\n", err.Error()) + } + _ = json.NewEncoder(os.Stdout).Encode(dev.DiskSlot) + + fmt.Printf("\n===========NIC===========\n") + dev.NIC, err = c.NIC() + if err != nil { + fmt.Fprintf(os.Stderr, "Collect nic error: %s\n", err.Error()) + } + _ = json.NewEncoder(os.Stdout).Encode(dev.NIC) + + fmt.Printf("\n===========OOB===========\n") + dev.OOB, err = c.OOB() + if err != nil { + fmt.Fprintf(os.Stderr, "Collect oob error: %s\n", err.Error()) + } + _ = json.NewEncoder(os.Stdout).Encode(dev.OOB) + + fmt.Printf("\n===========BIOS===========\n") + dev.BIOS, err = c.BIOS() + if err != nil { + fmt.Fprintf(os.Stderr, "Collect bios error: %s\n", err.Error()) + } + _ = json.NewEncoder(os.Stdout).Encode(dev.BIOS) + + fmt.Printf("\n===========LLDP===========\n") + fmt.Println("LLDP using cmdline: lldpctl -f json") + dev.LLDP, err = c.LLDP() + if err != nil { + fmt.Fprintf(os.Stderr, "Collect lldp error: %s\n", err.Error()) + } + _ = json.NewEncoder(os.Stdout).Encode(dev.LLDP) + + fmt.Printf("\n===========PCI===========\n") + dev.PCI, err = c.PCI() + if err != nil { + fmt.Fprintf(os.Stderr, "Collect pci error: %s\n", err.Error()) + } + _ = json.NewEncoder(os.Stdout).Encode(dev.PCI) + + fmt.Printf("\n===========Fan===========\n") + dev.Fan, err = c.Fan() + if err != nil { + fmt.Fprintf(os.Stderr, "Collect fan error: %s\n", err.Error()) + } + _ = json.NewEncoder(os.Stdout).Encode(dev.Fan) + + fmt.Printf("\n===========RAID===========\n") + dev.RAID, err = c.RAID() + if err != nil { + fmt.Fprintf(os.Stderr, "Collect raid error: %s\n", err.Error()) + } + _ = json.NewEncoder(os.Stdout).Encode(dev.RAID) + + fmt.Printf("\n===========Power===========\n") + dev.Power, err = c.Power() + if err != nil { + fmt.Fprintf(os.Stderr, "Collect power error: %s\n", err.Error()) + } + _ = json.NewEncoder(os.Stdout).Encode(dev.Power) + + fmt.Printf("\n===========iDRAC===========\n") + idrac, err := c.IDRAC() + if err != nil { + fmt.Fprintf(os.Stderr, "Collect idrac error: %s\n", err.Error()) + } + _ = json.NewEncoder(os.Stdout).Encode(idrac) + + fmt.Printf("\n===========iLO===========\n") + ilo, err := c.ILO() + if err != nil { + fmt.Fprintf(os.Stderr, "Collect ilo error: %s\n", err.Error()) + } + _ = json.NewEncoder(os.Stdout).Encode(ilo) + + fmt.Printf("\n===========HBA===========\n") + hba, err := c.HBA() + if err != nil { + fmt.Fprintf(os.Stderr, "Collect hba error: %s\n", err.Error()) + } + if hba != nil { + _ = json.NewEncoder(os.Stdout).Encode(hba) + dev.HBA = hba + } else { + fmt.Println("HBA not found.") + } + + fmt.Printf("\n===========PostCollectedData===========\n") + if pServer != "" { + dev.Setup() + url := fmt.Sprintf("http://%s/api/cloudboot/v1/devices/collections?lang=en-US", pServer) + fmt.Println("PostURL: ", url) + var respData struct { + Status string + Message string + } + if err = doPOSTUnmarshal(url, &dev, &respData); err != nil { + return err + } + if strings.ToLower(respData.Status) != "success" { + fmt.Printf("status: %s, message: %s", respData.Status, respData.Message) + return fmt.Errorf("status: %s, message: %s", respData.Status, respData.Message) + } + fmt.Printf("status: %s, message: %s", respData.Status, respData.Message) + return nil + } else { + fmt.Println("PostServer not specify.Do not post data.") + } + return nil +} + +// doPOSTUnmarshal 将指定数据序列化成JSON并通过HTTP POST发送到远端,并将JSON格式的响应信息反序列化到respData中。 +// respData必须为非nil的指针类型,否则将返回对应的错误。 +func doPOSTUnmarshal(url string, reqData, respData interface{}) error { + respBody, err := doPOST(url, reqData) + if err != nil { + return err + } + if err = json.Unmarshal(respBody, respData); err != nil { + fmt.Printf("json unmarshal error: %s", err.Error()) + return err + } + return nil +} + +// doPOST 将指定数据序列化成JSON并通过HTTP POST发送到远端 +func doPOST(url string, reqData interface{}) ([]byte, error) { + reqBody, err := json.Marshal(reqData) + if err != nil { + fmt.Printf("json marshal error: %s", err.Error()) + return nil, err + } + + fmt.Printf("POST %s, request body: %s", url, reqBody) + + req, err := http.NewRequest("POST", url, bytes.NewBuffer(reqBody)) + if err != nil { + fmt.Printf("json marshal error: %s", err.Error()) + return nil, err + } + req.Header.Add("Content-Type", "application/json") + + resp, err := http.DefaultClient.Do(req) + if err != nil { + fmt.Printf("json marshal error: %s", err.Error()) + return nil, err + } + defer resp.Body.Close() + + respBody, _ := ioutil.ReadAll(resp.Body) + fmt.Printf("POST %s, response body: %s", url, respBody) + + if resp.StatusCode != http.StatusOK { + fmt.Printf("POST %s, response status code: %d", url, resp.StatusCode) + return nil, fmt.Errorf("http status code: %d", resp.StatusCode) + } + return respBody, nil +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/cmd/peagent/main.go b/cyclone-server/src/idcos.io/cloudboot/cmd/peagent/main.go new file mode 100644 index 0000000000000000000000000000000000000000..b621fcb8d6e4790456614555b78ba3129a6476c7 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/cmd/peagent/main.go @@ -0,0 +1,206 @@ +package main + +import ( + "errors" + "flag" + "fmt" + "io/ioutil" + "log" + "os" + "os/exec" + "path/filepath" + "regexp" + "strings" + "time" + + "github.com/astaxie/beego/httplib" + + "idcos.io/cloudboot/build" + "idcos.io/cloudboot/config" +) + +// logger 全局终端日志 +var logger = log.New(os.Stdout, "", log.Lshortfile) + +var ( + domain string + rootPath string + copySrcFile string + defaultCopySrcFile = filepath.Join(fmt.Sprintf("Z:%c", os.PathSeparator), "windows", "firstboot", "peconfig.exe") + defaultRootPath = filepath.Join(fmt.Sprintf("X:%c", os.PathSeparator), "Windows", "System32") +) + +func main() { + flag.StringVar(&domain, "domain", "osinstall", "目标域名") + flag.StringVar(&copySrcFile, "copy-file-from", defaultCopySrcFile, "待拷贝的源文件") + flag.StringVar(&rootPath, "root-path", defaultRootPath, "目标程序放置的根目录") + flag.Parse() + + fmt.Println("peagent", build.Version()) + fmt.Println() + + time.Sleep(30 * time.Second) // 提供足够的时间进行网络初始化 + + ip, err := LookupIP(domain) + if err != nil { + logger.Println(err) + return + } + fmt.Println("Lookup domain found IP: ",ip) + + retries := 3 // Samba挂载失败时重试次数 + for i := 0; i < retries; i++ { + //default samba + sambaSetting := &config.Samba{ + Server: ip, + User: "", + Password: "", + } + fmt.Println("Set samba IP to ",sambaSetting.Server) + if s, err := getSambaSettings(ip); err == nil && s != nil { + sambaSetting.User = s.User + sambaSetting.Password = s.Password + } + if err = MountSamba(sambaSetting); err != nil { + time.Sleep(time.Duration((i+1)*5) * time.Second) + continue + } + break + } + if err != nil { + logger.Println(err) + return + } + + if err := Copy(copySrcFile, rootPath); err != nil { + logger.Println(err) + return + } + + if err := RunEXE(filepath.Join(rootPath, "peconfig.exe")); err != nil { + logger.Println(err) + return + } +} + +var pingReg = regexp.MustCompile(`(.+)(\s)(\d+)\.(\d+)\.(\d+)\.(\d+)([:|\s])(.+)TTL`) + +// ErrIPNotFound 无法查找到IP +var ErrIPNotFound = errors.New("ip not found") + +// LookupIP 根据域名查找IP +func LookupIP(domain string) (ip string, err error) { + output, err := ExecOutput(fmt.Sprintf("ping %s", domain)) + if err != nil { + return "", err + } + regResult := pingReg.FindStringSubmatch(string(output)) + if regResult == nil || len(regResult) != 9 { + return "", ErrIPNotFound + } + return fmt.Sprintf("%s.%s.%s.%s", + strings.TrimSpace(regResult[3]), + strings.TrimSpace(regResult[4]), + strings.TrimSpace(regResult[5]), + strings.TrimSpace(regResult[6]), + ), nil +} + +// MountSamba 挂载Samba目录 +func MountSamba(samba *config.Samba) (err error) { + if SambaMounted() { + return nil + } + + var cmdAndArgs string + if samba.User == "" { + cmdAndArgs = fmt.Sprintf(`net use Z: \\%s\samba`, samba.Server) + } else { + cmdAndArgs = fmt.Sprintf(`net use Z: \\%s\samba /user:%s %s`, samba.Server, samba.User, samba.Password) + } + _, err = ExecOutputDesensitization(cmdAndArgs, samba.Password) + return err +} + +// SambaMounted 判断Samba是否已经挂载 +func SambaMounted() (mounted bool) { + _, err := ExecOutput(`net use Z:`) + return err == nil +} + +// Copy 拷贝文件 +func Copy(src string, dest string) (err error) { + logger.Printf("Start copying files from %s to %s", src, dest) + _, err = ExecOutput(fmt.Sprintf("xcopy /s /e /y /i %s %s", src, dest)) + return err +} + +// RunEXE 运行可执行文件 +func RunEXE(filepath string, args ...string) error { + cmd := exec.Command(filepath, args...) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + return cmd.Run() +} + +// ExecOutput windows系统下,执行命令字符串cmdAndArgs,并将命令执行的标准输出和标准错误输出都通过字节切片output返回。 +func ExecOutput(cmdAndArgs string) (output []byte, err error) { + scriptFile, err := GenTempScript([]byte(cmdAndArgs)) + if err != nil { + return nil, err + } + defer os.Remove(scriptFile) + + output, err = exec.Command("cmd", "/c", scriptFile).Output() + logger.Printf("%s ==>\n%s\n", cmdAndArgs, output) + + return output, err +} + +// ExecOutput windows系统下,执行命令字符串cmdAndArgs,并将命令执行的标准输出和标准错误输出都通过字节切片output返回。 +func ExecOutputDesensitization(cmdAndArgs string, args ...string) (output []byte, err error) { + scriptFile, err := GenTempScript([]byte(cmdAndArgs)) + if err != nil { + return nil, err + } + defer os.Remove(scriptFile) + + output, err = exec.Command("cmd", "/c", scriptFile).Output() + + opLog := string(output) + for _, arg := range args { + cmdAndArgs = strings.Replace(cmdAndArgs, arg, "******", -1) + opLog = strings.Replace(opLog, arg, "******", -1) + } + logger.Printf("%s ==>\n%s\n", cmdAndArgs, opLog) + + return output, err +} + +// GenTempScript 在系统临时目录生成bat脚本文件 +func GenTempScript(content []byte) (scriptFile string, err error) { + scriptFile = filepath.Join(os.TempDir(), fmt.Sprintf("%d.bat", time.Now().Unix())) + if err = ioutil.WriteFile(scriptFile, content, 0744); err != nil { + return "", err + } + return scriptFile, nil +} + +// getSambaSettings 查询samba服务的连接配置 +func getSambaSettings(server string) (*config.Samba, error) { + var respData struct { + Status string `json:"status"` + Message string `json:"message"` + Content config.Samba `json:"content"` + } + + url := fmt.Sprintf("http://%s/api/cloudboot/v1/samba/settings", server) + if err := httplib.Get(url).ToJSON(&respData); err != nil { + return nil, err + } + + if respData.Status != "success" { + return nil, fmt.Errorf("unexpected response value(status=%s, message=%s)", respData.Status, respData.Message) + } + return &respData.Content, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/cmd/peconfig/disk_partition.go b/cyclone-server/src/idcos.io/cloudboot/cmd/peconfig/disk_partition.go new file mode 100644 index 0000000000000000000000000000000000000000..372c73a6dac6e20cc29e259649c75023dc016839 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/cmd/peconfig/disk_partition.go @@ -0,0 +1,35 @@ +package main + +import "idcos.io/cloudboot/utils/win" + +// DiskSlice 磁盘分区集合(针对镜像安装方式) +type DiskSlice []Disk + +// ToDiskPartConfigurations 将磁盘分区集合信息转化成磁盘分区配置信息 +func (disks DiskSlice) ToDiskPartConfigurations() win.DiskPartConfigurations { + items := make([]win.DiskPartConfiguration, 0, len(disks)) + for i := range disks { + diskNo, _ := win.DiskNo(disks[i].Name) + items = append(items, win.DiskPartConfiguration{ + Disk: diskNo, + Partitions: PartitionSlice(disks[i].Partitions).ToPartConfigurations(), + }) + } + return items +} + +// PartitionSlice 分区信息(针对镜像安装方式) +type PartitionSlice []Partition + +// ToPartConfigurations 将分区信息转化为分区配置信息 +func (partitions PartitionSlice) ToPartConfigurations() []win.PartConfiguration { + items := make([]win.PartConfiguration, 0, len(partitions)) + for i := range partitions { + items = append(items, win.PartConfiguration{ + Size: partitions[i].Size, + FSType: partitions[i].Fstype, + Mountpoint: partitions[i].Mountpoint, + }) + } + return items +} diff --git a/cyclone-server/src/idcos.io/cloudboot/cmd/peconfig/main.go b/cyclone-server/src/idcos.io/cloudboot/cmd/peconfig/main.go new file mode 100644 index 0000000000000000000000000000000000000000..8b90f84375ec8629d26faf9a26451eec8dcf1ad6 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/cmd/peconfig/main.go @@ -0,0 +1,742 @@ +package main + +import ( + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "net/http" + "os" + "path/filepath" + "regexp" + "strings" + "time" + + "github.com/astaxie/beego/httplib" + "github.com/urfave/cli" + + "idcos.io/cloudboot/build" + "idcos.io/cloudboot/config" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/server/cloudbootserver/types/setting" + "idcos.io/cloudboot/server/cloudbootserver/util" + "idcos.io/cloudboot/utils" + mystrings "idcos.io/cloudboot/utils/strings" + "idcos.io/cloudboot/utils/win" +) + +var ( + systemTemplateFile = "X:\\Windows\\System32\\unattended.xml" + + cachePath = "c:/firstboot" + nicFile = filepath.Join(cachePath, "nic.txt") + deviceSettingFile = filepath.Join(cachePath, "deviceSetting.json") + networkSettingFile = filepath.Join(cachePath, "networkSetting.json") + preInstallScript = filepath.Join(cachePath, "preinstall.cmd") + postInstallScript = filepath.Join(cachePath, "postinstall.cmd") +) + +// Options peconfig组件命令行选项值 +type Options struct { + LogLevel string + LogFile string + Domain string +} + +func main() { + var opts Options + var log logger.Logger + + app := cli.NewApp() + app.Version = build.Version() + app.Flags = []cli.Flag{ + cli.StringFlag{ + Name: "log-level", + Value: "debug", + Usage: "log level, optional values: debug|info|warn|error", + Destination: &opts.LogLevel, + }, cli.StringFlag{ + Name: "log-file", + Value: "peconfig.log", + Usage: "log file path name", + Destination: &opts.LogFile, + }, + cli.StringFlag{ + Name: "domain", + Value: "osinstall", + Usage: "api server domain name", + Destination: &opts.Domain, + }, + } + app.Before = func(ctx *cli.Context) error { + log = logger.NewBeeLogger(&config.Logger{ + Level: opts.LogLevel, + LogFile: opts.LogFile, + ConsoleEnabled: false, + RotateEnabled: false, + }) + return nil + } + app.Action = func(c *cli.Context) { + if err := NewPEConfiger(log, &opts).Run(); err != nil { + fmt.Fprintln(os.Stderr, err.Error()) + } + } + + if err := app.Run(os.Args); err != nil { + log.Error(err) + } +} + +// InstallationError 操作系统安装过程中发生的错误 +type InstallationError struct { + Title string + Cause string +} + +// NewInstallationError 返回操作系统安装错误实例 +func NewInstallationError(title string, cause string) error { + return &InstallationError{ + Title: title, + Cause: cause, + } +} + +func (e *InstallationError) Error() string { + return e.Cause +} + +// PEConfiger WinPE配置器 +type PEConfiger struct { + log logger.Logger + opts *Options + sn string + srvAddr string +} + +// NewPEConfiger 返回WinPE配置器实例 +func NewPEConfiger(log logger.Logger, opts *Options) *PEConfiger { + return &PEConfiger{ + log: log, + opts: opts, + } +} + +// handleErr 对安装过程中产生的致命错误进行处理。 +// 对于非安装错误(InstallationError),则不进行任何处理。 +func (pec *PEConfiger) handleErr(err error) { + if ierr, ok := err.(*InstallationError); ok { + pec.reportProgress(-1, ierr.Title, ierr.Error()) + } +} + +const ( + defaultLoopInterval = 60 +) + +func (pec *PEConfiger) inQueue() (bool, error) { + stat, err := pec.getInstallationStatus() + if err != nil { + return false, err + } + //设备状态必须为等待安装或者正在安装,才允许继续执行。 + if stat.Status != model.InstallStatusPre && stat.Status != model.InstallStatusIng { + pec.log.Errorf("%s is not in the installation queue\n", pec.sn) + return false, err + } + return true, nil +} + +// waitToEnterQueue 一直等待,直到进入安装队列。 +func (pec *PEConfiger) waitToEnterQueue() { + t := time.NewTicker(time.Duration(defaultLoopInterval) * time.Second) // 轮询间隔时间 +LOOP: + for { + select { + case <-t.C: + if yes, err := pec.inQueue(); err == nil && yes { + t.Stop() + break LOOP + } + } + } +} + +// Run 运行WinPE配置器 +func (pec *PEConfiger) Run() (err error) { + defer func(e *error) { + if err := recover(); err != nil { + pec.handleErr(*e) + } + }(&err) + + time.Sleep(30 * time.Second) // 提供足够的时间进行网络初始化 + + fmt.Println("[1/7] Get SN") + if err = pec.loadSN(); err != nil { + return NewInstallationError("Failed to get SN", err.Error()) + } + fmt.Printf("SN ==> %s\n\n", pec.sn) + + fmt.Println("[2/7] Lookup IP") + ip, _ := pec.lookupIP(pec.opts.Domain) + if ip != "" { + pec.srvAddr = ip + } else { + pec.srvAddr = pec.opts.Domain + } + fmt.Printf("%s ==> %s\n\n", "osinstall", ip) + + if !utils.PingLoop(pec.srvAddr, 30, 2) { + return NewInstallationError( + fmt.Sprintf("The cloudboot server(%s) is unreachable", pec.srvAddr), + "ping timeout", + ) + } + + fmt.Printf("[3/7] Get installation status\n") + var stat *InstallationStatus + stat, err = pec.getInstallationStatus() + if err != nil { + pec.log.Errorf("Failed to get installation status, Error: %s\n", err.Error()) + } + fmt.Printf("status ==> %s %s %f\n\n", stat.Type, stat.Status, stat.Progress) + //设备状态必须为等待安装或者正在安装,才允许继续执行。 + if stat.Status != model.InstallStatusPre && stat.Status != model.InstallStatusIng { + pec.log.Errorf("%s is not in the installation queue\n", pec.sn) + } + + for { + pec.Post() //上传日志 + //轮询是否进入安装队列 + pec.waitToEnterQueue() + fmt.Printf("Enter installation queue\n") + + pec.reportProgress(0.6, "Start installation", fmt.Sprintf("Start installation by %s", stat.Type)) + + switch stat.Type { + case model.InstallationPXE: + fmt.Printf("[4/7] Installation by system template\n") + fmt.Printf("pull system template\n") + var data []byte + if data, err = pec.pullSystemTemplate(); err != nil { + pec.log.Errorf("Failed to pull system template , Error: %s \n", err.Error()) + continue + } + + fmt.Printf("persist system template") + if err = ioutil.WriteFile(systemTemplateFile, data, 0744); err != nil { + pec.log.Errorf("Failed to persist system template , Error: %s\n", err.Error()) + continue + } + + if err = pec.installBySystemTemplate(data); err != nil { + pec.log.Errorf("Installation failed(system template) , Error: %s\n", err.Error()) + continue + } + case model.InstallationImage: + fmt.Printf("[4/7] Installation by image template\n") + fmt.Printf("pull image template\n") + var tpl *ImageTemplate + tpl, err = pec.pullImageTemplate() + if err != nil { + pec.log.Errorf("Failed to pull image template , Error: %s\n", err.Error()) + continue + } + + if err = pec.doPartitions(tpl.Disks); err != nil { + pec.log.Errorf("Failed to partition or quick format , Error: %s\n", err.Error()) + continue + } + + if err = pec.applyImage(tpl.URL); err != nil { + pec.log.Errorf("Failed to apply-image , Error: %s \n", err.Error()) + continue + } + + if err = pec.bcdboot(); err != nil { + pec.log.Errorf("Failed to bcdboot , Error: %s \n", err.Error()) + continue + } + + if err = pec.addDrivers(tpl.Name); err != nil { + pec.log.Errorf("Failed to add drivers , Error: %s \n", err.Error()) + continue + } + + _ = os.MkdirAll(cachePath, 0755) + + if tpl.PreScript != "" { + pec.log.Debug("persist pre-install script ") + if err = ioutil.WriteFile(preInstallScript, []byte(tpl.PreScript), 0755); err != nil { + pec.log.Debug("x\n") + } else { + pec.log.Debug("√\n") + } + } + + if tpl.PostScript != "" { + pec.log.Debug("persist post-install script ") + if err = ioutil.WriteFile(postInstallScript, []byte(tpl.PostScript), 0755); err != nil { + pec.log.Debug("x\n") + } else { + pec.log.Debug("√\n") + } + } + } + + fmt.Printf("[5/7] Copy %s directory\n", `Z:\windows\firstboot`) + if err = pec.copyFirstBoot(`Z:\windows\firstboot`); err != nil { + pec.log.Errorf("Failed to copy 'firstboot' directory , Error: %s\n", err.Error()) + continue + } + + fmt.Printf("[6/7] Persistent device settings\n") + //_ = pec.saveDeviceSettings() + if errs := pec.saveDeviceSettings(); errs != nil { + pec.log.Errorf("Failed to save device settings, Error: %s\n", errs) + break + } + + pec.reportProgress(0.7, "Diskpart", "diskpart") + pec.reportProgress(0.75, "Change hostname", "change hostname") + pec.reportProgress(0.8, "Change network configuration", "change network") + pec.reportProgress(0.9, "Change registry configuration", "change registry") + pec.reportProgress(1.0, "The installation is complete", "finish") + + fmt.Printf("[7/7] Reboot after 10s\n") + time.Sleep(10 * time.Second) + if err = pec.reboot(); err != nil { + pec.log.Errorf("Reboot failed , Error: %s\n", err.Error()) + continue + } else { + break + } + } + return nil +} + +func (pec *PEConfiger) isVM() (bool, error) { + output, err := win.ExecOutputWithLog(pec.log, `systeminfo`) + if err != nil { + return false, err + } + return regexp.MustCompile(`(?i)VMware|VirtualBox|KVM|Xen|Parallels`).MatchString(string(output)), nil +} + +func (pec *PEConfiger) loadSN() (err error) { + if vm, _ := pec.isVM(); vm { + pec.sn, err = win.MacAddress(pec.log) + return err + } + pec.sn, err = win.PhysicalMachineSN(pec.log) + return err +} + +func (pec *PEConfiger) lookupIP(domain string) (ip string, err error) { + output, err := win.ExecOutputWithLog(pec.log, fmt.Sprintf("ping %s", domain)) + if err != nil { + return "", err + } + + arr := regexp.MustCompile(`(.+)(\s)(\d+)\.(\d+)\.(\d+)\.(\d+)([:|\s])(.+)TTL`).FindStringSubmatch(string(output)) + if len(arr) != 9 { + return "", nil + } + return fmt.Sprintf("%s.%s.%s.%s", + strings.TrimSpace(arr[3]), + strings.TrimSpace(arr[4]), + strings.TrimSpace(arr[5]), + strings.TrimSpace(arr[6]), + ), nil +} + +// InstallationStatus 设备操作系统安装状态 +type InstallationStatus struct { + Type string `json:"type"` + Status string `json:"status"` + Progress float64 `json:"progress"` +} + +// getInstallationStatus 查询设备装机状态 +func (pec *PEConfiger) getInstallationStatus() (status *InstallationStatus, err error) { + var respData struct { + Status string `json:"status"` + Message string `json:"message"` + Content InstallationStatus `json:"content"` + } + + url := fmt.Sprintf("http://%s/api/cloudboot/v1/devices/%s/installations/status", pec.srvAddr, pec.sn) + if err = httplib.Get(url).ToJSON(&respData); err != nil { + pec.log.Error(err) + return nil, err + } + + if respData.Status != "success" { + return nil, fmt.Errorf("unexpected response value(status=%s, message=%s)", respData.Status, respData.Message) + } + return &respData.Content, nil +} + +// reportProgress 上报安装进度 +func (pec *PEConfiger) reportProgress(progress float64, title, logMsg string) error { + var reqData struct { + InstallProgress float64 `json:"progress"` + InstallLog string `json:"log"` + Title string `json:"title"` + } + reqData.InstallProgress = progress + reqData.Title = title + reqData.InstallLog = base64.StdEncoding.EncodeToString([]byte(logMsg)) // base64编码 + + var respData struct { + Status string + Message string + Content struct { + Result string + } + } + + url := fmt.Sprintf("http://%s/api/cloudboot/v1/devices/%s/installations/progress?lang=en-US", pec.srvAddr, pec.sn) + reqBody, _ := json.Marshal(&reqData) + pec.log.Debugf("POST %s\rRequest body ==>\n%s", url, reqBody) + + if err := httplib.Post(url).Body(reqBody).Header("Content-Type", "application/json").ToJSON(&respData); err != nil { + pec.log.Error(err) + return err + } + + respBody, _ := json.Marshal(&respData) + pec.log.Debugf("Response body ==>\n%s", respBody) + + if strings.ToLower(respData.Status) != "success" { + return errors.New(respData.Message) + } + return nil +} + +// pullSystemTemplate 拉取系统模板内容 +func (pec *PEConfiger) pullSystemTemplate() (data []byte, err error) { + url := fmt.Sprintf("http://%s/api/cloudboot/v1/devices/%s/settings/system-template?type=raw", pec.srvAddr, pec.sn) + pec.log.Debugf("GET %s", url) + + resp, err := http.Get(url) + if err != nil { + pec.log.Error(err) + return nil, err + } + defer resp.Body.Close() + + data, err = ioutil.ReadAll(resp.Body) + if err != nil { + pec.log.Error(err) + return nil, err + } + return []byte(mystrings.UNIX2DOS(string(data))), nil +} + +func (pec *PEConfiger) installBySystemTemplate(systemTemplate []byte) (err error) { + arr := regexp.MustCompile(`<Path>(.*)\\install.wim</Path>`).FindStringSubmatch(string(systemTemplate)) + if len(arr) != 2 { + return errors.New("'install.wim' not found in system template") + } + + cmdArgs := fmt.Sprintf(`%s /unattend:unattended.xml /noreboot`, filepath.Join(arr[1], "setup.exe")) + // fmt.Printf("start installation ==> %s\n", cmdArgs) + _, err = win.ExecOutputWithLog(pec.log, cmdArgs) + return err +} + +// getThenSave 请求URL并将response body内容写入目标文件。 +func (pec *PEConfiger) getThenSave(url, destFile string) (err error) { + pec.log.Debugf("GET %s", url) + return httplib.Get(url).ToFile(destFile) +} + +// Partition 分区 +type Partition struct { + Name string `json:"name"` + Size string `json:"size"` + Fstype string `json:"fstype"` + Mountpoint string `json:"mountpoint"` +} + +// Disk 逻辑磁盘 +type Disk struct { + Name string `json:"name"` + Partitions []Partition `json:"partitions"` +} + +// ImageTemplate 镜像安装模板 +type ImageTemplate struct { + Name string `json:"name"` + URL string `json:"url"` + Username string `json:"username"` + Password string `json:"password"` + Disks []Disk `json:"disks"` + PreScript string `json:"pre_script"` + PostScript string `json:"post_script"` +} + +// pullImageTemplate 从服务端拉取镜像模板 +func (pec *PEConfiger) pullImageTemplate() (*ImageTemplate, error) { + var respData struct { + Status string + Message string + Content ImageTemplate + } + url := fmt.Sprintf("http://%s/api/cloudboot/v1/devices/%s/settings/image-template", pec.srvAddr, pec.sn) + + if err := httplib.Get(url).ToJSON(&respData); err != nil { + pec.log.Error(err) + return nil, err + } + + if respData.Status != "success" { + return nil, fmt.Errorf("failed to pull the image template: %s", respData.Message) + } + + if respData.Content.PreScript != "" { + if preData, err := base64.StdEncoding.DecodeString(respData.Content.PreScript); err == nil { + respData.Content.PreScript = mystrings.UNIX2DOS(string(preData)) + } + } + + if respData.Content.PostScript != "" { + if postData, err := base64.StdEncoding.DecodeString(respData.Content.PostScript); err == nil { + respData.Content.PostScript = mystrings.UNIX2DOS(string(postData)) + } + } + return &respData.Content, nil +} + +func (pec *PEConfiger) doPartitions(disks []Disk) (err error) { + // TODO 待优化 + if len(disks) > 0 { + return DiskSlice(disks).ToDiskPartConfigurations().Apply(pec.log) + } + p, err := pec.getPartitionSetting() + if err != nil { + return pec.formatDiskWithSignalFile() + } + return p.Apply(pec.log) +} + +func (pec *PEConfiger) applyImage(imageURL string) error { + cmdArgs := fmt.Sprintf(`Dism /apply-image /imagefile:%s /index:1 /ApplyDir:C:\`, imageURL) + // fmt.Printf("apply image ==> %s\n", cmdArgs) + _, err := win.ExecOutputWithLog(pec.log, cmdArgs) + return err +} + +func (pec *PEConfiger) bcdboot() error { + cmdArgs := `bcdboot C:\windows /s C: /l zh-CN /v` + // fmt.Printf("bcdboot ==> %s\n", cmdArgs) + _, err := win.ExecOutputWithLog(pec.log, cmdArgs) + return err +} + +func (pec *PEConfiger) addDrivers(imageTPLName string) error { + imageTPLName = strings.ToLower(imageTPLName) + osName := "2012r2" + if strings.Contains(imageTPLName, "2008") { + osName = "2008r2" + } else if strings.Contains(imageTPLName, "win7") { + osName = "win7" + } else if strings.Contains(imageTPLName, "win10") { + osName = "win10" + } + cmdArgs := fmt.Sprintf(`Dism /Image:C:\ /Add-Driver /Driver:Z:\windows\drivers\%s\ /Recurse /forceunsigned`, osName) + // fmt.Printf("add drivers ==> %s\n", cmdArgs) + _, err := win.ExecOutputWithLog(pec.log, cmdArgs) + return err +} + +func (pec *PEConfiger) copyFirstBoot(srcDir string) error { + destDir := `C:\firstboot` + // 可能存在CD-ROM\EFI等其他设备占用盘符 + if utils.CheckFileIsExist("d:/windows") { + destDir = `D:\firstboot` + } + if utils.CheckFileIsExist("e:/windows") { + destDir = `E:\firstboot` + } + if utils.CheckFileIsExist("f:/windows") { + destDir = `F:\firstboot` + } + + cmdArgs := fmt.Sprintf(`xcopy /s /e /y /i %s %s`, srcDir, destDir) + _, err := win.ExecOutputWithLog(pec.log, cmdArgs) + return err +} + +func (pec *PEConfiger) saveDeviceSettings() (errs []error) { + // 可能存在CD-ROM\EFI等其他设备占用盘符 + if utils.CheckFileIsExist("d:/windows") { + cachePath = "d:/firstboot" + deviceSettingFile = filepath.Join(cachePath, "deviceSetting.json") + networkSettingFile = filepath.Join(cachePath, "networkSetting.json") + } + if utils.CheckFileIsExist("e:/windows") { + cachePath = "e:/firstboot" + deviceSettingFile = filepath.Join(cachePath, "deviceSetting.json") + networkSettingFile = filepath.Join(cachePath, "networkSetting.json") + } + if utils.CheckFileIsExist("f:/windows") { + cachePath = "f:/firstboot" + deviceSettingFile = filepath.Join(cachePath, "deviceSetting.json") + networkSettingFile = filepath.Join(cachePath, "networkSetting.json") + } + pairs := map[string]string{ + fmt.Sprintf("http://%s/api/cloudboot/v1/devices/%s/settings", pec.srvAddr, pec.sn): deviceSettingFile, + fmt.Sprintf("http://%s/api/cloudboot/v1/devices/%s/settings/networks", pec.srvAddr, pec.sn): networkSettingFile, + } + for url, dest := range pairs { + fmt.Printf("Save %s ", dest) + if err := pec.getThenSave(url, dest); err != nil { + fmt.Println("x") + errs = append(errs, err) + } else { + fmt.Println("√") + } + } + return errs +} + +func (pec *PEConfiger) reboot() error { + _, err := win.ExecOutputWithLog(pec.log, `wpeutil reboot`) + return err +} + +// TODO 待优化 +func (pec *PEConfiger) getPartitionSetting() (win.DiskPartConfigurations, error) { + var part win.DiskPartConfigurations + var url = fmt.Sprintf("http://%s/api/cloudboot/v1/devices/%s/settings/partitions", pec.srvAddr, pec.sn) + pec.log.Debug(url) + // 规避风险: 不可信Url作为输入提供给HTTP请求 + domainCheck := "osinstall.idcos.com" + if !strings.HasSuffix(url, domainCheck) { + return part, fmt.Errorf("URL %s 不满足域名 %s\n", url, domainCheck) + } + resp, err := http.Get(url) + if err != nil { + return part, err + } + + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return part, fmt.Errorf("http status code: %d", resp.StatusCode) + } + var body []byte + body, err = ioutil.ReadAll(resp.Body) + if err != nil { + return part, fmt.Errorf("call url: %s failed", url) + } + pec.log.Debug(string(body)) + var jsonResp struct { + Content map[string][]setting.PartitionSettingItem + Status string + } + errJSON := json.Unmarshal(body, &jsonResp) + if errJSON != nil { + return part, errJSON + } + if jsonResp.Status == "success" { + if items, ok := jsonResp.Content["items"]; ok { + ps := make([]win.DiskPartConfiguration, 0) + part := make([]win.PartConfiguration, 0) + markIdx := 0 + for i := range items { + part = append(part, win.PartConfiguration{ + Size: items[i].Size, + FSType: items[i].FS, + Mountpoint: items[i].Mountpoint, + }) + if i < len(items)-1 && (items[i+1].Disk != items[i].Disk) { + ps = append(ps, win.DiskPartConfiguration{ + Disk: (items[i]).Disk, + Partitions: part[markIdx : i+1], + }) + markIdx = i + 1 + } else if i == len(items)-1 { + ps = append(ps, win.DiskPartConfiguration{ + Disk: (items[i]).Disk, + Partitions: part[markIdx:], + }) + } + } + return ps, nil + } + } + return nil, nil +} + +// TODO 待优化 +func (pec *PEConfiger) formatDiskWithSignalFile() error { + var cmd = `fsutil fsinfo drives` + outputBytes, err := win.ExecOutputWithLog(pec.log, cmd) + if err != nil { + return err + } + //output:Drives: C:\ D:\ E:\ Z:\ + var output = string(outputBytes) + //先替换Drives: 再通过 :\ 分割后遍历 + fix := util.SubStrByByte(output, strings.IndexAny(output, ":")) + output = strings.Replace(output, fix+":", "", -1) + list := strings.Split(output, ":\\") + for _, volume := range list { + volume = strings.TrimSpace(volume) + if volume == "" { + continue + } + + var file = fmt.Sprintf(`%s:/format.txt`, volume) + //格式化标识文件不存在,则略过 + if !utils.CheckFileIsExist(file) { + continue + } + + //格式化 + cmd = fmt.Sprintf(`format %s: /quick`, volume) + _, err := win.ExecOutputWithLog(pec.log, cmd) + if err != nil { + return err + } + } + return nil +} + +// loadData 加载日志 +func (pec *PEConfiger) loadData() ([]byte, error) { + data, err := ioutil.ReadFile("peconfig.log") + if err != nil { + pec.log.Error(err) + return nil, err + } + return data, nil +} + +// Post 向服务端发送日志 +func (pec *PEConfiger) Post() (err error) { + data, err := pec.loadData() + if err != nil { + return err + } + url := fmt.Sprintf("http://%s/api/cloudboot/v1/devices/%s/components/%s/logs?lang=en-US", + pec.srvAddr, pec.sn, + "peconfig") + + resp, err := httplib.Post(url).Header("Accept", "application/json").Body(data).DoRequest() + if err != nil { + pec.log.Error(err) + return err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("post log failed: %s", http.StatusText(resp.StatusCode)) + } + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/cmd/winconfig/main.go b/cyclone-server/src/idcos.io/cloudboot/cmd/winconfig/main.go new file mode 100644 index 0000000000000000000000000000000000000000..7c0a47e5ae4b931c467602e3349035c824aec9a8 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/cmd/winconfig/main.go @@ -0,0 +1,811 @@ +package main + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "os" + "path" + "path/filepath" + "regexp" + "strings" + "time" + + "github.com/astaxie/beego/httplib" + "github.com/axgle/mahonia" + "github.com/urfave/cli" + + "idcos.io/cloudboot/build" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/server/cloudbootserver/service" + "idcos.io/cloudboot/utils" +) + +func main() { + app := cli.NewApp() + app.Version = build.Version() + app.Action = func(c *cli.Context) { + run(c) + } + app.Run(os.Args) +} + +var ( + rootPath = "c:/firstboot" + serverHost = "osinstall" //cloudboot server host + scriptFile = filepath.Join(rootPath, "temp-script.cmd") + preInstallScript = filepath.Join(rootPath, "preInstall.cmd") + postInstallScript = filepath.Join(rootPath, "postInstall.cmd") + + devSettFile = filepath.Join(rootPath, "deviceSetting.json") + networkSettingFile = filepath.Join(rootPath, "networkSetting.json") + nicFile = filepath.Join(rootPath, "nic.txt") +) + +func run(c *cli.Context) error { + utils.InitFileLog() + enc := mahonia.NewEncoder("gbk") + if utils.CheckFileIsExist(preInstallScript) { + content, err := getFileContent(preInstallScript) + if err != nil { + utils.Logger.Error(err.Error()) + } + utils.Logger.Debug("run pre install script:" + preInstallScript + "\n" + content) + b, err := utils.ExecScript(preInstallScript) + if err != nil { + utils.Logger.Error("preinstall error: %s", err.Error()) + } + var output = string(b) + output = enc.ConvertString(output) + utils.Logger.Debug(output) + } + //init cloudboot server host + serverIP := getDomainLookupIP(serverHost) + if serverIP != "" { + serverHost = serverIP + } + + var sn = getSN() + isVM := isVirtualMachine() + if isVM { + sn = getMacAddress() + } + + if sn == "" { + utils.Logger.Error("get sn failed!") + } + + //deviceSettings, err := loadDeviceSetting() + //if err != nil { + // utils.Logger.Error(err.Error()) + //} + + // TODO 修改用户及密码 + + // 执行post脚本,拿到改网络之前,为的是在post里执行检查脚本的结果,可以上报到server from wangsu@20161201 + if utils.CheckFileIsExist(postInstallScript) { + content, err := getFileContent(postInstallScript) + if err != nil { + utils.Logger.Error(err.Error()) + } + utils.Logger.Debug("run post install script:" + postInstallScript + "\n" + content) + b, err := utils.ExecScript(postInstallScript) + if err != nil { + utils.Logger.Error("postInstall error: %s", err.Error()) + } + var output = string(b) + //output = enc.ConvertString(output) + utils.Logger.Debug(output) + utils.Logger.Debug("execute post script finish") + } + + //修改网络 + //_ = deviceSettings + //if err = changeNetwork(); err != nil { + // utils.Logger.Error(err.Error()) + //} + + //TODO 修改路由 + //if err = changeReg(); err != nil { + // utils.Logger.Error(err.Error()) + //} + + // 这两行代码要和"idcos.io/cloudboot/utils" 下的utils.go中的代码保持一致,否则会找不到日志文件 + var logPath = path.Join(rootPath, "log") + var logFile = path.Join(logPath, "setup.log") + // 重启之前上传日志 + PostLog(serverHost, sn, logFile) + + utils.Logger.Debug("start reboot") + reboot() + + return nil +} +func changeNetwork() error { + ns, err := loadNetworkSetting() + if err != nil { + utils.Logger.Errorf("load networkSetting.json fail,%v", err) + return err + } else if ns != nil { + //如果不做bonding,eth0-外网IP,eth1内网IP + //如果有多IP,只取列表的第一个下发配置 + intranetIndex, extranetIndex := -1, -1 //标记需要配置的内外网IP在数组中的位置 + for k, item := range ns.Items { + if item.Scope != nil && *item.Scope == model.Intranet && intranetIndex != -1 { + intranetIndex = k + } else if item.Scope != nil && *item.Scope == model.Extranet && extranetIndex != -1 { + extranetIndex = k + } + } + if ns.BondingRequired == model.NO { + if intranetIndex != -1 { + err = changeIP("本地连接2", + ns.Items[intranetIndex].IP, + ns.Items[intranetIndex].Netmask, + ns.Items[intranetIndex].Gateway) + if err != nil { + utils.Logger.Errorf("intranet ip:%s config fail,%v", ns.Items[intranetIndex], err) + //return + } + } + if extranetIndex != -1 { + err = changeIP("本地连接1", + ns.Items[extranetIndex].IP, + ns.Items[extranetIndex].Netmask, + ns.Items[extranetIndex].Gateway) + if err != nil { + utils.Logger.Errorf("extranet ip:%s config fail,%v", ns.Items[extranetIndex], err) + //return + } + } + } else { + //如果需要bonding... TODO + if err := teaming(ns); err != nil { + utils.Logger.Errorf("teaming fail:%v", err) + return err + } + } + } + + return nil +} + +type NicAdapter struct { + ID string + Name string +} + +func teaming(netSett *service.GetNetworkSettingBySNResp) error { + //采集本地网卡信息 + raw := getRawLocalhostNicInfo() + rows := strings.Split(raw, "\r\n") + + type LNic struct { + Hostname string + Mac string + HardwareName string + Name string + } + var lnics []LNic + for k, v := range rows { + if k == 0 { + continue + } + arr := strings.Split(v, ",") + utils.Logger.Info(v) + utils.Logger.Info(fmt.Sprintf("index:%d,array length:%d", k, len(arr))) + if len(arr) != 4 { + utils.Logger.Error("nic info wrong:") + continue + } + var lnic LNic + lnic.Hostname = strings.TrimSpace(arr[0]) + lnic.Mac = strings.TrimSpace(arr[1]) + lnic.Mac = strings.ToLower(lnic.Mac) + lnic.HardwareName = strings.TrimSpace(arr[2]) + lnic.Name = strings.TrimSpace(arr[3]) + lnics = append(lnics, lnic) + } + + //等待10S,等待驱动加载完成 + utils.Logger.Debug("sleep 10s:") + time.Sleep(10 * time.Second) + + //采集网卡适配器信息 + + var adapters []NicAdapter + raw = getRawNicAdapterInfo() + var r = `(\d)\)(\s)(.*)` + reg := regexp.MustCompile(r) + matchs := reg.FindAllStringSubmatch(raw, -1) + for _, match := range matchs { + var adapter NicAdapter + adapter.ID = strings.TrimSpace(match[1]) + adapter.ID = strings.Trim(adapter.ID, "\r\n") + adapter.Name = strings.TrimSpace(match[3]) + adapter.Name = strings.Trim(adapter.Name, "\r\n") + adapters = append(adapters, adapter) + } + + if err := teamingForEach(netSett, adapters); err != nil { + return err + } + + return nil +} + +//单组teaming配置 +func teamingForEach(netSett *service.GetNetworkSettingBySNResp, adapters []NicAdapter) error { + for index := 0; index < 2; index++ { + //创建 Teaming // 做team, eth2,3做bond0配外网,eth0,1做bond1,配内网 + cmd := fmt.Sprintf(`PROSetCL.exe Team_Create %s,%s Team%d SFT`, adapters[2-2*index].ID, adapters[3-2*index].ID, index) + errCmd := runCmd(cmd) + if errCmd != nil { + utils.Logger.Errorf("team create error :%s", errCmd.Error()) + } + + //设置teaming参数 + cmd = fmt.Sprintf(`PROSetCL.exe Team_SetSetting %d FailbackEnabled 禁用`, index+1) + errCmd = runCmd(cmd) + if errCmd != nil { + utils.Logger.Errorf("team create error :%s", errCmd.Error()) + } + cmd = fmt.Sprintf(`PROSetCL.exe Team_SetSetting %d ConnMonEnabled 启用`, index+1) + errCmd = runCmd(cmd) + if errCmd != nil { + utils.Logger.Errorf("team create error :%s", errCmd.Error()) + } + + //设置网关 + cmd = fmt.Sprintf(`PROSetCL.exe Team_SetSetting %d ConnMonClients %s`, index+1, netSett.Items[index].Gateway) + errCmd = runCmd(cmd) + if errCmd != nil { + utils.Logger.Errorf("team create error :%s", errCmd.Error()) + } + + cmd = fmt.Sprintf(`PROSetCL.exe Team_SetAdapterPriority %s 主适配器`, adapters[2-2*index].ID) + errCmd = runCmd(cmd) + if errCmd != nil { + utils.Logger.Errorf("team create error :%s", errCmd.Error()) + } + + cmd = fmt.Sprintf(`PROSetCL.exe Team_SetAdapterPriority %s 次适配器`, adapters[3-2*index].ID) + errCmd = runCmd(cmd) + if errCmd != nil { + utils.Logger.Errorf("team create error :%s", errCmd.Error()) + } + } + return nil +} + +func getFileContent(path string) (string, error) { + fi, err := os.Open(path) + if err != nil { + return "", err + } + defer fi.Close() + fd, err := ioutil.ReadAll(fi) + if err != nil { + return "", err + } + return string(fd), nil +} + +// TODO +func configNic() (string, error) { + //做teaming + // 1.查询Server接口 getnicinfobysn,获取逻辑名 2.查询本地网卡信息 3.重置网卡名 + //通过API获取网卡逻辑命名信息 + // var url = fmt.Sprintf("http://%s/api/osinstall/v1/device/getNicInfoBySn?sn=%s", host, sn) + // utils.Logger.Debug(url) + // resp, err := http.Get(url) + // if err != nil { + // return "", err + // } + // defer resp.Body.Close() + // if resp.StatusCode != http.StatusOK { + // return "", fmt.Errorf("http status code: %d", resp.StatusCode) + // } + // var body []byte + // body, err = ioutil.ReadAll(resp.Body) + // if err != nil { + // return "", fmt.Errorf("call url: %s failed", url) + // } + + cache, err := getFileContent(nicFile) + if err != nil { + return "", err + } + body := []byte(cache) + + type Nic struct { + Name string + Mac string + Type string + } + var jsonResp struct { + Content []Nic + } + if err := json.Unmarshal(body, &jsonResp); err != nil { + return "", err + } + nics := jsonResp.Content + + //采集本地网卡信息 + raw := getRawLocalhostNicInfo() + rows := strings.Split(raw, "\r\n") + + type LNic struct { + Hostname string + Mac string + HardwareName string + Name string + } + var lnics []LNic + for k, v := range rows { + if k == 0 { + continue + } + arr := strings.Split(v, ",") + utils.Logger.Error(v) + utils.Logger.Error(fmt.Sprintf("index:%d,array length:%d", k, len(arr))) + if len(arr) != 4 { + utils.Logger.Error("nic info wrong:") + continue + } + var lnic LNic + lnic.Hostname = strings.TrimSpace(arr[0]) + lnic.Mac = strings.TrimSpace(arr[1]) + lnic.Mac = strings.ToLower(lnic.Mac) + lnic.HardwareName = strings.TrimSpace(arr[2]) + lnic.Name = strings.TrimSpace(arr[3]) + lnics = append(lnics, lnic) + + for _, nic := range nics { + if lnic.Mac == nic.Mac { + err := changeNicName(lnic.Name, nic.Name) + if err != nil { + utils.Logger.Error("change nic name error:", err.Error()) + } + } + } + } + + //等待10S,等待驱动加载完成 + utils.Logger.Debug("sleep 10s:") + time.Sleep(10 * time.Second) + + //采集网卡适配器信息 + type NicAdapter struct { + ID string + Name string + } + var adapters []NicAdapter + raw = getRawNicAdapterInfo() + var r = `(\d)\)(\s)(.*)` + reg := regexp.MustCompile(r) + matchs := reg.FindAllStringSubmatch(raw, -1) + for _, match := range matchs { + var adapter NicAdapter + adapter.ID = strings.TrimSpace(match[1]) + adapter.ID = strings.Trim(adapter.ID, "\r\n") + adapter.Name = strings.TrimSpace(match[3]) + adapter.Name = strings.Trim(adapter.Name, "\r\n") + adapters = append(adapters, adapter) + } + + //创建 Teaming + var masterAdapterID string + var slaveAdapterID string + var masterMac string + for _, nic := range nics { + if nic.Type == "master" { + for _, lnic := range lnics { + if nic.Mac == lnic.Mac { + for _, adapter := range adapters { + if adapter.Name == lnic.HardwareName { + masterAdapterID = adapter.ID + } + } + } + } + masterMac = nic.Mac + } + if nic.Type == "slave" { + for _, lnic := range lnics { + if nic.Mac == lnic.Mac { + for _, adapter := range adapters { + if adapter.Name == lnic.HardwareName { + slaveAdapterID = adapter.ID + } + } + } + } + } + } + //创建 Teaming + cmd := fmt.Sprintf(`PROSetCL.exe Team_Create %s,%s Team0 SFT`, masterAdapterID, slaveAdapterID) + errCmd := runCmd(cmd) + if errCmd != nil { + utils.Logger.Error("team create error :", errCmd.Error()) + } + + //设置teaming参数 + cmd = `PROSetCL.exe Team_SetSetting 1 FailbackEnabled 禁用` + errCmd = runCmd(cmd) + if errCmd != nil { + utils.Logger.Error("team create error :", errCmd.Error()) + } + cmd = `PROSetCL.exe Team_SetSetting 1 ConnMonEnabled 已启用` + errCmd = runCmd(cmd) + if errCmd != nil { + utils.Logger.Error("team create error :", errCmd.Error()) + } + + //获取网关 + // raw, err = getRawDeviceNetworkInfo(host, sn) + // if err != nil { + // utils.Logger.Error("get gateway from api error :", err.Error()) + // } + // type JsonRespGatewayContent struct { + // Gateway string + // } + // var jsonRespGateway struct { + // Value JsonRespGatewayContent + // } + // err = json.Unmarshal([]byte(raw), &jsonRespGateway) + // if err != nil { + // utils.Logger.Error("format json error :", err.Error()) + // } + restInfo, err := loadDeviceSetting() + if err != nil { + utils.Logger.Error(err.Error()) + } + //设置网关 + cmd = fmt.Sprintf(`PROSetCL.exe Team_SetSetting 1 ConnMonClients %s`, restInfo.IntranetIP.Gateway) + errCmd = runCmd(cmd) + if errCmd != nil { + utils.Logger.Error("team create error :", errCmd.Error()) + } + + cmd = fmt.Sprintf(`PROSetCL.exe Team_SetAdapterPriority %s 主适配器`, masterAdapterID) + errCmd = runCmd(cmd) + if errCmd != nil { + utils.Logger.Error("team create error :", errCmd.Error()) + } + + cmd = fmt.Sprintf(`PROSetCL.exe Team_SetAdapterPriority %s 次适配器`, slaveAdapterID) + errCmd = runCmd(cmd) + if errCmd != nil { + utils.Logger.Error("team create error :", errCmd.Error()) + } + return masterMac, nil +} + +func runCmd(cmd string) error { + enc := mahonia.NewEncoder("gbk") + cmd = enc.ConvertString(cmd) + utils.Logger.Debug(cmd) + outputBytes, err := utils.ExecCmdOutputWithLogfile(scriptFile, cmd) + if err != nil { + return err + } + //output := enc.ConvertString(string(outputBytes)) + output := string(outputBytes) + utils.Logger.Debug(string(output)) + return nil +} + +func getRawNicAdapterInfo() string { + cmd := `PROSetCL.exe Adapter_Enumerate` + var output string + utils.Logger.Debug(cmd) + outputBytes, err := utils.ExecCmdOutputWithLogfile(scriptFile, cmd) + if err != nil { + utils.Logger.Error(err.Error()) + } else { + // enc := mahonia.NewDecoder("gbk") + // output = enc.ConvertString(string(outputBytes)) + output = string(outputBytes) + utils.Logger.Debug(output) + } + return output +} + +func getRawLocalhostNicInfo() string { + cmd := `wmic nic where "PhysicalAdapter=TRUE" get MACAddress,Name,NetConnectionID /format:csv` + var output string + utils.Logger.Debug(cmd) + outputBytes, err := utils.ExecCmd(scriptFile, cmd) + if err != nil { + utils.Logger.Error(err.Error()) + } else { + // enc := mahonia.NewDecoder("gbk") + // output = enc.ConvertString(string(outputBytes)) + output = string(outputBytes) + utils.Logger.Debug(output) + } + return output +} + +// 不推荐使用 +func changeNicName(oldName string, newName string) error { + enc := mahonia.NewEncoder("gbk") + newName = enc.ConvertString(newName) + // oldName = enc.ConvertString(oldName) + cmd := fmt.Sprintf(`netsh interface set interface name="%s" newname="%s"`, oldName, newName) + //cmd = enc.ConvertString(cmd) + utils.Logger.Debug(cmd) + output, err := utils.ExecCmd(scriptFile, cmd) + if err != nil { + return err + } + utils.Logger.Debug(string(output)) + return nil +} + +// 查看本机 SN +func getSN() string { + var cmd = `wmic bios get SerialNumber /VALUE` + var r = `SerialNumber=(\S+)` + var output string + utils.Logger.Debug(cmd) + if outputBytes, err := utils.ExecCmd(scriptFile, cmd); err != nil { + utils.Logger.Error(err.Error()) + } else { + output = string(outputBytes) + utils.Logger.Debug(output) + } + + reg := regexp.MustCompile(r) + var regResult = reg.FindStringSubmatch(output) + if regResult == nil || len(regResult) != 2 { + return "" + } + + // fmt.Println(strings.Trim(regResult[1], "\r\n")) + var result string + result = strings.Trim(regResult[1], "\r\n") + result = strings.TrimSpace(result) + return result +} + +//是否是虚拟机 +func isVirtualMachine() bool { + var cmd = `systeminfo` + var output string + utils.Logger.Debug(cmd) + if outputBytes, err := utils.ExecCmd(scriptFile, cmd); err != nil { + utils.Logger.Error(err.Error()) + } else { + output = string(outputBytes) + utils.Logger.Debug(output) + } + + isValidate, err := regexp.MatchString(`(?i)VMware|VirtualBox|KVM|Xen|Parallels`, output) + if err != nil { + utils.Logger.Error(err.Error()) + return false + } + return isValidate +} + +// 获取Mac地址 +func getMacAddress() string { + var cmd = `wmic nic where "NetConnectionStatus=2" get MACAddress /VALUE` + var r = `(?i)MACAddress=(\S+)` + var output string + utils.Logger.Debug(cmd) + if outputBytes, err := utils.ExecCmd(scriptFile, cmd); err != nil { + utils.Logger.Error(err.Error()) + } else { + output = string(outputBytes) + utils.Logger.Debug(output) + } + + reg := regexp.MustCompile(r) + var regResult = reg.FindStringSubmatch(output) + if regResult == nil || len(regResult) != 2 { + return "" + } + + var result string + result = strings.Trim(regResult[1], "\r\n") + result = strings.TrimSpace(result) + return result +} + +//get domain's lookup ip +func getDomainLookupIP(domain string) string { + var cmd = `ping ` + domain + var r = `(.+)(\s)(\d+)\.(\d+)\.(\d+)\.(\d+)([:|\s])(.+)TTL` + var output string + utils.Logger.Debug(cmd) + if outputBytes, err := utils.ExecCmd(scriptFile, cmd); err != nil { + utils.Logger.Error(err.Error()) + } else { + output = string(outputBytes) + utils.Logger.Debug(output) + } + + reg := regexp.MustCompile(r) + var regResult = reg.FindStringSubmatch(output) + if regResult == nil || len(regResult) != 9 { + return "" + } + + var result = fmt.Sprintf("%s.%s.%s.%s", strings.TrimSpace(regResult[3]), + strings.TrimSpace(regResult[4]), + strings.TrimSpace(regResult[5]), + strings.TrimSpace(regResult[6])) + return result +} + +// 网卡名称 +func getNicInterfaceIndex(mac string) string { + enc := mahonia.NewDecoder("gbk") + // var cmd = fmt.Sprintf(`wmic nic where (MACAddress="%s" and Name="%s") get InterfaceIndex /value`, mac, name) + //var cmd = fmt.Sprintf(`wmic nic where (MACAddress="%s" and Name like '%%%%%%%%Team0%%%%%%%%') get InterfaceIndex /value`, mac) + var cmd = fmt.Sprintf(`wmic nic where (MACAddress="%s" AND netConnectionStatus=2) get InterfaceIndex /value`, mac) + var r = `InterfaceIndex=(.*)` + var output string + utils.Logger.Debug(cmd) + if outputBytes, err := utils.ExecCmd(scriptFile, cmd); err != nil { + utils.Logger.Error(err.Error()) + } else { + output = enc.ConvertString(string(outputBytes)) + //output = string(outputBytes) + utils.Logger.Debug(output) + } + + reg := regexp.MustCompile(r) + var regResult = reg.FindStringSubmatch(output) + if regResult == nil || len(regResult) != 2 { + return "" + } + utils.Logger.Info("Nic Interface Index:" + regResult[1]) + // fmt.Println(strings.Trim(regResult[1], "\r\n")) + return regResult[1] +} + +// loadDeviceSetting 从文件导入全量硬件配置 +func loadDeviceSetting() (*service.DeviceSetting, error) { + cache, err := getFileContent(devSettFile) + if err != nil { + return nil, err + } + body := []byte(cache) + var jsonResp struct { + Status string `json:"status"` + Message string `json:"message"` + Content service.DeviceSetting `json:"content"` + } + + if err := json.Unmarshal(body, &jsonResp); err != nil { + utils.Logger.Errorf("load deviceSetting.json failed, %s", err.Error()) + return nil, err + } + return &jsonResp.Content, nil +} + +// loadNetworkSetting 从文件导入全量硬件配置 +func loadNetworkSetting() (*service.GetNetworkSettingBySNResp, error) { + cache, err := getFileContent(devSettFile) + if err != nil { + return nil, err + } + body := []byte(cache) + var jsonResp struct { + Status string `json:"status"` + Message string `json:"message"` + Content service.GetNetworkSettingBySNResp `json:"content"` + } + + if err := json.Unmarshal(body, &jsonResp); err != nil { + utils.Logger.Errorf("load deviceSetting.json failed, %s", err.Error()) + return nil, err + } + return &jsonResp.Content, nil +} + +// 修改 IP +func changeIP(nic, ip, netmask, gateway string) error { + var cmd = fmt.Sprintf(`netsh interface ipv4 set address name="%s" source=static addr=%s mask=%s gateway=%s`, nic, ip, netmask, gateway) + enc := mahonia.NewEncoder("gbk") + cmd = enc.ConvertString(cmd) + utils.Logger.Debug(cmd) + + output, err := utils.ExecCmd(scriptFile, cmd) + if err != nil { + utils.Logger.Error(err.Error()) + return nil + } + utils.Logger.Debug(string(output)) + return nil +} + +// 修改DNS +func changeDNS(nic, dns string) error { + var cmd = fmt.Sprintf(`netsh interface ipv4 set dnsservers name="%s" static %s primary`, nic, dns) + enc := mahonia.NewEncoder("gbk") + cmd = enc.ConvertString(cmd) + utils.Logger.Debug(cmd) + + output, err := utils.ExecCmd(scriptFile, cmd) + if err != nil { + utils.Logger.Error(err.Error()) + return nil + } + utils.Logger.Debug(string(output)) + + return nil +} + +// 修改注册表 +func changeReg() error { + var cmd1 = `reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoAdminLogon /t reg_sz /d 0 /f` + utils.Logger.Debug(cmd1) + output, err := utils.ExecCmd(scriptFile, cmd1) + if err != nil { + utils.Logger.Error(err.Error()) + return nil + } + utils.Logger.Debug(string(output)) + + var cmd2 = `reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Defaultpassword /t reg_sz /d "" /f` + utils.Logger.Debug(cmd2) + output, err = utils.ExecCmd(scriptFile, cmd2) + if err != nil { + utils.Logger.Error(err.Error()) + return nil + } + utils.Logger.Debug(string(output)) + return nil +} + +// 重启 +func reboot() error { + var cmd = fmt.Sprintf(`shutdown -f -r -t 10`) + utils.Logger.Debug(cmd) + output, err := utils.ExecCmd(scriptFile, cmd) + if err != nil { + utils.Logger.Error(err.Error()) + return nil + } + utils.Logger.Debug(string(output)) + return nil +} + +// loadData 加载日志 +func loadData(logpath string) ([]byte, error) { + data, err := ioutil.ReadFile(logpath) + if err != nil { + utils.Logger.Error(err) + return nil, err + } + return data, nil +} + +// PostLog 向服务端发送日志 +func PostLog(serverHost, sn, logpath string) (err error) { + data, err := loadData(logpath) + if err != nil { + return err + } + url := fmt.Sprintf("http://%s/api/cloudboot/v1/devices/%s/components/%s/logs?lang=en-US", + serverHost, sn, + "winconfig") + + resp, err := httplib.Post(url).Header("Accept", "application/json").Body(data).DoRequest() + if err != nil { + utils.Logger.Error(err) + return err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("post log failed: %s", http.StatusText(resp.StatusCode)) + } + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/cmd/winconfig/osuser.go b/cyclone-server/src/idcos.io/cloudboot/cmd/winconfig/osuser.go new file mode 100644 index 0000000000000000000000000000000000000000..3acd510ca33dc5b5cb25f060d19e0d97b9f46a2f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/cmd/winconfig/osuser.go @@ -0,0 +1,32 @@ +package main + +import "idcos.io/cloudboot/logger" +import "io/ioutil" +import ( + "encoding/json" +) + +// User 用户结构体 +type User struct { + Username string `json:"username"` + Password string `json:"password"` +} + +// LoadUserFromFile 从本地文件加载用户/密码信息 +func LoadUserFromFile(log logger.Logger, srcFile string) (user []*User, err error) { + b, err := ioutil.ReadFile(srcFile) + if err != nil { + log.Error(err) + return nil, err + } + var data struct { + Content map[string][]*User `json:"content"` + } + if err = json.Unmarshal(b, &data); err != nil { + return nil, err + } + if users, ok := data.Content["items"]; ok { + return users, nil + } + return nil, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/cmd/winconfig/route.go b/cyclone-server/src/idcos.io/cloudboot/cmd/winconfig/route.go new file mode 100644 index 0000000000000000000000000000000000000000..feebcc71f9038deaef2cc1d7b02c7b4d7173b6b3 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/cmd/winconfig/route.go @@ -0,0 +1,175 @@ +package main + +import ( + "bufio" + "bytes" + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "strings" + + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/utils/win" +) + +// ErrRoutesNotFound route信息不存在 +var ErrRoutesNotFound = errors.New("routes not found") + +func writeCMDs(w io.Writer, cmds []string) (n int64, err error) { + var buf bytes.Buffer + for i := range cmds { + buf.WriteString(cmds[i]) + buf.WriteByte('\r') + buf.WriteByte('\n') + } + return buf.WriteTo(w) +} + +// ApplyRoutesCMDs 返回配置路由的命令切片 +func ApplyRoutesCMDs(log logger.Logger, routesFile, masterMacAddr, slaveMacAddr string) (cmds []string, err error) { + routes, err := loadRoutesFromFile(log, routesFile) + if err != nil { + return nil, err + } + + if len(routes) == 0 { + log.Errorf("Routes not found in file of %s", routesFile) + return nil, ErrRoutesNotFound + } + + var masterIFID, slaveIFID string + masterIFID, err = getInterfaceID(log, masterMacAddr) + if err != nil { + return nil, err + } + + if slaveMacAddr != "" { + slaveIFID, err = getInterfaceID(log, slaveMacAddr) + if err != nil { + return nil, err + } + } + log.Infof("InterfaceID4master: %s, InterfaceID4slave: %s", masterIFID, slaveIFID) + switch len(routes) { + case 1: //仅配置主IP路由 + routes[0].InterfaceID = masterIFID + return []string{ + fmt.Sprintf("route -p ADD %s MASK %s %s IF %s", routes[0].Dest, routes[0].Mask, routes[0].Gateway, routes[0].InterfaceID), + }, nil + default: // 配置主/从IP路由 + routes[0].InterfaceID = masterIFID + routes[1].InterfaceID = slaveIFID + return []string{ + fmt.Sprintf("route -p ADD %s MASK %s %s IF %s", routes[0].Dest, routes[0].Mask, routes[0].Gateway, routes[0].InterfaceID), + fmt.Sprintf("route -p ADD %s MASK %s %s IF %s", routes[1].Dest, routes[1].Mask, routes[1].Gateway, routes[1].InterfaceID), + }, nil + } +} + +// ApplyRoutes 将路由表应用到本机 +func ApplyRoutes(log logger.Logger, routesFile, masterMacAddr, slaveMacAddr string) (err error) { + log.Infof("Start applying routes(macAddr4master: %q, macAddr4slave: %q)", masterMacAddr, slaveMacAddr) + routes, err := loadRoutesFromFile(log, routesFile) + if err != nil { + return err + } + + if len(routes) == 0 { + log.Errorf("Routes not found in file of %s", routesFile) + return ErrRoutesNotFound + } + + var masterIFID, slaveIFID string + masterIFID, err = getInterfaceID(log, masterMacAddr) + if err != nil { + return err + } + + if slaveMacAddr != "" { + slaveIFID, err = getInterfaceID(log, slaveMacAddr) + if err != nil { + return err + } + } + log.Infof("InterfaceID4master: %s, InterfaceID4slave: %s", masterIFID, slaveIFID) + switch len(routes) { + case 1: //仅配置主IP路由 + routes[0].InterfaceID = masterIFID + return addRoute(log, &routes[0]) + default: // 配置主/从IP路由 + routes[0].InterfaceID = masterIFID + routes[1].InterfaceID = slaveIFID + if err = addRoute(log, &routes[0]); err != nil { + return err + } + return addRoute(log, &routes[1]) + } +} + +// addRoute 添加一条永久路由 +func addRoute(log logger.Logger, route *Route) (err error) { + if route == nil || route.InterfaceID == "" { + log.Infof("Discard add route operation: %#v", route) + return nil + } + cmdAndArgs := fmt.Sprintf("route -p ADD %s MASK %s %s IF %s", route.Dest, route.Mask, route.Gateway, route.InterfaceID) + _, err = win.ExecOutputWithLog(log, cmdAndArgs) + return err +} + +// Route 路由信息 +type Route struct { + Dest string `json:"dest"` // 目标网段 + Mask string `json:"mask"` // 子网掩码 + Gateway string `json:"gateway"` // 网关地址 + InterfaceID string `json:"-"` // 网络接口ID +} + +func loadRoutesFromFile(log logger.Logger, srcFile string) (routes []Route, err error) { + b, err := ioutil.ReadFile(srcFile) + if err != nil { + log.Error(err) + return nil, err + } + var wapper struct { + Content []Route + } + + if err = json.Unmarshal(b, &wapper); err != nil { + log.Error(err) + return nil, err + } + return wapper.Content, nil +} + +func getInterfaceID(log logger.Logger, macAddr string) (id string, err error) { + outUTF8, err := win.ExecOutputWithLog(log, `route print interface`) + if err != nil { + return "", err + } + return parseInterfaceID(log, outUTF8, macAddr) +} + +func parseInterfaceID(log logger.Logger, outUTF8 []byte, macAddr string) (id string, err error) { + addr := strings.ToLower(strings.Replace(macAddr, ":", " ", -1)) + rd := bufio.NewReader(bytes.NewBuffer(outUTF8)) + for { + line, err := rd.ReadString('\n') + if err == io.EOF { + break + } + if err != nil { + log.Error(err) + return "", err + } + line = strings.ToLower(strings.TrimSpace(line)) + if strings.Contains(line, addr) { + if idx := strings.Index(line, "..."); idx > 0 { + return strings.TrimSpace(line[:idx]), nil + } + } + } + return "", nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/config/config.go b/cyclone-server/src/idcos.io/cloudboot/config/config.go new file mode 100644 index 0000000000000000000000000000000000000000..84da75d1e30fa68d2616523a6c861e48cf679143 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/config/config.go @@ -0,0 +1,114 @@ +package config + +// Loader 定义统一的配置加载接口 +type Loader interface { + Load() (*Config, error) + Save(*Config) error +} + +// Config config 数据结构体 +type Config struct { + Logger Logger + Repo Repo + Server Server + ExternalService ExternalService + UAM UAM + Samba Samba + DHCPLimiter DHCPLimiter + Crypto Crypto + ReverseProxy ReverseProxy + DistributedNodes []DistributedNode + IP IP +} + +// Logger 日志配置结构 +type Logger struct { + Color bool + Level string // 日志级别,可选值:debug、info、warn、error + LogFile string // 文件日志路径。若是空字符串则不输出到文件。 + PanicLogFile string // http请求Panic记录日志 + FilePerm string // 文件权限,默认0644 + ConsoleEnabled bool // 是否将日志输出到控制台 + RotateEnabled bool // 是否打开日志轮替 +} + +const ( + // ConsoleLog 控制台日志 + ConsoleLog = "stdout" +) + +// Repo 数据库配置结构 +type Repo struct { + Debug bool // 是否开启debug模式 + LogDestination string // 可选值:stdout/$(filepath),分别表示将SQL执行日志写入终端或者写入文件。默认为stdout,若指定了具体的日志文件路径,则将SQL日志写入该文件。 + Connection string `ini:"connection"` +} + +// Server server服务配置 +type Server struct { + HTTPPort int + OOBDomain string + StorageRootDir string +} + +// ExternalService 调用外部API服务配置 +type ExternalService struct { + ESBBaseURL string + ESBAppID string + ESBAppToken string +} + +// UAM uam系统配置 +type UAM struct { + RootEndpoint string // UAM后端服务根URL,必选。如'http://127.0.0.1:8092' + PortalURL string // UAM前端系统URL,必选。如'http://127.0.0.1:92' +} + +// DHCPLimiter DHCP IP请求限流器配置 +type DHCPLimiter struct { + Enable bool // 是否打开dhcp ip请求限流功能 + Limit int // 令牌桶中令牌上限 + WaitingTimeout int // 等待获取令牌的超时时间(单位秒) +} + +// ReverseProxy HTTP反向代理服务设置 +type ReverseProxy struct { + Enable bool // 标识当前server是否为proxy server + HTTPPort int // 反向代理服务的端口号 + URL string // 若当前server为proxy server,则需要将所有HTTP请求转发至master server处理。 + Origin string // 标识当前代理服务器所属地域信息 + IP string // 当前部署服务器的IP地址(可选) +} + +//DistributedNode 各分布式节点的部署IP +type DistributedNode struct { + NodeName string + NodeIP []string +} + +// Crypto 加密key +// key可参考以下方式生成 +// key := make([]byte, 32) +// if _, err := rand.Read(key); err != nil { +// panic(err) +// } +// keyStr := base64.StdEncoding.EncodeToString(key) +type Crypto struct { + Key string `json:"key"` +} + +// Samba Samba配置信息,地址、用户名、密码 +type Samba struct { + // 地址 + Server string `json:"server"` + // 用户名 + User string `json:"user"` + // 密码 + Password string `json:"password"` +} + +// IP保留 +type IP struct { + // 天数配置, 0代表不保留 + ReserveDay int `json:"reserveday"` +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/config/jsonconf/loader.go b/cyclone-server/src/idcos.io/cloudboot/config/jsonconf/loader.go new file mode 100644 index 0000000000000000000000000000000000000000..21a0adaf5d4cf0fca1a618720c572ee913791bcb --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/config/jsonconf/loader.go @@ -0,0 +1,35 @@ +package jsonconf + +import ( + "encoding/json" + "os" + + "idcos.io/cloudboot/config" +) + +// JSONLoader 从json 文件中加配置数据 +type JSONLoader struct { + path string +} + +// New 新建JSONLoader +func New(path string) *JSONLoader { + return &JSONLoader{path} +} + +// Load 实现Loader 接口 Load() +func (loader *JSONLoader) Load() (*config.Config, error) { + f, err := os.Open(loader.path) + if err != nil { + return nil, err + } + defer f.Close() + var conf config.Config + + return &conf, json.NewDecoder(f).Decode(&conf) +} + +// Save 实现Loader 接口 Save() +func (loader *JSONLoader) Save(conf *config.Config) error { + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/job/manager.go b/cyclone-server/src/idcos.io/cloudboot/job/manager.go new file mode 100644 index 0000000000000000000000000000000000000000..6cff6ff093643c9b9bcad3024edab93c6dbd0555 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/job/manager.go @@ -0,0 +1,102 @@ +package job + +import ( + "errors" + "time" + + "github.com/jakecoffman/cron" +) + +const ( + // CategoryInspection 任务类别-硬件巡检 + CategoryInspection = "inspection" + // CategoryInstallationTime 任务类别-安装超时 + CategoryInstallationTime = "installation_timeout" + // CategoryReleaseIP 任务类别-释放IP + CategoryReleaseIP = "release_ip" + // CategoryAutoDeploy 任务类别-自动部署 + CategoryAutoDeploy = "auto_deploy" + // CategoryMailSend 任务类别-邮件推送 + CategoryMailSend = "mailsend" + // CategoryUpdateDeviceLifecycle 任务类别-更新设备生命周期(维保状态) + CategoryUpdateDeviceLifecycle = "update_device_lifecycle" +) + +const ( + // RateImmediately 任务执行频率-立即执行 + RateImmediately = "immediately" + // RateFixedRate 任务执行频率-固定频率(周期性)执行 + RateFixedRate = "fixed_rate" +) + +const ( + // Builtin 内建任务 + Builtin = "yes" + // NoBuiltin 非内建任务 + NoBuiltin = "no" +) + +const ( + // Running 任务状态-运行中 + Running = "running" + // Paused 任务状态-已暂停 + Paused = "paused" + // Stoped 任务状态-已停止 + Stoped = "stoped" + // Deleted 任务状态-已删除 + Deleted = "deleted" +) + +// Job 任务 +type Job struct { + ID string // 任务ID(保证全局唯一) + Creator string // 任务创建者 + Builtin string // 是否是内建任务 + Title string // 任务标题 + Category string // 任务类型。可选值:inspection、installation_timeout、release_ip + Rate string // 任务执行频率。可选值:immediately-立刻执行; fixed_rate-固定频率(周期性)执行; + CronExpression string // cron表达式。若为一次性任务,则该值为空。 + CronRender string // cron表达式UI渲染信息 + Target map[string][]string // 任务作用目标。map中的value暂定为[]string,可能发生变化。 + Status string // 任务状态。 + CronJob cron.Job // 任务的具体实现步骤 + CreatedAt time.Time // 创建时间 + UpdatedAt time.Time // 更新时间 +} + +var ( + // ErrInvalidJobID 无效的任务ID + ErrInvalidJobID = errors.New("invalid job id") + // ErrPauseJob 无法暂停此任务(非运行中的定时任务无法暂停) + ErrPauseJob = errors.New("unable to pause this job") + // ErrUnpauseJob 无法继续此任务(非暂停的定时任务无法继续) + ErrUnpauseJob = errors.New("unable to continue this job") + // ErrRemoveBuiltinJob 无法删除系统内建任务 + ErrRemoveBuiltinJob = errors.New("unable to remove builtin job") +) + +// Manager 任务管理器 +type Manager interface { + // Rebuild 重建/恢复任务(用于系统重启场景) + Rebuild() error + // Submit 向任务管理器提交任务 + Submit(cjob *Job) error + // Remove 移除指定ID的任务。 + // 若指定的任务ID无效,则返回ErrInvalidJobID错误。 + // 若该任务已经开始运行,则此操作不会有任何效果。 + Remove(jobid string) error + // Pause 暂停指定ID的任务。 + // 若指定的任务ID无效,则返回ErrInvalidJobID错误。 + // 若该任务无法暂停,则返回ErrPauseJob错误。 + Pause(jobid string) error + // Unpause 继续运行指定ID的任务。 + // 若指定的任务ID无效,则返回ErrInvalidJobID错误。 + // 若该任务无法继续,则返回ErrUnpauseJob错误。 + Unpause(jobid string) error + // GetJobByID 返回指定ID的任务的一份拷贝 + GetJobByID(jobid string) (*Job, error) + // GetJobs 返回指定分页的任务列表 + GetJobs(cond *Job, pageNo, pageSize int64) (totalRecords int64, items []*Job, err error) + // Stop 停止任务管理器 + Stop() error +} diff --git a/cyclone-server/src/idcos.io/cloudboot/job/mysql/auto_deploy.go b/cyclone-server/src/idcos.io/cloudboot/job/mysql/auto_deploy.go new file mode 100644 index 0000000000000000000000000000000000000000..679db61f19108f5cb193fc7105b71ae53eb6ef63 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/job/mysql/auto_deploy.go @@ -0,0 +1,862 @@ +package mysql + +import ( + "idcos.io/cloudboot/utils/times" + "reflect" + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "strings" + "time" + + "github.com/astaxie/beego/httplib" + "github.com/jinzhu/gorm" + + "idcos.io/cloudboot/limiter" + "idcos.io/cloudboot/config" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils" + "idcos.io/cloudboot/utils/oob" + "idcos.io/cloudboot/utils/sh" +) + +const ( + // PowerRestart 重启 + PowerRestart = "restart" + // PowerOn 开机 + PowerOn = "on" + // PowerOff 关机 + PowerOff = "off" + // OperatePowerOn 服务器开机 + OperatePowerOn = "ipmitool -I lanplus -H $HOST -U $USER -P $PASSWD power on" + // OperatePowerOff 服务器关机 + OperatePowerOff = "ipmitool -I lanplus -H $HOST -U $USER -P $PASSWD power off" + // OperatePowerRestart 服务器重启 + OperatePowerRestart = "ipmitool -I lanplus -H $HOST -U $USER -P $PASSWD power reset" + // OperatePowerStatus 服务器状态 + OperatePowerStatus = "ipmitool -I lanplus -H $HOST -U $USER -P $PASSWD power status" + // OperatePowerPXE PXE启动 不能指定特定端口,端口指定可借助racadm等工具实现,网卡的pxe功能需要在bios中开启 + OperatePowerPXE = "ipmitool -I lanplus -H $HOST -U $USER -P $PASSWD chassis bootdev pxe options=efiboot" + //CmdSleep2s 命令之间睡2秒 + CmdSleep2s = "sleep 2s" +) + +// AutoDeployJob 自动部署任务 +type AutoDeployJob struct { + id string // 任务ID(全局唯一) + log logger.Logger + repo model.Repo + conf *config.Config +} + +// NewAutoDeployJob 实例化任务管理器 +func NewAutoDeployJob(log logger.Logger, repo model.Repo, conf *config.Config, jobid string) *AutoDeployJob { + return &AutoDeployJob{ + log: log, + repo: repo, + conf: conf, + id: jobid, + } +} + +// Run 任务 +// 内置任务,根据装机参数规则引擎生成装机参数,自动对待部署设备发起部署(仅首次,存在失败部署记录则不处理) +func (j *AutoDeployJob) Run() { + j.log.Debugf("Start auto deploy job") + defer j.log.Debugf("Auto deploy job is completed") + + defer func() { + if err := recover(); err != nil { + j.log.Errorf("Auto deploy job panic: \n%s", err) + } + }() + + status := model.DevOperStatPreDeploy + items, err := j.repo.GetDeviceByOperationStatus(status) + if err != nil { + j.log.Errorf("Fail to get predepoy devices: \n%s", err) + } + + if len(items) <= 0 { + j.log.Infof("The predepoy devices list is empty") + return + } + err = j.AutoGenDeviceSetting(items) + if err != nil { + j.log.Errorf("Auto deploy failed: %s .", err) + } +} + +// AutoGenDeviceSetting 调用规则引擎自动生成设备的装机参数,并发起部署 +func (j *AutoDeployJob) AutoGenDeviceSetting(devices []*model.Device) (err error) { + j.log.Infof("Start auto depoy job generating device settings") + defer j.log.Infof("End auto depoy job saving device settings") + + for _, dev := range devices { + // 查询是否有失败的装机记录 + old, err := j.repo.GetDeviceSettingBySN(dev.SN) + if err != nil && err != gorm.ErrRecordNotFound { + j.log.Errorf("Fail to get exist devicesetting of device(sn: %s ), error: %s", dev.SN, err) + continue + } + // 仅处理不存在装机记录的首次部署场景 + if old != nil { + j.log.Errorf("Exist devicesetting of device(sn: %s ), skipping now", dev.SN) + continue + } + // 根据 USiteID 查询获取 PhysicalArea + var ServerUSite *model.ServerUSite + ServerUSite, err = j.repo.GetServerUSiteByID(*dev.USiteID) + if err != nil { + j.log.Errorf("Fail to get serverusite of device(sn: %s ), error: %s", dev.SN, err) + continue + } + + // 根据 Category 判断 Arch + if strings.HasPrefix(dev.Category, "GA-") { + dev.Arch = "arm" + } else { + dev.Arch = "x86" + } + + // 转换 Vendor 厂商属性值(规则限定英文小写) + lower_vendor := strings.ToLower(dev.Vendor) + switch lower_vendor { + case "华为": + lower_vendor = "huawei" + case "浪潮": + lower_vendor = "inspur" + case "联想": + lower_vendor = "lenovo" + case "戴尔": + lower_vendor = "dell" + case "惠普": + lower_vendor = "hp" + case "华三": + lower_vendor = "h3c" + case "超聚变": + lower_vendor = "xfusion" + case "紫光恒越": + lower_vendor = "unis" + case "中科可控": + lower_vendor = "suma" + case "中科曙光": + lower_vendor = "sugon" + } + // 获取设备类型是否为金融信创生态产品 + cond := model.DeviceCategory{ + Category: dev.Category, + } + items, err := j.repo.GetDeviceCategorys(&cond, nil, nil) + if err != nil { + j.log.Errorf("Fail to get category of device(sn: %s ), error: %s", dev.SN, err) + continue + } + isFITIEcoProduct := "unknown" + if len(items) != 0 { + isFITIEcoProduct = items[0].IsFITIEcoProduct + j.log.Debugf("device[SN:%s] category[%s] is FITIEcoProduct", dev.SN, dev.Category) + } + // 规则引擎的事实对象 + df := DeviceFact{ + SN: dev.SN, + Category: dev.Category, + PhysicalArea: ServerUSite.PhysicalArea, + Arch: dev.Arch, + Vendor: lower_vendor, + IsFITIEcoProduct: isFITIEcoProduct, + } + // 规则推理得到装机参数 + result, err := j.RuleInduction(&df) + if err != nil { + j.log.Errorf("Fail to get rule action results of device(sn: %s ), error: %s", dev.SN, err) + continue + } + // 装机参数对象 + ds := model.DeviceSetting{ + SN: dev.SN, + InstallType: model.InstallationImage, + Status: model.InstallStatusPre, + Creator: "auto_deploy", + NeedIntranetIPv6: model.NO, //默认仅分配IPV4 + NeedExtranetIPv6: model.NO, //默认仅分配IPV4 + } + // 获取硬件配置模板ID + hwTemplate, err := j.repo.GetHardwareTemplateByName(result.RaidResult) + if err != nil { + j.log.Errorf("Fail to GetHardwareTemplateByName of device(sn: %s name: %s ), error: %s", dev.SN, result.RaidResult, err) + continue + } + ds.HardwareTemplateID = hwTemplate.ID + // 获取操作系统模版ID + // 优先image 次之pxe + imgTemplate, err := j.repo.GetImageTemplateByName(result.OSResult) + if err != nil { + j.log.Errorf("Fail to GetImageTemplateByName of device(sn: %s name: %s ), error: %s ,try SystemTemplate", dev.SN, result.OSResult, err) + //continue + sysTemplate, err := j.repo.GetSystemTemplateByName(result.OSResult) + if err != nil { + j.log.Errorf("Fail to GetSystemTemplateByName of device(sn: %s name: %s ), error: %s", dev.SN, result.OSResult, err) + continue + } + ds.SystemTemplateID = sysTemplate.ID + ds.InstallType = model.InstallationPXE + } + ds.ImageTemplateID = imgTemplate.ID + + // 获取网络配置 + if result.NetworkResult == "la_wa" { + // 获取内网业务IP + intraIP, err := j.repo.AssignIntranetIP(dev.SN) + if err != nil { + j.log.Errorf("AutoGenDeviceSetting fail to AssignIntranetIP of device(sn: %s ), error: %s", dev.SN, err) + continue + } + ds.IntranetIPNetworkID = intraIP.IPNetworkID + ds.IntranetIP = intraIP.IP + j.log.Infof("Device(%s) is assigned to intranet ip: %s", dev.SN, intraIP.IP) + // 获取外网业务IP + extraIP, err := j.repo.AssignExtranetIP(dev.SN) + if err != nil { + j.log.Errorf("AutoGenDeviceSetting fail to AssignExtranetIP of device(sn: %s ), error: %s", dev.SN, err) + continue + } + ds.ExtranetIPNetworkID = extraIP.IPNetworkID + ds.ExtranetIP = extraIP.IP + ds.NeedExtranetIP = "yes" + j.log.Infof("Device(%s) is assigned to extranet ip: %s", dev.SN, extraIP.IP) + } else if result.NetworkResult == "la" { + // 获取内网业务IP + intraIP, err := j.repo.AssignIntranetIP(dev.SN) + if err != nil { + j.log.Errorf("AutoGenDeviceSetting fail to AssignIntranetIP of device(sn: %s ), error: %s", dev.SN, err) + continue + } + ds.IntranetIPNetworkID = intraIP.IPNetworkID + ds.IntranetIP = intraIP.IP + ds.NeedExtranetIP = "no" + j.log.Infof("Device(%s) is assigned to intranet ip: %s", dev.SN, intraIP.IP) + } else { + // 网络配置规则推理结果不符合la la_wa 时跳过 + j.log.Errorf("Fail to AssignIP for device(sn: %s expected network_conf: %s ), error: %s", dev.SN, result.NetworkResult, err) + continue + } + + // 当RAID、OS、NETWORK均得到对应参数时,保存装机参数 + if err = j.repo.SaveDeviceSetting(&ds); err != nil { + j.log.Errorf("Device(%s) settings(auto) have not been saved err: %s", dev.SN, err) + return nil + } + // 变更记录 + optDetail, err := j.convert2DetailOfOperationTypeOSInstall(ds) + if err != nil { + j.log.Errorf("Fail to convert Detail of OperationTypeOSInstall: %v", err) + } + devLog := model.ChangeLog { + OperationUser: "auto_deploy", + OperationType: model.OperationTypeOSInstall, + OperationDetail: optDetail, + OperationTime: times.ISOTime(time.Now()).ToTimeStr(), + } + adll := &AppendDeviceLifecycleLogReq{ + SN: dev.SN, + LifecycleLog: devLog, + } + if err = j.AppendDeviceLifecycleLogBySN(adll);err != nil { + j.log.Error("LifecycleLog: append device lifecycle log (sn:%v) fail(%s)", dev.SN, err.Error()) + } + + j.log.Infof("Device(%s) settings(auto) have been saved", dev.SN) + go j.startInstallation(limiter.GlobalLimiter, dev.SN) + } + return nil +} + + +// 事实对象的属性(与规则库所需的属性匹配) +type DeviceFact struct { + SN string // 设备SN + Category string // 设备类型 + PhysicalArea string // 物理区域, 如: ServerFarm bonding区1 + Arch string // cpu架构:x86\arm + Vendor string // 设备厂商 + IsFITIEcoProduct string // 是否金融信创生态产品 +} + +// 推理规则前件是否包含逻辑运算符号AND OR +type ConditionHasLogicalOperator struct { + HasAND bool + HasOR bool + HasBoth bool +} + +// 规则推理返回结构体 +type ActionResult struct { + RuleType string // os raid network + OSResult string + RaidResult string + NetworkResult string +} + +// 元规则推理,仅针对单个 RuleP 结构体进行推理,返回 bool +func (j *AutoDeployJob) MetaRuleInduction(fact *DeviceFact, rulep *model.RuleP) (bool) { + if rulep.Attribute != "" && rulep.Attribute != model.AttributeLogicalOperator { + var factvalue string + // 获取fact对应的属性值 + switch rulep.Attribute { + case model.AttributeCategory: + factvalue = fact.Category + case model.AttributePhysicalArea: + factvalue = fact.PhysicalArea + case model.AttributeArch: + factvalue = fact.Arch + case model.AttributeVendor: + factvalue = fact.Vendor + case model.AttributeIsFITIEcoProduct: + factvalue = fact.IsFITIEcoProduct + default: + j.log.Errorf("Attribute of rule is not defined.") + return false + } + + // 逻辑处理 equal contains in + switch rulep.Operator { + case model.OperatorEqual: + if factvalue == rulep.Value[0] { + j.log.Infof("Device %s Meta_Rule_Hit: %s equal %s ", fact.SN, factvalue, rulep.Value) + return true + } + case model.OperatorContains: + if strings.Contains(factvalue, rulep.Value[0]) { + j.log.Infof("Device %s Meta_Rule_Hit: %s contains %s ", fact.SN, factvalue, rulep.Value) + return true + } + case model.OperatorIN: + for _, each := range rulep.Value { + if factvalue == each { + j.log.Infof("Device %s Meta_Rule_Hit: %s in %s ", fact.SN, factvalue, rulep.Value) + return true + } + } + default: + j.log.Errorf("Operator of rule is not defined.") + return false + } + } + return false +} + +// 前件解析器 +func (j *AutoDeployJob) ConditionParser(fact *DeviceFact, rule *model.DeviceSettingRule) (bool, error) { + if rule.Condition != "" { + var ruleconditions []model.RuleP + chlo := ConditionHasLogicalOperator{ + HasAND: false, + HasOR: false, + HasBoth: false, + } + + // 解析规则前件 + j.log.Debugf(rule.Condition) + err := json.Unmarshal([]byte(rule.Condition), &ruleconditions) + if err != nil { + j.log.Errorf("Rule condition parser failed (id: %d)", rule.ID) + j.log.Error(err) + return false,err + } + // fact 与 fact 之间必须通过逻辑运算符连接,故index=奇数可增加校验是否为AND OR + j.log.Infof("Condition of rule %d : %s", rule.ID, ruleconditions) + //j.log.Debugf("Condition of rule %d value: %s type: %T", rule.ID, ruleconditions, ruleconditions) + + // 推理是否包含逻辑运算符 AND OR + if len(ruleconditions) > 1 { + for _, rc := range ruleconditions { + if rc.Attribute == model.AttributeLogicalOperator && rc.Operator == model.OperatorEqual { + switch rc.Value[0] { + case model.OperatorOR: + chlo.HasOR = true + case model.OperatorAND: + chlo.HasAND = true + } + } + } + if chlo.HasOR && chlo.HasAND { + chlo.HasBoth = true + } + } else if len(ruleconditions) == 1 { + for _, rc := range ruleconditions { + return j.MetaRuleInduction(fact, &rc), nil + } + } + + // 前件包含AND + OR 优先处理 OR + if chlo.HasBoth { + // 针对包含AND + OR 临时存储结果 [true,and,false,or,true] + var logicresult []string + for _, rc := range ruleconditions { + if rc.Attribute == model.AttributeLogicalOperator { + switch rc.Value[0] { + case model.OperatorOR: + logicresult = append(logicresult, "or") + case model.OperatorAND: + logicresult = append(logicresult, "and") + } + } else { + if j.MetaRuleInduction(fact, &rc) { + logicresult = append(logicresult, "true") + } else { + logicresult = append(logicresult, "false") + } + } + } + + // 逻辑结果数组按and拆分 [[true],[false,or,true]] + var logicresult_split_by_and [][]string + i := 0 + for _, v := range logicresult { + if v == "and" { + i++ + } else { + logicresult_split_by_and[i] = append(logicresult_split_by_and[i], v) + } + } + + // 处理返回最终bool + contain_true := false + for _, splitted_list := range logicresult_split_by_and { + if len(splitted_list) == 1 { + if splitted_list[0] == "false"{ + return false,nil + } else { + continue + } + } else { + for _, va := range splitted_list { + if va == "true" { + contain_true = true + } else { + continue + } + } + if contain_true == false { + return false,nil + } + } + } + return true, nil + } else if chlo.HasAND { + for _, rc := range ruleconditions { + if rc.Attribute == model.AttributeLogicalOperator { + switch rc.Value[0] { + case model.OperatorOR: + j.log.Errorf("Not expected OR of rule %d ", rule.ID) + return false, fmt.Errorf("Not expected OR of rule %d ", rule.ID) + case model.OperatorAND: + continue + } + } else { + if j.MetaRuleInduction(fact, &rc) { + continue + } else { + return false, nil + } + } + } + return true, nil + } else if chlo.HasOR { + for _, rc := range ruleconditions { + if rc.Attribute == model.AttributeLogicalOperator { + switch rc.Value[0] { + case model.OperatorOR: + continue + case model.OperatorAND: + j.log.Errorf("Not expected AND of rule %d ", rule.ID) + return false, fmt.Errorf("Not expected AND of rule %d ", rule.ID) + } + } else { + if j.MetaRuleInduction(fact, &rc) { + return true, nil + } else { + continue + } + } + } + return false, nil + } + } + j.log.Errorf("Empty of rule %d ", rule.ID) + return false, fmt.Errorf("Empty of rule %d ", rule.ID) +} + + +// 规则推理机 +func (j *AutoDeployJob) RuleInduction(fact *DeviceFact) (*ActionResult, error) { + // 根据规则分类提取规则进行处理 + var result = &ActionResult{} + var ruletypes = []string {model.DeviceSettingRuleOS, model.DeviceSettingRuleRaid, model.DeviceSettingRuleNetwork} + for _, ruletype := range ruletypes { + switch ruletype { + case model.DeviceSettingRuleOS: + ruleItems, err := j.repo.GetDeviceSettingRulesByType(ruletype) + if err != nil { + j.log.Errorf("Fact(device sn: %s ) failed to get os rules.", fact.SN) + return nil, err + } + for _, rule := range ruleItems { + b, err := j.ConditionParser(fact, rule) + if err != nil { + return nil, err + } + if b { + j.log.Infof("Fact(device sn: %s ) successed to get os result.", fact.SN) + result.OSResult = rule.Action + } + } + + case model.DeviceSettingRuleRaid: + ruleItems, err := j.repo.GetDeviceSettingRulesByType(ruletype) + if err != nil { + j.log.Errorf("Fact(device sn: %s ) failed to get raid rules.", fact.SN) + return nil, err + } + for _, rule := range ruleItems { + b, err := j.ConditionParser(fact, rule) + if err != nil { + return nil, err + } + if b { + j.log.Infof("Fact(device sn: %s ) successed to get raid result.", fact.SN) + result.RaidResult = rule.Action + } + } + + case model.DeviceSettingRuleNetwork: + ruleItems, err := j.repo.GetDeviceSettingRulesByType(ruletype) + if err != nil { + j.log.Errorf("Fact(device sn: %s ) failed to get network rules.", fact.SN) + return nil, err + } + for _, rule := range ruleItems { + b, err := j.ConditionParser(fact, rule) + if err != nil { + return nil, err + } + if b { + j.log.Infof("Fact(device sn: %s ) successed to get network result.", fact.SN) + result.NetworkResult = rule.Action + } + } + } + } + // 仅返回完整的参数推理结果 + if result.OSResult == "" || result.RaidResult == "" || result.NetworkResult == "" { + j.log.Errorf("Fact(device sn: %s ) do not hit all types of rules.", fact.SN) + return nil, fmt.Errorf("Fact(device sn: %s ) do not hit all types of rules.", fact.SN) + } + return result, nil +} + + +// startInstallation 带外远程开机并开始安装流程 +func (j *AutoDeployJob) startInstallation(lim limiter.Limiter, sn string) (err error) { + // 1、获取进入bootos所需令牌 + var bucket limiter.Bucket + var token limiter.Token + + if j.conf.DHCPLimiter.Enable { + bucket, err = lim.Route(sn) + if err != nil { + return err + } + token, err = bucket.Acquire(sn, time.Second*time.Duration(j.conf.DHCPLimiter.WaitingTimeout)) + if err != nil { + return err + } + } + + // 2、修改装机开始时间、装机状态 + now := time.Now() + if _, err = j.repo.UpdateDeviceSettingBySN(&model.DeviceSetting{ + SN: sn, + InstallationStartTime: &now, + Status: model.InstallStatusIng, + }); err != nil { + if j.conf.DHCPLimiter.Enable { + _ = bucket.Return(sn, token) + } + return err + } + + j.log.Infof("Remote boot and start the OS installation process of the device(%s)", sn) + var sb strings.Builder + //TODO 优化项:如果设备在bootos,则跳过重启的过程 + //如果设备已上电,PXE重启,如果关机该命令会有问题,此时再尝试开机 + out, err := j.OperateOOBPower(sn, j.conf.Crypto.Key, j.conf.Server.OOBDomain, PowerRestart, true) + if err != nil { + j.log.Errorf("PXE-PowerRestart重启失败(%s),下一步尝试开机",err.Error()) + sb.WriteString(fmt.Sprintf("\nPXE-PowerRestart重启失败(%s),下一步尝试开机\n", err.Error())) + out, err = j.OperateOOBPower(sn, j.conf.Crypto.Key, j.conf.Server.OOBDomain, PowerOn, true) + sb.WriteString(strings.TrimSpace(out)) + if err != nil { + j.log.Errorf("PXE-PowerOn开机失败(%s)",err.Error()) + sb.WriteString(fmt.Sprintf("PXE-PowerOn开机失败(%s)", err.Error())) + } + } + // 调用自身API进行安装进度上报(进度值为'5%') + var reqData struct { + Progress float64 `json:"progress"` + Log string `json:"log"` + Title string `json:"title"` + } + if err != nil { + reqData.Progress = -1.0 + } else { + reqData.Progress = 0.05 + } + reqData.Title = "物理机远程开机" + reqData.Log = base64.StdEncoding.EncodeToString([]byte(sb.String())) + + reqBody, _ := json.Marshal(&reqData) + + url := fmt.Sprintf("%s/api/cloudboot/v1/devices/%s/installations/progress", fmt.Sprintf("http://localhost:%d", j.conf.Server.HTTPPort), sn) + j.log.Infof("POST %s", url) + j.log.Infof("Request body: %s", reqBody) + + resp, err := httplib.Post(url). + Header("Content-Type", "application/json"). + Header("Accept", "application/json"). + Body(reqBody).Response() + if err != nil { + j.log.Error(err) + return err + } + defer resp.Body.Close() + + respBody, err := ioutil.ReadAll(resp.Body) + if err != nil { + j.log.Error(err) + return err + } + j.log.Infof("Response body: %s", respBody) + return err +} + +// OperateOOBPower 带外管理的操作 +func (j *AutoDeployJob) OperateOOBPower(sn, key, oobDomain, operate string, isPxe bool) (output string, err error) { + m, err := j.repo.GetDeviceBySN(sn) + if err != nil { + return "", err + } + + if m.OOBUser == "" || m.OOBPassword == "" { + j.log.Warnf("设备带外用户或密码为空,尝试找回,[SN:%s]", m.SN) + history, err := j.repo.GetLastOOBHistoryBySN(sn) + if err != nil && err == gorm.ErrRecordNotFound { + j.log.Errorf("find back oob history by sn:%s fail,%s", sn, err.Error()) + return fmt.Sprintf("find back oob history by sn:%s fail", sn), fmt.Errorf("设备用户名密码为空,无法操作") + } else { + return fmt.Sprintf("find back oob history by sn:%s fail", sn), err + } + m.OOBUser = history.UsernameNew + m.OOBPassword = history.PasswordNew + } + + oobHost := utils.GetOOBHost(m.SN, m.Vendor, oobDomain) + oobIP := oob.TransferHostname2IP(j.log, j.repo, m.SN, oobHost) + if oobIP == "" { + return "操作失败", errors.New("未获取到带外IP") + } + oobUser := m.OOBUser + oobPassword, err := utils.AESDecrypt(m.OOBPassword, []byte(key)) + if err != nil { + j.log.Debugf("descrypt password failure, err: %s", err.Error()) + return "", err + } + + //TODO ping命令存在问题 + //// check ping + //if !ping.Ping(oobHost, 5) { + // return "", fmt.Errorf("网络无法连通设备 [SN:%s]", m.SN) + //} + + // check is power + isPowerOn, err := j.OOBPowerStatus(oobIP, oobUser, string(oobPassword), m.OOBPassword) + if err != nil { + return "", err + } + + var cmd string + switch operate { + case PowerOff: + cmd += OperatePowerOff + case PowerOn: + if isPxe { + cmd = OperatePowerPXE + " && " + CmdSleep2s + " && " + } + cmd += OperatePowerOn + case PowerRestart: + // 设备在关闭状态下无法重启 + if !isPowerOn { + return "", fmt.Errorf("设备为关机状态,无法重启") + } + + if isPxe { + cmd = OperatePowerPXE + " && " + CmdSleep2s + " && " + } + cmd += OperatePowerRestart + } + + cmd = j.replaceCmd(cmd, oobIP, oobUser, string(oobPassword)) + + j.DesensitizePasswordLog(fmt.Sprintf("start to exec cmd: [%s]", cmd), string(oobPassword), m.OOBPassword) + + out, err := sh.ExecOutputWithLog(j.log, cmd) + if err != nil { + j.log.Debugf("exec [%s] done , err: [%s], stdout: [%s]", sh.CmdDesensitization(cmd), err.Error(), sh.CmdDesensitization(string(out))) + return "", j.ProcessStdoutMsg(out, oobIP, oobUser) + } + + j.DesensitizePasswordLog(fmt.Sprintf("exec [%s] done,output: [%s]", cmd, string(out)), string(oobPassword), m.OOBPassword) + + // update device power_status + status := model.PowerStatusOn + + if operate == PowerOff { + status = model.PowerStatusOff + } + m.PowerStatus = status + j.repo.UpdateDevice(m) + + return string(out), nil +} + +// OOBPowerStatus 检查OOBPower状态 +func (j *AutoDeployJob) OOBPowerStatus(oobHost, oobUser, oobPassword, oldPassword string) (bool, error) { + if oobHost == "" { + return false, errors.New("未获取到带外IP") + } + cmd := j.replaceCmd(OperatePowerStatus, oobHost, oobUser, oobPassword) + + output, err := sh.ExecOutputWithLog(j.log, cmd) + if err != nil { + return false, j.ProcessStdoutMsg(output, oobHost, oobUser) + } + + return strings.Contains(string(output), "Chassis Power is on"), nil +} + +// replaceCmd 将HOST、USER、PASSWD进行替换 +func (j *AutoDeployJob) replaceCmd(cmd, oobHost, oobUser, oobPassword string) string { + cmd = strings.Replace(cmd, "$HOST", oobHost, -1) + cmd = strings.Replace(cmd, "$USER", oobUser, -1) + cmd = strings.Replace(cmd, "$PASSWD", oobPassword, -1) + return cmd +} + +// ProcessStdoutMsg 处理错误信息 +func (j *AutoDeployJob) ProcessStdoutMsg(output []byte, host, username string) error { + str := string(output) + + if strings.Contains(str, "Could not open socket!") { + return fmt.Errorf("无法连接目标主机(%s)", host) + } + + if strings.Contains(str, "command not found") { + return fmt.Errorf("命令不存在") + } + + if strings.Contains(str, "Unable to establish IPMI v2 / RMCP+ session") { + return fmt.Errorf("用户名(%s)或密码错误", username) + } + return fmt.Errorf("其他错误:%s", string(output)) +} + +// DesensitizePasswordLog 脱敏密码输出 +func (j *AutoDeployJob) DesensitizePasswordLog(str, oldPass, newPass string) { + j.log.Debugf("%s", strings.Replace(str, oldPass, newPass, -1)) +} + + +// 更新追加设备生命周期变更记录 请求结构体 +type AppendDeviceLifecycleLogReq struct { + SN string `json:"sn"` + LifecycleLog model.ChangeLog `json:"lifecycle_log"` +} + + +//AppendDeviceLifecycleLog 更新追加设备生命周期变更记录 +func (j *AutoDeployJob) AppendDeviceLifecycleLogBySN(reqData *AppendDeviceLifecycleLogReq) error { + // DeviceLifecycle 查询是否已经存在 + devLifecycle, err := j.repo.GetDeviceLifecycleBySN(reqData.SN) + if err != nil && err != gorm.ErrRecordNotFound { + j.log.Error(err.Error()) + return err + } + if devLifecycle != nil { + j.log.Debugf("Begin to AppendDeviceLifecycleLogBySN:%s", reqData.SN) + defer j.log.Debugf("End to AppendDeviceLifecycleLogBySN:%s", reqData.SN) + // 获取当前的生命周期日志记录 + var devLL []model.ChangeLog + if devLifecycle.LifecycleLog != "" { + if err = json.Unmarshal([]byte(devLifecycle.LifecycleLog), &devLL);err != nil { + j.log.Error(err.Error()) + return err + } + } + // 追加 + devLL = append(devLL, reqData.LifecycleLog) + b, err := json.Marshal(devLL) + if err != nil { + j.log.Error(err.Error()) + return err + } + // DeviceLifecycle 结构体 + modDevLifecycle := &model.DeviceLifecycle{ + SN: reqData.SN, + LifecycleLog: string(b), + } + if err = j.repo.UpdateDeviceLifecycleBySN(modDevLifecycle);err != nil { + j.log.Errorf("UpdateDeviceLifecycleBySN failed: %s", err.Error()) + return err + } + } + return nil +} + + +func (j *AutoDeployJob) convert2DetailOfOperationTypeOSInstall(setting model.DeviceSetting) (string, error) { + var details []string + + getType := reflect.TypeOf(setting) + getValue := reflect.ValueOf(setting) + + for i := 0; i < getType.NumField(); i++ { + field := getType.Field(i) + value := getValue.Field(i).Interface() + + switch field.Name { + case "InstallType": + details = append(details, fmt.Sprintf("安装方式:%v ", value)) + case "OSTemplateName": + details = append(details, fmt.Sprintf("操作系统安装模板:%v ", value)) + case "HardwareTemplateName": + details = append(details, fmt.Sprintf("硬件配置模板:%v ", value)) + case "NeedExtranetIP": + details = append(details, fmt.Sprintf("是否需要外网IPv4:%v ", value)) + case "NeedExtranetIPv6": + details = append(details, fmt.Sprintf("是否需要内网IPv6:%v ", value)) + case "NeedIntranetIPv6": + details = append(details, fmt.Sprintf("是否需要外网IPv6:%v ", value)) + } + } + + if len(details) > 0 { + return strings.Join(details, ";"), nil + } else { + return "", fmt.Errorf("部署设备记录(SN:%v)字段详情转化失败", setting.SN) + } + +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/job/mysql/inspection_collect.go b/cyclone-server/src/idcos.io/cloudboot/job/mysql/inspection_collect.go new file mode 100644 index 0000000000000000000000000000000000000000..80614813b91a1fd894577c0b17e3a486cc1b19ff --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/job/mysql/inspection_collect.go @@ -0,0 +1,53 @@ +package mysql + +import ( + "encoding/json" + "errors" + "time" + + "idcos.io/cloudboot/model" +) + +// Collect 采集目标设备的ipmi传感器、事件数据 +// TODO 这个需求用于实时查询ipmi传感器、事件数据接口,可以更优雅,应该把这部分逻辑提炼到utils/oob里面 +func (j *InspectionJob) Collect(sn string) (insp *model.Inspection) { + insp = &model.Inspection{} + var err error + defer func(insp *model.Inspection) { + // 4、巡检结果 + endTime := time.Now() + insp.EndTime = &endTime + insp.RunningStatus = model.RunningStatusDone + if err != nil { + j.log.Error(err) + insp.Error = j.translateErrMsg(ErrServer) + return + } + }(insp) + insp.SN = sn + insp.HealthStatus = model.HealthStatusUnknown + // 1、查询设备信息 + dev, err := j.repo.GetDeviceBySN(insp.SN) + if err != nil { + err = ErrDeviceSN + return + } + + // 3、采集传感器信息 + switch dev.Arch { + case model.DevArchX8664, model.DevArchAarch64, "": // 暂时仅支持x86_64、arm服务器 + sensors, err := j.fetchSensors(dev) + insp.HealthStatus = j.healthStatus(sensors) + if err != nil { + return + } + b, err := json.Marshal(sensors) + if err != nil { + return + } + insp.IPMIResult = string(b) + default: + err = errors.New("Unsupported arch: " + dev.Arch) + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/job/mysql/inspection_job.go b/cyclone-server/src/idcos.io/cloudboot/job/mysql/inspection_job.go new file mode 100644 index 0000000000000000000000000000000000000000..d10d67ac27b74d3ed36c4c904034d12fc24f30be --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/job/mysql/inspection_job.go @@ -0,0 +1,461 @@ +package mysql + +import ( + "bufio" + "bytes" + "encoding/json" + "errors" + "fmt" + "strings" + "time" + + "runtime/debug" + "sync" + + "idcos.io/cloudboot/config" + "idcos.io/cloudboot/job" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils" + "idcos.io/cloudboot/utils/oob" + "idcos.io/cloudboot/utils/sh" +) + +// InspectionJob 硬件巡检任务 +type InspectionJob struct { + id string // 任务ID(全局唯一) + log logger.Logger + repo model.Repo + conf *config.Config + retries int +} + +// IPMIData ipmi工具巡检数据 +type IPMIData struct { + IPMISensorData []*model.SensorData + IPMISelData []*model.SelData +} + +// NewInspectionJob 实例化任务管理器 +func NewInspectionJob(log logger.Logger, repo model.Repo, conf *config.Config, jobid string) *InspectionJob { + return &InspectionJob{ + log: log, + repo: repo, + conf: conf, + id: jobid, + retries: 5, + } +} + +// Run 运行硬件巡检任务 +func (j *InspectionJob) Run() { + j.log.Infof("[%s]Inspection job starts running", j.id) + defer j.log.Infof("[%s]Inspection job completed", j.id) + + defer func() { + if err := recover(); err != nil { + j.log.Errorf("[%s]Inspection job panic: \n%s\n%s", j.id, err, debug.Stack()) + } + }() + + // 1、根据任务ID获取任务明细 + mjob, err := j.repo.GetJobByID(j.id) + if err != nil { + j.log.Error(err) + return + } + j.log.Debugf("[%s]Inspection job: %+v", j.id, mjob) + + // 2、提取出任务的目标SN列表 + var target map[string][]string + if err = json.Unmarshal([]byte(mjob.Target), &target); err != nil { + j.log.Error(err) + return + } + + // 若未指定具体的巡检设备,则巡检所有设备,过滤待退役、已退役设备 + if len(target) <= 0 { + target, _ = j.getOriginNodeDevicesPairs() + if len(target) <= 0 { + j.log.Warnf("[%s]The device to be inspected cannot be obtained. The inspection is terminated.", j.id) + return + } + } + + startTime := time.Now() + + // 3、将整体任务分解成针对各个SN的巡检子任务并持久化 + var insps []*model.Inspection + for node, sns := range target { + for _, sn := range sns { + insps = append(insps, &model.Inspection{ + JobID: j.id, + StartTime: &startTime, + OriginNode: node, + SN: sn, + RunningStatus: model.RunningStatusRunning, + HealthStatus: model.HealthStatusUnknown, + }) + } + } + if err = j.repo.AddInspections(insps...); err != nil { + j.log.Error(err) + return + } + j.log.Debugf("[%s]Save inspection records to MySQL", j.id) + + // 4、遍历巡检子任务并依次采集ipmi传感器、事件数据等后将结果持久化 + var wg sync.WaitGroup + sem := make(chan struct{}, 50) // 最多允许50个并发同时执行 + + for i := range insps { + wg.Add(1) + go func(k int) { + sem <- struct{}{} // 获取信号 + defer func() { <-sem }() // 释放信号 + j.collectThenRestore(insps[k]) + wg.Done() + }(i) + } + wg.Wait() + + // 5、若当前任务为一次性执行的任务,则将任务状态修改为'已停止'。 + if mjob.Rate == job.RateImmediately { + _ = j.repo.SaveJob(&model.Job{ + ID: j.id, + Status: job.Stoped, + }) + } + + // 6. 发送告警邮件 + //go SendNotifyByJobID(j) +} + +// translateErrMsg 错误信息翻译转换 +func (j *InspectionJob) translateErrMsg(err error) string { + switch err { + case ErrServer: + return "服务器内部错误" + case ErrDeviceSN: + return "该序列号设备不存在" + case ErrProxyIPUnreachable: + return "代理节点IP不可达" + case ErrFetchOOB: + return "带外信息缺失" + case ErrIPMIDataCollection: + return "远程采集IPMI数据失败(请检查带外IP、用户名、密码)" + case ErrCollectDataByProxy: + return "通过代理节点采集数据失败" + case ErrInvalidUAMToken: + return "请检查配置的UAM令牌是否有效" + case oob.ErrOOBIPUnreachable: + return "带外IP不可达" + case oob.ErrMissingOOBInfo: + return "带外信息(IP、用户名、密码)不完整" + case oob.ErrUsernamePassword: + return "带外用户名、密码不匹配" + case oob.ErrMissingIPMImonitoring: + return "ipmimonitoring工具未安装在服务端PATH环境变量目录下" + } + return err.Error() +} + +var ( + // ErrServer 服务器错误 + ErrServer = errors.New("internal server error") + // ErrDeviceSN 无效的设备SN + ErrDeviceSN = errors.New("invalid device SN") + // ErrProxyIPUnreachable 代理节点IP不可达 + ErrProxyIPUnreachable = errors.New("proxy ip is unreachable") + // ErrFetchOOB 无法获取设备OOB信息 + ErrFetchOOB = errors.New("oob information is not available") + // ErrIPMIDataCollection 远程采集IPMI数据失败(请检查带外用户名和密码) + ErrIPMIDataCollection = errors.New("ipmi data collection failed") + // ErrCollectDataByProxy 通过代理节点采集数据失败 + ErrCollectDataByProxy = errors.New("failed to collect data through proxy node") + // ErrInvalidUAMToken 无效的UAM令牌 + ErrInvalidUAMToken = errors.New("invalid UAM token") +) + +// collectThenRestore 采集目标设备的ipmi传感器、事件数据并持久化 +func (j *InspectionJob) collectThenRestore(insp *model.Inspection) { + defer func(insp *model.Inspection) { + // 4、巡检结果持久化 + endTime := time.Now() + insp.EndTime = &endTime + insp.RunningStatus = model.RunningStatusDone + + // 将结果保存至MySQL + j.log.Debugf("[%s]Start saving inspection results: %+v", j.id, *insp) + if affected, _ := j.repo.UpdateInspectionByID(insp); affected > 0 { + j.log.Debugf("[%s]The inspection result is saved", j.id) + } + + // 清理较旧的巡检记录 + j.log.Debugf("[%s]Start deleting old inspection results", j.id) + if err := j.repo.RemoveInspectionOnStartTimeBySN(insp.SN); err != nil { + j.log.Debugf("Old inspection result of %s is not deleted, ERR: %s ", insp.SN, err) + } else { + j.log.Debugf("Only keep few latest inspection results of %s , old record had been deleted.", insp.SN) + } + + }(insp) + + insp.HealthStatus = model.HealthStatusUnknown + + // 1、查询设备信息 + dev, err := j.repo.GetDeviceBySN(insp.SN) + if err != nil { + err = ErrDeviceSN + insp.Error = j.translateErrMsg(err) + return + } + + // 3、采集 + switch dev.Arch { + case model.DevArchX8664, model.DevArchAarch64, "": // 暂时仅支持x86_64、arm服务器 + // 获取数据 + ipmidata, err := j.fetchIPMIData(dev) + if err != nil { + insp.Error = j.translateErrMsg(err) + return + } + + // 处理传感器数据 + jsonSensorData, err := json.Marshal(ipmidata.IPMISensorData) + if err != nil { + j.log.Error(err) + insp.Error = j.translateErrMsg(ErrServer) + return + } + // 根据传感器安状态判断整体健康状况 + insp.HealthStatus = j.healthStatus(ipmidata.IPMISensorData) + insp.IPMIResult = string(jsonSensorData) + + // 处理系统事件日志 + jsonSelData, err := json.Marshal(ipmidata.IPMISelData) + if err != nil { + j.log.Error(err) + insp.Error = j.translateErrMsg(ErrServer) + return + } + insp.IPMISELResult = string(jsonSelData) + + default: + j.log.Warnf("Unsupported arch: %s", dev.Arch) + } +} + +// fetchIPMIData 获取指定设备巡检项的ipmi数据(传感器、系统事件)) +func (j *InspectionJob) fetchIPMIData(dev *model.Device) (*IPMIData, error) { + j.log.Debugf("[%s]Start collecting ipmi data for device(%s)", j.id, dev.SN) + + if dev.OOBUser == "" || dev.OOBPassword == "" { + j.log.Warnf("设备带外用户或密码为空,尝试找回,[SN:%s]", dev.SN) + history, err := j.repo.GetLastOOBHistoryBySN(dev.SN) + if err != nil { + j.log.Errorf("find back oob history by sn:%s fail,%s", dev.SN, err.Error()) + return nil, err + } + dev.OOBUser = history.UsernameNew + dev.OOBPassword = history.PasswordNew + } + if dev.SN == "" || dev.OOBUser == "" || dev.OOBPassword == "" { + j.log.Warnf("[%s]OOB information for the device(%s) is incomplete", j.id, dev.SN) + return nil, oob.ErrMissingOOBInfo + } + + oobHost := utils.GetOOBHost(dev.SN, dev.Vendor, j.conf.Server.OOBDomain) + // dns dig name后若解析到的ip与device表oob_ip字段不一致则更新入库 + oobIP := oob.TransferHostname2IP(j.log, j.repo, dev.SN, oobHost) + if oobIP == "" { + return nil, oob.ErrMissingOOBInfo + } + + pwd, err := utils.AESDecrypt(dev.OOBPassword, []byte(j.conf.Crypto.Key)) + if err != nil { + return nil, oob.ErrMissingOOBInfo + } + password := string(pwd) + + var ipmidata IPMIData + // 调用ipmimonitoring工具采集传感器数据 + sensors, err := j.ipmimonitoring(oobIP, dev.OOBUser, password) + if err != nil { + j.log.Warnf("[%s]IPMI-Sensor data collection failed", j.id) + return nil, ErrIPMIDataCollection + } + if sensors != nil { + ipmidata.IPMISensorData = sensors + } + // 调用ipmi-sel工具采集系统事件日志 + sel, err := j.ipmisel(oobIP, dev.OOBUser, password) + if err != nil { + j.log.Warnf("[%s]IPMI-Sel data collection failed", j.id) + return nil, ErrIPMIDataCollection + } + if sel != nil { + ipmidata.IPMISelData = sel + } + return &ipmidata, nil +} + +// ipmimonitoring 通过ipmimonitoring工具获取指定带外的传感器数据 +func (j *InspectionJob) ipmimonitoring(ip, username, password string) (items []*model.SensorData, err error) { + // -W authcap 各厂商实现IPMI协议存在不同,部分型号需要指定 workaround + cmd := fmt.Sprintf("ipmimonitoring --interpret-oem-data --ignore-not-available-sensors --ignore-unrecognized-events --output-sensor-state --entity-sensor-names --comma-separated-output --no-header-output -D LAN_2_0 -W authcap -h %s -u %s -p %s", ip, username, password) + out, err := sh.ExecOutputWithLog(j.log, cmd) + if err != nil { + j.log.Debugf("error of ipmimonitoring: %s", err) + return nil, err + } + + scanner := bufio.NewScanner(bytes.NewReader(out)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + fields := strings.Split(line, ",") + if len(fields) != 7 { + continue + } + items = append(items, &model.SensorData{ + ID: fields[0], + Name: fields[1], + Type: fields[2], + State: fields[3], + Reading: fields[4], + Units: fields[5], + Event: strings.Replace(fields[6], "'", "", -1), + }) + } + return items, scanner.Err() +} + +// ipmi-sel 通过ipmi-sel工具获取指定带外的系统事件日志 +func (j *InspectionJob) ipmisel(ip, username, password string) (items []*model.SelData, err error) { + // -W authcap 各厂商实现IPMI协议存在不同,部分型号需要指定 workaround + cmd := fmt.Sprintf("ipmi-sel --tail=50 --output-event-state --non-abbreviated-units --interpret-oem-data --system-event-only --comma-separated-output --no-header-output -D LAN_2_0 -W authcap -h %s -u %s -p %s", ip, username, password) + out, err := sh.ExecOutputWithLog(j.log, cmd) + if err != nil { + j.log.Debugf("error of ipmi-sel: %s", err) + return nil, err + } + + scanner := bufio.NewScanner(bytes.NewReader(out)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + fields := strings.Split(line, ",") + if len(fields) != 7 { + continue + } + items = append(items, &model.SelData{ + ID: fields[0], + Date: fields[1], + Time: fields[2], + Name: fields[3], + Type: fields[4], + State: fields[5], + Event: fields[6], + }) + } + return items, scanner.Err() +} + +// healthStatus 返回设备的健康状况。判定规则: +// 1、若未实际获取ipmi传感器数据,则该设备健康状况为未知(unknown)。 +// 2、若任意传感器包含异常(critical),则该设备健康状况为异常(critical)。 +// 3、若任意传感器都未包含异常,但存在一个或者多个传感器存在警告(warning),则该设备健康状况为警告(warning)。 +// 4、除了以上情况外,该设备健康状况为正常(nominal)。 +func (j *InspectionJob) healthStatus(items []*model.SensorData) string { + if len(items) <= 0 { + return model.HealthStatusUnknown + } + var hasWarnings bool + for _, sd := range items { + switch strings.ToLower(sd.State) { + case model.HealthStatusCritical: + return model.HealthStatusCritical + + case model.HealthStatusWarning: + hasWarnings = true + } + } + if hasWarnings { + return model.HealthStatusWarning + } + return model.HealthStatusNominal +} + +// getOriginNodeDevicesPairs 根据config文件 NODE IP 构成的键值对 +// 实现各机房管理单元NODE节点对应自身机房的SN,多个NODE节点时轮询分配 +func (j *InspectionJob) getOriginNodeDevicesPairs() (pairs map[string][]string, err error) { + devices, err := j.repo.GetCombinedDevices(nil, nil, nil) + if err != nil { + return nil, err + } + pairs = make(map[string][]string, 1) + var nodeIPs []string + var nodeIPLength int + for i := range devices { + // 忽略待退役、已退役设备 + if devices[i].OperationStatus == model.DevOperStatPreRetire || devices[i].OperationStatus == model.DevOperStatRetiring || devices[i].OperationStatus == model.DevOperStateRetired { + j.log.Debugf("Device sn %s is %s ,ignore it.", devices[i].SN, devices[i].OperationStatus) + continue + } + + if devices[i].ServerRoomID != 0 { + if nodeIPLength = len(middleware.MapDistributeNode.MDistribute[devices[i].ServerRoomID]); nodeIPLength != 0 { + nodeIPs = middleware.MapDistributeNode.MDistribute[devices[i].ServerRoomID] + _, ok := pairs[nodeIPs[i%nodeIPLength]] + if !ok { + pairs[nodeIPs[i%nodeIPLength]] = []string{} + } + pairs[nodeIPs[i%nodeIPLength]] = append(pairs[nodeIPs[i%nodeIPLength]], devices[i].SN) + } else { + _, ok := pairs["master"] + if !ok { + pairs["master"] = []string{} + } + pairs["master"] = append(pairs["master"], devices[i].SN) + } + } + } + return pairs, nil +} + + +// fetchSensors 获取指定设备巡检项的ipmi传感器数据 +func (j *InspectionJob) fetchSensors(dev *model.Device) (items []*model.SensorData, err error) { + j.log.Debugf("[%s]Start collecting sensor data for device(%s)", j.id, dev.SN) + + if dev.OOBUser == "" || dev.OOBPassword == "" { + j.log.Warnf("设备带外用户或密码为空,尝试找回,[SN:%s]", dev.SN) + history, err := j.repo.GetLastOOBHistoryBySN(dev.SN) + if err != nil { + j.log.Errorf("find back oob history by sn:%s fail,%s", dev.SN, err.Error()) + return nil, err + } + dev.OOBUser = history.UsernameNew + dev.OOBPassword = history.PasswordNew + } + if dev.SN == "" || dev.OOBUser == "" || dev.OOBPassword == "" { + j.log.Warnf("[%s]OOB information for the device(%s) is incomplete", j.id, dev.SN) + return nil, oob.ErrMissingOOBInfo + } + + oobHost := utils.GetOOBHost(dev.SN, dev.Vendor, j.conf.Server.OOBDomain) + oobIP := oob.TransferHostname2IP(j.log, j.repo, dev.SN, oobHost) + + // 调用ipmimonitoring工具采集传感器数据 + pwd, err := utils.AESDecrypt(dev.OOBPassword, []byte(j.conf.Crypto.Key)) + if err != nil { + return nil, oob.ErrMissingOOBInfo + } + password := string(pwd) + items, err = j.ipmimonitoring(oobIP, dev.OOBUser, password) + if err != nil { + j.log.Warnf("[%s]IPMI data collection failed", j.id) + return nil, ErrIPMIDataCollection + } + return items, nil +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/job/mysql/inspection_job_test.go b/cyclone-server/src/idcos.io/cloudboot/job/mysql/inspection_job_test.go new file mode 100644 index 0000000000000000000000000000000000000000..55f7a9a669b09b19417d35748bc5ad3a37805122 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/job/mysql/inspection_job_test.go @@ -0,0 +1,44 @@ +package mysql + +import ( + "encoding/json" + "io/ioutil" + "testing" + + . "github.com/smartystreets/goconvey/convey" + "idcos.io/cloudboot/model" +) + +func loadCriticalSensorDatas() (items []*model.SensorData) { + data, _ := ioutil.ReadFile("./testdata/ipmi_critical.json") + _ = json.Unmarshal(data, &items) + return items +} + +func loadNominalSensorDatas() (items []*model.SensorData) { + data, _ := ioutil.ReadFile("./testdata/ipmi_nominal.json") + _ = json.Unmarshal(data, &items) + return items +} + +func loadWarningSensorDatas() (items []*model.SensorData) { + data, _ := ioutil.ReadFile("./testdata/ipmi_warning.json") + _ = json.Unmarshal(data, &items) + return items +} +func Test_healthStatus(t *testing.T) { + Convey("ipmi检查设备健康状况", t, func() { + + criticals := loadCriticalSensorDatas() + So(criticals, ShouldNotBeEmpty) + So(new(InspectionJob).healthStatus(criticals), ShouldEqual, model.HealthStatusCritical) + + warnings := loadWarningSensorDatas() + So(warnings, ShouldNotBeEmpty) + So(new(InspectionJob).healthStatus(warnings), ShouldEqual, model.HealthStatusWarning) + + nominals := loadNominalSensorDatas() + So(nominals, ShouldNotBeEmpty) + So(new(InspectionJob).healthStatus(nominals), ShouldEqual, model.HealthStatusNominal) + }) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/job/mysql/installation_timeout_job.go b/cyclone-server/src/idcos.io/cloudboot/job/mysql/installation_timeout_job.go new file mode 100644 index 0000000000000000000000000000000000000000..b8d166c48243187d76ab61980b47469571bcce11 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/job/mysql/installation_timeout_job.go @@ -0,0 +1,81 @@ +package mysql + +import ( + "fmt" + "time" + + "idcos.io/cloudboot/config" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils/centos6" + "idcos.io/cloudboot/utils/times" +) + +// InstallationTimeoutJob 检查安装超时任务 +type InstallationTimeoutJob struct { + id string // 任务ID(全局唯一) + log logger.Logger + repo model.Repo + conf *config.Config +} + +// NewInstallationTimeoutJob 实例化任务管理器 +func NewInstallationTimeoutJob(log logger.Logger, repo model.Repo, conf *config.Config, jobid string) *InstallationTimeoutJob { + return &InstallationTimeoutJob{ + log: log, + repo: repo, + conf: conf, + id: jobid, + } +} + +// Run 运行安装超时处理任务 +func (j *InstallationTimeoutJob) Run() { + j.log.Debugf("Start checking the installation timeout") + defer j.log.Debugf("Installation timeout checking is completed") + + defer func() { + if err := recover(); err != nil { + j.log.Errorf("Installation timeout job panic: \n%s", err) + } + }() + + timeout := j.repo.GetSystemSetting4InstallatonTimeout(model.DefInstallationTimeout) + items, _ := j.repo.GetDeviceSettingsByInstallationTimeout(timeout) + if len(items) <= 0 { + j.log.Debugf("The os installation timeout device list is empty") + return + } + + now := time.Now().Format(times.DateTimeLayout) + + for i := range items { + affected, _ := j.repo.SetInstallationTimeout(items[i].SN) + if affected <= 0 { + continue + } + + if centos6.IsPXEUEFI(j.log, j.repo, items[i].SN) { + _ = centos6.DropConfigurations(j.log, j.repo, items[i].SN) // TODO 为支持centos6的UEFI方式安装而临时增加的逻辑,后续会删除。 + } + + _, _ = j.repo.UpdateDeviceBySN(&model.Device{ + SN: items[i].SN, + OperationStatus: model.DevOperStatPreDeploy, + }) + + var startTime string + if items[i].InstallationStartTime != nil { + startTime = items[i].InstallationStartTime.Format(times.DateTimeLayout) + } + + _, _ = j.repo.SaveDeviceLog(&model.DeviceLog{ + SN: items[i].SN, + DeviceSettingID: items[i].ID, + LogType: model.DeviceLogInstallType, + Title: "安装失败(超时)", + Content: fmt.Sprintf("安装始于%s,至%s超时。", startTime, now), + }) + j.log.Infof("The device(%s) has installed the os from %q and has timedout.", items[i].SN, startTime) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/job/mysql/mailsend.go b/cyclone-server/src/idcos.io/cloudboot/job/mysql/mailsend.go new file mode 100644 index 0000000000000000000000000000000000000000..ce449e2953fe447bebdd13dc15487cf68a5bbcf7 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/job/mysql/mailsend.go @@ -0,0 +1,478 @@ +package mysql + +import ( + "strings" + "github.com/jinzhu/gorm" + "idcos.io/cloudboot/utils/times" + "errors" + "encoding/base64" + "bytes" + "fmt" + "time" + "encoding/json" + + "idcos.io/cloudboot/config" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils" +) + +const ( + // 邮件任务Title + MailTitleDevicesExpired = "过保设备信息" + MailTitleDevicesPreDeploy = "待部署设备信息" +) + +// MailSendJob +type MailSendJob struct { + id string // 任务ID(全局唯一) + log logger.Logger + repo model.Repo + conf *config.Config +} + +// NewMailSendJob 实例化任务管理器 +func NewMailSendJob(log logger.Logger, repo model.Repo, conf *config.Config, jobid string) *MailSendJob { + return &MailSendJob{ + log: log, + repo: repo, + conf: conf, + id: jobid, + } +} + +// 内置任务,自动发送邮件 +// 根据job的target字段(json)进行区分发送内容 +func (j *MailSendJob) Run() { + j.log.Debugf("Start Job: Mail send") + defer j.log.Debugf("Mail send is completed") + + defer func() { + if err := recover(); err != nil { + j.log.Errorf("Mail send job panic: \n%s", err) + } + }() + + // 1、根据任务ID获取任务明细 + mjob, err := j.repo.GetJobByID(j.id) + if err != nil { + j.log.Error(err) + return + } + j.log.Debugf("[%s]MailSendJob: %+v", j.id, mjob) + + // 2、提取出邮件任务的请求参数: map [From To CC Title] []string + var target map[string][]string + if err = json.Unmarshal([]byte(mjob.Target), &target); err != nil { + j.log.Error(err) + return + } + // 校验参数 + if len(target["From"]) != 1 { + j.log.Error("发件人邮箱未定义或存在多个") + return + } + + if len(target["Title"]) != 1 { + j.log.Error("邮件标题未定义或存在多个") + return + } else { + // 3、根据邮件标题调用不同的邮件内容 + switch target["Title"][0] { + case MailTitleDevicesExpired: + if err = j.MailSendDevicesExpired(target); err != nil { + j.log.Error(err) + return + } + case MailTitleDevicesPreDeploy: + if err = j.MailSendDevicesPreDeploy(target); err != nil { + j.log.Error(err) + return + } + default: + j.log.Error("邮件任务未定义") + return + } + } +} + +//DeviceSendmailCondition 物理机邮件发送列表搜索字段 +type DeviceSendmailCondition struct { + //运营状态:运营中(需告警),运营中(无需告警),重装中,搬迁中,待退役,退役中,已退役,待部署,已上架,回收中 + OperationStatus string `json:"operation_status"` + //启用日期 + StartedAt string `json:"started_at"` + // 预部署状态物理机(没有任何安装记录的物理机)。 + //PreDeployed bool `json:"pre_deployed"` + //Page int64 `json:"-"` + //PageSize int64 `json:"-"` +} + +// 用于邮件发送的设备信息结构体,注意IP为敏感字段,不可发送 +type DeviceForSendmail struct { + //固资编号 + FixedAssetNum string `json:"fixed_asset_number"` + //序列号 + SN string `json:"sn"` + //厂商 + Vendor string `json:"vendor"` + //型号 + Model string `json:"model"` + // 硬件架构 + Arch string `json:"arch"` + //用途 + Usage string `json:"usage"` + //设备类型 + Category string `json:"category"` + // TOR + //TOR string `json:"tor"` + //硬件说明 + HardwareRemark string `json:"hardware_remark"` + //RAID说明 + //RAIDRemark string `json:"raid_remark"` + //启用时间 + StartedAt string `json:"started_at"` + //运营状态:运营中(需告警),运营中(无需告警),重装中,搬迁中,待退役,退役中,已退役,待部署,已上架,回收中 + OperationStatus string `json:"operation_status"` + //数据中心 + IDC *IDCSimplify `json:"idc"` + //机房管理单元 + ServerRoom *ServerRoomSimplify `json:"server_room"` + //机架 + ServerCabinet *ServerCabinetSimplify `json:"server_cabinet"` + //机位 + ServerUSite *ServerUSiteSimplify `json:"server_usite"` + // from DeviceLifecycle [负责人 维保截止日期 维保状态] + Owner string `json:"owner"` + MaintenanceServiceDateEnd string `json:"maintenance_service_date_end"` + MaintenanceServiceStatus string `json:"maintenance_service_status"` +} + +// IDCSimplify 数据中心信息 +type IDCSimplify struct { + //数据中心ID + ID uint `json:"id"` + //数据中心名称 + Name string `json:"name"` +} + +// ServerRoomSimplify 机房管理单元 +type ServerRoomSimplify struct { + //机房管理单元ID + ID uint `json:"id"` + //机房管理单元名称 + Name string `json:"name"` +} + +// ServerCabinetSimplify 机架 +type ServerCabinetSimplify struct { + //机架ID + ID uint `json:"id"` + //机架编号 + Number string `json:"number"` +} + +// ServerUSiteSimplify 机位 +type ServerUSiteSimplify struct { + //机位ID + ID uint `json:"id"` + //机位编号 + Number string `json:"number"` + // 物理区域 + PhysicalArea string `json:"physical_area"` +} + +// AttachmentDevices 邮件附件设备信息集合 +type AttachmentDevices []*DeviceForSendmail + +// ToTableRecords 生成用于表格显示的二维字符串切片 +func (items AttachmentDevices) ToTableRecords() (records [][]string) { + records = make([][]string, 0, len(items)) + + for i := range items { + idcName := "" + if items[i].IDC != nil { + idcName = items[i].IDC.Name + } + serverRoomName := "" + if items[i].ServerRoom != nil { + serverRoomName = items[i].ServerRoom.Name + } + serverCabinetNumber := "" + if items[i].ServerCabinet != nil { + serverCabinetNumber = items[i].ServerCabinet.Number + } + serverUsiteNumber := "" + physicalArea := "" + if items[i].ServerUSite != nil { + serverUsiteNumber = items[i].ServerUSite.Number + physicalArea = items[i].ServerUSite.PhysicalArea + } + + records = append(records, []string{ + items[i].FixedAssetNum, + items[i].SN, + items[i].Vendor, + items[i].Model, + items[i].Arch, + items[i].Usage, + items[i].Category, + items[i].HardwareRemark, + items[i].StartedAt, + items[i].OperationStatus, + idcName, + serverRoomName, + physicalArea, + serverCabinetNumber, + serverUsiteNumber, + items[i].Owner, + items[i].MaintenanceServiceDateEnd, + items[i].MaintenanceServiceStatus, + }) + } + return records +} + +// 通过 DeviceSendmailCondition 条件查询获取用于邮件发送的设备信息 +func (j *MailSendJob) GetDeviceForSendmail(log logger.Logger, repo model.Repo, cond *DeviceSendmailCondition) (rst []*DeviceForSendmail, err error) { + rst = make([]*DeviceForSendmail, 0) + if cond.StartedAt != "" { + items,err := repo.GetDeviceByStartedAt(cond.StartedAt) + if err != nil { + log.Errorf("[FAILED]获取启用日期为 %s 前的设备信息, err: %s", cond.StartedAt, err.Error()) + return nil,err + } + for i := range items { + if items[i].OperationStatus != "retired" { + item, err := convert2SendmailResult(log, repo, items[i]) + if err != nil { + return nil, err + } + if item != nil { + rst = append(rst, item) + } + } + } + return rst, nil + } else if cond.OperationStatus != "" { + items,err := repo.GetDevices(&model.Device{OperationStatus: cond.OperationStatus}, nil, nil) + if err != nil { + log.Errorf("[FAILED]获取运营状态为 %s 前的设备信息, err: %s", cond.OperationStatus, err.Error()) + return nil,err + } + for i := range items { + item, err := convert2SendmailResult(log, repo, items[i]) + if err != nil { + return nil, err + } + if item != nil { + rst = append(rst, item) + } + } + return rst, nil + } else { + return nil,err + } +} + +// 将model/device.GetDevices 的返回结果进行转换 +func convert2SendmailResult(log logger.Logger, repo model.Repo, d *model.Device) (*DeviceForSendmail, error) { + if d == nil { + return nil, nil + } + //映射运营状态:运营中(需告警),运营中(无需告警),重装中,搬迁中,待退役,退役中,已退役,待部署,已上架,回收中' + OperationStatusMap :=map[string]string { + "run_with_alarm":"运营中(需告警)", + "run_without_alarm":"运营中(无需告警)", + "reinstalling":"重装中", + "moving":"搬迁中", + "pre_retire":"待退役", + "retiring":"退役中", + "retired":"已退役", + "pre_deploy":"待部署", + "on_shelve":"已上架", + "recycling":"回收中", + } + // 维保状态枚举值:在保-under_warranty;过保-out_of_warranty;未激活-inactive' + MaintenanceServiceStatusMap :=map[string]string { + "under_warranty":"在保", + "out_of_warranty":"过保", + "inactive":"未激活", + } + + result := DeviceForSendmail{ + FixedAssetNum: d.FixedAssetNumber, + SN: d.SN, + Vendor: d.Vendor, + Model: d.DevModel, + Arch: d.Arch, + Usage: d.Usage, + Category: d.Category, + HardwareRemark: d.HardwareRemark, + StartedAt: times.ISOTime(d.StartedAt).ToDateStr(), + OperationStatus: OperationStatusMap[d.OperationStatus], + IDC: &IDCSimplify{ID: d.IDCID}, + ServerRoom: &ServerRoomSimplify{ID: d.ServerRoomID}, + ServerCabinet: &ServerCabinetSimplify{ID: d.CabinetID}, + } + + idc, err := repo.GetIDCByID(d.IDCID) + if err != nil && err != gorm.ErrRecordNotFound { + return nil, err + } + if idc != nil { + result.IDC.Name = idc.Name + } + + sroom, err := repo.GetServerRoomByID(d.ServerRoomID) + if err != nil && err != gorm.ErrRecordNotFound { + return nil, err + } + if sroom != nil { + result.ServerRoom.Name = sroom.Name + } + + if cabinet, err := repo.GetServerCabinetByID(d.CabinetID); err == nil { + result.ServerCabinet.Number = cabinet.Number + } + + if d.USiteID != nil { + result.ServerUSite = &ServerUSiteSimplify{ID: *d.USiteID} + if u, err := repo.GetServerUSiteByID(*d.USiteID); err == nil { + result.ServerUSite.Number = u.Number + result.ServerUSite.PhysicalArea = u.PhysicalArea + } + } + + // DeviceLifecycle 查询是否已经存在 + devLifecycle, err := repo.GetDeviceLifecycleBySN(d.SN) + if err != nil && err != gorm.ErrRecordNotFound { + return nil, err + } + if devLifecycle != nil { + result.Owner = devLifecycle.Owner + result.MaintenanceServiceDateEnd = times.ISOTime(devLifecycle.MaintenanceServiceDateEnd).ToDateStr() + result.MaintenanceServiceStatus = MaintenanceServiceStatusMap[devLifecycle.MaintenanceServiceStatus] + } else { + result.Owner = "Undefined" + result.MaintenanceServiceDateEnd = "Undefined" + result.MaintenanceServiceStatus = "Undefined" + } + return &result, nil +} + +// 邮件Title:"过保设备信息" 内容:发送启用日期 >= 4.5 year 设备信息 +func (j *MailSendJob) MailSendDevicesExpired(smq map[string][]string) (err error) { + + sendmailreq := middleware.SendMailReq { + From: strings.Join(smq["From"],";"), + To: strings.Join(smq["To"],";"), + CC: strings.Join(smq["CC"],";"), + Title: strings.Join(smq["Title"],"-"), + BodyFormat: "1", + Priority: "1", + } + + //根据 now 获取 4.5 年前的日期并作为‘启用日期’条件查询设备 + currentTime := time.Now() + pastTime := currentTime.AddDate(-4, -6, 0).Format("2006-01-02") + var cond DeviceSendmailCondition + cond.StartedAt = pastTime + + // 根据启用日期条件获取 4.5 前的设备信息 + deviceData,err := j.GetDeviceForSendmail(j.log, j.repo, &cond) + if err != nil { + j.log.Errorf("获取启用日期大于4.5年的设备信息失败, err: %s", err.Error()) + return err + } + + if len(deviceData) == 0 { + j.log.Error("启用日期大于4.5年的设备数量为: 0") + return errors.New("启用日期大于4.5年的设备数量为: 0") + } + j.log.Debugf("启用日期大于4.5年的设备数量为: %v", len(deviceData)) + sendmailreq.Content = fmt.Sprintf("[From Dolphin] 共计 %v 台设备启用日期大于4.5年,详细信息见附件。", len(deviceData)) + + // 设备信息写入buffer + file, err := utils.WriteToXLSX(utils.FileDeviceSendMail, AttachmentDevices(deviceData).ToTableRecords()) + if err != nil { + j.log.Errorf("设备信息生成xls失败, err: %s", err.Error()) + return err + } + buf := bytes.Buffer{} + err = file.Write(&buf) + if err != nil { + return err + } + + //读取buffer内容并编码 作为附件发送 + bufferRead := buf.Bytes() + // 附件的参数格式: [{"name": "device_expire.xlsx", "Data": base64data}] + base64data := base64.StdEncoding.EncodeToString(bufferRead) + sendmailreq.Attachments = []middleware.MailAttachment {{Name:"device_expire.xlsx", Data:base64data}} + + + //调用邮件发送api请求 + err = middleware.SendMail(j.log, j.repo, j.conf, &sendmailreq) + if err != nil { + j.log.Errorf("SendMail fail, err: %s", err.Error()) + return err + } + return nil +} + +// 触发邮件发送,发送待部署状态设备信息通知一线进行处理 +func (j *MailSendJob) MailSendDevicesPreDeploy(smq map[string][]string) (err error) { + + sendmailreq := middleware.SendMailReq { + From: strings.Join(smq["From"],";"), + To: strings.Join(smq["To"],";"), + CC: strings.Join(smq["CC"],";"), + Title: strings.Join(smq["Title"],"-"), + BodyFormat: "1", + Priority: "1", + } + + // 获取运营状态为待部署设备信息 + var cond DeviceSendmailCondition + cond.OperationStatus = "pre_deploy" + deviceData,err := j.GetDeviceForSendmail(j.log, j.repo, &cond) + if err != nil { + j.log.Errorf("get pre_deploy devices fail,%v", err) + return err + } + + if len(deviceData) == 0 { + j.log.Error("状态为待部署的设备数量为: 0") + return errors.New("状态为待部署的设备数量为: 0") + } + j.log.Debugf("状态为待部署的设备数量为: %v", len(deviceData)) + sendmailreq.Content = fmt.Sprintf("From dolphin 共计 %v 台设备,详细信息见附件。", len(deviceData)) + + // 设备信息写入buffer + file, err := utils.WriteToXLSX(utils.FileDeviceSendMail, AttachmentDevices(deviceData).ToTableRecords()) + if err != nil { + j.log.Errorf("[FAILED]设备信息生成xlsx, err: %s", err.Error()) + return err + } + buf := bytes.Buffer{} + err = file.Write(&buf) + if err != nil { + return err + } + + //读取buffer内容并编码 作为附件发送 + bufferRead := buf.Bytes() + // 附件的参数格式: [{"name": "device_pre_deploy.xlsx", "Data": base64data}] + base64data := base64.StdEncoding.EncodeToString(bufferRead) + sendmailreq.Attachments = []middleware.MailAttachment {{Name:"device_pre_deploy.xlsx", Data:base64data}} + + //调用邮件发送api请求 + err = middleware.SendMail(j.log, j.repo, j.conf, &sendmailreq) + if err != nil { + j.log.Errorf("SendMail fail, err: %s", err.Error()) + return err + } + return nil +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/job/mysql/manager.go b/cyclone-server/src/idcos.io/cloudboot/job/mysql/manager.go new file mode 100644 index 0000000000000000000000000000000000000000..817e135b4ecb656731a89e21aa66fdffe7c10b60 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/job/mysql/manager.go @@ -0,0 +1,345 @@ +package mysql + +import ( + "encoding/json" + "sync" + "time" + + "github.com/jakecoffman/cron" + "github.com/jinzhu/gorm" + "github.com/voidint/page" + + "idcos.io/cloudboot/config" + "idcos.io/cloudboot/job" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" +) + +// JobManager MySQL实现的任务管理器 +type JobManager struct { + log logger.Logger + repo model.Repo + conf *config.Config + runner *cron.Cron + once sync.Once +} + +// NewJobManager 实例化任务管理器 +func NewJobManager(log logger.Logger, repo model.Repo, conf *config.Config) job.Manager { + runner := cron.New() + if runner != nil { + runner.Start() + return &JobManager{ + log: log, + repo: repo, + conf: conf, + runner: runner, + } + } else { + log.Errorf("Failed to new cron.Cron pointer.") + return nil + } +} + +// Rebuild 重建/恢复任务(用于系统重启场景) +func (mgr *JobManager) Rebuild() error { + mgr.log.Info("Start rebuilding jobs") + defer mgr.log.Info("End job rebuilding") + + cond := model.Job{ + Rate: job.RateFixedRate, // 仅重建周期性任务 + } + items, err := mgr.repo.GetJobs(&cond, nil, nil) + if err != nil { + return err + } + + for i := range items { + if items[i] == nil || items[i].Cron == "" || items[i].Status != job.Running { + continue + } + mgr.log.Infof("Job(%s) begins to rebuild", items[i].ID) + + var target map[string][]string + if items[i].Target != "" { + if err = json.Unmarshal([]byte(items[i].Target), &target); err != nil { + mgr.log.Error(err) + continue + } + } + newJob := job.Job{ + ID: items[i].ID, + Builtin: items[i].Builtin, + Title: items[i].Title, + Category: items[i].Category, + Rate: items[i].Rate, + CronExpression: items[i].Cron, + CronRender: items[i].CronRender, + Creator: items[i].Creator, + Target: target, + Status: job.Running, + } + + switch items[i].Category { + case job.CategoryInspection: // 重建硬件巡检任务 + newJob.CronJob = NewInspectionJob(mgr.log, mgr.repo, mgr.conf, items[i].ID) + case job.CategoryInstallationTime: // 重建安装超时处理任务 + newJob.CronJob = NewInstallationTimeoutJob(mgr.log, mgr.repo, mgr.conf, items[i].ID) + case job.CategoryReleaseIP: // 重建释放IP任务 + newJob.CronJob = NewReleaseIPJob(mgr.log, mgr.repo, mgr.conf, items[i].ID) + case job.CategoryAutoDeploy: // 重建自动部署任务 + newJob.CronJob = NewAutoDeployJob(mgr.log, mgr.repo, mgr.conf, items[i].ID) + case job.CategoryMailSend: // 重建邮件推送任务 + newJob.CronJob = NewMailSendJob(mgr.log, mgr.repo, mgr.conf, items[i].ID) + case job.CategoryUpdateDeviceLifecycle: + newJob.CronJob = NewUpdateDeviceLifecycleJob(mgr.log, mgr.repo, mgr.conf, items[i].ID) + } + + if err = mgr.Submit(&newJob); err != nil { + mgr.log.Warnf("Job(%s) rebuild failed", items[i].ID) + continue + } + mgr.log.Infof("Job(%s) rebuilt successfully", items[i].ID) + } + return nil +} + +// Stop 停止任务管理器 +func (mgr *JobManager) Stop() error { + mgr.once.Do(func() { + mgr.log.Infof("Stop job manager") + mgr.runner.Stop() + }) + return nil +} + +// Submit 向任务管理器提交任务 +func (mgr *JobManager) Submit(cjob *job.Job) (err error) { + mgr.log.Infof("Submit job(%s)", cjob.ID) + + // 1、将任务写入job表进行持久化 + newJob := model.Job{ + ID: cjob.ID, + Title: cjob.Title, + Builtin: cjob.Builtin, + Category: cjob.Category, + Rate: cjob.Rate, + Cron: cjob.CronExpression, + CronRender: cjob.CronRender, + Status: job.Running, // 提交后任务状态改为'运行中' + Creator: cjob.Creator, + } + + if cjob.Rate == job.RateImmediately { + now := time.Now() + newJob.NextRunTime = &now + } + if btarget, _ := json.Marshal(cjob.Target); btarget != nil { + newJob.Target = string(btarget) + } + + if err = mgr.repo.SaveJob(&newJob); err != nil { + return err + } + + // 2、将任务提交至任务执行器进行调度执行 + switch cjob.Rate { + case job.RateImmediately: + go cjob.CronJob.Run() // TODO 控制协程数量及执行超时时间 + + case job.RateFixedRate: + mgr.runner.AddJob(cjob.CronExpression, cjob.CronJob, cjob.ID) + } + return nil +} + +// Remove 移除指定ID的任务。若该任务已经开始运行,则此操作不会有任何效果。 +func (mgr *JobManager) Remove(jobid string) (err error) { + mgr.log.Infof("Remove job(id=%s)", jobid) + + // 1、校验任务ID有效性 + mjob, err := mgr.validJob(jobid) + if err != nil { + return err + } + + // 内置任务不能删除 + if mjob.Builtin == job.Builtin { + return job.ErrRemoveBuiltinJob + } + + // 2、将指定ID的任务标记为'已删除' + if err = mgr.repo.SaveJob(&model.Job{ + ID: jobid, + Status: job.Deleted, + }); err != nil { + return err + } + + // 3、从任务执行器中移除指定ID的任务 + mgr.runner.RemoveJob(jobid) + return nil +} + +// Pause 暂停指定ID的任务 +func (mgr *JobManager) Pause(jobid string) error { + mgr.log.Infof("Pause job(id=%s)", jobid) + + // 1、校验任务ID有效性 + mjob, err := mgr.validJob(jobid) + if err != nil { + return err + } + + // 非运行中的定时任务都无法暂停 + if mjob.Rate != job.RateFixedRate || mjob.Status != job.Running { + return job.ErrPauseJob + } + + // 2、将指定ID的任务标记为'暂停' + if err = mgr.repo.SaveJob(&model.Job{ + ID: jobid, + Status: job.Paused, + }); err != nil { + return err + } + + // 3、从任务执行器中移除指定ID的任务 + mgr.runner.RemoveJob(jobid) + return nil +} + +// Unpause 继续指定ID的任务 +func (mgr *JobManager) Unpause(jobid string) error { + mgr.log.Infof("Unpause job(id=%s)", jobid) + + // 1、校验任务ID有效性 + mjob, err := mgr.validJob(jobid) + if err != nil { + return err + } + + // 非暂停的定时任务都无法继续 + if mjob.Rate != job.RateFixedRate || mjob.Status != job.Paused { + return job.ErrUnpauseJob + } + + // 2、将指定ID的任务标记为'运行中' + if err = mgr.repo.SaveJob(&model.Job{ + ID: jobid, + Status: job.Running, + }); err != nil { + return err + } + + // 3、将任务重新提交至任务执行器进行调度执行 + var newjob cron.Job + switch mjob.Category { + case job.CategoryInspection: // 重启硬件巡检任务 + newjob = NewInspectionJob(mgr.log, mgr.repo, mgr.conf, mjob.ID) + case job.CategoryInstallationTime: // 重启安装超时处理任务 + newjob = NewInstallationTimeoutJob(mgr.log, mgr.repo, mgr.conf, mjob.ID) + case job.CategoryReleaseIP: // 重启释放IP任务 + newjob = NewReleaseIPJob(mgr.log, mgr.repo, mgr.conf, mjob.ID) + case job.CategoryAutoDeploy: // 重启自动部署任务 + newjob = NewAutoDeployJob(mgr.log, mgr.repo, mgr.conf, mjob.ID) + case job.CategoryMailSend: // 重启邮件推送任务 + newjob = NewMailSendJob(mgr.log, mgr.repo, mgr.conf, mjob.ID) + case job.CategoryUpdateDeviceLifecycle: + newjob = NewUpdateDeviceLifecycleJob(mgr.log, mgr.repo, mgr.conf, mjob.ID) + } + + mgr.runner.AddJob(mjob.Cron, newjob, mjob.ID) + return nil +} + +// GetJobByID 返回指定ID的任务的一份拷贝 +func (mgr *JobManager) GetJobByID(jobid string) (*job.Job, error) { + mjob, err := mgr.validJob(jobid) + if err != nil { + return nil, err + } + var target map[string][]string + if mjob.Target != "" { + if err = json.Unmarshal([]byte(mjob.Target), &target); err != nil { + mgr.log.Error(err) + } + } + return &job.Job{ + ID: mjob.ID, + Creator: mjob.Creator, + Builtin: mjob.Builtin, + Title: mjob.Title, + Category: mjob.Category, + Rate: mjob.Rate, + CronExpression: mjob.Cron, + CronRender: mjob.CronRender, + Target: target, + Status: mjob.Status, + CreatedAt: mjob.CreatedAt, + UpdatedAt: mjob.UpdatedAt, + }, nil +} + +// GetJobs 返回指定分页的任务列表 +func (mgr *JobManager) GetJobs(cond *job.Job, pageNo, pageSize int64) (totalRecords int64, jobs []*job.Job, err error) { + if pageNo <= 0 { + pageNo = 1 + } + if pageSize <= 0 { + pageSize = 10 + } + + mcond := model.Job{ + Builtin: cond.Builtin, + Title: cond.Title, + Category: cond.Category, + Rate: cond.Rate, + Status: cond.Status, + Creator: cond.Creator, + } + totalRecords, err = mgr.repo.CountJobs(&mcond) + if err != nil { + return 0, nil, err + } + + items, err := mgr.repo.GetJobs(&mcond, model.OneOrderBy("updated_at", model.DESC), &page.Limiter{ + Limit: pageSize, + Offset: (pageNo - 1) * pageSize, + }) + if err != nil { + return 0, nil, err + } + for _, item := range items { + var target map[string][]string + if item.Target != "" { + if err = json.Unmarshal([]byte(item.Target), &target); err != nil { + mgr.log.Error(err) + } + } + jobs = append(jobs, &job.Job{ + ID: item.ID, + Creator: item.Creator, + Builtin: item.Builtin, + Title: item.Title, + Category: item.Category, + Rate: item.Rate, + CronExpression: item.Cron, + CronRender: item.CronRender, + Status: item.Status, + Target: target, + CreatedAt: item.CreatedAt, + UpdatedAt: item.UpdatedAt, + }) + } + return totalRecords, jobs, nil +} + +// validJob 校验任务的有效性,若指定ID是有效的任务ID,则返回该任务对象。 +func (mgr *JobManager) validJob(jobid string) (mjob *model.Job, err error) { + mjob, err = mgr.repo.GetJobByID(jobid) + if gorm.IsRecordNotFoundError(err) { + return nil, job.ErrInvalidJobID + } + return mjob, err +} diff --git a/cyclone-server/src/idcos.io/cloudboot/job/mysql/release_ip_job.go b/cyclone-server/src/idcos.io/cloudboot/job/mysql/release_ip_job.go new file mode 100644 index 0000000000000000000000000000000000000000..7f3aebc1146ebe45ac2fd4ab27a34e9b77761fe3 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/job/mysql/release_ip_job.go @@ -0,0 +1,54 @@ +package mysql + +import ( + "idcos.io/cloudboot/config" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" +) + +// ReleaseIPJob 释放IP任务 +type ReleaseIPJob struct { + id string // 任务ID(全局唯一) + log logger.Logger + repo model.Repo + conf *config.Config +} + +// NewReleaseIPJob 实例化任务管理器 +func NewReleaseIPJob(log logger.Logger, repo model.Repo, conf *config.Config, jobid string) *ReleaseIPJob { + return &ReleaseIPJob{ + log: log, + repo: repo, + conf: conf, + id: jobid, + } +} + +// Run 运行IP释放任务 +// 内置任务,根据release_date 将 disabled的IP 置为空闲 +func (j *ReleaseIPJob) Run() { + j.log.Debugf("Start checking the IP release date") + defer j.log.Debugf("IP release date checking is completed") + + defer func() { + if err := recover(); err != nil { + j.log.Errorf("IP release job panic: \n%s", err) + } + }() + + items, _ := j.repo.GetReleasableIP() + if len(items) <= 0 { + j.log.Debugf("The releasable IP list is empty") + return + } + + for i := range items { + items[i].IsUsed = model.IPNotUsed + _, err := j.repo.SaveIP(items[i]) + if err != nil { + j.log.Errorf("IP %s release fail %s .", items[i].IP, err) + continue + } + j.log.Infof("IP %s has been released .", items[i].IP) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/job/mysql/testdata/ipmi_critical.json b/cyclone-server/src/idcos.io/cloudboot/job/mysql/testdata/ipmi_critical.json new file mode 100644 index 0000000000000000000000000000000000000000..1865452b3956318d0ae73de8c98f2b7378969d3b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/job/mysql/testdata/ipmi_critical.json @@ -0,0 +1,385 @@ +[{ + "id": "0", + "name": "System Chassis 1 UID Light", + "type": "OEM Reserved", + "event": "'OEM Event = 0000h'", + "state": "N/A", + "units": "N/A", + "reading": "N/A" +}, { + "id": "1", + "name": "System Chassis 2 Sys. Health LED", + "type": "OEM Reserved", + "event": "'OEM Event = 0000h'", + "state": "N/A", + "units": "N/A", + "reading": "N/A" +}, { + "id": "2", + "name": "Power Supply 1 Power Supply 1", + "type": "Power Supply", + "event": "'Presence detected'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "3", + "name": "Power Supply 2 Power Supply 2", + "type": "Power Supply", + "event": "'Presence detected'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "4", + "name": "Power Supply 3 Power Supplies", + "type": "Power Supply", + "event": "'Fully Redundant'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "6", + "name": "System Board 1 Fan 1", + "type": "Fan", + "event": "'transition to Running'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "7", + "name": "System Board 2 Fan 2", + "type": "Fan", + "event": "'transition to Running'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "8", + "name": "System Board 3 Fan 3", + "type": "Fan", + "event": "'transition to Running'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "9", + "name": "System Board 4 Fan 4", + "type": "Fan", + "event": "'transition to Running'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "10", + "name": "System Board 5 Fan 5", + "type": "Fan", + "event": "'transition to Running'", + "state": "Warning", + "units": "N/A", + "reading": "N/A" +}, { + "id": "11", + "name": "System Board 6 Fan 6", + "type": "Fan", + "event": "'transition to Degraded'", + "state": "Critical", + "units": "N/A", + "reading": "N/A" +}, { + "id": "12", + "name": "System Board 7 Fan 7", + "type": "Fan", + "event": "'transition to Running'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "13", + "name": "System Board 8 Fan 8", + "type": "Fan", + "event": "'transition to Running'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "14", + "name": "System Board 9 Fans", + "type": "Fan", + "event": "'Non-redundant:Sufficient Resources from Redundant'", + "state": "Critical", + "units": "N/A", + "reading": "N/A" +}, { + "id": "16", + "name": "Air Inlet 01-Inlet Ambient", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "17.00" +}, { + "id": "17", + "name": "Processor 1 02-CPU 1", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "40.00" +}, { + "id": "18", + "name": "Processor 2 03-CPU 2", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "40.00" +}, { + "id": "19", + "name": "Memory Device 1 04-P1 DIMM 1-6", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "22.00" +}, { + "id": "20", + "name": "Memory Device 2 05-P2 DIMM 1-6", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "24.00" +}, { + "id": "21", + "name": "Memory Device 3 06-P1 Mem Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "22.00" +}, { + "id": "22", + "name": "Memory Device 4 07-P1 Mem Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "23.00" +}, { + "id": "23", + "name": "Memory Device 5 08-P1 Mem Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "23.00" +}, { + "id": "24", + "name": "Memory Device 6 09-P2 Mem Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "22.00" +}, { + "id": "25", + "name": "Memory Device 7 10-P2 Mem Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "23.00" +}, { + "id": "26", + "name": "Memory Device 8 11-P2 Mem Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "23.00" +}, { + "id": "28", + "name": "System Board 1 13-Chipset", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "44.00" +}, { + "id": "29", + "name": "System Board 2 14-Chipset Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "28.00" +}, { + "id": "30", + "name": "Power Supply 4 15-P/S 1", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "0.00" +}, { + "id": "31", + "name": "Power Supply 5 16-P/S 2", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "0.00" +}, { + "id": "32", + "name": "Power Supply 6 17-P/S 1 Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "23.00" +}, { + "id": "33", + "name": "Power Supply 7 18-P/S 2 Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "23.00" +}, { + "id": "34", + "name": "Power Unit 1 19-VR P1", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "24.00" +}, { + "id": "35", + "name": "Power Unit 2 20-VR P2", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "24.00" +}, { + "id": "36", + "name": "Power Unit 3 21-VR P1 Mem", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "25.00" +}, { + "id": "37", + "name": "Power Unit 4 22-VR P2 Mem", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "25.00" +}, { + "id": "39", + "name": "System Board 3 24-HD Controller", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "40.00" +}, { + "id": "40", + "name": "System Board 4 25-HD Cntlr Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "30.00" +}, { + "id": "41", + "name": "System Management Module 26-iLO LOM", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "29.00" +}, { + "id": "43", + "name": "System Board 6 28-LOM Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "23.00" +}, { + "id": "46", + "name": "System Internal Expansion Board 1 31-PCI 1 Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "25.00" +}, { + "id": "47", + "name": "System Internal Expansion Board 2 32-PCI 2 Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "21.00" +}, { + "id": "48", + "name": "System Board 7 33-System Board", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "26.00" +}, { + "id": "49", + "name": "System Board 8 34-System Board", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "24.00" +}, { + "id": "50", + "name": "System Board 9 35-System Board", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "26.00" +}, { + "id": "51", + "name": "System Board 10 36-Sys Exhaust", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "25.00" +}, { + "id": "52", + "name": "System Board 11 37-Sys Exhaust", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "24.00" +}, { + "id": "53", + "name": "System Board 10 Memory", + "type": "Memory", + "event": "'Presence detected'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "54", + "name": "System Board 11 Power Meter", + "type": "Current", + "event": "'Device Enabled'", + "state": "N/A", + "units": "N/A", + "reading": "N/A" +}] \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/job/mysql/testdata/ipmi_nominal.json b/cyclone-server/src/idcos.io/cloudboot/job/mysql/testdata/ipmi_nominal.json new file mode 100644 index 0000000000000000000000000000000000000000..776406e95a482287192bd695fa6e450ef4c4439b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/job/mysql/testdata/ipmi_nominal.json @@ -0,0 +1,385 @@ +[{ + "id": "0", + "name": "System Chassis 1 UID Light", + "type": "OEM Reserved", + "event": "'OEM Event = 0000h'", + "state": "N/A", + "units": "N/A", + "reading": "N/A" +}, { + "id": "1", + "name": "System Chassis 2 Sys. Health LED", + "type": "OEM Reserved", + "event": "'OEM Event = 0000h'", + "state": "N/A", + "units": "N/A", + "reading": "N/A" +}, { + "id": "2", + "name": "Power Supply 1 Power Supply 1", + "type": "Power Supply", + "event": "'Presence detected'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "3", + "name": "Power Supply 2 Power Supply 2", + "type": "Power Supply", + "event": "'Presence detected'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "4", + "name": "Power Supply 3 Power Supplies", + "type": "Power Supply", + "event": "'Fully Redundant'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "6", + "name": "System Board 1 Fan 1", + "type": "Fan", + "event": "'transition to Running'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "7", + "name": "System Board 2 Fan 2", + "type": "Fan", + "event": "'transition to Running'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "8", + "name": "System Board 3 Fan 3", + "type": "Fan", + "event": "'transition to Running'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "9", + "name": "System Board 4 Fan 4", + "type": "Fan", + "event": "'transition to Running'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "10", + "name": "System Board 5 Fan 5", + "type": "Fan", + "event": "'transition to Running'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "11", + "name": "System Board 6 Fan 6", + "type": "Fan", + "event": "'transition to Degraded'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "12", + "name": "System Board 7 Fan 7", + "type": "Fan", + "event": "'transition to Running'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "13", + "name": "System Board 8 Fan 8", + "type": "Fan", + "event": "'transition to Running'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "14", + "name": "System Board 9 Fans", + "type": "Fan", + "event": "'Non-redundant:Sufficient Resources from Redundant'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "16", + "name": "Air Inlet 01-Inlet Ambient", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "17.00" +}, { + "id": "17", + "name": "Processor 1 02-CPU 1", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "40.00" +}, { + "id": "18", + "name": "Processor 2 03-CPU 2", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "40.00" +}, { + "id": "19", + "name": "Memory Device 1 04-P1 DIMM 1-6", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "22.00" +}, { + "id": "20", + "name": "Memory Device 2 05-P2 DIMM 1-6", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "24.00" +}, { + "id": "21", + "name": "Memory Device 3 06-P1 Mem Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "22.00" +}, { + "id": "22", + "name": "Memory Device 4 07-P1 Mem Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "23.00" +}, { + "id": "23", + "name": "Memory Device 5 08-P1 Mem Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "23.00" +}, { + "id": "24", + "name": "Memory Device 6 09-P2 Mem Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "22.00" +}, { + "id": "25", + "name": "Memory Device 7 10-P2 Mem Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "23.00" +}, { + "id": "26", + "name": "Memory Device 8 11-P2 Mem Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "23.00" +}, { + "id": "28", + "name": "System Board 1 13-Chipset", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "44.00" +}, { + "id": "29", + "name": "System Board 2 14-Chipset Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "28.00" +}, { + "id": "30", + "name": "Power Supply 4 15-P/S 1", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "0.00" +}, { + "id": "31", + "name": "Power Supply 5 16-P/S 2", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "0.00" +}, { + "id": "32", + "name": "Power Supply 6 17-P/S 1 Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "23.00" +}, { + "id": "33", + "name": "Power Supply 7 18-P/S 2 Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "23.00" +}, { + "id": "34", + "name": "Power Unit 1 19-VR P1", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "24.00" +}, { + "id": "35", + "name": "Power Unit 2 20-VR P2", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "24.00" +}, { + "id": "36", + "name": "Power Unit 3 21-VR P1 Mem", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "25.00" +}, { + "id": "37", + "name": "Power Unit 4 22-VR P2 Mem", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "25.00" +}, { + "id": "39", + "name": "System Board 3 24-HD Controller", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "40.00" +}, { + "id": "40", + "name": "System Board 4 25-HD Cntlr Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "30.00" +}, { + "id": "41", + "name": "System Management Module 26-iLO LOM", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "29.00" +}, { + "id": "43", + "name": "System Board 6 28-LOM Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "23.00" +}, { + "id": "46", + "name": "System Internal Expansion Board 1 31-PCI 1 Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "25.00" +}, { + "id": "47", + "name": "System Internal Expansion Board 2 32-PCI 2 Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "21.00" +}, { + "id": "48", + "name": "System Board 7 33-System Board", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "26.00" +}, { + "id": "49", + "name": "System Board 8 34-System Board", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "24.00" +}, { + "id": "50", + "name": "System Board 9 35-System Board", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "26.00" +}, { + "id": "51", + "name": "System Board 10 36-Sys Exhaust", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "25.00" +}, { + "id": "52", + "name": "System Board 11 37-Sys Exhaust", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "24.00" +}, { + "id": "53", + "name": "System Board 10 Memory", + "type": "Memory", + "event": "'Presence detected'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "54", + "name": "System Board 11 Power Meter", + "type": "Current", + "event": "'Device Enabled'", + "state": "N/A", + "units": "N/A", + "reading": "N/A" +}] \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/job/mysql/testdata/ipmi_warning.json b/cyclone-server/src/idcos.io/cloudboot/job/mysql/testdata/ipmi_warning.json new file mode 100644 index 0000000000000000000000000000000000000000..8b03532fde3a02270d78fb9775f68730c9a475cd --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/job/mysql/testdata/ipmi_warning.json @@ -0,0 +1,385 @@ +[{ + "id": "0", + "name": "System Chassis 1 UID Light", + "type": "OEM Reserved", + "event": "'OEM Event = 0000h'", + "state": "N/A", + "units": "N/A", + "reading": "N/A" +}, { + "id": "1", + "name": "System Chassis 2 Sys. Health LED", + "type": "OEM Reserved", + "event": "'OEM Event = 0000h'", + "state": "N/A", + "units": "N/A", + "reading": "N/A" +}, { + "id": "2", + "name": "Power Supply 1 Power Supply 1", + "type": "Power Supply", + "event": "'Presence detected'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "3", + "name": "Power Supply 2 Power Supply 2", + "type": "Power Supply", + "event": "'Presence detected'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "4", + "name": "Power Supply 3 Power Supplies", + "type": "Power Supply", + "event": "'Fully Redundant'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "6", + "name": "System Board 1 Fan 1", + "type": "Fan", + "event": "'transition to Running'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "7", + "name": "System Board 2 Fan 2", + "type": "Fan", + "event": "'transition to Running'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "8", + "name": "System Board 3 Fan 3", + "type": "Fan", + "event": "'transition to Running'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "9", + "name": "System Board 4 Fan 4", + "type": "Fan", + "event": "'transition to Running'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "10", + "name": "System Board 5 Fan 5", + "type": "Fan", + "event": "'transition to Running'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "11", + "name": "System Board 6 Fan 6", + "type": "Fan", + "event": "'transition to Degraded'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "12", + "name": "System Board 7 Fan 7", + "type": "Fan", + "event": "'transition to Running'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "13", + "name": "System Board 8 Fan 8", + "type": "Fan", + "event": "'transition to Running'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "14", + "name": "System Board 9 Fans", + "type": "Fan", + "event": "'Non-redundant:Sufficient Resources from Redundant'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "16", + "name": "Air Inlet 01-Inlet Ambient", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "17.00" +}, { + "id": "17", + "name": "Processor 1 02-CPU 1", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "40.00" +}, { + "id": "18", + "name": "Processor 2 03-CPU 2", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "40.00" +}, { + "id": "19", + "name": "Memory Device 1 04-P1 DIMM 1-6", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "22.00" +}, { + "id": "20", + "name": "Memory Device 2 05-P2 DIMM 1-6", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "24.00" +}, { + "id": "21", + "name": "Memory Device 3 06-P1 Mem Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "22.00" +}, { + "id": "22", + "name": "Memory Device 4 07-P1 Mem Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "23.00" +}, { + "id": "23", + "name": "Memory Device 5 08-P1 Mem Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "23.00" +}, { + "id": "24", + "name": "Memory Device 6 09-P2 Mem Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "22.00" +}, { + "id": "25", + "name": "Memory Device 7 10-P2 Mem Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "23.00" +}, { + "id": "26", + "name": "Memory Device 8 11-P2 Mem Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "23.00" +}, { + "id": "28", + "name": "System Board 1 13-Chipset", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "44.00" +}, { + "id": "29", + "name": "System Board 2 14-Chipset Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "28.00" +}, { + "id": "30", + "name": "Power Supply 4 15-P/S 1", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "0.00" +}, { + "id": "31", + "name": "Power Supply 5 16-P/S 2", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "0.00" +}, { + "id": "32", + "name": "Power Supply 6 17-P/S 1 Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "23.00" +}, { + "id": "33", + "name": "Power Supply 7 18-P/S 2 Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "23.00" +}, { + "id": "34", + "name": "Power Unit 1 19-VR P1", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "24.00" +}, { + "id": "35", + "name": "Power Unit 2 20-VR P2", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "24.00" +}, { + "id": "36", + "name": "Power Unit 3 21-VR P1 Mem", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "25.00" +}, { + "id": "37", + "name": "Power Unit 4 22-VR P2 Mem", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "25.00" +}, { + "id": "39", + "name": "System Board 3 24-HD Controller", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "40.00" +}, { + "id": "40", + "name": "System Board 4 25-HD Cntlr Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "30.00" +}, { + "id": "41", + "name": "System Management Module 26-iLO LOM", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "29.00" +}, { + "id": "43", + "name": "System Board 6 28-LOM Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "23.00" +}, { + "id": "46", + "name": "System Internal Expansion Board 1 31-PCI 1 Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "25.00" +}, { + "id": "47", + "name": "System Internal Expansion Board 2 32-PCI 2 Zone", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "21.00" +}, { + "id": "48", + "name": "System Board 7 33-System Board", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "26.00" +}, { + "id": "49", + "name": "System Board 8 34-System Board", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "24.00" +}, { + "id": "50", + "name": "System Board 9 35-System Board", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "26.00" +}, { + "id": "51", + "name": "System Board 10 36-Sys Exhaust", + "type": "Temperature", + "event": "'OK'", + "state": "Nominal", + "units": "C", + "reading": "25.00" +}, { + "id": "52", + "name": "System Board 11 37-Sys Exhaust", + "type": "Temperature", + "event": "'OK'", + "state": "Warning", + "units": "C", + "reading": "24.00" +}, { + "id": "53", + "name": "System Board 10 Memory", + "type": "Memory", + "event": "'Presence detected'", + "state": "Nominal", + "units": "N/A", + "reading": "N/A" +}, { + "id": "54", + "name": "System Board 11 Power Meter", + "type": "Current", + "event": "'Device Enabled'", + "state": "N/A", + "units": "N/A", + "reading": "N/A" +}] \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/job/mysql/update_device_lifecycle_job.go b/cyclone-server/src/idcos.io/cloudboot/job/mysql/update_device_lifecycle_job.go new file mode 100644 index 0000000000000000000000000000000000000000..d8a1ff721c580ecb9fbde7537d765feb32c75603 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/job/mysql/update_device_lifecycle_job.go @@ -0,0 +1,97 @@ +package mysql + +import ( + "time" + "idcos.io/cloudboot/config" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" +) + +// UpdateDeviceLifecycleJob 更新设备生命周期任务(维保状态) +type UpdateDeviceLifecycleJob struct { + id string // 任务ID(全局唯一) + log logger.Logger + repo model.Repo + conf *config.Config +} + +// NewUpdateDeviceLifecycleJob 实例化任务管理器 +func NewUpdateDeviceLifecycleJob(log logger.Logger, repo model.Repo, conf *config.Config, jobid string) *UpdateDeviceLifecycleJob { + return &UpdateDeviceLifecycleJob{ + log: log, + repo: repo, + conf: conf, + id: jobid, + } +} + +// Run 运行更新设备生命周期任务(维保状态) +// 内置任务,根据规则更新维保状态 +// current_date < maintenance_service_date_begin -> maintenance_service_status = inactive +// maintenance_service_date_begin < current_date < maintenance_service_date_end -> maintenance_service_status = under_warranty +// maintenance_service_date_end < current_date -> maintenance_service_status = out_of_warranty +func (j *UpdateDeviceLifecycleJob) Run() { + j.log.Debugf("[UpdateDeviceLifecycleJob-begin]- compare current_date to maintenance_service_date and update maintenance_service_status") + defer j.log.Debugf("[UpdateDeviceLifecycleJob-end] - maintenance_service_status update completed") + + defer func() { + if err := recover(); err != nil { + j.log.Errorf("UpdateDeviceLifecycle job panic: \n%s", err) + } + }() + + devices, err := j.repo.GetCombinedDevices(nil, nil, nil) + if err != nil { + j.log.Errorf("UpdateDeviceLifecycle job err: \n%s", err) + } + for i := range devices { + // DeviceLifecycle 查询是否已经存在 + devLifecycle, err := j.repo.GetDeviceLifecycleBySN(devices[i].SN) + if err != nil { + j.log.Errorf("get deviceLifecycle of %s err: \n%s", devices[i].SN, err) + continue + } + // 过滤 已退役&&已过保 + if devices[i].OperationStatus == model.DevOperStateRetired && devLifecycle.MaintenanceServiceStatus == model.MaintenanceServiceStatusOutOfWarranty { + j.log.Debugf("Device sn %s is %s ,ignore it.", devices[i].SN, model.MaintenanceServiceStatusOutOfWarranty) + continue + } + // DeviceLifecycle 结构体 + modDevLifecycle := &model.DeviceLifecycle{ + SN: devices[i].SN, + } + now := time.Now() + currentDate := now.Format("2006-01-02") + if now.Before(devLifecycle.MaintenanceServiceDateBegin) { + if devLifecycle.MaintenanceServiceStatus != model.MaintenanceServiceStatusInactive { + j.log.Debugf("current_date=%s < maintenance_service_begin_date=%s. Update Device(SN:%s) set status=%s -> %s", + currentDate, devLifecycle.MaintenanceServiceDateBegin, devices[i].SN, devLifecycle.MaintenanceServiceStatus, model.MaintenanceServiceStatusInactive) + modDevLifecycle.MaintenanceServiceStatus = model.MaintenanceServiceStatusInactive + if err = j.repo.UpdateDeviceLifecycleBySN(modDevLifecycle);err != nil { + j.log.Errorf("UpdateDeviceLifecycleBySN failed: %s", err.Error()) + continue + } + } + } else if now.After(devLifecycle.MaintenanceServiceDateEnd) { + if devLifecycle.MaintenanceServiceStatus != model.MaintenanceServiceStatusOutOfWarranty { + j.log.Debugf("current_date=%s > maintenance_service_end_date=%s. Update Device(%s) set status=%s -> %s", + currentDate, devLifecycle.MaintenanceServiceDateEnd, devices[i].SN, devLifecycle.MaintenanceServiceStatus, model.MaintenanceServiceStatusOutOfWarranty) + modDevLifecycle.MaintenanceServiceStatus = model.MaintenanceServiceStatusOutOfWarranty + if err = j.repo.UpdateDeviceLifecycleBySN(modDevLifecycle);err != nil { + j.log.Errorf("UpdateDeviceLifecycleBySN failed: %s", err.Error()) + continue + } + } + } else { + if devLifecycle.MaintenanceServiceStatus != model.MaintenanceServiceStatusUnderWarranty { + j.log.Debugf("current_date=%s between maintenance_service_begin_date=%s and maintenance_service_end_date=%s. Update Device(%s) set status=%s -> %s", + currentDate, devLifecycle.MaintenanceServiceDateBegin, devLifecycle.MaintenanceServiceDateEnd, devices[i].SN, devLifecycle.MaintenanceServiceStatus, model.MaintenanceServiceStatusUnderWarranty) + modDevLifecycle.MaintenanceServiceStatus = model.MaintenanceServiceStatusUnderWarranty + if err = j.repo.UpdateDeviceLifecycleBySN(modDevLifecycle);err != nil { + j.log.Errorf("UpdateDeviceLifecycleBySN failed: %s", err.Error()) + continue + } + } + } + } +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/limiter/bucket.go b/cyclone-server/src/idcos.io/cloudboot/limiter/bucket.go new file mode 100644 index 0000000000000000000000000000000000000000..13aee4bc743af7bcb4abda86d8ef0acc5b19aab9 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/limiter/bucket.go @@ -0,0 +1,44 @@ +package limiter + +import ( + "errors" + "time" +) + +var ( + // ErrInvalidOrReturnedToken 无效的或已经归还的令牌 + ErrInvalidOrReturnedToken = errors.New("invalid or returned token") + // ErrAcquireTokenTimeout 等待获取令牌超时错误 + ErrAcquireTokenTimeout = errors.New("acquire token timeout") + // ErrBucketNotFound 令牌桶未发现 + ErrBucketNotFound = errors.New("bucket not found") + // ErrBucketFull 令牌桶满了 + ErrBucketFull = errors.New("bucket is full") + // 1 定义全局变量 + // 2 server.go 初始化 + // 3 auto_deploy.go 调用 + GlobalLimiter Limiter +) + +// Token 令牌(唯一的不重复字符串) +type Token string + +// GenTokenFunc 令牌生成函数 +type GenTokenFunc func(str string) Token + +// Bucket 令牌桶 +type Bucket interface { + // ID 返回令牌桶ID + ID() string + // Capacity 返回令牌桶容量 + Capacity() int + // Acquire 尝试从桶中获取令牌。 + // 若桶中无可用令牌,则阻塞并等待。 + // 若在超时时间内还没有可用的令牌,则返回ErrAcquireTokenTimeout错误。 + Acquire(sn string, timeout time.Duration) (Token, error) + // Return 归还令牌。 + // 若令牌归还多次,或者归还的是无效的令牌,则返回ErrInvalidOrReturnedToken错误。 + Return(sn string, token Token) error + // Drop 销毁当前令牌桶 + Drop() error +} diff --git a/cyclone-server/src/idcos.io/cloudboot/limiter/limiter.go b/cyclone-server/src/idcos.io/cloudboot/limiter/limiter.go new file mode 100644 index 0000000000000000000000000000000000000000..ca574478349db5bea529cea419c74b1b4625090a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/limiter/limiter.go @@ -0,0 +1,9 @@ +package limiter + +// Limiter 装机(进入bootos)限流器 +type Limiter interface { + // Route 给目标设备路由到一个合适的令牌桶 + Route(sn string) (Bucket, error) + // DropBucket 销毁目标令牌桶 + DropBucket(bucketID string) error +} diff --git a/cyclone-server/src/idcos.io/cloudboot/limiter/webank/bucket.go b/cyclone-server/src/idcos.io/cloudboot/limiter/webank/bucket.go new file mode 100644 index 0000000000000000000000000000000000000000..c03a69064ce3bd18f3122ba50cffb4fd5f3f4e56 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/limiter/webank/bucket.go @@ -0,0 +1,194 @@ +package webank + +import ( + "fmt" + "time" + + "sync" + + "idcos.io/cloudboot/limiter" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils" +) + +type myBucket struct { + log logger.Logger + repo model.Repo + id string + capacity int // 容量 + ch chan limiter.Token + mutex sync.Mutex //加个锁 +} + +// newBucket 生成指定容量的令牌桶 +func newBucket(log logger.Logger, repo model.Repo, bucketid string, capacity int, genToken limiter.GenTokenFunc) (*myBucket, error) { + if capacity <= 0 { + panic("capacity must be greater than 0") + } + + ch := make(chan limiter.Token, capacity) + items := make([]*model.DHCPTokenBucket, 0, capacity) + + for i := 0; i < capacity; i++ { + token := genToken(bucketid) + log.Debugf("new token:%s into bucket:%s", token, bucketid) + items = append(items, &model.DHCPTokenBucket{ + Token: string(token), + Bucket: bucketid, + }) + ch <- token + } + if err := repo.OverwriteTokenBuckets(items...); err != nil { + close(ch) + log.Errorf("Overwrite token bucket records error: %s", err.Error()) + return nil, err + } + return &myBucket{ + log: log, + repo: repo, + id: bucketid, + capacity: capacity, + ch: ch, + }, nil +} + +// reloadBucket 根据令牌桶名从数据库中加载令牌桶及其令牌 +func reloadBucket(log logger.Logger, repo model.Repo, bucket string, capacity int) (*myBucket, error) { + log.Infof("Start reloading the token bucket: %s", bucket) + + items, err := repo.GetTokenBuckets(&model.DHCPTokenBucket{ + Bucket: bucket, + }) + if err != nil { + return nil, err + } + + ch := make(chan limiter.Token, capacity) + + if len(items) > capacity { // 缩容了 + log.Infof("bucket capacity become smaller,len(%d),limit(%d)", len(items), capacity) + items = items[:capacity] + + } else if len(items) < capacity { // 扩容了 + log.Infof("bucket capacity become greater,len(%d),limit(%d)", len(items), capacity) + for len(items) < capacity { + items = append(items, &model.DHCPTokenBucket{ + Token: string(genToken(bucket)), + Bucket: bucket, + }) + } + } + + if len(items) != capacity { + panic("unreachable") + } + + for i := range items { + sn := items[i].SN + if sn != nil && *sn != "" { + log.Infof("The token(%s) has been assigned to the device(%s)", items[i].Token, *sn) + continue + } + ch <- limiter.Token(items[i].Token) // 使用新生成的令牌将令牌桶填满 + log.Infof("Put the token in the token bucket: %s -> %s", items[i].Token, bucket) + } + + if err := repo.OverwriteTokenBuckets(items...); err != nil { + return nil, err + } + + return &myBucket{ + log: log, + repo: repo, + id: bucket, + capacity: capacity, + ch: ch, + }, nil +} + +// ID 返回令牌桶ID(TOR名称) +func (bucket *myBucket) ID() string { + return bucket.id +} + +// Capacity 返回令牌桶容量 +func (bucket *myBucket) Capacity() int { + return bucket.capacity +} + +// Acquire 尝试从桶中获取令牌。 +// 若桶中无可用令牌,则阻塞并等待。 +// 若在超时时间内还没有可用的令牌,则返回ErrAcquireTokenTimeout错误。 +func (bucket *myBucket) Acquire(sn string, timeout time.Duration) (limiter.Token, error) { + bucket.log.Infof("The device(%s) starts requesting a token", sn) + + // 若设备已经被分配了令牌,则直接返回之前分发的令牌。 + if t, _ := bucket.repo.GetTokenBySN(sn); t != "" { + bucket.log.Infof("The device(%s) reuses the existing token: %s", sn) + return limiter.Token(t), nil + } + + bucket.log.Infof("The remaining token in the this bucket is %d", len(bucket.ch)) + + select { + case token := <-bucket.ch: + bucket.log.Infof("The device(%s) gets a token: %s", sn, token) + + // 将设备和令牌的对应关系写入数据库 + if _, err := bucket.repo.BindSNByTokenBucket(sn, string(token), bucket.id); err != nil { + bucket.log.Warnf("Binding error: %s", err.Error()) + bucket.ch <- token + return "", err + } + return token, nil + + case <-time.After(timeout): + bucket.log.Warnf("The device(%s) request token timeout", sn) + return "", limiter.ErrAcquireTokenTimeout + } +} + +// Return 归还令牌。 +// 若令牌归还多次,或者归还的是无效的令牌,则返回ErrInvalidOrReturnedToken错误。 +func (bucket *myBucket) Return(sn string, token limiter.Token) error { + bucket.log.Infof("The device(%s) starts to return a token: %s", sn, token) + + // 校验令牌有效性并在数据库中解绑令牌和设备 + affected, err := bucket.repo.UnbindSNByTokenBucket(sn, string(token), bucket.id) + if err != nil { + bucket.log.Warnf("Unbinding error: %s", err.Error()) + return err + } + if affected == 0 { + bucket.log.Error("Invalid or returned token, affected == 0") + return limiter.ErrInvalidOrReturnedToken + } + select { + case bucket.ch <- token: + default: + bucket.log.Errorf("Return token:%s fail, bucket:%s is full", token, bucket.ID()) + return limiter.ErrBucketFull + } + + bucket.log.Infof("The device(%s) has returned a token: %s", sn, token) + return nil +} + +// Drop 销毁当前令牌桶 +func (bucket *myBucket) Drop() error { + bucket.log.Info("Start destroying the token bucket: %s", bucket.id) + + if _, err := bucket.repo.RemoveTokenBuckets(bucket.id); err != nil { + return err + } + close(bucket.ch) + + bucket.log.Info("Token bucket(%s) has been destroyed", bucket.id) + return nil +} + +// 生成token。token格式为"${bucket}:${UUID}" +func genToken(bucket string) limiter.Token { + return limiter.Token(fmt.Sprintf("%s:%s", bucket, utils.UUID())) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/limiter/webank/limiter.go b/cyclone-server/src/idcos.io/cloudboot/limiter/webank/limiter.go new file mode 100644 index 0000000000000000000000000000000000000000..4828ac8be0e531a7303a6ca170a0ba39f159cc87 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/limiter/webank/limiter.go @@ -0,0 +1,111 @@ +package webank + +import ( + "strings" + "sync" + + "idcos.io/cloudboot/limiter" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" +) + +// myLimiter 限流器 +type myLimiter struct { + log logger.Logger + repo model.Repo + limit int // 每个令牌桶中令牌数量阈值 + buckets map[string]*myBucket // tor名称与令牌桶键值对 + bucketsMutex *sync.Mutex // TODO 改造成读写锁 +} + +// NewLimiter 返回限流器实例 +func NewLimiter(log logger.Logger, repo model.Repo, limit int) (limiter.Limiter, error) { + if limit <= 0 { + panic("invalid 'limit' parameter") + } + lim := &myLimiter{ + log: log, + repo: repo, + limit: limit, + buckets: make(map[string]*myBucket), + bucketsMutex: new(sync.Mutex), + } + if err := lim.init(); err != nil { + return nil, err + } + return lim, nil +} + +// init 初始化限流器实例 +func (lim *myLimiter) init() error { + lim.log.Infof("The limiter starts to initialize") + + // 1、从数据库读取已有令牌桶 + buckets, err := lim.repo.GetBuckets() + if err != nil { + lim.log.Errorf("Fetch buckets from db error: %s", err.Error()) + return err + } + + // 2、重建限流器内的令牌桶及令牌 + for i := range buckets { + bucket := strings.TrimSpace(buckets[i]) + if lim.buckets[bucket], err = reloadBucket(lim.log, lim.repo, bucket, lim.limit); err != nil { + lim.log.Errorf("Reload bucket(%s) error: %s", bucket, err.Error()) + return err + } + // TODO 探活(ping设备的dhcp ip) + } + lim.log.Infof("The limiter is initialized") + return nil +} + +// Route 给目标设备路由到一个合适的令牌桶 +func (lim *myLimiter) Route(sn string) (limiter.Bucket, error) { + lim.log.Infof("The device(%s) starts looking for token bucket", sn) + defer lim.log.Infof("The device(%s) has found token bucket", sn) + + tor, _ := lim.repo.GetTORBySN(sn) + if tor == "" { + lim.log.Errorf("The device(%s) failed to find TOR", sn) + return nil, limiter.ErrBucketNotFound + } + lim.log.Infof("The device(%s) has found TOR: %s", sn, tor) + + lim.bucketsMutex.Lock() + defer lim.bucketsMutex.Unlock() + + var err error + + bucket := lim.buckets[tor] + if bucket == nil { + lim.log.Infof("The device(%s) failed to get token bucket and create a token bucket", sn) + bucket, err = newBucket(lim.log, lim.repo, tor, lim.limit, genToken) + if err != nil { + return nil, err + } + lim.buckets[tor] = bucket + } + return bucket, nil +} + +// DropBucket 删除目标令牌桶 +func (lim *myLimiter) DropBucket(bucketID string) error { + lim.log.Infof("Start destroying the token bucket: %s", bucketID) + + lim.bucketsMutex.Lock() + defer lim.bucketsMutex.Unlock() + + b := lim.buckets[bucketID] + if b == nil { + lim.log.Error("Token bucket not found") + return limiter.ErrBucketNotFound + } + if err := b.Drop(); err != nil { + return err + } + delete(lim.buckets, bucketID) + + lim.log.Infof("The token bucket has been destroyed: %s", bucketID) + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/logger/beelog.go b/cyclone-server/src/idcos.io/cloudboot/logger/beelog.go new file mode 100644 index 0000000000000000000000000000000000000000..0c76d34455c02adcbcecbdd5d149618d1ffca89c --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/logger/beelog.go @@ -0,0 +1,188 @@ +package logger + +import ( + "encoding/json" + "fmt" + "os" + "path" + "strings" + + "github.com/astaxie/beego/logs" + + "idcos.io/cloudboot/config" + myfilepath "idcos.io/cloudboot/utils/filepath" +) + +// BeeLogger beego log实现 +type BeeLogger struct { + fileLog *logs.BeeLogger + consoleLog *logs.BeeLogger +} + +func selectLevel(level string) int { + switch strings.ToLower(strings.TrimSpace(level)) { + case "debug": + return 7 + case "warn": + return 4 + case "error": + return 3 + default: + return 6 // default level: info + } +} + +// NewBeeLogger 创建BeeLogger实例 +func NewBeeLogger(conf *config.Logger) *BeeLogger { + var beeLog BeeLogger + + if conf.FilePerm == "" { + conf.FilePerm = "0644" + } + + // 开启文件日志 + if filename := strings.TrimSpace(conf.LogFile); filename != "" { + filename, _ = myfilepath.Rel2Abs(filename) + if err := os.MkdirAll(path.Dir(filename), os.ModePerm); err != nil { + fmt.Printf("MkdirAll err: %s\n", err) + } + + fLog := logs.NewLogger(1000) + fLog.EnableFuncCallDepth(true) // 输出文件名和行号 + fLog.SetLogFuncCallDepth(3) + logData, _ := json.Marshal(map[string]interface{}{ + "filename": filename, + "perm": conf.FilePerm, + "level": selectLevel(conf.Level), + "rotate": conf.RotateEnabled, + "daily": conf.RotateEnabled, + }) + if err := fLog.SetLogger(logs.AdapterFile, string(logData)); err != nil { + fmt.Fprintf(os.Stderr, "SetLogger err: %s\n", err) + } + beeLog.fileLog = fLog + } + + // 开启控制台日志 + if conf.ConsoleEnabled { + consoleLog := logs.NewLogger(1000) + consoleLog.EnableFuncCallDepth(true) + consoleLog.SetLogFuncCallDepth(3) + logData, _ := json.Marshal(map[string]interface{}{ + "level": selectLevel(conf.Level), + }) + if err := consoleLog.SetLogger(logs.AdapterConsole, string(logData)); err != nil { + fmt.Fprintf(os.Stderr, "SetLogger err: %s\n", err) + } + beeLog.consoleLog = consoleLog + } + + return &beeLog +} + +// SetField 暂不支持的方法 +func (log *BeeLogger) SetField(name string, value interface{}) { + panic("not supported") +} + +// Debug logs a debug message. If last parameter is a map[string]string, it's content +// is added as fields to the message. +func (log *BeeLogger) Debug(v ...interface{}) { + if log.fileLog != nil { + log.fileLog.Debug("%v", v...) + } + if log.consoleLog != nil { + log.consoleLog.Debug("%v", v...) + } +} + +// Debugf logs a debug message with format. If last parameter is a map[string]string, +// it's content is added as fields to the message. +func (log *BeeLogger) Debugf(format string, v ...interface{}) { + if log.fileLog != nil { + log.fileLog.Debug(format, v...) + } + if log.consoleLog != nil { + log.consoleLog.Debug(format, v...) + } +} + +// Info logs a info message. If last parameter is a map[string]string, it's content +// is added as fields to the message. +func (log *BeeLogger) Info(v ...interface{}) { + if log.fileLog != nil { + log.fileLog.Info("%v", v...) + } + if log.consoleLog != nil { + log.consoleLog.Info("%v", v...) + } +} + +// Infof logs a info message with format. If last parameter is a map[string]string, +// it's content is added as fields to the message. +func (log *BeeLogger) Infof(format string, v ...interface{}) { + if log.fileLog != nil { + log.fileLog.Info(format, v...) + } + if log.consoleLog != nil { + log.consoleLog.Info(format, v...) + } +} + +// Warn logs a warning message. If last parameter is a map[string]string, it's content +// is added as fields to the message. +func (log *BeeLogger) Warn(v ...interface{}) { + if log.fileLog != nil { + log.fileLog.Warn("%v", v...) + } + if log.consoleLog != nil { + log.consoleLog.Warn("%v", v...) + } +} + +// Warnf logs a warning message with format. If last parameter is a map[string]string, +// it's content is added as fields to the message. +func (log *BeeLogger) Warnf(format string, v ...interface{}) { + if log.fileLog != nil { + log.fileLog.Warn(format, v...) + } + if log.consoleLog != nil { + log.consoleLog.Warn(format, v...) + } +} + +// Error logs an error message. If last parameter is a map[string]string, it's content +// is added as fields to the message. +func (log *BeeLogger) Error(v ...interface{}) { + if log.fileLog != nil { + log.fileLog.Error("%v", v...) + } + if log.consoleLog != nil { + log.consoleLog.Error("%v", v...) + } +} + +// Errorf logs an error message with format. If last parameter is a map[string]string, +// it's content is added as fields to the message. +func (log *BeeLogger) Errorf(format string, v ...interface{}) { + if log.fileLog != nil { + log.fileLog.Error(format, v...) + } + if log.consoleLog != nil { + log.consoleLog.Error(format, v...) + } +} + +// Print 向目标打印输出日志 +func (log *BeeLogger) Print(v ...interface{}) { + var format string + for range v { + format += "%v " + } + if log.fileLog != nil { + log.fileLog.Debug(format, v...) + } + if log.consoleLog != nil { + log.consoleLog.Debug(format, v...) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/logger/logger.go b/cyclone-server/src/idcos.io/cloudboot/logger/logger.go new file mode 100644 index 0000000000000000000000000000000000000000..5f56d4386b4b2c91e54348479b2999012253bf0d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/logger/logger.go @@ -0,0 +1,32 @@ +package logger + +// Logger 系统logger接口 +type Logger interface { + // SetField sets a field on the logger's context. All future messages on this logger + // will have this field set. + SetField(name string, value interface{}) + // Debug logs a debug message. If last parameter is a map[string]string, it's content + // is added as fields to the message. + Debug(v ...interface{}) + // Debug logs a debug message with format. If last parameter is a map[string]string, + // it's content is added as fields to the message. + Debugf(format string, v ...interface{}) + // Info logs a info message. If last parameter is a map[string]string, it's content + // is added as fields to the message. + Info(v ...interface{}) + // Info logs a info message with format. If last parameter is a map[string]string, + // it's content is added as fields to the message. + Infof(format string, v ...interface{}) + // Warn logs a warning message. If last parameter is a map[string]string, it's content + // is added as fields to the message. + Warn(v ...interface{}) + // Warn logs a warning message with format. If last parameter is a map[string]string, + // it's content is added as fields to the message. + Warnf(format string, v ...interface{}) + // Error logs an error message. If last parameter is a map[string]string, it's content + // is added as fields to the message. + Error(v ...interface{}) + // Error logs an error message with format. If last parameter is a map[string]string, + // it's content is added as fields to the message. + Errorf(format string, v ...interface{}) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/middleware/authentication.go b/cyclone-server/src/idcos.io/cloudboot/middleware/authentication.go new file mode 100644 index 0000000000000000000000000000000000000000..cfccd8f1f51f8e27f7bc06b64fe2c935101b96b0 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/middleware/authentication.go @@ -0,0 +1,179 @@ +package middleware + +import ( + "context" + "fmt" + "net/http" + "regexp" + "strings" + + "idcos.io/cloudboot/model" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" + uam "idcos.io/uam-go" +) + +const ( + // GET GET方法 + GET = http.MethodGet + // POST POST方法 + POST = http.MethodPost + // PUT PUT方法 + PUT = http.MethodPut + // DELETE DELETE方法 + DELETE = http.MethodDelete +) + +// APIMeta API元数据信息 +type APIMeta struct { + Method string + URIReg *regexp.Regexp +} + +// Match 返回此request是否与当前的API元数据匹配 +func (api APIMeta) Match(r *http.Request) bool { + return r.Method == api.Method && api.URIReg.MatchString(ReqURI(r)) +} + +// UnAuthAPIs 无需登录认证的API元信息集合 +type UnAuthAPIs []APIMeta + +// ShouldNotBeChecked 返回是否需要对此request请求进行登录认证的布尔值 +func (items UnAuthAPIs) ShouldNotBeChecked(r *http.Request) bool { + for i := range items { + if items[i].Match(r) { + return true + } + } + return false +} + +// ReqURI 获取请求的URL“主体“ +func ReqURI(r *http.Request) string { + reqURI := r.URL.RequestURI() + if idx := strings.Index(reqURI, "?"); idx > 0 { + reqURI = reqURI[:idx] + } + return strings.TrimSuffix(reqURI, "/") +} + +var ( + // unAuthAPIs 无需登录认证的API集合 + unAuthAPIs = UnAuthAPIs([]APIMeta{ + {POST, regexp.MustCompile("^/api/cloudboot/v1/devices/collections$")}, + {GET, regexp.MustCompile("^/api/cloudboot/v1/devices/[0-9A-Za-z_]+/collections$")}, + + {GET, regexp.MustCompile("^/api/cloudboot/v1/devices/[0-9A-Za-z_]+/settings/networks$")}, + {GET, regexp.MustCompile("^/api/cloudboot/v1/devices/[0-9A-Za-z_]+/settings/os-users$")}, + {GET, regexp.MustCompile("^/api/cloudboot/v1/devices/[0-9A-Za-z_]+/settings/hardwares$")}, + {GET, regexp.MustCompile("^/api/cloudboot/v1/devices/[0-9A-Za-z_]+/settings/hardwareinfo$")}, + {GET, regexp.MustCompile("^/api/cloudboot/v1/devices/[0-9A-Za-z_]+/settings/system-template$")}, + {GET, regexp.MustCompile("^/api/cloudboot/v1/devices/[0-9A-Za-z_]+/settings/image-template$")}, + {GET, regexp.MustCompile("^/api/cloudboot/v1/devices/[0-9A-Za-z_]+/settings$")}, + {GET, regexp.MustCompile("^/api/cloudboot/v1/devices/[0-9A-Za-z_]+/is-in-install-list$")}, + {POST, regexp.MustCompile("^/api/cloudboot/v1/devices/[0-9A-Za-z_]+/installations/progress$")}, + {GET, regexp.MustCompile("^/api/cloudboot/v1/devices/[0-9A-Za-z_]+/installations/status$")}, + + {GET, regexp.MustCompile("^/api/cloudboot/v1/devices/[0-9A-Za-z_:%]+/pxe$")}, + {POST, regexp.MustCompile("^/api/cloudboot/v1/devices/[0-9A-Za-z_]+/pxe$")}, + {POST, regexp.MustCompile("^/api/cloudboot/v1/devices/[0-9A-Za-z_]+/centos6/uefi/pxe$")}, + + {GET, regexp.MustCompile("^/api/cloudboot/v1/permissions/codes$")}, + {GET, regexp.MustCompile("^/api/cloudboot/v1/system/login/settings$")}, + {GET, regexp.MustCompile("^/api/cloudboot/v1/orders/export$")}, + {GET, regexp.MustCompile("^/api/cloudboot/v1/samba/settings$")}, + }) +) + +// ctxLoginUserKey 登录用户指针在上下文中的查询Key +var ctxLoginUserKey uint8 + +// Authenticator 用户登录认证中间件 +func Authenticator(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if unAuthAPIs.ShouldNotBeChecked(r) { + next.ServeHTTP(w, r) + return + } + user, err := whoami(r) + if err != nil { + render.JSON(w, http.StatusInternalServerError, myhttp.ErrRespBody(err.Error())) + return + } + + if user == nil { + conf, _ := ConfigFromContext(r.Context()) + render.JSON(w, http.StatusUnauthorized, + myhttp.NewRespBody(myhttp.Failure, http.StatusText(http.StatusUnauthorized), map[string]interface{}{ + "channel": "uam_sso", + "url": fmt.Sprintf("%s/login", strings.TrimSuffix(conf.UAM.RootEndpoint, "/")), + }), + ) + return + } + + r.Header.Add("Authorization", user.Token) + + r = r.WithContext(context.WithValue(r.Context(), &ctxLoginUserKey, user)) + next.ServeHTTP(w, r) + }) +} + +// LoginUserFromContext 从ctx中获取登录用户信息 +func LoginUserFromContext(ctx context.Context) (*model.CurrentUser, bool) { + user, ok := ctx.Value(&ctxLoginUserKey).(*model.CurrentUser) + return user, ok +} + +// whoami 返回当前用户信息 +func whoami(r *http.Request) (user *model.CurrentUser, err error) { + log, _ := LoggerFromContext(r.Context()) + conf, _ := ConfigFromContext(r.Context()) + + var token string + // 尝试从HTTP Header中获取token + if token = r.Header.Get("Authorization"); token == "" { + if ck, _ := r.Cookie("access-token"); ck != nil { + token = ck.Value + } + } + + uamUser, err := uam.NewClient(conf.UAM.RootEndpoint, token, uam.LogOption(log)).AuthUser(model.AppID4UAM) + if err == uam.ErrUnauthenticatedUser { + return nil, nil // 未认证,返回空user指针。 + } + if err != nil { + return nil, err // 调用uam发生未知错误 + } + + if uamUser.Status == uam.UserStatusDisabled { + return nil, nil // 帐号被禁用 + } + return &model.CurrentUser{ + Token: token, + ID: uamUser.ID, + LoginName: uamUser.LoginID, + Name: uamUser.Name, + Email: uamUser.Email, + Status: uamUser.Status, + UAMPortalURL: conf.UAM.PortalURL, + PermissionCodes: filterBootPermission(uamUser), + Tenant: &model.Tenant{ + ID: uamUser.Tenant.ID, + Name: uamUser.Tenant.Name, + }, + Department: &model.Department{ + ID: uamUser.Department.ID, + Name: uamUser.Department.Name, + }, + }, nil +} + +//filterBootPermission 从用户权限当中过滤出来BOOT的权限 +func filterBootPermission(uamUser *uam.User) []string { + permissions := uamUser.PermissionCodes(model.MenuPermissionType) + permissions = append(permissions, uamUser.PermissionCodes(model.ButtonPermissionType)...) + permissions = append(permissions, uamUser.PermissionCodes(model.DataPermissionType)...) + permissions = append(permissions, uamUser.PermissionCodes(model.APIPermissionType)...) + return permissions +} diff --git a/cyclone-server/src/idcos.io/cloudboot/middleware/authorization.go b/cyclone-server/src/idcos.io/cloudboot/middleware/authorization.go new file mode 100644 index 0000000000000000000000000000000000000000..d5185f030b8d437e3727a44203c4cfbeb582cdb7 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/middleware/authorization.go @@ -0,0 +1,83 @@ +package middleware + +import ( + "fmt" + "idcos.io/cloudboot/model" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" + "net/http" + "regexp" +) + +// AuthorizationAPI 鉴权API +type AuthorizationAPI struct { + API *APIMeta + Codes []string +} + +// AuthorizationAPIs 待鉴权的API元信息集合 +type AuthorizationAPIs []*AuthorizationAPI + +// ShouldBeChecked 返回是否需要对此request请求进行鉴权的布尔值与权限码集合 +func (items AuthorizationAPIs) ShouldBeChecked(r *http.Request) (yes bool, codes []string) { + if user, _ := LoginUserFromContext(r.Context()); user == nil { + return false, nil // 未经过登录认证的API无须鉴权 + } + for i := range items { + if items[i].API.Match(r) { + return true, items[i].Codes + } + } + return false, nil +} + +// 待鉴权API集合 +var authorizationAPIs AuthorizationAPIs + +// InitAuthorizationAPIs 初始化鉴权API +func InitAuthorizationAPIs(repo model.Repo) error { + items, err := repo.GetSystemSetting4AuthorizationAPIs() + if err != nil { + return fmt.Errorf("unable to load system setting 'authorization': %s", err.Error()) + } + + authAPIs := make([]*AuthorizationAPI, 0, len(items)) + for i := range items { + reg, err := regexp.CompilePOSIX(items[i].API.URIReg) + if err != nil { + return fmt.Errorf("invalid regex(%s) expression in 'authorization' system setting", items[i].API.URIReg) + } + authAPIs = append(authAPIs, &AuthorizationAPI{ + API: &APIMeta{ + Method: items[i].API.Method, + URIReg: reg, + }, + Codes: items[i].Codes, + }) + } + authorizationAPIs = AuthorizationAPIs(authAPIs) + return nil +} + +// Authorization 用户鉴权中间件 +func Authorization(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + shouldBeCheck, codes := authorizationAPIs.ShouldBeChecked(r) + if !shouldBeCheck { + next.ServeHTTP(w, r) + return + } + + user, _ := LoginUserFromContext(r.Context()) + + // 当前用户只要拥有目标权限码中的任意一个,该用户即为合法用户。 + if !user.Allow(codes...) { + render.JSON(w, http.StatusForbidden, myhttp.NewRespBody(myhttp.Failure, "用户权限不足", map[string]interface{}{ + "allowed_permission_codes": codes, + "user_permission_codes": user.PermissionCodes, + })) + return + } + next.ServeHTTP(w, r) + }) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/middleware/config.go b/cyclone-server/src/idcos.io/cloudboot/middleware/config.go new file mode 100644 index 0000000000000000000000000000000000000000..1580ef5edd55701e1b6663fb165bfd953c9aca72 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/middleware/config.go @@ -0,0 +1,28 @@ +package middleware + +import ( + "context" + "net/http" + + "idcos.io/cloudboot/config" +) + +// ctxConfigKey 注入的*config.Config对应的查询Key +var ctxConfigKey uint8 + +// ConfigFromContext 从ctx中获取model.Repo +func ConfigFromContext(ctx context.Context) (*config.Config, bool) { + conf, ok := ctx.Value(&ctxConfigKey).(*config.Config) + return conf, ok +} + +// InjectConfig 注入*config.Config +func InjectConfig(conf *config.Config) func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + next.ServeHTTP(w, r.WithContext( + context.WithValue(r.Context(), &ctxConfigKey, conf), + )) + }) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/middleware/dhcp_limiter.go b/cyclone-server/src/idcos.io/cloudboot/middleware/dhcp_limiter.go new file mode 100644 index 0000000000000000000000000000000000000000..c89dd226aa0922361a63fabe989dbea0e843d7bf --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/middleware/dhcp_limiter.go @@ -0,0 +1,28 @@ +package middleware + +import ( + "context" + "net/http" + + "idcos.io/cloudboot/limiter" +) + +// ctxDHCPLimiterKey 注入的limiter.Limiter对应的查询Key +var ctxDHCPLimiterKey uint8 + +// DHCPLimiterFromContext 从ctx中获取DHCPLimiter +func DHCPLimiterFromContext(ctx context.Context) (limiter.Limiter, bool) { + lim, ok := ctx.Value(&ctxDHCPLimiterKey).(limiter.Limiter) + return lim, ok +} + +// InjectDHCPLimiter 注入limiter.Limiter +func InjectDHCPLimiter(lim limiter.Limiter) func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + r = r.WithContext(context.WithValue(r.Context(), &ctxDHCPLimiterKey, lim)) + next.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/middleware/distributed_node.go b/cyclone-server/src/idcos.io/cloudboot/middleware/distributed_node.go new file mode 100644 index 0000000000000000000000000000000000000000..3be9b1a8e266694cdc48231a961eaa1445122940 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/middleware/distributed_node.go @@ -0,0 +1,33 @@ +package middleware + +import ( + "sync" + + "idcos.io/cloudboot/config" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" +) + +// 定义一个全局的map结构来存储机房id到部署IP的映射 +type MapDistribute struct { + MDistribute map[uint][]string + sync.Mutex +} + +var MapDistributeNode MapDistribute + +//去数据库查询所有的机房,然后和conf中的分布式节点比较,初始化map数据 +func InitDistributeNode(conf *config.Config, log logger.Logger, repo model.Repo) { + MapDistributeNode.MDistribute = make(map[uint][]string, 0) + for _, confdn := range conf.DistributedNodes { + sr, err := repo.GetServerRoomByName(confdn.NodeName) + if err != nil { + log.Errorf("init distribute node:%s fail,%v", confdn.NodeName, err) + continue + } else if sr != nil { + MapDistributeNode.Lock() + MapDistributeNode.MDistribute[sr.ID] = confdn.NodeIP + MapDistributeNode.Unlock() + } + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/middleware/hw_config.go b/cyclone-server/src/idcos.io/cloudboot/middleware/hw_config.go new file mode 100644 index 0000000000000000000000000000000000000000..9d273dbbff614337ac4739b6b056e8cabcea8c57 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/middleware/hw_config.go @@ -0,0 +1,28 @@ +package middleware + +import ( + "context" + "net/http" + + "idcos.io/cloudboot/server/hwserver/config" +) + +// ctxHWConfigKey 注入的*config.Configuration对应的查询Key +var ctxHWConfigKey uint8 + +// HWConfigFromContext 从ctx中获取*config.Configuration +func HWConfigFromContext(ctx context.Context) (*config.Configuration, bool) { + conf, ok := ctx.Value(&ctxHWConfigKey).(*config.Configuration) + return conf, ok +} + +// InjectHWConfig 注入*config.Configuration +func InjectHWConfig(conf *config.Configuration) func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + next.ServeHTTP(w, r.WithContext( + context.WithValue(r.Context(), &ctxHWConfigKey, conf), + )) + }) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/middleware/job_manager.go b/cyclone-server/src/idcos.io/cloudboot/middleware/job_manager.go new file mode 100644 index 0000000000000000000000000000000000000000..4b34bb9dfe5ac09938037e8fe439e1618b5b808e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/middleware/job_manager.go @@ -0,0 +1,28 @@ +package middleware + +import ( + "context" + "net/http" + + "idcos.io/cloudboot/job" +) + +// ctxJobManagerKey 注入的job.Manager对应的查询Key +var ctxJobManagerKey uint8 + +// JobManagerFromContext 从ctx中获取JobManager +func JobManagerFromContext(ctx context.Context) (job.Manager, bool) { + jmgr, ok := ctx.Value(&ctxJobManagerKey).(job.Manager) + return jmgr, ok +} + +// InjectJobManager 注入job.Manager +func InjectJobManager(jmgr job.Manager) func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + r = r.WithContext(context.WithValue(r.Context(), &ctxJobManagerKey, jmgr)) + next.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/middleware/logger.go b/cyclone-server/src/idcos.io/cloudboot/middleware/logger.go new file mode 100644 index 0000000000000000000000000000000000000000..af45182e27ebc1e1160ac309ccc65fcb075a903a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/middleware/logger.go @@ -0,0 +1,87 @@ +package middleware + +import ( + "context" + "encoding/json" + "fmt" + "net/http" + "os" + "runtime/debug" + "time" + + "idcos.io/cloudboot/logger" +) + +// ctxLoggerKey 注入的logger.Logger对应的查询Key +var ctxLoggerKey uint8 +// panicFileKey 注入的panic file对应的查询Key +var panicFileKey uint8 + +// LoggerFromContext 从ctx中获取model.Repo +func LoggerFromContext(ctx context.Context) (logger.Logger, bool) { + log, ok := ctx.Value(&ctxLoggerKey).(logger.Logger) + return log, ok +} + +// PanicFileFromContext 从ctx中获取model.Repo +func PanicFileFromContext(ctx context.Context) (*os.File, bool) { + panicFile, ok := ctx.Value(&panicFileKey).(*os.File) + return panicFile, ok +} + +// InjectLogger 注入logger.Logger +func InjectLogger(logger logger.Logger) func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + r = r.WithContext(context.WithValue(r.Context(), &ctxLoggerKey, logger)) + next.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) + } +} + +// InjectFile 注入Panic File +func InjectFile(panic *os.File) func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + r = r.WithContext(context.WithValue(r.Context(), &panicFileKey, panic)) + next.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) + } +} + +// LogPanic http panic recover +func LogPanic(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + file, _ := PanicFileFromContext(r.Context()) + + if _, err := os.Stat(file.Name()); err != nil { + if os.IsNotExist(err) { + file, _ = os.OpenFile(file.Name(), os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) + } + } + + defer func() { + if rvr := recover(); rvr != nil { + // append panic info to file + panicTime := time.Now().Format("2006-01-02 15:04:05") + if _, err := file.WriteString(fmt.Sprintf("\n%s: %v\n %s", panicTime, rvr, debug.Stack())); err != nil { + fmt.Printf("write panic file error , %s", err.Error()) + } + + //若出现异常,则进行返回500 + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(http.StatusInternalServerError) + respMap := map[string]interface{}{ + "status": "failure", + "message": fmt.Sprintf("unknown error, error message in %s", file.Name()), + } + json.NewEncoder(w).Encode(respMap) + } + }() + next.ServeHTTP(w, r) + } + + return http.HandlerFunc(fn) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/middleware/message.go b/cyclone-server/src/idcos.io/cloudboot/middleware/message.go new file mode 100644 index 0000000000000000000000000000000000000000..392bfb28a7cf821176f4c1e8a8d72a4af1450234 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/middleware/message.go @@ -0,0 +1,155 @@ +package middleware + +import ( + "errors" + "bytes" + "crypto/md5" + "encoding/hex" + "math/rand" + "time" + "encoding/json" + "io/ioutil" + "fmt" + "strings" + "strconv" + "net/http" + + "idcos.io/cloudboot/config" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" +) + +// ESB - Enterprise Service Bus 企业服务总线功能 +//URL请求: +// +//http://xxx.xxx.xxx.xxx/service/[serviceCode]/[apiCode]?[加密参数] +// +//serviceCode:服务代码;apiCode:api代码 +//服务和api的关系是一个服务包含多个api,如统一消息服务,代码为message;里面包含多个api,mailsend(邮件发送),wechatsend(邮件发送)等。 +//请求方式:支持Get、Post、Put、Delete +//响应格式支持:Xml、Json +//加密参数是api访问鉴权 + +//关于message/mailsend API的参数说明 +//参数名 必填 说明 +//From Y 发件人邮箱 +//To N 收件人邮箱,多人用分号隔开。(to,cc,bcc不能全部同时为空) +//CC N 抄送人邮箱,多人用分号隔开。(to,cc,bcc不能全部同时为空) +//BCC N 暗送人邮箱,多人用分号隔开。(to,cc,bcc不能全部同时为空) +//Title Y 邮件标题 +//Content Y 邮件内容,如果带图片的话,要配合下面的Attachments参数使用。图片:<img src='cid:下面的ContentId' /> +//EmailType N 邮件类型,可选值0(普通邮件),1(会议邮件)。默认为0。 +//Priority N 邮件优先级,0普通,1高优先级。默认值为0。 +//BodyFormat N 邮件格式,0 文本、1 Html。默认值为0。 +//Appt_Location N 当邮件为约会邮件时,约会地点 +//Appt_Organizer N 当邮件为约会邮件时,约会组织者 +//Appt_StartTime N 当邮件为约会邮件时,约会开始时间;时间格式为yyyyMMddHHmmss,如时间2016/6/2 11:17:09表现为20160602111709 +//Appt_EndTime N 当邮件为约会邮件时,约会结束时间;时间格式跟Appt_StartTime相同。 +//Attachments N 附件,为Json格式的字符串(请传入字符串)。"[{Name:文件名1,Data:文件内容1},{Name:文件名2,Data:文件内容2}]" 文件名:就是显示在邮件的文件名称;文件内容是把文件内容读成byte使用base64编码的字符串。 +//MailToInternet N 判断邮件是否需要发送到外网, 0否(默认)、1是。这个设置需要开启ESB后台App管理字段:是否允许发送外网下拉选项,来配合使用。【无法重发】 +//AuthUser N 默认是smtp无密码验证发送,如果有需要指定用户名可以设置AuthUser。但必须AuthPassword不为空才有效。如果AuthUser为空有需要密码校验的话,AuthUser默认为发件人From。 【无法重发】 +//AuthPassword N 默认是smtp无密码验证发送,设置了的话就相当于需要smtp密码发送。【无法重发】 + +// SendMailReq 调用邮件发送API的通用请求结构体 +type SendMailReq struct { + From string `json:"from"` + To string `json:"to"` + CC string `json:"cc"` + Title string `json:"title"` + Content string `json:"content"` + BodyFormat string `json:"bodyformat"` + Priority string `json:"priority"` + Attachments []MailAttachment `json:"attachments"` +} + +// 邮件附件结构体 +type MailAttachment struct { + Name string `json:"name"` + Data interface{} `json:"data"` +} + +// SendMailResp 调用邮件发送API的通用请求的返回结构体 +type SendMailResp struct { + //返回码 + Code uint + //返回信息 + Message string + //返回结果内容,也是一个key-value Result:{"MessageId":"XXX"} + Result map[string]string +} + +// 生成32位MD5 +func MD5(text string) string{ + ctx := md5.New() + ctx.Write([]byte(text)) + return hex.EncodeToString(ctx.Sum(nil)) +} + +// 触发邮件发送 +func SendMail(log logger.Logger, repo model.Repo, conf *config.Config, sendmailreq *SendMailReq) (err error) { + //参数 说明 + //ESB为应用生成的appid apptoken + appid := conf.ExternalService.ESBAppID + apptoken := conf.ExternalService.ESBAppToken + //nonce 5位随机数字 + r := rand.New(rand.NewSource(time.Now().UnixNano())) + nonce := strconv.FormatInt(r.Int63(),10)[:5] + //timestamp Unix的时间戳,即当前时间的utc距离1970年1月1日0点整的秒数。如2016/8/31 0:00:00,转化后值为 1472572800 + timestamp := strconv.FormatInt(time.Now().Unix(), 10) + //signature 加密签名。算法为 MD5(MD5(AppId + Nonce + Timestamp) + appToken); appToken为指派的appToken。 + //注意:AppId + Nonce + Timestamp是字符串相加,MD5中算法的编码要用UTF-8,全部都是小写,比如:MD5(MD5(AppId + Nonce + Timestamp).ToLower() + appToken)).ToLower() + signature := strings.ToLower(MD5(strings.ToLower(MD5(appid + nonce + timestamp)) + apptoken)) + + netSendMailURL := fmt.Sprintf("%s/service/message/mailsend?appid=%s&nonce=%s&timestamp=%s&signature=%s", conf.ExternalService.ESBBaseURL, + appid, nonce, timestamp, signature) + // 参数校验 + if sendmailreq.From == "" { + log.Error("发件人邮箱不允许为空") + return errors.New("发件人邮箱不允许为空") + } + if sendmailreq.Title == "" { + log.Error("邮件标题不允许为空") + return errors.New("邮件标题不允许为空") + } + if sendmailreq.Content == "" { + log.Error("邮件正文不允许为空") + return errors.New("邮件标题不允许为空") + } + if sendmailreq.To == "" && sendmailreq.CC == "" { + log.Error("收件人邮箱与抄送人邮箱不允许同时为空") + return errors.New("收件人邮箱与抄送人邮箱不允许同时为空") + } + reqBody, err := json.Marshal(sendmailreq) + if err != nil { + log.Error(err) + return err + } + //log.Debugf("POST %s, request body: %s", netSendMailURL, reqBody) + req, err := http.NewRequest("POST", netSendMailURL, bytes.NewBuffer(reqBody)) + if err != nil { + log.Error(err) + return err + } + req.Header.Add("Content-Type", "application/json") + + res, err := http.DefaultClient.Do(req) + if err != nil { + log.Error(err) + return err + } + defer res.Body.Close() + + respBytes, err := ioutil.ReadAll(res.Body) + sendmailresp := new(SendMailResp) + if err = json.Unmarshal(respBytes, &sendmailresp); err != nil { + log.Errorf("unmarshal /service/message/mailsend resp err: %s", err.Error()) + return fmt.Errorf("解析json编码数据错误:%s", err.Error()) + } + if sendmailresp.Code != 0 { + log.Error("mailsend error: Code != 0") + log.Errorf("mailsend error detail: %s", sendmailresp.Message) + return fmt.Errorf("调用邮件发送接口错误:%s", "Code != 0") + } + log.Infof("mailsend success, Message: %s", sendmailresp.Message) + return nil +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/middleware/operate.go b/cyclone-server/src/idcos.io/cloudboot/middleware/operate.go new file mode 100644 index 0000000000000000000000000000000000000000..b964dfe0fcd5a0b7ab7eb06be6bc5cbd2a547a7d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/middleware/operate.go @@ -0,0 +1,511 @@ +package middleware + +import ( + "bytes" + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "reflect" + "runtime/debug" + "strconv" + "strings" + "sync" + "time" + + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils" + http3 "idcos.io/cloudboot/utils/http" +) + +//RoutesConf 路由配置 +type RoutesConf struct { + HTTPMethod string `json:"http_method"` + URL string `json:"url"` + CategoryCode string `json:"category_code"` + CategoryName string `json:"category_name"` + ReqParamDesensitization string `json:"req_param_desensitization"` + RespParamDesensitization string `json:"resp_param_desensitization"` + GetDBMethod string `json:"method"` +} + +var once sync.Once +var routesConf []*RoutesConf + +//GetRoutesConf 获取路由的配置信息 +func GetRoutesConf(repo model.Repo, logger logger.Logger) { + //TODO 前期需要大量的测试,不断地修改数据库,所以此处的单例先取消 + if len(routesConf) != 0 { + return + } + + once.Do(func() { + sys, err := repo.GetSystemSetting("route_conf") + if err != nil { + logger.Errorf("GetSystemSetting route_conf err,%s", err.Error()) + return + } + + if err = json.Unmarshal([]byte(sys.Value), &routesConf); err != nil { + logger.Errorf("json unmarshal route_conf value err,%s", err.Error()) + } + }) +} + +//Responser 手工构造response,用于获取http response信息 +type Responser struct { + w http.ResponseWriter + buf *bytes.Buffer +} + +//Header Header +func (r *Responser) Header() http.Header { + return r.w.Header() +} + +//Write Write +func (r *Responser) Write(buf []byte) (int, error) { + r.buf.Write(buf) + return r.w.Write(buf) +} + +//WriteHeader WriteHeader +func (r *Responser) WriteHeader(statusCode int) { + r.w.WriteHeader(statusCode) +} + +// OperateInterceptor 操作记录拦截器 +func OperateInterceptor(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + // 声明 + // 源和目标数据 + var source, destination interface{} + url := strings.TrimSpace(r.URL.String()) + method := r.Method + log, _ := LoggerFromContext(r.Context()) + repo, _ := RepoFromContext(r.Context()) + t1 := time.Now() + + //获取http RequestBody + reqBody, _ := ioutil.ReadAll(r.Body) + r.Body.Close() + r.Body = ioutil.NopCloser(bytes.NewBuffer(reqBody)) + + if http.MethodGet == r.Method { + next.ServeHTTP(w, r) + return + } + + // 根据url获取配置信息 + conf := isURLExist(url, method, repo, log) + + if conf == nil { + log.Debugf("[OperateInterceptor]--> config is null") + next.ServeHTTP(w, r) + return + } + + ww := &Responser{ + w: w, + buf: bytes.NewBufferString(""), + } + + //catch 异常,进行log,不影响http请求的结果 + defer func() { + if rvr := recover(); rvr != nil { + next.ServeHTTP(w, r) + log.Errorf("[OperateInterceptor]--> operate interceptor fail:%s\n stack: %s", rvr, debug.Stack()) + } + }() + + //处理API调用记录信息 + defer func() { + if r.ContentLength >= 10000 { + log.Debugf("[OperateInterceptor]--> HttpRequest ContentLength is too large, do not SaveAPILog ------> url: %s, method: %s,time: %s", + r.URL.String(), r.Method, fmt.Sprintf("%#v", time.Now().Sub(t1))) + return + } + + if len(ww.buf.String()) >= 10000 { + log.Debugf("[OperateInterceptor]--> HttpReponse Body is too large, ignore it ------> url: %s, method: %s,time: %s", + r.URL.String(), r.Method, fmt.Sprintf("%#v", time.Now().Sub(t1))) + + SaveAPILog(r, conf, repo, log, `{"status":"success","content":{},"message":"处理成功"}`, "", time.Now().Sub(t1).Seconds()) + return + + } + + log.Debugf("[OperateInterceptor]--> start to SaveAPILog ------> url: %s, method: %s, form: %s, response: %s, time: %s", + r.URL.String(), r.Method, fmt.Sprintf("%#v", r.Form), ww.buf.String(), fmt.Sprintf("%#v", time.Now().Sub(t1))) + SaveAPILog(r, conf, repo, log, ww.buf.String(), string(reqBody), time.Now().Sub(t1).Seconds()) + }() + + // 若conf当中的getmethod没有配置 + if conf.GetDBMethod == "" { + log.Warnf("[OperateInterceptor]--> route config GetDBMethod is null, config details: %s", utils.ToJsonString(conf)) + next.ServeHTTP(ww, r) + return + } + + //从URL当中拿到ID + ids := GetIDsFromReq(r, conf) + + if len(ids) > 0 { + source = GetRespVal(repo, conf.GetDBMethod, ids) + } + + //若url在配置当中存在,保存操作记录信息 + defer func() { + if strings.Contains(ww.buf.String(), "操作成功") { + // 若为新增,需要去拿id + switch method { + case http.MethodPost: + values := GetIDsFromResp(r, ww) + if len(values) > 0 { + destination = GetRespVal(repo, conf.GetDBMethod, values) + } + case http.MethodPut: + if len(ids) > 0 { + destination = GetRespVal(repo, conf.GetDBMethod, ids) + } else { + values := GetIDsFromResp(r, ww) + if len(values) > 0 { + destination = GetRespVal(repo, conf.GetDBMethod, values) + } + } + case http.MethodDelete: + destination = struct{}{} + } + + saveOperate(r, conf, utils.ToJsonString(source), utils.ToJsonString(destination)) + } else { + log.Debugf("[OperateInterceptor]--> http response not success ------> url: %s, method: %s,form: %s, time: %s", + r.URL.String(), r.Method, fmt.Sprintf("%#v", r.Form), fmt.Sprintf("%#v", time.Now().Sub(t1))) + } + + }() + next.ServeHTTP(ww, r) + } + + return http.HandlerFunc(fn) +} + +//SaveAPILog 保存API log信息 +func SaveAPILog(req *http.Request, conf *RoutesConf, repo model.Repo, log logger.Logger, resp string, reqBody string, cost float64) { + + user, _ := LoginUserFromContext(req.Context()) + + userName := "unknown user" + if user != nil { + userName = user.LoginName + } + + var resbody http3.RespBody + if resp != "" { + log.Debugf("SaveAPILog ------> begin to unmarshal resp: %v", resp) + if err := json.Unmarshal([]byte(resp), &resbody); err != nil { + log.Error(err) + return + } + } else { + log.Debugf("SaveAPILog ------> resp is %v, skip it", resp) + return + } + + description := "" + reqParamDesensitization := "" + respParamDesensitization := "" + if conf != nil { + description = conf.CategoryName + reqParamDesensitization = conf.ReqParamDesensitization + respParamDesensitization = conf.RespParamDesensitization + } + + al := &model.APILog{ + CreatedAt: time.Now(), + API: req.URL.String(), + Operator: userName, + Description: description, + Method: req.Method, + ReqBody: desensitizationParam(reqBody, reqParamDesensitization), + RemoteAddr: req.Host, + Status: resbody.Status, + Msg: resbody.Message, + Result: desensitizationParam(utils.ToJsonString(resbody.Content), respParamDesensitization), + Time: cost, + } + + if _, err := repo.SaveAPILog(al); err != nil { + log.Error(err) + } +} + +//desensitizationParam 脱敏参数信息 desValues是需要脱敏的字段列表 +func desensitizationParam(param, desValues string) string { + res := param + if desValues == "" || !strings.Contains(param, ",") { + return param + } + + for _, item := range strings.Split(param, ",") { + if !strings.Contains(item, ":") { + continue + } + + k := strings.Split(item, ":")[0] + v := strings.Split(item, ":")[1] + + if k == "" || v == "" { + continue + } + + k = strings.Trim(strings.Trim(strings.Trim(k, "["), "{"), "\n\t") + v = strings.Trim(strings.Trim(v, "]"), "}") + + for _, des := range strings.Split(desValues, ",") { + if strings.Trim(k, "\"") == des { + res = strings.Replace(res, v, "\"*****\"", -1) + } + } + + } + return res +} + +//GetIDsFromResp 从resp当中拿到id +func GetIDsFromResp(r *http.Request, ww *Responser) (values []reflect.Value) { + var respBody http3.RespBody + log, _ := LoggerFromContext(r.Context()) + if err := json.Unmarshal([]byte(ww.buf.String()), &respBody); err != nil { + log.Warnf("[OperateInterceptor]--> son unmarshal (%s) error:%s", ww.buf.String(), err.Error()) + return + } + // 这里拿到的id,竟然是float64? + id := fmt.Sprintf("%g", respBody.Content["id"]) + if id == "" { + log.Errorf("[OperateInterceptor]--> post method not return id, url is : %s", strings.TrimSpace(r.URL.String())) + return + } + if strToUint(id) != nil { + values = append(values, reflect.ValueOf(*strToUint(id))) + } + return +} + +//GetIDsFromReq 从request当中拿到http的id +func GetIDsFromReq(r *http.Request, conf *RoutesConf) (values []reflect.Value) { + //从URLParam当中拿不到id,为空 + //id := chi.URLParam(r, "id") + + //折中取法,若url当中不为id,则取不到 + id := strings.Replace(strings.TrimSpace(r.URL.String()), strings.Replace(conf.URL, "{id}", "", -1), "", -1) + + if id == "" { + //若id为空,从queryParam当中再取一次 + id = r.URL.Query().Get("id") + } + uintID := strToUint(id) + if uintID != nil { + values = append(values, reflect.ValueOf(*uintID)) + return + } + + //TODO 若Id还为空,则从body当中取 + if id == "" { + + } + + return +} + +func strToUint(str string) *uint { + // string to uint + uintID, err := strconv.ParseUint(str, 10, 0) + if err != nil { + return nil + } + + uid := uint(uintID) + + return &uid +} + +//saveOperate 保存操作记录信息 +func saveOperate(r *http.Request, conf *RoutesConf, source, destination string) { + userName := "unknow user" + repo, _ := RepoFromContext(r.Context()) + log, _ := LoggerFromContext(r.Context()) + user, ok := LoginUserFromContext(r.Context()) + + if ok || user != nil { + userName = user.LoginName + } + + operate := &model.OperateLog{ + CreatedAt: time.Now(), + Operator: userName, + URL: r.URL.String(), + HTTPMethod: r.Method, + CategoryName: conf.CategoryName, + CategoryCode: conf.CategoryCode, + Source: source, + Destination: destination, + } + + if _, err := repo.SaveOperateLog(operate); err != nil { + log.Errorf("[OperateInterceptor]--> save operate error, %s", err.Error()) + } +} + +// isURLExist 判断URL是否存在 +func isURLExist(url, method string, repo model.Repo, logger logger.Logger) *RoutesConf { + //if len(routesConf) <= 0 { + // GetRoutesConf(repo, logger) + //} + + GetRoutesConf(repo, logger) + + for _, conf := range routesConf { + if strings.ToUpper(conf.HTTPMethod) != method { + continue + } + + if urlCompare(conf.URL, url) { + return conf + } + } + return nil +} + +//urlCompare url对比 +func urlCompare(url1, url2 string) bool { + url1 = strings.Replace(url1, "/api/cloudboot/v1/", "", -1) + url2 = strings.Replace(url2, "/api/cloudboot/v1/", "", -1) + + //去掉url2当中的? + if strings.Contains(url2, "?") { + url2 = url2[0:strings.Index(url2, "?")] + } + + res := true + if url1 == url2 { + return true + } + + u1 := strings.Split(url1, "/") + u2 := strings.Split(url2, "/") + + if len(u1) != len(u2) { + return false + } + + for i, item := range u1 { + if strings.Contains(item, "{") || strings.Contains(item, "}") { + if item != u2[i] { + //res = false + //break + //比如实际的SN:123456,而URL配置占位符{sn},这个值不比较 + continue + } + } + + if strings.Contains(u2[i], "{") || strings.Contains(u2[i], "}") { + continue + } + + if item != u2[i] { + res = false + break + } + } + + return res +} + +//GetRespVal 反射获取结果 +func GetRespVal(repo model.Repo, method string, args []reflect.Value) interface{} { + //getType := reflect.TypeOf(repo) + getVal := reflect.ValueOf(repo) + + //fmt.Printf("type: %s\n", getType) + // 获取interface value当中的method + methodVal := getVal.MethodByName(method) + + respMap := map[string]interface{}{} + + // 反射调用func,并返回结果 + for _, resp := range methodVal.Call(args) { + + //fmt.Printf("type string %s\n", resp.Type().String()) + + if resp.IsNil() && resp.Type().String() == "error" { + continue + } + + //fmt.Println(utils.ToJsonString(resp)) + + respV := resp.Elem() + + //fmt.Println(respV) + + respT := respV.Type() + + for i := 0; i < respT.NumField(); i++ { + if !resp.CanInterface() { + continue + } + + field := respT.Field(i) + + key := strings.Replace(string(respT.Field(i).Tag), "gorm:\"column:", "", -1) + key = strings.Replace(key, "\"", "", -1) + + if key == "" { + continue + } + + respMap[key] = GetValue(field.Name, field.Type.Kind().String(), respV) + + //fmt.Printf("key:%s, value: %s\n", key, respV.FieldByName(respT.Field(i).Name)) + } + + //如何通过反射去获取这四个字段呢? + respMap["updated_at"] = GetValue("UpdatedAt", "time", respV) + respMap["created_at"] = GetValue("CreatedAt", "time", respV) + respMap["deleted_at"] = GetValue("DeletedAt", "time", respV) + respMap["id"] = GetValue("ID", reflect.Uint.String(), respV) + } + return respMap +} + +//GetValue 转换field信息 +func GetValue(key, typ string, val reflect.Value) (v interface{}) { + str := fmt.Sprintf("%v", val.FieldByName(key)) + var err error + + switch typ { + case reflect.Int.String(): + v, err = strconv.Atoi(str) + case reflect.Uint.String(): + v = strToUint(str) + case reflect.Bool.String(): + v, err = strconv.ParseBool(str) + case reflect.Float32.String(): + v, err = strconv.ParseFloat(str, 32) + case reflect.Float64.String(): + v, err = strconv.ParseFloat(str, 64) + case "time": + if strings.Contains(str, "CST") { + v, err = time.Parse("2006-01-02 15:04:05 +0800 CST", str) + } + default: + v = str + } + + if err != nil { + fmt.Printf("fail to convert str to %s, err: %s\n", typ, err.Error()) + } + + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/middleware/operate_test.go b/cyclone-server/src/idcos.io/cloudboot/middleware/operate_test.go new file mode 100644 index 0000000000000000000000000000000000000000..ead692c324c6b1fef2ef582e5042eff771a37d5c --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/middleware/operate_test.go @@ -0,0 +1,52 @@ +package middleware + +import ( + "fmt" + "reflect" + "testing" + + _ "github.com/go-sql-driver/mysql" + "idcos.io/cloudboot/config" + "idcos.io/cloudboot/config/jsonconf" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model/mysqlrepo" + "idcos.io/cloudboot/utils" +) + +func TestReflectRepo(t *testing.T) { + conf := GetConf() + repo, err := GetRepo(conf, GetLog(conf)) + if err != nil { + t.Error(err.Error()) + return + } + if repo == nil { + t.Errorf("fail load repo") + } + + respMap := GetRespVal(repo, "GetImageTemplateByID", []reflect.Value{reflect.ValueOf(1)}) + fmt.Println(utils.ToJsonString(respMap)) +} + +func GetConf() *config.Config { + conf, err := jsonconf.New("../../../../doc/conf/cloudboot-server.conf").Load() + if err != nil { + fmt.Printf("load config file error,%s", err.Error()) + return nil + } + + return conf +} + +func GetLog(conf *config.Config) logger.Logger { + return logger.NewBeeLogger(&conf.Logger) + +} + +func GetRepo(conf *config.Config, log logger.Logger) (repo *mysqlrepo.MySQLRepo, err error) { + repo, err = mysqlrepo.NewRepo(conf, log) + if err != nil { + return nil, err + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/middleware/repo.go b/cyclone-server/src/idcos.io/cloudboot/middleware/repo.go new file mode 100644 index 0000000000000000000000000000000000000000..47006f8b31a3dbfd8283fb6fb47fd6f49c1c69f0 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/middleware/repo.go @@ -0,0 +1,28 @@ +package middleware + +import ( + "context" + "net/http" + + "idcos.io/cloudboot/model" +) + +// ctxRepoKey 注入的model.Repo对应的查询Key +var ctxRepoKey uint8 + +// RepoFromContext 从ctx中获取model.Repo +func RepoFromContext(ctx context.Context) (model.Repo, bool) { + repo, ok := ctx.Value(&ctxRepoKey).(model.Repo) + return repo, ok +} + +// InjectRepo 注入model.Repo +func InjectRepo(repo model.Repo) func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + r = r.WithContext(context.WithValue(r.Context(), &ctxRepoKey, repo)) + next.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/api_log.go b/cyclone-server/src/idcos.io/cloudboot/model/api_log.go new file mode 100644 index 0000000000000000000000000000000000000000..84edc0799feaa1bcec2770bd5fac18da75dbb2c3 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/api_log.go @@ -0,0 +1,54 @@ +package model + +import ( + "time" + + "github.com/voidint/page" +) + +type ( + // APILog 操作记录 + APILog struct { + ID uint `gorm:"column:id" json:"id"` + CreatedAt time.Time `gorm:"column:created_at" json:"created_at"` + Operator string `gorm:"column:operator" json:"operator"` + Description string `gorm:"column:description" json:"description"` + API string `gorm:"column:api" json:"api"` + ReqBody string `gorm:"column:req_body" json:"req_body"` + Method string `gorm:"column:method" json:"method"` + Status string `gorm:"column:status" json:"status"` + RemoteAddr string `gorm:"column:remote_addr" json:"remote_addr"` + Msg string `gorm:"column:msg" json:"msg"` + Result string `gorm:"column:result" json:"result"` + Time float64 `gorm:"column:time" json:"time"` + } + + // APILogCond 操作记录查询条件 + APILogCond struct { + CreatedAtStart time.Time `json:"created_at_start"` + CreatedAtEnd time.Time `json:"created_at_end"` + Operator string `json:"operator"` + Description string `json:"desc"` + API string `json:"api"` + Method string `json:"method"` + CategoryName string `json:"category_name"` + Status string `json:"status"` + Cost1 float64 `json:"cost1"` + Cost2 float64 `json:"cost2"` + } +) + +// TableName 指定数据库表名 +func (APILog) TableName() string { + return "api_log" +} + +// IAPILog 操作记录持久化接口 +type IAPILog interface { + // SaveAPILog 保存操作记录 + SaveAPILog(*APILog) (id uint, err error) + // CountAPILog 统计满足过滤条件的操作记录数量 + CountAPILog(cond *APILogCond) (count int64, err error) + // GetAPILogByCond 返回满足过滤条件的操作记录 + GetAPILogByCond(cond *APILogCond, orderby OrderBy, limiter *page.Limiter) (items []*APILog, err error) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/approval.go b/cyclone-server/src/idcos.io/cloudboot/model/approval.go new file mode 100644 index 0000000000000000000000000000000000000000..880805c7393a40df40458baae20c12d1cae2a20a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/approval.go @@ -0,0 +1,213 @@ +package model + +import ( + "time" + + "github.com/voidint/page" +) + +const ( + // ApprovalTypeIDCAbolish 审批单类型-数据中心裁撤 + ApprovalTypeIDCAbolish = "idc_abolish" + // ApprovalTypeServerRoomAbolish 审批单类型-数据中心裁撤 + ApprovalTypeServerRoomAbolish = "server_room_abolish" + // ApprovalTypeNetAreaOffline 审批单类型-网络区域下线 + ApprovalTypeNetAreaOffline = "network_area_offline" + // ApprovalTypeIPUnassign 审批单类型-IP回收 + ApprovalTypeIPUnassign = "ip_unassign" + // ApprovalTypeDevPowerOff 审批单类型-物理机关机 + ApprovalTypeDevPowerOff = "device_power_off" + // ApprovalTypeDevRestart 审批单类型-物理机重启 + ApprovalTypeDevRestart = "device_restart" + // ApprovalTypeCabinetPowerOff 审批单类型-机架关电 + ApprovalTypeCabinetPowerOff = "cabinet_power_off" + // ApprovalTypeCabinetOffline 审批单类型-机架下架 + ApprovalTypeCabinetOffline = "cabinet_offline" + // ApprovalTypeDeviceOSReinstallation 审批单类型-物理机OS重装 + ApprovalTypeDeviceOSReinstallation = "device_os_reinstallation" + // ApprovalTypeDeviceMigration 审批单类型-物理机搬迁 + ApprovalTypeDeviceMigration = "device_migration" + // ApprovalTypeDeviceRetirement 审批单类型-物理机退役(报废) + ApprovalTypeDeviceRetirement = "device_retirement" + // ApprovalTypeDeviceRecycleReinstall 审批单类型-物理机回收(重装) + ApprovalTypeDeviceRecycleReinstall = "device_recycle_reinstall" + // ApprovalTypeDeviceRecyclePreMove 审批单类型-物理机回收(待搬迁) + ApprovalTypeDeviceRecyclePreMove = "device_recycle_pre_move" + // ApprovalTypeDeviceRecyclePreRetire 审批单类型-物理机回收(待退役) + ApprovalTypeDeviceRecyclePreRetire = "device_recycle_pre_retire" +) + +const ( + // ApprovalStatusApproval 审批单状态-审批中 + ApprovalStatusApproval = "approval" + // ApprovalStatusCompleted 审批单状态-已完成 + ApprovalStatusCompleted = "completed" + // ApprovalStatusRevoked 审批单状态-已撤销 + ApprovalStatusRevoked = "revoked" + // ApprovalStatusFailure 审批单状态-失败 + ApprovalStatusFailure = "failure" +) + +const ( + MigTypeStore2Usite = "store_to_usite" //库房->机架 + MigTypeUsite2Usite = "usite_to_usite" //机架->机架 + MigTypeUsite2Store = "usite_to_store" //机架->库房 + MigTypeStore2Store = "store_to_store" //库房->库房 +) + +// Approval 审批 +type Approval struct { + ID uint `gorm:"column:id"` // 审批单ID + Title string `gorm:"column:title"` // 审批单标题 + Type string `gorm:"column:type"` // 审批类型 + Metadata string `gorm:"column:metadata"` // 审批单元数据 + FrontData string `gorm:"column:front_data"` // 审批单元数据快照 + Initiator string `gorm:"column:initiator"` // 审批发起人ID + Approvers string `gorm:"column:approvers"` // 审批人ID构成的JSON数组字符串 + Cc string `gorm:"column:cc"` // 抄送人ID构成的JSON数组字符串 + Remark string `gorm:"column:remark"` //备注信息 + StartTime *time.Time `gorm:"column:start_time"` // 审批开始时间 + EndTime *time.Time `gorm:"column:end_time"` // 审批结束时间 + IsRejected string `gorm:"column:is_rejected"` // 审批单是否被拒绝 + Status string `gorm:"column:status"` // 审批单状态 +} + +// TableName 指定数据库表名 +func (Approval) TableName() string { + return "approval" +} + +const ( + // ApprovalActionAgree 审批动作-同意 + ApprovalActionAgree = "agree" + // ApprovalActionReject 审批动作-拒绝 + ApprovalActionReject = "reject" +) + +// ApprovalStep 审批步骤 +type ApprovalStep struct { + ID uint `gorm:"column:id"` // 审批步骤ID + ApprovalID uint `gorm:"column:approval_id"` // 所属审批单ID + Approver string `gorm:"column:approver"` // 审批步骤审批人ID + Title string `gorm:"column:title"` // 审批步骤标题 + Action *string `gorm:"column:action"` // 审批动作 + Remark string `gorm:"column:remark"` // 审批批注 + StartTime *time.Time `gorm:"column:start_time"` // 审批步骤开始时间 + EndTime *time.Time `gorm:"column:end_time"` // 审批步骤结束时间 + Hooks string `gorm:"column:hooks"` // 当前审批步骤同意后执行的钩子对象数组字符串 +} + +// TableName 指定数据库表名 +func (ApprovalStep) TableName() string { + return "approval_step" +} + +// IApproval 审批功能数据库操作接口 +type IApproval interface { + // SubmitApproval 提交审批单及其审批步骤 + SubmitApproval(approval *Approval, steps ...*ApprovalStep) (err error) + // RevokeApproval 撤销目标审批单 + RevokeApproval(approvalID uint) (err error) + // Approve 审批 + Approve(approvalID, stepID uint, action, remark string) error + // UpdateApproval 修改审批单 + UpdateApproval(mod *Approval) (affected int64, err error) + // GetApprovalByID 查询指定审批单 + GetApprovalByID(approvalID uint) (approval *Approval, err error) + // GetApprovalStepByApprovalID 查询指定审批单的审批步骤明细 + GetApprovalStepByApprovalID(approvalID uint) (steps []*ApprovalStep, err error) + // GetInitiatedApprovals 查询'我发起的'审批分页列表 + GetInitiatedApprovals(currentUserID string, cond *Approval, orderby OrderBy, limiter *page.Limiter) (items []*Approval, err error) + // GetPendingApprovals 查询'待我审批'的审批分页列表 + GetPendingApprovals(currentUserID string, cond *Approval, orderby OrderBy, limiter *page.Limiter) (items []*Approval, err error) + // GetApprovedApprovals 查询'我已审批的'的审批分页列表 + GetApprovedApprovals(currentUserID string, cond *Approval, orderby OrderBy, limiter *page.Limiter) (items []*Approval, err error) + // CountApprovals 统计审批单个数 + CountInitiatedApprovals(currentUserID string, cond *Approval) (int64, error) + // CountApprovals 统计审批单个数 + CountPendingApprovals(currentUserID string, cond *Approval) (int64, error) + // CountApprovals 统计审批单个数 + CountApprovedApprovals(currentUserID string, cond *Approval) (int64, error) + // GetApprovalStepByCond 根据条件查询指定审批单的审批步骤明细 + GetApprovalStepByCond(cond *ApprovalStep, isApproved bool) (steps []*ApprovalStep, err error) + //GetApprovalStepByID 根据审批步骤ID查询审批步骤 + GetApprovalStepByID(stepID uint) (step *ApprovalStep, err error) + // UpdateApprovalStep 修改审批步骤 + UpdateApprovalStep(mod *ApprovalStep) (affected int64, err error) +} + +const ( + // HookIDCAbolish 数据中心裁撤钩子 + HookIDCAbolish = "idc_abolish_hook" + // HookServerRoomAbolish 数据中心裁撤钩子 + HookServerRoomAbolish = "server_room_abolish_hook" + // HookNetAreaOffline 网络区域下线 + HookNetAreaOffline = "net_area_offline_hook" + // HookIPUnassign IP回收 + HookIPUnassign = "ip_unassign_hook" + // HookDevPowerOff 物理机关机钩子 + HookDevPowerOff = "device_power_off_hook" + // HookDevRestart 物理机重启钩子 + HookDevRestart = "device_restart_hook" + // HookCabinetPowerOff 机架关电钩子 + HookCabinetPowerOff = "cabinet_power_off_hook" + // HookCabinetOffline 机架下线钩子 + HookCabinetOffline = "cabinet_offline_hook" + // HookDeviceMigration 物理机搬迁钩子 + HookDeviceMigration = "device_migration_hook" + // HookDeviceMigrationPowerOff 物理机搬迁关电钩子 + HookDeviceMigrationPowerOff = "device_migration_poweroff_hook" + // HookDeviceMigrationReleaseIP 物理机搬迁释放IP钩子 + HookDeviceMigrationReleaseIP = "device_migration_release_ip_hook" + // HookDeviceMigrationReserveIP 物理机搬迁保留IP钩子 + HookDeviceMigrationReserveIP = "device_migration_reserve_ip_hook" + // HookDeviceRetirementPowerOff 物理机退役远程关机钩子 + HookDeviceRetirementPowerOff = "device_retirement_poweroff_hook" + // HookDeviceRetirementReleaseIP 物理机退役释放IP钩子 + HookDeviceRetirementReleaseIP = "device_retirement_release_ip_hook" + // HookDeviceRetirementReserveIP 物理机退役释放IP钩子 + HookDeviceRetirementReserveIP = "device_retirement_reserve_ip_hook" + // HookDeviceRetirement 物理机退役钩子(修改状态) + HookDeviceRetirement = "device_retirement_hook" + // HookDeviceOSReinstallation 物理机OS重装钩子 + HookDeviceOSReinstallation = "device_os_reinstallation_hook" + // HookDeviceRecycleReinstall 物理机回收钩子 + HookDeviceRecycleReinstall = "device_recycle_reinstall_hook" + // HookDeviceRecyclePreMove 物理机回收待搬迁钩子 + HookDeviceRecyclePreMove = "device_recycle_pre_move_hook" + // HookDeviceRecyclePreRetire 物理机回收待退役钩子 + HookDeviceRecyclePreRetire = "device_recycle_pre_retire_hook" +) + +// StepHook 审批步骤钩子 +type StepHook struct { + ID string `json:"id"` // 字符串标识(唯一) + Description string `json:"description"` // 描述 + ContinueOnError bool `json:"continue_on_error"` // 执行发生错误后是否继续执行后续钩子 + Results []*StepHookResult `json:"results"` // 执行明细 +} + +// StepHookResult 钩子执行明细 +type StepHookResult struct { + TargetID string `json:"target_id"` // 目标对象标识字符串 + TargetType string `json:"target_type"` // 目标对象类型。可选值: cabinet-机架; physical_machine-物理机; + ExecResult string `json:"exec_result"` // 执行结果。可选值: success-成功; failure-失败; + ExecInfo string `json:"exec_info"` // 针对目标对象的执行结果信息 +} + +// BeforeSave 保存审批信息前的钩子方法。 +// 防止将空字符串写入类型为JSON的数据库字段中引发报错。 +func (app *Approval) BeforeSave() (err error) { + replaceIfBlank(&app.Metadata, EmptyJSONObject) + replaceIfBlank(&app.FrontData, EmptyJSONObject) + replaceIfBlank(&app.Approvers, EmptyJSONArray) + replaceIfBlank(&app.Cc, EmptyJSONArray) + return +} + +// BeforeSave 保存审批步骤信息前的钩子方法。 +// 防止将空字符串写入类型为JSON的数据库字段中引发报错。 +func (step *ApprovalStep) BeforeSave() (err error) { + replaceIfBlank(&step.Hooks, EmptyJSONArray) + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/component.go b/cyclone-server/src/idcos.io/cloudboot/model/component.go new file mode 100644 index 0000000000000000000000000000000000000000..98b970533695ae9ce134fae5ca4f1b1432bf6772 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/component.go @@ -0,0 +1,39 @@ +package model + +import "github.com/jinzhu/gorm" + +const ( + // ComponentAgent 组件-cloudboot-agent + ComponentAgent = "agent" + // ComponentHWServer 组件-hw-server + ComponentHWServer = "hw-server" + // ComponentPEConfig 组件-peconfig + ComponentPEConfig = "peconfig" + // ComponentWINConfig 组件-winconfig + ComponentWINConfig = "winconfig" + // OSConfigLog 系统配置日志 + OSConfigLog = "os-config" + // ImageCloneLog 系统配置日志 + ImageCloneLog = "image-clone" +) + +// ComponentLog 组件日志 +type ComponentLog struct { + gorm.Model + SN string `gorm:"column:sn"` + Component string `gorm:"column:component"` + LogData string `gorm:"column:log"` +} + +// TableName 指定数据库表名 +func (ComponentLog) TableName() string { + return "component_log" +} + +// IComponentLog 组件日志操作接口 +type IComponentLog interface { + // SaveComponentLogBySN 保存组件日志 + SaveComponentLogBySN(*ComponentLog) error + // GetComponentLog 查询指定设备的指定组件日志 + GetComponentLog(sn, component string) (*ComponentLog, error) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/data_dict.go b/cyclone-server/src/idcos.io/cloudboot/model/data_dict.go new file mode 100644 index 0000000000000000000000000000000000000000..f935a19862ebdcd05b9ec8098fcbb16243c4b06f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/data_dict.go @@ -0,0 +1,25 @@ +package model + +import "github.com/jinzhu/gorm" + +//DataDict 数据字典 +type DataDict struct { + gorm.Model + Type string + Name string + Value string + Remark string +} + +//TableName 表名称 +func (DataDict) TableName() string { + return "data_dict" +} + +//IDataDict 数据字典接口 +type IDataDict interface { + AddDataDicts(items []*DataDict) error + DelDataDicts(items []*DataDict) error + UpdateDataDicts([]*DataDict) error + GetDataDictsByType(typ string) ([]*DataDict, error) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/device.go b/cyclone-server/src/idcos.io/cloudboot/model/device.go new file mode 100644 index 0000000000000000000000000000000000000000..a51d22705c003e1e732fe54a11ce13a179d92e2e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/device.go @@ -0,0 +1,309 @@ +package model + +import ( + "time" + + "github.com/jinzhu/gorm" + "github.com/voidint/page" +) + +const ( + //DevOperStatRunWithAlarm 设备运行状态:运行中(需告警) + DevOperStatRunWithAlarm = "run_with_alarm" + //DevOperStatRunWithoutAlarm 运行中(无需告警) + DevOperStatRunWithoutAlarm = "run_without_alarm" + //DevOperStatReinstalling 重装中 + DevOperStatReinstalling = "reinstalling" + //DevOperStatMoving 搬迁中 + DevOperStatMoving = "moving" + //DevOperStatPreRetire 待退役 + DevOperStatPreRetire = "pre_retire" + //DevOperStatRetiring 退役中 + DevOperStatRetiring = "retiring" + //DevOperStateRetired 已退役 + DevOperStateRetired = "retired" + //DevOperStatPreDeploy 待部署 + DevOperStatPreDeploy = "pre_deploy" + //DevOperStatOnShelve 已上架 + DevOperStatOnShelve = "on_shelve" + //DevOperStatRecycling 回收中 + DevOperStatRecycling = "recycling" + //DevOperStatMaintaining 维护中 + DevOperStatMaintaining = "maintaining" + //DevOperStatPreMove 待搬迁 + DevOperStatPreMove = "pre_move" + //DevOperStatInStore 库房中 + DevOperStatInStore = "in_store" + + //DevUsageSpecialDev 特殊设备 + DevUsageSpecialDev = "特殊设备" + + // PowerStatusOn 电源状态-开 + PowerStatusOn = "power_on" + // PowerStatusOff 电源状态-关 + PowerStatusOff = "power_off" +) + +const ( + // DevArchX8664 x86_64架构 + DevArchX8664 = "x86_64" + // DevArchAarch64 aarch64架构 + DevArchAarch64 = "aarch64" + // DevArchPPC64 ppc64架构 + DevArchPPC64 = "ppc64" +) + +// Device 设备 +type Device struct { + gorm.Model + FixedAssetNumber string `gorm:"column:fixed_asset_number"` + SN string `gorm:"column:sn"` + Vendor string `gorm:"column:vendor"` + DevModel string `gorm:"column:model"` + Arch string `gorm:"column:arch"` + Usage string `gorm:"column:usage"` + Category string `gorm:"column:category"` + IDCID uint `gorm:"column:idc_id"` + ServerRoomID uint `gorm:"column:server_room_id"` + CabinetID uint `gorm:"column:server_cabinet_id"` + USiteID *uint `gorm:"column:server_usite_id"` + StoreRoomID uint `gorm:"column:store_room_id"` + VCabinetID uint `gorm:"column:virtual_cabinet_id"` + HardwareRemark string `gorm:"column:hardware_remark"` + RAIDRemark string `gorm:"column:raid_remark"` + OOBInit string `gorm:"column:oob_init"` + StartedAt time.Time `gorm:"column:started_at"` + OnShelveAt time.Time `gorm:"column:onshelve_at"` + OperationStatus string `gorm:"column:operation_status"` + PowerStatus string `gorm:"power_status"` // 电源状态 + OOBIP string `gorm:"column:oob_ip"` + OOBUser string `gorm:"column:oob_user"` + OOBPassword string `gorm:"column:oob_password"` + OOBAccessible *string `gorm:"column:oob_accessible"` //带外纳管状态:yes|no + CPUSum uint `gorm:"column:cpu_sum"` + CPU string `gorm:"column:cpu"` + MemorySum uint `gorm:"column:memory_sum"` + Memory string `gorm:"column:memory"` + DiskSum uint `gorm:"column:disk_sum"` + Disk string `gorm:"column:disk"` + DiskSlot string `gorm:"column:disk_slot"` + NIC string `gorm:"column:nic"` + NICDevice string `gorm:"column:nic_device"` + BootOSIP string `gorm:"column:bootos_ip"` + BootOSMac string `gorm:"column:bootos_mac"` + Motherboard string `gorm:"column:motherboard"` + RAID string `gorm:"column:raid"` + OOB string `gorm:"column:oob"` + BIOS string `gorm:"column:bios"` + Fan string `gorm:"column:fan"` + Power string `gorm:"column:power"` + HBA string `gorm:"column:hba"` + PCI string `gorm:"column:pci"` + Switch string `gorm:"column:switch"` + LLDP string `gorm:"column:lldp"` + Extra string `gorm:"column:extra"` + OriginNode string `gorm:"column:origin_node"` + OriginNodeIP string `gorm:"column:origin_node_ip"` + OperUserID string `gorm:"column:operation_user_id"` //未使用 + Creator string `gorm:"column:creator"` + Updater string `gorm:"column:updater"` + Remark string `gorm:"column:remark"` + OrderNumber string `gorm:"column:order_number"` +} + +// BeforeSave 保存设备信息前的钩子方法。 +// 防止将空字符串写入类型为JSON的数据库字段中引发报错。 +func (dev *Device) BeforeSave() (err error) { + replaceIfBlank(&dev.CPU, EmptyJSONObject) + replaceIfBlank(&dev.Memory, EmptyJSONObject) + replaceIfBlank(&dev.Disk, EmptyJSONObject) + replaceIfBlank(&dev.DiskSlot, EmptyJSONObject) + replaceIfBlank(&dev.NIC, EmptyJSONObject) + replaceIfBlank(&dev.Motherboard, EmptyJSONObject) + replaceIfBlank(&dev.RAID, EmptyJSONObject) + replaceIfBlank(&dev.OOB, EmptyJSONObject) + replaceIfBlank(&dev.BIOS, EmptyJSONObject) + replaceIfBlank(&dev.Fan, EmptyJSONObject) + replaceIfBlank(&dev.Power, EmptyJSONObject) + replaceIfBlank(&dev.HBA, EmptyJSONObject) + replaceIfBlank(&dev.PCI, EmptyJSONObject) + replaceIfBlank(&dev.Switch, EmptyJSONObject) + replaceIfBlank(&dev.LLDP, EmptyJSONObject) + replaceIfBlank(&dev.Extra, EmptyJSONObject) + replaceIfBlank(&dev.OOBInit, EmptyJSONObject) + //replaceIfBlank(dev.OOBAccessible, Unknown) + return +} + +// CombinedDevice 设备信息及设备装机参数联合结构体 +type CombinedDevice struct { + Device + DeployStatus string `gorm:"column:deploy_status"` + InstallProgress float64 `gorm:"column:install_progress"` + IntranetIP string `gorm:"column:intranet_ip"` + ExtranetIP string `gorm:"column:extranet_ip"` + IntranetIPv6 string `gorm:"column:intranet_ipv6"` + ExtranetIPv6 string `gorm:"column:extranet_ipv6"` + OS string `gorm:"column:os"` + ImageTemplateID int `gorm:"column:image_tpl_id"` + ImageTemplateName string `gorm:"column:image_tpl_name"` + HardwareTemplateID int `gorm:"column:hardware_tpl_id"` + HardwareTemplateName string `gorm:"column:hardware_name"` + Hostname string `gorm:"column:hostname"` + InspectionRunStatus string `gorm:"column:inspection_run_status"` + InspectionResult string `gorm:"column:inspection_result"` + InspectionRemark string `gorm:"column:inspection_remark"` + DeviceLifecycleDeatail +} + +// CombinedDeviceCond 复杂的设备信息查询条件 +type CombinedDeviceCond struct { + //Device + IDCID []uint + ServerRoomID []uint + ServerCabinet string + ServerRoomName string + ServerUsiteNumber string + USiteID []uint + PhysicalArea string + FixedAssetNumber string + SN string + DevModel string + Vendor string + Usage string + Category string + OperationStatus string + IntranetIP string + ExtranetIP string + HardwareRemark string + IP string //模糊搜索内外网 + OOBAccessible string + // 部署状态,即OS安装状态 + DeployStatus string + PreDeployed bool // 标识是否是预部署状态物理机(没有任何安装记录的物理机) + ID []uint +} + +// TableName 指定数据库表名 +func (Device) TableName() string { + return "device" +} + +// CollectedDevice 采集到的设备信息结构体 +type CollectedDevice struct { + gorm.Model + OriginNode string `gorm:"column:origin_node"` + OriginNodeIP string `gorm:"column:origin_node_ip"` + SN string `gorm:"column:sn"` + Vendor string `gorm:"column:vendor"` + ModelName string `gorm:"column:model"` + Arch string `gorm:"column:arch"` + CPUSum uint `gorm:"column:cpu_sum"` + CPU string `gorm:"column:cpu"` + MemorySum uint `gorm:"column:memory_sum"` + Memory string `gorm:"column:memory"` + DiskSum uint `gorm:"column:disk_sum"` + Disk string `gorm:"column:disk"` + DiskSlot string `gorm:"column:disk_slot"` + NIC string `gorm:"column:nic"` + NICDevice string `gorm:"column:nic_device"` + BootOSIP string `gorm:"column:bootos_ip"` + BootOSMac string `gorm:"column:bootos_mac"` + Motherboard string `gorm:"column:motherboard"` + RAID string `gorm:"column:raid"` + OOB string `gorm:"column:oob"` + BIOS string `gorm:"column:bios"` + Fan string `gorm:"column:fan"` + Power string `gorm:"column:power"` + HBA string `gorm:"column:hba"` + PCI string `gorm:"column:pci"` + Switch string `gorm:"column:switch"` + LLDP string `gorm:"column:lldp"` + Extra string `gorm:"column:extra"` +} + +// TableName 指定数据库表名 +func (CollectedDevice) TableName() string { + return "device" +} + + +// BeforeSave 保存设备信息前的钩子方法。 +// 防止将空字符串写入类型为JSON的数据库字段中引发报错。 +func (dev *CollectedDevice) BeforeSave() (err error) { + replaceIfBlank(&dev.CPU, EmptyJSONObject) + replaceIfBlank(&dev.Memory, EmptyJSONObject) + replaceIfBlank(&dev.Disk, EmptyJSONObject) + replaceIfBlank(&dev.DiskSlot, EmptyJSONObject) + replaceIfBlank(&dev.NIC, EmptyJSONObject) + replaceIfBlank(&dev.Motherboard, EmptyJSONObject) + replaceIfBlank(&dev.RAID, EmptyJSONObject) + replaceIfBlank(&dev.OOB, EmptyJSONObject) + replaceIfBlank(&dev.BIOS, EmptyJSONObject) + replaceIfBlank(&dev.Fan, EmptyJSONObject) + replaceIfBlank(&dev.Power, EmptyJSONObject) + replaceIfBlank(&dev.HBA, EmptyJSONObject) + replaceIfBlank(&dev.PCI, EmptyJSONObject) + replaceIfBlank(&dev.Switch, EmptyJSONObject) + replaceIfBlank(&dev.LLDP, EmptyJSONObject) + replaceIfBlank(&dev.Extra, EmptyJSONObject) + return +} + +// IDevice 物理机设备 +type IDevice interface { + // RemoveDeviceByID 删除指定ID的物理机 + RemoveDeviceByID(id uint) (affected int64, err error) + // RemoveDeviceBySN 删除指定SN的物理机 + RemoveDeviceBySN(sn string) (affected int64, err error) + // SaveDevice 保存物理机 + SaveDevice(*Device) (affected int64, err error) + // UpdateDevice 修改物理机 + UpdateDevice(*Device) (affected int64, err error) + // UpdateDeviceBySN 更新目标设备的 + UpdateDeviceBySN(*Device) (affected int64, err error) + // GetDeviceByID 返回指定ID的物理机 + GetDeviceByID(id uint) (*Device, error) + // CountDevices 统计满足过滤条件的物理机数量 + CountDevices(cond *Device) (count int64, err error) + // GetDevices 返回满足过滤条件的物理机 + GetDevices(cond *Device, orderby OrderBy, limiter *page.Limiter) (items []*Device, err error) + //GetDeviceBySN 根据SN查找设备 + GetDeviceBySN(SN string) (*Device, error) + // GetDeviceBySNOrMAC 根据SN或者mac地址查询设备 + GetDeviceBySNOrMAC(snOrMAC string) (*Device, error) + //GetDeviceBySN 根据SN查找设备 + GetDeviceByFixAssetNumber(fixAssetNum string) (*Device, error) + // CountCombinedDevices 统计满足过滤条件的记录数量 + CountCombinedDevices(cond *CombinedDeviceCond) (count int64, err error) + // GetCombinedDevices 返回满足过滤条件的设备及其装机参数列表 + GetCombinedDevices(cond *CombinedDeviceCond, orderby OrderBy, limiter *page.Limiter) (items []*CombinedDevice, err error) + // SaveCollectedDeviceBySN 保存(更新/新增)采集到的设备信息 + SaveCollectedDeviceBySN(*CollectedDevice) error + //GetDevicesByUSiteID 根据机位信息查询设备 + GetDevicesByUSiteID(id uint) (items []*Device, err error) + //GetDevicesByUSiteIDS 根据机位信息查询设备 + GetDevicesByUSiteIDS(id []uint, usage string) (items []*Device, err error) + // GetDeviceQuerys(param string) + GetDeviceQuerys(param string) (*DeviceQueryParamResp, error) + GetMaxFixedAssetNumber(month string) (fixedAssetNumber string, err error) + // GetDeviceByStartedAt 根据启用日期查询在该日期之前的设备 + GetDeviceByStartedAt(started_date string) (items []*Device, err error) + // GetDeviceByOperationStatus 根据运营状态查找设备 + GetDeviceByOperationStatus(started_date string) (items []*Device, err error) +} + +type DeviceQueryParamResp struct { + ParamName string `json:"param_name"` + List []ParamList `json:"list"` +} + +type ParamList struct { + ID string `json:"id"` + Name string `json:"name"` +} + +type ParamListINT struct { + ID uint `json:"id"` + Name string `json:"name"` +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/device_category.go b/cyclone-server/src/idcos.io/cloudboot/model/device_category.go new file mode 100644 index 0000000000000000000000000000000000000000..0138b3a92b87576f60eb31b2a561be636b8e176d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/device_category.go @@ -0,0 +1,41 @@ +package model + +import ( + "github.com/jinzhu/gorm" + "github.com/voidint/page" +) + +// DeviceCategory 设备类型 +type DeviceCategory struct { + gorm.Model + Category string `gorm:"column:category"` + Hardware string `gorm:"column:hardware"` //硬件配置 + CentralProcessorManufacturer string `gorm:"column:central_processor_manufacture"` // 处理器生产商 + CentralProcessorArch string `gorm:"column:central_processor_arch"` // 处理器架构 + Power string `gorm:"column:power"` //功率 + Unit uint `gorm:"column:unit"` //设备所占用的U数 机柜参数Unit 1U = 44.45mm + IsFITIEcoProduct string `gorm:"column:is_fiti_eco_product"` // Financial Information Technology Innovation Ecological Product 金融信创生态产品 + Remark string `gorm:"column:remark"` + Creator string `gorm:"column:creator"` +} + +// TableName 指定数据库表名 +func (DeviceCategory) TableName() string { + return "device_category" +} + +// IDeviceCategory 设备类型持久化接口 +type IDeviceCategory interface { + // RemoveDeviceCategoryByID 删除指定ID的设备类型 + RemoveDeviceCategoryByID(id uint) (affected int64, err error) + // SaveDeviceCategory 保存设备类型 + SaveDeviceCategory(*DeviceCategory) (affected int64, err error) + // GetDeviceCategoryByID 返回指定ID的设备类型 + GetDeviceCategoryByID(id uint) (*DeviceCategory, error) + // CountServerRooms 统计满足过滤条件的设备类型数量 + CountDeviceCategorys(cond *DeviceCategory) (count int64, err error) + // GetDeviceCategorys 返回满足过滤条件的设备类型 + GetDeviceCategorys(cond *DeviceCategory, orderby OrderBy, limiter *page.Limiter) (items []*DeviceCategory, err error) + GetDeviceCategoryByName(name string) (dc *DeviceCategory, err error) + GetDeviceCategoryQuerys(param string) (*DeviceQueryParamResp, error) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/device_hardware_setting.go b/cyclone-server/src/idcos.io/cloudboot/model/device_hardware_setting.go new file mode 100644 index 0000000000000000000000000000000000000000..9111b806c6b770bcb2648b9b11883f9727751b99 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/device_hardware_setting.go @@ -0,0 +1,92 @@ +package model + +import "github.com/jinzhu/gorm" + +var ( + // SupportedRAIDLevels 支持的raid级别 + SupportedRAIDLevels = []string{"raid0", "raid1", "raid5", "raid6", "raid10", "raid1e"} + // SupportedControllerIndexes RAID卡控制器索引(序号)。0-设备第一块RAID卡;1-设备第二块RAID卡;以此类推 + SupportedControllerIndexes = []string{"0", "1", "2", "3", "4"} + // SupportedOOBUserLevels 带外用户特权级别 + SupportedOOBUserLevels = []string{"1", "2", "3", "4", "5"} +) + +const ( + // CategoryRAID 硬件配置动作类别-RAID + CategoryRAID = "raid" + // CategoryBIOS 硬件配置动作类别-BIOS + CategoryBIOS = "bios" + // CategoryOOB 硬件配置动作类别-OOB + CategoryOOB = "oob" + // CategoryFW 硬件配置动作类别-固件升级 + CategoryFW = "firmware" + // CategoryReboot 硬件配置动作类别-重启 + CategoryReboot = "reboot" +) + +const ( + // ON 打开 + ON = "ON" + // OFF 关闭 + OFF = "OFF" +) + +const ( + // ActionRAIDClear 硬件配置动作-清除RAID配置 + ActionRAIDClear = "clear_settings" + // ActionRAIDCreate 硬件配置动作-创建RAID阵列 + ActionRAIDCreate = "create_array" + // ActionRAIDSetGlobalHotspare 硬件配置动作-设置全局热备盘 + ActionRAIDSetGlobalHotspare = "set_global_hotspare" + // ActionRAIDInitDisk 硬件配置动作-初始化逻辑磁盘 + ActionRAIDInitDisk = "init_disk" + // ActionRAIDSetJBOD 硬件配置动作-设置直通盘 + ActionRAIDSetJBOD = "set_jbod" + + // ActionReboot 硬件配置动作-重启 + ActionReboot = "reboot" + // ActionOOBAddUser 硬件配置动作-添加OOB用户 + ActionOOBAddUser = "add_user" + // ActionOOBResetBMC 硬件配置动作-重启BMC + ActionOOBResetBMC = "reset_bmc" + // ActionOOBSetIP 硬件配置动作-设置OOB BootOSIP + ActionOOBSetIP = "set_ip" + // ActionBIOSSet 硬件配置动作-设置BIOS项 + ActionBIOSSet = "set_bios" + // ActionFWUpdatePkg 硬件配置动作-更新固件包 + ActionFWUpdatePkg = "update_package" +) + +// DeviceHardwareSetting 装机参数-硬件配置参数 +type DeviceHardwareSetting struct { + gorm.Model + // 设备序列号 + SN string + // 当前配置项在配置项序列中的索引号(自0始) + Index uint + // 硬件配置动作类别 raid,oob,bios,firmware,reboot + Category string + // 硬件配置动作 reboot,add_user,reset_bmc,set_ip,set_bios,clear_settings,create_array,set_global_hotspare,init_disk,set_jbod,update_package + Action string + // 配置元数据 + Metadata map[string]string + // 是否已实施 yes/no + Applied string +} + +// TableName 指定数据库表名 +func (DeviceHardwareSetting) TableName() string { + return "device_hardware_setting" +} + +// IHardwareSetting 硬件配置操作接口 +type IHardwareSetting interface { + // OverwriteHardwareSettings 覆写指定设备的硬件配置参数 + OverwriteHardwareSettings(sn string, items ...*DeviceHardwareSetting) (err error) + // GetHardwareSettingsBySN 返回指定设备的硬件配置配置参数 + GetHardwareSettingsBySN(sn string) (items []*DeviceHardwareSetting, err error) + // UpdateHardwareSettingsApplied 更新满足过滤条件的硬件配置项实施状态 + UpdateHardwareSettingsApplied(cond *DeviceHardwareSetting, applied string) (affected int64, err error) + // RedoHardwareSettings 将指定设备的硬件配置项设置为'未实施'状态。 + RedoHardwareSettings(sn string) (affected int64, err error) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/device_lifecycle.go b/cyclone-server/src/idcos.io/cloudboot/model/device_lifecycle.go new file mode 100644 index 0000000000000000000000000000000000000000..3a50723ec787b65f0516710ffe60de3488528fe3 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/device_lifecycle.go @@ -0,0 +1,114 @@ +package model + +import ( + "time" + "github.com/jinzhu/gorm" +) + +const ( + // 维保状态枚举值:在保-under_warranty;过保-out_of_warranty;未激活-inactive' + MaintenanceServiceStatusUnderWarranty = "under_warranty" + MaintenanceServiceStatusOutOfWarranty = "out_of_warranty" + MaintenanceServiceStatusInactive = "inactive" + + // ChangeLog 变更类型枚举值 + OperationTypeAdd = "设备新增" + OperationTypeUpdate = "属性更新" + OperationTypePowerControl = "电源控制" + OperationTypeOSInstall = "系统部署" + OperationTypeMove = "设备搬迁" + OperationTypeRetire = "设备退役" + + // 是否租赁 + YESRental = "yes" + NORental = "no" +) + +// 固资号 WDEV+YYMM+0001,如WDEV21100001代表21年10月录入的设备 +// 序列号 设备SN +// 资产归属 腾讯云、华为云 +// 负责人 主要应对特殊设备 +// 是否租赁 +// 维保服务供应商 合同乙方,huawei\腾讯云l等,或者第三方采购的服务供应商,如神州数码 +// 物流服务内容 腾讯云接口人统一安排、华为接口人统一安排 +// 维保服务内容 "银牌服务: +// 7x24小时,第二个工作日上门,介质保留服务" +// 维保报障方式 "huawei: +// 800报修,腾讯大客户身份 +// lenovo: +// 800报修,腾讯大客户身份" +// 维保起始日期 上架导入日期+设备缓冲期 +// 维保截止日期 起始日期+合同维保期 +// 维保状态 在保-under_warranty;过保-out_of_warranty;未激活-inactive +// 设备退役日期 +// 变更记录 "[ +// { +// ""操作用户"":""jessewei"", +// ""操作类型"":""新增"", +// ""操作内容"":“XXX”, +// ""操作时间"":""2021-10-14 15:11:16"", +// }, +// { +// ""操作用户"":""jessewei"", +// ""操作类型"":""维修"", +// ""操作内容"":“XXX”, +// ""操作时间"":""2021-10-14 15:12:14"", +// }, +// ]" + +// LifecycLog JSON结构体 +type ChangeLog struct { + OperationUser string `json:"operation_user"` + OperationType string `json:"operation_type"` + OperationDetail string `json:"operation_detail"` + OperationTime string `json:"operation_time"` +} + + +// DeviceLifecycle 设备生命周期表(维保、资产、变更记录等详细信息) +type DeviceLifecycle struct { + gorm.Model + FixedAssetNumber string `gorm:"column:fixed_asset_number"` + SN string `gorm:"column:sn"` + AssetBelongs string `gorm:"column:asset_belongs"` + Owner string `gorm:"column:owner"` + IsRental string `gorm:"column:is_rental"` + MaintenanceServiceProvider string `gorm:"column:maintenance_service_provider"` + MaintenanceService string `gorm:"column:maintenance_service"` + LogisticsService string `gorm:"column:logistics_service"` + MaintenanceServiceDateBegin time.Time `gorm:"column:maintenance_service_date_begin"` + MaintenanceServiceDateEnd time.Time `gorm:"column:maintenance_service_date_end"` + MaintenanceServiceStatus string `gorm:"column:maintenance_service_status"` + DeviceRetiredDate time.Time `gorm:"column:device_retired_date"` + LifecycleLog string `gorm:"column:lifecycle_log"` +} + +// DeviceLifecycleDetail for CombinedDevice 设备信息及设备装机参数联合结构体 +type DeviceLifecycleDeatail struct { + AssetBelongs string `gorm:"column:asset_belongs"` + Owner string `gorm:"column:owner"` + IsRental string `gorm:"column:is_rental"` + MaintenanceServiceProvider string `gorm:"column:maintenance_service_provider"` + MaintenanceService string `gorm:"column:maintenance_service"` + LogisticsService string `gorm:"column:logistics_service"` + MaintenanceServiceDateBegin time.Time `gorm:"column:maintenance_service_date_begin"` + MaintenanceServiceDateEnd time.Time `gorm:"column:maintenance_service_date_end"` + MaintenanceServiceStatus string `gorm:"column:maintenance_service_status"` + DeviceRetiredDate time.Time `gorm:"column:device_retired_date"` + LifecycleLog string `gorm:"column:lifecycle_log"` +} + + +// TableName 指定数据库表名 +func (DeviceLifecycle) TableName() string { + return "device_lifecycle" +} + +// IDeviceLifecycle 持久化接口 +type IDeviceLifecycle interface { + SaveDeviceLifecycle(*DeviceLifecycle) (affected int64, err error) + RemoveDeviceLifecycleByID(id uint) (affected int64, err error) + RemoveDeviceLifecycleBySN(sn string) (affected int64, err error) + GetDeviceLifecycleBySN(sn string) (*DeviceLifecycle, error) + UpdateDeviceLifecycleBySN(*DeviceLifecycle) (err error) +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/model/device_log.go b/cyclone-server/src/idcos.io/cloudboot/model/device_log.go new file mode 100644 index 0000000000000000000000000000000000000000..bc90afae5f0df51ad9865f996c223088abc13e7e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/device_log.go @@ -0,0 +1,36 @@ +package model + +import "github.com/jinzhu/gorm" + +const ( + // DeviceLogInstallType 安装类型的主机日志 + DeviceLogInstallType = "install" + // DeviceLogHistoryType 安装历史类型的主机日志 + DeviceLogHistoryType = "install_history" +) + +// DeviceLog 系统安装进度日志 +type DeviceLog struct { + gorm.Model + SN string `gorm:"column:sn"` // 设备序列号 + DeviceSettingID uint `gorm:"column:device_setting_id"` // 设备装机参数ID + LogType string `gorm:"column:type"` // 进度日志类型 + Title string `gorm:"column:title"` // 进度日志标题 + Content string `gorm:"column:content"` // 进度日志内容 +} + +// TableName 表名信息 +func (DeviceLog) TableName() string { + return "device_log" + +} + +// IDeviceLog 系统安装进度日志接口 +type IDeviceLog interface { + // GetDeviceLogsByDeviceSettingID 根据装机参数id获取装机日志信息 + GetDeviceLogsByDeviceSettingID(id uint) (deviceLogs []DeviceLog, err error) + // UpdateDeviceLogType 修改操作系统安装进度记录 + UpdateDeviceLogType(settingID uint, fromLogType, toLogType string) (affected int64, err error) + // SaveDeviceLog 新增操作系统安装进度记录 + SaveDeviceLog(log *DeviceLog) (affected int64, err error) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/device_setting.go b/cyclone-server/src/idcos.io/cloudboot/model/device_setting.go new file mode 100644 index 0000000000000000000000000000000000000000..8cd3ac2fe6c6a1bb55d3224c1e69e7f63daa3a31 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/device_setting.go @@ -0,0 +1,126 @@ +package model + +import ( + "time" + + "github.com/jinzhu/gorm" + "github.com/voidint/page" +) + +const ( + // InstallStatusPre 设备安装状态-等待安装 + InstallStatusPre = "pre_install" + // InstallStatusIng 设备安装状态-正在安装 + InstallStatusIng = "installing" + // InstallStatusFail 设备安装状态-安装失败 + InstallStatusFail = "failure" + // InstallStatusSucc 设备安装状态-安装成功 + InstallStatusSucc = "success" +) + +const ( + // InstallationPXE pxe安装方式 + InstallationPXE = "pxe" + // InstallationImage 镜像安装方式 + InstallationImage = "image" +) + +const ( + // IPSourceStatic IP来源-static + IPSourceStatic = "static" + // IPSourceDHCP IP来源-dhcp + IPSourceDHCP = "dhcp" +) + +// DeviceSetting 设备装机参数 +type DeviceSetting struct { + gorm.Model + SN string `gorm:"column:sn"` // 序列号 + HardwareTemplateID uint `gorm:"column:hardware_template_id"` // 硬件配置模板ID + SystemTemplateID uint `gorm:"column:system_template_id"` // 系统安装模板 + ImageTemplateID uint `gorm:"column:image_template_id"` // 镜像安装模板ID + NeedExtranetIP string `gorm:"column:need_extranet_ip"` // 是否需要配置外网IP + ExtranetIPNetworkID uint `gorm:"column:extranet_ip_network_id"` // 外网IP所属网段ID + ExtranetIP string `gorm:"column:extranet_ip"` // 外网IP + IntranetIPNetworkID uint `gorm:"column:intranet_ip_network_id"` // 内网IP所属网段ID + IntranetIP string `gorm:"column:intranet_ip"` // 内网IP + InstallType string `gorm:"column:install_type"` // 安装方式 + Status string `gorm:"column:status"` // 安装状态 + InstallProgress float64 `gorm:"column:install_progress"` // 安装进度 + InstallationStartTime *time.Time `gorm:"column:installation_start_time"` // 安装开始时间 + InstallationEndTime *time.Time `gorm:"column:installation_end_time"` // 安装结束时间 + Creator string `gorm:"column:creator"` // 创建人ID + Updater string `gorm:"column:updater"` // 创建人ID + NeedExtranetIPv6 string `gorm:"column:need_extranet_ipv6"` // 是否需要配置外网IPv6 + ExtranetIPv6NetworkID uint `gorm:"column:extranet_ipv6_network_id"` // 外网IPv6所属网段IDv6 + ExtranetIPv6 string `gorm:"column:extranet_ipv6"` // 外网IPv6 + NeedIntranetIPv6 string `gorm:"column:need_intranet_ipv6"` // 是否需要配置外网IPv6 + IntranetIPv6NetworkID uint `gorm:"column:intranet_ipv6_network_id"` // 内网IPv6所属网段ID + IntranetIPv6 string `gorm:"column:intranet_ipv6"` // 内网IPv6 +} + +// TableName 指定数据库表名 +func (DeviceSetting) TableName() string { + return "device_setting" +} + +// CombineDeviceSetting 装机设备查询条件列表 +type CombineDeviceSetting struct { + // 源节点名 + OriginNode string `json:"origin_node"` + // 所属数据中心ID + IDCID []uint `json:"idc_id"` + // 所属数据中心ID + ServerRoomID []uint `json:"server_room_id"` + // 所属机架ID + ServerCabinetID []uint `json:"server_cabinet_id"` + // 所属机位ID + ServerUsiteID []uint `json:"server_usite_id"` + // 设备序列号(多个SN用英文逗号分隔) + Sn string `json:"sn"` + // 硬件配置模板ID + HardwareTemplateID uint `json:"hardware_template_id"` + // 镜像配置模板ID + ImageTemplateID uint `json:"image_template_id"` + // 装机状态。可选值 pre_install-等待安装; installing-正在安装; failure-安装失败; success-安装成功; + Status string `json:"status"` + + FN string + Category string + ServerCabinetNumber string + ServerRoomName string + IntranetIP string + ExtranetIP string +} + +// IDeviceSetting 装机设备参数持久化接口 +type IDeviceSetting interface { + // SaveDeviceSetting 保存设备装机参数。若入参包含主键ID,则进行更新操作,否则进行新增操作。 + SaveDeviceSetting(*DeviceSetting) (err error) + // CountDeviceSettingCombines 返回满足过滤条件的装机设备参数(不支持模糊查找) + CountDeviceSettingCombines(cond *CombineDeviceSetting) (count int64, err error) + // CountDeviceSettingByStatus 统计对应设备安装状态的数量 + CountDeviceSettingByStatus(status string) (count int64, err error) + // GetDeviceSettingCombinesByCond 统计满足过滤条件的装机设备参数数量 + GetDeviceSettingCombinesByCond(cond *CombineDeviceSetting, orderby OrderBy, limiter *page.Limiter) (items []*DeviceSetting, err error) + // AddDeviceSettings 批量添加设备装机参数 + AddDeviceSettings(...*DeviceSetting) error + // UpdateDeviceSettingBySN 根据SN更新设备装机参数(仅会更新非零值的字段) + UpdateDeviceSettingBySN(*DeviceSetting) (affected int64, err error) + // GetDeviceSettingByDeviceSettingID 根据SN查询设备装机参数 + GetDeviceSettingBySN(sn string) (*DeviceSetting, error) + // GetDeviceSettingByID 根据id查询设备装机参数 + GetDeviceSettingByID(id uint) (devSetting *DeviceSetting, err error) + // DeleteDeviceSettingByID 删除指定ID的装机参数 + DeleteDeviceSettingByID(id uint) (ds *DeviceSetting, err error) + // DeleteDeviceSettingBySN 删除指定SN的装机参数 + DeleteDeviceSettingBySN(sn string) (ds *DeviceSetting, err error) + //UpdateInstallStatusAndProgressByID 更新安装状态和进度 + UpdateInstallStatusAndProgressByID(id uint, status string, inp float64) (affected int64, err error) + // GetDeviceSettingsByInstallationTimeout 查询安装超时的设备装机记录列表。timeout-超时时间,单位秒。 + GetDeviceSettingsByInstallationTimeout(timeout int64) (items []*DeviceSetting, err error) + // SetInstallationTimeout 为指定设备序列号的装机参数进行'安装超时'处理。 + SetInstallationTimeout(sns ...string) (affected int64, err error) + // UpdateDeviceSettingIPConfigBySN 更新设备IP配置 + //UpdateDeviceSettingIPConfigBySN(sn string, extranet bool) (affected int64, err error) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/device_setting_rule.go b/cyclone-server/src/idcos.io/cloudboot/model/device_setting_rule.go new file mode 100644 index 0000000000000000000000000000000000000000..2b1b5c65010f154ff076c1f8ba5acfb85a8e5040 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/device_setting_rule.go @@ -0,0 +1,63 @@ +package model + +import ( + "github.com/jinzhu/gorm" + "github.com/voidint/page" +) + +const ( + // 规则事实 fact 的属性 + AttributeCategory = "category" + AttributeArch = "arch" + AttributePhysicalArea = "physical_area" + AttributeVendor = "vendor" + AttributeLogicalOperator = "logical_operator" + AttributeIsFITIEcoProduct = "is_fiti_eco_product" + // 规则事实 fact 的属性与值的关系 + OperatorIN = "in" + OperatorContains = "contains" + OperatorEqual = "equal" + // 多个事实 fact 之间的关系 OR 优先于 AND ,如:(F1 OR F2) AND (F3 OR F4) + OperatorOR = "or" + OperatorAND = "and" +) + +const ( + DeviceSettingRuleOS = "os" + DeviceSettingRuleRaid = "raid" + DeviceSettingRuleNetwork = "network" +) + +// 规则前件结构体 +type RuleP struct { + Attribute string `json:"attribute"` // 规则事实属性category physical_area arch vendor 以及逻辑运算符 logical_operator + Operator string `json:"operator"` // 属性与值的关系 + Value []string `json:"value"` // 属性的值 +} + +// DeviceSettingRule 产生式设备装机参数规则库 +type DeviceSettingRule struct { + gorm.Model + Condition string `gorm:"column:condition"` // 前件 + Action string `gorm:"column:action"` // 结论 + RuleCategory string `gorm:"column:rule_category"` // 规则分类 enum('os','network','raid') +} + +// TableName 指定数据库表名 +func (DeviceSettingRule) TableName() string { + return "device_setting_rule" +} + +// IDeviceSettingRule 持久化接口 +type IDeviceSettingRule interface { + // SaveDeviceSettingRule 保存规则记录 + SaveDeviceSettingRule(*DeviceSettingRule) (affected int64, err error) + // RemoveDeviceSettingRuleByID 删除指定ID的规则记录 + RemoveDeviceSettingRuleByID(id uint) (affected int64, err error) + // 根据规则分类查询获取所有规则 + GetDeviceSettingRulesByType(queryType string) (items []*DeviceSettingRule, err error) + // GetDeviceSettingRuleByID 返回指定ID的规则 + GetDeviceSettingRuleByID(id uint) (*DeviceSettingRule, error) + CountDeviceSettingRules(cond *DeviceSettingRule) (count int64, err error) + GetDeviceSettingRules(cond *DeviceSettingRule, orderby OrderBy, limiter *page.Limiter) (items []*DeviceSettingRule, err error) +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/model/dhcp_token_bucket.go b/cyclone-server/src/idcos.io/cloudboot/model/dhcp_token_bucket.go new file mode 100644 index 0000000000000000000000000000000000000000..bac43f3c91ecd19b37516410fbbad19878e75498 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/dhcp_token_bucket.go @@ -0,0 +1,39 @@ +package model + +import "time" + +// DHCPTokenBucket 令牌桶 +type DHCPTokenBucket struct { + Token string `gorm:"column:token"` + Bucket string `gorm:"column:bucket"` + SN *string `gorm:"column:sn"` + CreatedAt time.Time `gorm:"column:created_at"` + UpdatedAt time.Time `gorm:"column:updated_at"` +} + +// TableName 指定数据库表名 +func (DHCPTokenBucket) TableName() string { + return "dhcp_token_bucket" +} + +// IDHCPTokenBucket 令牌桶操作接口 +type IDHCPTokenBucket interface { + // AddTokenBuckets 新增令牌记录 + AddTokenBuckets(items ...*DHCPTokenBucket) (err error) + // OverwriteTokenBuckets 覆写令牌桶及其令牌 + OverwriteTokenBuckets(items ...*DHCPTokenBucket) (err error) + // BindSNByTokenBucket 绑定SN与令牌桶中令牌 + BindSNByTokenBucket(sn, token, bucket string) (affected int64, err error) + // UnbindSNByTokenBucket 解绑SN与令牌桶中令牌 + UnbindSNByTokenBucket(sn, token, bucket string) (affected int64, err error) + // GetTokenBuckets 返回满足过滤条件的令牌桶及其令牌 + GetTokenBuckets(cond *DHCPTokenBucket) (items []*DHCPTokenBucket, err error) + // GetUnbindingTokensByBucket 返回未绑定的SN的令牌列表 + GetUnbindingTokensByBucket(bucket string) (tokens []string, err error) + // GetBuckets 返回当前所有令牌桶 + GetBuckets() (buckets []string, err error) + // GetTokenBySN 返回目标设备在令牌桶内的令牌 + GetTokenBySN(sn string) (token string, err error) + // RemoveTokenBuckets 移除指定名称的令牌桶及其令牌 + RemoveTokenBuckets(buckets ...string) (affected int64, err error) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/hardware_template.go b/cyclone-server/src/idcos.io/cloudboot/model/hardware_template.go new file mode 100644 index 0000000000000000000000000000000000000000..24520132ec79ad10f07ab1c45418985c92570b0f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/hardware_template.go @@ -0,0 +1,45 @@ +package model + +import ( + "github.com/jinzhu/gorm" + "github.com/voidint/page" +) + +// HardwareTplCond 硬件模板查询条件 +type HardwareTplCond struct { + Builtin string + Name string + Vendor string + ModelName string +} + +// HardwareTemplate 硬件配置模板 +type HardwareTemplate struct { + gorm.Model + Name string `gorm:"column:name"` + Vendor string `gorm:"column:vendor"` + ModelName string `gorm:"column:model"` + Builtin string `gorm:"column:builtin"` + Data string `gorm:"column:data"` +} + +// TableName 指定数据库表名 +func (HardwareTemplate) TableName() string { + return "hardware_template" +} + +// IHardwareTemplate 硬件配置操作接口 +type IHardwareTemplate interface { + // GetHardwareTemplateByName 返回指定名称的硬件配置模板。 + GetHardwareTemplateByName(name string) (template *HardwareTemplate, err error) + // CountHardwareByCond 统计查询硬件模板数量 + CountHardwareByCond(cond *HardwareTplCond) (int64, error) + // GetHardwaresByCond 分页查询硬件模板 + GetHardwaresByCond(cond *HardwareTplCond, limiter *page.Limiter) ([]*HardwareTemplate, error) + // GetHardwareTemplateByID 返回指定ID的镜像安装模板 + GetHardwareTemplateByID(id uint) (*HardwareTemplate, error) + // SaveHardwareTemplate 保存、修改硬件模板 + SaveHardwareTemplate(na *HardwareTemplate) (id uint, err error) + //RemoveHardwareTemplateByID 删除硬件模板配置 + RemoveHardwareTemplateByID(id uint) (affected int64, err error) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/idc.go b/cyclone-server/src/idcos.io/cloudboot/model/idc.go new file mode 100644 index 0000000000000000000000000000000000000000..750f7b96e6bfb9b8ec6ff1a06c4770f8904994c2 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/idc.go @@ -0,0 +1,68 @@ +package model + +import ( + "github.com/jinzhu/gorm" + "github.com/voidint/page" +) + +const ( + // IDCUsageProduction 数据中心用途-生产 + IDCUsageProduction = "production" + // IDCUsageDisasterRecovery 数据中心用途-容灾 + IDCUsageDisasterRecovery = "disaster_recovery" + // IDCUsagePreProduction 数据中心用途-准生产 + IDCUsagePreProduction = "pre_production" + // IDCUsageTesting 数据中心用途-测试 + IDCUsageTesting = "testing" +) + +const ( + // IDCStatUnderConstruction 数据中心状态-建设中 + IDCStatUnderConstruction = "under_construction" + // IDCStatAccepted 数据中心状态-已验收 + IDCStatAccepted = "accepted" + // IDCStatProduction 数据中心状态-已投产 + IDCStatProduction = "production" + // IDCStatAbolished 数据中心状态-已裁撤 + IDCStatAbolished = "abolished" +) + +type ( + // IDC 数据中心 + IDC struct { + gorm.Model + Name string `gorm:"column:name"` + Usage string `gorm:"column:usage"` + FirstServerRoom string `gorm:"column:first_server_room"` + Vendor string `gorm:"column:vendor"` + Status string `gorm:"column:status"` + Creator string `gorm:"column:creator"` + } +) + +// TableName 指定数据库表名 +func (IDC) TableName() string { + return "idc" +} + +// IIDC 数据中心持久化接口 +type IIDC interface { + // RemoveIDCByID 删除指定ID的数据中心 + RemoveIDCByID(id uint) (affected int64, err error) + // SaveIDC 保存数据中心 + SaveIDC(*IDC) (affected int64, err error) + // AddIDC 新增数据中心 + AddIDC(*IDC) (affected int64, idc *IDC, err error) + // UpdateIDC 修改数据中心 + UpdateIDC(*IDC) (affected int64, err error) + // UpdateIDCStatus 批量更新数据中心状态 + UpdateIDCStatus(status string, ids ...uint) (affected int64, err error) + // GetIDCByID 返回指定ID的数据中心 + GetIDCByID(id uint) (*IDC, error) + // GetIDCByName 返回指定Name的数据中心 + GetIDCByName(name string) (*IDC, error) + // CountIDCs 统计满足过滤条件的数据中心数量 + CountIDCs(cond *IDC) (count int64, err error) + // GetIDCs 返回满足过滤条件的数据中心 + GetIDCs(cond *IDC, orderby OrderBy, limiter *page.Limiter) (items []*IDC, err error) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/image_template.go b/cyclone-server/src/idcos.io/cloudboot/model/image_template.go new file mode 100644 index 0000000000000000000000000000000000000000..2e94968e4f8378c410bf8f5da207fdcfd18e6c4c --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/image_template.go @@ -0,0 +1,51 @@ +package model + +import ( + "github.com/jinzhu/gorm" + "github.com/voidint/page" +) + +// ImageTemplate 镜像安装模板 +type ImageTemplate struct { + gorm.Model + Family string `gorm:"column:family"` + BootMode string `gorm:"column:boot_mode"` + Name string `gorm:"column:name"` + ImageURL string `gorm:"column:image_url"` + Username string `gorm:"column:username"` + Password string `gorm:"column:password"` + Partition string `gorm:"column:partition"` + PreScript string `gorm:"column:pre_script"` + PostScript string `gorm:"column:post_script"` + OSLifecycle string `gorm:"column:os_lifecycle"` // OS生命周期:Testing|Active(Default)|Active|Containment|EOL + Arch string `gorm:"column:arch"` // OS架构平台:x86_64|aarch64 +} + +// TableName 指定数据库表名 +func (ImageTemplate) TableName() string { + return "image_template" +} + +// IImageTemplate 镜像安装模板持久化接口 +type IImageTemplate interface { + // RemoveImageTemplate 删除指定ID的镜像安装模板 + RemoveImageTemplate(id uint) (affected int64, err error) + // SaveImageTemplate 保存镜像安装模板 + SaveImageTemplate(*ImageTemplate) (id uint, err error) + // GetImageTemplateByID 返回指定ID的镜像安装模板 + GetImageTemplateByID(id uint) (*ImageTemplate, error) + // CountImageTemplates 统计满足过滤条件的镜像安装模板数量 + CountImageTemplates(cond *ImageTemplate) (count int64, err error) + // GetImageTemplates 返回满足过滤条件的镜像安装模板 + GetImageTemplates(cond *ImageTemplate, orderby OrderBy, limiter *page.Limiter) (items []*ImageTemplate, err error) + // 查询指定设备关联的镜像安装模板 + GetImageTemplateBySN(sn string) (*ImageTemplate, error) + + // ========== deprecated methods ========== + CountImageTemplateByName(name string) (uint, error) + CountImageTemplateByNameAndID(name string, ID uint) (uint, error) + GetImageTemplateIDByName(name string) (uint, error) + CountImageTemplate() (uint, error) + GetImageTemplateListWithPage(limit uint, offset uint) ([]ImageTemplate, error) + GetImageTemplateByName(name string) (*ImageTemplate, error) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/inspection.go b/cyclone-server/src/idcos.io/cloudboot/model/inspection.go new file mode 100644 index 0000000000000000000000000000000000000000..01f21e41d3dbfcae1757ac497759921f087c13a9 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/inspection.go @@ -0,0 +1,188 @@ +package model + +import ( + "time" + + "github.com/jinzhu/gorm" + "github.com/voidint/page" + + "idcos.io/cloudboot/utils/times" +) + +const ( + // RunningStatusRunning 运行状态-运行中 + RunningStatusRunning = "running" + // RunningStatusDone 运行状态-完成 + RunningStatusDone = "done" +) + +const ( + // HealthStatusNominal 设备健康状况-正常 + HealthStatusNominal = "nominal" + // HealthStatusWarning 设备健康状况-警告 + HealthStatusWarning = "warning" + // HealthStatusCritical 设备健康状况-异常 + HealthStatusCritical = "critical" + // HealthStatusUnknown 设备健康状况-未知 + HealthStatusUnknown = "unknown" +) + +// SensorData IPMI传感器数据 +type SensorData struct { + ID string `json:"id"` + Name string `json:"name"` + Type string `json:"type"` + State string `json:"state"` + Reading string `json:"reading"` + Units string `json:"units"` + Event string `json:"event"` +} + +// SelData IPMI系统事件数据 ID,Date,Time,Name,Type,State,Event +type SelData struct { + ID string `json:"id"` + Date string `json:"date"` + Time string `json:"time"` + Name string `json:"name"` + Type string `json:"type"` + State string `json:"state"` + Event string `json:"event"` +} + +// Inspection 硬件巡检 +type Inspection struct { + gorm.Model + JobID string `gorm:"column:job_id"` + StartTime *time.Time `gorm:"column:start_time"` + EndTime *time.Time `gorm:"column:end_time"` + OriginNode string `gorm:"column:origin_node"` + SN string `gorm:"column:sn"` + RunningStatus string `gorm:"column:running_status"` + HealthStatus string `gorm:"column:health_status"` + Error string `gorm:"column:error"` + IPMIResult string `gorm:"column:ipmi_result"` // 通过IPMI获取的硬件巡检结果。JSON结构同[]*SensorData + IPMISELResult string `gorm:"column:ipmisel_result"` // 通过ipmi-sel获取的硬件系统时间日志。JSON结构同[]*SelData +} + +// TableName 指定数据库表名 +func (Inspection) TableName() string { + return "inspection" +} + +//InspectionCond 分页查询硬件巡检结果条件 +type InspectionCond struct { + FixedAssetNumber string + SN string + IntranetIP string + StartTime string + EndTime string + OOBIP string + RuningStatus string + HealthStatus string + Order string + KeyWord string +} + +//InspectionFullWithPage 分页获取硬件巡检结果,每一个SN仅仅展示最新的一条记录 +type InspectionFullWithPage struct { + FixedAssetNumber string `json:"fixed_asset_number" gorm:"column:fixed_asset_number"` + ID uint `json:"id" gorm:"column:id"` + SN string `json:"sn" gorm:"column:sn"` + IntranetIP string `json:"intranet_ip" gorm:"column:intranet_ip"` + StartTime times.ISOTime `json:"start_time" gorm:"column:start_time"` + EndTime times.ISOTime `json:"end_time" gorm:"column:end_time"` + RuningStatus string `json:"running_status" gorm:"column:running_status"` + HealthStatus string `json:"health_status" gorm:"column:health_status"` // 机器的巡检结果(包含正常,告警,致命,未知) + //OOBIP string `json:"oob_ip" gorm:"column:oob_ip"` + Error string `json:"error" gorm:"column:error"` + Result string `json:"result" gorm:"column:ipmi_result"` + CreatedAt times.ISOTime `json:"created_at" gorm:"column:created_at"` + UpdatedAt times.ISOTime `json:"updated_at" gorm:"column:updated_at"` +} + +//InspectionRecordsPage 物理机巡检记录查询分页结果 +type InspectionRecordsPage struct { + ID uint `json:"id" gorm:"column:id"` + SN string `json:"sn" gorm:"column:sn"` + StartTime times.ISOTime `json:"start_time" gorm:"column:start_time"` + EndTime times.ISOTime `json:"end_time" gorm:"column:end_time"` + RuningStatus string `json:"running_status" gorm:"column:running_status"` + HealthStatus string `json:"health_status" gorm:"column:health_status"` // 机器的巡检结果(包含正常,告警,致命,未知) + Error string `json:"error" gorm:"column:error"` + Result string `json:"result" gorm:"column:ipmi_result"` + SelResult string `json:"selresult" gorm:"column:ipmisel_result"` + CreatedAt times.ISOTime `json:"created_at" gorm:"column:created_at"` + UpdatedAt times.ISOTime `json:"updated_at" gorm:"column:updated_at"` +} + +// TableName 指定数据库表名 +func (InspectionRecordsPage) TableName() string { + return "inspection" +} + +// Inspection 硬件巡检记录健康状态统计 +type InspectionStatistics struct { + gorm.Model + JobID string `gorm:"column:job_id"` + StartTime *time.Time `gorm:"column:start_time"` + EndTime *time.Time `gorm:"column:end_time"` + SN string `gorm:"column:sn"` + RunningStatus string `gorm:"column:running_status"` + HealthStatus string `gorm:"column:health_status"` +} + +// TableName 指定数据库表名 +func (InspectionStatistics) TableName() string { + return "inspection" +} + +// IInspection 硬件巡检操作接口 +type IInspection interface { + // AddInspections 批量新增硬件巡检记录 + AddInspections(...*Inspection) error + // UpdateInspectionByID 根据ID更新硬件巡检记录 + UpdateInspectionByID(*Inspection) (affected int64, err error) + // GetInspectedSN 查询已经执行过硬件巡检的设备SN列表 + GetInspectedSN() (items []string, err error) + //CountInspctionsByCond 根据条件统计 + CountInspctionsByCond(cond *InspectionCond) (count int64, err error) + //GetInspectionListWithPageNew 分页查询硬件巡检结果 + GetInspectionListWithPageNew(cond *InspectionCond, limiter *page.Limiter) ([]InspectionFullWithPage, error) + // GetInspectionDetail 查询指定设备的某次巡检详情 + GetInspectionDetail(SN, startTime string) (i *Inspection, err error) + //GetInspectionStartTimeBySN 查询指定设备的历史硬件巡检开始时间列表 + GetInspectionStartTimeBySN(SN, Where string) ([]time.Time, error) + // GetInspections 查询满足过滤条件的硬件巡检列表 + GetInspections(cond *Inspection, orderby OrderBy, limiter *page.Limiter) (items []*Inspection, err error) + // GetInspectionStatistics 查询满足过滤条件的硬件巡检列表用于健康状态统计 + GetInspectionStatistics(cond *Inspection, orderby OrderBy, limiter *page.Limiter) (items []*InspectionStatistics, err error) + // GetInspectionStatisticsGroupBySN 查询满足过滤条件的硬件巡检列表用于健康状态统计 + GetInspectionStatisticsGroupBySN(cond *Inspection, orderby OrderBy, limiter *page.Limiter) (items []*InspectionStatistics, err error) + //RemoveInspectionOnStartTimeBySN 根据设备SN删除巡检记录,按时间排序保留一定数量的记录 + RemoveInspectionOnStartTimeBySN(SN string) (err error) + // CountInspectionPageRecords 获取巡检记录条数 + CountInspectionRecordsPage(cond *InspectionCond) (count int64, err error) + // GetInspectionPage 获取巡检记录分页 + GetInspectionRecordsPage(cond *InspectionCond, limiter *page.Limiter) (items []*InspectionRecordsPage, err error) +} + +const ( + // EmptyJSONObject 空JSON对象字符串标识 + EmptyJSONObject = "{}" + // EmptyJSONArray 空JSON数组字符串标识 + EmptyJSONArray = "[]" +) + +func replaceIfBlank(field *string, newS string) { + if *field == "" { + *field = newS + } +} + +// BeforeSave 保存硬件巡检对象前的钩子方法。 +// 防止将空字符串写入类型为JSON的数据库字段中引发报错。 +func (insp *Inspection) BeforeSave() (err error) { + replaceIfBlank(&insp.IPMIResult, EmptyJSONArray) + replaceIfBlank(&insp.IPMISELResult, EmptyJSONArray) + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/ip.go b/cyclone-server/src/idcos.io/cloudboot/model/ip.go new file mode 100644 index 0000000000000000000000000000000000000000..df548bb51955039f708dabf8d56f2e7b32f565c7 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/ip.go @@ -0,0 +1,122 @@ +package model + +import ( + "time" + + "github.com/jinzhu/gorm" + "github.com/voidint/page" +) + +const ( + //PXEIP PXE用IP + PXEIP = "pxe" + //BusinessIP 业务用IP + BusinessIP = "business" +) + +const ( + //IPUsed IP是否已被占用-是 + IPUsed = "yes" + //IPNotUsed IP是否已被占用-是 + IPNotUsed = "no" + //IPDisabled IP是否已被占用-不可用 + IPDisabled = "disabled" +) + +const ( + // IPScopeIntranet IP作用范围-内网 + IPScopeIntranet = "intranet" + // IPScopeExtranet IP作用范围-外网 + IPScopeExtranet = "extranet" +) + +// IP BootOSIP +type IP struct { + gorm.Model + IPNetworkID uint `gorm:"column:ip_network_id"` + Category string `gorm:"column:category"` + IP string `gorm:"column:ip"` + IsUsed string `gorm:"column:is_used"` + SN string `gorm:"column:sn"` + Scope *string `gorm:"column:scope"` + Remark *string `gorm:"column:remark"` + ReleaseDate time.Time `gorm:"column:release_date"` +} + +type IPCombined struct { + IP + //固资编号 + FixedAssetNumber string `gorm:"column:fixed_asset_number"` +} + +type IPPageCond struct { + ID []uint + IPNetworkID []uint + CIDR string + Category string + IP string + IsUsed string + SN string + FixedAssetNumber string + Scope *string +} + +// TableName 指定数据库表名 +func (IP) TableName() string { + return "ip" +} + +//IIP IP数据操作接口 +type IIP interface { + CountIPs(cond *IPPageCond) (count int64, err error) + GetIPs(cond *IPPageCond, orderby OrderBy, limiter *page.Limiter) (items []*IPCombined, err error) + GetIPByIP(ipaddr, scope string) (ip IP, err error) + GetReleasableIP()(items []*IP, err error) + GetNetWorkBySN(sn string, category string) ([]IPAndIPNetworkUnion, error) + // AssignIntranetIP 按照内置规则给设备分配一个内网业务IP + AssignIntranetIP(sn string) (intraIP *IP, err error) + // AssignExtranetIP 按照内置规则给设备分配一个外网业务IP + AssignExtranetIP(sn string) (extraIP *IP, err error) + // ReleaseIP 为目标设备释放内/外网业务IP + ReleaseIP(sn string, scope string) (affected int64, err error) + // ReserveIP 为目标设备回收内/外网业务IP并保留IP一段时间,设置释放日期 + ReserveIP(sn string, scope string, releasedate time.Time) (affected int64, err error) + // AssignIP 分配IP + AssignIP(sn, scope string, id uint) error + // AssignIP 分配IP + AssignIPByIP(sn, scope string, ip string) error + // UnassignIP 取消分配的IP + UnassignIP(id uint) error + // UnassignIPsBySN 释放指定SN的IP资源 + UnassignIPsBySN(sn string) error + // GetIPByID 返回指定ID的IP + GetIPByID(id uint) (*IP, error) + // GetIPBySNAndScope 返回被指定SN占用的IP + GetIPBySNAndScope(sn, scope string) (*IP, error) + // SaveIP + SaveIP(ip *IP) (affected int64, err error) + // CreateIP + CreateIP(ip *IP) error + // GetAvailableIPByIPNetworkID + GetAvailableIPByIPNetworkID(ipnetworkid uint)(*IP, error) + // GetLastIPv6ByIPNetworkID + GetLastIPv6ByIPNetworkID(ipnetworkid uint)(*IP, error) + // AssignIPv6 获取已有业务IPv6记录或按规则新分配一个业务IP + AssignIPv6(sn, ipscope string) (*IP, error) + // ReleaseIPv6 为目标设备释放内/外网业务IPv6 + ReleaseIPv6(sn string, scope string) (affected int64, err error) +} + +//IPAndIPNetworkUnion 设备网络配置查询结果 +type IPAndIPNetworkUnion struct { + IP string `json:"ip" gorm:"column:ip"` + Netmask string `json:"netmask" gorm:"column:netmask"` + Gateway string `json:"gateway" gorm:"column:gateway"` + Scope *string `json:"scope" gorm:"column:scope"` + Version string `json:"version" gorm:"column:version"` +} + +// TableName 指定数据库表名 +func (IPAndIPNetworkUnion) TableName() string { + return "ip" +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/ip_network.go b/cyclone-server/src/idcos.io/cloudboot/model/ip_network.go new file mode 100644 index 0000000000000000000000000000000000000000..3ef77274a45884c9ae088e70f4b2a6e3c261954e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/ip_network.go @@ -0,0 +1,92 @@ +package model + +import ( + "github.com/jinzhu/gorm" + "github.com/voidint/page" +) + +const ( + //ILO 服务器ILO + ILO = "ilo" + //TGWIntranet 服务器TGW内网 + TGWIntranet = "tgw_intranet" + //TGWExtranet 服务器TGW外网 + TGWExtranet = "tgw_extranet" + //Intranet 服务器普通内网 + Intranet = "intranet" + //Extranet 服务器普通外网 + Extranet = "extranet" + //VIntranet 服务器虚拟化内网 + VIntranet = "v_intranet" + //VExtranet 服务器虚拟化外网 + VExtranet = "v_extranet" + // IP version + IPv4 = "ipv4" + IPv6 = "ipv6" +) + +// NetworkTypeMap 网段类型中文和英文的对应表 +// 可选值: ilo-服务器ILO; tgw_intranet-服务器TGW内网; tgw_extranet-服务器TGW外网; intranet-服务器普通内网; extranet-服务器普通外网; v_intranet-服务器虚拟化内网")) +var NetworkTypeMap = map[string]string{ + "服务器ILO": ILO, + "服务器TGW内网": TGWIntranet, + "服务器TGW外网": TGWExtranet, + "服务器普通内网": Intranet, + "服务器普通外网": Extranet, + "服务器虚拟化内网": VIntranet, + "服务器虚拟化外网": VExtranet, +} + +//IPNetwork 网段表结构 +type IPNetwork struct { + gorm.Model + IDCID uint `gorm:"column:idc_id"` + ServerRoomID uint `gorm:"column:server_room_id"` + Category string `gorm:"column:category"` + CIDR string `gorm:"column:cidr"` + Netmask string `gorm:"column:netmask"` + Gateway string `gorm:"column:gateway"` + IPPool string `gorm:"column:ip_pool"` + PXEPool string `gorm:"column:pxe_pool"` + Switches string `gorm:"column:switches"` + Vlan string `gorm:"column:vlan"` + Version string `gorm:"column:version"` + Creator string `gorm:"column:creator"` +} + +type IPNetworkCond struct { + CIDR string + Category string + ServerRoomID []uint + ServerRoomName string + Switches string + NetworkAreaID []uint + Status string +} + +// TableName 指定数据库表名 +func (IPNetwork) TableName() string { + return "ip_network" +} + +//IIPNetwork 网段持久化接口 +type IIPNetwork interface { + // RemoveIPNetworkByID 删除指定ID的网段 + RemoveIPNetworkByID(id uint) (affected int64, err error) + // SaveIPNetwork 新增/更新网段 + SaveIPNetwork(*IPNetwork) (affected int64, err error) + // GetIPNetworkByID 返回指定ID的网段 + GetIPNetworkByID(id uint) (*IPNetwork, error) + // CountIPNetworks 统计满足过滤条件的网段数量 + CountIPNetworks(cond *IPNetworkCond) (count int64, err error) + // GetIPNetworks 返回满足过滤条件的网段 + GetIPNetworks(cond *IPNetworkCond, orderby OrderBy, limiter *page.Limiter) (items []*IPNetwork, err error) + // GetIntranetIPNetworksBySN 查询指定物理机的内网IP所属网段 + GetIntranetIPNetworksBySN(sn string) ([]*IPNetwork, error) + // GetExtranetIPNetworksBySN 查询指定物理机的外网IP所属网段 + GetExtranetIPNetworksBySN(sn string) ([]*IPNetwork, error) + // GetIPNetworksBySwitchNumber 根据设备编号查询网段信息 + GetIPNetworksBySwitchNumber(switchNumber string) ([]*IPNetwork, error) + // GetIPv6NetworksBySN 查询指定物理机SN的IPv6内外网段 + GetIPv6NetworkBySN(sn string, category string) (*IPNetwork, error) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/job.go b/cyclone-server/src/idcos.io/cloudboot/model/job.go new file mode 100644 index 0000000000000000000000000000000000000000..8cc96d8b430304abb8aaea969c1f304c6327129b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/job.go @@ -0,0 +1,44 @@ +package model + +import ( + "time" + + "github.com/voidint/page" +) + +// Job 任务 +type Job struct { + ID string + CreatedAt time.Time + UpdatedAt time.Time + DeletedAt *time.Time `sql:"index"` + Builtin string `gorm:"column:builtin"` + Title string `gorm:"column:title"` + Category string `gorm:"column:category"` + Rate string `gorm:"column:rate"` + Cron string `gorm:"column:cron"` + CronRender string `gorm:"column:cron_render"` + NextRunTime *time.Time `gorm:"column:next_run_time"` + Target string `gorm:"column:target"` + Status string `gorm:"column:status"` + Creator string `gorm:"column:creator"` +} + +// TableName 指定数据库表名 +func (Job) TableName() string { + return "job" +} + +// IJob 任务操作接口 +type IJob interface { + // SaveJob 保存(新增/更新)任务 + SaveJob(*Job) error + // RemoveJob 移除指定ID的任务 + RemoveJob(id string) (affected int64, err error) + // GetJobByID 查询指定ID的任务 + GetJobByID(id string) (job *Job, err error) + // CountJobs 统计满足条件的任务数量 + CountJobs(cond *Job) (count int64, err error) + // GetJobs 返回满足过滤条件的任务 + GetJobs(cond *Job, orderby OrderBy, limiter *page.Limiter) (items []*Job, err error) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/api_log.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/api_log.go new file mode 100644 index 0000000000000000000000000000000000000000..6d86f6ae54a64bcc286d658e03bb4b3e917c5519 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/api_log.go @@ -0,0 +1,81 @@ +package mysqlrepo + +import ( + "github.com/jinzhu/gorm" + "github.com/voidint/page" + + "idcos.io/cloudboot/model" +) + +// SaveAPILog 保存API记录 +func (repo *MySQLRepo) SaveAPILog(operate *model.APILog) (id uint, err error) { + if err = repo.db.Model(&model.APILog{}).Save(operate).Error; err != nil { + repo.log.Error(err.Error()) + return 0, err + } + return operate.ID, nil +} + +// CountAPILog 统计满足过滤条件的API记录数量 +func (repo *MySQLRepo) CountAPILog(cond *model.APILogCond) (count int64, err error) { + db := repo.db.Model(&model.APILog{}) + if cond != nil { + db = addAPIsCond(db, cond) + } + if err = db.Count(&count).Error; err != nil { + repo.log.Error(err.Error()) + return 0, err + } + + return count, err +} + +// GetAPILogByCond 返回满足过滤条件的API记录 +func (repo *MySQLRepo) GetAPILogByCond(cond *model.APILogCond, orderby model.OrderBy, limiter *page.Limiter) (items []*model.APILog, err error) { + db := repo.db.Model(&model.APILog{}) + db = addAPIsCond(db, cond) + + for i := range orderby { + db = db.Order(orderby[i].String()) + } + if limiter != nil { + db = db.Limit(limiter.Limit).Offset(limiter.Offset) + } + + if err = db.Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} + +// addAPIsCond 添加查询条件 +func addAPIsCond(db *gorm.DB, cond *model.APILogCond) *gorm.DB { + if cond != nil { + if cond.Method != "" { + db = db.Where("method = ?", cond.Method) + } + if cond.API != "" { + db = db.Where("api like ?", "%"+cond.API+"%") + } + if cond.Description != "" { + db = db.Where("description like ?", "%"+cond.Description+"%") + } + if cond.Operator != "" { + db = db.Where("operator like ?", "%"+cond.Operator+"%") + } + if cond.Status != "" { + db = db.Where("status = ?", cond.Status) + } + + if !cond.CreatedAtStart.IsZero() && !cond.CreatedAtEnd.IsZero() { + db = db.Where("created_at between ? and ?", cond.CreatedAtStart, cond.CreatedAtEnd) + } + + if cond.Cost1 > 0.0 && cond.Cost2 > 0.0 { + db = db.Where("time > ? and time < ?", cond.Cost1, cond.Cost2) + } + + } + return db +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/approval.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/approval.go new file mode 100644 index 0000000000000000000000000000000000000000..90058754bc6e5df07b203aa2c0f824213376f595 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/approval.go @@ -0,0 +1,357 @@ +package mysqlrepo + +import ( + "time" + + "github.com/jinzhu/gorm" + "github.com/voidint/page" + + "idcos.io/cloudboot/model" +) + +// SubmitApproval 提交审批单及其审批步骤 +func (repo *MySQLRepo) SubmitApproval(approval *model.Approval, steps ...*model.ApprovalStep) (err error) { + tx := repo.db.Begin() + + if err = tx.Create(approval).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return err + } + for i := range steps { + steps[i].ApprovalID = approval.ID + if err = tx.Create(steps[i]).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return err + } + } + return tx.Commit().Error +} + +// Approve 审批 +func (repo *MySQLRepo) Approve(approvalID, stepID uint, action, remark string) error { + // TODO 待实现 + return nil +} + +// UpdateApproval 修改审批单 +func (repo *MySQLRepo) UpdateApproval(mod *model.Approval) (affected int64, err error) { + err = repo.db.Model(&model.Approval{}).Where("id = ?", mod.ID).Update(mod).Error + if err != nil { + return 0, err + } + return 1, nil +} + +// RevokeApproval 撤销目标审批单 +func (repo *MySQLRepo) RevokeApproval(approvalID uint) (err error) { + now := time.Now() + if err = repo.db.Model(&model.Approval{}).Where("id = ? and status = ?", approvalID, model.ApprovalStatusApproval).Updates(&model.Approval{ + Status: model.ApprovalStatusRevoked, + EndTime: &now, + }).Error; err != nil { + repo.log.Error(err) + return err + } + return nil +} + +// GetApprovalByID 查询指定审批单 +func (repo *MySQLRepo) GetApprovalByID(approvalID uint) (approval *model.Approval, err error) { + var ap model.Approval + if err := repo.db.Where("id = ?", approvalID).Find(&ap).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &ap, nil +} + +// GetApprovalStepByApprovalID 查询指定审批单的审批步骤明细 +func (repo *MySQLRepo) GetApprovalStepByApprovalID(approvalID uint) (steps []*model.ApprovalStep, err error) { + steps = make([]*model.ApprovalStep, 0) + db := repo.db.Model(&model.ApprovalStep{}) + err = db.Where("approval_id = ?", approvalID).Find(&steps).Error + return +} + +// CountPendingApprovals 统计审批单个数 +func (repo *MySQLRepo) CountPendingApprovals(currentUserID string, cond *model.Approval) (count int64, err error) { + steps, err := repo.GetApprovalStepByCond(&model.ApprovalStep{ + Approver: currentUserID, + }, false) + if err != nil { + return 0, err + } + var ids []uint + for k := range steps { + ids = append(ids, steps[k].ApprovalID) + } + + // 待我审批肯定在step表中,如果没有则不存在待我审批的审批单 + if len(ids) == 0 { + return 0, nil + } + + // 根据审批流程里获取的审批单ID 获取审批单 + db := repo.db.Model(&model.Approval{}) + if cond != nil { + if cond.Type != "" { + db = db.Where("type = ?", cond.Type) + } + } + + db = db.Where("status = ?", model.ApprovalStatusApproval) + + if len(ids) > 0 { + db = db.Where("id in (?)", ids) + } + + if err = db.Select("id").Count(&count).Error; err != nil { + repo.log.Error(err) + return count, err + } + return count, nil +} + +// CountInitiatedApprovals 统计审批单个数 +func (repo *MySQLRepo) CountInitiatedApprovals(currentUserID string, cond *model.Approval) (count int64, err error) { + db := repo.db.Model(&model.Approval{}) + if cond != nil { + if cond.Type != "" { + db = db.Where("type = ?", cond.Type) + } + if cond.Status != "" { + db = db.Where("status = ?", cond.Status) + } + if cond.ID > 0 { + db = db.Where("id = ?", cond.ID) + } + } + db = db.Where("initiator = ?", currentUserID) + + if err = db.Select("id").Count(&count).Error; err != nil { + repo.log.Error(err) + return count, err + } + return count, nil +} + +// GetInitiatedApprovals 查询'我发起的'审批分页列表 +func (repo *MySQLRepo) GetInitiatedApprovals(currentUserID string, cond *model.Approval, orderby model.OrderBy, limiter *page.Limiter) (items []*model.Approval, err error) { + db := repo.db.Model(&model.Approval{}) + if cond != nil { + if cond.Type != "" { + db = db.Where("type = ?", cond.Type) + } + if cond.Status != "" { + db = db.Where("status = ?", cond.Status) + } + if cond.ID > 0 { + db = db.Where("id = ?", cond.ID) + } + } + db = db.Where("initiator = ?", currentUserID) + + for i := range orderby { + db = db.Order(orderby[i].String()) + } + if limiter != nil { + db = db.Limit(limiter.Limit).Offset(limiter.Offset) + } + + if err = db.Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} + +// GetPendingApprovals 查询'待我审批'的审批分页列表 +func (repo *MySQLRepo) GetPendingApprovals(currentUserID string, cond *model.Approval, orderby model.OrderBy, limiter *page.Limiter) (items []*model.Approval, err error) { + // 在审批流程中查询被currentUserID审批的审批单 + steps, err := repo.GetApprovalStepByCond(&model.ApprovalStep{ + Approver: currentUserID, + }, false) + if err != nil { + return nil, err + } + var ids []uint + for k := range steps { + ids = append(ids, steps[k].ApprovalID) + } + + // 待我审批肯定在step表中,如果没有则不存在待我审批的审批单 + if len(ids) == 0 { + return nil, nil + } + + // 根据审批流程里获取的审批单ID 获取审批单 + db := repo.db.Model(&model.Approval{}) + if cond != nil { + if cond.Type != "" { + db = db.Where("type = ?", cond.Type) + } + } + + db = db.Where("status = ?", model.ApprovalStatusApproval) + + if len(ids) > 0 { + db = db.Where("id in (?)", ids) + } + + for i := range orderby { + db = db.Order(orderby[i].String()) + } + if limiter != nil { + db = db.Limit(limiter.Limit).Offset(limiter.Offset) + } + + if err = db.Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} + +// CountApprovedApprovals 统计'我已审批的'的审批表个数 +func (repo *MySQLRepo) CountApprovedApprovals(currentUserID string, cond *model.Approval) (count int64, err error) { + // 在审批流程中查询被currentUserID审批的审批单 + steps, err := repo.GetApprovalStepByCond(&model.ApprovalStep{ + Approver: currentUserID, + }, true) + if err != nil { + return count, err + } + var ids []uint + for k := range steps { + ids = append(ids, steps[k].ApprovalID) + } + + // 审批步骤中没有,则不存在被我审批过的审批单 + if len(ids) == 0 { + return count, nil + } + + db := repo.db.Model(&model.Approval{}) + if cond != nil { + if cond.Type != "" { + db = db.Where("type = ?", cond.Type) + } + if cond.Status != "" { + db = db.Where("status = ?", cond.Status) + } + } + + if len(ids) > 0 { + db = db.Where("id in (?)", ids) + } + + if err = db.Select("id").Count(&count).Error; err != nil { + repo.log.Error(err) + return count, err + } + return count, nil +} + +// GetApprovedApprovals 查询'我已审批的'的审批分页列表 +func (repo *MySQLRepo) GetApprovedApprovals(currentUserID string, cond *model.Approval, orderby model.OrderBy, limiter *page.Limiter) (items []*model.Approval, err error) { + // 在审批流程中查询被currentUserID审批的审批单 + steps, err := repo.GetApprovalStepByCond(&model.ApprovalStep{ + Approver: currentUserID, + }, true) + if err != nil { + return nil, err + } + var ids []uint + for k := range steps { + ids = append(ids, steps[k].ApprovalID) + } + + // 审批步骤中没有,则不存在被我审批过的审批单 + if len(ids) == 0 { + return nil, nil + } + + db := repo.db.Model(&model.Approval{}) + if cond != nil { + if cond.Type != "" { + db = db.Where("type = ?", cond.Type) + } + if cond.Status != "" { + db = db.Where("status = ?", cond.Status) + } + } + if len(ids) > 0 { + db = db.Where("id in (?)", ids) + } + + for i := range orderby { + db = db.Order(orderby[i].String()) + } + if limiter != nil { + db = db.Limit(limiter.Limit).Offset(limiter.Offset) + } + + if err = db.Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} + +// GetApprovalStepByCond 根据条件查询审批单的审批步骤明细 +func (repo *MySQLRepo) GetApprovalStepByCond(cond *model.ApprovalStep, isApproved bool) (steps []*model.ApprovalStep, err error) { + db := repo.db.Model(&model.ApprovalStep{}) + if cond != nil { + if cond.ApprovalID > 0 { + db = db.Where("approval_id = ?", cond.ApprovalID) + } + // 一个步骤经过多个审批人同时审批,这里需要修改 + if cond.Approver != "" { + db = db.Where("approver = ?", cond.Approver) + } + } + + if !isApproved { + // 如果是待审批,end_time字段应该为空 + db = db.Where("end_time IS NULL") + db = db.Where("start_time IS NOT NULL") + db = db.Where("start_time < ?", time.Now()) + } else { + // 如果是已经审批,end_time字段应该是现在以前的时间 + db = db.Where("end_time < ?", time.Now()) + db = db.Where("start_time < ?", time.Now()) + db = db.Where("start_time IS NOT NULL") + db = db.Where("end_time IS NOT NULL") + } + + if err = db.Find(&steps).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return steps, nil +} + +//GetApprovalStepByID 根据审批步骤ID查询审批步骤 +func (repo *MySQLRepo) GetApprovalStepByID(stepID uint) (step *model.ApprovalStep, err error) { + step = &model.ApprovalStep{} + if err := repo.db.Where("id = ?", stepID).Find(step).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return step, nil +} + +// UpdateApprovalStep 修改审批步骤 +func (repo *MySQLRepo) UpdateApprovalStep(mod *model.ApprovalStep) (affected int64, err error) { + err = repo.db.Model(&model.ApprovalStep{}).Where("id = ?", mod.ID).Updates(mod).Error + if err != nil { + return 0, err + } + return 1, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/common.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/common.go new file mode 100644 index 0000000000000000000000000000000000000000..940041de6f4c00b2d31add8fe7304abd1aef6a44 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/common.go @@ -0,0 +1,119 @@ +package mysqlrepo + +import ( + "fmt" + rawStrings "strings" + + "github.com/jinzhu/gorm" + "idcos.io/cloudboot/utils/strings" +) + +// MultiQuery 多行模糊查询 +func MultiQuery(db *gorm.DB, column string, multiStr string) *gorm.DB { + if multiStr != "" { + col := rawStrings.Split(column, ".") + tableName, colName := "", "" + if len(col) > 1 { + tableName = col[0] + "." + colName = col[1] + } else { + colName = col[0] + } + cs := strings.MultiLines2Slice(multiStr) + var sb rawStrings.Builder + for i, c := range cs { + if i == 0 { + sb.WriteString(fmt.Sprintf("%s`%s` LIKE '%s' ", tableName, colName, fmt.Sprintf("%%%s%%", c))) + } else { + sb.WriteString(fmt.Sprintf("OR %s`%s` LIKE '%s' ", tableName, colName, fmt.Sprintf("%%%s%%", c))) + } + } + if len(cs) > 0 { + fmt.Print(sb.String()) + db = db.Where(fmt.Sprintf("(%s)", sb.String())) + } + } + return db +} + +// MultiMatchQuery 多行精确查询 +func MultiMatchQuery(db *gorm.DB, column string, multiStr string) *gorm.DB { + if multiStr != "" { + col := rawStrings.Split(column, ".") + tableName, colName := "", "" + if len(col) > 1 { + tableName = col[0] + "." + colName = col[1] + } else { + colName = col[0] + } + cs := strings.MultiLines2Slice(multiStr) + db = db.Where(tableName+"`"+colName+"` IN (?)", cs) + } + return db +} + +// MultiMatchWithSpaceQuery 多行精确查询(字段包含空格) +func MultiMatchWithSpaceQuery(db *gorm.DB, column string, multiStr string) *gorm.DB { + if multiStr != "" { + col := rawStrings.Split(column, ".") + tableName, colName := "", "" + if len(col) > 1 { + tableName = col[0] + "." + colName = col[1] + } else { + colName = col[0] + } + cs := strings.MultiLines2SliceWithSpace(multiStr) + db = db.Where(tableName+"`"+colName+"` IN (?)", cs) + } + return db +} + +// MultiEnumQuery 多值枚举查询,精确匹配 +func MultiEnumQuery(db *gorm.DB, column string, multiStr string) *gorm.DB { + if multiStr != "" { + col := rawStrings.Split(column, ".") + tableName, colName := "", "" + if len(col) > 1 { + tableName = col[0] + "." + colName = col[1] + } else { + colName = col[0] + } + cs := strings.MultiLines2Slice(multiStr) + db = db.Where(tableName+"`"+colName+"` IN (?)", cs) + } + return db +} + +// MultiNumQuery 多数值查询:id=1,2,3,4 +func MultiNumQuery(db *gorm.DB, column string, multiVal []uint) *gorm.DB { + if len(multiVal) != 0 { + col := rawStrings.Split(column, ".") + tableName, colName := "", "" + if len(col) > 1 { + tableName = col[0] + "." + colName = col[1] + } else { + colName = col[0] + } + db = db.Where(tableName+"`"+colName+"` IN (?)", multiVal) + } + return db +} + +// ConcatColumnSliceStringQuery 多字符串切片 +func ConcatColumnSliceStringQuery(db *gorm.DB, column string, multiVal []string) *gorm.DB { + if len(multiVal) != 0 { + db = db.Where("CONCAT("+column+") IN (?)", multiVal) + } + return db +} +// ConcatColumnStringQuery +func ConcatColumnStringQuery(db *gorm.DB, column string, multiStr string) *gorm.DB { + if len(multiStr) != 0 { + db = db.Where("CONCAT("+column+") = (?)", multiStr) + } + return db +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/component.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/component.go new file mode 100644 index 0000000000000000000000000000000000000000..ce3ad31adfeb9b146af4d023ebc326fdf40aa3ff --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/component.go @@ -0,0 +1,42 @@ +package mysqlrepo + +import ( + "github.com/jinzhu/gorm" + + "idcos.io/cloudboot/model" +) + +// SaveComponentLogBySN 保存组件日志 +func (repo *MySQLRepo) SaveComponentLogBySN(cl *model.ComponentLog) (err error) { + var count int64 + if err = repo.db.Model(&model.ComponentLog{}).Where("sn = ?", cl.SN).Where("component = ?", cl.Component).Count(&count).Error; err != nil { + repo.log.Error(err) + return err + } + + if count > 0 { + if err = repo.db.Model(&model.ComponentLog{}).Where("sn = ?", cl.SN).Where("component = ?", cl.Component).Update("log", cl.LogData).Error; err != nil { + repo.log.Error(err) + return err + } + return nil + } + + if err = repo.db.Create(cl).Error; err != nil { + repo.log.Error(err) + return err + } + return nil +} + +// GetComponentLog 查询指定设备的指定组件日志 +func (repo *MySQLRepo) GetComponentLog(sn, component string) (*model.ComponentLog, error) { + var cl model.ComponentLog + if err := repo.db.Model(&model.ComponentLog{}).Where("sn = ?", sn).Where("component = ?", component).Find(&cl).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &cl, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/data_dict.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/data_dict.go new file mode 100644 index 0000000000000000000000000000000000000000..8f7b3abcf4a0b67d6dadcf7930cff0e7690b549e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/data_dict.go @@ -0,0 +1,56 @@ +package mysqlrepo + +import "idcos.io/cloudboot/model" + +// AddDataDicts 新增数据字典 +func (repo *MySQLRepo) AddDataDicts(mods []*model.DataDict) error { + tx := repo.db.Begin() + for _, m := range mods { + err := repo.db.Create(m).Error + if err != nil { + tx.Rollback() + return err + } + } + return nil +} + +//DelDataDicts 删除数据字典 +func (repo *MySQLRepo) DelDataDicts(mods []*model.DataDict) error { + tx := repo.db.Begin() + for _, m := range mods { + err := repo.db.Delete(m).Error + if err != nil { + tx.Rollback() + return err + } + } + return nil +} + +//UpdateDataDicts 修改数据字典 +func (repo *MySQLRepo) UpdateDataDicts(mods []*model.DataDict) error { + tx := repo.db.Begin() + for _, m := range mods { + err := repo.db.Model(&model.DataDict{}).Update(m).Error + if err != nil { + tx.Rollback() + return err + } + } + return nil +} + +// GetDataDictsByType 查询指定类型的数据字典列表 +func (repo *MySQLRepo) GetDataDictsByType(typ string) (mods []*model.DataDict, err error) { + if typ != "" { + err = repo.db.Where("type = ?", typ).Find(&mods).Error + if err != nil { + repo.log.Errorf("查询数据字典异常, %s", err.Error()) + return + } + return + } + repo.db.Find(&mods) + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/device.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/device.go new file mode 100644 index 0000000000000000000000000000000000000000..0342d68aeece03781a06380b72e784dd9cdf843c --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/device.go @@ -0,0 +1,633 @@ +package mysqlrepo + +import ( + "errors" + "fmt" + "strings" + + "github.com/jinzhu/gorm" + "github.com/voidint/page" + "idcos.io/cloudboot/model" + mystrings "idcos.io/cloudboot/utils/strings" +) + +// SaveCollectedDeviceBySN 保存(更新/新增)采集到的设备信息 +func (repo *MySQLRepo) SaveCollectedDeviceBySN(dev *model.CollectedDevice) error { + db := repo.db.Model(&model.CollectedDevice{}).Where("sn = ?", dev.SN).Updates(dev) + if err := db.Error; err != nil { + repo.log.Error(err) + return err + } + if db.RowsAffected > 0 { + return nil + } + + //if err := repo.db.Create(dev).Error; err != nil { + // repo.log.Error(err) + // return err + //} + return nil +} + +//GetDeviceBySN 根据SN查找设备 +func (repo *MySQLRepo) GetDeviceBySN(SN string) (*model.Device, error) { + var dev model.Device + if err := repo.db.Unscoped().Where("sn = ?", SN).Find(&dev).Error; err != nil { + if !gorm.IsRecordNotFoundError(err) { + repo.log.Error(err) + } + return nil, err + } + return &dev, nil +} + +// GetDeviceBySNOrMAC 根据SN或者mac地址查询设备 +func (repo *MySQLRepo) GetDeviceBySNOrMAC(snOrMAC string) (*model.Device, error) { + var dev model.Device + if err := repo.db. + Where( + "sn = ? OR JSON_CONTAINS(nic->'$.items',JSON_OBJECT('mac',?)) OR JSON_CONTAINS(nic->'$.items',JSON_OBJECT('mac',?))", + snOrMAC, + strings.ToLower(snOrMAC), + strings.ToUpper(snOrMAC), + ). + Find(&dev).Error; err != nil { + if !gorm.IsRecordNotFoundError(err) { + repo.log.Error(err) + } + return nil, err + } + return &dev, nil +} + +//GetDeviceByFixAssetNumber 根据固资查找设备 +func (repo *MySQLRepo) GetDeviceByFixAssetNumber(fixAssetNum string) (*model.Device, error) { + var dev model.Device + if err := repo.db.Unscoped().Where("fixed_asset_number = ?", fixAssetNum).Find(&dev).Error; err != nil { + if !gorm.IsRecordNotFoundError(err) { + repo.log.Error(err) + } + return nil, err + } + return &dev, nil +} + +// GetDeviceByID 返回指定ID的物理机 +func (repo *MySQLRepo) GetDeviceByID(id uint) (*model.Device, error) { + var dev model.Device + if err := repo.db.Unscoped().Where("id = ?", id).Find(&dev).Error; err != nil { + if !gorm.IsRecordNotFoundError(err) { + repo.log.Error(err) + } + return nil, err + } + return &dev, nil +} + +//SaveDevice 新增/修改设备 +func (repo *MySQLRepo) SaveDevice(mod *model.Device) (affected int64, err error) { + db := repo.db.Save(mod) + if err = db.Error; err != nil { + repo.log.Error(err) + return db.RowsAffected, err + } + return db.RowsAffected, nil +} + +//UpdateDevice 修改物理机 +func (repo *MySQLRepo) UpdateDevice(mod *model.Device) (affected int64, err error) { + db := repo.db.Model(model.Device{}).Where("id = ?", mod.ID).Update(mod) + if err = db.Error; err != nil { + repo.log.Error(err) + return db.RowsAffected, err + } + return db.RowsAffected, nil +} + +// UpdateDeviceBySN 更新目标设备的 +func (repo *MySQLRepo) UpdateDeviceBySN(dev *model.Device) (affected int64, err error) { + db := repo.db.Model(model.Device{}).Where("sn = ?", dev.SN).Updates(dev) + //下面这几个字段可以置0 + //Update("server_room_id", dev.ServerRoomID). + //Update("server_cabinet_id", dev.CabinetID). + //Update("server_usite_id", dev.USiteID). + //Update("store_room_id", dev.StoreRoomID). + //Update("virtual_cabinet_id", dev.VCabinetID) + if err = db.Error; err != nil { + repo.log.Error(err) + return db.RowsAffected, err + } + return db.RowsAffected, nil +} + +//RemoveDeviceByID 删除物理机 +func (repo *MySQLRepo) RemoveDeviceByID(id uint) (affected int64, err error) { + mod := model.Device{Model: gorm.Model{ID: id}} + db := repo.db.Unscoped().Delete(mod) + if err = db.Error; err != nil { + repo.log.Error(err) + return db.RowsAffected, err + } + return db.RowsAffected, nil +} + +//RemoveDeviceBySN 删除物理机 +func (repo *MySQLRepo) RemoveDeviceBySN(sn string) (affected int64, err error) { + mod := model.Device{} + db := repo.db.Unscoped().Where("sn = ?", sn).Delete(&mod) + if err = db.Error; err != nil { + repo.log.Errorf("RemoveDeviceBySN failure:%s", err.Error()) + } + return db.RowsAffected, nil +} + +//GetDevicesByUSiteID 根据机位信息查询设备 +func (repo *MySQLRepo) GetDevicesByUSiteID(id uint) (items []*model.Device, err error) { + db := repo.db.Model(&model.Device{}).Where("server_usite_id =?", id) + + if err = db.Find(&items).Error; err != nil { + repo.log.Error(err) + return + } + return +} + +// GetDevicesByUSiteIDS 根据机位信息查询设备 +func (repo *MySQLRepo) GetDevicesByUSiteIDS(ids []uint, usage string) (items []*model.Device, err error) { + db := repo.db.Model(&model.Device{}).Where("server_usite_id in (?)", ids).Where("`usage` = ?", usage) + + if err = db.Find(&items).Error; err != nil { + repo.log.Error(err) + return + } + return +} + +//CountDevices 统计满足过滤条件的物理机数量 +func (repo *MySQLRepo) CountDevices(cond *model.Device) (count int64, err error) { + db := repo.db.Model(&model.Device{}) + if cond != nil { + if cond.FixedAssetNumber != "" { + db = db.Where("`fixed_asset_number` LIKE ?", fmt.Sprintf("%%%s%%", cond.FixedAssetNumber)) + } + if cond.SN != "" { + //这里的SN可能是换行符分隔的多个SN构成的数组 + sns := mystrings.MultiLines2Slice(cond.SN) + for i, sn := range sns { + if i == 0 { + db = db.Where("`sn` LIKE ?", fmt.Sprintf("%%%s%%", sn)) + } else { + db = db.Or("`sn` LIKE ?", fmt.Sprintf("%%%s%%", sn)) + } + } + } + if cond.Vendor != "" { + db = db.Where("`vendor` LIKE ?", fmt.Sprintf("%%%s%%", cond.Vendor)) + } + if cond.DevModel != "" { + db = db.Where("`model` LIKE ?", fmt.Sprintf("%%%s%%", cond.DevModel)) + } + if cond.Usage != "" { + db = db.Where("`usage` LIKE ?", fmt.Sprintf("%%%s%%", cond.Usage)) + } + if cond.Category != "" { + db = db.Where("`category` LIKE ?", fmt.Sprintf("%%%s%%", cond.Category)) + } + if cond.OperationStatus != "" { + db = db.Where("`operation_status` LIKE ?", fmt.Sprintf("%%%s%%", cond.OperationStatus)) + } + } + err = db.Count(&count).Error + if err != nil { + repo.log.Errorf("统计物理机错误,%s", err.Error()) + } + return count, err +} + +// GetDevices 返回满足过滤条件的物理机 +func (repo *MySQLRepo) GetDevices(cond *model.Device, orderby model.OrderBy, limiter *page.Limiter) (items []*model.Device, err error) { + items = make([]*model.Device, 0) + db := repo.db.Model(&model.Device{}) + if cond != nil { + if cond.FixedAssetNumber != "" { + //这里的固资编号可能是换行符分隔的多个构成的数组 + fns := mystrings.MultiLines2Slice(cond.FixedAssetNumber) + db = db.Where("`fixed_asset_number` IN (?)", fns) + //for i, fn := range fns { + // if i == 0 { + // db = db.Where("`fixed_asset_number` LIKE ?", fmt.Sprintf("%%%s%%", fn)) + // } else { + // db = db.Or("`fixed_asset_number` LIKE ?", fmt.Sprintf("%%%s%%", fn)) + // } + //} + } + if cond.SN != "" { + //这里的SN可能是换行符分隔的多个SN构成的数组 + sns := mystrings.MultiLines2Slice(cond.SN) + db = db.Where("`sn` IN (?)", sns) + //for i, sn := range sns { + // if i == 0 { + // db = db.Where("`sn` LIKE ?", fmt.Sprintf("%%%s%%", sn)) + // } else { + // db = db.Or("`sn` LIKE ?", fmt.Sprintf("%%%s%%", sn)) + // } + //} + } + if cond.Vendor != "" { + db = db.Where("`vendor` LIKE ?", fmt.Sprintf("%%%s%%", cond.Vendor)) + } + if cond.DevModel != "" { + db = db.Where("`model` LIKE ?", fmt.Sprintf("%%%s%%", cond.DevModel)) + } + if cond.Usage != "" { + db = db.Where("`usage` LIKE ?", fmt.Sprintf("%%%s%%", cond.Usage)) + } + if cond.Category != "" { + db = db.Where("`category` LIKE ?", fmt.Sprintf("%%%s%%", cond.Category)) + } + if cond.OperationStatus != "" { + db = db.Where("`operation_status` LIKE ?", fmt.Sprintf("%%%s%%", cond.OperationStatus)) + } + if cond.OOBAccessible != nil { + if *cond.OOBAccessible == model.YES { + db = db.Where("`oob_accessible` = ?", *cond.OOBAccessible) + } else { + db = db.Where("`oob_accessible` = ? OR `oob_accessible` is null", model.NO) + } + } + if cond.VCabinetID != 0 { + db = db.Where("`virtual_cabinet_id` = ?", cond.VCabinetID) + } + + } + for i := range orderby { + db = db.Order(orderby[i].String()) + } + if limiter != nil { + db = db.Offset(limiter.Offset).Limit(limiter.Limit) + } + err = db.Find(&items).Error + if err != nil { + repo.log.Errorf("多条件查询物理机错误,%s", err.Error()) + return nil, err + } + return items, nil +} + +const condSep = "," + +func (repo *MySQLRepo) setWhereSQL4CombinedDevice(db *gorm.DB, cond *model.CombinedDeviceCond) *gorm.DB { + if db == nil || cond == nil { + return db + } + var sb strings.Builder + if cond.SN != "" { + sb.Reset() + for i, sn := range mystrings.MultiLines2Slice(cond.SN) { + if i > 0 { + sb.WriteString(" OR ") + } + sb.WriteString(fmt.Sprintf("device.sn LIKE '%%%s%%'", sn)) + } + db = db.Where(sb.String()) + } + if cond.FixedAssetNumber != "" { + sb.Reset() + for i, number := range mystrings.MultiLines2Slice(cond.FixedAssetNumber) { + if i > 0 { + sb.WriteString(" OR ") + } + sb.WriteString(fmt.Sprintf("device.fixed_asset_number LIKE '%%%s%%'", number)) + } + db = db.Where(sb.String()) + } + if cond.ID != nil { + db = db.Where("device.id IN (?)", cond.ID) + } + if cond.IDCID != nil { + db = db.Where("device.idc_id IN (?)", cond.IDCID) + } + if cond.ServerRoomID != nil { + db = db.Where("device.server_room_id IN (?)", cond.ServerRoomID) + } + if cond.ServerCabinet != "" { + sb.Reset() + for i, number := range mystrings.MultiLines2Slice(cond.ServerCabinet) { + if i > 0 { + sb.WriteString(" OR ") + } + sb.WriteString(fmt.Sprintf("server_cabinet.number LIKE '%%%s%%'", number)) + } + db = db.Where(sb.String()) + } + if cond.ServerRoomName != "" { + sb.Reset() + for i, roomName := range mystrings.MultiLines2Slice(cond.ServerRoomName) { + if i > 0 { + sb.WriteString(" OR ") + } + sb.WriteString(fmt.Sprintf("server_room.name LIKE '%%%s%%'", roomName)) + } + db = db.Where(sb.String()) + } + if cond.ServerUsiteNumber != "" { + sb.Reset() + for i, usiteNum := range mystrings.MultiLines2Slice(cond.ServerUsiteNumber) { + if i > 0 { + sb.WriteString(" OR ") + } + sb.WriteString(fmt.Sprintf("server_usite.number LIKE '%%%s%%'", usiteNum)) + } + db = db.Where(sb.String()) + } + if cond.USiteID != nil { + db = db.Where("device.server_cabinet_id IN (?)", cond.USiteID) + } + if cond.PhysicalArea != "" { + // PhysicalArea: 'Management bonding区1' contains space + db = db.Where("server_usite.physical_area IN (?)", mystrings.MultiLines2SliceWithSpace(cond.PhysicalArea)) + //sb.Reset() + //for i, phyArea := range mystrings.MultiLines2Slice(cond.PhysicalArea) { + // if i > 0 { + // sb.WriteString(" OR ") + // } + // sb.WriteString(fmt.Sprintf("device.operation_status <> 'in_store' AND server_usite.physical_area LIKE '%%%s%%'", phyArea)) + //} + //db = db.Where(sb.String()) + } + if cond.Vendor != "" { + db = db.Where("device.vendor IN (?)", mystrings.MultiLines2Slice(cond.Vendor)) + } + if cond.DevModel != "" { + sb.Reset() + for i, devModel := range mystrings.MultiLines2Slice(cond.DevModel) { + if i > 0 { + sb.WriteString(" OR ") + } + sb.WriteString(fmt.Sprintf("device.model LIKE '%%%s%%'", devModel)) + } + db = db.Where(sb.String()) + } + if cond.HardwareRemark != "" { + db = db.Where(fmt.Sprintf("device.hardware_remark LIKE '%%%s%%'", cond.HardwareRemark)) + } + if cond.Usage != "" { + db = db.Where("device.`usage` IN (?)", mystrings.MultiLines2Slice(cond.Usage)) + } + if len(cond.USiteID) != 0 { + db = db.Where("device.server_usite_id IN (?)", cond.USiteID) + } + if cond.Category != "" { + db = db.Where("device.`category` IN (?)", mystrings.MultiLines2Slice(cond.Category)) + } + if cond.OperationStatus != "" { + db = db.Where("device.`operation_status` IN (?)", strings.Split(cond.OperationStatus, condSep)) + } + if cond.PreDeployed { // '预部署'状态,返回不在装机列表或者装机状态是失败的设备。 + db = db.Where("device_setting.sn IS NULL OR device_setting.`status` = ?", model.InstallStatusFail) + } else if cond.DeployStatus != "" { + db = db.Where("device_setting.`status` IN (?)", strings.Split(cond.DeployStatus, condSep)) + } + if cond.IntranetIP != "" { + //db = db.Where("device_setting.intranet_ip IN (?)", cond.IntranetIP) + db = MultiMatchQuery(db, "device_setting.intranet_ip", cond.IntranetIP) + } + if cond.ExtranetIP != "" { + //db = db.Where(" IN (?)", cond.ExtranetIP) + db = MultiMatchQuery(db, "device_setting.extranet_ip", cond.ExtranetIP) + } + if cond.IP != "" { + sb.Reset() + for i, ip := range mystrings.MultiLines2Slice(cond.IP) { + if i > 0 { + sb.WriteString(" OR ") + } + sb.WriteString(fmt.Sprintf("device_setting.intranet_ip LIKE '%%%s%%' OR device_setting.extranet_ip LIKE '%%%s%%' OR device.oob_ip LIKE '%%%s%%'", ip, ip, ip)) + } + db = db.Where(sb.String()) + } + if cond.OOBAccessible != "" { + if strings.Contains(cond.OOBAccessible, model.Unknown) { + db = db.Where("device.`oob_accessible` IN (?) OR device.`oob_accessible` IS NULL", mystrings.MultiLines2Slice(cond.OOBAccessible)) + } else { + db = db.Where("device.`oob_accessible` IN (?)", mystrings.MultiLines2Slice(cond.OOBAccessible)) + } + } + return db +} + +// CountCombinedDevices 统计满足过滤条件的记录数量 +func (repo *MySQLRepo) CountCombinedDevices(cond *model.CombinedDeviceCond) (count int64, err error) { + db := repo.db.Table("device") + db = repo.setWhereSQL4CombinedDevice(db, cond) + if err = db.Select("COUNT(device.id)"). + Joins("LEFT JOIN device_setting device_setting ON device.sn = device_setting.sn"). + Joins("LEFT JOIN hardware_template hardware_template ON device_setting.hardware_template_id = hardware_template.id"). + Joins("LEFT JOIN system_template system_template ON device_setting.system_template_id = system_template.id"). + Joins("LEFT JOIN image_template image_template ON device_setting.image_template_id = image_template.id"). + Joins("LEFT JOIN server_cabinet server_cabinet ON device.server_cabinet_id = server_cabinet.id"). + Joins("LEFT JOIN server_room server_room ON device.server_room_id = server_room.id"). + Joins("LEFT JOIN server_usite server_usite ON device.server_usite_id = server_usite.id").Count(&count).Error; err != nil { + repo.log.Error(err) + return 0, err + } + + return count, nil +} + +// GetCombinedDevices 返回满足过滤条件的设备及其装机参数列表 +func (repo *MySQLRepo) GetCombinedDevices(cond *model.CombinedDeviceCond, orderby model.OrderBy, limiter *page.Limiter) (items []*model.CombinedDevice, err error) { + db := repo.db.Table("device") + db = repo.setWhereSQL4CombinedDevice(db, cond) + db = db.Select(` + device.id, + device.fixed_asset_number, + device.sn, + device.vendor, + device.model, + device.power_status, + device.oob_accessible, + device.arch, + device.usage, + device.category, + device.idc_id, + device.server_room_id, + device.server_cabinet_id, + device.server_usite_id, + device.store_room_id, + device.virtual_cabinet_id, + device.hardware_remark, + device.raid_remark, + device.started_at, + device.onshelve_at, + device.operation_status, + device.oob_ip, + device.oob_user, + device.oob_password, + device.cpu_sum, + device.cpu, + device.memory_sum, + device.memory, + device.disk_sum, + device.disk, + device.disk_slot, + device.nic, + device.nic_device, + device.bootos_ip, + device.bootos_mac, + device.motherboard, + device.raid, + device.oob, + device.bios, + device.fan, + device.power, + device.hba, + device.pci, + device.switch, + device.lldp, + device.extra, + device.origin_node, + device.origin_node_ip, + device.operation_user_id, + device.creator, + device.updater, + device.remark, + device.order_number, + device_setting.status AS deploy_status, + device_setting.install_progress, + IF(system_template.name != '', system_template.name, image_template.name) AS os, + device_setting.system_template_id, + system_template.name AS system_template_name, + device_setting.hardware_template_id, + concat(hardware_template.vendor,'-',hardware_template.model) AS hardware_name, + device_setting.intranet_ip, + device_setting.extranet_ip, + device_setting.intranet_ipv6, + device_setting.extranet_ipv6, + device_setting.image_template_id AS image_template_id, + image_template.name AS image_template_name, + device_lifecycle.asset_belongs, + device_lifecycle.owner, + device_lifecycle.is_rental, + device_lifecycle.maintenance_service_provider, + device_lifecycle.maintenance_service, + device_lifecycle.logistics_service, + device_lifecycle.maintenance_service_date_begin, + device_lifecycle.maintenance_service_date_end, + device_lifecycle.maintenance_service_status, + device_lifecycle.device_retired_date, + device_lifecycle.lifecycle_log, + device.created_at, + IF(device_setting.updated_at IS NULL, device.updated_at, IF(device.updated_at > device_setting.updated_at, device.updated_at, device_setting.updated_at)) AS updated_at + `). + Joins("LEFT JOIN device_setting device_setting ON device.sn = device_setting.sn"). + Joins("LEFT JOIN hardware_template hardware_template ON device_setting.hardware_template_id = hardware_template.id"). + Joins("LEFT JOIN system_template system_template ON device_setting.system_template_id = system_template.id"). + Joins("LEFT JOIN image_template image_template ON device_setting.image_template_id = image_template.id"). + Joins("LEFT JOIN server_cabinet server_cabinet ON device.server_cabinet_id = server_cabinet.id"). + Joins("LEFT JOIN server_room server_room ON device.server_room_id = server_room.id"). + Joins("LEFT JOIN server_usite server_usite ON device.server_usite_id = server_usite.id"). + Joins("LEFT JOIN device_lifecycle device_lifecycle ON device.sn = device_lifecycle.sn") + + for i := range orderby { + db = db.Order(orderby[i].String()) + } + if limiter != nil { + db = db.Limit(limiter.Limit).Offset(limiter.Offset) + } + if err = db.Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} + +// 查询物理机查询条件的下拉源数据 +func (repo *MySQLRepo) GetDeviceQuerys(param string) (*model.DeviceQueryParamResp, error) { + p := model.DeviceQueryParamResp{} + p.ParamName = param + rawSQL := "" + mods := make([]struct { + ID string + Name string + }, 0) + switch param { + case "idc": + rawSQL = "select DISTINCT device.idc_id AS id,idc.name from device left join idc ON device.idc_id = idc.id;" + case "server_room": + rawSQL = "select DISTINCT device.server_room_id AS id,server_room.name from device left join server_room ON device.server_room_id = server_room.id;" + case "server_cabinet": + rawSQL = "select DISTINCT device.server_cabinet_id AS id,server_cabinet.number AS name from device left join server_cabinet ON device.server_cabinet_id = server_cabinet.id;" + case "physical_area": + rawSQL = "select DISTINCT 0 AS id, server_usite.physical_area AS name from server_usite where server_usite.physical_area is not null;" + case "op_status": + rawSQL = "select DISTINCT 0 AS id, operation_status AS name from device;" + case "usage": + rawSQL = "select DISTINCT 0 AS id, `usage` AS name from device;" + case "category": + rawSQL = "select DISTINCT 0 AS id, `category` AS name from device;" + case "category_pre_deploy": + rawSQL = "select DISTINCT 0 AS id, `category` AS name from device where operation_status='pre_deploy';" + case "vendor": + rawSQL = "select DISTINCT 0 AS id, `vendor` AS name from device;" + case "switches": + rawSQL = "select DISTINCT n.fixed_asset_number AS id ,concat(n.name,'(',n.fixed_asset_number,')') AS name from network_device AS n" + default: + return nil, errors.New("not supported yet") + } + + _ = repo.db.Raw(rawSQL).Scan(&mods).Error + if len(mods) == 0 { + p.List = []model.ParamList{} + } + for _, mod := range mods { + p.List = append(p.List, model.ParamList{ + ID: mod.ID, + Name: mod.Name, + }) + } + return &p, nil +} + +// 按月份查询最大编号的固资编号 +func (repo *MySQLRepo) GetMaxFixedAssetNumber(month string) (fixedAssetNumber string, err error) { + rawSQL := fmt.Sprintf("select max(fixed_asset_number) As fixed_asset_number from device where fixed_asset_number LIKE 'WDEV%s%%';", month) + out := struct { + FixedAssetNumber string + }{} + err = repo.db.Raw(rawSQL).Find(&out).Error + if err == nil { + return out.FixedAssetNumber, nil + } + return "", err +} + +// GetDeviceByStartedAt 根据启用日期查询在该日期之前的设备 +func (repo *MySQLRepo) GetDeviceByStartedAt(started_date string) (items []*model.Device, err error) { + items = make([]*model.Device, 0) + db := repo.db.Model(&model.Device{}) + if started_date != "" { + db = db.Where("`started_at` < (?)", started_date) + } + err = db.Find(&items).Error + if err != nil { + repo.log.Errorf("根据启用日期查询在该日期之前的设备,%s", err.Error()) + return nil, err + } + return items, nil +} + +//GetDeviceByOperationStatus 根据运营状态查找设备 +func (repo *MySQLRepo) GetDeviceByOperationStatus(status string) (items []*model.Device, err error) { + items = make([]*model.Device, 0) + db := repo.db.Model(&model.Device{}) + if status != "" { + db = db.Where("`operation_status` = ?", status) + } + err = db.Find(&items).Error + if err != nil { + repo.log.Errorf("根据运营状态(%s)查找设备失败,Error:%s", status, err.Error()) + return nil, err + } + return items, nil +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/device_category.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/device_category.go new file mode 100644 index 0000000000000000000000000000000000000000..c106fabf46ac8574e71c14bccdc1b1722ed7e3fb --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/device_category.go @@ -0,0 +1,137 @@ +package mysqlrepo + +import ( + "errors" + + "github.com/voidint/page" + + "github.com/jinzhu/gorm" + "idcos.io/cloudboot/model" +) + +// RemoveDeviceCategoryByID 删除指定ID的设备类型 +func (repo *MySQLRepo) RemoveDeviceCategoryByID(id uint) (affected int64, err error) { + mod := model.DeviceCategory{Model: gorm.Model{ID: id}} + err = repo.db.Unscoped().Delete(mod).Error + if err != nil { + return 0, err + } + return 1, nil +} + +// SaveDeviceCategory 保存设备类型 +func (repo *MySQLRepo) SaveDeviceCategory(mod *model.DeviceCategory) (affected int64, err error) { + if mod.ID != 0 { + return repo.UpdateDeviceCategory(mod) + } else { + affected, _, err = repo.AddDeviceCategory(mod) + } + return affected, err +} + +// AddDeviceCategory 增加设备类型 +func (repo *MySQLRepo) AddDeviceCategory(mod *model.DeviceCategory) (affected int64, DeviceCategory *model.DeviceCategory, err error) { + err = repo.db.Create(mod).Error + if err != nil { + return 0, nil, err + } + return 1, mod, nil +} + +// UpdateDeviceCategory 修改设备类型 +func (repo *MySQLRepo) UpdateDeviceCategory(mod *model.DeviceCategory) (affected int64, err error) { + err = repo.db.Model(&model.DeviceCategory{}).Where("id = ?", mod.ID).Update(mod).Update("remark", mod.Remark).Error + if err != nil { + return 0, err + } + return 1, nil +} + +// GetDeviceCategoryByID 返回指定ID的设备类型 +func (repo *MySQLRepo) GetDeviceCategoryByID(id uint) (*model.DeviceCategory, error) { + var DeviceCategory model.DeviceCategory + if err := repo.db.Where("id = ?", id).Find(&DeviceCategory).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &DeviceCategory, nil +} + +// CountDeviceCategorys 统计满足过滤条件的设备类型数量 +func (repo *MySQLRepo) CountDeviceCategorys(cond *model.DeviceCategory) (count int64, err error) { + db := repo.db.Model(&model.DeviceCategory{}) + if cond != nil { + db = MultiQuery(db, "category", cond.Category) + db = MultiQuery(db, "hardware", cond.Hardware) + db = MultiQuery(db, "power", cond.Power) + db = MultiQuery(db, "remark", cond.Remark) + } + err = db.Count(&count).Error + return count, err +} + +// GetDeviceCategorys 返回满足过滤条件的设备类型 +func (repo *MySQLRepo) GetDeviceCategorys(cond *model.DeviceCategory, orderby model.OrderBy, limiter *page.Limiter) (items []*model.DeviceCategory, err error) { + items = make([]*model.DeviceCategory, 0) + db := repo.db.Model(&model.DeviceCategory{}) + if cond != nil { + db = MultiQuery(db, "category", cond.Category) + db = MultiQuery(db, "hardware", cond.Hardware) + db = MultiQuery(db, "power", cond.Power) + db = MultiQuery(db, "remark", cond.Remark) + } + for i := range orderby { + db = db.Order(orderby[i].String()) + } + if limiter != nil { + db = db.Offset(limiter.Offset).Limit(limiter.Limit) + } + err = db.Find(&items).Error + if err != nil { + return nil, err + } + return items, nil +} + +// 返回指定类型名的设备类型 +func (repo *MySQLRepo) GetDeviceCategoryByName(category string) (dc *model.DeviceCategory, err error) { + var DeviceCategory model.DeviceCategory + if err := repo.db.Where("category = ?", category).Find(&DeviceCategory).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &DeviceCategory, nil +} + +// 查询设备查询条件的下拉源数据 +func (repo *MySQLRepo) GetDeviceCategoryQuerys(param string) (*model.DeviceQueryParamResp, error) { + p := model.DeviceQueryParamResp{} + p.ParamName = param + rawSQL := "" + mods := make([]struct { + ID string + Name string + }, 0) + switch param { + case "category": + rawSQL = "select DISTINCT id AS id, `category` AS name from device_category;" + default: + return nil, errors.New("not supported yet") + } + + _ = repo.db.Raw(rawSQL).Scan(&mods).Error + if len(mods) == 0 { + return nil, gorm.ErrRecordNotFound + } + for _, mod := range mods { + p.List = append(p.List, model.ParamList{ + ID: mod.ID, + Name: mod.Name, + }) + } + return &p, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/device_hardware_setting.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/device_hardware_setting.go new file mode 100644 index 0000000000000000000000000000000000000000..3de5fe3360601b666cfe329ba60585f41a88d404 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/device_hardware_setting.go @@ -0,0 +1,77 @@ +package mysqlrepo + +import ( + "github.com/jinzhu/gorm" + + "idcos.io/cloudboot/model" +) + +// OverwriteHardwareSettings 覆写指定设备的硬件配置参数 +func (repo *MySQLRepo) OverwriteHardwareSettings(sn string, items ...*model.DeviceHardwareSetting) (err error) { + tx := repo.db.Begin() + + // 删除设备所有记录 + if err = tx.Where("sn = ?", sn).Delete(model.DeviceHardwareSetting{}).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return err + } + + for i := range items { + if items[i] == nil { + continue + } + // 新增设备记录 + if err = tx.Create(items[i]).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return err + } + } + return tx.Commit().Error +} + +// GetHardwareSettingsBySN 返回指定设备的硬件配置配置参数 +func (repo *MySQLRepo) GetHardwareSettingsBySN(sn string) (items []*model.DeviceHardwareSetting, err error) { + if err := repo.db.Where("sn = ?", sn).Find(&items).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return items, nil +} + +// UpdateHardwareSettingsApplied 更新满足过滤条件的硬件配置项实施状态 +func (repo *MySQLRepo) UpdateHardwareSettingsApplied(cond *model.DeviceHardwareSetting, applied string) (affected int64, err error) { + db := repo.db.Model(&model.DeviceHardwareSetting{}) + if cond != nil { + if cond.SN != "" { + db = db.Where("sn = ?", cond.SN) + } + if cond.Index >= 0 { + db = db.Where("`index` = ?", cond.Index) + } + if cond.Category != "" { + db = db.Where("category = ?", cond.Category) + } + if cond.Action != "" { + db = db.Where("action = ?", cond.Action) + } + } + + db = db.Update("applied", applied) + if err = db.Error; err != nil { + repo.log.Error(err) + } + return db.RowsAffected, err +} + +// RedoHardwareSettings 将指定设备的硬件配置项设置为'未实施'状态。 +func (repo *MySQLRepo) RedoHardwareSettings(sn string) (affected int64, err error) { + db := repo.db.Model(&model.DeviceHardwareSetting{}).Where("sn = ?", sn).Update("applied", model.NO) + if err = db.Error; err != nil { + repo.log.Error(err) + } + return db.RowsAffected, err +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/device_lifecycle.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/device_lifecycle.go new file mode 100644 index 0000000000000000000000000000000000000000..0a0b85436496db91804869faeb579c870820105a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/device_lifecycle.go @@ -0,0 +1,79 @@ +package mysqlrepo + +import ( + "idcos.io/cloudboot/model" + "github.com/jinzhu/gorm" +) + + + +// SaveDeviceLifecycle 保存设备生命周期记录 +func (repo *MySQLRepo) SaveDeviceLifecycle(mod *model.DeviceLifecycle) (affected int64, err error) { + if mod.ID != 0 { + return repo.UpdateDeviceLifecycle(mod) + } else { + affected, _, err = repo.AddDeviceLifecycle(mod) + } + return affected, err +} + +// AddDeviceLifecycle 增加设备生命周期记录 +func (repo *MySQLRepo) AddDeviceLifecycle(mod *model.DeviceLifecycle) (affected int64, DeviceLifecycle *model.DeviceLifecycle, err error) { + err = repo.db.Create(mod).Error + if err != nil { + return 0, nil, err + } + return 1, mod, nil +} + +// UpdateDeviceLifecycle 修改设备生命周期记录 +func (repo *MySQLRepo) UpdateDeviceLifecycle(mod *model.DeviceLifecycle) (affected int64, err error) { + err = repo.db.Model(&model.DeviceLifecycle{}).Where("id = ?", mod.ID).Update(mod).Error + if err != nil { + return 0, err + } + return 1, nil +} + +// RemoveDeviceLifecycleByID 删除指定ID的设备生命周期记录 +func (repo *MySQLRepo) RemoveDeviceLifecycleByID(id uint) (affected int64, err error) { + mod := model.DeviceLifecycle{Model: gorm.Model{ID: id}} + err = repo.db.Unscoped().Delete(mod).Error + if err != nil { + return 0, err + } + return 1, nil +} + +//RemoveDeviceLifecycleBySN 删除指定SN的设备生命周期记录 +func (repo *MySQLRepo) RemoveDeviceLifecycleBySN(sn string) (affected int64, err error) { + mod := model.DeviceLifecycle{} + db := repo.db.Unscoped().Where("sn = ?", sn).Delete(&mod) + if err = db.Error; err != nil { + repo.log.Errorf("RemoveDeviceLifecycleBySN failure:%s", err.Error()) + } + return db.RowsAffected, nil +} + +// GetDeviceLifecycleBySN 返回指定SN的设备生命周期 +func (repo *MySQLRepo) GetDeviceLifecycleBySN(sn string) (*model.DeviceLifecycle, error) { + var devLifecycle model.DeviceLifecycle + if err := repo.db.Where("sn = ?", sn).Find(&devLifecycle).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &devLifecycle, nil +} + + +// UpdateDeviceLifecycleBySN 根据SN更新设备生命周期变更记录 +func (repo *MySQLRepo) UpdateDeviceLifecycleBySN(deviceLifecycle *model.DeviceLifecycle) (err error) { + db := repo.db.Model(&model.DeviceLifecycle{}).Where("sn = ?", deviceLifecycle.SN).Updates(deviceLifecycle) + if db.Error != nil { + repo.log.Error(err) + return db.Error + } + return nil +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/device_log.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/device_log.go new file mode 100644 index 0000000000000000000000000000000000000000..208a08909694bc6c937fb77988d2922a2df3679d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/device_log.go @@ -0,0 +1,44 @@ +package mysqlrepo + +import "idcos.io/cloudboot/model" + +// GetDeviceLogsByDeviceSettingID 根据装机参数id获取装机日志信息 +func (repo *MySQLRepo) GetDeviceLogsByDeviceSettingID(id uint) (deviceLogs []model.DeviceLog, err error) { + deviceLogs = []model.DeviceLog{} + db := repo.db.Model(&model.DeviceLog{}).Where("device_setting_id = ? and type = ?", id, "install").Find(&deviceLogs) + if db.Error != nil { + repo.log.Error(err) + return nil, db.Error + } + return deviceLogs, nil +} + +// UpdateDeviceLogType 修改操作系统安装进度记录 +func (repo *MySQLRepo) UpdateDeviceLogType(settingID uint, fromLogType, toLogType string) (affected int64, err error) { + db := repo.db.Model(&model.DeviceLog{}).Where("device_setting_id = ? and type = ?", settingID, fromLogType).Update("type", toLogType) + if db.Error != nil { + repo.log.Error(err) + return 0, db.Error + } + return db.RowsAffected, nil +} + +// SaveDeviceLog 新增操作系统安装进度记录 +func (repo *MySQLRepo) SaveDeviceLog(log *model.DeviceLog) (affected int64, err error) { + if log.ID > 0 { + // 更新 + db := repo.db.Model(&model.DeviceLog{}).Where("id = ?", log.ID).Updates(log) + if err = db.Error; err != nil { + repo.log.Error(err) + return db.RowsAffected, err + } + return db.RowsAffected, nil + } + // 新增 + db := repo.db.Create(log) + if err = db.Error; err != nil { + repo.log.Error(err) + return db.RowsAffected, err + } + return db.RowsAffected, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/device_setting.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/device_setting.go new file mode 100644 index 0000000000000000000000000000000000000000..52f437f260027f912b61071b408bb43f36ea7d6f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/device_setting.go @@ -0,0 +1,242 @@ +package mysqlrepo + +import ( + "time" + + "github.com/jinzhu/gorm" + "github.com/voidint/page" + + "idcos.io/cloudboot/model" +) + +// GetDeviceSettingsByInstallationTimeout 查询安装超时的设备装机记录列表。timeout-超时时间,单位秒。 +func (repo *MySQLRepo) GetDeviceSettingsByInstallationTimeout(timeout int64) (items []*model.DeviceSetting, err error) { + if timeout <= 0 { + return make([]*model.DeviceSetting, 0, 0), nil + } + if err = repo.db.Model(&model.DeviceSetting{}).Where("status = ? AND UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(installation_start_time) >= ?", model.InstallStatusIng, timeout).Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} + +// SetInstallationTimeout 为指定设备序列号的装机参数进行'安装超时'处理。 +func (repo *MySQLRepo) SetInstallationTimeout(sns ...string) (affected int64, err error) { + db := repo.db.Model(&model.DeviceSetting{}).Where("sn IN (?) AND status = ?", sns, model.InstallStatusIng).Updates(map[string]interface{}{ + "install_progress": 0, + "status": model.InstallStatusFail, + "installation_end_time": time.Now(), + }) + if err = db.Error; err != nil { + repo.log.Error(err) + return 0, err + } + return db.RowsAffected, nil +} + +//UpdateInstallStatusAndProgressByID 更新安装状态和进度 +func (repo *MySQLRepo) UpdateInstallStatusAndProgressByID(id uint, status string, progress float64) (affected int64, err error) { + kv := make(map[string]interface{}, 3) + kv["status"] = status + kv["install_progress"] = progress + + if status == model.InstallStatusIng && progress == 0 { + now := time.Now() + kv["installation_start_time"] = &now + kv["installation_end_time"] = nil + } + if status == model.InstallStatusFail || status == model.InstallStatusSucc { + now := time.Now() + kv["installation_end_time"] = &now + } + + db := repo.db.Model(&model.DeviceSetting{}).Where("id = ?", id).Updates(kv) + if err = db.Error; err != nil { + repo.log.Error(err) + return 0, err + } + return db.RowsAffected, nil +} + +//DeleteDeviceSettingByID 删除指定ID的装机参数 +func (repo *MySQLRepo) DeleteDeviceSettingByID(id uint) (*model.DeviceSetting, error) { + mod := model.DeviceSetting{} + err := repo.db.Unscoped().Where("id = ?", id).Delete(&mod).Error + if err != nil { + repo.log.Errorf("DeleteDeviceSettingByID failure,%s", err.Error()) + } + return &mod, err +} + +//DeleteDeviceSettingBySN 删除指定SN的装机参数 +func (repo *MySQLRepo) DeleteDeviceSettingBySN(sn string) (*model.DeviceSetting, error) { + mod := model.DeviceSetting{} + err := repo.db.Unscoped().Where("sn = ?", sn).Delete(&mod).Error + if err != nil { + repo.log.Errorf("DeleteDeviceSettingBySN failure,%s", err.Error()) + } + return &mod, err +} + +// AddDeviceSettings 批量添加设备装机参数 +func (repo *MySQLRepo) AddDeviceSettings(items ...*model.DeviceSetting) (err error) { + tx := repo.db.Begin() + for i := range items { + if err = tx.Create(items[i]).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return err + } + } + return tx.Commit().Error +} + +// UpdateDeviceSettingBySN 根据SN更新设备装机参数 +func (repo *MySQLRepo) UpdateDeviceSettingBySN(sett *model.DeviceSetting) (affected int64, err error) { + db := repo.db.Model(&model.DeviceSetting{}).Where("sn = ?", sett.SN).Updates(sett) // Updates仅更新非0值 + if db.Error != nil { + repo.log.Error(err) + return db.RowsAffected, db.Error + } + return db.RowsAffected, nil +} + +// UpdateDeviceSettingIPConfigBySN 根据SN更新设备装机参数 +//func (repo *MySQLRepo) UpdateDeviceSettingIPConfigBySN(sn string, intranet bool) (affected int64, err error) { +// db := repo.db.Model(&model.DeviceSetting{}).Where("sn = ?", sn) +// if intranet { +// db.Updates(map[string]interface{}{ +// "intranet_ip_network_id": 0, +// "intranet_ip": "", +// }) +// } else { +// db.Updates(map[string]interface{}{ +// "extranet_ip_network_id": 0, +// "extranet_ip": "", +// }) +// } +// if db.Error != nil { +// repo.log.Error(err) +// return db.RowsAffected, db.Error +// } +// return db.RowsAffected, nil +//} + +// SaveDeviceSetting 保存设备装机参数。若入参包含主键ID,则进行更新操作,否则进行新增操作。 +func (repo *MySQLRepo) SaveDeviceSetting(sett *model.DeviceSetting) (err error) { + db := repo.db.Save(sett) + if err = db.Error; err != nil { + repo.log.Error(err) + return err + } + return nil +} + +// GetDeviceSettingBySN 根据sn查询设备装机参数 +func (repo *MySQLRepo) GetDeviceSettingBySN(sn string) (devSetting *model.DeviceSetting, err error) { + var row model.DeviceSetting + if err = repo.db.Where("sn = ?", sn).Find(&row).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &row, nil +} + +// GetDeviceSettingByID 根据id查询设备装机参数 +func (repo *MySQLRepo) GetDeviceSettingByID(id uint) (devSetting *model.DeviceSetting, err error) { + var row model.DeviceSetting + if err = repo.db.Where("id = ?", id).Find(&row).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &row, nil +} + +// CountDeviceSettingCombines 统计满足过滤条件的装机参数数量 +func (repo *MySQLRepo) CountDeviceSettingCombines(cond *model.CombineDeviceSetting) (count int64, err error) { + db := repo.db.Table("device_setting "). + Joins("inner join device ON device_setting.sn = device.sn") + + db = addDeviceSettingCond(db, cond) + + if err = db.Select("device_setting.id").Count(&count).Error; err != nil { + repo.log.Error(err) + return 0, err + } + + return count, nil + +} + +// CountDeviceSettingByStatus 统计对应设备安装状态的数量 +func (repo *MySQLRepo) CountDeviceSettingByStatus(status string) (count int64, err error) { + db := repo.db.Table("device_setting as setting"). + Joins("inner join device on device.sn = setting.sn").Where("setting.status = ?", status).Count(&count) + + if db.Error != nil { + return 0, db.Error + } + + return count, nil +} + +// GetDeviceSettingCombinesByCond 返回满足过滤条件的装机参数 +func (repo *MySQLRepo) GetDeviceSettingCombinesByCond(cond *model.CombineDeviceSetting, orderby model.OrderBy, limiter *page.Limiter) (item []*model.DeviceSetting, err error) { + db := repo.db.Table("device_setting "). + Joins("inner join device ON device_setting.sn = device.sn") + + db = addDeviceSettingCond(db, cond) + + for i := range orderby { + db = db.Order(orderby[i].String()) + } + + if limiter != nil { + db = db.Limit(limiter.Limit).Offset(limiter.Offset) + } + + if err = db.Select("device_setting.*").Find(&item).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return item, nil +} + +// addDeviceSettingCond 添加物理设备参数信息 +func addDeviceSettingCond(db *gorm.DB, cond *model.CombineDeviceSetting) *gorm.DB { + if cond.ServerRoomName != "" { + db = db.Joins("left join server_room ON device.server_room_id = server_room.id") + } + if cond.ServerCabinetNumber != "" { + db = db.Joins("left join server_cabinet ON device.server_cabinet_id = server_cabinet.id") + } + if cond != nil { + db = MultiNumQuery(db, "device.idc_id", cond.IDCID) + db = MultiNumQuery(db, "device.server_room_id", cond.ServerRoomID) + db = MultiNumQuery(db, "device.server_cabinet_id", cond.ServerCabinetID) + db = MultiNumQuery(db, "device.server_usite_id", cond.ServerUsiteID) + db = MultiQuery(db, "server_room.name", cond.ServerRoomName) + db = MultiQuery(db, "server_cabinet.number", cond.ServerCabinetNumber) + db = MultiQuery(db, "device.sn", cond.Sn) + db = MultiQuery(db, "device.fixed_asset_number", cond.FN) + db = MultiQuery(db, "device.category", cond.Category) + db = MultiQuery(db, "device_setting.extranet_ip", cond.ExtranetIP) + db = MultiQuery(db, "device_setting.intranet_ip", cond.IntranetIP) + if cond.HardwareTemplateID > 0 { + db = db.Where("device_setting.hardware_template_id = ?", cond.HardwareTemplateID) + } + if cond.ImageTemplateID > 0 { + db = db.Where("device_setting.image_template_id = ?", cond.ImageTemplateID) + } + if cond.Status != "" { + db = db.Where("device_setting.Status = ?", cond.Status) + } + + } + return db +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/device_setting_rule.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/device_setting_rule.go new file mode 100644 index 0000000000000000000000000000000000000000..d14a932a43255f3ce6f8d5143f31a975dc4c15b6 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/device_setting_rule.go @@ -0,0 +1,98 @@ +package mysqlrepo + +import ( + "idcos.io/cloudboot/model" + "github.com/voidint/page" + "github.com/jinzhu/gorm" +) + + + +// SaveDeviceSettingRule 保存规则记录 +func (repo *MySQLRepo) SaveDeviceSettingRule(mod *model.DeviceSettingRule) (affected int64, err error) { + if mod.ID != 0 { + return repo.UpdateDeviceSettingRule(mod) + } else { + affected, _, err = repo.AddDeviceSettingRule(mod) + } + return affected, err +} + +// AddDeviceSettingRule 增加规则记录 +func (repo *MySQLRepo) AddDeviceSettingRule(mod *model.DeviceSettingRule) (affected int64, DeviceSettingRule *model.DeviceSettingRule, err error) { + err = repo.db.Create(mod).Error + if err != nil { + return 0, nil, err + } + return 1, mod, nil +} + +// UpdateDeviceSettingRule 修改规则记录 +func (repo *MySQLRepo) UpdateDeviceSettingRule(mod *model.DeviceSettingRule) (affected int64, err error) { + err = repo.db.Model(&model.DeviceSettingRule{}).Where("id = ?", mod.ID).Update(mod).Error + if err != nil { + return 0, err + } + return 1, nil +} + +// RemoveDeviceSettingRuleByID 删除指定ID的规则记录 +func (repo *MySQLRepo) RemoveDeviceSettingRuleByID(id uint) (affected int64, err error) { + mod := model.DeviceSettingRule{Model: gorm.Model{ID: id}} + err = repo.db.Unscoped().Delete(mod).Error + if err != nil { + return 0, err + } + return 1, nil +} + +// GetDeviceSettingRulesByType 根据规则分类查询获取所有规则 +func (repo *MySQLRepo) GetDeviceSettingRulesByType(queryType string) (items []*model.DeviceSettingRule, err error) { + if err = repo.db.Model(&model.DeviceSettingRule{}).Where("rule_category = ? ", queryType).Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} + +// GetDeviceSettingRuleByID 返回指定ID的规则 +func (repo *MySQLRepo) GetDeviceSettingRuleByID(id uint) (*model.DeviceSettingRule, error) { + var DeviceSettingRule model.DeviceSettingRule + if err := repo.db.Where("id = ?", id).Find(&DeviceSettingRule).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &DeviceSettingRule, nil +} + +// CountDeviceSettingRules 统计满足过滤条件的规则数量 +func (repo *MySQLRepo) CountDeviceSettingRules(cond *model.DeviceSettingRule) (count int64, err error) { + db := repo.db.Model(&model.DeviceSettingRule{}) + if cond != nil { + db = MultiQuery(db, "rule_category", cond.RuleCategory) + } + err = db.Count(&count).Error + return count, err +} + +// GetDeviceSettingRules 返回满足过滤条件的规则 +func (repo *MySQLRepo) GetDeviceSettingRules(cond *model.DeviceSettingRule, orderby model.OrderBy, limiter *page.Limiter) (items []*model.DeviceSettingRule, err error) { + items = make([]*model.DeviceSettingRule, 0) + db := repo.db.Model(&model.DeviceSettingRule{}) + if cond != nil { + db = MultiQuery(db, "rule_category", cond.RuleCategory) + } + for i := range orderby { + db = db.Order(orderby[i].String()) + } + if limiter != nil { + db = db.Offset(limiter.Offset).Limit(limiter.Limit) + } + err = db.Find(&items).Error + if err != nil { + return nil, err + } + return items, nil +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/dhcp_token_bucket.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/dhcp_token_bucket.go new file mode 100644 index 0000000000000000000000000000000000000000..81dd2f70f9fd95cd6427a538327a0e13c40b0f47 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/dhcp_token_bucket.go @@ -0,0 +1,145 @@ +package mysqlrepo + +import ( + "github.com/jinzhu/gorm" + + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils/collection" +) + +// AddTokenBuckets 新增令牌记录 +func (repo *MySQLRepo) AddTokenBuckets(items ...*model.DHCPTokenBucket) (err error) { + tx := repo.db.Begin() + // 新增记录 + for i := range items { + if items[i] == nil { + continue + } + if err = tx.Create(items[i]).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return err + } + } + return tx.Commit().Error +} + +// OverwriteTokenBuckets 覆写令牌桶及其令牌 +func (repo *MySQLRepo) OverwriteTokenBuckets(items ...*model.DHCPTokenBucket) (err error) { + set := collection.NewSSet(1) + for i := range items { + set.Add(items[i].Bucket) + } + + if set.IsEmpty() { + return nil + } + + tx := repo.db.Begin() + // 删除所有记录 + if err = tx.Unscoped().Delete(model.DHCPTokenBucket{}, "bucket IN (?)", set.Elements()).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return err + } + + // 新增记录 + for i := range items { + if items[i] == nil { + continue + } + if err = tx.Create(items[i]).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return err + } + } + return tx.Commit().Error +} + +// BindSNByTokenBucket 绑定SN与令牌桶中令牌 +func (repo *MySQLRepo) BindSNByTokenBucket(sn, token, bucket string) (affected int64, err error) { + db := repo.db.Model(&model.DHCPTokenBucket{}).Where("token = ? AND bucket = ? AND (sn IS NULL OR sn = '')", token, bucket).Update("sn", sn) + if err = db.Error; err != nil { + repo.log.Error(err) + return 0, err + } + return db.RowsAffected, nil + +} + +// UnbindSNByTokenBucket 解绑SN与令牌桶中令牌 +func (repo *MySQLRepo) UnbindSNByTokenBucket(sn, token, bucket string) (affected int64, err error) { + db := repo.db.Model(&model.DHCPTokenBucket{}).Where("token = ? AND bucket = ? AND sn = ?", token, bucket, sn).Update("sn", nil) + if err = db.Error; err != nil { + repo.log.Error(err) + return 0, err + } + return db.RowsAffected, nil +} + +// GetTokenBuckets 返回满足过滤条件的令牌桶及其令牌 +func (repo *MySQLRepo) GetTokenBuckets(cond *model.DHCPTokenBucket) (items []*model.DHCPTokenBucket, err error) { + db := repo.db.Model(&model.DHCPTokenBucket{}) + + if cond != nil { + if cond.SN != nil { + db = db.Where("sn = ?", cond.SN) + } + if cond.Token != "" { + db = db.Where("token = ?", cond.Token) + } + if cond.Bucket != "" { + db = db.Where("bucket = ?", cond.Bucket) + } + } + + if err = db.Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} + +// GetUnbindingTokensByBucket 返回未绑定的SN的令牌列表 +func (repo *MySQLRepo) GetUnbindingTokensByBucket(bucket string) (tokens []string, err error) { + if err = repo.db.Model(&model.DHCPTokenBucket{}).Select("token").Where("sn IS NULL OR sn = ''").Pluck("token", &tokens).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return tokens, nil +} + +// GetBuckets 返回当前所有令牌桶 +func (repo *MySQLRepo) GetBuckets() (buckets []string, err error) { + if err = repo.db.Raw("SELECT DISTINCT(bucket) FROM dhcp_token_bucket").Pluck("bucket", &buckets).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return buckets, nil +} + +// GetTokenBySN 返回目标设备在令牌桶内的令牌 +func (repo *MySQLRepo) GetTokenBySN(sn string) (token string, err error) { + var row model.DHCPTokenBucket + if err = repo.db.Where("sn = ?", sn).Find(&row).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return "", err + } + return row.Token, nil +} + +// RemoveTokenBuckets 移除指定名称的令牌桶及其令牌 +func (repo *MySQLRepo) RemoveTokenBuckets(buckets ...string) (affected int64, err error) { + if len(buckets) <= 0 { + return 0, nil + } + db := repo.db.Unscoped().Delete(model.DHCPTokenBucket{}, "bucket IN (?)", buckets) + if err = db.Error; err != nil { + repo.log.Error(err) + return 0, err + } + return db.RowsAffected, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/hardware_template.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/hardware_template.go new file mode 100644 index 0000000000000000000000000000000000000000..bbdb21feb18ccc5f2b5b764362cd21f44e005692 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/hardware_template.go @@ -0,0 +1,114 @@ +package mysqlrepo + +import ( + "fmt" + + "github.com/jinzhu/gorm" + "github.com/voidint/page" + "idcos.io/cloudboot/model" +) + +// CountHardwareByCond 统计查询硬件模板数量 +func (repo *MySQLRepo) CountHardwareByCond(cond *model.HardwareTplCond) (count int64, err error) { + db := repo.db.Model(model.HardwareTemplate{}) + if cond.Name != "" { + db = db.Where("name LIKE ?", fmt.Sprintf("%%%s%%", cond.Name)) + } + if cond.Builtin != "" { + db = db.Where("builtin = ?", cond.Builtin) + } + if cond.Vendor != "" { + db = db.Where("vendor LIKE ?", fmt.Sprintf("%%%s%%", cond.Vendor)) + } + if cond.ModelName != "" { + db = db.Where("model LIKE ?", fmt.Sprintf("%%%s%%", cond.ModelName)) + } + + if err = db.Select("id").Count(&count).Error; err != nil { + repo.log.Error(err) + return 0, err + } + return count, nil +} + +// GetHardwaresByCond 分页查询硬件模板 +func (repo *MySQLRepo) GetHardwaresByCond(cond *model.HardwareTplCond, limiter *page.Limiter) (items []*model.HardwareTemplate, err error) { + db := repo.db.Model(model.HardwareTemplate{}) + if cond.Name != "" { + db = db.Where("name LIKE ?", fmt.Sprintf("%%%s%%", cond.Name)) + } + if cond.Builtin != "" { + db = db.Where("builtin = ?", cond.Builtin) + } + if cond.Vendor != "" { + db = db.Where("vendor LIKE ?", fmt.Sprintf("%%%s%%", cond.Vendor)) + } + if cond.ModelName != "" { + db = db.Where("model LIKE ?", fmt.Sprintf("%%%s%%", cond.ModelName)) + } + + if limiter != nil { + db = db.Limit(limiter.Limit).Offset(limiter.Offset) + } + + if err = db.Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} + +// GetHardwareTemplateByName 返回指定名称的镜像安装模板 +func (repo *MySQLRepo) GetHardwareTemplateByName(name string) (*model.HardwareTemplate, error) { + var tpl model.HardwareTemplate + if err := repo.db.Where("name = ?", name).Find(&tpl).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &tpl, nil +} + +//RemoveHardwareTemplateByID 删除硬件模板配置 +func (repo *MySQLRepo) RemoveHardwareTemplateByID(id uint) (affected int64, err error) { + mod := model.HardwareTemplate{Model: gorm.Model{ID: id}} + db := repo.db.Unscoped().Delete(mod) + if err = db.Error; err != nil { + repo.log.Error(err) + return db.RowsAffected, err + } + return db.RowsAffected, nil +} + +// GetHardwareTemplateByID 返回指定ID的镜像安装模板 +func (repo *MySQLRepo) GetHardwareTemplateByID(id uint) (*model.HardwareTemplate, error) { + var tpl model.HardwareTemplate + if err := repo.db.Where("id = ?", id).Find(&tpl).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &tpl, nil +} + +// SaveHardwareTemplate 保存、修改硬件模板 +func (repo *MySQLRepo) SaveHardwareTemplate(na *model.HardwareTemplate) (id uint, err error) { + if na.ID > 0 { + // 更新 + db := repo.db.Model(&model.HardwareTemplate{}).Where("id = ?", na.ID).Updates(na) + if err = db.Error; err != nil { + repo.log.Error(err) + return na.ID, err + } + return na.ID, nil + } + // 新增 + db := repo.db.Create(na) + if err = db.Error; err != nil { + repo.log.Error(err) + return 0, err + } + return na.ID, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/idc.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/idc.go new file mode 100644 index 0000000000000000000000000000000000000000..1fa2f6cd85e17d2dea7bb047b7f9a27844b12883 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/idc.go @@ -0,0 +1,125 @@ +package mysqlrepo + +import ( + "github.com/voidint/page" + + "fmt" + + "github.com/jinzhu/gorm" + "idcos.io/cloudboot/model" +) + +// RemoveIDCByID 删除指定ID的数据中心 +func (repo *MySQLRepo) RemoveIDCByID(id uint) (affected int64, err error) { + mod := model.IDC{Model: gorm.Model{ID: id}} + err = repo.db.Unscoped().Delete(mod).Error + if err != nil { + return 0, err + } + return 1, nil +} + +// SaveIDC 保存数据中心 +func (repo *MySQLRepo) SaveIDC(*model.IDC) (affected int64, err error) { + // TODO 待实现 + return 0, nil +} + +// AddIDC 增加数据中心 +func (repo *MySQLRepo) AddIDC(mod *model.IDC) (affected int64, idc *model.IDC, err error) { + err = repo.db.Create(mod).Error + if err != nil { + return 0, nil, err + } + return 1, mod, nil +} + +// UpdateIDC 修改数据中心 +func (repo *MySQLRepo) UpdateIDC(mod *model.IDC) (affected int64, err error) { + err = repo.db.Model(&model.IDC{}).Where("id = ?", mod.ID).Update(mod).Error + if err != nil { + return 0, err + } + return 1, nil +} + +// UpdateIDCStatus 批量更新数据中心状态 +func (repo *MySQLRepo) UpdateIDCStatus(status string, ids ...uint) (affected int64, err error) { + tx := repo.db.Begin() + for _, id := range ids { + err = tx.Model(&model.IDC{}).Where("id = ?", id).Update("status", status).Error + if err != nil { + tx.Rollback() + return 0, err + } + affected++ + } + tx.Commit() + return +} + +// GetIDCByName 返回指定Name的数据中心 +func (repo *MySQLRepo) GetIDCByName(name string) (*model.IDC, error) { + var idc model.IDC + if err := repo.db.Where("name = ?", name).Find(&idc).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &idc, nil +} + +// GetIDCByID 返回指定ID的数据中心 +func (repo *MySQLRepo) GetIDCByID(id uint) (*model.IDC, error) { + var idc model.IDC + if err := repo.db.Where("id = ?", id).Find(&idc).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &idc, nil +} + +// CountIDCs 统计满足过滤条件的数据中心数量 +func (repo *MySQLRepo) CountIDCs(cond *model.IDC) (count int64, err error) { + db := repo.db.Model(&model.IDC{}) + if cond != nil { + db = MultiQuery(db, "name", cond.Name) + db = MultiQuery(db, "usage", cond.Usage) + if cond.FirstServerRoom != "" { + db = db.Where("first_server_room LIKE ?", fmt.Sprintf("%%%s%%", cond.FirstServerRoom)) + } + db = MultiQuery(db, "first_server_room", cond.FirstServerRoom) + db = MultiEnumQuery(db, "status", cond.Status) + db = MultiEnumQuery(db, "vendor", cond.Vendor) + } + err = db.Count(&count).Error + return count, err +} + +// GetIDCs 返回满足过滤条件的数据中心 +func (repo *MySQLRepo) GetIDCs(cond *model.IDC, orderby model.OrderBy, limiter *page.Limiter) (items []*model.IDC, err error) { + items = make([]*model.IDC, 0) + db := repo.db.Model(&model.IDC{}) + if cond != nil { + db = MultiQuery(db, "name", cond.Name) + db = MultiEnumQuery(db, "usage", cond.Usage) + //if cond.FirstServerRoom != "" { + // db = db.Where("first_server_room LIKE ?", fmt.Sprintf("%%%s%%", cond.FirstServerRoom)) + //} + db = MultiQuery(db, "first_server_room", cond.FirstServerRoom) + db = MultiEnumQuery(db, "status", cond.Status) + db = MultiQuery(db, "vendor", cond.Vendor) + } + for i := range orderby { + db = db.Order(orderby[i].String()) + } + db = db.Offset(limiter.Offset).Limit(limiter.Limit) + err = db.Find(&items).Error + if err != nil { + return nil, err + } + return items, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/image_template.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/image_template.go new file mode 100644 index 0000000000000000000000000000000000000000..c16fc9ebf9a9404098b217503a0ccd779f48832e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/image_template.go @@ -0,0 +1,179 @@ +package mysqlrepo + +import ( + "github.com/jinzhu/gorm" + "github.com/voidint/page" + "idcos.io/cloudboot/model" + mystrings "idcos.io/cloudboot/utils/strings" +) + +// RemoveImageTemplate 删除指定ID的镜像安装模板 +func (repo *MySQLRepo) RemoveImageTemplate(id uint) (affected int64, err error) { + db := repo.db.Unscoped().Where("id = ?", id).Delete(&model.ImageTemplate{}) + if err = db.Error; err != nil { + repo.log.Error(err) + } + return db.RowsAffected, db.Error +} + +// SaveImageTemplate 新增镜像安装模板 +func (repo *MySQLRepo) SaveImageTemplate(tpl *model.ImageTemplate) (id uint, err error) { + // 若ID为0,则新增。 + if tpl.ID == 0 { + if err = repo.db.Create(tpl).Error; err != nil { + repo.log.Error(err) + return 0, err + } + return 1, nil + } + // 若ID大于0,则更新。 + db := repo.db.Model(&model.ImageTemplate{}).Where("id = ?", tpl.ID).Updates(map[string]interface{}{ + "family": tpl.Family, + "name": tpl.Name, + "boot_mode": tpl.BootMode, + "username": tpl.Username, + "password": tpl.Password, + "image_url": tpl.ImageURL, + "partition": tpl.Partition, + "post_script": tpl.PostScript, + "pre_script": tpl.PreScript, + "os_lifecycle": tpl.OSLifecycle, + "arch": tpl.Arch, + }) + if err = db.Error; err != nil { + repo.log.Error(err) + } + return tpl.ID, db.Error +} + +// GetImageTemplateByID 返回指定id的镜像安装模板 +func (repo *MySQLRepo) GetImageTemplateByID(id uint) (*model.ImageTemplate, error) { + var tpl model.ImageTemplate + if err := repo.db.Where("id = ?", id).Find(&tpl).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &tpl, nil +} + +// CountImageTemplates 统计满足过滤条件的镜像安装模板数量 +func (repo *MySQLRepo) CountImageTemplates(cond *model.ImageTemplate) (count int64, err error) { + db := repo.db.Model(&model.ImageTemplate{}) + if cond != nil { + if cond.Family != "" { + db = db.Where("family = ?", cond.Family) + } + if cond.Name != "" { + db = db.Where("name LIKE ?", "%"+cond.Name+"%") + } + if cond.BootMode == model.BootModeBIOS || cond.BootMode == model.BootModeUEFI { + db = db.Where("boot_mode = ?", cond.BootMode) + } + if cond.OSLifecycle != "" { + db = db.Where("os_lifecycle IN (?)", mystrings.MultiLines2Slice(cond.OSLifecycle)) + } + if cond.Arch != "" { + db = db.Where("arch = ?", cond.Arch) + } + } + + if err = db.Select("id").Count(&count).Error; err != nil { + repo.log.Error(err) + return count, err + } + return count, nil +} + +// GetImageTemplates 返回满足过滤条件的镜像安装模板 +func (repo *MySQLRepo) GetImageTemplates(cond *model.ImageTemplate, orderby model.OrderBy, limiter *page.Limiter) (items []*model.ImageTemplate, err error) { + db := repo.db.Model(&model.ImageTemplate{}) + if cond != nil { + if cond.Family != "" { + db = db.Where("family = ?", cond.Family) + } + if cond.Name != "" { + db = db.Where("name LIKE ?", "%"+cond.Name+"%") + } + if cond.BootMode != "" { + db = db.Where("boot_mode = ?", cond.BootMode) + } + if cond.OSLifecycle != "" { + db = db.Where("os_lifecycle IN (?)", mystrings.MultiLines2Slice(cond.OSLifecycle)) + } + if cond.Arch != "" { + db = db.Where("arch = ?", cond.Arch) + } + } + + for i := range orderby { + db = db.Order(orderby[i].String()) + } + if limiter != nil { + db = db.Limit(limiter.Limit).Offset(limiter.Offset) + } + + if err = db.Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} + +// CountImageTemplateByName 统计指定名称的镜像模板 +func (repo *MySQLRepo) CountImageTemplateByName(name string) (uint, error) { + mod := model.ImageTemplate{Name: name} + var count uint + err := repo.db.Model(mod).Where("name = ?", name).Count(&count).Error + return count, err +} + +// CountImageTemplateByNameAndID 统计指定名称和ID的镜像模板 +func (repo *MySQLRepo) CountImageTemplateByNameAndID(name string, id uint) (uint, error) { + mod := model.ImageTemplate{} + var count uint + err := repo.db.Model(mod).Where("name = ? and id != ?", name, id).Count(&count).Error + return count, err +} + +// CountImageTemplate 统计镜像模板 +func (repo *MySQLRepo) CountImageTemplate() (uint, error) { + mod := model.ImageTemplate{} + var count uint + err := repo.db.Model(mod).Count(&count).Error + return count, err +} + +// GetImageTemplateListWithPage 分页查询镜像模板 +func (repo *MySQLRepo) GetImageTemplateListWithPage(limit uint, offset uint) ([]model.ImageTemplate, error) { + var mods []model.ImageTemplate + err := repo.db.Limit(limit).Offset(offset).Find(&mods).Error + return mods, err +} + +// GetImageTemplateByName 查询指定名称的镜像模板 +func (repo *MySQLRepo) GetImageTemplateByName(name string) (*model.ImageTemplate, error) { + var mod model.ImageTemplate + err := repo.db.Where("name = ?", name).Find(&mod).Error + return &mod, err +} + +// GetImageTemplateIDByName 查询指定模板名称的镜像模板ID +func (repo *MySQLRepo) GetImageTemplateIDByName(name string) (uint, error) { + mod := model.ImageTemplate{Name: name} + err := repo.db.Where("name = ?", name).Find(&mod).Error + return mod.ID, err +} + +// GetImageTemplateBySN 查询指定SN的镜像模板 +func (repo *MySQLRepo) GetImageTemplateBySN(sn string) (*model.ImageTemplate, error) { + var mod model.ImageTemplate + if err := repo.db.Joins("inner join device_setting on device_setting.image_template_id = image_template.id").Where("device_setting.sn = ?", sn).Find(&mod).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &mod, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/inspection.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/inspection.go new file mode 100644 index 0000000000000000000000000000000000000000..16375204f6bea4c08f3794dbcc7158b66e4f3119 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/inspection.go @@ -0,0 +1,492 @@ +package mysqlrepo + +import ( + "fmt" + "strings" + "time" + + "github.com/jinzhu/gorm" + "github.com/voidint/page" + + "idcos.io/cloudboot/model" + mystrings "idcos.io/cloudboot/utils/strings" +) + +const dateLayout = "2006-01-02" + +// GetInspections 查询满足过滤条件的硬件巡检列表 +func (repo *MySQLRepo) GetInspections(cond *model.Inspection, orderby model.OrderBy, limiter *page.Limiter) (items []*model.Inspection, err error) { + db := repo.db.Model(&model.Inspection{}) + if cond != nil { + if cond.JobID != "" { + db = db.Where("job_id = ?", cond.JobID) + } + if cond.StartTime != nil { + db = db. + Where("start_time >= ?", fmt.Sprintf("%s 00:00:00", cond.StartTime.Format(dateLayout))). + Where("start_time <= ?", fmt.Sprintf("%s 23:59:59", cond.StartTime.Format(dateLayout))) + } + if cond.OriginNode != "" { + db = db.Where("origin_node = ?", cond.OriginNode) + } + if cond.SN != "" { + db = db.Where("sn IN (?)", strings.Split(cond.SN, ",")) + } + if cond.RunningStatus != "" { + db = db.Where("running_status = ?", cond.RunningStatus) + } + if cond.HealthStatus != "" { + db = db.Where("health_status = ?", cond.HealthStatus) + } + } + + for i := range orderby { + db = db.Order(orderby[i].String()) + } + if limiter != nil { + db = db.Limit(limiter.Limit).Offset(limiter.Offset) + } + + if err = db.Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} + +// GetInspectionStatistics 查询满足过滤条件的硬件巡检列表用于健康状态统计 +func (repo *MySQLRepo) GetInspectionStatistics(cond *model.Inspection, orderby model.OrderBy, limiter *page.Limiter) (items []*model.InspectionStatistics, err error) { + db := repo.db.Model(&model.Inspection{}) + if cond != nil { + if cond.JobID != "" { + db = db.Where("job_id = ?", cond.JobID) + } + if cond.StartTime != nil { + db = db. + Where("start_time >= ?", fmt.Sprintf("%s 00:00:00", cond.StartTime.Format(dateLayout))). + Where("start_time <= ?", fmt.Sprintf("%s 23:59:59", cond.StartTime.Format(dateLayout))) + } + if cond.OriginNode != "" { + db = db.Where("origin_node = ?", cond.OriginNode) + } + if cond.SN != "" { + db = db.Where("sn IN (?)", strings.Split(cond.SN, ",")) + } + if cond.RunningStatus != "" { + db = db.Where("running_status = ?", cond.RunningStatus) + } + if cond.HealthStatus != "" { + db = db.Where("health_status = ?", cond.HealthStatus) + } + } + + for i := range orderby { + db = db.Order(orderby[i].String()) + } + if limiter != nil { + db = db.Limit(limiter.Limit).Offset(limiter.Offset) + } + + if err = db.Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} + + +// GetInspectionStatisticsGroupBySN 查询满足过滤条件的硬件巡检列表用于健康状态统计(SN分组返回最新) +func (repo *MySQLRepo) GetInspectionStatisticsGroupBySN(cond *model.Inspection, orderby model.OrderBy, limiter *page.Limiter) (items []*model.InspectionStatistics, err error) { + db := repo.db.Table("inspection") + if cond != nil { + if cond.StartTime != nil && cond.RunningStatus != "" { + db = db. + Where("start_time >= ?", fmt.Sprintf("%s 00:00:00", cond.StartTime.Format(dateLayout))). + Where("start_time <= ?", fmt.Sprintf("%s 23:59:59", cond.StartTime.Format(dateLayout))). + Where("running_status = ?", cond.RunningStatus) + // string=(SELECT MAX(id) as id,sn FROM `inspection` WHERE (start_time >= ?) AND (start_time <= ?) AND (running_status = ?) GROUP BY sn) + // 通过GROUP BY + MAX(ID) 的子查询方式直接获取各SN最新的巡检结果 + subQuery := db.Select("MAX(id) as id,sn").Group("sn").SubQuery() + db = db.Select("inspection.id, inspection.start_time, inspection.end_time, inspection.sn, inspection.running_status, inspection.health_status"). + Joins("inner join ? as latest_inspection on inspection.id = latest_inspection.id", subQuery) + } + } + + for i := range orderby { + db = db.Order(orderby[i].String()) + } + if limiter != nil { + db = db.Limit(limiter.Limit).Offset(limiter.Offset) + } + + if err = db.Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} + + +// AddInspections 批量新增硬件巡检记录 +func (repo *MySQLRepo) AddInspections(items ...*model.Inspection) (err error) { + tx := repo.db.Begin() + for i := range items { + if err = tx.Create(items[i]).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return err + } + } + return tx.Commit().Error +} + +// UpdateInspectionByID 根据ID更新硬件巡检记录 +func (repo *MySQLRepo) UpdateInspectionByID(one *model.Inspection) (affected int64, err error) { + db := repo.db.Model(&model.Inspection{}).Where("id = ?", one.ID).Updates(one) + if err = db.Error; err != nil { + repo.log.Error(err) + } + return db.RowsAffected, db.Error +} + +// GetInspectedSN 查询已经执行过硬件巡检的设备SN列表 +func (repo *MySQLRepo) GetInspectedSN() (items []string, err error) { + if err = repo.db.Raw("SELECT DISTINCT(sn) FROM inspection WHERE deleted_at IS NULL").Pluck("sn", &items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} + +//GetInspectionStartTimeBySN 根据设备SN获取巡检开始时间 +func (repo *MySQLRepo) GetInspectionStartTimeBySN(SN, runStatus string) (starts []time.Time, err error) { + sql := fmt.Sprintf("select distinct(start_time) from inspection where sn='%s'", + SN) + if runStatus != "" { + sql += fmt.Sprintf(" and inspection.running_status = '%s'", runStatus) + } + sql += " and deleted_at is null order by start_time desc" + + var mods []struct { + StartTime time.Time `gorn:"column:start_time"` + } + err = repo.db.Raw(sql).Scan(&mods).Error + if len(mods) == 0 { + return nil, gorm.ErrRecordNotFound + } + for _, mod := range mods { + starts = append(starts, mod.StartTime) + } + return +} + +//GetInspectionDetail 获取巡检详情 +func (repo *MySQLRepo) GetInspectionDetail(SN, startTime string) (i *model.Inspection, err error) { + i = new(model.Inspection) + db := repo.db.Model(model.Inspection{}).Order("start_time DESC").Where("sn = ?", SN) + if startTime != "" { + db = db.Where("start_time = ?", startTime) + err = db.Find(i).Error + } else { + err = db.First(i).Error + } + return +} + +// CountInspectionRecordsPage 获取巡检记录条数 +func (repo *MySQLRepo) CountInspectionRecordsPage(cond *model.InspectionCond) (count int64, err error) { + + db := repo.db.Model(&model.Inspection{}).Order("start_time DESC").Where("running_status = ?", "done") + + var whereSQL strings.Builder + if cond != nil { + if cond.SN != "" { + sns := strings.Split(cond.SN, ",") + for i := range sns { + sns[i] = fmt.Sprintf("'%s'", sns[i]) + } + whereSQL.WriteString(fmt.Sprintf(" sn IN(%s)", strings.Join(sns, ","))) + db = db.Where(whereSQL.String()) + } + if cond.StartTime != "" { + whereSQL.WriteString(fmt.Sprintf(" start_time > '%s'", cond.StartTime)) + db = db.Where(whereSQL.String()) + } + if cond.EndTime != "" { + whereSQL.WriteString(fmt.Sprintf(" end_time < '%s'", cond.EndTime)) + db = db.Where(whereSQL.String()) + } + // enum('nominal','warning','critical','unknown') + if cond.HealthStatus != "" { + whereSQL.WriteString(fmt.Sprintf(" health_status = '%s'", cond.HealthStatus)) + db = db.Where(whereSQL.String()) + } + } + + // 返回结果 + if err = db.Count(&count).Error; err != nil { + repo.log.Error(err) + return 0, err + } + return count, nil +} + +// GetInspectionPage 获取巡检记录分页 +func (repo *MySQLRepo) GetInspectionRecordsPage(cond *model.InspectionCond, limiter *page.Limiter) (items []*model.InspectionRecordsPage, err error) { + + db := repo.db.Model(&model.Inspection{}).Order("start_time DESC").Where("running_status = ?", "done") + + var whereSQL strings.Builder + if cond != nil { + if cond.SN != "" { + sns := strings.Split(cond.SN, ",") + for i := range sns { + sns[i] = fmt.Sprintf("'%s'", sns[i]) + } + whereSQL.WriteString(fmt.Sprintf(" sn IN(%s)", strings.Join(sns, ","))) + db = db.Where(whereSQL.String()) + } + if cond.StartTime != "" { + whereSQL.WriteString(fmt.Sprintf(" start_time > '%s'", cond.StartTime)) + db = db.Where(whereSQL.String()) + } + if cond.EndTime != "" { + whereSQL.WriteString(fmt.Sprintf(" end_time < '%s'", cond.EndTime)) + db = db.Where(whereSQL.String()) + } + // enum('running','done') + //if cond.RuningStatus != "" { + // whereSQL.WriteString(fmt.Sprintf(" AND t10.running_status = '%s'", cond.RuningStatus)) + //} + // enum('nominal','warning','critical','unknown') + if cond.HealthStatus != "" { + whereSQL.WriteString(fmt.Sprintf(" health_status = '%s'", cond.HealthStatus)) + db = db.Where(whereSQL.String()) + } + } + + // 分页 + if limiter != nil { + db = db.Limit(limiter.Limit).Offset(limiter.Offset) + } + // 返回结果 + if err = db.Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} + +//GetInspectionListWithPageNew 分页获取硬件巡检结果,每个SN获取最新的一个 +func (repo *MySQLRepo) GetInspectionListWithPageNew(cond *model.InspectionCond, limiter *page.Limiter) (result []model.InspectionFullWithPage, err error) { + //获取硬件巡检中的所有sn(单一) + //var sn []string + //var id []uint64 + //err = repo.db.Raw(fmt.Sprintf("select distinct sn from inspection where sn != \"\"")).Pluck("sn", &sn).Error + //if err != nil { + // return nil, err + //} + + ////获取排序后的结果 + //var mod []model.InspectionTemp + //err = repo.db.Select([]string{"id", "sn"}).Order("start_time desc").Find(&mod).Error + //if err != nil { + // return nil, err + //} + + //for _, vsn := range sn { + // for _, vm := range mod { + // if vsn == vm.SN { + // id = append(id, vm.ID) + // break + // } + // } + //} + + //var sql = `select t10.sn as sn, + // t10.start_time, t10.end_time, + // t10.id, t10.running_status, + // t10.error, t10.ipmi_result, + // t10.health_status, + // t10.created_at, t10.updated_at + // from device t5 inner join inspection t10 on t5.sn = t10.sn + // where t10.id > 0 %s order by t10.end_time desc %s` + + var sql = `select t5.fixed_asset_number, + t10.sn as sn, + t20.intranet_ip, + t10.start_time, + t10.end_time, + t10.id, + t10.running_status, + t10.error, + t10.ipmi_result, + t10.health_status + from (select max(id) as id,sn from inspection group by sn) as t15 inner join inspection t10 on t15.id = t10.id + inner join device t5 on t5.sn = t10.sn left join device_setting t20 on t5.sn = t20.sn + where t10.id > 0 %s %s` + + var whereSQL strings.Builder + + //if id != nil { + // var ids []string + // for i := range id { + // ids = append(ids, fmt.Sprintf("'%d'", id[i])) + // } + // whereSQL.WriteString(fmt.Sprintf(" AND t10.id IN(%s)", strings.Join(ids, ","))) + //} + + if cond != nil { + if cond.SN != "" { + sns := mystrings.MultiLines2Slice(cond.SN) + for i := range sns { + sns[i] = fmt.Sprintf("'%s'", sns[i]) + } + whereSQL.WriteString(fmt.Sprintf(" AND t5.sn IN(%s)", strings.Join(sns, ","))) + } + if cond.FixedAssetNumber != "" { + fns := mystrings.MultiLines2Slice(cond.FixedAssetNumber) + for i := range fns { + fns[i] = fmt.Sprintf("'%s'", fns[i]) + } + whereSQL.WriteString(fmt.Sprintf(" AND t5.fixed_asset_number IN(%s)", strings.Join(fns, ","))) + } + if cond.IntranetIP != "" { + inips := mystrings.MultiLines2Slice(cond.IntranetIP) + for i := range inips { + inips[i] = fmt.Sprintf("'%s'", inips[i]) + } + whereSQL.WriteString(fmt.Sprintf(" AND t20.intranet_ip IN(%s)", strings.Join(inips, ","))) + } + if cond.StartTime != "" { + whereSQL.WriteString(fmt.Sprintf(" AND t10.start_time > '%s'", cond.StartTime)) + } + if cond.EndTime != "" { + whereSQL.WriteString(fmt.Sprintf(" AND t10.end_time < '%s'", cond.EndTime)) + } + // if cond.OOBIP != "" { + // whereSQL.WriteString(fmt.Sprintf(" AND t6.manage_ip = '%s'", cond.OOBIP)) + // } + if cond.RuningStatus != "" { + whereSQL.WriteString(fmt.Sprintf(" AND t10.running_status = '%s'", cond.RuningStatus)) + } + if cond.HealthStatus != "" { + whereSQL.WriteString(fmt.Sprintf(" AND t10.health_status = '%s'", cond.HealthStatus)) + } + } + + var limitSQL string + if limiter != nil { + limitSQL = fmt.Sprintf(" LIMIT %d,%d ", limiter.Offset, limiter.Limit) + } + //repo.log.Info(fmt.Sprintf(sql, whereSQL.String(), limitSQL)) + if err := repo.db.Raw(fmt.Sprintf(sql, whereSQL.String(), limitSQL)).Scan(&result).Error; err != nil { + repo.log.Error(err) + return nil, err + } + + return result, nil +} + +//CountInspctionsByCond 根据条件统计 +func (repo *MySQLRepo) CountInspctionsByCond(cond *model.InspectionCond) (count int64, err error) { + + //var sn []string + //var id []uint64 + //err = repo.db.Raw(fmt.Sprintf("select distinct sn from inspection where sn != \"\"")).Pluck("sn", &sn).Error + //if err != nil { + // return 0, err + //} +// + ////获取排序后的结果 + //var mod []model.InspectionTemp + //err = repo.db.Select([]string{"id", "sn"}).Order("start_time desc").Find(&mod).Error + //if err != nil { + // return 0, err + //} +// + //for _, vsn := range sn { + // for _, vm := range mod { + // if vsn == vm.SN { + // id = append(id, vm.ID) + // break + // } + // } + //} +// + //var sql = `select count(t10.sn) as count from device t5 inner join inspection t10 on t5.sn = t10.sn + //where t10.id > 0 %s` + + var sql=`select count(t10.sn) as count from + (select max(id) as id,sn from inspection group by sn) as t15 inner join inspection t10 on t15.id = t10.id + inner join device t5 on t5.sn = t10.sn + left join device_setting t20 on t5.sn = t20.sn + where t10.id > 0 %s` + + var whereSQL strings.Builder + + //if id != nil { + // var ids []string + // for i := range id { + // ids = append(ids, fmt.Sprintf("'%d'", id[i])) + // } + // whereSQL.WriteString(fmt.Sprintf(" AND t10.id IN(%s)", strings.Join(ids, ","))) + //} + + if cond != nil { + if cond.SN != "" { + sns := mystrings.MultiLines2Slice(cond.SN) + for i := range sns { + sns[i] = fmt.Sprintf("'%s'", sns[i]) + } + whereSQL.WriteString(fmt.Sprintf(" AND t5.sn IN(%s)", strings.Join(sns, ","))) + } + if cond.FixedAssetNumber != "" { + fns := mystrings.MultiLines2Slice(cond.FixedAssetNumber) + for i := range fns { + fns[i] = fmt.Sprintf("'%s'", fns[i]) + } + whereSQL.WriteString(fmt.Sprintf(" AND t5.fixed_asset_number IN(%s)", strings.Join(fns, ","))) + } + if cond.IntranetIP != "" { + inips := mystrings.MultiLines2Slice(cond.IntranetIP) + for i := range inips { + inips[i] = fmt.Sprintf("'%s'", inips[i]) + } + whereSQL.WriteString(fmt.Sprintf(" AND t20.intranet_ip IN(%s)", strings.Join(inips, ","))) + } + if cond.StartTime != "" { + whereSQL.WriteString(fmt.Sprintf(" AND t10.start_time > '%s'", cond.StartTime)) + } + if cond.EndTime != "" { + whereSQL.WriteString(fmt.Sprintf(" AND t10.end_time < '%s'", cond.EndTime)) + } + // if cond.OOBIP != "" { + // whereSQL.WriteString(fmt.Sprintf(" AND t6.manage_ip = '%s'", cond.OOBIP)) + // } + if cond.RuningStatus != "" { + whereSQL.WriteString(fmt.Sprintf(" AND t10.running_status = '%s'", cond.RuningStatus)) + } + if cond.HealthStatus != "" { + whereSQL.WriteString(fmt.Sprintf(" AND t10.health_status = '%s'", cond.HealthStatus)) + } + } + //repo.log.Info(fmt.Sprintf(sql, whereSQL.String())) + if err = repo.db.DB().QueryRow(fmt.Sprintf(sql, whereSQL.String())).Scan(&count); err != nil { + repo.log.Error(err) + return 0, err + } + return count, nil +} + +//RemoveInspectionOnStartTimeBySN 根据设备SN删除巡检记录,按时间排序保留14条记录 +func (repo *MySQLRepo) RemoveInspectionOnStartTimeBySN(SN string) (err error) { + sql := fmt.Sprintf("delete from inspection where sn='%s' and id not in (select t.id from (select id from inspection where sn='%s' order by start_time desc limit 14) as t)", + SN, SN) + //repo.log.Info(sql) + if err := repo.db.Exec(sql).Error; err != nil { + repo.log.Error(err) + return err + } + return nil +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/ip.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/ip.go new file mode 100644 index 0000000000000000000000000000000000000000..ff0e22e94a17f9f8116e63a701165aceab63ba12 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/ip.go @@ -0,0 +1,597 @@ +package mysqlrepo + +import ( + "github.com/jinzhu/gorm" + "github.com/voidint/page" + + "bytes" + "fmt" + "time" + strings2 "strings" + "errors" + + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils/ping" + "idcos.io/cloudboot/utils/strings" + "idcos.io/cloudboot/utils/network" +) + +// AssignIntranetIP 按照内置规则给设备分配一个内网业务IP +func (repo *MySQLRepo) AssignIntranetIP(sn string) (*model.IP, error) { + // 1、若设备已存在关联的内网业务IP,则直接返回该IP。 + var intraIP model.IP + err := repo.db.Model(&model.IP{}).Where("sn = ? AND scope = ? AND category = ? ", sn, model.IPScopeIntranet, model.BusinessIP).First(&intraIP).Error + if err != nil && !gorm.IsRecordNotFoundError(err) { + repo.log.Error(err) + return nil, err + } + if intraIP.ID > 0 && intraIP.IP != "" { + return &intraIP, nil + } + + // 2、获取待分配IP所属内网网段 + var intranetid uint + intranet, err := repo.GetIntranetIPNetworksBySN(sn) + if err != nil || len(intranet) == 0 { + repo.log.Errorf("intranet segment not find by sn:%s", sn) + return nil, err + } + + // 3、尝试释放设备已占用的内网业务IP(可选) + _, _ = repo.ReleaseIP(sn, model.IPScopeIntranet) + + lenintranet := len(intranet) - 1 + isPrint := false + tx0 := repo.db.Begin() + for k := range intranet { //多数情况这里只有一个网段 + if intranet[k].Category == model.VIntranet || intranet[k].Category == model.VExtranet || intranet[k].Category == model.ILO { + continue + } + if lenintranet == k { + isPrint = true + } + + intranetid = intranet[k].ID + + //需要加ping检测 + ips := make([]*model.IP, 0) + // 4、从目标内网IP网段中选择一个空闲业务IP并加排它锁 + if err = tx0.Model(&model.IP{}).Where("ip_network_id = ? AND category = ? AND is_used = ?", + intranetid, model.BusinessIP, model.IPNotUsed).Order("id ASC"). + Set("gorm:query_option", "FOR UPDATE").Find(&ips).Error; err != nil { + tx0.Rollback() + if isPrint { + repo.log.Error(err) + return nil, err + } + continue + } + + // 5、将目标业务IP与设备进行关联并释放排它锁 + for _, ip := range ips { + if ping.PingTest(ip.IP) == nil { + repo.log.Errorf("ping ip: %s ok, skip this one", ip.IP) + continue + } + if err = tx0.Model(&model.IP{}).Where("id = ?", ip.ID).Updates(map[string]interface{}{ + "is_used": model.IPUsed, + "sn": sn, + //"scope": model.IPScopeIntranet, + }).Error; err != nil { + tx0.Rollback() + if isPrint { + repo.log.Error(err) + return nil, err + } + continue + } + return ip, tx0.Commit().Error //这里找到就return + } + } + tx0.Commit() + return nil, errors.New("未找到匹配IP") +} + +// AssignExtranetIP 按照内置规则给设备分配一个外网业务IP +func (repo *MySQLRepo) AssignExtranetIP(sn string) (*model.IP, error) { + // 1、若设备已存在关联的外网业务IP,则直接返回该IP。 + var extraIP model.IP + err := repo.db.Model(&model.IP{}).Where("sn = ? AND scope = ? AND category = ? ", sn, model.IPScopeExtranet, model.BusinessIP).First(&extraIP).Error + if err != nil && !gorm.IsRecordNotFoundError(err) { + repo.log.Error(err) + return nil, err + } + if extraIP.ID > 0 && extraIP.IP != "" { + return &extraIP, nil + } + + // 2、获取待分配IP所属外网网段 + var extranetid uint + extranet, err := repo.GetExtranetIPNetworksBySN(sn) + if err != nil || len(extranet) == 0 { + repo.log.Errorf("extranet segment not find by sn:%s", sn) + return nil, err + } + + // 3、尝试释放设备已占用的外网业务IP(可选) + _, _ = repo.ReleaseIP(sn, model.IPScopeExtranet) + + lenextranet := len(extranet) - 1 + isPrint := false + tx0 := repo.db.Begin() + for k := range extranet { + if extranet[k].Category == model.VIntranet || extranet[k].Category == model.VExtranet || extranet[k].Category == model.ILO { + continue + } + if lenextranet == k { + isPrint = true + } + extranetid = extranet[k].ID + + ips := make([]*model.IP, 0) + // 4、从目标外网IP网段中选择一个空闲业务IP并加排它锁 + if err = tx0.Model(&model.IP{}).Where("ip_network_id = ? AND category = ? AND is_used = ?", + extranetid, model.BusinessIP, model.IPNotUsed).Order("id ASC"). + Set("gorm:query_option", "FOR UPDATE").Find(&ips).Error; err != nil { + tx0.Rollback() + if isPrint { + repo.log.Error(err) + return nil, err + } + continue + } + + // 5、将目标业务IP与设备进行关联并释放排它锁 + for _, ip := range ips { + if ping.PingTest(ip.IP) == nil { + repo.log.Errorf("ping ip:%s ok, skip this one") + continue + } + if err = tx0.Model(&model.IP{}).Where("id = ?", ip.ID). + Updates(map[string]interface{}{ + "is_used": model.IPUsed, + "sn": sn, + //"scope": model.IPScopeExtranet, + }).Error; err != nil { + tx0.Rollback() + if isPrint { + repo.log.Error(err) + return nil, err + } + continue + } + return ip, tx0.Commit().Error //这里找到就return + } + } + return &extraIP, tx0.Commit().Error +} + +// ReleaseIP 为目标设备释放内/外网业务IP,有多个IP是一并清空 +func (repo *MySQLRepo) ReleaseIP(sn string, scope string) (affected int64, err error) { + db := repo.db.Model(&model.IP{}).Where("sn = ? AND scope = ? AND category = ?", sn, scope, model.BusinessIP).Updates(map[string]interface{}{ + "is_used": model.NO, + "sn": "", + //"scope": nil, + }) + + if err = db.Error; err != nil { + repo.log.Error(err) + return 0, err + } + + //同步清理设备参数表的记录 + if scope == model.IPScopeExtranet { + repo.db.Model(&model.DeviceSetting{}).Where("sn = ?", sn). + Update("need_extranet_ip", model.NO). + Update("extranet_ip_network_id", 0). + Update("extranet_ip", "") + } else if scope == model.IPScopeIntranet { + repo.db.Model(&model.DeviceSetting{}).Where("sn = ?", sn). + Update("intranet_ip_network_id", 0). + Update("intranet_ip", "") + } + return db.RowsAffected, nil +} + +// ReserveIP 为目标设备回收内/外网业务IP并保留IP一段时间,设置释放日期 +func (repo *MySQLRepo) ReserveIP(sn string, scope string, releasedate time.Time) (affected int64, err error) { + db := repo.db.Model(&model.IP{}).Where("sn = ? AND scope = ? AND category = ?", sn, scope, model.BusinessIP).Updates(map[string]interface{}{ + "is_used": model.IPDisabled, + "sn": "", + "release_date": releasedate, + }) + + if err = db.Error; err != nil { + repo.log.Error(err) + return 0, err + } + + //同步清理设备参数表的记录 + if scope == model.IPScopeExtranet { + repo.db.Model(&model.DeviceSetting{}).Where("sn = ?", sn). + Update("need_extranet_ip", model.NO). + Update("extranet_ip_network_id", 0). + Update("extranet_ip", "") + } else if scope == model.IPScopeIntranet { + repo.db.Model(&model.DeviceSetting{}).Where("sn = ?", sn). + Update("intranet_ip_network_id", 0). + Update("intranet_ip", "") + } + return db.RowsAffected, nil +} + +// GetReleasableIP 根据release_date 以及is_used=model.IPDisabled 获取IP记录 +func (repo *MySQLRepo) GetReleasableIP() (items []*model.IP, err error) { + db := repo.db.Model(&model.IP{}) + if err = db.Where("is_used = ? AND category = ? AND datediff(now(),release_date) >= 0", model.IPDisabled, model.BusinessIP).Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} + +// addIPCond 添加查询条件 +func addIPCond(db *gorm.DB, cond *model.IPPageCond) *gorm.DB { + if cond != nil { + //网段ID查询 + db = MultiNumQuery(db, "ip.ip_network_id", cond.IPNetworkID) + //IP ID查询 + db = MultiNumQuery(db, "ip.id", cond.ID) + //网段类别、网段名称查询 + if cond.Category != "" || cond.CIDR != "" { + db = db.Joins("left join ip_network on ip.ip_network_id = ip_network.id") + } + if cond.Category != "" { + db = MultiEnumQuery(db, "ip_network.category", cond.Category) + } + if cond.CIDR != "" { + db = MultiQuery(db, "ip_network.cidr", cond.CIDR) + } + //IP地址精确查询 + db = MultiMatchQuery(db, "ip.ip", cond.IP) + if cond.Scope != nil { + db = MultiQuery(db, "ip.scope", *cond.Scope) + } + db = MultiEnumQuery(db, "ip.is_used", cond.IsUsed) + db = MultiQuery(db, "ip.sn", cond.SN) + if cond.FixedAssetNumber != "" { + //db = MultiQuery(db, "device.fixed_asset_number", cond.FixedAssetNumber) + cs := strings.MultiLines2Slice(cond.FixedAssetNumber) + var sb bytes.Buffer + for i, c := range cs { + cond := fmt.Sprintf("%%%s%%", c) + if i == 0 { + sb.WriteString(fmt.Sprintf("device.fixed_asset_number LIKE '%s' OR ip.remark LIKE '%s'", cond, cond)) + } else { + sb.WriteString(fmt.Sprintf("OR device.fixed_asset_number LIKE '%s' OR ip.remark LIKE '%s'", cond, cond)) + } + } + db = db.Where(fmt.Sprintf("(%s)", sb.String())) + } + } + return db +} + +// CountIPs 统计满足过滤条件的IP数量 +func (repo *MySQLRepo) CountIPs(cond *model.IPPageCond) (count int64, err error) { + db := repo.db.Model(&model.IP{}).Joins("left join device on ip.sn = device.sn") + db = addIPCond(db, cond) + if err = db.Select("id").Count(&count).Error; err != nil { + repo.log.Error(err) + return count, err + } + return count, nil +} + +// GetIPs 返回满足过滤条件的IP +func (repo *MySQLRepo) GetIPs(cond *model.IPPageCond, orderby model.OrderBy, limiter *page.Limiter) (items []*model.IPCombined, err error) { + db := repo.db.Model(&model.IP{}).Joins("left join device on ip.sn = device.sn") + db = addIPCond(db, cond) + for i := range orderby { + db = db.Order(orderby[i].String()) + } + if limiter != nil { + db = db.Limit(limiter.Limit).Offset(limiter.Offset) + } + + //if err = db.Find(&items).Error; err != nil { + if err = db.Select("ip.*, device.fixed_asset_number").Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} + +// GetIPByIP 根据IP地址精确查询IP +func (repo *MySQLRepo) GetIPByIP(ipaddr, scope string) (ip model.IP, err error) { + db := repo.db.Model(&model.IP{}) + if err = db.Where("ip = ? AND scope = ?", ipaddr, scope).First(&ip).Error; err != nil { + repo.log.Error(err) + return + } + return +} + +//GetNetWorkBySN 根据SN获取网络配置信息 +func (repo *MySQLRepo) GetNetWorkBySN(sn string, category string) (ipn []model.IPAndIPNetworkUnion, err error) { + db := repo.db.Model(&model.IP{}) + db = db.Joins("join ip_network on ip_network.id = ip.ip_network_id") + if err := db.Select("ip, netmask, gateway, scope, version").Where("ip.sn = ? and ip.is_used = ? and ip.category = ?", sn, model.IPUsed, category).Find(&ipn).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return ipn, nil +} + +// AssignIP 分配IP +func (repo *MySQLRepo) AssignIP(sn, scope string, id uint) error { + if err := repo.db.Model(&model.IP{}).Where("id = ?", id).Updates(map[string]interface{}{ + "is_used": model.IPUsed, + "sn": sn, + "scope": scope, + }).Error; err != nil { + repo.log.Error(err) + return err + } + return nil +} + +// AssignIPByIP 分配IP +func (repo *MySQLRepo) AssignIPByIP(sn, scope, ip string) error { + if err := repo.db.Model(&model.IP{}).Where("ip = ?", ip).Updates(map[string]interface{}{ + "is_used": model.IPUsed, + "sn": sn, + "scope": scope, + }).Error; err != nil { + repo.log.Error(err) + return err + } + return nil +} + +// UnassignIP 取消分配IP +func (repo *MySQLRepo) UnassignIP(id uint) error { + if err := repo.db.Model(&model.IP{}).Where("id = ?", id).Updates(map[string]interface{}{ + "is_used": model.NO, + "sn": "", + "remark": nil, + }).Error; err != nil { + repo.log.Error(err) + return err + } + return nil +} + +// UnassignIPsBySN 释放指定SN的IP资源,所有内外网IP +func (repo *MySQLRepo) UnassignIPsBySN(sn string) error { + if err := repo.db.Model(&model.IP{}).Where("sn = ?", sn).Updates(map[string]interface{}{ + "is_used": model.NO, + "sn": "", + "remark": nil, + }).Error; err != nil { + repo.log.Error(err) + return err + } + + //将装机参数表的数据清空 + repo.db.Model(&model.DeviceSetting{}).Where("sn = ?", sn). + Update("intranet_ip_network_id", 0). + Update("intranet_ip", ""). + Update("need_extranet_ip", model.NO). + Update("extranet_ip_network_id", 0). + Update("extranet_ip", "") + + return nil +} + +// GetIPByID 返回指定ID的IP +func (repo *MySQLRepo) GetIPByID(id uint) (*model.IP, error) { + var ip model.IP + if err := repo.db.Unscoped().Where("id = ?", id).Find(&ip).Error; err != nil { + if !gorm.IsRecordNotFoundError(err) { + repo.log.Error(err) + } + return nil, err + } + return &ip, nil +} + +// GetIPBySNAndScope 返回指定ID和类别的IP, +func (repo *MySQLRepo) GetIPBySNAndScope(sn, scope string) (*model.IP, error) { + // Fixbug: 现在只能一个外网IP,一个内网IP,如果物理机可以配置多个IP,这里需要改变 + var ip model.IP + if err := repo.db.Unscoped().Where("sn = ? and scope = ?", sn, scope).Find(&ip).Error; err != nil { + if !gorm.IsRecordNotFoundError(err) { + repo.log.Error(err) + } + return nil, err + } + return &ip, nil +} + +// 更新 +func (repo *MySQLRepo) SaveIP(mod *model.IP) (affected int64, err error) { + err = repo.db.Model(&model.IP{}).Update(mod).Error + if err != nil { + return 0, err + } + return 1, nil +} + +// 根据网段(ip_network_id)获取一个空闲的业务IP +func (repo *MySQLRepo) GetAvailableIPByIPNetworkID(ipnetworkid uint) (*model.IP, error) { + var ip model.IP + if err := repo.db.Model(&model.IP{}).Where("ip_network_id = ? and is_used = ? and category = ?", ipnetworkid, model.IPNotUsed, model.BusinessIP).First(&ip).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return &ip, nil +} + +// 根据网段(ip_network_id)获取最后一个业务IPv6 +func (repo *MySQLRepo) GetLastIPv6ByIPNetworkID(ipnetworkid uint) (*model.IP, error) { + var ip model.IP + if err := repo.db.Model(&model.IP{}).Order("id DESC").Where("ip_network_id = ? and category = ?", ipnetworkid, model.BusinessIP).First(&ip).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return &ip, nil +} + +// 创建 +func (repo *MySQLRepo) CreateIP(mod *model.IP) error { + err := repo.db.Create(mod).Error + if err != nil { + return err + } + return nil +} + + + +// AssignIPv6 给设备分配一个业务IPv6 +func (repo *MySQLRepo) AssignIPv6(sn, ipscope string) (*model.IP, error) { + // 若设备已存在关联的业务IPv6,则直接返回该IP(默认网段唯一,仅返回1个) + var existIPv6 model.IP + db := repo.db.Model(&model.IP{}).Joins("left join ip_network on ip.ip_network_id = ip_network.id") + err := db.Where("ip.sn = ? AND ip.scope = ? AND ip.category = ? AND ip_network.version = ?", sn, ipscope, model.BusinessIP, model.IPv6).First(&existIPv6).Error + if err != nil && !gorm.IsRecordNotFoundError(err) { + repo.log.Error(err) + return nil, err + } + if existIPv6.ID > 0 && existIPv6.IP != "" { + return &existIPv6, nil + } + + // 计算并新分配一个ipv6 + var ipv6Assign *model.IP + if ipnetwork, err := repo.GetIPv6NetworkBySN(sn, ipscope); err != nil { + repo.log.Error(err) + return nil, err + } else { + repo.log.Debugf("GetIPv6NetworkBySN ipv6:%+v", ipnetwork) + var scope string + if strings2.Contains(ipnetwork.Category, "intranet") { + scope = model.IPScopeIntranet + } else if strings2.Contains(ipnetwork.Category, "extranet") { + scope = model.IPScopeExtranet + } + + // 根据网段ID获取可分配的空闲IPv6 + ipv6Assign, err = repo.GetAvailableIPByIPNetworkID(ipnetwork.ID) + if err != nil && !gorm.IsRecordNotFoundError(err) { + repo.log.Error(err) + return nil, err + } + repo.log.Debugf("GetAvailableIPByIPNetworkID ipv6:%+v", ipv6Assign) + // 无空闲IPv6时,获取该网段最后一个IP并计算下一个IPv6地址 + if ipv6Assign == nil { + repo.log.Debugf("No available IPv6 of CIDR: %s . Will generate one.", ipnetwork.CIDR) + if ipv6Last, err := repo.GetLastIPv6ByIPNetworkID(ipnetwork.ID);err != nil && !gorm.IsRecordNotFoundError(err){ + repo.log.Error(err) + return nil, err + } else if ipv6Last != nil { // 最后一个IP不为空则获取下一个 + repo.log.Debugf("Last IPv6 of CIDR: %s is %+v", ipnetwork.CIDR, ipv6Last) + if ipv6Next, err := network.GetNextIPv6OfCIDR(ipv6Last.IP, ipnetwork.CIDR); err != nil { + repo.log.Error(err) + return nil, err + } else if ipv6Next != "" { + repo.log.Debugf("Next IPv6 of CIDR: %s is %s", ipnetwork.CIDR, ipv6Next) + ipv6Assign = &model.IP { + IP: ipv6Next, + SN: sn, + IPNetworkID: ipnetwork.ID, + Scope: &scope, + Category: model.BusinessIP, + IsUsed: model.IPUsed, + ReleaseDate: time.Now(), + } + err = repo.CreateIP(ipv6Assign) + if err != nil { + repo.log.Error(err) + return nil, err + } + } + } else { // 获取不到最后一个IP则当新网段分配处理 + repo.log.Debugf("No IPv6 exist of CIDR: %s . Will generate one.", ipnetwork.CIDR) + if ipv6First, err := network.GetFirstIPv6OfCIDR(ipnetwork.CIDR); err != nil { + repo.log.Error(err) + return nil, err + } else if ipv6First != "" { + repo.log.Debugf("New IPv6 of CIDR: %s is %s", ipnetwork.CIDR, ipv6First) + ipv6Assign = &model.IP { + IPNetworkID: ipnetwork.ID, + IP: ipv6First, + SN: sn, + Scope: &scope, + Category: model.BusinessIP, + IsUsed: model.IPUsed, + ReleaseDate: time.Now(), + } + err = repo.CreateIP(ipv6Assign) + if err != nil { + repo.log.Error(err) + return nil, err + } + + } + } + } else { //存在空闲IPv6时 + if err := repo.db.Model(&model.IP{}).Where("id = ?", ipv6Assign.ID).Updates(map[string]interface{}{ + "is_used": model.IPUsed, + "sn": sn, + "scope": scope, + }).Error; err != nil { + repo.log.Error(err) + return nil,err + } + } + } + return ipv6Assign, nil +} + + +// ReleaseIPv6 为目标设备释放内/外网业务IPv6,有多个IP是一并清空 +func (repo *MySQLRepo) ReleaseIPv6(sn string, scope string) (affected int64, err error) { + tx0 := repo.db.Begin() + ips := make([]*model.IP, 0) + if err = tx0.Model(&model.IP{}).Joins("left join ip_network on ip.ip_network_id = ip_network.id"). + Where("ip.sn = ? AND ip.scope = ? AND ip.category = ? AND ip_network.version = ?", sn, scope, model.BusinessIP, model.IPv6). + Set("gorm:query_option", "FOR UPDATE").Find(&ips).Error; err != nil { + tx0.Rollback() + repo.log.Error(err) + return 0, err + } + for _, ip := range ips { + if err = tx0.Model(&model.IP{}).Where("id = ?", ip.ID). + Updates(map[string]interface{}{ + "is_used": model.IPNotUsed, + "sn": "", + }).Error; err != nil { + tx0.Rollback() + repo.log.Error(err) + return 0, err + } + } + + if err = tx0.Commit().Error; err != nil { + repo.log.Error(err) + return 0, err + } + + //同步清理设备参数表的记录 + if scope == model.IPScopeExtranet { + repo.log.Debugf("device setting reset %s IP of SN:%s ", scope, sn) + repo.db.Model(&model.DeviceSetting{}).Where("sn = ?", sn). + Update("need_extranet_ipv6", model.NO). + Update("extranet_ipv6_network_id", 0). + Update("extranet_ipv6", "") + } else if scope == model.IPScopeIntranet { + repo.log.Debugf("device setting reset %s IP of SN:%s ", scope, sn) + repo.db.Model(&model.DeviceSetting{}).Where("sn = ?", sn). + Update("need_intranet_ipv6", model.NO). + Update("intranet_ipv6_network_id", 0). + Update("intranet_ipv6", "") + } + return tx0.RowsAffected, nil +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/ip_network.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/ip_network.go new file mode 100644 index 0000000000000000000000000000000000000000..1655ab7ec4c4031dd122ac4daa99610eb16d6e2a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/ip_network.go @@ -0,0 +1,297 @@ +package mysqlrepo + +import ( + "encoding/json" + "strings" + + "fmt" + "time" + + "github.com/jinzhu/gorm" + "github.com/voidint/page" + "idcos.io/cloudboot/model" + nw "idcos.io/cloudboot/utils/network" +) + +// GetIntranetIPNetworksBySN 查询指定物理机的内网IP所属网段集合 +func (repo *MySQLRepo) GetIntranetIPNetworksBySN(sn string) (ipnet []*model.IPNetwork, err error) { + return repo.getIPNetworksBySN(sn, true) +} + +// GetExtranetIPNetworksBySN 查询指定物理机的外网IP所属网段集合 +func (repo *MySQLRepo) GetExtranetIPNetworksBySN(sn string) (ipnet []*model.IPNetwork, err error) { + return repo.getIPNetworksBySN(sn, false) +} + +const ( + // sep 分隔符 + sep = "," +) + +// 查询指定物理机的内/外网IP所属网段 +func (repo *MySQLRepo) getIPNetworksBySN(sn string, intranet bool) (ipnet []*model.IPNetwork, err error) { + var switcher *model.NetworkDevice + if intranet { + switcher, err = repo.GetIntranetSwitchBySN(sn) + } else { + switcher, err = repo.GetExtranetSwitchBySN(sn) + } + if err != nil || switcher == nil { + return nil, fmt.Errorf("查询设备(sn:%s)所在机位关联的交换机失败", sn) + } + + var items []*model.IPNetwork + if err = repo.db.Model(&model.IPNetwork{}).Where("switches LIKE ?", "%"+switcher.FixedAssetNumber+"%").Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + for i := range items { + var switches []string + if err = json.Unmarshal([]byte(items[i].Switches), &switches); err != nil { + repo.log.Error(err) + continue + } + for _, s := range switches { + if strings.TrimSpace(s) == strings.TrimSpace(switcher.FixedAssetNumber) { + ipnet = append(ipnet, items[i]) + } + } + } + if len(ipnet) > 0 { + return ipnet, nil + } + return nil, fmt.Errorf("没有找到覆盖交换机(固资号:%s)的网段", switcher.FixedAssetNumber) +} + +// RemoveIPNetworkByID 删除指定ID的网段 +func (repo *MySQLRepo) RemoveIPNetworkByID(id uint) (affected int64, err error) { + tx := repo.db.Begin() + + // 删除网段 + tx = tx.Unscoped().Delete(&model.IPNetwork{}, "id = ?", id) + if err = tx.Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return 0, err + } + + if affected = tx.RowsAffected; affected <= 0 { + return affected, tx.Commit().Error + } + + // 删除网段内IP + tx = tx.Unscoped().Delete(&model.IP{}, "ip_network_id = ?", id) + if err = tx.Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return 0, err + } + return affected, tx.Commit().Error +} + +// SaveIPNetwork 新增/更新网段 +func (repo *MySQLRepo) SaveIPNetwork(ipn *model.IPNetwork) (affected int64, err error) { + + tx := repo.db.Begin() + if ipn.ID > 0 { + _, err := repo.GetIPNetworkByID(ipn.ID) + if err != nil { + return 0, err + } + // 更新网段信息,为防止IP覆盖式写入,只允许修改覆盖交换机、网关、数据中心、机房管理单元、VLAN + if err = tx.Model(&model.IPNetwork{}).Where("id = ?", ipn.ID). + Update("switches", ipn.Switches). + Update("gateway", ipn.Gateway). + Update("idc_id", ipn.IDCID). + Update("server_room_id", ipn.ServerRoomID). + Update("vlan", ipn.Vlan).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return 0, err + } + } else { + switch ipn.Version { // 针对IPv4 IPv6分别处理 + case model.IPv6: + if err = tx.Create(ipn).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return affected, err + } + + default: //新增网段同时裂解IP资源池 -- 默认仅针对IPv4作处理 + //获取全部IP的列表 + ips, err := nw.GetIPListByMinAndMaxIP(ipn.IPPool) + min, max := nw.GetCidrIPFirstAndLast(ipn.CIDR) + if err != nil { + repo.log.Error(err) + return 0, err + } + //获取pxeIP的列表 + var pxeIps []string + if ipn.PXEPool != "" { + pxeIps, err = nw.GetIPListByMinAndMaxIP(ipn.PXEPool) + if err != nil { + repo.log.Error(err) + return 0, err + } + } + if err = tx.Create(ipn).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return affected, err + } + affected = tx.RowsAffected + // 虚拟化网段、ILO网段不做IP分配使用 + if ipn.Category == model.VIntranet || ipn.Category == model.VExtranet || ipn.Category == model.ILO { + return affected, tx.Commit().Error + } + + var scope string + if strings.Contains(ipn.Category, "intranet") { + scope = model.IPScopeIntranet + } else if strings.Contains(ipn.Category, "extranet") { + scope = model.IPScopeExtranet + } + + for i := range ips { + if ips[i] == min || ips[i] == max { + continue + } + + if err = tx.Create(&model.IP{ + IPNetworkID: ipn.ID, + IP: ips[i], + Scope: &scope, + Category: model.BusinessIP, + IsUsed: model.IPNotUsed, + ReleaseDate: time.Now(), + }).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return 0, err + } + } + //对于PXE网段,更新IP类别 + for i := range pxeIps { + if ips[i] == min || ips[i] == max { + continue + } + + if err = tx.Model(&model.IP{}).Where("ip_network_id = ? and ip = ?", ipn.ID, pxeIps[i]).Updates(model.IP{ + Category: model.PXEIP, + }).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return 0, err + } + } + } + } + return affected, tx.Commit().Error +} + +// GetIPNetworkByID 返回指定ID的网段 +func (repo *MySQLRepo) GetIPNetworkByID(id uint) (*model.IPNetwork, error) { + var ipn model.IPNetwork + if err := repo.db.Where("id = ?", id).Find(&ipn).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &ipn, nil +} + +func addIPNetworkCond(db *gorm.DB, cond *model.IPNetworkCond) *gorm.DB { + if cond != nil { + if cond.ServerRoomName != "" { + db = db.Joins("left join server_room on server_room.id = ip_network.server_room_id") + } + db = MultiNumQuery(db, "server_room_id", cond.ServerRoomID) + db = MultiEnumQuery(db, "ip_network.category", cond.Category) + db = MultiQuery(db, "ip_network.cidr", cond.CIDR) + db = MultiQuery(db, "server_room.name", cond.ServerRoomName) + if cond.Switches != "" { + db = MultiQuery(db, "ip_network.switches", cond.Switches) + } + } + return db +} + +// CountIPNetworks 统计满足过滤条件的网段数量 +func (repo *MySQLRepo) CountIPNetworks(cond *model.IPNetworkCond) (count int64, err error) { + db := repo.db.Model(&model.IPNetwork{}) + db = addIPNetworkCond(db, cond) + if err = db.Select("id").Count(&count).Error; err != nil { + repo.log.Error(err) + return count, err + } + return count, nil +} + +// GetIPNetworks 返回满足过滤条件的网段 +func (repo *MySQLRepo) GetIPNetworks(cond *model.IPNetworkCond, orderby model.OrderBy, limiter *page.Limiter) (items []*model.IPNetwork, err error) { + db := repo.db.Model(&model.IPNetwork{}) //.Joins("left join network_device on ip_network.switches LIKE concat(%,network_device.name,%)") + db = addIPNetworkCond(db, cond) + for i := range orderby { + db = db.Order(orderby[i].String()) + } + if limiter != nil { + db = db.Limit(limiter.Limit).Offset(limiter.Offset) + } + + if err = db.Select("ip_network.*").Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} + +// GetIPNetworksBySwitchNumber 根据设备编号查询网段信息 +func (repo *MySQLRepo) GetIPNetworksBySwitchNumber(switchNum string) (items []*model.IPNetwork, err error) { + db := repo.db.Model(&model.IPNetwork{}).Where("switches like ?", "%"+switchNum+"%") + + if err = db.Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} + + +// 查询指定物理机的内/外网IPv6所属网段 +func (repo *MySQLRepo) GetIPv6NetworkBySN(sn string, category string) (ipnet *model.IPNetwork, err error) { + var switcher *model.NetworkDevice + if category == model.Intranet { + switcher, err = repo.GetIntranetSwitchBySN(sn) + } else if category == model.Extranet { + switcher, err = repo.GetExtranetSwitchBySN(sn) + } + if err != nil || switcher == nil { + return nil, fmt.Errorf("查询设备(sn:%s)所在机位关联的交换机失败", sn) + } + + var items []*model.IPNetwork + if err = repo.db.Model(&model.IPNetwork{}).Where("version = ? and switches LIKE ?", model.IPv6, "%"+switcher.FixedAssetNumber+"%").Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + for i := range items { + var switches []string + if err = json.Unmarshal([]byte(items[i].Switches), &switches); err != nil { + repo.log.Error(err) + continue + } + for _, s := range switches { + if strings.TrimSpace(s) == strings.TrimSpace(switcher.FixedAssetNumber) { + // 仅处理一个网段 + ipnet = items[i] + break + } + } + } + if ipnet != nil { + return ipnet, nil + } + return nil, fmt.Errorf("没有找到覆盖交换机(固资号:%s)的IPv6网段", switcher.FixedAssetNumber) +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/job.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/job.go new file mode 100644 index 0000000000000000000000000000000000000000..0f262a5a434a913e8fee89a9973ee4251ff056d2 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/job.go @@ -0,0 +1,108 @@ +package mysqlrepo + +import ( + "strings" + + "github.com/jinzhu/gorm" + "github.com/voidint/page" + + "idcos.io/cloudboot/model" +) + +// SaveJob 保存(新增/更新)任务 +func (repo *MySQLRepo) SaveJob(job *model.Job) (err error) { + var affected int64 + if job.ID != "" { + db := repo.db.Model(&model.Job{}).Updates(job) // 根据主键ID更新任务 + if err = db.Error; err != nil { + repo.log.Error(err) + return err + } + if affected = db.RowsAffected; affected > 0 { + return nil + } + } + + if err = repo.db.Create(job).Error; err != nil { + repo.log.Error(err) + return err + } + return nil +} + +// RemoveJob 移除指定ID的任务 +func (repo *MySQLRepo) RemoveJob(id string) (affected int64, err error) { + db := repo.db.Delete(&model.Job{}, "id = ?", id) + if err = db.Error; err != nil { + repo.log.Error(err) + } + return db.RowsAffected, db.Error +} + +// GetJobByID 查询指定ID的任务 +func (repo *MySQLRepo) GetJobByID(id string) (job *model.Job, err error) { + var one model.Job + if err := repo.db.Where("id = ?", id).Find(&one).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &one, nil +} + +// CountJobs 统计满足条件的任务数量 +func (repo *MySQLRepo) CountJobs(cond *model.Job) (count int64, err error) { + db := repo.db.Model(&model.Job{}) + db = repo.setWhereSQL4Job(db, cond) + + if err = db.Select("id").Count(&count).Error; err != nil { + repo.log.Error(err) + return count, err + } + return count, nil +} + +// GetJobs 返回满足过滤条件的任务 +func (repo *MySQLRepo) GetJobs(cond *model.Job, orderby model.OrderBy, limiter *page.Limiter) (items []*model.Job, err error) { + db := repo.db.Model(&model.Job{}) + db = repo.setWhereSQL4Job(db, cond) + + for i := range orderby { + db = db.Order(orderby[i].String()) + } + if limiter != nil { + db = db.Limit(limiter.Limit).Offset(limiter.Offset) + } + + if err = db.Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} + +func (repo *MySQLRepo) setWhereSQL4Job(db *gorm.DB, cond *model.Job) *gorm.DB { + if db == nil || cond == nil { + return db + } + if cond.Title != "" { + db = db.Where("title LIKE ?", "%"+cond.Title+"%") + } + if cond.Builtin != "" { + db = db.Where("builtin = ?", cond.Builtin) + } + if cond.Category != "" { + db = db.Where("category = ?", cond.Category) + } + if cond.Rate != "" { + db = db.Where("rate = ?", cond.Rate) + } + if cond.Status != "" { + db = db.Where("`status` IN(?)", strings.Split(cond.Status, ",")) + } + if cond.Creator != "" { + db = db.Where("creator = ?", cond.Creator) + } + return db +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/network_area.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/network_area.go new file mode 100644 index 0000000000000000000000000000000000000000..1291f052d4ec579f48a447a3d1e1899518a17356 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/network_area.go @@ -0,0 +1,134 @@ +package mysqlrepo + +import ( + "github.com/jinzhu/gorm" + "github.com/voidint/page" + + "idcos.io/cloudboot/model" +) + +// RemoveNetworkAreaByID 删除指定ID的网络区域 +func (repo *MySQLRepo) RemoveNetworkAreaByID(id uint) (affected int64, err error) { + db := repo.db.Unscoped().Delete(&model.NetworkArea{}, "id = ?", id) + if err = db.Error; err != nil { + repo.log.Error(err) + return 0, err + } + return db.RowsAffected, nil +} + +// SaveNetworkArea 保存网络区域 +func (repo *MySQLRepo) SaveNetworkArea(na *model.NetworkArea) (affected int64, err error) { + if na.ID > 0 { + // 更新 + db := repo.db.Model(&model.NetworkArea{}).Where("id = ?", na.ID).Updates(na) + if err = db.Error; err != nil { + repo.log.Error(err) + return db.RowsAffected, err + } + return db.RowsAffected, nil + } + // 新增 + db := repo.db.Create(na) + if err = db.Error; err != nil { + repo.log.Error(err) + return db.RowsAffected, err + } + return db.RowsAffected, nil +} + +// UpdateNetworkAreaStatus 批量更新网络区域状态 +func (repo *MySQLRepo) UpdateNetworkAreaStatus(status string, ids ...uint) (affected int64, err error) { + db := repo.db.Model(&model.NetworkArea{}).Where("id IN(?)", ids).Update("status", status) + if err = db.Error; err != nil { + repo.log.Error(err) + return 0, err + } + return db.RowsAffected, nil +} + +// GetNetworkAreaByID 返回指定ID的网络区域 +func (repo *MySQLRepo) GetNetworkAreaByID(id uint) (*model.NetworkArea, error) { + var na model.NetworkArea + if err := repo.db.Where("id = ?", id).Find(&na).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &na, nil +} + +// CountNetworkAreas 统计满足过滤条件的网络区域数量 +func (repo *MySQLRepo) CountNetworkAreas(cond *model.NetworkAreaCond) (count int64, err error) { + db := repo.db.Model(&model.NetworkArea{}) + if cond != nil { + db = MultiNumQuery(db, "idc_id", cond.IDCID) + db = MultiNumQuery(db, "server_room_id", cond.ServerRoomID) + db = MultiQuery(db, "name", cond.Name) + db = MultiQuery(db, "physical_area", cond.PhysicalArea) + db = MultiEnumQuery(db, "status", cond.Status) + } + if err = db.Select("id").Count(&count).Error; err != nil { + repo.log.Error(err) + return count, err + } + return count, nil +} + +// GetNetworkAreasByCond 返回满足过滤条件的网络区域(不支持模糊查找) +func (repo *MySQLRepo) GetNetworkAreasByCond(cond *model.NetworkArea) (item []*model.NetworkArea, err error) { + db := repo.db.Model(&model.NetworkArea{}) + if cond != nil { + if cond.IDCID > 0 { + db = db.Where("idc_id = ?", cond.IDCID) + } + if cond.ServerRoomID > 0 { + db = db.Where("server_room_id = ?", cond.ServerRoomID) + } + if cond.Name != "" { + db = db.Where("name = ?", cond.Name) + } + } + + if err = db.Find(&item).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return item, nil +} + +func addNetAreaCond(db *gorm.DB, cond *model.NetworkAreaCond) *gorm.DB { + if cond.ServerRoomName != "" { + db = db.Joins("left join server_room on server_room.id = network_area.server_room_id") + } + if cond != nil { + db = MultiNumQuery(db, "idc_id", cond.IDCID) + db = MultiNumQuery(db, "server_room_id", cond.ServerRoomID) + db = MultiQuery(db, "name", cond.Name) + db = MultiQuery(db, "server_room.name", cond.ServerRoomName) + db = MultiQuery(db, "physical_area", cond.PhysicalArea) + db = MultiEnumQuery(db, "status", cond.Status) + } + return db +} + +// GetNetworkAreas 返回满足过滤条件的网络区域 +func (repo *MySQLRepo) GetNetworkAreas(cond *model.NetworkAreaCond, orderby model.OrderBy, limiter *page.Limiter) (items []*model.NetworkArea, err error) { + db := repo.db.Model(&model.NetworkArea{}) + + db = addNetAreaCond(db, cond) + + for i := range orderby { + db = db.Order(orderby[i].String()) + } + if limiter != nil { + db = db.Limit(limiter.Limit).Offset(limiter.Offset) + } + + if err = db.Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/network_device.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/network_device.go new file mode 100644 index 0000000000000000000000000000000000000000..ed2868f84bfc31c1037bfe688a54a2d313c0b2d4 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/network_device.go @@ -0,0 +1,210 @@ +package mysqlrepo + +import ( + "fmt" + + "github.com/jinzhu/gorm" + "github.com/voidint/page" + + "idcos.io/cloudboot/model" +) + +// GetTORs 返回所有的TOR名称列表 +func (repo *MySQLRepo) GetTORs() (items []string, err error) { + if err = repo.db.Raw(`SELECT DISTINCT(tor) FROM network_device WHERE tor IS NOT NULL AND tor != ""`).Pluck("tor", &items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return nil, nil +} + +// GetNetworkDeviceByTORS 根据指定的tor返回网络设备 +func (repo *MySQLRepo) GetNetworkDeviceByTORS(tor ...string) (nd []*model.NetworkDevice, err error) { + db := repo.db.Where("tor in (?)", tor).Find(&nd) + if err = db.Error; err != nil { + return nil, err + } + return nd, err +} + +// GetTORBySN 返回目标设备所属的TOR名称 +func (repo *MySQLRepo) GetTORBySN(sn string) (tor string, err error) { + switcher, err := repo.GetIntranetSwitchBySN(sn) + if err != nil { + return "", err + } + return switcher.TOR, nil +} + +// GetIntranetSwitchBySN 查询设备所在机位的内网交换机 +func (repo *MySQLRepo) GetIntranetSwitchBySN(sn string) (*model.NetworkDevice, error) { + return repo.getSwitchBySN(sn, intranetField) +} + +// GetExtranetSwitchBySN 查询设备所在机位的外网交换机 +func (repo *MySQLRepo) GetExtranetSwitchBySN(sn string) (*model.NetworkDevice, error) { + return repo.getSwitchBySN(sn, extranetField) +} + +// SaveNetworkDevice 保存网络设备 +func (repo *MySQLRepo) SaveNetworkDevice(na *model.NetworkDevice) (networkDevice *model.NetworkDevice, err error) { + if na.ID > 0 { + // 更新 + db := repo.db.Model(&model.NetworkDevice{}).Where("id = ?", na.ID).Updates(na) + if err = db.Error; err != nil { + repo.log.Error(err) + return nil, err + } + return na, nil + } + // 新增 + db := repo.db.Create(na) + if err = db.Error; err != nil { + repo.log.Error(err) + return nil, err + } + return na, nil +} + +// GetPeerNetworkDeviceByCabinetID 返回指定ID的机架(柜) +func (repo *MySQLRepo) GetPeerNetworkDeviceByCabinetID(id uint) (*model.NetworkDevice, error) { + var netDev = make([]*model.NetworkDevice, 0) + rawSQL := fmt.Sprintf(`select * from network_device where tor = (select tor from network_device where server_cabinet_id = %d limit 1) and server_cabinet_id != %d`, id, id) + if err := repo.db.Raw(rawSQL).Scan(&netDev).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + if len(netDev) > 0 { + return netDev[0], nil + } + return nil, nil +} + +const ( + oobnetField = "oobnet_switches" + intranetField = "intranet_switches" + extranetField = "extranet_switches" +) + +// getSwitchBySN 查询设备所在机位的管理网/内网/外网交换机。 +// netField可选值:oobnet_switch_name、intranet_switch_name、extranet_switch_name +func (repo *MySQLRepo) getSwitchBySN(sn string, netField string) (*model.NetworkDevice, error) { + sql := ` +select * from network_device where type='switch' and name = ( + select JSON_UNQUOTE(%s->'$[0].name') from server_usite where id = ( + select server_usite_id from device where sn = ? + ) +);` + + var netDev model.NetworkDevice + if err := repo.db.Raw(fmt.Sprintf(sql, netField), sn).Scan(&netDev).Error; err != nil { + repo.log.Errorf("device(sn:%s) has not found %s net-device, err: %s", sn, netField, err) + return nil, fmt.Errorf("机位没有关联内/外网交换机") + } + return &netDev, nil +} + +// GetNetworkDevicesByCond 返回满足过滤条件的网络设备(不支持模糊查找) +func (repo *MySQLRepo) GetNetworkDevicesByCond(cond *model.NetworkDeviceCond, orderby model.OrderBy, limiter *page.Limiter) (items []*model.NetworkDevice, err error) { + db := repo.db.Model(&model.NetworkDevice{}) + db = addCond(db, cond) + + for i := range orderby { + db = db.Order(orderby[i].String()) + } + if limiter != nil { + db = db.Limit(limiter.Limit).Offset(limiter.Offset) + } + + if err = db.Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} + +// CountNetworkDevices 统计满足过滤条件的网络设备数量 +func (repo *MySQLRepo) CountNetworkDevices(cond *model.NetworkDeviceCond) (count int64, err error) { + db := repo.db.Model(&model.NetworkDevice{}) + db = addCond(db, cond) + + if err = db.Select("id").Count(&count).Error; err != nil { + repo.log.Error(err) + return 0, err + } + return count, nil +} + +// RemoveNetworkDeviceByID 删除指定ID的网络设备 +func (repo *MySQLRepo) RemoveNetworkDeviceByID(id uint) (err error) { + db := repo.db.Unscoped().Where("id =?", id).Delete(model.NetworkDevice{}) + + if err = db.Error; err != nil { + return err + } + return +} + +// GetNetworkDeviceByID 查询指定ID的网络设备 +func (repo *MySQLRepo) GetNetworkDeviceByID(id uint) (network *model.NetworkDevice, err error) { + var net model.NetworkDevice + db := repo.db.Where("id =?", id).Find(&net) + + if err = db.Error; err != nil { + return nil, err + } + return &net, nil +} + +// GetNetworkDeviceBySN 查询指定sn的网络设备 +func (repo *MySQLRepo) GetNetworkDeviceBySN(sn string) (network []*model.NetworkDevice, err error) { + var net []*model.NetworkDevice + db := repo.db.Where("sn =?", sn).Find(&net) + + if err = db.Error; err != nil { + return nil, err + } + return net, nil +} + +// GetNetworkDeviceByFixedAssetNumber 查询指定FixedAssetNumber的网络设备 +func (repo *MySQLRepo) GetNetworkDeviceByFixedAssetNumber(FixedAssetNumber string) (network []*model.NetworkDevice, err error) { + var net []*model.NetworkDevice + db := repo.db.Where("fixed_asset_number =?", FixedAssetNumber).Find(&net) + + if err = db.Error; err != nil { + return nil, err + } + return net, nil +} + +// addCond 添加查询条件 +func addCond(db *gorm.DB, cond *model.NetworkDeviceCond) *gorm.DB { + if cond != nil { + db = MultiNumQuery(db, "network_device.idc_id", cond.IDCID) + db = MultiNumQuery(db, "network_device.server_room_id", cond.ServerRoomID) + db = MultiNumQuery(db, "network_device.server_cabinet_id", cond.ServerCabinetID) + if cond.ServerRoomName != "" { + db = db.Joins("left join server_room on server_room.id = network_device.server_room_id") + db = MultiQuery(db, "server_room.name", cond.ServerRoomName) + } + + if cond.ServerCabinetNumber != "" { + db = db.Joins("left join server_cabinet on server_cabinet.id = network_device.server_cabinet_id") + db = MultiQuery(db, "server_cabinet.number", cond.ServerCabinetNumber) + } + db = MultiQuery(db, "network_device.name", cond.Name) + db = MultiQuery(db, "network_device.fixed_asset_number", cond.FixedAssetNumber) + db = MultiQuery(db, "network_device.sn", cond.SN) + db = MultiQuery(db, "network_device.tor", cond.TOR) + db = MultiQuery(db, "network_device.type", cond.Type) + db = MultiQuery(db, "network_device.model", cond.ModelNumber) + db = MultiQuery(db, "network_device.vendor", cond.Vendor) + db = MultiQuery(db, "network_device.os", cond.OS) + db = MultiQuery(db, "network_device.usage", cond.Usage) + db = MultiQuery(db, "network_device.status", cond.Status) + } + return db +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/oob.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/oob.go new file mode 100644 index 0000000000000000000000000000000000000000..35c04a480ee0f2c057b744f9878cfd1fce2101e1 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/oob.go @@ -0,0 +1,21 @@ +package mysqlrepo + +import "idcos.io/cloudboot/model" + +// AddOOBHistory 增加带外修改历史记录 +//func (repo *MySQLRepo) AddOOBHistory(mod *model.OOBHistory) (affected int64, err error) { +// err = repo.db.Create(mod).Error +// if err != nil { +// return 0, err +// } +// return 1, nil +//} + +// GetLastOOBHistoryBySN 查询指定SN最近的一条修改记录,用以找到/确认当前的用户密码 +func (repo *MySQLRepo) GetLastOOBHistoryBySN(sn string) (mod model.OOBHistory, err error) { + err = repo.db.Model(model.OOBHistory{}).Where("sn = ?", sn).Last(&mod).Error + if err != nil { + return mod, err + } + return mod, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/operate_log.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/operate_log.go new file mode 100644 index 0000000000000000000000000000000000000000..0db886cdb31b526d4e11fa5e21cee0ee6ef924be --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/operate_log.go @@ -0,0 +1,67 @@ +package mysqlrepo + +import ( + "github.com/jinzhu/gorm" + "github.com/voidint/page" + + "idcos.io/cloudboot/model" +) + +// SaveOperateLog 保存操作记录 +func (repo *MySQLRepo) SaveOperateLog(operate *model.OperateLog) (id uint, err error) { + if err = repo.db.Model(&model.OperateLog{}).Save(operate).Error; err != nil { + return 0, err + } + return operate.ID, nil +} + +// CountOperateLog 统计满足过滤条件的操作记录数量 +func (repo *MySQLRepo) CountOperateLog(cond *model.OperateLog) (count int64, err error) { + db := repo.db.Model(&model.OperateLog{}) + if cond != nil { + db = addOperatesCond(db, cond) + } + err = db.Count(&count).Error + return count, err +} + +// GetOperateLogByCond 返回满足过滤条件的操作记录 +func (repo *MySQLRepo) GetOperateLogByCond(cond *model.OperateLog, orderby model.OrderBy, limiter *page.Limiter) (items []*model.OperateLog, err error) { + db := repo.db.Model(&model.OperateLog{}) + db = addOperatesCond(db, cond) + + for i := range orderby { + db = db.Order(orderby[i].String()) + } + if limiter != nil { + db = db.Limit(limiter.Limit).Offset(limiter.Offset) + } + + if err = db.Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} + +// addOperatesCond 添加查询条件 +func addOperatesCond(db *gorm.DB, cond *model.OperateLog) *gorm.DB { + if cond != nil { + if cond.HTTPMethod != "" { + db = db.Where("http_method = ?", cond.HTTPMethod) + } + if cond.URL != "" { + db = db.Where("url like ?", "%"+cond.URL+"%") + } + if cond.Source != "" { + db = db.Where("source like ?", "%"+cond.Source+"%") + } + if cond.Destination != "" { + db = db.Where("destination like ?", "%"+cond.Destination+"%") + } + if cond.CategoryName !=""{ + db = db.Where("category_name like ?", "%"+cond.CategoryName+"%") + } + } + return db +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/order.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/order.go new file mode 100644 index 0000000000000000000000000000000000000000..da22081912fdaa6099abca42882e297ce788142e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/order.go @@ -0,0 +1,153 @@ +package mysqlrepo + +import ( + "github.com/voidint/page" + + "fmt" + + "strconv" + + "github.com/jinzhu/gorm" + "idcos.io/cloudboot/model" +) + +// RemoveOrderByID 删除指定ID的订单 +func (repo *MySQLRepo) RemoveOrderByID(id uint) (affected int64, err error) { + mod := model.Order{Model: gorm.Model{ID: id}} + err = repo.db.Unscoped().Delete(mod).Error + if err != nil { + return 0, err + } + return 1, nil +} + +// SaveOrder 保存订单 +func (repo *MySQLRepo) SaveOrder(mod *model.Order) (affected int64, err error) { + //if mod.ID != 0 { + // return repo.UpdateOrder(mod) + //} else { + // affected, _, err = repo.AddOrder(mod) + //} + err = repo.db.Save(mod).Error + return +} + +// AddOrder 增加订单 +func (repo *MySQLRepo) AddOrder(mod *model.Order) (affected int64, Order *model.Order, err error) { + err = repo.db.Create(mod).Error + if err != nil { + return 0, nil, err + } + return 1, mod, nil +} + +// UpdateOrder 修改订单 +func (repo *MySQLRepo) UpdateOrder(mod *model.Order) (affected int64, err error) { + err = repo.db.Model(&model.Order{}).Where("id = ?", mod.ID).Update(mod).Error + if err != nil { + return 0, err + } + return 1, nil +} + +// UpdateOrderStatus 批量更新订单状态 +func (repo *MySQLRepo) UpdateOrderStatus(status string, ids ...uint) (affected int64, err error) { + tx := repo.db.Begin() + for _, id := range ids { + err = tx.Model(&model.Order{}).Where("id = ?", id).Update("status", status).Error + if err != nil { + tx.Rollback() + return 0, err + } + affected++ + } + tx.Commit() + return +} + +// GetOrderByID 返回指定ID的订单 +func (repo *MySQLRepo) GetOrderByID(id uint) (*model.Order, error) { + var Order model.Order + if err := repo.db.Where("id = ?", id).Find(&Order).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &Order, nil +} + +// GetOrderByNumber 返回指定订单号的的订单 +func (repo *MySQLRepo) GetOrderByNumber(n string) (*model.Order, error) { + var Order model.Order + if err := repo.db.Where("number = ?", n).Find(&Order).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &Order, nil +} + +// CountOrders 统计满足过滤条件的订单数量 +func (repo *MySQLRepo) CountOrders(cond *model.OrderCond) (count int64, err error) { + db := repo.db.Model(&model.Order{}) + if cond != nil { + db = MultiNumQuery(db, "id", cond.ID) + db = MultiQuery(db, "number", cond.Number) + db = MultiMatchWithSpaceQuery(db, "physical_area", cond.PhysicalArea) + db = MultiQuery(db, "usage", cond.Usage) + db = MultiEnumQuery(db, "status", cond.Status) + } + if err = db.Count(&count).Error; err != nil { + repo.log.Error(err.Error()) + return + } + return count, err +} + +// GetOrders 返回满足过滤条件的订单 +func (repo *MySQLRepo) GetOrders(cond *model.OrderCond, orderby model.OrderBy, limiter *page.Limiter) (items []*model.Order, err error) { + items = make([]*model.Order, 0) + db := repo.db.Model(&model.Order{}) + if cond != nil { + db = MultiNumQuery(db, "id", cond.ID) + db = MultiQuery(db, "number", cond.Number) + db = MultiMatchWithSpaceQuery(db, "physical_area", cond.PhysicalArea) + db = MultiQuery(db, "usage", cond.Usage) + db = MultiEnumQuery(db, "status", cond.Status) + } + for i := range orderby { + db = db.Order(orderby[i].String()) + } + if limiter != nil { + db = db.Offset(limiter.Offset).Limit(limiter.Limit) + } + err = db.Find(&items).Error + if err != nil { + repo.log.Error(err.Error()) + return nil, err + } + return items, nil +} + +//GetMaxOrderNumber 如果某日最大订单号为IDC120190617009,则返回最后的自增值9 +func (repo *MySQLRepo) GetMaxOrderNumber(date string) (orderNumber int, err error) { + items := make([]*model.Order, 0) + db := repo.db.Model(&model.Order{}) + err = db.Where("number LIKE ? ", fmt.Sprintf("%%%s%%", date)).Find(&items).Error + + //自增号取最后3位数 + for _, item := range items { + seqStr := item.Number[len(item.Number)-3:] + seqInt, err := strconv.Atoi(seqStr) + if err != nil { + repo.log.Errorf("strconv:%s fail, %v", seqStr, err) + return orderNumber, err + } + if seqInt > orderNumber { + orderNumber = seqInt + } + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/os_template.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/os_template.go new file mode 100644 index 0000000000000000000000000000000000000000..1fd83315110602e0cc195ddf593dd123b26dae98 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/os_template.go @@ -0,0 +1,84 @@ +package mysqlrepo + +import ( + "fmt" + + "github.com/jinzhu/gorm" + + "idcos.io/cloudboot/model" + mystrings "idcos.io/cloudboot/utils/strings" +) + +// GetSystemTemplateBySN 返回指定设备所关联的系统模板 +func (repo *MySQLRepo) GetSystemTemplateBySN(sn string) (*model.SystemTemplate, error) { + var tpl model.SystemTemplate + if err := repo.db.Joins("inner join device_setting on device_setting.system_template_id = system_template.id").Where("device_setting.sn = ?", sn).Find(&tpl).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &tpl, nil +} + +// GetSystemTemplatesByCond 根据条件查询系统安装模板 +func (repo *MySQLRepo) GetSystemTemplatesByCond(cond *model.CommonTemplateCond) (templates []*model.SystemTemplate, err error) { + db := repo.db.Model(&model.CommonTemplateCond{}) + + if cond.Name != "" { + db = db.Where("name like ?", fmt.Sprintf("%s%%s%%", cond.Name)) + } + + if cond.BootMode != "" { + db = db.Where("boot_mode = ?", cond.BootMode) + } + + if cond.Family != "" { + db = db.Where("family = ?", cond.Family) + } + + if cond.OSLifecycle != "" { + db = db.Where("os_lifecycle IN (?)", mystrings.MultiLines2Slice(cond.OSLifecycle)) + } + if cond.Arch != "" { + db = db.Where("arch = ?", cond.Arch) + } + + if err := db.Find(&templates).Error; err != nil { + repo.log.Error(err) + return nil, err + } + + return +} + +// GetImageTemplatesByCond 根据条件查询镜像安装模板 +func (repo *MySQLRepo) GetImageTemplatesByCond(cond *model.CommonTemplateCond) (templates []*model.ImageTemplate, err error) { + db := repo.db.Model(&model.CommonTemplateCond{}) + + if cond.Name != "" { + db = db.Where("name like ?", fmt.Sprintf("%s%%s%%", cond.Name)) + } + + if cond.BootMode != "" { + db = db.Where("boot_mode = ?", cond.BootMode) + } + + if cond.Family != "" { + db = db.Where("family = ?", cond.Family) + } + + if cond.OSLifecycle != "" { + db = db.Where("os_lifecycle IN (?)", mystrings.MultiLines2Slice(cond.OSLifecycle)) + } + if cond.Arch != "" { + db = db.Where("arch = ?", cond.Arch) + } + + if err := db.Find(&templates).Error; err != nil { + repo.log.Error(err) + return nil, err + } + + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/permission.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/permission.go new file mode 100644 index 0000000000000000000000000000000000000000..f644691b6544c987b2f53283fed58226f47deaca --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/permission.go @@ -0,0 +1,35 @@ +package mysqlrepo + +import ( + "github.com/voidint/page" + "idcos.io/cloudboot/model" +) + +// GetPermissionCodes 返回满足过滤条件的权限码 +func (repo *MySQLRepo) GetPermissionCodes(cond *model.PermissionCode, orderby model.OrderBy, limiter *page.Limiter) (items []*model.PermissionCode, err error) { + db := repo.db.Model(&model.PermissionCode{}) + if cond != nil { + if cond.PID >= 0 { + db = db.Where("pid = ?", cond.PID) + } + if cond.Code != "" { + db = db.Where("code = ?", cond.Code) + } + if cond.Title != "" { + db = db.Where("title LIKE ?", "%"+cond.Title+"%") + } + } + + for i := range orderby { + db = db.Order(orderby[i].String()) + } + if limiter != nil { + db = db.Limit(limiter.Limit).Offset(limiter.Offset) + } + + if err = db.Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/platform_config.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/platform_config.go new file mode 100644 index 0000000000000000000000000000000000000000..f819084b914c040db85a10330195f2651035fdda --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/platform_config.go @@ -0,0 +1,19 @@ +package mysqlrepo + +import ( + "github.com/jinzhu/gorm" + + "idcos.io/cloudboot/model" +) + +// GetPlatformConfigByName 返回指定名称的配置对象 +func (repo *MySQLRepo) GetPlatformConfigByName(name string) (*model.PlatformConfig, error) { + var pc model.PlatformConfig + if err := repo.db.Where("name = ?", name).Find(&pc).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &pc, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/repo.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/repo.go new file mode 100644 index 0000000000000000000000000000000000000000..4e05d3416198356997cec5ba9c1c1e591867fa83 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/repo.go @@ -0,0 +1,69 @@ +package mysqlrepo + +import ( + "database/sql" + + + "github.com/jinzhu/gorm" + + "idcos.io/cloudboot/config" + "idcos.io/cloudboot/logger" +) + +// MySQLRepo mysql数据库实现 +type MySQLRepo struct { + log logger.Logger + db *gorm.DB +} + +// NewRepo 创建mysql数据实现实例 +func NewRepo(conf *config.Config, log logger.Logger) (repo *MySQLRepo, err error) { + connection := conf.Repo.Connection + + db, err := gorm.Open("mysql", connection) + if err != nil { + log.Errorf("database connection failed:%s", err.Error()) + return nil, err + } + if conf.Repo.Debug { + db.LogMode(true) + if conf.Repo.LogDestination != "" && conf.Repo.LogDestination != config.ConsoleLog { + db.SetLogger(logger.NewBeeLogger(&config.Logger{ + Level: "debug", + LogFile: conf.Repo.LogDestination, + FilePerm: conf.Logger.FilePerm, + })) + } + } + return &MySQLRepo{ + log: log, + db: db, + }, nil +} + +// NewRepoWithDB 创建新实例 +func NewRepoWithDB(log logger.Logger, rawDB *sql.DB, debug bool) (*MySQLRepo, error) { + db, err := gorm.Open("mysql", rawDB) + if err != nil { + log.Errorf("database connection failed:%s", err.Error()) + return nil, err + } + if debug { + db.LogMode(true) + } + return &MySQLRepo{ + // conf: conf, + log: log, + db: db, + }, nil +} + +// Close 关闭mysql连接 +func (repo *MySQLRepo) Close() error { + return repo.db.Close() +} + +// DropDB 删除表 +func (repo *MySQLRepo) DropDB() error { + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/server_cabinet.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/server_cabinet.go new file mode 100644 index 0000000000000000000000000000000000000000..ff82d08445589ba64043fcaa680da7c42c43734f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/server_cabinet.go @@ -0,0 +1,294 @@ +package mysqlrepo + +import ( + "time" + + "github.com/jinzhu/gorm" + "github.com/voidint/page" + + "fmt" + + "idcos.io/cloudboot/model" +) + +// RemoveServerCabinetByID 删除指定ID的机架(柜) +func (repo *MySQLRepo) RemoveServerCabinetByID(id uint) (affected int64, err error) { + db := repo.db.Unscoped().Delete(&model.ServerCabinet{}, "id = ?", id) + if err = db.Error; err != nil { + repo.log.Error(err) + return 0, err + } + return db.RowsAffected, nil +} + +//GetServerCabinetCountByServerRoomID 根据给定的机房获取机房内的机架(柜)数 +func (repo *MySQLRepo) GetServerCabinetCountByServerRoomID(id uint) (count int64, err error) { + + if err := repo.db.Model(&model.ServerCabinet{}).Where("server_room_id = ?", id).Select("id").Count(&count).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return 0, err + } + return count, nil +} + +// SaveServerCabinet 保存机架(柜) +func (repo *MySQLRepo) SaveServerCabinet(cabinet *model.ServerCabinet) (affected int64, err error) { + if cabinet.ID > 0 { + // 更新 + db := repo.db.Model(&model.ServerCabinet{}).Where("id = ?", cabinet.ID).Updates(cabinet) + if err = db.Error; err != nil { + repo.log.Error(err) + return db.RowsAffected, err + } + return db.RowsAffected, nil + } + // 新增 + db := repo.db.Create(cabinet) + if err = db.Error; err != nil { + repo.log.Error(err) + return db.RowsAffected, err + } + return db.RowsAffected, nil +} + +// GetServerCabinetByID 返回指定ID的机架(柜) +func (repo *MySQLRepo) GetServerCabinetByID(id uint) (*model.ServerCabinet, error) { + var cabinet model.ServerCabinet + if err := repo.db.Where("id = ?", id).Find(&cabinet).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &cabinet, nil +} + +// GetServerCabinetByNumber 返回指定编号的机架(柜) +func (repo *MySQLRepo) GetServerCabinetByNumber(serverRoomID uint, number string) (*model.ServerCabinet, error) { + var cabinet model.ServerCabinet + if err := repo.db.Where("server_room_id = ? AND number = ? ", serverRoomID, number).Find(&cabinet).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &cabinet, nil +} + +//UpdateServerCabinetStatus 批量修改机架(柜)状态 +func (repo *MySQLRepo) UpdateServerCabinetStatus(ids []uint, status string) (affected int64, err error) { + tx := repo.db.Begin() + time := time.Now() + //if err = tx.Model(&model.ServerCabinet{}).Where("id in (?)", ids).Update(&model.ServerCabinet{ + // EnableTime: &time, + // Status: status, + // IsEnabled: isEnabled, + //}).Error; err != nil { + // tx.Rollback() + // repo.log.Error(err) + // return affected, err + //} + // 针对已锁定的机柜,将其关联的非已使用的机位状态修改为不可用 + if status == model.CabinetStatLocked { + if err = tx.Model(&model.ServerCabinet{}).Where("id in (?)", ids).Update(&model.ServerCabinet{ + Status: status, + }).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return affected, err + } + db := repo.db.Model(&model.ServerUSite{}).Where("server_cabinet_id in (?)", ids).Where("status != (?)", model.USiteStatUsed).Update("status", model.USiteStatDisabled) + if err = db.Error; err != nil { + repo.log.Error(err) + tx.Rollback() + return affected, err + } + } else { + isEnabled := model.NO + switch status { + case model.CabinetStatEnabled: + isEnabled = model.YES + case model.CabinetStatNotEnabled: + isEnabled = model.NO + } + if err = tx.Model(&model.ServerCabinet{}).Where("id in (?)", ids).Update(&model.ServerCabinet{ + EnableTime: &time, + Status: status, + IsEnabled: isEnabled, + }).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return affected, err + } + } + affected = tx.RowsAffected + return affected, tx.Commit().Error +} + +// GetServerCabinetID 根据条件返回机架(柜)ID,如果不存在则返回0 +func (repo *MySQLRepo) GetServerCabinetID(cond *model.ServerCabinet) (id []uint, err error) { + db := repo.db.Model(&model.ServerCabinet{}) + if cond != nil { + if cond.IDCID > 0 { + db = db.Where("idc_id = ?", cond.IDCID) + } + if cond.ServerRoomID > 0 { + db = db.Where("server_room_id = ?", cond.ServerRoomID) + } + if cond.NetworkAreaID > 0 { + db = db.Where("network_area_id = ?", cond.NetworkAreaID) + } + //if cond.Number != "" { + // db = db.Where("number = ?", cond.Number) + //} + //if cond.Type != "" { + // db = db.Where("type = ?", cond.Type) + //} + //if cond.Status != "" { + // db = db.Where("status = ?", cond.Status) + //} + //if cond.IsEnabled != "" { + // db = db.Where("is_enabled = ?", cond.IsEnabled) + //} + //if cond.IsPowered != "" { + // db = db.Where("is_powered = ?", cond.IsPowered) + //} + db = MultiQuery(db, "number", cond.Number) + db = MultiEnumQuery(db, "type", cond.Type) + db = MultiEnumQuery(db, "status", cond.Status) + db = MultiEnumQuery(db, "is_enabled", cond.IsEnabled) + db = MultiEnumQuery(db, "is_powered", cond.IsPowered) + } + if err = db.Pluck("id", &id).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return id, nil +} + +// CountServerCabinets 统计满足过滤条件的机架(柜)数量 +func (repo *MySQLRepo) CountServerCabinets(cond *model.ServerCabinetCond) (count int64, err error) { + db := repo.db.Model(&model.ServerCabinet{}) + db = addServerCabinetCond(db, cond) + if err = db.Select("id").Count(&count).Error; err != nil { + repo.log.Error(err) + return count, err + } + return count, nil +} + +func addServerCabinetCond(db *gorm.DB, cond *model.ServerCabinetCond) *gorm.DB { + if cond.ServerRoomName != "" { + db = db.Joins("left join server_room on server_room.id = server_cabinet.server_room_id") + } + if cond.NetworkAreaName != "" { + db = db.Joins("left join network_area on network_area.id = server_cabinet.network_area_id") + } + if cond != nil { + db = MultiNumQuery(db, "server_cabinet.idc_id", cond.IDCID) + db = MultiNumQuery(db, "server_cabinet.server_room_id", cond.ServerRoomID) + db = MultiNumQuery(db, "server_cabinet.id", cond.ServerCabinetID) + db = MultiQuery(db, "server_room.name", cond.ServerRoomName) + db = MultiNumQuery(db, "network_area_id", cond.NetworkAreaID) + db = MultiQuery(db, "network_area.name", cond.NetworkAreaName) + db = MultiQuery(db, "number", cond.Number) + db = MultiEnumQuery(db, "type", cond.Type) + db = MultiEnumQuery(db, "status", cond.Status) + db = MultiEnumQuery(db, "is_enabled", cond.IsEnabled) + db = MultiEnumQuery(db, "is_powered", cond.IsPowered) + } + return db +} + +// GetServerCabinets 返回满足过滤条件的机架(柜) +func (repo *MySQLRepo) GetServerCabinets(cond *model.ServerCabinetCond, orderby model.OrderBy, limiter *page.Limiter) (items []*model.ServerCabinet, err error) { + db := repo.db.Model(&model.ServerCabinet{}) + db = addServerCabinetCond(db, cond) + for i := range orderby { + db = db.Order(orderby[i].String()) + } + if limiter != nil { + db = db.Limit(limiter.Limit).Offset(limiter.Offset) + } + + if err = db.Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} + +//按照可用机位数倒序的方式查询指定机房下的机架列表 +func (repo *MySQLRepo) GetCabinetOrderByFreeUsites(req *model.ServerCabinet, physicalArea string) (mod []*model.OrderedCabientResp, err error) { + mod = make([]*model.OrderedCabientResp, 0) + rawSQL := fmt.Sprintf(`select server_cabinet.*,count(server_usite.number) as available_usite_count + from server_cabinet right join server_usite on server_cabinet.id = server_usite.server_cabinet_id + where server_usite.status = 'free' and server_cabinet.idc_id = %d + and server_cabinet.server_room_id = %d + and server_usite.physical_area = '%s' + group by server_cabinet.id order by available_usite_count desc;`, + req.IDCID, + req.ServerRoomID, + physicalArea) + + err = repo.db.Raw(rawSQL).Scan(&mod).Error + return +} + +//PowerOnServerCabinetByID 根据ID将机架(柜)上电 +func (repo *MySQLRepo) PowerOnServerCabinetByID(ids []uint) (affected int64, err error) { + time := time.Now() + db := repo.db.Model(&model.ServerCabinet{}).Where("id in (?)", ids).Update(&model.ServerCabinet{ + PowerOnTime: &time, + IsPowered: model.CabinetPowerOn, + }) + if db.Error != nil { + repo.log.Error(db.Error) + return 0, db.Error + } + return db.RowsAffected, nil +} + +//PowerOffServerCabinetByID 根据ID将机架(柜)下电 +func (repo *MySQLRepo) PowerOffServerCabinetByID(id uint) (affected int64, err error) { + time := time.Now() + db := repo.db.Model(&model.ServerCabinet{}).Where("id = ?", id).Update(&model.ServerCabinet{ + PowerOffTime: &time, + IsPowered: model.CabinetPowerOff, + }) + if db.Error != nil { + repo.log.Error(db.Error) + return 0, db.Error + } + return db.RowsAffected, nil +} + +//UpdateServerCabinetType 批量修改机架(柜)类型 +func (repo *MySQLRepo) UpdateServerCabinetType(ids []uint, typ string) (affected int64, err error) { + tx := repo.db.Begin() + if err = tx.Model(&model.ServerCabinet{}).Where("id in (?)", ids).Update(&model.ServerCabinet{ + Type: typ, + }).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return affected, err + } + affected = tx.RowsAffected + return affected, tx.Commit().Error +} + +//UpdateServerCabinetRemark 批量修改机架(柜)备注信息 +func (repo *MySQLRepo) UpdateServerCabinetRemark(ids []uint, remark string) (affected int64, err error) { + tx := repo.db.Begin() + if err = tx.Model(&model.ServerCabinet{}).Where("id in (?)", ids).Update(&model.ServerCabinet{ + Remark: remark, + }).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return affected, err + } + affected = tx.RowsAffected + return affected, tx.Commit().Error +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/server_room.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/server_room.go new file mode 100644 index 0000000000000000000000000000000000000000..eb5e267e716622491ace349836c134bd6b685ea7 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/server_room.go @@ -0,0 +1,146 @@ +package mysqlrepo + +import ( + "github.com/jinzhu/gorm" + "github.com/voidint/page" + + "idcos.io/cloudboot/model" +) + +// RemoveServerRoomByID 删除指定ID的机房 +func (repo *MySQLRepo) RemoveServerRoomByID(id uint) (affected int64, err error) { + // TODO 待实现 + tx := repo.db.Begin() + if err = tx.Unscoped().Where("id = ?", id).Delete(&model.ServerRoom{}).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return affected, err + } + affected = tx.RowsAffected + return affected, tx.Commit().Error +} + +//UpdateServerRoom 更新机房 +func (repo *MySQLRepo) UpdateServerRoom(srs []*model.ServerRoom) (affected int64, err error) { + tx := repo.db.Begin() + for k := range srs { + if err = tx.Model(&model.ServerRoom{}).Where("id = ?", srs[k].ID).Updates(srs[k]).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return affected, err + } + } + affected = tx.RowsAffected + return affected, tx.Commit().Error +} + +// SaveServerRoom 保存机房 +func (repo *MySQLRepo) SaveServerRoom(sr *model.ServerRoom) (affected int64, err error) { + tx := repo.db.Begin() + if err = tx.Create(sr).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return affected, err + } + affected = tx.RowsAffected + return affected, tx.Commit().Error +} + +// UpdateServerRoomStatus 批量更新机房状态 +func (repo *MySQLRepo) UpdateServerRoomStatus(status string, ids ...uint) (affected int64, err error) { + tx := repo.db.Begin() + if err = tx.Model(&model.ServerRoom{}).Where("id in (?)", ids).Update("status", status).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return affected, err + } + affected = tx.RowsAffected + return affected, tx.Commit().Error +} + +// GetServerRoomByID 返回指定ID的机房 +func (repo *MySQLRepo) GetServerRoomByID(id uint) (*model.ServerRoom, error) { + var room model.ServerRoom + if err := repo.db.Where("id = ?", id).Find(&room).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &room, nil +} + +// GetServerRoomByName 返回指定Name的机房 +func (repo *MySQLRepo) GetServerRoomByName(Name string) (*model.ServerRoom, error) { + var room model.ServerRoom + if err := repo.db.Where("name = ?", Name).Find(&room).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &room, nil +} + +// CountServerRooms 统计满足过滤条件的机房数量 +func (repo *MySQLRepo) CountServerRooms(cond *model.ServerRoomCond) (count int64, err error) { + + db := repo.db.Model(&model.ServerRoom{}) + + if cond != nil { + db = MultiNumQuery(db, "id", cond.ID) + db = MultiNumQuery(db, "idc_id", cond.IDCID) + db = MultiNumQuery(db, "first_server_room", cond.FirstServerRoom) + db = MultiQuery(db, "name", cond.Name) + db = MultiQuery(db, "city", cond.City) + db = MultiQuery(db, "address", cond.Address) + db = MultiQuery(db, "server_room_manager", cond.ServerRoomManager) + db = MultiQuery(db, "vendor_manager", cond.VendorManager) + db = MultiQuery(db, "network_asset_manager", cond.NetworkAssetManager) + db = MultiQuery(db, "support_phone_number", cond.SupportPhoneNumber) + db = MultiEnumQuery(db, "status", cond.Status) + db = MultiQuery(db, "creator", cond.Creator) + } + + if err = db.Select("id").Count(&count).Error; err != nil { + repo.log.Error(err) + return count, err + } + return count, nil +} + +// GetServerRooms 返回满足过滤条件的机房 +func (repo *MySQLRepo) GetServerRooms(cond *model.ServerRoomCond, orderby model.OrderBy, limiter *page.Limiter) (items []*model.ServerRoom, err error) { + db := repo.db.Model(&model.ServerRoom{}) + + if cond != nil { + db = MultiNumQuery(db, "id", cond.ID) + db = MultiNumQuery(db, "idc_id", cond.IDCID) + db = MultiNumQuery(db, "first_server_room", cond.FirstServerRoom) + db = MultiQuery(db, "name", cond.Name) + db = MultiQuery(db, "city", cond.City) + db = MultiQuery(db, "address", cond.Address) + db = MultiQuery(db, "server_room_manager", cond.ServerRoomManager) + db = MultiQuery(db, "vendor_manager", cond.VendorManager) + db = MultiQuery(db, "network_asset_manager", cond.NetworkAssetManager) + db = MultiQuery(db, "support_phone_number", cond.SupportPhoneNumber) + db = MultiEnumQuery(db, "status", cond.Status) + db = MultiQuery(db, "creator", cond.Creator) + } + + for k := range orderby { + db = db.Order(orderby[k].String()) + } + + if limiter != nil { + db = db.Limit(limiter.Limit) + db = db.Offset(limiter.Offset) + } + + if err = db.Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + + return items, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/server_usite.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/server_usite.go new file mode 100644 index 0000000000000000000000000000000000000000..0eaba27b3401085613836e56c7e224f6239f33f3 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/server_usite.go @@ -0,0 +1,234 @@ +package mysqlrepo + +import ( + "fmt" + "strings" + + "github.com/jinzhu/gorm" + "github.com/voidint/page" + "idcos.io/cloudboot/utils" + + "idcos.io/cloudboot/model" +) + +//GetServerUSiteCountByServerCabinetID 根据给定的机架获取机架上的机位数 +func (repo *MySQLRepo) GetServerUSiteCountByServerCabinetID(id uint) (count int64, err error) { + + if err := repo.db.Model(&model.ServerUSite{}).Where("server_cabinet_id = ?", id).Select("id").Count(&count).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return 0, err + } + return count, nil +} + +// SaveServerUSite 保存机位(U位) +func (repo *MySQLRepo) SaveServerUSite(usite *model.ServerUSite) (affected int64, err error) { + if usite.ID > 0 { + // 更新 + db := repo.db.Model(&model.ServerUSite{}).Where("id = ?", usite.ID).Updates(usite) + if err = db.Error; err != nil { + repo.log.Error(err) + return db.RowsAffected, err + } + return db.RowsAffected, nil + } + // 新增 + db := repo.db.Create(usite) + if err = db.Error; err != nil { + repo.log.Error(err) + return db.RowsAffected, err + } + return db.RowsAffected, nil +} + +// GetServerUSiteID 返回满足过滤条件的机位(U位)ID 不支持模糊查找 +func (repo *MySQLRepo) GetServerUSiteID(cond *model.ServerUSite) (id []uint, err error) { + db := repo.db.Model(&model.ServerUSite{}) + if cond != nil { + if cond.IDCID > 0 { + db = db.Where("idc_id = ?", cond.IDCID) + } + if cond.ServerRoomID > 0 { + db = db.Where("server_room_id = ?", cond.ServerRoomID) + } + if cond.ServerCabinetID > 0 { + db = db.Where("server_cabinet_id = ?", cond.ServerCabinetID) + } + if cond.Number != "" { + db = db.Where("number = ?", cond.Number) + } + } + + if err = db.Pluck("id", &id).Error; err != nil { + repo.log.Error(err) + return id, err + } + return id, nil +} + +// GetServerUSiteByID 返回指定ID的机位(U位) +func (repo *MySQLRepo) GetServerUSiteByID(id uint) (*model.ServerUSite, error) { + var usite model.ServerUSite + if err := repo.db.Where("id = ?", id).Find(&usite).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &usite, nil +} + +// GetServerUSiteByNumber 返回指定机架及编号的机位(U位) +func (repo *MySQLRepo) GetServerUSiteByNumber(cabinetID uint, number string) (*model.ServerUSite, error) { + var usite model.ServerUSite + if err := repo.db.Where("server_cabinet_id = ? AND number = ?", cabinetID, number).Find(&usite).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &usite, nil +} + +// BatchUpdateServerUSitesStatus 批量更新机位状态信息 +func (repo *MySQLRepo) BatchUpdateServerUSitesStatus(ids []uint, status string) (affected int64, err error) { + db := repo.db.Model(&model.ServerUSite{}).Where("id in (?)", ids).Update("status", status) + if err = db.Error; err != nil { + repo.log.Error(err) + return 0, err + } + return db.RowsAffected, nil +} + +// DeleteServerUSitePort 删除机位端口号 +func (repo *MySQLRepo) DeleteServerUSitePort(id uint) (affected int64, err error) { + var nullArray []*model.SwitchInfo + + db := repo.db.Model(&model.ServerUSite{}).Where("id = ?", id).Updates(map[string]interface{}{ + "oobnet_switches": utils.ToJsonString(nullArray), + "intranet_switches": utils.ToJsonString(nullArray), + "extranet_switches": utils.ToJsonString(nullArray), + }) + if err = db.Error; err != nil { + repo.log.Error(err) + return 0, err + } + return db.RowsAffected, nil +} + +// RemoveServerUSiteByID 删除机位 +func (repo *MySQLRepo) RemoveServerUSiteByID(id uint) (affected int64, err error) { + db := repo.db.Unscoped().Delete(&model.ServerUSite{}, "id = ? ", id) + if err = db.Error; err != nil { + repo.log.Error(err) + return 0, err + } + return db.RowsAffected, nil +} + +// CountServerUSite 统计机位数量 +func (repo *MySQLRepo) CountServerUSite(cond *model.CombinedServerUSite) (count int64, err error) { + db := repo.db.Table("server_usite"). + Joins("left join server_cabinet cabinet on cabinet.id = server_usite.server_cabinet_id") + + db = addUsiteCond(db, cond) + + if err = db.Select("server_usite.id").Count(&count).Error; err != nil { + repo.log.Error(err) + return count, err + } + + return count, nil +} + +// GetServerUSiteByCond 查询机位信息 +func (repo *MySQLRepo) GetServerUSiteByCond(cond *model.CombinedServerUSite, orderby model.OrderBy, limiter *page.Limiter) (items []*model.ServerUSite, err error) { + db := repo.db.Table("server_usite"). + Joins("left join server_cabinet cabinet on cabinet.id = server_usite.server_cabinet_id") + + db = addUsiteCond(db, cond) + + for i := range orderby { + db = db.Order(orderby[i].String()) + } + if limiter != nil { + db = db.Limit(limiter.Limit).Offset(limiter.Offset) + } + + if err = db.Select("server_usite.*").Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + + return items, nil +} + +// addUsiteCond 添加机位查询条件 +func addUsiteCond(db *gorm.DB, cond *model.CombinedServerUSite) *gorm.DB { + if cond.ServerRoomName != "" { + db = db.Joins("left join server_room on server_room.id = server_usite.server_room_id") + } + if cond.ServerRoomNameCabinetNumUSiteNumSlice != nil || cond.ServerRoomNameCabinetNumUSiteNum != "" { + db = db.Joins("LEFT JOIN server_room room ON room.id = server_usite.server_room_id") + } + if cond != nil { + db = MultiNumQuery(db, "server_usite.idc_id", cond.IDCID) + db = MultiNumQuery(db, "server_usite.server_room_id", cond.ServerRoomID) + db = MultiQuery(db, "server_room.name", cond.ServerRoomName) + db = ConcatColumnStringQuery(db, "room.name, cabinet.number, server_usite.number", cond.ServerRoomNameCabinetNumUSiteNum) + db = ConcatColumnSliceStringQuery(db, "room.name, cabinet.number, server_usite.number", cond.ServerRoomNameCabinetNumUSiteNumSlice) + db = MultiNumQuery(db, "server_usite.server_cabinet_id", cond.ServerCabinetID) + db = MultiNumQuery(db, "server_usite.network_area_id", cond.NetAreaID) + db = MultiQuery(db, "cabinet.number", cond.CabinetNumber) + db = MultiEnumQuery(db, "server_usite.status", cond.Status) + db = MultiEnumQuery(db, "server_usite.la_wa_port_rate", cond.LAWAPortRate) + db = MultiMatchWithSpaceQuery(db, "server_usite.physical_area", cond.PhysicalArea) + db = MultiEnumQuery(db, "server_usite.height", cond.Height) + db = MultiMatchQuery(db, "server_usite.number", cond.USiteNumber) + } + db = db.Where("server_usite.deleted_at is null ") + + return db +} + +// GetServerUsiteByNetworkDeviceName 根据指定的网络设备返回机位ID +func (repo *MySQLRepo) GetServerUsiteByNetworkDeviceName(name []string) (nd []uint, err error) { + nd = make([]uint, 0) + sql := `select DISTINCT(id) from (select TRIM(BOTH '"' FROM name->'$[0]') as name, id from (select intranet_switches->'$[*].name' as name, id from server_usite) as ali) as alii where ` + for i := range name { + name[i] = fmt.Sprintf("'%s'", name[i]) + } + rawsql := fmt.Sprintf("%s name IN(%s)", sql, strings.Join(name, ",")) + repo.log.Debugf(rawsql) + if err = repo.db.Raw(rawsql).Pluck("id", &nd).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return nd, err +} + +func (repo *MySQLRepo) GetPhysicalAreas() (*model.DeviceQueryParamResp, error) { + p := model.DeviceQueryParamResp{} + p.ParamName = "physical_area" + rawSQL := "" + mods := make([]model.ParamList, 0) + rawSQL = "select DISTINCT 0 AS id, physical_area AS name from server_usite" + _ = repo.db.Raw(rawSQL).Scan(&mods).Error + if len(mods) == 0 { + return nil, gorm.ErrRecordNotFound + } + p.List = mods + return &p, nil +} + +// BatchUpdateServerUSitesRemark 批量更新机位备注信息 +func (repo *MySQLRepo) BatchUpdateServerUSitesRemark(ids []uint, remark string) (affected int64, err error) { + db := repo.db.Model(&model.ServerUSite{}).Where("id in (?)", ids).Update("remark", remark) + if err = db.Error; err != nil { + repo.log.Error(err) + return 0, err + } + return db.RowsAffected, nil +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/store_room.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/store_room.go new file mode 100644 index 0000000000000000000000000000000000000000..c8a9714daf2697613cd3d63f4bd85b290c59b515 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/store_room.go @@ -0,0 +1,248 @@ +package mysqlrepo + +import ( + "github.com/jinzhu/gorm" + "github.com/voidint/page" + "idcos.io/cloudboot/model" +) + +// RemoveStoreRoomByID 删除指定ID的库房 +func (repo *MySQLRepo) RemoveStoreRoomByID(id uint) (affected int64, err error) { + tx := repo.db.Begin() + if err = tx.Unscoped().Where("id = ?", id).Delete(&model.StoreRoom{}).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return affected, err + } + affected = tx.RowsAffected + return affected, tx.Commit().Error +} + +//UpdateStoreRoom 更新库房 +func (repo *MySQLRepo) UpdateStoreRoom(srs []*model.StoreRoom) (affected int64, err error) { + tx := repo.db.Begin() + for k := range srs { + if err = tx.Model(&model.StoreRoom{}).Where("id = ?", srs[k].ID).Updates(srs[k]).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return affected, err + } + } + affected = tx.RowsAffected + return affected, tx.Commit().Error +} + +// SaveStoreRoom 保存库房 +func (repo *MySQLRepo) SaveStoreRoom(sr *model.StoreRoom) (affected int64, err error) { + tx := repo.db.Begin() + if err = tx.Create(sr).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return affected, err + } + affected = tx.RowsAffected + return affected, tx.Commit().Error +} + +// GetStoreRoomByID 返回指定ID的库房 +func (repo *MySQLRepo) GetStoreRoomByID(id uint) (*model.StoreRoom, error) { + var room model.StoreRoom + if err := repo.db.Where("id = ?", id).Find(&room).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &room, nil +} + +// GetStoreRoomByName 返回指定Name的库房 +func (repo *MySQLRepo) GetStoreRoomByName(n string) (*model.StoreRoom, error) { + var room model.StoreRoom + if err := repo.db.Where("name = ?", n).First(&room).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &room, nil +} + +// CountStoreRooms 统计满足过滤条件的库房数量 +func (repo *MySQLRepo) CountStoreRooms(cond *model.StoreRoomCond) (count int64, err error) { + + db := repo.db.Model(&model.StoreRoom{}) + + if cond != nil { + db = MultiNumQuery(db, "id", cond.ID) + db = MultiNumQuery(db, "idc_id", cond.IDCID) + db = MultiQuery(db, "first_server_room", cond.FirstServerRoom) + db = MultiQuery(db, "name", cond.Name) + db = MultiQuery(db, "city", cond.City) + db = MultiQuery(db, "address", cond.Address) + db = MultiQuery(db, "store_room_manager", cond.StoreRoomManager) + db = MultiQuery(db, "vendor_manager", cond.VendorManager) + db = MultiEnumQuery(db, "status", cond.Status) + db = MultiQuery(db, "creator", cond.Creator) + } + + if err = db.Select("id").Count(&count).Error; err != nil { + repo.log.Error(err) + return count, err + } + return count, nil +} + +// GetStoreRooms 返回满足过滤条件的库房 +func (repo *MySQLRepo) GetStoreRooms(cond *model.StoreRoomCond, orderby model.OrderBy, limiter *page.Limiter) (items []*model.StoreRoom, err error) { + db := repo.db.Model(&model.StoreRoom{}) + + if cond != nil { + db = MultiNumQuery(db, "id", cond.ID) + db = MultiNumQuery(db, "idc_id", cond.IDCID) + db = MultiQuery(db, "first_server_room", cond.FirstServerRoom) + db = MultiQuery(db, "name", cond.Name) + db = MultiQuery(db, "city", cond.City) + db = MultiQuery(db, "address", cond.Address) + db = MultiQuery(db, "store_room_manager", cond.StoreRoomManager) + db = MultiQuery(db, "vendor_manager", cond.VendorManager) + db = MultiEnumQuery(db, "status", cond.Status) + db = MultiQuery(db, "creator", cond.Creator) + } + + for k := range orderby { + db = db.Order(orderby[k].String()) + } + + if limiter != nil { + db = db.Limit(limiter.Limit) + db = db.Offset(limiter.Offset) + } + + if err = db.Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + + return items, nil +} + +//SaveVirtualCabinet 新增虚拟货架 +func (repo *MySQLRepo) SaveVirtualCabinet(sr *model.VirtualCabinet) (affected int64, err error) { + tx := repo.db.Begin() + if err = tx.Create(sr).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return affected, err + } + affected = tx.RowsAffected + return affected, tx.Commit().Error +} + +// RemoveVirtualCabinetByID 删除指定ID的虚拟货架 +func (repo *MySQLRepo) RemoveVirtualCabinetByID(id uint) (affected int64, err error) { + tx := repo.db.Begin() + if err = tx.Unscoped().Where("id = ?", id).Delete(&model.VirtualCabinet{}).Error; err != nil { + tx.Rollback() + repo.log.Error(err) + return affected, err + } + affected = tx.RowsAffected + return affected, tx.Commit().Error +} + +// CountVirtualCabinets 统计满足过滤条件的虚拟货架数量 +func (repo *MySQLRepo) CountVirtualCabinets(cond *model.VirtualCabinet) (count int64, err error) { + + db := repo.db.Model(&model.VirtualCabinet{}) + + if cond != nil { + if cond.StoreRoomID != 0 { + //待补充 + db = db.Where("store_room_id = ?", cond.StoreRoomID) + } + } + + if err = db.Select("id").Count(&count).Error; err != nil { + repo.log.Error(err) + return count, err + } + return count, nil +} + +// GetVirtualCabinets 返回满足过滤条件的库房 +func (repo *MySQLRepo) GetVirtualCabinets(cond *model.VirtualCabinet, orderby model.OrderBy, limiter *page.Limiter) (items []*model.VirtualCabinet, err error) { + db := repo.db.Model(&model.VirtualCabinet{}) + + if cond != nil { + if cond.StoreRoomID != 0 { + db = db.Where("store_room_id = ?", cond.StoreRoomID) + } + if cond.Number != "" { + db = db.Where("number = ?", cond.Number) + } + } + + for k := range orderby { + db = db.Order(orderby[k].String()) + } + + if limiter != nil { + db = db.Limit(limiter.Limit) + db = db.Offset(limiter.Offset) + } + + if err = db.Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + + return items, nil +} + +// GetVirtualCabinetByID 返回指定ID的虚拟货架 +func (repo *MySQLRepo) GetVirtualCabinetByID(id uint) (*model.VirtualCabinet, error) { + var vc model.VirtualCabinet + if err := repo.db.Where("id = ?", id).Find(&vc).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &vc, nil +} + + +// GetVirtualCabinetsByCond 返回满足过滤条件的库房 +func (repo *MySQLRepo) GetVirtualCabinetsByCond(cond *model.CombinedStoreRoomVirtualCabinet, orderby model.OrderBy, limiter *page.Limiter) (items []*model.VirtualCabinet, err error) { + db := repo.db.Model(&model.VirtualCabinet{}) + + if cond != nil { + if cond.StoreRoomName != "" { + db = db.Joins("left join store_room on virtual_cabinet.store_room_id = store_room.id") + db = db.Where("name = ?", cond.StoreRoomName) + } + if cond.StoreRoomID != 0 { + db = db.Where("store_room_id = ?", cond.StoreRoomID) + } + if cond.VirtualCabinetNumber != "" { + db = db.Where("number = ?", cond.VirtualCabinetNumber) + } + } + + for k := range orderby { + db = db.Order(orderby[k].String()) + } + + if limiter != nil { + db = db.Limit(limiter.Limit) + db = db.Offset(limiter.Offset) + } + + if err = db.Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + + return items, nil +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/system_setting.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/system_setting.go new file mode 100644 index 0000000000000000000000000000000000000000..ce91824f7b1a4fbed54d31b299daadd3ca2f7be7 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/system_setting.go @@ -0,0 +1,52 @@ +package mysqlrepo + +import ( + "encoding/json" + "strconv" + "strings" + + "github.com/jinzhu/gorm" + + "idcos.io/cloudboot/model" +) + +// GetSystemSetting 查询指定名称的系统配置 +func (repo *MySQLRepo) GetSystemSetting(key string) (*model.SystemSetting, error) { + var sett model.SystemSetting + if err := repo.db.Where("`key` = ?", key).Find(&sett).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &sett, nil +} + +// GetSystemSetting4InstallatonTimeout 查询安装超时时间的系统设置值。若发生错误或者值不存在,则返回默认值。 +func (repo *MySQLRepo) GetSystemSetting4InstallatonTimeout(defValue int64) (sec int64) { + sett, err := repo.GetSystemSetting(model.SysSettingInstallationTimeout) + if err != nil || sett == nil || sett.Value == "" { + return defValue + } + sec, err = strconv.ParseInt(strings.TrimSpace(sett.Value), 10, 64) + if err != nil { + return defValue + } + return sec +} + +// GetSystemSetting4AuthorizationAPIs 查询授权API配置 +func (repo *MySQLRepo) GetSystemSetting4AuthorizationAPIs() (items []*model.AuthorizationAPI, err error) { + value, err := repo.GetSystemSetting(model.SysSettingAuthorization) + if err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + if err = json.Unmarshal([]byte(value.Value), &items); err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/system_template.go b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/system_template.go new file mode 100644 index 0000000000000000000000000000000000000000..cdfadfaba82c29ea6dfc3273d24e7e34d211b605 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/mysqlrepo/system_template.go @@ -0,0 +1,189 @@ +package mysqlrepo + +import ( + "github.com/jinzhu/gorm" + "github.com/voidint/page" + "idcos.io/cloudboot/model" + mystrings "idcos.io/cloudboot/utils/strings" +) + +// RemoveSystemTemplate 删除指定ID的系统安装模板 +func (repo *MySQLRepo) RemoveSystemTemplate(id uint) (affected int64, err error) { + db := repo.db.Unscoped().Where("id = ?", id).Delete(&model.SystemTemplate{}) + if err = db.Error; err != nil { + repo.log.Error(err) + } + return db.RowsAffected, db.Error +} + +// SaveSystemTemplate 保存系统安装模板 +func (repo *MySQLRepo) SaveSystemTemplate(tpl *model.SystemTemplate) (id uint, err error) { + // 若ID为0,则新增。 + if tpl.ID == 0 { + if err = repo.db.Create(tpl).Error; err != nil { + repo.log.Error(err) + return 0, err + } + return 1, nil + } + // 若ID大于0,则更新。 + db := repo.db.Model(&model.SystemTemplate{}).Where("id = ?", tpl.ID).Updates(map[string]interface{}{ + "family": tpl.Family, + "name": tpl.Name, + "boot_mode": tpl.BootMode, + "username": tpl.Username, + "password": tpl.Password, + "content": tpl.Content, + "pxe": tpl.PXE, + "os_lifecycle": tpl.OSLifecycle, + "arch": tpl.Arch, + }) + if err = db.Error; err != nil { + repo.log.Error(err) + } + return tpl.ID, db.Error +} + +// GetSystemTemplateByID 返回指定ID的系统安装模板 +func (repo *MySQLRepo) GetSystemTemplateByID(id uint) (*model.SystemTemplate, error) { + var tpl model.SystemTemplate + if err := repo.db.Where("id = ?", id).Find(&tpl).Error; err != nil { + if err != gorm.ErrRecordNotFound { + repo.log.Error(err) + } + return nil, err + } + return &tpl, nil +} + +// CountSystemTemplates 统计满足过滤条件的系统安装模板数量 +func (repo *MySQLRepo) CountSystemTemplates(cond *model.SystemTemplate) (count int64, err error) { + db := repo.db.Model(&model.SystemTemplate{}) + if cond != nil { + if cond.Family != "" { + db = db.Where("family = ?", cond.Family) + } + if cond.Name != "" { + db = db.Where("name LIKE ?", "%"+cond.Name+"%") + } + if cond.BootMode == model.BootModeBIOS || cond.BootMode == model.BootModeUEFI { + db = db.Where("boot_mode = ?", cond.BootMode) + } + if cond.OSLifecycle != "" { + db = db.Where("os_lifecycle IN (?)", mystrings.MultiLines2Slice(cond.OSLifecycle)) + } + if cond.Arch != "" { + db = db.Where("arch = ?", cond.Arch) + } + } + + if err = db.Select("id").Count(&count).Error; err != nil { + repo.log.Error(err) + return count, err + } + return count, nil +} + +// GetSystemTemplates 返回满足过滤条件的系统安装模板 +func (repo *MySQLRepo) GetSystemTemplates(cond *model.SystemTemplate, orderby model.OrderBy, limiter *page.Limiter) (items []*model.SystemTemplate, err error) { + db := repo.db.Model(&model.SystemTemplate{}) + if cond != nil { + if cond.Family != "" { + db = db.Where("family = ?", cond.Family) + } + if cond.Name != "" { + db = db.Where("name LIKE ?", "%"+cond.Name+"%") + } + if cond.BootMode != "" { + db = db.Where("boot_mode = ?", cond.BootMode) + } + if cond.OSLifecycle != "" { + db = db.Where("os_lifecycle IN (?)", cond.OSLifecycle) + } + if cond.Arch != "" { + db = db.Where("arch = ?", cond.Arch) + } + } + + for i := range orderby { + db = db.Order(orderby[i].String()) + } + if limiter != nil { + db = db.Limit(limiter.Limit).Offset(limiter.Offset) + } + + if err = db.Find(&items).Error; err != nil { + repo.log.Error(err) + return nil, err + } + return items, nil +} + +// CountSystemTemplateByName 统计指定名称的系统模板 +func (repo *MySQLRepo) CountSystemTemplateByName(name string) (uint, error) { + mod := model.SystemTemplate{Name: name} + var count uint + err := repo.db.Model(mod).Where("name = ?", name).Count(&count).Error + return count, err +} + +// CountSystemTemplateByNameAndID 统计指定名称和ID的系统模板 +func (repo *MySQLRepo) CountSystemTemplateByNameAndID(name string, id uint) (uint, error) { + mod := model.SystemTemplate{} + var count uint + err := repo.db.Model(mod).Where("name = ? and id != ?", name, id).Count(&count).Error + return count, err +} + +// CountSystemTemplate 统计系统模板 +func (repo *MySQLRepo) CountSystemTemplate() (uint, error) { + mod := model.SystemTemplate{} + var count uint + err := repo.db.Model(mod).Count(&count).Error + return count, err +} + +// CountSystemTemplateByShield 统计指定shield系统模板 +func (repo *MySQLRepo) CountSystemTemplateByShield(cond *model.SystemTemplate) (uint, error) { + mod := model.SystemTemplate{} + var count uint + db := repo.db + if cond.Name != "" { + db.Where("name NOT like ?", cond.Name) + } + err := repo.db.Model(mod).Count(&count).Error + return count, err +} + +// GetSystemTemplateListWithPage 分页查询系统模板 +func (repo *MySQLRepo) GetSystemTemplateListWithPage(limit uint, offset uint) ([]model.SystemTemplate, error) { + var mods []model.SystemTemplate + err := repo.db.Limit(limit).Offset(offset).Find(&mods).Error + return mods, err +} + +// GetSystemTemplateListWithPageAndShield 分页查询指定shield系统模板 +func (repo *MySQLRepo) GetSystemTemplateListWithPageAndShield(limit uint, + offset uint, cond *model.SystemTemplate) ([]model.SystemTemplate, error) { + var mods []model.SystemTemplate + db := repo.db + if cond.Name != "" { + db = db.Where("name NOT LIKE ?", "%"+cond.Name+"%") + } + err := db.Limit(limit).Offset(offset).Find(&mods).Error + return mods, err +} + +// GetSystemTemplateIDByName 查询指定名称的模板ID +func (repo *MySQLRepo) GetSystemTemplateIDByName(name string) (uint, error) { + mod := model.SystemTemplate{Name: name} + err := repo.db.Where("name = ?", name).Find(&mod).Error + return mod.ID, err +} + +// GetSystemTemplateByName 查询指定名称的系统模板 +func (repo *MySQLRepo) GetSystemTemplateByName(name string) (*model.SystemTemplate, error) { + var mod model.SystemTemplate + err := repo.db.Where("name = ?", name).Find(&mod).Error + return &mod, err +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/network_area.go b/cyclone-server/src/idcos.io/cloudboot/model/network_area.go new file mode 100644 index 0000000000000000000000000000000000000000..9c9ce2e0ec78fe85aeeda30e963844cd50cac52e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/network_area.go @@ -0,0 +1,60 @@ +package model + +import ( + "github.com/jinzhu/gorm" + "github.com/voidint/page" +) + +const ( + // NetworkAreaStatNonProduction 网络区域状态-未投产 + NetworkAreaStatNonProduction = "nonproduction" + // NetworkAreaStatProduction 网络区域状态-已投产 + NetworkAreaStatProduction = "production" + // NetworkAreaStatOffline 网络区域状态-已经下线(回收) + NetworkAreaStatOffline = "offline" +) + +// NetworkArea 网络区域 +type NetworkArea struct { + gorm.Model + IDCID uint `gorm:"column:idc_id"` + ServerRoomID uint `gorm:"column:server_room_id"` + Name string `gorm:"column:name"` + PhysicalArea string `gorm:"column:physical_area"` + Status string `gorm:"column:status"` + Creator string `gorm:"column:creator"` +} + +// NetworkArea 网络区域搜索条件 +type NetworkAreaCond struct { + IDCID []uint `gorm:"column:idc_id"` + ServerRoomID []uint `gorm:"column:server_room_id"` + Name string `gorm:"column:name"` + PhysicalArea string `gorm:"column:physical_area"` + Status string `gorm:"column:status"` + Creator string `gorm:"column:creator"` + ServerRoomName string +} + +// TableName 指定数据库表名 +func (NetworkArea) TableName() string { + return "network_area" +} + +// INetworkArea 网络区域持久化接口 +type INetworkArea interface { + // RemoveNetworkAreaByID 删除指定ID的网络区域 + RemoveNetworkAreaByID(id uint) (affected int64, err error) + // SaveNetworkArea 保存网络区域 + SaveNetworkArea(*NetworkArea) (affected int64, err error) + // UpdateNetworkAreaStatus 批量更新网络区域状态 + UpdateNetworkAreaStatus(status string, ids ...uint) (affected int64, err error) + // GetNetworkAreaByID 返回指定ID的网络区域 + GetNetworkAreaByID(id uint) (*NetworkArea, error) + // GetNetworkAreasByCond 返回满足过滤条件的网络区域(不支持模糊查找) + GetNetworkAreasByCond(cond *NetworkArea) (item []*NetworkArea, err error) + // CountNetworkAreas 统计满足过滤条件的网络区域数量 + CountNetworkAreas(cond *NetworkAreaCond) (count int64, err error) + // GetNetworkAreas 返回满足过滤条件的网络区域 + GetNetworkAreas(cond *NetworkAreaCond, orderby OrderBy, limiter *page.Limiter) (items []*NetworkArea, err error) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/network_device.go b/cyclone-server/src/idcos.io/cloudboot/model/network_device.go new file mode 100644 index 0000000000000000000000000000000000000000..99b535c3fd8a336be5808d0c575e611f2f52ea24 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/network_device.go @@ -0,0 +1,79 @@ +package model + +import ( + "github.com/jinzhu/gorm" + "github.com/voidint/page" +) + +// NetworkDevice 网络设备 +type NetworkDevice struct { + gorm.Model + IDCID uint `gorm:"column:idc_id"` + ServerRoomID uint `gorm:"column:server_room_id"` + ServerCabinetID uint `gorm:"column:server_cabinet_id"` + FixedAssetNumber string `gorm:"column:fixed_asset_number"` + SN string `gorm:"column:sn"` + Name string `gorm:"column:name"` + ModelNumber string `gorm:"column:model"` + Vendor string `gorm:"column:vendor"` + OS string `gorm:"column:os"` + Type string `gorm:"column:type"` + TOR string `gorm:"column:tor"` + Usage string `gorm:"column:usage"` + Status string `gorm:"column:status"` //运营中、待启用 +} + +// NetworkDeviceCond 网络设备 +type NetworkDeviceCond struct { + gorm.Model + IDCID []uint `gorm:"column:idc_id"` + ServerRoomID []uint `gorm:"column:server_room_id"` + ServerRoomName string `gorm:"column:server_room_name"` + ServerCabinetID []uint `gorm:"column:server_cabinet_id"` + ServerCabinetNumber string + FixedAssetNumber string `gorm:"column:fixed_asset_number"` + SN string `gorm:"column:sn"` + Name string `gorm:"column:name"` + ModelNumber string `gorm:"column:model"` + Vendor string `gorm:"column:vendor"` + OS string `gorm:"column:os"` + Type string `gorm:"column:type"` + TOR string `gorm:"column:tor"` + Usage string `gorm:"column:usage"` + Status string `gorm:"column:status"` //运营中、待启用 +} + +// TableName 指定数据库表名 +func (NetworkDevice) TableName() string { + return "network_device" +} + +// INetworkDevice 网络区域持久化接口 +type INetworkDevice interface { + // GetNetworkDevicesByCond 返回满足过滤条件的网络设备(不支持模糊查找) + GetNetworkDevicesByCond(cond *NetworkDeviceCond, orderby OrderBy, limiter *page.Limiter) (item []*NetworkDevice, err error) + // CountNetworkDevices 统计满足过滤条件的网络设备数量 + CountNetworkDevices(cond *NetworkDeviceCond) (count int64, err error) + // RemoveNetworkDeviceByID 删除指定ID的网络设备 + RemoveNetworkDeviceByID(id uint) (err error) + // GetIntranetSwitchBySN 查询设备所在机位的内网交换机 + GetIntranetSwitchBySN(sn string) (*NetworkDevice, error) + // GetNetworkDeviceByID 查询指定ID的网络设备 + GetNetworkDeviceByID(id uint) (network *NetworkDevice, err error) + // GetExtranetSwitchBySN 查询设备所在机位的外网交换机 + GetExtranetSwitchBySN(sn string) (*NetworkDevice, error) + // SaveNetworkDevice 保存网络设备 + SaveNetworkDevice(na *NetworkDevice) (networkDevice *NetworkDevice, err error) + // GetNetworkDeviceBySN 查询指定sn的网络设备 + GetNetworkDeviceBySN(sn string) (network []*NetworkDevice, err error) + // GetNetworkDeviceByFixedAssetNumber 查询指定FixedAssetNumber的网络设备 + GetNetworkDeviceByFixedAssetNumber(FixedAssetNumber string) (network []*NetworkDevice, err error) + // GetTORs 返回所有的TOR名称列表 + GetTORs() (items []string, err error) + // GetTORBySN 返回目标设备所属的TOR名称 + GetTORBySN(sn string) (tor string, err error) + // 根据指定的tor返回对应的网络设备 + GetNetworkDeviceByTORS(tor ...string) (nd []*NetworkDevice, err error) + // 根据机架id查对端交换机,同时查出对端cabinetID + GetPeerNetworkDeviceByCabinetID(id uint) (*NetworkDevice, error) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/oob.go b/cyclone-server/src/idcos.io/cloudboot/model/oob.go new file mode 100644 index 0000000000000000000000000000000000000000..ec5eeb5e9db697ed060bf1daa99fe8ede4901e37 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/oob.go @@ -0,0 +1,35 @@ +package model + +import "github.com/jinzhu/gorm" + +type ( + // OOBHistory 带外修改历史 + OOBHistory struct { + gorm.Model + SN string `gorm:"column:sn"` + UsernameOld string `gorm:"column:username_old"` + UsernameNew string `gorm:"column:username_new"` + PasswordOld string `gorm:"column:password_old"` + PasswordNew string `gorm:"column:password_new"` + Remark string `gorm:"column:remark"` + Creator string `gorm:"column:creator"` + } +) + +// TableName 指定数据库表名 +func (OOBHistory) TableName() string { + return "device_oob_history" +} + +// IOOBHistory 带外修改历史接口 +type IOOBHistory interface { + // AddOOBHistory 新增带外修改历史-->改由触发器实现 + // AddOOBHistory(*OOBHistory) (affected int64, err error) + // GetLastOOBHistoryBySN 查询指定SN最近的一条修改记录,用以找到/确认当前的用户密码 + GetLastOOBHistoryBySN(sn string) (mod OOBHistory, err error) +} + +//const ( +// OOBHistoryRemarkManu = "手动修改带外密码" +// OOBHistoryRemarkAuto = "自动批量初始化带外密码" +//) diff --git a/cyclone-server/src/idcos.io/cloudboot/model/operate_log.go b/cyclone-server/src/idcos.io/cloudboot/model/operate_log.go new file mode 100644 index 0000000000000000000000000000000000000000..30487c013e2359179993cbd180d3639df4b1b1ec --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/operate_log.go @@ -0,0 +1,37 @@ +package model + +import ( + "time" + + "github.com/voidint/page" +) + +type ( + // OperateLog 操作记录 + OperateLog struct { + ID uint `gorm:"column:id" json:"id"` + CreatedAt time.Time `gorm:"column:created_at" json:"created_at"` + Operator string `gorm:"column:operator" json:"operator"` + URL string `gorm:"column:url" json:"url"` + HTTPMethod string `gorm:"column:http_method" json:"http_method"` + CategoryCode string `gorm:"column:category_code" json:"category_code"` + CategoryName string `gorm:"column:category_name" json:"category_name"` + Source string `gorm:"column:source" json:"source"` + Destination string `gorm:"column:destination" json:"destination"` + } +) + +// TableName 指定数据库表名 +func (OperateLog) TableName() string { + return "operation_log" +} + +// IOperateLog 操作记录持久化接口 +type IOperateLog interface { + // SaveOperateLog 保存操作记录 + SaveOperateLog(*OperateLog) (id uint, err error) + // CountOperateLog 统计满足过滤条件的操作记录数量 + CountOperateLog(cond *OperateLog) (count int64, err error) + // GetOperateLogByCond 返回满足过滤条件的操作记录 + GetOperateLogByCond(cond *OperateLog, orderby OrderBy, limiter *page.Limiter) (items []*OperateLog, err error) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/order.go b/cyclone-server/src/idcos.io/cloudboot/model/order.go new file mode 100644 index 0000000000000000000000000000000000000000..a2efc29ab8763036a1b7a2e8f656d81142ffc621 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/order.go @@ -0,0 +1,83 @@ +package model + +import ( + "time" + + "github.com/jinzhu/gorm" + "github.com/voidint/page" +) + +// Order 订单 +type Order struct { + gorm.Model + IDCID uint `gorm:"column:idc_id"` + ServerRoomID uint `gorm:"column:server_room_id"` + PhysicalArea string `gorm:"column:physical_area"` + Number string `gorm:"column:number"` + Usage string `gorm:"column:usage"` + Category string `gorm:"column:category"` + Amount int `gorm:"column:amount"` + LeftAmount int `gorm:"column:left_amount"` + ExpectedArrivalDate time.Time `gorm:"column:expected_arrival_date"` + PreOccupiedCabinets string `gorm:"column:pre_occupied_cabinets"` + PreOccupiedUsites string `gorm:"column:pre_occupied_usites"` + Remark string `gorm:"column:remark"` + Status string `gorm:"column:status"` + Creator string `gorm:"column:creator"` + //以下字段参考 DeviceLifecycle + AssetBelongs string `gorm:"column:asset_belongs"` + Owner string `gorm:"column:owner"` + IsRental string `gorm:"column:is_rental"` + MaintenanceServiceProvider string `gorm:"column:maintenance_service_provider"` + MaintenanceService string `gorm:"column:maintenance_service"` + LogisticsService string `gorm:"column:logistics_service"` + MaintenanceServiceDateBegin time.Time `gorm:"column:maintenance_service_date_begin"` + MaintenanceServiceDateEnd time.Time `gorm:"column:maintenance_service_date_end"` +} + +// OrderCond 订单查询条件 +type OrderCond struct { + Order + ID []uint +} + +// TableName 指定数据库表名 +func (Order) TableName() string { + return "order" +} + +// IOrder 订单持久化接口 +type IOrder interface { + // RemoveOrderByID 删除指定ID的订单 + RemoveOrderByID(id uint) (affected int64, err error) + // SaveOrder 保存订单 + SaveOrder(*Order) (affected int64, err error) + // UpdateOrder更新订单信息 + UpdateOrder(*Order) (affected int64, err error) + // GetOrderByID 返回指定ID的订单 + GetOrderByID(id uint) (*Order, error) + //GetOrderByNumber 返回指定编号的订单 + GetOrderByNumber(n string) (*Order, error) + // CountServerRooms 统计满足过滤条件的订单数量 + CountOrders(cond *OrderCond) (count int64, err error) + // GetOrders 返回满足过滤条件的订单 + GetOrders(cond *OrderCond, orderby OrderBy, limiter *page.Limiter) (items []*Order, err error) + // GetMaxOrderNumber 获取指定日期的最大订单号 + GetMaxOrderNumber(date string) (orderNumber int, err error) +} + +const ( + OrderStatusPurchasing = "purchasing" + OrderStatusPartlyArrived = "partly_arrived" + OrderStatusAllArrived = "all_arrived" + OrderStatusCanceled = "canceled" + OrderStatusfinished = "finished" +) + +// BeforeSave 保存设备信息前的钩子方法。 +// 防止将空字符串写入类型为JSON的数据库字段中引发报错。 +func (o *Order) BeforeSave() (err error) { + replaceIfBlank(&o.PreOccupiedUsites, EmptyJSONObject) + replaceIfBlank(&o.PreOccupiedCabinets, EmptyJSONObject) + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/os_template.go b/cyclone-server/src/idcos.io/cloudboot/model/os_template.go new file mode 100644 index 0000000000000000000000000000000000000000..66362224eea259813d1a0a345444c81bf2d58d3b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/os_template.go @@ -0,0 +1,43 @@ +package model + + +const ( + // OS生命周期 + OSTesting = "testing" // 测试中,未提供技术支持 + OSActiveDefault = "active_default" // 默认提供该OS + OSActive = "active" // 可按需提供该OS + OSContainment = "containment" // 存量提供技术支持,不再支持新增 + OSEOL = "end_of_life" // 生命周期终止 + + // OS架构平台 + OSARCHAARCH64 = "aarch64" + OSARCHX8664 = "x86_64" + OSARCHUNKNOWN = "unknown" +) + +//OSLifecycleMap = map[string]string { +// "testing":"Testing", +// "active_default":"Active(Default)", +// "active":"Active", +// "containment":"Containment", +// "end_of_life":"EOL", +//} + +// IOSTemplate 系统安装模板持久化接口 +type IOSTemplate interface { + // 查询指定设备关联的系统安装模板 + GetSystemTemplateBySN(sn string) (*SystemTemplate, error) + // GetSystemTemplatesByCond 根据条件查询系统安装模板 + GetSystemTemplatesByCond(cond *CommonTemplateCond) ([]*SystemTemplate, error) + // GetImageTemplatesByCond 根据条件查询镜像安装模板 + GetImageTemplatesByCond(cond *CommonTemplateCond) (templates []*ImageTemplate, err error) +} + +// CommonTemplateCond 系统安装模板查询条件 +type CommonTemplateCond struct { + Family string `json:"family"` + BootMode string `json:"boot_mode"` + Name string `json:"name"` + OSLifecycle string `json:"os_lifecycle"` // OS生命周期:Testing|Active(Default)|Active|Containment|EOL + Arch string `json:"arch"` // OS架构平台:x86_64|aarch64 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/permission.go b/cyclone-server/src/idcos.io/cloudboot/model/permission.go new file mode 100644 index 0000000000000000000000000000000000000000..c6f5b8d0e63b8924088953fdc50c6068f4c3c3f0 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/permission.go @@ -0,0 +1,26 @@ +package model + +import ( + "github.com/jinzhu/gorm" + "github.com/voidint/page" +) + +// PermissionCode 权限码 +type PermissionCode struct { + gorm.Model + PID uint `gorm:"column:pid"` + Code string `gorm:"column:code"` + Title string `gorm:"column:title"` + Note string `gorm:"column:note"` +} + +// TableName 指定数据库表名 +func (PermissionCode) TableName() string { + return "permission_code" +} + +// IPermissionCode 权限码数据库操作接口 +type IPermissionCode interface { + // GetPermissionCodes 返回满足过滤条件的权限码 + GetPermissionCodes(cond *PermissionCode, orderby OrderBy, limiter *page.Limiter) (items []*PermissionCode, err error) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/platform_config.go b/cyclone-server/src/idcos.io/cloudboot/model/platform_config.go new file mode 100644 index 0000000000000000000000000000000000000000..5bd85f964477f1ee8870dedf8e22096a9539564a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/platform_config.go @@ -0,0 +1,16 @@ +package model + +import "github.com/jinzhu/gorm" + +// PlatformConfig 平台配置 +type PlatformConfig struct { + gorm.Model + Name string `sql:"not null;unique;"` + Content string `sql:"type:longtext;"` +} + +// IPlatformConfig 平台配置 +type IPlatformConfig interface { + // GetPlatformConfigByName 查询指定名称的平台配置项 + GetPlatformConfigByName(name string) (*PlatformConfig, error) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/repo.go b/cyclone-server/src/idcos.io/cloudboot/model/repo.go new file mode 100644 index 0000000000000000000000000000000000000000..cd5944f536bcd8da709afb54a26e9f7568cbec08 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/repo.go @@ -0,0 +1,108 @@ +package model + +import ( + "bytes" + "fmt" +) + +// Repo 数据仓库 +type Repo interface { + Close() error + DropDB() error // 测试时使用 + + IPlatformConfig + IIDC + IServerRoom + IServerUSite + IServerCabinet + INetworkArea + INetworkDevice + IIPNetwork + IIP + IOperateLog + IAPILog + IDevice + IDeviceSetting + IOSTemplate + IHardwareTemplate + IHardwareSetting + IDeviceLog + IDataDict + IInspection + IImageTemplate + ISystemTemplate + IPermissionCode + ISystemSetting + IJob + IOOBHistory + IApproval + IDHCPTokenBucket + IStoreRoom + IVirtualCabinet + IOrder + IDeviceCategory + IDeviceSettingRule + IDeviceLifecycle +} + +// OrderByDirection SQL(ORDER BY)排序方向 +type OrderByDirection string + +var ( + // ASC 升序 + ASC OrderByDirection = "ASC" + // DESC 降序 + DESC OrderByDirection = "DESC" +) + +// OrderByPair ORDER BY对 +type OrderByPair struct { + Name string + Direction OrderByDirection +} + +func (pair OrderByPair) String() string { + return fmt.Sprintf("%s %s", pair.Name, string(pair.Direction)) +} + +// OrderBy ORDER BY信息 +type OrderBy []OrderByPair + +func (ob OrderBy) String() string { + if len(ob) <= 0 { + return "" + } + + var buf bytes.Buffer + for i := range ob { + buf.WriteString(ob[i].String()) + if i < len(ob)-1 { + buf.WriteByte(',') + } + } + return buf.String() +} + +// OneOrderBy 构建仅包含一对的orderby +func OneOrderBy(name string, direction OrderByDirection) OrderBy { + return OrderBy([]OrderByPair{ + { + Name: name, + Direction: direction, + }, + }) +} + +// TwoOrderBy 构建包含两对的orderby +func TwoOrderBy(name0 string, direction0 OrderByDirection, name1 string, direction1 OrderByDirection) OrderBy { + return OrderBy([]OrderByPair{ + { + Name: name0, + Direction: direction0, + }, + { + Name: name1, + Direction: direction1, + }, + }) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/server_cabinet.go b/cyclone-server/src/idcos.io/cloudboot/model/server_cabinet.go new file mode 100644 index 0000000000000000000000000000000000000000..484bcb2cff21b3b049b86bf942e9b93a14186aae --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/server_cabinet.go @@ -0,0 +1,127 @@ +package model + +import ( + "time" + + "github.com/jinzhu/gorm" + "github.com/voidint/page" +) + +const ( + // CabinetTypeServer 机架(柜)类型-通用服务器 + CabinetTypeServer = "server" + // CabinetTypeNetworkDevice 机架(柜)类型-网络设备 + CabinetTypeNetworkDevice = "network_device" + // CabinetTypeReserved 机架(柜)类型-预留 + CabinetTypeReserved = "reserved" + // CabinetTypeKvmServer 机架(柜)类型-虚拟化服务器 + CabinetTypeKvmServer = "kvm_server" +) + +const ( + // CabinetStatUnderConstruction 机架(柜)状态-建设中 + CabinetStatUnderConstruction = "under_construction" + // CabinetStatNotEnabled 机架(柜)状态-未启用 + CabinetStatNotEnabled = "not_enabled" + // CabinetStatEnabled 机架(柜)状态-已启用 + CabinetStatEnabled = "enabled" + // CabinetStatLocked 机架(柜)状态-已锁定[允许回收不允许新分配资源] + CabinetStatLocked = "locked" + // CabinetStatOffline 机架(柜)状态-已下线 + CabinetStatOffline = "offline" + // CabinetPowerOn 机架(柜)状态-开电 + CabinetPowerOn = "yes" + // CabinetPowerOff 机架(柜)状态-关电 + CabinetPowerOff = "no" +) + +const ( + // YES 是 + YES = "yes" + YesCh = "是" + // NO 否 + NO = "no" + NoCh = "否" + Unknown = "unknown" +) + +// ServerCabinet 机架(柜) +type ServerCabinet struct { + gorm.Model + IDCID uint `gorm:"column:idc_id"` + ServerRoomID uint `gorm:"column:server_room_id"` + NetworkAreaID uint `gorm:"column:network_area_id"` + Number string `gorm:"column:number"` + Height uint `gorm:"column:height"` + Type string `gorm:"column:type"` + NetworkRate string `gorm:"column:network_rate"` + Current string `gorm:"column:current"` + AvailablePower string `gorm:"column:available_power"` + MaxPower string `gorm:"column:max_power"` + IsEnabled string `gorm:"column:is_enabled"` + EnableTime *time.Time `gorm:"column:enable_time"` + IsPowered string `gorm:"column:is_powered"` + PowerOnTime *time.Time `gorm:"column:power_on_time"` + PowerOffTime *time.Time `gorm:"column:power_off_time"` + Status string `gorm:"column:status"` + Remark string `gorm:"column:remark"` + Creator string `gorm:"column:creator"` +} + +type ServerCabinetCond struct { + IDCID []uint `gorm:"column:idc_id"` + ServerRoomID []uint `gorm:"column:server_room_id"` + ServerCabinetID []uint `gorm:"column:server_cabinet_id"` + NetworkAreaID []uint `gorm:"column:network_area_id"` + Number string `gorm:"column:number"` + Type string `gorm:"column:type"` + IsEnabled string `gorm:"column:is_enabled"` + IsPowered string `gorm:"column:is_powered"` + Status string `gorm:"column:status"` + ServerRoomName string + NetworkAreaName string +} + +// TableName 指定数据库表名 +func (ServerCabinet) TableName() string { + return "server_cabinet" +} + +// IServerCabinet 机架(柜)持久化接口 +type IServerCabinet interface { + // RemoveServerCabinetByID 删除指定ID的机架(柜) + RemoveServerCabinetByID(id uint) (affected int64, err error) + // SaveServerCabinet 保存机架(柜) + SaveServerCabinet(*ServerCabinet) (affected int64, err error) + // GetServerCabinetByID 返回指定ID的机架(柜) + GetServerCabinetByID(id uint) (*ServerCabinet, error) + // GetServerCabinetByNumber 返回指定编号的机架(柜) + GetServerCabinetByNumber(serverRoomID uint, num string) (*ServerCabinet, error) + // GetServerCabinetID 根据条件返回ID + GetServerCabinetID(cond *ServerCabinet) (id []uint, err error) + // CountServerCabinets 统计满足过滤条件的机架(柜)数量 + CountServerCabinets(cond *ServerCabinetCond) (count int64, err error) + // GetServerCabinets 返回满足过滤条件的机架(柜) + GetServerCabinets(cond *ServerCabinetCond, orderby OrderBy, limiter *page.Limiter) (items []*ServerCabinet, err error) + //PowerOffServerCabinetByID 根据ID对机架(柜)下电 + PowerOffServerCabinetByID(id uint) (affected int64, err error) + //PowerOnServerCabinetByID 根据ID对机架(柜)上电 + PowerOnServerCabinetByID(ids []uint) (affected int64, err error) + //UpdateServerCabinetStatus 批量修改机架(柜)状态 + UpdateServerCabinetStatus(ids []uint, status string) (affected int64, err error) + //UpdateServerCabinetType 批量修改机架(柜)类型 + UpdateServerCabinetType(ids []uint, typ string) (affected int64, err error) + //UpdateServerCabinetRemakr 批量修改机架(柜)备注信息 + UpdateServerCabinetRemark(ids []uint, remark string) (affected int64, err error) + //GetServerCabinetCountByServerRoomID 根据给定的机房获取机房内的机架(柜)数 + GetServerCabinetCountByServerRoomID(id uint) (count int64, err error) + // GetPeerCabinetByID 根据机架ID查询同组(同属于一个tor)的另一个机架 + //GetPeerCabinetByID(id uint) (*ServerCabinet, error) + //GetCabinetOrderByFreeUsites 按照可用机位数倒叙顺序返回机架列表 + GetCabinetOrderByFreeUsites(req *ServerCabinet, physicalArea string) (mod []*OrderedCabientResp, err error) +} + +type OrderedCabientResp struct { + ServerCabinet + AvailableUsiteCount uint `gorm:"column:available_usite_count"` +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/server_room.go b/cyclone-server/src/idcos.io/cloudboot/model/server_room.go new file mode 100644 index 0000000000000000000000000000000000000000..1e0333400045beb673ad13c2b9f546aa6145790d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/server_room.go @@ -0,0 +1,74 @@ +package model + +import ( + "github.com/jinzhu/gorm" + "github.com/voidint/page" +) + +const ( + // RoomStatUnderConstruction 机房状态-建设中 + RoomStatUnderConstruction = "under_construction" + // RoomStatAccepted 机房状态-已验收 + RoomStatAccepted = "accepted" + // RoomStatProduction 机房状态-已投产 + RoomStatProduction = "production" + // RoomStatAbolished 机房状态-已裁撤 + RoomStatAbolished = "abolished" +) + +// ServerRoom 机房 +type ServerRoom struct { + gorm.Model + IDCID uint `gorm:"column:idc_id"` + Name string `gorm:"column:name"` + FirstServerRoom uint `gorm:"column:first_server_room"` + City string `gorm:"column:city"` + Address string `gorm:"column:address"` + ServerRoomManager string `gorm:"column:server_room_manager"` + VendorManager string `gorm:"column:vendor_manager"` + NetworkAssetManager string `gorm:"column:network_asset_manager"` + SupportPhoneNumber string `gorm:"column:support_phone_number"` + Status string `gorm:"column:status"` + Creator string `gorm:"column:creator"` +} + +// ServerRoomCond 机房查询条件 +type ServerRoomCond struct { + ID []uint + IDCID []uint + Name string + FirstServerRoom []uint + City string + Address string + ServerRoomManager string + VendorManager string + NetworkAssetManager string + SupportPhoneNumber string + Status string + Creator string +} + +// TableName 指定数据库表名 +func (ServerRoom) TableName() string { + return "server_room" +} + +// IServerRoom 机房持久化接口 +type IServerRoom interface { + // RemoveServerRoomByID 删除指定ID的机房 + RemoveServerRoomByID(id uint) (affected int64, err error) + // SaveServerRoom 保存机房 + SaveServerRoom(*ServerRoom) (affected int64, err error) + // UpdateServerRoom更新机房信息 + UpdateServerRoom(srs []*ServerRoom) (affected int64, err error) + // UpdateServerRoomStatus 批量更新机房状态 + UpdateServerRoomStatus(status string, ids ...uint) (affected int64, err error) + // GetServerRoomByID 返回指定ID的机房 + GetServerRoomByID(id uint) (*ServerRoom, error) + // GetServerRoomByName 返回指Name的机房 + GetServerRoomByName(Name string) (*ServerRoom, error) + // CountServerRooms 统计满足过滤条件的机房数量 + CountServerRooms(cond *ServerRoomCond) (count int64, err error) + // GetServerRooms 返回满足过滤条件的机房 + GetServerRooms(cond *ServerRoomCond, orderby OrderBy, limiter *page.Limiter) (items []*ServerRoom, err error) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/server_usite.go b/cyclone-server/src/idcos.io/cloudboot/model/server_usite.go new file mode 100644 index 0000000000000000000000000000000000000000..78b7a3522ea709d7920ce0be86dc8a49f07b7310 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/server_usite.go @@ -0,0 +1,114 @@ +package model + +import ( + "github.com/jinzhu/gorm" + "github.com/voidint/page" +) + +const ( + // USiteStatFree 机位(U位)状态-空闲 + USiteStatFree = "free" + // USiteStatPreOccupied 机位(U位)状态-预占用 + USiteStatPreOccupied = "pre_occupied" + // USiteStatUsed 机位(U位)状态-已使用 + USiteStatUsed = "used" + // USiteStatDisabled 机位(U位)状态-不可用 + USiteStatDisabled = "disabled" + // 端口速率枚举值 + PortRateDefault = "25GE" + PortRateGE = "GE" + PortRate10GE = "10GE" + PortRate25GE = "25GE" + PortRate40GE = "40GE" +) + +var PortRateMap = map[string]string{ + "GE": PortRateGE, + "10GE": PortRate10GE, + "25GE": PortRate25GE, + "40GE": PortRate40GE, +} + +// CombinedServerUSite 机位分页查询 +type CombinedServerUSite struct { + IDCID []uint `json:"idc_id"` // 所属数据中心ID + ServerRoomID []uint `json:"server_room_id"` // 所属机房ID + ServerCabinetID []uint `json:"server_cabinet_id"` // 所属机架ID + NetAreaID []uint `json:"network_area_id"` // 网络区域ID + ServerRoomName string + ServerRoomNameCabinetNumUSiteNumSlice []string // 机房管理单元-机架-机位 + ServerRoomNameCabinetNumUSiteNum string // 机房管理单元-机架-机位 + PhysicalArea string `json:"physical_area"` // 物理区域 + CabinetNumber string `json:"cabinet_number"` // 机架编号 + USiteNumber string `json:"usite_number"` // 机位编号 + Height string `json:"height"` // 机位调试 + Status string `json:"status"` // 机位状态 + LAWAPortRate string `json:"la_wa_port_rate"` // 内外网端口速率:GE\10GE\25GE\40GE +} + +// SwitchInfo 交换机信息 +type SwitchInfo struct { + Name string `json:"name"` + Port string `json:"port"` +} + +// ServerUSite 机位(U位) +type ServerUSite struct { + gorm.Model + IDCID uint `gorm:"column:idc_id"` + ServerRoomID uint `gorm:"column:server_room_id"` + ServerCabinetID uint `gorm:"column:server_cabinet_id"` + Number string `gorm:"column:number"` + Beginning uint `gorm:"column:beginning"` + Height uint `gorm:"column:height"` + PhysicalArea string `gorm:"column:physical_area"` + OobnetSwitches string `gorm:"oobnet_switches"` + IntranetSwitches string `gorm:"intranet_switches"` + ExtranetSwitches string `gorm:"extranet_switches"` + LAWAPortRate string `gorm:"column:la_wa_port_rate"` + Status string `gorm:"column:status"` + Remark string `gorm:"column:remark"` + Creator string `gorm:"column:creator"` +} + +// BeforeSave 机位信息保存时防止空字符串信息 +func (usite *ServerUSite) BeforeSave() (err error) { + replaceIfBlank(&usite.OobnetSwitches, EmptyJSONArray) + replaceIfBlank(&usite.IntranetSwitches, EmptyJSONArray) + replaceIfBlank(&usite.ExtranetSwitches, EmptyJSONArray) + return +} + +// TableName 指定数据库表名 +func (ServerUSite) TableName() string { + return "server_usite" +} + +// IServerUSite 机位(U位)持久化接口 +type IServerUSite interface { + //GetServerUSiteCountByServerCabinetID 统计机架的机位数 + GetServerUSiteCountByServerCabinetID(id uint) (count int64, err error) + // SaveServerUSite 保存机位(U位) + SaveServerUSite(*ServerUSite) (affected int64, err error) + // GetServerUSiteByID 返回指定ID的机位(U位) + GetServerUSiteByID(id uint) (*ServerUSite, error) + // GetServerUSiteByNumber 返回指定编号的机位(U位) + GetServerUSiteByNumber(cabinetID uint, number string) (*ServerUSite, error) + // BatchUpdateServerUSitesStatus 批量更新机位状态信息 + BatchUpdateServerUSitesStatus(id []uint, status string) (affected int64, err error) + // BatchUpdateServerUSitesRemark 批量更新机位备注信息 + BatchUpdateServerUSitesRemark(id []uint, remark string) (affected int64, err error) + // DeleteServerUSitePort 删除机位端口号 + DeleteServerUSitePort(id uint) (affected int64, err error) + // RemoveServerUSiteByID 删除机位 + RemoveServerUSiteByID(id uint) (affected int64, err error) + // CountServerUSite 统计机位数量 + CountServerUSite(cond *CombinedServerUSite) (count int64, err error) + //GetServerUSiteID 返回满足过滤条件的机位(U位) 不支持模糊查找 + GetServerUSiteID(cond *ServerUSite) (id []uint, err error) + // CountServerUSite 查询机位信息 + GetServerUSiteByCond(cond *CombinedServerUSite, orderby OrderBy, limiter *page.Limiter) (items []*ServerUSite, err error) + // 根据网络设备名,获取对应的机位ID + GetServerUsiteByNetworkDeviceName(name []string) (nd []uint, err error) + GetPhysicalAreas() (*DeviceQueryParamResp, error) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/store_room.go b/cyclone-server/src/idcos.io/cloudboot/model/store_room.go new file mode 100644 index 0000000000000000000000000000000000000000..529e47773cfc3d4be812de55ffacad9853ed7648 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/store_room.go @@ -0,0 +1,97 @@ +package model + +import ( + "github.com/jinzhu/gorm" + "github.com/voidint/page" +) + +// StoreRoom 库房 +type StoreRoom struct { + gorm.Model + IDCID uint `gorm:"column:idc_id"` + Name string `gorm:"column:name"` + FirstServerRoom string `gorm:"column:first_server_room"` + City string `gorm:"column:city"` + Address string `gorm:"column:address"` + StoreRoomManager string `gorm:"column:store_room_manager"` + VendorManager string `gorm:"column:vendor_manager"` + Status string `gorm:"column:status"` + Creator string `gorm:"column:creator"` +} + +// StoreRoomCond 库房查询条件 +type StoreRoomCond struct { + ID []uint + IDCID []uint + Name string + FirstServerRoom string + City string + Address string + StoreRoomManager string + VendorManager string + Status string + Creator string +} + +// TableName 指定数据库表名 +func (StoreRoom) TableName() string { + return "store_room" +} + +// IStoreRoom 库房持久化接口 +type IStoreRoom interface { + // RemoveStoreRoomByID 删除指定ID的库房 + RemoveStoreRoomByID(id uint) (affected int64, err error) + // SaveStoreRoom 保存库房 + SaveStoreRoom(*StoreRoom) (affected int64, err error) + // UpdateStoreRoom更新库房信息 + UpdateStoreRoom(srs []*StoreRoom) (affected int64, err error) + // GetStoreRoomByID 返回指定ID的库房 + GetStoreRoomByID(id uint) (*StoreRoom, error) + // GetStoreRoomByName 返回指定Name的库房 + GetStoreRoomByName(n string) (*StoreRoom, error) + // CountServerRooms 统计满足过滤条件的库房数量 + CountStoreRooms(cond *StoreRoomCond) (count int64, err error) + // GetStoreRooms 返回满足过滤条件的库房 + GetStoreRooms(cond *StoreRoomCond, orderby OrderBy, limiter *page.Limiter) (items []*StoreRoom, err error) +} + +// VirtualCabinet +type VirtualCabinet struct { + gorm.Model + StoreRoomID uint `gorm:"column:store_room_id"` + Number string `gorm:"column:number"` + Remark string `gorm:"column:remark"` + Status string `gorm:"column:status"` + Creator string `gorm:"column:creator"` +} + +// TableName 指定数据库表名 +func (VirtualCabinet) TableName() string { + return "virtual_cabinet" +} + +// IVirtualCabinet 持久化接口 +type IVirtualCabinet interface { + // RemoveVirtualCabinetByID 删除指定ID的虚拟货架 + RemoveVirtualCabinetByID(id uint) (affected int64, err error) + // SaveVirtualCabinet 保存库房 + SaveVirtualCabinet(*VirtualCabinet) (affected int64, err error) + // UpdateStoreRoom更新库房信息 + //UpdateStoreRoom(srs []*VirtualCabinet) (affected int64, err error) + // GetVirtualCabinetByID 返回指定ID的虚拟货架 + GetVirtualCabinetByID(id uint) (*VirtualCabinet, error) + // CountServerRooms 统计满足过滤条件的库房数量 + CountVirtualCabinets(cond *VirtualCabinet) (count int64, err error) + // GetStoreRooms 返回满足过滤条件的库房 + GetVirtualCabinets(cond *VirtualCabinet, orderby OrderBy, limiter *page.Limiter) (items []*VirtualCabinet, err error) + // GetStoreRooms 返回满足过滤条件的库房 + GetVirtualCabinetsByCond(cond *CombinedStoreRoomVirtualCabinet, orderby OrderBy, limiter *page.Limiter) (items []*VirtualCabinet, err error) +} + +// CombinedStoreRoomVirtualCabinet +type CombinedStoreRoomVirtualCabinet struct { + StoreRoomName string + StoreRoomID uint + VirtualCabinetNumber string +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/model/system_setting.go b/cyclone-server/src/idcos.io/cloudboot/model/system_setting.go new file mode 100644 index 0000000000000000000000000000000000000000..7f144c00f0dc377da3e5c5a10417cb926866ed78 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/system_setting.go @@ -0,0 +1,52 @@ +package model + +import "github.com/jinzhu/gorm" + +const ( + // SysSettingInstallationTimeout 系统设置-安装超时时间 + SysSettingInstallationTimeout = "installation_timeout" + // SysSettingAuthorization 系统设置键名-授权API + SysSettingAuthorization = "authorization" +) + +const ( + // DefInstallationTimeout 默认安装超时时间(单位秒) + DefInstallationTimeout = 3600 +) + +// SystemSetting 系统设置 +type SystemSetting struct { + gorm.Model + Key string `gorm:"column:key"` + Value string `gorm:"column:value"` + Desc string `gorm:"column:desc"` + Updater string `gorm:"column:updater"` +} + +// TableName 指定数据库表名 +func (SystemSetting) TableName() string { + return "system_setting" +} + +// ISystemSetting 系统设置数据库操作接口 +type ISystemSetting interface { + // GetSystemSetting 查询指定名称的系统配置 + GetSystemSetting(key string) (*SystemSetting, error) + // GetSystemSetting4InstallatonTimeout 查询安装超时时间的系统设置值。若发生错误或者值不存在,则返回默认值。 + GetSystemSetting4InstallatonTimeout(defValue int64) (sec int64) + // GetSystemSetting4AuthorizationAPIs 查询授权API配置 + GetSystemSetting4AuthorizationAPIs() ([]*AuthorizationAPI, error) +} + +// AuthorizationAPI 授权API配置 +type AuthorizationAPI struct { + API *APIMeta `json:"api"` + Codes []string `json:"codes"` +} + +// APIMeta API元信息 +type APIMeta struct { + Method string `json:"method"` + URIReg string `json:"uri_regexp"` + Desc string `json:"desc"` +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/system_template.go b/cyclone-server/src/idcos.io/cloudboot/model/system_template.go new file mode 100644 index 0000000000000000000000000000000000000000..0ecf7780e44e6938c73c1d6b0a73881cf8c180af --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/system_template.go @@ -0,0 +1,56 @@ +package model + +import ( + "github.com/jinzhu/gorm" + "github.com/voidint/page" +) + +const ( + // BootModeUEFI UEFI启动模式 + BootModeUEFI = "uefi" + // BootModeBIOS Legacy BIOS启动模式 + BootModeBIOS = "legacy_bios" +) + +// SystemTemplate 系统模板 +type SystemTemplate struct { + gorm.Model + Family string + BootMode string + Name string + PXE string `gorm:"column:pxe"` + Username string + Password string + Content string + OSLifecycle string `gorm:"column:os_lifecycle"` // OS生命周期:Testing|Active(Default)|Active|Containment|EOL + Arch string `gorm:"column:arch"` // OS架构平台:x86_64|aarch64 +} + +// TableName 指定数据库表名 +func (SystemTemplate) TableName() string { + return "system_template" +} + +// ISystemTemplate 系统安装模板持久化接口 +type ISystemTemplate interface { + // RemoveSystemTemplate 删除指定ID的系统安装模板 + RemoveSystemTemplate(id uint) (affected int64, err error) + // SaveSystemTemplate 保存系统安装模板 + SaveSystemTemplate(*SystemTemplate) (id uint, err error) + // GetSystemTemplateByID 返回指定ID的系统安装模板 + GetSystemTemplateByID(id uint) (*SystemTemplate, error) + // CountSystemTemplates 统计满足过滤条件的系统安装模板数量 + CountSystemTemplates(cond *SystemTemplate) (count int64, err error) + // GetSystemTemplates 返回满足过滤条件的系统安装模板 + GetSystemTemplates(cond *SystemTemplate, orderby OrderBy, limiter *page.Limiter) (items []*SystemTemplate, err error) + + // ========== deprecated methods ========== + CountSystemTemplate() (uint, error) + CountSystemTemplateByName(name string) (uint, error) + CountSystemTemplateByNameAndID(name string, id uint) (uint, error) + CountSystemTemplateByShield(cond *SystemTemplate) (uint, error) + GetSystemTemplateIDByName(name string) (uint, error) + GetSystemTemplateListWithPage(Limit uint, Offset uint) ([]SystemTemplate, error) + GetSystemTemplateListWithPageAndShield(Limit uint, Offset uint, cond *SystemTemplate) ([]SystemTemplate, error) + GetSystemTemplateByName(n string) (*SystemTemplate, error) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/model/user.go b/cyclone-server/src/idcos.io/cloudboot/model/user.go new file mode 100644 index 0000000000000000000000000000000000000000..b2957cc362d569e4e09f60cdbfde8e2e3f63e1ea --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/model/user.go @@ -0,0 +1,66 @@ +package model + +import "idcos.io/cloudboot/utils/collection" + +const ( + // AppID4UAM UAM系统【权限资源管理】-【系统名称】 + AppID4UAM = "cloudboot" + // PermissionCategory4UAM UAM系统【权限资源管理】-【编码】 + PermissionCategory4UAM = "cloudboot_webank" + // TenantID4UAM UAM系统默认租户ID + TenantID4UAM = "default" + + //MenuPermissionType 菜单权限类型 + MenuPermissionType = "cloudboot_menu_permission" + //ButtonPermissionType 按钮权限类型 + ButtonPermissionType = "cloudboot_button_permission" + //DataPermissionType 数据权限类型 + DataPermissionType = "cloudboot_data_permission" + //APIPermissionType API接口权限类型 + APIPermissionType = "cloudboot_api_permission" +) + +// Tenant 租户 +type Tenant struct { + ID string `json:"id"` + Name string `json:"name"` +} + +// Department 部门 +type Department struct { + ID string `json:"id"` + Name string `json:"name"` +} + +// CurrentUser 当前用户信息 // TODO 嵌入User结构体 +type CurrentUser struct { + Token string `json:"token"` + ID string `json:"id"` + LoginName string `json:"login_name"` + Name string `json:"name"` + Email string `json:"email"` + Status string `json:"status"` + UAMPortalURL string `json:"uam_portal_url"` + PermissionCodes []string `json:"permissions"` + Tenant *Tenant `json:"tenant"` + Department *Department `json:"department"` +} + +// Allow 若当前用户自身所拥有的权限码与目标权限码中的任意一个重合,则返回true。反之,返回false。 +func (u *CurrentUser) Allow(codes ...string) bool { + if len(u.PermissionCodes) <= 0 { + return false + } + return collection.SSliceContainsAny(u.PermissionCodes, codes) +} + +// User 用户基本信息 +type User struct { + ID string `json:"id"` + LoginName string `json:"login_name"` + Name string `json:"name"` + Email string `json:"email"` + Status string `json:"status"` + Tenant *Tenant `json:"tenant"` + Department *Department `json:"department"` +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/proxy.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/proxy.go new file mode 100644 index 0000000000000000000000000000000000000000..8f8125a153d796fa258ddb0bb5890651c901689a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/proxy.go @@ -0,0 +1,101 @@ +package cloudbootserver + +import ( + "fmt" + "net" + "net/http" + "net/http/httputil" + "net/url" + "strings" + + "idcos.io/cloudboot/config" + "idcos.io/cloudboot/logger" + myhttp "idcos.io/cloudboot/utils/http" +) + +func singleJoiningSlash(a, b string) string { + aslash := strings.HasSuffix(a, "/") + bslash := strings.HasPrefix(b, "/") + switch { + case aslash && bslash: + return a + b[1:] + case !aslash && !bslash: + return a + "/" + b + } + return a + b +} + +func makeDirector(log logger.Logger, conf *config.Config, target *url.URL) func(*http.Request) { + targetQuery := target.RawQuery + return func(req *http.Request) { + log.Debugf("%s %s", req.Method, req.URL.String()) + // 以下代码源于golang官方实现,谨慎修改。 + req.URL.Scheme = target.Scheme + req.URL.Host = target.Host + req.URL.Path = singleJoiningSlash(target.Path, req.URL.Path) + if targetQuery == "" || req.URL.RawQuery == "" { + req.URL.RawQuery = targetQuery + req.URL.RawQuery + } else { + req.URL.RawQuery = targetQuery + "&" + req.URL.RawQuery + } + if _, ok := req.Header["User-Agent"]; !ok { + // explicitly disable User-Agent so it's not set to default value + req.Header.Set("User-Agent", "") + } + + // 在http header 'X-Forwarded-For'中记录每一级代理IP地址, + // 并通过英文逗号分隔,最新一级的代理信息会被追加到末尾。 + if v, ok := req.Header[myhttp.XForwardedFor]; !ok || len(v) <= 0 { + req.Header.Set(myhttp.XForwardedFor, conf.ReverseProxy.IP) + } else { + req.Header.Set(myhttp.XForwardedFor, fmt.Sprintf("%s,%s", v[0], conf.ReverseProxy.IP)) + } + + // 在http header 'X-Forwarded-Origin'中记录每一级代理的信息, + // 并通过英文逗号分隔,最新一级的代理信息会被追加到末尾。 + if conf.ReverseProxy.Origin != "" { + if v, ok := req.Header[myhttp.XForwardedOrigin]; !ok || len(v) <= 0 { + req.Header.Set(myhttp.XForwardedOrigin, conf.ReverseProxy.Origin) + } else { + req.Header.Set(myhttp.XForwardedOrigin, fmt.Sprintf("%s,%s", v[0], conf.ReverseProxy.Origin)) + } + } + } +} + +// NewReverseProxyServer 实例化http服务 +func NewReverseProxyServer(log logger.Logger, conf *config.Config) (*Server, error) { + targetURL, err := url.Parse(conf.ReverseProxy.URL) + if err != nil { + log.Error(err) + return nil, err + } + if conf.ReverseProxy.IP == "" { + conf.ReverseProxy.IP, _ = loadIP() + } + log.Debugf("Origin Node: %s, Origin Node IP: %s", conf.ReverseProxy.Origin, conf.ReverseProxy.IP) + + rproxy := httputil.NewSingleHostReverseProxy(targetURL) + rproxy.Director = makeDirector(log, conf, targetURL) + return &Server{ + Conf: conf, + Log: log, + handler: rproxy, + }, nil +} + +func loadIP() (addr string, err error) { + addrs, err := net.InterfaceAddrs() + if err != nil { + return "", err + } + for i := range addrs { + // 检查ip地址判断是否回环地址 + if ipnet, ok := addrs[i].(*net.IPNet); ok && !ipnet.IP.IsLoopback() { + if ipnet.IP.To4() != nil { + return ipnet.IP.String(), nil + } + } + } + return "127.0.0.1", nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/api_log.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/api_log.go new file mode 100644 index 0000000000000000000000000000000000000000..ef42922884b417de8fb3bc5d86df29096e8bef9e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/api_log.go @@ -0,0 +1,31 @@ +package route + +import ( + "net/http" + + "github.com/voidint/binding" + + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// GetAPILogPage 分页查询API日志 +func GetAPILogPage(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.GetAPILogPageReq + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + pg, err := service.GetAPILogWithPage(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/approval.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/approval.go new file mode 100644 index 0000000000000000000000000000000000000000..43902302f1f47a775f5828ed2fe92314debfe9ce --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/approval.go @@ -0,0 +1,665 @@ +package route + +import ( + "net/http" + "strconv" + + "github.com/go-chi/chi" + "github.com/voidint/binding" + + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" + "idcos.io/cloudboot/utils/upload" + myuser "idcos.io/cloudboot/utils/user" +) + +// SubmitIDCAbolishApproval 提交数据中心裁撤审批 +func SubmitIDCAbolishApproval(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var token string + if user != nil { + token = user.Token + } + + reqData := service.SubmitIDCAbolishApprovalReq{ + SubmitIDsApprovalReq: service.SubmitIDsApprovalReq{ + SubmitApprovalCommon: service.SubmitApprovalCommon{ + CurrentUser: user, + GetEmailFromUAM: myuser.GetEmailByUUID(log, token, conf.UAM.RootEndpoint), + }, + }, + } + + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + id, err := service.SubmitIDCAbolishApproval(log, repo, conf, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": id, + }), + ) +} + +// SubmitServerRoomAbolishApproval 提交机房管理单元裁撤审批 +func SubmitServerRoomAbolishApproval(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var token string + if user != nil { + token = user.Token + } + + reqData := service.SubmitServerRoomAbolishApprovalReq{ + SubmitIDsApprovalReq: service.SubmitIDsApprovalReq{ + SubmitApprovalCommon: service.SubmitApprovalCommon{ + CurrentUser: user, + GetEmailFromUAM: myuser.GetEmailByUUID(log, token, conf.UAM.RootEndpoint), + }, + }, + } + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + id, err := service.SubmitServerRoomAbolishApproval(log, repo, conf, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": id, + }), + ) +} + +//SubmitNetAreaOfflineApproval 提交网络区域下线审批 +func SubmitNetAreaOfflineApproval(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + var token string + if user != nil { + token = user.Token + } + reqData := service.SubmitNetAreaOfflineApprovalReq{ + SubmitIDsApprovalReq: service.SubmitIDsApprovalReq{ + SubmitApprovalCommon: service.SubmitApprovalCommon{ + CurrentUser: user, + GetEmailFromUAM: myuser.GetEmailByUUID(log, token, conf.UAM.RootEndpoint), + }, + }, + } + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + id, err := service.SubmitNetAreaOfflineApproval(log, repo, conf, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": id, + }), + ) +} + +// SubmitIPUnassignApproval IP回收(取消分配) +func SubmitIPUnassignApproval(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var token string + if user != nil { + token = user.Token + } + + reqData := service.SubmitIPUnassignApprovalReq{ + SubmitIDsApprovalReq: service.SubmitIDsApprovalReq{ + SubmitApprovalCommon: service.SubmitApprovalCommon{ + CurrentUser: user, + GetEmailFromUAM: myuser.GetEmailByUUID(log, token, conf.UAM.RootEndpoint), + }, + }, + } + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + id, err := service.SubmitIPUnassignApproval(log, repo, conf, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": id, + }), + ) +} + +// SubmitDevicePowerOffApproval 物理机关机 +func SubmitDevicePowerOffApproval(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var token string + if user != nil { + token = user.Token + } + + reqData := service.SubmitDevicePowerOffApprovalReq{ + SubmitDeviceRetirementApprovalReq: service.SubmitDeviceRetirementApprovalReq{ + SubmitApprovalCommon: service.SubmitApprovalCommon{ + CurrentUser: user, + GetEmailFromUAM: myuser.GetEmailByUUID(log, token, conf.UAM.RootEndpoint), + }, + }, + } + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + id, err := service.SubmitDevicePowerOffApproval(log, repo, conf, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": id, + }), + ) +} + +// SubmitDeviceRestartApproval 物理机重启 +func SubmitDeviceRestartApproval(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var token string + if user != nil { + token = user.Token + } + + reqData := service.SubmitDevicePowerOffApprovalReq{ + SubmitDeviceRetirementApprovalReq: service.SubmitDeviceRetirementApprovalReq{ + SubmitApprovalCommon: service.SubmitApprovalCommon{ + CurrentUser: user, + GetEmailFromUAM: myuser.GetEmailByUUID(log, token, conf.UAM.RootEndpoint), + }, + }, + } + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + id, err := service.SubmitDeviceRestartApproval(log, repo, conf, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": id, + }), + ) +} + +// SubmitCabinetOfflineApproval 提交机架下线审批 +func SubmitCabinetOfflineApproval(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var token string + if user != nil { + token = user.Token + } + + reqData := service.SubmitCabinetOfflineApprovalReq{ + SubmitApprovalCommon: service.SubmitApprovalCommon{ + CurrentUser: user, + GetEmailFromUAM: myuser.GetEmailByUUID(log, token, conf.UAM.RootEndpoint), + }, + } + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + id, err := service.SubmitCabinetOfflineApproval(log, repo, conf, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": id, + }), + ) +} + +// SubmitCabinetPowerOffApproval 提交机架关电审批 +func SubmitCabinetPowerOffApproval(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var token string + if user != nil { + token = user.Token + } + + reqData := service.SubmitCabinetPowerOffApprovalReq{ + SubmitApprovalCommon: service.SubmitApprovalCommon{ + CurrentUser: user, + GetEmailFromUAM: myuser.GetEmailByUUID(log, token, conf.UAM.RootEndpoint), + }, + } + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + id, err := service.SubmitCabinetPowerOffApproval(log, repo, conf, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": id, + }), + ) +} + +// SubmitDeviceMigrationApproval 提交物理机搬迁审批 +func SubmitDeviceMigrationApproval(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var token string + if user != nil { + token = user.Token + } + + reqData := service.SubmitDeviceMigrationApprovalReq{ + SubmitApprovalCommon: service.SubmitApprovalCommon{ + CurrentUser: user, + GetEmailFromUAM: myuser.GetEmailByUUID(log, token, conf.UAM.RootEndpoint), + }, + } + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + id, err := service.SubmitDeviceMigrationApproval(log, repo, conf, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": id, + }), + ) +} + +// UploadMigrationApproval 文件导入文件上传 +func UploadMigrationApproval(w http.ResponseWriter, r *http.Request) { + //预防乱码 + w.Header().Add("Content-type", "text/html; charset=utf-8") + + //解析并生成临时文件,为后续的工作做准备 + filename, err := upload.GenerateTempFile(r, "migration_approval_") + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "result": filename, + })) +} + +// ImportMigrationApprovalPriview 导入设备文件预览 +func ImportMigrationApprovalPriview(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.ImportPreviewReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + result, err := service.ImportMigrationApprovalPriview(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", result)) +} + +//ImportMigrationApproval 导入待搬迁物理机 +func ImportMigrationApproval(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var reqData service.ImportApprovalReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if user != nil { + reqData.LoginName = user.LoginName + } + + id, err := service.ImportMigrationApproval(log, repo, conf, user, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": id, + }), + ) +} + +// SubmitDeviceRetirementApproval 提交物理机退役审批 +func SubmitDeviceRetirementApproval(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var token string + if user != nil { + token = user.Token + } + + reqData := service.SubmitDeviceRetirementApprovalReq{ + SubmitApprovalCommon: service.SubmitApprovalCommon{ + CurrentUser: user, + GetEmailFromUAM: myuser.GetEmailByUUID(log, token, conf.UAM.RootEndpoint), + }, + } + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + id, err := service.SubmitDeviceRetirementApproval(log, repo, conf, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": id, + }), + ) +} + +// SubmitDeviceOSReInstallationApproval 提交物理机OS重装 +func SubmitDeviceOSReInstallationApproval(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var token string + if user != nil { + token = user.Token + } + + reqData := service.SubmitDeviceReInstallationApprovalReq{ + SubmitApprovalCommon: service.SubmitApprovalCommon{ + CurrentUser: user, + GetEmailFromUAM: myuser.GetEmailByUUID(log, token, conf.UAM.RootEndpoint), + }, + } + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + id, err := service.SubmitDeviceReInstallationApproval(log, repo, conf, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": id, + }), + ) +} + +// SubmitDeviceRecycleApproval 提交物理机回收审批 +func SubmitDeviceRecycleApproval(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var token string + if user != nil { + token = user.Token + } + + reqData := service.SubmitDeviceRecycleApprovalReq{ + SubmitDeviceRetirementApprovalReq: service.SubmitDeviceRetirementApprovalReq{ + SubmitApprovalCommon: service.SubmitApprovalCommon{ + CurrentUser: user, + GetEmailFromUAM: myuser.GetEmailByUUID(log, token, conf.UAM.RootEndpoint), + }, + }, + } + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + id, err := service.SubmitDeviceRecycleApproval(log, repo, conf, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": id, + }), + ) +} + +// Approve 审批指定的问题单 +func Approve(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + lim, _ := middleware.DHCPLimiterFromContext(r.Context()) + + approveID, _ := strconv.Atoi(chi.URLParam(r, "approval_id")) + stepID, _ := strconv.Atoi(chi.URLParam(r, "approval_step_id")) + reqData := service.ApproveReq{ + CurrentUser: user, + ApprovalID: uint(approveID), + StepID: uint(stepID), + } + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + err := service.Approve(log, repo, conf, lim, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// GetMyApprovalPage 我发起的审批 +func GetMyApprovalPage(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.GetMyApprovalPageReq + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + pg, err := service.GetMyApprovalPage(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} + +// GetApproveByMePage 获取待我审批的 +func GetApproveByMePage(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.GetApproveByMePageReq + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + pg, err := service.GetApproveByMePage(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} + +// GetApprovedByMePage 获取我审批完成的 +func GetApprovedByMePage(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.GetApprovedByMeReq + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + pg, err := service.GetApprovedByMePage(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} + +// RevokeApproval 取消我发起的审批单 +func RevokeApproval(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi((chi.URLParam(r, "approval_id"))) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + var be binding.Errors + reqData := &service.RevokeApprovalReq{ + ID: id, + } + if HandleValidateErrs(reqData.Validate(r, be), w) { + return + } + + err = service.RevokeApproval(log, repo, reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// GetApprovalByID 查询指定ID的申请单信息详情 +func GetApprovalByID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + + var token string + if user != nil { + token = user.Token + } + + id, err := strconv.Atoi(chi.URLParam(r, "approval_id")) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + var be binding.Errors + reqData := &service.GetApprovalByIDReq{ + ID: id, + GetNameFromUAM: myuser.GetUsersByUUID(log, token, conf.UAM.RootEndpoint), + } + if HandleValidateErrs(reqData.Validate(r, be), w) { + return + } + + sr, err := service.GetApprovalByID(log, repo, reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(sr)), + ) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/component.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/component.go new file mode 100644 index 0000000000000000000000000000000000000000..bd51f75bb94d39de047237a91a9d062bc4679f1d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/component.go @@ -0,0 +1,179 @@ +package route + +import ( + "io/ioutil" + "net/http" + + "github.com/go-chi/chi" + + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// SavePEConfigLog 保存peconfig组件日志 +func SavePEConfigLog(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + // + conf, _ := middleware.ConfigFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var err error + var reqData service.SaveComponentLogReq + reqData.SN = chi.URLParam(r, "sn") + reqData.Component = model.ComponentPEConfig + reqData.LogData, err = ioutil.ReadAll(r.Body) + reqData.DataPath = conf.Server.StorageRootDir + reqData.OriginNode = myhttp.ExtractOriginNodeWithDefault(r, "master") + reqData.OriginNodeIP = myhttp.ExtractOriginNodeIP(r) + + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + if err = service.SaveComponentLog(repo, log, &reqData); err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// SaveHWServerLog 保存hw-server组件日志 +func SaveHWServerLog(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + // + conf, _ := middleware.ConfigFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var err error + var reqData service.SaveComponentLogReq + reqData.SN = chi.URLParam(r, "sn") + reqData.Component = model.ComponentHWServer + reqData.LogData, err = ioutil.ReadAll(r.Body) + reqData.DataPath = conf.Server.StorageRootDir + reqData.OriginNode = myhttp.ExtractOriginNodeWithDefault(r, "master") + reqData.OriginNodeIP = myhttp.ExtractOriginNodeIP(r) + + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + if err = service.SaveComponentLog(repo, log, &reqData); err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// SaveCloudbootAgentLog 保存cloudboot-agent组件日志 +func SaveCloudbootAgentLog(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + // + conf, _ := middleware.ConfigFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var err error + var reqData service.SaveComponentLogReq + reqData.SN = chi.URLParam(r, "sn") + reqData.Component = model.ComponentAgent + reqData.LogData, err = ioutil.ReadAll(r.Body) + reqData.DataPath = conf.Server.StorageRootDir + reqData.OriginNode = myhttp.ExtractOriginNodeWithDefault(r, "master") + reqData.OriginNodeIP = myhttp.ExtractOriginNodeIP(r) + + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + if err = service.SaveComponentLog(repo, log, &reqData); err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// SaveWinConfigLog 保存winconfig组件日志 +func SaveWinConfigLog(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var err error + var reqData service.SaveComponentLogReq + reqData.SN = chi.URLParam(r, "sn") + reqData.Component = model.ComponentWINConfig + reqData.LogData, err = ioutil.ReadAll(r.Body) + reqData.DataPath = conf.Server.StorageRootDir + reqData.OriginNode = myhttp.ExtractOriginNodeWithDefault(r, "master") + reqData.OriginNodeIP = myhttp.ExtractOriginNodeIP(r) + + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + if err = service.SaveComponentLog(repo, log, &reqData); err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// SaveOSConfigLog 保存系统配置日志 +func SaveOSConfigLog(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var err error + var reqData service.SaveComponentLogReq + reqData.SN = chi.URLParam(r, "sn") + reqData.Component = model.OSConfigLog + reqData.LogData, err = ioutil.ReadAll(r.Body) + reqData.DataPath = conf.Server.StorageRootDir + reqData.OriginNode = myhttp.ExtractOriginNodeWithDefault(r, "master") + reqData.OriginNodeIP = myhttp.ExtractOriginNodeIP(r) + + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + if err = service.SaveComponentLog(repo, log, &reqData); err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// SaveImageCloneLog 保存镜像制作日志 +func SaveImageCloneLog(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var err error + var reqData service.SaveComponentLogReq + reqData.SN = chi.URLParam(r, "sn") + reqData.Component = model.ImageCloneLog + reqData.LogData, err = ioutil.ReadAll(r.Body) + reqData.DataPath = conf.Server.StorageRootDir + reqData.OriginNode = myhttp.ExtractOriginNodeWithDefault(r, "master") + reqData.OriginNodeIP = myhttp.ExtractOriginNodeIP(r) + + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + if err = service.SaveComponentLog(repo, log, &reqData); err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/data_dict.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/data_dict.go new file mode 100644 index 0000000000000000000000000000000000000000..e8ea0037e22d2ca8c82a6aa6a23f7e3afbdc57ff --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/data_dict.go @@ -0,0 +1,89 @@ +package route + +import ( + "net/http" + + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// GetDataDicts 根据type参数查询筛选数据字典信息 +func GetDataDicts(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + d, err := service.GetDataDict(log, repo, r.URL.Query().Get("type")) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "items": d, + }), + ) +} + +// +////AddDataDicts 增加数据字典 +//func AddDataDicts(w http.ResponseWriter, r *http.Request) { +// repo, _ := middleware.RepoFromContext(r.Context()) +// log, _ := middleware.PanicFileFromContext(r.Context()) +// +// var reqData []*service.DataDict +// if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { +// return +// } +// err := service.AddDataDicts(log, repo, reqData) +// if err != nil { +// HandleErr(r.Context(), w, err) +// return +// } +// +// render.JSON(w, http.StatusOK, +// myhttp.SucceedRespBody("操作成功"), +// ) +//} +// +////DelDataDicts +//func DelDataDicts(w http.ResponseWriter, r *http.Request) { +// repo, _ := middleware.RepoFromContext(r.Context()) +// log, _ := middleware.PanicFileFromContext(r.Context()) +// +// var reqData []*service.DelDataDictReq +// if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { +// return +// } +// err := service.DelDataDicts(log, repo, reqData) +// if err != nil { +// HandleErr(r.Context(), w, err) +// return +// } +// +// render.JSON(w, http.StatusOK, +// myhttp.SucceedRespBody("操作成功")), +// ) +//} +// +////UpdateDataDicts +//func UpdateDataDicts(w http.ResponseWriter, r *http.Request) { +// repo, _ := middleware.RepoFromContext(r.Context()) +// log, _ := middleware.PanicFileFromContext(r.Context()) +// +// var reqData []*service.DataDict +// if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { +// return +// } +// err := service.UpdateDataDicts(log, repo, reqData) +// if err != nil { +// HandleErr(r.Context(), w, err) +// return +// } +// +// render.JSON(w, http.StatusOK, +// myhttp.SucceedRespBody("操作成功")), +// ) +//} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/device.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/device.go new file mode 100644 index 0000000000000000000000000000000000000000..2f20b9c1d3226dc354b71cd7cc6bbf7e16b9346e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/device.go @@ -0,0 +1,615 @@ +package route + +import ( + "net/http" + + "github.com/go-chi/chi" + "github.com/voidint/binding" + + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + "idcos.io/cloudboot/utils" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" + "idcos.io/cloudboot/utils/upload" +) + +// SaveCollectedDevice 保存采集到的物理机信息 +func SaveCollectedDevice(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + reqData := new(service.CollectedDevice) + //reqData.SN = chi.URLParam(r, "sn") + reqData.OriginNode = myhttp.ExtractOriginNodeWithDefault(r, "master") + reqData.OriginNodeIP = myhttp.ExtractOriginNodeIP(r) + if binding.Json(r, reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + log.Debugf("%s ==> %s: %s, %s:%s", + reqData.SN, + myhttp.XForwardedOrigin, + r.Header.Get(myhttp.XForwardedOrigin), + myhttp.XForwardedFor, + r.Header.Get(myhttp.XForwardedFor), + ) + + if err := service.SaveCollectedDevice(log, repo, reqData); err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// UploadDevices 文件导入文件上传 +func UploadDevices(w http.ResponseWriter, r *http.Request) { + //预防乱码 + w.Header().Add("Content-type", "text/html; charset=utf-8") + + //解析并生成临时文件,为后续的工作做准备 + filename, err := upload.GenerateTempFile(r, "device") + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "result": filename, + })) +} + +// ImportDevicesPreview 导入设备文件预览 +func ImportDevicesPreview(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.ImportPreviewReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + result, err := service.ImportDevicesPreview(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", result)) +} + +//ImportDevices 导入物理机 +func ImportDevices(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var reqData service.ImportPreviewReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if user != nil { + reqData.LoginName = user.LoginName + } + + err := service.ImportDevices(log, repo, conf, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// UploadDevices2Store 文件导入文件上传 +func UploadDevices2Store(w http.ResponseWriter, r *http.Request) { + //预防乱码 + w.Header().Add("Content-type", "text/html; charset=utf-8") + + //解析并生成临时文件,为后续的工作做准备 + filename, err := upload.GenerateTempFile(r, "store-device") + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "result": filename, + })) +} + +// ImportDevices2StorePreview 导入设备文件预览 +func ImportDevices2StorePreview(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.ImportPreviewReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + result, err := service.ImportDevices2StorePreview(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", result)) +} + +//ImportDevices2Store 导入物理机到库房的货架上 +func ImportDevices2Store(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var reqData service.ImportPreviewReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if user != nil { + reqData.LoginName = user.LoginName + } + + err := service.ImportDevices2Store(log, repo, conf, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// UploadStockDevices 存量物理机导入文件上传 +func UploadStockDevices(w http.ResponseWriter, r *http.Request) { + //预防乱码 + w.Header().Add("Content-type", "text/html; charset=utf-8") + + //解析并生成临时文件,为后续的工作做准备 + filename, err := upload.GenerateTempFile(r, "stock-device") + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "result": filename, + })) +} + +// ImportStockDevicesPreview 导入设备文件预览 +func ImportStockDevicesPreview(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.ImportPreviewReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + result, err := service.ImportStockDevicesPreview(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", result)) +} + +//ImportStockDevices 导入物理机 +func ImportStockDevices(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var reqData service.ImportPreviewReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if user != nil { + reqData.LoginName = user.LoginName + } + + err := service.ImportStockDevices(log, repo, conf, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// GetDevicePage 查询物理机分页列表 +func GetDevicePage(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + + req := new(service.DevicePageReq) + if binding.Form(r, req).CustomHandle(HandleValidateErrs, w) { + return + } + + pg, err := service.GetDevicePage(log, repo, conf, req) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} + +// GetDeviceBySN 根据sn查询采集到的设备信息 +func GetDeviceBySN(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + dev, err := service.GetDeviceBySN(log, repo, chi.URLParam(r, "sn")) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(dev)), + ) +} + +// GetDeviceQuerys 设备的查询(过滤)参数列表 +func GetDeviceQuerys(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + //|idc|server_room|server_cabinet|physical_area|op_status|usage|category|vendor + p, err := service.GetDeviceQuerys(log, repo, chi.URLParam(r, "param_name")) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(p)), + ) +} + +// GetCombinedDeviceBySN 根据sn查询设备信息及其若干装机参数 +func GetCombinedDeviceBySN(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + + dev, err := service.GetCombinedDeviceBySN(repo, conf, chi.URLParam(r, "sn")) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(dev)), + ) +} + +// UpdateDevice 更改设备信息 +func UpdateDevice(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + req := new(service.UpdateDevicesReq) + if binding.Bind(r, req).CustomHandle(HandleValidateErrs, w) { + return + } + + if user != nil { + req.LoginName = user.LoginName + } + + dev, err := service.UpdateDeviceBySN(log, repo, conf, req) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{"id": dev.ID}), + ) +} + +// UpdateDeviceOperationStatus 更改设备信息操作状态 +func UpdateDeviceOperationStatus(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + req := new(service.UpdateDevicesOperationStatusReq) + if binding.Bind(r, req).CustomHandle(HandleValidateErrs, w) { + return + } + + if user != nil { + req.LoginName = user.LoginName + } + + dev, err := service.UpdateDeviceOperationStatusBySN(log, repo, conf, req) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{"id": dev.ID}), + ) +} + +// UpdateDevices 批量更改设备信息 +func UpdateDevices(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + req := new(service.BatchUpdateDevicesReq) + if binding.Bind(r, req).CustomHandle(HandleValidateErrs, w) { + return + } + + if user != nil { + req.LoginName = user.LoginName + } + + affected, err := service.BatchUpdateDevices(log, repo, conf, req) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{"affected": affected}), + ) +} + +// DeleteDevices 批量删除设备 +func DeleteDevices(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + req := new(service.DeleteDevicesReq) + if binding.Bind(r, req).CustomHandle(HandleValidateErrs, w) { + return + } + totalAffected, err := service.DeleteDevices(log, repo, req) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{"ids": req.IDs, "sns": req.SNs, "total_affected": totalAffected}), + ) +} + +// GetDevicePageByTor 根据指定的TOR查询物理机分页列表 +func GetDevicePageByTor(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + + req := new(service.DevicePageByTorReq) + if binding.Form(r, req).CustomHandle(HandleValidateErrs, w) { + return + } + + pg, err := service.GetDeviceByTorPage(log, repo, conf, req) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} + +// ExportCombinedDevices 导出设备信息详情 +func ExportCombinedDevices(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + + reqData := service.DevicePageReq{} //ExportDevicesReq{} + if binding.Bind(r, &reqData).Handle(w) { + return + } + + items, err := service.GetExportDevices(log, repo, conf, &reqData) + if err != nil { + log.Error(err) + w.WriteHeader(http.StatusInternalServerError) + return + } + + for _, item := range items { + item.OperationStatus = service.OperationStatusTransfer(item.OperationStatus, true) + item.PowerStatus = service.ConvertPowerStatus(item.PowerStatus) + } + + err = render.XLSX(w, utils.FileDevice, service.ExportedDevices(items).ToTableRecords()) + if err != nil { + log.Error(err) + } +} + +/////////////////////////////特殊设备///////////////////////////////// +// UploadSpecialDevices 文件导入文件上传 +func UploadSpecialDevices(w http.ResponseWriter, r *http.Request) { + //预防乱码 + w.Header().Add("Content-type", "text/html; charset=utf-8") + + //解析并生成临时文件,为后续的工作做准备 + filename, err := upload.GenerateTempFile(r, "special-device") + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "result": filename, + })) +} + +// ImportSpecialDevicesPreview 导入特殊设备文件预览 +func ImportSpecialDevicesPreview(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.ImportPreviewReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + result, err := service.ImportSpecialDevicesPreview(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", result)) +} + +//ImportSpecialDevices 导入特殊设备 +func ImportSpecialDevices(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var reqData service.ImportPreviewReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if user != nil { + reqData.LoginName = user.LoginName + } + + err := service.ImportSpecialDevices(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +//SaveSpecialDevices 新增特殊设备 +func SaveSpecialDevice(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var reqData service.SpecialDeviceReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if user != nil { + reqData.LoginName = user.LoginName + } + + mod, err := service.SaveSpecialDevices(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{"id": mod.ID})) +} + + +//SaveNewDevices 新增设备 +func SaveNewDevices(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + + var reqData service.NewDevicesList + if err := myhttp.DecodeJSON(r, &reqData); err != nil { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + succeedSNs, totalAffected, err := service.SaveNewDevices(log, repo, conf, &service.NewDevicesReq{ + NewDevices: reqData, + CurrentUser: user, + }) + if err != nil { + //HandleErr(r.Context(), w, err) + //render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Failure, "操作失败", map[string]interface{}{"succeed_sns": succeedSNs, "total_affected": totalAffected, "detail": err.Error()}), + ) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{"succeed_sns": succeedSNs, "total_affected": totalAffected, "detail":"success"}), + ) +} + + +//BatchMoveDevices 设备搬迁 +func BatchMoveDevices(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + + var reqData service.BatchMoveDevicesList + if err := myhttp.DecodeJSON(r, &reqData); err != nil { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + succeedSNs, totalAffected, err := service.BatchMoveDevices(log, repo, conf, &service.BatchMoveDevicesReq{ + Devices: reqData, + CurrentUser: user, + }) + if err != nil { + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Failure, "操作失败", map[string]interface{}{"succeed_sns": succeedSNs, "total_affected": totalAffected, "detail": err.Error()}), + ) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{"succeed_sns": succeedSNs, "total_affected": totalAffected, "detail":"success"}), + ) +} + + +//BatchMoveDevices 设备退役 +func BatchRetireDevices(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + + var reqData service.BatchRetireDevicesList + if err := myhttp.DecodeJSON(r, &reqData); err != nil { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + succeedSNs, totalAffected, err := service.BatchRetireDevices(log, repo, conf, &service.BatchRetireDevicesReq{ + SNs: reqData, + CurrentUser: user, + }) + if err != nil { + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Failure, "操作失败", map[string]interface{}{"succeed_sns": succeedSNs, "total_affected": totalAffected, "detail": err.Error()}), + ) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{"succeed_sns": succeedSNs, "total_affected": totalAffected, "detail":"success"}), + ) +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/device_category.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/device_category.go new file mode 100644 index 0000000000000000000000000000000000000000..357c5a0103247517265e7879e25adc7ea7a64c78 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/device_category.go @@ -0,0 +1,115 @@ +package route + +import ( + "net/http" + "strconv" + + "github.com/go-chi/chi" + "github.com/voidint/binding" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// SaveDeviceCategory 保存(新增/修改)设备类型 +func SaveDeviceCategory(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var reqData service.SaveDeviceCategoryReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if user != nil { + reqData.LoginName = user.LoginName + } + + err := service.SaveDeviceCategory(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": reqData.ID, + })) +} + +// RemoveDeviceCategorys 移除设备类型 +func RemoveDeviceCategorys(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.DelDeviceCategoryReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + affected, err := service.RemoveDeviceCategorys(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "affected": affected, + })) +} + +// GetDeviceCategoryPage 查询设备类型分页列表 +func GetDeviceCategoryPage(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.GetDeviceCategoryPageReq + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + pg, err := service.GetDeviceCategorysPage(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} + +// GetDeviceCategoryByID 查询指定ID的设备类型信息详情 +func GetDeviceCategoryByID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + sr, err := service.GetDeviceCategoryByID(log, repo, uint(id)) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(sr)), + ) +} + +// GetDeviceCategoryQuerys 设备类型的查询(过滤)参数列表 +func GetDeviceCategoryQuerys(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + //|category|... + p, err := service.GetDeviceCategoryQuerys(log, repo, chi.URLParam(r, "param_name")) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(p)), + ) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/device_hardware_setting.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/device_hardware_setting.go new file mode 100644 index 0000000000000000000000000000000000000000..df7249ae66c0844b9025d90f981029ca2cd17f70 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/device_hardware_setting.go @@ -0,0 +1,41 @@ +package route + +import ( + "net/http" + + "github.com/go-chi/chi" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// GetHardwareSettingBySN 查询设备的硬件配置参数(RAID、BIOS、OOB) +func GetHardwareSettingBySN(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + items, err := service.GetHardwareSettingsBySN(log, repo, chi.URLParam(r, "sn")) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(items)), + ) +} + +// GetHardwareInfoBySN 查询设备的硬件配置参数(序列号、厂商、型号、设备类型、硬件备注) +func GetHardwareInfoBySN(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + items, err := service.GetHardwareInfoBySN(log, repo, chi.URLParam(r, "sn")) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(items)), + ) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/device_lifecycle.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/device_lifecycle.go new file mode 100644 index 0000000000000000000000000000000000000000..b5c9fa28a107be798817cfa8687fd51d0154ab43 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/device_lifecycle.go @@ -0,0 +1,82 @@ +package route + +import ( + "net/http" + "github.com/voidint/binding" + "github.com/go-chi/chi" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + + +// GetDeviceLifecycleBySN +func GetDeviceLifecycleBySN(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + devLifecycle, err := service.GetDeviceLifecycleBySN(log, repo, chi.URLParam(r, "sn")) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(devLifecycle)), + ) +} + +// UpdateDeviceLifecycleBySN +func UpdateDeviceLifecycleBySN(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + reqData := service.UpdateDeviceLifecycleReq{ + SN: chi.URLParam(r, "sn"), + } + if user != nil { + reqData.LoginName = user.LoginName + } + + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + err := service.UpdateDeviceLifecycleBySN(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "sn": reqData.SN, + })) +} + +// BatchUpdateDeviceLifecycleBySN 批量更改设备生命周期信息 +func BatchUpdateDeviceLifecycleBySN(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + req := new(service.BatchUpdateDeviceLifecycles) + if binding.Bind(r, req).CustomHandle(HandleValidateErrs, w) { + return + } + + if user != nil { + req.LoginName = user.LoginName + } + + succeedSNs, totalAffected, err := service.BatchUpdateDeviceLifecycleBySN(log, repo, conf, req) + if err != nil { + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Failure, "操作失败", map[string]interface{}{"succeed_sns": succeedSNs, "total_affected": totalAffected, "detail": err.Error()}), + ) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{"succeed_sns": succeedSNs, "total_affected": totalAffected, "detail":"success"}), + ) +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/device_log.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/device_log.go new file mode 100644 index 0000000000000000000000000000000000000000..3bd794621b405d2c5e8e74e9683e068274798c1b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/device_log.go @@ -0,0 +1,30 @@ +package route + +import ( + "net/http" + "strconv" + + "github.com/go-chi/chi" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// GetDeviceLogByDeviceSettingID 根据SN号返回安装的系统日志信息 +func GetDeviceLogByDeviceSettingID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "device_setting_id")) + if err != nil { + render.JSON(w, http.StatusOK, myhttp.ErrRespBody(err.Error())) + return + } + + logs, _ := service.GetDeviceLogByDeviceSettingID(log, repo, uint(id)) + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(logs)), + ) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/device_setting.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/device_setting.go new file mode 100644 index 0000000000000000000000000000000000000000..c74df01e49076a9c3bbfbf5659cd83d458668d2f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/device_setting.go @@ -0,0 +1,327 @@ +package route + +import ( + "net/http" + + "github.com/go-chi/chi" + "github.com/voidint/binding" + + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// SaveDeviceSettings 批量保存设备装机参数 +func SaveDeviceSettings(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + lim, _ := middleware.DHCPLimiterFromContext(r.Context()) + + var reqData service.DeviceSettings + if err := myhttp.DecodeJSON(r, &reqData); err != nil { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + if errs := reqData.Validate(r, []binding.Error{}); errs.Len() > 0 { + HandleValidateErrs(errs, w) + return + } + + succeeds, err := service.SaveDeviceSettings(log, repo, conf, lim, &service.SaveDeviceSettingsReq{ + Settings: reqData, + CurrentUser: user, + }) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "succeeds": succeeds, + }), + ) +} + +// SaveDeviceSettings 批量保存设备装机参数并重新安装系统 +func SaveDeviceSettingsAndReinstalls(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + lim, _ := middleware.DHCPLimiterFromContext(r.Context()) + + var reqData service.DeviceSettings + if err := myhttp.DecodeJSON(r, &reqData); err != nil { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + if errs := reqData.Validate(r, []binding.Error{}); errs.Len() > 0 { + HandleValidateErrs(errs, w) + return + } + + succeeds, err := service.SaveDeviceSettingsAndReinstalls(log, repo, conf, lim, &service.SaveDeviceSettingsReq{ + Settings: reqData, + CurrentUser: user, + }) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "succeeds": succeeds, + }), + ) +} + +// SaveDeviceSettingsWithoutInstalls 批量保存设备装机参数(忽略部署) +func SaveDeviceSettingsWithoutInstalls(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + lim, _ := middleware.DHCPLimiterFromContext(r.Context()) + + var reqData service.DeviceSettingsWithoutInstalls + if err := myhttp.DecodeJSON(r, &reqData); err != nil { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + succeeds, err := service.SaveDeviceSettingsWithoutInstalls(log, repo, conf, lim, &service.SaveDeviceSettingsWithoutInstallsReq{ + Settings: reqData, + CurrentUser: user, + }) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "succeeds": succeeds, + }), + ) +} + +// Reinstalls 批量重装设备 +func Reinstalls(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + lim, _ := middleware.DHCPLimiterFromContext(r.Context()) + + var reqData service.ReinstallsReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if err := service.Reinstalls(log, repo, conf, lim, &reqData); err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// Reinstalls 批量重装设备(根据规则引擎自动生成装机参数) +func AutoReinstalls(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + lim, _ := middleware.DHCPLimiterFromContext(r.Context()) + + var reqData service.AutoReinstallsReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + succeeds, err := service.AutoReinstalls(log, repo, conf, lim, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "succeeds": succeeds, + }), + ) +} + +// CancelInstalls 批量取消安装设备 +func CancelInstalls(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.CancelInstallsReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if err := service.CancelInstalls(log, repo, &reqData); err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// RemoveDeviceSettings 批量删除设备装机参数 +func RemoveDeviceSettings(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.RemoveDeviceSettingsReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if err := service.RemoveDeviceSettings(log, repo, &reqData); err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// GetDeviceSettingPage 查询设备装机参数分页列表 +func GetDeviceSettingPage(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.GetDeviceSettingPageReq + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + pg, err := service.GetDeviceSettingPage(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} + +// GetDeviceSettingBySN 查询指定sn的装机参数信息 +func GetDeviceSettingBySN(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + sett, err := service.GetDeviceSettingBySN(log, repo, chi.URLParam(r, "sn")) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(sett)), + ) +} + +// GetNetworkSettingBySN 返回指定设备的装机参数(业务网络配置) +func GetNetworkSettingBySN(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + setting, err := service.GetNetworkSettingBySN(log, repo, chi.URLParam(r, "sn")) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(setting)), + ) +} + +// GetOSUserSettingsBySN 返回指定设备的操作系统用户配置参数 +func GetOSUserSettingsBySN(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + reqData := service.GetOSUserSettingBySNReq{ + SN: chi.URLParam(r, "sn"), + } + + if errs := reqData.Validate(r, []binding.Error{}); errs.Len() > 0 { + HandleValidateErrs(errs, w) + return + } + + sett, err := service.GetOSUserSettingBySN(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(sett)), + ) +} + +//CountDeviceInstallStatic 装机信息统计 +func CountDeviceInstallStatic(w http.ResponseWriter, r *http.Request) { + log, _ := middleware.LoggerFromContext(r.Context()) + repo, _ := middleware.RepoFromContext(r.Context()) + + count, err := service.CountDeviceInstallStatic(log, repo) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(count)), + ) +} + + +//UpdateDeviceSetting +func UpdateDeviceSetting(w http.ResponseWriter, r *http.Request) { + log, _ := middleware.LoggerFromContext(r.Context()) + repo, _ := middleware.RepoFromContext(r.Context()) + + var reqData service.UpdateDeviceSettingReq + + if err := myhttp.DecodeJSON(r, &reqData); err != nil { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + err := service.UpdateDeviceSetting(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + + +// SetInstallsOK 批量设置部署状态=success +func SetInstallsOK(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + lim, _ := middleware.DHCPLimiterFromContext(r.Context()) + + var reqData service.SetInstallsOKReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if err := service.SetInstallsOK(log, repo, conf, lim, &reqData); err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/device_setting_rule.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/device_setting_rule.go new file mode 100644 index 0000000000000000000000000000000000000000..ac7abe0bcdf05ad7af02a32a9b414638f9d517c0 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/device_setting_rule.go @@ -0,0 +1,113 @@ +package route + +import ( + "net/http" + + "github.com/voidint/binding" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// SaveDeviceSettingRule 保存(新增/修改)规则记录 +func SaveDeviceSettingRule(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var reqData service.SaveDeviceSettingRuleReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if user != nil { + reqData.LoginName = user.LoginName + } + + err := service.SaveDeviceSettingRule(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": reqData.ID, + })) +} + +// RemoveDeviceSettingRules 移除设备类型 +func RemoveDeviceSettingRules(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.DelDeviceSettingRuleReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + affected, err := service.RemoveDeviceSettingRules(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "affected": affected, + })) +} + +//// GetDeviceSettingRulePage 获取规则记录分页 +func GetDeviceSettingRulePage(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.GetDeviceSettingRulePageReq + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + pg, err := service.GetDeviceSettingRulePage(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} + +// GetDeviceSettingRuleByID 查询指定ID的设备类型信息详情 +//func GetDeviceSettingRuleByID(w http.ResponseWriter, r *http.Request) { +// repo, _ := middleware.RepoFromContext(r.Context()) +// log, _ := middleware.LoggerFromContext(r.Context()) +// +// id, err := strconv.Atoi(chi.URLParam(r, "id")) +// if err != nil { +// log.Error(err) +// render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) +// return +// } +// +// sr, err := service.GetDeviceSettingRuleByID(log, repo, uint(id)) +// if err != nil { +// HandleErr(r.Context(), w, err) +// return +// } +// render.JSON(w, http.StatusOK, +// myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(sr)), +// ) +//} + +// GetDeviceSettingRuleQuerys 设备类型的查询(过滤)参数列表 +//func GetDeviceSettingRuleQuerys(w http.ResponseWriter, r *http.Request) { +// repo, _ := middleware.RepoFromContext(r.Context()) +// log, _ := middleware.LoggerFromContext(r.Context()) +// +// //|category|... +// p, err := service.GetDeviceSettingRuleQuerys(log, repo, chi.URLParam(r, "param_name")) +// if err != nil { +// HandleErr(r.Context(), w, err) +// return +// } +// render.JSON(w, http.StatusOK, +// myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(p)), +// ) +//} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/errors.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/errors.go new file mode 100644 index 0000000000000000000000000000000000000000..0a18b820e319df7a67b68a1fe5102925c46d7288 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/errors.go @@ -0,0 +1,53 @@ +package route + +import ( + "context" + "net/http" + "strings" + + "github.com/jinzhu/gorm" + "github.com/voidint/binding" + + "idcos.io/cloudboot/limiter" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// HandleValidateErrs 数据校验错误处理。 +// 将参数绑定校验框架(github.com/voidint/binding)产生的校验错误,以一定格式写入http response body。 +func HandleValidateErrs(errs binding.Errors, w http.ResponseWriter) bool { + if errs.Len() <= 0 { + return false + } + + if errs.Has(binding.SystemError) { + render.JSON(w, http.StatusInternalServerError, myhttp.ErrRespBody(errs.Error())) + } else if errs.Has(binding.BusinessError) && strings.Contains(errs.Error(), http.StatusText(http.StatusNotFound)) { + render.JSON(w, http.StatusNotFound, myhttp.ErrRespBody("资源不存在")) + } else { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(errs.Error())) + } + return true +} + +// HandleErr service层的业务逻辑错误处理 +func HandleErr(ctx context.Context, w http.ResponseWriter, err error) { + if err == nil { + return + } + + if strings.Contains(err.Error(), "校验") { // TODO 不好的实现方式,待修改。 + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + switch err { + case gorm.ErrRecordNotFound: + render.JSON(w, http.StatusNotFound, myhttp.ErrRespBody("资源不存在")) + case limiter.ErrBucketNotFound: + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody("未找到设备对应的令牌桶(TOR)")) + case limiter.ErrInvalidOrReturnedToken: + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody("设备未曾申请令牌或已归还令牌")) + default: + render.JSON(w, http.StatusInternalServerError, myhttp.ErrRespBody(err.Error())) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/hardware_template.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/hardware_template.go new file mode 100644 index 0000000000000000000000000000000000000000..2237194f5456fb1a2be34aab1eaabf7f5bd4257f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/hardware_template.go @@ -0,0 +1,124 @@ +package route + +import ( + "net/http" + "strconv" + + "github.com/go-chi/chi" + "github.com/voidint/binding" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// GetHardwareTpls 查询硬件配置模板分页列表 +func GetHardwareTpls(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + + var reqData service.HardwareTplPageReq + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + pg, err := service.GetHardwareTplPage(repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} + +// GetHardwareTemplateByID 查询指定ID的硬件模板 +func GetHardwareTemplateByID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + template, err := service.GetHardwareSettingsByID(repo, uint(id)) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(template)), + ) +} + +// RemoveHardTemplateByID 删除指定ID的硬件模板 +func RemoveHardTemplateByID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + affected, err := service.RemoveHardwareTemplate(repo, uint(id)) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "affected": affected, + }), + ) +} + +// SaveHardwareTemplate 新增、修改硬件配置模板 +func SaveHardwareTemplate(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + + var reqData service.SaveHardwareTplReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + id, err := service.SaveHardwareTemplate(repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": id, + }), + ) +} + +// UpdateHardwareTemplate 新增、修改硬件配置模板 +func UpdateHardwareTemplate(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + var reqData service.SaveHardwareTplReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + reqData.ID = uint(id) + + resp, err := service.SaveHardwareTemplate(repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": resp, + }), + ) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/idc.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/idc.go new file mode 100644 index 0000000000000000000000000000000000000000..bc7c9c0cf16a1ddc3418e8764f50d2245e85375a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/idc.go @@ -0,0 +1,154 @@ +package route + +import ( + "net/http" + + "strconv" + + "github.com/go-chi/chi" + "github.com/voidint/binding" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// SaveIDC 新增数据中心 +func SaveIDC(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + req := new(service.IDCReq) + if binding.Json(r, req).CustomHandle(HandleValidateErrs, w) { + return + } + + if user != nil { + req.LoginName = user.LoginName + } + + mod, err := service.SaveIDC(log, repo, req) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{"id": mod.ID}), + ) +} + +// UpdateIDC 修改数据中心 +func UpdateIDC(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + req := service.IDCReq{ + ID: uint(id), + } + if binding.Json(r, &req).CustomHandle(HandleValidateErrs, w) { + return + } + + mod, err := service.SaveIDC(log, repo, &req) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{"id": mod.ID}), + ) +} + +// UpdateIDCStatus 批量修改数据中心状态 +func UpdateIDCStatus(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + req := new(service.IDCUpdateReq) + if binding.Json(r, req).CustomHandle(HandleValidateErrs, w) { + return + } + + err := service.UpdateIDCStatus(log, repo, req) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{"ids": req.IDs}), + ) +} + +// RemoveIDCByID 移除数据中心 +func RemoveIDCByID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + idcID, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + err = service.RemoveIDCByID(log, repo, uint(idcID)) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{"id": idcID}), + ) +} + +// GetIDCPage 查询数据中心分页列表 +func GetIDCPage(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + req := new(service.IDCPageReq) + if binding.Form(r, req).CustomHandle(HandleValidateErrs, w) { + return + } + + pg, err := service.GetIDCPage(log, repo, req) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} + +// GetIDCByID 查询指定ID的数据中心信息详情 +func GetIDCByID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + idcID, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + idc, err := service.GetIDCByID(log, repo, uint(idcID)) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(idc)), + ) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/image_template.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/image_template.go new file mode 100644 index 0000000000000000000000000000000000000000..591c5f1108d8476ff05eabde206ebbacd10a6b3d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/image_template.go @@ -0,0 +1,167 @@ +package route + +import ( + "net/http" + "strconv" + + "github.com/go-chi/chi" + "github.com/voidint/binding" + + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// GetImageTemplateByID 查询指定ID的镜像安装模板 +func GetImageTemplateByID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + tpl, err := service.GetImageTemplateByID(log, repo, uint(id)) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(tpl)), + ) +} + +// GetImageTemplatePage 按条件查询镜像安装模板分页列表 +func GetImageTemplatePage(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.GetImageTemplatePageReq + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + pg, err := service.GetImageTemplatePage(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} + +// AddImageTemplate 新增镜像安装模板 +func AddImageTemplate(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.SaveImageTemplateReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + resp, err := service.SaveImageTemplate(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": resp, + }), + ) +} + +// SaveImageTemplate 新增镜像模板 +func SaveImageTemplate(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.SaveImageTemplateReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + resp, err := service.SaveImageTemplate(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": resp, + }), + ) +} + +// UpdateImageTemplateByID 更新镜像安装模板 +func UpdateImageTemplateByID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + reqData := service.SaveImageTemplateReq{ + ID: uint(id), + } + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + resp, err := service.SaveImageTemplate(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": resp, + }), + ) +} + +// RemoveImageTemplateByID 删除镜像安装模板 +func RemoveImageTemplateByID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + if err := service.RemoveImageTemplate(log, repo, uint(id)); err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// GetImageTemplateBySN 根据SN查询镜像安装模板 +func GetImageTemplateBySN(w http.ResponseWriter, r *http.Request) { + log, _ := middleware.LoggerFromContext(r.Context()) + repo, _ := middleware.RepoFromContext(r.Context()) + + tpl, err := service.GetImageTemplateBySN(log, repo, chi.URLParam(r, "sn")) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(tpl)), + ) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/inspection.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/inspection.go new file mode 100644 index 0000000000000000000000000000000000000000..d50b7f81295a242350fcb71c55e207f0e1237628 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/inspection.go @@ -0,0 +1,113 @@ +package route + +import ( + "net/http" + "strings" + + "github.com/go-chi/chi" + "github.com/voidint/binding" + + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// GetInspectionPage 查询硬件巡检分页 +func GetInspectionPage(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.GetInspectionsPageReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + pg, err := service.GetInspectionsPage(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} + +// GetInspectionBySN 查询指定设备某一次硬件巡检明细 +func GetInspectionBySN(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + + reqData := service.GetInspectionBySNReq{ + SN: strings.TrimSpace(chi.URLParam(r, "sn")), + } + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + resp, err := service.GetInspectionBySN(repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, + "操作成功", resp)) +} + +// GetInspectionStartTimesBySN 查询指定设备的历史硬件巡检开始时间列表 +func GetInspectionStartTimesBySN(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + + reqData := service.GetInspectionStartTimesBySNReq{ + SN: strings.TrimSpace(chi.URLParam(r, "sn")), + } + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + starts, err := service.GetInspectionStartTimesBySN(repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, + "操作成功", map[string]interface{}{ + "start_time": starts, + })) +} + +// GetInspectionStatistics 查询硬件巡检结果状态(正常、警告、异常)统计 +func GetInspectionStatistics(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.GetGetInspectionStatisticsReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + stats, err := service.GetGetInspectionStatistics(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "statistics": stats, + }), + ) +} + +// GetInspectionRecordsPage 查询物理机巡检记录分页列表 +func GetInspectionRecordsPage(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.InspectionRecordsPageReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + pg, err := service.GetInspectionRecordsPage(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/installation.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/installation.go new file mode 100644 index 0000000000000000000000000000000000000000..e66583b294948d24798cf00d8f6cba31d09de74a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/installation.go @@ -0,0 +1,59 @@ +package route + +import ( + "net/http" + + "github.com/go-chi/chi" + "github.com/voidint/binding" + + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// ReportInstallProgress 上报安装进度 +func ReportInstallProgress(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + logger, _ := middleware.LoggerFromContext(r.Context()) + lim, _ := middleware.DHCPLimiterFromContext(r.Context()) + + reqData := service.InstallProgressReq{ + SN: chi.URLParam(r, "sn"), + } + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + if err := service.ReportInstallProgress(logger, repo, conf, lim, &reqData); err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// GetInstallationStatus 查询设备安装状态 +func GetInstallationStatus(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + stat, err := service.GetInstallationStatus(log, repo, chi.URLParam(r, "sn")) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(stat)), + ) +} + +// IsInInstallList 查询指定设备是否在装机队列 +func IsInInstallList(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + logger, _ := middleware.LoggerFromContext(r.Context()) + + inList, _ := service.GetIsInInstallListBySN(logger, repo, chi.URLParam(r, "sn")) + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "result": inList, + })) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/ip_network.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/ip_network.go new file mode 100644 index 0000000000000000000000000000000000000000..dfbde652a5eef57e985dd53e104e02c1a921200a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/ip_network.go @@ -0,0 +1,350 @@ +package route + +import ( + "net/http" + "strconv" + + "github.com/go-chi/chi" + "github.com/voidint/binding" + + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + "idcos.io/cloudboot/utils" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" + "idcos.io/cloudboot/utils/upload" +) + +// GetIPNetworkByID 查询指定ID网段 +func GetIPNetworkByID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + one, err := service.GetIPNetworkByID(log, repo, uint(id)) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(one)), + ) +} + +// GetIPNetworkPage 按条件查询网段分页列表 +func GetIPNetworkPage(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.GetIPNetworkPageReq + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + pg, err := service.GetIPNetworkPage(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} + +// SaveIPNetwork 新增网段 +func SaveIPNetwork(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var reqData service.SaveIPNetworkReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if user != nil { + reqData.LoginName = user.LoginName + } + + if err := service.SaveIPNetwork(log, repo, &reqData); err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": reqData.ID, + })) +} + +// UpdateIPNetwork 更新网段 +func UpdateIPNetwork(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + reqData := service.SaveIPNetworkReq{ + ID: id, + } + + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if err := service.SaveIPNetwork(log, repo, &reqData); err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": reqData.ID, + })) +} + +// RemoveIPNetworkByID 删除网段 +func RemoveIPNetworkByID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + //删除前校验,存在子数据不允许删除 + msg := service.RemoveIPNetworkValidte(log, repo, uint(id)) + if msg != "" { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(msg)) + return + } + + if err := service.RemoveIPNetwork(log, repo, uint(id)); err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + + +// RemoveIPNetworks 批量删除网段 +func RemoveIPNetworks(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.DelIPNetworkReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + affected, err := service.RemoveIPNetworks(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "affected": affected, + })) +} + + +// GetIPSPage 按条件查询网段分页列表 +func GetIPSPage(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.GetIPSPageReq + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + pg, err := service.GetIPSPage(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} + +//ExportIP 导出IP信息 +func ExportIP(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + + reqData := service.GetIPSPageReq{} //ExportDevicesReq{} + if binding.Bind(r, &reqData).Handle(w) { + return + } + + items, err := service.GetExportIP(log, repo, conf, &reqData) + if err != nil { + log.Error(err) + w.WriteHeader(http.StatusInternalServerError) + return + } + + err = render.XLSX(w, utils.FileIP, service.ExportIPInfo(items).ToTableRecords()) + if err != nil { + log.Error(err) + } +} + +//AssignIP 手动分配IP +func AssignIP(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.AssignIPReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + err := service.AssignIP(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + + +// AssignIPv4 web界面按钮分配ipv4 +func AssignIPv4(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.AssignIPv4Req + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + err := service.AssignIPv4(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + + +// AssignIPv6 web界面按钮分配ipv6 +func AssignIPv6(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.AssignIPv6Req + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + err := service.AssignIPv6(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + + +//UnassignIP 手动解除与物理机绑定 +func UnassignIP(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.UnassignIPReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + err := service.UnassignIP(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// DisableIP 更新IP状态,主要是禁用一个IP +func DisableIP(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.DisableIPReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + err := service.DisableIP(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// UploadIPNetworks 导入文件上传 +func UploadIPNetworks(w http.ResponseWriter, r *http.Request) { + //预防乱码 + w.Header().Add("Content-type", "text/html; charset=utf-8") + + //解析并生成临时文件,为后续的工作做准备 + filename, err := upload.GenerateTempFile(r, "ip-networks") + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "result": filename, + })) +} + +// ImportIPNetworksPreview 导入设备文件预览 +func ImportIPNetworksPreview(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.ImportPreviewReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + result, err := service.ImportIPNetworksPreview(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", result)) +} + +//ImportIPNetworks 导入物理机 +func ImportIPNetworks(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var reqData service.ImportPreviewReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if user != nil { + reqData.LoginName = user.LoginName + } + + err := service.ImportIPNetworks(log, repo, conf, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/job.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/job.go new file mode 100644 index 0000000000000000000000000000000000000000..21a3e8d1888ead661796780e6c028af71558232a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/job.go @@ -0,0 +1,123 @@ +package route + +import ( + "net/http" + + "github.com/go-chi/chi" + "github.com/voidint/binding" + + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// GetJobByID 查询指定ID的任务 +func GetJobByID(w http.ResponseWriter, r *http.Request) { + conf, _ := middleware.ConfigFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + jobmgr, _ := middleware.JobManagerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + job, err := service.GetJobByID(log, conf, jobmgr, &service.GetJobByIDReq{ + ID: chi.URLParam(r, "job_id"), + CurrentUser: user, + }) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(job)), + ) +} + +// GetJobPage 查询满足过滤条件的任务分页列表 +func GetJobPage(w http.ResponseWriter, r *http.Request) { + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + jobmgr, _ := middleware.JobManagerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + reqData := service.GetJobPageReq{ + CurrentUser: user, + } + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + pg, err := service.GetJobPage(log, conf, jobmgr, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} + +// PauseJob 暂停运行中的目标定时任务 +func PauseJob(w http.ResponseWriter, r *http.Request) { + jobmgr, _ := middleware.JobManagerFromContext(r.Context()) + + if err := service.PauseJob(jobmgr, chi.URLParam(r, "job_id")); err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.SucceedRespBody("操作成功"), + ) +} + +// UnpauseJob 继续已暂停的目标定时任务 +func UnpauseJob(w http.ResponseWriter, r *http.Request) { + jobmgr, _ := middleware.JobManagerFromContext(r.Context()) + + if err := service.UnpauseJob(jobmgr, chi.URLParam(r, "job_id")); err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.SucceedRespBody("操作成功"), + ) +} + +// RemoveJob 删除非内置任务 +func RemoveJob(w http.ResponseWriter, r *http.Request) { + jobmgr, _ := middleware.JobManagerFromContext(r.Context()) + + if err := service.RemoveJob(jobmgr, chi.URLParam(r, "job_id")); err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.SucceedRespBody("操作成功"), + ) +} + +// AddInspectionJob 新增硬件巡检任务 +func AddInspectionJob(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + jobmgr, _ := middleware.JobManagerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + reqData := service.AddInspectionJobReq{ + OriginNode: myhttp.ExtractOriginNodeWithDefault(r, "master"), + Creator: user.ID, + } + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + newid, err := service.AddInspectionJob(log, repo, conf, jobmgr, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", + map[string]interface{}{ + "job_id": newid, + }, + )) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/limiter.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/limiter.go new file mode 100644 index 0000000000000000000000000000000000000000..f6d69b25688422044a0b32d417a933d552298a65 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/limiter.go @@ -0,0 +1,66 @@ +package route + +import ( + "net/http" + + "github.com/go-chi/chi" + "github.com/voidint/binding" + + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// ReturnLimiterTokenBySN 归还目标设备的限流器令牌 +func ReturnLimiterTokenBySN(w http.ResponseWriter, r *http.Request) { + log, _ := middleware.LoggerFromContext(r.Context()) + repo, _ := middleware.RepoFromContext(r.Context()) + lim, _ := middleware.DHCPLimiterFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + + //if !conf.DHCPLimiter.Enable { + // render.JSON(w, http.StatusAccepted, myhttp.ErrRespBody("限流器已关闭,请修改限流器配置后再重试。")) // TODO 寻找一个更合适的状态码 + // return + //} + + reqData := service.ReturnLimiterTokenBySNReq{ + SN: chi.URLParam(r, "sn"), + } + + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + if err := service.ReturnLimiterTokenBySN(log, repo, lim, conf, &reqData); err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// ReturnLimiterTokens 归还指定设备列表的限流器令牌 +func ReturnLimiterTokens(w http.ResponseWriter, r *http.Request) { + log, _ := middleware.LoggerFromContext(r.Context()) + lim, _ := middleware.DHCPLimiterFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + repo, _ := middleware.RepoFromContext(r.Context()) + + //if !conf.DHCPLimiter.Enable { + // render.JSON(w, http.StatusAccepted, myhttp.ErrRespBody("限流器已关闭,请修改限流器配置后再重试。")) // TODO 寻找一个更合适的状态码 + // return + //} + + reqData := service.ReturnLimiterTokensReq{} + + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + if succeed, err := service.ReturnLimiterTokens(log, repo, lim, conf, &reqData); err != nil || succeed == 0 { + render.JSON(w, http.StatusOK, myhttp.ErrRespBody("操作失败")) + return + } else if succeed != len(reqData.Tokens) { + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("部分成功")) + return + } + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/network_area.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/network_area.go new file mode 100644 index 0000000000000000000000000000000000000000..37ff23ecd82ed24ca844626610dda63e72b2c895 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/network_area.go @@ -0,0 +1,212 @@ +package route + +import ( + "net/http" + "strconv" + + "github.com/go-chi/chi" + "github.com/voidint/binding" + + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" + "idcos.io/cloudboot/utils/upload" +) + +// SaveNetworkArea 保存(新增/修改)网络区域 +func SaveNetworkArea(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var reqData service.SaveNetworkAreaReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if user != nil { + reqData.LoginName = user.LoginName + } + + if err := service.SaveNetworkArea(log, repo, &reqData); err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": reqData.ID, + })) +} + +// UpdateNetworkArea 修改网络区域 +func UpdateNetworkArea(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + reqData := service.SaveNetworkAreaReq{ + ID: uint(id), + } + + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if err := service.SaveNetworkArea(log, repo, &reqData); err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": reqData.ID, + })) +} + +// UpdateNetworkAreasStatus 批量修改网络区域状态 +func UpdateNetworkAreasStatus(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + + var reqData service.UpdateNetworkAreasStatusReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + affected, err := service.UpdateNetworkAreasStatus(repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "affected": affected, + })) +} + +// RemoveNetworkAreaByID 移除网络区域 +func RemoveNetworkAreaByID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil || id < 0 { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + reqData := service.RemoveNetworkAreaReq{ + ID: uint(id), + } + if errs := reqData.Validate(r, []binding.Error{}); errs.Len() > 0 { + HandleValidateErrs(errs, w) + return + } + + if err := service.RemoveNetworkArea(repo, &reqData); err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// GetNetworkAreaPage 查询网络区域分页列表 +func GetNetworkAreaPage(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.GetNetworkAreaPageReq + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + pg, err := service.GetNetworkAreaPage(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} + +// GetNetworkAreaByID 查询指定ID的网络区域信息详情 +func GetNetworkAreaByID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + one, err := service.GetNetworkAreaByID(repo, uint(id)) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(one)), + ) +} + +//UploadNetworkArea 加载导入网络区域文件 +func UploadNetworkArea(w http.ResponseWriter, r *http.Request) { + //预防乱码 + w.Header().Add("Content-type", "text/html; charset=utf-8") + + //解析并生成临时文件,为后续的工作做准备 + filename, err := upload.GenerateTempFile(r, "network-area") + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "result": filename, + })) + + return +} + +//ImportNetworkAreaPriview 导入网络区域文件预览 +func ImportNetworkAreaPriview(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData upload.ImportReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + result, err := service.ImportNetworkAreaPriview(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", result)) +} + +//ImportNetworkArea 导入网络区域文件 +func ImportNetworkArea(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData upload.ImportReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + err := service.ImportNetworkArea(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/network_device.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/network_device.go new file mode 100644 index 0000000000000000000000000000000000000000..c1246f490f3814b5cfab246f766f2b00b91f2305 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/network_device.go @@ -0,0 +1,181 @@ +package route + +import ( + "net/http" + "strconv" + + myhttp "idcos.io/cloudboot/utils/http" + + "github.com/go-chi/chi" + "github.com/voidint/binding" + "idcos.io/cloudboot/middleware" + + "idcos.io/cloudboot/server/cloudbootserver/service" + + "idcos.io/cloudboot/utils/http/render" + "idcos.io/cloudboot/utils/upload" +) + +// DeleteNetworkDeviceByID 移除网络设备 +func DeleteNetworkDeviceByID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + if err := service.RemoveNetworkDeviceByID(repo, uint(id)); err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// RemoveNetworkDevices 批量删除网络设备 +func RemoveNetworkDevices(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.DelNetworkDeviceReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + affected, err := service.RemoveNetworkDevices(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "affected": affected, + })) +} + +// GetNetworkDeviceByID 查询指定ID的网络设备 +func GetNetworkDeviceByID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + resp, err := service.GetNetworkDeviceByID(repo, uint(id)) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(resp))) +} + +// GetNetworkDevicePage 查询网络设备分页列表 +func GetNetworkDevicePage(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + + var reqData service.NetworkDevicePageReq + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + pg, err := service.GetNetworkDevicesPage(repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} + +// SaveNetworkDevice 查询网络设备分页列表 +func SaveNetworkDevice(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var reqData service.SaveNetworkDeviceReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if user != nil { + reqData.LoginName = user.LoginName + } + + device, err := service.SaveNetworkDevice(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "fixed_asset_number": device.FixedAssetNumber, + "id": device.ID, + }), + ) +} + + +// UploadNetworkDevices 网络设备导入文件上传 +func UploadNetworkDevices(w http.ResponseWriter, r *http.Request) { + //预防乱码 + w.Header().Add("Content-type", "text/html; charset=utf-8") + + //解析并生成临时文件,为后续的工作做准备 + filename, err := upload.GenerateTempFile(r, "network-device") + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "result": filename, + })) +} + +// ImportNetworkDevicesPreview 导入设备文件预览 +func ImportNetworkDevicesPreview(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData upload.ImportReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + result, err := service.ImportNetworkDevicePreview(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", result)) +} + +//ImportNetworkDevices 导入 +func ImportNetworkDevices(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var reqData upload.ImportReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if user != nil { + reqData.UserName = user.LoginName + } + + err := service.ImportNetworkDevices(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/oob.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/oob.go new file mode 100644 index 0000000000000000000000000000000000000000..e0172f49ce278c92b3a2f0fb91b0e320a6950699 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/oob.go @@ -0,0 +1,225 @@ +package route + +import ( + "net/http" + + "github.com/go-chi/chi" + "github.com/voidint/binding" + + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + "idcos.io/cloudboot/utils" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// GetOOBUserBySN 根据sn查询带外账户信息 +func GetOOBUserBySN(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + + user, err := service.GetOOBInfoBySn(log, repo, conf, chi.URLParam(r, "sn")) + if err != nil { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(user)), + ) +} + +// OOBPowerOn 带外管理批量开机 +func OOBPowerOn(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + + var reqData service.OOBPowerBatchOperateReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + output, err := service.BatchOperateOOBPower(log, repo, service.PowerOn, conf, false, reqData.Sns) + if err != nil { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "output": output, + }), + ) +} + +// OOBPowerOff 带外管理批量关机 +func OOBPowerOff(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + + var reqData service.OOBPowerBatchOperateReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + output, err := service.BatchOperateOOBPower(log, repo, service.PowerOff, conf, false, reqData.Sns) + if err != nil { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "output": output, + }), + ) +} + +// OOBPowerRestart 带外管理批量重启 +func OOBPowerRestart(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + + var reqData service.OOBPowerBatchOperateReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + output, err := service.BatchOperateOOBPower(log, repo, service.PowerRestart, conf, false, reqData.Sns) + if err != nil { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "output": output, + }), + ) +} + +// OOBPowerPxeRestart 带外管理批量PXE重启 +func OOBPowerPxeRestart(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + + var reqData service.OOBPowerBatchOperateReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + output, err := service.BatchOperateOOBPower(log, repo, service.PowerRestart, conf, true, reqData.Sns) + if err != nil { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "output": output, + }), + ) +} + +// DevicePowerStatus 查看设备电源状态 +func DevicePowerStatus(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + + sn := chi.URLParam(r, "sn") + + output, err := service.GetDevicePowerStatusBySN(log, repo, conf, sn) + if err != nil { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "power_status": output, + }), + ) +} + +//UpdateOOBPasswordBySN 根据sn更改带外密码 +func UpdateOOBPasswordBySN(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + + req := new(service.UpdateOOBPasswordReq) + req.SN = chi.URLParam(r, "sn") + + if binding.Bind(r, req).CustomHandle(HandleValidateErrs, w) { + return + } + //req.Remark = model.OOBHistoryRemarkManu + _, err := service.UpdateOOBPasswordBySN(log, repo, req, conf) + if err != nil { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +//ReAccessOOB 批量重新纳管带外,检查带外是否通 +func ReAccessOOB(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + req := service.ReAccessOOBReq{} + if binding.Bind(r, &req).CustomHandle(HandleValidateErrs, w) { + return + } + err := service.ReAccessOOB(log, repo, conf, &req) + if err != nil { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +//ExportOOB 导出带外信息 +func ExportOOB(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + + reqData := service.DevicePageReq{} //ExportDevicesReq{} + if binding.Bind(r, &reqData).Handle(w) { + return + } + + items, err := service.GetExportDevices(log, repo, conf, &reqData) + if err != nil { + log.Error(err) + w.WriteHeader(http.StatusInternalServerError) + return + } + + err = render.XLSX(w, utils.FileOOB, service.ExportOOBInfo(items).ToTableRecords()) + if err != nil { + log.Error(err) + } +} + +// OOBInspectionOperate 带外巡检操作 +func OOBInspectionOperate(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + + var reqData service.OOBInspectionOperateReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + output, err := service.OOBInspectionOperate(log, repo, conf, &reqData) + if err != nil { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(output)), + ) +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/oob_log.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/oob_log.go new file mode 100644 index 0000000000000000000000000000000000000000..82d0bc50a6daa043e2dc763704c6d9cc089c598a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/oob_log.go @@ -0,0 +1,33 @@ +package route + +import ( + "net/http" + + "github.com/go-chi/chi" + + "idcos.io/cloudboot/job/mysql" + "idcos.io/cloudboot/middleware" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +//GetOOBlogBySN 根据sn获取impo传感器、事件数据 +func GetOOBlogBySN(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + + req := mysql.NewInspectionJob(log, repo, conf, "") + sn := chi.URLParam(r, "sn") + + output := req.Collect(sn) + if output.Error != "" { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(output.Error)) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "power_status": output, + }), + ) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/operate_log.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/operate_log.go new file mode 100644 index 0000000000000000000000000000000000000000..4a85f0b78ba5ce4662541fbab38f534c1afa554d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/operate_log.go @@ -0,0 +1,31 @@ +package route + +import ( + "net/http" + + "github.com/voidint/binding" + + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// GetOperateLogPage 查询操作记录 +func GetOperateLogPage(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.GetOperateLogPageReq + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + pg, err := service.GetOperateLogWithPage(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/order.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/order.go new file mode 100644 index 0000000000000000000000000000000000000000..6d5adc5725e0489b58cc0e8c77a49eabc2ac14a1 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/order.go @@ -0,0 +1,142 @@ +package route + +import ( + "net/http" + "strconv" + + "github.com/go-chi/chi" + "github.com/voidint/binding" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + "idcos.io/cloudboot/utils" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// SaveOrder 保存(新增/修改)订单 +func SaveOrder(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var reqData service.SaveOrderReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if user != nil { + reqData.LoginName = user.LoginName + } + + err := service.SaveOrder(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": reqData.ID, + })) +} + +// RemoveOrders 移除订单 +func RemoveOrders(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.DelOrderReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + affected, err := service.RemoveOrders(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "affected": affected, + })) +} + +// GetOrderPage 查询订单分页列表 +func GetOrderPage(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.GetOrderPageReq + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + pg, err := service.GetOrdersPage(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} + +// ExportOrders 导出订单 +func ExportOrders(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + reqData := service.GetOrderPageReq{} + if binding.Bind(r, &reqData).Handle(w) { + return + } + + items, err := service.GetExportOrders(log, repo, &reqData) + if err != nil { + log.Error(err) + w.WriteHeader(http.StatusInternalServerError) + return + } + err = render.XLSX(w, utils.FileOrder, service.ExportedOrders(items).ToTableRecords()) + if err != nil { + log.Error(err) + } +} + +// GetOrderByID 查询指定ID的订单信息详情 +func GetOrderByID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + sr, err := service.GetOrderByID(log, repo, uint(id)) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(sr)), + ) +} + +// UpdateOrderStatus 查询指定ID的订单信息详情 +func UpdateOrderStatus(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.UpdateOrderStatusReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + err := service.UpdateOrderStatus(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": reqData.ID, + })) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/os_template.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/os_template.go new file mode 100644 index 0000000000000000000000000000000000000000..db9fcbc1629a2ad57b5d3391076bce0b72bee139 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/os_template.go @@ -0,0 +1,36 @@ +package route + +import ( + "net/http" + + "github.com/voidint/binding" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// GetTemplatesByCond 根据查询条件查询镜像和系统模板信息 +func GetTemplatesByCond(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.TemplateReq + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + resp, err := service.GetTemplatesByCond(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + osResp := service.TemplateRecordsResp{ + Records: resp, + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(&osResp)), + ) +} + diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/permission.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/permission.go new file mode 100644 index 0000000000000000000000000000000000000000..af1af9ba7f0588423ef6949e165fd2173efc153a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/permission.go @@ -0,0 +1,38 @@ +package route + +import ( + "encoding/json" + "fmt" + "idcos.io/cloudboot/model" + "net/http" + + "idcos.io/cloudboot/middleware" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// PermissionCodeTree 查询权限码树 +func PermissionCodeTree(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + + typ := r.FormValue("type") + + if typ != model.MenuPermissionType && typ != model.ButtonPermissionType && typ != model.DataPermissionType && typ != model.APIPermissionType { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(fmt.Sprintf("未知权限类型,%s", typ))) + return + } + + setting, err := repo.GetSystemSetting(typ) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + body := myhttp.RespBody{} + if err := json.Unmarshal([]byte(setting.Value), &body); err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, &body) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/pxe.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/pxe.go new file mode 100644 index 0000000000000000000000000000000000000000..e1bc811cc3c79ac8032d62a49a93a271971123d3 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/pxe.go @@ -0,0 +1,85 @@ +package route + +import ( + "net/http" + "net/url" + + "github.com/go-chi/chi" + "github.com/voidint/binding" + + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// GenPXE4CentOS6UEFI 为CentOS6.x(UEFI)生成PXE文件、修改dhcp配置文件、重启dhcp服务。 +func GenPXE4CentOS6UEFI(w http.ResponseWriter, r *http.Request) { + log, _ := middleware.LoggerFromContext(r.Context()) + repo, _ := middleware.RepoFromContext(r.Context()) + + reqData := service.GenPXE4CentOS6UEFIReq{ + SN: chi.URLParam(r, "sn"), + } + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + filename, err := service.GenPXE4CentOS6UEFI(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "filename": filename, + })) +} + +// GenPXE 为目标设备生成PXE文件 +func GenPXE(w http.ResponseWriter, r *http.Request) { + log, _ := middleware.LoggerFromContext(r.Context()) + repo, _ := middleware.RepoFromContext(r.Context()) + + reqData := service.GenPXEReq{ + SN: chi.URLParam(r, "sn"), + } + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + filename, err := service.GenPXE(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "filename": filename, + })) +} + +// GetPXE 返回目标设备PXE +//From iPXE: +//:netboot +//chain http://osinstall/api/cloudboot/v1/devices/${serial}/pxe?arch=${buildarch} +func GetPXE(w http.ResponseWriter, r *http.Request) { + log, _ := middleware.LoggerFromContext(r.Context()) + repo, _ := middleware.RepoFromContext(r.Context()) + + reqData := service.GetPXEReq{ + SN: chi.URLParam(r, "sn"), + } + + reqData.SN, _ = url.QueryUnescape(reqData.SN) + + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + pxe, err := service.GetPXE(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.Text(w, http.StatusOK, []byte(pxe)) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/server_cabinet.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/server_cabinet.go new file mode 100644 index 0000000000000000000000000000000000000000..808bfed26131c9e46f230a8919239015e2c39c5b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/server_cabinet.go @@ -0,0 +1,358 @@ +package route + +import ( + "fmt" + "net/http" + "strconv" + + "github.com/go-chi/chi" + "github.com/voidint/binding" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" + "idcos.io/cloudboot/utils/upload" +) + +// UpdateServerCabinetStatus 保存(新增/修改)机架(柜)状态(是否启用) +func UpdateServerCabinetStatus(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.UpdateServerCabinetStatusReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if err := service.UpdateServerCabinetStatus(log, repo, &reqData); err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// AcceptServerCabinet 机架验收 +func AcceptServerCabinet(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.AcceptServerCabinetStatusReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if err := service.AcceptServerCabinet(log, repo, &reqData); err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// EnableServerCabinet 启用 +func EnableServerCabinet(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.EnableServerCabinetStatusReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if err := service.EnableServerCabinet(log, repo, &reqData); err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// ReconstructServerCabinet 重建(将已下线的重新建设,状态改为建设中) +func ReconstructServerCabinet(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.ReconstructServerCabinetStatusReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if err := service.ReconstructServerCabinet(log, repo, &reqData); err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// SaveServerCabinet 保存(新增)机架(柜) +func SaveServerCabinet(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var reqData service.SaveServerCabinetReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if user != nil { + reqData.LoginName = user.LoginName + } + + if err := service.SaveServerCabinet(log, repo, &reqData); err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": reqData.ID, + })) +} + +// UpdateServerCabinet 保存(修改)机架(柜) +func UpdateServerCabinet(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + reqData := service.SaveServerCabinetReq{ + ID: uint(id), + } + + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if err = service.SaveServerCabinet(log, repo, &reqData); err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": reqData.ID, + })) +} + +// RemoveServerCabinetByID 移除机架(柜) +func RemoveServerCabinetByID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi((chi.URLParam(r, "id"))) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + //删除前校验,存在子数据不允许删除 + msg := service.RemoveServerCabinetValidte(log, repo, uint(id)) + if msg != "" { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(msg)) + return + } + + err = service.RemoveServerCabinetByID(log, repo, uint(id)) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// GetServerCabinetPage 查询机架(柜)分页列表 +func GetServerCabinetPage(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.GetServerCabinetPageReq + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + pg, err := service.GetServerCabinetPage(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} + +// GetServerCabinetByID 查询指定ID的机架(柜)信息详情 +func GetServerCabinetByID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi((chi.URLParam(r, "id"))) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + sbc, err := service.GetServerByCabinetID(log, repo, uint(id)) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(sbc)), + ) +} + +//UploadServerCabinet 加载导入机架(柜)文件 +func UploadServerCabinet(w http.ResponseWriter, r *http.Request) { + //预防乱码 + w.Header().Add("Content-type", "text/html; charset=utf-8") + + //解析并生成临时文件,为后续的工作做准备 + filename, err := upload.GenerateTempFile(r, "server-cabinet") + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "result": filename, + })) + +} + +//ImportServerCabinetPriview 导入机架(柜)文件预览 +func ImportServerCabinetPriview(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData upload.ImportReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + result, err := service.ImportServerCabinetPriview(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", result)) +} + +//ImportServerCabinet 导入机架(柜)文件 +func ImportServerCabinet(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData upload.ImportReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + err := service.ImportServerCabinet(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// PowerOnServerCabinetByID 机架(柜)开电API +func PowerOnServerCabinetByID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + + var reqData service.CabinetPowerBatchOperateReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + cabinets, err := service.PowerOnServerCabinetByID(repo, reqData.IDS) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + if cabinets == 0 { + HandleErr(r.Context(), w, fmt.Errorf("未查询到有效的机架信息,%d", reqData.IDS)) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(cabinets)), + ) +} + +// PowerOffServerCabinetByID 机架(柜)关电API +func PowerOffServerCabinetByID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + one, err := service.PowerOffServerCabinetByID(repo, uint(id)) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + if one == 0 { + HandleErr(r.Context(), w, fmt.Errorf("未查询到有效的机架信息,%d", id)) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(one)), + ) +} + +// BatchUpdateServerCabinetsType 批量更新机架(柜)类型 +func BatchUpdateServerCabinetType(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + + var reqData service.UpdateServerCabinetTypeReq + if err := myhttp.DecodeJSON(r, &reqData); err != nil { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + affected, err := service.BatchUpdateServerCabinetType(repo, reqData.IDs, reqData.Type) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "affected": affected, + })) +} + +// BatchUpdateServerCabinetRemark 批量更新机架(柜)备注信息 +func BatchUpdateServerCabinetRemark(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + + var reqData service.UpdateServerCabinetRemarkReq + if err := myhttp.DecodeJSON(r, &reqData); err != nil { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + affected, err := service.BatchUpdateServerCabinetRemark(repo, reqData.IDs, reqData.Remark) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "affected": affected, + })) +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/server_conf.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/server_conf.go new file mode 100644 index 0000000000000000000000000000000000000000..34dcaa58fdc287282814cc914b01d5f734f0fc45 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/server_conf.go @@ -0,0 +1,19 @@ +package route + +import ( + "net/http" + + "idcos.io/cloudboot/middleware" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// GetSambaConf 获取Server Samba配置 +func GetSambaConf(w http.ResponseWriter, r *http.Request) { + //locale, _ := middleware.LocaleFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + + _ = render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(&conf.Samba)), + ) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/server_room.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/server_room.go new file mode 100644 index 0000000000000000000000000000000000000000..d03ee6401051888100b19631cb4cec626012240d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/server_room.go @@ -0,0 +1,219 @@ +package route + +import ( + "net/http" + "strconv" + + "github.com/go-chi/chi" + "github.com/voidint/binding" + + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" + "idcos.io/cloudboot/utils/upload" +) + +// SaveServerRoom 保存(新增/修改)机房 +func SaveServerRoom(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var reqData service.SaveServerRoomReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if user != nil { + reqData.LoginName = user.LoginName + } + + err := service.SaveServerRoom(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": reqData.ID, + })) +} + +// UpdateServerRoom 更新机房 +func UpdateServerRoom(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + reqData := service.SaveServerRoomReq{ + ID: uint(id), + } + + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if user != nil { + reqData.LoginName = user.LoginName + } + + err = service.SaveServerRoom(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": reqData.ID, + })) +} + +// UpdateServerRoomStatus 批量修改机房状态 +func UpdateServerRoomStatus(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.UpdateServerRoomStateReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + err := service.UpdateServerRoomStatus(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// RemoveServerRoomByID 移除机房 /api/cloudboot/v1/server-room/{id} +func RemoveServerRoomByID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi((chi.URLParam(r, "id"))) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + //删除前校验,存在子数据不允许删除 + msg := service.RemoveServerRoomValidte(log, repo, uint(id)) + if msg != "" { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(msg)) + return + } + + err = service.RemoveServerRoomByID(log, repo, uint(id)) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// GetServerRoomPage 查询机房分页列表 +func GetServerRoomPage(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.GetServerRoomPageReq + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + pg, err := service.GetServerRoomWithPage(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} + +// GetServerRoomByID 查询指定ID的机房信息详情 +func GetServerRoomByID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi((chi.URLParam(r, "id"))) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + sr, err := service.GetServerRoomByID(log, repo, uint(id)) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(sr)), + ) +} + +//UploadServerRoom 加载导入机房文件 +func UploadServerRoom(w http.ResponseWriter, r *http.Request) { + //预防乱码 + w.Header().Add("Content-type", "text/html; charset=utf-8") + + //解析并生成临时文件,为后续的工作做准备 + filename, err := upload.GenerateTempFile(r, "server-room") + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "result": filename, + })) + + return +} + +//ImportServerRoomPriview 导入机房文件预览 +func ImportServerRoomPriview(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData upload.ImportReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + result, err := service.ImportServerRoomPriview(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", result)) +} + +//ImportServerRoom 导入机房文件 +func ImportServerRoom(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var reqData upload.ImportReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + reqData.UserName = user.LoginName + + err := service.ImportServerRoom(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/server_usite.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/server_usite.go new file mode 100644 index 0000000000000000000000000000000000000000..9f2261acf0fa110ec6e0a8f83e9dc2a2f82ce030 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/server_usite.go @@ -0,0 +1,393 @@ +package route + +import ( + "errors" + "net/http" + "strconv" + + "github.com/go-chi/chi" + "github.com/voidint/binding" + + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" + "idcos.io/cloudboot/utils/upload" + "idcos.io/cloudboot/utils/user" +) + +// SaveServerUSite 保存(新增/修改)机位(U位) +func SaveServerUSite(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + loginUser, _ := middleware.LoginUserFromContext(r.Context()) + + var reqData service.SaveServerUSiteReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + reqData.LoginUser = loginUser + + if err := service.SaveServerUSite(log, repo, &reqData); err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": reqData.ID, + })) +} + +// UpdateServerUSite 保存(新增/修改)机位(U位) +func UpdateServerUSite(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + loginUser, _ := middleware.LoginUserFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + reqData := service.SaveServerUSiteReq{ + ID: uint(id), + LoginUser: loginUser, + } + + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if err := service.SaveServerUSite(log, repo, &reqData); err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": reqData.ID, + })) +} + +// GetServerUSitePage 查询机位(U位)分页列表 +func GetServerUSitePage(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + conf, _ := middleware.ConfigFromContext(r.Context()) + loginUser, _ := middleware.LoginUserFromContext(r.Context()) + + var reqData service.GetServerUSitePageReq + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + reqData.GetNameFromUAM = user.GetUserByLoginName(log, loginUser.Token, conf.UAM.RootEndpoint) + pg, err := service.GetServerUSitePage(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} + +// GetServerUSiteByID 查询指定ID的机位(U位)信息详情 +func GetServerUSiteByID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + uSite, err := service.GetServerUSiteByID(repo, uint(id)) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(uSite)), + ) +} + +// GetUsiteTree 查询U位目录树 +func GetUsiteTree(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + //conf, _ := middleware.ConfigFromContext(r.Context()) + //loginUser, _ := middleware.LoginUserFromContext(r.Context()) + + var reqData service.UsiteTreeReq + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + //reqData.GetNameFromUAM = user.GetUserByLoginName(log, loginUser.Token, conf.UAM.RootEndpoint) + tree, err := service.GetUsiteTree(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(tree)), + ) +} + +// BatchUpdateServerUSitesStatus 批量修改机位状态入参结构体 +func BatchUpdateServerUSitesStatus(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + loginUser, _ := middleware.LoginUserFromContext(r.Context()) + + var reqData service.UpdateServerUSiteStatusReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + reqData.LoginUser = loginUser + + affected, err := service.BatchUpdateServerUSitesStatus(repo, reqData.IDs, reqData.Status) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "affected": affected, + })) +} + +// BatchUpdateServerUSitesStatusByCond 根据其他定制性条件进行批量更新机位状态信息 +func BatchUpdateServerUSitesStatusByCond(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + loginUser, _ := middleware.LoginUserFromContext(r.Context()) + + var reqData service.UpdateServerUSiteStatusReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + reqData.LoginUser = loginUser + + affected, err := service.BatchUpdateServerUSitesStatusByCond(log, repo, reqData.USites, reqData.Status) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "affected": affected, + })) +} + +// DeleteServerUSitePort 删除机位端口号 +func DeleteServerUSitePort(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + affected, err := service.DeleteServerUSitePort(repo, uint(id)) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + if affected == 0 { + render.JSON(w, http.StatusNotFound, myhttp.ErrRespBody(errors.New("未查寻到有有效的记录信息").Error())) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": id, + })) +} + +// DeleteServerUSite 删除机位 +func DeleteServerUSite(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + affected, err := service.RemoveServerUSiteByID(repo, uint(id)) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + if affected == 0 { + render.JSON(w, http.StatusNotFound, myhttp.ErrRespBody(errors.New("未查寻到有有效的记录信息").Error())) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": id, + })) +} + +//UploadServerUSite 加载导入机位(U位)文件 +func UploadServerUSite(w http.ResponseWriter, r *http.Request) { + //预防乱码 + w.Header().Add("Content-type", "text/html; charset=utf-8") + + //解析并生成临时文件,为后续的工作做准备 + filename, err := upload.GenerateTempFile(r, "server-usite") + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "result": filename, + })) +} + +//UploadServerUSitePort 加载导入机位(U位)端口号文件 +func UploadServerUSitePort(w http.ResponseWriter, r *http.Request) { + //预防乱码 + w.Header().Add("Content-type", "text/html; charset=utf-8") + + //解析并生成临时文件,为后续的工作做准备 + filename, err := upload.GenerateTempFile(r, "server-usite-port") + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "result": filename, + })) +} + +//ImportServerUSitePriview 导入机架(柜)文件预览 +func ImportServerUSitePriview(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData upload.ImportReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + result, err := service.ImportServerUSitePreview(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", result)) +} + +//ImportServerUSitePortsPriview 导入机架(柜)文件预览 +func ImportServerUSitePortsPriview(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData upload.ImportReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + result, err := service.ImportServerUSitePortsPreview(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", result)) +} + +//ImportServerUSite 导入机架(柜)文件 +func ImportServerUSite(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var reqData upload.ImportReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + reqData.UserName = user.LoginName //user.Name + err := service.ImportServerUSite(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +//ImportServerUSitePort 导入机架(柜)文件 +func ImportServerUSitePort(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData upload.ImportReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + err := service.ImportServerUSitePort(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// GetPhysicalAreas 物理区域列表 +// @Discard +func GetPhysicalAreas(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.PhysicalAreaConnd + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + p, err := service.GetPhysicalAreas(log, repo, reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(p)), + ) +} + +// BatchUpdateServerUSitesRemark 批量更新机位备注信息 +func BatchUpdateServerUSitesRemark(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + + var reqData service.BatchUpdateServerUSitesRemarkReq + if err := myhttp.DecodeJSON(r, &reqData); err != nil { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + affected, err := service.BatchUpdateServerUSitesRemark(repo, reqData.IDs, reqData.Remark) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "affected": affected, + })) +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/store_room.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/store_room.go new file mode 100644 index 0000000000000000000000000000000000000000..ac7211194d6f9783d0c973f1d6946281c2867141 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/store_room.go @@ -0,0 +1,237 @@ +package route + +import ( + "net/http" + "strconv" + + "github.com/go-chi/chi" + "github.com/voidint/binding" + + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" + "idcos.io/cloudboot/utils/upload" +) + +// SaveStoreRoom 保存(新增/修改)库房 +func SaveStoreRoom(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var reqData service.SaveStoreRoomReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if user != nil { + reqData.LoginName = user.LoginName + } + + err := service.SaveStoreRoom(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": reqData.ID, + })) +} + +// RemoveStoreRoom 移除库房 +func RemoveStoreRoom(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + //删除前校验,存在子数据不允许删除 + msg := service.RemoveStoreRoomValidate(log, repo, uint(id)) + if msg != "" { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(msg)) + return + } + + err = service.RemoveStoreRoomByID(log, repo, uint(id)) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// GetStoreRooms 查询机房分页列表 +func GetStoreRooms(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.GetStoreRoomPageReq + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + pg, err := service.GetStoreRoomWithPage(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} + +// GetStoreRoom 查询指定ID的机房信息详情 +func GetStoreRoom(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + sr, err := service.GetStoreRoomByID(log, repo, uint(id)) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(sr)), + ) +} + +//UploadStoreRoom 加载导入网络区域文件 +func UploadStoreRoom(w http.ResponseWriter, r *http.Request) { + //预防乱码 + w.Header().Add("Content-type", "text/html; charset=utf-8") + + //解析并生成临时文件,为后续的工作做准备 + filename, err := upload.GenerateTempFile(r, "store_room") + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "result": filename, + })) + + return +} + +//ImportStoreRoomPriview 导入库房文件预览 +func ImportStoreRoomPriview(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData upload.ImportReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + result, err := service.ImportStoreRoomPriview(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", result)) +} + +//ImportStoreRoom 导入库房文件 +func ImportStoreRoom(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var reqData upload.ImportReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + reqData.UserName = user.LoginName + + err := service.ImportStoreRoom(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// 虚拟货架 +// SaveVirtualCabinet 保存(新增/修改)虚拟货架 +func SaveVirtualCabinet(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + var reqData service.SaveVirtualCabinetReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + if user != nil { + reqData.LoginName = user.LoginName + } + + err := service.SaveVirtualCabinet(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": reqData.ID, + })) +} + +// RemoveVirtualCabinet 移除库房 +func RemoveVirtualCabinet(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + //删除前校验,存在子数据不允许删除 + valid, err := service.RemoveVirtualCabinetValidate(log, repo, uint(id)) + if !valid { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + err = service.RemoveVirtualCabinetByID(log, repo, uint(id)) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// GetVirtualCabinets 查询机房分页列表 +func GetVirtualCabinets(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.GetVirtualCabinetPageReq + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + pg, err := service.GetVirtualCabinetWithPage(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/system_setting.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/system_setting.go new file mode 100644 index 0000000000000000000000000000000000000000..7ad922a991c1a4b5302e5ecfb9cd812275477d1b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/system_setting.go @@ -0,0 +1,24 @@ +package route + +import ( + "net/http" + + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// GetSystemLoginSetting 查询系统登录配置 +func GetSystemLoginSetting(w http.ResponseWriter, r *http.Request) { + conf, _ := middleware.ConfigFromContext(r.Context()) + + sett, err := service.GetSystemLoginSetting(conf) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(sett)), + ) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/system_template.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/system_template.go new file mode 100644 index 0000000000000000000000000000000000000000..76eda395736949dbd9040137dd6a9cc075c0e77c --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/system_template.go @@ -0,0 +1,182 @@ +package route + +import ( + "net/http" + "strconv" + "strings" + + "github.com/go-chi/chi" + "github.com/voidint/binding" + + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// GetSystemTemplateByID 查询指定ID的系统安装模板 +func GetSystemTemplateByID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + tpl, err := service.GetSystemTemplateByID(log, repo, uint(id)) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(tpl)), + ) +} + +// GetSystemTemplatePage 按条件查询系统安装模板分页列表 +func GetSystemTemplatePage(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.GetSystemTemplatePageReq + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + pg, err := service.GetSystemTemplatePage(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} + +// AddSystemTemplate 新增系统安装模板 +func AddSystemTemplate(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.SaveSystemTemplateReq + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + resp, err := service.SaveSystemTemplate(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": resp, + }), + ) +} + +// SaveSystemTemplate 新增系统模板 +func SaveSystemTemplate(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + var reqData service.SaveSystemTemplateReq + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + resp, err := service.SaveSystemTemplate(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": resp, + }), + ) +} + +// UpdateSystemTemplateByID 更新系统安装模板 +func UpdateSystemTemplateByID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + reqData := service.SaveSystemTemplateReq{ + ID: uint(id), + } + if binding.Bind(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + resp, err := service.SaveSystemTemplate(log, repo, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", map[string]interface{}{ + "id": resp, + }), + ) +} + +// RemoveSystemTemplateByID 删除系统安装模板 +func RemoveSystemTemplateByID(w http.ResponseWriter, r *http.Request) { + repo, _ := middleware.RepoFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + id, err := strconv.Atoi(chi.URLParam(r, "id")) + if err != nil { + log.Error(err) + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + + if err := service.RemoveSystemTemplate(log, repo, uint(id)); err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} + +// GetSystemTemplateBySN 根据SN查询系统安装模板 +func GetSystemTemplateBySN(w http.ResponseWriter, r *http.Request) { + log, _ := middleware.LoggerFromContext(r.Context()) + repo, _ := middleware.RepoFromContext(r.Context()) + + typ := strings.TrimSpace(r.FormValue("type")) + if typ == "" { + typ = "raw" + } + + tpl, err := service.GetSystemTemplateBySN(log, repo, chi.URLParam(r, "sn")) + if err != nil { + if typ == "raw" { + render.Text(w, http.StatusNotFound, []byte(http.StatusText(http.StatusNotFound))) + } else { + HandleErr(r.Context(), w, err) + } + return + } + + if typ == "raw" { + render.Text(w, http.StatusOK, []byte(tpl.Content)) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(tpl)), + ) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/user.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/user.go new file mode 100644 index 0000000000000000000000000000000000000000..8475fb0fa7d3c5ad57cbbe139415b6b818288598 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/route/user.go @@ -0,0 +1,63 @@ +package route + +import ( + "net/http" + + "github.com/voidint/binding" + + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/cloudbootserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// GetUserPage 按条件查询当前用户所在租户下的用户分页列表 +func GetUserPage(w http.ResponseWriter, r *http.Request) { + conf, _ := middleware.ConfigFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + reqData := service.GetUserPageReq{ + User: user, + } + if binding.Form(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + pg, err := service.GetUserPage(log, conf, &reqData) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(pg)), + ) +} + +// GetUserByToken 返回指定token的用户信息 +func GetUserByToken(w http.ResponseWriter, r *http.Request) { + user, _ := middleware.LoginUserFromContext(r.Context()) + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(user)), + ) +} + +// ChangeUserPassword 修改当前用户 +func ChangeUserPassword(w http.ResponseWriter, r *http.Request) { + conf, _ := middleware.ConfigFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + user, _ := middleware.LoginUserFromContext(r.Context()) + + reqData := service.ChangeUserPasswordReq{ + User: user, + } + if binding.Json(r, &reqData).CustomHandle(HandleValidateErrs, w) { + return + } + + if err := service.ChangeUserPassword(log, conf, &reqData); err != nil { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(err.Error())) + return + } + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/routes.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/routes.go new file mode 100644 index 0000000000000000000000000000000000000000..06faf5c77251128e7a537f48e9f1a5b8d0a5a19d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/routes.go @@ -0,0 +1,315 @@ +package cloudbootserver + +import ( + "github.com/go-chi/chi" + + "idcos.io/cloudboot/server/cloudbootserver/route" +) + +func registerRoutes(mux *chi.Mux) { + // 数据中心 + mux.Post("/api/cloudboot/v1/idcs", route.SaveIDC) + mux.Put("/api/cloudboot/v1/idcs/status", route.UpdateIDCStatus) + mux.Delete("/api/cloudboot/v1/idcs/{id}", route.RemoveIDCByID) + mux.Put("/api/cloudboot/v1/idcs/{id}", route.UpdateIDC) + mux.Get("/api/cloudboot/v1/idcs", route.GetIDCPage) + mux.Get("/api/cloudboot/v1/idcs/{id}", route.GetIDCByID) + + // 机房 + mux.Post("/api/cloudboot/v1/server-rooms", route.SaveServerRoom) + mux.Put("/api/cloudboot/v1/server-rooms/{id}", route.UpdateServerRoom) + mux.Put("/api/cloudboot/v1/server-rooms/status", route.UpdateServerRoomStatus) + mux.Delete("/api/cloudboot/v1/server-rooms/{id}", route.RemoveServerRoomByID) + mux.Get("/api/cloudboot/v1/server-rooms", route.GetServerRoomPage) + mux.Get("/api/cloudboot/v1/server-rooms/{id}", route.GetServerRoomByID) + mux.Post("/api/cloudboot/v1/server-rooms/upload", route.UploadServerRoom) + mux.Post("/api/cloudboot/v1/server-rooms/imports/previews", route.ImportServerRoomPriview) + mux.Post("/api/cloudboot/v1/server-rooms/imports", route.ImportServerRoom) + + // 库房 + mux.Post("/api/cloudboot/v1/store-room", route.SaveStoreRoom) + mux.Delete("/api/cloudboot/v1/store-room/{id}", route.RemoveStoreRoom) + mux.Put("/api/cloudboot/v1/store-room", route.SaveStoreRoom) + mux.Get("/api/cloudboot/v1/store-rooms", route.GetStoreRooms) + mux.Get("/api/cloudboot/v1/store-room/{id}", route.GetStoreRoom) + mux.Post("/api/cloudboot/v1/store-room/upload", route.UploadStoreRoom) + mux.Post("/api/cloudboot/v1/store-room/imports/previews", route.ImportStoreRoomPriview) + mux.Post("/api/cloudboot/v1/store-room/imports", route.ImportStoreRoom) + + //虚拟货架 + mux.Post("/api/cloudboot/v1/virtual-cabinet", route.SaveVirtualCabinet) + mux.Delete("/api/cloudboot/v1/virtual-cabinet/{id}", route.RemoveVirtualCabinet) + mux.Get("/api/cloudboot/v1/virtual-cabinets", route.GetVirtualCabinets) + + // 网络区域 + mux.Post("/api/cloudboot/v1/network-areas", route.SaveNetworkArea) + mux.Put("/api/cloudboot/v1/network-areas/{id}", route.UpdateNetworkArea) + mux.Put("/api/cloudboot/v1/network-areas/status", route.UpdateNetworkAreasStatus) + mux.Delete("/api/cloudboot/v1/network-areas/{id}", route.RemoveNetworkAreaByID) + mux.Get("/api/cloudboot/v1/network-areas", route.GetNetworkAreaPage) + mux.Get("/api/cloudboot/v1/network-areas/{id}", route.GetNetworkAreaByID) + mux.Post("/api/cloudboot/v1/network-areas/upload", route.UploadNetworkArea) + mux.Post("/api/cloudboot/v1/network-areas/imports/previews", route.ImportNetworkAreaPriview) + mux.Post("/api/cloudboot/v1/network-areas/imports", route.ImportNetworkArea) + + // 机架(柜) + mux.Post("/api/cloudboot/v1/server-cabinets", route.SaveServerCabinet) + mux.Put("/api/cloudboot/v1/server-cabinets/{id}", route.UpdateServerCabinet) + mux.Put("/api/cloudboot/v1/server-cabinets/type", route.BatchUpdateServerCabinetType) + mux.Put("/api/cloudboot/v1/server-cabinets/remark", route.BatchUpdateServerCabinetRemark) + mux.Delete("/api/cloudboot/v1/server-cabinets/{id}", route.RemoveServerCabinetByID) + mux.Get("/api/cloudboot/v1/server-cabinets", route.GetServerCabinetPage) + mux.Get("/api/cloudboot/v1/server-cabinets/{id}", route.GetServerCabinetByID) + mux.Post("/api/cloudboot/v1/server-cabinets/power", route.PowerOnServerCabinetByID) + mux.Delete("/api/cloudboot/v1/server-cabinets/{id}/power", route.PowerOffServerCabinetByID) + mux.Post("/api/cloudboot/v1/server-cabinets/upload", route.UploadServerCabinet) + mux.Post("/api/cloudboot/v1/server-cabinets/imports/previews", route.ImportServerCabinetPriview) + mux.Post("/api/cloudboot/v1/server-cabinets/imports", route.ImportServerCabinet) + mux.Put("/api/cloudboot/v1/server-cabinets/status", route.UpdateServerCabinetStatus) //将这个接口拆成多个独立的接口 + mux.Put("/api/cloudboot/v1/server-cabinets/status/accept", route.AcceptServerCabinet) + mux.Put("/api/cloudboot/v1/server-cabinets/status/enabled", route.EnableServerCabinet) + //mux.Put("/api/cloudboot/v1/server-cabinets/status/offline", route.OfflineServerCabinet) + mux.Put("/api/cloudboot/v1/server-cabinets/status/reconstruct", route.ReconstructServerCabinet) + + // 机位(U位) + mux.Post("/api/cloudboot/v1/server-usites", route.SaveServerUSite) + mux.Put("/api/cloudboot/v1/server-usites/{id}", route.UpdateServerUSite) + mux.Delete("/api/cloudboot/v1/server-usites/{id}", route.DeleteServerUSite) + mux.Get("/api/cloudboot/v1/server-usites", route.GetServerUSitePage) + mux.Get("/api/cloudboot/v1/server-usites/{id}", route.GetServerUSiteByID) + mux.Get("/api/cloudboot/v1/server-usites/tree", route.GetUsiteTree) + mux.Delete("/api/cloudboot/v1/server-usites/{id}/ports", route.DeleteServerUSitePort) + mux.Put("/api/cloudboot/v1/server-usites/status", route.BatchUpdateServerUSitesStatus) + mux.Put("/api/cloudboot/v1/server-usites/remark", route.BatchUpdateServerUSitesRemark) + mux.Put("/api/cloudboot/v1/server-usites/usitestatus", route.BatchUpdateServerUSitesStatusByCond) + mux.Post("/api/cloudboot/v1/server-usites/upload", route.UploadServerUSite) + mux.Post("/api/cloudboot/v1/server-usites/imports/previews", route.ImportServerUSitePriview) + mux.Post("/api/cloudboot/v1/server-usites/imports", route.ImportServerUSite) + mux.Post("/api/cloudboot/v1/server-usites/ports/upload", route.UploadServerUSitePort) + mux.Post("/api/cloudboot/v1/server-usites/ports/imports/previews", route.ImportServerUSitePortsPriview) + mux.Post("/api/cloudboot/v1/server-usites/ports/imports", route.ImportServerUSitePort) + mux.Get("/api/cloudboot/v1/physical-areas", route.GetPhysicalAreas) + // 物理机 + mux.Post("/api/cloudboot/v1/devices/collections", route.SaveCollectedDevice) + mux.Get("/api/cloudboot/v1/devices/{sn}/collections", route.GetDeviceBySN) + mux.Get("/api/cloudboot/v1/devices/{sn}/lifecycle", route.GetDeviceLifecycleBySN) + mux.Put("/api/cloudboot/v1/devices/{sn}/lifecycle", route.UpdateDeviceLifecycleBySN) + mux.Put("/api/cloudboot/v1/devices/lifecycles", route.BatchUpdateDeviceLifecycleBySN) + mux.Post("/api/cloudboot/v1/devices", route.SaveNewDevices) // API新增设备 + mux.Get("/api/cloudboot/v1/devices", route.GetDevicePage) + mux.Get("/api/cloudboot/v1/devices/tors", route.GetDevicePageByTor) + mux.Post("/api/cloudboot/v1/devices/upload", route.UploadDevices) //导入到机架 + mux.Post("/api/cloudboot/v1/devices/imports/previews", route.ImportDevicesPreview) + mux.Post("/api/cloudboot/v1/devices/imports", route.ImportDevices) + mux.Post("/api/cloudboot/v1/devices/store/upload", route.UploadDevices2Store) //导入到库房 + mux.Post("/api/cloudboot/v1/devices/store/imports/previews", route.ImportDevices2StorePreview) + mux.Post("/api/cloudboot/v1/devices/store/imports", route.ImportDevices2Store) + mux.Post("/api/cloudboot/v1/devices/stock/upload", route.UploadStockDevices) //存量设备导入 + mux.Post("/api/cloudboot/v1/devices/stock/imports/previews", route.ImportStockDevicesPreview) + mux.Post("/api/cloudboot/v1/devices/stock/imports", route.ImportStockDevices) + mux.Get("/api/cloudboot/v1/devices/{sn}/combined", route.GetCombinedDeviceBySN) + mux.Put("/api/cloudboot/v1/device", route.UpdateDevice) + mux.Put("/api/cloudboot/v1/device/operation/status", route.UpdateDeviceOperationStatus) + mux.Put("/api/cloudboot/v1/devices", route.UpdateDevices) //批量修改 + mux.Delete("/api/cloudboot/v1/devices", route.DeleteDevices) + mux.Get("/api/cloudboot/v1/devices/export", route.ExportCombinedDevices) + mux.Get("/api/cloudboot/v1/devices/query-params/{param_name}", route.GetDeviceQuerys) + mux.Post("/api/cloudboot/v1/devices/move", route.BatchMoveDevices) //设备搬迁 + mux.Post("/api/cloudboot/v1/devices/retire", route.BatchRetireDevices) //设备退役 + + + //特殊设备 + mux.Post("/api/cloudboot/v1/special-device", route.SaveSpecialDevice) + mux.Post("/api/cloudboot/v1/special-devices/upload", route.UploadSpecialDevices) + mux.Post("/api/cloudboot/v1/special-devices/imports/previews", route.ImportSpecialDevicesPreview) + mux.Post("/api/cloudboot/v1/special-devices/imports", route.ImportSpecialDevices) + + // 网段 + mux.Get("/api/cloudboot/v1/ip-networks", route.GetIPNetworkPage) + mux.Get("/api/cloudboot/v1/ip-networks/{id}", route.GetIPNetworkByID) + mux.Post("/api/cloudboot/v1/ip-networks", route.SaveIPNetwork) + mux.Put("/api/cloudboot/v1/ip-networks/{id}", route.UpdateIPNetwork) + mux.Delete("/api/cloudboot/v1/ip-networks/{id}", route.RemoveIPNetworkByID) + mux.Delete("/api/cloudboot/v1/ip-networks", route.RemoveIPNetworks) + mux.Get("/api/cloudboot/v1/ips", route.GetIPSPage) + mux.Get("/api/cloudboot/v1/ips/export", route.ExportIP) //导出IP信息 + mux.Put("/api/cloudboot/v1/ips/assigns", route.AssignIP) + mux.Put("/api/cloudboot/v1/ips/assignsv4", route.AssignIPv4) + mux.Put("/api/cloudboot/v1/ips/assignsv6", route.AssignIPv6) + mux.Put("/api/cloudboot/v1/ips/status/disable", route.DisableIP) + //mux.Put("/api/cloudboot/v1/ips/unassigns", route.UnassignIP) + mux.Post("/api/cloudboot/v1/ip-networks/upload", route.UploadIPNetworks) + mux.Post("/api/cloudboot/v1/ip-networks/imports/previews", route.ImportIPNetworksPreview) + mux.Post("/api/cloudboot/v1/ip-networks/imports", route.ImportIPNetworks) + + // 网络设备 + mux.Get("/api/cloudboot/v1/network/devices", route.GetNetworkDevicePage) + mux.Get("/api/cloudboot/v1/network/devices/{id}", route.GetNetworkDeviceByID) + mux.Delete("/api/cloudboot/v1/network/devices/{id}", route.DeleteNetworkDeviceByID) + mux.Delete("/api/cloudboot/v1/network/devices", route.RemoveNetworkDevices) + mux.Post("/api/cloudboot/v1/network/devices", route.SaveNetworkDevice) + mux.Post("/api/cloudboot/v1/network/devices/upload", route.UploadNetworkDevices) + mux.Post("/api/cloudboot/v1/network/devices/imports/previews", route.ImportNetworkDevicesPreview) + mux.Post("/api/cloudboot/v1/network/devices/imports", route.ImportNetworkDevices) + + // 设备装机过程/状态 + mux.Get("/api/cloudboot/v1/devices/{sn}/is-in-install-list", route.IsInInstallList) + mux.Post("/api/cloudboot/v1/devices/{sn}/installations/progress", route.ReportInstallProgress) + mux.Get("/api/cloudboot/v1/devices/{sn}/installations/status", route.GetInstallationStatus) + + // 装机参数 + mux.Post("/api/cloudboot/v1/devices/settings", route.SaveDeviceSettings) + mux.Put("/api/cloudboot/v1/devices/settings", route.UpdateDeviceSetting) + mux.Get("/api/cloudboot/v1/devices/settings", route.GetDeviceSettingPage) + mux.Get("/api/cloudboot/v1/devices/{sn}/settings", route.GetDeviceSettingBySN) + mux.Get("/api/cloudboot/v1/devices/{sn}/settings/networks", route.GetNetworkSettingBySN) + mux.Get("/api/cloudboot/v1/devices/{sn}/settings/os-users", route.GetOSUserSettingsBySN) + mux.Get("/api/cloudboot/v1/devices/{sn}/settings/hardwares", route.GetHardwareSettingBySN) + mux.Get("/api/cloudboot/v1/devices/{sn}/settings/hardwareinfo", route.GetHardwareInfoBySN) + mux.Get("/api/cloudboot/v1/devices/{sn}/settings/system-template", route.GetSystemTemplateBySN) + mux.Get("/api/cloudboot/v1/devices/{sn}/settings/image-template", route.GetImageTemplateBySN) + mux.Get("/api/cloudboot/v1/devices/{sn}/pxe", route.GetPXE) + mux.Post("/api/cloudboot/v1/devices/{sn}/pxe", route.GenPXE) + mux.Get("/api/cloudboot/v1/devices/installations/statistics", route.CountDeviceInstallStatic) + mux.Put("/api/cloudboot/v1/devices/installations/reinstalls", route.Reinstalls) + mux.Put("/api/cloudboot/v1/devices/installations/autoreinstalls", route.AutoReinstalls) // 调用规则引擎自动生成装机参数并发起部署 + mux.Put("/api/cloudboot/v1/devices/installations/cancels", route.CancelInstalls) + mux.Put("/api/cloudboot/v1/devices/installations/setinstallsok", route.SetInstallsOK) + mux.Delete("/api/cloudboot/v1/devices/settings", route.RemoveDeviceSettings) + mux.Post("/api/cloudboot/v1/devices/{sn}/centos6/uefi/pxe", route.GenPXE4CentOS6UEFI) + mux.Post("/api/cloudboot/v1/devices/installations/os-reinstallations", route.SaveDeviceSettingsAndReinstalls) // 保存装机参数并发起部署,完成后恢复运营状态 + mux.Post("/api/cloudboot/v1/devices/settings/save", route.SaveDeviceSettingsWithoutInstalls) + + // 硬件模板 + mux.Get("/api/cloudboot/v1/hardware-templates", route.GetHardwareTpls) + mux.Get("/api/cloudboot/v1/hardware-templates/{id}", route.GetHardwareTemplateByID) + mux.Delete("/api/cloudboot/v1/hardware-templates/{id}", route.RemoveHardTemplateByID) + mux.Put("/api/cloudboot/v1/hardware-templates/{id}", route.UpdateHardwareTemplate) + mux.Post("/api/cloudboot/v1/hardware-templates", route.SaveHardwareTemplate) + + // 操作系统安装模板 + mux.Get("/api/cloudboot/v1/os-templates", route.GetTemplatesByCond) + + // 镜像模板 + mux.Post("/api/cloudboot/v1/image-templates", route.SaveImageTemplate) + mux.Put("/api/cloudboot/v1/image-templates/{id}", route.UpdateImageTemplateByID) + mux.Get("/api/cloudboot/v1/image-templates/{id}", route.GetImageTemplateByID) + mux.Delete("/api/cloudboot/v1/image-templates/{id}", route.RemoveImageTemplateByID) + mux.Get("/api/cloudboot/v1/image-templates", route.GetImageTemplatePage) + + // 系统模板 + mux.Post("/api/cloudboot/v1/system-templates", route.SaveSystemTemplate) + mux.Put("/api/cloudboot/v1/system-templates/{id}", route.UpdateSystemTemplateByID) + mux.Get("/api/cloudboot/v1/system-templates/{id}", route.GetSystemTemplateByID) + mux.Delete("/api/cloudboot/v1/system-templates/{id}", route.RemoveSystemTemplateByID) + mux.Get("/api/cloudboot/v1/system-templates", route.GetSystemTemplatePage) + + // 操作系统安装日志 + mux.Get("/api/cloudboot/v1/devices/{device_setting_id}/installations/logs", route.GetDeviceLogByDeviceSettingID) + + // 带外管理 + mux.Get("/api/cloudboot/v1/devices/{sn}/oob-user", route.GetOOBUserBySN) + mux.Post("/api/cloudboot/v1/devices/power", route.OOBPowerOn) + mux.Put("/api/cloudboot/v1/devices/power/pxe/restart", route.OOBPowerPxeRestart) + mux.Put("/api/cloudboot/v1/devices/power/restart", route.OOBPowerRestart) + mux.Get("/api/cloudboot/v1/devices/{sn}/power/status", route.DevicePowerStatus) + mux.Delete("/api/cloudboot/v1/devices/power", route.OOBPowerOff) + mux.Put("/api/cloudboot/v1/devices/{sn}/oob/password", route.UpdateOOBPasswordBySN) + mux.Put("/api/cloudboot/v1/devices/oob/re-access", route.ReAccessOOB) //重新纳管带外 + mux.Get("/api/cloudboot/v1/devices/oob/export", route.ExportOOB) //导出带外信息 + mux.Get("/api/cloudboot/v1/devices/{sn}/oob/log", route.GetOOBlogBySN) + mux.Get("/api/cloudboot/v1/devices/oob/inspection", route.OOBInspectionOperate) + + // 任务 + mux.Post("/api/cloudboot/v1/jobs/inspections", route.AddInspectionJob) + mux.Get("/api/cloudboot/v1/jobs", route.GetJobPage) + mux.Get("/api/cloudboot/v1/jobs/{job_id}", route.GetJobByID) + mux.Delete("/api/cloudboot/v1/jobs/{job_id}", route.RemoveJob) + mux.Put("/api/cloudboot/v1/jobs/{job_id}/pausing", route.PauseJob) + mux.Put("/api/cloudboot/v1/jobs/{job_id}/unpausing", route.UnpauseJob) + // 数据字典 + mux.Get("/api/cloudboot/v1/dictionaries", route.GetDataDicts) + + // 硬件巡检 + mux.Get("/api/cloudboot/v1/devices/inspections/statistics", route.GetInspectionStatistics) + mux.Get("/api/cloudboot/v1/devices/inspections", route.GetInspectionPage) + mux.Get("/api/cloudboot/v1/devices/inspections/records", route.GetInspectionRecordsPage) + mux.Get("/api/cloudboot/v1/devices/{sn}/inspections", route.GetInspectionBySN) + mux.Get("/api/cloudboot/v1/devices/{sn}/inspections/start-times", route.GetInspectionStartTimesBySN) + + // 权限 + mux.Get("/api/cloudboot/v1/permissions/codes", route.PermissionCodeTree) + // 用户 + mux.Get("/api/cloudboot/v1/users", route.GetUserPage) + mux.Get("/api/cloudboot/v1/users/info", route.GetUserByToken) + + mux.Put("/api/cloudboot/v1/users/password", route.ChangeUserPassword) + + // 系统配置 + mux.Get("/api/cloudboot/v1/system/login/settings", route.GetSystemLoginSetting) + + // 操作记录 + mux.Get("/api/cloudboot/v1/operate/log", route.GetOperateLogPage) + mux.Get("/api/cloudboot/v1/api/log", route.GetAPILogPage) + + // 审批 + mux.Post("/api/cloudboot/v1/approvals/idc/abolish", route.SubmitIDCAbolishApproval) + mux.Post("/api/cloudboot/v1/approvals/server-room/abolish", route.SubmitServerRoomAbolishApproval) + mux.Post("/api/cloudboot/v1/approvals/network-area/offline", route.SubmitNetAreaOfflineApproval) + mux.Post("/api/cloudboot/v1/approvals/ip/unassign", route.SubmitIPUnassignApproval) //IP回收 + mux.Post("/api/cloudboot/v1/approvals/device/poweroff", route.SubmitDevicePowerOffApproval) + mux.Post("/api/cloudboot/v1/approvals/device/restart", route.SubmitDeviceRestartApproval) + mux.Post("/api/cloudboot/v1/approvals/server-cabinets/offlines", route.SubmitCabinetOfflineApproval) + mux.Post("/api/cloudboot/v1/approvals/server-cabinets/poweroffs", route.SubmitCabinetPowerOffApproval) + mux.Post("/api/cloudboot/v1/approvals/devices/migrations", route.SubmitDeviceMigrationApproval) + mux.Post("/api/cloudboot/v1/approvals/devices/migrations/upload", route.UploadMigrationApproval) + mux.Post("/api/cloudboot/v1/approvals/devices/migrations/imports/previews", route.ImportMigrationApprovalPriview) + mux.Post("/api/cloudboot/v1/approvals/devices/migrations/imports", route.ImportMigrationApproval) + mux.Post("/api/cloudboot/v1/approvals/devices/retirements", route.SubmitDeviceRetirementApproval) + mux.Post("/api/cloudboot/v1/approvals/devices/os-reinstallations", route.SubmitDeviceOSReInstallationApproval) + mux.Post("/api/cloudboot/v1/approvals/devices/recycle", route.SubmitDeviceRecycleApproval) + mux.Put("/api/cloudboot/v1/approvals/{approval_id}/step/{approval_step_id}", route.Approve) + mux.Get("/api/cloudboot/v1/users/initiated/approvals", route.GetMyApprovalPage) + mux.Get("/api/cloudboot/v1/users/pending/approvals", route.GetApproveByMePage) + mux.Get("/api/cloudboot/v1/users/approved/approvals", route.GetApprovedByMePage) + mux.Delete("/api/cloudboot/v1/approvals/{approval_id}", route.RevokeApproval) + mux.Get("/api/cloudboot/v1/approvals/{approval_id}", route.GetApprovalByID) + + // dhcp ip token + mux.Delete("/api/cloudboot/v1/devices/{sn}/limiters/tokens", route.ReturnLimiterTokenBySN) + mux.Delete("/api/cloudboot/v1/devices/limiters/tokens", route.ReturnLimiterTokens) //一键(批量)释放 + + // ServerConf + mux.Get("/api/cloudboot/v1/samba/settings", route.GetSambaConf) + // 组件日志 + // 组件 + mux.Post("/api/cloudboot/v1/devices/{sn}/components/hw-server/logs", route.SaveHWServerLog) + mux.Post("/api/cloudboot/v1/devices/{sn}/components/peconfig/logs", route.SavePEConfigLog) + mux.Post("/api/cloudboot/v1/devices/{sn}/components/cloudboot-agent/logs", route.SaveCloudbootAgentLog) + mux.Post("/api/cloudboot/v1/devices/{sn}/components/winconfig/logs", route.SaveWinConfigLog) + mux.Post("/api/cloudboot/v1/devices/{sn}/components/network-config/logs", route.SaveOSConfigLog) + mux.Post("/api/cloudboot/v1/devices/{sn}/components/image-clone/logs", route.SaveImageCloneLog) + + //订单 + mux.Post("/api/cloudboot/v1/order", route.SaveOrder) + mux.Delete("/api/cloudboot/v1/orders", route.RemoveOrders) + mux.Get("/api/cloudboot/v1/order/{id}", route.GetOrderByID) + mux.Put("/api/cloudboot/v1/order", route.SaveOrder) + mux.Put("/api/cloudboot/v1/order/status", route.UpdateOrderStatus) + mux.Get("/api/cloudboot/v1/orders", route.GetOrderPage) + mux.Get("/api/cloudboot/v1/orders/export", route.ExportOrders) + + //设备类型,用于维护设备类型和硬件配置的关系 + mux.Post("/api/cloudboot/v1/device-category", route.SaveDeviceCategory) + mux.Delete("/api/cloudboot/v1/device-categories", route.RemoveDeviceCategorys) + mux.Put("/api/cloudboot/v1/device-category", route.SaveDeviceCategory) + mux.Get("/api/cloudboot/v1/device-categories", route.GetDeviceCategoryPage) + mux.Get("/api/cloudboot/v1/device-category/{id}", route.GetDeviceCategoryByID) + mux.Get("/api/cloudboot/v1/device-categories/query-params/{param_name}", route.GetDeviceCategoryQuerys) + + // 规则表,规则引擎生成装机参数的规则记录 + mux.Get("/api/cloudboot/v1/device-setting-rules", route.GetDeviceSettingRulePage) + mux.Post("/api/cloudboot/v1/device-setting-rules", route.SaveDeviceSettingRule) + mux.Put("/api/cloudboot/v1/device-setting-rules", route.SaveDeviceSettingRule) + mux.Delete("/api/cloudboot/v1/device-setting-rules", route.RemoveDeviceSettingRules) +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/server.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/server.go new file mode 100644 index 0000000000000000000000000000000000000000..d3407902edfe827c6ce4109fcde6508c0e7005f5 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/server.go @@ -0,0 +1,81 @@ +package cloudbootserver + +import ( + "net/http" + "os" + + "idcos.io/cloudboot/limiter" + "idcos.io/cloudboot/limiter/webank" + + "github.com/go-chi/chi" + "idcos.io/cloudboot/config" + jmysql "idcos.io/cloudboot/job/mysql" + "idcos.io/cloudboot/logger" + mw "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/model/mysqlrepo" +) + +// Server API server +type Server struct { + Conf *config.Config + Log logger.Logger + Repo model.Repo + handler http.Handler +} + +// NewServer 实例化http服务 +func NewServer(log logger.Logger, conf *config.Config) (*Server, error) { + repo, err := mysqlrepo.NewRepo(conf, log) + if err != nil { + return nil, err + } + + mw.InitDistributeNode(conf, log, repo) + + jmgr := jmysql.NewJobManager(log, repo, conf) + if err = jmgr.Rebuild(); err != nil { + return nil, err + } + + panicFile, err := os.OpenFile(conf.Logger.PanicLogFile, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) + if err != nil { + return nil, err + } + + if err = mw.InitAuthorizationAPIs(repo); err != nil { + return nil, err + } + + r := chi.NewRouter() + r.Use(mw.InjectConfig(conf)) + r.Use(mw.InjectLogger(log)) + r.Use(mw.InjectRepo(repo)) + r.Use(mw.InjectFile(panicFile)) + r.Use(mw.InjectJobManager(jmgr)) + r.Use(mw.LogPanic) + r.Use(mw.Authenticator) //用户认证中间件 + r.Use(mw.Authorization) //API授权中间件 + r.Use(mw.OperateInterceptor) + + if conf.DHCPLimiter.Enable { + limiter.GlobalLimiter, err = webank.NewLimiter(log, repo, conf.DHCPLimiter.Limit) + if err != nil { + return nil, err + } + r.Use(mw.InjectDHCPLimiter(limiter.GlobalLimiter)) + } + + registerRoutes(r) + + return &Server{ + Conf: conf, + Log: log, + Repo: repo, + handler: r, + }, nil +} + +func (server *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { + server.handler.ServeHTTP(w, r) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/api_log.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/api_log.go new file mode 100644 index 0000000000000000000000000000000000000000..63ca67d9d52027e4f658f239d254054063e57883 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/api_log.go @@ -0,0 +1,96 @@ +package service + +import ( + "net/http" + "reflect" + "time" + + "github.com/voidint/binding" + "github.com/voidint/page" + + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" +) + +//GetAPILogPageReq 获取API记录分页请求参数 +type GetAPILogPageReq struct { + //操作时间起 + CreatedAtStart time.Time `json:"created_at_start"` + //操作时间止 + CreatedAtEnd time.Time `json:"created_at_end"` + //捷足先登人 + Operator string `json:"operator"` + //接口描述 + Description string `json:"description"` + //API信息 + API string `json:"api"` + //请求方法 + Method string `json:"method"` + //API状态 + Status string `json:"status"` + //耗时起 + Cost1 float64 `json:"cost1"` + //耗时止 + Cost2 float64 `json:"cost2"` + // 分页页号 + Page int64 `json:"page"` + // 分页大小。默认值:10。阈值: 100。 + PageSize int64 `json:"page_size"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *GetAPILogPageReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.CreatedAtStart: "created_at_start", + &reqData.CreatedAtEnd: "created_at_end", + &reqData.Operator: "operator", + &reqData.Description: "description", + &reqData.API: "api", + &reqData.Method: "method", + &reqData.Status: "status", + &reqData.Cost1: "cost1", + &reqData.Cost2: "cost2", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + } +} + +//GetAPILogWithPage 获取API记录分页 +func GetAPILogWithPage(log logger.Logger, repo model.Repo, reqData *GetAPILogPageReq) (*page.Page, error) { + if reqData.PageSize <= 0 || reqData.PageSize > 100 { + reqData.PageSize = 20 + } + if reqData.Page < 0 { + reqData.Page = 0 + } + + cond := model.APILogCond{ + CreatedAtStart: reqData.CreatedAtStart, + CreatedAtEnd: reqData.CreatedAtEnd, + Operator: reqData.Operator, + Description: reqData.Description, + API: reqData.API, + Method: reqData.Method, + Status: reqData.Status, + Cost1: reqData.Cost1, + Cost2: reqData.Cost2, + } + + totalRecords, err := repo.CountAPILog(&cond) + if err != nil { + return nil, err + } + + pager := page.NewPager(reflect.TypeOf(&model.APILog{}), reqData.Page, reqData.PageSize, totalRecords) + items, err := repo.GetAPILogByCond(&cond, model.OneOrderBy("id", model.DESC), pager.BuildLimiter()) + if err != nil { + return nil, err + } + + for _, item := range items { + pager.AddRecords(item) + } + + return pager.BuildPage(), nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/approval.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/approval.go new file mode 100644 index 0000000000000000000000000000000000000000..f60fafb3b43316796b71572d73b2121c72a99d86 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/approval.go @@ -0,0 +1,3752 @@ +package service + +import ( + "encoding/json" + "fmt" + "net/http" + "reflect" + "strings" + "time" + + "github.com/jinzhu/gorm" + "github.com/voidint/binding" + "github.com/voidint/page" + + "os" + + "idcos.io/cloudboot/config" + "idcos.io/cloudboot/limiter" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils" + "idcos.io/cloudboot/utils/times" + "idcos.io/cloudboot/utils/upload" + myuser "idcos.io/cloudboot/utils/user" +) + +// Approval 审批 +type Approval struct { + ID uint `json:"id"` // 审批单ID + Title string `json:"title"` // 审批单标题 + Type string `json:"type"` // 审批类型 + Metadata map[string]interface{} `json:"metadata"` // 审批单元数据 + Initiator string `json:"initiator"` // 审批发起人ID + Approvers []string `json:"approvers"` // 审批人ID构成的JSON数组字符串 + Cc []string `json:"cc"` // 抄送人ID构成的JSON数组字符串 + StartTime *time.Time `json:"start_time"` // 审批开始时间 + EndTime *time.Time `json:"end_time"` // 审批结束时间 + Status string `json:"status"` // 审批单状态 + Steps []*ApprovalStep `json:"steps"` // 审批步骤 +} + +// ApprovalStep 审批步骤 +type ApprovalStep struct { + ID uint `json:"id"` // 审批步骤ID + ApprovalID uint `json:"approval_id"` // 所属审批单ID + Approver string `json:"approver"` // 审批步骤审批人ID + Title string `json:"title"` // 审批步骤标题 + Action string `json:"action"` // 审批动作 + Remark string `json:"remark"` // 审批批注 + StartTime *time.Time `json:"start_time"` // 审批步骤开始时间 + EndTime *time.Time `json:"end_time"` // 审批步骤结束时间 + Hooks []*model.StepHook `json:"hooks"` // 当前审批步骤同意后执行的钩子对象数组字符串 +} + +// approvalLimit 审批提交数据的限制,暂定不能多于10个 +const approvalLimit = 10 +const approvalLimit50 = 50 +const defaultMailFrom = "wbk_wecloud@webank.com" + +// SubmitIDsApprovalReq 根据ID修改状态的请求体 +type SubmitIDsApprovalReq struct { + SubmitApprovalCommon + IDs []uint `json:"ids"` //ids +} + +// ToJSON 将请求结构体转换成JSON +func (reqData *SubmitIDsApprovalReq) ToJSON() []byte { + b, _ := json.Marshal(reqData.IDs) + return b +} + +// ApproversJSON 返回审批人ID构成的JSON数组字符串 +func (reqData *SubmitIDsApprovalReq) ApproversJSON() []byte { + b, _ := json.Marshal(reqData.Approvers) + return b +} + +// HooksJSON 返回审批步骤钩子构成的字符串 +func (reqData *SubmitIDsApprovalReq) HooksJSON(hook ...string) []byte { + hooks := []*model.StepHook{ + { + ID: hook[0], + Description: "", + ContinueOnError: true, + }, + } + b, _ := json.Marshal(hooks) + return b +} + +// FieldMap 字段映射 +func (reqData *SubmitIDsApprovalReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDs: "ids", + &reqData.Approvers: "approvers", + } +} + +// SubmitCabinetOfflineApprovalReq 提交机架下线审批请求参数结构体 +type SubmitCabinetOfflineApprovalReq struct { + SubmitApprovalCommon + CabinetIDs []uint `json:"ids"` // 机架ID列表 +} + +type SubmitApprovalCommon struct { + Approvers []string `json:"approvers"` // 审批人ID列表 + CurrentUser *model.CurrentUser `json:"-"` + FrontData string `json:"front_data"` //前端传入的元数据 + Remark string + // 从UAM上获取用户信息的钩子 + GetEmailFromUAM myuser.GetEmailFromUAM `json:"-"` +} + +// ToJSON 将请求结构体转换成JSON +func (reqData *SubmitCabinetOfflineApprovalReq) ToJSON() []byte { + b, _ := json.Marshal(reqData.CabinetIDs) + return b +} + +// ApproversJSON 返回审批人ID构成的JSON数组字符串 +func (reqData *SubmitCabinetOfflineApprovalReq) ApproversJSON() []byte { + b, _ := json.Marshal(reqData.Approvers) + return b +} + +// HooksJSON 返回审批步骤钩子构成的字符串 +func (reqData *SubmitCabinetOfflineApprovalReq) HooksJSON() []byte { + hooks := []*model.StepHook{ + { + ID: model.HookCabinetOffline, // 机架下线钩子 + Description: "", + ContinueOnError: true, + }, + } + b, _ := json.Marshal(hooks) + return b +} + +// FieldMap 字段映射 +func (reqData *SubmitCabinetOfflineApprovalReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.CabinetIDs: "ids", + &reqData.Approvers: "approvers", + } +} + +// Validate 结构体数据校验 +func (reqData *SubmitApprovalCommon) Validate(req *http.Request, errs binding.Errors) binding.Errors { + if len(reqData.Approvers) > 1 && reqData.Approvers[0] == reqData.Approvers[1] { + errs.Add([]string{"approvers"}, binding.BusinessError, "审批人和实施人不能相同") + return errs + } + if len(reqData.Approvers) > 0 && reqData.CurrentUser.ID == reqData.Approvers[0] { + errs.Add([]string{"approvers"}, binding.BusinessError, "审批人不能是当前登录用户") + return errs + } + return errs +} + +// SubmitIDCAbolishApprovalReq 提交数据中心裁撤请求体 +type SubmitIDCAbolishApprovalReq struct { + SubmitIDsApprovalReq +} + +// Validate 结构体数据校验 +func (reqData *SubmitIDCAbolishApprovalReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + if errsRet := reqData.SubmitApprovalCommon.Validate(req, errs); len(errsRet) != 0 { + return errsRet + } + repo, _ := middleware.RepoFromContext(req.Context()) + + if len(reqData.IDs) > approvalLimit { + errs.Add([]string{"ids"}, binding.BusinessError, + fmt.Sprintf("提交数据量(%d)须不大于(%d)条", len(reqData.IDs), approvalLimit)) + return errs + } + // 校验数据中心下的机房是否'已裁撤'状态 + for _, id := range reqData.IDs { + idc, err := repo.GetIDCByID(id) + if err != nil && !gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"ids"}, binding.SystemError, "系统内部发生错误") + return errs + } + if idc == nil { + errs.Add([]string{"ids"}, binding.BusinessError, fmt.Sprintf("数据中心(ID:%d)不存在", id)) + return errs + } + srvRooms, err := repo.GetServerRooms(&model.ServerRoomCond{IDCID: []uint{id}}, nil, nil) + if err != nil && !gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"ids"}, binding.SystemError, "系统内部发生错误") + return errs + } + for _, srvRoom := range srvRooms { + if srvRoom.Status != model.RoomStatAbolished { + errs.Add([]string{"ids"}, binding.SystemError, fmt.Sprintf("数据中心(%s)申请裁撤失败,其下有'未裁撤'机房(%s)", idc.Name, srvRoom.Name)) + return errs + } + } + } + // TODO 校验审批人是否存在 + return errs +} + +// SubmitIDCAbolishApproval 提交数据中心裁撤审批 +func SubmitIDCAbolishApproval(log logger.Logger, repo model.Repo, conf *config.Config, reqData *SubmitIDCAbolishApprovalReq) (approvalID uint, err error) { + now := time.Now() + + approval := model.Approval{ + Title: fmt.Sprintf("%s的数据中心裁撤审批", reqData.CurrentUser.Name), + Type: model.ApprovalTypeIDCAbolish, + Metadata: string(reqData.ToJSON()), + FrontData: reqData.FrontData, + Initiator: reqData.CurrentUser.ID, + Approvers: string(reqData.ApproversJSON()), + Remark: reqData.Remark, + StartTime: &now, + IsRejected: model.NO, + Status: model.ApprovalStatusApproval, + } + + steps := make([]*model.ApprovalStep, 0, len(reqData.Approvers)) + for i, uid := range reqData.Approvers { + step := &model.ApprovalStep{ + Approver: uid, + Title: approval.Title, + } + if i == 0 { + step.StartTime = &now // 为审批单的第一个步骤设置开始时间 + } + if i == len(reqData.Approvers)-1 { // 在审批最后一步添加钩子 + step.Hooks = string(reqData.HooksJSON(model.HookIDCAbolish)) + } + steps = append(steps, step) + } + + if err = repo.SubmitApproval(&approval, steps...); err != nil { + return 0, err + } + // 获取审批人Email并调用邮件发送api + var aprs []string + err = json.Unmarshal([]byte(approval.Approvers), &aprs) + if err != nil { + log.Debug(err) + } + for k, _ := range aprs { + loginID, _, email, _ := reqData.SubmitApprovalCommon.GetEmailFromUAM(aprs[k]) + if email != "" { + sendmailreq := middleware.SendMailReq { + From: defaultMailFrom, + To: email, + Title: approval.Title, + Content: approval.Title, + BodyFormat: "1", + Priority: "0", + } + go middleware.SendMail(log, repo, conf, &sendmailreq) + } else { + log.Errorf("数据中心裁撤审批邮件通知失败: 用户 %s 的 Email 为空", loginID) + } + } + // 邮件发送不影响审批单提交 + return approval.ID, nil +} + +// SubmitServerRoomAbolishApprovalReq 提交机房管理单元裁撤请求体 +type SubmitServerRoomAbolishApprovalReq struct { + SubmitIDsApprovalReq +} + +// Validate 结构体数据校验 +func (reqData *SubmitServerRoomAbolishApprovalReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + if errsRet := reqData.SubmitApprovalCommon.Validate(req, errs); len(errsRet) != 0 { + return errsRet + } + repo, _ := middleware.RepoFromContext(req.Context()) + + if len(reqData.IDs) > approvalLimit { + errs.Add([]string{"ids"}, binding.BusinessError, + fmt.Sprintf("提交数据量(%d)须不大于(%d)条", len(reqData.IDs), approvalLimit)) + return errs + } + // 校验机房下的机架是否'已下线'状态 + for _, id := range reqData.IDs { + cabinets, err := repo.GetServerCabinets(&model.ServerCabinetCond{ServerRoomID: []uint{id}}, nil, nil) + if err != nil && !gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"ids"}, binding.SystemError, "系统内部发生错误") + return errs + } + for _, c := range cabinets { + if c.Status != model.CabinetStatOffline { + errs.Add([]string{"ids"}, binding.SystemError, fmt.Sprintf("机房(ID:%d)有'未下线'机架(ID:%s)", id, c.Number)) + return errs + } + } + } + // TODO 校验审批人是否存在 + return errs +} + +// SubmitServerRoomAbolishApproval 提交机房管理单元裁撤审批 +func SubmitServerRoomAbolishApproval(log logger.Logger, repo model.Repo, conf *config.Config, reqData *SubmitServerRoomAbolishApprovalReq) (approvalID uint, err error) { + now := time.Now() + + approval := model.Approval{ + Title: fmt.Sprintf("%s的机房裁撤审批", reqData.CurrentUser.Name), + Type: model.ApprovalTypeServerRoomAbolish, + Metadata: string(reqData.ToJSON()), + FrontData: reqData.FrontData, + Initiator: reqData.CurrentUser.ID, + Approvers: string(reqData.ApproversJSON()), + Remark: reqData.Remark, + StartTime: &now, + IsRejected: model.NO, + Status: model.ApprovalStatusApproval, + } + + steps := make([]*model.ApprovalStep, 0, len(reqData.Approvers)) + for i, uid := range reqData.Approvers { + step := &model.ApprovalStep{ + Approver: uid, + Title: approval.Title, + } + if i == 0 { + step.StartTime = &now // 为审批单的第一个步骤设置开始时间 + } + if i == len(reqData.Approvers)-1 { // 在审批最后一步添加钩子 + step.Hooks = string(reqData.HooksJSON(model.HookServerRoomAbolish)) + } + steps = append(steps, step) + } + + if err = repo.SubmitApproval(&approval, steps...); err != nil { + return 0, err + } + // 获取审批人Email并调用邮件发送api + var aprs []string + err = json.Unmarshal([]byte(approval.Approvers), &aprs) + if err != nil { + log.Debug(err) + } + for k, _ := range aprs { + loginID, _, email, _ := reqData.SubmitApprovalCommon.GetEmailFromUAM(aprs[k]) + if email != "" { + sendmailreq := middleware.SendMailReq { + From: defaultMailFrom, + To: email, + Title: approval.Title, + Content: approval.Title, + BodyFormat: "1", + Priority: "0", + } + go middleware.SendMail(log, repo, conf, &sendmailreq) + } else { + log.Errorf("审批:%s 邮件通知失败: 用户 %s 的 Email 为空", approval.Title, loginID) + } + } + // 邮件发送不影响审批单提交 + return approval.ID, nil +} + +// SubmitNetAreaOfflineApprovalReq 提交网络区域下线请求体 +type SubmitNetAreaOfflineApprovalReq struct { + SubmitIDsApprovalReq +} + +// Validate 结构体数据校验 +func (reqData *SubmitNetAreaOfflineApprovalReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + if errsRet := reqData.SubmitApprovalCommon.Validate(req, errs); len(errsRet) != 0 { + return errsRet + } + //repo, _ := middleware.RepoFromContext(req.Context()) + + if len(reqData.IDs) > approvalLimit { + errs.Add([]string{"ids"}, binding.BusinessError, + fmt.Sprintf("提交数据量(%d)须不大于(%d)条", len(reqData.IDs), approvalLimit)) + return errs + } + // 校验 + // TODO 待完善 + // TODO 校验审批人是否存在 + return errs +} + +// SubmitNetAreaOfflineApproval 提交网络区域下线审批 +func SubmitNetAreaOfflineApproval(log logger.Logger, repo model.Repo, conf *config.Config, reqData *SubmitNetAreaOfflineApprovalReq) (approvalID uint, err error) { + now := time.Now() + + approval := model.Approval{ + Title: fmt.Sprintf("%s的网络区域下线审批", reqData.CurrentUser.Name), + Type: model.ApprovalTypeNetAreaOffline, + Metadata: string(reqData.ToJSON()), + FrontData: reqData.FrontData, + Initiator: reqData.CurrentUser.ID, + Approvers: string(reqData.ApproversJSON()), + Remark: reqData.Remark, + StartTime: &now, + IsRejected: model.NO, + Status: model.ApprovalStatusApproval, + } + + steps := make([]*model.ApprovalStep, 0, len(reqData.Approvers)) + for i, uid := range reqData.Approvers { + step := &model.ApprovalStep{ + Approver: uid, + Title: approval.Title, + } + if i == 0 { + step.StartTime = &now // 为审批单的第一个步骤设置开始时间 + } + if i == len(reqData.Approvers)-1 { // 在审批最后一步添加钩子 + step.Hooks = string(reqData.HooksJSON(model.HookNetAreaOffline)) + } + steps = append(steps, step) + } + + if err = repo.SubmitApproval(&approval, steps...); err != nil { + return 0, err + } + // 获取审批人Email并调用邮件发送api + var aprs []string + err = json.Unmarshal([]byte(approval.Approvers), &aprs) + if err != nil { + log.Debug(err) + } + for k, _ := range aprs { + loginID, _, email, _ := reqData.SubmitApprovalCommon.GetEmailFromUAM(aprs[k]) + if email != "" { + sendmailreq := middleware.SendMailReq { + From: defaultMailFrom, + To: email, + Title: approval.Title, + Content: approval.Title, + BodyFormat: "1", + Priority: "0", + } + go middleware.SendMail(log, repo, conf, &sendmailreq) + } else { + log.Errorf("审批:%s 邮件通知失败: 用户 %s 的 Email 为空", approval.Title, loginID) + } + } + // 邮件发送不影响审批单提交 + return approval.ID, nil +} + +// SubmitIPUnassignApprovalReq 提交IP回收请求体 +type SubmitIPUnassignApprovalReq struct { + SubmitIDsApprovalReq +} + +// Validate 结构体数据校验 +func (reqData *SubmitIPUnassignApprovalReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + if errsRet := reqData.SubmitApprovalCommon.Validate(req, errs); len(errsRet) != 0 { + return errsRet + } + repo, _ := middleware.RepoFromContext(req.Context()) + + if len(reqData.IDs) > approvalLimit { + errs.Add([]string{"ids"}, binding.BusinessError, + fmt.Sprintf("提交数据量(%d)须不大于(%d)条", len(reqData.IDs), approvalLimit)) + return errs + } + // 校验 + for _, id := range reqData.IDs { + ip, _ := repo.GetIPByID(id) + if ip.IsUsed == model.IPNotUsed { + errs.Add([]string{"ids"}, binding.BusinessError, + fmt.Sprintf("IP(%s)未分配,无需释放", ip.IP)) + return errs + } + } + // TODO 校验审批人是否存在 + return errs +} + +// SubmitIPUnassignApproval 提交IP回收审批 +func SubmitIPUnassignApproval(log logger.Logger, repo model.Repo, conf *config.Config, reqData *SubmitIPUnassignApprovalReq) (approvalID uint, err error) { + now := time.Now() + + approval := model.Approval{ + Title: fmt.Sprintf("%s的IP回收审批", reqData.CurrentUser.Name), + Type: model.ApprovalTypeIPUnassign, + Metadata: string(reqData.ToJSON()), + FrontData: reqData.FrontData, + Initiator: reqData.CurrentUser.ID, + Approvers: string(reqData.ApproversJSON()), + Remark: reqData.Remark, + StartTime: &now, + IsRejected: model.NO, + Status: model.ApprovalStatusApproval, + } + + steps := make([]*model.ApprovalStep, 0, len(reqData.Approvers)) + for i, uid := range reqData.Approvers { + step := &model.ApprovalStep{ + Approver: uid, + Title: approval.Title, + } + if i == 0 { + step.StartTime = &now // 为审批单的第一个步骤设置开始时间 + } + if i == len(reqData.Approvers)-1 { // 在审批最后一步添加钩子 + step.Hooks = string(reqData.HooksJSON(model.HookIPUnassign)) + } + steps = append(steps, step) + } + + if err = repo.SubmitApproval(&approval, steps...); err != nil { + return 0, err + } + // 获取审批人Email并调用邮件发送api + var aprs []string + err = json.Unmarshal([]byte(approval.Approvers), &aprs) + if err != nil { + log.Debug(err) + } + for k, _ := range aprs { + loginID, _, email, _ := reqData.SubmitApprovalCommon.GetEmailFromUAM(aprs[k]) + if email != "" { + sendmailreq := middleware.SendMailReq { + From: defaultMailFrom, + To: email, + Title: approval.Title, + Content: approval.Title, + BodyFormat: "1", + Priority: "0", + } + go middleware.SendMail(log, repo, conf, &sendmailreq) + } else { + log.Errorf("审批:%s 邮件通知失败: 用户 %s 的 Email 为空", approval.Title, loginID) + } + } + // 邮件发送不影响审批单提交 + return approval.ID, nil +} + +// SubmitDevicePowerOffApprovalReq 提交物理机关机请求体 +type SubmitDevicePowerOffApprovalReq struct { + SubmitDeviceRetirementApprovalReq +} + +// Validate 结构体数据校验 +func (reqData *SubmitDevicePowerOffApprovalReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + if errsRet := reqData.SubmitApprovalCommon.Validate(req, errs); len(errsRet) != 0 { + return errsRet + } + //repo, _ := middleware.RepoFromContext(req.Context()) + + if len(reqData.SNs) > approvalLimit { + errs.Add([]string{"ids"}, binding.BusinessError, + fmt.Sprintf("提交数据量(%d)须不大于(%d)条", len(reqData.SNs), approvalLimit)) + return errs + } + // 校验 + //for _, id := range reqData.IDs { + // ip, _ := repo.GetIPByID(id) + // if ip.SN == "" { + // errs.Add([]string{"ids"}, binding.BusinessError, + // fmt.Sprintf("IP(%s)未分配,无需释放", ip.IP)) + // return errs + // } + //} + // TODO 校验审批人是否存在 + return errs +} + +// SubmitDevicePowerOffApproval 提交物理机关机审批 +func SubmitDevicePowerOffApproval(log logger.Logger, repo model.Repo, conf *config.Config, reqData *SubmitDevicePowerOffApprovalReq) (approvalID uint, err error) { + now := time.Now() + + approval := model.Approval{ + Title: fmt.Sprintf("%s的物理机关机审批", reqData.CurrentUser.Name), + Type: model.ApprovalTypeDevPowerOff, + Metadata: string(reqData.ToJSON()), + FrontData: reqData.FrontData, + Initiator: reqData.CurrentUser.ID, + Approvers: string(reqData.ApproversJSON()), + Remark: reqData.Remark, + StartTime: &now, + IsRejected: model.NO, + Status: model.ApprovalStatusApproval, + } + + steps := make([]*model.ApprovalStep, 0, len(reqData.Approvers)) + for i, uid := range reqData.Approvers { + step := &model.ApprovalStep{ + Approver: uid, + Title: approval.Title, + } + if i == 0 { + step.StartTime = &now // 为审批单的第一个步骤设置开始时间 + } + if i == len(reqData.Approvers)-1 { // 在审批最后一步添加钩子 + step.Hooks = string(reqData.HooksJSON(model.HookDevPowerOff)) + } + steps = append(steps, step) + } + + if err = repo.SubmitApproval(&approval, steps...); err != nil { + return 0, err + } + // 获取审批人Email并调用邮件发送api + var aprs []string + err = json.Unmarshal([]byte(approval.Approvers), &aprs) + if err != nil { + log.Debug(err) + } + for k, _ := range aprs { + loginID, _, email, _ := reqData.SubmitApprovalCommon.GetEmailFromUAM(aprs[k]) + if email != "" { + sendmailreq := middleware.SendMailReq { + From: defaultMailFrom, + To: email, + Title: approval.Title, + Content: approval.Title, + BodyFormat: "1", + Priority: "0", + } + go middleware.SendMail(log, repo, conf, &sendmailreq) + } else { + log.Errorf("审批:%s 邮件通知失败: 用户 %s 的 Email 为空", approval.Title, loginID) + } + } + // 邮件发送不影响审批单提交 + return approval.ID, nil +} + +// SubmitDeviceRestartApproval 提交物理机关机审批 +func SubmitDeviceRestartApproval(log logger.Logger, repo model.Repo, conf *config.Config, reqData *SubmitDevicePowerOffApprovalReq) (approvalID uint, err error) { + now := time.Now() + + approval := model.Approval{ + Title: fmt.Sprintf("%s的物理机重启审批", reqData.CurrentUser.Name), + Type: model.ApprovalTypeDevRestart, + Metadata: string(reqData.ToJSON()), + FrontData: reqData.FrontData, + Initiator: reqData.CurrentUser.ID, + Approvers: string(reqData.ApproversJSON()), + Remark: reqData.Remark, + StartTime: &now, + IsRejected: model.NO, + Status: model.ApprovalStatusApproval, + } + + steps := make([]*model.ApprovalStep, 0, len(reqData.Approvers)) + for i, uid := range reqData.Approvers { + step := &model.ApprovalStep{ + Approver: uid, + Title: approval.Title, + } + if i == 0 { + step.StartTime = &now // 为审批单的第一个步骤设置开始时间 + } + if i == len(reqData.Approvers)-1 { // 在审批最后一步添加钩子 + step.Hooks = string(reqData.HooksJSON(model.HookDevRestart)) + } + steps = append(steps, step) + } + + if err = repo.SubmitApproval(&approval, steps...); err != nil { + return 0, err + } + return approval.ID, nil +} + +// Validate 结构体数据校验 +func (reqData *SubmitCabinetOfflineApprovalReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + if errsRet := reqData.SubmitApprovalCommon.Validate(req, errs); len(errsRet) != 0 { + return errsRet + } + repo, _ := middleware.RepoFromContext(req.Context()) + + if len(reqData.CabinetIDs) > approvalLimit { + errs.Add([]string{"ids"}, binding.BusinessError, + fmt.Sprintf("提交数据量(%d)须不大于(%d)条", len(reqData.CabinetIDs), approvalLimit)) + return errs + } + // 校验机架是否存在且是否处于'关电'状态 + for _, id := range reqData.CabinetIDs { + cabinet, err := repo.GetServerCabinetByID(id) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"ids"}, binding.BusinessError, fmt.Sprintf("机架(id=%d)不存在", id)) + return errs + } + if err != nil { + errs.Add([]string{"ids"}, binding.SystemError, "系统内部发生错误") + return errs + } + if cabinet.Status != model.CabinetStatEnabled { + errs.Add([]string{"ids"}, binding.BusinessError, fmt.Sprintf("机架(%s)未启用", cabinet.Number)) + return errs + } + if cabinet.IsPowered == model.YES { + errs.Add([]string{"ids"}, binding.BusinessError, fmt.Sprintf("请先对机架(%s)进行关电", cabinet.Number)) + return errs + } + } + // TODO 校验审批人是否存在 + return errs +} + +// SubmitCabinetOfflineApproval 提交机架下线审批 +func SubmitCabinetOfflineApproval(log logger.Logger, repo model.Repo, conf *config.Config, reqData *SubmitCabinetOfflineApprovalReq) (approvalID uint, err error) { + now := time.Now() + + approval := model.Approval{ + Title: fmt.Sprintf("%s的机架下线审批", reqData.CurrentUser.Name), + Type: model.ApprovalTypeCabinetOffline, + Metadata: string(reqData.ToJSON()), + FrontData: reqData.FrontData, + Initiator: reqData.CurrentUser.ID, + Approvers: string(reqData.ApproversJSON()), + Remark: reqData.Remark, + StartTime: &now, + IsRejected: model.NO, + Status: model.ApprovalStatusApproval, + } + + steps := make([]*model.ApprovalStep, 0, len(reqData.Approvers)) + for i, uid := range reqData.Approvers { + step := &model.ApprovalStep{ + Approver: uid, + Title: approval.Title, + } + if i == 0 { + step.StartTime = &now // 为审批单的第一个步骤设置开始时间 + } + if i == len(reqData.Approvers)-1 { // 在审批最后一步添加钩子 + step.Hooks = string(reqData.HooksJSON()) + } + steps = append(steps, step) + } + + if err = repo.SubmitApproval(&approval, steps...); err != nil { + return 0, err + } + // 获取审批人Email并调用邮件发送api + var aprs []string + err = json.Unmarshal([]byte(approval.Approvers), &aprs) + if err != nil { + log.Debug(err) + } + for k, _ := range aprs { + loginID, _, email, _ := reqData.SubmitApprovalCommon.GetEmailFromUAM(aprs[k]) + if email != "" { + sendmailreq := middleware.SendMailReq { + From: defaultMailFrom, + To: email, + Title: approval.Title, + Content: approval.Title, + BodyFormat: "1", + Priority: "0", + } + go middleware.SendMail(log, repo, conf, &sendmailreq) + } else { + log.Errorf("审批:%s 邮件通知失败: 用户 %s 的 Email 为空", approval.Title, loginID) + } + } + // 邮件发送不影响审批单提交 + return approval.ID, nil +} + +// SubmitCabinetPowerOffApprovalReq 提交机架关电审批请求参数结构体 +type SubmitCabinetPowerOffApprovalReq struct { + SubmitApprovalCommon + CabinetIDs []uint `json:"ids"` // 机架ID列表 + //Approvers []string `json:"approvers"` // 审批人ID列表 + //CurrentUser *model.CurrentUser `json:"-"` + //FrontData string `json:"front_data"` //前端传入的元数据 + //Remark string +} + +// ToJSON 将请求结构体转换成JSON +func (reqData *SubmitCabinetPowerOffApprovalReq) ToJSON() []byte { + b, _ := json.Marshal(reqData.CabinetIDs) + return b +} + +// ApproversJSON 返回审批人ID构成的JSON数组字符串 +func (reqData *SubmitCabinetPowerOffApprovalReq) ApproversJSON() []byte { + b, _ := json.Marshal(reqData.Approvers) + return b +} + +// HooksJSON 返回审批步骤钩子构成的字符串 +func (reqData *SubmitCabinetPowerOffApprovalReq) HooksJSON() []byte { + hooks := []*model.StepHook{ + { + ID: model.HookCabinetPowerOff, // 机架关电钩子 + Description: "", + ContinueOnError: true, + }, + } + b, _ := json.Marshal(hooks) + return b +} + +// FieldMap 字段映射 +func (reqData *SubmitCabinetPowerOffApprovalReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.CabinetIDs: "ids", + &reqData.Approvers: "approvers", + } +} + +// Validate 结构体数据校验 +func (reqData *SubmitCabinetPowerOffApprovalReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + if errsRet := reqData.SubmitApprovalCommon.Validate(req, errs); len(errsRet) != 0 { + return errsRet + } + repo, _ := middleware.RepoFromContext(req.Context()) + if len(reqData.CabinetIDs) > approvalLimit { + errs.Add([]string{"ids"}, binding.BusinessError, + fmt.Sprintf("提交数据量(%d)须不大于(%d)条", len(reqData.CabinetIDs), approvalLimit)) + return errs + } + // 校验机架是否存在且是否处于'开电'状态 + for _, id := range reqData.CabinetIDs { + cabinet, err := repo.GetServerCabinetByID(id) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"ids"}, binding.BusinessError, fmt.Sprintf("机架(id=%d)不存在", id)) + return errs + } + if err != nil { + errs.Add([]string{"ids"}, binding.SystemError, "系统内部发生错误") + return errs + } + if cabinet.IsPowered != model.YES { + errs.Add([]string{"ids"}, binding.BusinessError, fmt.Sprintf("机架(%s)未开电", cabinet.Number)) + return errs + } + //检查同组tor下的2个机架是否关联有物理机设备,如果有则不允许关电 + // 检查自己的所有机位是否空闲 + selfUs, err := repo.GetServerUSiteByCond(&model.CombinedServerUSite{ServerCabinetID: []uint{id}}, nil, nil) + if err != nil { + errs.Add([]string{"ids"}, binding.BusinessError, fmt.Sprintf("检查机架(%s)所有机位占用情况失败", cabinet.Number)) + return errs + } + for _, u := range selfUs { + if u.Status != model.USiteStatFree && u.Status != model.USiteStatDisabled { + errs.Add([]string{"ids"}, binding.BusinessError, fmt.Sprintf("机架(%s)机位(%s)被占用", cabinet.Number, u.Number)) + return errs + } + } + //检查同TOR下的另一个机架的所有机位是否空闲 + peerNetworkDevice, err := repo.GetPeerNetworkDeviceByCabinetID(id) + if err != nil { + //return ? + } else if peerNetworkDevice != nil { + peerUs, err := repo.GetServerUSiteByCond(&model.CombinedServerUSite{ServerCabinetID: []uint{peerNetworkDevice.ServerCabinetID}}, nil, nil) + if err != nil { + errs.Add([]string{"ids"}, binding.BusinessError, fmt.Sprintf("检查同组TOR的对端机架(%d)所有机位占用情况失败", peerNetworkDevice.ServerCabinetID)) + return errs + } + for _, u := range peerUs { + if u.Status != model.USiteStatFree && u.Status != model.USiteStatDisabled { + cabinet, _ := repo.GetServerCabinetByID(peerNetworkDevice.ServerCabinetID) + if cabinet != nil { + errs.Add([]string{"ids"}, binding.BusinessError, fmt.Sprintf("同组TOR的对端机架(%s)机位(%s)被占用", cabinet.Number, u.Number)) + } else { + errs.Add([]string{"ids"}, binding.BusinessError, fmt.Sprintf("同组TOR的对端机架(ID:%d)机位(%s)被占用", peerNetworkDevice.ServerCabinetID, u.Number)) + } + return errs + } + } + } + } + // TODO 校验审批人是否存在 + return errs +} + +// SubmitCabinetPowerOffApproval 提交机架关电审批 +func SubmitCabinetPowerOffApproval(log logger.Logger, repo model.Repo, conf *config.Config, reqData *SubmitCabinetPowerOffApprovalReq) (approvalID uint, err error) { + now := time.Now() + + approval := model.Approval{ + Title: fmt.Sprintf("%s的机架关电审批", reqData.CurrentUser.Name), + Type: model.ApprovalTypeCabinetPowerOff, + Metadata: string(reqData.ToJSON()), + FrontData: reqData.FrontData, + Initiator: reqData.CurrentUser.ID, + Approvers: string(reqData.ApproversJSON()), + Remark: reqData.Remark, + StartTime: &now, + IsRejected: model.NO, + Status: model.ApprovalStatusApproval, + } + + steps := make([]*model.ApprovalStep, 0, len(reqData.Approvers)) + for i, uid := range reqData.Approvers { + step := &model.ApprovalStep{ + Approver: uid, + Title: approval.Title, //"审批", + } + if i == 0 { + step.StartTime = &now // 为审批单的第一个步骤设置开始时间 + } + if i == len(reqData.Approvers)-1 { // 在审批最后一步添加钩子 + step.Hooks = string(reqData.HooksJSON()) + } + steps = append(steps, step) + } + + if err = repo.SubmitApproval(&approval, steps...); err != nil { + return 0, err + } + // 获取审批人Email并调用邮件发送api + var aprs []string + err = json.Unmarshal([]byte(approval.Approvers), &aprs) + if err != nil { + log.Debug(err) + } + for k, _ := range aprs { + loginID, _, email, _ := reqData.SubmitApprovalCommon.GetEmailFromUAM(aprs[k]) + if email != "" { + sendmailreq := middleware.SendMailReq { + From: defaultMailFrom, + To: email, + Title: approval.Title, + Content: approval.Title, + BodyFormat: "1", + Priority: "0", + } + go middleware.SendMail(log, repo, conf, &sendmailreq) + } else { + log.Errorf("审批:%s 邮件通知失败: 用户 %s 的 Email 为空", approval.Title, loginID) + } + } + // 邮件发送不影响审批单提交 + return approval.ID, nil +} + +// SubmitDeviceMigrationApprovalReq 提物理机搬迁审批请求参数结构体 +type SubmitDeviceMigrationApprovalReq struct { + SubmitApprovalCommon + Data []*SubmitDeviceMigrationApprovalReqData `json:"data"` //搬迁的参数 + //Approvers []string `json:"approvers"` // 审批人ID列表 + //CurrentUser *model.CurrentUser `json:"-"` + //FrontData string `json:"front_data"` //前端传入的元数据 + //Remark string +} + +// SubmitDeviceMigrationApprovalReqData //搬迁的参数 +type SubmitDeviceMigrationApprovalReqData struct { + SN string `json:"sn"` + DstIDCID uint `json:"dst_idc_id"` //目的数据中心 + + //搬迁到机架,上架 + DstServerRoomID uint `json:"dst_server_room_id"` //目的机房 + DstCabinetID uint `json:"dst_cabinet_id"` //目的机架 + DstUSiteID uint `json:"dst_usite_id"` //目的机位 + + //搬迁到货架,入库 + DstStoreRoomID uint `json:"dst_store_room_id"` //目的库房 + DstVCabinetID uint `json:"dst_virtual_cabinet_id"` //目的货架 + + //搬迁的类型 + MigType string `json:"mig_type"` //库房->机架,机架->机架,机架->库房 +} + +// ToJSON 将请求结构体转换成JSON +func (reqData *SubmitDeviceMigrationApprovalReq) ToJSON() []byte { + b, _ := json.Marshal(reqData.Data) + return b +} + +// ApproversJSON 返回审批人ID构成的JSON数组字符串 +func (reqData *SubmitDeviceMigrationApprovalReq) ApproversJSON() []byte { + b, _ := json.Marshal(reqData.Approvers) + return b +} + +// Step1HooksJSON 返回审批步骤钩子构成的字符串 +func (reqData *SubmitDeviceMigrationApprovalReq) Step1HooksJSON() []byte { + hooks := []*model.StepHook{ + { + ID: model.HookDeviceMigrationPowerOff, // 物理机搬迁关电钩子 + Description: "", + ContinueOnError: true, + }, + { + ID: model.HookDeviceMigrationReserveIP, // 物理机搬迁保留IP钩子 + Description: "", + ContinueOnError: true, + }, + } + b, _ := json.Marshal(hooks) + return b +} + +// Step2HooksJSON 返回审批步骤钩子构成的字符串 +func (reqData *SubmitDeviceMigrationApprovalReq) Step2HooksJSON() []byte { + hooks := []*model.StepHook{ + { + ID: model.HookDeviceMigration, // 物理机搬迁钩子 + Description: "", + ContinueOnError: true, + }, + } + b, _ := json.Marshal(hooks) + return b +} + +// FieldMap 字段映射 +func (reqData *SubmitDeviceMigrationApprovalReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.Data: "data", + &reqData.Approvers: "approvers", + } +} + +// Validate 结构体数据校验 +func (reqData *SubmitDeviceMigrationApprovalReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + if errsRet := reqData.SubmitApprovalCommon.Validate(req, errs); len(errsRet) != 0 { + return errsRet + } + repo, _ := middleware.RepoFromContext(req.Context()) + if len(reqData.Data) > approvalLimit50 { + errs.Add([]string{"data"}, binding.BusinessError, + fmt.Sprintf("提交数据量(%d)须不大于(%d)条", len(reqData.Data), approvalLimit50)) + return errs + } + // 目标机位唯一性校验 + var dstUsiteIDsForCheck []uint + for _, data := range reqData.Data { + dstUsiteIDsForCheck = append(dstUsiteIDsForCheck, data.DstUSiteID) + //目标机房是否存在 + //检查物理机的当前运营状态 + dev, err := repo.GetDeviceBySN(data.SN) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"sns"}, binding.BusinessError, fmt.Sprintf("设备(sn=%s)不存在", data.SN)) + return errs + } + if err != nil { + errs.Add([]string{"sns"}, binding.SystemError, "系统内部发生错误") + return errs + } + if dev.OperationStatus != model.DevOperStatPreDeploy && + dev.OperationStatus != model.DevOperStatOnShelve && + dev.OperationStatus != model.DevOperStatPreMove && + dev.OperationStatus != model.DevOperStatInStore { + errs.Add([]string{"sns"}, binding.BusinessError, + fmt.Sprintf("设备(sn=%s)运营状态必须是已上架/待部署/待搬迁/库房中(当前状态:%s)", data.SN, + OperationStatusTransfer(dev.OperationStatus, true))) + return errs + } + if data.DstServerRoomID != 0 { //搬迁到机架 + if dev.OperationStatus == model.DevOperStatInStore || dev.StoreRoomID != 0 { + data.MigType = model.MigTypeStore2Usite //从库房到机架,此时不用埋关电和释放IP的钩子函数 + } else { + data.MigType = model.MigTypeUsite2Usite + } + //检查目标机架是否存在 + c, err := repo.GetServerCabinetByID(data.DstCabinetID) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"ids"}, binding.BusinessError, fmt.Sprintf("机架(id=%d)不存在", data.DstUSiteID)) + return errs + } + if err != nil { + errs.Add([]string{"ids"}, binding.SystemError, "系统内部发生错误") + return errs + } + //检查目标机位是否存在且状态不为已使用或者不可用 + usite, err := repo.GetServerUSiteByID(data.DstUSiteID) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"ids"}, binding.BusinessError, fmt.Sprintf("机位(id=%d)不存在", data.DstUSiteID)) + return errs + } + if err != nil { + errs.Add([]string{"ids"}, binding.SystemError, "系统内部发生错误") + return errs + } + if usite.Status == model.USiteStatDisabled || usite.Status == model.USiteStatUsed { + errs.Add([]string{"ids"}, binding.SystemError, fmt.Sprintf("机位%s(机架:%s)已被使用或不可用", + usite.Number, c.Number)) + return errs + } + } else if data.DstStoreRoomID != 0 { + if dev.OperationStatus == model.DevOperStatInStore || dev.StoreRoomID != 0 { + data.MigType = model.MigTypeStore2Store + } else { + data.MigType = model.MigTypeUsite2Store + } + + //检查库房单元是否存在 + _, err = repo.GetStoreRoomByID(data.DstStoreRoomID) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"ids"}, binding.BusinessError, fmt.Sprintf("库房单元(id=%d)不存在", data.DstStoreRoomID)) + return errs + } + if err != nil { + errs.Add([]string{"ids"}, binding.SystemError, "系统内部发生错误") + return errs + } + //检查虚拟货架是否存在 + _, err = repo.GetVirtualCabinetByID(data.DstVCabinetID) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"ids"}, binding.BusinessError, fmt.Sprintf("虚拟货架(id=%d)不存在", data.DstVCabinetID)) + return errs + } + if err != nil { + errs.Add([]string{"ids"}, binding.SystemError, "系统内部发生错误") + return errs + } + } + } + // 目标机位唯一性校验 + if len(dstUsiteIDsForCheck) >= 2 { + for i := 0; i < len(dstUsiteIDsForCheck); i++ { + for j := i + 1; j < len(dstUsiteIDsForCheck); j++ { + if dstUsiteIDsForCheck[i] == dstUsiteIDsForCheck[j] { + errs.Add([]string{"ids"}, binding.BusinessError, "存在重复的目标机位,请检查") + return errs + } + } + } + } + // TODO 校验审批人是否存在 + return errs +} + +// SubmitDeviceMigrationApproval 提交物理机搬迁审批 +func SubmitDeviceMigrationApproval(log logger.Logger, repo model.Repo, conf *config.Config, reqData *SubmitDeviceMigrationApprovalReq) (approvalID uint, err error) { + now := time.Now() + + approval := model.Approval{ + Title: fmt.Sprintf("%s的物理机搬迁审批", reqData.CurrentUser.Name), + Type: model.ApprovalTypeDeviceMigration, + Metadata: string(reqData.ToJSON()), + FrontData: reqData.FrontData, + Initiator: reqData.CurrentUser.ID, + Approvers: string(reqData.ApproversJSON()), + Remark: reqData.Remark, + StartTime: &now, + IsRejected: model.NO, + Status: model.ApprovalStatusApproval, + } + + steps := make([]*model.ApprovalStep, 0, len(reqData.Approvers)) + for i, uid := range reqData.Approvers { + step := &model.ApprovalStep{ + Approver: uid, + Title: approval.Title, + } + if i == 0 { + step.StartTime = &now // 为审批单的第一个步骤设置开始时间 + step.Hooks = string(reqData.Step1HooksJSON()) + } + if i == len(reqData.Approvers)-1 { // 在审批最后一步添加钩子 + step.Hooks = string(reqData.Step2HooksJSON()) + } + steps = append(steps, step) + } + + if err = repo.SubmitApproval(&approval, steps...); err != nil { + return 0, err + } + + //预占用机位 + var usiteIDs []uint + for _, dev := range reqData.Data { + usiteIDs = append(usiteIDs, dev.DstUSiteID) + } + _, _ = repo.BatchUpdateServerUSitesStatus(usiteIDs, model.USiteStatPreOccupied) + + // 获取审批人Email并调用邮件发送api + var aprs []string + err = json.Unmarshal([]byte(approval.Approvers), &aprs) + if err != nil { + log.Debug(err) + } + for k, _ := range aprs { + loginID, _, email, _ := reqData.SubmitApprovalCommon.GetEmailFromUAM(aprs[k]) + if email != "" { + sendmailreq := middleware.SendMailReq { + From: defaultMailFrom, + To: email, + Title: approval.Title, + Content: approval.Title, + BodyFormat: "1", + Priority: "0", + } + go middleware.SendMail(log, repo, conf, &sendmailreq) + } else { + log.Errorf("审批:%s 邮件通知失败: 用户 %s 的 Email 为空", approval.Title, loginID) + } + } + // 邮件发送不影响审批单提交 + return approval.ID, nil +} + +// ImportMigrationApprovalReq 导入待搬迁物理机的字段结构 +type ImportMigrationApprovalReq struct { + // 序列号 + SN string `json:"sn"` + // 目标IDC + DstIDCName string `json:"dst_idc_name"` + // 目标机房 + DstServerRoomName string `json:"dst_server_room_name"` + // 目标机架 + DstCabinetNum string `json:"dst_cabinet_number"` + // 目标机位 + DstUSiteNum string `json:"dst_usite_number"` + // 目标库房 + DstStoreRoom string `json:"dst_store_room_name"` + // 目标虚拟货架 + DstVCabinetNum string `json:"dst_virtual_cabinet_number"` + // 搬迁类型, + MigType string `json:"mig_type"` + + ErrMsgContent string `json:"content"` + + //私有部分 + DstIDCID uint `json:"dst_idc_id"` + DstServerRoomID uint `json:"dst_server_room_id"` + DstCabinetID uint `json:"dst_cabinet_id"` + DstUsiteID uint `json:"dst_usite_id"` + DstStoreRoomID uint `json:"dst_store_room_id"` + DstVCabinetID uint `json:"dst_virtual_cabinet_id"` + Fn string `json:"fixed_asset_number"` //固资 + MModel string `json:"model"` //型号 + Category string `json:"category"` //类型 + OperationStatus string `json:"operation_status"` + IDC *IDCSimplify `json:"idc"` + ServerRoom *ServerRoomSimplify `json:"server_room"` + ServerCabinet *ServerCabinetSimplify `json:"server_cabinet"` + ServerUSite *ServerUSiteSimplify `json:"server_usite"` +} + +//checkLength 对导入文件中的数据做字段长度校验 +func (impDevReq *ImportMigrationApprovalReq) checkLength() { + leg := len(impDevReq.SN) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:序列号长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.DstIDCName) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:数据中心名称长度为(%d)(不能为空,不能大于255)", leg) + } + legServerRoom := len(impDevReq.DstServerRoomName) + lenStoreRoom := len(impDevReq.DstStoreRoom) + if (legServerRoom == 0 && lenStoreRoom == 0) || legServerRoom > 255 || lenStoreRoom > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + "必填项校验:机房管理单元、库房管理单元不能同时为空,不能大于255)" + } + if lenStoreRoom != 0 && legServerRoom != 0 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + "机房和库房只需二选一" + } + + leg = len(impDevReq.DstCabinetNum) + lenVCabinetNum := len(impDevReq.DstVCabinetNum) + if (leg == 0 && lenVCabinetNum == 0) || leg > 255 || lenVCabinetNum > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + "必填项校验:机架编号、虚拟货架不能同时为空,且不能大于255" + } + if leg != 0 && lenVCabinetNum != 0 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + "机架和虚拟货架只需二选一" + } + + leg = len(impDevReq.DstUSiteNum) + if (legServerRoom != 0 && leg == 0) || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:机位编号长度为(%d)(不能为空,不能大于255)", leg) + } +} + +//validate 对导入文件中的数据做基本验证 +func (impDevReq *ImportMigrationApprovalReq) validate(repo model.Repo) error { + d, err := repo.GetDeviceBySN(impDevReq.SN) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } else if err == gorm.ErrRecordNotFound || d == nil { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("设备(SN:%s)不存在", impDevReq.SN) + return nil + } + if d != nil { + impDevReq.Fn = d.FixedAssetNumber + impDevReq.MModel = d.DevModel + impDevReq.Category = d.Category + impDevReq.OperationStatus = d.OperationStatus + impDevReq.IDC = &IDCSimplify{ID: d.IDCID} + impDevReq.ServerRoom = &ServerRoomSimplify{ID: d.ServerRoomID} + impDevReq.ServerCabinet = &ServerCabinetSimplify{ID: d.CabinetID} + impDevReq.ServerUSite = &ServerUSiteSimplify{} + //conver2DevicePagesResp + //idc + if idc, err := repo.GetIDCByID(d.IDCID); err == nil { + impDevReq.IDC.Name = idc.Name + } + + if d.OperationStatus != model.DevOperStatInStore || d.StoreRoomID != 0 { //常规已上架的流程 + //server_room + if room, err := repo.GetServerRoomByID(d.ServerRoomID); err == nil { + impDevReq.ServerRoom.Name = room.Name + } + //server_cabinet + if cabinet, err := repo.GetServerCabinetByID(d.CabinetID); err == nil { + impDevReq.ServerCabinet.Number = cabinet.Number + } + //server_usite + if d.USiteID != nil { + if u, err := repo.GetServerUSiteByID(*d.USiteID); err == nil { + impDevReq.ServerUSite.ID = u.ID + impDevReq.ServerUSite.Number = u.Number + impDevReq.ServerUSite.PhysicalArea = u.PhysicalArea + } + } + //impDevReq.TOR, _ = repo.GetTORBySN(d.SN) + + } else { //库房中的 + if room, err := repo.GetStoreRoomByID(d.StoreRoomID); err == nil && room != nil { + impDevReq.ServerRoom.ID = room.ID + impDevReq.ServerRoom.Name = room.Name + } + //virtual_cabinet + if cabinet, err := repo.GetVirtualCabinetByID(d.VCabinetID); err == nil && cabinet != nil { + impDevReq.ServerCabinet.ID = cabinet.ID + impDevReq.ServerCabinet.Number = cabinet.Number + } + + } + + } + + //数据中心 + idc, err := repo.GetIDCByName(impDevReq.DstIDCName) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } else if err == gorm.ErrRecordNotFound || idc == nil { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("数据中心(%s)不存在", impDevReq.DstIDCName) + } + if idc != nil { + impDevReq.DstIDCID = idc.ID + } + + //导入到机架 + if impDevReq.DstServerRoomName != "" { + if d.OperationStatus == model.DevOperStatInStore { + impDevReq.MigType = model.MigTypeStore2Usite //从库房到机架,此时不用埋关电和释放IP的钩子函数 + } else { + impDevReq.MigType = model.MigTypeUsite2Usite + } + //机房校验 + srs, err := repo.GetServerRoomByName(impDevReq.DstServerRoomName) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if err == gorm.ErrRecordNotFound || srs == nil { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("机房名(%s)不存在", impDevReq.DstServerRoomName) + } else if srs.IDCID != idc.ID { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("机房名(%s)不属于数据中心(%s)", impDevReq.DstServerRoomName, impDevReq.DstIDCName) + } else { + impDevReq.DstIDCID = srs.IDCID + impDevReq.DstServerRoomID = srs.ID + } + + //机架 + cabinet, err := repo.GetServerCabinetByNumber(impDevReq.DstServerRoomID, impDevReq.DstCabinetNum) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if err == gorm.ErrRecordNotFound || cabinet == nil { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("机架编号(%s)不存在", impDevReq.DstCabinetNum) + } else { + impDevReq.DstCabinetID = cabinet.ID + } + //机位 + uSite, err := repo.GetServerUSiteByNumber(impDevReq.DstCabinetID, impDevReq.DstUSiteNum) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if err == gorm.ErrRecordNotFound || uSite == nil { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("机位编号(%s)不存在, 机架编号(%s)", impDevReq.DstUSiteNum, impDevReq.DstCabinetNum) + } else { + if uSite.Status == model.USiteStatDisabled || uSite.Status == model.USiteStatUsed { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("机位编号(%s)已使用或不可用", uSite.Number) + } + impDevReq.DstUsiteID = uSite.ID + } + + } else { + //导入到库房 + if d.OperationStatus == model.DevOperStatInStore { + impDevReq.MigType = model.MigTypeStore2Store + } else { + impDevReq.MigType = model.MigTypeUsite2Store + } + //检查库房单元是否存在 + storeRoom, err := repo.GetStoreRoomByName(impDevReq.DstStoreRoom) + if gorm.IsRecordNotFoundError(err) { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("库房单元(%s)不存在", impDevReq.DstStoreRoom) + } + if err != nil { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + "系统内部发生错误" + } + if storeRoom != nil { + if storeRoom.IDCID != idc.ID { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("库房(%s)不属于idc(%s)", storeRoom.Name, idc.Name) + } + impDevReq.DstStoreRoomID = storeRoom.ID + //impDevReq.DstIDCID = storeRoom.IDCID + } + //检查虚拟货架是否存在 + vc, _ := repo.GetVirtualCabinets(&model.VirtualCabinet{Number: impDevReq.DstVCabinetNum}, nil, nil) + if len(vc) == 0 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("虚拟货架(%s)不存在", impDevReq.DstVCabinetNum) + } else { + impDevReq.DstVCabinetID = vc[0].ID + } + } + return nil +} + +//ImportMigrationApprovalPriview 预览导入的待搬迁物理机 +func ImportMigrationApprovalPriview(log logger.Logger, repo model.Repo, reqData *ImportPreviewReq) (map[string]interface{}, error) { + fileName := upload.UploadDir + reqData.FileName + ra, err := utils.ParseDataFromXLSX(fileName) + if err != nil { + return nil, err + } + length := len(ra) + if length > approvalLimit50+1 { + return nil, fmt.Errorf("导入数量不允许超过%d条", approvalLimit50) + } + + var success []*ImportMigrationApprovalReq + var failure []*ImportMigrationApprovalReq + + for i := 1; i < length; i++ { + row := &ImportMigrationApprovalReq{} + if len(ra[i]) < 7 { + var br string + if row.ErrMsgContent != "" { + br = "<br />" + } + row.ErrMsgContent += br + "导入文件列长度不对(应为7列)" + failure = append(failure, row) + continue + } + row.SN = ra[i][0] + row.DstIDCName = ra[i][1] + row.DstServerRoomName = ra[i][2] + row.DstCabinetNum = ra[i][3] + row.DstUSiteNum = ra[i][4] + row.DstStoreRoom = ra[i][5] + row.DstVCabinetNum = ra[i][6] + + utils.StructTrimSpace(row) + + //字段存在性校验 + row.checkLength() + + //数据有效性校验 + err := row.validate(repo) + if err != nil { + return nil, err + } + + if row.ErrMsgContent != "" { + failure = append(failure, row) + } else { + success = append(success, row) + } + } + + var data []*ImportMigrationApprovalReq + if len(failure) > 0 { + data = failure + } else { + data = success + } + var result []*ImportMigrationApprovalReq + for i := 0; i < len(data); i++ { + if uint(i) >= reqData.Offset && uint(i) < (reqData.Offset+reqData.Limit) { + result = append(result, data[i]) + } + } + if len(failure) > 0 { + _ = os.Remove(fileName) + return map[string]interface{}{"status": "failure", + "message": "导入服务器错误", + "total_records": len(data), + "content": result, + }, nil + } + return map[string]interface{}{"status": "success", + "message": "操作成功", + "import_status": true, + "total_records": len(data), + "content": result, + }, nil +} + +// ImportMigrationApproval 将导入的待搬迁机器生成审批单 +func ImportMigrationApproval(log logger.Logger, repo model.Repo, conf *config.Config, user *model.CurrentUser, reqData *ImportApprovalReq) (approvalID uint, err error) { + fileName := upload.UploadDir + reqData.FileName + ra, err := utils.ParseDataFromXLSX(fileName) + if err != nil { + return + } + length := len(ra) + + //把临时文件删了 + err = os.Remove(fileName) + if err != nil { + log.Warnf("remove tmp file: %s fail", fileName) + return + } + + //front_data 这个数据是为了和前端提交的数据保持一致 + type FrontData struct { + FN string `json:"fixed_asset_number"` + SN string `json:"sn"` + Model string `json:"model"` + IDC string `json:"idc"` + SR string `json:"server_room_name"` + Cabinet string `json:"server_cabinet_number"` + Usite string `json:"server_usite_number"` + StoreRoom string `json:"store_room_name"` + VCabinet string `json:"virtual_cabinet_number"` + } + fd := make([]*FrontData, 0, len(ra)) + + var data []*SubmitDeviceMigrationApprovalReqData + for i := 1; i < length; i++ { + row := &ImportMigrationApprovalReq{} + row.SN = ra[i][0] + row.DstIDCName = ra[i][1] + row.DstServerRoomName = ra[i][2] + row.DstCabinetNum = ra[i][3] + row.DstUSiteNum = ra[i][4] + row.DstStoreRoom = ra[i][5] + row.DstVCabinetNum = ra[i][6] + + utils.StructTrimSpace(row) + + _ = row.validate(repo) + + data = append(data, &SubmitDeviceMigrationApprovalReqData{ + SN: row.SN, + DstIDCID: row.DstIDCID, + //导入到机房 + DstServerRoomID: row.DstServerRoomID, + DstCabinetID: row.DstCabinetID, + DstUSiteID: row.DstUsiteID, + //导入到库房 + DstStoreRoomID: row.DstStoreRoomID, + DstVCabinetID: row.DstVCabinetID, + MigType: row.MigType, + }) + + fd = append(fd, &FrontData{ + FN: row.Fn, + SN: row.SN, + Model: row.MModel, + IDC: row.DstIDCName, + SR: row.DstServerRoomName, + Cabinet: row.DstCabinetNum, + Usite: row.DstUSiteNum, + StoreRoom: row.DstStoreRoom, + VCabinet: row.DstVCabinetNum, + }) + } + + fdByte, err := json.Marshal(fd) + if err != nil { + return 0, err + } + newReqData := SubmitDeviceMigrationApprovalReq{ + SubmitApprovalCommon: SubmitApprovalCommon{ + CurrentUser: user, + Approvers: reqData.Approvers, + FrontData: string(fdByte), + Remark: "导入", + }, + Data: data, + } + + return SubmitDeviceMigrationApproval(log, repo, conf, &newReqData) +} + +// SubmitDeviceRetirementApprovalReq 提物理机退役审批请求参数结构体 +type SubmitDeviceRetirementApprovalReq struct { + SubmitApprovalCommon + SNs []string `json:"sns"` + //Approvers []string `json:"approvers"` // 审批人ID列表 + //CurrentUser *model.CurrentUser `json:"-"` + //FrontData string `json:"front_data"` //前端传入的元数据 + //Remark string +} + +// ToJSON 将请求结构体转换成JSON +func (reqData *SubmitDeviceRetirementApprovalReq) ToJSON() []byte { + b, _ := json.Marshal(reqData.SNs) + return b +} + +// ApproversJSON 返回审批人ID构成的JSON数组字符串 +func (reqData *SubmitDeviceRetirementApprovalReq) ApproversJSON() []byte { + b, _ := json.Marshal(reqData.Approvers) + return b +} + +// ToJSON 将请求结构体转换成JSON +func (reqData *SubmitDeviceRetirementApprovalReq) HooksJSON(hook ...string) []byte { + hooks := []*model.StepHook{ + { + ID: hook[0], // 物理机退役关电钩子 + Description: "", + ContinueOnError: true, + }, + } + b, _ := json.Marshal(hooks) + return b +} + +// Step1HooksJSON 返回审批步骤钩子构成的字符串 +func (reqData *SubmitDeviceRetirementApprovalReq) Step1HooksJSON() []byte { + hooks := []*model.StepHook{ + { + ID: model.HookDeviceRetirementPowerOff, // 物理机退役关电钩子 + Description: "", + ContinueOnError: true, + }, + { + ID: model.HookDeviceRetirementReserveIP, // 物理机退役保留IP钩子 + Description: "", + ContinueOnError: true, + }, + } + b, _ := json.Marshal(hooks) + return b +} + +// Step2HooksJSON 返回审批步骤钩子构成的字符串 +func (reqData *SubmitDeviceRetirementApprovalReq) Step2HooksJSON() []byte { + hooks := []*model.StepHook{ + { + ID: model.HookDeviceRetirement, // 物理机退役修改状态钩子 + Description: "", + ContinueOnError: true, + }, + } + b, _ := json.Marshal(hooks) + return b +} + +// FieldMap 字段映射 +func (reqData *SubmitDeviceRetirementApprovalReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.SNs: "sns", + &reqData.Approvers: "approvers", + } +} + +// Validate 结构体数据校验 +func (reqData *SubmitDeviceRetirementApprovalReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + if errsRet := reqData.SubmitApprovalCommon.Validate(req, errs); len(errsRet) != 0 { + return errsRet + } + repo, _ := middleware.RepoFromContext(req.Context()) + if len(reqData.SNs) > approvalLimit50 { + errs.Add([]string{"sns"}, binding.BusinessError, + fmt.Sprintf("提交数据量(%d)须不大于(%d)条", len(reqData.SNs), approvalLimit50)) + return errs + } + for _, sn := range reqData.SNs { + //检查物理机的当前运营状态 + dev, err := repo.GetDeviceBySN(sn) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"sns"}, binding.BusinessError, fmt.Sprintf("设备(sn=%s)不存在", sn)) + return errs + } + if err != nil { + errs.Add([]string{"sns"}, binding.SystemError, "系统内部发生错误") + return errs + } + if dev.OperationStatus != model.DevOperStatPreRetire { + errs.Add([]string{"sns"}, binding.BusinessError, + fmt.Sprintf("设备(sn=%s)运营状态必须是待退役(当前状态:%s)", sn, OperationStatusTransfer(dev.OperationStatus, true))) + return errs + } + } + // TODO 校验审批人是否存在 + return errs +} + +// SubmitDeviceRetirementApproval 提交物理机退役审批 +func SubmitDeviceRetirementApproval(log logger.Logger, repo model.Repo, conf *config.Config, reqData *SubmitDeviceRetirementApprovalReq) (approvalID uint, err error) { + now := time.Now() + + approval := model.Approval{ + Title: fmt.Sprintf("%s的物理机退役审批", reqData.CurrentUser.Name), + Type: model.ApprovalTypeDeviceRetirement, + Metadata: string(reqData.ToJSON()), + FrontData: reqData.FrontData, + Initiator: reqData.CurrentUser.ID, + Approvers: string(reqData.ApproversJSON()), + Remark: reqData.Remark, + StartTime: &now, + IsRejected: model.NO, + Status: model.ApprovalStatusApproval, + } + + steps := make([]*model.ApprovalStep, 0, len(reqData.Approvers)) + for i, uid := range reqData.Approvers { + step := &model.ApprovalStep{ + Approver: uid, + Title: approval.Title, + } + if i == 0 { + step.StartTime = &now // 为审批单的第一个步骤设置开始时间 + step.Hooks = string(reqData.Step1HooksJSON()) + } + if i == len(reqData.Approvers)-1 { // 在审批最后一步添加钩子 + step.Hooks = string(reqData.Step2HooksJSON()) + } + steps = append(steps, step) + } + + if err = repo.SubmitApproval(&approval, steps...); err != nil { + return 0, err + } + // 获取审批人Email并调用邮件发送api + var aprs []string + err = json.Unmarshal([]byte(approval.Approvers), &aprs) + if err != nil { + log.Debug(err) + } + for k, _ := range aprs { + loginID, _, email, _ := reqData.SubmitApprovalCommon.GetEmailFromUAM(aprs[k]) + if email != "" { + sendmailreq := middleware.SendMailReq { + From: defaultMailFrom, + To: email, + Title: approval.Title, + Content: approval.Title, + BodyFormat: "1", + Priority: "0", + } + go middleware.SendMail(log, repo, conf, &sendmailreq) + } else { + log.Errorf("审批:%s 邮件通知失败: 用户 %s 的 Email 为空", approval.Title, loginID) + } + } + // 邮件发送不影响审批单提交 + return approval.ID, nil +} + +// SubmitDeviceReInstallationApprovalReq 提物理机重装审批请求参数结构体 +type SubmitDeviceReInstallationApprovalReq struct { + SubmitApprovalCommon + Settings OSReinstallSetting `json:"settings"` +} + +// ToJSON 将请求结构体转换成JSON +func (reqData *SubmitDeviceReInstallationApprovalReq) ToJSON() []byte { + b, _ := json.Marshal(reqData.Settings) + return b +} + +// ApproversJSON 返回审批人ID构成的JSON数组字符串 +func (reqData *SubmitDeviceReInstallationApprovalReq) ApproversJSON() []byte { + b, _ := json.Marshal(reqData.Approvers) + return b +} + +// HooksJSON 返回审批步骤钩子构成的字符串 +func (reqData *SubmitDeviceReInstallationApprovalReq) HooksJSON() []byte { + hooks := []*model.StepHook{ + { + ID: model.HookDeviceOSReinstallation, // 物理机重装钩子 + Description: "", + ContinueOnError: true, + }, + } + b, _ := json.Marshal(hooks) + return b +} + +// FieldMap 字段映射 +func (reqData *SubmitDeviceReInstallationApprovalReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.Settings: "settings", + &reqData.Approvers: "approvers", + } +} + +// Validate 结构体数据校验 +func (reqData *SubmitDeviceReInstallationApprovalReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + if errsRet := reqData.SubmitApprovalCommon.Validate(req, errs); len(errsRet) != 0 { + return errsRet + } + repo, _ := middleware.RepoFromContext(req.Context()) + if len(reqData.Settings) > approvalLimit50 { + errs.Add([]string{"settings"}, binding.BusinessError, + fmt.Sprintf("提交数据量(%d)须不大于(%d)条", len(reqData.Settings), approvalLimit50)) + return errs + } + for _, sett := range reqData.Settings { + //检查物理机的当前运营状态 + dev, err := repo.GetDeviceBySN(sett.SN) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"sns"}, binding.BusinessError, fmt.Sprintf("设备(sn=%s)不存在", sett.SN)) + return errs + } + if err != nil { + errs.Add([]string{"sns"}, binding.SystemError, "系统内部发生错误") + return errs + } + if dev.OperationStatus != model.DevOperStatRunWithAlarm && + dev.OperationStatus != model.DevOperStatRunWithoutAlarm && + dev.OperationStatus != model.DevOperStatOnShelve { + errs.Add([]string{"sns"}, binding.BusinessError, + fmt.Sprintf("设备(sn=%s)运营状态必须是运营中或已上架(当前状态:%s)", sett.SN, + OperationStatusTransfer(dev.OperationStatus, true))) + return errs + } + sett.OriginStatus = dev.OperationStatus + } + // 做参数校验,不然出了错误会把人整死的 + errs = reqData.Settings.Validate(req, errs) + // TODO 校验审批人是否存在 + return errs +} + +// SubmitDeviceReInstallationApproval 提交物理机重装审批 +func SubmitDeviceReInstallationApproval(log logger.Logger, repo model.Repo, conf *config.Config, reqData *SubmitDeviceReInstallationApprovalReq) (approvalID uint, err error) { + now := time.Now() + + approval := model.Approval{ + Title: fmt.Sprintf("%s的物理机重装审批", reqData.CurrentUser.Name), + Type: model.ApprovalTypeDeviceOSReinstallation, + Metadata: string(reqData.ToJSON()), + FrontData: reqData.FrontData, + Initiator: reqData.CurrentUser.ID, + Approvers: string(reqData.ApproversJSON()), + Remark: reqData.Remark, + StartTime: &now, + IsRejected: model.NO, + Status: model.ApprovalStatusApproval, + } + + steps := make([]*model.ApprovalStep, 0, len(reqData.Approvers)) + for i, uid := range reqData.Approvers { + step := &model.ApprovalStep{ + Approver: uid, + Title: approval.Title, + } + if i == 0 { + step.StartTime = &now // 为审批单的第一个步骤设置开始时间 + } + if i == len(reqData.Approvers)-1 { // 在审批最后一步添加钩子 + step.Hooks = string(reqData.HooksJSON()) + } + steps = append(steps, step) + } + + if err = repo.SubmitApproval(&approval, steps...); err != nil { + return 0, err + } + // 获取审批人Email并调用邮件发送api + var aprs []string + err = json.Unmarshal([]byte(approval.Approvers), &aprs) + if err != nil { + log.Debug(err) + } + for k, _ := range aprs { + loginID, _, email, _ := reqData.SubmitApprovalCommon.GetEmailFromUAM(aprs[k]) + if email != "" { + sendmailreq := middleware.SendMailReq { + From: defaultMailFrom, + To: email, + Title: approval.Title, + Content: approval.Title, + BodyFormat: "1", + Priority: "0", + } + go middleware.SendMail(log, repo, conf, &sendmailreq) + } else { + log.Errorf("审批:%s 邮件通知失败: 用户 %s 的 Email 为空", approval.Title, loginID) + } + } + // 邮件发送不影响审批单提交 + return approval.ID, nil +} + +// SubmitDeviceRecycleApprovalReq 回收审批的请求结构 +type SubmitDeviceRecycleApprovalReq struct { + SubmitDeviceRetirementApprovalReq + ApprovalType string `json:"approval_type"` //device_recycle_pre_move|device_recycle_pre_retire|device_recycle_reinstall + Settings OSReinstallSetting `json:"settings"` //当ApprovalType=reinstall时,需要指定此参数 +} + +type OSReinstallSetting []*OSReinstallSettingItem + +type OSReinstallSettingItem struct { + SaveDeviceSettingItem + OriginStatus string `json:"origin_status"` //记录初始的设备运行状态,以便还原 +} + +// Validate 装机参数校验 +func (reqData OSReinstallSetting) Validate(r *http.Request, errs binding.Errors) binding.Errors { + for i := range reqData { + if errs = reqData[i].validateOne(r, errs); errs.Len() > 0 { + return errs + } + } + return errs +} + +// ToJSON 将请求结构体转换成JSON +func (reqData *SubmitDeviceRecycleApprovalReq) ToJSON() (b []byte) { + switch reqData.ApprovalType { + case model.ApprovalTypeDeviceRecycleReinstall: + b, _ = json.Marshal(reqData.Settings) + case model.ApprovalTypeDeviceRecyclePreMove: + fallthrough + case model.ApprovalTypeDeviceRecyclePreRetire: + b, _ = json.Marshal(reqData.SNs) + } + + return b +} + +// ApproversJSON 返回审批人ID构成的JSON数组字符串 +func (reqData *SubmitDeviceRecycleApprovalReq) ApproversJSON() []byte { + b, _ := json.Marshal(reqData.Approvers) + return b +} + +// HooksJSON 返回审批步骤钩子构成的字符串 +func (reqData *SubmitDeviceRecycleApprovalReq) HooksJSON() (b []byte) { + switch reqData.ApprovalType { + case model.ApprovalTypeDeviceRecycleReinstall: + hooks := []*model.StepHook{ + { + ID: model.HookDeviceRecycleReinstall, // 物理机回收重装钩子 + Description: "", + ContinueOnError: true, + }, + } + b, _ = json.Marshal(hooks) + case model.ApprovalTypeDeviceRecyclePreMove: + hooks := []*model.StepHook{ + { + ID: model.HookDeviceRecyclePreMove, // 物理机回收待搬迁钩子 + Description: "", + ContinueOnError: true, + }, + } + b, _ = json.Marshal(hooks) + case model.ApprovalTypeDeviceRecyclePreRetire: + hooks := []*model.StepHook{ + { + ID: model.HookDeviceRecyclePreRetire, // 物理机回收待退役钩子 + Description: "", + ContinueOnError: true, + }, + } + b, _ = json.Marshal(hooks) + } + + return b +} + +// FieldMap 字段映射 +func (reqData *SubmitDeviceRecycleApprovalReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.Settings: "settings", + &reqData.Approvers: "approvers", + &reqData.ApprovalType: "approval_type", + &reqData.SNs: "sns", + } +} + +// Validate 结构体数据校验 +func (reqData *SubmitDeviceRecycleApprovalReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + if errsRet := reqData.SubmitApprovalCommon.Validate(req, errs); len(errsRet) != 0 { + return errsRet + } + if reqData.ApprovalType != model.ApprovalTypeDeviceRecycleReinstall && + reqData.ApprovalType != model.ApprovalTypeDeviceRecyclePreRetire && + reqData.ApprovalType != model.ApprovalTypeDeviceRecyclePreMove { + errs.Add([]string{"approval_type"}, binding.BusinessError, + fmt.Sprintf("审批类型值(%s)不合法", reqData.ApprovalType)) + return errs + } + repo, _ := middleware.RepoFromContext(req.Context()) + if reqData.ApprovalType == model.ApprovalTypeDeviceRecycleReinstall && + len(reqData.Settings) > approvalLimit50 { + errs.Add([]string{"settings"}, binding.BusinessError, + fmt.Sprintf("提交数据量(%d)须不大于(%d)条", len(reqData.Settings), approvalLimit50)) + return errs + } else if reqData.ApprovalType != model.ApprovalTypeDeviceRecycleReinstall && + len(reqData.SNs) > approvalLimit50 { + errs.Add([]string{"settings"}, binding.BusinessError, + fmt.Sprintf("提交数据量(%d)须不大于(%d)条", len(reqData.Settings), approvalLimit50)) + return errs + } + for _, sett := range reqData.Settings { + //检查物理机的当前运营状态 + dev, err := repo.GetDeviceBySN(sett.SN) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"sns"}, binding.BusinessError, fmt.Sprintf("设备(sn=%s)不存在", sett.SN)) + return errs + } + if err != nil { + errs.Add([]string{"sns"}, binding.SystemError, "系统内部发生错误") + return errs + } + if dev.OperationStatus != model.DevOperStatRunWithAlarm && + dev.OperationStatus != model.DevOperStatRunWithoutAlarm && + dev.OperationStatus != model.DevOperStatOnShelve && + dev.OperationStatus != model.DevOperStatRecycling { + errs.Add([]string{"sns"}, binding.BusinessError, + fmt.Sprintf("设备(sn=%s)运营状态必须是运营中或已上架或回收中(当前状态:%s)", sett.SN, + OperationStatusTransfer(dev.OperationStatus, true))) + return errs + } + sett.OriginStatus = dev.OperationStatus + } + // 做参数校验,不然出了错误会把人整死的 + if reqData.ApprovalType == model.ApprovalTypeDeviceRecycleReinstall { + errs = reqData.Settings.Validate(req, errs) + } + // TODO 校验审批人是否存在 + return errs +} + +// SubmitDeviceRecycleApproval 提交物理机回收审批 +func SubmitDeviceRecycleApproval(log logger.Logger, repo model.Repo, conf *config.Config, reqData *SubmitDeviceRecycleApprovalReq) (approvalID uint, err error) { + now := time.Now() + + approval := model.Approval{ + //Title: fmt.Sprintf("%s的物理机回收审批", reqData.CurrentUser.Name), + Type: reqData.ApprovalType, + Metadata: string(reqData.ToJSON()), + FrontData: reqData.FrontData, + Initiator: reqData.CurrentUser.ID, + Approvers: string(reqData.ApproversJSON()), + Remark: reqData.Remark, + StartTime: &now, + IsRejected: model.NO, + Status: model.ApprovalStatusApproval, + } + + switch reqData.ApprovalType { + case model.ApprovalTypeDeviceRecycleReinstall: + approval.Title = fmt.Sprintf("%s的物理机回收重装审批", reqData.CurrentUser.Name) + case model.ApprovalTypeDeviceRecyclePreMove: + approval.Title = fmt.Sprintf("%s的物理机回收待搬迁审批", reqData.CurrentUser.Name) + case model.ApprovalTypeDeviceRecyclePreRetire: + approval.Title = fmt.Sprintf("%s的物理机回收待退役审批", reqData.CurrentUser.Name) + } + steps := make([]*model.ApprovalStep, 0, len(reqData.Approvers)) + for i, uid := range reqData.Approvers { + step := &model.ApprovalStep{ + Approver: uid, + Title: approval.Title, + } + if i == 0 { + step.StartTime = &now // 为审批单的第一个步骤设置开始时间 + } + if i == len(reqData.Approvers)-1 { // 在审批最后一步添加钩子 + step.Hooks = string(reqData.HooksJSON()) + } + steps = append(steps, step) + } + + if err = repo.SubmitApproval(&approval, steps...); err != nil { + return 0, err + } + // 获取审批人Email并调用邮件发送api + var aprs []string + err = json.Unmarshal([]byte(approval.Approvers), &aprs) + if err != nil { + log.Debug(err) + } + for k, _ := range aprs { + loginID, _, email, _ := reqData.SubmitApprovalCommon.GetEmailFromUAM(aprs[k]) + if email != "" { + sendmailreq := middleware.SendMailReq { + From: defaultMailFrom, + To: email, + Title: approval.Title, + Content: approval.Title, + BodyFormat: "1", + Priority: "0", + } + go middleware.SendMail(log, repo, conf, &sendmailreq) + } else { + log.Errorf("审批:%s 邮件通知失败: 用户 %s 的 Email 为空", approval.Title, loginID) + } + } + // 邮件发送不影响审批单提交 + return approval.ID, nil +} + +// GetMyApprovalPageReq 获取我发起的审批单请求参数 +type GetMyApprovalPageReq struct { + // 申请单类型 + Type string `json:"type"` + // 申请单状态 + Status string `json:"status"` + // 分页页号 + Page int64 `json:"page"` + // 分页大小。默认值:10。阈值: 100。 + PageSize int64 `json:"page_size"` + + // 当前用户ID + CurrentUserID string `json:"-"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *GetMyApprovalPageReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.Type: "type", + &reqData.Status: "status", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + } +} + +func checkApprovalType(at string) bool { + if at != "" { + // 这里的校验要与model类型保持一致 + switch at { + case model.ApprovalTypeIDCAbolish: + case model.ApprovalTypeServerRoomAbolish: + case model.ApprovalTypeNetAreaOffline: + case model.ApprovalTypeIPUnassign: + case model.ApprovalTypeDevPowerOff: + case model.ApprovalTypeDevRestart: + case model.ApprovalTypeCabinetPowerOff: + case model.ApprovalTypeCabinetOffline: + case model.ApprovalTypeDeviceOSReinstallation: + case model.ApprovalTypeDeviceMigration: + case model.ApprovalTypeDeviceRetirement: + case model.ApprovalTypeDeviceRecycleReinstall: + case model.ApprovalTypeDeviceRecyclePreMove: + case model.ApprovalTypeDeviceRecyclePreRetire: + default: + return false + } + } + return true +} + +func checkApprovalStatus(as string) bool { + if as != "" { + // 这里的校验要与model状态保持一致 + switch as { + case model.ApprovalStatusApproval: + case model.ApprovalStatusCompleted: + case model.ApprovalStatusRevoked: + default: + return false + } + } + return true + +} + +// Validate 结构体数据校验 +func (reqData *GetMyApprovalPageReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + user, _ := middleware.LoginUserFromContext(req.Context()) + if user != nil { + reqData.CurrentUserID = user.ID + } + + if !checkApprovalType(reqData.Type) { + errs.Add([]string{"type"}, binding.RequiredError, "审批单类型值错误") + return errs + } + + if !checkApprovalStatus(reqData.Status) { + errs.Add([]string{"status"}, binding.RequiredError, "审批单状态值错误") + return errs + } + + return errs +} + +// GetMyApprovalPage 获取我发起的申请单分页 +func GetMyApprovalPage(log logger.Logger, repo model.Repo, reqData *GetMyApprovalPageReq) (*page.Page, error) { + if reqData.PageSize <= 0 || reqData.PageSize > 100 { + reqData.PageSize = 20 + } + if reqData.Page < 0 { + reqData.Page = 0 + } + + cond := model.Approval{ + Type: reqData.Type, + Status: reqData.Status, + } + + totalRecords, err := repo.CountInitiatedApprovals(reqData.CurrentUserID, &cond) + if err != nil { + return nil, err + } + + pager := page.NewPager(reflect.TypeOf(&ApprovalPage{}), reqData.Page, reqData.PageSize, totalRecords) + items, err := repo.GetInitiatedApprovals(reqData.CurrentUserID, &cond, model.OneOrderBy("id", model.DESC), pager.BuildLimiter()) + if err != nil { + return nil, err + } + for i := range items { + item, err := convert2MyApprovalPageResult(log, repo, items[i]) + if err != nil { + return nil, err + } + if item != nil { + pager.AddRecords(item) + } + } + return pager.BuildPage(), nil +} + +// ApprovalPage 我发起的审批分页查询信息 +type ApprovalPage struct { + // 审批单ID + ID uint `json:"id"` + // 审批类型 + Type string `json:"type"` + // 申请单标题 + Title string `json:"title"` + // 审批发起时间 + StartTime times.ISOTime `json:"start_time"` + // 审批结束时间 + EndTime times.ISOTime `json:"end_time"` + // 审批是否被拒绝 + IsRejected string `json:"is_rejected"` + // 审批状态 + Status string `json:"status"` +} + +func convert2MyApprovalPageResult(log logger.Logger, repo model.Repo, appr *model.Approval) (*ApprovalPage, error) { + if appr == nil { + return nil, nil + } + ap := &ApprovalPage{ + ID: appr.ID, + Title: appr.Title, + Type: appr.Type, + Status: appr.Status, + IsRejected: appr.IsRejected, + } + if appr.StartTime != nil { + ap.StartTime = times.ISOTime(*appr.StartTime) + } + if appr.EndTime != nil { + ap.EndTime = times.ISOTime(*appr.EndTime) + } + return ap, nil +} + +// GetApproveByMePageReq 获取待我审批请求参数 +type GetApproveByMePageReq struct { + // 申请单类型 + Type string `json:"type"` + // 分页页号 + Page int64 `json:"page"` + // 分页大小。默认值:10。阈值: 100。 + PageSize int64 `json:"page_size"` + + // 当前用户ID + CurrentUserID string `json:"-"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *GetApproveByMePageReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.Type: "type", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + } +} + +// Validate 结构体数据校验 +func (reqData *GetApproveByMePageReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + user, _ := middleware.LoginUserFromContext(req.Context()) + if user != nil { + reqData.CurrentUserID = user.ID + } + + if !checkApprovalType(reqData.Type) { + errs.Add([]string{"type"}, binding.RequiredError, "审批单类型值错误") + return errs + } + return errs +} + +// GetApproveByMePage 获取待我审批的申请单分页 +func GetApproveByMePage(log logger.Logger, repo model.Repo, reqData *GetApproveByMePageReq) (*page.Page, error) { + if reqData.PageSize <= 0 || reqData.PageSize > 100 { + reqData.PageSize = 20 + } + if reqData.Page < 0 { + reqData.Page = 0 + } + + cond := model.Approval{ + Type: reqData.Type, + Status: model.ApprovalStatusApproval, + } + + totalRecords, err := repo.CountPendingApprovals(reqData.CurrentUserID, &cond) + if err != nil { + return nil, err + } + + pager := page.NewPager(reflect.TypeOf(&ApprovalPage{}), reqData.Page, reqData.PageSize, totalRecords) + items, err := repo.GetPendingApprovals(reqData.CurrentUserID, &cond, model.OneOrderBy("id", model.DESC), pager.BuildLimiter()) + if err != nil { + return nil, err + } + + for i := range items { + ap := ApprovalPage{ + ID: items[i].ID, + Title: items[i].Title, + Type: items[i].Type, + IsRejected: items[i].IsRejected, + Status: items[i].Status, + } + if items[i].StartTime != nil { + ap.StartTime = times.ISOTime(*items[i].StartTime) + } + if items[i].EndTime != nil { + ap.EndTime = times.ISOTime(*items[i].EndTime) + } + + pager.AddRecords(&ap) + } + return pager.BuildPage(), nil +} + +// GetApprovedByMeReq 获取我审批完成的请求参数 +type GetApprovedByMeReq struct { + // 申请单类型 + Type string `json:"type"` + // 申请单状态 + Status string `json:"status"` + // 分页页号 + Page int64 `json:"page"` + // 分页大小。默认值:10。阈值: 100。 + PageSize int64 `json:"page_size"` + + // 当前用户ID + CurrentUserID string `json:"-"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *GetApprovedByMeReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.Type: "type", + &reqData.Status: "status", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + } +} + +// Validate 结构体数据校验 +func (reqData *GetApprovedByMeReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + user, _ := middleware.LoginUserFromContext(req.Context()) + if user != nil { + reqData.CurrentUserID = user.ID + } + + if !checkApprovalType(reqData.Type) { + errs.Add([]string{"type"}, binding.RequiredError, "审批单类型值错误") + return errs + } + + if !checkApprovalStatus(reqData.Status) { + errs.Add([]string{"status"}, binding.RequiredError, "审批单状态值错误") + return errs + } + + return errs +} + +// GetApprovedByMePage 获取被我审批的申请单分页 +func GetApprovedByMePage(log logger.Logger, repo model.Repo, reqData *GetApprovedByMeReq) (*page.Page, error) { + if reqData.PageSize <= 0 || reqData.PageSize > 100 { + reqData.PageSize = 20 + } + if reqData.Page < 0 { + reqData.Page = 0 + } + + cond := model.Approval{ + Type: reqData.Type, + Status: reqData.Status, + } + + totalRecords, err := repo.CountApprovedApprovals(reqData.CurrentUserID, &cond) + if err != nil { + return nil, err + } + + pager := page.NewPager(reflect.TypeOf(&ApprovalPage{}), reqData.Page, reqData.PageSize, totalRecords) + items, err := repo.GetApprovedApprovals(reqData.CurrentUserID, &cond, model.OneOrderBy("id", model.DESC), pager.BuildLimiter()) + if err != nil { + return nil, err + } + + for i := range items { + ap := ApprovalPage{ + ID: items[i].ID, + Title: items[i].Title, + Type: items[i].Type, + IsRejected: items[i].IsRejected, + Status: items[i].Status, + } + if items[i].StartTime != nil { + ap.StartTime = times.ISOTime(*items[i].StartTime) + } + if items[i].EndTime != nil { + ap.EndTime = times.ISOTime(*items[i].EndTime) + } + pager.AddRecords(&ap) + } + return pager.BuildPage(), nil +} + +// RevokeApprovalReq 取消申请单请求 +type RevokeApprovalReq struct { + // 审批单ID + ID int `json:"id"` + + // 当前用户ID + CurrentUserID string `json:"-"` +} + +// Validate 结构体数据校验 +func (reqData *RevokeApprovalReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + user, _ := middleware.LoginUserFromContext(req.Context()) + + if user == nil { + errs.Add([]string{"user"}, binding.RequiredError, "不存在登录用户") + return errs + } + + if reqData.ID <= 0 { + errs.Add([]string{"approval"}, binding.RequiredError, "指定的申请单不存在") + return errs + } + + // 查询当前用户的申请单是否存在 + item, err := repo.GetApprovalByID(uint(reqData.ID)) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"approval"}, binding.RequiredError, "当前用户下指定的申请单不存在") + return errs + } + if err != nil { + errs.Add([]string{"approval"}, binding.SystemError, "系统内部错误") + return errs + } + if item.Initiator != user.ID { + errs.Add([]string{"approval"}, binding.RequiredError, "当前用户下指定的申请单不存在") + return errs + } + if item.Status != model.ApprovalStatusApproval { + errs.Add([]string{"approval"}, binding.RequiredError, "申请单已经被拒绝或者已经完成,不能撤销") + return errs + } + + return errs +} + +// RevokeApproval 取消我发起的申请单 +func RevokeApproval(log logger.Logger, repo model.Repo, reqData *RevokeApprovalReq) error { + // 查询当前用户的申请单是否存在 + item, err := repo.GetApprovalByID(uint(reqData.ID)) + if gorm.IsRecordNotFoundError(err) { + return nil + } + if err != nil { + log.Errorf("RevokeApproval: %s\n", err.Error()) + return err + } + // 如果为设备搬迁,将预占用机位释放 + if item.Type == model.ApprovalTypeDeviceMigration { + var data []*SubmitDeviceMigrationApprovalReqData + if err = json.Unmarshal([]byte(item.Metadata), &data); err != nil { + log.Errorf("unmarshal metadata err:%s", err.Error()) + return err + } + var dstUsiteIDs []uint + for _, dev := range data { + //检查目标机位是否存在且状态为预占用 + usite, err := repo.GetServerUSiteByID(dev.DstUSiteID) + if gorm.IsRecordNotFoundError(err) { + log.Errorf("serverusite not found err:%s", err.Error()) + return err + } + if err != nil { + log.Errorf("check serverusite err:%s", err.Error()) + return err + } + if usite.Status == model.USiteStatPreOccupied { + dstUsiteIDs = append(dstUsiteIDs, dev.DstUSiteID) + } + } + + // 仅将状态为预占用的目标机位释放为空闲 + if _, err = repo.BatchUpdateServerUSitesStatus(dstUsiteIDs, model.USiteStatFree); err != nil { + log.Error("free usites(ids=%v) fail", dstUsiteIDs) + return err + } + } + return repo.RevokeApproval(uint(reqData.ID)) +} + +// GetApprovalByIDReq 查询申请单请求 +type GetApprovalByIDReq struct { + // 审批单ID + ID int `json:"id"` + // 当前用户ID + CurrentUserID string `json:"-"` + + // 从UAM上获取用户信息的钩子 + GetNameFromUAM myuser.GetNameFromUAM `json:"-"` +} + +// Validate 结构体数据校验 +func (reqData *GetApprovalByIDReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + user, _ := middleware.LoginUserFromContext(req.Context()) + + if user == nil { + errs.Add([]string{"user"}, binding.RequiredError, "不存在登录用户") + return errs + } + + if reqData.ID <= 0 { + errs.Add([]string{"approval"}, binding.RequiredError, "指定的申请单不存在") + return errs + } + + // 查询当前用户的申请单是否存在 + item, err := repo.GetApprovalByID(uint(reqData.ID)) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"approval"}, binding.RequiredError, "当前用户下指定的申请单不存在") + return errs + } + if err != nil { + errs.Add([]string{"approval"}, binding.SystemError, "系统内部错误") + return errs + } + if item.Initiator != user.ID && !strings.Contains(item.Approvers, user.ID) && !strings.Contains(item.Cc, user.ID) { + errs.Add([]string{"approval"}, binding.RequiredError, "当前用户下没有权限查看指定的申请单详情") + return errs + } + + return errs + +} + +// UserInfo 用户信息 +type UserInfo struct { + ID string `json:"id"` + LoginName string `json:"login_name"` + Name string `json:"name"` +} + +// ApprovalStepGetByIDRes 审批步骤 +type ApprovalStepGetByIDRes struct { + ID uint `json:"id"` // 审批步骤ID + Approver UserInfo `json:"approver"` // 审批步骤审批人ID + NextApprover UserInfo `json:"next_approver"` // 下一个审批人 + Title string `json:"title"` // 审批步骤标题 + Action string `json:"action"` // 审批动作 + Remark string `json:"remark"` // 审批批注 + StartTime times.ISOTime `json:"start_time"` // 审批步骤开始时间 + EndTime times.ISOTime `json:"end_time"` // 审批步骤结束时间 + Hooks string `json:"hooks"` // 当前审批步骤同意后执行的钩子对象数组字符串 +} + +// ApprovalGetByIDRes 审批单详情 +type ApprovalGetByIDRes struct { + ID uint `json:"id"` // 审批单ID + Title string `json:"title"` // 审批单标题 + FrontData string `json:"front_data"` // 审批单元数据快照 + Remark string `json:"remark"` //备注信息 + Type string `json:"type"` // 审批类型 + Metadata string `json:"metadata"` // 审批单元数据 + Initiator UserInfo `json:"initiator"` // 审批发起人 + Approvers []UserInfo `json:"approvers"` // 审批人ID构成的JSON数组字符串 + Cc []UserInfo `json:"cc"` // 抄送人ID构成的JSON数组字符串 + StartTime times.ISOTime `json:"start_time"` // 审批开始时间 + EndTime times.ISOTime `json:"end_time"` // 审批结束时间 + IsRejected *string `json:"is_rejected"` // 审批单是否被拒绝 + Status string `json:"status"` // 审批单状态 + Steps []ApprovalStepGetByIDRes `json:"steps"` // 审批流程 +} + +// GetApprovalByID 获取指定ID的申请单详情 +func GetApprovalByID(log logger.Logger, repo model.Repo, reqData *GetApprovalByIDReq) (*ApprovalGetByIDRes, error) { + + iap, err := repo.GetApprovalByID(uint(reqData.ID)) + if gorm.IsRecordNotFoundError(err) && iap == nil { + return nil, nil + } + if err != nil || iap == nil { + return nil, err + } + agbir := &ApprovalGetByIDRes{ + ID: iap.ID, + Title: iap.Title, + Type: iap.Type, + Metadata: iap.Metadata, + IsRejected: &iap.IsRejected, + Status: iap.Status, + FrontData: iap.FrontData, + Remark: iap.Remark, + } + if iap.StartTime != nil { + agbir.StartTime = times.ISOTime(*iap.StartTime) + } + if iap.EndTime != nil { + agbir.EndTime = times.ISOTime(*iap.EndTime) + } + + // 申请单发起人用户信息 + loginName, name, _ := reqData.GetNameFromUAM(iap.Initiator) + agbir.Initiator = UserInfo{ + ID: iap.Initiator, + LoginName: loginName, + Name: name, + } + + // 申请单审批人 + var aprs []string + err = json.Unmarshal([]byte(iap.Approvers), &aprs) + if err != nil { + log.Debug(err) + return agbir, nil + } + for k := range aprs { + loginName, name, _ := reqData.GetNameFromUAM(aprs[k]) + agbir.Approvers = append(agbir.Approvers, UserInfo{ + ID: aprs[k], + LoginName: loginName, + Name: name, + }) + } + + // 申请单抄送人 + var ccrs []string + err = json.Unmarshal([]byte(iap.Cc), &ccrs) + if err != nil { + log.Debug(err) + return agbir, nil + } + for k := range ccrs { + loginName, name, _ := reqData.GetNameFromUAM(ccrs[k]) + agbir.Cc = append(agbir.Cc, UserInfo{ + ID: ccrs[k], + LoginName: loginName, + Name: name, + }) + } + + ists, err := repo.GetApprovalStepByApprovalID(iap.ID) + if err != nil { + return nil, err + } + for k := range ists { + // 当前审批人信息 + loginName, name, _ := reqData.GetNameFromUAM(ists[k].Approver) + // 下一个审批人信息 + next := false + nexter := "" + for kk := range aprs { + if next { + nexter = aprs[kk] + } + if aprs[kk] == ists[k].Approver { + next = true + } + } + nloginName, nname, _ := reqData.GetNameFromUAM(nexter) + // + asgbir := ApprovalStepGetByIDRes{ + ID: ists[k].ID, + Approver: UserInfo{ + ID: ists[k].Approver, + LoginName: loginName, + Name: name, + }, + Remark: ists[k].Remark, + Title: ists[k].Title, + NextApprover: UserInfo{ + ID: nexter, + LoginName: nloginName, + Name: nname, + }, + Hooks: ists[k].Hooks, + } + if ists[k].StartTime != nil { + asgbir.StartTime = times.ISOTime(*ists[k].StartTime) + } + if ists[k].EndTime != nil { + asgbir.EndTime = times.ISOTime(*ists[k].EndTime) + } + if ists[k].Action != nil { + asgbir.Action = *ists[k].Action + } + + agbir.Steps = append(agbir.Steps, asgbir) + } + return agbir, nil +} + +//ApproveReq 审批的请求参数 +type ApproveReq struct { + Action string `json:"action"` //reject|agree + Remark string `json:"remark"` + CurrentUser *model.CurrentUser `json:"-"` + ApprovalID uint `json:"approval_id"` + StepID uint `json:"approval_step_id"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *ApproveReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.Action: "action", + &reqData.Remark: "remark", + &reqData.ApprovalID: "approval_id", + &reqData.StepID: "approval_step_id", + } +} + +// Validate 结构体数据校验 +func (reqData *ApproveReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + + approval, err := repo.GetApprovalByID(reqData.ApprovalID) + if err == gorm.ErrRecordNotFound { + errs.Add([]string{"approval"}, binding.RequiredError, "申请单不存在") + return errs + } + if approval.Status != model.ApprovalStatusApproval { + errs.Add([]string{"approval"}, binding.BusinessError, "申请单已完成/撤销") + return errs + } + if reqData.Action == "" { + errs.Add([]string{"approval"}, binding.RequiredError, "审批动作值为空") + return errs + } + if reqData.Action != model.ApprovalActionAgree && reqData.Action != model.ApprovalActionReject { + errs.Add([]string{"approval"}, binding.BusinessError, "审批动作值非法") + return errs + } + step, err := repo.GetApprovalStepByID(reqData.StepID) + if err == gorm.ErrRecordNotFound { + errs.Add([]string{"approval_step"}, binding.RequiredError, "审批步骤不存在") + return errs + } + if step.Approver != reqData.CurrentUser.ID { + errs.Add([]string{"approval_step"}, binding.BusinessError, + fmt.Sprintf("当前用户(%s)不是该步骤审批人(%s)", reqData.CurrentUser.LoginName, step.Approver)) + return errs + } + return nil +} + +// Approve 审批 +func Approve(log logger.Logger, repo model.Repo, conf *config.Config, lim limiter.Limiter, reqData *ApproveReq) error { + now := time.Now() + mod := model.ApprovalStep{ + ID: reqData.StepID, + Action: &reqData.Action, + ApprovalID: reqData.ApprovalID, + Remark: reqData.Remark, + EndTime: &now, + } + _, err := repo.UpdateApprovalStep(&mod) + if err != nil { + log.Error("update approval step fail", err.Error()) + return err + } + //若当前审批步骤结果为agree + //将下一步的start_time设置为当前时间。若当前已经是最后一个审批步骤,则结束整个审批单。 + //调用hooks + if reqData.Action == model.ApprovalActionAgree { + //获取下一个步骤 + steps, err := repo.GetApprovalStepByApprovalID(reqData.ApprovalID) + if err != nil { + log.Errorf("get steps by approval_id:%d fail:%s", reqData.ApprovalID, err.Error()) + return err + } + for i, step := range steps { + if step.ID == reqData.StepID { + //如果已经是最后一个 + if i == len(steps)-1 { + approval := model.Approval{ + ID: reqData.ApprovalID, + EndTime: &now, + IsRejected: model.NO, + Status: model.ApprovalStatusCompleted, + } + _, err := repo.UpdateApproval(&approval) + if err != nil { + log.Errorf("update by approval_id:%d fail:%s", reqData.ApprovalID, err.Error()) + return err + } + } else { + //下一个步骤 + mod := model.ApprovalStep{ + ID: steps[i+1].ID, + StartTime: &now, + } + _, err := repo.UpdateApprovalStep(&mod) + if err != nil { + log.Errorf("update next approval step id:%d fail,%s", steps[i+1].ID, err.Error()) + return err + } + } + //hooks + if step.Hooks != "" { + //获取审批单的传入参数 + approval, err := repo.GetApprovalByID(step.ApprovalID) + if err != nil { + log.Error("get approval metadata fail", err.Error()) + return err + } + //执行调用钩子方法 + hooks := make([]*model.StepHook, 0) + err = json.Unmarshal([]byte(step.Hooks), &hooks) + if err != nil { + log.Errorf("unmarshal hooks err:%s", err.Error()) + return err + } + for _, hook := range hooks { + isRecycleOSReinstall := false + switch hook.ID { + case model.HookDevPowerOff: + var sns []string + if err = json.Unmarshal([]byte(approval.Metadata), &sns); err != nil { + log.Errorf("unmarshal metadata err:%s", err.Error()) + return err + } + if _, err = BatchOperateOOBPower(log, repo, PowerOff, conf, false, sns); err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%v", sns), + TargetType: "power off device", + ExecResult: "failure", + }) + log.Error("power off device (sns:%v) fail", sns) + } + // 变更记录 + for i := range sns { + devLog := model.ChangeLog { + OperationUser: reqData.CurrentUser.Name, + OperationType: model.OperationTypePowerControl, + OperationDetail: fmt.Sprintf("物理机关电(SN: %v)", sns[i]), + OperationTime: times.ISOTime(time.Now()).ToTimeStr(), + } + adll := &AppendDeviceLifecycleLogReq{ + SN: sns[i], + LifecycleLog: devLog, + } + if err = AppendDeviceLifecycleLogBySN(log, repo, adll);err != nil { + log.Error("LifecycleLog: append device lifecycle log (sn:%v) fail(%s)", sns[i], err.Error()) + } + } + case model.HookDevRestart: + var sns []string + if err = json.Unmarshal([]byte(approval.Metadata), &sns); err != nil { + log.Errorf("unmarshal metadata err:%s", err.Error()) + return err + } + if _, err = BatchOperateOOBPower(log, repo, PowerRestart, conf, false, sns); err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%v", sns), + TargetType: "power restart device", + ExecResult: "failure", + }) + log.Error("power restart device (sns:%v) fail", sns) + //return ? + } + // 变更记录 + for i := range sns { + devLog := model.ChangeLog { + OperationUser: reqData.CurrentUser.Name, + OperationType: model.OperationTypePowerControl, + OperationDetail: fmt.Sprintf("物理机重启(SN: %v)", sns[i]), + OperationTime: times.ISOTime(time.Now()).ToTimeStr(), + } + adll := &AppendDeviceLifecycleLogReq{ + SN: sns[i], + LifecycleLog: devLog, + } + if err = AppendDeviceLifecycleLogBySN(log, repo, adll);err != nil { + log.Error("LifecycleLog: append device lifecycle log (sn:%v) fail(%s)", sns[i], err.Error()) + } + } + case model.HookIPUnassign: + var ids []uint + if err = json.Unmarshal([]byte(approval.Metadata), &ids); err != nil { + log.Errorf("unmarshal metadata err:%s", err.Error()) + return err + } + for _, id := range ids { + ip, _ := repo.GetIPByID(id) + if ip.SN != "" { + ipn, err := repo.GetIPNetworkByID(ip.IPNetworkID) + if err != nil && err != gorm.ErrRecordNotFound { + log.Errorf("get ipnetwork of ip:%s fail,%v", ip.IP, err) + return err + } + ds, err := repo.GetDeviceSettingBySN(ip.SN) + if err != nil && err != gorm.ErrRecordNotFound { + log.Errorf("get device setting of sn:%s fail,%v", ip.SN, err) + } else if ds != nil { + ds.SN = ip.SN + if ipn.Version == model.IPv4 { + if ip.Scope != nil && *ip.Scope == model.IPScopeIntranet { + ds.IntranetIP = removeIP(ds.IntranetIP, ip.IP) + } + if ip.Scope != nil && *ip.Scope == model.IPScopeExtranet { + ds.ExtranetIP = removeIP(ds.ExtranetIP, ip.IP) + } + } else if ipn.Version == model.IPv6 { + if ip.Scope != nil && *ip.Scope == model.IPScopeIntranet { + ds.IntranetIPv6 = removeIP(ds.IntranetIPv6, ip.IP) + } + if ip.Scope != nil && *ip.Scope == model.IPScopeExtranet { + ds.ExtranetIPv6 = removeIP(ds.ExtranetIPv6, ip.IP) + } + } + err = repo.SaveDeviceSetting(ds) + if err != nil { + log.Error(err) + return err + } + // 变更记录 + devLog := model.ChangeLog { + OperationUser: reqData.CurrentUser.Name, + OperationType: model.OperationTypeUpdate, + OperationDetail: fmt.Sprintf("物理机IP回收(SN: %v, IP: %v)", ip.SN, ip.IP), + OperationTime: times.ISOTime(time.Now()).ToTimeStr(), + } + adll := &AppendDeviceLifecycleLogReq{ + SN: ip.SN, + LifecycleLog: devLog, + } + if err = AppendDeviceLifecycleLogBySN(log, repo, adll);err != nil { + log.Error("LifecycleLog: append device lifecycle log (sn:%v) fail(%s)", ip.SN, err.Error()) + } + } + } + if err = repo.UnassignIP(id); err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%v", ids), + TargetType: "unssign ip", + ExecResult: "failure", + }) + log.Error("unssign ip (id:%v) fail", ids) + //return ? + } + } + case model.HookNetAreaOffline: + var ids []uint + if err = json.Unmarshal([]byte(approval.Metadata), &ids); err != nil { + log.Errorf("unmarshal metadata err:%s", err.Error()) + return err + } + if _, err = repo.UpdateNetworkAreaStatus(model.NetworkAreaStatOffline, ids...); err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%v", ids), + TargetType: "network-area", + ExecResult: "failure", + }) + log.Error("offline network-area (id:%v) fail", ids) + //return ? + } + case model.HookServerRoomAbolish: + var ids []uint + if err = json.Unmarshal([]byte(approval.Metadata), &ids); err != nil { + log.Errorf("unmarshal metadata err:%s", err.Error()) + return err + } + if _, err = repo.UpdateServerRoomStatus(model.RoomStatAbolished, ids...); err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%v", ids), + TargetType: "server-room", + ExecResult: "failure", + }) + log.Error("abolish server-room (id:%v) fail", ids) + //return ? + } + case model.HookIDCAbolish: + var ids []uint + if err = json.Unmarshal([]byte(approval.Metadata), &ids); err != nil { + log.Errorf("unmarshal metadata err:%s", err.Error()) + return err + } + if _, err = repo.UpdateIDCStatus(model.IDCStatAbolished, ids...); err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%v", ids), + TargetType: "idc", + ExecResult: "failure", + }) + log.Error("abolish idc (id:%v) fail", ids) + //return ? + } + case model.HookCabinetPowerOff: + var cabinetIDs []uint + if err = json.Unmarshal([]byte(approval.Metadata), &cabinetIDs); err != nil { + log.Errorf("unmarshal metadata err:%s", err.Error()) + return err + } + for _, id := range cabinetIDs { + if _, err = repo.PowerOffServerCabinetByID(id); err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%d", id), + TargetType: "cabinet", + ExecResult: "failure", + }) + log.Error("power off cabinet(id=%d) fail", id) + //return ? + } + + } + case model.HookCabinetOffline: + var cabinetIDs []uint + if err = json.Unmarshal([]byte(approval.Metadata), &cabinetIDs); err != nil { + log.Errorf("unmarshal metadata err:%s", err.Error()) + return err + } + if _, err = repo.UpdateServerCabinetStatus(cabinetIDs, model.CabinetStatOffline); err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%v", cabinetIDs), + TargetType: "cabinet", + ExecResult: "failure", + }) + log.Error("offline cabinet(ids=%v) fail", cabinetIDs) + //return ? + } + case model.HookDeviceMigrationPowerOff: + var data []*SubmitDeviceMigrationApprovalReqData + if err = json.Unmarshal([]byte(approval.Metadata), &data); err != nil { + log.Errorf("unmarshal metadata err:%s", err.Error()) + return err + } + for _, dev := range data { + if dev.MigType != model.MigTypeStore2Usite && dev.MigType != model.MigTypeStore2Store { + if _, err = OperateOOBPower(log, repo, dev.SN, conf.Crypto.Key, conf.Server.OOBDomain, + PowerOff, false); err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%s", dev.SN), + TargetType: "device", + ExecResult: "failure", + }) + log.Error("power off device(sn=%s) fail", dev.SN) + } + } + //将运营状态更新为搬迁中 + if _, err = repo.UpdateDeviceBySN(&model.Device{ + SN: dev.SN, + OperationStatus: model.DevOperStatMoving, + }); err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%s", dev.SN), + TargetType: "device", + ExecResult: "failure", + }) + log.Error("update device(sn=%s) status pre_deploy fail", dev.SN) + } + } + case model.HookDeviceMigrationReleaseIP: + var data []*SubmitDeviceMigrationApprovalReqData + if err = json.Unmarshal([]byte(approval.Metadata), &data); err != nil { + log.Errorf("unmarshal metadata err:%s", err.Error()) + return err + } + for _, dev := range data { + if dev.MigType != model.MigTypeStore2Usite && dev.MigType != model.MigTypeStore2Store { + //释放IP资源 + if _, err = repo.ReleaseIP(dev.SN, model.Intranet); err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%s", dev.SN), + TargetType: "device", + ExecResult: "failure", + }) + log.Error("device(sn=%s) release ip fail", dev.SN) + } + //外网IP不一定有 + _, _ = repo.ReleaseIP(dev.SN, model.Extranet) + + //同时删除装机记录 + if _, err := repo.DeleteDeviceSettingBySN(dev.SN); err != nil { + log.Error("device(sn=%s) clear device setting fail", dev.SN) + } + } + } + case model.HookDeviceMigrationReserveIP: + var data []*SubmitDeviceMigrationApprovalReqData + if err = json.Unmarshal([]byte(approval.Metadata), &data); err != nil { + log.Errorf("unmarshal metadata err:%s", err.Error()) + return err + } + //保留IP资源,保留期根据config文件配置,0则不保留 + reserveDay := conf.IP.ReserveDay + for _, dev := range data { + if dev.MigType != model.MigTypeStore2Usite && dev.MigType != model.MigTypeStore2Store { + if reserveDay <= 0 { + //释放IP资源 + if _, err = repo.ReleaseIP(dev.SN, model.Intranet); err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%s", dev.SN), + TargetType: "device", + ExecResult: "failure", + }) + log.Error("device(sn=%s) release ip fail", dev.SN) + } + //外网IP不一定有 + _, _ = repo.ReleaseIP(dev.SN, model.Extranet) + + //同时删除装机记录 + if _, err := repo.DeleteDeviceSettingBySN(dev.SN); err != nil { + log.Error("device(sn=%s) clear device setting fail", dev.SN) + } + } + if reserveDay > 0 { + releaseDate := now.AddDate(0, 0, reserveDay) + if _, err = repo.ReserveIP(dev.SN, model.Intranet, releaseDate); err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%s", dev.SN), + TargetType: "device", + ExecResult: "failure", + }) + log.Error("device(sn=%s) reserve ip fail", dev.SN) + } + //外网IP不一定有 + _, _ = repo.ReserveIP(dev.SN, model.Extranet, releaseDate) + + //同时删除装机记录 + if _, err := repo.DeleteDeviceSettingBySN(dev.SN); err != nil { + log.Error("device(sn=%s) clear device setting fail", dev.SN) + } + } + } + } + case model.HookDeviceMigration: + var data []*SubmitDeviceMigrationApprovalReqData + if err = json.Unmarshal([]byte(approval.Metadata), &data); err != nil { + log.Errorf("unmarshal metadata err:%s", err.Error()) + return err + } + var dstUsiteIDs []uint + //存储需释放的机位 + var usiteFreeIDs []uint + var usiteDisabledIDs []uint + + for _, dev := range data { + //获取原机位并标记为空闲 + oriDev, err := repo.GetDeviceBySN(dev.SN) + if err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%s", dev.SN), + TargetType: "device", + ExecResult: "failure", + }) + log.Error("get origin device(sn=%s) usite fail", dev.SN) + } + // 变更记录 + optDetail, err := convert2DetailOfOperationTypeMove(repo, dev) + if err != nil { + log.Errorf("Fail to convert Detail of OperationTypeMove: %v", err) + } + devLog := model.ChangeLog { + OperationUser: reqData.CurrentUser.Name, + OperationType: model.OperationTypeMove, + OperationDetail: optDetail, + OperationTime: times.ISOTime(time.Now()).ToTimeStr(), + } + adll := &AppendDeviceLifecycleLogReq{ + SN: dev.SN, + LifecycleLog: devLog, + } + if err = AppendDeviceLifecycleLogBySN(log, repo, adll);err != nil { + log.Error("LifecycleLog: append device lifecycle log (sn:%v) fail(%s)", dev.SN, err.Error()) + } + // 搬迁类型细分 + switch dev.MigType { + case model.MigTypeUsite2Usite: + dstUsiteIDs = append(dstUsiteIDs, dev.DstUSiteID) + //获取原机位并标记为空闲 或 不可用 + if oriDev.USiteID != nil { + if cabinet, err := repo.GetServerCabinetByID(oriDev.CabinetID); err == nil { + // 若上层机架为[已锁定],则对应机位不可释放 + if cabinet.Status == model.CabinetStatLocked { + usiteDisabledIDs = append(usiteDisabledIDs, *oriDev.USiteID) + } else { + usiteFreeIDs = append(usiteFreeIDs, *oriDev.USiteID) + } + } + } + + //将物理机状态更新为[待部署] + if _, err = repo.UpdateDeviceBySN(&model.Device{ + SN: dev.SN, + IDCID: dev.DstIDCID, + ServerRoomID: dev.DstServerRoomID, + CabinetID: dev.DstCabinetID, + USiteID: &dev.DstUSiteID, + OperationStatus: model.DevOperStatPreDeploy, + }); err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%s", dev.SN), + TargetType: "device", + ExecResult: "failure", + }) + log.Error("update device(sn=%s) status pre_deploy fail", dev.SN) + } + case model.MigTypeUsite2Store: + //获取原机位并标记为空闲 或 不可用 + if oriDev.USiteID != nil { + if cabinet, err := repo.GetServerCabinetByID(oriDev.CabinetID); err == nil { + // 若上层机架为[已锁定],则对应机位不可释放 + if cabinet.Status == model.CabinetStatLocked { + usiteDisabledIDs = append(usiteDisabledIDs, *oriDev.USiteID) + } else { + usiteFreeIDs = append(usiteFreeIDs, *oriDev.USiteID) + } + } + } + + //将物理机状态更新为[待部署] + oriDev.IDCID = dev.DstIDCID + oriDev.ServerRoomID = 0 + oriDev.CabinetID = 0 + oriDev.USiteID = nil //&zero + oriDev.StoreRoomID = dev.DstStoreRoomID + oriDev.VCabinetID = dev.DstVCabinetID + oriDev.OperationStatus = model.DevOperStatInStore + if _, err = repo.SaveDevice(oriDev); err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%s", dev.SN), + TargetType: "device", + ExecResult: "failure", + }) + log.Error("update device(sn=%s) status pre_deploy fail", dev.SN) + } + case model.MigTypeStore2Usite: + //占用目标机位 + dstUsiteIDs = append(dstUsiteIDs, dev.DstUSiteID) + + //将物理机状态更新为[待部署] + oriDev.IDCID = dev.DstIDCID + oriDev.ServerRoomID = dev.DstServerRoomID + oriDev.CabinetID = dev.DstCabinetID + oriDev.USiteID = &dev.DstUSiteID + oriDev.StoreRoomID = 0 + oriDev.VCabinetID = 0 + now := time.Now() + oriDev.StartedAt = now + oriDev.OnShelveAt = now + oriDev.OperationStatus = model.DevOperStatPreDeploy + if _, err = repo.SaveDevice(oriDev); err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%s", dev.SN), + TargetType: "device", + ExecResult: "failure", + }) + log.Error("update device(sn=%s) status pre_deploy fail", dev.SN) + } + case model.MigTypeStore2Store: + //只修改这仨 + oriDev.IDCID = dev.DstIDCID + oriDev.StoreRoomID = dev.DstStoreRoomID + oriDev.VCabinetID = dev.DstVCabinetID + if _, err = repo.UpdateDeviceBySN(oriDev); err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%s", dev.SN), + TargetType: "device", + ExecResult: "failure", + }) + log.Error("update device(sn=%s) status pre_deploy fail", dev.SN) + } + } + } + //将目标机位标记为[已占用] + if _, err = repo.BatchUpdateServerUSitesStatus(dstUsiteIDs, model.USiteStatUsed); err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%v", dstUsiteIDs), + TargetType: "device", + ExecResult: "failure", + }) + log.Error("occupy usites(ids=%v) fail", dstUsiteIDs) + } + //将原机位标记为空闲 + if _, err = repo.BatchUpdateServerUSitesStatus(usiteFreeIDs, model.USiteStatFree); err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%v", usiteFreeIDs), + TargetType: "device", + ExecResult: "failure", + }) + log.Error("free usites(ids=%v) fail", usiteFreeIDs) + } + //将原机位标记为不可用 + if _, err = repo.BatchUpdateServerUSitesStatus(usiteDisabledIDs, model.USiteStatDisabled); err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%v", usiteDisabledIDs), + TargetType: "device", + ExecResult: "failure", + }) + log.Error("disable usites(ids=%v) fail", usiteDisabledIDs) + } + + case model.HookDeviceRetirementPowerOff: + var SNs []string + if err = json.Unmarshal([]byte(approval.Metadata), &SNs); err != nil { + log.Errorf("unmarshal metadata err:%s", err.Error()) + return err + } + for _, sn := range SNs { + if _, err = OperateOOBPower(log, repo, sn, conf.Crypto.Key, conf.Server.OOBDomain, + PowerOff, false); err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%s", sn), + TargetType: "device", + ExecResult: "failure", + }) + log.Error("power off device(sn=%s) fail", sn) + } + } + case model.HookDeviceRetirementReleaseIP: + var SNs []string + if err = json.Unmarshal([]byte(approval.Metadata), &SNs); err != nil { + log.Errorf("unmarshal metadata err:%s", err.Error()) + return err + } + for _, sn := range SNs { + //释放IP资源 + if _, err = repo.ReleaseIP(sn, model.Intranet); err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%s", sn), + TargetType: "device", + ExecResult: "failure", + }) + log.Error("device(sn=%s) release ip fail", sn) + } + //外网IP不一定有 + _, _ = repo.ReleaseIP(sn, model.Extranet) + _, _ = repo.ReleaseIPv6(sn, model.IPScopeIntranet) + _, _ = repo.ReleaseIPv6(sn, model.IPScopeExtranet) + //同时删除装机记录 + if _, err := repo.DeleteDeviceSettingBySN(sn); err != nil { + log.Error("device(sn=%s) clear device setting fail", sn) + } + } + case model.HookDeviceRetirementReserveIP: + var SNs []string + if err = json.Unmarshal([]byte(approval.Metadata), &SNs); err != nil { + log.Errorf("unmarshal metadata err:%s", err.Error()) + return err + } + //保留IP资源,保留期根据config文件配置,0则不保留 + reserveDay := conf.IP.ReserveDay + for _, sn := range SNs { + if reserveDay <= 0{ + if _, err = repo.ReleaseIP(sn, model.Intranet); err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%s", sn), + TargetType: "device", + ExecResult: "failure", + }) + log.Error("device(sn=%s) release ip fail", sn) + } + //外网IP不一定有 + _, _ = repo.ReleaseIP(sn, model.Extranet) + _, _ = repo.ReleaseIPv6(sn, model.IPScopeIntranet) + _, _ = repo.ReleaseIPv6(sn, model.IPScopeExtranet) + //同时删除装机记录 + if _, err := repo.DeleteDeviceSettingBySN(sn); err != nil { + log.Error("device(sn=%s) clear device setting fail", sn) + } + } + if reserveDay > 0 { + releaseDate := now.AddDate(0, 0, reserveDay) + if _, err = repo.ReserveIP(sn, model.Intranet, releaseDate); err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%s", sn), + TargetType: "device", + ExecResult: "failure", + }) + log.Error("device(sn=%s) release ip fail", sn) + } + //外网IP不一定有 + _, _ = repo.ReserveIP(sn, model.Extranet, releaseDate) + //同时删除装机记录 + if _, err := repo.DeleteDeviceSettingBySN(sn); err != nil { + log.Error("device(sn=%s) clear device setting fail", sn) + } + } + } + case model.HookDeviceRetirement: + //修改运营状态,同时释放机位资源 + var SNs []string + if err = json.Unmarshal([]byte(approval.Metadata), &SNs); err != nil { + log.Errorf("unmarshal metadata err:%s", err.Error()) + return err + } + //var usiteIDs []uint + //存储需释放的机位 + var usiteFreeIDs []uint + var usiteDisabledIDs []uint + for _, sn := range SNs { + dev, err := repo.GetDeviceBySN(sn) + if err != nil { + log.Errorf("get device by sn:%s fail, %s", sn, err.Error()) + continue + } + if dev != nil && dev.USiteID != nil { + //usiteIDs = append(usiteIDs, *dev.USiteID) + if cabinet, err := repo.GetServerCabinetByID(dev.CabinetID); err == nil { + // 若上层机架为[已锁定],则对应机位不可释放 + if cabinet.Status == model.CabinetStatLocked { + usiteDisabledIDs = append(usiteDisabledIDs, *dev.USiteID) + } else { + usiteFreeIDs = append(usiteFreeIDs, *dev.USiteID) + } + } + } + // 变更记录 + optDetail, err := convert2DetailOfOperationTypeRetire(repo, dev) + if err != nil { + log.Errorf("Fail to convert Detail of OperationTypeRetire: %v", err) + } + devLog := model.ChangeLog { + OperationUser: reqData.CurrentUser.Name, + OperationType: model.OperationTypeRetire, + OperationDetail: optDetail, + OperationTime: times.ISOTime(time.Now()).ToTimeStr(), + } + adll := &AppendDeviceLifecycleLogReq{ + SN: dev.SN, + LifecycleLog: devLog, + } + if err = AppendDeviceLifecycleLogBySN(log, repo, adll);err != nil { + log.Error("LifecycleLog: append device lifecycle log (sn:%v) fail(%s)", dev.SN, err.Error()) + } + // 释放机位并修改状态 + dev.USiteID = nil + dev.PowerStatus = model.PowerStatusOff + dev.OperationStatus = model.DevOperStateRetired + if _, err := repo.SaveDevice(dev); err != nil { + log.Error(err) + //usiteIDs = append(usiteIDs, *dev.USiteID) + } + // 记录设备退役日期 + saveDevLifecycleReq := &SaveDeviceLifecycleReq { + DeviceLifecycleBase: DeviceLifecycleBase{ + DeviceRetiredDate: time.Now(), + }, + } + // DeviceLifecycle 查询是否已经存在 + devLifecycle, err := repo.GetDeviceLifecycleBySN(dev.SN) + if err != nil && err != gorm.ErrRecordNotFound { + log.Error(err) + } + if devLifecycle != nil { + saveDevLifecycleReq.ID = devLifecycle.ID + // 保存或更新 DeviceLifecycle + if err = SaveDeviceLifecycle(log, repo, saveDevLifecycleReq); err != nil { + log.Error(err) + } + } + } + if _, err = repo.BatchUpdateServerUSitesStatus(usiteFreeIDs, model.USiteStatFree); err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%v", usiteFreeIDs), + TargetType: "device", + ExecResult: "failure", + }) + log.Error("free usites(ids=%v) fail", usiteFreeIDs) + } + if _, err = repo.BatchUpdateServerUSitesStatus(usiteDisabledIDs, model.USiteStatDisabled); err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%v", usiteDisabledIDs), + TargetType: "device", + ExecResult: "failure", + }) + log.Error("free usites(ids=%v) fail", usiteDisabledIDs) + } + case model.HookDeviceRecyclePreRetire: + var SNs []string + if err = json.Unmarshal([]byte(approval.Metadata), &SNs); err != nil { + log.Errorf("unmarshal metadata err:%s", err.Error()) + return err + } + for _, sn := range SNs { + // 变更记录 + optDetail, err := convert2DetailOfOperationTypeUpdate(repo, model.Device{ + SN: sn, OperationStatus: model.DevOperStatPreRetire, + }) + if err != nil { + log.Errorf("Fail to convert Detail of OperationTypeUpdate: %v", err) + } + devLog := model.ChangeLog { + OperationUser: reqData.CurrentUser.Name, + OperationType: model.OperationTypeUpdate, + OperationDetail: optDetail, + OperationTime: times.ISOTime(time.Now()).ToTimeStr(), + } + adll := &AppendDeviceLifecycleLogReq{ + SN: sn, + LifecycleLog: devLog, + } + if err = AppendDeviceLifecycleLogBySN(log, repo, adll);err != nil { + log.Error("LifecycleLog: append device lifecycle log (sn:%v) fail(%s)", sn, err.Error()) + } + if _, err := repo.UpdateDeviceBySN(&model.Device{ + SN: sn, OperationStatus: model.DevOperStatPreRetire, + }); err != nil { + log.Errorf("recycle device sn:%s fail, %s", sn, err.Error()) + } + } + case model.HookDeviceRecyclePreMove: + var SNs []string + if err = json.Unmarshal([]byte(approval.Metadata), &SNs); err != nil { + log.Errorf("unmarshal metadata err:%s", err.Error()) + return err + } + for _, sn := range SNs { + // 变更记录 + optDetail, err := convert2DetailOfOperationTypeUpdate(repo, model.Device{ + SN: sn, OperationStatus: model.DevOperStatPreMove, + }) + if err != nil { + log.Errorf("Fail to convert Detail of OperationTypeUpdate: %v", err) + } + devLog := model.ChangeLog { + OperationUser: reqData.CurrentUser.Name, + OperationType: model.OperationTypeUpdate, + OperationDetail: optDetail, + OperationTime: times.ISOTime(time.Now()).ToTimeStr(), + } + adll := &AppendDeviceLifecycleLogReq{ + SN: sn, + LifecycleLog: devLog, + } + if err = AppendDeviceLifecycleLogBySN(log, repo, adll);err != nil { + log.Error("LifecycleLog: append device lifecycle log (sn:%v) fail(%s)", sn, err.Error()) + } + if _, err := repo.UpdateDeviceBySN(&model.Device{ + SN: sn, OperationStatus: model.DevOperStatPreMove, + }); err != nil { + log.Errorf("recycle device sn:%s fail, %s", sn, err.Error()) + } + } + case model.HookDeviceRecycleReinstall: + isRecycleOSReinstall = true + fallthrough + case model.HookDeviceOSReinstallation: + var settingsExt OSReinstallSetting = make([]*OSReinstallSettingItem, 0) + if err = json.Unmarshal([]byte(approval.Metadata), &settingsExt); err != nil { + log.Errorf("unmarshal metadata err:%s", err.Error()) + return err + } + var settings DeviceSettings = make([]*SaveDeviceSettingItem, 0, len(settingsExt)) + for _, s := range settingsExt { + settings = append(settings, &s.SaveDeviceSettingItem) + } + saveReq := SaveDeviceSettingsReq{ + Settings: settings, + CurrentUser: reqData.CurrentUser, + } + succeed, err := SaveDeviceSettings(log, repo, conf, lim, &saveReq) + if err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%v", settings), + TargetType: "device", + ExecResult: "failure", + }) + log.Error("save device settings(params=%v) fail", settings) + } + if len(succeed) != len(settings) { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%v", settings), + TargetType: "device", + ExecResult: "failure", + }) + log.Error("save device settings(params=%v) partly fail", settings) + } + + // 更新设备状态 + + for k := range settingsExt { + mod := &model.Device{ + SN: settingsExt[k].SN, + OperationStatus: model.DevOperStatReinstalling, + } + // 这里实现不太好,但目前没想到比较好的方式, + // 重装需要将运行状态改回初始的运行状态,而回收重装成功后统一成已上架 + // 所以这里用remark字段标记,初始的状态 + if isRecycleOSReinstall == false { + mod.Remark = settingsExt[k].OriginStatus + } + _, err = repo.UpdateDeviceBySN(mod) + if err != nil { + hook.Results = append(hook.Results, &model.StepHookResult{ + TargetID: fmt.Sprintf("%v", settingsExt[k]), + TargetType: "device", + ExecResult: "failure", + }) + log.Error("update device status (params=%v)fail", settings[k]) + } + } + } + if hook.ContinueOnError == false && len(hook.Results) != 0 { + break + } + } + } + break + } + } + + } else if reqData.Action == model.ApprovalActionReject { //若当前审批步骤结果为reject,则结束整个审批单。 + //获取审批单的传入参数 + oriApproval, err := repo.GetApprovalByID(reqData.ApprovalID) + if err != nil { + log.Error("get approval metadata fail", err.Error()) + return err + } + //如果是搬迁的审批,需要释放预占用的机位 + if oriApproval.Type == model.ApprovalTypeDeviceMigration { + var data []*SubmitDeviceMigrationApprovalReqData + if err = json.Unmarshal([]byte(oriApproval.Metadata), &data); err != nil { + log.Errorf("unmarshal metadata err:%s", err.Error()) + return err + } + var dstUsiteIDs []uint + for _, dev := range data { + dstUsiteIDs = append(dstUsiteIDs, dev.DstUSiteID) + //将运营状态更新为待搬迁 + if _, err = repo.UpdateDeviceBySN(&model.Device{ + SN: dev.SN, + OperationStatus: model.DevOperStatPreMove, + }); err != nil { + log.Error("update device(sn=%s) status pre_deploy failed when resuming DeviceMigrationApprovalReq", dev.SN) + } + } + //将目标机位(预占用)恢复为空闲 + if _, err = repo.BatchUpdateServerUSitesStatus(dstUsiteIDs, model.USiteStatFree); err != nil { + log.Error("free usites(ids=%v) failed when resuming DeviceMigrationApprovalReq", dstUsiteIDs) + } + } + approval := model.Approval{ + ID: reqData.ApprovalID, + EndTime: &now, + IsRejected: model.YES, + Status: model.ApprovalStatusFailure, + } + _, err = repo.UpdateApproval(&approval) + if err != nil { + log.Errorf("update by approval_id:%d fail:%s", reqData.ApprovalID, err.Error()) + return err + } + } + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/component.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/component.go new file mode 100644 index 0000000000000000000000000000000000000000..0deca598d931c02c6c83e6c207561509a5e75650 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/component.go @@ -0,0 +1,57 @@ +package service + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strings" + "time" + + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" +) + +// ComponentLog 组件日志 +type ComponentLog struct { + SN string + Component string + LogData []byte +} + +// SaveComponentLogReq 保存设备组件日志请求结构体 +type SaveComponentLogReq struct { + SN string + Component string + LogData []byte + DataPath string + OriginNode string + OriginNodeIP string +} + +// SaveComponentLog 保存设备组件日志 +func SaveComponentLog(repo model.Repo, log logger.Logger, reqData *SaveComponentLogReq) (err error) { + // 如果为proxy下的机器,则日志存储目录为 rootpath/proxy_ip/log/${SN}/ + if reqData.OriginNodeIP != "" { + reqData.OriginNodeIP = strings.Replace(reqData.OriginNodeIP, ".", "_", -1) + reqData.DataPath = filepath.Join(reqData.DataPath, "proxy_"+reqData.OriginNodeIP) + } + + // 创建目标设备的日志持久化目录 + fp := filepath.Join(reqData.DataPath, "log", reqData.SN) + err = os.MkdirAll(fp, 0755) + if err != nil { + log.Errorf("%s\n", err) + return err + } + + // 日志文件命名格式:${组件名}_${时间戳}.log + filename := fmt.Sprintf("%s_%s.log", reqData.Component, time.Now().Format("200601021504")) + err = ioutil.WriteFile(fp+"/"+filename, reqData.LogData, 0755) + if err != nil { + log.Errorf("%s\n", err) + return err + } + + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/data_dict.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/data_dict.go new file mode 100644 index 0000000000000000000000000000000000000000..855e19f2a1f8f14c947f7fda46ddbf1287a19f6a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/data_dict.go @@ -0,0 +1,100 @@ +package service + +import ( + "net/http" + + "github.com/jinzhu/gorm" + "github.com/voidint/binding" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" +) + +//DataDict 数据字典 +type DataDict struct { + // 主键 + ID uint `json:"id"` + // 类型 + Type string `json:"type"` + // 名称 + Name string `json:"name"` + // 值 + Value string `json:"value"` + // 备注 + Remark string `json:"remark"` +} + +// DelDataDictReq 数据字典请求体 +type DelDataDictReq struct { + ID uint `json:"id"` +} + +// FieldMap 请求字段映射 +func (reqData *DataDict) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.ID: "id", + &reqData.Type: "type", + &reqData.Name: "name", + &reqData.Value: "value", + &reqData.Remark: "remark", + } +} + +// GetDataDict 根据type参数查询筛选数据字典信息 +func GetDataDict(log logger.Logger, repo model.Repo, typ string) ([]*DataDict, error) { + dataDicts, err := repo.GetDataDictsByType(typ) + if err != nil { + log.Error(err.Error()) + } + dataDictResp := make([]*DataDict, 0, len(dataDicts)) + for _, d := range dataDicts { + dataDictResp = append(dataDictResp, &DataDict{ + ID: d.ID, + Type: d.Type, + Name: d.Name, + Value: d.Value, + Remark: d.Remark, + }) + } + return dataDictResp, nil +} + +//AddDataDicts 新增字典 +func AddDataDicts(log logger.Logger, repo model.Repo, dataDicts []*DataDict) error { + mods := make([]*model.DataDict, 0, len(dataDicts)) + for _, d := range dataDicts { + mods = append(mods, &model.DataDict{ + Type: d.Type, + Name: d.Name, + Value: d.Value, + Remark: d.Remark, + }) + } + return repo.AddDataDicts(mods) +} + +//DelDataDicts 删除字典 +func DelDataDicts(log logger.Logger, repo model.Repo, dataDicts []*DelDataDictReq) error { + mods := make([]*model.DataDict, 0, len(dataDicts)) + for _, d := range dataDicts { + mods = append(mods, &model.DataDict{ + Model: gorm.Model{ID: d.ID}, + }) + } + return repo.DelDataDicts(mods) +} + +//UpdateDataDicts 修改字典 +func UpdateDataDicts(log logger.Logger, repo model.Repo, dataDicts []*DataDict) error { + mods := make([]*model.DataDict, 0, len(dataDicts)) + for _, d := range dataDicts { + mods = append(mods, &model.DataDict{ + Model: gorm.Model{ID: d.ID}, + Type: d.Type, + Name: d.Name, + Value: d.Value, + Remark: d.Remark, + }) + } + return repo.UpdateDataDicts(mods) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/device.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/device.go new file mode 100644 index 0000000000000000000000000000000000000000..c3eab1e09020d4f7bc9cfe8f8d1f64fef7bd5d38 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/device.go @@ -0,0 +1,5284 @@ +package service + +import ( + "encoding/json" + "fmt" + "net/http" + "reflect" + "time" + + "github.com/jinzhu/gorm" + "github.com/voidint/binding" + "github.com/voidint/page" + + "strings" + + "os" + + "errors" + + "strconv" + + "idcos.io/cloudboot/config" + "idcos.io/cloudboot/hardware/collector" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/server/cloudbootserver/types/device" + "idcos.io/cloudboot/utils" + "idcos.io/cloudboot/utils/centos6" + "idcos.io/cloudboot/utils/oob" + strings2 "idcos.io/cloudboot/utils/strings" + "idcos.io/cloudboot/utils/times" + "idcos.io/cloudboot/utils/upload" +) + +// ImportPreviewReq 导入参数结构 +type ImportPreviewReq struct { + FileName string `json:"file_name"` + Limit uint `json:"limit"` + Offset uint `json:"offset"` + // 用户登录名 + LoginName string `json:"-"` +} + +type ImportApprovalReq struct { + ImportPreviewReq + //审批人 + Approvers []string `json:"approvers"` // 审批人ID构成的JSON数组字符串 +} + +const commaSep = "," + +//ImportDevicesReq 设备导入Excel表对应字段 +type ImportDevicesReq struct { + //固资编号 + FixedAssetNum string `json:"fixed_asset_number"` + //序列号 + SN string `json:"sn"` + //厂商 + Vendor string `json:"vendor"` + //型号 + Model string `json:"model"` + // CPU架构 + Arch string `json:"arch"` + //用途 'TDSQL','APP','CVM','TGW','NAS','Other' + Usage string `json:"usage"` + //分类 + Category string `json:"category"` + //机房管理单元名称 + ServerRoomName string `json:"server_room_name"` + //机架编号 + CabinetNum string `json:"server_cabinet_number"` + //机位编号 + USiteNum string `json:"server_usite_number"` + //硬件说明 + HardwareRemark string `json:"hardware_remark"` + //RAID说明 + RAIDRemark string `json:"raid_remark"` + // OOB初始用户密码,':'分隔,主要针对的是旧机器导入使用,新机器如果带外是出厂默认,可以缺省 + OOBInit string `json:"oob_init"` + //OriginNodeIP proxy节点IP + //OriginNodeIP string `json:"origin_node_ip"` //废弃 + //启用时间 + StartedAt string `json:"started_at"` + //上架时间 + OnShelveAt string `json:"onshelve_at"` + //关联订单号(非必填) + OrderNumber string `json:"order_number"` + // 数据校验用 + ErrMsgContent string `json:"content"` + //以上是对应Excel导入字段,以下字段是通过名称关联到 + idcID uint //数据中心ID + serverRoomID uint //机房管理单元ID + cabinetID uint //机架ID + uSiteID uint //机位ID +} + +type ImportDevice2StoreReq struct { + //固资编号-可选 + FixedAssetNum string `json:"fixed_asset_number"` + //序列号 + SN string `json:"sn"` + //厂商 + Vendor string `json:"vendor"` + //型号 + Model string `json:"model"` + //用途 + Usage string `json:"usage"` + // 设备类型 + Category string `json:"category"` + //启用时间 + StartedAt string `json:"started_at"` + //上架时间 + OnShelveAt string `json:"onshelve_at"` + // 参考 DeviceLifecycle + AssetBelongs string `json:"asset_belongs"` + Owner string `json:"owner"` + IsRental string `json:"is_rental"` + MaintenanceServiceProvider string `json:"maintenance_service_provider"` + MaintenanceService string `json:"maintenance_service"` + LogisticsService string `json:"logistics_service"` + MaintenanceServiceDateBegin string `json:"maintenance_service_date_begin"` + // 保修期(月数) + MaintenanceMonths int `json:"maintenance_months"` + + //库房管理单元名称 + StoreRoomName string `json:"store_room_name"` + //虚拟货架编号 + VCabinetNum string `json:"virtual_cabinet_number"` + //机位编号 + //USiteNum string `json:"server_usite_number"` + //硬件说明 + HardwareRemark string `json:"hardware_remark"` + //RAID说明 + RAIDRemark string `json:"raid_remark"` + OOBInit string `json:"oob_init"` + //关联订单号(非必填) + OrderNumber string `json:"order_number"` + // 数据校验用 + ErrMsgContent string `json:"content"` + + //以上是对应Excel导入字段,以下字段是通过名称关联到 + idcID uint //数据中心ID + storeRoomID uint //机房管理单元ID + vcabinetID uint //机架ID + //uSiteID uint //机位ID +} + +// ImportStockDevicesReq 导入存量机器结构 +type ImportStockDevicesReq struct { + ImportDevicesReq + //内网IP + IntranetIP string `json:"intranet_ip"` + //外网IP,可以缺省 + ExtranetIP string `json:"extranet_ip"` + //操作系统 + OS string `json:"os"` + //运营状态 + OperationStatus string `json:"operation_status"` +} + +//UpdateDevicesReq 设备导入Excel表对应字段 +type UpdateDevicesReq struct { + //ID + ID uint `json:"id"` + //固资编号 + FixedAssetNum string `json:"fixed_asset_number"` + //序列号 + SN string `json:"sn"` + //带外IP 不支持此处修改 + //OOBIP string `json:"oob_ip"` + //带外用户 不支持此处修改 + //OOBUser string `json:"oob_user"` + //带外密码 不支持此处修改 + //OOBPassword string `json:"oob_password"` + //厂商 + Vendor string `json:"vendor"` + //型号 + Model string `json:"model"` + //用途 'TDSQL','APP','CVM','TGW','NAS','Other' + Usage string `json:"usage"` + //分类 + Category string `json:"category"` + //数据中心ID + IDCID uint `json:"idc_id"` + //机房管理单元ID + ServerRoomID uint `json:"server_room_id"` + //机架ID + CabinetID uint `json:"server_cabinet_id"` + //机位ID + USiteID uint `json:"server_usite_id"` + //StoreRoomID 库房ID + StoreRoomID uint `json:"store_room_id"` + //虚拟货架ID + VCabinetID uint `json:"virtual_cabinet_id"` + //硬件说明 + HardwareRemark string `json:"hardware_remark"` + //RAID说明 + RAIDRemark string `json:"raid_remark"` + //启用时间 + StartedAt string `json:"started_at"` + //上架时间 + OnShelveAt string `json:"onshelve_at"` + //部署状态 + OperationStatus string `json:"operation_status"` + // 用户登录名 + LoginName string `json:"-"` +} + +//UpdateDevicesOperationStatusReq 修改设备部署状态 +type UpdateDevicesOperationStatusReq struct { + //固资编号 + FixedAssetNum string `json:"fixed_asset_number"` + //序列号 + SN string `json:"sn"` + //部署状态 + OperationStatus string `json:"operation_status"` + // 用户登录名 + LoginName string `json:"-"` +} + +//BatchUpdateDevicesReq 修改设备运营状态,用途等 +type BatchUpdateDevicesReq struct { + Devices []DeviceUpdateReq `json:"devices"` + // 用户登录名 + LoginName string `json:"-"` +} + +// 批量修改设备运营状态,用途请求结构 +type DeviceUpdateReq struct { + //固资编号 + FixedAssetNum string `json:"fixed_asset_number"` + //序列号 + SN string `json:"sn"` + //部署状态 + OperationStatus string `json:"operation_status"` + //用途 + Usage string `json:"usage"` + //硬件备注 + HardwareRemark string `json:"hardware_remark"` +} + +//DeleteDevicesReq 删除设备请求体 +type DeleteDevicesReq struct { + IDs []uint `json:"ids"` + SNs []string `json:"sns"` +} + +//DevicePageResp 物理机分页 +type DevicePageResp struct { + ID uint `json:"id"` + //固资编号 + FixedAssetNum string `json:"fixed_asset_number"` + //序列号 + SN string `json:"sn"` + //厂商 + Vendor string `json:"vendor"` + //型号 + Model string `json:"model"` + // 硬件架构 + Arch string `json:"arch"` + //用途 'TDSQL','APP','CVM','TGW','NAS','Other' + Usage string `json:"usage"` + //分类 + Category string `json:"category"` + //数据中心 + IDC *IDCSimplify `json:"idc"` + //机房管理单元 + ServerRoom *ServerRoomSimplify `json:"server_room"` + //物理区域 + //PhysicalArea string `json:"physical_area"` + //机架 + ServerCabinet *ServerCabinetSimplify `json:"server_cabinet"` + //机位 + ServerUSite *ServerUSiteSimplify `json:"server_usite"` + //库房 + StoreRoom *StoreRoomSimplify `json:"store_room"` + //虚拟货架 + VCabinet *VCabinetSimplify `json:"virtual_cabinets"` + //带外IP + OOBIP string `json:"oob_ip"` + //带外用户 + OOBUser string `json:"oob_user"` + //带外密码 + OOBPassword string `json:"oob_password"` + //电源状态 + PowerStatus string `json:"power_status"` + //带外纳管状态 + OOBAccessible string `json:"oob_accessible"` + // TOR + TOR string `json:"tor"` + //硬件说明 + HardwareRemark string `json:"hardware_remark"` + //RAID说明 + RAIDRemark string `json:"raid_remark"` + //启用时间 + StartedAt string `json:"started_at"` + //上架时间 + OnShelveAt string `json:"onshelve_at"` + //运营状态 + OperationStatus string `json:"operation_status"` + //内网IP + IntranetIP string `json:"intranet_ip"` + //外网IP + ExtranetIP string `json:"extranet_ip"` + //内网IPv6 + IntranetIPv6 string `json:"intranet_ipv6"` + //外网IPv6 + ExtranetIPv6 string `json:"extranet_ipv6"` + //操作系统 + OS string `json:"os"` + //OriginNode 代理proxy节点名 + OriginNode string `json:"origin_node"` + //订单编号 + OrderNumber string `json:"order_number"` + //OriginNodeIP proxy代理IP + OriginNodeIP string `json:"origin_node_ip"` + CreatedAt string `json:"created_at"` + UpdatedAt string `json:"updated_at"` +} + +// IDCSimplify 数据中心信息 +type IDCSimplify struct { + //数据中心ID + ID uint `json:"id"` + //数据中心名称 + Name string `json:"name"` +} + +// ServerRoomSimplify 机房管理单元 +type ServerRoomSimplify struct { + //机房管理单元ID + ID uint `json:"id"` + //机房管理单元名称 + Name string `json:"name"` +} + +// StoreRoomSimplify 库房管理单元 +type StoreRoomSimplify struct { + //机房管理单元ID + ID uint `json:"id"` + //机房管理单元名称 + Name string `json:"name"` +} + +// ServerCabinetSimplify 机架 +type ServerCabinetSimplify struct { + //机架ID + ID uint `json:"id"` + //机架编号 + Number string `json:"number"` +} + +// VCabinetSimplify +type VCabinetSimplify struct { + //机架ID + ID uint `json:"id"` + //机架编号 + Number string `json:"number"` +} + +// ServerUSiteSimplify 机位 +type ServerUSiteSimplify struct { + //机位ID + ID uint `json:"id"` + //机位编号 + Number string `json:"number"` + // 物理区域 + PhysicalArea string `json:"physical_area"` +} + +//DevicePageReq 物理机分页列表搜索字段 +type DevicePageReq struct { + ID string + // idc + IDCID string `json:"idc_id"` + ServerRoomID string `json:"server_room_id"` + ServerRoomName string `json:"server_room_name"` + PhysicalArea string `json:"physical_area"` + ServerCabinet string `json:"server_cabinet_number"` + ServerUSiteNumber string `json:"server_usite_number"` + //运营状态 + OperationStatus string `json:"operation_status"` + //用途 'TDSQL','APP','CVM','TGW','NAS','Other' + Usage string `json:"usage"` + //厂商 + Vendor string `json:"vendor"` + //分类 + Category string `json:"category"` + CategoryPreDeploy string `json:"category_pre_deploy"` + //固资编号 + FixedAssetNum string `json:"fixed_asset_number"` + //序列号 + SN string `json:"sn"` + // 内网IP + IntranetIP string `json:"intranet_ip"` + // 外网IP + ExtranetIP string `json:"extranet_ip"` + IP string `json:"ip"` + //型号 + Model string `json:"model"` + // 预部署状态物理机(没有任何安装记录的物理机)。 + PreDeployed bool `json:"pre_deployed"` + // 硬件备注 + HardwareRemark string `json:"hardware_remark"` + OOBAccessible string + Page int64 `json:"-"` + PageSize int64 `json:"-"` +} + +//ExportDevicesReq 物理机分页列表搜索字段 +type ExportDevicesReq struct { + //固资编号 + FixedAssetNum string `json:"fixed_asset_number"` + //序列号 + SN string `json:"sn"` + //厂商 + Vendor string `json:"vendor"` + //型号 + Model string `json:"model"` + //用途 'TDSQL','APP','CVM','TGW','NAS','Other' + Usage string `json:"usage"` + //分类 + Category string `json:"category"` + //运营状态 + OperationStatus string `json:"operation_status"` + //Page int64 + //PageSize int64 +} + +// CombinedDevice 设备信息及设备装机参数联合结构体 +type CombinedDevice struct { + DevicePageResp DevicePageResp `json:"device_page_resp"` + DeployStatus string `json:"deploy_status"` + InstallProgress float64 `json:"install_progress"` + BootOSIP string `json:"bootos_ip"` + BootOSMac string `json:"bootos_mac"` + CPU collector.CPU `json:"cpu"` + Memory collector.Memory `json:"memory"` + LogicDisk collector.Disk `json:"disk"` + PhysicalDrive collector.DiskSlot `json:"disk_slot"` + NIC collector.NIC `json:"nic"` + Motherboard collector.Motherboard `json:"motherboard"` + RAID collector.RAID `json:"raid"` + OOB collector.OOB `json:"oob"` + BIOS collector.BIOS `json:"bios"` + Fan collector.Fan `json:"fan"` + Power collector.Power `json:"power"` + HBA collector.HBA `json:"hba"` + PCI collector.PCI `json:"pci"` + LLDP collector.LLDP `json:"lldp"` + PowerSupplyNum int `json:"power_supply_num"` + Remark string `json:"remark"` + IntranetIP string `json:"intranet_ip"` + ExtranetIP string `json:"extranet_ip"` + IntranetIPv6 string `json:"intranet_ipv6"` + ExtranetIPv6 string `json:"extranet_ipv6"` + OS string `json:"os"` + ImageTemplate ImageTemplateSimplify `json:"image_tpl"` + HardwareTemplate HardwareTemplateSimplify `json:"hardware_tpl"` + Hostname string `json:"hostname"` + Inspection InspectionSimplify `json:"hardware_inspection"` + DeviceLifecycleDetailPage DeviceLifecycleDetailPage `json:"device_lifecycle_detail_page"` +} + +//ImageTemplateSimplify 系统镜像模板 +type ImageTemplateSimplify struct { + ID int `json:"id"` + Name string `json:"name"` +} + +//HardwareTemplateSimplify 硬件配置模板(RAID,OOB) +type HardwareTemplateSimplify struct { + ID int `json:"id"` + Name string `json:"name"` +} + +//InspectionSimplify 巡检 +type InspectionSimplify struct { + RunStatus string `json:"run_status"` + Result string `json:"result"` + Remark string `json:"remark"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *ImportPreviewReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.Limit: "limit", + &reqData.Offset: "offset", + &reqData.FileName: "file_name", + } +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *DeleteDevicesReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDs: "ids", + &reqData.SNs: "sns", + } +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *BatchUpdateDevicesReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.Devices: "devices", + } +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *DevicePageReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.ID: "id", + &reqData.IDCID: "idc_id", + &reqData.ServerRoomID: "server_room_id", + &reqData.PhysicalArea: "physical_area", + &reqData.ServerRoomName: "server_room_name", + &reqData.FixedAssetNum: "fixed_asset_number", + &reqData.ServerCabinet: "server_cabinet_number", + &reqData.ServerUSiteNumber: "server_usite_number", + &reqData.SN: "sn", + &reqData.IntranetIP: "intranet_ip", + &reqData.ExtranetIP: "extranet_ip", + &reqData.IP: "ip", //可以搜索内网,外网 + &reqData.Vendor: "vendor", + &reqData.Model: "model", + &reqData.Usage: "usage", + &reqData.Category: "category", + &reqData.CategoryPreDeploy: "category_pre_deploy", + &reqData.OperationStatus: "operation_status", + &reqData.PreDeployed: "pre_deployed", + &reqData.HardwareRemark: "hardware_remark", + &reqData.OOBAccessible: "oob_accessible", //yes|no|unknown + &reqData.Page: "page", + &reqData.PageSize: "page_size", + } +} + +// Validate 结构体数据校验 +func (reqData *DevicePageReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + //log, _ := middleware.LoggerFromContext(req.Context()) + // SpecialDev->特殊设备 + if reqData.Usage == "SpecialDev" { + reqData.Usage = fmt.Sprintf("%s,%s", model.DevUsageSpecialDev, "SpecialDev") + } + // 校验设备状态是否正确 + if reqData.OperationStatus != "" { + ops := strings.Split(reqData.OperationStatus, ",") + for k := range ops { + switch ops[k] { + case model.DevOperStatRunWithAlarm: + case model.DevOperStatRunWithoutAlarm: + case model.DevOperStatReinstalling: + case model.DevOperStatMoving: + case model.DevOperStatPreRetire: + case model.DevOperStatRetiring: + case model.DevOperStateRetired: + case model.DevOperStatPreDeploy: + case model.DevOperStatOnShelve: + case model.DevOperStatRecycling: + case model.DevOperStatMaintaining: + case model.DevOperStatPreMove: + case model.DevOperStatInStore: + default: + errs.Add([]string{"sns"}, binding.BusinessError, + fmt.Sprintf("设备状态:%s 不合法)", ops[k])) + return errs + } + } + } + return errs +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *ExportDevicesReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.FixedAssetNum: "fixed_asset_number", + &reqData.SN: "sn", + &reqData.Vendor: "vendor", + &reqData.Model: "model", + &reqData.Usage: "usage", + &reqData.Category: "category", + &reqData.OperationStatus: "operation_status", + //&reqData.Page: "page", + //&reqData.PageSize: "page_size", + } +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *UpdateDevicesReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.ID: "id", + &reqData.FixedAssetNum: "fixed_asset_number", + &reqData.SN: "sn", + &reqData.Vendor: "vendor", + &reqData.Model: "model", + &reqData.Usage: "usage", + &reqData.Category: "category", + &reqData.IDCID: "idc_id", + &reqData.ServerRoomID: "server_room_id", + &reqData.CabinetID: "server_cabinet_id", + &reqData.USiteID: "server_usite_id", + &reqData.HardwareRemark: "hardware_remark", + &reqData.RAIDRemark: "raid_remark", + &reqData.StartedAt: "started_at", + &reqData.OnShelveAt: "onshelve_at", + &reqData.OperationStatus: "operation_status", + } +} + +//ImportDevicesPreview 导入预览 +func ImportDevicesPreview(log logger.Logger, repo model.Repo, reqData *ImportPreviewReq) (map[string]interface{}, error) { + ra, err := utils.ParseDataFromXLSX(upload.UploadDir + reqData.FileName) + if err != nil { + return nil, err + } + length := len(ra) + + var success []*ImportDevicesReq + var failure []*ImportDevicesReq + + if valid, err := CheckUnique(ra); !valid { + return nil, err + } + + //统计一下关联订单号的数量,用于更新订单状态 + var mOrderAmount = make(map[string]int, 0) + + for i := 1; i < length; i++ { + row := &ImportDevicesReq{} + if len(ra[i]) < 15 { + var br string + if row.ErrMsgContent != "" { + br = "<br />" + } + row.ErrMsgContent += br + "导入文件列长度不对(应为15列)" + failure = append(failure, row) + continue + } + row.FixedAssetNum = ra[i][0] + row.SN = ra[i][1] + row.Vendor = ra[i][10] + row.Model = ra[i][2] + row.Usage = ra[i][3] + row.Category = ra[i][4] + row.ServerRoomName = ra[i][5] + row.CabinetNum = ra[i][6] + row.USiteNum = ra[i][7] + row.HardwareRemark = ra[i][8] + row.RAIDRemark = ra[i][9] + row.StartedAt = ra[i][11] + row.OnShelveAt = ra[i][12] + row.OOBInit = ra[i][13] + //row.OriginNodeIP = ra[i][14] + row.OrderNumber = ra[i][14] + + utils.StructTrimSpace(row) + + //字段存在性校验 + row.checkLength() + + //以下这段时间转换的代码纯粹是为了转换下Excel中日期格式(如:1990/1/1) + startedAt, _ := time.Parse(times.DateLayout2, ra[i][11]) + onShelveAt, _ := time.Parse(times.DateLayout2, ra[i][12]) + startedAtStr := startedAt.Format(times.DateLayout) + if startedAtStr != "0001-01-01" { + row.StartedAt = startedAtStr + } + onShelveAtStr := onShelveAt.Format(times.DateLayout) + if onShelveAtStr != "0001-01-01" { + row.OnShelveAt = onShelveAtStr + } + + //数据有效性校验 + err := row.validate(repo) + if err != nil { + return nil, err + } + + if row.ErrMsgContent != "" { + failure = append(failure, row) + } else { + success = append(success, row) + } + + dev, _ := repo.GetDeviceBySN(row.SN) + if dev == nil && row.OrderNumber != "" { + // 校验订单相关信息 + order, _ := repo.GetOrderByNumber(row.OrderNumber) + if order != nil { + switch order.Status { + case model.OrderStatusCanceled: + return nil,fmt.Errorf("订单:%s已取消", order.Number) + case model.OrderStatusfinished: + return nil,fmt.Errorf("订单:%s已确认完成", order.Number) + } + if row.Usage != order.Usage { + return nil,fmt.Errorf("订单:%s 用途: %s 与导入的设备SN:%s 用途不匹配", order.Number, row.SN, order.Usage) + } + } + mOrderAmount[row.OrderNumber]++ //新增才统计订单到货数量 + } + } + + for orderNum, arrivalCount := range mOrderAmount { + order, _ := repo.GetOrderByNumber(orderNum) + if order != nil { + if order.LeftAmount < arrivalCount { + return nil, fmt.Errorf("订单(%s)新增到货数:%d应不大于剩余到货数量数量:%d", orderNum, arrivalCount, order.LeftAmount) + } + } + } + + var data []*ImportDevicesReq + if len(failure) > 0 { + data = failure + } else { + data = success + } + var result []*ImportDevicesReq + for i := 0; i < len(data); i++ { + if uint(i) >= reqData.Offset && uint(i) < (reqData.Offset+reqData.Limit) { + result = append(result, data[i]) + } + } + if len(failure) > 0 { + _ = os.Remove(upload.UploadDir + reqData.FileName) + return map[string]interface{}{"status": "failure", + "message": "导入服务器错误", + "total_records": len(data), + "content": result, + }, nil + } + return map[string]interface{}{"status": "success", + "message": "操作成功", + "import_status": true, + "total_records": len(data), + "content": result, + }, nil +} + +// ImportDevices 将设备放到数据库 +func ImportDevices(log logger.Logger, repo model.Repo, conf *config.Config, reqData *ImportPreviewReq) error { + fileName := upload.UploadDir + reqData.FileName + log.Debugf("begin to parse data from file(%s)", fileName) + ra, err := utils.ParseDataFromXLSX(fileName) + if err != nil { + log.Debugf("failed to parse data from file(%s)", fileName) + return err + } + //把临时文件删了 + err = os.Remove(fileName) + if err != nil { + log.Warnf("remove tmp file: %s fail", fileName) + return err + } + length := len(ra) + + var devices []*model.Device + + if valid, err := CheckUnique(ra); !valid { + return err + } + + //统计一下关联订单号的数量,用于更新订单状态 + var mOrderAmount = make(map[string]int, 0) + for i := 1; i < length; i++ { + row := &ImportDevicesReq{ + FixedAssetNum: ra[i][0], + SN: ra[i][1], + Vendor: ra[i][10], + Model: ra[i][2], + Usage: ra[i][3], + Category: ra[i][4], + ServerRoomName: ra[i][5], + CabinetNum: ra[i][6], + USiteNum: ra[i][7], + HardwareRemark: ra[i][8], + RAIDRemark: ra[i][9], + StartedAt: ra[i][11], + OnShelveAt: ra[i][12], + OOBInit: ra[i][13], + //OriginNodeIP: ra[i][14], + OrderNumber: ra[i][14], + } + if len(ra[i]) < 15 { + continue + } + + utils.StructTrimSpace(row) + //处理所有字段的多余空格字符 + + //必填项校验 + row.checkLength() + + //机房和网络区域校验 + err := row.validate(repo) + if err != nil { + return err + } + + mod := &model.Device{ + SN: row.SN, + Vendor: row.Vendor, + DevModel: row.Model, + Usage: row.Usage, + Category: row.Category, + IDCID: row.idcID, + ServerRoomID: row.serverRoomID, + CabinetID: row.cabinetID, + USiteID: &row.uSiteID, + HardwareRemark: row.HardwareRemark, + RAIDRemark: row.RAIDRemark, + OOBInit: "{}", + PowerStatus: model.PowerStatusOff, + OrderNumber: row.OrderNumber, + //JSON type的字段需要默认赋空值 + CPU: "{}", + Memory: "{}", + Disk: "{}", + DiskSlot: "{}", + NIC: "{}", + Motherboard: "{}", + RAID: "{}", + OOB: "{}", + BIOS: "{}", + Fan: "{}", + Power: "{}", + HBA: "{}", + PCI: "{}", + Switch: "{}", + LLDP: "{}", + Extra: "{}", + } + mod.StartedAt, _ = time.Parse(times.DateLayout2, row.StartedAt) + mod.OnShelveAt, _ = time.Parse(times.DateLayout2, row.OnShelveAt) + mod.OperationStatus = model.DevOperStatPreDeploy //default + if row.OOBInit != "" { + words := strings.Split(row.OOBInit, ":") + if len(words) == 2 { + ou := OOBUser{ + Username: words[0], + Password: words[1], + } + if b, err := json.Marshal(ou); err == nil { + mod.OOBInit = string(b) + } + } + } + + //查询是否已经存在 + dev, err := repo.GetDeviceBySN(row.SN) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + + isExits := false + + if dev != nil { + mod.FixedAssetNumber = dev.FixedAssetNumber + mod.Model = dev.Model + if dev.OperationStatus == "" { + dev.OperationStatus = model.DevOperStatPreDeploy //default + } + mod.OperationStatus = dev.OperationStatus + mod.OriginNode = dev.OriginNode + mod.Vendor = dev.Vendor + mod.Arch = dev.Arch + mod.CPUSum = dev.CPUSum + mod.CPU = dev.CPU + mod.MemorySum = dev.MemorySum + mod.Memory = dev.Memory + mod.DiskSum = dev.DiskSum + mod.Disk = dev.Disk + mod.DiskSlot = dev.DiskSlot + mod.NIC = dev.NIC + mod.NICDevice = dev.NICDevice + mod.BootOSIP = dev.BootOSIP + mod.BootOSMac = dev.BootOSMac + mod.Motherboard = dev.Motherboard + mod.RAID = dev.RAID + mod.OOB = dev.OOB + mod.OOBIP = dev.OOBIP + mod.OOBUser = dev.OOBUser + mod.OOBPassword = dev.OOBPassword + mod.BIOS = dev.BIOS + mod.Fan = dev.Fan + mod.Power = dev.Power + mod.HBA = dev.HBA + mod.PCI = dev.PCI + mod.Switch = dev.Switch + mod.LLDP = dev.LLDP + mod.Extra = dev.Extra + mod.HBA = dev.HBA + mod.PowerStatus = dev.PowerStatus + mod.Updater = reqData.LoginName + isExits = true + } else { + //自动生成固资编号,新增场景才这么干! + if row.FixedAssetNum == "" { + row.FixedAssetNum, err = GenFixedAssetNumber(repo) + if err != nil { + log.Errorf("generate fixed_asset number for SN:%s fail", row.SN) + return fmt.Errorf("自动生成固资号失败:%v", err) + } + } + mod.FixedAssetNumber = row.FixedAssetNum + mod.Creator = reqData.LoginName + } + // 默认电源状态OFF + if mod.PowerStatus == "" { + mod.PowerStatus = model.PowerStatusOff + } + // 仅记录必要字段到“设备新增” + optDetail, err := convert2DetailOfOperationTypeAdd(repo, *mod) + if err != nil { + log.Errorf("Fail to convert Detail of OperationTypeAdd: %v", err) + } + // DeviceLifecycle 变更记录 + deviceLifecycleLog := []model.ChangeLog { + { + OperationUser: reqData.LoginName, + OperationType: model.OperationTypeAdd, + OperationDetail: optDetail, + OperationTime: times.ISOTime(time.Now()).ToTimeStr(), + }, + } + b, _ := json.Marshal(deviceLifecycleLog) + // SaveDeviceLifecycleReq 结构体 + saveDevLifecycleReq := &SaveDeviceLifecycleReq { + DeviceLifecycleBase: DeviceLifecycleBase{ + FixedAssetNumber: mod.FixedAssetNumber, + SN: mod.SN, + AssetBelongs: "Undefined", + Owner: "Undefined", + IsRental: "no", + MaintenanceServiceProvider: "Undefined", + MaintenanceService: "Undefined", + LogisticsService: "Undefined", + MaintenanceServiceStatus: model.MaintenanceServiceStatusInactive, //新增场景默认-未激活 + LifecycleLog: string(b), + }, + } + // 通过订单编号获取资产归属、负责人、维保服务等内容 + // 若无订单编号则以参数输入为准 + if row.OrderNumber != "" { + order, err := repo.GetOrderByNumber(row.OrderNumber) + if err != nil { + log.Errorf("订单(订单号:%s)不存在", row.OrderNumber) + return err + } + if order != nil { + saveDevLifecycleReq.AssetBelongs = order.AssetBelongs + saveDevLifecycleReq.Owner = order.Owner + saveDevLifecycleReq.IsRental = order.IsRental + saveDevLifecycleReq.MaintenanceServiceProvider = order.MaintenanceServiceProvider + saveDevLifecycleReq.MaintenanceService = order.MaintenanceService + saveDevLifecycleReq.LogisticsService = order.LogisticsService + saveDevLifecycleReq.MaintenanceServiceDateBegin = order.MaintenanceServiceDateBegin + saveDevLifecycleReq.MaintenanceServiceDateEnd = order.MaintenanceServiceDateEnd + } + } + //插入或者更新 + if _, err = repo.SaveDevice(mod); err != nil { + return err + } + // DeviceLifecycle 查询是否已经存在 + devLifecycle, err := repo.GetDeviceLifecycleBySN(mod.SN) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if devLifecycle != nil { + log.Debugf("Importing device DeviceLifecycle SN %s already exist.Update it.", mod.SN) + saveDevLifecycleReq.ID = devLifecycle.ID + } + // 若dev已经存在,且密码不为默认出厂密码,则不予修改 + if isExits && checkOriginPassword(log, conf, mod) { + continue + } + + devices = append(devices, mod) + //如果是重复性(更新性质的)导入,不重复更新订单 + if !isExits { + if row.OrderNumber != "" { + mOrderAmount[row.OrderNumber]++ + } + } + //修改机位占用状态 + if mod.USiteID != nil { + if _, err = repo.BatchUpdateServerUSitesStatus([]uint{*mod.USiteID}, model.USiteStatUsed); err != nil { + log.Errorf("update server_usite status failed, usite_num :%s", row.USiteNum) + } + } + // 保存或更新 DeviceLifecycle + if err = SaveDeviceLifecycle(log, repo, saveDevLifecycleReq); err != nil { + log.Debug(err) + return err + } + } + + //更新关联的订单到货数量和订单状态 + for orderNum, arrivalCount := range mOrderAmount { + if err = UpdateOrderByArrival(log, repo, orderNum, arrivalCount); err != nil { + return err + } + } + + // 导入设备成功后,批量修改密码 + go batchUpdateOOBPassword(log, repo, conf, devices) + + os.Remove(fileName) + + return nil +} + +//ImportDevices2StorePreview 导入预览 +func ImportDevices2StorePreview(log logger.Logger, repo model.Repo, reqData *ImportPreviewReq) (map[string]interface{}, error) { + ra, err := utils.ParseDataFromXLSX(upload.UploadDir + reqData.FileName) + if err != nil { + return nil, err + } + length := len(ra) + + var success []*ImportDevice2StoreReq + var failure []*ImportDevice2StoreReq + + //if valid, err := CheckUnique(ra); !valid { + // return nil, err + //} + //统计新增设备。有些重复导入修改的,不统计,用与订单剩余到货数比较 + var mOrderAmount = make(map[string]int, 0) + + for i := 1; i < length; i++ { + row := &ImportDevice2StoreReq{} + if len(ra[i]) < 20 { + var br string + if row.ErrMsgContent != "" { + br = "<br />" + } + row.ErrMsgContent += br + "导入文件列长度不对(应为21列)" + failure = append(failure, row) + continue + } + //row.FixedAssetNum = ra[i][0] + row.SN = ra[i][0] + row.Vendor = ra[i][1] + row.Model = ra[i][2] + row.Usage = ra[i][3] + row.Category = ra[i][4] + row.StoreRoomName = ra[i][5] + row.VCabinetNum = ra[i][6] + row.HardwareRemark = ra[i][7] + row.RAIDRemark = ra[i][8] + row.OOBInit = ra[i][9] + row.OrderNumber = ra[i][10] + row.Owner = ra[i][11] + + //转换下Excel中日期格式 + maintenanceDate, _ := time.Parse(times.DateLayout2, ra[i][12]) + maintenanceDateStr := maintenanceDate.Format(times.DateLayout) + if maintenanceDateStr != "0001-01-01" { + row.MaintenanceServiceDateBegin = maintenanceDateStr + } else { + row.MaintenanceServiceDateBegin = "" + } + maintenanceMonths, err := strconv.Atoi(ra[i][13]) + if err != nil { + return nil, err + } + row.MaintenanceMonths = maintenanceMonths + row.AssetBelongs = ra[i][14] + row.IsRental = ra[i][15] + row.MaintenanceServiceProvider = ra[i][16] + // 允许为空 + row.MaintenanceService = ra[i][17] + row.LogisticsService = ra[i][18] + row.FixedAssetNum = ra[i][19] + row.StartedAt = ra[i][20] + row.OnShelveAt = ra[i][21] + + utils.StructTrimSpace(row) + + //字段存在性校验 + row.checkLength() + + //数据有效性校验 + err = row.validate(repo) + if err != nil { + return nil, err + } + + if row.ErrMsgContent != "" { + failure = append(failure, row) + } else { + success = append(success, row) + } + + dev, _ := repo.GetDeviceBySN(row.SN) + if dev == nil && row.OrderNumber != "" { + mOrderAmount[row.OrderNumber]++ //新增才统计订单信息 + } + } + + for orderNum, arrivalCount := range mOrderAmount { + order, _ := repo.GetOrderByNumber(orderNum) + if order != nil { + switch order.Status { + case model.OrderStatusCanceled: + return nil,fmt.Errorf("订单:%s已取消", order.Number) + case model.OrderStatusfinished: + return nil,fmt.Errorf("订单:%s已确认完成", order.Number) + } + if order.LeftAmount < arrivalCount { + return nil, fmt.Errorf("订单(%s)新增到货数:%d应不大于剩余到货数量数量:%d", orderNum, arrivalCount, order.LeftAmount) + } + } + } + + var data []*ImportDevice2StoreReq + if len(failure) > 0 { + data = failure + } else { + data = success + } + var result []*ImportDevice2StoreReq + for i := 0; i < len(data); i++ { + if uint(i) >= reqData.Offset && uint(i) < (reqData.Offset+reqData.Limit) { + result = append(result, data[i]) + } + } + if len(failure) > 0 { + _ = os.Remove(upload.UploadDir + reqData.FileName) + return map[string]interface{}{"status": "failure", + "message": "导入服务器错误", + "total_records": len(data), + "content": result, + }, nil + } + return map[string]interface{}{"status": "success", + "message": "操作成功", + "import_status": true, + "total_records": len(data), + "content": result, + }, nil +} + +// ImportDevices2Store 将设备放到导入到库房 +func ImportDevices2Store(log logger.Logger, repo model.Repo, conf *config.Config, reqData *ImportPreviewReq) error { + fileName := upload.UploadDir + reqData.FileName + log.Debugf("begin to parse data from file(%s)", fileName) + ra, err := utils.ParseDataFromXLSX(fileName) + if err != nil { + log.Debugf("failed to parse data from file(%s)", fileName) + return err + } + //把临时文件删了 + log.Debugf("begin to remove file(%s)", fileName) + err = os.Remove(fileName) + if err != nil { + log.Warnf("remove tmp file: %s fail", fileName) + return err + } + + length := len(ra) + + //统计一下关联订单号的数量,用于更新订单状态 + var mOrderAmount = make(map[string]int, 0) + + var mods []*model.Device + + for i := 1; i < length; i++ { + if len(ra[i]) < 22 { + continue + } + row := &ImportDevice2StoreReq{} + row.SN = ra[i][0] + row.Vendor = ra[i][1] + row.Model = ra[i][2] + row.Usage = ra[i][3] + row.Category = ra[i][4] + row.StoreRoomName = ra[i][5] + row.VCabinetNum = ra[i][6] + row.HardwareRemark = ra[i][7] + row.RAIDRemark = ra[i][8] + row.OOBInit = ra[i][9] + row.OrderNumber = ra[i][10] + row.Owner = ra[i][11] + + //转换下Excel中日期格式 + maintenanceDate, _ := time.Parse(times.DateLayout2, ra[i][12]) + maintenanceDateStr := maintenanceDate.Format(times.DateLayout) + if maintenanceDateStr != "0001-01-01" { + row.MaintenanceServiceDateBegin = maintenanceDateStr + } else { + row.MaintenanceServiceDateBegin = "" + } + maintenanceMonths, err := strconv.Atoi(ra[i][13]) + if err != nil { + return err + } + row.MaintenanceMonths = maintenanceMonths + row.AssetBelongs = ra[i][14] + row.IsRental = ra[i][15] + row.MaintenanceServiceProvider = ra[i][16] + // 允许为空 + row.MaintenanceService = ra[i][17] + row.LogisticsService = ra[i][18] + row.FixedAssetNum = ra[i][19] + row.StartedAt = ra[i][20] + row.OnShelveAt = ra[i][21] + + //处理所有字段的多余空格字符 + utils.StructTrimSpace(row) + + //必填项校验 + row.checkLength() + + //机房和网络区域校验 + err = row.validate(repo) + if err != nil { + return err + } + + mod := &model.Device{ + FixedAssetNumber: row.FixedAssetNum, + SN: row.SN, + Vendor: row.Vendor, + DevModel: row.Model, + Usage: row.Usage, + Category: row.Category, + IDCID: row.idcID, + StoreRoomID: row.storeRoomID, + VCabinetID: row.vcabinetID, + HardwareRemark: row.HardwareRemark, + RAIDRemark: row.RAIDRemark, + PowerStatus: model.PowerStatusOff, + } + //mod.StartedAt, _ = time.Parse(times.DateLayout2, "01-01-70") //填充一个非法时间 + //mod.OnShelveAt, _ = time.Parse(times.DateLayout2, "01-01-70") + mod.PowerStatus = model.PowerStatusOff + now := time.Now() + //mod.StartedAt = now + //mod.OnShelveAt = now + mod.CreatedAt = now + mod.StartedAt, _ = time.Parse(times.DateLayout2, row.StartedAt) + mod.OnShelveAt, _ = time.Parse(times.DateLayout2, row.OnShelveAt) + mod.OperationStatus = model.DevOperStatInStore //default + if row.OOBInit != "" { + words := strings.Split(row.OOBInit, ":") + if len(words) == 2 { + ou := OOBUser{ + Username: words[0], + Password: words[1], + } + if b, err := json.Marshal(ou); err == nil { + mod.OOBInit = string(b) + } + } + } + + //查询是否已经存在 + dev, err := repo.GetDeviceBySN(row.SN) + if err != nil && err != gorm.ErrRecordNotFound { + log.Errorf("check device:%s exist fail,err:%v", row.SN, err) + return err + } + + if dev != nil { + mod.FixedAssetNumber = dev.FixedAssetNumber + mod.Model = dev.Model + mod.OriginNode = dev.OriginNode + mod.Arch = dev.Arch + mod.CPUSum = dev.CPUSum + mod.CPU = dev.CPU + mod.MemorySum = dev.MemorySum + mod.Memory = dev.Memory + mod.DiskSum = dev.DiskSum + mod.Disk = dev.Disk + mod.DiskSlot = dev.DiskSlot + mod.NIC = dev.NIC + mod.NICDevice = dev.NICDevice + mod.BootOSIP = dev.BootOSIP + mod.BootOSMac = dev.BootOSMac + mod.Motherboard = dev.Motherboard + mod.RAID = dev.RAID + mod.OOB = dev.OOB + mod.OOBIP = dev.OOBIP + mod.OOBUser = dev.OOBUser + mod.OOBPassword = dev.OOBPassword + mod.BIOS = dev.BIOS + mod.Fan = dev.Fan + mod.Power = dev.Power + mod.HBA = dev.HBA + mod.PCI = dev.PCI + mod.Switch = dev.Switch + mod.LLDP = dev.LLDP + mod.Extra = dev.Extra + mod.HBA = dev.HBA + mod.PowerStatus = dev.PowerStatus + mod.Updater = reqData.LoginName + } else { + //自动生成固资编号 + if row.FixedAssetNum == "" { + row.FixedAssetNum, err = GenFixedAssetNumber(repo) + if err != nil { + log.Errorf("generate fixed_asset number for SN:%s fail", row.SN) + return err + } + } + mod.FixedAssetNumber = row.FixedAssetNum + mod.Creator = reqData.LoginName + if row.OrderNumber != "" { + mOrderAmount[row.OrderNumber]++ //新增才统计订单信息 + } + } + // 仅记录必要字段到“设备新增” + optDetail, err := convert2DetailOfOperationTypeAdd(repo, *mod) + if err != nil { + log.Errorf("Fail to convert Detail of OperationTypeAdd: %v", err) + } + // DeviceLifecycle 变更记录 + deviceLifecycleLog := []model.ChangeLog { + { + OperationUser: reqData.LoginName, + OperationType: model.OperationTypeAdd, + OperationDetail: optDetail, + OperationTime: times.ISOTime(time.Now()).ToTimeStr(), + }, + } + b, _ := json.Marshal(deviceLifecycleLog) + + // SaveDeviceLifecycleReq 结构体 + saveDevLifecycleReq := &SaveDeviceLifecycleReq { + DeviceLifecycleBase: DeviceLifecycleBase{ + FixedAssetNumber: mod.FixedAssetNumber, + SN: mod.SN, + AssetBelongs: row.AssetBelongs, + Owner: row.Owner, + IsRental: row.IsRental, + MaintenanceServiceProvider: row.MaintenanceServiceProvider, + MaintenanceService: row.MaintenanceService, + LogisticsService: row.LogisticsService, + MaintenanceServiceStatus: model.MaintenanceServiceStatusInactive, //新增场景默认-未激活 + LifecycleLog: string(b), + }, + } + + if row.MaintenanceServiceDateBegin != "" { + t, err := time.Parse(times.DateLayout, row.MaintenanceServiceDateBegin) + if err != nil { + log.Errorf("parse maintenance time %s err:%v , using current time for maintenance-date", row.MaintenanceServiceDateBegin, err) + saveDevLifecycleReq.MaintenanceServiceDateBegin = now + saveDevLifecycleReq.MaintenanceServiceDateEnd = now.AddDate(0, row.MaintenanceMonths, 0) + } else { + saveDevLifecycleReq.MaintenanceServiceDateBegin = t + saveDevLifecycleReq.MaintenanceServiceDateEnd = t.AddDate(0, row.MaintenanceMonths, 0) + } + } else { + saveDevLifecycleReq.MaintenanceServiceDateBegin = now + saveDevLifecycleReq.MaintenanceServiceDateEnd = now.AddDate(0, row.MaintenanceMonths, 0) + } + + + // 通过订单编号获取资产归属、负责人、维保服务等内容 + // 若无订单编号则以参数输入为准 + if row.OrderNumber != "" { + order, err := repo.GetOrderByNumber(row.OrderNumber) + if err != nil { + log.Errorf("订单(订单号:%s)不存在", row.OrderNumber) + return err + } + if order != nil { + mod.OrderNumber = row.OrderNumber + saveDevLifecycleReq.AssetBelongs = order.AssetBelongs + saveDevLifecycleReq.Owner = order.Owner + saveDevLifecycleReq.IsRental = order.IsRental + saveDevLifecycleReq.MaintenanceServiceProvider = order.MaintenanceServiceProvider + saveDevLifecycleReq.MaintenanceService = order.MaintenanceService + saveDevLifecycleReq.LogisticsService = order.LogisticsService + saveDevLifecycleReq.MaintenanceServiceDateBegin = order.MaintenanceServiceDateBegin + saveDevLifecycleReq.MaintenanceServiceDateEnd = order.MaintenanceServiceDateEnd + } + } + // DeviceLifecycle 查询是否已经存在 + devLifecycle, err := repo.GetDeviceLifecycleBySN(mod.SN) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if devLifecycle != nil { + log.Debugf("DeviceLifecycle SN %s already exist.Update it.", mod.SN) + saveDevLifecycleReq.ID = devLifecycle.ID + } + mods = append(mods, mod) + // 保存或更新 DeviceLifecycle + if err = SaveDeviceLifecycle(log, repo, saveDevLifecycleReq); err != nil { + log.Debug(err) + return err + } + } + + //更新关联的订单到货数量和订单状态 + for orderNum, arrivalCount := range mOrderAmount { + if err = UpdateOrderByArrival(log, repo, orderNum, arrivalCount); err != nil { + return err + } + } + + // 更新完订单再更新设备信息 + for i := range mods { + if _, err = repo.SaveDevice(mods[i]); err != nil { + return err + } + } + //TODO 失败回滚 + return nil +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *UpdateDevicesOperationStatusReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.FixedAssetNum: "fixed_asset_number", + &reqData.SN: "sn", + &reqData.OperationStatus: "operation_status", + } +} + +// Validate 对修改的数据做基本校验 +func (reqData *UpdateDevicesOperationStatusReq) Validate(request *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(request.Context()) + + if reqData.SN == "" && reqData.FixedAssetNum == "" { + errs.Add([]string{"设备SN、固资编号"}, binding.RequiredError, fmt.Sprintf("设备SN、固资编号不能同时为空")) + return errs + } + + if reqData.OperationStatus != model.DevOperStatRunWithoutAlarm && + reqData.OperationStatus != model.DevOperStatRunWithAlarm && + reqData.OperationStatus != model.DevOperStateRetired && + reqData.OperationStatus != model.DevOperStatMoving && + reqData.OperationStatus != model.DevOperStatOnShelve && + reqData.OperationStatus != model.DevOperStatPreDeploy && + reqData.OperationStatus != model.DevOperStatPreRetire && + reqData.OperationStatus != model.DevOperStatRetiring && + reqData.OperationStatus != model.DevOperStatRecycling && + reqData.OperationStatus != model.DevOperStatPreMove && + reqData.OperationStatus != model.DevOperStatMaintaining && + reqData.OperationStatus != model.DevOperStatReinstalling { + errs.Add([]string{"运营状态"}, binding.RequiredError, fmt.Sprintf("运营状态不正确")) + return errs + } + + if d, _ := repo.GetDeviceByFixAssetNumber(reqData.FixedAssetNum); d == nil { + if d, _ = repo.GetDeviceBySN(reqData.SN); d == nil { + errs.Add([]string{"设备SN"}, binding.RequiredError, fmt.Sprintf("设备信息不存在,SN[%s],固资号[%s]", reqData.SN, reqData.FixedAssetNum)) + return errs + } + + } + + return nil +} + +// Validate 对修改的数据做基本校验 +func (reqData *BatchUpdateDevicesReq) Validate(request *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(request.Context()) + + for _, d := range reqData.Devices { + if d.SN == "" && d.FixedAssetNum == "" { + errs.Add([]string{"设备SN、固资编号"}, binding.RequiredError, fmt.Sprintf("设备SN、固资编号不能同时为空")) + return errs + } + + if d.OperationStatus != "" && !validOperationStatus(d.OperationStatus) { + errs.Add([]string{"运营状态"}, binding.RequiredError, fmt.Sprintf("运营状态不正确")) + return errs + } + + //devUsageEnum := []string{model.DevUsageDB, model.DevUsageAPP, model.DevUsageTGW, model.DevUsageCVM, + // model.DevUsageStorage, model.DevUsageContainer, model.DevUsageBDP, model.DevUsageSpecialDev, model.DevUsageOther} + //if !ValidateEnum(d.Usage, devUsageEnum) { + // errs.Add([]string{"用途"}, binding.RequiredError, fmt.Sprintf("用途值(%s)不合法", d.Usage)) + // return errs + //} + + if dd, _ := repo.GetDeviceByFixAssetNumber(d.FixedAssetNum); dd == nil { + if dd, _ = repo.GetDeviceBySN(d.SN); dd == nil { + errs.Add([]string{"设备SN"}, binding.RequiredError, + fmt.Sprintf("设备信息不存在,SN[%s],固资号[%s]", d.SN, d.FixedAssetNum)) + return errs + } + + } + } + + return nil +} + +//ImportStockDevicesPreview 导入存量设备预览 +func ImportStockDevicesPreview(log logger.Logger, repo model.Repo, reqData *ImportPreviewReq) (map[string]interface{}, error) { + ra, err := utils.ParseDataFromXLSX(upload.UploadDir + reqData.FileName) + if err != nil { + return nil, err + } + length := len(ra) + + var success []*ImportStockDevicesReq + var failure []*ImportStockDevicesReq + + //if valid, err := CheckUnique(ra); !valid { + // return nil, err + //} + for i := 1; i < length; i++ { + row := &ImportStockDevicesReq{} + if len(ra[i]) < 19 { + var br string + if row.ErrMsgContent != "" { + br = "<br />" + } + row.ErrMsgContent += br + "导入文件列长度不对(应为19列)" + failure = append(failure, row) + continue + } + row.FixedAssetNum = ra[i][0] + row.SN = ra[i][1] + row.Model = ra[i][2] + row.Arch = ra[i][3] + row.Usage = ra[i][4] + row.Category = ra[i][5] + row.ServerRoomName = ra[i][6] + row.CabinetNum = ra[i][7] + row.USiteNum = ra[i][8] + row.HardwareRemark = ra[i][9] + row.RAIDRemark = ra[i][10] + row.Vendor = ra[i][11] + row.StartedAt = ra[i][12] + row.OnShelveAt = ra[i][13] + row.OOBInit = ra[i][14] + //row.OriginNodeIP = ra[i][15] + row.IntranetIP = ra[i][15] + row.ExtranetIP = ra[i][16] + row.OS = ra[i][17] + row.OperationStatus = ra[i][18] + + utils.StructTrimSpace(row) + utils.StructTrimSpace(&row.ImportDevicesReq) + + //字段存在性校验 + row.checkLength() + + //以下这段时间转换的代码纯粹是为了转换下Excel中日期格式 + startedAt, _ := time.Parse(times.DateLayout2, ra[i][11]) + onShelveAt, _ := time.Parse(times.DateLayout2, ra[i][12]) + startedAtStr := startedAt.Format(times.DateLayout) + if startedAtStr != "0001-01-01" { + row.StartedAt = startedAtStr + } + onShelveAtStr := onShelveAt.Format(times.DateLayout) + if onShelveAtStr != "0001-01-01" { + row.OnShelveAt = onShelveAtStr + } + + //数据有效性校验 + err := row.validate(repo) + if err != nil { + return nil, err + } + + if row.ErrMsgContent != "" { + failure = append(failure, row) + } else { + success = append(success, row) + } + } + + var data []*ImportStockDevicesReq + if len(failure) > 0 { + data = failure + } else { + data = success + } + var result []*ImportStockDevicesReq + for i := 0; i < len(data); i++ { + if uint(i) >= reqData.Offset && uint(i) < (reqData.Offset+reqData.Limit) { + result = append(result, data[i]) + } + } + if len(failure) > 0 { + _ = os.Remove(upload.UploadDir + reqData.FileName) + return map[string]interface{}{"status": "failure", + "message": "导入服务器错误", + "total_records": len(data), + "content": result, + }, nil + } + return map[string]interface{}{"status": "success", + "message": "操作成功", + "import_status": true, + "total_records": len(data), + "content": result, + }, nil +} + +// ImportStockDevices 将设备放到数据库 +func ImportStockDevices(log logger.Logger, repo model.Repo, conf *config.Config, reqData *ImportPreviewReq) error { + fileName := upload.UploadDir + reqData.FileName + ra, err := utils.ParseDataFromXLSX(fileName) + if err != nil { + return err + } + //把临时文件删了 + err = os.Remove(fileName) + if err != nil { + log.Warnf("remove tmp file: %s fail", fileName) + return err + } + length := len(ra) + + var devices []*model.Device + + //if valid, err := CheckUnique(ra); !valid { + // return err + //} + + for i := 1; i < length; i++ { + row := &ImportStockDevicesReq{ + ImportDevicesReq: ImportDevicesReq{ + FixedAssetNum: ra[i][0], + SN: ra[i][1], + Vendor: ra[i][11], + Model: ra[i][2], + Arch: ra[i][3], + Usage: ra[i][4], + Category: ra[i][5], + ServerRoomName: ra[i][6], + CabinetNum: ra[i][7], + USiteNum: ra[i][8], + HardwareRemark: ra[i][9], + RAIDRemark: ra[i][10], + StartedAt: ra[i][12], + OnShelveAt: ra[i][13], + OOBInit: ra[i][14], + //OriginNodeIP: ra[i][15], + }, + IntranetIP: ra[i][15], + ExtranetIP: ra[i][16], + OS: ra[i][17], + OperationStatus: ra[i][18], + } + if len(ra[i]) < 19 { + continue + } + + //处理所有字段的多余空格字符 + utils.StructTrimSpace(row) + utils.StructTrimSpace(&row.ImportDevicesReq) + + //必填项校验 + row.checkLength() + + //机房和网络区域校验 + err := row.validate(repo) + if err != nil { + return err + } + + mod := &model.Device{ + FixedAssetNumber: row.FixedAssetNum, + SN: row.SN, + Vendor: row.Vendor, + DevModel: row.Model, + Arch: row.Arch, + Usage: row.Usage, + Category: row.Category, + IDCID: row.idcID, + ServerRoomID: row.serverRoomID, + CabinetID: row.cabinetID, + USiteID: &row.uSiteID, + HardwareRemark: row.HardwareRemark, + RAIDRemark: row.RAIDRemark, + OOBInit: "{}", + //OriginNodeIP: row.OriginNodeIP, + PowerStatus: model.PowerStatusOn, //默认认为是开的 + OperationStatus: OperationStatusTransfer(row.OperationStatus, false), + //JSON type的字段需要默认赋空值 + CPU: "{}", + Memory: "{}", + Disk: "{}", + DiskSlot: "{}", + NIC: "{}", + Motherboard: "{}", + RAID: "{}", + OOB: "{}", + BIOS: "{}", + Fan: "{}", + Power: "{}", + HBA: "{}", + PCI: "{}", + Switch: "{}", + LLDP: "{}", + Extra: "{}", + Remark: "存量导入", + } + mod.StartedAt, _ = time.Parse(times.DateLayout2, row.StartedAt) + mod.OnShelveAt, _ = time.Parse(times.DateLayout2, row.OnShelveAt) + + if row.OOBInit != "" { + words := strings.Split(row.OOBInit, ":") + if len(words) == 2 { + ou := OOBUser{ + Username: words[0], + Password: words[1], + } + if b, err := json.Marshal(ou); err == nil { + mod.OOBInit = string(b) + } + } + } + + //查询是否已经存在 + dev, err := repo.GetDeviceBySN(row.SN) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + + isExits := false + + if dev != nil { + mod.Model = dev.Model + mod.OriginNode = dev.OriginNode + mod.CPUSum = dev.CPUSum + mod.CPU = dev.CPU + mod.MemorySum = dev.MemorySum + mod.Memory = dev.Memory + mod.DiskSum = dev.DiskSum + mod.Disk = dev.Disk + mod.DiskSlot = dev.DiskSlot + mod.NIC = dev.NIC + mod.NICDevice = dev.NICDevice + mod.BootOSIP = dev.BootOSIP + mod.BootOSMac = dev.BootOSMac + mod.Motherboard = dev.Motherboard + mod.RAID = dev.RAID + mod.OOB = dev.OOB + mod.OOBIP = dev.OOBIP + mod.OOBUser = dev.OOBUser + mod.OOBPassword = dev.OOBPassword + mod.BIOS = dev.BIOS + mod.Fan = dev.Fan + mod.Power = dev.Power + mod.HBA = dev.HBA + mod.PCI = dev.PCI + mod.Switch = dev.Switch + mod.LLDP = dev.LLDP + mod.Extra = dev.Extra + mod.HBA = dev.HBA + mod.PowerStatus = dev.PowerStatus + mod.Updater = reqData.LoginName + isExits = true + } else { + mod.Creator = reqData.LoginName + } + + //再次用带外远程更新下开关机状态 + if pwrStatus, err := GetDevicePowerStatusBySN(log, repo, conf, row.SN); err != nil { + log.Errorf("get power status by sn:%s fail:%v", row.SN, err) + } else if pwrStatus != "" { + mod.PowerStatus = pwrStatus + } + + //插入或者更新 + if _, err = repo.SaveDevice(mod); err != nil { + return err + } + + //如果设备被导入过,则修改 + if isExits { + //释放之前占用的机位,因为这次导入的数据可能机位改了,需要释放之前的,后边占用更新后的 + if dev.USiteID != nil { + if _, err = repo.BatchUpdateServerUSitesStatus([]uint{*dev.USiteID}, model.USiteStatFree); err != nil { + log.Errorf("update server_usite status failed, usite_id :%s", dev.USiteID) + } + } + } + + //修改机位占用状态 + if mod.USiteID != nil { + if _, err = repo.BatchUpdateServerUSitesStatus([]uint{*mod.USiteID}, model.USiteStatUsed); err != nil { + log.Errorf("update server_usite status failed, usite_num :%s", row.USiteNum) + } + } + //模拟一条装机记录,用于保存IP,OS等信息 + ds := model.DeviceSetting{ + SN: row.SN, + InstallType: model.InstallationPXE, + Status: model.InstallStatusSucc, + InstallProgress: 1.0, + IntranetIP: row.IntranetIP, + NeedExtranetIP: model.NO, + NeedIntranetIPv6: model.NO, + NeedExtranetIPv6: model.NO, + } + //再查询下是否存在 + dsOrigin, err := repo.GetDeviceSettingBySN(row.SN) + if err != nil { + log.Infof("get device setting by sn:%s err%v", row.SN, err) + } else if dsOrigin != nil { + ds.Model = dsOrigin.Model //这样就支持更新了 + //释放之前的IP信息 + if _, err = repo.ReleaseIP(row.SN, model.IPScopeIntranet); err != nil { + log.Errorf("release origin intranet ip by sn:%s fail", row.SN) + } + if dsOrigin.ExtranetIP != "" { + if _, err = repo.ReleaseIP(row.SN, model.IPScopeExtranet); err != nil { + log.Errorf("release origin intranet ip by sn:%s fail", row.SN) + } + } + ds.Updater = reqData.LoginName + } else { + ds.Creator = reqData.LoginName + } + + if sysTpl, err := repo.GetSystemTemplateByName(row.OS); err == nil { + ds.SystemTemplateID = sysTpl.ID + } else { + log.Warnf("get system template by name:%s err:%v", row.OS, err) + } + if row.ExtranetIP != "" { + ds.ExtranetIP = row.ExtranetIP + ds.NeedExtranetIP = model.YES + } + + if err = repo.SaveDeviceSetting(&ds); err != nil { + log.Errorf("save simulate device setting err,%v", err) + return err + } + + //把IP标记为已分配 + //支持多IP场景:如果多IP,则格式为英文逗号(,)分隔 + for _, ip := range strings.Split(row.IntranetIP, commaSep) { + if err = repo.AssignIPByIP(row.SN, model.Intranet, ip); err != nil { + log.Errorf("assign intranet ip :%s to sn:%s err :%v", ip, row.SN, err) + return err + } + } + if row.ExtranetIP != "" { + for _, ip := range strings.Split(row.ExtranetIP, commaSep) { + if err = repo.AssignIPByIP(row.SN, model.Extranet, ip); err != nil { + log.Errorf("assign extranet ip :%s to sn:%s err :%v", ip, row.SN, err) + return err + } + } + } + + // 若dev已经存在,且密码不为默认出厂密码,则不予修改 + if isExits && checkOriginPassword(log, conf, mod) { + continue + } + devices = append(devices, mod) + + } + + // 导入设备成功后,批量修改密码 + go batchUpdateOOBPassword(log, repo, conf, devices) + + return nil +} + +//checkOriginPassword 校验密码是否与出厂密码一致 +func checkOriginPassword(log logger.Logger, conf *config.Config, device *model.Device) bool { + passwd, err := utils.AESDecrypt(device.OOBPassword, []byte(conf.Crypto.Key)) + if err != nil { + log.Errorf("checkOriginPassword: AESDecrypt password failure, err: %s", err.Error()) + return false + } + + var mapper map[string][]*OOBUser + json.Unmarshal([]byte(OOBVendorConfig), &mapper) + + for k, users := range mapper { + if k != device.Vendor { + continue + } + + for _, user := range users { + if user.Password == string(passwd) { + return true + } + } + } + + return false +} + +// batchUpdateOOBPassword 批量修改带外密码 +func batchUpdateOOBPassword(log logger.Logger, repo model.Repo, conf *config.Config, devices []*model.Device) { + for _, dev := range devices { + var encryptedPassword string + bTryImportedOOB := false + + ouInit := OOBUser{} + _ = json.Unmarshal([]byte(dev.OOBInit), &ouInit) + if ouInit.Username != "" && ouInit.Password != "" { + encrypted, err := utils.AESEncrypt(ouInit.Password, []byte(conf.Crypto.Key)) + if err != nil { + log.Errorf("SN: %s encrypt imported oob password fail", dev.SN) + } else { + bTryImportedOOB = true + encryptedPassword = encrypted + } + } + + oobIP := oob.TransferHostname2IP(log, repo, dev.SN, utils.GetOOBHost(dev.SN, dev.Vendor, conf.Server.OOBDomain)) + if oobIP != "" { + //设备表里有数据, 检查其有效性 + if dev.OOBUser != "" && dev.OOBPassword != "" { + pwBytes, err := utils.AESDecrypt(dev.OOBPassword, []byte(conf.Crypto.Key)) + if err != nil { + log.Errorf("SN: %s decrypt old password:%s fail", dev.OOBPassword) + //continue + } + if oobPingTest(log, oobIP, dev.OOBUser, string(pwBytes), dev.OOBPassword) { + //如果表里的数据有效,则不改。 + continue + } + } + + //1->没有则获取一个出厂默认的用户密码 + defaultUser, err := GetDefaultOOBUserPassword(log, repo, conf, dev.SN, dev.Vendor) + //默认用户不用ping测试了,因为获取的时候已经逐个试过了。返回的都是有效值 + if defaultUser != nil { + UpdateOOBPasswordBySN(log, repo, &UpdateOOBPasswordReq{ + SN: dev.SN, + Username: defaultUser.Username, + PasswordOld: defaultUser.Password, + PasswordNew: GenPassword(), + }, conf) + continue //success 1 + } + log.Infof("SN:%s get default oob user fail,err:%v", dev.SN, err) + + //2. 如果默认出厂用户也无法连通,尝试找回 + oobHis, err := FindOOBByHistory(log, repo, conf, dev.SN) + if err == nil && oobHis != nil { + UpdateOOBPasswordBySN(log, repo, &UpdateOOBPasswordReq{ + SN: dev.SN, + Username: oobHis.Username, + PasswordOld: oobHis.Password, + PasswordNew: GenPassword(), + }, conf) + continue //success 2 + } + log.Infof("SN:%s find back oob user password fail,err:%v", dev.SN, err) + + //3.如果没有找回,再次尝试从用户导入的字段读取 + if ouInit.Username != "" && ouInit.Password != "" { + if bTryImportedOOB && oobPingTest(log, oobIP, ouInit.Username, ouInit.Password, encryptedPassword) { + UpdateOOBPasswordBySN(log, repo, &UpdateOOBPasswordReq{ + SN: dev.SN, + Username: ouInit.Username, + PasswordOld: ouInit.Password, + PasswordNew: GenPassword(), + }, conf) + continue //success 3 + } else { + log.Infof("SN:%s oob imported oob user:%s,password: %s connected fail", dev.SN, ouInit.Username, encryptedPassword) + } + } + log.Infof("SN:%s imported oob user empty, all update attempts fail", dev.SN) + } else { + log.Errorf("SN:%s get oob ip from dns fail", dev.SN) + } + + if bTryImportedOOB { + //客户要求,当所有来源尝试过都失败了,就把用户导入的账户密码保存到设备表里 + dev.OOBUser = ouInit.Username + dev.OOBPassword = encryptedPassword + isYes := model.NO + dev.OOBAccessible = &isYes + _, err := repo.UpdateDevice(dev) + if err != nil { + log.Errorf("SN:%s force write imported oob user fail,Err:%s", dev.SN, err.Error()) + return + } + } + } +} + +//checkLength 对导入文件中的数据做字段长度校验 +func (impDevReq *ImportDevicesReq) checkLength() { + leg := len(impDevReq.SN) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:序列号长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.Vendor) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:厂商长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.Model) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:型号长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.Usage) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:用途长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.Category) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:设备类型长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.ServerRoomName) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:机房管理单元名称长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.CabinetNum) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:机架编号长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.USiteNum) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:机位编号长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.StartedAt) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:启用时间长度为(%d)(不能为空,不能大于255)", leg) + } + if !strings.Contains(impDevReq.StartedAt, "-") { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + "启用时间格式须为:2019/01/01" + } + leg = len(impDevReq.OnShelveAt) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:上架时间长度为(%d)(不能为空,不能大于255)", leg) + } + if !strings.Contains(impDevReq.OnShelveAt, "-") { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + "上架时间格式须为:2019/01/01" + } + + //硬件说明 + //RAID说明 + //带外说明 + //暂时不做检验 +} + +//checkLength 对导入文件中的数据做字段长度校验 +func (impDevReq *ImportDevice2StoreReq) checkLength() { + //固定资产编号可以由规则生成 + leg := len(impDevReq.SN) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:序列号长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.Vendor) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:厂商长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.Model) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:型号长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.Usage) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:用途长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.Category) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:设备类型长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.StoreRoomName) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:库房管理单元名称长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.VCabinetNum) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:虚拟货架编号长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.Owner) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:负责人长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.MaintenanceServiceDateBegin) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:维保服务起始日期长度为(%d)(不能为空,不能大于255)", leg) + } + if impDevReq.MaintenanceMonths == 0 || impDevReq.MaintenanceMonths > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:保修期(月数)长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.IsRental) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验: 是否租赁 长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.MaintenanceServiceProvider) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验: 维保服务供应商 长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.StartedAt) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:启用时间长度为(%d)(不能为空,不能大于255)", leg) + } + if !strings.Contains(impDevReq.StartedAt, "-") { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + "启用时间格式须为:2019/01/01" + } + leg = len(impDevReq.OnShelveAt) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:上架时间长度为(%d)(不能为空,不能大于255)", leg) + } + if !strings.Contains(impDevReq.OnShelveAt, "-") { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + "上架时间格式须为:2019/01/01" + } +} + +//checkLength 对导入文件中的数据做字段长度校验 +func (impDevReq *ImportStockDevicesReq) checkLength() { + leg := len(impDevReq.FixedAssetNum) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:固定资产编号长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.SN) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:序列号长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.Vendor) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:厂商长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.Model) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:型号长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.Usage) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:用途长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.Category) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:设备类型长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.ServerRoomName) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:机房管理单元名称长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.CabinetNum) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:机架编号长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.USiteNum) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:机位编号长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.StartedAt) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:启用时间长度为(%d)(不能为空,不能大于255)", leg) + } + if !strings.Contains(impDevReq.StartedAt, "-") { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + "启用时间格式须为:2019/01/01" + } + leg = len(impDevReq.OnShelveAt) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:上架时间长度为(%d)(不能为空,不能大于255)", leg) + } + if !strings.Contains(impDevReq.OnShelveAt, "-") { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + "上架时间格式须为:2019/01/01" + } + + //硬件说明 + //RAID说明 + //带外说明 + //暂时不做检验 + leg = len(impDevReq.IntranetIP) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:内网IP长度为(%d)(不能为空,不能大于255)", leg) + } + //leg = len(impDevReq.ExtranetIP) 外网可以缺省 + //if leg == 0 || leg > 255 { + // var br string + // if impDevReq.ErrMsgContent != "" { + // br = "<br />" + // } + // impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:外网IP长度为(%d)(不能为空,不能大于255)", leg) + //} + leg = len(impDevReq.OS) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:操作系统长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.OperationStatus) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:运营状态长度为(%d)(不能为空,不能大于255)", leg) + } +} + +//validate 对导入文件中的数据做基本验证 +func (impDevReq *ImportDevicesReq) validate(repo model.Repo) error { + //用途枚举值 + //devUsageEnum := []string{model.DevUsageDB, model.DevUsageAPP, model.DevUsageTGW, model.DevUsageCVM, + // model.DevUsageStorage, model.DevUsageContainer, model.DevUsageBDP, model.DevUsageSpecialDev, model.DevUsageOther} + //if !ValidateEnum(impDevReq.Usage, devUsageEnum) { + // var br string + // if impDevReq.ErrMsgContent != "" { + // br = "<br />" + // } + // impDevReq.ErrMsgContent += br + fmt.Sprintf("用途字段值:%s非法,必须是:%v", impDevReq.Usage, devUsageEnum) + //} + //机房校验 + srs, err := repo.GetServerRoomByName(impDevReq.ServerRoomName) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if err == gorm.ErrRecordNotFound || srs == nil { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("机房名(%s)不存在", impDevReq.ServerRoomName) + } else if srs != nil { + impDevReq.idcID = srs.IDCID + impDevReq.serverRoomID = srs.ID + } + + //机架 + cabinet, err := repo.GetServerCabinetByNumber(impDevReq.serverRoomID, impDevReq.CabinetNum) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if err == gorm.ErrRecordNotFound || cabinet == nil { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("机架编号(%s)不存在", impDevReq.CabinetNum) + } else { + impDevReq.cabinetID = cabinet.ID + } + //机位 + uSite, err := repo.GetServerUSiteByNumber(impDevReq.cabinetID, impDevReq.USiteNum) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if err == gorm.ErrRecordNotFound || uSite == nil { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("机位编号(%s)不存在, 机架编号(%s)", impDevReq.USiteNum, impDevReq.CabinetNum) + } else { + // 设备已存在,说明是先进入bootos或者数据已经导入过,重新导入刷新,此时的机位如果没有变化, + // 则不判断机位占用状态,因为就是被自己占着 + dev, _ := repo.GetDeviceBySN(impDevReq.SN) + if !CheckUSiteFree(repo, uSite.ID, dev) { + //log.Errorf("机位:%s 被占用或被禁用", row.USiteNum) + //return errors.New("机位:" + row.USiteNum + "被占用或被禁用") + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("机位编号(%s), 机架编号(%s)被占用或不可用", impDevReq.USiteNum, impDevReq.CabinetNum) + } else { + impDevReq.uSiteID = uSite.ID + } + } + if impDevReq.OOBInit != "" { + if !strings.Contains(impDevReq.OOBInit, ":") { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("带外用户密码初始值:%s格式不正确,应以':'分隔", impDevReq.OOBInit) + } + } + if impDevReq.OrderNumber != "" { + order, err := repo.GetOrderByNumber(impDevReq.OrderNumber) + if err != nil { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("订单(订单号:%s)不存在", impDevReq.OrderNumber) + } + if order != nil { + if order.IDCID != impDevReq.idcID { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("订单(订单号:%s)与设备(SN:%s)不属于同一个数据中心", impDevReq.OrderNumber, impDevReq.SN) + } + if order.Category != impDevReq.Category { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("订单(订单号:%s)的设备类型(%s) 与 设备(SN:%s)的设备类型(%s)不匹配", impDevReq.OrderNumber, order.Category, impDevReq.SN, impDevReq.Category) + } + } + } + + return nil +} + +//validate 对导入文件中的数据做基本验证 +func (impDevReq *ImportDevice2StoreReq) validate(repo model.Repo) error { + //用途枚举值, 放开限制 + + //机房校验 + srs, err := repo.GetStoreRoomByName(impDevReq.StoreRoomName) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if err == gorm.ErrRecordNotFound || srs == nil { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("库房(%s)不存在", impDevReq.StoreRoomName) + } else if srs != nil { + impDevReq.idcID = srs.IDCID + impDevReq.storeRoomID = srs.ID + } + + //虚拟货架 + cabinet, err := repo.GetVirtualCabinets(&model.VirtualCabinet{ + StoreRoomID: impDevReq.storeRoomID, + Number: impDevReq.VCabinetNum, + }, nil, nil) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if err == gorm.ErrRecordNotFound || len(cabinet) <= 0 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("虚拟货架(%s)不存在", impDevReq.VCabinetNum) + } else if len(cabinet) > 0 { + impDevReq.vcabinetID = cabinet[0].ID + } + if impDevReq.OOBInit != "" { + if !strings.Contains(impDevReq.OOBInit, ":") { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("带外用户密码初始值:%s格式不正确,应以':'分隔", impDevReq.OOBInit) + } + } + if impDevReq.IsRental != model.NO && impDevReq.IsRental != model.YES { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("是否租赁(%s)不合法,应为 yes or no", impDevReq.IsRental) + } + if impDevReq.OrderNumber != "" { + order, err := repo.GetOrderByNumber(impDevReq.OrderNumber) + if err != nil || order == nil { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("订单(订单号:%s)不存在", impDevReq.OrderNumber) + } else if order != nil { + if order.IDCID != impDevReq.idcID { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("订单(订单号:%s)与设备(SN:%s)不属于同一个数据中心", impDevReq.OrderNumber, impDevReq.SN) + } + if order.Category != impDevReq.Category { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("订单(订单号:%s)的设备类型(%s) 与 设备(SN:%s)的设备类型(%s)不匹配", impDevReq.OrderNumber, order.Category, impDevReq.SN, impDevReq.Category) + } + } + } + return nil +} + +//validate 对导入文件中的数据做基本验证 +func (impDevReq *ImportStockDevicesReq) validate(repo model.Repo) error { + //用途枚举值 + //devUsageEnum := []string{model.DevUsageDB, model.DevUsageAPP, model.DevUsageTGW, model.DevUsageCVM, + // model.DevUsageStorage, model.DevUsageContainer, model.DevUsageBDP, model.DevUsageSpecialDev, model.DevUsageOther} + //if !ValidateEnum(impDevReq.Usage, devUsageEnum) { + // var br string + // if impDevReq.ErrMsgContent != "" { + // br = "<br />" + // } + // impDevReq.ErrMsgContent += br + fmt.Sprintf("用途字段值:%s非法,必须是:%v", impDevReq.Usage, devUsageEnum) + //} + //机房校验 + srs, err := repo.GetServerRoomByName(impDevReq.ServerRoomName) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if err == gorm.ErrRecordNotFound || srs == nil { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("机房名(%s)不存在", impDevReq.ServerRoomName) + } else { + impDevReq.idcID = srs.IDCID + impDevReq.serverRoomID = srs.ID + } + + //机架 + cabinet, err := repo.GetServerCabinetByNumber(impDevReq.serverRoomID, impDevReq.CabinetNum) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if err == gorm.ErrRecordNotFound || cabinet == nil { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("机架编号(%s)不存在", impDevReq.CabinetNum) + } else { + impDevReq.cabinetID = cabinet.ID + } + //机位 + uSite, err := repo.GetServerUSiteByNumber(impDevReq.cabinetID, impDevReq.USiteNum) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if err == gorm.ErrRecordNotFound || uSite == nil { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("机位编号(%s)不存在, 机架编号(%s)", impDevReq.USiteNum, impDevReq.CabinetNum) + } else { + // 设备已存在,说明是先进入bootos或者数据已经导入过,重新导入刷新,此时的机位如果没有变化, + // 则不判断机位占用状态,因为就是被自己占着 + dev, _ := repo.GetDeviceBySN(impDevReq.SN) + if !CheckUSiteFree(repo, uSite.ID, dev) { + //log.Errorf("机位:%s 被占用或被禁用", row.USiteNum) + //return errors.New("机位:" + row.USiteNum + "被占用或被禁用") + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("机位编号(%s), 机架编号(%s)被占用或不可用", impDevReq.USiteNum, impDevReq.CabinetNum) + } else { + impDevReq.uSiteID = uSite.ID + } + } + if impDevReq.OOBInit != "" { + if !strings.Contains(impDevReq.OOBInit, ":") { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("带外用户密码初始值:%s格式不正确,应以':'分隔", impDevReq.OOBInit) + } + } + if isValidIP(impDevReq.IntranetIP) { + for _, ip := range strings.Split(impDevReq.IntranetIP, commaSep) { + if ipDB, err := repo.GetIPs(&model.IPPageCond{IP: ip}, nil, nil); len(ipDB) < 1 || err != nil { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("内网IP:%s不存在", ip) + //return err + } else if len(ipDB) > 0 { + if ipDB[0].IsUsed == model.YES && ipDB[0].SN != impDevReq.SN { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("内网IP:%s已被占用/禁用,关联SN:%s", ip, ipDB[0].SN) + //return nil + } + if ipDB[0].Scope != nil && *ipDB[0].Scope != model.IPScopeIntranet { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("IP:%s非内网IP", ip) + //return nil + } + } + } + } else { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("内网IP:%s格式不正确,多IP以英文逗号分隔", impDevReq.IntranetIP) + } + if impDevReq.ExtranetIP != "" { + if isValidIP(impDevReq.ExtranetIP) { + for _, ip := range strings.Split(impDevReq.ExtranetIP, commaSep) { + if ipDB, err := repo.GetIPs(&model.IPPageCond{IP: ip}, nil, nil); len(ipDB) < 1 || err != nil { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("外网IP:%s不存在", ip) + //return err + } else if len(ipDB) > 0 { + if ipDB[0].IsUsed == model.YES && ipDB[0].SN != impDevReq.SN { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("外网IP:%s已被占用/禁用,关联SN:%s", ip, ipDB[0].SN) + //return nil + } + if ipDB[0].Scope != nil && *ipDB[0].Scope != model.IPScopeExtranet { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("IP:%s非外网IP", ip) + //return nil + } + } + } + } else { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("外网IP:%s格式不正确,多IP以英文逗号分隔", impDevReq.ExtranetIP) + } + } + if _, err := repo.GetSystemTemplateByName(impDevReq.OS); err != nil { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("操作系统(对应于系统安装模板名称):%s不存在", impDevReq.OS) + } + //运行状态枚举值 + opStatusEnum := []string{"运行中(需告警)", "运行中(无需告警)", "已上架" /*"重装中", "搬迁中", "待退役", "已退役", "待部署", "回收中"*/} + if !ValidateEnum(impDevReq.OperationStatus, opStatusEnum) { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("运营状态值:%s非法,必须是:%v", impDevReq.OperationStatus, opStatusEnum) + } + return nil +} + +//判断是否合规的IP格式,单IP或以英文逗号分隔的多IP +func isValidIP(ipStr string) bool { + return strings.Count(ipStr, ".") == 3 || (strings.Count(ipStr, ".") > 3 && strings.Contains(ipStr, commaSep)) +} + +// Validate 对修改的数据做基本校验 +func (reqData *UpdateDevicesReq) Validate(request *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(request.Context()) + dev, err := repo.GetDeviceByID(reqData.ID) + if err != nil { + errs.Add([]string{"设备ID"}, binding.RequiredError, fmt.Sprintf("设备ID:%d不存在", reqData.ID)) + return errs + } + if d, _ := repo.GetDeviceBySN(reqData.SN); d != nil && d.ID != reqData.ID { + errs.Add([]string{"设备SN"}, binding.RequiredError, fmt.Sprintf("设备SN:%s已存在", reqData.SN)) + return errs + } + if d, _ := repo.GetDeviceByFixAssetNumber(reqData.FixedAssetNum); d != nil && d.ID != reqData.ID { + errs.Add([]string{"设备固资编号"}, binding.RequiredError, fmt.Sprintf("设备固资编号:%s已存在", reqData.FixedAssetNum)) + return errs + } + _, err = repo.GetIDCByID(reqData.IDCID) + if err != nil { + errs.Add([]string{"数据中心ID"}, binding.RequiredError, fmt.Sprintf("数据中心ID:%d不存在", reqData.IDCID)) + return errs + } + serverRoom, err := repo.GetServerRoomByID(reqData.ServerRoomID) + if err != nil { + errs.Add([]string{"机房ID"}, binding.RequiredError, fmt.Sprintf("机房ID:%d不存在", reqData.ServerRoomID)) + return errs + } + if serverRoom.IDCID != reqData.IDCID { + errs.Add([]string{"机房ID"}, binding.RequiredError, fmt.Sprintf("机房ID:%d不属于数据中心ID:%d", reqData.ServerRoomID, reqData.IDCID)) + return errs + } + cabinet, err := repo.GetServerCabinetByID(reqData.CabinetID) + if err != nil { + errs.Add([]string{"机架ID"}, binding.RequiredError, fmt.Sprintf("机架ID:%d不存在", reqData.CabinetID)) + return errs + } + if cabinet.ServerRoomID != reqData.ServerRoomID { + errs.Add([]string{"机架ID"}, binding.RequiredError, fmt.Sprintf("机架ID:%d不属于机房ID:%d", reqData.CabinetID, reqData.ServerRoomID)) + return errs + } + usite, err := repo.GetServerUSiteByID(reqData.USiteID) + if err != nil { + errs.Add([]string{"机位ID"}, binding.RequiredError, fmt.Sprintf("机位ID:%d不存在", reqData.USiteID)) + return errs + } + if usite.ServerCabinetID != reqData.CabinetID { + errs.Add([]string{"机位ID"}, binding.RequiredError, fmt.Sprintf("机位ID:%d不属于机架ID:%d", reqData.USiteID, reqData.CabinetID)) + return errs + } + if !CheckUSiteFree(repo, usite.ID, dev) { + errs.Add([]string{"机位ID"}, binding.RequiredError, fmt.Sprintf("机位ID:%d已被占用或不可用", reqData.USiteID)) + return errs + } + return nil +} + +// GetDevicePage 查询物理机分页列表 +func GetDevicePage(log logger.Logger, repo model.Repo, conf *config.Config, reqData *DevicePageReq) (pg *page.Page, err error) { + if reqData.PageSize <= 0 || reqData.PageSize > 100 { + reqData.PageSize = 20 + } + if reqData.Page < 0 { + reqData.Page = 1 + } + + var cond model.CombinedDeviceCond + cond.IDCID = strings2.Multi2UintSlice(reqData.IDCID) + cond.ServerRoomID = strings2.Multi2UintSlice(reqData.ServerRoomID) + cond.PhysicalArea = reqData.PhysicalArea + cond.ServerCabinet = reqData.ServerCabinet + cond.ServerRoomName = reqData.ServerRoomName + cond.ServerUsiteNumber = reqData.ServerUSiteNumber + cond.FixedAssetNumber = reqData.FixedAssetNum + cond.SN = reqData.SN + cond.Vendor = reqData.Vendor + cond.DevModel = reqData.Model + cond.Usage = reqData.Usage + // 物理机-待部署列表仅获取待部署状态的设备类型 + if reqData.CategoryPreDeploy != "" { + cond.Category = reqData.CategoryPreDeploy + } else { + cond.Category = reqData.Category + } + cond.OperationStatus = reqData.OperationStatus + cond.PreDeployed = reqData.PreDeployed + cond.HardwareRemark = reqData.HardwareRemark + cond.IntranetIP = reqData.IntranetIP + cond.ExtranetIP = reqData.ExtranetIP + cond.IP = reqData.IP + cond.OOBAccessible = reqData.OOBAccessible + + totalRecords, err := repo.CountCombinedDevices(&cond) + if err != nil { + return nil, err + } + + pager := page.NewPager(reflect.TypeOf(&DevicePageResp{}), reqData.Page, reqData.PageSize, totalRecords) + orderBy := []model.OrderByPair{ + /*{Name: "device.updated_at", Direction: model.DESC},*/ + {Name: "device.idc_id", Direction: model.ASC}, + {Name: "device.server_room_id", Direction: model.ASC}, + {Name: "device.server_cabinet_id", Direction: model.ASC}, + {Name: "device.id", Direction: model.ASC}} //MYSQL VERSION >=5.6 ,若不增加索引字段作为排序值,可能导致分页(LIMIT&OFFSET)数据重复 + items, err := repo.GetCombinedDevices(&cond, orderBy, pager.BuildLimiter()) + if err != nil { + return nil, err + } + for i := range items { + item, err := conver2DevicePagesResp(log, repo, conf, &items[i].Device) + if err != nil { + log.Error(err) + //return nil, err + } + + pager.AddRecords(item) + } + return pager.BuildPage(), nil +} + +//GetExportDevices 获取导出物理机列表 +func GetExportDevices(log logger.Logger, repo model.Repo, conf *config.Config, reqData *DevicePageReq) (devs []*DevicePageResp, err error) { + var cond model.CombinedDeviceCond + cond.ID = strings2.Multi2UintSlice(reqData.ID) + cond.IDCID = strings2.Multi2UintSlice(reqData.IDCID) + cond.ServerRoomID = strings2.Multi2UintSlice(reqData.ServerRoomID) + cond.PhysicalArea = reqData.PhysicalArea + cond.ServerCabinet = reqData.ServerCabinet + cond.FixedAssetNumber = reqData.FixedAssetNum + cond.SN = reqData.SN + cond.Vendor = reqData.Vendor + cond.DevModel = reqData.Model + cond.Usage = reqData.Usage + cond.Category = reqData.Category + cond.OperationStatus = reqData.OperationStatus + cond.PreDeployed = reqData.PreDeployed + cond.IntranetIP = reqData.IntranetIP + cond.ExtranetIP = reqData.ExtranetIP + cond.OOBAccessible = reqData.OOBAccessible + + items, err := repo.GetCombinedDevices(&cond, model.OneOrderBy("id", model.DESC), nil) + if err != nil { + return nil, err + } + devs = make([]*DevicePageResp, 0, len(items)) + for i := range items { + item, err := conver2DevicePagesResp(log, repo, conf, &items[i].Device) + if err != nil { + log.Error(err) + //return nil, err + } + devs = append(devs, item) + } + return +} + +func ConvertPowerStatus(powerStatus string) string { + if powerStatus == model.PowerStatusOn { + return "开电" + } + return "关电" +} + +//conver2DevicePagesResp 将model层转view层返回结构 +func conver2DevicePagesResp(log logger.Logger, repo model.Repo, conf *config.Config, device *model.Device) (resp *DevicePageResp, err error) { + resp = &DevicePageResp{ + ID: device.ID, + FixedAssetNum: device.FixedAssetNumber, + SN: device.SN, + Vendor: device.Vendor, + Model: device.DevModel, + Arch: device.Arch, + Usage: device.Usage, + Category: device.Category, + OOBIP: device.OOBIP, + OOBUser: device.OOBUser, + PowerStatus: device.PowerStatus, + IDC: &IDCSimplify{ID: device.IDCID}, + ServerRoom: &ServerRoomSimplify{ID: device.ServerRoomID}, + ServerCabinet: &ServerCabinetSimplify{ID: device.CabinetID}, + StoreRoom: &StoreRoomSimplify{ID: device.StoreRoomID}, + VCabinet: &VCabinetSimplify{ID: device.VCabinetID}, + //ServerUSite: &ServerUSiteSimplify{ID: *device.USiteID}, + HardwareRemark: device.HardwareRemark, + RAIDRemark: device.RAIDRemark, + OperationStatus: device.OperationStatus, + StartedAt: times.ISOTime(device.StartedAt).ToDateStr(), + OnShelveAt: times.ISOTime(device.OnShelveAt).ToDateStr(), + CreatedAt: times.ISOTime(device.CreatedAt).ToDateStr(), + UpdatedAt: times.ISOTime(device.UpdatedAt).ToDateStr(), + OriginNode: device.OriginNode, + OriginNodeIP: device.OriginNodeIP, + OrderNumber: device.OrderNumber, + } + if device.OOBAccessible != nil { + resp.OOBAccessible = *device.OOBAccessible + } + if device.USiteID != nil { + resp.ServerUSite = &ServerUSiteSimplify{ID: *device.USiteID} + } + if device.OOBPassword != "" { + password, err := utils.AESDecrypt(device.OOBPassword, []byte(conf.Crypto.Key)) + if err != nil { + log.Errorf("解密失败,密码为[%s]", device.OOBPassword) + return nil, err + } + resp.OOBPassword = string(password) + } + //idc + if idc, err := repo.GetIDCByID(device.IDCID); err == nil { + resp.IDC.Name = idc.Name + } + + if device.StoreRoomID != 0 { + //库房 + if room, err := repo.GetStoreRoomByID(device.StoreRoomID); err == nil && room != nil { + resp.StoreRoom.Name = room.Name + } + //货架 + if cabinet, err := repo.GetVirtualCabinetByID(device.VCabinetID); err == nil && cabinet != nil { + resp.VCabinet.Number = cabinet.Number + } + } + if device.ServerRoomID != 0 { + //机房管理单元 + if room, err := repo.GetServerRoomByID(device.ServerRoomID); err == nil { + resp.ServerRoom.Name = room.Name + } + //机架 + if cabinet, err := repo.GetServerCabinetByID(device.CabinetID); err == nil { + resp.ServerCabinet.Number = cabinet.Number + } + //机位 + if device.USiteID != nil { + if u, err := repo.GetServerUSiteByID(*device.USiteID); err == nil { + resp.ServerUSite.Number = u.Number + resp.ServerUSite.PhysicalArea = u.PhysicalArea + } + } + resp.TOR, _ = repo.GetTORBySN(device.SN) + //装机参数 + devSett, _ := repo.GetDeviceSettingBySN(device.SN) + if devSett != nil { + resp.IntranetIP = devSett.IntranetIP + resp.ExtranetIP = devSett.ExtranetIP + if devSett.InstallType == model.InstallationPXE { + sysTpl, _ := repo.GetSystemTemplateBySN(devSett.SN) + if sysTpl != nil { + resp.OS = sysTpl.Name + } + } else if devSett.InstallType == model.InstallationImage { + imageTpl, _ := repo.GetImageTemplateBySN(devSett.SN) + if imageTpl != nil { + resp.OS = imageTpl.Name + } + } + } + } + return +} + +func GetDeviceQuerys(log logger.Logger, repo model.Repo, param string) (*model.DeviceQueryParamResp, error) { + return repo.GetDeviceQuerys(param) +} + +// GetDeviceBySN 查询采集到的设备信息 +func GetDeviceBySN(log logger.Logger, repo model.Repo, sn string) (*device.Device, error) { + m, err := repo.GetDeviceBySN(sn) + if err != nil { + return nil, err + } + + var dev device.Device + dev.SN = m.SN + dev.Vendor = m.Vendor + dev.Model = m.DevModel + dev.Arch = m.Arch + dev.BootOSIP = m.BootOSIP + dev.BootOSMac = m.BootOSMac + dev.NICDevice = m.NICDevice + + if m.CPU != "" { + if err = json.Unmarshal([]byte(m.CPU), &dev.CPU); err != nil { + log.Error(err) + return nil, err + } + } + + if m.Memory != "" { + if err = json.Unmarshal([]byte(m.Memory), &dev.Memory); err != nil { + log.Error(err) + return nil, err + } + } + + if m.Disk != "" { + if err = json.Unmarshal([]byte(m.Disk), &dev.Disk); err != nil { + log.Error(err) + return nil, err + } + } + + if m.DiskSlot != "" { + if err = json.Unmarshal([]byte(m.DiskSlot), &dev.DiskSlot); err != nil { + log.Error(err) + return nil, err + } + } + + if m.NIC != "" { + if err = json.Unmarshal([]byte(m.NIC), &dev.NIC); err != nil { + log.Error(err) + return nil, err + } + } + + if m.Motherboard != "" { + if err = json.Unmarshal([]byte(m.Motherboard), &dev.Motherboard); err != nil { + log.Error(err) + return nil, err + } + } + + if m.RAID != "" { + if err = json.Unmarshal([]byte(m.RAID), &dev.RAID); err != nil { + log.Error(err) + return nil, err + } + } + + if m.OOB != "" { + if err = json.Unmarshal([]byte(m.OOB), &dev.OOB); err != nil { + log.Error(err) + return nil, err + } + } + + if m.BIOS != "" { + if err = json.Unmarshal([]byte(m.BIOS), &dev.BIOS); err != nil { + log.Error(err) + return nil, err + } + } + + if m.Fan != "" { + if err = json.Unmarshal([]byte(m.Fan), &dev.Fan); err != nil { + log.Error(err) + return nil, err + } + } + + if m.Power != "" { + if err = json.Unmarshal([]byte(m.Power), &dev.Power); err != nil { + log.Error(err) + return nil, err + } + } + + if m.HBA != "" { + if err = json.Unmarshal([]byte(m.HBA), &dev.HBA); err != nil { + log.Error(err) + return nil, err + } + } + + if m.PCI != "" { + if err = json.Unmarshal([]byte(m.PCI), &dev.PCI); err != nil { + log.Error(err) + return nil, err + } + } + + // TODO 如何呈现交换机(包含在LLDP信息中)信息 + if m.LLDP != "" { + if err = json.Unmarshal([]byte(m.LLDP), &dev.LLDP); err != nil { + log.Error(err) + return nil, err + } + } + + if m.Extra != "" { + if err = json.Unmarshal([]byte(m.Extra), &dev.Extra); err != nil { + log.Error(err) + return nil, err + } + } + return &dev, nil +} + +// GetCombinedDeviceBySN 返回指定SN的设备详情 +func GetCombinedDeviceBySN(repo model.Repo, conf *config.Config, sn string) (dev *CombinedDevice, err error) { + items, err := repo.GetCombinedDevices(&model.CombinedDeviceCond{SN: sn}, nil, nil) + if err != nil { + return nil, err + } + if len(items) <= 0 { + return nil, gorm.ErrRecordNotFound + } + var mcd *model.CombinedDevice + for i := range items { + if items[i].SN == sn { + mcd = items[i] + } + } + + dev, err = convert2Combind(repo, conf, mcd) + if err != nil { + return + } + //dev.BootOSIP, _ = GetIPSettingBySN(repo, sn) + return dev, nil +} + +// convert2Combind 将模型层的CombinedDevice转换成服务层的CombinedDevice。 +func convert2Combind(repo model.Repo, conf *config.Config, mcd *model.CombinedDevice) (*CombinedDevice, error) { + scd := CombinedDevice{ + DevicePageResp: DevicePageResp{ + ID: mcd.ID, + FixedAssetNum: mcd.FixedAssetNumber, + SN: mcd.SN, + Vendor: mcd.Vendor, + Model: mcd.DevModel, + PowerStatus: mcd.PowerStatus, + Arch: mcd.Arch, + Usage: mcd.Usage, + Category: mcd.Category, + OOBIP: mcd.OOBIP, + OOBUser: mcd.OOBUser, + IDC: &IDCSimplify{ID: mcd.IDCID}, + ServerRoom: &ServerRoomSimplify{ID: mcd.ServerRoomID}, + ServerCabinet: &ServerCabinetSimplify{ID: mcd.CabinetID}, + //ServerUSite: &ServerUSiteSimplify{ID: *mcd.USiteID}, + HardwareRemark: mcd.HardwareRemark, + RAIDRemark: mcd.RAIDRemark, + StartedAt: times.ISOTime(mcd.StartedAt).ToTimeStr(), + OnShelveAt: times.ISOTime(mcd.OnShelveAt).ToTimeStr(), + OperationStatus: mcd.OperationStatus, + IntranetIP: mcd.IntranetIP, //业务IP + ExtranetIP: mcd.ExtranetIP, + IntranetIPv6: mcd.IntranetIPv6, //业务IPv6 + ExtranetIPv6: mcd.ExtranetIPv6, + OriginNode: mcd.OriginNode, + OriginNodeIP: mcd.OriginNodeIP, + OrderNumber: mcd.OrderNumber, + CreatedAt: times.ISOTime(mcd.CreatedAt).ToDateStr(), + UpdatedAt: times.ISOTime(mcd.UpdatedAt).ToDateStr(), + }, + DeployStatus: mcd.DeployStatus, + InstallProgress: mcd.InstallProgress, + BootOSIP: mcd.BootOSIP, //bootos临时IP + BootOSMac: mcd.BootOSMac, + Remark: mcd.Remark, + OS: mcd.OS, + ImageTemplate: ImageTemplateSimplify{ + ID: mcd.ImageTemplateID, + Name: mcd.ImageTemplateName, + }, + HardwareTemplate: HardwareTemplateSimplify{ + ID: mcd.HardwareTemplateID, + Name: mcd.HardwareTemplateName, + }, + Hostname: mcd.Hostname, + Inspection: InspectionSimplify{ + RunStatus: mcd.InspectionRunStatus, + Result: mcd.InspectionResult, + Remark: mcd.InspectionRemark, + }, + DeviceLifecycleDetailPage: DeviceLifecycleDetailPage{ + AssetBelongs : mcd.AssetBelongs, + Owner : mcd.Owner, + IsRental : mcd.IsRental, + MaintenanceServiceProvider : mcd.MaintenanceServiceProvider, + MaintenanceService : mcd.MaintenanceService, + LogisticsService : mcd.LogisticsService, + MaintenanceServiceDateBegin : times.ISOTime(mcd.MaintenanceServiceDateBegin).ToDateStr(), + MaintenanceServiceDateEnd : times.ISOTime(mcd.MaintenanceServiceDateEnd).ToDateStr(), + MaintenanceServiceStatus : mcd.MaintenanceServiceStatus, + DeviceRetiredDate : times.ISOTime(mcd.DeviceRetiredDate).ToDateStr(), + }, + } + if mcd.USiteID != nil { + scd.DevicePageResp.ServerUSite = &ServerUSiteSimplify{ID: *mcd.USiteID} + } + if mcd.OOBUser == "" || mcd.OOBPassword == "" { + history, _ := repo.GetLastOOBHistoryBySN(mcd.SN) + mcd.OOBUser = history.UsernameNew + mcd.OOBPassword = history.PasswordNew + } + if mcd.OOBPassword != "" { + password, err := utils.AESDecrypt(mcd.OOBPassword, []byte(conf.Crypto.Key)) + if err != nil { + return nil, err + } + scd.DevicePageResp.OOBPassword = string(password) + } + + //idc + if idc, err := repo.GetIDCByID(mcd.IDCID); err == nil { + scd.DevicePageResp.IDC.Name = idc.Name + } + //server_room + if room, err := repo.GetServerRoomByID(mcd.ServerRoomID); err == nil { + scd.DevicePageResp.ServerRoom.Name = room.Name + } + //server_cabinet + if cabinet, err := repo.GetServerCabinetByID(mcd.CabinetID); err == nil { + scd.DevicePageResp.ServerCabinet.Number = cabinet.Number + } + //server_usite + if mcd.USiteID != nil { + if u, err := repo.GetServerUSiteByID(*mcd.USiteID); err == nil { + scd.DevicePageResp.ServerUSite.Number = u.Number + } + } + + //store_room + if mcd.StoreRoomID != 0 { + if stroom, _ := repo.GetStoreRoomByID(mcd.StoreRoomID); stroom != nil { + scd.DevicePageResp.StoreRoom = &StoreRoomSimplify{ID: mcd.StoreRoomID, Name: stroom.Name} + } + } + + if mcd.VCabinetID != 0 { + if vc, _ := repo.GetVirtualCabinetByID(mcd.VCabinetID); vc != nil { + scd.DevicePageResp.VCabinet = &VCabinetSimplify{ID: mcd.VCabinetID, Number: vc.Number} + } + } + + if mcd.CPU != "" { + _ = json.Unmarshal([]byte(mcd.CPU), &scd.CPU) + } + if mcd.Memory != "" { + _ = json.Unmarshal([]byte(mcd.Memory), &scd.Memory) + } + if mcd.Disk != "" { + _ = json.Unmarshal([]byte(mcd.Disk), &scd.LogicDisk) + } + if mcd.DiskSlot != "" { + _ = json.Unmarshal([]byte(mcd.DiskSlot), &scd.PhysicalDrive) + } + if mcd.NIC != "" { + _ = json.Unmarshal([]byte(mcd.NIC), &scd.NIC) + } + if mcd.Motherboard != "" { + _ = json.Unmarshal([]byte(mcd.Motherboard), &scd.Motherboard) + } + if mcd.RAID != "" { + _ = json.Unmarshal([]byte(mcd.RAID), &scd.RAID) + } + if mcd.OOB != "" { + _ = json.Unmarshal([]byte(mcd.OOB), &scd.OOB) + } + if mcd.BIOS != "" { + _ = json.Unmarshal([]byte(mcd.BIOS), &scd.BIOS) + } + if mcd.Fan != "" { + _ = json.Unmarshal([]byte(mcd.Fan), &scd.Fan) + } + if mcd.Power != "" { + _ = json.Unmarshal([]byte(mcd.Power), &scd.Power) + } + if mcd.HBA != "" { + _ = json.Unmarshal([]byte(mcd.HBA), &scd.HBA) + } + if mcd.PCI != "" { + _ = json.Unmarshal([]byte(mcd.PCI), &scd.PCI) + } + if mcd.LLDP != "" { + _ = json.Unmarshal([]byte(mcd.LLDP), &scd.LLDP) + } + if mcd.DeviceLifecycleDeatail.LifecycleLog != "" { + _ = json.Unmarshal([]byte(mcd.DeviceLifecycleDeatail.LifecycleLog), &scd.DeviceLifecycleDetailPage.LifecycleLog) + } + return &scd, nil +} + +//UpdateDeviceBySN 修改指定SN的物理设备 +func UpdateDeviceBySN(log logger.Logger, repo model.Repo, conf *config.Config, reqData *UpdateDevicesReq) (*model.Device, error) { + mod, err := repo.GetDeviceByID(reqData.ID) + if err != nil { + return nil, err + } + //记录一下原机位 + originUsiteID := mod.USiteID + + mod.FixedAssetNumber = reqData.FixedAssetNum + mod.SN = reqData.SN + mod.Vendor = reqData.Vendor + mod.DevModel = reqData.Model + mod.Usage = reqData.Usage + mod.Category = reqData.Category + mod.IDCID = reqData.IDCID + mod.ServerRoomID = reqData.ServerRoomID + mod.CabinetID = reqData.CabinetID + mod.USiteID = &reqData.USiteID + mod.StoreRoomID = reqData.StoreRoomID + mod.VCabinetID = reqData.VCabinetID + mod.HardwareRemark = reqData.HardwareRemark + mod.RAIDRemark = reqData.RAIDRemark + mod.StartedAt = time.Now() + mod.StartedAt = time.Now() + + if reqData.StartedAt != "" { + startedAt, _ := time.Parse(times.DateTimeLayout, reqData.StartedAt) + mod.StartedAt = startedAt + } + + if reqData.OnShelveAt != "" { + onShelveAt, _ := time.Parse(times.DateTimeLayout, reqData.OnShelveAt) + mod.OnShelveAt = onShelveAt + } + mod.OperationStatus = reqData.OperationStatus + if mod.OOBInit == "" { + mod.OOBInit = model.EmptyJSONObject + } + _, err = repo.SaveDevice(mod) + if err != nil { + return nil, err + } + + //如果机位变了,修改机位占用状态,A->B,则A释放,B占用 + if originUsiteID != mod.USiteID { + if originUsiteID != nil { + if _, err = repo.BatchUpdateServerUSitesStatus([]uint{*originUsiteID}, model.USiteStatFree); err != nil { + log.Errorf("update server_usite status failed, usite_id :%s", reqData.USiteID) + } + } + if _, err = repo.BatchUpdateServerUSitesStatus([]uint{reqData.USiteID}, model.USiteStatUsed); err != nil { + log.Errorf("update server_usite status failed, usite_id :%s", reqData.USiteID) + } + } + return mod, nil +} + +//UpdateDeviceOperationStatusBySN 修改指定SN的物理设备的部署状态 +func UpdateDeviceOperationStatusBySN(log logger.Logger, repo model.Repo, conf *config.Config, reqData *UpdateDevicesOperationStatusReq) (*model.Device, error) { + mod, err := repo.GetDeviceByFixAssetNumber(reqData.FixedAssetNum) + if err != nil || mod == nil { + mod, err = repo.GetDeviceBySN(reqData.SN) + if err != nil { + return nil, err + } + } + + mod.UpdatedAt = time.Now() + mod.Updater = reqData.LoginName + mod.OperationStatus = reqData.OperationStatus + + _, err = repo.SaveDevice(mod) + if err != nil { + return nil, err + } + return mod, nil +} + +//BatchUpdateDevices 批量修改设备状态,用途等 +func BatchUpdateDevices(log logger.Logger, repo model.Repo, conf *config.Config, reqData *BatchUpdateDevicesReq) (affected int, err error) { + for _, d := range reqData.Devices { + mod, err := repo.GetDeviceByFixAssetNumber(d.FixedAssetNum) + if err != nil || mod == nil { + mod, err = repo.GetDeviceBySN(d.SN) + if err != nil { + return affected, err + } + } + + mod.UpdatedAt = time.Now() + mod.Updater = reqData.LoginName + mod.OperationStatus = d.OperationStatus + mod.Usage = d.Usage + mod.HardwareRemark = d.HardwareRemark + + _, err = repo.UpdateDevice(mod) + if err != nil { + return affected, err + } + affected++ + } + return +} + +//DeleteDevices 批量删除物理设备 +func DeleteDevices(log logger.Logger, repo model.Repo, reqData *DeleteDevicesReq) (totalAffected int64, err error) { + //统计一下关联订单号的数量,用于更新订单状态 + var mOrderAmount = make(map[string]int, 0) + //以ID为参数 + if len(reqData.IDs) != 0 { + for _, id := range reqData.IDs { + log.Debugf("deleting device id: %d ", id) + dev, err := repo.GetDeviceByID(id) + if err != nil { + log.Errorf("delete device id: %d not exist", id) + continue + //return totalAffected, err + } + //设备的状态必须是待部署OR特殊设备 + if dev.Category != "特殊设备" && dev.OperationStatus != model.DevOperStatPreDeploy { + log.Errorf("device SN: %s operation status: %s is not pre_deploy, can't be deleted", dev.SN, dev.OperationStatus) + err = fmt.Errorf("[业务校验]设备SN: %s运营状态: %s不是待部署(pre_deploy),不允许删除", dev.SN, dev.OperationStatus) + return totalAffected, err + } + //释放机位资源 + if dev.USiteID != nil { + _, err = BatchUpdateServerUSitesStatus(repo, []uint{*dev.USiteID}, model.USiteStatFree) + if err != nil { + log.Errorf("free usite: %d fail", dev.USiteID) + return totalAffected, err + } + } + //释放IP资源(若存在) + if err = repo.UnassignIPsBySN(dev.SN); err != nil { + log.Error("free IP sources fail") + return totalAffected, err + } + //统计删除的设备涉及的订单以及数量 + if dev.OrderNumber != "" { + mOrderAmount[dev.OrderNumber]++ + } + //删除装机参数 + if _, err = repo.DeleteDeviceSettingBySN(dev.SN); err != nil { + log.Errorf("device SN: %s delete device_setting fail", dev.SN) + return totalAffected, err + } + //删除设备生命周期记录 + if _, err = repo.RemoveDeviceLifecycleBySN(dev.SN); err != nil { + log.Errorf("device SN: %s delete device_lifecycle fail", dev.SN) + return totalAffected, err + } + if centos6.IsPXEUEFI(log, repo, dev.SN) { + _ = centos6.DropConfigurations(log, repo, dev.SN) // TODO 为支持centos6的UEFI方式安装而临时增加的逻辑,后续会删除。 + } + + affected, err := repo.RemoveDeviceByID(id) + if err == nil { + totalAffected += affected + } + } + } + // 以SN为参数 + if len(reqData.SNs) != 0 { + for _, sn := range reqData.SNs { + log.Debugf("deleting device sn: %s ", sn) + dev, err := repo.GetDeviceBySN(sn) + if err != nil { + log.Errorf("delete device sn: %s not exist", sn) + continue + } + //标准设备的状态必须是待部署OR特殊设备 + if dev.Category != "特殊设备" && dev.OperationStatus != model.DevOperStatPreDeploy { + log.Errorf("device SN: %s operation status: %s is not pre_deploy, can't be deleted", dev.SN, dev.OperationStatus) + err = fmt.Errorf("[业务校验]设备SN: %s运营状态: %s不是待部署(pre_deploy),不允许删除", dev.SN, dev.OperationStatus) + return totalAffected, err + } + //特殊设备的状态必须是已上架 + if dev.Category == "特殊设备" && dev.OperationStatus != model.DevOperStatOnShelve { + log.Errorf("special device SN: %s operation status: %s is not on_shelve, can't be deleted", dev.SN, dev.OperationStatus) + err = fmt.Errorf("[业务校验]特殊设备SN: %s运营状态: %s不是待部署(pre_deploy),不允许删除", dev.SN, dev.OperationStatus) + return totalAffected, err + } + //释放机位资源 + if dev.USiteID != nil { + _, err = BatchUpdateServerUSitesStatus(repo, []uint{*dev.USiteID}, model.USiteStatFree) + if err != nil { + log.Errorf("free usite: %d fail", dev.USiteID) + return totalAffected, err + } + } + //释放IP资源(若存在) + if err = repo.UnassignIPsBySN(dev.SN); err != nil { + log.Error("free IP sources fail") + return totalAffected, err + } + //统计删除的设备涉及的订单以及数量 + if dev.OrderNumber != "" { + mOrderAmount[dev.OrderNumber]++ + } + //删除装机参数 + if _, err = repo.DeleteDeviceSettingBySN(dev.SN); err != nil { + log.Errorf("device SN: %s delete device_setting fail", dev.SN) + return totalAffected, err + } + //删除设备生命周期记录 + if _, err = repo.RemoveDeviceLifecycleBySN(dev.SN); err != nil { + log.Errorf("device SN: %s delete device_lifecycle fail", dev.SN) + return totalAffected, err + } + if centos6.IsPXEUEFI(log, repo, dev.SN) { + _ = centos6.DropConfigurations(log, repo, dev.SN) // TODO 为支持centos6的UEFI方式安装而临时增加的逻辑,后续会删除。 + } + + affected, err := repo.RemoveDeviceBySN(sn) + if err == nil { + totalAffected += affected + } + } + } + //更新关联的订单到货数量和订单状态 + for orderNum, deleteCount := range mOrderAmount { + if err = UpdateOrderByDelete(log, repo, orderNum, deleteCount); err != nil { + log.Errorf("faile to update order(%s) when deleting pre_deploy devices ", orderNum) + err = fmt.Errorf("删除待部署设备更新订单%s失败", orderNum) + return totalAffected, err + } + } + + return +} + +// GetDevicePowerStatusBySN 根据SN获取设置开电状态 +func GetDevicePowerStatusBySN(log logger.Logger, repo model.Repo, conf *config.Config, sn string) (powerStatus string, err error) { + dev, err := repo.GetDeviceBySN(sn) + if err != nil { + return "", err + } + + domain := conf.Server.OOBDomain + key := conf.Crypto.Key + + if dev.OOBPassword == "" || dev.OOBUser == "" { + log.Warnf("设备带外用户或密码为空,尝试找回,[SN:%s]", sn) + history, err := repo.GetLastOOBHistoryBySN(sn) + if err != nil { + log.Errorf("find back oob history by sn:%s fail,%s", sn, err.Error()) + return fmt.Sprintf("find back oob history by sn:%s fail", sn), + errors.New("带外信息(用户密码)不存在") + } + dev.OOBUser = history.UsernameNew + dev.OOBPassword = history.PasswordNew + } + + password, err := utils.AESDecrypt(dev.OOBPassword, []byte(key)) + if err != nil { + return "", fmt.Errorf("解密失败,%s", dev.OOBPassword) + } + + isOn, err := OOBPowerStatus(log, oob.TransferHostname2IP(log, repo, dev.SN, utils.GetOOBHost(dev.SN, dev.Vendor, domain)), + dev.OOBUser, string(password), dev.OOBPassword) + if err != nil { + return "", err + } + + powerStatus = model.PowerStatusOff + if isOn { + powerStatus = model.PowerStatusOn + } + + if dev.PowerStatus != powerStatus { + dev.PowerStatus = powerStatus + repo.SaveDevice(dev) + } + + return +} + +// CollectedDevice 采集到的设备信息结构体 +type CollectedDevice struct { + device.Device + OriginNode string + OriginNodeIP string +} + +// FieldMap 请求字段映射 +func (reqData *CollectedDevice) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.SN: "sn", + &reqData.Vendor: "vendor", + &reqData.Model: "model", + &reqData.Arch: "arch", + &reqData.BootOSIP: "bootos_ip", + &reqData.BootOSMac: "bootos_mac", + &reqData.NICDevice: "nic_device", + &reqData.CPU: "cpu", + &reqData.Memory: "memory", + &reqData.Disk: "disk", + &reqData.DiskSlot: "disk_slot", + &reqData.NIC: "nic", + &reqData.Motherboard: "motherboard", + &reqData.OOB: "oob", + &reqData.BIOS: "bios", + &reqData.RAID: "raid", + &reqData.Power: "power", + &reqData.Fan: "fan", + &reqData.PCI: "pci", + &reqData.HBA: "hba", + &reqData.LLDP: "lldp", + &reqData.Extra: "extra", + } +} + +// Validate 结构体数据校验 +func (reqData *CollectedDevice) Validate(req *http.Request, errs binding.Errors) binding.Errors { + if reqData.SN == "" { + errs.Add([]string{"sn"}, binding.RequiredError, "设备序列号'SN'不能为空") + return errs + } + if reqData.Vendor == "" { + errs.Add([]string{"vendor"}, binding.RequiredError, "厂商名'vendor'不能为空") + return errs + } + return errs +} + +func (reqData *CollectedDevice) nicJSON() (json string) { + if reqData.NIC == nil { + return json + } + return string(reqData.NIC.ToJSON()) +} + +func (reqData *CollectedDevice) cpuJSON() (json string) { + if reqData.CPU == nil { + return json + } + return string(reqData.CPU.ToJSON()) +} + +func (reqData *CollectedDevice) memJSON() (json string) { + if reqData.Memory == nil { + return json + } + return string(reqData.Memory.ToJSON()) +} + +func (reqData *CollectedDevice) diskJSON() (json string) { + if reqData.Disk == nil { + return json + } + return string(reqData.Disk.ToJSON()) +} + +func (reqData *CollectedDevice) boardJSON() (json string) { + if reqData.Motherboard == nil { + return json + } + return string(reqData.Motherboard.ToJSON()) +} + +func (reqData *CollectedDevice) diskSlotJSON() (json string) { + if reqData.DiskSlot == nil { + return json + } + return string(reqData.DiskSlot.ToJSON()) +} + +func (reqData *CollectedDevice) oobJSON() (json string) { + if reqData.OOB == nil { + return json + } + return string(reqData.OOB.ToJSON()) +} + +func (reqData *CollectedDevice) biosJSON() (json string) { + if reqData.BIOS == nil { + return json + } + return string(reqData.BIOS.ToJSON()) +} + +func (reqData *CollectedDevice) raidJSON() (json string) { + if reqData.RAID == nil || len(reqData.RAID.Items) <= 0 { + return json + } + return string(reqData.RAID.ToJSON()) +} + +func (reqData *CollectedDevice) fanJSON() (json string) { + if reqData.Fan == nil { + return json + } + return string(reqData.Fan.ToJSON()) +} + +func (reqData *CollectedDevice) powerJSON() (json string) { + if reqData.Power == nil { + return json + } + return string(reqData.Power.ToJSON()) +} + +func (reqData *CollectedDevice) hbaJSON() (json string) { + if reqData.HBA == nil { + return json + } + return string(reqData.HBA.ToJSON()) +} + +func (reqData *CollectedDevice) pciJSON() (json string) { + if reqData.PCI == nil { + return json + } + return string(reqData.PCI.ToJSON()) +} + +func (reqData *CollectedDevice) lldpJSON() (json string) { + if reqData.LLDP == nil { + return json + } + return string(reqData.LLDP.ToJSON()) +} + +func (reqData *CollectedDevice) extraJSON() (json string) { + if reqData.Extra == nil { + return json + } + return string(reqData.Extra.ToJSON()) +} + +// SaveCollectedDevice 保存采集到的设备信息 +func SaveCollectedDevice(log logger.Logger, repo model.Repo, reqData *CollectedDevice) (err error) { + var cpusum, memsum, disksum uint + if reqData.CPU != nil && reqData.CPU.TotalCores > 0 { + cpusum = uint(reqData.CPU.TotalCores) + } + if reqData.Memory != nil && reqData.Memory.TotalSizeMB > 0 { + memsum = uint(reqData.Memory.TotalSizeMB) + } + if reqData.Disk != nil && reqData.Disk.TotalSizeGB > 0 { + disksum = uint(reqData.Disk.TotalSizeGB) + } + + dev := model.CollectedDevice{ + OriginNode: reqData.OriginNode, + OriginNodeIP: reqData.OriginNodeIP, + SN: reqData.SN, + Vendor: reqData.Vendor, + ModelName: reqData.Model, + Arch: reqData.Arch, + BootOSIP: reqData.BootOSIP, + BootOSMac: reqData.BootOSMac, + CPUSum: cpusum, + CPU: reqData.cpuJSON(), + MemorySum: memsum, + Memory: reqData.memJSON(), + DiskSum: disksum, + Disk: reqData.diskJSON(), + DiskSlot: reqData.diskSlotJSON(), + NIC: reqData.nicJSON(), + NICDevice: reqData.NICDevice, + Motherboard: reqData.boardJSON(), + RAID: reqData.raidJSON(), + OOB: reqData.oobJSON(), + BIOS: reqData.biosJSON(), + Fan: reqData.fanJSON(), + Power: reqData.powerJSON(), + HBA: reqData.hbaJSON(), + PCI: reqData.pciJSON(), + LLDP: reqData.lldpJSON(), + Extra: reqData.extraJSON(), + } + return repo.SaveCollectedDeviceBySN(&dev) +} + +// CheckUnique 检查字段重复性, 传入列表,及需要排查的字段 +//检查的基本思路是将被检查元素作为map的key,遍历源数据,发现重复则value+1,最后检查是否value大于1 +func CheckUnique(importDatas [][]string) (valid bool, err error) { + //校验SN,固资编号,机位编号(机架编号+机位编号)唯一性 + //有几个检查的字段,就定义几个数组元素来做检查 + checkers := make([]map[interface{}]int, 3) + for i := 0; i < 3; i++ { + checkers[i] = make(map[interface{}]int) + } + for i, d := range importDatas { + if i == 0 { + continue + } + if d[0] != "" { + checkers[0][d[0]]++ + } + checkers[1][d[1]]++ + checkers[2][fmt.Sprintf("%s+%s+%s", d[5], d[6], d[7])]++ + } + + for k, v := range checkers[0] { + if v > 1 { + return false, fmt.Errorf("[数据校验]固资编号值:%v不允许重复", k) + } + } + for k, v := range checkers[1] { + if v > 1 { + return false, fmt.Errorf("[数据校验]序列号(SN)值:%v不允许重复", k) + } + } + for k, v := range checkers[2] { + if v > 1 { + return false, fmt.Errorf("[数据校验]机位编号值(机房名称+机架编号+机位编号):%v不允许重复", k) + } + } + return true, nil +} + +// DevicePageByTorReq 物理机分页列表搜索字段 +type DevicePageByTorReq struct { + //用途 'TDSQL','APP','CVM','TGW','NAS','Other' + Usage string `json:"usage"` + // Tor分组 + Tor string `json:"tor"` + Page int64 + PageSize int64 +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *DevicePageByTorReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.Usage: "usage", + &reqData.Tor: "tor", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + } +} + +// Validate DevicePageByTorReq +func (reqData *DevicePageByTorReq) Validate(request *http.Request, errs binding.Errors) binding.Errors { + if reqData.Tor == "" { + errs.Add([]string{"tor"}, binding.RequiredError, "TOR不能为空") + return errs + } + + // 默认为CVM + if reqData.Usage == "" { + reqData.Usage = "CVM" + } + return errs +} + +// GetDeviceByTorPage 根据TOR分组查询物理机分页列表 +func GetDeviceByTorPage(log logger.Logger, repo model.Repo, conf *config.Config, reqData *DevicePageByTorReq) (pg *page.Page, err error) { + if reqData.PageSize <= 0 || reqData.PageSize > 100 { + reqData.PageSize = 20 + } + if reqData.Page < 0 { + reqData.Page = 1 + } + + var devs []*model.Device + if reqData.Tor != "" { + // 根据tor找到对应的网络设备 + tors := strings.Split(reqData.Tor, ",") + nd, err := repo.GetNetworkDeviceByTORS(tors...) + if err != nil { + return nil, err + } + // 根据对于的网络设备找到对应的机位 + if len(nd) > 0 { + var ndName []string + for k := range nd { + ndName = append(ndName, nd[k].Name) + } + suid, err := repo.GetServerUsiteByNetworkDeviceName(ndName) + if err != nil { + return nil, err + } + if len(suid) > 0 { + devs, err = repo.GetDevicesByUSiteIDS(suid, reqData.Usage) + if err != nil { + return nil, err + } + } + } + } + + pager := page.NewPager(reflect.TypeOf(&DevicePageResp{}), reqData.Page, reqData.PageSize, int64(len(devs))) + for i := range devs { + dev, err := conver2DevicePagesResp(log, repo, conf, devs[i]) + if err != nil { + return nil, err + } + pager.AddRecords(dev) + } + return pager.BuildPage(), nil +} + +//OperationStatusTransfer 运行状态值和数据库存储值的转换 +func OperationStatusTransfer(status string, reverse bool) string { + mStatus := map[string]string{ + "运行中(需告警)": "run_with_alarm", + "运行中(无需告警)": "run_without_alarm", + "重装中": "reinstalling", + "搬迁中": "moving", + "待退役": "pre_retire", + "退役中": "retiring", + "已退役": "retired", + "待部署": "pre_deploy", + "已上架": "on_shelve", + "回收中": "recycling", + "维护中": "maintaining", + "待搬迁": "pre_move", + "库房中": "in_store", + } + if !reverse { + if val, ok := mStatus[status]; ok { + return val + } + } else { + for key, val := range mStatus { + if val == status { + return key + } + } + } + return "" +} + +//全局计数器 +var GlobalCount = make(map[string]int, 0) + +// 自动生成固资编号 +func GenFixedAssetNumber(repo model.Repo) (string, error) { + //格式:WDEV+YYMM+0001 + //现在是几月:1906 + prefix := "WDEV" + m := time.Now().Format("0601") + if count, ok := GlobalCount[m]; ok && count != 0 { + GlobalCount[m]++ + } else { + //如果是服务重启,则需要从db里重新获取下最大的固资编号 + //如果是新月份,计数从1开始计 + currentMax, err := repo.GetMaxFixedAssetNumber(m) + if currentMax == "" || err != nil { + GlobalCount[m] = 1 + } else { + currentMaxInt, err := strconv.Atoi(strings.TrimPrefix(currentMax, prefix+m)) + if err != nil { + return "", err + } + GlobalCount[m] = currentMaxInt + 1 + } + } + return fmt.Sprintf("%s%s%04d", prefix, m, GlobalCount[m]), nil +} + +func validOperationStatus(s string) bool { + switch s { + case model.DevOperStatRunWithoutAlarm: + case model.DevOperStatRunWithAlarm: + case model.DevOperStateRetired: + case model.DevOperStatMoving: + case model.DevOperStatOnShelve: + case model.DevOperStatPreDeploy: + case model.DevOperStatPreRetire: + case model.DevOperStatRetiring: + case model.DevOperStatRecycling: + case model.DevOperStatPreMove: + case model.DevOperStatMaintaining: + case model.DevOperStatReinstalling: + default: + return false + } + return true +} + + +//NewDevice API新增设备所需字段 +type NewDevice struct { + //固资编号 + FixedAssetNum string `json:"fixed_asset_number"` + //序列号 + SN string `json:"sn"` + //厂商 + Vendor string `json:"vendor"` + //型号 + Model string `json:"model"` + // CPU架构 + //Arch string `json:"arch"` + //用途 'TDSQL','APP','CVM','TGW','NAS','Other' + Usage string `json:"usage"` + //分类 + Category string `json:"category"` + //机房管理单元名称 + ServerRoomName string `json:"server_room_name"` + //机架编号 + CabinetNum string `json:"server_cabinet_number"` + //机位编号 + USiteNum string `json:"server_usite_number"` + //库房管理单元名称-与机房管理单元-机架编号-机位互斥 + StoreRoomName string `json:"store_room_name"` + //虚拟货架编号-与机房管理单元-机架编号-机位互斥 + VCabinetNum string `json:"virtual_cabinet_number"` + //硬件说明 + HardwareRemark string `json:"hardware_remark"` + //RAID说明 + RAIDRemark string `json:"raid_remark"` + // OOB初始用户密码,':'分隔,主要针对的是旧机器导入使用,新机器如果带外是出厂默认,可以缺省 + OOBInit string `json:"oob_init"` + //OriginNodeIP proxy节点IP + //OriginNodeIP string `json:"origin_node_ip"` //废弃 + //启用时间 + StartedAt string `json:"started_at"` + //上架时间 + OnShelveAt string `json:"onshelve_at"` + //关联订单号(非必填) + OrderNumber string `json:"order_number"` + // 非标的特殊设备 + IsSpecialDevice bool `json:"is_special_device"` + // 非标的特殊设备:是否分配IPv4 yes|no + NeedExtranetIPv4 string `json:"need_extranet_ipv4"` + NeedIntranetIPv4 string `json:"need_intranet_ipv4"` + // 非标的特殊设备:操作系统 + OS string `json:"os"` + //设备生命周期相关,详情参考 model.DeviceLifecycle + AssetBelongs string `json:"asset_belongs"` + Owner string `json:"owner"` + IsRental string `json:"is_rental"` + MaintenanceServiceProvider string `json:"maintenance_service_provider"` + MaintenanceService string `json:"maintenance_service"` + LogisticsService string `json:"logistics_service"` + MaintenanceServiceDateBegin string `json:"maintenance_service_date_begin"` + MaintenanceServiceDateEnd string `json:"maintenance_service_date_end"` + MaintenanceServiceStatus string `json:"maintenance_service_status"` + // 数据校验用 + ErrMsgContent string `json:"content"` + //以下字段是通过名称关联到 + idcID uint //数据中心ID + serverRoomID uint //机房管理单元ID + storeRoomID uint //机房管理单元ID + cabinetID uint //机架ID + vcabinetID uint //机架ID + uSiteID uint //机位ID +} + + +// NewDevicesReq 请求API新增设备结构体 +type NewDevicesReq struct { + NewDevices NewDevicesList + CurrentUser *model.CurrentUser +} + +type NewDevicesList []*NewDevice + + +//checkLength NewDevice数据做字段长度校验 +func (newDev *NewDevice) checkLength() { + leg := len(newDev.SN) + if leg == 0 || leg > 255 { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("必填项校验:序列号长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(newDev.Vendor) + if leg == 0 || leg > 255 { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("必填项校验:厂商长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(newDev.Model) + if leg == 0 || leg > 255 { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("必填项校验:型号长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(newDev.Usage) + if leg == 0 || leg > 255 { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("必填项校验:用途长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(newDev.Category) + if leg == 0 || leg > 255 { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("必填项校验:设备类型长度为(%d)(不能为空,不能大于255)", leg) + } + if len(newDev.ServerRoomName) != 0 && len(newDev.StoreRoomName) != 0 { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("必填项校验:机房管理单元名称与库房管理单元名称不能同时存在") + } else if len(newDev.ServerRoomName) == 0 && len(newDev.StoreRoomName) == 0 { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("必填项校验:机房管理单元名称与库房管理单元名称不能同时为空") + } else if len(newDev.ServerRoomName) != 0 { + leg = len(newDev.ServerRoomName) + if leg > 255 { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("必填项校验:机房管理单元名称长度为(%d)(不能大于255)", leg) + } + leg = len(newDev.CabinetNum) + if leg == 0 || leg > 255 { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("必填项校验:机架编号长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(newDev.USiteNum) + if leg == 0 || leg > 255 { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("必填项校验:机位编号长度为(%d)(不能为空,不能大于255)", leg) + } + } else if len(newDev.StoreRoomName) != 0 { + leg = len(newDev.StoreRoomName) + if leg > 255 { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("必填项校验:库房管理单元名称长度为(%d)(不能大于255)", leg) + } + leg = len(newDev.VCabinetNum) + if leg == 0 || leg > 255 { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("必填项校验:虚拟货架编号长度为(%d)(不能为空,不能大于255)", leg) + } + } + leg = len(newDev.StartedAt) + if leg == 0 || leg > 255 { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("必填项校验:启用时间长度为(%d)(不能为空,不能大于255)", leg) + } + if !strings.Contains(newDev.StartedAt, "-") { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + "启用时间格式须为:YYYY-MM-DD" + } + leg = len(newDev.OnShelveAt) + if leg == 0 || leg > 255 { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("必填项校验:上架时间长度为(%d)(不能为空,不能大于255)", leg) + } + if !strings.Contains(newDev.OnShelveAt, "-") { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + "上架时间格式须为:YYYY-MM-DD" + } + leg = len(newDev.MaintenanceServiceDateBegin) + if leg == 0 || leg > 255 { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("必填项校验:维保起始日期长度为(%d)(不能为空,不能大于255)", leg) + } + if !strings.Contains(newDev.MaintenanceServiceDateBegin, "-") { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + "维保起始日期格式须为:YYYY-MM-DD" + } + leg = len(newDev.MaintenanceServiceDateEnd) + if leg == 0 || leg > 255 { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("必填项校验:维保截止日期长度为(%d)(不能为空,不能大于255)", leg) + } + if !strings.Contains(newDev.MaintenanceServiceDateEnd, "-") { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + "维保截止日期格式须为:YYYY-MM-DD" + } + //硬件说明 + //RAID说明 + //带外说明 + //暂时不做检验 +} + + +//validate NewDevice数据基本验证 +func (newDev *NewDevice) validate(repo model.Repo) error { + //机房-机架-机位校验 + if newDev.ServerRoomName != "" { + srs, err := repo.GetServerRoomByName(newDev.ServerRoomName) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if err == gorm.ErrRecordNotFound || srs == nil { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("机房名(%s)不存在", newDev.ServerRoomName) + } else if srs != nil { + newDev.idcID = srs.IDCID + newDev.serverRoomID = srs.ID + } + //机架 + cabinet, err := repo.GetServerCabinetByNumber(newDev.serverRoomID, newDev.CabinetNum) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if err == gorm.ErrRecordNotFound || cabinet == nil { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("机架编号(%s)不存在", newDev.CabinetNum) + } else { + newDev.cabinetID = cabinet.ID + } + //机位 + uSite, err := repo.GetServerUSiteByNumber(newDev.cabinetID, newDev.USiteNum) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if err == gorm.ErrRecordNotFound || uSite == nil { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("机位编号(%s)不存在, 机架编号(%s)", newDev.USiteNum, newDev.CabinetNum) + } else { + dev, _ := repo.GetDeviceBySN(newDev.SN) + if !CheckUSiteFree(repo, uSite.ID, dev) { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("机位编号(%s), 机架编号(%s)被占用或不可用", newDev.USiteNum, newDev.CabinetNum) + } else { + newDev.uSiteID = uSite.ID + } + } + } else if newDev.StoreRoomName != "" { + //库房校验 + srs, err := repo.GetStoreRoomByName(newDev.StoreRoomName) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if err == gorm.ErrRecordNotFound || srs == nil { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("库房(%s)不存在", newDev.StoreRoomName) + } else if srs != nil { + newDev.idcID = srs.IDCID + newDev.storeRoomID = srs.ID + } + //虚拟货架 + cabinet, err := repo.GetVirtualCabinets(&model.VirtualCabinet{ + StoreRoomID: newDev.storeRoomID, + Number: newDev.VCabinetNum, + }, nil, nil) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if err == gorm.ErrRecordNotFound || len(cabinet) <= 0 { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("虚拟货架(%s)不存在", newDev.VCabinetNum) + } else if len(cabinet) > 0 { + newDev.vcabinetID = cabinet[0].ID + } + } else { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("SN(%s)必须指定机房管理单元或库房管理单元", newDev.SN) + } + + if newDev.OOBInit != "" { + if !strings.Contains(newDev.OOBInit, ":") { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("带外用户密码初始值:%s格式不正确,应以':'分隔", newDev.OOBInit) + } + } + // 订单关联字段校验:IDC\设备类型\设备用途 + if newDev.OrderNumber != "" { + order, err := repo.GetOrderByNumber(newDev.OrderNumber) + if err != nil { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("订单(订单号:%s)不存在", newDev.OrderNumber) + } + if order != nil { + if order.IDCID != newDev.idcID { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("订单(订单号:%s)与设备(SN:%s)不属于同一个数据中心", newDev.OrderNumber, newDev.SN) + } + if order.Category != newDev.Category { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("订单(订单号:%s)的设备类型(%s) 与 设备(SN:%s)的设备类型(%s)不匹配", newDev.OrderNumber, order.Category, newDev.SN, newDev.Category) + } + if order.Usage != newDev.Usage { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("订单(订单号:%s)的用途(%s) 与 设备(SN:%s)的用途(%s)不匹配", newDev.OrderNumber, order.Usage, newDev.SN, newDev.Usage) + } + } + } + // 是否租赁 + if newDev.IsRental != model.YES && newDev.IsRental != model.NO { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("是否租赁 必须为 %s or %s", model.YES, model.NO) + } + // 维保状态校验 + if newDev.MaintenanceServiceStatus != model.MaintenanceServiceStatusUnderWarranty && newDev.MaintenanceServiceStatus != model.MaintenanceServiceStatusOutOfWarranty && newDev.MaintenanceServiceStatus != model.MaintenanceServiceStatusInactive { + var br string + if newDev.ErrMsgContent != "" { + br = "<br />" + } + newDev.ErrMsgContent += br + fmt.Sprintf("维保状态 必须为 %s or %s or %s", model.MaintenanceServiceStatusUnderWarranty, model.MaintenanceServiceStatusOutOfWarranty, model.MaintenanceServiceStatusInactive) + } + return nil +} + + +// SaveNewDevices 保存(新增) +func SaveNewDevices(log logger.Logger, repo model.Repo, conf *config.Config, reqData *NewDevicesReq) (succeedSNs []string, totalAffected int64, err error) { + if len(reqData.NewDevices) == 0 { + log.Error("NewDevices 参数不能为空") + return succeedSNs, totalAffected, fmt.Errorf("NewDevices 参数不能为空") + } + + // 用于导入后批量更新带外 + var devices []*model.Device + // 用于关联订单的信息更新 + var mOrderAmount = make(map[string]int, 0) + + for _, newDev := range reqData.NewDevices { + + log.Infof("Begin to save new device SN: %s ", newDev.SN) + defer log.Infof("End to save new device SN: %s ", newDev.SN) + //必填项校验 + newDev.checkLength() + //数据校验并转化数据中心、机房管理单元、机架、机位名称为对应的ID + err = newDev.validate(repo) + if err != nil { + return succeedSNs, totalAffected, err + } + if newDev.ErrMsgContent != "" { + log.Errorf("设备检验参数失败:%s", newDev.ErrMsgContent) + return succeedSNs, totalAffected, fmt.Errorf("设备检验参数失败:%s", newDev.ErrMsgContent) + } + //Device 设备结构体 + mod := &model.Device{ + SN: strings.TrimSpace(newDev.SN), //去除首尾空白 + Vendor: newDev.Vendor, + DevModel: newDev.Model, + Usage: newDev.Usage, + Category: newDev.Category, + IDCID: newDev.idcID, + //ServerRoomID: newDev.serverRoomID, + //CabinetID: newDev.cabinetID, + //USiteID: &newDev.uSiteID, + //StoreRoomID: newDev.storeRoomID, + //VCabinetID: newDev.vcabinetID, + HardwareRemark: newDev.HardwareRemark, + RAIDRemark: newDev.RAIDRemark, + OOBInit: "{}", + PowerStatus: model.PowerStatusOff, + OrderNumber: newDev.OrderNumber, + Creator: reqData.CurrentUser.LoginName, + //JSON type的字段需要默认赋空值 + CPU: "{}", + Memory: "{}", + Disk: "{}", + DiskSlot: "{}", + NIC: "{}", + Motherboard: "{}", + RAID: "{}", + OOB: "{}", + BIOS: "{}", + Fan: "{}", + Power: "{}", + HBA: "{}", + PCI: "{}", + Switch: "{}", + LLDP: "{}", + Extra: "{}", + } + //处理所有字段的多余空格字符 + utils.StructTrimSpace(mod) + //转换日期格式 + mod.StartedAt, _ = time.Parse(times.DateLayout, newDev.StartedAt) + if newDev.OnShelveAt != "" { + mod.OnShelveAt, _ = time.Parse(times.DateLayout, newDev.OnShelveAt) + } else { + mod.OnShelveAt = time.Now() + } + if newDev.ServerRoomName != "" { + mod.ServerRoomID = newDev.serverRoomID + mod.CabinetID = newDev.cabinetID + mod.USiteID = &newDev.uSiteID + //特殊设备默认无须部署,直接置为已上架 + if newDev.IsSpecialDevice { + mod.OperationStatus = model.DevOperStatOnShelve + } else { + mod.OperationStatus = model.DevOperStatPreDeploy + } + } else if newDev.StoreRoomName != "" { + mod.StoreRoomID = newDev.storeRoomID + mod.VCabinetID = newDev.vcabinetID + mod.OperationStatus = model.DevOperStatInStore + } else { + err = fmt.Errorf("SN:%s 未指定机房管理单元或者库房管理单元", newDev.SN) + return succeedSNs, totalAffected, err + } + if newDev.OOBInit != "" { + words := strings.Split(newDev.OOBInit, ":") + if len(words) == 2 { + ou := OOBUser{ + Username: words[0], + Password: words[1], + } + if b, err := json.Marshal(ou); err == nil { + mod.OOBInit = string(b) + } + } + } + //新增设备场景未指定固资号时,自动生成固资编号 + if newDev.FixedAssetNum == "" { + newDev.FixedAssetNum, err = GenFixedAssetNumber(repo) + mod.FixedAssetNumber = newDev.FixedAssetNum + if err != nil { + log.Errorf("generate fixed_asset number for SN:%s fail", newDev.SN) + return succeedSNs, totalAffected, fmt.Errorf("自动生成固资号失败:%v", err) + } + log.Debugf("自动生成固资号: %s", newDev.FixedAssetNum) + } else { + log.Debugf("非系统自动生成固资号: %s", newDev.FixedAssetNum) + mod.FixedAssetNumber = newDev.FixedAssetNum + } + + //默认电源状态 OFF + if mod.PowerStatus == "" { + mod.PowerStatus = model.PowerStatusOff + } + // 仅记录必要字段到“设备新增” + optDetail, err := convert2DetailOfOperationTypeAdd(repo, *mod) + if err != nil { + log.Errorf("Fail to convert Detail of OperationTypeAdd: %v", err) + } + // DeviceLifecycle 变更记录 + deviceLifecycleLog := []model.ChangeLog { + { + OperationUser: reqData.CurrentUser.LoginName, + OperationType: model.OperationTypeAdd, + OperationDetail: optDetail, + OperationTime: times.ISOTime(time.Now()).ToTimeStr(), + }, + } + b, _ := json.Marshal(deviceLifecycleLog) + // SaveDeviceLifecycleReq 结构体 + saveDevLifecycleReq := &SaveDeviceLifecycleReq { + DeviceLifecycleBase: DeviceLifecycleBase{ + FixedAssetNumber: newDev.FixedAssetNum, + SN: newDev.SN, + AssetBelongs: newDev.AssetBelongs, + Owner: newDev.Owner, + IsRental: newDev.IsRental, + MaintenanceServiceProvider: newDev.MaintenanceServiceProvider, + MaintenanceService: newDev.MaintenanceService, + LogisticsService: newDev.LogisticsService, + MaintenanceServiceStatus: newDev.MaintenanceServiceStatus, + LifecycleLog: string(b), + }, + } + saveDevLifecycleReq.MaintenanceServiceDateBegin, _ = time.Parse(times.DateLayout, newDev.MaintenanceServiceDateBegin) + saveDevLifecycleReq.MaintenanceServiceDateEnd, _ = time.Parse(times.DateLayout, newDev.MaintenanceServiceDateEnd) + // 通过订单编号获取资产归属、负责人、维保服务等内容 + // 若无订单编号则以参数输入为准 + if newDev.OrderNumber != "" { + order, err := repo.GetOrderByNumber(newDev.OrderNumber) + if err != nil { + log.Errorf("订单(订单号:%s)不存在", newDev.OrderNumber) + return succeedSNs, totalAffected, err + } + if order != nil { + saveDevLifecycleReq.AssetBelongs = order.AssetBelongs + saveDevLifecycleReq.Owner = order.Owner + saveDevLifecycleReq.IsRental = order.IsRental + saveDevLifecycleReq.MaintenanceServiceProvider = order.MaintenanceServiceProvider + saveDevLifecycleReq.MaintenanceService = order.MaintenanceService + saveDevLifecycleReq.LogisticsService = order.LogisticsService + saveDevLifecycleReq.MaintenanceServiceDateBegin = order.MaintenanceServiceDateBegin + saveDevLifecycleReq.MaintenanceServiceDateEnd = order.MaintenanceServiceDateEnd + } + } + //插入或者更新 + //查询是否已经存在 + dev, err := repo.GetDeviceBySN(newDev.SN) + if err != nil && err != gorm.ErrRecordNotFound { + return succeedSNs, totalAffected, err + } + if dev != nil { + // 特殊设备仅允许已上架、库房中重复导入 + if newDev.IsSpecialDevice { + if dev.OperationStatus == model.DevOperStatInStore || dev.OperationStatus == model.DevOperStatOnShelve { + log.Debugf("SpecialDevice SN %s already exist.Status is %s . Allow to update.", newDev.SN, dev.OperationStatus) + mod.ID = dev.ID + mod.CreatedAt = dev.CreatedAt + mod.UpdatedAt = time.Now() + mod.OperationStatus = dev.OperationStatus + } else { + log.Debugf("SpecialDevice SN %s already exist. Status is %s . Update is forbidden.", newDev.SN, dev.OperationStatus) + err = fmt.Errorf("特殊设备(SN:%s)导入失败,仅允许运营状态为[库房中|已上架]重复导入更新", newDev.SN) + return succeedSNs, totalAffected, err + } + } else { + if dev.OperationStatus == model.DevOperStatInStore || dev.OperationStatus == model.DevOperStatPreDeploy { + log.Debugf("Device SN %s already exist.Status is %s . Allow to update.", newDev.SN, dev.OperationStatus) + mod.ID = dev.ID + mod.OperationStatus = dev.OperationStatus + mod.CreatedAt = dev.CreatedAt + mod.UpdatedAt = time.Now() + } else { + log.Debugf("Device SN %s already exist. Status is %s . Update is forbidden.", newDev.SN, dev.OperationStatus) + err = fmt.Errorf("设备(SN:%s)导入失败,仅允许运营状态为[库房中|待部署]重复导入更新", newDev.SN) + return succeedSNs, totalAffected, err + } + } + } else { + // 首次新增时统计关联订单到货数量 + if newDev.OrderNumber != "" { + mOrderAmount[newDev.OrderNumber]++ + } + } + // DeviceLifecycle 查询是否已经存在 + devLifecycle, err := repo.GetDeviceLifecycleBySN(newDev.SN) + if err != nil && err != gorm.ErrRecordNotFound { + return succeedSNs, totalAffected, err + } + if devLifecycle != nil { + log.Debugf("DeviceLifecycle SN %s already exist.Update it.", newDev.SN) + saveDevLifecycleReq.ID = devLifecycle.ID + } + // 首次新增需先保存设备,后续才可支持分配IP + if _, err = repo.SaveDevice(mod); err != nil { + log.Debug(err) + return succeedSNs, totalAffected, err + } + // 保存或更新 DeviceLifecycle + if err = SaveDeviceLifecycle(log, repo, saveDevLifecycleReq); err != nil { + log.Debug(err) + return succeedSNs, totalAffected, err + } + // 特殊设备默认无需进行OS部署,指定用途、OS、运营状态 + if newDev.IsSpecialDevice { + mod.Usage = model.DevUsageSpecialDev + //分配IP + var inIP, exIP *model.IP + if newDev.NeedIntranetIPv4 == model.YES { + if inIP, err = repo.AssignIntranetIP(newDev.SN); err != nil { + err = fmt.Errorf("SN:%s分配内网失败,err:%v", newDev.SN, err) + return succeedSNs, totalAffected, err + } + } else { + //需要尝试释放IP + if _, err = repo.ReleaseIP(newDev.SN, model.Intranet); err != nil { + err = fmt.Errorf("SN:%s释放内网IP失败,err:%v", newDev.SN, err) + return succeedSNs, totalAffected, err + } + } + + if newDev.NeedExtranetIPv4 == model.YES { + if exIP, err = repo.AssignExtranetIP(newDev.SN); err != nil { + err = fmt.Errorf("SN:%s分配外网失败,err:%v", newDev.SN, err) + return succeedSNs, totalAffected, err + } + } else { + if _, err = repo.ReleaseIP(newDev.SN, model.Extranet); err != nil { + err = fmt.Errorf("SN:%s释放外网IP失败,err:%v", newDev.SN, err) + return succeedSNs, totalAffected, err + } + } + // 根据OS名称关联系统模板ID + // sysTpl, _ := repo.GetSystemTemplateByName(newDev.OS) + // 特殊设备无需经过系统部署,自定义写入操作系统名称 + sysTpl, err := repo.GetSystemTemplateByName(newDev.OS) + if err != nil { + log.Errorf("get system template by name %s failed(%v) ,adding one", newDev.OS, err) + tpl := model.SystemTemplate{ + Family: "Custom", + BootMode: "uefi", + Name: newDev.OS, + PXE: "#NULL", + Content: "#NULL", + OSLifecycle: model.OSTesting, + Arch: model.OSARCHUNKNOWN, + } + _, err := repo.SaveSystemTemplate(&tpl) + if err != nil { + log.Errorf("add system template by OS name %s fail,%v", newDev.OS, err) + err = fmt.Errorf("SN:%s 新增操作系统名称(%s)失败:%v", newDev.SN, newDev.OS, err) + return succeedSNs, totalAffected, err + } else { + //重新获取新增模板ID + sysTpl, err = repo.GetSystemTemplateByName(newDev.OS) + if err != nil { + log.Errorf("get system template by OS name %s fail,%v", newDev.OS, err) + err = fmt.Errorf("SN:%s 获取操作系统名称(%s)失败:%v", newDev.SN, newDev.OS, err) + return succeedSNs, totalAffected, err + } + } + } + + //Add device setting(模拟一条数据) + ds, err := repo.GetDeviceSettingBySN(newDev.SN) + if ds == nil || err != nil { + ds = &model.DeviceSetting{ + SN: newDev.SN, + Status: model.InstallStatusSucc, //这个值固定 + InstallType: model.InstallationPXE, //这个值固定 + InstallProgress: 1.0, //这个值固定 + NeedIntranetIPv6: model.NO, //默认仅分配IPV4 + NeedExtranetIPv6: model.NO, //默认仅分配IPV4 + } + } + if sysTpl != nil { + ds.SystemTemplateID = sysTpl.ID + } + ds.NeedExtranetIP = newDev.NeedExtranetIPv4 + if inIP != nil { + ds.IntranetIP = inIP.IP + } + if exIP != nil { + ds.ExtranetIP = exIP.IP + } + if err = repo.SaveDeviceSetting(ds); err != nil { + log.Debug(err) + return succeedSNs, totalAffected, err + } + //特殊设备场景再次更新相关信息 + dev, err := repo.GetDeviceBySN(newDev.SN) + if err != nil && err != gorm.ErrRecordNotFound { + return succeedSNs, totalAffected, err + } + if dev != nil { + if dev.OperationStatus == model.DevOperStatPreDeploy || dev.OperationStatus == model.DevOperStatOnShelve { + log.Debugf("SpecialDevice SN %s already exist.Status is %s . Allow to update.", newDev.SN, dev.OperationStatus) + mod.ID = dev.ID + mod.CreatedAt = dev.CreatedAt + mod.UpdatedAt = time.Now() + } + } + if _, err = repo.SaveDevice(mod); err != nil { + log.Debug(err) + return succeedSNs, totalAffected, err + } + } + //rollback + defer func() { + if err != nil { + _, _ = repo.BatchUpdateServerUSitesStatus([]uint{*mod.USiteID}, model.USiteStatFree) + _, _ = repo.DeleteDeviceSettingBySN(mod.SN) + _, _ = repo.RemoveDeviceByID(mod.ID) + _, _ = repo.RemoveDeviceLifecycleByID(devLifecycle.ID) + mod = nil + saveDevLifecycleReq = nil + } + }() + // 若密码为默认出厂密码,则修改 + if checkOriginPassword(log, conf, mod) { + devices = append(devices, mod) + } + // 修改机位占用状态 + if mod.USiteID != nil { + if _, err = repo.BatchUpdateServerUSitesStatus([]uint{*mod.USiteID}, model.USiteStatUsed); err != nil { + log.Errorf("update server_usite status failed, usite_num :%s", newDev.USiteNum) + return succeedSNs, totalAffected, err + } + } + // 统计成功 + totalAffected++ + succeedSNs = append(succeedSNs, newDev.SN) + } + //更新关联的订单到货数量和订单状态 + for orderNum, arrivalCount := range mOrderAmount { + if err = UpdateOrderByArrival(log, repo, orderNum, arrivalCount); err != nil { + log.Errorf("UpdateOrderByArrival failed, orderNum :%s", orderNum) + return succeedSNs, totalAffected, err + } + } + // 新增设备成功后,批量修带外改密码 + go batchUpdateOOBPassword(log, repo, conf, devices) + return succeedSNs, totalAffected, nil +} + + +// MoveDevice 设备搬迁的详细参数 +type MoveDevice struct { + SN string `json:"sn"` + + //搬迁到机架,上架 + DstServerRoomName string `json:"dst_server_room_name"` //目的机房 + DstCabinetNumber string `json:"dst_cabinet_number"` //目的机架 + DstUSiteNumber string `json:"dst_usite_number"` //目的机位 + DstPhysicalArea string `json:"dst_physical_area"` //目标物理区域 + + //搬迁到货架,入库 + DstStoreRoomName string `json:"dst_store_room_name"` //目的库房 + DstVCabinetNumber string `json:"dst_virtual_cabinet_number"` //目的货架 + + //搬迁的类型 + MigType string `json:"mig_type"` //库房->机架,机架->机架,机架->库房 +} + + +// 设备搬迁 请求参数 +type BatchMoveDevicesList []*MoveDevice + +type BatchMoveDevicesReq struct { + Devices BatchMoveDevicesList + CurrentUser *model.CurrentUser +} + + +// 搬迁详细参数校验 +func (reqData *BatchMoveDevicesReq) validate(repo model.Repo) error { + // 目标机位唯一性校验 + var dstUsiteIDsForCheck []uint + + for _, data := range reqData.Devices { + dev, err := repo.GetDeviceBySN(data.SN) + if gorm.IsRecordNotFoundError(err) { + return fmt.Errorf("[搬迁参数校验]设备SN: %s 不存在", data.SN) + } + if err != nil { + return err + } + // 状态必须是[搬迁中] + if dev.OperationStatus != model.DevOperStatMoving { + return fmt.Errorf("[搬迁参数校验]设备SN: %s 运营状态: %s 不是搬迁中", data.SN, dev.OperationStatus) + } + // 目标位置存在性、合法性校验 + if data.MigType == model.MigTypeUsite2Usite || data.MigType == model.MigTypeStore2Usite { + if data.DstServerRoomName == "" || data.DstCabinetNumber == "" || data.DstUSiteNumber == "" || data.DstPhysicalArea == "" { + return fmt.Errorf("[搬迁参数校验]设备SN: %s 目标位置参数存在空值", data.SN) + } + cond := model.CombinedServerUSite{ + ServerRoomName: data.DstServerRoomName, + PhysicalArea: data.DstPhysicalArea, + CabinetNumber: data.DstCabinetNumber, + USiteNumber: data.DstUSiteNumber, + } + items, err := repo.GetServerUSiteByCond(&cond, nil, nil) + if err != nil { + return err + } + if len(items) <= 0 { + return fmt.Errorf("[搬迁参数校验]设备SN: %s 未获取到目标机位 (%s-%s-%s-%s)", data.SN, data.DstServerRoomName, data.DstCabinetNumber, data.DstUSiteNumber, data.DstPhysicalArea) + } else if len(items) > 1 { + return fmt.Errorf("[搬迁参数校验]设备SN: %s 获取到多个目标机位 (%s-%s-%s-%s)", data.SN, data.DstServerRoomName, data.DstCabinetNumber, data.DstUSiteNumber, data.DstPhysicalArea) + } + if items[0] != nil { + if items[0].Status == model.USiteStatDisabled || items[0].Status == model.USiteStatUsed { + return fmt.Errorf("[搬迁参数校验]设备SN: %s 目标机位(%s-%s-%s-%s) 不可用", data.SN, data.DstServerRoomName, data.DstCabinetNumber, data.DstUSiteNumber, data.DstPhysicalArea) + } + dstUsiteIDsForCheck = append(dstUsiteIDsForCheck, items[0].ID) + } + } + } + + // 目标机位唯一性校验 + if len(dstUsiteIDsForCheck) >= 2 { + for i := 0; i < len(dstUsiteIDsForCheck); i++ { + for j := i + 1; j < len(dstUsiteIDsForCheck); j++ { + if dstUsiteIDsForCheck[i] == dstUsiteIDsForCheck[j] { + return fmt.Errorf("存在重复的目标机位,请检查") + } + } + } + } + return nil +} + + +// 设备搬迁(释放IP、释放旧机位、占用目标机位、更新状态) +func BatchMoveDevices(log logger.Logger, repo model.Repo, conf *config.Config, reqData *BatchMoveDevicesReq) (succeedSNs []string, totalAffected int64, err error) { + // 参数校验 + if err := reqData.validate(repo); err != nil { + return nil, 0, err + } + // 存储目标机位ID + var dstUsiteIDs []uint + //存储需回收的机位 + var usiteFreeIDs []uint + var usiteDisabledIDs []uint + //1.释放IP的同时保留IP资源,保留期根据config文件配置,0则不保留 + reserveDay := conf.IP.ReserveDay + for _, dev := range reqData.Devices { + if dev.MigType != model.MigTypeStore2Usite && dev.MigType != model.MigTypeStore2Store { + if reserveDay <= 0 { + //直接释放IP资源 + if _, err = repo.ReleaseIP(dev.SN, model.Intranet); err != nil { + log.Error("device(sn=%s) release ip fail", dev.SN) + } + //外网IP、IPv6不一定有 + _, _ = repo.ReleaseIP(dev.SN, model.Extranet) + _, _ = repo.ReleaseIPv6(dev.SN, model.IPScopeIntranet) + _, _ = repo.ReleaseIPv6(dev.SN, model.IPScopeExtranet) + + //同时删除装机记录 + if _, err := repo.DeleteDeviceSettingBySN(dev.SN); err != nil { + log.Error("device(sn=%s) clear device setting fail", dev.SN) + } + } + if reserveDay > 0 { + now := time.Now() + releaseDate := now.AddDate(0, 0, reserveDay) + if _, err = repo.ReserveIP(dev.SN, model.Intranet, releaseDate); err != nil { + log.Error("device(sn=%s) reserve ip fail", dev.SN) + } + //外网IP不一定有 + _, _ = repo.ReserveIP(dev.SN, model.Extranet, releaseDate) + //同时删除装机记录 + if _, err := repo.DeleteDeviceSettingBySN(dev.SN); err != nil { + log.Error("device(sn=%s) clear device setting fail", dev.SN) + } + } + } + + oriDev, err := repo.GetDeviceBySN(dev.SN) + if err != nil { + log.Error("get origin device(sn=%s) usite fail", dev.SN) + return succeedSNs, totalAffected, err + } + // 变更记录 + var details []string + details = append(details, fmt.Sprintf("序列号:%v", dev.SN)) + + // 搬迁类型细分 + switch dev.MigType { + //机架->机架 + case model.MigTypeUsite2Usite: + cond := model.CombinedServerUSite{ + ServerRoomName: dev.DstServerRoomName, + PhysicalArea: dev.DstPhysicalArea, + CabinetNumber: dev.DstCabinetNumber, + USiteNumber: dev.DstUSiteNumber, + } + items, err := repo.GetServerUSiteByCond(&cond, nil, nil) + if err != nil { + log.Error("get dst server(sn=%s) dst ustie (%s-%s-%s-%s) fail(%s)", dev.SN, dev.DstServerRoomName, dev.DstCabinetNumber, dev.DstUSiteNumber, dev.DstPhysicalArea, err.Error()) + return succeedSNs, totalAffected, err + } + if items[0] != nil { + dstUsiteIDs = append(dstUsiteIDs, items[0].ID) + } + if oriDev.USiteID != nil { + if cabinet, err := repo.GetServerCabinetByID(oriDev.CabinetID); err == nil { + // 若上层机架为[已锁定],则对应机位不可释放 + if cabinet.Status == model.CabinetStatLocked { + usiteDisabledIDs = append(usiteDisabledIDs, *oriDev.USiteID) + } else { + usiteFreeIDs = append(usiteFreeIDs, *oriDev.USiteID) + } + } + } + + // 设备生命周期记录操作内容 + oriServerRoom, _ := repo.GetServerRoomByID(oriDev.ServerRoomID) + oriCabinet, _ := repo.GetServerCabinetByID(oriDev.CabinetID) + //oriUsite, _ := repo.GetServerUSiteByID(*oriDev.USiteID) + details = append(details, fmt.Sprintf("搬迁类型:机架->机架")) + details = append(details, fmt.Sprintf("机房管理单元: %v -> %v", oriServerRoom.Name, dev.DstServerRoomName)) + details = append(details, fmt.Sprintf("机架: %v -> %v", oriCabinet.Number, dev.DstCabinetNumber)) + if oriDev.USiteID != nil { + oriUsite, _ := repo.GetServerUSiteByID(*oriDev.USiteID) + details = append(details, fmt.Sprintf("机位: %v -> %v", oriUsite.Number, dev.DstUSiteNumber)) + } else { + details = append(details,"机位:获取失败") + } + //将物理机状态更新为[待部署] + if _, err = repo.UpdateDeviceBySN(&model.Device{ + SN: dev.SN, + IDCID: items[0].IDCID, + ServerRoomID: items[0].ServerRoomID, + CabinetID: items[0].ServerCabinetID, + USiteID: &items[0].ID, + OperationStatus: model.DevOperStatPreDeploy, + }); err != nil { + log.Error("update device(sn=%s) status pre_deploy fail", dev.SN) + return succeedSNs, totalAffected, err + } + // 统计成功 + totalAffected++ + succeedSNs = append(succeedSNs, dev.SN) + // 保存设备生命周期记录操作内容 + devLog := model.ChangeLog { + OperationUser: reqData.CurrentUser.Name, + OperationType: model.OperationTypeMove, + OperationDetail: strings.Join(details, ";"), + OperationTime: times.ISOTime(time.Now()).ToTimeStr(), + } + adll := &AppendDeviceLifecycleLogReq{ + SN: dev.SN, + LifecycleLog: devLog, + } + if err = AppendDeviceLifecycleLogBySN(log, repo, adll);err != nil { + log.Error("LifecycleLog: append device lifecycle log (sn:%v) fail(%s)", dev.SN, err.Error()) + } + + //机架->库房 + case model.MigTypeUsite2Store: + if oriDev.USiteID != nil { + if cabinet, err := repo.GetServerCabinetByID(oriDev.CabinetID); err == nil { + // 若上层机架为[已锁定],则对应机位不可释放 + if cabinet.Status == model.CabinetStatLocked { + usiteDisabledIDs = append(usiteDisabledIDs, *oriDev.USiteID) + } else { + usiteFreeIDs = append(usiteFreeIDs, *oriDev.USiteID) + } + } + //originUsiteIDs = append(originUsiteIDs, *oriDev.USiteID) + } + cond := model.CombinedStoreRoomVirtualCabinet { + StoreRoomName: dev.DstStoreRoomName, + VirtualCabinetNumber: dev.DstVCabinetNumber, + } + items, err := repo.GetVirtualCabinetsByCond(&cond, nil, nil) + if err != nil { + log.Error("server(sn=%s) get dst store room ustie (%s-%s) fail(%s)", dev.SN, dev.DstStoreRoomName, dev.DstVCabinetNumber, err.Error()) + return succeedSNs, totalAffected, err + } + if len(items) <= 0 { + log.Error("server(sn=%s) no dst store room ustie (%s-%s) found", dev.SN, dev.DstStoreRoomName, dev.DstVCabinetNumber) + return succeedSNs, totalAffected, err + } else if len(items) > 1 { + log.Error("server(sn=%s) more than one dst store room ustie (%s-%s) found", dev.SN, dev.DstStoreRoomName, dev.DstVCabinetNumber) + return succeedSNs, totalAffected, err + } + // 设备生命周期记录操作内容 + oriServerRoom, _ := repo.GetServerRoomByID(oriDev.ServerRoomID) + oriCabinet, _ := repo.GetServerCabinetByID(oriDev.CabinetID) + details = append(details, fmt.Sprintf("搬迁类型:机架->库房")) + details = append(details, fmt.Sprintf("机房管理单元->库房: %v -> %v", oriServerRoom.Name, dev.DstStoreRoomName)) + details = append(details, fmt.Sprintf("机架->货架: %v -> %v", oriCabinet.Number, dev.DstVCabinetNumber)) + //将物理机状态更新为[库存中] + oriDev.IDCID = 0 + oriDev.ServerRoomID = 0 + oriDev.CabinetID = 0 + oriDev.USiteID = nil //&zero + oriDev.StoreRoomID = items[0].StoreRoomID + oriDev.VCabinetID = items[0].ID + oriDev.OperationStatus = model.DevOperStatInStore + if _, err = repo.SaveDevice(oriDev); err != nil { + log.Error("update device(sn=%s) status pre_deploy fail", dev.SN) + return succeedSNs, totalAffected, err + } + // 统计成功 + totalAffected++ + succeedSNs = append(succeedSNs, dev.SN) + // 保存设备生命周期记录操作内容 + devLog := model.ChangeLog { + OperationUser: reqData.CurrentUser.Name, + OperationType: model.OperationTypeMove, + OperationDetail: strings.Join(details, ";"), + OperationTime: times.ISOTime(time.Now()).ToTimeStr(), + } + adll := &AppendDeviceLifecycleLogReq{ + SN: dev.SN, + LifecycleLog: devLog, + } + if err = AppendDeviceLifecycleLogBySN(log, repo, adll);err != nil { + log.Error("LifecycleLog: append device lifecycle log (sn:%v) fail(%s)", dev.SN, err.Error()) + } + //库房->机架 + case model.MigTypeStore2Usite: + cond := model.CombinedServerUSite{ + ServerRoomName: dev.DstServerRoomName, + PhysicalArea: dev.DstPhysicalArea, + CabinetNumber: dev.DstCabinetNumber, + USiteNumber: dev.DstUSiteNumber, + } + items, err := repo.GetServerUSiteByCond(&cond, nil, nil) + if err != nil { + log.Error("server(sn=%s) get dst ustie (%s-%s-%s-%s) fail(%s)", dev.SN, dev.DstServerRoomName, dev.DstCabinetNumber, dev.DstUSiteNumber, dev.DstPhysicalArea, err.Error()) + return succeedSNs, totalAffected, err + } + if items[0] != nil { + dstUsiteIDs = append(dstUsiteIDs, items[0].ID) + } + // 设备生命周期记录操作内容 + oriStoreRoom, _ := repo.GetStoreRoomByID(oriDev.StoreRoomID) + oriVCabinet, _ := repo.GetVirtualCabinetByID(oriDev.VCabinetID) + details = append(details, fmt.Sprintf("搬迁类型:库房->机架")) + details = append(details, fmt.Sprintf("库房->机房管理单元: %v -> %v", oriStoreRoom.Name, dev.DstServerRoomName)) + details = append(details, fmt.Sprintf("货架->机架: %v -> %v", oriVCabinet.Number, dev.DstCabinetNumber)) + details = append(details, fmt.Sprintf("机位: -> %v", dev.DstUSiteNumber)) + + //将物理机状态更新为[待部署] + oriDev.IDCID = items[0].IDCID + oriDev.ServerRoomID = items[0].ServerRoomID + oriDev.CabinetID = items[0].ServerCabinetID + oriDev.USiteID = &items[0].ID + oriDev.StoreRoomID = 0 + oriDev.VCabinetID = 0 + now := time.Now() + oriDev.StartedAt = now + oriDev.OnShelveAt = now + oriDev.OperationStatus = model.DevOperStatPreDeploy + if _, err = repo.SaveDevice(oriDev); err != nil { + log.Error("update device(sn=%s) status pre_deploy fail", dev.SN) + return succeedSNs, totalAffected, err + } + // 统计成功 + totalAffected++ + succeedSNs = append(succeedSNs, dev.SN) + // 保存设备生命周期记录操作内容 + devLog := model.ChangeLog { + OperationUser: reqData.CurrentUser.Name, + OperationType: model.OperationTypeMove, + OperationDetail: strings.Join(details, ";"), + OperationTime: times.ISOTime(time.Now()).ToTimeStr(), + } + adll := &AppendDeviceLifecycleLogReq{ + SN: dev.SN, + LifecycleLog: devLog, + } + if err = AppendDeviceLifecycleLogBySN(log, repo, adll);err != nil { + log.Error("LifecycleLog: append device lifecycle log (sn:%v) fail(%s)", dev.SN, err.Error()) + } + //库房->库房 + case model.MigTypeStore2Store: + cond := model.CombinedStoreRoomVirtualCabinet { + StoreRoomName: dev.DstStoreRoomName, + VirtualCabinetNumber: dev.DstVCabinetNumber, + } + items, err := repo.GetVirtualCabinetsByCond(&cond, nil, nil) + if err != nil { + log.Error("server(sn=%s) get dst store room ustie (%s-%s) fail(%s)", dev.SN, dev.DstStoreRoomName, dev.DstVCabinetNumber, err.Error()) + return succeedSNs, totalAffected, err + } + if len(items) <= 0 { + log.Error("server(sn=%s) no dst store room ustie (%s-%s) found", dev.SN, dev.DstStoreRoomName, dev.DstVCabinetNumber) + return succeedSNs, totalAffected, err + } else if len(items) > 1 { + log.Error("server(sn=%s) more than one dst store room ustie (%s-%s) found", dev.SN, dev.DstStoreRoomName, dev.DstVCabinetNumber) + return succeedSNs, totalAffected, err + } + // 设备生命周期记录操作内容 + oriStoreRoom, _ := repo.GetStoreRoomByID(oriDev.StoreRoomID) + oriVCabinet, _ := repo.GetVirtualCabinetByID(oriDev.VCabinetID) + details = append(details, fmt.Sprintf("搬迁类型:库房->库房")) + details = append(details, fmt.Sprintf("库房: %v -> %v", oriStoreRoom.Name, dev.DstStoreRoomName)) + details = append(details, fmt.Sprintf("货架: %v -> %v", oriVCabinet.Number, dev.DstVCabinetNumber)) + // 设备记录更新 + oriDev.IDCID = 0 + oriDev.StoreRoomID = items[0].StoreRoomID + oriDev.VCabinetID = items[0].ID + oriDev.OperationStatus = model.DevOperStatInStore + if _, err = repo.UpdateDeviceBySN(oriDev); err != nil { + log.Error("update device(sn=%s) status pre_deploy fail", dev.SN) + return succeedSNs, totalAffected, err + } + // 统计成功 + totalAffected++ + succeedSNs = append(succeedSNs, dev.SN) + // 保存设备生命周期记录操作内容 + devLog := model.ChangeLog { + OperationUser: reqData.CurrentUser.Name, + OperationType: model.OperationTypeMove, + OperationDetail: strings.Join(details, ";"), + OperationTime: times.ISOTime(time.Now()).ToTimeStr(), + } + adll := &AppendDeviceLifecycleLogReq{ + SN: dev.SN, + LifecycleLog: devLog, + } + if err = AppendDeviceLifecycleLogBySN(log, repo, adll);err != nil { + log.Error("LifecycleLog: append device lifecycle log (sn:%v) fail(%s)", dev.SN, err.Error()) + } + } + } + //3.将目标机位标记为[已占用] + if _, err = repo.BatchUpdateServerUSitesStatus(dstUsiteIDs, model.USiteStatUsed); err != nil { + log.Error("occupy usites(ids=%v) fail", dstUsiteIDs) + return succeedSNs, totalAffected, err + } + //4.将原机位标记为空闲 or 不可用 + if _, err = repo.BatchUpdateServerUSitesStatus(usiteFreeIDs, model.USiteStatFree); err != nil { + log.Error("free usites(ids=%v) fail", usiteFreeIDs) + return succeedSNs, totalAffected, err + } + if _, err = repo.BatchUpdateServerUSitesStatus(usiteDisabledIDs, model.USiteStatDisabled); err != nil { + log.Error("disable usites(ids=%v) fail", usiteDisabledIDs) + return succeedSNs, totalAffected, err + } + return succeedSNs, totalAffected, nil +} + + +// 设备退役 请求参数 +type BatchRetireDevicesList []string + +type BatchRetireDevicesReq struct { + SNs BatchRetireDevicesList + CurrentUser *model.CurrentUser +} + +// 设备退役(释放IP、释放旧机位、更新状态) +func BatchRetireDevices(log logger.Logger, repo model.Repo, conf *config.Config, reqData *BatchRetireDevicesReq) (succeedSNs []string, totalAffected int64, err error) { + //存储需释放的机位 + var usiteFreeIDs []uint + var usiteDisabledIDs []uint + //1.释放IP的同时保留IP资源,保留期根据config文件配置,0则不保留 + reserveDay := conf.IP.ReserveDay + for _, sn := range reqData.SNs { + dev, err := repo.GetDeviceBySN(sn) + if err != nil { + log.Errorf("get device by sn:%s fail, %s", sn, err.Error()) + return succeedSNs, totalAffected, err + } + // 状态必须是[退役中] + if dev.OperationStatus != model.DevOperStatRetiring { + return succeedSNs, totalAffected, fmt.Errorf("[退役参数校验]设备SN: %s 运营状态: %s 不是退役中", sn, dev.OperationStatus) + } + if dev != nil && dev.USiteID != nil { + if cabinet, err := repo.GetServerCabinetByID(dev.CabinetID); err == nil { + // 若上层机架为[已锁定],则对应机位不可释放 + if cabinet.Status == model.CabinetStatLocked { + usiteDisabledIDs = append(usiteDisabledIDs, *dev.USiteID) + } else { + usiteFreeIDs = append(usiteFreeIDs, *dev.USiteID) + } + } + //usiteIDs = append(usiteIDs, *dev.USiteID) + } + // 变更记录 + optDetail, err := convert2DetailOfOperationTypeRetire(repo, dev) + if err != nil { + log.Errorf("Fail to convert Detail of OperationTypeRetire: %v", err) + } + devLog := model.ChangeLog { + OperationUser: reqData.CurrentUser.Name, + OperationType: model.OperationTypeRetire, + OperationDetail: optDetail, + OperationTime: times.ISOTime(time.Now()).ToTimeStr(), + } + adll := &AppendDeviceLifecycleLogReq{ + SN: dev.SN, + LifecycleLog: devLog, + } + if err = AppendDeviceLifecycleLogBySN(log, repo, adll);err != nil { + log.Error("LifecycleLog: append device lifecycle log (sn:%v) fail(%s)", dev.SN, err.Error()) + } + // 释放机位并修改状态 + dev.USiteID = nil + dev.PowerStatus = model.PowerStatusOff + dev.OperationStatus = model.DevOperStateRetired + if _, err := repo.SaveDevice(dev); err != nil { + log.Error(err) + return succeedSNs, totalAffected, err + } + // 释放IP资源 + if reserveDay <= 0 { + //直接释放IP资源 + if _, err = repo.ReleaseIP(dev.SN, model.Intranet); err != nil { + log.Error("device(sn=%s) release ip fail", dev.SN) + } + //外网IP、IPv6不一定有 + _, _ = repo.ReleaseIP(dev.SN, model.Extranet) + _, _ = repo.ReleaseIPv6(dev.SN, model.IPScopeIntranet) + _, _ = repo.ReleaseIPv6(dev.SN, model.IPScopeExtranet) + + //同时删除装机记录 + if _, err := repo.DeleteDeviceSettingBySN(dev.SN); err != nil { + log.Error("device(sn=%s) clear device setting fail", dev.SN) + } + } + if reserveDay > 0 { + now := time.Now() + releaseDate := now.AddDate(0, 0, reserveDay) + if _, err = repo.ReserveIP(dev.SN, model.Intranet, releaseDate); err != nil { + log.Error("device(sn=%s) reserve ip fail", dev.SN) + } + //外网IP不一定有 + _, _ = repo.ReserveIP(dev.SN, model.Extranet, releaseDate) + //同时删除装机记录 + if _, err := repo.DeleteDeviceSettingBySN(dev.SN); err != nil { + log.Error("device(sn=%s) clear device setting fail", dev.SN) + } + } + // 统计成功 + totalAffected++ + succeedSNs = append(succeedSNs, dev.SN) + // 记录设备退役日期 + saveDevLifecycleReq := &SaveDeviceLifecycleReq { + DeviceLifecycleBase: DeviceLifecycleBase{ + DeviceRetiredDate: time.Now(), + }, + } + // DeviceLifecycle 查询是否已经存在 + devLifecycle, err := repo.GetDeviceLifecycleBySN(dev.SN) + if err != nil && err != gorm.ErrRecordNotFound { + log.Error(err) + } + if devLifecycle != nil { + saveDevLifecycleReq.ID = devLifecycle.ID + // 保存或更新 DeviceLifecycle + if err = SaveDeviceLifecycle(log, repo, saveDevLifecycleReq); err != nil { + log.Error(err) + } + } + } + if _, err = repo.BatchUpdateServerUSitesStatus(usiteFreeIDs, model.USiteStatFree); err != nil { + log.Error("free usites(ids=%v) fail", usiteFreeIDs) + return succeedSNs, totalAffected, err + } + if _, err = repo.BatchUpdateServerUSitesStatus(usiteDisabledIDs, model.USiteStatDisabled); err != nil { + log.Error("disable usites(ids=%v) fail", usiteDisabledIDs) + return succeedSNs, totalAffected, err + } + return succeedSNs, totalAffected, nil +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/device_category.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/device_category.go new file mode 100644 index 0000000000000000000000000000000000000000..f57c31a5dee14bc27f1910b65ff90f676bc7246b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/device_category.go @@ -0,0 +1,287 @@ +package service + +import ( + "fmt" + "net/http" + + "github.com/voidint/binding" + + "reflect" + + "github.com/voidint/page" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils/times" +) + +//SaveDeviceCategoryReq 保存设备类型请求参数 +type SaveDeviceCategoryReq struct { + DeviceCategoryBase + ID uint `json:"id"` + // 用户登录名 + LoginName string `json:"-"` +} + +// 基本字段 +type DeviceCategoryBase struct { + //Catetory 设备类型 + Category string `json:"category"` + // 硬件配置 + Hardware string `json:"hardware"` + // 处理器生产商,如:Intel(R) Corporation\HiSilicon + CentralProcessorManufacturer string `json:"central_processor_manufacture"` + // 处理器架构,如:x86_64\aarch64 + CentralProcessorArch string `json:"central_processor_arch"` + //功率 + Power string `json:"power"` + //设备所占用的U数 机柜参数Unit 1U = 44.45mm + Unit uint `json:"unit"` + //是否金融信创生态产品: yes or no + IsFITIEcoProduct string `json:"is_fiti_eco_product"` + // Remark 备注 + Remark string `json:"remark"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *SaveDeviceCategoryReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.ID: "id", + &reqData.Category: "category", + &reqData.Hardware: "hardware", + &reqData.CentralProcessorManufacturer: "central_processor_manufacture", + &reqData.CentralProcessorArch: "central_processor_arch", + &reqData.Power: "power", + &reqData.Unit: "unit", + &reqData.IsFITIEcoProduct: "is_fiti_eco_product", + &reqData.Remark: "remark", + } +} + +// Validate 结构体数据校验 +func (reqData *SaveDeviceCategoryReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + //必须的基本数据不能为空 + if errs = reqData.baseValidate(req, errs); errs != nil { + return errs + } + + //更新设备类型信息,校验指定ID的设备类型是否存在 + if reqData.ID > 0 { + if _, err := repo.GetDeviceCategoryByID(reqData.ID); errs != nil { + errs.Add([]string{"id"}, binding.RequiredError, fmt.Sprintf("查询设备类型id(%d)出现错误: %s", reqData.ID, err.Error())) + return errs + } + } else { + if c, _ := repo.GetDeviceCategoryByName(reqData.Category); c != nil { + errs.Add([]string{"id"}, binding.RequiredError, fmt.Sprintf("设备类型(%s)已存在", reqData.Category)) + return errs + } + } + // 校验 + if reqData.IsFITIEcoProduct != model.NO && reqData.IsFITIEcoProduct != model.YES { + errs.Add([]string{"is_fiti_eco_product"}, binding.RequiredError, fmt.Sprintf("是否金融信创生态产品(%s)不合法", reqData.IsFITIEcoProduct)) + return errs + } + return nil +} + +//baseValidate 必要参数不能为空 +func (reqData *SaveDeviceCategoryReq) baseValidate(req *http.Request, errs binding.Errors) binding.Errors { + if reqData.Category == "" { + errs.Add([]string{"category"}, binding.RequiredError, "设备类型不能为空") + return errs + } + if reqData.Hardware == "" { + errs.Add([]string{"hardware"}, binding.RequiredError, "硬件配置不能为空") + return errs + } + return errs +} + +type DelDeviceCategoryReq struct { + IDs []uint `json:"ids"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *DelDeviceCategoryReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDs: "ids", + } +} + +// Validate 结构体数据校验 +func (reqData *DelDeviceCategoryReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + for _, id := range reqData.IDs { + if _, err := repo.GetDeviceCategoryByID(id); err != nil { + errs.Add([]string{"id"}, binding.RequiredError, fmt.Sprintf("设备类型id(%d)不存在", id)) + return errs + } + } + return nil +} + +//SaveDeviceCategory 保存设备类型 +func SaveDeviceCategory(log logger.Logger, repo model.Repo, reqData *SaveDeviceCategoryReq) error { + sr := model.DeviceCategory{ + Category: reqData.Category, + Hardware: reqData.Hardware, + CentralProcessorManufacturer: reqData.CentralProcessorManufacturer, + CentralProcessorArch: reqData.CentralProcessorArch, + Power: reqData.Power, + Unit: reqData.Unit, + IsFITIEcoProduct: reqData.IsFITIEcoProduct, + Remark: reqData.Remark, + Creator: reqData.LoginName, + } + sr.Model.ID = reqData.ID + + _, err := repo.SaveDeviceCategory(&sr) + if err != nil { + return err + } + + reqData.ID = sr.Model.ID + return err +} + +//RemoveDeviceCategorys 删除指定ID的设备类型 +func RemoveDeviceCategorys(log logger.Logger, repo model.Repo, reqData *DelDeviceCategoryReq) (affected int64, err error) { + for _, id := range reqData.IDs { + _, err := repo.RemoveDeviceCategoryByID(id) + if err != nil { + log.Errorf("delete order(id=%d) fail,err:%v", id, err) + return affected, err + } + + affected++ + } + return affected, err +} + +//GetDeviceCategoryPageReq 获取设备类型分页请求参数 +type GetDeviceCategoryPageReq struct { + DeviceCategoryBase + Page int64 `json:"page"` + PageSize int64 `json:"page_size"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *GetDeviceCategoryPageReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.Category: "category", + &reqData.Hardware: "hardware", + &reqData.CentralProcessorManufacturer: "central_processor_manufacture", + &reqData.CentralProcessorArch: "central_processor_arch", + &reqData.Power: "power", + &reqData.Unit: "unit", + &reqData.IsFITIEcoProduct: "is_fiti_eco_product", + &reqData.Remark: "remark", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + } +} + +//DeviceCategoryResp 设备类型分页查询信息 +type DeviceCategoryResp struct { + Category string `json:"category"` + // 硬件配置 + Hardware string `json:"hardware"` + CentralProcessorManufacturer string `json:"central_processor_manufacture"` + // 处理器架构,如:x86_64\aarch64 + CentralProcessorArch string `json:"central_processor_arch"` + //功率 + Power string `json:"power"` + //设备所占用的U数 机柜参数Unit 1U = 44.45mm + Unit uint `json:"unit"` + //是否金融信创生态产品: yes or no + IsFITIEcoProduct string `json:"is_fiti_eco_product"` + // Remark 备注 + Remark string `json:"remark"` + //设备类型ID。 + ID uint `json:"id"` + Creator string `json:"creator"` + CreatedAt times.ISOTime `json:"created_at"` + UpdatedAt times.ISOTime `json:"updated_at"` +} + +//GetDeviceCategorysPage 获取设备类型分页 +func GetDeviceCategorysPage(log logger.Logger, repo model.Repo, reqData *GetDeviceCategoryPageReq) (*page.Page, error) { + if reqData.PageSize <= 0 || reqData.PageSize > 1000 { + reqData.PageSize = 20 + } + if reqData.Page < 0 { + reqData.Page = 0 + } + + cond := model.DeviceCategory{ + Category: reqData.Category, + Hardware: reqData.Hardware, + Power: reqData.Power, + Remark: reqData.Remark, + } + + totalRecords, err := repo.CountDeviceCategorys(&cond) + if err != nil { + return nil, err + } + + pager := page.NewPager(reflect.TypeOf(&DeviceCategoryResp{}), reqData.Page, reqData.PageSize, totalRecords) + items, err := repo.GetDeviceCategorys(&cond, model.OneOrderBy("id", model.DESC), pager.BuildLimiter()) + if err != nil { + return nil, err + } + for i := range items { + item, err := convert2DeviceCategoryResult(log, repo, items[i]) + if err != nil { + return nil, err + } + if item != nil { + pager.AddRecords(item) + } + } + return pager.BuildPage(), nil +} + +func convert2DeviceCategoryResult(log logger.Logger, repo model.Repo, mod *model.DeviceCategory) (*DeviceCategoryResp, error) { + if mod == nil { + return nil, nil + } + result := DeviceCategoryResp{ + ID: mod.ID, + CreatedAt: times.ISOTime(mod.CreatedAt), + UpdatedAt: times.ISOTime(mod.UpdatedAt), + Category: mod.Category, + Hardware: mod.Hardware, + CentralProcessorManufacturer: mod.CentralProcessorManufacturer, + CentralProcessorArch: mod.CentralProcessorArch, + Power: mod.Power, + Unit: mod.Unit, + IsFITIEcoProduct: mod.IsFITIEcoProduct, + Remark: mod.Remark, + Creator: mod.Creator, + } + return &result, nil +} + +//GetDeviceCategoryByID 获取指定ID的设备类型的详细信息 +func GetDeviceCategoryByID(log logger.Logger, repo model.Repo, id uint) (*DeviceCategoryResp, error) { + items, err := repo.GetDeviceCategoryByID(id) + if err != nil { + return nil, err + } + + item, err := convert2DeviceCategoryResult(log, repo, items) + if err != nil { + return nil, err + } + return item, nil +} + +func GetDeviceCategoryQuerys(log logger.Logger, repo model.Repo, param string) (*model.DeviceQueryParamResp, error) { + return repo.GetDeviceCategoryQuerys(param) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/device_hardware_setting.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/device_hardware_setting.go new file mode 100644 index 0000000000000000000000000000000000000000..db93b4745d818ee132a74c64317cd4c3e2114cf7 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/device_hardware_setting.go @@ -0,0 +1,133 @@ +package service + +import ( + "encoding/json" + "fmt" + + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" +) + +// HardwareSettingResp 硬件配置模板返回结构体 +type HardwareSettingResp struct { + // 配置信息 + Settings []HardwareSetting `json:"settings"` +} + +// HardwareSetting 硬件配置参数 +type HardwareSetting struct { + // 硬件配置动作类别 raid|oob|bios|firmware|reboot + Category string `json:"category"` + // 硬件配置动作 reboot,add_user,reset_bmc,set_ip,set_bios,clear_settings,create_array,set_global_hotspare,init_disk,set_jbod,update_package + Action string `json:"action"` + // 配置元数据 + Metadata map[string]interface{} `json:"metadata"` +} + +// HardwareTemplateResp 硬件模板返回体 +type HardwareTemplateResp struct { + // 是否内置 + Builtin string `json:"builtin"` + // 配置数据 + Data Data `json:"data"` + // 型号 + ModelName string `json:"model_name"` + // 名称 + Name string `json:"name"` + // 厂商 + Vendor string `json:"vendor"` +} + +// HardwareInfo 硬件相关信息 +type HardwareInfo struct { + //序列号 + SN string `json:"sn"` + //厂商 + Vendor string `json:"vendor"` + //厂商型号 + DevModel string `json:"model"` + //设备类型(自定义型号,如M10) + Category string `json:"category"` + //硬件备注(CPU\MEM\NET\DISK) + HardwareRemark string `json:"hardware_remark"` +} + +// GetHardwareSettingsBySN 查询设备硬件配置参数信息 +func GetHardwareSettingsBySN(log logger.Logger, repo model.Repo, sn string) (item *HardwareSettingResp, err error) { + item = &HardwareSettingResp{ + Settings: []HardwareSetting{}, + } + + devSetting, err := repo.GetDeviceSettingBySN(sn) + if err != nil { + return item, err + } + + if devSetting.ID <= 0 { + return item, nil + } + + hardwareTemp, err := repo.GetHardwareTemplateByID(devSetting.HardwareTemplateID) + if err != nil { + return item, err + } + + if hardwareTemp.ID <= 0 { + return item, nil + } + + settings := item.Settings + + err = json.Unmarshal([]byte(hardwareTemp.Data), &settings) + if err != nil { + return item, err + } + + item.Settings = settings + + return item, nil +} + +// GetHardwareSettingsByID 查询设备硬件配置参数信息 +func GetHardwareSettingsByID(repo model.Repo, sn uint) (resp *HardwareTemplateResp, err error) { + item, err := repo.GetHardwareTemplateByID(sn) + if err != nil { + return nil, err + } + + fmt.Println(item.Data) + + var datas Data + + err = json.Unmarshal([]byte(item.Data), &datas) + if err != nil { + return nil, err + } + + resp = &HardwareTemplateResp{ + Name: item.Name, + Vendor: item.Vendor, + ModelName: item.ModelName, + Builtin: item.Builtin, + Data: datas, + } + + return +} + +// GetHardwareInfoBySN 根据SN获取设备硬件相关信息 +func GetHardwareInfoBySN(log logger.Logger, repo model.Repo, sn string) (resp *HardwareInfo, err error) { + devInfo, err := repo.GetDeviceBySN(sn) + if err != nil { + return nil, err + } + + resp = &HardwareInfo{ + SN: devInfo.SN, + Vendor: devInfo.Vendor, + DevModel: devInfo.DevModel, + Category: devInfo.Category, + HardwareRemark: devInfo.HardwareRemark, + } + return resp,nil +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/device_lifecycle.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/device_lifecycle.go new file mode 100644 index 0000000000000000000000000000000000000000..5ed75b98d432061037a72a88a6ca2155e2a9f876 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/device_lifecycle.go @@ -0,0 +1,741 @@ +package service + +import ( + "idcos.io/cloudboot/utils/times" + "strings" + "fmt" + "reflect" + "net/http" + "encoding/json" + "github.com/jinzhu/gorm" + "time" + + "idcos.io/cloudboot/config" + "github.com/voidint/binding" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" +) + + +//SaveDeviceCategoryReq 保存设备生命周期详情请求参数 +type SaveDeviceLifecycleReq struct { + DeviceLifecycleBase + ID uint `json:"id"` + // 用户登录名 + LoginName string `json:"-"` +} + +// 基本字段 +type DeviceLifecycleBase struct { + FixedAssetNumber string `json:"fixed_asset_number"` + SN string `json:"sn"` + AssetBelongs string `json:"asset_belongs"` + Owner string `json:"owner"` + IsRental string `json:"is_rental"` + MaintenanceServiceProvider string `json:"maintenance_service_provider"` + MaintenanceService string `json:"maintenance_service"` + LogisticsService string `json:"logistics_service"` + MaintenanceServiceDateBegin time.Time `json:"maintenance_service_date_begin"` + MaintenanceServiceDateEnd time.Time `json:"maintenance_service_date_end"` + MaintenanceServiceStatus string `json:"maintenance_service_status"` + DeviceRetiredDate time.Time `json:"device_retired_date"` + LifecycleLog string `json:"lifecycle_log"` +} + +//SaveDeviceLifecycle 保存/更新 设备生命周期记录 +func SaveDeviceLifecycle(log logger.Logger, repo model.Repo, reqData *SaveDeviceLifecycleReq) error { + // DeviceLifecycle 结构体 + modDevLifecycle := &model.DeviceLifecycle{ + FixedAssetNumber: reqData.FixedAssetNumber, + SN: reqData.SN, + AssetBelongs: reqData.AssetBelongs, + Owner: reqData.Owner, + IsRental: reqData.IsRental, + MaintenanceServiceProvider: reqData.MaintenanceServiceProvider, + MaintenanceService: reqData.MaintenanceService, + LogisticsService: reqData.LogisticsService, + MaintenanceServiceDateBegin: reqData.MaintenanceServiceDateBegin, + MaintenanceServiceDateEnd: reqData.MaintenanceServiceDateEnd, + MaintenanceServiceStatus: reqData.MaintenanceServiceStatus, + DeviceRetiredDate: reqData.DeviceRetiredDate, // sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE 时因parseTime=True强制转换零值导致无法写入DB + LifecycleLog: reqData.LifecycleLog, + } + + modDevLifecycle.Model.ID = reqData.ID + + _, err := repo.SaveDeviceLifecycle(modDevLifecycle) + if err != nil { + log.Errorf("SaveDeviceLifecycle failed: %s", err.Error()) + return err + } + + reqData.ID = modDevLifecycle.Model.ID + return err +} + +// 设备详情页展示结构体 +type DeviceLifecycleDetailPage struct { + AssetBelongs string `json:"asset_belongs"` + Owner string `json:"owner"` + IsRental string `json:"is_rental"` + MaintenanceServiceProvider string `json:"maintenance_service_provider"` + MaintenanceService string `json:"maintenance_service"` + LogisticsService string `json:"logistics_service"` + MaintenanceServiceDateBegin string `json:"maintenance_service_date_begin"` + MaintenanceServiceDateEnd string `json:"maintenance_service_date_end"` + MaintenanceServiceStatus string `json:"maintenance_service_status"` + DeviceRetiredDate string `json:"device_retired_date"` + LifecycleLog []model.ChangeLog `json:"lifecycle_log"` +} + + +// 更新追加设备生命周期变更记录 请求结构体 +type AppendDeviceLifecycleLogReq struct { + SN string `json:"sn"` + LifecycleLog model.ChangeLog `json:"lifecycle_log"` +} + +//AppendDeviceLifecycleLog 更新追加设备生命周期变更记录 +func AppendDeviceLifecycleLogBySN(log logger.Logger, repo model.Repo, reqData *AppendDeviceLifecycleLogReq) error { + // DeviceLifecycle 查询是否已经存在 + devLifecycle, err := repo.GetDeviceLifecycleBySN(reqData.SN) + if err != nil && err != gorm.ErrRecordNotFound { + log.Error(err.Error()) + return err + } + if devLifecycle != nil { + log.Debugf("Begin to AppendDeviceLifecycleLogBySN:%s", reqData.SN) + defer log.Debugf("End to AppendDeviceLifecycleLogBySN:%s", reqData.SN) + // 获取当前的生命周期日志记录 + var devLL []model.ChangeLog + if devLifecycle.LifecycleLog != "" { + if err = json.Unmarshal([]byte(devLifecycle.LifecycleLog), &devLL);err != nil { + log.Error(err.Error()) + return err + } + } + // 追加 + devLL = append(devLL, reqData.LifecycleLog) + b, err := json.Marshal(devLL) + if err != nil { + log.Error(err.Error()) + return err + } + // DeviceLifecycle 结构体 + modDevLifecycle := &model.DeviceLifecycle{ + SN: reqData.SN, + LifecycleLog: string(b), + } + if err = repo.UpdateDeviceLifecycleBySN(modDevLifecycle);err != nil { + log.Errorf("UpdateDeviceLifecycleBySN failed: %s", err.Error()) + return err + } + } + return nil +} + + +// 转换结构体属性值以便存于 ChangeLog.OperationDetail +func convert2DetailOfOperationTypeAdd(repo model.Repo, mdev model.Device) (string, error) { + + getType := reflect.TypeOf(mdev) + getValue := reflect.ValueOf(mdev) + var details []string + + for i := 0; i < getType.NumField(); i++ { + field := getType.Field(i) + value := getValue.Field(i).Interface() + + switch field.Name { + case "FixedAssetNumber": + details = append(details, fmt.Sprintf("固资编号:%v", value)) + case "SN": + details = append(details, fmt.Sprintf("序列号:%v", value)) + case "Vendor": + details = append(details, fmt.Sprintf("厂商:%v", value)) + case "Category": + details = append(details, fmt.Sprintf("设备类型:%v", value)) + case "HardwareRemark": + details = append(details, fmt.Sprintf("硬件备注:%v", value)) + case "ServerRoomID": + if unitValue, ok := value.(uint); ok { + serverRoom, _ := repo.GetServerRoomByID(unitValue) + if serverRoom != nil { + details = append(details, fmt.Sprintf("机房管理单元:%v", serverRoom.Name)) + } + } else { + details = append(details, fmt.Sprintf("机房管理单元:%v", value)) + } + case "CabinetID": + if unitValue, ok := value.(uint); ok { + cabinet, _ := repo.GetServerCabinetByID(unitValue) + if cabinet != nil { + details = append(details, fmt.Sprintf("机架编号:%v", cabinet.Number)) + } + } else { + details = append(details, fmt.Sprintf("机架编号:%v", value)) + } + case "USiteID": + if unitValue, ok := value.(*uint); ok { + if unitValue != nil { // 避免空指针 + usite, _ := repo.GetServerUSiteByID(*unitValue) + if usite != nil { + details = append(details, fmt.Sprintf("机位编号:%v", usite.Number)) + } + } + } else { + details = append(details, fmt.Sprintf("机位编号:%v", value)) + } + case "StoreRoomID": + if unitValue, ok := value.(uint); ok { + storeRoom, _ := repo.GetStoreRoomByID(unitValue) + if storeRoom != nil { + details = append(details, fmt.Sprintf("库房管理单元:%v", storeRoom.Name)) + } + } else { + details = append(details, fmt.Sprintf("库房管理单元:%v", value)) + } + case "VCabinetID": + if unitValue, ok := value.(uint); ok { + vcabinet, _ := repo.GetVirtualCabinetByID(unitValue) + if vcabinet != nil { + details = append(details, fmt.Sprintf("货架编号:%v", vcabinet.Number)) + } + } else { + details = append(details, fmt.Sprintf("货架编号:%v", value)) + } + } + } + + if len(details) > 0 { + return strings.Join(details, ";"), nil + } else { + return "", fmt.Errorf("新增设备记录(SN:%v)字段详情转化失败", mdev.SN) + } +} + + +// 转换结构体属性值以便存于 ChangeLog.OperationDetail +func convert2DetailOfOperationTypeMove(repo model.Repo, dev *SubmitDeviceMigrationApprovalReqData) (string, error) { + var details []string + + oriDev, err := repo.GetDeviceBySN(dev.SN) + if err != nil { + return "", fmt.Errorf("搬迁设备记录(SN:%v)获取旧详情失败", dev.SN) + } + + oriServerRoom, _ := repo.GetServerRoomByID(oriDev.ServerRoomID) + oriCabinet, _ := repo.GetServerCabinetByID(oriDev.CabinetID) + //oriUsite, _ := repo.GetServerUSiteByID(*oriDev.USiteID) + oriStoreRoom, _ := repo.GetStoreRoomByID(oriDev.StoreRoomID) + oriVCabinet, _ := repo.GetVirtualCabinetByID(oriDev.VCabinetID) + dstServerRoom, _ := repo.GetServerRoomByID(dev.DstServerRoomID) + dstCabinet, _ := repo.GetServerCabinetByID(dev.DstCabinetID) + //dstUsite, _ := repo.GetServerUSiteByID(dev.DstUSiteID) + dstStoreRoom, _ := repo.GetStoreRoomByID(dev.DstStoreRoomID) + dstVCabinet, _ := repo.GetVirtualCabinetByID(dev.DstVCabinetID) + + details = append(details, fmt.Sprintf("序列号:%v", dev.SN)) + + switch dev.MigType { + case model.MigTypeUsite2Usite: + details = append(details, fmt.Sprintf("搬迁类型:机架->机架")) + // 机房管理单元 + if oriServerRoom != nil && dstServerRoom != nil { + details = append(details, fmt.Sprintf("机房管理单元: %v -> %v", oriServerRoom.Name, dstServerRoom.Name)) + } + // 机架 + if oriCabinet != nil && dstCabinet != nil { + details = append(details, fmt.Sprintf("机架: %v -> %v", oriCabinet.Number, dstCabinet.Number)) + } + // 机位 + if oriDev.USiteID != nil && dev.DstUSiteID != 0 { + oriUsite, _ := repo.GetServerUSiteByID(*oriDev.USiteID) + dstUsite, _ := repo.GetServerUSiteByID(dev.DstUSiteID) + if oriUsite != nil && dstUsite != nil { + details = append(details, fmt.Sprintf("机位: %v -> %v", oriUsite.Number, dstUsite.Number)) + } + } else { + details = append(details, "机位: 获取失败") + } + + case model.MigTypeUsite2Store: + details = append(details, fmt.Sprintf("搬迁类型:机架->库房")) + // 库房 + if oriServerRoom != nil && dstStoreRoom != nil { + details = append(details, fmt.Sprintf("机房管理单元->库房: %v -> %v", oriServerRoom.Name, dstStoreRoom.Name)) + } + // 货架 + if oriCabinet != nil && dstVCabinet != nil { + details = append(details, fmt.Sprintf("机架->货架: %v -> %v", oriCabinet.Number, dstVCabinet.Number)) + } + + case model.MigTypeStore2Usite: + details = append(details, fmt.Sprintf("搬迁类型:库房->机架")) + if oriStoreRoom != nil && dstServerRoom != nil { + details = append(details, fmt.Sprintf("库房->机房管理单元: %v -> %v", oriStoreRoom.Name, dstServerRoom.Name)) + } + if oriVCabinet != nil && dstCabinet != nil { + details = append(details, fmt.Sprintf("货架->机架: %v -> %v", oriVCabinet.Number, dstCabinet.Number)) + } + if dev.DstUSiteID != 0 { + dstUsite, _ := repo.GetServerUSiteByID(dev.DstUSiteID) + if dstUsite != nil { + details = append(details, fmt.Sprintf("机位: %v", dstUsite.Number)) + } + } else { + details = append(details, "机位: 获取失败") + } + + case model.MigTypeStore2Store: + details = append(details, fmt.Sprintf("搬迁类型:库房->库房")) + if oriStoreRoom != nil && dstStoreRoom != nil { + details = append(details, fmt.Sprintf("库房: %v -> %v", oriStoreRoom.Name, dstStoreRoom.Name)) + } + if oriVCabinet != nil && dstVCabinet != nil { + details = append(details, fmt.Sprintf("货架: %v -> %v", oriVCabinet.Number, dstVCabinet.Number)) + } + } + + if len(details) > 0 { + return strings.Join(details, ";"), nil + } else { + return "", fmt.Errorf("搬迁设备记录(SN:%v)字段详情转化失败", dev.SN) + } +} + + +// 转换结构体属性值以便存于 ChangeLog.OperationDetail +func convert2DetailOfOperationTypeRetire(repo model.Repo, mdev *model.Device) (string, error) { + var details []string + + details = append(details, fmt.Sprintf("序列号:%v", mdev.SN)) + + if oriServerRoom, _ := repo.GetServerRoomByID(mdev.ServerRoomID); oriServerRoom != nil { + details = append(details, fmt.Sprintf("机房管理单元: %v", oriServerRoom.Name)) + } + + if oriCabinet, _ := repo.GetServerCabinetByID(mdev.CabinetID); oriCabinet != nil { + details = append(details, fmt.Sprintf("机架: %v", oriCabinet.Number)) + } + + if mdev.USiteID != nil { + if oriUsite, _ := repo.GetServerUSiteByID(*mdev.USiteID); oriUsite != nil { + details = append(details, fmt.Sprintf("释放机位: %v", oriUsite.Number)) + } + } + + if oriStoreRoom, _ := repo.GetStoreRoomByID(mdev.StoreRoomID); oriStoreRoom != nil { + details = append(details, fmt.Sprintf("库房: %v", oriStoreRoom.Name)) + } + + if oriVCabinet, _ := repo.GetVirtualCabinetByID(mdev.VCabinetID);oriVCabinet != nil { + details = append(details, fmt.Sprintf("货架: %v", oriVCabinet.Number)) + } + + if len(details) > 0 { + return strings.Join(details, ";"), nil + } else { + return "", fmt.Errorf("退役设备记录(SN:%v)字段详情转化失败", mdev.SN) + } +} + + +func convert2DetailOfOperationTypeUpdate(repo model.Repo, mdev model.Device) (string, error) { + var details []string + getType := reflect.TypeOf(mdev) + getValue := reflect.ValueOf(mdev) + // 仅处理根据SN更新字段的场景 + oriDev, err := repo.GetDeviceBySN(mdev.SN) + if err != nil { + return "", fmt.Errorf("更新设备记录(SN:%v)获取旧详情失败", mdev.SN) + } + + for i := 0; i < getType.NumField(); i++ { + field := getType.Field(i) + value := getValue.Field(i).Interface() + + switch field.Name { + case "FixedAssetNumber": + if strValue, ok := value.(string); ok { + if strValue != "" { + details = append(details, fmt.Sprintf("固资编号:%v -> %v", oriDev.FixedAssetNumber, value)) + } + } else { + details = append(details, fmt.Sprintf("固资编号:%v", value)) + } + case "OperationStatus": + if strValue, ok := value.(string); ok { + if strValue != "" { + details = append(details, fmt.Sprintf("运营状态:%v -> %v", OperationStatusTransfer(oriDev.OperationStatus, true), OperationStatusTransfer(strValue, true))) + } + } else { + details = append(details, fmt.Sprintf("运营状态:%v", value)) + } + case "Usage": + if strValue, ok := value.(string); ok { + if strValue != "" { + details = append(details, fmt.Sprintf("用途:%v -> %v", oriDev.Usage, value)) + } + } else { + details = append(details, fmt.Sprintf("用途:%v", value)) + } + } + } + + if len(details) > 0 { + return strings.Join(details, ";"), nil + } else { + return "", fmt.Errorf("退役设备记录(SN:%v)字段详情转化失败", mdev.SN) + } + +} + + +func convert2DetailOfOperationTypeOSInstall(repo model.Repo, setting SaveDeviceSettingItem) (string, error) { + var details []string + + getType := reflect.TypeOf(setting) + getValue := reflect.ValueOf(setting) + + for i := 0; i < getType.NumField(); i++ { + field := getType.Field(i) + value := getValue.Field(i).Interface() + + switch field.Name { + case "InstallType": + details = append(details, fmt.Sprintf("安装方式:%v ", value)) + case "OSTemplateName": + details = append(details, fmt.Sprintf("操作系统安装模板:%v ", value)) + case "HardwareTemplateName": + details = append(details, fmt.Sprintf("硬件配置模板:%v ", value)) + case "NeedExtranetIP": + details = append(details, fmt.Sprintf("是否需要外网IPv4:%v ", value)) + case "NeedExtranetIPv6": + details = append(details, fmt.Sprintf("是否需要内网IPv6:%v ", value)) + case "NeedIntranetIPv6": + details = append(details, fmt.Sprintf("是否需要外网IPv6:%v ", value)) + } + } + + if len(details) > 0 { + return strings.Join(details, ";"), nil + } else { + return "", fmt.Errorf("部署设备记录(SN:%v)字段详情转化失败", setting.SN) + } + +} + + +// GetDeviceLifecycleBySN +func GetDeviceLifecycleBySN(log logger.Logger, repo model.Repo, sn string) (*DeviceLifecycleDetailPage, error) { + devLifecycle, err := repo.GetDeviceLifecycleBySN(sn) + if err != nil { + log.Errorf("fail to get device lifecycle by sn(%s), err: %v", sn, err) + return nil, err + } + devL := &DeviceLifecycleDetailPage { + AssetBelongs : devLifecycle.AssetBelongs, + Owner : devLifecycle.Owner, + IsRental : devLifecycle.IsRental, + MaintenanceServiceProvider : devLifecycle.MaintenanceServiceProvider, + MaintenanceService : devLifecycle.MaintenanceService, + LogisticsService : devLifecycle.LogisticsService, + MaintenanceServiceDateBegin : times.ISOTime(devLifecycle.MaintenanceServiceDateBegin).ToDateStr(), + MaintenanceServiceDateEnd : times.ISOTime(devLifecycle.MaintenanceServiceDateEnd).ToDateStr(), + MaintenanceServiceStatus : devLifecycle.MaintenanceServiceStatus, + DeviceRetiredDate : times.ISOTime(devLifecycle.DeviceRetiredDate).ToDateStr(), + } + return devL, nil +} + +//UpdateDeviceLifecycleReq +type UpdateDeviceLifecycleReq struct { + // 用户登录名 + LoginName string `json:"-"` + // 不支持更新的字段 + SN string `json:"sn"` + ID uint `json:"id"` + FixedAssetNumber string `json:"fixed_asset_number"` + DeviceRetiredDate time.Time `json:"device_retired_date"` + LifecycleLog string `json:"lifecycle_log"` + //更新字段 + AssetBelongs string `json:"asset_belongs"` + Owner string `json:"owner"` + IsRental string `json:"is_rental"` + MaintenanceServiceProvider string `json:"maintenance_service_provider"` + MaintenanceService string `json:"maintenance_service"` + LogisticsService string `json:"logistics_service"` + MaintenanceServiceDateBegin string `json:"maintenance_service_date_begin"` + MaintenanceServiceDateEnd string `json:"maintenance_service_date_end"` + MaintenanceServiceStatus string `json:"maintenance_service_status"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *UpdateDeviceLifecycleReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.AssetBelongs: "asset_belongs", + &reqData.Owner: "owner", + &reqData.IsRental: "is_rental", + &reqData.MaintenanceServiceProvider: "maintenance_service_provider", + &reqData.MaintenanceService: "maintenance_service", + &reqData.LogisticsService: "logistics_service", + &reqData.MaintenanceServiceDateBegin: "maintenance_service_date_begin", + &reqData.MaintenanceServiceDateEnd: "maintenance_service_date_end", + } +} + +// Validate 结构体数据校验 +func (reqData *UpdateDeviceLifecycleReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + //SN不能为空 + if reqData.SN != "" { + // DeviceLifecycle 查询是否已经存在 + devLifecycle, err := repo.GetDeviceLifecycleBySN(reqData.SN) + if err != nil && err != gorm.ErrRecordNotFound { + errs.Add([]string{"sn"}, binding.RequiredError, fmt.Sprintf("查询设备SN(%s)生命周期信息失败", reqData.SN)) + return errs + } + if devLifecycle != nil { + // 通过SN转换为实际更新的model.ID + reqData.ID = devLifecycle.ID + } else { + errs.Add([]string{"sn"}, binding.RequiredError, fmt.Sprintf("查询设备SN(%s)生命周期信息不存在", reqData.SN)) + return errs + } + + } else { + errs.Add([]string{"sn"}, binding.RequiredError, fmt.Sprintf("查询设备SN(%s)信息不允许为空", reqData.SN)) + return errs + } + // 校验是否租赁字段 + if reqData.IsRental != "" { + if reqData.IsRental != model.YESRental && reqData.IsRental != model.NORental { + errs.Add([]string{"is_rental"}, binding.RequiredError, fmt.Sprintf("是否租赁(%s)必须为 yes 或 no", reqData.IsRental)) + return errs + } + } + if reqData.MaintenanceServiceDateBegin == "" { + errs.Add([]string{"maintenance_service_date_begin"}, binding.RequiredError, fmt.Sprintf("维保起始日期(%s)不允许为空", reqData.MaintenanceServiceDateBegin)) + return errs + } + if !strings.Contains(reqData.MaintenanceServiceDateBegin, "-") { + errs.Add([]string{"maintenance_service_date_begin"}, binding.RequiredError, fmt.Sprintf("维保起始日期(%s)格式须为:YYYY-MM-DD", reqData.MaintenanceServiceDateBegin)) + return errs + } + if reqData.MaintenanceServiceDateEnd == "" { + errs.Add([]string{"maintenance_service_date_end"}, binding.RequiredError, fmt.Sprintf("维保截止日期(%s)不允许为空", reqData.MaintenanceServiceDateEnd)) + return errs + } + if !strings.Contains(reqData.MaintenanceServiceDateEnd, "-") { + errs.Add([]string{"maintenance_service_date_end"}, binding.RequiredError, fmt.Sprintf("维保截止日期(%s)格式须为:YYYY-MM-DD", reqData.MaintenanceServiceDateEnd)) + return errs + } + return nil +} + +//UpdateDeviceLifecycleBySN 更新 设备生命周期记录(for 单台设备延保) +func UpdateDeviceLifecycleBySN(log logger.Logger, repo model.Repo, reqData *UpdateDeviceLifecycleReq) error { + // DeviceLifecycle 结构体 + modDevLifecycle := &model.DeviceLifecycle{ + SN: reqData.SN, + AssetBelongs: reqData.AssetBelongs, + Owner: reqData.Owner, + IsRental: reqData.IsRental, + MaintenanceServiceProvider: reqData.MaintenanceServiceProvider, + MaintenanceService: reqData.MaintenanceService, + LogisticsService: reqData.LogisticsService, + //MaintenanceServiceStatus: reqData.MaintenanceServiceStatus, + //DeviceRetiredDate: reqData.DeviceRetiredDate, + //LifecycleLog: reqData.LifecycleLog, + } + + modDevLifecycle.Model.ID = reqData.ID + modDevLifecycle.MaintenanceServiceDateBegin, _ = time.Parse(times.DateLayout, reqData.MaintenanceServiceDateBegin) + modDevLifecycle.MaintenanceServiceDateEnd, _ = time.Parse(times.DateLayout, reqData.MaintenanceServiceDateEnd) + + now := time.Now() + currentDate := now.Format("2006-01-02") + if now.Before(modDevLifecycle.MaintenanceServiceDateBegin) { + log.Debugf("current_date=%s < maintenance_service_begin_date=%s. Update Device(SN:%s) set status=%s -> %s", + currentDate, modDevLifecycle.MaintenanceServiceDateBegin, reqData.SN, modDevLifecycle.MaintenanceServiceStatus, model.MaintenanceServiceStatusInactive) + modDevLifecycle.MaintenanceServiceStatus = model.MaintenanceServiceStatusInactive + } else if now.After(modDevLifecycle.MaintenanceServiceDateEnd) { + log.Debugf("current_date=%s > maintenance_service_end_date=%s. Update Device(%s) set status=%s -> %s", + currentDate, modDevLifecycle.MaintenanceServiceDateEnd, reqData.SN, modDevLifecycle.MaintenanceServiceStatus, model.MaintenanceServiceStatusOutOfWarranty) + modDevLifecycle.MaintenanceServiceStatus = model.MaintenanceServiceStatusOutOfWarranty + } else { + log.Debugf("current_date=%s between maintenance_service_begin_date=%s and maintenance_service_end_date=%s. Update Device(%s) set status=%s -> %s", + currentDate, modDevLifecycle.MaintenanceServiceDateBegin, modDevLifecycle.MaintenanceServiceDateEnd, reqData.SN, modDevLifecycle.MaintenanceServiceStatus, model.MaintenanceServiceStatusUnderWarranty) + modDevLifecycle.MaintenanceServiceStatus = model.MaintenanceServiceStatusUnderWarranty + } + + _, err := repo.SaveDeviceLifecycle(modDevLifecycle) + if err != nil { + log.Errorf("SaveDeviceLifecycle failed: %s", err.Error()) + return err + } + return err +} + +//BatchUpdateDeviceLifecycles 批量修改设备生命周期记录结构 +type BatchUpdateDeviceLifecycles struct { + DeviceLifecycles []UpdateDeviceLifecycles `json:"device_lifecycles"` + // 用户登录名 + LoginName string `json:"-"` +} + +// UpdateDeviceLifecycles 批量修改设备生命周期记录结构 +type UpdateDeviceLifecycles struct { + SN string `json:"sn"` + AssetBelongs string `json:"asset_belongs"` + Owner string `json:"owner"` + IsRental string `json:"is_rental"` + MaintenanceServiceProvider string `json:"maintenance_service_provider"` + MaintenanceService string `json:"maintenance_service"` + LogisticsService string `json:"logistics_service"` + MaintenanceServiceDateBegin string `json:"maintenance_service_date_begin"` + MaintenanceServiceDateEnd string `json:"maintenance_service_date_end"` + MaintenanceServiceStatus string `json:"maintenance_service_status"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *BatchUpdateDeviceLifecycles) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.DeviceLifecycles: "device_lifecycles", + } +} + +// Validate 对修改的数据做基本校验 +func (reqData *BatchUpdateDeviceLifecycles) Validate(request *http.Request, errs binding.Errors) binding.Errors { + for _, d := range reqData.DeviceLifecycles { + if d.SN == "" { + errs.Add([]string{"设备SN号"}, binding.RequiredError, fmt.Sprintf("设备SN不能为空")) + return errs + } + // 校验是否租赁字段 + if d.IsRental != "" { + if d.IsRental != model.YESRental && d.IsRental != model.NORental { + errs.Add([]string{"is_rental"}, binding.RequiredError, fmt.Sprintf("是否租赁(%s)必须为 yes 或 no", d.IsRental)) + return errs + } + } + if d.MaintenanceServiceDateBegin != "" && !strings.Contains(d.MaintenanceServiceDateBegin, "-") { + errs.Add([]string{"maintenance_service_date_begin"}, binding.RequiredError, fmt.Sprintf("维保起始日期(%s)格式须为:YYYY-MM-DD", d.MaintenanceServiceDateBegin)) + return errs + } + if d.MaintenanceServiceDateEnd != "" && !strings.Contains(d.MaintenanceServiceDateEnd, "-") { + errs.Add([]string{"maintenance_service_date_end"}, binding.RequiredError, fmt.Sprintf("维保截止日期(%s)格式须为:YYYY-MM-DD", d.MaintenanceServiceDateEnd)) + return errs + } + } + + return nil +} + + +//BatchUpdateDeviceLifecycleBySN 批量修改设备生命周期记录 +func BatchUpdateDeviceLifecycleBySN(log logger.Logger, repo model.Repo, conf *config.Config, reqData *BatchUpdateDeviceLifecycles) (succeedSNs []string, totalAffected int64, err error) { + for _, d := range reqData.DeviceLifecycles { + // DeviceLifecycle 查询是否已经存在 + modDevLifecycle, err := repo.GetDeviceLifecycleBySN(d.SN) + if err != nil && err != gorm.ErrRecordNotFound { + log.Errorf("GetDeviceLifecycleBySN failed: %s", err.Error()) + return succeedSNs, totalAffected, err + } + if modDevLifecycle != nil { + var details []string + if d.AssetBelongs != "" { + details = append(details, fmt.Sprintf("资产归属:%v -> %v", modDevLifecycle.AssetBelongs, d.AssetBelongs)) + modDevLifecycle.AssetBelongs = d.AssetBelongs + } + if d.Owner != "" { + details = append(details, fmt.Sprintf("负责人:%v -> %v", modDevLifecycle.Owner, d.Owner)) + modDevLifecycle.Owner = d.Owner + } + if d.IsRental != "" { + details = append(details, fmt.Sprintf("是否租赁:%v -> %v", modDevLifecycle.IsRental, d.IsRental)) + modDevLifecycle.IsRental = d.IsRental + } + if d.MaintenanceServiceProvider != "" { + details = append(details, fmt.Sprintf("维保服务供应商:%v -> %v", modDevLifecycle.MaintenanceServiceProvider, d.MaintenanceServiceProvider)) + modDevLifecycle.MaintenanceServiceProvider = d.MaintenanceServiceProvider + } + if d.MaintenanceService != "" { + details = append(details, fmt.Sprintf("维保服务内容:%v -> %v", modDevLifecycle.MaintenanceService, d.MaintenanceService)) + modDevLifecycle.MaintenanceService = d.MaintenanceService + } + if d.LogisticsService != "" { + details = append(details, fmt.Sprintf("物流服务内容:%v -> %v", modDevLifecycle.LogisticsService, d.LogisticsService)) + modDevLifecycle.LogisticsService = d.LogisticsService + } + if d.MaintenanceServiceDateBegin != "" { + details = append(details, fmt.Sprintf("维保服务起始日期:%v -> %v", modDevLifecycle.MaintenanceServiceDateBegin, d.MaintenanceServiceDateBegin)) + modDevLifecycle.MaintenanceServiceDateBegin, _ = time.Parse(times.DateLayout, d.MaintenanceServiceDateBegin) + } + if d.MaintenanceServiceDateEnd != "" { + details = append(details, fmt.Sprintf("维保服务截止日期:%v -> %v", modDevLifecycle.MaintenanceServiceDateEnd, d.MaintenanceServiceDateEnd)) + modDevLifecycle.MaintenanceServiceDateEnd, _ = time.Parse(times.DateLayout, d.MaintenanceServiceDateEnd) + } + + now := time.Now() + currentDate := now.Format("2006-01-02") + if now.Before(modDevLifecycle.MaintenanceServiceDateBegin) { + log.Debugf("current_date=%s < maintenance_service_begin_date=%s. Update Device(SN:%s) set status=%s -> %s", + currentDate, modDevLifecycle.MaintenanceServiceDateBegin, d.SN, modDevLifecycle.MaintenanceServiceStatus, model.MaintenanceServiceStatusInactive) + details = append(details, fmt.Sprintf("维保服务状态:%v -> %v", modDevLifecycle.MaintenanceServiceStatus, model.MaintenanceServiceStatusInactive)) + modDevLifecycle.MaintenanceServiceStatus = model.MaintenanceServiceStatusInactive + } else if now.After(modDevLifecycle.MaintenanceServiceDateEnd) { + log.Debugf("current_date=%s > maintenance_service_end_date=%s. Update Device(%s) set status=%s -> %s", + currentDate, modDevLifecycle.MaintenanceServiceDateEnd, d.SN, modDevLifecycle.MaintenanceServiceStatus, model.MaintenanceServiceStatusOutOfWarranty) + details = append(details, fmt.Sprintf("维保服务状态:%v -> %v", modDevLifecycle.MaintenanceServiceStatus, model.MaintenanceServiceStatusOutOfWarranty)) + modDevLifecycle.MaintenanceServiceStatus = model.MaintenanceServiceStatusOutOfWarranty + } else { + log.Debugf("current_date=%s between maintenance_service_begin_date=%s and maintenance_service_end_date=%s. Update Device(%s) set status=%s -> %s", + currentDate, modDevLifecycle.MaintenanceServiceDateBegin, modDevLifecycle.MaintenanceServiceDateEnd, d.SN, modDevLifecycle.MaintenanceServiceStatus, model.MaintenanceServiceStatusUnderWarranty) + details = append(details, fmt.Sprintf("维保服务状态:%v -> %v", modDevLifecycle.MaintenanceServiceStatus, model.MaintenanceServiceStatusUnderWarranty)) + modDevLifecycle.MaintenanceServiceStatus = model.MaintenanceServiceStatusUnderWarranty + } + if len(details) > 0 { + // 获取当前的生命周期日志记录 + var devLL []model.ChangeLog + if modDevLifecycle.LifecycleLog != "" { + if err = json.Unmarshal([]byte(modDevLifecycle.LifecycleLog), &devLL);err != nil { + log.Error(err.Error()) + return succeedSNs, totalAffected, err + } + } + devLog := model.ChangeLog { + OperationUser: reqData.LoginName, + OperationType: model.OperationTypeUpdate, + OperationDetail: strings.Join(details, ";"), + OperationTime: times.ISOTime(time.Now()).ToTimeStr(), + } + // 追加Log + devLL = append(devLL, devLog) + b, err := json.Marshal(devLL) + if err != nil { + log.Error(err.Error()) + return succeedSNs, totalAffected, err + } + modDevLifecycle.LifecycleLog = string(b) + } + _, err := repo.SaveDeviceLifecycle(modDevLifecycle) + if err != nil { + log.Errorf("SaveDeviceLifecycle failed: %s", err.Error()) + return succeedSNs, totalAffected, err + } + // 统计成功 + totalAffected++ + succeedSNs = append(succeedSNs, d.SN) + + } else { + log.Errorf("查询设备SN(%s)生命周期信息不存在", d.SN) + return succeedSNs, totalAffected, fmt.Errorf("查询设备SN(%s)生命周期信息不存在", d.SN) + } + } + return +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/device_log.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/device_log.go new file mode 100644 index 0000000000000000000000000000000000000000..5238bdb99ed2832f698e4a0f30ad88a590141415 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/device_log.go @@ -0,0 +1,62 @@ +package service + +import ( + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" +) + +// DeviceLogResp 安装日志返回值 +type DeviceLogResp struct { + // 设备序列号 + SN string `json:"sn"` + // InstallType 系统参数ID + DeviceSettingID uint `json:"device_setting_id"` + // 操作系统安装模板 + Logs []DeviceLog `json:"logs"` +} + +// DeviceLog 安装日志信息 +type DeviceLog struct { + // 日志记录ID + ID uint `json:"id"` + // 日志标题 + Title string `json:"title"` + // 日志内容 + Content string `json:"content"` + // 日志记录创建时间 + CreatedAt string `json:"create_at"` + // 日志记录更新时间 + UpdatedAt string `json:"updated_at"` +} + +// GetDeviceLogByDeviceSettingID 返回指定SN返回系统装机日志信息 +func GetDeviceLogByDeviceSettingID(log logger.Logger, repo model.Repo, id uint) (deviceLogResp *DeviceLogResp, err error) { + items, err := repo.GetDeviceLogsByDeviceSettingID(id) + + deviceLogResp = &DeviceLogResp{} + if err != nil { + return nil, err + } + + if len(items) == 0 { + return deviceLogResp, nil + } + + deviceLogResp.SN = items[0].SN + deviceLogResp.DeviceSettingID = items[0].DeviceSettingID + + var deviceLog []DeviceLog + for _, item := range items { + deviceLog = append(deviceLog, DeviceLog{ + ID: item.ID, + Title: item.Title, + Content: item.Content, + CreatedAt: item.CreatedAt.Format("2006-01-02 15:04:05"), + UpdatedAt: item.UpdatedAt.Format("2006-01-02 15:04:05"), + }) + } + + deviceLogResp.Logs = deviceLog + + return deviceLogResp, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/device_setting.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/device_setting.go new file mode 100644 index 0000000000000000000000000000000000000000..5b7d5457f834e6736596eacaf219505bafba8b7e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/device_setting.go @@ -0,0 +1,2047 @@ +package service + +import ( + "errors" + "encoding/base64" + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "reflect" + "strings" + "time" + + "idcos.io/cloudboot/limiter" + + "github.com/astaxie/beego/httplib" + "github.com/jinzhu/gorm" + "github.com/voidint/binding" + "github.com/voidint/page" + + "idcos.io/cloudboot/config" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/server/cloudbootserver/types/setting" + "idcos.io/cloudboot/utils/centos6" + "idcos.io/cloudboot/utils/collection" + mystrings "idcos.io/cloudboot/utils/strings" + "idcos.io/cloudboot/utils/times" +) + +// SaveDeviceSettingItem 保存设备装机参数条目 +type SaveDeviceSettingItem struct { + // 设备序列号 + SN string `json:"sn"` + // InstallType 安装方式 + // Enum: image,pxe + InstallType string `json:"install_type"` + // 操作系统安装模板 + OSTemplateName string `json:"os_template_name"` + // 硬件配置模板 + HardwareTemplateName string `json:"hardware_template_name"` + // NeedExtranetIP 是否需要外网IP。可选值:yes-是; no-否; + // Enum: yes,no + NeedExtranetIP string `json:"need_extranet_ip"` + // 是否需要内外网IPv6 Enum: yes,no + NeedExtranetIPv6 string `json:"need_extranet_ipv6"` + NeedIntranetIPv6 string `json:"need_intranet_ipv6"` +} + +// SaveDeviceSettingsReq 保存设备装机参数请求结构体 +type SaveDeviceSettingsReq struct { + Settings DeviceSettings + CurrentUser *model.CurrentUser // 操作人 +} + +// DeviceSettings 设备装机参数集合 +type DeviceSettings []*SaveDeviceSettingItem + +// Validate 装机参数校验 +func (reqData DeviceSettings) Validate(r *http.Request, errs binding.Errors) binding.Errors { + for i := range reqData { + if errs = reqData[i].validateOne(r, errs); errs.Len() > 0 { + return errs + } + } + return errs +} + +// validateOne 校验单台设备的装机参数 +func (sett *SaveDeviceSettingItem) validateOne(r *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(r.Context()) + + if sett.SN == "" { + errs.Add([]string{"sn"}, binding.RequiredError, "SN不能为空") + return errs + } + devSett, _ := repo.GetDeviceSettingBySN(sett.SN) + if devSett != nil && devSett.Status == model.InstallStatusIng { + errs.Add([]string{"sn"}, binding.RequiredError, fmt.Sprintf("[%s]正在部署,不能重复提交", sett.SN)) + return errs + } + if sett.InstallType == "" { + errs.Add([]string{"install_type"}, binding.RequiredError, "安装方式(install_type)不能为空") + return errs + } + if !collection.InSlice(sett.InstallType, []string{model.InstallationPXE, model.InstallationImage}) { + errs.Add([]string{"install_type"}, binding.BusinessError, fmt.Sprintf("[%s]无效的安装方式(install_type)值: %s", sett.SN, sett.InstallType)) + return errs + } + + if sett.OSTemplateName == "" { + errs.Add([]string{"os_template_name"}, binding.RequiredError, fmt.Sprintf("[%s]操作系统模板(os_template_name)不能为空", sett.SN)) + return errs + } + + switch sett.InstallType { + case model.InstallationImage: + if _, err := repo.GetImageTemplateByName(sett.OSTemplateName); err == gorm.ErrRecordNotFound { + errs.Add([]string{"os_template_name"}, binding.BusinessError, fmt.Sprintf("[%s]无效的操作系统模板(os_template_name): %s", sett.SN, sett.OSTemplateName)) + return errs + } + case model.InstallationPXE: + if _, err := repo.GetSystemTemplateByName(sett.OSTemplateName); err == gorm.ErrRecordNotFound { + errs.Add([]string{"os_template_name"}, binding.BusinessError, fmt.Sprintf("[%s]无效的操作系统模板(os_template_name): %s", sett.SN, sett.OSTemplateName)) + return errs + } + } + + if sett.HardwareTemplateName == "" { + errs.Add([]string{"hardware_template_name"}, binding.RequiredError, fmt.Sprintf("[%s]硬件配置模板(hardware_template_name)不能为空", sett.SN)) + return errs + } + + if _, err := repo.GetHardwareTemplateByName(sett.HardwareTemplateName); err == gorm.ErrRecordNotFound { + errs.Add([]string{"hardware_template_name"}, binding.BusinessError, fmt.Sprintf("[%s]无效的硬件配置模板(hardware_template_name): %s", sett.SN, sett.HardwareTemplateName)) + return errs + } + + if sett.NeedExtranetIP == "" { + errs.Add([]string{"need_extranet_ip"}, binding.RequiredError, fmt.Sprintf("[%s]是否配置外网IP(need_extranet_ip)不能为空", sett.SN)) + return errs + } + if !collection.InSlice(sett.NeedExtranetIP, []string{model.YES, model.NO}) { + errs.Add([]string{"need_extranet_ip"}, binding.BusinessError, fmt.Sprintf("[%s]无效的是否配置外网IP(need_extranet_ip)值: %s", sett.SN, sett.NeedExtranetIP)) + return errs + } + // 校验当前设备状态,若设备信息存在且状态为已退役、待退役,则不允许安装操作系统。 + dev, err := repo.GetDeviceBySN(sett.SN) + if err == gorm.ErrRecordNotFound { + errs.Add([]string{"sn"}, binding.BusinessError, fmt.Sprintf("[%s]请先录入物理机信息", sett.SN)) + return errs + } + if err != nil { + errs.Add([]string{"sn"}, binding.SystemError, "系统内部发生错误") + return errs + } + if dev.OperationStatus == model.DevOperStatPreRetire || dev.OperationStatus == model.DevOperStatRetiring|| dev.OperationStatus == model.DevOperStateRetired { + errs.Add([]string{"sn"}, binding.BusinessError, fmt.Sprintf("[%s]待退役/退役中/已退役物理机无法上架部署", sett.SN)) + return errs + } + // 校验待分配的IP网段是否存在 + _, err = repo.GetIntranetIPNetworksBySN(sett.SN) + if err == gorm.ErrRecordNotFound { + errs.Add([]string{"sn"}, binding.BusinessError, fmt.Sprintf("[%s]无法找到合适的内网网段并分配IP", sett.SN)) + return errs + } + if err != nil { + errs.Add([]string{"sn"}, binding.BusinessError, err.Error()) + return errs + } + if sett.NeedExtranetIP == model.YES { + _, err = repo.GetExtranetIPNetworksBySN(sett.SN) + if err == gorm.ErrRecordNotFound { + errs.Add([]string{"sn"}, binding.BusinessError, fmt.Sprintf("[%s]无法找到合适的外网网段并分配IP", sett.SN)) + return errs + } + if err != nil { + errs.Add([]string{"sn"}, binding.BusinessError, err.Error()) + return errs + } + } + if sett.NeedIntranetIPv6 == model.YES { + _, err := repo.GetIPv6NetworkBySN(sett.SN, model.Intranet) + if err == gorm.ErrRecordNotFound { + errs.Add([]string{"sn"}, binding.BusinessError, fmt.Sprintf("[%s]无法找到合适的IPv6内网网段并分配IP", sett.SN)) + return errs + } + if err != nil { + errs.Add([]string{"sn"}, binding.BusinessError, err.Error()) + return errs + } + } + if sett.NeedExtranetIPv6 == model.YES { + _, err := repo.GetIPv6NetworkBySN(sett.SN, model.Extranet) + if err == gorm.ErrRecordNotFound { + errs.Add([]string{"sn"}, binding.BusinessError, fmt.Sprintf("[%s]无法找到合适的IPv6外网网段并分配IP", sett.SN)) + return errs + } + if err != nil { + errs.Add([]string{"sn"}, binding.BusinessError, err.Error()) + return errs + } + } + if tor, _ := repo.GetTORBySN(sett.SN); tor == "" { + errs.Add([]string{"sn"}, binding.BusinessError, fmt.Sprintf("[%s]无法找到TOR", sett.SN)) + return errs + } + + // TODO 校验网段内是否还有剩余IP可供分配 + return errs +} + +// SaveDeviceSettings 批量保存设备装机参数。 +// 多台设备的装机参数之间并不包含事务,保存成功的设备的序列号(SN)将被返回。 +func SaveDeviceSettings(log logger.Logger, repo model.Repo, conf *config.Config, lim limiter.Limiter, reqData *SaveDeviceSettingsReq) (succeeds []string, err error) { + for i := range reqData.Settings { + if err = saveDeviceSetting(log, repo, conf, lim, reqData.Settings[i], reqData.CurrentUser.LoginName); err != nil { + return succeeds, err + } + succeeds = append(succeeds, reqData.Settings[i].SN) + // 变更记录 + optDetail, err := convert2DetailOfOperationTypeOSInstall(repo, *reqData.Settings[i]) + if err != nil { + log.Errorf("Fail to convert Detail of OperationTypeOSInstall: %v", err) + } + devLog := model.ChangeLog { + OperationUser: reqData.CurrentUser.Name, + OperationType: model.OperationTypeOSInstall, + OperationDetail: optDetail, + OperationTime: times.ISOTime(time.Now()).ToTimeStr(), + } + adll := &AppendDeviceLifecycleLogReq{ + SN: reqData.Settings[i].SN, + LifecycleLog: devLog, + } + if err = AppendDeviceLifecycleLogBySN(log, repo, adll);err != nil { + log.Error("LifecycleLog: append device lifecycle log (sn:%v) fail(%s)", reqData.Settings[i].SN, err.Error()) + } + + } + return succeeds, nil +} + +// saveDeviceSetting 保存单台设备的装机参数 +func saveDeviceSetting(log logger.Logger, repo model.Repo, conf *config.Config, lim limiter.Limiter, sett *SaveDeviceSettingItem, LoginName string) (err error) { + log.Infof("Start saving device(%s) settings", sett.SN) + defer log.Infof("End saving device(%s) settings", sett.SN) + + ds := model.DeviceSetting{ + SN: sett.SN, + InstallType: sett.InstallType, + Status: model.InstallStatusPre, + NeedExtranetIP: sett.NeedExtranetIP, + NeedIntranetIPv6: sett.NeedIntranetIPv6, + NeedExtranetIPv6: sett.NeedExtranetIPv6, + } + + // 获取硬件配置模板ID + hwTemplate, err := repo.GetHardwareTemplateByName(sett.HardwareTemplateName) + if err != nil { + return nil + } + ds.HardwareTemplateID = hwTemplate.ID + // 查询旧装机记录 + old, err := repo.GetDeviceSettingBySN(sett.SN) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if old != nil { + ds.ID = old.ID + ds.CreatedAt = old.CreatedAt + ds.Updater = LoginName + // 旧安装模板ID 置0 + ds.ImageTemplateID = 0 + ds.SystemTemplateID = 0 + } else { + ds.Creator = LoginName + } + + // 获取操作系统安装模板ID + switch sett.InstallType { + case model.InstallationImage: + imgTemplate, err := repo.GetImageTemplateByName(sett.OSTemplateName) + if err != nil { + return nil + } + ds.ImageTemplateID = imgTemplate.ID + case model.InstallationPXE: + sysTemplate, err := repo.GetSystemTemplateByName(sett.OSTemplateName) + if err != nil { + return nil + } + ds.SystemTemplateID = sysTemplate.ID + } + + log.Infof("Start assigning IP to the device(%s)", sett.SN) + // 记录本次已分配的IP ID以便回滚 + var ipIDsForRollback []uint + + //根据需要分配IP,假如有装机记录,并且有IP,则不用重复分配了 + if old == nil || old.IntranetIP == "" { + // 获取内网业务IP + intraIP, err := repo.AssignIntranetIP(sett.SN) + if err != nil { + return err + } + ds.IntranetIPNetworkID = intraIP.IPNetworkID + ds.IntranetIP = intraIP.IP + log.Infof("Device(%s) is assigned to intranet ip: %s", sett.SN, intraIP.IP) + ipIDsForRollback = append(ipIDsForRollback, intraIP.ID) + } else { + ds.IntranetIPNetworkID = old.IntranetIPNetworkID + ds.IntranetIP = old.IntranetIP + } + + if sett.NeedExtranetIP == model.YES { + // 获取外网业务IP + log.Infof("Device(%s) need extranet ip", sett.SN) + if old == nil || old.ExtranetIP == "" { + extraIP, err := repo.AssignExtranetIP(sett.SN) + if err != nil { + return err + } + ds.ExtranetIPNetworkID = extraIP.IPNetworkID + ds.ExtranetIP = extraIP.IP + log.Infof("Device(%s) is assigned to extranet ip: %s", sett.SN, extraIP.IP) + ipIDsForRollback = append(ipIDsForRollback, extraIP.ID) + } else { + ds.ExtranetIPNetworkID = old.ExtranetIPNetworkID + ds.ExtranetIP = old.ExtranetIP + } + } else { + // 尝试释放之前已经占用的外网业务IP + _, _ = repo.ReleaseIP(sett.SN, model.IPScopeExtranet) + } + + // NeedIntranetIPv6 + if sett.NeedIntranetIPv6 == model.YES { + // 获取内网业务IPv6 + log.Infof("Device(%s) need intranet ipv6", sett.SN) + if old == nil || old.IntranetIPv6 == "" { + intraIPv6, err := repo.AssignIPv6(sett.SN, model.IPScopeIntranet) + if err != nil { + return err + } + ds.IntranetIPv6NetworkID = intraIPv6.IPNetworkID + ds.IntranetIPv6 = intraIPv6.IP + log.Infof("Device(%s) is assigned to intranet ipv6: %s", sett.SN, intraIPv6.IP) + ipIDsForRollback = append(ipIDsForRollback, intraIPv6.ID) + } else { + ds.IntranetIPv6NetworkID = old.IntranetIPv6NetworkID + ds.IntranetIPv6 = old.IntranetIPv6 + } + } else { + // 尝试释放之前已经占用的内网业务IPv6 + log.Infof("Device(%s) no need intranet ipv6", sett.SN) + _, _ = repo.ReleaseIPv6(sett.SN, model.IPScopeIntranet) + } + + // NeedExtranetIPv6 + if sett.NeedExtranetIPv6 == model.YES { + // 获取外网业务IPv6 + log.Infof("Device(%s) need extranet ipv6", sett.SN) + if old == nil || old.ExtranetIPv6 == "" { + extraIPv6, err := repo.AssignIPv6(sett.SN, model.IPScopeExtranet) + if err != nil { + return err + } + ds.ExtranetIPv6NetworkID = extraIPv6.IPNetworkID + ds.ExtranetIPv6 = extraIPv6.IP + log.Infof("Device(%s) is assigned to extranet ipv6: %s", sett.SN, extraIPv6.IP) + ipIDsForRollback = append(ipIDsForRollback, extraIPv6.ID) + } else { + ds.ExtranetIPv6NetworkID = old.ExtranetIPv6NetworkID + ds.ExtranetIPv6 = old.ExtranetIPv6 + } + } else { + // 尝试释放之前已经占用的外网业务IPv6 + log.Infof("Device(%s) no need extranet ipv6", sett.SN) + _, _ = repo.ReleaseIPv6(sett.SN, model.IPScopeExtranet) + } + + // 保存装机参数,失败时回滚已分配的IP + if err = repo.SaveDeviceSetting(&ds); err != nil { + for _, id := range ipIDsForRollback { + _ = repo.UnassignIP(id) + log.Debugf("Unassign IP (ID: %v) when failed to save device setting of SN: %s", id, sett.SN) + } + return err + } + if old != nil && old.ID > 0 { + _, _ = repo.UpdateDeviceLogType(old.ID, model.DeviceLogInstallType, model.DeviceLogHistoryType) + } + + log.Infof("Device(%s) settings have been saved. Going to install os.", sett.SN) + // 进入装机部署 + go startInstallation(log, repo, conf, lim, sett.SN) + return nil +} + +// startInstallation 带外远程开机并开始安装流程 +func startInstallation(log logger.Logger, repo model.Repo, conf *config.Config, lim limiter.Limiter, sn string) (err error) { + // 1、获取进入bootos所需令牌 + var bucket limiter.Bucket + var token limiter.Token + + if conf.DHCPLimiter.Enable { + bucket, err = lim.Route(sn) + if err != nil { + return err + } + token, err = bucket.Acquire(sn, time.Second*time.Duration(conf.DHCPLimiter.WaitingTimeout)) + if err != nil { + return err + } + } + + // 2、修改装机开始时间、装机状态 + now := time.Now() + if _, err = repo.UpdateDeviceSettingBySN(&model.DeviceSetting{ + SN: sn, + InstallationStartTime: &now, + Status: model.InstallStatusIng, + }); err != nil { + if conf.DHCPLimiter.Enable { + _ = bucket.Return(sn, token) + } + return err + } + + log.Infof("Remote boot and start the OS installation process of the device(SN: %s )", sn) + var sb strings.Builder + //TODO 优化项:如果设备在bootos,则跳过重启的过程 + //如果设备已上电,PXE重启,如果关机该命令会有问题,此时再尝试开机 + out, err := OperateOOBPower(log, repo, sn, conf.Crypto.Key, conf.Server.OOBDomain, PowerRestart, true) + if err != nil { + log.Errorf("PXE-PowerRestart重启失败(%s),下一步尝试开机",err.Error()) + sb.WriteString(fmt.Sprintf("\nPXE-PowerRestart重启失败(%s),下一步尝试开机\n", err.Error())) + out, err = OperateOOBPower(log, repo, sn, conf.Crypto.Key, conf.Server.OOBDomain, PowerOn, true) + sb.WriteString(strings.TrimSpace(out)) + if err != nil { + log.Errorf("PXE-PowerOn开机失败(%s)",err.Error()) + sb.WriteString(fmt.Sprintf("PXE-PowerOn开机失败(%s)", err.Error())) + } + } + // 调用自身API进行安装进度上报(进度值为'5%') + var reqData struct { + Progress float64 `json:"progress"` + Log string `json:"log"` + Title string `json:"title"` + } + if err != nil { + reqData.Progress = -1.0 + } else { + reqData.Progress = 0.05 + } + reqData.Title = "物理机远程开机" + reqData.Log = base64.StdEncoding.EncodeToString([]byte(sb.String())) + + reqBody, _ := json.Marshal(&reqData) + + url := fmt.Sprintf("%s/api/cloudboot/v1/devices/%s/installations/progress", fmt.Sprintf("http://localhost:%d", conf.Server.HTTPPort), sn) + log.Infof("POST %s", url) + log.Infof("Request body: %s", reqBody) + + resp, err := httplib.Post(url). + Header("Content-Type", "application/json"). + Header("Accept", "application/json"). + Body(reqBody).Response() + if err != nil { + log.Error(err) + return err + } + defer resp.Body.Close() + + respBody, err := ioutil.ReadAll(resp.Body) + if err != nil { + log.Error(err) + return err + } + log.Infof("Response body: %s", respBody) + return err +} + +//GetNetworkSettingBySNResp 根据SN请求设备业务网络配置响应结构 +type GetNetworkSettingBySNResp struct { + // IP来源 + IPSource string `json:"ip_source"` + BondingRequired string `json:"bonding_required"` + //分配给该设备的IP对象数组 + Items []model.IPAndIPNetworkUnion `json:"items"` +} + +// GetNetworkSettingBySN 返回指定SN的设备业务IP配置信息 +func GetNetworkSettingBySN(log logger.Logger, repo model.Repo, sn string) (ipnet *GetNetworkSettingBySNResp, err error) { + //根据SN获取设备信息 + dev, err := repo.GetDeviceBySN(sn) + if err != nil { + return nil, err + } + // 根据SN获取装机参数 + ds, err := repo.GetDeviceSettingBySN(sn) + if err != nil { + log.Errorf("get device setting fail:%v", err) + return nil, err + } + if ds != nil { + // 可能有多IP,只分别返回第一个作为配置项 + in := strings.Split(ds.IntranetIP, ",")[0] + ex := strings.Split(ds.ExtranetIP, ",")[0] + inv6 := strings.Split(ds.IntranetIPv6, ",")[0] + exv6 := strings.Split(ds.ExtranetIPv6, ",")[0] + nwsRet := make([]model.IPAndIPNetworkUnion, 0, 4) + + //通过IP反查网段信息 + if in != "" { + ip, _ := repo.GetIPByIP(in, model.IPScopeIntranet) + if ip.IPNetworkID > 0 { + netSegment, err := repo.GetIPNetworkByID(ip.IPNetworkID) + if err != nil { + log.Errorf("query intranet net segment by id:%d fail,%v", ip.IPNetworkID, err) + } else if netSegment != nil { + scope := model.IPScopeIntranet + //TGW 网段网关有2个,逗号分隔,与关联的2台交换机顺序一一对应 + //故获取网关时需要根据设备对应的机位-交换机端口进行顺序获取 + if netSegment.Category == model.TGWIntranet || netSegment.Category == model.TGWExtranet { + switcher, err := repo.GetIntranetSwitchBySN(sn) + if err != nil { + log.Errorf("query intranet switch by dev sn:%s fail:%v", sn, err) + } + ipGatewayList := strings.Split(netSegment.Gateway, ",") + var switchs []string + _ = json.Unmarshal([]byte(netSegment.Switches), &switchs) + // 仅处理2个网关对应2台交换机设备的场景 + if len(ipGatewayList) == 2 && len(switchs) == 2 { + for k := range switchs { + if switchs[k] == switcher.FixedAssetNumber { + nwsRet = append(nwsRet, model.IPAndIPNetworkUnion{ + IP: in, + Netmask: netSegment.Netmask, + Gateway: ipGatewayList[k], + Scope: &scope, + Version: model.IPv4, + }) + break + } + } + } else { + nwsRet = append(nwsRet, model.IPAndIPNetworkUnion{ + IP: in, + Netmask: netSegment.Netmask, + Gateway: netSegment.Gateway, + Scope: &scope, + Version: model.IPv4, + }) + } + } else { // 非TGW网段仅有一个网关IP + nwsRet = append(nwsRet, model.IPAndIPNetworkUnion{ + IP: in, + Netmask: netSegment.Netmask, + Gateway: netSegment.Gateway, + Scope: &scope, + Version: model.IPv4, + }) + } + } + } + } + if ex != "" { + ip, _ := repo.GetIPByIP(ex, model.IPScopeExtranet) + if ip.IPNetworkID > 0 { + netSegment, err := repo.GetIPNetworkByID(ip.IPNetworkID) + if err != nil { + log.Errorf("query extranet net segment by id:%d fail,%v", ip.IPNetworkID, err) + } else if netSegment != nil { + scope := model.IPScopeExtranet + if netSegment.Category == model.TGWIntranet || netSegment.Category == model.TGWExtranet { + switcher, err := repo.GetExtranetSwitchBySN(sn) + if err != nil { + log.Errorf("query extranet switch by dev sn:%s fail:%v", sn, err) + } + ipGatewayList := strings.Split(netSegment.Gateway, ",") + var switchs []string + _ = json.Unmarshal([]byte(netSegment.Switches), &switchs) + if len(ipGatewayList) == 2 && len(switchs) == 2 { + for k := range switchs { + if switchs[k] == switcher.FixedAssetNumber { + nwsRet = append(nwsRet, model.IPAndIPNetworkUnion{ + IP: ex, + Netmask: netSegment.Netmask, + Gateway: ipGatewayList[k], + Scope: &scope, + Version: model.IPv4, + }) + break + } + } + } else { + nwsRet = append(nwsRet, model.IPAndIPNetworkUnion{ + IP: ex, + Netmask: netSegment.Netmask, + Gateway: netSegment.Gateway, + Scope: &scope, + Version: model.IPv4, + }) + } + } else { // 非TGW网段仅有一个网关IP + nwsRet = append(nwsRet, model.IPAndIPNetworkUnion{ + IP: ex, + Netmask: netSegment.Netmask, + Gateway: netSegment.Gateway, + Scope: &scope, + Version: model.IPv4, + }) + } + } + } + } + + //IPv6 + if inv6 != "" { + ip, _ := repo.GetIPByIP(inv6, model.IPScopeIntranet) + if ip.IPNetworkID > 0 { + netSegment, err := repo.GetIPNetworkByID(ip.IPNetworkID) + if err != nil { + log.Errorf("query intranet net segment by id:%d fail,%v", ip.IPNetworkID, err) + } else if netSegment != nil { + scope := model.IPScopeIntranet + nwsRet = append(nwsRet, model.IPAndIPNetworkUnion{ + IP: inv6, + Netmask: netSegment.Netmask, + Gateway: netSegment.Gateway, + Scope: &scope, + Version: model.IPv6, + }) + } + } + } + if exv6 != "" { + ip, _ := repo.GetIPByIP(exv6, model.IPScopeExtranet) + if ip.IPNetworkID > 0 { + netSegment, err := repo.GetIPNetworkByID(ip.IPNetworkID) + if err != nil { + log.Errorf("query extranet net segment by id:%d fail,%v", ip.IPNetworkID, err) + } else if netSegment != nil { + scope := model.IPScopeExtranet + nwsRet = append(nwsRet, model.IPAndIPNetworkUnion{ + IP: exv6, + Netmask: netSegment.Netmask, + Gateway: netSegment.Gateway, + Scope: &scope, + Version: model.IPv6, + }) + } + } + } + + ipnet = &GetNetworkSettingBySNResp{ + IPSource: model.IPSourceStatic, + Items: nwsRet, + } + } + + //根据机位获取网络区域信息 + if dev.USiteID != nil { + us, err := repo.GetServerUSiteByID(*dev.USiteID) + if err != nil && err != gorm.ErrRecordNotFound { + return nil, err + } + if err == gorm.ErrRecordNotFound { + return ipnet, nil + } + if strings.Contains(strings.ToLower(us.PhysicalArea), "bonding") { + ipnet.BondingRequired = "yes" + } + if strings.Contains(strings.ToUpper(us.PhysicalArea), "TGW") { + ipnet.BondingRequired = "no" + } + } + if ipnet.BondingRequired != "yes" { + ipnet.BondingRequired = "no" + } + + return ipnet, nil +} + +// GetOSUserSettingBySNReq 查询设备OS用户配置参数请求结构体 +type GetOSUserSettingBySNReq struct { + SN string `json:"sn"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *GetOSUserSettingBySNReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.SN: "sn", + } +} + +// Validate 结构体数据校验 +func (reqData *GetOSUserSettingBySNReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + + sett, err := repo.GetDeviceSettingBySN(reqData.SN) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"sn"}, binding.BusinessError, "该物理机无历史部署记录,无法提供配置参数。") + return errs + } + if err != nil { + errs.Add([]string{"sn"}, binding.SystemError, "系统内部错误") + return errs + } + + switch sett.InstallType { + case model.InstallationPXE: + if tpl, _ := repo.GetSystemTemplateByID(uint(sett.SystemTemplateID)); tpl == nil || tpl.ID <= 0 { + errs.Add([]string{"sn"}, binding.BusinessError, "该物理机未指定正确的系统安装模板") + return errs + } + case model.InstallationImage: + if tpl, _ := repo.GetImageTemplateByID(uint(sett.ImageTemplateID)); tpl == nil || tpl.ID <= 0 { + errs.Add([]string{"sn"}, binding.BusinessError, "该物理机未指定正确的镜像安装模板") + return errs + } + default: + errs.Add([]string{"sn"}, binding.BusinessError, "该物理机未指定正确的安装方式。") + return errs + } + return errs +} + +// GetOSUserSettingBySN 返回指定设备的操作系统用户配置参数 +func GetOSUserSettingBySN(log logger.Logger, repo model.Repo, reqData *GetOSUserSettingBySNReq) (*setting.OSUserSettingItem, error) { + // 从装机关联的系统安装模板/镜像安装模板中获取用户名、密码 + sett, err := repo.GetDeviceSettingBySN(reqData.SN) + if err != nil { + return nil, err + } + + switch sett.InstallType { + case model.InstallationPXE: + tpl, err := repo.GetSystemTemplateByID(uint(sett.SystemTemplateID)) + if err != nil { + return nil, err + } + return &setting.OSUserSettingItem{ + Username: tpl.Username, + Password: tpl.Password, + }, nil + + case model.InstallationImage: + tpl, err := repo.GetImageTemplateByID(uint(sett.ImageTemplateID)) + if err != nil { + return nil, err + } + return &setting.OSUserSettingItem{ + Username: tpl.Username, + Password: tpl.Password, + }, nil + } + log.Warnf("Invalid installation type: %s=%s", reqData.SN, sett.InstallType) + + return new(setting.OSUserSettingItem), nil +} + +// ReinstallsReq 批量重装请求参数 +type ReinstallsReq struct { + SNs []string `json:"sns"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *ReinstallsReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.SNs: "sns", + } +} + +// Validate 结构体数据校验 +func (reqData *ReinstallsReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + for i := range reqData.SNs { + _, err := repo.GetDeviceBySN(reqData.SNs[i]) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"sns"}, binding.BusinessError, fmt.Sprintf("物理机(%s)信息不存在", reqData.SNs[i])) + return errs + } + if err != nil { + errs.Add([]string{"sns"}, binding.SystemError, "系统内部错误") + return errs + } + + sett, err := repo.GetDeviceSettingBySN(reqData.SNs[i]) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"sns"}, binding.BusinessError, fmt.Sprintf("物理机(%s)无历史部署记录,请重新申请上架部署。", reqData.SNs[i])) + return errs + } + if err != nil { + errs.Add([]string{"sns"}, binding.SystemError, "系统内部错误") + return errs + } + if sett.Status == model.InstallStatusIng { + errs.Add([]string{"sns"}, binding.BusinessError, fmt.Sprintf("物理机(%s)当前正在上架部署,请稍后再试。", reqData.SNs[i])) + return errs + } + + if tor, _ := repo.GetTORBySN(reqData.SNs[i]); tor == "" { + errs.Add([]string{"sn"}, binding.BusinessError, fmt.Sprintf("物理机(%s)无法找到TOR", reqData.SNs[i])) + return errs + } + } + return errs +} + +// Reinstalls 批量重装指定设备 +func Reinstalls(log logger.Logger, repo model.Repo, conf *config.Config, lim limiter.Limiter, reqData *ReinstallsReq) (err error) { + for i := range reqData.SNs { + devSett, err := repo.GetDeviceSettingBySN(reqData.SNs[i]) + if err != nil { + return err + } + if _, err = repo.UpdateInstallStatusAndProgressByID(devSett.ID, model.InstallStatusPre, 0.0); err != nil { + return err + } + + if centos6.IsPXEUEFI(log, repo, reqData.SNs[i]) { + _ = centos6.DropConfigurations(log, repo, reqData.SNs[i]) // TODO 为支持centos6的UEFI方式安装而临时增加的逻辑,后续会删除。 + } + + if _, err = repo.UpdateDeviceLogType(devSett.ID, model.DeviceLogInstallType, model.DeviceLogHistoryType); err != nil { + return err + } + + go startInstallation(log, repo, conf, lim, devSett.SN) + } + return nil +} + +// CancelInstallsReq 批量取消安装请求结构体 +type CancelInstallsReq struct { + SNs []string `json:"sns"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *CancelInstallsReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.SNs: "sns", + } +} + +// Validate 结构体数据校验 +func (reqData *CancelInstallsReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + + for i := range reqData.SNs { + _, err := repo.GetDeviceBySN(reqData.SNs[i]) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"sns"}, binding.BusinessError, fmt.Sprintf("物理机(%s)信息不存在", reqData.SNs[i])) + return errs + } + if err != nil { + errs.Add([]string{"sns"}, binding.SystemError, "系统内部错误") + return errs + } + + _, err = repo.GetDeviceSettingBySN(reqData.SNs[i]) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"sns"}, binding.BusinessError, fmt.Sprintf("物理机(%s)并未部署,无法取消。", reqData.SNs[i])) + return errs + } + if err != nil { + errs.Add([]string{"sns"}, binding.SystemError, "系统内部错误") + return errs + } + } + return errs +} + +// CancelInstalls 批量取消安装指定设备 +func CancelInstalls(log logger.Logger, repo model.Repo, reqData *CancelInstallsReq) (err error) { + for i := range reqData.SNs { + devSett, err := repo.GetDeviceSettingBySN(reqData.SNs[i]) + if err != nil { + return err + } + if devSett.Status == model.InstallStatusSucc || devSett.Status == model.InstallStatusFail { + continue + } + + // 重置设备SN的装机参数,进度设置为0,装机状态设置为失败 + if _, err = repo.UpdateInstallStatusAndProgressByID(devSett.ID, model.InstallStatusFail, 0.0); err != nil { + return err + } + + if centos6.IsPXEUEFI(log, repo, reqData.SNs[i]) { + _ = centos6.DropConfigurations(log, repo, reqData.SNs[i]) // TODO 为支持centos6的UEFI方式安装而临时增加的逻辑,后续会删除。 + } + + //if _, err = repo.UpdateDeviceLogType(devSett.ID, model.DeviceLogInstallType, model.DeviceLogHistoryType); err != nil { + // return err + //} + } + return nil +} + +// RemoveDeviceSettingsReq 批量删除设备装机参数请求结构体 +type RemoveDeviceSettingsReq struct { + SNs []string `json:"sns"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *RemoveDeviceSettingsReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.SNs: "sns", + } +} + +// Validate 结构体数据校验 +func (reqData *RemoveDeviceSettingsReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + + for i := range reqData.SNs { + _, err := repo.GetDeviceSettingBySN(reqData.SNs[i]) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"sns"}, binding.BusinessError, fmt.Sprintf("物理机(%s)上架部署记录不存在,请重试。", reqData.SNs[i])) + return errs + } + if err != nil { + errs.Add([]string{"sns"}, binding.SystemError, "系统内部错误") + return errs + } + } + return errs +} + +// RemoveDeviceSettings 批量删除设备装机参数 +func RemoveDeviceSettings(log logger.Logger, repo model.Repo, reqData *RemoveDeviceSettingsReq) (err error) { + for i := range reqData.SNs { + sett, err := repo.GetDeviceSettingBySN(reqData.SNs[i]) + if gorm.IsRecordNotFoundError(err) { + continue + } + if err != nil { + return err + } + + //释放IP资源 + if err = repo.UnassignIPsBySN(sett.SN); err != nil { + log.Errorf("release ip for sn:%s fail", sett.SN) + return err + } + + if _, err = repo.DeleteDeviceSettingByID(sett.ID); err != nil { + return nil + } + + if centos6.IsPXEUEFI(log, repo, reqData.SNs[i]) { + _ = centos6.DropConfigurations(log, repo, reqData.SNs[i]) // TODO 为支持centos6的UEFI方式安装而临时增加的逻辑,后续会删除。 + } + + if _, err = repo.UpdateDeviceLogType(sett.ID, model.DeviceLogInstallType, model.DeviceLogHistoryType); err != nil { + return err + } + } + return nil +} + +// GetDeviceSettingPageReq 装机设备查询条件列表 +type GetDeviceSettingPageReq struct { + // 源节点名 + OriginNode string `json:"origin_node"` + // 所属数据中心ID + IDCID string `json:"idc_id"` + // 所属机房ID + ServerRoomID string `json:"server_room_id"` + // 所属机架ID + ServerCabinetID string `json:"server_cabinet_id"` + // 所属机位ID + ServerUsiteID string `json:"server_usite_id"` + // 机房名 + ServerRoomName string `json:"server_room_name"` + // 机架编号 + ServerCabinetNumber string `json:"server_cabinet_number"` + // 设备序列号(多个SN用英文逗号分隔) + Sn string `json:"sn"` + // 固资号 + FN string `json:"fixed_asset_number"` + // 设备类型 + Category string `json:"category"` + // 内外IP + IntranetIP string `json:"intranet_ip"` + // 外网IP + ExtranetIP string `json:"extranet_ip"` + // 硬件配置模板ID + HardwareTemplateID uint `json:"hardware_template_id"` + // 镜像配置模板ID + ImageTemplateID uint `json:"image_template_id"` + // 装机状态。可选值 pre_install-等待安装; installing-正在安装; failure-安装失败; success-安装成功; + Status string `json:"status"` + // 分页页号 + Page int64 `json:"page"` + // 分页大小。默认值:10。阈值 100 + PageSize int64 `json:"page_size"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *GetDeviceSettingPageReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDCID: "idc_id", + &reqData.ServerRoomID: "server_room_id", + &reqData.ServerCabinetID: "server_cabinet_id", + &reqData.ServerUsiteID: "server_usite_id", + &reqData.Sn: "sn", + &reqData.FN: "fixed_asset_number", + &reqData.Category: "category", + &reqData.ServerRoomName: "server_room_name", + &reqData.ServerCabinetNumber: "server_cabinet_number", + &reqData.IntranetIP: "intranet_ip", + &reqData.ExtranetIP: "extranet_ip", + &reqData.HardwareTemplateID: "hardware_template_id", + &reqData.ImageTemplateID: "image_template_id", + &reqData.Status: "status", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + } +} + +// GetDeviceSettingPage 按条件查询机位分页列表 +func GetDeviceSettingPage(log logger.Logger, repo model.Repo, reqData *GetDeviceSettingPageReq) (pg *page.Page, err error) { + if reqData.PageSize <= 0 || reqData.PageSize > 100 { + reqData.PageSize = 10 + } + if reqData.Page < 0 { + reqData.Page = 0 + } + + cond := model.CombineDeviceSetting{ + IDCID: mystrings.Multi2UintSlice(reqData.IDCID), + ServerRoomID: mystrings.Multi2UintSlice(reqData.ServerRoomID), + ServerCabinetID: mystrings.Multi2UintSlice(reqData.ServerCabinetID), + ServerUsiteID: mystrings.Multi2UintSlice(reqData.ServerUsiteID), + Sn: reqData.Sn, + FN: reqData.FN, + Category: reqData.Category, + ServerRoomName: reqData.ServerRoomName, + ServerCabinetNumber: reqData.ServerCabinetNumber, + ExtranetIP: reqData.ExtranetIP, + IntranetIP: reqData.IntranetIP, + HardwareTemplateID: reqData.HardwareTemplateID, + ImageTemplateID: reqData.ImageTemplateID, + Status: reqData.Status, + } + + totalRecords, err := repo.CountDeviceSettingCombines(&cond) + if err != nil { + return nil, err + } + + pager := page.NewPager(reflect.TypeOf(&DeviceSettingResp{}), reqData.Page, reqData.PageSize, totalRecords) + orderBy := []model.OrderByPair{{ + Name: "updated_at", + Direction: model.DESC, + }} + items, err := repo.GetDeviceSettingCombinesByCond(&cond, orderBy, pager.BuildLimiter()) + if err != nil { + return nil, err + } + + for i := range items { + resp, err := convert2DeviceSettingResp(repo, log, items[i]) + if err != nil { + continue + } + if resp == nil { + continue + } + pager.AddRecords(resp) + } + return pager.BuildPage(), nil +} + +func convert2DeviceSettingResp(repo model.Repo, log logger.Logger, item *model.DeviceSetting) (*DeviceSettingResp, error) { + deviceSetting := DeviceSettingResp{ + ID: item.ID, + Sn: item.SN, + Status: item.Status, + InstallType: item.InstallType, + InstallProgress: item.InstallProgress, + ExtranetIP: item.ExtranetIP, + IntranetIP: item.IntranetIP, + UpdatedAt: item.UpdatedAt.Format("2006-01-02 15:04:05"), + } + + device, _ := repo.GetDeviceBySN(item.SN) + if device == nil { + log.Errorf("can not get device, sn: %s", item.SN) + return nil, fmt.Errorf("can not get device, sn: %s", item.SN) + } + + deviceSetting.Device.ID = device.ID + deviceSetting.Device.SN = device.SN + deviceSetting.Device.FixedAssetNumber = device.FixedAssetNumber + deviceSetting.Device.Category = device.Category + deviceSetting.Sn = device.SN + + if idc, _ := repo.GetIDCByID(device.IDCID); idc != nil { + deviceSetting.IDC.ID = idc.ID + deviceSetting.IDC.Name = idc.Name + } + + if room, _ := repo.GetServerRoomByID(device.ServerRoomID); room != nil { + deviceSetting.ServerRoom.ID = room.ID + deviceSetting.ServerRoom.Name = room.Name + } + + if cabinet, _ := repo.GetServerCabinetByID(device.CabinetID); cabinet != nil { + deviceSetting.ServerCabinet.ID = cabinet.ID + deviceSetting.ServerCabinet.Number = cabinet.Number + } + + if device.USiteID != nil { + if usite, _ := repo.GetServerUSiteByID(*device.USiteID); usite != nil { + deviceSetting.ServerUSite.ID = usite.ID + deviceSetting.ServerUSite.Number = usite.Number + deviceSetting.ServerUSite.PhysicalArea = usite.PhysicalArea + } + } + if imageTemplate, _ := repo.GetImageTemplateByID(item.ImageTemplateID); imageTemplate != nil { + deviceSetting.ImageTemplate.ID = imageTemplate.ID + deviceSetting.ImageTemplate.Name = imageTemplate.Name + } + if systemTemplate, _ := repo.GetSystemTemplateByID(item.SystemTemplateID); systemTemplate != nil { + deviceSetting.SystemTemplate.ID = systemTemplate.ID + deviceSetting.SystemTemplate.Name = systemTemplate.Name + } + if hardwareTemplate, _ := repo.GetHardwareTemplateByID(item.HardwareTemplateID); hardwareTemplate != nil { + deviceSetting.HardwareTemplate.ID = hardwareTemplate.ID + deviceSetting.HardwareTemplate.Name = hardwareTemplate.Name + } + + deviceSetting.DHCPToken, _ = repo.GetTokenBySN(item.SN) + deviceSetting.TOR, _ = repo.GetTORBySN(item.SN) + + return &deviceSetting, nil +} + +// DeviceInstallStaticCountResp 装机信息统计resp +type DeviceInstallStaticCountResp struct { + // 物理机总数 + TotalDevices int64 `json:"total_devices"` + // 等待安装物理机数量 + PreInstallCount int64 `json:"preinstall_count"` + // 正在安装的物理机数量 + InstallingCount int64 `json:"installing_count"` + // 安装失败的物理机数量 + FailureCount int64 `json:"failure_count"` + // 安装成功的物理机数量 + SuccessCount int64 `json:"success_count"` +} + +// CountDeviceInstallStatic 装机信息统计 +// 统计物理机总数、 等待安装物理机数量、 正在安装的物理机数量、安装失败的物理机数量、安装成功的物理机数量 +func CountDeviceInstallStatic(log logger.Logger, repo model.Repo) (*DeviceInstallStaticCountResp, error) { + + resp := DeviceInstallStaticCountResp{} + + // 统计物理机总数 + totalDevices, err := repo.CountDevices(&model.Device{}) + if err != nil { + return nil, err + } + + // 等待安装物理机数量 + preInstall, err := repo.CountDeviceSettingByStatus(model.InstallStatusPre) + if err != nil { + return nil, err + + } + + // 正在安装的物理机数量 + installing, err := repo.CountDeviceSettingByStatus(model.InstallStatusIng) + if err != nil { + return nil, err + } + + // 安装失败的物理机数量 + failure, err := repo.CountDeviceSettingByStatus(model.InstallStatusFail) + if err != nil { + return nil, err + } + + // 安装成功的物理机数量 + success, err := repo.CountDeviceSettingByStatus(model.InstallStatusSucc) + if err != nil { + return nil, err + } + + resp.TotalDevices = totalDevices + resp.PreInstallCount = preInstall + resp.InstallingCount = installing + resp.FailureCount = failure + resp.SuccessCount = success + + return &resp, nil +} + +// DeviceSettingResp 装机参数返回体 +type DeviceSettingResp struct { + // 数据中心 + IDC struct { + // 数据中心ID + ID uint `json:"id"` + // 数据中心名称 + Name string `json:"name"` + } `json:"idc"` + + // 机房 + ServerRoom struct { + // 机房ID + ID uint `json:"id"` + // 机房名称 + Name string `json:"name"` + } `json:"server_room"` + + // 机架 + ServerCabinet struct { + // 机架ID + ID uint `json:"id"` + // 机架编号 + Number string `json:"number"` + } `json:"server_cabinet"` + + // 机位 + ServerUSite struct { + // 机位ID + ID uint `json:"id"` + // 机位编号 + Number string `json:"number"` + // 物理区域 + PhysicalArea string `json:"physical_area"` + } `json:"server_usite"` + + // 物理机 + Device struct { + // 设备ID + ID uint `json:"id"` + // 设备SN + SN string `json:"sn"` + // 设备SN + FixedAssetNumber string `json:"fixed_asset_number"` + // 设备类型 + Category string `gorm:"column:category"` + } `json:"device"` + + // 硬件模板 + HardwareTemplate struct { + // 硬件模板ID + ID uint `json:"id"` + // 硬件模板名称 + Name string `json:"name"` + } `json:"hardware_template"` + + // 镜像模板 + ImageTemplate struct { + // 镜像模板ID + ID uint `json:"id"` + // 镜像模板名称 + Name string `json:"name"` + } `json:"image_template"` + + // 系统模板 + SystemTemplate struct { + // 系统模板ID + ID uint `json:"id"` + // 系统模板名称 + Name string `json:"name"` + } `json:"system_template"` + + // TOR tor + TOR string `json:"tor"` + // 设备参数主键 + ID uint `json:"id"` + // 安装进度 + InstallProgress float64 `json:"install_progress"` + // 安装类型: image/pxe + InstallType string `json:"install_type"` + // 设备序列号(多个SN用英文逗号分隔) + Sn string `json:"sn"` + // 装机状态。可选值 pre_install-等待安装; installing-正在安装; failure-安装失败; success-安装成功; + Status string `json:"status"` + // 外网IP + ExtranetIP string `json:"extranet_ip"` + // 内网IP + IntranetIP string `json:"intranet_ip"` + // DHCP IP令牌 + DHCPToken string `json:"dhcp_token"` + // UpdatedAt 修改时间 + UpdatedAt string `json:"updated_at"` +} + +// DeviceSetting 设备装机参数结构体 +type DeviceSetting struct { + // 设备序列号 + SN string `json:"sn"` + // InstallType 安装方式 + // Enum: image,pxe + InstallType string `json:"install_type"` + // 操作系统安装模板 + OSTemplate *setting.OSTemplateSetting `json:"os_template"` + // 硬件配置模板 + HardwareTemplate *setting.HardwareTemplateSetting `json:"hardware_template"` + // NeedExtranetIP 是否需要外网IP。可选值:yes-是; no-否; + // Enum: yes,no + NeedExtranetIP string `json:"need_extranet_ip"` + // 内网业务IP + IntranetIP struct { + IP string `json:"ip"` + Netmask string `json:"netmask"` + Gateway string `json:"gateway"` + } `json:"intranet_ip"` + // 外网业务IP + ExtranetIP struct { + IP string `json:"ip"` + Netmask string `json:"netmask"` + Gateway string `json:"gateway"` + } `json:"extranet_ip"` +} + +// GetDeviceSettingBySN 查询指定设备的装机参数 +func GetDeviceSettingBySN(log logger.Logger, repo model.Repo, sn string) (*DeviceSetting, error) { + sett, err := repo.GetDeviceSettingBySN(sn) + if err != nil { + return nil, err + } + + // 获取硬件模板 + var hwTemplateID int + var hwTemplateName string + + if hwTemplate, _ := repo.GetHardwareTemplateByID(sett.HardwareTemplateID); hwTemplate != nil { + hwTemplateID, hwTemplateName = int(hwTemplate.ID), hwTemplate.Name + } + + // 获取操作系统安装模板ID + var osID int + var osFamily, osName, osBootMode string + + switch sett.InstallType { + case model.InstallationImage: + if osTemplate, _ := repo.GetImageTemplateByID(sett.ImageTemplateID); osTemplate != nil { + osID, osFamily, osName, osBootMode = int(osTemplate.ID), osTemplate.Family, osTemplate.Name, osTemplate.BootMode + } + + case model.InstallationPXE: + if osTemplate, _ := repo.GetSystemTemplateByID(sett.SystemTemplateID); osTemplate != nil { + osID, osFamily, osName, osBootMode = int(osTemplate.ID), osTemplate.Family, osTemplate.Name, osTemplate.BootMode + } + } + + var intraNetmask, intraGateway string + if ipnet, _ := repo.GetIPNetworkByID(sett.IntranetIPNetworkID); ipnet != nil { + intraNetmask, intraGateway = ipnet.Netmask, ipnet.Gateway + } + + var extraNetmask, extraGateway string + if ipnet, _ := repo.GetIPNetworkByID(sett.ExtranetIPNetworkID); ipnet != nil { + extraNetmask, extraGateway = ipnet.Netmask, ipnet.Gateway + } + + ds := DeviceSetting{ + SN: sett.SN, + InstallType: sett.InstallType, + OSTemplate: &setting.OSTemplateSetting{ + ID: osID, + Family: osFamily, + Name: osName, + BootMode: osBootMode, + }, + HardwareTemplate: &setting.HardwareTemplateSetting{ + ID: hwTemplateID, + Name: hwTemplateName, + }, + NeedExtranetIP: sett.NeedExtranetIP, + } + ds.IntranetIP.IP = sett.IntranetIP + ds.IntranetIP.Netmask = intraNetmask + ds.IntranetIP.Gateway = intraGateway + ds.ExtranetIP.IP = sett.ExtranetIP + ds.ExtranetIP.Netmask = extraNetmask + ds.ExtranetIP.Gateway = extraGateway + + return &ds, nil +} + +// ImageTemplate 镜像安装模板 +type ImageTemplate struct { + ID uint `json:"id"` + Family string `json:"family"` // 操作系统族系 + Name string `json:"name"` // 模板名 + BootMode string `json:"boot_mode"` // 启动模式 + URL string `json:"url"` // PXE 引导模板内容 + Username string `json:"username"` // 操作系统用户名 + Password string `json:"password"` // 操作系统用户密码 + PreScript string `json:"pre_script"` // 前置脚本 + PostScript string `json:"post_script"` // 后置脚本 + CreatedAt times.ISOTime `json:"created_at"` // 创建时间 + UpdatedAt times.ISOTime `json:"updated_at"` // 更新时间 + Disks []struct { + Name string `json:"name"` + Partitions []struct { + Name string `json:"name"` + Size string `json:"size"` + Fstype string `json:"fstype"` + Mountpoint string `json:"mountpoint"` + } `json:"partitions"` + } `json:"disks"` +} + +// GetImageTemplateBySN 根据SN查询设备的系统模板信息 +func GetImageTemplateBySN(log logger.Logger, repo model.Repo, sn string) (*ImageTemplate, error) { + mod, err := repo.GetImageTemplateBySN(sn) + if err != nil { + return nil, err + } + mod.Partition = strings.Replace(mod.Partition, "\\", "", -1) + tpl := ImageTemplate{ + ID: mod.ID, + CreatedAt: times.ISOTime(mod.CreatedAt), + UpdatedAt: times.ISOTime(mod.UpdatedAt), + Name: mod.Name, + URL: mod.ImageURL, + Family: mod.Family, + BootMode: mod.BootMode, + Username: mod.Username, + Password: mod.Password, + PreScript: base64.StdEncoding.EncodeToString([]byte(mystrings.DOS2UNIX(mod.PreScript))), + PostScript: base64.StdEncoding.EncodeToString([]byte(mystrings.DOS2UNIX(mod.PostScript))), + } + if err := json.Unmarshal([]byte(mod.Partition), &tpl.Disks); err != nil { + log.Error(err) + return nil, err + } + return &tpl, nil +} + +// AutoReinstallsReq 批量重装请求参数 +type AutoReinstallsReq struct { + SNs []string `json:"sns"` + RecycleReinstall string `json:"recycle_reinstall"` // yes or no 影响重装后设备的运营状态 +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *AutoReinstallsReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.SNs: "sns", + &reqData.RecycleReinstall: "recycle_reinstall", + } +} + +// Validate 结构体数据校验 +func (reqData *AutoReinstallsReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + for i := range reqData.SNs { + // 设备信息校验 + dev, err := repo.GetDeviceBySN(reqData.SNs[i]) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"sns"}, binding.BusinessError, fmt.Sprintf("Device of SN:%s not exist", reqData.SNs[i])) + return errs + } + // 回收重装场景校验设备运营状态=待部署 + if reqData.RecycleReinstall == "yes" { + if dev.OperationStatus != model.DevOperStatPreDeploy { + errs.Add([]string{"sns"}, binding.BusinessError, fmt.Sprintf("Status of SN:%s is not predeploy", reqData.SNs[i])) + return errs + } + } + if tor, _ := repo.GetTORBySN(reqData.SNs[i]); tor == "" { + errs.Add([]string{"sn"}, binding.BusinessError, fmt.Sprintf("SN:%s can not find TOR", reqData.SNs[i])) + return errs + } + if err != nil { + errs.Add([]string{"sns"}, binding.SystemError, "System error") + return errs + } + + // 装机参数记录校验 + sett, err := repo.GetDeviceSettingBySN(reqData.SNs[i]) + if gorm.IsRecordNotFoundError(err) { + continue + } + if sett.Status == model.InstallStatusIng || sett.Status == model.InstallStatusPre { + errs.Add([]string{"sns"}, binding.BusinessError, fmt.Sprintf("Device SN:%s is installing or pre install", reqData.SNs[i])) + return errs + } + if err != nil { + errs.Add([]string{"sns"}, binding.SystemError, "Failed to get device setting") + return errs + } + } + return errs +} + +// AutoReinstalls 调用规则引擎自动生成设备的装机参数,并发起部署 +func AutoReinstalls(log logger.Logger, repo model.Repo, conf *config.Config, lim limiter.Limiter, reqData *AutoReinstallsReq) (succeeds []string, err error) { + log.Infof("Start auto reinstall generating device %v settings", reqData.SNs) + defer log.Infof("End auto reinstall saving device %v settings", reqData.SNs) + + for i := range reqData.SNs { + // 获取设备信息 + dev, err := repo.GetDeviceBySN(reqData.SNs[i]) + if err != nil { + log.Errorf("Fail to get device of sn: %s , error: %s", reqData.SNs[i], err) + continue + } + // 装机参数对象 + ds := model.DeviceSetting{ + SN: dev.SN, + InstallType: model.InstallationImage, + Status: model.InstallStatusPre, + NeedIntranetIPv6: model.NO, //默认仅分配IPV4 + NeedExtranetIPv6: model.NO, //默认仅分配IPV4 + } + // 查询装机记录 + old, err := repo.GetDeviceSettingBySN(dev.SN) + if err != nil && err != gorm.ErrRecordNotFound { + log.Errorf("Fail to get exist devicesetting of device(sn: %s ), error: %s", dev.SN, err) + continue + } + if old != nil { + ds.ID = old.ID + ds.CreatedAt = old.CreatedAt + ds.Updater = "auto_reinstall_api" + } else { + ds.Creator = "auto_reinstall_api" + } + // 根据 USiteID 查询获取 PhysicalArea + var ServerUSite *model.ServerUSite + ServerUSite, err = repo.GetServerUSiteByID(*dev.USiteID) + if err != nil { + log.Errorf("Fail to get serverusite of device(sn: %s ), error: %s", dev.SN, err) + continue + } + // 根据 Category 判断 Arch + if strings.HasPrefix(dev.Category, "GA-") { + dev.Arch = "arm" + } else { + dev.Arch = "x86" + } + + // 转换 Vendor 厂商属性值(规则限定英文小写) + lower_vendor := strings.ToLower(dev.Vendor) + switch lower_vendor { + case "华为": + lower_vendor = "huawei" + case "浪潮": + lower_vendor = "inspur" + case "联想": + lower_vendor = "lenovo" + case "戴尔": + lower_vendor = "dell" + case "惠普": + lower_vendor = "hp" + case "华三": + lower_vendor = "h3c" + case "超聚变": + lower_vendor = "xfusion" + case "紫光恒越": + lower_vendor = "unis" + case "中科可控": + lower_vendor = "suma" + case "中科曙光": + lower_vendor = "sugon" + } + // 获取设备类型是否为金融信创生态产品 + cond := model.DeviceCategory{ + Category: dev.Category, + } + items, err := repo.GetDeviceCategorys(&cond, nil, nil) + if err != nil { + log.Errorf("Fail to get category of device(sn: %s ), error: %s", dev.SN, err) + continue + } + isFITIEcoProduct := "unknown" + if len(items) != 0 { + isFITIEcoProduct = items[0].IsFITIEcoProduct + log.Debugf("device[SN:%s] category[%s] is FITIEcoProduct", dev.SN, dev.Category) + } + // 规则引擎的事实对象 + df := DeviceFact{ + SN: dev.SN, + Category: dev.Category, + PhysicalArea: ServerUSite.PhysicalArea, + Arch: dev.Arch, + Vendor: lower_vendor, + IsFITIEcoProduct: isFITIEcoProduct, + } + // 规则推理得到装机参数 + result, err := RuleInduction(log, repo, &df) + if err != nil { + log.Errorf("Fail to get rule action results of device(sn: %s ), error: %s", dev.SN, err) + continue + } + // 获取硬件配置模板ID + hwTemplate, err := repo.GetHardwareTemplateByName(result.RaidResult) + if err != nil { + log.Errorf("Fail to GetHardwareTemplateByName of device(sn: %s name: %s ), error: %s", dev.SN, result.RaidResult, err) + continue + } + ds.HardwareTemplateID = hwTemplate.ID + // 获取操作系统模版ID + // 优先image 次之pxe + imgTemplate, err := repo.GetImageTemplateByName(result.OSResult) + if err != nil { + log.Errorf("Fail to GetImageTemplateByName of device(sn: %s name: %s ), error: %s ,try SystemTemplate", dev.SN, result.OSResult, err) + //continue + sysTemplate, err := repo.GetSystemTemplateByName(result.OSResult) + if err != nil { + log.Errorf("Fail to GetSystemTemplateByName of device(sn: %s name: %s ), error: %s", dev.SN, result.OSResult, err) + continue + } + ds.SystemTemplateID = sysTemplate.ID + ds.InstallType = model.InstallationPXE + } + ds.ImageTemplateID = imgTemplate.ID + // 获取网络配置 + if result.NetworkResult == "la_wa" { + // 获取内网业务IP + intraIP, err := repo.AssignIntranetIP(dev.SN) + if err != nil { + log.Errorf("AutoGenDeviceSetting fail to AssignIntranetIP of device(sn: %s ), error: %s", dev.SN, err) + continue + } + ds.IntranetIPNetworkID = intraIP.IPNetworkID + ds.IntranetIP = intraIP.IP + log.Infof("Device(%s) is assigned to intranet ip: %s", dev.SN, intraIP.IP) + // 获取外网业务IP + extraIP, err := repo.AssignExtranetIP(dev.SN) + if err != nil { + log.Errorf("AutoGenDeviceSetting fail to AssignExtranetIP of device(sn: %s ), error: %s", dev.SN, err) + continue + } + ds.ExtranetIPNetworkID = extraIP.IPNetworkID + ds.ExtranetIP = extraIP.IP + ds.NeedExtranetIP = "yes" + log.Infof("Device(%s) is assigned to extranet ip: %s", dev.SN, extraIP.IP) + } else if result.NetworkResult == "la" { + // 获取内网业务IP + intraIP, err := repo.AssignIntranetIP(dev.SN) + if err != nil { + log.Errorf("AutoGenDeviceSetting fail to AssignIntranetIP of device(sn: %s ), error: %s", dev.SN, err) + continue + } + ds.IntranetIPNetworkID = intraIP.IPNetworkID + ds.IntranetIP = intraIP.IP + ds.NeedExtranetIP = "no" + log.Infof("Device(%s) is assigned to intranet ip: %s", dev.SN, intraIP.IP) + } else { + // 网络配置规则推理结果不符合la la_wa 时跳过 + log.Errorf("Fail to AssignIP for device(sn: %s expected network_conf: %s ), error: %s", dev.SN, result.NetworkResult, err) + continue + } + + // 当RAID、OS、NETWORK均得到对应参数时,保存装机参数 + if err = repo.SaveDeviceSetting(&ds); err != nil { + log.Errorf("Device(%s) settings(auto) have not been saved err: %s", dev.SN, err) + return succeeds, err + } + + // 更新保存旧的装机日志 + if old != nil && old.ID > 0 { + _, _ = repo.UpdateDeviceLogType(old.ID, model.DeviceLogInstallType, model.DeviceLogHistoryType) + } + log.Infof("Device(%s) settings(auto) have been saved", dev.SN) + + // 更新设备状态=重装中 + mod := &model.Device{ + SN: reqData.SNs[i], + OperationStatus: model.DevOperStatReinstalling, + } + // remark字段标记,初始的状态,物理机重装场景恢复运营状态 + if reqData.RecycleReinstall == "no" { + mod.Remark = dev.OperationStatus + } + _, err = repo.UpdateDeviceBySN(mod) + if err != nil { + log.Errorf("Failt to update status of device %s to reinstalling", reqData.SNs[i]) + } + succeeds = append(succeeds, reqData.SNs[i]) + // 开始部署 + go startInstallation(log, repo, conf, lim, dev.SN) + } + return succeeds, nil +} + +// SaveDeviceSettingsAndReinstalls 批量保存设备装机参数并进入系统部署,完成部署后恢复初始的运营状态 +func SaveDeviceSettingsAndReinstalls(log logger.Logger, repo model.Repo, conf *config.Config, lim limiter.Limiter, reqData *SaveDeviceSettingsReq) (succeeds []string, err error) { + for i := range reqData.Settings { + // 获取设备信息 + dev, err := repo.GetDeviceBySN(reqData.Settings[i].SN) + if err != nil { + log.Errorf("Fail to get device of sn: %s , error: %s", reqData.Settings[i].SN, err) + continue + } + // 保存装机参数并进入系统部署 + if err = saveDeviceSetting(log, repo, conf, lim, reqData.Settings[i], reqData.CurrentUser.LoginName); err != nil { + return succeeds, err + } + + // 更新设备状态=重装中 + mod := &model.Device{ + SN: reqData.Settings[i].SN, + OperationStatus: model.DevOperStatReinstalling, + Remark: dev.OperationStatus, // remark字段临时记录初始的状态,重装场景恢复运营状态 + } + _, err = repo.UpdateDeviceBySN(mod) + if err != nil { + log.Errorf("Failt to update status of device %s to reinstalling", reqData.Settings[i].SN) + } + succeeds = append(succeeds, reqData.Settings[i].SN) + } + return succeeds, nil +} + + +// UpdateDeviceSettingReq +type UpdateDeviceSettingReq struct { + SN string `json:"sn"` + OSSystemTemplateName string `json:"os"` +} + + +// UpdateDeviceSetting 更新装机参数。 +// 支持裸金属设备、特殊设备等自定义操作系统名称(优先显示system_template_name,后显示image_template_name) +func UpdateDeviceSetting(log logger.Logger, repo model.Repo, reqData *UpdateDeviceSettingReq) error { + if reqData.OSSystemTemplateName != "" && reqData.SN != "" { + log.Debugf("begin to update device setting (system template name:%s for SN:%s)", reqData.OSSystemTemplateName ,reqData.SN) + // 操作系统名称校验,不存在则新增一条记录 + sysTpl, err := repo.GetSystemTemplateByName(reqData.OSSystemTemplateName) + if err != nil { + log.Errorf("get system template by name %s failed(%v) ,adding one", reqData.OSSystemTemplateName, err) + tpl := model.SystemTemplate{ + Family: "Custom", + BootMode: "uefi", + Name: reqData.OSSystemTemplateName, + PXE: "#NULL", + Content: "#NULL", + OSLifecycle: model.OSTesting, + Arch: model.OSARCHUNKNOWN, + } + _, err := repo.SaveSystemTemplate(&tpl) + if err != nil { + log.Errorf("add system template by name %s failed(%v)", reqData.OSSystemTemplateName, err) + return err + } else { + //重新获取新增模板ID + sysTpl, err = repo.GetSystemTemplateByName(reqData.OSSystemTemplateName) + if err != nil { + log.Errorf("get system template by name %s failed(%v)", reqData.OSSystemTemplateName, err) + } + } + } + //校验是否有装机记录,仅允许更新已有装机记录的系统名称 + ds, err := repo.GetDeviceSettingBySN(reqData.SN) + if err != nil { + log.Errorf("get device(SN:%s) setting err:%v", reqData.SN, err) + return err + } + if ds == nil { + log.Errorf("device(SN:%s) setting not found ,do nothing", reqData.SN) + return errors.New("不存在装机记录,无法更新操作系统名称") + } else { + // 关联到PXE模板的系统名称 + ds.InstallType = model.InstallationPXE + ds.SystemTemplateID = sysTpl.ID + ds.ImageTemplateID = 0 + ds.UpdatedAt = time.Now() + // 更新0值需使用save + if err = repo.SaveDeviceSetting(ds); err != nil { + log.Errorf("failed to device setting (system template name:%s for SN:%s), err:%v", reqData.OSSystemTemplateName, reqData.SN, err) + return err + } + log.Infof("updated device setting (system template name:%s for SN:%s)", reqData.OSSystemTemplateName, reqData.SN) + return nil + } + } + return errors.New("不允许为空") +} + + +// SaveDeviceSettingItemWithoutInstall 保存设备装机参数条目 +type SaveDeviceSettingItemWithoutInstall struct { + // 设备序列号 + SN string `json:"sn"` + // 操作系统安装模板 + OSTemplateName string `json:"os_template_name"` +} + +// SaveDeviceSettingsWithoutInstallsReq 保存设备装机参数请求结构体 +type SaveDeviceSettingsWithoutInstallsReq struct { + Settings DeviceSettingsWithoutInstalls + CurrentUser *model.CurrentUser // 操作人 +} + +// DeviceSettings 设备装机参数集合 +type DeviceSettingsWithoutInstalls []*SaveDeviceSettingItemWithoutInstall + +// SaveDeviceSettingsWithoutInstalls 批量保存设备装机参数,不进入部署,直接运营状态置为‘已上架’(裸金属、特殊设备交付) +func SaveDeviceSettingsWithoutInstalls(log logger.Logger, repo model.Repo, conf *config.Config, lim limiter.Limiter, reqData *SaveDeviceSettingsWithoutInstallsReq) (succeeds []string, err error) { + for i := range reqData.Settings { + // 保存装机参数 + if err = saveDeviceSettingWithoutInstalls(log, repo, conf, lim, reqData.Settings[i], reqData.CurrentUser.LoginName); err != nil { + return succeeds, err + } + + // 更新设备状态=已上架 + mod := &model.Device{ + SN: reqData.Settings[i].SN, + OperationStatus: model.DevOperStatOnShelve, + } + _, err = repo.UpdateDeviceBySN(mod) + if err != nil { + log.Errorf("Failt to update status of device %s to onshelf", reqData.Settings[i].SN) + } + succeeds = append(succeeds, reqData.Settings[i].SN) + } + return succeeds, nil +} + +// saveDeviceSettingWithoutInstalls 保存单台设备的装机参数(忽略部署) +func saveDeviceSettingWithoutInstalls(log logger.Logger, repo model.Repo, conf *config.Config, lim limiter.Limiter, sett *SaveDeviceSettingItemWithoutInstall, LoginName string) (err error) { + log.Infof("Start saving device(%s) settings without installation", sett.SN) + defer log.Infof("End saving device(%s) settings without installation", sett.SN) + + // 获取设备信息 + dev, err := repo.GetDeviceBySN(sett.SN) + if err != nil { + log.Errorf("Failed to get device of sn: %s , error: %s", sett.SN, err) + return err + } + // 根据 USiteID 查询获取 PhysicalArea + var ServerUSite *model.ServerUSite + ServerUSite, err = repo.GetServerUSiteByID(*dev.USiteID) + if err != nil { + log.Errorf("Fail to get serverusite of device(sn: %s ), error: %s", dev.SN, err) + return err + } + // 初始化装机模板数据 + ds := model.DeviceSetting{ + SN: sett.SN, + InstallType: model.InstallationPXE, //忽略部署,默认PXE + Status: model.InstallStatusSucc, //忽略部署,默认成功 + NeedExtranetIP: model.NO, + NeedIntranetIPv6: model.NO, //默认仅分配IPV4 + NeedExtranetIPv6: model.NO, //默认仅分配IPV4 + HardwareTemplateID: 0, //忽略部署,默认0 + } + // 查询旧装机记录 + old, err := repo.GetDeviceSettingBySN(sett.SN) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if old != nil { + ds.ID = old.ID + ds.CreatedAt = old.CreatedAt + ds.Updater = LoginName + // 旧安装模板ID 置0 + ds.ImageTemplateID = 0 + ds.SystemTemplateID = 0 + } else { + ds.Creator = LoginName + } + // 操作系统名称校验,不存在则新增一条记录 + sysTemplate, err := repo.GetSystemTemplateByName(sett.OSTemplateName) + if err != nil { + log.Errorf("get system template by name %s failed(%v) ,adding one", sett.OSTemplateName, err) + tpl := model.SystemTemplate{ + Family: "Custom", + BootMode: "uefi", + Name: sett.OSTemplateName, + PXE: "#NULL", + Content: "#NULL", + OSLifecycle: model.OSTesting, + Arch: model.OSARCHUNKNOWN, + } + _, err := repo.SaveSystemTemplate(&tpl) + if err != nil { + log.Errorf("add system template by name %s failed(%v)", sett.OSTemplateName, err) + return err + } else { + //重新获取新增模板ID + sysTemplate, err = repo.GetSystemTemplateByName(sett.OSTemplateName) + if err != nil { + log.Errorf("get system template by name %s failed(%v)", sett.OSTemplateName, err) + return err + } + } + } + ds.SystemTemplateID = sysTemplate.ID + + log.Infof("Start assigning IPv4 to the device(%s)", sett.SN) + // 记录本次已分配的IP ID以便回滚 + var ipIDsForRollback []uint + + //根据需要分配IP,假如有装机记录,并且有IP,则不用重复分配了 + if old == nil || old.IntranetIP == "" { + // 获取内网业务IP + intraIP, err := repo.AssignIntranetIP(sett.SN) + if err != nil { + return err + } + ds.IntranetIPNetworkID = intraIP.IPNetworkID + ds.IntranetIP = intraIP.IP + log.Infof("Device(%s) is assigned to intranet ip: %s", sett.SN, intraIP.IP) + ipIDsForRollback = append(ipIDsForRollback, intraIP.ID) + } else { + ds.IntranetIPNetworkID = old.IntranetIPNetworkID + ds.IntranetIP = old.IntranetIP + } + // 规则引擎的事实对象 + df := DeviceFact{ + SN: dev.SN, + Category: dev.Category, + PhysicalArea: ServerUSite.PhysicalArea, + Arch: dev.Arch, + Vendor: dev.Vendor, + } + // 规则推理得到装机参数-network + result, err := RuleTypeInduction(log, repo, &df, model.DeviceSettingRuleNetwork) + if err != nil { + log.Errorf("Fail to get rule action results of device(sn: %s ), error: %s", dev.SN, err) + return err + } + // 获取网络配置 + if result.NetworkResult == "la_wa" { + ds.NeedExtranetIP = model.YES + // 获取外网业务IP + log.Infof("Device(%s) need extranet ip", sett.SN) + if old == nil || old.ExtranetIP == "" { + extraIP, err := repo.AssignExtranetIP(sett.SN) + if err != nil { + return err + } + ds.ExtranetIPNetworkID = extraIP.IPNetworkID + ds.ExtranetIP = extraIP.IP + log.Infof("Device(%s) is assigned to extranet ip: %s", sett.SN, extraIP.IP) + ipIDsForRollback = append(ipIDsForRollback, extraIP.ID) + } else { + ds.ExtranetIPNetworkID = old.ExtranetIPNetworkID + ds.ExtranetIP = old.ExtranetIP + } + } else { + // 尝试释放之前已经占用的外网业务IP + _, _ = repo.ReleaseIP(sett.SN, model.IPScopeExtranet) + } + + // 保存装机参数,失败时回滚已分配的IP + if err = repo.SaveDeviceSetting(&ds); err != nil { + for _, id := range ipIDsForRollback { + _ = repo.UnassignIP(id) + log.Debugf("Unassign IP (ID: %v) when failed to save device setting of SN: %s", id, sett.SN) + } + return err + } + if old != nil && old.ID > 0 { + _, _ = repo.UpdateDeviceLogType(old.ID, model.DeviceLogInstallType, model.DeviceLogHistoryType) + } + + log.Infof("Device(%s) settings have been saved.", sett.SN) + return nil +} + + +// SetInstallsOKReq 批量设置部署状态=success +type SetInstallsOKReq struct { + SNs []string `json:"sns"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *SetInstallsOKReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.SNs: "sns", + } +} + +// Validate 结构体数据校验 +func (reqData *SetInstallsOKReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + for i := range reqData.SNs { + _, err := repo.GetDeviceBySN(reqData.SNs[i]) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"sns"}, binding.BusinessError, fmt.Sprintf("物理机(%s)信息不存在", reqData.SNs[i])) + return errs + } + if err != nil { + errs.Add([]string{"sns"}, binding.SystemError, "系统内部错误") + return errs + } + + sett, err := repo.GetDeviceSettingBySN(reqData.SNs[i]) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"sns"}, binding.BusinessError, fmt.Sprintf("物理机(%s)无历史部署记录。", reqData.SNs[i])) + return errs + } + if err != nil { + errs.Add([]string{"sns"}, binding.SystemError, "系统内部错误") + return errs + } + if sett.Status != model.InstallStatusFail { + errs.Add([]string{"sns"}, binding.BusinessError, fmt.Sprintf("物理机(%s)部署状态非失败,仅适用于部署失败的物理机。", reqData.SNs[i])) + return errs + } + + } + return errs +} + +// SetInstallsOK 批量设置部署状态=success +func SetInstallsOK(log logger.Logger, repo model.Repo, conf *config.Config, lim limiter.Limiter, reqData *SetInstallsOKReq) (err error) { + for i := range reqData.SNs { + devSett, err := repo.GetDeviceSettingBySN(reqData.SNs[i]) + if err != nil { + return err + } + if _, err = repo.UpdateInstallStatusAndProgressByID(devSett.ID, model.InstallStatusSucc, 1.0); err != nil { + return err + } + //如果备注字段有运行状态,则说明是需要还原该状态 + d, err := repo.GetDeviceBySN(reqData.SNs[i]) + if d == nil { + log.Error("device:%s not exist,%v", reqData.SNs[i], err) + } else if d != nil && d.Remark != "" && validOperationStatus(d.Remark) { + d.OperationStatus = d.Remark + d.Remark = "" + } else { + d.OperationStatus = model.DevOperStatOnShelve // 系统安装完成后运营状态改为'已上架' + } + if _, err := repo.SaveDevice(d); err != nil { + log.Error("save device:%d fail,%v", d, err) + } + //更新装机日志 + _, err = repo.SaveDeviceLog(&model.DeviceLog{ + DeviceSettingID: devSett.ID, + Title: "设置部署状态", + LogType: model.DeviceLogInstallType, + Content: "SUCCESS", + SN: reqData.SNs[i], + }) + if err != nil { + log.Errorf("save device log err:%v", err) + } + // 归还令牌 + if conf.DHCPLimiter.Enable { + if bucket, _ := lim.Route(reqData.SNs[i]); bucket != nil { + if token, _ := repo.GetTokenBySN(reqData.SNs[i]); token != "" { + _ = bucket.Return(reqData.SNs[i], limiter.Token(token)) + } + } + } + } + return nil +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/device_setting_rule.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/device_setting_rule.go new file mode 100644 index 0000000000000000000000000000000000000000..388076a4da4c2c788f5d73ca96b2c35a57fe189f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/device_setting_rule.go @@ -0,0 +1,567 @@ +package service + +import ( + "fmt" + "strings" + "reflect" + "net/http" + "encoding/json" + + "github.com/voidint/binding" + "github.com/voidint/page" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" +) + +// 事实对象的属性(与规则库所需的属性匹配) +type DeviceFact struct { + SN string // 设备SN + Category string // 设备类型 + PhysicalArea string // 物理区域, 如: ServerFarm bonding区1 + Arch string // cpu架构:x86\arm + Vendor string // 设备厂商 + IsFITIEcoProduct string // 是否金融信创生态产品 +} + +// 推理规则前件是否包含逻辑运算符号AND OR +type ConditionHasLogicalOperator struct { + HasAND bool + HasOR bool + HasBoth bool +} + +// 规则推理返回结构体 +type ActionResult struct { + RuleType string // os raid network + OSResult string + RaidResult string + NetworkResult string +} + +// 元规则推理,仅针对单个 RuleP 结构体进行推理,返回 bool +func MetaRuleInduction(log logger.Logger, fact *DeviceFact, rulep *model.RuleP) (bool) { + if rulep.Attribute != "" && rulep.Attribute != model.AttributeLogicalOperator { + var factvalue string + // 获取fact对应的属性值 + switch rulep.Attribute { + case model.AttributeCategory: + factvalue = fact.Category + case model.AttributePhysicalArea: + factvalue = fact.PhysicalArea + case model.AttributeArch: + factvalue = fact.Arch + case model.AttributeVendor: + factvalue = fact.Vendor + case model.AttributeIsFITIEcoProduct: + factvalue = fact.IsFITIEcoProduct + default: + log.Errorf("Attribute of rule is not defined.") + return false + } + + // 逻辑处理 equal contains in + switch rulep.Operator { + case model.OperatorEqual: + if factvalue == rulep.Value[0] { + log.Infof("Device %s Meta_Rule_Hit: %s equal %s ", fact.SN, factvalue, rulep.Value) + return true + } + case model.OperatorContains: + if strings.Contains(factvalue, rulep.Value[0]) { + log.Infof("Device %s Meta_Rule_Hit: %s contains %s ", fact.SN, factvalue, rulep.Value) + return true + } + case model.OperatorIN: + for _, each := range rulep.Value { + if factvalue == each { + log.Infof("Device %s Meta_Rule_Hit: %s in %s ", fact.SN, factvalue, rulep.Value) + return true + } + } + default: + log.Errorf("Operator of rule is not defined.") + return false + } + } + return false +} + +// 前件解析器 +func ConditionParser(log logger.Logger, repo model.Repo, fact *DeviceFact, rule *model.DeviceSettingRule) (bool, error) { + if rule.Condition != "" { + var ruleconditions []model.RuleP + chlo := ConditionHasLogicalOperator{ + HasAND: false, + HasOR: false, + HasBoth: false, + } + + // 解析规则前件 + err := json.Unmarshal([]byte(rule.Condition), &ruleconditions) + if err != nil { + log.Error(err) + return false,err + } + // fact 与 fact 之间必须通过逻辑运算符连接,故index=奇数可增加校验是否为AND OR + log.Infof("Condition of rule %d : %s", rule.ID, ruleconditions) + + // 推理是否包含逻辑运算符 AND OR + if len(ruleconditions) > 1 { + for _, rc := range ruleconditions { + if rc.Attribute == model.AttributeLogicalOperator && rc.Operator == model.OperatorEqual { + switch rc.Value[0] { + case model.OperatorOR: + chlo.HasOR = true + case model.OperatorAND: + chlo.HasAND = true + } + } + } + if chlo.HasOR && chlo.HasAND { + chlo.HasBoth = true + } + } else if len(ruleconditions) == 1 { + for _, rc := range ruleconditions { + return MetaRuleInduction(log, fact, &rc),nil + } + } + + // 前件包含AND + OR 优先处理 OR + if chlo.HasBoth { + // 针对包含AND + OR 临时存储结果 [true,and,false,or,true] + var logicresult []string + for _, rc := range ruleconditions { + if rc.Attribute == model.AttributeLogicalOperator { + switch rc.Value[0] { + case model.OperatorOR: + logicresult = append(logicresult, "or") + case model.OperatorAND: + logicresult = append(logicresult, "and") + } + } else { + if MetaRuleInduction(log, fact, &rc) { + logicresult = append(logicresult, "true") + } else { + logicresult = append(logicresult, "false") + } + } + } + + // 逻辑结果数组按and拆分 [[true],[false,or,true]] + var logicresult_split_by_and [][]string + i := 0 + for _, v := range logicresult { + if v == "and" { + i++ + } else { + logicresult_split_by_and[i] = append(logicresult_split_by_and[i], v) + } + } + + // 处理返回最终bool + contain_true := false + for _, splitted_list := range logicresult_split_by_and { + if len(splitted_list) == 1 { + if splitted_list[0] == "false"{ + return false,nil + } else { + continue + } + } else { + for _, va := range splitted_list { + if va == "true" { + contain_true = true + } else { + continue + } + } + if contain_true == false { + return false,nil + } + } + } + return true, nil + } else if chlo.HasAND { + for _, rc := range ruleconditions { + if rc.Attribute == model.AttributeLogicalOperator { + switch rc.Value[0] { + case model.OperatorOR: + log.Errorf("Not expected OR of rule %d ", rule.ID) + return false, fmt.Errorf("Not expected OR of rule %d ", rule.ID) + case model.OperatorAND: + continue + } + } else { + if MetaRuleInduction(log, fact, &rc) { + continue + } else { + return false, nil + } + } + } + return true, nil + } else if chlo.HasOR { + for _, rc := range ruleconditions { + if rc.Attribute == model.AttributeLogicalOperator { + switch rc.Value[0] { + case model.OperatorOR: + continue + case model.OperatorAND: + log.Errorf("Not expected AND of rule %d ", rule.ID) + return false, fmt.Errorf("Not expected AND of rule %d ", rule.ID) + } + } else { + if MetaRuleInduction(log, fact, &rc) { + return true, nil + } else { + continue + } + } + } + return false, nil + } + } + log.Errorf("Empty of rule %d ", rule.ID) + return false, fmt.Errorf("Empty of rule %d ", rule.ID) +} + + +// 规则推理机(仅推理某一种类) +func RuleTypeInduction(log logger.Logger, repo model.Repo, fact *DeviceFact, ruletype string) (*ActionResult, error) { + // 根据规则分类提取规则进行处理 + var result = &ActionResult{} + + switch ruletype { + case model.DeviceSettingRuleOS: + ruleItems, err := repo.GetDeviceSettingRulesByType(ruletype) + if err != nil { + log.Errorf("Fact(device sn: %s ) failed to get os rules.", fact.SN) + return nil, err + } + for _, rule := range ruleItems { + b, err := ConditionParser(log, repo, fact, rule) + if err != nil { + return nil, err + } + if b { + log.Infof("Fact(device sn: %s ) successed to get os result.", fact.SN) + result.OSResult = rule.Action + return result, nil + } + } + + case model.DeviceSettingRuleRaid: + ruleItems, err := repo.GetDeviceSettingRulesByType(ruletype) + if err != nil { + log.Errorf("Fact(device sn: %s ) failed to get raid rules.", fact.SN) + return nil, err + } + for _, rule := range ruleItems { + b, err := ConditionParser(log, repo, fact, rule) + if err != nil { + return nil, err + } + if b { + log.Infof("Fact(device sn: %s ) successed to get raid result.", fact.SN) + result.RaidResult = rule.Action + return result, nil + } + } + + case model.DeviceSettingRuleNetwork: + ruleItems, err := repo.GetDeviceSettingRulesByType(ruletype) + if err != nil { + log.Errorf("Fact(device sn: %s ) failed to get network rules.", fact.SN) + return nil, err + } + for _, rule := range ruleItems { + b, err := ConditionParser(log, repo, fact, rule) + if err != nil { + return nil, err + } + if b { + log.Infof("Fact(device sn: %s ) successed to get network result.", fact.SN) + result.NetworkResult = rule.Action + return result, nil + } + } + default: + log.Errorf("Not supported type(%s) of rules.", ruletype) + return nil, fmt.Errorf("Not supported type(%s) of rules.", ruletype) + } + log.Errorf("Fact(device sn: %s ) failed to get type(%s) of rules.", fact.SN, ruletype) + return nil, fmt.Errorf("Fact(device sn: %s ) failed to get type(%s) of rules.", fact.SN, ruletype) +} + +// 规则推理机 +func RuleInduction(log logger.Logger, repo model.Repo, fact *DeviceFact) (*ActionResult, error) { + // 根据规则分类提取规则进行处理 + var result = &ActionResult{} + var ruletypes = []string {model.DeviceSettingRuleOS, model.DeviceSettingRuleRaid, model.DeviceSettingRuleNetwork} + for _, ruletype := range ruletypes { + switch ruletype { + case model.DeviceSettingRuleOS: + ruleItems, err := repo.GetDeviceSettingRulesByType(ruletype) + if err != nil { + log.Errorf("Fact(device sn: %s ) failed to get os rules.", fact.SN) + return nil, err + } + for _, rule := range ruleItems { + b, err := ConditionParser(log, repo, fact, rule) + if err != nil { + return nil, err + } + if b { + log.Infof("Fact(device sn: %s ) successed to get os result.", fact.SN) + result.OSResult = rule.Action + } + } + + case model.DeviceSettingRuleRaid: + ruleItems, err := repo.GetDeviceSettingRulesByType(ruletype) + if err != nil { + log.Errorf("Fact(device sn: %s ) failed to get raid rules.", fact.SN) + return nil, err + } + for _, rule := range ruleItems { + b, err := ConditionParser(log, repo, fact, rule) + if err != nil { + return nil, err + } + if b { + log.Infof("Fact(device sn: %s ) successed to get raid result.", fact.SN) + result.RaidResult = rule.Action + } + } + + case model.DeviceSettingRuleNetwork: + ruleItems, err := repo.GetDeviceSettingRulesByType(ruletype) + if err != nil { + log.Errorf("Fact(device sn: %s ) failed to get network rules.", fact.SN) + return nil, err + } + for _, rule := range ruleItems { + b, err := ConditionParser(log, repo, fact, rule) + if err != nil { + return nil, err + } + if b { + log.Infof("Fact(device sn: %s ) successed to get network result.", fact.SN) + result.NetworkResult = rule.Action + } + } + } + } + // 仅返回完整的参数推理结果 + if result.OSResult == "" || result.RaidResult == "" || result.NetworkResult == "" { + log.Errorf("Fact(device sn: %s ) do not hit all types of rules.", fact.SN) + return nil, fmt.Errorf("Fact(device sn: %s ) do not hit all types of rules.", fact.SN) + } + return result, nil +} + + +// GetDeviceSettingRulePageReq 获取规则记录表分页请求参数 +type GetDeviceSettingRulePageReq struct { + RuleCategory string `json:"rule_category"` + Page int64 `json:"page"` + PageSize int64 `json:"page_size"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *GetDeviceSettingRulePageReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.RuleCategory: "rule_category", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + } +} + +// GetDeviceSettingRulePage 获取规则记录分页 +func GetDeviceSettingRulePage(log logger.Logger, repo model.Repo, reqData *GetDeviceSettingRulePageReq) (*page.Page, error) { + if reqData.PageSize <= 0 || reqData.PageSize > 100 { + reqData.PageSize = 20 + } + if reqData.Page < 0 { + reqData.Page = 0 + } + + cond := model.DeviceSettingRule{ + RuleCategory: reqData.RuleCategory, + } + + totalRecords, err := repo.CountDeviceSettingRules(&cond) + if err != nil { + return nil, err + } + + pager := page.NewPager(reflect.TypeOf(&DeviceSettingRuleResp{}), reqData.Page, reqData.PageSize, totalRecords) + items, err := repo.GetDeviceSettingRules(&cond, model.OneOrderBy("id", model.DESC), pager.BuildLimiter()) + if err != nil { + return nil, err + } + for i := range items { + item, err := convert2DeviceSettingRulesResult(log, repo, items[i]) + if err != nil { + return nil, err + } + if item != nil { + pager.AddRecords(item) + } + } + return pager.BuildPage(), nil + +} + +// 规则表分页查询信息 +type DeviceSettingRuleResp struct { + ID uint `json:"id"` + //Condition []model.RuleP `json:"condition"` // 前件 + Condition string `json:"condition"` // 前件 + Action string `json:"action"` // 结论 + RuleCategory string `json:"rule_category"` // 规则分类 enum('os','network','raid') +} + +// 返回分页数据结构 +func convert2DeviceSettingRulesResult(log logger.Logger, repo model.Repo, mod *model.DeviceSettingRule) (*DeviceSettingRuleResp, error) { + if mod == nil { + return nil, nil + } + // 解析规则前件 + //var ruleconditions []model.RuleP + //err := json.Unmarshal([]byte(mod.Condition), &ruleconditions) + //if err != nil { + // log.Error(err) + // return nil, err + //} + result := DeviceSettingRuleResp{ + ID: mod.ID, + Condition: mod.Condition, + Action: mod.Action, + RuleCategory: mod.RuleCategory, + } + return &result, nil +} + +//SaveDeviceSettingRuleReq 保存规则请求参数 +type SaveDeviceSettingRuleReq struct { + //DeviceSettingRuleBase + ID uint `json:"id"` + // 用户登录名 + LoginName string `json:"-"` + Action string `json:"action"` // 结论 + RuleCategory string `json:"rule_category"` // 规则分类 enum('os','network','raid') + Condition string `json:"condition"` // 前件 +} + +// 基本字段 +//type DeviceSettingRuleBase struct { +// Condition []model.RuleP `json:"condition"` // 前件 +// Action string `json:"action"` // 结论 +// RuleCategory string `json:"rule_category"` // 规则分类 enum('os','network','raid') +//} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *SaveDeviceSettingRuleReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.ID: "id", + &reqData.Condition: "condition", + &reqData.Action: "action", + &reqData.RuleCategory: "rule_category", + } +} + +// Validate 结构体数据校验 +func (reqData *SaveDeviceSettingRuleReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + //必须的基本数据不能为空 + if errs = reqData.baseValidate(req, errs); errs != nil { + return errs + } + + //更新规则时,校验指定ID的规则是否存在 + if reqData.ID > 0 { + if _, err := repo.GetDeviceSettingRuleByID(reqData.ID); errs != nil { + errs.Add([]string{"id"}, binding.RequiredError, fmt.Sprintf("查询规则id(%d)出现错误: %s", reqData.ID, err.Error())) + return errs + } + } + return nil +} + +//baseValidate 必要参数不能为空 +func (reqData *SaveDeviceSettingRuleReq) baseValidate(req *http.Request, errs binding.Errors) binding.Errors { + if reqData.Condition == "" { + errs.Add([]string{"condition"}, binding.RequiredError, "规则前件不能为空") + return errs + } + if reqData.Action == "" { + errs.Add([]string{"action"}, binding.RequiredError, "规则推论不能为空") + return errs + } + if reqData.RuleCategory == "" { + errs.Add([]string{"rule_category"}, binding.RequiredError, "规则类别不能为空") + return errs + } + return errs +} + +//SaveDeviceSettingRule 保存规则记录 +func SaveDeviceSettingRule(log logger.Logger, repo model.Repo, reqData *SaveDeviceSettingRuleReq) error { + + sr := model.DeviceSettingRule{ + Condition: reqData.Condition, + Action: reqData.Action, + RuleCategory: reqData.RuleCategory, + } + sr.Model.ID = reqData.ID + + _, err := repo.SaveDeviceSettingRule(&sr) + if err != nil { + return err + } + + reqData.ID = sr.Model.ID + return err +} + +// 根据ID删除规则记录 +type DelDeviceSettingRuleReq struct { + IDs []uint `json:"ids"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *DelDeviceSettingRuleReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDs: "ids", + } +} + +// Validate 结构体数据校验 +func (reqData *DelDeviceSettingRuleReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + for _, id := range reqData.IDs { + if _, err := repo.GetDeviceSettingRuleByID(id); err != nil { + errs.Add([]string{"id"}, binding.RequiredError, fmt.Sprintf("规则id(%d)不存在", id)) + return errs + } + } + return nil +} + +//RemoveDeviceSettingRules 删除指定ID的规则记录 +func RemoveDeviceSettingRules(log logger.Logger, repo model.Repo, reqData *DelDeviceSettingRuleReq) (affected int64, err error) { + for _, id := range reqData.IDs { + _, err := repo.RemoveDeviceSettingRuleByID(id) + if err != nil { + log.Errorf("delete device setting rule (id=%d) fail,err:%v", id, err) + return affected, err + } + affected++ + } + return affected, err +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/export.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/export.go new file mode 100644 index 0000000000000000000000000000000000000000..e7eb38caf9f132594ff3b7f052e2acf571019e68 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/export.go @@ -0,0 +1,102 @@ +package service + +import "strconv" + +// ExportedDevices 导出设备信息集合 +type ExportedDevices []*DevicePageResp + +// ToTableRecords 生成用于表格显示的二维字符串切片 +func (items ExportedDevices) ToTableRecords() (records [][]string) { + records = make([][]string, 0, len(items)) + + for i := range items { + idcName := "" + if items[i].IDC != nil { + idcName = items[i].IDC.Name + } + serverRoomName := "" + if items[i].ServerRoom != nil { + serverRoomName = items[i].ServerRoom.Name + } + cabinetNum := "" + if items[i].ServerCabinet != nil { + cabinetNum = items[i].ServerCabinet.Number + } + usiteNum := "" + if items[i].ServerUSite != nil { + usiteNum = items[i].ServerUSite.Number + } + records = append(records, []string{ + strconv.Itoa(int(items[i].ID)), + items[i].FixedAssetNum, + items[i].SN, + items[i].Vendor, + items[i].Model, + items[i].Arch, + items[i].Usage, + items[i].Category, + idcName, + serverRoomName, + cabinetNum, + usiteNum, + items[i].OOBIP, + items[i].OOBUser, + items[i].OOBPassword, + items[i].PowerStatus, + items[i].HardwareRemark, + items[i].RAIDRemark, + items[i].StartedAt, + items[i].OnShelveAt, + items[i].OperationStatus, + items[i].IntranetIP, + items[i].ExtranetIP, + items[i].OS, + }) + } + return records +} + +// ExportOOBInfo 导出带外信息 +type ExportOOBInfo []*DevicePageResp + +// ToTableRecords 生成用于表格显示的二维字符串切片 +func (items ExportOOBInfo) ToTableRecords() (records [][]string) { + records = make([][]string, 0, len(items)) + + for i := range items { + records = append(records, []string{ + items[i].FixedAssetNum, + items[i].SN, + items[i].IntranetIP, + items[i].OOBIP, + items[i].OOBUser, + items[i].OOBPassword, + }) + } + return records +} + +// ExportIPInfo 导出IP信息 +type ExportIPInfo []*IPSPage + +// ToTableRecords 生成用于表格显示的二维字符串切片 +func (items ExportIPInfo) ToTableRecords() (records [][]string) { + records = make([][]string, 0, len(items)) + + for i := range items { + records = append(records, []string{ + items[i].IP, + items[i].IPNetwork.CIDR, + items[i].IPNetwork.Gateway, + items[i].IPNetwork.Netmask, + items[i].IPNetwork.Category, + items[i].IPNetwork.Version, + items[i].IsUsed, + items[i].Category, + items[i].Scope, + items[i].SN, + items[i].FixedAssetNumber, + }) + } + return records +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/hardware_template.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/hardware_template.go new file mode 100644 index 0000000000000000000000000000000000000000..3e4ef47341a35c7b4c8ee89aad593c3b9dba2fcd --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/hardware_template.go @@ -0,0 +1,167 @@ +package service + +import ( + "encoding/json" + "net/http" + "reflect" + + "github.com/voidint/binding" + "github.com/voidint/page" + "idcos.io/cloudboot/model" +) + +type ( + // HardwareTplResp 硬件配置模板返回结构 + HardwareTplResp struct { + ID uint `json:"id"` + //是否是内置模板'Yes|No' + Builtin string `json:"builtin"` + //模板名称 + Name string `json:"name"` + //硬件制造厂商 + Vendor string `json:"vendor"` + //型号名称 + ModelName string `json:"model_name"` + //模板内容(数据结构) + Data Data `json:"data"` + //创建时间 + CreatedAt string `json:"created_at"` + //修改时间 + UpdatedAt string `json:"updated_at"` + } + + // Data 硬件配置下发数据 + Data []struct { + Category string `json:"category"` + Action string `json:"action"` + Metadata map[string]string `json:"metadata"` + } + + // SaveHardwareTplReq 硬件配置模板保存结构体 + SaveHardwareTplReq struct { + // 主键 + ID uint `json:"id"` + //是否是内置模板'Yes|No' + Builtin string `json:"builtin"` + //模板名称 + Name string `json:"name"` + //硬件制造厂商 + Vendor string `json:"vendor"` + //型号名称 + ModelName string `json:"model_name"` + //模板内容(数据结构) + Data Data `json:"data"` + } +) + +// HardwareTplPageReq 获取硬件配置模板分页过滤参数结构 +type HardwareTplPageReq struct { + //是否是内置模板'Yes|No' + Builtin string `json:"builtin"` + //模板名称 + Name string `json:"name"` + //硬件制造厂商 + Vendor string `json:"vendor"` + //型号名称 + ModelName string `json:"model_name"` + // 分页页号 + Page int64 `json:"page"` + // 分页大小 + PageSize int64 `json:"page_size"` +} + +// FieldMap 请求字段映射 +func (reqData *HardwareTplPageReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.Builtin: "builtin", + &reqData.Name: "name", + &reqData.Vendor: "vendor", + &reqData.ModelName: "model_name", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + } +} + +// FieldMap 请求字段映射 +func (reqData *SaveHardwareTplReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.Builtin: "builtin", + &reqData.Name: "name", + &reqData.Vendor: "vendor", + &reqData.ModelName: "model_name", + &reqData.Data: "data", + &reqData.ID: "id", + } +} + +// RemoveHardwareTemplate 删除指定ID的硬件模板信息 +func RemoveHardwareTemplate(repo model.Repo, id uint) (affected int64, err error) { + return repo.RemoveHardwareTemplateByID(id) + +} + +// GetHardwareTplPage 查询硬件配置模板分页列表 +func GetHardwareTplPage(repo model.Repo, reqData *HardwareTplPageReq) (pg *page.Page, err error) { + if reqData.PageSize <= 0 || reqData.PageSize > 100 { + reqData.PageSize = 20 + } + if reqData.Page < 0 { + reqData.Page = 0 + } + + cond := model.HardwareTplCond{ + Builtin: reqData.Builtin, + Name: reqData.Name, + Vendor: reqData.Vendor, + ModelName: reqData.ModelName, + } + + totalRecords, err := repo.CountHardwareByCond(&cond) + if err != nil { + return nil, err + } + + pager := page.NewPager(reflect.TypeOf(&HardwareTplResp{}), reqData.Page, reqData.PageSize, totalRecords) + items, err := repo.GetHardwaresByCond(&cond, pager.BuildLimiter()) + if err != nil { + return nil, err + } + for _, mod := range items { + d := Data{} + _ = json.Unmarshal([]byte(mod.Data), &d) + item := &HardwareTplResp{ + ID: mod.ID, + Builtin: mod.Builtin, + Name: mod.Name, + Vendor: mod.Vendor, + ModelName: mod.ModelName, + Data: d, + CreatedAt: mod.CreatedAt.Format("2006-01-02 15:04:05"), + UpdatedAt: mod.UpdatedAt.Format("2006-01-02 15:04:05"), + } + pager.AddRecords(item) + } + return pager.BuildPage(), nil +} + +// SaveHardwareTemplate 保存硬件配置模板信息 +func SaveHardwareTemplate(repo model.Repo, reqData *SaveHardwareTplReq) (id uint, err error) { + dataStr, err := json.Marshal(reqData.Data) + if err != nil { + return 0, err + } + + hardwareTmpl := model.HardwareTemplate{ + Builtin: model.NO, + Name: reqData.Name, + Vendor: reqData.Vendor, + ModelName: reqData.ModelName, + Data: string(dataStr), + } + + hardwareTmpl.ID = reqData.ID + + return repo.SaveHardwareTemplate(&hardwareTmpl) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/idc.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/idc.go new file mode 100644 index 0000000000000000000000000000000000000000..7b0bc2fb86f39508ffc2c669eb5d7d618e9ed562 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/idc.go @@ -0,0 +1,309 @@ +package service + +import ( + "net/http" + + "fmt" + + "encoding/json" + + "reflect" + + "errors" + + "github.com/jinzhu/gorm" + "github.com/voidint/binding" + "github.com/voidint/page" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils/times" +) + +type ( + // IDCReq 保存/修改数据中心Body参数结构 + IDCReq struct { + ID uint `json:"id"` + Name string `json:"name"` + //用途 + Usage string `json:"usage"` + //一级机房,可以有多个 + FirstServerRoom FirstServerRooms `json:"first_server_room"` + //供应商 + Vendor string `json:"vendor"` + //建设中under_construction,已验收accepted,已投产production,已裁撤abolished + Status string `json:"status"` + // 用户登录名 + LoginName string `json:"-"` + } + + // FirstServerRooms 一级机房数组 + FirstServerRooms []string + + // FirstServerRoom 一级机房 + FirstServerRoom struct { + ID int `json:"id"` + Name string `json:"name"` + } + + // IDCUpdateReq 批量更新状态请求体 + IDCUpdateReq struct { + //建设中under_construction,已验收accepted,已投产production,已裁撤abolished + Status string `json:"status"` + //指定修改的ID列表 + IDs []uint `json:"ids"` + } + + // IDCResp 数据中心返回结构 + IDCResp struct { + ID uint `json:"id"` + Name string `json:"name"` + Usage string `json:"usage"` + FirstServerRoom []FirstServerRoom `json:"first_server_room"` + Vendor string `json:"vendor"` + Status string `json:"status"` + CreatedAt times.ISOTime `json:"created_at"` + UpdatedAt times.ISOTime `json:"updated_at"` + } + + // IDCPageReq 分页查询条件 + IDCPageReq struct { + Name string `json:"name"` + //用途:production-生产; disaster_recovery-容灾; pre_production-准生产; testing-测试;', + Usage string `json:"usage"` + //一级机房 + FirstServerRoom string `json:"first_server_room"` + //供应商 + Vendor string `json:"vendor"` + //建设中under_construction,已验收accepted,已投产production,已裁撤abolished + Status string `json:"status"` + Page int64 `json:"page"` + PageSize int64 `json:"page_size"` + } +) + +// FieldMap 请求字段映射 +func (reqData *IDCReq) FieldMap(req *http.Request) binding.FieldMap { + return binding.FieldMap{ + &reqData.ID: "id", + &reqData.Name: "name", + &reqData.Usage: "usage", + &reqData.FirstServerRoom: "first_server_room", + &reqData.Vendor: "vendor", + } +} + +// FieldMap 请求字段映射 +func (reqData *IDCUpdateReq) FieldMap(req *http.Request) binding.FieldMap { + return binding.FieldMap{ + &reqData.Status: "status", + &reqData.IDs: "ids", + } +} + +// FieldMap 请求字段映射 +func (reqData *IDCPageReq) FieldMap(req *http.Request) binding.FieldMap { + return binding.FieldMap{ + &reqData.Name: "name", + &reqData.Usage: "usage", + &reqData.FirstServerRoom: "first_server_room", + &reqData.Vendor: "vendor", + &reqData.Status: "status", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + } +} + +//ToJSON FirstServerRooms转Json +func (f *FirstServerRooms) ToJSON() []byte { + rooms := make([]*FirstServerRoom, 0) + for i, room := range *f { + rooms = append(rooms, &FirstServerRoom{ + ID: i, + Name: room, + }) + } + b, _ := json.Marshal(rooms) + return b +} + +// Validate 校验入参 +func (reqData *IDCReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + if reqData.Name == "" { + errs.Add([]string{"name"}, binding.RequiredError, "名称不能为空") + return errs + } + + if idc, _ := repo.GetIDCByName(reqData.Name); idc != nil && idc.ID != reqData.ID { + errs.Add([]string{"name"}, binding.RequiredError, "名称已存在,不能重复") + return errs + } + if reqData.Usage == "" { + errs.Add([]string{"usage"}, binding.RequiredError, "用途不能为空") + return errs + } + + usageEnums := []string{model.IDCUsageProduction, model.IDCUsageDisasterRecovery, + model.IDCUsagePreProduction, model.IDCUsageTesting} + if !ValidateEnum(reqData.Usage, usageEnums) { + errs.Add([]string{"usage"}, binding.RequiredError, fmt.Sprintf("用途的取值必须为%v", usageEnums)) + return errs + } + if reqData.FirstServerRoom == nil { + errs.Add([]string{"first_server_room"}, binding.RequiredError, "一级机房不能为空") + return errs + } + if reqData.Vendor == "" { + errs.Add([]string{"vendor"}, binding.RequiredError, "供应商不能为空") + return errs + } + return errs +} + +// Validate 校验入参 +func (reqData *IDCUpdateReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + statusEnums := []string{model.IDCStatUnderConstruction, + model.IDCStatAccepted, model.IDCStatProduction /*, model.IDCStatAbolished*/} + if !ValidateEnum(reqData.Status, statusEnums) { + errs.Add([]string{"status"}, binding.RequiredError, fmt.Sprintf("数据中心状态取值必须是%v", statusEnums)) + return errs + } + + if len(reqData.IDs) == 0 { + errs.Add([]string{"ids"}, binding.RequiredError, "数据中心ID列表为空") + return errs + } + + for _, idcID := range reqData.IDs { + _, err := repo.GetIDCByID(idcID) + if err == gorm.ErrRecordNotFound { + errs.Add([]string{"ids"}, binding.RequiredError, fmt.Sprintf("数据中心ID:%d 未找到", idcID)) + return errs + } + } + return errs +} + +// ValidateEnum 校验枚举字段的值 +func ValidateEnum(val string, valList []string) bool { + for _, v := range valList { + if val == v { + return true + } + } + return false +} + +// SaveIDC 保存(新增/修改) +func SaveIDC(log logger.Logger, repo model.Repo, req *IDCReq) (*model.IDC, error) { + idc := &model.IDC{ + Model: gorm.Model{ID: uint(req.ID)}, + Name: req.Name, + Usage: req.Usage, + FirstServerRoom: string(req.FirstServerRoom.ToJSON()), + Vendor: req.Vendor, + Creator: req.LoginName, + } + if req.ID == 0 { + //add a new record + idc.Status = model.IDCStatUnderConstruction //set default + _, mod, err := repo.AddIDC(idc) + if err != nil { + return nil, err + } + return mod, nil + } + + //update a new record + _, err := repo.UpdateIDC(idc) + if err != nil { + return nil, err + } + return idc, nil +} + +// RemoveIDCByID 删除指定ID的数据中心 +func RemoveIDCByID(log logger.Logger, repo model.Repo, idcID uint) error { + //有被关联机房的不能被删除 + serverRoomCountTotal, err := repo.CountServerRooms(&model.ServerRoomCond{ + IDCID: []uint{idcID}, + }) + if serverRoomCountTotal > 0 { + return errors.New("[业务校验]有机房关联该数据中心,不允许删除") + } + + _, err = repo.GetIDCByID(idcID) + if err != nil { + return err + } + _, err = repo.RemoveIDCByID(idcID) + return err +} + +// UpdateIDCStatus 批量更新数据中心状态 +func UpdateIDCStatus(log logger.Logger, repo model.Repo, req *IDCUpdateReq) error { + _, err := repo.UpdateIDCStatus(req.Status, req.IDs...) + return err +} + +// GetIDCByID 查询指定ID的数据中心信息详情 +func GetIDCByID(log logger.Logger, repo model.Repo, idcID uint) (*IDCResp, error) { + mod, err := repo.GetIDCByID(idcID) + if err != nil { + return nil, err + } + resp := convert2IDCResp(mod) + return resp, nil +} + +// GetIDCPage 查询数据中心分页列表 +func GetIDCPage(log logger.Logger, repo model.Repo, reqData *IDCPageReq) (pg *page.Page, err error) { + if reqData.PageSize <= 0 || reqData.PageSize > 100 { + reqData.PageSize = 20 + } + if reqData.Page < 0 { + reqData.Page = 0 + } + + cond := model.IDC{ + Name: reqData.Name, + Usage: reqData.Usage, + FirstServerRoom: reqData.FirstServerRoom, + Vendor: reqData.Vendor, + Status: reqData.Status, + } + + totalRecords, err := repo.CountIDCs(&cond) + if err != nil { + return nil, err + } + + pager := page.NewPager(reflect.TypeOf(&IDCResp{}), reqData.Page, reqData.PageSize, totalRecords) + items, err := repo.GetIDCs(&cond, model.OneOrderBy("id", model.DESC), pager.BuildLimiter()) + if err != nil { + return nil, err + } + for i := range items { + item := convert2IDCResp(items[i]) + pager.AddRecords(item) + } + return pager.BuildPage(), nil + +} + +// convert2IDCResp 按照返回的结构定义转换 +func convert2IDCResp(mod *model.IDC) *IDCResp { + resp := &IDCResp{ + ID: mod.ID, + Name: mod.Name, + Usage: mod.Usage, + Vendor: mod.Vendor, + Status: mod.Status, + CreatedAt: times.ISOTime(mod.CreatedAt), + UpdatedAt: times.ISOTime(mod.UpdatedAt), + } + _ = json.Unmarshal([]byte(mod.FirstServerRoom), &resp.FirstServerRoom) + return resp +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/image_template.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/image_template.go new file mode 100644 index 0000000000000000000000000000000000000000..4c6fac4b7677baea8b62a9366531f37c48f57975 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/image_template.go @@ -0,0 +1,314 @@ +package service + +import ( + "encoding/json" + "net/http" + "reflect" + "strings" + + "github.com/jinzhu/gorm" + "github.com/voidint/binding" + "github.com/voidint/page" + + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils/collection" + mystrings "idcos.io/cloudboot/utils/strings" +) + +// ImageTemplateResp 镜像安装模板 +type ImageTemplateResp struct { + ID uint `json:"id"` + Family string `json:"family"` // 操作系统族系 + Name string `json:"name"` // 模板名 + BootMode string `json:"boot_mode"` // 启动模式 + URL string `json:"url"` // PXE 引导模板内容 + Username string `json:"username"` // 操作系统用户名 + Password string `json:"password"` // 操作系统用户密码 + PreScript string `json:"pre_script"` // 前置脚本 + PostScript string `json:"post_script"` // 后置脚本 + CreatedAt string `json:"created_at"` // 创建时间 + UpdatedAt string `json:"updated_at"` // 更新时间 + // OS生命周期:Testing|Active(Default)|Active|Containment|EOL + OSLifecycle string `json:"os_lifecycle"` + // OS架构平台:x86_64|aarch64 + Arch string `json:"arch"` + Disks []struct { + Name string `json:"name"` + Partitions []struct { + Name string `json:"name"` + Size string `json:"size"` + Fstype string `json:"fstype"` + Mountpoint string `json:"mountpoint"` + } `json:"partitions"` + } `json:"disks"` +} + +// GetImageTemplatePageReq 查询镜像安装模板分页请求结构体 +type GetImageTemplatePageReq struct { + Family string `json:"family"` // 操作系统族系 + BootMode string `json:"boot_mode"` // 启动模式 + // OS生命周期:Testing|Active(Default)|Active|Containment|EOL + OSLifecycle string `json:"os_lifecycle"` + // OS架构平台:x86_64|aarch64 + Arch string `json:"arch"` + Name string `json:"name"` // 模板名 + Page int64 `json:"page"` + PageSize int64 `json:"page_size"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *GetImageTemplatePageReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.Family: "family", + &reqData.BootMode: "boot_mode", + &reqData.OSLifecycle: "os_lifecycle", + &reqData.Arch: "arch", + &reqData.Name: "name", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + } +} + +// GetImageTemplatePage 按条件查询镜像安装模板分页列表 +func GetImageTemplatePage(log logger.Logger, repo model.Repo, reqData *GetImageTemplatePageReq) (pg *page.Page, err error) { + if reqData.PageSize <= 0 || reqData.PageSize > 100 { + reqData.PageSize = 10 + } + if reqData.Page < 0 { + reqData.Page = 0 + } + + cond := model.ImageTemplate{ + Family: reqData.Family, + BootMode: reqData.BootMode, + Name: reqData.Name, + } + + totalRecords, err := repo.CountImageTemplates(&cond) + if err != nil { + return nil, err + } + + pager := page.NewPager(reflect.TypeOf(&ImageTemplateResp{}), reqData.Page, reqData.PageSize, totalRecords) + items, err := repo.GetImageTemplates(&cond, model.OneOrderBy("name", model.ASC), pager.BuildLimiter()) + if err != nil { + return nil, err + } + + for i := range items { + tpl, err := convert2ImageTemplate(items[i]) + if err != nil { + log.Error(err) + return nil, err + } + pager.AddRecords(tpl) + } + return pager.BuildPage(), nil +} + +// GetImageTemplateByID 返回指定ID的镜像安装模板 +func GetImageTemplateByID(log logger.Logger, repo model.Repo, id uint) (*ImageTemplateResp, error) { + tpl, err := repo.GetImageTemplateByID(id) + if err != nil { + return nil, err + } + return convert2ImageTemplate(tpl) +} + +// convert2ImageTemplate 将model层的镜像安装模板对象转化成service层的镜像安装模板对象 +func convert2ImageTemplate(src *model.ImageTemplate) (*ImageTemplateResp, error) { + if src == nil { + return nil, nil + } + tpl := ImageTemplateResp{ + ID: src.ID, + Family: src.Family, + Name: src.Name, + BootMode: src.BootMode, + URL: src.ImageURL, + Username: src.Username, + Password: src.Password, + PreScript: mystrings.DOS2UNIX(src.PreScript), + PostScript: mystrings.DOS2UNIX(src.PostScript), + CreatedAt: src.CreatedAt.Format("2006-01-02 15:04:05"), + UpdatedAt: src.UpdatedAt.Format("2006-01-02 15:04:05"), + OSLifecycle: src.OSLifecycle, + Arch: src.Arch, + } + if src.Partition != "" { + if err := json.Unmarshal([]byte(src.Partition), &tpl.Disks); err != nil { + return nil, err + } + } + return &tpl, nil +} + +// SaveImageTemplateReq 保存镜像安装模板请求结构体 +type SaveImageTemplateReq struct { + // 注:更新时该属性大于0 + ID uint `json:"id"` + // 操作系统族系 + Family string `json:"family"` + // 模板名 + Name string `json:"name"` + // 启动模式 + BootMode string `json:"boot_mode"` + // PXE 引导模板内容 + URL string `json:"url"` + // 操作系统用户名 + Username string `json:"username"` + // 操作系统用户密码 + Password string `json:"password"` + // 前置脚本 + PreScript string `json:"pre_script"` + // 后置脚本 + PostScript string `json:"post_script"` + // OS生命周期:Testing|Active(Default)|Active|Containment|EOL + OSLifecycle string `json:"os_lifecycle"` + // OS架构平台:x86_64|aarch64 + Arch string `json:"arch"` + // 硬盘信息 + Disks []struct { + Name string `json:"name"` + Partitions []struct { + Name string `json:"name"` + Size string `json:"size"` + Fstype string `json:"fstype"` + Mountpoint string `json:"mountpoint"` + } `json:"partitions"` + } `json:"disks"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *SaveImageTemplateReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.Family: "family", + &reqData.Name: "name", + &reqData.BootMode: "boot_mode", + &reqData.Username: "username", + &reqData.Password: "password", + &reqData.PreScript: "pre_script", + &reqData.PostScript: "post_script", + &reqData.Disks: "disks", + &reqData.OSLifecycle: "os_lifecycle", + &reqData.Arch: "arch", + } +} + +// Validate 结构体数据校验 +func (reqData *SaveImageTemplateReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + + if reqData.Family == "" { + errs.Add([]string{"family"}, binding.RequiredError, "操作系统不能为空") + return errs + } + + if reqData.Name == "" { + errs.Add([]string{"name"}, binding.RequiredError, "名称不能为空") + return errs + } + + // 校验模板唯一性 + items, err := repo.GetImageTemplates(&model.ImageTemplate{ + Name: reqData.Name, + }, nil, nil) + if err != nil { + errs.Add([]string{"name"}, binding.SystemError, "系统内部错误") + return errs + } + + for _, item := range items { + if (reqData.ID == 0 && strings.ToLower(item.Name) == strings.ToLower(reqData.Name)) || // 新增模板时,模板名不能重名。 + (reqData.ID > 0 && strings.ToLower(item.Name) == strings.ToLower(reqData.Name) && reqData.ID != item.ID) { // 更新模板时,模板名不能重名(除了自身外)。 + errs.Add([]string{"name"}, binding.BusinessError, "名称不能重复") + return errs + } + } + + if reqData.BootMode == "" { + errs.Add([]string{"boot_mode"}, binding.RequiredError, "启动模式不能为空") + return errs + } + + if !collection.InSlice(reqData.BootMode, []string{model.BootModeBIOS, model.BootModeUEFI}) { + errs.Add([]string{"boot_mode"}, binding.BusinessError, "无效的启动模式") + return errs + } + if reqData.OSLifecycle == "" { + errs.Add([]string{"os_lifecycle"}, binding.RequiredError, "OS生命周期不能为空") + return errs + } + + if !collection.InSlice(reqData.OSLifecycle, []string{model.OSTesting, model.OSActiveDefault, model.OSActive, model.OSContainment, model.OSEOL}) { + errs.Add([]string{"os_lifecycle"}, binding.BusinessError, "无效的OS生命周期") + return errs + } + + if reqData.Arch == "" { + errs.Add([]string{"arch"}, binding.RequiredError, "OS架构不能为空") + return errs + } + + if !collection.InSlice(reqData.Arch, []string{model.OSARCHAARCH64, model.OSARCHX8664}) { + errs.Add([]string{"arch"}, binding.BusinessError, "无效的OS架构") + return errs + } + if reqData.URL == "" { + errs.Add([]string{"url"}, binding.RequiredError, "镜像下载地址不能为空") + return errs + } + if len(reqData.Disks) == 0 { + errs.Add([]string{"disks"}, binding.RequiredError, "分区不能为空") + return errs + } + return errs +} + +// SaveImageTemplate 保存镜像安装模板 +func SaveImageTemplate(log logger.Logger, repo model.Repo, reqData *SaveImageTemplateReq) (id uint, err error) { + disks, err := json.Marshal(reqData.Disks) + if err != nil { + log.Error(err) + return 0, err + } + + tpl := model.ImageTemplate{ + Family: reqData.Family, + BootMode: reqData.BootMode, + Name: reqData.Name, + ImageURL: reqData.URL, + Username: reqData.Username, + Password: reqData.Password, + Partition: string(disks), + PreScript: mystrings.DOS2UNIX(reqData.PreScript), + PostScript: mystrings.DOS2UNIX(reqData.PostScript), + OSLifecycle: reqData.OSLifecycle, + Arch: reqData.Arch, + } + tpl.ID = reqData.ID + affected, err := repo.SaveImageTemplate(&tpl) + if err != nil { + return 0, err + } + if affected <= 0 && tpl.ID > 0 { + return 0, gorm.ErrRecordNotFound + } + return tpl.ID, nil +} + +// RemoveImageTemplate 删除指定ID的镜像安装模板 +func RemoveImageTemplate(log logger.Logger, repo model.Repo, id uint) (err error) { + affected, err := repo.RemoveImageTemplate(id) + if err != nil { + return err + } + if affected <= 0 { + return gorm.ErrRecordNotFound + } + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/inspection.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/inspection.go new file mode 100644 index 0000000000000000000000000000000000000000..81f5e3a02071b5e7114538b27e30d7ebba2f5aa9 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/inspection.go @@ -0,0 +1,622 @@ +package service + +import ( + "encoding/json" + "fmt" + "net/http" + "reflect" + "strings" + "time" + "sort" + + "github.com/voidint/binding" + "github.com/voidint/page" + + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils/times" +) + +// InspectionStatistics 硬件巡检结果统计 +type InspectionStatistics struct { + //日期 + Date string `json:"date"` + //正常设备数量 + NominalCount int `json:"nominal_count"` + //警告设备数量 + WarningCount int `json:"warning_count"` + //异常设备数量 + CriticalCount int `json:"critical_count"` +} + +// GetGetInspectionStatisticsReq 查询硬件巡检结果状态(正常、警告、异常)统计请求结构体 +type GetGetInspectionStatisticsReq struct { + Period string `json:"period"` + Direction string `json:"direction"` +} + +// FieldMap 字段映射 +func (reqData *GetGetInspectionStatisticsReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑 + return binding.FieldMap{ + &reqData.Period: "period", + &reqData.Direction: "direction", + } +} + +// Validate 结构体数据校验 +func (reqData *GetGetInspectionStatisticsReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + + if reqData.Period != "" && reqData.Period != StatiPeriodLatestWeek && reqData.Period != StatiPeriodLatestMonth { + errs.Add([]string{"period"}, binding.BusinessError, fmt.Sprintf("基本参数错误:%s=%s", "period", reqData.Period)) + return errs + } + if reqData.Direction != "" && reqData.Direction != DirectionASC && reqData.Direction != DirectionDESC { + errs.Add([]string{"direction"}, binding.BusinessError, fmt.Sprintf("基本参数错误:%s=%s", "direction", reqData.Direction)) + return errs + } + return errs +} + +const ( + // StatiPeriodLatestWeek 统计周期-近一周 + StatiPeriodLatestWeek = "latest_week" + // StatiPeriodLatestMonth 统计周期-近一月 + StatiPeriodLatestMonth = "latest_month" +) + +const ( + // DirectionASC 排序方向-递增 + DirectionASC = "asc" + // DirectionDESC 排序方向-递减 + DirectionDESC = "desc" +) + +const ( + dateLayout = "2006-01-02" + selTimeLayout = "Jan-02-2006 15:04:05" + +) + +// GetGetInspectionStatistics 查询硬件巡检结果状态(正常、警告、异常)统计 +func GetGetInspectionStatistics(log logger.Logger, repo model.Repo, reqData *GetGetInspectionStatisticsReq) (items []*InspectionStatistics, err error) { + // 1、生成日期列表 + if reqData.Period == "" { + reqData.Period = StatiPeriodLatestWeek + } + isASC := true // 默认升序排列 + if reqData.Direction == DirectionDESC { + isASC = false + } + + var dates []time.Time + switch reqData.Period { + case StatiPeriodLatestWeek: + dates = times.LatestWeek(time.Now(), isASC) + case StatiPeriodLatestMonth: + dates = times.LatestMonth(time.Now(), isASC) + } + + items = make([]*InspectionStatistics, 0, len(dates)) + + // 2、遍历日期数组并逐天统计硬件正常、警告、异常设备数量 + for i := range dates { + // 查询指定日期内已完成的设备巡检记录 + insps, err := repo.GetInspectionStatisticsGroupBySN(&model.Inspection{ + StartTime: &dates[i], + RunningStatus: model.RunningStatusDone, + }, model.OneOrderBy("start_time", model.ASC), nil) + if err != nil { + return nil, err + } + // 统计每台设备当天最新一次巡检的结果 + var critical, warning, nominal int + for i := range insps { + if insps[i] == nil || insps[i].HealthStatus == model.HealthStatusUnknown { + continue + } + switch insps[i].HealthStatus { + case model.HealthStatusCritical: + critical++ + + case model.HealthStatusWarning: + warning++ + + case model.HealthStatusNominal: + nominal++ + } + } + + items = append(items, &InspectionStatistics{ + Date: dates[i].Format(dateLayout), + NominalCount: nominal, + WarningCount: warning, + CriticalCount: critical, + }) + } + return items, nil +} + +// GetInspectionsPageReq 查询巡检分页请求结构体 +type GetInspectionsPageReq struct { + // 关键词 + Keyword string `json:"keyword"` + // 设备固资号 + FixedAssetNumber string `json:"fixed_asset_number"` + // 设备序列号,支持英文逗号分隔多个序列号 + SN string `json:"sn"` + // 内网IP + IntranetIP string `json:"intranet_ip"` + // 巡检开始时间 + StartTime string `json:"start_time"` + // 巡检结束时间 + EndTime string `json:"end_time"` + // 带外IP + //OOBIP string `json:"oob_ip"` + // 巡检执行状态 + RuningStatus string `json:"running_status"` + // 机器的巡检结果(包含正常,告警,致命,未知) + HealthStatus string `json:"health_status"` + // 分页页号 + Page int64 `json:"page"` + // 分页大小 + PageSize int64 `json:"page_size"` +} + +// FieldMap 字段映射 +func (reqData *GetInspectionsPageReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.FixedAssetNumber: "fixed_asset_number", + &reqData.IntranetIP: "intranet_ip", + &reqData.SN: "sn", + &reqData.StartTime: "start_time", + &reqData.EndTime: "end_time", + //&reqData.OOBIP: "oob_ip", + &reqData.RuningStatus: "running_status", + &reqData.HealthStatus: "health_status", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + } +} + +// GetInspectionsPage 返回满足条件的物理机设备巡检结果的分页列表 +func GetInspectionsPage(log logger.Logger, repo model.Repo, reqData *GetInspectionsPageReq) (pg *page.Page, err error) { + if reqData.PageSize <= 0 || reqData.PageSize > 100 { + reqData.PageSize = 20 + } + if reqData.Page < 0 { + reqData.Page = 0 + } + + cond := model.InspectionCond{ + FixedAssetNumber: reqData.FixedAssetNumber, + SN: reqData.SN, + IntranetIP: reqData.IntranetIP, + StartTime: reqData.StartTime, + EndTime: reqData.EndTime, + //OOBIP: reqData.OOBIP, + HealthStatus: reqData.HealthStatus, + RuningStatus: reqData.RuningStatus, + } + + totalRecords, err := repo.CountInspctionsByCond(&cond) + if err != nil { + return nil, err + } + + pager := page.NewPager(reflect.TypeOf(&InspectionFullWithPage{}), reqData.Page, reqData.PageSize, totalRecords) + items, err := repo.GetInspectionListWithPageNew(&cond, pager.BuildLimiter()) + if err != nil { + return nil, err + } + for i := range items { + item := convert2IPMIResult(log, &items[i]) + pager.AddRecords(item) + } + return pager.BuildPage(), nil +} + +/* +temperature: 温度。可选值:nominal, warning, critical、unknown +voltage: 电压。可选值:nominal, warning, critical、unknown +fan: 风扇。可选值:nominal, warning, critical、unknown +memory: 内存。可选值:nominal, warning, critical、unknown +power_supply: 电源。可选值:nominal, warning, critical、unknown +*/ + +//InspectionResultItem 单项巡检结果(包括temperature,voltage,fan,memory,power_supply) +type InspectionResultItem struct { + Type string `json:"type"` + Status string `json:"status"` +} + +const ( + temperature = iota + voltage + fan + memory + powerSupply +) + +//InspectionFullWithPage 硬件巡检分页查询 +type InspectionFullWithPage struct { + //索引 + ID uint `json:"id"` + // 设备固资号 + FixedAssetNumber string `json:"fixed_asset_number"` + //设备序列号 + SN string `json:"sn"` + // 内网IP + IntranetIP string `json:"intranet_ip"` + //巡检开始时间 + StartTime times.ISOTime `json:"start_time"` + //巡检结束时间 + EndTime times.ISOTime `json:"end_time"` + //运行状态 + RuningStatus string `json:"running_status"` + //带外IP + //OOBIP string `json:"oob_ip"` + //巡检错误信息 + Error string `json:"error"` + //健康状态 + HealthStatus string `json:"health_status"` + //巡检结果 + Result []InspectionResultItem `json:"result"` + //巡检日志创建时间 + CreatedAt times.ISOTime `json:"created_at"` + //巡检日志更新时间 + UpdatedAt times.ISOTime `json:"updated_at"` +} + +//convert2IPMIResult 对IPMIResult结果做进一步处理, 有数据之后,这块结果放到repo做掉 +func convert2IPMIResult(log logger.Logger, item *model.InspectionFullWithPage) *InspectionFullWithPage { + var result []*model.SensorData + var ifwp InspectionFullWithPage + ifwp.ID = item.ID + ifwp.FixedAssetNumber = item.FixedAssetNumber + ifwp.SN = item.SN + ifwp.IntranetIP = item.IntranetIP + ifwp.StartTime = item.StartTime + ifwp.EndTime = item.EndTime + ifwp.RuningStatus = item.RuningStatus + ifwp.HealthStatus = item.HealthStatus + //ifwp.OOBIP = item.OOBIP + ifwp.Error = item.Error + ifwp.CreatedAt = item.CreatedAt + ifwp.UpdatedAt = item.UpdatedAt + + if ifwp.Error != "" { + ifwp.Result = []InspectionResultItem{} + return &ifwp + } + + if err := json.Unmarshal([]byte(item.Result), &result); err != nil { + log.Info(err) + } + + isr := []InspectionResultItem{ + InspectionResultItem{ + Type: "temperature", + Status: "unknown", + }, + InspectionResultItem{ + Type: "voltage", + Status: "unknown", + }, + InspectionResultItem{ + Type: "fan", + Status: "unknown", + }, + InspectionResultItem{ + Type: "memory", + Status: "unknown", + }, + InspectionResultItem{ + Type: "power_supply", + Status: "unknown", + }, + } + //"nominal", "warning", "critical", "unknown" + // 1 , 2 , 3 , 0 + status := map[string]int{"unknown": 0, "nominal": 1, "warning": 2, "critical": 3} + for _, v := range result { + if strings.Contains(v.Type, "Temperature") { + if isr[temperature].Status == "critical" { + continue + } + + if status[strings.ToLower(v.State)] > status[isr[temperature].Status] { + isr[temperature].Status = strings.ToLower(v.State) + } + } + if strings.Contains(v.Type, "Voltage") { + if isr[voltage].Status == "critical" { + continue + } + + if status[strings.ToLower(v.State)] > status[isr[voltage].Status] { + isr[voltage].Status = strings.ToLower(v.State) + } + } + if strings.Contains(v.Type, "Fan") { + if isr[fan].Status == "critical" { + continue + } + + if status[strings.ToLower(v.State)] > status[isr[fan].Status] { + isr[fan].Status = strings.ToLower(v.State) + } + } + if strings.Contains(v.Type, "Memory") { + if isr[memory].Status == "critical" { + continue + } + + if status[strings.ToLower(v.State)] > status[isr[memory].Status] { + isr[memory].Status = strings.ToLower(v.State) + } + } + if strings.Contains(v.Type, "Power Supply") { + if isr[powerSupply].Status == "critical" { + continue + } + + if status[strings.ToLower(v.State)] > status[isr[powerSupply].Status] { + isr[powerSupply].Status = strings.ToLower(v.State) + } + } + } + ifwp.Result = isr + return &ifwp +} + +// GetInspectionBySNReq 查询巡检明细请求结构体 +type GetInspectionBySNReq struct { + // 硬件巡检目标设备 + SN string `json:"sn"` + // 硬件巡检开始时间 + StartTime string `json:"start_time"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *GetInspectionBySNReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.SN: "sn", + &reqData.StartTime: "start_time", + } +} + +// GetInspectionBySN 查询指定设备某一次硬件巡检明细 +func GetInspectionBySN(repo model.Repo, req *GetInspectionBySNReq) (map[string]interface{}, error) { + mod, err := repo.GetInspectionDetail(req.SN, req.StartTime) + if err != nil { + return nil, err + } + var ipmiSensor []model.SensorData + var ipmiSel []model.SelData + _ = json.Unmarshal([]byte(mod.IPMIResult), &ipmiSensor) + _ = json.Unmarshal([]byte(mod.IPMISELResult), &ipmiSel) + + return map[string]interface{}{ + "id": mod.ID, + "job_id": mod.JobID, + "start_time": times.ISOTime(*mod.StartTime), + "end_time": times.ISOTime(*mod.EndTime), + "running_status": mod.RunningStatus, + "error": mod.Error, + "result": sensorDataFilter(ipmiSensor, model.HealthStatusNominal), + "selresult": selDataFilter(ipmiSel, model.HealthStatusNominal), + "created_at": times.ISOTime(mod.CreatedAt), + "updated_at": times.ISOTime(mod.UpdatedAt), + }, nil +} + +func sensorDataFilter(ipmiSensor []model.SensorData, state string) []model.SensorData { + var filtered []model.SensorData + + for _, it := range ipmiSensor { + if strings.ToLower(it.State) == state { + continue + } + + filtered = append(filtered, it) + } + + return filtered +} + +// 实现系统事件日志数据按时间最新排序 +type SelDataCollect []model.SelData +func (sdc SelDataCollect) Len() int { + return len(sdc) +} + +// 时间比较 +func (sdc SelDataCollect) Less(i, j int) bool { + // 将字符串的日期时间转换time.Time 再通过Before or After 进行比较 + formatTimeI, _ := time.Parse(selTimeLayout, fmt.Sprintf("%s %s", sdc[i].Date, sdc[i].Time)) + formatTimeJ, _ := time.Parse(selTimeLayout, fmt.Sprintf("%s %s", sdc[j].Date, sdc[j].Time)) + + if formatTimeI.After(formatTimeJ) { + return true + } + return false +} + +func (sdc SelDataCollect) Swap(i, j int) { + sdc[i], sdc[j] = sdc[j], sdc[i] +} + +// 过滤Nominal的日志并重新排序 +func selDataFilter(ipmiSel []model.SelData, state string) []model.SelData { + var filtered SelDataCollect + for _, it := range ipmiSel { + if strings.ToLower(it.State) == state { + continue + } + + filtered = append(filtered, it) + } + sort.Sort(filtered) + return filtered +} + +// GetInspectionStartTimesBySNReq 查询巡检明细请求结构体 +type GetInspectionStartTimesBySNReq struct { + // 硬件巡检目标设备 + SN string + // 硬件巡检执行状态 + RunningStatus string +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *GetInspectionStartTimesBySNReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.SN: "sn", + &reqData.RunningStatus: "running_status", + } +} + +// GetInspectionStartTimesBySN 查询指定设备的历史硬件巡检开始时间列表 +func GetInspectionStartTimesBySN(repo model.Repo, req *GetInspectionStartTimesBySNReq) ([]string, error) { + mod, err := repo.GetInspectionStartTimeBySN(req.SN, req.RunningStatus) + if err != nil { + return nil, err + } + var starts []string + for _, m := range mod { + starts = append(starts, times.ISOTime(m).String()) + } + return starts, nil +} + +// InspectionPageReq 物理机巡检记录查询分页请求 +type InspectionRecordsPageReq struct { + // 设备序列号,支持英文逗号分隔多个序列号 + SN string `json:"sn"` + // 巡检开始时间 + StartTime string `json:"start_time"` + // 巡检结束时间 + EndTime string `json:"end_time"` + // 机器的巡检结果(包含正常,告警,致命,未知) enum('nominal','warning','critical','unknown') + HealthStatus string `json:"health_status"` + // 分页页号 + Page int64 `json:"page"` + // 分页大小 限制1000 + PageSize int64 `json:"page_size"` +} + +// FieldMap 字段映射 +func (reqData *InspectionRecordsPageReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.SN: "sn", + &reqData.StartTime: "start_time", + &reqData.EndTime: "end_time", + &reqData.HealthStatus: "health_status", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + } +} + +//InspectionRecordsPage 物理机巡检记录查询分页结果 +type InspectionRecordsPage struct { + //索引 + ID uint `json:"id"` + //设备序列号 + SN string `json:"sn"` + //巡检开始时间 + StartTime times.ISOTime `json:"start_time"` + //巡检结束时间 + EndTime times.ISOTime `json:"end_time"` + //运行状态 + RuningStatus string `json:"running_status"` + //巡检错误信息 + Error string `json:"error"` + //健康状态 + HealthStatus string `json:"health_status"` + //巡检结果 + Result []model.SensorData `json:"result"` + SelResult []model.SelData `json:"selresult"` + //巡检日志创建时间 + CreatedAt times.ISOTime `json:"created_at"` + //巡检日志更新时间 + UpdatedAt times.ISOTime `json:"updated_at"` +} + +// GetInspectionRecordsPage 查询物理机巡检记录分页列表 +func GetInspectionRecordsPage(log logger.Logger, repo model.Repo, reqData *InspectionRecordsPageReq) (pg *page.Page, err error) { + if reqData.PageSize <= 0 || reqData.PageSize > 1000 { + reqData.PageSize = 20 + } + if reqData.Page < 0 { + reqData.Page = 1 + } + + cond := model.InspectionCond{ + SN: reqData.SN, + StartTime: reqData.StartTime, + EndTime: reqData.EndTime, + HealthStatus: reqData.HealthStatus, + } + + totalRecords, err := repo.CountInspectionRecordsPage(&cond) + if err != nil { + return nil, err + } + + pager := page.NewPager(reflect.TypeOf(&InspectionRecordsPage{}), reqData.Page, reqData.PageSize, totalRecords) + items, err := repo.GetInspectionRecordsPage(&cond, pager.BuildLimiter()) + if err != nil { + return nil, err + } + for i := range items { + item := FilterIPMIResult(log, items[i]) + pager.AddRecords(item) + } + return pager.BuildPage(), nil +} + +//convert2IPMIResult 对IPMIResult结果做进一步处理, 有数据之后,这块结果放到repo做掉 +func FilterIPMIResult(log logger.Logger, item *model.InspectionRecordsPage) *InspectionRecordsPage { + var result []*model.SensorData + var selresult []*model.SelData + var IRP InspectionRecordsPage + IRP.ID = item.ID + IRP.SN = item.SN + IRP.StartTime = item.StartTime + IRP.EndTime = item.EndTime + IRP.RuningStatus = item.RuningStatus + IRP.HealthStatus = item.HealthStatus + IRP.Error = item.Error + IRP.CreatedAt = item.CreatedAt + IRP.UpdatedAt = item.UpdatedAt + + // 过滤传感器中读数N/A的数据 + var filteredReading = "N/A" + var filteredresult []model.SensorData + if err := json.Unmarshal([]byte(item.Result), &result); err != nil { + log.Info(err) + } + for _, v := range result { + if strings.Contains(v.Reading, filteredReading) { + continue + } + filteredresult = append(filteredresult, *v) + } + IRP.Result = filteredresult + + // 系统事件日志暂时不过滤 + var filteredselresult []model.SelData + if err := json.Unmarshal([]byte(item.SelResult), &selresult); err != nil { + log.Info(err) + } + for _, v := range selresult { + filteredselresult = append(filteredselresult, *v) + } + IRP.SelResult = filteredselresult + return &IRP +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/installation.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/installation.go new file mode 100644 index 0000000000000000000000000000000000000000..33023af2cb615bb78a0a7b27dca82004ef5fbea0 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/installation.go @@ -0,0 +1,213 @@ +package service + +import ( + "strings" + "encoding/base64" + "fmt" + "net/http" + + "github.com/jinzhu/gorm" + "github.com/voidint/binding" + + "time" + + "idcos.io/cloudboot/config" + "idcos.io/cloudboot/limiter" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils/centos6" + "idcos.io/cloudboot/utils/ping" +) + +// InstallProgressReq 安装进度上报结构体 +type InstallProgressReq struct { + DeviceSettingID uint `json:"-"` + SN string `json:"-"` + Title string `json:"title"` + Progress float64 `json:"progress"` + Log string `json:"log"` +} + +// FieldMap 请求字段映射 +func (reqData *InstallProgressReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.Title: "title", + &reqData.Progress: "progress", + &reqData.Log: "log", + } +} + +// Validate 装机参数校验 +func (reqData *InstallProgressReq) Validate(r *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(r.Context()) + + if reqData.SN == "" { + errs.Add([]string{"sn"}, binding.RequiredError, "sn不能为空") + } + + if reqData.Progress > 1 || (reqData.Progress < 0 && reqData.Progress != -1) { + errs.Add([]string{"progress"}, binding.BusinessError, "无效的进度值") + return errs + } + sett, err := repo.GetDeviceSettingBySN(reqData.SN) + if err == gorm.ErrRecordNotFound { + errs.Add([]string{"sn"}, binding.BusinessError, "未发现设备装机参数") + return errs + } + if err != nil { + errs.Add([]string{"sn"}, binding.SystemError, err.Error()) + return errs + } + reqData.DeviceSettingID = sett.ID + + //有个需求是即使安装失败的状态,也可以通过手动干预的方式在确认OK(比如检查脚本)后上报进度,故不再限制死此状态 + //已经安装成功或者已经取消安装(status==failure,progress==0.0) + if (sett.Status == model.InstallStatusSucc) || + (sett.Status == model.InstallStatusFail && sett.InstallProgress == 0.0) { + errs.Add([]string{"sn"}, binding.BusinessError, "当前设备并不在安装列表中") + return errs + } + return errs +} + +// ReportInstallProgress 处理安装进度上报 +func ReportInstallProgress(logger logger.Logger, repo model.Repo, conf *config.Config, lim limiter.Limiter, reqData *InstallProgressReq) (err error) { + logger.Infof("title: %v, progress: %v, log: %v\n", reqData.Title, reqData.Progress, reqData.Log) + + var status, title, installLog string + if byteDecode, err := base64.StdEncoding.DecodeString(reqData.Log); err == nil { + installLog = string(byteDecode) + } + + if (reqData.Progress == 1 || reqData.Progress == -1) && centos6.IsPXEUEFI(logger, repo, reqData.SN) { + _ = centos6.DropConfigurations(logger, repo, reqData.SN) // TODO 为支持centos6的UEFI方式安装而临时增加的逻辑,后续会删除。 + } + + go func() { + switch reqData.Progress { + case 1: // 安装成功 + devSett, err := GetDeviceSettingBySN(logger, repo, reqData.SN) + if err != nil { + logger.Error("get device setting by sn:%s fail,%v", reqData.SN, err) + //return err + } + // 可能有多个IP逗号分隔的场景,默认取第一个 + intranetIPList := strings.Split(devSett.IntranetIP.IP, ",") + //异步ping 内网IP,直到ping通或者超时 + timeout := 30 * time.Minute //30 min + ok := make(chan bool, 0) + go func() { + for i := 0; i < int(timeout/(10*time.Second)); i++ { + time.Sleep(10 * time.Second) + if err := ping.PingTest(intranetIPList[0]); err == nil { + ok <- true + return + } + } + }() + + select { + case <-time.After(timeout): + // 临门一脚失败了,设备ping超时 + logger.Error("device:%s install complete but intranet ip not available after reboot", reqData.SN) + status, title, installLog = model.InstallStatusFail, reqData.Title, installLog+"(but ping failed at last)" + reqData.Progress = -1.0 + case <-ok: + // 千辛万苦,部署成功啦! + logger.Infof("Congratulations!!! device:%s installed success", reqData.SN) + status = model.InstallStatusSucc + title = fmt.Sprintf("%s(%.1f%%)", reqData.Title, reqData.Progress*100) + installLog += "(and ping client successful!)" + //加个特殊的流程begin + //如果备注字段有运行状态,则说明是回收重装的 + d, err := repo.GetDeviceBySN(devSett.SN) + if d == nil { + logger.Error("device:%s not exist,%v", devSett.SN, err) + //return err + } else if d != nil && d.Remark != "" && validOperationStatus(d.Remark) { + d.OperationStatus = d.Remark + d.Remark = "" //置空,这里会比较暴力 + } else { + d.OperationStatus = model.DevOperStatOnShelve // 系统安装完成后运营状态改为'已上架' + } + //end + d.RAIDRemark = devSett.HardwareTemplate.Name //将RAID模板名称同步写到device表的RAID描述字段 + + if _, err := repo.SaveDevice(d); err != nil { + logger.Error("save device:%d fail,%v", d, err) + } + // 归还令牌 + if conf.DHCPLimiter.Enable { + if bucket, _ := lim.Route(reqData.SN); bucket != nil { + if token, _ := repo.GetTokenBySN(reqData.SN); token != "" { + _ = bucket.Return(reqData.SN, limiter.Token(token)) + } + } + } + } + case -1: // 安装失败 + status, title = model.InstallStatusFail, reqData.Title + default: // 安装中 + status, title = model.InstallStatusIng, fmt.Sprintf("%s(%.1f%%)", reqData.Title, reqData.Progress*100) + } + + if _, err := repo.UpdateInstallStatusAndProgressByID(reqData.DeviceSettingID, status, reqData.Progress); err != nil { + logger.Errorf("update install status by id:%d err:%v", reqData.DeviceSettingID, err) + //return err + } + + _, err = repo.SaveDeviceLog(&model.DeviceLog{ + DeviceSettingID: reqData.DeviceSettingID, + Title: title, + LogType: model.DeviceLogInstallType, + Content: installLog, + SN: reqData.SN, + }) + if err != nil { + logger.Errorf("save device log err:%v", err) + } + }() + return err +} + +// InstallationStatus 设备操作系统安装状态 +type InstallationStatus struct { + Type string `json:"type"` + Status string `json:"status"` + Progress float64 `json:"progress"` +} + +// GetInstallationStatus 返回指定设备的OS安装状态 +func GetInstallationStatus(log logger.Logger, repo model.Repo, sn string) (*InstallationStatus, error) { + sett, err := repo.GetDeviceSettingBySN(sn) + if err != nil { + return nil, err + } + return &InstallationStatus{ + Type: sett.InstallType, + Status: sett.Status, + Progress: sett.InstallProgress, + }, nil +} + +// GetIsInInstallListBySN 返回指定设备是否处于装机队列的布尔值 +func GetIsInInstallListBySN(log logger.Logger, repo model.Repo, sn string) (isInList bool, err error) { + // var affected int64 + // if affected, err = repo.UpdateDeviceBySN(&model.Device{ + // SN: sn, + // BootosLastActiveTime: time.Now().Format("2006-01-02 15:04:05"), + // }, true); err != nil { + // log.Errorf("update bootos last active time error:%s", err.Error()) + // } + // if affected <= 0 { + // return false, nil + // } + + sett, err := repo.GetDeviceSettingBySN(sn) + if err != nil { + return false, err + } + return sett.Status == model.InstallStatusPre || sett.Status == model.InstallStatusIng, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/ip_network.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/ip_network.go new file mode 100644 index 0000000000000000000000000000000000000000..23f76504b501d53580deb284e267db66c19155a4 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/ip_network.go @@ -0,0 +1,2198 @@ +package service + +import ( + "time" + "errors" + "encoding/json" + "fmt" + "net/http" + "os" + "reflect" + "regexp" + "strconv" + "strings" + + "github.com/jinzhu/gorm" + "github.com/voidint/binding" + "github.com/voidint/page" + + "idcos.io/cloudboot/config" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils" + "idcos.io/cloudboot/utils/network" + "idcos.io/cloudboot/utils/ping" + strings2 "idcos.io/cloudboot/utils/strings" + "idcos.io/cloudboot/utils/times" + "idcos.io/cloudboot/utils/upload" + nw "idcos.io/cloudboot/utils/network" +) + +var ( + ipReg = regexp.MustCompile("^((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)$") + ipv6Reg = regexp.MustCompile("^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$") +) + +//IDCOrServerRoom 网段分页查询专用 +type IDCOrServerRoom struct { + //索引 + ID int `json:"id"` + //名称 + Name string `json:"name"` +} + +//SwitchDetail 交换机详情 +type SwitchDetail struct { + // 资产编号 + FixedAssetNumber string `json:"fixed_asset_number"` + // 名称 + Name string `json:"name"` + // Tor分组 + Tor string `json:"tor"` +} + +// IPNetworkPage 网段 +type IPNetworkPage struct { + //数据中心 + IDC IDCOrServerRoom `json:"idc"` + //机房 + ServerRoom IDCOrServerRoom `json:"server_room"` + //网段ID + ID int `json:"id"` + //CIDR网段 + CIDR string `json:"cidr"` + //网段类别(ilo-服务器ILO; tgw_intranet-服务器TGW内网; tgw_extranet-服务器TGW外网; intranet-服务器普通内网; extranet-服务器普通外网; v_intranet-服务器虚拟化内网;) + Category string `json:"category"` + //掩码 + Netmask string `json:"netmask"` + //网关 + Gateway string `json:"gateway"` + //业务IP资源池 + IPPool string `json:"ip_pool"` + //带外IP资源池 + PXEPool string `json:"pxe_pool"` + //交换机设备 + Switchs []SwitchDetail `json:"switchs"` + //网络区域 + NetworkArea string `json:"network_area"` + NetworkAreaID uint `json:"-"` + //vlan + Vlan string `json:"vlan"` + //IP版本 + Version string `json:"version"` + // 创建时间 + CreatedAt times.ISOTime `json:"created_at"` + // 更新时间 + UpdatedAt times.ISOTime `json:"updated_at"` +} + +// GetIPNetworkPageReq 查询网段分页请求结构体 +type GetIPNetworkPageReq struct { + //机房ID + ServerRoomID string `json:"server_room_id"` + ServerRoomName string `json:"server_room_name"` + //CIDR网段,支持模糊查询 + CIDR string `json:"cidr"` + //网段类别。可选值: ilo-服务器ILO; tgw_intranet-服务器TGW内网; tgw_extranet-服务器TGW外网; intranet-服务器普通内网; extranet-服务器普通外网; v_intranet-服务器虚拟化内网; + Category string `json:"category"` + Switches string `json:"switches"` + NetworkAreaID string `json:"network_area_id"` + NetworkAreaName string `json:"network_area_name"` + //分页页号 + Page int64 `json:"page"` + //分页大小 + PageSize int64 `json:"page_size"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *GetIPNetworkPageReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.ServerRoomID: "server_room_id", + &reqData.ServerRoomName: "server_room_name", + &reqData.Category: "category", + &reqData.CIDR: "cidr", + &reqData.Switches: "switches", + &reqData.NetworkAreaID: "network_area_id", + &reqData.NetworkAreaName: "network_area_name", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + } +} + +//Validate 请求数据校验 +func (reqData *GetIPNetworkPageReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + + if reqData.ServerRoomID != "" { + srs := strings2.Multi2UintSlice(reqData.ServerRoomID) + for _, sr := range srs { + if _, err := repo.GetServerRoomByID(sr); err == gorm.ErrRecordNotFound { + errs.Add([]string{"server_room_id"}, binding.BusinessError, http.StatusText(http.StatusNotFound)) + return errs + } + } + } + + // 校验CIDR + if reqData.CIDR != "" { + cidrs := strings2.MultiLines2Slice(reqData.CIDR) + for _, cidr := range cidrs { + cidrArr := strings.Split(cidr, "/") + if len(cidrArr) != 2 || (!ipReg.MatchString(cidrArr[0]) && !ipv6Reg.MatchString(cidrArr[0])) { + errs.Add([]string{"cidr"}, binding.BusinessError, "无效CIDR(正确格式为:IP/掩码长度)") + return errs + } + } + } + + // 校验Category + if reqData.Category != "" { + category := strings.Split(strings.TrimSpace(reqData.Category), ",") + for k := range category { + categoryIsGood := true + switch category[k] { + case model.ILO: + case model.TGWIntranet: + case model.TGWExtranet: + case model.Intranet: + case model.Extranet: + case model.VIntranet: + case model.VExtranet: + default: + categoryIsGood = false + } + if !categoryIsGood { + errs.Add([]string{"category"}, binding.RequiredError, fmt.Sprintf("必填函数校验: category只能为 %s", + "可选值: ilo-服务器ILO; tgw_intranet-服务器TGW内网; tgw_extranet-服务器TGW外网; intranet-服务器普通内网; extranet-服务器普通外网; v_intranet-服务器虚拟化内网")) + return errs + } + } + } + return errs +} + +//按固定格式提取固资号 +func ExtractFN(name string) string { + reg := regexp.MustCompile(`\([\w|\p{Han}]+\)?`) + rawFN := reg.FindAllString(name, -1) + fns := make([]string, 0, len(rawFN)) + for _, fn := range rawFN { + fns = append(fns, strings.Trim(fn, "()")) + } + return strings.Join(fns, commaSep) +} + +// GetIPNetworkPage 按条件查询业务网段分页列表 +func GetIPNetworkPage(log logger.Logger, repo model.Repo, reqData *GetIPNetworkPageReq) (pg *page.Page, err error) { + if reqData.PageSize <= 0 || reqData.PageSize > 1000 { + log.Warn("page size > 1000 or <= 0 , re-write to 10") + reqData.PageSize = 10 + } + if reqData.Page < 0 { + reqData.Page = 0 + } + + //网络区域检索时,分开处理 + isFilterNetworkArea := false + if reqData.NetworkAreaName != "" { + isFilterNetworkArea = true + } + + cond := model.IPNetworkCond{ + CIDR: reqData.CIDR, + Category: reqData.Category, + ServerRoomID: strings2.Multi2UintSlice(reqData.ServerRoomID), + Switches: reqData.Switches, + ServerRoomName: reqData.ServerRoomName, + } + + totalRecords, err := repo.CountIPNetworks(&cond) + if err != nil { + return nil, err + } + + pager := page.NewPager(reflect.TypeOf(&IPNetworkPage{}), reqData.Page, reqData.PageSize, totalRecords) + var items []*model.IPNetwork + if isFilterNetworkArea { + items, err = repo.GetIPNetworks(&cond, model.OneOrderBy("id", model.DESC), nil) + } else { + items, err = repo.GetIPNetworks(&cond, model.OneOrderBy("id", model.DESC), pager.BuildLimiter()) + } + if err != nil { + return nil, err + } + + for i := range items { + ipnp, err := convert2IPNetwork(items[i], log, repo) + if err != nil { + return nil, err + } + if ipnp != nil { + //网络区域的过滤放到这里 + if isFilterNetworkArea { + netAreas := strings2.MultiLines2Slice(reqData.NetworkAreaName) + for _, netArea := range netAreas { + if strings.Contains(ipnp.NetworkArea, netArea) { + pager.AddRecords(ipnp) + break + } + } + } else { + pager.AddRecords(ipnp) + } + } + } + + //这里可能有bug,当查询网络区域时,计数和分页可能不对 + if isFilterNetworkArea { + p := pager.BuildPage() + p.TotalRecords = int64(len(p.Records)) + return p, nil + } + return pager.BuildPage(), nil +} + +// convert2IPNetwork 将model层的业务网段对象转化成service层的业务网段对象 +func convert2IPNetwork(src *model.IPNetwork, log logger.Logger, repo model.Repo) (*IPNetworkPage, error) { + if src == nil { + return nil, nil + } + + ipnp := &IPNetworkPage{ + ID: int(src.ID), + CIDR: src.CIDR, + Netmask: src.Netmask, + Category: src.Category, + Gateway: src.Gateway, + IPPool: src.IPPool, + PXEPool: src.PXEPool, + Vlan: src.Vlan, + Version: src.Version, + CreatedAt: times.ISOTime(src.CreatedAt), + UpdatedAt: times.ISOTime(src.UpdatedAt), + } + + sr, err := repo.GetServerRoomByID(src.ServerRoomID) + if err != nil && err != gorm.ErrRecordNotFound { + return nil, err + } + + if sr != nil { + ipnp.ServerRoom = IDCOrServerRoom{ + ID: int(sr.ID), + Name: sr.Name, + } + + idc, err := repo.GetIDCByID(sr.IDCID) + if err != nil && err != gorm.ErrRecordNotFound { + return nil, err + } + + if idc != nil { + ipnp.IDC = IDCOrServerRoom{ + ID: int(idc.ID), + Name: idc.Name, + } + } + } + + //查询交换机设备详情 + var switchs []string + _ = json.Unmarshal([]byte(src.Switches), &switchs) + for k := range switchs { + nd, err := repo.GetNetworkDeviceByFixedAssetNumber(switchs[k]) + + if err != nil { + return nil, err + } + if len(nd) == 1 { + ipnp.Switchs = append(ipnp.Switchs, SwitchDetail{ + FixedAssetNumber: nd[0].FixedAssetNumber, + Name: nd[0].Name, + Tor: nd[0].TOR, + }) + //网络区域的获取方法是,交换机>机架>网络区域> + if ipnp.NetworkArea == "" { + if cabinet, err := repo.GetServerCabinetByID(nd[0].ServerCabinetID); err != nil { + log.Errorf("get cabinet by id:%d fail", nd[0].ServerCabinetID) + continue + } else if cabinet != nil { + if na, err := repo.GetNetworkAreaByID(cabinet.NetworkAreaID); err != nil { + log.Errorf("get net_area by id:%d fail", cabinet.NetworkAreaID) + continue + } else if na != nil { + ipnp.NetworkArea = na.Name + ipnp.NetworkAreaID = na.ID + } + } + } + } + if len(nd) > 1 { + return nil, fmt.Errorf("网络设备数据查询不唯一,固资编号为(%s)", switchs[k]) + } + + } + + return ipnp, nil +} + +// GetIPNetworkByID 返回指定ID的网段 +func GetIPNetworkByID(log logger.Logger, repo model.Repo, id uint) (ipnet *IPNetworkPage, err error) { + one, err := repo.GetIPNetworkByID(id) + if err != nil { + return nil, err + } + + ipnet, err = convert2IPNetwork(one, log, repo) + if err != nil { + return nil, err + } + return ipnet, nil +} + +// SaveIPNetworkReq 保存(新增/更新)业务网段请求结构体 +type SaveIPNetworkReq struct { + // (required): 所属机房管理单元ID + ServerRoomID int `json:"server_room_id"` + // 网段ID。若id=0,则新增。若id>0,则修改 + ID int `json:"id"` + //(required): CIDR网段 + CIDR string `json:"cidr"` + //(required): 网段类别。可选值: ilo-服务器ILO; tgw_intranet-服务器TGW内网; tgw_extranet-服务器TGW外网; intranet-服务器普通内网; extranet-服务器普通外网; v_intranet-服务器虚拟化内网; + Category string `json:"category"` + //(required): 掩码 + Netmask string `json:"netmask"` + // (required): 网关 + Gateway string `json:"gateway"` + //(required): 业务IP池 + IPPool string `json:"ip_pool"` + //(required): PXE IP资源池 + PXEPool string `json:"pxe_pool"` + //(required): 网段作用范围内的交换机固定资产编号字符串数组 + Switchs []string `json:"switchs"` + //(required): VLAN + Vlan string `json:"vlan"` + // Version : ipv4 ipv6 + Version string `json:"version"` + IDCID uint + // 用户登录名 + LoginName string `json:"-"` +} + + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *SaveIPNetworkReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.ServerRoomID: "server_room_id", + &reqData.ID: "id", + &reqData.Gateway: "gateway", + &reqData.Vlan: "vlan", + &reqData.CIDR: "cidr", + &reqData.Category: "category", + &reqData.Netmask: "netmask", + &reqData.Switchs: "switchs", + &reqData.IPPool: "ip_pool", + &reqData.PXEPool: "pxe_pool", + &reqData.Version: "version", + } +} + +// Validate 结构体数据校验 +func (reqData *SaveIPNetworkReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + + if reqData.ServerRoomID > 0 { + sr, err := repo.GetServerRoomByID(uint(reqData.ServerRoomID)) + if err == gorm.ErrRecordNotFound { + errs.Add([]string{"server_room_id"}, binding.BusinessError, http.StatusText(http.StatusNotFound)) + return errs + } + reqData.IDCID = sr.IDCID + } + + // 校验CIDR + if reqData.CIDR == "" { + errs.Add([]string{"cidr"}, binding.RequiredError, fmt.Sprintln("必填函数校验: CIDR为空")) + return errs + } + + // 校验Category + categoryIsGood := true + switch reqData.Category { + case "ilo": + case "tgw_intranet": + case "tgw_extranet": + case "intranet": + case "extranet": + case "v_intranet": + case "v_extranet": + default: + categoryIsGood = false + } + if !categoryIsGood { + errs.Add([]string{"category"}, binding.RequiredError, fmt.Sprintf("必填函数校验: category只能为 %s", + "可选值: ilo-服务器ILO; tgw_intranet-服务器TGW内网; tgw_extranet-服务器TGW外网; intranet-服务器普通内网; extranet-服务器普通外网; v_intranet-服务器虚拟化内网; v_extranet-服务器虚拟化外网")) + return errs + } + + // 获取已有全量网段信息并校验 + items, err := repo.GetIPNetworks(&model.IPNetworkCond{ + CIDR: reqData.CIDR, + }, nil, nil) + if err != nil { + errs.Add([]string{"cidr"}, binding.SystemError, "内部访问数据库错误") + return errs + } + for _, item := range items { + if (reqData.ID == 0 && (item.CIDR == reqData.CIDR)) || // 新增时,CIDR不能重复 + ((reqData.ID > 0 && item.CIDR == reqData.CIDR) && (uint(reqData.ID) != item.ID)) { // 更新时,CIDR不能重复(除了自身外) + errs.Add([]string{"cidr"}, binding.BusinessError, fmt.Sprintf("网段CIDR:%s已经存在", reqData.CIDR)) + return errs + } + } + + // 数据校验 - IPv4 + if reqData.Version == model.IPv4 { + cidrArr := strings.Split(reqData.CIDR, "/") + if len(cidrArr) != 2 || !ipReg.MatchString(cidrArr[0]) { + errs.Add([]string{"cidr"}, binding.BusinessError, "IPv4-CIDR校验:无效的网段") + return errs + } + // IPv4 掩码长度转换成详细数值 + maskLen, _ := strconv.Atoi(cidrArr[1]) + netMask := network.GetCidrIPMask(maskLen) + if reqData.Netmask == "" { + errs.Add([]string{"mask"}, binding.RequiredError, fmt.Sprintln("IPv4必填项校验: 掩码不能为空")) + return errs + } + if !ipReg.MatchString(reqData.Netmask) { + errs.Add([]string{"mask"}, binding.BusinessError, fmt.Sprintf("IPv4掩码(%s)不正确", reqData.Netmask)) + return errs + } + + if reqData.Netmask != netMask { + errs.Add([]string{"mask"}, binding.BusinessError, fmt.Sprintf("IPv4掩码(%s)与CIDR指定(%s)不匹配", reqData.Netmask, netMask)) + return errs + } + // 校验网关 + if reqData.Gateway == "" { + errs.Add([]string{"gateway"}, binding.RequiredError, fmt.Sprintln("IPv4必填项校验: 网关不能为空")) + return errs + } + // 校验非TGW网段Gateway为网段第一个IP + if reqData.Category !="tgw_intranet" && reqData.Category !="tgw_extranet" { + min, _ := nw.GetCidrIPRange(reqData.CIDR) + if reqData.Gateway != min { + errs.Add([]string{"gateway"}, binding.RequiredError, fmt.Sprintf("IPv4必填项校验: 非TGW网段网关%s校验失败,应为网段第一个IP: %s", reqData.Gateway, min)) + return errs + } + } + // 资源池校验 + if reqData.IPPool == "" { + errs.Add([]string{"ip_pool"}, binding.RequiredError, fmt.Sprintln("IPv4必填项校验: ip资源池不能为空")) + return errs + } + ipPool := strings.Split(reqData.IPPool, ",") + if len(ipPool) < 2 || !ipReg.MatchString(ipPool[0]) || !ipReg.MatchString(ipPool[1]) { + errs.Add([]string{"ip_pool"}, binding.BusinessError, fmt.Sprintf("IPv4资源池(%s)不正确", reqData.IPPool)) + return errs + } + if !network.CIDRContainsIP(reqData.CIDR, ipPool[0]) || !network.CIDRContainsIP(reqData.CIDR, ipPool[1]) { + errs.Add([]string{"ip_pool"}, binding.BusinessError, fmt.Sprintf("IPv4资源池(%s)不在指定的CIDR内", reqData.IPPool)) + return errs + } + } + + // 数据校验 - IPv6 + if reqData.Version == model.IPv6 { + cidrArr := strings.Split(reqData.CIDR, "/") + if len(cidrArr) != 2 || !ipv6Reg.MatchString(cidrArr[0]) { + errs.Add([]string{"cidr"}, binding.BusinessError, "IPv6-CIDR校验:无效的网段") + return errs + } + // 校验网关 + if reqData.Gateway == "" { + errs.Add([]string{"gateway"}, binding.RequiredError, fmt.Sprintln("IPv6必填项校验: 网关不能为空")) + return errs + } + } + + // 重复校验 + if reqData.ID == 0 { + totalRecords, err := repo.CountIPNetworks(&model.IPNetworkCond{ + CIDR: reqData.CIDR, + Category: reqData.Category, + ServerRoomID: []uint{uint(reqData.ServerRoomID)}, + }) + if err != nil { + errs.Add([]string{"count_network"}, binding.SystemError, "内部访问数据库错误") + return errs + } + if totalRecords > 0 { + errs.Add([]string{"network_repeat"}, binding.BusinessError, fmt.Sprintf("重复添加网段(%s)", reqData.CIDR)) + return errs + } + } + // 交换机校验 TODO + return errs +} + +// SaveIPNetwork 保存(新增/更新)网段及其网段内的IP +func SaveIPNetwork(log logger.Logger, repo model.Repo, reqData *SaveIPNetworkReq) (err error) { + swb, _ := json.Marshal(reqData.Switchs) + sw := string(swb) + ipnet := &model.IPNetwork{ + IDCID: reqData.IDCID, + ServerRoomID: uint(reqData.ServerRoomID), + Category: reqData.Category, + Gateway: reqData.Gateway, + CIDR: reqData.CIDR, + Netmask: reqData.Netmask, + Vlan: reqData.Vlan, + Version: reqData.Version, + Switches: sw, + IPPool: reqData.IPPool, + PXEPool: reqData.PXEPool, + Creator: reqData.LoginName, + } + ipnet.ID = uint(reqData.ID) + + _, err = repo.SaveIPNetwork(ipnet) + reqData.ID = int(ipnet.ID) + return err +} + + +//RemoveIPNetworkValidte 删除操作校验 +func RemoveIPNetworkValidte(log logger.Logger, repo model.Repo, id uint) string { + //统计该网段是否存在已分配的IP + count, _ := repo.CountIPs(&model.IPPageCond{ + IPNetworkID: []uint{id}, + IsUsed: model.IPUsed, + }) + if count > 0 { + return fmt.Sprintf("网段下面的IP已经分配(%d)个,不允许删除", count) + } + return "" +} + +// RemoveIPNetwork 删除指定ID的网段 +func RemoveIPNetwork(log logger.Logger, repo model.Repo, id uint) (err error) { + affected, err := repo.RemoveIPNetworkByID(id) + if err != nil { + return err + } + if affected <= 0 { + return gorm.ErrRecordNotFound + } + return nil +} + +// 批量删除网段请求结构体 +type DelIPNetworkReq struct { + IDs []uint `json:"ids"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *DelIPNetworkReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDs: "ids", + } +} + +// Validate 结构体数据校验 +func (reqData *DelIPNetworkReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + for _, id := range reqData.IDs { + if _, err := repo.GetIPNetworkByID(id); err != nil { + errs.Add([]string{"id"}, binding.RequiredError, fmt.Sprintf("网段ID(%d)不存在", id)) + return errs + } + //统计该网段是否存在已分配的IP + count, _ := repo.CountIPs(&model.IPPageCond{ + IPNetworkID: []uint{id}, + IsUsed: model.IPUsed, + }) + if count > 0 { + errs.Add([]string{"id"}, binding.RequiredError, fmt.Sprintf("网段ID(%d)存在(%d)个已分配的IP,不允许删除", id, count)) + return errs + } + } + return nil +} + +//RemoveIPNetworks 删除指定ID的网段 +func RemoveIPNetworks(log logger.Logger, repo model.Repo, reqData *DelIPNetworkReq) (affected int64, err error) { + for _, id := range reqData.IDs { + _, err := repo.RemoveIPNetworkByID(id) + if err != nil { + log.Errorf("delete ip_network(id=%d) fail,err:%v", id, err) + return affected, err + } + + affected++ + } + return affected, err +} + +//IPNetworkForIPSPage 为了查询IP分页 +type IPNetworkForIPSPage struct { + //IP网段索引 + ID int `json:"id"` + //CIDR网段 + CIDR string `json:"cidr"` + //掩码 + Netmask string `json:"netmask"` + //网关 + Gateway string `json:"gateway"` + //网段类别 + Category string `json:"category"` + //IP版本 + Version string `json:"version"` +} + +// IPSPage 网段 +type IPSPage struct { + //网段信息 + IPNetwork IPNetworkForIPSPage `json:"ip_network"` + //索引 + ID int `json:"id"` + //ip地址,支持模糊查询 + IP string `json:"ip"` + //网段类别。可选值: pxe-PXE用IP; business-业务用IP; + Category string `json:"category"` + //是否已经被使用。可选值: yes-是; no-否; + IsUsed string `json:"is_used"` + //占用IP的设备序列号。(支持模糊查询) + SN string `json:"sn"` + //固资编号 + FixedAssetNumber string `json:"fixed_asset_number"` + //内外网 + Scope string `json:"scope"` + //Remark string `json:"remark"` + // 创建时间 + CreatedAt times.ISOTime `json:"created_at"` + // 更新时间 + UpdatedAt times.ISOTime `json:"updated_at"` +} + +// GetIPSPageReq 查询网段分页请求结构体 +type GetIPSPageReq struct { + //网段ID + IPNetworkID string `json:"ip_network_id"` + //CIDR网段 + CIDR string `json:"cidr"` + //ip地址,支持模糊查询 + IP string `json:"ip"` + //网段类别。 + Category string `json:"ipnetwork_category"` + //是否已经被使用。可选值: yes-是; no-否; + IsUsed string `json:"is_used"` + //占用IP的设备序列号。(支持模糊查询) + SN string `json:"sn"` + //固资编号 + FixedAssetNumber string `json:"fixed_asset_number"` + //内外网 + Scope string `json:"scope"` + //分页页号 + Page int64 `json:"page"` + //分页大小 + PageSize int64 `json:"page_size"` + // 用于勾选并导出 + ID string +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *GetIPSPageReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IPNetworkID: "ip_network_id", + &reqData.CIDR: "cidr", + &reqData.IP: "ip", + &reqData.Category: "ipnetwork_category", + &reqData.IsUsed: "is_used", + &reqData.SN: "sn", + &reqData.FixedAssetNumber: "fixed_asset_number", + &reqData.Scope: "scope", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + &reqData.ID: "id", + } +} + +//Validate 请求数据校验 +func (reqData *GetIPSPageReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + //repo, _ := middleware.RepoFromContext(req.Context()) + //if reqData.IPNetworkID !="" { + // if _, err := repo.GetIPNetworkByID(uint(reqData.IPNetworkID)); err == gorm.ErrRecordNotFound { + // errs.Add([]string{"ip_network_id"}, binding.BusinessError, http.StatusText(http.StatusNotFound)) + // return errs + // } + //} + + if reqData.IP != "" { + ip := reqData.IP + + // 格式校验 + ips := strings.Split(ip, ".") + iplen := len(ips) + for i := 0; i < iplen; i++ { + if !strings.Contains(ips[i], "*") { + seg, _ := strconv.Atoi(ips[i]) + if seg > 255 { + errs.Add([]string{"ip"}, binding.RequiredError, fmt.Sprintf("IP(%s)格式不对", reqData.IP)) + return errs + } + } + } + + // 长度不够补齐 + if iplen < 4 { + for i := iplen; i < 4; i++ { + ip = ip + ".*" + } + } + + if strings.Contains(ip, "*") { + ip = strings.Replace(ip, "*", "%", -1) + } + + reqData.IP = ip + } + + // 校验Category + //if reqData.Category != "" { + // categoryIsGood := true + // switch reqData.Category { + // case model.PXEIP: + // case model.BusinessIP: + // default: + // categoryIsGood = false + // } + // if !categoryIsGood { + // errs.Add([]string{"category"}, binding.RequiredError, fmt.Sprintf("category只能为 %s", + // "pxe-PXE用IP; business-业务用IP")) + // return errs + // } + // + //} + + // 校验IsUsed + if reqData.IsUsed != "" { + vals := strings2.MultiLines2Slice(reqData.IsUsed) + for _, val := range vals { + usedIsGood := true + switch val { + case model.IPNotUsed: + case model.IPUsed: + case model.IPDisabled: + default: + usedIsGood = false + } + if !usedIsGood { + errs.Add([]string{"is_used"}, binding.RequiredError, fmt.Sprintf("is_used只能为 %s", + "yes-是; no-否; disabled-不可用")) + return errs + } + } + } + + //校验scope + if reqData.Scope != "" { + switch reqData.Scope { + case model.IPScopeIntranet: + case model.IPScopeExtranet: + default: + errs.Add([]string{"scope"}, binding.RequiredError, fmt.Sprintf("scope %s", + "intranet-内网/extranet-外网")) + return errs + } + } + //SN校验 TODO + return errs +} + +// GetIPSPage 按条件查询业务网段分页列表 +func GetIPSPage(log logger.Logger, repo model.Repo, reqData *GetIPSPageReq) (pg *page.Page, err error) { + if reqData.PageSize <= 0 || reqData.PageSize > 100 { + reqData.PageSize = 10 + } + if reqData.Page < 0 { + reqData.Page = 0 + } + + cond := model.IPPageCond{ + IPNetworkID: strings2.Multi2UintSlice(reqData.IPNetworkID), + CIDR: reqData.CIDR, + IP: reqData.IP, + Category: reqData.Category, + IsUsed: reqData.IsUsed, + SN: reqData.SN, + FixedAssetNumber: reqData.FixedAssetNumber, + Scope: &reqData.Scope, + } + + totalRecords, err := repo.CountIPs(&cond) + if err != nil { + return nil, err + } + + pager := page.NewPager(reflect.TypeOf(&IPSPage{}), reqData.Page, reqData.PageSize, totalRecords) + items, err := repo.GetIPs(&cond, model.OneOrderBy("id", model.DESC), pager.BuildLimiter()) + if err != nil { + return nil, err + } + + for i := range items { + ipnp, err := convert2IPS(items[i], repo) + if err != nil { + return nil, err + } + if ipnp != nil { + pager.AddRecords(ipnp) + } + } + return pager.BuildPage(), nil +} + +//GetExportIP 获取导出IP列表 +func GetExportIP(log logger.Logger, repo model.Repo, conf *config.Config, reqData *GetIPSPageReq) (ips []*IPSPage, err error) { + cond := model.IPPageCond{ + ID: strings2.Multi2UintSlice(reqData.ID), + IPNetworkID: strings2.Multi2UintSlice(reqData.IPNetworkID), + CIDR: reqData.CIDR, + IP: reqData.IP, + Category: reqData.Category, + IsUsed: reqData.IsUsed, + SN: reqData.SN, + FixedAssetNumber: reqData.FixedAssetNumber, + Scope: &reqData.Scope, + } + + items, err := repo.GetIPs(&cond, model.OneOrderBy("id", model.DESC), nil) + if err != nil { + return nil, err + } + ips = make([]*IPSPage, 0, len(items)) + for i := range items { + item, err := convert2IPExport(items[i], repo) + if err != nil { + log.Error(err) + } + ips = append(ips, item) + } + return +} + +// convert2IPS 将model层的业务网段对象转化成service层的业务网段对象 +func convert2IPS(src *model.IPCombined, repo model.Repo) (*IPSPage, error) { + if src == nil { + return nil, nil + } + + ipsp := &IPSPage{ + ID: int(src.ID), + IP: src.IP.IP, + Category: src.Category, + IsUsed: src.IsUsed, + SN: src.SN, + FixedAssetNumber: src.FixedAssetNumber, + CreatedAt: times.ISOTime(src.CreatedAt), + UpdatedAt: times.ISOTime(src.UpdatedAt), + } + if src.Scope != nil { + ipsp.Scope = *src.Scope + } + if src.Remark != nil && src.IsUsed == model.IPDisabled { + ipsp.FixedAssetNumber = *src.Remark + } + ipn, err := repo.GetIPNetworkByID(src.IPNetworkID) + if err != nil && err != gorm.ErrRecordNotFound { + return nil, err + } + + if ipn != nil { + ipsp.IPNetwork = IPNetworkForIPSPage{ + ID: int(ipn.ID), + CIDR: ipn.CIDR, + Netmask: ipn.Netmask, + Gateway: ipn.Gateway, + Category: ipn.Category, + Version: ipn.Version, + } + } + + return ipsp, nil +} + +// convert2IPExport 将model层的业务网段对象转化成excel导出详细内容 +func convert2IPExport(src *model.IPCombined, repo model.Repo) (*IPSPage, error) { + if src == nil { + return nil, nil + } + + IPNetworkCategoryMap := map[string]string { + "ilo": "服务器ILO", + "tgw_intranet": "服务器TGW内网", + "tgw_extranet": "服务器TGW外网", + "intranet": "服务器普通内网", + "extranet": "服务器普通外网", + "v_intranet": "服务器虚拟化内网", + "v_extranet": "服务器虚拟化外网", + } + IPCategoryMap := map[string]string { + "pxe": "PXE IP", + "business": "业务 IP", + } + YesNoMap := map[string]string { + "yes": "是", + "no": "否", + "disabled": "不可用", + } + IPScopeMap := map[string]string { + "intranet": "内网(LA)", + "extranet": "外网(WA)", + } + + ipsp := &IPSPage{ + ID: int(src.ID), + IP: src.IP.IP, + Category: IPCategoryMap[src.Category], + IsUsed: YesNoMap[src.IsUsed], + SN: src.SN, + FixedAssetNumber: src.FixedAssetNumber, + CreatedAt: times.ISOTime(src.CreatedAt), + UpdatedAt: times.ISOTime(src.UpdatedAt), + } + if src.Scope != nil { + ipsp.Scope = IPScopeMap[*src.Scope] + } + if src.Remark != nil && src.IsUsed == model.IPDisabled { + ipsp.FixedAssetNumber = *src.Remark + } + ipn, err := repo.GetIPNetworkByID(src.IPNetworkID) + if err != nil && err != gorm.ErrRecordNotFound { + return nil, err + } + + if ipn != nil { + ipsp.IPNetwork = IPNetworkForIPSPage{ + ID: int(ipn.ID), + CIDR: ipn.CIDR, + Netmask: ipn.Netmask, + Gateway: ipn.Gateway, + Category: IPNetworkCategoryMap[ipn.Category], + Version: ipn.Version, + } + } + + return ipsp, nil +} + +// AssignIPReq 手动分配IP请求结构 +type AssignIPReq struct { + //(required)IP的ID + ID int `json:"id"` + //(required): 设备序列号 + SN string `json:"sn"` + //(required): IP种类("extranet"/"intranet") + Scope string `json:"scope"` + + NetworkID uint `json:"-"` + IP string `json:"-"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *AssignIPReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.SN: "sn", + &reqData.ID: "id", + &reqData.Scope: "scope", + } +} + +// Validate 结构体数据校验 +func (reqData *AssignIPReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + log, _ := middleware.LoggerFromContext(req.Context()) + log.Debugf("id: %v, sn: %v, scope: %v\n", reqData.ID, reqData.SN, reqData.Scope) + // 基本参数必要性检查 + if reqData.ID <= 0 { + errs.Add([]string{"IP"}, binding.RequiredError, "必须指定IP的ID") + return errs + } + if reqData.SN == "" { + errs.Add([]string{"SN"}, binding.RequiredError, "必须指定物理机序列号") + return errs + } + if reqData.Scope == "" { + errs.Add([]string{"scope"}, binding.RequiredError, fmt.Sprintf("scope只能为: %s", + "intranet-内网/extranet-外网")) + return errs + } + + //校验scope + if reqData.Scope != "" { + switch reqData.Scope { + case model.IPScopeIntranet: + case model.IPScopeExtranet: + default: + errs.Add([]string{"scope"}, binding.BusinessError, fmt.Sprintf("scope只能为: %s", + "intranet-内网/extranet-外网")) + return errs + } + } + + // 判断IP有效性 + ip, err := repo.GetIPByID(uint(reqData.ID)) + if gorm.IsRecordNotFoundError(err) || ip == nil { + errs.Add([]string{"ip"}, binding.BusinessError, "指定的ip不存在,请刷新页面后重新尝试") + return errs + } + if err != nil { + errs.Add([]string{"ip"}, binding.SystemError, "系统内部错误") + return errs + } + if ip.IsUsed == model.IPUsed { + errs.Add([]string{"ip"}, binding.BusinessError, fmt.Sprintf("ip(%s)已经被设备(%s)占用", reqData.IP, ip.SN)) + return errs + } + if ip.IsUsed == model.IPDisabled { + errs.Add([]string{"ip"}, binding.BusinessError, fmt.Sprintf("ip(%s)不可用(disabled)", reqData.IP)) + return errs + } + reqData.NetworkID = ip.IPNetworkID + reqData.IP = ip.IP + + ipn, err := repo.GetIPNetworkByID(reqData.NetworkID) + if gorm.IsRecordNotFoundError(err) || ip == nil { + errs.Add([]string{"ipnetwork"}, binding.BusinessError, "指定的ip所在的网段存不存在,请刷新页面后重新尝试") + return errs + } + if err != nil { + errs.Add([]string{"ipnetwork"}, binding.SystemError, "系统内部错误") + return errs + } + + if strings.Contains(ipn.Category, model.IPScopeIntranet) { + if reqData.Scope != model.IPScopeIntranet { + errs.Add([]string{"SN"}, binding.BusinessError, "内网IP无法作为外网IP分配") + return errs + } + } + if strings.Contains(ipn.Category, model.IPScopeExtranet) { + if reqData.Scope != model.IPScopeExtranet { + errs.Add([]string{"SN"}, binding.BusinessError, "外网IP无法作为内网IP分配") + return errs + } + } + + // 判断物理机是否存在 + dev, err := repo.GetDeviceBySN(reqData.SN) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"SN"}, binding.BusinessError, fmt.Sprintf("物理机(%s)不存在,请录入", reqData.SN)) + return errs + } + if dev.OperationStatus == model.DevOperStatInStore { + errs.Add([]string{"SN"}, binding.BusinessError, fmt.Sprintf("%s物理机(%s)不允许直接分配IP", + OperationStatusTransfer(dev.OperationStatus, true), reqData.SN)) + return errs + } + + if err != nil { + errs.Add([]string{"sns"}, binding.SystemError, "系统内部错误") + return errs + } + + // 校验网段是否一致 + if reqData.Scope == model.IPScopeIntranet { + intranet, err := repo.GetIntranetIPNetworksBySN(reqData.SN) + if gorm.IsRecordNotFoundError(err) || intranet == nil { + errs.Add([]string{"ip_network"}, binding.BusinessError, fmt.Sprintf("物理机(%s)关联的网段存在问题(请检查对应的网络设备与网段信息是否匹配)", reqData.SN)) + return errs + } + if err != nil { + errs.Add([]string{"ip"}, binding.SystemError, "系统内部错误") + return errs + } + isError := true + for k := range intranet { + if intranet[k].Category == model.VIntranet || intranet[k].Category == model.VExtranet || intranet[k].Category == model.ILO { + continue + } + if ip.IPNetworkID == intranet[k].ID { + isError = false + } + } + if isError { + errs.Add([]string{"ip_network"}, binding.BusinessError, fmt.Sprintf("物理机(%s)所在的内网网段与指定IP(%s)所在内网网段不一致", reqData.SN, ip.IP)) + return errs + } + } + + if reqData.Scope == model.IPScopeExtranet { + extranet, err := repo.GetExtranetIPNetworksBySN(reqData.SN) + if gorm.IsRecordNotFoundError(err) || extranet == nil { + errs.Add([]string{"ip_network"}, binding.BusinessError, fmt.Sprintf("物理机(%s)关联的网段存在问题(请检查对应的网络设备与网段信息是否匹配)", reqData.SN)) + return errs + } + if err != nil { + errs.Add([]string{"ip"}, binding.SystemError, "系统内部错误") + return errs + } + isError := true + for k := range extranet { + if extranet[k].Category == model.VIntranet || extranet[k].Category == model.VExtranet || extranet[k].Category == model.ILO { + continue + } + if ip.IPNetworkID == extranet[k].ID { + isError = false + } + } + if isError { + errs.Add([]string{"ip"}, binding.BusinessError, fmt.Sprintf("物理机(%s)所在的外网网段与指定IP(%s)所在外网网段不一致", reqData.SN, ip.IP)) + return errs + } + } + + return errs +} + +// AssignIP 手动分配IP +func AssignIP(log logger.Logger, repo model.Repo, reqData *AssignIPReq) (err error) { + //先ping检查,如果IP可以ping通,则失败 + if err = ping.PingTest(reqData.IP); err == nil { + return fmt.Errorf("IP:%s连通性(ping)测试失败", reqData.IP) + } + + //var ds model.DeviceSetting + ds, err := repo.GetDeviceSettingBySN(reqData.SN) + if ds == nil { + ds = &model.DeviceSetting{ + SN: reqData.SN, + NeedExtranetIP: model.NO, + NeedIntranetIPv6: model.NO, //默认仅分配IPV4 + NeedExtranetIPv6: model.NO, //默认仅分配IPV4 + InstallType: model.InstallationPXE, //这个值固定 + Status: model.InstallStatusSucc, //这个值固定 + } + } + //ds.SN = reqData.SN + if reqData.Scope == model.IPScopeIntranet { + //关联的网段唯一 + ds.IntranetIPNetworkID = reqData.NetworkID + ds.IntranetIP = addIP(ds.IntranetIP, reqData.IP) + } else if reqData.Scope == model.IPScopeExtranet { + ds.ExtranetIPNetworkID = reqData.NetworkID + ds.ExtranetIP = addIP(ds.ExtranetIP, reqData.IP) + ds.NeedExtranetIP = model.YES + } + err = repo.SaveDeviceSetting(ds) + if err != nil { + log.Error(err) + return err + } + + //顺序放到最后,前面都成功了才占用 + err = repo.AssignIP(reqData.SN, reqData.Scope, uint(reqData.ID)) + if err != nil { + log.Error(err) + return err + } + + return nil +} + +//在IP字段中追加一个IP,以逗号分隔 +func addIP(oriIP, newIP string) string { + ips := strings.Split(oriIP, commaSep) + if len(ips) == 1 && ips[0] == "" { + return newIP + } + ips = append(ips, newIP) + return strings.Join(ips, commaSep) +} + +//在IP字段中删除一个IP,比如某个IP被释放了 +func removeIP(oriIP, delIP string) string { + ips := strings.Split(oriIP, ",") + newList := make([]string, 0, len(ips)) + for _, ip := range ips { + if ip != delIP { + newList = append(newList, ip) + } + } + if len(newList) == 0 { + return "" + } + return strings.Join(newList, ",") +} + +type DisableIPReq struct { + // IP的ID列表。 + IDs []uint `json:"ids"` + Remark string `json:"remark"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *DisableIPReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDs: "ids", + } +} + +// Validate 结构体数据校验 +func (reqData *DisableIPReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + // 基本参数必要性检查 + if len(reqData.IDs) <= 0 { + errs.Add([]string{"IP"}, binding.RequiredError, "必须指定IP的有效ID") + return errs + } + + repo, _ := middleware.RepoFromContext(req.Context()) + + // 判断IP有效性 + for _, id := range reqData.IDs { + ip, err := repo.GetIPByID(uint(id)) + if gorm.IsRecordNotFoundError(err) || ip == nil { + errs.Add([]string{"ip"}, binding.BusinessError, fmt.Sprintf("ip(id:%d)不存在", id)) + return errs + } + if ip.IsUsed == model.IPUsed { + errs.Add([]string{"ip"}, binding.BusinessError, fmt.Sprintf("ip(%s)已分配,请先释放", ip.IP)) + return errs + } + } + return nil +} + +// DisableIP 手动禁用IP +func DisableIP(log logger.Logger, repo model.Repo, reqData *DisableIPReq) (err error) { + for _, id := range reqData.IDs { + ip, err := repo.GetIPByID(uint(id)) + if gorm.IsRecordNotFoundError(err) || ip == nil { + return err + } + ip.IsUsed = model.IPDisabled + ip.Remark = &reqData.Remark + if affected, err := repo.SaveIP(ip); err != nil || affected == 0 { + log.Error(err) + return err + } + } + return nil +} + +// UnassignIPReq 手动取消分配IP请求结构 +type UnassignIPReq struct { + // IP的ID。 + ID int `json:"id"` + + NetworkID uint `json:"-"` + IP string `json:"-"` + Scope string `json:"-"` + SN string `json:"-"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *UnassignIPReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.ID: "id", + } +} + +// Validate 结构体数据校验 +func (reqData *UnassignIPReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + // 基本参数必要性检查 + if reqData.ID <= 0 { + errs.Add([]string{"IP"}, binding.RequiredError, "必须指定IP的有效ID") + return errs + } + + repo, _ := middleware.RepoFromContext(req.Context()) + + // 判断IP有效性 + ip, err := repo.GetIPByID(uint(reqData.ID)) + if gorm.IsRecordNotFoundError(err) || ip == nil { + errs.Add([]string{"ip"}, binding.BusinessError, fmt.Sprintf("ip(%d)不存在", reqData.ID)) + return errs + } + if err != nil { + errs.Add([]string{"ip"}, binding.SystemError, "系统内部错误") + return errs + } + if ip.IsUsed != model.IPUsed { + errs.Add([]string{"ip"}, binding.BusinessError, fmt.Sprintf("ip(%d)未被占用,无需释放", reqData.ID)) + return errs + } + reqData.NetworkID = ip.IPNetworkID + reqData.IP = ip.IP + + if ip.Scope != nil { + reqData.Scope = *ip.Scope + } + reqData.SN = ip.SN + + dev, _ := repo.GetDeviceSettingBySN(reqData.SN) + if dev == nil { + reqData.SN = "" + } + return errs +} + +// UnassignIP 手动取消分配IP +func UnassignIP(log logger.Logger, repo model.Repo, reqData *UnassignIPReq) (err error) { + err = repo.UnassignIP(uint(reqData.ID)) + if err != nil { + log.Error(err) + return err + } + // 如果物理机没有配置装机参数,手动取消分配,不需要修改 + if reqData.SN != "" { + ipn, err := repo.GetIPNetworkByID(uint(reqData.NetworkID)) + log.Debugf("UnassignIP of IPNetwork:%+v", ipn) + ds, err := repo.GetDeviceSettingBySN(reqData.SN) + if err != nil { + log.Error(err) + return err + } + ds.SN = reqData.SN + if reqData.Scope == model.IPScopeIntranet { + if ipn.Version == model.IPv4 { + log.Debugf("Removing %s from %s", reqData.IP, ds.IntranetIP) + ds.IntranetIP = removeIP(ds.IntranetIP, reqData.IP) + } else { + log.Debugf("Removing %s from %s", reqData.IP, ds.IntranetIPv6) + ds.IntranetIPv6 = removeIP(ds.IntranetIPv6, reqData.IP) + } + } + if reqData.Scope == model.IPScopeExtranet { + if ipn.Version == model.IPv4 { + log.Debugf("Removing %s from %s", reqData.IP, ds.ExtranetIP) + ds.ExtranetIP = removeIP(ds.ExtranetIP, reqData.IP) + } else { + log.Debugf("Removing %s from %s", reqData.IP, ds.ExtranetIPv6) + ds.ExtranetIPv6 = removeIP(ds.ExtranetIPv6, reqData.IP) + } + } + _, err = repo.UpdateDeviceSettingBySN(ds) + if err != nil { + log.Error(err) + return err + } + } + return nil +} + +//ImportIPNetworksReq 设备导入Excel表对应字段 +type ImportIPNetworksReq struct { + IDCID uint + ServerRoomID uint `json:"server_room_id"` + ServerRoomName string `json:"server_room_name"` + //网段ID + ID uint `json:"id"` + //CIDR网段 + CIDR string `json:"cidr"` + //网段类别(ilo-服务器ILO; tgw_intranet-服务器TGW内网; tgw_extranet-服务器TGW外网; intranet-服务器普通内网; extranet-服务器普通外网; v_intranet-服务器虚拟化内网;) + Category string `json:"category"` + //掩码 + Netmask string `json:"netmask"` + //网关 + Gateway string `json:"gateway"` + //业务IP资源池 + IPPool string `json:"ip_pool"` + //带外IP资源池 + PXEPool string `json:"pxe_pool"` + //交换机设备 + Switchs string `json:"switchs"` + //vlan + Vlan string `json:"vlan"` + //IP版本 + Version string `json:"version"` + ErrMsgContent string +} + +//checkLength 对导入文件中的数据做字段长度校验 +func (impDevReq *ImportIPNetworksReq) checkLength() { + leg := len(impDevReq.ServerRoomName) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:机房管理单元长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.CIDR) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:网段(CIDR)长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.Category) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:类型长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.Netmask) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:掩码长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.Gateway) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:默认网关长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.IPPool) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:IP池长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.Switchs) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:覆盖交换机长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.Version) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:IP版本长度为(%d)(不能为空,不能大于255)", leg) + } +} + +//validate 对导入文件中的数据做基本验证 +func (impDevReq *ImportIPNetworksReq) validate(repo model.Repo) error { + //机房校验 + srs, err := repo.GetServerRoomByName(impDevReq.ServerRoomName) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if err == gorm.ErrRecordNotFound || srs == nil { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("机房名(%s)不存在", impDevReq.ServerRoomName) + } else { + impDevReq.ServerRoomID = srs.ID + impDevReq.IDCID = srs.IDCID + } + // CIDR网段校验 + if strings.Index(impDevReq.CIDR, "/") == -1 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("CIDR:%s格式错误", impDevReq.CIDR) + } else { + if n, err := repo.GetIPNetworks(&model.IPNetworkCond{CIDR: impDevReq.CIDR}, nil, nil); err != nil && err != gorm.ErrRecordNotFound { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("查询CIDR:%s错误", impDevReq.CIDR) + } else if len(n) > 0 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("网段:%s已存在", impDevReq.CIDR) + } + } + // 网段类别校验 + if IPTypeTransate(impDevReq.Category, false) == "" { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("网段类型:%s不合法", impDevReq.Category) + } + if err := checkSwitches(strings2.MultiLines2Slice(impDevReq.Switchs), repo); err != nil { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + err.Error() + } + //TODO + return nil +} + +//ImportIPNetworksPreview 导入预览 +func ImportIPNetworksPreview(log logger.Logger, repo model.Repo, reqData *ImportPreviewReq) (map[string]interface{}, error) { + ra, err := utils.ParseDataFromXLSX(upload.UploadDir + reqData.FileName) + if err != nil { + return nil, err + } + length := len(ra) + + var success []*ImportIPNetworksReq + var failure []*ImportIPNetworksReq + var errContent []string + + for i := 1; i < length; i++ { + row := &ImportIPNetworksReq{} + if len(ra[i]) < 10 { + var br string + if row.ErrMsgContent != "" { + br = "<br />" + } + row.ErrMsgContent += br + "导入文件列长度应为10列" + failure = append(failure, row) + continue + } + row.ServerRoomName = ra[i][0] + row.CIDR = ra[i][1] + row.Category = ra[i][2] + row.Netmask = ra[i][3] + row.Gateway = ra[i][4] + row.IPPool = ra[i][5] + row.PXEPool = ra[i][6] + row.Switchs = ra[i][7] + row.Vlan = ra[i][8] + row.Version = ra[i][9] + + utils.StructTrimSpace(row) + + //字段存在性校验 + row.checkLength() + + //数据有效性校验 + err := row.validate(repo) + if err != nil { + return nil, err + } + + row.Category = IPTypeTransate(row.Category, false) + + if row.ErrMsgContent != "" { + failure = append(failure, row) + errContent = append(errContent, row.ErrMsgContent) + } else { + success = append(success, row) + } + } + + var data []*ImportIPNetworksReq + if len(failure) > 0 { + data = failure + } else { + data = success + } + var result []*ImportIPNetworksReq + for i := 0; i < len(data); i++ { + if uint(i) >= reqData.Offset && uint(i) < (reqData.Offset+reqData.Limit) { + result = append(result, data[i]) + } + } + if len(errContent) > 0 { + _ = os.Remove(upload.UploadDir + reqData.FileName) + return map[string]interface{}{"status": "failure", + "message": strings.Join(errContent, "\n"), + "total_records": len(errContent), + "content": result, + }, nil + } + return map[string]interface{}{"status": "success", + "message": "操作成功", + "import_status": true, + "total_records": len(data), + "content": result, + }, nil +} + +// ImportIPNetworks 将设备放到数据库 +func ImportIPNetworks(log logger.Logger, repo model.Repo, conf *config.Config, reqData *ImportPreviewReq) error { + fileName := upload.UploadDir + reqData.FileName + ra, err := utils.ParseDataFromXLSX(fileName) + if err != nil { + return err + } + //把临时文件删了 + err = os.Remove(fileName) + if err != nil { + log.Warnf("ImportIPNetworks - remove tmp file: %s fail", fileName) + return err + } + length := len(ra) + + for i := 1; i < length; i++ { + row := &ImportIPNetworksReq{ + ServerRoomName: ra[i][0], + CIDR: ra[i][1], + Category: ra[i][2], + Netmask: ra[i][3], + Gateway: ra[i][4], + IPPool: ra[i][5], + PXEPool: ra[i][6], + Switchs: ra[i][7], + Vlan: ra[i][8], + Version: ra[i][9], + } + if len(ra[i]) < 9 { + continue + } + + //处理所有字段的多余空格字符 + utils.StructTrimSpace(row) + + //必填项校验 + row.checkLength() + + //机房和网络区域校验 + err := row.validate(repo) + if err != nil { + return err + } + sws := strings2.MultiLines2Slice(row.Switchs) + swByte, err := json.Marshal(sws) + if err != nil { + log.Error("json marshal switches:%v err", row.Switchs) + } + ipnet := &model.IPNetwork{ + IDCID: row.IDCID, + ServerRoomID: row.ServerRoomID, + Category: IPTypeTransate(row.Category, false), + CIDR: row.CIDR, + Netmask: row.Netmask, + Gateway: row.Gateway, + IPPool: row.IPPool, + PXEPool: row.PXEPool, + Switches: string(swByte), + Vlan: row.Vlan, + Version: row.Version, + } + + //插入或者更新 + if _, err = repo.SaveIPNetwork(ipnet); err != nil { + return err + } + + } + + return nil +} + +func checkSwitches(sws []string, repo model.Repo) error { + cond := &model.NetworkDeviceCond{ + FixedAssetNumber: strings.Join(sws, ","), + } + + res, _ := repo.GetNetworkDevicesByCond(cond, model.OrderBy{}, nil) + if len(res) == len(sws) { + return nil + } + var errSn []string + + for i := range sws { + errSn = append(errSn, sws[i]) + for j := range res { + if res[j].SN != sws[i] { + continue + } + errSn = errSn[:len(errSn)-1] + break + } + } + if len(errSn) > 0 { + return fmt.Errorf("交换机【%s】不存在,请检查数据或格式是否正确", strings.Join(errSn, ",")) + } + return nil +} + +// IPTypeTransate 网段类型的中英文翻译(Ch-> En by default) +func IPTypeTransate(status string, reverse bool) string { + mStatus := map[string]string{ + "服务器ILO": "ilo", + "服务器TGW内网": "tgw_intranet", + "服务器TGW外网": "tgw_extranet", + "服务器普通内网": "intranet", + "服务器普通外网": "extranet", + "服务器虚拟化内网": "v_intranet", + "服务器虚拟化外网": "v_extranet", + } + if !reverse { + if val, ok := mStatus[status]; ok { + return val + } + } else { + for key, val := range mStatus { + if val == status { + return key + } + } + } + return "" +} + + +// AssignIPv6Req 手动分配IPv6请求结构 +type AssignIPv6Req struct { + //(required): 设备序列号 + SN string `json:"sn"` + //(required): IP种类("extranet"/"intranet") + Scope string `json:"scope"` +} + + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *AssignIPv6Req) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.SN: "sn", + &reqData.Scope: "scope", + } +} + +// Validate 结构体数据校验 +func (reqData *AssignIPv6Req) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + log, _ := middleware.LoggerFromContext(req.Context()) + log.Debugf("sn: %v, scope: %v\n", reqData.SN, reqData.Scope) + // 基本参数必要性检查 + if reqData.SN == "" { + errs.Add([]string{"SN"}, binding.RequiredError, "必须指定物理机序列号") + return errs + } + if reqData.Scope == "" { + errs.Add([]string{"scope"}, binding.RequiredError, fmt.Sprintf("scope只能为: %s", + "intranet-内网/extranet-外网")) + return errs + } + + //校验scope + if reqData.Scope != "" { + switch reqData.Scope { + case model.IPScopeIntranet: + case model.IPScopeExtranet: + default: + errs.Add([]string{"scope"}, binding.BusinessError, fmt.Sprintf("scope只能为: %s", + "intranet-内网/extranet-外网")) + return errs + } + } + + // 判断物理机是否存在 + dev, err := repo.GetDeviceBySN(reqData.SN) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"SN"}, binding.BusinessError, fmt.Sprintf("物理机(%s)不存在,请录入", reqData.SN)) + return errs + } + if dev.OperationStatus == model.DevOperStatInStore { + errs.Add([]string{"SN"}, binding.BusinessError, fmt.Sprintf("%s物理机(%s)不允许直接分配IP", + OperationStatusTransfer(dev.OperationStatus, true), reqData.SN)) + return errs + } + + if err != nil { + errs.Add([]string{"sns"}, binding.SystemError, "系统内部错误") + return errs + } + + // 校验网段是否一致 + if reqData.Scope == model.IPScopeIntranet { + intranet, err := repo.GetIntranetIPNetworksBySN(reqData.SN) + if gorm.IsRecordNotFoundError(err) || intranet == nil { + errs.Add([]string{"ip_network"}, binding.BusinessError, fmt.Sprintf("物理机(%s)关联的网段存在问题(请检查对应的网络设备与网段信息是否匹配)", reqData.SN)) + return errs + } + if err != nil { + errs.Add([]string{"ip"}, binding.SystemError, "系统内部错误") + return errs + } + isError := true + for k := range intranet { + if intranet[k].Category == model.VIntranet || intranet[k].Category == model.VExtranet || intranet[k].Category == model.ILO { + continue + } + if intranet[k].Version == model.IPv6 { + isError = false + } + } + if isError { + errs.Add([]string{"ip_network"}, binding.BusinessError, fmt.Sprintf("物理机(%s)关联的内网IPv6网段不存在", reqData.SN)) + return errs + } + } + + if reqData.Scope == model.IPScopeExtranet { + extranet, err := repo.GetExtranetIPNetworksBySN(reqData.SN) + if gorm.IsRecordNotFoundError(err) || extranet == nil { + errs.Add([]string{"ip_network"}, binding.BusinessError, fmt.Sprintf("物理机(%s)关联的网段存在问题(请检查对应的网络设备与网段信息是否匹配)", reqData.SN)) + return errs + } + if err != nil { + errs.Add([]string{"ip"}, binding.SystemError, "系统内部错误") + return errs + } + isError := true + for k := range extranet { + if extranet[k].Category == model.VIntranet || extranet[k].Category == model.VExtranet || extranet[k].Category == model.ILO { + continue + } + if extranet[k].Version == model.IPv6 { + isError = false + } + } + if isError { + errs.Add([]string{"ip"}, binding.BusinessError, fmt.Sprintf("物理机(%s)关联的外网IPv6网段不存在", reqData.SN)) + return errs + } + } + + return errs +} + + +// AssignIPv6 手动分配IPv6(根据选定的设备以及网段,自动计算并分配一个IPv6) +func AssignIPv6(log logger.Logger, repo model.Repo, reqData *AssignIPv6Req) (err error) { + // 计算并分配一个ipv6 + var ipv6Assign *model.IP + if ipnetwork, err := repo.GetIPv6NetworkBySN(reqData.SN, reqData.Scope); err != nil { + log.Error(err) + return err + } else { + log.Debugf("GetIPv6NetworkBySN ipv6:%+v", ipnetwork) + var scope string + if strings.Contains(ipnetwork.Category, "intranet") { + scope = model.IPScopeIntranet + } else if strings.Contains(ipnetwork.Category, "extranet") { + scope = model.IPScopeExtranet + } + + // 根据网段ID获取可分配的空闲IPv6 + ipv6Assign, err = repo.GetAvailableIPByIPNetworkID(ipnetwork.ID) + if err != nil && !gorm.IsRecordNotFoundError(err) { + log.Error(err) + return err + } + log.Debugf("GetAvailableIPByIPNetworkID ipv6:%+v", ipv6Assign) + // 无空闲IPv6时,获取该网段最后一个IP并计算下一个IPv6地址 + if ipv6Assign == nil { + log.Debugf("No available IPv6 of CIDR: %s . Will generate one.", ipnetwork.CIDR) + if ipv6Last, err := repo.GetLastIPv6ByIPNetworkID(ipnetwork.ID);err != nil && !gorm.IsRecordNotFoundError(err){ + log.Error(err) + return err + } else if ipv6Last != nil { // 最后一个IP不为空则获取下一个 + log.Debugf("Last IPv6 of CIDR: %s is %+v", ipnetwork.CIDR, ipv6Last) + if ipv6Next, err := network.GetNextIPv6OfCIDR(ipv6Last.IP, ipnetwork.CIDR); err != nil { + log.Error(err) + return err + } else if ipv6Next != "" { + log.Debugf("Next IPv6 of CIDR: %s is %s", ipnetwork.CIDR, ipv6Next) + ipv6Assign = &model.IP { + IP: ipv6Next, + IPNetworkID: ipnetwork.ID, + Scope: &scope, + Category: model.BusinessIP, + IsUsed: model.IPNotUsed, + ReleaseDate: time.Now(), + } + err = repo.CreateIP(ipv6Assign) + if err != nil { + log.Error(err) + return err + } + } + } else { // 获取不到最后一个IP则当新网段分配处理 + log.Debugf("No IPv6 exist of CIDR: %s . Will generate one.", ipnetwork.CIDR) + if ipv6First, err := network.GetFirstIPv6OfCIDR(ipnetwork.CIDR); err != nil { + log.Error(err) + return err + } else if ipv6First != "" { + log.Debugf("New IPv6 of CIDR: %s is %s", ipnetwork.CIDR, ipv6First) + ipv6Assign = &model.IP { + IPNetworkID: ipnetwork.ID, + IP: ipv6First, + Scope: &scope, + Category: model.BusinessIP, + IsUsed: model.IPNotUsed, + ReleaseDate: time.Now(), + } + err = repo.CreateIP(ipv6Assign) + if err != nil { + log.Error(err) + return err + } + + } + } + } + } + + if ipv6Assign != nil { + log.Debugf("Get available ipv6:%+v", ipv6Assign) + } else { + log.Error("Failed to get available ipv6.exit.") + return errors.New("Failed to get available ipv6.") + } + + //var ds model.DeviceSetting + ds, err := repo.GetDeviceSettingBySN(reqData.SN) + if ds == nil { + ds = &model.DeviceSetting{ + SN: reqData.SN, + NeedExtranetIP: model.NO, + InstallType: model.InstallationPXE, + Status: model.InstallStatusSucc, + } + } + //ds.SN = reqData.SN + if reqData.Scope == model.IPScopeIntranet { + ds.IntranetIPv6NetworkID = ipv6Assign.IPNetworkID + ds.IntranetIPv6 = addIP(ds.IntranetIPv6, ipv6Assign.IP) + ds.NeedIntranetIPv6 = model.YES + } else if reqData.Scope == model.IPScopeExtranet { + ds.ExtranetIPv6NetworkID = ipv6Assign.IPNetworkID + ds.ExtranetIPv6 = addIP(ds.ExtranetIP, ipv6Assign.IP) + ds.NeedExtranetIPv6 = model.YES + } + err = repo.SaveDeviceSetting(ds) + if err != nil { + log.Error(err) + return err + } + + //顺序放到最后,前面都成功了才占用 + err = repo.AssignIPByIP(reqData.SN, reqData.Scope, ipv6Assign.IP) + if err != nil { + log.Error(err) + return err + } + + return nil +} + + +// AssignIPv4Req 手动为设备分配IPv4请求结构 +type AssignIPv4Req struct { + //(required): 设备序列号 + SN string `json:"sn"` + //(required): IP种类("extranet"/"intranet") + Scope string `json:"scope"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *AssignIPv4Req) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.SN: "sn", + &reqData.Scope: "scope", + } +} + +// Validate 结构体数据校验 +func (reqData *AssignIPv4Req) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + log, _ := middleware.LoggerFromContext(req.Context()) + log.Debugf("sn: %v, scope: %v\n", reqData.SN, reqData.Scope) + // 基本参数必要性检查 + if reqData.SN == "" { + errs.Add([]string{"SN"}, binding.RequiredError, "必须指定物理机序列号") + return errs + } + if reqData.Scope == "" { + errs.Add([]string{"scope"}, binding.RequiredError, fmt.Sprintf("scope只能为: %s", + "intranet-内网/extranet-外网")) + return errs + } + //校验scope + if reqData.Scope != "" { + switch reqData.Scope { + case model.IPScopeIntranet: + case model.IPScopeExtranet: + default: + errs.Add([]string{"scope"}, binding.BusinessError, fmt.Sprintf("scope只能为: %s", + "intranet-内网/extranet-外网")) + return errs + } + } + + // 判断物理机是否存在 + dev, err := repo.GetDeviceBySN(reqData.SN) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"SN"}, binding.BusinessError, fmt.Sprintf("物理机(%s)不存在,请录入", reqData.SN)) + return errs + } + if dev.OperationStatus == model.DevOperStatInStore { + errs.Add([]string{"SN"}, binding.BusinessError, fmt.Sprintf("%s物理机(%s)不允许直接分配IP", + OperationStatusTransfer(dev.OperationStatus, true), reqData.SN)) + return errs + } + + if err != nil { + errs.Add([]string{"sns"}, binding.SystemError, "系统内部错误") + return errs + } + + // 校验网段是否一致 + if reqData.Scope == model.IPScopeIntranet { + intranet, err := repo.GetIntranetIPNetworksBySN(reqData.SN) + if gorm.IsRecordNotFoundError(err) || intranet == nil { + errs.Add([]string{"ip_network"}, binding.BusinessError, fmt.Sprintf("物理机(%s)关联的网段存在问题(请检查对应的网络设备与网段信息是否匹配)", reqData.SN)) + return errs + } + if err != nil { + errs.Add([]string{"ip"}, binding.SystemError, "系统内部错误") + return errs + } + isError := true + for k := range intranet { + if intranet[k].Category == model.VIntranet || intranet[k].Category == model.VExtranet || intranet[k].Category == model.ILO { + continue + } + if intranet[k].Version == model.IPv4 { + isError = false + } + } + if isError { + errs.Add([]string{"ip_network"}, binding.BusinessError, fmt.Sprintf("物理机(%s)关联的内网IPv4网段不存在", reqData.SN)) + return errs + } + } + + if reqData.Scope == model.IPScopeExtranet { + extranet, err := repo.GetExtranetIPNetworksBySN(reqData.SN) + if gorm.IsRecordNotFoundError(err) || extranet == nil { + errs.Add([]string{"ip_network"}, binding.BusinessError, fmt.Sprintf("物理机(%s)关联的网段存在问题(请检查对应的网络设备与网段信息是否匹配)", reqData.SN)) + return errs + } + if err != nil { + errs.Add([]string{"ip"}, binding.SystemError, "系统内部错误") + return errs + } + isError := true + for k := range extranet { + if extranet[k].Category == model.VIntranet || extranet[k].Category == model.VExtranet || extranet[k].Category == model.ILO { + continue + } + if extranet[k].Version == model.IPv4 { + isError = false + } + } + if isError { + errs.Add([]string{"ip"}, binding.BusinessError, fmt.Sprintf("物理机(%s)关联的外网IPv4网段不存在", reqData.SN)) + return errs + } + } + + return errs +} + +// AssignIPv4 手动分配IPv4 +func AssignIPv4(log logger.Logger, repo model.Repo, reqData *AssignIPv4Req) (err error) { + var ipv4Assign *model.IP + //var ds model.DeviceSetting + ds, err := repo.GetDeviceSettingBySN(reqData.SN) + if ds == nil { + ds = &model.DeviceSetting{ + SN: reqData.SN, + NeedExtranetIP: model.NO, + NeedIntranetIPv6: model.NO, + NeedExtranetIPv6: model.NO, + InstallType: model.InstallationPXE, //这个值固定 + Status: model.InstallStatusSucc, //这个值固定 + } + } + // 获取SN对应的网段 + if reqData.Scope == model.IPScopeIntranet { + intranet, err := repo.GetIntranetIPNetworksBySN(reqData.SN) + if gorm.IsRecordNotFoundError(err) || intranet == nil { + log.Error(err) + return err + } + if err != nil { + log.Error(err) + return err + } + for k := range intranet { + if intranet[k].Category == model.Intranet && intranet[k].Version == model.IPv4 { + ipv4Assign, err = repo.GetAvailableIPByIPNetworkID(intranet[k].ID) + if err != nil && !gorm.IsRecordNotFoundError(err) { + log.Error(err) + return err + } + log.Debugf("GetAvailableIPByIPNetworkID Intranet ipv4:%+v", ipv4Assign) + break + } + } + } + if reqData.Scope == model.IPScopeExtranet { + extranet, err := repo.GetExtranetIPNetworksBySN(reqData.SN) + if gorm.IsRecordNotFoundError(err) || extranet == nil { + log.Error(err) + return err + } + if err != nil { + log.Error(err) + return err + } + for k := range extranet { + if extranet[k].Category == model.Extranet && extranet[k].Version == model.IPv4 { + ipv4Assign, err = repo.GetAvailableIPByIPNetworkID(extranet[k].ID) + if err != nil && !gorm.IsRecordNotFoundError(err) { + log.Error(err) + return err + } + log.Debugf("GetAvailableIPByIPNetworkID Extranet ipv4:%+v", ipv4Assign) + break + } + } + } + + //先ping检查,如果IP可以ping通,则失败 + if err = ping.PingTest(ipv4Assign.IP); err == nil { + return fmt.Errorf("IP:%s连通性(ping)测试失败", ipv4Assign.IP) + } + + //ds.SN = reqData.SN + if reqData.Scope == model.IPScopeIntranet { + //关联的网段唯一 + ds.IntranetIPNetworkID = ipv4Assign.IPNetworkID + ds.IntranetIP = addIP(ds.IntranetIP, ipv4Assign.IP) + } else if reqData.Scope == model.IPScopeExtranet { + ds.ExtranetIPNetworkID = ipv4Assign.IPNetworkID + ds.ExtranetIP = addIP(ds.ExtranetIP, ipv4Assign.IP) + ds.NeedExtranetIP = model.YES + } + err = repo.SaveDeviceSetting(ds) + if err != nil { + log.Error(err) + return err + } + + //顺序放到最后,前面都成功了才占用 + err = repo.AssignIP(reqData.SN, reqData.Scope, uint(ipv4Assign.ID)) + if err != nil { + log.Error(err) + return err + } + return nil +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/job.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/job.go new file mode 100644 index 0000000000000000000000000000000000000000..263c26ffac739e9b85f015822947591b4fca2cfb --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/job.go @@ -0,0 +1,365 @@ +package service + +import ( + "errors" + "fmt" + "net/http" + "reflect" + + "github.com/voidint/binding" + "github.com/voidint/page" + + "idcos.io/cloudboot/config" + "idcos.io/cloudboot/job" + "idcos.io/cloudboot/job/mysql" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils" + "idcos.io/cloudboot/utils/collection" + "idcos.io/cloudboot/utils/times" +) + +// Job 任务 +type Job struct { + ID string `json:"id"` // 任务ID(保证全局唯一) + Builtin string `json:"builtin"` // 是否是内建任务 + Title string `json:"title"` // 任务标题 + Category string `json:"category"` // 任务类型。可选值:inspection、installation_timeout、release_ip + Rate string `json:"rate"` // 任务执行频率。可选值:immediately-立刻执行; fixed_rate-固定频率(周期性)执行; + // - Full crontab specs, e.g. "* * * * * ?" + // - Descriptors, e.g. "@midnight", "@every 1h30m" + // Split on whitespace. We require 5 or 6 fields. + // (second) (minute) (hour) (day of month) (month) (day of week, optional) + Cron string `json:"cron"` // cron表达式。若为一次性任务,则该值为空。 + CronRender string `json:"cron_render"` // cron表达式UI渲染信息 + Target map[string][]string `json:"target"` // 任务作用目标。map中的value暂定为[]string,可能发生变化。 + Status string `json:"status"` // 任务状态。 + Creator struct { + ID string `json:"id"` + LoginName string `json:"login_name"` + Name string `json:"name"` + } `json:"creator"` // 任务创建者 + CreatedAt times.ISOTime `json:"created_at"` // 创建时间 + UpdatedAt times.ISOTime `json:"updated_at"` // 更新时间 +} + +// GetJobPageReq 查询满足条件的任务分页列表请求结构体 +type GetJobPageReq struct { + // 任务创建人ID + Creator string `json:"creator"` + // 标题(支持模糊查询) + Title string `json:"title"` + // 是否是内建任务。可选值: yes-是; no-否; + // Enum: yes,no + Builtin string `json:"builtin"` + // 类别。可选值: inspection-硬件巡检任务; installation_timeout-装机超时检查任务;release_ip-释放IP任务; + // Enum: inspection,installation_timeout,release_ip + Category string `json:"category"` + // 执行频率。可选值: immediately-立刻; fixed_rate-定时; + // Enum: immediately,fixed_rate + Rate string `json:"rate"` + // 状态。可选值: running-运行中; paused-已暂停; stoped-已停止; deleted-已删除; 支持多个值(用英文逗号分隔)组合过滤。 + // Enum: running,paused,stoped,deleted + Status string `json:"status"` + // 分页页号 + Page int64 `json:"page"` + // 分页大小 + PageSize int64 `json:"page_size"` + // 当前用户 + CurrentUser *model.CurrentUser `json:"-"` +} + +// FieldMap 请求字段映射 +func (reqData *GetJobPageReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.Creator: "creator", + &reqData.Title: "title", + &reqData.Builtin: "builtin", + &reqData.Category: "category", + &reqData.Rate: "rate", + &reqData.Status: "status", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + } +} + +// Validate 结构体数据校验 +func (reqData *GetJobPageReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + if reqData.Builtin != "" && + reqData.Builtin != job.Builtin && + reqData.Builtin != job.NoBuiltin { + errs.Add([]string{"builtin"}, binding.BusinessError, fmt.Sprintf("无效的字段值builtin=%s", reqData.Builtin)) + return errs + } + + if reqData.Category != "" && + reqData.Category != job.CategoryInspection && + reqData.Category != job.CategoryInstallationTime { + errs.Add([]string{"category"}, binding.BusinessError, fmt.Sprintf("无效的字段值category=%s", reqData.Category)) + return errs + } + + if reqData.Rate != "" && + reqData.Rate != job.RateFixedRate && + reqData.Rate != job.RateImmediately { + errs.Add([]string{"rate"}, binding.BusinessError, fmt.Sprintf("无效的字段值rate=%s", reqData.Rate)) + return errs + } + + if reqData.Status != "" && + reqData.Status != job.Running && + reqData.Status != job.Paused && + reqData.Status != job.Stoped && + reqData.Status != job.Deleted { + errs.Add([]string{"status"}, binding.BusinessError, fmt.Sprintf("无效的字段值status=%s", reqData.Status)) + return errs + } + + return errs +} + +// GetJobPage 返回满足过滤条件的任务分页列表 +func GetJobPage(log logger.Logger, conf *config.Config, jobmgr job.Manager, reqData *GetJobPageReq) (pg *page.Page, err error) { + if reqData.PageSize <= 0 { + reqData.PageSize = 10 + } + if reqData.PageSize > 100 { + reqData.PageSize = 100 + } + if reqData.Page < 0 { + reqData.Page = 0 + } + + if reqData.Status == "" { + reqData.Status = fmt.Sprintf("%s,%s,%s", job.Running, job.Stoped, job.Paused) // 默认不加载'已删除'状态的任务。 + } + + cond := job.Job{ + Builtin: reqData.Builtin, + Title: reqData.Title, + Category: reqData.Category, + Rate: reqData.Rate, + Status: reqData.Status, + Creator: reqData.Creator, + } + + totalRecords, items, err := jobmgr.GetJobs(&cond, reqData.Page, reqData.PageSize) + if err != nil { + return nil, err + } + + pager := page.NewPager(reflect.TypeOf(&Job{}), reqData.Page, reqData.PageSize, totalRecords) + for i := range items { + pager.AddRecords(convert2Job(log, conf, reqData.CurrentUser.Token, items[i])) + } + return pager.BuildPage(), nil +} + +// GetJobByIDReq 查询目标任务请求结构体 +type GetJobByIDReq struct { + ID string `json:"id"` + // 当前用户 + CurrentUser *model.CurrentUser `json:"-"` +} + +// GetJobByID 查询目标任务明细 +func GetJobByID(log logger.Logger, conf *config.Config, jobmgr job.Manager, reqData *GetJobByIDReq) (*Job, error) { + cjob, err := jobmgr.GetJobByID(reqData.ID) + if err != nil { + return nil, err + } + return convert2Job(log, conf, reqData.CurrentUser.Token, cjob), nil +} + +// convert2Job 将模型层的CombinedDevice转换成服务层的CombinedDevice。 +func convert2Job(log logger.Logger, conf *config.Config, token string, item *job.Job) *Job { + j := Job{ + ID: item.ID, + Builtin: item.Builtin, + Title: item.Title, + Category: item.Category, + Rate: item.Rate, + Cron: item.CronExpression, + CronRender: item.CronRender, + Target: item.Target, + Status: item.Status, + CreatedAt: times.ISOTime(item.CreatedAt), + UpdatedAt: times.ISOTime(item.UpdatedAt), + } + if u, _ := GetUserByID(log, conf, token, item.Creator); u != nil { + j.Creator.ID = u.ID + j.Creator.LoginName = u.LoginName + j.Creator.Name = u.Name + } + return &j + +} + +// PauseJob 暂停运行中的目标定时任务 +func PauseJob(jobmgr job.Manager, jobid string) (err error) { + return jobmgr.Pause(jobid) +} + +// UnpauseJob 继续已暂停的目标定时任务 +func UnpauseJob(jobmgr job.Manager, jobid string) (err error) { + return jobmgr.Unpause(jobid) +} + +// RemoveJob 删除非内置任务 +func RemoveJob(jobmgr job.Manager, jobid string) (err error) { + return jobmgr.Remove(jobid) +} + +// AddInspectionJobReq 新增硬件巡检任务请求结构体 +type AddInspectionJobReq struct { + // 源节点(分布式部署条件下) + OriginNode string `json:"-"` + // 任务创建者/操作人 + Creator string `json:"-"` + // 任务标题 + Title string `json:"title"` + // 目标设备 + SN []string `json:"sn"` + // 执行频率 + Rate string `json:"rate"` + // cron表达式 + Cron string `json:"cron"` + // cron表达式UI渲染信息 + CronRender string `json:"cron_render"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *AddInspectionJobReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.SN: "sn", + &reqData.Title: "title", + &reqData.Rate: "rate", + &reqData.Cron: "cron", + &reqData.CronRender: "cron_render", + } +} + +// Validate 结构体数据校验 +func (reqData *AddInspectionJobReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + + // 校验SN是否在库 + var cond model.Device + for _, sn := range reqData.SN { + cond.SN = sn + if count, _ := repo.CountDevices(&cond); count <= 0 { + errs.Add([]string{"sn"}, binding.BusinessError, fmt.Sprintf("设备(%s)不存在", sn)) + return errs + } + } + + if reqData.Rate == "" { + errs.Add([]string{"rate"}, binding.RequiredError, fmt.Sprintf("基本参数要求(巡检频率不能为空)")) + return errs + } + + if !collection.InSlice(reqData.Rate, []string{job.RateImmediately, job.RateFixedRate}) { + errs.Add([]string{"rate"}, binding.BusinessError, fmt.Sprintf("基本参数要求(巡检频率(%s)只能为:(%s/%s))", reqData.Rate, job.RateImmediately, job.RateFixedRate)) + return errs + } + + // 固定周期任务必须填写cron表达式 + if reqData.Rate == job.RateFixedRate && reqData.Cron == "" { + errs.Add([]string{"cron"}, binding.RequiredError, fmt.Sprintf("基本参数要求(固定周期情况下Cron不能为空)")) + return errs + } + + // TODO 校验cron表达式有效性 + return errs +} + +var ( + // ErrInspectionDevicesNotSpecified 未指定硬件巡检设备 + ErrInspectionDevicesNotSpecified = errors.New("inspection devices not specified") +) + +// AddInspectionJob 新增硬件巡检任务并返回任务ID +func AddInspectionJob(log logger.Logger, repo model.Repo, conf *config.Config, jobmgr job.Manager, reqData *AddInspectionJobReq) (jobid string, err error) { + // 若未指定SN列表,则获取历史已巡检的SN列表。 + //if len(reqData.SN) <= 0 { + // if reqData.SN, err = repo.GetInspectedSN(); err != nil { + // return "", err + // } + //} + //if len(reqData.SN) <= 0 { + // return "", ErrInspectionDevicesNotSpecified + //} + // 若未指定SN列表,则为空(实际巡检任务会全量巡检) + var target map[string][]string + if len(reqData.SN) > 0 { + targetPairs, err := getOriginNodeDevicesPairs(repo, reqData.SN...) + if err != nil { + return "", err + } + target = targetPairs + } + + if reqData.Rate == job.RateImmediately { + reqData.Cron = "" + } + + // 2、生成全局唯一的任务ID + jobid = utils.UUID() + + // 3、将任务提交至任务管理器 + if err = jobmgr.Submit(&job.Job{ + ID: jobid, + Creator: reqData.Creator, + Builtin: job.NoBuiltin, + Title: fmt.Sprintf("[硬件巡检]%s", reqData.Title), + Category: job.CategoryInspection, + Rate: reqData.Rate, + CronExpression: reqData.Cron, + CronRender: reqData.CronRender, + Target: target, + Status: job.Running, + CronJob: mysql.NewInspectionJob(log, repo, conf, jobid), + }); err != nil { + return "", err + } + return jobid, nil +} + +// getOriginNodeDevicesPairs 根据config文件 NODE IP 构成的键值对 +// 实现各机房管理单元NODE节点对应自身机房的SN,多个NODE节点时轮询分配 +func getOriginNodeDevicesPairs(repo model.Repo, sns ...string) (pairs map[string][]string, err error) { + pairs = make(map[string][]string) + var nodeIPs []string + var nodeIPLength int + for i, sn := range sns { + dev, err := repo.GetDeviceBySN(sn) + if err != nil { + return nil, err + } + // 忽略待退役、已退役设备 + if dev.OperationStatus == model.DevOperStatPreRetire || dev.OperationStatus == model.DevOperStatRetiring || dev.OperationStatus == model.DevOperStateRetired { + continue + } + + if dev.ServerRoomID != 0 { + if nodeIPLength = len(middleware.MapDistributeNode.MDistribute[dev.ServerRoomID]); nodeIPLength != 0 { + nodeIPs = middleware.MapDistributeNode.MDistribute[dev.ServerRoomID] + _, ok := pairs[nodeIPs[i%nodeIPLength]] + if !ok { + pairs[nodeIPs[i%nodeIPLength]] = []string{} + } + pairs[nodeIPs[i%nodeIPLength]] = append(pairs[nodeIPs[i%nodeIPLength]], dev.SN) + } else { + _, ok := pairs["master"] + if !ok { + pairs["master"] = []string{} + } + pairs["master"] = append(pairs["master"], dev.SN) + } + } + } + return pairs, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/limiter.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/limiter.go new file mode 100644 index 0000000000000000000000000000000000000000..860aa83959e456f7f64769810cfb38c92b70c25e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/limiter.go @@ -0,0 +1,127 @@ +package service + +import ( + "net/http" + + "github.com/voidint/binding" + + "idcos.io/cloudboot/config" + "idcos.io/cloudboot/limiter" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/model" +) + +// ReturnLimiterTokenBySNReq 归还限流器令牌请求结构体 +type ReturnLimiterTokenBySNReq struct { + SN string `json:"sn"` + Token limiter.Token `json:"-"` +} + +// FieldMap 请求字段映射 +func (reqData *ReturnLimiterTokenBySNReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.SN: "sn", + } +} + +// Validate 结构体数据校验 +func (reqData *ReturnLimiterTokenBySNReq) Validate(r *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(r.Context()) + token, _ := repo.GetTokenBySN(reqData.SN) + //if err == gorm.ErrRecordNotFound { + // errs.Add([]string{"sn"}, binding.BusinessError, "令牌已归还或未曾申请令牌") + // return errs + //} + //if err != nil { + // errs.Add([]string{"sn"}, binding.SystemError, "系统内部错误") + // return errs + //} + reqData.Token = limiter.Token(token) + return errs +} + +// ReturnLimiterTokenBySN 归还目标设备的限流器令牌 +func ReturnLimiterTokenBySN(log logger.Logger, repo model.Repo, lim limiter.Limiter, conf *config.Config, reqData *ReturnLimiterTokenBySNReq) (err error) { + log.Infof("The device(%s) attempts to return token", reqData.SN) + + //把机器关了 + o, err := BatchOperateOOBPower(log, repo, PowerOff, conf, false, []string{reqData.SN}) + if err != nil { + log.Errorf("power off device:%s fail,err:%v,stderr:%s", reqData.SN, err, string(o)) + //continue ? + } + if lim != nil { + bucket, err := lim.Route(reqData.SN) + if err != nil { + return err + } + return bucket.Return(reqData.SN, reqData.Token) + } + return err +} + +type ReturnLimiterTokensReq struct { + Tokens []*ReturnLimiterTokenBySNReq `json:"tokens"` +} + +// FieldMap 请求字段映射 +func (reqData *ReturnLimiterTokensReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.Tokens: "tokens", + } +} + +// Validate 结构体数据校验 +func (reqData *ReturnLimiterTokensReq) Validate(r *http.Request, errs binding.Errors) binding.Errors { + for _, t := range reqData.Tokens { + errs = t.Validate(r, errs) + if len(errs) != 0 { + return errs + } + } + return nil +} + +// ReturnLimiterToken 归还目标设备的限流器令牌 +func ReturnLimiterTokens(log logger.Logger, repo model.Repo, lim limiter.Limiter, conf *config.Config, reqData *ReturnLimiterTokensReq) (succeed int, err error) { + for _, t := range reqData.Tokens { + //log.Infof("The device(%s) attempts to return token", t.SN) + //isFailure := false //记录各操作是否有错误 + //if lim != nil { + // bucket, err := lim.Route(t.SN) + // if err != nil { + // log.Errorf("The device(%s) get token bucket fail,%v", t.SN, err) + // isFailure = true + // //continue + // } else if bucket != nil { + // if err = bucket.Return(t.SN, t.Token); err != nil { + // log.Errorf("The device(%s) return token fail,%v", t.SN, err) + // isFailure = true + // //continue + // } + // } + //} + // + ////把机器关了 + //o, errPwr := BatchOperateOOBPower(log, repo, PowerOff, conf, false, []string{t.SN}) + //if errPwr != nil { + // log.Errorf("power off device:%s fail,err:%v,stderr:%s", t.SN, errPwr, string(o)) + // isFailure = true + // continue + //} + //if isFailure == false { + // succeed++ + //} + + err := ReturnLimiterTokenBySN(log, repo, lim, conf, t) + if err != nil && err != limiter.ErrInvalidOrReturnedToken { + log.Error(err) + continue + } + succeed++ + } + return succeed, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/network_area.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/network_area.go new file mode 100644 index 0000000000000000000000000000000000000000..a1b0281abc709eda5ef7b8ba52a84d64ca3edfbc --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/network_area.go @@ -0,0 +1,622 @@ +package service + +import ( + "encoding/json" + "fmt" + "net/http" + "os" + "reflect" + "strings" + + "github.com/jinzhu/gorm" + "github.com/voidint/binding" + "github.com/voidint/page" + + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils" + "idcos.io/cloudboot/utils/collection" + strings2 "idcos.io/cloudboot/utils/strings" + "idcos.io/cloudboot/utils/times" + "idcos.io/cloudboot/utils/upload" +) + +// SaveNetworkAreaReq 保存网络区域请求结构体 +type SaveNetworkAreaReq struct { + IDCID uint `json:"-"` + // 所属机房ID + // Required: true + ServerRoomID uint `json:"server_room_id"` + // 网络区域ID。若id=0,则新增。若id>0,则修改。 + ID uint `json:"id"` + // 网络区域名称 + // Required: true + Name string `json:"name"` + // 关联物理区域 + // Required: true + PhysicalArea []string `json:"physical_area"` + // 状态。状态。nonproduction-未投产; production-已投产; offline-已下线(回收) + // Required: true + // Enum: nonproduction,production,offline + Status string `json:"status"` + // 用户登录名 + LoginName string `json:"-"` +} + +// FieldMap 请求字段映射 +func (reqData *SaveNetworkAreaReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.ServerRoomID: "server_room_id", + &reqData.ID: "id", + &reqData.Name: "name", + &reqData.PhysicalArea: "physical_area", + &reqData.Status: "status", + } +} + +// Validate 结构体数据校验 +func (reqData *SaveNetworkAreaReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + + if reqData.ServerRoomID == 0 { + errs.Add([]string{"server_room_id"}, binding.RequiredError, "机房管理单元ID不能为空") + return errs + } + // 校验指定数据中心下的指定机房是否真实存在 + room, err := repo.GetServerRoomByID(reqData.ServerRoomID) + if err == gorm.ErrRecordNotFound { + errs.Add([]string{"idc_id", "server_room_id"}, binding.BusinessError, "该机房管理单元不存在") + return errs + } + if err != nil { + errs.Add([]string{"idc_id", "server_room_id", "name"}, binding.SystemError, "系统内部错误") + return errs + } + reqData.IDCID = room.IDCID + + if reqData.Name == "" { + errs.Add([]string{"name"}, binding.RequiredError, "网络区域名称不能为空") + return errs + } + + cond := model.NetworkAreaCond{ + IDCID: []uint{reqData.IDCID}, + ServerRoomID: []uint{reqData.ServerRoomID}, + Name: reqData.Name, // 模糊匹配 + } + + items, err := repo.GetNetworkAreas(&cond, nil, nil) + if err != nil { + errs.Add([]string{"idc_id", "server_room_id", "name"}, binding.SystemError, "系统内部错误") + return errs + } + for _, item := range items { + if (reqData.ID == 0 && item.Name == reqData.Name) || // 新增时,网络区域名称不能重复。 + (reqData.ID > 0 && item.Name == reqData.Name && reqData.ID != item.ID) { // 更新时,网络区域名称不能重复(除了自身外)。 + errs.Add([]string{"name"}, binding.BusinessError, "同一个机房管理单元内网络区域名称不能重复") + return errs + } + } + + if len(reqData.PhysicalArea) == 0 { + errs.Add([]string{"physical_area"}, binding.RequiredError, "关联物理区域不能为空") + return errs + } + if reqData.Status == "" { + errs.Add([]string{"status"}, binding.RequiredError, "状态不能为空") + return errs + } + + if !collection.InSlice(reqData.Status, []string{model.NetworkAreaStatNonProduction, model.NetworkAreaStatProduction, model.NetworkAreaStatOffline}) { + errs.Add([]string{"status"}, binding.RequiredError, "无效的状态值") + return errs + } + return errs +} + +// PhysicalArea 物理区域 +type PhysicalArea struct { + ID uint `json:"id"` + Name string `json:"name"` +} + +// convert2PhysicalAreas 将物理区域字符串切片转成物理区域对象切片 +func convert2PhysicalAreas(items []string) []*PhysicalArea { + if len(items) == 0 { + return []*PhysicalArea{} + } + areas := make([]*PhysicalArea, 0, len(items)) + for i := range items { + areas = append(areas, &PhysicalArea{ + ID: uint(i + 1), + Name: items[i], + }) + } + return areas +} + +// PhysicalAreas 物理区域集合 +type PhysicalAreas []*PhysicalArea + +// ToJSON 转化成JSON字节切片 +func (items PhysicalAreas) ToJSON() []byte { + b, _ := json.Marshal(items) + return b +} + +// SaveNetworkArea 保存网络区域 +func SaveNetworkArea(log logger.Logger, repo model.Repo, reqData *SaveNetworkAreaReq) (err error) { + if reqData.ID > 0 { + _, err = repo.GetNetworkAreaByID(reqData.ID) + if err != nil { + return err + } + } + + na := model.NetworkArea{ + IDCID: reqData.IDCID, + ServerRoomID: reqData.ServerRoomID, + Name: reqData.Name, + Status: reqData.Status, + Creator: reqData.LoginName, + } + na.ID = reqData.ID + na.PhysicalArea = string(PhysicalAreas(convert2PhysicalAreas(reqData.PhysicalArea)).ToJSON()) + _, err = repo.SaveNetworkArea(&na) + if reqData.ID == 0 { + reqData.ID = na.ID + } + return err +} + +// NetworkArea 网络区域 +type NetworkArea struct { + // 数据中心 + IDC struct { + ID uint `json:"id"` + Name string `json:"name"` + } `json:"idc"` + // 机房管理单元 + ServerRoom struct { + ID uint `json:"id"` + Name string `json:"name"` + } `json:"server_room"` + // 主键ID + ID uint `json:"id"` + // 网络区域名 + Name string `json:"name"` + // 物理区域 + PhysicalArea []*PhysicalArea `json:"physical_area"` + // Status 状态 + Status string `json:"status"` + // 创建时间 + CreatedAt string `json:"created_at"` + // 修改时间 + UpdatedAt string `json:"updated_at"` +} + +// GetNetworkAreaPageReq 查询网络区域分页请求结构体 +type GetNetworkAreaPageReq struct { + // 数据中心ID + IDCID string `json:"idc_id"` + // 机房管理单元ID + ServerRoomID string `json:"server_room_id"` + // 机房名 + ServerRoomName string `json:"server_room_name"` + // 网络区域名称 + Name string `json:"name"` + // 关联物理区域 + PhysicalArea string `json:"physical_area"` + // 状态。可选值: nonproduction-未投产; production-已投产; offline-已下线(回收); + // Enum: nonproduction,production,offline + Status string `json:"status"` + // 分页页号 + Page int64 `json:"page"` + // 分页大小 + PageSize int64 `json:"page_size"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *GetNetworkAreaPageReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDCID: "idc_id", + &reqData.ServerRoomID: "server_room_id", + &reqData.ServerRoomName: "server_room_name", + &reqData.Name: "name", + &reqData.PhysicalArea: "physical_area", + &reqData.Status: "status", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + } +} + +// GetNetworkAreaPage 按条件查询网络区域分页列表 +func GetNetworkAreaPage(log logger.Logger, repo model.Repo, reqData *GetNetworkAreaPageReq) (pg *page.Page, err error) { + if reqData.PageSize <= 0 || reqData.PageSize > 100 { + reqData.PageSize = 10 + } + if reqData.Page < 0 { + reqData.Page = 0 + } + + cond := model.NetworkAreaCond{ + IDCID: strings2.Multi2UintSlice(reqData.IDCID), + ServerRoomID: strings2.Multi2UintSlice(reqData.ServerRoomID), + Name: reqData.Name, + PhysicalArea: reqData.PhysicalArea, + Status: reqData.Status, + ServerRoomName: reqData.ServerRoomName, + } + + totalRecords, err := repo.CountNetworkAreas(&cond) + if err != nil { + return nil, err + } + + pager := page.NewPager(reflect.TypeOf(&NetworkArea{}), reqData.Page, reqData.PageSize, totalRecords) + items, err := repo.GetNetworkAreas(&cond, model.OneOrderBy("updated_at", model.DESC), pager.BuildLimiter()) + if err != nil { + return nil, err + } + + for i := range items { + pager.AddRecords(convert2NetworkArea(repo, items[i])) + } + return pager.BuildPage(), nil +} + +func convert2NetworkArea(repo model.Repo, src *model.NetworkArea) *NetworkArea { + dst := NetworkArea{ + ID: src.ID, + Name: src.Name, + Status: src.Status, + CreatedAt: src.CreatedAt.Format(times.DateLayout), + UpdatedAt: src.UpdatedAt.Format(times.DateLayout), + } + + if idc, _ := repo.GetIDCByID(src.IDCID); idc != nil { + dst.IDC.ID, dst.IDC.Name = idc.ID, idc.Name + } + + if room, _ := repo.GetServerRoomByID(src.ServerRoomID); room != nil { + dst.ServerRoom.ID, dst.ServerRoom.Name = room.ID, room.Name + } + + if src.PhysicalArea != "" { + _ = json.Unmarshal([]byte(src.PhysicalArea), &dst.PhysicalArea) + } + return &dst +} + +// GetNetworkAreaByID 返回指定ID的网络区域 +func GetNetworkAreaByID(repo model.Repo, id uint) (*NetworkArea, error) { + one, err := repo.GetNetworkAreaByID(id) + if err != nil { + return nil, err + } + return convert2NetworkArea(repo, one), nil +} + +// UpdateNetworkAreasStatusReq 批量修改网络区域状态API +type UpdateNetworkAreasStatusReq struct { + // 状态。状态。nonproduction-未投产; production-已投产; offline-已下线(回收) + // Required: true + // Enum: nonproduction,production,offline + Status string `json:"status"` + // 网络区域ID列表 + // Required: true + IDs []uint `json:"ids"` +} + +// FieldMap 请求字段映射 +func (reqData *UpdateNetworkAreasStatusReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDs: "ids", + &reqData.Status: "status", + } +} + +// Validate 结构体数据校验 +func (reqData *UpdateNetworkAreasStatusReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + if len(reqData.IDs) == 0 { + errs.Add([]string{"ids"}, binding.RequiredError, "网络区域ID不能为空") + return errs + } + if reqData.Status == "" { + errs.Add([]string{"status"}, binding.RequiredError, "状态值不能为空") + return errs + } + + if !collection.InSlice(reqData.Status, []string{model.NetworkAreaStatNonProduction, model.NetworkAreaStatProduction /*, model.NetworkAreaStatOffline*/}) { + errs.Add([]string{"status"}, binding.RequiredError, "无效的状态值") + return errs + } + return errs +} + +// UpdateNetworkAreasStatus 批量修改网络区域状态 +func UpdateNetworkAreasStatus(repo model.Repo, reqData *UpdateNetworkAreasStatusReq) (affected int64, err error) { + return repo.UpdateNetworkAreaStatus(reqData.Status, reqData.IDs...) +} + +// RemoveNetworkAreaReq 移除网络区域请求结构体 +type RemoveNetworkAreaReq struct { + ID uint `json:"-"` +} + +// Validate 结构体数据校验 +func (reqData *RemoveNetworkAreaReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + // 删除前须确保其下不含任何机架 + count, err := repo.CountServerCabinets(&model.ServerCabinetCond{ + NetworkAreaID: []uint{reqData.ID}, + }) + if err != nil { + errs.Add([]string{"id"}, binding.SystemError, "系统内部错误") + return errs + } + if count > 0 { + errs.Add([]string{"id"}, binding.RequiredError, "请先删除该网络区域下的所有机架") + return errs + } + return errs +} + +// RemoveNetworkArea 删除指定ID的业务网段 +func RemoveNetworkArea(repo model.Repo, reqData *RemoveNetworkAreaReq) (err error) { + affected, err := repo.RemoveNetworkAreaByID(reqData.ID) + if err != nil { + return err + } + if affected <= 0 { + return gorm.ErrRecordNotFound + } + return nil +} + +//NetworkAreaForImport 为了导入 +type NetworkAreaForImport struct { + //文件导入数据 + // 网络区域名 + Name string `json:"name"` + // 机房管理单元 + ServerRoomName string `json:"server_room_name"` + // Status 状态 + Status string `json:"status"` + // 物理区域 + PhysicalArea string `json:"physical_area"` + + //创建人 + Creator string `json:"creator"` + // 主键ID + ID uint `json:"id"` + //机房ID + IDCID uint `json:"idc_id"` + //一级机房 + ServerRoomID uint `json:"server_room_id"` + //附加内容 + Content string `json:"content"` +} + +//checkLength 对导入文件中的数据做基本验证 +func (nafi *NetworkAreaForImport) checkLength() { + leg := len(nafi.Name) + if leg == 0 || leg > 255 { + var br string + if nafi.Content != "" { + br = "<br />" + } + nafi.Content += br + fmt.Sprintf("必填项校验:区域名称长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(nafi.ServerRoomName) + if leg == 0 || leg > 255 { + var br string + if nafi.Content != "" { + br = "<br />" + } + nafi.Content += br + fmt.Sprintf("必填项校验:机房管理单元长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(nafi.Status) + if leg == 0 || leg > 255 { + var br string + if nafi.Content != "" { + br = "<br />" + } + nafi.Content += br + fmt.Sprintf("必填项校验:状态长度为(%d)(不能为空)", leg) + } + leg = len(nafi.PhysicalArea) + if leg == 0 { + var br string + if nafi.Content != "" { + br = "<br />" + } + nafi.Content += br + fmt.Sprintf("必填项校验:关联物理区域长度为(%d)(不能为空)", leg) + } +} + +var ( + networkAreaTypeMap = map[string]string{ + "未投产": model.NetworkAreaStatNonProduction, + "已投产": model.NetworkAreaStatProduction, + "回收": model.NetworkAreaStatOffline, + "": "", + } +) + +//validate 对导入文件中的数据做基本验证 +func (nafi *NetworkAreaForImport) validate(log logger.Logger, repo model.Repo) (int, error) { + //机房校验 + sr, err := repo.GetServerRoomByName(nafi.ServerRoomName) + if err != nil && err != gorm.ErrRecordNotFound { + return upload.Return, err + } + if err == gorm.ErrRecordNotFound || sr == nil { + var br string + if nafi.Content != "" { + br = "<br />" + } + nafi.Content += br + fmt.Sprintf("机房管理单元(%s)不存在", nafi.ServerRoomName) + return upload.Continue, nil + } + nafi.IDCID = sr.IDCID + nafi.ServerRoomID = sr.ID + + //网络区域校验 + nabc, err := repo.GetNetworkAreasByCond(&model.NetworkArea{Name: nafi.Name, + ServerRoomID: nafi.ServerRoomID, + IDCID: nafi.IDCID, + }) + if err != nil && err != gorm.ErrRecordNotFound { + log.Debug(err.Error()) + return upload.Return, err + } + if len(nabc) > 1 { + var br string + if nafi.Content != "" { + br = "<br />" + } + nafi.Content += br + fmt.Sprintf("网络区域表存在冲突,网络区域(%s)在同一数据中心,同一机房下不能存在多个", nafi.Name) + return upload.Continue, nil + } + if len(nabc) == 1 { + nafi.ID = nabc[0].ID + } + + if networkAreaTypeMap[nafi.Status] == "" { + var br string + if nafi.Content != "" { + br = "<br />" + } + nafi.Content += br + fmt.Sprintf("网络区域类型只能为(%s)", "未投产/已投产/回收") + return upload.Continue, nil + } + + nafi.Status = networkAreaTypeMap[nafi.Status] + //关联物理区域不做校验 + + return upload.DO, nil +} + +//ImportNetworkAreaPriview 导入预览 +func ImportNetworkAreaPriview(log logger.Logger, repo model.Repo, reqData *upload.ImportReq) (map[string]interface{}, error) { + ra, err := utils.ParseDataFromXLSX(upload.UploadDir + reqData.FileName) + if err != nil { + return nil, err + } + length := len(ra) + + var success []*NetworkAreaForImport + var failure []*NetworkAreaForImport + for i := 1; i < length; i++ { + row := &NetworkAreaForImport{} + if len(ra[i]) < 4 { + var br string + if row.Content != "" { + br = "<br />" + } + row.Content += br + "导入文件列长度不对(应为4列)" + failure = append(failure, row) + continue + } + + row.Name = strings.TrimSpace(ra[i][0]) + row.ServerRoomName = strings.TrimSpace(ra[i][1]) + row.Status = strings.TrimSpace(ra[i][2]) + row.PhysicalArea = strings.TrimSpace(ra[i][3]) + + //必填项校验 + row.checkLength() + //机房和网络区域校验 + _, err := row.validate(log, repo) + if err != nil { + return nil, err + } + + if row.Content != "" { + failure = append(failure, row) + } else { + success = append(success, row) + } + } + + var data []*NetworkAreaForImport + if len(failure) > 0 { + data = failure + } else { + data = success + } + var result []*NetworkAreaForImport + for i := 0; i < len(data); i++ { + if uint(i) >= reqData.Offset && uint(i) < (reqData.Offset+reqData.Limit) { + result = append(result, data[i]) + } + } + if len(failure) > 0 { + return map[string]interface{}{"status": "failure", + "message": "导入网络区域错误", + "import_status": false, + "record_count": len(data), + "content": result, + }, nil + } + return map[string]interface{}{"status": "success", + "message": "操作成功", + "import_status": true, + "record_count": len(data), + "content": result, + }, nil +} + +//ImportNetworkArea 将导入网络区域放到数据库 +func ImportNetworkArea(log logger.Logger, repo model.Repo, reqData *upload.ImportReq) error { + ra, err := utils.ParseDataFromXLSX(upload.UploadDir + reqData.FileName) + if err != nil { + return err + } + length := len(ra) + for i := 1; i < length; i++ { + row := &NetworkAreaForImport{} + if len(ra[i]) < 4 { + continue + } + + row.Name = strings.TrimSpace(ra[i][0]) + row.ServerRoomName = strings.TrimSpace(ra[i][1]) + row.Status = strings.TrimSpace(ra[i][2]) + row.PhysicalArea = strings.TrimSpace(ra[i][3]) + + //必填项校验 + row.checkLength() + //机房和网络区域校验 + isSave, err := row.validate(log, repo) + if err != nil { + return err + } + + //不能获取机房信息 + if isSave == upload.Continue { + continue + } + + na := model.NetworkArea{ + IDCID: row.IDCID, + ServerRoomID: row.ServerRoomID, + Name: row.Name, + Status: row.Status, + Creator: "", // TODO 待补充 + } + na.ID = row.ID + pa := strings.Split(row.PhysicalArea, ",") + na.PhysicalArea = string(PhysicalAreas(convert2PhysicalAreas(pa)).ToJSON()) + log.Errorf("%v", na) + if _, err = repo.SaveNetworkArea(&na); err != nil { + return err + } + } + defer os.Remove(upload.UploadDir + reqData.FileName) + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/network_device.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/network_device.go new file mode 100644 index 0000000000000000000000000000000000000000..f1d548c177c75c82f8b37a964c95ad1cc48a9ace --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/network_device.go @@ -0,0 +1,770 @@ +package service + +import ( + "fmt" + "net/http" + "reflect" + "net/url" + "os" + "strings" + "errors" + + "github.com/jinzhu/gorm" + "github.com/voidint/binding" + "github.com/voidint/page" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils" + strings2 "idcos.io/cloudboot/utils/strings" + "idcos.io/cloudboot/utils/upload" +) + +// NetworkDevicePageReq 网络设备分页请求体 +type NetworkDevicePageReq struct { + // 所属数据中心ID + IDCID string `json:"idc_id"` + // 所属机房 + ServerRoomID string `json:"server_room_id"` + ServerRoomName string `json:"server_room_name"` + // 所属机架 + ServerCabinetID string `json:"server_cabinet_id"` + ServerCabinetNumber string `json:"server_cabinet_number"` + // 资产编号 + FixedAssetNumber string `json:"fixed_asset_number"` + // SN号 + SN string `json:"sn"` + // 名称 + Name string `json:"name"` + // 产品型号 + ModelNumber string `json:"model"` + // 厂商 + Vendor string `json:"vendor"` + // 操作系统 + OS string `json:"os"` + // 类型 switch-交换机; + Type string `json:"type"` + // TOR + TOR string `json:"tor"` + // 用途 + Usage string `json:"usage"` + // 状态 + Status string `json:"status"` + // 页号 + Page int64 `json:"page"` + // 页大小 + PageSize int64 `json:"page_size"` +} + +// SaveNetworkDeviceReq 网络设备保存接口结构体 +type SaveNetworkDeviceReq struct { + // 所属数据中心ID + IDCID uint `json:"idc_id"` + // 所属机房 + ServerRoomID uint `json:"server_room_id"` + // 所属机架 + ServerCabinetID uint `json:"server_cabinet_id"` + // 资产编号 + FixedAssetNumber string `json:"fixed_asset_number"` + // SN号 + SN string `json:"sn"` + // 名称 + Name string `json:"name"` + // 产品型号 + ModelNumber string `json:"model"` + // 厂商 + Vendor string `json:"vendor"` + // 操作系统 + OS string `json:"os"` + // 类型 switch-交换机; + Type string `json:"type"` + // TOR + TOR string `json:"tor"` + // 用途 + Usage string `json:"usage"` + // 状态 + Status string `json:"status"` + // 用户登录名 + LoginName string `json:"-"` +} + + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *NetworkDevicePageReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDCID: "idc_id", + &reqData.ServerRoomID: "server_room_id", + &reqData.ServerRoomName: "server_room_name", + &reqData.ServerCabinetID: "server_cabinet_id", + &reqData.ServerCabinetNumber: "server_cabinet_number", + &reqData.FixedAssetNumber: "fixed_asset_number", + &reqData.SN: "sn", + &reqData.Name: "name", + &reqData.ModelNumber: "model", + &reqData.Vendor: "vendor", + &reqData.TOR: "tor", + &reqData.OS: "os", + &reqData.Type: "type", + &reqData.Usage: "usage", + &reqData.Status: "status", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + } +} + + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *SaveNetworkDeviceReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDCID: "idc_id", + &reqData.ServerRoomID: "server_room_id", + &reqData.ServerCabinetID: "server_cabinet_id", + &reqData.FixedAssetNumber: "fixed_asset_number", + &reqData.SN: "sn", + &reqData.Name: "name", + &reqData.ModelNumber: "model", + &reqData.Vendor: "vendor", + &reqData.OS: "os", + &reqData.Type: "type", + &reqData.Usage: "usage", + &reqData.Status: "status", + } +} + +// +// Validate 结构体数据校验 +func (reqData *SaveNetworkDeviceReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + + //校验名称是否已经存在 + cond := &model.NetworkDeviceCond{ + Name: reqData.Name, + } + networks, _ := repo.GetNetworkDevicesByCond(cond, nil, nil) + if len(networks) > 0 { + errs.Add([]string{"name"}, binding.BusinessError, fmt.Sprintf("名称(%s)信息已经存在", reqData.SN)) + return errs + } + + idc, err := repo.GetIDCByID(reqData.IDCID) + if err == gorm.ErrRecordNotFound || idc == nil { + errs.Add([]string{"idc_id"}, binding.BusinessError, "数据中心不存在") + return errs + } + room, err := repo.GetServerRoomByID(reqData.ServerRoomID) + if err == gorm.ErrRecordNotFound || room == nil { + errs.Add([]string{"server_room_id"}, binding.BusinessError, "机房信息不存在") + return errs + } + cabinet, err := repo.GetServerCabinetByID(reqData.ServerCabinetID) + if err == gorm.ErrRecordNotFound || cabinet == nil { + errs.Add([]string{"server_cabinet"}, binding.BusinessError, "机架信息不存在") + return errs + } + + items, err := repo.GetNetworkDeviceBySN(reqData.SN) + if len(items) > 0 { + errs.Add([]string{"sn"}, binding.BusinessError, fmt.Sprintf("SN(%s)信息已经存在", reqData.SN)) + return errs + } + + items, err = repo.GetNetworkDeviceByFixedAssetNumber(reqData.FixedAssetNumber) + if len(items) > 0 { + errs.Add([]string{"fixed_asset_number"}, binding.BusinessError, fmt.Sprintf("资产编号(%s)信息已经存在", reqData.FixedAssetNumber)) + return errs + } + + return errs +} + +// NetworkDeviceResp 网络设备返回体 +type NetworkDeviceResp struct { + // 数据中心 + IDC struct { + ID uint `json:"id"` + Name string `json:"name"` + } `json:"idc"` + // 机房信息 + ServerRoom struct { + ID uint `json:"id"` + Name string `json:"name"` + } `json:"server_room"` + // 机架信息 + ServerCabinet struct { + ID uint `json:"id"` + Number string `json:"number"` + } `json:"server_cabinet"` + // 主键 + ID uint `json:"id"` + // 资产编号 + FixedAssetNumber string `json:"fixed_asset_number"` + // SN号 + SN string `json:"sn"` + // 名称 + Name string `json:"name"` + // 产品型号 + ModelNumber string `json:"model"` + // 厂商 + Vendor string `json:"vendor"` + // 操作系统 + OS string `json:"os"` + // 类型 + Type string `json:"type"` + // TOR + TOR string `json:"tor"` + // 用途 + Usage string `json:"usage"` + // 状态 + Status string `json:"status"` + // 创建时间 + CreatedAt string `json:"created_at"` + // 修改时间 + UpdatedAt string `json:"updated_at"` +} + +// GetNetworkDevicesPage 返回满足过滤条件的网络设备(不支持模糊查找) +func GetNetworkDevicesPage(repo model.Repo, reqData *NetworkDevicePageReq) (pg *page.Page, err error) { + if reqData.PageSize <= 0 || reqData.PageSize > 10000 { //下拉需要 + reqData.PageSize = 10 + } + if reqData.Page < 0 { + reqData.Page = 0 + } + + cond := model.NetworkDeviceCond{ + IDCID: strings2.Multi2UintSlice(reqData.IDCID), + ServerRoomID: strings2.Multi2UintSlice(reqData.ServerRoomID), + ServerRoomName: reqData.ServerRoomName, + ServerCabinetID: strings2.Multi2UintSlice(reqData.ServerCabinetID), + ServerCabinetNumber: reqData.ServerCabinetNumber, + FixedAssetNumber: reqData.FixedAssetNumber, + SN: reqData.SN, + Name: reqData.Name, + ModelNumber: reqData.ModelNumber, + Vendor: reqData.Vendor, + OS: reqData.OS, + Type: reqData.Type, + Usage: reqData.Usage, + Status: reqData.Status, + } + + //TOR包含+号,特殊处理下 + cond.TOR, _ = url.QueryUnescape(reqData.TOR) + + totalRecords, err := repo.CountNetworkDevices(&cond) + if err != nil { + return nil, err + } + + pager := page.NewPager(reflect.TypeOf(&NetworkDeviceResp{}), reqData.Page, reqData.PageSize, totalRecords) + items, err := repo.GetNetworkDevicesByCond(&cond, model.TwoOrderBy("idc_id", model.ASC, "server_cabinet_id", model.ASC), + pager.BuildLimiter()) + if err != nil { + return nil, err + } + + for i := range items { + pager.AddRecords(convert2NetworkDeviceResp(repo, items[i])) + } + + return pager.BuildPage(), nil +} + +// RemoveNetworkDeviceByID 删除指定ID的网络设备 +func RemoveNetworkDeviceByID(repo model.Repo, id uint) (err error) { + + device, err := repo.GetNetworkDeviceByID(id) + + if err != nil { + return err + } + + // 校验网络设备是否被引用 + ipNets, err := repo.GetIPNetworksBySwitchNumber(device.FixedAssetNumber) + if err != nil { + return err + } + + if len(ipNets) > 0 { + return fmt.Errorf("网络设备(%s, %s)已经分配了网段,无法删除", device.Name, device.FixedAssetNumber) + } + + return repo.RemoveNetworkDeviceByID(id) + +} + + +// 批量删除网络设备请求结构体 +type DelNetworkDeviceReq struct { + IDs []uint `json:"ids"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *DelNetworkDeviceReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDs: "ids", + } +} + +// Validate 结构体数据校验 +func (reqData *DelNetworkDeviceReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + for _, id := range reqData.IDs { + + device, err := repo.GetNetworkDeviceByID(id) + if err != nil { + errs.Add([]string{"id"}, binding.RequiredError, fmt.Sprintf("网络设备ID(%d)不存在", id)) + return errs + } + // 校验网络设备是否被引用 + ipNets, err := repo.GetIPNetworksBySwitchNumber(device.FixedAssetNumber) + if err != nil { + errs.Add([]string{"id"}, binding.RequiredError, fmt.Sprintf("网络设备(%s)是否关联网段失败: %s", device.FixedAssetNumber, err.Error())) + return errs + } + if len(ipNets) > 0 { + errs.Add([]string{"id"}, binding.RequiredError, fmt.Sprintf("网络设备(%s, %s)存在关联网段,无法删除", device.Name, device.FixedAssetNumber)) + return errs + } + } + return nil +} + +//RemoveNetworkDevices 删除指定ID的网络设备 +func RemoveNetworkDevices(log logger.Logger, repo model.Repo, reqData *DelNetworkDeviceReq) (affected int64, err error) { + for _, id := range reqData.IDs { + err = repo.RemoveNetworkDeviceByID(id) + if err != nil { + log.Errorf("delete network device(id=%d) fail,err:%v", id, err) + return affected, err + } + + affected++ + } + return affected, err +} + + +// GetNetworkDeviceByID 查询指定ID的网络设备 +func GetNetworkDeviceByID(repo model.Repo, id uint) (network *NetworkDeviceResp, err error) { + networkDevice, err := repo.GetNetworkDeviceByID(id) + if err != nil { + return nil, err + } + return convert2NetworkDeviceResp(repo, networkDevice), nil +} + +// SaveNetworkDevice 保存网络区域 +func SaveNetworkDevice(log logger.Logger, repo model.Repo, reqData *SaveNetworkDeviceReq) (networkDevice *model.NetworkDevice, err error) { + na := model.NetworkDevice{ + IDCID: reqData.IDCID, + ServerRoomID: reqData.ServerRoomID, + ServerCabinetID: reqData.ServerCabinetID, + Name: reqData.Name, + FixedAssetNumber: reqData.FixedAssetNumber, + SN: reqData.SN, + ModelNumber: reqData.ModelNumber, + Vendor: reqData.Vendor, + OS: reqData.OS, + Type: reqData.Type, + TOR: reqData.TOR, + Usage: reqData.Usage, + Status: reqData.Status, + } + return repo.SaveNetworkDevice(&na) +} + + +// convert2NetworkDeviceResp 转换设备信息 +func convert2NetworkDeviceResp(repo model.Repo, item *model.NetworkDevice) *NetworkDeviceResp { + device := NetworkDeviceResp{ + ID: item.ID, + CreatedAt: item.CreatedAt.Format("2006-01-02 15:04:05"), + UpdatedAt: item.UpdatedAt.Format("2006-01-02 15:04:05"), + FixedAssetNumber: item.FixedAssetNumber, + SN: item.SN, + Name: item.Name, + ModelNumber: item.ModelNumber, + Vendor: item.Vendor, + Type: item.Type, + TOR: item.TOR, + OS: item.OS, + Usage: item.Usage, + Status: item.Status, + } + + if idc, _ := repo.GetIDCByID(item.IDCID); idc != nil { + device.IDC.ID = idc.ID + device.IDC.Name = idc.Name + } + + if room, _ := repo.GetServerRoomByID(item.ServerRoomID); room != nil { + device.ServerRoom.ID = room.ID + device.ServerRoom.Name = room.Name + } + if cabinet, _ := repo.GetServerCabinetByID(item.ServerCabinetID); cabinet != nil { + device.ServerCabinet.ID = cabinet.ID + device.ServerCabinet.Number = cabinet.Number + } + + return &device +} + +//TOR组相关的逻辑,由于TOR是交换机的一个属性,暂时把放到这里 +//GetTORBySN 根据设备SN查询所属的TOR组 +func GetTORBySN(log logger.Logger, repo model.Repo, SN string) (tor string, err error) { + netDev, err := repo.GetIntranetSwitchBySN(SN) + if err != nil { + log.Errorf("get tor by sn:%s fail,%s", SN, err.Error()) + return "", err + } + return netDev.TOR, nil +} + +//GetAllTORs 查询所有的TOR组名称 +func GetAllTORs(log logger.Logger, repo model.Repo) []string { + tors, err := repo.GetTORs() + if err != nil { + log.Errorf("get all tors fail,%s", err.Error()) + return nil + } + return tors +} + +type NetworkDeviceForImport struct { + ID uint + IDCName string `json:"idc_name"` + IDCID uint + ServerRoomName string `json:"server_room_name"` + ServerRoomID uint + // 所属机架 + ServerCabinetNumber string `json:"server_cabinet_number"` + ServerCabinetID uint + // 资产编号 + FixedAssetNumber string `json:"fixed_asset_number"` + // SN号 + SN string `json:"sn"` + // 名称 + Name string `json:"name"` + // 产品型号 + ModelNumber string `json:"model"` + // 厂商 + Vendor string `json:"vendor"` + // 操作系统 + OS string `json:"os"` + // 类型 switch-交换机; + Type string `json:"type"` + // TOR + TOR string `json:"tor"` + // 用途 + Usage string `json:"usage"` + + Content string `json:"content"` +} + +//checkLength 对导入文件中的数据做基本验证 +func (srfi *NetworkDeviceForImport) checkLength() { + leg := len(srfi.IDCName) + if leg == 0 || leg > 255 { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("必填项校验:数据中心长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(srfi.ServerRoomName) + if leg == 0 || leg > 255 { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("必填项校验:机房管理单元长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(srfi.ServerCabinetNumber) + if leg == 0 || leg > 255 { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("必填项校验:所属机架编号长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(srfi.FixedAssetNumber) + if leg == 0 || leg > 255 { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("必填项校验:固资编号长度为(%d)(不能为空)", leg) + } + leg = len(srfi.SN) + if leg == 0 || leg > 255 { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("必填项校验:序列号长度为(%d)(不能为空)", leg) + } + leg = len(srfi.Name) + if leg == 0 || leg > 255 { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("必填项校验:设备名称长度为(%d)(不能为空)", leg) + } + leg = len(srfi.ModelNumber) + if leg == 0 || leg > 255 { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("必填项校验:型号长度为(%d)(不能为空)", leg) + } + leg = len(srfi.Vendor) + if leg == 0 || leg > 255 { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("必填项校验:厂商长度为(%d)(不能为空)", leg) + } + leg = len(srfi.OS) + if leg == 0 || leg > 255 { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("必填项校验:操作系统长度为(%d)(不能为空)", leg) + } + leg = len(srfi.Type) + if leg == 0 || leg > 255 { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("必填项校验:类型长度为(%d)(不能为空)", leg) + } + leg = len(srfi.TOR) + if leg == 0 || leg > 255 { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("必填项校验:TOR长度为(%d)(不能为空)", leg) + } + leg = len(srfi.Usage) + if leg == 0 || leg > 255 { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("必填项校验:用途长度为(%d)(不能为空)", leg) + } +} + +//validate 对导入文件中的数据做基本验证 +func (srfi *NetworkDeviceForImport) validate(repo model.Repo) (int, error) { + //数据中心校验 + idc, err := repo.GetIDCByName(srfi.IDCName) + if err != nil && err != gorm.ErrRecordNotFound { + return upload.Return, err + } + if err == gorm.ErrRecordNotFound || idc == nil { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("数据中心(%s)不存在", srfi.IDCName) + return upload.Return, nil + } + + //机房校验 + srs, err := repo.GetServerRoomByName(srfi.ServerRoomName) + if err != nil && err != gorm.ErrRecordNotFound { + return upload.Return, err + } + if err == gorm.ErrRecordNotFound || srs == nil { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("机房管理单元(%s)不存在", srfi.ServerRoomName) + return upload.Return, nil + } else { + srfi.ServerRoomID = srs.ID + } + srfi.IDCID = idc.ID + cabinet, err := repo.GetServerCabinetByNumber(srfi.ServerRoomID, srfi.ServerCabinetNumber) + if err == gorm.ErrRecordNotFound || cabinet == nil { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("机架编号(%s)对应的机架不存在", srfi.ServerCabinetNumber) + return upload.Return, nil + } else { + srfi.ServerCabinetID = cabinet.ID + } + + items, err := repo.GetNetworkDeviceByFixedAssetNumber(srfi.FixedAssetNumber) + if len(items) > 0 { + srfi.ID = items[0].ID + } + + //类型目前只有交换机 + if srfi.Type != "交换机" { + return upload.Return, errors.New("类型须为:交换机") + } + items, err = repo.GetNetworkDevicesByCond(&model.NetworkDeviceCond{Name: srfi.Name}, nil, nil) + if len(items) > 0 { + if items[0].FixedAssetNumber != srfi.FixedAssetNumber { + return upload.Return, fmt.Errorf("与固资号(%s)的名称重复", items[0].FixedAssetNumber) + } + } + + return upload.DO, nil +} + +//ImportNetworkDevicePreview 导入预览 +func ImportNetworkDevicePreview(log logger.Logger, repo model.Repo, reqData *upload.ImportReq) (map[string]interface{}, error) { + ra, err := utils.ParseDataFromXLSX(upload.UploadDir + reqData.FileName) + if err != nil { + return nil, err + } + length := len(ra) + + var success []*NetworkDeviceForImport + var failure []*NetworkDeviceForImport + for i := 1; i < length; i++ { + row := &NetworkDeviceForImport{} + if len(ra[i]) < 12 { + var br string + if row.Content != "" { + br = "<br />" + } + row.Content += br + "导入文件列长度不对(应为12列)" + failure = append(failure, row) + continue + } + + row.IDCName = strings.TrimSpace(ra[i][0]) + row.ServerRoomName = strings.TrimSpace(ra[i][1]) + row.ServerCabinetNumber = strings.TrimSpace(ra[i][2]) + row.FixedAssetNumber = strings.TrimSpace(ra[i][3]) + row.SN = strings.TrimSpace(ra[i][4]) + row.Name = strings.TrimSpace(ra[i][5]) + row.ModelNumber = strings.TrimSpace(ra[i][6]) + row.Vendor = strings.TrimSpace(ra[i][7]) + row.OS = strings.TrimSpace(ra[i][8]) + row.Type = strings.TrimSpace(ra[i][9]) + row.TOR = strings.TrimSpace(ra[i][10]) + row.Usage = strings.TrimSpace(ra[i][11]) + + //必填项校验 + row.checkLength() + //机房和数据中心校验 + _, err := row.validate(repo) + if err != nil { + return nil, err + } + + if row.Content != "" { + failure = append(failure, row) + } else { + success = append(success, row) + } + } + + var data []*NetworkDeviceForImport + if len(failure) > 0 { + data = failure + } else { + data = success + } + var result []*NetworkDeviceForImport + for i := 0; i < len(data); i++ { + if uint(i) >= reqData.Offset && uint(i) < (reqData.Offset+reqData.Limit) { + result = append(result, data[i]) + } + } + if len(failure) > 0 { + _ = os.Remove(upload.UploadDir + reqData.FileName) + return map[string]interface{}{"status": "failure", + "message": "导入网络设备错误", + "import_status": false, + "record_count": len(data), + "content": result, + }, nil + } + return map[string]interface{}{"status": "success", + "message": "操作成功", + "import_status": true, + "record_count": len(data), + "content": result, + }, nil +} + +//ImportNetworkDevices 将导入机房放到数据库 +func ImportNetworkDevices(log logger.Logger, repo model.Repo, reqData *upload.ImportReq) error { + ra, err := utils.ParseDataFromXLSX(upload.UploadDir + reqData.FileName) + if err != nil { + return err + } + length := len(ra) + for i := 1; i < length; i++ { + row := &NetworkDeviceForImport{} + if len(ra[i]) < 12 { + continue + } + + row.IDCName = strings.TrimSpace(ra[i][0]) + row.ServerRoomName = strings.TrimSpace(ra[i][1]) + row.ServerCabinetNumber = strings.TrimSpace(ra[i][2]) + row.FixedAssetNumber = strings.TrimSpace(ra[i][3]) + row.SN = strings.TrimSpace(ra[i][4]) + row.Name = strings.TrimSpace(ra[i][5]) + row.ModelNumber = strings.TrimSpace(ra[i][6]) + row.Vendor = strings.TrimSpace(ra[i][7]) + row.OS = strings.TrimSpace(ra[i][8]) + row.Type = strings.TrimSpace(ra[i][9]) + row.TOR = strings.TrimSpace(ra[i][10]) + row.Usage = strings.TrimSpace(ra[i][11]) + + //必填项校验 + row.checkLength() + //机房和数据中心校验 + isSave, err := row.validate(repo) + if err != nil { + return err + } + if isSave == upload.Continue { + continue + } + + sr := &model.NetworkDevice{ + IDCID: row.IDCID, + ServerRoomID: row.ServerRoomID, + ServerCabinetID: row.ServerCabinetID, + FixedAssetNumber: row.FixedAssetNumber, + SN: row.SN, + Name: row.Name, + ModelNumber: row.ModelNumber, + Vendor: row.Vendor, + OS: row.OS, + Type: "switch", //row.Type, + TOR: row.TOR, + Usage: row.Usage, + } + sr.Model.ID = row.ID + + _, err = repo.SaveNetworkDevice(sr) + if err != nil { + return err + } + } + defer os.Remove(upload.UploadDir + reqData.FileName) + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/oob.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/oob.go new file mode 100644 index 0000000000000000000000000000000000000000..f62f24ebb08eea81080fe008857200b8bc2abc87 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/oob.go @@ -0,0 +1,882 @@ +package service + +import ( + "encoding/json" + "errors" + "fmt" + "net/http" + "strings" + + "math/rand" + "time" + + "sync" + + "github.com/jinzhu/gorm" + "github.com/voidint/binding" + "idcos.io/cloudboot/config" + "idcos.io/cloudboot/hardware/oob/ipmi" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils" + "idcos.io/cloudboot/utils/oob" + "idcos.io/cloudboot/utils/sh" +) + +// OOBPowerBatchOperateReq 带外管理批量请求结构体 +type OOBPowerBatchOperateReq struct { + Sns []string `json:"sns"` +} + +// FieldMap 请求字段映射 +func (reqData *OOBPowerBatchOperateReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.Sns: "sns", + } +} + +const ( + // PowerRestart 重启 + PowerRestart = "restart" + // PowerOn 开机 + PowerOn = "on" + // PowerOff 关机 + PowerOff = "off" + // OperatePowerOn 服务器开机 + OperatePowerOn = "ipmitool -I lanplus -H $HOST -U $USER -P $PASSWD power on" + // OperatePowerOff 服务器关机 + OperatePowerOff = "ipmitool -I lanplus -H $HOST -U $USER -P $PASSWD power off" + // OperatePowerRestart 服务器重启 + OperatePowerRestart = "ipmitool -I lanplus -H $HOST -U $USER -P $PASSWD power reset" + // OperatePowerStatus 服务器状态 + OperatePowerStatus = "ipmitool -I lanplus -H $HOST -U $USER -P $PASSWD power status" + // OperatePowerPXE PXE启动 不能指定特定端口,端口指定可借助racadm等工具实现,网卡的pxe功能需要在bios中开启 + OperatePowerPXE = "ipmitool -I lanplus -H $HOST -U $USER -P $PASSWD chassis bootdev pxe options=efiboot" + //CmdSleep2s 命令之间睡2秒 + CmdSleep2s = "sleep 2s" + + // Domain 带外注册在DNS上的域名, 与hostname(SN)一起充当HOST的角色 + //Domain = "oob.webank.com" + + // OOBVendorConfig 带外管理厂商 用户名密码配置 + OOBVendorConfig = ` +{ + "Dell": [ + { + "password": "admin", + "username": "albert" + }, + { + "password": "calvin", + "username": "root" + } + ], + "戴尔": [ + { + "password": "admin", + "username": "albert" + }, + { + "password": "calvin", + "username": "root" + } + ], + "HP": [ + { + "password": "12345678", + "username": "Administrator" + } + ], + "惠普": [ + { + "password": "12345678", + "username": "Administrator" + } + ], + "Huawei": [ + { + "password": "Huawei12#$", + "username": "root" + }, + { + "password": "Admin@9000", + "username": "Administrator" + } + ], + "华为": [ + { + "password": "Huawei12#$", + "username": "root" + }, + { + "password": "Admin@9000", + "username": "Administrator" + } + ], + "default": [ + { + "password": "admin", + "username": "albert" + }, + { + "password": "root", + "username": "root" + }, + { + "password": "admin", + "username": "root" + }, + { + "password": "jumpm3", + "username": "albert" + } + ], + "ibm": [ + { + "password": "PASSW0RD", + "username": "USERID" + } + ] +}` +) + +// OOBUser 带外管理用户结构体 +type OOBUser struct { + Username string `json:"username"` + Password string `json:"password"` +} + +// OOBInfo 带外信息 +type OOBInfo struct { + Username string `json:"username"` + IP string `json:"ip"` + Password string `json:"password"` +} + +// OOBOperate 带外管理操作结构体 +type OOBOperate struct { + HOST string `json:"host"` + User string `json:"user"` + Passwd string `json:"passwd"` +} + +// UpdateOOBPasswordReq 修改带外密码请求体 +type UpdateOOBPasswordReq struct { + //设备序列号 + SN string `json:"sn"` + //带外用户名 + Username string `json:"oob_user_name"` + //带外原密码,置空时,新密码必须是正确的当前密码,否则修改会失败 + PasswordOld string `json:"oob_password_old"` + //带外新密码,置空时且旧密码有效,则修改为一个随机新密码 + PasswordNew string `json:"oob_password_new"` + //备注信息 + Remark string +} + +// OOBHistoryReq 带外用户密码修改历史请求参数结构 +type OOBHistoryReq struct { + //设备序列号 + SN string + //带外原用户名 + UsernameOld string + //带外新用户名 + UsernameNew string + //带外原密码 + PasswordOld string + //带外新密码 + PasswordNew string + //记录创建者ID + Creator string + //备注 + Remark string +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *UpdateOOBPasswordReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.Username: "oob_user_name", + &reqData.PasswordOld: "oob_password_old", + &reqData.PasswordNew: "oob_password_new", + } +} + +// GetOOBInfoBySn 根据sn获取设备带外信息 +func GetOOBInfoBySn(log logger.Logger, repo model.Repo, conf *config.Config, sn string) (user *OOBInfo, err error) { + user = &OOBInfo{} + device, err := repo.GetDeviceBySN(sn) + if err != nil || device == nil { + return user, err + } + user.IP = oob.TransferHostname2IP(log, repo, sn, utils.GetOOBHost(sn, device.Vendor, conf.Server.OOBDomain)) + + // 查看用户及密码,从device_oob_history这张表找,可以找到已经从平台删除的设备的信息 + u, err := FindOOBByHistory(log, repo, conf, sn) + if err != nil && err != gorm.ErrRecordNotFound { + return user, err + } + if u == nil { + //return nil, fmt.Errorf("带外用户名或密码为空,请设置") + log.Warnf("device SN: %s oob user or password empty", sn) + } else { + user.Username = u.Username + user.Password = u.Password + + //查看device表里面的用户名和密码是否存在,若不存在,则同步一下 + device, _ := repo.GetDeviceBySN(sn) + if device.OOBIP == "" || device.OOBIP != user.IP { + device.OOBIP = user.IP + } + if device.OOBUser == "" || device.OOBPassword == "" { + device.OOBUser = user.Username + encryptedPassword, err := utils.AESEncrypt(user.Password, []byte(conf.Crypto.Key)) + if err != nil { + log.Errorf("SN: %s sync oob info fail, encrypt new password fail", sn) + return nil, errors.New("新密码加密失败") + } + device.OOBPassword = encryptedPassword + } + repo.UpdateDevice(device) + } + return user, nil //忽略查询错误 +} + +// GetOOBUserBySN 根据sn设备带外账户信息 +func GetOOBUserBySN(log logger.Logger, repo model.Repo, sn, key string) (user *OOBUser, err error) { + m, err := repo.GetDeviceBySN(sn) + if err != nil { + return nil, err + } + user = &OOBUser{} + user.Username = m.OOBUser + pwd, err := utils.AESDecrypt(m.OOBPassword, []byte(key)) + if err != nil { + return nil, err + } + user.Password = string(pwd) + return user, err +} + +// BatchOperateOOBPower 带外管理批量操作 +func BatchOperateOOBPower(log logger.Logger, repo model.Repo, operate string, conf *config.Config, isPxe bool, sns []string) (output string, err error) { + var errMsg []string + var outMsg []string + + for _, sn := range sns { + out, err := OperateOOBPower(log, repo, sn, conf.Crypto.Key, conf.Server.OOBDomain, operate, isPxe) + + if err != nil { + log.Debugf("%s device operate failure, err: %s", sn, err.Error()) + errMsg = append(errMsg, err.Error()) + continue + } + + log.Debugf("%s device operate success, output: %s", sn, out) + outMsg = append(outMsg, fmt.Sprintf("设备(%s)操作成功", sn)) + } + if len(errMsg) > 0 { + return "", fmt.Errorf(strings.Join(errMsg, "\n")) + } + + return strings.Join(outMsg, "\n"), nil +} + +// OperateOOBPower 带外管理的操作 +func OperateOOBPower(log logger.Logger, repo model.Repo, sn, key, oobDomain, operate string, isPxe bool) (output string, err error) { + m, err := repo.GetDeviceBySN(sn) + if err != nil { + return "", err + } + + if m.OOBUser == "" || m.OOBPassword == "" { + log.Warnf("设备带外用户或密码为空,尝试找回,[SN:%s]", m.SN) + history, err := repo.GetLastOOBHistoryBySN(sn) + if err != nil { + log.Errorf("find back oob history by sn:%s fail,%s", sn, err.Error()) + return fmt.Sprintf("find back oob history by sn:%s fail", sn), fmt.Errorf("设备用户名密码为空,无法操作") + } else { + m.OOBUser = history.UsernameNew + m.OOBPassword = history.PasswordNew + } + } + + oobHost := utils.GetOOBHost(m.SN, m.Vendor, oobDomain) + oobIP := oob.TransferHostname2IP(log, repo, m.SN, oobHost) + if oobIP == "" { + return "操作失败", errors.New("未获取到带外IP") + } + oobUser := m.OOBUser + oobPassword, err := utils.AESDecrypt(m.OOBPassword, []byte(key)) + if err != nil { + log.Debugf("descrypt password failure, err: %s", err.Error()) + return "", err + } + // check is power + isPowerOn, err := OOBPowerStatus(log, oobIP, oobUser, string(oobPassword), m.OOBPassword) + if err != nil { + return "", err + } + + var cmd string + switch operate { + case PowerOff: + cmd += OperatePowerOff + case PowerOn: + if isPxe { + cmd = OperatePowerPXE + " && " + CmdSleep2s + " && " + } + cmd += OperatePowerOn + case PowerRestart: + // 设备在关闭状态下无法重启 + if !isPowerOn { + return "", fmt.Errorf("设备为关机状态,无法重启") + } + + if isPxe { + cmd = OperatePowerPXE + " && " + CmdSleep2s + " && " + } + cmd += OperatePowerRestart + } + + cmd = replaceCmd(cmd, oobIP, oobUser, string(oobPassword)) + + DesensitizePasswordLog(log, fmt.Sprintf("start to exec cmd: [%s]", cmd), string(oobPassword), m.OOBPassword) + + out, err := sh.ExecOutputWithLog(log, cmd) + if err != nil { + log.Debugf("exec [%s] done , err: [%s], stdout: [%s]", sh.CmdDesensitization(cmd), err.Error(), sh.CmdDesensitization(string(out))) + return "", ProcessStdoutMsg(out, oobIP, oobUser) + } + + DesensitizePasswordLog(log, fmt.Sprintf("exec [%s] done,output: [%s]", cmd, string(out)), string(oobPassword), m.OOBPassword) + + // update device power_status + status := model.PowerStatusOn + + if operate == PowerOff { + status = model.PowerStatusOff + } + m.PowerStatus = status + repo.UpdateDevice(m) + + return string(out), nil +} + +// ProcessStdoutMsg 处理错误信息 +func ProcessStdoutMsg(output []byte, host, username string) error { + str := string(output) + + if strings.Contains(str, "Could not open socket!") { + return fmt.Errorf("无法连接目标主机(%s)", host) + } + + if strings.Contains(str, "command not found") { + return fmt.Errorf("命令不存在") + } + + if strings.Contains(str, "Unable to establish IPMI v2 / RMCP+ session") { + return fmt.Errorf("用户名(%s)或密码错误", username) + } + return fmt.Errorf("其他错误:%s", string(output)) +} + +// DesensitizePasswordLog 脱敏密码输出 +func DesensitizePasswordLog(log logger.Logger, str, oldPass, newPass string) { + log.Debugf("%s", strings.Replace(str, oldPass, newPass, -1)) +} + +// OOBPowerStatus 检查OOBPower状态 +func OOBPowerStatus(log logger.Logger, oobHost, oobUser, oobPassword, oldPassword string) (bool, error) { + if oobHost == "" { + return false, errors.New("未获取到带外IP") + } + cmd := replaceCmd(OperatePowerStatus, oobHost, oobUser, oobPassword) + + output, err := sh.ExecOutputWithLog(log, cmd) + if err != nil { + return false, ProcessStdoutMsg(output, oobHost, oobUser) + } + + return strings.Contains(string(output), "Chassis Power is on"), nil +} + +// replaceCmd 将HOST、USER、PASSWD进行替换 +func replaceCmd(cmd, oobHost, oobUser, oobPassword string) string { + cmd = strings.Replace(cmd, "$HOST", oobHost, -1) + cmd = strings.Replace(cmd, "$USER", oobUser, -1) + cmd = strings.Replace(cmd, "$PASSWD", oobPassword, -1) + return cmd +} + +// UpdateOOBPasswordBySN 更新带外密码 +// 旧密码为空,新密码为用户指定的正确密码,直接修改库 +// 旧密码有值,且正确,新密码修改为用户指定值,或随机值 +// 旧密码有值,且不正确,修改失败 +func UpdateOOBPasswordBySN(log logger.Logger, repo model.Repo, reqData *UpdateOOBPasswordReq, + conf *config.Config) (user *OOBUser, err error) { + + _, err = utils.AESEncrypt(reqData.PasswordOld, []byte(conf.Crypto.Key)) + if err != nil { + return nil, err + } + + user = &OOBUser{} + //直接用新密码测试连通性,测试通过直接改表 + if reqData.PasswordOld == "" { + return nil, errors.New("[数据校验]未指定旧密码,更改失败") + } + + dev, err := repo.GetDeviceBySN(reqData.SN) + if err != nil { + log.Errorf("SN:%s update new oob password fail,Err:%s", dev.SN, err.Error()) + return + } + + //获取用户名对应的userID + cmd := fmt.Sprintf("ipmitool -I lanplus -H %s -U %s -P %s user list", + oob.TransferHostname2IP(log, repo, reqData.SN, utils.GetOOBHost(reqData.SN, dev.Vendor, conf.Server.OOBDomain)), + reqData.Username, reqData.PasswordOld) + out, err := sh.ExecOutputWithLog(log, cmd) + if err != nil || strings.Contains(string(out), "Error: Unable to establish LAN session") { + log.Errorf("SN: %s change oob password fail, old oob password is wrong") + return nil, errors.New("[数据校验]旧密码不正确,更改失败") + } + users, err := ipmi.ParseUsers(out) + if err != nil { + log.Errorf("SN: %s change oob password fail, parse oob user fail", reqData.SN) + return nil, errors.New("解析带外用户列表失败") + } + userID := 0 + for _, u := range users { + if reqData.Username == u.Name { + userID = u.ID + break + } + } + //如果新密码为空,则自动生成一个随机密码 + if reqData.PasswordNew == "" { + reqData.PasswordNew = GenPassword() + } + cmd = fmt.Sprintf("ipmitool -I lanplus -H %s -U %s -P %s user set password %d %s", + oob.TransferHostname2IP(log, repo, reqData.SN, utils.GetOOBHost(reqData.SN, dev.Vendor, conf.Server.OOBDomain)), + reqData.Username, + reqData.PasswordOld, userID, reqData.PasswordNew) + out, err = sh.ExecOutputWithLog(log, cmd) + if err != nil || strings.Contains(string(out), "Error: Unable to establish LAN session") { + log.Errorf("SN: %s change oob password fail, %s", reqData.SN, err.Error()) + return nil, err + } + + //更改成功,修改数据库 + user.Username = reqData.Username + user.Password = reqData.PasswordNew + encryptedPassword, err := utils.AESEncrypt(user.Password, []byte(conf.Crypto.Key)) + if err != nil { + log.Errorf("SN: %s change oob password fail, encrypt new password fail", reqData.SN) + return nil, errors.New("新密码加密失败") + } + + dev.OOBUser = user.Username + dev.OOBPassword = encryptedPassword + + yes := model.YES + dev.OOBAccessible = &yes + _, err = repo.UpdateDevice(dev) + if err != nil { + log.Errorf("SN:%s update new oob password fail,Err:%s", dev.SN, err.Error()) + return + } + + //将密码修改记录写到device_oob_history这张表-->改成Mysql触发器 + //AddOOBHistory(log, repo, conf, &OOBHistoryReq{ + // SN: reqData.SN, + // UsernameOld: dev.OOBUser, + // UsernameNew: reqData.Username, + // PasswordOld: reqData.PasswordOld, + // PasswordNew: reqData.PasswordNew, + // //Creator: "", + // Remark: reqData.Remark, + //}) + + return +} + +//GenPassword 生成8位密码 +func GenPassword() string { + //生成规则 8位数字字母随机组合 + str := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" + ascii := "~@#%^" //!$这几个符号在shell中有特殊含义,别引入了 + length := len(str) + result := make([]byte, 0, 8) + r := rand.New(rand.NewSource(time.Now().UnixNano())) + for i := 0; i < 8; i++ { + if i == 4 { + result = append(result, ascii[r.Intn(5)]) + } else { + result = append(result, str[r.Intn(length)]) //52英文字母,10数字 + } + } + return string(result) +} + +//GetDefaultOOBUserPassword 根据机器厂商查询默认出厂带外用户及密码 +//IBM=USERID:PASSW0RD +//HP=Administrator:12345678 +//DELL=albert:admin\root:calvin +//HUAWEI=root:Huawei12#$ +//OTHER=albert:admin\root:root +//返回规则改成:如果连通测试不通过,则返回nil +func GetDefaultOOBUserPassword(log logger.Logger, repo model.Repo, config *config.Config, sn, vendor string) (user *OOBUser, err error) { + vendor = strings.ToLower(vendor) + + var mapper map[string][]*OOBUser + err = json.Unmarshal([]byte(OOBVendorConfig), &mapper) + + oobIP := oob.TransferHostname2IP(log, repo, sn, utils.GetOOBHost(sn, vendor, config.Server.OOBDomain)) + for k, oobusers := range mapper { + if strings.ToLower(k) != strings.ToLower(vendor) { + continue + } + + for _, oobUser := range oobusers { + if oobPingTest(log, oobIP, oobUser.Username, oobUser.Password, config.Crypto.Key) { + user = oobUser + break + } + } + return + } + + for _, oobUser := range mapper["default"] { + if oobPingTest(log, oobIP, oobUser.Username, oobUser.Password, config.Crypto.Key) { + user = oobUser + break + } + } + return +} + +// oobPingTest 测试带外是否可以正常使用 +func oobPingTest(log logger.Logger, host, username, password, oldPassword string) bool { + cmd := fmt.Sprintf("ipmitool -I lanplus -H %s -U %s -P %s user list", host, username, password) + out, err := sh.ExecDesensitizeOutputWithLog(log, cmd, password, oldPassword) + if err != nil || strings.Contains(string(out), "Error: Unable to establish LAN session") { + return false + } + return true +} + +// AddOOBHistory 增加带外修改历史记录 +//func AddOOBHistory(log logger.Logger, repo model.Repo, conf *config.Config, oobHistory *OOBHistoryReq) (affected int64, err error) { +// mod := model.OOBHistory{ +// SN: oobHistory.SN, +// UsernameOld: oobHistory.UsernameOld, +// UsernameNew: oobHistory.UsernameOld, +// //PasswordOld:oobHistory.PasswordOld, +// //PasswordNew:oobHistory.PasswordNew, +// Remark: oobHistory.Remark, +// Creator: oobHistory.Creator, +// } +// if mod.PasswordOld, err = utils.AESEncrypt(oobHistory.PasswordOld, []byte(conf.Crypto.Key)); err != nil { +// log.Errorf("encrypt old oob password fail, %s", err.Error()) +// return 0, err +// } +// if mod.PasswordNew, err = utils.AESEncrypt(oobHistory.PasswordNew, []byte(conf.Crypto.Key)); err != nil { +// log.Errorf("encrypt new oob password fail, %s", err.Error()) +// return 0, err +// } +// +// return repo.AddOOBHistory(&mod) +//} + +// FindOOBByHistory 通过历史记录找回设备当前带外用户密码 +func FindOOBByHistory(log logger.Logger, repo model.Repo, conf *config.Config, sn string) (oob *OOBUser, err error) { + oob = new(OOBUser) + history, err := repo.GetLastOOBHistoryBySN(sn) + if err != nil { + log.Errorf("find back oob history by sn:%s fail,%s", sn, err.Error()) + return nil, err + } + oob.Username = history.UsernameNew + password, err := utils.AESDecrypt(history.PasswordNew, []byte(conf.Crypto.Key)) + if err != nil { + log.Errorf("decrypt oob new password:%s fail,%s", history.PasswordNew, err.Error()) + return nil, err + } + oob.Password = string(password) + return +} + +type ReAccessOOBReq struct { + SNs []string `json:"sns"` +} + +// FieldMap 请求字段映射 +func (reqData *ReAccessOOBReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.SNs: "sns", + } +} + +func ReAccessOOB(log logger.Logger, repo model.Repo, conf *config.Config, reqData *ReAccessOOBReq) (err error) { + //找出所有的未纳管的机器 + isYes := model.NO + devs := make([]*model.Device, 0) + if len(reqData.SNs) != 0 { + for _, sn := range reqData.SNs { + d, err := repo.GetDeviceBySN(sn) + if err != nil || d == nil { + log.Errorf("sn:%s not exist", err) + continue + } else { + devs = append(devs, d) + } + } + } else { + devs, err = repo.GetDevices(&model.Device{OOBAccessible: &isYes}, nil, nil) + if err != nil { + log.Errorf("get unaccessible devices fail,%v", err) + return err + } + } + var wg sync.WaitGroup + + sem := make(chan struct{}, 50) // 最多允许50个并发同时执行 + + for i := range devs { + wg.Add(1) + go func(j int) { + defer wg.Done() + + sem <- struct{}{} // 获取信号 + defer func() { <-sem }() // 释放信号 + + dev := devs[j] + oobIP := oob.TransferHostname2IP(log, repo, dev.SN, utils.GetOOBHost(dev.SN, dev.Vendor, conf.Server.OOBDomain)) + //如果IP都没解析到,就不要再往下试用户密码了 + if oobIP == "" { + log.Warnf("SN: %s get oob ip from dns fail", dev.SN) + return + } + if dev.OOBPassword != "" { + //设备表中的密码需要解密后使用 + oldOOBPasswordByte, err := utils.AESDecrypt(dev.OOBPassword, []byte(conf.Crypto.Key)) + if err != nil { + log.Warnf("SN: %s decrypt old password:%s fail", dev.OOBPassword) + } else if oobPingTest(log, oobIP, dev.OOBUser, string(oldOOBPasswordByte), dev.OOBPassword) { + isYesLocal := model.YES + dev.OOBAccessible = &isYesLocal + if _, err = repo.UpdateDevice(dev); err != nil { + log.Errorf("update oob accessible status fail,SN:%s,err:%v", dev.SN, err) + } + return //success 1 + } + } + + // 2 获取一个出厂默认的用户密码 + defaultUser, err := GetDefaultOOBUserPassword(log, repo, conf, dev.SN, dev.Vendor) + if defaultUser != nil { + UpdateOOBPasswordBySN(log, repo, &UpdateOOBPasswordReq{ + SN: dev.SN, + Username: defaultUser.Username, + PasswordOld: defaultUser.Password, + PasswordNew: GenPassword(), + }, conf) + return //success 2 + } + log.Infof("SN:%s get default oob user fail,err:%v", dev.SN, err) + + // 3 尝试oob导入账户 + ouInit := OOBUser{} + _ = json.Unmarshal([]byte(dev.OOBInit), &ouInit) + if ouInit.Password != "" { + encryptedPassword, err := utils.AESEncrypt(ouInit.Password, []byte(conf.Crypto.Key)) + if err != nil { + log.Errorf("SN: %s encrypt imported oob password fail", dev.SN) + return + } + if oobPingTest(log, oobIP, ouInit.Username, ouInit.Password, encryptedPassword) { + isYesLocal := model.YES + dev.OOBAccessible = &isYesLocal + dev.OOBUser = ouInit.Username + dev.OOBPassword = encryptedPassword + if _, err = repo.UpdateDevice(dev); err != nil { + log.Errorf("update oob accessible status fail,SN:%s,err:%v", dev.SN, err) + } + return //success 3 + } + } + }(i) + } + wg.Wait() + + return nil +} + + +// OOBInspectionOperateReq 带外巡检请求结构体 +type OOBInspectionOperateReq struct { + SN string `json:"sn"` // 序列号 + IP string `json:"ip"` // 内网IP + DataType string `json:"data_type"` //校验枚举值 [sensor sel all] +} + +type OOBInspectionOperateResp struct { + DataType string `json:"data_type"` //校验枚举值 [sensor sel all] + SensorData []*model.SensorData `json:"sensor_data"` + SelData []*model.SelData `json:"sel_data"` +} +// FieldMap 请求字段映射 +func (reqData *OOBInspectionOperateReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.SN: "sn", + &reqData.IP: "ip", + &reqData.DataType: "data_type", + } +} + +// OOBInspectionOperate 带外巡检操作[ipmimonitoring|ipmi-sel] +func OOBInspectionOperate(log logger.Logger, repo model.Repo, conf *config.Config, reqData *OOBInspectionOperateReq) (*OOBInspectionOperateResp, error) { + // 优先根据SN巡检,其次根据内网IP + var sn string + if reqData.SN != "" { + sn = reqData.SN + } else { + if reqData.IP != "" { + cond := model.IPPageCond{ + IP: reqData.IP, + } + items, err := repo.GetIPs(&cond, model.OneOrderBy("id", model.DESC), nil) + if err != nil { + return nil, err + } + for i := range items { + sn = items[i].SN + } + } + } + + m, err := repo.GetDeviceBySN(sn) + if err != nil { + return nil, err + } + + if m.OOBUser == "" || m.OOBPassword == "" { + log.Warnf("设备带外用户或密码为空,尝试找回,[SN:%s]", m.SN) + history, err := repo.GetLastOOBHistoryBySN(sn) + if err != nil { + log.Errorf("find back oob history by sn:%s fail,%s", sn, err.Error()) + return nil, fmt.Errorf("设备用户名密码为空,无法操作") + } else { + m.OOBUser = history.UsernameNew + m.OOBPassword = history.PasswordNew + } + } + + oobHost := utils.GetOOBHost(m.SN, m.Vendor, conf.Server.OOBDomain) + oobIP := oob.TransferHostname2IP(log, repo, m.SN, oobHost) + if oobIP == "" { + return nil, errors.New("未获取到带外IP") + } + oobUser := m.OOBUser + oobPassword, err := utils.AESDecrypt(m.OOBPassword, []byte(conf.Crypto.Key)) + if err != nil { + log.Debugf("descrypt password failure, err: %s", err.Error()) + return nil, err + } + // 仅对开电状态的机器发起巡检 + isPowerOn, err := OOBPowerStatus(log, oobIP, oobUser, string(oobPassword), m.OOBPassword) + if err != nil { + return nil, err + } + if !isPowerOn { + return nil, fmt.Errorf("设备为关电状态,无法巡检") + } + + switch reqData.DataType { + case "sensor": + var result = &OOBInspectionOperateResp{ + DataType: "sensor", + SensorData: nil, + SelData: nil, + } + // 调用ipmimonitoring工具采集传感器数据 + ipmiMonitor, err := oob.NewIPMImonitoring(log, oobIP, oobUser, string(oobPassword)) + if err != nil { + return nil, err + } + sensors, err := ipmiMonitor.CollectSensorData() + if err != nil { + log.Errorf("IPMI-Sensor data collection failed: %s", err.Error()) + return nil, err + } + if sensors != nil { + result.SensorData = sensors + return result, nil + } + return nil, fmt.Errorf("巡检数据(%s)为空", reqData.DataType) + case "sel": + var result = &OOBInspectionOperateResp{ + DataType: "sel", + SensorData: nil, + SelData: nil, + } + // 调用ipmi-sel工具采集系统事件日志 + ipmiSel, err := oob.NewIPMIsel(log, oobIP, oobUser, string(oobPassword)) + if err != nil { + return nil, err + } + sel, err := ipmiSel.CollectSelData() + if err != nil { + log.Errorf("IPMI-Sel data collection failed: %s", err.Error()) + return nil, err + } + if sel != nil { + result.SelData = sel + return result, nil + } + return nil, fmt.Errorf("巡检数据(%s)为空", reqData.DataType) + case "all": + var result = &OOBInspectionOperateResp{ + DataType: "all", + SensorData: nil, + SelData: nil, + } + // 调用ipmimonitoring工具采集传感器数据 + ipmiMonitor, err := oob.NewIPMImonitoring(log, oobIP, oobUser, string(oobPassword)) + if err != nil { + return nil, err + } + sensors, err := ipmiMonitor.CollectSensorData() + if err != nil { + log.Errorf("IPMI-Sensor data collection failed: %s", err.Error()) + return nil, err + } + if sensors != nil { + result.SensorData = sensors + } else { + log.Warnf("IPMI-Sensor data is empty") + } + // 调用ipmi-sel工具采集系统事件日志 + ipmiSel, err := oob.NewIPMIsel(log, oobIP, oobUser, string(oobPassword)) + if err != nil { + return result, err + } + sel, err := ipmiSel.CollectSelData() + if err != nil { + log.Errorf("IPMI-Sel data collection failed: %s", err.Error()) + return result, err + } + if sel != nil { + result.SelData = sel + return result, nil + } else { + log.Warnf("IPMI-Sel data is empty") + } + } + return nil, fmt.Errorf("巡检数据(%s)为空", reqData.DataType) +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/oob_test.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/oob_test.go new file mode 100644 index 0000000000000000000000000000000000000000..b2c334c5c3c754cd9cc680e87b9e7d9e6446f117 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/oob_test.go @@ -0,0 +1,23 @@ +package service + +import ( + "encoding/json" + "fmt" + "testing" +) + +func TestOObConfig(t *testing.T) { + var mapper map[string][]*OOBUser + + err := json.Unmarshal([]byte(OOBVendorConfig), &mapper) + if err != nil { + fmt.Println(err.Error()) + } + + for k, v := range mapper { + fmt.Println(fmt.Sprintf("%s: %s", k, v)) + } + + v := mapper["default"] + fmt.Println(v) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/operate_log.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/operate_log.go new file mode 100644 index 0000000000000000000000000000000000000000..7582a1102f164d945371aae56de5619278a24c58 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/operate_log.go @@ -0,0 +1,83 @@ +package service + +import ( + "net/http" + "reflect" + + "github.com/voidint/binding" + "github.com/voidint/page" + + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" +) + +//GetOperateLogPageReq 获取操作记录分页请求参数 +type GetOperateLogPageReq struct { + // 请求方式 + HTTPMethod string `json:"http_method"` + // 路由 + URL string `json:"url"` + // 源数据 + Source string `json:"source"` + // 目标数据 + Destination string `json:"destination"` + //操作类型 + CategoryCode string `json:"column:category_code"` + //操作类型名称 + CategoryName string `json:"column:category_name"` + // 分页页号 + Page int64 `json:"page"` + // 分页大小。默认值:10。阈值: 100。 + PageSize int64 `json:"page_size"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *GetOperateLogPageReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.HTTPMethod: "http_method", + &reqData.URL: "url", + &reqData.Source: "source", + &reqData.Destination: "destination", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + &reqData.CategoryCode: `category_code`, + &reqData.CategoryName: `category_name`, + } +} + +//GetOperateLogWithPage 获取操作记录分页 +func GetOperateLogWithPage(log logger.Logger, repo model.Repo, reqData *GetOperateLogPageReq) (*page.Page, error) { + if reqData.PageSize <= 0 || reqData.PageSize > 100 { + reqData.PageSize = 20 + } + if reqData.Page < 0 { + reqData.Page = 0 + } + + cond := model.OperateLog{ + HTTPMethod: reqData.HTTPMethod, + URL: reqData.URL, + Source: reqData.Source, + CategoryCode: reqData.CategoryCode, + CategoryName: reqData.CategoryName, + Destination: reqData.Destination, + } + + totalRecords, err := repo.CountOperateLog(&cond) + if err != nil { + return nil, err + } + + pager := page.NewPager(reflect.TypeOf(&model.OperateLog{}), reqData.Page, reqData.PageSize, totalRecords) + items, err := repo.GetOperateLogByCond(&cond, model.OneOrderBy("id", model.DESC), pager.BuildLimiter()) + if err != nil { + return nil, err + } + + for _, item := range items { + pager.AddRecords(item) + } + + return pager.BuildPage(), nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/order.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/order.go new file mode 100644 index 0000000000000000000000000000000000000000..fad53ef78b11d01fa7d98e64bc0683ae79848a9e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/order.go @@ -0,0 +1,802 @@ +package service + +import ( + "fmt" + "net/http" + + "github.com/voidint/binding" + + "reflect" + + "encoding/json" + stringsStd "strings" + "time" + + "strconv" + + "errors" + + "github.com/jinzhu/gorm" + "github.com/voidint/page" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils/strings" + "idcos.io/cloudboot/utils/times" +) + +//SaveOrderReq 保存订单请求参数 +type SaveOrderReq struct { + //(required) 所属数据中心ID + IDCID uint `json:"idc_id"` + //ServerRoomID 机房管理单元ID + ServerRoomID uint `json:"server_room_id"` + //PhysicalArea 物理区域 + PhysicalArea string `json:"physical_area"` + //订单ID。若id=0,则新增。若id>0,则修改。 + ID uint `json:"id"` + //Usage 用途 + Usage string `json:"usage"` + //Catetory 设备类型 + Category string `json:"category"` + //Amount 数量 + Amount int `json:"amount"` + //ExpectedArrivalDate 预计到货日期, 格式2006-01-02, 默认订单日期后45天 + ExpectedArrivalDate string `json:"expected_arrival_date"` + // 预占机架 + //PreOccupiedCabinets string `json:"pre_occupied_cabinets"` + // 预占机位, 因为机架机位都支持多选,为了方便,机位同时将机架信息带出,JSON形如:{"cabinet_id":1,"cabinet_number":"机架编号1", "usite_id":100,"usite_number":"机位编号100"} + PreOccupiedUsites string `json:"pre_occupied_usites"` + // 参考 DeviceLifecycle + AssetBelongs string `json:"asset_belongs"` + Owner string `json:"owner"` + IsRental string `json:"is_rental"` + MaintenanceServiceProvider string `json:"maintenance_service_provider"` + MaintenanceService string `json:"maintenance_service"` + LogisticsService string `json:"logistics_service"` + MaintenanceServiceDateBegin string `json:"maintenance_service_date_begin"` + MaintenanceServiceDateEnd string `json:"maintenance_service_date_end"` + // Remark 备注 + Remark string `json:"remark"` + // 用户登录名 + LoginName string `json:"-"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *SaveOrderReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDCID: "idc_id", + &reqData.ServerRoomID: "server_room_id", + &reqData.PhysicalArea: "physical_area", + &reqData.ID: "id", + &reqData.Usage: "usage", + &reqData.Category: "category", + &reqData.Amount: "amount", + &reqData.ExpectedArrivalDate: "expected_arrival_date", + &reqData.PreOccupiedUsites: "pre_occupied_usites", + &reqData.AssetBelongs: "asset_belongs", + &reqData.Owner: "owner", + &reqData.IsRental: "is_rental", + &reqData.MaintenanceServiceProvider: "maintenance_service_provider", + &reqData.MaintenanceService: "maintenance_service", + &reqData.LogisticsService: "logistics_service", + &reqData.MaintenanceServiceDateBegin: "maintenance_service_date_begin", + &reqData.MaintenanceServiceDateEnd: "maintenance_service_date_end", + &reqData.Remark: "remark", + } +} + +// Validate 结构体数据校验 +func (reqData *SaveOrderReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + //必须的基本数据不能为空 + if errs = reqData.baseValidate(req, errs); errs != nil { + return errs + } + + //更新订单信息,校验指定ID的订单是否存在 + if reqData.ID > 0 { + if _, err := repo.GetOrderByID(reqData.ID); errs != nil { + errs.Add([]string{"id"}, binding.RequiredError, fmt.Sprintf("查询订单id(%d)出现错误: %s", reqData.ID, err.Error())) + return errs + } + } + + //校验IDC数据 + if errs = reqData.checkIDCValidate(req, errs); errs != nil { + return errs + } + + return errs +} + +func (reqData *SaveOrderReq) checkIDCValidate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + + _, err := repo.GetIDCByID(reqData.IDCID) + if err != nil { + errs.Add([]string{"idc"}, binding.RequiredError, fmt.Sprintf("获取数据中心id(%d)出现错误: %s", reqData.IDCID, err.Error())) + return errs + } + sr, err := repo.GetServerRoomByID(reqData.ServerRoomID) + if err != nil || sr == nil { + errs.Add([]string{"server_room"}, binding.RequiredError, fmt.Sprintf("获取机房管理单元id(%d)出现错误: %s", reqData.ServerRoomID, err.Error())) + return errs + } + //检查机房下的可用机位是否不小于订单总量 + if freeCount, _ := repo.CountServerUSite(&model.CombinedServerUSite{ + ServerRoomID: []uint{reqData.ServerRoomID}, + Status: model.USiteStatFree}); freeCount < int64(reqData.Amount) { + errs.Add([]string{"amount"}, binding.RequiredError, fmt.Sprintf("机房(%s)的可用机位总数(%d)小于订单总量(%d)", sr.Name, freeCount, reqData.Amount)) + return errs + } + us := make([]PreOccupiedUsiteData, 0) + if err := json.Unmarshal([]byte(reqData.PreOccupiedUsites), &us); err != nil { + errs.Add([]string{"amount"}, binding.BusinessError, fmt.Sprintf("校验机位数量失败:%v", err)) + return errs + } else if int(len(us)) != reqData.Amount { + errs.Add([]string{"amount"}, binding.BusinessError, fmt.Sprintf("勾选机位数(%d)不等于订单总数(%d)", len(us), reqData.Amount)) + return errs + } + return errs + +} + +//baseValidate 必要参数不能为空 +func (reqData *SaveOrderReq) baseValidate(req *http.Request, errs binding.Errors) binding.Errors { + if reqData.IDCID == 0 { + errs.Add([]string{"idc_id"}, binding.RequiredError, "数据中心ID不能为空") + return errs + } + + if reqData.ServerRoomID == 0 { + errs.Add([]string{"name"}, binding.RequiredError, "机房管理单元不能为空") + return errs + } + + if reqData.PhysicalArea == "" { + errs.Add([]string{"physical_area"}, binding.RequiredError, "物理区域不能为空") + return errs + } + + if reqData.Usage == "" { + errs.Add([]string{"usage"}, binding.RequiredError, "用途不能为空") + return errs + } + + if reqData.Category == "" { + errs.Add([]string{"category"}, binding.RequiredError, "设备类型不能为空") + return errs + } + if reqData.Amount == 0 { + errs.Add([]string{"amount"}, binding.RequiredError, "订单数量不能为空") + return errs + } + if reqData.PreOccupiedUsites == "" { + errs.Add([]string{"pre_occupied_usites"}, binding.RequiredError, "预占机位不能为空") + return errs + } + + return errs +} + +type DelOrderReq struct { + IDs []uint `json:"ids"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *DelOrderReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDs: "ids", + } +} + +// Validate 结构体数据校验 +func (reqData *DelOrderReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + for _, id := range reqData.IDs { + if _, err := repo.GetOrderByID(id); err != nil { + errs.Add([]string{"id"}, binding.RequiredError, fmt.Sprintf("订单id(%d)不存在", id)) + return errs + } + } + return nil +} + +type UpdateOrderStatusReq struct { + ID uint `json:"id"` + Status string `json:"status"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *UpdateOrderStatusReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.ID: "id", + &reqData.Status: "status", //"purchasing|partly_arrived|all_arrived|canceled|finished" + } +} + +// Validate 结构体数据校验 +func (reqData *UpdateOrderStatusReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + if _, err := repo.GetOrderByID(reqData.ID); err != nil { + errs.Add([]string{"id"}, binding.RequiredError, fmt.Sprintf("订单id(%d)不存在", reqData.ID)) + return errs + } + switch reqData.Status { + case model.OrderStatusPurchasing: + case model.OrderStatusPartlyArrived: + case model.OrderStatusAllArrived: + case model.OrderStatusCanceled: + case model.OrderStatusfinished: + default: + errs.Add([]string{"status"}, binding.RequiredError, fmt.Sprintf("状态值(%s)非法,合法值[%s]", + "purchasing|partly_arrived|all_arrived|canceled|finished", reqData.Status)) + return errs + } + return nil +} + +//SaveOrder 保存订单 +func SaveOrder(log logger.Logger, repo model.Repo, reqData *SaveOrderReq) error { + sr := model.Order{ + IDCID: reqData.IDCID, + ServerRoomID: reqData.ServerRoomID, + PhysicalArea: reqData.PhysicalArea, + Usage: reqData.Usage, + Category: reqData.Category, + Amount: reqData.Amount, + AssetBelongs: reqData.AssetBelongs, + Owner: reqData.Owner, + IsRental: reqData.IsRental, + MaintenanceServiceProvider: reqData.MaintenanceServiceProvider, + MaintenanceService: reqData.MaintenanceService, + LogisticsService: reqData.LogisticsService, + PreOccupiedUsites: reqData.PreOccupiedUsites, + Remark: reqData.Remark, + Status: model.OrderStatusPurchasing, + Creator: reqData.LoginName, + } + if reqData.ID != 0 { + origin, _ := repo.GetOrderByID(reqData.ID) + sr.Model = origin.Model + if origin != nil { + sr.LeftAmount = origin.LeftAmount + reqData.Amount - origin.Amount + } + } else { + sr.LeftAmount = reqData.Amount //初始状态,未到货数等于订单总数 + } + + if reqData.ExpectedArrivalDate != "" { + t, err := time.Parse(times.DateLayout, reqData.ExpectedArrivalDate) + if err != nil { + log.Errorf("parse time %s err:%v", reqData.ExpectedArrivalDate, err) + sr.ExpectedArrivalDate = time.Now().AddDate(0, 0, 45) + } else { + sr.ExpectedArrivalDate = t + } + } else { + sr.ExpectedArrivalDate = time.Now().AddDate(0, 0, 45) + } + if reqData.MaintenanceServiceDateBegin != "" { + t, err := time.Parse(times.DateLayout, reqData.MaintenanceServiceDateBegin) + if err != nil { + log.Errorf("parse time %s err:%v", reqData.MaintenanceServiceDateBegin, err) + sr.MaintenanceServiceDateBegin = time.Now().AddDate(0, 0, 45) + } else { + sr.MaintenanceServiceDateBegin = t + } + } else { + sr.MaintenanceServiceDateBegin = time.Now().AddDate(0, 0, 45) + } + if reqData.MaintenanceServiceDateEnd != "" { + t, err := time.Parse(times.DateLayout, reqData.MaintenanceServiceDateEnd) + if err != nil { + log.Errorf("parse time %s err:%v", reqData.MaintenanceServiceDateEnd, err) + sr.MaintenanceServiceDateEnd = time.Now().AddDate(5, 0, 0) + } else { + sr.MaintenanceServiceDateEnd = t + } + } else { + sr.MaintenanceServiceDateEnd = time.Now().AddDate(5, 0, 0) + } + + sr.Number = GenOrderNumber(repo, reqData.IDCID) + + _, err := repo.SaveOrder(&sr) + if err != nil { + return err + } + + //将机架机位预占用 + us := make([]PreOccupiedUsiteData, 0) + if err := json.Unmarshal([]byte(reqData.PreOccupiedUsites), &us); err != nil { + log.Errorf("unmarshal usites(%s) fail,%v", reqData.PreOccupiedUsites, err) + return err + } + ids := make([]uint, len(us)) + for _, u := range us { + ids = append(ids, u.Value) + } + _, err = BatchUpdateServerUSitesStatus(repo, ids, model.USiteStatPreOccupied) + + reqData.ID = sr.Model.ID + return err +} + +//RemoveOrders 删除指定ID的订单 +func RemoveOrders(log logger.Logger, repo model.Repo, reqData *DelOrderReq) (affected int64, err error) { + for _, id := range reqData.IDs { + //释放预占用机位 + if _, err = ReleasePreOccupiedUsites(log, repo, id); err != nil { + log.Errorf("release order(id=%d) fail, err:%v", id, err) + return affected, err + } + _, err := repo.RemoveOrderByID(id) + if err != nil { + log.Errorf("delete order(id=%d) fail,err:%v", id, err) + return affected, err + } + + affected++ + } + return affected, err +} + +// 根据到货数,更新订单的状态 +func UpdateOrderByArrival(log logger.Logger, repo model.Repo, orderNum string, arrivalCount int) (err error) { + if orderNum == "" { + return errors.New("订单号为空,更新失败") + } + order, err := repo.GetOrderByNumber(orderNum) + if err != nil { + log.Errorf("get order by number:%s fail,%v", orderNum, err) + return fmt.Errorf("订单:%s不存在", orderNum) + } + switch order.Status { + case model.OrderStatusCanceled: + return fmt.Errorf("订单:%s已取消", order.Number) + case model.OrderStatusfinished: + return fmt.Errorf("订单:%s已确认完成", order.Number) + } + + if order != nil { + delta := order.LeftAmount - arrivalCount + if delta < 0 { + log.Errorf("order(number:%s) amount:%d should not be less than arrival count:%d", orderNum, order.Amount, arrivalCount) + return fmt.Errorf("订单(%s)新增到货数:%d应不大于剩余到货数量数量:%d", orderNum, arrivalCount, order.LeftAmount) + } else if delta == 0 { + order.Status = model.OrderStatusAllArrived + } else { + order.Status = model.OrderStatusPartlyArrived + } + order.LeftAmount = delta + } + if _, err := repo.SaveOrder(order); err != nil { + log.Error(err) + return err + } + return nil +} + +// 待部署列表删除设备时,根据订单号与数量更新订单的状态 +func UpdateOrderByDelete(log logger.Logger, repo model.Repo, orderNum string, deleteCount int) (err error) { + if orderNum == "" { + return errors.New("订单号为空,更新失败") + } + order, err := repo.GetOrderByNumber(orderNum) + if err != nil { + log.Errorf("get order by number:%s fail,%v", orderNum, err) + return fmt.Errorf("订单:%s不存在", orderNum) + } + switch order.Status { + case model.OrderStatusCanceled: + return fmt.Errorf("订单:%s已取消", order.Number) + case model.OrderStatusfinished: + return fmt.Errorf("订单:%s已确认完成", order.Number) + } + + if order != nil { + delta := order.LeftAmount + deleteCount + if delta > order.Amount { + log.Errorf("order(number:%s) amount:%d should not be less than (left count + delete count) %d", orderNum, order.Amount, delta) + return fmt.Errorf("订单(%s)剩余到货数量:%d 与删除设备数之和(%d)不应大于订单设备数(%d)", orderNum, order.LeftAmount, delta, order.Amount) + } else if delta == order.Amount { + order.Status = model.OrderStatusPurchasing + } else { + order.Status = model.OrderStatusPartlyArrived + } + order.LeftAmount = delta + } + if _, err := repo.SaveOrder(order); err != nil { + log.Error(err) + return err + } + return nil +} + +//GetOrderPageReq 获取订单分页请求参数 +type GetOrderPageReq struct { + ID string `json:"id"` + Number string `json:"number"` + PhysicalArea string + Status string `json:"status"` + Usage string `json:"usage"` + Page int64 `json:"page"` + PageSize int64 `json:"page_size"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *GetOrderPageReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.ID: "id", + &reqData.Number: "number", + &reqData.PhysicalArea: "physical_area", + &reqData.Status: "status", + &reqData.Usage: "usage", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + } +} + +//OrderResp 订单分页查询信息 +type OrderResp struct { + //数据中心 + IDC *IDCSimplify `json:"idc"` + //机房管理单元 + ServerRoom *ServerRoomSimplify `json:"server_room"` + //PhysicalArea 物理区域 + PhysicalArea string `json:"physical_area"` + //订单ID。 + ID uint `json:"id"` + //订单编号 + Number string `json:"number"` + //Usage 用途 + Usage string `json:"usage"` + //Catetory 设备类型 + Category string `json:"category"` + //Amount 数量 + Amount int `json:"amount"` + //LeftAmount未到货数 + LeftAmount int `json:"left_amount"` + //ExpectedArrivalDate 预计到货日期 + ExpectedArrivalDate string `json:"expected_arrival_date"` + // 预占机位 + PreOccupiedUsites string `json:"pre_occupied_usites"` + // 参考 DeviceLifecycle + AssetBelongs string `json:"asset_belongs"` + Owner string `json:"owner"` + IsRental string `json:"is_rental"` + MaintenanceServiceProvider string `json:"maintenance_service_provider"` + MaintenanceService string `json:"maintenance_service"` + LogisticsService string `json:"logistics_service"` + MaintenanceServiceDateBegin string `json:"maintenance_service_date_begin"` + MaintenanceServiceDateEnd string `json:"maintenance_service_date_end"` + // Remark 备注 + Remark string `json:"remark"` + // Status 状态 + Status string `json:"status"` + Creator string `json:"creator"` + CreatedAt times.ISOTime `json:"created_at"` + UpdatedAt times.ISOTime `json:"updated_at"` +} + +//GetOrdersPage 获取订单分页 +func GetOrdersPage(log logger.Logger, repo model.Repo, reqData *GetOrderPageReq) (*page.Page, error) { + if reqData.PageSize <= 0 || reqData.PageSize > 100 { + reqData.PageSize = 20 + } + if reqData.Page < 0 { + reqData.Page = 0 + } + + cond := model.OrderCond{ + ID: strings.Multi2UintSlice(reqData.ID), + } + cond.Order.Number = reqData.Number + cond.Order.PhysicalArea = reqData.PhysicalArea + cond.Order.Usage = reqData.Usage + cond.Order.Status = reqData.Status + + totalRecords, err := repo.CountOrders(&cond) + if err != nil { + return nil, err + } + + pager := page.NewPager(reflect.TypeOf(&OrderResp{}), reqData.Page, reqData.PageSize, totalRecords) + items, err := repo.GetOrders(&cond, model.OneOrderBy("id", model.DESC), pager.BuildLimiter()) + if err != nil { + return nil, err + } + for i := range items { + item, err := convert2OrderResult(log, repo, items[i]) + if err != nil { + return nil, err + } + if item != nil { + pager.AddRecords(item) + } + } + return pager.BuildPage(), nil +} + +//GetExportOrders +func GetExportOrders(log logger.Logger, repo model.Repo, reqData *GetOrderPageReq) ([]*OrderResp, error) { + rst := make([]*OrderResp, 0) + cond := model.OrderCond{ + ID: strings.Multi2UintSlice(reqData.ID), + } + cond.Order.Number = reqData.Number + cond.Order.Usage = reqData.Usage + cond.Order.Status = reqData.Status + + items, err := repo.GetOrders(&cond, model.OneOrderBy("id", model.DESC), nil) + if err != nil { + return nil, err + } + for i := range items { + item, err := convert2OrderResult(log, repo, items[i]) + if err != nil { + return nil, err + } + if item != nil { + rst = append(rst, item) + } + } + return rst, nil +} + +func convert2OrderResult(log logger.Logger, repo model.Repo, o *model.Order) (*OrderResp, error) { + if o == nil { + return nil, nil + } + result := OrderResp{ + IDC: &IDCSimplify{ID: o.IDCID}, + ServerRoom: &ServerRoomSimplify{ID: o.ServerRoomID}, + ID: o.Model.ID, + CreatedAt: times.ISOTime(o.CreatedAt), + UpdatedAt: times.ISOTime(o.UpdatedAt), + PhysicalArea: o.PhysicalArea, + Number: o.Number, + Usage: o.Usage, + Category: o.Category, + Amount: o.Amount, + LeftAmount: o.LeftAmount, + ExpectedArrivalDate: o.ExpectedArrivalDate.Format(times.DateLayout), + AssetBelongs: o.AssetBelongs, + Owner: o.Owner, + IsRental: o.IsRental, + MaintenanceServiceProvider: o.MaintenanceServiceProvider, + MaintenanceService: o.MaintenanceService, + LogisticsService: o.LogisticsService, + MaintenanceServiceDateBegin: o.MaintenanceServiceDateBegin.Format(times.DateLayout), + MaintenanceServiceDateEnd: o.MaintenanceServiceDateEnd.Format(times.DateLayout), + Remark: o.Remark, + Status: o.Status, + Creator: o.Creator, + } + result.PreOccupiedUsites, _ = formatUsite(repo, o.PreOccupiedUsites, log) + + idc, err := repo.GetIDCByID(o.IDCID) + if err != nil && err != gorm.ErrRecordNotFound { + return nil, err + } + if idc != nil { + result.IDC.Name = idc.Name + } + + sroom, err := repo.GetServerRoomByID(o.ServerRoomID) + if err != nil && err != gorm.ErrRecordNotFound { + return nil, err + } + if sroom != nil { + result.ServerRoom.Name = sroom.Name + } + + return &result, nil +} + +//GetOrderByID 获取指定ID的订单的详细信息 +func GetOrderByID(log logger.Logger, repo model.Repo, id uint) (*OrderResp, error) { + items, err := repo.GetOrderByID(id) + if err != nil { + return nil, err + } + + item, err := convert2OrderResult(log, repo, items) + if err != nil { + return nil, err + } + return item, nil +} + +//UpdateOrderStatus 获取指定ID的订单的详细信息 +func UpdateOrderStatus(log logger.Logger, repo model.Repo, reqData *UpdateOrderStatusReq) error { + mod := model.Order{ + Status: reqData.Status, + } + mod.Model.ID = reqData.ID + + _, err := repo.UpdateOrder(&mod) + if err != nil { + return err + } + + switch reqData.Status { + //case model.OrderStatusPurchasing: 这个是订单生成的默认状态:采购中 + case model.OrderStatusPartlyArrived: + //当按订单导入时,但到货数量小于订单数量,此时为部分到货状态。 + case model.OrderStatusAllArrived: + //当按订单导入时,但到货数量等于订单数量,此时为全部到货状态。 + case model.OrderStatusCanceled: + //订单被取消 + fallthrough + case model.OrderStatusfinished: + //订单已确认 + _, err = ReleasePreOccupiedUsites(log, repo, reqData.ID) + } + return err +} + +var GlobalDailyCount = make(map[string]int, 1) //每天滚动计数,只缓存一天的数据 + +//生成订单号的,简单实现版本 +func GenOrderNumber(repo model.Repo, idcID uint) string { + //格式:IDC+$idcID+YYMMDD+001, 如 IDC120190617001 + _ = repo + //今天是几号:20190617 + date := time.Now().Format("20060102") + yesterday := time.Now().AddDate(0, 0, -1).Format("20060102") + if _, ok := GlobalDailyCount[date]; ok { + GlobalDailyCount[date]++ + } else { + //TODO:如果是服务重启,从db中恢复最大的订单号 + dbMax, _ := repo.GetMaxOrderNumber(date) + //如果是新的一天,计数从1开始计 + GlobalDailyCount[date] = dbMax + 1 + //把昨天的计数清零,以免内存逐渐增大 + delete(GlobalDailyCount, yesterday) + + } + return fmt.Sprintf("IDC%d%s%03d", idcID, date, GlobalDailyCount[date]) +} + +//OrderStatusTransfer 订单状态值和数据库存储值的转换 +func OrderStatusTransfer(status string, reverse bool) string { + mStatus := map[string]string{ + "采购中": "purchasing", + "部分到货": "partly_arrived", + "全部到货": "all_arrived", + "已取消": "canceled", + "已完成": "finished", + } + if !reverse { + if val, ok := mStatus[status]; ok { + return val + } + } else { + for key, val := range mStatus { + if val == status { + return key + } + } + } + return "" +} + +type PreOccupiedUsiteData struct { + Label string //对应于机位编号 + Value uint //对应于机位ID +} + +// 释放预占用的机位 +// 由于预占用的机位跟实际导入的机位有可能不一致,所以 +// 当订单取消时,可以直接释放预占用的机位 +// 确认订单时,释放当前仍为"预占用"的机位信息。如果机位已被导入设备,此时应该时"已使用"状态, 那是不能释放的。 +func ReleasePreOccupiedUsites(log logger.Logger, repo model.Repo, oid uint) (affected int64, err error) { + order, err := repo.GetOrderByID(oid) + if err != nil { + log.Errorf("get order by id(%d) fail, %v", oid, err) + return 0, err + } + us := make([]PreOccupiedUsiteData, 0) + if err := json.Unmarshal([]byte(order.PreOccupiedUsites), &us); err != nil { + log.Errorf("unmarshal usites(%s) fail,%v", order.PreOccupiedUsites, err) + return 0, err + } + ids := make([]uint, len(us)) + for _, u := range us { + cur, err := repo.GetServerUSiteByID(u.Value) + if err != nil { + log.Errorf("get usite by id(%d) fail, %v", u.Value, err) + return 0, err + } + if cur.Status == model.USiteStatPreOccupied { + ids = append(ids, cur.ID) + } + } + return BatchUpdateServerUSitesStatus(repo, ids, model.USiteStatFree) +} + +// ExportedOrders 导出订单详情集合 +type ExportedOrders []*OrderResp + +// ToTableRecords 生成用于表格显示的二维字符串切片 +func (items ExportedOrders) ToTableRecords() (records [][]string) { + records = make([][]string, 0, len(items)) + + for i := range items { + idcName := "" + if items[i].IDC != nil { + idcName = items[i].IDC.Name + } + serverRoomName := "" + if items[i].ServerRoom != nil { + serverRoomName = items[i].ServerRoom.Name + } + records = append(records, []string{ + items[i].Number, + items[i].PhysicalArea, + items[i].Usage, + items[i].Category, + strconv.Itoa(int(items[i].Amount)), + idcName, + serverRoomName, + items[i].PreOccupiedUsites, + items[i].ExpectedArrivalDate, + }) + } + return records +} + +// 把预占机位格式化输出 +func formatUsite(repo model.Repo, jsonU string, log logger.Logger) (string, error) { + us := make([]PreOccupiedUsiteData, 0) + if err := json.Unmarshal([]byte(jsonU), &us); err != nil { + log.Errorf("unmarshal usites(%s) fail,%v", jsonU, err) + return "", err + } + // 构造一棵机架机位树 + // cabient-number1 + // usiteA + // usiteB + // cabient-number2 + // usiteA + // usiteB + tree := make(map[string][]string, 0) + //ulist := make([]string, 0) + for _, u := range us { + cur, err := repo.GetServerUSiteByID(u.Value) + if err != nil { + log.Errorf("get usite by id(%d) fail, %v", u.Value, err) + return "", err + } + cabinet, err := repo.GetServerCabinetByID(cur.ServerCabinetID) + if err != nil { + log.Errorf("get server cabinet by id(%d) fail, %v", cur.ServerCabinetID, err) + return "", err + } + tree[cabinet.Number] = append(tree[cabinet.Number], cur.Number) + } + + lines := make([]string, 0) + for key, vals := range tree { + lines = append(lines, fmt.Sprintf("%s:", key)) + groupSize := 5 //每行显示几个 + for i := 0; i < len(vals); i++ { + j := i / groupSize + if i%groupSize == 0 { + if groupSize*(i+1) > len(vals) { + lines = append(lines, fmt.Sprintf("\t%s", stringsStd.Join(vals[j*groupSize:], ";"))) + } else /*if len(vals) > groupSize*i */ { + lines = append(lines, fmt.Sprintf("\t%s", stringsStd.Join(vals[j*groupSize:(j+1)*groupSize], ";"))) + } + } + } + } + return stringsStd.Join(lines, "\n"), nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/os_template.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/os_template.go new file mode 100644 index 0000000000000000000000000000000000000000..06616e0ced8f52d2a74254fc9640ca713cd368fd --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/os_template.go @@ -0,0 +1,197 @@ +package service + +import ( + "fmt" + "net/http" + "strings" + + "github.com/voidint/binding" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" +) + +// TemplateReq 模板参数 +type TemplateReq struct { + // 安装方式。可选值: image-镜像安装模板; pxe-PXE安装模板; + InstallType string `json:"install_type"` + // 操作系统族系 + Family string `json:"family"` + // 启动模式。可选值: legacy_bios-传统BIOS模式; uefi-UEFI模式; + BootMode string `json:"boot_mode"` + // 模板名(支持模糊查询) + Name string `json:"name"` + OSLifecycle string `json:"os_lifecycle"` // OS生命周期:Testing|Active(Default)|Active|Containment|EOL + Arch string `json:"arch"` // OS架构平台:x86_64|aarch64 +} + +// SaveTemplateReq 新增、修改模板接口 +type SaveTemplateReq struct { + ID uint `json:"id"` + // 安装方式。可选值: image-镜像安装模板; pxe-PXE安装模板; + InstallType string `json:"install_type"` + // 操作系统族系 + Family string `json:"family"` + // 启动模式。可选值: legacy_bios-传统BIOS模式; uefi-UEFI模式; + BootMode string `json:"boot_mode"` + // 模板名(支持模糊查询) + Name string `json:"name"` + OSLifecycle string `json:"os_lifecycle"` // OS生命周期:Testing|Active(Default)|Active|Containment|EOL + Arch string `json:"arch"` // OS架构平台:x86_64|aarch64 +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *SaveTemplateReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.InstallType: "install_type", + &reqData.Family: "family", + &reqData.Name: "name", + &reqData.BootMode: "boot_mode", + &reqData.ID: "id", + &reqData.OSLifecycle: "os_lifecycle", + &reqData.Arch: "arch", + } +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *TemplateReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.InstallType: "install_type", + &reqData.Family: "family", + &reqData.Name: "name", + &reqData.BootMode: "boot_mode", + &reqData.OSLifecycle: "os_lifecycle", + &reqData.Arch: "arch", + } +} + +// Validate 结构体数据校验 +func (reqData *TemplateReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + + if reqData.InstallType != "" { + if !(reqData.InstallType == model.InstallationPXE || reqData.InstallType == model.InstallationImage) { + errs.Add([]string{"os_template"}, binding.RequiredError, fmt.Sprintf("安装类型参数不正确 %s, 可选值: image-镜像安装模板; pxe-PXE安装模板", reqData.InstallType)) + } + } + + if reqData.BootMode != "" { + if !(reqData.BootMode == model.BootModeUEFI || reqData.BootMode == model.BootModeBIOS) { + errs.Add([]string{"os_template"}, binding.RequiredError, fmt.Sprintf("启动模式参数不正确 %s, 可选值: legacy_bios-传统BIOS模式; uefi-UEFI模式", reqData.InstallType)) + + } + } + return errs +} + +// OsTemplateResp 模板参数返回值 +type OsTemplateResp struct { + // 安装方式。可选值: image-镜像安装模板; pxe-PXE安装模板; + InstallType string `json:"install_type"` + // 操作系统族系 + Family string `json:"family"` + // 启动模式。可选值: legacy_bios-传统BIOS模式; uefi-UEFI模式; + BootMode string `json:"boot_mode"` + // 模板名(支持模糊查询) + Name string `json:"name"` + // 主键 + ID uint `json:"id"` + OSLifecycle string `json:"os_lifecycle"` // OS生命周期:Testing|Active(Default)|Active|Containment|EOL + Arch string `json:"arch"` // OS架构平台:x86_64|aarch64 +} + +// TemplateRecordsResp 操作系统模板返回体 +type TemplateRecordsResp struct { + Records []*OsTemplateResp `json:"records"` +} + +// GetTemplatesByCond 根据查询条件查询模板信息 +func GetTemplatesByCond(log logger.Logger, repo model.Repo, cond *TemplateReq) (items []*OsTemplateResp, err error) { + + commonCond := model.CommonTemplateCond{ + Family: cond.Family, + BootMode: cond.BootMode, + Name: cond.Name, + OSLifecycle: cond.OSLifecycle, + Arch: cond.Arch, + } + + if cond.InstallType == model.InstallationImage { + imageTmps, err := repo.GetImageTemplatesByCond(&commonCond) + if err != nil { + return nil, err + } + + for _, imageTmp := range imageTmps { + items = append(items, imageTemplateConvert(imageTmp)) + } + + return items, nil + } + + if cond.InstallType == model.InstallationPXE { + systemTmps, err := repo.GetSystemTemplatesByCond(&commonCond) + if err != nil { + return nil, err + } + for _, systemTmp := range systemTmps { + if systemTmp.Name == "bootos" || systemTmp.Name == "local" { + continue + } + items = append(items, systemTemplateConvert(systemTmp)) + } + return items, nil + } + + imageTemplates, err := repo.GetImageTemplatesByCond(&commonCond) + if err != nil { + return nil, err + } + + for _, imageTmp := range imageTemplates { + items = append(items, imageTemplateConvert(imageTmp)) + } + + systemTemplates, err := repo.GetSystemTemplatesByCond(&commonCond) + if err != nil { + return nil, err + } + for _, systemTmp := range systemTemplates { + if strings.Contains(systemTmp.Name, "bootos") || systemTmp.Name == "local" || systemTmp.Name == "winpe2012_x86_64" { + continue + } + items = append(items, systemTemplateConvert(systemTmp)) + } + + for i, resp := range items { + resp.ID = uint(i + 1) + } + + return items, nil +} + +// imageTemplateConvert 镜像模板转换 +func imageTemplateConvert(template *model.ImageTemplate) *OsTemplateResp { + return &OsTemplateResp{ + InstallType: model.InstallationImage, + Family: template.Family, + BootMode: template.BootMode, + Name: template.Name, + ID: template.ID, + OSLifecycle: template.OSLifecycle, + Arch: template.Arch, + } +} + +// systemTemplateConvert 系统模板转换 +func systemTemplateConvert(template *model.SystemTemplate) *OsTemplateResp { + return &OsTemplateResp{ + InstallType: model.InstallationPXE, + Family: template.Family, + BootMode: template.BootMode, + Name: template.Name, + ID: template.ID, + OSLifecycle: template.OSLifecycle, + Arch: template.Arch, + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/permission.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/permission.go new file mode 100644 index 0000000000000000000000000000000000000000..095443df8d96398ffc9ebec9371675ba089120cc --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/permission.go @@ -0,0 +1,59 @@ +package service + +import ( + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" +) + +// PermissionCodeNode 权限码节点 +type PermissionCodeNode struct { + ID uint `json:"-"` + PID uint `json:"-"` + Code string `json:"id"` + Title string `json:"title"` + Note string `json:"note"` + Children []*PermissionCodeNode `json:"children"` +} + +// PermissionCodeTree 查询权限码节点树 +// 未检索到调用处,已废弃 - 2021-09-03 +func PermissionCodeTree(log logger.Logger, repo model.Repo) (*PermissionCodeNode, error) { + all, err := repo.GetPermissionCodes(nil, nil, nil) + if err != nil { + return nil, err + } + nodes := make([]*PermissionCodeNode, 0, len(all)) + for _, node := range all { + nodes = append(nodes, &PermissionCodeNode{ + ID: node.ID, + PID: node.PID, + Code: node.Code, + Title: node.Title, + Note: node.Note, + Children: []*PermissionCodeNode{}, + }) + } + + root := PermissionCodeNode{ + Title: "所有权限", + Children: []*PermissionCodeNode{}, + } + + for i := range nodes { + var matched bool // 是否已经找到到父节点 + for j := range nodes { + if nodes[i] == nil || nodes[j] == nil || nodes[i].ID == nodes[j].ID { + continue + } + if nodes[i].PID == nodes[j].ID { + nodes[j].Children = append(nodes[j].Children, nodes[i]) + matched = true + } + } + if !matched { + root.Children = append(root.Children, nodes[i]) + } + } + + return &root, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/pxe.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/pxe.go new file mode 100644 index 0000000000000000000000000000000000000000..94a1452bc895d568e3fa6c6961399a898290106b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/pxe.go @@ -0,0 +1,328 @@ +package service + +import ( + "fmt" + "io/ioutil" + "net/http" + "os" + "path/filepath" + "strings" + + "idcos.io/cloudboot/utils/pxe" + + "github.com/jinzhu/gorm" + "github.com/voidint/binding" + + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils/centos6" +) + +// GenPXEReq 生成pxe文件请求参数 +type GenPXEReq struct { + SN string `json:"-"` + MAC string `json:"mac"` +} + +// FieldMap 请求字段映射 +func (reqData *GenPXEReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.MAC: "mac", + } +} + +// Validate 装机参数校验 +func (reqData *GenPXEReq) Validate(r *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(r.Context()) + + if reqData.SN == "" { + errs.Add([]string{"sn"}, binding.RequiredError, "SN不能为空") + return errs + } + _, err := repo.GetDeviceBySN(reqData.SN) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"sn"}, binding.BusinessError, http.StatusText(http.StatusNotFound)) + return errs + } + if err != nil { + errs.Add([]string{"sn"}, binding.SystemError, "系统内部错误") + return errs + } + // TODO 校验目标设备是否包含指定mac地址的网卡 + sett, err := repo.GetDeviceSettingBySN(reqData.SN) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"sn"}, binding.BusinessError, "该物理机还未部署上架") + return errs + } + if err != nil { + errs.Add([]string{"sn"}, binding.SystemError, "系统内部错误") + return errs + } + if sett.InstallType == model.InstallationImage { + errs.Add([]string{"sn"}, binding.BusinessError, "该物理机使用镜像方式安装,无需生成PXE文件。") + return errs + } + // TODO 校验当前设备是否处于操作系统安装过程中 + _, err = repo.GetSystemTemplateBySN(reqData.SN) + if gorm.IsRecordNotFoundError(err) { + errs.Add([]string{"sn"}, binding.BusinessError, fmt.Sprintf("未找到id为%d的系统模板", sett.SystemTemplateID)) + return errs + } + return errs +} + +const ( + // pxeDir 生成PXE文件的目录 + pxeDir = "/var/lib/tftpboot" + // dhcpFilename DHCP配置文件路径 + dhcpFilename = "/etc/dhcp/dhcpd.conf" +) + +// GenPXE 为指定设备在本地目录生成PXE文件 +func GenPXE(log logger.Logger, repo model.Repo, reqData *GenPXEReq) (filename string, err error) { + sysTemplate, err := repo.GetSystemTemplateBySN(reqData.SN) + if err != nil { + return "", err + } + if err = os.MkdirAll(pxeDir, 0755); err != nil { + log.Error(err) + return "", err + } + + filename = filepath.Join(pxeDir, fmt.Sprintf("grub.cfg-01-%s", strings.Replace(reqData.MAC, ":", "-", -1))) + if err = ioutil.WriteFile(filename, []byte(sysTemplate.PXE), 0644); err != nil { + log.Error(err) + return "", err + } + return filename, nil +} + +// GenPXE4CentOS6UEFIReq 请求结构体 +type GenPXE4CentOS6UEFIReq struct { + SN string `json:"-"` + MAC string `json:"mac"` +} + +// FieldMap 请求字段映射 +func (reqData *GenPXE4CentOS6UEFIReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.MAC: "mac", + } +} + +// GenPXE4CentOS6UEFI 为CentOS6.x(UEFI)生成PXE文件、修改dhcp配置文件、重启dhcp服务。 +func GenPXE4CentOS6UEFI(log logger.Logger, repo model.Repo, reqData *GenPXE4CentOS6UEFIReq) (filename string, err error) { + // 1、获取设备对应的PXE内容 + sysTemplate, err := repo.GetSystemTemplateBySN(reqData.SN) + if err != nil { + return "", err + } + + // 2、在指定目录生成PXE文件 + filename, err = pxe.GenFile(reqData.MAC, []byte(strings.Replace(sysTemplate.PXE, "{sn}", reqData.SN, -1))) + if err != nil { + log.Errorf("Generate pxe file error: %s", err.Error()) + return "", err + } + + // 3、读取原DHCP配置文件并以此生成新的配置文件 + dhcpSRC, err := ioutil.ReadFile(dhcpFilename) + if err != nil { + log.Error(err) + return "", err + } + log.Infof("DHCP configuration(before): \n%s", dhcpSRC) + + dhcpDST := centos6.AddOneToDHCP(reqData.SN, reqData.MAC, dhcpSRC) + + log.Infof("DHCP configuration(after): \n%s", dhcpDST) + + // 4、将dhcp配置持久化并重启服务 + if err = centos6.OverwriteDHCP(dhcpDST); err != nil { + log.Errorf("Restart dhcpd error: %s", err.Error()) + log.Warn("Try to rollback the dhcp configuration file") + _ = centos6.OverwriteDHCP(dhcpSRC) // 尝试回滚配置 + return "", err + } + return filename, nil +} + +// GetPXEReq 获取PXE请求结构体 +type GetPXEReq struct { + SN string `json:"-"` + Arch string `json:"arch"` + Cpuvendor string `json:"cpuvendor"` +} + +// FieldMap 请求字段映射 +func (reqData *GetPXEReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.Arch: "arch", + &reqData.Cpuvendor: "cpuvendor", + } +} + +// Validate 装机参数校验 +func (reqData *GetPXEReq) Validate(r *http.Request, errs binding.Errors) binding.Errors { + // repo, _ := middleware.RepoFromContext(r.Context()) + if reqData.SN == "" { + errs.Add([]string{"sn"}, binding.RequiredError, "SN不能为空") + return errs + } + + //if reqData.Arch == "" { + // reqData.Arch = X8664 + //} +// + //if reqData.Arch != ARM64 && reqData.Arch != X8664 { + // errs.Add([]string{"arch"}, binding.BusinessError, fmt.Sprintf("不支持该硬件架构: %s", reqData.Arch)) + // return errs + //} + + return errs +} + +const ( + // ARM64 CPU硬件架构-arm64 通过iPXE.efi启动固件获取${buildarch} + ARM64 = "arm64" + // X8664 CPU硬件架构-x86_64 通过iPXE.efi启动固件获取${buildarch} + X8664 = "x86_64" + // CPU厂商 通过iPXE.efi启动固件获取${cpuvendor}(当前该特性仅支持x86_64架构) + CPU_Vendor_Intel = "intel" + CPU_Vendor_Hygon = "hygon" +) + +// 支持根据CPU厂商进行组合bootos名称: bootos_x86_64]_[intel|hygon|] +const ( + bootOSARM64PXE = "bootos_arm64" //ARM64架构,但CPU厂商不在兼容列表时返回该默认模板 + bootOSX8664PXE = "bootos_x86_64" //X8664架构,但CPU厂商不在兼容列表时返回该默认模板 + bootOSDefault = "bootos_default" //CPU架构不在兼容列表时,返回该模板 + winPE2012X8664PXE = "winpe2012_x86_64" // win server默认模板 + localPXE = "local" +) + +// GetPXE 根据SN查询设备的PXE引导文件 +// 按照如下规则返回不同的模板内容 issues/133 +// 未采集设备信息,有或无装机参数,则返回名为bootos的系统安装模板。 +// 已采集设备信息,无装机参数,则返回名为bootos的系统安装模板。 +// 已采集设备信息,有装机参数,装机状态为pre_install/failure,则返回名为bootos的系统安装模板。 +// 已采集设备信息,有装机参数,装机状态为pre_hwcheck返回名为bootos的系统安装模板。 +// 已采集设备信息,有装机参数,装机状态为success,则返回名为local的系统安装模板。 +// 已采集设备信息,有装机参数,装机状态为success,部署状态为offline, 则返回名为bootos的系统安装模板。 +// 已采集设备信息,有装机参数,装机状态为installing,且进度小于0.5,则返回bootos的系统安装模板。 +// 已采集设备信息,有装机参数,装机状态为installing,则返回装机参数中指定的系统安装模板。 +func GetPXE(log logger.Logger, repo model.Repo, reqData *GetPXEReq) (pxe string, err error) { + defer func() { + //PXE模板中的{sn}占位符替换成具体的SN + pxe = strings.Replace(pxe, "{sn}", reqData.SN, -1) + }() + log.Debugf("Device(SN: %s, ARCH: %s, CPUVENDOR(not supported @arm64): %s) req bootos", reqData.SN, reqData.Arch, reqData.Cpuvendor) + // 判断是否采集硬件信息 + dev, err := repo.GetDeviceBySNOrMAC(reqData.SN) + if err != nil && !gorm.IsRecordNotFoundError(err) { + return "", err + } + if dev == nil { + log.Debugf("Device(%s) has not been collected, boot from bootos", reqData.SN) + return getBootOSPXE(log, repo, reqData.Arch, reqData.Cpuvendor) + } + reqData.SN = dev.SN + + // 判断是否提交装机参数 + sett, err := repo.GetDeviceSettingBySN(reqData.SN) + if gorm.IsRecordNotFoundError(err) { + log.Debugf("Device(%s) has not been submit settings, boot from bootos", reqData.SN) + return getBootOSPXE(log, repo, reqData.Arch, reqData.Cpuvendor) + } + if err != nil { + return "", err + } + + log.Infof("Device(%s) settings:\ninstall_type ==> %s\nsystem_template_id ==> %d\nimage_template_id ==> %d\nstatus ==> %s\nprogress ==> %f", + sett.SN, + sett.InstallType, + sett.SystemTemplateID, + sett.ImageTemplateID, + sett.Status, + sett.InstallProgress, + ) + + switch sett.Status { + case model.InstallStatusPre, model.InstallStatusFail: + // log.Debugf("Device(%s) has not been submit settings, boot from bootos", reqData.SN) + return getBootOSPXE(log, repo, reqData.Arch, reqData.Cpuvendor) + + case model.InstallStatusSucc: + if dev.OperationStatus == model.DevOperStatReinstalling { + log.Debugf("Device(%s) is being reinstall, boot from bootos", reqData.SN) + return getBootOSPXE(log, repo, reqData.Arch, reqData.Cpuvendor) + } + log.Debugf("Device(%s) has been install success, boot from local", reqData.SN) + return getPXEByName(log, repo, localPXE) + + case model.InstallStatusIng: + if sett.InstallProgress < 0.5 { + log.Debugf("Device(%s) boot from bootos for subsequent hardware configuration", reqData.SN) + return getBootOSPXE(log, repo, reqData.Arch, reqData.Cpuvendor) + } else if sett.InstallProgress > 0.8 { + return getPXEByName(log, repo, localPXE) + } + + log.Debugf("Device(%s) is installing, boot from tempalte", reqData.SN) + if sett.InstallType == model.InstallationImage { + imgTemplate, _ := repo.GetImageTemplateBySN(reqData.SN) + + if imgTemplate != nil && strings.HasPrefix(strings.ToLower(imgTemplate.Name), "win") { + log.Debugf("Device(%s) is installing by windows image,boot from winpe2012", reqData.SN) + return getPXEByName(log, repo, winPE2012X8664PXE) + } + } + + sysTemplate, err := repo.GetSystemTemplateBySN(reqData.SN) + if err != nil { + return "", err + } + return sysTemplate.PXE, nil + } + + log.Debugf("BootOS by default when get pxe template failed") + return getBootOSPXE(log, repo, reqData.Arch, reqData.Cpuvendor) +} + +// getBootOSPXE 获取进入BootOS的PXE模板 +func getBootOSPXE(log logger.Logger, repo model.Repo, arch string, cpuvendor string) (pxe string, err error) { + switch arch { + case ARM64: + log.Debugf("get bootos by name: %s", bootOSARM64PXE) + return getPXEByName(log, repo, bootOSARM64PXE) + case X8664: + if strings.Contains(strings.ToLower(cpuvendor), CPU_Vendor_Hygon) { + bootOS := "bootos_" + X8664 + "_" + CPU_Vendor_Hygon + log.Debugf("get bootos by name: %s", bootOS) + return getPXEByName(log, repo, bootOS) + } else if strings.Contains(strings.ToLower(cpuvendor), CPU_Vendor_Intel) { + bootOS := "bootos_" + X8664 + "_" + CPU_Vendor_Intel + log.Debugf("get bootos by name: %s", bootOS) + return getPXEByName(log, repo, bootOS) + } else { + log.Debugf("get bootos by name: %s", bootOSX8664PXE) + return getPXEByName(log, repo, bootOSX8664PXE) + } + default: + log.Debugf("get bootos by name: %s", bootOSDefault) + return getPXEByName(log, repo, bootOSDefault) + } +} + +func getPXEByName(log logger.Logger, repo model.Repo, name string) (pxe string, err error) { + tpl, err := repo.GetSystemTemplateByName(name) + if err != nil { + log.Errorf("Get system template(%s) failed: %s", name, err.Error()) + return "", err + } + return tpl.PXE, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/server_cabinet.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/server_cabinet.go new file mode 100644 index 0000000000000000000000000000000000000000..2b8dd7d64b4809bb3c444d670639a1ddcdd71c93 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/server_cabinet.go @@ -0,0 +1,1032 @@ +package service + +import ( + "fmt" + "net/http" + "os" + "reflect" + "strconv" + "strings" + + "github.com/jinzhu/gorm" + "github.com/voidint/binding" + "github.com/voidint/page" + + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils" + "idcos.io/cloudboot/utils/collection" + strings2 "idcos.io/cloudboot/utils/strings" + "idcos.io/cloudboot/utils/times" + "idcos.io/cloudboot/utils/upload" +) + +// SaveServerCabinetReq 保存机架(柜)请求结构体 +type SaveServerCabinetReq struct { + // 所属数据中心ID + IDCID uint `json:"idc_id"` + // 所属机房ID + ServerRoomID uint `json:"server_room_id"` + // 网络区域ID + NetworkAreaID uint `json:"network_area_id"` + // 机架(柜)ID。若id=0,则新增。若id>0,则修改。 + ID uint `json:"id"` + // 机架(柜)编号 + Number string `json:"number"` + // 机架(柜)高度 + Height uint `json:"height"` + // 类型("server","network_device", "reserved") + Type string `json:"type"` + // 网络速率 + NetworkRate string `json:"network_rate"` + // 电流 + Current string `json:"current"` + // 可用功率 + AvailablePower string `json:"available_power"` + // 峰值功率 + MaxPower string `json:"max_power"` + // 备注 + Remark string `json:"remark"` + // 用户登录名 + LoginName string `json:"-"` +} + +// CabinetPowerBatchOperateReq 机架批量操作 +type CabinetPowerBatchOperateReq struct { + IDS []uint `json:"ids"` +} + +// FieldMap 请求字段映射 +func (reqData *CabinetPowerBatchOperateReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDS: "ids", + } +} + +// FieldMap 请求字段映射 +func (reqData *SaveServerCabinetReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDCID: "idc_id", + &reqData.ServerRoomID: "server_room_id", + &reqData.NetworkAreaID: "network_area_id", + &reqData.ID: "id", + &reqData.Number: "number", + &reqData.Height: "height", + &reqData.Type: "type", + &reqData.NetworkRate: "network_rate", + &reqData.Current: "current", + &reqData.AvailablePower: "available_power", + &reqData.MaxPower: "max_power", + &reqData.Remark: "remark", + } +} + +// Validate 结构体数据校验 +func (reqData *SaveServerCabinetReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + + // if reqData.ServerRoomID == 0 { + // errs.Add([]string{"server_room_id"}, binding.RequiredError, "机房管理单元ID不能为空") + // return errs + // } + if reqData.NetworkAreaID == 0 { + errs.Add([]string{"network_area_id"}, binding.RequiredError, "网络区域ID不能为空") + return errs + } + if reqData.Number == "" { + errs.Add([]string{"number"}, binding.RequiredError, "机架编号不能为空") + return errs + } + if reqData.Height == 0 { + errs.Add([]string{"height"}, binding.RequiredError, "机架高度须大于0") + return errs + } + if reqData.Type == "" { + errs.Add([]string{"type"}, binding.RequiredError, "机架类型不能为空") + return errs + } + if !collection.InSlice(reqData.Type, []string{model.CabinetTypeServer, model.CabinetTypeKvmServer, model.CabinetTypeNetworkDevice, model.CabinetTypeReserved}) { + errs.Add([]string{"type"}, binding.RequiredError, "无效的机架类型") + return errs + } + if reqData.NetworkRate == "" { + errs.Add([]string{"network_rate"}, binding.RequiredError, "网络速率不能为空") + return errs + } + if reqData.Current == "" { + errs.Add([]string{"current"}, binding.RequiredError, "电流不能为空") + return errs + } + if reqData.AvailablePower == "" { + errs.Add([]string{"available_power"}, binding.RequiredError, "可用功率不能为空") + return errs + } + if reqData.MaxPower == "" { + errs.Add([]string{"max_power"}, binding.RequiredError, "峰值功率不能为空") + return errs + } + // 校验指定ID的网络区域是否存在 + area, err := repo.GetNetworkAreaByID(reqData.NetworkAreaID) + if err == gorm.ErrRecordNotFound { + errs.Add([]string{"idc_id", "server_room_id", "network_area_id"}, binding.BusinessError, "该网络区域不存在") + return errs + } + if err != nil { + errs.Add([]string{"idc_id", "server_room_id", "network_area_id"}, binding.SystemError, fmt.Sprintf("系统内部错误:%s", err.Error())) + return errs + } + // if area.IDCID != reqData.IDCID || area.ServerRoomID != reqData.ServerRoomID { + // errs.Add([]string{"idc_id", "server_room_id"}, binding.BusinessError, "数据中心、机房管理单元、网络区域三者不匹配") + // return errs + // } + + // sr, err := repo.GetServerRoomByID(reqData.ServerRoomID) + // if err != nil { + // errs.Add([]string{"server_room_id"}, binding.SystemError, "系统内部错误") + // return errs + // } + reqData.IDCID = area.IDCID + reqData.ServerRoomID = area.ServerRoomID + // 校验机架编号在机房内的唯一性 + cond := model.ServerCabinetCond{ + IDCID: []uint{reqData.IDCID}, + ServerRoomID: []uint{reqData.ServerRoomID}, + Number: reqData.Number, // 模糊匹配 + } + + items, err := repo.GetServerCabinets(&cond, nil, nil) + if err != nil { + errs.Add([]string{"idc_id", "server_room_id", "number"}, binding.SystemError, "系统内部错误") + return errs + } + for _, item := range items { + if (reqData.ID == 0 && item.Number == reqData.Number) || // 新增时,机架编号不能重复。 + (reqData.ID > 0 && item.Number == reqData.Number && reqData.ID != item.ID) { // 更新时,机架编号不能重复(除了自身外)。 + errs.Add([]string{"number"}, binding.BusinessError, "同一个机房管理单元内机架编号不能重复") + return errs + } + } + return errs +} + +// SaveServerCabinet 保存机架(柜) +func SaveServerCabinet(log logger.Logger, repo model.Repo, reqData *SaveServerCabinetReq) (err error) { + if reqData.ID > 0 { + _, err = repo.GetServerCabinetByID(reqData.ID) + if err != nil { + return err + } + } + + sc := &model.ServerCabinet{ + IDCID: reqData.IDCID, + ServerRoomID: reqData.ServerRoomID, + NetworkAreaID: reqData.NetworkAreaID, + Number: reqData.Number, + Height: reqData.Height, + Type: reqData.Type, + NetworkRate: reqData.NetworkRate, + Current: reqData.Current, + AvailablePower: reqData.AvailablePower, + MaxPower: reqData.MaxPower, + Remark: reqData.Remark, + Creator: reqData.LoginName, + } + sc.ID = reqData.ID + + if sc.ID == 0 { + sc.IsEnabled = model.NO + sc.IsPowered = model.CabinetPowerOff + sc.Status = model.CabinetStatUnderConstruction + _, err := repo.SaveServerCabinet(sc) + if err != nil { + return err + } + } + if sc.ID > 0 { + _, err := repo.SaveServerCabinet(sc) + if err != nil { + return err + } + } + if reqData.ID == 0 { + reqData.ID = sc.ID + } + return err +} + +// ServerCabinet 机架(柜) +type ServerCabinet struct { + //数据中心 + IDC struct { + ID uint `json:"id"` + Name string `json:"name"` + } `json:"idc"` + //机房 + ServerRoom struct { + ID uint `json:"id"` + Name string `json:"name"` + } `json:"server_room"` + //网络区域 + NetworkArea struct { + ID uint `json:"id"` + Name string `json:"name"` + } `json:"network_area"` + //机架(柜)ID + ID uint `json:"id"` + //机架(柜)编号 + Number string `json:"number"` + //机架(柜)高度 + Height uint `json:"height"` + //机架(柜)类型(("server","network_device", "reserved")) + Type string `json:"type"` + //网络速率 + NetworkRate string `json:"network_rate"` + //电流 + Current string `json:"current"` + //可用功率 + AvailablePower string `json:"available_power"` + //最大功率 + MaxPower string `json:"max_power"` + //是否启用 + IsEnabled string `json:"is_enabled"` + //启用时间 + EnableTime string `json:"enable_time"` + //是否上电 + IsPowered string `json:"is_powered"` + //上电时间 + PowerOnTime string `json:"power_on_time"` + //关电时间 + PowerOffTime string `json:"power_off_time"` + //状态 + Status string `json:"status"` + //创建时间 + CreatedAt string `json:"created_at"` + //更新时间 + UpdatedAt string `json:"updated_at"` + //机位总数 + USiteCount int64 `json:"usite_count"` + //备注 + Remark string `json:"remark"` +} + +// GetServerCabinetPageReq 查询机架(柜)分页请求结构体 +type GetServerCabinetPageReq struct { + // 所属数据中心ID,多个以逗号分隔 + IDCID string `json:"idc_id"` + // 所属机房ID + ServerRoomID string `json:"server_room_id"` + // 机架ID + ServerCabinetID string `json:"server_cabinet_id"` + // 网络区域ID + NetworkAreaID string `json:"network_area_id"` + // 机架(柜)编号 + Number string `json:"number"` + // 类型 + Type string `json:"type"` + // 状态。可选值: under_construction-建设中; not_enabled-未启用; enabled-已启用; offline-已下线; + Status string `json:"status"` + // 是否启用(yes/no) + IsEnabled string `json:"is_enabled"` + // 是否开电(yes/no) + IsPowered string `json:"is_powered"` + // 分页页号 + Page int64 `json:"page"` + // 分页大小 + PageSize int64 `json:"page_size"` + ServerRoomName string + NetworkAreaName string +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *GetServerCabinetPageReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDCID: "idc_id", + &reqData.ServerRoomID: "server_room_id", + &reqData.ServerCabinetID: "server_cabinet_id", + &reqData.NetworkAreaID: "network_area_id", + &reqData.Number: "number", + &reqData.Type: "type", + &reqData.Status: "status", + &reqData.IsEnabled: "is_enabled", + &reqData.IsPowered: "is_powered", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + &reqData.ServerRoomName: "server_room_name", + &reqData.NetworkAreaName: "network_area_name", + } +} + +// GetServerCabinetPage 按条件查询机架(柜)分页列表 +func GetServerCabinetPage(log logger.Logger, repo model.Repo, reqData *GetServerCabinetPageReq) (pg *page.Page, err error) { + if reqData.PageSize <= 0 || reqData.PageSize > 1000 { + reqData.PageSize = 10 + } + if reqData.Page < 0 { + reqData.Page = 0 + } + + cond := model.ServerCabinetCond{ + IDCID: strings2.Multi2UintSlice(reqData.IDCID), + ServerRoomID: strings2.Multi2UintSlice(reqData.ServerRoomID), + ServerCabinetID: strings2.Multi2UintSlice(reqData.ServerCabinetID), + NetworkAreaID: strings2.Multi2UintSlice(reqData.NetworkAreaID), + Number: reqData.Number, + Type: reqData.Type, + IsEnabled: reqData.IsEnabled, + IsPowered: reqData.IsPowered, + Status: reqData.Status, + ServerRoomName: reqData.ServerRoomName, + NetworkAreaName: reqData.NetworkAreaName, + } + ////物理区域需要支持多个多选 + //if reqData.NetworkAreaID != "" { + // NetworkAreaIDs := mystrings.MultiLines2Slice(reqData.NetworkAreaID) + // for _, id := range NetworkAreaIDs { + // if idInt, err := strconv.Atoi(id); err != nil { + // return nil, fmt.Errorf("network id invalid: %v", err) + // } else { + // cond.NetworkAreaID = append(cond.NetworkAreaID, uint(idInt)) + // } + // } + //} + totalRecords, err := repo.CountServerCabinets(&cond) + if err != nil { + return nil, err + } + + pager := page.NewPager(reflect.TypeOf(&ServerCabinet{}), reqData.Page, reqData.PageSize, totalRecords) + items, err := repo.GetServerCabinets(&cond, model.OneOrderBy("id", model.DESC), pager.BuildLimiter()) + if err != nil { + return nil, err + } + + for i := range items { + pager.AddRecords(convert2ServerCabinet(repo, items[i])) + } + return pager.BuildPage(), nil +} + +func convert2ServerCabinet(repo model.Repo, src *model.ServerCabinet) *ServerCabinet { + dst := ServerCabinet{ + ID: src.ID, + Number: src.Number, + Height: src.Height, + Type: src.Type, + NetworkRate: src.NetworkRate, + Current: src.Current, + AvailablePower: src.AvailablePower, + MaxPower: src.MaxPower, + IsEnabled: src.IsEnabled, + IsPowered: src.IsPowered, + Status: src.Status, + Remark: src.Remark, + CreatedAt: src.CreatedAt.Format(times.DateTimeLayout), + UpdatedAt: src.UpdatedAt.Format(times.DateTimeLayout), + } + if src.EnableTime != nil { + dst.EnableTime = src.EnableTime.Format(times.DateLayout) + } + if src.PowerOnTime != nil { + dst.PowerOnTime = src.PowerOnTime.Format(times.DateLayout) + } + if src.PowerOffTime != nil { + dst.PowerOffTime = src.PowerOffTime.Format(times.DateLayout) + } + + if idc, _ := repo.GetIDCByID(src.IDCID); idc != nil { + dst.IDC.ID, dst.IDC.Name = idc.ID, idc.Name + } + + if room, _ := repo.GetServerRoomByID(src.ServerRoomID); room != nil { + dst.ServerRoom.ID, dst.ServerRoom.Name = room.ID, room.Name + } + + if area, _ := repo.GetNetworkAreaByID(src.NetworkAreaID); area != nil { + dst.NetworkArea.ID, dst.NetworkArea.Name = area.ID, area.Name + } + + //统计机房中的机架(柜数) + if count, _ := repo.GetServerUSiteCountByServerCabinetID(dst.ID); count > 0 { + dst.USiteCount = count + } + return &dst +} + +// PowerOnServerCabinetByID 根据ID将机架(柜)上电 +func PowerOnServerCabinetByID(repo model.Repo, ids []uint) (int64, error) { + one, err := repo.PowerOnServerCabinetByID(ids) + if err != nil { + return 0, err + } + return one, nil +} + +// PowerOffServerCabinetByID 根据ID将机架(柜)下电 +func PowerOffServerCabinetByID(repo model.Repo, id uint) (int64, error) { + one, err := repo.PowerOffServerCabinetByID(id) + if err != nil { + return 0, err + } + return one, nil +} + +//ServerCabinetForImport 为了导入 +type ServerCabinetForImport struct { + //机房名 + ServerRoom string `json:"server_room"` + //机架编号 + Number string `json:"number"` + //机架高度 + Height int `json:"height"` + //机架类型(通用服务器/网络设备/预留) + Type string `json:"type"` + //网络速率 + NetworkRate string `json:"network_rate"` + //网络区域 + NetworkArea string `json:"network_area"` + //电流 + Current string `json:"current"` + //可用功率 + AvailablePower string `json:"available_power"` + //最大功率 + MaxPower string `json:"max_power"` + //备注 + Remark string `json:"remark"` + Content string `json:"content"` + Creator string `json:"creator"` + IDCID uint `json:"idc_id"` + ServerRoomID uint `json:"server_room_id"` + NetworkAreaID uint `json:"network_area_id"` + ID uint `json:"id"` +} + +var ( + cabinetTypeMap = map[string]string{ + "通用服务器": model.CabinetTypeServer, + "虚拟化服务器": model.CabinetTypeKvmServer, + "网络设备": model.CabinetTypeNetworkDevice, + "预留": model.CabinetTypeReserved, + "": "", + } +) + +//validate 对导入文件中的数据做基本验证 +func (scfi *ServerCabinetForImport) validate(log logger.Logger, repo model.Repo) (int, error) { + //机架高度 + if scfi.Height < 0 { + var br string + if scfi.Content != "" { + br = "<br />" + } + scfi.Content += br + fmt.Sprintf("机架位高度(%d)不能小于0", scfi.Height) + } + + //机架类型校验 + if cabinetTypeMap[scfi.Type] == "" { + var br string + if scfi.Content != "" { + br = "<br />" + } + scfi.Content += br + fmt.Sprintf("机架类型只能为(%s)", "通用服务器/虚拟化服务器/网络设备/预留") + } + + scfi.Type = cabinetTypeMap[scfi.Type] + + //机房校验 + srs, err := repo.GetServerRoomByName(scfi.ServerRoom) + if err != nil && err != gorm.ErrRecordNotFound { + log.Debug(err.Error()) + return upload.Return, err + } + if err == gorm.ErrRecordNotFound || srs == nil { + var br string + if scfi.Content != "" { + br = "<br />" + } + scfi.Content += br + fmt.Sprintf("机房名(%s)不存在", scfi.ServerRoom) + log.Debug(err.Error()) + return upload.Continue, nil + } + scfi.IDCID = srs.IDCID + scfi.ServerRoomID = srs.ID + + //查询是否已经存在 + id, err := repo.GetServerCabinetID(&model.ServerCabinet{Number: scfi.Number, + ServerRoomID: scfi.ServerRoomID, + IDCID: scfi.IDCID, + }) + if err != nil { + log.Debug(err.Error()) + return upload.Return, err + } + if len(id) > 1 { + var br string + if scfi.Content != "" { + br = "<br />" + } + scfi.Content += br + fmt.Sprintf("机架(柜)(%s)存在冲突", scfi.Number) + return upload.Continue, nil + } else if len(id) == 1 { + scfi.ID = id[0] + } else { + scfi.ID = 0 + } + + //网络区域校验 fixbug: 这样做有风险,等网络区域接口 + nabc, err := repo.GetNetworkAreasByCond(&model.NetworkArea{Name: scfi.NetworkArea, + ServerRoomID: scfi.ServerRoomID, + IDCID: scfi.IDCID, + }) + if err != nil && err != gorm.ErrRecordNotFound { + log.Debug(err.Error()) + return upload.Return, err + } + if len(nabc) < 1 { + var br string + if scfi.Content != "" { + br = "<br />" + } + scfi.Content += br + fmt.Sprintf("网络区域(%s)不存在", scfi.NetworkArea) + return upload.Continue, nil + } + if len(nabc) == 1 { + scfi.NetworkAreaID = nabc[0].ID + } + + return upload.DO, nil +} + +//checkLength 对导入文件中的数据做基本验证 +func (scfi *ServerCabinetForImport) checkLength() { + leg := len(scfi.ServerRoom) + if leg == 0 || leg > 255 { + var br string + if scfi.Content != "" { + br = "<br />" + } + scfi.Content += br + fmt.Sprintf("必填项校验:机房名长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(scfi.Number) + if leg == 0 || leg > 255 { + var br string + if scfi.Content != "" { + br = "<br />" + } + scfi.Content += br + fmt.Sprintf("必填项校验:机架编号长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(scfi.Type) + if leg == 0 || leg > 255 { + var br string + if scfi.Content != "" { + br = "<br />" + } + scfi.Content += br + fmt.Sprintf("必填项校验:机架类型长度为(%d)(不能为空)", leg) + } + leg = len(scfi.NetworkRate) + if leg == 0 || leg > 255 { + var br string + if scfi.Content != "" { + br = "<br />" + } + scfi.Content += br + fmt.Sprintf("必填项校验:网络速率长度为(%d)(不能为空)", leg) + } + leg = len(scfi.Current) + if leg == 0 || leg > 255 { + var br string + if scfi.Content != "" { + br = "<br />" + } + scfi.Content += br + fmt.Sprintf("必填项校验:电流长度为(%d)(不能为空)", leg) + } + leg = len(scfi.AvailablePower) + if leg == 0 || leg > 255 { + var br string + if scfi.Content != "" { + br = "<br />" + } + scfi.Content += br + fmt.Sprintf("必填项校验:可用功率长度为(%d)(不能为空)", leg) + } + leg = len(scfi.MaxPower) + if leg == 0 || leg > 255 { + var br string + if scfi.Content != "" { + br = "<br />" + } + scfi.Content += br + fmt.Sprintf("必填项校验:峰值功率长度为(%d)(不能为空)", leg) + } +} + +//ImportServerCabinetPriview 导入预览 +func ImportServerCabinetPriview(log logger.Logger, repo model.Repo, reqData *upload.ImportReq) (map[string]interface{}, error) { + ra, err := utils.ParseDataFromXLSX(upload.UploadDir + reqData.FileName) + if err != nil { + return nil, err + } + length := len(ra) + + var success []*ServerCabinetForImport + var failure []*ServerCabinetForImport + for i := 1; i < length; i++ { + row := &ServerCabinetForImport{} + if len(ra[i]) < 10 { + var br string + if row.Content != "" { + br = "<br />" + } + row.Content += br + "导入文件列长度不对(应为10列)" + failure = append(failure, row) + continue + } + + row.ServerRoom = strings.TrimSpace(ra[i][0]) + row.Number = strings.TrimSpace(ra[i][1]) + row.Height, _ = strconv.Atoi(strings.TrimSpace(ra[i][2])) + row.Type = strings.TrimSpace(ra[i][3]) + row.NetworkArea = strings.TrimSpace(ra[i][4]) + row.NetworkRate = strings.TrimSpace(ra[i][5]) + row.Current = strings.TrimSpace(ra[i][6]) + row.AvailablePower = strings.TrimSpace(ra[i][7]) + row.MaxPower = strings.TrimSpace(ra[i][8]) + row.Remark = strings.TrimSpace(ra[i][9]) + + //必填项校验 + row.checkLength() + //机房和网络区域校验 + _, err := row.validate(log, repo) + if err != nil { + log.Debug(err.Error()) + return nil, err + } + + if row.Content != "" { + failure = append(failure, row) + } else { + success = append(success, row) + } + } + + var data []*ServerCabinetForImport + if len(failure) > 0 { + data = failure + } else { + data = success + } + var result []*ServerCabinetForImport + for i := 0; i < len(data); i++ { + if uint(i) >= reqData.Offset && uint(i) < (reqData.Offset+reqData.Limit) { + result = append(result, data[i]) + } + } + if len(failure) > 0 { + return map[string]interface{}{"status": "failure", + "message": "导入机架错误", + "import_status": false, + "record_count": len(data), + "content": result, + }, nil + } + return map[string]interface{}{"status": "success", + "message": "操作成功", + "import_status": true, + "record_count": len(data), + "content": result, + }, nil +} + +//ImportServerCabinet 将导入机架(柜)放到数据库 +func ImportServerCabinet(log logger.Logger, repo model.Repo, reqData *upload.ImportReq) error { + ra, err := utils.ParseDataFromXLSX(upload.UploadDir + reqData.FileName) + if err != nil { + log.Error(err) + return err + } + length := len(ra) + for i := 1; i < length; i++ { + row := &ServerCabinetForImport{} + if len(ra[i]) < 10 { + continue + } + + row.ServerRoom = strings.TrimSpace(ra[i][0]) + row.Number = strings.TrimSpace(ra[i][1]) + row.Height, _ = strconv.Atoi(strings.TrimSpace(ra[i][2])) + row.Type = strings.TrimSpace(ra[i][3]) + row.NetworkArea = strings.TrimSpace(ra[i][4]) + row.NetworkRate = strings.TrimSpace(ra[i][5]) + row.Current = strings.TrimSpace(ra[i][6]) + row.AvailablePower = strings.TrimSpace(ra[i][7]) + row.MaxPower = strings.TrimSpace(ra[i][8]) + row.Remark = strings.TrimSpace(ra[i][9]) + + //必填项校验 + row.checkLength() + //机房和网络区域校验 + save, err := row.validate(log, repo) + if err != nil { + log.Error(err) + return err + } + //不能获取机房,OperateLog,网络区域,就不能做保存操作 + if save == upload.Continue { + continue + } + + sc := &model.ServerCabinet{ + IDCID: row.IDCID, + ServerRoomID: row.ServerRoomID, + NetworkAreaID: row.NetworkAreaID, + Number: row.Number, + Height: uint(row.Height), + Type: row.Type, + NetworkRate: row.NetworkRate, + Current: row.Current, + AvailablePower: row.AvailablePower, + MaxPower: row.MaxPower, + Remark: row.Remark, + Creator: row.Creator, + } + sc.ID = row.ID + if row.ID == 0 { + sc.IsEnabled = model.NO + sc.IsPowered = model.CabinetPowerOff + sc.Status = model.CabinetStatUnderConstruction + _, err := repo.SaveServerCabinet(sc) + if err != nil { + return err + } + } + if row.ID > 0 { + sc.ID = uint(row.ID) + _, err := repo.SaveServerCabinet(sc) + if err != nil { + return err + } + } + } + defer os.Remove(upload.UploadDir + reqData.FileName) + return nil +} + +//GetServerByCabinetID 查询指定ID的机架(柜)信息详情 +func GetServerByCabinetID(log logger.Logger, repo model.Repo, id uint) (*ServerCabinet, error) { + sc, err := repo.GetServerCabinetByID(id) + if err != nil { + return nil, err + } + sca := convert2ServerCabinet(repo, sc) + return sca, nil +} + +//RemoveServerCabinetValidte 删除操作校验 +func RemoveServerCabinetValidte(log logger.Logger, repo model.Repo, id uint) string { + sc, _ := repo.GetServerCabinetByID(id) + if sc == nil { + return fmt.Sprintf("不存在机架(%d)", id) + } + //统计机架下面的中的机位 + count, _ := repo.CountServerUSite(&model.CombinedServerUSite{ + CabinetNumber: sc.Number, + }) + if count > 0 { + return fmt.Sprintf("机架下面存在机位(%d),不允许删除", count) + } + count, _ = repo.CountNetworkDevices(&model.NetworkDeviceCond{ + ServerCabinetID: []uint{id}, + }) + if count > 0 { + return fmt.Sprintf("机架下面存在网络设备(%d),不允许删除", count) + } + return "" +} + +//RemoveServerCabinetByID 删除指定ID的机架(柜) +func RemoveServerCabinetByID(log logger.Logger, repo model.Repo, id uint) error { + //删除机架(柜) + _, err := repo.RemoveServerCabinetByID(id) + return err +} + +//UpdateServerCabinetStatusReq 批量更新机架(柜)状态请求 +type UpdateServerCabinetStatusReq struct { + IDS []uint `json:"ids"` + Status string `json:"status"` +} + +// FieldMap 请求字段映射 +func (reqData *UpdateServerCabinetStatusReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDS: "ids", + &reqData.Status: "status", + } +} + +//Validate 参数校验 +func (reqData *UpdateServerCabinetStatusReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + //这里的校验要与model状态保持一致 + if reqData.Status == "" { + errs.Add([]string{"status"}, binding.RequiredError, "状态不能为空") + return errs + } + + //机架(柜)状态校验 + statusIsGood := true + switch reqData.Status { + case model.CabinetStatEnabled: + case model.CabinetStatLocked: + default: + statusIsGood = false + } + if !statusIsGood { + errs.Add([]string{"status"}, binding.RequiredError, "状态更新必须为(已启用 或 已锁定)") + return errs + } + return errs +} + +//AcceptServerCabinetStatusReq 批量验收 +type AcceptServerCabinetStatusReq struct { + IDS []uint `json:"ids"` + //Status string `json:"status"` +} + +// FieldMap 请求字段映射 +func (reqData *AcceptServerCabinetStatusReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDS: "ids", + //&reqData.Status: "status", + } +} + +//Validate 参数校验 +func (reqData *AcceptServerCabinetStatusReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + //检查当前状态是否:建设中 + repo, _ := middleware.RepoFromContext(req.Context()) + for _, id := range reqData.IDS { + if cabinet, err := repo.GetServerCabinetByID(id); err != nil { + if cabinet.Status != model.CabinetStatUnderConstruction { + errs.Add([]string{"status"}, binding.BusinessError, + fmt.Sprintf("机架(编号:%s)当前状态:%s,必须是建设中(%s)", cabinet.Number, + cabinet.Status, model.CabinetStatUnderConstruction)) + return errs + } + } + } + //检查tor组的两个机架是否关联网络设备 + // TODO + return errs +} + +//EnableServerCabinetStatusReq 批量启用 +type EnableServerCabinetStatusReq struct { + IDS []uint `json:"ids"` +} + +// FieldMap 请求字段映射 +func (reqData *EnableServerCabinetStatusReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDS: "ids", + } +} + +//Validate 参数校验 +func (reqData *EnableServerCabinetStatusReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + //检查当前状态是否:未启用 + repo, _ := middleware.RepoFromContext(req.Context()) + for _, id := range reqData.IDS { + if cabinet, err := repo.GetServerCabinetByID(id); err != nil { + if cabinet.Status != model.CabinetStatNotEnabled { + errs.Add([]string{"status"}, binding.BusinessError, + fmt.Sprintf("机架(编号:%s)当前状态:%s,必须是未启用(%s)", + cabinet.Number, cabinet.Status, model.CabinetStatNotEnabled)) + return errs + } + } + } + return errs +} + +//OfflineServerCabinetStatusReq 批量下线 +type OfflineServerCabinetStatusReq struct { + IDS []uint `json:"ids"` +} + +// FieldMap 请求字段映射 +func (reqData *OfflineServerCabinetStatusReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDS: "ids", + } +} + +//Validate 参数校验 +func (reqData *OfflineServerCabinetStatusReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + //检查当前状态是否:已启用 + repo, _ := middleware.RepoFromContext(req.Context()) + for _, id := range reqData.IDS { + if cabinet, err := repo.GetServerCabinetByID(id); err != nil { + if cabinet.Status != model.CabinetStatNotEnabled { + errs.Add([]string{"status"}, binding.BusinessError, + fmt.Sprintf("机架(编号:%s)当前状态:%s,必须是已启用(%s)", + cabinet.Number, cabinet.Status, model.CabinetStatEnabled)) + return errs + } + } + } + return errs +} + +//ReconstructServerCabinetStatusReq 批量重建 +type ReconstructServerCabinetStatusReq struct { + IDS []uint `json:"ids"` +} + +// FieldMap 请求字段映射 +func (reqData *ReconstructServerCabinetStatusReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDS: "ids", + } +} + +//Validate 参数校验 +func (reqData *ReconstructServerCabinetStatusReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + //检查当前状态是否:已下线 + repo, _ := middleware.RepoFromContext(req.Context()) + for _, id := range reqData.IDS { + if cabinet, err := repo.GetServerCabinetByID(id); err != nil { + if cabinet.Status != model.CabinetStatOffline { + errs.Add([]string{"status"}, binding.BusinessError, + fmt.Sprintf("机架(编号:%s)当前状态:%s,必须是已下线(%s)", + cabinet.Number, cabinet.Status, model.CabinetStatOffline)) + return errs + } + } + } + return errs +} + +//AcceptServerCabinet 验收 +func AcceptServerCabinet(log logger.Logger, repo model.Repo, req *AcceptServerCabinetStatusReq) error { + updateReq := new(UpdateServerCabinetStatusReq) + updateReq.IDS = req.IDS + updateReq.Status = model.CabinetStatNotEnabled + return UpdateServerCabinetStatus(log, repo, updateReq) +} + +//EnableServerCabinet 启用 +func EnableServerCabinet(log logger.Logger, repo model.Repo, req *EnableServerCabinetStatusReq) error { + updateReq := new(UpdateServerCabinetStatusReq) + updateReq.IDS = req.IDS + updateReq.Status = model.CabinetStatEnabled + return UpdateServerCabinetStatus(log, repo, updateReq) +} + +//ReconstructServerCabinet 重建 +func ReconstructServerCabinet(log logger.Logger, repo model.Repo, req *ReconstructServerCabinetStatusReq) error { + updateReq := new(UpdateServerCabinetStatusReq) + updateReq.IDS = req.IDS + updateReq.Status = model.CabinetStatUnderConstruction + return UpdateServerCabinetStatus(log, repo, updateReq) +} + +//UpdateServerCabinetStatus 批量更新机架(柜)状态 +func UpdateServerCabinetStatus(log logger.Logger, repo model.Repo, req *UpdateServerCabinetStatusReq) error { + if _, err := repo.UpdateServerCabinetStatus(req.IDS, req.Status); err != nil { + return err + } + return nil +} + +// UpdateServerCabinetTypeReq +type UpdateServerCabinetTypeReq struct { + // 类型 + Type string `json:"type"` + // id列表 + IDs []uint `json:"ids"` +} + +// BatchUpdateServerCabinetType 批量更新机架(柜)类型 +func BatchUpdateServerCabinetType(repo model.Repo, ids []uint, typ string) (affected int64, err error) { + return repo.UpdateServerCabinetType(ids, typ) +} + +// UpdateServerCabinetRemarkReq +type UpdateServerCabinetRemarkReq struct { + // 备注 + Remark string `json:"remark"` + // id列表 + IDs []uint `json:"ids"` +} + +// BatchUpdateServerCabinetRemark 批量更新机架(柜)备注信息 +func BatchUpdateServerCabinetRemark(repo model.Repo, ids []uint, remark string) (affected int64, err error) { + return repo.UpdateServerCabinetRemark(ids, remark) +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/server_room.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/server_room.go new file mode 100644 index 0000000000000000000000000000000000000000..58a233cbc237e2f3eb18e351919f5f9ee7f40197 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/server_room.go @@ -0,0 +1,868 @@ +package service + +import ( + "encoding/json" + "fmt" + "net/http" + "os" + "reflect" + "regexp" + "strings" + + "github.com/jinzhu/gorm" + "github.com/voidint/binding" + "github.com/voidint/page" + + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils" + strings2 "idcos.io/cloudboot/utils/strings" + "idcos.io/cloudboot/utils/times" + "idcos.io/cloudboot/utils/upload" +) + +//SaveServerRoomReq 保存机房请求参数 +type SaveServerRoomReq struct { + //(required) 所属数据中心ID + IDCID uint `json:"idc_id"` + //机房ID。若id=0,则新增。若id>0,则修改。 + ID uint `json:"id"` + //required) 机房名称 + Name string `json:"name"` + //(required)一级机房ID + FirstServerRoom uint `json:"first_server_room"` + //(required) 所属城市 + City string `json:"city"` + //(required) 地址 + Address string `json:"address"` + //(required) 机房管理单元负责人 + ServerRoomManager string `json:"server_room_manager"` + //(required) 供应商负责人 + VendorManager string `json:"vendor_manager"` + //(required) 网络资产负责人 + NetworkAssetManager string `json:"network_asset_manager"` + //(required) 7*24小时保障电话 + SupportPhoneNumber string `json:"support_phone_number"` + // 用户登录名 + LoginName string `json:"-"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *SaveServerRoomReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDCID: "idc_id", + &reqData.ID: "id", + &reqData.Name: "name", + &reqData.FirstServerRoom: "first_server_room", + &reqData.City: "city", + &reqData.Address: "address", + &reqData.ServerRoomManager: "server_room_manager", + &reqData.VendorManager: "vendor_manager", + &reqData.NetworkAssetManager: "network_asset_manager", + &reqData.SupportPhoneNumber: "support_phone_number", + } +} + +var ( + //中国区手机/固话号码 + chinaTelephoneNumberReq = regexp.MustCompile("^(((\\+\\d{2}-)?0\\d{2,3}-\\d{7,8})|((\\+\\d{2}-)?(\\d{2,3}-)?([1][3,4,5,7,8][0-9]\\d{8})))$") +) + +// Validate 结构体数据校验 +func (reqData *SaveServerRoomReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + //必须的基本数据不能为空 + if errs = reqData.baseValidate(req, errs); errs != nil { + return errs + } + + //更新机房信息,校验指定ID的机房是否存在 + if reqData.ID > 0 { + if errs = reqData.serverRoomValidate(req, errs); errs != nil { + return errs + } + } + + //校验IDC数据 + if errs = reqData.checkIDCValidate(req, errs); errs != nil { + return errs + } + + //校验指定7*24小时电话格式是否正确 + phlist := strings.Split(reqData.SupportPhoneNumber, ",") + for k := range phlist { + if !chinaTelephoneNumberReq.MatchString(phlist[k]) { + errs.Add([]string{"phone"}, binding.RequiredError, fmt.Sprintf("7*24小时电话(%s)格式不正确", phlist[k])) + return errs + } + } + // TODO 校验指定各块的负责人是否存在 + return errs +} + +func (reqData *SaveServerRoomReq) checkIDCValidate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + + idc, err := repo.GetIDCByID(reqData.IDCID) + if err != nil { + errs.Add([]string{"idc"}, binding.RequiredError, fmt.Sprintf("获取数据中心id(%d)出现错误: %s", reqData.IDCID, err.Error())) + return errs + } + + var fsr []IDCFirstServerRoom + if idc.FirstServerRoom != "" { + err := json.Unmarshal([]byte(idc.FirstServerRoom), &fsr) + if err != nil { + errs.Add([]string{"idc"}, binding.RequiredError, fmt.Sprintf("获取数据中心id(%d)(一级机房)出现错误: %s", reqData.IDCID, err.Error())) + return errs + } + } + + isExist := false + for k := range fsr { + if reqData.FirstServerRoom == fsr[k].ID { + isExist = true + break + } + } + if !isExist { + errs.Add([]string{"idc"}, binding.RequiredError, fmt.Sprintf("获取数据中心(一级机房)不存在ID为 %d 的", reqData.FirstServerRoom)) + return errs + } + return errs + +} + +func (reqData *SaveServerRoomReq) serverRoomValidate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + + var cond model.ServerRoomCond + + cond.ID = []uint{reqData.ID} + + items, err := repo.GetServerRooms(&cond, nil, nil) + if err != nil { + errs.Add([]string{"server_room"}, binding.RequiredError, fmt.Sprintf("更新机房ID %d不存在", reqData.ID)) + return errs + } + if len(items) < 1 { + errs.Add([]string{"server_room"}, binding.RequiredError, fmt.Sprintf("更新机房ID %d不存在", reqData.ID)) + return errs + } + + //校验更新机房名是否已经存在 + if reqData.Name != "" { + item, _ := repo.GetServerRoomByName(reqData.Name) + if item != nil && item.ID != reqData.ID { + errs.Add([]string{"server_room"}, binding.RequiredError, fmt.Sprintf("更新机房 指定的机房名%s已经存在", reqData.Name)) + return errs + } + } + return errs +} + +//baseValidate 必要参数不能为空 +func (reqData *SaveServerRoomReq) baseValidate(req *http.Request, errs binding.Errors) binding.Errors { + if reqData.IDCID == 0 { + errs.Add([]string{"idc_id"}, binding.RequiredError, "数据中心ID不能为空") + return errs + } + + if reqData.Name == "" { + errs.Add([]string{"name"}, binding.RequiredError, "机房名称不能为空") + return errs + } + + if reqData.City == "" { + errs.Add([]string{"city"}, binding.RequiredError, "机房所属城市不能为空") + return errs + } + + if reqData.Address == "" { + errs.Add([]string{"address"}, binding.RequiredError, "机房地址不能为空") + return errs + } + + if reqData.ServerRoomManager == "" { + errs.Add([]string{"server_room_manager"}, binding.RequiredError, "机房管理单元负责人不能为空") + return errs + } + + if reqData.VendorManager == "" { + errs.Add([]string{"vendor_manager"}, binding.RequiredError, "供应商负责人不能为空") + return errs + } + + if reqData.NetworkAssetManager == "" { + errs.Add([]string{"network_asset_manager"}, binding.RequiredError, "网络资产负责人不能为空") + return errs + } + + if reqData.SupportPhoneNumber == "" { + errs.Add([]string{"support_phone_number"}, binding.RequiredError, "7*24小时保障电话不能为空") + return errs + } + return errs +} + +//SaveServerRoom 保存机房 +func SaveServerRoom(log logger.Logger, repo model.Repo, reqData *SaveServerRoomReq) error { + sr := model.ServerRoom{ + IDCID: reqData.IDCID, + Name: reqData.Name, + FirstServerRoom: reqData.FirstServerRoom, + City: reqData.City, + Address: reqData.Address, + ServerRoomManager: reqData.ServerRoomManager, + VendorManager: reqData.VendorManager, + NetworkAssetManager: reqData.NetworkAssetManager, + SupportPhoneNumber: reqData.SupportPhoneNumber, + Creator: reqData.LoginName, + } + if reqData.ID == 0 { + sr.Status = model.RoomStatUnderConstruction + _, err := repo.SaveServerRoom(&sr) + if err != nil { + return err + } + } + if reqData.ID > 0 { + sr.ID = uint(reqData.ID) + _, err := repo.UpdateServerRoom([]*model.ServerRoom{&sr}) + if err != nil { + return err + } + } + reqData.ID = sr.ID + return nil +} + +//UpdateServerRoomStateReq 更新机房状态请求参数 +type UpdateServerRoomStateReq struct { + //(required): 目标机房状态。可选值: under_construction-建设中; accepted-已验收; production-已投产; abolished-已裁撤; + Status string `json:"status"` + //(required): 机房ID列表 + IDs []int `json:"ids"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *UpdateServerRoomStateReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.Status: "status", + &reqData.IDs: "ids", + } +} + +// Validate 结构体数据校验 +func (reqData *UpdateServerRoomStateReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + if reqData.Status == "" { + errs.Add([]string{"status"}, binding.RequiredError, "目标机房状态不能为空") + return errs + } + + //这里的校验要与model状态保持一致 + if reqData.Status != model.RoomStatUnderConstruction && + reqData.Status != model.RoomStatAccepted && + reqData.Status != model.RoomStatProduction { + //reqData.Status != model.RoomStatAbolished + errs.Add([]string{"status"}, binding.RequiredError, "状态值错误(只能为:under_construction/accepted/production中的一种)") + return errs + } + return errs + +} + +//UpdateServerRoomStatus 批量修改机房状态 +func UpdateServerRoomStatus(log logger.Logger, repo model.Repo, reqData *UpdateServerRoomStateReq) error { + var srs []*model.ServerRoom + for k := range reqData.IDs { + //实现方式不好,如果机房比较多会造成大量变量,对GC造成压力(这里sr会发生逃逸,放到堆上) + sr := &model.ServerRoom{ + Status: reqData.Status, + } + sr.ID = uint(reqData.IDs[k]) + srs = append(srs, sr) + } + if _, err := repo.UpdateServerRoom(srs); err != nil { + return err + } + return nil +} + +//RemoveServerRoomValidte 删除操作校验 +func RemoveServerRoomValidte(log logger.Logger, repo model.Repo, id uint) string { + //统计机房中的机架(柜数) + count, _ := repo.GetServerCabinetCountByServerRoomID(id) + if count > 0 { + return fmt.Sprintf("机房下面存在(%d)个机架,不允许删除", count) + } + count, _ = repo.CountNetworkAreas(&model.NetworkAreaCond{ + ServerRoomID: []uint{id}, + }) + if count > 0 { + return fmt.Sprintf("机房下面存在(%d)个网络区域,不允许删除", count) + } + count, _ = repo.CountIPNetworks(&model.IPNetworkCond{ServerRoomID: []uint{id}}) + if count > 0 { + return fmt.Sprintf("机房下面存在(%d)网段,不允许删除", count) + } + return "" +} + +//RemoveServerRoomByID 删除指定ID的机房 +func RemoveServerRoomByID(log logger.Logger, repo model.Repo, id uint) error { + _, err := repo.RemoveServerRoomByID(id) + return err +} + +//GetServerRoomPageReq 获取机房分页请求参数 +type GetServerRoomPageReq struct { + // 所属数据中心ID + IDCID string `json:"idc_id"` + // 机房名称(支持模糊匹配) + Name string `json:"name"` + // 一级机房ID + FirstServerRoom string `json:"first_server_room"` + // 城市(支持模糊匹配) + City string `json:"city"` + // 地址(支持模糊匹配) + Address string `json:"address"` + // 机房管理单元负责人(支持模糊匹配) + ServerRoomManager string `json:"server_room_manager"` + // 供应商负责人(支持模糊匹配) + VendorManager string `json:"vendor_manager"` + // 网络资产负责人(支持模糊匹配) + NetworkAssetManager string `json:"network_asset_manager"` + // 7*24小时保障电话(支持模糊匹配) + SupportPhoneNumber string `json:"support_phone_number"` + //状态。可选值: under_construction-建设中; accepted-已验收; production-已投产; abolished-已裁撤; + Status string `json:"status"` + // 分页页号 + Page int64 `json:"page"` + // 分页大小。默认值:10。阈值: 100。 + PageSize int64 `json:"page_size"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *GetServerRoomPageReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDCID: "idc_id", + &reqData.Status: "status", + &reqData.Name: "name", + &reqData.FirstServerRoom: "first_server_room", + &reqData.City: "city", + &reqData.Address: "address", + &reqData.ServerRoomManager: "server_room_manager", + &reqData.VendorManager: "vendor_manager", + &reqData.NetworkAssetManager: "network_asset_manager", + &reqData.SupportPhoneNumber: "support_phone_number", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + } +} + +//IDCFirstServerRoom 一级机房 +type IDCFirstServerRoom struct { + //一级机房ID + ID uint `json:"id"` + //一级机房名 + Name string `json:"name"` +} + +//IDCForServerRoomPage 数据中心 +type IDCForServerRoomPage struct { + //数据中心ID + ID uint `json:"id"` + //数据中心名 + Name string `json:"name"` + //一级机房 + FirstServerRoom []IDCFirstServerRoom `json:"first_server_room"` + //厂商 + Vendor string `json:"vendor"` + //状态 + Status string `json:"status"` +} + +//ServerRoom 机房分页查询信息 +type ServerRoom struct { + //机房ID + ID uint `json:"id"` + //创建时间 + CreatedAt times.ISOTime `json:"created_at"` + //更新时间 + UpdatedAt times.ISOTime `json:"updated_at"` + //机房名 + Name string `json:"name"` + //一级机房ID + FirstServerRoom IDCFirstServerRoom `json:"first_server_room"` + //机架数 + CabinetCount int64 `json:"cabinet_count"` + //所在城市 + City string `json:"city"` + //地址 + Address string `json:"address"` + //机房管理人 + ServerRoomManager string `json:"server_room_manager"` + //供应商负责人 + VendorManager string `json:"vendor_manager"` + //网络资产管理人 + NetworkAssetManager string `json:"network_asset_manager"` + //支撑电话号码 + SupportPhoneNumber string `json:"support_phone_number"` + //机房状态 + Status string `json:"status"` + //创建人 + Creator string `json:"creator"` + //数据中心 + IDC IDCForServerRoomPage `json:"idc"` +} + +//GetServerRoomWithPage 获取机房分页 +func GetServerRoomWithPage(log logger.Logger, repo model.Repo, reqData *GetServerRoomPageReq) (*page.Page, error) { + if reqData.PageSize <= 0 || reqData.PageSize > 100 { + reqData.PageSize = 20 + } + if reqData.Page < 0 { + reqData.Page = 0 + } + + cond := model.ServerRoomCond{ + IDCID: strings2.Multi2UintSlice(reqData.IDCID), + Name: reqData.Name, + FirstServerRoom: strings2.Multi2UintSlice(reqData.FirstServerRoom), + City: reqData.City, + Address: reqData.Address, + ServerRoomManager: reqData.ServerRoomManager, + VendorManager: reqData.VendorManager, + NetworkAssetManager: reqData.NetworkAssetManager, + SupportPhoneNumber: reqData.SupportPhoneNumber, + Status: reqData.Status, + } + + totalRecords, err := repo.CountServerRooms(&cond) + if err != nil { + return nil, err + } + + pager := page.NewPager(reflect.TypeOf(&ServerRoom{}), reqData.Page, reqData.PageSize, totalRecords) + items, err := repo.GetServerRooms(&cond, model.OneOrderBy("id", model.DESC), pager.BuildLimiter()) + if err != nil { + return nil, err + } + for i := range items { + item, err := convert2ServerRoomResult(log, repo, items[i]) + if err != nil { + return nil, err + } + if item != nil { + pager.AddRecords(item) + } + } + return pager.BuildPage(), nil +} + +func convert2ServerRoomResult(log logger.Logger, repo model.Repo, srcp *model.ServerRoom) (*ServerRoom, error) { + if srcp == nil { + return nil, nil + } + + idc, err := repo.GetIDCByID(srcp.IDCID) + if err != nil && err != gorm.ErrRecordNotFound { + return nil, err + } + + result := ServerRoom{ + ID: srcp.ID, + CreatedAt: times.ISOTime(srcp.CreatedAt), + UpdatedAt: times.ISOTime(srcp.UpdatedAt), + Name: srcp.Name, + City: srcp.City, + Address: srcp.Address, + ServerRoomManager: srcp.ServerRoomManager, + VendorManager: srcp.VendorManager, + NetworkAssetManager: srcp.NetworkAssetManager, + SupportPhoneNumber: srcp.SupportPhoneNumber, + Status: srcp.Status, + Creator: srcp.Creator, + } + + if idc != nil { + var fsr []IDCFirstServerRoom + if idc.FirstServerRoom != "" { + err := json.Unmarshal([]byte(idc.FirstServerRoom), &fsr) + if err != nil { + return nil, err + } + } + result.IDC = IDCForServerRoomPage{ + ID: srcp.IDCID, + Name: idc.Name, + FirstServerRoom: fsr, + Vendor: idc.Vendor, + Status: idc.Status, + } + + for k := range fsr { + if fsr[k].ID == srcp.FirstServerRoom { + result.FirstServerRoom = fsr[k] + } + } + } + + //统计机房中的机架(柜数) + count, err := repo.GetServerCabinetCountByServerRoomID(result.ID) + if err != nil { + return nil, err + } + result.CabinetCount = count + + return &result, nil +} + +//GetServerRoomByID 获取指定ID的机房的详细信息 +func GetServerRoomByID(log logger.Logger, repo model.Repo, id uint) (*ServerRoom, error) { + items, err := repo.GetServerRoomByID(id) + if err != nil { + return nil, err + } + + item, err := convert2ServerRoomResult(log, repo, items) + if err != nil { + return nil, err + } + return item, nil +} + +//ServerRoomForImport 为了导入 +type ServerRoomForImport struct { + //文件导入数据 + ID uint `json:"-"` + //机房名 + Name string `json:"name"` + //数据中心名 + IDCName string `json:"idc_name"` + //一级机房名 + FirstServerRoomName string `json:"first_server_room_name"` + //所在城市 + City string `json:"city"` + //地址 + Address string `json:"address"` + //机房负责人 + ServerRoomManager string `json:"server_room_manager"` + //供应商负责人 + VendorManager string `json:"vendor_manager"` + //网络资产负责人 + NetworkAssetManager string `json:"network_asset_manager"` + //支撑电话号码 + SupportPhoneNumber string `json:"support_phone_number"` + + //创建人 + Creator string `json:"creator"` + //机房ID + IDCID uint `json:"idc_id"` + //一级机房 + FirstServerRoom uint `json:"first_server_room"` + //附加内容 + Content string `json:"content"` +} + +//checkLength 对导入文件中的数据做基本验证 +func (srfi *ServerRoomForImport) checkLength() { + leg := len(srfi.Name) + if leg == 0 || leg > 255 { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("必填项校验:机房管理单元长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(srfi.IDCName) + if leg == 0 || leg > 255 { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("必填项校验:数据中心长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(srfi.FirstServerRoomName) + if leg == 0 || leg > 255 { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("必填项校验:所属一级机房长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(srfi.City) + if leg == 0 || leg > 255 { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("必填项校验:机房管理单元所属城市长度为(%d)(不能为空)", leg) + } + leg = len(srfi.Address) + if leg == 0 || leg > 255 { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("必填项校验:机房管理单元地址长度为(%d)(不能为空)", leg) + } + leg = len(srfi.ServerRoomManager) + if leg == 0 || leg > 255 { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("必填项校验:机房管理单元负责人长度为(%d)(不能为空)", leg) + } + leg = len(srfi.VendorManager) + if leg == 0 || leg > 255 { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("必填项校验:供应商负责人长度为(%d)(不能为空)", leg) + } + leg = len(srfi.NetworkAssetManager) + if leg == 0 || leg > 255 { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("必填项校验:网络资产负责人长度为(%d)(不能为空)", leg) + } + leg = len(srfi.SupportPhoneNumber) + if leg == 0 || leg > 255 { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("必填项校验:7*24小时保障电话长度为(%d)(不能为空)", leg) + } +} + +//validate 对导入文件中的数据做基本验证 +func (srfi *ServerRoomForImport) validate(repo model.Repo) (int, error) { + //数据中心校验 + idc, err := repo.GetIDCByName(srfi.IDCName) + if err != nil && err != gorm.ErrRecordNotFound { + return upload.Return, err + } + if err == gorm.ErrRecordNotFound || idc == nil { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("数据中心(%s)不存在", srfi.IDCName) + return upload.Continue, nil + } + + //一级机房校验 + fsrExist := false + var fsr []IDCFirstServerRoom + if idc.FirstServerRoom != "" { + err := json.Unmarshal([]byte(idc.FirstServerRoom), &fsr) + if err != nil { + return upload.Return, err + } + } + for k := range fsr { + if fsr[k].Name == srfi.FirstServerRoomName { + fsrExist = true + srfi.FirstServerRoom = fsr[k].ID + } + } + if !fsrExist { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("在数据中心(%s)不存在一级机房(%s)", srfi.IDCName, srfi.FirstServerRoomName) + return upload.Continue, nil + } + + //机房校验 + srs, err := repo.GetServerRoomByName(srfi.Name) + if err != nil && err != gorm.ErrRecordNotFound { + return upload.Return, err + } + if err == gorm.ErrRecordNotFound || srs == nil { + srfi.ID = 0 + } else { + srfi.IDCID = srs.IDCID + srfi.ID = srs.ID + + //如果通过导入修改数据中心,这块可以不做 + // + // if srfi.IDCID != idc.ID{ + // var br string + // if srfi.Content != "" { + // br = "<br />" + // } + // srfi.Content += br + fmt.Sprintf("已经存在的机房(%s)与录入的数据中心(%s)不一致", srfi.FirstServerRoomName, srfi.IDCName) + // return + // } + } + //使用表中数据查出来的数据中心ID,如果通过Excel导入修改数据中心要这样做 + srfi.IDCID = idc.ID + + //校验指定7*24小时电话格式是否正确 + phlist := strings.Split(srfi.SupportPhoneNumber, ",") + for k := range phlist { + if !chinaTelephoneNumberReq.MatchString(phlist[k]) { + var br string + if srfi.Content != "" { + br = "<br />" + } + srfi.Content += br + fmt.Sprintf("7*24小时电话(%s)格式不正确", phlist[k]) + } + } + + return upload.DO, nil +} + +//ImportServerRoomPriview 导入预览 +func ImportServerRoomPriview(log logger.Logger, repo model.Repo, reqData *upload.ImportReq) (map[string]interface{}, error) { + ra, err := utils.ParseDataFromXLSX(upload.UploadDir + reqData.FileName) + if err != nil { + return nil, err + } + length := len(ra) + + var success []*ServerRoomForImport + var failure []*ServerRoomForImport + for i := 1; i < length; i++ { + row := &ServerRoomForImport{} + if len(ra[i]) < 9 { + var br string + if row.Content != "" { + br = "<br />" + } + row.Content += br + "导入文件列长度不对(应为9列)" + failure = append(failure, row) + continue + } + + row.Name = strings.TrimSpace(ra[i][0]) + row.IDCName = strings.TrimSpace(ra[i][1]) + row.FirstServerRoomName = strings.TrimSpace(ra[i][2]) + row.City = strings.TrimSpace(ra[i][3]) + row.Address = strings.TrimSpace(ra[i][4]) + row.ServerRoomManager = strings.TrimSpace(ra[i][5]) + row.VendorManager = strings.TrimSpace(ra[i][6]) + row.NetworkAssetManager = strings.TrimSpace(ra[i][7]) + row.SupportPhoneNumber = strings.TrimSpace(ra[i][8]) + + //必填项校验 + row.checkLength() + //机房和数据中心校验 + _, err := row.validate(repo) + if err != nil { + return nil, err + } + + if row.Content != "" { + failure = append(failure, row) + } else { + success = append(success, row) + } + } + + var data []*ServerRoomForImport + if len(failure) > 0 { + data = failure + } else { + data = success + } + var result []*ServerRoomForImport + for i := 0; i < len(data); i++ { + if uint(i) >= reqData.Offset && uint(i) < (reqData.Offset+reqData.Limit) { + result = append(result, data[i]) + } + } + if len(failure) > 0 { + return map[string]interface{}{"status": "failure", + "message": "导入机房错误", + "import_status": false, + "record_count": len(data), + "content": result, + }, nil + } + return map[string]interface{}{"status": "success", + "message": "操作成功", + "import_status": true, + "record_count": len(data), + "content": result, + }, nil +} + +//ImportServerRoom 将导入机房放到数据库 +func ImportServerRoom(log logger.Logger, repo model.Repo, reqData *upload.ImportReq) error { + ra, err := utils.ParseDataFromXLSX(upload.UploadDir + reqData.FileName) + if err != nil { + return err + } + length := len(ra) + for i := 1; i < length; i++ { + row := &ServerRoomForImport{} + if len(ra[i]) < 9 { + continue + } + + row.Name = strings.TrimSpace(ra[i][0]) + row.IDCName = strings.TrimSpace(ra[i][1]) + row.FirstServerRoomName = strings.TrimSpace(ra[i][2]) + row.City = strings.TrimSpace(ra[i][3]) + row.Address = strings.TrimSpace(ra[i][4]) + row.ServerRoomManager = strings.TrimSpace(ra[i][5]) + row.VendorManager = strings.TrimSpace(ra[i][6]) + row.NetworkAssetManager = strings.TrimSpace(ra[i][7]) + row.SupportPhoneNumber = strings.TrimSpace(ra[i][8]) + + //必填项校验 + row.checkLength() + //机房和数据中心校验 + isSave, err := row.validate(repo) + if err != nil { + return err + } + + //不能获取IDC + if isSave == upload.Continue { + continue + } + + sr := &model.ServerRoom{ + IDCID: row.IDCID, + Name: row.Name, + FirstServerRoom: row.FirstServerRoom, + City: row.City, + Address: row.Address, + ServerRoomManager: row.ServerRoomManager, + VendorManager: row.VendorManager, + NetworkAssetManager: row.NetworkAssetManager, + SupportPhoneNumber: row.SupportPhoneNumber, + Creator: row.Creator, + } + if row.ID == 0 { + sr.Status = model.RoomStatUnderConstruction + _, err := repo.SaveServerRoom(sr) + if err != nil { + return err + } + } + if row.ID > 0 { + sr.ID = uint(row.ID) + _, err := repo.UpdateServerRoom([]*model.ServerRoom{sr}) + if err != nil { + return err + } + } + } + defer os.Remove(upload.UploadDir + reqData.FileName) + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/server_usite.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/server_usite.go new file mode 100644 index 0000000000000000000000000000000000000000..d384246719ca491df0b67d62fa6d48074d93f0da --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/server_usite.go @@ -0,0 +1,1519 @@ +package service + +import ( + "encoding/json" + "fmt" + "net/http" + "os" + "reflect" + "strconv" + "strings" + + "github.com/jinzhu/gorm" + "github.com/voidint/binding" + "github.com/voidint/page" + + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils" + "idcos.io/cloudboot/utils/collection" + strings2 "idcos.io/cloudboot/utils/strings" + "idcos.io/cloudboot/utils/upload" + "idcos.io/cloudboot/utils/user" +) + +// SaveServerUSiteReq 保存机位(U位)请求结构体 +type SaveServerUSiteReq struct { + // 所属机房ID + ServerRoomID uint `json:"server_room_id"` + // 所属机架(柜)ID + ServerCabinetID uint `json:"server_cabinet_id"` + // 机位(U位)ID。若id=0,则新增。若id>0,则修改。 + ID uint `json:"id"` + // 机位(U位)编号 + Number string `json:"number"` + // 机位(U位)高度 + Height uint `json:"height"` + // 起始U数 + Beginning uint `json:"beginning"` + // 备注 + Remark string `json:"remark"` + // 物理区域 + PhysicalArea string `json:"physical_area"` + // 管理网交换机 + OobnetSwitches []*model.SwitchInfo `json:"oobnet_switches"` + // 内网交换机 + IntranetSwitches []*model.SwitchInfo `json:"intranet_switches"` + // 外网交换机 + ExtranetSwitches []*model.SwitchInfo `json:"extranet_switches"` + // 内外网端口速率 + LAWAPortRate string `json:"la_wa_port_rate"` + LoginUser *model.CurrentUser `json:"-"` +} + +// ServerUSiteResp 机位返回信息体 +type ServerUSiteResp struct { + IDC struct { + // 数据中心ID + ID uint `json:"id"` + // 数据中心名称 + Name string `json:"name"` + } `json:"idc"` + + ServerRoom struct { + // 机房ID + ID uint `json:"id"` + // 机房名称 + Name string `json:"name"` + } `json:"server_room"` + + ServerCabinet struct { + // 机架ID + ID uint `json:"id"` + // 机架编号 + Number string `json:"number"` + } `json:"server_cabinet"` + + // 机位(U位)ID。若id=0,则新增。若id>0,则修改。 + ID uint `json:"id"` + // 机位(U位)编号 + Number string `json:"number"` + // 机位(U位)高度 + Height uint `json:"height"` + // 起始U数 + Beginning uint `json:"beginning"` + // 物理区域 + PhysicalArea string `json:"physical_area"` + // 管理网交换机 + OobnetSwitches []*model.SwitchInfo `json:"oobnet_switches"` + // 内网交换机 + IntranetSwitches []*model.SwitchInfo `json:"intranet_switches"` + // 外网交换机 + ExtranetSwitches []*model.SwitchInfo `json:"extranet_switches"` + // 内外网端口速率 + LAWAPortRate string `json:"la_wa_port_rate"` + // 备注 + Remark string `json:"remark"` + // 创建时间 + CreatedAt string `json:"created_at"` + // 修改时间 + UpdatedAt string `json:"updated_at"` + // 机位状态 + // USiteStatFree = "free" 机位(U位)状态-空闲 + // USiteStatPreOccupied = "pre_occupied" 机位(U位)状态-预占用 + // USiteStatUsed = "used" 机位(U位)状态-已使用 + // USiteStatDisabled = "disabled" 机位(U位)状态-不可用 + Status *string `json:"status"` + // 状态 + Creator string `json:"creator"` +} + +// FieldMap 请求字段映射 +func (reqData *SaveServerUSiteReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.ServerRoomID: "server_room_id", + &reqData.ServerCabinetID: "server_cabinet_id", + &reqData.ID: "id", + &reqData.Number: "number", + &reqData.Height: "height", + &reqData.Beginning: "beginning", + &reqData.PhysicalArea: "logical_area", + &reqData.Remark: "remark", + &reqData.OobnetSwitches: "oobnet_switches", + &reqData.IntranetSwitches: "intranet_switches", + &reqData.ExtranetSwitches: "extranet_switches", + &reqData.LAWAPortRate: "la_wa_port_rate", + } +} + +// Validate 结构体数据校验 +func (reqData *SaveServerUSiteReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + + if reqData.ServerRoomID == 0 { + errs.Add([]string{"server_room_id"}, binding.RequiredError, "机房管理单元ID不能为空") + return errs + } + if reqData.ServerCabinetID == 0 { + errs.Add([]string{"network_area_id"}, binding.RequiredError, "机架ID不能为空") + return errs + } + if reqData.Number == "" { + errs.Add([]string{"number"}, binding.RequiredError, "机位编号不能为空") + return errs + } + if reqData.Height <= 0 { + errs.Add([]string{"height"}, binding.RequiredError, "机位高度须大于0") + return errs + } + if reqData.Beginning <= 0 { + errs.Add([]string{"network_rate"}, binding.RequiredError, "起始U数须大于0") + return errs + } + + // 校验指定ID的机架(柜)是否存在 + cabinet, err := repo.GetServerCabinetByID(reqData.ServerCabinetID) + if err == gorm.ErrRecordNotFound { + errs.Add([]string{"idc_id", "server_room_id", "server_cabinet_id"}, binding.BusinessError, "该机架不存在") + return errs + } + // 校验机位高度不能超过机架高度 + // 机架高度为N,事际上是有N+1个机位 + if cabinet.Height+1 < reqData.Height { + errs.Add([]string{"height"}, binding.BusinessError, fmt.Sprintf("机位高度 %d, 不能超过所在机架高度 %d", reqData.Height, cabinet.Height)) + return errs + } + // 校验机位开始U位不能超过机架高度 + if cabinet.Height < reqData.Beginning { + errs.Add([]string{"beginning"}, binding.BusinessError, fmt.Sprintf("机位开始U位 %d, 不能超过所在机架高度 %d", reqData.Beginning, cabinet.Height)) + return errs + } + // 校验机位开始U位+机位调试不能超过机架高度 + if cabinet.Height < reqData.Beginning+(reqData.Height-1) { + errs.Add([]string{"beginning"}, binding.BusinessError, fmt.Sprintf("机位开始U位 %d, U位高度 %d, 不能超过所在机架高度 %d", reqData.Beginning, reqData.Height, cabinet.Height)) + return errs + } + + if err != nil { + errs.Add([]string{"idc_id", "server_room_id", "server_cabinet_id"}, binding.SystemError, "系统内部错误") + return errs + } + if cabinet.ServerRoomID != reqData.ServerRoomID || cabinet.ID != reqData.ServerCabinetID { + errs.Add([]string{"server_cabinet_id", "server_room_id"}, binding.BusinessError, "机房管理单元、机架不匹配") + return errs + } + + cond := model.CombinedServerUSite{ + ServerCabinetID: []uint{reqData.ServerCabinetID}, + ServerRoomID: []uint{reqData.ServerRoomID}, + } + usites, err := repo.GetServerUSiteByCond(&cond, nil, nil) + for _, usite := range usites { + if usite.Number == reqData.Number && reqData.ID != usite.ID { + errs.Add([]string{"number"}, binding.BusinessError, fmt.Sprintf("机位(%s)在所属机架内已经存在", reqData.Number)) + return errs + } + } + + // 内外网端口速率校验:GE\10GE\25GE\40GE + if _, ok := model.PortRateMap[reqData.LAWAPortRate]; !ok { + errs.Add([]string{"la_wa_port_rate"}, binding.BusinessError, fmt.Sprintf("机位(%s)关联内外网端口速率(%s)不正确,应为:GE|10GE|25GE|40GE", reqData.Number, reqData.LAWAPortRate)) + return errs + } + + // 如果新增,做唯一性校验 + if reqData.ID == 0 { + cond := model.CombinedServerUSite{ + CabinetNumber: reqData.Number, + ServerRoomID: []uint{reqData.ServerRoomID}, + ServerCabinetID: []uint{reqData.ServerCabinetID}, + } + usites, err := repo.GetServerUSiteByCond(&cond, nil, nil) + if err != nil { + errs.Add([]string{"repeat"}, binding.SystemError, "系统内部错误") + return errs + } + for _, usite := range usites { + if usite.Number == reqData.Number { + errs.Add([]string{"number"}, binding.BusinessError, fmt.Sprintf("机位Number %s在所属机架内已经存在", reqData.Number)) + return errs + } + } + } + + return errs +} + +// 批量修改机位状态入参结构体(机房管理单元+机架+机位) +type ServerUSiteForUpdate struct { + ServerRoomName string `json:"server_room_name"` + ServerCabinetNumber string `json:"server_cabinet_number"` + ServerUsiteNumber string `json:"server_usite_number"` +} + +// UpdateServerUSiteStatusReq 批量修改机位状态入参结构体 +type UpdateServerUSiteStatusReq struct { + // 状态 + Status string `json:"status"` + // id列表 + IDs []uint `json:"ids"` + // 机位结构体参数 + USites []*ServerUSiteForUpdate `json:"usites"` + LoginUser *model.CurrentUser `json:"-"` +} + +// FieldMap 请求字段映射 +func (reqData *UpdateServerUSiteStatusReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDs: "ids", + &reqData.Status: "status", + &reqData.USites: "usites", + } +} + +// Validate 结构体数据校验 +func (reqData *UpdateServerUSiteStatusReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + if len(reqData.IDs) == 0 && len(reqData.USites) == 0 { + errs.Add([]string{"目标机位"}, binding.RequiredError, "不能为空") + return errs + } + if reqData.Status == "" { + errs.Add([]string{"status"}, binding.RequiredError, "状态值不能为空") + return errs + } + + if !collection.InSlice(reqData.Status, []string{model.USiteStatFree, model.USiteStatPreOccupied, model.USiteStatUsed, model.USiteStatDisabled}) { + errs.Add([]string{"status"}, binding.RequiredError, "无效的状态值") + return errs + } + return errs +} + +// GetServerUSitePageReq 机位分页查询 +type GetServerUSitePageReq struct { + // 所属数据中心ID + IDCID string `json:"idc_id"` + // 所属机房ID + ServerRoomID string `json:"server_room_id"` + ServerRoomName string + // 所属机架ID + ServerCabinetID string `json:"server_cabinet_id"` + // 网络区域ID + NetAreaID string `json:"network_area_id"` + // 物理区域 + PhysicalArea string `json:"physical_area"` + // 机架编号 + CabinetNumber string `json:"cabinet_number"` + // 机位编号 + USiteNumber string `json:"usite_number"` + // 机位调试 + Height string `json:"height"` + // 机位状态 + // USiteStatFree = "free" 机位(U位)状态-空闲 + // USiteStatPreOccupied = "pre_occupied" 机位(U位)状态-预占用 + // USiteStatUsed = "used" 机位(U位)状态-已使用 + // USiteStatDisabled = "disabled" 机位(U位)状态-不可用 + Status string `json:"status"` + // 内外网端口速率 + LAWAPortRate string `json:"la_wa_port_rate"` + // 分页页号 + Page int64 `json:"page"` + // 分页大小 + PageSize int64 `json:"page_size"` + // 从UAM上获取用户信息的钩子 + GetNameFromUAM user.GetNameFromUAM `json:"-"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *GetServerUSitePageReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDCID: "idc_id", + &reqData.ServerRoomID: "server_room_id", + &reqData.ServerRoomName: "server_room_name", + &reqData.ServerCabinetID: "server_cabinet_id", + &reqData.CabinetNumber: "cabinet_number", + &reqData.USiteNumber: "usite_number", + &reqData.NetAreaID: "network_area_id", + &reqData.PhysicalArea: "physical_area", + &reqData.Height: "height", + &reqData.Status: "status", + &reqData.LAWAPortRate: "la_wa_port_rate", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + } +} + +// GetServerUSitePage 按条件查询机位分页列表 +func GetServerUSitePage(log logger.Logger, repo model.Repo, reqData *GetServerUSitePageReq) (pg *page.Page, err error) { + if reqData.PageSize <= 0 || reqData.PageSize > 100 { + reqData.PageSize = 10 + } + if reqData.Page < 0 { + reqData.Page = 0 + } + + cond := model.CombinedServerUSite{ + IDCID: strings2.Multi2UintSlice(reqData.IDCID), + ServerRoomID: strings2.Multi2UintSlice(reqData.ServerRoomID), + ServerCabinetID: strings2.Multi2UintSlice(reqData.ServerCabinetID), + ServerRoomName: reqData.ServerRoomName, + NetAreaID: strings2.Multi2UintSlice(reqData.NetAreaID), + PhysicalArea: reqData.PhysicalArea, + CabinetNumber: reqData.CabinetNumber, + USiteNumber: reqData.USiteNumber, + Height: reqData.Height, + Status: reqData.Status, + LAWAPortRate: reqData.LAWAPortRate, + } + + totalRecords, err := repo.CountServerUSite(&cond) + if err != nil { + return nil, err + } + + pager := page.NewPager(reflect.TypeOf(&ServerUSiteResp{}), reqData.Page, reqData.PageSize, totalRecords) + items, err := repo.GetServerUSiteByCond(&cond, model.OneOrderBy("id", model.DESC), pager.BuildLimiter()) + if err != nil { + return nil, err + } + + for i := range items { + usite := convert2ServerUsite(repo, items[i]) + + if usite != nil { + _, name, _ := reqData.GetNameFromUAM(usite.Creator) + usite.CreatedAt = name + } + + pager.AddRecords(convert2ServerUsite(repo, items[i])) + } + return pager.BuildPage(), nil +} + +func convert2ServerUsite(repo model.Repo, item *model.ServerUSite) *ServerUSiteResp { + uSite := ServerUSiteResp{ + ID: item.ID, + Number: item.Number, + Height: item.Height, + Beginning: item.Beginning, + PhysicalArea: item.PhysicalArea, + OobnetSwitches: toSwitchInfoArray(item.OobnetSwitches), + IntranetSwitches: toSwitchInfoArray(item.IntranetSwitches), + ExtranetSwitches: toSwitchInfoArray(item.ExtranetSwitches), + Remark: item.Remark, + CreatedAt: item.CreatedAt.Format("2006-01-02 15:04:05"), + UpdatedAt: item.UpdatedAt.Format("2006-01-02 15:04:05"), + Status: &item.Status, + LAWAPortRate: item.LAWAPortRate, + Creator: item.Creator, + } + + if idc, _ := repo.GetIDCByID(item.IDCID); idc != nil { + uSite.IDC.ID = idc.ID + uSite.IDC.Name = idc.Name + } + + if room, _ := repo.GetServerRoomByID(item.ServerRoomID); room != nil { + uSite.ServerRoom.ID = room.ID + uSite.ServerRoom.Name = room.Name + } + + if cabinet, _ := repo.GetServerCabinetByID(item.ServerCabinetID); cabinet != nil { + uSite.ServerCabinet.ID = cabinet.ID + uSite.ServerCabinet.Number = cabinet.Number + } + + return &uSite +} + +// SaveServerUSite 保存机位(U位) +func SaveServerUSite(log logger.Logger, repo model.Repo, reqData *SaveServerUSiteReq) (err error) { + var originUSite *model.ServerUSite + if reqData.ID > 0 { + originUSite, err = repo.GetServerUSiteByID(reqData.ID) + if err != nil { + return err + } + } + + // 通过机架去查找idc_id + cabinet, _ := repo.GetServerCabinetByID(reqData.ServerCabinetID) + + uSite := model.ServerUSite{ + IDCID: cabinet.IDCID, + ServerRoomID: reqData.ServerRoomID, + ServerCabinetID: reqData.ServerCabinetID, + Number: reqData.Number, + Beginning: reqData.Beginning, + OobnetSwitches: toJSONString(reqData.OobnetSwitches), + IntranetSwitches: toJSONString(reqData.IntranetSwitches), + ExtranetSwitches: toJSONString(reqData.ExtranetSwitches), + Height: reqData.Height, + PhysicalArea: reqData.PhysicalArea, + Status: model.USiteStatFree, + LAWAPortRate: reqData.LAWAPortRate, + Remark: reqData.Remark, + Creator: reqData.LoginUser.LoginName, + } + uSite.ID = reqData.ID + + if originUSite != nil { + uSite.Status = originUSite.Status + } + + _, err = repo.SaveServerUSite(&uSite) + if reqData.ID == 0 { + reqData.ID = uSite.ID + } + return err +} + +// GetServerUSiteByID 根据ID查询机位信息 +func GetServerUSiteByID(repo model.Repo, id uint) (resp *ServerUSiteResp, err error) { + uSite, err := repo.GetServerUSiteByID(id) + if err != nil { + return nil, err + } + + idc, err := repo.GetIDCByID(uSite.IDCID) + if err != nil { + return nil, err + } + + room, err := repo.GetServerRoomByID(uSite.ServerRoomID) + if err != nil { + return nil, err + } + + cabinet, err := repo.GetServerCabinetByID(uSite.ServerCabinetID) + if err != nil { + return nil, err + } + + resp = &ServerUSiteResp{ + ID: uSite.ID, + Number: uSite.Number, + Height: uSite.Height, + Beginning: uSite.Beginning, + Remark: uSite.Remark, + UpdatedAt: uSite.UpdatedAt.Format("2006-01-02 15:04:05"), + CreatedAt: uSite.CreatedAt.Format("2006-01-02 15:04:05"), + Creator: uSite.Creator, + Status: &uSite.Status, + LAWAPortRate: uSite.LAWAPortRate, + PhysicalArea: uSite.PhysicalArea, + OobnetSwitches: toSwitchInfoArray(uSite.OobnetSwitches), + IntranetSwitches: toSwitchInfoArray(uSite.IntranetSwitches), + ExtranetSwitches: toSwitchInfoArray(uSite.ExtranetSwitches), + } + resp.IDC.ID = idc.ID + resp.IDC.Name = idc.Name + resp.ServerRoom.ID = room.ID + resp.ServerRoom.Name = room.Name + resp.ServerCabinet.ID = cabinet.ID + resp.ServerCabinet.Number = cabinet.Number + + return resp, nil + +} + +type UsiteTreeResp struct { + Roots []*RootCabinet `json:"roots"` +} + +type RootCabinet struct { + CabinetID uint `json:"cabinet_id"` + CabinetNumber string `json:"cabinet_number"` + AvailableUsitesCount uint `json:"available_usites_count"` + Leaves []*LeafUsite `json:"leaves"` +} +type LeafUsite struct { + UsiteID uint `json:"usite_id"` + UsiteNumber string `json:"usite_number"` + Status string `json:"status"` +} + +type UsiteTreeReq struct { + IDCID uint `json:"idc_id"` + ServerRoomID uint `json:"server_room_id"` + PhysicalArea string `json:"physical_area"` + UsiteStatus string `json:"usite_status"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *UsiteTreeReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDCID: "idc_id", + &reqData.ServerRoomID: "server_room_id", + &reqData.PhysicalArea: "physical_area", + &reqData.UsiteStatus: "usite_status", + } +} + +// Validate 结构体数据校验 +func (reqData *UsiteTreeReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + if reqData.IDCID == 0 { + errs.Add([]string{"idc_id"}, binding.RequiredError, "需要指定数据中心ID") + return errs + } + if reqData.ServerRoomID == 0 { + errs.Add([]string{"status"}, binding.RequiredError, "需要指定机房管理单元ID") + return errs + } + if reqData.PhysicalArea == "" { + errs.Add([]string{"physical_area"}, binding.RequiredError, "需要指定物理区域") + return errs + } + return errs +} + +// GetUsiteTree 机位树 +func GetUsiteTree(log logger.Logger, repo model.Repo, reqData *UsiteTreeReq) (tree *UsiteTreeResp, err error) { + //查询指定数据中心,机房下的机架信息 + cabinets, err := repo.GetCabinetOrderByFreeUsites(&model.ServerCabinet{ + IDCID: reqData.IDCID, + ServerRoomID: reqData.ServerRoomID, + }, reqData.PhysicalArea) + + if err != nil { + log.Error(err) + return nil, err + } + + tree = &UsiteTreeResp{} + tree.Roots = make([]*RootCabinet, 0, len(cabinets)) + + for _, c := range cabinets { + //获取每个机架下的机位信息 + cond := &model.CombinedServerUSite{ + ServerCabinetID: []uint{c.ID}, + PhysicalArea: reqData.PhysicalArea, + } + if reqData.UsiteStatus != "" { + cond.Status = reqData.UsiteStatus + } + usites, err := repo.GetServerUSiteByCond(cond, model.OneOrderBy("number", model.ASC), nil) + if err != nil { + log.Error(err) + continue + } + leaf := make([]*LeafUsite, 0, len(usites)) + for _, u := range usites { + leaf = append(leaf, &LeafUsite{ + UsiteID: u.ID, + UsiteNumber: u.Number, + Status: u.Status, + }) + } + + tree.Roots = append(tree.Roots, &RootCabinet{ + CabinetID: c.ID, + CabinetNumber: c.Number, + AvailableUsitesCount: c.AvailableUsiteCount, + Leaves: leaf, + }) + } + return +} + +// BatchUpdateServerUSitesStatus 批量更新机位状态信息 +func BatchUpdateServerUSitesStatus(repo model.Repo, ids []uint, status string) (affected int64, err error) { + return repo.BatchUpdateServerUSitesStatus(ids, status) +} + +// BatchUpdateServerUSitesStatusByCond 根据其他定制性条件进行批量更新机位状态信息 +func BatchUpdateServerUSitesStatusByCond(log logger.Logger, repo model.Repo, susfu []*ServerUSiteForUpdate, status string) (affected int64, err error) { + // 根据 机房管理单元-机架-机位 更新状态 + if len(susfu) !=0 { + // 拼接 ServerUSiteForUpdate 成 机房管理单元-机架-机位 + var usiteslice []string + for _, u := range susfu { + // 根据条件查询获取机位 + condcheck := model.CombinedServerUSite{ + ServerRoomNameCabinetNumUSiteNum: fmt.Sprintf("%s%s%s", u.ServerRoomName, u.ServerCabinetNumber, u.ServerUsiteNumber), + } + usite, err := repo.GetServerUSiteByCond(&condcheck, nil, nil) + if err != nil { + log.Errorf(err.Error()) + return 0, err + } + if len(usite) == 0 { + log.Errorf("机位不存在:%s", condcheck.ServerRoomNameCabinetNumUSiteNum) + return 0, fmt.Errorf("机位不存在:%s", condcheck.ServerRoomNameCabinetNumUSiteNum) + } + if len(usite) > 1 { + log.Errorf("机位不唯一:%s", condcheck.ServerRoomNameCabinetNumUSiteNum) + return 0, fmt.Errorf("机位不唯一:%s", condcheck.ServerRoomNameCabinetNumUSiteNum) + } + usiteslice = append(usiteslice, fmt.Sprintf("%s%s%s", u.ServerRoomName, u.ServerCabinetNumber, u.ServerUsiteNumber)) + } + // 根据条件查询获取机位 + cond := model.CombinedServerUSite{ + ServerRoomNameCabinetNumUSiteNumSlice: usiteslice, + } + usites, err := repo.GetServerUSiteByCond(&cond, nil, nil) + if err != nil { + log.Errorf(err.Error()) + return 0, err + } + // 查询的机位数量必须与参数一致 + if len(usites) == len(susfu) { + var ids []uint + switch status { + // 空闲 -> 预占用 + case model.USiteStatPreOccupied: + for k := range usites { + if usites[k].Status != model.USiteStatFree { + serverRoom, _ := repo.GetServerRoomByID(usites[k].ServerRoomID) + cabinet, _ := repo.GetServerCabinetByID(usites[k].ServerCabinetID) + log.Errorf("存在非空闲的机位(%v-%v-%v),不允许置为预占用", serverRoom.Name, cabinet.Number, usites[k].Number) + return 0, fmt.Errorf("存在非空闲的机位(%v-%v-%v),不允许置为预占用", serverRoom.Name, cabinet.Number, usites[k].Number) + } + ids = append(ids, usites[k].ID) + } + // 预占用 -> 空闲 + case model.USiteStatFree: + for k := range usites { + if usites[k].Status != model.USiteStatPreOccupied { + serverRoom, _ := repo.GetServerRoomByID(usites[k].ServerRoomID) + cabinet, _ := repo.GetServerCabinetByID(usites[k].ServerCabinetID) + log.Errorf("存在非预占用的机位(%v-%v-%v),不允许置为空闲", serverRoom.Name, cabinet.Number, usites[k].Number) + return 0, fmt.Errorf("存在非预占用的机位(%v-%v-%v),不允许置为空闲", serverRoom.Name, cabinet.Number, usites[k].Number) + } + ids = append(ids, usites[k].ID) + } + } + // 校验通过,通过ID批量更新机位状态 + return repo.BatchUpdateServerUSitesStatus(ids, status) + } else { + log.Errorf("查询获取的机位数量(%v)与请求传入的数量(%v)不一致",len(usites), len(susfu)) + return 0, fmt.Errorf("查询获取的机位数量(%v)与请求传入的数量(%v)不一致",len(usites), len(susfu)) + } + } + log.Errorf("请求传入的机位数量为0,未更新任何机位状态") + return 0, fmt.Errorf("请求传入的机位数量为0,未更新任何机位状态") +} + +// DeleteServerUSitePort 删除机位端口号 +func DeleteServerUSitePort(repo model.Repo, id uint) (affected int64, err error) { + + //USite check + usite, err := repo.GetServerUSiteByID(id) + if err != nil { + return 0, err + } + + if usite == nil { + return 0, fmt.Errorf("机位信息不存在") + } + + // check device + cond := &model.CombinedDeviceCond{ + USiteID: []uint{usite.ID}, + } + devices, err := repo.GetCombinedDevices(cond, nil, nil) + if err != nil { + return 0, err + } + + if len(devices) > 0 { + return 0, fmt.Errorf("指定编号(%s)的机位下存在设备信息,无法删除", usite.Number) + } + + return repo.DeleteServerUSitePort(id) +} + +// RemoveServerUSiteByID 删除机位 +func RemoveServerUSiteByID(repo model.Repo, id uint) (affected int64, err error) { + // 校验机位是否被使用 + usite, err := repo.GetServerUSiteByID(id) + if err != nil { + return 0, err + } + + if model.USiteStatUsed == usite.Status { + return 0, fmt.Errorf("机位(%s)已经被使用,无法删除", usite.Number) + } + + items, err := repo.GetDevicesByUSiteID(id) + if err != nil { + return 0, err + } + + if len(items) > 0 { + return 0, fmt.Errorf("机位(%s)已经分配设备信息,无法删除", usite.Number) + } + + return repo.RemoveServerUSiteByID(id) +} + +//ServerUSiteForImport 为了导入 +type ServerUSiteForImport struct { + ServerCabinetNumber string `json:"server_cabinet_number"` + ServerRoomName string `json:"server_room_name"` + Number string `json:"number"` + Height int `json:"height"` + PhysicalArea string `json:"physical_area"` + Beginning int `json:"beginning"` + Remark string `json:"remark"` + Status string `json:"status"` + IDCID uint `json:"idc_id"` + ServerRoomID uint `json:"server_room_id"` + ServerCabinetID uint `json:"server_cabinet_id"` + Creator string `json:"creator"` + Content string `json:"content"` + ID uint `json:"-"` +} + +//ServerUSitePortForImport 为了导入 +type ServerUSitePortForImport struct { + ID uint `json:"id"` + ServerCabinetNumber string `json:"server_cabinet_number"` + ServerRoomName string `json:"server_room_name"` + ServerRoomID uint `json:"server_room_id"` + ServerCabinetID uint `json:"server_cabinet_id"` + IDCID uint `json:"idc_id"` + Number string `json:"number"` + OobnetSwitchNamePort string `json:"oobnet_switch_name_port"` + IntranetNamePort string `json:"intranet_switch_name_port"` + ExtranetSwitchNamePort string `json:"extranet_switch_name_port"` + LAWAPortRate string `json:"la_wa_port_rate"` // 内外网端口速率:GE\10GE\25GE\40GE + Content string `json:"content"` +} + +//checkLength 对导入文件中的数据做基本验证 +func (susfi *ServerUSiteForImport) checkLength() { + leg := len(susfi.ServerRoomName) + if leg == 0 || leg > 255 { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("必填项校验:机房管理单元名称length(%d)", leg) + } + leg = len(susfi.ServerCabinetNumber) + if leg == 0 || leg > 255 { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("必填项校验:机架编号length(%d)", leg) + } + leg = len(susfi.Number) + if leg == 0 || leg > 255 { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("必填项校验:机位编号length(%d)", leg) + } + if susfi.Height <= 0 { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("必填项校验:机位高度(%d)", susfi.Height) + } + if susfi.Beginning <= 0 { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("必填项校验:起始U数(%d)", susfi.Beginning) + } + leg = len(susfi.PhysicalArea) + if leg == 0 || leg > 255 { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("必填项校验: 物理区域length(%d)", leg) + } +} + +//validate 对导入文件中的数据做基本验证 +func (susfi *ServerUSiteForImport) validate(repo model.Repo) error { + //机房校验 + srs, err := repo.GetServerRoomByName(susfi.ServerRoomName) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if err == gorm.ErrRecordNotFound || srs == nil { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("机房名(%s)不存在", susfi.ServerRoomName) + return nil + } + + susfi.IDCID = srs.IDCID + susfi.ServerRoomID = srs.ID + + //机架(柜)校验 + cabinets, err := repo.GetServerCabinetID(&model.ServerCabinet{Number: susfi.ServerCabinetNumber, + ServerRoomID: susfi.ServerRoomID, + IDCID: susfi.IDCID, + }) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if err == gorm.ErrRecordNotFound || len(cabinets) != 1 { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("机架(柜)(%s)不存在", susfi.ServerCabinetNumber) + return nil + } + susfi.ServerCabinetID = cabinets[0] + + cabinet, _ := repo.GetServerCabinetByID(susfi.ServerCabinetID) + + // 校验机位高度不能超过机架高度 + if cabinet.Height < uint(susfi.Height) { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("机位高度 %d, 不能超过所在机架高度 %d", susfi.Height, cabinet.Height) + return nil + } + // 校验机位开始U位不能超过机架高度 + if cabinet.Height < uint(susfi.Beginning) { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("机位开始U位 %d, 不能超过所在机架高度 %d", susfi.Beginning, cabinet.Height) + return nil + } + // 校验机位开始U位+机位调试不能超过机架高度 + if cabinet.Height < uint(susfi.Beginning+susfi.Height) { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("机位开始U位 %d, U位调试 %d, 不能超过所在机架高度 %d", susfi.Beginning, susfi.Height, cabinet.Height) + return nil + } + + if netArea, err := repo.GetNetworkAreaByID(cabinet.NetworkAreaID); err != nil || netArea == nil { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("机架:%s网络区域ID:%d不存在", cabinet.Number, cabinet.NetworkAreaID) + return nil + } else if netArea != nil { + var physicalArea = make([]model.ParamListINT, 0) + err = json.Unmarshal([]byte(netArea.PhysicalArea), &physicalArea) + if err != nil { + return err + } + physicalAreaValid := false + for _, phyArea := range physicalArea { + if phyArea.Name == susfi.PhysicalArea { + physicalAreaValid = true + break + } + } + if !physicalAreaValid { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("物理区域:%s非法,不属于网络区域:%s", susfi.PhysicalArea, netArea.Name) + return nil + } + } + + // 如果新增,做唯一性校验 + cond := model.CombinedServerUSite{ + IDCID: []uint{susfi.IDCID}, + USiteNumber: susfi.Number, + ServerRoomID: []uint{susfi.ServerRoomID}, + ServerCabinetID: []uint{susfi.ServerCabinetID}, + } + usites, err := repo.GetServerUSiteByCond(&cond, nil, nil) + if err != nil { + return err + } + if len(usites) != 0 { + for k := range usites { + if usites[k].Number == susfi.Number { + susfi.ID = usites[k].ID + break + } + } + } else { + susfi.ID = 0 + } + + //逻辑区域校验: 待定 + //TODO + return nil +} + +//checkLength 对导入文件中的数据做基本验证 +func (susfi *ServerUSitePortForImport) checkLength() { + leg := len(susfi.ServerRoomName) + if leg == 0 || leg > 255 { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("必填项校验:机房管理单元名称length(%d)", leg) + } + leg = len(susfi.ServerCabinetNumber) + if leg == 0 || leg > 255 { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("必填项校验:机架编号length(%d)", leg) + } + leg = len(susfi.Number) + if leg == 0 || leg > 255 { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("必填项校验:机位编号length(%d)", leg) + } + leg = len(susfi.OobnetSwitchNamePort) + if leg == 0 || leg > 255 { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("必填项校验:带外交换机设备端口(%s)", susfi.OobnetSwitchNamePort) + } + leg = len(susfi.IntranetNamePort) + if leg == 0 || leg > 255 { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("必填项校验:内网交换机设备端口(%s)", susfi.IntranetNamePort) + } + leg = len(susfi.LAWAPortRate) + if leg == 0 || leg > 255 { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("必填项校验:内外网端口速率(%s)", susfi.IntranetNamePort) + } +} + +//validate 对导入文件中的数据做基本验证 +func (susfi *ServerUSitePortForImport) validate(repo model.Repo) error { + // 添加机位端口名称格式校验 + if susfi.ExtranetSwitchNamePort != "" && !strings.Contains(susfi.ExtranetSwitchNamePort, "_") { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("外网交换机名称端口号(%s)格式不正确,多个交换机用英文分号(;)分隔,设备名称与端口用下划线(_)分隔", susfi.ExtranetSwitchNamePort) + } + + if !strings.Contains(susfi.IntranetNamePort, "_") { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("内网交换机名称端口号(%s)格式不正确,多个交换机用英文分号(;)分隔,设备名称与端口用下划线(_)分隔", susfi.IntranetNamePort) + } + + if !strings.Contains(susfi.OobnetSwitchNamePort, "_") { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("管理网交换机名称端口号(%s)格式不正确,多个交换机用英文分号(;)分隔,设备名称与端口用下划线(_)分隔", susfi.OobnetSwitchNamePort) + } + // 内外网端口速率校验:GE\10GE\25GE\40GE + if _, ok := model.PortRateMap[susfi.LAWAPortRate]; !ok { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("内外网端口速率(%s)不正确,应为:GE|10GE|25GE|40GE", susfi.LAWAPortRate) + } + //机房校验 + srs, err := repo.GetServerRoomByName(susfi.ServerRoomName) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if err == gorm.ErrRecordNotFound || srs == nil { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("机房名(%s)不存在", susfi.ServerRoomName) + return nil + } + + susfi.IDCID = srs.IDCID + susfi.ServerRoomID = srs.ID + + //机架(柜)校验 + scid, err := repo.GetServerCabinetID(&model.ServerCabinet{Number: susfi.ServerCabinetNumber, + ServerRoomID: susfi.ServerRoomID, + IDCID: susfi.IDCID, + }) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if err == gorm.ErrRecordNotFound || len(scid) != 1 { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("机房%s 中不存在 机架(柜)(%s)", srs.Name, susfi.ServerCabinetNumber) + return nil + } + susfi.ServerCabinetID = scid[0] + + // 机位校验 + usite, err := repo.GetServerUSiteByNumber(susfi.ServerCabinetID, susfi.Number) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if err == gorm.ErrRecordNotFound { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("机位(U位)(%s)不存在", susfi.Number) + return nil + } + + if usite.ServerCabinetID != susfi.ServerCabinetID { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("[%s]机位的机架与[%s]机架不一致", usite.Number, susfi.ServerCabinetNumber) + return nil + } + if usite.ServerRoomID != susfi.ServerRoomID { + var br string + if susfi.Content != "" { + br = "<br />" + } + susfi.Content += br + fmt.Sprintf("[%s]机位的机房与[%s]机房不一致", usite.Number, susfi.ServerRoomName) + return nil + } + return nil +} + +//ImportServerUSitePreview 导入预览 +func ImportServerUSitePreview(log logger.Logger, repo model.Repo, reqData *upload.ImportReq) (map[string]interface{}, error) { + ra, err := utils.ParseDataFromXLSX(upload.UploadDir + reqData.FileName) + if err != nil { + return nil, err + } + length := len(ra) + + var success []*ServerUSiteForImport + var failure []*ServerUSiteForImport + for i := 1; i < length; i++ { + row := &ServerUSiteForImport{} + if len(ra[i]) < 8 { + var br string + if row.Content != "" { + br = "<br />" + } + row.Content += br + "导入文件列长度不对(应为8列)" + failure = append(failure, row) + continue + } + + row.ServerRoomName = strings.TrimSpace(ra[i][0]) + row.ServerCabinetNumber = strings.TrimSpace(ra[i][1]) + row.Number = strings.TrimSpace(ra[i][2]) + row.Height, _ = strconv.Atoi(strings.TrimSpace(ra[i][3])) + row.PhysicalArea = strings.TrimSpace(ra[i][4]) + row.Beginning, _ = strconv.Atoi(strings.TrimSpace(ra[i][5])) + row.Status = strings.TrimSpace(ra[i][6]) + row.Remark = strings.TrimSpace(ra[i][7]) + + //必填项校验 + row.checkLength() + //机房和机架(柜)校验 + err := row.validate(repo) + if err != nil { + return nil, err + } + + if row.Content != "" { + failure = append(failure, row) + } else { + success = append(success, row) + } + } + + var data []*ServerUSiteForImport + if len(failure) > 0 { + data = failure + } else { + data = success + } + var result []*ServerUSiteForImport + for i := 0; i < len(data); i++ { + if uint(i) >= reqData.Offset && uint(i) < (reqData.Offset+reqData.Limit) { + result = append(result, data[i]) + } + } + if len(failure) > 0 { + return map[string]interface{}{"status": "failure", + "message": "导入机位(U位)错误", + "record_count": len(data), + "content": result, + }, nil + } + return map[string]interface{}{"status": "success", + "message": "操作成功", + "import_status": true, + "record_count": len(data), + "content": result, + }, nil +} + +//ImportServerUSitePortsPreview 导入预览 +func ImportServerUSitePortsPreview(log logger.Logger, repo model.Repo, reqData *upload.ImportReq) (map[string]interface{}, error) { + ra, err := utils.ParseDataFromXLSX(upload.UploadDir + reqData.FileName) + if err != nil { + return nil, err + } + length := len(ra) + + var success []*ServerUSitePortForImport + var failure []*ServerUSitePortForImport + for i := 1; i < length; i++ { + row := &ServerUSitePortForImport{} + if len(ra[i]) < 7 { + var br string + if row.Content != "" { + br = "<br />" + } + row.Content += br + "导入文件列长度不对(应为7列)" + failure = append(failure, row) + continue + } + + row.ServerRoomName = strings.TrimSpace(ra[i][0]) + row.ServerCabinetNumber = strings.TrimSpace(ra[i][1]) + row.Number = strings.TrimSpace(ra[i][2]) + row.OobnetSwitchNamePort = strings.TrimSpace(ra[i][3]) + row.IntranetNamePort = strings.TrimSpace(ra[i][4]) + row.ExtranetSwitchNamePort = strings.TrimSpace(ra[i][5]) + row.LAWAPortRate = strings.TrimSpace(ra[i][6]) + + //中文分号替换 + row.OobnetSwitchNamePort = strings.Replace(row.OobnetSwitchNamePort, ";", ";", -1) + row.IntranetNamePort = strings.Replace(row.IntranetNamePort, ";", ";", -1) + row.ExtranetSwitchNamePort = strings.Replace(row.ExtranetSwitchNamePort, ";", ";", -1) + + //必填项校验 + row.checkLength() + //机房和机架(柜)校验 + err := row.validate(repo) + if err != nil { + return nil, err + } + + if row.Content != "" { + failure = append(failure, row) + } else { + success = append(success, row) + } + } + + var data []*ServerUSitePortForImport + if len(failure) > 0 { + data = failure + } else { + data = success + } + var result []*ServerUSitePortForImport + for i := 0; i < len(data); i++ { + if uint(i) >= reqData.Offset && uint(i) < (reqData.Offset+reqData.Limit) { + result = append(result, data[i]) + } + } + if len(failure) > 0 { + return map[string]interface{}{"status": "failure", + "message": "导入机位(U位)端口错误", + "record_count": len(data), + "content": result, + }, nil + } + return map[string]interface{}{"status": "success", + "message": "操作成功", + "import_status": true, + "record_count": len(data), + "content": result, + }, nil +} + +//ImportServerUSite 将导入机位(U位)放到数据库 +func ImportServerUSite(log logger.Logger, repo model.Repo, reqData *upload.ImportReq) error { + ra, err := utils.ParseDataFromXLSX(upload.UploadDir + reqData.FileName) + if err != nil { + return err + } + length := len(ra) + for i := 1; i < length; i++ { + row := &ServerUSiteForImport{} + if len(ra[i]) < 8 { + continue + } + + row.ServerRoomName = strings.TrimSpace(ra[i][0]) + row.ServerCabinetNumber = strings.TrimSpace(ra[i][1]) + row.Number = strings.TrimSpace(ra[i][2]) + row.Height, _ = strconv.Atoi(strings.TrimSpace(ra[i][3])) + row.PhysicalArea = strings.TrimSpace(ra[i][4]) + row.Beginning, _ = strconv.Atoi(strings.TrimSpace(ra[i][5])) + row.Status = usiteStatusTransfer(ra[i][6], false) + row.Remark = strings.TrimSpace(ra[i][7]) + + //必填项校验 + row.checkLength() + //机房和机架(柜)校验 + err := row.validate(repo) + if err != nil { + return err + } + + sus := &model.ServerUSite{ + IDCID: row.IDCID, + ServerRoomID: row.ServerRoomID, + ServerCabinetID: row.ServerCabinetID, + Height: uint(row.Height), + Beginning: uint(row.Beginning), + PhysicalArea: row.PhysicalArea, + Number: row.Number, + Remark: row.Remark, + LAWAPortRate: model.PortRateDefault, + Status: model.USiteStatFree, + Creator: reqData.UserName, //row.Creator, + } + + sus.ID = row.ID + + if row.Status != "" { + sus.Status = row.Status + } + + //插入或者更新 + if _, err = repo.SaveServerUSite(sus); err != nil { + return err + } + } + defer os.Remove(upload.UploadDir + reqData.FileName) + return nil +} + +//ImportServerUSitePort 将导入机位(U位)放到数据库 +func ImportServerUSitePort(log logger.Logger, repo model.Repo, reqData *upload.ImportReq) error { + ra, err := utils.ParseDataFromXLSX(upload.UploadDir + reqData.FileName) + if err != nil { + return err + } + length := len(ra) + for i := 1; i < length; i++ { + row := &ServerUSitePortForImport{} + if len(ra[i]) < 7 { + continue + } + + row.ServerRoomName = strings.TrimSpace(ra[i][0]) + row.ServerCabinetNumber = strings.TrimSpace(ra[i][1]) + row.Number = strings.TrimSpace(ra[i][2]) + row.OobnetSwitchNamePort = strings.TrimSpace(ra[i][3]) + row.IntranetNamePort = strings.TrimSpace(ra[i][4]) + row.ExtranetSwitchNamePort = strings.TrimSpace(ra[i][5]) + row.LAWAPortRate = strings.TrimSpace(ra[i][6]) + + //必填项校验 + row.checkLength() + //机房和机架(柜)校验 + err := row.validate(repo) + if err != nil { + return err + } + + //中文分号替换 + row.OobnetSwitchNamePort = strings.Replace(row.OobnetSwitchNamePort, ";", ";", -1) + row.IntranetNamePort = strings.Replace(row.IntranetNamePort, ";", ";", -1) + row.ExtranetSwitchNamePort = strings.Replace(row.ExtranetSwitchNamePort, ";", ";", -1) + + // 处理机位端口号 + OobnetSwitches := processSwitchNamePort(row.OobnetSwitchNamePort) + IntranetSwitches := processSwitchNamePort(row.IntranetNamePort) + ExtranetSwitches := processSwitchNamePort(row.ExtranetSwitchNamePort) + + sus := &model.ServerUSite{ + IDCID: row.IDCID, + ServerRoomID: row.ServerRoomID, + ServerCabinetID: row.ServerCabinetID, + OobnetSwitches: toJSONString(OobnetSwitches), + IntranetSwitches: toJSONString(IntranetSwitches), + ExtranetSwitches: toJSONString(ExtranetSwitches), + LAWAPortRate: row.LAWAPortRate, + } + + //查询是否已经存在 + usite, err := repo.GetServerUSiteByNumber(row.ServerCabinetID, row.Number) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + sus.ID = usite.ID + sus.Number = usite.Number + sus.PhysicalArea = usite.PhysicalArea + sus.Height = usite.Height + sus.Status = usite.Status + sus.Remark = usite.Remark + sus.Beginning = usite.Beginning + + //插入或者更新 + if _, err = repo.SaveServerUSite(sus); err != nil { + return err + } + } + defer os.Remove(upload.UploadDir + reqData.FileName) + return nil +} + +// processSwitchNamePort 处理机位端口号 +func processSwitchNamePort(namePort string) []*model.SwitchInfo { + var OobnetSwitches []*model.SwitchInfo + + if strings.Contains(namePort, "_") && strings.Contains(namePort, ";") { + for _, oobnetSwitch := range strings.Split(namePort, ";") { + switchInfo := &model.SwitchInfo{ + Name: oobnetSwitch[:strings.LastIndex(oobnetSwitch, "_")], + Port: oobnetSwitch[strings.LastIndex(oobnetSwitch, "_")+1:], + } + OobnetSwitches = append(OobnetSwitches, switchInfo) + } + } + + if strings.Contains(namePort, "_") && !strings.Contains(namePort, ";") { + switchInfo := &model.SwitchInfo{ + Name: namePort[:strings.LastIndex(namePort, "_")], + Port: namePort[strings.LastIndex(namePort, "_")+1:], + } + OobnetSwitches = append(OobnetSwitches, switchInfo) + } + + return OobnetSwitches +} + +//CheckUSiteFree 检查机位是否空闲 +func CheckUSiteFree(repo model.Repo, uSiteID uint, dev *model.Device) bool { + //如果设备的机位和没有变化,则不做检验,返回true + if dev != nil && dev.USiteID != nil && *dev.USiteID == uSiteID { + return true + } + uSite, err := repo.GetServerUSiteByID(uSiteID) + if err != nil { + return false + } + return uSite.Status == model.USiteStatFree || uSite.Status == model.USiteStatPreOccupied +} + +//toJSONString 转换json为字符串 +func toJSONString(arg interface{}) string { + bytes, _ := json.Marshal(arg) + return string(bytes) +} + +//toSwitchInfoArray 转换jsonArray为交换机信息数组 +func toSwitchInfoArray(str string) []*model.SwitchInfo { + var items []*model.SwitchInfo + json.Unmarshal([]byte(str), &items) + return items +} + +//usiteStatusTransfer 运行状态值和数据库存储值的转换 +func usiteStatusTransfer(status string, reverse bool) string { + mStatus := map[string]string{ + "空闲": "free", + "预占用": "pre_occupied", + "不可用": "disabled", + "已使用": "used", + } + if !reverse { + if val, ok := mStatus[status]; ok { + return val + } + } else { + for key, val := range mStatus { + if val == status { + return key + } + } + } + return "" +} + +// PhysicalAreaConnd 物理区域搜索条件 +type PhysicalAreaConnd struct { + NetworkAreaID uint `json:"network_area_id"` + //Name string `json:"name"` +} + +// FieldMap 请求字段映射 +func (reqData *PhysicalAreaConnd) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.NetworkAreaID: "network_area_id", + //&reqData.Name: "name", + } +} + +// Validate 结构体数据校验 +func (reqData *PhysicalAreaConnd) Validate(req *http.Request, errs binding.Errors) binding.Errors { + return nil +} + +//GetPhysicalAreas 物理区域列表 +func GetPhysicalAreas(log logger.Logger, repo model.Repo, conn PhysicalAreaConnd) (*model.DeviceQueryParamResp, error) { + + var physicalArea []model.ParamListINT + + if conn.NetworkAreaID > 0 { + netArea, err := repo.GetNetworkAreaByID(conn.NetworkAreaID) + if err != nil { + return nil, err + } + _ = json.Unmarshal([]byte(netArea.PhysicalArea), &physicalArea) + } else { + netAreas, err := repo.GetNetworkAreasByCond(nil) + if err != nil { + return nil, err + } + + for i := range netAreas { + var pArea []model.ParamListINT + _ = json.Unmarshal([]byte(netAreas[i].PhysicalArea), &pArea) + physicalArea = append(physicalArea, pArea...) + } + } + resp := &model.DeviceQueryParamResp{ + ParamName: "physical_area", + //List: physicalArea, + } + for _, l := range physicalArea { + resp.List = append(resp.List, model.ParamList{ + ID: strconv.Itoa(int(l.ID)), + Name: l.Name, + }) + } + return resp, nil + +} + + +// BatchUpdateServerUSitesRemarkReq +type BatchUpdateServerUSitesRemarkReq struct { + // 备注 + Remark string `json:"remark"` + // id列表 + IDs []uint `json:"ids"` +} + +// BatchUpdateServerUSitesRemark 批量更新机位备注信息 +func BatchUpdateServerUSitesRemark(repo model.Repo, ids []uint, remark string) (affected int64, err error) { + return repo.BatchUpdateServerUSitesRemark(ids, remark) +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/special_device.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/special_device.go new file mode 100644 index 0000000000000000000000000000000000000000..ff7bad1c5969cf7b4dca32562b02eb289deef399 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/special_device.go @@ -0,0 +1,817 @@ +package service + +import ( + "strconv" + "idcos.io/cloudboot/utils/times" + "encoding/json" + "net/http" + + "fmt" + + "time" + + "os" + + "github.com/jinzhu/gorm" + "github.com/voidint/binding" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils" + "idcos.io/cloudboot/utils/upload" +) + +//SpecialDevice 设备导入Excel表对应字段 +//SN、型号、厂商、硬件备注、机房管理单元、机架、机位、是否分配内网IP、是否分配外网IP。 +type SpecialDevice struct { + //序列号 + SN string `json:"sn"` + //厂商 + Vendor string `json:"vendor"` + //型号 + DevModel string `json:"model"` + // 设备类型 IN [堡垒机|加密机|前置机|SSL服务器|签名服务器|X86服务器|GPU服务器|授时服务器|其他] + Category string `json:"category"` + // 设备负责人 + Owner string `json:"owner"` + // 维保服务起始日期 + MaintenanceServiceDateBegin string `json:"maintenance_service_date_begin"` + // 保修期(月数) + MaintenanceMonths int `json:"maintenance_months"` + // 操作系统名称 + OSReleaseName string `json:"os_release_name"` + //机房管理单元名称 + ServerRoomName string `json:"server_room_name"` + //机架编号 + CabinetNum string `json:"server_cabinet_number"` + //机位编号 + USiteNum string `json:"server_usite_number"` + //硬件说明 + HardwareRemark string `json:"hardware_remark"` + //是否分配外网IP yes|no + NeedExtranetIP string `json:"need_extranet_ip"` + //是否分配内网IP yes|no + NeedIntranetIP string `json:"need_intranet_ip"` + //以上是对应Excel导入字段,以下字段是通过名称关联到 + // 数据校验用 + ErrMsgContent string `json:"content"` + //Usage string `json:"usage"` //固定为特殊设备 + ID uint + FixedAssetNum string //由规则生成 + IDCID uint //数据中心ID + ServerRoomID uint `json:"server_room_id"` //机房管理单元ID + CabinetID uint `json:"server_cabinet_id"` //机架ID + USiteID uint `json:"server_usite_id"` //机位ID + //关联订单号(非必填) + OrderNumber string `json:"order_number"` +} + +type SpecialDeviceReq struct { + SpecialDevice + LoginName string `json:"-"` +} + + +// WHEN Usage=特殊设备 -> 设备类型 IN [堡垒机|加密机|前置机|SSL服务器|签名服务器|X86服务器|GPU服务器|授时服务器|其他] +var SpecialDevCategoryList = []string{"堡垒机","加密机","前置机","SSL服务器","签名服务器","X86服务器","GPU服务器","授时服务器","其他"} + +// FieldMap 请求字段映射 +func (reqData *SpecialDeviceReq) FieldMap(req *http.Request) binding.FieldMap { + return binding.FieldMap{ + &reqData.SN: "sn", + &reqData.Vendor: "vendor", + &reqData.DevModel: "model", + &reqData.Category: "category", + &reqData.Owner: "owner", + &reqData.MaintenanceServiceDateBegin: "maintenance_service_date_begin", + &reqData.MaintenanceMonths: "maintenance_months", + &reqData.OSReleaseName: "os_release_name", + &reqData.ServerRoomName: "server_room_name", + &reqData.CabinetNum: "server_cabinet_number", + &reqData.USiteNum: "server_usite_number", + &reqData.HardwareRemark: "hardware_remark", + &reqData.NeedIntranetIP: "need_intranet_ip", + &reqData.NeedExtranetIP: "need_extranet_ip", + &reqData.ServerRoomID: "server_room_id", + &reqData.CabinetID: "server_cabinet_id", + &reqData.USiteID: "server_usite_id", + &reqData.OrderNumber: "order_number", + } +} + +// Validate 校验入参 +func (reqData *SpecialDeviceReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + //机房校验 + //字段空值校验 + if reqData.SN == "" { + errs.Add([]string{"SN"}, binding.RequiredError, "SN不能为空") + return errs + } + if reqData.DevModel == "" { + errs.Add([]string{"DevModel"}, binding.RequiredError, "型号不能为空") + return errs + } + // WHEN Usage=特殊设备 -> 设备类型 IN [堡垒机|加密机|前置机|SSL服务器|签名服务器|X86服务器|GPU服务器|授时服务器|其他] + checkMsg := "特殊设备的设备类型 NOT IN [堡垒机|加密机|前置机|SSL服务器|签名服务器|X86服务器|GPU服务器|授时服务器|其他]" + for _, devCategory := range SpecialDevCategoryList { + if reqData.Category == devCategory { + checkMsg = "" + } + } + if checkMsg != "" { + errs.Add([]string{"DevCategory"}, binding.RequiredError, checkMsg) + return errs + } + if reqData.Vendor == "" { + errs.Add([]string{"Vendor"}, binding.RequiredError, "厂商不能为空") + return errs + } + if reqData.OSReleaseName == "" { + errs.Add([]string{"OSReleaseName"}, binding.RequiredError, "操作系统名称不能为空") + return errs + } + if reqData.MaintenanceMonths <= 0 { + errs.Add([]string{"MaintenanceMonths"}, binding.RequiredError, "保修期(月数)不能小于0个") + return errs + } + if reqData.ServerRoomID == 0 { + errs.Add([]string{"ServerRoomID"}, binding.RequiredError, "机房不能为空") + return errs + } + if reqData.CabinetID == 0 { + errs.Add([]string{"CabinetID"}, binding.RequiredError, "机架不能为空") + return errs + } + if reqData.USiteID == 0 { + errs.Add([]string{"USiteID"}, binding.RequiredError, "机位不能为空") + return errs + } + d, err := repo.GetDeviceBySN(reqData.SN) + if d != nil { + errs.Add([]string{"SN"}, binding.RequiredError, fmt.Sprintf("SN:%s已存在,不能重复", reqData.SN)) + return errs + //reqData.id = d.ID + } + if reqData.NeedExtranetIP != model.YES && reqData.NeedExtranetIP != model.NO { + errs.Add([]string{"NeedExtranetIP"}, binding.RequiredError, "是否分配外网IP值不合法(yes|no)") + return errs + } + if reqData.NeedIntranetIP != model.YES && reqData.NeedIntranetIP != model.NO { + errs.Add([]string{"NeedIntranetIP"}, binding.RequiredError, "是否分配内网IP值不合法(yes|no)") + return errs + } + //机房IDC + srs, err := repo.GetServerRoomByID(reqData.ServerRoomID) + if err == gorm.ErrRecordNotFound || srs == nil { + errs.Add([]string{"ServerRoomID"}, binding.RequiredError, fmt.Sprintf("机房(ID:%d)不存在", reqData.ServerRoomID)) + return errs + } else { + reqData.IDCID = srs.IDCID + } + //机架 + cabinet, err := repo.GetServerCabinetByID(reqData.CabinetID) + if err != nil && err != gorm.ErrRecordNotFound { + return errs + } + if err == gorm.ErrRecordNotFound || cabinet == nil { + errs.Add([]string{"cabinet"}, binding.RequiredError, fmt.Sprintf("机架(ID:%d)不存在", reqData.CabinetID)) + return errs + } else { + //reqData.CabinetID = cabinet.ID + } + //机位 + uSite, err := repo.GetServerUSiteByID(reqData.USiteID) + if err != nil && err != gorm.ErrRecordNotFound { + return errs + } + if err == gorm.ErrRecordNotFound || uSite == nil { + errs.Add([]string{"USiteNum"}, binding.RequiredError, fmt.Sprintf("机位(ID:%d)不存在", reqData.USiteID)) + return errs + } else { + // 设备已存在,说明是先进入bootos或者数据已经导入过,重新导入刷新,此时的机位如果没有变化 + // 则不判断机位占用状态,因为就是被自己占着 + dev, _ := repo.GetDeviceBySN(reqData.SN) + if !CheckUSiteFree(repo, uSite.ID, dev) { + errs.Add([]string{"USiteNum"}, binding.RequiredError, + fmt.Sprintf("机位编号(%s), 机架编号(%s)被占用或不可用", uSite.Number, cabinet.Number)) + return errs + } else { + reqData.USiteID = uSite.ID + } + } + // 订单编号 + if reqData.OrderNumber != "" { + order, err := repo.GetOrderByNumber(reqData.OrderNumber) + if err != nil && err != gorm.ErrRecordNotFound { + return errs + } + if err == gorm.ErrRecordNotFound || order == nil { + errs.Add([]string{"OrderNumber"}, binding.RequiredError, fmt.Sprintf("订单(订单号:%s)不存在", reqData.OrderNumber)) + return errs + } + } + return nil +} + +// SaveSpecialDevices 保存(新增/修改) +func SaveSpecialDevices(log logger.Logger, repo model.Repo, dev *SpecialDeviceReq) (mod *model.Device, err error) { + _ = log + + //统计一下关联订单号的数量,用于更新订单状态 + var mOrderAmount = make(map[string]int, 0) + + mod = &model.Device{ + Model: gorm.Model{ID: uint(dev.ID)}, + SN: dev.SN, + Vendor: dev.Vendor, + DevModel: dev.DevModel, + Category: dev.Category, + IDCID: dev.IDCID, + ServerRoomID: dev.ServerRoomID, + CabinetID: dev.CabinetID, + USiteID: &dev.USiteID, + HardwareRemark: dev.HardwareRemark, + Creator: dev.LoginName, + OrderNumber: dev.OrderNumber, + } + fn, err := GenFixedAssetNumber(repo) + if err != nil { + return nil, err + } + mod.FixedAssetNumber = fn + // WHEN Usage=特殊设备 -> 设备类型 IN [堡垒机|加密机|前置机|SSL服务器|签名服务器|X86服务器|GPU服务器|授时服务器|其他] + mod.Usage = model.DevUsageSpecialDev + // mod.Category = model.DevUsageSpecialDev + mod.OperationStatus = model.DevOperStatOnShelve + mod.PowerStatus = model.PowerStatusOn + now := time.Now() + mod.StartedAt = now + mod.OnShelveAt = now + mod.CreatedAt = now + + if mod.USiteID != nil { + if _, err = repo.BatchUpdateServerUSitesStatus([]uint{*mod.USiteID}, model.USiteStatUsed); err != nil { + err = fmt.Errorf("占用机位:%s失败,%v", dev.USiteNum, err) + return + } + } + + _, err = repo.SaveDevice(mod) + if err != nil { + return + } + + //分配IP + var inIP, exIP *model.IP + if dev.NeedIntranetIP == model.YES { + if inIP, err = repo.AssignIntranetIP(dev.SN); err != nil { + err = fmt.Errorf("SN:%s分配内网失败,err:%v", dev.SN, err) + return + } + } else { + //需要尝试释放IP + if _, err = repo.ReleaseIP(dev.SN, model.Intranet); err != nil { + err = fmt.Errorf("SN:%s释放内网IP失败,err:%v", dev.SN, err) + return + } + } + + if dev.NeedExtranetIP == model.YES { + if exIP, err = repo.AssignExtranetIP(dev.SN); err != nil { + err = fmt.Errorf("SN:%s分配外网失败,err:%v", dev.SN, err) + return + } + } else { + if _, err = repo.ReleaseIP(dev.SN, model.Extranet); err != nil { + err = fmt.Errorf("SN:%s释放外网IP失败,err:%v", dev.SN, err) + return + } + } + // 特殊设备无需经过系统部署,自定义写入操作系统名称 + sysTpl, err := repo.GetSystemTemplateByName(dev.OSReleaseName) + if err != nil { + log.Errorf("get system template by name %s failed(%v) ,adding one", dev.OSReleaseName, err) + tpl := model.SystemTemplate{ + Family: "Custom", + BootMode: "uefi", + Name: dev.OSReleaseName, + PXE: "#NULL", + Content: "#NULL", + OSLifecycle: model.OSTesting, + Arch: model.OSARCHUNKNOWN, + + } + _, err := repo.SaveSystemTemplate(&tpl) + if err != nil { + log.Errorf("add system template by name %s fail,%v", dev.OSReleaseName, err) + } else { + //重新获取新增模板ID + sysTpl, err = repo.GetSystemTemplateByName(dev.OSReleaseName) + } + } + + //Add device setting(模拟一条数据) + ds, err := repo.GetDeviceSettingBySN(dev.SN) + if ds == nil || err != nil { + ds = &model.DeviceSetting{ + SN: dev.SN, + Status: model.InstallStatusSucc, //这个值固定 + InstallType: model.InstallationPXE, //这个值固定 + InstallProgress: 1.0, //这个值固定 + NeedIntranetIPv6: model.NO, //默认仅分配IPV4 + NeedExtranetIPv6: model.NO, //默认仅分配IPV4 + } + } + if sysTpl != nil { + ds.SystemTemplateID = sysTpl.ID + } + ds.NeedExtranetIP = dev.NeedExtranetIP + if inIP != nil { + ds.IntranetIP = inIP.IP + } + if exIP != nil { + ds.ExtranetIP = exIP.IP + } + if err = repo.SaveDeviceSetting(ds); err != nil { + return + } + // 仅记录必要字段到“设备新增” + optDetail, err := convert2DetailOfOperationTypeAdd(repo, *mod) + if err != nil { + log.Errorf("Fail to convert Detail of OperationTypeAdd: %v", err) + } + // DeviceLifecycle 变更记录 + deviceLifecycleLog := []model.ChangeLog { + { + OperationUser: dev.LoginName, + OperationType: model.OperationTypeAdd, + OperationDetail: optDetail, + OperationTime: times.ISOTime(time.Now()).ToTimeStr(), + }, + } + b, _ := json.Marshal(deviceLifecycleLog) + + // SaveDeviceLifecycleReq 结构体 + saveDevLifecycleReq := &SaveDeviceLifecycleReq { + DeviceLifecycleBase: DeviceLifecycleBase{ + FixedAssetNumber: mod.FixedAssetNumber, + SN: mod.SN, + AssetBelongs: "Undefined", + Owner: dev.Owner, + IsRental: "no", + MaintenanceServiceProvider: dev.Vendor, + MaintenanceService: "Undefined", + LogisticsService: "Undefined", + MaintenanceServiceStatus: model.MaintenanceServiceStatusInactive, //新增场景默认-未激活 + LifecycleLog: string(b), + }, + } + + if dev.MaintenanceServiceDateBegin != "" { + t, err := time.Parse(times.DateLayout, dev.MaintenanceServiceDateBegin) + if err != nil { + log.Errorf("parse maintenance time %s err:%v , using current time for maintenance-date", dev.MaintenanceServiceDateBegin, err) + saveDevLifecycleReq.MaintenanceServiceDateBegin = now + saveDevLifecycleReq.MaintenanceServiceDateEnd = now.AddDate(0, dev.MaintenanceMonths, 0) + } else { + saveDevLifecycleReq.MaintenanceServiceDateBegin = t + saveDevLifecycleReq.MaintenanceServiceDateEnd = t.AddDate(0, dev.MaintenanceMonths, 0) + } + } else { + saveDevLifecycleReq.MaintenanceServiceDateBegin = now + saveDevLifecycleReq.MaintenanceServiceDateEnd = now.AddDate(0, dev.MaintenanceMonths, 0) + } + + // 通过订单编号获取资产归属、负责人、维保服务等内容 + // 若无订单编号则以参数输入为准 + if dev.OrderNumber != "" { + order, err := repo.GetOrderByNumber(dev.OrderNumber) + if err != nil { + log.Errorf("订单(订单号:%s)不存在", dev.OrderNumber) + return nil, err + } + if order != nil { + saveDevLifecycleReq.AssetBelongs = order.AssetBelongs + saveDevLifecycleReq.Owner = order.Owner + saveDevLifecycleReq.IsRental = order.IsRental + saveDevLifecycleReq.MaintenanceServiceProvider = order.MaintenanceServiceProvider + saveDevLifecycleReq.MaintenanceService = order.MaintenanceService + saveDevLifecycleReq.LogisticsService = order.LogisticsService + saveDevLifecycleReq.MaintenanceServiceDateBegin = order.MaintenanceServiceDateBegin + saveDevLifecycleReq.MaintenanceServiceDateEnd = order.MaintenanceServiceDateEnd + mOrderAmount[dev.OrderNumber]++ + } + } + // DeviceLifecycle 查询是否已经存在 + devLifecycle, err := repo.GetDeviceLifecycleBySN(dev.SN) + if err != nil && err != gorm.ErrRecordNotFound { + return nil, err + } + if devLifecycle != nil { + log.Debugf("DeviceLifecycle SN %s already exist.Update it.", dev.SN) + saveDevLifecycleReq.ID = devLifecycle.ID + } + //更新关联的订单到货数量和订单状态 + for orderNum, arrivalCount := range mOrderAmount { + if err = UpdateOrderByArrival(log, repo, orderNum, arrivalCount); err != nil { + return nil, err + } + } + // 保存或更新 DeviceLifecycle + if err = SaveDeviceLifecycle(log, repo, saveDevLifecycleReq); err != nil { + log.Debug(err) + return nil, err + } + //如果没有成功,要回滚!! + defer func() { + if err != nil { + //rollback + _, _ = repo.BatchUpdateServerUSitesStatus([]uint{*mod.USiteID}, model.USiteStatFree) + _, _ = repo.DeleteDeviceSettingBySN(mod.SN) + _, _ = repo.RemoveDeviceByID(mod.ID) + _, _ = repo.RemoveDeviceLifecycleByID(devLifecycle.ID) + mod = nil + saveDevLifecycleReq = nil + } + }() + + return mod, nil +} + +func ImportSpecialDevicesPreview(log logger.Logger, repo model.Repo, reqData *ImportPreviewReq) (map[string]interface{}, error) { + ra, err := utils.ParseDataFromXLSX(upload.UploadDir + reqData.FileName) + if err != nil { + return nil, err + } + length := len(ra) + + var success []*SpecialDeviceReq + var failure []*SpecialDeviceReq + + //if valid, err := CheckUnique(ra); !valid { + // return nil, err + //} + for i := 1; i < length; i++ { + row := &SpecialDeviceReq{} + if len(ra[i]) < 15 { + var br string + if row.ErrMsgContent != "" { + br = "<br />" + } + row.ErrMsgContent += br + "导入文件列长度不对(应为15列)" + failure = append(failure, row) + continue + } + row.SN = ra[i][0] + row.Vendor = ra[i][1] + row.DevModel = ra[i][2] + row.ServerRoomName = ra[i][3] + row.CabinetNum = ra[i][4] + row.USiteNum = ra[i][5] + row.HardwareRemark = ra[i][6] + row.NeedIntranetIP = ra[i][7] + row.NeedExtranetIP = ra[i][8] + row.OrderNumber = ra[i][9] + row.Category = ra[i][10] + row.Owner = ra[i][11] + + //转换下Excel中日期格式 + maintenanceDate, _ := time.Parse(times.DateLayout2, ra[i][12]) + maintenanceDateStr := maintenanceDate.Format(times.DateLayout) + if maintenanceDateStr != "0001-01-01" { + row.MaintenanceServiceDateBegin = maintenanceDateStr + } else { + row.MaintenanceServiceDateBegin = "" + } + maintenanceMonths, err := strconv.Atoi(ra[i][13]) + if err != nil { + return nil, err + } + row.MaintenanceMonths = maintenanceMonths + row.OSReleaseName = ra[i][14] + + + utils.StructTrimSpace(&row.SpecialDevice) + + row.checkLength() + //数据有效性校验 + err = row.validate(repo) + if err != nil { + return nil, err + } + + if row.ErrMsgContent != "" { + failure = append(failure, row) + } else { + success = append(success, row) + } + } + + var data []*SpecialDeviceReq + if len(failure) > 0 { + data = failure + } else { + data = success + } + var result []*SpecialDeviceReq + for i := 0; i < len(data); i++ { + if uint(i) >= reqData.Offset && uint(i) < (reqData.Offset+reqData.Limit) { + result = append(result, data[i]) + } + } + if len(failure) > 0 { + _ = os.Remove(upload.UploadDir + reqData.FileName) + return map[string]interface{}{"status": "failure", + "message": "导入服务器错误", + "total_records": len(data), + "content": result, + }, nil + } + return map[string]interface{}{"status": "success", + "message": "操作成功", + "import_status": true, + "total_records": len(data), + "content": result, + }, nil +} + +//checkLength 对导入文件中的数据做字段长度校验 +func (impDevReq *SpecialDeviceReq) checkLength() { + //固定资产编号可以由规则生成 + leg := len(impDevReq.SN) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:序列号长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.Vendor) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:厂商长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.DevModel) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:型号长度为(%d)(不能为空,不能大于255)", leg) + } + + leg = len(impDevReq.ServerRoomName) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:机房管理单元名称长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.CabinetNum) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:机架长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.USiteNum) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:机位长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.NeedIntranetIP) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:是否分配内网IP长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.NeedExtranetIP) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:是否分配外网IP长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.Category) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:设备类型长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.Owner) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:负责人长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.MaintenanceServiceDateBegin) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:维保服务起始日期长度为(%d)(不能为空,不能大于255)", leg) + } + if impDevReq.MaintenanceMonths == 0 || impDevReq.MaintenanceMonths > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:保修期(月数)长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(impDevReq.OSReleaseName) + if leg == 0 || leg > 255 { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("必填项校验:操作系统名称长度为(%d)(不能为空,不能大于255)", leg) + } +} + +//validate 对导入文件中的数据做基本验证 +func (impDevReq *SpecialDeviceReq) validate(repo model.Repo) error { + d, err := repo.GetDeviceBySN(impDevReq.SN) + if d != nil { + impDevReq.ID = d.ID + } + //机房校验 + srs, err := repo.GetServerRoomByName(impDevReq.ServerRoomName) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if err == gorm.ErrRecordNotFound || srs == nil { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("机房名(%s)不存在", impDevReq.ServerRoomName) + } else { + impDevReq.IDCID = srs.IDCID + impDevReq.ServerRoomID = srs.ID + } + + //机架 + cabinet, err := repo.GetServerCabinetByNumber(impDevReq.ServerRoomID, impDevReq.CabinetNum) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if err == gorm.ErrRecordNotFound || cabinet == nil { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("机架编号(%s)不存在", impDevReq.CabinetNum) + } else { + impDevReq.CabinetID = cabinet.ID + } + //机位 + uSite, err := repo.GetServerUSiteByNumber(impDevReq.CabinetID, impDevReq.USiteNum) + if err != nil && err != gorm.ErrRecordNotFound { + return err + } + if err == gorm.ErrRecordNotFound || uSite == nil { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("机位编号(%s)不存在, 机架编号(%s)", impDevReq.USiteNum, impDevReq.CabinetNum) + } else { + // 设备已存在,说明是先进入bootos或者数据已经导入过,重新导入刷新,此时的机位如果没有变化, + // 则不判断机位占用状态,因为就是被自己占着 + dev, _ := repo.GetDeviceBySN(impDevReq.SN) + if !CheckUSiteFree(repo, uSite.ID, dev) { + //log.Errorf("机位:%s 被占用或被禁用", row.USiteNum) + //return errors.New("机位:" + row.USiteNum + "被占用或被禁用") + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("机位编号(%s), 机架编号(%s)被占用或不可用", impDevReq.USiteNum, impDevReq.CabinetNum) + } else { + impDevReq.USiteID = uSite.ID + } + } + if impDevReq.NeedExtranetIP != model.YesCh && impDevReq.NeedExtranetIP != model.NoCh { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("是否分配外网IP值%s不合法(yes|no)", impDevReq.NeedExtranetIP) + } + if impDevReq.NeedIntranetIP != model.YesCh && impDevReq.NeedIntranetIP != model.NoCh { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("是否分配内网IP值%s不合法(yes|no)", impDevReq.NeedIntranetIP) + } + // 订单编号校验 + if impDevReq.OrderNumber != "" { + order, err := repo.GetOrderByNumber(impDevReq.OrderNumber) + if err != nil { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("订单(订单号:%s)不存在", impDevReq.OrderNumber) + } + if order != nil { + if order.IDCID != impDevReq.IDCID { + var br string + if impDevReq.ErrMsgContent != "" { + br = "<br />" + } + impDevReq.ErrMsgContent += br + fmt.Sprintf("订单(订单号:%s)与设备(SN:%s)不属于同一个数据中心", impDevReq.OrderNumber, impDevReq.SN) + } + } + } + + return nil +} + +func ImportSpecialDevices(log logger.Logger, repo model.Repo, reqData *ImportPreviewReq) error { + fileName := upload.UploadDir + reqData.FileName + ra, err := utils.ParseDataFromXLSX(fileName) + if err != nil { + return err + } + length := len(ra) + + _ = os.Remove(fileName) + + for i := 1; i < length; i++ { + row := &SpecialDeviceReq{} + if len(ra[i]) < 15 { + var br string + if row.ErrMsgContent != "" { + br = "<br />" + } + row.ErrMsgContent += br + "导入文件列长度不对(应为15列)" + continue + } + row.SN = ra[i][0] + row.Vendor = ra[i][1] + row.DevModel = ra[i][2] + row.ServerRoomName = ra[i][3] + row.CabinetNum = ra[i][4] + row.USiteNum = ra[i][5] + row.HardwareRemark = ra[i][6] + row.OrderNumber = ra[i][9] + row.Category = ra[i][10] + row.Owner = ra[i][11] + row.OSReleaseName = ra[i][14] + //转换下Excel中日期格式 + maintenanceDate, _ := time.Parse(times.DateLayout2, ra[i][12]) + maintenanceDateStr := maintenanceDate.Format(times.DateLayout) + if maintenanceDateStr != "0001-01-01" { + row.MaintenanceServiceDateBegin = maintenanceDateStr + } else { + row.MaintenanceServiceDateBegin = "" + } + maintenanceMonths, err := strconv.Atoi(ra[i][13]) + if err != nil { + return err + } + row.MaintenanceMonths = maintenanceMonths + row.OSReleaseName = ra[i][14] + + if ra[i][7] == model.YesCh { + row.NeedIntranetIP = model.YES + } else { + row.NeedIntranetIP = model.NO + } + if ra[i][8] == model.YesCh { + row.NeedExtranetIP = model.YES + } else { + row.NeedExtranetIP = model.NO + } + row.LoginName = reqData.LoginName + utils.StructTrimSpace(&row.SpecialDevice) + row.validate(repo) + + if _, err := SaveSpecialDevices(log, repo, row); err != nil { + log.Errorf("import special device(SN:%s) fail,%v", row.SN, err) + return err + } + + } + return nil +} + diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/store_room.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/store_room.go new file mode 100644 index 0000000000000000000000000000000000000000..5ef22f1af6d41d87a6e4b7e568dd1e2ae3731712 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/store_room.go @@ -0,0 +1,740 @@ +package service + +import ( + "encoding/json" + "fmt" + "net/http" + + "github.com/voidint/binding" + + "reflect" + + "os" + "strings" + + "github.com/jinzhu/gorm" + "github.com/voidint/page" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils" + strings2 "idcos.io/cloudboot/utils/strings" + "idcos.io/cloudboot/utils/times" + "idcos.io/cloudboot/utils/upload" +) + +//SaveStoreRoomReq 保存库房请求参数 +type SaveStoreRoomReq struct { + //(required) 所属数据中心ID + IDCID uint `json:"idc_id"` + //库房ID。若id=0,则新增。若id>0,则修改。 + ID uint `json:"id"` + //required) 库房名称 + Name string `json:"name"` + //(required)一级机房 + FirstServerRoom string `json:"first_server_room"` + //(required) 所属城市 + City string `json:"city"` + //(required) 地址 + Address string `json:"address"` + //(required) 库房管理单元负责人 + StoreRoomManager string `json:"store_room_manager"` + //(required) 供应商负责人 + VendorManager string `json:"vendor_manager"` + // 用户登录名 + LoginName string `json:"-"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *SaveStoreRoomReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDCID: "idc_id", + &reqData.ID: "id", + &reqData.Name: "name", + &reqData.FirstServerRoom: "first_server_room", + &reqData.City: "city", + &reqData.Address: "address", + &reqData.StoreRoomManager: "store_room_manager", + &reqData.VendorManager: "vendor_manager", + } +} + +// Validate 结构体数据校验 +func (reqData *SaveStoreRoomReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + //必须的基本数据不能为空 + if errs = reqData.baseValidate(req, errs); errs != nil { + return errs + } + + //更新库房信息,校验指定ID的库房是否存在 + if reqData.ID > 0 { + if errs = reqData.storeRoomValidate(req, errs); errs != nil { + return errs + } + } + + //校验IDC数据 + if errs = reqData.checkIDCValidate(req, errs); errs != nil { + return errs + } + + return errs +} + +func (reqData *SaveStoreRoomReq) checkIDCValidate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + + idc, err := repo.GetIDCByID(reqData.IDCID) + if err != nil { + errs.Add([]string{"idc"}, binding.RequiredError, fmt.Sprintf("获取数据中心id(%d)出现错误: %s", reqData.IDCID, err.Error())) + return errs + } + reqData.IDCID = idc.ID + + var fsr []IDCFirstServerRoom + if idc.FirstServerRoom != "" { + err := json.Unmarshal([]byte(idc.FirstServerRoom), &fsr) + if err != nil { + errs.Add([]string{"idc"}, binding.RequiredError, fmt.Sprintf("获取数据中心id(%d)(一级机房)出现错误: %s", reqData.IDCID, err.Error())) + return errs + } + } + + isExist := false + for k := range fsr { + if reqData.FirstServerRoom == fsr[k].Name { + isExist = true + break + } + } + if !isExist { + errs.Add([]string{"idc"}, binding.RequiredError, fmt.Sprintf("获取数据中心(一级机房:%s)不存在", reqData.FirstServerRoom)) + return errs + } + return errs + +} + +func (reqData *SaveStoreRoomReq) storeRoomValidate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + + var cond model.StoreRoomCond + + cond.ID = []uint{reqData.ID} + + items, err := repo.GetStoreRooms(&cond, nil, nil) + if err != nil { + errs.Add([]string{"store_room"}, binding.RequiredError, fmt.Sprintf("更新库房ID %d不存在", reqData.ID)) + return errs + } + if len(items) < 1 { + errs.Add([]string{"store_room"}, binding.RequiredError, fmt.Sprintf("更新库房ID %d不存在", reqData.ID)) + return errs + } + + //校验更新库房名是否已经存在 + if reqData.Name != "" { + item, _ := repo.GetStoreRooms(&model.StoreRoomCond{Name: reqData.Name}, nil, nil) + if item != nil && len(item) > 0 && item[0].ID != reqData.ID { + errs.Add([]string{"store_room"}, binding.RequiredError, fmt.Sprintf("更新库房 指定的库房名%s已经存在", reqData.Name)) + return errs + } + } + return errs +} + +//baseValidate 必要参数不能为空 +func (reqData *SaveStoreRoomReq) baseValidate(req *http.Request, errs binding.Errors) binding.Errors { + if reqData.IDCID == 0 { + errs.Add([]string{"idc_id"}, binding.RequiredError, "数据中心ID不能为空") + return errs + } + + if reqData.Name == "" { + errs.Add([]string{"name"}, binding.RequiredError, "库房名称不能为空") + return errs + } + + if reqData.City == "" { + errs.Add([]string{"city"}, binding.RequiredError, "库房所属城市不能为空") + return errs + } + + if reqData.Address == "" { + errs.Add([]string{"address"}, binding.RequiredError, "库房地址不能为空") + return errs + } + + if reqData.StoreRoomManager == "" { + errs.Add([]string{"store_room_manager"}, binding.RequiredError, "库房管理单元负责人不能为空") + return errs + } + + if reqData.VendorManager == "" { + errs.Add([]string{"vendor_manager"}, binding.RequiredError, "供应商负责人不能为空") + return errs + } + return errs +} + +//SaveStoreRoom 保存库房 +func SaveStoreRoom(log logger.Logger, repo model.Repo, reqData *SaveStoreRoomReq) error { + sr := model.StoreRoom{ + IDCID: reqData.IDCID, + Name: reqData.Name, + FirstServerRoom: reqData.FirstServerRoom, + City: reqData.City, + Address: reqData.Address, + StoreRoomManager: reqData.StoreRoomManager, + VendorManager: reqData.VendorManager, + Creator: reqData.LoginName, + } + if reqData.ID == 0 { + sr.Status = model.RoomStatAccepted + _, err := repo.SaveStoreRoom(&sr) + if err != nil { + return err + } + } + if reqData.ID > 0 { + sr.ID = uint(reqData.ID) + _, err := repo.UpdateStoreRoom([]*model.StoreRoom{&sr}) + if err != nil { + return err + } + } + reqData.ID = sr.ID + return nil +} + +type StoreRoomImportReq struct { + SaveStoreRoomReq + IDCName string `json:"idc_name"` + //FirstServerRoom string `json:"first_server_room_name"` + Content string `json:"content"` +} + +//checkLength 对导入文件中的数据做基本验证 +func (nafi *StoreRoomImportReq) checkLength() { + leg := len(nafi.IDCName) + if leg == 0 || leg > 255 { + var br string + if nafi.Content != "" { + br = "<br />" + } + nafi.Content += br + fmt.Sprintf("必填项校验:数据中心名称长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(nafi.FirstServerRoom) + if leg == 0 || leg > 255 { + var br string + if nafi.Content != "" { + br = "<br />" + } + nafi.Content += br + fmt.Sprintf("必填项校验:一级名称长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(nafi.Name) + if leg == 0 || leg > 255 { + var br string + if nafi.Content != "" { + br = "<br />" + } + nafi.Content += br + fmt.Sprintf("必填项校验:库房名称长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(nafi.City) + if leg == 0 || leg > 255 { + var br string + if nafi.Content != "" { + br = "<br />" + } + nafi.Content += br + fmt.Sprintf("必填项校验:城市长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(nafi.Address) + if leg == 0 || leg > 255 { + var br string + if nafi.Content != "" { + br = "<br />" + } + nafi.Content += br + fmt.Sprintf("必填项校验:地址长度为(%d)(不能为空,不能大于255)", leg) + } + leg = len(nafi.StoreRoomManager) + if leg == 0 || leg > 255 { + var br string + if nafi.Content != "" { + br = "<br />" + } + nafi.Content += br + fmt.Sprintf("必填项校验:负责人长度为(%d)(不能为空,不能大于255)", leg) + } +} + +//validate 对导入文件中的数据做基本验证 +func (nafi *StoreRoomImportReq) validate(log logger.Logger, repo model.Repo) (int, error) { + //机房校验 + idc, err := repo.GetIDCByName(nafi.IDCName) + if err != nil && err != gorm.ErrRecordNotFound { + return upload.Return, err + } + if err == gorm.ErrRecordNotFound || idc == nil { + var br string + if nafi.Content != "" { + br = "<br />" + } + nafi.Content += br + fmt.Sprintf("数据中心(%s)不存在", nafi.FirstServerRoom) + return upload.Continue, nil + } + nafi.IDCID = idc.ID + + sr, err := repo.GetStoreRoomByName(nafi.Name) + if sr != nil { + nafi.ID = sr.ID + } + + return upload.DO, nil +} + +//ImportStoreRoomPriview 导入预览 +func ImportStoreRoomPriview(log logger.Logger, repo model.Repo, reqData *upload.ImportReq) (map[string]interface{}, error) { + ra, err := utils.ParseDataFromXLSX(upload.UploadDir + reqData.FileName) + if err != nil { + return nil, err + } + length := len(ra) + + var success []*StoreRoomImportReq + var failure []*StoreRoomImportReq + for i := 1; i < length; i++ { + row := &StoreRoomImportReq{} + if len(ra[i]) < 7 { + var br string + if row.Content != "" { + br = "<br />" + } + row.Content += br + "导入文件列长度不对(应为7列)" + failure = append(failure, row) + continue + } + row.IDCName = strings.TrimSpace(ra[i][0]) + row.FirstServerRoom = strings.TrimSpace(ra[i][1]) + row.Name = strings.TrimSpace(ra[i][2]) + row.City = strings.TrimSpace(ra[i][3]) + row.Address = strings.TrimSpace(ra[i][4]) + row.StoreRoomManager = strings.TrimSpace(ra[i][5]) + row.VendorManager = strings.TrimSpace(ra[i][6]) + + //必填项校验 + row.checkLength() + //机房和网络区域校验 + _, err := row.validate(log, repo) + if err != nil { + return nil, err + } + + if row.Content != "" { + failure = append(failure, row) + } else { + success = append(success, row) + } + } + + var data []*StoreRoomImportReq + if len(failure) > 0 { + data = failure + } else { + data = success + } + var result []*StoreRoomImportReq + for i := 0; i < len(data); i++ { + if uint(i) >= reqData.Offset && uint(i) < (reqData.Offset+reqData.Limit) { + result = append(result, data[i]) + } + } + if len(failure) > 0 { + return map[string]interface{}{"status": "failure", + "message": "导入库房错误", + "import_status": false, + "record_count": len(data), + "content": result, + }, nil + } + return map[string]interface{}{"status": "success", + "message": "操作成功", + "import_status": true, + "record_count": len(data), + "content": result, + }, nil +} + +//ImportStoreRoom 将导入网络区域放到数据库 +func ImportStoreRoom(log logger.Logger, repo model.Repo, reqData *upload.ImportReq) error { + ra, err := utils.ParseDataFromXLSX(upload.UploadDir + reqData.FileName) + if err != nil { + return err + } + length := len(ra) + for i := 1; i < length; i++ { + row := &StoreRoomImportReq{} + if len(ra[i]) < 7 { + continue + } + + row.IDCName = strings.TrimSpace(ra[i][0]) + row.FirstServerRoom = strings.TrimSpace(ra[i][1]) + row.Name = strings.TrimSpace(ra[i][2]) + row.City = strings.TrimSpace(ra[i][3]) + row.Address = strings.TrimSpace(ra[i][4]) + row.StoreRoomManager = strings.TrimSpace(ra[i][5]) + row.VendorManager = strings.TrimSpace(ra[i][6]) + + //必填项校验 + row.checkLength() + //机房和网络区域校验 + isSave, err := row.validate(log, repo) + if err != nil { + return err + } + + //不能获取机房信息 + if isSave == upload.Continue { + continue + } + row.SaveStoreRoomReq.LoginName = reqData.UserName + + if err = SaveStoreRoom(log, repo, &row.SaveStoreRoomReq); err != nil { + return err + } + } + defer os.Remove(upload.UploadDir + reqData.FileName) + return nil +} + +//RemoveStoreRoomValidate 删除操作校验 +func RemoveStoreRoomValidate(log logger.Logger, repo model.Repo, storeRoomID uint) string { + //统计库房中的机架(柜数) + count, _ := repo.CountVirtualCabinets(&model.VirtualCabinet{StoreRoomID: storeRoomID}) + if count > 0 { + return fmt.Sprintf("库房下面存在(%d)个虚拟货架,须先删除", count) + } + return "" +} + +//RemoveStoreRoomByID 删除指定ID的库房 +func RemoveStoreRoomByID(log logger.Logger, repo model.Repo, id uint) error { + _, err := repo.RemoveStoreRoomByID(id) + return err +} + +//GetStoreRoomPageReq 获取库房分页请求参数 +type GetStoreRoomPageReq struct { + // 所属数据中心ID + IDCID string `json:"idc_id"` + // 库房名称(支持模糊匹配) + Name string `json:"name"` + // 一级机房ID + FirstServerRoom string `json:"first_server_room"` + // 城市(支持模糊匹配) + City string `json:"city"` + // 地址(支持模糊匹配) + Address string `json:"address"` + // 库房管理单元负责人(支持模糊匹配) + StoreRoomManager string `json:"store_room_manager"` + // 供应商负责人(支持模糊匹配) + VendorManager string `json:"vendor_manager"` + // 分页页号 + Page int64 `json:"page"` + // 分页大小。默认值:10。阈值: 100。 + PageSize int64 `json:"page_size"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *GetStoreRoomPageReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.IDCID: "idc_id", + //&reqData.Status: "status", + &reqData.Name: "name", + &reqData.FirstServerRoom: "first_server_room", + &reqData.City: "city", + &reqData.Address: "address", + &reqData.StoreRoomManager: "store_room_manager", + &reqData.VendorManager: "vendor_manager", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + } +} + +//StoreRoom 库房分页查询信息 +type StoreRoom struct { + //库房ID + ID uint `json:"id"` + //创建时间 + CreatedAt times.ISOTime `json:"created_at"` + //更新时间 + UpdatedAt times.ISOTime `json:"updated_at"` + //库房名 + Name string `json:"name"` + //一级机房ID + FirstServerRoom IDCFirstServerRoom `json:"first_server_room"` + //机架数 + CabinetCount int64 `json:"cabinet_count"` + //所在城市 + City string `json:"city"` + //地址 + Address string `json:"address"` + //库房管理人 + StoreRoomManager string `json:"store_room_manager"` + //供应商负责人 + VendorManager string `json:"vendor_manager"` + //库房状态 + Status string `json:"status"` + //创建人 + Creator string `json:"creator"` + //数据中心 + IDC IDCForServerRoomPage `json:"idc"` +} + +//GetStoreRoomWithPage 获取库房分页 +func GetStoreRoomWithPage(log logger.Logger, repo model.Repo, reqData *GetStoreRoomPageReq) (*page.Page, error) { + if reqData.PageSize <= 0 || reqData.PageSize > 100 { + reqData.PageSize = 20 + } + if reqData.Page < 0 { + reqData.Page = 0 + } + + cond := model.StoreRoomCond{ + IDCID: strings2.Multi2UintSlice(reqData.IDCID), + Name: reqData.Name, + FirstServerRoom: reqData.FirstServerRoom, + City: reqData.City, + Address: reqData.Address, + StoreRoomManager: reqData.StoreRoomManager, + VendorManager: reqData.VendorManager, + //Status: reqData.Status, + } + + totalRecords, err := repo.CountStoreRooms(&cond) + if err != nil { + return nil, err + } + + pager := page.NewPager(reflect.TypeOf(&StoreRoom{}), reqData.Page, reqData.PageSize, totalRecords) + items, err := repo.GetStoreRooms(&cond, model.OneOrderBy("id", model.DESC), pager.BuildLimiter()) + if err != nil { + return nil, err + } + for i := range items { + item, err := convert2StoreRoomResult(log, repo, items[i]) + if err != nil { + return nil, err + } + if item != nil { + pager.AddRecords(item) + } + } + return pager.BuildPage(), nil +} + +func convert2StoreRoomResult(log logger.Logger, repo model.Repo, srcp *model.StoreRoom) (*StoreRoom, error) { + if srcp == nil { + return nil, nil + } + + idc, err := repo.GetIDCByID(srcp.IDCID) + if err != nil && err != gorm.ErrRecordNotFound { + return nil, err + } + + result := StoreRoom{ + ID: srcp.ID, + CreatedAt: times.ISOTime(srcp.CreatedAt), + UpdatedAt: times.ISOTime(srcp.UpdatedAt), + Name: srcp.Name, + City: srcp.City, + Address: srcp.Address, + StoreRoomManager: srcp.StoreRoomManager, + VendorManager: srcp.VendorManager, + Status: srcp.Status, + Creator: srcp.Creator, + } + + if idc != nil { + var fsr []IDCFirstServerRoom + if idc.FirstServerRoom != "" { + err := json.Unmarshal([]byte(idc.FirstServerRoom), &fsr) + if err != nil { + return nil, err + } + } + result.IDC = IDCForServerRoomPage{ + ID: srcp.IDCID, + Name: idc.Name, + FirstServerRoom: fsr, + Vendor: idc.Vendor, + Status: idc.Status, + } + + for k := range fsr { + if fsr[k].Name == srcp.FirstServerRoom { + result.FirstServerRoom = fsr[k] + } + } + } + + //统计库房中的虚拟货架数量 + count, err := repo.CountVirtualCabinets(&model.VirtualCabinet{StoreRoomID: result.ID}) + if err != nil { + return nil, err + } + result.CabinetCount = count + + return &result, nil +} + +//GetStoreRoomByID 获取指定ID的库房的详细信息 +func GetStoreRoomByID(log logger.Logger, repo model.Repo, id uint) (*StoreRoom, error) { + items, err := repo.GetStoreRoomByID(id) + if err != nil { + return nil, err + } + + item, err := convert2StoreRoomResult(log, repo, items) + if err != nil { + return nil, err + } + return item, nil +} + +////////////////////////////////////////////////// 虚拟货架 ///////////////////////////////////// + +//SaveVirtualCabinetReq 保存虚拟货架请求参数 +type SaveVirtualCabinetReq struct { + // 库房ID + StoreRoomID uint `json:"store_room_id"` + //库房ID。若id=0,则新增。若id>0,则修改。 + ID uint `json:"id"` + //(required) 编号 + Number string `json:"number"` + //备注 + Remark string + // 用户登录名 + LoginName string `json:"-"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *SaveVirtualCabinetReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.StoreRoomID: "store_room_id", + //&reqData.ID: "id", + &reqData.Number: "name", + &reqData.Remark: "remark", + } +} + +//SaveVirtualCabinet 新增虚拟货架 +func SaveVirtualCabinet(log logger.Logger, repo model.Repo, reqData *SaveVirtualCabinetReq) error { + sr := model.VirtualCabinet{ + StoreRoomID: reqData.StoreRoomID, + Number: reqData.Number, + Remark: reqData.Remark, + Status: model.CabinetStatEnabled, + Creator: reqData.LoginName, + } + _, err := repo.SaveVirtualCabinet(&sr) + if err != nil { + return err + } + reqData.ID = sr.ID + return nil +} + +// RemoveVirtualCabinetValidate 删除之前的数据校验 +func RemoveVirtualCabinetValidate(log logger.Logger, repo model.Repo, vCabinetID uint) (bool, error) { + devs, err := repo.GetDevices(&model.Device{VCabinetID: vCabinetID}, nil, nil) + if err != nil { + log.Errorf("count devices of virtual cabinet:%d fail", vCabinetID) + return false, err + } + if len(devs) != 0 { + return false, fmt.Errorf("虚拟机位(id:%d)上关联有物理机(SN:%s),须先搬离再删除", vCabinetID, devs[0].SN) + } + return true, nil +} + +//RemoveVirtualCabinetByID 删除指定ID的虚拟货架 +func RemoveVirtualCabinetByID(log logger.Logger, repo model.Repo, id uint) error { + _, err := repo.RemoveVirtualCabinetByID(id) + return err +} + +type GetVirtualCabinetPageReq struct { + Page int64 `json:"page"` + // 分页大小。默认值:10。阈值 100 + PageSize int64 `json:"page_size"` + // StoreRoomID + StoreRoomID uint `json:"store_room_id"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *GetVirtualCabinetPageReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.StoreRoomID: "store_room_id", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + } +} + +//VirtualCabinet 虚拟货架信息 +type VirtualCabinet struct { + //ID + ID uint `json:"id"` + //创建时间 + CreatedAt times.ISOTime `json:"created_at"` + //更新时间 + UpdatedAt times.ISOTime `json:"updated_at"` + StoreRoomID uint `json:"store_room_id"` + Number string `json:"number"` + Remark string `json:"remark"` + Status string `json:"status"` + Creator string `json:"creator"` +} + +//GetVirtualCabinetWithPage 获取虚拟货架分页 +func GetVirtualCabinetWithPage(log logger.Logger, repo model.Repo, reqData *GetVirtualCabinetPageReq) (*page.Page, error) { + if reqData.PageSize <= 0 || reqData.PageSize > 100 { + reqData.PageSize = 20 + } + if reqData.Page < 0 { + reqData.Page = 0 + } + + cond := model.VirtualCabinet{ + StoreRoomID: reqData.StoreRoomID, + } + + totalRecords, err := repo.CountVirtualCabinets(&cond) + if err != nil { + return nil, err + } + + pager := page.NewPager(reflect.TypeOf(&VirtualCabinet{}), reqData.Page, reqData.PageSize, totalRecords) + items, err := repo.GetVirtualCabinets(&cond, model.OneOrderBy("id", model.DESC), pager.BuildLimiter()) + if err != nil { + return nil, err + } + for _, i := range items { + result := VirtualCabinet{ + ID: i.ID, + CreatedAt: times.ISOTime(i.CreatedAt), + UpdatedAt: times.ISOTime(i.UpdatedAt), + StoreRoomID: i.StoreRoomID, + Number: i.Number, + Status: i.Status, + Remark: i.Remark, + Creator: i.Creator, + } + pager.AddRecords(&result) + } + return pager.BuildPage(), nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/system_setting.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/system_setting.go new file mode 100644 index 0000000000000000000000000000000000000000..8bb9519c5f91bdaee71c983e54daf094df37ccc4 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/system_setting.go @@ -0,0 +1,29 @@ +package service + +import ( + "fmt" + "strings" + + "idcos.io/cloudboot/config" +) + +// SystemLoginSetting 系统登录配置 +type SystemLoginSetting struct { + Channel string `json:"channel"` // 系统登录通道 + URL string `json:"url"` // 系统登录URL + RootEndpoint string `json:"-"` +} + +const ( + // LoginChanUAMSSO 系统登录通道-UAM SSO + LoginChanUAMSSO = "uam_sso" +) + +// GetSystemLoginSetting 返回系统登录配置 +func GetSystemLoginSetting(conf *config.Config) (*SystemLoginSetting, error) { + return &SystemLoginSetting{ + Channel: LoginChanUAMSSO, + URL: fmt.Sprintf("%s/login", strings.TrimSuffix(conf.UAM.RootEndpoint, "/")), + RootEndpoint: conf.UAM.RootEndpoint, + }, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/system_template.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/system_template.go new file mode 100644 index 0000000000000000000000000000000000000000..bf44dbd10313d6740bfe4a544cbcd19f46d51b65 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/system_template.go @@ -0,0 +1,311 @@ +package service + +import ( + "net/http" + "reflect" + "strings" + + "github.com/jinzhu/gorm" + "github.com/voidint/binding" + "github.com/voidint/page" + + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils/collection" + mystrings "idcos.io/cloudboot/utils/strings" + mytimes "idcos.io/cloudboot/utils/times" +) + +// SystemTemplateResp 系统安装模板 +type SystemTemplateResp struct { + ID uint `json:"id"` + Family string `json:"family"` // 操作系统族系 + Name string `json:"name"` // 模板名 + BootMode string `json:"boot_mode"` // 启动模式 + PXE string `json:"pxe"` // PXE 引导模板内容 + Username string `json:"username"` // 操作系统用户名 + Password string `json:"password"` // 操作系统用户密码 + Content string `json:"content"` // 模板内容 + CreatedAt string `json:"created_at"` // 创建时间 + UpdatedAt string `json:"updated_at"` // 更新时间 + // OS生命周期:Testing|Active(Default)|Active|Containment|EOL + OSLifecycle string `json:"os_lifecycle"` + // OS架构平台:x86_64|aarch64 + Arch string `json:"arch"` +} + +// GetSystemTemplatePageReq 查询系统安装模板分页请求结构体 +type GetSystemTemplatePageReq struct { + Family string `json:"family"` // 操作系统族系 + Name string `json:"name"` // 模板名 + BootMode string `json:"boot_mode"` // 启动模式 + // OS生命周期:Testing|Active(Default)|Active|Containment|EOL + OSLifecycle string `json:"os_lifecycle"` + // OS架构平台:x86_64|aarch64 + Arch string `json:"arch"` + Page int64 `json:"page"` + PageSize int64 `json:"page_size"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *GetSystemTemplatePageReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.Family: "family", + &reqData.Name: "name", + &reqData.BootMode: "boot_mode", + &reqData.OSLifecycle: "os_lifecycle", + &reqData.Arch: "arch", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + } +} + +// GetSystemTemplatePage 按条件查询系统安装模板分页列表 +func GetSystemTemplatePage(log logger.Logger, repo model.Repo, reqData *GetSystemTemplatePageReq) (pg *page.Page, err error) { + if reqData.PageSize <= 0 || reqData.PageSize > 100 { + reqData.PageSize = 10 + } + if reqData.Page < 0 { + reqData.Page = 0 + } + + cond := model.SystemTemplate{ + Family: reqData.Family, + BootMode: reqData.BootMode, + Name: reqData.Name, + } + + totalRecords, err := repo.CountSystemTemplates(&cond) + if err != nil { + return nil, err + } + + pager := page.NewPager(reflect.TypeOf(&SystemTemplateResp{}), reqData.Page, reqData.PageSize, totalRecords) + items, err := repo.GetSystemTemplates(&cond, model.OneOrderBy("name", model.ASC), pager.BuildLimiter()) + if err != nil { + return nil, err + } + + for i := range items { + pager.AddRecords(convert2SystemTemplate(items[i])) + } + return pager.BuildPage(), nil +} + +// GetSystemTemplateByID 返回指定ID的系统模板 +func GetSystemTemplateByID(log logger.Logger, repo model.Repo, id uint) (*SystemTemplateResp, error) { + tpl, err := repo.GetSystemTemplateByID(id) + if err != nil { + return nil, err + } + return convert2SystemTemplate(tpl), nil +} + +// convert2SystemTemplate 将model层的系统安装模板对象转化成service层的系统安装模板对象 +func convert2SystemTemplate(src *model.SystemTemplate) *SystemTemplateResp { + if src == nil { + return nil + } + return &SystemTemplateResp{ + ID: src.ID, + Family: src.Family, + Name: src.Name, + BootMode: src.BootMode, + PXE: src.PXE, + Username: src.Username, + Password: src.Password, + Content: src.Content, + CreatedAt: src.CreatedAt.Format("2006-01-02 15:04:05"), + UpdatedAt: src.UpdatedAt.Format("2006-01-02 15:04:05"), + OSLifecycle: src.OSLifecycle, + Arch: src.Arch, + } +} + +// SaveSystemTemplateReq 保存(新增/更新)系统安装模板请求结构体 +type SaveSystemTemplateReq struct { + // 注:更新时该属性大于0 + ID uint `json:"id"` + // 操作系统族系 + Family string `json:"family"` + // 模板名 + Name string `json:"name"` + // 启动模式 + BootMode string `json:"boot_mode"` + // PXE 引导模板内容 + PXE string `json:"pxe"` + // 操作系统用户名 + Username string `json:"username"` + // 操作系统用户密码 + Password string `json:"password"` + // 模板内容 + Content string `json:"content"` + // OS生命周期:Testing|Active(Default)|Active|Containment|EOL + OSLifecycle string `json:"os_lifecycle"` + // OS架构平台:x86_64|aarch64 + Arch string `json:"arch"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *SaveSystemTemplateReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.Family: "family", + &reqData.Name: "name", + &reqData.BootMode: "boot_mode", + &reqData.PXE: "pxe", + &reqData.Username: "username", + &reqData.Password: "password", + &reqData.Content: "content", + &reqData.OSLifecycle: "os_lifecycle", + &reqData.Arch: "arch", + } +} + +// Validate 结构体数据校验 +func (reqData *SaveSystemTemplateReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + repo, _ := middleware.RepoFromContext(req.Context()) + + if reqData.Family == "" { + errs.Add([]string{"family"}, binding.RequiredError, "操作系统不能为空") + return errs + } + + if reqData.Name == "" { + errs.Add([]string{"name"}, binding.RequiredError, "名称不能为空") + return errs + } + + // 校验系统安装模板唯一性 + items, err := repo.GetSystemTemplates(&model.SystemTemplate{ + Name: reqData.Name, + }, nil, nil) + if err != nil { + errs.Add([]string{"name"}, binding.SystemError, "系统内部错误") + return errs + } + + for _, item := range items { + if (reqData.ID == 0 && strings.ToLower(item.Name) == strings.ToLower(reqData.Name)) || // 新增模板时,模板名不能重名。 + (reqData.ID > 0 && strings.ToLower(item.Name) == strings.ToLower(reqData.Name) && reqData.ID != item.ID) { // 更新模板时,模板名不能重名(除了自身外)。 + errs.Add([]string{"name"}, binding.BusinessError, "名称不能重复") + return errs + } + } + + if reqData.BootMode == "" { + errs.Add([]string{"boot_mode"}, binding.RequiredError, "启动模式不能为空") + return errs + } + + if !collection.InSlice(reqData.BootMode, []string{model.BootModeBIOS, model.BootModeUEFI}) { + errs.Add([]string{"boot_mode"}, binding.BusinessError, "无效的启动模式") + return errs + } + + if reqData.OSLifecycle == "" { + errs.Add([]string{"os_lifecycle"}, binding.RequiredError, "OS生命周期不能为空") + return errs + } + + if !collection.InSlice(reqData.OSLifecycle, []string{model.OSTesting, model.OSActiveDefault, model.OSActive, model.OSContainment, model.OSEOL}) { + errs.Add([]string{"os_lifecycle"}, binding.BusinessError, "无效的OS生命周期") + return errs + } + + if reqData.Arch == "" { + errs.Add([]string{"arch"}, binding.RequiredError, "OS架构不能为空") + return errs + } + + if !collection.InSlice(reqData.Arch, []string{model.OSARCHAARCH64, model.OSARCHX8664}) { + errs.Add([]string{"arch"}, binding.BusinessError, "无效的OS架构") + return errs + } + + if reqData.PXE == "" { + errs.Add([]string{"pxe"}, binding.RequiredError, "PXE模板不能为空") + return errs + } + if reqData.Content == "" { + errs.Add([]string{"content"}, binding.RequiredError, "系统模板不能为空") + return errs + } + return errs +} + +// SaveSystemTemplate 保存系统安装模板 +func SaveSystemTemplate(log logger.Logger, repo model.Repo, reqData *SaveSystemTemplateReq) (id uint, err error) { + tpl := model.SystemTemplate{ + Family: reqData.Family, + BootMode: reqData.BootMode, + Name: reqData.Name, + Username: reqData.Username, + Password: reqData.Password, + PXE: mystrings.DOS2UNIX(reqData.PXE), + Content: mystrings.DOS2UNIX(reqData.Content), + OSLifecycle: reqData.OSLifecycle, + Arch: reqData.Arch, + } + tpl.ID = reqData.ID + affected, err := repo.SaveSystemTemplate(&tpl) + if err != nil { + return 0, err + } + if affected <= 0 && tpl.ID > 0 { + return 0, gorm.ErrRecordNotFound + } + return tpl.ID, nil +} + +// RemoveSystemTemplate 删除指定ID的系统安装模板 +func RemoveSystemTemplate(log logger.Logger, repo model.Repo, id uint) (err error) { + affected, err := repo.RemoveSystemTemplate(id) + if err != nil { + return err + } + if affected <= 0 { + return gorm.ErrRecordNotFound + } + return nil +} + +// SystemTemplate 系统安装模板 +type SystemTemplate struct { + ID uint `json:"id"` + Family string `json:"family"` // 操作系统族系 + Name string `json:"name"` // 模板名 + BootMode string `json:"boot_mode"` // 启动模式 + PXE string `json:"pxe"` // PXE 引导模板内容 + Username string `json:"username"` // 操作系统用户名 + Password string `json:"password"` // 操作系统用户密码 + Content string `json:"content"` // 模板内容 + OSLifecycle string `json:"os_lifecycle"` // OS生命周期:Testing|Active(Default)|Active|Containment|EOL + Arch string `json:"arch"` // OS架构平台:x86_64|aarch64 + CreatedAt mytimes.ISOTime `json:"created_at"` // 创建时间 + UpdatedAt mytimes.ISOTime `json:"updated_at"` // 更新时间 +} + +// GetSystemTemplateBySN 根据SN查询设备的系统模板信息 +func GetSystemTemplateBySN(log logger.Logger, repo model.Repo, sn string) (*SystemTemplate, error) { + tpl, err := repo.GetSystemTemplateBySN(sn) + if err != nil { + return nil, err + } + return &SystemTemplate{ + ID: tpl.ID, + Family: tpl.Family, + Name: tpl.Name, + BootMode: tpl.BootMode, + PXE: tpl.PXE, + Username: tpl.Username, + Password: tpl.Username, + Content: mystrings.DOS2UNIX(tpl.Content), + OSLifecycle: tpl.OSLifecycle, + Arch: tpl.Arch, + CreatedAt: mytimes.ISOTime(tpl.CreatedAt), + UpdatedAt: mytimes.ISOTime(tpl.UpdatedAt), + }, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/user.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/user.go new file mode 100644 index 0000000000000000000000000000000000000000..281708682794bacf1bc906559fb63a2a88b16a24 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/service/user.go @@ -0,0 +1,155 @@ +package service + +import ( + "net/http" + "reflect" + + "github.com/voidint/binding" + "github.com/voidint/page" + + "idcos.io/cloudboot/config" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" + uam "idcos.io/uam-go" +) + +// GetUserPageReq 查询用户分页请求结构体 +type GetUserPageReq struct { + // DepartmentID 部门ID + DepartmentID string `json:"department_id"` + // 用户名 + Name string `json:"name"` + // 分页页号 + Page int64 `json:"page"` + // 分页大小 + PageSize int64 `json:"page_size"` + User *model.CurrentUser `json:"-"` +} + +// FieldMap 请求字段映射 +func (reqData *GetUserPageReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.DepartmentID: "department_id", + &reqData.Name: "name", + &reqData.Page: "page", + &reqData.PageSize: "page_size", + } +} + +// Validate 结构体数据校验 +func (reqData *GetUserPageReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + if reqData.User == nil { // 确保先经过登录认证中间件过滤 + panic("unreachable") + } + return errs +} + +// GetUserPage 按条件查询当前用户所在租户下的用户分页列表 +func GetUserPage(log logger.Logger, conf *config.Config, reqData *GetUserPageReq) (pg *page.Page, err error) { + if reqData.PageSize <= 0 { + reqData.PageSize = 10 + } + if reqData.Page <= 0 { + reqData.Page = 1 + } + + opts := []uam.SetOptionFunc{ + uam.LogOption(log), + uam.TenantOption(model.TenantID4UAM), + } + pageNo, pageSize, _, totalRecords, users, err := uam.NewClient(conf.UAM.RootEndpoint, reqData.User.Token, opts...).GetUsers(reqData.DepartmentID, reqData.Name, &uam.PageLimiter{ + PageNo: reqData.Page, + PageSize: reqData.PageSize, + }) + if err != nil { + return nil, err + } + pager := page.NewPager(reflect.TypeOf(&model.User{}), pageNo, pageSize, totalRecords) + for i := range users { + pager.AddRecords(&model.User{ + ID: users[i].ID, + LoginName: users[i].LoginID, + Name: users[i].Name, + Email: users[i].Email, + Status: users[i].Status, + Tenant: &model.Tenant{ + ID: users[i].Tenant.ID, + Name: users[i].Tenant.Name, + }, + Department: &model.Department{ + ID: users[i].Department.ID, + Name: users[i].Department.Name, + }, + }) + } + return pager.BuildPage(), nil +} + +// ChangeUserPasswordReq 修改用户密码请求结构体 +type ChangeUserPasswordReq struct { + OldPassword string `json:"old_password"` + NewPassword string `json:"new_password"` + User *model.CurrentUser `json:"-"` +} + +// FieldMap 请求字段映射 +func (reqData *ChangeUserPasswordReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.OldPassword: "old_password", + &reqData.NewPassword: "new_password", + } +} + +// Validate 结构体数据校验 +func (reqData *ChangeUserPasswordReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + if reqData.User == nil { // 确保先经过登录认证中间件过滤 + panic("unreachable") + } + if reqData.OldPassword == "" { + errs.Add([]string{"old_password"}, binding.RequiredError, "旧密码不能为空") + return errs + } + if reqData.NewPassword == "" { + errs.Add([]string{"new_password"}, binding.RequiredError, "新密码不能为空") + return errs + } + return errs +} + +// ChangeUserPassword 修改当前用户密码 +func ChangeUserPassword(log logger.Logger, conf *config.Config, reqData *ChangeUserPasswordReq) (err error) { + return uam.NewClient(conf.UAM.RootEndpoint, reqData.User.Token, uam.LogOption(log)).ChangeUserPassword(reqData.User.ID, reqData.OldPassword, reqData.NewPassword) +} + +// GetUserByID 使用当前用户token去查询目标ID的用户信息 +func GetUserByID(log logger.Logger, conf *config.Config, token, id string) (*model.User, error) { + if id == "" { + return nil, nil + } + opts := []uam.SetOptionFunc{ + uam.LogOption(log), + //uam.TenantOption(conf.UAM.Customer), + } + + u, err := uam.NewClient(conf.UAM.RootEndpoint, token, opts...).GetUserByID(id) + if err != nil { + return nil, err + } + return &model.User{ + ID: u.ID, + LoginName: u.LoginID, + Name: u.Name, + Email: u.Email, + Status: u.Status, + Tenant: &model.Tenant{ + ID: u.Tenant.ID, + Name: u.Tenant.Name, + }, + Department: &model.Department{ + ID: u.Department.ID, + Name: u.Department.Name, + }, + }, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/types/device/device.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/types/device/device.go new file mode 100644 index 0000000000000000000000000000000000000000..3c58afe47819f70fa985a599cff44f7b504282d7 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/types/device/device.go @@ -0,0 +1,64 @@ +package device + +import ( + "fmt" + "strings" + + "idcos.io/cloudboot/hardware/collector" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils/collection" +) + +// Device 设备信息采集上报请求数据 +type Device struct { + SN string `json:"sn"` // 设备序列号 + Vendor string `json:"vendor"` // 设备厂商名 + Model string `json:"model"` // 设备型号 + Arch string `json:"arch"` // CPU硬件架构 + BootOSIP string `json:"bootos_ip"` // bootos ip地址 + BootOSMac string `json:"bootos_mac"` // bootos ip对应的mac地址 + NICDevice string `json:"nic_device"` // 根据NIC计算获取 + CPU *collector.CPU `json:"cpu"` // CPU + Memory *collector.Memory `json:"memory"` // 内存 + Disk *collector.Disk `json:"disk"` // 逻辑磁盘 + DiskSlot *collector.DiskSlot `json:"disk_slot"` // 磁盘槽位(物理驱动器) + NIC *collector.NIC `json:"nic"` // 网卡 + Motherboard *collector.Motherboard `json:"motherboard"` // 主板 + OOB *collector.OOB `json:"oob"` // 带外 + BIOS *collector.BIOS `json:"bios"` // BIOS + RAID *collector.RAID `json:"raid"` // RAID + Power *collector.Power `json:"power"` // 电源 + Fan *collector.Fan `json:"fan"` // 风扇 + PCI *collector.PCI `json:"pci"` // PCI插槽 + HBA *collector.HBA `json:"hba"` // HBA + LLDP *collector.LLDP `json:"lldp"` // LLDP + Extra *collector.Extra `json:"extra"` // 自定义扩展字段 +} + +// Setup 设置 +func (reqData *Device) Setup() { + if reqData.OOB != nil && reqData.OOB.Network != nil { + if reqData.OOB.Network.IPSrc == "Static Address" { + reqData.OOB.Network.IPSrc = model.IPSourceStatic + } else { + reqData.OOB.Network.IPSrc = model.IPSourceDHCP + } + } + + // 计算IP、MAC、NICDevice + var uniqNICs []string + if reqData.NIC != nil { + for i := range reqData.NIC.Items { + nic := fmt.Sprintf("%s %s", reqData.NIC.Items[i].Company, reqData.NIC.Items[i].ModelName) + if !collection.InSlice(nic, uniqNICs) { + uniqNICs = append(uniqNICs, nic) + } + + if reqData.NIC.Items[i].IP != "" { + reqData.BootOSIP = reqData.NIC.Items[i].IP + reqData.BootOSMac = reqData.NIC.Items[i].Mac + } + } + } + reqData.NICDevice = strings.Join(uniqNICs, "\n") +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/types/setting/device.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/types/setting/device.go new file mode 100644 index 0000000000000000000000000000000000000000..83c84e3387c00867fe079810a19375b31ab0c378 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/types/setting/device.go @@ -0,0 +1,56 @@ +package setting + +// NetworkSetting 装机参数-业务网络参数 +type NetworkSetting struct { + Hostname string `json:"hostname"` // 主机名 + IPSource string `json:"ip_source"` // 业务网络类型 + SkipPing string `json:"skip_ping"` // 是否跳过对业务网络IP的ping检查(仅业务网络类型为static时有效) + Items []NetworkSettingItem `json:"items"` +} + +// NetworkSettingItem 装机参数-业务网络参数条目 +type NetworkSettingItem struct { + NetworkID int `json:"network_id"` // 所属网段的ID + IP string `json:"ip"` + Mac string `json:"mac"` + Netmask string `json:"netmask"` + Gateway string `json:"gateway"` + VLAN string `json:"vlan"` + Trunk string `json:"trunk"` + Bonding string `json:"bonding"` + DNS string `json:"dns"` +} + +// PartitionSettingItem 装机参数-分区参数 +type PartitionSettingItem struct { + Disk int `json:"disk"` + Size string `json:"size"` + FS string `json:"fs"` + Mountpoint string `json:"mountpoint"` +} +// NICBondingSettingItem 网卡绑定信息结构体 +type NICBondingSettingItem struct { + Name string `json:"bonding_name"` // bonding名称 + Mode string `json:"bonding_mode"` // bonding模式 + NICs []BondNIC `json:"nics"` // 需要绑定的网卡,暂时支持2个网卡的绑定。 +} + +// BondNIC bonding用的网卡信息结构体 +type BondNIC struct { + MacAddr string `json:"mac_addr"` // mac地址 + Type string `json:"type"` // 该网卡在绑定中所处的角色/地位。可选值:master|slave +} + +// OSTemplateSetting 操作系统模板配置参数 +type OSTemplateSetting struct { + ID int `json:"id"` // 模板ID + Family string `json:"family"` // 操作系统族系 + Name string `json:"name"` // 模板名称 + BootMode string `json:"boot_mode"` // 启动模式。可选值: legacy_bios-传统BIOS模式; uefi-UEFI模式; +} + +// OSUserSettingItem 装机参数-操作系统管理员用户 +type OSUserSettingItem struct { + Username string `json:"username"` + Password string `json:"password"` +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/types/setting/hardware.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/types/setting/hardware.go new file mode 100644 index 0000000000000000000000000000000000000000..55e526e85d88c14e1677f5bfe7f82862b0260e87 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/types/setting/hardware.go @@ -0,0 +1,112 @@ +package setting + +import ( + "strconv" + + "idcos.io/cloudboot/hardware/raid" + "idcos.io/cloudboot/model" +) + +const ( + // ON 打开 + ON = "ON" + // OFF 关闭 + OFF = "OFF" +) + +// HardwareSetting 硬件配置项。 +// 详见http://gitlab.idcos.io/cloudboot/cloudboot/issues/344 +type HardwareSetting struct { + Index uint `json:"index"` // 当前配置项在配置项序列中的索引号(自0始) + Category string `json:"category"` // 硬件配置动作类别,可选值: raid|oob|bios|firmware|reboot + Action string `json:"action"` // 配置动作,如add_user、reset_bmc、set_ip、set_bios等 + Metadata map[string]string `json:"metadata"` // 配置项元信息 + Applied string `json:"applied"` // 是否已实施,可选值: Yes|No + // Metadata HardwareSettingMetadata `json:"metadata"` +} + +// HardwareSettings 硬件配置参数集合 +type HardwareSettings []*HardwareSetting + +// ExtractRAID 提取其中的RAID配置 +func (setts HardwareSettings) ExtractRAID() *raid.Setting { + items := setts.FindByCategory(model.CategoryRAID) + if len(items) <= 0 { + return nil + } + ctrlMap := make(map[string]*raid.ControllerSetting) + for i := range items { + if items[i] == nil { + continue + } + ctrlIdx, ok := items[i].Metadata["controller_index"] + if !ok || ctrlIdx == "" { + continue + } + + ctrl, ok := ctrlMap[ctrlIdx] + if !ok || ctrl == nil { + ctrl = new(raid.ControllerSetting) + ctrlMap[ctrlIdx] = ctrl + } + idx, _ := strconv.Atoi(ctrlIdx) + ctrl.Index = uint(idx) + + switch items[i].Action { + case model.ActionRAIDCreate: + ctrl.Arrays = append(ctrl.Arrays, raid.ArraySetting{ + Level: items[i].Metadata["level"], + Drives: items[i].Metadata["drives"], + }) + case model.ActionRAIDClear: + ctrl.Clear = items[i].Metadata["clear"] + case model.ActionRAIDSetJBOD: + ctrl.JBODs = items[i].Metadata["drives"] + case model.ActionRAIDSetGlobalHotspare: + ctrl.Hotspares = items[i].Metadata["drives"] + case model.ActionRAIDInitDisk: + ctrl.DiskInit = items[i].Metadata["init"] + } + } + + ctrls := make([]raid.ControllerSetting, 0, len(ctrlMap)) + for _, ctrl := range ctrlMap { + ctrls = append(ctrls, *ctrl) + } + + return &raid.Setting{ + Controllers: ctrls, + } +} + +// Find 返回满足条件的所有元素集合 +func (setts HardwareSettings) Find(category, action string) (items []*HardwareSetting) { + for i := range setts { + if setts[i] == nil { + continue + } + if setts[i].Category == category && setts[i].Action == action { + items = append(items, setts[i]) + } + } + return items +} + +// FindByCategory 返回满足条件的所有元素集合 +func (setts HardwareSettings) FindByCategory(category string) (items []*HardwareSetting) { + for i := range setts { + if setts[i] == nil { + continue + } + if setts[i].Category == category { + items = append(items, setts[i]) + } + } + return items +} + +// HardwareTemplateSetting 硬件模板配置参数 +type HardwareTemplateSetting struct { + ID int `json:"id"` // 硬件模板ID + Name string `json:"name"` // 硬件模板名称 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/util/string.go b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/util/string.go new file mode 100644 index 0000000000000000000000000000000000000000..892c1eb41ff5520d2dcb946aa622396ac08b9c57 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/cloudbootserver/util/string.go @@ -0,0 +1,59 @@ +package util + +//"strings" + +// SubString 字符串截取 +func SubString(str string, begin int, length int) string { + // 将字符串的转换成[]rune + rs := []rune(str) + lth := len(rs) + + // 简单的越界判断 + if begin < 0 { + begin = 0 + } + if begin >= lth { + begin = lth + } + + end := begin + length + if end > lth { + end = lth + } + + // 返回子串 + return string(rs[begin:end]) +} + +// SubStrByByte 根据byte截取字符串 +func SubStrByByte(str string, length int) string { + bs := []byte(str)[:length] + bl := 0 + for i := len(bs) - 1; i >= 0; i-- { + switch { + case bs[i] >= 0 && bs[i] <= 127: + return string(bs[:i+1]) + case bs[i] >= 128 && bs[i] <= 191: + bl++ + case bs[i] >= 192 && bs[i] <= 253: + cl := 0 + switch { + case bs[i]&252 == 252: + cl = 6 + case bs[i]&248 == 248: + cl = 5 + case bs[i]&240 == 240: + cl = 4 + case bs[i]&224 == 224: + cl = 3 + default: + cl = 2 + } + if bl+1 == cl { + return string(bs[:i+cl]) + } + return string(bs[:i]) + } + } + return "" +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/hwserver/config/config.go b/cyclone-server/src/idcos.io/cloudboot/server/hwserver/config/config.go new file mode 100644 index 0000000000000000000000000000000000000000..d59dedd75e944cca4f735872affd5334f3bbace5 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/hwserver/config/config.go @@ -0,0 +1,18 @@ +package config + +// Configuration hw-server配置结构体 +type Configuration struct { + SN string // 当前设备sn + Manufacturer string // 当前设备厂商名 + + Logger struct { + Level string + Dir string + } + + HTTPServer struct { + Enabled bool + Port int + BaseURL string + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/hwserver/httpserver/route/error.go b/cyclone-server/src/idcos.io/cloudboot/server/hwserver/httpserver/route/error.go new file mode 100644 index 0000000000000000000000000000000000000000..1e0c9dcc2d455919ff3022f20e25e1c0d0a2fe56 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/hwserver/httpserver/route/error.go @@ -0,0 +1,42 @@ +package route + +import ( + "context" + "net/http" + + "github.com/jinzhu/gorm" + "github.com/voidint/binding" + + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// HandleValidateErrs 数据校验错误处理。 +// 将参数绑定校验框架(github.com/voidint/binding)产生的校验错误,以一定格式写入http response body。 +func HandleValidateErrs(errs binding.Errors, w http.ResponseWriter) bool { + if errs.Len() <= 0 { + return false + } + + if errs.Has(binding.SystemError) { + render.JSON(w, http.StatusInternalServerError, myhttp.ErrRespBody(errs.Error())) + } else { + render.JSON(w, http.StatusBadRequest, myhttp.ErrRespBody(errs.Error())) + } + return true +} + +// HandleErr service层的业务逻辑错误处理 +func HandleErr(ctx context.Context, w http.ResponseWriter, err error) { + if err == nil { + return + } + + switch err { + case gorm.ErrRecordNotFound: + render.JSON(w, http.StatusNotFound, myhttp.ErrRespBody("资源不存在")) + + default: + render.JSON(w, http.StatusInternalServerError, myhttp.ErrRespBody(err.Error())) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/hwserver/httpserver/route/route.go b/cyclone-server/src/idcos.io/cloudboot/server/hwserver/httpserver/route/route.go new file mode 100644 index 0000000000000000000000000000000000000000..272e7425684092d72f2c0fcca260ae4be82c396e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/hwserver/httpserver/route/route.go @@ -0,0 +1,46 @@ +package route + +import ( + "net/http" + + "github.com/go-chi/chi" + + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/hwserver/service" + myhttp "idcos.io/cloudboot/utils/http" + "idcos.io/cloudboot/utils/http/render" +) + +// AreYouOK 用于检测服务是否可用 +func AreYouOK(w http.ResponseWriter, r *http.Request) { + render.Text(w, http.StatusOK, []byte("pong")) +} + +// Collect 执行设备信息采集。采集期间需阻塞,直到采集完毕并响应采集到的设备信息。 +func Collect(w http.ResponseWriter, r *http.Request) { + conf, _ := middleware.HWConfigFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + dev, err := service.CollectDevice(conf, log) + if err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, + myhttp.NewRespBody(myhttp.Success, "操作成功", myhttp.DumpContent(dev)), + ) +} + +// ApplySettings 硬件配置实施。 +func ApplySettings(w http.ResponseWriter, r *http.Request) { + conf, _ := middleware.HWConfigFromContext(r.Context()) + log, _ := middleware.LoggerFromContext(r.Context()) + + if err := service.NewSettingWorker(conf, log, chi.URLParam(r, "sn")).Apply(); err != nil { + HandleErr(r.Context(), w, err) + return + } + + render.JSON(w, http.StatusOK, myhttp.SucceedRespBody("操作成功")) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/hwserver/httpserver/routes.go b/cyclone-server/src/idcos.io/cloudboot/server/hwserver/httpserver/routes.go new file mode 100644 index 0000000000000000000000000000000000000000..36d124609c8584e53ab5233f474fce0f4e3f0684 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/hwserver/httpserver/routes.go @@ -0,0 +1,13 @@ +package httpserver + +import ( + "github.com/go-chi/chi" + + "idcos.io/cloudboot/server/hwserver/httpserver/route" +) + +func registerHandlers(mux *chi.Mux) { + mux.Get("/api/cloudboot/hw/v1/ping", route.AreYouOK) + mux.Get("/api/cloudboot/hw/v1/devices/collections", route.Collect) // 触发设备信息采集并返回设备信息 + mux.Post("/api/cloudboot/hw/v1/devices/{sn}/settings/applyings", route.ApplySettings) // 触发硬件配置实施 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/hwserver/httpserver/server.go b/cyclone-server/src/idcos.io/cloudboot/server/hwserver/httpserver/server.go new file mode 100644 index 0000000000000000000000000000000000000000..19352f477f76f3ee8de49af3a615478a85281ac6 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/hwserver/httpserver/server.go @@ -0,0 +1,39 @@ +package httpserver + +import ( + "net/http" + + "github.com/go-chi/chi" + "github.com/go-chi/chi/middleware" + + "idcos.io/cloudboot/logger" + mw "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/server/hwserver/config" +) + +// Server HTTP server +type Server struct { + conf *config.Configuration + log logger.Logger + handler http.Handler +} + +// NewServer 返回HTTP server实例 +func NewServer(conf *config.Configuration, log logger.Logger) (srv *Server, err error) { + r := chi.NewRouter() + r.Use(middleware.Recoverer) + r.Use(mw.InjectLogger(log)) + r.Use(mw.InjectHWConfig(conf)) + + registerHandlers(r) + + return &Server{ + conf: conf, + log: log, + handler: r, + }, nil +} + +func (srv *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { + srv.handler.ServeHTTP(w, r) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/hwserver/service/apply.go b/cyclone-server/src/idcos.io/cloudboot/server/hwserver/service/apply.go new file mode 100644 index 0000000000000000000000000000000000000000..add55ceb3fac4b72c624f301811883bb1b8597f5 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/hwserver/service/apply.go @@ -0,0 +1,455 @@ +package service + +import ( + "sort" + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "strconv" + "strings" + + "github.com/astaxie/beego/httplib" + + "regexp" + + "idcos.io/cloudboot/hardware/raid" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/server/cloudbootserver/types/setting" + "idcos.io/cloudboot/server/hwserver/config" +) + +// SettingWorker 硬件配置实施器 +type SettingWorker struct { + hwSettings []*setting.HardwareSetting + conf *config.Configuration + log logger.Logger + sn string +} + +// NewSettingWorker 返回硬件配置实施器实例 +func NewSettingWorker(conf *config.Configuration, log logger.Logger, sn string) *SettingWorker { + return &SettingWorker{ + conf: conf, + log: log, + sn: sn, + } +} + +// isEmpty 判断硬件配置是否为空 +func (worker *SettingWorker) isEmpty() bool { + return len(worker.hwSettings) <= 0 +} + +// Apply 实施硬件配置。 +func (worker *SettingWorker) Apply() error { + // 1、拉取硬件配置 + if err := worker.pull(); err != nil { + _ = worker.postProgress(failureProgress, "拉取硬件配置失败", err.Error()) + return err + } + + // 硬件配置参数为空,跳过硬件配置。 + if worker.isEmpty() { + _ = worker.postProgress(endProgress, "跳过硬件配置", "硬件配置参数为空") + return nil + } + // 3、硬件配置实施 + return worker.apply() +} + +// apply 配置实施 +func (worker *SettingWorker) apply() (err error) { + if worker.hwSettings == nil { + return ErrPullSettings + } + + //由于当前的hw-server完全是模板是怎么样,就实际下发什么配置,包括磁盘顺序 + //但在实际的环境中,常常由于盘的顺序不一致,导致需要定制不一样的模板,比如2RAID1+12RAID0 或者 12RAID0+2RAID1 + //所以在这里增加一个磁盘交换步骤,将RAID1的盘的序号换成小盘的序号 + //if err = worker.drivesSwap(); err != nil { + // worker.log.Errorf("swap drives fail, err:%v", err) + //} + //worker.log.Debug("after raid1 swap: hw-setting:") + raidSum := map[string]int { + "raid1":0, + "raid0":0, + } + for i := range worker.hwSettings { + worker.log.Debugf("%v", worker.hwSettings[i]) + switch worker.hwSettings[i].Category { + case model.CategoryRAID: + if worker.hwSettings[i].Action == model.ActionRAIDCreate && worker.hwSettings[i].Metadata["level"] == "raid1" { + worker.log.Debugf("raid level is: %v", worker.hwSettings[i].Metadata["level"]) + raidSum["raid1"] += 1 + } + if worker.hwSettings[i].Action == model.ActionRAIDCreate && worker.hwSettings[i].Metadata["level"] == "raid0" { + worker.log.Debugf("raid level is: %v", worker.hwSettings[i].Metadata["level"]) + raidSum["raid0"] += 1 + } + } + worker.log.Debugf("raid level sum: %v", raidSum) + } + if raidSum["raid1"] == 1 && raidSum["raid0"] == 12 { + if err = worker.drivesSwap(); err != nil { + worker.log.Errorf("swap drives fail, err:%v", err) + } + worker.log.Debug("after raid1 swap: hw-setting:") + } + + for i := range worker.hwSettings { + worker.log.Debug(worker.hwSettings[i]) + switch worker.hwSettings[i].Category { + case model.CategoryRAID: + if err = worker.doRAID(i, worker.hwSettings[i]); err != nil { + return err + } + } + } + return nil +} + +func (worker *SettingWorker) drivesSwap() (err error) { + var name string + name, err = raid.Whoami() + if err != nil { + return err + } + + w := raid.SelectWorker(name) + if w == nil { + return raid.ErrUnknownHardware + } + + //先统计一下有几个ctrl,把每个ctl下的磁盘列表(有序的index)拿到 + //mCtrlPhysicalDrvies := make(map[string]raid.PDSlice, 0) + var items []raid.PhysicalDrive + currentIdx := -1 //先给个无效值 + for i := range worker.hwSettings { + ctrlIdx, _ := strconv.Atoi(worker.hwSettings[i].Metadata["controller_index"]) + if currentIdx != ctrlIdx { + currentIdx = ctrlIdx + ctrlID, err := w.Convert2ControllerID(uint(ctrlIdx)) + if err != nil { + return err + } + pds, err := w.PhysicalDrives(ctrlID) + if err != nil { + return err + } + worker.log.Debugf("PhysicalDrives of ctrl:%d is %v", ctrlID, pds) + items = append(items, pds...) + worker.log.Debugf("ID of ctrl:%d", ctrlID) + for _, each := range items { + worker.log.Debugf("original physical drives :%v", each) + } + } + } + + pdsSort := make(raid.PDSlice, len(items), len(items)) + for j, pd := range items { + pdsSort[j].Index = j + pdsSort[j].PhysicalDrive = pd + } + // raid PDSlice 实现按disk size 由小到到进行sort + sort.Sort(pdsSort) + for _, each := range pdsSort { + worker.log.Debugf("check each sorted physical drives:%v", each) + } + //默认处理2RAID1+12RAID0,若发生过排序则代表2RAID1: 1-2 号盘非最小的,直接与末尾对调 + needSwap := false + if pdsSort[0].Index >1 && pdsSort[1].Index >1 { + worker.log.Debug("Index of two front sorted physical drives is not 0,1.Going to swap 1st,2nd to last position") + needSwap = true + } + + if len(pdsSort) > 2 { + lastIndex := len(pdsSort) - 1 + if needSwap { + pd0, pd1 := strconv.Itoa(lastIndex), strconv.Itoa(lastIndex+1) //记录下raid1实际需要使用的序号 + disk1OfRaid1, disk2OfRaid1 := "", "" //记录下raid1的原盘序号 + for i, sett := range worker.hwSettings { + switch worker.hwSettings[i].Category { + case model.CategoryRAID: + worker.log.Debugf("hwSettings:%v", sett) + sLevel, isExist := sett.Metadata["level"] + if isExist != true { + continue + } + var level raid.Level + level, err = raid.SelectLevel(sLevel) + if err != nil { + e := fmt.Errorf("%s: %s", err.Error(), sLevel) + return e + } + legacyDisks := sett.Metadata["drives"] + legacyDisksTrans, err := translateLegacyIndex(len(pdsSort), legacyDisks) + if err != nil { + return err + } + if level == raid.RAID1 { + strs := strings.Split(legacyDisksTrans, ",") + if len(strs) == 2 { + disk1OfRaid1, disk2OfRaid1 = strs[0], strs[1] //准备交换数据 + } + sett.Metadata["drives"] = fmt.Sprintf("%s,%s", pd0, pd1) + } else { + newLegacy := make([]string, 0) + for _, d := range strings.Split(legacyDisksTrans, ",") { + if d == pd0 { + newLegacy = append(newLegacy, disk1OfRaid1) //交换 + } else if d == pd1 { + newLegacy = append(newLegacy, disk2OfRaid1) //交换 + } else { + newLegacy = append(newLegacy, d) + } + } + sett.Metadata["drives"] = strings.Join(newLegacy, ",") + } + } + } + } + } + return nil +} + +//将目标中定制的1|2,3|4-6|7-|all,统一翻译成逗号分隔的形式。方便做交换,后续还会翻译成实际的磁盘 +func translateLegacyIndex(diskCount int, legacyDisks string) (string, error) { + if regexp.MustCompile("^[[:digit:]]+$").MatchString(legacyDisks) { + return legacyDisks, nil + + } else if regexp.MustCompile("^[[:digit:],]+$").MatchString(legacyDisks) { + return legacyDisks, nil + + } else if regexp.MustCompile("^[[:digit:]-]+[[:digit:]]$").MatchString(legacyDisks) { + arr := strings.Split(legacyDisks, "-") + if len(arr) != 2 { + return "", raid.ErrInvalidDiskIdentity + } + begin, _ := strconv.Atoi(arr[0]) + end, _ := strconv.Atoi(arr[1]) + if begin >= end { + return "", raid.ErrInvalidDiskIdentity + } + if begin > diskCount || end > diskCount { + return "", raid.ErrInvalidDiskIdentity + } + var indexes []string + for diskNo := begin; diskNo <= end; diskNo++ { + indexes = append(indexes, strconv.Itoa(diskNo)) + } + return strings.Join(indexes, ","), nil + + } else if regexp.MustCompile("^[[:digit:]]+-$").MatchString(legacyDisks) { + arr := strings.Split(legacyDisks, "-") + begin, _ := strconv.Atoi(arr[0]) + if begin > diskCount { + return "", raid.ErrInvalidDiskIdentity + } + var indexes []string + for diskNo := begin; diskNo <= diskCount; diskNo++ { + indexes = append(indexes, strconv.Itoa(diskNo)) + } + return strings.Join(indexes, ","), nil + + } else if legacyDisks == "all" { + var indexes []string + for diskNo := 0; diskNo <= diskCount; diskNo++ { + indexes = append(indexes, strconv.Itoa(diskNo)) + } + return strings.Join(indexes, ","), nil + } + return "", raid.ErrInvalidDiskIdentity +} + +func (worker *SettingWorker) doRAID(index int, sett *setting.HardwareSetting) (err error) { + var name string + name, err = raid.Whoami() + if err != nil { + _ = worker.postProgress(worker.calcProgress(index+1), "[RAID] 识别RAID卡失败", err.Error()) + return err + } + + w := raid.SelectWorker(name) + if w == nil { + _ = worker.postProgress(worker.calcProgress(index+1), "[RAID] 识别RAID卡失败", raid.ErrUnknownHardware.Error()) + return raid.ErrUnknownHardware + } + + ctrlIdx, _ := strconv.Atoi(sett.Metadata["controller_index"]) + + ctrlID, err := w.Convert2ControllerID(uint(ctrlIdx)) + if err != nil { + _ = worker.postProgress(worker.calcProgress(index+1), "[RAID] 获取控制器ID失败", err.Error()) + return err + } + + switch sett.Action { + case model.ActionRAIDClear: + // 清除RAID配置 + if sett.Metadata["clear"] == setting.ON { + if err = w.Clear(ctrlID); err != nil { + _ = worker.postProgress(worker.calcProgress(index+1), "[RAID] 清除配置失败", err.Error()) + return err + } + _ = worker.postProgress(worker.calcProgress(index+1), "[RAID] 清除配置", msgdone) + } + + case model.ActionRAIDCreate: + // 创建阵列 + sLevel := sett.Metadata["level"] + var level raid.Level + level, err = raid.SelectLevel(sLevel) + if err != nil { + e := fmt.Errorf("%s: %s", err.Error(), sLevel) + _ = worker.postProgress(worker.calcProgress(index+1), "[RAID] 无效的RAID级别", e.Error()) + return e + } + + legacyDisks := sett.Metadata["drives"] + drives, err := w.TranslateLegacyDisks(ctrlID, legacyDisks) + if err != nil { + _ = worker.postProgress(worker.calcProgress(index+1), "[RAID] 转换物理驱动器标识符失败", fmt.Sprintf("%s ==> ? : %s", legacyDisks, err.Error())) + return err + } + + if err = w.CreateArray(ctrlID, level, drives); err != nil { + _ = worker.postProgress(worker.calcProgress(index+1), "[RAID] 创建阵列失败", fmt.Sprintf("%s@%s: %s", sLevel, strings.Join(drives, ","), err.Error())) + return err + } + _ = worker.postProgress(worker.calcProgress(index+1), "[RAID] 创建阵列成功", fmt.Sprintf("%s@%s", sLevel, strings.Join(drives, ","))) + + case model.ActionRAIDSetJBOD: + // 设置直通模式 + legacyDisks := sett.Metadata["drives"] + drives, err := w.TranslateLegacyDisks(ctrlID, legacyDisks) + if err != nil { + _ = worker.postProgress(worker.calcProgress(index+1), "[RAID] 转换物理驱动器标识符失败", fmt.Sprintf("%s ==> ? : %s", legacyDisks, err.Error())) + return err + } + + if err = w.SetJBODs(ctrlID, drives); err != nil { + _ = worker.postProgress(worker.calcProgress(index+1), "[RAID] 配置直通盘失败", fmt.Sprintf("jbod@%s: %s", strings.Join(drives, ","), err.Error())) + return err + } + _ = worker.postProgress(worker.calcProgress(index+1), "[RAID] 配置直通盘成功", fmt.Sprintf("jbod@%s", strings.Join(drives, ","))) + + case model.ActionRAIDSetGlobalHotspare: + // 设置全局热备盘 + legacyDisks := sett.Metadata["drives"] + drives, err := w.TranslateLegacyDisks(ctrlID, legacyDisks) + if err != nil { + _ = worker.postProgress(worker.calcProgress(index+1), "[RAID] 转换物理驱动器标识符失败", fmt.Sprintf("%s ==> ? : %s", legacyDisks, err.Error())) + return err + } + + if err = w.SetGlobalHotspares(ctrlID, drives); err != nil { + _ = worker.postProgress(worker.calcProgress(index+1), "[RAID] 配置全局热备盘失败", fmt.Sprintf("global hotspare@%s: %s", strings.Join(drives, ","), err.Error())) + return err + } + _ = worker.postProgress(worker.calcProgress(index+1), "[RAID] 配置全局热备盘成功", fmt.Sprintf("global hotspare@%s", strings.Join(drives, ","))) + + case model.ActionRAIDInitDisk: + // 初始化逻辑磁盘 + if sett.Metadata["init"] == setting.ON { + err = w.InitLogicalDrives(ctrlID) + if err == raid.ErrInitLogicalDrivesNotSupport { + _ = worker.postProgress(worker.calcProgress(index+1), "[RAID] 跳过逻辑磁盘初始化", msgskip) + } else if err != nil { + _ = worker.postProgress(worker.calcProgress(index+1), "[RAID] 逻辑磁盘初始化失败", err.Error()) + return err + } + _ = worker.postProgress(worker.calcProgress(index+1), "[RAID] 逻辑磁盘初始化成功", msgdone) + } + } + return nil +} + +// ErrFetchScript 无法从服务端获取脚本文件错误 +var ErrFetchScript = errors.New("unable to get script file from server") + +// calcProgress 计算当前步骤下硬件配置进度值 +func (worker *SettingWorker) calcProgress(current int) float64 { + total := len(worker.hwSettings) + if total == 0 { + return 0.0 + } + return startProgress + float64(current)/float64(total*10) +} + +var ( + // ErrPullSettings 无法拉取到硬件配置参数 + ErrPullSettings = errors.New("unreachable hardware settings") +) + +// pull 拉取硬件配置参数 +func (worker *SettingWorker) pull() (err error) { + var respData struct { + Status string `json:"status"` + Message string `json:"message"` + Content struct { + Settings []*setting.HardwareSetting `json:"settings"` + } `json:"content"` + } + url := fmt.Sprintf("%s/api/cloudboot/v1/devices/%s/settings/hardwares?lang=en-US", strings.TrimSuffix(worker.conf.HTTPServer.BaseURL, "/"), worker.sn) + if err = httplib.Get(url).Header("Accept", "application/json").ToJSON(&respData); err != nil { + worker.log.Errorf("GET %s ==>\n%s", url, err) + return err + } + + body, _ := json.Marshal(respData) + worker.log.Debugf("GET %s ==>\n%s", url, body) + + if respData.Status != "success" { + return ErrPullSettings + } + worker.hwSettings = respData.Content.Settings + return nil +} + +const ( + failureProgress = -1.0 + startProgress = 0.3 + endProgress = 0.4 +) +const ( + msgdone = "完成" + msgskip = "跳过" +) + +func (worker *SettingWorker) postProgress(progress float64, title, message string) (err error) { + var reqData struct { + InstallProgress float64 `json:"progress"` + InstallLog string `json:"log"` + Title string `json:"title"` + } + reqData.InstallProgress = progress + reqData.Title = title + reqData.InstallLog = base64.StdEncoding.EncodeToString([]byte(message)) + + var respData struct { + Status string `json:"status"` + Message string `json:"message"` + } + + body, _ := json.Marshal(reqData) + url := fmt.Sprintf("%s/api/cloudboot/v1/devices/%s/installations/progress?lang=en-US", strings.TrimSuffix(worker.conf.HTTPServer.BaseURL, "/"), worker.sn) + worker.log.Debugf("POST %s ==>\n%s", url, body) + + req, err := httplib.Post(url).Header("Content-Type", "application/json").JSONBody(&reqData) + if err != nil { + worker.log.Errorf("%s", err) + return err + } + if err = req.ToJSON(&respData); err != nil { + worker.log.Errorf("%s", err) + return err + } + + if respData.Status != "success" { + //return errors.New(respData.Status) + panic("report progress fail, respData.Status: " + respData.Status) + } + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/server/hwserver/service/collection.go b/cyclone-server/src/idcos.io/cloudboot/server/hwserver/service/collection.go new file mode 100644 index 0000000000000000000000000000000000000000..fd899a72bf62e4492208998fa85dc191112b073d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/server/hwserver/service/collection.go @@ -0,0 +1,37 @@ +package service + +import ( + "idcos.io/cloudboot/hardware/collector" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/server/cloudbootserver/types/device" + "idcos.io/cloudboot/server/hwserver/config" +) + +// CollectDevice 采集设备信息并丢弃采集过程中的错误。 +func CollectDevice(conf *config.Configuration, log logger.Logger) (*device.Device, error) { + c := collector.SelectCollector(collector.DefaultCollector) + if c == nil { + log.Warnf("Unregistered collector: %s", collector.DefaultCollector) + return nil, collector.ErrUnregisteredCollector + } + c.SetLog(log) + + var dev device.Device + _, dev.SN, dev.Vendor, dev.Model, dev.Arch, _ = c.BASE() + dev.CPU, _ = c.CPU() + dev.Memory, _ = c.Memory() + dev.Disk, _ = c.Disk() + dev.DiskSlot, _ = c.DiskSlot() + dev.NIC, _ = c.NIC() + dev.Motherboard, _ = c.Motherboard() + dev.OOB, _ = c.OOB() + dev.BIOS, _ = c.BIOS() + dev.RAID, _ = c.RAID() + dev.Fan, _ = c.Fan() + dev.Power, _ = c.Power() + dev.PCI, _ = c.PCI() + dev.HBA, _ = c.HBA() + dev.LLDP, _ = c.LLDP() + dev.Setup() + return &dev, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/bytes/byte.go b/cyclone-server/src/idcos.io/cloudboot/utils/bytes/byte.go new file mode 100644 index 0000000000000000000000000000000000000000..8bbd576045367989db54240fca4d10627b8f0802 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/bytes/byte.go @@ -0,0 +1,22 @@ +package bytes + +// Byte 字节 +type Byte int64 + +// GE 大于等于 +func (b Byte) GE(size Byte) bool { + return b >= size +} + +var ( + // B 字节 + B Byte = 1 + // KB 千字节 + KB = Byte(1024) * B + // MB 兆字节 + MB = Byte(1024) * KB + // GB 吉字节 + GB = Byte(1024) * MB + // TB 太字节 + TB = Byte(1024) * GB +) diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/bytes/parse.go b/cyclone-server/src/idcos.io/cloudboot/utils/bytes/parse.go new file mode 100644 index 0000000000000000000000000000000000000000..51b182888ef475717ad480537bb602b068de61e1 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/bytes/parse.go @@ -0,0 +1,64 @@ +package bytes + +import ( + "errors" + "regexp" + "strconv" + "strings" +) + +// Byte2GB 返回字节转化成GB后的数值 +func Byte2GB(b Byte) (gb float64) { + return float64(b) / float64(GB) +} + +// Byte2GBRounding 返回字节转化成GB后的整数数值 +func Byte2GBRounding(b Byte) (gb int) { + return int(Byte2GB(b)) +} + +// Byte2MB 返回字节转化成MB后的数值 +func Byte2MB(b Byte) (mb float64) { + return float64(b) / float64(MB) +} + +// Byte2MBRounding 返回字节转化成MB后的整数数值 +func Byte2MBRounding(b Byte) (mb int) { + return int(Byte2MB(b)) +} + +var ( + // ErrMalformedSizeStringValue 容量值的字符串格式错误 + ErrMalformedSizeStringValue = errors.New("malformed size string value") + // ErrMalformedUnitStringValue 容量单位的字符串格式错误 + ErrMalformedUnitStringValue = errors.New("malformed unit string value") +) + +var ( + numReg = regexp.MustCompile("^\\d+$") +) + +// Parse2Byte 将字符串类型容量值和容量单位转化成字节 +func Parse2Byte(value, unit string) (size Byte, err error) { + if !numReg.MatchString(value) { + return size, ErrMalformedSizeStringValue + } + + unit = strings.ToUpper(unit) + val, _ := strconv.Atoi(value) + + switch unit { + case "B", "BYTE", "BYTES": + return B * Byte(val), nil + case "KB": + return KB * Byte(val), nil + case "MB": + return MB * Byte(val), nil + case "GB": + return GB * Byte(val), nil + case "TB": + return TB * Byte(val), nil + default: + return size, ErrMalformedUnitStringValue + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/bytes/parse_test.go b/cyclone-server/src/idcos.io/cloudboot/utils/bytes/parse_test.go new file mode 100644 index 0000000000000000000000000000000000000000..d1523571b9d0930dcee6b86add2c5d963c649caf --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/bytes/parse_test.go @@ -0,0 +1,75 @@ +package bytes + +import ( + "testing" + + . "github.com/smartystreets/goconvey/convey" +) + +func TestByte2GBRounding(t *testing.T) { + Convey("将字节转化为整数吉字节", t, func() { + So(Byte2GBRounding(GB), ShouldEqual, 1) + So(Byte2GBRounding(7*GB), ShouldEqual, 7) + So(Byte2GBRounding(1024*MB), ShouldEqual, 1) + So(Byte2GBRounding(1024*1024*KB), ShouldEqual, 1) + So(Byte2GBRounding(1024*1024*1024*B), ShouldEqual, 1) + So(Byte2GBRounding(1023*MB), ShouldEqual, 0) + So(Byte2GBRounding(1025*MB), ShouldEqual, 1) + So(Byte2GBRounding(2047*MB), ShouldEqual, 1) + So(Byte2GBRounding(2048*MB), ShouldEqual, 2) + }) +} + +func TestByte2GB(t *testing.T) { + Convey("将字节转化为吉字节", t, func() { + So(Byte2GB(GB), ShouldEqual, 1) + So(Byte2GB(7*GB), ShouldEqual, 7) + So(Byte2GB(1024*MB), ShouldEqual, 1) + So(Byte2GB(1024*1024*KB), ShouldEqual, 1) + So(Byte2GB(1024*1024*1024*B), ShouldEqual, 1) + + So(Byte2GB(1023*MB), ShouldEqual, float64(1023)/float64(1024)) + So(Byte2GB(1025*MB), ShouldEqual, float64(1025)/float64(1024)) + So(Byte2GB(2047*MB), ShouldEqual, float64(2047)/float64(1024)) + So(Byte2GB(2048*MB), ShouldEqual, float64(2048)/float64(1024)) + }) +} + +func TestParse2Byte(t *testing.T) { + Convey("容量值解析", t, func() { + So(TB, ShouldEqual, 1099511627776) + So(GB, ShouldEqual, 1073741824) + So(MB, ShouldEqual, 1048576) + So(KB, ShouldEqual, 1024) + So(B, ShouldEqual, 1) + + var size Byte + var err error + + size, err = Parse2Byte("7.5", "MB") + So(err, ShouldEqual, ErrMalformedSizeStringValue) + + size, err = Parse2Byte("7", "AB") + So(err, ShouldEqual, ErrMalformedUnitStringValue) + + size, err = Parse2Byte("7", "B") + So(err, ShouldBeNil) + So(size, ShouldEqual, Byte(7)*B) + + size, err = Parse2Byte("7", "kb") + So(err, ShouldBeNil) + So(size, ShouldEqual, Byte(7)*KB) + + size, err = Parse2Byte("7", "mb") + So(err, ShouldBeNil) + So(size, ShouldEqual, Byte(7)*MB) + + size, err = Parse2Byte("7", "GB") + So(err, ShouldBeNil) + So(size, ShouldEqual, Byte(7)*GB) + + size, err = Parse2Byte("7", "TB") + So(err, ShouldBeNil) + So(size, ShouldEqual, Byte(7)*TB) + }) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/centos6/centos6.go b/cyclone-server/src/idcos.io/cloudboot/utils/centos6/centos6.go new file mode 100644 index 0000000000000000000000000000000000000000..1abf665440d095c7ccdbe991c40e6b596c3f7ed3 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/centos6/centos6.go @@ -0,0 +1,56 @@ +package centos6 + +import ( + "io/ioutil" + "strings" + + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils/pxe" +) + +// IsPXEUEFI 判断设备是否是PXE方式安装centos6(uefi) +func IsPXEUEFI(log logger.Logger, repo model.Repo, sn string) bool { + sett, _ := repo.GetDeviceSettingBySN(sn) + if sett == nil || sett.InstallType != model.InstallationPXE { + return false + } + + osTemplate, _ := repo.GetSystemTemplateByID(sett.SystemTemplateID) + + return osTemplate != nil && + osTemplate.BootMode == model.BootModeUEFI && + strings.Contains(strings.ToLower(osTemplate.Name), "centos6") +} + +// DropConfigurations 移除和centos6安装相关的特殊配置 +func DropConfigurations(log logger.Logger, repo model.Repo, sn string) error { + log.Infof("============== Remove configurations for %s(CentOS 6 + PXE + UEFI) ==============", sn) + + // 移除dhcp配置文件中相关配置项并重启dhcpd + dhcpSRC, err := ioutil.ReadFile(dhcpFilename) + if err == nil && len(dhcpSRC) > 0 { + log.Info("After the OS installation is complete, try to modify the dhcp configuration file.") + if err = OverwriteDHCP(RmOneFromDHCP(sn, dhcpSRC)); err != nil { + log.Errorf("Restart dhcpd error: %s", err.Error()) + log.Warn("Try to rollback the dhcp configuration file") + _ = OverwriteDHCP(dhcpSRC) // 尝试回滚配置 + } + } + // 删除PXE文件 + if mac, _ := getBootOSMacBySN(log, repo, sn); mac != "" { + log.Info("Try to remove the PXE file") + if err = pxe.RemoveFile(mac); err != nil { + log.Error(err) + } + } + return err +} + +func getBootOSMacBySN(log logger.Logger, repo model.Repo, sn string) (mac string, err error) { + dev, err := repo.GetDeviceBySN(sn) + if err != nil { + return "", err + } + return dev.BootOSMac, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/centos6/dhcp.go b/cyclone-server/src/idcos.io/cloudboot/utils/centos6/dhcp.go new file mode 100644 index 0000000000000000000000000000000000000000..3438f3dfeda2ece00fa3479737d6bf1d7a68d73d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/centos6/dhcp.go @@ -0,0 +1,54 @@ +package centos6 + +import ( + "bytes" + "fmt" + "io/ioutil" + "strings" + + "idcos.io/cloudboot/utils/sh" +) + +// dhcpFilename DHCP配置文件路径 +const dhcpFilename = "/etc/dhcp/dhcpd.conf" + +const dhcpItemFormat = ` +### begin %s ### +host %s { + hardware ethernet %s; + filename "BOOTX64.efi"; +} +### end %s ###` + +// AddOneToDHCP 返回添加了配置项的dhcp配置 +func AddOneToDHCP(sn, mac string, src []byte) (dst []byte) { + buf := bytes.NewBuffer(src) + buf.WriteByte('\n') + buf.WriteString(strings.TrimSpace(fmt.Sprintf(dhcpItemFormat, sn, sn, mac, sn))) + return buf.Bytes() +} + +// RmOneFromDHCP 返回移除了目标配置项的dhcp配置 +func RmOneFromDHCP(sn string, src []byte) (dst []byte) { + txt, sBegin, sEnd := string(src), fmt.Sprintf("### begin %s ###", sn), fmt.Sprintf("### end %s ###", sn) + beginIdx, endIdx := strings.Index(txt, sBegin), strings.Index(txt, sEnd) + + if beginIdx < 0 || endIdx < 0 { + return src + } + return []byte(txt[:beginIdx] + txt[endIdx+len(sEnd):]) +} + +// OverwriteDHCP 覆写dhcp配置并重启dhcpd进程 +func OverwriteDHCP(dhcp []byte) (err error) { + if err = ioutil.WriteFile(dhcpFilename, dhcp, 0644); err != nil { + return err + } + _, err = RestartDHCP() + return err +} + +// RestartDHCP 使用systemctl重启dhcpd进程 +func RestartDHCP() (out []byte, err error) { + return sh.ExecOutput(nil, "systemctl restart dhcpd") +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/charset.go b/cyclone-server/src/idcos.io/cloudboot/utils/charset.go new file mode 100644 index 0000000000000000000000000000000000000000..23f4a713f293379c6a97a9aa01c05060b25a5a95 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/charset.go @@ -0,0 +1,13 @@ +package utils + +import "github.com/axgle/mahonia" + +// GBK2UTF8 将GBK字符串转换成UTF8字符串 +func GBK2UTF8(strGBK string) (strUTF8 string) { + return mahonia.NewDecoder("gbk").ConvertString(strGBK) +} + +// UTF82GBK 将UTF8字符串转换成GBK字符串 +func UTF82GBK(strUTF8 string) (strGBK string) { + return mahonia.NewEncoder("gbk").ConvertString(strUTF8) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/collection/set.go b/cyclone-server/src/idcos.io/cloudboot/utils/collection/set.go new file mode 100644 index 0000000000000000000000000000000000000000..ad61d8f74080769c2a83f917444a10ef9f4a05af --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/collection/set.go @@ -0,0 +1,56 @@ +package collection + +var setValue = struct{}{} + +// SSet 由不重复的字符串组成的集合。该集合非线程安全。 +type SSet struct { + items map[string]struct{} +} + +// NewSSet 返回指定容量的Set集合。 +func NewSSet(capacity int, elements ...string) *SSet { + var items map[string]struct{} + if capacity <= 0 { + capacity = len(elements) + } + items = make(map[string]struct{}, capacity) + for i := range elements { + items[elements[i]] = setValue + } + return &SSet{ + items: items, + } +} + +// Add 往Set集合中添加元素。 +func (set *SSet) Add(elements ...string) *SSet { + for i := range elements { + set.items[elements[i]] = setValue + } + return set +} + +// Elements 返回当前Set集合中的所有元素。 +func (set *SSet) Elements() []string { + all := make([]string, 0, len(set.items)) + for k := range set.items { + all = append(all, k) + } + return all +} + +// Contains 返回是否包含当前元素的布尔值 +func (set *SSet) Contains(element string) bool { + _, ok := set.items[element] + return ok +} + +// Length 返回当前的元素个数 +func (set *SSet) Length() int { + return len(set.items) +} + +// IsEmpty 返回当前集合是否为空 +func (set *SSet) IsEmpty() bool { + return len(set.items) <= 0 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/collection/slice.go b/cyclone-server/src/idcos.io/cloudboot/utils/collection/slice.go new file mode 100644 index 0000000000000000000000000000000000000000..3dac0b06a08857d9c4c98404b75cf13ee198f181 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/collection/slice.go @@ -0,0 +1,181 @@ +// Copyright 2014 beego Author. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT 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 collection + +import ( + "math/rand" + "time" +) + +type reducetype func(interface{}) interface{} +type filtertype func(interface{}) bool + +// InSlice checks given string in string slice or not. +func InSlice(v string, sl []string) bool { + for _, vv := range sl { + if vv == v { + return true + } + } + return false +} + +// InSliceIface checks given interface in interface slice. +func InSliceIface(v interface{}, sl []interface{}) bool { + for _, vv := range sl { + if vv == v { + return true + } + } + return false +} + +// SSliceContainsAny 切片a中是否包含切片b中的任一元素。 +// b切片中任一元素包含在a切片中,则返回true。反之,则返回false。 +func SSliceContainsAny(a, b []string) bool { + for i := range b { + if InSlice(b[i], a) { + return true + } + } + return false +} + +// SliceRandList generate an int slice from min to max. +func SliceRandList(min, max int) []int { + if max < min { + min, max = max, min + } + length := max - min + 1 + t0 := time.Now() + rand.Seed(int64(t0.Nanosecond())) + list := rand.Perm(length) + for index := range list { + list[index] += min + } + return list +} + +// SliceMerge merges interface slices to one slice. +func SliceMerge(slice1, slice2 []interface{}) (c []interface{}) { + c = append(slice1, slice2...) + return +} + +// SliceReduce generates a new slice after parsing every value by reduce function +func SliceReduce(slice []interface{}, a reducetype) (dslice []interface{}) { + for _, v := range slice { + dslice = append(dslice, a(v)) + } + return +} + +// SliceRand returns random one from slice. +func SliceRand(a []interface{}) (b interface{}) { + randnum := rand.Intn(len(a)) + b = a[randnum] + return +} + +// SliceSum sums all values in int64 slice. +func SliceSum(intslice []int64) (sum int64) { + for _, v := range intslice { + sum += v + } + return +} + +// SliceFilter generates a new slice after filter function. +func SliceFilter(slice []interface{}, a filtertype) (ftslice []interface{}) { + for _, v := range slice { + if a(v) { + ftslice = append(ftslice, v) + } + } + return +} + +// SliceDiff returns diff slice of slice1 - slice2. +func SliceDiff(slice1, slice2 []interface{}) (diffslice []interface{}) { + for _, v := range slice1 { + if !InSliceIface(v, slice2) { + diffslice = append(diffslice, v) + } + } + return +} + +// SliceIntersect returns slice that are present in all the slice1 and slice2. +func SliceIntersect(slice1, slice2 []interface{}) (diffslice []interface{}) { + for _, v := range slice1 { + if InSliceIface(v, slice2) { + diffslice = append(diffslice, v) + } + } + return +} + +// SliceChunk separates one slice to some sized slice. +func SliceChunk(slice []interface{}, size int) (chunkslice [][]interface{}) { + if size >= len(slice) { + chunkslice = append(chunkslice, slice) + return + } + end := size + for i := 0; i <= (len(slice) - size); i += size { + chunkslice = append(chunkslice, slice[i:end]) + end += size + } + return +} + +// SliceRange generates a new slice from begin to end with step duration of int64 number. +func SliceRange(start, end, step int64) (intslice []int64) { + for i := start; i <= end; i += step { + intslice = append(intslice, i) + } + return +} + +// SlicePad prepends size number of val into slice. +func SlicePad(slice []interface{}, size int, val interface{}) []interface{} { + if size <= len(slice) { + return slice + } + for i := 0; i < (size - len(slice)); i++ { + slice = append(slice, val) + } + return slice +} + +// SliceUnique cleans repeated values in slice. +func SliceUnique(slice []interface{}) (uniqueslice []interface{}) { + for _, v := range slice { + if !InSliceIface(v, uniqueslice) { + uniqueslice = append(uniqueslice, v) + } + } + return +} + +// SliceShuffle shuffles a slice. +func SliceShuffle(slice []interface{}) []interface{} { + for i := 0; i < len(slice); i++ { + a := rand.Intn(len(slice)) + b := rand.Intn(len(slice)) + slice[a], slice[b] = slice[b], slice[a] + } + return slice +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/crypto.go b/cyclone-server/src/idcos.io/cloudboot/utils/crypto.go new file mode 100644 index 0000000000000000000000000000000000000000..6754c20a9eed3e02edb4610359921f07c4f156ce --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/crypto.go @@ -0,0 +1,91 @@ +package utils + +import ( + "bytes" + "crypto/aes" + "crypto/cipher" + "crypto/rand" + "encoding/base64" + "errors" + "fmt" + "io" +) + +// AESEncrypt AES加密 +func AESEncrypt(encodeStr string, key []byte) (decodeStr string, err error) { + defer func() { + if r := recover(); r != nil { + err = errors.New("加解密Key不正确/匹配") + } + }() + encodeBytes := []byte(encodeStr) + //根据key 生成密文 + block, err := aes.NewCipher(key) + if err != nil { + return "", err + } + + blockSize := block.BlockSize() + encodeBytes = PKCS5Padding(encodeBytes, blockSize) + + // 对IV有随机性要求,但没有保密性要求,所以常见的做法是将IV包含在加密文本当中 + ciphertext := make([]byte, blockSize+len(encodeBytes)) + //随机一个block大小作为IV + //采用不同的IV时相同的秘钥将会产生不同的密文,可以理解为一次加密的session + iv := ciphertext[:blockSize] + if _, err := io.ReadFull(rand.Reader, iv); err != nil { + panic(err) + } + blockMode := cipher.NewCBCEncrypter(block, []byte(iv)) + //crypted := make([]byte, len(encodeBytes)) + blockMode.CryptBlocks(ciphertext[blockSize:], encodeBytes) + + return base64.StdEncoding.EncodeToString(ciphertext), nil +} + +func PKCS5Padding(ciphertext []byte, blockSize int) []byte { + padding := blockSize - len(ciphertext)%blockSize + //填充 + padtext := bytes.Repeat([]byte{byte(padding)}, padding) + + return append(ciphertext, padtext...) +} + +// AESDecrypt AES解密 +func AESDecrypt(decodeStr string, key []byte) (origin []byte, err error) { + defer func() { + if r := recover(); r != nil { + err = errors.New("加解密Key不正确/匹配") + } + }() + //先解密base64 + decodeBytes, err := base64.StdEncoding.DecodeString(decodeStr) + if len(decodeBytes) == 0 { + return nil, errors.New(fmt.Sprintf("base64解码失败;%s", decodeStr)) + } + + if err != nil { + return nil, err + } + block, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + blockSize := block.BlockSize() + if len(decodeBytes) < blockSize { + return nil, errors.New(fmt.Sprintf("base64解码失败;%s", decodeStr)) + } + iv := decodeBytes[:blockSize] + blockMode := cipher.NewCBCDecrypter(block, []byte(iv)) + origData := make([]byte, len(decodeBytes)-blockSize) + + blockMode.CryptBlocks(origData, decodeBytes[blockSize:]) + origData = PKCS5UnPadding(origData) + return origData, nil +} + +func PKCS5UnPadding(origData []byte) []byte { + length := len(origData) + unPadding := int(origData[length-1]) + return origData[:(length - unPadding)] +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/filepath/path.go b/cyclone-server/src/idcos.io/cloudboot/utils/filepath/path.go new file mode 100644 index 0000000000000000000000000000000000000000..3a9406ded4bc64cc2db37e16eab9a2c9e082f547 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/filepath/path.go @@ -0,0 +1,25 @@ +package filepath + +import ( + "os/user" + "strings" +) + +const ( + // HomeDirFlag 当前用户家目录标识符 + HomeDirFlag = "~" +) + +// Rel2Abs 将~转化为用户家目录 +func Rel2Abs(raw string) (string, error) { + raw = strings.TrimSpace(raw) + + if !strings.HasPrefix(raw, HomeDirFlag) { + return raw, nil + } + user, err := user.Current() + if err != nil { + return raw, err + } + return strings.Replace(raw, HomeDirFlag, user.HomeDir, 1), nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/http/body.go b/cyclone-server/src/idcos.io/cloudboot/utils/http/body.go new file mode 100644 index 0000000000000000000000000000000000000000..4097f3595c160dc213901f9f4b6b95501ad0c1d7 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/http/body.go @@ -0,0 +1,100 @@ +package http + +import ( + "encoding/json" + "net/http" + "reflect" + "strings" +) + +const ( + // Success 成功状态 + Success = "success" + // Failure 非成功状态 + Failure = "failure" +) + +// RespBody 响应结构体 +type RespBody struct { + Status string `json:"status"` + Message string `json:"message"` + Content map[string]interface{} `json:"content,omitempty"` +} + +// ErrRespBody 返回包含失败信息的响应体指针 +func ErrRespBody(msg string) *RespBody { + return &RespBody{ + Status: Failure, + Message: msg, + } +} + +// SucceedRespBody 返回包含成功信息的响应体指针 +func SucceedRespBody(msg string) *RespBody { + return &RespBody{ + Status: Success, + Message: msg, + } +} + +// NewRespBody 返回响应体指针 +func NewRespBody(status, msg string, content map[string]interface{}) *RespBody { + return &RespBody{ + Status: status, + Message: msg, + Content: content, + } +} + +// DecodeJSON 将Request Body中的JSON内容反序列化到reqData对象中。 +// reqData应为结构体的指针。 +func DecodeJSON(r *http.Request, reqData interface{}) error { + if !strings.Contains(r.Header.Get("Content-Type"), "application/json") { + return nil + } + defer r.Body.Close() + return json.NewDecoder(r.Body).Decode(reqData) +} + +const jsonOmit = "-" + +// DumpContent 返回由content中的属性和值组成的map。content只能是struct或者struct指针,否则将返回nil。 +func DumpContent(content interface{}) map[string]interface{} { + if content == nil { + return nil + } + + contentType := reflect.TypeOf(content) + contentVal := reflect.ValueOf(content) + + switch contentType.Kind() { + case reflect.Ptr: + val := reflect.Indirect(contentVal) //取出指针所指向的实例的value + tp := val.Type() // 通过value来获取真实的实例的Type + if tp.Kind() != reflect.Struct { + return nil + } + contentType = tp + contentVal = val + case reflect.Struct: + // nothing to do + default: + return nil + } + + mp := make(map[string]interface{}, contentType.NumField()) + for i, nf := 0, contentType.NumField(); i < nf; i++ { + fName := contentType.Field(i).Name + fVal := contentVal.FieldByName(fName) + alias := contentType.Field(i).Tag.Get("json") + if alias == jsonOmit { + continue + } + if len(alias) > 0 { + mp[alias] = fVal.Interface() + } else { + mp[fName] = fVal.Interface() + } + } + return mp +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/http/origin.go b/cyclone-server/src/idcos.io/cloudboot/utils/http/origin.go new file mode 100644 index 0000000000000000000000000000000000000000..e7b9c29fbe33cb6ceab4bfe093f09158557103ee --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/http/origin.go @@ -0,0 +1,35 @@ +package http + +import ( + "net/http" + "strings" +) + +const ( + // XForwardedOrigin 自定义http header,用于记录经过的各级代理信息 + XForwardedOrigin = "X-Forwarded-Origin" + // XForwardedFor 自定义http header,用于记录经过的各级代理IP + XForwardedFor = "X-Forwarded-For" +) + +// ExtractOriginNodeWithDefault 从http request中提取源代理节点(第一级代理节点)信息,若值为空,则返回默认值。 +func ExtractOriginNodeWithDefault(r *http.Request, def string) string { + if v := ExtractOriginNode(r); v != "" { + return v + } + return def +} + +// ExtractOriginNode 从http request中提取源代理节点(第一级代理节点)信息 +func ExtractOriginNode(r *http.Request) string { + return strings.Split(r.Header.Get(XForwardedOrigin), ",")[0] +} + +// ExtractOriginNodeIP 从http request中提取源代理节点(第一级代理节点)IP地址 +func ExtractOriginNodeIP(r *http.Request) string { + v := r.Header.Get(XForwardedFor) + if idx := strings.Index(v, ","); idx > 0 { + return strings.TrimSpace(v[:idx]) + } + return v +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/http/render/render.go b/cyclone-server/src/idcos.io/cloudboot/utils/http/render/render.go new file mode 100644 index 0000000000000000000000000000000000000000..59d20f5706e70e7a5507dfe9ed59807b81a54965 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/http/render/render.go @@ -0,0 +1,52 @@ +package render + +import ( + "encoding/csv" + "encoding/json" + "fmt" + "net/http" + + xlsx "idcos.io/cloudboot/utils" + myhttp "idcos.io/cloudboot/utils/http" +) + +// JSON 以JSON格式渲染HTTP Response Body +func JSON(w http.ResponseWriter, code int, body *myhttp.RespBody) error { + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(code) + return json.NewEncoder(w).Encode(body) +} + +// Text 纯文本格式渲染HTTP Response Body +func Text(w http.ResponseWriter, code int, body []byte) (int, error) { + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + w.WriteHeader(code) + return w.Write(body) +} + +// HTML 以text-html格式请求头返回HTTP Response Body +func HTML(w http.ResponseWriter, code int, body []byte) (int, error) { + w.Header().Set("Content-Type", "application/text-html; charset=utf-8") + w.WriteHeader(code) + return w.Write(body) +} + +// CSV 以CSV格式渲染HTTP Response Body +func CSV(w http.ResponseWriter, filename string, records [][]string) error { + w.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename='%s';filename*=utf-8''%s", filename, filename)) + w.Header().Add("Content-Type", "application/octet-stream") + return csv.NewWriter(w).WriteAll(records) +} + +//XLSX 以xlsx格式渲染HTTP Response Body +func XLSX(w http.ResponseWriter, filename string, records [][]string) error { + w.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%s;" /*filename*=utf-8''%s*/, filename+"_export.xlsx" /*, filename*/)) + w.Header().Add("Content-Type", "application/octet-stream") + + file, err := xlsx.WriteToXLSX(filename, records) + if err != nil { + return err + } + err = file.Write(w) + return err +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/network/network.go b/cyclone-server/src/idcos.io/cloudboot/utils/network/network.go new file mode 100644 index 0000000000000000000000000000000000000000..5322a0c5740cb3453046f0d81c2fb849ef30b7b4 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/network/network.go @@ -0,0 +1,244 @@ +package network + +import ( + "errors" + "fmt" + "net" + "strconv" + "strings" +) + +var ( + //errScope IP列表传递参数有问题 + errScope = errors.New("IP池区间不正确,必须以逗号分隔") + errCIDRNotContains = errors.New("IPv6不属于该CIDR") +) + +//GetIPListByMinAndMaxIP 获取IP列表 +func GetIPListByMinAndMaxIP(scope string) ([]string, error) { + minAndMax := strings.Split(scope, ",") + if len(minAndMax) < 2 { + return nil, errScope + } + var result []string + list1 := strings.Split(minAndMax[0], ".") + list2 := strings.Split(minAndMax[1], ".") + min3, err := strconv.Atoi(list1[2]) + if err != nil { + return result, err + } + + min4, err := strconv.Atoi(list1[3]) + if err != nil { + return result, err + } + if min4 == 0 { + min4 = 1 + } + + max3, err := strconv.Atoi(list2[2]) + if err != nil { + return result, err + } + + max4, err := strconv.Atoi(list2[3]) + if err != nil { + return result, err + } + + // 如果第3级一样, 第四级决定IP列表 + if min3 == max3 { + for j := min4; j <= max4; j++ { + ip := list1[0] + "." + list1[1] + "." + fmt.Sprintf("%d", min3) + "." + fmt.Sprintf("%d", j) + result = append(result, ip) + } + return result, nil + } + + // 如果第3级区间至少为1 + for i := min3; i <= max3; i++ { + // 最后一个区间 + if max3-i == 0 { + for j := 1; j <= max4; j++ { + ip := list1[0] + "." + list1[1] + "." + fmt.Sprintf("%d", i) + "." + fmt.Sprintf("%d", j) + result = append(result, ip) + } + } else if min3-i == 0 { + for j := min4; j <= 255; j++ { + ip := list1[0] + "." + list1[1] + "." + fmt.Sprintf("%d", i) + "." + fmt.Sprintf("%d", j) + result = append(result, ip) + } + } else { + for j := 1; j <= 255; j++ { + ip := list1[0] + "." + list1[1] + "." + fmt.Sprintf("%d", i) + "." + fmt.Sprintf("%d", j) + result = append(result, ip) + } + } + } + return result, nil +} + +// GetCidrIPFirstAndLast 获取CIDR的最大最小IP +func GetCidrIPFirstAndLast(cidr string) (string, string) { + ip := strings.Split(cidr, "/")[0] + ipSegs := strings.Split(ip, ".") + maskLen, _ := strconv.Atoi(strings.Split(cidr, "/")[1]) + seg3MinIP, seg3MaxIP := GetIPSeg3Range(ipSegs, maskLen) + seg4MinIP, seg4MaxIP := GetIPSeg4Range(ipSegs, maskLen) + ipPrefix := ipSegs[0] + "." + ipSegs[1] + "." + seg4MinIP = seg4MinIP - 1 + seg4MaxIP = seg4MaxIP + 1 + return ipPrefix + strconv.Itoa(seg3MinIP) + "." + strconv.Itoa(seg4MinIP), + ipPrefix + strconv.Itoa(seg3MaxIP) + "." + strconv.Itoa(seg4MaxIP) +} + +// GetCidrIPRange 获取CIDR的最大最小IP +func GetCidrIPRange(cidr string) (string, string) { + ip := strings.Split(cidr, "/")[0] + ipSegs := strings.Split(ip, ".") + maskLen, _ := strconv.Atoi(strings.Split(cidr, "/")[1]) + seg3MinIP, seg3MaxIP := GetIPSeg3Range(ipSegs, maskLen) + seg4MinIP, seg4MaxIP := GetIPSeg4Range(ipSegs, maskLen) + ipPrefix := ipSegs[0] + "." + ipSegs[1] + "." + + return ipPrefix + strconv.Itoa(seg3MinIP) + "." + strconv.Itoa(seg4MinIP), + ipPrefix + strconv.Itoa(seg3MaxIP) + "." + strconv.Itoa(seg4MaxIP) +} + +// GetCidrFirst2IPList 获取CIDR的前2个IP List +func GetCidrFirst2IPList(cidr string) (result []string) { + ip := strings.Split(cidr, "/")[0] + ipSegs := strings.Split(ip, ".") + maskLen, _ := strconv.Atoi(strings.Split(cidr, "/")[1]) + seg3MinIP, _ := GetIPSeg3Range(ipSegs, maskLen) + seg4MinIP, _ := GetIPSeg4Range(ipSegs, maskLen) + ipPrefix := ipSegs[0] + "." + ipSegs[1] + "." + result = append(result, (ipPrefix + strconv.Itoa(seg3MinIP) + "." + strconv.Itoa(seg4MinIP))) + result = append(result, (ipPrefix + strconv.Itoa(seg3MinIP) + "." + strconv.Itoa(seg4MinIP+1))) + return +} + +// GetCidrLast10IPRange 获取CIDR的最后10个IP range +func GetCidrLast10IPRange(cidr string) (string) { + ip := strings.Split(cidr, "/")[0] + ipSegs := strings.Split(ip, ".") + maskLen, _ := strconv.Atoi(strings.Split(cidr, "/")[1]) + _, seg3MaxIP := GetIPSeg3Range(ipSegs, maskLen) + seg4MinIP, seg4MaxIP := GetIPSeg4Range(ipSegs, maskLen) + ipPrefix := ipSegs[0] + "." + ipSegs[1] + "." + if (seg4MaxIP - seg4MinIP) < 10 { + return "" + } + + return ipPrefix + strconv.Itoa(seg3MaxIP) + "." + strconv.Itoa(seg4MaxIP-10) + "," + + ipPrefix + strconv.Itoa(seg3MaxIP) + "." + strconv.Itoa(seg4MaxIP) +} + +//GetCidrIPRouteAndSubNet 获取CIDR的路由IP +func GetCidrIPRouteAndSubNet(cidr string) (string, string, string, error) { + ip, subnet, err := net.ParseCIDR(cidr) + if err != nil { + return "", "", "", err + } + ipSegs := strings.Split(ip.String(), ".") + maskLen, _ := strconv.Atoi(strings.Split(cidr, "/")[1]) + seg3MinIP, _ := GetIPSeg3Range(ipSegs, maskLen) + seg4MinIP, _ := GetIPSeg4Range(ipSegs, maskLen) + ipPrefix := ipSegs[0] + "." + ipSegs[1] + "." + + return net.IP(subnet.Mask).String(), ipPrefix + strconv.Itoa(seg3MinIP) + "." + strconv.Itoa(seg4MinIP), subnet.IP.String(), nil +} + +//GetCidrHostNum 计算得到CIDR地址范围内可拥有的主机数量 +func GetCidrHostNum(maskLen int) uint { + cidrIPNum := uint(0) + var i = uint(32 - maskLen - 1) + for ; i >= 1; i-- { + cidrIPNum += 1 << i + } + return cidrIPNum +} + +//GetCidrIPMask 获取Cidr的掩码 +func GetCidrIPMask(maskLen int) string { + // ^uint32(0)二进制为32个比特1,通过向左位移,得到CIDR掩码的二进制 + cidrMask := ^uint32(0) << uint(32-maskLen) + //fmt.Println(fmt.Sprintf("%b \n", cidrMask)) + //计算CIDR掩码的四个片段,将想要得到的片段移动到内存最低8位后,将其强转为8位整型,从而得到 + cidrMaskSeg1 := uint8(cidrMask >> 24) + cidrMaskSeg2 := uint8(cidrMask >> 16) + cidrMaskSeg3 := uint8(cidrMask >> 8) + cidrMaskSeg4 := uint8(cidrMask & uint32(255)) + + return fmt.Sprint(cidrMaskSeg1) + "." + fmt.Sprint(cidrMaskSeg2) + "." + fmt.Sprint(cidrMaskSeg3) + "." + fmt.Sprint(cidrMaskSeg4) +} + +//GetIPSeg3Range 得到第三段IP的区间(第一片段.第二片段.第三片段.第四片段) +func GetIPSeg3Range(ipSegs []string, maskLen int) (int, int) { + if maskLen > 24 { + segIP, _ := strconv.Atoi(ipSegs[2]) + return segIP, segIP + } + ipSeg, _ := strconv.Atoi(ipSegs[2]) + return GetIPSegRange(uint8(ipSeg), uint8(24-maskLen)) +} + +//GetIPSeg4Range 得到第四段IP的区间(第一片段.第二片段.第三片段.第四片段) +func GetIPSeg4Range(ipSegs []string, maskLen int) (int, int) { + ipSeg, _ := strconv.Atoi(ipSegs[3]) + segMinIP, segMaxIP := GetIPSegRange(uint8(ipSeg), uint8(32-maskLen)) + return segMinIP + 1, segMaxIP - 1 +} + +//GetIPSegRange 根据用户输入的基础IP地址和CIDR掩码计算一个IP片段的区间 +func GetIPSegRange(userSegIP, offset uint8) (int, int) { + var ipSegMax uint8 = 255 + netSegIP := ipSegMax << offset + segMinIP := netSegIP & userSegIP + segMaxIP := userSegIP&(255<<offset) | ^(255 << offset) + return int(segMinIP), int(segMaxIP) +} + +//CIDRContainsIP 查看IP是否包含在CIDR内 +func CIDRContainsIP(cidr, source string) bool { + _, subnet, _ := net.ParseCIDR(cidr) + ip := net.ParseIP(source) + return subnet.Contains(ip) +} + +// 根据起始ipv6地址以及对应的CIDR,计算返回下一个地址 +func GetNextIPv6OfCIDR(ipv6Begin, cidr string) (string, error) { + _, ipnetwork, _ := net.ParseCIDR(cidr) + ip := net.ParseIP(ipv6Begin) + // ip[j] type uint8 + for j := len(ip)-1; j>=0; j-- { + ip[j]++ + if ip[j] > 0 { + break + } + } + if ipnetwork.Contains(ip) { + return ip.String(), nil + } else { + return "",errCIDRNotContains + } +} + +// 根据CIDR,计算返回第一个地址(使用于新网段场景,默认返回网段第4个地址) +func GetFirstIPv6OfCIDR(cidr string) (string, error) { + ip, ipnetwork, _ := net.ParseCIDR(cidr) + // 循环4次得到第一个可用地址 + for i := 0; i < 4; i++ { + for j := len(ip)-1; j>=0; j-- { + ip[j]++ + if ip[j] > 0 { + break + } + } + } + if ipnetwork.Contains(ip) { + return ip.String(), nil + } else { + return "",errCIDRNotContains + } +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/oob/dig_ip.go b/cyclone-server/src/idcos.io/cloudboot/utils/oob/dig_ip.go new file mode 100644 index 0000000000000000000000000000000000000000..6ca1cf1001286c0c57104ee4889ed036922c9a85 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/oob/dig_ip.go @@ -0,0 +1,64 @@ +package oob + +import ( + "fmt" + "regexp" + "strings" + + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/middleware" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils/sh" +) + +//DigDomain 获取IP的dig命令 dig +short dns @dns_server_ip +var DigDomain = "dig +short %s" + +func DigCmd(sn, hostname string, log logger.Logger, repo model.Repo) []string { + digCmd := make([]string, 0) + if device, err := repo.GetDeviceBySN(sn); err == nil && device.ServerRoomID != 0 { + if len(middleware.MapDistributeNode.MDistribute[device.ServerRoomID]) != 0 { + for _, nodeIP := range middleware.MapDistributeNode.MDistribute[device.ServerRoomID] { + digCmd = append(digCmd, fmt.Sprintf(DigDomain, hostname)+" @"+nodeIP) + } + return digCmd + } else { + log.Errorf("机房ID:%d没有关联到NodeIP", device.ServerRoomID) + } + } + digCmd = append(digCmd, fmt.Sprintf(DigDomain, hostname)+" @localhost") + return digCmd +} + +//将带外注册域名转成IP +func TransferHostname2IP(log logger.Logger, repo model.Repo, sn string, hostnames []string) string { + // 查看ip + // 用生成的不同的hostname重试 + digCmd := "" + for _, hostname := range hostnames { + cmds := DigCmd(sn, hostname, log, repo) + for _, digCmd = range cmds { + output, err := sh.ExecOutputWithLog(log, digCmd) + if err != nil { + log.Warnf("oob ip query cmd:%s fail", digCmd) + continue + } + ipr, _ := regexp.Compile(`^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$`) + ipOutput := strings.TrimSpace(string(output)) + if ipr.MatchString(ipOutput) { + // 更新OOBIP到数据库 + if device, err := repo.GetDeviceBySN(sn); err == nil { + if ipOutput != device.OOBIP { + _, _ = repo.UpdateDeviceBySN(&model.Device{ + SN: sn, + OOBIP: ipOutput, + }) + } + } + return ipOutput + } + } + } + log.Errorf("oob ip query cmd: %s fail after 2 attempts", digCmd) + return "" +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/oob/ipmimonitoring.go b/cyclone-server/src/idcos.io/cloudboot/utils/oob/ipmimonitoring.go new file mode 100644 index 0000000000000000000000000000000000000000..c52b3bc90066ad35b5ad01314ddc63dadd5a4ed1 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/oob/ipmimonitoring.go @@ -0,0 +1,104 @@ +package oob + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "os/exec" + "strings" + + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils/ping" + "idcos.io/cloudboot/utils/sh" +) + +var ( + // ErrMissingOOBInfo OOB信息缺失 + ErrMissingOOBInfo = errors.New("missing oob information") + // ErrOOBIPUnreachable 带外IP不可达 + ErrOOBIPUnreachable = errors.New("oob ip is unreachable") + // ErrMissingIPMImonitoring 缺失ipmimonitoring采集工具 + ErrMissingIPMImonitoring = errors.New("missing 'ipmimonitoring' tool") + // ErrUsernamePassword 带外用户名、密码不匹配 + ErrUsernamePassword = errors.New("username and password do not match") +) + +// IPMImonitoring IPMI监控工具 +type IPMImonitoring struct { + log logger.Logger + ip string + username string + password string +} + +// NewIPMImonitoring 实例化IPMI监控工具 +func NewIPMImonitoring(log logger.Logger, ip, username, password string) (*IPMImonitoring, error) { + if ip == "" || username == "" || password == "" { + return nil, ErrMissingOOBInfo + } + return &IPMImonitoring{ + log: log, + ip: ip, + username: username, + password: password, + }, nil +} + +// lookPath 在PATH环境变量下查找ipmimonitoring +func (im *IPMImonitoring) lookPath() (err error) { + if _, err = exec.LookPath("ipmimonitoring"); err != nil { + im.log.Warn("Tool 'ipmimonitoring' not installed correctly") + return ErrMissingIPMImonitoring + } + return nil +} + +// ping 检测网络是否可达 +func (im *IPMImonitoring) ping() (err error) { + if !ping.Ping(im.ip, 5) { + im.log.Warnf("The OOB IP(%s) is unreachable.", im.ip) + return ErrOOBIPUnreachable + } + return nil +} + +// CollectSensorData 返回传感器数据 +func (im *IPMImonitoring) CollectSensorData() (items []*model.SensorData, err error) { + if err = im.lookPath(); err != nil { + return nil, err + } + // -W authcap 各厂商实现IPMI协议存在不同,部分型号需要指定 workaround + cmd := fmt.Sprintf("ipmimonitoring --interpret-oem-data --ignore-not-available-sensors --ignore-unrecognized-events --output-sensor-state --entity-sensor-names --comma-separated-output --no-header-output -D LAN_2_0 -W authcap -h %s -u %s -p %s", + im.ip, + im.username, + im.password, + ) + out, err := sh.ExecOutputWithLog(im.log, cmd) + if err != nil { + if pingerr := im.ping(); pingerr != nil { + return nil, ErrOOBIPUnreachable + } + return nil, ErrUsernamePassword + } + + scanner := bufio.NewScanner(bytes.NewReader(out)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + fields := strings.Split(line, ",") + if len(fields) != 7 { + continue + } + items = append(items, &model.SensorData{ + ID: fields[0], + Name: fields[1], + Type: fields[2], + State: fields[3], + Reading: fields[4], + Units: fields[5], + Event: strings.Replace(fields[6], "'", "", -1), + }) + } + return items, scanner.Err() +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/oob/ipmisel.go b/cyclone-server/src/idcos.io/cloudboot/utils/oob/ipmisel.go new file mode 100644 index 0000000000000000000000000000000000000000..7928afb6dcbd6268b3e2c0296fea3ce68c7551d3 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/oob/ipmisel.go @@ -0,0 +1,104 @@ +package oob + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "os/exec" + "strings" + + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/model" + "idcos.io/cloudboot/utils/ping" + "idcos.io/cloudboot/utils/sh" +) + +var ( + // ErrMissingOOBInfo OOB信息缺失 + //ErrMissingOOBInfo = errors.New("missing oob information") + // ErrOOBIPUnreachable 带外IP不可达 + //ErrOOBIPUnreachable = errors.New("oob ip is unreachable") + // ErrMissingIPMIsel 缺失IPMIsel采集工具 + ErrMissingIPMIsel = errors.New("missing 'ipmi-sel' tool") + // ErrUsernamePassword 带外用户名、密码不匹配 + //ErrUsernamePassword = errors.New("username and password do not match") +) + +// IPMIsel IPMI监控工具 +type IPMIsel struct { + log logger.Logger + ip string + username string + password string +} + +// NewIPMIsel 实例化IPMI监控工具 +func NewIPMIsel(log logger.Logger, ip, username, password string) (*IPMIsel, error) { + if ip == "" || username == "" || password == "" { + return nil, ErrMissingOOBInfo + } + return &IPMIsel{ + log: log, + ip: ip, + username: username, + password: password, + }, nil +} + +// lookPath 在PATH环境变量下查找IPMIsel +func (im *IPMIsel) lookPath() (err error) { + if _, err = exec.LookPath("ipmi-sel"); err != nil { + im.log.Warn("Tool 'ipmi-sel' not installed correctly") + return ErrMissingIPMIsel + } + return nil +} + +// ping 检测网络是否可达 +func (im *IPMIsel) ping() (err error) { + if !ping.Ping(im.ip, 5) { + im.log.Warnf("The OOB IP(%s) is unreachable.", im.ip) + return ErrOOBIPUnreachable + } + return nil +} + +// CollectSelData 返回系统事件日志 +func (im *IPMIsel) CollectSelData() (items []*model.SelData, err error) { + if err = im.lookPath(); err != nil { + return nil, err + } + // -W authcap 各厂商实现IPMI协议存在不同,部分型号需要指定 workaround + cmd := fmt.Sprintf("ipmi-sel --tail=50 --output-event-state --non-abbreviated-units --interpret-oem-data --system-event-only --comma-separated-output --no-header-output -D LAN_2_0 -W authcap -h %s -u %s -p %s", + im.ip, + im.username, + im.password, + ) + out, err := sh.ExecOutputWithLog(im.log, cmd) + if err != nil { + if pingerr := im.ping(); pingerr != nil { + return nil, ErrOOBIPUnreachable + } + return nil, ErrUsernamePassword + } + + scanner := bufio.NewScanner(bytes.NewReader(out)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + fields := strings.Split(line, ",") + if len(fields) != 7 { + continue + } + items = append(items, &model.SelData{ + ID: fields[0], + Date: fields[1], + Time: fields[2], + Name: fields[3], + Type: fields[4], + State: fields[5], + Event: fields[6], + }) + } + return items, scanner.Err() +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/os/file.go b/cyclone-server/src/idcos.io/cloudboot/utils/os/file.go new file mode 100644 index 0000000000000000000000000000000000000000..6845d0d0d15e299c39b92cca2fbcec7851975f6e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/os/file.go @@ -0,0 +1,12 @@ +package os + +import "os" + +// FileExist 判断指定路径的文件是否存在 +func FileExist(filename string) bool { + info, err := os.Stat(filename) + if err != nil { + return os.IsExist(err) + } + return !info.IsDir() +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/page.go b/cyclone-server/src/idcos.io/cloudboot/utils/page.go new file mode 100644 index 0000000000000000000000000000000000000000..2114931632e15a6632c548422ce97a103bc392be --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/page.go @@ -0,0 +1,86 @@ +package utils + +import ( + "fmt" + "reflect" +) + +// Page 业务逻辑层分页对象 +type Page struct { + Offset int64 `json:"offset"` + Limit int64 `json:"limit"` + TotalRecords int64 `json:"recordCount"` + Records []interface{} `json:"list"` +} + +// Pager 业务逻辑层分页接口 +type Pager interface { + // AddRecords 向当前分页中增加行记录 + AddRecords(records ...interface{}) error + // BuildPage 构建业务逻辑层分页对象 + BuildPage() *Page +} + +// pagerImpl 业务逻辑层默认分页接口实现 +type pagerImpl struct { + offset int64 + limit int64 + totalRecords int64 + records []interface{} + elemType reflect.Type +} + +// NewPager 新建业务逻辑层分页对象。 +// elemType 分页中每条记录所代表的对象的反射类型 +func NewPager(elemType reflect.Type, offset, limit, totalRecords int64) Pager { + if offset <= 0 { + offset = 0 + } + if limit <= 0 { + limit = 10 + } + + return &pagerImpl{ + offset: offset, + limit: limit, + totalRecords: totalRecords, + records: make([]interface{}, 0, limit), + elemType: elemType, + } +} + +// isAcceptableElem 判断对象反射类型是否与分页记录对象反射类型一致。 +func (p *pagerImpl) isAcceptableElem(k interface{}) bool { + return reflect.TypeOf(k) == p.elemType +} + +// AddRows 添加多条记录 +func (p *pagerImpl) AddRecords(records ...interface{}) error { + for _, record := range records { + if !p.isAcceptableElem(record) { + return fmt.Errorf("invalid element: %#v", record) + } + } + p.records = append(p.records, records...) + return nil +} + +// BuildPage 构建业务逻辑层分页对象 +func (p *pagerImpl) BuildPage() (page *Page) { + return &Page{ + Offset: p.offset, + Limit: p.limit, + TotalRecords: p.totalRecords, + Records: p.records, + } +} + +// EmptyPage 空分页对象 +func EmptyPage(offset, limit int64) *Page { + return &Page{ + Offset: offset, + Limit: limit, + TotalRecords: 0, + Records: make([]interface{}, 0), + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/parse_xlsx.go b/cyclone-server/src/idcos.io/cloudboot/utils/parse_xlsx.go new file mode 100644 index 0000000000000000000000000000000000000000..40e39f54cf9406bf9e1212f246596061d4e88a3e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/parse_xlsx.go @@ -0,0 +1,207 @@ +package utils + +import ( + "strconv" + + "github.com/tealeg/xlsx" +) + +//ParseDataFromXLSX 从XLSX格式的配置文件中解析数据 +//选择有两种1. ToSlice 解析数据到一个[][][]string中, +//2. ToSliceUnmerged 解析数据到一个[][][]string中,与ToSlice不同的是: +// Example: table where A1:A2 merged. +// | 01.01.2011 | Bread | 20 | +// | | Fish | 70 | +// This sheet will be converted to the slice: +// [[01.01.2011 Bread 20] +// [01.01.2011 Fish 70] ] +// 为什么是一个三维数组,主要是因为xlsx有sheet,第一维表示一张表 +// 现在的要求是一个文件只能有一张表。 +func ParseDataFromXLSX(filePath string) ([][]string, error) { + f, err := xlsx.OpenFile(filePath) + if err != nil { + return nil, err + } + + output := [][][]string{} + + for k, sheet := range f.Sheets { + if k > 0 { + break + } + s := [][]string{} + var length int = 0 + //统计第一行的列数 + for _, cell := range sheet.Rows[0].Cells { + str, _ := cell.FormattedValue() + if err != nil { + // Recover from strconv.NumError if the value is an empty string, + // and insert an empty string in the output. + if numErr, ok := err.(*strconv.NumError); ok && numErr.Num == "" { + str = "" + } else { + return nil, err + } + } + if str != "" { + length += 1 + } + } + //根据第一行的列数进行数据填充,如果不够用空补,如果超过不管 + for _, row := range sheet.Rows { + if row == nil { + continue + } + var nodata bool = false + r := []string{} + for _, cell := range row.Cells { + str, err := cell.FormattedValue() + if err != nil { + // Recover from strconv.NumError if the value is an empty string, + // and insert an empty string in the output. + if numErr, ok := err.(*strconv.NumError); ok && numErr.Num == "" { + str = "" + } else { + return nil, err + } + } + r = append(r, str) + } + + for i := len(row.Cells); i < length; i++ { + r = append(r, "") + } + for i := 0; i < length; i++ { + if r[i] != "" { + nodata = true + } + } + if nodata { + s = append(s, r) + } + } + output = append(output, s) + } + return output[0], nil +} + +const FileDevice = "device" +const FileOrder = "order" +const FileOOB = "oob_info" +const FileDeviceSendMail = "device_sendmail" +const FileIP = "ip" + +var ( + mTitle = map[string][]string{ + FileDevice: []string{ + `ID`, + `固资编号`, + `序列号`, + `厂商`, + `型号`, + `CPU架构`, + `用途`, + `类型`, + `数据中心`, + `机房管理单元`, + `机架编号`, + `机位编号`, + `带外IP`, + `带外用户`, + `带外密码`, + `电源状态`, + `硬件备注`, + `RAID备注`, + `启用时间`, + `上架时间`, + `运营状态`, + `内网IP`, + `外网IP`, + `操作系统`, + }, + FileOrder: []string{ + `订单号`, + `逻辑区(物理区域)`, + `用途`, + `设备类型`, + `数量`, + `数据中心`, + `机房管理单元`, + `预占机位`, + `预计到货时间`, + }, + FileOOB: []string{ + `固资编号`, + `序列号`, + `内网IP`, + `带外IP`, + `带外用户`, + `带外密码`, + }, + FileDeviceSendMail: []string{ + `固资编号`, + `序列号`, + `厂商`, + `型号`, + `CPU架构`, + `用途`, + `设备类型`, + `硬件备注`, + `启用时间`, + `运营状态`, + `数据中心`, + `机房管理单元`, + `物理区域`, + `机架`, + `机位`, + `负责人`, + `维保截止日期`, + `维保状态`, + }, + FileIP: []string{ + `IP地址`, + `网段名称`, + `网段网关`, + `网段掩码`, + `网段类别`, + `IP版本`, + `是否使用`, + `IP作用范围`, + `IP用途`, + `关联SN`, + `关联固资编号`, + }, + } +) + +//WriteToXLSX 将数据写入到指定文件的xlsx文件中, 现在的要求是一个文件只能有一张表。 +func WriteToXLSX(which string, data [][]string) (*xlsx.File, error) { + var file *xlsx.File + var sheet *xlsx.Sheet + var row *xlsx.Row + var cell *xlsx.Cell + var err error + + file = xlsx.NewFile() + sheet, err = file.AddSheet("Sheet1") + if err != nil { + return nil, err + } + //Add title + row = sheet.AddRow() + for _, vc := range mTitle[which] { + cell = row.AddCell() + cell.Value = vc + } + + //Add data + for _, vr := range data { + row = sheet.AddRow() + for _, vc := range vr { + cell = row.AddCell() + cell.Value = vc + } + } + + return file, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/ping/ping.go b/cyclone-server/src/idcos.io/cloudboot/utils/ping/ping.go new file mode 100644 index 0000000000000000000000000000000000000000..7df7d4f5a1a63aca405f3d78d0ff16ade6f1e243 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/ping/ping.go @@ -0,0 +1,176 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// taken from http://golang.org/src/pkg/net/ipraw_test.go + +package ping + +import ( + "bytes" + "errors" + "net" + "os" + "time" +) + +const ( + icmpv4EchoRequest = 8 + icmpv4EchoReply = 0 + icmpv6EchoRequest = 128 + icmpv6EchoReply = 129 +) + +type icmpMessage struct { + Type int // type + Code int // code + Checksum int // checksum + Body icmpMessageBody // body +} + +type icmpMessageBody interface { + Len() int + Marshal() ([]byte, error) +} + +// Marshal returns the binary enconding of the ICMP echo request or +// reply message m. +func (m *icmpMessage) Marshal() ([]byte, error) { + b := []byte{byte(m.Type), byte(m.Code), 0, 0} + if m.Body != nil && m.Body.Len() != 0 { + mb, err := m.Body.Marshal() + if err != nil { + return nil, err + } + b = append(b, mb...) + } + switch m.Type { + case icmpv6EchoRequest, icmpv6EchoReply: + return b, nil + } + csumcv := len(b) - 1 // checksum coverage + s := uint32(0) + for i := 0; i < csumcv; i += 2 { + s += uint32(b[i+1])<<8 | uint32(b[i]) + } + if csumcv&1 == 0 { + s += uint32(b[csumcv]) + } + s = s>>16 + s&0xffff + s = s + s>>16 + // Place checksum back in header; using ^= avoids the + // assumption the checksum bytes are zero. + b[2] ^= byte(^s & 0xff) + b[3] ^= byte(^s >> 8) + return b, nil +} + +// parseICMPMessage parses b as an ICMP message. +func parseICMPMessage(b []byte) (*icmpMessage, error) { + msglen := len(b) + if msglen < 4 { + return nil, errors.New("message too short") + } + m := &icmpMessage{Type: int(b[0]), Code: int(b[1]), Checksum: int(b[2])<<8 | int(b[3])} + if msglen > 4 { + var err error + switch m.Type { + case icmpv4EchoRequest, icmpv4EchoReply, icmpv6EchoRequest, icmpv6EchoReply: + m.Body, err = parseICMPEcho(b[4:]) + if err != nil { + return nil, err + } + } + } + return m, nil +} + +// imcpEcho represenets an ICMP echo request or reply message body. +type icmpEcho struct { + ID int // identifier + Seq int // sequence number + Data []byte // data +} + +func (p *icmpEcho) Len() int { + if p == nil { + return 0 + } + return 4 + len(p.Data) +} + +// Marshal returns the binary enconding of the ICMP echo request or +// reply message body p. +func (p *icmpEcho) Marshal() ([]byte, error) { + b := make([]byte, 4+len(p.Data)) + b[0], b[1] = byte(p.ID>>8), byte(p.ID&0xff) + b[2], b[3] = byte(p.Seq>>8), byte(p.Seq&0xff) + copy(b[4:], p.Data) + return b, nil +} + +// parseICMPEcho parses b as an ICMP echo request or reply message body. +func parseICMPEcho(b []byte) (*icmpEcho, error) { + bodylen := len(b) + p := &icmpEcho{ID: int(b[0])<<8 | int(b[1]), Seq: int(b[2])<<8 | int(b[3])} + if bodylen > 4 { + p.Data = make([]byte, bodylen-4) + copy(p.Data, b[4:]) + } + return p, nil +} + +func Ping(address string, timeout int) bool { + err := Pinger(address, timeout) + return err == nil +} + +func Pinger(address string, timeout int) error { + c, err := net.Dial("ip4:icmp", address) + if err != nil { + return err + } + c.SetDeadline(time.Now().Add(time.Duration(timeout) * time.Second)) + defer c.Close() + + typ := icmpv4EchoRequest + xid, xseq := os.Getpid()&0xffff, 1 + wb, err := (&icmpMessage{ + Type: typ, Code: 0, + Body: &icmpEcho{ + ID: xid, Seq: xseq, + Data: bytes.Repeat([]byte("Go Go Gadget Ping!!!"), 3), + }, + }).Marshal() + if err != nil { + return err + } + if _, err = c.Write(wb); err != nil { + return err + } + var m *icmpMessage + rb := make([]byte, 20+len(wb)) + for { + if _, err = c.Read(rb); err != nil { + return err + } + rb = ipv4Payload(rb) + if m, err = parseICMPMessage(rb); err != nil { + return err + } + switch m.Type { + case icmpv4EchoRequest, icmpv6EchoRequest: + continue + } + break + } + return nil +} + +func ipv4Payload(b []byte) []byte { + if len(b) < 20 { + return b + } + hdrlen := int(b[0]&0x0f) << 2 + return b[hdrlen:] +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/ping/ping_sh.go b/cyclone-server/src/idcos.io/cloudboot/utils/ping/ping_sh.go new file mode 100644 index 0000000000000000000000000000000000000000..4de5245efd6dd6ddc3b8a8ece2aa0e3a2533ebb3 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/ping/ping_sh.go @@ -0,0 +1,13 @@ +package ping + +import "os/exec" + +// 测试ping联通行性 +func PingTest(ip string) error { + return exec.Command("ping", "-c3", "-i0.5", "-W1", ip).Run() +} + +// 测试ping6联通行性 +func Ping6Test(ipv6 string) error { + return exec.Command("ping6", "-c3", "-i0.5", "-W1", ipv6).Run() +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/pxe/pxe.go b/cyclone-server/src/idcos.io/cloudboot/utils/pxe/pxe.go new file mode 100644 index 0000000000000000000000000000000000000000..4e5f1b0ceb2c234ceaf8b3a728bdb4298b4d27fc --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/pxe/pxe.go @@ -0,0 +1,31 @@ +package pxe + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strings" +) + +// dir 生成PXE文件的目录 +const dir = "/var/lib/tftpboot" + +// Dir 返回PXE文件根目录 +func Dir() string { + return dir +} + +// RemoveFile 删除设备PXE文件 +func RemoveFile(mac string) error { + return os.Remove(filepath.Join(Dir(), fmt.Sprintf("01-%s", strings.Replace(mac, ":", "-", -1)))) +} + +// GenFile 生成PXE文件 +func GenFile(mac string, content []byte) (filename string, err error) { + if err = os.MkdirAll(Dir(), 0755); err != nil { + return "", err + } + filename = filepath.Join(Dir(), fmt.Sprintf("01-%s", strings.Replace(mac, ":", "-", -1))) + return filename, ioutil.WriteFile(filename, content, 0644) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/sh/exec.go b/cyclone-server/src/idcos.io/cloudboot/utils/sh/exec.go new file mode 100644 index 0000000000000000000000000000000000000000..08f0ab35405deb2629548fe2c2e32a19769400ba --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/sh/exec.go @@ -0,0 +1,149 @@ +package sh + +import ( + "bytes" + "fmt" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "strings" + "time" + + "idcos.io/cloudboot/logger" +) + +// ExecScriptWithBuf *nix系统下,执行scriptFile标识的脚本文件,并将脚本执行的标准输出写入stdout,标准错误输出写入stderr。 +func ExecScriptWithBuf(scriptFile string, stdout, stderr *bytes.Buffer) (err error) { + cmd := exec.Command("/bin/bash", scriptFile) + if stdout != nil { + cmd.Stdout = stdout + } + if stderr != nil { + cmd.Stderr = stderr + } + return cmd.Run() +} + +// ExecScriptCombinedOutput *nix系统下,执行scriptFile标识的脚本文件,并将脚本执行的标准输出和标准错误输出都通过字节切片output返回。 +func ExecScriptCombinedOutput(scriptFile string) (output []byte, err error) { + return exec.Command("/bin/bash", scriptFile).CombinedOutput() +} + +// ExecWithBuf *nix系统下,执行命令字符串cmdAndArgs,并将命令执行的标准输出写入stdout,标准错误输出写入stderr。 +func ExecWithBuf(log logger.Logger, cmdAndArgs string, stdout, stderr *bytes.Buffer) (err error) { + scriptFile, err := GenTempScript([]byte(cmdAndArgs)) + if err != nil { + if log != nil { + log.Error(err) + } + return err + } + defer os.Remove(scriptFile) + + if log != nil { + log.Infof("Exec script %s", scriptFile) + } + if err = ExecScriptWithBuf(scriptFile, stdout, stderr); err != nil { + return err + } + return nil +} + +// ExecOutput 执行命令字符串cmdAndArgs,并将命令执行的标准输出和标准错误输出都通过字节切片output返回。 +func ExecOutput(log logger.Logger, cmdAndArgs string) (output []byte, err error) { + scriptFile, err := GenTempScript([]byte(cmdAndArgs)) + if err != nil { + if log != nil { + log.Error(err) + } + return nil, err + } + defer os.Remove(scriptFile) + + if log != nil { + log.Infof("Exec script %s", scriptFile) + } + if output, err = exec.Command("/bin/bash", scriptFile).Output(); err != nil { + if log != nil { + log.Error(err) + } + } + return output, err +} + +// ExecDesensitizeOutputWithLog 脱敏日志输出 +func ExecDesensitizeOutputWithLog(log logger.Logger, cmdAndArgsUTF8, keyWord, newWord string) (outUTF8 []byte, err error) { + + scriptFile, err := GenTempScript([]byte(cmdAndArgsUTF8)) + + defer os.Remove(scriptFile) + + if err != nil { + if log != nil { + log.Error(err) + } + return nil, err + } + output, err := ExecScriptCombinedOutput(scriptFile) + + desensitizedCmd := strings.Replace(cmdAndArgsUTF8, keyWord, newWord, -1) + outDesensitized := strings.Replace(string(output), keyWord, newWord, -1) + if err != nil { + if log != nil { + log.Errorf("Exec %q err: %s\noutput:\n%s", desensitizedCmd, err, outDesensitized) + } + return output, err + } + if log != nil { + log.Infof("%s ==>\n%s", desensitizedCmd, outDesensitized) + } + return output, nil +} + +func CmdDesensitization(cmd string) string { + strs := strings.Split(cmd, " ") + for i, v := range strs { + if strings.EqualFold(strings.ToUpper(v), "-P") { + cmd = strings.Replace(cmd, strs[i+1], "******", -1) + } + if strings.EqualFold(strings.ToLower(v), "password") && strings.Contains(cmd, "user set password") { + cmd = strings.Replace(cmd, strs[i+2], "******", -1) + } + } + return cmd +} + +// ExecOutputWithLog 与ExecOutput函数功能相同,但是会输出更丰富的日志。 +func ExecOutputWithLog(log logger.Logger, cmdAndArgsUTF8 string) (outUTF8 []byte, err error) { + output, err := ExecOutput(log, cmdAndArgsUTF8) + + desensitizationCmd := CmdDesensitization(cmdAndArgsUTF8) + desensitizationOp := CmdDesensitization(string(output)) + + if err != nil { + if log != nil { + log.Errorf("Exec %q err: %s\noutput:\n%s", desensitizationCmd, err, desensitizationOp) + } + return output, err + } + if log != nil { + log.Infof("[CMD-EXECUTED]==>\n%s", desensitizationCmd) + //log.Debugf("[CMD-OUTPUT] ==>\n%s", desensitizationOp) + } + return output, nil +} + +// GenTempScript 在系统临时目录生成可执行脚本文件 +func GenTempScript(content []byte) (scriptFile string, err error) { + scriptFile = filepath.Join(os.TempDir(), fmt.Sprintf("%s.sh", genUUID())) + if err = ioutil.WriteFile(scriptFile, content, 0744); err != nil { + return "", err + } + return scriptFile, nil +} + +// genUUID 返回UUID字符串 +func genUUID() string { + return fmt.Sprintf("%d%d", time.Now().UnixNano(), time.Now().Nanosecond()) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/sign_algo.go b/cyclone-server/src/idcos.io/cloudboot/utils/sign_algo.go new file mode 100644 index 0000000000000000000000000000000000000000..ce88d752fac5588c36766fcfb48ff645064e91d6 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/sign_algo.go @@ -0,0 +1,37 @@ +package utils + +import ( + "crypto/md5" + "fmt" + "io" + "strings" + "time" +) + +const secretKey = "idcos_cloudboot$2017" + +// GetSign 获取URL签名 +func GetSign(salt string) string { + signStr := "salt" + salt + "secret_key" + secretKey + h := md5.New() + h.Write([]byte(signStr)) + return strings.ToUpper(fmt.Sprintf("%x", h.Sum(nil))) +} + +// GetRespSign 获取返回值签名 +func GetRespSign(stat, msg interface{}) string { + signStr := "status" + stat.(string) + "message" + msg.(string) + "secret_key" + secretKey + h := md5.New() + h.Write([]byte(signStr)) + return strings.ToUpper(fmt.Sprintf("%x", h.Sum(nil))) +} + +// GenSalt 生成salt(随机8位字符串) +func GenSalt() string { + t := time.Now() + h := md5.New() + io.WriteString(h, "crazyof.me") + io.WriteString(h, t.String()) + salt := fmt.Sprintf("%x", h.Sum(nil)) + return salt[0:8] +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/strings/string.go b/cyclone-server/src/idcos.io/cloudboot/utils/strings/string.go new file mode 100644 index 0000000000000000000000000000000000000000..cca2d3122061d7cb5c96232cfadbcdf0d2587e71 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/strings/string.go @@ -0,0 +1,47 @@ +package strings + +import ( + "strconv" + stdstrings "strings" +) + +// DOS2UNIX 将windows字符串转换为Unix字符串 +func DOS2UNIX(src string) string { + return stdstrings.Replace(src, "\r\n", "\n", -1) +} + +// UNIX2DOS 将Unix字符串转换为windows字符串 +func UNIX2DOS(src string) string { + return stdstrings.Replace(src, "\n", "\r\n", -1) +} + +// MultiLines2Slice 将多行文本换成切片 +func MultiLines2Slice(multi string) []string { + str := DOS2UNIX(stdstrings.TrimSpace(multi)) + str = stdstrings.Replace(str, " ", "\n", -1) + str = stdstrings.Replace(str, ",", "\n", -1) + str = stdstrings.Replace(str, ";", "\n", -1) + return stdstrings.Split(str, "\n") +} + +// MultiLines2Slice 将多行文本换成切片(排除空格) +func MultiLines2SliceWithSpace(multi string) []string { + str := DOS2UNIX(stdstrings.TrimSpace(multi)) + str = stdstrings.Replace(str, ",", "\n", -1) + str = stdstrings.Replace(str, ";", "\n", -1) + return stdstrings.Split(str, "\n") +} + +// Multi2UintSlice 将逗号分隔的多个数值,转换成[]uint +func Multi2UintSlice(multi string) []uint { + vals := stdstrings.Split(multi, ",") + valsUint := make([]uint, 0, len(vals)) + for _, val := range vals { + valInt, err := strconv.Atoi(val) + if err != nil { + return nil + } + valsUint = append(valsUint, uint(valInt)) + } + return valsUint +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/times/iso_time.go b/cyclone-server/src/idcos.io/cloudboot/utils/times/iso_time.go new file mode 100644 index 0000000000000000000000000000000000000000..c10a521bc219bf8622b458ea4719b8050192fece --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/times/iso_time.go @@ -0,0 +1,85 @@ +package times + +import ( + "fmt" + "strings" + "time" +) + +// ISOTime 标准库Time的别名类型。用于格式化为ISO8601标准的时间(形如'2015-09-09 09:09:09')。 +type ISOTime time.Time + +const ( + // DateTimeLayout 日期时间转换模式 + DateTimeLayout = "2006-01-02 15:04:05" + // DateLayout 日期转换模式 + DateLayout = "2006-01-02" + // DateLayout2 + DateLayout2 = "01-02-06" +) + +// MarshalJSON 序列化,实现json.Marshaller接口 +func (t ISOTime) MarshalJSON() ([]byte, error) { + if time.Time(t).IsZero() { + return []byte(fmt.Sprintf("%q", "")), nil + } + // 注意:序列化成的时间字符串必须包含在双引号当中 + return []byte(fmt.Sprintf("%q", time.Time(t).Format(DateTimeLayout))), nil +} + +// UnmarshalJSON 反序列化,实现json.Unmarshaler接口 +func (t *ISOTime) UnmarshalJSON(b []byte) error { + sTime := fmt.Sprintf("%s", string(b)) + + if strings.HasPrefix(sTime, "\"") { + sTime = sTime[1:] + } + + if strings.HasSuffix(sTime, "\"") { + sTime = sTime[0 : len(sTime)-1] + } + + tmpT, err := time.Parse(DateTimeLayout, sTime) + if err != nil { + return err + } + + *t = ISOTime(tmpT) + return nil +} + +// MarshalYAML 序列化成YAML +func (t ISOTime) MarshalYAML() (interface{}, error) { + return time.Time(t).Format(DateTimeLayout), nil +} + +// UnmarshalYAML YAML反序列化 +// func (t ISOTime) UnmarshalYAML(unmarshal func(interface{}) error) error { +// return nil +// } + +//String 时间转换 +func (t ISOTime) String() string { + return time.Time(t).Format(DateTimeLayout) +} + +// ToDateStr 格式化成日期 +func (t ISOTime) ToDateStr() string { + if time.Time(t).IsZero() { + return "" + } + return time.Time(t).Format(DateLayout) +} + +// ToDateStr 格式化成日期 +func (t ISOTime) ToTimeStr() string { + if time.Time(t).IsZero() { + return "" + } + return time.Time(t).Format(DateTimeLayout) +} + +// UnixSecToISOTime UNIX秒转化成ISOTime类型 +func UnixSecToISOTime(unixSecond int64) ISOTime { + return ISOTime(time.Unix(unixSecond, 0)) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/times/iso_time_test.go b/cyclone-server/src/idcos.io/cloudboot/utils/times/iso_time_test.go new file mode 100644 index 0000000000000000000000000000000000000000..ec2bf1507ce02e3b12b409622e64a156e1fe7a80 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/times/iso_time_test.go @@ -0,0 +1,47 @@ +package times + +import ( + "encoding/json" + "testing" + "time" + + . "github.com/smartystreets/goconvey/convey" +) + +func TestJsonTime(t *testing.T) { + type person struct { + Birthday ISOTime `json:"birthday"` + } + now, _ := time.Parse(longTimeLayout, "2015-09-24 14:59:06") + + sJSON := `{"birthday":"2015-09-24 14:59:06"}` + + Convey("对象转换成JSON字符串", t, func() { + p := person{ + Birthday: ISOTime(now), + } + bJSON, err := json.Marshal(p) + So(err, ShouldBeNil) + So(string(bJSON), ShouldEqual, sJSON) + So(p.Birthday.String(), ShouldEqual, "2015-09-24 14:59:06") + }) + + Convey("JSON字符串转换成对象", t, func() { + var p person + err := json.Unmarshal([]byte(sJSON), &p) + So(err, ShouldBeNil) + So(now.Format(longTimeLayout), ShouldEqual, time.Time(p.Birthday).Format(longTimeLayout)) + }) + +} + +func TestUnixSecToISOTime(t *testing.T) { + Convey("测试unix秒转ISOTime", t, func() { + jt := UnixSecToISOTime(10) // 10 秒 + So(jt.String(), ShouldEqual, "1970-01-01 08:00:10") + jt = UnixSecToISOTime(600) // 10 分钟 + So(jt.String(), ShouldEqual, "1970-01-01 08:10:00") + jt = UnixSecToISOTime(36000) // 10 小时 + So(jt.String(), ShouldEqual, "1970-01-01 18:00:00") + }) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/times/time.go b/cyclone-server/src/idcos.io/cloudboot/utils/times/time.go new file mode 100644 index 0000000000000000000000000000000000000000..8754a32c005d5493382675534e82a701a3b29a9b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/times/time.go @@ -0,0 +1,37 @@ +package times + +import "time" + +// LatestWeek 返回最近一周的时间列表 +func LatestWeek(base time.Time, asc bool) []time.Time { + return LatestDays(base, 7, asc) +} + +// LatestMonth 返回最近一个月的时间列表 +func LatestMonth(base time.Time, asc bool) []time.Time { + return LatestDays(base, 30, asc) +} + +// LatestDays 返回最近N天的时间列表 +func LatestDays(base time.Time, days int, asc bool) []time.Time { + if base.IsZero() || days <= 0 { + return nil + } + items := make([]time.Time, 0, days) + if asc { + // 日期递增 + base = base.Add(time.Hour * -24 * time.Duration(days-1)) + for i := 0; i < days; i++ { + items = append(items, base) + base = base.Add(time.Hour * 24) + } + } else { + // 日期递减 + for i := 0; i < days; i++ { + items = append(items, base) + base = base.Add(time.Hour * -24) + } + } + + return items +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/times/time_test.go b/cyclone-server/src/idcos.io/cloudboot/utils/times/time_test.go new file mode 100644 index 0000000000000000000000000000000000000000..7865b03f9257a1564c9ad7d55d15e55cdd698ff3 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/times/time_test.go @@ -0,0 +1,40 @@ +package times + +import ( + "testing" + "time" + + . "github.com/smartystreets/goconvey/convey" +) + +const layout = "2006-01-02" + +func TestLatestDays(t *testing.T) { + Convey("返回最近N天的日期列表", t, func() { + Convey("日期递增", func() { + var items []time.Time + bt, _ := time.Parse(layout, "2018-10-17") + items = LatestDays(bt, 2, true) + So(len(items), ShouldEqual, 2) + So(items[0].Format(layout), ShouldEqual, "2018-10-16") + So(items[1].Format(layout), ShouldEqual, "2018-10-17") + + items = LatestDays(bt, 1, true) + So(len(items), ShouldEqual, 1) + So(items[0].Format(layout), ShouldEqual, "2018-10-17") + }) + + Convey("日期递减", func() { + var items []time.Time + bt, _ := time.Parse(layout, "2018-10-17") + items = LatestDays(bt, 2, false) + So(len(items), ShouldEqual, 2) + So(items[0].Format(layout), ShouldEqual, "2018-10-17") + So(items[1].Format(layout), ShouldEqual, "2018-10-16") + + items = LatestDays(bt, 1, false) + So(len(items), ShouldEqual, 1) + So(items[0].Format(layout), ShouldEqual, "2018-10-17") + }) + }) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/upload/upload.go b/cyclone-server/src/idcos.io/cloudboot/utils/upload/upload.go new file mode 100644 index 0000000000000000000000000000000000000000..d3600d694248120d24f647b54699dc2226f813f1 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/upload/upload.go @@ -0,0 +1,110 @@ +package upload + +import ( + "crypto/md5" + "encoding/hex" + "fmt" + "io" + "net/http" + "os" + "strings" + "time" + + "path/filepath" + + "github.com/voidint/binding" +) + +var ( + //UploadDir 批量导入放置的位置 + UploadDir = filepath.Join(os.TempDir(), "cloudboot-server") + string(os.PathSeparator) +) + +//FileExist 检查文件是否存在 +func FileExist(filename string) bool { + _, err := os.Stat(filename) + return err == nil || os.IsExist(err) +} + +//GenerateTempFile 加载导入文件 +func GenerateTempFile(r *http.Request, prefix string) (string, error) { + r.ParseForm() + file, handle, err := r.FormFile("files[]") + if err != nil { + return "", err + } + + if !FileExist(UploadDir) { + err := os.MkdirAll(UploadDir, 0777) + if err != nil { + return "", err + } + } + + list := strings.Split(handle.Filename, ".") + ext := list[len(list)-1] + + h := md5.New() + h.Write([]byte(fmt.Sprintf("%d", time.Now().UnixNano()) + handle.Filename)) + cipherStr := h.Sum(nil) + md5 := fmt.Sprintf("%s", hex.EncodeToString(cipherStr)) + filename := prefix + md5 + "." + ext + + if FileExist(UploadDir + filename) { + os.Remove(UploadDir + filename) + } + + f, err := os.OpenFile(UploadDir+filename, os.O_WRONLY|os.O_CREATE, 0666) + io.Copy(f, file) + if err != nil { + return "", err + } + defer f.Close() + defer file.Close() + return filename, nil +} + +//ImportReq 导入请求参数 +type ImportReq struct { + // 文件名称 + FileName string `json:"file_name"` + // 页大小 + Limit uint `json:"limit"` + // 页号 + Offset uint `json:"offset"` + //UserName 登入用户 + UserName string `json:"-"` +} + +// FieldMap 请求参数与结构体字段建立映射 +func (reqData *ImportReq) FieldMap(req *http.Request) binding.FieldMap { + // 此处只做字段映射,不要包含校验逻辑。 + return binding.FieldMap{ + &reqData.Limit: "limit", + &reqData.Offset: "offset", + &reqData.FileName: "file_name", + } +} + +//Validate 参数校验 +func (reqData *ImportReq) Validate(req *http.Request, errs binding.Errors) binding.Errors { + //这里的校验要与model状态保持一致 + if reqData.FileName == "" { + errs.Add([]string{"filename"}, binding.RequiredError, "文件名不能为空") + return errs + } + if !FileExist(UploadDir + reqData.FileName) { + errs.Add([]string{"filename"}, binding.RequiredError, fmt.Sprintf("文件名(%s)不存在", UploadDir+reqData.FileName)) + return errs + } + return errs +} + +const ( + //Continue 可以继续检查 + Continue = 1 + //Return 不能继续检查 + Return = 2 + //DO 可以继续向下执行 + DO = 3 +) diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/user/get_user_info.go b/cyclone-server/src/idcos.io/cloudboot/utils/user/get_user_info.go new file mode 100644 index 0000000000000000000000000000000000000000..539a7ddf20c1b55b5b4ef94a551578766d1b014d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/user/get_user_info.go @@ -0,0 +1,115 @@ +package user + +import ( + "errors" + + "idcos.io/cloudboot/logger" + uam "idcos.io/uam-go" +) + +const ( + // appID4UAM UAM系统【权限资源管理】-【系统名称】 + appID4UAM = "cloudboot" + // permissionCategory4UAM UAM系统【权限资源管理】-【编码】 + permissionCategory4UAM = "cloudboot" + // tenantID4UAM UAM系统默认租户ID + tenantID4UAM = "default" +) + +var ( + // ErrNotExistGetUserFromUAM 错误 + ErrNotExistGetUserFromUAM = errors.New("UAM上不存在的用户") + + // ErrParamGetUserFromUAM 参数错误 + ErrParamGetUserFromUAM = errors.New("参数错误") +) + +// GetNameFromUAM 从UAM上获取合适的UAM信息 +type GetNameFromUAM func(string) (string, string, error) + +// GetUUIDFromUAM 从UAM上获取合适的UAM信息 +type GetUUIDFromUAM func(string) (string, error) + +// GetEmailFromUAM 从UAM上获取合适的UAM信息 +type GetEmailFromUAM func(string) (string, string, string, error) + +// GetUsersByUUID 根据UUID从UAM服务器上找到匹配的用户信息 +func GetUsersByUUID(log logger.Logger, accessToken, uamEndPoint string) GetNameFromUAM { + return func(uuid string) (loginName, name string, err error) { + if accessToken == "" || uamEndPoint == "" || uuid == "" { + return "", "", ErrParamGetUserFromUAM + } + + user, err := uam.NewClient(uamEndPoint, accessToken, uam.LogOption(log)).GetUserByID(uuid) + if err != nil { + return "", "", err + } + + if user != nil { + return user.LoginID, user.Name, nil + } + + return "", "", ErrNotExistGetUserFromUAM + } +} + +// GetEmailByUUID 根据UUID从UAM服务器上找到匹配的用户信息 +func GetEmailByUUID(log logger.Logger, accessToken, uamEndPoint string) GetEmailFromUAM { + return func(uuid string) (loginName, name, email string, err error) { + if accessToken == "" || uamEndPoint == "" || uuid == "" { + return "", "", "", ErrParamGetUserFromUAM + } + + user, err := uam.NewClient(uamEndPoint, accessToken, uam.LogOption(log)).GetUserByID(uuid) + if err != nil { + return "", "", "", err + } + + if user != nil { + return user.LoginID, user.Name, user.Email, nil + } + return "", "", "", ErrNotExistGetUserFromUAM + } +} + +// GetUUIDByLoginName 根据LoginName从UAM服务器上找到匹配的用户UUID +func GetUUIDByLoginName(log logger.Logger, accessToken, uamEndPoint string) GetUUIDFromUAM { + return func(loginName string) (uuid string, err error) { + if accessToken == "" || uamEndPoint == "" || loginName == "" { + return "", ErrParamGetUserFromUAM + } + opts := []uam.SetOptionFunc{ + uam.LogOption(log), + uam.TenantOption(tenantID4UAM), + } + user, err := uam.NewClient(uamEndPoint, accessToken, opts...).GetUserByLoginID(loginName) + if err != nil { + return "", err + } + + if user != nil { + return user.ID, nil + } + return "", ErrNotExistGetUserFromUAM + } +} + +// GetUserByLoginName 根据LoginName从UAM服务器上找到匹配的用户 +func GetUserByLoginName(log logger.Logger, accessToken, uamEndPoint string) GetNameFromUAM { + return func(loginName string) (login, name string, err error) { + if accessToken == "" || uamEndPoint == "" || loginName == "" { + return "", "", ErrParamGetUserFromUAM + } + + user, err := uam.NewClient(uamEndPoint, accessToken, uam.LogOption(log)).GetUserByID(loginName) + if err != nil { + return "", "", err + } + + if user != nil { + return user.LoginID, user.Name, nil + } + + return "", "", ErrNotExistGetUserFromUAM + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/utils.go b/cyclone-server/src/idcos.io/cloudboot/utils/utils.go new file mode 100644 index 0000000000000000000000000000000000000000..7b03c249a312b7b3998762d017a2cb225788694e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/utils.go @@ -0,0 +1,366 @@ +package utils + +import ( + "bytes" + "encoding/base64" + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "net/http" + "os" + "os/exec" + "path" + "path/filepath" + "strings" + + "reflect" + + "idcos.io/cloudboot/config" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/utils/ping" +) + +// var Logger *logs.BeeLogger +var Logger logger.Logger +var rootPath = "c:/firstboot" +var logPath = path.Join(rootPath, "log") +var logFile = path.Join(logPath, "setup.log") + +var rootPathPeAgent = "X:\\Windows\\System32" +var logFilePeAgent = path.Join(rootPathPeAgent, "pe-agent.log") + +func CheckFileIsExist(filename string) bool { + var exist = true + if _, err := os.Stat(filename); os.IsNotExist(err) { + exist = false + } + return exist +} + +// @Deprecated +func InitFileLog() { + os.MkdirAll(logPath, 0666) + Logger = logger.NewBeeLogger(&config.Logger{ + Level: "debug", + LogFile: logFile, + ConsoleEnabled: true, + }) +} + +// @Deprecated +func InitPeAgentLog() { + Logger = logger.NewBeeLogger(&config.Logger{ + Level: "debug", + LogFile: logFilePeAgent, + ConsoleEnabled: true, + }) +} + +// @Deprecated +func InitConsoleLog() { + Logger = logger.NewBeeLogger(&config.Logger{ + Level: "debug", + LogFile: logFilePeAgent, + ConsoleEnabled: true, + }) +} + +// ExecCmd 执行 command +func ExecCmd(scriptFile, cmdString string) ([]byte, error) { + + // 生成临时文件 + if CheckFileIsExist(scriptFile) { + os.Remove(scriptFile) + } + file, err := os.Create(scriptFile) + if err != nil { + return nil, err + } + //defer os.Remove(file.Name()) + defer file.Close() + + if _, err = file.WriteString(cmdString); err != nil { + return nil, err + } + file.Close() + + return ExecScript(scriptFile) +} + +// ExecScript exec script +func ExecScript(scriptPath string) ([]byte, error) { + + var cmd = exec.Command("cmd", "/c", scriptPath) + return cmd.Output() +} + +// ExecCmd 执行 command +func ExecCmdOutputWithLogfile(scriptFile, cmdString string) ([]byte, error) { + // 生成临时文件 + if CheckFileIsExist(scriptFile) { + os.Remove(scriptFile) + } + file, err := os.Create(scriptFile) + if err != nil { + return nil, err + } + //defer os.Remove(file.Name()) + defer file.Close() + + if _, err = file.WriteString(cmdString); err != nil { + return nil, err + } + file.Close() + + _ = os.MkdirAll(filepath.Join("c:/", "firstboot", "log"), 0777) + log := filepath.Join(filepath.Join("c:/", "firstboot", "log", "stdout.log")) + errExec := ExecScriptOutputWithLogfile(scriptFile, log) + if errExec != nil { + return nil, errExec + } + + fi, err := os.Open(log) + if err != nil { + return nil, err + } + fd, err := ioutil.ReadAll(fi) + if err != nil { + return nil, err + } + defer fi.Close() + return fd, nil +} + +func ExecScriptOutputWithLogfile(scriptPath string, log string) error { + if CheckFileIsExist(log) { + os.Remove(log) + } + cmd := exec.Command("cmd", "/c", scriptPath) + stdout, err := os.OpenFile(log, os.O_CREATE|os.O_WRONLY, 0600) + cmd.Stdout = stdout + if err != nil { + return err + } + defer stdout.Close() + // 执行命令 + if err := cmd.Run(); err != nil { + return err + } + + return nil +} + +// ExecCmd 执行 command +//func ExecCmdStdoutConsole(scriptFile, cmdString string) ([]byte, error) { +// // 生成临时文件 +// if CheckFileIsExist(scriptFile) { +// os.Remove(scriptFile) +// } +// file, err := os.Create(scriptFile) +// if err != nil { +// return nil, err +// } +// //defer os.Remove(file.Name()) +// defer file.Close() +// +// if _, err = file.WriteString(cmdString); err != nil { +// return nil, err +// } +// file.Close() +// +// output, errExec := ExecScriptStdoutConsole(scriptFile) +// if errExec != nil { +// return output, errExec +// } +// return output, nil +//} + +func ExecScriptStdoutConsole(scriptPath string) ([]byte, error) { + var output string + cmd := exec.Command("cmd", "/c", scriptPath) + w := bytes.NewBuffer(nil) + cmd.Stdout = os.Stdout + cmd.Stderr = w + cmd.Start() // Start开始执行c包含的命令,但并不会等待该命令完成即返回。 + // Wait方法会返回命令的返回状态码并在命令返回后释放相关的资源。 + if err := cmd.Wait(); err != nil { + str := fmt.Sprintf("stderr:\n%s\n\nerror:\n%s", string(w.Bytes()), err.Error()) + // fmt.Println(str) + return []byte(output), errors.New(str) + } + return []byte(output), nil +} + +// CallRestAPI 调用restful api +func CallRestAPI(url string, jsonReq interface{}) ([]byte, error) { + var req *http.Request + var resp *http.Response + var err error + var reqBody []byte + + if reqBody, err = json.Marshal(jsonReq); err != nil { + return nil, err + } + + fmt.Printf("Request BODY: %s \n", string(reqBody)) + if req, err = http.NewRequest("POST", url, bytes.NewBuffer(reqBody)); err != nil { + return nil, err + } + req.Header.Add("Content-Type", "application/json") + + if resp, err = http.DefaultClient.Do(req); err != nil { + return nil, err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("http status code: %d", resp.StatusCode) + } + + var body []byte + body, err = ioutil.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("call url: %s failed", url) + } + + return body, nil +} + +// ReportProgress 上报执行结果 +func ReportProgress(installProgress float64, sn, title, installLog string, host string) bool { + var url = fmt.Sprintf("http://%s/api/cloudboot/v1/devices/%s/installations/progress", host, sn) + Logger.Debug("ReportProgress url:%s\n", url) + var jsonReq struct { + //SN string `json:"sn"` + InstallProgress float64 `json:"progress"` + InstallLog string `json:"log"` + Title string `json:"title"` + } + //jsonReq.SN = sn + jsonReq.InstallProgress = installProgress + jsonReq.Title = title + jsonReq.InstallLog = base64.StdEncoding.EncodeToString([]byte(installLog)) // base64编码 + Logger.Debug("SN: %s\n", sn) + Logger.Debug("InstallProgress: %f\n", jsonReq.InstallProgress) + Logger.Debug("InstallLog: %s\n", jsonReq.InstallLog) + Logger.Debug("Title: %s\n", jsonReq.Title) + + var jsonResp struct { + Status string + Message string + Content struct { + Result string + } + } + + var ret, err = CallRestAPI(url, jsonReq) + Logger.Debug("ReportProgress api result:%s\n", string(ret)) + if err != nil { + Logger.Error(err.Error()) + return false + } + + if err := json.Unmarshal(ret, &jsonResp); err != nil { + Logger.Error(err.Error()) + return false + } + + if jsonResp.Status != "success" { + return false + } + return true +} + +// PingLoop return when success +func PingLoop(host string, pkgCnt int, timeout int) bool { + for i := 0; i < pkgCnt; i++ { + if ping.Ping(host, timeout) { + return true + } + } + return false +} + +func ListDir(dirPth string) (files []string, err error) { + files = make([]string, 0, 10) + dir, err := ioutil.ReadDir(dirPth) + if err != nil { + return nil, err + } + PthSep := string(os.PathSeparator) + for _, fi := range dir { + if !fi.IsDir() { + continue + } + files = append(files, dirPth+PthSep+fi.Name()) + } + return files, nil +} + +func ListFiles(dirPth string, suffix string, onlyReturnFileName bool) (files []string, err error) { + files = make([]string, 0, 10) + dir, err := ioutil.ReadDir(dirPth) + if err != nil { + return nil, err + } + PthSep := string(os.PathSeparator) + suffix = strings.ToUpper(suffix) //忽略后缀匹配的大小写 + for _, fi := range dir { + if fi.IsDir() { // 忽略目录 + continue + } + if strings.HasSuffix(strings.ToUpper(fi.Name()), suffix) { //匹配文件 + if onlyReturnFileName == true { + files = append(files, fi.Name()) + } else { + files = append(files, dirPth+PthSep+fi.Name()) + } + } + } + return files, nil +} + +// StructTrimSpace 遍历结构体的字段并找出string类型字段进行trimspace操作 +// 入参得是一个结构体指针 +func StructTrimSpace(i interface{}) { + ref := reflect.ValueOf(i).Elem() + for i := 0; i < ref.NumField(); i++ { + field := ref.Field(i) + switch field.Kind() { + case reflect.String: + newVal := strings.TrimSpace(field.Interface().(string)) + canSetVal := reflect.ValueOf(newVal) + field.Set(canSetVal) + } + } +} + +// GetOOBHost 获取OOB主机信息 +// 理论上一个SN对应一个主机名。 +// 但在实际环境中,某些存量设备 +// hp的机器,hostname可能是ILO+$SN(如:ILO123456) +// dell的机器,hostname可能是rac-$SN(如rac-123456) +// 故返回多个,上层用重试法确定实际值 +func GetOOBHost(sn, vendor, domain string) []string { + snPrefixILO := "ILO" + snPrefixDRAC := "rac-" + sns := make([]string, 1, 2) + if domain != "" { + domain = "." + domain + } + vendorLower := strings.ToLower(vendor) + sns[0] = sn + domain + if strings.Contains(vendorLower, "dell") || strings.Contains(vendorLower, "戴尔") { + sns = append(sns, snPrefixDRAC+sn+domain) + } else if strings.Contains(vendorLower, "hp") || strings.Contains(vendorLower, "惠普") { + sns = append(sns, snPrefixILO+sn+domain) + } + return sns +} + +//ToJsonString 转换json为字符串 +func ToJsonString(arg interface{}) string { + bytes, _ := json.Marshal(arg) + return string(bytes) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/uuid.go b/cyclone-server/src/idcos.io/cloudboot/utils/uuid.go new file mode 100644 index 0000000000000000000000000000000000000000..2c95887d83e8111126ba867cf6d8a0d24b3aa74f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/uuid.go @@ -0,0 +1,12 @@ +package utils + +import ( + "fmt" + + uuid "github.com/satori/go.uuid" +) + +// UUID 返回UUID字符串 +func UUID() string { + return fmt.Sprintf("%x", uuid.Must(uuid.NewV4()).Bytes()) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/win/diskpart.go b/cyclone-server/src/idcos.io/cloudboot/utils/win/diskpart.go new file mode 100644 index 0000000000000000000000000000000000000000..0b1111c4bfff4955ddd157a0c90f8a0e492b1f5e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/win/diskpart.go @@ -0,0 +1,236 @@ +package win + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "io" + "io/ioutil" + "os" + "os/exec" + "regexp" + "strconv" + "strings" + "time" + + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/utils" + mybytes "idcos.io/cloudboot/utils/bytes" +) + +// PartConfiguration 分区配置信息 +type PartConfiguration struct { + Size string // 字节数或者free + FSType string + Mountpoint string +} + +// DiskPartConfiguration 磁盘分区配置信息 +type DiskPartConfiguration struct { + Disk int // 磁盘编号,如0、1、2... + GPT bool + Partitions []PartConfiguration +} + +var ( + numReg = regexp.MustCompile("^\\d+$") + alphaReg = regexp.MustCompile("^[A-Za-z]$") +) + +func (conf *DiskPartConfiguration) setup(log logger.Logger) (err error) { + size, err := conf.diskSize(log) + if err != nil { + return err + } + conf.GPT = size.GE(2 * mybytes.TB) // 约定: 磁盘容量大于等于2T使用GPT方式分区 + return nil +} + +var ( + // ErrDiskNotSelected 磁盘未选中 + ErrDiskNotSelected = errors.New("disk is not selected") +) + +// diskSize 返回当前磁盘的容量 +func (conf *DiskPartConfiguration) diskSize(log logger.Logger) (size mybytes.Byte, err error) { + output, err := conf.exec(log, fmt.Sprintf("select disk %d\r\nlist disk", conf.Disk)) + if err != nil { + return mybytes.Byte(0), err + } + var started bool + rd := bufio.NewReader(bytes.NewBuffer(output)) + for { + line, err := rd.ReadString('\n') + if err == io.EOF { + break + } + if err != nil { + return size, err + } + line = strings.TrimSpace(line) + if strings.HasPrefix(line, "-----") { + started = true + continue + } + if !started || !strings.HasPrefix(line, "*") { // 选中的目标磁盘记录会以"*"开头 + continue + } + + line = strings.TrimSpace(strings.TrimPrefix(line, "*")) + fields := strings.Fields(line) + if len(fields) < 5 { + break + } + return mybytes.Parse2Byte(strings.TrimSpace(fields[3]), strings.TrimSpace(fields[4])) + } + return mybytes.Byte(0), ErrDiskNotSelected +} + +type volume struct { + ID string + Letter string +} + +// listVolumes 列出当前磁盘的所有卷(不包含已移除的卷和系统保留卷) +func (conf *DiskPartConfiguration) listVolumes(log logger.Logger) (vols []*volume, err error) { + output, err := conf.exec(log, "list vol") + if err != nil { + return nil, err + } + var started bool + rd := bufio.NewReader(bytes.NewBuffer(output)) + for { + line, err := rd.ReadString('\n') + if err == io.EOF { + break + } + if err != nil { + return nil, err + } + line = strings.TrimSpace(line) + if strings.HasPrefix(line, "-----") { + started = true + continue + } + if !started { + continue + } + line = strings.TrimSpace(strings.TrimPrefix(line, "*")) + fields := strings.Fields(line) + if len(fields) < 3 { + continue + } + id, letter := strings.TrimSpace(fields[1]), strings.TrimSpace(fields[2]) + if numReg.MatchString(id) && alphaReg.MatchString(letter) { + vols = append(vols, &volume{ + ID: id, + Letter: letter, + }) + } + } + return vols, nil +} + +// rmVolumeLetter 移除指定卷的盘符 +func (conf *DiskPartConfiguration) rmVolumeLetter(log logger.Logger, vol *volume) (err error) { + // 选中目标卷,移除目标卷盘符 + _, err = conf.exec(log, fmt.Sprintf("select vol %s\r\nremove letter=%s", vol.ID, vol.Letter)) + return err +} + +// exec 将待执行命令写入文件,然后通过'diskpart /s $filepath'方式执行命令。 +func (conf *DiskPartConfiguration) exec(log logger.Logger, cmdAndArgs string) (output []byte, err error) { + filename := fmt.Sprintf("diskpart_%s.txt", utils.UUID()) + if err = ioutil.WriteFile(filename, []byte(cmdAndArgs), 0777); err != nil { + return nil, err + } + defer os.Remove(filename) + + output, err = exec.Command("diskpart", "/s", filename).Output() + log.Infof("diskpart /s %s\n%s==>\n%s", filename, cmdAndArgs, output) + return output, err +} + +// CMD 返回创建分区的命令内容 +func (conf *DiskPartConfiguration) CMD() []byte { + var buf bytes.Buffer + buf.WriteString(fmt.Sprintf("select disk %d\r\n", conf.Disk)) + buf.WriteString("clean\r\n") + if conf.GPT { + buf.WriteString("convert gpt\r\n") + } + for i := range conf.Partitions { + if strings.ToLower(conf.Partitions[i].Size) == "free" { + buf.WriteString("create partition primary\r\n") + } else { + buf.WriteString(fmt.Sprintf("create partition primary size=%s\r\n", conf.Partitions[i].Size)) + } + buf.WriteString(fmt.Sprintf("format quick fs=%s\r\n", conf.Partitions[i].FSType)) + buf.WriteString(fmt.Sprintf("assign letter=%s\r\n", conf.Partitions[i].Mountpoint)) + if strings.ToUpper(conf.Partitions[i].Mountpoint) == "C" && !conf.GPT { + buf.WriteString("active\r\n") + } + } + return buf.Bytes() +} + +// Apply 通过本地调用diskpart命令执行磁盘分区 +func (conf *DiskPartConfiguration) Apply(log logger.Logger) (output []byte, err error) { + if err = conf.setup(log); err != nil { + return nil, err + } + + vols, _ := conf.listVolumes(log) + for i := range vols { + for x := range conf.Partitions { + if strings.ToUpper(vols[i].Letter) == strings.ToUpper(conf.Partitions[x].Mountpoint) { + _ = conf.rmVolumeLetter(log, vols[i]) // 待分配的盘符和现有盘符冲突,移除现有盘符。 + } + } + } + + // 执行实际分区 + return conf.exec(log, string(conf.CMD())) +} + +// DiskPartConfigurations 磁盘分区集合(注意集合中元素顺序) +type DiskPartConfigurations []DiskPartConfiguration + +// Apply 通过本地调用diskpart命令执行磁盘分区 +func (confs DiskPartConfigurations) Apply(log logger.Logger) (err error) { + for i := range confs { + if _, err = confs[i].Apply(log); err != nil { + return err + } + if i < len(confs)-1 { + // 微软建议:两次执行diskpart脚本的间隔期 >= 15s,特别是对于写操作。 + // https://technet.microsoft.com/zh-cn/library/cc766465(v=ws.10).aspx + time.Sleep(time.Duration(15) * time.Second) + } + } + return nil +} + +var ( + // ErrMalformedDisk 磁盘命名格式错误 + ErrMalformedDisk = errors.New("malformed disk") +) + +// DiskNo 返回磁盘序号。自0始。 +func DiskNo(dev string) (no int, err error) { + dev = strings.ToLower(strings.TrimSpace(dev)) + if dev == "" { + return 0, ErrMalformedDisk + } + if numReg.MatchString(dev) { + return strconv.Atoi(dev) + } + + lastC := dev[len(dev)-1] + if lastC > 'z' || lastC < 'a' { + return 0, ErrMalformedDisk + } + + return int(lastC - 'a'), nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/win/diskpart_test.go b/cyclone-server/src/idcos.io/cloudboot/utils/win/diskpart_test.go new file mode 100644 index 0000000000000000000000000000000000000000..13e6865545ef96c143baab568e34963e0cf43fb9 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/win/diskpart_test.go @@ -0,0 +1,276 @@ +package win + +import ( + "errors" + "fmt" + "io/ioutil" + "os/exec" + "reflect" + "testing" + "time" + + mybytes "idcos.io/cloudboot/utils/bytes" + + "bou.ke/monkey" + . "github.com/smartystreets/goconvey/convey" + "idcos.io/cloudboot/utils" +) + +func TestDiskNo(t *testing.T) { + Convey("转换并获取磁盘编号", t, func() { + var no int + var err error + + no, err = DiskNo("") + So(err, ShouldEqual, ErrMalformedDisk) + So(no, ShouldEqual, 0) + + no, err = DiskNo("-1") + So(err, ShouldEqual, ErrMalformedDisk) + So(no, ShouldEqual, 0) + + no, err = DiskNo("/dev/sda99") + So(err, ShouldEqual, ErrMalformedDisk) + So(no, ShouldEqual, 0) + + no, err = DiskNo("0") + So(err, ShouldBeNil) + So(no, ShouldEqual, 0) + + no, err = DiskNo("7") + So(err, ShouldBeNil) + So(no, ShouldEqual, 7) + + no, err = DiskNo("/dev/sdb") + So(err, ShouldBeNil) + So(no, ShouldEqual, 1) + + no, err = DiskNo("/dev/hde") + So(err, ShouldBeNil) + So(no, ShouldEqual, 4) + }) +} + +func TestCMD(t *testing.T) { + Convey("返回windows分区的执行命令", t, func() { + conf := &DiskPartConfiguration{ + Disk: 0, + Partitions: []PartConfiguration{ + { + Size: "1024", + FSType: "ntfs", + Mountpoint: "C", + }, + }, + } + So(string(conf.CMD()), ShouldEqual, fmt.Sprintf( + "select disk %d\r\nclean\r\ncreate partition primary size=%s\r\nformat quick fs=%s\r\nassign letter=%s\r\nactive\r\n", + conf.Disk, + conf.Partitions[0].Size, + conf.Partitions[0].FSType, + conf.Partitions[0].Mountpoint, + )) + + conf = &DiskPartConfiguration{ + Disk: 0, + Partitions: []PartConfiguration{ + { + Size: "free", + FSType: "ntfs", + Mountpoint: "D", + }, + }, + } + So(string(conf.CMD()), ShouldEqual, fmt.Sprintf( + "select disk %d\r\nclean\r\ncreate partition primary\r\nformat quick fs=%s\r\nassign letter=%s\r\n", + conf.Disk, + conf.Partitions[0].FSType, + conf.Partitions[0].Mountpoint, + )) + + conf = &DiskPartConfiguration{ + Disk: 1, + GPT: true, + Partitions: []PartConfiguration{ + { + Size: "free", + FSType: "ntfs", + Mountpoint: "D", + }, + }, + } + So(string(conf.CMD()), ShouldEqual, fmt.Sprintf( + "select disk %d\r\nclean\r\nconvert gpt\r\ncreate partition primary\r\nformat quick fs=%s\r\nassign letter=%s\r\n", + conf.Disk, + conf.Partitions[0].FSType, + conf.Partitions[0].Mountpoint, + )) + + conf = &DiskPartConfiguration{ + Disk: 1, + GPT: true, + Partitions: []PartConfiguration{ + { + Size: "free", + FSType: "ntfs", + Mountpoint: "C", + }, + }, + } + So(string(conf.CMD()), ShouldEqual, fmt.Sprintf( + "select disk %d\r\nclean\r\nconvert gpt\r\ncreate partition primary\r\nformat quick fs=%s\r\nassign letter=%s\r\n", + conf.Disk, + conf.Partitions[0].FSType, + conf.Partitions[0].Mountpoint, + )) + }) +} + +func Test_listVolumes(t *testing.T) { + Convey("返回计算机的磁盘卷列表(不包含已移除的卷和系统保留卷)", t, func() { + var cmd *exec.Cmd + monkey.PatchInstanceMethod(reflect.TypeOf(cmd), "Output", func(_ *exec.Cmd) ([]byte, error) { + return ioutil.ReadFile("./testdata/diskpart_list_vol.txt") + }) + defer monkey.UnpatchAll() + + vols, err := new(DiskPartConfiguration).listVolumes(log4test) + So(err, ShouldBeNil) + So(len(vols), ShouldEqual, 1) + So(vols[0].ID, ShouldEqual, "1") + So(vols[0].Letter, ShouldEqual, "C") + }) +} + +func Test_rmVolumeLetter(t *testing.T) { + Convey("移除指定卷的盘符", t, func() { + var actualCmdArgs string + var cmd *exec.Cmd + monkey.PatchInstanceMethod(reflect.TypeOf(cmd), "Output", func(cmd *exec.Cmd) ([]byte, error) { + b, _ := ioutil.ReadFile(cmd.Args[len(cmd.Args)-1]) + actualCmdArgs = string(b) + return nil, nil + }) + defer monkey.UnpatchAll() + + vol := &volume{ + ID: "1", + Letter: "D", + } + dc := new(DiskPartConfiguration) + So(dc.rmVolumeLetter(log4test, vol), ShouldBeNil) + So(actualCmdArgs, ShouldEqual, fmt.Sprintf("select vol %s\r\nremove letter=%s", vol.ID, vol.Letter)) + }) +} + +func Test_exec(t *testing.T) { + Convey("执行diskpart相关命令", t, func() { + cmdArgs := "hello world" + timestamp := fmt.Sprintf("%d", time.Now().Unix()) + filename := fmt.Sprintf("diskpart_%s.txt", timestamp) + + monkey.Patch(utils.UUID, func() string { + return timestamp + }) + defer monkey.UnpatchAll() + + var cmd *exec.Cmd + monkey.PatchInstanceMethod(reflect.TypeOf(cmd), "Output", func(_ *exec.Cmd) ([]byte, error) { + b, err := ioutil.ReadFile(filename) + return []byte(fmt.Sprintf("Your command is %q", b)), err + }) + + out, err := new(DiskPartConfiguration).exec(log4test, cmdArgs) + So(err, ShouldBeNil) + So(string(out), ShouldEqual, fmt.Sprintf("Your command is %q", cmdArgs)) + }) +} + +func Test_diskSize(t *testing.T) { + Convey("获取当前磁盘容量值", t, func() { + Convey("预期当前磁盘(0)容量为25GB", func() { + var cmd *exec.Cmd + monkey.PatchInstanceMethod(reflect.TypeOf(cmd), "Output", func(_ *exec.Cmd) ([]byte, error) { + return ioutil.ReadFile("./testdata/diskpart_list_disk_gb.txt") + }) + defer monkey.UnpatchAll() + + size, err := new(DiskPartConfiguration).diskSize(log4test) + So(err, ShouldBeNil) + So(size, ShouldEqual, 25*mybytes.GB) + }) + + Convey("预期当前磁盘(1)容量为2TB", func() { + var cmd *exec.Cmd + monkey.PatchInstanceMethod(reflect.TypeOf(cmd), "Output", func(_ *exec.Cmd) ([]byte, error) { + return ioutil.ReadFile("./testdata/diskpart_list_disk_tb.txt") + }) + defer monkey.UnpatchAll() + + df := &DiskPartConfiguration{ + Disk: 1, + } + size, err := df.diskSize(log4test) + So(err, ShouldBeNil) + So(size, ShouldEqual, 2*mybytes.TB) + }) + + Convey("预期执行diskpart脚本发生错误", func() { + var ErrExec = errors.New("exec error") + var cmd *exec.Cmd + monkey.PatchInstanceMethod(reflect.TypeOf(cmd), "Output", func(_ *exec.Cmd) ([]byte, error) { + return nil, ErrExec + }) + defer monkey.UnpatchAll() + + size, err := new(DiskPartConfiguration).diskSize(log4test) + So(err, ShouldEqual, ErrExec) + So(size, ShouldEqual, 0) + }) + + Convey("预期解析diskpart脚本输出发生错误", func() { + var cmd *exec.Cmd + monkey.PatchInstanceMethod(reflect.TypeOf(cmd), "Output", func(_ *exec.Cmd) ([]byte, error) { + return ioutil.ReadFile("./testdata/diskpart_list_disk_not_selected.txt") + }) + defer monkey.UnpatchAll() + + size, err := new(DiskPartConfiguration).diskSize(log4test) + So(err, ShouldEqual, ErrDiskNotSelected) + So(size, ShouldEqual, 0) + }) + }) +} + +func Test_setup(t *testing.T) { + Convey("分区结构体初始化", t, func() { + Convey("预期当前磁盘(0)使用MBR分区", func() { + var cmd *exec.Cmd + monkey.PatchInstanceMethod(reflect.TypeOf(cmd), "Output", func(_ *exec.Cmd) ([]byte, error) { + return ioutil.ReadFile("./testdata/diskpart_list_disk_gb.txt") + }) + defer monkey.UnpatchAll() + + df := DiskPartConfiguration{ + Disk: 0, + } + So(df.setup(log4test), ShouldBeNil) + So(df.GPT, ShouldBeFalse) + }) + + Convey("预期当前磁盘(1)使用GPT分区", func() { + var cmd *exec.Cmd + monkey.PatchInstanceMethod(reflect.TypeOf(cmd), "Output", func(_ *exec.Cmd) ([]byte, error) { + return ioutil.ReadFile("./testdata/diskpart_list_disk_tb.txt") + }) + defer monkey.UnpatchAll() + + df := DiskPartConfiguration{ + Disk: 1, + } + So(df.setup(log4test), ShouldBeNil) + So(df.GPT, ShouldBeTrue) + }) + }) + +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/win/exec.go b/cyclone-server/src/idcos.io/cloudboot/utils/win/exec.go new file mode 100644 index 0000000000000000000000000000000000000000..a6b970c63ca742aa9d2deb8e51d2214ac2fff1cb --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/win/exec.go @@ -0,0 +1,117 @@ +package win + +import ( + "bytes" + "fmt" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "strings" + + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/utils" +) + +// ExecScript windows系统下,执行scriptFile标识的脚本文件,并将脚本执行的标准输出写入stdout,标准错误输出写入stderr。 +func ExecScript(scriptFile string, stdout, stderr *bytes.Buffer) (err error) { + cmd := exec.Command("cmd", "/c", scriptFile) + if stdout != nil { + cmd.Stdout = stdout + } + if stderr != nil { + cmd.Stderr = stderr + } + return cmd.Run() +} + +// ExecScriptCombinedOutput windows系统下,执行scriptFile标识的脚本文件,并将脚本执行的标准输出和标准错误输出都通过字节切片output返回。 +func ExecScriptCombinedOutput(scriptFile string) (output []byte, err error) { + return exec.Command("cmd", "/c", scriptFile).CombinedOutput() +} + +// Exec windows系统下,执行命令字符串cmdAndArgs,并将命令执行的标准输出写入stdout,标准错误输出写入stderr。 +func Exec(log logger.Logger, cmdAndArgs string, stdout, stderr *bytes.Buffer) (err error) { + scriptFile, err := GenTempScript([]byte(cmdAndArgs)) + if err != nil { + if log != nil { + log.Error(err) + } + return err + } + defer os.Remove(scriptFile) + + if log != nil { + log.Infof("Exec script %s", scriptFile) + } + if err = ExecScript(scriptFile, stdout, stderr); err != nil { + return err + } + return nil +} + +// ExecOutput windows系统下,执行命令字符串cmdAndArgs,并将命令执行的标准输出和标准错误输出都通过字节切片output返回。 +func ExecOutput(log logger.Logger, cmdAndArgs string) (output []byte, err error) { + scriptFile, err := GenTempScript([]byte(cmdAndArgs)) + if err != nil { + if log != nil { + log.Error(err) + } + return nil, err + } + defer os.Remove(scriptFile) + + if log != nil { + log.Infof("Exec script %s", scriptFile) + } + if output, err = exec.Command("cmd", "/c", scriptFile).Output(); err != nil { + if log != nil { + log.Error(err) + } + } + return output, err +} + +// ExecOutputWithLog 与ExecOutput函数功能相同,但是会输出更丰富的日志。 +func ExecOutputWithLog(log logger.Logger, cmdAndArgsUTF8 string) (outUTF8 []byte, err error) { + output, err := ExecOutput(log, cmdAndArgsUTF8) + if err != nil { + if log != nil { + log.Errorf("Exec %q err: %s\noutput:\n%s", cmdAndArgsUTF8, err, string(output)) + } + return nil, err + } + outputUTF8 := utils.GBK2UTF8(string(output)) + if log != nil { + log.Infof("%s ==>\n%s", cmdAndArgsUTF8, outputUTF8) + } + return []byte(outputUTF8), nil +} + +// ExecOneByOneWithLog 将脚本文件内容按照分隔符拆分成若干条语句并逐条执行 +func ExecOneByOneWithLog(log logger.Logger, scriptBody, sep string, continueOnError bool) { + scripts := strings.Split(scriptBody, sep) + for i := range scripts { + scripts[i] = strings.TrimSpace(scripts[i]) + if scripts[i] == "" { + continue + } + _, err := ExecOutputWithLog(log, scripts[i]) + if err == nil { + continue + } + if !continueOnError { + log.Warnf("An error occurred and terminated") + break + } + } +} + +// GenTempScript 在系统临时目录生成bat脚本文件 +func GenTempScript(content []byte) (scriptFile string, err error) { + scriptFile = filepath.Join(os.TempDir(), fmt.Sprintf("%s.bat", utils.UUID())) + if err = ioutil.WriteFile(scriptFile, content, 0744); err != nil { + return "", err + } + return scriptFile, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/win/mac.go b/cyclone-server/src/idcos.io/cloudboot/utils/win/mac.go new file mode 100644 index 0000000000000000000000000000000000000000..a4f8aa8bb693f910b52325254ee18c3b80226d03 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/win/mac.go @@ -0,0 +1,23 @@ +package win + +import ( + "regexp" + "strings" + + "idcos.io/cloudboot/logger" +) + +// MacAddress 通过本地命令查询当前设备mac地址 +func MacAddress(log logger.Logger) (addr string, err error) { + cmdArgs := `wmic nic where "NetConnectionStatus=2" get MACAddress /VALUE` + outputUTF8, err := ExecOutputWithLog(log, cmdArgs) + if err != nil { + return "", err + } + + results := regexp.MustCompile(`(?i)MACAddress=(\S+)`).FindStringSubmatch(string(outputUTF8)) + if len(results) != 2 { + return "", nil + } + return strings.TrimSpace(results[1]), nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/win/mac_test.go b/cyclone-server/src/idcos.io/cloudboot/utils/win/mac_test.go new file mode 100644 index 0000000000000000000000000000000000000000..a705360b935884138ff5984bfe262d801e71acd6 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/win/mac_test.go @@ -0,0 +1,39 @@ +package win + +import ( + "errors" + "io/ioutil" + "testing" + + "idcos.io/cloudboot/logger" + + "bou.ke/monkey" + . "github.com/smartystreets/goconvey/convey" +) + +func TestMacAddress(t *testing.T) { + Convey("获取当前设备mac地址", t, func() { + Convey("命令执行发生错误", func() { + var ErrExec = errors.New("exec error") + monkey.Patch(ExecOutputWithLog, func(_ logger.Logger, _ string) ([]byte, error) { + return nil, ErrExec + }) + defer monkey.UnpatchAll() + + sn, err := MacAddress(log4test) + So(err, ShouldEqual, ErrExec) + So(sn, ShouldBeEmpty) + }) + + Convey("命令执行输出的格式与预期一致", func() { + monkey.Patch(ExecOutputWithLog, func(_ logger.Logger, _ string) ([]byte, error) { + return ioutil.ReadFile("./testdata/mac_addr.txt") + }) + defer monkey.UnpatchAll() + + sn, err := MacAddress(log4test) + So(err, ShouldBeNil) + So(sn, ShouldEqual, "08:00:27:FB:FC:47") + }) + }) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/win/nic.go b/cyclone-server/src/idcos.io/cloudboot/utils/win/nic.go new file mode 100644 index 0000000000000000000000000000000000000000..de3300c6907dc2198f2de58de57bfce3c3410dbb --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/win/nic.go @@ -0,0 +1,109 @@ +package win + +import ( + "bufio" + "bytes" + "fmt" + "io" + "strings" + + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/utils" +) + +// RenameNICName 修改网卡名 +func RenameNICName(log logger.Logger, oldName string, newName string) error { + if log != nil { + log.Infof("Reset network connection name from %q to %q", oldName, newName) + } + cmdAndArgs := fmt.Sprintf(`netsh interface set interface name="%s" newname="%s"`, oldName, newName) + output, err := ExecOutput(log, utils.UTF82GBK(cmdAndArgs)) + if err != nil { + if log != nil { + log.Errorf("Exec %q err: %s\noutput:\n%s", cmdAndArgs, err, string(output)) + } + return err + } + outputUTF8 := utils.GBK2UTF8(string(output)) + if log != nil { + log.Infof("%s ==>\n%s", cmdAndArgs, outputUTF8) + } + return nil +} + +// DisableNIC 禁用本地连接(网卡) +func DisableNIC(log logger.Logger, name string) (err error) { + return enableOrDisableNIC(log, name, false) +} + +// DisableNICs 批量禁用本地连接(网卡) +func DisableNICs(log logger.Logger, names ...string) (err error) { + log.Infof("Start disabling NICs: %v", names) + for _, name := range names { + if err = DisableNIC(log, name); err != nil { + return err + } + } + return nil +} + +// EnableNIC 启用本地连接(网卡) +func EnableNIC(log logger.Logger, name string) (err error) { + return enableOrDisableNIC(log, name, true) +} + +// EnableNICs 批量启用本地连接(网卡) +func EnableNICs(log logger.Logger, names ...string) (err error) { + for _, name := range names { + if err = EnableNIC(log, name); err != nil { + return err + } + } + return nil +} + +func enableOrDisableNIC(log logger.Logger, name string, enable bool) (err error) { + stat := "disabled" + if enable { + stat = "enabled" + } + cmdAndArgs := fmt.Sprintf(`netsh interface set interface name="%s" admin=%s`, name, stat) + output, err := ExecOutput(log, utils.UTF82GBK(cmdAndArgs)) + if err != nil { + if log != nil { + log.Errorf("Exec %q err: %s\noutput:\n%s", cmdAndArgs, err, string(output)) + } + return err + } + outputUTF8 := utils.GBK2UTF8(string(output)) + if log != nil { + log.Infof("%s ==>\n%s", cmdAndArgs, outputUTF8) + } + return nil +} + +// GetTeam0Name 通过命令行查询team0网卡名称(对应的网络连接名称) +func GetTeam0Name(log logger.Logger) (name string, err error) { + outUTF8, err := ExecOutputWithLog(log, `wmic nic where (Name like '%%Team0%%') get NetConnectionID /value`) + if err != nil { + return "", err + } + rd := bufio.NewReader(bytes.NewBuffer(outUTF8)) + for { + line, err := rd.ReadString('\n') + if err == io.EOF { + break + } + if err != nil { + if log != nil { + log.Error(err) + } + return "", err + } + line = strings.TrimSpace(line) + if strings.Contains(line, "NetConnectionID=") { + return strings.TrimPrefix(line, "NetConnectionID="), nil + } + } + return "", nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/win/sn.go b/cyclone-server/src/idcos.io/cloudboot/utils/win/sn.go new file mode 100644 index 0000000000000000000000000000000000000000..5cde47118c0934e1e3ecc2e07ff316181cd24d47 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/win/sn.go @@ -0,0 +1,22 @@ +package win + +import ( + "regexp" + "strings" + + "idcos.io/cloudboot/logger" +) + +// PhysicalMachineSN 查询物理机SN +func PhysicalMachineSN(log logger.Logger) (sn string, err error) { + cmdArgs := `wmic bios get SerialNumber /VALUE` + outputUTF8, err := ExecOutputWithLog(log, cmdArgs) + if err != nil { + return "", err + } + results := regexp.MustCompile(`SerialNumber=(\S+)`).FindStringSubmatch(string(outputUTF8)) + if len(results) != 2 { + return "", nil + } + return strings.TrimSpace(results[1]), nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/win/sn_test.go b/cyclone-server/src/idcos.io/cloudboot/utils/win/sn_test.go new file mode 100644 index 0000000000000000000000000000000000000000..1fdb009d503556e203529972e89dbc313a30dd17 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/win/sn_test.go @@ -0,0 +1,49 @@ +package win + +import ( + "errors" + "io/ioutil" + "os" + "path/filepath" + "testing" + + "bou.ke/monkey" + . "github.com/smartystreets/goconvey/convey" + "idcos.io/cloudboot/config" + "idcos.io/cloudboot/logger" +) + +var log4test logger.Logger + +func init() { + log4test = logger.NewBeeLogger(&config.Logger{ + Level: "debug", + LogFile: filepath.Join(os.TempDir(), "gotest.log"), + }) +} +func TestPhysicalMachineSN(t *testing.T) { + Convey("获取当前设备SN", t, func() { + Convey("命令执行发生错误", func() { + var ErrExec = errors.New("exec error") + monkey.Patch(ExecOutputWithLog, func(_ logger.Logger, _ string) ([]byte, error) { + return nil, ErrExec + }) + defer monkey.UnpatchAll() + + sn, err := PhysicalMachineSN(log4test) + So(err, ShouldEqual, ErrExec) + So(sn, ShouldBeEmpty) + }) + + Convey("命令执行输出的格式与预期一致", func() { + monkey.Patch(ExecOutputWithLog, func(_ logger.Logger, _ string) ([]byte, error) { + return ioutil.ReadFile("./testdata/sn.txt") + }) + defer monkey.UnpatchAll() + + sn, err := PhysicalMachineSN(log4test) + So(err, ShouldBeNil) + So(sn, ShouldEqual, "0") + }) + }) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/win/testdata/diskpart_list_disk_gb.txt b/cyclone-server/src/idcos.io/cloudboot/utils/win/testdata/diskpart_list_disk_gb.txt new file mode 100644 index 0000000000000000000000000000000000000000..7360e1739fd51b7146d53065dadebc0e298c67d9 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/win/testdata/diskpart_list_disk_gb.txt @@ -0,0 +1,11 @@ + +Microsoft DiskPart version 6.3.9600 + +Copyright (C) 1999-2013 Microsoft Corporation. +On computer: WIN-C47GE2L79DO + +Disk 0 is now the selected disk. + + Disk ### Status Size Free Dyn Gpt + -------- ------------- ------- ------- --- --- +* Disk 0 Online 25 GB 0 B diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/win/testdata/diskpart_list_disk_not_selected.txt b/cyclone-server/src/idcos.io/cloudboot/utils/win/testdata/diskpart_list_disk_not_selected.txt new file mode 100644 index 0000000000000000000000000000000000000000..87f7af3b1b554dbda06981c15d75eae2ab68d829 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/win/testdata/diskpart_list_disk_not_selected.txt @@ -0,0 +1,12 @@ + +Microsoft DiskPart version 6.3.9600 + +Copyright (C) 1999-2013 Microsoft Corporation. +On computer: WIN-C47GE2L79DO + +Disk 0 is now the selected disk. + + Disk ### Status Size Free Dyn Gpt + -------- ------------- ------- ------- --- --- + Disk 0 Online 25 GB 0 B + Disk 1 Online 2 TB 0 B diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/win/testdata/diskpart_list_disk_tb.txt b/cyclone-server/src/idcos.io/cloudboot/utils/win/testdata/diskpart_list_disk_tb.txt new file mode 100644 index 0000000000000000000000000000000000000000..140fd9159d6c4fa4e8ad18e0ee9458541b8fea91 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/win/testdata/diskpart_list_disk_tb.txt @@ -0,0 +1,12 @@ + +Microsoft DiskPart version 6.3.9600 + +Copyright (C) 1999-2013 Microsoft Corporation. +On computer: WIN-C47GE2L79DO + +Disk 0 is now the selected disk. + + Disk ### Status Size Free Dyn Gpt + -------- ------------- ------- ------- --- --- + Disk 0 Online 25 GB 0 B +* Disk 1 Online 2 TB 0 B diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/win/testdata/diskpart_list_vol.txt b/cyclone-server/src/idcos.io/cloudboot/utils/win/testdata/diskpart_list_vol.txt new file mode 100644 index 0000000000000000000000000000000000000000..06c8e43c3f3a9de1b0e3010baa3aea297479f73e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/win/testdata/diskpart_list_vol.txt @@ -0,0 +1,14 @@ + +Microsoft DiskPart version 6.3.9600 + +Copyright (C) 1999-2013 Microsoft Corporation. +On computer: WIN-C47GE2L79DO + +Disk 0 is now the selected disk. + +Volume 1 is the selected volume. + + Volume ### Ltr Label Fs Type Size Status Info + ---------- --- ----------- ----- ---------- ------- --------- -------- + Volume 0 ???? NTFS Partition 350 MB Healthy System +* Volume 1 C NTFS Partition 24 GB Healthy Boot diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/win/testdata/mac_addr.txt b/cyclone-server/src/idcos.io/cloudboot/utils/win/testdata/mac_addr.txt new file mode 100644 index 0000000000000000000000000000000000000000..916cc49e8dbbb7d48cba1214ad9705a1418b8a36 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/win/testdata/mac_addr.txt @@ -0,0 +1,5 @@ +C:\Users\Administrator>wmic nic where "NetConnectionStatus=2" get MACAddress /VALUE + +MACAddress=08:00:27:FB:FC:47 + + diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/win/testdata/post_install_script.txt b/cyclone-server/src/idcos.io/cloudboot/utils/win/testdata/post_install_script.txt new file mode 100644 index 0000000000000000000000000000000000000000..19c5fd6a90ea7c66b10aedda0503262bd2ec9b20 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/win/testdata/post_install_script.txt @@ -0,0 +1,131 @@ +@echo on + +:: 移动 zabbix-agent +move c:\install\zabbix_agents_3.0.4.win c:\zabbix_agents_3.0.4.win + +:: 安装 zabbix_agent +powershell -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -File C:\zabbix_agents_3.0.4.win\zabbix_agent_install.ps1 {ZabbixProxy} + +:: 安装 hadoop +powershell -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile C:\install\hadoop\zorkagent_install.ps1 {BigdataRoute3} {BigdataID} + +:: 设置 ntp server +reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\W32Time\Parameters" /v "NtpServer" /d "{NTP1},0x9 {NTP2},0x9 {NTP3},0x9" /t REG_SZ /f +reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\W32Time\Parameters" /v "Type" /d "NTP" /t REG_SZ /f +reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\W32Time\TimeProviders\NtpClient" /v "SpecialPollInterval" /d "900" /t REG_DWORD /f +reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\W32Time\Config" /v "MaxAllowedPhaseOffset" /d "300" /t REG_DWORD /f +sc triggerinfo w32time delete +sc config w32time start= auto +net start w32time +w32tm /resync + +:: 挂载Z盘 +net use Z: \\osinstall.idcos.com\image + +:: if SAN exits +if "{SANStore}" == "Yes" ( + xcopy /s /e /y /i Z:\windows\san C:\install\san + start /wait C:\install\san\sansurfer\scli-1.7.3-37.windows.exe /s +:: start /wait C:\install\san\hdlm\HDLM_Windows\DLMTools\installhdlm.exe -f C:\install\san\hdlm\HDLM_Windows\DLMTools\sample_installhdlm.ini +) + +:: if NBU exits +if "{IsNeedNBU}" == "Yes" ( + xcopy /y /i Z:\windows\NetBackup_7.7.3_Win.zip C:\install\self-install +) + +:: if is DMZ +if "{Symantec}" == "ddd.ddd.ddd.ddd" ( + xcopy /s /e /y /i Z:\windows\kcaom\kcaom-dmz C:\kcaom + xcopy /s /e /y /i Z:\windows\anti_virus\anti_virus_dmz C:\install\anti_virus_dmz + xcopy /s /e /y /i Z:\windows\wsus\wsus-dmz.ps1 C:\install\wsus\ + start /wait C:\install\anti_virus_dmz\setup.exe + powershell -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile C:\install\kcaom-agent.ps1 + powershell -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -File C:\install\wsus\wsus-dmz.ps1 +) + +:: if is NO_DMZ +if "{Symantec}" == "ddd.ddd.ddd.ddd" ( + xcopy /s /e /y /i Z:\windows\kcaom\kcaom-nodmz C:\kcaom + xcopy /s /e /y /i Z:\windows\anti_virus\anti_virus_no_dmz C:\install\anti_virus_no_dmz + xcopy /s /e /y /i Z:\windows\wsus\wsus-nodmz.ps1 C:\install\wsus\ + start /wait C:\install\anti_virus_no_dmz\setup.exe + powershell -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile C:\install\kcaom-agent.ps1 + powershell -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -File C:\install\wsus\wsus-nodmz.ps1 +) + +:: if is shanghai_deposit +if "{Symantec}" == "ddd.ddd.ddd.ddd" ( + xcopy /s /e /y /i Z:\windows\anti_virus\shanghai_deposit C:\install\shanghai_deposit + xcopy /s /e /y /i Z:\windows\wsus\wsus-sh-depost.ps1 C:\install\wsus\ + start /wait C:\install\shanghai_deposit\setup.exe + powershell -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -File C:\install\wsus\wsus-sh-depost.ps1 +) + +:: if is shanghai_trade +if "{Symantec}" == "ddd.ddd.ddd.ddd" ( + xcopy /s /e /y /i Z:\windows\anti_virus\shanghai_trade C:\install\shanghai_trade + xcopy /s /e /y /i Z:\windows\wsus\wsus-sh-trade.ps1 C:\install\wsus\ + start /wait C:\install\shanghai_trade\setup.exe + powershell -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -File C:\install\wsus\wsus-sh-trade.ps1 +) + +:: 卸载Z盘 +net use Z: /delete + +:: Baseline +call C:\install\win2012-baseline\baseline-2012.bat + +:: 禁用 UAC +reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v EnableLUA /t REG_DWORD /d 0 /f + +:: 开启远程桌面 +reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f +reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 0 /f + +:: 设置 MaxUserPort 为 65534 +reg add "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v MaxUserPort /t REG_DWORD /d 65534 /f + +:: 设置显示桌面图标 +powershell -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -File C:\install\ShowDesktopIcons.ps1 + +:: 设置默认英文输入法 +powershell -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile -File C:\install\SetUserLanguageList.ps1 + +:: 安装 7-zip +start /wait C:\install\7zip-4.6.5.exe /S + +:: 安装 cmdb +start /wait cscript C:\install\cmdb_agent\agent_install_windows_luoji.vbs 127.0.0.1 + +:: 关闭防火墙 +netsh advfirewall set allprofiles state off + +:: 用户重命名 +wmic useraccount where name='Administrator' rename dgadmin + +:: 设置初始密码 +net user dgadmin gxzq@82130833 + +:: 设置下一次登录修改密码 +:: net user dgadmin /logonpasswordchg:yes + +:: 修改磁盘卷标 +wmic logicaldisk where "deviceid='c:'" set volumename="sys" +wmic logicaldisk where "deviceid='d:'" set volumename="data" + +:: 添加静态路由 +if not "{StaticRT}" == "" ( +route add -p 10.0.0.0 mask 255.0.0.0 {StaticRT} +route add -p 172.16.0.0 mask 255.240.0.0 {StaticRT} +route add -p 192.168.0.0 mask 255.255.0.0 {StaticRT} +) + +:: 设置电源高性能方案 +C:\install\high_performance.bat + +:: 设置powershell执行策略 +powershell -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile set-executionpolicy unrestricted -confirm:$false + +:: 健康检查 +call C:\firstboot\health-check.exe \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/win/testdata/sn.txt b/cyclone-server/src/idcos.io/cloudboot/utils/win/testdata/sn.txt new file mode 100644 index 0000000000000000000000000000000000000000..a26a73cad0703ef96f155640dd438f98d8853a89 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/win/testdata/sn.txt @@ -0,0 +1,6 @@ +C:\Users\Administrator>wmic bios get SerialNumber /VALUE + + +SerialNumber=0 + + diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/logicaldisk.go b/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/logicaldisk.go new file mode 100644 index 0000000000000000000000000000000000000000..9228a46417a0ecfd7f1aceaf497c859772707679 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/logicaldisk.go @@ -0,0 +1,68 @@ +package wmic + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "io" + "regexp" + "strconv" + "strings" + + "idcos.io/cloudboot/logger" + winutil "idcos.io/cloudboot/utils/win" +) + +var naturalNumReg = regexp.MustCompile("^[0-9]+$") // 自然数正则表达式 + +var ( + // ErrDiskNotFound 指定的磁盘不存在错误 + ErrDiskNotFound = errors.New("disk not found") +) + +// DiskSize 获取指定磁盘(如)的容量大小(byte)。 +// 若指定的磁盘不存在,则返回ErrDiskNotFound错误。 +func DiskSize(log logger.Logger, disk string) (size int64, err error) { + output, err := logicalDiskGet(log, disk, "Size") + if err != nil { + return 0, err + } + rd := bufio.NewReader(bytes.NewBuffer(output)) + for { + line, err := rd.ReadString('\n') + if err == io.EOF { + break + } + if err != nil { + if log != nil { + log.Error(err) + } + return 0, err + } + line = strings.TrimSpace(line) + if strings.Contains(line, "No Instance(s) Available") { + return 0, ErrDiskNotFound + } + if naturalNumReg.MatchString(line) { + return strconv.ParseInt(line, 10, 64) + } + } + return size, nil +} + +// 示例:wmic logicaldisk where name="C:" get Size,Name +func logicalDiskGet(log logger.Logger, disk string, properties ...string) (output []byte, err error) { + cmdAndArgs := fmt.Sprintf("wmic logicaldisk where name=%q get %s", disk, strings.Join(properties, ",")) + output, err = winutil.ExecOutput(log, cmdAndArgs) + if err != nil { + if log != nil { + log.Errorf("Exec %q err: %s\noutput:\n%s", cmdAndArgs, err, string(output)) + } + return nil, err + } + if log != nil { + log.Infof("%s ==>\n%s", cmdAndArgs, string(output)) + } + return output, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/nic.go b/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/nic.go new file mode 100644 index 0000000000000000000000000000000000000000..aa613cd54dbc57d6e03944e010f471ace60d8d24 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/nic.go @@ -0,0 +1,141 @@ +package wmic + +import ( + "bufio" + "bytes" + "fmt" + "io" + "strings" + + "idcos.io/cloudboot/logger" + winutil "idcos.io/cloudboot/utils/win" +) + +var ( +// ErrNICNotFound nic不存在 +// ErrNICNotFound = errors.New("nic not found") +) + +// NIC 网卡信息 +type NIC struct { + MacAddr string `json:"MacAddress"` // MAC地址 + NetConnID string `json:"NetConnectionID"` // 网卡名 +} + +// FindNICByMacAddr 根据mac地址查找网卡信息结构体指针 +func FindNICByMacAddr(nics []NIC, addr string) (nic *NIC) { + addr = strings.ToLower(addr) + for i := range nics { + if strings.ToLower(nics[i].MacAddr) == addr { + return &nics[i] + } + } + return nil +} + +// RmNIC 从集合中移除指定名称的网卡 +func RmNIC(nics []NIC, id string) (news []NIC) { + if id == "" { + return nics + } + id = strings.ToLower(id) + for i := range nics { + if strings.ToLower(nics[i].NetConnID) != id { + news = append(news, nics[i]) + } + } + return news +} + +// GetNIC 通过执行本地命令查询网卡信息 +func GetNIC(log logger.Logger) (list []NIC, err error) { + output, err := nicGet(log, "PhysicalAdapter=TRUE", "MACAddress", "NetConnectionID") + if err != nil { + return nil, err + } + return parseNICGetOutput(log, output) +} + +// Get10GNICs 查询万兆网卡列表 +func Get10GNICs(log logger.Logger) (list []NIC, err error) { + output, err := nicGet(log, `PhysicalAdapter=TRUE and Name like '%%10G%%'`, "MACAddress", "NetConnectionID") + if err != nil { + return nil, err + } + return parseNICGetOutput(log, output) +} + +// Get1GNICs 查询千兆网卡列表 +func Get1GNICs(log logger.Logger) (list []NIC, err error) { + output, err := nicGet(log, `PhysicalAdapter=TRUE and not Name like '%%10G%%'`, "MACAddress", "Name", "NetConnectionID") // 假定排查掉所有万兆后,剩下的都是千兆网卡。 + if err != nil { + return nil, err + } + return parseNICGetOutput(log, output) +} + +// GetNICByMacAddr 根据mac地址查询网卡信息 +func GetNICByMacAddr(log logger.Logger, macAddr string) (nic *NIC, err error) { + output, err := nicGet(log, fmt.Sprintf(`PhysicalAdapter=TRUE and MACAddress=%q`, macAddr), "MACAddress", "NetConnectionID") + if err != nil { + return nil, err + } + list, err := parseNICGetOutput(log, output) + if err != nil { + return nil, err + } + if len(list) <= 0 { + return nil, nil + } + log.Debugf("%s --> %#v", macAddr, list[0]) + return &list[0], nil +} + +// parseNICGetOutput 解析形如wmic nic where "xxxx" get MACAddress,NetConnectionID /format:csv命令输出信息 +func parseNICGetOutput(log logger.Logger, outUTF8 []byte) (list []NIC, err error) { + rd := bufio.NewReader(bytes.NewBuffer(outUTF8)) + var started bool //标识正文开始 + for { + line, err := rd.ReadString('\n') + if err == io.EOF { + break + } + if err != nil { + if log != nil { + log.Error(err) + } + return nil, err + } + line = strings.TrimSpace(line) + if strings.Contains(line, "没有可用实例") { + // return nil, ErrNICNotFound + return nil, nil + } + + if line == "Node,MACAddress,NetConnectionID" { + started = true + continue + } + + if !started { + continue + } + + properties := strings.Split(line, ",") + if len(properties) != 3 { + continue + } + + list = append(list, NIC{ + MacAddr: strings.TrimSpace(properties[1]), + NetConnID: strings.TrimSpace(properties[2]), + }) + } + return list, nil +} + +func nicGet(log logger.Logger, where string, properties ...string) (output []byte, err error) { + // 示例:wmic nic where "PhysicalAdapter=TRUE" get MACAddress,Name,NetConnectionID /format:csv + cmdAndArgs := fmt.Sprintf(`wmic nic where "%s" get %s /format:csv`, where, strings.Join(properties, ",")) + return winutil.ExecOutputWithLog(log, cmdAndArgs) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/nic_test.go b/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/nic_test.go new file mode 100644 index 0000000000000000000000000000000000000000..f97e2d9fb951968ffae1e0b2880044edb5bf142e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/nic_test.go @@ -0,0 +1,62 @@ +package wmic + +import ( + "io/ioutil" + "os" + "path/filepath" + "testing" + + "bou.ke/monkey" + . "github.com/smartystreets/goconvey/convey" + "idcos.io/cloudboot/config" + "idcos.io/cloudboot/logger" +) + +var log4test logger.Logger + +func init() { + log4test = logger.NewBeeLogger(&config.Logger{ + Level: "debug", + LogFile: filepath.Join(os.TempDir(), "gotest.log"), + }) +} + +func TestGetNIC(t *testing.T) { + Convey("执行命令行命令查询本地网卡信息", t, func() { + Convey("本地有多块网卡", func() { + monkey.Patch(nicGet, func(log logger.Logger, where string, properties ...string) (output []byte, err error) { + outputUTF8, err := ioutil.ReadFile("./testdata/nic_get_more.output") + if err != nil { + return nil, err + } + return []byte(string(outputUTF8)), nil + }) + defer monkey.Unpatch(nicGet) + + nics, err := GetNIC(log4test) + So(err, ShouldBeNil) + So(len(nics), ShouldEqual, 2) + So(nics[0].MacAddr, ShouldEqual, "08:00:27:FB:FC:47") + So(nics[0].NetConnID, ShouldEqual, "以太网") + So(nics[1].MacAddr, ShouldEqual, "08:00:28:FB:FC:48") + So(nics[1].NetConnID, ShouldEqual, "test") + }) + + Convey("本地仅有一块网卡", func() { + monkey.Patch(nicGet, func(log logger.Logger, where string, properties ...string) (output []byte, err error) { + outputUTF8, err := ioutil.ReadFile("./testdata/nic_get_one.output") + if err != nil { + return nil, err + } + return []byte(string(outputUTF8)), nil + }) + defer monkey.Unpatch(nicGet) + + nics, err := GetNIC(log4test) + So(err, ShouldBeNil) + So(len(nics), ShouldEqual, 1) + So(nics[0].MacAddr, ShouldEqual, "08:00:27:FB:FC:47") + So(nics[0].NetConnID, ShouldEqual, "以太网") + }) + }) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/nicconfig.go b/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/nicconfig.go new file mode 100644 index 0000000000000000000000000000000000000000..cfa8e1929671c3ccc4c600861044f35253625cf8 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/nicconfig.go @@ -0,0 +1,49 @@ +package wmic + +import ( + "bufio" + "bytes" + "io" + "strings" + + "idcos.io/cloudboot/logger" + winutil "idcos.io/cloudboot/utils/win" +) + +// DNSSetting 查询DNS设置 +func DNSSetting(log logger.Logger) (setting string, err error) { + cmdAndArgs := "wmic nicconfig where IPEnabled=True get DNSServerSearchOrder /value" + output, err := winutil.ExecOutput(log, cmdAndArgs) + if err != nil { + if log != nil { + log.Errorf("Exec %q err: %s\noutput:\n%s", cmdAndArgs, err, string(output)) + } + return "", err + } + if log != nil { + log.Infof("%s ==>\n%s", cmdAndArgs, string(output)) + } + // 示例:DNSServerSearchOrder={"192.168.0.1","10.0.0.1"} + rd := bufio.NewReader(bytes.NewBuffer(output)) + for { + line, err := rd.ReadString('\n') + if err == io.EOF { + break + } + if err != nil { + if log != nil { + log.Error(err) + } + return "", err + } + line = strings.TrimSpace(line) + if strings.Contains(line, "DNSServerSearchOrder=") { + pair := strings.Split(line, "=") + if len(pair) < 2 { + return "", nil + } + return strings.TrimSpace(pair[1]), nil + } + } + return "", nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/partition.go b/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/partition.go new file mode 100644 index 0000000000000000000000000000000000000000..b60ffb0f9632c558711b4d30d31363b4482faa2a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/partition.go @@ -0,0 +1,41 @@ +package wmic + +import ( + "errors" + "fmt" + "strconv" + "strings" + + "idcos.io/cloudboot/logger" + winutil "idcos.io/cloudboot/utils/win" +) + +// ErrKeywordsNotFound 标准输出中用于解析用的关键字不存在 +var ErrKeywordsNotFound = errors.New("keywords not found") + +// PartitionSizeByIndex 根据索引查询分区的大小(单位字节) +func PartitionSizeByIndex(log logger.Logger, index int) (byteSize int64, err error) { + cmdAndArgs := fmt.Sprintf("wmic partition where Index=%d get Size /value", index) + output, err := winutil.ExecOutput(log, cmdAndArgs) + if err != nil { + if log != nil { + log.Errorf("Exec %q err: %s\noutput:\n%s", cmdAndArgs, err, string(output)) + } + return 0, err + } + if log != nil { + log.Infof("%s ==>\n%s", cmdAndArgs, string(output)) + } + + outstr := strings.TrimSpace(string(output)) + idx := strings.Index(outstr, "Size=") + if idx < 0 { + return 0, ErrKeywordsNotFound + } + + sSize := outstr[idx+len("Size="):] + if byteSize, err = strconv.ParseInt(sSize, 10, 64); err != nil && log != nil { + log.Errorf("Parse string value %q to integer value error: %s", sSize, err) + } + return byteSize, err +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/partition_test.go b/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/partition_test.go new file mode 100644 index 0000000000000000000000000000000000000000..71de41626228452e552d9d4ec9f887247d40e8f6 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/partition_test.go @@ -0,0 +1,69 @@ +package wmic + +import ( + "errors" + "io/ioutil" + "testing" + + "bou.ke/monkey" + . "github.com/smartystreets/goconvey/convey" + "idcos.io/cloudboot/logger" + "idcos.io/cloudboot/utils" + winutil "idcos.io/cloudboot/utils/win" +) + +func TestPartitionSizeByIndex(t *testing.T) { + Convey("根据索引查询分区的大小(单位字节)", t, func() { + Convey("命令行查询获得正整数值", func() { + monkey.Patch(winutil.ExecOutput, func(log logger.Logger, cmdAndArgs string) (output []byte, err error) { + outputUTF8, err := ioutil.ReadFile("./testdata/partition.output") + if err != nil { + return nil, err + } + return []byte(utils.UTF82GBK(string(outputUTF8))), nil + }) + defer monkey.Unpatch(winutil.ExecOutput) + + size, err := PartitionSizeByIndex(log4test, 0) + So(err, ShouldBeNil) + So(size, ShouldEqual, 367001600) + }) + + Convey("命令行查询获得非整数值", func() { + Convey("命令执行的标准输出中不包含解析关键字", func() { + monkey.Patch(winutil.ExecOutput, func(log logger.Logger, cmdAndArgs string) (output []byte, err error) { + return []byte(utils.UTF82GBK(string(`helloworld`))), nil + }) + defer monkey.Unpatch(winutil.ExecOutput) + + size, err := PartitionSizeByIndex(log4test, 0) + So(err, ShouldEqual, ErrKeywordsNotFound) + So(size, ShouldEqual, 0) + }) + + Convey("命令执行的标准输出中包含解析关键字,但对应的值不是整数", func() { + monkey.Patch(winutil.ExecOutput, func(log logger.Logger, cmdAndArgs string) (output []byte, err error) { + return []byte(utils.UTF82GBK(string("C:\firstboot>wmic partition where Index=0 get Size /value\r\nSize=xxxx"))), nil + }) + defer monkey.Unpatch(winutil.ExecOutput) + + size, err := PartitionSizeByIndex(log4test, 0) + So(err, ShouldNotBeNil) + So(size, ShouldEqual, 0) + }) + }) + + Convey("命令行查询进程意外退出", func() { + var ErrExec = errors.New("exec error") + monkey.Patch(winutil.ExecOutput, func(log logger.Logger, cmdAndArgs string) (output []byte, err error) { + return nil, ErrExec + }) + defer monkey.Unpatch(winutil.ExecOutput) + + size, err := PartitionSizeByIndex(log4test, 0) + So(err, ShouldNotBeNil) + So(err, ShouldEqual, ErrExec) + So(size, ShouldEqual, 0) + }) + }) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/process.go b/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/process.go new file mode 100644 index 0000000000000000000000000000000000000000..4c22c6792d1ea08d79012b306054d82f6ef841ba --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/process.go @@ -0,0 +1,34 @@ +package wmic + +import ( + "fmt" + "strings" + + "idcos.io/cloudboot/logger" + winutil "idcos.io/cloudboot/utils/win" +) + +// IsProcessRunning 判断指定名称的进程是否存在 +func IsProcessRunning(log logger.Logger, processName string) (running bool, err error) { + output, err := processGet(log, "Caption") + if err != nil { + return false, err + } + return strings.Contains(string(output), processName), nil // TODO 需要一行一行遍历判断是否存在该进程 +} + +// 示例 wmic process get Caption,Name +func processGet(log logger.Logger, properties ...string) (output []byte, err error) { + cmdAndArgs := fmt.Sprintf("wmic process get %s", strings.Join(properties, ",")) + output, err = winutil.ExecOutput(log, cmdAndArgs) + if err != nil { + if log != nil { + log.Errorf("Exec %q err: %s\noutput:\n%s", cmdAndArgs, err, string(output)) + } + return nil, err + } + if log != nil { + log.Infof("%s ==>\n%s", cmdAndArgs, string(output)) + } + return output, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/testdata/nic_get_more.output b/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/testdata/nic_get_more.output new file mode 100644 index 0000000000000000000000000000000000000000..94131c26637193205667979bebeab568c60cac20 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/testdata/nic_get_more.output @@ -0,0 +1,5 @@ +C:\Users\Administrator>wmic nic where "PhysicalAdapter=TRUE" get MACAddress,NetConnectionID /format:csv + +Node,MACAddress,NetConnectionID +WIN-C47GE2L79DO,08:00:27:FB:FC:47,以太网 +WIN-C47GE2L79DO,08:00:28:FB:FC:48,test diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/testdata/nic_get_one.output b/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/testdata/nic_get_one.output new file mode 100644 index 0000000000000000000000000000000000000000..01c9e9a64769b5d9927ce7ccecb484933d7f93eb --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/testdata/nic_get_one.output @@ -0,0 +1,4 @@ +C:\Users\Administrator>wmic nic where "PhysicalAdapter=TRUE" get MACAddress,NetConnectionID /format:csv + +Node,MACAddress,NetConnectionID +WIN-C47GE2L79DO,08:00:27:FB:FC:47,以太网 diff --git a/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/testdata/partition.output b/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/testdata/partition.output new file mode 100644 index 0000000000000000000000000000000000000000..8e0335479005d9511b1cb8b8019a98734e496cd5 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/utils/win/wmic/testdata/partition.output @@ -0,0 +1,8 @@ + +C:\firstboot>wmic partition where Index=0 get Size /value + + + +Size=367001600 + + diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/LICENSE.md b/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/LICENSE.md new file mode 100644 index 0000000000000000000000000000000000000000..c591ea09cc9d7077ad79979989abfe496bae791f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/LICENSE.md @@ -0,0 +1,3 @@ +Copyright Bouke van der Bijl + +I do not give anyone permissions to use this tool for any purpose. Don't use it. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/README.md b/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/README.md new file mode 100644 index 0000000000000000000000000000000000000000..6976d5c1b2804cba59fab376edcb6c2fb490c833 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/README.md @@ -0,0 +1,112 @@ +# Go monkeypatching :monkey_face: :monkey: + +Actual arbitrary monkeypatching for Go. Yes really. + +Read this blogpost for an explanation on how it works: https://bou.ke/blog/monkey-patching-in-go/ + +## I thought that monkeypatching in Go is impossible? + +It's not possible through regular language constructs, but we can always bend computers to our will! Monkey implements monkeypatching by rewriting the running executable at runtime and inserting a jump to the function you want called instead. **This is as unsafe as it sounds and I don't recommend anyone do it outside of a testing environment.** + +Make sure you read the notes at the bottom of the README if you intend to use this library. + +## Using monkey + +Monkey's API is very simple and straightfoward. Call `monkey.Patch(<target function>, <replacement function>)` to replace a function. For example: + +```go +package main + +import ( + "fmt" + "os" + "strings" + + "bou.ke/monkey" +) + +func main() { + monkey.Patch(fmt.Println, func(a ...interface{}) (n int, err error) { + s := make([]interface{}, len(a)) + for i, v := range a { + s[i] = strings.Replace(fmt.Sprint(v), "hell", "*bleep*", -1) + } + return fmt.Fprintln(os.Stdout, s...) + }) + fmt.Println("what the hell?") // what the *bleep*? +} +``` + +You can then call `monkey.Unpatch(<target function>)` to unpatch the method again. The replacement function can be any function value, whether it's anonymous, bound or otherwise. + +If you want to patch an instance method you need to use `monkey.PatchInstanceMethod(<type>, <name>, <replacement>)`. You get the type by using `reflect.TypeOf`, and your replacement function simply takes the instance as the first argument. To disable all network connections, you can do as follows for example: + +```go +package main + +import ( + "fmt" + "net" + "net/http" + "reflect" + + "bou.ke/monkey" +) + +func main() { + var d *net.Dialer // Has to be a pointer to because `Dial` has a pointer receiver + monkey.PatchInstanceMethod(reflect.TypeOf(d), "Dial", func(_ *net.Dialer, _, _ string) (net.Conn, error) { + return nil, fmt.Errorf("no dialing allowed") + }) + _, err := http.Get("http://google.com") + fmt.Println(err) // Get http://google.com: no dialing allowed +} + +``` + +Note that patching the method for just one instance is currently not possible, `PatchInstanceMethod` will patch it for all instances. Don't bother trying `monkey.Patch(instance.Method, replacement)`, it won't work. `monkey.UnpatchInstanceMethod(<type>, <name>)` will undo `PatchInstanceMethod`. + +If you want to remove all currently applied monkeypatches simply call `monkey.UnpatchAll`. This could be useful in a test teardown function. + +If you want to call the original function from within the replacement you need to use a `monkey.PatchGuard`. A patchguard allows you to easily remove and restore the patch so you can call the original function. For example: + +```go +package main + +import ( + "fmt" + "net/http" + "reflect" + "strings" + + "bou.ke/monkey" +) + +func main() { + var guard *monkey.PatchGuard + guard = monkey.PatchInstanceMethod(reflect.TypeOf(http.DefaultClient), "Get", func(c *http.Client, url string) (*http.Response, error) { + guard.Unpatch() + defer guard.Restore() + + if !strings.HasPrefix(url, "https://") { + return nil, fmt.Errorf("only https requests allowed") + } + + return c.Get(url) + }) + + _, err := http.Get("http://google.com") + fmt.Println(err) // only https requests allowed + resp, err := http.Get("https://google.com") + fmt.Println(resp.Status, err) // 200 OK <nil> +} +``` + +## Notes + +1. Monkey sometimes fails to patch a function if inlining is enabled. Try running your tests with inlining disabled, for example: `go test -gcflags=-l`. The same command line argument can also be used for build. +2. Monkey won't work on some security-oriented operating system that don't allow memory pages to be both write and execute at the same time. With the current approach there's not really a reliable fix for this. +3. Monkey is not threadsafe. Or any kind of safe. +4. I've tested monkey on OSX 10.10.2 and Ubuntu 14.04. It should work on any unix-based x86 or x86-64 system. + +© Bouke van der Bijl diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/circle.yml b/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/circle.yml new file mode 100644 index 0000000000000000000000000000000000000000..0647bfeac5608a0ca748f90492ff851d3d9ca145 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/circle.yml @@ -0,0 +1,3 @@ +test: + override: + - script/test diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/monkey.go b/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/monkey.go new file mode 100644 index 0000000000000000000000000000000000000000..9906928d46b66090421d69806da26b57da9ec5e8 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/monkey.go @@ -0,0 +1,133 @@ +package monkey // import "bou.ke/monkey" + +import ( + "fmt" + "reflect" + "sync" + "unsafe" +) + +// patch is an applied patch +// needed to undo a patch +type patch struct { + originalBytes []byte + replacement *reflect.Value +} + +var ( + lock = sync.Mutex{} + + patches = make(map[uintptr]patch) +) + +type value struct { + _ uintptr + ptr unsafe.Pointer +} + +func getPtr(v reflect.Value) unsafe.Pointer { + return (*value)(unsafe.Pointer(&v)).ptr +} + +type PatchGuard struct { + target reflect.Value + replacement reflect.Value +} + +func (g *PatchGuard) Unpatch() { + unpatchValue(g.target) +} + +func (g *PatchGuard) Restore() { + patchValue(g.target, g.replacement) +} + +// Patch replaces a function with another +func Patch(target, replacement interface{}) *PatchGuard { + t := reflect.ValueOf(target) + r := reflect.ValueOf(replacement) + patchValue(t, r) + + return &PatchGuard{t, r} +} + +// PatchInstanceMethod replaces an instance method methodName for the type target with replacement +// Replacement should expect the receiver (of type target) as the first argument +func PatchInstanceMethod(target reflect.Type, methodName string, replacement interface{}) *PatchGuard { + m, ok := target.MethodByName(methodName) + if !ok { + panic(fmt.Sprintf("unknown method %s", methodName)) + } + r := reflect.ValueOf(replacement) + patchValue(m.Func, r) + + return &PatchGuard{m.Func, r} +} + +func patchValue(target, replacement reflect.Value) { + lock.Lock() + defer lock.Unlock() + + if target.Kind() != reflect.Func { + panic("target has to be a Func") + } + + if replacement.Kind() != reflect.Func { + panic("replacement has to be a Func") + } + + if target.Type() != replacement.Type() { + panic(fmt.Sprintf("target and replacement have to have the same type %s != %s", target.Type(), replacement.Type())) + } + + if patch, ok := patches[target.Pointer()]; ok { + unpatch(target.Pointer(), patch) + } + + bytes := replaceFunction(target.Pointer(), (uintptr)(getPtr(replacement))) + patches[target.Pointer()] = patch{bytes, &replacement} +} + +// Unpatch removes any monkey patches on target +// returns whether target was patched in the first place +func Unpatch(target interface{}) bool { + return unpatchValue(reflect.ValueOf(target)) +} + +// UnpatchInstanceMethod removes the patch on methodName of the target +// returns whether it was patched in the first place +func UnpatchInstanceMethod(target reflect.Type, methodName string) bool { + m, ok := target.MethodByName(methodName) + if !ok { + panic(fmt.Sprintf("unknown method %s", methodName)) + } + return unpatchValue(m.Func) +} + +// UnpatchAll removes all applied monkeypatches +func UnpatchAll() { + lock.Lock() + defer lock.Unlock() + for target, p := range patches { + unpatch(target, p) + delete(patches, target) + } +} + +// Unpatch removes a monkeypatch from the specified function +// returns whether the function was patched in the first place +func unpatchValue(target reflect.Value) bool { + lock.Lock() + defer lock.Unlock() + patch, ok := patches[target.Pointer()] + if !ok { + return false + } + unpatch(target.Pointer(), patch) + delete(patches, target.Pointer()) + return true +} + +func unpatch(target uintptr, p patch) { + copyToLocation(target, p.originalBytes) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/monkey_386.go b/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/monkey_386.go new file mode 100644 index 0000000000000000000000000000000000000000..16ed7930deab93501c3387cd7392ff1f59b6ba2d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/monkey_386.go @@ -0,0 +1,13 @@ +package monkey + +// Assembles a jump to a function value +func jmpToFunctionValue(to uintptr) []byte { + return []byte{ + 0xBA, + byte(to), + byte(to >> 8), + byte(to >> 16), + byte(to >> 24), // mov edx,to + 0xFF, 0x22, // jmp DWORD PTR [edx] + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/monkey_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/monkey_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..c21da5d5afaf95eb4d7dcccd8d10da2fc9db453a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/monkey_amd64.go @@ -0,0 +1,17 @@ +package monkey + +// Assembles a jump to a function value +func jmpToFunctionValue(to uintptr) []byte { + return []byte{ + 0x48, 0xBA, + byte(to), + byte(to >> 8), + byte(to >> 16), + byte(to >> 24), + byte(to >> 32), + byte(to >> 40), + byte(to >> 48), + byte(to >> 56), // movabs rdx,to + 0xFF, 0x22, // jmp QWORD PTR [rdx] + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/replace.go b/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/replace.go new file mode 100644 index 0000000000000000000000000000000000000000..1e34742911d167c65d19f4a6c2f1248625bda4c0 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/replace.go @@ -0,0 +1,31 @@ +package monkey + +import ( + "reflect" + "syscall" + "unsafe" +) + +func rawMemoryAccess(p uintptr, length int) []byte { + return *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{ + Data: p, + Len: length, + Cap: length, + })) +} + +func pageStart(ptr uintptr) uintptr { + return ptr & ^(uintptr(syscall.Getpagesize() - 1)) +} + +// from is a pointer to the actual function +// to is a pointer to a go funcvalue +func replaceFunction(from, to uintptr) (original []byte) { + jumpData := jmpToFunctionValue(to) + f := rawMemoryAccess(from, len(jumpData)) + original = make([]byte, len(f)) + copy(original, f) + + copyToLocation(from, jumpData) + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/replace_unix.go b/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/replace_unix.go new file mode 100644 index 0000000000000000000000000000000000000000..34b100f311064aed93fd66623445bd3e2d870a80 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/replace_unix.go @@ -0,0 +1,26 @@ +//+build !windows + +package monkey + +import ( + "syscall" +) + +// this function is super unsafe +// aww yeah +// It copies a slice to a raw memory location, disabling all memory protection before doing so. +func copyToLocation(location uintptr, data []byte) { + f := rawMemoryAccess(location, len(data)) + + page := rawMemoryAccess(pageStart(location), syscall.Getpagesize()) + err := syscall.Mprotect(page, syscall.PROT_READ|syscall.PROT_WRITE|syscall.PROT_EXEC) + if err != nil { + panic(err) + } + copy(f, data[:]) + + err = syscall.Mprotect(page, syscall.PROT_READ|syscall.PROT_EXEC) + if err != nil { + panic(err) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/replace_windows.go b/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/replace_windows.go new file mode 100644 index 0000000000000000000000000000000000000000..b09091b3dab517f4f01bc0ffddbba4d7378e922e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/bou.ke/monkey/replace_windows.go @@ -0,0 +1,44 @@ +package monkey + +import ( + "syscall" + "unsafe" +) + +const PAGE_EXECUTE_READWRITE = 0x40 + +var procVirtualProtect = syscall.NewLazyDLL("kernel32.dll").NewProc("VirtualProtect") + +func virtualProtect(lpAddress uintptr, dwSize int, flNewProtect uint32, lpflOldProtect unsafe.Pointer) error { + ret, _, _ := procVirtualProtect.Call( + lpAddress, + uintptr(dwSize), + uintptr(flNewProtect), + uintptr(lpflOldProtect)) + if ret == 0 { + return syscall.GetLastError() + } + return nil +} + +// this function is super unsafe +// aww yeah +// It copies a slice to a raw memory location, disabling all memory protection before doing so. +func copyToLocation(location uintptr, data []byte) { + f := rawMemoryAccess(location, len(data)) + + var oldPerms uint32 + err := virtualProtect(location, len(data), PAGE_EXECUTE_READWRITE, unsafe.Pointer(&oldPerms)) + if err != nil { + panic(err) + } + copy(f, data[:]) + + // VirtualProtect requires you to pass in a pointer which it can write the + // current memory protection permissions to, even if you don't want them. + var tmp uint32 + err = virtualProtect(location, len(data), oldPerms, unsafe.Pointer(&tmp)) + if err != nil { + panic(err) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/CHANGELOG.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..ff047186909c1476b0f8138848bbc46a4d0026e1 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/CHANGELOG.md @@ -0,0 +1,158 @@ +# 1.1.1 +This is a bug fix release. + * fix the build break on Solaris + * don't drop a whole trace in JSONFormatter when a field param is a function pointer which can not be serialized + +# 1.1.0 +This new release introduces: + * several fixes: + * a fix for a race condition on entry formatting + * proper cleanup of previously used entries before putting them back in the pool + * the extra new line at the end of message in text formatter has been removed + * a new global public API to check if a level is activated: IsLevelEnabled + * the following methods have been added to the Logger object + * IsLevelEnabled + * SetFormatter + * SetOutput + * ReplaceHooks + * introduction of go module + * an indent configuration for the json formatter + * output colour support for windows + * the field sort function is now configurable for text formatter + * the CLICOLOR and CLICOLOR\_FORCE environment variable support in text formater + +# 1.0.6 + +This new release introduces: + * a new api WithTime which allows to easily force the time of the log entry + which is mostly useful for logger wrapper + * a fix reverting the immutability of the entry given as parameter to the hooks + a new configuration field of the json formatter in order to put all the fields + in a nested dictionnary + * a new SetOutput method in the Logger + * a new configuration of the textformatter to configure the name of the default keys + * a new configuration of the text formatter to disable the level truncation + +# 1.0.5 + +* Fix hooks race (#707) +* Fix panic deadlock (#695) + +# 1.0.4 + +* Fix race when adding hooks (#612) +* Fix terminal check in AppEngine (#635) + +# 1.0.3 + +* Replace example files with testable examples + +# 1.0.2 + +* bug: quote non-string values in text formatter (#583) +* Make (*Logger) SetLevel a public method + +# 1.0.1 + +* bug: fix escaping in text formatter (#575) + +# 1.0.0 + +* Officially changed name to lower-case +* bug: colors on Windows 10 (#541) +* bug: fix race in accessing level (#512) + +# 0.11.5 + +* feature: add writer and writerlevel to entry (#372) + +# 0.11.4 + +* bug: fix undefined variable on solaris (#493) + +# 0.11.3 + +* formatter: configure quoting of empty values (#484) +* formatter: configure quoting character (default is `"`) (#484) +* bug: fix not importing io correctly in non-linux environments (#481) + +# 0.11.2 + +* bug: fix windows terminal detection (#476) + +# 0.11.1 + +* bug: fix tty detection with custom out (#471) + +# 0.11.0 + +* performance: Use bufferpool to allocate (#370) +* terminal: terminal detection for app-engine (#343) +* feature: exit handler (#375) + +# 0.10.0 + +* feature: Add a test hook (#180) +* feature: `ParseLevel` is now case-insensitive (#326) +* feature: `FieldLogger` interface that generalizes `Logger` and `Entry` (#308) +* performance: avoid re-allocations on `WithFields` (#335) + +# 0.9.0 + +* logrus/text_formatter: don't emit empty msg +* logrus/hooks/airbrake: move out of main repository +* logrus/hooks/sentry: move out of main repository +* logrus/hooks/papertrail: move out of main repository +* logrus/hooks/bugsnag: move out of main repository +* logrus/core: run tests with `-race` +* logrus/core: detect TTY based on `stderr` +* logrus/core: support `WithError` on logger +* logrus/core: Solaris support + +# 0.8.7 + +* logrus/core: fix possible race (#216) +* logrus/doc: small typo fixes and doc improvements + + +# 0.8.6 + +* hooks/raven: allow passing an initialized client + +# 0.8.5 + +* logrus/core: revert #208 + +# 0.8.4 + +* formatter/text: fix data race (#218) + +# 0.8.3 + +* logrus/core: fix entry log level (#208) +* logrus/core: improve performance of text formatter by 40% +* logrus/core: expose `LevelHooks` type +* logrus/core: add support for DragonflyBSD and NetBSD +* formatter/text: print structs more verbosely + +# 0.8.2 + +* logrus: fix more Fatal family functions + +# 0.8.1 + +* logrus: fix not exiting on `Fatalf` and `Fatalln` + +# 0.8.0 + +* logrus: defaults to stderr instead of stdout +* hooks/sentry: add special field for `*http.Request` +* formatter/text: ignore Windows for colors + +# 0.7.3 + +* formatter/\*: allow configuration of timestamp layout + +# 0.7.2 + +* formatter/text: Add configuration option for time format (#158) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/LICENSE b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..f090cb42f370bda9e7f4f58d9b8b8ee2750c115f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Simon Eskildsen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/README.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/README.md new file mode 100644 index 0000000000000000000000000000000000000000..093bb13f8352c1d02b6f1e2d23b805982210f281 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/README.md @@ -0,0 +1,493 @@ +# Logrus <img src="http://i.imgur.com/hTeVwmJ.png" width="40" height="40" alt=":walrus:" class="emoji" title=":walrus:"/>&nbsp;[![Build Status](https://travis-ci.org/sirupsen/logrus.svg?branch=master)](https://travis-ci.org/sirupsen/logrus)&nbsp;[![GoDoc](https://godoc.org/github.com/sirupsen/logrus?status.svg)](https://godoc.org/github.com/sirupsen/logrus) + +Logrus is a structured logger for Go (golang), completely API compatible with +the standard library logger. + +**Seeing weird case-sensitive problems?** It's in the past been possible to +import Logrus as both upper- and lower-case. Due to the Go package environment, +this caused issues in the community and we needed a standard. Some environments +experienced problems with the upper-case variant, so the lower-case was decided. +Everything using `logrus` will need to use the lower-case: +`github.com/sirupsen/logrus`. Any package that isn't, should be changed. + +To fix Glide, see [these +comments](https://github.com/sirupsen/logrus/issues/553#issuecomment-306591437). +For an in-depth explanation of the casing issue, see [this +comment](https://github.com/sirupsen/logrus/issues/570#issuecomment-313933276). + +**Are you interested in assisting in maintaining Logrus?** Currently I have a +lot of obligations, and I am unable to provide Logrus with the maintainership it +needs. If you'd like to help, please reach out to me at `simon at author's +username dot com`. + +Nicely color-coded in development (when a TTY is attached, otherwise just +plain text): + +![Colored](http://i.imgur.com/PY7qMwd.png) + +With `log.SetFormatter(&log.JSONFormatter{})`, for easy parsing by logstash +or Splunk: + +```json +{"animal":"walrus","level":"info","msg":"A group of walrus emerges from the +ocean","size":10,"time":"2014-03-10 19:57:38.562264131 -0400 EDT"} + +{"level":"warning","msg":"The group's number increased tremendously!", +"number":122,"omg":true,"time":"2014-03-10 19:57:38.562471297 -0400 EDT"} + +{"animal":"walrus","level":"info","msg":"A giant walrus appears!", +"size":10,"time":"2014-03-10 19:57:38.562500591 -0400 EDT"} + +{"animal":"walrus","level":"info","msg":"Tremendously sized cow enters the ocean.", +"size":9,"time":"2014-03-10 19:57:38.562527896 -0400 EDT"} + +{"level":"fatal","msg":"The ice breaks!","number":100,"omg":true, +"time":"2014-03-10 19:57:38.562543128 -0400 EDT"} +``` + +With the default `log.SetFormatter(&log.TextFormatter{})` when a TTY is not +attached, the output is compatible with the +[logfmt](http://godoc.org/github.com/kr/logfmt) format: + +```text +time="2015-03-26T01:27:38-04:00" level=debug msg="Started observing beach" animal=walrus number=8 +time="2015-03-26T01:27:38-04:00" level=info msg="A group of walrus emerges from the ocean" animal=walrus size=10 +time="2015-03-26T01:27:38-04:00" level=warning msg="The group's number increased tremendously!" number=122 omg=true +time="2015-03-26T01:27:38-04:00" level=debug msg="Temperature changes" temperature=-4 +time="2015-03-26T01:27:38-04:00" level=panic msg="It's over 9000!" animal=orca size=9009 +time="2015-03-26T01:27:38-04:00" level=fatal msg="The ice breaks!" err=&{0x2082280c0 map[animal:orca size:9009] 2015-03-26 01:27:38.441574009 -0400 EDT panic It's over 9000!} number=100 omg=true +``` +To ensure this behaviour even if a TTY is attached, set your formatter as follows: + +```go + log.SetFormatter(&log.TextFormatter{ + DisableColors: true, + FullTimestamp: true, + }) +``` + +#### Logging Method Name + +If you wish to add the calling method as a field, instruct the logger via: +```go +log.SetReportCaller(true) +``` +This adds the caller as 'method' like so: + +```json +{"animal":"penguin","level":"fatal","method":"github.com/sirupsen/arcticcreatures.migrate","msg":"a penguin swims by", +"time":"2014-03-10 19:57:38.562543129 -0400 EDT"} +``` + +```text +time="2015-03-26T01:27:38-04:00" level=fatal method=github.com/sirupsen/arcticcreatures.migrate msg="a penguin swims by" animal=penguin +``` +Note that this does add measurable overhead - the cost will depend on the version of Go, but is +between 20 and 40% in recent tests with 1.6 and 1.7. You can validate this in your +environment via benchmarks: +``` +go test -bench=.*CallerTracing +``` + + +#### Case-sensitivity + +The organization's name was changed to lower-case--and this will not be changed +back. If you are getting import conflicts due to case sensitivity, please use +the lower-case import: `github.com/sirupsen/logrus`. + +#### Example + +The simplest way to use Logrus is simply the package-level exported logger: + +```go +package main + +import ( + log "github.com/sirupsen/logrus" +) + +func main() { + log.WithFields(log.Fields{ + "animal": "walrus", + }).Info("A walrus appears") +} +``` + +Note that it's completely api-compatible with the stdlib logger, so you can +replace your `log` imports everywhere with `log "github.com/sirupsen/logrus"` +and you'll now have the flexibility of Logrus. You can customize it all you +want: + +```go +package main + +import ( + "os" + log "github.com/sirupsen/logrus" +) + +func init() { + // Log as JSON instead of the default ASCII formatter. + log.SetFormatter(&log.JSONFormatter{}) + + // Output to stdout instead of the default stderr + // Can be any io.Writer, see below for File example + log.SetOutput(os.Stdout) + + // Only log the warning severity or above. + log.SetLevel(log.WarnLevel) +} + +func main() { + log.WithFields(log.Fields{ + "animal": "walrus", + "size": 10, + }).Info("A group of walrus emerges from the ocean") + + log.WithFields(log.Fields{ + "omg": true, + "number": 122, + }).Warn("The group's number increased tremendously!") + + log.WithFields(log.Fields{ + "omg": true, + "number": 100, + }).Fatal("The ice breaks!") + + // A common pattern is to re-use fields between logging statements by re-using + // the logrus.Entry returned from WithFields() + contextLogger := log.WithFields(log.Fields{ + "common": "this is a common field", + "other": "I also should be logged always", + }) + + contextLogger.Info("I'll be logged with common and other field") + contextLogger.Info("Me too") +} +``` + +For more advanced usage such as logging to multiple locations from the same +application, you can also create an instance of the `logrus` Logger: + +```go +package main + +import ( + "os" + "github.com/sirupsen/logrus" +) + +// Create a new instance of the logger. You can have any number of instances. +var log = logrus.New() + +func main() { + // The API for setting attributes is a little different than the package level + // exported logger. See Godoc. + log.Out = os.Stdout + + // You could set this to any `io.Writer` such as a file + // file, err := os.OpenFile("logrus.log", os.O_CREATE|os.O_WRONLY, 0666) + // if err == nil { + // log.Out = file + // } else { + // log.Info("Failed to log to file, using default stderr") + // } + + log.WithFields(logrus.Fields{ + "animal": "walrus", + "size": 10, + }).Info("A group of walrus emerges from the ocean") +} +``` + +#### Fields + +Logrus encourages careful, structured logging through logging fields instead of +long, unparseable error messages. For example, instead of: `log.Fatalf("Failed +to send event %s to topic %s with key %d")`, you should log the much more +discoverable: + +```go +log.WithFields(log.Fields{ + "event": event, + "topic": topic, + "key": key, +}).Fatal("Failed to send event") +``` + +We've found this API forces you to think about logging in a way that produces +much more useful logging messages. We've been in countless situations where just +a single added field to a log statement that was already there would've saved us +hours. The `WithFields` call is optional. + +In general, with Logrus using any of the `printf`-family functions should be +seen as a hint you should add a field, however, you can still use the +`printf`-family functions with Logrus. + +#### Default Fields + +Often it's helpful to have fields _always_ attached to log statements in an +application or parts of one. For example, you may want to always log the +`request_id` and `user_ip` in the context of a request. Instead of writing +`log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip})` on +every line, you can create a `logrus.Entry` to pass around instead: + +```go +requestLogger := log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip}) +requestLogger.Info("something happened on that request") # will log request_id and user_ip +requestLogger.Warn("something not great happened") +``` + +#### Hooks + +You can add hooks for logging levels. For example to send errors to an exception +tracking service on `Error`, `Fatal` and `Panic`, info to StatsD or log to +multiple places simultaneously, e.g. syslog. + +Logrus comes with [built-in hooks](hooks/). Add those, or your custom hook, in +`init`: + +```go +import ( + log "github.com/sirupsen/logrus" + "gopkg.in/gemnasium/logrus-airbrake-hook.v2" // the package is named "airbrake" + logrus_syslog "github.com/sirupsen/logrus/hooks/syslog" + "log/syslog" +) + +func init() { + + // Use the Airbrake hook to report errors that have Error severity or above to + // an exception tracker. You can create custom hooks, see the Hooks section. + log.AddHook(airbrake.NewHook(123, "xyz", "production")) + + hook, err := logrus_syslog.NewSyslogHook("udp", "localhost:514", syslog.LOG_INFO, "") + if err != nil { + log.Error("Unable to connect to local syslog daemon") + } else { + log.AddHook(hook) + } +} +``` +Note: Syslog hook also support connecting to local syslog (Ex. "/dev/log" or "/var/run/syslog" or "/var/run/log"). For the detail, please check the [syslog hook README](hooks/syslog/README.md). + +A list of currently known of service hook can be found in this wiki [page](https://github.com/sirupsen/logrus/wiki/Hooks) + + +#### Level logging + +Logrus has seven logging levels: Trace, Debug, Info, Warning, Error, Fatal and Panic. + +```go +log.Trace("Something very low level.") +log.Debug("Useful debugging information.") +log.Info("Something noteworthy happened!") +log.Warn("You should probably take a look at this.") +log.Error("Something failed but I'm not quitting.") +// Calls os.Exit(1) after logging +log.Fatal("Bye.") +// Calls panic() after logging +log.Panic("I'm bailing.") +``` + +You can set the logging level on a `Logger`, then it will only log entries with +that severity or anything above it: + +```go +// Will log anything that is info or above (warn, error, fatal, panic). Default. +log.SetLevel(log.InfoLevel) +``` + +It may be useful to set `log.Level = logrus.DebugLevel` in a debug or verbose +environment if your application has that. + +#### Entries + +Besides the fields added with `WithField` or `WithFields` some fields are +automatically added to all logging events: + +1. `time`. The timestamp when the entry was created. +2. `msg`. The logging message passed to `{Info,Warn,Error,Fatal,Panic}` after + the `AddFields` call. E.g. `Failed to send event.` +3. `level`. The logging level. E.g. `info`. + +#### Environments + +Logrus has no notion of environment. + +If you wish for hooks and formatters to only be used in specific environments, +you should handle that yourself. For example, if your application has a global +variable `Environment`, which is a string representation of the environment you +could do: + +```go +import ( + log "github.com/sirupsen/logrus" +) + +init() { + // do something here to set environment depending on an environment variable + // or command-line flag + if Environment == "production" { + log.SetFormatter(&log.JSONFormatter{}) + } else { + // The TextFormatter is default, you don't actually have to do this. + log.SetFormatter(&log.TextFormatter{}) + } +} +``` + +This configuration is how `logrus` was intended to be used, but JSON in +production is mostly only useful if you do log aggregation with tools like +Splunk or Logstash. + +#### Formatters + +The built-in logging formatters are: + +* `logrus.TextFormatter`. Logs the event in colors if stdout is a tty, otherwise + without colors. + * *Note:* to force colored output when there is no TTY, set the `ForceColors` + field to `true`. To force no colored output even if there is a TTY set the + `DisableColors` field to `true`. For Windows, see + [github.com/mattn/go-colorable](https://github.com/mattn/go-colorable). + * When colors are enabled, levels are truncated to 4 characters by default. To disable + truncation set the `DisableLevelTruncation` field to `true`. + * All options are listed in the [generated docs](https://godoc.org/github.com/sirupsen/logrus#TextFormatter). +* `logrus.JSONFormatter`. Logs fields as JSON. + * All options are listed in the [generated docs](https://godoc.org/github.com/sirupsen/logrus#JSONFormatter). + +Third party logging formatters: + +* [`FluentdFormatter`](https://github.com/joonix/log). Formats entries that can be parsed by Kubernetes and Google Container Engine. +* [`logstash`](https://github.com/bshuster-repo/logrus-logstash-hook). Logs fields as [Logstash](http://logstash.net) Events. +* [`prefixed`](https://github.com/x-cray/logrus-prefixed-formatter). Displays log entry source along with alternative layout. +* [`zalgo`](https://github.com/aybabtme/logzalgo). Invoking the P͉̫o̳̼̊w̖͈̰͎e̬͔̭͂r͚̼̹̲ ̫͓͉̳͈ō̠͕͖̚f̝͍̠ ͕̲̞͖͑Z̖̫̤̫ͪa͉̬͈̗l͖͎g̳̥o̰̥̅!̣͔̲̻͊̄ ̙̘̦̹̦. + +You can define your formatter by implementing the `Formatter` interface, +requiring a `Format` method. `Format` takes an `*Entry`. `entry.Data` is a +`Fields` type (`map[string]interface{}`) with all your fields as well as the +default ones (see Entries section above): + +```go +type MyJSONFormatter struct { +} + +log.SetFormatter(new(MyJSONFormatter)) + +func (f *MyJSONFormatter) Format(entry *Entry) ([]byte, error) { + // Note this doesn't include Time, Level and Message which are available on + // the Entry. Consult `godoc` on information about those fields or read the + // source of the official loggers. + serialized, err := json.Marshal(entry.Data) + if err != nil { + return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err) + } + return append(serialized, '\n'), nil +} +``` + +#### Logger as an `io.Writer` + +Logrus can be transformed into an `io.Writer`. That writer is the end of an `io.Pipe` and it is your responsibility to close it. + +```go +w := logger.Writer() +defer w.Close() + +srv := http.Server{ + // create a stdlib log.Logger that writes to + // logrus.Logger. + ErrorLog: log.New(w, "", 0), +} +``` + +Each line written to that writer will be printed the usual way, using formatters +and hooks. The level for those entries is `info`. + +This means that we can override the standard library logger easily: + +```go +logger := logrus.New() +logger.Formatter = &logrus.JSONFormatter{} + +// Use logrus for standard log output +// Note that `log` here references stdlib's log +// Not logrus imported under the name `log`. +log.SetOutput(logger.Writer()) +``` + +#### Rotation + +Log rotation is not provided with Logrus. Log rotation should be done by an +external program (like `logrotate(8)`) that can compress and delete old log +entries. It should not be a feature of the application-level logger. + +#### Tools + +| Tool | Description | +| ---- | ----------- | +|[Logrus Mate](https://github.com/gogap/logrus_mate)|Logrus mate is a tool for Logrus to manage loggers, you can initial logger's level, hook and formatter by config file, the logger will generated with different config at different environment.| +|[Logrus Viper Helper](https://github.com/heirko/go-contrib/tree/master/logrusHelper)|An Helper around Logrus to wrap with spf13/Viper to load configuration with fangs! And to simplify Logrus configuration use some behavior of [Logrus Mate](https://github.com/gogap/logrus_mate). [sample](https://github.com/heirko/iris-contrib/blob/master/middleware/logrus-logger/example) | + +#### Testing + +Logrus has a built in facility for asserting the presence of log messages. This is implemented through the `test` hook and provides: + +* decorators for existing logger (`test.NewLocal` and `test.NewGlobal`) which basically just add the `test` hook +* a test logger (`test.NewNullLogger`) that just records log messages (and does not output any): + +```go +import( + "github.com/sirupsen/logrus" + "github.com/sirupsen/logrus/hooks/test" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestSomething(t*testing.T){ + logger, hook := test.NewNullLogger() + logger.Error("Helloerror") + + assert.Equal(t, 1, len(hook.Entries)) + assert.Equal(t, logrus.ErrorLevel, hook.LastEntry().Level) + assert.Equal(t, "Helloerror", hook.LastEntry().Message) + + hook.Reset() + assert.Nil(t, hook.LastEntry()) +} +``` + +#### Fatal handlers + +Logrus can register one or more functions that will be called when any `fatal` +level message is logged. The registered handlers will be executed before +logrus performs a `os.Exit(1)`. This behavior may be helpful if callers need +to gracefully shutdown. Unlike a `panic("Something went wrong...")` call which can be intercepted with a deferred `recover` a call to `os.Exit(1)` can not be intercepted. + +``` +... +handler := func() { + // gracefully shutdown something... +} +logrus.RegisterExitHandler(handler) +... +``` + +#### Thread safety + +By default, Logger is protected by a mutex for concurrent writes. The mutex is held when calling hooks and writing logs. +If you are sure such locking is not needed, you can call logger.SetNoLock() to disable the locking. + +Situation when locking is not needed includes: + +* You have no hooks registered, or hooks calling is already thread-safe. + +* Writing to logger.Out is already thread-safe, for example: + + 1) logger.Out is protected by locks. + + 2) logger.Out is a os.File handler opened with `O_APPEND` flag, and every write is smaller than 4k. (This allow multi-thread/multi-process writing) + + (Refer to http://www.notthewizard.com/2014/06/17/are-files-appends-really-atomic/) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/alt_exit.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/alt_exit.go new file mode 100644 index 0000000000000000000000000000000000000000..8af90637a99e61a5f55df746e1f916b4b0ffab06 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/alt_exit.go @@ -0,0 +1,64 @@ +package logrus + +// The following code was sourced and modified from the +// https://github.com/tebeka/atexit package governed by the following license: +// +// Copyright (c) 2012 Miki Tebeka <miki.tebeka@gmail.com>. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +import ( + "fmt" + "os" +) + +var handlers = []func(){} + +func runHandler(handler func()) { + defer func() { + if err := recover(); err != nil { + fmt.Fprintln(os.Stderr, "Error: Logrus exit handler error:", err) + } + }() + + handler() +} + +func runHandlers() { + for _, handler := range handlers { + runHandler(handler) + } +} + +// Exit runs all the Logrus atexit handlers and then terminates the program using os.Exit(code) +func Exit(code int) { + runHandlers() + os.Exit(code) +} + +// RegisterExitHandler adds a Logrus Exit handler, call logrus.Exit to invoke +// all handlers. The handlers will also be invoked when any Fatal log entry is +// made. +// +// This method is useful when a caller wishes to use logrus to log a fatal +// message but also needs to gracefully shutdown. An example usecase could be +// closing database connections, or sending a alert that the application is +// closing. +func RegisterExitHandler(handler func()) { + handlers = append(handlers, handler) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/appveyor.yml b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/appveyor.yml new file mode 100644 index 0000000000000000000000000000000000000000..b4ffca2758c8e01190f2bffe484d65b31763cc27 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/appveyor.yml @@ -0,0 +1,14 @@ +version: "{build}" +platform: x64 +clone_folder: c:\gopath\src\github.com\sirupsen\logrus +environment: + GOPATH: c:\gopath +branches: + only: + - master +install: + - set PATH=%GOPATH%\bin;c:\go\bin;%PATH% + - go version +build_script: + - go get -t + - go test diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/doc.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/doc.go new file mode 100644 index 0000000000000000000000000000000000000000..da67aba06debf6721a2d97604145aa09ac257e19 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/doc.go @@ -0,0 +1,26 @@ +/* +Package logrus is a structured logger for Go, completely API compatible with the standard library logger. + + +The simplest way to use Logrus is simply the package-level exported logger: + + package main + + import ( + log "github.com/sirupsen/logrus" + ) + + func main() { + log.WithFields(log.Fields{ + "animal": "walrus", + "number": 1, + "size": 10, + }).Info("A walrus appears") + } + +Output: + time="2015-09-07T08:48:33Z" level=info msg="A walrus appears" animal=walrus number=1 size=10 + +For a full guide visit https://github.com/sirupsen/logrus +*/ +package logrus diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/entry.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/entry.go new file mode 100644 index 0000000000000000000000000000000000000000..cc85d3aab49e2803604b09a03cf45e4f3e51179e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/entry.go @@ -0,0 +1,408 @@ +package logrus + +import ( + "bytes" + "fmt" + "os" + "reflect" + "runtime" + "strings" + "sync" + "time" +) + +var ( + bufferPool *sync.Pool + + // qualified package name, cached at first use + logrusPackage string + + // Positions in the call stack when tracing to report the calling method + minimumCallerDepth int + + // Used for caller information initialisation + callerInitOnce sync.Once +) + +const ( + maximumCallerDepth int = 25 + knownLogrusFrames int = 4 +) + +func init() { + bufferPool = &sync.Pool{ + New: func() interface{} { + return new(bytes.Buffer) + }, + } + + // start at the bottom of the stack before the package-name cache is primed + minimumCallerDepth = 1 +} + +// Defines the key when adding errors using WithError. +var ErrorKey = "error" + +// An entry is the final or intermediate Logrus logging entry. It contains all +// the fields passed with WithField{,s}. It's finally logged when Trace, Debug, +// Info, Warn, Error, Fatal or Panic is called on it. These objects can be +// reused and passed around as much as you wish to avoid field duplication. +type Entry struct { + Logger *Logger + + // Contains all the fields set by the user. + Data Fields + + // Time at which the log entry was created + Time time.Time + + // Level the log entry was logged at: Trace, Debug, Info, Warn, Error, Fatal or Panic + // This field will be set on entry firing and the value will be equal to the one in Logger struct field. + Level Level + + // Calling method, with package name + Caller *runtime.Frame + + // Message passed to Trace, Debug, Info, Warn, Error, Fatal or Panic + Message string + + // When formatter is called in entry.log(), a Buffer may be set to entry + Buffer *bytes.Buffer + + // err may contain a field formatting error + err string +} + +func NewEntry(logger *Logger) *Entry { + return &Entry{ + Logger: logger, + // Default is three fields, plus one optional. Give a little extra room. + Data: make(Fields, 6), + } +} + +// Returns the string representation from the reader and ultimately the +// formatter. +func (entry *Entry) String() (string, error) { + serialized, err := entry.Logger.Formatter.Format(entry) + if err != nil { + return "", err + } + str := string(serialized) + return str, nil +} + +// Add an error as single field (using the key defined in ErrorKey) to the Entry. +func (entry *Entry) WithError(err error) *Entry { + return entry.WithField(ErrorKey, err) +} + +// Add a single field to the Entry. +func (entry *Entry) WithField(key string, value interface{}) *Entry { + return entry.WithFields(Fields{key: value}) +} + +// Add a map of fields to the Entry. +func (entry *Entry) WithFields(fields Fields) *Entry { + data := make(Fields, len(entry.Data)+len(fields)) + for k, v := range entry.Data { + data[k] = v + } + var field_err string + for k, v := range fields { + if t := reflect.TypeOf(v); t != nil && t.Kind() == reflect.Func { + field_err = fmt.Sprintf("can not add field %q", k) + if entry.err != "" { + field_err = entry.err + ", " + field_err + } + } else { + data[k] = v + } + } + return &Entry{Logger: entry.Logger, Data: data, Time: entry.Time, err: field_err} +} + +// Overrides the time of the Entry. +func (entry *Entry) WithTime(t time.Time) *Entry { + return &Entry{Logger: entry.Logger, Data: entry.Data, Time: t} +} + +// getPackageName reduces a fully qualified function name to the package name +// There really ought to be to be a better way... +func getPackageName(f string) string { + for { + lastPeriod := strings.LastIndex(f, ".") + lastSlash := strings.LastIndex(f, "/") + if lastPeriod > lastSlash { + f = f[:lastPeriod] + } else { + break + } + } + + return f +} + +// getCaller retrieves the name of the first non-logrus calling function +func getCaller() *runtime.Frame { + // Restrict the lookback frames to avoid runaway lookups + pcs := make([]uintptr, maximumCallerDepth) + depth := runtime.Callers(minimumCallerDepth, pcs) + frames := runtime.CallersFrames(pcs[:depth]) + + // cache this package's fully-qualified name + callerInitOnce.Do(func() { + logrusPackage = getPackageName(runtime.FuncForPC(pcs[0]).Name()) + + // now that we have the cache, we can skip a minimum count of known-logrus functions + // XXX this is dubious, the number of frames may vary store an entry in a logger interface + minimumCallerDepth = knownLogrusFrames + }) + + for f, again := frames.Next(); again; f, again = frames.Next() { + pkg := getPackageName(f.Function) + + // If the caller isn't part of this package, we're done + if pkg != logrusPackage { + return &f + } + } + + // if we got here, we failed to find the caller's context + return nil +} + +func (entry Entry) HasCaller() (has bool) { + return entry.Logger != nil && + entry.Logger.ReportCaller && + entry.Caller != nil +} + +// This function is not declared with a pointer value because otherwise +// race conditions will occur when using multiple goroutines +func (entry Entry) log(level Level, msg string) { + var buffer *bytes.Buffer + + // Default to now, but allow users to override if they want. + // + // We don't have to worry about polluting future calls to Entry#log() + // with this assignment because this function is declared with a + // non-pointer receiver. + if entry.Time.IsZero() { + entry.Time = time.Now() + } + + entry.Level = level + entry.Message = msg + if entry.Logger.ReportCaller { + entry.Caller = getCaller() + } + + entry.fireHooks() + + buffer = bufferPool.Get().(*bytes.Buffer) + buffer.Reset() + defer bufferPool.Put(buffer) + entry.Buffer = buffer + + entry.write() + + entry.Buffer = nil + + // To avoid Entry#log() returning a value that only would make sense for + // panic() to use in Entry#Panic(), we avoid the allocation by checking + // directly here. + if level <= PanicLevel { + panic(&entry) + } +} + +func (entry *Entry) fireHooks() { + entry.Logger.mu.Lock() + defer entry.Logger.mu.Unlock() + err := entry.Logger.Hooks.Fire(entry.Level, entry) + if err != nil { + fmt.Fprintf(os.Stderr, "Failed to fire hook: %v\n", err) + } +} + +func (entry *Entry) write() { + entry.Logger.mu.Lock() + defer entry.Logger.mu.Unlock() + serialized, err := entry.Logger.Formatter.Format(entry) + if err != nil { + fmt.Fprintf(os.Stderr, "Failed to obtain reader, %v\n", err) + } else { + _, err = entry.Logger.Out.Write(serialized) + if err != nil { + fmt.Fprintf(os.Stderr, "Failed to write to log, %v\n", err) + } + } +} + +func (entry *Entry) Trace(args ...interface{}) { + if entry.Logger.IsLevelEnabled(TraceLevel) { + entry.log(TraceLevel, fmt.Sprint(args...)) + } +} + +func (entry *Entry) Debug(args ...interface{}) { + if entry.Logger.IsLevelEnabled(DebugLevel) { + entry.log(DebugLevel, fmt.Sprint(args...)) + } +} + +func (entry *Entry) Print(args ...interface{}) { + entry.Info(args...) +} + +func (entry *Entry) Info(args ...interface{}) { + if entry.Logger.IsLevelEnabled(InfoLevel) { + entry.log(InfoLevel, fmt.Sprint(args...)) + } +} + +func (entry *Entry) Warn(args ...interface{}) { + if entry.Logger.IsLevelEnabled(WarnLevel) { + entry.log(WarnLevel, fmt.Sprint(args...)) + } +} + +func (entry *Entry) Warning(args ...interface{}) { + entry.Warn(args...) +} + +func (entry *Entry) Error(args ...interface{}) { + if entry.Logger.IsLevelEnabled(ErrorLevel) { + entry.log(ErrorLevel, fmt.Sprint(args...)) + } +} + +func (entry *Entry) Fatal(args ...interface{}) { + if entry.Logger.IsLevelEnabled(FatalLevel) { + entry.log(FatalLevel, fmt.Sprint(args...)) + } + entry.Logger.Exit(1) +} + +func (entry *Entry) Panic(args ...interface{}) { + if entry.Logger.IsLevelEnabled(PanicLevel) { + entry.log(PanicLevel, fmt.Sprint(args...)) + } + panic(fmt.Sprint(args...)) +} + +// Entry Printf family functions + +func (entry *Entry) Tracef(format string, args ...interface{}) { + if entry.Logger.IsLevelEnabled(TraceLevel) { + entry.Trace(fmt.Sprintf(format, args...)) + } +} + +func (entry *Entry) Debugf(format string, args ...interface{}) { + if entry.Logger.IsLevelEnabled(DebugLevel) { + entry.Debug(fmt.Sprintf(format, args...)) + } +} + +func (entry *Entry) Infof(format string, args ...interface{}) { + if entry.Logger.IsLevelEnabled(InfoLevel) { + entry.Info(fmt.Sprintf(format, args...)) + } +} + +func (entry *Entry) Printf(format string, args ...interface{}) { + entry.Infof(format, args...) +} + +func (entry *Entry) Warnf(format string, args ...interface{}) { + if entry.Logger.IsLevelEnabled(WarnLevel) { + entry.Warn(fmt.Sprintf(format, args...)) + } +} + +func (entry *Entry) Warningf(format string, args ...interface{}) { + entry.Warnf(format, args...) +} + +func (entry *Entry) Errorf(format string, args ...interface{}) { + if entry.Logger.IsLevelEnabled(ErrorLevel) { + entry.Error(fmt.Sprintf(format, args...)) + } +} + +func (entry *Entry) Fatalf(format string, args ...interface{}) { + if entry.Logger.IsLevelEnabled(FatalLevel) { + entry.Fatal(fmt.Sprintf(format, args...)) + } + entry.Logger.Exit(1) +} + +func (entry *Entry) Panicf(format string, args ...interface{}) { + if entry.Logger.IsLevelEnabled(PanicLevel) { + entry.Panic(fmt.Sprintf(format, args...)) + } +} + +// Entry Println family functions + +func (entry *Entry) Traceln(args ...interface{}) { + if entry.Logger.IsLevelEnabled(TraceLevel) { + entry.Trace(entry.sprintlnn(args...)) + } +} + +func (entry *Entry) Debugln(args ...interface{}) { + if entry.Logger.IsLevelEnabled(DebugLevel) { + entry.Debug(entry.sprintlnn(args...)) + } +} + +func (entry *Entry) Infoln(args ...interface{}) { + if entry.Logger.IsLevelEnabled(InfoLevel) { + entry.Info(entry.sprintlnn(args...)) + } +} + +func (entry *Entry) Println(args ...interface{}) { + entry.Infoln(args...) +} + +func (entry *Entry) Warnln(args ...interface{}) { + if entry.Logger.IsLevelEnabled(WarnLevel) { + entry.Warn(entry.sprintlnn(args...)) + } +} + +func (entry *Entry) Warningln(args ...interface{}) { + entry.Warnln(args...) +} + +func (entry *Entry) Errorln(args ...interface{}) { + if entry.Logger.IsLevelEnabled(ErrorLevel) { + entry.Error(entry.sprintlnn(args...)) + } +} + +func (entry *Entry) Fatalln(args ...interface{}) { + if entry.Logger.IsLevelEnabled(FatalLevel) { + entry.Fatal(entry.sprintlnn(args...)) + } + entry.Logger.Exit(1) +} + +func (entry *Entry) Panicln(args ...interface{}) { + if entry.Logger.IsLevelEnabled(PanicLevel) { + entry.Panic(entry.sprintlnn(args...)) + } +} + +// Sprintlnn => Sprint no newline. This is to get the behavior of how +// fmt.Sprintln where spaces are always added between operands, regardless of +// their type. Instead of vendoring the Sprintln implementation to spare a +// string allocation, we do the simplest thing. +func (entry *Entry) sprintlnn(args ...interface{}) string { + msg := fmt.Sprintln(args...) + return msg[:len(msg)-1] +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/exported.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/exported.go new file mode 100644 index 0000000000000000000000000000000000000000..7342613c37259922c2c6cc4ab43ad5defc46fa90 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/exported.go @@ -0,0 +1,219 @@ +package logrus + +import ( + "io" + "time" +) + +var ( + // std is the name of the standard logger in stdlib `log` + std = New() +) + +func StandardLogger() *Logger { + return std +} + +// SetOutput sets the standard logger output. +func SetOutput(out io.Writer) { + std.SetOutput(out) +} + +// SetFormatter sets the standard logger formatter. +func SetFormatter(formatter Formatter) { + std.SetFormatter(formatter) +} + +// SetReportCaller sets whether the standard logger will include the calling +// method as a field. +func SetReportCaller(include bool) { + std.SetReportCaller(include) +} + +// SetLevel sets the standard logger level. +func SetLevel(level Level) { + std.SetLevel(level) +} + +// GetLevel returns the standard logger level. +func GetLevel() Level { + return std.GetLevel() +} + +// IsLevelEnabled checks if the log level of the standard logger is greater than the level param +func IsLevelEnabled(level Level) bool { + return std.IsLevelEnabled(level) +} + +// AddHook adds a hook to the standard logger hooks. +func AddHook(hook Hook) { + std.AddHook(hook) +} + +// WithError creates an entry from the standard logger and adds an error to it, using the value defined in ErrorKey as key. +func WithError(err error) *Entry { + return std.WithField(ErrorKey, err) +} + +// WithField creates an entry from the standard logger and adds a field to +// it. If you want multiple fields, use `WithFields`. +// +// Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal +// or Panic on the Entry it returns. +func WithField(key string, value interface{}) *Entry { + return std.WithField(key, value) +} + +// WithFields creates an entry from the standard logger and adds multiple +// fields to it. This is simply a helper for `WithField`, invoking it +// once for each field. +// +// Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal +// or Panic on the Entry it returns. +func WithFields(fields Fields) *Entry { + return std.WithFields(fields) +} + +// WithTime creats an entry from the standard logger and overrides the time of +// logs generated with it. +// +// Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal +// or Panic on the Entry it returns. +func WithTime(t time.Time) *Entry { + return std.WithTime(t) +} + +// Trace logs a message at level Trace on the standard logger. +func Trace(args ...interface{}) { + std.Trace(args...) +} + +// Debug logs a message at level Debug on the standard logger. +func Debug(args ...interface{}) { + std.Debug(args...) +} + +// Print logs a message at level Info on the standard logger. +func Print(args ...interface{}) { + std.Print(args...) +} + +// Info logs a message at level Info on the standard logger. +func Info(args ...interface{}) { + std.Info(args...) +} + +// Warn logs a message at level Warn on the standard logger. +func Warn(args ...interface{}) { + std.Warn(args...) +} + +// Warning logs a message at level Warn on the standard logger. +func Warning(args ...interface{}) { + std.Warning(args...) +} + +// Error logs a message at level Error on the standard logger. +func Error(args ...interface{}) { + std.Error(args...) +} + +// Panic logs a message at level Panic on the standard logger. +func Panic(args ...interface{}) { + std.Panic(args...) +} + +// Fatal logs a message at level Fatal on the standard logger then the process will exit with status set to 1. +func Fatal(args ...interface{}) { + std.Fatal(args...) +} + +// Tracef logs a message at level Trace on the standard logger. +func Tracef(format string, args ...interface{}) { + std.Tracef(format, args...) +} + +// Debugf logs a message at level Debug on the standard logger. +func Debugf(format string, args ...interface{}) { + std.Debugf(format, args...) +} + +// Printf logs a message at level Info on the standard logger. +func Printf(format string, args ...interface{}) { + std.Printf(format, args...) +} + +// Infof logs a message at level Info on the standard logger. +func Infof(format string, args ...interface{}) { + std.Infof(format, args...) +} + +// Warnf logs a message at level Warn on the standard logger. +func Warnf(format string, args ...interface{}) { + std.Warnf(format, args...) +} + +// Warningf logs a message at level Warn on the standard logger. +func Warningf(format string, args ...interface{}) { + std.Warningf(format, args...) +} + +// Errorf logs a message at level Error on the standard logger. +func Errorf(format string, args ...interface{}) { + std.Errorf(format, args...) +} + +// Panicf logs a message at level Panic on the standard logger. +func Panicf(format string, args ...interface{}) { + std.Panicf(format, args...) +} + +// Fatalf logs a message at level Fatal on the standard logger then the process will exit with status set to 1. +func Fatalf(format string, args ...interface{}) { + std.Fatalf(format, args...) +} + +// Traceln logs a message at level Trace on the standard logger. +func Traceln(args ...interface{}) { + std.Traceln(args...) +} + +// Debugln logs a message at level Debug on the standard logger. +func Debugln(args ...interface{}) { + std.Debugln(args...) +} + +// Println logs a message at level Info on the standard logger. +func Println(args ...interface{}) { + std.Println(args...) +} + +// Infoln logs a message at level Info on the standard logger. +func Infoln(args ...interface{}) { + std.Infoln(args...) +} + +// Warnln logs a message at level Warn on the standard logger. +func Warnln(args ...interface{}) { + std.Warnln(args...) +} + +// Warningln logs a message at level Warn on the standard logger. +func Warningln(args ...interface{}) { + std.Warningln(args...) +} + +// Errorln logs a message at level Error on the standard logger. +func Errorln(args ...interface{}) { + std.Errorln(args...) +} + +// Panicln logs a message at level Panic on the standard logger. +func Panicln(args ...interface{}) { + std.Panicln(args...) +} + +// Fatalln logs a message at level Fatal on the standard logger then the process will exit with status set to 1. +func Fatalln(args ...interface{}) { + std.Fatalln(args...) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/formatter.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/formatter.go new file mode 100644 index 0000000000000000000000000000000000000000..408883773ebbd70f8f5128ed74747039ec8ee0f1 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/formatter.go @@ -0,0 +1,78 @@ +package logrus + +import "time" + +// Default key names for the default fields +const ( + defaultTimestampFormat = time.RFC3339 + FieldKeyMsg = "msg" + FieldKeyLevel = "level" + FieldKeyTime = "time" + FieldKeyLogrusError = "logrus_error" + FieldKeyFunc = "func" + FieldKeyFile = "file" +) + +// The Formatter interface is used to implement a custom Formatter. It takes an +// `Entry`. It exposes all the fields, including the default ones: +// +// * `entry.Data["msg"]`. The message passed from Info, Warn, Error .. +// * `entry.Data["time"]`. The timestamp. +// * `entry.Data["level"]. The level the entry was logged at. +// +// Any additional fields added with `WithField` or `WithFields` are also in +// `entry.Data`. Format is expected to return an array of bytes which are then +// logged to `logger.Out`. +type Formatter interface { + Format(*Entry) ([]byte, error) +} + +// This is to not silently overwrite `time`, `msg`, `func` and `level` fields when +// dumping it. If this code wasn't there doing: +// +// logrus.WithField("level", 1).Info("hello") +// +// Would just silently drop the user provided level. Instead with this code +// it'll logged as: +// +// {"level": "info", "fields.level": 1, "msg": "hello", "time": "..."} +// +// It's not exported because it's still using Data in an opinionated way. It's to +// avoid code duplication between the two default formatters. +func prefixFieldClashes(data Fields, fieldMap FieldMap, reportCaller bool) { + timeKey := fieldMap.resolve(FieldKeyTime) + if t, ok := data[timeKey]; ok { + data["fields."+timeKey] = t + delete(data, timeKey) + } + + msgKey := fieldMap.resolve(FieldKeyMsg) + if m, ok := data[msgKey]; ok { + data["fields."+msgKey] = m + delete(data, msgKey) + } + + levelKey := fieldMap.resolve(FieldKeyLevel) + if l, ok := data[levelKey]; ok { + data["fields."+levelKey] = l + delete(data, levelKey) + } + + logrusErrKey := fieldMap.resolve(FieldKeyLogrusError) + if l, ok := data[logrusErrKey]; ok { + data["fields."+logrusErrKey] = l + delete(data, logrusErrKey) + } + + // If reportCaller is not set, 'func' will not conflict. + if reportCaller { + funcKey := fieldMap.resolve(FieldKeyFunc) + if l, ok := data[funcKey]; ok { + data["fields."+funcKey] = l + } + fileKey := fieldMap.resolve(FieldKeyFile) + if l, ok := data[fileKey]; ok { + data["fields."+fileKey] = l + } + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/go.mod b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/go.mod new file mode 100644 index 0000000000000000000000000000000000000000..8a431f783cc948bd408ef86911cfc7d889e335fa --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/go.mod @@ -0,0 +1,13 @@ +module github.com/sirupsen/logrus + +go 1.15 + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/konsorten/go-windows-terminal-sequences v1.0.1 + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/stretchr/objx v0.1.1 // indirect + github.com/stretchr/testify v1.2.2 + golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 + golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33 +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/go.sum b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/go.sum new file mode 100644 index 0000000000000000000000000000000000000000..133d34ae11654d9eaab86c57f41f8d901a689010 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/go.sum @@ -0,0 +1,15 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f2633dfe h1:CHRGQ8V7OlCYtwaKPJi3iA7J+YdNKdo8j7nG5IgDhjs= +github.com/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f2633dfe/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 h1:u+LnwYTOOW7Ukr/fppxEb1Nwz0AtPflrblfvUudpo+I= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33 h1:I6FyU15t786LL7oL/hn43zqTuEGr4PN7F4XJ1p4E3Y8= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/hooks.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/hooks.go new file mode 100644 index 0000000000000000000000000000000000000000..3f151cdc39275a003d6a6e7059b0801071c001a8 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/hooks.go @@ -0,0 +1,34 @@ +package logrus + +// A hook to be fired when logging on the logging levels returned from +// `Levels()` on your implementation of the interface. Note that this is not +// fired in a goroutine or a channel with workers, you should handle such +// functionality yourself if your call is non-blocking and you don't wish for +// the logging calls for levels returned from `Levels()` to block. +type Hook interface { + Levels() []Level + Fire(*Entry) error +} + +// Internal type for storing the hooks on a logger instance. +type LevelHooks map[Level][]Hook + +// Add a hook to an instance of logger. This is called with +// `log.Hooks.Add(new(MyHook))` where `MyHook` implements the `Hook` interface. +func (hooks LevelHooks) Add(hook Hook) { + for _, level := range hook.Levels() { + hooks[level] = append(hooks[level], hook) + } +} + +// Fire all the hooks for the passed level. Used by `entry.log` to fire +// appropriate hooks for a log entry. +func (hooks LevelHooks) Fire(level Level, entry *Entry) error { + for _, hook := range hooks[level] { + if err := hook.Fire(entry); err != nil { + return err + } + } + + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/json_formatter.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/json_formatter.go new file mode 100644 index 0000000000000000000000000000000000000000..2605753599faf140f7a91f3fc462da4c0971ef64 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/json_formatter.go @@ -0,0 +1,105 @@ +package logrus + +import ( + "bytes" + "encoding/json" + "fmt" +) + +type fieldKey string + +// FieldMap allows customization of the key names for default fields. +type FieldMap map[fieldKey]string + +func (f FieldMap) resolve(key fieldKey) string { + if k, ok := f[key]; ok { + return k + } + + return string(key) +} + +// JSONFormatter formats logs into parsable json +type JSONFormatter struct { + // TimestampFormat sets the format used for marshaling timestamps. + TimestampFormat string + + // DisableTimestamp allows disabling automatic timestamps in output + DisableTimestamp bool + + // DataKey allows users to put all the log entry parameters into a nested dictionary at a given key. + DataKey string + + // FieldMap allows users to customize the names of keys for default fields. + // As an example: + // formatter := &JSONFormatter{ + // FieldMap: FieldMap{ + // FieldKeyTime: "@timestamp", + // FieldKeyLevel: "@level", + // FieldKeyMsg: "@message", + // FieldKeyFunc: "@caller", + // }, + // } + FieldMap FieldMap + + // PrettyPrint will indent all json logs + PrettyPrint bool +} + +// Format renders a single log entry +func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) { + data := make(Fields, len(entry.Data)+4) + for k, v := range entry.Data { + switch v := v.(type) { + case error: + // Otherwise errors are ignored by `encoding/json` + // https://github.com/sirupsen/logrus/issues/137 + data[k] = v.Error() + default: + data[k] = v + } + } + + if f.DataKey != "" { + newData := make(Fields, 4) + newData[f.DataKey] = data + data = newData + } + + prefixFieldClashes(data, f.FieldMap, entry.HasCaller()) + + timestampFormat := f.TimestampFormat + if timestampFormat == "" { + timestampFormat = defaultTimestampFormat + } + + if entry.err != "" { + data[f.FieldMap.resolve(FieldKeyLogrusError)] = entry.err + } + if !f.DisableTimestamp { + data[f.FieldMap.resolve(FieldKeyTime)] = entry.Time.Format(timestampFormat) + } + data[f.FieldMap.resolve(FieldKeyMsg)] = entry.Message + data[f.FieldMap.resolve(FieldKeyLevel)] = entry.Level.String() + if entry.HasCaller() { + data[f.FieldMap.resolve(FieldKeyFunc)] = entry.Caller.Function + data[f.FieldMap.resolve(FieldKeyFile)] = fmt.Sprintf("%s:%d", entry.Caller.File, entry.Caller.Line) + } + + var b *bytes.Buffer + if entry.Buffer != nil { + b = entry.Buffer + } else { + b = &bytes.Buffer{} + } + + encoder := json.NewEncoder(b) + if f.PrettyPrint { + encoder.SetIndent("", " ") + } + if err := encoder.Encode(data); err != nil { + return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err) + } + + return b.Bytes(), nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/logger.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/logger.go new file mode 100644 index 0000000000000000000000000000000000000000..5ceca0eab427cc11b39954aeed6b1c923dc878ec --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/logger.go @@ -0,0 +1,415 @@ +package logrus + +import ( + "io" + "os" + "sync" + "sync/atomic" + "time" +) + +type Logger struct { + // The logs are `io.Copy`'d to this in a mutex. It's common to set this to a + // file, or leave it default which is `os.Stderr`. You can also set this to + // something more adventurous, such as logging to Kafka. + Out io.Writer + // Hooks for the logger instance. These allow firing events based on logging + // levels and log entries. For example, to send errors to an error tracking + // service, log to StatsD or dump the core on fatal errors. + Hooks LevelHooks + // All log entries pass through the formatter before logged to Out. The + // included formatters are `TextFormatter` and `JSONFormatter` for which + // TextFormatter is the default. In development (when a TTY is attached) it + // logs with colors, but to a file it wouldn't. You can easily implement your + // own that implements the `Formatter` interface, see the `README` or included + // formatters for examples. + Formatter Formatter + + // Flag for whether to log caller info (off by default) + ReportCaller bool + + // The logging level the logger should log at. This is typically (and defaults + // to) `logrus.Info`, which allows Info(), Warn(), Error() and Fatal() to be + // logged. + Level Level + // Used to sync writing to the log. Locking is enabled by Default + mu MutexWrap + // Reusable empty entry + entryPool sync.Pool + // Function to exit the application, defaults to `os.Exit()` + ExitFunc exitFunc +} + +type exitFunc func(int) + +type MutexWrap struct { + lock sync.Mutex + disabled bool +} + +func (mw *MutexWrap) Lock() { + if !mw.disabled { + mw.lock.Lock() + } +} + +func (mw *MutexWrap) Unlock() { + if !mw.disabled { + mw.lock.Unlock() + } +} + +func (mw *MutexWrap) Disable() { + mw.disabled = true +} + +// Creates a new logger. Configuration should be set by changing `Formatter`, +// `Out` and `Hooks` directly on the default logger instance. You can also just +// instantiate your own: +// +// var log = &Logger{ +// Out: os.Stderr, +// Formatter: new(JSONFormatter), +// Hooks: make(LevelHooks), +// Level: logrus.DebugLevel, +// } +// +// It's recommended to make this a global instance called `log`. +func New() *Logger { + return &Logger{ + Out: os.Stderr, + Formatter: new(TextFormatter), + Hooks: make(LevelHooks), + Level: InfoLevel, + ExitFunc: os.Exit, + ReportCaller: false, + } +} + +func (logger *Logger) newEntry() *Entry { + entry, ok := logger.entryPool.Get().(*Entry) + if ok { + return entry + } + return NewEntry(logger) +} + +func (logger *Logger) releaseEntry(entry *Entry) { + entry.Data = map[string]interface{}{} + logger.entryPool.Put(entry) +} + +// Adds a field to the log entry, note that it doesn't log until you call +// Debug, Print, Info, Warn, Error, Fatal or Panic. It only creates a log entry. +// If you want multiple fields, use `WithFields`. +func (logger *Logger) WithField(key string, value interface{}) *Entry { + entry := logger.newEntry() + defer logger.releaseEntry(entry) + return entry.WithField(key, value) +} + +// Adds a struct of fields to the log entry. All it does is call `WithField` for +// each `Field`. +func (logger *Logger) WithFields(fields Fields) *Entry { + entry := logger.newEntry() + defer logger.releaseEntry(entry) + return entry.WithFields(fields) +} + +// Add an error as single field to the log entry. All it does is call +// `WithError` for the given `error`. +func (logger *Logger) WithError(err error) *Entry { + entry := logger.newEntry() + defer logger.releaseEntry(entry) + return entry.WithError(err) +} + +// Overrides the time of the log entry. +func (logger *Logger) WithTime(t time.Time) *Entry { + entry := logger.newEntry() + defer logger.releaseEntry(entry) + return entry.WithTime(t) +} + +func (logger *Logger) Tracef(format string, args ...interface{}) { + if logger.IsLevelEnabled(TraceLevel) { + entry := logger.newEntry() + entry.Tracef(format, args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Debugf(format string, args ...interface{}) { + if logger.IsLevelEnabled(DebugLevel) { + entry := logger.newEntry() + entry.Debugf(format, args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Infof(format string, args ...interface{}) { + if logger.IsLevelEnabled(InfoLevel) { + entry := logger.newEntry() + entry.Infof(format, args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Printf(format string, args ...interface{}) { + entry := logger.newEntry() + entry.Printf(format, args...) + logger.releaseEntry(entry) +} + +func (logger *Logger) Warnf(format string, args ...interface{}) { + if logger.IsLevelEnabled(WarnLevel) { + entry := logger.newEntry() + entry.Warnf(format, args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Warningf(format string, args ...interface{}) { + if logger.IsLevelEnabled(WarnLevel) { + entry := logger.newEntry() + entry.Warnf(format, args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Errorf(format string, args ...interface{}) { + if logger.IsLevelEnabled(ErrorLevel) { + entry := logger.newEntry() + entry.Errorf(format, args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Fatalf(format string, args ...interface{}) { + if logger.IsLevelEnabled(FatalLevel) { + entry := logger.newEntry() + entry.Fatalf(format, args...) + logger.releaseEntry(entry) + } + logger.Exit(1) +} + +func (logger *Logger) Panicf(format string, args ...interface{}) { + if logger.IsLevelEnabled(PanicLevel) { + entry := logger.newEntry() + entry.Panicf(format, args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Trace(args ...interface{}) { + if logger.IsLevelEnabled(TraceLevel) { + entry := logger.newEntry() + entry.Trace(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Debug(args ...interface{}) { + if logger.IsLevelEnabled(DebugLevel) { + entry := logger.newEntry() + entry.Debug(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Info(args ...interface{}) { + if logger.IsLevelEnabled(InfoLevel) { + entry := logger.newEntry() + entry.Info(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Print(args ...interface{}) { + entry := logger.newEntry() + entry.Info(args...) + logger.releaseEntry(entry) +} + +func (logger *Logger) Warn(args ...interface{}) { + if logger.IsLevelEnabled(WarnLevel) { + entry := logger.newEntry() + entry.Warn(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Warning(args ...interface{}) { + if logger.IsLevelEnabled(WarnLevel) { + entry := logger.newEntry() + entry.Warn(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Error(args ...interface{}) { + if logger.IsLevelEnabled(ErrorLevel) { + entry := logger.newEntry() + entry.Error(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Fatal(args ...interface{}) { + if logger.IsLevelEnabled(FatalLevel) { + entry := logger.newEntry() + entry.Fatal(args...) + logger.releaseEntry(entry) + } + logger.Exit(1) +} + +func (logger *Logger) Panic(args ...interface{}) { + if logger.IsLevelEnabled(PanicLevel) { + entry := logger.newEntry() + entry.Panic(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Traceln(args ...interface{}) { + if logger.IsLevelEnabled(TraceLevel) { + entry := logger.newEntry() + entry.Traceln(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Debugln(args ...interface{}) { + if logger.IsLevelEnabled(DebugLevel) { + entry := logger.newEntry() + entry.Debugln(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Infoln(args ...interface{}) { + if logger.IsLevelEnabled(InfoLevel) { + entry := logger.newEntry() + entry.Infoln(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Println(args ...interface{}) { + entry := logger.newEntry() + entry.Println(args...) + logger.releaseEntry(entry) +} + +func (logger *Logger) Warnln(args ...interface{}) { + if logger.IsLevelEnabled(WarnLevel) { + entry := logger.newEntry() + entry.Warnln(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Warningln(args ...interface{}) { + if logger.IsLevelEnabled(WarnLevel) { + entry := logger.newEntry() + entry.Warnln(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Errorln(args ...interface{}) { + if logger.IsLevelEnabled(ErrorLevel) { + entry := logger.newEntry() + entry.Errorln(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Fatalln(args ...interface{}) { + if logger.IsLevelEnabled(FatalLevel) { + entry := logger.newEntry() + entry.Fatalln(args...) + logger.releaseEntry(entry) + } + logger.Exit(1) +} + +func (logger *Logger) Panicln(args ...interface{}) { + if logger.IsLevelEnabled(PanicLevel) { + entry := logger.newEntry() + entry.Panicln(args...) + logger.releaseEntry(entry) + } +} + +func (logger *Logger) Exit(code int) { + runHandlers() + if logger.ExitFunc == nil { + logger.ExitFunc = os.Exit + } + logger.ExitFunc(code) +} + +//When file is opened with appending mode, it's safe to +//write concurrently to a file (within 4k message on Linux). +//In these cases user can choose to disable the lock. +func (logger *Logger) SetNoLock() { + logger.mu.Disable() +} + +func (logger *Logger) level() Level { + return Level(atomic.LoadUint32((*uint32)(&logger.Level))) +} + +// SetLevel sets the logger level. +func (logger *Logger) SetLevel(level Level) { + atomic.StoreUint32((*uint32)(&logger.Level), uint32(level)) +} + +// GetLevel returns the logger level. +func (logger *Logger) GetLevel() Level { + return logger.level() +} + +// AddHook adds a hook to the logger hooks. +func (logger *Logger) AddHook(hook Hook) { + logger.mu.Lock() + defer logger.mu.Unlock() + logger.Hooks.Add(hook) +} + +// IsLevelEnabled checks if the log level of the logger is greater than the level param +func (logger *Logger) IsLevelEnabled(level Level) bool { + return logger.level() >= level +} + +// SetFormatter sets the logger formatter. +func (logger *Logger) SetFormatter(formatter Formatter) { + logger.mu.Lock() + defer logger.mu.Unlock() + logger.Formatter = formatter +} + +// SetOutput sets the logger output. +func (logger *Logger) SetOutput(output io.Writer) { + logger.mu.Lock() + defer logger.mu.Unlock() + logger.Out = output +} + +func (logger *Logger) SetReportCaller(reportCaller bool) { + logger.mu.Lock() + defer logger.mu.Unlock() + logger.ReportCaller = reportCaller +} + +// ReplaceHooks replaces the logger hooks and returns the old ones +func (logger *Logger) ReplaceHooks(hooks LevelHooks) LevelHooks { + logger.mu.Lock() + oldHooks := logger.Hooks + logger.Hooks = hooks + logger.mu.Unlock() + return oldHooks +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/logrus.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/logrus.go new file mode 100644 index 0000000000000000000000000000000000000000..03046b648a58b2e36c2236d59e1f0815a0b6db7c --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/logrus.go @@ -0,0 +1,166 @@ +package logrus + +import ( + "fmt" + "log" + "strings" +) + +// Fields type, used to pass to `WithFields`. +type Fields map[string]interface{} + +// Level type +type Level uint32 + +// Convert the Level to a string. E.g. PanicLevel becomes "panic". +func (level Level) String() string { + switch level { + case TraceLevel: + return "trace" + case DebugLevel: + return "debug" + case InfoLevel: + return "info" + case WarnLevel: + return "warning" + case ErrorLevel: + return "error" + case FatalLevel: + return "fatal" + case PanicLevel: + return "panic" + } + + return "unknown" +} + +// ParseLevel takes a string level and returns the Logrus log level constant. +func ParseLevel(lvl string) (Level, error) { + switch strings.ToLower(lvl) { + case "panic": + return PanicLevel, nil + case "fatal": + return FatalLevel, nil + case "error": + return ErrorLevel, nil + case "warn", "warning": + return WarnLevel, nil + case "info": + return InfoLevel, nil + case "debug": + return DebugLevel, nil + case "trace": + return TraceLevel, nil + } + + var l Level + return l, fmt.Errorf("not a valid logrus Level: %q", lvl) +} + +// A constant exposing all logging levels +var AllLevels = []Level{ + PanicLevel, + FatalLevel, + ErrorLevel, + WarnLevel, + InfoLevel, + DebugLevel, + TraceLevel, +} + +// These are the different logging levels. You can set the logging level to log +// on your instance of logger, obtained with `logrus.New()`. +const ( + // PanicLevel level, highest level of severity. Logs and then calls panic with the + // message passed to Debug, Info, ... + PanicLevel Level = iota + // FatalLevel level. Logs and then calls `logger.Exit(1)`. It will exit even if the + // logging level is set to Panic. + FatalLevel + // ErrorLevel level. Logs. Used for errors that should definitely be noted. + // Commonly used for hooks to send errors to an error tracking service. + ErrorLevel + // WarnLevel level. Non-critical entries that deserve eyes. + WarnLevel + // InfoLevel level. General operational entries about what's going on inside the + // application. + InfoLevel + // DebugLevel level. Usually only enabled when debugging. Very verbose logging. + DebugLevel + // TraceLevel level. Designates finer-grained informational events than the Debug. + TraceLevel +) + +// Won't compile if StdLogger can't be realized by a log.Logger +var ( + _ StdLogger = &log.Logger{} + _ StdLogger = &Entry{} + _ StdLogger = &Logger{} +) + +// StdLogger is what your logrus-enabled library should take, that way +// it'll accept a stdlib logger and a logrus logger. There's no standard +// interface, this is the closest we get, unfortunately. +type StdLogger interface { + Print(...interface{}) + Printf(string, ...interface{}) + Println(...interface{}) + + Fatal(...interface{}) + Fatalf(string, ...interface{}) + Fatalln(...interface{}) + + Panic(...interface{}) + Panicf(string, ...interface{}) + Panicln(...interface{}) +} + +// The FieldLogger interface generalizes the Entry and Logger types +type FieldLogger interface { + WithField(key string, value interface{}) *Entry + WithFields(fields Fields) *Entry + WithError(err error) *Entry + + Debugf(format string, args ...interface{}) + Infof(format string, args ...interface{}) + Printf(format string, args ...interface{}) + Warnf(format string, args ...interface{}) + Warningf(format string, args ...interface{}) + Errorf(format string, args ...interface{}) + Fatalf(format string, args ...interface{}) + Panicf(format string, args ...interface{}) + + Debug(args ...interface{}) + Info(args ...interface{}) + Print(args ...interface{}) + Warn(args ...interface{}) + Warning(args ...interface{}) + Error(args ...interface{}) + Fatal(args ...interface{}) + Panic(args ...interface{}) + + Debugln(args ...interface{}) + Infoln(args ...interface{}) + Println(args ...interface{}) + Warnln(args ...interface{}) + Warningln(args ...interface{}) + Errorln(args ...interface{}) + Fatalln(args ...interface{}) + Panicln(args ...interface{}) + + // IsDebugEnabled() bool + // IsInfoEnabled() bool + // IsWarnEnabled() bool + // IsErrorEnabled() bool + // IsFatalEnabled() bool + // IsPanicEnabled() bool +} + +// Ext1FieldLogger (the first extension to FieldLogger) is superfluous, it is +// here for consistancy. Do not use. Use Logger or Entry instead. +type Ext1FieldLogger interface { + FieldLogger + Tracef(format string, args ...interface{}) + Trace(args ...interface{}) + Traceln(args ...interface{}) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/terminal_check_appengine.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/terminal_check_appengine.go new file mode 100644 index 0000000000000000000000000000000000000000..2403de981929f6af51da8c875d09252e920601cb --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/terminal_check_appengine.go @@ -0,0 +1,11 @@ +// +build appengine + +package logrus + +import ( + "io" +) + +func checkIfTerminal(w io.Writer) bool { + return true +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/terminal_check_js.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/terminal_check_js.go new file mode 100644 index 0000000000000000000000000000000000000000..0c209750a334676aa3bc9e72820c49029e7c72cc --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/terminal_check_js.go @@ -0,0 +1,11 @@ +// +build js + +package logrus + +import ( + "io" +) + +func checkIfTerminal(w io.Writer) bool { + return false +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/terminal_check_notappengine.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/terminal_check_notappengine.go new file mode 100644 index 0000000000000000000000000000000000000000..cf309d6fb6e660ce7a50bbc1ed8b41a46abf562f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/terminal_check_notappengine.go @@ -0,0 +1,19 @@ +// +build !appengine,!js,!windows + +package logrus + +import ( + "io" + "os" + + "golang.org/x/crypto/ssh/terminal" +) + +func checkIfTerminal(w io.Writer) bool { + switch v := w.(type) { + case *os.File: + return terminal.IsTerminal(int(v.Fd())) + default: + return false + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/terminal_check_windows.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/terminal_check_windows.go new file mode 100644 index 0000000000000000000000000000000000000000..3b9d2864ca34644151d5dbc04d35446c67006540 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/terminal_check_windows.go @@ -0,0 +1,20 @@ +// +build !appengine,!js,windows + +package logrus + +import ( + "io" + "os" + "syscall" +) + +func checkIfTerminal(w io.Writer) bool { + switch v := w.(type) { + case *os.File: + var mode uint32 + err := syscall.GetConsoleMode(syscall.Handle(v.Fd()), &mode) + return err == nil + default: + return false + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/terminal_notwindows.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/terminal_notwindows.go new file mode 100644 index 0000000000000000000000000000000000000000..3dbd237203097781cacee7a675ac9f8226f6c89c --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/terminal_notwindows.go @@ -0,0 +1,8 @@ +// +build !windows + +package logrus + +import "io" + +func initTerminal(w io.Writer) { +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/terminal_windows.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/terminal_windows.go new file mode 100644 index 0000000000000000000000000000000000000000..b4ef5286cd472d46a7ee56fa80faa0f89f2ed52c --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/terminal_windows.go @@ -0,0 +1,18 @@ +// +build !appengine,!js,windows + +package logrus + +import ( + "io" + "os" + "syscall" + + sequences "github.com/konsorten/go-windows-terminal-sequences" +) + +func initTerminal(w io.Writer) { + switch v := w.(type) { + case *os.File: + sequences.EnableVirtualTerminalProcessing(syscall.Handle(v.Fd()), true) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/text_formatter.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/text_formatter.go new file mode 100644 index 0000000000000000000000000000000000000000..c5f9ca3c46175f741ba38be82e8b0d18feb001b7 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/text_formatter.go @@ -0,0 +1,269 @@ +package logrus + +import ( + "bytes" + "fmt" + "os" + "sort" + "strings" + "sync" + "time" +) + +const ( + nocolor = 0 + red = 31 + green = 32 + yellow = 33 + blue = 36 + gray = 37 +) + +var ( + baseTimestamp time.Time + emptyFieldMap FieldMap +) + +func init() { + baseTimestamp = time.Now() +} + +// TextFormatter formats logs into text +type TextFormatter struct { + // Set to true to bypass checking for a TTY before outputting colors. + ForceColors bool + + // Force disabling colors. + DisableColors bool + + // Override coloring based on CLICOLOR and CLICOLOR_FORCE. - https://bixense.com/clicolors/ + EnvironmentOverrideColors bool + + // Disable timestamp logging. useful when output is redirected to logging + // system that already adds timestamps. + DisableTimestamp bool + + // Enable logging the full timestamp when a TTY is attached instead of just + // the time passed since beginning of execution. + FullTimestamp bool + + // TimestampFormat to use for display when a full timestamp is printed + TimestampFormat string + + // The fields are sorted by default for a consistent output. For applications + // that log extremely frequently and don't use the JSON formatter this may not + // be desired. + DisableSorting bool + + // The keys sorting function, when uninitialized it uses sort.Strings. + SortingFunc func([]string) + + // Disables the truncation of the level text to 4 characters. + DisableLevelTruncation bool + + // QuoteEmptyFields will wrap empty fields in quotes if true + QuoteEmptyFields bool + + // Whether the logger's out is to a terminal + isTerminal bool + + // FieldMap allows users to customize the names of keys for default fields. + // As an example: + // formatter := &TextFormatter{ + // FieldMap: FieldMap{ + // FieldKeyTime: "@timestamp", + // FieldKeyLevel: "@level", + // FieldKeyMsg: "@message"}} + FieldMap FieldMap + + terminalInitOnce sync.Once +} + +func (f *TextFormatter) init(entry *Entry) { + if entry.Logger != nil { + f.isTerminal = checkIfTerminal(entry.Logger.Out) + + if f.isTerminal { + initTerminal(entry.Logger.Out) + } + } +} + +func (f *TextFormatter) isColored() bool { + isColored := f.ForceColors || f.isTerminal + + if f.EnvironmentOverrideColors { + if force, ok := os.LookupEnv("CLICOLOR_FORCE"); ok && force != "0" { + isColored = true + } else if ok && force == "0" { + isColored = false + } else if os.Getenv("CLICOLOR") == "0" { + isColored = false + } + } + + return isColored && !f.DisableColors +} + +// Format renders a single log entry +func (f *TextFormatter) Format(entry *Entry) ([]byte, error) { + prefixFieldClashes(entry.Data, f.FieldMap, entry.HasCaller()) + + keys := make([]string, 0, len(entry.Data)) + for k := range entry.Data { + keys = append(keys, k) + } + + fixedKeys := make([]string, 0, 4+len(entry.Data)) + if !f.DisableTimestamp { + fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyTime)) + } + fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyLevel)) + if entry.Message != "" { + fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyMsg)) + } + if entry.err != "" { + fixedKeys = append(fixedKeys, f.FieldMap.resolve(FieldKeyLogrusError)) + } + if entry.HasCaller() { + fixedKeys = append(fixedKeys, + f.FieldMap.resolve(FieldKeyFunc), f.FieldMap.resolve(FieldKeyFile)) + } + + if !f.DisableSorting { + if f.SortingFunc == nil { + sort.Strings(keys) + fixedKeys = append(fixedKeys, keys...) + } else { + if !f.isColored() { + fixedKeys = append(fixedKeys, keys...) + f.SortingFunc(fixedKeys) + } else { + f.SortingFunc(keys) + } + } + } else { + fixedKeys = append(fixedKeys, keys...) + } + + var b *bytes.Buffer + if entry.Buffer != nil { + b = entry.Buffer + } else { + b = &bytes.Buffer{} + } + + f.terminalInitOnce.Do(func() { f.init(entry) }) + + timestampFormat := f.TimestampFormat + if timestampFormat == "" { + timestampFormat = defaultTimestampFormat + } + if f.isColored() { + f.printColored(b, entry, keys, timestampFormat) + } else { + for _, key := range fixedKeys { + var value interface{} + switch key { + case f.FieldMap.resolve(FieldKeyTime): + value = entry.Time.Format(timestampFormat) + case f.FieldMap.resolve(FieldKeyLevel): + value = entry.Level.String() + case f.FieldMap.resolve(FieldKeyMsg): + value = entry.Message + case f.FieldMap.resolve(FieldKeyLogrusError): + value = entry.err + case f.FieldMap.resolve(FieldKeyFunc): + value = entry.Caller.Function + case f.FieldMap.resolve(FieldKeyFile): + value = fmt.Sprintf("%s:%d", entry.Caller.File, entry.Caller.Line) + default: + value = entry.Data[key] + } + f.appendKeyValue(b, key, value) + } + } + + b.WriteByte('\n') + return b.Bytes(), nil +} + +func (f *TextFormatter) printColored(b *bytes.Buffer, entry *Entry, keys []string, timestampFormat string) { + var levelColor int + switch entry.Level { + case DebugLevel, TraceLevel: + levelColor = gray + case WarnLevel: + levelColor = yellow + case ErrorLevel, FatalLevel, PanicLevel: + levelColor = red + default: + levelColor = blue + } + + levelText := strings.ToUpper(entry.Level.String()) + if !f.DisableLevelTruncation { + levelText = levelText[0:4] + } + + // Remove a single newline if it already exists in the message to keep + // the behavior of logrus text_formatter the same as the stdlib log package + entry.Message = strings.TrimSuffix(entry.Message, "\n") + + caller := "" + + if entry.HasCaller() { + caller = fmt.Sprintf("%s:%d %s()", + entry.Caller.File, entry.Caller.Line, entry.Caller.Function) + } + + if f.DisableTimestamp { + fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m%s %-44s ", levelColor, levelText, caller, entry.Message) + } else if !f.FullTimestamp { + fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%04d]%s %-44s ", levelColor, levelText, int(entry.Time.Sub(baseTimestamp)/time.Second), caller, entry.Message) + } else { + fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%s]%s %-44s ", levelColor, levelText, entry.Time.Format(timestampFormat), caller, entry.Message) + } + for _, k := range keys { + v := entry.Data[k] + fmt.Fprintf(b, " \x1b[%dm%s\x1b[0m=", levelColor, k) + f.appendValue(b, v) + } +} + +func (f *TextFormatter) needsQuoting(text string) bool { + if f.QuoteEmptyFields && len(text) == 0 { + return true + } + for _, ch := range text { + if !((ch >= 'a' && ch <= 'z') || + (ch >= 'A' && ch <= 'Z') || + (ch >= '0' && ch <= '9') || + ch == '-' || ch == '.' || ch == '_' || ch == '/' || ch == '@' || ch == '^' || ch == '+') { + return true + } + } + return false +} + +func (f *TextFormatter) appendKeyValue(b *bytes.Buffer, key string, value interface{}) { + if b.Len() > 0 { + b.WriteByte(' ') + } + b.WriteString(key) + b.WriteByte('=') + f.appendValue(b, value) +} + +func (f *TextFormatter) appendValue(b *bytes.Buffer, value interface{}) { + stringVal, ok := value.(string) + if !ok { + stringVal = fmt.Sprint(value) + } + + if !f.needsQuoting(stringVal) { + b.WriteString(stringVal) + } else { + b.WriteString(fmt.Sprintf("%q", stringVal)) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/writer.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/writer.go new file mode 100644 index 0000000000000000000000000000000000000000..9e1f7513597d24c03ba25afd911b3d8a733c5c5f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Sirupsen/logrus/writer.go @@ -0,0 +1,64 @@ +package logrus + +import ( + "bufio" + "io" + "runtime" +) + +func (logger *Logger) Writer() *io.PipeWriter { + return logger.WriterLevel(InfoLevel) +} + +func (logger *Logger) WriterLevel(level Level) *io.PipeWriter { + return NewEntry(logger).WriterLevel(level) +} + +func (entry *Entry) Writer() *io.PipeWriter { + return entry.WriterLevel(InfoLevel) +} + +func (entry *Entry) WriterLevel(level Level) *io.PipeWriter { + reader, writer := io.Pipe() + + var printFunc func(args ...interface{}) + + switch level { + case TraceLevel: + printFunc = entry.Trace + case DebugLevel: + printFunc = entry.Debug + case InfoLevel: + printFunc = entry.Info + case WarnLevel: + printFunc = entry.Warn + case ErrorLevel: + printFunc = entry.Error + case FatalLevel: + printFunc = entry.Fatal + case PanicLevel: + printFunc = entry.Panic + default: + printFunc = entry.Print + } + + go entry.writerScanner(reader, printFunc) + runtime.SetFinalizer(writer, writerFinalizer) + + return writer +} + +func (entry *Entry) writerScanner(reader *io.PipeReader, printFunc func(args ...interface{})) { + scanner := bufio.NewScanner(reader) + for scanner.Scan() { + printFunc(scanner.Text()) + } + if err := scanner.Err(); err != nil { + entry.Errorf("Error while reading from Writer: %s", err) + } + reader.Close() +} + +func writerFinalizer(writer *io.PipeWriter) { + writer.Close() +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Unknwon/goconfig/LICENSE b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Unknwon/goconfig/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..8405e89a0b12024529554191c9b7ec20acc116fd --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Unknwon/goconfig/LICENSE @@ -0,0 +1,191 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of Copyright License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +3. Grant of Patent License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. + +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification within +third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Unknwon/goconfig/README.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Unknwon/goconfig/README.md new file mode 100644 index 0000000000000000000000000000000000000000..da6f144700116f5bdf671b964ff39cd281c46a15 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Unknwon/goconfig/README.md @@ -0,0 +1,72 @@ +goconfig [![Build Status](https://drone.io/github.com/Unknwon/goconfig/status.png)](https://drone.io/github.com/Unknwon/goconfig/latest) [![Go Walker](http://gowalker.org/api/v1/badge)](http://gowalker.org/github.com/Unknwon/goconfig) +======== + +[中文文档](README_ZH.md) + +**IMPORTANT** + +- This library is under bug fix only mode, which means no more features will be added. +- I'm continuing working on better Go code with a different library: [ini](https://github.com/go-ini/ini). + +## About + +Package goconfig is a easy-use, comments-support configuration file parser for the Go Programming Language, which provides a structure similar to what you would find on Microsoft Windows INI files. + +The configuration file consists of sections, led by a `[section]` header and followed by `name:value` or `name=value` entries. Note that leading whitespace is removed from values. The optional values can contain format strings which refer to other values in the same section, or values in a special DEFAULT section. Comments are indicated by ";" or "#"; comments may begin anywhere on a single line. + +## Features + +- It simplified operation processes, easy to use and undersatnd; therefore, there are less chances to have errors. +- It uses exactly the same way to access a configuration file as you use Windows APIs, so you don't need to change your code style. +- It supports read recursion sections. +- It supports auto increment of key. +- It supports **READ** and **WRITE** configuration file with comments each section or key which all the other parsers don't support!!!!!!! +- It supports get value through type bool, float64, int, int64 and string, methods that start with "Must" means ignore errors and get zero-value if error occurs, or you can specify a default value. +- It's able to load multiple files to overwrite key values. + +## Installation + + go get github.com/Unknwon/goconfig + +Or + + gopm get github.com/Unknwon/goconfig + +## API Documentation + +[Go Walker](http://gowalker.org/github.com/Unknwon/goconfig). + +## Example + +Please see [conf.ini](testdata/conf.ini) as an example. + +### Usage + +- Function `LoadConfigFile` load file(s) depends on your situation, and return a variable with type `ConfigFile`. +- `GetValue` gives basic functionality of getting a value of given section and key. +- Methods like `Bool`, `Int`, `Int64` return corresponding type of values. +- Methods start with `Must` return corresponding type of values and returns zero-value of given type if something goes wrong. +- `SetValue` sets value to given section and key, and inserts somewhere if it does not exist. +- `DeleteKey` deletes by given section and key. +- Finally, `SaveConfigFile` saves your configuration to local file system. +- Use method `Reload` in case someone else modified your file(s). +- Methods contains `Comment` help you manipulate comments. +- `LoadFromReader` allows loading data without an intermediate file. +- `SaveConfigData` added, which writes configuration to an arbitrary writer. +- `ReloadData` allows to reload data from memory. + +Note that you cannot mix in-memory configuration with on-disk configuration. + +## More Information + +- All characters are CASE SENSITIVE, BE CAREFUL! + +## Credits + +- [goconf](http://code.google.com/p/goconf/) +- [robfig/config](https://github.com/robfig/config) +- [Delete an item from a slice](https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/lYz8ftASMQ0) + +## License + +This project is under Apache v2 License. See the [LICENSE](LICENSE) file for the full license text. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Unknwon/goconfig/README_ZH.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Unknwon/goconfig/README_ZH.md new file mode 100644 index 0000000000000000000000000000000000000000..d5fcbb95b68e52865be76cbe13aeb2b644690311 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Unknwon/goconfig/README_ZH.md @@ -0,0 +1,64 @@ +goconfig [![Build Status](https://drone.io/github.com/Unknwon/goconfig/status.png)](https://drone.io/github.com/Unknwon/goconfig/latest) [![Go Walker](http://gowalker.org/api/v1/badge)](http://gowalker.org/github.com/Unknwon/goconfig) +======== + +本库已被 [《Go名库讲解》](https://github.com/Unknwon/go-rock-libraries-showcases/tree/master/lectures/01-goconfig) 收录讲解,欢迎前往学习如何使用! + +编码规范:基于 [Go 编码规范](https://github.com/Unknwon/go-code-convention) + +## 关于 + +包 goconfig 是一个易于使用,支持注释的 Go 语言配置文件解析器,该文件的书写格式和 Windows 下的 INI 文件一样。 + +配置文件由形为 `[section]` 的节构成,内部使用 `name:value` 或 `name=value` 这样的键值对;每行开头和尾部的空白符号都将被忽略;如果未指定任何节,则会默认放入名为 `DEFAULT` 的节当中;可以使用 “;” 或 “#” 来作为注释的开头,并可以放置于任意的单独一行中。 + +## 特性 + +- 简化流程,易于理解,更少出错。 +- 提供与 Windows API 一模一样的操作方式。 +- 支持读取递归节。 +- 支持自增键名。 +- 支持对注释的 **读** 和 **写** 操作,其它所有解析器都不支持!!!! +- 可以直接返回 bool, float64, int, int64 和 string 类型的值,如果使用 “Must” 开头的方法,则一定会返回这个类型的一个值而不返回错误,如果错误发生则会返回零值。 +- 支持加载多个文件来重写值。 + +## 安装 + + go get github.com/Unknwon/goconfig + +或 + + gopm get github.com/Unknwon/goconfig + + +## API 文档 + +[Go Walker](http://gowalker.org/github.com/Unknwon/goconfig). + +## 示例 + +请查看 [conf.ini](testdata/conf.ini) 文件作为使用示例。 + +### 用例 + +- 函数 `LoadConfigFile` 加载一个或多个文件,然后返回一个类型为 `ConfigFile` 的变量。 +- `GetValue` 可以简单的获取某个值。 +- 像 `Bool`、`Int`、`Int64` 这样的方法会直接返回指定类型的值。 +- 以 `Must` 开头的方法不会返回错误,但当错误发生时会返回零值。 +- `SetValue` 可以设置某个值。 +- `DeleteKey` 可以删除某个键。 +- 最后,`SaveConfigFile` 可以保持您的配置到本地文件系统。 +- 使用方法 `Reload` 可以重载您的配置文件。 + +## 更多信息 + +- 所有字符都是大小写敏感的! + +## 参考信息 + +- [goconf](http://code.google.com/p/goconf/) +- [robfig/config](https://github.com/robfig/config) +- [Delete an item from a slice](https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/lYz8ftASMQ0) + +## 授权许可 + +本项目采用 Apache v2 开源授权许可证,完整的授权说明已放置在 [LICENSE](LICENSE) 文件中。 diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Unknwon/goconfig/conf.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Unknwon/goconfig/conf.go new file mode 100644 index 0000000000000000000000000000000000000000..b48779a2fb438f1fbbc948fc6656b65d52892512 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Unknwon/goconfig/conf.go @@ -0,0 +1,536 @@ +// Copyright 2013 Unknwon +// +// Licensed under the Apache License, Version 2.0 (the "License"): you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// 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 goconfig is a fully functional and comments-support configuration file(.ini) parser. +package goconfig + +import ( + "fmt" + "regexp" + "runtime" + "strconv" + "strings" + "sync" +) + +const ( + // Default section name. + DEFAULT_SECTION = "DEFAULT" + // Maximum allowed depth when recursively substituing variable names. + _DEPTH_VALUES = 200 +) + +type ParseError int + +const ( + ERR_SECTION_NOT_FOUND ParseError = iota + 1 + ERR_KEY_NOT_FOUND + ERR_BLANK_SECTION_NAME + ERR_COULD_NOT_PARSE +) + +var LineBreak = "\n" + +// Variable regexp pattern: %(variable)s +var varPattern = regexp.MustCompile(`%\(([^\)]+)\)s`) + +func init() { + if runtime.GOOS == "windows" { + LineBreak = "\r\n" + } +} + +// A ConfigFile represents a INI formar configuration file. +type ConfigFile struct { + lock sync.RWMutex // Go map is not safe. + fileNames []string // Support mutil-files. + data map[string]map[string]string // Section -> key : value + + // Lists can keep sections and keys in order. + sectionList []string // Section name list. + keyList map[string][]string // Section -> Key name list + + sectionComments map[string]string // Sections comments. + keyComments map[string]map[string]string // Keys comments. + BlockMode bool // Indicates whether use lock or not. +} + +// newConfigFile creates an empty configuration representation. +func newConfigFile(fileNames []string) *ConfigFile { + c := new(ConfigFile) + c.fileNames = fileNames + c.data = make(map[string]map[string]string) + c.keyList = make(map[string][]string) + c.sectionComments = make(map[string]string) + c.keyComments = make(map[string]map[string]string) + c.BlockMode = true + return c +} + +// SetValue adds a new section-key-value to the configuration. +// It returns true if the key and value were inserted, +// or returns false if the value was overwritten. +// If the section does not exist in advance, it will be created. +func (c *ConfigFile) SetValue(section, key, value string) bool { + // Blank section name represents DEFAULT section. + if len(section) == 0 { + section = DEFAULT_SECTION + } + if len(key) == 0 { + return false + } + + if c.BlockMode { + c.lock.Lock() + defer c.lock.Unlock() + } + + // Check if section exists. + if _, ok := c.data[section]; !ok { + // Execute add operation. + c.data[section] = make(map[string]string) + // Append section to list. + c.sectionList = append(c.sectionList, section) + } + + // Check if key exists. + _, ok := c.data[section][key] + c.data[section][key] = value + if !ok { + // If not exists, append to key list. + c.keyList[section] = append(c.keyList[section], key) + } + return !ok +} + +// DeleteKey deletes the key in given section. +// It returns true if the key was deleted, +// or returns false if the section or key didn't exist. +func (c *ConfigFile) DeleteKey(section, key string) bool { + // Blank section name represents DEFAULT section. + if len(section) == 0 { + section = DEFAULT_SECTION + } + + // Check if section exists. + if _, ok := c.data[section]; !ok { + return false + } + + // Check if key exists. + if _, ok := c.data[section][key]; ok { + delete(c.data[section], key) + // Remove comments of key. + c.SetKeyComments(section, key, "") + // Get index of key. + i := 0 + for _, keyName := range c.keyList[section] { + if keyName == key { + break + } + i++ + } + // Remove from key list. + c.keyList[section] = append(c.keyList[section][:i], c.keyList[section][i+1:]...) + return true + } + return false +} + +// GetValue returns the value of key available in the given section. +// If the value needs to be unfolded +// (see e.g. %(google)s example in the GoConfig_test.go), +// then String does this unfolding automatically, up to +// _DEPTH_VALUES number of iterations. +// It returns an error and empty string value if the section does not exist, +// or key does not exist in DEFAULT and current sections. +func (c *ConfigFile) GetValue(section, key string) (string, error) { + if c.BlockMode { + c.lock.RLock() + defer c.lock.RUnlock() + } + + // Blank section name represents DEFAULT section. + if len(section) == 0 { + section = DEFAULT_SECTION + } + + // Check if section exists + if _, ok := c.data[section]; !ok { + // Section does not exist. + return "", getError{ERR_SECTION_NOT_FOUND, section} + } + + // Section exists. + // Check if key exists or empty value. + value, ok := c.data[section][key] + if !ok { + // Check if it is a sub-section. + if i := strings.LastIndex(section, "."); i > -1 { + return c.GetValue(section[:i], key) + } + + // Return empty value. + return "", getError{ERR_KEY_NOT_FOUND, key} + } + + // Key exists. + var i int + for i = 0; i < _DEPTH_VALUES; i++ { + vr := varPattern.FindString(value) + if len(vr) == 0 { + break + } + + // Take off leading '%(' and trailing ')s'. + noption := strings.TrimLeft(vr, "%(") + noption = strings.TrimRight(noption, ")s") + + // Search variable in default section. + nvalue, err := c.GetValue(DEFAULT_SECTION, noption) + if err != nil && section != DEFAULT_SECTION { + // Search in the same section. + if _, ok := c.data[section][noption]; ok { + nvalue = c.data[section][noption] + } + } + + // Substitute by new value and take off leading '%(' and trailing ')s'. + value = strings.Replace(value, vr, nvalue, -1) + } + return value, nil +} + +// Bool returns bool type value. +func (c *ConfigFile) Bool(section, key string) (bool, error) { + value, err := c.GetValue(section, key) + if err != nil { + return false, err + } + return strconv.ParseBool(value) +} + +// Float64 returns float64 type value. +func (c *ConfigFile) Float64(section, key string) (float64, error) { + value, err := c.GetValue(section, key) + if err != nil { + return 0.0, err + } + return strconv.ParseFloat(value, 64) +} + +// Int returns int type value. +func (c *ConfigFile) Int(section, key string) (int, error) { + value, err := c.GetValue(section, key) + if err != nil { + return 0, err + } + return strconv.Atoi(value) +} + +// Int64 returns int64 type value. +func (c *ConfigFile) Int64(section, key string) (int64, error) { + value, err := c.GetValue(section, key) + if err != nil { + return 0, err + } + return strconv.ParseInt(value, 10, 64) +} + +// MustValue always returns value without error. +// It returns empty string if error occurs, or the default value if given. +func (c *ConfigFile) MustValue(section, key string, defaultVal ...string) string { + val, err := c.GetValue(section, key) + if len(defaultVal) > 0 && (err != nil || len(val) == 0) { + return defaultVal[0] + } + return val +} + +// MustValue always returns value without error, +// It returns empty string if error occurs, or the default value if given, +// and a bool value indicates whether default value is returned. +func (c *ConfigFile) MustValueSet(section, key string, defaultVal ...string) (string, bool) { + val, err := c.GetValue(section, key) + if len(defaultVal) > 0 && (err != nil || len(val) == 0) { + c.SetValue(section, key, defaultVal[0]) + return defaultVal[0], true + } + return val, false +} + +// MustValueRange always returns value without error, +// it returns default value if error occurs or doesn't fit into range. +func (c *ConfigFile) MustValueRange(section, key, defaultVal string, candidates []string) string { + val, err := c.GetValue(section, key) + if err != nil || len(val) == 0 { + return defaultVal + } + + for _, cand := range candidates { + if val == cand { + return val + } + } + return defaultVal +} + +// MustValueArray always returns value array without error, +// it returns empty array if error occurs, split by delimiter otherwise. +func (c *ConfigFile) MustValueArray(section, key, delim string) []string { + val, err := c.GetValue(section, key) + if err != nil || len(val) == 0 { + return []string{} + } + + vals := strings.Split(val, delim) + for i := range vals { + vals[i] = strings.TrimSpace(vals[i]) + } + return vals +} + +// MustBool always returns value without error, +// it returns false if error occurs. +func (c *ConfigFile) MustBool(section, key string, defaultVal ...bool) bool { + val, err := c.Bool(section, key) + if len(defaultVal) > 0 && err != nil { + return defaultVal[0] + } + return val +} + +// MustFloat64 always returns value without error, +// it returns 0.0 if error occurs. +func (c *ConfigFile) MustFloat64(section, key string, defaultVal ...float64) float64 { + value, err := c.Float64(section, key) + if len(defaultVal) > 0 && err != nil { + return defaultVal[0] + } + return value +} + +// MustInt always returns value without error, +// it returns 0 if error occurs. +func (c *ConfigFile) MustInt(section, key string, defaultVal ...int) int { + value, err := c.Int(section, key) + if len(defaultVal) > 0 && err != nil { + return defaultVal[0] + } + return value +} + +// MustInt64 always returns value without error, +// it returns 0 if error occurs. +func (c *ConfigFile) MustInt64(section, key string, defaultVal ...int64) int64 { + value, err := c.Int64(section, key) + if len(defaultVal) > 0 && err != nil { + return defaultVal[0] + } + return value +} + +// GetSectionList returns the list of all sections +// in the same order in the file. +func (c *ConfigFile) GetSectionList() []string { + list := make([]string, len(c.sectionList)) + copy(list, c.sectionList) + return list +} + +// GetKeyList returns the list of all keys in give section +// in the same order in the file. +// It returns nil if given section does not exist. +func (c *ConfigFile) GetKeyList(section string) []string { + // Blank section name represents DEFAULT section. + if len(section) == 0 { + section = DEFAULT_SECTION + } + + // Check if section exists. + if _, ok := c.data[section]; !ok { + return nil + } + + // Non-default section has a blank key as section keeper. + offset := 1 + if section == DEFAULT_SECTION { + offset = 0 + } + + list := make([]string, len(c.keyList[section])-offset) + copy(list, c.keyList[section][offset:]) + return list +} + +// DeleteSection deletes the entire section by given name. +// It returns true if the section was deleted, and false if the section didn't exist. +func (c *ConfigFile) DeleteSection(section string) bool { + // Blank section name represents DEFAULT section. + if len(section) == 0 { + section = DEFAULT_SECTION + } + + // Check if section exists. + if _, ok := c.data[section]; !ok { + return false + } + + delete(c.data, section) + // Remove comments of section. + c.SetSectionComments(section, "") + // Get index of section. + i := 0 + for _, secName := range c.sectionList { + if secName == section { + break + } + i++ + } + // Remove from section and key list. + c.sectionList = append(c.sectionList[:i], c.sectionList[i+1:]...) + delete(c.keyList, section) + return true +} + +// GetSection returns key-value pairs in given section. +// It section does not exist, returns nil and error. +func (c *ConfigFile) GetSection(section string) (map[string]string, error) { + // Blank section name represents DEFAULT section. + if len(section) == 0 { + section = DEFAULT_SECTION + } + + // Check if section exists. + if _, ok := c.data[section]; !ok { + // Section does not exist. + return nil, getError{ERR_SECTION_NOT_FOUND, section} + } + + // Remove pre-defined key. + secMap := c.data[section] + delete(c.data[section], " ") + + // Section exists. + return secMap, nil +} + +// SetSectionComments adds new section comments to the configuration. +// If comments are empty(0 length), it will remove its section comments! +// It returns true if the comments were inserted or removed, +// or returns false if the comments were overwritten. +func (c *ConfigFile) SetSectionComments(section, comments string) bool { + // Blank section name represents DEFAULT section. + if len(section) == 0 { + section = DEFAULT_SECTION + } + + if len(comments) == 0 { + if _, ok := c.sectionComments[section]; ok { + delete(c.sectionComments, section) + } + + // Not exists can be seen as remove. + return true + } + + // Check if comments exists. + _, ok := c.sectionComments[section] + if comments[0] != '#' && comments[0] != ';' { + comments = "; " + comments + } + c.sectionComments[section] = comments + return !ok +} + +// SetKeyComments adds new section-key comments to the configuration. +// If comments are empty(0 length), it will remove its section-key comments! +// It returns true if the comments were inserted or removed, +// or returns false if the comments were overwritten. +// If the section does not exist in advance, it is created. +func (c *ConfigFile) SetKeyComments(section, key, comments string) bool { + // Blank section name represents DEFAULT section. + if len(section) == 0 { + section = DEFAULT_SECTION + } + + // Check if section exists. + if _, ok := c.keyComments[section]; ok { + if len(comments) == 0 { + if _, ok := c.keyComments[section][key]; ok { + delete(c.keyComments[section], key) + } + + // Not exists can be seen as remove. + return true + } + } else { + if len(comments) == 0 { + // Not exists can be seen as remove. + return true + } else { + // Execute add operation. + c.keyComments[section] = make(map[string]string) + } + } + + // Check if key exists. + _, ok := c.keyComments[section][key] + if comments[0] != '#' && comments[0] != ';' { + comments = "; " + comments + } + c.keyComments[section][key] = comments + return !ok +} + +// GetSectionComments returns the comments in the given section. +// It returns an empty string(0 length) if the comments do not exist. +func (c *ConfigFile) GetSectionComments(section string) (comments string) { + // Blank section name represents DEFAULT section. + if len(section) == 0 { + section = DEFAULT_SECTION + } + return c.sectionComments[section] +} + +// GetKeyComments returns the comments of key in the given section. +// It returns an empty string(0 length) if the comments do not exist. +func (c *ConfigFile) GetKeyComments(section, key string) (comments string) { + // Blank section name represents DEFAULT section. + if len(section) == 0 { + section = DEFAULT_SECTION + } + + if _, ok := c.keyComments[section]; ok { + return c.keyComments[section][key] + } + return "" +} + +// getError occurs when get value in configuration file with invalid parameter. +type getError struct { + Reason ParseError + Name string +} + +// Error implements Error interface. +func (err getError) Error() string { + switch err.Reason { + case ERR_SECTION_NOT_FOUND: + return fmt.Sprintf("section '%s' not found", err.Name) + case ERR_KEY_NOT_FOUND: + return fmt.Sprintf("key '%s' not found", err.Name) + } + return "invalid get error" +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Unknwon/goconfig/read.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Unknwon/goconfig/read.go new file mode 100644 index 0000000000000000000000000000000000000000..6afb07188813b6353ced7a26489fc1553e5ede34 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Unknwon/goconfig/read.go @@ -0,0 +1,294 @@ +// Copyright 2013 Unknwon +// +// Licensed under the Apache License, Version 2.0 (the "License"): you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// 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 goconfig + +import ( + "bufio" + "bytes" + "fmt" + "io" + "io/ioutil" + "os" + "path" + "strings" + "time" +) + +// Read reads an io.Reader and returns a configuration representation. +// This representation can be queried with GetValue. +func (c *ConfigFile) read(reader io.Reader) (err error) { + buf := bufio.NewReader(reader) + + // Handle BOM-UTF8. + // http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding + mask, err := buf.Peek(3) + if err == nil && len(mask) >= 3 && + mask[0] == 239 && mask[1] == 187 && mask[2] == 191 { + buf.Read(mask) + } + + count := 1 // Counter for auto increment. + // Current section name. + section := DEFAULT_SECTION + var comments string + // Parse line-by-line + for { + line, err := buf.ReadString('\n') + line = strings.TrimSpace(line) + lineLengh := len(line) //[SWH|+] + if err != nil { + if err != io.EOF { + return err + } + + // Reached end of file, if nothing to read then break, + // otherwise handle the last line. + if lineLengh == 0 { + break + } + } + + // switch written for readability (not performance) + switch { + case lineLengh == 0: // Empty line + continue + case line[0] == '#' || line[0] == ';': // Comment + // Append comments + if len(comments) == 0 { + comments = line + } else { + comments += LineBreak + line + } + continue + case line[0] == '[' && line[lineLengh-1] == ']': // New sction. + // Get section name. + section = strings.TrimSpace(line[1 : lineLengh-1]) + // Set section comments and empty if it has comments. + if len(comments) > 0 { + c.SetSectionComments(section, comments) + comments = "" + } + // Make section exist even though it does not have any key. + c.SetValue(section, " ", " ") + // Reset counter. + count = 1 + continue + case section == "": // No section defined so far + return readError{ERR_BLANK_SECTION_NAME, line} + default: // Other alternatives + var ( + i int + keyQuote string + key string + valQuote string + value string + ) + //[SWH|+]:支持引号包围起来的字串 + if line[0] == '"' { + if lineLengh >= 6 && line[0:3] == `"""` { + keyQuote = `"""` + } else { + keyQuote = `"` + } + } else if line[0] == '`' { + keyQuote = "`" + } + if keyQuote != "" { + qLen := len(keyQuote) + pos := strings.Index(line[qLen:], keyQuote) + if pos == -1 { + return readError{ERR_COULD_NOT_PARSE, line} + } + pos = pos + qLen + i = strings.IndexAny(line[pos:], "=:") + if i <= 0 { + return readError{ERR_COULD_NOT_PARSE, line} + } + i = i + pos + key = line[qLen:pos] //保留引号内的两端的空格 + } else { + i = strings.IndexAny(line, "=:") + if i <= 0 { + return readError{ERR_COULD_NOT_PARSE, line} + } + key = strings.TrimSpace(line[0:i]) + } + //[SWH|+]; + + // Check if it needs auto increment. + if key == "-" { + key = "#" + fmt.Sprint(count) + count++ + } + + //[SWH|+]:支持引号包围起来的字串 + lineRight := strings.TrimSpace(line[i+1:]) + lineRightLength := len(lineRight) + firstChar := "" + if lineRightLength >= 2 { + firstChar = lineRight[0:1] + } + if firstChar == "`" { + valQuote = "`" + } else if lineRightLength >= 6 && lineRight[0:3] == `"""` { + valQuote = `"""` + } + if valQuote != "" { + qLen := len(valQuote) + pos := strings.LastIndex(lineRight[qLen:], valQuote) + if pos == -1 { + return readError{ERR_COULD_NOT_PARSE, line} + } + pos = pos + qLen + value = lineRight[qLen:pos] + } else { + value = strings.TrimSpace(lineRight[0:]) + } + //[SWH|+]; + + c.SetValue(section, key, value) + // Set key comments and empty if it has comments. + if len(comments) > 0 { + c.SetKeyComments(section, key, comments) + comments = "" + } + } + + // Reached end of file. + if err == io.EOF { + break + } + } + return nil +} + +// LoadFromData accepts raw data directly from memory +// and returns a new configuration representation. +// Note that the configuration is written to the system +// temporary folder, so your file should not contain +// sensitive information. +func LoadFromData(data []byte) (c *ConfigFile, err error) { + // Save memory data to temporary file to support further operations. + tmpName := path.Join(os.TempDir(), "goconfig", fmt.Sprintf("%d", time.Now().Nanosecond())) + if err = os.MkdirAll(path.Dir(tmpName), os.ModePerm); err != nil { + return nil, err + } + if err = ioutil.WriteFile(tmpName, data, 0655); err != nil { + return nil, err + } + + c = newConfigFile([]string{tmpName}) + err = c.read(bytes.NewBuffer(data)) + return c, err +} + +// LoadFromReader accepts raw data directly from a reader +// and returns a new configuration representation. +// You must use ReloadData to reload. +// You cannot append files a configfile read this way. +func LoadFromReader(in io.Reader) (c *ConfigFile, err error) { + c = newConfigFile([]string{""}) + err = c.read(in) + return c, err +} + +func (c *ConfigFile) loadFile(fileName string) (err error) { + f, err := os.Open(fileName) + if err != nil { + return err + } + defer f.Close() + + return c.read(f) +} + +// LoadConfigFile reads a file and returns a new configuration representation. +// This representation can be queried with GetValue. +func LoadConfigFile(fileName string, moreFiles ...string) (c *ConfigFile, err error) { + // Append files' name together. + fileNames := make([]string, 1, len(moreFiles)+1) + fileNames[0] = fileName + if len(moreFiles) > 0 { + fileNames = append(fileNames, moreFiles...) + } + + c = newConfigFile(fileNames) + + for _, name := range fileNames { + if err = c.loadFile(name); err != nil { + return nil, err + } + } + + return c, nil +} + +// Reload reloads configuration file in case it has changes. +func (c *ConfigFile) Reload() (err error) { + var cfg *ConfigFile + if len(c.fileNames) == 1 { + if c.fileNames[0] == "" { + return fmt.Errorf("file opened from in-memory data, use ReloadData to reload") + } + cfg, err = LoadConfigFile(c.fileNames[0]) + } else { + cfg, err = LoadConfigFile(c.fileNames[0], c.fileNames[1:]...) + } + + if err == nil { + *c = *cfg + } + return err +} + +// ReloadData reloads configuration file from memory +func (c *ConfigFile) ReloadData(in io.Reader) (err error) { + var cfg *ConfigFile + if len(c.fileNames) != 1 { + return fmt.Errorf("Multiple files loaded, unable to mix in-memory and file data") + } + + cfg, err = LoadFromReader(in) + if err == nil { + *c = *cfg + } + return err +} + +// AppendFiles appends more files to ConfigFile and reload automatically. +func (c *ConfigFile) AppendFiles(files ...string) error { + if len(c.fileNames) == 1 && c.fileNames[0] == "" { + return fmt.Errorf("Cannot append file data to in-memory data") + } + c.fileNames = append(c.fileNames, files...) + return c.Reload() +} + +// readError occurs when read configuration file with wrong format. +type readError struct { + Reason ParseError + Content string // Line content +} + +// Error implement Error interface. +func (err readError) Error() string { + switch err.Reason { + case ERR_BLANK_SECTION_NAME: + return "empty section name not allowed" + case ERR_COULD_NOT_PARSE: + return fmt.Sprintf("could not parse line: %s", string(err.Content)) + } + return "invalid read error" +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Unknwon/goconfig/write.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Unknwon/goconfig/write.go new file mode 100644 index 0000000000000000000000000000000000000000..af36d1ad8ccdca76868d3a7c025b0cc73cfb5e4e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/Unknwon/goconfig/write.go @@ -0,0 +1,117 @@ +// Copyright 2013 Unknwon +// +// Licensed under the Apache License, Version 2.0 (the "License"): you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// 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 goconfig + +import ( + "bytes" + "io" + "os" + "strings" +) + +// Write spaces around "=" to look better. +var PrettyFormat = true + +// SaveConfigData writes configuration to a writer +func SaveConfigData(c *ConfigFile, out io.Writer) (err error) { + equalSign := "=" + if PrettyFormat { + equalSign = " = " + } + + buf := bytes.NewBuffer(nil) + for _, section := range c.sectionList { + // Write section comments. + if len(c.GetSectionComments(section)) > 0 { + if _, err = buf.WriteString(c.GetSectionComments(section) + LineBreak); err != nil { + return err + } + } + + if section != DEFAULT_SECTION { + // Write section name. + if _, err = buf.WriteString("[" + section + "]" + LineBreak); err != nil { + return err + } + } + + for _, key := range c.keyList[section] { + if key != " " { + // Write key comments. + if len(c.GetKeyComments(section, key)) > 0 { + if _, err = buf.WriteString(c.GetKeyComments(section, key) + LineBreak); err != nil { + return err + } + } + + keyName := key + // Check if it's auto increment. + if keyName[0] == '#' { + keyName = "-" + } + //[SWH|+]:支持键名包含等号和冒号 + if strings.Contains(keyName, `=`) || strings.Contains(keyName, `:`) { + if strings.Contains(keyName, "`") { + if strings.Contains(keyName, `"`) { + keyName = `"""` + keyName + `"""` + } else { + keyName = `"` + keyName + `"` + } + } else { + keyName = "`" + keyName + "`" + } + } + value := c.data[section][key] + // In case key value contains "`" or "\"". + if strings.Contains(value, "`") { + if strings.Contains(value, `"`) { + value = `"""` + value + `"""` + } else { + value = `"` + value + `"` + } + } + + // Write key and value. + if _, err = buf.WriteString(keyName + equalSign + value + LineBreak); err != nil { + return err + } + } + } + + // Put a line between sections. + if _, err = buf.WriteString(LineBreak); err != nil { + return err + } + } + + if _, err := buf.WriteTo(out); err != nil { + return err + } + return nil +} + +// SaveConfigFile writes configuration file to local file system +func SaveConfigFile(c *ConfigFile, filename string) (err error) { + // Write configuration file by filename. + var f *os.File + if f, err = os.Create(filename); err != nil { + return err + } + + if err := SaveConfigData(c, f); err != nil { + return err + } + return f.Close() +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/LICENSE b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..5dbd424355d2478350d5de5b30afa692034f7524 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/LICENSE @@ -0,0 +1,13 @@ +Copyright 2014 astaxie + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/httplib/README.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/httplib/README.md new file mode 100644 index 0000000000000000000000000000000000000000..97df8e6b9691fab662842e031c0348a8e1178aff --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/httplib/README.md @@ -0,0 +1,97 @@ +# httplib +httplib is an libs help you to curl remote url. + +# How to use? + +## GET +you can use Get to crawl data. + + import "github.com/astaxie/beego/httplib" + + str, err := httplib.Get("http://beego.me/").String() + if err != nil { + // error + } + fmt.Println(str) + +## POST +POST data to remote url + + req := httplib.Post("http://beego.me/") + req.Param("username","astaxie") + req.Param("password","123456") + str, err := req.String() + if err != nil { + // error + } + fmt.Println(str) + +## Set timeout + +The default timeout is `60` seconds, function prototype: + + SetTimeout(connectTimeout, readWriteTimeout time.Duration) + +Example: + + // GET + httplib.Get("http://beego.me/").SetTimeout(100 * time.Second, 30 * time.Second) + + // POST + httplib.Post("http://beego.me/").SetTimeout(100 * time.Second, 30 * time.Second) + + +## Debug + +If you want to debug the request info, set the debug on + + httplib.Get("http://beego.me/").Debug(true) + +## Set HTTP Basic Auth + + str, err := Get("http://beego.me/").SetBasicAuth("user", "passwd").String() + if err != nil { + // error + } + fmt.Println(str) + +## Set HTTPS + +If request url is https, You can set the client support TSL: + + httplib.SetTLSClientConfig(&tls.Config{InsecureSkipVerify: true}) + +More info about the `tls.Config` please visit http://golang.org/pkg/crypto/tls/#Config + +## Set HTTP Version + +some servers need to specify the protocol version of HTTP + + httplib.Get("http://beego.me/").SetProtocolVersion("HTTP/1.1") + +## Set Cookie + +some http request need setcookie. So set it like this: + + cookie := &http.Cookie{} + cookie.Name = "username" + cookie.Value = "astaxie" + httplib.Get("http://beego.me/").SetCookie(cookie) + +## Upload file + +httplib support mutil file upload, use `req.PostFile()` + + req := httplib.Post("http://beego.me/") + req.Param("username","astaxie") + req.PostFile("uploadfile1", "httplib.pdf") + str, err := req.String() + if err != nil { + // error + } + fmt.Println(str) + + +See godoc for further documentation and examples. + +* [godoc.org/github.com/astaxie/beego/httplib](https://godoc.org/github.com/astaxie/beego/httplib) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/httplib/httplib.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/httplib/httplib.go new file mode 100644 index 0000000000000000000000000000000000000000..074cf66159eb7361e7a06c03ed7819a9914732b2 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/httplib/httplib.go @@ -0,0 +1,624 @@ +// Copyright 2014 beego Author. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT 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 httplib is used as http.Client +// Usage: +// +// import "github.com/astaxie/beego/httplib" +// +// b := httplib.Post("http://beego.me/") +// b.Param("username","astaxie") +// b.Param("password","123456") +// b.PostFile("uploadfile1", "httplib.pdf") +// b.PostFile("uploadfile2", "httplib.txt") +// str, err := b.String() +// if err != nil { +// t.Fatal(err) +// } +// fmt.Println(str) +// +// more docs http://beego.me/docs/module/httplib.md +package httplib + +import ( + "bytes" + "compress/gzip" + "crypto/tls" + "encoding/json" + "encoding/xml" + "io" + "io/ioutil" + "log" + "mime/multipart" + "net" + "net/http" + "net/http/cookiejar" + "net/http/httputil" + "net/url" + "os" + "strings" + "sync" + "time" + "gopkg.in/yaml.v2" +) + +var defaultSetting = BeegoHTTPSettings{ + UserAgent: "beegoServer", + ConnectTimeout: 60 * time.Second, + ReadWriteTimeout: 60 * time.Second, + Gzip: true, + DumpBody: true, +} + +var defaultCookieJar http.CookieJar +var settingMutex sync.Mutex + +// createDefaultCookie creates a global cookiejar to store cookies. +func createDefaultCookie() { + settingMutex.Lock() + defer settingMutex.Unlock() + defaultCookieJar, _ = cookiejar.New(nil) +} + +// SetDefaultSetting Overwrite default settings +func SetDefaultSetting(setting BeegoHTTPSettings) { + settingMutex.Lock() + defer settingMutex.Unlock() + defaultSetting = setting +} + +// NewBeegoRequest return *BeegoHttpRequest with specific method +func NewBeegoRequest(rawurl, method string) *BeegoHTTPRequest { + var resp http.Response + u, err := url.Parse(rawurl) + if err != nil { + log.Println("Httplib:", err) + } + req := http.Request{ + URL: u, + Method: method, + Header: make(http.Header), + Proto: "HTTP/1.1", + ProtoMajor: 1, + ProtoMinor: 1, + } + return &BeegoHTTPRequest{ + url: rawurl, + req: &req, + params: map[string][]string{}, + files: map[string]string{}, + setting: defaultSetting, + resp: &resp, + } +} + +// Get returns *BeegoHttpRequest with GET method. +func Get(url string) *BeegoHTTPRequest { + return NewBeegoRequest(url, "GET") +} + +// Post returns *BeegoHttpRequest with POST method. +func Post(url string) *BeegoHTTPRequest { + return NewBeegoRequest(url, "POST") +} + +// Put returns *BeegoHttpRequest with PUT method. +func Put(url string) *BeegoHTTPRequest { + return NewBeegoRequest(url, "PUT") +} + +// Delete returns *BeegoHttpRequest DELETE method. +func Delete(url string) *BeegoHTTPRequest { + return NewBeegoRequest(url, "DELETE") +} + +// Head returns *BeegoHttpRequest with HEAD method. +func Head(url string) *BeegoHTTPRequest { + return NewBeegoRequest(url, "HEAD") +} + +// BeegoHTTPSettings is the http.Client setting +type BeegoHTTPSettings struct { + ShowDebug bool + UserAgent string + ConnectTimeout time.Duration + ReadWriteTimeout time.Duration + TLSClientConfig *tls.Config + Proxy func(*http.Request) (*url.URL, error) + Transport http.RoundTripper + CheckRedirect func(req *http.Request, via []*http.Request) error + EnableCookie bool + Gzip bool + DumpBody bool + Retries int // if set to -1 means will retry forever +} + +// BeegoHTTPRequest provides more useful methods for requesting one url than http.Request. +type BeegoHTTPRequest struct { + url string + req *http.Request + params map[string][]string + files map[string]string + setting BeegoHTTPSettings + resp *http.Response + body []byte + dump []byte +} + +// GetRequest return the request object +func (b *BeegoHTTPRequest) GetRequest() *http.Request { + return b.req +} + +// Setting Change request settings +func (b *BeegoHTTPRequest) Setting(setting BeegoHTTPSettings) *BeegoHTTPRequest { + b.setting = setting + return b +} + +// SetBasicAuth sets the request's Authorization header to use HTTP Basic Authentication with the provided username and password. +func (b *BeegoHTTPRequest) SetBasicAuth(username, password string) *BeegoHTTPRequest { + b.req.SetBasicAuth(username, password) + return b +} + +// SetEnableCookie sets enable/disable cookiejar +func (b *BeegoHTTPRequest) SetEnableCookie(enable bool) *BeegoHTTPRequest { + b.setting.EnableCookie = enable + return b +} + +// SetUserAgent sets User-Agent header field +func (b *BeegoHTTPRequest) SetUserAgent(useragent string) *BeegoHTTPRequest { + b.setting.UserAgent = useragent + return b +} + +// Debug sets show debug or not when executing request. +func (b *BeegoHTTPRequest) Debug(isdebug bool) *BeegoHTTPRequest { + b.setting.ShowDebug = isdebug + return b +} + +// Retries sets Retries times. +// default is 0 means no retried. +// -1 means retried forever. +// others means retried times. +func (b *BeegoHTTPRequest) Retries(times int) *BeegoHTTPRequest { + b.setting.Retries = times + return b +} + +// DumpBody setting whether need to Dump the Body. +func (b *BeegoHTTPRequest) DumpBody(isdump bool) *BeegoHTTPRequest { + b.setting.DumpBody = isdump + return b +} + +// DumpRequest return the DumpRequest +func (b *BeegoHTTPRequest) DumpRequest() []byte { + return b.dump +} + +// SetTimeout sets connect time out and read-write time out for BeegoRequest. +func (b *BeegoHTTPRequest) SetTimeout(connectTimeout, readWriteTimeout time.Duration) *BeegoHTTPRequest { + b.setting.ConnectTimeout = connectTimeout + b.setting.ReadWriteTimeout = readWriteTimeout + return b +} + +// SetTLSClientConfig sets tls connection configurations if visiting https url. +func (b *BeegoHTTPRequest) SetTLSClientConfig(config *tls.Config) *BeegoHTTPRequest { + b.setting.TLSClientConfig = config + return b +} + +// Header add header item string in request. +func (b *BeegoHTTPRequest) Header(key, value string) *BeegoHTTPRequest { + b.req.Header.Set(key, value) + return b +} + +// SetHost set the request host +func (b *BeegoHTTPRequest) SetHost(host string) *BeegoHTTPRequest { + b.req.Host = host + return b +} + +// SetProtocolVersion Set the protocol version for incoming requests. +// Client requests always use HTTP/1.1. +func (b *BeegoHTTPRequest) SetProtocolVersion(vers string) *BeegoHTTPRequest { + if len(vers) == 0 { + vers = "HTTP/1.1" + } + + major, minor, ok := http.ParseHTTPVersion(vers) + if ok { + b.req.Proto = vers + b.req.ProtoMajor = major + b.req.ProtoMinor = minor + } + + return b +} + +// SetCookie add cookie into request. +func (b *BeegoHTTPRequest) SetCookie(cookie *http.Cookie) *BeegoHTTPRequest { + b.req.Header.Add("Cookie", cookie.String()) + return b +} + +// SetTransport set the setting transport +func (b *BeegoHTTPRequest) SetTransport(transport http.RoundTripper) *BeegoHTTPRequest { + b.setting.Transport = transport + return b +} + +// SetProxy set the http proxy +// example: +// +// func(req *http.Request) (*url.URL, error) { +// u, _ := url.ParseRequestURI("http://127.0.0.1:8118") +// return u, nil +// } +func (b *BeegoHTTPRequest) SetProxy(proxy func(*http.Request) (*url.URL, error)) *BeegoHTTPRequest { + b.setting.Proxy = proxy + return b +} + +// SetCheckRedirect specifies the policy for handling redirects. +// +// If CheckRedirect is nil, the Client uses its default policy, +// which is to stop after 10 consecutive requests. +func (b *BeegoHTTPRequest) SetCheckRedirect(redirect func(req *http.Request, via []*http.Request) error) *BeegoHTTPRequest { + b.setting.CheckRedirect = redirect + return b +} + +// Param adds query param in to request. +// params build query string as ?key1=value1&key2=value2... +func (b *BeegoHTTPRequest) Param(key, value string) *BeegoHTTPRequest { + if param, ok := b.params[key]; ok { + b.params[key] = append(param, value) + } else { + b.params[key] = []string{value} + } + return b +} + +// PostFile add a post file to the request +func (b *BeegoHTTPRequest) PostFile(formname, filename string) *BeegoHTTPRequest { + b.files[formname] = filename + return b +} + +// Body adds request raw body. +// it supports string and []byte. +func (b *BeegoHTTPRequest) Body(data interface{}) *BeegoHTTPRequest { + switch t := data.(type) { + case string: + bf := bytes.NewBufferString(t) + b.req.Body = ioutil.NopCloser(bf) + b.req.ContentLength = int64(len(t)) + case []byte: + bf := bytes.NewBuffer(t) + b.req.Body = ioutil.NopCloser(bf) + b.req.ContentLength = int64(len(t)) + } + return b +} + +// XMLBody adds request raw body encoding by XML. +func (b *BeegoHTTPRequest) XMLBody(obj interface{}) (*BeegoHTTPRequest, error) { + if b.req.Body == nil && obj != nil { + byts, err := xml.Marshal(obj) + if err != nil { + return b, err + } + b.req.Body = ioutil.NopCloser(bytes.NewReader(byts)) + b.req.ContentLength = int64(len(byts)) + b.req.Header.Set("Content-Type", "application/xml") + } + return b, nil +} + +// YAMLBody adds request raw body encoding by YAML. +func (b *BeegoHTTPRequest) YAMLBody(obj interface{}) (*BeegoHTTPRequest, error) { + if b.req.Body == nil && obj != nil { + byts, err := yaml.Marshal(obj) + if err != nil { + return b, err + } + b.req.Body = ioutil.NopCloser(bytes.NewReader(byts)) + b.req.ContentLength = int64(len(byts)) + b.req.Header.Set("Content-Type", "application/x+yaml") + } + return b, nil +} + +// JSONBody adds request raw body encoding by JSON. +func (b *BeegoHTTPRequest) JSONBody(obj interface{}) (*BeegoHTTPRequest, error) { + if b.req.Body == nil && obj != nil { + byts, err := json.Marshal(obj) + if err != nil { + return b, err + } + b.req.Body = ioutil.NopCloser(bytes.NewReader(byts)) + b.req.ContentLength = int64(len(byts)) + b.req.Header.Set("Content-Type", "application/json") + } + return b, nil +} + +func (b *BeegoHTTPRequest) buildURL(paramBody string) { + // build GET url with query string + if b.req.Method == "GET" && len(paramBody) > 0 { + if strings.Contains(b.url, "?") { + b.url += "&" + paramBody + } else { + b.url = b.url + "?" + paramBody + } + return + } + + // build POST/PUT/PATCH url and body + if (b.req.Method == "POST" || b.req.Method == "PUT" || b.req.Method == "PATCH" || b.req.Method == "DELETE") && b.req.Body == nil { + // with files + if len(b.files) > 0 { + pr, pw := io.Pipe() + bodyWriter := multipart.NewWriter(pw) + go func() { + for formname, filename := range b.files { + fileWriter, err := bodyWriter.CreateFormFile(formname, filename) + if err != nil { + log.Println("Httplib:", err) + } + fh, err := os.Open(filename) + if err != nil { + log.Println("Httplib:", err) + } + //iocopy + _, err = io.Copy(fileWriter, fh) + fh.Close() + if err != nil { + log.Println("Httplib:", err) + } + } + for k, v := range b.params { + for _, vv := range v { + bodyWriter.WriteField(k, vv) + } + } + bodyWriter.Close() + pw.Close() + }() + b.Header("Content-Type", bodyWriter.FormDataContentType()) + b.req.Body = ioutil.NopCloser(pr) + return + } + + // with params + if len(paramBody) > 0 { + b.Header("Content-Type", "application/x-www-form-urlencoded") + b.Body(paramBody) + } + } +} + +func (b *BeegoHTTPRequest) getResponse() (*http.Response, error) { + if b.resp.StatusCode != 0 { + return b.resp, nil + } + resp, err := b.DoRequest() + if err != nil { + return nil, err + } + b.resp = resp + return resp, nil +} + +// DoRequest will do the client.Do +func (b *BeegoHTTPRequest) DoRequest() (resp *http.Response, err error) { + var paramBody string + if len(b.params) > 0 { + var buf bytes.Buffer + for k, v := range b.params { + for _, vv := range v { + buf.WriteString(url.QueryEscape(k)) + buf.WriteByte('=') + buf.WriteString(url.QueryEscape(vv)) + buf.WriteByte('&') + } + } + paramBody = buf.String() + paramBody = paramBody[0 : len(paramBody)-1] + } + + b.buildURL(paramBody) + urlParsed, err := url.Parse(b.url) + if err != nil { + return nil, err + } + + b.req.URL = urlParsed + + trans := b.setting.Transport + + if trans == nil { + // create default transport + trans = &http.Transport{ + TLSClientConfig: b.setting.TLSClientConfig, + Proxy: b.setting.Proxy, + Dial: TimeoutDialer(b.setting.ConnectTimeout, b.setting.ReadWriteTimeout), + MaxIdleConnsPerHost: 100, + } + } else { + // if b.transport is *http.Transport then set the settings. + if t, ok := trans.(*http.Transport); ok { + if t.TLSClientConfig == nil { + t.TLSClientConfig = b.setting.TLSClientConfig + } + if t.Proxy == nil { + t.Proxy = b.setting.Proxy + } + if t.Dial == nil { + t.Dial = TimeoutDialer(b.setting.ConnectTimeout, b.setting.ReadWriteTimeout) + } + } + } + + var jar http.CookieJar + if b.setting.EnableCookie { + if defaultCookieJar == nil { + createDefaultCookie() + } + jar = defaultCookieJar + } + + client := &http.Client{ + Transport: trans, + Jar: jar, + } + + if b.setting.UserAgent != "" && b.req.Header.Get("User-Agent") == "" { + b.req.Header.Set("User-Agent", b.setting.UserAgent) + } + + if b.setting.CheckRedirect != nil { + client.CheckRedirect = b.setting.CheckRedirect + } + + if b.setting.ShowDebug { + dump, err := httputil.DumpRequest(b.req, b.setting.DumpBody) + if err != nil { + log.Println(err.Error()) + } + b.dump = dump + } + // retries default value is 0, it will run once. + // retries equal to -1, it will run forever until success + // retries is setted, it will retries fixed times. + for i := 0; b.setting.Retries == -1 || i <= b.setting.Retries; i++ { + resp, err = client.Do(b.req) + if err == nil { + break + } + } + return resp, err +} + +// String returns the body string in response. +// it calls Response inner. +func (b *BeegoHTTPRequest) String() (string, error) { + data, err := b.Bytes() + if err != nil { + return "", err + } + + return string(data), nil +} + +// Bytes returns the body []byte in response. +// it calls Response inner. +func (b *BeegoHTTPRequest) Bytes() ([]byte, error) { + if b.body != nil { + return b.body, nil + } + resp, err := b.getResponse() + if err != nil { + return nil, err + } + if resp.Body == nil { + return nil, nil + } + defer resp.Body.Close() + if b.setting.Gzip && resp.Header.Get("Content-Encoding") == "gzip" { + reader, err := gzip.NewReader(resp.Body) + if err != nil { + return nil, err + } + b.body, err = ioutil.ReadAll(reader) + return b.body, err + } + b.body, err = ioutil.ReadAll(resp.Body) + return b.body, err +} + +// ToFile saves the body data in response to one file. +// it calls Response inner. +func (b *BeegoHTTPRequest) ToFile(filename string) error { + f, err := os.Create(filename) + if err != nil { + return err + } + defer f.Close() + + resp, err := b.getResponse() + if err != nil { + return err + } + if resp.Body == nil { + return nil + } + defer resp.Body.Close() + _, err = io.Copy(f, resp.Body) + return err +} + +// ToJSON returns the map that marshals from the body bytes as json in response . +// it calls Response inner. +func (b *BeegoHTTPRequest) ToJSON(v interface{}) error { + data, err := b.Bytes() + if err != nil { + return err + } + return json.Unmarshal(data, v) +} + +// ToXML returns the map that marshals from the body bytes as xml in response . +// it calls Response inner. +func (b *BeegoHTTPRequest) ToXML(v interface{}) error { + data, err := b.Bytes() + if err != nil { + return err + } + return xml.Unmarshal(data, v) +} + +// ToYAML returns the map that marshals from the body bytes as yaml in response . +// it calls Response inner. +func (b *BeegoHTTPRequest) ToYAML(v interface{}) error { + data, err := b.Bytes() + if err != nil { + return err + } + return yaml.Unmarshal(data, v) +} + +// Response executes request client gets response mannually. +func (b *BeegoHTTPRequest) Response() (*http.Response, error) { + return b.getResponse() +} + +// TimeoutDialer returns functions of connection dialer with timeout settings for http.Transport Dial field. +func TimeoutDialer(cTimeout time.Duration, rwTimeout time.Duration) func(net, addr string) (c net.Conn, err error) { + return func(netw, addr string) (net.Conn, error) { + conn, err := net.DialTimeout(netw, addr, cTimeout) + if err != nil { + return nil, err + } + err = conn.SetDeadline(time.Now().Add(rwTimeout)) + return conn, err + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/README.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/README.md new file mode 100644 index 0000000000000000000000000000000000000000..c05bcc0444e3c8b4430bc16d390a89cde1db57cc --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/README.md @@ -0,0 +1,72 @@ +## logs +logs is a Go logs manager. It can use many logs adapters. The repo is inspired by `database/sql` . + + +## How to install? + + go get github.com/astaxie/beego/logs + + +## What adapters are supported? + +As of now this logs support console, file,smtp and conn. + + +## How to use it? + +First you must import it + +```golang +import ( + "github.com/astaxie/beego/logs" +) +``` + +Then init a Log (example with console adapter) + +```golang +log := logs.NewLogger(10000) +log.SetLogger("console", "") +``` + +> the first params stand for how many channel + +Use it like this: + +```golang +log.Trace("trace") +log.Info("info") +log.Warn("warning") +log.Debug("debug") +log.Critical("critical") +``` + +## File adapter + +Configure file adapter like this: + +```golang +log := NewLogger(10000) +log.SetLogger("file", `{"filename":"test.log"}`) +``` + +## Conn adapter + +Configure like this: + +```golang +log := NewLogger(1000) +log.SetLogger("conn", `{"net":"tcp","addr":":7020"}`) +log.Info("info") +``` + +## Smtp adapter + +Configure like this: + +```golang +log := NewLogger(10000) +log.SetLogger("smtp", `{"username":"beegotest@gmail.com","password":"xxxxxxxx","host":"smtp.gmail.com:587","sendTos":["xiemengjun@gmail.com"]}`) +log.Critical("sendmail critical") +time.Sleep(time.Second * 30) +``` diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/accesslog.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/accesslog.go new file mode 100644 index 0000000000000000000000000000000000000000..3ff9e20fc87f27b8c270e92353dc8ab44a4cdbbc --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/accesslog.go @@ -0,0 +1,83 @@ +// Copyright 2014 beego Author. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT 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 logs + +import ( + "bytes" + "strings" + "encoding/json" + "fmt" + "time" +) + +const ( + apacheFormatPattern = "%s - - [%s] \"%s %d %d\" %f %s %s" + apacheFormat = "APACHE_FORMAT" + jsonFormat = "JSON_FORMAT" +) + +// AccessLogRecord struct for holding access log data. +type AccessLogRecord struct { + RemoteAddr string `json:"remote_addr"` + RequestTime time.Time `json:"request_time"` + RequestMethod string `json:"request_method"` + Request string `json:"request"` + ServerProtocol string `json:"server_protocol"` + Host string `json:"host"` + Status int `json:"status"` + BodyBytesSent int64 `json:"body_bytes_sent"` + ElapsedTime time.Duration `json:"elapsed_time"` + HTTPReferrer string `json:"http_referrer"` + HTTPUserAgent string `json:"http_user_agent"` + RemoteUser string `json:"remote_user"` +} + +func (r *AccessLogRecord) json() ([]byte, error) { + buffer := &bytes.Buffer{} + encoder := json.NewEncoder(buffer) + disableEscapeHTML(encoder) + + err := encoder.Encode(r) + return buffer.Bytes(), err +} + +func disableEscapeHTML(i interface{}) { + if e, ok := i.(interface { + SetEscapeHTML(bool) + }); ok { + e.SetEscapeHTML(false) + } +} + +// AccessLog - Format and print access log. +func AccessLog(r *AccessLogRecord, format string) { + var msg string + switch format { + case apacheFormat: + timeFormatted := r.RequestTime.Format("02/Jan/2006 03:04:05") + msg = fmt.Sprintf(apacheFormatPattern, r.RemoteAddr, timeFormatted, r.Request, r.Status, r.BodyBytesSent, + r.ElapsedTime.Seconds(), r.HTTPReferrer, r.HTTPUserAgent) + case jsonFormat: + fallthrough + default: + jsonData, err := r.json() + if err != nil { + msg = fmt.Sprintf(`{"Error": "%s"}`, err) + } else { + msg = string(jsonData) + } + } + beeLogger.writeMsg(levelLoggerImpl, strings.TrimSpace(msg)) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/color.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/color.go new file mode 100644 index 0000000000000000000000000000000000000000..41d23638a38bec139a823a349987ccd79cb21d91 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/color.go @@ -0,0 +1,28 @@ +// Copyright 2014 beego Author. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !windows + +package logs + +import "io" + +type ansiColorWriter struct { + w io.Writer + mode outputMode +} + +func (cw *ansiColorWriter) Write(p []byte) (int, error) { + return cw.w.Write(p) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/color_windows.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/color_windows.go new file mode 100644 index 0000000000000000000000000000000000000000..4e28f18884ba79dc87c386e04e23f791c2b959f5 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/color_windows.go @@ -0,0 +1,428 @@ +// Copyright 2014 beego Author. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build windows + +package logs + +import ( + "bytes" + "io" + "strings" + "syscall" + "unsafe" +) + +type ( + csiState int + parseResult int +) + +const ( + outsideCsiCode csiState = iota + firstCsiCode + secondCsiCode +) + +const ( + noConsole parseResult = iota + changedColor + unknown +) + +type ansiColorWriter struct { + w io.Writer + mode outputMode + state csiState + paramStartBuf bytes.Buffer + paramBuf bytes.Buffer +} + +const ( + firstCsiChar byte = '\x1b' + secondeCsiChar byte = '[' + separatorChar byte = ';' + sgrCode byte = 'm' +) + +const ( + foregroundBlue = uint16(0x0001) + foregroundGreen = uint16(0x0002) + foregroundRed = uint16(0x0004) + foregroundIntensity = uint16(0x0008) + backgroundBlue = uint16(0x0010) + backgroundGreen = uint16(0x0020) + backgroundRed = uint16(0x0040) + backgroundIntensity = uint16(0x0080) + underscore = uint16(0x8000) + + foregroundMask = foregroundBlue | foregroundGreen | foregroundRed | foregroundIntensity + backgroundMask = backgroundBlue | backgroundGreen | backgroundRed | backgroundIntensity +) + +const ( + ansiReset = "0" + ansiIntensityOn = "1" + ansiIntensityOff = "21" + ansiUnderlineOn = "4" + ansiUnderlineOff = "24" + ansiBlinkOn = "5" + ansiBlinkOff = "25" + + ansiForegroundBlack = "30" + ansiForegroundRed = "31" + ansiForegroundGreen = "32" + ansiForegroundYellow = "33" + ansiForegroundBlue = "34" + ansiForegroundMagenta = "35" + ansiForegroundCyan = "36" + ansiForegroundWhite = "37" + ansiForegroundDefault = "39" + + ansiBackgroundBlack = "40" + ansiBackgroundRed = "41" + ansiBackgroundGreen = "42" + ansiBackgroundYellow = "43" + ansiBackgroundBlue = "44" + ansiBackgroundMagenta = "45" + ansiBackgroundCyan = "46" + ansiBackgroundWhite = "47" + ansiBackgroundDefault = "49" + + ansiLightForegroundGray = "90" + ansiLightForegroundRed = "91" + ansiLightForegroundGreen = "92" + ansiLightForegroundYellow = "93" + ansiLightForegroundBlue = "94" + ansiLightForegroundMagenta = "95" + ansiLightForegroundCyan = "96" + ansiLightForegroundWhite = "97" + + ansiLightBackgroundGray = "100" + ansiLightBackgroundRed = "101" + ansiLightBackgroundGreen = "102" + ansiLightBackgroundYellow = "103" + ansiLightBackgroundBlue = "104" + ansiLightBackgroundMagenta = "105" + ansiLightBackgroundCyan = "106" + ansiLightBackgroundWhite = "107" +) + +type drawType int + +const ( + foreground drawType = iota + background +) + +type winColor struct { + code uint16 + drawType drawType +} + +var colorMap = map[string]winColor{ + ansiForegroundBlack: {0, foreground}, + ansiForegroundRed: {foregroundRed, foreground}, + ansiForegroundGreen: {foregroundGreen, foreground}, + ansiForegroundYellow: {foregroundRed | foregroundGreen, foreground}, + ansiForegroundBlue: {foregroundBlue, foreground}, + ansiForegroundMagenta: {foregroundRed | foregroundBlue, foreground}, + ansiForegroundCyan: {foregroundGreen | foregroundBlue, foreground}, + ansiForegroundWhite: {foregroundRed | foregroundGreen | foregroundBlue, foreground}, + ansiForegroundDefault: {foregroundRed | foregroundGreen | foregroundBlue, foreground}, + + ansiBackgroundBlack: {0, background}, + ansiBackgroundRed: {backgroundRed, background}, + ansiBackgroundGreen: {backgroundGreen, background}, + ansiBackgroundYellow: {backgroundRed | backgroundGreen, background}, + ansiBackgroundBlue: {backgroundBlue, background}, + ansiBackgroundMagenta: {backgroundRed | backgroundBlue, background}, + ansiBackgroundCyan: {backgroundGreen | backgroundBlue, background}, + ansiBackgroundWhite: {backgroundRed | backgroundGreen | backgroundBlue, background}, + ansiBackgroundDefault: {0, background}, + + ansiLightForegroundGray: {foregroundIntensity, foreground}, + ansiLightForegroundRed: {foregroundIntensity | foregroundRed, foreground}, + ansiLightForegroundGreen: {foregroundIntensity | foregroundGreen, foreground}, + ansiLightForegroundYellow: {foregroundIntensity | foregroundRed | foregroundGreen, foreground}, + ansiLightForegroundBlue: {foregroundIntensity | foregroundBlue, foreground}, + ansiLightForegroundMagenta: {foregroundIntensity | foregroundRed | foregroundBlue, foreground}, + ansiLightForegroundCyan: {foregroundIntensity | foregroundGreen | foregroundBlue, foreground}, + ansiLightForegroundWhite: {foregroundIntensity | foregroundRed | foregroundGreen | foregroundBlue, foreground}, + + ansiLightBackgroundGray: {backgroundIntensity, background}, + ansiLightBackgroundRed: {backgroundIntensity | backgroundRed, background}, + ansiLightBackgroundGreen: {backgroundIntensity | backgroundGreen, background}, + ansiLightBackgroundYellow: {backgroundIntensity | backgroundRed | backgroundGreen, background}, + ansiLightBackgroundBlue: {backgroundIntensity | backgroundBlue, background}, + ansiLightBackgroundMagenta: {backgroundIntensity | backgroundRed | backgroundBlue, background}, + ansiLightBackgroundCyan: {backgroundIntensity | backgroundGreen | backgroundBlue, background}, + ansiLightBackgroundWhite: {backgroundIntensity | backgroundRed | backgroundGreen | backgroundBlue, background}, +} + +var ( + kernel32 = syscall.NewLazyDLL("kernel32.dll") + procSetConsoleTextAttribute = kernel32.NewProc("SetConsoleTextAttribute") + procGetConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo") + defaultAttr *textAttributes +) + +func init() { + screenInfo := getConsoleScreenBufferInfo(uintptr(syscall.Stdout)) + if screenInfo != nil { + colorMap[ansiForegroundDefault] = winColor{ + screenInfo.WAttributes & (foregroundRed | foregroundGreen | foregroundBlue), + foreground, + } + colorMap[ansiBackgroundDefault] = winColor{ + screenInfo.WAttributes & (backgroundRed | backgroundGreen | backgroundBlue), + background, + } + defaultAttr = convertTextAttr(screenInfo.WAttributes) + } +} + +type coord struct { + X, Y int16 +} + +type smallRect struct { + Left, Top, Right, Bottom int16 +} + +type consoleScreenBufferInfo struct { + DwSize coord + DwCursorPosition coord + WAttributes uint16 + SrWindow smallRect + DwMaximumWindowSize coord +} + +func getConsoleScreenBufferInfo(hConsoleOutput uintptr) *consoleScreenBufferInfo { + var csbi consoleScreenBufferInfo + ret, _, _ := procGetConsoleScreenBufferInfo.Call( + hConsoleOutput, + uintptr(unsafe.Pointer(&csbi))) + if ret == 0 { + return nil + } + return &csbi +} + +func setConsoleTextAttribute(hConsoleOutput uintptr, wAttributes uint16) bool { + ret, _, _ := procSetConsoleTextAttribute.Call( + hConsoleOutput, + uintptr(wAttributes)) + return ret != 0 +} + +type textAttributes struct { + foregroundColor uint16 + backgroundColor uint16 + foregroundIntensity uint16 + backgroundIntensity uint16 + underscore uint16 + otherAttributes uint16 +} + +func convertTextAttr(winAttr uint16) *textAttributes { + fgColor := winAttr & (foregroundRed | foregroundGreen | foregroundBlue) + bgColor := winAttr & (backgroundRed | backgroundGreen | backgroundBlue) + fgIntensity := winAttr & foregroundIntensity + bgIntensity := winAttr & backgroundIntensity + underline := winAttr & underscore + otherAttributes := winAttr &^ (foregroundMask | backgroundMask | underscore) + return &textAttributes{fgColor, bgColor, fgIntensity, bgIntensity, underline, otherAttributes} +} + +func convertWinAttr(textAttr *textAttributes) uint16 { + var winAttr uint16 + winAttr |= textAttr.foregroundColor + winAttr |= textAttr.backgroundColor + winAttr |= textAttr.foregroundIntensity + winAttr |= textAttr.backgroundIntensity + winAttr |= textAttr.underscore + winAttr |= textAttr.otherAttributes + return winAttr +} + +func changeColor(param []byte) parseResult { + screenInfo := getConsoleScreenBufferInfo(uintptr(syscall.Stdout)) + if screenInfo == nil { + return noConsole + } + + winAttr := convertTextAttr(screenInfo.WAttributes) + strParam := string(param) + if len(strParam) <= 0 { + strParam = "0" + } + csiParam := strings.Split(strParam, string(separatorChar)) + for _, p := range csiParam { + c, ok := colorMap[p] + switch { + case !ok: + switch p { + case ansiReset: + winAttr.foregroundColor = defaultAttr.foregroundColor + winAttr.backgroundColor = defaultAttr.backgroundColor + winAttr.foregroundIntensity = defaultAttr.foregroundIntensity + winAttr.backgroundIntensity = defaultAttr.backgroundIntensity + winAttr.underscore = 0 + winAttr.otherAttributes = 0 + case ansiIntensityOn: + winAttr.foregroundIntensity = foregroundIntensity + case ansiIntensityOff: + winAttr.foregroundIntensity = 0 + case ansiUnderlineOn: + winAttr.underscore = underscore + case ansiUnderlineOff: + winAttr.underscore = 0 + case ansiBlinkOn: + winAttr.backgroundIntensity = backgroundIntensity + case ansiBlinkOff: + winAttr.backgroundIntensity = 0 + default: + // unknown code + } + case c.drawType == foreground: + winAttr.foregroundColor = c.code + case c.drawType == background: + winAttr.backgroundColor = c.code + } + } + winTextAttribute := convertWinAttr(winAttr) + setConsoleTextAttribute(uintptr(syscall.Stdout), winTextAttribute) + + return changedColor +} + +func parseEscapeSequence(command byte, param []byte) parseResult { + if defaultAttr == nil { + return noConsole + } + + switch command { + case sgrCode: + return changeColor(param) + default: + return unknown + } +} + +func (cw *ansiColorWriter) flushBuffer() (int, error) { + return cw.flushTo(cw.w) +} + +func (cw *ansiColorWriter) resetBuffer() (int, error) { + return cw.flushTo(nil) +} + +func (cw *ansiColorWriter) flushTo(w io.Writer) (int, error) { + var n1, n2 int + var err error + + startBytes := cw.paramStartBuf.Bytes() + cw.paramStartBuf.Reset() + if w != nil { + n1, err = cw.w.Write(startBytes) + if err != nil { + return n1, err + } + } else { + n1 = len(startBytes) + } + paramBytes := cw.paramBuf.Bytes() + cw.paramBuf.Reset() + if w != nil { + n2, err = cw.w.Write(paramBytes) + if err != nil { + return n1 + n2, err + } + } else { + n2 = len(paramBytes) + } + return n1 + n2, nil +} + +func isParameterChar(b byte) bool { + return ('0' <= b && b <= '9') || b == separatorChar +} + +func (cw *ansiColorWriter) Write(p []byte) (int, error) { + var r, nw, first, last int + if cw.mode != DiscardNonColorEscSeq { + cw.state = outsideCsiCode + cw.resetBuffer() + } + + var err error + for i, ch := range p { + switch cw.state { + case outsideCsiCode: + if ch == firstCsiChar { + cw.paramStartBuf.WriteByte(ch) + cw.state = firstCsiCode + } + case firstCsiCode: + switch ch { + case firstCsiChar: + cw.paramStartBuf.WriteByte(ch) + break + case secondeCsiChar: + cw.paramStartBuf.WriteByte(ch) + cw.state = secondCsiCode + last = i - 1 + default: + cw.resetBuffer() + cw.state = outsideCsiCode + } + case secondCsiCode: + if isParameterChar(ch) { + cw.paramBuf.WriteByte(ch) + } else { + nw, err = cw.w.Write(p[first:last]) + r += nw + if err != nil { + return r, err + } + first = i + 1 + result := parseEscapeSequence(ch, cw.paramBuf.Bytes()) + if result == noConsole || (cw.mode == OutputNonColorEscSeq && result == unknown) { + cw.paramBuf.WriteByte(ch) + nw, err := cw.flushBuffer() + if err != nil { + return r, err + } + r += nw + } else { + n, _ := cw.resetBuffer() + // Add one more to the size of the buffer for the last ch + r += n + 1 + } + + cw.state = outsideCsiCode + } + default: + cw.state = outsideCsiCode + } + } + + if cw.mode != DiscardNonColorEscSeq || cw.state == outsideCsiCode { + nw, err = cw.w.Write(p[first:]) + r += nw + } + + return r, err +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/conn.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/conn.go new file mode 100644 index 0000000000000000000000000000000000000000..6d5bf6bfcfde1595b924cfe26eb3ebd2394019bf --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/conn.go @@ -0,0 +1,117 @@ +// Copyright 2014 beego Author. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT 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 logs + +import ( + "encoding/json" + "io" + "net" + "time" +) + +// connWriter implements LoggerInterface. +// it writes messages in keep-live tcp connection. +type connWriter struct { + lg *logWriter + innerWriter io.WriteCloser + ReconnectOnMsg bool `json:"reconnectOnMsg"` + Reconnect bool `json:"reconnect"` + Net string `json:"net"` + Addr string `json:"addr"` + Level int `json:"level"` +} + +// NewConn create new ConnWrite returning as LoggerInterface. +func NewConn() Logger { + conn := new(connWriter) + conn.Level = LevelTrace + return conn +} + +// Init init connection writer with json config. +// json config only need key "level". +func (c *connWriter) Init(jsonConfig string) error { + return json.Unmarshal([]byte(jsonConfig), c) +} + +// WriteMsg write message in connection. +// if connection is down, try to re-connect. +func (c *connWriter) WriteMsg(when time.Time, msg string, level int) error { + if level > c.Level { + return nil + } + if c.needToConnectOnMsg() { + err := c.connect() + if err != nil { + return err + } + } + + if c.ReconnectOnMsg { + defer c.innerWriter.Close() + } + + c.lg.println(when, msg) + return nil +} + +// Flush implementing method. empty. +func (c *connWriter) Flush() { + +} + +// Destroy destroy connection writer and close tcp listener. +func (c *connWriter) Destroy() { + if c.innerWriter != nil { + c.innerWriter.Close() + } +} + +func (c *connWriter) connect() error { + if c.innerWriter != nil { + c.innerWriter.Close() + c.innerWriter = nil + } + + conn, err := net.Dial(c.Net, c.Addr) + if err != nil { + return err + } + + if tcpConn, ok := conn.(*net.TCPConn); ok { + tcpConn.SetKeepAlive(true) + } + + c.innerWriter = conn + c.lg = newLogWriter(conn) + return nil +} + +func (c *connWriter) needToConnectOnMsg() bool { + if c.Reconnect { + c.Reconnect = false + return true + } + + if c.innerWriter == nil { + return true + } + + return c.ReconnectOnMsg +} + +func init() { + Register(AdapterConn, NewConn) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/console.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/console.go new file mode 100644 index 0000000000000000000000000000000000000000..e75f2a1b17792a4b67caad283b6f480ea15715e5 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/console.go @@ -0,0 +1,101 @@ +// Copyright 2014 beego Author. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT 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 logs + +import ( + "encoding/json" + "os" + "runtime" + "time" +) + +// brush is a color join function +type brush func(string) string + +// newBrush return a fix color Brush +func newBrush(color string) brush { + pre := "\033[" + reset := "\033[0m" + return func(text string) string { + return pre + color + "m" + text + reset + } +} + +var colors = []brush{ + newBrush("1;37"), // Emergency white + newBrush("1;36"), // Alert cyan + newBrush("1;35"), // Critical magenta + newBrush("1;31"), // Error red + newBrush("1;33"), // Warning yellow + newBrush("1;32"), // Notice green + newBrush("1;34"), // Informational blue + newBrush("1;44"), // Debug Background blue +} + +// consoleWriter implements LoggerInterface and writes messages to terminal. +type consoleWriter struct { + lg *logWriter + Level int `json:"level"` + Colorful bool `json:"color"` //this filed is useful only when system's terminal supports color +} + +// NewConsole create ConsoleWriter returning as LoggerInterface. +func NewConsole() Logger { + cw := &consoleWriter{ + lg: newLogWriter(os.Stdout), + Level: LevelDebug, + Colorful: runtime.GOOS != "windows", + } + return cw +} + +// Init init console logger. +// jsonConfig like '{"level":LevelTrace}'. +func (c *consoleWriter) Init(jsonConfig string) error { + if len(jsonConfig) == 0 { + return nil + } + err := json.Unmarshal([]byte(jsonConfig), c) + if runtime.GOOS == "windows" { + c.Colorful = false + } + return err +} + +// WriteMsg write message in console. +func (c *consoleWriter) WriteMsg(when time.Time, msg string, level int) error { + if level > c.Level { + return nil + } + if c.Colorful { + msg = colors[level](msg) + } + c.lg.println(when, msg) + return nil +} + +// Destroy implementing method. empty. +func (c *consoleWriter) Destroy() { + +} + +// Flush implementing method. empty. +func (c *consoleWriter) Flush() { + +} + +func init() { + Register(AdapterConsole, NewConsole) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/file.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/file.go new file mode 100644 index 0000000000000000000000000000000000000000..588f786035642d807ec164b0a3ed4b69ff6b3043 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/file.go @@ -0,0 +1,405 @@ +// Copyright 2014 beego Author. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT 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 logs + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io" + "os" + "path" + "path/filepath" + "strconv" + "strings" + "sync" + "time" +) + +// fileLogWriter implements LoggerInterface. +// It writes messages by lines limit, file size limit, or time frequency. +type fileLogWriter struct { + sync.RWMutex // write log order by order and atomic incr maxLinesCurLines and maxSizeCurSize + // The opened file + Filename string `json:"filename"` + fileWriter *os.File + + // Rotate at line + MaxLines int `json:"maxlines"` + maxLinesCurLines int + + MaxFiles int `json:"maxfiles"` + MaxFilesCurFiles int + + // Rotate at size + MaxSize int `json:"maxsize"` + maxSizeCurSize int + + // Rotate daily + Daily bool `json:"daily"` + MaxDays int64 `json:"maxdays"` + dailyOpenDate int + dailyOpenTime time.Time + + // Rotate hourly + Hourly bool `json:"hourly"` + MaxHours int64 `json:"maxhours"` + hourlyOpenDate int + hourlyOpenTime time.Time + + Rotate bool `json:"rotate"` + + Level int `json:"level"` + + Perm string `json:"perm"` + + RotatePerm string `json:"rotateperm"` + + fileNameOnly, suffix string // like "project.log", project is fileNameOnly and .log is suffix +} + +// newFileWriter create a FileLogWriter returning as LoggerInterface. +func newFileWriter() Logger { + w := &fileLogWriter{ + Daily: true, + MaxDays: 7, + Hourly: false, + MaxHours: 168, + Rotate: true, + RotatePerm: "0440", + Level: LevelTrace, + Perm: "0660", + MaxLines: 10000000, + MaxFiles: 999, + MaxSize: 1 << 28, + } + return w +} + +// Init file logger with json config. +// jsonConfig like: +// { +// "filename":"logs/beego.log", +// "maxLines":10000, +// "maxsize":1024, +// "daily":true, +// "maxDays":15, +// "rotate":true, +// "perm":"0600" +// } +func (w *fileLogWriter) Init(jsonConfig string) error { + err := json.Unmarshal([]byte(jsonConfig), w) + if err != nil { + return err + } + if len(w.Filename) == 0 { + return errors.New("jsonconfig must have filename") + } + w.suffix = filepath.Ext(w.Filename) + w.fileNameOnly = strings.TrimSuffix(w.Filename, w.suffix) + if w.suffix == "" { + w.suffix = ".log" + } + err = w.startLogger() + return err +} + +// start file logger. create log file and set to locker-inside file writer. +func (w *fileLogWriter) startLogger() error { + file, err := w.createLogFile() + if err != nil { + return err + } + if w.fileWriter != nil { + w.fileWriter.Close() + } + w.fileWriter = file + return w.initFd() +} + +func (w *fileLogWriter) needRotateDaily(size int, day int) bool { + return (w.MaxLines > 0 && w.maxLinesCurLines >= w.MaxLines) || + (w.MaxSize > 0 && w.maxSizeCurSize >= w.MaxSize) || + (w.Daily && day != w.dailyOpenDate) +} + +func (w *fileLogWriter) needRotateHourly(size int, hour int) bool { + return (w.MaxLines > 0 && w.maxLinesCurLines >= w.MaxLines) || + (w.MaxSize > 0 && w.maxSizeCurSize >= w.MaxSize) || + (w.Hourly && hour != w.hourlyOpenDate) + +} + +// WriteMsg write logger message into file. +func (w *fileLogWriter) WriteMsg(when time.Time, msg string, level int) error { + if level > w.Level { + return nil + } + hd, d, h := formatTimeHeader(when) + msg = string(hd) + msg + "\n" + if w.Rotate { + w.RLock() + if w.needRotateHourly(len(msg), h) { + w.RUnlock() + w.Lock() + if w.needRotateHourly(len(msg), h) { + if err := w.doRotate(when); err != nil { + fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.Filename, err) + } + } + w.Unlock() + } else if w.needRotateDaily(len(msg), d) { + w.RUnlock() + w.Lock() + if w.needRotateDaily(len(msg), d) { + if err := w.doRotate(when); err != nil { + fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.Filename, err) + } + } + w.Unlock() + } else { + w.RUnlock() + } + } + + w.Lock() + _, err := w.fileWriter.Write([]byte(msg)) + if err == nil { + w.maxLinesCurLines++ + w.maxSizeCurSize += len(msg) + } + w.Unlock() + return err +} + +func (w *fileLogWriter) createLogFile() (*os.File, error) { + // Open the log file + perm, err := strconv.ParseInt(w.Perm, 8, 64) + if err != nil { + return nil, err + } + + filepath := path.Dir(w.Filename) + os.MkdirAll(filepath, os.FileMode(perm)) + + fd, err := os.OpenFile(w.Filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, os.FileMode(perm)) + if err == nil { + // Make sure file perm is user set perm cause of `os.OpenFile` will obey umask + os.Chmod(w.Filename, os.FileMode(perm)) + } + return fd, err +} + +func (w *fileLogWriter) initFd() error { + fd := w.fileWriter + fInfo, err := fd.Stat() + if err != nil { + return fmt.Errorf("get stat err: %s", err) + } + w.maxSizeCurSize = int(fInfo.Size()) + w.dailyOpenTime = time.Now() + w.dailyOpenDate = w.dailyOpenTime.Day() + w.hourlyOpenTime = time.Now() + w.hourlyOpenDate = w.hourlyOpenTime.Hour() + w.maxLinesCurLines = 0 + if w.Hourly { + go w.hourlyRotate(w.hourlyOpenTime) + } else if w.Daily { + go w.dailyRotate(w.dailyOpenTime) + } + if fInfo.Size() > 0 && w.MaxLines > 0 { + count, err := w.lines() + if err != nil { + return err + } + w.maxLinesCurLines = count + } + return nil +} + +func (w *fileLogWriter) dailyRotate(openTime time.Time) { + y, m, d := openTime.Add(24 * time.Hour).Date() + nextDay := time.Date(y, m, d, 0, 0, 0, 0, openTime.Location()) + tm := time.NewTimer(time.Duration(nextDay.UnixNano() - openTime.UnixNano() + 100)) + <-tm.C + w.Lock() + if w.needRotateDaily(0, time.Now().Day()) { + if err := w.doRotate(time.Now()); err != nil { + fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.Filename, err) + } + } + w.Unlock() +} + +func (w *fileLogWriter) hourlyRotate(openTime time.Time) { + y, m, d := openTime.Add(1 * time.Hour).Date() + h, _, _ := openTime.Add(1 * time.Hour).Clock() + nextHour := time.Date(y, m, d, h, 0, 0, 0, openTime.Location()) + tm := time.NewTimer(time.Duration(nextHour.UnixNano() - openTime.UnixNano() + 100)) + <-tm.C + w.Lock() + if w.needRotateHourly(0, time.Now().Hour()) { + if err := w.doRotate(time.Now()); err != nil { + fmt.Fprintf(os.Stderr, "FileLogWriter(%q): %s\n", w.Filename, err) + } + } + w.Unlock() +} + +func (w *fileLogWriter) lines() (int, error) { + fd, err := os.Open(w.Filename) + if err != nil { + return 0, err + } + defer fd.Close() + + buf := make([]byte, 32768) // 32k + count := 0 + lineSep := []byte{'\n'} + + for { + c, err := fd.Read(buf) + if err != nil && err != io.EOF { + return count, err + } + + count += bytes.Count(buf[:c], lineSep) + + if err == io.EOF { + break + } + } + + return count, nil +} + +// DoRotate means it need to write file in new file. +// new file name like xx.2013-01-01.log (daily) or xx.001.log (by line or size) +func (w *fileLogWriter) doRotate(logTime time.Time) error { + // file exists + // Find the next available number + num := w.MaxFilesCurFiles + 1 + fName := "" + format := "" + var openTime time.Time + rotatePerm, err := strconv.ParseInt(w.RotatePerm, 8, 64) + if err != nil { + return err + } + + _, err = os.Lstat(w.Filename) + if err != nil { + //even if the file is not exist or other ,we should RESTART the logger + goto RESTART_LOGGER + } + + if w.Hourly { + format = "2006010215" + openTime = w.hourlyOpenTime + } else if w.Daily { + format = "2006-01-02" + openTime = w.dailyOpenTime + } + + // only when one of them be setted, then the file would be splited + if w.MaxLines > 0 || w.MaxSize > 0 { + for ; err == nil && num <= w.MaxFiles; num++ { + fName = w.fileNameOnly + fmt.Sprintf(".%s.%03d%s", logTime.Format(format), num, w.suffix) + _, err = os.Lstat(fName) + } + } else { + fName = w.fileNameOnly + fmt.Sprintf(".%s.%03d%s", openTime.Format(format), num, w.suffix) + _, err = os.Lstat(fName) + w.MaxFilesCurFiles = num + } + + // return error if the last file checked still existed + if err == nil { + return fmt.Errorf("Rotate: Cannot find free log number to rename %s", w.Filename) + } + + // close fileWriter before rename + w.fileWriter.Close() + + // Rename the file to its new found name + // even if occurs error,we MUST guarantee to restart new logger + err = os.Rename(w.Filename, fName) + if err != nil { + goto RESTART_LOGGER + } + + err = os.Chmod(fName, os.FileMode(rotatePerm)) + +RESTART_LOGGER: + + startLoggerErr := w.startLogger() + go w.deleteOldLog() + + if startLoggerErr != nil { + return fmt.Errorf("Rotate StartLogger: %s", startLoggerErr) + } + if err != nil { + return fmt.Errorf("Rotate: %s", err) + } + return nil +} + +func (w *fileLogWriter) deleteOldLog() { + dir := filepath.Dir(w.Filename) + filepath.Walk(dir, func(path string, info os.FileInfo, err error) (returnErr error) { + defer func() { + if r := recover(); r != nil { + fmt.Fprintf(os.Stderr, "Unable to delete old log '%s', error: %v\n", path, r) + } + }() + + if info == nil { + return + } + if w.Hourly { + if !info.IsDir() && info.ModTime().Add(1 * time.Hour * time.Duration(w.MaxHours)).Before(time.Now()) { + if strings.HasPrefix(filepath.Base(path), filepath.Base(w.fileNameOnly)) && + strings.HasSuffix(filepath.Base(path), w.suffix) { + os.Remove(path) + } + } + } else if w.Daily { + if !info.IsDir() && info.ModTime().Add(24 * time.Hour * time.Duration(w.MaxDays)).Before(time.Now()) { + if strings.HasPrefix(filepath.Base(path), filepath.Base(w.fileNameOnly)) && + strings.HasSuffix(filepath.Base(path), w.suffix) { + os.Remove(path) + } + } + } + return + }) +} + +// Destroy close the file description, close file writer. +func (w *fileLogWriter) Destroy() { + w.fileWriter.Close() +} + +// Flush flush file logger. +// there are no buffering messages in file logger in memory. +// flush file means sync file from disk. +func (w *fileLogWriter) Flush() { + w.fileWriter.Sync() +} + +func init() { + Register(AdapterFile, newFileWriter) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/jianliao.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/jianliao.go new file mode 100644 index 0000000000000000000000000000000000000000..88ba0f9af4f0d7719507a1fd28c1e401f9ab0fe4 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/jianliao.go @@ -0,0 +1,72 @@ +package logs + +import ( + "encoding/json" + "fmt" + "net/http" + "net/url" + "time" +) + +// JLWriter implements beego LoggerInterface and is used to send jiaoliao webhook +type JLWriter struct { + AuthorName string `json:"authorname"` + Title string `json:"title"` + WebhookURL string `json:"webhookurl"` + RedirectURL string `json:"redirecturl,omitempty"` + ImageURL string `json:"imageurl,omitempty"` + Level int `json:"level"` +} + +// newJLWriter create jiaoliao writer. +func newJLWriter() Logger { + return &JLWriter{Level: LevelTrace} +} + +// Init JLWriter with json config string +func (s *JLWriter) Init(jsonconfig string) error { + return json.Unmarshal([]byte(jsonconfig), s) +} + +// WriteMsg write message in smtp writer. +// it will send an email with subject and only this message. +func (s *JLWriter) WriteMsg(when time.Time, msg string, level int) error { + if level > s.Level { + return nil + } + + text := fmt.Sprintf("%s %s", when.Format("2006-01-02 15:04:05"), msg) + + form := url.Values{} + form.Add("authorName", s.AuthorName) + form.Add("title", s.Title) + form.Add("text", text) + if s.RedirectURL != "" { + form.Add("redirectUrl", s.RedirectURL) + } + if s.ImageURL != "" { + form.Add("imageUrl", s.ImageURL) + } + + resp, err := http.PostForm(s.WebhookURL, form) + if err != nil { + return err + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("Post webhook failed %s %d", resp.Status, resp.StatusCode) + } + return nil +} + +// Flush implementing method. empty. +func (s *JLWriter) Flush() { +} + +// Destroy implementing method. empty. +func (s *JLWriter) Destroy() { +} + +func init() { + Register(AdapterJianLiao, newJLWriter) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/log.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/log.go new file mode 100644 index 0000000000000000000000000000000000000000..a36141657dbf7f4190a8574a7241113a71295c4d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/log.go @@ -0,0 +1,665 @@ +// Copyright 2014 beego Author. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT 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 logs provide a general log interface +// Usage: +// +// import "github.com/astaxie/beego/logs" +// +// log := NewLogger(10000) +// log.SetLogger("console", "") +// +// > the first params stand for how many channel +// +// Use it like this: +// +// log.Trace("trace") +// log.Info("info") +// log.Warn("warning") +// log.Debug("debug") +// log.Critical("critical") +// +// more docs http://beego.me/docs/module/logs.md +package logs + +import ( + "fmt" + "log" + "os" + "path" + "runtime" + "strconv" + "strings" + "sync" + "time" +) + +// RFC5424 log message levels. +const ( + LevelEmergency = iota + LevelAlert + LevelCritical + LevelError + LevelWarning + LevelNotice + LevelInformational + LevelDebug +) + +// levelLogLogger is defined to implement log.Logger +// the real log level will be LevelEmergency +const levelLoggerImpl = -1 + +// Name for adapter with beego official support +const ( + AdapterConsole = "console" + AdapterFile = "file" + AdapterMultiFile = "multifile" + AdapterMail = "smtp" + AdapterConn = "conn" + AdapterEs = "es" + AdapterJianLiao = "jianliao" + AdapterSlack = "slack" + AdapterAliLS = "alils" +) + +// Legacy log level constants to ensure backwards compatibility. +const ( + LevelInfo = LevelInformational + LevelTrace = LevelDebug + LevelWarn = LevelWarning +) + +type newLoggerFunc func() Logger + +// Logger defines the behavior of a log provider. +type Logger interface { + Init(config string) error + WriteMsg(when time.Time, msg string, level int) error + Destroy() + Flush() +} + +var adapters = make(map[string]newLoggerFunc) +var levelPrefix = [LevelDebug + 1]string{"[M] ", "[A] ", "[C] ", "[E] ", "[W] ", "[N] ", "[I] ", "[D] "} + +// Register makes a log provide available by the provided name. +// If Register is called twice with the same name or if driver is nil, +// it panics. +func Register(name string, log newLoggerFunc) { + if log == nil { + panic("logs: Register provide is nil") + } + if _, dup := adapters[name]; dup { + panic("logs: Register called twice for provider " + name) + } + adapters[name] = log +} + +// BeeLogger is default logger in beego application. +// it can contain several providers and log message into all providers. +type BeeLogger struct { + lock sync.Mutex + level int + init bool + enableFuncCallDepth bool + loggerFuncCallDepth int + asynchronous bool + prefix string + msgChanLen int64 + msgChan chan *logMsg + signalChan chan string + wg sync.WaitGroup + outputs []*nameLogger +} + +const defaultAsyncMsgLen = 1e3 + +type nameLogger struct { + Logger + name string +} + +type logMsg struct { + level int + msg string + when time.Time +} + +var logMsgPool *sync.Pool + +// NewLogger returns a new BeeLogger. +// channelLen means the number of messages in chan(used where asynchronous is true). +// if the buffering chan is full, logger adapters write to file or other way. +func NewLogger(channelLens ...int64) *BeeLogger { + bl := new(BeeLogger) + bl.level = LevelDebug + bl.loggerFuncCallDepth = 2 + bl.msgChanLen = append(channelLens, 0)[0] + if bl.msgChanLen <= 0 { + bl.msgChanLen = defaultAsyncMsgLen + } + bl.signalChan = make(chan string, 1) + bl.setLogger(AdapterConsole) + return bl +} + +// Async set the log to asynchronous and start the goroutine +func (bl *BeeLogger) Async(msgLen ...int64) *BeeLogger { + bl.lock.Lock() + defer bl.lock.Unlock() + if bl.asynchronous { + return bl + } + bl.asynchronous = true + if len(msgLen) > 0 && msgLen[0] > 0 { + bl.msgChanLen = msgLen[0] + } + bl.msgChan = make(chan *logMsg, bl.msgChanLen) + logMsgPool = &sync.Pool{ + New: func() interface{} { + return &logMsg{} + }, + } + bl.wg.Add(1) + go bl.startLogger() + return bl +} + +// SetLogger provides a given logger adapter into BeeLogger with config string. +// config need to be correct JSON as string: {"interval":360}. +func (bl *BeeLogger) setLogger(adapterName string, configs ...string) error { + config := append(configs, "{}")[0] + for _, l := range bl.outputs { + if l.name == adapterName { + return fmt.Errorf("logs: duplicate adaptername %q (you have set this logger before)", adapterName) + } + } + + log, ok := adapters[adapterName] + if !ok { + return fmt.Errorf("logs: unknown adaptername %q (forgotten Register?)", adapterName) + } + + lg := log() + err := lg.Init(config) + if err != nil { + fmt.Fprintln(os.Stderr, "logs.BeeLogger.SetLogger: "+err.Error()) + return err + } + bl.outputs = append(bl.outputs, &nameLogger{name: adapterName, Logger: lg}) + return nil +} + +// SetLogger provides a given logger adapter into BeeLogger with config string. +// config need to be correct JSON as string: {"interval":360}. +func (bl *BeeLogger) SetLogger(adapterName string, configs ...string) error { + bl.lock.Lock() + defer bl.lock.Unlock() + if !bl.init { + bl.outputs = []*nameLogger{} + bl.init = true + } + return bl.setLogger(adapterName, configs...) +} + +// DelLogger remove a logger adapter in BeeLogger. +func (bl *BeeLogger) DelLogger(adapterName string) error { + bl.lock.Lock() + defer bl.lock.Unlock() + outputs := []*nameLogger{} + for _, lg := range bl.outputs { + if lg.name == adapterName { + lg.Destroy() + } else { + outputs = append(outputs, lg) + } + } + if len(outputs) == len(bl.outputs) { + return fmt.Errorf("logs: unknown adaptername %q (forgotten Register?)", adapterName) + } + bl.outputs = outputs + return nil +} + +func (bl *BeeLogger) writeToLoggers(when time.Time, msg string, level int) { + for _, l := range bl.outputs { + err := l.WriteMsg(when, msg, level) + if err != nil { + fmt.Fprintf(os.Stderr, "unable to WriteMsg to adapter:%v,error:%v\n", l.name, err) + } + } +} + +func (bl *BeeLogger) Write(p []byte) (n int, err error) { + if len(p) == 0 { + return 0, nil + } + // writeMsg will always add a '\n' character + if p[len(p)-1] == '\n' { + p = p[0: len(p)-1] + } + // set levelLoggerImpl to ensure all log message will be write out + err = bl.writeMsg(levelLoggerImpl, string(p)) + if err == nil { + return len(p), err + } + return 0, err +} + +func (bl *BeeLogger) writeMsg(logLevel int, msg string, v ...interface{}) error { + if !bl.init { + bl.lock.Lock() + bl.setLogger(AdapterConsole) + bl.lock.Unlock() + } + + if len(v) > 0 { + msg = fmt.Sprintf(msg, v...) + } + + msg = bl.prefix + " " + msg + + when := time.Now() + if bl.enableFuncCallDepth { + _, file, line, ok := runtime.Caller(bl.loggerFuncCallDepth) + if !ok { + file = "???" + line = 0 + } + _, filename := path.Split(file) + msg = "[" + filename + ":" + strconv.Itoa(line) + "] " + msg + } + + //set level info in front of filename info + if logLevel == levelLoggerImpl { + // set to emergency to ensure all log will be print out correctly + logLevel = LevelEmergency + } else { + msg = levelPrefix[logLevel] + msg + } + + if bl.asynchronous { + lm := logMsgPool.Get().(*logMsg) + lm.level = logLevel + lm.msg = msg + lm.when = when + bl.msgChan <- lm + } else { + bl.writeToLoggers(when, msg, logLevel) + } + return nil +} + +// SetLevel Set log message level. +// If message level (such as LevelDebug) is higher than logger level (such as LevelWarning), +// log providers will not even be sent the message. +func (bl *BeeLogger) SetLevel(l int) { + bl.level = l +} + +// GetLevel Get Current log message level. +func (bl *BeeLogger) GetLevel() int { + return bl.level +} + +// SetLogFuncCallDepth set log funcCallDepth +func (bl *BeeLogger) SetLogFuncCallDepth(d int) { + bl.loggerFuncCallDepth = d +} + +// GetLogFuncCallDepth return log funcCallDepth for wrapper +func (bl *BeeLogger) GetLogFuncCallDepth() int { + return bl.loggerFuncCallDepth +} + +// EnableFuncCallDepth enable log funcCallDepth +func (bl *BeeLogger) EnableFuncCallDepth(b bool) { + bl.enableFuncCallDepth = b +} + +// set prefix +func (bl *BeeLogger) SetPrefix(s string) { + bl.prefix = s +} + +// start logger chan reading. +// when chan is not empty, write logs. +func (bl *BeeLogger) startLogger() { + gameOver := false + for { + select { + case bm := <-bl.msgChan: + bl.writeToLoggers(bm.when, bm.msg, bm.level) + logMsgPool.Put(bm) + case sg := <-bl.signalChan: + // Now should only send "flush" or "close" to bl.signalChan + bl.flush() + if sg == "close" { + for _, l := range bl.outputs { + l.Destroy() + } + bl.outputs = nil + gameOver = true + } + bl.wg.Done() + } + if gameOver { + break + } + } +} + +// Emergency Log EMERGENCY level message. +func (bl *BeeLogger) Emergency(format string, v ...interface{}) { + if LevelEmergency > bl.level { + return + } + bl.writeMsg(LevelEmergency, format, v...) +} + +// Alert Log ALERT level message. +func (bl *BeeLogger) Alert(format string, v ...interface{}) { + if LevelAlert > bl.level { + return + } + bl.writeMsg(LevelAlert, format, v...) +} + +// Critical Log CRITICAL level message. +func (bl *BeeLogger) Critical(format string, v ...interface{}) { + if LevelCritical > bl.level { + return + } + bl.writeMsg(LevelCritical, format, v...) +} + +// Error Log ERROR level message. +func (bl *BeeLogger) Error(format string, v ...interface{}) { + if LevelError > bl.level { + return + } + bl.writeMsg(LevelError, format, v...) +} + +// Warning Log WARNING level message. +func (bl *BeeLogger) Warning(format string, v ...interface{}) { + if LevelWarn > bl.level { + return + } + bl.writeMsg(LevelWarn, format, v...) +} + +// Notice Log NOTICE level message. +func (bl *BeeLogger) Notice(format string, v ...interface{}) { + if LevelNotice > bl.level { + return + } + bl.writeMsg(LevelNotice, format, v...) +} + +// Informational Log INFORMATIONAL level message. +func (bl *BeeLogger) Informational(format string, v ...interface{}) { + if LevelInfo > bl.level { + return + } + bl.writeMsg(LevelInfo, format, v...) +} + +// Debug Log DEBUG level message. +func (bl *BeeLogger) Debug(format string, v ...interface{}) { + if LevelDebug > bl.level { + return + } + bl.writeMsg(LevelDebug, format, v...) +} + +// Warn Log WARN level message. +// compatibility alias for Warning() +func (bl *BeeLogger) Warn(format string, v ...interface{}) { + if LevelWarn > bl.level { + return + } + bl.writeMsg(LevelWarn, format, v...) +} + +// Info Log INFO level message. +// compatibility alias for Informational() +func (bl *BeeLogger) Info(format string, v ...interface{}) { + if LevelInfo > bl.level { + return + } + bl.writeMsg(LevelInfo, format, v...) +} + +// Trace Log TRACE level message. +// compatibility alias for Debug() +func (bl *BeeLogger) Trace(format string, v ...interface{}) { + if LevelDebug > bl.level { + return + } + bl.writeMsg(LevelDebug, format, v...) +} + +// Flush flush all chan data. +func (bl *BeeLogger) Flush() { + if bl.asynchronous { + bl.signalChan <- "flush" + bl.wg.Wait() + bl.wg.Add(1) + return + } + bl.flush() +} + +// Close close logger, flush all chan data and destroy all adapters in BeeLogger. +func (bl *BeeLogger) Close() { + if bl.asynchronous { + bl.signalChan <- "close" + bl.wg.Wait() + close(bl.msgChan) + } else { + bl.flush() + for _, l := range bl.outputs { + l.Destroy() + } + bl.outputs = nil + } + close(bl.signalChan) +} + +// Reset close all outputs, and set bl.outputs to nil +func (bl *BeeLogger) Reset() { + bl.Flush() + for _, l := range bl.outputs { + l.Destroy() + } + bl.outputs = nil +} + +func (bl *BeeLogger) flush() { + if bl.asynchronous { + for { + if len(bl.msgChan) > 0 { + bm := <-bl.msgChan + bl.writeToLoggers(bm.when, bm.msg, bm.level) + logMsgPool.Put(bm) + continue + } + break + } + } + for _, l := range bl.outputs { + l.Flush() + } +} + +// beeLogger references the used application logger. +var beeLogger = NewLogger() + +// GetBeeLogger returns the default BeeLogger +func GetBeeLogger() *BeeLogger { + return beeLogger +} + +var beeLoggerMap = struct { + sync.RWMutex + logs map[string]*log.Logger +}{ + logs: map[string]*log.Logger{}, +} + +// GetLogger returns the default BeeLogger +func GetLogger(prefixes ...string) *log.Logger { + prefix := append(prefixes, "")[0] + if prefix != "" { + prefix = fmt.Sprintf(`[%s] `, strings.ToUpper(prefix)) + } + beeLoggerMap.RLock() + l, ok := beeLoggerMap.logs[prefix] + if ok { + beeLoggerMap.RUnlock() + return l + } + beeLoggerMap.RUnlock() + beeLoggerMap.Lock() + defer beeLoggerMap.Unlock() + l, ok = beeLoggerMap.logs[prefix] + if !ok { + l = log.New(beeLogger, prefix, 0) + beeLoggerMap.logs[prefix] = l + } + return l +} + +// Reset will remove all the adapter +func Reset() { + beeLogger.Reset() +} + +// Async set the beelogger with Async mode and hold msglen messages +func Async(msgLen ...int64) *BeeLogger { + return beeLogger.Async(msgLen...) +} + +// SetLevel sets the global log level used by the simple logger. +func SetLevel(l int) { + beeLogger.SetLevel(l) +} + +// SetPrefix sets the prefix +func SetPrefix(s string) { + beeLogger.SetPrefix(s) +} + +// EnableFuncCallDepth enable log funcCallDepth +func EnableFuncCallDepth(b bool) { + beeLogger.enableFuncCallDepth = b +} + +// SetLogFuncCall set the CallDepth, default is 4 +func SetLogFuncCall(b bool) { + beeLogger.EnableFuncCallDepth(b) + beeLogger.SetLogFuncCallDepth(4) +} + +// SetLogFuncCallDepth set log funcCallDepth +func SetLogFuncCallDepth(d int) { + beeLogger.loggerFuncCallDepth = d +} + +// SetLogger sets a new logger. +func SetLogger(adapter string, config ...string) error { + return beeLogger.SetLogger(adapter, config...) +} + +// Emergency logs a message at emergency level. +func Emergency(f interface{}, v ...interface{}) { + beeLogger.Emergency(formatLog(f, v...)) +} + +// Alert logs a message at alert level. +func Alert(f interface{}, v ...interface{}) { + beeLogger.Alert(formatLog(f, v...)) +} + +// Critical logs a message at critical level. +func Critical(f interface{}, v ...interface{}) { + beeLogger.Critical(formatLog(f, v...)) +} + +// Error logs a message at error level. +func Error(f interface{}, v ...interface{}) { + beeLogger.Error(formatLog(f, v...)) +} + +// Warning logs a message at warning level. +func Warning(f interface{}, v ...interface{}) { + beeLogger.Warn(formatLog(f, v...)) +} + +// Warn compatibility alias for Warning() +func Warn(f interface{}, v ...interface{}) { + beeLogger.Warn(formatLog(f, v...)) +} + +// Notice logs a message at notice level. +func Notice(f interface{}, v ...interface{}) { + beeLogger.Notice(formatLog(f, v...)) +} + +// Informational logs a message at info level. +func Informational(f interface{}, v ...interface{}) { + beeLogger.Info(formatLog(f, v...)) +} + +// Info compatibility alias for Warning() +func Info(f interface{}, v ...interface{}) { + beeLogger.Info(formatLog(f, v...)) +} + +// Debug logs a message at debug level. +func Debug(f interface{}, v ...interface{}) { + beeLogger.Debug(formatLog(f, v...)) +} + +// Trace logs a message at trace level. +// compatibility alias for Warning() +func Trace(f interface{}, v ...interface{}) { + beeLogger.Trace(formatLog(f, v...)) +} + +func formatLog(f interface{}, v ...interface{}) string { + var msg string + switch f.(type) { + case string: + msg = f.(string) + if len(v) == 0 { + return msg + } + if strings.Contains(msg, "%") && !strings.Contains(msg, "%%") { + //format string + } else { + //do not contain format char + msg += strings.Repeat(" %v", len(v)) + } + default: + msg = fmt.Sprint(f) + if len(v) == 0 { + return msg + } + msg += strings.Repeat(" %v", len(v)) + } + return fmt.Sprintf(msg, v...) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/logger.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/logger.go new file mode 100644 index 0000000000000000000000000000000000000000..428d3aa0604904a008a6462179dd6196fb465bfa --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/logger.go @@ -0,0 +1,208 @@ +// Copyright 2014 beego Author. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT 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 logs + +import ( + "fmt" + "io" + "os" + "sync" + "time" +) + +type logWriter struct { + sync.Mutex + writer io.Writer +} + +func newLogWriter(wr io.Writer) *logWriter { + return &logWriter{writer: wr} +} + +func (lg *logWriter) println(when time.Time, msg string) { + lg.Lock() + h, _, _:= formatTimeHeader(when) + lg.writer.Write(append(append(h, msg...), '\n')) + lg.Unlock() +} + +type outputMode int + +// DiscardNonColorEscSeq supports the divided color escape sequence. +// But non-color escape sequence is not output. +// Please use the OutputNonColorEscSeq If you want to output a non-color +// escape sequences such as ncurses. However, it does not support the divided +// color escape sequence. +const ( + _ outputMode = iota + DiscardNonColorEscSeq + OutputNonColorEscSeq +) + +// NewAnsiColorWriter creates and initializes a new ansiColorWriter +// using io.Writer w as its initial contents. +// In the console of Windows, which change the foreground and background +// colors of the text by the escape sequence. +// In the console of other systems, which writes to w all text. +func NewAnsiColorWriter(w io.Writer) io.Writer { + return NewModeAnsiColorWriter(w, DiscardNonColorEscSeq) +} + +// NewModeAnsiColorWriter create and initializes a new ansiColorWriter +// by specifying the outputMode. +func NewModeAnsiColorWriter(w io.Writer, mode outputMode) io.Writer { + if _, ok := w.(*ansiColorWriter); !ok { + return &ansiColorWriter{ + w: w, + mode: mode, + } + } + return w +} + +const ( + y1 = `0123456789` + y2 = `0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789` + y3 = `0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999` + y4 = `0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789` + mo1 = `000000000111` + mo2 = `123456789012` + d1 = `0000000001111111111222222222233` + d2 = `1234567890123456789012345678901` + h1 = `000000000011111111112222` + h2 = `012345678901234567890123` + mi1 = `000000000011111111112222222222333333333344444444445555555555` + mi2 = `012345678901234567890123456789012345678901234567890123456789` + s1 = `000000000011111111112222222222333333333344444444445555555555` + s2 = `012345678901234567890123456789012345678901234567890123456789` + ns1 = `0123456789` +) + +func formatTimeHeader(when time.Time) ([]byte, int, int) { + y, mo, d := when.Date() + h, mi, s := when.Clock() + ns := when.Nanosecond() / 1000000 + //len("2006/01/02 15:04:05.123 ")==24 + var buf [24]byte + + buf[0] = y1[y/1000%10] + buf[1] = y2[y/100] + buf[2] = y3[y-y/100*100] + buf[3] = y4[y-y/100*100] + buf[4] = '/' + buf[5] = mo1[mo-1] + buf[6] = mo2[mo-1] + buf[7] = '/' + buf[8] = d1[d-1] + buf[9] = d2[d-1] + buf[10] = ' ' + buf[11] = h1[h] + buf[12] = h2[h] + buf[13] = ':' + buf[14] = mi1[mi] + buf[15] = mi2[mi] + buf[16] = ':' + buf[17] = s1[s] + buf[18] = s2[s] + buf[19] = '.' + buf[20] = ns1[ns/100] + buf[21] = ns1[ns%100/10] + buf[22] = ns1[ns%10] + + buf[23] = ' ' + + return buf[0:], d, h +} + +var ( + green = string([]byte{27, 91, 57, 55, 59, 52, 50, 109}) + white = string([]byte{27, 91, 57, 48, 59, 52, 55, 109}) + yellow = string([]byte{27, 91, 57, 55, 59, 52, 51, 109}) + red = string([]byte{27, 91, 57, 55, 59, 52, 49, 109}) + blue = string([]byte{27, 91, 57, 55, 59, 52, 52, 109}) + magenta = string([]byte{27, 91, 57, 55, 59, 52, 53, 109}) + cyan = string([]byte{27, 91, 57, 55, 59, 52, 54, 109}) + + w32Green = string([]byte{27, 91, 52, 50, 109}) + w32White = string([]byte{27, 91, 52, 55, 109}) + w32Yellow = string([]byte{27, 91, 52, 51, 109}) + w32Red = string([]byte{27, 91, 52, 49, 109}) + w32Blue = string([]byte{27, 91, 52, 52, 109}) + w32Magenta = string([]byte{27, 91, 52, 53, 109}) + w32Cyan = string([]byte{27, 91, 52, 54, 109}) + + reset = string([]byte{27, 91, 48, 109}) +) + +// ColorByStatus return color by http code +// 2xx return Green +// 3xx return White +// 4xx return Yellow +// 5xx return Red +func ColorByStatus(cond bool, code int) string { + switch { + case code >= 200 && code < 300: + return map[bool]string{true: green, false: w32Green}[cond] + case code >= 300 && code < 400: + return map[bool]string{true: white, false: w32White}[cond] + case code >= 400 && code < 500: + return map[bool]string{true: yellow, false: w32Yellow}[cond] + default: + return map[bool]string{true: red, false: w32Red}[cond] + } +} + +// ColorByMethod return color by http code +// GET return Blue +// POST return Cyan +// PUT return Yellow +// DELETE return Red +// PATCH return Green +// HEAD return Magenta +// OPTIONS return WHITE +func ColorByMethod(cond bool, method string) string { + switch method { + case "GET": + return map[bool]string{true: blue, false: w32Blue}[cond] + case "POST": + return map[bool]string{true: cyan, false: w32Cyan}[cond] + case "PUT": + return map[bool]string{true: yellow, false: w32Yellow}[cond] + case "DELETE": + return map[bool]string{true: red, false: w32Red}[cond] + case "PATCH": + return map[bool]string{true: green, false: w32Green}[cond] + case "HEAD": + return map[bool]string{true: magenta, false: w32Magenta}[cond] + case "OPTIONS": + return map[bool]string{true: white, false: w32White}[cond] + default: + return reset + } +} + +// Guard Mutex to guarantee atomic of W32Debug(string) function +var mu sync.Mutex + +// W32Debug Helper method to output colored logs in Windows terminals +func W32Debug(msg string) { + mu.Lock() + defer mu.Unlock() + + current := time.Now() + w := NewAnsiColorWriter(os.Stdout) + + fmt.Fprintf(w, "[beego] %v %s\n", current.Format("2006/01/02 - 15:04:05"), msg) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/multifile.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/multifile.go new file mode 100644 index 0000000000000000000000000000000000000000..901682743f8a9630b222dea3d8de1b2107384fdb --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/multifile.go @@ -0,0 +1,119 @@ +// Copyright 2014 beego Author. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT 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 logs + +import ( + "encoding/json" + "time" +) + +// A filesLogWriter manages several fileLogWriter +// filesLogWriter will write logs to the file in json configuration and write the same level log to correspond file +// means if the file name in configuration is project.log filesLogWriter will create project.error.log/project.debug.log +// and write the error-level logs to project.error.log and write the debug-level logs to project.debug.log +// the rotate attribute also acts like fileLogWriter +type multiFileLogWriter struct { + writers [LevelDebug + 1 + 1]*fileLogWriter // the last one for fullLogWriter + fullLogWriter *fileLogWriter + Separate []string `json:"separate"` +} + +var levelNames = [...]string{"emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"} + +// Init file logger with json config. +// jsonConfig like: +// { +// "filename":"logs/beego.log", +// "maxLines":0, +// "maxsize":0, +// "daily":true, +// "maxDays":15, +// "rotate":true, +// "perm":0600, +// "separate":["emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"], +// } + +func (f *multiFileLogWriter) Init(config string) error { + writer := newFileWriter().(*fileLogWriter) + err := writer.Init(config) + if err != nil { + return err + } + f.fullLogWriter = writer + f.writers[LevelDebug+1] = writer + + //unmarshal "separate" field to f.Separate + json.Unmarshal([]byte(config), f) + + jsonMap := map[string]interface{}{} + json.Unmarshal([]byte(config), &jsonMap) + + for i := LevelEmergency; i < LevelDebug+1; i++ { + for _, v := range f.Separate { + if v == levelNames[i] { + jsonMap["filename"] = f.fullLogWriter.fileNameOnly + "." + levelNames[i] + f.fullLogWriter.suffix + jsonMap["level"] = i + bs, _ := json.Marshal(jsonMap) + writer = newFileWriter().(*fileLogWriter) + err := writer.Init(string(bs)) + if err != nil { + return err + } + f.writers[i] = writer + } + } + } + + return nil +} + +func (f *multiFileLogWriter) Destroy() { + for i := 0; i < len(f.writers); i++ { + if f.writers[i] != nil { + f.writers[i].Destroy() + } + } +} + +func (f *multiFileLogWriter) WriteMsg(when time.Time, msg string, level int) error { + if f.fullLogWriter != nil { + f.fullLogWriter.WriteMsg(when, msg, level) + } + for i := 0; i < len(f.writers)-1; i++ { + if f.writers[i] != nil { + if level == f.writers[i].Level { + f.writers[i].WriteMsg(when, msg, level) + } + } + } + return nil +} + +func (f *multiFileLogWriter) Flush() { + for i := 0; i < len(f.writers); i++ { + if f.writers[i] != nil { + f.writers[i].Flush() + } + } +} + +// newFilesWriter create a FileLogWriter returning as LoggerInterface. +func newFilesWriter() Logger { + return &multiFileLogWriter{} +} + +func init() { + Register(AdapterMultiFile, newFilesWriter) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/slack.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/slack.go new file mode 100644 index 0000000000000000000000000000000000000000..1cd2e5aeeb09cbbba50c86aa53b0be27bcffde13 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/slack.go @@ -0,0 +1,60 @@ +package logs + +import ( + "encoding/json" + "fmt" + "net/http" + "net/url" + "time" +) + +// SLACKWriter implements beego LoggerInterface and is used to send jiaoliao webhook +type SLACKWriter struct { + WebhookURL string `json:"webhookurl"` + Level int `json:"level"` +} + +// newSLACKWriter create jiaoliao writer. +func newSLACKWriter() Logger { + return &SLACKWriter{Level: LevelTrace} +} + +// Init SLACKWriter with json config string +func (s *SLACKWriter) Init(jsonconfig string) error { + return json.Unmarshal([]byte(jsonconfig), s) +} + +// WriteMsg write message in smtp writer. +// it will send an email with subject and only this message. +func (s *SLACKWriter) WriteMsg(when time.Time, msg string, level int) error { + if level > s.Level { + return nil + } + + text := fmt.Sprintf("{\"text\": \"%s %s\"}", when.Format("2006-01-02 15:04:05"), msg) + + form := url.Values{} + form.Add("payload", text) + + resp, err := http.PostForm(s.WebhookURL, form) + if err != nil { + return err + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("Post webhook failed %s %d", resp.Status, resp.StatusCode) + } + return nil +} + +// Flush implementing method. empty. +func (s *SLACKWriter) Flush() { +} + +// Destroy implementing method. empty. +func (s *SLACKWriter) Destroy() { +} + +func init() { + Register(AdapterSlack, newSLACKWriter) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/smtp.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/smtp.go new file mode 100644 index 0000000000000000000000000000000000000000..6208d7b8594372499c5795a1f0bf9952fa7763ab --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/astaxie/beego/logs/smtp.go @@ -0,0 +1,149 @@ +// Copyright 2014 beego Author. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT 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 logs + +import ( + "crypto/tls" + "encoding/json" + "fmt" + "net" + "net/smtp" + "strings" + "time" +) + +// SMTPWriter implements LoggerInterface and is used to send emails via given SMTP-server. +type SMTPWriter struct { + Username string `json:"username"` + Password string `json:"password"` + Host string `json:"host"` + Subject string `json:"subject"` + FromAddress string `json:"fromAddress"` + RecipientAddresses []string `json:"sendTos"` + Level int `json:"level"` +} + +// NewSMTPWriter create smtp writer. +func newSMTPWriter() Logger { + return &SMTPWriter{Level: LevelTrace} +} + +// Init smtp writer with json config. +// config like: +// { +// "username":"example@gmail.com", +// "password:"password", +// "host":"smtp.gmail.com:465", +// "subject":"email title", +// "fromAddress":"from@example.com", +// "sendTos":["email1","email2"], +// "level":LevelError +// } +func (s *SMTPWriter) Init(jsonconfig string) error { + return json.Unmarshal([]byte(jsonconfig), s) +} + +func (s *SMTPWriter) getSMTPAuth(host string) smtp.Auth { + if len(strings.Trim(s.Username, " ")) == 0 && len(strings.Trim(s.Password, " ")) == 0 { + return nil + } + return smtp.PlainAuth( + "", + s.Username, + s.Password, + host, + ) +} + +func (s *SMTPWriter) sendMail(hostAddressWithPort string, auth smtp.Auth, fromAddress string, recipients []string, msgContent []byte) error { + client, err := smtp.Dial(hostAddressWithPort) + if err != nil { + return err + } + + host, _, _ := net.SplitHostPort(hostAddressWithPort) + tlsConn := &tls.Config{ + InsecureSkipVerify: true, + ServerName: host, + } + if err = client.StartTLS(tlsConn); err != nil { + return err + } + + if auth != nil { + if err = client.Auth(auth); err != nil { + return err + } + } + + if err = client.Mail(fromAddress); err != nil { + return err + } + + for _, rec := range recipients { + if err = client.Rcpt(rec); err != nil { + return err + } + } + + w, err := client.Data() + if err != nil { + return err + } + _, err = w.Write(msgContent) + if err != nil { + return err + } + + err = w.Close() + if err != nil { + return err + } + + return client.Quit() +} + +// WriteMsg write message in smtp writer. +// it will send an email with subject and only this message. +func (s *SMTPWriter) WriteMsg(when time.Time, msg string, level int) error { + if level > s.Level { + return nil + } + + hp := strings.Split(s.Host, ":") + + // Set up authentication information. + auth := s.getSMTPAuth(hp[0]) + + // Connect to the server, authenticate, set the sender and recipient, + // and send the email all in one step. + contentType := "Content-Type: text/plain" + "; charset=UTF-8" + mailmsg := []byte("To: " + strings.Join(s.RecipientAddresses, ";") + "\r\nFrom: " + s.FromAddress + "<" + s.FromAddress + + ">\r\nSubject: " + s.Subject + "\r\n" + contentType + "\r\n\r\n" + fmt.Sprintf(".%s", when.Format("2006-01-02 15:04:05")) + msg) + + return s.sendMail(s.Host, auth, s.FromAddress, s.RecipientAddresses, mailmsg) +} + +// Flush implementing method. empty. +func (s *SMTPWriter) Flush() { +} + +// Destroy implementing method. empty. +func (s *SMTPWriter) Destroy() { +} + +func init() { + Register(AdapterMail, newSMTPWriter) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/8bit.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/8bit.go new file mode 100644 index 0000000000000000000000000000000000000000..f1f72b83c67787bd89df23a5ac53db9dd01bca16 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/8bit.go @@ -0,0 +1,842 @@ +package mahonia + +import ( + "fmt" + "sync" +) + +// Converters for simple 8-bit character sets. + +type eightBitInfo struct { + Name string + Aliases []string + + // the character used for characters that can't be converted + SubstitutionChar byte + + // a string containing all 256 characters, in order. + Repertoire string + + // used to synchronize unpacking Repertoire into the conversion tables + once *sync.Once + + // true if the first 128 characters are the same as US-ASCII + asciiCompatible bool + + byte2char [256]rune + char2byte map[rune]byte +} + +const asciiRepertoire = "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f" + +func (info *eightBitInfo) register() { + var cs Charset + cs.Name = info.Name + cs.Aliases = info.Aliases + + info.once = new(sync.Once) + + cs.NewDecoder = func() Decoder { + info.once.Do(func() { info.unpack() }) + + return func(p []byte) (c rune, size int, status Status) { + if len(p) == 0 { + status = NO_ROOM + return + } + + c = info.byte2char[p[0]] + + if c == 0xfffd { + status = INVALID_CHAR + } else { + status = SUCCESS + } + + size = 1 + return + } + } + + cs.NewEncoder = func() Encoder { + info.once.Do(func() { info.unpack() }) + + return func(p []byte, c rune) (size int, status Status) { + if len(p) == 0 { + status = NO_ROOM + return + } + + if c < 128 && info.asciiCompatible { + p[0] = byte(c) + return 1, SUCCESS + } + + b, ok := info.char2byte[c] + if !ok { + b = info.SubstitutionChar + status = INVALID_CHAR + } else { + status = SUCCESS + } + p[0] = b + size = 1 + return + } + } + + RegisterCharset(&cs) +} + +func (info *eightBitInfo) unpack() { + info.asciiCompatible = info.Repertoire[:128] == asciiRepertoire + + info.char2byte = make(map[rune]byte, 256) + i := 0 + for _, c := range info.Repertoire { + info.byte2char[i] = c + if c != 0xfffd { + info.char2byte[c] = byte(i) + } + i++ + } + if i != 256 { + panic(fmt.Errorf("%s has only %d characters", info.Name, i)) + } +} + +func init() { + for i := 0; i < len(eightBitCharsets); i++ { + eightBitCharsets[i].register() + } +} + +var eightBitCharsets = []eightBitInfo{ + { + Name: "ISO-8859-2", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0104\u02d8\u0141\u00a4\u013d\u015a\u00a7\u00a8\u0160\u015e\u0164\u0179\u00ad\u017d\u017b\u00b0\u0105\u02db\u0142\u00b4\u013e\u015b\u02c7\u00b8\u0161\u015f\u0165\u017a\u02dd\u017e\u017c\u0154\u00c1\u00c2\u0102\u00c4\u0139\u0106\u00c7\u010c\u00c9\u0118\u00cb\u011a\u00cd\u00ce\u010e\u0110\u0143\u0147\u00d3\u00d4\u0150\u00d6\u00d7\u0158\u016e\u00da\u0170\u00dc\u00dd\u0162\u00df\u0155\u00e1\u00e2\u0103\u00e4\u013a\u0107\u00e7\u010d\u00e9\u0119\u00eb\u011b\u00ed\u00ee\u010f\u0111\u0144\u0148\u00f3\u00f4\u0151\u00f6\u00f7\u0159\u016f\u00fa\u0171\u00fc\u00fd\u0163\u02d9", + Aliases: []string{"ISO_8859-2:1987", "iso-ir-101", "latin2", "l2", "csISOLatin2"}, + }, + { + Name: "ISO-8859-3", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0126\u02d8\u00a3\u00a4\ufffd\u0124\u00a7\u00a8\u0130\u015e\u011e\u0134\u00ad\ufffd\u017b\u00b0\u0127\u00b2\u00b3\u00b4\u00b5\u0125\u00b7\u00b8\u0131\u015f\u011f\u0135\u00bd\ufffd\u017c\u00c0\u00c1\u00c2\ufffd\u00c4\u010a\u0108\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\ufffd\u00d1\u00d2\u00d3\u00d4\u0120\u00d6\u00d7\u011c\u00d9\u00da\u00db\u00dc\u016c\u015c\u00df\u00e0\u00e1\u00e2\ufffd\u00e4\u010b\u0109\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\ufffd\u00f1\u00f2\u00f3\u00f4\u0121\u00f6\u00f7\u011d\u00f9\u00fa\u00fb\u00fc\u016d\u015d\u02d9", + Aliases: []string{"ISO_8859-3:1988", "iso-ir-109", "latin3", "l3", "csISOLatin3"}, + }, + { + Name: "ISO-8859-4", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0104\u0138\u0156\u00a4\u0128\u013b\u00a7\u00a8\u0160\u0112\u0122\u0166\u00ad\u017d\u00af\u00b0\u0105\u02db\u0157\u00b4\u0129\u013c\u02c7\u00b8\u0161\u0113\u0123\u0167\u014a\u017e\u014b\u0100\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u012e\u010c\u00c9\u0118\u00cb\u0116\u00cd\u00ce\u012a\u0110\u0145\u014c\u0136\u00d4\u00d5\u00d6\u00d7\u00d8\u0172\u00da\u00db\u00dc\u0168\u016a\u00df\u0101\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u012f\u010d\u00e9\u0119\u00eb\u0117\u00ed\u00ee\u012b\u0111\u0146\u014d\u0137\u00f4\u00f5\u00f6\u00f7\u00f8\u0173\u00fa\u00fb\u00fc\u0169\u016b\u02d9", + Aliases: []string{"ISO_8859-4:1988", "iso-ir-110", "latin4", "l4", "csISOLatin4"}, + }, + { + Name: "ISO-8859-5", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0401\u0402\u0403\u0404\u0405\u0406\u0407\u0408\u0409\u040a\u040b\u040c\u00ad\u040e\u040f\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u2116\u0451\u0452\u0453\u0454\u0455\u0456\u0457\u0458\u0459\u045a\u045b\u045c\u00a7\u045e\u045f", + Aliases: []string{"ISO_8859-5:1988", "iso-ir-144", "cyrillic", "csISOLatinCyrillic"}, + }, + { + Name: "ISO-8859-6", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\ufffd\ufffd\ufffd\u00a4\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u060c\u00ad\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u061b\ufffd\ufffd\ufffd\u061f\ufffd\u0621\u0622\u0623\u0624\u0625\u0626\u0627\u0628\u0629\u062a\u062b\u062c\u062d\u062e\u062f\u0630\u0631\u0632\u0633\u0634\u0635\u0636\u0637\u0638\u0639\u063a\ufffd\ufffd\ufffd\ufffd\ufffd\u0640\u0641\u0642\u0643\u0644\u0645\u0646\u0647\u0648\u0649\u064a\u064b\u064c\u064d\u064e\u064f\u0650\u0651\u0652\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd", + Aliases: []string{"ISO_8859-6:1987", "iso-ir-127", "ECMA-114", "ASMO-708", "arabic", "csISOLatinArabic"}, + }, + { + Name: "ISO-8859-7", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u2018\u2019\u00a3\u20ac\u20af\u00a6\u00a7\u00a8\u00a9\u037a\u00ab\u00ac\u00ad\ufffd\u2015\u00b0\u00b1\u00b2\u00b3\u0384\u0385\u0386\u00b7\u0388\u0389\u038a\u00bb\u038c\u00bd\u038e\u038f\u0390\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\ufffd\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u03ca\u03cb\u03cc\u03cd\u03ce\ufffd", + Aliases: []string{"ISO_8859-7:2003", "iso-ir-126", "ELOT_928", "ECMA-118", "greek", "greek8", "csISOLatinGreek"}, + }, + { + Name: "ISO-8859-8", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\ufffd\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u00d7\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00f7\u00bb\u00bc\u00bd\u00be\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u2017\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\ufffd\ufffd\u200e\u200f\ufffd", + Aliases: []string{"ISO_8859-8:1999", "iso-ir-138", "hebrew", "csISOLatinHebrew"}, + }, + { + Name: "ISO-8859-9", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u00a1\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00ba\u00bb\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u011e\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u0130\u015e\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u011f\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u0131\u015f\u00ff", + Aliases: []string{"ISO_8859-9:1999", "iso-ir-148", "latin5", "l5", "csISOLatin5"}, + }, + { + Name: "ISO-8859-10", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0104\u0112\u0122\u012a\u0128\u0136\u00a7\u013b\u0110\u0160\u0166\u017d\u00ad\u016a\u014a\u00b0\u0105\u0113\u0123\u012b\u0129\u0137\u00b7\u013c\u0111\u0161\u0167\u017e\u2015\u016b\u014b\u0100\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u012e\u010c\u00c9\u0118\u00cb\u0116\u00cd\u00ce\u00cf\u00d0\u0145\u014c\u00d3\u00d4\u00d5\u00d6\u0168\u00d8\u0172\u00da\u00db\u00dc\u00dd\u00de\u00df\u0101\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u012f\u010d\u00e9\u0119\u00eb\u0117\u00ed\u00ee\u00ef\u00f0\u0146\u014d\u00f3\u00f4\u00f5\u00f6\u0169\u00f8\u0173\u00fa\u00fb\u00fc\u00fd\u00fe\u0138", + Aliases: []string{"iso_8859-10:1992", "l6", "iso-ir-157", "latin6", "csISOLatin6"}, + }, + { + Name: "ISO-8859-11", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07\u0e08\u0e09\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e2f\u0e30\u0e31\u0e32\u0e33\u0e34\u0e35\u0e36\u0e37\u0e38\u0e39\u0e3a\ufffd\ufffd\ufffd\ufffd\u0e3f\u0e40\u0e41\u0e42\u0e43\u0e44\u0e45\u0e46\u0e47\u0e48\u0e49\u0e4a\u0e4b\u0e4c\u0e4d\u0e4e\u0e4f\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0e5a\u0e5b\ufffd\ufffd\ufffd\ufffd", + Aliases: []string{"iso_8859-11:2001", "Latin/Thai", "TIS-620"}, + }, + { + Name: "ISO-8859-13", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u201d\u00a2\u00a3\u00a4\u201e\u00a6\u00a7\u00d8\u00a9\u0156\u00ab\u00ac\u00ad\u00ae\u00c6\u00b0\u00b1\u00b2\u00b3\u201c\u00b5\u00b6\u00b7\u00f8\u00b9\u0157\u00bb\u00bc\u00bd\u00be\u00e6\u0104\u012e\u0100\u0106\u00c4\u00c5\u0118\u0112\u010c\u00c9\u0179\u0116\u0122\u0136\u012a\u013b\u0160\u0143\u0145\u00d3\u014c\u00d5\u00d6\u00d7\u0172\u0141\u015a\u016a\u00dc\u017b\u017d\u00df\u0105\u012f\u0101\u0107\u00e4\u00e5\u0119\u0113\u010d\u00e9\u017a\u0117\u0123\u0137\u012b\u013c\u0161\u0144\u0146\u00f3\u014d\u00f5\u00f6\u00f7\u0173\u0142\u015b\u016b\u00fc\u017c\u017e\u2019", + Aliases: []string{"latin7", "Baltic Rim"}, + }, + { + Name: "ISO-8859-14", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u1e02\u1e03\u00a3\u010a\u010b\u1e0a\u00a7\u1e80\u00a9\u1e82\u1e0b\u1ef2\u00ad\u00ae\u0178\u1e1e\u1e1f\u0120\u0121\u1e40\u1e41\u00b6\u1e56\u1e81\u1e57\u1e83\u1e60\u1ef3\u1e84\u1e85\u1e61\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u0174\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u1e6a\u00d8\u00d9\u00da\u00db\u00dc\u00dd\u0176\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u0175\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u1e6b\u00f8\u00f9\u00fa\u00fb\u00fc\u00fd\u0177\u00ff", + Aliases: []string{"iso-ir-199", "ISO_8859-14:1998", "latin8", "iso-celtic", "l8"}, + }, + { + Name: "ISO-8859-15", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u00a1\u00a2\u00a3\u20ac\u00a5\u0160\u00a7\u0161\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u017d\u00b5\u00b6\u00b7\u017e\u00b9\u00ba\u00bb\u0152\u0153\u0178\u00bf\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u00dd\u00de\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u00f0\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u00fd\u00fe\u00ff", + Aliases: []string{"Latin-9"}, + }, + { + Name: "ISO-8859-16", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0104\u0105\u0141\u20ac\u201e\u0160\u00a7\u0161\u00a9\u0218\u00ab\u0179\u00ad\u017a\u017b\u00b0\u00b1\u010c\u0142\u017d\u201d\u00b6\u00b7\u017e\u010d\u0219\u00bb\u0152\u0153\u0178\u017c\u00c0\u00c1\u00c2\u0102\u00c4\u0106\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u0110\u0143\u00d2\u00d3\u00d4\u0150\u00d6\u015a\u0170\u00d9\u00da\u00db\u00dc\u0118\u021a\u00df\u00e0\u00e1\u00e2\u0103\u00e4\u0107\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u0111\u0144\u00f2\u00f3\u00f4\u0151\u00f6\u015b\u0171\u00f9\u00fa\u00fb\u00fc\u0119\u021b\u00ff", + Aliases: []string{"iso-ir-226", "ISO_8859-16:2001", "latin10", "l10"}, + }, + { + Name: "macos-0_2-10.2", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u00c4\u00c5\u00c7\u00c9\u00d1\u00d6\u00dc\u00e1\u00e0\u00e2\u00e4\u00e3\u00e5\u00e7\u00e9\u00e8\u00ea\u00eb\u00ed\u00ec\u00ee\u00ef\u00f1\u00f3\u00f2\u00f4\u00f6\u00f5\u00fa\u00f9\u00fb\u00fc\u2020\u00b0\u00a2\u00a3\u00a7\u2022\u00b6\u00df\u00ae\u00a9\u2122\u00b4\u00a8\u2260\u00c6\u00d8\u221e\u00b1\u2264\u2265\u00a5\u00b5\u2202\u2211\u220f\u03c0\u222b\u00aa\u00ba\u03a9\u00e6\u00f8\u00bf\u00a1\u00ac\u221a\u0192\u2248\u2206\u00ab\u00bb\u2026\u00a0\u00c0\u00c3\u00d5\u0152\u0153\u2013\u2014\u201c\u201d\u2018\u2019\u00f7\u25ca\u00ff\u0178\u2044\u20ac\u2039\u203a\ufb01\ufb02\u2021\u00b7\u201a\u201e\u2030\u00c2\u00ca\u00c1\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00d3\u00d4\uf8ff\u00d2\u00da\u00db\u00d9\u0131\u02c6\u02dc\u00af\u02d8\u02d9\u02da\u00b8\u02dd\u02db\u02c7", + Aliases: []string{"macos-0_2-10.2", "macintosh", "mac", "csMacintosh", "windows-10000", "macroman"}, + }, + { + Name: "macos-6_2-10.4", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u00c4\u00b9\u00b2\u00c9\u00b3\u00d6\u00dc\u0385\u00e0\u00e2\u00e4\u0384\u00a8\u00e7\u00e9\u00e8\u00ea\u00eb\u00a3\u2122\u00ee\u00ef\u2022\u00bd\u2030\u00f4\u00f6\u00a6\u20ac\u00f9\u00fb\u00fc\u2020\u0393\u0394\u0398\u039b\u039e\u03a0\u00df\u00ae\u00a9\u03a3\u03aa\u00a7\u2260\u00b0\u00b7\u0391\u00b1\u2264\u2265\u00a5\u0392\u0395\u0396\u0397\u0399\u039a\u039c\u03a6\u03ab\u03a8\u03a9\u03ac\u039d\u00ac\u039f\u03a1\u2248\u03a4\u00ab\u00bb\u2026\u00a0\u03a5\u03a7\u0386\u0388\u0153\u2013\u2015\u201c\u201d\u2018\u2019\u00f7\u0389\u038a\u038c\u038e\u03ad\u03ae\u03af\u03cc\u038f\u03cd\u03b1\u03b2\u03c8\u03b4\u03b5\u03c6\u03b3\u03b7\u03b9\u03be\u03ba\u03bb\u03bc\u03bd\u03bf\u03c0\u03ce\u03c1\u03c3\u03c4\u03b8\u03c9\u03c2\u03c7\u03c5\u03b6\u03ca\u03cb\u0390\u03b0\u00ad", + Aliases: []string{"macos-6_2-10.4", "x-mac-greek", "windows-10006", "macgr"}, + }, + { + Name: "macos-7_3-10.2", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u2020\u00b0\u0490\u00a3\u00a7\u2022\u00b6\u0406\u00ae\u00a9\u2122\u0402\u0452\u2260\u0403\u0453\u221e\u00b1\u2264\u2265\u0456\u00b5\u0491\u0408\u0404\u0454\u0407\u0457\u0409\u0459\u040a\u045a\u0458\u0405\u00ac\u221a\u0192\u2248\u2206\u00ab\u00bb\u2026\u00a0\u040b\u045b\u040c\u045c\u0455\u2013\u2014\u201c\u201d\u2018\u2019\u00f7\u201e\u040e\u045e\u040f\u045f\u2116\u0401\u0451\u044f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u20ac", + Aliases: []string{"macos-7_3-10.2", "x-mac-cyrillic", "windows-10007", "mac-cyrillic", "maccy"}, + }, + { + Name: "macos-29-10.2", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u00c4\u0100\u0101\u00c9\u0104\u00d6\u00dc\u00e1\u0105\u010c\u00e4\u010d\u0106\u0107\u00e9\u0179\u017a\u010e\u00ed\u010f\u0112\u0113\u0116\u00f3\u0117\u00f4\u00f6\u00f5\u00fa\u011a\u011b\u00fc\u2020\u00b0\u0118\u00a3\u00a7\u2022\u00b6\u00df\u00ae\u00a9\u2122\u0119\u00a8\u2260\u0123\u012e\u012f\u012a\u2264\u2265\u012b\u0136\u2202\u2211\u0142\u013b\u013c\u013d\u013e\u0139\u013a\u0145\u0146\u0143\u00ac\u221a\u0144\u0147\u2206\u00ab\u00bb\u2026\u00a0\u0148\u0150\u00d5\u0151\u014c\u2013\u2014\u201c\u201d\u2018\u2019\u00f7\u25ca\u014d\u0154\u0155\u0158\u2039\u203a\u0159\u0156\u0157\u0160\u201a\u201e\u0161\u015a\u015b\u00c1\u0164\u0165\u00cd\u017d\u017e\u016a\u00d3\u00d4\u016b\u016e\u00da\u016f\u0170\u0171\u0172\u0173\u00dd\u00fd\u0137\u017b\u0141\u017c\u0122\u02c7", + Aliases: []string{"macos-29-10.2", "x-mac-centraleurroman", "windows-10029", "x-mac-ce", "macce", "maccentraleurope"}, + }, + { + Name: "macos-35-10.2", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u00c4\u00c5\u00c7\u00c9\u00d1\u00d6\u00dc\u00e1\u00e0\u00e2\u00e4\u00e3\u00e5\u00e7\u00e9\u00e8\u00ea\u00eb\u00ed\u00ec\u00ee\u00ef\u00f1\u00f3\u00f2\u00f4\u00f6\u00f5\u00fa\u00f9\u00fb\u00fc\u2020\u00b0\u00a2\u00a3\u00a7\u2022\u00b6\u00df\u00ae\u00a9\u2122\u00b4\u00a8\u2260\u00c6\u00d8\u221e\u00b1\u2264\u2265\u00a5\u00b5\u2202\u2211\u220f\u03c0\u222b\u00aa\u00ba\u03a9\u00e6\u00f8\u00bf\u00a1\u00ac\u221a\u0192\u2248\u2206\u00ab\u00bb\u2026\u00a0\u00c0\u00c3\u00d5\u0152\u0153\u2013\u2014\u201c\u201d\u2018\u2019\u00f7\u25ca\u00ff\u0178\u011e\u011f\u0130\u0131\u015e\u015f\u2021\u00b7\u201a\u201e\u2030\u00c2\u00ca\u00c1\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00d3\u00d4\uf8ff\u00d2\u00da\u00db\u00d9\uf8a0\u02c6\u02dc\u00af\u02d8\u02d9\u02da\u00b8\u02dd\u02db\u02c7", + Aliases: []string{"macos-35-10.2", "x-mac-turkish", "windows-10081", "mactr"}, + }, + { + Name: "windows-1250", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\ufffd\u201a\ufffd\u201e\u2026\u2020\u2021\ufffd\u2030\u0160\u2039\u015a\u0164\u017d\u0179\ufffd\u2018\u2019\u201c\u201d\u2022\u2013\u2014\ufffd\u2122\u0161\u203a\u015b\u0165\u017e\u017a\u00a0\u02c7\u02d8\u0141\u00a4\u0104\u00a6\u00a7\u00a8\u00a9\u015e\u00ab\u00ac\u00ad\u00ae\u017b\u00b0\u00b1\u02db\u0142\u00b4\u00b5\u00b6\u00b7\u00b8\u0105\u015f\u00bb\u013d\u02dd\u013e\u017c\u0154\u00c1\u00c2\u0102\u00c4\u0139\u0106\u00c7\u010c\u00c9\u0118\u00cb\u011a\u00cd\u00ce\u010e\u0110\u0143\u0147\u00d3\u00d4\u0150\u00d6\u00d7\u0158\u016e\u00da\u0170\u00dc\u00dd\u0162\u00df\u0155\u00e1\u00e2\u0103\u00e4\u013a\u0107\u00e7\u010d\u00e9\u0119\u00eb\u011b\u00ed\u00ee\u010f\u0111\u0144\u0148\u00f3\u00f4\u0151\u00f6\u00f7\u0159\u016f\u00fa\u0171\u00fc\u00fd\u0163\u02d9", + }, + { + Name: "windows-1251", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0402\u0403\u201a\u0453\u201e\u2026\u2020\u2021\u20ac\u2030\u0409\u2039\u040a\u040c\u040b\u040f\u0452\u2018\u2019\u201c\u201d\u2022\u2013\u2014\ufffd\u2122\u0459\u203a\u045a\u045c\u045b\u045f\u00a0\u040e\u045e\u0408\u00a4\u0490\u00a6\u00a7\u0401\u00a9\u0404\u00ab\u00ac\u00ad\u00ae\u0407\u00b0\u00b1\u0406\u0456\u0491\u00b5\u00b6\u00b7\u0451\u2116\u0454\u00bb\u0458\u0405\u0455\u0457\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f", + }, + { + Name: "windows-1252", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\ufffd\u201a\u0192\u201e\u2026\u2020\u2021\u02c6\u2030\u0160\u2039\u0152\ufffd\u017d\ufffd\ufffd\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u02dc\u2122\u0161\u203a\u0153\ufffd\u017e\u0178\u00a0\u00a1\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00ba\u00bb\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u00d0\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u00dd\u00de\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u00f0\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u00fd\u00fe\u00ff", + }, + { + Name: "windows-1253", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\ufffd\u201a\u0192\u201e\u2026\u2020\u2021\ufffd\u2030\ufffd\u2039\ufffd\ufffd\ufffd\ufffd\ufffd\u2018\u2019\u201c\u201d\u2022\u2013\u2014\ufffd\u2122\ufffd\u203a\ufffd\ufffd\ufffd\ufffd\u00a0\u0385\u0386\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\ufffd\u00ab\u00ac\u00ad\u00ae\u2015\u00b0\u00b1\u00b2\u00b3\u0384\u00b5\u00b6\u00b7\u0388\u0389\u038a\u00bb\u038c\u00bd\u038e\u038f\u0390\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\ufffd\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u03ca\u03cb\u03cc\u03cd\u03ce\ufffd", + }, + { + Name: "windows-1254", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\ufffd\u201a\u0192\u201e\u2026\u2020\u2021\u02c6\u2030\u0160\u2039\u0152\ufffd\ufffd\ufffd\ufffd\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u02dc\u2122\u0161\u203a\u0153\ufffd\ufffd\u0178\u00a0\u00a1\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00ba\u00bb\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u011e\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u0130\u015e\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u011f\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u0131\u015f\u00ff", + }, + { + Name: "windows-1255", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\ufffd\u201a\u0192\u201e\u2026\u2020\u2021\u02c6\u2030\ufffd\u2039\ufffd\ufffd\ufffd\ufffd\ufffd\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u02dc\u2122\ufffd\u203a\ufffd\ufffd\ufffd\ufffd\u00a0\u00a1\u00a2\u00a3\u20aa\u00a5\u00a6\u00a7\u00a8\u00a9\u00d7\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00f7\u00bb\u00bc\u00bd\u00be\u00bf\u05b0\u05b1\u05b2\u05b3\u05b4\u05b5\u05b6\u05b7\u05b8\u05b9\ufffd\u05bb\u05bc\u05bd\u05be\u05bf\u05c0\u05c1\u05c2\u05c3\u05f0\u05f1\u05f2\u05f3\u05f4\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\ufffd\ufffd\u200e\u200f\ufffd", + }, + { + Name: "windows-1256", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\u067e\u201a\u0192\u201e\u2026\u2020\u2021\u02c6\u2030\u0679\u2039\u0152\u0686\u0698\u0688\u06af\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u06a9\u2122\u0691\u203a\u0153\u200c\u200d\u06ba\u00a0\u060c\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u06be\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u061b\u00bb\u00bc\u00bd\u00be\u061f\u06c1\u0621\u0622\u0623\u0624\u0625\u0626\u0627\u0628\u0629\u062a\u062b\u062c\u062d\u062e\u062f\u0630\u0631\u0632\u0633\u0634\u0635\u0636\u00d7\u0637\u0638\u0639\u063a\u0640\u0641\u0642\u0643\u00e0\u0644\u00e2\u0645\u0646\u0647\u0648\u00e7\u00e8\u00e9\u00ea\u00eb\u0649\u064a\u00ee\u00ef\u064b\u064c\u064d\u064e\u00f4\u064f\u0650\u00f7\u0651\u00f9\u0652\u00fb\u00fc\u200e\u200f\u06d2", + }, + { + Name: "windows-1257", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\ufffd\u201a\ufffd\u201e\u2026\u2020\u2021\ufffd\u2030\ufffd\u2039\ufffd\u00a8\u02c7\u00b8\ufffd\u2018\u2019\u201c\u201d\u2022\u2013\u2014\ufffd\u2122\ufffd\u203a\ufffd\u00af\u02db\ufffd\u00a0\ufffd\u00a2\u00a3\u00a4\ufffd\u00a6\u00a7\u00d8\u00a9\u0156\u00ab\u00ac\u00ad\u00ae\u00c6\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00f8\u00b9\u0157\u00bb\u00bc\u00bd\u00be\u00e6\u0104\u012e\u0100\u0106\u00c4\u00c5\u0118\u0112\u010c\u00c9\u0179\u0116\u0122\u0136\u012a\u013b\u0160\u0143\u0145\u00d3\u014c\u00d5\u00d6\u00d7\u0172\u0141\u015a\u016a\u00dc\u017b\u017d\u00df\u0105\u012f\u0101\u0107\u00e4\u00e5\u0119\u0113\u010d\u00e9\u017a\u0117\u0123\u0137\u012b\u013c\u0161\u0144\u0146\u00f3\u014d\u00f5\u00f6\u00f7\u0173\u0142\u015b\u016b\u00fc\u017c\u017e\u02d9", + }, + { + Name: "windows-1258", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\ufffd\u201a\u0192\u201e\u2026\u2020\u2021\u02c6\u2030\ufffd\u2039\u0152\ufffd\ufffd\ufffd\ufffd\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u02dc\u2122\ufffd\u203a\u0153\ufffd\ufffd\u0178\u00a0\u00a1\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00ba\u00bb\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u0102\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u0300\u00cd\u00ce\u00cf\u0110\u00d1\u0309\u00d3\u00d4\u01a0\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u01af\u0303\u00df\u00e0\u00e1\u00e2\u0103\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u0301\u00ed\u00ee\u00ef\u0111\u00f1\u0323\u00f3\u00f4\u01a1\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u01b0\u20ab\u00ff", + }, + { + Name: "windows-874", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\ufffd\ufffd\ufffd\ufffd\u2026\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u2018\u2019\u201c\u201d\u2022\u2013\u2014\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u00a0\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07\u0e08\u0e09\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e2f\u0e30\u0e31\u0e32\u0e33\u0e34\u0e35\u0e36\u0e37\u0e38\u0e39\u0e3a\ufffd\ufffd\ufffd\ufffd\u0e3f\u0e40\u0e41\u0e42\u0e43\u0e44\u0e45\u0e46\u0e47\u0e48\u0e49\u0e4a\u0e4b\u0e4c\u0e4d\u0e4e\u0e4f\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0e5a\u0e5b\ufffd\ufffd\ufffd\ufffd", + }, + { + Name: "IBM037", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1\u00a2.<(+|&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df!$*);\u00ac-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4\u00b5~stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae^\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be[]\u00af\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", + Aliases: []string{"cp037", "ebcdic-cp-us", "ebcdic-cp-ca", "ebcdic-cp-wt", "ebcdic-cp-nl", "csIBM037"}, + }, + { + Name: "ibm-273_P100-1995", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2{\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1\u00c4.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec~\u00dc$*);^-/\u00c2[\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00f6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#\u00a7'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4\u00b5\u00dfstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9@\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e4ABCDEFGHI\u00ad\u00f4\u00a6\u00f2\u00f3\u00f5\u00fcJKLMNOPQR\u00b9\u00fb}\u00f9\u00fa\u00ff\u00d6\u00f7STUVWXYZ\u00b2\u00d4\\\u00d2\u00d3\u00d50123456789\u00b3\u00db]\u00d9\u00da\u009f", + Aliases: []string{"ibm-273_P100-1995", "ibm-273", "IBM273", "CP273", "csIBM273", "ebcdic-de", "273"}, + }, + { + Name: "ibm-277_P100-1995", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3}\u00e7\u00f1#.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u00a4\u00c5*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3$\u00c7\u00d1\u00f8,%_>?\u00a6\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:\u00c6\u00d8'=\"@abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba{\u00b8[]\u00b5\u00fcstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e6ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5\u00e5JKLMNOPQR\u00b9\u00fb~\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", + Aliases: []string{"ibm-277_P100-1995", "ibm-277", "IBM277", "cp277", "EBCDIC-CP-DK", "EBCDIC-CP-NO", "csIBM277", "ebcdic-dk", "277"}, + }, + { + Name: "ibm-278_P100-1995", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2{\u00e0\u00e1\u00e3}\u00e7\u00f1\u00a7.<(+!&`\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u00a4\u00c5*);^-/\u00c2#\u00c0\u00c1\u00c3$\u00c7\u00d1\u00f6,%_>?\u00f8\\\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00e9:\u00c4\u00d6'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6]\u00b5\u00fcstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9[\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e4ABCDEFGHI\u00ad\u00f4\u00a6\u00f2\u00f3\u00f5\u00e5JKLMNOPQR\u00b9\u00fb~\u00f9\u00fa\u00ff\u00c9\u00f7STUVWXYZ\u00b2\u00d4@\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", + Aliases: []string{"ibm-278_P100-1995", "ibm-278", "IBM278", "cp278", "ebcdic-cp-fi", "ebcdic-cp-se", "csIBM278", "ebcdic-sv", "278"}, + }, + { + Name: "ibm-280_P100-1995", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4{\u00e1\u00e3\u00e5\\\u00f1\u00b0.<(+!&]\u00ea\u00eb}\u00ed\u00ee\u00ef~\u00df\u00e9$*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00f2,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00f9:\u00a3\u00a7'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1[jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4\u00b5\u00ecstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2#\u00a5\u00b7\u00a9@\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e0ABCDEFGHI\u00ad\u00f4\u00f6\u00a6\u00f3\u00f5\u00e8JKLMNOPQR\u00b9\u00fb\u00fc`\u00fa\u00ff\u00e7\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", + Aliases: []string{"ibm-280_P100-1995", "ibm-280", "IBM280", "CP280", "ebcdic-cp-it", "csIBM280", "280"}, + }, + { + Name: "ibm-284_P100-1995", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00a6[.<(+|&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df]$*);\u00ac-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7#\u00f1,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:\u00d1@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4\u00b5\u00a8stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be^!\u00af~\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", + Aliases: []string{"ibm-284_P100-1995", "ibm-284", "IBM284", "CP284", "ebcdic-cp-es", "csIBM284", "cpibm284", "284"}, + }, + { + Name: "ibm-285_P100-1995", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1$.<(+|&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df!\u00a3*);\u00ac-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4\u00b5\u00afstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2[\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be^]~\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", + Aliases: []string{"ibm-285_P100-1995", "ibm-285", "IBM285", "CP285", "ebcdic-cp-gb", "csIBM285", "cpibm285", "ebcdic-gb", "285"}, + }, + { + Name: "ibm-290_P100-1995", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \uff61\uff62\uff63\uff64\uff65\uff66\uff67\uff68\uff69\u00a3.<(+|&\uff6a\uff6b\uff6c\uff6d\uff6e\uff6f\ufffd\uff70\ufffd!\u00a5*);\u00ac-/abcdefgh\ufffd,%_>?[ijklmnop`:#@'=\"]\uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79\uff7aq\uff7b\uff7c\uff7d\uff7e\uff7f\uff80\uff81\uff82\uff83\uff84\uff85\uff86\uff87\uff88\uff89r\ufffd\uff8a\uff8b\uff8c~\u203e\uff8d\uff8e\uff8f\uff90\uff91\uff92\uff93\uff94\uff95s\uff96\uff97\uff98\uff99^\u00a2\\tuvwxyz\uff9a\uff9b\uff9c\uff9d\uff9e\uff9f{ABCDEFGHI\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd}JKLMNOPQR\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd$\ufffdSTUVWXYZ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0123456789\ufffd\ufffd\ufffd\ufffd\ufffd\u009f", + Aliases: []string{"ibm-290_P100-1995", "ibm-290", "IBM290", "cp290", "EBCDIC-JP-kana", "csIBM290"}, + }, + { + Name: "ibm-297_P100-1995", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4@\u00e1\u00e3\u00e5\\\u00f1\u00b0.<(+!&{\u00ea\u00eb}\u00ed\u00ee\u00ef\u00ec\u00df\u00a7$*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00f9,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00b5:\u00a3\u00e0'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1[jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4`\u00a8stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2#\u00a5\u00b7\u00a9]\u00b6\u00bc\u00bd\u00be\u00ac|\u00af~\u00b4\u00d7\u00e9ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5\u00e8JKLMNOPQR\u00b9\u00fb\u00fc\u00a6\u00fa\u00ff\u00e7\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", + Aliases: []string{"ibm-297_P100-1995", "ibm-297", "IBM297", "cp297", "ebcdic-cp-fr", "csIBM297", "cpibm297", "297"}, + }, + { + Name: "ibm-420_X120-1999", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0651\ufe7d\u0640\u200b\u0621\u0622\ufe82\u0623\u00a2.<(+|&\ufe84\u0624\ufffd\ufffd\u0626\u0627\ufe8e\u0628\ufe91!$*);\u00ac-/\u0629\u062a\ufe97\u062b\ufe9b\u062c\ufe9f\u062d\u00a6,%_>?\ufea3\u062e\ufea7\u062f\u0630\u0631\u0632\u0633\ufeb3\u060c:#@'=\"\u0634abcdefghi\ufeb7\u0635\ufebb\u0636\ufebf\u0637\u0638jklmnopqr\u0639\ufeca\ufecb\ufecc\u063a\ufece\ufecf\u00f7stuvwxyz\ufed0\u0641\ufed3\u0642\ufed7\u0643\ufedb\u0644\ufef5\ufef6\ufef7\ufef8\ufffd\ufffd\ufefb\ufefc\ufedf\u0645\ufee3\u0646\ufee7\u0647\u061bABCDEFGHI\u00ad\ufeeb\ufffd\ufeec\ufffd\u0648\u061fJKLMNOPQR\u0649\ufef0\u064a\ufef2\ufef3\u0660\u00d7\ufffdSTUVWXYZ\u0661\u0662\ufffd\u0663\u0664\u06650123456789\ufffd\u0666\u0667\u0668\u0669\u009f", + Aliases: []string{"ibm-420_X120-1999", "ibm-420", "IBM420", "cp420", "ebcdic-cp-ar1", "csIBM420", "420"}, + }, + { + Name: "IBM424", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u00a2.<(+|&\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1!$*);\u00ac-/\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u00a6,%_>?\ufffd\u05ea\ufffd\ufffd\u00a0\ufffd\ufffd\ufffd\u2017`:#@'=\"\ufffdabcdefghi\u00ab\u00bb\ufffd\ufffd\ufffd\u00b1\u00b0jklmnopqr\ufffd\ufffd\ufffd\u00b8\ufffd\u00a4\u00b5~stuvwxyz\ufffd\ufffd\ufffd\ufffd\ufffd\u00ae^\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be[]\u00af\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\ufffd\ufffd\ufffd\ufffd\ufffd}JKLMNOPQR\u00b9\ufffd\ufffd\ufffd\ufffd\ufffd\\\u00f7STUVWXYZ\u00b2\ufffd\ufffd\ufffd\ufffd\ufffd0123456789\u00b3\ufffd\ufffd\ufffd\ufffd\u009f", + Aliases: []string{"cp424", "ebcdic-cp-he", "csIBM424"}, + }, + { + Name: "IBM437", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u00ec\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00f2\u00fb\u00f9\u00ff\u00d6\u00dc\u00a2\u00a3\u00a5\u20a7\u0192\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u00aa\u00ba\u00bf\u2310\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u00df\u0393\u03c0\u03a3\u03c3\u00b5\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u03c6\u03b5\u2229\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", + Aliases: []string{"cp437", "437", "csPC8CodePage437"}, + }, + { + Name: "IBM500", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1[.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df]$*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4\u00b5~stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", + Aliases: []string{"CP500", "ebcdic-cp-be", "ebcdic-cp-ch", "csIBM500"}, + }, + { + Name: "ibm-720_P100-1997", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\ufffd\ufffd\u00e9\u00e2\ufffd\u00e0\ufffd\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\ufffd\ufffd\ufffd\ufffd\u0651\u0652\u00f4\u00a4\u0640\u00fb\u00f9\u0621\u0622\u0623\u0624\u00a3\u0625\u0626\u0627\u0628\u0629\u062a\u062b\u062c\u062d\u062e\u062f\u0630\u0631\u0632\u0633\u0634\u0635\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u0636\u0637\u0638\u0639\u063a\u0641\u00b5\u0642\u0643\u0644\u0645\u0646\u0647\u0648\u0649\u064a\u2261\u064b\u064c\u064d\u064e\u064f\u0650\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", + Aliases: []string{"ibm-720_P100-1997", "ibm-720", "windows-720", "DOS-720"}, + }, + { + Name: "IBM737", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c3\u03c2\u03c4\u03c5\u03c6\u03c7\u03c8\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03c9\u03ac\u03ad\u03ae\u03ca\u03af\u03cc\u03cd\u03cb\u03ce\u0386\u0388\u0389\u038a\u038c\u038e\u038f\u00b1\u2265\u2264\u03aa\u03ab\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", + Aliases: []string{"cp737", "cp737_DOSGreek"}, + }, + { + Name: "IBM775", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0106\u00fc\u00e9\u0101\u00e4\u0123\u00e5\u0107\u0142\u0113\u0156\u0157\u012b\u0179\u00c4\u00c5\u00c9\u00e6\u00c6\u014d\u00f6\u0122\u00a2\u015a\u015b\u00d6\u00dc\u00f8\u00a3\u00d8\u00d7\u00a4\u0100\u012a\u00f3\u017b\u017c\u017a\u201d\u00a6\u00a9\u00ae\u00ac\u00bd\u00bc\u0141\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u0104\u010c\u0118\u0116\u2563\u2551\u2557\u255d\u012e\u0160\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u0172\u016a\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u017d\u0105\u010d\u0119\u0117\u012f\u0161\u0173\u016b\u017e\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u00d3\u00df\u014c\u0143\u00f5\u00d5\u00b5\u0144\u0136\u0137\u013b\u013c\u0146\u0112\u0145\u2019\u00ad\u00b1\u201c\u00be\u00b6\u00a7\u00f7\u201e\u00b0\u2219\u00b7\u00b9\u00b3\u00b2\u25a0\u00a0", + Aliases: []string{"cp775", "csPC775Baltic"}, + }, + { + Name: "ibm-803_P100-1999", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd$.<(+|\u05d0\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd!\u00a2*);\u00ac-/\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd,%_>?\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd:#@'=\"\ufffd\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdABCDEFGHI\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdJKLMNOPQR\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdSTUVWXYZ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0123456789\ufffd\ufffd\ufffd\ufffd\ufffd\u009f", + Aliases: []string{"ibm-803_P100-1999", "ibm-803", "cp803"}, + }, + { + Name: "ibm-838_P100-1995", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07[\u00a2.<(+|&\u0e48\u0e08\u0e09\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e]!$*);\u00ac-/\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15^\u00a6,%_>?\u0e3f\u0e4e\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c`:#@'=\"\u0e4fabcdefghi\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e5ajklmnopqr\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e5b~stuvwxyz\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0e2f\u0e30\u0e31\u0e32\u0e33\u0e34{ABCDEFGHI\u0e49\u0e35\u0e36\u0e37\u0e38\u0e39}JKLMNOPQR\u0e3a\u0e40\u0e41\u0e42\u0e43\u0e44\\\u0e4aSTUVWXYZ\u0e45\u0e46\u0e47\u0e48\u0e49\u0e4a0123456789\u0e4b\u0e4c\u0e4d\u0e4b\u0e4c\u009f", + Aliases: []string{"ibm-838_P100-1995", "ibm-838", "IBM838", "IBM-Thai", "csIBMThai", "cp838", "838", "ibm-9030"}, + }, + { + Name: "IBM850", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u00ec\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00f2\u00fb\u00f9\u00ff\u00d6\u00dc\u00f8\u00a3\u00d8\u00d7\u0192\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u00aa\u00ba\u00bf\u00ae\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u00c1\u00c2\u00c0\u00a9\u2563\u2551\u2557\u255d\u00a2\u00a5\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u00e3\u00c3\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u00a4\u00f0\u00d0\u00ca\u00cb\u00c8\u0131\u00cd\u00ce\u00cf\u2518\u250c\u2588\u2584\u00a6\u00cc\u2580\u00d3\u00df\u00d4\u00d2\u00f5\u00d5\u00b5\u00fe\u00de\u00da\u00db\u00d9\u00fd\u00dd\u00af\u00b4\u00ad\u00b1\u2017\u00be\u00b6\u00a7\u00f7\u00b8\u00b0\u00a8\u00b7\u00b9\u00b3\u00b2\u25a0\u00a0", + Aliases: []string{"cp850", "850", "csPC850Multilingual"}, + }, + { + Name: "ibm-851_P100-1995", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u0386\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u0388\u00c4\u0389\u038a\ufffd\u038c\u00f4\u00f6\u038e\u00fb\u00f9\u038f\u00d6\u00dc\u03ac\u00a3\u03ad\u03ae\u03af\u03ca\u0390\u03cc\u03cd\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u00bd\u0398\u0399\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u039a\u039b\u039c\u039d\u2563\u2551\u2557\u255d\u039e\u039f\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u03a0\u03a1\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u2518\u250c\u2588\u2584\u03b4\u03b5\u2580\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c3\u03c2\u03c4\u00b4\u00ad\u00b1\u03c5\u03c6\u03c7\u00a7\u03c8\u00b8\u00b0\u00a8\u03c9\u03cb\u03b0\u03ce\u25a0\u00a0", + Aliases: []string{"ibm-851_P100-1995", "ibm-851", "IBM851", "cp851", "851", "csPC851"}, + }, + { + Name: "IBM852", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u00c7\u00fc\u00e9\u00e2\u00e4\u016f\u0107\u00e7\u0142\u00eb\u0150\u0151\u00ee\u0179\u00c4\u0106\u00c9\u0139\u013a\u00f4\u00f6\u013d\u013e\u015a\u015b\u00d6\u00dc\u0164\u0165\u0141\u00d7\u010d\u00e1\u00ed\u00f3\u00fa\u0104\u0105\u017d\u017e\u0118\u0119\u00ac\u017a\u010c\u015f\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u00c1\u00c2\u011a\u015e\u2563\u2551\u2557\u255d\u017b\u017c\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u0102\u0103\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u00a4\u0111\u0110\u010e\u00cb\u010f\u0147\u00cd\u00ce\u011b\u2518\u250c\u2588\u2584\u0162\u016e\u2580\u00d3\u00df\u00d4\u0143\u0144\u0148\u0160\u0161\u0154\u00da\u0155\u0170\u00fd\u00dd\u0163\u00b4\u00ad\u02dd\u02db\u02c7\u02d8\u00a7\u00f7\u00b8\u00b0\u00a8\u02d9\u0171\u0158\u0159\u25a0\u00a0", + Aliases: []string{"cp852", "852", "csPCp852"}, + }, + { + Name: "IBM855", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0452\u0402\u0453\u0403\u0451\u0401\u0454\u0404\u0455\u0405\u0456\u0406\u0457\u0407\u0458\u0408\u0459\u0409\u045a\u040a\u045b\u040b\u045c\u040c\u045e\u040e\u045f\u040f\u044e\u042e\u044a\u042a\u0430\u0410\u0431\u0411\u0446\u0426\u0434\u0414\u0435\u0415\u0444\u0424\u0433\u0413\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u0445\u0425\u0438\u0418\u2563\u2551\u2557\u255d\u0439\u0419\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u043a\u041a\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u00a4\u043b\u041b\u043c\u041c\u043d\u041d\u043e\u041e\u043f\u2518\u250c\u2588\u2584\u041f\u044f\u2580\u042f\u0440\u0420\u0441\u0421\u0442\u0422\u0443\u0423\u0436\u0416\u0432\u0412\u044c\u042c\u2116\u00ad\u044b\u042b\u0437\u0417\u0448\u0428\u044d\u042d\u0449\u0429\u0447\u0427\u00a7\u25a0\u00a0", + Aliases: []string{"cp855", "855", "csIBM855"}, + }, + { + Name: "IBM856", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\ufffd\u00a3\ufffd\u00d7\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u00ae\u00ac\u00bd\u00bc\ufffd\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\ufffd\ufffd\ufffd\u00a9\u2563\u2551\u2557\u255d\u00a2\u00a5\u2510\u2514\u2534\u252c\u251c\u2500\u253c\ufffd\ufffd\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u00a4\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u2518\u250c\u2588\u2584\u00a6\ufffd\u2580\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u00b5\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u00af\u00b4\u00ad\u00b1\u2017\u00be\u00b6\u00a7\u00f7\u00b8\u00b0\u00a8\u00b7\u00b9\u00b3\u00b2\u25a0\u00a0", + Aliases: []string{"cp856", "cp856_Hebrew_PC"}, + }, + { + Name: "ibm-857_P100-1995", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u0131\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00f2\u00fb\u00f9\u0130\u00d6\u00dc\u00f8\u00a3\u00d8\u015e\u015f\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u011e\u011f\u00bf\u00ae\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u00c1\u00c2\u00c0\u00a9\u2563\u2551\u2557\u255d\u00a2\u00a5\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u00e3\u00c3\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u00a4\u00ba\u00aa\u00ca\u00cb\u00c8\ufffd\u00cd\u00ce\u00cf\u2518\u250c\u2588\u2584\u00a6\u00cc\u2580\u00d3\u00df\u00d4\u00d2\u00f5\u00d5\u00b5\ufffd\u00d7\u00da\u00db\u00d9\u00ec\u00ff\u00af\u00b4\u00ad\u00b1\ufffd\u00be\u00b6\u00a7\u00f7\u00b8\u00b0\u00a8\u00b7\u00b9\u00b3\u00b2\u25a0\u00a0", + Aliases: []string{"ibm-857_P100-1995", "ibm-857", "IBM857", "cp857", "857", "csIBM857", "windows-857"}, + }, + { + Name: "ibm-858_P100-1997", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u00ec\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00f2\u00fb\u00f9\u00ff\u00d6\u00dc\u00f8\u00a3\u00d8\u00d7\u0192\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u00aa\u00ba\u00bf\u00ae\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u00c1\u00c2\u00c0\u00a9\u2563\u2551\u2557\u255d\u00a2\u00a5\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u00e3\u00c3\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u00a4\u00f0\u00d0\u00ca\u00cb\u00c8\u20ac\u00cd\u00ce\u00cf\u2518\u250c\u2588\u2584\u00a6\u00cc\u2580\u00d3\u00df\u00d4\u00d2\u00f5\u00d5\u00b5\u00fe\u00de\u00da\u00db\u00d9\u00fd\u00dd\u00af\u00b4\u00ad\u00b1\u2017\u00be\u00b6\u00a7\u00f7\u00b8\u00b0\u00a8\u00b7\u00b9\u00b3\u00b2\u25a0\u00a0", + Aliases: []string{"ibm-858_P100-1997", "ibm-858", "IBM00858", "CCSID00858", "CP00858", "PC-Multilingual-850+euro", "cp858", "windows-858"}, + }, + { + Name: "ibm-860_P100-1995", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u00c7\u00fc\u00e9\u00e2\u00e3\u00e0\u00c1\u00e7\u00ea\u00ca\u00e8\u00cd\u00d4\u00ec\u00c3\u00c2\u00c9\u00c0\u00c8\u00f4\u00f5\u00f2\u00da\u00f9\u00cc\u00d5\u00dc\u00a2\u00a3\u00d9\u20a7\u00d3\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u00aa\u00ba\u00bf\u00d2\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u00df\u0393\u03c0\u03a3\u03c3\u03bc\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u03c6\u03b5\u2229\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", + Aliases: []string{"ibm-860_P100-1995", "ibm-860", "IBM860", "cp860", "860", "csIBM860"}, + }, + { + Name: "ibm-861_P100-1995", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00d0\u00f0\u00de\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00fe\u00fb\u00dd\u00fd\u00d6\u00dc\u00f8\u00a3\u00d8\u20a7\u0192\u00e1\u00ed\u00f3\u00fa\u00c1\u00cd\u00d3\u00da\u00bf\u2310\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u00df\u0393\u03c0\u03a3\u03c3\u03bc\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u03c6\u03b5\u2229\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", + Aliases: []string{"ibm-861_P100-1995", "ibm-861", "IBM861", "cp861", "861", "cp-is", "csIBM861", "windows-861"}, + }, + { + Name: "ibm-862_P100-1995", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\u00a2\u00a3\u00a5\u20a7\u0192\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u00aa\u00ba\u00bf\u2310\u00ac\u00bd\u00bc\u00a1\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u00df\u0393\u03c0\u03a3\u03c3\u03bc\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u03c6\u03b5\u2229\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", + Aliases: []string{"ibm-862_P100-1995", "ibm-862", "IBM862", "cp862", "862", "csPC862LatinHebrew", "DOS-862", "windows-862"}, + }, + { + Name: "ibm-863_P100-1995", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u00c7\u00fc\u00e9\u00e2\u00c2\u00e0\u00b6\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u2017\u00c0\u00a7\u00c9\u00c8\u00ca\u00f4\u00cb\u00cf\u00fb\u00f9\u00a4\u00d4\u00dc\u00a2\u00a3\u00d9\u00db\u0192\u00a6\u00b4\u00f3\u00fa\u00a8\u00b8\u00b3\u00af\u00ce\u2310\u00ac\u00bd\u00bc\u00be\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u00df\u0393\u03c0\u03a3\u03c3\u03bc\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u03c6\u03b5\u2229\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", + Aliases: []string{"ibm-863_P100-1995", "ibm-863", "IBM863", "cp863", "863", "csIBM863"}, + }, + { + Name: "ibm-864_X110-1999", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u00b0\u00b7\u2219\u221a\u2592\u2500\u2502\u253c\u2524\u252c\u251c\u2534\u2510\u250c\u2514\u2518\u03b2\u221e\u03c6\u00b1\u00bd\u00bc\u2248\u00ab\u00bb\ufef7\ufef8\ufffd\ufffd\ufefb\ufefc\u200b\u00a0\u00ad\ufe82\u00a3\u00a4\ufe84\ufffd\ufffd\ufe8e\ufe8f\ufe95\ufe99\u060c\ufe9d\ufea1\ufea5\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\ufed1\u061b\ufeb1\ufeb5\ufeb9\u061f\u00a2\ufe80\ufe81\ufe83\ufe85\ufeca\ufe8b\ufe8d\ufe91\ufe93\ufe97\ufe9b\ufe9f\ufea3\ufea7\ufea9\ufeab\ufead\ufeaf\ufeb3\ufeb7\ufebb\ufebf\ufec3\ufec7\ufecb\ufecf\u00a6\u00ac\u00f7\u00d7\ufec9\u0640\ufed3\ufed7\ufedb\ufedf\ufee3\ufee7\ufeeb\ufeed\ufeef\ufef3\ufebd\ufecc\ufece\ufecd\ufee1\ufe7d\ufe7c\ufee5\ufee9\ufeec\ufef0\ufef2\ufed0\ufed5\ufef5\ufef6\ufedd\ufed9\ufef1\u25a0\ufffd", + Aliases: []string{"ibm-864_X110-1999", "ibm-864", "IBM864", "cp864", "csIBM864"}, + }, + { + Name: "ibm-865_P100-1995", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u00c7\u00fc\u00e9\u00e2\u00e4\u00e0\u00e5\u00e7\u00ea\u00eb\u00e8\u00ef\u00ee\u00ec\u00c4\u00c5\u00c9\u00e6\u00c6\u00f4\u00f6\u00f2\u00fb\u00f9\u00ff\u00d6\u00dc\u00f8\u00a3\u00d8\u20a7\u0192\u00e1\u00ed\u00f3\u00fa\u00f1\u00d1\u00aa\u00ba\u00bf\u2310\u00ac\u00bd\u00bc\u00a1\u00ab\u00a4\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u00df\u0393\u03c0\u03a3\u03c3\u03bc\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u03c6\u03b5\u2229\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", + Aliases: []string{"ibm-865_P100-1995", "ibm-865", "IBM865", "cp865", "865", "csIBM865"}, + }, + { + Name: "IBM866", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u0401\u0451\u0404\u0454\u0407\u0457\u040e\u045e\u00b0\u2219\u00b7\u221a\u2116\u00a4\u25a0\u00a0", + Aliases: []string{"cp866", "866", "csIBM866"}, + }, + { + Name: "ibm-867_P100-1998", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\u00a2\u00a3\u00a5\ufffd\u20aa\u200e\u200f\u202a\u202b\u202d\u202e\u202c\ufffd\ufffd\u2310\u00ac\u00bd\u00bc\u20ac\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u03b1\u00df\u0393\u03c0\u03a3\u03c3\u03bc\u03c4\u03a6\u0398\u03a9\u03b4\u221e\u03c6\u03b5\u2229\u2261\u00b1\u2265\u2264\u2320\u2321\u00f7\u2248\u00b0\u2219\u00b7\u221a\u207f\u00b2\u25a0\u00a0", + Aliases: []string{"ibm-867_P100-1998", "ibm-867"}, + }, + { + Name: "ibm-868_P100-1995", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u060c\u061b\u061f\ufe81\ufe8d\ufe8e\uf8fb\ufe8f\ufe91\ufb56\ufb58\ufe93\ufe95\ufe97\ufb66\ufb68\ufe99\ufe9b\ufe9d\ufe9f\ufb7a\ufb7c\ufea1\ufea3\ufea5\ufea7\ufea9\ufb88\ufeab\ufead\ufb8c\ufeaf\ufb8a\ufeb1\ufeb3\ufeb5\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\ufeb7\ufeb9\ufebb\ufebd\u2563\u2551\u2557\u255d\ufebf\ufec3\u2510\u2514\u2534\u252c\u251c\u2500\u253c\ufec7\ufec9\u255a\u2554\u2569\u2566\u2560\u2550\u256c\ufeca\ufecb\ufecc\ufecd\ufece\ufecf\ufed0\ufed1\ufed3\ufed5\u2518\u250c\u2588\u2584\ufed7\ufb8e\u2580\ufedb\ufb92\ufb94\ufedd\ufedf\ufee0\ufee1\ufee3\ufb9e\ufee5\ufee7\ufe85\ufeed\ufba6\ufba8\ufba9\u00ad\ufbaa\ufe80\ufe89\ufe8a\ufe8b\ufbfc\ufbfd\ufbfe\ufbb0\ufbae\ufe7c\ufe7d\ufffd\u25a0\u00a0", + Aliases: []string{"ibm-868_P100-1995", "ibm-868", "IBM868", "CP868", "868", "csIBM868", "cp-ar"}, + }, + { + Name: "ibm-869_P100-1995", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0386\ufffd\u0387\u00ac\u00a6\u2018\u2019\u0388\u2015\u0389\u038a\u03aa\u038c\ufffd\ufffd\u038e\u03ab\u00a9\u038f\u00b2\u00b3\u03ac\u00a3\u03ad\u03ae\u03af\u03ca\u0390\u03cc\u03cd\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u00bd\u0398\u0399\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\u039a\u039b\u039c\u039d\u2563\u2551\u2557\u255d\u039e\u039f\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u03a0\u03a1\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03b1\u03b2\u03b3\u2518\u250c\u2588\u2584\u03b4\u03b5\u2580\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c3\u03c2\u03c4\u00b4\u00ad\u00b1\u03c5\u03c6\u03c7\u00a7\u03c8\u0385\u00b0\u00a8\u03c9\u03cb\u03b0\u03ce\u25a0\u00a0", + Aliases: []string{"ibm-869_P100-1995", "ibm-869", "IBM869", "cp869", "869", "cp-gr", "csIBM869", "windows-869"}, + }, + { + Name: "ibm-870_P100-1995", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u0163\u00e1\u0103\u010d\u00e7\u0107[.<(+!&\u00e9\u0119\u00eb\u016f\u00ed\u00ee\u013e\u013a\u00df]$*);^-/\u00c2\u00c4\u02dd\u00c1\u0102\u010c\u00c7\u0106|,%_>?\u02c7\u00c9\u0118\u00cb\u016e\u00cd\u00ce\u013d\u0139`:#@'=\"\u02d8abcdefghi\u015b\u0148\u0111\u00fd\u0159\u015f\u00b0jklmnopqr\u0142\u0144\u0161\u00b8\u02db\u00a4\u0105~stuvwxyz\u015a\u0147\u0110\u00dd\u0158\u015e\u02d9\u0104\u017c\u0162\u017b\u00a7\u017e\u017a\u017d\u0179\u0141\u0143\u0160\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u0155\u00f3\u0151}JKLMNOPQR\u011a\u0171\u00fc\u0165\u00fa\u011b\\\u00f7STUVWXYZ\u010f\u00d4\u00d6\u0154\u00d3\u01500123456789\u010e\u0170\u00dc\u0164\u00da\u009f", + Aliases: []string{"ibm-870_P100-1995", "ibm-870", "IBM870", "CP870", "ebcdic-cp-roece", "ebcdic-cp-yu", "csIBM870"}, + }, + { + Name: "ibm-871_P100-1995", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1\u00de.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u00c6$*);\u00d6-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00f0:#\u00d0'=\"\u00d8abcdefghi\u00ab\u00bb`\u00fd{\u00b1\u00b0jklmnopqr\u00aa\u00ba}\u00b8]\u00a4\u00b5\u00f6stuvwxyz\u00a1\u00bf@\u00dd[\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\\\u00d7\u00feABCDEFGHI\u00ad\u00f4~\u00f2\u00f3\u00f5\u00e6JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\u00b4\u00f7STUVWXYZ\u00b2\u00d4^\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", + Aliases: []string{"ibm-871_P100-1995", "ibm-871", "IBM871", "ebcdic-cp-is", "csIBM871", "CP871", "ebcdic-is", "871"}, + }, + { + Name: "ibm-874_P100-1995", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0e48\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07\u0e08\u0e09\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e2f\u0e30\u0e31\u0e32\u0e33\u0e34\u0e35\u0e36\u0e37\u0e38\u0e39\u0e3a\u0e49\u0e4a\u0e4b\u0e4c\u0e3f\u0e40\u0e41\u0e42\u0e43\u0e44\u0e45\u0e46\u0e47\u0e48\u0e49\u0e4a\u0e4b\u0e4c\u0e4d\u0e4e\u0e4f\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0e5a\u0e5b\u00a2\u00ac\u00a6\u00a0", + Aliases: []string{"ibm-874_P100-1995", "ibm-874", "ibm-9066", "cp874", "tis620.2533", "eucTH"}, + }, + { + Name: "ibm-875_P100-1995", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399[.<(+!&\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3]$*);^-/\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab|,%_>?\u00a8\u0386\u0388\u0389\u00a0\u038a\u038c\u038e\u038f`:#@'=\"\u0385abcdefghi\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u00b0jklmnopqr\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u00b4~stuvwxyz\u03bd\u03be\u03bf\u03c0\u03c1\u03c3\u00a3\u03ac\u03ad\u03ae\u03ca\u03af\u03cc\u03cd\u03cb\u03ce\u03c2\u03c4\u03c5\u03c6\u03c7\u03c8{ABCDEFGHI\u00ad\u03c9\u0390\u03b0\u2018\u2015}JKLMNOPQR\u00b1\u00bd\ufffd\u0387\u2019\u00a6\\\ufffdSTUVWXYZ\u00b2\u00a7\ufffd\ufffd\u00ab\u00ac0123456789\u00b3\u00a9\ufffd\ufffd\u00bb\u009f", + Aliases: []string{"ibm-875_P100-1995", "ibm-875", "IBM875", "cp875", "875"}, + }, + { + Name: "ibm-901_P100-1999", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u201d\u00a2\u00a3\u20ac\u201e\u00a6\u00a7\u00d8\u00a9\u0156\u00ab\u00ac\u00ad\u00ae\u00c6\u00b0\u00b1\u00b2\u00b3\u201c\u00b5\u00b6\u00b7\u00f8\u00b9\u0157\u00bb\u00bc\u00bd\u00be\u00e6\u0104\u012e\u0100\u0106\u00c4\u00c5\u0118\u0112\u010c\u00c9\u0179\u0116\u0122\u0136\u012a\u013b\u0160\u0143\u0145\u00d3\u014c\u00d5\u00d6\u00d7\u0172\u0141\u015a\u016a\u00dc\u017b\u017d\u00df\u0105\u012f\u0101\u0107\u00e4\u00e5\u0119\u0113\u010d\u00e9\u017a\u0117\u0123\u0137\u012b\u013c\u0161\u0144\u0146\u00f3\u014d\u00f5\u00f6\u00f7\u0173\u0142\u015b\u016b\u00fc\u017c\u017e\u2019", + Aliases: []string{"ibm-901_P100-1999", "ibm-901"}, + }, + { + Name: "ibm-902_P100-1999", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u00a1\u00a2\u00a3\u20ac\u00a5\u00a6\u00a7\u00a8\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00ba\u00bb\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u0160\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u00dd\u017d\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u0161\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u00fd\u017e\u00ff", + Aliases: []string{"ibm-902_P100-1999", "ibm-902"}, + }, + { + Name: "ibm-916_P100-1995", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\ufffd\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u00d7\u00ab\u00ac\u00ad\u00ae\u203e\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u2022\u00b8\u00b9\u00f7\u00bb\u00bc\u00bd\u00be\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u2017\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\ufffd\ufffd\ufffd\ufffd\ufffd", + Aliases: []string{"ibm-916_P100-1995", "ibm-916", "cp916", "916"}, + }, + { + Name: "ibm-918_P100-1995", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u060c\u061b\u061f\ufe81\ufe8d\ufe8e\uf8fb\ufe8f[.<(+!&\ufe91\ufb56\ufb58\ufe93\ufe95\ufe97\ufb66\ufb68\ufe99]$*);^-/\ufe9b\ufe9d\ufe9f\ufb7a\ufb7c\ufea1\ufea3\ufea5`,%_>?\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9:#@'=\"\ufea7abcdefghi\ufea9\ufb88\ufeab\ufead\ufb8c\ufeaf\ufb8ajklmnopqr\ufeb1\ufeb3\ufeb5\ufeb7\ufeb9\ufebb\ufebd~stuvwxyz\ufebf\ufec3\ufec7\ufec9\ufeca\ufecb\ufecc\ufecd\ufece\ufecf\ufed0\ufed1\ufed3\ufed5\ufed7\ufb8e\ufedb|\ufb92\ufb94\ufedd\ufedf{ABCDEFGHI\u00ad\ufee0\ufee1\ufee3\ufb9e\ufee5}JKLMNOPQR\ufee7\ufe85\ufeed\ufba6\ufba8\ufba9\\\ufbaaSTUVWXYZ\ufe80\ufe89\ufe8a\ufe8b\ufbfc\ufbfd0123456789\ufbfe\ufbb0\ufbae\ufe7c\ufe7d\u009f", + Aliases: []string{"ibm-918_P100-1995", "ibm-918", "IBM918", "CP918", "ebcdic-cp-ar2", "csIBM918"}, + }, + { + Name: "ibm-922_P100-1999", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u00a1\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u00a8\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u00b4\u00b5\u00b6\u00b7\u00b8\u00b9\u00ba\u00bb\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u00c3\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u00cc\u00cd\u00ce\u00cf\u0160\u00d1\u00d2\u00d3\u00d4\u00d5\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u00dd\u017d\u00df\u00e0\u00e1\u00e2\u00e3\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u00ec\u00ed\u00ee\u00ef\u0161\u00f1\u00f2\u00f3\u00f4\u00f5\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u00fd\u017e\u00ff", + Aliases: []string{"ibm-922_P100-1999", "ibm-922", "IBM922", "cp922", "922"}, + }, + { + Name: "ibm-1006_P100-1995", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u060c\u061b\u00ad\u061f\ufe81\ufe8d\ufe8e\uf8fb\ufe8f\ufe91\ufb56\ufb58\ufe93\ufe95\ufe97\ufb66\ufb68\ufe99\ufe9b\ufe9d\ufe9f\ufb7a\ufb7c\ufea1\ufea3\ufea5\ufea7\ufea9\ufb88\ufeab\ufead\ufb8c\ufeaf\ufb8a\ufeb1\ufeb3\ufeb5\ufeb7\ufeb9\ufebb\ufebd\ufebf\ufec3\ufec7\ufec9\ufeca\ufecb\ufecc\ufecd\ufece\ufecf\ufed0\ufed1\ufed3\ufed5\ufed7\ufb8e\ufedb\ufb92\ufb94\ufedd\ufedf\ufee0\ufee1\ufee3\ufb9e\ufee5\ufee7\ufe85\ufeed\ufba6\ufba8\ufba9\ufbaa\ufe80\ufe89\ufe8a\ufe8b\ufbfc\ufbfd\ufbfe\ufbb0\ufbae\ufe7c\ufe7d", + Aliases: []string{"ibm-1006_P100-1995", "ibm-1006", "IBM1006", "cp1006", "1006"}, + }, + { + Name: "ibm-1025_P100-1995", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0452\u0453\u0451\u0454\u0455\u0456\u0457\u0458[.<(+!&\u0459\u045a\u045b\u045c\u045e\u045f\u042a\u2116\u0402]$*);^-/\u0403\u0401\u0404\u0405\u0406\u0407\u0408\u0409|,%_>?\u040a\u040b\u040c\u00ad\u040e\u040f\u044e\u0430\u0431`:#@'=\"\u0446abcdefghi\u0434\u0435\u0444\u0433\u0445\u0438\u0439jklmnopqr\u043a\u043b\u043c\u043d\u043e\u043f\u044f~stuvwxyz\u0440\u0441\u0442\u0443\u0436\u0432\u044c\u044b\u0437\u0448\u044d\u0449\u0447\u044a\u042e\u0410\u0411\u0426\u0414\u0415\u0424\u0413{ABCDEFGHI\u0425\u0418\u0419\u041a\u041b\u041c}JKLMNOPQR\u041d\u041e\u041f\u042f\u0420\u0421\\\u00a7STUVWXYZ\u0422\u0423\u0416\u0412\u042c\u042b0123456789\u0417\u0428\u042d\u0429\u0427\u009f", + Aliases: []string{"ibm-1025_P100-1995", "ibm-1025", "cp1025", "1025"}, + }, + { + Name: "ibm-1026_P100-1995", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5{\u00f1\u00c7.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u011e\u0130*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5[\u00d1\u015f,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u0131:\u00d6\u015e'=\u00dc\u00d8abcdefghi\u00ab\u00bb}`\u00a6\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4\u00b5\u00f6stuvwxyz\u00a1\u00bf]$@\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e7ABCDEFGHI\u00ad\u00f4~\u00f2\u00f3\u00f5\u011fJKLMNOPQR\u00b9\u00fb\\\u00f9\u00fa\u00ff\u00fc\u00f7STUVWXYZ\u00b2\u00d4#\u00d2\u00d3\u00d50123456789\u00b3\u00db\"\u00d9\u00da\u009f", + Aliases: []string{"ibm-1026_P100-1995", "ibm-1026", "IBM1026", "CP1026", "csIBM1026", "1026"}, + }, + { + Name: "ibm-1047_P100-1995", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1\u00a2.<(+|&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df!$*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u00a4\u00b5~stuvwxyz\u00a1\u00bf\u00d0[\u00de\u00ae\u00ac\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00dd\u00a8\u00af]\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", + Aliases: []string{"ibm-1047_P100-1995", "ibm-1047", "IBM1047", "cp1047", "1047"}, + }, + { + Name: "ibm-1097_P100-1995", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u060c\u064b\ufe81\ufe82\uf8fa\ufe8d\ufe8e\uf8fb\u00a4.<(+|&\ufe80\ufe83\ufe84\uf8f9\ufe85\ufe8b\ufe8f\ufe91\ufb56!$*);\u00ac-/\ufb58\ufe95\ufe97\ufe99\ufe9b\ufe9d\ufe9f\ufb7a\u061b,%_>?\ufb7c\ufea1\ufea3\ufea5\ufea7\ufea9\ufeab\ufead\ufeaf`:#@'=\"\ufb8aabcdefghi\u00ab\u00bb\ufeb1\ufeb3\ufeb5\ufeb7\ufeb9jklmnopqr\ufebb\ufebd\ufebf\ufec1\ufec3\ufec5\ufec7~stuvwxyz\ufec9\ufeca\ufecb\ufecc\ufecd\ufece\ufecf\ufed0\ufed1\ufed3\ufed5\ufed7\ufb8e\ufedb\ufb92\ufb94[]\ufedd\ufedf\ufee1\u00d7{ABCDEFGHI\u00ad\ufee3\ufee5\ufee7\ufeed\ufee9}JKLMNOPQR\ufeeb\ufeec\ufba4\ufbfc\ufbfd\ufbfe\\\u061fSTUVWXYZ\u0640\u06f0\u06f1\u06f2\u06f3\u06f40123456789\u06f5\u06f6\u06f7\u06f8\u06f9\u009f", + Aliases: []string{"ibm-1097_P100-1995", "ibm-1097", "cp1097", "1097"}, + }, + { + Name: "ibm-1098_P100-1995", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\ufffd\ufffd\u060c\u061b\u061f\u064b\ufe81\ufe82\uf8fa\ufe8d\ufe8e\uf8fb\ufe80\ufe83\ufe84\uf8f9\ufe85\ufe8b\ufe8f\ufe91\ufb56\ufb58\ufe95\ufe97\ufe99\ufe9b\ufe9d\ufe9f\ufb7a\ufb7c\u00d7\ufea1\ufea3\ufea5\ufea7\ufea9\ufeab\ufead\ufeaf\ufb8a\ufeb1\ufeb3\ufeb5\ufeb7\ufeb9\ufebb\u00ab\u00bb\u2591\u2592\u2593\u2502\u2524\ufebd\ufebf\ufec1\ufec3\u2563\u2551\u2557\u255d\u00a4\ufec5\u2510\u2514\u2534\u252c\u251c\u2500\u253c\ufec7\ufec9\u255a\u2554\u2569\u2566\u2560\u2550\u256c\ufffd\ufeca\ufecb\ufecc\ufecd\ufece\ufecf\ufed0\ufed1\ufed3\u2518\u250c\u2588\u2584\ufed5\ufed7\u2580\ufb8e\ufedb\ufb92\ufb94\ufedd\ufedf\ufee1\ufee3\ufee5\ufee7\ufeed\ufee9\ufeeb\ufeec\ufba4\ufbfc\u00ad\ufbfd\ufbfe\u0640\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u25a0\u00a0", + Aliases: []string{"ibm-1098_P100-1995", "ibm-1098", "IBM1098", "cp1098", "1098"}, + }, + { + Name: "ibm-1112_P100-1995", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0161\u00e4\u0105\u012f\u016b\u00e5\u0113\u017e\u00a2.<(+|&\u00e9\u0119\u0117\u010d\u0173\u201e\u201c\u0123\u00df!$*);\u00ac-/\u0160\u00c4\u0104\u012e\u016a\u00c5\u0112\u017d\u00a6,%_>?\u00f8\u00c9\u0118\u0116\u010c\u0172\u012a\u013b\u0122`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u0101\u017c\u0144\u00b1\u00b0jklmnopqr\u0156\u0157\u00e6\u0137\u00c6\u00a4\u00b5~stuvwxyz\u201d\u017a\u0100\u017b\u0143\u00ae^\u00a3\u012b\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be[]\u0179\u0136\u013c\u00d7{ABCDEFGHI\u00ad\u014d\u00f6\u0146\u00f3\u00f5}JKLMNOPQR\u00b9\u0107\u00fc\u0142\u015b\u2019\\\u00f7STUVWXYZ\u00b2\u014c\u00d6\u0145\u00d3\u00d50123456789\u00b3\u0106\u00dc\u0141\u015a\u009f", + Aliases: []string{"ibm-1112_P100-1995", "ibm-1112", "cp1112", "1112"}, + }, + { + Name: "ibm-1122_P100-1999", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2{\u00e0\u00e1\u00e3}\u00e7\u00f1\u00a7.<(+!&`\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u00a4\u00c5*);^-/\u00c2#\u00c0\u00c1\u00c3$\u00c7\u00d1\u00f6,%_>?\u00f8\\\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00e9:\u00c4\u00d6'=\"\u00d8abcdefghi\u00ab\u00bb\u0161\u00fd\u017e\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6]\u00b5\u00fcstuvwxyz\u00a1\u00bf\u0160\u00dd\u017d\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9[\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e4ABCDEFGHI\u00ad\u00f4\u00a6\u00f2\u00f3\u00f5\u00e5JKLMNOPQR\u00b9\u00fb~\u00f9\u00fa\u00ff\u00c9\u00f7STUVWXYZ\u00b2\u00d4@\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", + Aliases: []string{"ibm-1122_P100-1999", "ibm-1122", "cp1122", "1122"}, + }, + { + Name: "ibm-1123_P100-1995", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0452\u0491\u0451\u0454\u0455\u0456\u0457\u0458[.<(+!&\u0459\u045a\u045b\u045c\u045e\u045f\u042a\u2116\u0402]$*);^-/\u0490\u0401\u0404\u0405\u0406\u0407\u0408\u0409|,%_>?\u040a\u040b\u040c\u00ad\u040e\u040f\u044e\u0430\u0431`:#@'=\"\u0446abcdefghi\u0434\u0435\u0444\u0433\u0445\u0438\u0439jklmnopqr\u043a\u043b\u043c\u043d\u043e\u043f\u044f~stuvwxyz\u0440\u0441\u0442\u0443\u0436\u0432\u044c\u044b\u0437\u0448\u044d\u0449\u0447\u044a\u042e\u0410\u0411\u0426\u0414\u0415\u0424\u0413{ABCDEFGHI\u0425\u0418\u0419\u041a\u041b\u041c}JKLMNOPQR\u041d\u041e\u041f\u042f\u0420\u0421\\\u00a7STUVWXYZ\u0422\u0423\u0416\u0412\u042c\u042b0123456789\u0417\u0428\u042d\u0429\u0427\u009f", + Aliases: []string{"ibm-1123_P100-1995", "ibm-1123", "cp1123", "1123"}, + }, + { + Name: "ibm-1124_P100-1996", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0401\u0402\u0490\u0404\u0405\u0406\u0407\u0408\u0409\u040a\u040b\u040c\u00ad\u040e\u040f\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u2116\u0451\u0452\u0491\u0454\u0455\u0456\u0457\u0458\u0459\u045a\u045b\u045c\u00a7\u045e\u045f", + Aliases: []string{"ibm-1124_P100-1996", "ibm-1124", "cp1124", "1124"}, + }, + { + Name: "ibm-1125_P100-1997", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u0401\u0451\u0490\u0491\u0404\u0454\u0406\u0456\u0407\u0457\u00f7\u00b1\u2116\u00a4\u25a0\u00a0", + Aliases: []string{"ibm-1125_P100-1997", "ibm-1125", "cp1125"}, + }, + { + Name: "ibm-1129_P100-1997", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u00a1\u00a2\u00a3\u00a4\u00a5\u00a6\u00a7\u0153\u00a9\u00aa\u00ab\u00ac\u00ad\u00ae\u00af\u00b0\u00b1\u00b2\u00b3\u0178\u00b5\u00b6\u00b7\u0152\u00b9\u00ba\u00bb\u00bc\u00bd\u00be\u00bf\u00c0\u00c1\u00c2\u0102\u00c4\u00c5\u00c6\u00c7\u00c8\u00c9\u00ca\u00cb\u0300\u00cd\u00ce\u00cf\u0110\u00d1\u0309\u00d3\u00d4\u01a0\u00d6\u00d7\u00d8\u00d9\u00da\u00db\u00dc\u01af\u0303\u00df\u00e0\u00e1\u00e2\u0103\u00e4\u00e5\u00e6\u00e7\u00e8\u00e9\u00ea\u00eb\u0301\u00ed\u00ee\u00ef\u0111\u00f1\u0323\u00f3\u00f4\u01a1\u00f6\u00f7\u00f8\u00f9\u00fa\u00fb\u00fc\u01b0\u20ab\u00ff", + Aliases: []string{"ibm-1129_P100-1997", "ibm-1129"}, + }, + { + Name: "ibm-1130_P100-1997", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u0103\u00e5\u00e7\u00f1[.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u0303\u00df]$*);^-/\u00c2\u00c4\u00c0\u00c1\u0102\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u20ab`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u0111\u0309\u0300\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u0152\u00c6\u00a4\u00b5~stuvwxyz\u00a1\u00bf\u0110\u0323\u0301\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u0153\u0178\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u01b0\u00f3\u01a1}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u01af\u00d3\u01a00123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", + Aliases: []string{"ibm-1130_P100-1997", "ibm-1130"}, + }, + { + Name: "ibm-1131_P100-1997", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1c\x1b\x7f\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x1a\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255d\u255c\u255b\u2510\u2514\u2534\u252c\u251c\u2500\u253c\u255e\u255f\u255a\u2554\u2569\u2566\u2560\u2550\u256c\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256b\u256a\u2518\u250c\u2588\u2584\u258c\u2590\u2580\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\u0401\u0451\u0404\u0454\u0407\u0457\u040e\u045e\u0406\u0456\u00b7\u00a4\u0490\u0491\u2219\u00a0", + Aliases: []string{"ibm-1131_P100-1997", "ibm-1131", "cp1131"}, + }, + { + Name: "ibm-1132_P100-1998", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0e81\u0e82\u0e84\u0e87\u0e88\u0eaa\u0e8a[\u00a2.<(+|&\ufffd\u0e8d\u0e94\u0e95\u0e96\u0e97\u0e99\u0e9a]!$*);\u00ac-/\u0e9b\u0e9c\u0e9d\u0e9e\u0e9f\u0ea1\u0ea2^\u00a6,%_>?\u20ad\ufffd\u0ea3\u0ea5\u0ea7\u0eab\u0ead\u0eae\ufffd`:#@'=\"\ufffdabcdefghi\ufffd\ufffd\u0eaf\u0eb0\u0eb2\u0eb3\ufffdjklmnopqr\u0eb4\u0eb5\u0eb6\u0eb7\u0eb8\u0eb9\ufffd~stuvwxyz\u0ebc\u0eb1\u0ebb\u0ebd\ufffd\ufffd\u0ed0\u0ed1\u0ed2\u0ed3\u0ed4\u0ed5\u0ed6\u0ed7\u0ed8\u0ed9\ufffd\u0ec0\u0ec1\u0ec2\u0ec3\u0ec4{ABCDEFGHI\ufffd\u0ec8\u0ec9\u0eca\u0ecb\u0ecc}JKLMNOPQR\u0ecd\u0ec6\ufffd\u0edc\u0edd\ufffd\\\ufffdSTUVWXYZ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0123456789\ufffd\ufffd\ufffd\ufffd\ufffd\u009f", + Aliases: []string{"ibm-1132_P100-1998", "ibm-1132"}, + }, + { + Name: "ibm-1133_P100-1997", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\ufffd\u0e81\u0e82\u0e84\u0e87\u0e88\u0eaa\u0e8a\u0e8d\u0e94\u0e95\u0e96\u0e97\u0e99\u0e9a\u0e9b\u0e9c\u0e9d\u0e9e\u0e9f\u0ea1\u0ea2\u0ea3\u0ea5\u0ea7\u0eab\u0ead\u0eae\ufffd\ufffd\ufffd\u0eaf\u0eb0\u0eb2\u0eb3\u0eb4\u0eb5\u0eb6\u0eb7\u0eb8\u0eb9\u0ebc\u0eb1\u0ebb\u0ebd\ufffd\ufffd\ufffd\u0ec0\u0ec1\u0ec2\u0ec3\u0ec4\u0ec8\u0ec9\u0eca\u0ecb\u0ecc\u0ecd\u0ec6\ufffd\u0edc\u0eddk\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u0ed0\u0ed1\u0ed2\u0ed3\u0ed4\u0ed5\u0ed6\u0ed7\u0ed8\u0ed9\ufffd\ufffd\u00a2\u00ac\u00a6\u00a0", + Aliases: []string{"ibm-1133_P100-1997", "ibm-1133"}, + }, + { + Name: "ibm-1137_P100-1999", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0901\u0902\u0903\u0905\u0906\u0907\u0908\u0909\u090a.<(+|&\u090b\u090c\u090d\u090e\u090f\u0910\u0911\u0912\u0913!$*);^-/\u0914\u0915\u0916\u0917\u0918\u0919\u091a\u091b\u091c,%_>?\u091d\u091e\u091f\u0920\u0921\u0922\u0923\u0924\u0925`:#@'=\"\u0926abcdefghi\u0927\u0928\u092a\u092b\u092c\u092d\u092ejklmnopqr\u092f\u0930\u0932\u0933\u0935\u0936\u200c~stuvwxyz\u0937\u0938\u0939[\u093c\u093d\u093e\u093f\u0940\u0941\u0942\u0943\u0944\u0945\u0946\u0947\u0948\u0949\u094a]\u094b\u094c{ABCDEFGHI\u094d\u0950\u0951\u0952\ufffd\ufffd}JKLMNOPQR\u0960\u0961\u0962\u0963\u0964\u0965\\\u200dSTUVWXYZ\u0966\u0967\u0968\u0969\u096a\u096b0123456789\u096c\u096d\u096e\u096f\u0970\u009f", + Aliases: []string{"ibm-1137_P100-1999", "ibm-1137"}, + }, + { + Name: "ibm-1140_P100-1997", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1\u00a2.<(+|&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df!$*);\u00ac-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac\u00b5~stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae^\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be[]\u00af\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", + Aliases: []string{"ibm-1140_P100-1997", "ibm-1140", "IBM01140", "CCSID01140", "CP01140", "cp1140", "ebcdic-us-37+euro"}, + }, + { + Name: "ibm-1141_P100-1997", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2{\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1\u00c4.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec~\u00dc$*);^-/\u00c2[\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00f6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#\u00a7'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac\u00b5\u00dfstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9@\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e4ABCDEFGHI\u00ad\u00f4\u00a6\u00f2\u00f3\u00f5\u00fcJKLMNOPQR\u00b9\u00fb}\u00f9\u00fa\u00ff\u00d6\u00f7STUVWXYZ\u00b2\u00d4\\\u00d2\u00d3\u00d50123456789\u00b3\u00db]\u00d9\u00da\u009f", + Aliases: []string{"ibm-1141_P100-1997", "ibm-1141", "IBM01141", "CCSID01141", "CP01141", "cp1141", "ebcdic-de-273+euro"}, + }, + { + Name: "ibm-1142_P100-1997", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3}\u00e7\u00f1#.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u20ac\u00c5*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3$\u00c7\u00d1\u00f8,%_>?\u00a6\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:\u00c6\u00d8'=\"@abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba{\u00b8[]\u00b5\u00fcstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e6ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5\u00e5JKLMNOPQR\u00b9\u00fb~\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", + Aliases: []string{"ibm-1142_P100-1997", "ibm-1142", "IBM01142", "CCSID01142", "CP01142", "cp1142", "ebcdic-dk-277+euro", "ebcdic-no-277+euro"}, + }, + { + Name: "ibm-1143_P100-1997", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2{\u00e0\u00e1\u00e3}\u00e7\u00f1\u00a7.<(+!&`\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u20ac\u00c5*);^-/\u00c2#\u00c0\u00c1\u00c3$\u00c7\u00d1\u00f6,%_>?\u00f8\\\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00e9:\u00c4\u00d6'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6]\u00b5\u00fcstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9[\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e4ABCDEFGHI\u00ad\u00f4\u00a6\u00f2\u00f3\u00f5\u00e5JKLMNOPQR\u00b9\u00fb~\u00f9\u00fa\u00ff\u00c9\u00f7STUVWXYZ\u00b2\u00d4@\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", + Aliases: []string{"ibm-1143_P100-1997", "ibm-1143", "IBM01143", "CCSID01143", "CP01143", "cp1143", "ebcdic-fi-278+euro", "ebcdic-se-278+euro"}, + }, + { + Name: "ibm-1144_P100-1997", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4{\u00e1\u00e3\u00e5\\\u00f1\u00b0.<(+!&]\u00ea\u00eb}\u00ed\u00ee\u00ef~\u00df\u00e9$*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00f2,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00f9:\u00a3\u00a7'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1[jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac\u00b5\u00ecstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2#\u00a5\u00b7\u00a9@\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e0ABCDEFGHI\u00ad\u00f4\u00f6\u00a6\u00f3\u00f5\u00e8JKLMNOPQR\u00b9\u00fb\u00fc`\u00fa\u00ff\u00e7\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", + Aliases: []string{"ibm-1144_P100-1997", "ibm-1144", "IBM01144", "CCSID01144", "CP01144", "cp1144", "ebcdic-it-280+euro"}, + }, + { + Name: "ibm-1145_P100-1997", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00a6[.<(+|&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df]$*);\u00ac-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7#\u00f1,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:\u00d1@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac\u00b5\u00a8stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be^!\u00af~\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", + Aliases: []string{"ibm-1145_P100-1997", "ibm-1145", "IBM01145", "CCSID01145", "CP01145", "cp1145", "ebcdic-es-284+euro"}, + }, + { + Name: "ibm-1146_P100-1997", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1$.<(+|&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df!\u00a3*);\u00ac-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac\u00b5\u00afstuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2[\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be^]~\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", + Aliases: []string{"ibm-1146_P100-1997", "ibm-1146", "IBM01146", "CCSID01146", "CP01146", "cp1146", "ebcdic-gb-285+euro"}, + }, + { + Name: "ibm-1147_P100-1997", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4@\u00e1\u00e3\u00e5\\\u00f1\u00b0.<(+!&{\u00ea\u00eb}\u00ed\u00ee\u00ef\u00ec\u00df\u00a7$*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00f9,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00b5:\u00a3\u00e0'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1[jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac`\u00a8stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2#\u00a5\u00b7\u00a9]\u00b6\u00bc\u00bd\u00be\u00ac|\u00af~\u00b4\u00d7\u00e9ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5\u00e8JKLMNOPQR\u00b9\u00fb\u00fc\u00a6\u00fa\u00ff\u00e7\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", + Aliases: []string{"ibm-1147_P100-1997", "ibm-1147", "IBM01147", "CCSID01147", "CP01147", "cp1147", "ebcdic-fr-297+euro"}, + }, + { + Name: "ibm-1148_P100-1997", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1[.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df]$*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac\u00b5~stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", + Aliases: []string{"ibm-1148_P100-1997", "ibm-1148", "IBM01148", "CCSID01148", "CP01148", "cp1148", "ebcdic-international-500+euro"}, + }, + { + Name: "ibm-1149_P100-1997", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1\u00de.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u00c6$*);\u00d6-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00f0:#\u00d0'=\"\u00d8abcdefghi\u00ab\u00bb`\u00fd{\u00b1\u00b0jklmnopqr\u00aa\u00ba}\u00b8]\u20ac\u00b5\u00f6stuvwxyz\u00a1\u00bf@\u00dd[\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\\\u00d7\u00feABCDEFGHI\u00ad\u00f4~\u00f2\u00f3\u00f5\u00e6JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\u00b4\u00f7STUVWXYZ\u00b2\u00d4^\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", + Aliases: []string{"ibm-1149_P100-1997", "ibm-1149", "IBM01149", "CCSID01149", "CP01149", "cp1149", "ebcdic-is-871+euro"}, + }, + { + Name: "ibm-1153_P100-1999", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u0163\u00e1\u0103\u010d\u00e7\u0107[.<(+!&\u00e9\u0119\u00eb\u016f\u00ed\u00ee\u013e\u013a\u00df]$*);^-/\u00c2\u00c4\u02dd\u00c1\u0102\u010c\u00c7\u0106|,%_>?\u02c7\u00c9\u0118\u00cb\u016e\u00cd\u00ce\u013d\u0139`:#@'=\"\u02d8abcdefghi\u015b\u0148\u0111\u00fd\u0159\u015f\u00b0jklmnopqr\u0142\u0144\u0161\u00b8\u02db\u20ac\u0105~stuvwxyz\u015a\u0147\u0110\u00dd\u0158\u015e\u02d9\u0104\u017c\u0162\u017b\u00a7\u017e\u017a\u017d\u0179\u0141\u0143\u0160\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u0155\u00f3\u0151}JKLMNOPQR\u011a\u0171\u00fc\u0165\u00fa\u011b\\\u00f7STUVWXYZ\u010f\u00d4\u00d6\u0154\u00d3\u01500123456789\u010e\u0170\u00dc\u0164\u00da\u009f", + Aliases: []string{"ibm-1153_P100-1999", "ibm-1153"}, + }, + { + Name: "ibm-1154_P100-1999", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0452\u0453\u0451\u0454\u0455\u0456\u0457\u0458[.<(+!&\u0459\u045a\u045b\u045c\u045e\u045f\u042a\u2116\u0402]$*);^-/\u0403\u0401\u0404\u0405\u0406\u0407\u0408\u0409|,%_>?\u040a\u040b\u040c\u00ad\u040e\u040f\u044e\u0430\u0431`:#@'=\"\u0446abcdefghi\u0434\u0435\u0444\u0433\u0445\u0438\u0439jklmnopqr\u043a\u043b\u043c\u043d\u043e\u043f\u044f~stuvwxyz\u0440\u0441\u0442\u0443\u0436\u0432\u044c\u044b\u0437\u0448\u044d\u0449\u0447\u044a\u042e\u0410\u0411\u0426\u0414\u0415\u0424\u0413{ABCDEFGHI\u0425\u0418\u0419\u041a\u041b\u041c}JKLMNOPQR\u041d\u041e\u041f\u042f\u0420\u0421\\\u20acSTUVWXYZ\u0422\u0423\u0416\u0412\u042c\u042b0123456789\u0417\u0428\u042d\u0429\u0427\u009f", + Aliases: []string{"ibm-1154_P100-1999", "ibm-1154"}, + }, + { + Name: "ibm-1155_P100-1999", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5{\u00f1\u00c7.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u011e\u0130*);^-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5[\u00d1\u015f,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u0131:\u00d6\u015e'=\u00dc\u00d8abcdefghi\u00ab\u00bb}`\u00a6\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac\u00b5\u00f6stuvwxyz\u00a1\u00bf]$@\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e7ABCDEFGHI\u00ad\u00f4~\u00f2\u00f3\u00f5\u011fJKLMNOPQR\u00b9\u00fb\\\u00f9\u00fa\u00ff\u00fc\u00f7STUVWXYZ\u00b2\u00d4#\u00d2\u00d3\u00d50123456789\u00b3\u00db\"\u00d9\u00da\u009f", + Aliases: []string{"ibm-1155_P100-1999", "ibm-1155"}, + }, + { + Name: "ibm-1156_P100-1999", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0161\u00e4\u0105\u012f\u016b\u00e5\u0113\u017e\u00a2.<(+|&\u00e9\u0119\u0117\u010d\u0173\u201e\u201c\u0123\u00df!$*);\u00ac-/\u0160\u00c4\u0104\u012e\u016a\u00c5\u0112\u017d\u00a6,%_>?\u00f8\u00c9\u0118\u0116\u010c\u0172\u012a\u013b\u0122`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u0101\u017c\u0144\u00b1\u00b0jklmnopqr\u0156\u0157\u00e6\u0137\u00c6\u20ac\u00b5~stuvwxyz\u201d\u017a\u0100\u017b\u0143\u00ae^\u00a3\u012b\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be[]\u0179\u0136\u013c\u00d7{ABCDEFGHI\u00ad\u014d\u00f6\u0146\u00f3\u00f5}JKLMNOPQR\u00b9\u0107\u00fc\u0142\u015b\u2019\\\u00f7STUVWXYZ\u00b2\u014c\u00d6\u0145\u00d3\u00d50123456789\u00b3\u0106\u00dc\u0141\u015a\u009f", + Aliases: []string{"ibm-1156_P100-1999", "ibm-1156"}, + }, + { + Name: "ibm-1157_P100-1999", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2{\u00e0\u00e1\u00e3}\u00e7\u00f1\u00a7.<(+!&`\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df\u20ac\u00c5*);^-/\u00c2#\u00c0\u00c1\u00c3$\u00c7\u00d1\u00f6,%_>?\u00f8\\\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc\u00e9:\u00c4\u00d6'=\"\u00d8abcdefghi\u00ab\u00bb\u0161\u00fd\u017e\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6]\u00b5\u00fcstuvwxyz\u00a1\u00bf\u0160\u00dd\u017d\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9[\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u00a8\u00b4\u00d7\u00e4ABCDEFGHI\u00ad\u00f4\u00a6\u00f2\u00f3\u00f5\u00e5JKLMNOPQR\u00b9\u00fb~\u00f9\u00fa\u00ff\u00c9\u00f7STUVWXYZ\u00b2\u00d4@\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", + Aliases: []string{"ibm-1157_P100-1999", "ibm-1157"}, + }, + { + Name: "ibm-1158_P100-1999", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0452\u0491\u0451\u0454\u0455\u0456\u0457\u0458[.<(+!&\u0459\u045a\u045b\u045c\u045e\u045f\u042a\u2116\u0402]$*);^-/\u0490\u0401\u0404\u0405\u0406\u0407\u0408\u0409|,%_>?\u040a\u040b\u040c\u00ad\u040e\u040f\u044e\u0430\u0431`:#@'=\"\u0446abcdefghi\u0434\u0435\u0444\u0433\u0445\u0438\u0439jklmnopqr\u043a\u043b\u043c\u043d\u043e\u043f\u044f~stuvwxyz\u0440\u0441\u0442\u0443\u0436\u0432\u044c\u044b\u0437\u0448\u044d\u0449\u0447\u044a\u042e\u0410\u0411\u0426\u0414\u0415\u0424\u0413{ABCDEFGHI\u0425\u0418\u0419\u041a\u041b\u041c}JKLMNOPQR\u041d\u041e\u041f\u042f\u0420\u0421\\\u20acSTUVWXYZ\u0422\u0423\u0416\u0412\u042c\u042b0123456789\u0417\u0428\u042d\u0429\u0427\u009f", + Aliases: []string{"ibm-1158_P100-1999", "ibm-1158"}, + }, + { + Name: "ibm-1160_P100-1999", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07[\u00a2.<(+|&\u0e48\u0e08\u0e09\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e]!$*);\u00ac-/\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15^\u00a6,%_>?\u0e3f\u0e4e\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c`:#@'=\"\u0e4fabcdefghi\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e5ajklmnopqr\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e5b~stuvwxyz\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0e2f\u0e30\u0e31\u0e32\u0e33\u0e34{ABCDEFGHI\u0e49\u0e35\u0e36\u0e37\u0e38\u0e39}JKLMNOPQR\u0e3a\u0e40\u0e41\u0e42\u0e43\u0e44\\\u0e4aSTUVWXYZ\u0e45\u0e46\u0e47\u0e48\u0e49\u0e4a0123456789\u0e4b\u0e4c\u0e4d\u0e4b\u20ac\u009f", + Aliases: []string{"ibm-1160_P100-1999", "ibm-1160"}, + }, + { + Name: "ibm-1162_P100-1999", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u20ac\u0081\u0082\u0083\u0084\u2026\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u0e01\u0e02\u0e03\u0e04\u0e05\u0e06\u0e07\u0e08\u0e09\u0e0a\u0e0b\u0e0c\u0e0d\u0e0e\u0e0f\u0e10\u0e11\u0e12\u0e13\u0e14\u0e15\u0e16\u0e17\u0e18\u0e19\u0e1a\u0e1b\u0e1c\u0e1d\u0e1e\u0e1f\u0e20\u0e21\u0e22\u0e23\u0e24\u0e25\u0e26\u0e27\u0e28\u0e29\u0e2a\u0e2b\u0e2c\u0e2d\u0e2e\u0e2f\u0e30\u0e31\u0e32\u0e33\u0e34\u0e35\u0e36\u0e37\u0e38\u0e39\u0e3a\ufffd\ufffd\ufffd\ufffd\u0e3f\u0e40\u0e41\u0e42\u0e43\u0e44\u0e45\u0e46\u0e47\u0e48\u0e49\u0e4a\u0e4b\u0e4c\u0e4d\u0e4e\u0e4f\u0e50\u0e51\u0e52\u0e53\u0e54\u0e55\u0e56\u0e57\u0e58\u0e59\u0e5a\u0e5b\ufffd\ufffd\ufffd\ufffd", + Aliases: []string{"ibm-1162_P100-1999", "ibm-1162"}, + }, + { + Name: "ibm-1164_P100-1999", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u0103\u00e5\u00e7\u00f1[.<(+!&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u0303\u00df]$*);^-/\u00c2\u00c4\u00c0\u00c1\u0102\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u20ab`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u0111\u0309\u0300\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u0152\u00c6\u20ac\u00b5~stuvwxyz\u00a1\u00bf\u0110\u0323\u0301\u00ae\u00a2\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be\u00ac|\u00af\u0153\u0178\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u01b0\u00f3\u01a1}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u01af\u00d3\u01a00123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", + Aliases: []string{"ibm-1164_P100-1999", "ibm-1164"}, + }, + { + Name: "ibm-4517_P100-2005", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\ufe7c\ufe7d\u0640\u200b\ufe80\ufe81\ufe82\ufe83\u00b0.<(+!&\ufe84\ufe85\ufffd\ufffd\ufe8b\ufe8d\ufe8e\ufe8f\ufe91\u00a7$*);^-/\ufe93\ufe95\ufe97\ufe99\ufe9b\ufe9d\ufe9f\ufea1\u00fa,%_>?\ufea3\ufea5\ufea7\ufea9\ufeab\ufead\ufeaf\ufeb1\ufeb3\u00a3:\u00b5\u00e1'=\"\ufeb5abcdefghi\ufeb7\ufeb9\ufebb\ufebd\ufebf\ufec3\ufec7jklmnopqr\ufec9\ufeca\ufecb\ufecc\ufecd\ufece\ufecf\u00a8stuvwxyz\ufed0\ufed1\ufed3\ufed5\ufed7\ufed9\ufedb\ufedd\ufef5\ufef6\ufef7\ufef8\ufffd\ufffd\ufefb\ufefc\ufedf\ufee1\ufee3\ufee5\ufee7\ufee9\u00e9ABCDEFGHI\u00ad\ufeeb\ufffd\ufeec\ufffd\ufeed\u00e8JKLMNOPQR\ufeef\ufef0\ufef1\ufef2\ufef3\ufffd\u00e7\u2007STUVWXYZ\u00f7\u060c\ufffd\u00d7\u061f\u061b0123456789\ufffd\ufffd\ufffd\ufffd\ufffd\u009f", + Aliases: []string{"ibm-4517_P100-2005", "ibm-4517"}, + }, + { + Name: "ibm-4899_P100-1998", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd$.<(+|\u05d0\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd!\u00a2*);\u00ac-/\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd,%_>?\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd:#@'=\"\ufffd\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u05d9\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1\u05e2\ufffd\ufffd\u20ac\ufffd\u20aa\ufffd\ufffd\ufffd\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u05ea\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdABCDEFGHI\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffdJKLMNOPQR\ufffd\u202d\u202e\u202c\ufffd\ufffd\ufffd\ufffdSTUVWXYZ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0123456789\ufffd\u202a\u202b\u200e\u200f\u009f", + Aliases: []string{"ibm-4899_P100-1998", "ibm-4899"}, + }, + { + Name: "ibm-4909_P100-1999", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\u00a0\u2018\u2019\u00a3\u20ac\ufffd\u00a6\u00a7\u00a8\u00a9\ufffd\u00ab\u00ac\u00ad\ufffd\u2015\u00b0\u00b1\u00b2\u00b3\u00b4\u0385\u0386\u0387\u0388\u0389\u038a\u00bb\u038c\u00bd\u038e\u038f\u0390\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\ufffd\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab\u03ac\u03ad\u03ae\u03af\u03b0\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c2\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\u03ca\u03cb\u03cc\u03cd\u03ce\ufffd", + Aliases: []string{"ibm-4909_P100-1999", "ibm-4909"}, + }, + { + Name: "ibm-4971_P100-1999", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399[.<(+!&\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3]$*);^-/\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab|,%_>?\u00a8\u0386\u0388\u0389\u00a0\u038a\u038c\u038e\u038f`:#@'=\"\u0385abcdefghi\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u00b0jklmnopqr\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u00b4~stuvwxyz\u03bd\u03be\u03bf\u03c0\u03c1\u03c3\u00a3\u03ac\u03ad\u03ae\u03ca\u03af\u03cc\u03cd\u03cb\u03ce\u03c2\u03c4\u03c5\u03c6\u03c7\u03c8{ABCDEFGHI\u00ad\u03c9\u0390\u03b0\u2018\u2015}JKLMNOPQR\u00b1\u00bd\ufffd\u0387\u2019\u00a6\\\ufffdSTUVWXYZ\u00b2\u00a7\ufffd\ufffd\u00ab\u00ac0123456789\u00b3\u00a9\u20ac\ufffd\u00bb\u009f", + Aliases: []string{"ibm-4971_P100-1999", "ibm-4971"}, + }, + { + Name: "ibm-5123_P100-1999", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \ufffd\uff61\uff62\uff63\uff64\uff65\uff66\uff67\uff68\u00a2.<(+|&\uff69\uff6a\uff6b\uff6c\uff6d\uff6e\uff6f\uff70\uff71!$*);\u00ac-/\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79\ufffd,%_>?\uff7a\uff7b\uff7c\uff7d\uff7e\uff7f\uff80\uff81\uff82`:#@'=\"\ufffdabcdefghi\uff83\uff84\uff85\uff86\uff87\uff88\ufffdjklmnopqr\uff89\uff8a\uff8b\uff8c\uff8d\uff8e\u203e~stuvwxyz\uff8f\uff90\uff91[\uff92\uff93^\u00a3\u00a5\uff94\uff95\uff96\uff97\uff98\uff99\uff9a\uff9b\uff9c\uff9d]\uff9e\uff9f{ABCDEFGHI\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd}JKLMNOPQR\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\\\u20acSTUVWXYZ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0123456789\ufffd\ufffd\ufffd\ufffd\ufffd\u009f", + Aliases: []string{"ibm-5123_P100-1999", "ibm-5123"}, + }, + { + Name: "ibm-8482_P100-1999", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \uff61\uff62\uff63\uff64\uff65\uff66\uff67\uff68\uff69\u00a3.<(+|&\uff6a\uff6b\uff6c\uff6d\uff6e\uff6f\ufffd\uff70\ufffd!\u00a5*);\u00ac-/abcdefgh\ufffd,%_>?[ijklmnop`:#@'=\"]\uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78\uff79\uff7aq\uff7b\uff7c\uff7d\uff7e\uff7f\uff80\uff81\uff82\uff83\uff84\uff85\uff86\uff87\uff88\uff89r\ufffd\uff8a\uff8b\uff8c~\u203e\uff8d\uff8e\uff8f\uff90\uff91\uff92\uff93\uff94\uff95s\uff96\uff97\uff98\uff99^\u00a2\\tuvwxyz\uff9a\uff9b\uff9c\uff9d\uff9e\uff9f{ABCDEFGHI\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd}JKLMNOPQR\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd$\u20acSTUVWXYZ\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd0123456789\ufffd\ufffd\ufffd\ufffd\ufffd\u009f", + Aliases: []string{"ibm-8482_P100-1999", "ibm-8482"}, + }, + { + Name: "ibm-9067_X100-2005", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399[.<(+!&\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3]$*);^-/\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\u03aa\u03ab|,%_>?\u00a8\u0386\u0388\u0389\u00a0\u038a\u038c\u038e\u038f`:#@'=\"\u0385abcdefghi\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u00b0jklmnopqr\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u00b4~stuvwxyz\u03bd\u03be\u03bf\u03c0\u03c1\u03c3\u00a3\u03ac\u03ad\u03ae\u03ca\u03af\u03cc\u03cd\u03cb\u03ce\u03c2\u03c4\u03c5\u03c6\u03c7\u03c8{ABCDEFGHI\u00ad\u03c9\u0390\u03b0\u2018\u2015}JKLMNOPQR\u00b1\u00bd\ufffd\u0387\u2019\u00a6\\\u20afSTUVWXYZ\u00b2\u00a7\u037a\ufffd\u00ab\u00ac0123456789\u00b3\u00a9\u20ac\ufffd\u00bb\u009f", + Aliases: []string{"ibm-9067_X100-2005", "ibm-9067"}, + }, + { + Name: "ibm-12712_P100-1998", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d7\u05d8\u00a2.<(+|&\u05d9\u05da\u05db\u05dc\u05dd\u05de\u05df\u05e0\u05e1!$*);\u00ac-/\u05e2\u05e3\u05e4\u05e5\u05e6\u05e7\u05e8\u05e9\u00a6,%_>?\ufffd\u05ea\ufffd\ufffd\u00a0\ufffd\ufffd\ufffd\u2017`:#@'=\"\ufffdabcdefghi\u00ab\u00bb\ufffd\ufffd\ufffd\u00b1\u00b0jklmnopqr\ufffd\ufffd\u20ac\u00b8\u20aa\u00a4\u00b5~stuvwxyz\ufffd\ufffd\ufffd\ufffd\ufffd\u00ae^\u00a3\u00a5\u2022\u00a9\u00a7\u00b6\u00bc\u00bd\u00be[]\u203e\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\ufffd\ufffd\ufffd\ufffd\ufffd}JKLMNOPQR\u00b9\u202d\u202e\u202c\ufffd\ufffd\\\u00f7STUVWXYZ\u00b2\ufffd\ufffd\ufffd\ufffd\ufffd0123456789\u00b3\u202a\u202b\u200e\u200f\u009f", + Aliases: []string{"ibm-12712_P100-1998", "ibm-12712", "ebcdic-he"}, + }, + { + Name: "ibm-16804_X110-1999", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\u0085\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u0651\ufe7d\u0640\u200b\u0621\u0622\ufe82\u0623\u00a2.<(+|&\ufe84\u0624\ufffd\ufffd\u0626\u0627\ufe8e\u0628\ufe91!$*);\u00ac-/\u0629\u062a\ufe97\u062b\ufe9b\u062c\ufe9f\u062d\u00a6,%_>?\ufea3\u062e\ufea7\u062f\u0630\u0631\u0632\u0633\ufeb3\u060c:#@'=\"\u0634abcdefghi\ufeb7\u0635\ufebb\u0636\ufebf\u0637\u0638jklmnopqr\u0639\ufeca\ufecb\ufecc\u063a\ufece\ufecf\u00f7stuvwxyz\ufed0\u0641\ufed3\u0642\ufed7\u0643\ufedb\u0644\ufef5\ufef6\ufef7\ufef8\ufffd\ufffd\ufefb\ufefc\ufedf\u0645\ufee3\u0646\ufee7\u0647\u061bABCDEFGHI\u00ad\ufeeb\ufffd\ufeec\ufffd\u0648\u061fJKLMNOPQR\u0649\ufef0\u064a\ufef2\ufef3\u0660\u00d7\u2007STUVWXYZ\u0661\u0662\ufffd\u0663\u0664\u06650123456789\u20ac\u0666\u0667\u0668\u0669\u009f", + Aliases: []string{"ibm-16804_X110-1999", "ibm-16804", "ebcdic-ar"}, + }, + { + Name: "KOI8-R", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u2500\u2502\u250c\u2510\u2514\u2518\u251c\u2524\u252c\u2534\u253c\u2580\u2584\u2588\u258c\u2590\u2591\u2592\u2593\u2320\u25a0\u2219\u221a\u2248\u2264\u2265\u00a0\u2321\u00b0\u00b2\u00b7\u00f7\u2550\u2551\u2552\u0451\u2553\u2554\u2555\u2556\u2557\u2558\u2559\u255a\u255b\u255c\u255d\u255e\u255f\u2560\u2561\u0401\u2562\u2563\u2564\u2565\u2566\u2567\u2568\u2569\u256a\u256b\u256c\u00a9\u044e\u0430\u0431\u0446\u0434\u0435\u0444\u0433\u0445\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u044f\u0440\u0441\u0442\u0443\u0436\u0432\u044c\u044b\u0437\u0448\u044d\u0449\u0447\u044a\u042e\u0410\u0411\u0426\u0414\u0415\u0424\u0413\u0425\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u042f\u0420\u0421\u0422\u0423\u0416\u0412\u042c\u042b\u0417\u0428\u042d\u0429\u0427\u042a", + Aliases: []string{"csKOI8R"}, + }, + { + Name: "KOI8-U", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u2500\u2502\u250c\u2510\u2514\u2518\u251c\u2524\u252c\u2534\u253c\u2580\u2584\u2588\u258c\u2590\u2591\u2592\u2593\u2320\u25a0\u2219\u221a\u2248\u2264\u2265\u00a0\u2321\u00b0\u00b2\u00b7\u00f7\u2550\u2551\u2552\u0451\u0454\u2554\u0456\u0457\u2557\u2558\u2559\u255a\u255b\u0491\u255d\u255e\u255f\u2560\u2561\u0401\u0404\u2563\u0406\u0407\u2566\u2567\u2568\u2569\u256a\u0490\u256c\u00a9\u044e\u0430\u0431\u0446\u0434\u0435\u0444\u0433\u0445\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u044f\u0440\u0441\u0442\u0443\u0436\u0432\u044c\u044b\u0437\u0448\u044d\u0449\u0447\u044a\u042e\u0410\u0411\u0426\u0414\u0415\u0424\u0413\u0425\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u042f\u0420\u0421\u0422\u0423\u0416\u0412\u042c\u042b\u0417\u0428\u042d\u0429\u0427\u042a", + }, + { + Name: "ibm-1051_P100-1995", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\ufffd\u00c0\u00c2\u00c8\u00ca\u00cb\u00ce\u00cf\u00b4`\u02c6\u00a8\u02dc\u00d9\u00db\u00a3\u203e\u00dd\u00fd\u02da\u00c7\u00e7\u00d1\u00f1\u00a1\u00bf\u00a4\u00a3\u00a5\u00a7\u0192\u00a2\u00e2\u00ea\u00f4\u00fb\u00e1\u00e9\u00f3\u00fa\u00e0\u00e8\u00f2\u00f9\u00e4\u00eb\u00f6\u00fc\u00c5\u00ee\u00d8\u00c6\u00e5\u00ed\u00f8\u00e6\u00c4\u00ec\u00d6\u00dc\u00c9\u00ef\u00df\u00d4\u00c1\u00c3\u00e3\u00d0\u00f0\u00cd\u00cc\u00d3\u00d2\u00d5\u00f5\u0160\u0161\u00da\u0178\u00ff\u00de\u00fe\u00b7\u03bc\u00b6\u00be-\u00bc\u00bd\u00aa\u00ba\u00ab\u25a0\u00bb\u00b1\ufffd", + Aliases: []string{"ibm-1051_P100-1995", "ibm-1051", "hp-roman8", "roman8", "r8", "csHPRoman8"}, + }, + { + Name: "ibm-1276_P100-1995", + SubstitutionChar: '?', + Repertoire: "\x00\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\x1b\x1c\x1d\x1e\x1f !\"#$%&\u2019()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_\u2018abcdefghijklmnopqrstuvwxyz{|}~\x7f\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008a\u008b\u008c\u008d\u008e\u008f\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009a\u009b\u009c\u009d\u009e\u009f\ufffd\u00a1\u00a2\u00a3\u2044\u00a5\u0192\u00a7\u00a4'\u201c\u00ab\u2039\u203a\ufb01\ufb02\ufffd\u2013\u2020\u2021\u00b7\ufffd\u00b6\u2022\u201a\u201e\u201d\u00bb\u2026\u2030\ufffd\u00bf\ufffd`\u00b4\u02c6\u02dc\u00af\u02d8\u02d9\u00a8\ufffd\u02da\u00b8\ufffd\u02dd\u02db\u02c7\u2014\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\u00c6\ufffd\u00aa\ufffd\ufffd\ufffd\ufffd\u0141\u00d8\u0152\u00ba\ufffd\ufffd\ufffd\ufffd\ufffd\u00e6\ufffd\ufffd\ufffd\u0131\ufffd\ufffd\u0142\u00f8\u0153\u00df\ufffd\ufffd\ufffd\ufffd", + Aliases: []string{"ibm-1276_P100-1995", "ibm-1276", "Adobe-Standard-Encoding", "csAdobeStandardEncoding"}, + }, + { + Name: "ebcdic-xml-us", + SubstitutionChar: 0x6f, + Repertoire: "\x00\x01\x02\x03\u009c\t\u0086\x7f\u0097\u008d\u008e\v\f\r\x0e\x0f\x10\x11\x12\x13\u009d\n\b\u0087\x18\x19\u0092\u008f\x1c\x1d\x1e\x1f\u0080\u0081\u0082\u0083\u0084\n\x17\x1b\u0088\u0089\u008a\u008b\u008c\x05\x06\a\u0090\u0091\x16\u0093\u0094\u0095\u0096\x04\u0098\u0099\u009a\u009b\x14\x15\u009e\x1a \u00a0\u00e2\u00e4\u00e0\u00e1\u00e3\u00e5\u00e7\u00f1\u00a2.<(+|&\u00e9\u00ea\u00eb\u00e8\u00ed\u00ee\u00ef\u00ec\u00df!$*);\u00ac-/\u00c2\u00c4\u00c0\u00c1\u00c3\u00c5\u00c7\u00d1\u00a6,%_>?\u00f8\u00c9\u00ca\u00cb\u00c8\u00cd\u00ce\u00cf\u00cc`:#@'=\"\u00d8abcdefghi\u00ab\u00bb\u00f0\u00fd\u00fe\u00b1\u00b0jklmnopqr\u00aa\u00ba\u00e6\u00b8\u00c6\u20ac\u00b5~stuvwxyz\u00a1\u00bf\u00d0\u00dd\u00de\u00ae^\u00a3\u00a5\u00b7\u00a9\u00a7\u00b6\u00bc\u00bd\u00be[]\u00af\u00a8\u00b4\u00d7{ABCDEFGHI\u00ad\u00f4\u00f6\u00f2\u00f3\u00f5}JKLMNOPQR\u00b9\u00fb\u00fc\u00f9\u00fa\u00ff\\\u00f7STUVWXYZ\u00b2\u00d4\u00d6\u00d2\u00d3\u00d50123456789\u00b3\u00db\u00dc\u00d9\u00da\u009f", + Aliases: []string{"ebcdic-xml-us"}, + }, +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/ASCII.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/ASCII.go new file mode 100644 index 0000000000000000000000000000000000000000..5e4eebf4a3e4f00211cc647649b709a94944f797 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/ASCII.go @@ -0,0 +1,76 @@ +package mahonia + +// Converters for ASCII and ISO-8859-1 + +func init() { + for i := 0; i < len(asciiCharsets); i++ { + RegisterCharset(&asciiCharsets[i]) + } +} + +var asciiCharsets = []Charset{ + { + Name: "US-ASCII", + NewDecoder: func() Decoder { return decodeASCIIRune }, + NewEncoder: func() Encoder { return encodeASCIIRune }, + Aliases: []string{"ASCII", "US", "ISO646-US", "IBM367", "cp367", "ANSI_X3.4-1968", "iso-ir-6", "ANSI_X3.4-1986", "ISO_646.irv:1991", "csASCII"}, + }, + { + Name: "ISO-8859-1", + NewDecoder: func() Decoder { return decodeLatin1Rune }, + NewEncoder: func() Encoder { return encodeLatin1Rune }, + Aliases: []string{"latin1", "ISO Latin 1", "IBM819", "cp819", "ISO_8859-1:1987", "iso-ir-100", "l1", "csISOLatin1"}, + }, +} + +func decodeASCIIRune(p []byte) (c rune, size int, status Status) { + if len(p) == 0 { + status = NO_ROOM + return + } + + b := p[0] + if b > 127 { + return 0xfffd, 1, INVALID_CHAR + } + return rune(b), 1, SUCCESS +} + +func encodeASCIIRune(p []byte, c rune) (size int, status Status) { + if len(p) == 0 { + status = NO_ROOM + return + } + + if c < 128 { + p[0] = byte(c) + return 1, SUCCESS + } + + p[0] = '?' + return 1, INVALID_CHAR +} + +func decodeLatin1Rune(p []byte) (c rune, size int, status Status) { + if len(p) == 0 { + status = NO_ROOM + return + } + + return rune(p[0]), 1, SUCCESS +} + +func encodeLatin1Rune(p []byte, c rune) (size int, status Status) { + if len(p) == 0 { + status = NO_ROOM + return + } + + if c < 256 { + p[0] = byte(c) + return 1, SUCCESS + } + + p[0] = '?' + return 1, INVALID_CHAR +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/README.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/README.md new file mode 100644 index 0000000000000000000000000000000000000000..db8f250ab5479cd1c5beb491f39f6a5b82e68aeb --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/README.md @@ -0,0 +1,27 @@ +mahonia +======= + + character-set conversion library implemented in Go. + + Mahonia is a character-set conversion library implemented in Go. + All data is compiled into the executable; it doesn't need any external data files. + + based on http://code.google.com/p/mahonia/ + +install +------- + + go get github.com/axgle/mahonia + +example +------- + + package main + import "fmt" + import "github.com/axgle/mahonia" + func main(){ + enc:=mahonia.NewEncoder("gbk") + //converts a string from UTF-8 to gbk encoding. + fmt.Println(enc.ConvertString("hello,世界")) + } + diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/big5-data.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/big5-data.go new file mode 100644 index 0000000000000000000000000000000000000000..a542fe1fc630bad669cd3c0bfcac61a0ceef7cda --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/big5-data.go @@ -0,0 +1,13707 @@ +package mahonia + +var big5ToUnicode = [65536]uint16{ + 0xA140: 0x3000, // IDEOGRAPHIC SPACE + 0xA141: 0xFF0C, // FULLWIDTH COMMA + 0xA142: 0x3001, // IDEOGRAPHIC COMMA + 0xA143: 0x3002, // IDEOGRAPHIC FULL STOP + 0xA144: 0xFF0E, // FULLWIDTH FULL STOP + 0xA145: 0x2022, // BULLET + 0xA146: 0xFF1B, // FULLWIDTH SEMICOLON + 0xA147: 0xFF1A, // FULLWIDTH COLON + 0xA148: 0xFF1F, // FULLWIDTH QUESTION MARK + 0xA149: 0xFF01, // FULLWIDTH EXCLAMATION MARK + 0xA14A: 0xFE30, // PRESENTATION FORM FOR VERTICAL TWO DOT LEADER + 0xA14B: 0x2026, // HORIZONTAL ELLIPSIS + 0xA14C: 0x2025, // TWO DOT LEADER + 0xA14D: 0xFE50, // SMALL COMMA + 0xA14E: 0xFF64, // HALFWIDTH IDEOGRAPHIC COMMA + 0xA14F: 0xFE52, // SMALL FULL STOP + 0xA150: 0x00B7, // MIDDLE DOT + 0xA151: 0xFE54, // SMALL SEMICOLON + 0xA152: 0xFE55, // SMALL COLON + 0xA153: 0xFE56, // SMALL QUESTION MARK + 0xA154: 0xFE57, // SMALL EXCLAMATION MARK + 0xA155: 0xFF5C, // FULLWIDTH VERTICAL BAR + 0xA156: 0x2013, // EN DASH + 0xA157: 0xFE31, // PRESENTATION FORM FOR VERTICAL EM DASH + 0xA158: 0x2014, // EM DASH + 0xA159: 0xFE33, // PRESENTATION FORM FOR VERTICAL LOW LINE + 0xA15B: 0xFE34, // PRESENTATION FORM FOR VERTICAL WAVY LOW LINE + 0xA15C: 0xFE4F, // WAVY LOW LINE + 0xA15D: 0xFF08, // FULLWIDTH LEFT PARENTHESIS + 0xA15E: 0xFF09, // FULLWIDTH RIGHT PARENTHESIS + 0xA15F: 0xFE35, // PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS + 0xA160: 0xFE36, // PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS + 0xA161: 0xFF5B, // FULLWIDTH LEFT CURLY BRACKET + 0xA162: 0xFF5D, // FULLWIDTH RIGHT CURLY BRACKET + 0xA163: 0xFE37, // PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET + 0xA164: 0xFE38, // PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET + 0xA165: 0x3014, // LEFT TORTOISE SHELL BRACKET + 0xA166: 0x3015, // RIGHT TORTOISE SHELL BRACKET + 0xA167: 0xFE39, // PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET + 0xA168: 0xFE3A, // PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET + 0xA169: 0x3010, // LEFT BLACK LENTICULAR BRACKET + 0xA16A: 0x3011, // RIGHT BLACK LENTICULAR BRACKET + 0xA16B: 0xFE3B, // PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET + 0xA16C: 0xFE3C, // PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET + 0xA16D: 0x300A, // LEFT DOUBLE ANGLE BRACKET + 0xA16E: 0x300B, // RIGHT DOUBLE ANGLE BRACKET + 0xA16F: 0xFE3D, // PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET + 0xA170: 0xFE3E, // PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET + 0xA171: 0x3008, // LEFT ANGLE BRACKET + 0xA172: 0x3009, // RIGHT ANGLE BRACKET + 0xA173: 0xFE3F, // PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET + 0xA174: 0xFE40, // PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET + 0xA175: 0x300C, // LEFT CORNER BRACKET + 0xA176: 0x300D, // RIGHT CORNER BRACKET + 0xA177: 0xFE41, // PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET + 0xA178: 0xFE42, // PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET + 0xA179: 0x300E, // LEFT WHITE CORNER BRACKET + 0xA17A: 0x300F, // RIGHT WHITE CORNER BRACKET + 0xA17B: 0xFE43, // PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET + 0xA17C: 0xFE44, // PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET + 0xA17D: 0xFE59, // SMALL LEFT PARENTHESIS + 0xA17E: 0xFE5A, // SMALL RIGHT PARENTHESIS + 0xA1A1: 0xFE5B, // SMALL LEFT CURLY BRACKET + 0xA1A2: 0xFE5C, // SMALL RIGHT CURLY BRACKET + 0xA1A3: 0xFE5D, // SMALL LEFT TORTOISE SHELL BRACKET + 0xA1A4: 0xFE5E, // SMALL RIGHT TORTOISE SHELL BRACKET + 0xA1A5: 0x2018, // LEFT SINGLE QUOTATION MARK + 0xA1A6: 0x2019, // RIGHT SINGLE QUOTATION MARK + 0xA1A7: 0x201C, // LEFT DOUBLE QUOTATION MARK + 0xA1A8: 0x201D, // RIGHT DOUBLE QUOTATION MARK + 0xA1A9: 0x301D, // REVERSED DOUBLE PRIME QUOTATION MARK + 0xA1AA: 0x301E, // DOUBLE PRIME QUOTATION MARK + 0xA1AB: 0x2035, // REVERSED PRIME + 0xA1AC: 0x2032, // PRIME + 0xA1AD: 0xFF03, // FULLWIDTH NUMBER SIGN + 0xA1AE: 0xFF06, // FULLWIDTH AMPERSAND + 0xA1AF: 0xFF0A, // FULLWIDTH ASTERISK + 0xA1B0: 0x203B, // REFERENCE MARK + 0xA1B1: 0x00A7, // SECTION SIGN + 0xA1B2: 0x3003, // DITTO MARK + 0xA1B3: 0x25CB, // WHITE CIRCLE + 0xA1B4: 0x25CF, // BLACK CIRCLE + 0xA1B5: 0x25B3, // WHITE UP-POINTING TRIANGLE + 0xA1B6: 0x25B2, // BLACK UP-POINTING TRIANGLE + 0xA1B7: 0x25CE, // BULLSEYE + 0xA1B8: 0x2606, // WHITE STAR + 0xA1B9: 0x2605, // BLACK STAR + 0xA1BA: 0x25C7, // WHITE DIAMOND + 0xA1BB: 0x25C6, // BLACK DIAMOND + 0xA1BC: 0x25A1, // WHITE SQUARE + 0xA1BD: 0x25A0, // BLACK SQUARE + 0xA1BE: 0x25BD, // WHITE DOWN-POINTING TRIANGLE + 0xA1BF: 0x25BC, // BLACK DOWN-POINTING TRIANGLE + 0xA1C0: 0x32A3, // CIRCLED IDEOGRAPH CORRECT + 0xA1C1: 0x2105, // CARE OF + 0xA1C2: 0x203E, // OVERLINE + 0xA1C4: 0xFF3F, // FULLWIDTH LOW LINE + 0xA1C6: 0xFE49, // DASHED OVERLINE + 0xA1C7: 0xFE4A, // CENTRELINE OVERLINE + 0xA1C8: 0xFE4D, // DASHED LOW LINE + 0xA1C9: 0xFE4E, // CENTRELINE LOW LINE + 0xA1CA: 0xFE4B, // WAVY OVERLINE + 0xA1CB: 0xFE4C, // DOUBLE WAVY OVERLINE + 0xA1CC: 0xFE5F, // SMALL NUMBER SIGN + 0xA1CD: 0xFE60, // SMALL AMPERSAND + 0xA1CE: 0xFE61, // SMALL ASTERISK + 0xA1CF: 0xFF0B, // FULLWIDTH PLUS SIGN + 0xA1D0: 0xFF0D, // FULLWIDTH HYPHEN-MINUS + 0xA1D1: 0x00D7, // MULTIPLICATION SIGN + 0xA1D2: 0x00F7, // DIVISION SIGN + 0xA1D3: 0x00B1, // PLUS-MINUS SIGN + 0xA1D4: 0x221A, // SQUARE ROOT + 0xA1D5: 0xFF1C, // FULLWIDTH LESS-THAN SIGN + 0xA1D6: 0xFF1E, // FULLWIDTH GREATER-THAN SIGN + 0xA1D7: 0xFF1D, // FULLWIDTH EQUALS SIGN + 0xA1D8: 0x2266, // LESS THAN OVER EQUAL TO + 0xA1D9: 0x2267, // GREATER THAN OVER EQUAL TO + 0xA1DA: 0x2260, // NOT EQUAL TO + 0xA1DB: 0x221E, // INFINITY + 0xA1DC: 0x2252, // APPROXIMATELY EQUAL TO OR THE IMAGE OF + 0xA1DD: 0x2261, // IDENTICAL TO + 0xA1DE: 0xFE62, // SMALL PLUS SIGN + 0xA1DF: 0xFE63, // SMALL HYPHEN-MINUS + 0xA1E0: 0xFE64, // SMALL LESS-THAN SIGN + 0xA1E1: 0xFE65, // SMALL GREATER-THAN SIGN + 0xA1E2: 0xFE66, // SMALL EQUALS SIGN + 0xA1E3: 0x223C, // TILDE OPERATOR + 0xA1E4: 0x2229, // INTERSECTION + 0xA1E5: 0x222A, // UNION + 0xA1E6: 0x22A5, // UP TACK + 0xA1E7: 0x2220, // ANGLE + 0xA1E8: 0x221F, // RIGHT ANGLE + 0xA1E9: 0x22BF, // RIGHT TRIANGLE + 0xA1EA: 0x33D2, // SQUARE LOG + 0xA1EB: 0x33D1, // SQUARE LN + 0xA1EC: 0x222B, // INTEGRAL + 0xA1ED: 0x222E, // CONTOUR INTEGRAL + 0xA1EE: 0x2235, // BECAUSE + 0xA1EF: 0x2234, // THEREFORE + 0xA1F0: 0x2640, // FEMALE SIGN + 0xA1F1: 0x2642, // MALE SIGN + 0xA1F2: 0x2641, // EARTH + 0xA1F3: 0x2609, // SUN + 0xA1F4: 0x2191, // UPWARDS ARROW + 0xA1F5: 0x2193, // DOWNWARDS ARROW + 0xA1F6: 0x2190, // LEFTWARDS ARROW + 0xA1F7: 0x2192, // RIGHTWARDS ARROW + 0xA1F8: 0x2196, // NORTH WEST ARROW + 0xA1F9: 0x2197, // NORTH EAST ARROW + 0xA1FA: 0x2199, // SOUTH WEST ARROW + 0xA1FB: 0x2198, // SOUTH EAST ARROW + 0xA1FC: 0x2225, // PARALLEL TO + 0xA1FD: 0x2223, // DIVIDES + 0xA241: 0xFF0F, // FULLWIDTH SOLIDUS + 0xA242: 0xFF3C, // FULLWIDTH REVERSE SOLIDUS + 0xA243: 0xFF04, // FULLWIDTH DOLLAR SIGN + 0xA244: 0x00A5, // YEN SIGN + 0xA245: 0x3012, // POSTAL MARK + 0xA246: 0x00A2, // CENT SIGN + 0xA247: 0x00A3, // POUND SIGN + 0xA248: 0xFF05, // FULLWIDTH PERCENT SIGN + 0xA249: 0xFF20, // FULLWIDTH COMMERCIAL AT + 0xA24A: 0x2103, // DEGREE CELSIUS + 0xA24B: 0x2109, // DEGREE FAHRENHEIT + 0xA24C: 0xFE69, // SMALL DOLLAR SIGN + 0xA24D: 0xFE6A, // SMALL PERCENT SIGN + 0xA24E: 0xFE6B, // SMALL COMMERCIAL AT + 0xA24F: 0x33D5, // SQUARE MIL + 0xA250: 0x339C, // SQUARE MM + 0xA251: 0x339D, // SQUARE CM + 0xA252: 0x339E, // SQUARE KM + 0xA253: 0x33CE, // SQUARE KM CAPITAL + 0xA254: 0x33A1, // SQUARE M SQUARED + 0xA255: 0x338E, // SQUARE MG + 0xA256: 0x338F, // SQUARE KG + 0xA257: 0x33C4, // SQUARE CC + 0xA258: 0x00B0, // DEGREE SIGN + 0xA259: 0x5159, + 0xA25A: 0x515B, + 0xA25B: 0x515E, + 0xA25C: 0x515D, + 0xA25D: 0x5161, + 0xA25E: 0x5163, + 0xA25F: 0x55E7, + 0xA260: 0x74E9, + 0xA261: 0x7CCE, + 0xA262: 0x2581, // LOWER ONE EIGHTH BLOCK + 0xA263: 0x2582, // LOWER ONE QUARTER BLOCK + 0xA264: 0x2583, // LOWER THREE EIGHTHS BLOCK + 0xA265: 0x2584, // LOWER HALF BLOCK + 0xA266: 0x2585, // LOWER FIVE EIGHTHS BLOCK + 0xA267: 0x2586, // LOWER THREE QUARTERS BLOCK + 0xA268: 0x2587, // LOWER SEVEN EIGHTHS BLOCK + 0xA269: 0x2588, // FULL BLOCK + 0xA26A: 0x258F, // LEFT ONE EIGHTH BLOCK + 0xA26B: 0x258E, // LEFT ONE QUARTER BLOCK + 0xA26C: 0x258D, // LEFT THREE EIGHTHS BLOCK + 0xA26D: 0x258C, // LEFT HALF BLOCK + 0xA26E: 0x258B, // LEFT FIVE EIGHTHS BLOCK + 0xA26F: 0x258A, // LEFT THREE QUARTERS BLOCK + 0xA270: 0x2589, // LEFT SEVEN EIGHTHS BLOCK + 0xA271: 0x253C, // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0xA272: 0x2534, // BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0xA273: 0x252C, // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0xA274: 0x2524, // BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0xA275: 0x251C, // BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0xA276: 0x2594, // UPPER ONE EIGHTH BLOCK + 0xA277: 0x2500, // BOX DRAWINGS LIGHT HORIZONTAL + 0xA278: 0x2502, // BOX DRAWINGS LIGHT VERTICAL + 0xA279: 0x2595, // RIGHT ONE EIGHTH BLOCK + 0xA27A: 0x250C, // BOX DRAWINGS LIGHT DOWN AND RIGHT + 0xA27B: 0x2510, // BOX DRAWINGS LIGHT DOWN AND LEFT + 0xA27C: 0x2514, // BOX DRAWINGS LIGHT UP AND RIGHT + 0xA27D: 0x2518, // BOX DRAWINGS LIGHT UP AND LEFT + 0xA27E: 0x256D, // BOX DRAWINGS LIGHT ARC DOWN AND RIGHT + 0xA2A1: 0x256E, // BOX DRAWINGS LIGHT ARC DOWN AND LEFT + 0xA2A2: 0x2570, // BOX DRAWINGS LIGHT ARC UP AND RIGHT + 0xA2A3: 0x256F, // BOX DRAWINGS LIGHT ARC UP AND LEFT + 0xA2A4: 0x2550, // BOX DRAWINGS DOUBLE HORIZONTAL + 0xA2A5: 0x255E, // BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + 0xA2A6: 0x256A, // BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE + 0xA2A7: 0x2561, // BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + 0xA2A8: 0x25E2, // BLACK LOWER RIGHT TRIANGLE + 0xA2A9: 0x25E3, // BLACK LOWER LEFT TRIANGLE + 0xA2AA: 0x25E5, // BLACK UPPER RIGHT TRIANGLE + 0xA2AB: 0x25E4, // BLACK UPPER LEFT TRIANGLE + 0xA2AC: 0x2571, // BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT + 0xA2AD: 0x2572, // BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT + 0xA2AE: 0x2573, // BOX DRAWINGS LIGHT DIAGONAL CROSS + 0xA2AF: 0xFF10, // FULLWIDTH DIGIT ZERO + 0xA2B0: 0xFF11, // FULLWIDTH DIGIT ONE + 0xA2B1: 0xFF12, // FULLWIDTH DIGIT TWO + 0xA2B2: 0xFF13, // FULLWIDTH DIGIT THREE + 0xA2B3: 0xFF14, // FULLWIDTH DIGIT FOUR + 0xA2B4: 0xFF15, // FULLWIDTH DIGIT FIVE + 0xA2B5: 0xFF16, // FULLWIDTH DIGIT SIX + 0xA2B6: 0xFF17, // FULLWIDTH DIGIT SEVEN + 0xA2B7: 0xFF18, // FULLWIDTH DIGIT EIGHT + 0xA2B8: 0xFF19, // FULLWIDTH DIGIT NINE + 0xA2B9: 0x2160, // ROMAN NUMERAL ONE + 0xA2BA: 0x2161, // ROMAN NUMERAL TWO + 0xA2BB: 0x2162, // ROMAN NUMERAL THREE + 0xA2BC: 0x2163, // ROMAN NUMERAL FOUR + 0xA2BD: 0x2164, // ROMAN NUMERAL FIVE + 0xA2BE: 0x2165, // ROMAN NUMERAL SIX + 0xA2BF: 0x2166, // ROMAN NUMERAL SEVEN + 0xA2C0: 0x2167, // ROMAN NUMERAL EIGHT + 0xA2C1: 0x2168, // ROMAN NUMERAL NINE + 0xA2C2: 0x2169, // ROMAN NUMERAL TEN + 0xA2C3: 0x3021, // HANGZHOU NUMERAL ONE + 0xA2C4: 0x3022, // HANGZHOU NUMERAL TWO + 0xA2C5: 0x3023, // HANGZHOU NUMERAL THREE + 0xA2C6: 0x3024, // HANGZHOU NUMERAL FOUR + 0xA2C7: 0x3025, // HANGZHOU NUMERAL FIVE + 0xA2C8: 0x3026, // HANGZHOU NUMERAL SIX + 0xA2C9: 0x3027, // HANGZHOU NUMERAL SEVEN + 0xA2CA: 0x3028, // HANGZHOU NUMERAL EIGHT + 0xA2CB: 0x3029, // HANGZHOU NUMERAL NINE + 0xA2CD: 0x5344, + 0xA2CF: 0xFF21, // FULLWIDTH LATIN CAPITAL LETTER A + 0xA2D0: 0xFF22, // FULLWIDTH LATIN CAPITAL LETTER B + 0xA2D1: 0xFF23, // FULLWIDTH LATIN CAPITAL LETTER C + 0xA2D2: 0xFF24, // FULLWIDTH LATIN CAPITAL LETTER D + 0xA2D3: 0xFF25, // FULLWIDTH LATIN CAPITAL LETTER E + 0xA2D4: 0xFF26, // FULLWIDTH LATIN CAPITAL LETTER F + 0xA2D5: 0xFF27, // FULLWIDTH LATIN CAPITAL LETTER G + 0xA2D6: 0xFF28, // FULLWIDTH LATIN CAPITAL LETTER H + 0xA2D7: 0xFF29, // FULLWIDTH LATIN CAPITAL LETTER I + 0xA2D8: 0xFF2A, // FULLWIDTH LATIN CAPITAL LETTER J + 0xA2D9: 0xFF2B, // FULLWIDTH LATIN CAPITAL LETTER K + 0xA2DA: 0xFF2C, // FULLWIDTH LATIN CAPITAL LETTER L + 0xA2DB: 0xFF2D, // FULLWIDTH LATIN CAPITAL LETTER M + 0xA2DC: 0xFF2E, // FULLWIDTH LATIN CAPITAL LETTER N + 0xA2DD: 0xFF2F, // FULLWIDTH LATIN CAPITAL LETTER O + 0xA2DE: 0xFF30, // FULLWIDTH LATIN CAPITAL LETTER P + 0xA2DF: 0xFF31, // FULLWIDTH LATIN CAPITAL LETTER Q + 0xA2E0: 0xFF32, // FULLWIDTH LATIN CAPITAL LETTER R + 0xA2E1: 0xFF33, // FULLWIDTH LATIN CAPITAL LETTER S + 0xA2E2: 0xFF34, // FULLWIDTH LATIN CAPITAL LETTER T + 0xA2E3: 0xFF35, // FULLWIDTH LATIN CAPITAL LETTER U + 0xA2E4: 0xFF36, // FULLWIDTH LATIN CAPITAL LETTER V + 0xA2E5: 0xFF37, // FULLWIDTH LATIN CAPITAL LETTER W + 0xA2E6: 0xFF38, // FULLWIDTH LATIN CAPITAL LETTER X + 0xA2E7: 0xFF39, // FULLWIDTH LATIN CAPITAL LETTER Y + 0xA2E8: 0xFF3A, // FULLWIDTH LATIN CAPITAL LETTER Z + 0xA2E9: 0xFF41, // FULLWIDTH LATIN SMALL LETTER A + 0xA2EA: 0xFF42, // FULLWIDTH LATIN SMALL LETTER B + 0xA2EB: 0xFF43, // FULLWIDTH LATIN SMALL LETTER C + 0xA2EC: 0xFF44, // FULLWIDTH LATIN SMALL LETTER D + 0xA2ED: 0xFF45, // FULLWIDTH LATIN SMALL LETTER E + 0xA2EE: 0xFF46, // FULLWIDTH LATIN SMALL LETTER F + 0xA2EF: 0xFF47, // FULLWIDTH LATIN SMALL LETTER G + 0xA2F0: 0xFF48, // FULLWIDTH LATIN SMALL LETTER H + 0xA2F1: 0xFF49, // FULLWIDTH LATIN SMALL LETTER I + 0xA2F2: 0xFF4A, // FULLWIDTH LATIN SMALL LETTER J + 0xA2F3: 0xFF4B, // FULLWIDTH LATIN SMALL LETTER K + 0xA2F4: 0xFF4C, // FULLWIDTH LATIN SMALL LETTER L + 0xA2F5: 0xFF4D, // FULLWIDTH LATIN SMALL LETTER M + 0xA2F6: 0xFF4E, // FULLWIDTH LATIN SMALL LETTER N + 0xA2F7: 0xFF4F, // FULLWIDTH LATIN SMALL LETTER O + 0xA2F8: 0xFF50, // FULLWIDTH LATIN SMALL LETTER P + 0xA2F9: 0xFF51, // FULLWIDTH LATIN SMALL LETTER Q + 0xA2FA: 0xFF52, // FULLWIDTH LATIN SMALL LETTER R + 0xA2FB: 0xFF53, // FULLWIDTH LATIN SMALL LETTER S + 0xA2FC: 0xFF54, // FULLWIDTH LATIN SMALL LETTER T + 0xA2FD: 0xFF55, // FULLWIDTH LATIN SMALL LETTER U + 0xA2FE: 0xFF56, // FULLWIDTH LATIN SMALL LETTER V + 0xA340: 0xFF57, // FULLWIDTH LATIN SMALL LETTER W + 0xA341: 0xFF58, // FULLWIDTH LATIN SMALL LETTER X + 0xA342: 0xFF59, // FULLWIDTH LATIN SMALL LETTER Y + 0xA343: 0xFF5A, // FULLWIDTH LATIN SMALL LETTER Z + 0xA344: 0x0391, // GREEK CAPITAL LETTER ALPHA + 0xA345: 0x0392, // GREEK CAPITAL LETTER BETA + 0xA346: 0x0393, // GREEK CAPITAL LETTER GAMMA + 0xA347: 0x0394, // GREEK CAPITAL LETTER DELTA + 0xA348: 0x0395, // GREEK CAPITAL LETTER EPSILON + 0xA349: 0x0396, // GREEK CAPITAL LETTER ZETA + 0xA34A: 0x0397, // GREEK CAPITAL LETTER ETA + 0xA34B: 0x0398, // GREEK CAPITAL LETTER THETA + 0xA34C: 0x0399, // GREEK CAPITAL LETTER IOTA + 0xA34D: 0x039A, // GREEK CAPITAL LETTER KAPPA + 0xA34E: 0x039B, // GREEK CAPITAL LETTER LAMDA + 0xA34F: 0x039C, // GREEK CAPITAL LETTER MU + 0xA350: 0x039D, // GREEK CAPITAL LETTER NU + 0xA351: 0x039E, // GREEK CAPITAL LETTER XI + 0xA352: 0x039F, // GREEK CAPITAL LETTER OMICRON + 0xA353: 0x03A0, // GREEK CAPITAL LETTER PI + 0xA354: 0x03A1, // GREEK CAPITAL LETTER RHO + 0xA355: 0x03A3, // GREEK CAPITAL LETTER SIGMA + 0xA356: 0x03A4, // GREEK CAPITAL LETTER TAU + 0xA357: 0x03A5, // GREEK CAPITAL LETTER UPSILON + 0xA358: 0x03A6, // GREEK CAPITAL LETTER PHI + 0xA359: 0x03A7, // GREEK CAPITAL LETTER CHI + 0xA35A: 0x03A8, // GREEK CAPITAL LETTER PSI + 0xA35B: 0x03A9, // GREEK CAPITAL LETTER OMEGA + 0xA35C: 0x03B1, // GREEK SMALL LETTER ALPHA + 0xA35D: 0x03B2, // GREEK SMALL LETTER BETA + 0xA35E: 0x03B3, // GREEK SMALL LETTER GAMMA + 0xA35F: 0x03B4, // GREEK SMALL LETTER DELTA + 0xA360: 0x03B5, // GREEK SMALL LETTER EPSILON + 0xA361: 0x03B6, // GREEK SMALL LETTER ZETA + 0xA362: 0x03B7, // GREEK SMALL LETTER ETA + 0xA363: 0x03B8, // GREEK SMALL LETTER THETA + 0xA364: 0x03B9, // GREEK SMALL LETTER IOTA + 0xA365: 0x03BA, // GREEK SMALL LETTER KAPPA + 0xA366: 0x03BB, // GREEK SMALL LETTER LAMDA + 0xA367: 0x03BC, // GREEK SMALL LETTER MU + 0xA368: 0x03BD, // GREEK SMALL LETTER NU + 0xA369: 0x03BE, // GREEK SMALL LETTER XI + 0xA36A: 0x03BF, // GREEK SMALL LETTER OMICRON + 0xA36B: 0x03C0, // GREEK SMALL LETTER PI + 0xA36C: 0x03C1, // GREEK SMALL LETTER RHO + 0xA36D: 0x03C3, // GREEK SMALL LETTER SIGMA + 0xA36E: 0x03C4, // GREEK SMALL LETTER TAU + 0xA36F: 0x03C5, // GREEK SMALL LETTER UPSILON + 0xA370: 0x03C6, // GREEK SMALL LETTER PHI + 0xA371: 0x03C7, // GREEK SMALL LETTER CHI + 0xA372: 0x03C8, // GREEK SMALL LETTER PSI + 0xA373: 0x03C9, // GREEK SMALL LETTER OMEGA + 0xA374: 0x3105, // BOPOMOFO LETTER B + 0xA375: 0x3106, // BOPOMOFO LETTER P + 0xA376: 0x3107, // BOPOMOFO LETTER M + 0xA377: 0x3108, // BOPOMOFO LETTER F + 0xA378: 0x3109, // BOPOMOFO LETTER D + 0xA379: 0x310A, // BOPOMOFO LETTER T + 0xA37A: 0x310B, // BOPOMOFO LETTER N + 0xA37B: 0x310C, // BOPOMOFO LETTER L + 0xA37C: 0x310D, // BOPOMOFO LETTER G + 0xA37D: 0x310E, // BOPOMOFO LETTER K + 0xA37E: 0x310F, // BOPOMOFO LETTER H + 0xA3A1: 0x3110, // BOPOMOFO LETTER J + 0xA3A2: 0x3111, // BOPOMOFO LETTER Q + 0xA3A3: 0x3112, // BOPOMOFO LETTER X + 0xA3A4: 0x3113, // BOPOMOFO LETTER ZH + 0xA3A5: 0x3114, // BOPOMOFO LETTER CH + 0xA3A6: 0x3115, // BOPOMOFO LETTER SH + 0xA3A7: 0x3116, // BOPOMOFO LETTER R + 0xA3A8: 0x3117, // BOPOMOFO LETTER Z + 0xA3A9: 0x3118, // BOPOMOFO LETTER C + 0xA3AA: 0x3119, // BOPOMOFO LETTER S + 0xA3AB: 0x311A, // BOPOMOFO LETTER A + 0xA3AC: 0x311B, // BOPOMOFO LETTER O + 0xA3AD: 0x311C, // BOPOMOFO LETTER E + 0xA3AE: 0x311D, // BOPOMOFO LETTER EH + 0xA3AF: 0x311E, // BOPOMOFO LETTER AI + 0xA3B0: 0x311F, // BOPOMOFO LETTER EI + 0xA3B1: 0x3120, // BOPOMOFO LETTER AU + 0xA3B2: 0x3121, // BOPOMOFO LETTER OU + 0xA3B3: 0x3122, // BOPOMOFO LETTER AN + 0xA3B4: 0x3123, // BOPOMOFO LETTER EN + 0xA3B5: 0x3124, // BOPOMOFO LETTER ANG + 0xA3B6: 0x3125, // BOPOMOFO LETTER ENG + 0xA3B7: 0x3126, // BOPOMOFO LETTER ER + 0xA3B8: 0x3127, // BOPOMOFO LETTER I + 0xA3B9: 0x3128, // BOPOMOFO LETTER U + 0xA3BA: 0x3129, // BOPOMOFO LETTER IU + 0xA3BB: 0x02D9, // DOT ABOVE (Mandarin Chinese light tone) + 0xA3BC: 0x02C9, // MODIFIER LETTER MACRON (Mandarin Chinese first tone) + 0xA3BD: 0x02CA, // MODIFIER LETTER ACUTE ACCENT (Mandarin Chinese second tone) + 0xA3BE: 0x02C7, // CARON (Mandarin Chinese third tone) + 0xA3BF: 0x02CB, // MODIFIER LETTER GRAVE ACCENT (Mandarin Chinese fourth tone) + 0xA440: 0x4E00, + 0xA441: 0x4E59, + 0xA442: 0x4E01, + 0xA443: 0x4E03, + 0xA444: 0x4E43, + 0xA445: 0x4E5D, + 0xA446: 0x4E86, + 0xA447: 0x4E8C, + 0xA448: 0x4EBA, + 0xA449: 0x513F, + 0xA44A: 0x5165, + 0xA44B: 0x516B, + 0xA44C: 0x51E0, + 0xA44D: 0x5200, + 0xA44E: 0x5201, + 0xA44F: 0x529B, + 0xA450: 0x5315, + 0xA451: 0x5341, + 0xA452: 0x535C, + 0xA453: 0x53C8, + 0xA454: 0x4E09, + 0xA455: 0x4E0B, + 0xA456: 0x4E08, + 0xA457: 0x4E0A, + 0xA458: 0x4E2B, + 0xA459: 0x4E38, + 0xA45A: 0x51E1, + 0xA45B: 0x4E45, + 0xA45C: 0x4E48, + 0xA45D: 0x4E5F, + 0xA45E: 0x4E5E, + 0xA45F: 0x4E8E, + 0xA460: 0x4EA1, + 0xA461: 0x5140, + 0xA462: 0x5203, + 0xA463: 0x52FA, + 0xA464: 0x5343, + 0xA465: 0x53C9, + 0xA466: 0x53E3, + 0xA467: 0x571F, + 0xA468: 0x58EB, + 0xA469: 0x5915, + 0xA46A: 0x5927, + 0xA46B: 0x5973, + 0xA46C: 0x5B50, + 0xA46D: 0x5B51, + 0xA46E: 0x5B53, + 0xA46F: 0x5BF8, + 0xA470: 0x5C0F, + 0xA471: 0x5C22, + 0xA472: 0x5C38, + 0xA473: 0x5C71, + 0xA474: 0x5DDD, + 0xA475: 0x5DE5, + 0xA476: 0x5DF1, + 0xA477: 0x5DF2, + 0xA478: 0x5DF3, + 0xA479: 0x5DFE, + 0xA47A: 0x5E72, + 0xA47B: 0x5EFE, + 0xA47C: 0x5F0B, + 0xA47D: 0x5F13, + 0xA47E: 0x624D, + 0xA4A1: 0x4E11, + 0xA4A2: 0x4E10, + 0xA4A3: 0x4E0D, + 0xA4A4: 0x4E2D, + 0xA4A5: 0x4E30, + 0xA4A6: 0x4E39, + 0xA4A7: 0x4E4B, + 0xA4A8: 0x5C39, + 0xA4A9: 0x4E88, + 0xA4AA: 0x4E91, + 0xA4AB: 0x4E95, + 0xA4AC: 0x4E92, + 0xA4AD: 0x4E94, + 0xA4AE: 0x4EA2, + 0xA4AF: 0x4EC1, + 0xA4B0: 0x4EC0, + 0xA4B1: 0x4EC3, + 0xA4B2: 0x4EC6, + 0xA4B3: 0x4EC7, + 0xA4B4: 0x4ECD, + 0xA4B5: 0x4ECA, + 0xA4B6: 0x4ECB, + 0xA4B7: 0x4EC4, + 0xA4B8: 0x5143, + 0xA4B9: 0x5141, + 0xA4BA: 0x5167, + 0xA4BB: 0x516D, + 0xA4BC: 0x516E, + 0xA4BD: 0x516C, + 0xA4BE: 0x5197, + 0xA4BF: 0x51F6, + 0xA4C0: 0x5206, + 0xA4C1: 0x5207, + 0xA4C2: 0x5208, + 0xA4C3: 0x52FB, + 0xA4C4: 0x52FE, + 0xA4C5: 0x52FF, + 0xA4C6: 0x5316, + 0xA4C7: 0x5339, + 0xA4C8: 0x5348, + 0xA4C9: 0x5347, + 0xA4CA: 0x5345, + 0xA4CB: 0x535E, + 0xA4CC: 0x5384, + 0xA4CD: 0x53CB, + 0xA4CE: 0x53CA, + 0xA4CF: 0x53CD, + 0xA4D0: 0x58EC, + 0xA4D1: 0x5929, + 0xA4D2: 0x592B, + 0xA4D3: 0x592A, + 0xA4D4: 0x592D, + 0xA4D5: 0x5B54, + 0xA4D6: 0x5C11, + 0xA4D7: 0x5C24, + 0xA4D8: 0x5C3A, + 0xA4D9: 0x5C6F, + 0xA4DA: 0x5DF4, + 0xA4DB: 0x5E7B, + 0xA4DC: 0x5EFF, + 0xA4DD: 0x5F14, + 0xA4DE: 0x5F15, + 0xA4DF: 0x5FC3, + 0xA4E0: 0x6208, + 0xA4E1: 0x6236, + 0xA4E2: 0x624B, + 0xA4E3: 0x624E, + 0xA4E4: 0x652F, + 0xA4E5: 0x6587, + 0xA4E6: 0x6597, + 0xA4E7: 0x65A4, + 0xA4E8: 0x65B9, + 0xA4E9: 0x65E5, + 0xA4EA: 0x66F0, + 0xA4EB: 0x6708, + 0xA4EC: 0x6728, + 0xA4ED: 0x6B20, + 0xA4EE: 0x6B62, + 0xA4EF: 0x6B79, + 0xA4F0: 0x6BCB, + 0xA4F1: 0x6BD4, + 0xA4F2: 0x6BDB, + 0xA4F3: 0x6C0F, + 0xA4F4: 0x6C34, + 0xA4F5: 0x706B, + 0xA4F6: 0x722A, + 0xA4F7: 0x7236, + 0xA4F8: 0x723B, + 0xA4F9: 0x7247, + 0xA4FA: 0x7259, + 0xA4FB: 0x725B, + 0xA4FC: 0x72AC, + 0xA4FD: 0x738B, + 0xA4FE: 0x4E19, + 0xA540: 0x4E16, + 0xA541: 0x4E15, + 0xA542: 0x4E14, + 0xA543: 0x4E18, + 0xA544: 0x4E3B, + 0xA545: 0x4E4D, + 0xA546: 0x4E4F, + 0xA547: 0x4E4E, + 0xA548: 0x4EE5, + 0xA549: 0x4ED8, + 0xA54A: 0x4ED4, + 0xA54B: 0x4ED5, + 0xA54C: 0x4ED6, + 0xA54D: 0x4ED7, + 0xA54E: 0x4EE3, + 0xA54F: 0x4EE4, + 0xA550: 0x4ED9, + 0xA551: 0x4EDE, + 0xA552: 0x5145, + 0xA553: 0x5144, + 0xA554: 0x5189, + 0xA555: 0x518A, + 0xA556: 0x51AC, + 0xA557: 0x51F9, + 0xA558: 0x51FA, + 0xA559: 0x51F8, + 0xA55A: 0x520A, + 0xA55B: 0x52A0, + 0xA55C: 0x529F, + 0xA55D: 0x5305, + 0xA55E: 0x5306, + 0xA55F: 0x5317, + 0xA560: 0x531D, + 0xA561: 0x4EDF, + 0xA562: 0x534A, + 0xA563: 0x5349, + 0xA564: 0x5361, + 0xA565: 0x5360, + 0xA566: 0x536F, + 0xA567: 0x536E, + 0xA568: 0x53BB, + 0xA569: 0x53EF, + 0xA56A: 0x53E4, + 0xA56B: 0x53F3, + 0xA56C: 0x53EC, + 0xA56D: 0x53EE, + 0xA56E: 0x53E9, + 0xA56F: 0x53E8, + 0xA570: 0x53FC, + 0xA571: 0x53F8, + 0xA572: 0x53F5, + 0xA573: 0x53EB, + 0xA574: 0x53E6, + 0xA575: 0x53EA, + 0xA576: 0x53F2, + 0xA577: 0x53F1, + 0xA578: 0x53F0, + 0xA579: 0x53E5, + 0xA57A: 0x53ED, + 0xA57B: 0x53FB, + 0xA57C: 0x56DB, + 0xA57D: 0x56DA, + 0xA57E: 0x5916, + 0xA5A1: 0x592E, + 0xA5A2: 0x5931, + 0xA5A3: 0x5974, + 0xA5A4: 0x5976, + 0xA5A5: 0x5B55, + 0xA5A6: 0x5B83, + 0xA5A7: 0x5C3C, + 0xA5A8: 0x5DE8, + 0xA5A9: 0x5DE7, + 0xA5AA: 0x5DE6, + 0xA5AB: 0x5E02, + 0xA5AC: 0x5E03, + 0xA5AD: 0x5E73, + 0xA5AE: 0x5E7C, + 0xA5AF: 0x5F01, + 0xA5B0: 0x5F18, + 0xA5B1: 0x5F17, + 0xA5B2: 0x5FC5, + 0xA5B3: 0x620A, + 0xA5B4: 0x6253, + 0xA5B5: 0x6254, + 0xA5B6: 0x6252, + 0xA5B7: 0x6251, + 0xA5B8: 0x65A5, + 0xA5B9: 0x65E6, + 0xA5BA: 0x672E, + 0xA5BB: 0x672C, + 0xA5BC: 0x672A, + 0xA5BD: 0x672B, + 0xA5BE: 0x672D, + 0xA5BF: 0x6B63, + 0xA5C0: 0x6BCD, + 0xA5C1: 0x6C11, + 0xA5C2: 0x6C10, + 0xA5C3: 0x6C38, + 0xA5C4: 0x6C41, + 0xA5C5: 0x6C40, + 0xA5C6: 0x6C3E, + 0xA5C7: 0x72AF, + 0xA5C8: 0x7384, + 0xA5C9: 0x7389, + 0xA5CA: 0x74DC, + 0xA5CB: 0x74E6, + 0xA5CC: 0x7518, + 0xA5CD: 0x751F, + 0xA5CE: 0x7528, + 0xA5CF: 0x7529, + 0xA5D0: 0x7530, + 0xA5D1: 0x7531, + 0xA5D2: 0x7532, + 0xA5D3: 0x7533, + 0xA5D4: 0x758B, + 0xA5D5: 0x767D, + 0xA5D6: 0x76AE, + 0xA5D7: 0x76BF, + 0xA5D8: 0x76EE, + 0xA5D9: 0x77DB, + 0xA5DA: 0x77E2, + 0xA5DB: 0x77F3, + 0xA5DC: 0x793A, + 0xA5DD: 0x79BE, + 0xA5DE: 0x7A74, + 0xA5DF: 0x7ACB, + 0xA5E0: 0x4E1E, + 0xA5E1: 0x4E1F, + 0xA5E2: 0x4E52, + 0xA5E3: 0x4E53, + 0xA5E4: 0x4E69, + 0xA5E5: 0x4E99, + 0xA5E6: 0x4EA4, + 0xA5E7: 0x4EA6, + 0xA5E8: 0x4EA5, + 0xA5E9: 0x4EFF, + 0xA5EA: 0x4F09, + 0xA5EB: 0x4F19, + 0xA5EC: 0x4F0A, + 0xA5ED: 0x4F15, + 0xA5EE: 0x4F0D, + 0xA5EF: 0x4F10, + 0xA5F0: 0x4F11, + 0xA5F1: 0x4F0F, + 0xA5F2: 0x4EF2, + 0xA5F3: 0x4EF6, + 0xA5F4: 0x4EFB, + 0xA5F5: 0x4EF0, + 0xA5F6: 0x4EF3, + 0xA5F7: 0x4EFD, + 0xA5F8: 0x4F01, + 0xA5F9: 0x4F0B, + 0xA5FA: 0x5149, + 0xA5FB: 0x5147, + 0xA5FC: 0x5146, + 0xA5FD: 0x5148, + 0xA5FE: 0x5168, + 0xA640: 0x5171, + 0xA641: 0x518D, + 0xA642: 0x51B0, + 0xA643: 0x5217, + 0xA644: 0x5211, + 0xA645: 0x5212, + 0xA646: 0x520E, + 0xA647: 0x5216, + 0xA648: 0x52A3, + 0xA649: 0x5308, + 0xA64A: 0x5321, + 0xA64B: 0x5320, + 0xA64C: 0x5370, + 0xA64D: 0x5371, + 0xA64E: 0x5409, + 0xA64F: 0x540F, + 0xA650: 0x540C, + 0xA651: 0x540A, + 0xA652: 0x5410, + 0xA653: 0x5401, + 0xA654: 0x540B, + 0xA655: 0x5404, + 0xA656: 0x5411, + 0xA657: 0x540D, + 0xA658: 0x5408, + 0xA659: 0x5403, + 0xA65A: 0x540E, + 0xA65B: 0x5406, + 0xA65C: 0x5412, + 0xA65D: 0x56E0, + 0xA65E: 0x56DE, + 0xA65F: 0x56DD, + 0xA660: 0x5733, + 0xA661: 0x5730, + 0xA662: 0x5728, + 0xA663: 0x572D, + 0xA664: 0x572C, + 0xA665: 0x572F, + 0xA666: 0x5729, + 0xA667: 0x5919, + 0xA668: 0x591A, + 0xA669: 0x5937, + 0xA66A: 0x5938, + 0xA66B: 0x5984, + 0xA66C: 0x5978, + 0xA66D: 0x5983, + 0xA66E: 0x597D, + 0xA66F: 0x5979, + 0xA670: 0x5982, + 0xA671: 0x5981, + 0xA672: 0x5B57, + 0xA673: 0x5B58, + 0xA674: 0x5B87, + 0xA675: 0x5B88, + 0xA676: 0x5B85, + 0xA677: 0x5B89, + 0xA678: 0x5BFA, + 0xA679: 0x5C16, + 0xA67A: 0x5C79, + 0xA67B: 0x5DDE, + 0xA67C: 0x5E06, + 0xA67D: 0x5E76, + 0xA67E: 0x5E74, + 0xA6A1: 0x5F0F, + 0xA6A2: 0x5F1B, + 0xA6A3: 0x5FD9, + 0xA6A4: 0x5FD6, + 0xA6A5: 0x620E, + 0xA6A6: 0x620C, + 0xA6A7: 0x620D, + 0xA6A8: 0x6210, + 0xA6A9: 0x6263, + 0xA6AA: 0x625B, + 0xA6AB: 0x6258, + 0xA6AC: 0x6536, + 0xA6AD: 0x65E9, + 0xA6AE: 0x65E8, + 0xA6AF: 0x65EC, + 0xA6B0: 0x65ED, + 0xA6B1: 0x66F2, + 0xA6B2: 0x66F3, + 0xA6B3: 0x6709, + 0xA6B4: 0x673D, + 0xA6B5: 0x6734, + 0xA6B6: 0x6731, + 0xA6B7: 0x6735, + 0xA6B8: 0x6B21, + 0xA6B9: 0x6B64, + 0xA6BA: 0x6B7B, + 0xA6BB: 0x6C16, + 0xA6BC: 0x6C5D, + 0xA6BD: 0x6C57, + 0xA6BE: 0x6C59, + 0xA6BF: 0x6C5F, + 0xA6C0: 0x6C60, + 0xA6C1: 0x6C50, + 0xA6C2: 0x6C55, + 0xA6C3: 0x6C61, + 0xA6C4: 0x6C5B, + 0xA6C5: 0x6C4D, + 0xA6C6: 0x6C4E, + 0xA6C7: 0x7070, + 0xA6C8: 0x725F, + 0xA6C9: 0x725D, + 0xA6CA: 0x767E, + 0xA6CB: 0x7AF9, + 0xA6CC: 0x7C73, + 0xA6CD: 0x7CF8, + 0xA6CE: 0x7F36, + 0xA6CF: 0x7F8A, + 0xA6D0: 0x7FBD, + 0xA6D1: 0x8001, + 0xA6D2: 0x8003, + 0xA6D3: 0x800C, + 0xA6D4: 0x8012, + 0xA6D5: 0x8033, + 0xA6D6: 0x807F, + 0xA6D7: 0x8089, + 0xA6D8: 0x808B, + 0xA6D9: 0x808C, + 0xA6DA: 0x81E3, + 0xA6DB: 0x81EA, + 0xA6DC: 0x81F3, + 0xA6DD: 0x81FC, + 0xA6DE: 0x820C, + 0xA6DF: 0x821B, + 0xA6E0: 0x821F, + 0xA6E1: 0x826E, + 0xA6E2: 0x8272, + 0xA6E3: 0x827E, + 0xA6E4: 0x866B, + 0xA6E5: 0x8840, + 0xA6E6: 0x884C, + 0xA6E7: 0x8863, + 0xA6E8: 0x897F, + 0xA6E9: 0x9621, + 0xA6EA: 0x4E32, + 0xA6EB: 0x4EA8, + 0xA6EC: 0x4F4D, + 0xA6ED: 0x4F4F, + 0xA6EE: 0x4F47, + 0xA6EF: 0x4F57, + 0xA6F0: 0x4F5E, + 0xA6F1: 0x4F34, + 0xA6F2: 0x4F5B, + 0xA6F3: 0x4F55, + 0xA6F4: 0x4F30, + 0xA6F5: 0x4F50, + 0xA6F6: 0x4F51, + 0xA6F7: 0x4F3D, + 0xA6F8: 0x4F3A, + 0xA6F9: 0x4F38, + 0xA6FA: 0x4F43, + 0xA6FB: 0x4F54, + 0xA6FC: 0x4F3C, + 0xA6FD: 0x4F46, + 0xA6FE: 0x4F63, + 0xA740: 0x4F5C, + 0xA741: 0x4F60, + 0xA742: 0x4F2F, + 0xA743: 0x4F4E, + 0xA744: 0x4F36, + 0xA745: 0x4F59, + 0xA746: 0x4F5D, + 0xA747: 0x4F48, + 0xA748: 0x4F5A, + 0xA749: 0x514C, + 0xA74A: 0x514B, + 0xA74B: 0x514D, + 0xA74C: 0x5175, + 0xA74D: 0x51B6, + 0xA74E: 0x51B7, + 0xA74F: 0x5225, + 0xA750: 0x5224, + 0xA751: 0x5229, + 0xA752: 0x522A, + 0xA753: 0x5228, + 0xA754: 0x52AB, + 0xA755: 0x52A9, + 0xA756: 0x52AA, + 0xA757: 0x52AC, + 0xA758: 0x5323, + 0xA759: 0x5373, + 0xA75A: 0x5375, + 0xA75B: 0x541D, + 0xA75C: 0x542D, + 0xA75D: 0x541E, + 0xA75E: 0x543E, + 0xA75F: 0x5426, + 0xA760: 0x544E, + 0xA761: 0x5427, + 0xA762: 0x5446, + 0xA763: 0x5443, + 0xA764: 0x5433, + 0xA765: 0x5448, + 0xA766: 0x5442, + 0xA767: 0x541B, + 0xA768: 0x5429, + 0xA769: 0x544A, + 0xA76A: 0x5439, + 0xA76B: 0x543B, + 0xA76C: 0x5438, + 0xA76D: 0x542E, + 0xA76E: 0x5435, + 0xA76F: 0x5436, + 0xA770: 0x5420, + 0xA771: 0x543C, + 0xA772: 0x5440, + 0xA773: 0x5431, + 0xA774: 0x542B, + 0xA775: 0x541F, + 0xA776: 0x542C, + 0xA777: 0x56EA, + 0xA778: 0x56F0, + 0xA779: 0x56E4, + 0xA77A: 0x56EB, + 0xA77B: 0x574A, + 0xA77C: 0x5751, + 0xA77D: 0x5740, + 0xA77E: 0x574D, + 0xA7A1: 0x5747, + 0xA7A2: 0x574E, + 0xA7A3: 0x573E, + 0xA7A4: 0x5750, + 0xA7A5: 0x574F, + 0xA7A6: 0x573B, + 0xA7A7: 0x58EF, + 0xA7A8: 0x593E, + 0xA7A9: 0x599D, + 0xA7AA: 0x5992, + 0xA7AB: 0x59A8, + 0xA7AC: 0x599E, + 0xA7AD: 0x59A3, + 0xA7AE: 0x5999, + 0xA7AF: 0x5996, + 0xA7B0: 0x598D, + 0xA7B1: 0x59A4, + 0xA7B2: 0x5993, + 0xA7B3: 0x598A, + 0xA7B4: 0x59A5, + 0xA7B5: 0x5B5D, + 0xA7B6: 0x5B5C, + 0xA7B7: 0x5B5A, + 0xA7B8: 0x5B5B, + 0xA7B9: 0x5B8C, + 0xA7BA: 0x5B8B, + 0xA7BB: 0x5B8F, + 0xA7BC: 0x5C2C, + 0xA7BD: 0x5C40, + 0xA7BE: 0x5C41, + 0xA7BF: 0x5C3F, + 0xA7C0: 0x5C3E, + 0xA7C1: 0x5C90, + 0xA7C2: 0x5C91, + 0xA7C3: 0x5C94, + 0xA7C4: 0x5C8C, + 0xA7C5: 0x5DEB, + 0xA7C6: 0x5E0C, + 0xA7C7: 0x5E8F, + 0xA7C8: 0x5E87, + 0xA7C9: 0x5E8A, + 0xA7CA: 0x5EF7, + 0xA7CB: 0x5F04, + 0xA7CC: 0x5F1F, + 0xA7CD: 0x5F64, + 0xA7CE: 0x5F62, + 0xA7CF: 0x5F77, + 0xA7D0: 0x5F79, + 0xA7D1: 0x5FD8, + 0xA7D2: 0x5FCC, + 0xA7D3: 0x5FD7, + 0xA7D4: 0x5FCD, + 0xA7D5: 0x5FF1, + 0xA7D6: 0x5FEB, + 0xA7D7: 0x5FF8, + 0xA7D8: 0x5FEA, + 0xA7D9: 0x6212, + 0xA7DA: 0x6211, + 0xA7DB: 0x6284, + 0xA7DC: 0x6297, + 0xA7DD: 0x6296, + 0xA7DE: 0x6280, + 0xA7DF: 0x6276, + 0xA7E0: 0x6289, + 0xA7E1: 0x626D, + 0xA7E2: 0x628A, + 0xA7E3: 0x627C, + 0xA7E4: 0x627E, + 0xA7E5: 0x6279, + 0xA7E6: 0x6273, + 0xA7E7: 0x6292, + 0xA7E8: 0x626F, + 0xA7E9: 0x6298, + 0xA7EA: 0x626E, + 0xA7EB: 0x6295, + 0xA7EC: 0x6293, + 0xA7ED: 0x6291, + 0xA7EE: 0x6286, + 0xA7EF: 0x6539, + 0xA7F0: 0x653B, + 0xA7F1: 0x6538, + 0xA7F2: 0x65F1, + 0xA7F3: 0x66F4, + 0xA7F4: 0x675F, + 0xA7F5: 0x674E, + 0xA7F6: 0x674F, + 0xA7F7: 0x6750, + 0xA7F8: 0x6751, + 0xA7F9: 0x675C, + 0xA7FA: 0x6756, + 0xA7FB: 0x675E, + 0xA7FC: 0x6749, + 0xA7FD: 0x6746, + 0xA7FE: 0x6760, + 0xA840: 0x6753, + 0xA841: 0x6757, + 0xA842: 0x6B65, + 0xA843: 0x6BCF, + 0xA844: 0x6C42, + 0xA845: 0x6C5E, + 0xA846: 0x6C99, + 0xA847: 0x6C81, + 0xA848: 0x6C88, + 0xA849: 0x6C89, + 0xA84A: 0x6C85, + 0xA84B: 0x6C9B, + 0xA84C: 0x6C6A, + 0xA84D: 0x6C7A, + 0xA84E: 0x6C90, + 0xA84F: 0x6C70, + 0xA850: 0x6C8C, + 0xA851: 0x6C68, + 0xA852: 0x6C96, + 0xA853: 0x6C92, + 0xA854: 0x6C7D, + 0xA855: 0x6C83, + 0xA856: 0x6C72, + 0xA857: 0x6C7E, + 0xA858: 0x6C74, + 0xA859: 0x6C86, + 0xA85A: 0x6C76, + 0xA85B: 0x6C8D, + 0xA85C: 0x6C94, + 0xA85D: 0x6C98, + 0xA85E: 0x6C82, + 0xA85F: 0x7076, + 0xA860: 0x707C, + 0xA861: 0x707D, + 0xA862: 0x7078, + 0xA863: 0x7262, + 0xA864: 0x7261, + 0xA865: 0x7260, + 0xA866: 0x72C4, + 0xA867: 0x72C2, + 0xA868: 0x7396, + 0xA869: 0x752C, + 0xA86A: 0x752B, + 0xA86B: 0x7537, + 0xA86C: 0x7538, + 0xA86D: 0x7682, + 0xA86E: 0x76EF, + 0xA86F: 0x77E3, + 0xA870: 0x79C1, + 0xA871: 0x79C0, + 0xA872: 0x79BF, + 0xA873: 0x7A76, + 0xA874: 0x7CFB, + 0xA875: 0x7F55, + 0xA876: 0x8096, + 0xA877: 0x8093, + 0xA878: 0x809D, + 0xA879: 0x8098, + 0xA87A: 0x809B, + 0xA87B: 0x809A, + 0xA87C: 0x80B2, + 0xA87D: 0x826F, + 0xA87E: 0x8292, + 0xA8A1: 0x828B, + 0xA8A2: 0x828D, + 0xA8A3: 0x898B, + 0xA8A4: 0x89D2, + 0xA8A5: 0x8A00, + 0xA8A6: 0x8C37, + 0xA8A7: 0x8C46, + 0xA8A8: 0x8C55, + 0xA8A9: 0x8C9D, + 0xA8AA: 0x8D64, + 0xA8AB: 0x8D70, + 0xA8AC: 0x8DB3, + 0xA8AD: 0x8EAB, + 0xA8AE: 0x8ECA, + 0xA8AF: 0x8F9B, + 0xA8B0: 0x8FB0, + 0xA8B1: 0x8FC2, + 0xA8B2: 0x8FC6, + 0xA8B3: 0x8FC5, + 0xA8B4: 0x8FC4, + 0xA8B5: 0x5DE1, + 0xA8B6: 0x9091, + 0xA8B7: 0x90A2, + 0xA8B8: 0x90AA, + 0xA8B9: 0x90A6, + 0xA8BA: 0x90A3, + 0xA8BB: 0x9149, + 0xA8BC: 0x91C6, + 0xA8BD: 0x91CC, + 0xA8BE: 0x9632, + 0xA8BF: 0x962E, + 0xA8C0: 0x9631, + 0xA8C1: 0x962A, + 0xA8C2: 0x962C, + 0xA8C3: 0x4E26, + 0xA8C4: 0x4E56, + 0xA8C5: 0x4E73, + 0xA8C6: 0x4E8B, + 0xA8C7: 0x4E9B, + 0xA8C8: 0x4E9E, + 0xA8C9: 0x4EAB, + 0xA8CA: 0x4EAC, + 0xA8CB: 0x4F6F, + 0xA8CC: 0x4F9D, + 0xA8CD: 0x4F8D, + 0xA8CE: 0x4F73, + 0xA8CF: 0x4F7F, + 0xA8D0: 0x4F6C, + 0xA8D1: 0x4F9B, + 0xA8D2: 0x4F8B, + 0xA8D3: 0x4F86, + 0xA8D4: 0x4F83, + 0xA8D5: 0x4F70, + 0xA8D6: 0x4F75, + 0xA8D7: 0x4F88, + 0xA8D8: 0x4F69, + 0xA8D9: 0x4F7B, + 0xA8DA: 0x4F96, + 0xA8DB: 0x4F7E, + 0xA8DC: 0x4F8F, + 0xA8DD: 0x4F91, + 0xA8DE: 0x4F7A, + 0xA8DF: 0x5154, + 0xA8E0: 0x5152, + 0xA8E1: 0x5155, + 0xA8E2: 0x5169, + 0xA8E3: 0x5177, + 0xA8E4: 0x5176, + 0xA8E5: 0x5178, + 0xA8E6: 0x51BD, + 0xA8E7: 0x51FD, + 0xA8E8: 0x523B, + 0xA8E9: 0x5238, + 0xA8EA: 0x5237, + 0xA8EB: 0x523A, + 0xA8EC: 0x5230, + 0xA8ED: 0x522E, + 0xA8EE: 0x5236, + 0xA8EF: 0x5241, + 0xA8F0: 0x52BE, + 0xA8F1: 0x52BB, + 0xA8F2: 0x5352, + 0xA8F3: 0x5354, + 0xA8F4: 0x5353, + 0xA8F5: 0x5351, + 0xA8F6: 0x5366, + 0xA8F7: 0x5377, + 0xA8F8: 0x5378, + 0xA8F9: 0x5379, + 0xA8FA: 0x53D6, + 0xA8FB: 0x53D4, + 0xA8FC: 0x53D7, + 0xA8FD: 0x5473, + 0xA8FE: 0x5475, + 0xA940: 0x5496, + 0xA941: 0x5478, + 0xA942: 0x5495, + 0xA943: 0x5480, + 0xA944: 0x547B, + 0xA945: 0x5477, + 0xA946: 0x5484, + 0xA947: 0x5492, + 0xA948: 0x5486, + 0xA949: 0x547C, + 0xA94A: 0x5490, + 0xA94B: 0x5471, + 0xA94C: 0x5476, + 0xA94D: 0x548C, + 0xA94E: 0x549A, + 0xA94F: 0x5462, + 0xA950: 0x5468, + 0xA951: 0x548B, + 0xA952: 0x547D, + 0xA953: 0x548E, + 0xA954: 0x56FA, + 0xA955: 0x5783, + 0xA956: 0x5777, + 0xA957: 0x576A, + 0xA958: 0x5769, + 0xA959: 0x5761, + 0xA95A: 0x5766, + 0xA95B: 0x5764, + 0xA95C: 0x577C, + 0xA95D: 0x591C, + 0xA95E: 0x5949, + 0xA95F: 0x5947, + 0xA960: 0x5948, + 0xA961: 0x5944, + 0xA962: 0x5954, + 0xA963: 0x59BE, + 0xA964: 0x59BB, + 0xA965: 0x59D4, + 0xA966: 0x59B9, + 0xA967: 0x59AE, + 0xA968: 0x59D1, + 0xA969: 0x59C6, + 0xA96A: 0x59D0, + 0xA96B: 0x59CD, + 0xA96C: 0x59CB, + 0xA96D: 0x59D3, + 0xA96E: 0x59CA, + 0xA96F: 0x59AF, + 0xA970: 0x59B3, + 0xA971: 0x59D2, + 0xA972: 0x59C5, + 0xA973: 0x5B5F, + 0xA974: 0x5B64, + 0xA975: 0x5B63, + 0xA976: 0x5B97, + 0xA977: 0x5B9A, + 0xA978: 0x5B98, + 0xA979: 0x5B9C, + 0xA97A: 0x5B99, + 0xA97B: 0x5B9B, + 0xA97C: 0x5C1A, + 0xA97D: 0x5C48, + 0xA97E: 0x5C45, + 0xA9A1: 0x5C46, + 0xA9A2: 0x5CB7, + 0xA9A3: 0x5CA1, + 0xA9A4: 0x5CB8, + 0xA9A5: 0x5CA9, + 0xA9A6: 0x5CAB, + 0xA9A7: 0x5CB1, + 0xA9A8: 0x5CB3, + 0xA9A9: 0x5E18, + 0xA9AA: 0x5E1A, + 0xA9AB: 0x5E16, + 0xA9AC: 0x5E15, + 0xA9AD: 0x5E1B, + 0xA9AE: 0x5E11, + 0xA9AF: 0x5E78, + 0xA9B0: 0x5E9A, + 0xA9B1: 0x5E97, + 0xA9B2: 0x5E9C, + 0xA9B3: 0x5E95, + 0xA9B4: 0x5E96, + 0xA9B5: 0x5EF6, + 0xA9B6: 0x5F26, + 0xA9B7: 0x5F27, + 0xA9B8: 0x5F29, + 0xA9B9: 0x5F80, + 0xA9BA: 0x5F81, + 0xA9BB: 0x5F7F, + 0xA9BC: 0x5F7C, + 0xA9BD: 0x5FDD, + 0xA9BE: 0x5FE0, + 0xA9BF: 0x5FFD, + 0xA9C0: 0x5FF5, + 0xA9C1: 0x5FFF, + 0xA9C2: 0x600F, + 0xA9C3: 0x6014, + 0xA9C4: 0x602F, + 0xA9C5: 0x6035, + 0xA9C6: 0x6016, + 0xA9C7: 0x602A, + 0xA9C8: 0x6015, + 0xA9C9: 0x6021, + 0xA9CA: 0x6027, + 0xA9CB: 0x6029, + 0xA9CC: 0x602B, + 0xA9CD: 0x601B, + 0xA9CE: 0x6216, + 0xA9CF: 0x6215, + 0xA9D0: 0x623F, + 0xA9D1: 0x623E, + 0xA9D2: 0x6240, + 0xA9D3: 0x627F, + 0xA9D4: 0x62C9, + 0xA9D5: 0x62CC, + 0xA9D6: 0x62C4, + 0xA9D7: 0x62BF, + 0xA9D8: 0x62C2, + 0xA9D9: 0x62B9, + 0xA9DA: 0x62D2, + 0xA9DB: 0x62DB, + 0xA9DC: 0x62AB, + 0xA9DD: 0x62D3, + 0xA9DE: 0x62D4, + 0xA9DF: 0x62CB, + 0xA9E0: 0x62C8, + 0xA9E1: 0x62A8, + 0xA9E2: 0x62BD, + 0xA9E3: 0x62BC, + 0xA9E4: 0x62D0, + 0xA9E5: 0x62D9, + 0xA9E6: 0x62C7, + 0xA9E7: 0x62CD, + 0xA9E8: 0x62B5, + 0xA9E9: 0x62DA, + 0xA9EA: 0x62B1, + 0xA9EB: 0x62D8, + 0xA9EC: 0x62D6, + 0xA9ED: 0x62D7, + 0xA9EE: 0x62C6, + 0xA9EF: 0x62AC, + 0xA9F0: 0x62CE, + 0xA9F1: 0x653E, + 0xA9F2: 0x65A7, + 0xA9F3: 0x65BC, + 0xA9F4: 0x65FA, + 0xA9F5: 0x6614, + 0xA9F6: 0x6613, + 0xA9F7: 0x660C, + 0xA9F8: 0x6606, + 0xA9F9: 0x6602, + 0xA9FA: 0x660E, + 0xA9FB: 0x6600, + 0xA9FC: 0x660F, + 0xA9FD: 0x6615, + 0xA9FE: 0x660A, + 0xAA40: 0x6607, + 0xAA41: 0x670D, + 0xAA42: 0x670B, + 0xAA43: 0x676D, + 0xAA44: 0x678B, + 0xAA45: 0x6795, + 0xAA46: 0x6771, + 0xAA47: 0x679C, + 0xAA48: 0x6773, + 0xAA49: 0x6777, + 0xAA4A: 0x6787, + 0xAA4B: 0x679D, + 0xAA4C: 0x6797, + 0xAA4D: 0x676F, + 0xAA4E: 0x6770, + 0xAA4F: 0x677F, + 0xAA50: 0x6789, + 0xAA51: 0x677E, + 0xAA52: 0x6790, + 0xAA53: 0x6775, + 0xAA54: 0x679A, + 0xAA55: 0x6793, + 0xAA56: 0x677C, + 0xAA57: 0x676A, + 0xAA58: 0x6772, + 0xAA59: 0x6B23, + 0xAA5A: 0x6B66, + 0xAA5B: 0x6B67, + 0xAA5C: 0x6B7F, + 0xAA5D: 0x6C13, + 0xAA5E: 0x6C1B, + 0xAA5F: 0x6CE3, + 0xAA60: 0x6CE8, + 0xAA61: 0x6CF3, + 0xAA62: 0x6CB1, + 0xAA63: 0x6CCC, + 0xAA64: 0x6CE5, + 0xAA65: 0x6CB3, + 0xAA66: 0x6CBD, + 0xAA67: 0x6CBE, + 0xAA68: 0x6CBC, + 0xAA69: 0x6CE2, + 0xAA6A: 0x6CAB, + 0xAA6B: 0x6CD5, + 0xAA6C: 0x6CD3, + 0xAA6D: 0x6CB8, + 0xAA6E: 0x6CC4, + 0xAA6F: 0x6CB9, + 0xAA70: 0x6CC1, + 0xAA71: 0x6CAE, + 0xAA72: 0x6CD7, + 0xAA73: 0x6CC5, + 0xAA74: 0x6CF1, + 0xAA75: 0x6CBF, + 0xAA76: 0x6CBB, + 0xAA77: 0x6CE1, + 0xAA78: 0x6CDB, + 0xAA79: 0x6CCA, + 0xAA7A: 0x6CAC, + 0xAA7B: 0x6CEF, + 0xAA7C: 0x6CDC, + 0xAA7D: 0x6CD6, + 0xAA7E: 0x6CE0, + 0xAAA1: 0x7095, + 0xAAA2: 0x708E, + 0xAAA3: 0x7092, + 0xAAA4: 0x708A, + 0xAAA5: 0x7099, + 0xAAA6: 0x722C, + 0xAAA7: 0x722D, + 0xAAA8: 0x7238, + 0xAAA9: 0x7248, + 0xAAAA: 0x7267, + 0xAAAB: 0x7269, + 0xAAAC: 0x72C0, + 0xAAAD: 0x72CE, + 0xAAAE: 0x72D9, + 0xAAAF: 0x72D7, + 0xAAB0: 0x72D0, + 0xAAB1: 0x73A9, + 0xAAB2: 0x73A8, + 0xAAB3: 0x739F, + 0xAAB4: 0x73AB, + 0xAAB5: 0x73A5, + 0xAAB6: 0x753D, + 0xAAB7: 0x759D, + 0xAAB8: 0x7599, + 0xAAB9: 0x759A, + 0xAABA: 0x7684, + 0xAABB: 0x76C2, + 0xAABC: 0x76F2, + 0xAABD: 0x76F4, + 0xAABE: 0x77E5, + 0xAABF: 0x77FD, + 0xAAC0: 0x793E, + 0xAAC1: 0x7940, + 0xAAC2: 0x7941, + 0xAAC3: 0x79C9, + 0xAAC4: 0x79C8, + 0xAAC5: 0x7A7A, + 0xAAC6: 0x7A79, + 0xAAC7: 0x7AFA, + 0xAAC8: 0x7CFE, + 0xAAC9: 0x7F54, + 0xAACA: 0x7F8C, + 0xAACB: 0x7F8B, + 0xAACC: 0x8005, + 0xAACD: 0x80BA, + 0xAACE: 0x80A5, + 0xAACF: 0x80A2, + 0xAAD0: 0x80B1, + 0xAAD1: 0x80A1, + 0xAAD2: 0x80AB, + 0xAAD3: 0x80A9, + 0xAAD4: 0x80B4, + 0xAAD5: 0x80AA, + 0xAAD6: 0x80AF, + 0xAAD7: 0x81E5, + 0xAAD8: 0x81FE, + 0xAAD9: 0x820D, + 0xAADA: 0x82B3, + 0xAADB: 0x829D, + 0xAADC: 0x8299, + 0xAADD: 0x82AD, + 0xAADE: 0x82BD, + 0xAADF: 0x829F, + 0xAAE0: 0x82B9, + 0xAAE1: 0x82B1, + 0xAAE2: 0x82AC, + 0xAAE3: 0x82A5, + 0xAAE4: 0x82AF, + 0xAAE5: 0x82B8, + 0xAAE6: 0x82A3, + 0xAAE7: 0x82B0, + 0xAAE8: 0x82BE, + 0xAAE9: 0x82B7, + 0xAAEA: 0x864E, + 0xAAEB: 0x8671, + 0xAAEC: 0x521D, + 0xAAED: 0x8868, + 0xAAEE: 0x8ECB, + 0xAAEF: 0x8FCE, + 0xAAF0: 0x8FD4, + 0xAAF1: 0x8FD1, + 0xAAF2: 0x90B5, + 0xAAF3: 0x90B8, + 0xAAF4: 0x90B1, + 0xAAF5: 0x90B6, + 0xAAF6: 0x91C7, + 0xAAF7: 0x91D1, + 0xAAF8: 0x9577, + 0xAAF9: 0x9580, + 0xAAFA: 0x961C, + 0xAAFB: 0x9640, + 0xAAFC: 0x963F, + 0xAAFD: 0x963B, + 0xAAFE: 0x9644, + 0xAB40: 0x9642, + 0xAB41: 0x96B9, + 0xAB42: 0x96E8, + 0xAB43: 0x9752, + 0xAB44: 0x975E, + 0xAB45: 0x4E9F, + 0xAB46: 0x4EAD, + 0xAB47: 0x4EAE, + 0xAB48: 0x4FE1, + 0xAB49: 0x4FB5, + 0xAB4A: 0x4FAF, + 0xAB4B: 0x4FBF, + 0xAB4C: 0x4FE0, + 0xAB4D: 0x4FD1, + 0xAB4E: 0x4FCF, + 0xAB4F: 0x4FDD, + 0xAB50: 0x4FC3, + 0xAB51: 0x4FB6, + 0xAB52: 0x4FD8, + 0xAB53: 0x4FDF, + 0xAB54: 0x4FCA, + 0xAB55: 0x4FD7, + 0xAB56: 0x4FAE, + 0xAB57: 0x4FD0, + 0xAB58: 0x4FC4, + 0xAB59: 0x4FC2, + 0xAB5A: 0x4FDA, + 0xAB5B: 0x4FCE, + 0xAB5C: 0x4FDE, + 0xAB5D: 0x4FB7, + 0xAB5E: 0x5157, + 0xAB5F: 0x5192, + 0xAB60: 0x5191, + 0xAB61: 0x51A0, + 0xAB62: 0x524E, + 0xAB63: 0x5243, + 0xAB64: 0x524A, + 0xAB65: 0x524D, + 0xAB66: 0x524C, + 0xAB67: 0x524B, + 0xAB68: 0x5247, + 0xAB69: 0x52C7, + 0xAB6A: 0x52C9, + 0xAB6B: 0x52C3, + 0xAB6C: 0x52C1, + 0xAB6D: 0x530D, + 0xAB6E: 0x5357, + 0xAB6F: 0x537B, + 0xAB70: 0x539A, + 0xAB71: 0x53DB, + 0xAB72: 0x54AC, + 0xAB73: 0x54C0, + 0xAB74: 0x54A8, + 0xAB75: 0x54CE, + 0xAB76: 0x54C9, + 0xAB77: 0x54B8, + 0xAB78: 0x54A6, + 0xAB79: 0x54B3, + 0xAB7A: 0x54C7, + 0xAB7B: 0x54C2, + 0xAB7C: 0x54BD, + 0xAB7D: 0x54AA, + 0xAB7E: 0x54C1, + 0xABA1: 0x54C4, + 0xABA2: 0x54C8, + 0xABA3: 0x54AF, + 0xABA4: 0x54AB, + 0xABA5: 0x54B1, + 0xABA6: 0x54BB, + 0xABA7: 0x54A9, + 0xABA8: 0x54A7, + 0xABA9: 0x54BF, + 0xABAA: 0x56FF, + 0xABAB: 0x5782, + 0xABAC: 0x578B, + 0xABAD: 0x57A0, + 0xABAE: 0x57A3, + 0xABAF: 0x57A2, + 0xABB0: 0x57CE, + 0xABB1: 0x57AE, + 0xABB2: 0x5793, + 0xABB3: 0x5955, + 0xABB4: 0x5951, + 0xABB5: 0x594F, + 0xABB6: 0x594E, + 0xABB7: 0x5950, + 0xABB8: 0x59DC, + 0xABB9: 0x59D8, + 0xABBA: 0x59FF, + 0xABBB: 0x59E3, + 0xABBC: 0x59E8, + 0xABBD: 0x5A03, + 0xABBE: 0x59E5, + 0xABBF: 0x59EA, + 0xABC0: 0x59DA, + 0xABC1: 0x59E6, + 0xABC2: 0x5A01, + 0xABC3: 0x59FB, + 0xABC4: 0x5B69, + 0xABC5: 0x5BA3, + 0xABC6: 0x5BA6, + 0xABC7: 0x5BA4, + 0xABC8: 0x5BA2, + 0xABC9: 0x5BA5, + 0xABCA: 0x5C01, + 0xABCB: 0x5C4E, + 0xABCC: 0x5C4F, + 0xABCD: 0x5C4D, + 0xABCE: 0x5C4B, + 0xABCF: 0x5CD9, + 0xABD0: 0x5CD2, + 0xABD1: 0x5DF7, + 0xABD2: 0x5E1D, + 0xABD3: 0x5E25, + 0xABD4: 0x5E1F, + 0xABD5: 0x5E7D, + 0xABD6: 0x5EA0, + 0xABD7: 0x5EA6, + 0xABD8: 0x5EFA, + 0xABD9: 0x5F08, + 0xABDA: 0x5F2D, + 0xABDB: 0x5F65, + 0xABDC: 0x5F88, + 0xABDD: 0x5F85, + 0xABDE: 0x5F8A, + 0xABDF: 0x5F8B, + 0xABE0: 0x5F87, + 0xABE1: 0x5F8C, + 0xABE2: 0x5F89, + 0xABE3: 0x6012, + 0xABE4: 0x601D, + 0xABE5: 0x6020, + 0xABE6: 0x6025, + 0xABE7: 0x600E, + 0xABE8: 0x6028, + 0xABE9: 0x604D, + 0xABEA: 0x6070, + 0xABEB: 0x6068, + 0xABEC: 0x6062, + 0xABED: 0x6046, + 0xABEE: 0x6043, + 0xABEF: 0x606C, + 0xABF0: 0x606B, + 0xABF1: 0x606A, + 0xABF2: 0x6064, + 0xABF3: 0x6241, + 0xABF4: 0x62DC, + 0xABF5: 0x6316, + 0xABF6: 0x6309, + 0xABF7: 0x62FC, + 0xABF8: 0x62ED, + 0xABF9: 0x6301, + 0xABFA: 0x62EE, + 0xABFB: 0x62FD, + 0xABFC: 0x6307, + 0xABFD: 0x62F1, + 0xABFE: 0x62F7, + 0xAC40: 0x62EF, + 0xAC41: 0x62EC, + 0xAC42: 0x62FE, + 0xAC43: 0x62F4, + 0xAC44: 0x6311, + 0xAC45: 0x6302, + 0xAC46: 0x653F, + 0xAC47: 0x6545, + 0xAC48: 0x65AB, + 0xAC49: 0x65BD, + 0xAC4A: 0x65E2, + 0xAC4B: 0x6625, + 0xAC4C: 0x662D, + 0xAC4D: 0x6620, + 0xAC4E: 0x6627, + 0xAC4F: 0x662F, + 0xAC50: 0x661F, + 0xAC51: 0x6628, + 0xAC52: 0x6631, + 0xAC53: 0x6624, + 0xAC54: 0x66F7, + 0xAC55: 0x67FF, + 0xAC56: 0x67D3, + 0xAC57: 0x67F1, + 0xAC58: 0x67D4, + 0xAC59: 0x67D0, + 0xAC5A: 0x67EC, + 0xAC5B: 0x67B6, + 0xAC5C: 0x67AF, + 0xAC5D: 0x67F5, + 0xAC5E: 0x67E9, + 0xAC5F: 0x67EF, + 0xAC60: 0x67C4, + 0xAC61: 0x67D1, + 0xAC62: 0x67B4, + 0xAC63: 0x67DA, + 0xAC64: 0x67E5, + 0xAC65: 0x67B8, + 0xAC66: 0x67CF, + 0xAC67: 0x67DE, + 0xAC68: 0x67F3, + 0xAC69: 0x67B0, + 0xAC6A: 0x67D9, + 0xAC6B: 0x67E2, + 0xAC6C: 0x67DD, + 0xAC6D: 0x67D2, + 0xAC6E: 0x6B6A, + 0xAC6F: 0x6B83, + 0xAC70: 0x6B86, + 0xAC71: 0x6BB5, + 0xAC72: 0x6BD2, + 0xAC73: 0x6BD7, + 0xAC74: 0x6C1F, + 0xAC75: 0x6CC9, + 0xAC76: 0x6D0B, + 0xAC77: 0x6D32, + 0xAC78: 0x6D2A, + 0xAC79: 0x6D41, + 0xAC7A: 0x6D25, + 0xAC7B: 0x6D0C, + 0xAC7C: 0x6D31, + 0xAC7D: 0x6D1E, + 0xAC7E: 0x6D17, + 0xACA1: 0x6D3B, + 0xACA2: 0x6D3D, + 0xACA3: 0x6D3E, + 0xACA4: 0x6D36, + 0xACA5: 0x6D1B, + 0xACA6: 0x6CF5, + 0xACA7: 0x6D39, + 0xACA8: 0x6D27, + 0xACA9: 0x6D38, + 0xACAA: 0x6D29, + 0xACAB: 0x6D2E, + 0xACAC: 0x6D35, + 0xACAD: 0x6D0E, + 0xACAE: 0x6D2B, + 0xACAF: 0x70AB, + 0xACB0: 0x70BA, + 0xACB1: 0x70B3, + 0xACB2: 0x70AC, + 0xACB3: 0x70AF, + 0xACB4: 0x70AD, + 0xACB5: 0x70B8, + 0xACB6: 0x70AE, + 0xACB7: 0x70A4, + 0xACB8: 0x7230, + 0xACB9: 0x7272, + 0xACBA: 0x726F, + 0xACBB: 0x7274, + 0xACBC: 0x72E9, + 0xACBD: 0x72E0, + 0xACBE: 0x72E1, + 0xACBF: 0x73B7, + 0xACC0: 0x73CA, + 0xACC1: 0x73BB, + 0xACC2: 0x73B2, + 0xACC3: 0x73CD, + 0xACC4: 0x73C0, + 0xACC5: 0x73B3, + 0xACC6: 0x751A, + 0xACC7: 0x752D, + 0xACC8: 0x754F, + 0xACC9: 0x754C, + 0xACCA: 0x754E, + 0xACCB: 0x754B, + 0xACCC: 0x75AB, + 0xACCD: 0x75A4, + 0xACCE: 0x75A5, + 0xACCF: 0x75A2, + 0xACD0: 0x75A3, + 0xACD1: 0x7678, + 0xACD2: 0x7686, + 0xACD3: 0x7687, + 0xACD4: 0x7688, + 0xACD5: 0x76C8, + 0xACD6: 0x76C6, + 0xACD7: 0x76C3, + 0xACD8: 0x76C5, + 0xACD9: 0x7701, + 0xACDA: 0x76F9, + 0xACDB: 0x76F8, + 0xACDC: 0x7709, + 0xACDD: 0x770B, + 0xACDE: 0x76FE, + 0xACDF: 0x76FC, + 0xACE0: 0x7707, + 0xACE1: 0x77DC, + 0xACE2: 0x7802, + 0xACE3: 0x7814, + 0xACE4: 0x780C, + 0xACE5: 0x780D, + 0xACE6: 0x7946, + 0xACE7: 0x7949, + 0xACE8: 0x7948, + 0xACE9: 0x7947, + 0xACEA: 0x79B9, + 0xACEB: 0x79BA, + 0xACEC: 0x79D1, + 0xACED: 0x79D2, + 0xACEE: 0x79CB, + 0xACEF: 0x7A7F, + 0xACF0: 0x7A81, + 0xACF1: 0x7AFF, + 0xACF2: 0x7AFD, + 0xACF3: 0x7C7D, + 0xACF4: 0x7D02, + 0xACF5: 0x7D05, + 0xACF6: 0x7D00, + 0xACF7: 0x7D09, + 0xACF8: 0x7D07, + 0xACF9: 0x7D04, + 0xACFA: 0x7D06, + 0xACFB: 0x7F38, + 0xACFC: 0x7F8E, + 0xACFD: 0x7FBF, + 0xACFE: 0x8004, + 0xAD40: 0x8010, + 0xAD41: 0x800D, + 0xAD42: 0x8011, + 0xAD43: 0x8036, + 0xAD44: 0x80D6, + 0xAD45: 0x80E5, + 0xAD46: 0x80DA, + 0xAD47: 0x80C3, + 0xAD48: 0x80C4, + 0xAD49: 0x80CC, + 0xAD4A: 0x80E1, + 0xAD4B: 0x80DB, + 0xAD4C: 0x80CE, + 0xAD4D: 0x80DE, + 0xAD4E: 0x80E4, + 0xAD4F: 0x80DD, + 0xAD50: 0x81F4, + 0xAD51: 0x8222, + 0xAD52: 0x82E7, + 0xAD53: 0x8303, + 0xAD54: 0x8305, + 0xAD55: 0x82E3, + 0xAD56: 0x82DB, + 0xAD57: 0x82E6, + 0xAD58: 0x8304, + 0xAD59: 0x82E5, + 0xAD5A: 0x8302, + 0xAD5B: 0x8309, + 0xAD5C: 0x82D2, + 0xAD5D: 0x82D7, + 0xAD5E: 0x82F1, + 0xAD5F: 0x8301, + 0xAD60: 0x82DC, + 0xAD61: 0x82D4, + 0xAD62: 0x82D1, + 0xAD63: 0x82DE, + 0xAD64: 0x82D3, + 0xAD65: 0x82DF, + 0xAD66: 0x82EF, + 0xAD67: 0x8306, + 0xAD68: 0x8650, + 0xAD69: 0x8679, + 0xAD6A: 0x867B, + 0xAD6B: 0x867A, + 0xAD6C: 0x884D, + 0xAD6D: 0x886B, + 0xAD6E: 0x8981, + 0xAD6F: 0x89D4, + 0xAD70: 0x8A08, + 0xAD71: 0x8A02, + 0xAD72: 0x8A03, + 0xAD73: 0x8C9E, + 0xAD74: 0x8CA0, + 0xAD75: 0x8D74, + 0xAD76: 0x8D73, + 0xAD77: 0x8DB4, + 0xAD78: 0x8ECD, + 0xAD79: 0x8ECC, + 0xAD7A: 0x8FF0, + 0xAD7B: 0x8FE6, + 0xAD7C: 0x8FE2, + 0xAD7D: 0x8FEA, + 0xAD7E: 0x8FE5, + 0xADA1: 0x8FED, + 0xADA2: 0x8FEB, + 0xADA3: 0x8FE4, + 0xADA4: 0x8FE8, + 0xADA5: 0x90CA, + 0xADA6: 0x90CE, + 0xADA7: 0x90C1, + 0xADA8: 0x90C3, + 0xADA9: 0x914B, + 0xADAA: 0x914A, + 0xADAB: 0x91CD, + 0xADAC: 0x9582, + 0xADAD: 0x9650, + 0xADAE: 0x964B, + 0xADAF: 0x964C, + 0xADB0: 0x964D, + 0xADB1: 0x9762, + 0xADB2: 0x9769, + 0xADB3: 0x97CB, + 0xADB4: 0x97ED, + 0xADB5: 0x97F3, + 0xADB6: 0x9801, + 0xADB7: 0x98A8, + 0xADB8: 0x98DB, + 0xADB9: 0x98DF, + 0xADBA: 0x9996, + 0xADBB: 0x9999, + 0xADBC: 0x4E58, + 0xADBD: 0x4EB3, + 0xADBE: 0x500C, + 0xADBF: 0x500D, + 0xADC0: 0x5023, + 0xADC1: 0x4FEF, + 0xADC2: 0x5026, + 0xADC3: 0x5025, + 0xADC4: 0x4FF8, + 0xADC5: 0x5029, + 0xADC6: 0x5016, + 0xADC7: 0x5006, + 0xADC8: 0x503C, + 0xADC9: 0x501F, + 0xADCA: 0x501A, + 0xADCB: 0x5012, + 0xADCC: 0x5011, + 0xADCD: 0x4FFA, + 0xADCE: 0x5000, + 0xADCF: 0x5014, + 0xADD0: 0x5028, + 0xADD1: 0x4FF1, + 0xADD2: 0x5021, + 0xADD3: 0x500B, + 0xADD4: 0x5019, + 0xADD5: 0x5018, + 0xADD6: 0x4FF3, + 0xADD7: 0x4FEE, + 0xADD8: 0x502D, + 0xADD9: 0x502A, + 0xADDA: 0x4FFE, + 0xADDB: 0x502B, + 0xADDC: 0x5009, + 0xADDD: 0x517C, + 0xADDE: 0x51A4, + 0xADDF: 0x51A5, + 0xADE0: 0x51A2, + 0xADE1: 0x51CD, + 0xADE2: 0x51CC, + 0xADE3: 0x51C6, + 0xADE4: 0x51CB, + 0xADE5: 0x5256, + 0xADE6: 0x525C, + 0xADE7: 0x5254, + 0xADE8: 0x525B, + 0xADE9: 0x525D, + 0xADEA: 0x532A, + 0xADEB: 0x537F, + 0xADEC: 0x539F, + 0xADED: 0x539D, + 0xADEE: 0x53DF, + 0xADEF: 0x54E8, + 0xADF0: 0x5510, + 0xADF1: 0x5501, + 0xADF2: 0x5537, + 0xADF3: 0x54FC, + 0xADF4: 0x54E5, + 0xADF5: 0x54F2, + 0xADF6: 0x5506, + 0xADF7: 0x54FA, + 0xADF8: 0x5514, + 0xADF9: 0x54E9, + 0xADFA: 0x54ED, + 0xADFB: 0x54E1, + 0xADFC: 0x5509, + 0xADFD: 0x54EE, + 0xADFE: 0x54EA, + 0xAE40: 0x54E6, + 0xAE41: 0x5527, + 0xAE42: 0x5507, + 0xAE43: 0x54FD, + 0xAE44: 0x550F, + 0xAE45: 0x5703, + 0xAE46: 0x5704, + 0xAE47: 0x57C2, + 0xAE48: 0x57D4, + 0xAE49: 0x57CB, + 0xAE4A: 0x57C3, + 0xAE4B: 0x5809, + 0xAE4C: 0x590F, + 0xAE4D: 0x5957, + 0xAE4E: 0x5958, + 0xAE4F: 0x595A, + 0xAE50: 0x5A11, + 0xAE51: 0x5A18, + 0xAE52: 0x5A1C, + 0xAE53: 0x5A1F, + 0xAE54: 0x5A1B, + 0xAE55: 0x5A13, + 0xAE56: 0x59EC, + 0xAE57: 0x5A20, + 0xAE58: 0x5A23, + 0xAE59: 0x5A29, + 0xAE5A: 0x5A25, + 0xAE5B: 0x5A0C, + 0xAE5C: 0x5A09, + 0xAE5D: 0x5B6B, + 0xAE5E: 0x5C58, + 0xAE5F: 0x5BB0, + 0xAE60: 0x5BB3, + 0xAE61: 0x5BB6, + 0xAE62: 0x5BB4, + 0xAE63: 0x5BAE, + 0xAE64: 0x5BB5, + 0xAE65: 0x5BB9, + 0xAE66: 0x5BB8, + 0xAE67: 0x5C04, + 0xAE68: 0x5C51, + 0xAE69: 0x5C55, + 0xAE6A: 0x5C50, + 0xAE6B: 0x5CED, + 0xAE6C: 0x5CFD, + 0xAE6D: 0x5CFB, + 0xAE6E: 0x5CEA, + 0xAE6F: 0x5CE8, + 0xAE70: 0x5CF0, + 0xAE71: 0x5CF6, + 0xAE72: 0x5D01, + 0xAE73: 0x5CF4, + 0xAE74: 0x5DEE, + 0xAE75: 0x5E2D, + 0xAE76: 0x5E2B, + 0xAE77: 0x5EAB, + 0xAE78: 0x5EAD, + 0xAE79: 0x5EA7, + 0xAE7A: 0x5F31, + 0xAE7B: 0x5F92, + 0xAE7C: 0x5F91, + 0xAE7D: 0x5F90, + 0xAE7E: 0x6059, + 0xAEA1: 0x6063, + 0xAEA2: 0x6065, + 0xAEA3: 0x6050, + 0xAEA4: 0x6055, + 0xAEA5: 0x606D, + 0xAEA6: 0x6069, + 0xAEA7: 0x606F, + 0xAEA8: 0x6084, + 0xAEA9: 0x609F, + 0xAEAA: 0x609A, + 0xAEAB: 0x608D, + 0xAEAC: 0x6094, + 0xAEAD: 0x608C, + 0xAEAE: 0x6085, + 0xAEAF: 0x6096, + 0xAEB0: 0x6247, + 0xAEB1: 0x62F3, + 0xAEB2: 0x6308, + 0xAEB3: 0x62FF, + 0xAEB4: 0x634E, + 0xAEB5: 0x633E, + 0xAEB6: 0x632F, + 0xAEB7: 0x6355, + 0xAEB8: 0x6342, + 0xAEB9: 0x6346, + 0xAEBA: 0x634F, + 0xAEBB: 0x6349, + 0xAEBC: 0x633A, + 0xAEBD: 0x6350, + 0xAEBE: 0x633D, + 0xAEBF: 0x632A, + 0xAEC0: 0x632B, + 0xAEC1: 0x6328, + 0xAEC2: 0x634D, + 0xAEC3: 0x634C, + 0xAEC4: 0x6548, + 0xAEC5: 0x6549, + 0xAEC6: 0x6599, + 0xAEC7: 0x65C1, + 0xAEC8: 0x65C5, + 0xAEC9: 0x6642, + 0xAECA: 0x6649, + 0xAECB: 0x664F, + 0xAECC: 0x6643, + 0xAECD: 0x6652, + 0xAECE: 0x664C, + 0xAECF: 0x6645, + 0xAED0: 0x6641, + 0xAED1: 0x66F8, + 0xAED2: 0x6714, + 0xAED3: 0x6715, + 0xAED4: 0x6717, + 0xAED5: 0x6821, + 0xAED6: 0x6838, + 0xAED7: 0x6848, + 0xAED8: 0x6846, + 0xAED9: 0x6853, + 0xAEDA: 0x6839, + 0xAEDB: 0x6842, + 0xAEDC: 0x6854, + 0xAEDD: 0x6829, + 0xAEDE: 0x68B3, + 0xAEDF: 0x6817, + 0xAEE0: 0x684C, + 0xAEE1: 0x6851, + 0xAEE2: 0x683D, + 0xAEE3: 0x67F4, + 0xAEE4: 0x6850, + 0xAEE5: 0x6840, + 0xAEE6: 0x683C, + 0xAEE7: 0x6843, + 0xAEE8: 0x682A, + 0xAEE9: 0x6845, + 0xAEEA: 0x6813, + 0xAEEB: 0x6818, + 0xAEEC: 0x6841, + 0xAEED: 0x6B8A, + 0xAEEE: 0x6B89, + 0xAEEF: 0x6BB7, + 0xAEF0: 0x6C23, + 0xAEF1: 0x6C27, + 0xAEF2: 0x6C28, + 0xAEF3: 0x6C26, + 0xAEF4: 0x6C24, + 0xAEF5: 0x6CF0, + 0xAEF6: 0x6D6A, + 0xAEF7: 0x6D95, + 0xAEF8: 0x6D88, + 0xAEF9: 0x6D87, + 0xAEFA: 0x6D66, + 0xAEFB: 0x6D78, + 0xAEFC: 0x6D77, + 0xAEFD: 0x6D59, + 0xAEFE: 0x6D93, + 0xAF40: 0x6D6C, + 0xAF41: 0x6D89, + 0xAF42: 0x6D6E, + 0xAF43: 0x6D5A, + 0xAF44: 0x6D74, + 0xAF45: 0x6D69, + 0xAF46: 0x6D8C, + 0xAF47: 0x6D8A, + 0xAF48: 0x6D79, + 0xAF49: 0x6D85, + 0xAF4A: 0x6D65, + 0xAF4B: 0x6D94, + 0xAF4C: 0x70CA, + 0xAF4D: 0x70D8, + 0xAF4E: 0x70E4, + 0xAF4F: 0x70D9, + 0xAF50: 0x70C8, + 0xAF51: 0x70CF, + 0xAF52: 0x7239, + 0xAF53: 0x7279, + 0xAF54: 0x72FC, + 0xAF55: 0x72F9, + 0xAF56: 0x72FD, + 0xAF57: 0x72F8, + 0xAF58: 0x72F7, + 0xAF59: 0x7386, + 0xAF5A: 0x73ED, + 0xAF5B: 0x7409, + 0xAF5C: 0x73EE, + 0xAF5D: 0x73E0, + 0xAF5E: 0x73EA, + 0xAF5F: 0x73DE, + 0xAF60: 0x7554, + 0xAF61: 0x755D, + 0xAF62: 0x755C, + 0xAF63: 0x755A, + 0xAF64: 0x7559, + 0xAF65: 0x75BE, + 0xAF66: 0x75C5, + 0xAF67: 0x75C7, + 0xAF68: 0x75B2, + 0xAF69: 0x75B3, + 0xAF6A: 0x75BD, + 0xAF6B: 0x75BC, + 0xAF6C: 0x75B9, + 0xAF6D: 0x75C2, + 0xAF6E: 0x75B8, + 0xAF6F: 0x768B, + 0xAF70: 0x76B0, + 0xAF71: 0x76CA, + 0xAF72: 0x76CD, + 0xAF73: 0x76CE, + 0xAF74: 0x7729, + 0xAF75: 0x771F, + 0xAF76: 0x7720, + 0xAF77: 0x7728, + 0xAF78: 0x77E9, + 0xAF79: 0x7830, + 0xAF7A: 0x7827, + 0xAF7B: 0x7838, + 0xAF7C: 0x781D, + 0xAF7D: 0x7834, + 0xAF7E: 0x7837, + 0xAFA1: 0x7825, + 0xAFA2: 0x782D, + 0xAFA3: 0x7820, + 0xAFA4: 0x781F, + 0xAFA5: 0x7832, + 0xAFA6: 0x7955, + 0xAFA7: 0x7950, + 0xAFA8: 0x7960, + 0xAFA9: 0x795F, + 0xAFAA: 0x7956, + 0xAFAB: 0x795E, + 0xAFAC: 0x795D, + 0xAFAD: 0x7957, + 0xAFAE: 0x795A, + 0xAFAF: 0x79E4, + 0xAFB0: 0x79E3, + 0xAFB1: 0x79E7, + 0xAFB2: 0x79DF, + 0xAFB3: 0x79E6, + 0xAFB4: 0x79E9, + 0xAFB5: 0x79D8, + 0xAFB6: 0x7A84, + 0xAFB7: 0x7A88, + 0xAFB8: 0x7AD9, + 0xAFB9: 0x7B06, + 0xAFBA: 0x7B11, + 0xAFBB: 0x7C89, + 0xAFBC: 0x7D21, + 0xAFBD: 0x7D17, + 0xAFBE: 0x7D0B, + 0xAFBF: 0x7D0A, + 0xAFC0: 0x7D20, + 0xAFC1: 0x7D22, + 0xAFC2: 0x7D14, + 0xAFC3: 0x7D10, + 0xAFC4: 0x7D15, + 0xAFC5: 0x7D1A, + 0xAFC6: 0x7D1C, + 0xAFC7: 0x7D0D, + 0xAFC8: 0x7D19, + 0xAFC9: 0x7D1B, + 0xAFCA: 0x7F3A, + 0xAFCB: 0x7F5F, + 0xAFCC: 0x7F94, + 0xAFCD: 0x7FC5, + 0xAFCE: 0x7FC1, + 0xAFCF: 0x8006, + 0xAFD0: 0x8018, + 0xAFD1: 0x8015, + 0xAFD2: 0x8019, + 0xAFD3: 0x8017, + 0xAFD4: 0x803D, + 0xAFD5: 0x803F, + 0xAFD6: 0x80F1, + 0xAFD7: 0x8102, + 0xAFD8: 0x80F0, + 0xAFD9: 0x8105, + 0xAFDA: 0x80ED, + 0xAFDB: 0x80F4, + 0xAFDC: 0x8106, + 0xAFDD: 0x80F8, + 0xAFDE: 0x80F3, + 0xAFDF: 0x8108, + 0xAFE0: 0x80FD, + 0xAFE1: 0x810A, + 0xAFE2: 0x80FC, + 0xAFE3: 0x80EF, + 0xAFE4: 0x81ED, + 0xAFE5: 0x81EC, + 0xAFE6: 0x8200, + 0xAFE7: 0x8210, + 0xAFE8: 0x822A, + 0xAFE9: 0x822B, + 0xAFEA: 0x8228, + 0xAFEB: 0x822C, + 0xAFEC: 0x82BB, + 0xAFED: 0x832B, + 0xAFEE: 0x8352, + 0xAFEF: 0x8354, + 0xAFF0: 0x834A, + 0xAFF1: 0x8338, + 0xAFF2: 0x8350, + 0xAFF3: 0x8349, + 0xAFF4: 0x8335, + 0xAFF5: 0x8334, + 0xAFF6: 0x834F, + 0xAFF7: 0x8332, + 0xAFF8: 0x8339, + 0xAFF9: 0x8336, + 0xAFFA: 0x8317, + 0xAFFB: 0x8340, + 0xAFFC: 0x8331, + 0xAFFD: 0x8328, + 0xAFFE: 0x8343, + 0xB040: 0x8654, + 0xB041: 0x868A, + 0xB042: 0x86AA, + 0xB043: 0x8693, + 0xB044: 0x86A4, + 0xB045: 0x86A9, + 0xB046: 0x868C, + 0xB047: 0x86A3, + 0xB048: 0x869C, + 0xB049: 0x8870, + 0xB04A: 0x8877, + 0xB04B: 0x8881, + 0xB04C: 0x8882, + 0xB04D: 0x887D, + 0xB04E: 0x8879, + 0xB04F: 0x8A18, + 0xB050: 0x8A10, + 0xB051: 0x8A0E, + 0xB052: 0x8A0C, + 0xB053: 0x8A15, + 0xB054: 0x8A0A, + 0xB055: 0x8A17, + 0xB056: 0x8A13, + 0xB057: 0x8A16, + 0xB058: 0x8A0F, + 0xB059: 0x8A11, + 0xB05A: 0x8C48, + 0xB05B: 0x8C7A, + 0xB05C: 0x8C79, + 0xB05D: 0x8CA1, + 0xB05E: 0x8CA2, + 0xB05F: 0x8D77, + 0xB060: 0x8EAC, + 0xB061: 0x8ED2, + 0xB062: 0x8ED4, + 0xB063: 0x8ECF, + 0xB064: 0x8FB1, + 0xB065: 0x9001, + 0xB066: 0x9006, + 0xB067: 0x8FF7, + 0xB068: 0x9000, + 0xB069: 0x8FFA, + 0xB06A: 0x8FF4, + 0xB06B: 0x9003, + 0xB06C: 0x8FFD, + 0xB06D: 0x9005, + 0xB06E: 0x8FF8, + 0xB06F: 0x9095, + 0xB070: 0x90E1, + 0xB071: 0x90DD, + 0xB072: 0x90E2, + 0xB073: 0x9152, + 0xB074: 0x914D, + 0xB075: 0x914C, + 0xB076: 0x91D8, + 0xB077: 0x91DD, + 0xB078: 0x91D7, + 0xB079: 0x91DC, + 0xB07A: 0x91D9, + 0xB07B: 0x9583, + 0xB07C: 0x9662, + 0xB07D: 0x9663, + 0xB07E: 0x9661, + 0xB0A1: 0x965B, + 0xB0A2: 0x965D, + 0xB0A3: 0x9664, + 0xB0A4: 0x9658, + 0xB0A5: 0x965E, + 0xB0A6: 0x96BB, + 0xB0A7: 0x98E2, + 0xB0A8: 0x99AC, + 0xB0A9: 0x9AA8, + 0xB0AA: 0x9AD8, + 0xB0AB: 0x9B25, + 0xB0AC: 0x9B32, + 0xB0AD: 0x9B3C, + 0xB0AE: 0x4E7E, + 0xB0AF: 0x507A, + 0xB0B0: 0x507D, + 0xB0B1: 0x505C, + 0xB0B2: 0x5047, + 0xB0B3: 0x5043, + 0xB0B4: 0x504C, + 0xB0B5: 0x505A, + 0xB0B6: 0x5049, + 0xB0B7: 0x5065, + 0xB0B8: 0x5076, + 0xB0B9: 0x504E, + 0xB0BA: 0x5055, + 0xB0BB: 0x5075, + 0xB0BC: 0x5074, + 0xB0BD: 0x5077, + 0xB0BE: 0x504F, + 0xB0BF: 0x500F, + 0xB0C0: 0x506F, + 0xB0C1: 0x506D, + 0xB0C2: 0x515C, + 0xB0C3: 0x5195, + 0xB0C4: 0x51F0, + 0xB0C5: 0x526A, + 0xB0C6: 0x526F, + 0xB0C7: 0x52D2, + 0xB0C8: 0x52D9, + 0xB0C9: 0x52D8, + 0xB0CA: 0x52D5, + 0xB0CB: 0x5310, + 0xB0CC: 0x530F, + 0xB0CD: 0x5319, + 0xB0CE: 0x533F, + 0xB0CF: 0x5340, + 0xB0D0: 0x533E, + 0xB0D1: 0x53C3, + 0xB0D2: 0x66FC, + 0xB0D3: 0x5546, + 0xB0D4: 0x556A, + 0xB0D5: 0x5566, + 0xB0D6: 0x5544, + 0xB0D7: 0x555E, + 0xB0D8: 0x5561, + 0xB0D9: 0x5543, + 0xB0DA: 0x554A, + 0xB0DB: 0x5531, + 0xB0DC: 0x5556, + 0xB0DD: 0x554F, + 0xB0DE: 0x5555, + 0xB0DF: 0x552F, + 0xB0E0: 0x5564, + 0xB0E1: 0x5538, + 0xB0E2: 0x552E, + 0xB0E3: 0x555C, + 0xB0E4: 0x552C, + 0xB0E5: 0x5563, + 0xB0E6: 0x5533, + 0xB0E7: 0x5541, + 0xB0E8: 0x5557, + 0xB0E9: 0x5708, + 0xB0EA: 0x570B, + 0xB0EB: 0x5709, + 0xB0EC: 0x57DF, + 0xB0ED: 0x5805, + 0xB0EE: 0x580A, + 0xB0EF: 0x5806, + 0xB0F0: 0x57E0, + 0xB0F1: 0x57E4, + 0xB0F2: 0x57FA, + 0xB0F3: 0x5802, + 0xB0F4: 0x5835, + 0xB0F5: 0x57F7, + 0xB0F6: 0x57F9, + 0xB0F7: 0x5920, + 0xB0F8: 0x5962, + 0xB0F9: 0x5A36, + 0xB0FA: 0x5A41, + 0xB0FB: 0x5A49, + 0xB0FC: 0x5A66, + 0xB0FD: 0x5A6A, + 0xB0FE: 0x5A40, + 0xB140: 0x5A3C, + 0xB141: 0x5A62, + 0xB142: 0x5A5A, + 0xB143: 0x5A46, + 0xB144: 0x5A4A, + 0xB145: 0x5B70, + 0xB146: 0x5BC7, + 0xB147: 0x5BC5, + 0xB148: 0x5BC4, + 0xB149: 0x5BC2, + 0xB14A: 0x5BBF, + 0xB14B: 0x5BC6, + 0xB14C: 0x5C09, + 0xB14D: 0x5C08, + 0xB14E: 0x5C07, + 0xB14F: 0x5C60, + 0xB150: 0x5C5C, + 0xB151: 0x5C5D, + 0xB152: 0x5D07, + 0xB153: 0x5D06, + 0xB154: 0x5D0E, + 0xB155: 0x5D1B, + 0xB156: 0x5D16, + 0xB157: 0x5D22, + 0xB158: 0x5D11, + 0xB159: 0x5D29, + 0xB15A: 0x5D14, + 0xB15B: 0x5D19, + 0xB15C: 0x5D24, + 0xB15D: 0x5D27, + 0xB15E: 0x5D17, + 0xB15F: 0x5DE2, + 0xB160: 0x5E38, + 0xB161: 0x5E36, + 0xB162: 0x5E33, + 0xB163: 0x5E37, + 0xB164: 0x5EB7, + 0xB165: 0x5EB8, + 0xB166: 0x5EB6, + 0xB167: 0x5EB5, + 0xB168: 0x5EBE, + 0xB169: 0x5F35, + 0xB16A: 0x5F37, + 0xB16B: 0x5F57, + 0xB16C: 0x5F6C, + 0xB16D: 0x5F69, + 0xB16E: 0x5F6B, + 0xB16F: 0x5F97, + 0xB170: 0x5F99, + 0xB171: 0x5F9E, + 0xB172: 0x5F98, + 0xB173: 0x5FA1, + 0xB174: 0x5FA0, + 0xB175: 0x5F9C, + 0xB176: 0x607F, + 0xB177: 0x60A3, + 0xB178: 0x6089, + 0xB179: 0x60A0, + 0xB17A: 0x60A8, + 0xB17B: 0x60CB, + 0xB17C: 0x60B4, + 0xB17D: 0x60E6, + 0xB17E: 0x60BD, + 0xB1A1: 0x60C5, + 0xB1A2: 0x60BB, + 0xB1A3: 0x60B5, + 0xB1A4: 0x60DC, + 0xB1A5: 0x60BC, + 0xB1A6: 0x60D8, + 0xB1A7: 0x60D5, + 0xB1A8: 0x60C6, + 0xB1A9: 0x60DF, + 0xB1AA: 0x60B8, + 0xB1AB: 0x60DA, + 0xB1AC: 0x60C7, + 0xB1AD: 0x621A, + 0xB1AE: 0x621B, + 0xB1AF: 0x6248, + 0xB1B0: 0x63A0, + 0xB1B1: 0x63A7, + 0xB1B2: 0x6372, + 0xB1B3: 0x6396, + 0xB1B4: 0x63A2, + 0xB1B5: 0x63A5, + 0xB1B6: 0x6377, + 0xB1B7: 0x6367, + 0xB1B8: 0x6398, + 0xB1B9: 0x63AA, + 0xB1BA: 0x6371, + 0xB1BB: 0x63A9, + 0xB1BC: 0x6389, + 0xB1BD: 0x6383, + 0xB1BE: 0x639B, + 0xB1BF: 0x636B, + 0xB1C0: 0x63A8, + 0xB1C1: 0x6384, + 0xB1C2: 0x6388, + 0xB1C3: 0x6399, + 0xB1C4: 0x63A1, + 0xB1C5: 0x63AC, + 0xB1C6: 0x6392, + 0xB1C7: 0x638F, + 0xB1C8: 0x6380, + 0xB1C9: 0x637B, + 0xB1CA: 0x6369, + 0xB1CB: 0x6368, + 0xB1CC: 0x637A, + 0xB1CD: 0x655D, + 0xB1CE: 0x6556, + 0xB1CF: 0x6551, + 0xB1D0: 0x6559, + 0xB1D1: 0x6557, + 0xB1D2: 0x555F, + 0xB1D3: 0x654F, + 0xB1D4: 0x6558, + 0xB1D5: 0x6555, + 0xB1D6: 0x6554, + 0xB1D7: 0x659C, + 0xB1D8: 0x659B, + 0xB1D9: 0x65AC, + 0xB1DA: 0x65CF, + 0xB1DB: 0x65CB, + 0xB1DC: 0x65CC, + 0xB1DD: 0x65CE, + 0xB1DE: 0x665D, + 0xB1DF: 0x665A, + 0xB1E0: 0x6664, + 0xB1E1: 0x6668, + 0xB1E2: 0x6666, + 0xB1E3: 0x665E, + 0xB1E4: 0x66F9, + 0xB1E5: 0x52D7, + 0xB1E6: 0x671B, + 0xB1E7: 0x6881, + 0xB1E8: 0x68AF, + 0xB1E9: 0x68A2, + 0xB1EA: 0x6893, + 0xB1EB: 0x68B5, + 0xB1EC: 0x687F, + 0xB1ED: 0x6876, + 0xB1EE: 0x68B1, + 0xB1EF: 0x68A7, + 0xB1F0: 0x6897, + 0xB1F1: 0x68B0, + 0xB1F2: 0x6883, + 0xB1F3: 0x68C4, + 0xB1F4: 0x68AD, + 0xB1F5: 0x6886, + 0xB1F6: 0x6885, + 0xB1F7: 0x6894, + 0xB1F8: 0x689D, + 0xB1F9: 0x68A8, + 0xB1FA: 0x689F, + 0xB1FB: 0x68A1, + 0xB1FC: 0x6882, + 0xB1FD: 0x6B32, + 0xB1FE: 0x6BBA, + 0xB240: 0x6BEB, + 0xB241: 0x6BEC, + 0xB242: 0x6C2B, + 0xB243: 0x6D8E, + 0xB244: 0x6DBC, + 0xB245: 0x6DF3, + 0xB246: 0x6DD9, + 0xB247: 0x6DB2, + 0xB248: 0x6DE1, + 0xB249: 0x6DCC, + 0xB24A: 0x6DE4, + 0xB24B: 0x6DFB, + 0xB24C: 0x6DFA, + 0xB24D: 0x6E05, + 0xB24E: 0x6DC7, + 0xB24F: 0x6DCB, + 0xB250: 0x6DAF, + 0xB251: 0x6DD1, + 0xB252: 0x6DAE, + 0xB253: 0x6DDE, + 0xB254: 0x6DF9, + 0xB255: 0x6DB8, + 0xB256: 0x6DF7, + 0xB257: 0x6DF5, + 0xB258: 0x6DC5, + 0xB259: 0x6DD2, + 0xB25A: 0x6E1A, + 0xB25B: 0x6DB5, + 0xB25C: 0x6DDA, + 0xB25D: 0x6DEB, + 0xB25E: 0x6DD8, + 0xB25F: 0x6DEA, + 0xB260: 0x6DF1, + 0xB261: 0x6DEE, + 0xB262: 0x6DE8, + 0xB263: 0x6DC6, + 0xB264: 0x6DC4, + 0xB265: 0x6DAA, + 0xB266: 0x6DEC, + 0xB267: 0x6DBF, + 0xB268: 0x6DE6, + 0xB269: 0x70F9, + 0xB26A: 0x7109, + 0xB26B: 0x710A, + 0xB26C: 0x70FD, + 0xB26D: 0x70EF, + 0xB26E: 0x723D, + 0xB26F: 0x727D, + 0xB270: 0x7281, + 0xB271: 0x731C, + 0xB272: 0x731B, + 0xB273: 0x7316, + 0xB274: 0x7313, + 0xB275: 0x7319, + 0xB276: 0x7387, + 0xB277: 0x7405, + 0xB278: 0x740A, + 0xB279: 0x7403, + 0xB27A: 0x7406, + 0xB27B: 0x73FE, + 0xB27C: 0x740D, + 0xB27D: 0x74E0, + 0xB27E: 0x74F6, + 0xB2A1: 0x74F7, + 0xB2A2: 0x751C, + 0xB2A3: 0x7522, + 0xB2A4: 0x7565, + 0xB2A5: 0x7566, + 0xB2A6: 0x7562, + 0xB2A7: 0x7570, + 0xB2A8: 0x758F, + 0xB2A9: 0x75D4, + 0xB2AA: 0x75D5, + 0xB2AB: 0x75B5, + 0xB2AC: 0x75CA, + 0xB2AD: 0x75CD, + 0xB2AE: 0x768E, + 0xB2AF: 0x76D4, + 0xB2B0: 0x76D2, + 0xB2B1: 0x76DB, + 0xB2B2: 0x7737, + 0xB2B3: 0x773E, + 0xB2B4: 0x773C, + 0xB2B5: 0x7736, + 0xB2B6: 0x7738, + 0xB2B7: 0x773A, + 0xB2B8: 0x786B, + 0xB2B9: 0x7843, + 0xB2BA: 0x784E, + 0xB2BB: 0x7965, + 0xB2BC: 0x7968, + 0xB2BD: 0x796D, + 0xB2BE: 0x79FB, + 0xB2BF: 0x7A92, + 0xB2C0: 0x7A95, + 0xB2C1: 0x7B20, + 0xB2C2: 0x7B28, + 0xB2C3: 0x7B1B, + 0xB2C4: 0x7B2C, + 0xB2C5: 0x7B26, + 0xB2C6: 0x7B19, + 0xB2C7: 0x7B1E, + 0xB2C8: 0x7B2E, + 0xB2C9: 0x7C92, + 0xB2CA: 0x7C97, + 0xB2CB: 0x7C95, + 0xB2CC: 0x7D46, + 0xB2CD: 0x7D43, + 0xB2CE: 0x7D71, + 0xB2CF: 0x7D2E, + 0xB2D0: 0x7D39, + 0xB2D1: 0x7D3C, + 0xB2D2: 0x7D40, + 0xB2D3: 0x7D30, + 0xB2D4: 0x7D33, + 0xB2D5: 0x7D44, + 0xB2D6: 0x7D2F, + 0xB2D7: 0x7D42, + 0xB2D8: 0x7D32, + 0xB2D9: 0x7D31, + 0xB2DA: 0x7F3D, + 0xB2DB: 0x7F9E, + 0xB2DC: 0x7F9A, + 0xB2DD: 0x7FCC, + 0xB2DE: 0x7FCE, + 0xB2DF: 0x7FD2, + 0xB2E0: 0x801C, + 0xB2E1: 0x804A, + 0xB2E2: 0x8046, + 0xB2E3: 0x812F, + 0xB2E4: 0x8116, + 0xB2E5: 0x8123, + 0xB2E6: 0x812B, + 0xB2E7: 0x8129, + 0xB2E8: 0x8130, + 0xB2E9: 0x8124, + 0xB2EA: 0x8202, + 0xB2EB: 0x8235, + 0xB2EC: 0x8237, + 0xB2ED: 0x8236, + 0xB2EE: 0x8239, + 0xB2EF: 0x838E, + 0xB2F0: 0x839E, + 0xB2F1: 0x8398, + 0xB2F2: 0x8378, + 0xB2F3: 0x83A2, + 0xB2F4: 0x8396, + 0xB2F5: 0x83BD, + 0xB2F6: 0x83AB, + 0xB2F7: 0x8392, + 0xB2F8: 0x838A, + 0xB2F9: 0x8393, + 0xB2FA: 0x8389, + 0xB2FB: 0x83A0, + 0xB2FC: 0x8377, + 0xB2FD: 0x837B, + 0xB2FE: 0x837C, + 0xB340: 0x8386, + 0xB341: 0x83A7, + 0xB342: 0x8655, + 0xB343: 0x5F6A, + 0xB344: 0x86C7, + 0xB345: 0x86C0, + 0xB346: 0x86B6, + 0xB347: 0x86C4, + 0xB348: 0x86B5, + 0xB349: 0x86C6, + 0xB34A: 0x86CB, + 0xB34B: 0x86B1, + 0xB34C: 0x86AF, + 0xB34D: 0x86C9, + 0xB34E: 0x8853, + 0xB34F: 0x889E, + 0xB350: 0x8888, + 0xB351: 0x88AB, + 0xB352: 0x8892, + 0xB353: 0x8896, + 0xB354: 0x888D, + 0xB355: 0x888B, + 0xB356: 0x8993, + 0xB357: 0x898F, + 0xB358: 0x8A2A, + 0xB359: 0x8A1D, + 0xB35A: 0x8A23, + 0xB35B: 0x8A25, + 0xB35C: 0x8A31, + 0xB35D: 0x8A2D, + 0xB35E: 0x8A1F, + 0xB35F: 0x8A1B, + 0xB360: 0x8A22, + 0xB361: 0x8C49, + 0xB362: 0x8C5A, + 0xB363: 0x8CA9, + 0xB364: 0x8CAC, + 0xB365: 0x8CAB, + 0xB366: 0x8CA8, + 0xB367: 0x8CAA, + 0xB368: 0x8CA7, + 0xB369: 0x8D67, + 0xB36A: 0x8D66, + 0xB36B: 0x8DBE, + 0xB36C: 0x8DBA, + 0xB36D: 0x8EDB, + 0xB36E: 0x8EDF, + 0xB36F: 0x9019, + 0xB370: 0x900D, + 0xB371: 0x901A, + 0xB372: 0x9017, + 0xB373: 0x9023, + 0xB374: 0x901F, + 0xB375: 0x901D, + 0xB376: 0x9010, + 0xB377: 0x9015, + 0xB378: 0x901E, + 0xB379: 0x9020, + 0xB37A: 0x900F, + 0xB37B: 0x9022, + 0xB37C: 0x9016, + 0xB37D: 0x901B, + 0xB37E: 0x9014, + 0xB3A1: 0x90E8, + 0xB3A2: 0x90ED, + 0xB3A3: 0x90FD, + 0xB3A4: 0x9157, + 0xB3A5: 0x91CE, + 0xB3A6: 0x91F5, + 0xB3A7: 0x91E6, + 0xB3A8: 0x91E3, + 0xB3A9: 0x91E7, + 0xB3AA: 0x91ED, + 0xB3AB: 0x91E9, + 0xB3AC: 0x9589, + 0xB3AD: 0x966A, + 0xB3AE: 0x9675, + 0xB3AF: 0x9673, + 0xB3B0: 0x9678, + 0xB3B1: 0x9670, + 0xB3B2: 0x9674, + 0xB3B3: 0x9676, + 0xB3B4: 0x9677, + 0xB3B5: 0x966C, + 0xB3B6: 0x96C0, + 0xB3B7: 0x96EA, + 0xB3B8: 0x96E9, + 0xB3B9: 0x7AE0, + 0xB3BA: 0x7ADF, + 0xB3BB: 0x9802, + 0xB3BC: 0x9803, + 0xB3BD: 0x9B5A, + 0xB3BE: 0x9CE5, + 0xB3BF: 0x9E75, + 0xB3C0: 0x9E7F, + 0xB3C1: 0x9EA5, + 0xB3C2: 0x9EBB, + 0xB3C3: 0x50A2, + 0xB3C4: 0x508D, + 0xB3C5: 0x5085, + 0xB3C6: 0x5099, + 0xB3C7: 0x5091, + 0xB3C8: 0x5080, + 0xB3C9: 0x5096, + 0xB3CA: 0x5098, + 0xB3CB: 0x509A, + 0xB3CC: 0x6700, + 0xB3CD: 0x51F1, + 0xB3CE: 0x5272, + 0xB3CF: 0x5274, + 0xB3D0: 0x5275, + 0xB3D1: 0x5269, + 0xB3D2: 0x52DE, + 0xB3D3: 0x52DD, + 0xB3D4: 0x52DB, + 0xB3D5: 0x535A, + 0xB3D6: 0x53A5, + 0xB3D7: 0x557B, + 0xB3D8: 0x5580, + 0xB3D9: 0x55A7, + 0xB3DA: 0x557C, + 0xB3DB: 0x558A, + 0xB3DC: 0x559D, + 0xB3DD: 0x5598, + 0xB3DE: 0x5582, + 0xB3DF: 0x559C, + 0xB3E0: 0x55AA, + 0xB3E1: 0x5594, + 0xB3E2: 0x5587, + 0xB3E3: 0x558B, + 0xB3E4: 0x5583, + 0xB3E5: 0x55B3, + 0xB3E6: 0x55AE, + 0xB3E7: 0x559F, + 0xB3E8: 0x553E, + 0xB3E9: 0x55B2, + 0xB3EA: 0x559A, + 0xB3EB: 0x55BB, + 0xB3EC: 0x55AC, + 0xB3ED: 0x55B1, + 0xB3EE: 0x557E, + 0xB3EF: 0x5589, + 0xB3F0: 0x55AB, + 0xB3F1: 0x5599, + 0xB3F2: 0x570D, + 0xB3F3: 0x582F, + 0xB3F4: 0x582A, + 0xB3F5: 0x5834, + 0xB3F6: 0x5824, + 0xB3F7: 0x5830, + 0xB3F8: 0x5831, + 0xB3F9: 0x5821, + 0xB3FA: 0x581D, + 0xB3FB: 0x5820, + 0xB3FC: 0x58F9, + 0xB3FD: 0x58FA, + 0xB3FE: 0x5960, + 0xB440: 0x5A77, + 0xB441: 0x5A9A, + 0xB442: 0x5A7F, + 0xB443: 0x5A92, + 0xB444: 0x5A9B, + 0xB445: 0x5AA7, + 0xB446: 0x5B73, + 0xB447: 0x5B71, + 0xB448: 0x5BD2, + 0xB449: 0x5BCC, + 0xB44A: 0x5BD3, + 0xB44B: 0x5BD0, + 0xB44C: 0x5C0A, + 0xB44D: 0x5C0B, + 0xB44E: 0x5C31, + 0xB44F: 0x5D4C, + 0xB450: 0x5D50, + 0xB451: 0x5D34, + 0xB452: 0x5D47, + 0xB453: 0x5DFD, + 0xB454: 0x5E45, + 0xB455: 0x5E3D, + 0xB456: 0x5E40, + 0xB457: 0x5E43, + 0xB458: 0x5E7E, + 0xB459: 0x5ECA, + 0xB45A: 0x5EC1, + 0xB45B: 0x5EC2, + 0xB45C: 0x5EC4, + 0xB45D: 0x5F3C, + 0xB45E: 0x5F6D, + 0xB45F: 0x5FA9, + 0xB460: 0x5FAA, + 0xB461: 0x5FA8, + 0xB462: 0x60D1, + 0xB463: 0x60E1, + 0xB464: 0x60B2, + 0xB465: 0x60B6, + 0xB466: 0x60E0, + 0xB467: 0x611C, + 0xB468: 0x6123, + 0xB469: 0x60FA, + 0xB46A: 0x6115, + 0xB46B: 0x60F0, + 0xB46C: 0x60FB, + 0xB46D: 0x60F4, + 0xB46E: 0x6168, + 0xB46F: 0x60F1, + 0xB470: 0x610E, + 0xB471: 0x60F6, + 0xB472: 0x6109, + 0xB473: 0x6100, + 0xB474: 0x6112, + 0xB475: 0x621F, + 0xB476: 0x6249, + 0xB477: 0x63A3, + 0xB478: 0x638C, + 0xB479: 0x63CF, + 0xB47A: 0x63C0, + 0xB47B: 0x63E9, + 0xB47C: 0x63C9, + 0xB47D: 0x63C6, + 0xB47E: 0x63CD, + 0xB4A1: 0x63D2, + 0xB4A2: 0x63E3, + 0xB4A3: 0x63D0, + 0xB4A4: 0x63E1, + 0xB4A5: 0x63D6, + 0xB4A6: 0x63ED, + 0xB4A7: 0x63EE, + 0xB4A8: 0x6376, + 0xB4A9: 0x63F4, + 0xB4AA: 0x63EA, + 0xB4AB: 0x63DB, + 0xB4AC: 0x6452, + 0xB4AD: 0x63DA, + 0xB4AE: 0x63F9, + 0xB4AF: 0x655E, + 0xB4B0: 0x6566, + 0xB4B1: 0x6562, + 0xB4B2: 0x6563, + 0xB4B3: 0x6591, + 0xB4B4: 0x6590, + 0xB4B5: 0x65AF, + 0xB4B6: 0x666E, + 0xB4B7: 0x6670, + 0xB4B8: 0x6674, + 0xB4B9: 0x6676, + 0xB4BA: 0x666F, + 0xB4BB: 0x6691, + 0xB4BC: 0x667A, + 0xB4BD: 0x667E, + 0xB4BE: 0x6677, + 0xB4BF: 0x66FE, + 0xB4C0: 0x66FF, + 0xB4C1: 0x671F, + 0xB4C2: 0x671D, + 0xB4C3: 0x68FA, + 0xB4C4: 0x68D5, + 0xB4C5: 0x68E0, + 0xB4C6: 0x68D8, + 0xB4C7: 0x68D7, + 0xB4C8: 0x6905, + 0xB4C9: 0x68DF, + 0xB4CA: 0x68F5, + 0xB4CB: 0x68EE, + 0xB4CC: 0x68E7, + 0xB4CD: 0x68F9, + 0xB4CE: 0x68D2, + 0xB4CF: 0x68F2, + 0xB4D0: 0x68E3, + 0xB4D1: 0x68CB, + 0xB4D2: 0x68CD, + 0xB4D3: 0x690D, + 0xB4D4: 0x6912, + 0xB4D5: 0x690E, + 0xB4D6: 0x68C9, + 0xB4D7: 0x68DA, + 0xB4D8: 0x696E, + 0xB4D9: 0x68FB, + 0xB4DA: 0x6B3E, + 0xB4DB: 0x6B3A, + 0xB4DC: 0x6B3D, + 0xB4DD: 0x6B98, + 0xB4DE: 0x6B96, + 0xB4DF: 0x6BBC, + 0xB4E0: 0x6BEF, + 0xB4E1: 0x6C2E, + 0xB4E2: 0x6C2F, + 0xB4E3: 0x6C2C, + 0xB4E4: 0x6E2F, + 0xB4E5: 0x6E38, + 0xB4E6: 0x6E54, + 0xB4E7: 0x6E21, + 0xB4E8: 0x6E32, + 0xB4E9: 0x6E67, + 0xB4EA: 0x6E4A, + 0xB4EB: 0x6E20, + 0xB4EC: 0x6E25, + 0xB4ED: 0x6E23, + 0xB4EE: 0x6E1B, + 0xB4EF: 0x6E5B, + 0xB4F0: 0x6E58, + 0xB4F1: 0x6E24, + 0xB4F2: 0x6E56, + 0xB4F3: 0x6E6E, + 0xB4F4: 0x6E2D, + 0xB4F5: 0x6E26, + 0xB4F6: 0x6E6F, + 0xB4F7: 0x6E34, + 0xB4F8: 0x6E4D, + 0xB4F9: 0x6E3A, + 0xB4FA: 0x6E2C, + 0xB4FB: 0x6E43, + 0xB4FC: 0x6E1D, + 0xB4FD: 0x6E3E, + 0xB4FE: 0x6ECB, + 0xB540: 0x6E89, + 0xB541: 0x6E19, + 0xB542: 0x6E4E, + 0xB543: 0x6E63, + 0xB544: 0x6E44, + 0xB545: 0x6E72, + 0xB546: 0x6E69, + 0xB547: 0x6E5F, + 0xB548: 0x7119, + 0xB549: 0x711A, + 0xB54A: 0x7126, + 0xB54B: 0x7130, + 0xB54C: 0x7121, + 0xB54D: 0x7136, + 0xB54E: 0x716E, + 0xB54F: 0x711C, + 0xB550: 0x724C, + 0xB551: 0x7284, + 0xB552: 0x7280, + 0xB553: 0x7336, + 0xB554: 0x7325, + 0xB555: 0x7334, + 0xB556: 0x7329, + 0xB557: 0x743A, + 0xB558: 0x742A, + 0xB559: 0x7433, + 0xB55A: 0x7422, + 0xB55B: 0x7425, + 0xB55C: 0x7435, + 0xB55D: 0x7436, + 0xB55E: 0x7434, + 0xB55F: 0x742F, + 0xB560: 0x741B, + 0xB561: 0x7426, + 0xB562: 0x7428, + 0xB563: 0x7525, + 0xB564: 0x7526, + 0xB565: 0x756B, + 0xB566: 0x756A, + 0xB567: 0x75E2, + 0xB568: 0x75DB, + 0xB569: 0x75E3, + 0xB56A: 0x75D9, + 0xB56B: 0x75D8, + 0xB56C: 0x75DE, + 0xB56D: 0x75E0, + 0xB56E: 0x767B, + 0xB56F: 0x767C, + 0xB570: 0x7696, + 0xB571: 0x7693, + 0xB572: 0x76B4, + 0xB573: 0x76DC, + 0xB574: 0x774F, + 0xB575: 0x77ED, + 0xB576: 0x785D, + 0xB577: 0x786C, + 0xB578: 0x786F, + 0xB579: 0x7A0D, + 0xB57A: 0x7A08, + 0xB57B: 0x7A0B, + 0xB57C: 0x7A05, + 0xB57D: 0x7A00, + 0xB57E: 0x7A98, + 0xB5A1: 0x7A97, + 0xB5A2: 0x7A96, + 0xB5A3: 0x7AE5, + 0xB5A4: 0x7AE3, + 0xB5A5: 0x7B49, + 0xB5A6: 0x7B56, + 0xB5A7: 0x7B46, + 0xB5A8: 0x7B50, + 0xB5A9: 0x7B52, + 0xB5AA: 0x7B54, + 0xB5AB: 0x7B4D, + 0xB5AC: 0x7B4B, + 0xB5AD: 0x7B4F, + 0xB5AE: 0x7B51, + 0xB5AF: 0x7C9F, + 0xB5B0: 0x7CA5, + 0xB5B1: 0x7D5E, + 0xB5B2: 0x7D50, + 0xB5B3: 0x7D68, + 0xB5B4: 0x7D55, + 0xB5B5: 0x7D2B, + 0xB5B6: 0x7D6E, + 0xB5B7: 0x7D72, + 0xB5B8: 0x7D61, + 0xB5B9: 0x7D66, + 0xB5BA: 0x7D62, + 0xB5BB: 0x7D70, + 0xB5BC: 0x7D73, + 0xB5BD: 0x5584, + 0xB5BE: 0x7FD4, + 0xB5BF: 0x7FD5, + 0xB5C0: 0x800B, + 0xB5C1: 0x8052, + 0xB5C2: 0x8085, + 0xB5C3: 0x8155, + 0xB5C4: 0x8154, + 0xB5C5: 0x814B, + 0xB5C6: 0x8151, + 0xB5C7: 0x814E, + 0xB5C8: 0x8139, + 0xB5C9: 0x8146, + 0xB5CA: 0x813E, + 0xB5CB: 0x814C, + 0xB5CC: 0x8153, + 0xB5CD: 0x8174, + 0xB5CE: 0x8212, + 0xB5CF: 0x821C, + 0xB5D0: 0x83E9, + 0xB5D1: 0x8403, + 0xB5D2: 0x83F8, + 0xB5D3: 0x840D, + 0xB5D4: 0x83E0, + 0xB5D5: 0x83C5, + 0xB5D6: 0x840B, + 0xB5D7: 0x83C1, + 0xB5D8: 0x83EF, + 0xB5D9: 0x83F1, + 0xB5DA: 0x83F4, + 0xB5DB: 0x8457, + 0xB5DC: 0x840A, + 0xB5DD: 0x83F0, + 0xB5DE: 0x840C, + 0xB5DF: 0x83CC, + 0xB5E0: 0x83FD, + 0xB5E1: 0x83F2, + 0xB5E2: 0x83CA, + 0xB5E3: 0x8438, + 0xB5E4: 0x840E, + 0xB5E5: 0x8404, + 0xB5E6: 0x83DC, + 0xB5E7: 0x8407, + 0xB5E8: 0x83D4, + 0xB5E9: 0x83DF, + 0xB5EA: 0x865B, + 0xB5EB: 0x86DF, + 0xB5EC: 0x86D9, + 0xB5ED: 0x86ED, + 0xB5EE: 0x86D4, + 0xB5EF: 0x86DB, + 0xB5F0: 0x86E4, + 0xB5F1: 0x86D0, + 0xB5F2: 0x86DE, + 0xB5F3: 0x8857, + 0xB5F4: 0x88C1, + 0xB5F5: 0x88C2, + 0xB5F6: 0x88B1, + 0xB5F7: 0x8983, + 0xB5F8: 0x8996, + 0xB5F9: 0x8A3B, + 0xB5FA: 0x8A60, + 0xB5FB: 0x8A55, + 0xB5FC: 0x8A5E, + 0xB5FD: 0x8A3C, + 0xB5FE: 0x8A41, + 0xB640: 0x8A54, + 0xB641: 0x8A5B, + 0xB642: 0x8A50, + 0xB643: 0x8A46, + 0xB644: 0x8A34, + 0xB645: 0x8A3A, + 0xB646: 0x8A36, + 0xB647: 0x8A56, + 0xB648: 0x8C61, + 0xB649: 0x8C82, + 0xB64A: 0x8CAF, + 0xB64B: 0x8CBC, + 0xB64C: 0x8CB3, + 0xB64D: 0x8CBD, + 0xB64E: 0x8CC1, + 0xB64F: 0x8CBB, + 0xB650: 0x8CC0, + 0xB651: 0x8CB4, + 0xB652: 0x8CB7, + 0xB653: 0x8CB6, + 0xB654: 0x8CBF, + 0xB655: 0x8CB8, + 0xB656: 0x8D8A, + 0xB657: 0x8D85, + 0xB658: 0x8D81, + 0xB659: 0x8DCE, + 0xB65A: 0x8DDD, + 0xB65B: 0x8DCB, + 0xB65C: 0x8DDA, + 0xB65D: 0x8DD1, + 0xB65E: 0x8DCC, + 0xB65F: 0x8DDB, + 0xB660: 0x8DC6, + 0xB661: 0x8EFB, + 0xB662: 0x8EF8, + 0xB663: 0x8EFC, + 0xB664: 0x8F9C, + 0xB665: 0x902E, + 0xB666: 0x9035, + 0xB667: 0x9031, + 0xB668: 0x9038, + 0xB669: 0x9032, + 0xB66A: 0x9036, + 0xB66B: 0x9102, + 0xB66C: 0x90F5, + 0xB66D: 0x9109, + 0xB66E: 0x90FE, + 0xB66F: 0x9163, + 0xB670: 0x9165, + 0xB671: 0x91CF, + 0xB672: 0x9214, + 0xB673: 0x9215, + 0xB674: 0x9223, + 0xB675: 0x9209, + 0xB676: 0x921E, + 0xB677: 0x920D, + 0xB678: 0x9210, + 0xB679: 0x9207, + 0xB67A: 0x9211, + 0xB67B: 0x9594, + 0xB67C: 0x958F, + 0xB67D: 0x958B, + 0xB67E: 0x9591, + 0xB6A1: 0x9593, + 0xB6A2: 0x9592, + 0xB6A3: 0x958E, + 0xB6A4: 0x968A, + 0xB6A5: 0x968E, + 0xB6A6: 0x968B, + 0xB6A7: 0x967D, + 0xB6A8: 0x9685, + 0xB6A9: 0x9686, + 0xB6AA: 0x968D, + 0xB6AB: 0x9672, + 0xB6AC: 0x9684, + 0xB6AD: 0x96C1, + 0xB6AE: 0x96C5, + 0xB6AF: 0x96C4, + 0xB6B0: 0x96C6, + 0xB6B1: 0x96C7, + 0xB6B2: 0x96EF, + 0xB6B3: 0x96F2, + 0xB6B4: 0x97CC, + 0xB6B5: 0x9805, + 0xB6B6: 0x9806, + 0xB6B7: 0x9808, + 0xB6B8: 0x98E7, + 0xB6B9: 0x98EA, + 0xB6BA: 0x98EF, + 0xB6BB: 0x98E9, + 0xB6BC: 0x98F2, + 0xB6BD: 0x98ED, + 0xB6BE: 0x99AE, + 0xB6BF: 0x99AD, + 0xB6C0: 0x9EC3, + 0xB6C1: 0x9ECD, + 0xB6C2: 0x9ED1, + 0xB6C3: 0x4E82, + 0xB6C4: 0x50AD, + 0xB6C5: 0x50B5, + 0xB6C6: 0x50B2, + 0xB6C7: 0x50B3, + 0xB6C8: 0x50C5, + 0xB6C9: 0x50BE, + 0xB6CA: 0x50AC, + 0xB6CB: 0x50B7, + 0xB6CC: 0x50BB, + 0xB6CD: 0x50AF, + 0xB6CE: 0x50C7, + 0xB6CF: 0x527F, + 0xB6D0: 0x5277, + 0xB6D1: 0x527D, + 0xB6D2: 0x52DF, + 0xB6D3: 0x52E6, + 0xB6D4: 0x52E4, + 0xB6D5: 0x52E2, + 0xB6D6: 0x52E3, + 0xB6D7: 0x532F, + 0xB6D8: 0x55DF, + 0xB6D9: 0x55E8, + 0xB6DA: 0x55D3, + 0xB6DB: 0x55E6, + 0xB6DC: 0x55CE, + 0xB6DD: 0x55DC, + 0xB6DE: 0x55C7, + 0xB6DF: 0x55D1, + 0xB6E0: 0x55E3, + 0xB6E1: 0x55E4, + 0xB6E2: 0x55EF, + 0xB6E3: 0x55DA, + 0xB6E4: 0x55E1, + 0xB6E5: 0x55C5, + 0xB6E6: 0x55C6, + 0xB6E7: 0x55E5, + 0xB6E8: 0x55C9, + 0xB6E9: 0x5712, + 0xB6EA: 0x5713, + 0xB6EB: 0x585E, + 0xB6EC: 0x5851, + 0xB6ED: 0x5858, + 0xB6EE: 0x5857, + 0xB6EF: 0x585A, + 0xB6F0: 0x5854, + 0xB6F1: 0x586B, + 0xB6F2: 0x584C, + 0xB6F3: 0x586D, + 0xB6F4: 0x584A, + 0xB6F5: 0x5862, + 0xB6F6: 0x5852, + 0xB6F7: 0x584B, + 0xB6F8: 0x5967, + 0xB6F9: 0x5AC1, + 0xB6FA: 0x5AC9, + 0xB6FB: 0x5ACC, + 0xB6FC: 0x5ABE, + 0xB6FD: 0x5ABD, + 0xB6FE: 0x5ABC, + 0xB740: 0x5AB3, + 0xB741: 0x5AC2, + 0xB742: 0x5AB2, + 0xB743: 0x5D69, + 0xB744: 0x5D6F, + 0xB745: 0x5E4C, + 0xB746: 0x5E79, + 0xB747: 0x5EC9, + 0xB748: 0x5EC8, + 0xB749: 0x5F12, + 0xB74A: 0x5F59, + 0xB74B: 0x5FAC, + 0xB74C: 0x5FAE, + 0xB74D: 0x611A, + 0xB74E: 0x610F, + 0xB74F: 0x6148, + 0xB750: 0x611F, + 0xB751: 0x60F3, + 0xB752: 0x611B, + 0xB753: 0x60F9, + 0xB754: 0x6101, + 0xB755: 0x6108, + 0xB756: 0x614E, + 0xB757: 0x614C, + 0xB758: 0x6144, + 0xB759: 0x614D, + 0xB75A: 0x613E, + 0xB75B: 0x6134, + 0xB75C: 0x6127, + 0xB75D: 0x610D, + 0xB75E: 0x6106, + 0xB75F: 0x6137, + 0xB760: 0x6221, + 0xB761: 0x6222, + 0xB762: 0x6413, + 0xB763: 0x643E, + 0xB764: 0x641E, + 0xB765: 0x642A, + 0xB766: 0x642D, + 0xB767: 0x643D, + 0xB768: 0x642C, + 0xB769: 0x640F, + 0xB76A: 0x641C, + 0xB76B: 0x6414, + 0xB76C: 0x640D, + 0xB76D: 0x6436, + 0xB76E: 0x6416, + 0xB76F: 0x6417, + 0xB770: 0x6406, + 0xB771: 0x656C, + 0xB772: 0x659F, + 0xB773: 0x65B0, + 0xB774: 0x6697, + 0xB775: 0x6689, + 0xB776: 0x6687, + 0xB777: 0x6688, + 0xB778: 0x6696, + 0xB779: 0x6684, + 0xB77A: 0x6698, + 0xB77B: 0x668D, + 0xB77C: 0x6703, + 0xB77D: 0x6994, + 0xB77E: 0x696D, + 0xB7A1: 0x695A, + 0xB7A2: 0x6977, + 0xB7A3: 0x6960, + 0xB7A4: 0x6954, + 0xB7A5: 0x6975, + 0xB7A6: 0x6930, + 0xB7A7: 0x6982, + 0xB7A8: 0x694A, + 0xB7A9: 0x6968, + 0xB7AA: 0x696B, + 0xB7AB: 0x695E, + 0xB7AC: 0x6953, + 0xB7AD: 0x6979, + 0xB7AE: 0x6986, + 0xB7AF: 0x695D, + 0xB7B0: 0x6963, + 0xB7B1: 0x695B, + 0xB7B2: 0x6B47, + 0xB7B3: 0x6B72, + 0xB7B4: 0x6BC0, + 0xB7B5: 0x6BBF, + 0xB7B6: 0x6BD3, + 0xB7B7: 0x6BFD, + 0xB7B8: 0x6EA2, + 0xB7B9: 0x6EAF, + 0xB7BA: 0x6ED3, + 0xB7BB: 0x6EB6, + 0xB7BC: 0x6EC2, + 0xB7BD: 0x6E90, + 0xB7BE: 0x6E9D, + 0xB7BF: 0x6EC7, + 0xB7C0: 0x6EC5, + 0xB7C1: 0x6EA5, + 0xB7C2: 0x6E98, + 0xB7C3: 0x6EBC, + 0xB7C4: 0x6EBA, + 0xB7C5: 0x6EAB, + 0xB7C6: 0x6ED1, + 0xB7C7: 0x6E96, + 0xB7C8: 0x6E9C, + 0xB7C9: 0x6EC4, + 0xB7CA: 0x6ED4, + 0xB7CB: 0x6EAA, + 0xB7CC: 0x6EA7, + 0xB7CD: 0x6EB4, + 0xB7CE: 0x714E, + 0xB7CF: 0x7159, + 0xB7D0: 0x7169, + 0xB7D1: 0x7164, + 0xB7D2: 0x7149, + 0xB7D3: 0x7167, + 0xB7D4: 0x715C, + 0xB7D5: 0x716C, + 0xB7D6: 0x7166, + 0xB7D7: 0x714C, + 0xB7D8: 0x7165, + 0xB7D9: 0x715E, + 0xB7DA: 0x7146, + 0xB7DB: 0x7168, + 0xB7DC: 0x7156, + 0xB7DD: 0x723A, + 0xB7DE: 0x7252, + 0xB7DF: 0x7337, + 0xB7E0: 0x7345, + 0xB7E1: 0x733F, + 0xB7E2: 0x733E, + 0xB7E3: 0x746F, + 0xB7E4: 0x745A, + 0xB7E5: 0x7455, + 0xB7E6: 0x745F, + 0xB7E7: 0x745E, + 0xB7E8: 0x7441, + 0xB7E9: 0x743F, + 0xB7EA: 0x7459, + 0xB7EB: 0x745B, + 0xB7EC: 0x745C, + 0xB7ED: 0x7576, + 0xB7EE: 0x7578, + 0xB7EF: 0x7600, + 0xB7F0: 0x75F0, + 0xB7F1: 0x7601, + 0xB7F2: 0x75F2, + 0xB7F3: 0x75F1, + 0xB7F4: 0x75FA, + 0xB7F5: 0x75FF, + 0xB7F6: 0x75F4, + 0xB7F7: 0x75F3, + 0xB7F8: 0x76DE, + 0xB7F9: 0x76DF, + 0xB7FA: 0x775B, + 0xB7FB: 0x776B, + 0xB7FC: 0x7766, + 0xB7FD: 0x775E, + 0xB7FE: 0x7763, + 0xB840: 0x7779, + 0xB841: 0x776A, + 0xB842: 0x776C, + 0xB843: 0x775C, + 0xB844: 0x7765, + 0xB845: 0x7768, + 0xB846: 0x7762, + 0xB847: 0x77EE, + 0xB848: 0x788E, + 0xB849: 0x78B0, + 0xB84A: 0x7897, + 0xB84B: 0x7898, + 0xB84C: 0x788C, + 0xB84D: 0x7889, + 0xB84E: 0x787C, + 0xB84F: 0x7891, + 0xB850: 0x7893, + 0xB851: 0x787F, + 0xB852: 0x797A, + 0xB853: 0x797F, + 0xB854: 0x7981, + 0xB855: 0x842C, + 0xB856: 0x79BD, + 0xB857: 0x7A1C, + 0xB858: 0x7A1A, + 0xB859: 0x7A20, + 0xB85A: 0x7A14, + 0xB85B: 0x7A1F, + 0xB85C: 0x7A1E, + 0xB85D: 0x7A9F, + 0xB85E: 0x7AA0, + 0xB85F: 0x7B77, + 0xB860: 0x7BC0, + 0xB861: 0x7B60, + 0xB862: 0x7B6E, + 0xB863: 0x7B67, + 0xB864: 0x7CB1, + 0xB865: 0x7CB3, + 0xB866: 0x7CB5, + 0xB867: 0x7D93, + 0xB868: 0x7D79, + 0xB869: 0x7D91, + 0xB86A: 0x7D81, + 0xB86B: 0x7D8F, + 0xB86C: 0x7D5B, + 0xB86D: 0x7F6E, + 0xB86E: 0x7F69, + 0xB86F: 0x7F6A, + 0xB870: 0x7F72, + 0xB871: 0x7FA9, + 0xB872: 0x7FA8, + 0xB873: 0x7FA4, + 0xB874: 0x8056, + 0xB875: 0x8058, + 0xB876: 0x8086, + 0xB877: 0x8084, + 0xB878: 0x8171, + 0xB879: 0x8170, + 0xB87A: 0x8178, + 0xB87B: 0x8165, + 0xB87C: 0x816E, + 0xB87D: 0x8173, + 0xB87E: 0x816B, + 0xB8A1: 0x8179, + 0xB8A2: 0x817A, + 0xB8A3: 0x8166, + 0xB8A4: 0x8205, + 0xB8A5: 0x8247, + 0xB8A6: 0x8482, + 0xB8A7: 0x8477, + 0xB8A8: 0x843D, + 0xB8A9: 0x8431, + 0xB8AA: 0x8475, + 0xB8AB: 0x8466, + 0xB8AC: 0x846B, + 0xB8AD: 0x8449, + 0xB8AE: 0x846C, + 0xB8AF: 0x845B, + 0xB8B0: 0x843C, + 0xB8B1: 0x8435, + 0xB8B2: 0x8461, + 0xB8B3: 0x8463, + 0xB8B4: 0x8469, + 0xB8B5: 0x846D, + 0xB8B6: 0x8446, + 0xB8B7: 0x865E, + 0xB8B8: 0x865C, + 0xB8B9: 0x865F, + 0xB8BA: 0x86F9, + 0xB8BB: 0x8713, + 0xB8BC: 0x8708, + 0xB8BD: 0x8707, + 0xB8BE: 0x8700, + 0xB8BF: 0x86FE, + 0xB8C0: 0x86FB, + 0xB8C1: 0x8702, + 0xB8C2: 0x8703, + 0xB8C3: 0x8706, + 0xB8C4: 0x870A, + 0xB8C5: 0x8859, + 0xB8C6: 0x88DF, + 0xB8C7: 0x88D4, + 0xB8C8: 0x88D9, + 0xB8C9: 0x88DC, + 0xB8CA: 0x88D8, + 0xB8CB: 0x88DD, + 0xB8CC: 0x88E1, + 0xB8CD: 0x88CA, + 0xB8CE: 0x88D5, + 0xB8CF: 0x88D2, + 0xB8D0: 0x899C, + 0xB8D1: 0x89E3, + 0xB8D2: 0x8A6B, + 0xB8D3: 0x8A72, + 0xB8D4: 0x8A73, + 0xB8D5: 0x8A66, + 0xB8D6: 0x8A69, + 0xB8D7: 0x8A70, + 0xB8D8: 0x8A87, + 0xB8D9: 0x8A7C, + 0xB8DA: 0x8A63, + 0xB8DB: 0x8AA0, + 0xB8DC: 0x8A71, + 0xB8DD: 0x8A85, + 0xB8DE: 0x8A6D, + 0xB8DF: 0x8A62, + 0xB8E0: 0x8A6E, + 0xB8E1: 0x8A6C, + 0xB8E2: 0x8A79, + 0xB8E3: 0x8A7B, + 0xB8E4: 0x8A3E, + 0xB8E5: 0x8A68, + 0xB8E6: 0x8C62, + 0xB8E7: 0x8C8A, + 0xB8E8: 0x8C89, + 0xB8E9: 0x8CCA, + 0xB8EA: 0x8CC7, + 0xB8EB: 0x8CC8, + 0xB8EC: 0x8CC4, + 0xB8ED: 0x8CB2, + 0xB8EE: 0x8CC3, + 0xB8EF: 0x8CC2, + 0xB8F0: 0x8CC5, + 0xB8F1: 0x8DE1, + 0xB8F2: 0x8DDF, + 0xB8F3: 0x8DE8, + 0xB8F4: 0x8DEF, + 0xB8F5: 0x8DF3, + 0xB8F6: 0x8DFA, + 0xB8F7: 0x8DEA, + 0xB8F8: 0x8DE4, + 0xB8F9: 0x8DE6, + 0xB8FA: 0x8EB2, + 0xB8FB: 0x8F03, + 0xB8FC: 0x8F09, + 0xB8FD: 0x8EFE, + 0xB8FE: 0x8F0A, + 0xB940: 0x8F9F, + 0xB941: 0x8FB2, + 0xB942: 0x904B, + 0xB943: 0x904A, + 0xB944: 0x9053, + 0xB945: 0x9042, + 0xB946: 0x9054, + 0xB947: 0x903C, + 0xB948: 0x9055, + 0xB949: 0x9050, + 0xB94A: 0x9047, + 0xB94B: 0x904F, + 0xB94C: 0x904E, + 0xB94D: 0x904D, + 0xB94E: 0x9051, + 0xB94F: 0x903E, + 0xB950: 0x9041, + 0xB951: 0x9112, + 0xB952: 0x9117, + 0xB953: 0x916C, + 0xB954: 0x916A, + 0xB955: 0x9169, + 0xB956: 0x91C9, + 0xB957: 0x9237, + 0xB958: 0x9257, + 0xB959: 0x9238, + 0xB95A: 0x923D, + 0xB95B: 0x9240, + 0xB95C: 0x923E, + 0xB95D: 0x925B, + 0xB95E: 0x924B, + 0xB95F: 0x9264, + 0xB960: 0x9251, + 0xB961: 0x9234, + 0xB962: 0x9249, + 0xB963: 0x924D, + 0xB964: 0x9245, + 0xB965: 0x9239, + 0xB966: 0x923F, + 0xB967: 0x925A, + 0xB968: 0x9598, + 0xB969: 0x9698, + 0xB96A: 0x9694, + 0xB96B: 0x9695, + 0xB96C: 0x96CD, + 0xB96D: 0x96CB, + 0xB96E: 0x96C9, + 0xB96F: 0x96CA, + 0xB970: 0x96F7, + 0xB971: 0x96FB, + 0xB972: 0x96F9, + 0xB973: 0x96F6, + 0xB974: 0x9756, + 0xB975: 0x9774, + 0xB976: 0x9776, + 0xB977: 0x9810, + 0xB978: 0x9811, + 0xB979: 0x9813, + 0xB97A: 0x980A, + 0xB97B: 0x9812, + 0xB97C: 0x980C, + 0xB97D: 0x98FC, + 0xB97E: 0x98F4, + 0xB9A1: 0x98FD, + 0xB9A2: 0x98FE, + 0xB9A3: 0x99B3, + 0xB9A4: 0x99B1, + 0xB9A5: 0x99B4, + 0xB9A6: 0x9AE1, + 0xB9A7: 0x9CE9, + 0xB9A8: 0x9E82, + 0xB9A9: 0x9F0E, + 0xB9AA: 0x9F13, + 0xB9AB: 0x9F20, + 0xB9AC: 0x50E7, + 0xB9AD: 0x50EE, + 0xB9AE: 0x50E5, + 0xB9AF: 0x50D6, + 0xB9B0: 0x50ED, + 0xB9B1: 0x50DA, + 0xB9B2: 0x50D5, + 0xB9B3: 0x50CF, + 0xB9B4: 0x50D1, + 0xB9B5: 0x50F1, + 0xB9B6: 0x50CE, + 0xB9B7: 0x50E9, + 0xB9B8: 0x5162, + 0xB9B9: 0x51F3, + 0xB9BA: 0x5283, + 0xB9BB: 0x5282, + 0xB9BC: 0x5331, + 0xB9BD: 0x53AD, + 0xB9BE: 0x55FE, + 0xB9BF: 0x5600, + 0xB9C0: 0x561B, + 0xB9C1: 0x5617, + 0xB9C2: 0x55FD, + 0xB9C3: 0x5614, + 0xB9C4: 0x5606, + 0xB9C5: 0x5609, + 0xB9C6: 0x560D, + 0xB9C7: 0x560E, + 0xB9C8: 0x55F7, + 0xB9C9: 0x5616, + 0xB9CA: 0x561F, + 0xB9CB: 0x5608, + 0xB9CC: 0x5610, + 0xB9CD: 0x55F6, + 0xB9CE: 0x5718, + 0xB9CF: 0x5716, + 0xB9D0: 0x5875, + 0xB9D1: 0x587E, + 0xB9D2: 0x5883, + 0xB9D3: 0x5893, + 0xB9D4: 0x588A, + 0xB9D5: 0x5879, + 0xB9D6: 0x5885, + 0xB9D7: 0x587D, + 0xB9D8: 0x58FD, + 0xB9D9: 0x5925, + 0xB9DA: 0x5922, + 0xB9DB: 0x5924, + 0xB9DC: 0x596A, + 0xB9DD: 0x5969, + 0xB9DE: 0x5AE1, + 0xB9DF: 0x5AE6, + 0xB9E0: 0x5AE9, + 0xB9E1: 0x5AD7, + 0xB9E2: 0x5AD6, + 0xB9E3: 0x5AD8, + 0xB9E4: 0x5AE3, + 0xB9E5: 0x5B75, + 0xB9E6: 0x5BDE, + 0xB9E7: 0x5BE7, + 0xB9E8: 0x5BE1, + 0xB9E9: 0x5BE5, + 0xB9EA: 0x5BE6, + 0xB9EB: 0x5BE8, + 0xB9EC: 0x5BE2, + 0xB9ED: 0x5BE4, + 0xB9EE: 0x5BDF, + 0xB9EF: 0x5C0D, + 0xB9F0: 0x5C62, + 0xB9F1: 0x5D84, + 0xB9F2: 0x5D87, + 0xB9F3: 0x5E5B, + 0xB9F4: 0x5E63, + 0xB9F5: 0x5E55, + 0xB9F6: 0x5E57, + 0xB9F7: 0x5E54, + 0xB9F8: 0x5ED3, + 0xB9F9: 0x5ED6, + 0xB9FA: 0x5F0A, + 0xB9FB: 0x5F46, + 0xB9FC: 0x5F70, + 0xB9FD: 0x5FB9, + 0xB9FE: 0x6147, + 0xBA40: 0x613F, + 0xBA41: 0x614B, + 0xBA42: 0x6177, + 0xBA43: 0x6162, + 0xBA44: 0x6163, + 0xBA45: 0x615F, + 0xBA46: 0x615A, + 0xBA47: 0x6158, + 0xBA48: 0x6175, + 0xBA49: 0x622A, + 0xBA4A: 0x6487, + 0xBA4B: 0x6458, + 0xBA4C: 0x6454, + 0xBA4D: 0x64A4, + 0xBA4E: 0x6478, + 0xBA4F: 0x645F, + 0xBA50: 0x647A, + 0xBA51: 0x6451, + 0xBA52: 0x6467, + 0xBA53: 0x6434, + 0xBA54: 0x646D, + 0xBA55: 0x647B, + 0xBA56: 0x6572, + 0xBA57: 0x65A1, + 0xBA58: 0x65D7, + 0xBA59: 0x65D6, + 0xBA5A: 0x66A2, + 0xBA5B: 0x66A8, + 0xBA5C: 0x669D, + 0xBA5D: 0x699C, + 0xBA5E: 0x69A8, + 0xBA5F: 0x6995, + 0xBA60: 0x69C1, + 0xBA61: 0x69AE, + 0xBA62: 0x69D3, + 0xBA63: 0x69CB, + 0xBA64: 0x699B, + 0xBA65: 0x69B7, + 0xBA66: 0x69BB, + 0xBA67: 0x69AB, + 0xBA68: 0x69B4, + 0xBA69: 0x69D0, + 0xBA6A: 0x69CD, + 0xBA6B: 0x69AD, + 0xBA6C: 0x69CC, + 0xBA6D: 0x69A6, + 0xBA6E: 0x69C3, + 0xBA6F: 0x69A3, + 0xBA70: 0x6B49, + 0xBA71: 0x6B4C, + 0xBA72: 0x6C33, + 0xBA73: 0x6F33, + 0xBA74: 0x6F14, + 0xBA75: 0x6EFE, + 0xBA76: 0x6F13, + 0xBA77: 0x6EF4, + 0xBA78: 0x6F29, + 0xBA79: 0x6F3E, + 0xBA7A: 0x6F20, + 0xBA7B: 0x6F2C, + 0xBA7C: 0x6F0F, + 0xBA7D: 0x6F02, + 0xBA7E: 0x6F22, + 0xBAA1: 0x6EFF, + 0xBAA2: 0x6EEF, + 0xBAA3: 0x6F06, + 0xBAA4: 0x6F31, + 0xBAA5: 0x6F38, + 0xBAA6: 0x6F32, + 0xBAA7: 0x6F23, + 0xBAA8: 0x6F15, + 0xBAA9: 0x6F2B, + 0xBAAA: 0x6F2F, + 0xBAAB: 0x6F88, + 0xBAAC: 0x6F2A, + 0xBAAD: 0x6EEC, + 0xBAAE: 0x6F01, + 0xBAAF: 0x6EF2, + 0xBAB0: 0x6ECC, + 0xBAB1: 0x6EF7, + 0xBAB2: 0x7194, + 0xBAB3: 0x7199, + 0xBAB4: 0x717D, + 0xBAB5: 0x718A, + 0xBAB6: 0x7184, + 0xBAB7: 0x7192, + 0xBAB8: 0x723E, + 0xBAB9: 0x7292, + 0xBABA: 0x7296, + 0xBABB: 0x7344, + 0xBABC: 0x7350, + 0xBABD: 0x7464, + 0xBABE: 0x7463, + 0xBABF: 0x746A, + 0xBAC0: 0x7470, + 0xBAC1: 0x746D, + 0xBAC2: 0x7504, + 0xBAC3: 0x7591, + 0xBAC4: 0x7627, + 0xBAC5: 0x760D, + 0xBAC6: 0x760B, + 0xBAC7: 0x7609, + 0xBAC8: 0x7613, + 0xBAC9: 0x76E1, + 0xBACA: 0x76E3, + 0xBACB: 0x7784, + 0xBACC: 0x777D, + 0xBACD: 0x777F, + 0xBACE: 0x7761, + 0xBACF: 0x78C1, + 0xBAD0: 0x789F, + 0xBAD1: 0x78A7, + 0xBAD2: 0x78B3, + 0xBAD3: 0x78A9, + 0xBAD4: 0x78A3, + 0xBAD5: 0x798E, + 0xBAD6: 0x798F, + 0xBAD7: 0x798D, + 0xBAD8: 0x7A2E, + 0xBAD9: 0x7A31, + 0xBADA: 0x7AAA, + 0xBADB: 0x7AA9, + 0xBADC: 0x7AED, + 0xBADD: 0x7AEF, + 0xBADE: 0x7BA1, + 0xBADF: 0x7B95, + 0xBAE0: 0x7B8B, + 0xBAE1: 0x7B75, + 0xBAE2: 0x7B97, + 0xBAE3: 0x7B9D, + 0xBAE4: 0x7B94, + 0xBAE5: 0x7B8F, + 0xBAE6: 0x7BB8, + 0xBAE7: 0x7B87, + 0xBAE8: 0x7B84, + 0xBAE9: 0x7CB9, + 0xBAEA: 0x7CBD, + 0xBAEB: 0x7CBE, + 0xBAEC: 0x7DBB, + 0xBAED: 0x7DB0, + 0xBAEE: 0x7D9C, + 0xBAEF: 0x7DBD, + 0xBAF0: 0x7DBE, + 0xBAF1: 0x7DA0, + 0xBAF2: 0x7DCA, + 0xBAF3: 0x7DB4, + 0xBAF4: 0x7DB2, + 0xBAF5: 0x7DB1, + 0xBAF6: 0x7DBA, + 0xBAF7: 0x7DA2, + 0xBAF8: 0x7DBF, + 0xBAF9: 0x7DB5, + 0xBAFA: 0x7DB8, + 0xBAFB: 0x7DAD, + 0xBAFC: 0x7DD2, + 0xBAFD: 0x7DC7, + 0xBAFE: 0x7DAC, + 0xBB40: 0x7F70, + 0xBB41: 0x7FE0, + 0xBB42: 0x7FE1, + 0xBB43: 0x7FDF, + 0xBB44: 0x805E, + 0xBB45: 0x805A, + 0xBB46: 0x8087, + 0xBB47: 0x8150, + 0xBB48: 0x8180, + 0xBB49: 0x818F, + 0xBB4A: 0x8188, + 0xBB4B: 0x818A, + 0xBB4C: 0x817F, + 0xBB4D: 0x8182, + 0xBB4E: 0x81E7, + 0xBB4F: 0x81FA, + 0xBB50: 0x8207, + 0xBB51: 0x8214, + 0xBB52: 0x821E, + 0xBB53: 0x824B, + 0xBB54: 0x84C9, + 0xBB55: 0x84BF, + 0xBB56: 0x84C6, + 0xBB57: 0x84C4, + 0xBB58: 0x8499, + 0xBB59: 0x849E, + 0xBB5A: 0x84B2, + 0xBB5B: 0x849C, + 0xBB5C: 0x84CB, + 0xBB5D: 0x84B8, + 0xBB5E: 0x84C0, + 0xBB5F: 0x84D3, + 0xBB60: 0x8490, + 0xBB61: 0x84BC, + 0xBB62: 0x84D1, + 0xBB63: 0x84CA, + 0xBB64: 0x873F, + 0xBB65: 0x871C, + 0xBB66: 0x873B, + 0xBB67: 0x8722, + 0xBB68: 0x8725, + 0xBB69: 0x8734, + 0xBB6A: 0x8718, + 0xBB6B: 0x8755, + 0xBB6C: 0x8737, + 0xBB6D: 0x8729, + 0xBB6E: 0x88F3, + 0xBB6F: 0x8902, + 0xBB70: 0x88F4, + 0xBB71: 0x88F9, + 0xBB72: 0x88F8, + 0xBB73: 0x88FD, + 0xBB74: 0x88E8, + 0xBB75: 0x891A, + 0xBB76: 0x88EF, + 0xBB77: 0x8AA6, + 0xBB78: 0x8A8C, + 0xBB79: 0x8A9E, + 0xBB7A: 0x8AA3, + 0xBB7B: 0x8A8D, + 0xBB7C: 0x8AA1, + 0xBB7D: 0x8A93, + 0xBB7E: 0x8AA4, + 0xBBA1: 0x8AAA, + 0xBBA2: 0x8AA5, + 0xBBA3: 0x8AA8, + 0xBBA4: 0x8A98, + 0xBBA5: 0x8A91, + 0xBBA6: 0x8A9A, + 0xBBA7: 0x8AA7, + 0xBBA8: 0x8C6A, + 0xBBA9: 0x8C8D, + 0xBBAA: 0x8C8C, + 0xBBAB: 0x8CD3, + 0xBBAC: 0x8CD1, + 0xBBAD: 0x8CD2, + 0xBBAE: 0x8D6B, + 0xBBAF: 0x8D99, + 0xBBB0: 0x8D95, + 0xBBB1: 0x8DFC, + 0xBBB2: 0x8F14, + 0xBBB3: 0x8F12, + 0xBBB4: 0x8F15, + 0xBBB5: 0x8F13, + 0xBBB6: 0x8FA3, + 0xBBB7: 0x9060, + 0xBBB8: 0x9058, + 0xBBB9: 0x905C, + 0xBBBA: 0x9063, + 0xBBBB: 0x9059, + 0xBBBC: 0x905E, + 0xBBBD: 0x9062, + 0xBBBE: 0x905D, + 0xBBBF: 0x905B, + 0xBBC0: 0x9119, + 0xBBC1: 0x9118, + 0xBBC2: 0x911E, + 0xBBC3: 0x9175, + 0xBBC4: 0x9178, + 0xBBC5: 0x9177, + 0xBBC6: 0x9174, + 0xBBC7: 0x9278, + 0xBBC8: 0x9280, + 0xBBC9: 0x9285, + 0xBBCA: 0x9298, + 0xBBCB: 0x9296, + 0xBBCC: 0x927B, + 0xBBCD: 0x9293, + 0xBBCE: 0x929C, + 0xBBCF: 0x92A8, + 0xBBD0: 0x927C, + 0xBBD1: 0x9291, + 0xBBD2: 0x95A1, + 0xBBD3: 0x95A8, + 0xBBD4: 0x95A9, + 0xBBD5: 0x95A3, + 0xBBD6: 0x95A5, + 0xBBD7: 0x95A4, + 0xBBD8: 0x9699, + 0xBBD9: 0x969C, + 0xBBDA: 0x969B, + 0xBBDB: 0x96CC, + 0xBBDC: 0x96D2, + 0xBBDD: 0x9700, + 0xBBDE: 0x977C, + 0xBBDF: 0x9785, + 0xBBE0: 0x97F6, + 0xBBE1: 0x9817, + 0xBBE2: 0x9818, + 0xBBE3: 0x98AF, + 0xBBE4: 0x98B1, + 0xBBE5: 0x9903, + 0xBBE6: 0x9905, + 0xBBE7: 0x990C, + 0xBBE8: 0x9909, + 0xBBE9: 0x99C1, + 0xBBEA: 0x9AAF, + 0xBBEB: 0x9AB0, + 0xBBEC: 0x9AE6, + 0xBBED: 0x9B41, + 0xBBEE: 0x9B42, + 0xBBEF: 0x9CF4, + 0xBBF0: 0x9CF6, + 0xBBF1: 0x9CF3, + 0xBBF2: 0x9EBC, + 0xBBF3: 0x9F3B, + 0xBBF4: 0x9F4A, + 0xBBF5: 0x5104, + 0xBBF6: 0x5100, + 0xBBF7: 0x50FB, + 0xBBF8: 0x50F5, + 0xBBF9: 0x50F9, + 0xBBFA: 0x5102, + 0xBBFB: 0x5108, + 0xBBFC: 0x5109, + 0xBBFD: 0x5105, + 0xBBFE: 0x51DC, + 0xBC40: 0x5287, + 0xBC41: 0x5288, + 0xBC42: 0x5289, + 0xBC43: 0x528D, + 0xBC44: 0x528A, + 0xBC45: 0x52F0, + 0xBC46: 0x53B2, + 0xBC47: 0x562E, + 0xBC48: 0x563B, + 0xBC49: 0x5639, + 0xBC4A: 0x5632, + 0xBC4B: 0x563F, + 0xBC4C: 0x5634, + 0xBC4D: 0x5629, + 0xBC4E: 0x5653, + 0xBC4F: 0x564E, + 0xBC50: 0x5657, + 0xBC51: 0x5674, + 0xBC52: 0x5636, + 0xBC53: 0x562F, + 0xBC54: 0x5630, + 0xBC55: 0x5880, + 0xBC56: 0x589F, + 0xBC57: 0x589E, + 0xBC58: 0x58B3, + 0xBC59: 0x589C, + 0xBC5A: 0x58AE, + 0xBC5B: 0x58A9, + 0xBC5C: 0x58A6, + 0xBC5D: 0x596D, + 0xBC5E: 0x5B09, + 0xBC5F: 0x5AFB, + 0xBC60: 0x5B0B, + 0xBC61: 0x5AF5, + 0xBC62: 0x5B0C, + 0xBC63: 0x5B08, + 0xBC64: 0x5BEE, + 0xBC65: 0x5BEC, + 0xBC66: 0x5BE9, + 0xBC67: 0x5BEB, + 0xBC68: 0x5C64, + 0xBC69: 0x5C65, + 0xBC6A: 0x5D9D, + 0xBC6B: 0x5D94, + 0xBC6C: 0x5E62, + 0xBC6D: 0x5E5F, + 0xBC6E: 0x5E61, + 0xBC6F: 0x5EE2, + 0xBC70: 0x5EDA, + 0xBC71: 0x5EDF, + 0xBC72: 0x5EDD, + 0xBC73: 0x5EE3, + 0xBC74: 0x5EE0, + 0xBC75: 0x5F48, + 0xBC76: 0x5F71, + 0xBC77: 0x5FB7, + 0xBC78: 0x5FB5, + 0xBC79: 0x6176, + 0xBC7A: 0x6167, + 0xBC7B: 0x616E, + 0xBC7C: 0x615D, + 0xBC7D: 0x6155, + 0xBC7E: 0x6182, + 0xBCA1: 0x617C, + 0xBCA2: 0x6170, + 0xBCA3: 0x616B, + 0xBCA4: 0x617E, + 0xBCA5: 0x61A7, + 0xBCA6: 0x6190, + 0xBCA7: 0x61AB, + 0xBCA8: 0x618E, + 0xBCA9: 0x61AC, + 0xBCAA: 0x619A, + 0xBCAB: 0x61A4, + 0xBCAC: 0x6194, + 0xBCAD: 0x61AE, + 0xBCAE: 0x622E, + 0xBCAF: 0x6469, + 0xBCB0: 0x646F, + 0xBCB1: 0x6479, + 0xBCB2: 0x649E, + 0xBCB3: 0x64B2, + 0xBCB4: 0x6488, + 0xBCB5: 0x6490, + 0xBCB6: 0x64B0, + 0xBCB7: 0x64A5, + 0xBCB8: 0x6493, + 0xBCB9: 0x6495, + 0xBCBA: 0x64A9, + 0xBCBB: 0x6492, + 0xBCBC: 0x64AE, + 0xBCBD: 0x64AD, + 0xBCBE: 0x64AB, + 0xBCBF: 0x649A, + 0xBCC0: 0x64AC, + 0xBCC1: 0x6499, + 0xBCC2: 0x64A2, + 0xBCC3: 0x64B3, + 0xBCC4: 0x6575, + 0xBCC5: 0x6577, + 0xBCC6: 0x6578, + 0xBCC7: 0x66AE, + 0xBCC8: 0x66AB, + 0xBCC9: 0x66B4, + 0xBCCA: 0x66B1, + 0xBCCB: 0x6A23, + 0xBCCC: 0x6A1F, + 0xBCCD: 0x69E8, + 0xBCCE: 0x6A01, + 0xBCCF: 0x6A1E, + 0xBCD0: 0x6A19, + 0xBCD1: 0x69FD, + 0xBCD2: 0x6A21, + 0xBCD3: 0x6A13, + 0xBCD4: 0x6A0A, + 0xBCD5: 0x69F3, + 0xBCD6: 0x6A02, + 0xBCD7: 0x6A05, + 0xBCD8: 0x69ED, + 0xBCD9: 0x6A11, + 0xBCDA: 0x6B50, + 0xBCDB: 0x6B4E, + 0xBCDC: 0x6BA4, + 0xBCDD: 0x6BC5, + 0xBCDE: 0x6BC6, + 0xBCDF: 0x6F3F, + 0xBCE0: 0x6F7C, + 0xBCE1: 0x6F84, + 0xBCE2: 0x6F51, + 0xBCE3: 0x6F66, + 0xBCE4: 0x6F54, + 0xBCE5: 0x6F86, + 0xBCE6: 0x6F6D, + 0xBCE7: 0x6F5B, + 0xBCE8: 0x6F78, + 0xBCE9: 0x6F6E, + 0xBCEA: 0x6F8E, + 0xBCEB: 0x6F7A, + 0xBCEC: 0x6F70, + 0xBCED: 0x6F64, + 0xBCEE: 0x6F97, + 0xBCEF: 0x6F58, + 0xBCF0: 0x6ED5, + 0xBCF1: 0x6F6F, + 0xBCF2: 0x6F60, + 0xBCF3: 0x6F5F, + 0xBCF4: 0x719F, + 0xBCF5: 0x71AC, + 0xBCF6: 0x71B1, + 0xBCF7: 0x71A8, + 0xBCF8: 0x7256, + 0xBCF9: 0x729B, + 0xBCFA: 0x734E, + 0xBCFB: 0x7357, + 0xBCFC: 0x7469, + 0xBCFD: 0x748B, + 0xBCFE: 0x7483, + 0xBD40: 0x747E, + 0xBD41: 0x7480, + 0xBD42: 0x757F, + 0xBD43: 0x7620, + 0xBD44: 0x7629, + 0xBD45: 0x761F, + 0xBD46: 0x7624, + 0xBD47: 0x7626, + 0xBD48: 0x7621, + 0xBD49: 0x7622, + 0xBD4A: 0x769A, + 0xBD4B: 0x76BA, + 0xBD4C: 0x76E4, + 0xBD4D: 0x778E, + 0xBD4E: 0x7787, + 0xBD4F: 0x778C, + 0xBD50: 0x7791, + 0xBD51: 0x778B, + 0xBD52: 0x78CB, + 0xBD53: 0x78C5, + 0xBD54: 0x78BA, + 0xBD55: 0x78CA, + 0xBD56: 0x78BE, + 0xBD57: 0x78D5, + 0xBD58: 0x78BC, + 0xBD59: 0x78D0, + 0xBD5A: 0x7A3F, + 0xBD5B: 0x7A3C, + 0xBD5C: 0x7A40, + 0xBD5D: 0x7A3D, + 0xBD5E: 0x7A37, + 0xBD5F: 0x7A3B, + 0xBD60: 0x7AAF, + 0xBD61: 0x7AAE, + 0xBD62: 0x7BAD, + 0xBD63: 0x7BB1, + 0xBD64: 0x7BC4, + 0xBD65: 0x7BB4, + 0xBD66: 0x7BC6, + 0xBD67: 0x7BC7, + 0xBD68: 0x7BC1, + 0xBD69: 0x7BA0, + 0xBD6A: 0x7BCC, + 0xBD6B: 0x7CCA, + 0xBD6C: 0x7DE0, + 0xBD6D: 0x7DF4, + 0xBD6E: 0x7DEF, + 0xBD6F: 0x7DFB, + 0xBD70: 0x7DD8, + 0xBD71: 0x7DEC, + 0xBD72: 0x7DDD, + 0xBD73: 0x7DE8, + 0xBD74: 0x7DE3, + 0xBD75: 0x7DDA, + 0xBD76: 0x7DDE, + 0xBD77: 0x7DE9, + 0xBD78: 0x7D9E, + 0xBD79: 0x7DD9, + 0xBD7A: 0x7DF2, + 0xBD7B: 0x7DF9, + 0xBD7C: 0x7F75, + 0xBD7D: 0x7F77, + 0xBD7E: 0x7FAF, + 0xBDA1: 0x7FE9, + 0xBDA2: 0x8026, + 0xBDA3: 0x819B, + 0xBDA4: 0x819C, + 0xBDA5: 0x819D, + 0xBDA6: 0x81A0, + 0xBDA7: 0x819A, + 0xBDA8: 0x8198, + 0xBDA9: 0x8517, + 0xBDAA: 0x853D, + 0xBDAB: 0x851A, + 0xBDAC: 0x84EE, + 0xBDAD: 0x852C, + 0xBDAE: 0x852D, + 0xBDAF: 0x8513, + 0xBDB0: 0x8511, + 0xBDB1: 0x8523, + 0xBDB2: 0x8521, + 0xBDB3: 0x8514, + 0xBDB4: 0x84EC, + 0xBDB5: 0x8525, + 0xBDB6: 0x84FF, + 0xBDB7: 0x8506, + 0xBDB8: 0x8782, + 0xBDB9: 0x8774, + 0xBDBA: 0x8776, + 0xBDBB: 0x8760, + 0xBDBC: 0x8766, + 0xBDBD: 0x8778, + 0xBDBE: 0x8768, + 0xBDBF: 0x8759, + 0xBDC0: 0x8757, + 0xBDC1: 0x874C, + 0xBDC2: 0x8753, + 0xBDC3: 0x885B, + 0xBDC4: 0x885D, + 0xBDC5: 0x8910, + 0xBDC6: 0x8907, + 0xBDC7: 0x8912, + 0xBDC8: 0x8913, + 0xBDC9: 0x8915, + 0xBDCA: 0x890A, + 0xBDCB: 0x8ABC, + 0xBDCC: 0x8AD2, + 0xBDCD: 0x8AC7, + 0xBDCE: 0x8AC4, + 0xBDCF: 0x8A95, + 0xBDD0: 0x8ACB, + 0xBDD1: 0x8AF8, + 0xBDD2: 0x8AB2, + 0xBDD3: 0x8AC9, + 0xBDD4: 0x8AC2, + 0xBDD5: 0x8ABF, + 0xBDD6: 0x8AB0, + 0xBDD7: 0x8AD6, + 0xBDD8: 0x8ACD, + 0xBDD9: 0x8AB6, + 0xBDDA: 0x8AB9, + 0xBDDB: 0x8ADB, + 0xBDDC: 0x8C4C, + 0xBDDD: 0x8C4E, + 0xBDDE: 0x8C6C, + 0xBDDF: 0x8CE0, + 0xBDE0: 0x8CDE, + 0xBDE1: 0x8CE6, + 0xBDE2: 0x8CE4, + 0xBDE3: 0x8CEC, + 0xBDE4: 0x8CED, + 0xBDE5: 0x8CE2, + 0xBDE6: 0x8CE3, + 0xBDE7: 0x8CDC, + 0xBDE8: 0x8CEA, + 0xBDE9: 0x8CE1, + 0xBDEA: 0x8D6D, + 0xBDEB: 0x8D9F, + 0xBDEC: 0x8DA3, + 0xBDED: 0x8E2B, + 0xBDEE: 0x8E10, + 0xBDEF: 0x8E1D, + 0xBDF0: 0x8E22, + 0xBDF1: 0x8E0F, + 0xBDF2: 0x8E29, + 0xBDF3: 0x8E1F, + 0xBDF4: 0x8E21, + 0xBDF5: 0x8E1E, + 0xBDF6: 0x8EBA, + 0xBDF7: 0x8F1D, + 0xBDF8: 0x8F1B, + 0xBDF9: 0x8F1F, + 0xBDFA: 0x8F29, + 0xBDFB: 0x8F26, + 0xBDFC: 0x8F2A, + 0xBDFD: 0x8F1C, + 0xBDFE: 0x8F1E, + 0xBE40: 0x8F25, + 0xBE41: 0x9069, + 0xBE42: 0x906E, + 0xBE43: 0x9068, + 0xBE44: 0x906D, + 0xBE45: 0x9077, + 0xBE46: 0x9130, + 0xBE47: 0x912D, + 0xBE48: 0x9127, + 0xBE49: 0x9131, + 0xBE4A: 0x9187, + 0xBE4B: 0x9189, + 0xBE4C: 0x918B, + 0xBE4D: 0x9183, + 0xBE4E: 0x92C5, + 0xBE4F: 0x92BB, + 0xBE50: 0x92B7, + 0xBE51: 0x92EA, + 0xBE52: 0x92AC, + 0xBE53: 0x92E4, + 0xBE54: 0x92C1, + 0xBE55: 0x92B3, + 0xBE56: 0x92BC, + 0xBE57: 0x92D2, + 0xBE58: 0x92C7, + 0xBE59: 0x92F0, + 0xBE5A: 0x92B2, + 0xBE5B: 0x95AD, + 0xBE5C: 0x95B1, + 0xBE5D: 0x9704, + 0xBE5E: 0x9706, + 0xBE5F: 0x9707, + 0xBE60: 0x9709, + 0xBE61: 0x9760, + 0xBE62: 0x978D, + 0xBE63: 0x978B, + 0xBE64: 0x978F, + 0xBE65: 0x9821, + 0xBE66: 0x982B, + 0xBE67: 0x981C, + 0xBE68: 0x98B3, + 0xBE69: 0x990A, + 0xBE6A: 0x9913, + 0xBE6B: 0x9912, + 0xBE6C: 0x9918, + 0xBE6D: 0x99DD, + 0xBE6E: 0x99D0, + 0xBE6F: 0x99DF, + 0xBE70: 0x99DB, + 0xBE71: 0x99D1, + 0xBE72: 0x99D5, + 0xBE73: 0x99D2, + 0xBE74: 0x99D9, + 0xBE75: 0x9AB7, + 0xBE76: 0x9AEE, + 0xBE77: 0x9AEF, + 0xBE78: 0x9B27, + 0xBE79: 0x9B45, + 0xBE7A: 0x9B44, + 0xBE7B: 0x9B77, + 0xBE7C: 0x9B6F, + 0xBE7D: 0x9D06, + 0xBE7E: 0x9D09, + 0xBEA1: 0x9D03, + 0xBEA2: 0x9EA9, + 0xBEA3: 0x9EBE, + 0xBEA4: 0x9ECE, + 0xBEA5: 0x58A8, + 0xBEA6: 0x9F52, + 0xBEA7: 0x5112, + 0xBEA8: 0x5118, + 0xBEA9: 0x5114, + 0xBEAA: 0x5110, + 0xBEAB: 0x5115, + 0xBEAC: 0x5180, + 0xBEAD: 0x51AA, + 0xBEAE: 0x51DD, + 0xBEAF: 0x5291, + 0xBEB0: 0x5293, + 0xBEB1: 0x52F3, + 0xBEB2: 0x5659, + 0xBEB3: 0x566B, + 0xBEB4: 0x5679, + 0xBEB5: 0x5669, + 0xBEB6: 0x5664, + 0xBEB7: 0x5678, + 0xBEB8: 0x566A, + 0xBEB9: 0x5668, + 0xBEBA: 0x5665, + 0xBEBB: 0x5671, + 0xBEBC: 0x566F, + 0xBEBD: 0x566C, + 0xBEBE: 0x5662, + 0xBEBF: 0x5676, + 0xBEC0: 0x58C1, + 0xBEC1: 0x58BE, + 0xBEC2: 0x58C7, + 0xBEC3: 0x58C5, + 0xBEC4: 0x596E, + 0xBEC5: 0x5B1D, + 0xBEC6: 0x5B34, + 0xBEC7: 0x5B78, + 0xBEC8: 0x5BF0, + 0xBEC9: 0x5C0E, + 0xBECA: 0x5F4A, + 0xBECB: 0x61B2, + 0xBECC: 0x6191, + 0xBECD: 0x61A9, + 0xBECE: 0x618A, + 0xBECF: 0x61CD, + 0xBED0: 0x61B6, + 0xBED1: 0x61BE, + 0xBED2: 0x61CA, + 0xBED3: 0x61C8, + 0xBED4: 0x6230, + 0xBED5: 0x64C5, + 0xBED6: 0x64C1, + 0xBED7: 0x64CB, + 0xBED8: 0x64BB, + 0xBED9: 0x64BC, + 0xBEDA: 0x64DA, + 0xBEDB: 0x64C4, + 0xBEDC: 0x64C7, + 0xBEDD: 0x64C2, + 0xBEDE: 0x64CD, + 0xBEDF: 0x64BF, + 0xBEE0: 0x64D2, + 0xBEE1: 0x64D4, + 0xBEE2: 0x64BE, + 0xBEE3: 0x6574, + 0xBEE4: 0x66C6, + 0xBEE5: 0x66C9, + 0xBEE6: 0x66B9, + 0xBEE7: 0x66C4, + 0xBEE8: 0x66C7, + 0xBEE9: 0x66B8, + 0xBEEA: 0x6A3D, + 0xBEEB: 0x6A38, + 0xBEEC: 0x6A3A, + 0xBEED: 0x6A59, + 0xBEEE: 0x6A6B, + 0xBEEF: 0x6A58, + 0xBEF0: 0x6A39, + 0xBEF1: 0x6A44, + 0xBEF2: 0x6A62, + 0xBEF3: 0x6A61, + 0xBEF4: 0x6A4B, + 0xBEF5: 0x6A47, + 0xBEF6: 0x6A35, + 0xBEF7: 0x6A5F, + 0xBEF8: 0x6A48, + 0xBEF9: 0x6B59, + 0xBEFA: 0x6B77, + 0xBEFB: 0x6C05, + 0xBEFC: 0x6FC2, + 0xBEFD: 0x6FB1, + 0xBEFE: 0x6FA1, + 0xBF40: 0x6FC3, + 0xBF41: 0x6FA4, + 0xBF42: 0x6FC1, + 0xBF43: 0x6FA7, + 0xBF44: 0x6FB3, + 0xBF45: 0x6FC0, + 0xBF46: 0x6FB9, + 0xBF47: 0x6FB6, + 0xBF48: 0x6FA6, + 0xBF49: 0x6FA0, + 0xBF4A: 0x6FB4, + 0xBF4B: 0x71BE, + 0xBF4C: 0x71C9, + 0xBF4D: 0x71D0, + 0xBF4E: 0x71D2, + 0xBF4F: 0x71C8, + 0xBF50: 0x71D5, + 0xBF51: 0x71B9, + 0xBF52: 0x71CE, + 0xBF53: 0x71D9, + 0xBF54: 0x71DC, + 0xBF55: 0x71C3, + 0xBF56: 0x71C4, + 0xBF57: 0x7368, + 0xBF58: 0x749C, + 0xBF59: 0x74A3, + 0xBF5A: 0x7498, + 0xBF5B: 0x749F, + 0xBF5C: 0x749E, + 0xBF5D: 0x74E2, + 0xBF5E: 0x750C, + 0xBF5F: 0x750D, + 0xBF60: 0x7634, + 0xBF61: 0x7638, + 0xBF62: 0x763A, + 0xBF63: 0x76E7, + 0xBF64: 0x76E5, + 0xBF65: 0x77A0, + 0xBF66: 0x779E, + 0xBF67: 0x779F, + 0xBF68: 0x77A5, + 0xBF69: 0x78E8, + 0xBF6A: 0x78DA, + 0xBF6B: 0x78EC, + 0xBF6C: 0x78E7, + 0xBF6D: 0x79A6, + 0xBF6E: 0x7A4D, + 0xBF6F: 0x7A4E, + 0xBF70: 0x7A46, + 0xBF71: 0x7A4C, + 0xBF72: 0x7A4B, + 0xBF73: 0x7ABA, + 0xBF74: 0x7BD9, + 0xBF75: 0x7C11, + 0xBF76: 0x7BC9, + 0xBF77: 0x7BE4, + 0xBF78: 0x7BDB, + 0xBF79: 0x7BE1, + 0xBF7A: 0x7BE9, + 0xBF7B: 0x7BE6, + 0xBF7C: 0x7CD5, + 0xBF7D: 0x7CD6, + 0xBF7E: 0x7E0A, + 0xBFA1: 0x7E11, + 0xBFA2: 0x7E08, + 0xBFA3: 0x7E1B, + 0xBFA4: 0x7E23, + 0xBFA5: 0x7E1E, + 0xBFA6: 0x7E1D, + 0xBFA7: 0x7E09, + 0xBFA8: 0x7E10, + 0xBFA9: 0x7F79, + 0xBFAA: 0x7FB2, + 0xBFAB: 0x7FF0, + 0xBFAC: 0x7FF1, + 0xBFAD: 0x7FEE, + 0xBFAE: 0x8028, + 0xBFAF: 0x81B3, + 0xBFB0: 0x81A9, + 0xBFB1: 0x81A8, + 0xBFB2: 0x81FB, + 0xBFB3: 0x8208, + 0xBFB4: 0x8258, + 0xBFB5: 0x8259, + 0xBFB6: 0x854A, + 0xBFB7: 0x8559, + 0xBFB8: 0x8548, + 0xBFB9: 0x8568, + 0xBFBA: 0x8569, + 0xBFBB: 0x8543, + 0xBFBC: 0x8549, + 0xBFBD: 0x856D, + 0xBFBE: 0x856A, + 0xBFBF: 0x855E, + 0xBFC0: 0x8783, + 0xBFC1: 0x879F, + 0xBFC2: 0x879E, + 0xBFC3: 0x87A2, + 0xBFC4: 0x878D, + 0xBFC5: 0x8861, + 0xBFC6: 0x892A, + 0xBFC7: 0x8932, + 0xBFC8: 0x8925, + 0xBFC9: 0x892B, + 0xBFCA: 0x8921, + 0xBFCB: 0x89AA, + 0xBFCC: 0x89A6, + 0xBFCD: 0x8AE6, + 0xBFCE: 0x8AFA, + 0xBFCF: 0x8AEB, + 0xBFD0: 0x8AF1, + 0xBFD1: 0x8B00, + 0xBFD2: 0x8ADC, + 0xBFD3: 0x8AE7, + 0xBFD4: 0x8AEE, + 0xBFD5: 0x8AFE, + 0xBFD6: 0x8B01, + 0xBFD7: 0x8B02, + 0xBFD8: 0x8AF7, + 0xBFD9: 0x8AED, + 0xBFDA: 0x8AF3, + 0xBFDB: 0x8AF6, + 0xBFDC: 0x8AFC, + 0xBFDD: 0x8C6B, + 0xBFDE: 0x8C6D, + 0xBFDF: 0x8C93, + 0xBFE0: 0x8CF4, + 0xBFE1: 0x8E44, + 0xBFE2: 0x8E31, + 0xBFE3: 0x8E34, + 0xBFE4: 0x8E42, + 0xBFE5: 0x8E39, + 0xBFE6: 0x8E35, + 0xBFE7: 0x8F3B, + 0xBFE8: 0x8F2F, + 0xBFE9: 0x8F38, + 0xBFEA: 0x8F33, + 0xBFEB: 0x8FA8, + 0xBFEC: 0x8FA6, + 0xBFED: 0x9075, + 0xBFEE: 0x9074, + 0xBFEF: 0x9078, + 0xBFF0: 0x9072, + 0xBFF1: 0x907C, + 0xBFF2: 0x907A, + 0xBFF3: 0x9134, + 0xBFF4: 0x9192, + 0xBFF5: 0x9320, + 0xBFF6: 0x9336, + 0xBFF7: 0x92F8, + 0xBFF8: 0x9333, + 0xBFF9: 0x932F, + 0xBFFA: 0x9322, + 0xBFFB: 0x92FC, + 0xBFFC: 0x932B, + 0xBFFD: 0x9304, + 0xBFFE: 0x931A, + 0xC040: 0x9310, + 0xC041: 0x9326, + 0xC042: 0x9321, + 0xC043: 0x9315, + 0xC044: 0x932E, + 0xC045: 0x9319, + 0xC046: 0x95BB, + 0xC047: 0x96A7, + 0xC048: 0x96A8, + 0xC049: 0x96AA, + 0xC04A: 0x96D5, + 0xC04B: 0x970E, + 0xC04C: 0x9711, + 0xC04D: 0x9716, + 0xC04E: 0x970D, + 0xC04F: 0x9713, + 0xC050: 0x970F, + 0xC051: 0x975B, + 0xC052: 0x975C, + 0xC053: 0x9766, + 0xC054: 0x9798, + 0xC055: 0x9830, + 0xC056: 0x9838, + 0xC057: 0x983B, + 0xC058: 0x9837, + 0xC059: 0x982D, + 0xC05A: 0x9839, + 0xC05B: 0x9824, + 0xC05C: 0x9910, + 0xC05D: 0x9928, + 0xC05E: 0x991E, + 0xC05F: 0x991B, + 0xC060: 0x9921, + 0xC061: 0x991A, + 0xC062: 0x99ED, + 0xC063: 0x99E2, + 0xC064: 0x99F1, + 0xC065: 0x9AB8, + 0xC066: 0x9ABC, + 0xC067: 0x9AFB, + 0xC068: 0x9AED, + 0xC069: 0x9B28, + 0xC06A: 0x9B91, + 0xC06B: 0x9D15, + 0xC06C: 0x9D23, + 0xC06D: 0x9D26, + 0xC06E: 0x9D28, + 0xC06F: 0x9D12, + 0xC070: 0x9D1B, + 0xC071: 0x9ED8, + 0xC072: 0x9ED4, + 0xC073: 0x9F8D, + 0xC074: 0x9F9C, + 0xC075: 0x512A, + 0xC076: 0x511F, + 0xC077: 0x5121, + 0xC078: 0x5132, + 0xC079: 0x52F5, + 0xC07A: 0x568E, + 0xC07B: 0x5680, + 0xC07C: 0x5690, + 0xC07D: 0x5685, + 0xC07E: 0x5687, + 0xC0A1: 0x568F, + 0xC0A2: 0x58D5, + 0xC0A3: 0x58D3, + 0xC0A4: 0x58D1, + 0xC0A5: 0x58CE, + 0xC0A6: 0x5B30, + 0xC0A7: 0x5B2A, + 0xC0A8: 0x5B24, + 0xC0A9: 0x5B7A, + 0xC0AA: 0x5C37, + 0xC0AB: 0x5C68, + 0xC0AC: 0x5DBC, + 0xC0AD: 0x5DBA, + 0xC0AE: 0x5DBD, + 0xC0AF: 0x5DB8, + 0xC0B0: 0x5E6B, + 0xC0B1: 0x5F4C, + 0xC0B2: 0x5FBD, + 0xC0B3: 0x61C9, + 0xC0B4: 0x61C2, + 0xC0B5: 0x61C7, + 0xC0B6: 0x61E6, + 0xC0B7: 0x61CB, + 0xC0B8: 0x6232, + 0xC0B9: 0x6234, + 0xC0BA: 0x64CE, + 0xC0BB: 0x64CA, + 0xC0BC: 0x64D8, + 0xC0BD: 0x64E0, + 0xC0BE: 0x64F0, + 0xC0BF: 0x64E6, + 0xC0C0: 0x64EC, + 0xC0C1: 0x64F1, + 0xC0C2: 0x64E2, + 0xC0C3: 0x64ED, + 0xC0C4: 0x6582, + 0xC0C5: 0x6583, + 0xC0C6: 0x66D9, + 0xC0C7: 0x66D6, + 0xC0C8: 0x6A80, + 0xC0C9: 0x6A94, + 0xC0CA: 0x6A84, + 0xC0CB: 0x6AA2, + 0xC0CC: 0x6A9C, + 0xC0CD: 0x6ADB, + 0xC0CE: 0x6AA3, + 0xC0CF: 0x6A7E, + 0xC0D0: 0x6A97, + 0xC0D1: 0x6A90, + 0xC0D2: 0x6AA0, + 0xC0D3: 0x6B5C, + 0xC0D4: 0x6BAE, + 0xC0D5: 0x6BDA, + 0xC0D6: 0x6C08, + 0xC0D7: 0x6FD8, + 0xC0D8: 0x6FF1, + 0xC0D9: 0x6FDF, + 0xC0DA: 0x6FE0, + 0xC0DB: 0x6FDB, + 0xC0DC: 0x6FE4, + 0xC0DD: 0x6FEB, + 0xC0DE: 0x6FEF, + 0xC0DF: 0x6F80, + 0xC0E0: 0x6FEC, + 0xC0E1: 0x6FE1, + 0xC0E2: 0x6FE9, + 0xC0E3: 0x6FD5, + 0xC0E4: 0x6FEE, + 0xC0E5: 0x6FF0, + 0xC0E6: 0x71E7, + 0xC0E7: 0x71DF, + 0xC0E8: 0x71EE, + 0xC0E9: 0x71E6, + 0xC0EA: 0x71E5, + 0xC0EB: 0x71ED, + 0xC0EC: 0x71EC, + 0xC0ED: 0x71F4, + 0xC0EE: 0x71E0, + 0xC0EF: 0x7235, + 0xC0F0: 0x7246, + 0xC0F1: 0x7370, + 0xC0F2: 0x7372, + 0xC0F3: 0x74A9, + 0xC0F4: 0x74B0, + 0xC0F5: 0x74A6, + 0xC0F6: 0x74A8, + 0xC0F7: 0x7646, + 0xC0F8: 0x7642, + 0xC0F9: 0x764C, + 0xC0FA: 0x76EA, + 0xC0FB: 0x77B3, + 0xC0FC: 0x77AA, + 0xC0FD: 0x77B0, + 0xC0FE: 0x77AC, + 0xC140: 0x77A7, + 0xC141: 0x77AD, + 0xC142: 0x77EF, + 0xC143: 0x78F7, + 0xC144: 0x78FA, + 0xC145: 0x78F4, + 0xC146: 0x78EF, + 0xC147: 0x7901, + 0xC148: 0x79A7, + 0xC149: 0x79AA, + 0xC14A: 0x7A57, + 0xC14B: 0x7ABF, + 0xC14C: 0x7C07, + 0xC14D: 0x7C0D, + 0xC14E: 0x7BFE, + 0xC14F: 0x7BF7, + 0xC150: 0x7C0C, + 0xC151: 0x7BE0, + 0xC152: 0x7CE0, + 0xC153: 0x7CDC, + 0xC154: 0x7CDE, + 0xC155: 0x7CE2, + 0xC156: 0x7CDF, + 0xC157: 0x7CD9, + 0xC158: 0x7CDD, + 0xC159: 0x7E2E, + 0xC15A: 0x7E3E, + 0xC15B: 0x7E46, + 0xC15C: 0x7E37, + 0xC15D: 0x7E32, + 0xC15E: 0x7E43, + 0xC15F: 0x7E2B, + 0xC160: 0x7E3D, + 0xC161: 0x7E31, + 0xC162: 0x7E45, + 0xC163: 0x7E41, + 0xC164: 0x7E34, + 0xC165: 0x7E39, + 0xC166: 0x7E48, + 0xC167: 0x7E35, + 0xC168: 0x7E3F, + 0xC169: 0x7E2F, + 0xC16A: 0x7F44, + 0xC16B: 0x7FF3, + 0xC16C: 0x7FFC, + 0xC16D: 0x8071, + 0xC16E: 0x8072, + 0xC16F: 0x8070, + 0xC170: 0x806F, + 0xC171: 0x8073, + 0xC172: 0x81C6, + 0xC173: 0x81C3, + 0xC174: 0x81BA, + 0xC175: 0x81C2, + 0xC176: 0x81C0, + 0xC177: 0x81BF, + 0xC178: 0x81BD, + 0xC179: 0x81C9, + 0xC17A: 0x81BE, + 0xC17B: 0x81E8, + 0xC17C: 0x8209, + 0xC17D: 0x8271, + 0xC17E: 0x85AA, + 0xC1A1: 0x8584, + 0xC1A2: 0x857E, + 0xC1A3: 0x859C, + 0xC1A4: 0x8591, + 0xC1A5: 0x8594, + 0xC1A6: 0x85AF, + 0xC1A7: 0x859B, + 0xC1A8: 0x8587, + 0xC1A9: 0x85A8, + 0xC1AA: 0x858A, + 0xC1AB: 0x8667, + 0xC1AC: 0x87C0, + 0xC1AD: 0x87D1, + 0xC1AE: 0x87B3, + 0xC1AF: 0x87D2, + 0xC1B0: 0x87C6, + 0xC1B1: 0x87AB, + 0xC1B2: 0x87BB, + 0xC1B3: 0x87BA, + 0xC1B4: 0x87C8, + 0xC1B5: 0x87CB, + 0xC1B6: 0x893B, + 0xC1B7: 0x8936, + 0xC1B8: 0x8944, + 0xC1B9: 0x8938, + 0xC1BA: 0x893D, + 0xC1BB: 0x89AC, + 0xC1BC: 0x8B0E, + 0xC1BD: 0x8B17, + 0xC1BE: 0x8B19, + 0xC1BF: 0x8B1B, + 0xC1C0: 0x8B0A, + 0xC1C1: 0x8B20, + 0xC1C2: 0x8B1D, + 0xC1C3: 0x8B04, + 0xC1C4: 0x8B10, + 0xC1C5: 0x8C41, + 0xC1C6: 0x8C3F, + 0xC1C7: 0x8C73, + 0xC1C8: 0x8CFA, + 0xC1C9: 0x8CFD, + 0xC1CA: 0x8CFC, + 0xC1CB: 0x8CF8, + 0xC1CC: 0x8CFB, + 0xC1CD: 0x8DA8, + 0xC1CE: 0x8E49, + 0xC1CF: 0x8E4B, + 0xC1D0: 0x8E48, + 0xC1D1: 0x8E4A, + 0xC1D2: 0x8F44, + 0xC1D3: 0x8F3E, + 0xC1D4: 0x8F42, + 0xC1D5: 0x8F45, + 0xC1D6: 0x8F3F, + 0xC1D7: 0x907F, + 0xC1D8: 0x907D, + 0xC1D9: 0x9084, + 0xC1DA: 0x9081, + 0xC1DB: 0x9082, + 0xC1DC: 0x9080, + 0xC1DD: 0x9139, + 0xC1DE: 0x91A3, + 0xC1DF: 0x919E, + 0xC1E0: 0x919C, + 0xC1E1: 0x934D, + 0xC1E2: 0x9382, + 0xC1E3: 0x9328, + 0xC1E4: 0x9375, + 0xC1E5: 0x934A, + 0xC1E6: 0x9365, + 0xC1E7: 0x934B, + 0xC1E8: 0x9318, + 0xC1E9: 0x937E, + 0xC1EA: 0x936C, + 0xC1EB: 0x935B, + 0xC1EC: 0x9370, + 0xC1ED: 0x935A, + 0xC1EE: 0x9354, + 0xC1EF: 0x95CA, + 0xC1F0: 0x95CB, + 0xC1F1: 0x95CC, + 0xC1F2: 0x95C8, + 0xC1F3: 0x95C6, + 0xC1F4: 0x96B1, + 0xC1F5: 0x96B8, + 0xC1F6: 0x96D6, + 0xC1F7: 0x971C, + 0xC1F8: 0x971E, + 0xC1F9: 0x97A0, + 0xC1FA: 0x97D3, + 0xC1FB: 0x9846, + 0xC1FC: 0x98B6, + 0xC1FD: 0x9935, + 0xC1FE: 0x9A01, + 0xC240: 0x99FF, + 0xC241: 0x9BAE, + 0xC242: 0x9BAB, + 0xC243: 0x9BAA, + 0xC244: 0x9BAD, + 0xC245: 0x9D3B, + 0xC246: 0x9D3F, + 0xC247: 0x9E8B, + 0xC248: 0x9ECF, + 0xC249: 0x9EDE, + 0xC24A: 0x9EDC, + 0xC24B: 0x9EDD, + 0xC24C: 0x9EDB, + 0xC24D: 0x9F3E, + 0xC24E: 0x9F4B, + 0xC24F: 0x53E2, + 0xC250: 0x5695, + 0xC251: 0x56AE, + 0xC252: 0x58D9, + 0xC253: 0x58D8, + 0xC254: 0x5B38, + 0xC255: 0x5F5D, + 0xC256: 0x61E3, + 0xC257: 0x6233, + 0xC258: 0x64F4, + 0xC259: 0x64F2, + 0xC25A: 0x64FE, + 0xC25B: 0x6506, + 0xC25C: 0x64FA, + 0xC25D: 0x64FB, + 0xC25E: 0x64F7, + 0xC25F: 0x65B7, + 0xC260: 0x66DC, + 0xC261: 0x6726, + 0xC262: 0x6AB3, + 0xC263: 0x6AAC, + 0xC264: 0x6AC3, + 0xC265: 0x6ABB, + 0xC266: 0x6AB8, + 0xC267: 0x6AC2, + 0xC268: 0x6AAE, + 0xC269: 0x6AAF, + 0xC26A: 0x6B5F, + 0xC26B: 0x6B78, + 0xC26C: 0x6BAF, + 0xC26D: 0x7009, + 0xC26E: 0x700B, + 0xC26F: 0x6FFE, + 0xC270: 0x7006, + 0xC271: 0x6FFA, + 0xC272: 0x7011, + 0xC273: 0x700F, + 0xC274: 0x71FB, + 0xC275: 0x71FC, + 0xC276: 0x71FE, + 0xC277: 0x71F8, + 0xC278: 0x7377, + 0xC279: 0x7375, + 0xC27A: 0x74A7, + 0xC27B: 0x74BF, + 0xC27C: 0x7515, + 0xC27D: 0x7656, + 0xC27E: 0x7658, + 0xC2A1: 0x7652, + 0xC2A2: 0x77BD, + 0xC2A3: 0x77BF, + 0xC2A4: 0x77BB, + 0xC2A5: 0x77BC, + 0xC2A6: 0x790E, + 0xC2A7: 0x79AE, + 0xC2A8: 0x7A61, + 0xC2A9: 0x7A62, + 0xC2AA: 0x7A60, + 0xC2AB: 0x7AC4, + 0xC2AC: 0x7AC5, + 0xC2AD: 0x7C2B, + 0xC2AE: 0x7C27, + 0xC2AF: 0x7C2A, + 0xC2B0: 0x7C1E, + 0xC2B1: 0x7C23, + 0xC2B2: 0x7C21, + 0xC2B3: 0x7CE7, + 0xC2B4: 0x7E54, + 0xC2B5: 0x7E55, + 0xC2B6: 0x7E5E, + 0xC2B7: 0x7E5A, + 0xC2B8: 0x7E61, + 0xC2B9: 0x7E52, + 0xC2BA: 0x7E59, + 0xC2BB: 0x7F48, + 0xC2BC: 0x7FF9, + 0xC2BD: 0x7FFB, + 0xC2BE: 0x8077, + 0xC2BF: 0x8076, + 0xC2C0: 0x81CD, + 0xC2C1: 0x81CF, + 0xC2C2: 0x820A, + 0xC2C3: 0x85CF, + 0xC2C4: 0x85A9, + 0xC2C5: 0x85CD, + 0xC2C6: 0x85D0, + 0xC2C7: 0x85C9, + 0xC2C8: 0x85B0, + 0xC2C9: 0x85BA, + 0xC2CA: 0x85B9, + 0xC2CB: 0x85A6, + 0xC2CC: 0x87EF, + 0xC2CD: 0x87EC, + 0xC2CE: 0x87F2, + 0xC2CF: 0x87E0, + 0xC2D0: 0x8986, + 0xC2D1: 0x89B2, + 0xC2D2: 0x89F4, + 0xC2D3: 0x8B28, + 0xC2D4: 0x8B39, + 0xC2D5: 0x8B2C, + 0xC2D6: 0x8B2B, + 0xC2D7: 0x8C50, + 0xC2D8: 0x8D05, + 0xC2D9: 0x8E59, + 0xC2DA: 0x8E63, + 0xC2DB: 0x8E66, + 0xC2DC: 0x8E64, + 0xC2DD: 0x8E5F, + 0xC2DE: 0x8E55, + 0xC2DF: 0x8EC0, + 0xC2E0: 0x8F49, + 0xC2E1: 0x8F4D, + 0xC2E2: 0x9087, + 0xC2E3: 0x9083, + 0xC2E4: 0x9088, + 0xC2E5: 0x91AB, + 0xC2E6: 0x91AC, + 0xC2E7: 0x91D0, + 0xC2E8: 0x9394, + 0xC2E9: 0x938A, + 0xC2EA: 0x9396, + 0xC2EB: 0x93A2, + 0xC2EC: 0x93B3, + 0xC2ED: 0x93AE, + 0xC2EE: 0x93AC, + 0xC2EF: 0x93B0, + 0xC2F0: 0x9398, + 0xC2F1: 0x939A, + 0xC2F2: 0x9397, + 0xC2F3: 0x95D4, + 0xC2F4: 0x95D6, + 0xC2F5: 0x95D0, + 0xC2F6: 0x95D5, + 0xC2F7: 0x96E2, + 0xC2F8: 0x96DC, + 0xC2F9: 0x96D9, + 0xC2FA: 0x96DB, + 0xC2FB: 0x96DE, + 0xC2FC: 0x9724, + 0xC2FD: 0x97A3, + 0xC2FE: 0x97A6, + 0xC340: 0x97AD, + 0xC341: 0x97F9, + 0xC342: 0x984D, + 0xC343: 0x984F, + 0xC344: 0x984C, + 0xC345: 0x984E, + 0xC346: 0x9853, + 0xC347: 0x98BA, + 0xC348: 0x993E, + 0xC349: 0x993F, + 0xC34A: 0x993D, + 0xC34B: 0x992E, + 0xC34C: 0x99A5, + 0xC34D: 0x9A0E, + 0xC34E: 0x9AC1, + 0xC34F: 0x9B03, + 0xC350: 0x9B06, + 0xC351: 0x9B4F, + 0xC352: 0x9B4E, + 0xC353: 0x9B4D, + 0xC354: 0x9BCA, + 0xC355: 0x9BC9, + 0xC356: 0x9BFD, + 0xC357: 0x9BC8, + 0xC358: 0x9BC0, + 0xC359: 0x9D51, + 0xC35A: 0x9D5D, + 0xC35B: 0x9D60, + 0xC35C: 0x9EE0, + 0xC35D: 0x9F15, + 0xC35E: 0x9F2C, + 0xC35F: 0x5133, + 0xC360: 0x56A5, + 0xC361: 0x58DE, + 0xC362: 0x58DF, + 0xC363: 0x58E2, + 0xC364: 0x5BF5, + 0xC365: 0x9F90, + 0xC366: 0x5EEC, + 0xC367: 0x61F2, + 0xC368: 0x61F7, + 0xC369: 0x61F6, + 0xC36A: 0x61F5, + 0xC36B: 0x6500, + 0xC36C: 0x650F, + 0xC36D: 0x66E0, + 0xC36E: 0x66DD, + 0xC36F: 0x6AE5, + 0xC370: 0x6ADD, + 0xC371: 0x6ADA, + 0xC372: 0x6AD3, + 0xC373: 0x701B, + 0xC374: 0x701F, + 0xC375: 0x7028, + 0xC376: 0x701A, + 0xC377: 0x701D, + 0xC378: 0x7015, + 0xC379: 0x7018, + 0xC37A: 0x7206, + 0xC37B: 0x720D, + 0xC37C: 0x7258, + 0xC37D: 0x72A2, + 0xC37E: 0x7378, + 0xC3A1: 0x737A, + 0xC3A2: 0x74BD, + 0xC3A3: 0x74CA, + 0xC3A4: 0x74E3, + 0xC3A5: 0x7587, + 0xC3A6: 0x7586, + 0xC3A7: 0x765F, + 0xC3A8: 0x7661, + 0xC3A9: 0x77C7, + 0xC3AA: 0x7919, + 0xC3AB: 0x79B1, + 0xC3AC: 0x7A6B, + 0xC3AD: 0x7A69, + 0xC3AE: 0x7C3E, + 0xC3AF: 0x7C3F, + 0xC3B0: 0x7C38, + 0xC3B1: 0x7C3D, + 0xC3B2: 0x7C37, + 0xC3B3: 0x7C40, + 0xC3B4: 0x7E6B, + 0xC3B5: 0x7E6D, + 0xC3B6: 0x7E79, + 0xC3B7: 0x7E69, + 0xC3B8: 0x7E6A, + 0xC3B9: 0x7F85, + 0xC3BA: 0x7E73, + 0xC3BB: 0x7FB6, + 0xC3BC: 0x7FB9, + 0xC3BD: 0x7FB8, + 0xC3BE: 0x81D8, + 0xC3BF: 0x85E9, + 0xC3C0: 0x85DD, + 0xC3C1: 0x85EA, + 0xC3C2: 0x85D5, + 0xC3C3: 0x85E4, + 0xC3C4: 0x85E5, + 0xC3C5: 0x85F7, + 0xC3C6: 0x87FB, + 0xC3C7: 0x8805, + 0xC3C8: 0x880D, + 0xC3C9: 0x87F9, + 0xC3CA: 0x87FE, + 0xC3CB: 0x8960, + 0xC3CC: 0x895F, + 0xC3CD: 0x8956, + 0xC3CE: 0x895E, + 0xC3CF: 0x8B41, + 0xC3D0: 0x8B5C, + 0xC3D1: 0x8B58, + 0xC3D2: 0x8B49, + 0xC3D3: 0x8B5A, + 0xC3D4: 0x8B4E, + 0xC3D5: 0x8B4F, + 0xC3D6: 0x8B46, + 0xC3D7: 0x8B59, + 0xC3D8: 0x8D08, + 0xC3D9: 0x8D0A, + 0xC3DA: 0x8E7C, + 0xC3DB: 0x8E72, + 0xC3DC: 0x8E87, + 0xC3DD: 0x8E76, + 0xC3DE: 0x8E6C, + 0xC3DF: 0x8E7A, + 0xC3E0: 0x8E74, + 0xC3E1: 0x8F54, + 0xC3E2: 0x8F4E, + 0xC3E3: 0x8FAD, + 0xC3E4: 0x908A, + 0xC3E5: 0x908B, + 0xC3E6: 0x91B1, + 0xC3E7: 0x91AE, + 0xC3E8: 0x93E1, + 0xC3E9: 0x93D1, + 0xC3EA: 0x93DF, + 0xC3EB: 0x93C3, + 0xC3EC: 0x93C8, + 0xC3ED: 0x93DC, + 0xC3EE: 0x93DD, + 0xC3EF: 0x93D6, + 0xC3F0: 0x93E2, + 0xC3F1: 0x93CD, + 0xC3F2: 0x93D8, + 0xC3F3: 0x93E4, + 0xC3F4: 0x93D7, + 0xC3F5: 0x93E8, + 0xC3F6: 0x95DC, + 0xC3F7: 0x96B4, + 0xC3F8: 0x96E3, + 0xC3F9: 0x972A, + 0xC3FA: 0x9727, + 0xC3FB: 0x9761, + 0xC3FC: 0x97DC, + 0xC3FD: 0x97FB, + 0xC3FE: 0x985E, + 0xC440: 0x9858, + 0xC441: 0x985B, + 0xC442: 0x98BC, + 0xC443: 0x9945, + 0xC444: 0x9949, + 0xC445: 0x9A16, + 0xC446: 0x9A19, + 0xC447: 0x9B0D, + 0xC448: 0x9BE8, + 0xC449: 0x9BE7, + 0xC44A: 0x9BD6, + 0xC44B: 0x9BDB, + 0xC44C: 0x9D89, + 0xC44D: 0x9D61, + 0xC44E: 0x9D72, + 0xC44F: 0x9D6A, + 0xC450: 0x9D6C, + 0xC451: 0x9E92, + 0xC452: 0x9E97, + 0xC453: 0x9E93, + 0xC454: 0x9EB4, + 0xC455: 0x52F8, + 0xC456: 0x56A8, + 0xC457: 0x56B7, + 0xC458: 0x56B6, + 0xC459: 0x56B4, + 0xC45A: 0x56BC, + 0xC45B: 0x58E4, + 0xC45C: 0x5B40, + 0xC45D: 0x5B43, + 0xC45E: 0x5B7D, + 0xC45F: 0x5BF6, + 0xC460: 0x5DC9, + 0xC461: 0x61F8, + 0xC462: 0x61FA, + 0xC463: 0x6518, + 0xC464: 0x6514, + 0xC465: 0x6519, + 0xC466: 0x66E6, + 0xC467: 0x6727, + 0xC468: 0x6AEC, + 0xC469: 0x703E, + 0xC46A: 0x7030, + 0xC46B: 0x7032, + 0xC46C: 0x7210, + 0xC46D: 0x737B, + 0xC46E: 0x74CF, + 0xC46F: 0x7662, + 0xC470: 0x7665, + 0xC471: 0x7926, + 0xC472: 0x792A, + 0xC473: 0x792C, + 0xC474: 0x792B, + 0xC475: 0x7AC7, + 0xC476: 0x7AF6, + 0xC477: 0x7C4C, + 0xC478: 0x7C43, + 0xC479: 0x7C4D, + 0xC47A: 0x7CEF, + 0xC47B: 0x7CF0, + 0xC47C: 0x8FAE, + 0xC47D: 0x7E7D, + 0xC47E: 0x7E7C, + 0xC4A1: 0x7E82, + 0xC4A2: 0x7F4C, + 0xC4A3: 0x8000, + 0xC4A4: 0x81DA, + 0xC4A5: 0x8266, + 0xC4A6: 0x85FB, + 0xC4A7: 0x85F9, + 0xC4A8: 0x8611, + 0xC4A9: 0x85FA, + 0xC4AA: 0x8606, + 0xC4AB: 0x860B, + 0xC4AC: 0x8607, + 0xC4AD: 0x860A, + 0xC4AE: 0x8814, + 0xC4AF: 0x8815, + 0xC4B0: 0x8964, + 0xC4B1: 0x89BA, + 0xC4B2: 0x89F8, + 0xC4B3: 0x8B70, + 0xC4B4: 0x8B6C, + 0xC4B5: 0x8B66, + 0xC4B6: 0x8B6F, + 0xC4B7: 0x8B5F, + 0xC4B8: 0x8B6B, + 0xC4B9: 0x8D0F, + 0xC4BA: 0x8D0D, + 0xC4BB: 0x8E89, + 0xC4BC: 0x8E81, + 0xC4BD: 0x8E85, + 0xC4BE: 0x8E82, + 0xC4BF: 0x91B4, + 0xC4C0: 0x91CB, + 0xC4C1: 0x9418, + 0xC4C2: 0x9403, + 0xC4C3: 0x93FD, + 0xC4C4: 0x95E1, + 0xC4C5: 0x9730, + 0xC4C6: 0x98C4, + 0xC4C7: 0x9952, + 0xC4C8: 0x9951, + 0xC4C9: 0x99A8, + 0xC4CA: 0x9A2B, + 0xC4CB: 0x9A30, + 0xC4CC: 0x9A37, + 0xC4CD: 0x9A35, + 0xC4CE: 0x9C13, + 0xC4CF: 0x9C0D, + 0xC4D0: 0x9E79, + 0xC4D1: 0x9EB5, + 0xC4D2: 0x9EE8, + 0xC4D3: 0x9F2F, + 0xC4D4: 0x9F5F, + 0xC4D5: 0x9F63, + 0xC4D6: 0x9F61, + 0xC4D7: 0x5137, + 0xC4D8: 0x5138, + 0xC4D9: 0x56C1, + 0xC4DA: 0x56C0, + 0xC4DB: 0x56C2, + 0xC4DC: 0x5914, + 0xC4DD: 0x5C6C, + 0xC4DE: 0x5DCD, + 0xC4DF: 0x61FC, + 0xC4E0: 0x61FE, + 0xC4E1: 0x651D, + 0xC4E2: 0x651C, + 0xC4E3: 0x6595, + 0xC4E4: 0x66E9, + 0xC4E5: 0x6AFB, + 0xC4E6: 0x6B04, + 0xC4E7: 0x6AFA, + 0xC4E8: 0x6BB2, + 0xC4E9: 0x704C, + 0xC4EA: 0x721B, + 0xC4EB: 0x72A7, + 0xC4EC: 0x74D6, + 0xC4ED: 0x74D4, + 0xC4EE: 0x7669, + 0xC4EF: 0x77D3, + 0xC4F0: 0x7C50, + 0xC4F1: 0x7E8F, + 0xC4F2: 0x7E8C, + 0xC4F3: 0x7FBC, + 0xC4F4: 0x8617, + 0xC4F5: 0x862D, + 0xC4F6: 0x861A, + 0xC4F7: 0x8823, + 0xC4F8: 0x8822, + 0xC4F9: 0x8821, + 0xC4FA: 0x881F, + 0xC4FB: 0x896A, + 0xC4FC: 0x896C, + 0xC4FD: 0x89BD, + 0xC4FE: 0x8B74, + 0xC540: 0x8B77, + 0xC541: 0x8B7D, + 0xC542: 0x8D13, + 0xC543: 0x8E8A, + 0xC544: 0x8E8D, + 0xC545: 0x8E8B, + 0xC546: 0x8F5F, + 0xC547: 0x8FAF, + 0xC548: 0x91BA, + 0xC549: 0x942E, + 0xC54A: 0x9433, + 0xC54B: 0x9435, + 0xC54C: 0x943A, + 0xC54D: 0x9438, + 0xC54E: 0x9432, + 0xC54F: 0x942B, + 0xC550: 0x95E2, + 0xC551: 0x9738, + 0xC552: 0x9739, + 0xC553: 0x9732, + 0xC554: 0x97FF, + 0xC555: 0x9867, + 0xC556: 0x9865, + 0xC557: 0x9957, + 0xC558: 0x9A45, + 0xC559: 0x9A43, + 0xC55A: 0x9A40, + 0xC55B: 0x9A3E, + 0xC55C: 0x9ACF, + 0xC55D: 0x9B54, + 0xC55E: 0x9B51, + 0xC55F: 0x9C2D, + 0xC560: 0x9C25, + 0xC561: 0x9DAF, + 0xC562: 0x9DB4, + 0xC563: 0x9DC2, + 0xC564: 0x9DB8, + 0xC565: 0x9E9D, + 0xC566: 0x9EEF, + 0xC567: 0x9F19, + 0xC568: 0x9F5C, + 0xC569: 0x9F66, + 0xC56A: 0x9F67, + 0xC56B: 0x513C, + 0xC56C: 0x513B, + 0xC56D: 0x56C8, + 0xC56E: 0x56CA, + 0xC56F: 0x56C9, + 0xC570: 0x5B7F, + 0xC571: 0x5DD4, + 0xC572: 0x5DD2, + 0xC573: 0x5F4E, + 0xC574: 0x61FF, + 0xC575: 0x6524, + 0xC576: 0x6B0A, + 0xC577: 0x6B61, + 0xC578: 0x7051, + 0xC579: 0x7058, + 0xC57A: 0x7380, + 0xC57B: 0x74E4, + 0xC57C: 0x758A, + 0xC57D: 0x766E, + 0xC57E: 0x766C, + 0xC5A1: 0x79B3, + 0xC5A2: 0x7C60, + 0xC5A3: 0x7C5F, + 0xC5A4: 0x807E, + 0xC5A5: 0x807D, + 0xC5A6: 0x81DF, + 0xC5A7: 0x8972, + 0xC5A8: 0x896F, + 0xC5A9: 0x89FC, + 0xC5AA: 0x8B80, + 0xC5AB: 0x8D16, + 0xC5AC: 0x8D17, + 0xC5AD: 0x8E91, + 0xC5AE: 0x8E93, + 0xC5AF: 0x8F61, + 0xC5B0: 0x9148, + 0xC5B1: 0x9444, + 0xC5B2: 0x9451, + 0xC5B3: 0x9452, + 0xC5B4: 0x973D, + 0xC5B5: 0x973E, + 0xC5B6: 0x97C3, + 0xC5B7: 0x97C1, + 0xC5B8: 0x986B, + 0xC5B9: 0x9955, + 0xC5BA: 0x9A55, + 0xC5BB: 0x9A4D, + 0xC5BC: 0x9AD2, + 0xC5BD: 0x9B1A, + 0xC5BE: 0x9C49, + 0xC5BF: 0x9C31, + 0xC5C0: 0x9C3E, + 0xC5C1: 0x9C3B, + 0xC5C2: 0x9DD3, + 0xC5C3: 0x9DD7, + 0xC5C4: 0x9F34, + 0xC5C5: 0x9F6C, + 0xC5C6: 0x9F6A, + 0xC5C7: 0x9F94, + 0xC5C8: 0x56CC, + 0xC5C9: 0x5DD6, + 0xC5CA: 0x6200, + 0xC5CB: 0x6523, + 0xC5CC: 0x652B, + 0xC5CD: 0x652A, + 0xC5CE: 0x66EC, + 0xC5CF: 0x6B10, + 0xC5D0: 0x74DA, + 0xC5D1: 0x7ACA, + 0xC5D2: 0x7C64, + 0xC5D3: 0x7C63, + 0xC5D4: 0x7C65, + 0xC5D5: 0x7E93, + 0xC5D6: 0x7E96, + 0xC5D7: 0x7E94, + 0xC5D8: 0x81E2, + 0xC5D9: 0x8638, + 0xC5DA: 0x863F, + 0xC5DB: 0x8831, + 0xC5DC: 0x8B8A, + 0xC5DD: 0x9090, + 0xC5DE: 0x908F, + 0xC5DF: 0x9463, + 0xC5E0: 0x9460, + 0xC5E1: 0x9464, + 0xC5E2: 0x9768, + 0xC5E3: 0x986F, + 0xC5E4: 0x995C, + 0xC5E5: 0x9A5A, + 0xC5E6: 0x9A5B, + 0xC5E7: 0x9A57, + 0xC5E8: 0x9AD3, + 0xC5E9: 0x9AD4, + 0xC5EA: 0x9AD1, + 0xC5EB: 0x9C54, + 0xC5EC: 0x9C57, + 0xC5ED: 0x9C56, + 0xC5EE: 0x9DE5, + 0xC5EF: 0x9E9F, + 0xC5F0: 0x9EF4, + 0xC5F1: 0x56D1, + 0xC5F2: 0x58E9, + 0xC5F3: 0x652C, + 0xC5F4: 0x705E, + 0xC5F5: 0x7671, + 0xC5F6: 0x7672, + 0xC5F7: 0x77D7, + 0xC5F8: 0x7F50, + 0xC5F9: 0x7F88, + 0xC5FA: 0x8836, + 0xC5FB: 0x8839, + 0xC5FC: 0x8862, + 0xC5FD: 0x8B93, + 0xC5FE: 0x8B92, + 0xC640: 0x8B96, + 0xC641: 0x8277, + 0xC642: 0x8D1B, + 0xC643: 0x91C0, + 0xC644: 0x946A, + 0xC645: 0x9742, + 0xC646: 0x9748, + 0xC647: 0x9744, + 0xC648: 0x97C6, + 0xC649: 0x9870, + 0xC64A: 0x9A5F, + 0xC64B: 0x9B22, + 0xC64C: 0x9B58, + 0xC64D: 0x9C5F, + 0xC64E: 0x9DF9, + 0xC64F: 0x9DFA, + 0xC650: 0x9E7C, + 0xC651: 0x9E7D, + 0xC652: 0x9F07, + 0xC653: 0x9F77, + 0xC654: 0x9F72, + 0xC655: 0x5EF3, + 0xC656: 0x6B16, + 0xC657: 0x7063, + 0xC658: 0x7C6C, + 0xC659: 0x7C6E, + 0xC65A: 0x883B, + 0xC65B: 0x89C0, + 0xC65C: 0x8EA1, + 0xC65D: 0x91C1, + 0xC65E: 0x9472, + 0xC65F: 0x9470, + 0xC660: 0x9871, + 0xC661: 0x995E, + 0xC662: 0x9AD6, + 0xC663: 0x9B23, + 0xC664: 0x9ECC, + 0xC665: 0x7064, + 0xC666: 0x77DA, + 0xC667: 0x8B9A, + 0xC668: 0x9477, + 0xC669: 0x97C9, + 0xC66A: 0x9A62, + 0xC66B: 0x9A65, + 0xC66C: 0x7E9C, + 0xC66D: 0x8B9C, + 0xC66E: 0x8EAA, + 0xC66F: 0x91C5, + 0xC670: 0x947D, + 0xC671: 0x947E, + 0xC672: 0x947C, + 0xC673: 0x9C77, + 0xC674: 0x9C78, + 0xC675: 0x9EF7, + 0xC676: 0x8C54, + 0xC677: 0x947F, + 0xC678: 0x9E1A, + 0xC679: 0x7228, + 0xC67A: 0x9A6A, + 0xC67B: 0x9B31, + 0xC67C: 0x9E1B, + 0xC67D: 0x9E1E, + 0xC67E: 0x7C72, + 0xC6A1: 0x30FE, // KATAKANA VOICED ITERATION MARK + 0xC6A2: 0x309D, // HIRAGANA ITERATION MARK + 0xC6A3: 0x309E, // HIRAGANA VOICED ITERATION MARK + 0xC6A4: 0x3005, // IDEOGRAPHIC ITERATION MARK + 0xC6A5: 0x3041, // HIRAGANA LETTER SMALL A + 0xC6A6: 0x3042, // HIRAGANA LETTER A + 0xC6A7: 0x3043, // HIRAGANA LETTER SMALL I + 0xC6A8: 0x3044, // HIRAGANA LETTER I + 0xC6A9: 0x3045, // HIRAGANA LETTER SMALL U + 0xC6AA: 0x3046, // HIRAGANA LETTER U + 0xC6AB: 0x3047, // HIRAGANA LETTER SMALL E + 0xC6AC: 0x3048, // HIRAGANA LETTER E + 0xC6AD: 0x3049, // HIRAGANA LETTER SMALL O + 0xC6AE: 0x304A, // HIRAGANA LETTER O + 0xC6AF: 0x304B, // HIRAGANA LETTER KA + 0xC6B0: 0x304C, // HIRAGANA LETTER GA + 0xC6B1: 0x304D, // HIRAGANA LETTER KI + 0xC6B2: 0x304E, // HIRAGANA LETTER GI + 0xC6B3: 0x304F, // HIRAGANA LETTER KU + 0xC6B4: 0x3050, // HIRAGANA LETTER GU + 0xC6B5: 0x3051, // HIRAGANA LETTER KE + 0xC6B6: 0x3052, // HIRAGANA LETTER GE + 0xC6B7: 0x3053, // HIRAGANA LETTER KO + 0xC6B8: 0x3054, // HIRAGANA LETTER GO + 0xC6B9: 0x3055, // HIRAGANA LETTER SA + 0xC6BA: 0x3056, // HIRAGANA LETTER ZA + 0xC6BB: 0x3057, // HIRAGANA LETTER SI + 0xC6BC: 0x3058, // HIRAGANA LETTER ZI + 0xC6BD: 0x3059, // HIRAGANA LETTER SU + 0xC6BE: 0x305A, // HIRAGANA LETTER ZU + 0xC6BF: 0x305B, // HIRAGANA LETTER SE + 0xC6C0: 0x305C, // HIRAGANA LETTER ZE + 0xC6C1: 0x305D, // HIRAGANA LETTER SO + 0xC6C2: 0x305E, // HIRAGANA LETTER ZO + 0xC6C3: 0x305F, // HIRAGANA LETTER TA + 0xC6C4: 0x3060, // HIRAGANA LETTER DA + 0xC6C5: 0x3061, // HIRAGANA LETTER TI + 0xC6C6: 0x3062, // HIRAGANA LETTER DI + 0xC6C7: 0x3063, // HIRAGANA LETTER SMALL TU + 0xC6C8: 0x3064, // HIRAGANA LETTER TU + 0xC6C9: 0x3065, // HIRAGANA LETTER DU + 0xC6CA: 0x3066, // HIRAGANA LETTER TE + 0xC6CB: 0x3067, // HIRAGANA LETTER DE + 0xC6CC: 0x3068, // HIRAGANA LETTER TO + 0xC6CD: 0x3069, // HIRAGANA LETTER DO + 0xC6CE: 0x306A, // HIRAGANA LETTER NA + 0xC6CF: 0x306B, // HIRAGANA LETTER NI + 0xC6D0: 0x306C, // HIRAGANA LETTER NU + 0xC6D1: 0x306D, // HIRAGANA LETTER NE + 0xC6D2: 0x306E, // HIRAGANA LETTER NO + 0xC6D3: 0x306F, // HIRAGANA LETTER HA + 0xC6D4: 0x3070, // HIRAGANA LETTER BA + 0xC6D5: 0x3071, // HIRAGANA LETTER PA + 0xC6D6: 0x3072, // HIRAGANA LETTER HI + 0xC6D7: 0x3073, // HIRAGANA LETTER BI + 0xC6D8: 0x3074, // HIRAGANA LETTER PI + 0xC6D9: 0x3075, // HIRAGANA LETTER HU + 0xC6DA: 0x3076, // HIRAGANA LETTER BU + 0xC6DB: 0x3077, // HIRAGANA LETTER PU + 0xC6DC: 0x3078, // HIRAGANA LETTER HE + 0xC6DD: 0x3079, // HIRAGANA LETTER BE + 0xC6DE: 0x307A, // HIRAGANA LETTER PE + 0xC6DF: 0x307B, // HIRAGANA LETTER HO + 0xC6E0: 0x307C, // HIRAGANA LETTER BO + 0xC6E1: 0x307D, // HIRAGANA LETTER PO + 0xC6E2: 0x307E, // HIRAGANA LETTER MA + 0xC6E3: 0x307F, // HIRAGANA LETTER MI + 0xC6E4: 0x3080, // HIRAGANA LETTER MU + 0xC6E5: 0x3081, // HIRAGANA LETTER ME + 0xC6E6: 0x3082, // HIRAGANA LETTER MO + 0xC6E7: 0x3083, // HIRAGANA LETTER SMALL YA + 0xC6E8: 0x3084, // HIRAGANA LETTER YA + 0xC6E9: 0x3085, // HIRAGANA LETTER SMALL YU + 0xC6EA: 0x3086, // HIRAGANA LETTER YU + 0xC6EB: 0x3087, // HIRAGANA LETTER SMALL YO + 0xC6EC: 0x3088, // HIRAGANA LETTER YO + 0xC6ED: 0x3089, // HIRAGANA LETTER RA + 0xC6EE: 0x308A, // HIRAGANA LETTER RI + 0xC6EF: 0x308B, // HIRAGANA LETTER RU + 0xC6F0: 0x308C, // HIRAGANA LETTER RE + 0xC6F1: 0x308D, // HIRAGANA LETTER RO + 0xC6F2: 0x308E, // HIRAGANA LETTER SMALL WA + 0xC6F3: 0x308F, // HIRAGANA LETTER WA + 0xC6F4: 0x3090, // HIRAGANA LETTER WI + 0xC6F5: 0x3091, // HIRAGANA LETTER WE + 0xC6F6: 0x3092, // HIRAGANA LETTER WO + 0xC6F7: 0x3093, // HIRAGANA LETTER N + 0xC6F8: 0x30A1, // KATAKANA LETTER SMALL A + 0xC6F9: 0x30A2, // KATAKANA LETTER A + 0xC6FA: 0x30A3, // KATAKANA LETTER SMALL I + 0xC6FB: 0x30A4, // KATAKANA LETTER I + 0xC6FC: 0x30A5, // KATAKANA LETTER SMALL U + 0xC6FD: 0x30A6, // KATAKANA LETTER U + 0xC6FE: 0x30A7, // KATAKANA LETTER SMALL E + 0xC740: 0x30A8, // KATAKANA LETTER E + 0xC741: 0x30A9, // KATAKANA LETTER SMALL O + 0xC742: 0x30AA, // KATAKANA LETTER O + 0xC743: 0x30AB, // KATAKANA LETTER KA + 0xC744: 0x30AC, // KATAKANA LETTER GA + 0xC745: 0x30AD, // KATAKANA LETTER KI + 0xC746: 0x30AE, // KATAKANA LETTER GI + 0xC747: 0x30AF, // KATAKANA LETTER KU + 0xC748: 0x30B0, // KATAKANA LETTER GU + 0xC749: 0x30B1, // KATAKANA LETTER KE + 0xC74A: 0x30B2, // KATAKANA LETTER GE + 0xC74B: 0x30B3, // KATAKANA LETTER KO + 0xC74C: 0x30B4, // KATAKANA LETTER GO + 0xC74D: 0x30B5, // KATAKANA LETTER SA + 0xC74E: 0x30B6, // KATAKANA LETTER ZA + 0xC74F: 0x30B7, // KATAKANA LETTER SI + 0xC750: 0x30B8, // KATAKANA LETTER ZI + 0xC751: 0x30B9, // KATAKANA LETTER SU + 0xC752: 0x30BA, // KATAKANA LETTER ZU + 0xC753: 0x30BB, // KATAKANA LETTER SE + 0xC754: 0x30BC, // KATAKANA LETTER ZE + 0xC755: 0x30BD, // KATAKANA LETTER SO + 0xC756: 0x30BE, // KATAKANA LETTER ZO + 0xC757: 0x30BF, // KATAKANA LETTER TA + 0xC758: 0x30C0, // KATAKANA LETTER DA + 0xC759: 0x30C1, // KATAKANA LETTER TI + 0xC75A: 0x30C2, // KATAKANA LETTER DI + 0xC75B: 0x30C3, // KATAKANA LETTER SMALL TU + 0xC75C: 0x30C4, // KATAKANA LETTER TU + 0xC75D: 0x30C5, // KATAKANA LETTER DU + 0xC75E: 0x30C6, // KATAKANA LETTER TE + 0xC75F: 0x30C7, // KATAKANA LETTER DE + 0xC760: 0x30C8, // KATAKANA LETTER TO + 0xC761: 0x30C9, // KATAKANA LETTER DO + 0xC762: 0x30CA, // KATAKANA LETTER NA + 0xC763: 0x30CB, // KATAKANA LETTER NI + 0xC764: 0x30CC, // KATAKANA LETTER NU + 0xC765: 0x30CD, // KATAKANA LETTER NE + 0xC766: 0x30CE, // KATAKANA LETTER NO + 0xC767: 0x30CF, // KATAKANA LETTER HA + 0xC768: 0x30D0, // KATAKANA LETTER BA + 0xC769: 0x30D1, // KATAKANA LETTER PA + 0xC76A: 0x30D2, // KATAKANA LETTER HI + 0xC76B: 0x30D3, // KATAKANA LETTER BI + 0xC76C: 0x30D4, // KATAKANA LETTER PI + 0xC76D: 0x30D5, // KATAKANA LETTER HU + 0xC76E: 0x30D6, // KATAKANA LETTER BU + 0xC76F: 0x30D7, // KATAKANA LETTER PU + 0xC770: 0x30D8, // KATAKANA LETTER HE + 0xC771: 0x30D9, // KATAKANA LETTER BE + 0xC772: 0x30DA, // KATAKANA LETTER PE + 0xC773: 0x30DB, // KATAKANA LETTER HO + 0xC774: 0x30DC, // KATAKANA LETTER BO + 0xC775: 0x30DD, // KATAKANA LETTER PO + 0xC776: 0x30DE, // KATAKANA LETTER MA + 0xC777: 0x30DF, // KATAKANA LETTER MI + 0xC778: 0x30E0, // KATAKANA LETTER MU + 0xC779: 0x30E1, // KATAKANA LETTER ME + 0xC77A: 0x30E2, // KATAKANA LETTER MO + 0xC77B: 0x30E3, // KATAKANA LETTER SMALL YA + 0xC77C: 0x30E4, // KATAKANA LETTER YA + 0xC77D: 0x30E5, // KATAKANA LETTER SMALL YU + 0xC77E: 0x30E6, // KATAKANA LETTER YU + 0xC7A1: 0x30E7, // KATAKANA LETTER SMALL YO + 0xC7A2: 0x30E8, // KATAKANA LETTER YO + 0xC7A3: 0x30E9, // KATAKANA LETTER RA + 0xC7A4: 0x30EA, // KATAKANA LETTER RI + 0xC7A5: 0x30EB, // KATAKANA LETTER RU + 0xC7A6: 0x30EC, // KATAKANA LETTER RE + 0xC7A7: 0x30ED, // KATAKANA LETTER RO + 0xC7A8: 0x30EE, // KATAKANA LETTER SMALL WA + 0xC7A9: 0x30EF, // KATAKANA LETTER WA + 0xC7AA: 0x30F0, // KATAKANA LETTER WI + 0xC7AB: 0x30F1, // KATAKANA LETTER WE + 0xC7AC: 0x30F2, // KATAKANA LETTER WO + 0xC7AD: 0x30F3, // KATAKANA LETTER N + 0xC7AE: 0x30F4, // KATAKANA LETTER VU + 0xC7AF: 0x30F5, // KATAKANA LETTER SMALL KA + 0xC7B0: 0x30F6, // KATAKANA LETTER SMALL KE + 0xC7B1: 0x0414, // CYRILLIC CAPITAL LETTER DE + 0xC7B2: 0x0415, // CYRILLIC CAPITAL LETTER IE + 0xC7B3: 0x0401, // CYRILLIC CAPITAL LETTER IO + 0xC7B4: 0x0416, // CYRILLIC CAPITAL LETTER ZHE + 0xC7B5: 0x0417, // CYRILLIC CAPITAL LETTER ZE + 0xC7B6: 0x0418, // CYRILLIC CAPITAL LETTER I + 0xC7B7: 0x0419, // CYRILLIC CAPITAL LETTER SHORT I + 0xC7B8: 0x041A, // CYRILLIC CAPITAL LETTER KA + 0xC7B9: 0x041B, // CYRILLIC CAPITAL LETTER EL + 0xC7BA: 0x041C, // CYRILLIC CAPITAL LETTER EM + 0xC7BB: 0x0423, // CYRILLIC CAPITAL LETTER U + 0xC7BC: 0x0424, // CYRILLIC CAPITAL LETTER EF + 0xC7BD: 0x0425, // CYRILLIC CAPITAL LETTER HA + 0xC7BE: 0x0426, // CYRILLIC CAPITAL LETTER TSE + 0xC7BF: 0x0427, // CYRILLIC CAPITAL LETTER CHE + 0xC7C0: 0x0428, // CYRILLIC CAPITAL LETTER SHA + 0xC7C1: 0x0429, // CYRILLIC CAPITAL LETTER SHCHA + 0xC7C2: 0x042A, // CYRILLIC CAPITAL LETTER HARD SIGN + 0xC7C3: 0x042B, // CYRILLIC CAPITAL LETTER YERU + 0xC7C4: 0x042C, // CYRILLIC CAPITAL LETTER SOFT SIGN + 0xC7C5: 0x042D, // CYRILLIC CAPITAL LETTER E + 0xC7C6: 0x042E, // CYRILLIC CAPITAL LETTER YU + 0xC7C7: 0x042F, // CYRILLIC CAPITAL LETTER YA + 0xC7C8: 0x0430, // CYRILLIC SMALL LETTER A + 0xC7C9: 0x0431, // CYRILLIC SMALL LETTER BE + 0xC7CA: 0x0432, // CYRILLIC SMALL LETTER VE + 0xC7CB: 0x0433, // CYRILLIC SMALL LETTER GHE + 0xC7CC: 0x0434, // CYRILLIC SMALL LETTER DE + 0xC7CD: 0x0435, // CYRILLIC SMALL LETTER IE + 0xC7CE: 0x0451, // CYRILLIC SMALL LETTER IO + 0xC7CF: 0x0436, // CYRILLIC SMALL LETTER ZHE + 0xC7D0: 0x0437, // CYRILLIC SMALL LETTER ZE + 0xC7D1: 0x0438, // CYRILLIC SMALL LETTER I + 0xC7D2: 0x0439, // CYRILLIC SMALL LETTER SHORT I + 0xC7D3: 0x043A, // CYRILLIC SMALL LETTER KA + 0xC7D4: 0x043B, // CYRILLIC SMALL LETTER EL + 0xC7D5: 0x043C, // CYRILLIC SMALL LETTER EM + 0xC7D6: 0x043D, // CYRILLIC SMALL LETTER EN + 0xC7D7: 0x043E, // CYRILLIC SMALL LETTER O + 0xC7D8: 0x043F, // CYRILLIC SMALL LETTER PE + 0xC7D9: 0x0440, // CYRILLIC SMALL LETTER ER + 0xC7DA: 0x0441, // CYRILLIC SMALL LETTER ES + 0xC7DB: 0x0442, // CYRILLIC SMALL LETTER TE + 0xC7DC: 0x0443, // CYRILLIC SMALL LETTER U + 0xC7DD: 0x0444, // CYRILLIC SMALL LETTER EF + 0xC7DE: 0x0445, // CYRILLIC SMALL LETTER HA + 0xC7DF: 0x0446, // CYRILLIC SMALL LETTER TSE + 0xC7E0: 0x0447, // CYRILLIC SMALL LETTER CHE + 0xC7E1: 0x0448, // CYRILLIC SMALL LETTER SHA + 0xC7E2: 0x0449, // CYRILLIC SMALL LETTER SHCHA + 0xC7E3: 0x044A, // CYRILLIC SMALL LETTER HARD SIGN + 0xC7E4: 0x044B, // CYRILLIC SMALL LETTER YERU + 0xC7E5: 0x044C, // CYRILLIC SMALL LETTER SOFT SIGN + 0xC7E6: 0x044D, // CYRILLIC SMALL LETTER E + 0xC7E7: 0x044E, // CYRILLIC SMALL LETTER YU + 0xC7E8: 0x044F, // CYRILLIC SMALL LETTER YA + 0xC7E9: 0x2460, // CIRCLED DIGIT ONE + 0xC7EA: 0x2461, // CIRCLED DIGIT TWO + 0xC7EB: 0x2462, // CIRCLED DIGIT THREE + 0xC7EC: 0x2463, // CIRCLED DIGIT FOUR + 0xC7ED: 0x2464, // CIRCLED DIGIT FIVE + 0xC7EE: 0x2465, // CIRCLED DIGIT SIX + 0xC7EF: 0x2466, // CIRCLED DIGIT SEVEN + 0xC7F0: 0x2467, // CIRCLED DIGIT EIGHT + 0xC7F1: 0x2468, // CIRCLED DIGIT NINE + 0xC7F2: 0x2469, // CIRCLED NUMBER TEN + 0xC7F3: 0x2474, // PARENTHESIZED DIGIT ONE + 0xC7F4: 0x2475, // PARENTHESIZED DIGIT TWO + 0xC7F5: 0x2476, // PARENTHESIZED DIGIT THREE + 0xC7F6: 0x2477, // PARENTHESIZED DIGIT FOUR + 0xC7F7: 0x2478, // PARENTHESIZED DIGIT FIVE + 0xC7F8: 0x2479, // PARENTHESIZED DIGIT SIX + 0xC7F9: 0x247A, // PARENTHESIZED DIGIT SEVEN + 0xC7FA: 0x247B, // PARENTHESIZED DIGIT EIGHT + 0xC7FB: 0x247C, // PARENTHESIZED DIGIT NINE + 0xC7FC: 0x247D, // PARENTHESIZED NUMBER TEN + 0xC940: 0x4E42, + 0xC941: 0x4E5C, + 0xC942: 0x51F5, + 0xC943: 0x531A, + 0xC944: 0x5382, + 0xC945: 0x4E07, + 0xC946: 0x4E0C, + 0xC947: 0x4E47, + 0xC948: 0x4E8D, + 0xC949: 0x56D7, + 0xC94A: 0xFA0C, // CJK COMPATIBILITY IDEOGRAPH-FA0C + 0xC94B: 0x5C6E, + 0xC94C: 0x5F73, + 0xC94D: 0x4E0F, + 0xC94E: 0x5187, + 0xC94F: 0x4E0E, + 0xC950: 0x4E2E, + 0xC951: 0x4E93, + 0xC952: 0x4EC2, + 0xC953: 0x4EC9, + 0xC954: 0x4EC8, + 0xC955: 0x5198, + 0xC956: 0x52FC, + 0xC957: 0x536C, + 0xC958: 0x53B9, + 0xC959: 0x5720, + 0xC95A: 0x5903, + 0xC95B: 0x592C, + 0xC95C: 0x5C10, + 0xC95D: 0x5DFF, + 0xC95E: 0x65E1, + 0xC95F: 0x6BB3, + 0xC960: 0x6BCC, + 0xC961: 0x6C14, + 0xC962: 0x723F, + 0xC963: 0x4E31, + 0xC964: 0x4E3C, + 0xC965: 0x4EE8, + 0xC966: 0x4EDC, + 0xC967: 0x4EE9, + 0xC968: 0x4EE1, + 0xC969: 0x4EDD, + 0xC96A: 0x4EDA, + 0xC96B: 0x520C, + 0xC96C: 0x531C, + 0xC96D: 0x534C, + 0xC96E: 0x5722, + 0xC96F: 0x5723, + 0xC970: 0x5917, + 0xC971: 0x592F, + 0xC972: 0x5B81, + 0xC973: 0x5B84, + 0xC974: 0x5C12, + 0xC975: 0x5C3B, + 0xC976: 0x5C74, + 0xC977: 0x5C73, + 0xC978: 0x5E04, + 0xC979: 0x5E80, + 0xC97A: 0x5E82, + 0xC97B: 0x5FC9, + 0xC97C: 0x6209, + 0xC97D: 0x6250, + 0xC97E: 0x6C15, + 0xC9A1: 0x6C36, + 0xC9A2: 0x6C43, + 0xC9A3: 0x6C3F, + 0xC9A4: 0x6C3B, + 0xC9A5: 0x72AE, + 0xC9A6: 0x72B0, + 0xC9A7: 0x738A, + 0xC9A8: 0x79B8, + 0xC9A9: 0x808A, + 0xC9AA: 0x961E, + 0xC9AB: 0x4F0E, + 0xC9AC: 0x4F18, + 0xC9AD: 0x4F2C, + 0xC9AE: 0x4EF5, + 0xC9AF: 0x4F14, + 0xC9B0: 0x4EF1, + 0xC9B1: 0x4F00, + 0xC9B2: 0x4EF7, + 0xC9B3: 0x4F08, + 0xC9B4: 0x4F1D, + 0xC9B5: 0x4F02, + 0xC9B6: 0x4F05, + 0xC9B7: 0x4F22, + 0xC9B8: 0x4F13, + 0xC9B9: 0x4F04, + 0xC9BA: 0x4EF4, + 0xC9BB: 0x4F12, + 0xC9BC: 0x51B1, + 0xC9BD: 0x5213, + 0xC9BE: 0x5209, + 0xC9BF: 0x5210, + 0xC9C0: 0x52A6, + 0xC9C1: 0x5322, + 0xC9C2: 0x531F, + 0xC9C3: 0x534D, + 0xC9C4: 0x538A, + 0xC9C5: 0x5407, + 0xC9C6: 0x56E1, + 0xC9C7: 0x56DF, + 0xC9C8: 0x572E, + 0xC9C9: 0x572A, + 0xC9CA: 0x5734, + 0xC9CB: 0x593C, + 0xC9CC: 0x5980, + 0xC9CD: 0x597C, + 0xC9CE: 0x5985, + 0xC9CF: 0x597B, + 0xC9D0: 0x597E, + 0xC9D1: 0x5977, + 0xC9D2: 0x597F, + 0xC9D3: 0x5B56, + 0xC9D4: 0x5C15, + 0xC9D5: 0x5C25, + 0xC9D6: 0x5C7C, + 0xC9D7: 0x5C7A, + 0xC9D8: 0x5C7B, + 0xC9D9: 0x5C7E, + 0xC9DA: 0x5DDF, + 0xC9DB: 0x5E75, + 0xC9DC: 0x5E84, + 0xC9DD: 0x5F02, + 0xC9DE: 0x5F1A, + 0xC9DF: 0x5F74, + 0xC9E0: 0x5FD5, + 0xC9E1: 0x5FD4, + 0xC9E2: 0x5FCF, + 0xC9E3: 0x625C, + 0xC9E4: 0x625E, + 0xC9E5: 0x6264, + 0xC9E6: 0x6261, + 0xC9E7: 0x6266, + 0xC9E8: 0x6262, + 0xC9E9: 0x6259, + 0xC9EA: 0x6260, + 0xC9EB: 0x625A, + 0xC9EC: 0x6265, + 0xC9ED: 0x65EF, + 0xC9EE: 0x65EE, + 0xC9EF: 0x673E, + 0xC9F0: 0x6739, + 0xC9F1: 0x6738, + 0xC9F2: 0x673B, + 0xC9F3: 0x673A, + 0xC9F4: 0x673F, + 0xC9F5: 0x673C, + 0xC9F6: 0x6733, + 0xC9F7: 0x6C18, + 0xC9F8: 0x6C46, + 0xC9F9: 0x6C52, + 0xC9FA: 0x6C5C, + 0xC9FB: 0x6C4F, + 0xC9FC: 0x6C4A, + 0xC9FD: 0x6C54, + 0xC9FE: 0x6C4B, + 0xCA40: 0x6C4C, + 0xCA41: 0x7071, + 0xCA42: 0x725E, + 0xCA43: 0x72B4, + 0xCA44: 0x72B5, + 0xCA45: 0x738E, + 0xCA46: 0x752A, + 0xCA47: 0x767F, + 0xCA48: 0x7A75, + 0xCA49: 0x7F51, + 0xCA4A: 0x8278, + 0xCA4B: 0x827C, + 0xCA4C: 0x8280, + 0xCA4D: 0x827D, + 0xCA4E: 0x827F, + 0xCA4F: 0x864D, + 0xCA50: 0x897E, + 0xCA51: 0x9099, + 0xCA52: 0x9097, + 0xCA53: 0x9098, + 0xCA54: 0x909B, + 0xCA55: 0x9094, + 0xCA56: 0x9622, + 0xCA57: 0x9624, + 0xCA58: 0x9620, + 0xCA59: 0x9623, + 0xCA5A: 0x4F56, + 0xCA5B: 0x4F3B, + 0xCA5C: 0x4F62, + 0xCA5D: 0x4F49, + 0xCA5E: 0x4F53, + 0xCA5F: 0x4F64, + 0xCA60: 0x4F3E, + 0xCA61: 0x4F67, + 0xCA62: 0x4F52, + 0xCA63: 0x4F5F, + 0xCA64: 0x4F41, + 0xCA65: 0x4F58, + 0xCA66: 0x4F2D, + 0xCA67: 0x4F33, + 0xCA68: 0x4F3F, + 0xCA69: 0x4F61, + 0xCA6A: 0x518F, + 0xCA6B: 0x51B9, + 0xCA6C: 0x521C, + 0xCA6D: 0x521E, + 0xCA6E: 0x5221, + 0xCA6F: 0x52AD, + 0xCA70: 0x52AE, + 0xCA71: 0x5309, + 0xCA72: 0x5363, + 0xCA73: 0x5372, + 0xCA74: 0x538E, + 0xCA75: 0x538F, + 0xCA76: 0x5430, + 0xCA77: 0x5437, + 0xCA78: 0x542A, + 0xCA79: 0x5454, + 0xCA7A: 0x5445, + 0xCA7B: 0x5419, + 0xCA7C: 0x541C, + 0xCA7D: 0x5425, + 0xCA7E: 0x5418, + 0xCAA1: 0x543D, + 0xCAA2: 0x544F, + 0xCAA3: 0x5441, + 0xCAA4: 0x5428, + 0xCAA5: 0x5424, + 0xCAA6: 0x5447, + 0xCAA7: 0x56EE, + 0xCAA8: 0x56E7, + 0xCAA9: 0x56E5, + 0xCAAA: 0x5741, + 0xCAAB: 0x5745, + 0xCAAC: 0x574C, + 0xCAAD: 0x5749, + 0xCAAE: 0x574B, + 0xCAAF: 0x5752, + 0xCAB0: 0x5906, + 0xCAB1: 0x5940, + 0xCAB2: 0x59A6, + 0xCAB3: 0x5998, + 0xCAB4: 0x59A0, + 0xCAB5: 0x5997, + 0xCAB6: 0x598E, + 0xCAB7: 0x59A2, + 0xCAB8: 0x5990, + 0xCAB9: 0x598F, + 0xCABA: 0x59A7, + 0xCABB: 0x59A1, + 0xCABC: 0x5B8E, + 0xCABD: 0x5B92, + 0xCABE: 0x5C28, + 0xCABF: 0x5C2A, + 0xCAC0: 0x5C8D, + 0xCAC1: 0x5C8F, + 0xCAC2: 0x5C88, + 0xCAC3: 0x5C8B, + 0xCAC4: 0x5C89, + 0xCAC5: 0x5C92, + 0xCAC6: 0x5C8A, + 0xCAC7: 0x5C86, + 0xCAC8: 0x5C93, + 0xCAC9: 0x5C95, + 0xCACA: 0x5DE0, + 0xCACB: 0x5E0A, + 0xCACC: 0x5E0E, + 0xCACD: 0x5E8B, + 0xCACE: 0x5E89, + 0xCACF: 0x5E8C, + 0xCAD0: 0x5E88, + 0xCAD1: 0x5E8D, + 0xCAD2: 0x5F05, + 0xCAD3: 0x5F1D, + 0xCAD4: 0x5F78, + 0xCAD5: 0x5F76, + 0xCAD6: 0x5FD2, + 0xCAD7: 0x5FD1, + 0xCAD8: 0x5FD0, + 0xCAD9: 0x5FED, + 0xCADA: 0x5FE8, + 0xCADB: 0x5FEE, + 0xCADC: 0x5FF3, + 0xCADD: 0x5FE1, + 0xCADE: 0x5FE4, + 0xCADF: 0x5FE3, + 0xCAE0: 0x5FFA, + 0xCAE1: 0x5FEF, + 0xCAE2: 0x5FF7, + 0xCAE3: 0x5FFB, + 0xCAE4: 0x6000, + 0xCAE5: 0x5FF4, + 0xCAE6: 0x623A, + 0xCAE7: 0x6283, + 0xCAE8: 0x628C, + 0xCAE9: 0x628E, + 0xCAEA: 0x628F, + 0xCAEB: 0x6294, + 0xCAEC: 0x6287, + 0xCAED: 0x6271, + 0xCAEE: 0x627B, + 0xCAEF: 0x627A, + 0xCAF0: 0x6270, + 0xCAF1: 0x6281, + 0xCAF2: 0x6288, + 0xCAF3: 0x6277, + 0xCAF4: 0x627D, + 0xCAF5: 0x6272, + 0xCAF6: 0x6274, + 0xCAF7: 0x6537, + 0xCAF8: 0x65F0, + 0xCAF9: 0x65F4, + 0xCAFA: 0x65F3, + 0xCAFB: 0x65F2, + 0xCAFC: 0x65F5, + 0xCAFD: 0x6745, + 0xCAFE: 0x6747, + 0xCB40: 0x6759, + 0xCB41: 0x6755, + 0xCB42: 0x674C, + 0xCB43: 0x6748, + 0xCB44: 0x675D, + 0xCB45: 0x674D, + 0xCB46: 0x675A, + 0xCB47: 0x674B, + 0xCB48: 0x6BD0, + 0xCB49: 0x6C19, + 0xCB4A: 0x6C1A, + 0xCB4B: 0x6C78, + 0xCB4C: 0x6C67, + 0xCB4D: 0x6C6B, + 0xCB4E: 0x6C84, + 0xCB4F: 0x6C8B, + 0xCB50: 0x6C8F, + 0xCB51: 0x6C71, + 0xCB52: 0x6C6F, + 0xCB53: 0x6C69, + 0xCB54: 0x6C9A, + 0xCB55: 0x6C6D, + 0xCB56: 0x6C87, + 0xCB57: 0x6C95, + 0xCB58: 0x6C9C, + 0xCB59: 0x6C66, + 0xCB5A: 0x6C73, + 0xCB5B: 0x6C65, + 0xCB5C: 0x6C7B, + 0xCB5D: 0x6C8E, + 0xCB5E: 0x7074, + 0xCB5F: 0x707A, + 0xCB60: 0x7263, + 0xCB61: 0x72BF, + 0xCB62: 0x72BD, + 0xCB63: 0x72C3, + 0xCB64: 0x72C6, + 0xCB65: 0x72C1, + 0xCB66: 0x72BA, + 0xCB67: 0x72C5, + 0xCB68: 0x7395, + 0xCB69: 0x7397, + 0xCB6A: 0x7393, + 0xCB6B: 0x7394, + 0xCB6C: 0x7392, + 0xCB6D: 0x753A, + 0xCB6E: 0x7539, + 0xCB6F: 0x7594, + 0xCB70: 0x7595, + 0xCB71: 0x7681, + 0xCB72: 0x793D, + 0xCB73: 0x8034, + 0xCB74: 0x8095, + 0xCB75: 0x8099, + 0xCB76: 0x8090, + 0xCB77: 0x8092, + 0xCB78: 0x809C, + 0xCB79: 0x8290, + 0xCB7A: 0x828F, + 0xCB7B: 0x8285, + 0xCB7C: 0x828E, + 0xCB7D: 0x8291, + 0xCB7E: 0x8293, + 0xCBA1: 0x828A, + 0xCBA2: 0x8283, + 0xCBA3: 0x8284, + 0xCBA4: 0x8C78, + 0xCBA5: 0x8FC9, + 0xCBA6: 0x8FBF, + 0xCBA7: 0x909F, + 0xCBA8: 0x90A1, + 0xCBA9: 0x90A5, + 0xCBAA: 0x909E, + 0xCBAB: 0x90A7, + 0xCBAC: 0x90A0, + 0xCBAD: 0x9630, + 0xCBAE: 0x9628, + 0xCBAF: 0x962F, + 0xCBB0: 0x962D, + 0xCBB1: 0x4E33, + 0xCBB2: 0x4F98, + 0xCBB3: 0x4F7C, + 0xCBB4: 0x4F85, + 0xCBB5: 0x4F7D, + 0xCBB6: 0x4F80, + 0xCBB7: 0x4F87, + 0xCBB8: 0x4F76, + 0xCBB9: 0x4F74, + 0xCBBA: 0x4F89, + 0xCBBB: 0x4F84, + 0xCBBC: 0x4F77, + 0xCBBD: 0x4F4C, + 0xCBBE: 0x4F97, + 0xCBBF: 0x4F6A, + 0xCBC0: 0x4F9A, + 0xCBC1: 0x4F79, + 0xCBC2: 0x4F81, + 0xCBC3: 0x4F78, + 0xCBC4: 0x4F90, + 0xCBC5: 0x4F9C, + 0xCBC6: 0x4F94, + 0xCBC7: 0x4F9E, + 0xCBC8: 0x4F92, + 0xCBC9: 0x4F82, + 0xCBCA: 0x4F95, + 0xCBCB: 0x4F6B, + 0xCBCC: 0x4F6E, + 0xCBCD: 0x519E, + 0xCBCE: 0x51BC, + 0xCBCF: 0x51BE, + 0xCBD0: 0x5235, + 0xCBD1: 0x5232, + 0xCBD2: 0x5233, + 0xCBD3: 0x5246, + 0xCBD4: 0x5231, + 0xCBD5: 0x52BC, + 0xCBD6: 0x530A, + 0xCBD7: 0x530B, + 0xCBD8: 0x533C, + 0xCBD9: 0x5392, + 0xCBDA: 0x5394, + 0xCBDB: 0x5487, + 0xCBDC: 0x547F, + 0xCBDD: 0x5481, + 0xCBDE: 0x5491, + 0xCBDF: 0x5482, + 0xCBE0: 0x5488, + 0xCBE1: 0x546B, + 0xCBE2: 0x547A, + 0xCBE3: 0x547E, + 0xCBE4: 0x5465, + 0xCBE5: 0x546C, + 0xCBE6: 0x5474, + 0xCBE7: 0x5466, + 0xCBE8: 0x548D, + 0xCBE9: 0x546F, + 0xCBEA: 0x5461, + 0xCBEB: 0x5460, + 0xCBEC: 0x5498, + 0xCBED: 0x5463, + 0xCBEE: 0x5467, + 0xCBEF: 0x5464, + 0xCBF0: 0x56F7, + 0xCBF1: 0x56F9, + 0xCBF2: 0x576F, + 0xCBF3: 0x5772, + 0xCBF4: 0x576D, + 0xCBF5: 0x576B, + 0xCBF6: 0x5771, + 0xCBF7: 0x5770, + 0xCBF8: 0x5776, + 0xCBF9: 0x5780, + 0xCBFA: 0x5775, + 0xCBFB: 0x577B, + 0xCBFC: 0x5773, + 0xCBFD: 0x5774, + 0xCBFE: 0x5762, + 0xCC40: 0x5768, + 0xCC41: 0x577D, + 0xCC42: 0x590C, + 0xCC43: 0x5945, + 0xCC44: 0x59B5, + 0xCC45: 0x59BA, + 0xCC46: 0x59CF, + 0xCC47: 0x59CE, + 0xCC48: 0x59B2, + 0xCC49: 0x59CC, + 0xCC4A: 0x59C1, + 0xCC4B: 0x59B6, + 0xCC4C: 0x59BC, + 0xCC4D: 0x59C3, + 0xCC4E: 0x59D6, + 0xCC4F: 0x59B1, + 0xCC50: 0x59BD, + 0xCC51: 0x59C0, + 0xCC52: 0x59C8, + 0xCC53: 0x59B4, + 0xCC54: 0x59C7, + 0xCC55: 0x5B62, + 0xCC56: 0x5B65, + 0xCC57: 0x5B93, + 0xCC58: 0x5B95, + 0xCC59: 0x5C44, + 0xCC5A: 0x5C47, + 0xCC5B: 0x5CAE, + 0xCC5C: 0x5CA4, + 0xCC5D: 0x5CA0, + 0xCC5E: 0x5CB5, + 0xCC5F: 0x5CAF, + 0xCC60: 0x5CA8, + 0xCC61: 0x5CAC, + 0xCC62: 0x5C9F, + 0xCC63: 0x5CA3, + 0xCC64: 0x5CAD, + 0xCC65: 0x5CA2, + 0xCC66: 0x5CAA, + 0xCC67: 0x5CA7, + 0xCC68: 0x5C9D, + 0xCC69: 0x5CA5, + 0xCC6A: 0x5CB6, + 0xCC6B: 0x5CB0, + 0xCC6C: 0x5CA6, + 0xCC6D: 0x5E17, + 0xCC6E: 0x5E14, + 0xCC6F: 0x5E19, + 0xCC70: 0x5F28, + 0xCC71: 0x5F22, + 0xCC72: 0x5F23, + 0xCC73: 0x5F24, + 0xCC74: 0x5F54, + 0xCC75: 0x5F82, + 0xCC76: 0x5F7E, + 0xCC77: 0x5F7D, + 0xCC78: 0x5FDE, + 0xCC79: 0x5FE5, + 0xCC7A: 0x602D, + 0xCC7B: 0x6026, + 0xCC7C: 0x6019, + 0xCC7D: 0x6032, + 0xCC7E: 0x600B, + 0xCCA1: 0x6034, + 0xCCA2: 0x600A, + 0xCCA3: 0x6017, + 0xCCA4: 0x6033, + 0xCCA5: 0x601A, + 0xCCA6: 0x601E, + 0xCCA7: 0x602C, + 0xCCA8: 0x6022, + 0xCCA9: 0x600D, + 0xCCAA: 0x6010, + 0xCCAB: 0x602E, + 0xCCAC: 0x6013, + 0xCCAD: 0x6011, + 0xCCAE: 0x600C, + 0xCCAF: 0x6009, + 0xCCB0: 0x601C, + 0xCCB1: 0x6214, + 0xCCB2: 0x623D, + 0xCCB3: 0x62AD, + 0xCCB4: 0x62B4, + 0xCCB5: 0x62D1, + 0xCCB6: 0x62BE, + 0xCCB7: 0x62AA, + 0xCCB8: 0x62B6, + 0xCCB9: 0x62CA, + 0xCCBA: 0x62AE, + 0xCCBB: 0x62B3, + 0xCCBC: 0x62AF, + 0xCCBD: 0x62BB, + 0xCCBE: 0x62A9, + 0xCCBF: 0x62B0, + 0xCCC0: 0x62B8, + 0xCCC1: 0x653D, + 0xCCC2: 0x65A8, + 0xCCC3: 0x65BB, + 0xCCC4: 0x6609, + 0xCCC5: 0x65FC, + 0xCCC6: 0x6604, + 0xCCC7: 0x6612, + 0xCCC8: 0x6608, + 0xCCC9: 0x65FB, + 0xCCCA: 0x6603, + 0xCCCB: 0x660B, + 0xCCCC: 0x660D, + 0xCCCD: 0x6605, + 0xCCCE: 0x65FD, + 0xCCCF: 0x6611, + 0xCCD0: 0x6610, + 0xCCD1: 0x66F6, + 0xCCD2: 0x670A, + 0xCCD3: 0x6785, + 0xCCD4: 0x676C, + 0xCCD5: 0x678E, + 0xCCD6: 0x6792, + 0xCCD7: 0x6776, + 0xCCD8: 0x677B, + 0xCCD9: 0x6798, + 0xCCDA: 0x6786, + 0xCCDB: 0x6784, + 0xCCDC: 0x6774, + 0xCCDD: 0x678D, + 0xCCDE: 0x678C, + 0xCCDF: 0x677A, + 0xCCE0: 0x679F, + 0xCCE1: 0x6791, + 0xCCE2: 0x6799, + 0xCCE3: 0x6783, + 0xCCE4: 0x677D, + 0xCCE5: 0x6781, + 0xCCE6: 0x6778, + 0xCCE7: 0x6779, + 0xCCE8: 0x6794, + 0xCCE9: 0x6B25, + 0xCCEA: 0x6B80, + 0xCCEB: 0x6B7E, + 0xCCEC: 0x6BDE, + 0xCCED: 0x6C1D, + 0xCCEE: 0x6C93, + 0xCCEF: 0x6CEC, + 0xCCF0: 0x6CEB, + 0xCCF1: 0x6CEE, + 0xCCF2: 0x6CD9, + 0xCCF3: 0x6CB6, + 0xCCF4: 0x6CD4, + 0xCCF5: 0x6CAD, + 0xCCF6: 0x6CE7, + 0xCCF7: 0x6CB7, + 0xCCF8: 0x6CD0, + 0xCCF9: 0x6CC2, + 0xCCFA: 0x6CBA, + 0xCCFB: 0x6CC3, + 0xCCFC: 0x6CC6, + 0xCCFD: 0x6CED, + 0xCCFE: 0x6CF2, + 0xCD40: 0x6CD2, + 0xCD41: 0x6CDD, + 0xCD42: 0x6CB4, + 0xCD43: 0x6C8A, + 0xCD44: 0x6C9D, + 0xCD45: 0x6C80, + 0xCD46: 0x6CDE, + 0xCD47: 0x6CC0, + 0xCD48: 0x6D30, + 0xCD49: 0x6CCD, + 0xCD4A: 0x6CC7, + 0xCD4B: 0x6CB0, + 0xCD4C: 0x6CF9, + 0xCD4D: 0x6CCF, + 0xCD4E: 0x6CE9, + 0xCD4F: 0x6CD1, + 0xCD50: 0x7094, + 0xCD51: 0x7098, + 0xCD52: 0x7085, + 0xCD53: 0x7093, + 0xCD54: 0x7086, + 0xCD55: 0x7084, + 0xCD56: 0x7091, + 0xCD57: 0x7096, + 0xCD58: 0x7082, + 0xCD59: 0x709A, + 0xCD5A: 0x7083, + 0xCD5B: 0x726A, + 0xCD5C: 0x72D6, + 0xCD5D: 0x72CB, + 0xCD5E: 0x72D8, + 0xCD5F: 0x72C9, + 0xCD60: 0x72DC, + 0xCD61: 0x72D2, + 0xCD62: 0x72D4, + 0xCD63: 0x72DA, + 0xCD64: 0x72CC, + 0xCD65: 0x72D1, + 0xCD66: 0x73A4, + 0xCD67: 0x73A1, + 0xCD68: 0x73AD, + 0xCD69: 0x73A6, + 0xCD6A: 0x73A2, + 0xCD6B: 0x73A0, + 0xCD6C: 0x73AC, + 0xCD6D: 0x739D, + 0xCD6E: 0x74DD, + 0xCD6F: 0x74E8, + 0xCD70: 0x753F, + 0xCD71: 0x7540, + 0xCD72: 0x753E, + 0xCD73: 0x758C, + 0xCD74: 0x7598, + 0xCD75: 0x76AF, + 0xCD76: 0x76F3, + 0xCD77: 0x76F1, + 0xCD78: 0x76F0, + 0xCD79: 0x76F5, + 0xCD7A: 0x77F8, + 0xCD7B: 0x77FC, + 0xCD7C: 0x77F9, + 0xCD7D: 0x77FB, + 0xCD7E: 0x77FA, + 0xCDA1: 0x77F7, + 0xCDA2: 0x7942, + 0xCDA3: 0x793F, + 0xCDA4: 0x79C5, + 0xCDA5: 0x7A78, + 0xCDA6: 0x7A7B, + 0xCDA7: 0x7AFB, + 0xCDA8: 0x7C75, + 0xCDA9: 0x7CFD, + 0xCDAA: 0x8035, + 0xCDAB: 0x808F, + 0xCDAC: 0x80AE, + 0xCDAD: 0x80A3, + 0xCDAE: 0x80B8, + 0xCDAF: 0x80B5, + 0xCDB0: 0x80AD, + 0xCDB1: 0x8220, + 0xCDB2: 0x82A0, + 0xCDB3: 0x82C0, + 0xCDB4: 0x82AB, + 0xCDB5: 0x829A, + 0xCDB6: 0x8298, + 0xCDB7: 0x829B, + 0xCDB8: 0x82B5, + 0xCDB9: 0x82A7, + 0xCDBA: 0x82AE, + 0xCDBB: 0x82BC, + 0xCDBC: 0x829E, + 0xCDBD: 0x82BA, + 0xCDBE: 0x82B4, + 0xCDBF: 0x82A8, + 0xCDC0: 0x82A1, + 0xCDC1: 0x82A9, + 0xCDC2: 0x82C2, + 0xCDC3: 0x82A4, + 0xCDC4: 0x82C3, + 0xCDC5: 0x82B6, + 0xCDC6: 0x82A2, + 0xCDC7: 0x8670, + 0xCDC8: 0x866F, + 0xCDC9: 0x866D, + 0xCDCA: 0x866E, + 0xCDCB: 0x8C56, + 0xCDCC: 0x8FD2, + 0xCDCD: 0x8FCB, + 0xCDCE: 0x8FD3, + 0xCDCF: 0x8FCD, + 0xCDD0: 0x8FD6, + 0xCDD1: 0x8FD5, + 0xCDD2: 0x8FD7, + 0xCDD3: 0x90B2, + 0xCDD4: 0x90B4, + 0xCDD5: 0x90AF, + 0xCDD6: 0x90B3, + 0xCDD7: 0x90B0, + 0xCDD8: 0x9639, + 0xCDD9: 0x963D, + 0xCDDA: 0x963C, + 0xCDDB: 0x963A, + 0xCDDC: 0x9643, + 0xCDDD: 0x4FCD, + 0xCDDE: 0x4FC5, + 0xCDDF: 0x4FD3, + 0xCDE0: 0x4FB2, + 0xCDE1: 0x4FC9, + 0xCDE2: 0x4FCB, + 0xCDE3: 0x4FC1, + 0xCDE4: 0x4FD4, + 0xCDE5: 0x4FDC, + 0xCDE6: 0x4FD9, + 0xCDE7: 0x4FBB, + 0xCDE8: 0x4FB3, + 0xCDE9: 0x4FDB, + 0xCDEA: 0x4FC7, + 0xCDEB: 0x4FD6, + 0xCDEC: 0x4FBA, + 0xCDED: 0x4FC0, + 0xCDEE: 0x4FB9, + 0xCDEF: 0x4FEC, + 0xCDF0: 0x5244, + 0xCDF1: 0x5249, + 0xCDF2: 0x52C0, + 0xCDF3: 0x52C2, + 0xCDF4: 0x533D, + 0xCDF5: 0x537C, + 0xCDF6: 0x5397, + 0xCDF7: 0x5396, + 0xCDF8: 0x5399, + 0xCDF9: 0x5398, + 0xCDFA: 0x54BA, + 0xCDFB: 0x54A1, + 0xCDFC: 0x54AD, + 0xCDFD: 0x54A5, + 0xCDFE: 0x54CF, + 0xCE40: 0x54C3, + 0xCE41: 0x830D, + 0xCE42: 0x54B7, + 0xCE43: 0x54AE, + 0xCE44: 0x54D6, + 0xCE45: 0x54B6, + 0xCE46: 0x54C5, + 0xCE47: 0x54C6, + 0xCE48: 0x54A0, + 0xCE49: 0x5470, + 0xCE4A: 0x54BC, + 0xCE4B: 0x54A2, + 0xCE4C: 0x54BE, + 0xCE4D: 0x5472, + 0xCE4E: 0x54DE, + 0xCE4F: 0x54B0, + 0xCE50: 0x57B5, + 0xCE51: 0x579E, + 0xCE52: 0x579F, + 0xCE53: 0x57A4, + 0xCE54: 0x578C, + 0xCE55: 0x5797, + 0xCE56: 0x579D, + 0xCE57: 0x579B, + 0xCE58: 0x5794, + 0xCE59: 0x5798, + 0xCE5A: 0x578F, + 0xCE5B: 0x5799, + 0xCE5C: 0x57A5, + 0xCE5D: 0x579A, + 0xCE5E: 0x5795, + 0xCE5F: 0x58F4, + 0xCE60: 0x590D, + 0xCE61: 0x5953, + 0xCE62: 0x59E1, + 0xCE63: 0x59DE, + 0xCE64: 0x59EE, + 0xCE65: 0x5A00, + 0xCE66: 0x59F1, + 0xCE67: 0x59DD, + 0xCE68: 0x59FA, + 0xCE69: 0x59FD, + 0xCE6A: 0x59FC, + 0xCE6B: 0x59F6, + 0xCE6C: 0x59E4, + 0xCE6D: 0x59F2, + 0xCE6E: 0x59F7, + 0xCE6F: 0x59DB, + 0xCE70: 0x59E9, + 0xCE71: 0x59F3, + 0xCE72: 0x59F5, + 0xCE73: 0x59E0, + 0xCE74: 0x59FE, + 0xCE75: 0x59F4, + 0xCE76: 0x59ED, + 0xCE77: 0x5BA8, + 0xCE78: 0x5C4C, + 0xCE79: 0x5CD0, + 0xCE7A: 0x5CD8, + 0xCE7B: 0x5CCC, + 0xCE7C: 0x5CD7, + 0xCE7D: 0x5CCB, + 0xCE7E: 0x5CDB, + 0xCEA1: 0x5CDE, + 0xCEA2: 0x5CDA, + 0xCEA3: 0x5CC9, + 0xCEA4: 0x5CC7, + 0xCEA5: 0x5CCA, + 0xCEA6: 0x5CD6, + 0xCEA7: 0x5CD3, + 0xCEA8: 0x5CD4, + 0xCEA9: 0x5CCF, + 0xCEAA: 0x5CC8, + 0xCEAB: 0x5CC6, + 0xCEAC: 0x5CCE, + 0xCEAD: 0x5CDF, + 0xCEAE: 0x5CF8, + 0xCEAF: 0x5DF9, + 0xCEB0: 0x5E21, + 0xCEB1: 0x5E22, + 0xCEB2: 0x5E23, + 0xCEB3: 0x5E20, + 0xCEB4: 0x5E24, + 0xCEB5: 0x5EB0, + 0xCEB6: 0x5EA4, + 0xCEB7: 0x5EA2, + 0xCEB8: 0x5E9B, + 0xCEB9: 0x5EA3, + 0xCEBA: 0x5EA5, + 0xCEBB: 0x5F07, + 0xCEBC: 0x5F2E, + 0xCEBD: 0x5F56, + 0xCEBE: 0x5F86, + 0xCEBF: 0x6037, + 0xCEC0: 0x6039, + 0xCEC1: 0x6054, + 0xCEC2: 0x6072, + 0xCEC3: 0x605E, + 0xCEC4: 0x6045, + 0xCEC5: 0x6053, + 0xCEC6: 0x6047, + 0xCEC7: 0x6049, + 0xCEC8: 0x605B, + 0xCEC9: 0x604C, + 0xCECA: 0x6040, + 0xCECB: 0x6042, + 0xCECC: 0x605F, + 0xCECD: 0x6024, + 0xCECE: 0x6044, + 0xCECF: 0x6058, + 0xCED0: 0x6066, + 0xCED1: 0x606E, + 0xCED2: 0x6242, + 0xCED3: 0x6243, + 0xCED4: 0x62CF, + 0xCED5: 0x630D, + 0xCED6: 0x630B, + 0xCED7: 0x62F5, + 0xCED8: 0x630E, + 0xCED9: 0x6303, + 0xCEDA: 0x62EB, + 0xCEDB: 0x62F9, + 0xCEDC: 0x630F, + 0xCEDD: 0x630C, + 0xCEDE: 0x62F8, + 0xCEDF: 0x62F6, + 0xCEE0: 0x6300, + 0xCEE1: 0x6313, + 0xCEE2: 0x6314, + 0xCEE3: 0x62FA, + 0xCEE4: 0x6315, + 0xCEE5: 0x62FB, + 0xCEE6: 0x62F0, + 0xCEE7: 0x6541, + 0xCEE8: 0x6543, + 0xCEE9: 0x65AA, + 0xCEEA: 0x65BF, + 0xCEEB: 0x6636, + 0xCEEC: 0x6621, + 0xCEED: 0x6632, + 0xCEEE: 0x6635, + 0xCEEF: 0x661C, + 0xCEF0: 0x6626, + 0xCEF1: 0x6622, + 0xCEF2: 0x6633, + 0xCEF3: 0x662B, + 0xCEF4: 0x663A, + 0xCEF5: 0x661D, + 0xCEF6: 0x6634, + 0xCEF7: 0x6639, + 0xCEF8: 0x662E, + 0xCEF9: 0x670F, + 0xCEFA: 0x6710, + 0xCEFB: 0x67C1, + 0xCEFC: 0x67F2, + 0xCEFD: 0x67C8, + 0xCEFE: 0x67BA, + 0xCF40: 0x67DC, + 0xCF41: 0x67BB, + 0xCF42: 0x67F8, + 0xCF43: 0x67D8, + 0xCF44: 0x67C0, + 0xCF45: 0x67B7, + 0xCF46: 0x67C5, + 0xCF47: 0x67EB, + 0xCF48: 0x67E4, + 0xCF49: 0x67DF, + 0xCF4A: 0x67B5, + 0xCF4B: 0x67CD, + 0xCF4C: 0x67B3, + 0xCF4D: 0x67F7, + 0xCF4E: 0x67F6, + 0xCF4F: 0x67EE, + 0xCF50: 0x67E3, + 0xCF51: 0x67C2, + 0xCF52: 0x67B9, + 0xCF53: 0x67CE, + 0xCF54: 0x67E7, + 0xCF55: 0x67F0, + 0xCF56: 0x67B2, + 0xCF57: 0x67FC, + 0xCF58: 0x67C6, + 0xCF59: 0x67ED, + 0xCF5A: 0x67CC, + 0xCF5B: 0x67AE, + 0xCF5C: 0x67E6, + 0xCF5D: 0x67DB, + 0xCF5E: 0x67FA, + 0xCF5F: 0x67C9, + 0xCF60: 0x67CA, + 0xCF61: 0x67C3, + 0xCF62: 0x67EA, + 0xCF63: 0x67CB, + 0xCF64: 0x6B28, + 0xCF65: 0x6B82, + 0xCF66: 0x6B84, + 0xCF67: 0x6BB6, + 0xCF68: 0x6BD6, + 0xCF69: 0x6BD8, + 0xCF6A: 0x6BE0, + 0xCF6B: 0x6C20, + 0xCF6C: 0x6C21, + 0xCF6D: 0x6D28, + 0xCF6E: 0x6D34, + 0xCF6F: 0x6D2D, + 0xCF70: 0x6D1F, + 0xCF71: 0x6D3C, + 0xCF72: 0x6D3F, + 0xCF73: 0x6D12, + 0xCF74: 0x6D0A, + 0xCF75: 0x6CDA, + 0xCF76: 0x6D33, + 0xCF77: 0x6D04, + 0xCF78: 0x6D19, + 0xCF79: 0x6D3A, + 0xCF7A: 0x6D1A, + 0xCF7B: 0x6D11, + 0xCF7C: 0x6D00, + 0xCF7D: 0x6D1D, + 0xCF7E: 0x6D42, + 0xCFA1: 0x6D01, + 0xCFA2: 0x6D18, + 0xCFA3: 0x6D37, + 0xCFA4: 0x6D03, + 0xCFA5: 0x6D0F, + 0xCFA6: 0x6D40, + 0xCFA7: 0x6D07, + 0xCFA8: 0x6D20, + 0xCFA9: 0x6D2C, + 0xCFAA: 0x6D08, + 0xCFAB: 0x6D22, + 0xCFAC: 0x6D09, + 0xCFAD: 0x6D10, + 0xCFAE: 0x70B7, + 0xCFAF: 0x709F, + 0xCFB0: 0x70BE, + 0xCFB1: 0x70B1, + 0xCFB2: 0x70B0, + 0xCFB3: 0x70A1, + 0xCFB4: 0x70B4, + 0xCFB5: 0x70B5, + 0xCFB6: 0x70A9, + 0xCFB7: 0x7241, + 0xCFB8: 0x7249, + 0xCFB9: 0x724A, + 0xCFBA: 0x726C, + 0xCFBB: 0x7270, + 0xCFBC: 0x7273, + 0xCFBD: 0x726E, + 0xCFBE: 0x72CA, + 0xCFBF: 0x72E4, + 0xCFC0: 0x72E8, + 0xCFC1: 0x72EB, + 0xCFC2: 0x72DF, + 0xCFC3: 0x72EA, + 0xCFC4: 0x72E6, + 0xCFC5: 0x72E3, + 0xCFC6: 0x7385, + 0xCFC7: 0x73CC, + 0xCFC8: 0x73C2, + 0xCFC9: 0x73C8, + 0xCFCA: 0x73C5, + 0xCFCB: 0x73B9, + 0xCFCC: 0x73B6, + 0xCFCD: 0x73B5, + 0xCFCE: 0x73B4, + 0xCFCF: 0x73EB, + 0xCFD0: 0x73BF, + 0xCFD1: 0x73C7, + 0xCFD2: 0x73BE, + 0xCFD3: 0x73C3, + 0xCFD4: 0x73C6, + 0xCFD5: 0x73B8, + 0xCFD6: 0x73CB, + 0xCFD7: 0x74EC, + 0xCFD8: 0x74EE, + 0xCFD9: 0x752E, + 0xCFDA: 0x7547, + 0xCFDB: 0x7548, + 0xCFDC: 0x75A7, + 0xCFDD: 0x75AA, + 0xCFDE: 0x7679, + 0xCFDF: 0x76C4, + 0xCFE0: 0x7708, + 0xCFE1: 0x7703, + 0xCFE2: 0x7704, + 0xCFE3: 0x7705, + 0xCFE4: 0x770A, + 0xCFE5: 0x76F7, + 0xCFE6: 0x76FB, + 0xCFE7: 0x76FA, + 0xCFE8: 0x77E7, + 0xCFE9: 0x77E8, + 0xCFEA: 0x7806, + 0xCFEB: 0x7811, + 0xCFEC: 0x7812, + 0xCFED: 0x7805, + 0xCFEE: 0x7810, + 0xCFEF: 0x780F, + 0xCFF0: 0x780E, + 0xCFF1: 0x7809, + 0xCFF2: 0x7803, + 0xCFF3: 0x7813, + 0xCFF4: 0x794A, + 0xCFF5: 0x794C, + 0xCFF6: 0x794B, + 0xCFF7: 0x7945, + 0xCFF8: 0x7944, + 0xCFF9: 0x79D5, + 0xCFFA: 0x79CD, + 0xCFFB: 0x79CF, + 0xCFFC: 0x79D6, + 0xCFFD: 0x79CE, + 0xCFFE: 0x7A80, + 0xD040: 0x7A7E, + 0xD041: 0x7AD1, + 0xD042: 0x7B00, + 0xD043: 0x7B01, + 0xD044: 0x7C7A, + 0xD045: 0x7C78, + 0xD046: 0x7C79, + 0xD047: 0x7C7F, + 0xD048: 0x7C80, + 0xD049: 0x7C81, + 0xD04A: 0x7D03, + 0xD04B: 0x7D08, + 0xD04C: 0x7D01, + 0xD04D: 0x7F58, + 0xD04E: 0x7F91, + 0xD04F: 0x7F8D, + 0xD050: 0x7FBE, + 0xD051: 0x8007, + 0xD052: 0x800E, + 0xD053: 0x800F, + 0xD054: 0x8014, + 0xD055: 0x8037, + 0xD056: 0x80D8, + 0xD057: 0x80C7, + 0xD058: 0x80E0, + 0xD059: 0x80D1, + 0xD05A: 0x80C8, + 0xD05B: 0x80C2, + 0xD05C: 0x80D0, + 0xD05D: 0x80C5, + 0xD05E: 0x80E3, + 0xD05F: 0x80D9, + 0xD060: 0x80DC, + 0xD061: 0x80CA, + 0xD062: 0x80D5, + 0xD063: 0x80C9, + 0xD064: 0x80CF, + 0xD065: 0x80D7, + 0xD066: 0x80E6, + 0xD067: 0x80CD, + 0xD068: 0x81FF, + 0xD069: 0x8221, + 0xD06A: 0x8294, + 0xD06B: 0x82D9, + 0xD06C: 0x82FE, + 0xD06D: 0x82F9, + 0xD06E: 0x8307, + 0xD06F: 0x82E8, + 0xD070: 0x8300, + 0xD071: 0x82D5, + 0xD072: 0x833A, + 0xD073: 0x82EB, + 0xD074: 0x82D6, + 0xD075: 0x82F4, + 0xD076: 0x82EC, + 0xD077: 0x82E1, + 0xD078: 0x82F2, + 0xD079: 0x82F5, + 0xD07A: 0x830C, + 0xD07B: 0x82FB, + 0xD07C: 0x82F6, + 0xD07D: 0x82F0, + 0xD07E: 0x82EA, + 0xD0A1: 0x82E4, + 0xD0A2: 0x82E0, + 0xD0A3: 0x82FA, + 0xD0A4: 0x82F3, + 0xD0A5: 0x82ED, + 0xD0A6: 0x8677, + 0xD0A7: 0x8674, + 0xD0A8: 0x867C, + 0xD0A9: 0x8673, + 0xD0AA: 0x8841, + 0xD0AB: 0x884E, + 0xD0AC: 0x8867, + 0xD0AD: 0x886A, + 0xD0AE: 0x8869, + 0xD0AF: 0x89D3, + 0xD0B0: 0x8A04, + 0xD0B1: 0x8A07, + 0xD0B2: 0x8D72, + 0xD0B3: 0x8FE3, + 0xD0B4: 0x8FE1, + 0xD0B5: 0x8FEE, + 0xD0B6: 0x8FE0, + 0xD0B7: 0x90F1, + 0xD0B8: 0x90BD, + 0xD0B9: 0x90BF, + 0xD0BA: 0x90D5, + 0xD0BB: 0x90C5, + 0xD0BC: 0x90BE, + 0xD0BD: 0x90C7, + 0xD0BE: 0x90CB, + 0xD0BF: 0x90C8, + 0xD0C0: 0x91D4, + 0xD0C1: 0x91D3, + 0xD0C2: 0x9654, + 0xD0C3: 0x964F, + 0xD0C4: 0x9651, + 0xD0C5: 0x9653, + 0xD0C6: 0x964A, + 0xD0C7: 0x964E, + 0xD0C8: 0x501E, + 0xD0C9: 0x5005, + 0xD0CA: 0x5007, + 0xD0CB: 0x5013, + 0xD0CC: 0x5022, + 0xD0CD: 0x5030, + 0xD0CE: 0x501B, + 0xD0CF: 0x4FF5, + 0xD0D0: 0x4FF4, + 0xD0D1: 0x5033, + 0xD0D2: 0x5037, + 0xD0D3: 0x502C, + 0xD0D4: 0x4FF6, + 0xD0D5: 0x4FF7, + 0xD0D6: 0x5017, + 0xD0D7: 0x501C, + 0xD0D8: 0x5020, + 0xD0D9: 0x5027, + 0xD0DA: 0x5035, + 0xD0DB: 0x502F, + 0xD0DC: 0x5031, + 0xD0DD: 0x500E, + 0xD0DE: 0x515A, + 0xD0DF: 0x5194, + 0xD0E0: 0x5193, + 0xD0E1: 0x51CA, + 0xD0E2: 0x51C4, + 0xD0E3: 0x51C5, + 0xD0E4: 0x51C8, + 0xD0E5: 0x51CE, + 0xD0E6: 0x5261, + 0xD0E7: 0x525A, + 0xD0E8: 0x5252, + 0xD0E9: 0x525E, + 0xD0EA: 0x525F, + 0xD0EB: 0x5255, + 0xD0EC: 0x5262, + 0xD0ED: 0x52CD, + 0xD0EE: 0x530E, + 0xD0EF: 0x539E, + 0xD0F0: 0x5526, + 0xD0F1: 0x54E2, + 0xD0F2: 0x5517, + 0xD0F3: 0x5512, + 0xD0F4: 0x54E7, + 0xD0F5: 0x54F3, + 0xD0F6: 0x54E4, + 0xD0F7: 0x551A, + 0xD0F8: 0x54FF, + 0xD0F9: 0x5504, + 0xD0FA: 0x5508, + 0xD0FB: 0x54EB, + 0xD0FC: 0x5511, + 0xD0FD: 0x5505, + 0xD0FE: 0x54F1, + 0xD140: 0x550A, + 0xD141: 0x54FB, + 0xD142: 0x54F7, + 0xD143: 0x54F8, + 0xD144: 0x54E0, + 0xD145: 0x550E, + 0xD146: 0x5503, + 0xD147: 0x550B, + 0xD148: 0x5701, + 0xD149: 0x5702, + 0xD14A: 0x57CC, + 0xD14B: 0x5832, + 0xD14C: 0x57D5, + 0xD14D: 0x57D2, + 0xD14E: 0x57BA, + 0xD14F: 0x57C6, + 0xD150: 0x57BD, + 0xD151: 0x57BC, + 0xD152: 0x57B8, + 0xD153: 0x57B6, + 0xD154: 0x57BF, + 0xD155: 0x57C7, + 0xD156: 0x57D0, + 0xD157: 0x57B9, + 0xD158: 0x57C1, + 0xD159: 0x590E, + 0xD15A: 0x594A, + 0xD15B: 0x5A19, + 0xD15C: 0x5A16, + 0xD15D: 0x5A2D, + 0xD15E: 0x5A2E, + 0xD15F: 0x5A15, + 0xD160: 0x5A0F, + 0xD161: 0x5A17, + 0xD162: 0x5A0A, + 0xD163: 0x5A1E, + 0xD164: 0x5A33, + 0xD165: 0x5B6C, + 0xD166: 0x5BA7, + 0xD167: 0x5BAD, + 0xD168: 0x5BAC, + 0xD169: 0x5C03, + 0xD16A: 0x5C56, + 0xD16B: 0x5C54, + 0xD16C: 0x5CEC, + 0xD16D: 0x5CFF, + 0xD16E: 0x5CEE, + 0xD16F: 0x5CF1, + 0xD170: 0x5CF7, + 0xD171: 0x5D00, + 0xD172: 0x5CF9, + 0xD173: 0x5E29, + 0xD174: 0x5E28, + 0xD175: 0x5EA8, + 0xD176: 0x5EAE, + 0xD177: 0x5EAA, + 0xD178: 0x5EAC, + 0xD179: 0x5F33, + 0xD17A: 0x5F30, + 0xD17B: 0x5F67, + 0xD17C: 0x605D, + 0xD17D: 0x605A, + 0xD17E: 0x6067, + 0xD1A1: 0x6041, + 0xD1A2: 0x60A2, + 0xD1A3: 0x6088, + 0xD1A4: 0x6080, + 0xD1A5: 0x6092, + 0xD1A6: 0x6081, + 0xD1A7: 0x609D, + 0xD1A8: 0x6083, + 0xD1A9: 0x6095, + 0xD1AA: 0x609B, + 0xD1AB: 0x6097, + 0xD1AC: 0x6087, + 0xD1AD: 0x609C, + 0xD1AE: 0x608E, + 0xD1AF: 0x6219, + 0xD1B0: 0x6246, + 0xD1B1: 0x62F2, + 0xD1B2: 0x6310, + 0xD1B3: 0x6356, + 0xD1B4: 0x632C, + 0xD1B5: 0x6344, + 0xD1B6: 0x6345, + 0xD1B7: 0x6336, + 0xD1B8: 0x6343, + 0xD1B9: 0x63E4, + 0xD1BA: 0x6339, + 0xD1BB: 0x634B, + 0xD1BC: 0x634A, + 0xD1BD: 0x633C, + 0xD1BE: 0x6329, + 0xD1BF: 0x6341, + 0xD1C0: 0x6334, + 0xD1C1: 0x6358, + 0xD1C2: 0x6354, + 0xD1C3: 0x6359, + 0xD1C4: 0x632D, + 0xD1C5: 0x6347, + 0xD1C6: 0x6333, + 0xD1C7: 0x635A, + 0xD1C8: 0x6351, + 0xD1C9: 0x6338, + 0xD1CA: 0x6357, + 0xD1CB: 0x6340, + 0xD1CC: 0x6348, + 0xD1CD: 0x654A, + 0xD1CE: 0x6546, + 0xD1CF: 0x65C6, + 0xD1D0: 0x65C3, + 0xD1D1: 0x65C4, + 0xD1D2: 0x65C2, + 0xD1D3: 0x664A, + 0xD1D4: 0x665F, + 0xD1D5: 0x6647, + 0xD1D6: 0x6651, + 0xD1D7: 0x6712, + 0xD1D8: 0x6713, + 0xD1D9: 0x681F, + 0xD1DA: 0x681A, + 0xD1DB: 0x6849, + 0xD1DC: 0x6832, + 0xD1DD: 0x6833, + 0xD1DE: 0x683B, + 0xD1DF: 0x684B, + 0xD1E0: 0x684F, + 0xD1E1: 0x6816, + 0xD1E2: 0x6831, + 0xD1E3: 0x681C, + 0xD1E4: 0x6835, + 0xD1E5: 0x682B, + 0xD1E6: 0x682D, + 0xD1E7: 0x682F, + 0xD1E8: 0x684E, + 0xD1E9: 0x6844, + 0xD1EA: 0x6834, + 0xD1EB: 0x681D, + 0xD1EC: 0x6812, + 0xD1ED: 0x6814, + 0xD1EE: 0x6826, + 0xD1EF: 0x6828, + 0xD1F0: 0x682E, + 0xD1F1: 0x684D, + 0xD1F2: 0x683A, + 0xD1F3: 0x6825, + 0xD1F4: 0x6820, + 0xD1F5: 0x6B2C, + 0xD1F6: 0x6B2F, + 0xD1F7: 0x6B2D, + 0xD1F8: 0x6B31, + 0xD1F9: 0x6B34, + 0xD1FA: 0x6B6D, + 0xD1FB: 0x8082, + 0xD1FC: 0x6B88, + 0xD1FD: 0x6BE6, + 0xD1FE: 0x6BE4, + 0xD240: 0x6BE8, + 0xD241: 0x6BE3, + 0xD242: 0x6BE2, + 0xD243: 0x6BE7, + 0xD244: 0x6C25, + 0xD245: 0x6D7A, + 0xD246: 0x6D63, + 0xD247: 0x6D64, + 0xD248: 0x6D76, + 0xD249: 0x6D0D, + 0xD24A: 0x6D61, + 0xD24B: 0x6D92, + 0xD24C: 0x6D58, + 0xD24D: 0x6D62, + 0xD24E: 0x6D6D, + 0xD24F: 0x6D6F, + 0xD250: 0x6D91, + 0xD251: 0x6D8D, + 0xD252: 0x6DEF, + 0xD253: 0x6D7F, + 0xD254: 0x6D86, + 0xD255: 0x6D5E, + 0xD256: 0x6D67, + 0xD257: 0x6D60, + 0xD258: 0x6D97, + 0xD259: 0x6D70, + 0xD25A: 0x6D7C, + 0xD25B: 0x6D5F, + 0xD25C: 0x6D82, + 0xD25D: 0x6D98, + 0xD25E: 0x6D2F, + 0xD25F: 0x6D68, + 0xD260: 0x6D8B, + 0xD261: 0x6D7E, + 0xD262: 0x6D80, + 0xD263: 0x6D84, + 0xD264: 0x6D16, + 0xD265: 0x6D83, + 0xD266: 0x6D7B, + 0xD267: 0x6D7D, + 0xD268: 0x6D75, + 0xD269: 0x6D90, + 0xD26A: 0x70DC, + 0xD26B: 0x70D3, + 0xD26C: 0x70D1, + 0xD26D: 0x70DD, + 0xD26E: 0x70CB, + 0xD26F: 0x7F39, + 0xD270: 0x70E2, + 0xD271: 0x70D7, + 0xD272: 0x70D2, + 0xD273: 0x70DE, + 0xD274: 0x70E0, + 0xD275: 0x70D4, + 0xD276: 0x70CD, + 0xD277: 0x70C5, + 0xD278: 0x70C6, + 0xD279: 0x70C7, + 0xD27A: 0x70DA, + 0xD27B: 0x70CE, + 0xD27C: 0x70E1, + 0xD27D: 0x7242, + 0xD27E: 0x7278, + 0xD2A1: 0x7277, + 0xD2A2: 0x7276, + 0xD2A3: 0x7300, + 0xD2A4: 0x72FA, + 0xD2A5: 0x72F4, + 0xD2A6: 0x72FE, + 0xD2A7: 0x72F6, + 0xD2A8: 0x72F3, + 0xD2A9: 0x72FB, + 0xD2AA: 0x7301, + 0xD2AB: 0x73D3, + 0xD2AC: 0x73D9, + 0xD2AD: 0x73E5, + 0xD2AE: 0x73D6, + 0xD2AF: 0x73BC, + 0xD2B0: 0x73E7, + 0xD2B1: 0x73E3, + 0xD2B2: 0x73E9, + 0xD2B3: 0x73DC, + 0xD2B4: 0x73D2, + 0xD2B5: 0x73DB, + 0xD2B6: 0x73D4, + 0xD2B7: 0x73DD, + 0xD2B8: 0x73DA, + 0xD2B9: 0x73D7, + 0xD2BA: 0x73D8, + 0xD2BB: 0x73E8, + 0xD2BC: 0x74DE, + 0xD2BD: 0x74DF, + 0xD2BE: 0x74F4, + 0xD2BF: 0x74F5, + 0xD2C0: 0x7521, + 0xD2C1: 0x755B, + 0xD2C2: 0x755F, + 0xD2C3: 0x75B0, + 0xD2C4: 0x75C1, + 0xD2C5: 0x75BB, + 0xD2C6: 0x75C4, + 0xD2C7: 0x75C0, + 0xD2C8: 0x75BF, + 0xD2C9: 0x75B6, + 0xD2CA: 0x75BA, + 0xD2CB: 0x768A, + 0xD2CC: 0x76C9, + 0xD2CD: 0x771D, + 0xD2CE: 0x771B, + 0xD2CF: 0x7710, + 0xD2D0: 0x7713, + 0xD2D1: 0x7712, + 0xD2D2: 0x7723, + 0xD2D3: 0x7711, + 0xD2D4: 0x7715, + 0xD2D5: 0x7719, + 0xD2D6: 0x771A, + 0xD2D7: 0x7722, + 0xD2D8: 0x7727, + 0xD2D9: 0x7823, + 0xD2DA: 0x782C, + 0xD2DB: 0x7822, + 0xD2DC: 0x7835, + 0xD2DD: 0x782F, + 0xD2DE: 0x7828, + 0xD2DF: 0x782E, + 0xD2E0: 0x782B, + 0xD2E1: 0x7821, + 0xD2E2: 0x7829, + 0xD2E3: 0x7833, + 0xD2E4: 0x782A, + 0xD2E5: 0x7831, + 0xD2E6: 0x7954, + 0xD2E7: 0x795B, + 0xD2E8: 0x794F, + 0xD2E9: 0x795C, + 0xD2EA: 0x7953, + 0xD2EB: 0x7952, + 0xD2EC: 0x7951, + 0xD2ED: 0x79EB, + 0xD2EE: 0x79EC, + 0xD2EF: 0x79E0, + 0xD2F0: 0x79EE, + 0xD2F1: 0x79ED, + 0xD2F2: 0x79EA, + 0xD2F3: 0x79DC, + 0xD2F4: 0x79DE, + 0xD2F5: 0x79DD, + 0xD2F6: 0x7A86, + 0xD2F7: 0x7A89, + 0xD2F8: 0x7A85, + 0xD2F9: 0x7A8B, + 0xD2FA: 0x7A8C, + 0xD2FB: 0x7A8A, + 0xD2FC: 0x7A87, + 0xD2FD: 0x7AD8, + 0xD2FE: 0x7B10, + 0xD340: 0x7B04, + 0xD341: 0x7B13, + 0xD342: 0x7B05, + 0xD343: 0x7B0F, + 0xD344: 0x7B08, + 0xD345: 0x7B0A, + 0xD346: 0x7B0E, + 0xD347: 0x7B09, + 0xD348: 0x7B12, + 0xD349: 0x7C84, + 0xD34A: 0x7C91, + 0xD34B: 0x7C8A, + 0xD34C: 0x7C8C, + 0xD34D: 0x7C88, + 0xD34E: 0x7C8D, + 0xD34F: 0x7C85, + 0xD350: 0x7D1E, + 0xD351: 0x7D1D, + 0xD352: 0x7D11, + 0xD353: 0x7D0E, + 0xD354: 0x7D18, + 0xD355: 0x7D16, + 0xD356: 0x7D13, + 0xD357: 0x7D1F, + 0xD358: 0x7D12, + 0xD359: 0x7D0F, + 0xD35A: 0x7D0C, + 0xD35B: 0x7F5C, + 0xD35C: 0x7F61, + 0xD35D: 0x7F5E, + 0xD35E: 0x7F60, + 0xD35F: 0x7F5D, + 0xD360: 0x7F5B, + 0xD361: 0x7F96, + 0xD362: 0x7F92, + 0xD363: 0x7FC3, + 0xD364: 0x7FC2, + 0xD365: 0x7FC0, + 0xD366: 0x8016, + 0xD367: 0x803E, + 0xD368: 0x8039, + 0xD369: 0x80FA, + 0xD36A: 0x80F2, + 0xD36B: 0x80F9, + 0xD36C: 0x80F5, + 0xD36D: 0x8101, + 0xD36E: 0x80FB, + 0xD36F: 0x8100, + 0xD370: 0x8201, + 0xD371: 0x822F, + 0xD372: 0x8225, + 0xD373: 0x8333, + 0xD374: 0x832D, + 0xD375: 0x8344, + 0xD376: 0x8319, + 0xD377: 0x8351, + 0xD378: 0x8325, + 0xD379: 0x8356, + 0xD37A: 0x833F, + 0xD37B: 0x8341, + 0xD37C: 0x8326, + 0xD37D: 0x831C, + 0xD37E: 0x8322, + 0xD3A1: 0x8342, + 0xD3A2: 0x834E, + 0xD3A3: 0x831B, + 0xD3A4: 0x832A, + 0xD3A5: 0x8308, + 0xD3A6: 0x833C, + 0xD3A7: 0x834D, + 0xD3A8: 0x8316, + 0xD3A9: 0x8324, + 0xD3AA: 0x8320, + 0xD3AB: 0x8337, + 0xD3AC: 0x832F, + 0xD3AD: 0x8329, + 0xD3AE: 0x8347, + 0xD3AF: 0x8345, + 0xD3B0: 0x834C, + 0xD3B1: 0x8353, + 0xD3B2: 0x831E, + 0xD3B3: 0x832C, + 0xD3B4: 0x834B, + 0xD3B5: 0x8327, + 0xD3B6: 0x8348, + 0xD3B7: 0x8653, + 0xD3B8: 0x8652, + 0xD3B9: 0x86A2, + 0xD3BA: 0x86A8, + 0xD3BB: 0x8696, + 0xD3BC: 0x868D, + 0xD3BD: 0x8691, + 0xD3BE: 0x869E, + 0xD3BF: 0x8687, + 0xD3C0: 0x8697, + 0xD3C1: 0x8686, + 0xD3C2: 0x868B, + 0xD3C3: 0x869A, + 0xD3C4: 0x8685, + 0xD3C5: 0x86A5, + 0xD3C6: 0x8699, + 0xD3C7: 0x86A1, + 0xD3C8: 0x86A7, + 0xD3C9: 0x8695, + 0xD3CA: 0x8698, + 0xD3CB: 0x868E, + 0xD3CC: 0x869D, + 0xD3CD: 0x8690, + 0xD3CE: 0x8694, + 0xD3CF: 0x8843, + 0xD3D0: 0x8844, + 0xD3D1: 0x886D, + 0xD3D2: 0x8875, + 0xD3D3: 0x8876, + 0xD3D4: 0x8872, + 0xD3D5: 0x8880, + 0xD3D6: 0x8871, + 0xD3D7: 0x887F, + 0xD3D8: 0x886F, + 0xD3D9: 0x8883, + 0xD3DA: 0x887E, + 0xD3DB: 0x8874, + 0xD3DC: 0x887C, + 0xD3DD: 0x8A12, + 0xD3DE: 0x8C47, + 0xD3DF: 0x8C57, + 0xD3E0: 0x8C7B, + 0xD3E1: 0x8CA4, + 0xD3E2: 0x8CA3, + 0xD3E3: 0x8D76, + 0xD3E4: 0x8D78, + 0xD3E5: 0x8DB5, + 0xD3E6: 0x8DB7, + 0xD3E7: 0x8DB6, + 0xD3E8: 0x8ED1, + 0xD3E9: 0x8ED3, + 0xD3EA: 0x8FFE, + 0xD3EB: 0x8FF5, + 0xD3EC: 0x9002, + 0xD3ED: 0x8FFF, + 0xD3EE: 0x8FFB, + 0xD3EF: 0x9004, + 0xD3F0: 0x8FFC, + 0xD3F1: 0x8FF6, + 0xD3F2: 0x90D6, + 0xD3F3: 0x90E0, + 0xD3F4: 0x90D9, + 0xD3F5: 0x90DA, + 0xD3F6: 0x90E3, + 0xD3F7: 0x90DF, + 0xD3F8: 0x90E5, + 0xD3F9: 0x90D8, + 0xD3FA: 0x90DB, + 0xD3FB: 0x90D7, + 0xD3FC: 0x90DC, + 0xD3FD: 0x90E4, + 0xD3FE: 0x9150, + 0xD440: 0x914E, + 0xD441: 0x914F, + 0xD442: 0x91D5, + 0xD443: 0x91E2, + 0xD444: 0x91DA, + 0xD445: 0x965C, + 0xD446: 0x965F, + 0xD447: 0x96BC, + 0xD448: 0x98E3, + 0xD449: 0x9ADF, + 0xD44A: 0x9B2F, + 0xD44B: 0x4E7F, + 0xD44C: 0x5070, + 0xD44D: 0x506A, + 0xD44E: 0x5061, + 0xD44F: 0x505E, + 0xD450: 0x5060, + 0xD451: 0x5053, + 0xD452: 0x504B, + 0xD453: 0x505D, + 0xD454: 0x5072, + 0xD455: 0x5048, + 0xD456: 0x504D, + 0xD457: 0x5041, + 0xD458: 0x505B, + 0xD459: 0x504A, + 0xD45A: 0x5062, + 0xD45B: 0x5015, + 0xD45C: 0x5045, + 0xD45D: 0x505F, + 0xD45E: 0x5069, + 0xD45F: 0x506B, + 0xD460: 0x5063, + 0xD461: 0x5064, + 0xD462: 0x5046, + 0xD463: 0x5040, + 0xD464: 0x506E, + 0xD465: 0x5073, + 0xD466: 0x5057, + 0xD467: 0x5051, + 0xD468: 0x51D0, + 0xD469: 0x526B, + 0xD46A: 0x526D, + 0xD46B: 0x526C, + 0xD46C: 0x526E, + 0xD46D: 0x52D6, + 0xD46E: 0x52D3, + 0xD46F: 0x532D, + 0xD470: 0x539C, + 0xD471: 0x5575, + 0xD472: 0x5576, + 0xD473: 0x553C, + 0xD474: 0x554D, + 0xD475: 0x5550, + 0xD476: 0x5534, + 0xD477: 0x552A, + 0xD478: 0x5551, + 0xD479: 0x5562, + 0xD47A: 0x5536, + 0xD47B: 0x5535, + 0xD47C: 0x5530, + 0xD47D: 0x5552, + 0xD47E: 0x5545, + 0xD4A1: 0x550C, + 0xD4A2: 0x5532, + 0xD4A3: 0x5565, + 0xD4A4: 0x554E, + 0xD4A5: 0x5539, + 0xD4A6: 0x5548, + 0xD4A7: 0x552D, + 0xD4A8: 0x553B, + 0xD4A9: 0x5540, + 0xD4AA: 0x554B, + 0xD4AB: 0x570A, + 0xD4AC: 0x5707, + 0xD4AD: 0x57FB, + 0xD4AE: 0x5814, + 0xD4AF: 0x57E2, + 0xD4B0: 0x57F6, + 0xD4B1: 0x57DC, + 0xD4B2: 0x57F4, + 0xD4B3: 0x5800, + 0xD4B4: 0x57ED, + 0xD4B5: 0x57FD, + 0xD4B6: 0x5808, + 0xD4B7: 0x57F8, + 0xD4B8: 0x580B, + 0xD4B9: 0x57F3, + 0xD4BA: 0x57CF, + 0xD4BB: 0x5807, + 0xD4BC: 0x57EE, + 0xD4BD: 0x57E3, + 0xD4BE: 0x57F2, + 0xD4BF: 0x57E5, + 0xD4C0: 0x57EC, + 0xD4C1: 0x57E1, + 0xD4C2: 0x580E, + 0xD4C3: 0x57FC, + 0xD4C4: 0x5810, + 0xD4C5: 0x57E7, + 0xD4C6: 0x5801, + 0xD4C7: 0x580C, + 0xD4C8: 0x57F1, + 0xD4C9: 0x57E9, + 0xD4CA: 0x57F0, + 0xD4CB: 0x580D, + 0xD4CC: 0x5804, + 0xD4CD: 0x595C, + 0xD4CE: 0x5A60, + 0xD4CF: 0x5A58, + 0xD4D0: 0x5A55, + 0xD4D1: 0x5A67, + 0xD4D2: 0x5A5E, + 0xD4D3: 0x5A38, + 0xD4D4: 0x5A35, + 0xD4D5: 0x5A6D, + 0xD4D6: 0x5A50, + 0xD4D7: 0x5A5F, + 0xD4D8: 0x5A65, + 0xD4D9: 0x5A6C, + 0xD4DA: 0x5A53, + 0xD4DB: 0x5A64, + 0xD4DC: 0x5A57, + 0xD4DD: 0x5A43, + 0xD4DE: 0x5A5D, + 0xD4DF: 0x5A52, + 0xD4E0: 0x5A44, + 0xD4E1: 0x5A5B, + 0xD4E2: 0x5A48, + 0xD4E3: 0x5A8E, + 0xD4E4: 0x5A3E, + 0xD4E5: 0x5A4D, + 0xD4E6: 0x5A39, + 0xD4E7: 0x5A4C, + 0xD4E8: 0x5A70, + 0xD4E9: 0x5A69, + 0xD4EA: 0x5A47, + 0xD4EB: 0x5A51, + 0xD4EC: 0x5A56, + 0xD4ED: 0x5A42, + 0xD4EE: 0x5A5C, + 0xD4EF: 0x5B72, + 0xD4F0: 0x5B6E, + 0xD4F1: 0x5BC1, + 0xD4F2: 0x5BC0, + 0xD4F3: 0x5C59, + 0xD4F4: 0x5D1E, + 0xD4F5: 0x5D0B, + 0xD4F6: 0x5D1D, + 0xD4F7: 0x5D1A, + 0xD4F8: 0x5D20, + 0xD4F9: 0x5D0C, + 0xD4FA: 0x5D28, + 0xD4FB: 0x5D0D, + 0xD4FC: 0x5D26, + 0xD4FD: 0x5D25, + 0xD4FE: 0x5D0F, + 0xD540: 0x5D30, + 0xD541: 0x5D12, + 0xD542: 0x5D23, + 0xD543: 0x5D1F, + 0xD544: 0x5D2E, + 0xD545: 0x5E3E, + 0xD546: 0x5E34, + 0xD547: 0x5EB1, + 0xD548: 0x5EB4, + 0xD549: 0x5EB9, + 0xD54A: 0x5EB2, + 0xD54B: 0x5EB3, + 0xD54C: 0x5F36, + 0xD54D: 0x5F38, + 0xD54E: 0x5F9B, + 0xD54F: 0x5F96, + 0xD550: 0x5F9F, + 0xD551: 0x608A, + 0xD552: 0x6090, + 0xD553: 0x6086, + 0xD554: 0x60BE, + 0xD555: 0x60B0, + 0xD556: 0x60BA, + 0xD557: 0x60D3, + 0xD558: 0x60D4, + 0xD559: 0x60CF, + 0xD55A: 0x60E4, + 0xD55B: 0x60D9, + 0xD55C: 0x60DD, + 0xD55D: 0x60C8, + 0xD55E: 0x60B1, + 0xD55F: 0x60DB, + 0xD560: 0x60B7, + 0xD561: 0x60CA, + 0xD562: 0x60BF, + 0xD563: 0x60C3, + 0xD564: 0x60CD, + 0xD565: 0x60C0, + 0xD566: 0x6332, + 0xD567: 0x6365, + 0xD568: 0x638A, + 0xD569: 0x6382, + 0xD56A: 0x637D, + 0xD56B: 0x63BD, + 0xD56C: 0x639E, + 0xD56D: 0x63AD, + 0xD56E: 0x639D, + 0xD56F: 0x6397, + 0xD570: 0x63AB, + 0xD571: 0x638E, + 0xD572: 0x636F, + 0xD573: 0x6387, + 0xD574: 0x6390, + 0xD575: 0x636E, + 0xD576: 0x63AF, + 0xD577: 0x6375, + 0xD578: 0x639C, + 0xD579: 0x636D, + 0xD57A: 0x63AE, + 0xD57B: 0x637C, + 0xD57C: 0x63A4, + 0xD57D: 0x633B, + 0xD57E: 0x639F, + 0xD5A1: 0x6378, + 0xD5A2: 0x6385, + 0xD5A3: 0x6381, + 0xD5A4: 0x6391, + 0xD5A5: 0x638D, + 0xD5A6: 0x6370, + 0xD5A7: 0x6553, + 0xD5A8: 0x65CD, + 0xD5A9: 0x6665, + 0xD5AA: 0x6661, + 0xD5AB: 0x665B, + 0xD5AC: 0x6659, + 0xD5AD: 0x665C, + 0xD5AE: 0x6662, + 0xD5AF: 0x6718, + 0xD5B0: 0x6879, + 0xD5B1: 0x6887, + 0xD5B2: 0x6890, + 0xD5B3: 0x689C, + 0xD5B4: 0x686D, + 0xD5B5: 0x686E, + 0xD5B6: 0x68AE, + 0xD5B7: 0x68AB, + 0xD5B8: 0x6956, + 0xD5B9: 0x686F, + 0xD5BA: 0x68A3, + 0xD5BB: 0x68AC, + 0xD5BC: 0x68A9, + 0xD5BD: 0x6875, + 0xD5BE: 0x6874, + 0xD5BF: 0x68B2, + 0xD5C0: 0x688F, + 0xD5C1: 0x6877, + 0xD5C2: 0x6892, + 0xD5C3: 0x687C, + 0xD5C4: 0x686B, + 0xD5C5: 0x6872, + 0xD5C6: 0x68AA, + 0xD5C7: 0x6880, + 0xD5C8: 0x6871, + 0xD5C9: 0x687E, + 0xD5CA: 0x689B, + 0xD5CB: 0x6896, + 0xD5CC: 0x688B, + 0xD5CD: 0x68A0, + 0xD5CE: 0x6889, + 0xD5CF: 0x68A4, + 0xD5D0: 0x6878, + 0xD5D1: 0x687B, + 0xD5D2: 0x6891, + 0xD5D3: 0x688C, + 0xD5D4: 0x688A, + 0xD5D5: 0x687D, + 0xD5D6: 0x6B36, + 0xD5D7: 0x6B33, + 0xD5D8: 0x6B37, + 0xD5D9: 0x6B38, + 0xD5DA: 0x6B91, + 0xD5DB: 0x6B8F, + 0xD5DC: 0x6B8D, + 0xD5DD: 0x6B8E, + 0xD5DE: 0x6B8C, + 0xD5DF: 0x6C2A, + 0xD5E0: 0x6DC0, + 0xD5E1: 0x6DAB, + 0xD5E2: 0x6DB4, + 0xD5E3: 0x6DB3, + 0xD5E4: 0x6E74, + 0xD5E5: 0x6DAC, + 0xD5E6: 0x6DE9, + 0xD5E7: 0x6DE2, + 0xD5E8: 0x6DB7, + 0xD5E9: 0x6DF6, + 0xD5EA: 0x6DD4, + 0xD5EB: 0x6E00, + 0xD5EC: 0x6DC8, + 0xD5ED: 0x6DE0, + 0xD5EE: 0x6DDF, + 0xD5EF: 0x6DD6, + 0xD5F0: 0x6DBE, + 0xD5F1: 0x6DE5, + 0xD5F2: 0x6DDC, + 0xD5F3: 0x6DDD, + 0xD5F4: 0x6DDB, + 0xD5F5: 0x6DF4, + 0xD5F6: 0x6DCA, + 0xD5F7: 0x6DBD, + 0xD5F8: 0x6DED, + 0xD5F9: 0x6DF0, + 0xD5FA: 0x6DBA, + 0xD5FB: 0x6DD5, + 0xD5FC: 0x6DC2, + 0xD5FD: 0x6DCF, + 0xD5FE: 0x6DC9, + 0xD640: 0x6DD0, + 0xD641: 0x6DF2, + 0xD642: 0x6DD3, + 0xD643: 0x6DFD, + 0xD644: 0x6DD7, + 0xD645: 0x6DCD, + 0xD646: 0x6DE3, + 0xD647: 0x6DBB, + 0xD648: 0x70FA, + 0xD649: 0x710D, + 0xD64A: 0x70F7, + 0xD64B: 0x7117, + 0xD64C: 0x70F4, + 0xD64D: 0x710C, + 0xD64E: 0x70F0, + 0xD64F: 0x7104, + 0xD650: 0x70F3, + 0xD651: 0x7110, + 0xD652: 0x70FC, + 0xD653: 0x70FF, + 0xD654: 0x7106, + 0xD655: 0x7113, + 0xD656: 0x7100, + 0xD657: 0x70F8, + 0xD658: 0x70F6, + 0xD659: 0x710B, + 0xD65A: 0x7102, + 0xD65B: 0x710E, + 0xD65C: 0x727E, + 0xD65D: 0x727B, + 0xD65E: 0x727C, + 0xD65F: 0x727F, + 0xD660: 0x731D, + 0xD661: 0x7317, + 0xD662: 0x7307, + 0xD663: 0x7311, + 0xD664: 0x7318, + 0xD665: 0x730A, + 0xD666: 0x7308, + 0xD667: 0x72FF, + 0xD668: 0x730F, + 0xD669: 0x731E, + 0xD66A: 0x7388, + 0xD66B: 0x73F6, + 0xD66C: 0x73F8, + 0xD66D: 0x73F5, + 0xD66E: 0x7404, + 0xD66F: 0x7401, + 0xD670: 0x73FD, + 0xD671: 0x7407, + 0xD672: 0x7400, + 0xD673: 0x73FA, + 0xD674: 0x73FC, + 0xD675: 0x73FF, + 0xD676: 0x740C, + 0xD677: 0x740B, + 0xD678: 0x73F4, + 0xD679: 0x7408, + 0xD67A: 0x7564, + 0xD67B: 0x7563, + 0xD67C: 0x75CE, + 0xD67D: 0x75D2, + 0xD67E: 0x75CF, + 0xD6A1: 0x75CB, + 0xD6A2: 0x75CC, + 0xD6A3: 0x75D1, + 0xD6A4: 0x75D0, + 0xD6A5: 0x768F, + 0xD6A6: 0x7689, + 0xD6A7: 0x76D3, + 0xD6A8: 0x7739, + 0xD6A9: 0x772F, + 0xD6AA: 0x772D, + 0xD6AB: 0x7731, + 0xD6AC: 0x7732, + 0xD6AD: 0x7734, + 0xD6AE: 0x7733, + 0xD6AF: 0x773D, + 0xD6B0: 0x7725, + 0xD6B1: 0x773B, + 0xD6B2: 0x7735, + 0xD6B3: 0x7848, + 0xD6B4: 0x7852, + 0xD6B5: 0x7849, + 0xD6B6: 0x784D, + 0xD6B7: 0x784A, + 0xD6B8: 0x784C, + 0xD6B9: 0x7826, + 0xD6BA: 0x7845, + 0xD6BB: 0x7850, + 0xD6BC: 0x7964, + 0xD6BD: 0x7967, + 0xD6BE: 0x7969, + 0xD6BF: 0x796A, + 0xD6C0: 0x7963, + 0xD6C1: 0x796B, + 0xD6C2: 0x7961, + 0xD6C3: 0x79BB, + 0xD6C4: 0x79FA, + 0xD6C5: 0x79F8, + 0xD6C6: 0x79F6, + 0xD6C7: 0x79F7, + 0xD6C8: 0x7A8F, + 0xD6C9: 0x7A94, + 0xD6CA: 0x7A90, + 0xD6CB: 0x7B35, + 0xD6CC: 0x7B47, + 0xD6CD: 0x7B34, + 0xD6CE: 0x7B25, + 0xD6CF: 0x7B30, + 0xD6D0: 0x7B22, + 0xD6D1: 0x7B24, + 0xD6D2: 0x7B33, + 0xD6D3: 0x7B18, + 0xD6D4: 0x7B2A, + 0xD6D5: 0x7B1D, + 0xD6D6: 0x7B31, + 0xD6D7: 0x7B2B, + 0xD6D8: 0x7B2D, + 0xD6D9: 0x7B2F, + 0xD6DA: 0x7B32, + 0xD6DB: 0x7B38, + 0xD6DC: 0x7B1A, + 0xD6DD: 0x7B23, + 0xD6DE: 0x7C94, + 0xD6DF: 0x7C98, + 0xD6E0: 0x7C96, + 0xD6E1: 0x7CA3, + 0xD6E2: 0x7D35, + 0xD6E3: 0x7D3D, + 0xD6E4: 0x7D38, + 0xD6E5: 0x7D36, + 0xD6E6: 0x7D3A, + 0xD6E7: 0x7D45, + 0xD6E8: 0x7D2C, + 0xD6E9: 0x7D29, + 0xD6EA: 0x7D41, + 0xD6EB: 0x7D47, + 0xD6EC: 0x7D3E, + 0xD6ED: 0x7D3F, + 0xD6EE: 0x7D4A, + 0xD6EF: 0x7D3B, + 0xD6F0: 0x7D28, + 0xD6F1: 0x7F63, + 0xD6F2: 0x7F95, + 0xD6F3: 0x7F9C, + 0xD6F4: 0x7F9D, + 0xD6F5: 0x7F9B, + 0xD6F6: 0x7FCA, + 0xD6F7: 0x7FCB, + 0xD6F8: 0x7FCD, + 0xD6F9: 0x7FD0, + 0xD6FA: 0x7FD1, + 0xD6FB: 0x7FC7, + 0xD6FC: 0x7FCF, + 0xD6FD: 0x7FC9, + 0xD6FE: 0x801F, + 0xD740: 0x801E, + 0xD741: 0x801B, + 0xD742: 0x8047, + 0xD743: 0x8043, + 0xD744: 0x8048, + 0xD745: 0x8118, + 0xD746: 0x8125, + 0xD747: 0x8119, + 0xD748: 0x811B, + 0xD749: 0x812D, + 0xD74A: 0x811F, + 0xD74B: 0x812C, + 0xD74C: 0x811E, + 0xD74D: 0x8121, + 0xD74E: 0x8115, + 0xD74F: 0x8127, + 0xD750: 0x811D, + 0xD751: 0x8122, + 0xD752: 0x8211, + 0xD753: 0x8238, + 0xD754: 0x8233, + 0xD755: 0x823A, + 0xD756: 0x8234, + 0xD757: 0x8232, + 0xD758: 0x8274, + 0xD759: 0x8390, + 0xD75A: 0x83A3, + 0xD75B: 0x83A8, + 0xD75C: 0x838D, + 0xD75D: 0x837A, + 0xD75E: 0x8373, + 0xD75F: 0x83A4, + 0xD760: 0x8374, + 0xD761: 0x838F, + 0xD762: 0x8381, + 0xD763: 0x8395, + 0xD764: 0x8399, + 0xD765: 0x8375, + 0xD766: 0x8394, + 0xD767: 0x83A9, + 0xD768: 0x837D, + 0xD769: 0x8383, + 0xD76A: 0x838C, + 0xD76B: 0x839D, + 0xD76C: 0x839B, + 0xD76D: 0x83AA, + 0xD76E: 0x838B, + 0xD76F: 0x837E, + 0xD770: 0x83A5, + 0xD771: 0x83AF, + 0xD772: 0x8388, + 0xD773: 0x8397, + 0xD774: 0x83B0, + 0xD775: 0x837F, + 0xD776: 0x83A6, + 0xD777: 0x8387, + 0xD778: 0x83AE, + 0xD779: 0x8376, + 0xD77A: 0x839A, + 0xD77B: 0x8659, + 0xD77C: 0x8656, + 0xD77D: 0x86BF, + 0xD77E: 0x86B7, + 0xD7A1: 0x86C2, + 0xD7A2: 0x86C1, + 0xD7A3: 0x86C5, + 0xD7A4: 0x86BA, + 0xD7A5: 0x86B0, + 0xD7A6: 0x86C8, + 0xD7A7: 0x86B9, + 0xD7A8: 0x86B3, + 0xD7A9: 0x86B8, + 0xD7AA: 0x86CC, + 0xD7AB: 0x86B4, + 0xD7AC: 0x86BB, + 0xD7AD: 0x86BC, + 0xD7AE: 0x86C3, + 0xD7AF: 0x86BD, + 0xD7B0: 0x86BE, + 0xD7B1: 0x8852, + 0xD7B2: 0x8889, + 0xD7B3: 0x8895, + 0xD7B4: 0x88A8, + 0xD7B5: 0x88A2, + 0xD7B6: 0x88AA, + 0xD7B7: 0x889A, + 0xD7B8: 0x8891, + 0xD7B9: 0x88A1, + 0xD7BA: 0x889F, + 0xD7BB: 0x8898, + 0xD7BC: 0x88A7, + 0xD7BD: 0x8899, + 0xD7BE: 0x889B, + 0xD7BF: 0x8897, + 0xD7C0: 0x88A4, + 0xD7C1: 0x88AC, + 0xD7C2: 0x888C, + 0xD7C3: 0x8893, + 0xD7C4: 0x888E, + 0xD7C5: 0x8982, + 0xD7C6: 0x89D6, + 0xD7C7: 0x89D9, + 0xD7C8: 0x89D5, + 0xD7C9: 0x8A30, + 0xD7CA: 0x8A27, + 0xD7CB: 0x8A2C, + 0xD7CC: 0x8A1E, + 0xD7CD: 0x8C39, + 0xD7CE: 0x8C3B, + 0xD7CF: 0x8C5C, + 0xD7D0: 0x8C5D, + 0xD7D1: 0x8C7D, + 0xD7D2: 0x8CA5, + 0xD7D3: 0x8D7D, + 0xD7D4: 0x8D7B, + 0xD7D5: 0x8D79, + 0xD7D6: 0x8DBC, + 0xD7D7: 0x8DC2, + 0xD7D8: 0x8DB9, + 0xD7D9: 0x8DBF, + 0xD7DA: 0x8DC1, + 0xD7DB: 0x8ED8, + 0xD7DC: 0x8EDE, + 0xD7DD: 0x8EDD, + 0xD7DE: 0x8EDC, + 0xD7DF: 0x8ED7, + 0xD7E0: 0x8EE0, + 0xD7E1: 0x8EE1, + 0xD7E2: 0x9024, + 0xD7E3: 0x900B, + 0xD7E4: 0x9011, + 0xD7E5: 0x901C, + 0xD7E6: 0x900C, + 0xD7E7: 0x9021, + 0xD7E8: 0x90EF, + 0xD7E9: 0x90EA, + 0xD7EA: 0x90F0, + 0xD7EB: 0x90F4, + 0xD7EC: 0x90F2, + 0xD7ED: 0x90F3, + 0xD7EE: 0x90D4, + 0xD7EF: 0x90EB, + 0xD7F0: 0x90EC, + 0xD7F1: 0x90E9, + 0xD7F2: 0x9156, + 0xD7F3: 0x9158, + 0xD7F4: 0x915A, + 0xD7F5: 0x9153, + 0xD7F6: 0x9155, + 0xD7F7: 0x91EC, + 0xD7F8: 0x91F4, + 0xD7F9: 0x91F1, + 0xD7FA: 0x91F3, + 0xD7FB: 0x91F8, + 0xD7FC: 0x91E4, + 0xD7FD: 0x91F9, + 0xD7FE: 0x91EA, + 0xD840: 0x91EB, + 0xD841: 0x91F7, + 0xD842: 0x91E8, + 0xD843: 0x91EE, + 0xD844: 0x957A, + 0xD845: 0x9586, + 0xD846: 0x9588, + 0xD847: 0x967C, + 0xD848: 0x966D, + 0xD849: 0x966B, + 0xD84A: 0x9671, + 0xD84B: 0x966F, + 0xD84C: 0x96BF, + 0xD84D: 0x976A, + 0xD84E: 0x9804, + 0xD84F: 0x98E5, + 0xD850: 0x9997, + 0xD851: 0x509B, + 0xD852: 0x5095, + 0xD853: 0x5094, + 0xD854: 0x509E, + 0xD855: 0x508B, + 0xD856: 0x50A3, + 0xD857: 0x5083, + 0xD858: 0x508C, + 0xD859: 0x508E, + 0xD85A: 0x509D, + 0xD85B: 0x5068, + 0xD85C: 0x509C, + 0xD85D: 0x5092, + 0xD85E: 0x5082, + 0xD85F: 0x5087, + 0xD860: 0x515F, + 0xD861: 0x51D4, + 0xD862: 0x5312, + 0xD863: 0x5311, + 0xD864: 0x53A4, + 0xD865: 0x53A7, + 0xD866: 0x5591, + 0xD867: 0x55A8, + 0xD868: 0x55A5, + 0xD869: 0x55AD, + 0xD86A: 0x5577, + 0xD86B: 0x5645, + 0xD86C: 0x55A2, + 0xD86D: 0x5593, + 0xD86E: 0x5588, + 0xD86F: 0x558F, + 0xD870: 0x55B5, + 0xD871: 0x5581, + 0xD872: 0x55A3, + 0xD873: 0x5592, + 0xD874: 0x55A4, + 0xD875: 0x557D, + 0xD876: 0x558C, + 0xD877: 0x55A6, + 0xD878: 0x557F, + 0xD879: 0x5595, + 0xD87A: 0x55A1, + 0xD87B: 0x558E, + 0xD87C: 0x570C, + 0xD87D: 0x5829, + 0xD87E: 0x5837, + 0xD8A1: 0x5819, + 0xD8A2: 0x581E, + 0xD8A3: 0x5827, + 0xD8A4: 0x5823, + 0xD8A5: 0x5828, + 0xD8A6: 0x57F5, + 0xD8A7: 0x5848, + 0xD8A8: 0x5825, + 0xD8A9: 0x581C, + 0xD8AA: 0x581B, + 0xD8AB: 0x5833, + 0xD8AC: 0x583F, + 0xD8AD: 0x5836, + 0xD8AE: 0x582E, + 0xD8AF: 0x5839, + 0xD8B0: 0x5838, + 0xD8B1: 0x582D, + 0xD8B2: 0x582C, + 0xD8B3: 0x583B, + 0xD8B4: 0x5961, + 0xD8B5: 0x5AAF, + 0xD8B6: 0x5A94, + 0xD8B7: 0x5A9F, + 0xD8B8: 0x5A7A, + 0xD8B9: 0x5AA2, + 0xD8BA: 0x5A9E, + 0xD8BB: 0x5A78, + 0xD8BC: 0x5AA6, + 0xD8BD: 0x5A7C, + 0xD8BE: 0x5AA5, + 0xD8BF: 0x5AAC, + 0xD8C0: 0x5A95, + 0xD8C1: 0x5AAE, + 0xD8C2: 0x5A37, + 0xD8C3: 0x5A84, + 0xD8C4: 0x5A8A, + 0xD8C5: 0x5A97, + 0xD8C6: 0x5A83, + 0xD8C7: 0x5A8B, + 0xD8C8: 0x5AA9, + 0xD8C9: 0x5A7B, + 0xD8CA: 0x5A7D, + 0xD8CB: 0x5A8C, + 0xD8CC: 0x5A9C, + 0xD8CD: 0x5A8F, + 0xD8CE: 0x5A93, + 0xD8CF: 0x5A9D, + 0xD8D0: 0x5BEA, + 0xD8D1: 0x5BCD, + 0xD8D2: 0x5BCB, + 0xD8D3: 0x5BD4, + 0xD8D4: 0x5BD1, + 0xD8D5: 0x5BCA, + 0xD8D6: 0x5BCE, + 0xD8D7: 0x5C0C, + 0xD8D8: 0x5C30, + 0xD8D9: 0x5D37, + 0xD8DA: 0x5D43, + 0xD8DB: 0x5D6B, + 0xD8DC: 0x5D41, + 0xD8DD: 0x5D4B, + 0xD8DE: 0x5D3F, + 0xD8DF: 0x5D35, + 0xD8E0: 0x5D51, + 0xD8E1: 0x5D4E, + 0xD8E2: 0x5D55, + 0xD8E3: 0x5D33, + 0xD8E4: 0x5D3A, + 0xD8E5: 0x5D52, + 0xD8E6: 0x5D3D, + 0xD8E7: 0x5D31, + 0xD8E8: 0x5D59, + 0xD8E9: 0x5D42, + 0xD8EA: 0x5D39, + 0xD8EB: 0x5D49, + 0xD8EC: 0x5D38, + 0xD8ED: 0x5D3C, + 0xD8EE: 0x5D32, + 0xD8EF: 0x5D36, + 0xD8F0: 0x5D40, + 0xD8F1: 0x5D45, + 0xD8F2: 0x5E44, + 0xD8F3: 0x5E41, + 0xD8F4: 0x5F58, + 0xD8F5: 0x5FA6, + 0xD8F6: 0x5FA5, + 0xD8F7: 0x5FAB, + 0xD8F8: 0x60C9, + 0xD8F9: 0x60B9, + 0xD8FA: 0x60CC, + 0xD8FB: 0x60E2, + 0xD8FC: 0x60CE, + 0xD8FD: 0x60C4, + 0xD8FE: 0x6114, + 0xD940: 0x60F2, + 0xD941: 0x610A, + 0xD942: 0x6116, + 0xD943: 0x6105, + 0xD944: 0x60F5, + 0xD945: 0x6113, + 0xD946: 0x60F8, + 0xD947: 0x60FC, + 0xD948: 0x60FE, + 0xD949: 0x60C1, + 0xD94A: 0x6103, + 0xD94B: 0x6118, + 0xD94C: 0x611D, + 0xD94D: 0x6110, + 0xD94E: 0x60FF, + 0xD94F: 0x6104, + 0xD950: 0x610B, + 0xD951: 0x624A, + 0xD952: 0x6394, + 0xD953: 0x63B1, + 0xD954: 0x63B0, + 0xD955: 0x63CE, + 0xD956: 0x63E5, + 0xD957: 0x63E8, + 0xD958: 0x63EF, + 0xD959: 0x63C3, + 0xD95A: 0x649D, + 0xD95B: 0x63F3, + 0xD95C: 0x63CA, + 0xD95D: 0x63E0, + 0xD95E: 0x63F6, + 0xD95F: 0x63D5, + 0xD960: 0x63F2, + 0xD961: 0x63F5, + 0xD962: 0x6461, + 0xD963: 0x63DF, + 0xD964: 0x63BE, + 0xD965: 0x63DD, + 0xD966: 0x63DC, + 0xD967: 0x63C4, + 0xD968: 0x63D8, + 0xD969: 0x63D3, + 0xD96A: 0x63C2, + 0xD96B: 0x63C7, + 0xD96C: 0x63CC, + 0xD96D: 0x63CB, + 0xD96E: 0x63C8, + 0xD96F: 0x63F0, + 0xD970: 0x63D7, + 0xD971: 0x63D9, + 0xD972: 0x6532, + 0xD973: 0x6567, + 0xD974: 0x656A, + 0xD975: 0x6564, + 0xD976: 0x655C, + 0xD977: 0x6568, + 0xD978: 0x6565, + 0xD979: 0x658C, + 0xD97A: 0x659D, + 0xD97B: 0x659E, + 0xD97C: 0x65AE, + 0xD97D: 0x65D0, + 0xD97E: 0x65D2, + 0xD9A1: 0x667C, + 0xD9A2: 0x666C, + 0xD9A3: 0x667B, + 0xD9A4: 0x6680, + 0xD9A5: 0x6671, + 0xD9A6: 0x6679, + 0xD9A7: 0x666A, + 0xD9A8: 0x6672, + 0xD9A9: 0x6701, + 0xD9AA: 0x690C, + 0xD9AB: 0x68D3, + 0xD9AC: 0x6904, + 0xD9AD: 0x68DC, + 0xD9AE: 0x692A, + 0xD9AF: 0x68EC, + 0xD9B0: 0x68EA, + 0xD9B1: 0x68F1, + 0xD9B2: 0x690F, + 0xD9B3: 0x68D6, + 0xD9B4: 0x68F7, + 0xD9B5: 0x68EB, + 0xD9B6: 0x68E4, + 0xD9B7: 0x68F6, + 0xD9B8: 0x6913, + 0xD9B9: 0x6910, + 0xD9BA: 0x68F3, + 0xD9BB: 0x68E1, + 0xD9BC: 0x6907, + 0xD9BD: 0x68CC, + 0xD9BE: 0x6908, + 0xD9BF: 0x6970, + 0xD9C0: 0x68B4, + 0xD9C1: 0x6911, + 0xD9C2: 0x68EF, + 0xD9C3: 0x68C6, + 0xD9C4: 0x6914, + 0xD9C5: 0x68F8, + 0xD9C6: 0x68D0, + 0xD9C7: 0x68FD, + 0xD9C8: 0x68FC, + 0xD9C9: 0x68E8, + 0xD9CA: 0x690B, + 0xD9CB: 0x690A, + 0xD9CC: 0x6917, + 0xD9CD: 0x68CE, + 0xD9CE: 0x68C8, + 0xD9CF: 0x68DD, + 0xD9D0: 0x68DE, + 0xD9D1: 0x68E6, + 0xD9D2: 0x68F4, + 0xD9D3: 0x68D1, + 0xD9D4: 0x6906, + 0xD9D5: 0x68D4, + 0xD9D6: 0x68E9, + 0xD9D7: 0x6915, + 0xD9D8: 0x6925, + 0xD9D9: 0x68C7, + 0xD9DA: 0x6B39, + 0xD9DB: 0x6B3B, + 0xD9DC: 0x6B3F, + 0xD9DD: 0x6B3C, + 0xD9DE: 0x6B94, + 0xD9DF: 0x6B97, + 0xD9E0: 0x6B99, + 0xD9E1: 0x6B95, + 0xD9E2: 0x6BBD, + 0xD9E3: 0x6BF0, + 0xD9E4: 0x6BF2, + 0xD9E5: 0x6BF3, + 0xD9E6: 0x6C30, + 0xD9E7: 0x6DFC, + 0xD9E8: 0x6E46, + 0xD9E9: 0x6E47, + 0xD9EA: 0x6E1F, + 0xD9EB: 0x6E49, + 0xD9EC: 0x6E88, + 0xD9ED: 0x6E3C, + 0xD9EE: 0x6E3D, + 0xD9EF: 0x6E45, + 0xD9F0: 0x6E62, + 0xD9F1: 0x6E2B, + 0xD9F2: 0x6E3F, + 0xD9F3: 0x6E41, + 0xD9F4: 0x6E5D, + 0xD9F5: 0x6E73, + 0xD9F6: 0x6E1C, + 0xD9F7: 0x6E33, + 0xD9F8: 0x6E4B, + 0xD9F9: 0x6E40, + 0xD9FA: 0x6E51, + 0xD9FB: 0x6E3B, + 0xD9FC: 0x6E03, + 0xD9FD: 0x6E2E, + 0xD9FE: 0x6E5E, + 0xDA40: 0x6E68, + 0xDA41: 0x6E5C, + 0xDA42: 0x6E61, + 0xDA43: 0x6E31, + 0xDA44: 0x6E28, + 0xDA45: 0x6E60, + 0xDA46: 0x6E71, + 0xDA47: 0x6E6B, + 0xDA48: 0x6E39, + 0xDA49: 0x6E22, + 0xDA4A: 0x6E30, + 0xDA4B: 0x6E53, + 0xDA4C: 0x6E65, + 0xDA4D: 0x6E27, + 0xDA4E: 0x6E78, + 0xDA4F: 0x6E64, + 0xDA50: 0x6E77, + 0xDA51: 0x6E55, + 0xDA52: 0x6E79, + 0xDA53: 0x6E52, + 0xDA54: 0x6E66, + 0xDA55: 0x6E35, + 0xDA56: 0x6E36, + 0xDA57: 0x6E5A, + 0xDA58: 0x7120, + 0xDA59: 0x711E, + 0xDA5A: 0x712F, + 0xDA5B: 0x70FB, + 0xDA5C: 0x712E, + 0xDA5D: 0x7131, + 0xDA5E: 0x7123, + 0xDA5F: 0x7125, + 0xDA60: 0x7122, + 0xDA61: 0x7132, + 0xDA62: 0x711F, + 0xDA63: 0x7128, + 0xDA64: 0x713A, + 0xDA65: 0x711B, + 0xDA66: 0x724B, + 0xDA67: 0x725A, + 0xDA68: 0x7288, + 0xDA69: 0x7289, + 0xDA6A: 0x7286, + 0xDA6B: 0x7285, + 0xDA6C: 0x728B, + 0xDA6D: 0x7312, + 0xDA6E: 0x730B, + 0xDA6F: 0x7330, + 0xDA70: 0x7322, + 0xDA71: 0x7331, + 0xDA72: 0x7333, + 0xDA73: 0x7327, + 0xDA74: 0x7332, + 0xDA75: 0x732D, + 0xDA76: 0x7326, + 0xDA77: 0x7323, + 0xDA78: 0x7335, + 0xDA79: 0x730C, + 0xDA7A: 0x742E, + 0xDA7B: 0x742C, + 0xDA7C: 0x7430, + 0xDA7D: 0x742B, + 0xDA7E: 0x7416, + 0xDAA1: 0x741A, + 0xDAA2: 0x7421, + 0xDAA3: 0x742D, + 0xDAA4: 0x7431, + 0xDAA5: 0x7424, + 0xDAA6: 0x7423, + 0xDAA7: 0x741D, + 0xDAA8: 0x7429, + 0xDAA9: 0x7420, + 0xDAAA: 0x7432, + 0xDAAB: 0x74FB, + 0xDAAC: 0x752F, + 0xDAAD: 0x756F, + 0xDAAE: 0x756C, + 0xDAAF: 0x75E7, + 0xDAB0: 0x75DA, + 0xDAB1: 0x75E1, + 0xDAB2: 0x75E6, + 0xDAB3: 0x75DD, + 0xDAB4: 0x75DF, + 0xDAB5: 0x75E4, + 0xDAB6: 0x75D7, + 0xDAB7: 0x7695, + 0xDAB8: 0x7692, + 0xDAB9: 0x76DA, + 0xDABA: 0x7746, + 0xDABB: 0x7747, + 0xDABC: 0x7744, + 0xDABD: 0x774D, + 0xDABE: 0x7745, + 0xDABF: 0x774A, + 0xDAC0: 0x774E, + 0xDAC1: 0x774B, + 0xDAC2: 0x774C, + 0xDAC3: 0x77DE, + 0xDAC4: 0x77EC, + 0xDAC5: 0x7860, + 0xDAC6: 0x7864, + 0xDAC7: 0x7865, + 0xDAC8: 0x785C, + 0xDAC9: 0x786D, + 0xDACA: 0x7871, + 0xDACB: 0x786A, + 0xDACC: 0x786E, + 0xDACD: 0x7870, + 0xDACE: 0x7869, + 0xDACF: 0x7868, + 0xDAD0: 0x785E, + 0xDAD1: 0x7862, + 0xDAD2: 0x7974, + 0xDAD3: 0x7973, + 0xDAD4: 0x7972, + 0xDAD5: 0x7970, + 0xDAD6: 0x7A02, + 0xDAD7: 0x7A0A, + 0xDAD8: 0x7A03, + 0xDAD9: 0x7A0C, + 0xDADA: 0x7A04, + 0xDADB: 0x7A99, + 0xDADC: 0x7AE6, + 0xDADD: 0x7AE4, + 0xDADE: 0x7B4A, + 0xDADF: 0x7B3B, + 0xDAE0: 0x7B44, + 0xDAE1: 0x7B48, + 0xDAE2: 0x7B4C, + 0xDAE3: 0x7B4E, + 0xDAE4: 0x7B40, + 0xDAE5: 0x7B58, + 0xDAE6: 0x7B45, + 0xDAE7: 0x7CA2, + 0xDAE8: 0x7C9E, + 0xDAE9: 0x7CA8, + 0xDAEA: 0x7CA1, + 0xDAEB: 0x7D58, + 0xDAEC: 0x7D6F, + 0xDAED: 0x7D63, + 0xDAEE: 0x7D53, + 0xDAEF: 0x7D56, + 0xDAF0: 0x7D67, + 0xDAF1: 0x7D6A, + 0xDAF2: 0x7D4F, + 0xDAF3: 0x7D6D, + 0xDAF4: 0x7D5C, + 0xDAF5: 0x7D6B, + 0xDAF6: 0x7D52, + 0xDAF7: 0x7D54, + 0xDAF8: 0x7D69, + 0xDAF9: 0x7D51, + 0xDAFA: 0x7D5F, + 0xDAFB: 0x7D4E, + 0xDAFC: 0x7F3E, + 0xDAFD: 0x7F3F, + 0xDAFE: 0x7F65, + 0xDB40: 0x7F66, + 0xDB41: 0x7FA2, + 0xDB42: 0x7FA0, + 0xDB43: 0x7FA1, + 0xDB44: 0x7FD7, + 0xDB45: 0x8051, + 0xDB46: 0x804F, + 0xDB47: 0x8050, + 0xDB48: 0x80FE, + 0xDB49: 0x80D4, + 0xDB4A: 0x8143, + 0xDB4B: 0x814A, + 0xDB4C: 0x8152, + 0xDB4D: 0x814F, + 0xDB4E: 0x8147, + 0xDB4F: 0x813D, + 0xDB50: 0x814D, + 0xDB51: 0x813A, + 0xDB52: 0x81E6, + 0xDB53: 0x81EE, + 0xDB54: 0x81F7, + 0xDB55: 0x81F8, + 0xDB56: 0x81F9, + 0xDB57: 0x8204, + 0xDB58: 0x823C, + 0xDB59: 0x823D, + 0xDB5A: 0x823F, + 0xDB5B: 0x8275, + 0xDB5C: 0x833B, + 0xDB5D: 0x83CF, + 0xDB5E: 0x83F9, + 0xDB5F: 0x8423, + 0xDB60: 0x83C0, + 0xDB61: 0x83E8, + 0xDB62: 0x8412, + 0xDB63: 0x83E7, + 0xDB64: 0x83E4, + 0xDB65: 0x83FC, + 0xDB66: 0x83F6, + 0xDB67: 0x8410, + 0xDB68: 0x83C6, + 0xDB69: 0x83C8, + 0xDB6A: 0x83EB, + 0xDB6B: 0x83E3, + 0xDB6C: 0x83BF, + 0xDB6D: 0x8401, + 0xDB6E: 0x83DD, + 0xDB6F: 0x83E5, + 0xDB70: 0x83D8, + 0xDB71: 0x83FF, + 0xDB72: 0x83E1, + 0xDB73: 0x83CB, + 0xDB74: 0x83CE, + 0xDB75: 0x83D6, + 0xDB76: 0x83F5, + 0xDB77: 0x83C9, + 0xDB78: 0x8409, + 0xDB79: 0x840F, + 0xDB7A: 0x83DE, + 0xDB7B: 0x8411, + 0xDB7C: 0x8406, + 0xDB7D: 0x83C2, + 0xDB7E: 0x83F3, + 0xDBA1: 0x83D5, + 0xDBA2: 0x83FA, + 0xDBA3: 0x83C7, + 0xDBA4: 0x83D1, + 0xDBA5: 0x83EA, + 0xDBA6: 0x8413, + 0xDBA7: 0x83C3, + 0xDBA8: 0x83EC, + 0xDBA9: 0x83EE, + 0xDBAA: 0x83C4, + 0xDBAB: 0x83FB, + 0xDBAC: 0x83D7, + 0xDBAD: 0x83E2, + 0xDBAE: 0x841B, + 0xDBAF: 0x83DB, + 0xDBB0: 0x83FE, + 0xDBB1: 0x86D8, + 0xDBB2: 0x86E2, + 0xDBB3: 0x86E6, + 0xDBB4: 0x86D3, + 0xDBB5: 0x86E3, + 0xDBB6: 0x86DA, + 0xDBB7: 0x86EA, + 0xDBB8: 0x86DD, + 0xDBB9: 0x86EB, + 0xDBBA: 0x86DC, + 0xDBBB: 0x86EC, + 0xDBBC: 0x86E9, + 0xDBBD: 0x86D7, + 0xDBBE: 0x86E8, + 0xDBBF: 0x86D1, + 0xDBC0: 0x8848, + 0xDBC1: 0x8856, + 0xDBC2: 0x8855, + 0xDBC3: 0x88BA, + 0xDBC4: 0x88D7, + 0xDBC5: 0x88B9, + 0xDBC6: 0x88B8, + 0xDBC7: 0x88C0, + 0xDBC8: 0x88BE, + 0xDBC9: 0x88B6, + 0xDBCA: 0x88BC, + 0xDBCB: 0x88B7, + 0xDBCC: 0x88BD, + 0xDBCD: 0x88B2, + 0xDBCE: 0x8901, + 0xDBCF: 0x88C9, + 0xDBD0: 0x8995, + 0xDBD1: 0x8998, + 0xDBD2: 0x8997, + 0xDBD3: 0x89DD, + 0xDBD4: 0x89DA, + 0xDBD5: 0x89DB, + 0xDBD6: 0x8A4E, + 0xDBD7: 0x8A4D, + 0xDBD8: 0x8A39, + 0xDBD9: 0x8A59, + 0xDBDA: 0x8A40, + 0xDBDB: 0x8A57, + 0xDBDC: 0x8A58, + 0xDBDD: 0x8A44, + 0xDBDE: 0x8A45, + 0xDBDF: 0x8A52, + 0xDBE0: 0x8A48, + 0xDBE1: 0x8A51, + 0xDBE2: 0x8A4A, + 0xDBE3: 0x8A4C, + 0xDBE4: 0x8A4F, + 0xDBE5: 0x8C5F, + 0xDBE6: 0x8C81, + 0xDBE7: 0x8C80, + 0xDBE8: 0x8CBA, + 0xDBE9: 0x8CBE, + 0xDBEA: 0x8CB0, + 0xDBEB: 0x8CB9, + 0xDBEC: 0x8CB5, + 0xDBED: 0x8D84, + 0xDBEE: 0x8D80, + 0xDBEF: 0x8D89, + 0xDBF0: 0x8DD8, + 0xDBF1: 0x8DD3, + 0xDBF2: 0x8DCD, + 0xDBF3: 0x8DC7, + 0xDBF4: 0x8DD6, + 0xDBF5: 0x8DDC, + 0xDBF6: 0x8DCF, + 0xDBF7: 0x8DD5, + 0xDBF8: 0x8DD9, + 0xDBF9: 0x8DC8, + 0xDBFA: 0x8DD7, + 0xDBFB: 0x8DC5, + 0xDBFC: 0x8EEF, + 0xDBFD: 0x8EF7, + 0xDBFE: 0x8EFA, + 0xDC40: 0x8EF9, + 0xDC41: 0x8EE6, + 0xDC42: 0x8EEE, + 0xDC43: 0x8EE5, + 0xDC44: 0x8EF5, + 0xDC45: 0x8EE7, + 0xDC46: 0x8EE8, + 0xDC47: 0x8EF6, + 0xDC48: 0x8EEB, + 0xDC49: 0x8EF1, + 0xDC4A: 0x8EEC, + 0xDC4B: 0x8EF4, + 0xDC4C: 0x8EE9, + 0xDC4D: 0x902D, + 0xDC4E: 0x9034, + 0xDC4F: 0x902F, + 0xDC50: 0x9106, + 0xDC51: 0x912C, + 0xDC52: 0x9104, + 0xDC53: 0x90FF, + 0xDC54: 0x90FC, + 0xDC55: 0x9108, + 0xDC56: 0x90F9, + 0xDC57: 0x90FB, + 0xDC58: 0x9101, + 0xDC59: 0x9100, + 0xDC5A: 0x9107, + 0xDC5B: 0x9105, + 0xDC5C: 0x9103, + 0xDC5D: 0x9161, + 0xDC5E: 0x9164, + 0xDC5F: 0x915F, + 0xDC60: 0x9162, + 0xDC61: 0x9160, + 0xDC62: 0x9201, + 0xDC63: 0x920A, + 0xDC64: 0x9225, + 0xDC65: 0x9203, + 0xDC66: 0x921A, + 0xDC67: 0x9226, + 0xDC68: 0x920F, + 0xDC69: 0x920C, + 0xDC6A: 0x9200, + 0xDC6B: 0x9212, + 0xDC6C: 0x91FF, + 0xDC6D: 0x91FD, + 0xDC6E: 0x9206, + 0xDC6F: 0x9204, + 0xDC70: 0x9227, + 0xDC71: 0x9202, + 0xDC72: 0x921C, + 0xDC73: 0x9224, + 0xDC74: 0x9219, + 0xDC75: 0x9217, + 0xDC76: 0x9205, + 0xDC77: 0x9216, + 0xDC78: 0x957B, + 0xDC79: 0x958D, + 0xDC7A: 0x958C, + 0xDC7B: 0x9590, + 0xDC7C: 0x9687, + 0xDC7D: 0x967E, + 0xDC7E: 0x9688, + 0xDCA1: 0x9689, + 0xDCA2: 0x9683, + 0xDCA3: 0x9680, + 0xDCA4: 0x96C2, + 0xDCA5: 0x96C8, + 0xDCA6: 0x96C3, + 0xDCA7: 0x96F1, + 0xDCA8: 0x96F0, + 0xDCA9: 0x976C, + 0xDCAA: 0x9770, + 0xDCAB: 0x976E, + 0xDCAC: 0x9807, + 0xDCAD: 0x98A9, + 0xDCAE: 0x98EB, + 0xDCAF: 0x9CE6, + 0xDCB0: 0x9EF9, + 0xDCB1: 0x4E83, + 0xDCB2: 0x4E84, + 0xDCB3: 0x4EB6, + 0xDCB4: 0x50BD, + 0xDCB5: 0x50BF, + 0xDCB6: 0x50C6, + 0xDCB7: 0x50AE, + 0xDCB8: 0x50C4, + 0xDCB9: 0x50CA, + 0xDCBA: 0x50B4, + 0xDCBB: 0x50C8, + 0xDCBC: 0x50C2, + 0xDCBD: 0x50B0, + 0xDCBE: 0x50C1, + 0xDCBF: 0x50BA, + 0xDCC0: 0x50B1, + 0xDCC1: 0x50CB, + 0xDCC2: 0x50C9, + 0xDCC3: 0x50B6, + 0xDCC4: 0x50B8, + 0xDCC5: 0x51D7, + 0xDCC6: 0x527A, + 0xDCC7: 0x5278, + 0xDCC8: 0x527B, + 0xDCC9: 0x527C, + 0xDCCA: 0x55C3, + 0xDCCB: 0x55DB, + 0xDCCC: 0x55CC, + 0xDCCD: 0x55D0, + 0xDCCE: 0x55CB, + 0xDCCF: 0x55CA, + 0xDCD0: 0x55DD, + 0xDCD1: 0x55C0, + 0xDCD2: 0x55D4, + 0xDCD3: 0x55C4, + 0xDCD4: 0x55E9, + 0xDCD5: 0x55BF, + 0xDCD6: 0x55D2, + 0xDCD7: 0x558D, + 0xDCD8: 0x55CF, + 0xDCD9: 0x55D5, + 0xDCDA: 0x55E2, + 0xDCDB: 0x55D6, + 0xDCDC: 0x55C8, + 0xDCDD: 0x55F2, + 0xDCDE: 0x55CD, + 0xDCDF: 0x55D9, + 0xDCE0: 0x55C2, + 0xDCE1: 0x5714, + 0xDCE2: 0x5853, + 0xDCE3: 0x5868, + 0xDCE4: 0x5864, + 0xDCE5: 0x584F, + 0xDCE6: 0x584D, + 0xDCE7: 0x5849, + 0xDCE8: 0x586F, + 0xDCE9: 0x5855, + 0xDCEA: 0x584E, + 0xDCEB: 0x585D, + 0xDCEC: 0x5859, + 0xDCED: 0x5865, + 0xDCEE: 0x585B, + 0xDCEF: 0x583D, + 0xDCF0: 0x5863, + 0xDCF1: 0x5871, + 0xDCF2: 0x58FC, + 0xDCF3: 0x5AC7, + 0xDCF4: 0x5AC4, + 0xDCF5: 0x5ACB, + 0xDCF6: 0x5ABA, + 0xDCF7: 0x5AB8, + 0xDCF8: 0x5AB1, + 0xDCF9: 0x5AB5, + 0xDCFA: 0x5AB0, + 0xDCFB: 0x5ABF, + 0xDCFC: 0x5AC8, + 0xDCFD: 0x5ABB, + 0xDCFE: 0x5AC6, + 0xDD40: 0x5AB7, + 0xDD41: 0x5AC0, + 0xDD42: 0x5ACA, + 0xDD43: 0x5AB4, + 0xDD44: 0x5AB6, + 0xDD45: 0x5ACD, + 0xDD46: 0x5AB9, + 0xDD47: 0x5A90, + 0xDD48: 0x5BD6, + 0xDD49: 0x5BD8, + 0xDD4A: 0x5BD9, + 0xDD4B: 0x5C1F, + 0xDD4C: 0x5C33, + 0xDD4D: 0x5D71, + 0xDD4E: 0x5D63, + 0xDD4F: 0x5D4A, + 0xDD50: 0x5D65, + 0xDD51: 0x5D72, + 0xDD52: 0x5D6C, + 0xDD53: 0x5D5E, + 0xDD54: 0x5D68, + 0xDD55: 0x5D67, + 0xDD56: 0x5D62, + 0xDD57: 0x5DF0, + 0xDD58: 0x5E4F, + 0xDD59: 0x5E4E, + 0xDD5A: 0x5E4A, + 0xDD5B: 0x5E4D, + 0xDD5C: 0x5E4B, + 0xDD5D: 0x5EC5, + 0xDD5E: 0x5ECC, + 0xDD5F: 0x5EC6, + 0xDD60: 0x5ECB, + 0xDD61: 0x5EC7, + 0xDD62: 0x5F40, + 0xDD63: 0x5FAF, + 0xDD64: 0x5FAD, + 0xDD65: 0x60F7, + 0xDD66: 0x6149, + 0xDD67: 0x614A, + 0xDD68: 0x612B, + 0xDD69: 0x6145, + 0xDD6A: 0x6136, + 0xDD6B: 0x6132, + 0xDD6C: 0x612E, + 0xDD6D: 0x6146, + 0xDD6E: 0x612F, + 0xDD6F: 0x614F, + 0xDD70: 0x6129, + 0xDD71: 0x6140, + 0xDD72: 0x6220, + 0xDD73: 0x9168, + 0xDD74: 0x6223, + 0xDD75: 0x6225, + 0xDD76: 0x6224, + 0xDD77: 0x63C5, + 0xDD78: 0x63F1, + 0xDD79: 0x63EB, + 0xDD7A: 0x6410, + 0xDD7B: 0x6412, + 0xDD7C: 0x6409, + 0xDD7D: 0x6420, + 0xDD7E: 0x6424, + 0xDDA1: 0x6433, + 0xDDA2: 0x6443, + 0xDDA3: 0x641F, + 0xDDA4: 0x6415, + 0xDDA5: 0x6418, + 0xDDA6: 0x6439, + 0xDDA7: 0x6437, + 0xDDA8: 0x6422, + 0xDDA9: 0x6423, + 0xDDAA: 0x640C, + 0xDDAB: 0x6426, + 0xDDAC: 0x6430, + 0xDDAD: 0x6428, + 0xDDAE: 0x6441, + 0xDDAF: 0x6435, + 0xDDB0: 0x642F, + 0xDDB1: 0x640A, + 0xDDB2: 0x641A, + 0xDDB3: 0x6440, + 0xDDB4: 0x6425, + 0xDDB5: 0x6427, + 0xDDB6: 0x640B, + 0xDDB7: 0x63E7, + 0xDDB8: 0x641B, + 0xDDB9: 0x642E, + 0xDDBA: 0x6421, + 0xDDBB: 0x640E, + 0xDDBC: 0x656F, + 0xDDBD: 0x6592, + 0xDDBE: 0x65D3, + 0xDDBF: 0x6686, + 0xDDC0: 0x668C, + 0xDDC1: 0x6695, + 0xDDC2: 0x6690, + 0xDDC3: 0x668B, + 0xDDC4: 0x668A, + 0xDDC5: 0x6699, + 0xDDC6: 0x6694, + 0xDDC7: 0x6678, + 0xDDC8: 0x6720, + 0xDDC9: 0x6966, + 0xDDCA: 0x695F, + 0xDDCB: 0x6938, + 0xDDCC: 0x694E, + 0xDDCD: 0x6962, + 0xDDCE: 0x6971, + 0xDDCF: 0x693F, + 0xDDD0: 0x6945, + 0xDDD1: 0x696A, + 0xDDD2: 0x6939, + 0xDDD3: 0x6942, + 0xDDD4: 0x6957, + 0xDDD5: 0x6959, + 0xDDD6: 0x697A, + 0xDDD7: 0x6948, + 0xDDD8: 0x6949, + 0xDDD9: 0x6935, + 0xDDDA: 0x696C, + 0xDDDB: 0x6933, + 0xDDDC: 0x693D, + 0xDDDD: 0x6965, + 0xDDDE: 0x68F0, + 0xDDDF: 0x6978, + 0xDDE0: 0x6934, + 0xDDE1: 0x6969, + 0xDDE2: 0x6940, + 0xDDE3: 0x696F, + 0xDDE4: 0x6944, + 0xDDE5: 0x6976, + 0xDDE6: 0x6958, + 0xDDE7: 0x6941, + 0xDDE8: 0x6974, + 0xDDE9: 0x694C, + 0xDDEA: 0x693B, + 0xDDEB: 0x694B, + 0xDDEC: 0x6937, + 0xDDED: 0x695C, + 0xDDEE: 0x694F, + 0xDDEF: 0x6951, + 0xDDF0: 0x6932, + 0xDDF1: 0x6952, + 0xDDF2: 0x692F, + 0xDDF3: 0x697B, + 0xDDF4: 0x693C, + 0xDDF5: 0x6B46, + 0xDDF6: 0x6B45, + 0xDDF7: 0x6B43, + 0xDDF8: 0x6B42, + 0xDDF9: 0x6B48, + 0xDDFA: 0x6B41, + 0xDDFB: 0x6B9B, + 0xDDFC: 0xFA0D, // CJK COMPATIBILITY IDEOGRAPH-FA0D + 0xDDFD: 0x6BFB, + 0xDDFE: 0x6BFC, + 0xDE40: 0x6BF9, + 0xDE41: 0x6BF7, + 0xDE42: 0x6BF8, + 0xDE43: 0x6E9B, + 0xDE44: 0x6ED6, + 0xDE45: 0x6EC8, + 0xDE46: 0x6E8F, + 0xDE47: 0x6EC0, + 0xDE48: 0x6E9F, + 0xDE49: 0x6E93, + 0xDE4A: 0x6E94, + 0xDE4B: 0x6EA0, + 0xDE4C: 0x6EB1, + 0xDE4D: 0x6EB9, + 0xDE4E: 0x6EC6, + 0xDE4F: 0x6ED2, + 0xDE50: 0x6EBD, + 0xDE51: 0x6EC1, + 0xDE52: 0x6E9E, + 0xDE53: 0x6EC9, + 0xDE54: 0x6EB7, + 0xDE55: 0x6EB0, + 0xDE56: 0x6ECD, + 0xDE57: 0x6EA6, + 0xDE58: 0x6ECF, + 0xDE59: 0x6EB2, + 0xDE5A: 0x6EBE, + 0xDE5B: 0x6EC3, + 0xDE5C: 0x6EDC, + 0xDE5D: 0x6ED8, + 0xDE5E: 0x6E99, + 0xDE5F: 0x6E92, + 0xDE60: 0x6E8E, + 0xDE61: 0x6E8D, + 0xDE62: 0x6EA4, + 0xDE63: 0x6EA1, + 0xDE64: 0x6EBF, + 0xDE65: 0x6EB3, + 0xDE66: 0x6ED0, + 0xDE67: 0x6ECA, + 0xDE68: 0x6E97, + 0xDE69: 0x6EAE, + 0xDE6A: 0x6EA3, + 0xDE6B: 0x7147, + 0xDE6C: 0x7154, + 0xDE6D: 0x7152, + 0xDE6E: 0x7163, + 0xDE6F: 0x7160, + 0xDE70: 0x7141, + 0xDE71: 0x715D, + 0xDE72: 0x7162, + 0xDE73: 0x7172, + 0xDE74: 0x7178, + 0xDE75: 0x716A, + 0xDE76: 0x7161, + 0xDE77: 0x7142, + 0xDE78: 0x7158, + 0xDE79: 0x7143, + 0xDE7A: 0x714B, + 0xDE7B: 0x7170, + 0xDE7C: 0x715F, + 0xDE7D: 0x7150, + 0xDE7E: 0x7153, + 0xDEA1: 0x7144, + 0xDEA2: 0x714D, + 0xDEA3: 0x715A, + 0xDEA4: 0x724F, + 0xDEA5: 0x728D, + 0xDEA6: 0x728C, + 0xDEA7: 0x7291, + 0xDEA8: 0x7290, + 0xDEA9: 0x728E, + 0xDEAA: 0x733C, + 0xDEAB: 0x7342, + 0xDEAC: 0x733B, + 0xDEAD: 0x733A, + 0xDEAE: 0x7340, + 0xDEAF: 0x734A, + 0xDEB0: 0x7349, + 0xDEB1: 0x7444, + 0xDEB2: 0x744A, + 0xDEB3: 0x744B, + 0xDEB4: 0x7452, + 0xDEB5: 0x7451, + 0xDEB6: 0x7457, + 0xDEB7: 0x7440, + 0xDEB8: 0x744F, + 0xDEB9: 0x7450, + 0xDEBA: 0x744E, + 0xDEBB: 0x7442, + 0xDEBC: 0x7446, + 0xDEBD: 0x744D, + 0xDEBE: 0x7454, + 0xDEBF: 0x74E1, + 0xDEC0: 0x74FF, + 0xDEC1: 0x74FE, + 0xDEC2: 0x74FD, + 0xDEC3: 0x751D, + 0xDEC4: 0x7579, + 0xDEC5: 0x7577, + 0xDEC6: 0x6983, + 0xDEC7: 0x75EF, + 0xDEC8: 0x760F, + 0xDEC9: 0x7603, + 0xDECA: 0x75F7, + 0xDECB: 0x75FE, + 0xDECC: 0x75FC, + 0xDECD: 0x75F9, + 0xDECE: 0x75F8, + 0xDECF: 0x7610, + 0xDED0: 0x75FB, + 0xDED1: 0x75F6, + 0xDED2: 0x75ED, + 0xDED3: 0x75F5, + 0xDED4: 0x75FD, + 0xDED5: 0x7699, + 0xDED6: 0x76B5, + 0xDED7: 0x76DD, + 0xDED8: 0x7755, + 0xDED9: 0x775F, + 0xDEDA: 0x7760, + 0xDEDB: 0x7752, + 0xDEDC: 0x7756, + 0xDEDD: 0x775A, + 0xDEDE: 0x7769, + 0xDEDF: 0x7767, + 0xDEE0: 0x7754, + 0xDEE1: 0x7759, + 0xDEE2: 0x776D, + 0xDEE3: 0x77E0, + 0xDEE4: 0x7887, + 0xDEE5: 0x789A, + 0xDEE6: 0x7894, + 0xDEE7: 0x788F, + 0xDEE8: 0x7884, + 0xDEE9: 0x7895, + 0xDEEA: 0x7885, + 0xDEEB: 0x7886, + 0xDEEC: 0x78A1, + 0xDEED: 0x7883, + 0xDEEE: 0x7879, + 0xDEEF: 0x7899, + 0xDEF0: 0x7880, + 0xDEF1: 0x7896, + 0xDEF2: 0x787B, + 0xDEF3: 0x797C, + 0xDEF4: 0x7982, + 0xDEF5: 0x797D, + 0xDEF6: 0x7979, + 0xDEF7: 0x7A11, + 0xDEF8: 0x7A18, + 0xDEF9: 0x7A19, + 0xDEFA: 0x7A12, + 0xDEFB: 0x7A17, + 0xDEFC: 0x7A15, + 0xDEFD: 0x7A22, + 0xDEFE: 0x7A13, + 0xDF40: 0x7A1B, + 0xDF41: 0x7A10, + 0xDF42: 0x7AA3, + 0xDF43: 0x7AA2, + 0xDF44: 0x7A9E, + 0xDF45: 0x7AEB, + 0xDF46: 0x7B66, + 0xDF47: 0x7B64, + 0xDF48: 0x7B6D, + 0xDF49: 0x7B74, + 0xDF4A: 0x7B69, + 0xDF4B: 0x7B72, + 0xDF4C: 0x7B65, + 0xDF4D: 0x7B73, + 0xDF4E: 0x7B71, + 0xDF4F: 0x7B70, + 0xDF50: 0x7B61, + 0xDF51: 0x7B78, + 0xDF52: 0x7B76, + 0xDF53: 0x7B63, + 0xDF54: 0x7CB2, + 0xDF55: 0x7CB4, + 0xDF56: 0x7CAF, + 0xDF57: 0x7D88, + 0xDF58: 0x7D86, + 0xDF59: 0x7D80, + 0xDF5A: 0x7D8D, + 0xDF5B: 0x7D7F, + 0xDF5C: 0x7D85, + 0xDF5D: 0x7D7A, + 0xDF5E: 0x7D8E, + 0xDF5F: 0x7D7B, + 0xDF60: 0x7D83, + 0xDF61: 0x7D7C, + 0xDF62: 0x7D8C, + 0xDF63: 0x7D94, + 0xDF64: 0x7D84, + 0xDF65: 0x7D7D, + 0xDF66: 0x7D92, + 0xDF67: 0x7F6D, + 0xDF68: 0x7F6B, + 0xDF69: 0x7F67, + 0xDF6A: 0x7F68, + 0xDF6B: 0x7F6C, + 0xDF6C: 0x7FA6, + 0xDF6D: 0x7FA5, + 0xDF6E: 0x7FA7, + 0xDF6F: 0x7FDB, + 0xDF70: 0x7FDC, + 0xDF71: 0x8021, + 0xDF72: 0x8164, + 0xDF73: 0x8160, + 0xDF74: 0x8177, + 0xDF75: 0x815C, + 0xDF76: 0x8169, + 0xDF77: 0x815B, + 0xDF78: 0x8162, + 0xDF79: 0x8172, + 0xDF7A: 0x6721, + 0xDF7B: 0x815E, + 0xDF7C: 0x8176, + 0xDF7D: 0x8167, + 0xDF7E: 0x816F, + 0xDFA1: 0x8144, + 0xDFA2: 0x8161, + 0xDFA3: 0x821D, + 0xDFA4: 0x8249, + 0xDFA5: 0x8244, + 0xDFA6: 0x8240, + 0xDFA7: 0x8242, + 0xDFA8: 0x8245, + 0xDFA9: 0x84F1, + 0xDFAA: 0x843F, + 0xDFAB: 0x8456, + 0xDFAC: 0x8476, + 0xDFAD: 0x8479, + 0xDFAE: 0x848F, + 0xDFAF: 0x848D, + 0xDFB0: 0x8465, + 0xDFB1: 0x8451, + 0xDFB2: 0x8440, + 0xDFB3: 0x8486, + 0xDFB4: 0x8467, + 0xDFB5: 0x8430, + 0xDFB6: 0x844D, + 0xDFB7: 0x847D, + 0xDFB8: 0x845A, + 0xDFB9: 0x8459, + 0xDFBA: 0x8474, + 0xDFBB: 0x8473, + 0xDFBC: 0x845D, + 0xDFBD: 0x8507, + 0xDFBE: 0x845E, + 0xDFBF: 0x8437, + 0xDFC0: 0x843A, + 0xDFC1: 0x8434, + 0xDFC2: 0x847A, + 0xDFC3: 0x8443, + 0xDFC4: 0x8478, + 0xDFC5: 0x8432, + 0xDFC6: 0x8445, + 0xDFC7: 0x8429, + 0xDFC8: 0x83D9, + 0xDFC9: 0x844B, + 0xDFCA: 0x842F, + 0xDFCB: 0x8442, + 0xDFCC: 0x842D, + 0xDFCD: 0x845F, + 0xDFCE: 0x8470, + 0xDFCF: 0x8439, + 0xDFD0: 0x844E, + 0xDFD1: 0x844C, + 0xDFD2: 0x8452, + 0xDFD3: 0x846F, + 0xDFD4: 0x84C5, + 0xDFD5: 0x848E, + 0xDFD6: 0x843B, + 0xDFD7: 0x8447, + 0xDFD8: 0x8436, + 0xDFD9: 0x8433, + 0xDFDA: 0x8468, + 0xDFDB: 0x847E, + 0xDFDC: 0x8444, + 0xDFDD: 0x842B, + 0xDFDE: 0x8460, + 0xDFDF: 0x8454, + 0xDFE0: 0x846E, + 0xDFE1: 0x8450, + 0xDFE2: 0x870B, + 0xDFE3: 0x8704, + 0xDFE4: 0x86F7, + 0xDFE5: 0x870C, + 0xDFE6: 0x86FA, + 0xDFE7: 0x86D6, + 0xDFE8: 0x86F5, + 0xDFE9: 0x874D, + 0xDFEA: 0x86F8, + 0xDFEB: 0x870E, + 0xDFEC: 0x8709, + 0xDFED: 0x8701, + 0xDFEE: 0x86F6, + 0xDFEF: 0x870D, + 0xDFF0: 0x8705, + 0xDFF1: 0x88D6, + 0xDFF2: 0x88CB, + 0xDFF3: 0x88CD, + 0xDFF4: 0x88CE, + 0xDFF5: 0x88DE, + 0xDFF6: 0x88DB, + 0xDFF7: 0x88DA, + 0xDFF8: 0x88CC, + 0xDFF9: 0x88D0, + 0xDFFA: 0x8985, + 0xDFFB: 0x899B, + 0xDFFC: 0x89DF, + 0xDFFD: 0x89E5, + 0xDFFE: 0x89E4, + 0xE040: 0x89E1, + 0xE041: 0x89E0, + 0xE042: 0x89E2, + 0xE043: 0x89DC, + 0xE044: 0x89E6, + 0xE045: 0x8A76, + 0xE046: 0x8A86, + 0xE047: 0x8A7F, + 0xE048: 0x8A61, + 0xE049: 0x8A3F, + 0xE04A: 0x8A77, + 0xE04B: 0x8A82, + 0xE04C: 0x8A84, + 0xE04D: 0x8A75, + 0xE04E: 0x8A83, + 0xE04F: 0x8A81, + 0xE050: 0x8A74, + 0xE051: 0x8A7A, + 0xE052: 0x8C3C, + 0xE053: 0x8C4B, + 0xE054: 0x8C4A, + 0xE055: 0x8C65, + 0xE056: 0x8C64, + 0xE057: 0x8C66, + 0xE058: 0x8C86, + 0xE059: 0x8C84, + 0xE05A: 0x8C85, + 0xE05B: 0x8CCC, + 0xE05C: 0x8D68, + 0xE05D: 0x8D69, + 0xE05E: 0x8D91, + 0xE05F: 0x8D8C, + 0xE060: 0x8D8E, + 0xE061: 0x8D8F, + 0xE062: 0x8D8D, + 0xE063: 0x8D93, + 0xE064: 0x8D94, + 0xE065: 0x8D90, + 0xE066: 0x8D92, + 0xE067: 0x8DF0, + 0xE068: 0x8DE0, + 0xE069: 0x8DEC, + 0xE06A: 0x8DF1, + 0xE06B: 0x8DEE, + 0xE06C: 0x8DD0, + 0xE06D: 0x8DE9, + 0xE06E: 0x8DE3, + 0xE06F: 0x8DE2, + 0xE070: 0x8DE7, + 0xE071: 0x8DF2, + 0xE072: 0x8DEB, + 0xE073: 0x8DF4, + 0xE074: 0x8F06, + 0xE075: 0x8EFF, + 0xE076: 0x8F01, + 0xE077: 0x8F00, + 0xE078: 0x8F05, + 0xE079: 0x8F07, + 0xE07A: 0x8F08, + 0xE07B: 0x8F02, + 0xE07C: 0x8F0B, + 0xE07D: 0x9052, + 0xE07E: 0x903F, + 0xE0A1: 0x9044, + 0xE0A2: 0x9049, + 0xE0A3: 0x903D, + 0xE0A4: 0x9110, + 0xE0A5: 0x910D, + 0xE0A6: 0x910F, + 0xE0A7: 0x9111, + 0xE0A8: 0x9116, + 0xE0A9: 0x9114, + 0xE0AA: 0x910B, + 0xE0AB: 0x910E, + 0xE0AC: 0x916E, + 0xE0AD: 0x916F, + 0xE0AE: 0x9248, + 0xE0AF: 0x9252, + 0xE0B0: 0x9230, + 0xE0B1: 0x923A, + 0xE0B2: 0x9266, + 0xE0B3: 0x9233, + 0xE0B4: 0x9265, + 0xE0B5: 0x925E, + 0xE0B6: 0x9283, + 0xE0B7: 0x922E, + 0xE0B8: 0x924A, + 0xE0B9: 0x9246, + 0xE0BA: 0x926D, + 0xE0BB: 0x926C, + 0xE0BC: 0x924F, + 0xE0BD: 0x9260, + 0xE0BE: 0x9267, + 0xE0BF: 0x926F, + 0xE0C0: 0x9236, + 0xE0C1: 0x9261, + 0xE0C2: 0x9270, + 0xE0C3: 0x9231, + 0xE0C4: 0x9254, + 0xE0C5: 0x9263, + 0xE0C6: 0x9250, + 0xE0C7: 0x9272, + 0xE0C8: 0x924E, + 0xE0C9: 0x9253, + 0xE0CA: 0x924C, + 0xE0CB: 0x9256, + 0xE0CC: 0x9232, + 0xE0CD: 0x959F, + 0xE0CE: 0x959C, + 0xE0CF: 0x959E, + 0xE0D0: 0x959B, + 0xE0D1: 0x9692, + 0xE0D2: 0x9693, + 0xE0D3: 0x9691, + 0xE0D4: 0x9697, + 0xE0D5: 0x96CE, + 0xE0D6: 0x96FA, + 0xE0D7: 0x96FD, + 0xE0D8: 0x96F8, + 0xE0D9: 0x96F5, + 0xE0DA: 0x9773, + 0xE0DB: 0x9777, + 0xE0DC: 0x9778, + 0xE0DD: 0x9772, + 0xE0DE: 0x980F, + 0xE0DF: 0x980D, + 0xE0E0: 0x980E, + 0xE0E1: 0x98AC, + 0xE0E2: 0x98F6, + 0xE0E3: 0x98F9, + 0xE0E4: 0x99AF, + 0xE0E5: 0x99B2, + 0xE0E6: 0x99B0, + 0xE0E7: 0x99B5, + 0xE0E8: 0x9AAD, + 0xE0E9: 0x9AAB, + 0xE0EA: 0x9B5B, + 0xE0EB: 0x9CEA, + 0xE0EC: 0x9CED, + 0xE0ED: 0x9CE7, + 0xE0EE: 0x9E80, + 0xE0EF: 0x9EFD, + 0xE0F0: 0x50E6, + 0xE0F1: 0x50D4, + 0xE0F2: 0x50D7, + 0xE0F3: 0x50E8, + 0xE0F4: 0x50F3, + 0xE0F5: 0x50DB, + 0xE0F6: 0x50EA, + 0xE0F7: 0x50DD, + 0xE0F8: 0x50E4, + 0xE0F9: 0x50D3, + 0xE0FA: 0x50EC, + 0xE0FB: 0x50F0, + 0xE0FC: 0x50EF, + 0xE0FD: 0x50E3, + 0xE0FE: 0x50E0, + 0xE140: 0x51D8, + 0xE141: 0x5280, + 0xE142: 0x5281, + 0xE143: 0x52E9, + 0xE144: 0x52EB, + 0xE145: 0x5330, + 0xE146: 0x53AC, + 0xE147: 0x5627, + 0xE148: 0x5615, + 0xE149: 0x560C, + 0xE14A: 0x5612, + 0xE14B: 0x55FC, + 0xE14C: 0x560F, + 0xE14D: 0x561C, + 0xE14E: 0x5601, + 0xE14F: 0x5613, + 0xE150: 0x5602, + 0xE151: 0x55FA, + 0xE152: 0x561D, + 0xE153: 0x5604, + 0xE154: 0x55FF, + 0xE155: 0x55F9, + 0xE156: 0x5889, + 0xE157: 0x587C, + 0xE158: 0x5890, + 0xE159: 0x5898, + 0xE15A: 0x5886, + 0xE15B: 0x5881, + 0xE15C: 0x587F, + 0xE15D: 0x5874, + 0xE15E: 0x588B, + 0xE15F: 0x587A, + 0xE160: 0x5887, + 0xE161: 0x5891, + 0xE162: 0x588E, + 0xE163: 0x5876, + 0xE164: 0x5882, + 0xE165: 0x5888, + 0xE166: 0x587B, + 0xE167: 0x5894, + 0xE168: 0x588F, + 0xE169: 0x58FE, + 0xE16A: 0x596B, + 0xE16B: 0x5ADC, + 0xE16C: 0x5AEE, + 0xE16D: 0x5AE5, + 0xE16E: 0x5AD5, + 0xE16F: 0x5AEA, + 0xE170: 0x5ADA, + 0xE171: 0x5AED, + 0xE172: 0x5AEB, + 0xE173: 0x5AF3, + 0xE174: 0x5AE2, + 0xE175: 0x5AE0, + 0xE176: 0x5ADB, + 0xE177: 0x5AEC, + 0xE178: 0x5ADE, + 0xE179: 0x5ADD, + 0xE17A: 0x5AD9, + 0xE17B: 0x5AE8, + 0xE17C: 0x5ADF, + 0xE17D: 0x5B77, + 0xE17E: 0x5BE0, + 0xE1A1: 0x5BE3, + 0xE1A2: 0x5C63, + 0xE1A3: 0x5D82, + 0xE1A4: 0x5D80, + 0xE1A5: 0x5D7D, + 0xE1A6: 0x5D86, + 0xE1A7: 0x5D7A, + 0xE1A8: 0x5D81, + 0xE1A9: 0x5D77, + 0xE1AA: 0x5D8A, + 0xE1AB: 0x5D89, + 0xE1AC: 0x5D88, + 0xE1AD: 0x5D7E, + 0xE1AE: 0x5D7C, + 0xE1AF: 0x5D8D, + 0xE1B0: 0x5D79, + 0xE1B1: 0x5D7F, + 0xE1B2: 0x5E58, + 0xE1B3: 0x5E59, + 0xE1B4: 0x5E53, + 0xE1B5: 0x5ED8, + 0xE1B6: 0x5ED1, + 0xE1B7: 0x5ED7, + 0xE1B8: 0x5ECE, + 0xE1B9: 0x5EDC, + 0xE1BA: 0x5ED5, + 0xE1BB: 0x5ED9, + 0xE1BC: 0x5ED2, + 0xE1BD: 0x5ED4, + 0xE1BE: 0x5F44, + 0xE1BF: 0x5F43, + 0xE1C0: 0x5F6F, + 0xE1C1: 0x5FB6, + 0xE1C2: 0x612C, + 0xE1C3: 0x6128, + 0xE1C4: 0x6141, + 0xE1C5: 0x615E, + 0xE1C6: 0x6171, + 0xE1C7: 0x6173, + 0xE1C8: 0x6152, + 0xE1C9: 0x6153, + 0xE1CA: 0x6172, + 0xE1CB: 0x616C, + 0xE1CC: 0x6180, + 0xE1CD: 0x6174, + 0xE1CE: 0x6154, + 0xE1CF: 0x617A, + 0xE1D0: 0x615B, + 0xE1D1: 0x6165, + 0xE1D2: 0x613B, + 0xE1D3: 0x616A, + 0xE1D4: 0x6161, + 0xE1D5: 0x6156, + 0xE1D6: 0x6229, + 0xE1D7: 0x6227, + 0xE1D8: 0x622B, + 0xE1D9: 0x642B, + 0xE1DA: 0x644D, + 0xE1DB: 0x645B, + 0xE1DC: 0x645D, + 0xE1DD: 0x6474, + 0xE1DE: 0x6476, + 0xE1DF: 0x6472, + 0xE1E0: 0x6473, + 0xE1E1: 0x647D, + 0xE1E2: 0x6475, + 0xE1E3: 0x6466, + 0xE1E4: 0x64A6, + 0xE1E5: 0x644E, + 0xE1E6: 0x6482, + 0xE1E7: 0x645E, + 0xE1E8: 0x645C, + 0xE1E9: 0x644B, + 0xE1EA: 0x6453, + 0xE1EB: 0x6460, + 0xE1EC: 0x6450, + 0xE1ED: 0x647F, + 0xE1EE: 0x643F, + 0xE1EF: 0x646C, + 0xE1F0: 0x646B, + 0xE1F1: 0x6459, + 0xE1F2: 0x6465, + 0xE1F3: 0x6477, + 0xE1F4: 0x6573, + 0xE1F5: 0x65A0, + 0xE1F6: 0x66A1, + 0xE1F7: 0x66A0, + 0xE1F8: 0x669F, + 0xE1F9: 0x6705, + 0xE1FA: 0x6704, + 0xE1FB: 0x6722, + 0xE1FC: 0x69B1, + 0xE1FD: 0x69B6, + 0xE1FE: 0x69C9, + 0xE240: 0x69A0, + 0xE241: 0x69CE, + 0xE242: 0x6996, + 0xE243: 0x69B0, + 0xE244: 0x69AC, + 0xE245: 0x69BC, + 0xE246: 0x6991, + 0xE247: 0x6999, + 0xE248: 0x698E, + 0xE249: 0x69A7, + 0xE24A: 0x698D, + 0xE24B: 0x69A9, + 0xE24C: 0x69BE, + 0xE24D: 0x69AF, + 0xE24E: 0x69BF, + 0xE24F: 0x69C4, + 0xE250: 0x69BD, + 0xE251: 0x69A4, + 0xE252: 0x69D4, + 0xE253: 0x69B9, + 0xE254: 0x69CA, + 0xE255: 0x699A, + 0xE256: 0x69CF, + 0xE257: 0x69B3, + 0xE258: 0x6993, + 0xE259: 0x69AA, + 0xE25A: 0x69A1, + 0xE25B: 0x699E, + 0xE25C: 0x69D9, + 0xE25D: 0x6997, + 0xE25E: 0x6990, + 0xE25F: 0x69C2, + 0xE260: 0x69B5, + 0xE261: 0x69A5, + 0xE262: 0x69C6, + 0xE263: 0x6B4A, + 0xE264: 0x6B4D, + 0xE265: 0x6B4B, + 0xE266: 0x6B9E, + 0xE267: 0x6B9F, + 0xE268: 0x6BA0, + 0xE269: 0x6BC3, + 0xE26A: 0x6BC4, + 0xE26B: 0x6BFE, + 0xE26C: 0x6ECE, + 0xE26D: 0x6EF5, + 0xE26E: 0x6EF1, + 0xE26F: 0x6F03, + 0xE270: 0x6F25, + 0xE271: 0x6EF8, + 0xE272: 0x6F37, + 0xE273: 0x6EFB, + 0xE274: 0x6F2E, + 0xE275: 0x6F09, + 0xE276: 0x6F4E, + 0xE277: 0x6F19, + 0xE278: 0x6F1A, + 0xE279: 0x6F27, + 0xE27A: 0x6F18, + 0xE27B: 0x6F3B, + 0xE27C: 0x6F12, + 0xE27D: 0x6EED, + 0xE27E: 0x6F0A, + 0xE2A1: 0x6F36, + 0xE2A2: 0x6F73, + 0xE2A3: 0x6EF9, + 0xE2A4: 0x6EEE, + 0xE2A5: 0x6F2D, + 0xE2A6: 0x6F40, + 0xE2A7: 0x6F30, + 0xE2A8: 0x6F3C, + 0xE2A9: 0x6F35, + 0xE2AA: 0x6EEB, + 0xE2AB: 0x6F07, + 0xE2AC: 0x6F0E, + 0xE2AD: 0x6F43, + 0xE2AE: 0x6F05, + 0xE2AF: 0x6EFD, + 0xE2B0: 0x6EF6, + 0xE2B1: 0x6F39, + 0xE2B2: 0x6F1C, + 0xE2B3: 0x6EFC, + 0xE2B4: 0x6F3A, + 0xE2B5: 0x6F1F, + 0xE2B6: 0x6F0D, + 0xE2B7: 0x6F1E, + 0xE2B8: 0x6F08, + 0xE2B9: 0x6F21, + 0xE2BA: 0x7187, + 0xE2BB: 0x7190, + 0xE2BC: 0x7189, + 0xE2BD: 0x7180, + 0xE2BE: 0x7185, + 0xE2BF: 0x7182, + 0xE2C0: 0x718F, + 0xE2C1: 0x717B, + 0xE2C2: 0x7186, + 0xE2C3: 0x7181, + 0xE2C4: 0x7197, + 0xE2C5: 0x7244, + 0xE2C6: 0x7253, + 0xE2C7: 0x7297, + 0xE2C8: 0x7295, + 0xE2C9: 0x7293, + 0xE2CA: 0x7343, + 0xE2CB: 0x734D, + 0xE2CC: 0x7351, + 0xE2CD: 0x734C, + 0xE2CE: 0x7462, + 0xE2CF: 0x7473, + 0xE2D0: 0x7471, + 0xE2D1: 0x7475, + 0xE2D2: 0x7472, + 0xE2D3: 0x7467, + 0xE2D4: 0x746E, + 0xE2D5: 0x7500, + 0xE2D6: 0x7502, + 0xE2D7: 0x7503, + 0xE2D8: 0x757D, + 0xE2D9: 0x7590, + 0xE2DA: 0x7616, + 0xE2DB: 0x7608, + 0xE2DC: 0x760C, + 0xE2DD: 0x7615, + 0xE2DE: 0x7611, + 0xE2DF: 0x760A, + 0xE2E0: 0x7614, + 0xE2E1: 0x76B8, + 0xE2E2: 0x7781, + 0xE2E3: 0x777C, + 0xE2E4: 0x7785, + 0xE2E5: 0x7782, + 0xE2E6: 0x776E, + 0xE2E7: 0x7780, + 0xE2E8: 0x776F, + 0xE2E9: 0x777E, + 0xE2EA: 0x7783, + 0xE2EB: 0x78B2, + 0xE2EC: 0x78AA, + 0xE2ED: 0x78B4, + 0xE2EE: 0x78AD, + 0xE2EF: 0x78A8, + 0xE2F0: 0x787E, + 0xE2F1: 0x78AB, + 0xE2F2: 0x789E, + 0xE2F3: 0x78A5, + 0xE2F4: 0x78A0, + 0xE2F5: 0x78AC, + 0xE2F6: 0x78A2, + 0xE2F7: 0x78A4, + 0xE2F8: 0x7998, + 0xE2F9: 0x798A, + 0xE2FA: 0x798B, + 0xE2FB: 0x7996, + 0xE2FC: 0x7995, + 0xE2FD: 0x7994, + 0xE2FE: 0x7993, + 0xE340: 0x7997, + 0xE341: 0x7988, + 0xE342: 0x7992, + 0xE343: 0x7990, + 0xE344: 0x7A2B, + 0xE345: 0x7A4A, + 0xE346: 0x7A30, + 0xE347: 0x7A2F, + 0xE348: 0x7A28, + 0xE349: 0x7A26, + 0xE34A: 0x7AA8, + 0xE34B: 0x7AAB, + 0xE34C: 0x7AAC, + 0xE34D: 0x7AEE, + 0xE34E: 0x7B88, + 0xE34F: 0x7B9C, + 0xE350: 0x7B8A, + 0xE351: 0x7B91, + 0xE352: 0x7B90, + 0xE353: 0x7B96, + 0xE354: 0x7B8D, + 0xE355: 0x7B8C, + 0xE356: 0x7B9B, + 0xE357: 0x7B8E, + 0xE358: 0x7B85, + 0xE359: 0x7B98, + 0xE35A: 0x5284, + 0xE35B: 0x7B99, + 0xE35C: 0x7BA4, + 0xE35D: 0x7B82, + 0xE35E: 0x7CBB, + 0xE35F: 0x7CBF, + 0xE360: 0x7CBC, + 0xE361: 0x7CBA, + 0xE362: 0x7DA7, + 0xE363: 0x7DB7, + 0xE364: 0x7DC2, + 0xE365: 0x7DA3, + 0xE366: 0x7DAA, + 0xE367: 0x7DC1, + 0xE368: 0x7DC0, + 0xE369: 0x7DC5, + 0xE36A: 0x7D9D, + 0xE36B: 0x7DCE, + 0xE36C: 0x7DC4, + 0xE36D: 0x7DC6, + 0xE36E: 0x7DCB, + 0xE36F: 0x7DCC, + 0xE370: 0x7DAF, + 0xE371: 0x7DB9, + 0xE372: 0x7D96, + 0xE373: 0x7DBC, + 0xE374: 0x7D9F, + 0xE375: 0x7DA6, + 0xE376: 0x7DAE, + 0xE377: 0x7DA9, + 0xE378: 0x7DA1, + 0xE379: 0x7DC9, + 0xE37A: 0x7F73, + 0xE37B: 0x7FE2, + 0xE37C: 0x7FE3, + 0xE37D: 0x7FE5, + 0xE37E: 0x7FDE, + 0xE3A1: 0x8024, + 0xE3A2: 0x805D, + 0xE3A3: 0x805C, + 0xE3A4: 0x8189, + 0xE3A5: 0x8186, + 0xE3A6: 0x8183, + 0xE3A7: 0x8187, + 0xE3A8: 0x818D, + 0xE3A9: 0x818C, + 0xE3AA: 0x818B, + 0xE3AB: 0x8215, + 0xE3AC: 0x8497, + 0xE3AD: 0x84A4, + 0xE3AE: 0x84A1, + 0xE3AF: 0x849F, + 0xE3B0: 0x84BA, + 0xE3B1: 0x84CE, + 0xE3B2: 0x84C2, + 0xE3B3: 0x84AC, + 0xE3B4: 0x84AE, + 0xE3B5: 0x84AB, + 0xE3B6: 0x84B9, + 0xE3B7: 0x84B4, + 0xE3B8: 0x84C1, + 0xE3B9: 0x84CD, + 0xE3BA: 0x84AA, + 0xE3BB: 0x849A, + 0xE3BC: 0x84B1, + 0xE3BD: 0x84D0, + 0xE3BE: 0x849D, + 0xE3BF: 0x84A7, + 0xE3C0: 0x84BB, + 0xE3C1: 0x84A2, + 0xE3C2: 0x8494, + 0xE3C3: 0x84C7, + 0xE3C4: 0x84CC, + 0xE3C5: 0x849B, + 0xE3C6: 0x84A9, + 0xE3C7: 0x84AF, + 0xE3C8: 0x84A8, + 0xE3C9: 0x84D6, + 0xE3CA: 0x8498, + 0xE3CB: 0x84B6, + 0xE3CC: 0x84CF, + 0xE3CD: 0x84A0, + 0xE3CE: 0x84D7, + 0xE3CF: 0x84D4, + 0xE3D0: 0x84D2, + 0xE3D1: 0x84DB, + 0xE3D2: 0x84B0, + 0xE3D3: 0x8491, + 0xE3D4: 0x8661, + 0xE3D5: 0x8733, + 0xE3D6: 0x8723, + 0xE3D7: 0x8728, + 0xE3D8: 0x876B, + 0xE3D9: 0x8740, + 0xE3DA: 0x872E, + 0xE3DB: 0x871E, + 0xE3DC: 0x8721, + 0xE3DD: 0x8719, + 0xE3DE: 0x871B, + 0xE3DF: 0x8743, + 0xE3E0: 0x872C, + 0xE3E1: 0x8741, + 0xE3E2: 0x873E, + 0xE3E3: 0x8746, + 0xE3E4: 0x8720, + 0xE3E5: 0x8732, + 0xE3E6: 0x872A, + 0xE3E7: 0x872D, + 0xE3E8: 0x873C, + 0xE3E9: 0x8712, + 0xE3EA: 0x873A, + 0xE3EB: 0x8731, + 0xE3EC: 0x8735, + 0xE3ED: 0x8742, + 0xE3EE: 0x8726, + 0xE3EF: 0x8727, + 0xE3F0: 0x8738, + 0xE3F1: 0x8724, + 0xE3F2: 0x871A, + 0xE3F3: 0x8730, + 0xE3F4: 0x8711, + 0xE3F5: 0x88F7, + 0xE3F6: 0x88E7, + 0xE3F7: 0x88F1, + 0xE3F8: 0x88F2, + 0xE3F9: 0x88FA, + 0xE3FA: 0x88FE, + 0xE3FB: 0x88EE, + 0xE3FC: 0x88FC, + 0xE3FD: 0x88F6, + 0xE3FE: 0x88FB, + 0xE440: 0x88F0, + 0xE441: 0x88EC, + 0xE442: 0x88EB, + 0xE443: 0x899D, + 0xE444: 0x89A1, + 0xE445: 0x899F, + 0xE446: 0x899E, + 0xE447: 0x89E9, + 0xE448: 0x89EB, + 0xE449: 0x89E8, + 0xE44A: 0x8AAB, + 0xE44B: 0x8A99, + 0xE44C: 0x8A8B, + 0xE44D: 0x8A92, + 0xE44E: 0x8A8F, + 0xE44F: 0x8A96, + 0xE450: 0x8C3D, + 0xE451: 0x8C68, + 0xE452: 0x8C69, + 0xE453: 0x8CD5, + 0xE454: 0x8CCF, + 0xE455: 0x8CD7, + 0xE456: 0x8D96, + 0xE457: 0x8E09, + 0xE458: 0x8E02, + 0xE459: 0x8DFF, + 0xE45A: 0x8E0D, + 0xE45B: 0x8DFD, + 0xE45C: 0x8E0A, + 0xE45D: 0x8E03, + 0xE45E: 0x8E07, + 0xE45F: 0x8E06, + 0xE460: 0x8E05, + 0xE461: 0x8DFE, + 0xE462: 0x8E00, + 0xE463: 0x8E04, + 0xE464: 0x8F10, + 0xE465: 0x8F11, + 0xE466: 0x8F0E, + 0xE467: 0x8F0D, + 0xE468: 0x9123, + 0xE469: 0x911C, + 0xE46A: 0x9120, + 0xE46B: 0x9122, + 0xE46C: 0x911F, + 0xE46D: 0x911D, + 0xE46E: 0x911A, + 0xE46F: 0x9124, + 0xE470: 0x9121, + 0xE471: 0x911B, + 0xE472: 0x917A, + 0xE473: 0x9172, + 0xE474: 0x9179, + 0xE475: 0x9173, + 0xE476: 0x92A5, + 0xE477: 0x92A4, + 0xE478: 0x9276, + 0xE479: 0x929B, + 0xE47A: 0x927A, + 0xE47B: 0x92A0, + 0xE47C: 0x9294, + 0xE47D: 0x92AA, + 0xE47E: 0x928D, + 0xE4A1: 0x92A6, + 0xE4A2: 0x929A, + 0xE4A3: 0x92AB, + 0xE4A4: 0x9279, + 0xE4A5: 0x9297, + 0xE4A6: 0x927F, + 0xE4A7: 0x92A3, + 0xE4A8: 0x92EE, + 0xE4A9: 0x928E, + 0xE4AA: 0x9282, + 0xE4AB: 0x9295, + 0xE4AC: 0x92A2, + 0xE4AD: 0x927D, + 0xE4AE: 0x9288, + 0xE4AF: 0x92A1, + 0xE4B0: 0x928A, + 0xE4B1: 0x9286, + 0xE4B2: 0x928C, + 0xE4B3: 0x9299, + 0xE4B4: 0x92A7, + 0xE4B5: 0x927E, + 0xE4B6: 0x9287, + 0xE4B7: 0x92A9, + 0xE4B8: 0x929D, + 0xE4B9: 0x928B, + 0xE4BA: 0x922D, + 0xE4BB: 0x969E, + 0xE4BC: 0x96A1, + 0xE4BD: 0x96FF, + 0xE4BE: 0x9758, + 0xE4BF: 0x977D, + 0xE4C0: 0x977A, + 0xE4C1: 0x977E, + 0xE4C2: 0x9783, + 0xE4C3: 0x9780, + 0xE4C4: 0x9782, + 0xE4C5: 0x977B, + 0xE4C6: 0x9784, + 0xE4C7: 0x9781, + 0xE4C8: 0x977F, + 0xE4C9: 0x97CE, + 0xE4CA: 0x97CD, + 0xE4CB: 0x9816, + 0xE4CC: 0x98AD, + 0xE4CD: 0x98AE, + 0xE4CE: 0x9902, + 0xE4CF: 0x9900, + 0xE4D0: 0x9907, + 0xE4D1: 0x999D, + 0xE4D2: 0x999C, + 0xE4D3: 0x99C3, + 0xE4D4: 0x99B9, + 0xE4D5: 0x99BB, + 0xE4D6: 0x99BA, + 0xE4D7: 0x99C2, + 0xE4D8: 0x99BD, + 0xE4D9: 0x99C7, + 0xE4DA: 0x9AB1, + 0xE4DB: 0x9AE3, + 0xE4DC: 0x9AE7, + 0xE4DD: 0x9B3E, + 0xE4DE: 0x9B3F, + 0xE4DF: 0x9B60, + 0xE4E0: 0x9B61, + 0xE4E1: 0x9B5F, + 0xE4E2: 0x9CF1, + 0xE4E3: 0x9CF2, + 0xE4E4: 0x9CF5, + 0xE4E5: 0x9EA7, + 0xE4E6: 0x50FF, + 0xE4E7: 0x5103, + 0xE4E8: 0x5130, + 0xE4E9: 0x50F8, + 0xE4EA: 0x5106, + 0xE4EB: 0x5107, + 0xE4EC: 0x50F6, + 0xE4ED: 0x50FE, + 0xE4EE: 0x510B, + 0xE4EF: 0x510C, + 0xE4F0: 0x50FD, + 0xE4F1: 0x510A, + 0xE4F2: 0x528B, + 0xE4F3: 0x528C, + 0xE4F4: 0x52F1, + 0xE4F5: 0x52EF, + 0xE4F6: 0x5648, + 0xE4F7: 0x5642, + 0xE4F8: 0x564C, + 0xE4F9: 0x5635, + 0xE4FA: 0x5641, + 0xE4FB: 0x564A, + 0xE4FC: 0x5649, + 0xE4FD: 0x5646, + 0xE4FE: 0x5658, + 0xE540: 0x565A, + 0xE541: 0x5640, + 0xE542: 0x5633, + 0xE543: 0x563D, + 0xE544: 0x562C, + 0xE545: 0x563E, + 0xE546: 0x5638, + 0xE547: 0x562A, + 0xE548: 0x563A, + 0xE549: 0x571A, + 0xE54A: 0x58AB, + 0xE54B: 0x589D, + 0xE54C: 0x58B1, + 0xE54D: 0x58A0, + 0xE54E: 0x58A3, + 0xE54F: 0x58AF, + 0xE550: 0x58AC, + 0xE551: 0x58A5, + 0xE552: 0x58A1, + 0xE553: 0x58FF, + 0xE554: 0x5AFF, + 0xE555: 0x5AF4, + 0xE556: 0x5AFD, + 0xE557: 0x5AF7, + 0xE558: 0x5AF6, + 0xE559: 0x5B03, + 0xE55A: 0x5AF8, + 0xE55B: 0x5B02, + 0xE55C: 0x5AF9, + 0xE55D: 0x5B01, + 0xE55E: 0x5B07, + 0xE55F: 0x5B05, + 0xE560: 0x5B0F, + 0xE561: 0x5C67, + 0xE562: 0x5D99, + 0xE563: 0x5D97, + 0xE564: 0x5D9F, + 0xE565: 0x5D92, + 0xE566: 0x5DA2, + 0xE567: 0x5D93, + 0xE568: 0x5D95, + 0xE569: 0x5DA0, + 0xE56A: 0x5D9C, + 0xE56B: 0x5DA1, + 0xE56C: 0x5D9A, + 0xE56D: 0x5D9E, + 0xE56E: 0x5E69, + 0xE56F: 0x5E5D, + 0xE570: 0x5E60, + 0xE571: 0x5E5C, + 0xE572: 0x7DF3, + 0xE573: 0x5EDB, + 0xE574: 0x5EDE, + 0xE575: 0x5EE1, + 0xE576: 0x5F49, + 0xE577: 0x5FB2, + 0xE578: 0x618B, + 0xE579: 0x6183, + 0xE57A: 0x6179, + 0xE57B: 0x61B1, + 0xE57C: 0x61B0, + 0xE57D: 0x61A2, + 0xE57E: 0x6189, + 0xE5A1: 0x619B, + 0xE5A2: 0x6193, + 0xE5A3: 0x61AF, + 0xE5A4: 0x61AD, + 0xE5A5: 0x619F, + 0xE5A6: 0x6192, + 0xE5A7: 0x61AA, + 0xE5A8: 0x61A1, + 0xE5A9: 0x618D, + 0xE5AA: 0x6166, + 0xE5AB: 0x61B3, + 0xE5AC: 0x622D, + 0xE5AD: 0x646E, + 0xE5AE: 0x6470, + 0xE5AF: 0x6496, + 0xE5B0: 0x64A0, + 0xE5B1: 0x6485, + 0xE5B2: 0x6497, + 0xE5B3: 0x649C, + 0xE5B4: 0x648F, + 0xE5B5: 0x648B, + 0xE5B6: 0x648A, + 0xE5B7: 0x648C, + 0xE5B8: 0x64A3, + 0xE5B9: 0x649F, + 0xE5BA: 0x6468, + 0xE5BB: 0x64B1, + 0xE5BC: 0x6498, + 0xE5BD: 0x6576, + 0xE5BE: 0x657A, + 0xE5BF: 0x6579, + 0xE5C0: 0x657B, + 0xE5C1: 0x65B2, + 0xE5C2: 0x65B3, + 0xE5C3: 0x66B5, + 0xE5C4: 0x66B0, + 0xE5C5: 0x66A9, + 0xE5C6: 0x66B2, + 0xE5C7: 0x66B7, + 0xE5C8: 0x66AA, + 0xE5C9: 0x66AF, + 0xE5CA: 0x6A00, + 0xE5CB: 0x6A06, + 0xE5CC: 0x6A17, + 0xE5CD: 0x69E5, + 0xE5CE: 0x69F8, + 0xE5CF: 0x6A15, + 0xE5D0: 0x69F1, + 0xE5D1: 0x69E4, + 0xE5D2: 0x6A20, + 0xE5D3: 0x69FF, + 0xE5D4: 0x69EC, + 0xE5D5: 0x69E2, + 0xE5D6: 0x6A1B, + 0xE5D7: 0x6A1D, + 0xE5D8: 0x69FE, + 0xE5D9: 0x6A27, + 0xE5DA: 0x69F2, + 0xE5DB: 0x69EE, + 0xE5DC: 0x6A14, + 0xE5DD: 0x69F7, + 0xE5DE: 0x69E7, + 0xE5DF: 0x6A40, + 0xE5E0: 0x6A08, + 0xE5E1: 0x69E6, + 0xE5E2: 0x69FB, + 0xE5E3: 0x6A0D, + 0xE5E4: 0x69FC, + 0xE5E5: 0x69EB, + 0xE5E6: 0x6A09, + 0xE5E7: 0x6A04, + 0xE5E8: 0x6A18, + 0xE5E9: 0x6A25, + 0xE5EA: 0x6A0F, + 0xE5EB: 0x69F6, + 0xE5EC: 0x6A26, + 0xE5ED: 0x6A07, + 0xE5EE: 0x69F4, + 0xE5EF: 0x6A16, + 0xE5F0: 0x6B51, + 0xE5F1: 0x6BA5, + 0xE5F2: 0x6BA3, + 0xE5F3: 0x6BA2, + 0xE5F4: 0x6BA6, + 0xE5F5: 0x6C01, + 0xE5F6: 0x6C00, + 0xE5F7: 0x6BFF, + 0xE5F8: 0x6C02, + 0xE5F9: 0x6F41, + 0xE5FA: 0x6F26, + 0xE5FB: 0x6F7E, + 0xE5FC: 0x6F87, + 0xE5FD: 0x6FC6, + 0xE5FE: 0x6F92, + 0xE640: 0x6F8D, + 0xE641: 0x6F89, + 0xE642: 0x6F8C, + 0xE643: 0x6F62, + 0xE644: 0x6F4F, + 0xE645: 0x6F85, + 0xE646: 0x6F5A, + 0xE647: 0x6F96, + 0xE648: 0x6F76, + 0xE649: 0x6F6C, + 0xE64A: 0x6F82, + 0xE64B: 0x6F55, + 0xE64C: 0x6F72, + 0xE64D: 0x6F52, + 0xE64E: 0x6F50, + 0xE64F: 0x6F57, + 0xE650: 0x6F94, + 0xE651: 0x6F93, + 0xE652: 0x6F5D, + 0xE653: 0x6F00, + 0xE654: 0x6F61, + 0xE655: 0x6F6B, + 0xE656: 0x6F7D, + 0xE657: 0x6F67, + 0xE658: 0x6F90, + 0xE659: 0x6F53, + 0xE65A: 0x6F8B, + 0xE65B: 0x6F69, + 0xE65C: 0x6F7F, + 0xE65D: 0x6F95, + 0xE65E: 0x6F63, + 0xE65F: 0x6F77, + 0xE660: 0x6F6A, + 0xE661: 0x6F7B, + 0xE662: 0x71B2, + 0xE663: 0x71AF, + 0xE664: 0x719B, + 0xE665: 0x71B0, + 0xE666: 0x71A0, + 0xE667: 0x719A, + 0xE668: 0x71A9, + 0xE669: 0x71B5, + 0xE66A: 0x719D, + 0xE66B: 0x71A5, + 0xE66C: 0x719E, + 0xE66D: 0x71A4, + 0xE66E: 0x71A1, + 0xE66F: 0x71AA, + 0xE670: 0x719C, + 0xE671: 0x71A7, + 0xE672: 0x71B3, + 0xE673: 0x7298, + 0xE674: 0x729A, + 0xE675: 0x7358, + 0xE676: 0x7352, + 0xE677: 0x735E, + 0xE678: 0x735F, + 0xE679: 0x7360, + 0xE67A: 0x735D, + 0xE67B: 0x735B, + 0xE67C: 0x7361, + 0xE67D: 0x735A, + 0xE67E: 0x7359, + 0xE6A1: 0x7362, + 0xE6A2: 0x7487, + 0xE6A3: 0x7489, + 0xE6A4: 0x748A, + 0xE6A5: 0x7486, + 0xE6A6: 0x7481, + 0xE6A7: 0x747D, + 0xE6A8: 0x7485, + 0xE6A9: 0x7488, + 0xE6AA: 0x747C, + 0xE6AB: 0x7479, + 0xE6AC: 0x7508, + 0xE6AD: 0x7507, + 0xE6AE: 0x757E, + 0xE6AF: 0x7625, + 0xE6B0: 0x761E, + 0xE6B1: 0x7619, + 0xE6B2: 0x761D, + 0xE6B3: 0x761C, + 0xE6B4: 0x7623, + 0xE6B5: 0x761A, + 0xE6B6: 0x7628, + 0xE6B7: 0x761B, + 0xE6B8: 0x769C, + 0xE6B9: 0x769D, + 0xE6BA: 0x769E, + 0xE6BB: 0x769B, + 0xE6BC: 0x778D, + 0xE6BD: 0x778F, + 0xE6BE: 0x7789, + 0xE6BF: 0x7788, + 0xE6C0: 0x78CD, + 0xE6C1: 0x78BB, + 0xE6C2: 0x78CF, + 0xE6C3: 0x78CC, + 0xE6C4: 0x78D1, + 0xE6C5: 0x78CE, + 0xE6C6: 0x78D4, + 0xE6C7: 0x78C8, + 0xE6C8: 0x78C3, + 0xE6C9: 0x78C4, + 0xE6CA: 0x78C9, + 0xE6CB: 0x799A, + 0xE6CC: 0x79A1, + 0xE6CD: 0x79A0, + 0xE6CE: 0x799C, + 0xE6CF: 0x79A2, + 0xE6D0: 0x799B, + 0xE6D1: 0x6B76, + 0xE6D2: 0x7A39, + 0xE6D3: 0x7AB2, + 0xE6D4: 0x7AB4, + 0xE6D5: 0x7AB3, + 0xE6D6: 0x7BB7, + 0xE6D7: 0x7BCB, + 0xE6D8: 0x7BBE, + 0xE6D9: 0x7BAC, + 0xE6DA: 0x7BCE, + 0xE6DB: 0x7BAF, + 0xE6DC: 0x7BB9, + 0xE6DD: 0x7BCA, + 0xE6DE: 0x7BB5, + 0xE6DF: 0x7CC5, + 0xE6E0: 0x7CC8, + 0xE6E1: 0x7CCC, + 0xE6E2: 0x7CCB, + 0xE6E3: 0x7DF7, + 0xE6E4: 0x7DDB, + 0xE6E5: 0x7DEA, + 0xE6E6: 0x7DE7, + 0xE6E7: 0x7DD7, + 0xE6E8: 0x7DE1, + 0xE6E9: 0x7E03, + 0xE6EA: 0x7DFA, + 0xE6EB: 0x7DE6, + 0xE6EC: 0x7DF6, + 0xE6ED: 0x7DF1, + 0xE6EE: 0x7DF0, + 0xE6EF: 0x7DEE, + 0xE6F0: 0x7DDF, + 0xE6F1: 0x7F76, + 0xE6F2: 0x7FAC, + 0xE6F3: 0x7FB0, + 0xE6F4: 0x7FAD, + 0xE6F5: 0x7FED, + 0xE6F6: 0x7FEB, + 0xE6F7: 0x7FEA, + 0xE6F8: 0x7FEC, + 0xE6F9: 0x7FE6, + 0xE6FA: 0x7FE8, + 0xE6FB: 0x8064, + 0xE6FC: 0x8067, + 0xE6FD: 0x81A3, + 0xE6FE: 0x819F, + 0xE740: 0x819E, + 0xE741: 0x8195, + 0xE742: 0x81A2, + 0xE743: 0x8199, + 0xE744: 0x8197, + 0xE745: 0x8216, + 0xE746: 0x824F, + 0xE747: 0x8253, + 0xE748: 0x8252, + 0xE749: 0x8250, + 0xE74A: 0x824E, + 0xE74B: 0x8251, + 0xE74C: 0x8524, + 0xE74D: 0x853B, + 0xE74E: 0x850F, + 0xE74F: 0x8500, + 0xE750: 0x8529, + 0xE751: 0x850E, + 0xE752: 0x8509, + 0xE753: 0x850D, + 0xE754: 0x851F, + 0xE755: 0x850A, + 0xE756: 0x8527, + 0xE757: 0x851C, + 0xE758: 0x84FB, + 0xE759: 0x852B, + 0xE75A: 0x84FA, + 0xE75B: 0x8508, + 0xE75C: 0x850C, + 0xE75D: 0x84F4, + 0xE75E: 0x852A, + 0xE75F: 0x84F2, + 0xE760: 0x8515, + 0xE761: 0x84F7, + 0xE762: 0x84EB, + 0xE763: 0x84F3, + 0xE764: 0x84FC, + 0xE765: 0x8512, + 0xE766: 0x84EA, + 0xE767: 0x84E9, + 0xE768: 0x8516, + 0xE769: 0x84FE, + 0xE76A: 0x8528, + 0xE76B: 0x851D, + 0xE76C: 0x852E, + 0xE76D: 0x8502, + 0xE76E: 0x84FD, + 0xE76F: 0x851E, + 0xE770: 0x84F6, + 0xE771: 0x8531, + 0xE772: 0x8526, + 0xE773: 0x84E7, + 0xE774: 0x84E8, + 0xE775: 0x84F0, + 0xE776: 0x84EF, + 0xE777: 0x84F9, + 0xE778: 0x8518, + 0xE779: 0x8520, + 0xE77A: 0x8530, + 0xE77B: 0x850B, + 0xE77C: 0x8519, + 0xE77D: 0x852F, + 0xE77E: 0x8662, + 0xE7A1: 0x8756, + 0xE7A2: 0x8763, + 0xE7A3: 0x8764, + 0xE7A4: 0x8777, + 0xE7A5: 0x87E1, + 0xE7A6: 0x8773, + 0xE7A7: 0x8758, + 0xE7A8: 0x8754, + 0xE7A9: 0x875B, + 0xE7AA: 0x8752, + 0xE7AB: 0x8761, + 0xE7AC: 0x875A, + 0xE7AD: 0x8751, + 0xE7AE: 0x875E, + 0xE7AF: 0x876D, + 0xE7B0: 0x876A, + 0xE7B1: 0x8750, + 0xE7B2: 0x874E, + 0xE7B3: 0x875F, + 0xE7B4: 0x875D, + 0xE7B5: 0x876F, + 0xE7B6: 0x876C, + 0xE7B7: 0x877A, + 0xE7B8: 0x876E, + 0xE7B9: 0x875C, + 0xE7BA: 0x8765, + 0xE7BB: 0x874F, + 0xE7BC: 0x877B, + 0xE7BD: 0x8775, + 0xE7BE: 0x8762, + 0xE7BF: 0x8767, + 0xE7C0: 0x8769, + 0xE7C1: 0x885A, + 0xE7C2: 0x8905, + 0xE7C3: 0x890C, + 0xE7C4: 0x8914, + 0xE7C5: 0x890B, + 0xE7C6: 0x8917, + 0xE7C7: 0x8918, + 0xE7C8: 0x8919, + 0xE7C9: 0x8906, + 0xE7CA: 0x8916, + 0xE7CB: 0x8911, + 0xE7CC: 0x890E, + 0xE7CD: 0x8909, + 0xE7CE: 0x89A2, + 0xE7CF: 0x89A4, + 0xE7D0: 0x89A3, + 0xE7D1: 0x89ED, + 0xE7D2: 0x89F0, + 0xE7D3: 0x89EC, + 0xE7D4: 0x8ACF, + 0xE7D5: 0x8AC6, + 0xE7D6: 0x8AB8, + 0xE7D7: 0x8AD3, + 0xE7D8: 0x8AD1, + 0xE7D9: 0x8AD4, + 0xE7DA: 0x8AD5, + 0xE7DB: 0x8ABB, + 0xE7DC: 0x8AD7, + 0xE7DD: 0x8ABE, + 0xE7DE: 0x8AC0, + 0xE7DF: 0x8AC5, + 0xE7E0: 0x8AD8, + 0xE7E1: 0x8AC3, + 0xE7E2: 0x8ABA, + 0xE7E3: 0x8ABD, + 0xE7E4: 0x8AD9, + 0xE7E5: 0x8C3E, + 0xE7E6: 0x8C4D, + 0xE7E7: 0x8C8F, + 0xE7E8: 0x8CE5, + 0xE7E9: 0x8CDF, + 0xE7EA: 0x8CD9, + 0xE7EB: 0x8CE8, + 0xE7EC: 0x8CDA, + 0xE7ED: 0x8CDD, + 0xE7EE: 0x8CE7, + 0xE7EF: 0x8DA0, + 0xE7F0: 0x8D9C, + 0xE7F1: 0x8DA1, + 0xE7F2: 0x8D9B, + 0xE7F3: 0x8E20, + 0xE7F4: 0x8E23, + 0xE7F5: 0x8E25, + 0xE7F6: 0x8E24, + 0xE7F7: 0x8E2E, + 0xE7F8: 0x8E15, + 0xE7F9: 0x8E1B, + 0xE7FA: 0x8E16, + 0xE7FB: 0x8E11, + 0xE7FC: 0x8E19, + 0xE7FD: 0x8E26, + 0xE7FE: 0x8E27, + 0xE840: 0x8E14, + 0xE841: 0x8E12, + 0xE842: 0x8E18, + 0xE843: 0x8E13, + 0xE844: 0x8E1C, + 0xE845: 0x8E17, + 0xE846: 0x8E1A, + 0xE847: 0x8F2C, + 0xE848: 0x8F24, + 0xE849: 0x8F18, + 0xE84A: 0x8F1A, + 0xE84B: 0x8F20, + 0xE84C: 0x8F23, + 0xE84D: 0x8F16, + 0xE84E: 0x8F17, + 0xE84F: 0x9073, + 0xE850: 0x9070, + 0xE851: 0x906F, + 0xE852: 0x9067, + 0xE853: 0x906B, + 0xE854: 0x912F, + 0xE855: 0x912B, + 0xE856: 0x9129, + 0xE857: 0x912A, + 0xE858: 0x9132, + 0xE859: 0x9126, + 0xE85A: 0x912E, + 0xE85B: 0x9185, + 0xE85C: 0x9186, + 0xE85D: 0x918A, + 0xE85E: 0x9181, + 0xE85F: 0x9182, + 0xE860: 0x9184, + 0xE861: 0x9180, + 0xE862: 0x92D0, + 0xE863: 0x92C3, + 0xE864: 0x92C4, + 0xE865: 0x92C0, + 0xE866: 0x92D9, + 0xE867: 0x92B6, + 0xE868: 0x92CF, + 0xE869: 0x92F1, + 0xE86A: 0x92DF, + 0xE86B: 0x92D8, + 0xE86C: 0x92E9, + 0xE86D: 0x92D7, + 0xE86E: 0x92DD, + 0xE86F: 0x92CC, + 0xE870: 0x92EF, + 0xE871: 0x92C2, + 0xE872: 0x92E8, + 0xE873: 0x92CA, + 0xE874: 0x92C8, + 0xE875: 0x92CE, + 0xE876: 0x92E6, + 0xE877: 0x92CD, + 0xE878: 0x92D5, + 0xE879: 0x92C9, + 0xE87A: 0x92E0, + 0xE87B: 0x92DE, + 0xE87C: 0x92E7, + 0xE87D: 0x92D1, + 0xE87E: 0x92D3, + 0xE8A1: 0x92B5, + 0xE8A2: 0x92E1, + 0xE8A3: 0x92C6, + 0xE8A4: 0x92B4, + 0xE8A5: 0x957C, + 0xE8A6: 0x95AC, + 0xE8A7: 0x95AB, + 0xE8A8: 0x95AE, + 0xE8A9: 0x95B0, + 0xE8AA: 0x96A4, + 0xE8AB: 0x96A2, + 0xE8AC: 0x96D3, + 0xE8AD: 0x9705, + 0xE8AE: 0x9708, + 0xE8AF: 0x9702, + 0xE8B0: 0x975A, + 0xE8B1: 0x978A, + 0xE8B2: 0x978E, + 0xE8B3: 0x9788, + 0xE8B4: 0x97D0, + 0xE8B5: 0x97CF, + 0xE8B6: 0x981E, + 0xE8B7: 0x981D, + 0xE8B8: 0x9826, + 0xE8B9: 0x9829, + 0xE8BA: 0x9828, + 0xE8BB: 0x9820, + 0xE8BC: 0x981B, + 0xE8BD: 0x9827, + 0xE8BE: 0x98B2, + 0xE8BF: 0x9908, + 0xE8C0: 0x98FA, + 0xE8C1: 0x9911, + 0xE8C2: 0x9914, + 0xE8C3: 0x9916, + 0xE8C4: 0x9917, + 0xE8C5: 0x9915, + 0xE8C6: 0x99DC, + 0xE8C7: 0x99CD, + 0xE8C8: 0x99CF, + 0xE8C9: 0x99D3, + 0xE8CA: 0x99D4, + 0xE8CB: 0x99CE, + 0xE8CC: 0x99C9, + 0xE8CD: 0x99D6, + 0xE8CE: 0x99D8, + 0xE8CF: 0x99CB, + 0xE8D0: 0x99D7, + 0xE8D1: 0x99CC, + 0xE8D2: 0x9AB3, + 0xE8D3: 0x9AEC, + 0xE8D4: 0x9AEB, + 0xE8D5: 0x9AF3, + 0xE8D6: 0x9AF2, + 0xE8D7: 0x9AF1, + 0xE8D8: 0x9B46, + 0xE8D9: 0x9B43, + 0xE8DA: 0x9B67, + 0xE8DB: 0x9B74, + 0xE8DC: 0x9B71, + 0xE8DD: 0x9B66, + 0xE8DE: 0x9B76, + 0xE8DF: 0x9B75, + 0xE8E0: 0x9B70, + 0xE8E1: 0x9B68, + 0xE8E2: 0x9B64, + 0xE8E3: 0x9B6C, + 0xE8E4: 0x9CFC, + 0xE8E5: 0x9CFA, + 0xE8E6: 0x9CFD, + 0xE8E7: 0x9CFF, + 0xE8E8: 0x9CF7, + 0xE8E9: 0x9D07, + 0xE8EA: 0x9D00, + 0xE8EB: 0x9CF9, + 0xE8EC: 0x9CFB, + 0xE8ED: 0x9D08, + 0xE8EE: 0x9D05, + 0xE8EF: 0x9D04, + 0xE8F0: 0x9E83, + 0xE8F1: 0x9ED3, + 0xE8F2: 0x9F0F, + 0xE8F3: 0x9F10, + 0xE8F4: 0x511C, + 0xE8F5: 0x5113, + 0xE8F6: 0x5117, + 0xE8F7: 0x511A, + 0xE8F8: 0x5111, + 0xE8F9: 0x51DE, + 0xE8FA: 0x5334, + 0xE8FB: 0x53E1, + 0xE8FC: 0x5670, + 0xE8FD: 0x5660, + 0xE8FE: 0x566E, + 0xE940: 0x5673, + 0xE941: 0x5666, + 0xE942: 0x5663, + 0xE943: 0x566D, + 0xE944: 0x5672, + 0xE945: 0x565E, + 0xE946: 0x5677, + 0xE947: 0x571C, + 0xE948: 0x571B, + 0xE949: 0x58C8, + 0xE94A: 0x58BD, + 0xE94B: 0x58C9, + 0xE94C: 0x58BF, + 0xE94D: 0x58BA, + 0xE94E: 0x58C2, + 0xE94F: 0x58BC, + 0xE950: 0x58C6, + 0xE951: 0x5B17, + 0xE952: 0x5B19, + 0xE953: 0x5B1B, + 0xE954: 0x5B21, + 0xE955: 0x5B14, + 0xE956: 0x5B13, + 0xE957: 0x5B10, + 0xE958: 0x5B16, + 0xE959: 0x5B28, + 0xE95A: 0x5B1A, + 0xE95B: 0x5B20, + 0xE95C: 0x5B1E, + 0xE95D: 0x5BEF, + 0xE95E: 0x5DAC, + 0xE95F: 0x5DB1, + 0xE960: 0x5DA9, + 0xE961: 0x5DA7, + 0xE962: 0x5DB5, + 0xE963: 0x5DB0, + 0xE964: 0x5DAE, + 0xE965: 0x5DAA, + 0xE966: 0x5DA8, + 0xE967: 0x5DB2, + 0xE968: 0x5DAD, + 0xE969: 0x5DAF, + 0xE96A: 0x5DB4, + 0xE96B: 0x5E67, + 0xE96C: 0x5E68, + 0xE96D: 0x5E66, + 0xE96E: 0x5E6F, + 0xE96F: 0x5EE9, + 0xE970: 0x5EE7, + 0xE971: 0x5EE6, + 0xE972: 0x5EE8, + 0xE973: 0x5EE5, + 0xE974: 0x5F4B, + 0xE975: 0x5FBC, + 0xE976: 0x619D, + 0xE977: 0x61A8, + 0xE978: 0x6196, + 0xE979: 0x61C5, + 0xE97A: 0x61B4, + 0xE97B: 0x61C6, + 0xE97C: 0x61C1, + 0xE97D: 0x61CC, + 0xE97E: 0x61BA, + 0xE9A1: 0x61BF, + 0xE9A2: 0x61B8, + 0xE9A3: 0x618C, + 0xE9A4: 0x64D7, + 0xE9A5: 0x64D6, + 0xE9A6: 0x64D0, + 0xE9A7: 0x64CF, + 0xE9A8: 0x64C9, + 0xE9A9: 0x64BD, + 0xE9AA: 0x6489, + 0xE9AB: 0x64C3, + 0xE9AC: 0x64DB, + 0xE9AD: 0x64F3, + 0xE9AE: 0x64D9, + 0xE9AF: 0x6533, + 0xE9B0: 0x657F, + 0xE9B1: 0x657C, + 0xE9B2: 0x65A2, + 0xE9B3: 0x66C8, + 0xE9B4: 0x66BE, + 0xE9B5: 0x66C0, + 0xE9B6: 0x66CA, + 0xE9B7: 0x66CB, + 0xE9B8: 0x66CF, + 0xE9B9: 0x66BD, + 0xE9BA: 0x66BB, + 0xE9BB: 0x66BA, + 0xE9BC: 0x66CC, + 0xE9BD: 0x6723, + 0xE9BE: 0x6A34, + 0xE9BF: 0x6A66, + 0xE9C0: 0x6A49, + 0xE9C1: 0x6A67, + 0xE9C2: 0x6A32, + 0xE9C3: 0x6A68, + 0xE9C4: 0x6A3E, + 0xE9C5: 0x6A5D, + 0xE9C6: 0x6A6D, + 0xE9C7: 0x6A76, + 0xE9C8: 0x6A5B, + 0xE9C9: 0x6A51, + 0xE9CA: 0x6A28, + 0xE9CB: 0x6A5A, + 0xE9CC: 0x6A3B, + 0xE9CD: 0x6A3F, + 0xE9CE: 0x6A41, + 0xE9CF: 0x6A6A, + 0xE9D0: 0x6A64, + 0xE9D1: 0x6A50, + 0xE9D2: 0x6A4F, + 0xE9D3: 0x6A54, + 0xE9D4: 0x6A6F, + 0xE9D5: 0x6A69, + 0xE9D6: 0x6A60, + 0xE9D7: 0x6A3C, + 0xE9D8: 0x6A5E, + 0xE9D9: 0x6A56, + 0xE9DA: 0x6A55, + 0xE9DB: 0x6A4D, + 0xE9DC: 0x6A4E, + 0xE9DD: 0x6A46, + 0xE9DE: 0x6B55, + 0xE9DF: 0x6B54, + 0xE9E0: 0x6B56, + 0xE9E1: 0x6BA7, + 0xE9E2: 0x6BAA, + 0xE9E3: 0x6BAB, + 0xE9E4: 0x6BC8, + 0xE9E5: 0x6BC7, + 0xE9E6: 0x6C04, + 0xE9E7: 0x6C03, + 0xE9E8: 0x6C06, + 0xE9E9: 0x6FAD, + 0xE9EA: 0x6FCB, + 0xE9EB: 0x6FA3, + 0xE9EC: 0x6FC7, + 0xE9ED: 0x6FBC, + 0xE9EE: 0x6FCE, + 0xE9EF: 0x6FC8, + 0xE9F0: 0x6F5E, + 0xE9F1: 0x6FC4, + 0xE9F2: 0x6FBD, + 0xE9F3: 0x6F9E, + 0xE9F4: 0x6FCA, + 0xE9F5: 0x6FA8, + 0xE9F6: 0x7004, + 0xE9F7: 0x6FA5, + 0xE9F8: 0x6FAE, + 0xE9F9: 0x6FBA, + 0xE9FA: 0x6FAC, + 0xE9FB: 0x6FAA, + 0xE9FC: 0x6FCF, + 0xE9FD: 0x6FBF, + 0xE9FE: 0x6FB8, + 0xEA40: 0x6FA2, + 0xEA41: 0x6FC9, + 0xEA42: 0x6FAB, + 0xEA43: 0x6FCD, + 0xEA44: 0x6FAF, + 0xEA45: 0x6FB2, + 0xEA46: 0x6FB0, + 0xEA47: 0x71C5, + 0xEA48: 0x71C2, + 0xEA49: 0x71BF, + 0xEA4A: 0x71B8, + 0xEA4B: 0x71D6, + 0xEA4C: 0x71C0, + 0xEA4D: 0x71C1, + 0xEA4E: 0x71CB, + 0xEA4F: 0x71D4, + 0xEA50: 0x71CA, + 0xEA51: 0x71C7, + 0xEA52: 0x71CF, + 0xEA53: 0x71BD, + 0xEA54: 0x71D8, + 0xEA55: 0x71BC, + 0xEA56: 0x71C6, + 0xEA57: 0x71DA, + 0xEA58: 0x71DB, + 0xEA59: 0x729D, + 0xEA5A: 0x729E, + 0xEA5B: 0x7369, + 0xEA5C: 0x7366, + 0xEA5D: 0x7367, + 0xEA5E: 0x736C, + 0xEA5F: 0x7365, + 0xEA60: 0x736B, + 0xEA61: 0x736A, + 0xEA62: 0x747F, + 0xEA63: 0x749A, + 0xEA64: 0x74A0, + 0xEA65: 0x7494, + 0xEA66: 0x7492, + 0xEA67: 0x7495, + 0xEA68: 0x74A1, + 0xEA69: 0x750B, + 0xEA6A: 0x7580, + 0xEA6B: 0x762F, + 0xEA6C: 0x762D, + 0xEA6D: 0x7631, + 0xEA6E: 0x763D, + 0xEA6F: 0x7633, + 0xEA70: 0x763C, + 0xEA71: 0x7635, + 0xEA72: 0x7632, + 0xEA73: 0x7630, + 0xEA74: 0x76BB, + 0xEA75: 0x76E6, + 0xEA76: 0x779A, + 0xEA77: 0x779D, + 0xEA78: 0x77A1, + 0xEA79: 0x779C, + 0xEA7A: 0x779B, + 0xEA7B: 0x77A2, + 0xEA7C: 0x77A3, + 0xEA7D: 0x7795, + 0xEA7E: 0x7799, + 0xEAA1: 0x7797, + 0xEAA2: 0x78DD, + 0xEAA3: 0x78E9, + 0xEAA4: 0x78E5, + 0xEAA5: 0x78EA, + 0xEAA6: 0x78DE, + 0xEAA7: 0x78E3, + 0xEAA8: 0x78DB, + 0xEAA9: 0x78E1, + 0xEAAA: 0x78E2, + 0xEAAB: 0x78ED, + 0xEAAC: 0x78DF, + 0xEAAD: 0x78E0, + 0xEAAE: 0x79A4, + 0xEAAF: 0x7A44, + 0xEAB0: 0x7A48, + 0xEAB1: 0x7A47, + 0xEAB2: 0x7AB6, + 0xEAB3: 0x7AB8, + 0xEAB4: 0x7AB5, + 0xEAB5: 0x7AB1, + 0xEAB6: 0x7AB7, + 0xEAB7: 0x7BDE, + 0xEAB8: 0x7BE3, + 0xEAB9: 0x7BE7, + 0xEABA: 0x7BDD, + 0xEABB: 0x7BD5, + 0xEABC: 0x7BE5, + 0xEABD: 0x7BDA, + 0xEABE: 0x7BE8, + 0xEABF: 0x7BF9, + 0xEAC0: 0x7BD4, + 0xEAC1: 0x7BEA, + 0xEAC2: 0x7BE2, + 0xEAC3: 0x7BDC, + 0xEAC4: 0x7BEB, + 0xEAC5: 0x7BD8, + 0xEAC6: 0x7BDF, + 0xEAC7: 0x7CD2, + 0xEAC8: 0x7CD4, + 0xEAC9: 0x7CD7, + 0xEACA: 0x7CD0, + 0xEACB: 0x7CD1, + 0xEACC: 0x7E12, + 0xEACD: 0x7E21, + 0xEACE: 0x7E17, + 0xEACF: 0x7E0C, + 0xEAD0: 0x7E1F, + 0xEAD1: 0x7E20, + 0xEAD2: 0x7E13, + 0xEAD3: 0x7E0E, + 0xEAD4: 0x7E1C, + 0xEAD5: 0x7E15, + 0xEAD6: 0x7E1A, + 0xEAD7: 0x7E22, + 0xEAD8: 0x7E0B, + 0xEAD9: 0x7E0F, + 0xEADA: 0x7E16, + 0xEADB: 0x7E0D, + 0xEADC: 0x7E14, + 0xEADD: 0x7E25, + 0xEADE: 0x7E24, + 0xEADF: 0x7F43, + 0xEAE0: 0x7F7B, + 0xEAE1: 0x7F7C, + 0xEAE2: 0x7F7A, + 0xEAE3: 0x7FB1, + 0xEAE4: 0x7FEF, + 0xEAE5: 0x802A, + 0xEAE6: 0x8029, + 0xEAE7: 0x806C, + 0xEAE8: 0x81B1, + 0xEAE9: 0x81A6, + 0xEAEA: 0x81AE, + 0xEAEB: 0x81B9, + 0xEAEC: 0x81B5, + 0xEAED: 0x81AB, + 0xEAEE: 0x81B0, + 0xEAEF: 0x81AC, + 0xEAF0: 0x81B4, + 0xEAF1: 0x81B2, + 0xEAF2: 0x81B7, + 0xEAF3: 0x81A7, + 0xEAF4: 0x81F2, + 0xEAF5: 0x8255, + 0xEAF6: 0x8256, + 0xEAF7: 0x8257, + 0xEAF8: 0x8556, + 0xEAF9: 0x8545, + 0xEAFA: 0x856B, + 0xEAFB: 0x854D, + 0xEAFC: 0x8553, + 0xEAFD: 0x8561, + 0xEAFE: 0x8558, + 0xEB40: 0x8540, + 0xEB41: 0x8546, + 0xEB42: 0x8564, + 0xEB43: 0x8541, + 0xEB44: 0x8562, + 0xEB45: 0x8544, + 0xEB46: 0x8551, + 0xEB47: 0x8547, + 0xEB48: 0x8563, + 0xEB49: 0x853E, + 0xEB4A: 0x855B, + 0xEB4B: 0x8571, + 0xEB4C: 0x854E, + 0xEB4D: 0x856E, + 0xEB4E: 0x8575, + 0xEB4F: 0x8555, + 0xEB50: 0x8567, + 0xEB51: 0x8560, + 0xEB52: 0x858C, + 0xEB53: 0x8566, + 0xEB54: 0x855D, + 0xEB55: 0x8554, + 0xEB56: 0x8565, + 0xEB57: 0x856C, + 0xEB58: 0x8663, + 0xEB59: 0x8665, + 0xEB5A: 0x8664, + 0xEB5B: 0x879B, + 0xEB5C: 0x878F, + 0xEB5D: 0x8797, + 0xEB5E: 0x8793, + 0xEB5F: 0x8792, + 0xEB60: 0x8788, + 0xEB61: 0x8781, + 0xEB62: 0x8796, + 0xEB63: 0x8798, + 0xEB64: 0x8779, + 0xEB65: 0x8787, + 0xEB66: 0x87A3, + 0xEB67: 0x8785, + 0xEB68: 0x8790, + 0xEB69: 0x8791, + 0xEB6A: 0x879D, + 0xEB6B: 0x8784, + 0xEB6C: 0x8794, + 0xEB6D: 0x879C, + 0xEB6E: 0x879A, + 0xEB6F: 0x8789, + 0xEB70: 0x891E, + 0xEB71: 0x8926, + 0xEB72: 0x8930, + 0xEB73: 0x892D, + 0xEB74: 0x892E, + 0xEB75: 0x8927, + 0xEB76: 0x8931, + 0xEB77: 0x8922, + 0xEB78: 0x8929, + 0xEB79: 0x8923, + 0xEB7A: 0x892F, + 0xEB7B: 0x892C, + 0xEB7C: 0x891F, + 0xEB7D: 0x89F1, + 0xEB7E: 0x8AE0, + 0xEBA1: 0x8AE2, + 0xEBA2: 0x8AF2, + 0xEBA3: 0x8AF4, + 0xEBA4: 0x8AF5, + 0xEBA5: 0x8ADD, + 0xEBA6: 0x8B14, + 0xEBA7: 0x8AE4, + 0xEBA8: 0x8ADF, + 0xEBA9: 0x8AF0, + 0xEBAA: 0x8AC8, + 0xEBAB: 0x8ADE, + 0xEBAC: 0x8AE1, + 0xEBAD: 0x8AE8, + 0xEBAE: 0x8AFF, + 0xEBAF: 0x8AEF, + 0xEBB0: 0x8AFB, + 0xEBB1: 0x8C91, + 0xEBB2: 0x8C92, + 0xEBB3: 0x8C90, + 0xEBB4: 0x8CF5, + 0xEBB5: 0x8CEE, + 0xEBB6: 0x8CF1, + 0xEBB7: 0x8CF0, + 0xEBB8: 0x8CF3, + 0xEBB9: 0x8D6C, + 0xEBBA: 0x8D6E, + 0xEBBB: 0x8DA5, + 0xEBBC: 0x8DA7, + 0xEBBD: 0x8E33, + 0xEBBE: 0x8E3E, + 0xEBBF: 0x8E38, + 0xEBC0: 0x8E40, + 0xEBC1: 0x8E45, + 0xEBC2: 0x8E36, + 0xEBC3: 0x8E3C, + 0xEBC4: 0x8E3D, + 0xEBC5: 0x8E41, + 0xEBC6: 0x8E30, + 0xEBC7: 0x8E3F, + 0xEBC8: 0x8EBD, + 0xEBC9: 0x8F36, + 0xEBCA: 0x8F2E, + 0xEBCB: 0x8F35, + 0xEBCC: 0x8F32, + 0xEBCD: 0x8F39, + 0xEBCE: 0x8F37, + 0xEBCF: 0x8F34, + 0xEBD0: 0x9076, + 0xEBD1: 0x9079, + 0xEBD2: 0x907B, + 0xEBD3: 0x9086, + 0xEBD4: 0x90FA, + 0xEBD5: 0x9133, + 0xEBD6: 0x9135, + 0xEBD7: 0x9136, + 0xEBD8: 0x9193, + 0xEBD9: 0x9190, + 0xEBDA: 0x9191, + 0xEBDB: 0x918D, + 0xEBDC: 0x918F, + 0xEBDD: 0x9327, + 0xEBDE: 0x931E, + 0xEBDF: 0x9308, + 0xEBE0: 0x931F, + 0xEBE1: 0x9306, + 0xEBE2: 0x930F, + 0xEBE3: 0x937A, + 0xEBE4: 0x9338, + 0xEBE5: 0x933C, + 0xEBE6: 0x931B, + 0xEBE7: 0x9323, + 0xEBE8: 0x9312, + 0xEBE9: 0x9301, + 0xEBEA: 0x9346, + 0xEBEB: 0x932D, + 0xEBEC: 0x930E, + 0xEBED: 0x930D, + 0xEBEE: 0x92CB, + 0xEBEF: 0x931D, + 0xEBF0: 0x92FA, + 0xEBF1: 0x9325, + 0xEBF2: 0x9313, + 0xEBF3: 0x92F9, + 0xEBF4: 0x92F7, + 0xEBF5: 0x9334, + 0xEBF6: 0x9302, + 0xEBF7: 0x9324, + 0xEBF8: 0x92FF, + 0xEBF9: 0x9329, + 0xEBFA: 0x9339, + 0xEBFB: 0x9335, + 0xEBFC: 0x932A, + 0xEBFD: 0x9314, + 0xEBFE: 0x930C, + 0xEC40: 0x930B, + 0xEC41: 0x92FE, + 0xEC42: 0x9309, + 0xEC43: 0x9300, + 0xEC44: 0x92FB, + 0xEC45: 0x9316, + 0xEC46: 0x95BC, + 0xEC47: 0x95CD, + 0xEC48: 0x95BE, + 0xEC49: 0x95B9, + 0xEC4A: 0x95BA, + 0xEC4B: 0x95B6, + 0xEC4C: 0x95BF, + 0xEC4D: 0x95B5, + 0xEC4E: 0x95BD, + 0xEC4F: 0x96A9, + 0xEC50: 0x96D4, + 0xEC51: 0x970B, + 0xEC52: 0x9712, + 0xEC53: 0x9710, + 0xEC54: 0x9799, + 0xEC55: 0x9797, + 0xEC56: 0x9794, + 0xEC57: 0x97F0, + 0xEC58: 0x97F8, + 0xEC59: 0x9835, + 0xEC5A: 0x982F, + 0xEC5B: 0x9832, + 0xEC5C: 0x9924, + 0xEC5D: 0x991F, + 0xEC5E: 0x9927, + 0xEC5F: 0x9929, + 0xEC60: 0x999E, + 0xEC61: 0x99EE, + 0xEC62: 0x99EC, + 0xEC63: 0x99E5, + 0xEC64: 0x99E4, + 0xEC65: 0x99F0, + 0xEC66: 0x99E3, + 0xEC67: 0x99EA, + 0xEC68: 0x99E9, + 0xEC69: 0x99E7, + 0xEC6A: 0x9AB9, + 0xEC6B: 0x9ABF, + 0xEC6C: 0x9AB4, + 0xEC6D: 0x9ABB, + 0xEC6E: 0x9AF6, + 0xEC6F: 0x9AFA, + 0xEC70: 0x9AF9, + 0xEC71: 0x9AF7, + 0xEC72: 0x9B33, + 0xEC73: 0x9B80, + 0xEC74: 0x9B85, + 0xEC75: 0x9B87, + 0xEC76: 0x9B7C, + 0xEC77: 0x9B7E, + 0xEC78: 0x9B7B, + 0xEC79: 0x9B82, + 0xEC7A: 0x9B93, + 0xEC7B: 0x9B92, + 0xEC7C: 0x9B90, + 0xEC7D: 0x9B7A, + 0xEC7E: 0x9B95, + 0xECA1: 0x9B7D, + 0xECA2: 0x9B88, + 0xECA3: 0x9D25, + 0xECA4: 0x9D17, + 0xECA5: 0x9D20, + 0xECA6: 0x9D1E, + 0xECA7: 0x9D14, + 0xECA8: 0x9D29, + 0xECA9: 0x9D1D, + 0xECAA: 0x9D18, + 0xECAB: 0x9D22, + 0xECAC: 0x9D10, + 0xECAD: 0x9D19, + 0xECAE: 0x9D1F, + 0xECAF: 0x9E88, + 0xECB0: 0x9E86, + 0xECB1: 0x9E87, + 0xECB2: 0x9EAE, + 0xECB3: 0x9EAD, + 0xECB4: 0x9ED5, + 0xECB5: 0x9ED6, + 0xECB6: 0x9EFA, + 0xECB7: 0x9F12, + 0xECB8: 0x9F3D, + 0xECB9: 0x5126, + 0xECBA: 0x5125, + 0xECBB: 0x5122, + 0xECBC: 0x5124, + 0xECBD: 0x5120, + 0xECBE: 0x5129, + 0xECBF: 0x52F4, + 0xECC0: 0x5693, + 0xECC1: 0x568C, + 0xECC2: 0x568D, + 0xECC3: 0x5686, + 0xECC4: 0x5684, + 0xECC5: 0x5683, + 0xECC6: 0x567E, + 0xECC7: 0x5682, + 0xECC8: 0x567F, + 0xECC9: 0x5681, + 0xECCA: 0x58D6, + 0xECCB: 0x58D4, + 0xECCC: 0x58CF, + 0xECCD: 0x58D2, + 0xECCE: 0x5B2D, + 0xECCF: 0x5B25, + 0xECD0: 0x5B32, + 0xECD1: 0x5B23, + 0xECD2: 0x5B2C, + 0xECD3: 0x5B27, + 0xECD4: 0x5B26, + 0xECD5: 0x5B2F, + 0xECD6: 0x5B2E, + 0xECD7: 0x5B7B, + 0xECD8: 0x5BF1, + 0xECD9: 0x5BF2, + 0xECDA: 0x5DB7, + 0xECDB: 0x5E6C, + 0xECDC: 0x5E6A, + 0xECDD: 0x5FBE, + 0xECDE: 0x5FBB, + 0xECDF: 0x61C3, + 0xECE0: 0x61B5, + 0xECE1: 0x61BC, + 0xECE2: 0x61E7, + 0xECE3: 0x61E0, + 0xECE4: 0x61E5, + 0xECE5: 0x61E4, + 0xECE6: 0x61E8, + 0xECE7: 0x61DE, + 0xECE8: 0x64EF, + 0xECE9: 0x64E9, + 0xECEA: 0x64E3, + 0xECEB: 0x64EB, + 0xECEC: 0x64E4, + 0xECED: 0x64E8, + 0xECEE: 0x6581, + 0xECEF: 0x6580, + 0xECF0: 0x65B6, + 0xECF1: 0x65DA, + 0xECF2: 0x66D2, + 0xECF3: 0x6A8D, + 0xECF4: 0x6A96, + 0xECF5: 0x6A81, + 0xECF6: 0x6AA5, + 0xECF7: 0x6A89, + 0xECF8: 0x6A9F, + 0xECF9: 0x6A9B, + 0xECFA: 0x6AA1, + 0xECFB: 0x6A9E, + 0xECFC: 0x6A87, + 0xECFD: 0x6A93, + 0xECFE: 0x6A8E, + 0xED40: 0x6A95, + 0xED41: 0x6A83, + 0xED42: 0x6AA8, + 0xED43: 0x6AA4, + 0xED44: 0x6A91, + 0xED45: 0x6A7F, + 0xED46: 0x6AA6, + 0xED47: 0x6A9A, + 0xED48: 0x6A85, + 0xED49: 0x6A8C, + 0xED4A: 0x6A92, + 0xED4B: 0x6B5B, + 0xED4C: 0x6BAD, + 0xED4D: 0x6C09, + 0xED4E: 0x6FCC, + 0xED4F: 0x6FA9, + 0xED50: 0x6FF4, + 0xED51: 0x6FD4, + 0xED52: 0x6FE3, + 0xED53: 0x6FDC, + 0xED54: 0x6FED, + 0xED55: 0x6FE7, + 0xED56: 0x6FE6, + 0xED57: 0x6FDE, + 0xED58: 0x6FF2, + 0xED59: 0x6FDD, + 0xED5A: 0x6FE2, + 0xED5B: 0x6FE8, + 0xED5C: 0x71E1, + 0xED5D: 0x71F1, + 0xED5E: 0x71E8, + 0xED5F: 0x71F2, + 0xED60: 0x71E4, + 0xED61: 0x71F0, + 0xED62: 0x71E2, + 0xED63: 0x7373, + 0xED64: 0x736E, + 0xED65: 0x736F, + 0xED66: 0x7497, + 0xED67: 0x74B2, + 0xED68: 0x74AB, + 0xED69: 0x7490, + 0xED6A: 0x74AA, + 0xED6B: 0x74AD, + 0xED6C: 0x74B1, + 0xED6D: 0x74A5, + 0xED6E: 0x74AF, + 0xED6F: 0x7510, + 0xED70: 0x7511, + 0xED71: 0x7512, + 0xED72: 0x750F, + 0xED73: 0x7584, + 0xED74: 0x7643, + 0xED75: 0x7648, + 0xED76: 0x7649, + 0xED77: 0x7647, + 0xED78: 0x76A4, + 0xED79: 0x76E9, + 0xED7A: 0x77B5, + 0xED7B: 0x77AB, + 0xED7C: 0x77B2, + 0xED7D: 0x77B7, + 0xED7E: 0x77B6, + 0xEDA1: 0x77B4, + 0xEDA2: 0x77B1, + 0xEDA3: 0x77A8, + 0xEDA4: 0x77F0, + 0xEDA5: 0x78F3, + 0xEDA6: 0x78FD, + 0xEDA7: 0x7902, + 0xEDA8: 0x78FB, + 0xEDA9: 0x78FC, + 0xEDAA: 0x78F2, + 0xEDAB: 0x7905, + 0xEDAC: 0x78F9, + 0xEDAD: 0x78FE, + 0xEDAE: 0x7904, + 0xEDAF: 0x79AB, + 0xEDB0: 0x79A8, + 0xEDB1: 0x7A5C, + 0xEDB2: 0x7A5B, + 0xEDB3: 0x7A56, + 0xEDB4: 0x7A58, + 0xEDB5: 0x7A54, + 0xEDB6: 0x7A5A, + 0xEDB7: 0x7ABE, + 0xEDB8: 0x7AC0, + 0xEDB9: 0x7AC1, + 0xEDBA: 0x7C05, + 0xEDBB: 0x7C0F, + 0xEDBC: 0x7BF2, + 0xEDBD: 0x7C00, + 0xEDBE: 0x7BFF, + 0xEDBF: 0x7BFB, + 0xEDC0: 0x7C0E, + 0xEDC1: 0x7BF4, + 0xEDC2: 0x7C0B, + 0xEDC3: 0x7BF3, + 0xEDC4: 0x7C02, + 0xEDC5: 0x7C09, + 0xEDC6: 0x7C03, + 0xEDC7: 0x7C01, + 0xEDC8: 0x7BF8, + 0xEDC9: 0x7BFD, + 0xEDCA: 0x7C06, + 0xEDCB: 0x7BF0, + 0xEDCC: 0x7BF1, + 0xEDCD: 0x7C10, + 0xEDCE: 0x7C0A, + 0xEDCF: 0x7CE8, + 0xEDD0: 0x7E2D, + 0xEDD1: 0x7E3C, + 0xEDD2: 0x7E42, + 0xEDD3: 0x7E33, + 0xEDD4: 0x9848, + 0xEDD5: 0x7E38, + 0xEDD6: 0x7E2A, + 0xEDD7: 0x7E49, + 0xEDD8: 0x7E40, + 0xEDD9: 0x7E47, + 0xEDDA: 0x7E29, + 0xEDDB: 0x7E4C, + 0xEDDC: 0x7E30, + 0xEDDD: 0x7E3B, + 0xEDDE: 0x7E36, + 0xEDDF: 0x7E44, + 0xEDE0: 0x7E3A, + 0xEDE1: 0x7F45, + 0xEDE2: 0x7F7F, + 0xEDE3: 0x7F7E, + 0xEDE4: 0x7F7D, + 0xEDE5: 0x7FF4, + 0xEDE6: 0x7FF2, + 0xEDE7: 0x802C, + 0xEDE8: 0x81BB, + 0xEDE9: 0x81C4, + 0xEDEA: 0x81CC, + 0xEDEB: 0x81CA, + 0xEDEC: 0x81C5, + 0xEDED: 0x81C7, + 0xEDEE: 0x81BC, + 0xEDEF: 0x81E9, + 0xEDF0: 0x825B, + 0xEDF1: 0x825A, + 0xEDF2: 0x825C, + 0xEDF3: 0x8583, + 0xEDF4: 0x8580, + 0xEDF5: 0x858F, + 0xEDF6: 0x85A7, + 0xEDF7: 0x8595, + 0xEDF8: 0x85A0, + 0xEDF9: 0x858B, + 0xEDFA: 0x85A3, + 0xEDFB: 0x857B, + 0xEDFC: 0x85A4, + 0xEDFD: 0x859A, + 0xEDFE: 0x859E, + 0xEE40: 0x8577, + 0xEE41: 0x857C, + 0xEE42: 0x8589, + 0xEE43: 0x85A1, + 0xEE44: 0x857A, + 0xEE45: 0x8578, + 0xEE46: 0x8557, + 0xEE47: 0x858E, + 0xEE48: 0x8596, + 0xEE49: 0x8586, + 0xEE4A: 0x858D, + 0xEE4B: 0x8599, + 0xEE4C: 0x859D, + 0xEE4D: 0x8581, + 0xEE4E: 0x85A2, + 0xEE4F: 0x8582, + 0xEE50: 0x8588, + 0xEE51: 0x8585, + 0xEE52: 0x8579, + 0xEE53: 0x8576, + 0xEE54: 0x8598, + 0xEE55: 0x8590, + 0xEE56: 0x859F, + 0xEE57: 0x8668, + 0xEE58: 0x87BE, + 0xEE59: 0x87AA, + 0xEE5A: 0x87AD, + 0xEE5B: 0x87C5, + 0xEE5C: 0x87B0, + 0xEE5D: 0x87AC, + 0xEE5E: 0x87B9, + 0xEE5F: 0x87B5, + 0xEE60: 0x87BC, + 0xEE61: 0x87AE, + 0xEE62: 0x87C9, + 0xEE63: 0x87C3, + 0xEE64: 0x87C2, + 0xEE65: 0x87CC, + 0xEE66: 0x87B7, + 0xEE67: 0x87AF, + 0xEE68: 0x87C4, + 0xEE69: 0x87CA, + 0xEE6A: 0x87B4, + 0xEE6B: 0x87B6, + 0xEE6C: 0x87BF, + 0xEE6D: 0x87B8, + 0xEE6E: 0x87BD, + 0xEE6F: 0x87DE, + 0xEE70: 0x87B2, + 0xEE71: 0x8935, + 0xEE72: 0x8933, + 0xEE73: 0x893C, + 0xEE74: 0x893E, + 0xEE75: 0x8941, + 0xEE76: 0x8952, + 0xEE77: 0x8937, + 0xEE78: 0x8942, + 0xEE79: 0x89AD, + 0xEE7A: 0x89AF, + 0xEE7B: 0x89AE, + 0xEE7C: 0x89F2, + 0xEE7D: 0x89F3, + 0xEE7E: 0x8B1E, + 0xEEA1: 0x8B18, + 0xEEA2: 0x8B16, + 0xEEA3: 0x8B11, + 0xEEA4: 0x8B05, + 0xEEA5: 0x8B0B, + 0xEEA6: 0x8B22, + 0xEEA7: 0x8B0F, + 0xEEA8: 0x8B12, + 0xEEA9: 0x8B15, + 0xEEAA: 0x8B07, + 0xEEAB: 0x8B0D, + 0xEEAC: 0x8B08, + 0xEEAD: 0x8B06, + 0xEEAE: 0x8B1C, + 0xEEAF: 0x8B13, + 0xEEB0: 0x8B1A, + 0xEEB1: 0x8C4F, + 0xEEB2: 0x8C70, + 0xEEB3: 0x8C72, + 0xEEB4: 0x8C71, + 0xEEB5: 0x8C6F, + 0xEEB6: 0x8C95, + 0xEEB7: 0x8C94, + 0xEEB8: 0x8CF9, + 0xEEB9: 0x8D6F, + 0xEEBA: 0x8E4E, + 0xEEBB: 0x8E4D, + 0xEEBC: 0x8E53, + 0xEEBD: 0x8E50, + 0xEEBE: 0x8E4C, + 0xEEBF: 0x8E47, + 0xEEC0: 0x8F43, + 0xEEC1: 0x8F40, + 0xEEC2: 0x9085, + 0xEEC3: 0x907E, + 0xEEC4: 0x9138, + 0xEEC5: 0x919A, + 0xEEC6: 0x91A2, + 0xEEC7: 0x919B, + 0xEEC8: 0x9199, + 0xEEC9: 0x919F, + 0xEECA: 0x91A1, + 0xEECB: 0x919D, + 0xEECC: 0x91A0, + 0xEECD: 0x93A1, + 0xEECE: 0x9383, + 0xEECF: 0x93AF, + 0xEED0: 0x9364, + 0xEED1: 0x9356, + 0xEED2: 0x9347, + 0xEED3: 0x937C, + 0xEED4: 0x9358, + 0xEED5: 0x935C, + 0xEED6: 0x9376, + 0xEED7: 0x9349, + 0xEED8: 0x9350, + 0xEED9: 0x9351, + 0xEEDA: 0x9360, + 0xEEDB: 0x936D, + 0xEEDC: 0x938F, + 0xEEDD: 0x934C, + 0xEEDE: 0x936A, + 0xEEDF: 0x9379, + 0xEEE0: 0x9357, + 0xEEE1: 0x9355, + 0xEEE2: 0x9352, + 0xEEE3: 0x934F, + 0xEEE4: 0x9371, + 0xEEE5: 0x9377, + 0xEEE6: 0x937B, + 0xEEE7: 0x9361, + 0xEEE8: 0x935E, + 0xEEE9: 0x9363, + 0xEEEA: 0x9367, + 0xEEEB: 0x9380, + 0xEEEC: 0x934E, + 0xEEED: 0x9359, + 0xEEEE: 0x95C7, + 0xEEEF: 0x95C0, + 0xEEF0: 0x95C9, + 0xEEF1: 0x95C3, + 0xEEF2: 0x95C5, + 0xEEF3: 0x95B7, + 0xEEF4: 0x96AE, + 0xEEF5: 0x96B0, + 0xEEF6: 0x96AC, + 0xEEF7: 0x9720, + 0xEEF8: 0x971F, + 0xEEF9: 0x9718, + 0xEEFA: 0x971D, + 0xEEFB: 0x9719, + 0xEEFC: 0x979A, + 0xEEFD: 0x97A1, + 0xEEFE: 0x979C, + 0xEF40: 0x979E, + 0xEF41: 0x979D, + 0xEF42: 0x97D5, + 0xEF43: 0x97D4, + 0xEF44: 0x97F1, + 0xEF45: 0x9841, + 0xEF46: 0x9844, + 0xEF47: 0x984A, + 0xEF48: 0x9849, + 0xEF49: 0x9845, + 0xEF4A: 0x9843, + 0xEF4B: 0x9925, + 0xEF4C: 0x992B, + 0xEF4D: 0x992C, + 0xEF4E: 0x992A, + 0xEF4F: 0x9933, + 0xEF50: 0x9932, + 0xEF51: 0x992F, + 0xEF52: 0x992D, + 0xEF53: 0x9931, + 0xEF54: 0x9930, + 0xEF55: 0x9998, + 0xEF56: 0x99A3, + 0xEF57: 0x99A1, + 0xEF58: 0x9A02, + 0xEF59: 0x99FA, + 0xEF5A: 0x99F4, + 0xEF5B: 0x99F7, + 0xEF5C: 0x99F9, + 0xEF5D: 0x99F8, + 0xEF5E: 0x99F6, + 0xEF5F: 0x99FB, + 0xEF60: 0x99FD, + 0xEF61: 0x99FE, + 0xEF62: 0x99FC, + 0xEF63: 0x9A03, + 0xEF64: 0x9ABE, + 0xEF65: 0x9AFE, + 0xEF66: 0x9AFD, + 0xEF67: 0x9B01, + 0xEF68: 0x9AFC, + 0xEF69: 0x9B48, + 0xEF6A: 0x9B9A, + 0xEF6B: 0x9BA8, + 0xEF6C: 0x9B9E, + 0xEF6D: 0x9B9B, + 0xEF6E: 0x9BA6, + 0xEF6F: 0x9BA1, + 0xEF70: 0x9BA5, + 0xEF71: 0x9BA4, + 0xEF72: 0x9B86, + 0xEF73: 0x9BA2, + 0xEF74: 0x9BA0, + 0xEF75: 0x9BAF, + 0xEF76: 0x9D33, + 0xEF77: 0x9D41, + 0xEF78: 0x9D67, + 0xEF79: 0x9D36, + 0xEF7A: 0x9D2E, + 0xEF7B: 0x9D2F, + 0xEF7C: 0x9D31, + 0xEF7D: 0x9D38, + 0xEF7E: 0x9D30, + 0xEFA1: 0x9D45, + 0xEFA2: 0x9D42, + 0xEFA3: 0x9D43, + 0xEFA4: 0x9D3E, + 0xEFA5: 0x9D37, + 0xEFA6: 0x9D40, + 0xEFA7: 0x9D3D, + 0xEFA8: 0x7FF5, + 0xEFA9: 0x9D2D, + 0xEFAA: 0x9E8A, + 0xEFAB: 0x9E89, + 0xEFAC: 0x9E8D, + 0xEFAD: 0x9EB0, + 0xEFAE: 0x9EC8, + 0xEFAF: 0x9EDA, + 0xEFB0: 0x9EFB, + 0xEFB1: 0x9EFF, + 0xEFB2: 0x9F24, + 0xEFB3: 0x9F23, + 0xEFB4: 0x9F22, + 0xEFB5: 0x9F54, + 0xEFB6: 0x9FA0, + 0xEFB7: 0x5131, + 0xEFB8: 0x512D, + 0xEFB9: 0x512E, + 0xEFBA: 0x5698, + 0xEFBB: 0x569C, + 0xEFBC: 0x5697, + 0xEFBD: 0x569A, + 0xEFBE: 0x569D, + 0xEFBF: 0x5699, + 0xEFC0: 0x5970, + 0xEFC1: 0x5B3C, + 0xEFC2: 0x5C69, + 0xEFC3: 0x5C6A, + 0xEFC4: 0x5DC0, + 0xEFC5: 0x5E6D, + 0xEFC6: 0x5E6E, + 0xEFC7: 0x61D8, + 0xEFC8: 0x61DF, + 0xEFC9: 0x61ED, + 0xEFCA: 0x61EE, + 0xEFCB: 0x61F1, + 0xEFCC: 0x61EA, + 0xEFCD: 0x61F0, + 0xEFCE: 0x61EB, + 0xEFCF: 0x61D6, + 0xEFD0: 0x61E9, + 0xEFD1: 0x64FF, + 0xEFD2: 0x6504, + 0xEFD3: 0x64FD, + 0xEFD4: 0x64F8, + 0xEFD5: 0x6501, + 0xEFD6: 0x6503, + 0xEFD7: 0x64FC, + 0xEFD8: 0x6594, + 0xEFD9: 0x65DB, + 0xEFDA: 0x66DA, + 0xEFDB: 0x66DB, + 0xEFDC: 0x66D8, + 0xEFDD: 0x6AC5, + 0xEFDE: 0x6AB9, + 0xEFDF: 0x6ABD, + 0xEFE0: 0x6AE1, + 0xEFE1: 0x6AC6, + 0xEFE2: 0x6ABA, + 0xEFE3: 0x6AB6, + 0xEFE4: 0x6AB7, + 0xEFE5: 0x6AC7, + 0xEFE6: 0x6AB4, + 0xEFE7: 0x6AAD, + 0xEFE8: 0x6B5E, + 0xEFE9: 0x6BC9, + 0xEFEA: 0x6C0B, + 0xEFEB: 0x7007, + 0xEFEC: 0x700C, + 0xEFED: 0x700D, + 0xEFEE: 0x7001, + 0xEFEF: 0x7005, + 0xEFF0: 0x7014, + 0xEFF1: 0x700E, + 0xEFF2: 0x6FFF, + 0xEFF3: 0x7000, + 0xEFF4: 0x6FFB, + 0xEFF5: 0x7026, + 0xEFF6: 0x6FFC, + 0xEFF7: 0x6FF7, + 0xEFF8: 0x700A, + 0xEFF9: 0x7201, + 0xEFFA: 0x71FF, + 0xEFFB: 0x71F9, + 0xEFFC: 0x7203, + 0xEFFD: 0x71FD, + 0xEFFE: 0x7376, + 0xF040: 0x74B8, + 0xF041: 0x74C0, + 0xF042: 0x74B5, + 0xF043: 0x74C1, + 0xF044: 0x74BE, + 0xF045: 0x74B6, + 0xF046: 0x74BB, + 0xF047: 0x74C2, + 0xF048: 0x7514, + 0xF049: 0x7513, + 0xF04A: 0x765C, + 0xF04B: 0x7664, + 0xF04C: 0x7659, + 0xF04D: 0x7650, + 0xF04E: 0x7653, + 0xF04F: 0x7657, + 0xF050: 0x765A, + 0xF051: 0x76A6, + 0xF052: 0x76BD, + 0xF053: 0x76EC, + 0xF054: 0x77C2, + 0xF055: 0x77BA, + 0xF056: 0x78FF, + 0xF057: 0x790C, + 0xF058: 0x7913, + 0xF059: 0x7914, + 0xF05A: 0x7909, + 0xF05B: 0x7910, + 0xF05C: 0x7912, + 0xF05D: 0x7911, + 0xF05E: 0x79AD, + 0xF05F: 0x79AC, + 0xF060: 0x7A5F, + 0xF061: 0x7C1C, + 0xF062: 0x7C29, + 0xF063: 0x7C19, + 0xF064: 0x7C20, + 0xF065: 0x7C1F, + 0xF066: 0x7C2D, + 0xF067: 0x7C1D, + 0xF068: 0x7C26, + 0xF069: 0x7C28, + 0xF06A: 0x7C22, + 0xF06B: 0x7C25, + 0xF06C: 0x7C30, + 0xF06D: 0x7E5C, + 0xF06E: 0x7E50, + 0xF06F: 0x7E56, + 0xF070: 0x7E63, + 0xF071: 0x7E58, + 0xF072: 0x7E62, + 0xF073: 0x7E5F, + 0xF074: 0x7E51, + 0xF075: 0x7E60, + 0xF076: 0x7E57, + 0xF077: 0x7E53, + 0xF078: 0x7FB5, + 0xF079: 0x7FB3, + 0xF07A: 0x7FF7, + 0xF07B: 0x7FF8, + 0xF07C: 0x8075, + 0xF07D: 0x81D1, + 0xF07E: 0x81D2, + 0xF0A1: 0x81D0, + 0xF0A2: 0x825F, + 0xF0A3: 0x825E, + 0xF0A4: 0x85B4, + 0xF0A5: 0x85C6, + 0xF0A6: 0x85C0, + 0xF0A7: 0x85C3, + 0xF0A8: 0x85C2, + 0xF0A9: 0x85B3, + 0xF0AA: 0x85B5, + 0xF0AB: 0x85BD, + 0xF0AC: 0x85C7, + 0xF0AD: 0x85C4, + 0xF0AE: 0x85BF, + 0xF0AF: 0x85CB, + 0xF0B0: 0x85CE, + 0xF0B1: 0x85C8, + 0xF0B2: 0x85C5, + 0xF0B3: 0x85B1, + 0xF0B4: 0x85B6, + 0xF0B5: 0x85D2, + 0xF0B6: 0x8624, + 0xF0B7: 0x85B8, + 0xF0B8: 0x85B7, + 0xF0B9: 0x85BE, + 0xF0BA: 0x8669, + 0xF0BB: 0x87E7, + 0xF0BC: 0x87E6, + 0xF0BD: 0x87E2, + 0xF0BE: 0x87DB, + 0xF0BF: 0x87EB, + 0xF0C0: 0x87EA, + 0xF0C1: 0x87E5, + 0xF0C2: 0x87DF, + 0xF0C3: 0x87F3, + 0xF0C4: 0x87E4, + 0xF0C5: 0x87D4, + 0xF0C6: 0x87DC, + 0xF0C7: 0x87D3, + 0xF0C8: 0x87ED, + 0xF0C9: 0x87D8, + 0xF0CA: 0x87E3, + 0xF0CB: 0x87A4, + 0xF0CC: 0x87D7, + 0xF0CD: 0x87D9, + 0xF0CE: 0x8801, + 0xF0CF: 0x87F4, + 0xF0D0: 0x87E8, + 0xF0D1: 0x87DD, + 0xF0D2: 0x8953, + 0xF0D3: 0x894B, + 0xF0D4: 0x894F, + 0xF0D5: 0x894C, + 0xF0D6: 0x8946, + 0xF0D7: 0x8950, + 0xF0D8: 0x8951, + 0xF0D9: 0x8949, + 0xF0DA: 0x8B2A, + 0xF0DB: 0x8B27, + 0xF0DC: 0x8B23, + 0xF0DD: 0x8B33, + 0xF0DE: 0x8B30, + 0xF0DF: 0x8B35, + 0xF0E0: 0x8B47, + 0xF0E1: 0x8B2F, + 0xF0E2: 0x8B3C, + 0xF0E3: 0x8B3E, + 0xF0E4: 0x8B31, + 0xF0E5: 0x8B25, + 0xF0E6: 0x8B37, + 0xF0E7: 0x8B26, + 0xF0E8: 0x8B36, + 0xF0E9: 0x8B2E, + 0xF0EA: 0x8B24, + 0xF0EB: 0x8B3B, + 0xF0EC: 0x8B3D, + 0xF0ED: 0x8B3A, + 0xF0EE: 0x8C42, + 0xF0EF: 0x8C75, + 0xF0F0: 0x8C99, + 0xF0F1: 0x8C98, + 0xF0F2: 0x8C97, + 0xF0F3: 0x8CFE, + 0xF0F4: 0x8D04, + 0xF0F5: 0x8D02, + 0xF0F6: 0x8D00, + 0xF0F7: 0x8E5C, + 0xF0F8: 0x8E62, + 0xF0F9: 0x8E60, + 0xF0FA: 0x8E57, + 0xF0FB: 0x8E56, + 0xF0FC: 0x8E5E, + 0xF0FD: 0x8E65, + 0xF0FE: 0x8E67, + 0xF140: 0x8E5B, + 0xF141: 0x8E5A, + 0xF142: 0x8E61, + 0xF143: 0x8E5D, + 0xF144: 0x8E69, + 0xF145: 0x8E54, + 0xF146: 0x8F46, + 0xF147: 0x8F47, + 0xF148: 0x8F48, + 0xF149: 0x8F4B, + 0xF14A: 0x9128, + 0xF14B: 0x913A, + 0xF14C: 0x913B, + 0xF14D: 0x913E, + 0xF14E: 0x91A8, + 0xF14F: 0x91A5, + 0xF150: 0x91A7, + 0xF151: 0x91AF, + 0xF152: 0x91AA, + 0xF153: 0x93B5, + 0xF154: 0x938C, + 0xF155: 0x9392, + 0xF156: 0x93B7, + 0xF157: 0x939B, + 0xF158: 0x939D, + 0xF159: 0x9389, + 0xF15A: 0x93A7, + 0xF15B: 0x938E, + 0xF15C: 0x93AA, + 0xF15D: 0x939E, + 0xF15E: 0x93A6, + 0xF15F: 0x9395, + 0xF160: 0x9388, + 0xF161: 0x9399, + 0xF162: 0x939F, + 0xF163: 0x938D, + 0xF164: 0x93B1, + 0xF165: 0x9391, + 0xF166: 0x93B2, + 0xF167: 0x93A4, + 0xF168: 0x93A8, + 0xF169: 0x93B4, + 0xF16A: 0x93A3, + 0xF16B: 0x93A5, + 0xF16C: 0x95D2, + 0xF16D: 0x95D3, + 0xF16E: 0x95D1, + 0xF16F: 0x96B3, + 0xF170: 0x96D7, + 0xF171: 0x96DA, + 0xF172: 0x5DC2, + 0xF173: 0x96DF, + 0xF174: 0x96D8, + 0xF175: 0x96DD, + 0xF176: 0x9723, + 0xF177: 0x9722, + 0xF178: 0x9725, + 0xF179: 0x97AC, + 0xF17A: 0x97AE, + 0xF17B: 0x97A8, + 0xF17C: 0x97AB, + 0xF17D: 0x97A4, + 0xF17E: 0x97AA, + 0xF1A1: 0x97A2, + 0xF1A2: 0x97A5, + 0xF1A3: 0x97D7, + 0xF1A4: 0x97D9, + 0xF1A5: 0x97D6, + 0xF1A6: 0x97D8, + 0xF1A7: 0x97FA, + 0xF1A8: 0x9850, + 0xF1A9: 0x9851, + 0xF1AA: 0x9852, + 0xF1AB: 0x98B8, + 0xF1AC: 0x9941, + 0xF1AD: 0x993C, + 0xF1AE: 0x993A, + 0xF1AF: 0x9A0F, + 0xF1B0: 0x9A0B, + 0xF1B1: 0x9A09, + 0xF1B2: 0x9A0D, + 0xF1B3: 0x9A04, + 0xF1B4: 0x9A11, + 0xF1B5: 0x9A0A, + 0xF1B6: 0x9A05, + 0xF1B7: 0x9A07, + 0xF1B8: 0x9A06, + 0xF1B9: 0x9AC0, + 0xF1BA: 0x9ADC, + 0xF1BB: 0x9B08, + 0xF1BC: 0x9B04, + 0xF1BD: 0x9B05, + 0xF1BE: 0x9B29, + 0xF1BF: 0x9B35, + 0xF1C0: 0x9B4A, + 0xF1C1: 0x9B4C, + 0xF1C2: 0x9B4B, + 0xF1C3: 0x9BC7, + 0xF1C4: 0x9BC6, + 0xF1C5: 0x9BC3, + 0xF1C6: 0x9BBF, + 0xF1C7: 0x9BC1, + 0xF1C8: 0x9BB5, + 0xF1C9: 0x9BB8, + 0xF1CA: 0x9BD3, + 0xF1CB: 0x9BB6, + 0xF1CC: 0x9BC4, + 0xF1CD: 0x9BB9, + 0xF1CE: 0x9BBD, + 0xF1CF: 0x9D5C, + 0xF1D0: 0x9D53, + 0xF1D1: 0x9D4F, + 0xF1D2: 0x9D4A, + 0xF1D3: 0x9D5B, + 0xF1D4: 0x9D4B, + 0xF1D5: 0x9D59, + 0xF1D6: 0x9D56, + 0xF1D7: 0x9D4C, + 0xF1D8: 0x9D57, + 0xF1D9: 0x9D52, + 0xF1DA: 0x9D54, + 0xF1DB: 0x9D5F, + 0xF1DC: 0x9D58, + 0xF1DD: 0x9D5A, + 0xF1DE: 0x9E8E, + 0xF1DF: 0x9E8C, + 0xF1E0: 0x9EDF, + 0xF1E1: 0x9F01, + 0xF1E2: 0x9F00, + 0xF1E3: 0x9F16, + 0xF1E4: 0x9F25, + 0xF1E5: 0x9F2B, + 0xF1E6: 0x9F2A, + 0xF1E7: 0x9F29, + 0xF1E8: 0x9F28, + 0xF1E9: 0x9F4C, + 0xF1EA: 0x9F55, + 0xF1EB: 0x5134, + 0xF1EC: 0x5135, + 0xF1ED: 0x5296, + 0xF1EE: 0x52F7, + 0xF1EF: 0x53B4, + 0xF1F0: 0x56AB, + 0xF1F1: 0x56AD, + 0xF1F2: 0x56A6, + 0xF1F3: 0x56A7, + 0xF1F4: 0x56AA, + 0xF1F5: 0x56AC, + 0xF1F6: 0x58DA, + 0xF1F7: 0x58DD, + 0xF1F8: 0x58DB, + 0xF1F9: 0x5912, + 0xF1FA: 0x5B3D, + 0xF1FB: 0x5B3E, + 0xF1FC: 0x5B3F, + 0xF1FD: 0x5DC3, + 0xF1FE: 0x5E70, + 0xF240: 0x5FBF, + 0xF241: 0x61FB, + 0xF242: 0x6507, + 0xF243: 0x6510, + 0xF244: 0x650D, + 0xF245: 0x6509, + 0xF246: 0x650C, + 0xF247: 0x650E, + 0xF248: 0x6584, + 0xF249: 0x65DE, + 0xF24A: 0x65DD, + 0xF24B: 0x66DE, + 0xF24C: 0x6AE7, + 0xF24D: 0x6AE0, + 0xF24E: 0x6ACC, + 0xF24F: 0x6AD1, + 0xF250: 0x6AD9, + 0xF251: 0x6ACB, + 0xF252: 0x6ADF, + 0xF253: 0x6ADC, + 0xF254: 0x6AD0, + 0xF255: 0x6AEB, + 0xF256: 0x6ACF, + 0xF257: 0x6ACD, + 0xF258: 0x6ADE, + 0xF259: 0x6B60, + 0xF25A: 0x6BB0, + 0xF25B: 0x6C0C, + 0xF25C: 0x7019, + 0xF25D: 0x7027, + 0xF25E: 0x7020, + 0xF25F: 0x7016, + 0xF260: 0x702B, + 0xF261: 0x7021, + 0xF262: 0x7022, + 0xF263: 0x7023, + 0xF264: 0x7029, + 0xF265: 0x7017, + 0xF266: 0x7024, + 0xF267: 0x701C, + 0xF268: 0x702A, + 0xF269: 0x720C, + 0xF26A: 0x720A, + 0xF26B: 0x7207, + 0xF26C: 0x7202, + 0xF26D: 0x7205, + 0xF26E: 0x72A5, + 0xF26F: 0x72A6, + 0xF270: 0x72A4, + 0xF271: 0x72A3, + 0xF272: 0x72A1, + 0xF273: 0x74CB, + 0xF274: 0x74C5, + 0xF275: 0x74B7, + 0xF276: 0x74C3, + 0xF277: 0x7516, + 0xF278: 0x7660, + 0xF279: 0x77C9, + 0xF27A: 0x77CA, + 0xF27B: 0x77C4, + 0xF27C: 0x77F1, + 0xF27D: 0x791D, + 0xF27E: 0x791B, + 0xF2A1: 0x7921, + 0xF2A2: 0x791C, + 0xF2A3: 0x7917, + 0xF2A4: 0x791E, + 0xF2A5: 0x79B0, + 0xF2A6: 0x7A67, + 0xF2A7: 0x7A68, + 0xF2A8: 0x7C33, + 0xF2A9: 0x7C3C, + 0xF2AA: 0x7C39, + 0xF2AB: 0x7C2C, + 0xF2AC: 0x7C3B, + 0xF2AD: 0x7CEC, + 0xF2AE: 0x7CEA, + 0xF2AF: 0x7E76, + 0xF2B0: 0x7E75, + 0xF2B1: 0x7E78, + 0xF2B2: 0x7E70, + 0xF2B3: 0x7E77, + 0xF2B4: 0x7E6F, + 0xF2B5: 0x7E7A, + 0xF2B6: 0x7E72, + 0xF2B7: 0x7E74, + 0xF2B8: 0x7E68, + 0xF2B9: 0x7F4B, + 0xF2BA: 0x7F4A, + 0xF2BB: 0x7F83, + 0xF2BC: 0x7F86, + 0xF2BD: 0x7FB7, + 0xF2BE: 0x7FFD, + 0xF2BF: 0x7FFE, + 0xF2C0: 0x8078, + 0xF2C1: 0x81D7, + 0xF2C2: 0x81D5, + 0xF2C3: 0x8264, + 0xF2C4: 0x8261, + 0xF2C5: 0x8263, + 0xF2C6: 0x85EB, + 0xF2C7: 0x85F1, + 0xF2C8: 0x85ED, + 0xF2C9: 0x85D9, + 0xF2CA: 0x85E1, + 0xF2CB: 0x85E8, + 0xF2CC: 0x85DA, + 0xF2CD: 0x85D7, + 0xF2CE: 0x85EC, + 0xF2CF: 0x85F2, + 0xF2D0: 0x85F8, + 0xF2D1: 0x85D8, + 0xF2D2: 0x85DF, + 0xF2D3: 0x85E3, + 0xF2D4: 0x85DC, + 0xF2D5: 0x85D1, + 0xF2D6: 0x85F0, + 0xF2D7: 0x85E6, + 0xF2D8: 0x85EF, + 0xF2D9: 0x85DE, + 0xF2DA: 0x85E2, + 0xF2DB: 0x8800, + 0xF2DC: 0x87FA, + 0xF2DD: 0x8803, + 0xF2DE: 0x87F6, + 0xF2DF: 0x87F7, + 0xF2E0: 0x8809, + 0xF2E1: 0x880C, + 0xF2E2: 0x880B, + 0xF2E3: 0x8806, + 0xF2E4: 0x87FC, + 0xF2E5: 0x8808, + 0xF2E6: 0x87FF, + 0xF2E7: 0x880A, + 0xF2E8: 0x8802, + 0xF2E9: 0x8962, + 0xF2EA: 0x895A, + 0xF2EB: 0x895B, + 0xF2EC: 0x8957, + 0xF2ED: 0x8961, + 0xF2EE: 0x895C, + 0xF2EF: 0x8958, + 0xF2F0: 0x895D, + 0xF2F1: 0x8959, + 0xF2F2: 0x8988, + 0xF2F3: 0x89B7, + 0xF2F4: 0x89B6, + 0xF2F5: 0x89F6, + 0xF2F6: 0x8B50, + 0xF2F7: 0x8B48, + 0xF2F8: 0x8B4A, + 0xF2F9: 0x8B40, + 0xF2FA: 0x8B53, + 0xF2FB: 0x8B56, + 0xF2FC: 0x8B54, + 0xF2FD: 0x8B4B, + 0xF2FE: 0x8B55, + 0xF340: 0x8B51, + 0xF341: 0x8B42, + 0xF342: 0x8B52, + 0xF343: 0x8B57, + 0xF344: 0x8C43, + 0xF345: 0x8C77, + 0xF346: 0x8C76, + 0xF347: 0x8C9A, + 0xF348: 0x8D06, + 0xF349: 0x8D07, + 0xF34A: 0x8D09, + 0xF34B: 0x8DAC, + 0xF34C: 0x8DAA, + 0xF34D: 0x8DAD, + 0xF34E: 0x8DAB, + 0xF34F: 0x8E6D, + 0xF350: 0x8E78, + 0xF351: 0x8E73, + 0xF352: 0x8E6A, + 0xF353: 0x8E6F, + 0xF354: 0x8E7B, + 0xF355: 0x8EC2, + 0xF356: 0x8F52, + 0xF357: 0x8F51, + 0xF358: 0x8F4F, + 0xF359: 0x8F50, + 0xF35A: 0x8F53, + 0xF35B: 0x8FB4, + 0xF35C: 0x9140, + 0xF35D: 0x913F, + 0xF35E: 0x91B0, + 0xF35F: 0x91AD, + 0xF360: 0x93DE, + 0xF361: 0x93C7, + 0xF362: 0x93CF, + 0xF363: 0x93C2, + 0xF364: 0x93DA, + 0xF365: 0x93D0, + 0xF366: 0x93F9, + 0xF367: 0x93EC, + 0xF368: 0x93CC, + 0xF369: 0x93D9, + 0xF36A: 0x93A9, + 0xF36B: 0x93E6, + 0xF36C: 0x93CA, + 0xF36D: 0x93D4, + 0xF36E: 0x93EE, + 0xF36F: 0x93E3, + 0xF370: 0x93D5, + 0xF371: 0x93C4, + 0xF372: 0x93CE, + 0xF373: 0x93C0, + 0xF374: 0x93D2, + 0xF375: 0x93E7, + 0xF376: 0x957D, + 0xF377: 0x95DA, + 0xF378: 0x95DB, + 0xF379: 0x96E1, + 0xF37A: 0x9729, + 0xF37B: 0x972B, + 0xF37C: 0x972C, + 0xF37D: 0x9728, + 0xF37E: 0x9726, + 0xF3A1: 0x97B3, + 0xF3A2: 0x97B7, + 0xF3A3: 0x97B6, + 0xF3A4: 0x97DD, + 0xF3A5: 0x97DE, + 0xF3A6: 0x97DF, + 0xF3A7: 0x985C, + 0xF3A8: 0x9859, + 0xF3A9: 0x985D, + 0xF3AA: 0x9857, + 0xF3AB: 0x98BF, + 0xF3AC: 0x98BD, + 0xF3AD: 0x98BB, + 0xF3AE: 0x98BE, + 0xF3AF: 0x9948, + 0xF3B0: 0x9947, + 0xF3B1: 0x9943, + 0xF3B2: 0x99A6, + 0xF3B3: 0x99A7, + 0xF3B4: 0x9A1A, + 0xF3B5: 0x9A15, + 0xF3B6: 0x9A25, + 0xF3B7: 0x9A1D, + 0xF3B8: 0x9A24, + 0xF3B9: 0x9A1B, + 0xF3BA: 0x9A22, + 0xF3BB: 0x9A20, + 0xF3BC: 0x9A27, + 0xF3BD: 0x9A23, + 0xF3BE: 0x9A1E, + 0xF3BF: 0x9A1C, + 0xF3C0: 0x9A14, + 0xF3C1: 0x9AC2, + 0xF3C2: 0x9B0B, + 0xF3C3: 0x9B0A, + 0xF3C4: 0x9B0E, + 0xF3C5: 0x9B0C, + 0xF3C6: 0x9B37, + 0xF3C7: 0x9BEA, + 0xF3C8: 0x9BEB, + 0xF3C9: 0x9BE0, + 0xF3CA: 0x9BDE, + 0xF3CB: 0x9BE4, + 0xF3CC: 0x9BE6, + 0xF3CD: 0x9BE2, + 0xF3CE: 0x9BF0, + 0xF3CF: 0x9BD4, + 0xF3D0: 0x9BD7, + 0xF3D1: 0x9BEC, + 0xF3D2: 0x9BDC, + 0xF3D3: 0x9BD9, + 0xF3D4: 0x9BE5, + 0xF3D5: 0x9BD5, + 0xF3D6: 0x9BE1, + 0xF3D7: 0x9BDA, + 0xF3D8: 0x9D77, + 0xF3D9: 0x9D81, + 0xF3DA: 0x9D8A, + 0xF3DB: 0x9D84, + 0xF3DC: 0x9D88, + 0xF3DD: 0x9D71, + 0xF3DE: 0x9D80, + 0xF3DF: 0x9D78, + 0xF3E0: 0x9D86, + 0xF3E1: 0x9D8B, + 0xF3E2: 0x9D8C, + 0xF3E3: 0x9D7D, + 0xF3E4: 0x9D6B, + 0xF3E5: 0x9D74, + 0xF3E6: 0x9D75, + 0xF3E7: 0x9D70, + 0xF3E8: 0x9D69, + 0xF3E9: 0x9D85, + 0xF3EA: 0x9D73, + 0xF3EB: 0x9D7B, + 0xF3EC: 0x9D82, + 0xF3ED: 0x9D6F, + 0xF3EE: 0x9D79, + 0xF3EF: 0x9D7F, + 0xF3F0: 0x9D87, + 0xF3F1: 0x9D68, + 0xF3F2: 0x9E94, + 0xF3F3: 0x9E91, + 0xF3F4: 0x9EC0, + 0xF3F5: 0x9EFC, + 0xF3F6: 0x9F2D, + 0xF3F7: 0x9F40, + 0xF3F8: 0x9F41, + 0xF3F9: 0x9F4D, + 0xF3FA: 0x9F56, + 0xF3FB: 0x9F57, + 0xF3FC: 0x9F58, + 0xF3FD: 0x5337, + 0xF3FE: 0x56B2, + 0xF440: 0x56B5, + 0xF441: 0x56B3, + 0xF442: 0x58E3, + 0xF443: 0x5B45, + 0xF444: 0x5DC6, + 0xF445: 0x5DC7, + 0xF446: 0x5EEE, + 0xF447: 0x5EEF, + 0xF448: 0x5FC0, + 0xF449: 0x5FC1, + 0xF44A: 0x61F9, + 0xF44B: 0x6517, + 0xF44C: 0x6516, + 0xF44D: 0x6515, + 0xF44E: 0x6513, + 0xF44F: 0x65DF, + 0xF450: 0x66E8, + 0xF451: 0x66E3, + 0xF452: 0x66E4, + 0xF453: 0x6AF3, + 0xF454: 0x6AF0, + 0xF455: 0x6AEA, + 0xF456: 0x6AE8, + 0xF457: 0x6AF9, + 0xF458: 0x6AF1, + 0xF459: 0x6AEE, + 0xF45A: 0x6AEF, + 0xF45B: 0x703C, + 0xF45C: 0x7035, + 0xF45D: 0x702F, + 0xF45E: 0x7037, + 0xF45F: 0x7034, + 0xF460: 0x7031, + 0xF461: 0x7042, + 0xF462: 0x7038, + 0xF463: 0x703F, + 0xF464: 0x703A, + 0xF465: 0x7039, + 0xF466: 0x7040, + 0xF467: 0x703B, + 0xF468: 0x7033, + 0xF469: 0x7041, + 0xF46A: 0x7213, + 0xF46B: 0x7214, + 0xF46C: 0x72A8, + 0xF46D: 0x737D, + 0xF46E: 0x737C, + 0xF46F: 0x74BA, + 0xF470: 0x76AB, + 0xF471: 0x76AA, + 0xF472: 0x76BE, + 0xF473: 0x76ED, + 0xF474: 0x77CC, + 0xF475: 0x77CE, + 0xF476: 0x77CF, + 0xF477: 0x77CD, + 0xF478: 0x77F2, + 0xF479: 0x7925, + 0xF47A: 0x7923, + 0xF47B: 0x7927, + 0xF47C: 0x7928, + 0xF47D: 0x7924, + 0xF47E: 0x7929, + 0xF4A1: 0x79B2, + 0xF4A2: 0x7A6E, + 0xF4A3: 0x7A6C, + 0xF4A4: 0x7A6D, + 0xF4A5: 0x7AF7, + 0xF4A6: 0x7C49, + 0xF4A7: 0x7C48, + 0xF4A8: 0x7C4A, + 0xF4A9: 0x7C47, + 0xF4AA: 0x7C45, + 0xF4AB: 0x7CEE, + 0xF4AC: 0x7E7B, + 0xF4AD: 0x7E7E, + 0xF4AE: 0x7E81, + 0xF4AF: 0x7E80, + 0xF4B0: 0x7FBA, + 0xF4B1: 0x7FFF, + 0xF4B2: 0x8079, + 0xF4B3: 0x81DB, + 0xF4B4: 0x81D9, + 0xF4B5: 0x820B, + 0xF4B6: 0x8268, + 0xF4B7: 0x8269, + 0xF4B8: 0x8622, + 0xF4B9: 0x85FF, + 0xF4BA: 0x8601, + 0xF4BB: 0x85FE, + 0xF4BC: 0x861B, + 0xF4BD: 0x8600, + 0xF4BE: 0x85F6, + 0xF4BF: 0x8604, + 0xF4C0: 0x8609, + 0xF4C1: 0x8605, + 0xF4C2: 0x860C, + 0xF4C3: 0x85FD, + 0xF4C4: 0x8819, + 0xF4C5: 0x8810, + 0xF4C6: 0x8811, + 0xF4C7: 0x8817, + 0xF4C8: 0x8813, + 0xF4C9: 0x8816, + 0xF4CA: 0x8963, + 0xF4CB: 0x8966, + 0xF4CC: 0x89B9, + 0xF4CD: 0x89F7, + 0xF4CE: 0x8B60, + 0xF4CF: 0x8B6A, + 0xF4D0: 0x8B5D, + 0xF4D1: 0x8B68, + 0xF4D2: 0x8B63, + 0xF4D3: 0x8B65, + 0xF4D4: 0x8B67, + 0xF4D5: 0x8B6D, + 0xF4D6: 0x8DAE, + 0xF4D7: 0x8E86, + 0xF4D8: 0x8E88, + 0xF4D9: 0x8E84, + 0xF4DA: 0x8F59, + 0xF4DB: 0x8F56, + 0xF4DC: 0x8F57, + 0xF4DD: 0x8F55, + 0xF4DE: 0x8F58, + 0xF4DF: 0x8F5A, + 0xF4E0: 0x908D, + 0xF4E1: 0x9143, + 0xF4E2: 0x9141, + 0xF4E3: 0x91B7, + 0xF4E4: 0x91B5, + 0xF4E5: 0x91B2, + 0xF4E6: 0x91B3, + 0xF4E7: 0x940B, + 0xF4E8: 0x9413, + 0xF4E9: 0x93FB, + 0xF4EA: 0x9420, + 0xF4EB: 0x940F, + 0xF4EC: 0x9414, + 0xF4ED: 0x93FE, + 0xF4EE: 0x9415, + 0xF4EF: 0x9410, + 0xF4F0: 0x9428, + 0xF4F1: 0x9419, + 0xF4F2: 0x940D, + 0xF4F3: 0x93F5, + 0xF4F4: 0x9400, + 0xF4F5: 0x93F7, + 0xF4F6: 0x9407, + 0xF4F7: 0x940E, + 0xF4F8: 0x9416, + 0xF4F9: 0x9412, + 0xF4FA: 0x93FA, + 0xF4FB: 0x9409, + 0xF4FC: 0x93F8, + 0xF4FD: 0x940A, + 0xF4FE: 0x93FF, + 0xF540: 0x93FC, + 0xF541: 0x940C, + 0xF542: 0x93F6, + 0xF543: 0x9411, + 0xF544: 0x9406, + 0xF545: 0x95DE, + 0xF546: 0x95E0, + 0xF547: 0x95DF, + 0xF548: 0x972E, + 0xF549: 0x972F, + 0xF54A: 0x97B9, + 0xF54B: 0x97BB, + 0xF54C: 0x97FD, + 0xF54D: 0x97FE, + 0xF54E: 0x9860, + 0xF54F: 0x9862, + 0xF550: 0x9863, + 0xF551: 0x985F, + 0xF552: 0x98C1, + 0xF553: 0x98C2, + 0xF554: 0x9950, + 0xF555: 0x994E, + 0xF556: 0x9959, + 0xF557: 0x994C, + 0xF558: 0x994B, + 0xF559: 0x9953, + 0xF55A: 0x9A32, + 0xF55B: 0x9A34, + 0xF55C: 0x9A31, + 0xF55D: 0x9A2C, + 0xF55E: 0x9A2A, + 0xF55F: 0x9A36, + 0xF560: 0x9A29, + 0xF561: 0x9A2E, + 0xF562: 0x9A38, + 0xF563: 0x9A2D, + 0xF564: 0x9AC7, + 0xF565: 0x9ACA, + 0xF566: 0x9AC6, + 0xF567: 0x9B10, + 0xF568: 0x9B12, + 0xF569: 0x9B11, + 0xF56A: 0x9C0B, + 0xF56B: 0x9C08, + 0xF56C: 0x9BF7, + 0xF56D: 0x9C05, + 0xF56E: 0x9C12, + 0xF56F: 0x9BF8, + 0xF570: 0x9C40, + 0xF571: 0x9C07, + 0xF572: 0x9C0E, + 0xF573: 0x9C06, + 0xF574: 0x9C17, + 0xF575: 0x9C14, + 0xF576: 0x9C09, + 0xF577: 0x9D9F, + 0xF578: 0x9D99, + 0xF579: 0x9DA4, + 0xF57A: 0x9D9D, + 0xF57B: 0x9D92, + 0xF57C: 0x9D98, + 0xF57D: 0x9D90, + 0xF57E: 0x9D9B, + 0xF5A1: 0x9DA0, + 0xF5A2: 0x9D94, + 0xF5A3: 0x9D9C, + 0xF5A4: 0x9DAA, + 0xF5A5: 0x9D97, + 0xF5A6: 0x9DA1, + 0xF5A7: 0x9D9A, + 0xF5A8: 0x9DA2, + 0xF5A9: 0x9DA8, + 0xF5AA: 0x9D9E, + 0xF5AB: 0x9DA3, + 0xF5AC: 0x9DBF, + 0xF5AD: 0x9DA9, + 0xF5AE: 0x9D96, + 0xF5AF: 0x9DA6, + 0xF5B0: 0x9DA7, + 0xF5B1: 0x9E99, + 0xF5B2: 0x9E9B, + 0xF5B3: 0x9E9A, + 0xF5B4: 0x9EE5, + 0xF5B5: 0x9EE4, + 0xF5B6: 0x9EE7, + 0xF5B7: 0x9EE6, + 0xF5B8: 0x9F30, + 0xF5B9: 0x9F2E, + 0xF5BA: 0x9F5B, + 0xF5BB: 0x9F60, + 0xF5BC: 0x9F5E, + 0xF5BD: 0x9F5D, + 0xF5BE: 0x9F59, + 0xF5BF: 0x9F91, + 0xF5C0: 0x513A, + 0xF5C1: 0x5139, + 0xF5C2: 0x5298, + 0xF5C3: 0x5297, + 0xF5C4: 0x56C3, + 0xF5C5: 0x56BD, + 0xF5C6: 0x56BE, + 0xF5C7: 0x5B48, + 0xF5C8: 0x5B47, + 0xF5C9: 0x5DCB, + 0xF5CA: 0x5DCF, + 0xF5CB: 0x5EF1, + 0xF5CC: 0x61FD, + 0xF5CD: 0x651B, + 0xF5CE: 0x6B02, + 0xF5CF: 0x6AFC, + 0xF5D0: 0x6B03, + 0xF5D1: 0x6AF8, + 0xF5D2: 0x6B00, + 0xF5D3: 0x7043, + 0xF5D4: 0x7044, + 0xF5D5: 0x704A, + 0xF5D6: 0x7048, + 0xF5D7: 0x7049, + 0xF5D8: 0x7045, + 0xF5D9: 0x7046, + 0xF5DA: 0x721D, + 0xF5DB: 0x721A, + 0xF5DC: 0x7219, + 0xF5DD: 0x737E, + 0xF5DE: 0x7517, + 0xF5DF: 0x766A, + 0xF5E0: 0x77D0, + 0xF5E1: 0x792D, + 0xF5E2: 0x7931, + 0xF5E3: 0x792F, + 0xF5E4: 0x7C54, + 0xF5E5: 0x7C53, + 0xF5E6: 0x7CF2, + 0xF5E7: 0x7E8A, + 0xF5E8: 0x7E87, + 0xF5E9: 0x7E88, + 0xF5EA: 0x7E8B, + 0xF5EB: 0x7E86, + 0xF5EC: 0x7E8D, + 0xF5ED: 0x7F4D, + 0xF5EE: 0x7FBB, + 0xF5EF: 0x8030, + 0xF5F0: 0x81DD, + 0xF5F1: 0x8618, + 0xF5F2: 0x862A, + 0xF5F3: 0x8626, + 0xF5F4: 0x861F, + 0xF5F5: 0x8623, + 0xF5F6: 0x861C, + 0xF5F7: 0x8619, + 0xF5F8: 0x8627, + 0xF5F9: 0x862E, + 0xF5FA: 0x8621, + 0xF5FB: 0x8620, + 0xF5FC: 0x8629, + 0xF5FD: 0x861E, + 0xF5FE: 0x8625, + 0xF640: 0x8829, + 0xF641: 0x881D, + 0xF642: 0x881B, + 0xF643: 0x8820, + 0xF644: 0x8824, + 0xF645: 0x881C, + 0xF646: 0x882B, + 0xF647: 0x884A, + 0xF648: 0x896D, + 0xF649: 0x8969, + 0xF64A: 0x896E, + 0xF64B: 0x896B, + 0xF64C: 0x89FA, + 0xF64D: 0x8B79, + 0xF64E: 0x8B78, + 0xF64F: 0x8B45, + 0xF650: 0x8B7A, + 0xF651: 0x8B7B, + 0xF652: 0x8D10, + 0xF653: 0x8D14, + 0xF654: 0x8DAF, + 0xF655: 0x8E8E, + 0xF656: 0x8E8C, + 0xF657: 0x8F5E, + 0xF658: 0x8F5B, + 0xF659: 0x8F5D, + 0xF65A: 0x9146, + 0xF65B: 0x9144, + 0xF65C: 0x9145, + 0xF65D: 0x91B9, + 0xF65E: 0x943F, + 0xF65F: 0x943B, + 0xF660: 0x9436, + 0xF661: 0x9429, + 0xF662: 0x943D, + 0xF663: 0x943C, + 0xF664: 0x9430, + 0xF665: 0x9439, + 0xF666: 0x942A, + 0xF667: 0x9437, + 0xF668: 0x942C, + 0xF669: 0x9440, + 0xF66A: 0x9431, + 0xF66B: 0x95E5, + 0xF66C: 0x95E4, + 0xF66D: 0x95E3, + 0xF66E: 0x9735, + 0xF66F: 0x973A, + 0xF670: 0x97BF, + 0xF671: 0x97E1, + 0xF672: 0x9864, + 0xF673: 0x98C9, + 0xF674: 0x98C6, + 0xF675: 0x98C0, + 0xF676: 0x9958, + 0xF677: 0x9956, + 0xF678: 0x9A39, + 0xF679: 0x9A3D, + 0xF67A: 0x9A46, + 0xF67B: 0x9A44, + 0xF67C: 0x9A42, + 0xF67D: 0x9A41, + 0xF67E: 0x9A3A, + 0xF6A1: 0x9A3F, + 0xF6A2: 0x9ACD, + 0xF6A3: 0x9B15, + 0xF6A4: 0x9B17, + 0xF6A5: 0x9B18, + 0xF6A6: 0x9B16, + 0xF6A7: 0x9B3A, + 0xF6A8: 0x9B52, + 0xF6A9: 0x9C2B, + 0xF6AA: 0x9C1D, + 0xF6AB: 0x9C1C, + 0xF6AC: 0x9C2C, + 0xF6AD: 0x9C23, + 0xF6AE: 0x9C28, + 0xF6AF: 0x9C29, + 0xF6B0: 0x9C24, + 0xF6B1: 0x9C21, + 0xF6B2: 0x9DB7, + 0xF6B3: 0x9DB6, + 0xF6B4: 0x9DBC, + 0xF6B5: 0x9DC1, + 0xF6B6: 0x9DC7, + 0xF6B7: 0x9DCA, + 0xF6B8: 0x9DCF, + 0xF6B9: 0x9DBE, + 0xF6BA: 0x9DC5, + 0xF6BB: 0x9DC3, + 0xF6BC: 0x9DBB, + 0xF6BD: 0x9DB5, + 0xF6BE: 0x9DCE, + 0xF6BF: 0x9DB9, + 0xF6C0: 0x9DBA, + 0xF6C1: 0x9DAC, + 0xF6C2: 0x9DC8, + 0xF6C3: 0x9DB1, + 0xF6C4: 0x9DAD, + 0xF6C5: 0x9DCC, + 0xF6C6: 0x9DB3, + 0xF6C7: 0x9DCD, + 0xF6C8: 0x9DB2, + 0xF6C9: 0x9E7A, + 0xF6CA: 0x9E9C, + 0xF6CB: 0x9EEB, + 0xF6CC: 0x9EEE, + 0xF6CD: 0x9EED, + 0xF6CE: 0x9F1B, + 0xF6CF: 0x9F18, + 0xF6D0: 0x9F1A, + 0xF6D1: 0x9F31, + 0xF6D2: 0x9F4E, + 0xF6D3: 0x9F65, + 0xF6D4: 0x9F64, + 0xF6D5: 0x9F92, + 0xF6D6: 0x4EB9, + 0xF6D7: 0x56C6, + 0xF6D8: 0x56C5, + 0xF6D9: 0x56CB, + 0xF6DA: 0x5971, + 0xF6DB: 0x5B4B, + 0xF6DC: 0x5B4C, + 0xF6DD: 0x5DD5, + 0xF6DE: 0x5DD1, + 0xF6DF: 0x5EF2, + 0xF6E0: 0x6521, + 0xF6E1: 0x6520, + 0xF6E2: 0x6526, + 0xF6E3: 0x6522, + 0xF6E4: 0x6B0B, + 0xF6E5: 0x6B08, + 0xF6E6: 0x6B09, + 0xF6E7: 0x6C0D, + 0xF6E8: 0x7055, + 0xF6E9: 0x7056, + 0xF6EA: 0x7057, + 0xF6EB: 0x7052, + 0xF6EC: 0x721E, + 0xF6ED: 0x721F, + 0xF6EE: 0x72A9, + 0xF6EF: 0x737F, + 0xF6F0: 0x74D8, + 0xF6F1: 0x74D5, + 0xF6F2: 0x74D9, + 0xF6F3: 0x74D7, + 0xF6F4: 0x766D, + 0xF6F5: 0x76AD, + 0xF6F6: 0x7935, + 0xF6F7: 0x79B4, + 0xF6F8: 0x7A70, + 0xF6F9: 0x7A71, + 0xF6FA: 0x7C57, + 0xF6FB: 0x7C5C, + 0xF6FC: 0x7C59, + 0xF6FD: 0x7C5B, + 0xF6FE: 0x7C5A, + 0xF740: 0x7CF4, + 0xF741: 0x7CF1, + 0xF742: 0x7E91, + 0xF743: 0x7F4F, + 0xF744: 0x7F87, + 0xF745: 0x81DE, + 0xF746: 0x826B, + 0xF747: 0x8634, + 0xF748: 0x8635, + 0xF749: 0x8633, + 0xF74A: 0x862C, + 0xF74B: 0x8632, + 0xF74C: 0x8636, + 0xF74D: 0x882C, + 0xF74E: 0x8828, + 0xF74F: 0x8826, + 0xF750: 0x882A, + 0xF751: 0x8825, + 0xF752: 0x8971, + 0xF753: 0x89BF, + 0xF754: 0x89BE, + 0xF755: 0x89FB, + 0xF756: 0x8B7E, + 0xF757: 0x8B84, + 0xF758: 0x8B82, + 0xF759: 0x8B86, + 0xF75A: 0x8B85, + 0xF75B: 0x8B7F, + 0xF75C: 0x8D15, + 0xF75D: 0x8E95, + 0xF75E: 0x8E94, + 0xF75F: 0x8E9A, + 0xF760: 0x8E92, + 0xF761: 0x8E90, + 0xF762: 0x8E96, + 0xF763: 0x8E97, + 0xF764: 0x8F60, + 0xF765: 0x8F62, + 0xF766: 0x9147, + 0xF767: 0x944C, + 0xF768: 0x9450, + 0xF769: 0x944A, + 0xF76A: 0x944B, + 0xF76B: 0x944F, + 0xF76C: 0x9447, + 0xF76D: 0x9445, + 0xF76E: 0x9448, + 0xF76F: 0x9449, + 0xF770: 0x9446, + 0xF771: 0x973F, + 0xF772: 0x97E3, + 0xF773: 0x986A, + 0xF774: 0x9869, + 0xF775: 0x98CB, + 0xF776: 0x9954, + 0xF777: 0x995B, + 0xF778: 0x9A4E, + 0xF779: 0x9A53, + 0xF77A: 0x9A54, + 0xF77B: 0x9A4C, + 0xF77C: 0x9A4F, + 0xF77D: 0x9A48, + 0xF77E: 0x9A4A, + 0xF7A1: 0x9A49, + 0xF7A2: 0x9A52, + 0xF7A3: 0x9A50, + 0xF7A4: 0x9AD0, + 0xF7A5: 0x9B19, + 0xF7A6: 0x9B2B, + 0xF7A7: 0x9B3B, + 0xF7A8: 0x9B56, + 0xF7A9: 0x9B55, + 0xF7AA: 0x9C46, + 0xF7AB: 0x9C48, + 0xF7AC: 0x9C3F, + 0xF7AD: 0x9C44, + 0xF7AE: 0x9C39, + 0xF7AF: 0x9C33, + 0xF7B0: 0x9C41, + 0xF7B1: 0x9C3C, + 0xF7B2: 0x9C37, + 0xF7B3: 0x9C34, + 0xF7B4: 0x9C32, + 0xF7B5: 0x9C3D, + 0xF7B6: 0x9C36, + 0xF7B7: 0x9DDB, + 0xF7B8: 0x9DD2, + 0xF7B9: 0x9DDE, + 0xF7BA: 0x9DDA, + 0xF7BB: 0x9DCB, + 0xF7BC: 0x9DD0, + 0xF7BD: 0x9DDC, + 0xF7BE: 0x9DD1, + 0xF7BF: 0x9DDF, + 0xF7C0: 0x9DE9, + 0xF7C1: 0x9DD9, + 0xF7C2: 0x9DD8, + 0xF7C3: 0x9DD6, + 0xF7C4: 0x9DF5, + 0xF7C5: 0x9DD5, + 0xF7C6: 0x9DDD, + 0xF7C7: 0x9EB6, + 0xF7C8: 0x9EF0, + 0xF7C9: 0x9F35, + 0xF7CA: 0x9F33, + 0xF7CB: 0x9F32, + 0xF7CC: 0x9F42, + 0xF7CD: 0x9F6B, + 0xF7CE: 0x9F95, + 0xF7CF: 0x9FA2, + 0xF7D0: 0x513D, + 0xF7D1: 0x5299, + 0xF7D2: 0x58E8, + 0xF7D3: 0x58E7, + 0xF7D4: 0x5972, + 0xF7D5: 0x5B4D, + 0xF7D6: 0x5DD8, + 0xF7D7: 0x882F, + 0xF7D8: 0x5F4F, + 0xF7D9: 0x6201, + 0xF7DA: 0x6203, + 0xF7DB: 0x6204, + 0xF7DC: 0x6529, + 0xF7DD: 0x6525, + 0xF7DE: 0x6596, + 0xF7DF: 0x66EB, + 0xF7E0: 0x6B11, + 0xF7E1: 0x6B12, + 0xF7E2: 0x6B0F, + 0xF7E3: 0x6BCA, + 0xF7E4: 0x705B, + 0xF7E5: 0x705A, + 0xF7E6: 0x7222, + 0xF7E7: 0x7382, + 0xF7E8: 0x7381, + 0xF7E9: 0x7383, + 0xF7EA: 0x7670, + 0xF7EB: 0x77D4, + 0xF7EC: 0x7C67, + 0xF7ED: 0x7C66, + 0xF7EE: 0x7E95, + 0xF7EF: 0x826C, + 0xF7F0: 0x863A, + 0xF7F1: 0x8640, + 0xF7F2: 0x8639, + 0xF7F3: 0x863C, + 0xF7F4: 0x8631, + 0xF7F5: 0x863B, + 0xF7F6: 0x863E, + 0xF7F7: 0x8830, + 0xF7F8: 0x8832, + 0xF7F9: 0x882E, + 0xF7FA: 0x8833, + 0xF7FB: 0x8976, + 0xF7FC: 0x8974, + 0xF7FD: 0x8973, + 0xF7FE: 0x89FE, + 0xF840: 0x8B8C, + 0xF841: 0x8B8E, + 0xF842: 0x8B8B, + 0xF843: 0x8B88, + 0xF844: 0x8C45, + 0xF845: 0x8D19, + 0xF846: 0x8E98, + 0xF847: 0x8F64, + 0xF848: 0x8F63, + 0xF849: 0x91BC, + 0xF84A: 0x9462, + 0xF84B: 0x9455, + 0xF84C: 0x945D, + 0xF84D: 0x9457, + 0xF84E: 0x945E, + 0xF84F: 0x97C4, + 0xF850: 0x97C5, + 0xF851: 0x9800, + 0xF852: 0x9A56, + 0xF853: 0x9A59, + 0xF854: 0x9B1E, + 0xF855: 0x9B1F, + 0xF856: 0x9B20, + 0xF857: 0x9C52, + 0xF858: 0x9C58, + 0xF859: 0x9C50, + 0xF85A: 0x9C4A, + 0xF85B: 0x9C4D, + 0xF85C: 0x9C4B, + 0xF85D: 0x9C55, + 0xF85E: 0x9C59, + 0xF85F: 0x9C4C, + 0xF860: 0x9C4E, + 0xF861: 0x9DFB, + 0xF862: 0x9DF7, + 0xF863: 0x9DEF, + 0xF864: 0x9DE3, + 0xF865: 0x9DEB, + 0xF866: 0x9DF8, + 0xF867: 0x9DE4, + 0xF868: 0x9DF6, + 0xF869: 0x9DE1, + 0xF86A: 0x9DEE, + 0xF86B: 0x9DE6, + 0xF86C: 0x9DF2, + 0xF86D: 0x9DF0, + 0xF86E: 0x9DE2, + 0xF86F: 0x9DEC, + 0xF870: 0x9DF4, + 0xF871: 0x9DF3, + 0xF872: 0x9DE8, + 0xF873: 0x9DED, + 0xF874: 0x9EC2, + 0xF875: 0x9ED0, + 0xF876: 0x9EF2, + 0xF877: 0x9EF3, + 0xF878: 0x9F06, + 0xF879: 0x9F1C, + 0xF87A: 0x9F38, + 0xF87B: 0x9F37, + 0xF87C: 0x9F36, + 0xF87D: 0x9F43, + 0xF87E: 0x9F4F, + 0xF8A1: 0x9F71, + 0xF8A2: 0x9F70, + 0xF8A3: 0x9F6E, + 0xF8A4: 0x9F6F, + 0xF8A5: 0x56D3, + 0xF8A6: 0x56CD, + 0xF8A7: 0x5B4E, + 0xF8A8: 0x5C6D, + 0xF8A9: 0x652D, + 0xF8AA: 0x66ED, + 0xF8AB: 0x66EE, + 0xF8AC: 0x6B13, + 0xF8AD: 0x705F, + 0xF8AE: 0x7061, + 0xF8AF: 0x705D, + 0xF8B0: 0x7060, + 0xF8B1: 0x7223, + 0xF8B2: 0x74DB, + 0xF8B3: 0x74E5, + 0xF8B4: 0x77D5, + 0xF8B5: 0x7938, + 0xF8B6: 0x79B7, + 0xF8B7: 0x79B6, + 0xF8B8: 0x7C6A, + 0xF8B9: 0x7E97, + 0xF8BA: 0x7F89, + 0xF8BB: 0x826D, + 0xF8BC: 0x8643, + 0xF8BD: 0x8838, + 0xF8BE: 0x8837, + 0xF8BF: 0x8835, + 0xF8C0: 0x884B, + 0xF8C1: 0x8B94, + 0xF8C2: 0x8B95, + 0xF8C3: 0x8E9E, + 0xF8C4: 0x8E9F, + 0xF8C5: 0x8EA0, + 0xF8C6: 0x8E9D, + 0xF8C7: 0x91BE, + 0xF8C8: 0x91BD, + 0xF8C9: 0x91C2, + 0xF8CA: 0x946B, + 0xF8CB: 0x9468, + 0xF8CC: 0x9469, + 0xF8CD: 0x96E5, + 0xF8CE: 0x9746, + 0xF8CF: 0x9743, + 0xF8D0: 0x9747, + 0xF8D1: 0x97C7, + 0xF8D2: 0x97E5, + 0xF8D3: 0x9A5E, + 0xF8D4: 0x9AD5, + 0xF8D5: 0x9B59, + 0xF8D6: 0x9C63, + 0xF8D7: 0x9C67, + 0xF8D8: 0x9C66, + 0xF8D9: 0x9C62, + 0xF8DA: 0x9C5E, + 0xF8DB: 0x9C60, + 0xF8DC: 0x9E02, + 0xF8DD: 0x9DFE, + 0xF8DE: 0x9E07, + 0xF8DF: 0x9E03, + 0xF8E0: 0x9E06, + 0xF8E1: 0x9E05, + 0xF8E2: 0x9E00, + 0xF8E3: 0x9E01, + 0xF8E4: 0x9E09, + 0xF8E5: 0x9DFF, + 0xF8E6: 0x9DFD, + 0xF8E7: 0x9E04, + 0xF8E8: 0x9EA0, + 0xF8E9: 0x9F1E, + 0xF8EA: 0x9F46, + 0xF8EB: 0x9F74, + 0xF8EC: 0x9F75, + 0xF8ED: 0x9F76, + 0xF8EE: 0x56D4, + 0xF8EF: 0x652E, + 0xF8F0: 0x65B8, + 0xF8F1: 0x6B18, + 0xF8F2: 0x6B19, + 0xF8F3: 0x6B17, + 0xF8F4: 0x6B1A, + 0xF8F5: 0x7062, + 0xF8F6: 0x7226, + 0xF8F7: 0x72AA, + 0xF8F8: 0x77D8, + 0xF8F9: 0x77D9, + 0xF8FA: 0x7939, + 0xF8FB: 0x7C69, + 0xF8FC: 0x7C6B, + 0xF8FD: 0x7CF6, + 0xF8FE: 0x7E9A, + 0xF940: 0x7E98, + 0xF941: 0x7E9B, + 0xF942: 0x7E99, + 0xF943: 0x81E0, + 0xF944: 0x81E1, + 0xF945: 0x8646, + 0xF946: 0x8647, + 0xF947: 0x8648, + 0xF948: 0x8979, + 0xF949: 0x897A, + 0xF94A: 0x897C, + 0xF94B: 0x897B, + 0xF94C: 0x89FF, + 0xF94D: 0x8B98, + 0xF94E: 0x8B99, + 0xF94F: 0x8EA5, + 0xF950: 0x8EA4, + 0xF951: 0x8EA3, + 0xF952: 0x946E, + 0xF953: 0x946D, + 0xF954: 0x946F, + 0xF955: 0x9471, + 0xF956: 0x9473, + 0xF957: 0x9749, + 0xF958: 0x9872, + 0xF959: 0x995F, + 0xF95A: 0x9C68, + 0xF95B: 0x9C6E, + 0xF95C: 0x9C6D, + 0xF95D: 0x9E0B, + 0xF95E: 0x9E0D, + 0xF95F: 0x9E10, + 0xF960: 0x9E0F, + 0xF961: 0x9E12, + 0xF962: 0x9E11, + 0xF963: 0x9EA1, + 0xF964: 0x9EF5, + 0xF965: 0x9F09, + 0xF966: 0x9F47, + 0xF967: 0x9F78, + 0xF968: 0x9F7B, + 0xF969: 0x9F7A, + 0xF96A: 0x9F79, + 0xF96B: 0x571E, + 0xF96C: 0x7066, + 0xF96D: 0x7C6F, + 0xF96E: 0x883C, + 0xF96F: 0x8DB2, + 0xF970: 0x8EA6, + 0xF971: 0x91C3, + 0xF972: 0x9474, + 0xF973: 0x9478, + 0xF974: 0x9476, + 0xF975: 0x9475, + 0xF976: 0x9A60, + 0xF977: 0x9C74, + 0xF978: 0x9C73, + 0xF979: 0x9C71, + 0xF97A: 0x9C75, + 0xF97B: 0x9E14, + 0xF97C: 0x9E13, + 0xF97D: 0x9EF6, + 0xF97E: 0x9F0A, + 0xF9A1: 0x9FA4, + 0xF9A2: 0x7068, + 0xF9A3: 0x7065, + 0xF9A4: 0x7CF7, + 0xF9A5: 0x866A, + 0xF9A6: 0x883E, + 0xF9A7: 0x883D, + 0xF9A8: 0x883F, + 0xF9A9: 0x8B9E, + 0xF9AA: 0x8C9C, + 0xF9AB: 0x8EA9, + 0xF9AC: 0x8EC9, + 0xF9AD: 0x974B, + 0xF9AE: 0x9873, + 0xF9AF: 0x9874, + 0xF9B0: 0x98CC, + 0xF9B1: 0x9961, + 0xF9B2: 0x99AB, + 0xF9B3: 0x9A64, + 0xF9B4: 0x9A66, + 0xF9B5: 0x9A67, + 0xF9B6: 0x9B24, + 0xF9B7: 0x9E15, + 0xF9B8: 0x9E17, + 0xF9B9: 0x9F48, + 0xF9BA: 0x6207, + 0xF9BB: 0x6B1E, + 0xF9BC: 0x7227, + 0xF9BD: 0x864C, + 0xF9BE: 0x8EA8, + 0xF9BF: 0x9482, + 0xF9C0: 0x9480, + 0xF9C1: 0x9481, + 0xF9C2: 0x9A69, + 0xF9C3: 0x9A68, + 0xF9C4: 0x9B2E, + 0xF9C5: 0x9E19, + 0xF9C6: 0x7229, + 0xF9C7: 0x864B, + 0xF9C8: 0x8B9F, + 0xF9C9: 0x9483, + 0xF9CA: 0x9C79, + 0xF9CB: 0x9EB7, + 0xF9CC: 0x7675, + 0xF9CD: 0x9A6B, + 0xF9CE: 0x9C7A, + 0xF9CF: 0x9E1D, + 0xF9D0: 0x7069, + 0xF9D1: 0x706A, + 0xF9D2: 0x9EA4, + 0xF9D3: 0x9F7E, + 0xF9D4: 0x9F49, + 0xF9D5: 0x9F98, +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/big5.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/big5.go new file mode 100644 index 0000000000000000000000000000000000000000..07044fe9e26b0955818068d713fc143daab43f4e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/big5.go @@ -0,0 +1,89 @@ +package mahonia + +// Converters for Big 5 encoding. + +import ( + "sync" +) + +func init() { + RegisterCharset(&Charset{ + Name: "Big5", + Aliases: []string{"csBig5"}, + NewDecoder: func() Decoder { + return decodeBig5Rune + }, + NewEncoder: func() Encoder { + big5Once.Do(reverseBig5Table) + return encodeBig5Rune + }, + }) +} + +func decodeBig5Rune(p []byte) (r rune, size int, status Status) { + if len(p) == 0 { + status = NO_ROOM + return + } + + b := p[0] + if b < 128 { + return rune(b), 1, SUCCESS + } + + if len(p) < 2 { + status = NO_ROOM + return + } + + c := int(p[0])<<8 + int(p[1]) + c = int(big5ToUnicode[c]) + if c > 0 { + return rune(c), 2, SUCCESS + } + + return 0xfffd, 1, INVALID_CHAR +} + +func encodeBig5Rune(p []byte, r rune) (size int, status Status) { + if len(p) == 0 { + status = NO_ROOM + return + } + + if r < 128 { + p[0] = byte(r) + return 1, SUCCESS + } + + if len(p) < 2 { + status = NO_ROOM + return + } + + if r < 0x10000 { + c := unicodeToBig5[r] + if c > 0 { + p[0] = byte(c >> 8) + p[1] = byte(c) + return 2, SUCCESS + } + } + + p[0] = '?' + return 1, INVALID_CHAR +} + +var big5Once sync.Once + +var unicodeToBig5 []uint16 + +func reverseBig5Table() { + unicodeToBig5 = make([]uint16, 65536) + + for big5, unicode := range big5ToUnicode { + if unicode > 0 { + unicodeToBig5[unicode] = uint16(big5) + } + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/charset.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/charset.go new file mode 100644 index 0000000000000000000000000000000000000000..6955c8e35be8939fe6149f698e98948ef13f5ddd --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/charset.go @@ -0,0 +1,112 @@ +// This package is a character-set conversion library for Go. +package mahonia + +import ( + "bytes" + "unicode" +) + +// Status is the type for the status return value from a Decoder or Encoder. +type Status int + +const ( + // SUCCESS means that the character was converted with no problems. + SUCCESS = Status(iota) + + // INVALID_CHAR means that the source contained invalid bytes, or that the character + // could not be represented in the destination encoding. + // The Encoder or Decoder should have output a substitute character. + INVALID_CHAR + + // NO_ROOM means there were not enough input bytes to form a complete character, + // or there was not enough room in the output buffer to write a complete character. + // No bytes were written, and no internal state was changed in the Encoder or Decoder. + NO_ROOM + + // STATE_ONLY means that bytes were read or written indicating a state transition, + // but no actual character was processed. (Examples: byte order marks, ISO-2022 escape sequences) + STATE_ONLY +) + +// A Decoder is a function that decodes a character set, one character at a time. +// It works much like utf8.DecodeRune, but has an aditional status return value. +type Decoder func(p []byte) (c rune, size int, status Status) + +// An Encoder is a function that encodes a character set, one character at a time. +// It works much like utf8.EncodeRune, but has an additional status return value. +type Encoder func(p []byte, c rune) (size int, status Status) + +// A Charset represents a character set that can be converted, and contains functions +// to create Converters to encode and decode strings in that character set. +type Charset struct { + // Name is the character set's canonical name. + Name string + + // Aliases returns a list of alternate names. + Aliases []string + + // NewDecoder returns a Decoder to convert from the charset to Unicode. + NewDecoder func() Decoder + + // NewEncoder returns an Encoder to convert from Unicode to the charset. + NewEncoder func() Encoder +} + +// The charsets are stored in charsets under their canonical names. +var charsets = make(map[string]*Charset) + +// aliases maps their aliases to their canonical names. +var aliases = make(map[string]string) + +// simplifyName converts a name to lower case and removes non-alphanumeric characters. +// This is how the names are used as keys to the maps. +func simplifyName(name string) string { + var buf bytes.Buffer + for _, c := range name { + switch { + case unicode.IsDigit(c): + buf.WriteRune(c) + case unicode.IsLetter(c): + buf.WriteRune(unicode.ToLower(c)) + default: + + } + } + + return buf.String() +} + +// RegisterCharset adds a charset to the charsetMap. +func RegisterCharset(cs *Charset) { + name := cs.Name + charsets[name] = cs + aliases[simplifyName(name)] = name + for _, alias := range cs.Aliases { + aliases[simplifyName(alias)] = name + } +} + +// GetCharset fetches a charset by name. +// If the name is not found, it returns nil. +func GetCharset(name string) *Charset { + return charsets[aliases[simplifyName(name)]] +} + +// NewDecoder returns a Decoder to decode the named charset. +// If the name is not found, it returns nil. +func NewDecoder(name string) Decoder { + cs := GetCharset(name) + if cs == nil { + return nil + } + return cs.NewDecoder() +} + +// NewEncoder returns an Encoder to encode the named charset. +func NewEncoder(name string) Encoder { + cs := GetCharset(name) + if cs == nil { + return nil + } + return cs.NewEncoder() +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/convert_string.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/convert_string.go new file mode 100644 index 0000000000000000000000000000000000000000..f95fbb5692180192dc91053bf7e03416c123e037 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/convert_string.go @@ -0,0 +1,56 @@ +package mahonia + +// ConvertString converts a string from UTF-8 to e's encoding. +func (e Encoder) ConvertString(s string) string { + dest := make([]byte, len(s)+10) + destPos := 0 + + for _, rune := range s { + retry: + size, status := e(dest[destPos:], rune) + + if status == NO_ROOM { + newDest := make([]byte, len(dest)*2) + copy(newDest, dest) + dest = newDest + goto retry + } + + if status == STATE_ONLY { + destPos += size + goto retry + } + + destPos += size + } + + return string(dest[:destPos]) +} + +// ConvertString converts a string from d's encoding to UTF-8. +func (d Decoder) ConvertString(s string) string { + bytes := []byte(s) + runes := make([]rune, len(s)) + destPos := 0 + + for len(bytes) > 0 { + c, size, status := d(bytes) + + if status == STATE_ONLY { + bytes = bytes[size:] + continue + } + + if status == NO_ROOM { + c = 0xfffd + size = len(bytes) + status = INVALID_CHAR + } + + bytes = bytes[size:] + runes[destPos] = c + destPos++ + } + + return string(runes[:destPos]) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/entity.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/entity.go new file mode 100644 index 0000000000000000000000000000000000000000..9a47ba1ae942b32a85d528be770665dee9842221 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/entity.go @@ -0,0 +1,196 @@ +package mahonia + +// decoding HTML entities + +import ( + "sync" +) + +var entityOnce sync.Once + +// entityTrie is similar to mbcsTrie, but not identical. +type htmlEntityTrie struct { + runes [2]rune // Some HTML entities decode to two characters. + children []htmlEntityTrie +} + +var entityTrie htmlEntityTrie + +func buildEntityTrie() { + for e, c := range entity { + current := &entityTrie + for i := 0; i < len(e); i++ { + if current.children == nil { + current.children = make([]htmlEntityTrie, 256) + } + current = &current.children[e[i]] + } + current.runes[0] = c + } + + for e, runes := range entity2 { + current := &entityTrie + for i := 0; i < len(e); i++ { + if current.children == nil { + current.children = make([]htmlEntityTrie, 256) + } + current = &current.children[e[i]] + } + current.runes = runes + } +} + +// EntityDecoder returns a Decoder that decodes HTML character entities. +// If there is no valid character entity at the current position, it returns INVALID_CHAR. +// So it needs to be combined with another Decoder via FallbackDecoder. +func EntityDecoder() Decoder { + entityOnce.Do(buildEntityTrie) + var leftover rune // leftover rune from two-rune entity + return func(p []byte) (r rune, size int, status Status) { + if leftover != 0 { + r = leftover + leftover = 0 + return r, 0, SUCCESS + } + + if len(p) == 0 { + return 0, 0, NO_ROOM + } + + if p[0] != '&' { + return 0xfffd, 1, INVALID_CHAR + } + + if len(p) < 3 { + return 0, 1, NO_ROOM + } + + r, size, status = 0xfffd, 1, INVALID_CHAR + n := 1 // number of bytes read so far + + if p[n] == '#' { + n++ + c := p[n] + hex := false + if c == 'x' || c == 'X' { + hex = true + n++ + } + + var x rune + for n < len(p) { + c = p[n] + n++ + if hex { + if '0' <= c && c <= '9' { + x = 16*x + rune(c) - '0' + continue + } else if 'a' <= c && c <= 'f' { + x = 16*x + rune(c) - 'a' + 10 + continue + } else if 'A' <= c && c <= 'F' { + x = 16*x + rune(c) - 'A' + 10 + continue + } + } else if '0' <= c && c <= '9' { + x = 10*x + rune(c) - '0' + continue + } + if c != ';' { + n-- + } + break + } + + if n == len(p) && p[n-1] != ';' { + return 0, 0, NO_ROOM + } + + size = n + if p[n-1] == ';' { + n-- + } + if hex { + n-- + } + n-- + // Now n is the number of actual digits read. + if n == 0 { + return 0xfffd, 1, INVALID_CHAR + } + + if 0x80 <= x && x <= 0x9F { + // Replace characters from Windows-1252 with UTF-8 equivalents. + x = replacementTable[x-0x80] + } else if x == 0 || (0xD800 <= x && x <= 0xDFFF) || x > 0x10FFFF { + // Replace invalid characters with the replacement character. + return 0xfffd, size, INVALID_CHAR + } + + r = x + status = SUCCESS + return + } + + current := &entityTrie + for current.children != nil { + if len(p) <= n { + leftover = 0 + return 0, 0, NO_ROOM + } + + current = &current.children[p[n]] + n++ + if current.runes[0] != 0 { + r, leftover = current.runes[0], current.runes[1] + size = n + status = SUCCESS + // but don't return yet, since we need the longest match + } + } + + return + } +} + +// This table is copied from /src/pkg/html/escape.go in the Go source +// +// These replacements permit compatibility with old numeric entities that +// assumed Windows-1252 encoding. +// http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#consume-a-character-reference +var replacementTable = [...]rune{ + '\u20AC', // First entry is what 0x80 should be replaced with. + '\u0081', + '\u201A', + '\u0192', + '\u201E', + '\u2026', + '\u2020', + '\u2021', + '\u02C6', + '\u2030', + '\u0160', + '\u2039', + '\u0152', + '\u008D', + '\u017D', + '\u008F', + '\u0090', + '\u2018', + '\u2019', + '\u201C', + '\u201D', + '\u2022', + '\u2013', + '\u2014', + '\u02DC', + '\u2122', + '\u0161', + '\u203A', + '\u0153', + '\u009D', + '\u017E', + '\u0178', // Last entry is 0x9F. + // 0x00->'\uFFFD' is handled programmatically. + // 0x0D->'\u000D' is a no-op. +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/entity_data.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/entity_data.go new file mode 100644 index 0000000000000000000000000000000000000000..380b25625c3159b88c33cfa847a4bc4bd84e1900 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/entity_data.go @@ -0,0 +1,2253 @@ +package mahonia + +// Taken from /src/pkg/html/entity.go in the Go source code. + +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//package html + +// entity is a map from HTML entity names to their values. The semicolon matters: +// http://www.whatwg.org/specs/web-apps/current-work/multipage/named-character-references.html +// lists both "amp" and "amp;" as two separate entries. +// +// Note that the HTML5 list is larger than the HTML4 list at +// http://www.w3.org/TR/html4/sgml/entities.html +var entity = map[string]rune{ + "AElig;": '\U000000C6', + "AMP;": '\U00000026', + "Aacute;": '\U000000C1', + "Abreve;": '\U00000102', + "Acirc;": '\U000000C2', + "Acy;": '\U00000410', + "Afr;": '\U0001D504', + "Agrave;": '\U000000C0', + "Alpha;": '\U00000391', + "Amacr;": '\U00000100', + "And;": '\U00002A53', + "Aogon;": '\U00000104', + "Aopf;": '\U0001D538', + "ApplyFunction;": '\U00002061', + "Aring;": '\U000000C5', + "Ascr;": '\U0001D49C', + "Assign;": '\U00002254', + "Atilde;": '\U000000C3', + "Auml;": '\U000000C4', + "Backslash;": '\U00002216', + "Barv;": '\U00002AE7', + "Barwed;": '\U00002306', + "Bcy;": '\U00000411', + "Because;": '\U00002235', + "Bernoullis;": '\U0000212C', + "Beta;": '\U00000392', + "Bfr;": '\U0001D505', + "Bopf;": '\U0001D539', + "Breve;": '\U000002D8', + "Bscr;": '\U0000212C', + "Bumpeq;": '\U0000224E', + "CHcy;": '\U00000427', + "COPY;": '\U000000A9', + "Cacute;": '\U00000106', + "Cap;": '\U000022D2', + "CapitalDifferentialD;": '\U00002145', + "Cayleys;": '\U0000212D', + "Ccaron;": '\U0000010C', + "Ccedil;": '\U000000C7', + "Ccirc;": '\U00000108', + "Cconint;": '\U00002230', + "Cdot;": '\U0000010A', + "Cedilla;": '\U000000B8', + "CenterDot;": '\U000000B7', + "Cfr;": '\U0000212D', + "Chi;": '\U000003A7', + "CircleDot;": '\U00002299', + "CircleMinus;": '\U00002296', + "CirclePlus;": '\U00002295', + "CircleTimes;": '\U00002297', + "ClockwiseContourIntegral;": '\U00002232', + "CloseCurlyDoubleQuote;": '\U0000201D', + "CloseCurlyQuote;": '\U00002019', + "Colon;": '\U00002237', + "Colone;": '\U00002A74', + "Congruent;": '\U00002261', + "Conint;": '\U0000222F', + "ContourIntegral;": '\U0000222E', + "Copf;": '\U00002102', + "Coproduct;": '\U00002210', + "CounterClockwiseContourIntegral;": '\U00002233', + "Cross;": '\U00002A2F', + "Cscr;": '\U0001D49E', + "Cup;": '\U000022D3', + "CupCap;": '\U0000224D', + "DD;": '\U00002145', + "DDotrahd;": '\U00002911', + "DJcy;": '\U00000402', + "DScy;": '\U00000405', + "DZcy;": '\U0000040F', + "Dagger;": '\U00002021', + "Darr;": '\U000021A1', + "Dashv;": '\U00002AE4', + "Dcaron;": '\U0000010E', + "Dcy;": '\U00000414', + "Del;": '\U00002207', + "Delta;": '\U00000394', + "Dfr;": '\U0001D507', + "DiacriticalAcute;": '\U000000B4', + "DiacriticalDot;": '\U000002D9', + "DiacriticalDoubleAcute;": '\U000002DD', + "DiacriticalGrave;": '\U00000060', + "DiacriticalTilde;": '\U000002DC', + "Diamond;": '\U000022C4', + "DifferentialD;": '\U00002146', + "Dopf;": '\U0001D53B', + "Dot;": '\U000000A8', + "DotDot;": '\U000020DC', + "DotEqual;": '\U00002250', + "DoubleContourIntegral;": '\U0000222F', + "DoubleDot;": '\U000000A8', + "DoubleDownArrow;": '\U000021D3', + "DoubleLeftArrow;": '\U000021D0', + "DoubleLeftRightArrow;": '\U000021D4', + "DoubleLeftTee;": '\U00002AE4', + "DoubleLongLeftArrow;": '\U000027F8', + "DoubleLongLeftRightArrow;": '\U000027FA', + "DoubleLongRightArrow;": '\U000027F9', + "DoubleRightArrow;": '\U000021D2', + "DoubleRightTee;": '\U000022A8', + "DoubleUpArrow;": '\U000021D1', + "DoubleUpDownArrow;": '\U000021D5', + "DoubleVerticalBar;": '\U00002225', + "DownArrow;": '\U00002193', + "DownArrowBar;": '\U00002913', + "DownArrowUpArrow;": '\U000021F5', + "DownBreve;": '\U00000311', + "DownLeftRightVector;": '\U00002950', + "DownLeftTeeVector;": '\U0000295E', + "DownLeftVector;": '\U000021BD', + "DownLeftVectorBar;": '\U00002956', + "DownRightTeeVector;": '\U0000295F', + "DownRightVector;": '\U000021C1', + "DownRightVectorBar;": '\U00002957', + "DownTee;": '\U000022A4', + "DownTeeArrow;": '\U000021A7', + "Downarrow;": '\U000021D3', + "Dscr;": '\U0001D49F', + "Dstrok;": '\U00000110', + "ENG;": '\U0000014A', + "ETH;": '\U000000D0', + "Eacute;": '\U000000C9', + "Ecaron;": '\U0000011A', + "Ecirc;": '\U000000CA', + "Ecy;": '\U0000042D', + "Edot;": '\U00000116', + "Efr;": '\U0001D508', + "Egrave;": '\U000000C8', + "Element;": '\U00002208', + "Emacr;": '\U00000112', + "EmptySmallSquare;": '\U000025FB', + "EmptyVerySmallSquare;": '\U000025AB', + "Eogon;": '\U00000118', + "Eopf;": '\U0001D53C', + "Epsilon;": '\U00000395', + "Equal;": '\U00002A75', + "EqualTilde;": '\U00002242', + "Equilibrium;": '\U000021CC', + "Escr;": '\U00002130', + "Esim;": '\U00002A73', + "Eta;": '\U00000397', + "Euml;": '\U000000CB', + "Exists;": '\U00002203', + "ExponentialE;": '\U00002147', + "Fcy;": '\U00000424', + "Ffr;": '\U0001D509', + "FilledSmallSquare;": '\U000025FC', + "FilledVerySmallSquare;": '\U000025AA', + "Fopf;": '\U0001D53D', + "ForAll;": '\U00002200', + "Fouriertrf;": '\U00002131', + "Fscr;": '\U00002131', + "GJcy;": '\U00000403', + "GT;": '\U0000003E', + "Gamma;": '\U00000393', + "Gammad;": '\U000003DC', + "Gbreve;": '\U0000011E', + "Gcedil;": '\U00000122', + "Gcirc;": '\U0000011C', + "Gcy;": '\U00000413', + "Gdot;": '\U00000120', + "Gfr;": '\U0001D50A', + "Gg;": '\U000022D9', + "Gopf;": '\U0001D53E', + "GreaterEqual;": '\U00002265', + "GreaterEqualLess;": '\U000022DB', + "GreaterFullEqual;": '\U00002267', + "GreaterGreater;": '\U00002AA2', + "GreaterLess;": '\U00002277', + "GreaterSlantEqual;": '\U00002A7E', + "GreaterTilde;": '\U00002273', + "Gscr;": '\U0001D4A2', + "Gt;": '\U0000226B', + "HARDcy;": '\U0000042A', + "Hacek;": '\U000002C7', + "Hat;": '\U0000005E', + "Hcirc;": '\U00000124', + "Hfr;": '\U0000210C', + "HilbertSpace;": '\U0000210B', + "Hopf;": '\U0000210D', + "HorizontalLine;": '\U00002500', + "Hscr;": '\U0000210B', + "Hstrok;": '\U00000126', + "HumpDownHump;": '\U0000224E', + "HumpEqual;": '\U0000224F', + "IEcy;": '\U00000415', + "IJlig;": '\U00000132', + "IOcy;": '\U00000401', + "Iacute;": '\U000000CD', + "Icirc;": '\U000000CE', + "Icy;": '\U00000418', + "Idot;": '\U00000130', + "Ifr;": '\U00002111', + "Igrave;": '\U000000CC', + "Im;": '\U00002111', + "Imacr;": '\U0000012A', + "ImaginaryI;": '\U00002148', + "Implies;": '\U000021D2', + "Int;": '\U0000222C', + "Integral;": '\U0000222B', + "Intersection;": '\U000022C2', + "InvisibleComma;": '\U00002063', + "InvisibleTimes;": '\U00002062', + "Iogon;": '\U0000012E', + "Iopf;": '\U0001D540', + "Iota;": '\U00000399', + "Iscr;": '\U00002110', + "Itilde;": '\U00000128', + "Iukcy;": '\U00000406', + "Iuml;": '\U000000CF', + "Jcirc;": '\U00000134', + "Jcy;": '\U00000419', + "Jfr;": '\U0001D50D', + "Jopf;": '\U0001D541', + "Jscr;": '\U0001D4A5', + "Jsercy;": '\U00000408', + "Jukcy;": '\U00000404', + "KHcy;": '\U00000425', + "KJcy;": '\U0000040C', + "Kappa;": '\U0000039A', + "Kcedil;": '\U00000136', + "Kcy;": '\U0000041A', + "Kfr;": '\U0001D50E', + "Kopf;": '\U0001D542', + "Kscr;": '\U0001D4A6', + "LJcy;": '\U00000409', + "LT;": '\U0000003C', + "Lacute;": '\U00000139', + "Lambda;": '\U0000039B', + "Lang;": '\U000027EA', + "Laplacetrf;": '\U00002112', + "Larr;": '\U0000219E', + "Lcaron;": '\U0000013D', + "Lcedil;": '\U0000013B', + "Lcy;": '\U0000041B', + "LeftAngleBracket;": '\U000027E8', + "LeftArrow;": '\U00002190', + "LeftArrowBar;": '\U000021E4', + "LeftArrowRightArrow;": '\U000021C6', + "LeftCeiling;": '\U00002308', + "LeftDoubleBracket;": '\U000027E6', + "LeftDownTeeVector;": '\U00002961', + "LeftDownVector;": '\U000021C3', + "LeftDownVectorBar;": '\U00002959', + "LeftFloor;": '\U0000230A', + "LeftRightArrow;": '\U00002194', + "LeftRightVector;": '\U0000294E', + "LeftTee;": '\U000022A3', + "LeftTeeArrow;": '\U000021A4', + "LeftTeeVector;": '\U0000295A', + "LeftTriangle;": '\U000022B2', + "LeftTriangleBar;": '\U000029CF', + "LeftTriangleEqual;": '\U000022B4', + "LeftUpDownVector;": '\U00002951', + "LeftUpTeeVector;": '\U00002960', + "LeftUpVector;": '\U000021BF', + "LeftUpVectorBar;": '\U00002958', + "LeftVector;": '\U000021BC', + "LeftVectorBar;": '\U00002952', + "Leftarrow;": '\U000021D0', + "Leftrightarrow;": '\U000021D4', + "LessEqualGreater;": '\U000022DA', + "LessFullEqual;": '\U00002266', + "LessGreater;": '\U00002276', + "LessLess;": '\U00002AA1', + "LessSlantEqual;": '\U00002A7D', + "LessTilde;": '\U00002272', + "Lfr;": '\U0001D50F', + "Ll;": '\U000022D8', + "Lleftarrow;": '\U000021DA', + "Lmidot;": '\U0000013F', + "LongLeftArrow;": '\U000027F5', + "LongLeftRightArrow;": '\U000027F7', + "LongRightArrow;": '\U000027F6', + "Longleftarrow;": '\U000027F8', + "Longleftrightarrow;": '\U000027FA', + "Longrightarrow;": '\U000027F9', + "Lopf;": '\U0001D543', + "LowerLeftArrow;": '\U00002199', + "LowerRightArrow;": '\U00002198', + "Lscr;": '\U00002112', + "Lsh;": '\U000021B0', + "Lstrok;": '\U00000141', + "Lt;": '\U0000226A', + "Map;": '\U00002905', + "Mcy;": '\U0000041C', + "MediumSpace;": '\U0000205F', + "Mellintrf;": '\U00002133', + "Mfr;": '\U0001D510', + "MinusPlus;": '\U00002213', + "Mopf;": '\U0001D544', + "Mscr;": '\U00002133', + "Mu;": '\U0000039C', + "NJcy;": '\U0000040A', + "Nacute;": '\U00000143', + "Ncaron;": '\U00000147', + "Ncedil;": '\U00000145', + "Ncy;": '\U0000041D', + "NegativeMediumSpace;": '\U0000200B', + "NegativeThickSpace;": '\U0000200B', + "NegativeThinSpace;": '\U0000200B', + "NegativeVeryThinSpace;": '\U0000200B', + "NestedGreaterGreater;": '\U0000226B', + "NestedLessLess;": '\U0000226A', + "NewLine;": '\U0000000A', + "Nfr;": '\U0001D511', + "NoBreak;": '\U00002060', + "NonBreakingSpace;": '\U000000A0', + "Nopf;": '\U00002115', + "Not;": '\U00002AEC', + "NotCongruent;": '\U00002262', + "NotCupCap;": '\U0000226D', + "NotDoubleVerticalBar;": '\U00002226', + "NotElement;": '\U00002209', + "NotEqual;": '\U00002260', + "NotExists;": '\U00002204', + "NotGreater;": '\U0000226F', + "NotGreaterEqual;": '\U00002271', + "NotGreaterLess;": '\U00002279', + "NotGreaterTilde;": '\U00002275', + "NotLeftTriangle;": '\U000022EA', + "NotLeftTriangleEqual;": '\U000022EC', + "NotLess;": '\U0000226E', + "NotLessEqual;": '\U00002270', + "NotLessGreater;": '\U00002278', + "NotLessTilde;": '\U00002274', + "NotPrecedes;": '\U00002280', + "NotPrecedesSlantEqual;": '\U000022E0', + "NotReverseElement;": '\U0000220C', + "NotRightTriangle;": '\U000022EB', + "NotRightTriangleEqual;": '\U000022ED', + "NotSquareSubsetEqual;": '\U000022E2', + "NotSquareSupersetEqual;": '\U000022E3', + "NotSubsetEqual;": '\U00002288', + "NotSucceeds;": '\U00002281', + "NotSucceedsSlantEqual;": '\U000022E1', + "NotSupersetEqual;": '\U00002289', + "NotTilde;": '\U00002241', + "NotTildeEqual;": '\U00002244', + "NotTildeFullEqual;": '\U00002247', + "NotTildeTilde;": '\U00002249', + "NotVerticalBar;": '\U00002224', + "Nscr;": '\U0001D4A9', + "Ntilde;": '\U000000D1', + "Nu;": '\U0000039D', + "OElig;": '\U00000152', + "Oacute;": '\U000000D3', + "Ocirc;": '\U000000D4', + "Ocy;": '\U0000041E', + "Odblac;": '\U00000150', + "Ofr;": '\U0001D512', + "Ograve;": '\U000000D2', + "Omacr;": '\U0000014C', + "Omega;": '\U000003A9', + "Omicron;": '\U0000039F', + "Oopf;": '\U0001D546', + "OpenCurlyDoubleQuote;": '\U0000201C', + "OpenCurlyQuote;": '\U00002018', + "Or;": '\U00002A54', + "Oscr;": '\U0001D4AA', + "Oslash;": '\U000000D8', + "Otilde;": '\U000000D5', + "Otimes;": '\U00002A37', + "Ouml;": '\U000000D6', + "OverBar;": '\U0000203E', + "OverBrace;": '\U000023DE', + "OverBracket;": '\U000023B4', + "OverParenthesis;": '\U000023DC', + "PartialD;": '\U00002202', + "Pcy;": '\U0000041F', + "Pfr;": '\U0001D513', + "Phi;": '\U000003A6', + "Pi;": '\U000003A0', + "PlusMinus;": '\U000000B1', + "Poincareplane;": '\U0000210C', + "Popf;": '\U00002119', + "Pr;": '\U00002ABB', + "Precedes;": '\U0000227A', + "PrecedesEqual;": '\U00002AAF', + "PrecedesSlantEqual;": '\U0000227C', + "PrecedesTilde;": '\U0000227E', + "Prime;": '\U00002033', + "Product;": '\U0000220F', + "Proportion;": '\U00002237', + "Proportional;": '\U0000221D', + "Pscr;": '\U0001D4AB', + "Psi;": '\U000003A8', + "QUOT;": '\U00000022', + "Qfr;": '\U0001D514', + "Qopf;": '\U0000211A', + "Qscr;": '\U0001D4AC', + "RBarr;": '\U00002910', + "REG;": '\U000000AE', + "Racute;": '\U00000154', + "Rang;": '\U000027EB', + "Rarr;": '\U000021A0', + "Rarrtl;": '\U00002916', + "Rcaron;": '\U00000158', + "Rcedil;": '\U00000156', + "Rcy;": '\U00000420', + "Re;": '\U0000211C', + "ReverseElement;": '\U0000220B', + "ReverseEquilibrium;": '\U000021CB', + "ReverseUpEquilibrium;": '\U0000296F', + "Rfr;": '\U0000211C', + "Rho;": '\U000003A1', + "RightAngleBracket;": '\U000027E9', + "RightArrow;": '\U00002192', + "RightArrowBar;": '\U000021E5', + "RightArrowLeftArrow;": '\U000021C4', + "RightCeiling;": '\U00002309', + "RightDoubleBracket;": '\U000027E7', + "RightDownTeeVector;": '\U0000295D', + "RightDownVector;": '\U000021C2', + "RightDownVectorBar;": '\U00002955', + "RightFloor;": '\U0000230B', + "RightTee;": '\U000022A2', + "RightTeeArrow;": '\U000021A6', + "RightTeeVector;": '\U0000295B', + "RightTriangle;": '\U000022B3', + "RightTriangleBar;": '\U000029D0', + "RightTriangleEqual;": '\U000022B5', + "RightUpDownVector;": '\U0000294F', + "RightUpTeeVector;": '\U0000295C', + "RightUpVector;": '\U000021BE', + "RightUpVectorBar;": '\U00002954', + "RightVector;": '\U000021C0', + "RightVectorBar;": '\U00002953', + "Rightarrow;": '\U000021D2', + "Ropf;": '\U0000211D', + "RoundImplies;": '\U00002970', + "Rrightarrow;": '\U000021DB', + "Rscr;": '\U0000211B', + "Rsh;": '\U000021B1', + "RuleDelayed;": '\U000029F4', + "SHCHcy;": '\U00000429', + "SHcy;": '\U00000428', + "SOFTcy;": '\U0000042C', + "Sacute;": '\U0000015A', + "Sc;": '\U00002ABC', + "Scaron;": '\U00000160', + "Scedil;": '\U0000015E', + "Scirc;": '\U0000015C', + "Scy;": '\U00000421', + "Sfr;": '\U0001D516', + "ShortDownArrow;": '\U00002193', + "ShortLeftArrow;": '\U00002190', + "ShortRightArrow;": '\U00002192', + "ShortUpArrow;": '\U00002191', + "Sigma;": '\U000003A3', + "SmallCircle;": '\U00002218', + "Sopf;": '\U0001D54A', + "Sqrt;": '\U0000221A', + "Square;": '\U000025A1', + "SquareIntersection;": '\U00002293', + "SquareSubset;": '\U0000228F', + "SquareSubsetEqual;": '\U00002291', + "SquareSuperset;": '\U00002290', + "SquareSupersetEqual;": '\U00002292', + "SquareUnion;": '\U00002294', + "Sscr;": '\U0001D4AE', + "Star;": '\U000022C6', + "Sub;": '\U000022D0', + "Subset;": '\U000022D0', + "SubsetEqual;": '\U00002286', + "Succeeds;": '\U0000227B', + "SucceedsEqual;": '\U00002AB0', + "SucceedsSlantEqual;": '\U0000227D', + "SucceedsTilde;": '\U0000227F', + "SuchThat;": '\U0000220B', + "Sum;": '\U00002211', + "Sup;": '\U000022D1', + "Superset;": '\U00002283', + "SupersetEqual;": '\U00002287', + "Supset;": '\U000022D1', + "THORN;": '\U000000DE', + "TRADE;": '\U00002122', + "TSHcy;": '\U0000040B', + "TScy;": '\U00000426', + "Tab;": '\U00000009', + "Tau;": '\U000003A4', + "Tcaron;": '\U00000164', + "Tcedil;": '\U00000162', + "Tcy;": '\U00000422', + "Tfr;": '\U0001D517', + "Therefore;": '\U00002234', + "Theta;": '\U00000398', + "ThinSpace;": '\U00002009', + "Tilde;": '\U0000223C', + "TildeEqual;": '\U00002243', + "TildeFullEqual;": '\U00002245', + "TildeTilde;": '\U00002248', + "Topf;": '\U0001D54B', + "TripleDot;": '\U000020DB', + "Tscr;": '\U0001D4AF', + "Tstrok;": '\U00000166', + "Uacute;": '\U000000DA', + "Uarr;": '\U0000219F', + "Uarrocir;": '\U00002949', + "Ubrcy;": '\U0000040E', + "Ubreve;": '\U0000016C', + "Ucirc;": '\U000000DB', + "Ucy;": '\U00000423', + "Udblac;": '\U00000170', + "Ufr;": '\U0001D518', + "Ugrave;": '\U000000D9', + "Umacr;": '\U0000016A', + "UnderBar;": '\U0000005F', + "UnderBrace;": '\U000023DF', + "UnderBracket;": '\U000023B5', + "UnderParenthesis;": '\U000023DD', + "Union;": '\U000022C3', + "UnionPlus;": '\U0000228E', + "Uogon;": '\U00000172', + "Uopf;": '\U0001D54C', + "UpArrow;": '\U00002191', + "UpArrowBar;": '\U00002912', + "UpArrowDownArrow;": '\U000021C5', + "UpDownArrow;": '\U00002195', + "UpEquilibrium;": '\U0000296E', + "UpTee;": '\U000022A5', + "UpTeeArrow;": '\U000021A5', + "Uparrow;": '\U000021D1', + "Updownarrow;": '\U000021D5', + "UpperLeftArrow;": '\U00002196', + "UpperRightArrow;": '\U00002197', + "Upsi;": '\U000003D2', + "Upsilon;": '\U000003A5', + "Uring;": '\U0000016E', + "Uscr;": '\U0001D4B0', + "Utilde;": '\U00000168', + "Uuml;": '\U000000DC', + "VDash;": '\U000022AB', + "Vbar;": '\U00002AEB', + "Vcy;": '\U00000412', + "Vdash;": '\U000022A9', + "Vdashl;": '\U00002AE6', + "Vee;": '\U000022C1', + "Verbar;": '\U00002016', + "Vert;": '\U00002016', + "VerticalBar;": '\U00002223', + "VerticalLine;": '\U0000007C', + "VerticalSeparator;": '\U00002758', + "VerticalTilde;": '\U00002240', + "VeryThinSpace;": '\U0000200A', + "Vfr;": '\U0001D519', + "Vopf;": '\U0001D54D', + "Vscr;": '\U0001D4B1', + "Vvdash;": '\U000022AA', + "Wcirc;": '\U00000174', + "Wedge;": '\U000022C0', + "Wfr;": '\U0001D51A', + "Wopf;": '\U0001D54E', + "Wscr;": '\U0001D4B2', + "Xfr;": '\U0001D51B', + "Xi;": '\U0000039E', + "Xopf;": '\U0001D54F', + "Xscr;": '\U0001D4B3', + "YAcy;": '\U0000042F', + "YIcy;": '\U00000407', + "YUcy;": '\U0000042E', + "Yacute;": '\U000000DD', + "Ycirc;": '\U00000176', + "Ycy;": '\U0000042B', + "Yfr;": '\U0001D51C', + "Yopf;": '\U0001D550', + "Yscr;": '\U0001D4B4', + "Yuml;": '\U00000178', + "ZHcy;": '\U00000416', + "Zacute;": '\U00000179', + "Zcaron;": '\U0000017D', + "Zcy;": '\U00000417', + "Zdot;": '\U0000017B', + "ZeroWidthSpace;": '\U0000200B', + "Zeta;": '\U00000396', + "Zfr;": '\U00002128', + "Zopf;": '\U00002124', + "Zscr;": '\U0001D4B5', + "aacute;": '\U000000E1', + "abreve;": '\U00000103', + "ac;": '\U0000223E', + "acd;": '\U0000223F', + "acirc;": '\U000000E2', + "acute;": '\U000000B4', + "acy;": '\U00000430', + "aelig;": '\U000000E6', + "af;": '\U00002061', + "afr;": '\U0001D51E', + "agrave;": '\U000000E0', + "alefsym;": '\U00002135', + "aleph;": '\U00002135', + "alpha;": '\U000003B1', + "amacr;": '\U00000101', + "amalg;": '\U00002A3F', + "amp;": '\U00000026', + "and;": '\U00002227', + "andand;": '\U00002A55', + "andd;": '\U00002A5C', + "andslope;": '\U00002A58', + "andv;": '\U00002A5A', + "ang;": '\U00002220', + "ange;": '\U000029A4', + "angle;": '\U00002220', + "angmsd;": '\U00002221', + "angmsdaa;": '\U000029A8', + "angmsdab;": '\U000029A9', + "angmsdac;": '\U000029AA', + "angmsdad;": '\U000029AB', + "angmsdae;": '\U000029AC', + "angmsdaf;": '\U000029AD', + "angmsdag;": '\U000029AE', + "angmsdah;": '\U000029AF', + "angrt;": '\U0000221F', + "angrtvb;": '\U000022BE', + "angrtvbd;": '\U0000299D', + "angsph;": '\U00002222', + "angst;": '\U000000C5', + "angzarr;": '\U0000237C', + "aogon;": '\U00000105', + "aopf;": '\U0001D552', + "ap;": '\U00002248', + "apE;": '\U00002A70', + "apacir;": '\U00002A6F', + "ape;": '\U0000224A', + "apid;": '\U0000224B', + "apos;": '\U00000027', + "approx;": '\U00002248', + "approxeq;": '\U0000224A', + "aring;": '\U000000E5', + "ascr;": '\U0001D4B6', + "ast;": '\U0000002A', + "asymp;": '\U00002248', + "asympeq;": '\U0000224D', + "atilde;": '\U000000E3', + "auml;": '\U000000E4', + "awconint;": '\U00002233', + "awint;": '\U00002A11', + "bNot;": '\U00002AED', + "backcong;": '\U0000224C', + "backepsilon;": '\U000003F6', + "backprime;": '\U00002035', + "backsim;": '\U0000223D', + "backsimeq;": '\U000022CD', + "barvee;": '\U000022BD', + "barwed;": '\U00002305', + "barwedge;": '\U00002305', + "bbrk;": '\U000023B5', + "bbrktbrk;": '\U000023B6', + "bcong;": '\U0000224C', + "bcy;": '\U00000431', + "bdquo;": '\U0000201E', + "becaus;": '\U00002235', + "because;": '\U00002235', + "bemptyv;": '\U000029B0', + "bepsi;": '\U000003F6', + "bernou;": '\U0000212C', + "beta;": '\U000003B2', + "beth;": '\U00002136', + "between;": '\U0000226C', + "bfr;": '\U0001D51F', + "bigcap;": '\U000022C2', + "bigcirc;": '\U000025EF', + "bigcup;": '\U000022C3', + "bigodot;": '\U00002A00', + "bigoplus;": '\U00002A01', + "bigotimes;": '\U00002A02', + "bigsqcup;": '\U00002A06', + "bigstar;": '\U00002605', + "bigtriangledown;": '\U000025BD', + "bigtriangleup;": '\U000025B3', + "biguplus;": '\U00002A04', + "bigvee;": '\U000022C1', + "bigwedge;": '\U000022C0', + "bkarow;": '\U0000290D', + "blacklozenge;": '\U000029EB', + "blacksquare;": '\U000025AA', + "blacktriangle;": '\U000025B4', + "blacktriangledown;": '\U000025BE', + "blacktriangleleft;": '\U000025C2', + "blacktriangleright;": '\U000025B8', + "blank;": '\U00002423', + "blk12;": '\U00002592', + "blk14;": '\U00002591', + "blk34;": '\U00002593', + "block;": '\U00002588', + "bnot;": '\U00002310', + "bopf;": '\U0001D553', + "bot;": '\U000022A5', + "bottom;": '\U000022A5', + "bowtie;": '\U000022C8', + "boxDL;": '\U00002557', + "boxDR;": '\U00002554', + "boxDl;": '\U00002556', + "boxDr;": '\U00002553', + "boxH;": '\U00002550', + "boxHD;": '\U00002566', + "boxHU;": '\U00002569', + "boxHd;": '\U00002564', + "boxHu;": '\U00002567', + "boxUL;": '\U0000255D', + "boxUR;": '\U0000255A', + "boxUl;": '\U0000255C', + "boxUr;": '\U00002559', + "boxV;": '\U00002551', + "boxVH;": '\U0000256C', + "boxVL;": '\U00002563', + "boxVR;": '\U00002560', + "boxVh;": '\U0000256B', + "boxVl;": '\U00002562', + "boxVr;": '\U0000255F', + "boxbox;": '\U000029C9', + "boxdL;": '\U00002555', + "boxdR;": '\U00002552', + "boxdl;": '\U00002510', + "boxdr;": '\U0000250C', + "boxh;": '\U00002500', + "boxhD;": '\U00002565', + "boxhU;": '\U00002568', + "boxhd;": '\U0000252C', + "boxhu;": '\U00002534', + "boxminus;": '\U0000229F', + "boxplus;": '\U0000229E', + "boxtimes;": '\U000022A0', + "boxuL;": '\U0000255B', + "boxuR;": '\U00002558', + "boxul;": '\U00002518', + "boxur;": '\U00002514', + "boxv;": '\U00002502', + "boxvH;": '\U0000256A', + "boxvL;": '\U00002561', + "boxvR;": '\U0000255E', + "boxvh;": '\U0000253C', + "boxvl;": '\U00002524', + "boxvr;": '\U0000251C', + "bprime;": '\U00002035', + "breve;": '\U000002D8', + "brvbar;": '\U000000A6', + "bscr;": '\U0001D4B7', + "bsemi;": '\U0000204F', + "bsim;": '\U0000223D', + "bsime;": '\U000022CD', + "bsol;": '\U0000005C', + "bsolb;": '\U000029C5', + "bsolhsub;": '\U000027C8', + "bull;": '\U00002022', + "bullet;": '\U00002022', + "bump;": '\U0000224E', + "bumpE;": '\U00002AAE', + "bumpe;": '\U0000224F', + "bumpeq;": '\U0000224F', + "cacute;": '\U00000107', + "cap;": '\U00002229', + "capand;": '\U00002A44', + "capbrcup;": '\U00002A49', + "capcap;": '\U00002A4B', + "capcup;": '\U00002A47', + "capdot;": '\U00002A40', + "caret;": '\U00002041', + "caron;": '\U000002C7', + "ccaps;": '\U00002A4D', + "ccaron;": '\U0000010D', + "ccedil;": '\U000000E7', + "ccirc;": '\U00000109', + "ccups;": '\U00002A4C', + "ccupssm;": '\U00002A50', + "cdot;": '\U0000010B', + "cedil;": '\U000000B8', + "cemptyv;": '\U000029B2', + "cent;": '\U000000A2', + "centerdot;": '\U000000B7', + "cfr;": '\U0001D520', + "chcy;": '\U00000447', + "check;": '\U00002713', + "checkmark;": '\U00002713', + "chi;": '\U000003C7', + "cir;": '\U000025CB', + "cirE;": '\U000029C3', + "circ;": '\U000002C6', + "circeq;": '\U00002257', + "circlearrowleft;": '\U000021BA', + "circlearrowright;": '\U000021BB', + "circledR;": '\U000000AE', + "circledS;": '\U000024C8', + "circledast;": '\U0000229B', + "circledcirc;": '\U0000229A', + "circleddash;": '\U0000229D', + "cire;": '\U00002257', + "cirfnint;": '\U00002A10', + "cirmid;": '\U00002AEF', + "cirscir;": '\U000029C2', + "clubs;": '\U00002663', + "clubsuit;": '\U00002663', + "colon;": '\U0000003A', + "colone;": '\U00002254', + "coloneq;": '\U00002254', + "comma;": '\U0000002C', + "commat;": '\U00000040', + "comp;": '\U00002201', + "compfn;": '\U00002218', + "complement;": '\U00002201', + "complexes;": '\U00002102', + "cong;": '\U00002245', + "congdot;": '\U00002A6D', + "conint;": '\U0000222E', + "copf;": '\U0001D554', + "coprod;": '\U00002210', + "copy;": '\U000000A9', + "copysr;": '\U00002117', + "crarr;": '\U000021B5', + "cross;": '\U00002717', + "cscr;": '\U0001D4B8', + "csub;": '\U00002ACF', + "csube;": '\U00002AD1', + "csup;": '\U00002AD0', + "csupe;": '\U00002AD2', + "ctdot;": '\U000022EF', + "cudarrl;": '\U00002938', + "cudarrr;": '\U00002935', + "cuepr;": '\U000022DE', + "cuesc;": '\U000022DF', + "cularr;": '\U000021B6', + "cularrp;": '\U0000293D', + "cup;": '\U0000222A', + "cupbrcap;": '\U00002A48', + "cupcap;": '\U00002A46', + "cupcup;": '\U00002A4A', + "cupdot;": '\U0000228D', + "cupor;": '\U00002A45', + "curarr;": '\U000021B7', + "curarrm;": '\U0000293C', + "curlyeqprec;": '\U000022DE', + "curlyeqsucc;": '\U000022DF', + "curlyvee;": '\U000022CE', + "curlywedge;": '\U000022CF', + "curren;": '\U000000A4', + "curvearrowleft;": '\U000021B6', + "curvearrowright;": '\U000021B7', + "cuvee;": '\U000022CE', + "cuwed;": '\U000022CF', + "cwconint;": '\U00002232', + "cwint;": '\U00002231', + "cylcty;": '\U0000232D', + "dArr;": '\U000021D3', + "dHar;": '\U00002965', + "dagger;": '\U00002020', + "daleth;": '\U00002138', + "darr;": '\U00002193', + "dash;": '\U00002010', + "dashv;": '\U000022A3', + "dbkarow;": '\U0000290F', + "dblac;": '\U000002DD', + "dcaron;": '\U0000010F', + "dcy;": '\U00000434', + "dd;": '\U00002146', + "ddagger;": '\U00002021', + "ddarr;": '\U000021CA', + "ddotseq;": '\U00002A77', + "deg;": '\U000000B0', + "delta;": '\U000003B4', + "demptyv;": '\U000029B1', + "dfisht;": '\U0000297F', + "dfr;": '\U0001D521', + "dharl;": '\U000021C3', + "dharr;": '\U000021C2', + "diam;": '\U000022C4', + "diamond;": '\U000022C4', + "diamondsuit;": '\U00002666', + "diams;": '\U00002666', + "die;": '\U000000A8', + "digamma;": '\U000003DD', + "disin;": '\U000022F2', + "div;": '\U000000F7', + "divide;": '\U000000F7', + "divideontimes;": '\U000022C7', + "divonx;": '\U000022C7', + "djcy;": '\U00000452', + "dlcorn;": '\U0000231E', + "dlcrop;": '\U0000230D', + "dollar;": '\U00000024', + "dopf;": '\U0001D555', + "dot;": '\U000002D9', + "doteq;": '\U00002250', + "doteqdot;": '\U00002251', + "dotminus;": '\U00002238', + "dotplus;": '\U00002214', + "dotsquare;": '\U000022A1', + "doublebarwedge;": '\U00002306', + "downarrow;": '\U00002193', + "downdownarrows;": '\U000021CA', + "downharpoonleft;": '\U000021C3', + "downharpoonright;": '\U000021C2', + "drbkarow;": '\U00002910', + "drcorn;": '\U0000231F', + "drcrop;": '\U0000230C', + "dscr;": '\U0001D4B9', + "dscy;": '\U00000455', + "dsol;": '\U000029F6', + "dstrok;": '\U00000111', + "dtdot;": '\U000022F1', + "dtri;": '\U000025BF', + "dtrif;": '\U000025BE', + "duarr;": '\U000021F5', + "duhar;": '\U0000296F', + "dwangle;": '\U000029A6', + "dzcy;": '\U0000045F', + "dzigrarr;": '\U000027FF', + "eDDot;": '\U00002A77', + "eDot;": '\U00002251', + "eacute;": '\U000000E9', + "easter;": '\U00002A6E', + "ecaron;": '\U0000011B', + "ecir;": '\U00002256', + "ecirc;": '\U000000EA', + "ecolon;": '\U00002255', + "ecy;": '\U0000044D', + "edot;": '\U00000117', + "ee;": '\U00002147', + "efDot;": '\U00002252', + "efr;": '\U0001D522', + "eg;": '\U00002A9A', + "egrave;": '\U000000E8', + "egs;": '\U00002A96', + "egsdot;": '\U00002A98', + "el;": '\U00002A99', + "elinters;": '\U000023E7', + "ell;": '\U00002113', + "els;": '\U00002A95', + "elsdot;": '\U00002A97', + "emacr;": '\U00000113', + "empty;": '\U00002205', + "emptyset;": '\U00002205', + "emptyv;": '\U00002205', + "emsp;": '\U00002003', + "emsp13;": '\U00002004', + "emsp14;": '\U00002005', + "eng;": '\U0000014B', + "ensp;": '\U00002002', + "eogon;": '\U00000119', + "eopf;": '\U0001D556', + "epar;": '\U000022D5', + "eparsl;": '\U000029E3', + "eplus;": '\U00002A71', + "epsi;": '\U000003B5', + "epsilon;": '\U000003B5', + "epsiv;": '\U000003F5', + "eqcirc;": '\U00002256', + "eqcolon;": '\U00002255', + "eqsim;": '\U00002242', + "eqslantgtr;": '\U00002A96', + "eqslantless;": '\U00002A95', + "equals;": '\U0000003D', + "equest;": '\U0000225F', + "equiv;": '\U00002261', + "equivDD;": '\U00002A78', + "eqvparsl;": '\U000029E5', + "erDot;": '\U00002253', + "erarr;": '\U00002971', + "escr;": '\U0000212F', + "esdot;": '\U00002250', + "esim;": '\U00002242', + "eta;": '\U000003B7', + "eth;": '\U000000F0', + "euml;": '\U000000EB', + "euro;": '\U000020AC', + "excl;": '\U00000021', + "exist;": '\U00002203', + "expectation;": '\U00002130', + "exponentiale;": '\U00002147', + "fallingdotseq;": '\U00002252', + "fcy;": '\U00000444', + "female;": '\U00002640', + "ffilig;": '\U0000FB03', + "fflig;": '\U0000FB00', + "ffllig;": '\U0000FB04', + "ffr;": '\U0001D523', + "filig;": '\U0000FB01', + "flat;": '\U0000266D', + "fllig;": '\U0000FB02', + "fltns;": '\U000025B1', + "fnof;": '\U00000192', + "fopf;": '\U0001D557', + "forall;": '\U00002200', + "fork;": '\U000022D4', + "forkv;": '\U00002AD9', + "fpartint;": '\U00002A0D', + "frac12;": '\U000000BD', + "frac13;": '\U00002153', + "frac14;": '\U000000BC', + "frac15;": '\U00002155', + "frac16;": '\U00002159', + "frac18;": '\U0000215B', + "frac23;": '\U00002154', + "frac25;": '\U00002156', + "frac34;": '\U000000BE', + "frac35;": '\U00002157', + "frac38;": '\U0000215C', + "frac45;": '\U00002158', + "frac56;": '\U0000215A', + "frac58;": '\U0000215D', + "frac78;": '\U0000215E', + "frasl;": '\U00002044', + "frown;": '\U00002322', + "fscr;": '\U0001D4BB', + "gE;": '\U00002267', + "gEl;": '\U00002A8C', + "gacute;": '\U000001F5', + "gamma;": '\U000003B3', + "gammad;": '\U000003DD', + "gap;": '\U00002A86', + "gbreve;": '\U0000011F', + "gcirc;": '\U0000011D', + "gcy;": '\U00000433', + "gdot;": '\U00000121', + "ge;": '\U00002265', + "gel;": '\U000022DB', + "geq;": '\U00002265', + "geqq;": '\U00002267', + "geqslant;": '\U00002A7E', + "ges;": '\U00002A7E', + "gescc;": '\U00002AA9', + "gesdot;": '\U00002A80', + "gesdoto;": '\U00002A82', + "gesdotol;": '\U00002A84', + "gesles;": '\U00002A94', + "gfr;": '\U0001D524', + "gg;": '\U0000226B', + "ggg;": '\U000022D9', + "gimel;": '\U00002137', + "gjcy;": '\U00000453', + "gl;": '\U00002277', + "glE;": '\U00002A92', + "gla;": '\U00002AA5', + "glj;": '\U00002AA4', + "gnE;": '\U00002269', + "gnap;": '\U00002A8A', + "gnapprox;": '\U00002A8A', + "gne;": '\U00002A88', + "gneq;": '\U00002A88', + "gneqq;": '\U00002269', + "gnsim;": '\U000022E7', + "gopf;": '\U0001D558', + "grave;": '\U00000060', + "gscr;": '\U0000210A', + "gsim;": '\U00002273', + "gsime;": '\U00002A8E', + "gsiml;": '\U00002A90', + "gt;": '\U0000003E', + "gtcc;": '\U00002AA7', + "gtcir;": '\U00002A7A', + "gtdot;": '\U000022D7', + "gtlPar;": '\U00002995', + "gtquest;": '\U00002A7C', + "gtrapprox;": '\U00002A86', + "gtrarr;": '\U00002978', + "gtrdot;": '\U000022D7', + "gtreqless;": '\U000022DB', + "gtreqqless;": '\U00002A8C', + "gtrless;": '\U00002277', + "gtrsim;": '\U00002273', + "hArr;": '\U000021D4', + "hairsp;": '\U0000200A', + "half;": '\U000000BD', + "hamilt;": '\U0000210B', + "hardcy;": '\U0000044A', + "harr;": '\U00002194', + "harrcir;": '\U00002948', + "harrw;": '\U000021AD', + "hbar;": '\U0000210F', + "hcirc;": '\U00000125', + "hearts;": '\U00002665', + "heartsuit;": '\U00002665', + "hellip;": '\U00002026', + "hercon;": '\U000022B9', + "hfr;": '\U0001D525', + "hksearow;": '\U00002925', + "hkswarow;": '\U00002926', + "hoarr;": '\U000021FF', + "homtht;": '\U0000223B', + "hookleftarrow;": '\U000021A9', + "hookrightarrow;": '\U000021AA', + "hopf;": '\U0001D559', + "horbar;": '\U00002015', + "hscr;": '\U0001D4BD', + "hslash;": '\U0000210F', + "hstrok;": '\U00000127', + "hybull;": '\U00002043', + "hyphen;": '\U00002010', + "iacute;": '\U000000ED', + "ic;": '\U00002063', + "icirc;": '\U000000EE', + "icy;": '\U00000438', + "iecy;": '\U00000435', + "iexcl;": '\U000000A1', + "iff;": '\U000021D4', + "ifr;": '\U0001D526', + "igrave;": '\U000000EC', + "ii;": '\U00002148', + "iiiint;": '\U00002A0C', + "iiint;": '\U0000222D', + "iinfin;": '\U000029DC', + "iiota;": '\U00002129', + "ijlig;": '\U00000133', + "imacr;": '\U0000012B', + "image;": '\U00002111', + "imagline;": '\U00002110', + "imagpart;": '\U00002111', + "imath;": '\U00000131', + "imof;": '\U000022B7', + "imped;": '\U000001B5', + "in;": '\U00002208', + "incare;": '\U00002105', + "infin;": '\U0000221E', + "infintie;": '\U000029DD', + "inodot;": '\U00000131', + "int;": '\U0000222B', + "intcal;": '\U000022BA', + "integers;": '\U00002124', + "intercal;": '\U000022BA', + "intlarhk;": '\U00002A17', + "intprod;": '\U00002A3C', + "iocy;": '\U00000451', + "iogon;": '\U0000012F', + "iopf;": '\U0001D55A', + "iota;": '\U000003B9', + "iprod;": '\U00002A3C', + "iquest;": '\U000000BF', + "iscr;": '\U0001D4BE', + "isin;": '\U00002208', + "isinE;": '\U000022F9', + "isindot;": '\U000022F5', + "isins;": '\U000022F4', + "isinsv;": '\U000022F3', + "isinv;": '\U00002208', + "it;": '\U00002062', + "itilde;": '\U00000129', + "iukcy;": '\U00000456', + "iuml;": '\U000000EF', + "jcirc;": '\U00000135', + "jcy;": '\U00000439', + "jfr;": '\U0001D527', + "jmath;": '\U00000237', + "jopf;": '\U0001D55B', + "jscr;": '\U0001D4BF', + "jsercy;": '\U00000458', + "jukcy;": '\U00000454', + "kappa;": '\U000003BA', + "kappav;": '\U000003F0', + "kcedil;": '\U00000137', + "kcy;": '\U0000043A', + "kfr;": '\U0001D528', + "kgreen;": '\U00000138', + "khcy;": '\U00000445', + "kjcy;": '\U0000045C', + "kopf;": '\U0001D55C', + "kscr;": '\U0001D4C0', + "lAarr;": '\U000021DA', + "lArr;": '\U000021D0', + "lAtail;": '\U0000291B', + "lBarr;": '\U0000290E', + "lE;": '\U00002266', + "lEg;": '\U00002A8B', + "lHar;": '\U00002962', + "lacute;": '\U0000013A', + "laemptyv;": '\U000029B4', + "lagran;": '\U00002112', + "lambda;": '\U000003BB', + "lang;": '\U000027E8', + "langd;": '\U00002991', + "langle;": '\U000027E8', + "lap;": '\U00002A85', + "laquo;": '\U000000AB', + "larr;": '\U00002190', + "larrb;": '\U000021E4', + "larrbfs;": '\U0000291F', + "larrfs;": '\U0000291D', + "larrhk;": '\U000021A9', + "larrlp;": '\U000021AB', + "larrpl;": '\U00002939', + "larrsim;": '\U00002973', + "larrtl;": '\U000021A2', + "lat;": '\U00002AAB', + "latail;": '\U00002919', + "late;": '\U00002AAD', + "lbarr;": '\U0000290C', + "lbbrk;": '\U00002772', + "lbrace;": '\U0000007B', + "lbrack;": '\U0000005B', + "lbrke;": '\U0000298B', + "lbrksld;": '\U0000298F', + "lbrkslu;": '\U0000298D', + "lcaron;": '\U0000013E', + "lcedil;": '\U0000013C', + "lceil;": '\U00002308', + "lcub;": '\U0000007B', + "lcy;": '\U0000043B', + "ldca;": '\U00002936', + "ldquo;": '\U0000201C', + "ldquor;": '\U0000201E', + "ldrdhar;": '\U00002967', + "ldrushar;": '\U0000294B', + "ldsh;": '\U000021B2', + "le;": '\U00002264', + "leftarrow;": '\U00002190', + "leftarrowtail;": '\U000021A2', + "leftharpoondown;": '\U000021BD', + "leftharpoonup;": '\U000021BC', + "leftleftarrows;": '\U000021C7', + "leftrightarrow;": '\U00002194', + "leftrightarrows;": '\U000021C6', + "leftrightharpoons;": '\U000021CB', + "leftrightsquigarrow;": '\U000021AD', + "leftthreetimes;": '\U000022CB', + "leg;": '\U000022DA', + "leq;": '\U00002264', + "leqq;": '\U00002266', + "leqslant;": '\U00002A7D', + "les;": '\U00002A7D', + "lescc;": '\U00002AA8', + "lesdot;": '\U00002A7F', + "lesdoto;": '\U00002A81', + "lesdotor;": '\U00002A83', + "lesges;": '\U00002A93', + "lessapprox;": '\U00002A85', + "lessdot;": '\U000022D6', + "lesseqgtr;": '\U000022DA', + "lesseqqgtr;": '\U00002A8B', + "lessgtr;": '\U00002276', + "lesssim;": '\U00002272', + "lfisht;": '\U0000297C', + "lfloor;": '\U0000230A', + "lfr;": '\U0001D529', + "lg;": '\U00002276', + "lgE;": '\U00002A91', + "lhard;": '\U000021BD', + "lharu;": '\U000021BC', + "lharul;": '\U0000296A', + "lhblk;": '\U00002584', + "ljcy;": '\U00000459', + "ll;": '\U0000226A', + "llarr;": '\U000021C7', + "llcorner;": '\U0000231E', + "llhard;": '\U0000296B', + "lltri;": '\U000025FA', + "lmidot;": '\U00000140', + "lmoust;": '\U000023B0', + "lmoustache;": '\U000023B0', + "lnE;": '\U00002268', + "lnap;": '\U00002A89', + "lnapprox;": '\U00002A89', + "lne;": '\U00002A87', + "lneq;": '\U00002A87', + "lneqq;": '\U00002268', + "lnsim;": '\U000022E6', + "loang;": '\U000027EC', + "loarr;": '\U000021FD', + "lobrk;": '\U000027E6', + "longleftarrow;": '\U000027F5', + "longleftrightarrow;": '\U000027F7', + "longmapsto;": '\U000027FC', + "longrightarrow;": '\U000027F6', + "looparrowleft;": '\U000021AB', + "looparrowright;": '\U000021AC', + "lopar;": '\U00002985', + "lopf;": '\U0001D55D', + "loplus;": '\U00002A2D', + "lotimes;": '\U00002A34', + "lowast;": '\U00002217', + "lowbar;": '\U0000005F', + "loz;": '\U000025CA', + "lozenge;": '\U000025CA', + "lozf;": '\U000029EB', + "lpar;": '\U00000028', + "lparlt;": '\U00002993', + "lrarr;": '\U000021C6', + "lrcorner;": '\U0000231F', + "lrhar;": '\U000021CB', + "lrhard;": '\U0000296D', + "lrm;": '\U0000200E', + "lrtri;": '\U000022BF', + "lsaquo;": '\U00002039', + "lscr;": '\U0001D4C1', + "lsh;": '\U000021B0', + "lsim;": '\U00002272', + "lsime;": '\U00002A8D', + "lsimg;": '\U00002A8F', + "lsqb;": '\U0000005B', + "lsquo;": '\U00002018', + "lsquor;": '\U0000201A', + "lstrok;": '\U00000142', + "lt;": '\U0000003C', + "ltcc;": '\U00002AA6', + "ltcir;": '\U00002A79', + "ltdot;": '\U000022D6', + "lthree;": '\U000022CB', + "ltimes;": '\U000022C9', + "ltlarr;": '\U00002976', + "ltquest;": '\U00002A7B', + "ltrPar;": '\U00002996', + "ltri;": '\U000025C3', + "ltrie;": '\U000022B4', + "ltrif;": '\U000025C2', + "lurdshar;": '\U0000294A', + "luruhar;": '\U00002966', + "mDDot;": '\U0000223A', + "macr;": '\U000000AF', + "male;": '\U00002642', + "malt;": '\U00002720', + "maltese;": '\U00002720', + "map;": '\U000021A6', + "mapsto;": '\U000021A6', + "mapstodown;": '\U000021A7', + "mapstoleft;": '\U000021A4', + "mapstoup;": '\U000021A5', + "marker;": '\U000025AE', + "mcomma;": '\U00002A29', + "mcy;": '\U0000043C', + "mdash;": '\U00002014', + "measuredangle;": '\U00002221', + "mfr;": '\U0001D52A', + "mho;": '\U00002127', + "micro;": '\U000000B5', + "mid;": '\U00002223', + "midast;": '\U0000002A', + "midcir;": '\U00002AF0', + "middot;": '\U000000B7', + "minus;": '\U00002212', + "minusb;": '\U0000229F', + "minusd;": '\U00002238', + "minusdu;": '\U00002A2A', + "mlcp;": '\U00002ADB', + "mldr;": '\U00002026', + "mnplus;": '\U00002213', + "models;": '\U000022A7', + "mopf;": '\U0001D55E', + "mp;": '\U00002213', + "mscr;": '\U0001D4C2', + "mstpos;": '\U0000223E', + "mu;": '\U000003BC', + "multimap;": '\U000022B8', + "mumap;": '\U000022B8', + "nLeftarrow;": '\U000021CD', + "nLeftrightarrow;": '\U000021CE', + "nRightarrow;": '\U000021CF', + "nVDash;": '\U000022AF', + "nVdash;": '\U000022AE', + "nabla;": '\U00002207', + "nacute;": '\U00000144', + "nap;": '\U00002249', + "napos;": '\U00000149', + "napprox;": '\U00002249', + "natur;": '\U0000266E', + "natural;": '\U0000266E', + "naturals;": '\U00002115', + "nbsp;": '\U000000A0', + "ncap;": '\U00002A43', + "ncaron;": '\U00000148', + "ncedil;": '\U00000146', + "ncong;": '\U00002247', + "ncup;": '\U00002A42', + "ncy;": '\U0000043D', + "ndash;": '\U00002013', + "ne;": '\U00002260', + "neArr;": '\U000021D7', + "nearhk;": '\U00002924', + "nearr;": '\U00002197', + "nearrow;": '\U00002197', + "nequiv;": '\U00002262', + "nesear;": '\U00002928', + "nexist;": '\U00002204', + "nexists;": '\U00002204', + "nfr;": '\U0001D52B', + "nge;": '\U00002271', + "ngeq;": '\U00002271', + "ngsim;": '\U00002275', + "ngt;": '\U0000226F', + "ngtr;": '\U0000226F', + "nhArr;": '\U000021CE', + "nharr;": '\U000021AE', + "nhpar;": '\U00002AF2', + "ni;": '\U0000220B', + "nis;": '\U000022FC', + "nisd;": '\U000022FA', + "niv;": '\U0000220B', + "njcy;": '\U0000045A', + "nlArr;": '\U000021CD', + "nlarr;": '\U0000219A', + "nldr;": '\U00002025', + "nle;": '\U00002270', + "nleftarrow;": '\U0000219A', + "nleftrightarrow;": '\U000021AE', + "nleq;": '\U00002270', + "nless;": '\U0000226E', + "nlsim;": '\U00002274', + "nlt;": '\U0000226E', + "nltri;": '\U000022EA', + "nltrie;": '\U000022EC', + "nmid;": '\U00002224', + "nopf;": '\U0001D55F', + "not;": '\U000000AC', + "notin;": '\U00002209', + "notinva;": '\U00002209', + "notinvb;": '\U000022F7', + "notinvc;": '\U000022F6', + "notni;": '\U0000220C', + "notniva;": '\U0000220C', + "notnivb;": '\U000022FE', + "notnivc;": '\U000022FD', + "npar;": '\U00002226', + "nparallel;": '\U00002226', + "npolint;": '\U00002A14', + "npr;": '\U00002280', + "nprcue;": '\U000022E0', + "nprec;": '\U00002280', + "nrArr;": '\U000021CF', + "nrarr;": '\U0000219B', + "nrightarrow;": '\U0000219B', + "nrtri;": '\U000022EB', + "nrtrie;": '\U000022ED', + "nsc;": '\U00002281', + "nsccue;": '\U000022E1', + "nscr;": '\U0001D4C3', + "nshortmid;": '\U00002224', + "nshortparallel;": '\U00002226', + "nsim;": '\U00002241', + "nsime;": '\U00002244', + "nsimeq;": '\U00002244', + "nsmid;": '\U00002224', + "nspar;": '\U00002226', + "nsqsube;": '\U000022E2', + "nsqsupe;": '\U000022E3', + "nsub;": '\U00002284', + "nsube;": '\U00002288', + "nsubseteq;": '\U00002288', + "nsucc;": '\U00002281', + "nsup;": '\U00002285', + "nsupe;": '\U00002289', + "nsupseteq;": '\U00002289', + "ntgl;": '\U00002279', + "ntilde;": '\U000000F1', + "ntlg;": '\U00002278', + "ntriangleleft;": '\U000022EA', + "ntrianglelefteq;": '\U000022EC', + "ntriangleright;": '\U000022EB', + "ntrianglerighteq;": '\U000022ED', + "nu;": '\U000003BD', + "num;": '\U00000023', + "numero;": '\U00002116', + "numsp;": '\U00002007', + "nvDash;": '\U000022AD', + "nvHarr;": '\U00002904', + "nvdash;": '\U000022AC', + "nvinfin;": '\U000029DE', + "nvlArr;": '\U00002902', + "nvrArr;": '\U00002903', + "nwArr;": '\U000021D6', + "nwarhk;": '\U00002923', + "nwarr;": '\U00002196', + "nwarrow;": '\U00002196', + "nwnear;": '\U00002927', + "oS;": '\U000024C8', + "oacute;": '\U000000F3', + "oast;": '\U0000229B', + "ocir;": '\U0000229A', + "ocirc;": '\U000000F4', + "ocy;": '\U0000043E', + "odash;": '\U0000229D', + "odblac;": '\U00000151', + "odiv;": '\U00002A38', + "odot;": '\U00002299', + "odsold;": '\U000029BC', + "oelig;": '\U00000153', + "ofcir;": '\U000029BF', + "ofr;": '\U0001D52C', + "ogon;": '\U000002DB', + "ograve;": '\U000000F2', + "ogt;": '\U000029C1', + "ohbar;": '\U000029B5', + "ohm;": '\U000003A9', + "oint;": '\U0000222E', + "olarr;": '\U000021BA', + "olcir;": '\U000029BE', + "olcross;": '\U000029BB', + "oline;": '\U0000203E', + "olt;": '\U000029C0', + "omacr;": '\U0000014D', + "omega;": '\U000003C9', + "omicron;": '\U000003BF', + "omid;": '\U000029B6', + "ominus;": '\U00002296', + "oopf;": '\U0001D560', + "opar;": '\U000029B7', + "operp;": '\U000029B9', + "oplus;": '\U00002295', + "or;": '\U00002228', + "orarr;": '\U000021BB', + "ord;": '\U00002A5D', + "order;": '\U00002134', + "orderof;": '\U00002134', + "ordf;": '\U000000AA', + "ordm;": '\U000000BA', + "origof;": '\U000022B6', + "oror;": '\U00002A56', + "orslope;": '\U00002A57', + "orv;": '\U00002A5B', + "oscr;": '\U00002134', + "oslash;": '\U000000F8', + "osol;": '\U00002298', + "otilde;": '\U000000F5', + "otimes;": '\U00002297', + "otimesas;": '\U00002A36', + "ouml;": '\U000000F6', + "ovbar;": '\U0000233D', + "par;": '\U00002225', + "para;": '\U000000B6', + "parallel;": '\U00002225', + "parsim;": '\U00002AF3', + "parsl;": '\U00002AFD', + "part;": '\U00002202', + "pcy;": '\U0000043F', + "percnt;": '\U00000025', + "period;": '\U0000002E', + "permil;": '\U00002030', + "perp;": '\U000022A5', + "pertenk;": '\U00002031', + "pfr;": '\U0001D52D', + "phi;": '\U000003C6', + "phiv;": '\U000003D5', + "phmmat;": '\U00002133', + "phone;": '\U0000260E', + "pi;": '\U000003C0', + "pitchfork;": '\U000022D4', + "piv;": '\U000003D6', + "planck;": '\U0000210F', + "planckh;": '\U0000210E', + "plankv;": '\U0000210F', + "plus;": '\U0000002B', + "plusacir;": '\U00002A23', + "plusb;": '\U0000229E', + "pluscir;": '\U00002A22', + "plusdo;": '\U00002214', + "plusdu;": '\U00002A25', + "pluse;": '\U00002A72', + "plusmn;": '\U000000B1', + "plussim;": '\U00002A26', + "plustwo;": '\U00002A27', + "pm;": '\U000000B1', + "pointint;": '\U00002A15', + "popf;": '\U0001D561', + "pound;": '\U000000A3', + "pr;": '\U0000227A', + "prE;": '\U00002AB3', + "prap;": '\U00002AB7', + "prcue;": '\U0000227C', + "pre;": '\U00002AAF', + "prec;": '\U0000227A', + "precapprox;": '\U00002AB7', + "preccurlyeq;": '\U0000227C', + "preceq;": '\U00002AAF', + "precnapprox;": '\U00002AB9', + "precneqq;": '\U00002AB5', + "precnsim;": '\U000022E8', + "precsim;": '\U0000227E', + "prime;": '\U00002032', + "primes;": '\U00002119', + "prnE;": '\U00002AB5', + "prnap;": '\U00002AB9', + "prnsim;": '\U000022E8', + "prod;": '\U0000220F', + "profalar;": '\U0000232E', + "profline;": '\U00002312', + "profsurf;": '\U00002313', + "prop;": '\U0000221D', + "propto;": '\U0000221D', + "prsim;": '\U0000227E', + "prurel;": '\U000022B0', + "pscr;": '\U0001D4C5', + "psi;": '\U000003C8', + "puncsp;": '\U00002008', + "qfr;": '\U0001D52E', + "qint;": '\U00002A0C', + "qopf;": '\U0001D562', + "qprime;": '\U00002057', + "qscr;": '\U0001D4C6', + "quaternions;": '\U0000210D', + "quatint;": '\U00002A16', + "quest;": '\U0000003F', + "questeq;": '\U0000225F', + "quot;": '\U00000022', + "rAarr;": '\U000021DB', + "rArr;": '\U000021D2', + "rAtail;": '\U0000291C', + "rBarr;": '\U0000290F', + "rHar;": '\U00002964', + "racute;": '\U00000155', + "radic;": '\U0000221A', + "raemptyv;": '\U000029B3', + "rang;": '\U000027E9', + "rangd;": '\U00002992', + "range;": '\U000029A5', + "rangle;": '\U000027E9', + "raquo;": '\U000000BB', + "rarr;": '\U00002192', + "rarrap;": '\U00002975', + "rarrb;": '\U000021E5', + "rarrbfs;": '\U00002920', + "rarrc;": '\U00002933', + "rarrfs;": '\U0000291E', + "rarrhk;": '\U000021AA', + "rarrlp;": '\U000021AC', + "rarrpl;": '\U00002945', + "rarrsim;": '\U00002974', + "rarrtl;": '\U000021A3', + "rarrw;": '\U0000219D', + "ratail;": '\U0000291A', + "ratio;": '\U00002236', + "rationals;": '\U0000211A', + "rbarr;": '\U0000290D', + "rbbrk;": '\U00002773', + "rbrace;": '\U0000007D', + "rbrack;": '\U0000005D', + "rbrke;": '\U0000298C', + "rbrksld;": '\U0000298E', + "rbrkslu;": '\U00002990', + "rcaron;": '\U00000159', + "rcedil;": '\U00000157', + "rceil;": '\U00002309', + "rcub;": '\U0000007D', + "rcy;": '\U00000440', + "rdca;": '\U00002937', + "rdldhar;": '\U00002969', + "rdquo;": '\U0000201D', + "rdquor;": '\U0000201D', + "rdsh;": '\U000021B3', + "real;": '\U0000211C', + "realine;": '\U0000211B', + "realpart;": '\U0000211C', + "reals;": '\U0000211D', + "rect;": '\U000025AD', + "reg;": '\U000000AE', + "rfisht;": '\U0000297D', + "rfloor;": '\U0000230B', + "rfr;": '\U0001D52F', + "rhard;": '\U000021C1', + "rharu;": '\U000021C0', + "rharul;": '\U0000296C', + "rho;": '\U000003C1', + "rhov;": '\U000003F1', + "rightarrow;": '\U00002192', + "rightarrowtail;": '\U000021A3', + "rightharpoondown;": '\U000021C1', + "rightharpoonup;": '\U000021C0', + "rightleftarrows;": '\U000021C4', + "rightleftharpoons;": '\U000021CC', + "rightrightarrows;": '\U000021C9', + "rightsquigarrow;": '\U0000219D', + "rightthreetimes;": '\U000022CC', + "ring;": '\U000002DA', + "risingdotseq;": '\U00002253', + "rlarr;": '\U000021C4', + "rlhar;": '\U000021CC', + "rlm;": '\U0000200F', + "rmoust;": '\U000023B1', + "rmoustache;": '\U000023B1', + "rnmid;": '\U00002AEE', + "roang;": '\U000027ED', + "roarr;": '\U000021FE', + "robrk;": '\U000027E7', + "ropar;": '\U00002986', + "ropf;": '\U0001D563', + "roplus;": '\U00002A2E', + "rotimes;": '\U00002A35', + "rpar;": '\U00000029', + "rpargt;": '\U00002994', + "rppolint;": '\U00002A12', + "rrarr;": '\U000021C9', + "rsaquo;": '\U0000203A', + "rscr;": '\U0001D4C7', + "rsh;": '\U000021B1', + "rsqb;": '\U0000005D', + "rsquo;": '\U00002019', + "rsquor;": '\U00002019', + "rthree;": '\U000022CC', + "rtimes;": '\U000022CA', + "rtri;": '\U000025B9', + "rtrie;": '\U000022B5', + "rtrif;": '\U000025B8', + "rtriltri;": '\U000029CE', + "ruluhar;": '\U00002968', + "rx;": '\U0000211E', + "sacute;": '\U0000015B', + "sbquo;": '\U0000201A', + "sc;": '\U0000227B', + "scE;": '\U00002AB4', + "scap;": '\U00002AB8', + "scaron;": '\U00000161', + "sccue;": '\U0000227D', + "sce;": '\U00002AB0', + "scedil;": '\U0000015F', + "scirc;": '\U0000015D', + "scnE;": '\U00002AB6', + "scnap;": '\U00002ABA', + "scnsim;": '\U000022E9', + "scpolint;": '\U00002A13', + "scsim;": '\U0000227F', + "scy;": '\U00000441', + "sdot;": '\U000022C5', + "sdotb;": '\U000022A1', + "sdote;": '\U00002A66', + "seArr;": '\U000021D8', + "searhk;": '\U00002925', + "searr;": '\U00002198', + "searrow;": '\U00002198', + "sect;": '\U000000A7', + "semi;": '\U0000003B', + "seswar;": '\U00002929', + "setminus;": '\U00002216', + "setmn;": '\U00002216', + "sext;": '\U00002736', + "sfr;": '\U0001D530', + "sfrown;": '\U00002322', + "sharp;": '\U0000266F', + "shchcy;": '\U00000449', + "shcy;": '\U00000448', + "shortmid;": '\U00002223', + "shortparallel;": '\U00002225', + "shy;": '\U000000AD', + "sigma;": '\U000003C3', + "sigmaf;": '\U000003C2', + "sigmav;": '\U000003C2', + "sim;": '\U0000223C', + "simdot;": '\U00002A6A', + "sime;": '\U00002243', + "simeq;": '\U00002243', + "simg;": '\U00002A9E', + "simgE;": '\U00002AA0', + "siml;": '\U00002A9D', + "simlE;": '\U00002A9F', + "simne;": '\U00002246', + "simplus;": '\U00002A24', + "simrarr;": '\U00002972', + "slarr;": '\U00002190', + "smallsetminus;": '\U00002216', + "smashp;": '\U00002A33', + "smeparsl;": '\U000029E4', + "smid;": '\U00002223', + "smile;": '\U00002323', + "smt;": '\U00002AAA', + "smte;": '\U00002AAC', + "softcy;": '\U0000044C', + "sol;": '\U0000002F', + "solb;": '\U000029C4', + "solbar;": '\U0000233F', + "sopf;": '\U0001D564', + "spades;": '\U00002660', + "spadesuit;": '\U00002660', + "spar;": '\U00002225', + "sqcap;": '\U00002293', + "sqcup;": '\U00002294', + "sqsub;": '\U0000228F', + "sqsube;": '\U00002291', + "sqsubset;": '\U0000228F', + "sqsubseteq;": '\U00002291', + "sqsup;": '\U00002290', + "sqsupe;": '\U00002292', + "sqsupset;": '\U00002290', + "sqsupseteq;": '\U00002292', + "squ;": '\U000025A1', + "square;": '\U000025A1', + "squarf;": '\U000025AA', + "squf;": '\U000025AA', + "srarr;": '\U00002192', + "sscr;": '\U0001D4C8', + "ssetmn;": '\U00002216', + "ssmile;": '\U00002323', + "sstarf;": '\U000022C6', + "star;": '\U00002606', + "starf;": '\U00002605', + "straightepsilon;": '\U000003F5', + "straightphi;": '\U000003D5', + "strns;": '\U000000AF', + "sub;": '\U00002282', + "subE;": '\U00002AC5', + "subdot;": '\U00002ABD', + "sube;": '\U00002286', + "subedot;": '\U00002AC3', + "submult;": '\U00002AC1', + "subnE;": '\U00002ACB', + "subne;": '\U0000228A', + "subplus;": '\U00002ABF', + "subrarr;": '\U00002979', + "subset;": '\U00002282', + "subseteq;": '\U00002286', + "subseteqq;": '\U00002AC5', + "subsetneq;": '\U0000228A', + "subsetneqq;": '\U00002ACB', + "subsim;": '\U00002AC7', + "subsub;": '\U00002AD5', + "subsup;": '\U00002AD3', + "succ;": '\U0000227B', + "succapprox;": '\U00002AB8', + "succcurlyeq;": '\U0000227D', + "succeq;": '\U00002AB0', + "succnapprox;": '\U00002ABA', + "succneqq;": '\U00002AB6', + "succnsim;": '\U000022E9', + "succsim;": '\U0000227F', + "sum;": '\U00002211', + "sung;": '\U0000266A', + "sup;": '\U00002283', + "sup1;": '\U000000B9', + "sup2;": '\U000000B2', + "sup3;": '\U000000B3', + "supE;": '\U00002AC6', + "supdot;": '\U00002ABE', + "supdsub;": '\U00002AD8', + "supe;": '\U00002287', + "supedot;": '\U00002AC4', + "suphsol;": '\U000027C9', + "suphsub;": '\U00002AD7', + "suplarr;": '\U0000297B', + "supmult;": '\U00002AC2', + "supnE;": '\U00002ACC', + "supne;": '\U0000228B', + "supplus;": '\U00002AC0', + "supset;": '\U00002283', + "supseteq;": '\U00002287', + "supseteqq;": '\U00002AC6', + "supsetneq;": '\U0000228B', + "supsetneqq;": '\U00002ACC', + "supsim;": '\U00002AC8', + "supsub;": '\U00002AD4', + "supsup;": '\U00002AD6', + "swArr;": '\U000021D9', + "swarhk;": '\U00002926', + "swarr;": '\U00002199', + "swarrow;": '\U00002199', + "swnwar;": '\U0000292A', + "szlig;": '\U000000DF', + "target;": '\U00002316', + "tau;": '\U000003C4', + "tbrk;": '\U000023B4', + "tcaron;": '\U00000165', + "tcedil;": '\U00000163', + "tcy;": '\U00000442', + "tdot;": '\U000020DB', + "telrec;": '\U00002315', + "tfr;": '\U0001D531', + "there4;": '\U00002234', + "therefore;": '\U00002234', + "theta;": '\U000003B8', + "thetasym;": '\U000003D1', + "thetav;": '\U000003D1', + "thickapprox;": '\U00002248', + "thicksim;": '\U0000223C', + "thinsp;": '\U00002009', + "thkap;": '\U00002248', + "thksim;": '\U0000223C', + "thorn;": '\U000000FE', + "tilde;": '\U000002DC', + "times;": '\U000000D7', + "timesb;": '\U000022A0', + "timesbar;": '\U00002A31', + "timesd;": '\U00002A30', + "tint;": '\U0000222D', + "toea;": '\U00002928', + "top;": '\U000022A4', + "topbot;": '\U00002336', + "topcir;": '\U00002AF1', + "topf;": '\U0001D565', + "topfork;": '\U00002ADA', + "tosa;": '\U00002929', + "tprime;": '\U00002034', + "trade;": '\U00002122', + "triangle;": '\U000025B5', + "triangledown;": '\U000025BF', + "triangleleft;": '\U000025C3', + "trianglelefteq;": '\U000022B4', + "triangleq;": '\U0000225C', + "triangleright;": '\U000025B9', + "trianglerighteq;": '\U000022B5', + "tridot;": '\U000025EC', + "trie;": '\U0000225C', + "triminus;": '\U00002A3A', + "triplus;": '\U00002A39', + "trisb;": '\U000029CD', + "tritime;": '\U00002A3B', + "trpezium;": '\U000023E2', + "tscr;": '\U0001D4C9', + "tscy;": '\U00000446', + "tshcy;": '\U0000045B', + "tstrok;": '\U00000167', + "twixt;": '\U0000226C', + "twoheadleftarrow;": '\U0000219E', + "twoheadrightarrow;": '\U000021A0', + "uArr;": '\U000021D1', + "uHar;": '\U00002963', + "uacute;": '\U000000FA', + "uarr;": '\U00002191', + "ubrcy;": '\U0000045E', + "ubreve;": '\U0000016D', + "ucirc;": '\U000000FB', + "ucy;": '\U00000443', + "udarr;": '\U000021C5', + "udblac;": '\U00000171', + "udhar;": '\U0000296E', + "ufisht;": '\U0000297E', + "ufr;": '\U0001D532', + "ugrave;": '\U000000F9', + "uharl;": '\U000021BF', + "uharr;": '\U000021BE', + "uhblk;": '\U00002580', + "ulcorn;": '\U0000231C', + "ulcorner;": '\U0000231C', + "ulcrop;": '\U0000230F', + "ultri;": '\U000025F8', + "umacr;": '\U0000016B', + "uml;": '\U000000A8', + "uogon;": '\U00000173', + "uopf;": '\U0001D566', + "uparrow;": '\U00002191', + "updownarrow;": '\U00002195', + "upharpoonleft;": '\U000021BF', + "upharpoonright;": '\U000021BE', + "uplus;": '\U0000228E', + "upsi;": '\U000003C5', + "upsih;": '\U000003D2', + "upsilon;": '\U000003C5', + "upuparrows;": '\U000021C8', + "urcorn;": '\U0000231D', + "urcorner;": '\U0000231D', + "urcrop;": '\U0000230E', + "uring;": '\U0000016F', + "urtri;": '\U000025F9', + "uscr;": '\U0001D4CA', + "utdot;": '\U000022F0', + "utilde;": '\U00000169', + "utri;": '\U000025B5', + "utrif;": '\U000025B4', + "uuarr;": '\U000021C8', + "uuml;": '\U000000FC', + "uwangle;": '\U000029A7', + "vArr;": '\U000021D5', + "vBar;": '\U00002AE8', + "vBarv;": '\U00002AE9', + "vDash;": '\U000022A8', + "vangrt;": '\U0000299C', + "varepsilon;": '\U000003F5', + "varkappa;": '\U000003F0', + "varnothing;": '\U00002205', + "varphi;": '\U000003D5', + "varpi;": '\U000003D6', + "varpropto;": '\U0000221D', + "varr;": '\U00002195', + "varrho;": '\U000003F1', + "varsigma;": '\U000003C2', + "vartheta;": '\U000003D1', + "vartriangleleft;": '\U000022B2', + "vartriangleright;": '\U000022B3', + "vcy;": '\U00000432', + "vdash;": '\U000022A2', + "vee;": '\U00002228', + "veebar;": '\U000022BB', + "veeeq;": '\U0000225A', + "vellip;": '\U000022EE', + "verbar;": '\U0000007C', + "vert;": '\U0000007C', + "vfr;": '\U0001D533', + "vltri;": '\U000022B2', + "vopf;": '\U0001D567', + "vprop;": '\U0000221D', + "vrtri;": '\U000022B3', + "vscr;": '\U0001D4CB', + "vzigzag;": '\U0000299A', + "wcirc;": '\U00000175', + "wedbar;": '\U00002A5F', + "wedge;": '\U00002227', + "wedgeq;": '\U00002259', + "weierp;": '\U00002118', + "wfr;": '\U0001D534', + "wopf;": '\U0001D568', + "wp;": '\U00002118', + "wr;": '\U00002240', + "wreath;": '\U00002240', + "wscr;": '\U0001D4CC', + "xcap;": '\U000022C2', + "xcirc;": '\U000025EF', + "xcup;": '\U000022C3', + "xdtri;": '\U000025BD', + "xfr;": '\U0001D535', + "xhArr;": '\U000027FA', + "xharr;": '\U000027F7', + "xi;": '\U000003BE', + "xlArr;": '\U000027F8', + "xlarr;": '\U000027F5', + "xmap;": '\U000027FC', + "xnis;": '\U000022FB', + "xodot;": '\U00002A00', + "xopf;": '\U0001D569', + "xoplus;": '\U00002A01', + "xotime;": '\U00002A02', + "xrArr;": '\U000027F9', + "xrarr;": '\U000027F6', + "xscr;": '\U0001D4CD', + "xsqcup;": '\U00002A06', + "xuplus;": '\U00002A04', + "xutri;": '\U000025B3', + "xvee;": '\U000022C1', + "xwedge;": '\U000022C0', + "yacute;": '\U000000FD', + "yacy;": '\U0000044F', + "ycirc;": '\U00000177', + "ycy;": '\U0000044B', + "yen;": '\U000000A5', + "yfr;": '\U0001D536', + "yicy;": '\U00000457', + "yopf;": '\U0001D56A', + "yscr;": '\U0001D4CE', + "yucy;": '\U0000044E', + "yuml;": '\U000000FF', + "zacute;": '\U0000017A', + "zcaron;": '\U0000017E', + "zcy;": '\U00000437', + "zdot;": '\U0000017C', + "zeetrf;": '\U00002128', + "zeta;": '\U000003B6', + "zfr;": '\U0001D537', + "zhcy;": '\U00000436', + "zigrarr;": '\U000021DD', + "zopf;": '\U0001D56B', + "zscr;": '\U0001D4CF', + "zwj;": '\U0000200D', + "zwnj;": '\U0000200C', + "AElig": '\U000000C6', + "AMP": '\U00000026', + "Aacute": '\U000000C1', + "Acirc": '\U000000C2', + "Agrave": '\U000000C0', + "Aring": '\U000000C5', + "Atilde": '\U000000C3', + "Auml": '\U000000C4', + "COPY": '\U000000A9', + "Ccedil": '\U000000C7', + "ETH": '\U000000D0', + "Eacute": '\U000000C9', + "Ecirc": '\U000000CA', + "Egrave": '\U000000C8', + "Euml": '\U000000CB', + "GT": '\U0000003E', + "Iacute": '\U000000CD', + "Icirc": '\U000000CE', + "Igrave": '\U000000CC', + "Iuml": '\U000000CF', + "LT": '\U0000003C', + "Ntilde": '\U000000D1', + "Oacute": '\U000000D3', + "Ocirc": '\U000000D4', + "Ograve": '\U000000D2', + "Oslash": '\U000000D8', + "Otilde": '\U000000D5', + "Ouml": '\U000000D6', + "QUOT": '\U00000022', + "REG": '\U000000AE', + "THORN": '\U000000DE', + "Uacute": '\U000000DA', + "Ucirc": '\U000000DB', + "Ugrave": '\U000000D9', + "Uuml": '\U000000DC', + "Yacute": '\U000000DD', + "aacute": '\U000000E1', + "acirc": '\U000000E2', + "acute": '\U000000B4', + "aelig": '\U000000E6', + "agrave": '\U000000E0', + "amp": '\U00000026', + "aring": '\U000000E5', + "atilde": '\U000000E3', + "auml": '\U000000E4', + "brvbar": '\U000000A6', + "ccedil": '\U000000E7', + "cedil": '\U000000B8', + "cent": '\U000000A2', + "copy": '\U000000A9', + "curren": '\U000000A4', + "deg": '\U000000B0', + "divide": '\U000000F7', + "eacute": '\U000000E9', + "ecirc": '\U000000EA', + "egrave": '\U000000E8', + "eth": '\U000000F0', + "euml": '\U000000EB', + "frac12": '\U000000BD', + "frac14": '\U000000BC', + "frac34": '\U000000BE', + "gt": '\U0000003E', + "iacute": '\U000000ED', + "icirc": '\U000000EE', + "iexcl": '\U000000A1', + "igrave": '\U000000EC', + "iquest": '\U000000BF', + "iuml": '\U000000EF', + "laquo": '\U000000AB', + "lt": '\U0000003C', + "macr": '\U000000AF', + "micro": '\U000000B5', + "middot": '\U000000B7', + "nbsp": '\U000000A0', + "not": '\U000000AC', + "ntilde": '\U000000F1', + "oacute": '\U000000F3', + "ocirc": '\U000000F4', + "ograve": '\U000000F2', + "ordf": '\U000000AA', + "ordm": '\U000000BA', + "oslash": '\U000000F8', + "otilde": '\U000000F5', + "ouml": '\U000000F6', + "para": '\U000000B6', + "plusmn": '\U000000B1', + "pound": '\U000000A3', + "quot": '\U00000022', + "raquo": '\U000000BB', + "reg": '\U000000AE', + "sect": '\U000000A7', + "shy": '\U000000AD', + "sup1": '\U000000B9', + "sup2": '\U000000B2', + "sup3": '\U000000B3', + "szlig": '\U000000DF', + "thorn": '\U000000FE', + "times": '\U000000D7', + "uacute": '\U000000FA', + "ucirc": '\U000000FB', + "ugrave": '\U000000F9', + "uml": '\U000000A8', + "uuml": '\U000000FC', + "yacute": '\U000000FD', + "yen": '\U000000A5', + "yuml": '\U000000FF', +} + +// HTML entities that are two unicode codepoints. +var entity2 = map[string][2]rune{ + "nLt;": {'\u226A', '\u20D2'}, + "nGt;": {'\u226B', '\u20D2'}, + "NotEqualTilde;": {'\u2242', '\u0338'}, + "NotGreaterFullEqual;": {'\u2267', '\u0338'}, + "NotGreaterGreater;": {'\u226B', '\u0338'}, + "NotGreaterSlantEqual;": {'\u2A7E', '\u0338'}, + "NotHumpDownHump;": {'\u224E', '\u0338'}, + "NotHumpEqual;": {'\u224F', '\u0338'}, + "NotLeftTriangleBar;": {'\u29CF', '\u0338'}, + "NotLessLess;": {'\u226A', '\u0338'}, + "NotLessSlantEqual;": {'\u2A7D', '\u0338'}, + "NotNestedGreaterGreater;": {'\u2AA2', '\u0338'}, + "NotNestedLessLess;": {'\u2AA1', '\u0338'}, + "NotPrecedesEqual;": {'\u2AAF', '\u0338'}, + "NotRightTriangleBar;": {'\u29D0', '\u0338'}, + "NotSquareSubset;": {'\u228F', '\u0338'}, + "NotSquareSuperset;": {'\u2290', '\u0338'}, + "NotSubset;": {'\u2282', '\u20D2'}, + "NotSucceedsEqual;": {'\u2AB0', '\u0338'}, + "NotSucceedsTilde;": {'\u227F', '\u0338'}, + "NotSuperset;": {'\u2283', '\u20D2'}, + "ThickSpace;": {'\u205F', '\u200A'}, + "acE;": {'\u223E', '\u0333'}, + "bne;": {'\u003D', '\u20E5'}, + "bnequiv;": {'\u2261', '\u20E5'}, + "caps;": {'\u2229', '\uFE00'}, + "cups;": {'\u222A', '\uFE00'}, + "fjlig;": {'\u0066', '\u006A'}, + "gesl;": {'\u22DB', '\uFE00'}, + "gvertneqq;": {'\u2269', '\uFE00'}, + "gvnE;": {'\u2269', '\uFE00'}, + "lates;": {'\u2AAD', '\uFE00'}, + "lesg;": {'\u22DA', '\uFE00'}, + "lvertneqq;": {'\u2268', '\uFE00'}, + "lvnE;": {'\u2268', '\uFE00'}, + "nGg;": {'\u22D9', '\u0338'}, + "nGtv;": {'\u226B', '\u0338'}, + "nLl;": {'\u22D8', '\u0338'}, + "nLtv;": {'\u226A', '\u0338'}, + "nang;": {'\u2220', '\u20D2'}, + "napE;": {'\u2A70', '\u0338'}, + "napid;": {'\u224B', '\u0338'}, + "nbump;": {'\u224E', '\u0338'}, + "nbumpe;": {'\u224F', '\u0338'}, + "ncongdot;": {'\u2A6D', '\u0338'}, + "nedot;": {'\u2250', '\u0338'}, + "nesim;": {'\u2242', '\u0338'}, + "ngE;": {'\u2267', '\u0338'}, + "ngeqq;": {'\u2267', '\u0338'}, + "ngeqslant;": {'\u2A7E', '\u0338'}, + "nges;": {'\u2A7E', '\u0338'}, + "nlE;": {'\u2266', '\u0338'}, + "nleqq;": {'\u2266', '\u0338'}, + "nleqslant;": {'\u2A7D', '\u0338'}, + "nles;": {'\u2A7D', '\u0338'}, + "notinE;": {'\u22F9', '\u0338'}, + "notindot;": {'\u22F5', '\u0338'}, + "nparsl;": {'\u2AFD', '\u20E5'}, + "npart;": {'\u2202', '\u0338'}, + "npre;": {'\u2AAF', '\u0338'}, + "npreceq;": {'\u2AAF', '\u0338'}, + "nrarrc;": {'\u2933', '\u0338'}, + "nrarrw;": {'\u219D', '\u0338'}, + "nsce;": {'\u2AB0', '\u0338'}, + "nsubE;": {'\u2AC5', '\u0338'}, + "nsubset;": {'\u2282', '\u20D2'}, + "nsubseteqq;": {'\u2AC5', '\u0338'}, + "nsucceq;": {'\u2AB0', '\u0338'}, + "nsupE;": {'\u2AC6', '\u0338'}, + "nsupset;": {'\u2283', '\u20D2'}, + "nsupseteqq;": {'\u2AC6', '\u0338'}, + "nvap;": {'\u224D', '\u20D2'}, + "nvge;": {'\u2265', '\u20D2'}, + "nvgt;": {'\u003E', '\u20D2'}, + "nvle;": {'\u2264', '\u20D2'}, + "nvlt;": {'\u003C', '\u20D2'}, + "nvltrie;": {'\u22B4', '\u20D2'}, + "nvrtrie;": {'\u22B5', '\u20D2'}, + "nvsim;": {'\u223C', '\u20D2'}, + "race;": {'\u223D', '\u0331'}, + "smtes;": {'\u2AAC', '\uFE00'}, + "sqcaps;": {'\u2293', '\uFE00'}, + "sqcups;": {'\u2294', '\uFE00'}, + "varsubsetneq;": {'\u228A', '\uFE00'}, + "varsubsetneqq;": {'\u2ACB', '\uFE00'}, + "varsupsetneq;": {'\u228B', '\uFE00'}, + "varsupsetneqq;": {'\u2ACC', '\uFE00'}, + "vnsub;": {'\u2282', '\u20D2'}, + "vnsup;": {'\u2283', '\u20D2'}, + "vsubnE;": {'\u2ACB', '\uFE00'}, + "vsubne;": {'\u228A', '\uFE00'}, + "vsupnE;": {'\u2ACC', '\uFE00'}, + "vsupne;": {'\u228B', '\uFE00'}, +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/euc-jp.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/euc-jp.go new file mode 100644 index 0000000000000000000000000000000000000000..249b2c8314cf69e90e9b81e4ab047d6e498ddc27 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/euc-jp.go @@ -0,0 +1,75 @@ +package mahonia + +// Converters for the EUC-JP encoding + +import ( + "sync" +) + +func init() { + RegisterCharset(&Charset{ + Name: "EUC-JP", + Aliases: []string{"extended_unix_code_packed_format_for_japanese", "cseucpkdfmtjapanese"}, + NewDecoder: func() Decoder { + eucJPOnce.Do(makeEUCJPTable) + return eucJPTable.Decoder() + }, + NewEncoder: func() Encoder { + eucJPOnce.Do(makeEUCJPTable) + return eucJPTable.Encoder() + }, + }) +} + +var eucJPOnce sync.Once +var eucJPTable MBCSTable + +func makeEUCJPTable() { + var b [3]byte + + b[0] = 0x8f + for jis0212, unicode := range jis0212ToUnicode { + if unicode == 0 { + continue + } + + b[1] = byte(jis0212>>8) | 128 + b[2] = byte(jis0212) | 128 + eucJPTable.AddCharacter(rune(unicode), string(b[:3])) + } + + for jis0208, unicode := range jis0208ToUnicode { + if unicode == 0 { + continue + } + + b[0] = byte(jis0208>>8) | 128 + b[1] = byte(jis0208) | 128 + eucJPTable.AddCharacter(rune(unicode), string(b[:2])) + } + + b[0] = 0x8e + for i := 128; i < 256; i++ { + unicode := jis0201ToUnicode[i] + if unicode == 0 { + continue + } + + b[1] = byte(i) + eucJPTable.AddCharacter(rune(unicode), string(b[:2])) + } + + for i := '\x00'; i < 128; i++ { + var unicode rune + if i < 32 || i == 127 { + unicode = i + } else { + unicode = rune(jis0201ToUnicode[i]) + if unicode == 0 { + continue + } + } + + eucJPTable.AddCharacter(unicode, string(byte(i))) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/fallback.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/fallback.go new file mode 100644 index 0000000000000000000000000000000000000000..27259c5d79c396ce66d34aa3c4301c50bd62e17a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/fallback.go @@ -0,0 +1,19 @@ +package mahonia + +// FallbackDecoder combines a series of Decoders into one. +// If the first Decoder returns a status of INVALID_CHAR, the others are tried as well. +// +// Note: if the text to be decoded ends with a sequence of bytes that is not a valid character in the first charset, +// but it could be the beginning of a valid character, the FallbackDecoder will give a status of NO_ROOM instead of +// falling back to the other Decoders. +func FallbackDecoder(decoders ...Decoder) Decoder { + return func(p []byte) (c rune, size int, status Status) { + for _, d := range decoders { + c, size, status = d(p) + if status != INVALID_CHAR { + return + } + } + return 0, 1, INVALID_CHAR + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/gb18030-data.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/gb18030-data.go new file mode 100644 index 0000000000000000000000000000000000000000..a63289b711a8565ab84dc46a8522d2081530c715 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/gb18030-data.go @@ -0,0 +1,6839 @@ +package mahonia + +// Data tables for 4-byte characters in GB18030 encoding. +// Based on http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/gb-18030-2005.ucm + +// gb18030Linear converts a 32-bit big-endian representation of a 4-byte +// character into a linearly-increasing integer, starting from the base +// sequence of 0x81308130 +func gb18030Linear(g uint32) uint32 { + lin := g>>24 - 0x81 + lin = lin*10 + (g>>16)&0xff - 0x30 + lin = lin*126 + (g>>8)&0xff - 0x81 + lin = lin*10 + g&0xff - 0x30 + return lin +} + +// Equivalent ranges between GB18030 and Unicode. +var gb18030Ranges = []struct { + firstRune, lastRune rune + firstGB, lastGB uint32 +}{ + {0x10000, 0x10FFFF, gb18030Linear(0x90308130), gb18030Linear(0xE3329A35)}, + {0x9FA6, 0xD7FF, gb18030Linear(0x82358F33), gb18030Linear(0x8336C738)}, + {0x0452, 0x200F, gb18030Linear(0x8130D330), gb18030Linear(0x8136A531)}, + {0xE865, 0xF92B, gb18030Linear(0x8336D030), gb18030Linear(0x84308534)}, + {0x2643, 0x2E80, gb18030Linear(0x8137A839), gb18030Linear(0x8138FD38)}, + {0xFA2A, 0xFE2F, gb18030Linear(0x84309C38), gb18030Linear(0x84318537)}, + {0x3CE1, 0x4055, gb18030Linear(0x8231D438), gb18030Linear(0x8232AF32)}, + {0x361B, 0x3917, gb18030Linear(0x8230A633), gb18030Linear(0x8230F237)}, + {0x49B8, 0x4C76, gb18030Linear(0x8234A131), gb18030Linear(0x8234E733)}, + {0x4160, 0x4336, gb18030Linear(0x8232C937), gb18030Linear(0x8232F837)}, + {0x478E, 0x4946, gb18030Linear(0x8233E838), gb18030Linear(0x82349638)}, + {0x44D7, 0x464B, gb18030Linear(0x8233A339), gb18030Linear(0x8233C931)}, + {0xFFE6, 0xFFFF, gb18030Linear(0x8431A234), gb18030Linear(0x8431A439)}, +} + +// The higest value returned by gb18030Linear for characters in gb18030Data +const maxGB18030Linear = 39393 + +// Unicode equivalents for characters not handled algorithmically. +var gb18030Data = []struct { + unicode uint16 + gb18030 uint32 +}{ + {0x0080, 0x81308130}, + {0x0081, 0x81308131}, + {0x0082, 0x81308132}, + {0x0083, 0x81308133}, + {0x0084, 0x81308134}, + {0x0085, 0x81308135}, + {0x0086, 0x81308136}, + {0x0087, 0x81308137}, + {0x0088, 0x81308138}, + {0x0089, 0x81308139}, + {0x008A, 0x81308230}, + {0x008B, 0x81308231}, + {0x008C, 0x81308232}, + {0x008D, 0x81308233}, + {0x008E, 0x81308234}, + {0x008F, 0x81308235}, + {0x0090, 0x81308236}, + {0x0091, 0x81308237}, + {0x0092, 0x81308238}, + {0x0093, 0x81308239}, + {0x0094, 0x81308330}, + {0x0095, 0x81308331}, + {0x0096, 0x81308332}, + {0x0097, 0x81308333}, + {0x0098, 0x81308334}, + {0x0099, 0x81308335}, + {0x009A, 0x81308336}, + {0x009B, 0x81308337}, + {0x009C, 0x81308338}, + {0x009D, 0x81308339}, + {0x009E, 0x81308430}, + {0x009F, 0x81308431}, + {0x00A0, 0x81308432}, + {0x00A1, 0x81308433}, + {0x00A2, 0x81308434}, + {0x00A3, 0x81308435}, + {0x00A5, 0x81308436}, + {0x00A6, 0x81308437}, + {0x00A9, 0x81308438}, + {0x00AA, 0x81308439}, + {0x00AB, 0x81308530}, + {0x00AC, 0x81308531}, + {0x00AD, 0x81308532}, + {0x00AE, 0x81308533}, + {0x00AF, 0x81308534}, + {0x00B2, 0x81308535}, + {0x00B3, 0x81308536}, + {0x00B4, 0x81308537}, + {0x00B5, 0x81308538}, + {0x00B6, 0x81308539}, + {0x00B8, 0x81308630}, + {0x00B9, 0x81308631}, + {0x00BA, 0x81308632}, + {0x00BB, 0x81308633}, + {0x00BC, 0x81308634}, + {0x00BD, 0x81308635}, + {0x00BE, 0x81308636}, + {0x00BF, 0x81308637}, + {0x00C0, 0x81308638}, + {0x00C1, 0x81308639}, + {0x00C2, 0x81308730}, + {0x00C3, 0x81308731}, + {0x00C4, 0x81308732}, + {0x00C5, 0x81308733}, + {0x00C6, 0x81308734}, + {0x00C7, 0x81308735}, + {0x00C8, 0x81308736}, + {0x00C9, 0x81308737}, + {0x00CA, 0x81308738}, + {0x00CB, 0x81308739}, + {0x00CC, 0x81308830}, + {0x00CD, 0x81308831}, + {0x00CE, 0x81308832}, + {0x00CF, 0x81308833}, + {0x00D0, 0x81308834}, + {0x00D1, 0x81308835}, + {0x00D2, 0x81308836}, + {0x00D3, 0x81308837}, + {0x00D4, 0x81308838}, + {0x00D5, 0x81308839}, + {0x00D6, 0x81308930}, + {0x00D8, 0x81308931}, + {0x00D9, 0x81308932}, + {0x00DA, 0x81308933}, + {0x00DB, 0x81308934}, + {0x00DC, 0x81308935}, + {0x00DD, 0x81308936}, + {0x00DE, 0x81308937}, + {0x00DF, 0x81308938}, + {0x00E2, 0x81308939}, + {0x00E3, 0x81308A30}, + {0x00E4, 0x81308A31}, + {0x00E5, 0x81308A32}, + {0x00E6, 0x81308A33}, + {0x00E7, 0x81308A34}, + {0x00EB, 0x81308A35}, + {0x00EE, 0x81308A36}, + {0x00EF, 0x81308A37}, + {0x00F0, 0x81308A38}, + {0x00F1, 0x81308A39}, + {0x00F4, 0x81308B30}, + {0x00F5, 0x81308B31}, + {0x00F6, 0x81308B32}, + {0x00F8, 0x81308B33}, + {0x00FB, 0x81308B34}, + {0x00FD, 0x81308B35}, + {0x00FE, 0x81308B36}, + {0x00FF, 0x81308B37}, + {0x0100, 0x81308B38}, + {0x0102, 0x81308B39}, + {0x0103, 0x81308C30}, + {0x0104, 0x81308C31}, + {0x0105, 0x81308C32}, + {0x0106, 0x81308C33}, + {0x0107, 0x81308C34}, + {0x0108, 0x81308C35}, + {0x0109, 0x81308C36}, + {0x010A, 0x81308C37}, + {0x010B, 0x81308C38}, + {0x010C, 0x81308C39}, + {0x010D, 0x81308D30}, + {0x010E, 0x81308D31}, + {0x010F, 0x81308D32}, + {0x0110, 0x81308D33}, + {0x0111, 0x81308D34}, + {0x0112, 0x81308D35}, + {0x0114, 0x81308D36}, + {0x0115, 0x81308D37}, + {0x0116, 0x81308D38}, + {0x0117, 0x81308D39}, + {0x0118, 0x81308E30}, + {0x0119, 0x81308E31}, + {0x011A, 0x81308E32}, + {0x011C, 0x81308E33}, + {0x011D, 0x81308E34}, + {0x011E, 0x81308E35}, + {0x011F, 0x81308E36}, + {0x0120, 0x81308E37}, + {0x0121, 0x81308E38}, + {0x0122, 0x81308E39}, + {0x0123, 0x81308F30}, + {0x0124, 0x81308F31}, + {0x0125, 0x81308F32}, + {0x0126, 0x81308F33}, + {0x0127, 0x81308F34}, + {0x0128, 0x81308F35}, + {0x0129, 0x81308F36}, + {0x012A, 0x81308F37}, + {0x012C, 0x81308F38}, + {0x012D, 0x81308F39}, + {0x012E, 0x81309030}, + {0x012F, 0x81309031}, + {0x0130, 0x81309032}, + {0x0131, 0x81309033}, + {0x0132, 0x81309034}, + {0x0133, 0x81309035}, + {0x0134, 0x81309036}, + {0x0135, 0x81309037}, + {0x0136, 0x81309038}, + {0x0137, 0x81309039}, + {0x0138, 0x81309130}, + {0x0139, 0x81309131}, + {0x013A, 0x81309132}, + {0x013B, 0x81309133}, + {0x013C, 0x81309134}, + {0x013D, 0x81309135}, + {0x013E, 0x81309136}, + {0x013F, 0x81309137}, + {0x0140, 0x81309138}, + {0x0141, 0x81309139}, + {0x0142, 0x81309230}, + {0x0143, 0x81309231}, + {0x0145, 0x81309232}, + {0x0146, 0x81309233}, + {0x0147, 0x81309234}, + {0x0149, 0x81309235}, + {0x014A, 0x81309236}, + {0x014B, 0x81309237}, + {0x014C, 0x81309238}, + {0x014E, 0x81309239}, + {0x014F, 0x81309330}, + {0x0150, 0x81309331}, + {0x0151, 0x81309332}, + {0x0152, 0x81309333}, + {0x0153, 0x81309334}, + {0x0154, 0x81309335}, + {0x0155, 0x81309336}, + {0x0156, 0x81309337}, + {0x0157, 0x81309338}, + {0x0158, 0x81309339}, + {0x0159, 0x81309430}, + {0x015A, 0x81309431}, + {0x015B, 0x81309432}, + {0x015C, 0x81309433}, + {0x015D, 0x81309434}, + {0x015E, 0x81309435}, + {0x015F, 0x81309436}, + {0x0160, 0x81309437}, + {0x0161, 0x81309438}, + {0x0162, 0x81309439}, + {0x0163, 0x81309530}, + {0x0164, 0x81309531}, + {0x0165, 0x81309532}, + {0x0166, 0x81309533}, + {0x0167, 0x81309534}, + {0x0168, 0x81309535}, + {0x0169, 0x81309536}, + {0x016A, 0x81309537}, + {0x016C, 0x81309538}, + {0x016D, 0x81309539}, + {0x016E, 0x81309630}, + {0x016F, 0x81309631}, + {0x0170, 0x81309632}, + {0x0171, 0x81309633}, + {0x0172, 0x81309634}, + {0x0173, 0x81309635}, + {0x0174, 0x81309636}, + {0x0175, 0x81309637}, + {0x0176, 0x81309638}, + {0x0177, 0x81309639}, + {0x0178, 0x81309730}, + {0x0179, 0x81309731}, + {0x017A, 0x81309732}, + {0x017B, 0x81309733}, + {0x017C, 0x81309734}, + {0x017D, 0x81309735}, + {0x017E, 0x81309736}, + {0x017F, 0x81309737}, + {0x0180, 0x81309738}, + {0x0181, 0x81309739}, + {0x0182, 0x81309830}, + {0x0183, 0x81309831}, + {0x0184, 0x81309832}, + {0x0185, 0x81309833}, + {0x0186, 0x81309834}, + {0x0187, 0x81309835}, + {0x0188, 0x81309836}, + {0x0189, 0x81309837}, + {0x018A, 0x81309838}, + {0x018B, 0x81309839}, + {0x018C, 0x81309930}, + {0x018D, 0x81309931}, + {0x018E, 0x81309932}, + {0x018F, 0x81309933}, + {0x0190, 0x81309934}, + {0x0191, 0x81309935}, + {0x0192, 0x81309936}, + {0x0193, 0x81309937}, + {0x0194, 0x81309938}, + {0x0195, 0x81309939}, + {0x0196, 0x81309A30}, + {0x0197, 0x81309A31}, + {0x0198, 0x81309A32}, + {0x0199, 0x81309A33}, + {0x019A, 0x81309A34}, + {0x019B, 0x81309A35}, + {0x019C, 0x81309A36}, + {0x019D, 0x81309A37}, + {0x019E, 0x81309A38}, + {0x019F, 0x81309A39}, + {0x01A0, 0x81309B30}, + {0x01A1, 0x81309B31}, + {0x01A2, 0x81309B32}, + {0x01A3, 0x81309B33}, + {0x01A4, 0x81309B34}, + {0x01A5, 0x81309B35}, + {0x01A6, 0x81309B36}, + {0x01A7, 0x81309B37}, + {0x01A8, 0x81309B38}, + {0x01A9, 0x81309B39}, + {0x01AA, 0x81309C30}, + {0x01AB, 0x81309C31}, + {0x01AC, 0x81309C32}, + {0x01AD, 0x81309C33}, + {0x01AE, 0x81309C34}, + {0x01AF, 0x81309C35}, + {0x01B0, 0x81309C36}, + {0x01B1, 0x81309C37}, + {0x01B2, 0x81309C38}, + {0x01B3, 0x81309C39}, + {0x01B4, 0x81309D30}, + {0x01B5, 0x81309D31}, + {0x01B6, 0x81309D32}, + {0x01B7, 0x81309D33}, + {0x01B8, 0x81309D34}, + {0x01B9, 0x81309D35}, + {0x01BA, 0x81309D36}, + {0x01BB, 0x81309D37}, + {0x01BC, 0x81309D38}, + {0x01BD, 0x81309D39}, + {0x01BE, 0x81309E30}, + {0x01BF, 0x81309E31}, + {0x01C0, 0x81309E32}, + {0x01C1, 0x81309E33}, + {0x01C2, 0x81309E34}, + {0x01C3, 0x81309E35}, + {0x01C4, 0x81309E36}, + {0x01C5, 0x81309E37}, + {0x01C6, 0x81309E38}, + {0x01C7, 0x81309E39}, + {0x01C8, 0x81309F30}, + {0x01C9, 0x81309F31}, + {0x01CA, 0x81309F32}, + {0x01CB, 0x81309F33}, + {0x01CC, 0x81309F34}, + {0x01CD, 0x81309F35}, + {0x01CF, 0x81309F36}, + {0x01D1, 0x81309F37}, + {0x01D3, 0x81309F38}, + {0x01D5, 0x81309F39}, + {0x01D7, 0x8130A030}, + {0x01D9, 0x8130A031}, + {0x01DB, 0x8130A032}, + {0x01DD, 0x8130A033}, + {0x01DE, 0x8130A034}, + {0x01DF, 0x8130A035}, + {0x01E0, 0x8130A036}, + {0x01E1, 0x8130A037}, + {0x01E2, 0x8130A038}, + {0x01E3, 0x8130A039}, + {0x01E4, 0x8130A130}, + {0x01E5, 0x8130A131}, + {0x01E6, 0x8130A132}, + {0x01E7, 0x8130A133}, + {0x01E8, 0x8130A134}, + {0x01E9, 0x8130A135}, + {0x01EA, 0x8130A136}, + {0x01EB, 0x8130A137}, + {0x01EC, 0x8130A138}, + {0x01ED, 0x8130A139}, + {0x01EE, 0x8130A230}, + {0x01EF, 0x8130A231}, + {0x01F0, 0x8130A232}, + {0x01F1, 0x8130A233}, + {0x01F2, 0x8130A234}, + {0x01F3, 0x8130A235}, + {0x01F4, 0x8130A236}, + {0x01F5, 0x8130A237}, + {0x01F6, 0x8130A238}, + {0x01F7, 0x8130A239}, + {0x01F8, 0x8130A330}, + {0x01FA, 0x8130A331}, + {0x01FB, 0x8130A332}, + {0x01FC, 0x8130A333}, + {0x01FD, 0x8130A334}, + {0x01FE, 0x8130A335}, + {0x01FF, 0x8130A336}, + {0x0200, 0x8130A337}, + {0x0201, 0x8130A338}, + {0x0202, 0x8130A339}, + {0x0203, 0x8130A430}, + {0x0204, 0x8130A431}, + {0x0205, 0x8130A432}, + {0x0206, 0x8130A433}, + {0x0207, 0x8130A434}, + {0x0208, 0x8130A435}, + {0x0209, 0x8130A436}, + {0x020A, 0x8130A437}, + {0x020B, 0x8130A438}, + {0x020C, 0x8130A439}, + {0x020D, 0x8130A530}, + {0x020E, 0x8130A531}, + {0x020F, 0x8130A532}, + {0x0210, 0x8130A533}, + {0x0211, 0x8130A534}, + {0x0212, 0x8130A535}, + {0x0213, 0x8130A536}, + {0x0214, 0x8130A537}, + {0x0215, 0x8130A538}, + {0x0216, 0x8130A539}, + {0x0217, 0x8130A630}, + {0x0218, 0x8130A631}, + {0x0219, 0x8130A632}, + {0x021A, 0x8130A633}, + {0x021B, 0x8130A634}, + {0x021C, 0x8130A635}, + {0x021D, 0x8130A636}, + {0x021E, 0x8130A637}, + {0x021F, 0x8130A638}, + {0x0220, 0x8130A639}, + {0x0221, 0x8130A730}, + {0x0222, 0x8130A731}, + {0x0223, 0x8130A732}, + {0x0224, 0x8130A733}, + {0x0225, 0x8130A734}, + {0x0226, 0x8130A735}, + {0x0227, 0x8130A736}, + {0x0228, 0x8130A737}, + {0x0229, 0x8130A738}, + {0x022A, 0x8130A739}, + {0x022B, 0x8130A830}, + {0x022C, 0x8130A831}, + {0x022D, 0x8130A832}, + {0x022E, 0x8130A833}, + {0x022F, 0x8130A834}, + {0x0230, 0x8130A835}, + {0x0231, 0x8130A836}, + {0x0232, 0x8130A837}, + {0x0233, 0x8130A838}, + {0x0234, 0x8130A839}, + {0x0235, 0x8130A930}, + {0x0236, 0x8130A931}, + {0x0237, 0x8130A932}, + {0x0238, 0x8130A933}, + {0x0239, 0x8130A934}, + {0x023A, 0x8130A935}, + {0x023B, 0x8130A936}, + {0x023C, 0x8130A937}, + {0x023D, 0x8130A938}, + {0x023E, 0x8130A939}, + {0x023F, 0x8130AA30}, + {0x0240, 0x8130AA31}, + {0x0241, 0x8130AA32}, + {0x0242, 0x8130AA33}, + {0x0243, 0x8130AA34}, + {0x0244, 0x8130AA35}, + {0x0245, 0x8130AA36}, + {0x0246, 0x8130AA37}, + {0x0247, 0x8130AA38}, + {0x0248, 0x8130AA39}, + {0x0249, 0x8130AB30}, + {0x024A, 0x8130AB31}, + {0x024B, 0x8130AB32}, + {0x024C, 0x8130AB33}, + {0x024D, 0x8130AB34}, + {0x024E, 0x8130AB35}, + {0x024F, 0x8130AB36}, + {0x0250, 0x8130AB37}, + {0x0252, 0x8130AB38}, + {0x0253, 0x8130AB39}, + {0x0254, 0x8130AC30}, + {0x0255, 0x8130AC31}, + {0x0256, 0x8130AC32}, + {0x0257, 0x8130AC33}, + {0x0258, 0x8130AC34}, + {0x0259, 0x8130AC35}, + {0x025A, 0x8130AC36}, + {0x025B, 0x8130AC37}, + {0x025C, 0x8130AC38}, + {0x025D, 0x8130AC39}, + {0x025E, 0x8130AD30}, + {0x025F, 0x8130AD31}, + {0x0260, 0x8130AD32}, + {0x0262, 0x8130AD33}, + {0x0263, 0x8130AD34}, + {0x0264, 0x8130AD35}, + {0x0265, 0x8130AD36}, + {0x0266, 0x8130AD37}, + {0x0267, 0x8130AD38}, + {0x0268, 0x8130AD39}, + {0x0269, 0x8130AE30}, + {0x026A, 0x8130AE31}, + {0x026B, 0x8130AE32}, + {0x026C, 0x8130AE33}, + {0x026D, 0x8130AE34}, + {0x026E, 0x8130AE35}, + {0x026F, 0x8130AE36}, + {0x0270, 0x8130AE37}, + {0x0271, 0x8130AE38}, + {0x0272, 0x8130AE39}, + {0x0273, 0x8130AF30}, + {0x0274, 0x8130AF31}, + {0x0275, 0x8130AF32}, + {0x0276, 0x8130AF33}, + {0x0277, 0x8130AF34}, + {0x0278, 0x8130AF35}, + {0x0279, 0x8130AF36}, + {0x027A, 0x8130AF37}, + {0x027B, 0x8130AF38}, + {0x027C, 0x8130AF39}, + {0x027D, 0x8130B030}, + {0x027E, 0x8130B031}, + {0x027F, 0x8130B032}, + {0x0280, 0x8130B033}, + {0x0281, 0x8130B034}, + {0x0282, 0x8130B035}, + {0x0283, 0x8130B036}, + {0x0284, 0x8130B037}, + {0x0285, 0x8130B038}, + {0x0286, 0x8130B039}, + {0x0287, 0x8130B130}, + {0x0288, 0x8130B131}, + {0x0289, 0x8130B132}, + {0x028A, 0x8130B133}, + {0x028B, 0x8130B134}, + {0x028C, 0x8130B135}, + {0x028D, 0x8130B136}, + {0x028E, 0x8130B137}, + {0x028F, 0x8130B138}, + {0x0290, 0x8130B139}, + {0x0291, 0x8130B230}, + {0x0292, 0x8130B231}, + {0x0293, 0x8130B232}, + {0x0294, 0x8130B233}, + {0x0295, 0x8130B234}, + {0x0296, 0x8130B235}, + {0x0297, 0x8130B236}, + {0x0298, 0x8130B237}, + {0x0299, 0x8130B238}, + {0x029A, 0x8130B239}, + {0x029B, 0x8130B330}, + {0x029C, 0x8130B331}, + {0x029D, 0x8130B332}, + {0x029E, 0x8130B333}, + {0x029F, 0x8130B334}, + {0x02A0, 0x8130B335}, + {0x02A1, 0x8130B336}, + {0x02A2, 0x8130B337}, + {0x02A3, 0x8130B338}, + {0x02A4, 0x8130B339}, + {0x02A5, 0x8130B430}, + {0x02A6, 0x8130B431}, + {0x02A7, 0x8130B432}, + {0x02A8, 0x8130B433}, + {0x02A9, 0x8130B434}, + {0x02AA, 0x8130B435}, + {0x02AB, 0x8130B436}, + {0x02AC, 0x8130B437}, + {0x02AD, 0x8130B438}, + {0x02AE, 0x8130B439}, + {0x02AF, 0x8130B530}, + {0x02B0, 0x8130B531}, + {0x02B1, 0x8130B532}, + {0x02B2, 0x8130B533}, + {0x02B3, 0x8130B534}, + {0x02B4, 0x8130B535}, + {0x02B5, 0x8130B536}, + {0x02B6, 0x8130B537}, + {0x02B7, 0x8130B538}, + {0x02B8, 0x8130B539}, + {0x02B9, 0x8130B630}, + {0x02BA, 0x8130B631}, + {0x02BB, 0x8130B632}, + {0x02BC, 0x8130B633}, + {0x02BD, 0x8130B634}, + {0x02BE, 0x8130B635}, + {0x02BF, 0x8130B636}, + {0x02C0, 0x8130B637}, + {0x02C1, 0x8130B638}, + {0x02C2, 0x8130B639}, + {0x02C3, 0x8130B730}, + {0x02C4, 0x8130B731}, + {0x02C5, 0x8130B732}, + {0x02C6, 0x8130B733}, + {0x02C8, 0x8130B734}, + {0x02CC, 0x8130B735}, + {0x02CD, 0x8130B736}, + {0x02CE, 0x8130B737}, + {0x02CF, 0x8130B738}, + {0x02D0, 0x8130B739}, + {0x02D1, 0x8130B830}, + {0x02D2, 0x8130B831}, + {0x02D3, 0x8130B832}, + {0x02D4, 0x8130B833}, + {0x02D5, 0x8130B834}, + {0x02D6, 0x8130B835}, + {0x02D7, 0x8130B836}, + {0x02D8, 0x8130B837}, + {0x02DA, 0x8130B838}, + {0x02DB, 0x8130B839}, + {0x02DC, 0x8130B930}, + {0x02DD, 0x8130B931}, + {0x02DE, 0x8130B932}, + {0x02DF, 0x8130B933}, + {0x02E0, 0x8130B934}, + {0x02E1, 0x8130B935}, + {0x02E2, 0x8130B936}, + {0x02E3, 0x8130B937}, + {0x02E4, 0x8130B938}, + {0x02E5, 0x8130B939}, + {0x02E6, 0x8130BA30}, + {0x02E7, 0x8130BA31}, + {0x02E8, 0x8130BA32}, + {0x02E9, 0x8130BA33}, + {0x02EA, 0x8130BA34}, + {0x02EB, 0x8130BA35}, + {0x02EC, 0x8130BA36}, + {0x02ED, 0x8130BA37}, + {0x02EE, 0x8130BA38}, + {0x02EF, 0x8130BA39}, + {0x02F0, 0x8130BB30}, + {0x02F1, 0x8130BB31}, + {0x02F2, 0x8130BB32}, + {0x02F3, 0x8130BB33}, + {0x02F4, 0x8130BB34}, + {0x02F5, 0x8130BB35}, + {0x02F6, 0x8130BB36}, + {0x02F7, 0x8130BB37}, + {0x02F8, 0x8130BB38}, + {0x02F9, 0x8130BB39}, + {0x02FA, 0x8130BC30}, + {0x02FB, 0x8130BC31}, + {0x02FC, 0x8130BC32}, + {0x02FD, 0x8130BC33}, + {0x02FE, 0x8130BC34}, + {0x02FF, 0x8130BC35}, + {0x0300, 0x8130BC36}, + {0x0301, 0x8130BC37}, + {0x0302, 0x8130BC38}, + {0x0303, 0x8130BC39}, + {0x0304, 0x8130BD30}, + {0x0305, 0x8130BD31}, + {0x0306, 0x8130BD32}, + {0x0307, 0x8130BD33}, + {0x0308, 0x8130BD34}, + {0x0309, 0x8130BD35}, + {0x030A, 0x8130BD36}, + {0x030B, 0x8130BD37}, + {0x030C, 0x8130BD38}, + {0x030D, 0x8130BD39}, + {0x030E, 0x8130BE30}, + {0x030F, 0x8130BE31}, + {0x0310, 0x8130BE32}, + {0x0311, 0x8130BE33}, + {0x0312, 0x8130BE34}, + {0x0313, 0x8130BE35}, + {0x0314, 0x8130BE36}, + {0x0315, 0x8130BE37}, + {0x0316, 0x8130BE38}, + {0x0317, 0x8130BE39}, + {0x0318, 0x8130BF30}, + {0x0319, 0x8130BF31}, + {0x031A, 0x8130BF32}, + {0x031B, 0x8130BF33}, + {0x031C, 0x8130BF34}, + {0x031D, 0x8130BF35}, + {0x031E, 0x8130BF36}, + {0x031F, 0x8130BF37}, + {0x0320, 0x8130BF38}, + {0x0321, 0x8130BF39}, + {0x0322, 0x8130C030}, + {0x0323, 0x8130C031}, + {0x0324, 0x8130C032}, + {0x0325, 0x8130C033}, + {0x0326, 0x8130C034}, + {0x0327, 0x8130C035}, + {0x0328, 0x8130C036}, + {0x0329, 0x8130C037}, + {0x032A, 0x8130C038}, + {0x032B, 0x8130C039}, + {0x032C, 0x8130C130}, + {0x032D, 0x8130C131}, + {0x032E, 0x8130C132}, + {0x032F, 0x8130C133}, + {0x0330, 0x8130C134}, + {0x0331, 0x8130C135}, + {0x0332, 0x8130C136}, + {0x0333, 0x8130C137}, + {0x0334, 0x8130C138}, + {0x0335, 0x8130C139}, + {0x0336, 0x8130C230}, + {0x0337, 0x8130C231}, + {0x0338, 0x8130C232}, + {0x0339, 0x8130C233}, + {0x033A, 0x8130C234}, + {0x033B, 0x8130C235}, + {0x033C, 0x8130C236}, + {0x033D, 0x8130C237}, + {0x033E, 0x8130C238}, + {0x033F, 0x8130C239}, + {0x0340, 0x8130C330}, + {0x0341, 0x8130C331}, + {0x0342, 0x8130C332}, + {0x0343, 0x8130C333}, + {0x0344, 0x8130C334}, + {0x0345, 0x8130C335}, + {0x0346, 0x8130C336}, + {0x0347, 0x8130C337}, + {0x0348, 0x8130C338}, + {0x0349, 0x8130C339}, + {0x034A, 0x8130C430}, + {0x034B, 0x8130C431}, + {0x034C, 0x8130C432}, + {0x034D, 0x8130C433}, + {0x034E, 0x8130C434}, + {0x034F, 0x8130C435}, + {0x0350, 0x8130C436}, + {0x0351, 0x8130C437}, + {0x0352, 0x8130C438}, + {0x0353, 0x8130C439}, + {0x0354, 0x8130C530}, + {0x0355, 0x8130C531}, + {0x0356, 0x8130C532}, + {0x0357, 0x8130C533}, + {0x0358, 0x8130C534}, + {0x0359, 0x8130C535}, + {0x035A, 0x8130C536}, + {0x035B, 0x8130C537}, + {0x035C, 0x8130C538}, + {0x035D, 0x8130C539}, + {0x035E, 0x8130C630}, + {0x035F, 0x8130C631}, + {0x0360, 0x8130C632}, + {0x0361, 0x8130C633}, + {0x0362, 0x8130C634}, + {0x0363, 0x8130C635}, + {0x0364, 0x8130C636}, + {0x0365, 0x8130C637}, + {0x0366, 0x8130C638}, + {0x0367, 0x8130C639}, + {0x0368, 0x8130C730}, + {0x0369, 0x8130C731}, + {0x036A, 0x8130C732}, + {0x036B, 0x8130C733}, + {0x036C, 0x8130C734}, + {0x036D, 0x8130C735}, + {0x036E, 0x8130C736}, + {0x036F, 0x8130C737}, + {0x0370, 0x8130C738}, + {0x0371, 0x8130C739}, + {0x0372, 0x8130C830}, + {0x0373, 0x8130C831}, + {0x0374, 0x8130C832}, + {0x0375, 0x8130C833}, + {0x0376, 0x8130C834}, + {0x0377, 0x8130C835}, + {0x0378, 0x8130C836}, + {0x0379, 0x8130C837}, + {0x037A, 0x8130C838}, + {0x037B, 0x8130C839}, + {0x037C, 0x8130C930}, + {0x037D, 0x8130C931}, + {0x037E, 0x8130C932}, + {0x037F, 0x8130C933}, + {0x0380, 0x8130C934}, + {0x0381, 0x8130C935}, + {0x0382, 0x8130C936}, + {0x0383, 0x8130C937}, + {0x0384, 0x8130C938}, + {0x0385, 0x8130C939}, + {0x0386, 0x8130CA30}, + {0x0387, 0x8130CA31}, + {0x0388, 0x8130CA32}, + {0x0389, 0x8130CA33}, + {0x038A, 0x8130CA34}, + {0x038B, 0x8130CA35}, + {0x038C, 0x8130CA36}, + {0x038D, 0x8130CA37}, + {0x038E, 0x8130CA38}, + {0x038F, 0x8130CA39}, + {0x0390, 0x8130CB30}, + {0x03A2, 0x8130CB31}, + {0x03AA, 0x8130CB32}, + {0x03AB, 0x8130CB33}, + {0x03AC, 0x8130CB34}, + {0x03AD, 0x8130CB35}, + {0x03AE, 0x8130CB36}, + {0x03AF, 0x8130CB37}, + {0x03B0, 0x8130CB38}, + {0x03C2, 0x8130CB39}, + {0x03CA, 0x8130CC30}, + {0x03CB, 0x8130CC31}, + {0x03CC, 0x8130CC32}, + {0x03CD, 0x8130CC33}, + {0x03CE, 0x8130CC34}, + {0x03CF, 0x8130CC35}, + {0x03D0, 0x8130CC36}, + {0x03D1, 0x8130CC37}, + {0x03D2, 0x8130CC38}, + {0x03D3, 0x8130CC39}, + {0x03D4, 0x8130CD30}, + {0x03D5, 0x8130CD31}, + {0x03D6, 0x8130CD32}, + {0x03D7, 0x8130CD33}, + {0x03D8, 0x8130CD34}, + {0x03D9, 0x8130CD35}, + {0x03DA, 0x8130CD36}, + {0x03DB, 0x8130CD37}, + {0x03DC, 0x8130CD38}, + {0x03DD, 0x8130CD39}, + {0x03DE, 0x8130CE30}, + {0x03DF, 0x8130CE31}, + {0x03E0, 0x8130CE32}, + {0x03E1, 0x8130CE33}, + {0x03E2, 0x8130CE34}, + {0x03E3, 0x8130CE35}, + {0x03E4, 0x8130CE36}, + {0x03E5, 0x8130CE37}, + {0x03E6, 0x8130CE38}, + {0x03E7, 0x8130CE39}, + {0x03E8, 0x8130CF30}, + {0x03E9, 0x8130CF31}, + {0x03EA, 0x8130CF32}, + {0x03EB, 0x8130CF33}, + {0x03EC, 0x8130CF34}, + {0x03ED, 0x8130CF35}, + {0x03EE, 0x8130CF36}, + {0x03EF, 0x8130CF37}, + {0x03F0, 0x8130CF38}, + {0x03F1, 0x8130CF39}, + {0x03F2, 0x8130D030}, + {0x03F3, 0x8130D031}, + {0x03F4, 0x8130D032}, + {0x03F5, 0x8130D033}, + {0x03F6, 0x8130D034}, + {0x03F7, 0x8130D035}, + {0x03F8, 0x8130D036}, + {0x03F9, 0x8130D037}, + {0x03FA, 0x8130D038}, + {0x03FB, 0x8130D039}, + {0x03FC, 0x8130D130}, + {0x03FD, 0x8130D131}, + {0x03FE, 0x8130D132}, + {0x03FF, 0x8130D133}, + {0x0400, 0x8130D134}, + {0x0402, 0x8130D135}, + {0x0403, 0x8130D136}, + {0x0404, 0x8130D137}, + {0x0405, 0x8130D138}, + {0x0406, 0x8130D139}, + {0x0407, 0x8130D230}, + {0x0408, 0x8130D231}, + {0x0409, 0x8130D232}, + {0x040A, 0x8130D233}, + {0x040B, 0x8130D234}, + {0x040C, 0x8130D235}, + {0x040D, 0x8130D236}, + {0x040E, 0x8130D237}, + {0x040F, 0x8130D238}, + {0x0450, 0x8130D239}, + {0x2011, 0x8136A532}, + {0x2012, 0x8136A533}, + {0x2017, 0x8136A534}, + {0x201A, 0x8136A535}, + {0x201B, 0x8136A536}, + {0x201E, 0x8136A537}, + {0x201F, 0x8136A538}, + {0x2020, 0x8136A539}, + {0x2021, 0x8136A630}, + {0x2022, 0x8136A631}, + {0x2023, 0x8136A632}, + {0x2024, 0x8136A633}, + {0x2027, 0x8136A634}, + {0x2028, 0x8136A635}, + {0x2029, 0x8136A636}, + {0x202A, 0x8136A637}, + {0x202B, 0x8136A638}, + {0x202C, 0x8136A639}, + {0x202D, 0x8136A730}, + {0x202E, 0x8136A731}, + {0x202F, 0x8136A732}, + {0x2031, 0x8136A733}, + {0x2034, 0x8136A734}, + {0x2036, 0x8136A735}, + {0x2037, 0x8136A736}, + {0x2038, 0x8136A737}, + {0x2039, 0x8136A738}, + {0x203A, 0x8136A739}, + {0x203C, 0x8136A830}, + {0x203D, 0x8136A831}, + {0x203E, 0x8136A832}, + {0x203F, 0x8136A833}, + {0x2040, 0x8136A834}, + {0x2041, 0x8136A835}, + {0x2042, 0x8136A836}, + {0x2043, 0x8136A837}, + {0x2044, 0x8136A838}, + {0x2045, 0x8136A839}, + {0x2046, 0x8136A930}, + {0x2047, 0x8136A931}, + {0x2048, 0x8136A932}, + {0x2049, 0x8136A933}, + {0x204A, 0x8136A934}, + {0x204B, 0x8136A935}, + {0x204C, 0x8136A936}, + {0x204D, 0x8136A937}, + {0x204E, 0x8136A938}, + {0x204F, 0x8136A939}, + {0x2050, 0x8136AA30}, + {0x2051, 0x8136AA31}, + {0x2052, 0x8136AA32}, + {0x2053, 0x8136AA33}, + {0x2054, 0x8136AA34}, + {0x2055, 0x8136AA35}, + {0x2056, 0x8136AA36}, + {0x2057, 0x8136AA37}, + {0x2058, 0x8136AA38}, + {0x2059, 0x8136AA39}, + {0x205A, 0x8136AB30}, + {0x205B, 0x8136AB31}, + {0x205C, 0x8136AB32}, + {0x205D, 0x8136AB33}, + {0x205E, 0x8136AB34}, + {0x205F, 0x8136AB35}, + {0x2060, 0x8136AB36}, + {0x2061, 0x8136AB37}, + {0x2062, 0x8136AB38}, + {0x2063, 0x8136AB39}, + {0x2064, 0x8136AC30}, + {0x2065, 0x8136AC31}, + {0x2066, 0x8136AC32}, + {0x2067, 0x8136AC33}, + {0x2068, 0x8136AC34}, + {0x2069, 0x8136AC35}, + {0x206A, 0x8136AC36}, + {0x206B, 0x8136AC37}, + {0x206C, 0x8136AC38}, + {0x206D, 0x8136AC39}, + {0x206E, 0x8136AD30}, + {0x206F, 0x8136AD31}, + {0x2070, 0x8136AD32}, + {0x2071, 0x8136AD33}, + {0x2072, 0x8136AD34}, + {0x2073, 0x8136AD35}, + {0x2074, 0x8136AD36}, + {0x2075, 0x8136AD37}, + {0x2076, 0x8136AD38}, + {0x2077, 0x8136AD39}, + {0x2078, 0x8136AE30}, + {0x2079, 0x8136AE31}, + {0x207A, 0x8136AE32}, + {0x207B, 0x8136AE33}, + {0x207C, 0x8136AE34}, + {0x207D, 0x8136AE35}, + {0x207E, 0x8136AE36}, + {0x207F, 0x8136AE37}, + {0x2080, 0x8136AE38}, + {0x2081, 0x8136AE39}, + {0x2082, 0x8136AF30}, + {0x2083, 0x8136AF31}, + {0x2084, 0x8136AF32}, + {0x2085, 0x8136AF33}, + {0x2086, 0x8136AF34}, + {0x2087, 0x8136AF35}, + {0x2088, 0x8136AF36}, + {0x2089, 0x8136AF37}, + {0x208A, 0x8136AF38}, + {0x208B, 0x8136AF39}, + {0x208C, 0x8136B030}, + {0x208D, 0x8136B031}, + {0x208E, 0x8136B032}, + {0x208F, 0x8136B033}, + {0x2090, 0x8136B034}, + {0x2091, 0x8136B035}, + {0x2092, 0x8136B036}, + {0x2093, 0x8136B037}, + {0x2094, 0x8136B038}, + {0x2095, 0x8136B039}, + {0x2096, 0x8136B130}, + {0x2097, 0x8136B131}, + {0x2098, 0x8136B132}, + {0x2099, 0x8136B133}, + {0x209A, 0x8136B134}, + {0x209B, 0x8136B135}, + {0x209C, 0x8136B136}, + {0x209D, 0x8136B137}, + {0x209E, 0x8136B138}, + {0x209F, 0x8136B139}, + {0x20A0, 0x8136B230}, + {0x20A1, 0x8136B231}, + {0x20A2, 0x8136B232}, + {0x20A3, 0x8136B233}, + {0x20A4, 0x8136B234}, + {0x20A5, 0x8136B235}, + {0x20A6, 0x8136B236}, + {0x20A7, 0x8136B237}, + {0x20A8, 0x8136B238}, + {0x20A9, 0x8136B239}, + {0x20AA, 0x8136B330}, + {0x20AB, 0x8136B331}, + {0x20AD, 0x8136B332}, + {0x20AE, 0x8136B333}, + {0x20AF, 0x8136B334}, + {0x20B0, 0x8136B335}, + {0x20B1, 0x8136B336}, + {0x20B2, 0x8136B337}, + {0x20B3, 0x8136B338}, + {0x20B4, 0x8136B339}, + {0x20B5, 0x8136B430}, + {0x20B6, 0x8136B431}, + {0x20B7, 0x8136B432}, + {0x20B8, 0x8136B433}, + {0x20B9, 0x8136B434}, + {0x20BA, 0x8136B435}, + {0x20BB, 0x8136B436}, + {0x20BC, 0x8136B437}, + {0x20BD, 0x8136B438}, + {0x20BE, 0x8136B439}, + {0x20BF, 0x8136B530}, + {0x20C0, 0x8136B531}, + {0x20C1, 0x8136B532}, + {0x20C2, 0x8136B533}, + {0x20C3, 0x8136B534}, + {0x20C4, 0x8136B535}, + {0x20C5, 0x8136B536}, + {0x20C6, 0x8136B537}, + {0x20C7, 0x8136B538}, + {0x20C8, 0x8136B539}, + {0x20C9, 0x8136B630}, + {0x20CA, 0x8136B631}, + {0x20CB, 0x8136B632}, + {0x20CC, 0x8136B633}, + {0x20CD, 0x8136B634}, + {0x20CE, 0x8136B635}, + {0x20CF, 0x8136B636}, + {0x20D0, 0x8136B637}, + {0x20D1, 0x8136B638}, + {0x20D2, 0x8136B639}, + {0x20D3, 0x8136B730}, + {0x20D4, 0x8136B731}, + {0x20D5, 0x8136B732}, + {0x20D6, 0x8136B733}, + {0x20D7, 0x8136B734}, + {0x20D8, 0x8136B735}, + {0x20D9, 0x8136B736}, + {0x20DA, 0x8136B737}, + {0x20DB, 0x8136B738}, + {0x20DC, 0x8136B739}, + {0x20DD, 0x8136B830}, + {0x20DE, 0x8136B831}, + {0x20DF, 0x8136B832}, + {0x20E0, 0x8136B833}, + {0x20E1, 0x8136B834}, + {0x20E2, 0x8136B835}, + {0x20E3, 0x8136B836}, + {0x20E4, 0x8136B837}, + {0x20E5, 0x8136B838}, + {0x20E6, 0x8136B839}, + {0x20E7, 0x8136B930}, + {0x20E8, 0x8136B931}, + {0x20E9, 0x8136B932}, + {0x20EA, 0x8136B933}, + {0x20EB, 0x8136B934}, + {0x20EC, 0x8136B935}, + {0x20ED, 0x8136B936}, + {0x20EE, 0x8136B937}, + {0x20EF, 0x8136B938}, + {0x20F0, 0x8136B939}, + {0x20F1, 0x8136BA30}, + {0x20F2, 0x8136BA31}, + {0x20F3, 0x8136BA32}, + {0x20F4, 0x8136BA33}, + {0x20F5, 0x8136BA34}, + {0x20F6, 0x8136BA35}, + {0x20F7, 0x8136BA36}, + {0x20F8, 0x8136BA37}, + {0x20F9, 0x8136BA38}, + {0x20FA, 0x8136BA39}, + {0x20FB, 0x8136BB30}, + {0x20FC, 0x8136BB31}, + {0x20FD, 0x8136BB32}, + {0x20FE, 0x8136BB33}, + {0x20FF, 0x8136BB34}, + {0x2100, 0x8136BB35}, + {0x2101, 0x8136BB36}, + {0x2102, 0x8136BB37}, + {0x2104, 0x8136BB38}, + {0x2106, 0x8136BB39}, + {0x2107, 0x8136BC30}, + {0x2108, 0x8136BC31}, + {0x210A, 0x8136BC32}, + {0x210B, 0x8136BC33}, + {0x210C, 0x8136BC34}, + {0x210D, 0x8136BC35}, + {0x210E, 0x8136BC36}, + {0x210F, 0x8136BC37}, + {0x2110, 0x8136BC38}, + {0x2111, 0x8136BC39}, + {0x2112, 0x8136BD30}, + {0x2113, 0x8136BD31}, + {0x2114, 0x8136BD32}, + {0x2115, 0x8136BD33}, + {0x2117, 0x8136BD34}, + {0x2118, 0x8136BD35}, + {0x2119, 0x8136BD36}, + {0x211A, 0x8136BD37}, + {0x211B, 0x8136BD38}, + {0x211C, 0x8136BD39}, + {0x211D, 0x8136BE30}, + {0x211E, 0x8136BE31}, + {0x211F, 0x8136BE32}, + {0x2120, 0x8136BE33}, + {0x2122, 0x8136BE34}, + {0x2123, 0x8136BE35}, + {0x2124, 0x8136BE36}, + {0x2125, 0x8136BE37}, + {0x2126, 0x8136BE38}, + {0x2127, 0x8136BE39}, + {0x2128, 0x8136BF30}, + {0x2129, 0x8136BF31}, + {0x212A, 0x8136BF32}, + {0x212B, 0x8136BF33}, + {0x212C, 0x8136BF34}, + {0x212D, 0x8136BF35}, + {0x212E, 0x8136BF36}, + {0x212F, 0x8136BF37}, + {0x2130, 0x8136BF38}, + {0x2131, 0x8136BF39}, + {0x2132, 0x8136C030}, + {0x2133, 0x8136C031}, + {0x2134, 0x8136C032}, + {0x2135, 0x8136C033}, + {0x2136, 0x8136C034}, + {0x2137, 0x8136C035}, + {0x2138, 0x8136C036}, + {0x2139, 0x8136C037}, + {0x213A, 0x8136C038}, + {0x213B, 0x8136C039}, + {0x213C, 0x8136C130}, + {0x213D, 0x8136C131}, + {0x213E, 0x8136C132}, + {0x213F, 0x8136C133}, + {0x2140, 0x8136C134}, + {0x2141, 0x8136C135}, + {0x2142, 0x8136C136}, + {0x2143, 0x8136C137}, + {0x2144, 0x8136C138}, + {0x2145, 0x8136C139}, + {0x2146, 0x8136C230}, + {0x2147, 0x8136C231}, + {0x2148, 0x8136C232}, + {0x2149, 0x8136C233}, + {0x214A, 0x8136C234}, + {0x214B, 0x8136C235}, + {0x214C, 0x8136C236}, + {0x214D, 0x8136C237}, + {0x214E, 0x8136C238}, + {0x214F, 0x8136C239}, + {0x2150, 0x8136C330}, + {0x2151, 0x8136C331}, + {0x2152, 0x8136C332}, + {0x2153, 0x8136C333}, + {0x2154, 0x8136C334}, + {0x2155, 0x8136C335}, + {0x2156, 0x8136C336}, + {0x2157, 0x8136C337}, + {0x2158, 0x8136C338}, + {0x2159, 0x8136C339}, + {0x215A, 0x8136C430}, + {0x215B, 0x8136C431}, + {0x215C, 0x8136C432}, + {0x215D, 0x8136C433}, + {0x215E, 0x8136C434}, + {0x215F, 0x8136C435}, + {0x216C, 0x8136C436}, + {0x216D, 0x8136C437}, + {0x216E, 0x8136C438}, + {0x216F, 0x8136C439}, + {0x217A, 0x8136C530}, + {0x217B, 0x8136C531}, + {0x217C, 0x8136C532}, + {0x217D, 0x8136C533}, + {0x217E, 0x8136C534}, + {0x217F, 0x8136C535}, + {0x2180, 0x8136C536}, + {0x2181, 0x8136C537}, + {0x2182, 0x8136C538}, + {0x2183, 0x8136C539}, + {0x2184, 0x8136C630}, + {0x2185, 0x8136C631}, + {0x2186, 0x8136C632}, + {0x2187, 0x8136C633}, + {0x2188, 0x8136C634}, + {0x2189, 0x8136C635}, + {0x218A, 0x8136C636}, + {0x218B, 0x8136C637}, + {0x218C, 0x8136C638}, + {0x218D, 0x8136C639}, + {0x218E, 0x8136C730}, + {0x218F, 0x8136C731}, + {0x2194, 0x8136C732}, + {0x2195, 0x8136C733}, + {0x219A, 0x8136C734}, + {0x219B, 0x8136C735}, + {0x219C, 0x8136C736}, + {0x219D, 0x8136C737}, + {0x219E, 0x8136C738}, + {0x219F, 0x8136C739}, + {0x21A0, 0x8136C830}, + {0x21A1, 0x8136C831}, + {0x21A2, 0x8136C832}, + {0x21A3, 0x8136C833}, + {0x21A4, 0x8136C834}, + {0x21A5, 0x8136C835}, + {0x21A6, 0x8136C836}, + {0x21A7, 0x8136C837}, + {0x21A8, 0x8136C838}, + {0x21A9, 0x8136C839}, + {0x21AA, 0x8136C930}, + {0x21AB, 0x8136C931}, + {0x21AC, 0x8136C932}, + {0x21AD, 0x8136C933}, + {0x21AE, 0x8136C934}, + {0x21AF, 0x8136C935}, + {0x21B0, 0x8136C936}, + {0x21B1, 0x8136C937}, + {0x21B2, 0x8136C938}, + {0x21B3, 0x8136C939}, + {0x21B4, 0x8136CA30}, + {0x21B5, 0x8136CA31}, + {0x21B6, 0x8136CA32}, + {0x21B7, 0x8136CA33}, + {0x21B8, 0x8136CA34}, + {0x21B9, 0x8136CA35}, + {0x21BA, 0x8136CA36}, + {0x21BB, 0x8136CA37}, + {0x21BC, 0x8136CA38}, + {0x21BD, 0x8136CA39}, + {0x21BE, 0x8136CB30}, + {0x21BF, 0x8136CB31}, + {0x21C0, 0x8136CB32}, + {0x21C1, 0x8136CB33}, + {0x21C2, 0x8136CB34}, + {0x21C3, 0x8136CB35}, + {0x21C4, 0x8136CB36}, + {0x21C5, 0x8136CB37}, + {0x21C6, 0x8136CB38}, + {0x21C7, 0x8136CB39}, + {0x21C8, 0x8136CC30}, + {0x21C9, 0x8136CC31}, + {0x21CA, 0x8136CC32}, + {0x21CB, 0x8136CC33}, + {0x21CC, 0x8136CC34}, + {0x21CD, 0x8136CC35}, + {0x21CE, 0x8136CC36}, + {0x21CF, 0x8136CC37}, + {0x21D0, 0x8136CC38}, + {0x21D1, 0x8136CC39}, + {0x21D2, 0x8136CD30}, + {0x21D3, 0x8136CD31}, + {0x21D4, 0x8136CD32}, + {0x21D5, 0x8136CD33}, + {0x21D6, 0x8136CD34}, + {0x21D7, 0x8136CD35}, + {0x21D8, 0x8136CD36}, + {0x21D9, 0x8136CD37}, + {0x21DA, 0x8136CD38}, + {0x21DB, 0x8136CD39}, + {0x21DC, 0x8136CE30}, + {0x21DD, 0x8136CE31}, + {0x21DE, 0x8136CE32}, + {0x21DF, 0x8136CE33}, + {0x21E0, 0x8136CE34}, + {0x21E1, 0x8136CE35}, + {0x21E2, 0x8136CE36}, + {0x21E3, 0x8136CE37}, + {0x21E4, 0x8136CE38}, + {0x21E5, 0x8136CE39}, + {0x21E6, 0x8136CF30}, + {0x21E7, 0x8136CF31}, + {0x21E8, 0x8136CF32}, + {0x21E9, 0x8136CF33}, + {0x21EA, 0x8136CF34}, + {0x21EB, 0x8136CF35}, + {0x21EC, 0x8136CF36}, + {0x21ED, 0x8136CF37}, + {0x21EE, 0x8136CF38}, + {0x21EF, 0x8136CF39}, + {0x21F0, 0x8136D030}, + {0x21F1, 0x8136D031}, + {0x21F2, 0x8136D032}, + {0x21F3, 0x8136D033}, + {0x21F4, 0x8136D034}, + {0x21F5, 0x8136D035}, + {0x21F6, 0x8136D036}, + {0x21F7, 0x8136D037}, + {0x21F8, 0x8136D038}, + {0x21F9, 0x8136D039}, + {0x21FA, 0x8136D130}, + {0x21FB, 0x8136D131}, + {0x21FC, 0x8136D132}, + {0x21FD, 0x8136D133}, + {0x21FE, 0x8136D134}, + {0x21FF, 0x8136D135}, + {0x2200, 0x8136D136}, + {0x2201, 0x8136D137}, + {0x2202, 0x8136D138}, + {0x2203, 0x8136D139}, + {0x2204, 0x8136D230}, + {0x2205, 0x8136D231}, + {0x2206, 0x8136D232}, + {0x2207, 0x8136D233}, + {0x2209, 0x8136D234}, + {0x220A, 0x8136D235}, + {0x220B, 0x8136D236}, + {0x220C, 0x8136D237}, + {0x220D, 0x8136D238}, + {0x220E, 0x8136D239}, + {0x2210, 0x8136D330}, + {0x2212, 0x8136D331}, + {0x2213, 0x8136D332}, + {0x2214, 0x8136D333}, + {0x2216, 0x8136D334}, + {0x2217, 0x8136D335}, + {0x2218, 0x8136D336}, + {0x2219, 0x8136D337}, + {0x221B, 0x8136D338}, + {0x221C, 0x8136D339}, + {0x2221, 0x8136D430}, + {0x2222, 0x8136D431}, + {0x2224, 0x8136D432}, + {0x2226, 0x8136D433}, + {0x222C, 0x8136D434}, + {0x222D, 0x8136D435}, + {0x222F, 0x8136D436}, + {0x2230, 0x8136D437}, + {0x2231, 0x8136D438}, + {0x2232, 0x8136D439}, + {0x2233, 0x8136D530}, + {0x2238, 0x8136D531}, + {0x2239, 0x8136D532}, + {0x223A, 0x8136D533}, + {0x223B, 0x8136D534}, + {0x223C, 0x8136D535}, + {0x223E, 0x8136D536}, + {0x223F, 0x8136D537}, + {0x2240, 0x8136D538}, + {0x2241, 0x8136D539}, + {0x2242, 0x8136D630}, + {0x2243, 0x8136D631}, + {0x2244, 0x8136D632}, + {0x2245, 0x8136D633}, + {0x2246, 0x8136D634}, + {0x2247, 0x8136D635}, + {0x2249, 0x8136D636}, + {0x224A, 0x8136D637}, + {0x224B, 0x8136D638}, + {0x224D, 0x8136D639}, + {0x224E, 0x8136D730}, + {0x224F, 0x8136D731}, + {0x2250, 0x8136D732}, + {0x2251, 0x8136D733}, + {0x2253, 0x8136D734}, + {0x2254, 0x8136D735}, + {0x2255, 0x8136D736}, + {0x2256, 0x8136D737}, + {0x2257, 0x8136D738}, + {0x2258, 0x8136D739}, + {0x2259, 0x8136D830}, + {0x225A, 0x8136D831}, + {0x225B, 0x8136D832}, + {0x225C, 0x8136D833}, + {0x225D, 0x8136D834}, + {0x225E, 0x8136D835}, + {0x225F, 0x8136D836}, + {0x2262, 0x8136D837}, + {0x2263, 0x8136D838}, + {0x2268, 0x8136D839}, + {0x2269, 0x8136D930}, + {0x226A, 0x8136D931}, + {0x226B, 0x8136D932}, + {0x226C, 0x8136D933}, + {0x226D, 0x8136D934}, + {0x2270, 0x8136D935}, + {0x2271, 0x8136D936}, + {0x2272, 0x8136D937}, + {0x2273, 0x8136D938}, + {0x2274, 0x8136D939}, + {0x2275, 0x8136DA30}, + {0x2276, 0x8136DA31}, + {0x2277, 0x8136DA32}, + {0x2278, 0x8136DA33}, + {0x2279, 0x8136DA34}, + {0x227A, 0x8136DA35}, + {0x227B, 0x8136DA36}, + {0x227C, 0x8136DA37}, + {0x227D, 0x8136DA38}, + {0x227E, 0x8136DA39}, + {0x227F, 0x8136DB30}, + {0x2280, 0x8136DB31}, + {0x2281, 0x8136DB32}, + {0x2282, 0x8136DB33}, + {0x2283, 0x8136DB34}, + {0x2284, 0x8136DB35}, + {0x2285, 0x8136DB36}, + {0x2286, 0x8136DB37}, + {0x2287, 0x8136DB38}, + {0x2288, 0x8136DB39}, + {0x2289, 0x8136DC30}, + {0x228A, 0x8136DC31}, + {0x228B, 0x8136DC32}, + {0x228C, 0x8136DC33}, + {0x228D, 0x8136DC34}, + {0x228E, 0x8136DC35}, + {0x228F, 0x8136DC36}, + {0x2290, 0x8136DC37}, + {0x2291, 0x8136DC38}, + {0x2292, 0x8136DC39}, + {0x2293, 0x8136DD30}, + {0x2294, 0x8136DD31}, + {0x2296, 0x8136DD32}, + {0x2297, 0x8136DD33}, + {0x2298, 0x8136DD34}, + {0x229A, 0x8136DD35}, + {0x229B, 0x8136DD36}, + {0x229C, 0x8136DD37}, + {0x229D, 0x8136DD38}, + {0x229E, 0x8136DD39}, + {0x229F, 0x8136DE30}, + {0x22A0, 0x8136DE31}, + {0x22A1, 0x8136DE32}, + {0x22A2, 0x8136DE33}, + {0x22A3, 0x8136DE34}, + {0x22A4, 0x8136DE35}, + {0x22A6, 0x8136DE36}, + {0x22A7, 0x8136DE37}, + {0x22A8, 0x8136DE38}, + {0x22A9, 0x8136DE39}, + {0x22AA, 0x8136DF30}, + {0x22AB, 0x8136DF31}, + {0x22AC, 0x8136DF32}, + {0x22AD, 0x8136DF33}, + {0x22AE, 0x8136DF34}, + {0x22AF, 0x8136DF35}, + {0x22B0, 0x8136DF36}, + {0x22B1, 0x8136DF37}, + {0x22B2, 0x8136DF38}, + {0x22B3, 0x8136DF39}, + {0x22B4, 0x8136E030}, + {0x22B5, 0x8136E031}, + {0x22B6, 0x8136E032}, + {0x22B7, 0x8136E033}, + {0x22B8, 0x8136E034}, + {0x22B9, 0x8136E035}, + {0x22BA, 0x8136E036}, + {0x22BB, 0x8136E037}, + {0x22BC, 0x8136E038}, + {0x22BD, 0x8136E039}, + {0x22BE, 0x8136E130}, + {0x22C0, 0x8136E131}, + {0x22C1, 0x8136E132}, + {0x22C2, 0x8136E133}, + {0x22C3, 0x8136E134}, + {0x22C4, 0x8136E135}, + {0x22C5, 0x8136E136}, + {0x22C6, 0x8136E137}, + {0x22C7, 0x8136E138}, + {0x22C8, 0x8136E139}, + {0x22C9, 0x8136E230}, + {0x22CA, 0x8136E231}, + {0x22CB, 0x8136E232}, + {0x22CC, 0x8136E233}, + {0x22CD, 0x8136E234}, + {0x22CE, 0x8136E235}, + {0x22CF, 0x8136E236}, + {0x22D0, 0x8136E237}, + {0x22D1, 0x8136E238}, + {0x22D2, 0x8136E239}, + {0x22D3, 0x8136E330}, + {0x22D4, 0x8136E331}, + {0x22D5, 0x8136E332}, + {0x22D6, 0x8136E333}, + {0x22D7, 0x8136E334}, + {0x22D8, 0x8136E335}, + {0x22D9, 0x8136E336}, + {0x22DA, 0x8136E337}, + {0x22DB, 0x8136E338}, + {0x22DC, 0x8136E339}, + {0x22DD, 0x8136E430}, + {0x22DE, 0x8136E431}, + {0x22DF, 0x8136E432}, + {0x22E0, 0x8136E433}, + {0x22E1, 0x8136E434}, + {0x22E2, 0x8136E435}, + {0x22E3, 0x8136E436}, + {0x22E4, 0x8136E437}, + {0x22E5, 0x8136E438}, + {0x22E6, 0x8136E439}, + {0x22E7, 0x8136E530}, + {0x22E8, 0x8136E531}, + {0x22E9, 0x8136E532}, + {0x22EA, 0x8136E533}, + {0x22EB, 0x8136E534}, + {0x22EC, 0x8136E535}, + {0x22ED, 0x8136E536}, + {0x22EE, 0x8136E537}, + {0x22EF, 0x8136E538}, + {0x22F0, 0x8136E539}, + {0x22F1, 0x8136E630}, + {0x22F2, 0x8136E631}, + {0x22F3, 0x8136E632}, + {0x22F4, 0x8136E633}, + {0x22F5, 0x8136E634}, + {0x22F6, 0x8136E635}, + {0x22F7, 0x8136E636}, + {0x22F8, 0x8136E637}, + {0x22F9, 0x8136E638}, + {0x22FA, 0x8136E639}, + {0x22FB, 0x8136E730}, + {0x22FC, 0x8136E731}, + {0x22FD, 0x8136E732}, + {0x22FE, 0x8136E733}, + {0x22FF, 0x8136E734}, + {0x2300, 0x8136E735}, + {0x2301, 0x8136E736}, + {0x2302, 0x8136E737}, + {0x2303, 0x8136E738}, + {0x2304, 0x8136E739}, + {0x2305, 0x8136E830}, + {0x2306, 0x8136E831}, + {0x2307, 0x8136E832}, + {0x2308, 0x8136E833}, + {0x2309, 0x8136E834}, + {0x230A, 0x8136E835}, + {0x230B, 0x8136E836}, + {0x230C, 0x8136E837}, + {0x230D, 0x8136E838}, + {0x230E, 0x8136E839}, + {0x230F, 0x8136E930}, + {0x2310, 0x8136E931}, + {0x2311, 0x8136E932}, + {0x2313, 0x8136E933}, + {0x2314, 0x8136E934}, + {0x2315, 0x8136E935}, + {0x2316, 0x8136E936}, + {0x2317, 0x8136E937}, + {0x2318, 0x8136E938}, + {0x2319, 0x8136E939}, + {0x231A, 0x8136EA30}, + {0x231B, 0x8136EA31}, + {0x231C, 0x8136EA32}, + {0x231D, 0x8136EA33}, + {0x231E, 0x8136EA34}, + {0x231F, 0x8136EA35}, + {0x2320, 0x8136EA36}, + {0x2321, 0x8136EA37}, + {0x2322, 0x8136EA38}, + {0x2323, 0x8136EA39}, + {0x2324, 0x8136EB30}, + {0x2325, 0x8136EB31}, + {0x2326, 0x8136EB32}, + {0x2327, 0x8136EB33}, + {0x2328, 0x8136EB34}, + {0x2329, 0x8136EB35}, + {0x232A, 0x8136EB36}, + {0x232B, 0x8136EB37}, + {0x232C, 0x8136EB38}, + {0x232D, 0x8136EB39}, + {0x232E, 0x8136EC30}, + {0x232F, 0x8136EC31}, + {0x2330, 0x8136EC32}, + {0x2331, 0x8136EC33}, + {0x2332, 0x8136EC34}, + {0x2333, 0x8136EC35}, + {0x2334, 0x8136EC36}, + {0x2335, 0x8136EC37}, + {0x2336, 0x8136EC38}, + {0x2337, 0x8136EC39}, + {0x2338, 0x8136ED30}, + {0x2339, 0x8136ED31}, + {0x233A, 0x8136ED32}, + {0x233B, 0x8136ED33}, + {0x233C, 0x8136ED34}, + {0x233D, 0x8136ED35}, + {0x233E, 0x8136ED36}, + {0x233F, 0x8136ED37}, + {0x2340, 0x8136ED38}, + {0x2341, 0x8136ED39}, + {0x2342, 0x8136EE30}, + {0x2343, 0x8136EE31}, + {0x2344, 0x8136EE32}, + {0x2345, 0x8136EE33}, + {0x2346, 0x8136EE34}, + {0x2347, 0x8136EE35}, + {0x2348, 0x8136EE36}, + {0x2349, 0x8136EE37}, + {0x234A, 0x8136EE38}, + {0x234B, 0x8136EE39}, + {0x234C, 0x8136EF30}, + {0x234D, 0x8136EF31}, + {0x234E, 0x8136EF32}, + {0x234F, 0x8136EF33}, + {0x2350, 0x8136EF34}, + {0x2351, 0x8136EF35}, + {0x2352, 0x8136EF36}, + {0x2353, 0x8136EF37}, + {0x2354, 0x8136EF38}, + {0x2355, 0x8136EF39}, + {0x2356, 0x8136F030}, + {0x2357, 0x8136F031}, + {0x2358, 0x8136F032}, + {0x2359, 0x8136F033}, + {0x235A, 0x8136F034}, + {0x235B, 0x8136F035}, + {0x235C, 0x8136F036}, + {0x235D, 0x8136F037}, + {0x235E, 0x8136F038}, + {0x235F, 0x8136F039}, + {0x2360, 0x8136F130}, + {0x2361, 0x8136F131}, + {0x2362, 0x8136F132}, + {0x2363, 0x8136F133}, + {0x2364, 0x8136F134}, + {0x2365, 0x8136F135}, + {0x2366, 0x8136F136}, + {0x2367, 0x8136F137}, + {0x2368, 0x8136F138}, + {0x2369, 0x8136F139}, + {0x236A, 0x8136F230}, + {0x236B, 0x8136F231}, + {0x236C, 0x8136F232}, + {0x236D, 0x8136F233}, + {0x236E, 0x8136F234}, + {0x236F, 0x8136F235}, + {0x2370, 0x8136F236}, + {0x2371, 0x8136F237}, + {0x2372, 0x8136F238}, + {0x2373, 0x8136F239}, + {0x2374, 0x8136F330}, + {0x2375, 0x8136F331}, + {0x2376, 0x8136F332}, + {0x2377, 0x8136F333}, + {0x2378, 0x8136F334}, + {0x2379, 0x8136F335}, + {0x237A, 0x8136F336}, + {0x237B, 0x8136F337}, + {0x237C, 0x8136F338}, + {0x237D, 0x8136F339}, + {0x237E, 0x8136F430}, + {0x237F, 0x8136F431}, + {0x2380, 0x8136F432}, + {0x2381, 0x8136F433}, + {0x2382, 0x8136F434}, + {0x2383, 0x8136F435}, + {0x2384, 0x8136F436}, + {0x2385, 0x8136F437}, + {0x2386, 0x8136F438}, + {0x2387, 0x8136F439}, + {0x2388, 0x8136F530}, + {0x2389, 0x8136F531}, + {0x238A, 0x8136F532}, + {0x238B, 0x8136F533}, + {0x238C, 0x8136F534}, + {0x238D, 0x8136F535}, + {0x238E, 0x8136F536}, + {0x238F, 0x8136F537}, + {0x2390, 0x8136F538}, + {0x2391, 0x8136F539}, + {0x2392, 0x8136F630}, + {0x2393, 0x8136F631}, + {0x2394, 0x8136F632}, + {0x2395, 0x8136F633}, + {0x2396, 0x8136F634}, + {0x2397, 0x8136F635}, + {0x2398, 0x8136F636}, + {0x2399, 0x8136F637}, + {0x239A, 0x8136F638}, + {0x239B, 0x8136F639}, + {0x239C, 0x8136F730}, + {0x239D, 0x8136F731}, + {0x239E, 0x8136F732}, + {0x239F, 0x8136F733}, + {0x23A0, 0x8136F734}, + {0x23A1, 0x8136F735}, + {0x23A2, 0x8136F736}, + {0x23A3, 0x8136F737}, + {0x23A4, 0x8136F738}, + {0x23A5, 0x8136F739}, + {0x23A6, 0x8136F830}, + {0x23A7, 0x8136F831}, + {0x23A8, 0x8136F832}, + {0x23A9, 0x8136F833}, + {0x23AA, 0x8136F834}, + {0x23AB, 0x8136F835}, + {0x23AC, 0x8136F836}, + {0x23AD, 0x8136F837}, + {0x23AE, 0x8136F838}, + {0x23AF, 0x8136F839}, + {0x23B0, 0x8136F930}, + {0x23B1, 0x8136F931}, + {0x23B2, 0x8136F932}, + {0x23B3, 0x8136F933}, + {0x23B4, 0x8136F934}, + {0x23B5, 0x8136F935}, + {0x23B6, 0x8136F936}, + {0x23B7, 0x8136F937}, + {0x23B8, 0x8136F938}, + {0x23B9, 0x8136F939}, + {0x23BA, 0x8136FA30}, + {0x23BB, 0x8136FA31}, + {0x23BC, 0x8136FA32}, + {0x23BD, 0x8136FA33}, + {0x23BE, 0x8136FA34}, + {0x23BF, 0x8136FA35}, + {0x23C0, 0x8136FA36}, + {0x23C1, 0x8136FA37}, + {0x23C2, 0x8136FA38}, + {0x23C3, 0x8136FA39}, + {0x23C4, 0x8136FB30}, + {0x23C5, 0x8136FB31}, + {0x23C6, 0x8136FB32}, + {0x23C7, 0x8136FB33}, + {0x23C8, 0x8136FB34}, + {0x23C9, 0x8136FB35}, + {0x23CA, 0x8136FB36}, + {0x23CB, 0x8136FB37}, + {0x23CC, 0x8136FB38}, + {0x23CD, 0x8136FB39}, + {0x23CE, 0x8136FC30}, + {0x23CF, 0x8136FC31}, + {0x23D0, 0x8136FC32}, + {0x23D1, 0x8136FC33}, + {0x23D2, 0x8136FC34}, + {0x23D3, 0x8136FC35}, + {0x23D4, 0x8136FC36}, + {0x23D5, 0x8136FC37}, + {0x23D6, 0x8136FC38}, + {0x23D7, 0x8136FC39}, + {0x23D8, 0x8136FD30}, + {0x23D9, 0x8136FD31}, + {0x23DA, 0x8136FD32}, + {0x23DB, 0x8136FD33}, + {0x23DC, 0x8136FD34}, + {0x23DD, 0x8136FD35}, + {0x23DE, 0x8136FD36}, + {0x23DF, 0x8136FD37}, + {0x23E0, 0x8136FD38}, + {0x23E1, 0x8136FD39}, + {0x23E2, 0x8136FE30}, + {0x23E3, 0x8136FE31}, + {0x23E4, 0x8136FE32}, + {0x23E5, 0x8136FE33}, + {0x23E6, 0x8136FE34}, + {0x23E7, 0x8136FE35}, + {0x23E8, 0x8136FE36}, + {0x23E9, 0x8136FE37}, + {0x23EA, 0x8136FE38}, + {0x23EB, 0x8136FE39}, + {0x23EC, 0x81378130}, + {0x23ED, 0x81378131}, + {0x23EE, 0x81378132}, + {0x23EF, 0x81378133}, + {0x23F0, 0x81378134}, + {0x23F1, 0x81378135}, + {0x23F2, 0x81378136}, + {0x23F3, 0x81378137}, + {0x23F4, 0x81378138}, + {0x23F5, 0x81378139}, + {0x23F6, 0x81378230}, + {0x23F7, 0x81378231}, + {0x23F8, 0x81378232}, + {0x23F9, 0x81378233}, + {0x23FA, 0x81378234}, + {0x23FB, 0x81378235}, + {0x23FC, 0x81378236}, + {0x23FD, 0x81378237}, + {0x23FE, 0x81378238}, + {0x23FF, 0x81378239}, + {0x2400, 0x81378330}, + {0x2401, 0x81378331}, + {0x2402, 0x81378332}, + {0x2403, 0x81378333}, + {0x2404, 0x81378334}, + {0x2405, 0x81378335}, + {0x2406, 0x81378336}, + {0x2407, 0x81378337}, + {0x2408, 0x81378338}, + {0x2409, 0x81378339}, + {0x240A, 0x81378430}, + {0x240B, 0x81378431}, + {0x240C, 0x81378432}, + {0x240D, 0x81378433}, + {0x240E, 0x81378434}, + {0x240F, 0x81378435}, + {0x2410, 0x81378436}, + {0x2411, 0x81378437}, + {0x2412, 0x81378438}, + {0x2413, 0x81378439}, + {0x2414, 0x81378530}, + {0x2415, 0x81378531}, + {0x2416, 0x81378532}, + {0x2417, 0x81378533}, + {0x2418, 0x81378534}, + {0x2419, 0x81378535}, + {0x241A, 0x81378536}, + {0x241B, 0x81378537}, + {0x241C, 0x81378538}, + {0x241D, 0x81378539}, + {0x241E, 0x81378630}, + {0x241F, 0x81378631}, + {0x2420, 0x81378632}, + {0x2421, 0x81378633}, + {0x2422, 0x81378634}, + {0x2423, 0x81378635}, + {0x2424, 0x81378636}, + {0x2425, 0x81378637}, + {0x2426, 0x81378638}, + {0x2427, 0x81378639}, + {0x2428, 0x81378730}, + {0x2429, 0x81378731}, + {0x242A, 0x81378732}, + {0x242B, 0x81378733}, + {0x242C, 0x81378734}, + {0x242D, 0x81378735}, + {0x242E, 0x81378736}, + {0x242F, 0x81378737}, + {0x2430, 0x81378738}, + {0x2431, 0x81378739}, + {0x2432, 0x81378830}, + {0x2433, 0x81378831}, + {0x2434, 0x81378832}, + {0x2435, 0x81378833}, + {0x2436, 0x81378834}, + {0x2437, 0x81378835}, + {0x2438, 0x81378836}, + {0x2439, 0x81378837}, + {0x243A, 0x81378838}, + {0x243B, 0x81378839}, + {0x243C, 0x81378930}, + {0x243D, 0x81378931}, + {0x243E, 0x81378932}, + {0x243F, 0x81378933}, + {0x2440, 0x81378934}, + {0x2441, 0x81378935}, + {0x2442, 0x81378936}, + {0x2443, 0x81378937}, + {0x2444, 0x81378938}, + {0x2445, 0x81378939}, + {0x2446, 0x81378A30}, + {0x2447, 0x81378A31}, + {0x2448, 0x81378A32}, + {0x2449, 0x81378A33}, + {0x244A, 0x81378A34}, + {0x244B, 0x81378A35}, + {0x244C, 0x81378A36}, + {0x244D, 0x81378A37}, + {0x244E, 0x81378A38}, + {0x244F, 0x81378A39}, + {0x2450, 0x81378B30}, + {0x2451, 0x81378B31}, + {0x2452, 0x81378B32}, + {0x2453, 0x81378B33}, + {0x2454, 0x81378B34}, + {0x2455, 0x81378B35}, + {0x2456, 0x81378B36}, + {0x2457, 0x81378B37}, + {0x2458, 0x81378B38}, + {0x2459, 0x81378B39}, + {0x245A, 0x81378C30}, + {0x245B, 0x81378C31}, + {0x245C, 0x81378C32}, + {0x245D, 0x81378C33}, + {0x245E, 0x81378C34}, + {0x245F, 0x81378C35}, + {0x246A, 0x81378C36}, + {0x246B, 0x81378C37}, + {0x246C, 0x81378C38}, + {0x246D, 0x81378C39}, + {0x246E, 0x81378D30}, + {0x246F, 0x81378D31}, + {0x2470, 0x81378D32}, + {0x2471, 0x81378D33}, + {0x2472, 0x81378D34}, + {0x2473, 0x81378D35}, + {0x249C, 0x81378D36}, + {0x249D, 0x81378D37}, + {0x249E, 0x81378D38}, + {0x249F, 0x81378D39}, + {0x24A0, 0x81378E30}, + {0x24A1, 0x81378E31}, + {0x24A2, 0x81378E32}, + {0x24A3, 0x81378E33}, + {0x24A4, 0x81378E34}, + {0x24A5, 0x81378E35}, + {0x24A6, 0x81378E36}, + {0x24A7, 0x81378E37}, + {0x24A8, 0x81378E38}, + {0x24A9, 0x81378E39}, + {0x24AA, 0x81378F30}, + {0x24AB, 0x81378F31}, + {0x24AC, 0x81378F32}, + {0x24AD, 0x81378F33}, + {0x24AE, 0x81378F34}, + {0x24AF, 0x81378F35}, + {0x24B0, 0x81378F36}, + {0x24B1, 0x81378F37}, + {0x24B2, 0x81378F38}, + {0x24B3, 0x81378F39}, + {0x24B4, 0x81379030}, + {0x24B5, 0x81379031}, + {0x24B6, 0x81379032}, + {0x24B7, 0x81379033}, + {0x24B8, 0x81379034}, + {0x24B9, 0x81379035}, + {0x24BA, 0x81379036}, + {0x24BB, 0x81379037}, + {0x24BC, 0x81379038}, + {0x24BD, 0x81379039}, + {0x24BE, 0x81379130}, + {0x24BF, 0x81379131}, + {0x24C0, 0x81379132}, + {0x24C1, 0x81379133}, + {0x24C2, 0x81379134}, + {0x24C3, 0x81379135}, + {0x24C4, 0x81379136}, + {0x24C5, 0x81379137}, + {0x24C6, 0x81379138}, + {0x24C7, 0x81379139}, + {0x24C8, 0x81379230}, + {0x24C9, 0x81379231}, + {0x24CA, 0x81379232}, + {0x24CB, 0x81379233}, + {0x24CC, 0x81379234}, + {0x24CD, 0x81379235}, + {0x24CE, 0x81379236}, + {0x24CF, 0x81379237}, + {0x24D0, 0x81379238}, + {0x24D1, 0x81379239}, + {0x24D2, 0x81379330}, + {0x24D3, 0x81379331}, + {0x24D4, 0x81379332}, + {0x24D5, 0x81379333}, + {0x24D6, 0x81379334}, + {0x24D7, 0x81379335}, + {0x24D8, 0x81379336}, + {0x24D9, 0x81379337}, + {0x24DA, 0x81379338}, + {0x24DB, 0x81379339}, + {0x24DC, 0x81379430}, + {0x24DD, 0x81379431}, + {0x24DE, 0x81379432}, + {0x24DF, 0x81379433}, + {0x24E0, 0x81379434}, + {0x24E1, 0x81379435}, + {0x24E2, 0x81379436}, + {0x24E3, 0x81379437}, + {0x24E4, 0x81379438}, + {0x24E5, 0x81379439}, + {0x24E6, 0x81379530}, + {0x24E7, 0x81379531}, + {0x24E8, 0x81379532}, + {0x24E9, 0x81379533}, + {0x24EA, 0x81379534}, + {0x24EB, 0x81379535}, + {0x24EC, 0x81379536}, + {0x24ED, 0x81379537}, + {0x24EE, 0x81379538}, + {0x24EF, 0x81379539}, + {0x24F0, 0x81379630}, + {0x24F1, 0x81379631}, + {0x24F2, 0x81379632}, + {0x24F3, 0x81379633}, + {0x24F4, 0x81379634}, + {0x24F5, 0x81379635}, + {0x24F6, 0x81379636}, + {0x24F7, 0x81379637}, + {0x24F8, 0x81379638}, + {0x24F9, 0x81379639}, + {0x24FA, 0x81379730}, + {0x24FB, 0x81379731}, + {0x24FC, 0x81379732}, + {0x24FD, 0x81379733}, + {0x24FE, 0x81379734}, + {0x24FF, 0x81379735}, + {0x254C, 0x81379736}, + {0x254D, 0x81379737}, + {0x254E, 0x81379738}, + {0x254F, 0x81379739}, + {0x2574, 0x81379830}, + {0x2575, 0x81379831}, + {0x2576, 0x81379832}, + {0x2577, 0x81379833}, + {0x2578, 0x81379834}, + {0x2579, 0x81379835}, + {0x257A, 0x81379836}, + {0x257B, 0x81379837}, + {0x257C, 0x81379838}, + {0x257D, 0x81379839}, + {0x257E, 0x81379930}, + {0x257F, 0x81379931}, + {0x2580, 0x81379932}, + {0x2590, 0x81379933}, + {0x2591, 0x81379934}, + {0x2592, 0x81379935}, + {0x2596, 0x81379936}, + {0x2597, 0x81379937}, + {0x2598, 0x81379938}, + {0x2599, 0x81379939}, + {0x259A, 0x81379A30}, + {0x259B, 0x81379A31}, + {0x259C, 0x81379A32}, + {0x259D, 0x81379A33}, + {0x259E, 0x81379A34}, + {0x259F, 0x81379A35}, + {0x25A2, 0x81379A36}, + {0x25A3, 0x81379A37}, + {0x25A4, 0x81379A38}, + {0x25A5, 0x81379A39}, + {0x25A6, 0x81379B30}, + {0x25A7, 0x81379B31}, + {0x25A8, 0x81379B32}, + {0x25A9, 0x81379B33}, + {0x25AA, 0x81379B34}, + {0x25AB, 0x81379B35}, + {0x25AC, 0x81379B36}, + {0x25AD, 0x81379B37}, + {0x25AE, 0x81379B38}, + {0x25AF, 0x81379B39}, + {0x25B0, 0x81379C30}, + {0x25B1, 0x81379C31}, + {0x25B4, 0x81379C32}, + {0x25B5, 0x81379C33}, + {0x25B6, 0x81379C34}, + {0x25B7, 0x81379C35}, + {0x25B8, 0x81379C36}, + {0x25B9, 0x81379C37}, + {0x25BA, 0x81379C38}, + {0x25BB, 0x81379C39}, + {0x25BE, 0x81379D30}, + {0x25BF, 0x81379D31}, + {0x25C0, 0x81379D32}, + {0x25C1, 0x81379D33}, + {0x25C2, 0x81379D34}, + {0x25C3, 0x81379D35}, + {0x25C4, 0x81379D36}, + {0x25C5, 0x81379D37}, + {0x25C8, 0x81379D38}, + {0x25C9, 0x81379D39}, + {0x25CA, 0x81379E30}, + {0x25CC, 0x81379E31}, + {0x25CD, 0x81379E32}, + {0x25D0, 0x81379E33}, + {0x25D1, 0x81379E34}, + {0x25D2, 0x81379E35}, + {0x25D3, 0x81379E36}, + {0x25D4, 0x81379E37}, + {0x25D5, 0x81379E38}, + {0x25D6, 0x81379E39}, + {0x25D7, 0x81379F30}, + {0x25D8, 0x81379F31}, + {0x25D9, 0x81379F32}, + {0x25DA, 0x81379F33}, + {0x25DB, 0x81379F34}, + {0x25DC, 0x81379F35}, + {0x25DD, 0x81379F36}, + {0x25DE, 0x81379F37}, + {0x25DF, 0x81379F38}, + {0x25E0, 0x81379F39}, + {0x25E1, 0x8137A030}, + {0x25E6, 0x8137A031}, + {0x25E7, 0x8137A032}, + {0x25E8, 0x8137A033}, + {0x25E9, 0x8137A034}, + {0x25EA, 0x8137A035}, + {0x25EB, 0x8137A036}, + {0x25EC, 0x8137A037}, + {0x25ED, 0x8137A038}, + {0x25EE, 0x8137A039}, + {0x25EF, 0x8137A130}, + {0x25F0, 0x8137A131}, + {0x25F1, 0x8137A132}, + {0x25F2, 0x8137A133}, + {0x25F3, 0x8137A134}, + {0x25F4, 0x8137A135}, + {0x25F5, 0x8137A136}, + {0x25F6, 0x8137A137}, + {0x25F7, 0x8137A138}, + {0x25F8, 0x8137A139}, + {0x25F9, 0x8137A230}, + {0x25FA, 0x8137A231}, + {0x25FB, 0x8137A232}, + {0x25FC, 0x8137A233}, + {0x25FD, 0x8137A234}, + {0x25FE, 0x8137A235}, + {0x25FF, 0x8137A236}, + {0x2600, 0x8137A237}, + {0x2601, 0x8137A238}, + {0x2602, 0x8137A239}, + {0x2603, 0x8137A330}, + {0x2604, 0x8137A331}, + {0x2607, 0x8137A332}, + {0x2608, 0x8137A333}, + {0x260A, 0x8137A334}, + {0x260B, 0x8137A335}, + {0x260C, 0x8137A336}, + {0x260D, 0x8137A337}, + {0x260E, 0x8137A338}, + {0x260F, 0x8137A339}, + {0x2610, 0x8137A430}, + {0x2611, 0x8137A431}, + {0x2612, 0x8137A432}, + {0x2613, 0x8137A433}, + {0x2614, 0x8137A434}, + {0x2615, 0x8137A435}, + {0x2616, 0x8137A436}, + {0x2617, 0x8137A437}, + {0x2618, 0x8137A438}, + {0x2619, 0x8137A439}, + {0x261A, 0x8137A530}, + {0x261B, 0x8137A531}, + {0x261C, 0x8137A532}, + {0x261D, 0x8137A533}, + {0x261E, 0x8137A534}, + {0x261F, 0x8137A535}, + {0x2620, 0x8137A536}, + {0x2621, 0x8137A537}, + {0x2622, 0x8137A538}, + {0x2623, 0x8137A539}, + {0x2624, 0x8137A630}, + {0x2625, 0x8137A631}, + {0x2626, 0x8137A632}, + {0x2627, 0x8137A633}, + {0x2628, 0x8137A634}, + {0x2629, 0x8137A635}, + {0x262A, 0x8137A636}, + {0x262B, 0x8137A637}, + {0x262C, 0x8137A638}, + {0x262D, 0x8137A639}, + {0x262E, 0x8137A730}, + {0x262F, 0x8137A731}, + {0x2630, 0x8137A732}, + {0x2631, 0x8137A733}, + {0x2632, 0x8137A734}, + {0x2633, 0x8137A735}, + {0x2634, 0x8137A736}, + {0x2635, 0x8137A737}, + {0x2636, 0x8137A738}, + {0x2637, 0x8137A739}, + {0x2638, 0x8137A830}, + {0x2639, 0x8137A831}, + {0x263A, 0x8137A832}, + {0x263B, 0x8137A833}, + {0x263C, 0x8137A834}, + {0x263D, 0x8137A835}, + {0x263E, 0x8137A836}, + {0x263F, 0x8137A837}, + {0x2641, 0x8137A838}, + {0x2E82, 0x8138FD39}, + {0x2E83, 0x8138FE30}, + {0x2E85, 0x8138FE31}, + {0x2E86, 0x8138FE32}, + {0x2E87, 0x8138FE33}, + {0x2E89, 0x8138FE34}, + {0x2E8A, 0x8138FE35}, + {0x2E8D, 0x8138FE36}, + {0x2E8E, 0x8138FE37}, + {0x2E8F, 0x8138FE38}, + {0x2E90, 0x8138FE39}, + {0x2E91, 0x81398130}, + {0x2E92, 0x81398131}, + {0x2E93, 0x81398132}, + {0x2E94, 0x81398133}, + {0x2E95, 0x81398134}, + {0x2E96, 0x81398135}, + {0x2E98, 0x81398136}, + {0x2E99, 0x81398137}, + {0x2E9A, 0x81398138}, + {0x2E9B, 0x81398139}, + {0x2E9C, 0x81398230}, + {0x2E9D, 0x81398231}, + {0x2E9E, 0x81398232}, + {0x2E9F, 0x81398233}, + {0x2EA0, 0x81398234}, + {0x2EA1, 0x81398235}, + {0x2EA2, 0x81398236}, + {0x2EA3, 0x81398237}, + {0x2EA4, 0x81398238}, + {0x2EA5, 0x81398239}, + {0x2EA6, 0x81398330}, + {0x2EA8, 0x81398331}, + {0x2EA9, 0x81398332}, + {0x2EAB, 0x81398333}, + {0x2EAC, 0x81398334}, + {0x2EAD, 0x81398335}, + {0x2EAF, 0x81398336}, + {0x2EB0, 0x81398337}, + {0x2EB1, 0x81398338}, + {0x2EB2, 0x81398339}, + {0x2EB4, 0x81398430}, + {0x2EB5, 0x81398431}, + {0x2EB8, 0x81398432}, + {0x2EB9, 0x81398433}, + {0x2EBA, 0x81398434}, + {0x2EBC, 0x81398435}, + {0x2EBD, 0x81398436}, + {0x2EBE, 0x81398437}, + {0x2EBF, 0x81398438}, + {0x2EC0, 0x81398439}, + {0x2EC1, 0x81398530}, + {0x2EC2, 0x81398531}, + {0x2EC3, 0x81398532}, + {0x2EC4, 0x81398533}, + {0x2EC5, 0x81398534}, + {0x2EC6, 0x81398535}, + {0x2EC7, 0x81398536}, + {0x2EC8, 0x81398537}, + {0x2EC9, 0x81398538}, + {0x2ECB, 0x81398539}, + {0x2ECC, 0x81398630}, + {0x2ECD, 0x81398631}, + {0x2ECE, 0x81398632}, + {0x2ECF, 0x81398633}, + {0x2ED0, 0x81398634}, + {0x2ED1, 0x81398635}, + {0x2ED2, 0x81398636}, + {0x2ED3, 0x81398637}, + {0x2ED4, 0x81398638}, + {0x2ED5, 0x81398639}, + {0x2ED6, 0x81398730}, + {0x2ED7, 0x81398731}, + {0x2ED8, 0x81398732}, + {0x2ED9, 0x81398733}, + {0x2EDA, 0x81398734}, + {0x2EDB, 0x81398735}, + {0x2EDC, 0x81398736}, + {0x2EDD, 0x81398737}, + {0x2EDE, 0x81398738}, + {0x2EDF, 0x81398739}, + {0x2EE0, 0x81398830}, + {0x2EE1, 0x81398831}, + {0x2EE2, 0x81398832}, + {0x2EE3, 0x81398833}, + {0x2EE4, 0x81398834}, + {0x2EE5, 0x81398835}, + {0x2EE6, 0x81398836}, + {0x2EE7, 0x81398837}, + {0x2EE8, 0x81398838}, + {0x2EE9, 0x81398839}, + {0x2EEA, 0x81398930}, + {0x2EEB, 0x81398931}, + {0x2EEC, 0x81398932}, + {0x2EED, 0x81398933}, + {0x2EEE, 0x81398934}, + {0x2EEF, 0x81398935}, + {0x2EF0, 0x81398936}, + {0x2EF1, 0x81398937}, + {0x2EF2, 0x81398938}, + {0x2EF3, 0x81398939}, + {0x2EF4, 0x81398A30}, + {0x2EF5, 0x81398A31}, + {0x2EF6, 0x81398A32}, + {0x2EF7, 0x81398A33}, + {0x2EF8, 0x81398A34}, + {0x2EF9, 0x81398A35}, + {0x2EFA, 0x81398A36}, + {0x2EFB, 0x81398A37}, + {0x2EFC, 0x81398A38}, + {0x2EFD, 0x81398A39}, + {0x2EFE, 0x81398B30}, + {0x2EFF, 0x81398B31}, + {0x2F00, 0x81398B32}, + {0x2F01, 0x81398B33}, + {0x2F02, 0x81398B34}, + {0x2F03, 0x81398B35}, + {0x2F04, 0x81398B36}, + {0x2F05, 0x81398B37}, + {0x2F06, 0x81398B38}, + {0x2F07, 0x81398B39}, + {0x2F08, 0x81398C30}, + {0x2F09, 0x81398C31}, + {0x2F0A, 0x81398C32}, + {0x2F0B, 0x81398C33}, + {0x2F0C, 0x81398C34}, + {0x2F0D, 0x81398C35}, + {0x2F0E, 0x81398C36}, + {0x2F0F, 0x81398C37}, + {0x2F10, 0x81398C38}, + {0x2F11, 0x81398C39}, + {0x2F12, 0x81398D30}, + {0x2F13, 0x81398D31}, + {0x2F14, 0x81398D32}, + {0x2F15, 0x81398D33}, + {0x2F16, 0x81398D34}, + {0x2F17, 0x81398D35}, + {0x2F18, 0x81398D36}, + {0x2F19, 0x81398D37}, + {0x2F1A, 0x81398D38}, + {0x2F1B, 0x81398D39}, + {0x2F1C, 0x81398E30}, + {0x2F1D, 0x81398E31}, + {0x2F1E, 0x81398E32}, + {0x2F1F, 0x81398E33}, + {0x2F20, 0x81398E34}, + {0x2F21, 0x81398E35}, + {0x2F22, 0x81398E36}, + {0x2F23, 0x81398E37}, + {0x2F24, 0x81398E38}, + {0x2F25, 0x81398E39}, + {0x2F26, 0x81398F30}, + {0x2F27, 0x81398F31}, + {0x2F28, 0x81398F32}, + {0x2F29, 0x81398F33}, + {0x2F2A, 0x81398F34}, + {0x2F2B, 0x81398F35}, + {0x2F2C, 0x81398F36}, + {0x2F2D, 0x81398F37}, + {0x2F2E, 0x81398F38}, + {0x2F2F, 0x81398F39}, + {0x2F30, 0x81399030}, + {0x2F31, 0x81399031}, + {0x2F32, 0x81399032}, + {0x2F33, 0x81399033}, + {0x2F34, 0x81399034}, + {0x2F35, 0x81399035}, + {0x2F36, 0x81399036}, + {0x2F37, 0x81399037}, + {0x2F38, 0x81399038}, + {0x2F39, 0x81399039}, + {0x2F3A, 0x81399130}, + {0x2F3B, 0x81399131}, + {0x2F3C, 0x81399132}, + {0x2F3D, 0x81399133}, + {0x2F3E, 0x81399134}, + {0x2F3F, 0x81399135}, + {0x2F40, 0x81399136}, + {0x2F41, 0x81399137}, + {0x2F42, 0x81399138}, + {0x2F43, 0x81399139}, + {0x2F44, 0x81399230}, + {0x2F45, 0x81399231}, + {0x2F46, 0x81399232}, + {0x2F47, 0x81399233}, + {0x2F48, 0x81399234}, + {0x2F49, 0x81399235}, + {0x2F4A, 0x81399236}, + {0x2F4B, 0x81399237}, + {0x2F4C, 0x81399238}, + {0x2F4D, 0x81399239}, + {0x2F4E, 0x81399330}, + {0x2F4F, 0x81399331}, + {0x2F50, 0x81399332}, + {0x2F51, 0x81399333}, + {0x2F52, 0x81399334}, + {0x2F53, 0x81399335}, + {0x2F54, 0x81399336}, + {0x2F55, 0x81399337}, + {0x2F56, 0x81399338}, + {0x2F57, 0x81399339}, + {0x2F58, 0x81399430}, + {0x2F59, 0x81399431}, + {0x2F5A, 0x81399432}, + {0x2F5B, 0x81399433}, + {0x2F5C, 0x81399434}, + {0x2F5D, 0x81399435}, + {0x2F5E, 0x81399436}, + {0x2F5F, 0x81399437}, + {0x2F60, 0x81399438}, + {0x2F61, 0x81399439}, + {0x2F62, 0x81399530}, + {0x2F63, 0x81399531}, + {0x2F64, 0x81399532}, + {0x2F65, 0x81399533}, + {0x2F66, 0x81399534}, + {0x2F67, 0x81399535}, + {0x2F68, 0x81399536}, + {0x2F69, 0x81399537}, + {0x2F6A, 0x81399538}, + {0x2F6B, 0x81399539}, + {0x2F6C, 0x81399630}, + {0x2F6D, 0x81399631}, + {0x2F6E, 0x81399632}, + {0x2F6F, 0x81399633}, + {0x2F70, 0x81399634}, + {0x2F71, 0x81399635}, + {0x2F72, 0x81399636}, + {0x2F73, 0x81399637}, + {0x2F74, 0x81399638}, + {0x2F75, 0x81399639}, + {0x2F76, 0x81399730}, + {0x2F77, 0x81399731}, + {0x2F78, 0x81399732}, + {0x2F79, 0x81399733}, + {0x2F7A, 0x81399734}, + {0x2F7B, 0x81399735}, + {0x2F7C, 0x81399736}, + {0x2F7D, 0x81399737}, + {0x2F7E, 0x81399738}, + {0x2F7F, 0x81399739}, + {0x2F80, 0x81399830}, + {0x2F81, 0x81399831}, + {0x2F82, 0x81399832}, + {0x2F83, 0x81399833}, + {0x2F84, 0x81399834}, + {0x2F85, 0x81399835}, + {0x2F86, 0x81399836}, + {0x2F87, 0x81399837}, + {0x2F88, 0x81399838}, + {0x2F89, 0x81399839}, + {0x2F8A, 0x81399930}, + {0x2F8B, 0x81399931}, + {0x2F8C, 0x81399932}, + {0x2F8D, 0x81399933}, + {0x2F8E, 0x81399934}, + {0x2F8F, 0x81399935}, + {0x2F90, 0x81399936}, + {0x2F91, 0x81399937}, + {0x2F92, 0x81399938}, + {0x2F93, 0x81399939}, + {0x2F94, 0x81399A30}, + {0x2F95, 0x81399A31}, + {0x2F96, 0x81399A32}, + {0x2F97, 0x81399A33}, + {0x2F98, 0x81399A34}, + {0x2F99, 0x81399A35}, + {0x2F9A, 0x81399A36}, + {0x2F9B, 0x81399A37}, + {0x2F9C, 0x81399A38}, + {0x2F9D, 0x81399A39}, + {0x2F9E, 0x81399B30}, + {0x2F9F, 0x81399B31}, + {0x2FA0, 0x81399B32}, + {0x2FA1, 0x81399B33}, + {0x2FA2, 0x81399B34}, + {0x2FA3, 0x81399B35}, + {0x2FA4, 0x81399B36}, + {0x2FA5, 0x81399B37}, + {0x2FA6, 0x81399B38}, + {0x2FA7, 0x81399B39}, + {0x2FA8, 0x81399C30}, + {0x2FA9, 0x81399C31}, + {0x2FAA, 0x81399C32}, + {0x2FAB, 0x81399C33}, + {0x2FAC, 0x81399C34}, + {0x2FAD, 0x81399C35}, + {0x2FAE, 0x81399C36}, + {0x2FAF, 0x81399C37}, + {0x2FB0, 0x81399C38}, + {0x2FB1, 0x81399C39}, + {0x2FB2, 0x81399D30}, + {0x2FB3, 0x81399D31}, + {0x2FB4, 0x81399D32}, + {0x2FB5, 0x81399D33}, + {0x2FB6, 0x81399D34}, + {0x2FB7, 0x81399D35}, + {0x2FB8, 0x81399D36}, + {0x2FB9, 0x81399D37}, + {0x2FBA, 0x81399D38}, + {0x2FBB, 0x81399D39}, + {0x2FBC, 0x81399E30}, + {0x2FBD, 0x81399E31}, + {0x2FBE, 0x81399E32}, + {0x2FBF, 0x81399E33}, + {0x2FC0, 0x81399E34}, + {0x2FC1, 0x81399E35}, + {0x2FC2, 0x81399E36}, + {0x2FC3, 0x81399E37}, + {0x2FC4, 0x81399E38}, + {0x2FC5, 0x81399E39}, + {0x2FC6, 0x81399F30}, + {0x2FC7, 0x81399F31}, + {0x2FC8, 0x81399F32}, + {0x2FC9, 0x81399F33}, + {0x2FCA, 0x81399F34}, + {0x2FCB, 0x81399F35}, + {0x2FCC, 0x81399F36}, + {0x2FCD, 0x81399F37}, + {0x2FCE, 0x81399F38}, + {0x2FCF, 0x81399F39}, + {0x2FD0, 0x8139A030}, + {0x2FD1, 0x8139A031}, + {0x2FD2, 0x8139A032}, + {0x2FD3, 0x8139A033}, + {0x2FD4, 0x8139A034}, + {0x2FD5, 0x8139A035}, + {0x2FD6, 0x8139A036}, + {0x2FD7, 0x8139A037}, + {0x2FD8, 0x8139A038}, + {0x2FD9, 0x8139A039}, + {0x2FDA, 0x8139A130}, + {0x2FDB, 0x8139A131}, + {0x2FDC, 0x8139A132}, + {0x2FDD, 0x8139A133}, + {0x2FDE, 0x8139A134}, + {0x2FDF, 0x8139A135}, + {0x2FE0, 0x8139A136}, + {0x2FE1, 0x8139A137}, + {0x2FE2, 0x8139A138}, + {0x2FE3, 0x8139A139}, + {0x2FE4, 0x8139A230}, + {0x2FE5, 0x8139A231}, + {0x2FE6, 0x8139A232}, + {0x2FE7, 0x8139A233}, + {0x2FE8, 0x8139A234}, + {0x2FE9, 0x8139A235}, + {0x2FEA, 0x8139A236}, + {0x2FEB, 0x8139A237}, + {0x2FEC, 0x8139A238}, + {0x2FED, 0x8139A239}, + {0x2FEE, 0x8139A330}, + {0x2FEF, 0x8139A331}, + {0x2FFC, 0x8139A332}, + {0x2FFD, 0x8139A333}, + {0x2FFE, 0x8139A334}, + {0x2FFF, 0x8139A335}, + {0x3004, 0x8139A336}, + {0x3018, 0x8139A337}, + {0x3019, 0x8139A338}, + {0x301A, 0x8139A339}, + {0x301B, 0x8139A430}, + {0x301C, 0x8139A431}, + {0x301F, 0x8139A432}, + {0x3020, 0x8139A433}, + {0x302A, 0x8139A434}, + {0x302B, 0x8139A435}, + {0x302C, 0x8139A436}, + {0x302D, 0x8139A437}, + {0x302E, 0x8139A438}, + {0x302F, 0x8139A439}, + {0x3030, 0x8139A530}, + {0x3031, 0x8139A531}, + {0x3032, 0x8139A532}, + {0x3033, 0x8139A533}, + {0x3034, 0x8139A534}, + {0x3035, 0x8139A535}, + {0x3036, 0x8139A536}, + {0x3037, 0x8139A537}, + {0x3038, 0x8139A538}, + {0x3039, 0x8139A539}, + {0x303A, 0x8139A630}, + {0x303B, 0x8139A631}, + {0x303C, 0x8139A632}, + {0x303D, 0x8139A633}, + {0x303F, 0x8139A634}, + {0x3040, 0x8139A635}, + {0x3094, 0x8139A636}, + {0x3095, 0x8139A637}, + {0x3096, 0x8139A638}, + {0x3097, 0x8139A639}, + {0x3098, 0x8139A730}, + {0x3099, 0x8139A731}, + {0x309A, 0x8139A732}, + {0x309F, 0x8139A733}, + {0x30A0, 0x8139A734}, + {0x30F7, 0x8139A735}, + {0x30F8, 0x8139A736}, + {0x30F9, 0x8139A737}, + {0x30FA, 0x8139A738}, + {0x30FB, 0x8139A739}, + {0x30FF, 0x8139A830}, + {0x3100, 0x8139A831}, + {0x3101, 0x8139A832}, + {0x3102, 0x8139A833}, + {0x3103, 0x8139A834}, + {0x3104, 0x8139A835}, + {0x312A, 0x8139A836}, + {0x312B, 0x8139A837}, + {0x312C, 0x8139A838}, + {0x312D, 0x8139A839}, + {0x312E, 0x8139A930}, + {0x312F, 0x8139A931}, + {0x3130, 0x8139A932}, + {0x3131, 0x8139A933}, + {0x3132, 0x8139A934}, + {0x3133, 0x8139A935}, + {0x3134, 0x8139A936}, + {0x3135, 0x8139A937}, + {0x3136, 0x8139A938}, + {0x3137, 0x8139A939}, + {0x3138, 0x8139AA30}, + {0x3139, 0x8139AA31}, + {0x313A, 0x8139AA32}, + {0x313B, 0x8139AA33}, + {0x313C, 0x8139AA34}, + {0x313D, 0x8139AA35}, + {0x313E, 0x8139AA36}, + {0x313F, 0x8139AA37}, + {0x3140, 0x8139AA38}, + {0x3141, 0x8139AA39}, + {0x3142, 0x8139AB30}, + {0x3143, 0x8139AB31}, + {0x3144, 0x8139AB32}, + {0x3145, 0x8139AB33}, + {0x3146, 0x8139AB34}, + {0x3147, 0x8139AB35}, + {0x3148, 0x8139AB36}, + {0x3149, 0x8139AB37}, + {0x314A, 0x8139AB38}, + {0x314B, 0x8139AB39}, + {0x314C, 0x8139AC30}, + {0x314D, 0x8139AC31}, + {0x314E, 0x8139AC32}, + {0x314F, 0x8139AC33}, + {0x3150, 0x8139AC34}, + {0x3151, 0x8139AC35}, + {0x3152, 0x8139AC36}, + {0x3153, 0x8139AC37}, + {0x3154, 0x8139AC38}, + {0x3155, 0x8139AC39}, + {0x3156, 0x8139AD30}, + {0x3157, 0x8139AD31}, + {0x3158, 0x8139AD32}, + {0x3159, 0x8139AD33}, + {0x315A, 0x8139AD34}, + {0x315B, 0x8139AD35}, + {0x315C, 0x8139AD36}, + {0x315D, 0x8139AD37}, + {0x315E, 0x8139AD38}, + {0x315F, 0x8139AD39}, + {0x3160, 0x8139AE30}, + {0x3161, 0x8139AE31}, + {0x3162, 0x8139AE32}, + {0x3163, 0x8139AE33}, + {0x3164, 0x8139AE34}, + {0x3165, 0x8139AE35}, + {0x3166, 0x8139AE36}, + {0x3167, 0x8139AE37}, + {0x3168, 0x8139AE38}, + {0x3169, 0x8139AE39}, + {0x316A, 0x8139AF30}, + {0x316B, 0x8139AF31}, + {0x316C, 0x8139AF32}, + {0x316D, 0x8139AF33}, + {0x316E, 0x8139AF34}, + {0x316F, 0x8139AF35}, + {0x3170, 0x8139AF36}, + {0x3171, 0x8139AF37}, + {0x3172, 0x8139AF38}, + {0x3173, 0x8139AF39}, + {0x3174, 0x8139B030}, + {0x3175, 0x8139B031}, + {0x3176, 0x8139B032}, + {0x3177, 0x8139B033}, + {0x3178, 0x8139B034}, + {0x3179, 0x8139B035}, + {0x317A, 0x8139B036}, + {0x317B, 0x8139B037}, + {0x317C, 0x8139B038}, + {0x317D, 0x8139B039}, + {0x317E, 0x8139B130}, + {0x317F, 0x8139B131}, + {0x3180, 0x8139B132}, + {0x3181, 0x8139B133}, + {0x3182, 0x8139B134}, + {0x3183, 0x8139B135}, + {0x3184, 0x8139B136}, + {0x3185, 0x8139B137}, + {0x3186, 0x8139B138}, + {0x3187, 0x8139B139}, + {0x3188, 0x8139B230}, + {0x3189, 0x8139B231}, + {0x318A, 0x8139B232}, + {0x318B, 0x8139B233}, + {0x318C, 0x8139B234}, + {0x318D, 0x8139B235}, + {0x318E, 0x8139B236}, + {0x318F, 0x8139B237}, + {0x3190, 0x8139B238}, + {0x3191, 0x8139B239}, + {0x3192, 0x8139B330}, + {0x3193, 0x8139B331}, + {0x3194, 0x8139B332}, + {0x3195, 0x8139B333}, + {0x3196, 0x8139B334}, + {0x3197, 0x8139B335}, + {0x3198, 0x8139B336}, + {0x3199, 0x8139B337}, + {0x319A, 0x8139B338}, + {0x319B, 0x8139B339}, + {0x319C, 0x8139B430}, + {0x319D, 0x8139B431}, + {0x319E, 0x8139B432}, + {0x319F, 0x8139B433}, + {0x31A0, 0x8139B434}, + {0x31A1, 0x8139B435}, + {0x31A2, 0x8139B436}, + {0x31A3, 0x8139B437}, + {0x31A4, 0x8139B438}, + {0x31A5, 0x8139B439}, + {0x31A6, 0x8139B530}, + {0x31A7, 0x8139B531}, + {0x31A8, 0x8139B532}, + {0x31A9, 0x8139B533}, + {0x31AA, 0x8139B534}, + {0x31AB, 0x8139B535}, + {0x31AC, 0x8139B536}, + {0x31AD, 0x8139B537}, + {0x31AE, 0x8139B538}, + {0x31AF, 0x8139B539}, + {0x31B0, 0x8139B630}, + {0x31B1, 0x8139B631}, + {0x31B2, 0x8139B632}, + {0x31B3, 0x8139B633}, + {0x31B4, 0x8139B634}, + {0x31B5, 0x8139B635}, + {0x31B6, 0x8139B636}, + {0x31B7, 0x8139B637}, + {0x31B8, 0x8139B638}, + {0x31B9, 0x8139B639}, + {0x31BA, 0x8139B730}, + {0x31BB, 0x8139B731}, + {0x31BC, 0x8139B732}, + {0x31BD, 0x8139B733}, + {0x31BE, 0x8139B734}, + {0x31BF, 0x8139B735}, + {0x31C0, 0x8139B736}, + {0x31C1, 0x8139B737}, + {0x31C2, 0x8139B738}, + {0x31C3, 0x8139B739}, + {0x31C4, 0x8139B830}, + {0x31C5, 0x8139B831}, + {0x31C6, 0x8139B832}, + {0x31C7, 0x8139B833}, + {0x31C8, 0x8139B834}, + {0x31C9, 0x8139B835}, + {0x31CA, 0x8139B836}, + {0x31CB, 0x8139B837}, + {0x31CC, 0x8139B838}, + {0x31CD, 0x8139B839}, + {0x31CE, 0x8139B930}, + {0x31CF, 0x8139B931}, + {0x31D0, 0x8139B932}, + {0x31D1, 0x8139B933}, + {0x31D2, 0x8139B934}, + {0x31D3, 0x8139B935}, + {0x31D4, 0x8139B936}, + {0x31D5, 0x8139B937}, + {0x31D6, 0x8139B938}, + {0x31D7, 0x8139B939}, + {0x31D8, 0x8139BA30}, + {0x31D9, 0x8139BA31}, + {0x31DA, 0x8139BA32}, + {0x31DB, 0x8139BA33}, + {0x31DC, 0x8139BA34}, + {0x31DD, 0x8139BA35}, + {0x31DE, 0x8139BA36}, + {0x31DF, 0x8139BA37}, + {0x31E0, 0x8139BA38}, + {0x31E1, 0x8139BA39}, + {0x31E2, 0x8139BB30}, + {0x31E3, 0x8139BB31}, + {0x31E4, 0x8139BB32}, + {0x31E5, 0x8139BB33}, + {0x31E6, 0x8139BB34}, + {0x31E7, 0x8139BB35}, + {0x31E8, 0x8139BB36}, + {0x31E9, 0x8139BB37}, + {0x31EA, 0x8139BB38}, + {0x31EB, 0x8139BB39}, + {0x31EC, 0x8139BC30}, + {0x31ED, 0x8139BC31}, + {0x31EE, 0x8139BC32}, + {0x31EF, 0x8139BC33}, + {0x31F0, 0x8139BC34}, + {0x31F1, 0x8139BC35}, + {0x31F2, 0x8139BC36}, + {0x31F3, 0x8139BC37}, + {0x31F4, 0x8139BC38}, + {0x31F5, 0x8139BC39}, + {0x31F6, 0x8139BD30}, + {0x31F7, 0x8139BD31}, + {0x31F8, 0x8139BD32}, + {0x31F9, 0x8139BD33}, + {0x31FA, 0x8139BD34}, + {0x31FB, 0x8139BD35}, + {0x31FC, 0x8139BD36}, + {0x31FD, 0x8139BD37}, + {0x31FE, 0x8139BD38}, + {0x31FF, 0x8139BD39}, + {0x3200, 0x8139BE30}, + {0x3201, 0x8139BE31}, + {0x3202, 0x8139BE32}, + {0x3203, 0x8139BE33}, + {0x3204, 0x8139BE34}, + {0x3205, 0x8139BE35}, + {0x3206, 0x8139BE36}, + {0x3207, 0x8139BE37}, + {0x3208, 0x8139BE38}, + {0x3209, 0x8139BE39}, + {0x320A, 0x8139BF30}, + {0x320B, 0x8139BF31}, + {0x320C, 0x8139BF32}, + {0x320D, 0x8139BF33}, + {0x320E, 0x8139BF34}, + {0x320F, 0x8139BF35}, + {0x3210, 0x8139BF36}, + {0x3211, 0x8139BF37}, + {0x3212, 0x8139BF38}, + {0x3213, 0x8139BF39}, + {0x3214, 0x8139C030}, + {0x3215, 0x8139C031}, + {0x3216, 0x8139C032}, + {0x3217, 0x8139C033}, + {0x3218, 0x8139C034}, + {0x3219, 0x8139C035}, + {0x321A, 0x8139C036}, + {0x321B, 0x8139C037}, + {0x321C, 0x8139C038}, + {0x321D, 0x8139C039}, + {0x321E, 0x8139C130}, + {0x321F, 0x8139C131}, + {0x322A, 0x8139C132}, + {0x322B, 0x8139C133}, + {0x322C, 0x8139C134}, + {0x322D, 0x8139C135}, + {0x322E, 0x8139C136}, + {0x322F, 0x8139C137}, + {0x3230, 0x8139C138}, + {0x3232, 0x8139C139}, + {0x3233, 0x8139C230}, + {0x3234, 0x8139C231}, + {0x3235, 0x8139C232}, + {0x3236, 0x8139C233}, + {0x3237, 0x8139C234}, + {0x3238, 0x8139C235}, + {0x3239, 0x8139C236}, + {0x323A, 0x8139C237}, + {0x323B, 0x8139C238}, + {0x323C, 0x8139C239}, + {0x323D, 0x8139C330}, + {0x323E, 0x8139C331}, + {0x323F, 0x8139C332}, + {0x3240, 0x8139C333}, + {0x3241, 0x8139C334}, + {0x3242, 0x8139C335}, + {0x3243, 0x8139C336}, + {0x3244, 0x8139C337}, + {0x3245, 0x8139C338}, + {0x3246, 0x8139C339}, + {0x3247, 0x8139C430}, + {0x3248, 0x8139C431}, + {0x3249, 0x8139C432}, + {0x324A, 0x8139C433}, + {0x324B, 0x8139C434}, + {0x324C, 0x8139C435}, + {0x324D, 0x8139C436}, + {0x324E, 0x8139C437}, + {0x324F, 0x8139C438}, + {0x3250, 0x8139C439}, + {0x3251, 0x8139C530}, + {0x3252, 0x8139C531}, + {0x3253, 0x8139C532}, + {0x3254, 0x8139C533}, + {0x3255, 0x8139C534}, + {0x3256, 0x8139C535}, + {0x3257, 0x8139C536}, + {0x3258, 0x8139C537}, + {0x3259, 0x8139C538}, + {0x325A, 0x8139C539}, + {0x325B, 0x8139C630}, + {0x325C, 0x8139C631}, + {0x325D, 0x8139C632}, + {0x325E, 0x8139C633}, + {0x325F, 0x8139C634}, + {0x3260, 0x8139C635}, + {0x3261, 0x8139C636}, + {0x3262, 0x8139C637}, + {0x3263, 0x8139C638}, + {0x3264, 0x8139C639}, + {0x3265, 0x8139C730}, + {0x3266, 0x8139C731}, + {0x3267, 0x8139C732}, + {0x3268, 0x8139C733}, + {0x3269, 0x8139C734}, + {0x326A, 0x8139C735}, + {0x326B, 0x8139C736}, + {0x326C, 0x8139C737}, + {0x326D, 0x8139C738}, + {0x326E, 0x8139C739}, + {0x326F, 0x8139C830}, + {0x3270, 0x8139C831}, + {0x3271, 0x8139C832}, + {0x3272, 0x8139C833}, + {0x3273, 0x8139C834}, + {0x3274, 0x8139C835}, + {0x3275, 0x8139C836}, + {0x3276, 0x8139C837}, + {0x3277, 0x8139C838}, + {0x3278, 0x8139C839}, + {0x3279, 0x8139C930}, + {0x327A, 0x8139C931}, + {0x327B, 0x8139C932}, + {0x327C, 0x8139C933}, + {0x327D, 0x8139C934}, + {0x327E, 0x8139C935}, + {0x327F, 0x8139C936}, + {0x3280, 0x8139C937}, + {0x3281, 0x8139C938}, + {0x3282, 0x8139C939}, + {0x3283, 0x8139CA30}, + {0x3284, 0x8139CA31}, + {0x3285, 0x8139CA32}, + {0x3286, 0x8139CA33}, + {0x3287, 0x8139CA34}, + {0x3288, 0x8139CA35}, + {0x3289, 0x8139CA36}, + {0x328A, 0x8139CA37}, + {0x328B, 0x8139CA38}, + {0x328C, 0x8139CA39}, + {0x328D, 0x8139CB30}, + {0x328E, 0x8139CB31}, + {0x328F, 0x8139CB32}, + {0x3290, 0x8139CB33}, + {0x3291, 0x8139CB34}, + {0x3292, 0x8139CB35}, + {0x3293, 0x8139CB36}, + {0x3294, 0x8139CB37}, + {0x3295, 0x8139CB38}, + {0x3296, 0x8139CB39}, + {0x3297, 0x8139CC30}, + {0x3298, 0x8139CC31}, + {0x3299, 0x8139CC32}, + {0x329A, 0x8139CC33}, + {0x329B, 0x8139CC34}, + {0x329C, 0x8139CC35}, + {0x329D, 0x8139CC36}, + {0x329E, 0x8139CC37}, + {0x329F, 0x8139CC38}, + {0x32A0, 0x8139CC39}, + {0x32A1, 0x8139CD30}, + {0x32A2, 0x8139CD31}, + {0x32A4, 0x8139CD32}, + {0x32A5, 0x8139CD33}, + {0x32A6, 0x8139CD34}, + {0x32A7, 0x8139CD35}, + {0x32A8, 0x8139CD36}, + {0x32A9, 0x8139CD37}, + {0x32AA, 0x8139CD38}, + {0x32AB, 0x8139CD39}, + {0x32AC, 0x8139CE30}, + {0x32AD, 0x8139CE31}, + {0x32AE, 0x8139CE32}, + {0x32AF, 0x8139CE33}, + {0x32B0, 0x8139CE34}, + {0x32B1, 0x8139CE35}, + {0x32B2, 0x8139CE36}, + {0x32B3, 0x8139CE37}, + {0x32B4, 0x8139CE38}, + {0x32B5, 0x8139CE39}, + {0x32B6, 0x8139CF30}, + {0x32B7, 0x8139CF31}, + {0x32B8, 0x8139CF32}, + {0x32B9, 0x8139CF33}, + {0x32BA, 0x8139CF34}, + {0x32BB, 0x8139CF35}, + {0x32BC, 0x8139CF36}, + {0x32BD, 0x8139CF37}, + {0x32BE, 0x8139CF38}, + {0x32BF, 0x8139CF39}, + {0x32C0, 0x8139D030}, + {0x32C1, 0x8139D031}, + {0x32C2, 0x8139D032}, + {0x32C3, 0x8139D033}, + {0x32C4, 0x8139D034}, + {0x32C5, 0x8139D035}, + {0x32C6, 0x8139D036}, + {0x32C7, 0x8139D037}, + {0x32C8, 0x8139D038}, + {0x32C9, 0x8139D039}, + {0x32CA, 0x8139D130}, + {0x32CB, 0x8139D131}, + {0x32CC, 0x8139D132}, + {0x32CD, 0x8139D133}, + {0x32CE, 0x8139D134}, + {0x32CF, 0x8139D135}, + {0x32D0, 0x8139D136}, + {0x32D1, 0x8139D137}, + {0x32D2, 0x8139D138}, + {0x32D3, 0x8139D139}, + {0x32D4, 0x8139D230}, + {0x32D5, 0x8139D231}, + {0x32D6, 0x8139D232}, + {0x32D7, 0x8139D233}, + {0x32D8, 0x8139D234}, + {0x32D9, 0x8139D235}, + {0x32DA, 0x8139D236}, + {0x32DB, 0x8139D237}, + {0x32DC, 0x8139D238}, + {0x32DD, 0x8139D239}, + {0x32DE, 0x8139D330}, + {0x32DF, 0x8139D331}, + {0x32E0, 0x8139D332}, + {0x32E1, 0x8139D333}, + {0x32E2, 0x8139D334}, + {0x32E3, 0x8139D335}, + {0x32E4, 0x8139D336}, + {0x32E5, 0x8139D337}, + {0x32E6, 0x8139D338}, + {0x32E7, 0x8139D339}, + {0x32E8, 0x8139D430}, + {0x32E9, 0x8139D431}, + {0x32EA, 0x8139D432}, + {0x32EB, 0x8139D433}, + {0x32EC, 0x8139D434}, + {0x32ED, 0x8139D435}, + {0x32EE, 0x8139D436}, + {0x32EF, 0x8139D437}, + {0x32F0, 0x8139D438}, + {0x32F1, 0x8139D439}, + {0x32F2, 0x8139D530}, + {0x32F3, 0x8139D531}, + {0x32F4, 0x8139D532}, + {0x32F5, 0x8139D533}, + {0x32F6, 0x8139D534}, + {0x32F7, 0x8139D535}, + {0x32F8, 0x8139D536}, + {0x32F9, 0x8139D537}, + {0x32FA, 0x8139D538}, + {0x32FB, 0x8139D539}, + {0x32FC, 0x8139D630}, + {0x32FD, 0x8139D631}, + {0x32FE, 0x8139D632}, + {0x32FF, 0x8139D633}, + {0x3300, 0x8139D634}, + {0x3301, 0x8139D635}, + {0x3302, 0x8139D636}, + {0x3303, 0x8139D637}, + {0x3304, 0x8139D638}, + {0x3305, 0x8139D639}, + {0x3306, 0x8139D730}, + {0x3307, 0x8139D731}, + {0x3308, 0x8139D732}, + {0x3309, 0x8139D733}, + {0x330A, 0x8139D734}, + {0x330B, 0x8139D735}, + {0x330C, 0x8139D736}, + {0x330D, 0x8139D737}, + {0x330E, 0x8139D738}, + {0x330F, 0x8139D739}, + {0x3310, 0x8139D830}, + {0x3311, 0x8139D831}, + {0x3312, 0x8139D832}, + {0x3313, 0x8139D833}, + {0x3314, 0x8139D834}, + {0x3315, 0x8139D835}, + {0x3316, 0x8139D836}, + {0x3317, 0x8139D837}, + {0x3318, 0x8139D838}, + {0x3319, 0x8139D839}, + {0x331A, 0x8139D930}, + {0x331B, 0x8139D931}, + {0x331C, 0x8139D932}, + {0x331D, 0x8139D933}, + {0x331E, 0x8139D934}, + {0x331F, 0x8139D935}, + {0x3320, 0x8139D936}, + {0x3321, 0x8139D937}, + {0x3322, 0x8139D938}, + {0x3323, 0x8139D939}, + {0x3324, 0x8139DA30}, + {0x3325, 0x8139DA31}, + {0x3326, 0x8139DA32}, + {0x3327, 0x8139DA33}, + {0x3328, 0x8139DA34}, + {0x3329, 0x8139DA35}, + {0x332A, 0x8139DA36}, + {0x332B, 0x8139DA37}, + {0x332C, 0x8139DA38}, + {0x332D, 0x8139DA39}, + {0x332E, 0x8139DB30}, + {0x332F, 0x8139DB31}, + {0x3330, 0x8139DB32}, + {0x3331, 0x8139DB33}, + {0x3332, 0x8139DB34}, + {0x3333, 0x8139DB35}, + {0x3334, 0x8139DB36}, + {0x3335, 0x8139DB37}, + {0x3336, 0x8139DB38}, + {0x3337, 0x8139DB39}, + {0x3338, 0x8139DC30}, + {0x3339, 0x8139DC31}, + {0x333A, 0x8139DC32}, + {0x333B, 0x8139DC33}, + {0x333C, 0x8139DC34}, + {0x333D, 0x8139DC35}, + {0x333E, 0x8139DC36}, + {0x333F, 0x8139DC37}, + {0x3340, 0x8139DC38}, + {0x3341, 0x8139DC39}, + {0x3342, 0x8139DD30}, + {0x3343, 0x8139DD31}, + {0x3344, 0x8139DD32}, + {0x3345, 0x8139DD33}, + {0x3346, 0x8139DD34}, + {0x3347, 0x8139DD35}, + {0x3348, 0x8139DD36}, + {0x3349, 0x8139DD37}, + {0x334A, 0x8139DD38}, + {0x334B, 0x8139DD39}, + {0x334C, 0x8139DE30}, + {0x334D, 0x8139DE31}, + {0x334E, 0x8139DE32}, + {0x334F, 0x8139DE33}, + {0x3350, 0x8139DE34}, + {0x3351, 0x8139DE35}, + {0x3352, 0x8139DE36}, + {0x3353, 0x8139DE37}, + {0x3354, 0x8139DE38}, + {0x3355, 0x8139DE39}, + {0x3356, 0x8139DF30}, + {0x3357, 0x8139DF31}, + {0x3358, 0x8139DF32}, + {0x3359, 0x8139DF33}, + {0x335A, 0x8139DF34}, + {0x335B, 0x8139DF35}, + {0x335C, 0x8139DF36}, + {0x335D, 0x8139DF37}, + {0x335E, 0x8139DF38}, + {0x335F, 0x8139DF39}, + {0x3360, 0x8139E030}, + {0x3361, 0x8139E031}, + {0x3362, 0x8139E032}, + {0x3363, 0x8139E033}, + {0x3364, 0x8139E034}, + {0x3365, 0x8139E035}, + {0x3366, 0x8139E036}, + {0x3367, 0x8139E037}, + {0x3368, 0x8139E038}, + {0x3369, 0x8139E039}, + {0x336A, 0x8139E130}, + {0x336B, 0x8139E131}, + {0x336C, 0x8139E132}, + {0x336D, 0x8139E133}, + {0x336E, 0x8139E134}, + {0x336F, 0x8139E135}, + {0x3370, 0x8139E136}, + {0x3371, 0x8139E137}, + {0x3372, 0x8139E138}, + {0x3373, 0x8139E139}, + {0x3374, 0x8139E230}, + {0x3375, 0x8139E231}, + {0x3376, 0x8139E232}, + {0x3377, 0x8139E233}, + {0x3378, 0x8139E234}, + {0x3379, 0x8139E235}, + {0x337A, 0x8139E236}, + {0x337B, 0x8139E237}, + {0x337C, 0x8139E238}, + {0x337D, 0x8139E239}, + {0x337E, 0x8139E330}, + {0x337F, 0x8139E331}, + {0x3380, 0x8139E332}, + {0x3381, 0x8139E333}, + {0x3382, 0x8139E334}, + {0x3383, 0x8139E335}, + {0x3384, 0x8139E336}, + {0x3385, 0x8139E337}, + {0x3386, 0x8139E338}, + {0x3387, 0x8139E339}, + {0x3388, 0x8139E430}, + {0x3389, 0x8139E431}, + {0x338A, 0x8139E432}, + {0x338B, 0x8139E433}, + {0x338C, 0x8139E434}, + {0x338D, 0x8139E435}, + {0x3390, 0x8139E436}, + {0x3391, 0x8139E437}, + {0x3392, 0x8139E438}, + {0x3393, 0x8139E439}, + {0x3394, 0x8139E530}, + {0x3395, 0x8139E531}, + {0x3396, 0x8139E532}, + {0x3397, 0x8139E533}, + {0x3398, 0x8139E534}, + {0x3399, 0x8139E535}, + {0x339A, 0x8139E536}, + {0x339B, 0x8139E537}, + {0x339F, 0x8139E538}, + {0x33A0, 0x8139E539}, + {0x33A2, 0x8139E630}, + {0x33A3, 0x8139E631}, + {0x33A4, 0x8139E632}, + {0x33A5, 0x8139E633}, + {0x33A6, 0x8139E634}, + {0x33A7, 0x8139E635}, + {0x33A8, 0x8139E636}, + {0x33A9, 0x8139E637}, + {0x33AA, 0x8139E638}, + {0x33AB, 0x8139E639}, + {0x33AC, 0x8139E730}, + {0x33AD, 0x8139E731}, + {0x33AE, 0x8139E732}, + {0x33AF, 0x8139E733}, + {0x33B0, 0x8139E734}, + {0x33B1, 0x8139E735}, + {0x33B2, 0x8139E736}, + {0x33B3, 0x8139E737}, + {0x33B4, 0x8139E738}, + {0x33B5, 0x8139E739}, + {0x33B6, 0x8139E830}, + {0x33B7, 0x8139E831}, + {0x33B8, 0x8139E832}, + {0x33B9, 0x8139E833}, + {0x33BA, 0x8139E834}, + {0x33BB, 0x8139E835}, + {0x33BC, 0x8139E836}, + {0x33BD, 0x8139E837}, + {0x33BE, 0x8139E838}, + {0x33BF, 0x8139E839}, + {0x33C0, 0x8139E930}, + {0x33C1, 0x8139E931}, + {0x33C2, 0x8139E932}, + {0x33C3, 0x8139E933}, + {0x33C5, 0x8139E934}, + {0x33C6, 0x8139E935}, + {0x33C7, 0x8139E936}, + {0x33C8, 0x8139E937}, + {0x33C9, 0x8139E938}, + {0x33CA, 0x8139E939}, + {0x33CB, 0x8139EA30}, + {0x33CC, 0x8139EA31}, + {0x33CD, 0x8139EA32}, + {0x33CF, 0x8139EA33}, + {0x33D0, 0x8139EA34}, + {0x33D3, 0x8139EA35}, + {0x33D4, 0x8139EA36}, + {0x33D6, 0x8139EA37}, + {0x33D7, 0x8139EA38}, + {0x33D8, 0x8139EA39}, + {0x33D9, 0x8139EB30}, + {0x33DA, 0x8139EB31}, + {0x33DB, 0x8139EB32}, + {0x33DC, 0x8139EB33}, + {0x33DD, 0x8139EB34}, + {0x33DE, 0x8139EB35}, + {0x33DF, 0x8139EB36}, + {0x33E0, 0x8139EB37}, + {0x33E1, 0x8139EB38}, + {0x33E2, 0x8139EB39}, + {0x33E3, 0x8139EC30}, + {0x33E4, 0x8139EC31}, + {0x33E5, 0x8139EC32}, + {0x33E6, 0x8139EC33}, + {0x33E7, 0x8139EC34}, + {0x33E8, 0x8139EC35}, + {0x33E9, 0x8139EC36}, + {0x33EA, 0x8139EC37}, + {0x33EB, 0x8139EC38}, + {0x33EC, 0x8139EC39}, + {0x33ED, 0x8139ED30}, + {0x33EE, 0x8139ED31}, + {0x33EF, 0x8139ED32}, + {0x33F0, 0x8139ED33}, + {0x33F1, 0x8139ED34}, + {0x33F2, 0x8139ED35}, + {0x33F3, 0x8139ED36}, + {0x33F4, 0x8139ED37}, + {0x33F5, 0x8139ED38}, + {0x33F6, 0x8139ED39}, + {0x33F7, 0x8139EE30}, + {0x33F8, 0x8139EE31}, + {0x33F9, 0x8139EE32}, + {0x33FA, 0x8139EE33}, + {0x33FB, 0x8139EE34}, + {0x33FC, 0x8139EE35}, + {0x33FD, 0x8139EE36}, + {0x33FE, 0x8139EE37}, + {0x33FF, 0x8139EE38}, + {0x3400, 0x8139EE39}, + {0x3401, 0x8139EF30}, + {0x3402, 0x8139EF31}, + {0x3403, 0x8139EF32}, + {0x3404, 0x8139EF33}, + {0x3405, 0x8139EF34}, + {0x3406, 0x8139EF35}, + {0x3407, 0x8139EF36}, + {0x3408, 0x8139EF37}, + {0x3409, 0x8139EF38}, + {0x340A, 0x8139EF39}, + {0x340B, 0x8139F030}, + {0x340C, 0x8139F031}, + {0x340D, 0x8139F032}, + {0x340E, 0x8139F033}, + {0x340F, 0x8139F034}, + {0x3410, 0x8139F035}, + {0x3411, 0x8139F036}, + {0x3412, 0x8139F037}, + {0x3413, 0x8139F038}, + {0x3414, 0x8139F039}, + {0x3415, 0x8139F130}, + {0x3416, 0x8139F131}, + {0x3417, 0x8139F132}, + {0x3418, 0x8139F133}, + {0x3419, 0x8139F134}, + {0x341A, 0x8139F135}, + {0x341B, 0x8139F136}, + {0x341C, 0x8139F137}, + {0x341D, 0x8139F138}, + {0x341E, 0x8139F139}, + {0x341F, 0x8139F230}, + {0x3420, 0x8139F231}, + {0x3421, 0x8139F232}, + {0x3422, 0x8139F233}, + {0x3423, 0x8139F234}, + {0x3424, 0x8139F235}, + {0x3425, 0x8139F236}, + {0x3426, 0x8139F237}, + {0x3427, 0x8139F238}, + {0x3428, 0x8139F239}, + {0x3429, 0x8139F330}, + {0x342A, 0x8139F331}, + {0x342B, 0x8139F332}, + {0x342C, 0x8139F333}, + {0x342D, 0x8139F334}, + {0x342E, 0x8139F335}, + {0x342F, 0x8139F336}, + {0x3430, 0x8139F337}, + {0x3431, 0x8139F338}, + {0x3432, 0x8139F339}, + {0x3433, 0x8139F430}, + {0x3434, 0x8139F431}, + {0x3435, 0x8139F432}, + {0x3436, 0x8139F433}, + {0x3437, 0x8139F434}, + {0x3438, 0x8139F435}, + {0x3439, 0x8139F436}, + {0x343A, 0x8139F437}, + {0x343B, 0x8139F438}, + {0x343C, 0x8139F439}, + {0x343D, 0x8139F530}, + {0x343E, 0x8139F531}, + {0x343F, 0x8139F532}, + {0x3440, 0x8139F533}, + {0x3441, 0x8139F534}, + {0x3442, 0x8139F535}, + {0x3443, 0x8139F536}, + {0x3444, 0x8139F537}, + {0x3445, 0x8139F538}, + {0x3446, 0x8139F539}, + {0x3448, 0x8139F630}, + {0x3449, 0x8139F631}, + {0x344A, 0x8139F632}, + {0x344B, 0x8139F633}, + {0x344C, 0x8139F634}, + {0x344D, 0x8139F635}, + {0x344E, 0x8139F636}, + {0x344F, 0x8139F637}, + {0x3450, 0x8139F638}, + {0x3451, 0x8139F639}, + {0x3452, 0x8139F730}, + {0x3453, 0x8139F731}, + {0x3454, 0x8139F732}, + {0x3455, 0x8139F733}, + {0x3456, 0x8139F734}, + {0x3457, 0x8139F735}, + {0x3458, 0x8139F736}, + {0x3459, 0x8139F737}, + {0x345A, 0x8139F738}, + {0x345B, 0x8139F739}, + {0x345C, 0x8139F830}, + {0x345D, 0x8139F831}, + {0x345E, 0x8139F832}, + {0x345F, 0x8139F833}, + {0x3460, 0x8139F834}, + {0x3461, 0x8139F835}, + {0x3462, 0x8139F836}, + {0x3463, 0x8139F837}, + {0x3464, 0x8139F838}, + {0x3465, 0x8139F839}, + {0x3466, 0x8139F930}, + {0x3467, 0x8139F931}, + {0x3468, 0x8139F932}, + {0x3469, 0x8139F933}, + {0x346A, 0x8139F934}, + {0x346B, 0x8139F935}, + {0x346C, 0x8139F936}, + {0x346D, 0x8139F937}, + {0x346E, 0x8139F938}, + {0x346F, 0x8139F939}, + {0x3470, 0x8139FA30}, + {0x3471, 0x8139FA31}, + {0x3472, 0x8139FA32}, + {0x3474, 0x8139FA33}, + {0x3475, 0x8139FA34}, + {0x3476, 0x8139FA35}, + {0x3477, 0x8139FA36}, + {0x3478, 0x8139FA37}, + {0x3479, 0x8139FA38}, + {0x347A, 0x8139FA39}, + {0x347B, 0x8139FB30}, + {0x347C, 0x8139FB31}, + {0x347D, 0x8139FB32}, + {0x347E, 0x8139FB33}, + {0x347F, 0x8139FB34}, + {0x3480, 0x8139FB35}, + {0x3481, 0x8139FB36}, + {0x3482, 0x8139FB37}, + {0x3483, 0x8139FB38}, + {0x3484, 0x8139FB39}, + {0x3485, 0x8139FC30}, + {0x3486, 0x8139FC31}, + {0x3487, 0x8139FC32}, + {0x3488, 0x8139FC33}, + {0x3489, 0x8139FC34}, + {0x348A, 0x8139FC35}, + {0x348B, 0x8139FC36}, + {0x348C, 0x8139FC37}, + {0x348D, 0x8139FC38}, + {0x348E, 0x8139FC39}, + {0x348F, 0x8139FD30}, + {0x3490, 0x8139FD31}, + {0x3491, 0x8139FD32}, + {0x3492, 0x8139FD33}, + {0x3493, 0x8139FD34}, + {0x3494, 0x8139FD35}, + {0x3495, 0x8139FD36}, + {0x3496, 0x8139FD37}, + {0x3497, 0x8139FD38}, + {0x3498, 0x8139FD39}, + {0x3499, 0x8139FE30}, + {0x349A, 0x8139FE31}, + {0x349B, 0x8139FE32}, + {0x349C, 0x8139FE33}, + {0x349D, 0x8139FE34}, + {0x349E, 0x8139FE35}, + {0x349F, 0x8139FE36}, + {0x34A0, 0x8139FE37}, + {0x34A1, 0x8139FE38}, + {0x34A2, 0x8139FE39}, + {0x34A3, 0x82308130}, + {0x34A4, 0x82308131}, + {0x34A5, 0x82308132}, + {0x34A6, 0x82308133}, + {0x34A7, 0x82308134}, + {0x34A8, 0x82308135}, + {0x34A9, 0x82308136}, + {0x34AA, 0x82308137}, + {0x34AB, 0x82308138}, + {0x34AC, 0x82308139}, + {0x34AD, 0x82308230}, + {0x34AE, 0x82308231}, + {0x34AF, 0x82308232}, + {0x34B0, 0x82308233}, + {0x34B1, 0x82308234}, + {0x34B2, 0x82308235}, + {0x34B3, 0x82308236}, + {0x34B4, 0x82308237}, + {0x34B5, 0x82308238}, + {0x34B6, 0x82308239}, + {0x34B7, 0x82308330}, + {0x34B8, 0x82308331}, + {0x34B9, 0x82308332}, + {0x34BA, 0x82308333}, + {0x34BB, 0x82308334}, + {0x34BC, 0x82308335}, + {0x34BD, 0x82308336}, + {0x34BE, 0x82308337}, + {0x34BF, 0x82308338}, + {0x34C0, 0x82308339}, + {0x34C1, 0x82308430}, + {0x34C2, 0x82308431}, + {0x34C3, 0x82308432}, + {0x34C4, 0x82308433}, + {0x34C5, 0x82308434}, + {0x34C6, 0x82308435}, + {0x34C7, 0x82308436}, + {0x34C8, 0x82308437}, + {0x34C9, 0x82308438}, + {0x34CA, 0x82308439}, + {0x34CB, 0x82308530}, + {0x34CC, 0x82308531}, + {0x34CD, 0x82308532}, + {0x34CE, 0x82308533}, + {0x34CF, 0x82308534}, + {0x34D0, 0x82308535}, + {0x34D1, 0x82308536}, + {0x34D2, 0x82308537}, + {0x34D3, 0x82308538}, + {0x34D4, 0x82308539}, + {0x34D5, 0x82308630}, + {0x34D6, 0x82308631}, + {0x34D7, 0x82308632}, + {0x34D8, 0x82308633}, + {0x34D9, 0x82308634}, + {0x34DA, 0x82308635}, + {0x34DB, 0x82308636}, + {0x34DC, 0x82308637}, + {0x34DD, 0x82308638}, + {0x34DE, 0x82308639}, + {0x34DF, 0x82308730}, + {0x34E0, 0x82308731}, + {0x34E1, 0x82308732}, + {0x34E2, 0x82308733}, + {0x34E3, 0x82308734}, + {0x34E4, 0x82308735}, + {0x34E5, 0x82308736}, + {0x34E6, 0x82308737}, + {0x34E7, 0x82308738}, + {0x34E8, 0x82308739}, + {0x34E9, 0x82308830}, + {0x34EA, 0x82308831}, + {0x34EB, 0x82308832}, + {0x34EC, 0x82308833}, + {0x34ED, 0x82308834}, + {0x34EE, 0x82308835}, + {0x34EF, 0x82308836}, + {0x34F0, 0x82308837}, + {0x34F1, 0x82308838}, + {0x34F2, 0x82308839}, + {0x34F3, 0x82308930}, + {0x34F4, 0x82308931}, + {0x34F5, 0x82308932}, + {0x34F6, 0x82308933}, + {0x34F7, 0x82308934}, + {0x34F8, 0x82308935}, + {0x34F9, 0x82308936}, + {0x34FA, 0x82308937}, + {0x34FB, 0x82308938}, + {0x34FC, 0x82308939}, + {0x34FD, 0x82308A30}, + {0x34FE, 0x82308A31}, + {0x34FF, 0x82308A32}, + {0x3500, 0x82308A33}, + {0x3501, 0x82308A34}, + {0x3502, 0x82308A35}, + {0x3503, 0x82308A36}, + {0x3504, 0x82308A37}, + {0x3505, 0x82308A38}, + {0x3506, 0x82308A39}, + {0x3507, 0x82308B30}, + {0x3508, 0x82308B31}, + {0x3509, 0x82308B32}, + {0x350A, 0x82308B33}, + {0x350B, 0x82308B34}, + {0x350C, 0x82308B35}, + {0x350D, 0x82308B36}, + {0x350E, 0x82308B37}, + {0x350F, 0x82308B38}, + {0x3510, 0x82308B39}, + {0x3511, 0x82308C30}, + {0x3512, 0x82308C31}, + {0x3513, 0x82308C32}, + {0x3514, 0x82308C33}, + {0x3515, 0x82308C34}, + {0x3516, 0x82308C35}, + {0x3517, 0x82308C36}, + {0x3518, 0x82308C37}, + {0x3519, 0x82308C38}, + {0x351A, 0x82308C39}, + {0x351B, 0x82308D30}, + {0x351C, 0x82308D31}, + {0x351D, 0x82308D32}, + {0x351E, 0x82308D33}, + {0x351F, 0x82308D34}, + {0x3520, 0x82308D35}, + {0x3521, 0x82308D36}, + {0x3522, 0x82308D37}, + {0x3523, 0x82308D38}, + {0x3524, 0x82308D39}, + {0x3525, 0x82308E30}, + {0x3526, 0x82308E31}, + {0x3527, 0x82308E32}, + {0x3528, 0x82308E33}, + {0x3529, 0x82308E34}, + {0x352A, 0x82308E35}, + {0x352B, 0x82308E36}, + {0x352C, 0x82308E37}, + {0x352D, 0x82308E38}, + {0x352E, 0x82308E39}, + {0x352F, 0x82308F30}, + {0x3530, 0x82308F31}, + {0x3531, 0x82308F32}, + {0x3532, 0x82308F33}, + {0x3533, 0x82308F34}, + {0x3534, 0x82308F35}, + {0x3535, 0x82308F36}, + {0x3536, 0x82308F37}, + {0x3537, 0x82308F38}, + {0x3538, 0x82308F39}, + {0x3539, 0x82309030}, + {0x353A, 0x82309031}, + {0x353B, 0x82309032}, + {0x353C, 0x82309033}, + {0x353D, 0x82309034}, + {0x353E, 0x82309035}, + {0x353F, 0x82309036}, + {0x3540, 0x82309037}, + {0x3541, 0x82309038}, + {0x3542, 0x82309039}, + {0x3543, 0x82309130}, + {0x3544, 0x82309131}, + {0x3545, 0x82309132}, + {0x3546, 0x82309133}, + {0x3547, 0x82309134}, + {0x3548, 0x82309135}, + {0x3549, 0x82309136}, + {0x354A, 0x82309137}, + {0x354B, 0x82309138}, + {0x354C, 0x82309139}, + {0x354D, 0x82309230}, + {0x354E, 0x82309231}, + {0x354F, 0x82309232}, + {0x3550, 0x82309233}, + {0x3551, 0x82309234}, + {0x3552, 0x82309235}, + {0x3553, 0x82309236}, + {0x3554, 0x82309237}, + {0x3555, 0x82309238}, + {0x3556, 0x82309239}, + {0x3557, 0x82309330}, + {0x3558, 0x82309331}, + {0x3559, 0x82309332}, + {0x355A, 0x82309333}, + {0x355B, 0x82309334}, + {0x355C, 0x82309335}, + {0x355D, 0x82309336}, + {0x355E, 0x82309337}, + {0x355F, 0x82309338}, + {0x3560, 0x82309339}, + {0x3561, 0x82309430}, + {0x3562, 0x82309431}, + {0x3563, 0x82309432}, + {0x3564, 0x82309433}, + {0x3565, 0x82309434}, + {0x3566, 0x82309435}, + {0x3567, 0x82309436}, + {0x3568, 0x82309437}, + {0x3569, 0x82309438}, + {0x356A, 0x82309439}, + {0x356B, 0x82309530}, + {0x356C, 0x82309531}, + {0x356D, 0x82309532}, + {0x356E, 0x82309533}, + {0x356F, 0x82309534}, + {0x3570, 0x82309535}, + {0x3571, 0x82309536}, + {0x3572, 0x82309537}, + {0x3573, 0x82309538}, + {0x3574, 0x82309539}, + {0x3575, 0x82309630}, + {0x3576, 0x82309631}, + {0x3577, 0x82309632}, + {0x3578, 0x82309633}, + {0x3579, 0x82309634}, + {0x357A, 0x82309635}, + {0x357B, 0x82309636}, + {0x357C, 0x82309637}, + {0x357D, 0x82309638}, + {0x357E, 0x82309639}, + {0x357F, 0x82309730}, + {0x3580, 0x82309731}, + {0x3581, 0x82309732}, + {0x3582, 0x82309733}, + {0x3583, 0x82309734}, + {0x3584, 0x82309735}, + {0x3585, 0x82309736}, + {0x3586, 0x82309737}, + {0x3587, 0x82309738}, + {0x3588, 0x82309739}, + {0x3589, 0x82309830}, + {0x358A, 0x82309831}, + {0x358B, 0x82309832}, + {0x358C, 0x82309833}, + {0x358D, 0x82309834}, + {0x358E, 0x82309835}, + {0x358F, 0x82309836}, + {0x3590, 0x82309837}, + {0x3591, 0x82309838}, + {0x3592, 0x82309839}, + {0x3593, 0x82309930}, + {0x3594, 0x82309931}, + {0x3595, 0x82309932}, + {0x3596, 0x82309933}, + {0x3597, 0x82309934}, + {0x3598, 0x82309935}, + {0x3599, 0x82309936}, + {0x359A, 0x82309937}, + {0x359B, 0x82309938}, + {0x359C, 0x82309939}, + {0x359D, 0x82309A30}, + {0x359F, 0x82309A31}, + {0x35A0, 0x82309A32}, + {0x35A1, 0x82309A33}, + {0x35A2, 0x82309A34}, + {0x35A3, 0x82309A35}, + {0x35A4, 0x82309A36}, + {0x35A5, 0x82309A37}, + {0x35A6, 0x82309A38}, + {0x35A7, 0x82309A39}, + {0x35A8, 0x82309B30}, + {0x35A9, 0x82309B31}, + {0x35AA, 0x82309B32}, + {0x35AB, 0x82309B33}, + {0x35AC, 0x82309B34}, + {0x35AD, 0x82309B35}, + {0x35AE, 0x82309B36}, + {0x35AF, 0x82309B37}, + {0x35B0, 0x82309B38}, + {0x35B1, 0x82309B39}, + {0x35B2, 0x82309C30}, + {0x35B3, 0x82309C31}, + {0x35B4, 0x82309C32}, + {0x35B5, 0x82309C33}, + {0x35B6, 0x82309C34}, + {0x35B7, 0x82309C35}, + {0x35B8, 0x82309C36}, + {0x35B9, 0x82309C37}, + {0x35BA, 0x82309C38}, + {0x35BB, 0x82309C39}, + {0x35BC, 0x82309D30}, + {0x35BD, 0x82309D31}, + {0x35BE, 0x82309D32}, + {0x35BF, 0x82309D33}, + {0x35C0, 0x82309D34}, + {0x35C1, 0x82309D35}, + {0x35C2, 0x82309D36}, + {0x35C3, 0x82309D37}, + {0x35C4, 0x82309D38}, + {0x35C5, 0x82309D39}, + {0x35C6, 0x82309E30}, + {0x35C7, 0x82309E31}, + {0x35C8, 0x82309E32}, + {0x35C9, 0x82309E33}, + {0x35CA, 0x82309E34}, + {0x35CB, 0x82309E35}, + {0x35CC, 0x82309E36}, + {0x35CD, 0x82309E37}, + {0x35CE, 0x82309E38}, + {0x35CF, 0x82309E39}, + {0x35D0, 0x82309F30}, + {0x35D1, 0x82309F31}, + {0x35D2, 0x82309F32}, + {0x35D3, 0x82309F33}, + {0x35D4, 0x82309F34}, + {0x35D5, 0x82309F35}, + {0x35D6, 0x82309F36}, + {0x35D7, 0x82309F37}, + {0x35D8, 0x82309F38}, + {0x35D9, 0x82309F39}, + {0x35DA, 0x8230A030}, + {0x35DB, 0x8230A031}, + {0x35DC, 0x8230A032}, + {0x35DD, 0x8230A033}, + {0x35DE, 0x8230A034}, + {0x35DF, 0x8230A035}, + {0x35E0, 0x8230A036}, + {0x35E1, 0x8230A037}, + {0x35E2, 0x8230A038}, + {0x35E3, 0x8230A039}, + {0x35E4, 0x8230A130}, + {0x35E5, 0x8230A131}, + {0x35E6, 0x8230A132}, + {0x35E7, 0x8230A133}, + {0x35E8, 0x8230A134}, + {0x35E9, 0x8230A135}, + {0x35EA, 0x8230A136}, + {0x35EB, 0x8230A137}, + {0x35EC, 0x8230A138}, + {0x35ED, 0x8230A139}, + {0x35EE, 0x8230A230}, + {0x35EF, 0x8230A231}, + {0x35F0, 0x8230A232}, + {0x35F1, 0x8230A233}, + {0x35F2, 0x8230A234}, + {0x35F3, 0x8230A235}, + {0x35F4, 0x8230A236}, + {0x35F5, 0x8230A237}, + {0x35F6, 0x8230A238}, + {0x35F7, 0x8230A239}, + {0x35F8, 0x8230A330}, + {0x35F9, 0x8230A331}, + {0x35FA, 0x8230A332}, + {0x35FB, 0x8230A333}, + {0x35FC, 0x8230A334}, + {0x35FD, 0x8230A335}, + {0x35FE, 0x8230A336}, + {0x35FF, 0x8230A337}, + {0x3600, 0x8230A338}, + {0x3601, 0x8230A339}, + {0x3602, 0x8230A430}, + {0x3603, 0x8230A431}, + {0x3604, 0x8230A432}, + {0x3605, 0x8230A433}, + {0x3606, 0x8230A434}, + {0x3607, 0x8230A435}, + {0x3608, 0x8230A436}, + {0x3609, 0x8230A437}, + {0x360A, 0x8230A438}, + {0x360B, 0x8230A439}, + {0x360C, 0x8230A530}, + {0x360D, 0x8230A531}, + {0x360F, 0x8230A532}, + {0x3610, 0x8230A533}, + {0x3611, 0x8230A534}, + {0x3612, 0x8230A535}, + {0x3613, 0x8230A536}, + {0x3614, 0x8230A537}, + {0x3615, 0x8230A538}, + {0x3616, 0x8230A539}, + {0x3617, 0x8230A630}, + {0x3618, 0x8230A631}, + {0x3619, 0x8230A632}, + {0x3919, 0x8230F238}, + {0x391A, 0x8230F239}, + {0x391B, 0x8230F330}, + {0x391C, 0x8230F331}, + {0x391D, 0x8230F332}, + {0x391E, 0x8230F333}, + {0x391F, 0x8230F334}, + {0x3920, 0x8230F335}, + {0x3921, 0x8230F336}, + {0x3922, 0x8230F337}, + {0x3923, 0x8230F338}, + {0x3924, 0x8230F339}, + {0x3925, 0x8230F430}, + {0x3926, 0x8230F431}, + {0x3927, 0x8230F432}, + {0x3928, 0x8230F433}, + {0x3929, 0x8230F434}, + {0x392A, 0x8230F435}, + {0x392B, 0x8230F436}, + {0x392C, 0x8230F437}, + {0x392D, 0x8230F438}, + {0x392E, 0x8230F439}, + {0x392F, 0x8230F530}, + {0x3930, 0x8230F531}, + {0x3931, 0x8230F532}, + {0x3932, 0x8230F533}, + {0x3933, 0x8230F534}, + {0x3934, 0x8230F535}, + {0x3935, 0x8230F536}, + {0x3936, 0x8230F537}, + {0x3937, 0x8230F538}, + {0x3938, 0x8230F539}, + {0x3939, 0x8230F630}, + {0x393A, 0x8230F631}, + {0x393B, 0x8230F632}, + {0x393C, 0x8230F633}, + {0x393D, 0x8230F634}, + {0x393E, 0x8230F635}, + {0x393F, 0x8230F636}, + {0x3940, 0x8230F637}, + {0x3941, 0x8230F638}, + {0x3942, 0x8230F639}, + {0x3943, 0x8230F730}, + {0x3944, 0x8230F731}, + {0x3945, 0x8230F732}, + {0x3946, 0x8230F733}, + {0x3947, 0x8230F734}, + {0x3948, 0x8230F735}, + {0x3949, 0x8230F736}, + {0x394A, 0x8230F737}, + {0x394B, 0x8230F738}, + {0x394C, 0x8230F739}, + {0x394D, 0x8230F830}, + {0x394E, 0x8230F831}, + {0x394F, 0x8230F832}, + {0x3950, 0x8230F833}, + {0x3951, 0x8230F834}, + {0x3952, 0x8230F835}, + {0x3953, 0x8230F836}, + {0x3954, 0x8230F837}, + {0x3955, 0x8230F838}, + {0x3956, 0x8230F839}, + {0x3957, 0x8230F930}, + {0x3958, 0x8230F931}, + {0x3959, 0x8230F932}, + {0x395A, 0x8230F933}, + {0x395B, 0x8230F934}, + {0x395C, 0x8230F935}, + {0x395D, 0x8230F936}, + {0x395E, 0x8230F937}, + {0x395F, 0x8230F938}, + {0x3960, 0x8230F939}, + {0x3961, 0x8230FA30}, + {0x3962, 0x8230FA31}, + {0x3963, 0x8230FA32}, + {0x3964, 0x8230FA33}, + {0x3965, 0x8230FA34}, + {0x3966, 0x8230FA35}, + {0x3967, 0x8230FA36}, + {0x3968, 0x8230FA37}, + {0x3969, 0x8230FA38}, + {0x396A, 0x8230FA39}, + {0x396B, 0x8230FB30}, + {0x396C, 0x8230FB31}, + {0x396D, 0x8230FB32}, + {0x396F, 0x8230FB33}, + {0x3970, 0x8230FB34}, + {0x3971, 0x8230FB35}, + {0x3972, 0x8230FB36}, + {0x3973, 0x8230FB37}, + {0x3974, 0x8230FB38}, + {0x3975, 0x8230FB39}, + {0x3976, 0x8230FC30}, + {0x3977, 0x8230FC31}, + {0x3978, 0x8230FC32}, + {0x3979, 0x8230FC33}, + {0x397A, 0x8230FC34}, + {0x397B, 0x8230FC35}, + {0x397C, 0x8230FC36}, + {0x397D, 0x8230FC37}, + {0x397E, 0x8230FC38}, + {0x397F, 0x8230FC39}, + {0x3980, 0x8230FD30}, + {0x3981, 0x8230FD31}, + {0x3982, 0x8230FD32}, + {0x3983, 0x8230FD33}, + {0x3984, 0x8230FD34}, + {0x3985, 0x8230FD35}, + {0x3986, 0x8230FD36}, + {0x3987, 0x8230FD37}, + {0x3988, 0x8230FD38}, + {0x3989, 0x8230FD39}, + {0x398A, 0x8230FE30}, + {0x398B, 0x8230FE31}, + {0x398C, 0x8230FE32}, + {0x398D, 0x8230FE33}, + {0x398E, 0x8230FE34}, + {0x398F, 0x8230FE35}, + {0x3990, 0x8230FE36}, + {0x3991, 0x8230FE37}, + {0x3992, 0x8230FE38}, + {0x3993, 0x8230FE39}, + {0x3994, 0x82318130}, + {0x3995, 0x82318131}, + {0x3996, 0x82318132}, + {0x3997, 0x82318133}, + {0x3998, 0x82318134}, + {0x3999, 0x82318135}, + {0x399A, 0x82318136}, + {0x399B, 0x82318137}, + {0x399C, 0x82318138}, + {0x399D, 0x82318139}, + {0x399E, 0x82318230}, + {0x399F, 0x82318231}, + {0x39A0, 0x82318232}, + {0x39A1, 0x82318233}, + {0x39A2, 0x82318234}, + {0x39A3, 0x82318235}, + {0x39A4, 0x82318236}, + {0x39A5, 0x82318237}, + {0x39A6, 0x82318238}, + {0x39A7, 0x82318239}, + {0x39A8, 0x82318330}, + {0x39A9, 0x82318331}, + {0x39AA, 0x82318332}, + {0x39AB, 0x82318333}, + {0x39AC, 0x82318334}, + {0x39AD, 0x82318335}, + {0x39AE, 0x82318336}, + {0x39AF, 0x82318337}, + {0x39B0, 0x82318338}, + {0x39B1, 0x82318339}, + {0x39B2, 0x82318430}, + {0x39B3, 0x82318431}, + {0x39B4, 0x82318432}, + {0x39B5, 0x82318433}, + {0x39B6, 0x82318434}, + {0x39B7, 0x82318435}, + {0x39B8, 0x82318436}, + {0x39B9, 0x82318437}, + {0x39BA, 0x82318438}, + {0x39BB, 0x82318439}, + {0x39BC, 0x82318530}, + {0x39BD, 0x82318531}, + {0x39BE, 0x82318532}, + {0x39BF, 0x82318533}, + {0x39C0, 0x82318534}, + {0x39C1, 0x82318535}, + {0x39C2, 0x82318536}, + {0x39C3, 0x82318537}, + {0x39C4, 0x82318538}, + {0x39C5, 0x82318539}, + {0x39C6, 0x82318630}, + {0x39C7, 0x82318631}, + {0x39C8, 0x82318632}, + {0x39C9, 0x82318633}, + {0x39CA, 0x82318634}, + {0x39CB, 0x82318635}, + {0x39CC, 0x82318636}, + {0x39CD, 0x82318637}, + {0x39CE, 0x82318638}, + {0x39D1, 0x82318639}, + {0x39D2, 0x82318730}, + {0x39D3, 0x82318731}, + {0x39D4, 0x82318732}, + {0x39D5, 0x82318733}, + {0x39D6, 0x82318734}, + {0x39D7, 0x82318735}, + {0x39D8, 0x82318736}, + {0x39D9, 0x82318737}, + {0x39DA, 0x82318738}, + {0x39DB, 0x82318739}, + {0x39DC, 0x82318830}, + {0x39DD, 0x82318831}, + {0x39DE, 0x82318832}, + {0x39E0, 0x82318833}, + {0x39E1, 0x82318834}, + {0x39E2, 0x82318835}, + {0x39E3, 0x82318836}, + {0x39E4, 0x82318837}, + {0x39E5, 0x82318838}, + {0x39E6, 0x82318839}, + {0x39E7, 0x82318930}, + {0x39E8, 0x82318931}, + {0x39E9, 0x82318932}, + {0x39EA, 0x82318933}, + {0x39EB, 0x82318934}, + {0x39EC, 0x82318935}, + {0x39ED, 0x82318936}, + {0x39EE, 0x82318937}, + {0x39EF, 0x82318938}, + {0x39F0, 0x82318939}, + {0x39F1, 0x82318A30}, + {0x39F2, 0x82318A31}, + {0x39F3, 0x82318A32}, + {0x39F4, 0x82318A33}, + {0x39F5, 0x82318A34}, + {0x39F6, 0x82318A35}, + {0x39F7, 0x82318A36}, + {0x39F8, 0x82318A37}, + {0x39F9, 0x82318A38}, + {0x39FA, 0x82318A39}, + {0x39FB, 0x82318B30}, + {0x39FC, 0x82318B31}, + {0x39FD, 0x82318B32}, + {0x39FE, 0x82318B33}, + {0x39FF, 0x82318B34}, + {0x3A00, 0x82318B35}, + {0x3A01, 0x82318B36}, + {0x3A02, 0x82318B37}, + {0x3A03, 0x82318B38}, + {0x3A04, 0x82318B39}, + {0x3A05, 0x82318C30}, + {0x3A06, 0x82318C31}, + {0x3A07, 0x82318C32}, + {0x3A08, 0x82318C33}, + {0x3A09, 0x82318C34}, + {0x3A0A, 0x82318C35}, + {0x3A0B, 0x82318C36}, + {0x3A0C, 0x82318C37}, + {0x3A0D, 0x82318C38}, + {0x3A0E, 0x82318C39}, + {0x3A0F, 0x82318D30}, + {0x3A10, 0x82318D31}, + {0x3A11, 0x82318D32}, + {0x3A12, 0x82318D33}, + {0x3A13, 0x82318D34}, + {0x3A14, 0x82318D35}, + {0x3A15, 0x82318D36}, + {0x3A16, 0x82318D37}, + {0x3A17, 0x82318D38}, + {0x3A18, 0x82318D39}, + {0x3A19, 0x82318E30}, + {0x3A1A, 0x82318E31}, + {0x3A1B, 0x82318E32}, + {0x3A1C, 0x82318E33}, + {0x3A1D, 0x82318E34}, + {0x3A1E, 0x82318E35}, + {0x3A1F, 0x82318E36}, + {0x3A20, 0x82318E37}, + {0x3A21, 0x82318E38}, + {0x3A22, 0x82318E39}, + {0x3A23, 0x82318F30}, + {0x3A24, 0x82318F31}, + {0x3A25, 0x82318F32}, + {0x3A26, 0x82318F33}, + {0x3A27, 0x82318F34}, + {0x3A28, 0x82318F35}, + {0x3A29, 0x82318F36}, + {0x3A2A, 0x82318F37}, + {0x3A2B, 0x82318F38}, + {0x3A2C, 0x82318F39}, + {0x3A2D, 0x82319030}, + {0x3A2E, 0x82319031}, + {0x3A2F, 0x82319032}, + {0x3A30, 0x82319033}, + {0x3A31, 0x82319034}, + {0x3A32, 0x82319035}, + {0x3A33, 0x82319036}, + {0x3A34, 0x82319037}, + {0x3A35, 0x82319038}, + {0x3A36, 0x82319039}, + {0x3A37, 0x82319130}, + {0x3A38, 0x82319131}, + {0x3A39, 0x82319132}, + {0x3A3A, 0x82319133}, + {0x3A3B, 0x82319134}, + {0x3A3C, 0x82319135}, + {0x3A3D, 0x82319136}, + {0x3A3E, 0x82319137}, + {0x3A3F, 0x82319138}, + {0x3A40, 0x82319139}, + {0x3A41, 0x82319230}, + {0x3A42, 0x82319231}, + {0x3A43, 0x82319232}, + {0x3A44, 0x82319233}, + {0x3A45, 0x82319234}, + {0x3A46, 0x82319235}, + {0x3A47, 0x82319236}, + {0x3A48, 0x82319237}, + {0x3A49, 0x82319238}, + {0x3A4A, 0x82319239}, + {0x3A4B, 0x82319330}, + {0x3A4C, 0x82319331}, + {0x3A4D, 0x82319332}, + {0x3A4E, 0x82319333}, + {0x3A4F, 0x82319334}, + {0x3A50, 0x82319335}, + {0x3A51, 0x82319336}, + {0x3A52, 0x82319337}, + {0x3A53, 0x82319338}, + {0x3A54, 0x82319339}, + {0x3A55, 0x82319430}, + {0x3A56, 0x82319431}, + {0x3A57, 0x82319432}, + {0x3A58, 0x82319433}, + {0x3A59, 0x82319434}, + {0x3A5A, 0x82319435}, + {0x3A5B, 0x82319436}, + {0x3A5C, 0x82319437}, + {0x3A5D, 0x82319438}, + {0x3A5E, 0x82319439}, + {0x3A5F, 0x82319530}, + {0x3A60, 0x82319531}, + {0x3A61, 0x82319532}, + {0x3A62, 0x82319533}, + {0x3A63, 0x82319534}, + {0x3A64, 0x82319535}, + {0x3A65, 0x82319536}, + {0x3A66, 0x82319537}, + {0x3A67, 0x82319538}, + {0x3A68, 0x82319539}, + {0x3A69, 0x82319630}, + {0x3A6A, 0x82319631}, + {0x3A6B, 0x82319632}, + {0x3A6C, 0x82319633}, + {0x3A6D, 0x82319634}, + {0x3A6E, 0x82319635}, + {0x3A6F, 0x82319636}, + {0x3A70, 0x82319637}, + {0x3A71, 0x82319638}, + {0x3A72, 0x82319639}, + {0x3A74, 0x82319730}, + {0x3A75, 0x82319731}, + {0x3A76, 0x82319732}, + {0x3A77, 0x82319733}, + {0x3A78, 0x82319734}, + {0x3A79, 0x82319735}, + {0x3A7A, 0x82319736}, + {0x3A7B, 0x82319737}, + {0x3A7C, 0x82319738}, + {0x3A7D, 0x82319739}, + {0x3A7E, 0x82319830}, + {0x3A7F, 0x82319831}, + {0x3A80, 0x82319832}, + {0x3A81, 0x82319833}, + {0x3A82, 0x82319834}, + {0x3A83, 0x82319835}, + {0x3A84, 0x82319836}, + {0x3A85, 0x82319837}, + {0x3A86, 0x82319838}, + {0x3A87, 0x82319839}, + {0x3A88, 0x82319930}, + {0x3A89, 0x82319931}, + {0x3A8A, 0x82319932}, + {0x3A8B, 0x82319933}, + {0x3A8C, 0x82319934}, + {0x3A8D, 0x82319935}, + {0x3A8E, 0x82319936}, + {0x3A8F, 0x82319937}, + {0x3A90, 0x82319938}, + {0x3A91, 0x82319939}, + {0x3A92, 0x82319A30}, + {0x3A93, 0x82319A31}, + {0x3A94, 0x82319A32}, + {0x3A95, 0x82319A33}, + {0x3A96, 0x82319A34}, + {0x3A97, 0x82319A35}, + {0x3A98, 0x82319A36}, + {0x3A99, 0x82319A37}, + {0x3A9A, 0x82319A38}, + {0x3A9B, 0x82319A39}, + {0x3A9C, 0x82319B30}, + {0x3A9D, 0x82319B31}, + {0x3A9E, 0x82319B32}, + {0x3A9F, 0x82319B33}, + {0x3AA0, 0x82319B34}, + {0x3AA1, 0x82319B35}, + {0x3AA2, 0x82319B36}, + {0x3AA3, 0x82319B37}, + {0x3AA4, 0x82319B38}, + {0x3AA5, 0x82319B39}, + {0x3AA6, 0x82319C30}, + {0x3AA7, 0x82319C31}, + {0x3AA8, 0x82319C32}, + {0x3AA9, 0x82319C33}, + {0x3AAA, 0x82319C34}, + {0x3AAB, 0x82319C35}, + {0x3AAC, 0x82319C36}, + {0x3AAD, 0x82319C37}, + {0x3AAE, 0x82319C38}, + {0x3AAF, 0x82319C39}, + {0x3AB0, 0x82319D30}, + {0x3AB1, 0x82319D31}, + {0x3AB2, 0x82319D32}, + {0x3AB3, 0x82319D33}, + {0x3AB4, 0x82319D34}, + {0x3AB5, 0x82319D35}, + {0x3AB6, 0x82319D36}, + {0x3AB7, 0x82319D37}, + {0x3AB8, 0x82319D38}, + {0x3AB9, 0x82319D39}, + {0x3ABA, 0x82319E30}, + {0x3ABB, 0x82319E31}, + {0x3ABC, 0x82319E32}, + {0x3ABD, 0x82319E33}, + {0x3ABE, 0x82319E34}, + {0x3ABF, 0x82319E35}, + {0x3AC0, 0x82319E36}, + {0x3AC1, 0x82319E37}, + {0x3AC2, 0x82319E38}, + {0x3AC3, 0x82319E39}, + {0x3AC4, 0x82319F30}, + {0x3AC5, 0x82319F31}, + {0x3AC6, 0x82319F32}, + {0x3AC7, 0x82319F33}, + {0x3AC8, 0x82319F34}, + {0x3AC9, 0x82319F35}, + {0x3ACA, 0x82319F36}, + {0x3ACB, 0x82319F37}, + {0x3ACC, 0x82319F38}, + {0x3ACD, 0x82319F39}, + {0x3ACE, 0x8231A030}, + {0x3ACF, 0x8231A031}, + {0x3AD0, 0x8231A032}, + {0x3AD1, 0x8231A033}, + {0x3AD2, 0x8231A034}, + {0x3AD3, 0x8231A035}, + {0x3AD4, 0x8231A036}, + {0x3AD5, 0x8231A037}, + {0x3AD6, 0x8231A038}, + {0x3AD7, 0x8231A039}, + {0x3AD8, 0x8231A130}, + {0x3AD9, 0x8231A131}, + {0x3ADA, 0x8231A132}, + {0x3ADB, 0x8231A133}, + {0x3ADC, 0x8231A134}, + {0x3ADD, 0x8231A135}, + {0x3ADE, 0x8231A136}, + {0x3ADF, 0x8231A137}, + {0x3AE0, 0x8231A138}, + {0x3AE1, 0x8231A139}, + {0x3AE2, 0x8231A230}, + {0x3AE3, 0x8231A231}, + {0x3AE4, 0x8231A232}, + {0x3AE5, 0x8231A233}, + {0x3AE6, 0x8231A234}, + {0x3AE7, 0x8231A235}, + {0x3AE8, 0x8231A236}, + {0x3AE9, 0x8231A237}, + {0x3AEA, 0x8231A238}, + {0x3AEB, 0x8231A239}, + {0x3AEC, 0x8231A330}, + {0x3AED, 0x8231A331}, + {0x3AEE, 0x8231A332}, + {0x3AEF, 0x8231A333}, + {0x3AF0, 0x8231A334}, + {0x3AF1, 0x8231A335}, + {0x3AF2, 0x8231A336}, + {0x3AF3, 0x8231A337}, + {0x3AF4, 0x8231A338}, + {0x3AF5, 0x8231A339}, + {0x3AF6, 0x8231A430}, + {0x3AF7, 0x8231A431}, + {0x3AF8, 0x8231A432}, + {0x3AF9, 0x8231A433}, + {0x3AFA, 0x8231A434}, + {0x3AFB, 0x8231A435}, + {0x3AFC, 0x8231A436}, + {0x3AFD, 0x8231A437}, + {0x3AFE, 0x8231A438}, + {0x3AFF, 0x8231A439}, + {0x3B00, 0x8231A530}, + {0x3B01, 0x8231A531}, + {0x3B02, 0x8231A532}, + {0x3B03, 0x8231A533}, + {0x3B04, 0x8231A534}, + {0x3B05, 0x8231A535}, + {0x3B06, 0x8231A536}, + {0x3B07, 0x8231A537}, + {0x3B08, 0x8231A538}, + {0x3B09, 0x8231A539}, + {0x3B0A, 0x8231A630}, + {0x3B0B, 0x8231A631}, + {0x3B0C, 0x8231A632}, + {0x3B0D, 0x8231A633}, + {0x3B0E, 0x8231A634}, + {0x3B0F, 0x8231A635}, + {0x3B10, 0x8231A636}, + {0x3B11, 0x8231A637}, + {0x3B12, 0x8231A638}, + {0x3B13, 0x8231A639}, + {0x3B14, 0x8231A730}, + {0x3B15, 0x8231A731}, + {0x3B16, 0x8231A732}, + {0x3B17, 0x8231A733}, + {0x3B18, 0x8231A734}, + {0x3B19, 0x8231A735}, + {0x3B1A, 0x8231A736}, + {0x3B1B, 0x8231A737}, + {0x3B1C, 0x8231A738}, + {0x3B1D, 0x8231A739}, + {0x3B1E, 0x8231A830}, + {0x3B1F, 0x8231A831}, + {0x3B20, 0x8231A832}, + {0x3B21, 0x8231A833}, + {0x3B22, 0x8231A834}, + {0x3B23, 0x8231A835}, + {0x3B24, 0x8231A836}, + {0x3B25, 0x8231A837}, + {0x3B26, 0x8231A838}, + {0x3B27, 0x8231A839}, + {0x3B28, 0x8231A930}, + {0x3B29, 0x8231A931}, + {0x3B2A, 0x8231A932}, + {0x3B2B, 0x8231A933}, + {0x3B2C, 0x8231A934}, + {0x3B2D, 0x8231A935}, + {0x3B2E, 0x8231A936}, + {0x3B2F, 0x8231A937}, + {0x3B30, 0x8231A938}, + {0x3B31, 0x8231A939}, + {0x3B32, 0x8231AA30}, + {0x3B33, 0x8231AA31}, + {0x3B34, 0x8231AA32}, + {0x3B35, 0x8231AA33}, + {0x3B36, 0x8231AA34}, + {0x3B37, 0x8231AA35}, + {0x3B38, 0x8231AA36}, + {0x3B39, 0x8231AA37}, + {0x3B3A, 0x8231AA38}, + {0x3B3B, 0x8231AA39}, + {0x3B3C, 0x8231AB30}, + {0x3B3D, 0x8231AB31}, + {0x3B3E, 0x8231AB32}, + {0x3B3F, 0x8231AB33}, + {0x3B40, 0x8231AB34}, + {0x3B41, 0x8231AB35}, + {0x3B42, 0x8231AB36}, + {0x3B43, 0x8231AB37}, + {0x3B44, 0x8231AB38}, + {0x3B45, 0x8231AB39}, + {0x3B46, 0x8231AC30}, + {0x3B47, 0x8231AC31}, + {0x3B48, 0x8231AC32}, + {0x3B49, 0x8231AC33}, + {0x3B4A, 0x8231AC34}, + {0x3B4B, 0x8231AC35}, + {0x3B4C, 0x8231AC36}, + {0x3B4D, 0x8231AC37}, + {0x3B4F, 0x8231AC38}, + {0x3B50, 0x8231AC39}, + {0x3B51, 0x8231AD30}, + {0x3B52, 0x8231AD31}, + {0x3B53, 0x8231AD32}, + {0x3B54, 0x8231AD33}, + {0x3B55, 0x8231AD34}, + {0x3B56, 0x8231AD35}, + {0x3B57, 0x8231AD36}, + {0x3B58, 0x8231AD37}, + {0x3B59, 0x8231AD38}, + {0x3B5A, 0x8231AD39}, + {0x3B5B, 0x8231AE30}, + {0x3B5C, 0x8231AE31}, + {0x3B5D, 0x8231AE32}, + {0x3B5E, 0x8231AE33}, + {0x3B5F, 0x8231AE34}, + {0x3B60, 0x8231AE35}, + {0x3B61, 0x8231AE36}, + {0x3B62, 0x8231AE37}, + {0x3B63, 0x8231AE38}, + {0x3B64, 0x8231AE39}, + {0x3B65, 0x8231AF30}, + {0x3B66, 0x8231AF31}, + {0x3B67, 0x8231AF32}, + {0x3B68, 0x8231AF33}, + {0x3B69, 0x8231AF34}, + {0x3B6A, 0x8231AF35}, + {0x3B6B, 0x8231AF36}, + {0x3B6C, 0x8231AF37}, + {0x3B6D, 0x8231AF38}, + {0x3B6E, 0x8231AF39}, + {0x3B6F, 0x8231B030}, + {0x3B70, 0x8231B031}, + {0x3B71, 0x8231B032}, + {0x3B72, 0x8231B033}, + {0x3B73, 0x8231B034}, + {0x3B74, 0x8231B035}, + {0x3B75, 0x8231B036}, + {0x3B76, 0x8231B037}, + {0x3B77, 0x8231B038}, + {0x3B78, 0x8231B039}, + {0x3B79, 0x8231B130}, + {0x3B7A, 0x8231B131}, + {0x3B7B, 0x8231B132}, + {0x3B7C, 0x8231B133}, + {0x3B7D, 0x8231B134}, + {0x3B7E, 0x8231B135}, + {0x3B7F, 0x8231B136}, + {0x3B80, 0x8231B137}, + {0x3B81, 0x8231B138}, + {0x3B82, 0x8231B139}, + {0x3B83, 0x8231B230}, + {0x3B84, 0x8231B231}, + {0x3B85, 0x8231B232}, + {0x3B86, 0x8231B233}, + {0x3B87, 0x8231B234}, + {0x3B88, 0x8231B235}, + {0x3B89, 0x8231B236}, + {0x3B8A, 0x8231B237}, + {0x3B8B, 0x8231B238}, + {0x3B8C, 0x8231B239}, + {0x3B8D, 0x8231B330}, + {0x3B8E, 0x8231B331}, + {0x3B8F, 0x8231B332}, + {0x3B90, 0x8231B333}, + {0x3B91, 0x8231B334}, + {0x3B92, 0x8231B335}, + {0x3B93, 0x8231B336}, + {0x3B94, 0x8231B337}, + {0x3B95, 0x8231B338}, + {0x3B96, 0x8231B339}, + {0x3B97, 0x8231B430}, + {0x3B98, 0x8231B431}, + {0x3B99, 0x8231B432}, + {0x3B9A, 0x8231B433}, + {0x3B9B, 0x8231B434}, + {0x3B9C, 0x8231B435}, + {0x3B9D, 0x8231B436}, + {0x3B9E, 0x8231B437}, + {0x3B9F, 0x8231B438}, + {0x3BA0, 0x8231B439}, + {0x3BA1, 0x8231B530}, + {0x3BA2, 0x8231B531}, + {0x3BA3, 0x8231B532}, + {0x3BA4, 0x8231B533}, + {0x3BA5, 0x8231B534}, + {0x3BA6, 0x8231B535}, + {0x3BA7, 0x8231B536}, + {0x3BA8, 0x8231B537}, + {0x3BA9, 0x8231B538}, + {0x3BAA, 0x8231B539}, + {0x3BAB, 0x8231B630}, + {0x3BAC, 0x8231B631}, + {0x3BAD, 0x8231B632}, + {0x3BAE, 0x8231B633}, + {0x3BAF, 0x8231B634}, + {0x3BB0, 0x8231B635}, + {0x3BB1, 0x8231B636}, + {0x3BB2, 0x8231B637}, + {0x3BB3, 0x8231B638}, + {0x3BB4, 0x8231B639}, + {0x3BB5, 0x8231B730}, + {0x3BB6, 0x8231B731}, + {0x3BB7, 0x8231B732}, + {0x3BB8, 0x8231B733}, + {0x3BB9, 0x8231B734}, + {0x3BBA, 0x8231B735}, + {0x3BBB, 0x8231B736}, + {0x3BBC, 0x8231B737}, + {0x3BBD, 0x8231B738}, + {0x3BBE, 0x8231B739}, + {0x3BBF, 0x8231B830}, + {0x3BC0, 0x8231B831}, + {0x3BC1, 0x8231B832}, + {0x3BC2, 0x8231B833}, + {0x3BC3, 0x8231B834}, + {0x3BC4, 0x8231B835}, + {0x3BC5, 0x8231B836}, + {0x3BC6, 0x8231B837}, + {0x3BC7, 0x8231B838}, + {0x3BC8, 0x8231B839}, + {0x3BC9, 0x8231B930}, + {0x3BCA, 0x8231B931}, + {0x3BCB, 0x8231B932}, + {0x3BCC, 0x8231B933}, + {0x3BCD, 0x8231B934}, + {0x3BCE, 0x8231B935}, + {0x3BCF, 0x8231B936}, + {0x3BD0, 0x8231B937}, + {0x3BD1, 0x8231B938}, + {0x3BD2, 0x8231B939}, + {0x3BD3, 0x8231BA30}, + {0x3BD4, 0x8231BA31}, + {0x3BD5, 0x8231BA32}, + {0x3BD6, 0x8231BA33}, + {0x3BD7, 0x8231BA34}, + {0x3BD8, 0x8231BA35}, + {0x3BD9, 0x8231BA36}, + {0x3BDA, 0x8231BA37}, + {0x3BDB, 0x8231BA38}, + {0x3BDC, 0x8231BA39}, + {0x3BDD, 0x8231BB30}, + {0x3BDE, 0x8231BB31}, + {0x3BDF, 0x8231BB32}, + {0x3BE0, 0x8231BB33}, + {0x3BE1, 0x8231BB34}, + {0x3BE2, 0x8231BB35}, + {0x3BE3, 0x8231BB36}, + {0x3BE4, 0x8231BB37}, + {0x3BE5, 0x8231BB38}, + {0x3BE6, 0x8231BB39}, + {0x3BE7, 0x8231BC30}, + {0x3BE8, 0x8231BC31}, + {0x3BE9, 0x8231BC32}, + {0x3BEA, 0x8231BC33}, + {0x3BEB, 0x8231BC34}, + {0x3BEC, 0x8231BC35}, + {0x3BED, 0x8231BC36}, + {0x3BEE, 0x8231BC37}, + {0x3BEF, 0x8231BC38}, + {0x3BF0, 0x8231BC39}, + {0x3BF1, 0x8231BD30}, + {0x3BF2, 0x8231BD31}, + {0x3BF3, 0x8231BD32}, + {0x3BF4, 0x8231BD33}, + {0x3BF5, 0x8231BD34}, + {0x3BF6, 0x8231BD35}, + {0x3BF7, 0x8231BD36}, + {0x3BF8, 0x8231BD37}, + {0x3BF9, 0x8231BD38}, + {0x3BFA, 0x8231BD39}, + {0x3BFB, 0x8231BE30}, + {0x3BFC, 0x8231BE31}, + {0x3BFD, 0x8231BE32}, + {0x3BFE, 0x8231BE33}, + {0x3BFF, 0x8231BE34}, + {0x3C00, 0x8231BE35}, + {0x3C01, 0x8231BE36}, + {0x3C02, 0x8231BE37}, + {0x3C03, 0x8231BE38}, + {0x3C04, 0x8231BE39}, + {0x3C05, 0x8231BF30}, + {0x3C06, 0x8231BF31}, + {0x3C07, 0x8231BF32}, + {0x3C08, 0x8231BF33}, + {0x3C09, 0x8231BF34}, + {0x3C0A, 0x8231BF35}, + {0x3C0B, 0x8231BF36}, + {0x3C0C, 0x8231BF37}, + {0x3C0D, 0x8231BF38}, + {0x3C0E, 0x8231BF39}, + {0x3C0F, 0x8231C030}, + {0x3C10, 0x8231C031}, + {0x3C11, 0x8231C032}, + {0x3C12, 0x8231C033}, + {0x3C13, 0x8231C034}, + {0x3C14, 0x8231C035}, + {0x3C15, 0x8231C036}, + {0x3C16, 0x8231C037}, + {0x3C17, 0x8231C038}, + {0x3C18, 0x8231C039}, + {0x3C19, 0x8231C130}, + {0x3C1A, 0x8231C131}, + {0x3C1B, 0x8231C132}, + {0x3C1C, 0x8231C133}, + {0x3C1D, 0x8231C134}, + {0x3C1E, 0x8231C135}, + {0x3C1F, 0x8231C136}, + {0x3C20, 0x8231C137}, + {0x3C21, 0x8231C138}, + {0x3C22, 0x8231C139}, + {0x3C23, 0x8231C230}, + {0x3C24, 0x8231C231}, + {0x3C25, 0x8231C232}, + {0x3C26, 0x8231C233}, + {0x3C27, 0x8231C234}, + {0x3C28, 0x8231C235}, + {0x3C29, 0x8231C236}, + {0x3C2A, 0x8231C237}, + {0x3C2B, 0x8231C238}, + {0x3C2C, 0x8231C239}, + {0x3C2D, 0x8231C330}, + {0x3C2E, 0x8231C331}, + {0x3C2F, 0x8231C332}, + {0x3C30, 0x8231C333}, + {0x3C31, 0x8231C334}, + {0x3C32, 0x8231C335}, + {0x3C33, 0x8231C336}, + {0x3C34, 0x8231C337}, + {0x3C35, 0x8231C338}, + {0x3C36, 0x8231C339}, + {0x3C37, 0x8231C430}, + {0x3C38, 0x8231C431}, + {0x3C39, 0x8231C432}, + {0x3C3A, 0x8231C433}, + {0x3C3B, 0x8231C434}, + {0x3C3C, 0x8231C435}, + {0x3C3D, 0x8231C436}, + {0x3C3E, 0x8231C437}, + {0x3C3F, 0x8231C438}, + {0x3C40, 0x8231C439}, + {0x3C41, 0x8231C530}, + {0x3C42, 0x8231C531}, + {0x3C43, 0x8231C532}, + {0x3C44, 0x8231C533}, + {0x3C45, 0x8231C534}, + {0x3C46, 0x8231C535}, + {0x3C47, 0x8231C536}, + {0x3C48, 0x8231C537}, + {0x3C49, 0x8231C538}, + {0x3C4A, 0x8231C539}, + {0x3C4B, 0x8231C630}, + {0x3C4C, 0x8231C631}, + {0x3C4D, 0x8231C632}, + {0x3C4E, 0x8231C633}, + {0x3C4F, 0x8231C634}, + {0x3C50, 0x8231C635}, + {0x3C51, 0x8231C636}, + {0x3C52, 0x8231C637}, + {0x3C53, 0x8231C638}, + {0x3C54, 0x8231C639}, + {0x3C55, 0x8231C730}, + {0x3C56, 0x8231C731}, + {0x3C57, 0x8231C732}, + {0x3C58, 0x8231C733}, + {0x3C59, 0x8231C734}, + {0x3C5A, 0x8231C735}, + {0x3C5B, 0x8231C736}, + {0x3C5C, 0x8231C737}, + {0x3C5D, 0x8231C738}, + {0x3C5E, 0x8231C739}, + {0x3C5F, 0x8231C830}, + {0x3C60, 0x8231C831}, + {0x3C61, 0x8231C832}, + {0x3C62, 0x8231C833}, + {0x3C63, 0x8231C834}, + {0x3C64, 0x8231C835}, + {0x3C65, 0x8231C836}, + {0x3C66, 0x8231C837}, + {0x3C67, 0x8231C838}, + {0x3C68, 0x8231C839}, + {0x3C69, 0x8231C930}, + {0x3C6A, 0x8231C931}, + {0x3C6B, 0x8231C932}, + {0x3C6C, 0x8231C933}, + {0x3C6D, 0x8231C934}, + {0x3C6F, 0x8231C935}, + {0x3C70, 0x8231C936}, + {0x3C71, 0x8231C937}, + {0x3C72, 0x8231C938}, + {0x3C73, 0x8231C939}, + {0x3C74, 0x8231CA30}, + {0x3C75, 0x8231CA31}, + {0x3C76, 0x8231CA32}, + {0x3C77, 0x8231CA33}, + {0x3C78, 0x8231CA34}, + {0x3C79, 0x8231CA35}, + {0x3C7A, 0x8231CA36}, + {0x3C7B, 0x8231CA37}, + {0x3C7C, 0x8231CA38}, + {0x3C7D, 0x8231CA39}, + {0x3C7E, 0x8231CB30}, + {0x3C7F, 0x8231CB31}, + {0x3C80, 0x8231CB32}, + {0x3C81, 0x8231CB33}, + {0x3C82, 0x8231CB34}, + {0x3C83, 0x8231CB35}, + {0x3C84, 0x8231CB36}, + {0x3C85, 0x8231CB37}, + {0x3C86, 0x8231CB38}, + {0x3C87, 0x8231CB39}, + {0x3C88, 0x8231CC30}, + {0x3C89, 0x8231CC31}, + {0x3C8A, 0x8231CC32}, + {0x3C8B, 0x8231CC33}, + {0x3C8C, 0x8231CC34}, + {0x3C8D, 0x8231CC35}, + {0x3C8E, 0x8231CC36}, + {0x3C8F, 0x8231CC37}, + {0x3C90, 0x8231CC38}, + {0x3C91, 0x8231CC39}, + {0x3C92, 0x8231CD30}, + {0x3C93, 0x8231CD31}, + {0x3C94, 0x8231CD32}, + {0x3C95, 0x8231CD33}, + {0x3C96, 0x8231CD34}, + {0x3C97, 0x8231CD35}, + {0x3C98, 0x8231CD36}, + {0x3C99, 0x8231CD37}, + {0x3C9A, 0x8231CD38}, + {0x3C9B, 0x8231CD39}, + {0x3C9C, 0x8231CE30}, + {0x3C9D, 0x8231CE31}, + {0x3C9E, 0x8231CE32}, + {0x3C9F, 0x8231CE33}, + {0x3CA0, 0x8231CE34}, + {0x3CA1, 0x8231CE35}, + {0x3CA2, 0x8231CE36}, + {0x3CA3, 0x8231CE37}, + {0x3CA4, 0x8231CE38}, + {0x3CA5, 0x8231CE39}, + {0x3CA6, 0x8231CF30}, + {0x3CA7, 0x8231CF31}, + {0x3CA8, 0x8231CF32}, + {0x3CA9, 0x8231CF33}, + {0x3CAA, 0x8231CF34}, + {0x3CAB, 0x8231CF35}, + {0x3CAC, 0x8231CF36}, + {0x3CAD, 0x8231CF37}, + {0x3CAE, 0x8231CF38}, + {0x3CAF, 0x8231CF39}, + {0x3CB0, 0x8231D030}, + {0x3CB1, 0x8231D031}, + {0x3CB2, 0x8231D032}, + {0x3CB3, 0x8231D033}, + {0x3CB4, 0x8231D034}, + {0x3CB5, 0x8231D035}, + {0x3CB6, 0x8231D036}, + {0x3CB7, 0x8231D037}, + {0x3CB8, 0x8231D038}, + {0x3CB9, 0x8231D039}, + {0x3CBA, 0x8231D130}, + {0x3CBB, 0x8231D131}, + {0x3CBC, 0x8231D132}, + {0x3CBD, 0x8231D133}, + {0x3CBE, 0x8231D134}, + {0x3CBF, 0x8231D135}, + {0x3CC0, 0x8231D136}, + {0x3CC1, 0x8231D137}, + {0x3CC2, 0x8231D138}, + {0x3CC3, 0x8231D139}, + {0x3CC4, 0x8231D230}, + {0x3CC5, 0x8231D231}, + {0x3CC6, 0x8231D232}, + {0x3CC7, 0x8231D233}, + {0x3CC8, 0x8231D234}, + {0x3CC9, 0x8231D235}, + {0x3CCA, 0x8231D236}, + {0x3CCB, 0x8231D237}, + {0x3CCC, 0x8231D238}, + {0x3CCD, 0x8231D239}, + {0x3CCE, 0x8231D330}, + {0x3CCF, 0x8231D331}, + {0x3CD0, 0x8231D332}, + {0x3CD1, 0x8231D333}, + {0x3CD2, 0x8231D334}, + {0x3CD3, 0x8231D335}, + {0x3CD4, 0x8231D336}, + {0x3CD5, 0x8231D337}, + {0x3CD6, 0x8231D338}, + {0x3CD7, 0x8231D339}, + {0x3CD8, 0x8231D430}, + {0x3CD9, 0x8231D431}, + {0x3CDA, 0x8231D432}, + {0x3CDB, 0x8231D433}, + {0x3CDC, 0x8231D434}, + {0x3CDD, 0x8231D435}, + {0x3CDE, 0x8231D436}, + {0x3CDF, 0x8231D437}, + {0x4057, 0x8232AF33}, + {0x4058, 0x8232AF34}, + {0x4059, 0x8232AF35}, + {0x405A, 0x8232AF36}, + {0x405B, 0x8232AF37}, + {0x405C, 0x8232AF38}, + {0x405D, 0x8232AF39}, + {0x405E, 0x8232B030}, + {0x405F, 0x8232B031}, + {0x4060, 0x8232B032}, + {0x4061, 0x8232B033}, + {0x4062, 0x8232B034}, + {0x4063, 0x8232B035}, + {0x4064, 0x8232B036}, + {0x4065, 0x8232B037}, + {0x4066, 0x8232B038}, + {0x4067, 0x8232B039}, + {0x4068, 0x8232B130}, + {0x4069, 0x8232B131}, + {0x406A, 0x8232B132}, + {0x406B, 0x8232B133}, + {0x406C, 0x8232B134}, + {0x406D, 0x8232B135}, + {0x406E, 0x8232B136}, + {0x406F, 0x8232B137}, + {0x4070, 0x8232B138}, + {0x4071, 0x8232B139}, + {0x4072, 0x8232B230}, + {0x4073, 0x8232B231}, + {0x4074, 0x8232B232}, + {0x4075, 0x8232B233}, + {0x4076, 0x8232B234}, + {0x4077, 0x8232B235}, + {0x4078, 0x8232B236}, + {0x4079, 0x8232B237}, + {0x407A, 0x8232B238}, + {0x407B, 0x8232B239}, + {0x407C, 0x8232B330}, + {0x407D, 0x8232B331}, + {0x407E, 0x8232B332}, + {0x407F, 0x8232B333}, + {0x4080, 0x8232B334}, + {0x4081, 0x8232B335}, + {0x4082, 0x8232B336}, + {0x4083, 0x8232B337}, + {0x4084, 0x8232B338}, + {0x4085, 0x8232B339}, + {0x4086, 0x8232B430}, + {0x4087, 0x8232B431}, + {0x4088, 0x8232B432}, + {0x4089, 0x8232B433}, + {0x408A, 0x8232B434}, + {0x408B, 0x8232B435}, + {0x408C, 0x8232B436}, + {0x408D, 0x8232B437}, + {0x408E, 0x8232B438}, + {0x408F, 0x8232B439}, + {0x4090, 0x8232B530}, + {0x4091, 0x8232B531}, + {0x4092, 0x8232B532}, + {0x4093, 0x8232B533}, + {0x4094, 0x8232B534}, + {0x4095, 0x8232B535}, + {0x4096, 0x8232B536}, + {0x4097, 0x8232B537}, + {0x4098, 0x8232B538}, + {0x4099, 0x8232B539}, + {0x409A, 0x8232B630}, + {0x409B, 0x8232B631}, + {0x409C, 0x8232B632}, + {0x409D, 0x8232B633}, + {0x409E, 0x8232B634}, + {0x409F, 0x8232B635}, + {0x40A0, 0x8232B636}, + {0x40A1, 0x8232B637}, + {0x40A2, 0x8232B638}, + {0x40A3, 0x8232B639}, + {0x40A4, 0x8232B730}, + {0x40A5, 0x8232B731}, + {0x40A6, 0x8232B732}, + {0x40A7, 0x8232B733}, + {0x40A8, 0x8232B734}, + {0x40A9, 0x8232B735}, + {0x40AA, 0x8232B736}, + {0x40AB, 0x8232B737}, + {0x40AC, 0x8232B738}, + {0x40AD, 0x8232B739}, + {0x40AE, 0x8232B830}, + {0x40AF, 0x8232B831}, + {0x40B0, 0x8232B832}, + {0x40B1, 0x8232B833}, + {0x40B2, 0x8232B834}, + {0x40B3, 0x8232B835}, + {0x40B4, 0x8232B836}, + {0x40B5, 0x8232B837}, + {0x40B6, 0x8232B838}, + {0x40B7, 0x8232B839}, + {0x40B8, 0x8232B930}, + {0x40B9, 0x8232B931}, + {0x40BA, 0x8232B932}, + {0x40BB, 0x8232B933}, + {0x40BC, 0x8232B934}, + {0x40BD, 0x8232B935}, + {0x40BE, 0x8232B936}, + {0x40BF, 0x8232B937}, + {0x40C0, 0x8232B938}, + {0x40C1, 0x8232B939}, + {0x40C2, 0x8232BA30}, + {0x40C3, 0x8232BA31}, + {0x40C4, 0x8232BA32}, + {0x40C5, 0x8232BA33}, + {0x40C6, 0x8232BA34}, + {0x40C7, 0x8232BA35}, + {0x40C8, 0x8232BA36}, + {0x40C9, 0x8232BA37}, + {0x40CA, 0x8232BA38}, + {0x40CB, 0x8232BA39}, + {0x40CC, 0x8232BB30}, + {0x40CD, 0x8232BB31}, + {0x40CE, 0x8232BB32}, + {0x40CF, 0x8232BB33}, + {0x40D0, 0x8232BB34}, + {0x40D1, 0x8232BB35}, + {0x40D2, 0x8232BB36}, + {0x40D3, 0x8232BB37}, + {0x40D4, 0x8232BB38}, + {0x40D5, 0x8232BB39}, + {0x40D6, 0x8232BC30}, + {0x40D7, 0x8232BC31}, + {0x40D8, 0x8232BC32}, + {0x40D9, 0x8232BC33}, + {0x40DA, 0x8232BC34}, + {0x40DB, 0x8232BC35}, + {0x40DC, 0x8232BC36}, + {0x40DD, 0x8232BC37}, + {0x40DE, 0x8232BC38}, + {0x40DF, 0x8232BC39}, + {0x40E0, 0x8232BD30}, + {0x40E1, 0x8232BD31}, + {0x40E2, 0x8232BD32}, + {0x40E3, 0x8232BD33}, + {0x40E4, 0x8232BD34}, + {0x40E5, 0x8232BD35}, + {0x40E6, 0x8232BD36}, + {0x40E7, 0x8232BD37}, + {0x40E8, 0x8232BD38}, + {0x40E9, 0x8232BD39}, + {0x40EA, 0x8232BE30}, + {0x40EB, 0x8232BE31}, + {0x40EC, 0x8232BE32}, + {0x40ED, 0x8232BE33}, + {0x40EE, 0x8232BE34}, + {0x40EF, 0x8232BE35}, + {0x40F0, 0x8232BE36}, + {0x40F1, 0x8232BE37}, + {0x40F2, 0x8232BE38}, + {0x40F3, 0x8232BE39}, + {0x40F4, 0x8232BF30}, + {0x40F5, 0x8232BF31}, + {0x40F6, 0x8232BF32}, + {0x40F7, 0x8232BF33}, + {0x40F8, 0x8232BF34}, + {0x40F9, 0x8232BF35}, + {0x40FA, 0x8232BF36}, + {0x40FB, 0x8232BF37}, + {0x40FC, 0x8232BF38}, + {0x40FD, 0x8232BF39}, + {0x40FE, 0x8232C030}, + {0x40FF, 0x8232C031}, + {0x4100, 0x8232C032}, + {0x4101, 0x8232C033}, + {0x4102, 0x8232C034}, + {0x4103, 0x8232C035}, + {0x4104, 0x8232C036}, + {0x4105, 0x8232C037}, + {0x4106, 0x8232C038}, + {0x4107, 0x8232C039}, + {0x4108, 0x8232C130}, + {0x4109, 0x8232C131}, + {0x410A, 0x8232C132}, + {0x410B, 0x8232C133}, + {0x410C, 0x8232C134}, + {0x410D, 0x8232C135}, + {0x410E, 0x8232C136}, + {0x410F, 0x8232C137}, + {0x4110, 0x8232C138}, + {0x4111, 0x8232C139}, + {0x4112, 0x8232C230}, + {0x4113, 0x8232C231}, + {0x4114, 0x8232C232}, + {0x4115, 0x8232C233}, + {0x4116, 0x8232C234}, + {0x4117, 0x8232C235}, + {0x4118, 0x8232C236}, + {0x4119, 0x8232C237}, + {0x411A, 0x8232C238}, + {0x411B, 0x8232C239}, + {0x411C, 0x8232C330}, + {0x411D, 0x8232C331}, + {0x411E, 0x8232C332}, + {0x411F, 0x8232C333}, + {0x4120, 0x8232C334}, + {0x4121, 0x8232C335}, + {0x4122, 0x8232C336}, + {0x4123, 0x8232C337}, + {0x4124, 0x8232C338}, + {0x4125, 0x8232C339}, + {0x4126, 0x8232C430}, + {0x4127, 0x8232C431}, + {0x4128, 0x8232C432}, + {0x4129, 0x8232C433}, + {0x412A, 0x8232C434}, + {0x412B, 0x8232C435}, + {0x412C, 0x8232C436}, + {0x412D, 0x8232C437}, + {0x412E, 0x8232C438}, + {0x412F, 0x8232C439}, + {0x4130, 0x8232C530}, + {0x4131, 0x8232C531}, + {0x4132, 0x8232C532}, + {0x4133, 0x8232C533}, + {0x4134, 0x8232C534}, + {0x4135, 0x8232C535}, + {0x4136, 0x8232C536}, + {0x4137, 0x8232C537}, + {0x4138, 0x8232C538}, + {0x4139, 0x8232C539}, + {0x413A, 0x8232C630}, + {0x413B, 0x8232C631}, + {0x413C, 0x8232C632}, + {0x413D, 0x8232C633}, + {0x413E, 0x8232C634}, + {0x413F, 0x8232C635}, + {0x4140, 0x8232C636}, + {0x4141, 0x8232C637}, + {0x4142, 0x8232C638}, + {0x4143, 0x8232C639}, + {0x4144, 0x8232C730}, + {0x4145, 0x8232C731}, + {0x4146, 0x8232C732}, + {0x4147, 0x8232C733}, + {0x4148, 0x8232C734}, + {0x4149, 0x8232C735}, + {0x414A, 0x8232C736}, + {0x414B, 0x8232C737}, + {0x414C, 0x8232C738}, + {0x414D, 0x8232C739}, + {0x414E, 0x8232C830}, + {0x414F, 0x8232C831}, + {0x4150, 0x8232C832}, + {0x4151, 0x8232C833}, + {0x4152, 0x8232C834}, + {0x4153, 0x8232C835}, + {0x4154, 0x8232C836}, + {0x4155, 0x8232C837}, + {0x4156, 0x8232C838}, + {0x4157, 0x8232C839}, + {0x4158, 0x8232C930}, + {0x4159, 0x8232C931}, + {0x415A, 0x8232C932}, + {0x415B, 0x8232C933}, + {0x415C, 0x8232C934}, + {0x415D, 0x8232C935}, + {0x415E, 0x8232C936}, + {0x4338, 0x8232F838}, + {0x4339, 0x8232F839}, + {0x433A, 0x8232F930}, + {0x433B, 0x8232F931}, + {0x433C, 0x8232F932}, + {0x433D, 0x8232F933}, + {0x433E, 0x8232F934}, + {0x433F, 0x8232F935}, + {0x4340, 0x8232F936}, + {0x4341, 0x8232F937}, + {0x4342, 0x8232F938}, + {0x4343, 0x8232F939}, + {0x4344, 0x8232FA30}, + {0x4345, 0x8232FA31}, + {0x4346, 0x8232FA32}, + {0x4347, 0x8232FA33}, + {0x4348, 0x8232FA34}, + {0x4349, 0x8232FA35}, + {0x434A, 0x8232FA36}, + {0x434B, 0x8232FA37}, + {0x434C, 0x8232FA38}, + {0x434D, 0x8232FA39}, + {0x434E, 0x8232FB30}, + {0x434F, 0x8232FB31}, + {0x4350, 0x8232FB32}, + {0x4351, 0x8232FB33}, + {0x4352, 0x8232FB34}, + {0x4353, 0x8232FB35}, + {0x4354, 0x8232FB36}, + {0x4355, 0x8232FB37}, + {0x4356, 0x8232FB38}, + {0x4357, 0x8232FB39}, + {0x4358, 0x8232FC30}, + {0x4359, 0x8232FC31}, + {0x435A, 0x8232FC32}, + {0x435B, 0x8232FC33}, + {0x435C, 0x8232FC34}, + {0x435D, 0x8232FC35}, + {0x435E, 0x8232FC36}, + {0x435F, 0x8232FC37}, + {0x4360, 0x8232FC38}, + {0x4361, 0x8232FC39}, + {0x4362, 0x8232FD30}, + {0x4363, 0x8232FD31}, + {0x4364, 0x8232FD32}, + {0x4365, 0x8232FD33}, + {0x4366, 0x8232FD34}, + {0x4367, 0x8232FD35}, + {0x4368, 0x8232FD36}, + {0x4369, 0x8232FD37}, + {0x436A, 0x8232FD38}, + {0x436B, 0x8232FD39}, + {0x436C, 0x8232FE30}, + {0x436D, 0x8232FE31}, + {0x436E, 0x8232FE32}, + {0x436F, 0x8232FE33}, + {0x4370, 0x8232FE34}, + {0x4371, 0x8232FE35}, + {0x4372, 0x8232FE36}, + {0x4373, 0x8232FE37}, + {0x4374, 0x8232FE38}, + {0x4375, 0x8232FE39}, + {0x4376, 0x82338130}, + {0x4377, 0x82338131}, + {0x4378, 0x82338132}, + {0x4379, 0x82338133}, + {0x437A, 0x82338134}, + {0x437B, 0x82338135}, + {0x437C, 0x82338136}, + {0x437D, 0x82338137}, + {0x437E, 0x82338138}, + {0x437F, 0x82338139}, + {0x4380, 0x82338230}, + {0x4381, 0x82338231}, + {0x4382, 0x82338232}, + {0x4383, 0x82338233}, + {0x4384, 0x82338234}, + {0x4385, 0x82338235}, + {0x4386, 0x82338236}, + {0x4387, 0x82338237}, + {0x4388, 0x82338238}, + {0x4389, 0x82338239}, + {0x438A, 0x82338330}, + {0x438B, 0x82338331}, + {0x438C, 0x82338332}, + {0x438D, 0x82338333}, + {0x438E, 0x82338334}, + {0x438F, 0x82338335}, + {0x4390, 0x82338336}, + {0x4391, 0x82338337}, + {0x4392, 0x82338338}, + {0x4393, 0x82338339}, + {0x4394, 0x82338430}, + {0x4395, 0x82338431}, + {0x4396, 0x82338432}, + {0x4397, 0x82338433}, + {0x4398, 0x82338434}, + {0x4399, 0x82338435}, + {0x439A, 0x82338436}, + {0x439B, 0x82338437}, + {0x439C, 0x82338438}, + {0x439D, 0x82338439}, + {0x439E, 0x82338530}, + {0x439F, 0x82338531}, + {0x43A0, 0x82338532}, + {0x43A1, 0x82338533}, + {0x43A2, 0x82338534}, + {0x43A3, 0x82338535}, + {0x43A4, 0x82338536}, + {0x43A5, 0x82338537}, + {0x43A6, 0x82338538}, + {0x43A7, 0x82338539}, + {0x43A8, 0x82338630}, + {0x43A9, 0x82338631}, + {0x43AA, 0x82338632}, + {0x43AB, 0x82338633}, + {0x43AD, 0x82338634}, + {0x43AE, 0x82338635}, + {0x43AF, 0x82338636}, + {0x43B0, 0x82338637}, + {0x43B2, 0x82338638}, + {0x43B3, 0x82338639}, + {0x43B4, 0x82338730}, + {0x43B5, 0x82338731}, + {0x43B6, 0x82338732}, + {0x43B7, 0x82338733}, + {0x43B8, 0x82338734}, + {0x43B9, 0x82338735}, + {0x43BA, 0x82338736}, + {0x43BB, 0x82338737}, + {0x43BC, 0x82338738}, + {0x43BD, 0x82338739}, + {0x43BE, 0x82338830}, + {0x43BF, 0x82338831}, + {0x43C0, 0x82338832}, + {0x43C1, 0x82338833}, + {0x43C2, 0x82338834}, + {0x43C3, 0x82338835}, + {0x43C4, 0x82338836}, + {0x43C5, 0x82338837}, + {0x43C6, 0x82338838}, + {0x43C7, 0x82338839}, + {0x43C8, 0x82338930}, + {0x43C9, 0x82338931}, + {0x43CA, 0x82338932}, + {0x43CB, 0x82338933}, + {0x43CC, 0x82338934}, + {0x43CD, 0x82338935}, + {0x43CE, 0x82338936}, + {0x43CF, 0x82338937}, + {0x43D0, 0x82338938}, + {0x43D1, 0x82338939}, + {0x43D2, 0x82338A30}, + {0x43D3, 0x82338A31}, + {0x43D4, 0x82338A32}, + {0x43D5, 0x82338A33}, + {0x43D6, 0x82338A34}, + {0x43D7, 0x82338A35}, + {0x43D8, 0x82338A36}, + {0x43D9, 0x82338A37}, + {0x43DA, 0x82338A38}, + {0x43DB, 0x82338A39}, + {0x43DC, 0x82338B30}, + {0x43DE, 0x82338B31}, + {0x43DF, 0x82338B32}, + {0x43E0, 0x82338B33}, + {0x43E1, 0x82338B34}, + {0x43E2, 0x82338B35}, + {0x43E3, 0x82338B36}, + {0x43E4, 0x82338B37}, + {0x43E5, 0x82338B38}, + {0x43E6, 0x82338B39}, + {0x43E7, 0x82338C30}, + {0x43E8, 0x82338C31}, + {0x43E9, 0x82338C32}, + {0x43EA, 0x82338C33}, + {0x43EB, 0x82338C34}, + {0x43EC, 0x82338C35}, + {0x43ED, 0x82338C36}, + {0x43EE, 0x82338C37}, + {0x43EF, 0x82338C38}, + {0x43F0, 0x82338C39}, + {0x43F1, 0x82338D30}, + {0x43F2, 0x82338D31}, + {0x43F3, 0x82338D32}, + {0x43F4, 0x82338D33}, + {0x43F5, 0x82338D34}, + {0x43F6, 0x82338D35}, + {0x43F7, 0x82338D36}, + {0x43F8, 0x82338D37}, + {0x43F9, 0x82338D38}, + {0x43FA, 0x82338D39}, + {0x43FB, 0x82338E30}, + {0x43FC, 0x82338E31}, + {0x43FD, 0x82338E32}, + {0x43FE, 0x82338E33}, + {0x43FF, 0x82338E34}, + {0x4400, 0x82338E35}, + {0x4401, 0x82338E36}, + {0x4402, 0x82338E37}, + {0x4403, 0x82338E38}, + {0x4404, 0x82338E39}, + {0x4405, 0x82338F30}, + {0x4406, 0x82338F31}, + {0x4407, 0x82338F32}, + {0x4408, 0x82338F33}, + {0x4409, 0x82338F34}, + {0x440A, 0x82338F35}, + {0x440B, 0x82338F36}, + {0x440C, 0x82338F37}, + {0x440D, 0x82338F38}, + {0x440E, 0x82338F39}, + {0x440F, 0x82339030}, + {0x4410, 0x82339031}, + {0x4411, 0x82339032}, + {0x4412, 0x82339033}, + {0x4413, 0x82339034}, + {0x4414, 0x82339035}, + {0x4415, 0x82339036}, + {0x4416, 0x82339037}, + {0x4417, 0x82339038}, + {0x4418, 0x82339039}, + {0x4419, 0x82339130}, + {0x441A, 0x82339131}, + {0x441B, 0x82339132}, + {0x441C, 0x82339133}, + {0x441D, 0x82339134}, + {0x441E, 0x82339135}, + {0x441F, 0x82339136}, + {0x4420, 0x82339137}, + {0x4421, 0x82339138}, + {0x4422, 0x82339139}, + {0x4423, 0x82339230}, + {0x4424, 0x82339231}, + {0x4425, 0x82339232}, + {0x4426, 0x82339233}, + {0x4427, 0x82339234}, + {0x4428, 0x82339235}, + {0x4429, 0x82339236}, + {0x442A, 0x82339237}, + {0x442B, 0x82339238}, + {0x442C, 0x82339239}, + {0x442D, 0x82339330}, + {0x442E, 0x82339331}, + {0x442F, 0x82339332}, + {0x4430, 0x82339333}, + {0x4431, 0x82339334}, + {0x4432, 0x82339335}, + {0x4433, 0x82339336}, + {0x4434, 0x82339337}, + {0x4435, 0x82339338}, + {0x4436, 0x82339339}, + {0x4437, 0x82339430}, + {0x4438, 0x82339431}, + {0x4439, 0x82339432}, + {0x443A, 0x82339433}, + {0x443B, 0x82339434}, + {0x443C, 0x82339435}, + {0x443D, 0x82339436}, + {0x443E, 0x82339437}, + {0x443F, 0x82339438}, + {0x4440, 0x82339439}, + {0x4441, 0x82339530}, + {0x4442, 0x82339531}, + {0x4443, 0x82339532}, + {0x4444, 0x82339533}, + {0x4445, 0x82339534}, + {0x4446, 0x82339535}, + {0x4447, 0x82339536}, + {0x4448, 0x82339537}, + {0x4449, 0x82339538}, + {0x444A, 0x82339539}, + {0x444B, 0x82339630}, + {0x444C, 0x82339631}, + {0x444D, 0x82339632}, + {0x444E, 0x82339633}, + {0x444F, 0x82339634}, + {0x4450, 0x82339635}, + {0x4451, 0x82339636}, + {0x4452, 0x82339637}, + {0x4453, 0x82339638}, + {0x4454, 0x82339639}, + {0x4455, 0x82339730}, + {0x4456, 0x82339731}, + {0x4457, 0x82339732}, + {0x4458, 0x82339733}, + {0x4459, 0x82339734}, + {0x445A, 0x82339735}, + {0x445B, 0x82339736}, + {0x445C, 0x82339737}, + {0x445D, 0x82339738}, + {0x445E, 0x82339739}, + {0x445F, 0x82339830}, + {0x4460, 0x82339831}, + {0x4461, 0x82339832}, + {0x4462, 0x82339833}, + {0x4463, 0x82339834}, + {0x4464, 0x82339835}, + {0x4465, 0x82339836}, + {0x4466, 0x82339837}, + {0x4467, 0x82339838}, + {0x4468, 0x82339839}, + {0x4469, 0x82339930}, + {0x446A, 0x82339931}, + {0x446B, 0x82339932}, + {0x446C, 0x82339933}, + {0x446D, 0x82339934}, + {0x446E, 0x82339935}, + {0x446F, 0x82339936}, + {0x4470, 0x82339937}, + {0x4471, 0x82339938}, + {0x4472, 0x82339939}, + {0x4473, 0x82339A30}, + {0x4474, 0x82339A31}, + {0x4475, 0x82339A32}, + {0x4476, 0x82339A33}, + {0x4477, 0x82339A34}, + {0x4478, 0x82339A35}, + {0x4479, 0x82339A36}, + {0x447A, 0x82339A37}, + {0x447B, 0x82339A38}, + {0x447C, 0x82339A39}, + {0x447D, 0x82339B30}, + {0x447E, 0x82339B31}, + {0x447F, 0x82339B32}, + {0x4480, 0x82339B33}, + {0x4481, 0x82339B34}, + {0x4482, 0x82339B35}, + {0x4483, 0x82339B36}, + {0x4484, 0x82339B37}, + {0x4485, 0x82339B38}, + {0x4486, 0x82339B39}, + {0x4487, 0x82339C30}, + {0x4488, 0x82339C31}, + {0x4489, 0x82339C32}, + {0x448A, 0x82339C33}, + {0x448B, 0x82339C34}, + {0x448C, 0x82339C35}, + {0x448D, 0x82339C36}, + {0x448E, 0x82339C37}, + {0x448F, 0x82339C38}, + {0x4490, 0x82339C39}, + {0x4491, 0x82339D30}, + {0x4492, 0x82339D31}, + {0x4493, 0x82339D32}, + {0x4494, 0x82339D33}, + {0x4495, 0x82339D34}, + {0x4496, 0x82339D35}, + {0x4497, 0x82339D36}, + {0x4498, 0x82339D37}, + {0x4499, 0x82339D38}, + {0x449A, 0x82339D39}, + {0x449B, 0x82339E30}, + {0x449C, 0x82339E31}, + {0x449D, 0x82339E32}, + {0x449E, 0x82339E33}, + {0x449F, 0x82339E34}, + {0x44A0, 0x82339E35}, + {0x44A1, 0x82339E36}, + {0x44A2, 0x82339E37}, + {0x44A3, 0x82339E38}, + {0x44A4, 0x82339E39}, + {0x44A5, 0x82339F30}, + {0x44A6, 0x82339F31}, + {0x44A7, 0x82339F32}, + {0x44A8, 0x82339F33}, + {0x44A9, 0x82339F34}, + {0x44AA, 0x82339F35}, + {0x44AB, 0x82339F36}, + {0x44AC, 0x82339F37}, + {0x44AD, 0x82339F38}, + {0x44AE, 0x82339F39}, + {0x44AF, 0x8233A030}, + {0x44B0, 0x8233A031}, + {0x44B1, 0x8233A032}, + {0x44B2, 0x8233A033}, + {0x44B3, 0x8233A034}, + {0x44B4, 0x8233A035}, + {0x44B5, 0x8233A036}, + {0x44B6, 0x8233A037}, + {0x44B7, 0x8233A038}, + {0x44B8, 0x8233A039}, + {0x44B9, 0x8233A130}, + {0x44BA, 0x8233A131}, + {0x44BB, 0x8233A132}, + {0x44BC, 0x8233A133}, + {0x44BD, 0x8233A134}, + {0x44BE, 0x8233A135}, + {0x44BF, 0x8233A136}, + {0x44C0, 0x8233A137}, + {0x44C1, 0x8233A138}, + {0x44C2, 0x8233A139}, + {0x44C3, 0x8233A230}, + {0x44C4, 0x8233A231}, + {0x44C5, 0x8233A232}, + {0x44C6, 0x8233A233}, + {0x44C7, 0x8233A234}, + {0x44C8, 0x8233A235}, + {0x44C9, 0x8233A236}, + {0x44CA, 0x8233A237}, + {0x44CB, 0x8233A238}, + {0x44CC, 0x8233A239}, + {0x44CD, 0x8233A330}, + {0x44CE, 0x8233A331}, + {0x44CF, 0x8233A332}, + {0x44D0, 0x8233A333}, + {0x44D1, 0x8233A334}, + {0x44D2, 0x8233A335}, + {0x44D3, 0x8233A336}, + {0x44D4, 0x8233A337}, + {0x44D5, 0x8233A338}, + {0x464D, 0x8233C932}, + {0x464E, 0x8233C933}, + {0x464F, 0x8233C934}, + {0x4650, 0x8233C935}, + {0x4651, 0x8233C936}, + {0x4652, 0x8233C937}, + {0x4653, 0x8233C938}, + {0x4654, 0x8233C939}, + {0x4655, 0x8233CA30}, + {0x4656, 0x8233CA31}, + {0x4657, 0x8233CA32}, + {0x4658, 0x8233CA33}, + {0x4659, 0x8233CA34}, + {0x465A, 0x8233CA35}, + {0x465B, 0x8233CA36}, + {0x465C, 0x8233CA37}, + {0x465D, 0x8233CA38}, + {0x465E, 0x8233CA39}, + {0x465F, 0x8233CB30}, + {0x4660, 0x8233CB31}, + {0x4662, 0x8233CB32}, + {0x4663, 0x8233CB33}, + {0x4664, 0x8233CB34}, + {0x4665, 0x8233CB35}, + {0x4666, 0x8233CB36}, + {0x4667, 0x8233CB37}, + {0x4668, 0x8233CB38}, + {0x4669, 0x8233CB39}, + {0x466A, 0x8233CC30}, + {0x466B, 0x8233CC31}, + {0x466C, 0x8233CC32}, + {0x466D, 0x8233CC33}, + {0x466E, 0x8233CC34}, + {0x466F, 0x8233CC35}, + {0x4670, 0x8233CC36}, + {0x4671, 0x8233CC37}, + {0x4672, 0x8233CC38}, + {0x4673, 0x8233CC39}, + {0x4674, 0x8233CD30}, + {0x4675, 0x8233CD31}, + {0x4676, 0x8233CD32}, + {0x4677, 0x8233CD33}, + {0x4678, 0x8233CD34}, + {0x4679, 0x8233CD35}, + {0x467A, 0x8233CD36}, + {0x467B, 0x8233CD37}, + {0x467C, 0x8233CD38}, + {0x467D, 0x8233CD39}, + {0x467E, 0x8233CE30}, + {0x467F, 0x8233CE31}, + {0x4680, 0x8233CE32}, + {0x4681, 0x8233CE33}, + {0x4682, 0x8233CE34}, + {0x4683, 0x8233CE35}, + {0x4684, 0x8233CE36}, + {0x4685, 0x8233CE37}, + {0x4686, 0x8233CE38}, + {0x4687, 0x8233CE39}, + {0x4688, 0x8233CF30}, + {0x4689, 0x8233CF31}, + {0x468A, 0x8233CF32}, + {0x468B, 0x8233CF33}, + {0x468C, 0x8233CF34}, + {0x468D, 0x8233CF35}, + {0x468E, 0x8233CF36}, + {0x468F, 0x8233CF37}, + {0x4690, 0x8233CF38}, + {0x4691, 0x8233CF39}, + {0x4692, 0x8233D030}, + {0x4693, 0x8233D031}, + {0x4694, 0x8233D032}, + {0x4695, 0x8233D033}, + {0x4696, 0x8233D034}, + {0x4697, 0x8233D035}, + {0x4698, 0x8233D036}, + {0x4699, 0x8233D037}, + {0x469A, 0x8233D038}, + {0x469B, 0x8233D039}, + {0x469C, 0x8233D130}, + {0x469D, 0x8233D131}, + {0x469E, 0x8233D132}, + {0x469F, 0x8233D133}, + {0x46A0, 0x8233D134}, + {0x46A1, 0x8233D135}, + {0x46A2, 0x8233D136}, + {0x46A3, 0x8233D137}, + {0x46A4, 0x8233D138}, + {0x46A5, 0x8233D139}, + {0x46A6, 0x8233D230}, + {0x46A7, 0x8233D231}, + {0x46A8, 0x8233D232}, + {0x46A9, 0x8233D233}, + {0x46AA, 0x8233D234}, + {0x46AB, 0x8233D235}, + {0x46AC, 0x8233D236}, + {0x46AD, 0x8233D237}, + {0x46AE, 0x8233D238}, + {0x46AF, 0x8233D239}, + {0x46B0, 0x8233D330}, + {0x46B1, 0x8233D331}, + {0x46B2, 0x8233D332}, + {0x46B3, 0x8233D333}, + {0x46B4, 0x8233D334}, + {0x46B5, 0x8233D335}, + {0x46B6, 0x8233D336}, + {0x46B7, 0x8233D337}, + {0x46B8, 0x8233D338}, + {0x46B9, 0x8233D339}, + {0x46BA, 0x8233D430}, + {0x46BB, 0x8233D431}, + {0x46BC, 0x8233D432}, + {0x46BD, 0x8233D433}, + {0x46BE, 0x8233D434}, + {0x46BF, 0x8233D435}, + {0x46C0, 0x8233D436}, + {0x46C1, 0x8233D437}, + {0x46C2, 0x8233D438}, + {0x46C3, 0x8233D439}, + {0x46C4, 0x8233D530}, + {0x46C5, 0x8233D531}, + {0x46C6, 0x8233D532}, + {0x46C7, 0x8233D533}, + {0x46C8, 0x8233D534}, + {0x46C9, 0x8233D535}, + {0x46CA, 0x8233D536}, + {0x46CB, 0x8233D537}, + {0x46CC, 0x8233D538}, + {0x46CD, 0x8233D539}, + {0x46CE, 0x8233D630}, + {0x46CF, 0x8233D631}, + {0x46D0, 0x8233D632}, + {0x46D1, 0x8233D633}, + {0x46D2, 0x8233D634}, + {0x46D3, 0x8233D635}, + {0x46D4, 0x8233D636}, + {0x46D5, 0x8233D637}, + {0x46D6, 0x8233D638}, + {0x46D7, 0x8233D639}, + {0x46D8, 0x8233D730}, + {0x46D9, 0x8233D731}, + {0x46DA, 0x8233D732}, + {0x46DB, 0x8233D733}, + {0x46DC, 0x8233D734}, + {0x46DD, 0x8233D735}, + {0x46DE, 0x8233D736}, + {0x46DF, 0x8233D737}, + {0x46E0, 0x8233D738}, + {0x46E1, 0x8233D739}, + {0x46E2, 0x8233D830}, + {0x46E3, 0x8233D831}, + {0x46E4, 0x8233D832}, + {0x46E5, 0x8233D833}, + {0x46E6, 0x8233D834}, + {0x46E7, 0x8233D835}, + {0x46E8, 0x8233D836}, + {0x46E9, 0x8233D837}, + {0x46EA, 0x8233D838}, + {0x46EB, 0x8233D839}, + {0x46EC, 0x8233D930}, + {0x46ED, 0x8233D931}, + {0x46EE, 0x8233D932}, + {0x46EF, 0x8233D933}, + {0x46F0, 0x8233D934}, + {0x46F1, 0x8233D935}, + {0x46F2, 0x8233D936}, + {0x46F3, 0x8233D937}, + {0x46F4, 0x8233D938}, + {0x46F5, 0x8233D939}, + {0x46F6, 0x8233DA30}, + {0x46F7, 0x8233DA31}, + {0x46F8, 0x8233DA32}, + {0x46F9, 0x8233DA33}, + {0x46FA, 0x8233DA34}, + {0x46FB, 0x8233DA35}, + {0x46FC, 0x8233DA36}, + {0x46FD, 0x8233DA37}, + {0x46FE, 0x8233DA38}, + {0x46FF, 0x8233DA39}, + {0x4700, 0x8233DB30}, + {0x4701, 0x8233DB31}, + {0x4702, 0x8233DB32}, + {0x4703, 0x8233DB33}, + {0x4704, 0x8233DB34}, + {0x4705, 0x8233DB35}, + {0x4706, 0x8233DB36}, + {0x4707, 0x8233DB37}, + {0x4708, 0x8233DB38}, + {0x4709, 0x8233DB39}, + {0x470A, 0x8233DC30}, + {0x470B, 0x8233DC31}, + {0x470C, 0x8233DC32}, + {0x470D, 0x8233DC33}, + {0x470E, 0x8233DC34}, + {0x470F, 0x8233DC35}, + {0x4710, 0x8233DC36}, + {0x4711, 0x8233DC37}, + {0x4712, 0x8233DC38}, + {0x4713, 0x8233DC39}, + {0x4714, 0x8233DD30}, + {0x4715, 0x8233DD31}, + {0x4716, 0x8233DD32}, + {0x4717, 0x8233DD33}, + {0x4718, 0x8233DD34}, + {0x4719, 0x8233DD35}, + {0x471A, 0x8233DD36}, + {0x471B, 0x8233DD37}, + {0x471C, 0x8233DD38}, + {0x471D, 0x8233DD39}, + {0x471E, 0x8233DE30}, + {0x471F, 0x8233DE31}, + {0x4720, 0x8233DE32}, + {0x4721, 0x8233DE33}, + {0x4722, 0x8233DE34}, + {0x4724, 0x8233DE35}, + {0x4725, 0x8233DE36}, + {0x4726, 0x8233DE37}, + {0x4727, 0x8233DE38}, + {0x4728, 0x8233DE39}, + {0x472A, 0x8233DF30}, + {0x472B, 0x8233DF31}, + {0x472C, 0x8233DF32}, + {0x472D, 0x8233DF33}, + {0x472E, 0x8233DF34}, + {0x472F, 0x8233DF35}, + {0x4730, 0x8233DF36}, + {0x4731, 0x8233DF37}, + {0x4732, 0x8233DF38}, + {0x4733, 0x8233DF39}, + {0x4734, 0x8233E030}, + {0x4735, 0x8233E031}, + {0x4736, 0x8233E032}, + {0x4737, 0x8233E033}, + {0x4738, 0x8233E034}, + {0x4739, 0x8233E035}, + {0x473A, 0x8233E036}, + {0x473B, 0x8233E037}, + {0x473C, 0x8233E038}, + {0x473D, 0x8233E039}, + {0x473E, 0x8233E130}, + {0x473F, 0x8233E131}, + {0x4740, 0x8233E132}, + {0x4741, 0x8233E133}, + {0x4742, 0x8233E134}, + {0x4743, 0x8233E135}, + {0x4744, 0x8233E136}, + {0x4745, 0x8233E137}, + {0x4746, 0x8233E138}, + {0x4747, 0x8233E139}, + {0x4748, 0x8233E230}, + {0x4749, 0x8233E231}, + {0x474A, 0x8233E232}, + {0x474B, 0x8233E233}, + {0x474C, 0x8233E234}, + {0x474D, 0x8233E235}, + {0x474E, 0x8233E236}, + {0x474F, 0x8233E237}, + {0x4750, 0x8233E238}, + {0x4751, 0x8233E239}, + {0x4752, 0x8233E330}, + {0x4753, 0x8233E331}, + {0x4754, 0x8233E332}, + {0x4755, 0x8233E333}, + {0x4756, 0x8233E334}, + {0x4757, 0x8233E335}, + {0x4758, 0x8233E336}, + {0x4759, 0x8233E337}, + {0x475A, 0x8233E338}, + {0x475B, 0x8233E339}, + {0x475C, 0x8233E430}, + {0x475D, 0x8233E431}, + {0x475E, 0x8233E432}, + {0x475F, 0x8233E433}, + {0x4760, 0x8233E434}, + {0x4761, 0x8233E435}, + {0x4762, 0x8233E436}, + {0x4763, 0x8233E437}, + {0x4764, 0x8233E438}, + {0x4765, 0x8233E439}, + {0x4766, 0x8233E530}, + {0x4767, 0x8233E531}, + {0x4768, 0x8233E532}, + {0x4769, 0x8233E533}, + {0x476A, 0x8233E534}, + {0x476B, 0x8233E535}, + {0x476C, 0x8233E536}, + {0x476D, 0x8233E537}, + {0x476E, 0x8233E538}, + {0x476F, 0x8233E539}, + {0x4770, 0x8233E630}, + {0x4771, 0x8233E631}, + {0x4772, 0x8233E632}, + {0x4773, 0x8233E633}, + {0x4774, 0x8233E634}, + {0x4775, 0x8233E635}, + {0x4776, 0x8233E636}, + {0x4777, 0x8233E637}, + {0x4778, 0x8233E638}, + {0x4779, 0x8233E639}, + {0x477A, 0x8233E730}, + {0x477B, 0x8233E731}, + {0x477D, 0x8233E732}, + {0x477E, 0x8233E733}, + {0x477F, 0x8233E734}, + {0x4780, 0x8233E735}, + {0x4781, 0x8233E736}, + {0x4782, 0x8233E737}, + {0x4783, 0x8233E738}, + {0x4784, 0x8233E739}, + {0x4785, 0x8233E830}, + {0x4786, 0x8233E831}, + {0x4787, 0x8233E832}, + {0x4788, 0x8233E833}, + {0x4789, 0x8233E834}, + {0x478A, 0x8233E835}, + {0x478B, 0x8233E836}, + {0x478C, 0x8233E837}, + {0x4948, 0x82349639}, + {0x4949, 0x82349730}, + {0x494A, 0x82349731}, + {0x494B, 0x82349732}, + {0x494C, 0x82349733}, + {0x494D, 0x82349734}, + {0x494E, 0x82349735}, + {0x494F, 0x82349736}, + {0x4950, 0x82349737}, + {0x4951, 0x82349738}, + {0x4952, 0x82349739}, + {0x4953, 0x82349830}, + {0x4954, 0x82349831}, + {0x4955, 0x82349832}, + {0x4956, 0x82349833}, + {0x4957, 0x82349834}, + {0x4958, 0x82349835}, + {0x4959, 0x82349836}, + {0x495A, 0x82349837}, + {0x495B, 0x82349838}, + {0x495C, 0x82349839}, + {0x495D, 0x82349930}, + {0x495E, 0x82349931}, + {0x495F, 0x82349932}, + {0x4960, 0x82349933}, + {0x4961, 0x82349934}, + {0x4962, 0x82349935}, + {0x4963, 0x82349936}, + {0x4964, 0x82349937}, + {0x4965, 0x82349938}, + {0x4966, 0x82349939}, + {0x4967, 0x82349A30}, + {0x4968, 0x82349A31}, + {0x4969, 0x82349A32}, + {0x496A, 0x82349A33}, + {0x496B, 0x82349A34}, + {0x496C, 0x82349A35}, + {0x496D, 0x82349A36}, + {0x496E, 0x82349A37}, + {0x496F, 0x82349A38}, + {0x4970, 0x82349A39}, + {0x4971, 0x82349B30}, + {0x4972, 0x82349B31}, + {0x4973, 0x82349B32}, + {0x4974, 0x82349B33}, + {0x4975, 0x82349B34}, + {0x4976, 0x82349B35}, + {0x4977, 0x82349B36}, + {0x4978, 0x82349B37}, + {0x4979, 0x82349B38}, + {0x497B, 0x82349B39}, + {0x497C, 0x82349C30}, + {0x497E, 0x82349C31}, + {0x497F, 0x82349C32}, + {0x4980, 0x82349C33}, + {0x4981, 0x82349C34}, + {0x4984, 0x82349C35}, + {0x4987, 0x82349C36}, + {0x4988, 0x82349C37}, + {0x4989, 0x82349C38}, + {0x498A, 0x82349C39}, + {0x498B, 0x82349D30}, + {0x498C, 0x82349D31}, + {0x498D, 0x82349D32}, + {0x498E, 0x82349D33}, + {0x498F, 0x82349D34}, + {0x4990, 0x82349D35}, + {0x4991, 0x82349D36}, + {0x4992, 0x82349D37}, + {0x4993, 0x82349D38}, + {0x4994, 0x82349D39}, + {0x4995, 0x82349E30}, + {0x4996, 0x82349E31}, + {0x4997, 0x82349E32}, + {0x4998, 0x82349E33}, + {0x4999, 0x82349E34}, + {0x499A, 0x82349E35}, + {0x499C, 0x82349E36}, + {0x499D, 0x82349E37}, + {0x499E, 0x82349E38}, + {0x49A0, 0x82349E39}, + {0x49A1, 0x82349F30}, + {0x49A2, 0x82349F31}, + {0x49A3, 0x82349F32}, + {0x49A4, 0x82349F33}, + {0x49A5, 0x82349F34}, + {0x49A6, 0x82349F35}, + {0x49A7, 0x82349F36}, + {0x49A8, 0x82349F37}, + {0x49A9, 0x82349F38}, + {0x49AA, 0x82349F39}, + {0x49AB, 0x8234A030}, + {0x49AC, 0x8234A031}, + {0x49AD, 0x8234A032}, + {0x49AE, 0x8234A033}, + {0x49AF, 0x8234A034}, + {0x49B0, 0x8234A035}, + {0x49B1, 0x8234A036}, + {0x49B2, 0x8234A037}, + {0x49B3, 0x8234A038}, + {0x49B4, 0x8234A039}, + {0x49B5, 0x8234A130}, + {0x4C78, 0x8234E734}, + {0x4C79, 0x8234E735}, + {0x4C7A, 0x8234E736}, + {0x4C7B, 0x8234E737}, + {0x4C7C, 0x8234E738}, + {0x4C7D, 0x8234E739}, + {0x4C7E, 0x8234E830}, + {0x4C7F, 0x8234E831}, + {0x4C80, 0x8234E832}, + {0x4C81, 0x8234E833}, + {0x4C82, 0x8234E834}, + {0x4C83, 0x8234E835}, + {0x4C84, 0x8234E836}, + {0x4C85, 0x8234E837}, + {0x4C86, 0x8234E838}, + {0x4C87, 0x8234E839}, + {0x4C88, 0x8234E930}, + {0x4C89, 0x8234E931}, + {0x4C8A, 0x8234E932}, + {0x4C8B, 0x8234E933}, + {0x4C8C, 0x8234E934}, + {0x4C8D, 0x8234E935}, + {0x4C8E, 0x8234E936}, + {0x4C8F, 0x8234E937}, + {0x4C90, 0x8234E938}, + {0x4C91, 0x8234E939}, + {0x4C92, 0x8234EA30}, + {0x4C93, 0x8234EA31}, + {0x4C94, 0x8234EA32}, + {0x4C95, 0x8234EA33}, + {0x4C96, 0x8234EA34}, + {0x4C97, 0x8234EA35}, + {0x4C98, 0x8234EA36}, + {0x4C99, 0x8234EA37}, + {0x4C9A, 0x8234EA38}, + {0x4C9B, 0x8234EA39}, + {0x4C9C, 0x8234EB30}, + {0x4C9D, 0x8234EB31}, + {0x4C9E, 0x8234EB32}, + {0x4CA4, 0x8234EB33}, + {0x4CA5, 0x8234EB34}, + {0x4CA6, 0x8234EB35}, + {0x4CA7, 0x8234EB36}, + {0x4CA8, 0x8234EB37}, + {0x4CA9, 0x8234EB38}, + {0x4CAA, 0x8234EB39}, + {0x4CAB, 0x8234EC30}, + {0x4CAC, 0x8234EC31}, + {0x4CAD, 0x8234EC32}, + {0x4CAE, 0x8234EC33}, + {0x4CAF, 0x8234EC34}, + {0x4CB0, 0x8234EC35}, + {0x4CB1, 0x8234EC36}, + {0x4CB2, 0x8234EC37}, + {0x4CB3, 0x8234EC38}, + {0x4CB4, 0x8234EC39}, + {0x4CB5, 0x8234ED30}, + {0x4CB6, 0x8234ED31}, + {0x4CB7, 0x8234ED32}, + {0x4CB8, 0x8234ED33}, + {0x4CB9, 0x8234ED34}, + {0x4CBA, 0x8234ED35}, + {0x4CBB, 0x8234ED36}, + {0x4CBC, 0x8234ED37}, + {0x4CBD, 0x8234ED38}, + {0x4CBE, 0x8234ED39}, + {0x4CBF, 0x8234EE30}, + {0x4CC0, 0x8234EE31}, + {0x4CC1, 0x8234EE32}, + {0x4CC2, 0x8234EE33}, + {0x4CC3, 0x8234EE34}, + {0x4CC4, 0x8234EE35}, + {0x4CC5, 0x8234EE36}, + {0x4CC6, 0x8234EE37}, + {0x4CC7, 0x8234EE38}, + {0x4CC8, 0x8234EE39}, + {0x4CC9, 0x8234EF30}, + {0x4CCA, 0x8234EF31}, + {0x4CCB, 0x8234EF32}, + {0x4CCC, 0x8234EF33}, + {0x4CCD, 0x8234EF34}, + {0x4CCE, 0x8234EF35}, + {0x4CCF, 0x8234EF36}, + {0x4CD0, 0x8234EF37}, + {0x4CD1, 0x8234EF38}, + {0x4CD2, 0x8234EF39}, + {0x4CD3, 0x8234F030}, + {0x4CD4, 0x8234F031}, + {0x4CD5, 0x8234F032}, + {0x4CD6, 0x8234F033}, + {0x4CD7, 0x8234F034}, + {0x4CD8, 0x8234F035}, + {0x4CD9, 0x8234F036}, + {0x4CDA, 0x8234F037}, + {0x4CDB, 0x8234F038}, + {0x4CDC, 0x8234F039}, + {0x4CDD, 0x8234F130}, + {0x4CDE, 0x8234F131}, + {0x4CDF, 0x8234F132}, + {0x4CE0, 0x8234F133}, + {0x4CE1, 0x8234F134}, + {0x4CE2, 0x8234F135}, + {0x4CE3, 0x8234F136}, + {0x4CE4, 0x8234F137}, + {0x4CE5, 0x8234F138}, + {0x4CE6, 0x8234F139}, + {0x4CE7, 0x8234F230}, + {0x4CE8, 0x8234F231}, + {0x4CE9, 0x8234F232}, + {0x4CEA, 0x8234F233}, + {0x4CEB, 0x8234F234}, + {0x4CEC, 0x8234F235}, + {0x4CED, 0x8234F236}, + {0x4CEE, 0x8234F237}, + {0x4CEF, 0x8234F238}, + {0x4CF0, 0x8234F239}, + {0x4CF1, 0x8234F330}, + {0x4CF2, 0x8234F331}, + {0x4CF3, 0x8234F332}, + {0x4CF4, 0x8234F333}, + {0x4CF5, 0x8234F334}, + {0x4CF6, 0x8234F335}, + {0x4CF7, 0x8234F336}, + {0x4CF8, 0x8234F337}, + {0x4CF9, 0x8234F338}, + {0x4CFA, 0x8234F339}, + {0x4CFB, 0x8234F430}, + {0x4CFC, 0x8234F431}, + {0x4CFD, 0x8234F432}, + {0x4CFE, 0x8234F433}, + {0x4CFF, 0x8234F434}, + {0x4D00, 0x8234F435}, + {0x4D01, 0x8234F436}, + {0x4D02, 0x8234F437}, + {0x4D03, 0x8234F438}, + {0x4D04, 0x8234F439}, + {0x4D05, 0x8234F530}, + {0x4D06, 0x8234F531}, + {0x4D07, 0x8234F532}, + {0x4D08, 0x8234F533}, + {0x4D09, 0x8234F534}, + {0x4D0A, 0x8234F535}, + {0x4D0B, 0x8234F536}, + {0x4D0C, 0x8234F537}, + {0x4D0D, 0x8234F538}, + {0x4D0E, 0x8234F539}, + {0x4D0F, 0x8234F630}, + {0x4D10, 0x8234F631}, + {0x4D11, 0x8234F632}, + {0x4D12, 0x8234F633}, + {0x4D1A, 0x8234F634}, + {0x4D1B, 0x8234F635}, + {0x4D1C, 0x8234F636}, + {0x4D1D, 0x8234F637}, + {0x4D1E, 0x8234F638}, + {0x4D1F, 0x8234F639}, + {0x4D20, 0x8234F730}, + {0x4D21, 0x8234F731}, + {0x4D22, 0x8234F732}, + {0x4D23, 0x8234F733}, + {0x4D24, 0x8234F734}, + {0x4D25, 0x8234F735}, + {0x4D26, 0x8234F736}, + {0x4D27, 0x8234F737}, + {0x4D28, 0x8234F738}, + {0x4D29, 0x8234F739}, + {0x4D2A, 0x8234F830}, + {0x4D2B, 0x8234F831}, + {0x4D2C, 0x8234F832}, + {0x4D2D, 0x8234F833}, + {0x4D2E, 0x8234F834}, + {0x4D2F, 0x8234F835}, + {0x4D30, 0x8234F836}, + {0x4D31, 0x8234F837}, + {0x4D32, 0x8234F838}, + {0x4D33, 0x8234F839}, + {0x4D34, 0x8234F930}, + {0x4D35, 0x8234F931}, + {0x4D36, 0x8234F932}, + {0x4D37, 0x8234F933}, + {0x4D38, 0x8234F934}, + {0x4D39, 0x8234F935}, + {0x4D3A, 0x8234F936}, + {0x4D3B, 0x8234F937}, + {0x4D3C, 0x8234F938}, + {0x4D3D, 0x8234F939}, + {0x4D3E, 0x8234FA30}, + {0x4D3F, 0x8234FA31}, + {0x4D40, 0x8234FA32}, + {0x4D41, 0x8234FA33}, + {0x4D42, 0x8234FA34}, + {0x4D43, 0x8234FA35}, + {0x4D44, 0x8234FA36}, + {0x4D45, 0x8234FA37}, + {0x4D46, 0x8234FA38}, + {0x4D47, 0x8234FA39}, + {0x4D48, 0x8234FB30}, + {0x4D49, 0x8234FB31}, + {0x4D4A, 0x8234FB32}, + {0x4D4B, 0x8234FB33}, + {0x4D4C, 0x8234FB34}, + {0x4D4D, 0x8234FB35}, + {0x4D4E, 0x8234FB36}, + {0x4D4F, 0x8234FB37}, + {0x4D50, 0x8234FB38}, + {0x4D51, 0x8234FB39}, + {0x4D52, 0x8234FC30}, + {0x4D53, 0x8234FC31}, + {0x4D54, 0x8234FC32}, + {0x4D55, 0x8234FC33}, + {0x4D56, 0x8234FC34}, + {0x4D57, 0x8234FC35}, + {0x4D58, 0x8234FC36}, + {0x4D59, 0x8234FC37}, + {0x4D5A, 0x8234FC38}, + {0x4D5B, 0x8234FC39}, + {0x4D5C, 0x8234FD30}, + {0x4D5D, 0x8234FD31}, + {0x4D5E, 0x8234FD32}, + {0x4D5F, 0x8234FD33}, + {0x4D60, 0x8234FD34}, + {0x4D61, 0x8234FD35}, + {0x4D62, 0x8234FD36}, + {0x4D63, 0x8234FD37}, + {0x4D64, 0x8234FD38}, + {0x4D65, 0x8234FD39}, + {0x4D66, 0x8234FE30}, + {0x4D67, 0x8234FE31}, + {0x4D68, 0x8234FE32}, + {0x4D69, 0x8234FE33}, + {0x4D6A, 0x8234FE34}, + {0x4D6B, 0x8234FE35}, + {0x4D6C, 0x8234FE36}, + {0x4D6D, 0x8234FE37}, + {0x4D6E, 0x8234FE38}, + {0x4D6F, 0x8234FE39}, + {0x4D70, 0x82358130}, + {0x4D71, 0x82358131}, + {0x4D72, 0x82358132}, + {0x4D73, 0x82358133}, + {0x4D74, 0x82358134}, + {0x4D75, 0x82358135}, + {0x4D76, 0x82358136}, + {0x4D77, 0x82358137}, + {0x4D78, 0x82358138}, + {0x4D79, 0x82358139}, + {0x4D7A, 0x82358230}, + {0x4D7B, 0x82358231}, + {0x4D7C, 0x82358232}, + {0x4D7D, 0x82358233}, + {0x4D7E, 0x82358234}, + {0x4D7F, 0x82358235}, + {0x4D80, 0x82358236}, + {0x4D81, 0x82358237}, + {0x4D82, 0x82358238}, + {0x4D83, 0x82358239}, + {0x4D84, 0x82358330}, + {0x4D85, 0x82358331}, + {0x4D86, 0x82358332}, + {0x4D87, 0x82358333}, + {0x4D88, 0x82358334}, + {0x4D89, 0x82358335}, + {0x4D8A, 0x82358336}, + {0x4D8B, 0x82358337}, + {0x4D8C, 0x82358338}, + {0x4D8D, 0x82358339}, + {0x4D8E, 0x82358430}, + {0x4D8F, 0x82358431}, + {0x4D90, 0x82358432}, + {0x4D91, 0x82358433}, + {0x4D92, 0x82358434}, + {0x4D93, 0x82358435}, + {0x4D94, 0x82358436}, + {0x4D95, 0x82358437}, + {0x4D96, 0x82358438}, + {0x4D97, 0x82358439}, + {0x4D98, 0x82358530}, + {0x4D99, 0x82358531}, + {0x4D9A, 0x82358532}, + {0x4D9B, 0x82358533}, + {0x4D9C, 0x82358534}, + {0x4D9D, 0x82358535}, + {0x4D9E, 0x82358536}, + {0x4D9F, 0x82358537}, + {0x4DA0, 0x82358538}, + {0x4DA1, 0x82358539}, + {0x4DA2, 0x82358630}, + {0x4DA3, 0x82358631}, + {0x4DA4, 0x82358632}, + {0x4DA5, 0x82358633}, + {0x4DA6, 0x82358634}, + {0x4DA7, 0x82358635}, + {0x4DA8, 0x82358636}, + {0x4DA9, 0x82358637}, + {0x4DAA, 0x82358638}, + {0x4DAB, 0x82358639}, + {0x4DAC, 0x82358730}, + {0x4DAD, 0x82358731}, + {0x4DAF, 0x82358732}, + {0x4DB0, 0x82358733}, + {0x4DB1, 0x82358734}, + {0x4DB2, 0x82358735}, + {0x4DB3, 0x82358736}, + {0x4DB4, 0x82358737}, + {0x4DB5, 0x82358738}, + {0x4DB6, 0x82358739}, + {0x4DB7, 0x82358830}, + {0x4DB8, 0x82358831}, + {0x4DB9, 0x82358832}, + {0x4DBA, 0x82358833}, + {0x4DBB, 0x82358834}, + {0x4DBC, 0x82358835}, + {0x4DBD, 0x82358836}, + {0x4DBE, 0x82358837}, + {0x4DBF, 0x82358838}, + {0x4DC0, 0x82358839}, + {0x4DC1, 0x82358930}, + {0x4DC2, 0x82358931}, + {0x4DC3, 0x82358932}, + {0x4DC4, 0x82358933}, + {0x4DC5, 0x82358934}, + {0x4DC6, 0x82358935}, + {0x4DC7, 0x82358936}, + {0x4DC8, 0x82358937}, + {0x4DC9, 0x82358938}, + {0x4DCA, 0x82358939}, + {0x4DCB, 0x82358A30}, + {0x4DCC, 0x82358A31}, + {0x4DCD, 0x82358A32}, + {0x4DCE, 0x82358A33}, + {0x4DCF, 0x82358A34}, + {0x4DD0, 0x82358A35}, + {0x4DD1, 0x82358A36}, + {0x4DD2, 0x82358A37}, + {0x4DD3, 0x82358A38}, + {0x4DD4, 0x82358A39}, + {0x4DD5, 0x82358B30}, + {0x4DD6, 0x82358B31}, + {0x4DD7, 0x82358B32}, + {0x4DD8, 0x82358B33}, + {0x4DD9, 0x82358B34}, + {0x4DDA, 0x82358B35}, + {0x4DDB, 0x82358B36}, + {0x4DDC, 0x82358B37}, + {0x4DDD, 0x82358B38}, + {0x4DDE, 0x82358B39}, + {0x4DDF, 0x82358C30}, + {0x4DE0, 0x82358C31}, + {0x4DE1, 0x82358C32}, + {0x4DE2, 0x82358C33}, + {0x4DE3, 0x82358C34}, + {0x4DE4, 0x82358C35}, + {0x4DE5, 0x82358C36}, + {0x4DE6, 0x82358C37}, + {0x4DE7, 0x82358C38}, + {0x4DE8, 0x82358C39}, + {0x4DE9, 0x82358D30}, + {0x4DEA, 0x82358D31}, + {0x4DEB, 0x82358D32}, + {0x4DEC, 0x82358D33}, + {0x4DED, 0x82358D34}, + {0x4DEE, 0x82358D35}, + {0x4DEF, 0x82358D36}, + {0x4DF0, 0x82358D37}, + {0x4DF1, 0x82358D38}, + {0x4DF2, 0x82358D39}, + {0x4DF3, 0x82358E30}, + {0x4DF4, 0x82358E31}, + {0x4DF5, 0x82358E32}, + {0x4DF6, 0x82358E33}, + {0x4DF7, 0x82358E34}, + {0x4DF8, 0x82358E35}, + {0x4DF9, 0x82358E36}, + {0x4DFA, 0x82358E37}, + {0x4DFB, 0x82358E38}, + {0x4DFC, 0x82358E39}, + {0x4DFD, 0x82358F30}, + {0x4DFE, 0x82358F31}, + {0x4DFF, 0x82358F32}, + {0xE76C, 0x8336C739}, + {0xE7C7, 0x8135F437}, + {0xE7C8, 0x8336C830}, + {0xE7E7, 0x8336C831}, + {0xE7E8, 0x8336C832}, + {0xE7E9, 0x8336C833}, + {0xE7EA, 0x8336C834}, + {0xE7EB, 0x8336C835}, + {0xE7EC, 0x8336C836}, + {0xE7ED, 0x8336C837}, + {0xE7EE, 0x8336C838}, + {0xE7EF, 0x8336C839}, + {0xE7F0, 0x8336C930}, + {0xE7F1, 0x8336C931}, + {0xE7F2, 0x8336C932}, + {0xE7F3, 0x8336C933}, + {0xE815, 0x8336C934}, + {0xE819, 0x8336C935}, + {0xE81A, 0x8336C936}, + {0xE81B, 0x8336C937}, + {0xE81C, 0x8336C938}, + {0xE81D, 0x8336C939}, + {0xE81F, 0x8336CA30}, + {0xE820, 0x8336CA31}, + {0xE821, 0x8336CA32}, + {0xE822, 0x8336CA33}, + {0xE823, 0x8336CA34}, + {0xE824, 0x8336CA35}, + {0xE825, 0x8336CA36}, + {0xE827, 0x8336CA37}, + {0xE828, 0x8336CA38}, + {0xE829, 0x8336CA39}, + {0xE82A, 0x8336CB30}, + {0xE82D, 0x8336CB31}, + {0xE82E, 0x8336CB32}, + {0xE82F, 0x8336CB33}, + {0xE830, 0x8336CB34}, + {0xE833, 0x8336CB35}, + {0xE834, 0x8336CB36}, + {0xE835, 0x8336CB37}, + {0xE836, 0x8336CB38}, + {0xE837, 0x8336CB39}, + {0xE838, 0x8336CC30}, + {0xE839, 0x8336CC31}, + {0xE83A, 0x8336CC32}, + {0xE83C, 0x8336CC33}, + {0xE83D, 0x8336CC34}, + {0xE83E, 0x8336CC35}, + {0xE83F, 0x8336CC36}, + {0xE840, 0x8336CC37}, + {0xE841, 0x8336CC38}, + {0xE842, 0x8336CC39}, + {0xE844, 0x8336CD30}, + {0xE845, 0x8336CD31}, + {0xE846, 0x8336CD32}, + {0xE847, 0x8336CD33}, + {0xE848, 0x8336CD34}, + {0xE849, 0x8336CD35}, + {0xE84A, 0x8336CD36}, + {0xE84B, 0x8336CD37}, + {0xE84C, 0x8336CD38}, + {0xE84D, 0x8336CD39}, + {0xE84E, 0x8336CE30}, + {0xE84F, 0x8336CE31}, + {0xE850, 0x8336CE32}, + {0xE851, 0x8336CE33}, + {0xE852, 0x8336CE34}, + {0xE853, 0x8336CE35}, + {0xE856, 0x8336CE36}, + {0xE857, 0x8336CE37}, + {0xE858, 0x8336CE38}, + {0xE859, 0x8336CE39}, + {0xE85A, 0x8336CF30}, + {0xE85B, 0x8336CF31}, + {0xE85C, 0x8336CF32}, + {0xE85D, 0x8336CF33}, + {0xE85E, 0x8336CF34}, + {0xE85F, 0x8336CF35}, + {0xE860, 0x8336CF36}, + {0xE861, 0x8336CF37}, + {0xE862, 0x8336CF38}, + {0xE863, 0x8336CF39}, + {0xF92D, 0x84308535}, + {0xF92E, 0x84308536}, + {0xF92F, 0x84308537}, + {0xF930, 0x84308538}, + {0xF931, 0x84308539}, + {0xF932, 0x84308630}, + {0xF933, 0x84308631}, + {0xF934, 0x84308632}, + {0xF935, 0x84308633}, + {0xF936, 0x84308634}, + {0xF937, 0x84308635}, + {0xF938, 0x84308636}, + {0xF939, 0x84308637}, + {0xF93A, 0x84308638}, + {0xF93B, 0x84308639}, + {0xF93C, 0x84308730}, + {0xF93D, 0x84308731}, + {0xF93E, 0x84308732}, + {0xF93F, 0x84308733}, + {0xF940, 0x84308734}, + {0xF941, 0x84308735}, + {0xF942, 0x84308736}, + {0xF943, 0x84308737}, + {0xF944, 0x84308738}, + {0xF945, 0x84308739}, + {0xF946, 0x84308830}, + {0xF947, 0x84308831}, + {0xF948, 0x84308832}, + {0xF949, 0x84308833}, + {0xF94A, 0x84308834}, + {0xF94B, 0x84308835}, + {0xF94C, 0x84308836}, + {0xF94D, 0x84308837}, + {0xF94E, 0x84308838}, + {0xF94F, 0x84308839}, + {0xF950, 0x84308930}, + {0xF951, 0x84308931}, + {0xF952, 0x84308932}, + {0xF953, 0x84308933}, + {0xF954, 0x84308934}, + {0xF955, 0x84308935}, + {0xF956, 0x84308936}, + {0xF957, 0x84308937}, + {0xF958, 0x84308938}, + {0xF959, 0x84308939}, + {0xF95A, 0x84308A30}, + {0xF95B, 0x84308A31}, + {0xF95C, 0x84308A32}, + {0xF95D, 0x84308A33}, + {0xF95E, 0x84308A34}, + {0xF95F, 0x84308A35}, + {0xF960, 0x84308A36}, + {0xF961, 0x84308A37}, + {0xF962, 0x84308A38}, + {0xF963, 0x84308A39}, + {0xF964, 0x84308B30}, + {0xF965, 0x84308B31}, + {0xF966, 0x84308B32}, + {0xF967, 0x84308B33}, + {0xF968, 0x84308B34}, + {0xF969, 0x84308B35}, + {0xF96A, 0x84308B36}, + {0xF96B, 0x84308B37}, + {0xF96C, 0x84308B38}, + {0xF96D, 0x84308B39}, + {0xF96E, 0x84308C30}, + {0xF96F, 0x84308C31}, + {0xF970, 0x84308C32}, + {0xF971, 0x84308C33}, + {0xF972, 0x84308C34}, + {0xF973, 0x84308C35}, + {0xF974, 0x84308C36}, + {0xF975, 0x84308C37}, + {0xF976, 0x84308C38}, + {0xF977, 0x84308C39}, + {0xF978, 0x84308D30}, + {0xF97A, 0x84308D31}, + {0xF97B, 0x84308D32}, + {0xF97C, 0x84308D33}, + {0xF97D, 0x84308D34}, + {0xF97E, 0x84308D35}, + {0xF97F, 0x84308D36}, + {0xF980, 0x84308D37}, + {0xF981, 0x84308D38}, + {0xF982, 0x84308D39}, + {0xF983, 0x84308E30}, + {0xF984, 0x84308E31}, + {0xF985, 0x84308E32}, + {0xF986, 0x84308E33}, + {0xF987, 0x84308E34}, + {0xF988, 0x84308E35}, + {0xF989, 0x84308E36}, + {0xF98A, 0x84308E37}, + {0xF98B, 0x84308E38}, + {0xF98C, 0x84308E39}, + {0xF98D, 0x84308F30}, + {0xF98E, 0x84308F31}, + {0xF98F, 0x84308F32}, + {0xF990, 0x84308F33}, + {0xF991, 0x84308F34}, + {0xF992, 0x84308F35}, + {0xF993, 0x84308F36}, + {0xF994, 0x84308F37}, + {0xF996, 0x84308F38}, + {0xF997, 0x84308F39}, + {0xF998, 0x84309030}, + {0xF999, 0x84309031}, + {0xF99A, 0x84309032}, + {0xF99B, 0x84309033}, + {0xF99C, 0x84309034}, + {0xF99D, 0x84309035}, + {0xF99E, 0x84309036}, + {0xF99F, 0x84309037}, + {0xF9A0, 0x84309038}, + {0xF9A1, 0x84309039}, + {0xF9A2, 0x84309130}, + {0xF9A3, 0x84309131}, + {0xF9A4, 0x84309132}, + {0xF9A5, 0x84309133}, + {0xF9A6, 0x84309134}, + {0xF9A7, 0x84309135}, + {0xF9A8, 0x84309136}, + {0xF9A9, 0x84309137}, + {0xF9AA, 0x84309138}, + {0xF9AB, 0x84309139}, + {0xF9AC, 0x84309230}, + {0xF9AD, 0x84309231}, + {0xF9AE, 0x84309232}, + {0xF9AF, 0x84309233}, + {0xF9B0, 0x84309234}, + {0xF9B1, 0x84309235}, + {0xF9B2, 0x84309236}, + {0xF9B3, 0x84309237}, + {0xF9B4, 0x84309238}, + {0xF9B5, 0x84309239}, + {0xF9B6, 0x84309330}, + {0xF9B7, 0x84309331}, + {0xF9B8, 0x84309332}, + {0xF9B9, 0x84309333}, + {0xF9BA, 0x84309334}, + {0xF9BB, 0x84309335}, + {0xF9BC, 0x84309336}, + {0xF9BD, 0x84309337}, + {0xF9BE, 0x84309338}, + {0xF9BF, 0x84309339}, + {0xF9C0, 0x84309430}, + {0xF9C1, 0x84309431}, + {0xF9C2, 0x84309432}, + {0xF9C3, 0x84309433}, + {0xF9C4, 0x84309434}, + {0xF9C5, 0x84309435}, + {0xF9C6, 0x84309436}, + {0xF9C7, 0x84309437}, + {0xF9C8, 0x84309438}, + {0xF9C9, 0x84309439}, + {0xF9CA, 0x84309530}, + {0xF9CB, 0x84309531}, + {0xF9CC, 0x84309532}, + {0xF9CD, 0x84309533}, + {0xF9CE, 0x84309534}, + {0xF9CF, 0x84309535}, + {0xF9D0, 0x84309536}, + {0xF9D1, 0x84309537}, + {0xF9D2, 0x84309538}, + {0xF9D3, 0x84309539}, + {0xF9D4, 0x84309630}, + {0xF9D5, 0x84309631}, + {0xF9D6, 0x84309632}, + {0xF9D7, 0x84309633}, + {0xF9D8, 0x84309634}, + {0xF9D9, 0x84309635}, + {0xF9DA, 0x84309636}, + {0xF9DB, 0x84309637}, + {0xF9DC, 0x84309638}, + {0xF9DD, 0x84309639}, + {0xF9DE, 0x84309730}, + {0xF9DF, 0x84309731}, + {0xF9E0, 0x84309732}, + {0xF9E1, 0x84309733}, + {0xF9E2, 0x84309734}, + {0xF9E3, 0x84309735}, + {0xF9E4, 0x84309736}, + {0xF9E5, 0x84309737}, + {0xF9E6, 0x84309738}, + {0xF9E8, 0x84309739}, + {0xF9E9, 0x84309830}, + {0xF9EA, 0x84309831}, + {0xF9EB, 0x84309832}, + {0xF9EC, 0x84309833}, + {0xF9ED, 0x84309834}, + {0xF9EE, 0x84309835}, + {0xF9EF, 0x84309836}, + {0xF9F0, 0x84309837}, + {0xF9F2, 0x84309838}, + {0xF9F3, 0x84309839}, + {0xF9F4, 0x84309930}, + {0xF9F5, 0x84309931}, + {0xF9F6, 0x84309932}, + {0xF9F7, 0x84309933}, + {0xF9F8, 0x84309934}, + {0xF9F9, 0x84309935}, + {0xF9FA, 0x84309936}, + {0xF9FB, 0x84309937}, + {0xF9FC, 0x84309938}, + {0xF9FD, 0x84309939}, + {0xF9FE, 0x84309A30}, + {0xF9FF, 0x84309A31}, + {0xFA00, 0x84309A32}, + {0xFA01, 0x84309A33}, + {0xFA02, 0x84309A34}, + {0xFA03, 0x84309A35}, + {0xFA04, 0x84309A36}, + {0xFA05, 0x84309A37}, + {0xFA06, 0x84309A38}, + {0xFA07, 0x84309A39}, + {0xFA08, 0x84309B30}, + {0xFA09, 0x84309B31}, + {0xFA0A, 0x84309B32}, + {0xFA0B, 0x84309B33}, + {0xFA10, 0x84309B34}, + {0xFA12, 0x84309B35}, + {0xFA15, 0x84309B36}, + {0xFA16, 0x84309B37}, + {0xFA17, 0x84309B38}, + {0xFA19, 0x84309B39}, + {0xFA1A, 0x84309C30}, + {0xFA1B, 0x84309C31}, + {0xFA1C, 0x84309C32}, + {0xFA1D, 0x84309C33}, + {0xFA1E, 0x84309C34}, + {0xFA22, 0x84309C35}, + {0xFA25, 0x84309C36}, + {0xFA26, 0x84309C37}, + {0xFE32, 0x84318538}, + {0xFE45, 0x84318539}, + {0xFE46, 0x84318630}, + {0xFE47, 0x84318631}, + {0xFE48, 0x84318632}, + {0xFE53, 0x84318633}, + {0xFE58, 0x84318634}, + {0xFE67, 0x84318635}, + {0xFE6C, 0x84318636}, + {0xFE6D, 0x84318637}, + {0xFE6E, 0x84318638}, + {0xFE6F, 0x84318639}, + {0xFE70, 0x84318730}, + {0xFE71, 0x84318731}, + {0xFE72, 0x84318732}, + {0xFE73, 0x84318733}, + {0xFE74, 0x84318734}, + {0xFE75, 0x84318735}, + {0xFE76, 0x84318736}, + {0xFE77, 0x84318737}, + {0xFE78, 0x84318738}, + {0xFE79, 0x84318739}, + {0xFE7A, 0x84318830}, + {0xFE7B, 0x84318831}, + {0xFE7C, 0x84318832}, + {0xFE7D, 0x84318833}, + {0xFE7E, 0x84318834}, + {0xFE7F, 0x84318835}, + {0xFE80, 0x84318836}, + {0xFE81, 0x84318837}, + {0xFE82, 0x84318838}, + {0xFE83, 0x84318839}, + {0xFE84, 0x84318930}, + {0xFE85, 0x84318931}, + {0xFE86, 0x84318932}, + {0xFE87, 0x84318933}, + {0xFE88, 0x84318934}, + {0xFE89, 0x84318935}, + {0xFE8A, 0x84318936}, + {0xFE8B, 0x84318937}, + {0xFE8C, 0x84318938}, + {0xFE8D, 0x84318939}, + {0xFE8E, 0x84318A30}, + {0xFE8F, 0x84318A31}, + {0xFE90, 0x84318A32}, + {0xFE91, 0x84318A33}, + {0xFE92, 0x84318A34}, + {0xFE93, 0x84318A35}, + {0xFE94, 0x84318A36}, + {0xFE95, 0x84318A37}, + {0xFE96, 0x84318A38}, + {0xFE97, 0x84318A39}, + {0xFE98, 0x84318B30}, + {0xFE99, 0x84318B31}, + {0xFE9A, 0x84318B32}, + {0xFE9B, 0x84318B33}, + {0xFE9C, 0x84318B34}, + {0xFE9D, 0x84318B35}, + {0xFE9E, 0x84318B36}, + {0xFE9F, 0x84318B37}, + {0xFEA0, 0x84318B38}, + {0xFEA1, 0x84318B39}, + {0xFEA2, 0x84318C30}, + {0xFEA3, 0x84318C31}, + {0xFEA4, 0x84318C32}, + {0xFEA5, 0x84318C33}, + {0xFEA6, 0x84318C34}, + {0xFEA7, 0x84318C35}, + {0xFEA8, 0x84318C36}, + {0xFEA9, 0x84318C37}, + {0xFEAA, 0x84318C38}, + {0xFEAB, 0x84318C39}, + {0xFEAC, 0x84318D30}, + {0xFEAD, 0x84318D31}, + {0xFEAE, 0x84318D32}, + {0xFEAF, 0x84318D33}, + {0xFEB0, 0x84318D34}, + {0xFEB1, 0x84318D35}, + {0xFEB2, 0x84318D36}, + {0xFEB3, 0x84318D37}, + {0xFEB4, 0x84318D38}, + {0xFEB5, 0x84318D39}, + {0xFEB6, 0x84318E30}, + {0xFEB7, 0x84318E31}, + {0xFEB8, 0x84318E32}, + {0xFEB9, 0x84318E33}, + {0xFEBA, 0x84318E34}, + {0xFEBB, 0x84318E35}, + {0xFEBC, 0x84318E36}, + {0xFEBD, 0x84318E37}, + {0xFEBE, 0x84318E38}, + {0xFEBF, 0x84318E39}, + {0xFEC0, 0x84318F30}, + {0xFEC1, 0x84318F31}, + {0xFEC2, 0x84318F32}, + {0xFEC3, 0x84318F33}, + {0xFEC4, 0x84318F34}, + {0xFEC5, 0x84318F35}, + {0xFEC6, 0x84318F36}, + {0xFEC7, 0x84318F37}, + {0xFEC8, 0x84318F38}, + {0xFEC9, 0x84318F39}, + {0xFECA, 0x84319030}, + {0xFECB, 0x84319031}, + {0xFECC, 0x84319032}, + {0xFECD, 0x84319033}, + {0xFECE, 0x84319034}, + {0xFECF, 0x84319035}, + {0xFED0, 0x84319036}, + {0xFED1, 0x84319037}, + {0xFED2, 0x84319038}, + {0xFED3, 0x84319039}, + {0xFED4, 0x84319130}, + {0xFED5, 0x84319131}, + {0xFED6, 0x84319132}, + {0xFED7, 0x84319133}, + {0xFED8, 0x84319134}, + {0xFED9, 0x84319135}, + {0xFEDA, 0x84319136}, + {0xFEDB, 0x84319137}, + {0xFEDC, 0x84319138}, + {0xFEDD, 0x84319139}, + {0xFEDE, 0x84319230}, + {0xFEDF, 0x84319231}, + {0xFEE0, 0x84319232}, + {0xFEE1, 0x84319233}, + {0xFEE2, 0x84319234}, + {0xFEE3, 0x84319235}, + {0xFEE4, 0x84319236}, + {0xFEE5, 0x84319237}, + {0xFEE6, 0x84319238}, + {0xFEE7, 0x84319239}, + {0xFEE8, 0x84319330}, + {0xFEE9, 0x84319331}, + {0xFEEA, 0x84319332}, + {0xFEEB, 0x84319333}, + {0xFEEC, 0x84319334}, + {0xFEED, 0x84319335}, + {0xFEEE, 0x84319336}, + {0xFEEF, 0x84319337}, + {0xFEF0, 0x84319338}, + {0xFEF1, 0x84319339}, + {0xFEF2, 0x84319430}, + {0xFEF3, 0x84319431}, + {0xFEF4, 0x84319432}, + {0xFEF5, 0x84319433}, + {0xFEF6, 0x84319434}, + {0xFEF7, 0x84319435}, + {0xFEF8, 0x84319436}, + {0xFEF9, 0x84319437}, + {0xFEFA, 0x84319438}, + {0xFEFB, 0x84319439}, + {0xFEFC, 0x84319530}, + {0xFEFD, 0x84319531}, + {0xFEFE, 0x84319532}, + {0xFEFF, 0x84319533}, + {0xFF00, 0x84319534}, + {0xFF5F, 0x84319535}, + {0xFF60, 0x84319536}, + {0xFF61, 0x84319537}, + {0xFF62, 0x84319538}, + {0xFF63, 0x84319539}, + {0xFF64, 0x84319630}, + {0xFF65, 0x84319631}, + {0xFF66, 0x84319632}, + {0xFF67, 0x84319633}, + {0xFF68, 0x84319634}, + {0xFF69, 0x84319635}, + {0xFF6A, 0x84319636}, + {0xFF6B, 0x84319637}, + {0xFF6C, 0x84319638}, + {0xFF6D, 0x84319639}, + {0xFF6E, 0x84319730}, + {0xFF6F, 0x84319731}, + {0xFF70, 0x84319732}, + {0xFF71, 0x84319733}, + {0xFF72, 0x84319734}, + {0xFF73, 0x84319735}, + {0xFF74, 0x84319736}, + {0xFF75, 0x84319737}, + {0xFF76, 0x84319738}, + {0xFF77, 0x84319739}, + {0xFF78, 0x84319830}, + {0xFF79, 0x84319831}, + {0xFF7A, 0x84319832}, + {0xFF7B, 0x84319833}, + {0xFF7C, 0x84319834}, + {0xFF7D, 0x84319835}, + {0xFF7E, 0x84319836}, + {0xFF7F, 0x84319837}, + {0xFF80, 0x84319838}, + {0xFF81, 0x84319839}, + {0xFF82, 0x84319930}, + {0xFF83, 0x84319931}, + {0xFF84, 0x84319932}, + {0xFF85, 0x84319933}, + {0xFF86, 0x84319934}, + {0xFF87, 0x84319935}, + {0xFF88, 0x84319936}, + {0xFF89, 0x84319937}, + {0xFF8A, 0x84319938}, + {0xFF8B, 0x84319939}, + {0xFF8C, 0x84319A30}, + {0xFF8D, 0x84319A31}, + {0xFF8E, 0x84319A32}, + {0xFF8F, 0x84319A33}, + {0xFF90, 0x84319A34}, + {0xFF91, 0x84319A35}, + {0xFF92, 0x84319A36}, + {0xFF93, 0x84319A37}, + {0xFF94, 0x84319A38}, + {0xFF95, 0x84319A39}, + {0xFF96, 0x84319B30}, + {0xFF97, 0x84319B31}, + {0xFF98, 0x84319B32}, + {0xFF99, 0x84319B33}, + {0xFF9A, 0x84319B34}, + {0xFF9B, 0x84319B35}, + {0xFF9C, 0x84319B36}, + {0xFF9D, 0x84319B37}, + {0xFF9E, 0x84319B38}, + {0xFF9F, 0x84319B39}, + {0xFFA0, 0x84319C30}, + {0xFFA1, 0x84319C31}, + {0xFFA2, 0x84319C32}, + {0xFFA3, 0x84319C33}, + {0xFFA4, 0x84319C34}, + {0xFFA5, 0x84319C35}, + {0xFFA6, 0x84319C36}, + {0xFFA7, 0x84319C37}, + {0xFFA8, 0x84319C38}, + {0xFFA9, 0x84319C39}, + {0xFFAA, 0x84319D30}, + {0xFFAB, 0x84319D31}, + {0xFFAC, 0x84319D32}, + {0xFFAD, 0x84319D33}, + {0xFFAE, 0x84319D34}, + {0xFFAF, 0x84319D35}, + {0xFFB0, 0x84319D36}, + {0xFFB1, 0x84319D37}, + {0xFFB2, 0x84319D38}, + {0xFFB3, 0x84319D39}, + {0xFFB4, 0x84319E30}, + {0xFFB5, 0x84319E31}, + {0xFFB6, 0x84319E32}, + {0xFFB7, 0x84319E33}, + {0xFFB8, 0x84319E34}, + {0xFFB9, 0x84319E35}, + {0xFFBA, 0x84319E36}, + {0xFFBB, 0x84319E37}, + {0xFFBC, 0x84319E38}, + {0xFFBD, 0x84319E39}, + {0xFFBE, 0x84319F30}, + {0xFFBF, 0x84319F31}, + {0xFFC0, 0x84319F32}, + {0xFFC1, 0x84319F33}, + {0xFFC2, 0x84319F34}, + {0xFFC3, 0x84319F35}, + {0xFFC4, 0x84319F36}, + {0xFFC5, 0x84319F37}, + {0xFFC6, 0x84319F38}, + {0xFFC7, 0x84319F39}, + {0xFFC8, 0x8431A030}, + {0xFFC9, 0x8431A031}, + {0xFFCA, 0x8431A032}, + {0xFFCB, 0x8431A033}, + {0xFFCC, 0x8431A034}, + {0xFFCD, 0x8431A035}, + {0xFFCE, 0x8431A036}, + {0xFFCF, 0x8431A037}, + {0xFFD0, 0x8431A038}, + {0xFFD1, 0x8431A039}, + {0xFFD2, 0x8431A130}, + {0xFFD3, 0x8431A131}, + {0xFFD4, 0x8431A132}, + {0xFFD5, 0x8431A133}, + {0xFFD6, 0x8431A134}, + {0xFFD7, 0x8431A135}, + {0xFFD8, 0x8431A136}, + {0xFFD9, 0x8431A137}, + {0xFFDA, 0x8431A138}, + {0xFFDB, 0x8431A139}, + {0xFFDC, 0x8431A230}, + {0xFFDD, 0x8431A231}, + {0xFFDE, 0x8431A232}, + {0xFFDF, 0x8431A233}, +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/gb18030.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/gb18030.go new file mode 100644 index 0000000000000000000000000000000000000000..d2759250e8a84bb14cb3a7f420b673239281675d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/gb18030.go @@ -0,0 +1,156 @@ +package mahonia + +import ( + "sync" +) + +// Converters for GB18030 encoding. + +func init() { + RegisterCharset(&Charset{ + Name: "GB18030", + NewDecoder: func() Decoder { + gb18030Once.Do(buildGB18030Tables) + return decodeGB18030Rune + }, + NewEncoder: func() Encoder { + gb18030Once.Do(buildGB18030Tables) + return encodeGB18030Rune + }, + }) +} + +func decodeGB18030Rune(p []byte) (r rune, size int, status Status) { + if len(p) == 0 { + status = NO_ROOM + return + } + + b := p[0] + if b < 128 { + return rune(b), 1, SUCCESS + } + + if len(p) < 2 { + status = NO_ROOM + return + } + + if p[0] < 0x81 || p[0] > 0xfe { + return 0xfffd, 1, INVALID_CHAR + } + + if p[1] >= 0x40 { + // 2-byte character + c := uint16(p[0])<<8 + uint16(p[1]) + r = rune(gbkToUnicode[c]) + if r == 0 { + r = gbkToUnicodeExtra[c] + } + + if r != 0 { + return r, 2, SUCCESS + } + } else if p[1] >= 0x30 { + // 4-byte character + if len(p) < 4 { + return 0, 0, NO_ROOM + } + if p[2] < 0x81 || p[2] > 0xfe || p[3] < 0x30 || p[3] > 0x39 { + return 0xfffd, 1, INVALID_CHAR + } + + code := uint32(p[0])<<24 + uint32(p[1])<<16 + uint32(p[2])<<8 + uint32(p[3]) + lin := gb18030Linear(code) + + if lin <= maxGB18030Linear { + r = rune(gb18030LinearToUnicode[lin]) + if r != 0 { + return r, 4, SUCCESS + } + } + + for _, rng := range gb18030Ranges { + if lin >= rng.firstGB && lin <= rng.lastGB { + return rng.firstRune + rune(lin) - rune(rng.firstGB), 4, SUCCESS + } + } + } + + return 0xfffd, 1, INVALID_CHAR +} + +func encodeGB18030Rune(p []byte, r rune) (size int, status Status) { + if len(p) == 0 { + status = NO_ROOM + return + } + + if r < 128 { + p[0] = byte(r) + return 1, SUCCESS + } + + if len(p) < 2 { + status = NO_ROOM + return + } + + var c uint16 + if r < 0x10000 { + c = unicodeToGBK[r] + } else { + c = unicodeToGBKExtra[r] + } + + if c != 0 { + p[0] = byte(c >> 8) + p[1] = byte(c) + return 2, SUCCESS + } + + if len(p) < 4 { + return 0, NO_ROOM + } + + if r < 0x10000 { + f := unicodeToGB18030[r] + if f != 0 { + p[0] = byte(f >> 24) + p[1] = byte(f >> 16) + p[2] = byte(f >> 8) + p[3] = byte(f) + return 4, SUCCESS + } + } + + for _, rng := range gb18030Ranges { + if r >= rng.firstRune && r <= rng.lastRune { + lin := rng.firstGB + uint32(r) - uint32(rng.firstRune) + p[0] = byte(lin/(10*126*10)) + 0x81 + p[1] = byte(lin/(126*10)%10) + 0x30 + p[2] = byte(lin/10%126) + 0x81 + p[3] = byte(lin%10) + 0x30 + return 4, SUCCESS + } + } + + p[0] = 0x1a + return 1, INVALID_CHAR +} + +var gb18030Once sync.Once + +// Mapping from gb18039Linear values to Unicode. +var gb18030LinearToUnicode []uint16 + +var unicodeToGB18030 []uint32 + +func buildGB18030Tables() { + gb18030LinearToUnicode = make([]uint16, maxGB18030Linear+1) + unicodeToGB18030 = make([]uint32, 65536) + for _, data := range gb18030Data { + gb18030LinearToUnicode[gb18030Linear(data.gb18030)] = data.unicode + unicodeToGB18030[data.unicode] = data.gb18030 + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/gbk-data.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/gbk-data.go new file mode 100644 index 0000000000000000000000000000000000000000..e93023cff551d1fcf3eb8eb088066707a9e1150f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/gbk-data.go @@ -0,0 +1,47922 @@ +package mahonia + +// Data for GBK 2-byte codes. +// GBK codes are represented in big-endian order. +// Based on the 2-byte subset of http://source.icu-project.org/repos/icu/data/trunk/charset/data/ucm/gb-18030-2005.ucm + +// Codes that aren't on the BMP. +var unicodeToGBKExtra = map[rune]uint16{ + 0x20087: 0xfe51, + 0x20089: 0xfe52, + 0x200cc: 0xfe53, + 0x215d7: 0xfe6c, + 0x2298f: 0xfe76, + 0x241fe: 0xfe91, +} + +var gbkToUnicodeExtra = map[uint16]rune{ + 0xfe51: 0x20087, + 0xfe52: 0x20089, + 0xfe53: 0x200cc, + 0xfe6c: 0x215d7, + 0xfe76: 0x2298f, + 0xfe91: 0x241fe, +} + +var unicodeToGBK = [65536]uint16{ + 0x00A4: 0xA1E8, + 0x00A7: 0xA1EC, + 0x00A8: 0xA1A7, + 0x00B0: 0xA1E3, + 0x00B1: 0xA1C0, + 0x00B7: 0xA1A4, + 0x00D7: 0xA1C1, + 0x00E0: 0xA8A4, + 0x00E1: 0xA8A2, + 0x00E8: 0xA8A8, + 0x00E9: 0xA8A6, + 0x00EA: 0xA8BA, + 0x00EC: 0xA8AC, + 0x00ED: 0xA8AA, + 0x00F2: 0xA8B0, + 0x00F3: 0xA8AE, + 0x00F7: 0xA1C2, + 0x00F9: 0xA8B4, + 0x00FA: 0xA8B2, + 0x00FC: 0xA8B9, + 0x0101: 0xA8A1, + 0x0113: 0xA8A5, + 0x011B: 0xA8A7, + 0x012B: 0xA8A9, + 0x0144: 0xA8BD, + 0x0148: 0xA8BE, + 0x014D: 0xA8AD, + 0x016B: 0xA8B1, + 0x01CE: 0xA8A3, + 0x01D0: 0xA8AB, + 0x01D2: 0xA8AF, + 0x01D4: 0xA8B3, + 0x01D6: 0xA8B5, + 0x01D8: 0xA8B6, + 0x01DA: 0xA8B7, + 0x01DC: 0xA8B8, + 0x01F9: 0xA8BF, + 0x0251: 0xA8BB, + 0x0261: 0xA8C0, + 0x02C7: 0xA1A6, + 0x02C9: 0xA1A5, + 0x02CA: 0xA840, + 0x02CB: 0xA841, + 0x02D9: 0xA842, + 0x0391: 0xA6A1, + 0x0392: 0xA6A2, + 0x0393: 0xA6A3, + 0x0394: 0xA6A4, + 0x0395: 0xA6A5, + 0x0396: 0xA6A6, + 0x0397: 0xA6A7, + 0x0398: 0xA6A8, + 0x0399: 0xA6A9, + 0x039A: 0xA6AA, + 0x039B: 0xA6AB, + 0x039C: 0xA6AC, + 0x039D: 0xA6AD, + 0x039E: 0xA6AE, + 0x039F: 0xA6AF, + 0x03A0: 0xA6B0, + 0x03A1: 0xA6B1, + 0x03A3: 0xA6B2, + 0x03A4: 0xA6B3, + 0x03A5: 0xA6B4, + 0x03A6: 0xA6B5, + 0x03A7: 0xA6B6, + 0x03A8: 0xA6B7, + 0x03A9: 0xA6B8, + 0x03B1: 0xA6C1, + 0x03B2: 0xA6C2, + 0x03B3: 0xA6C3, + 0x03B4: 0xA6C4, + 0x03B5: 0xA6C5, + 0x03B6: 0xA6C6, + 0x03B7: 0xA6C7, + 0x03B8: 0xA6C8, + 0x03B9: 0xA6C9, + 0x03BA: 0xA6CA, + 0x03BB: 0xA6CB, + 0x03BC: 0xA6CC, + 0x03BD: 0xA6CD, + 0x03BE: 0xA6CE, + 0x03BF: 0xA6CF, + 0x03C0: 0xA6D0, + 0x03C1: 0xA6D1, + 0x03C3: 0xA6D2, + 0x03C4: 0xA6D3, + 0x03C5: 0xA6D4, + 0x03C6: 0xA6D5, + 0x03C7: 0xA6D6, + 0x03C8: 0xA6D7, + 0x03C9: 0xA6D8, + 0x0401: 0xA7A7, + 0x0410: 0xA7A1, + 0x0411: 0xA7A2, + 0x0412: 0xA7A3, + 0x0413: 0xA7A4, + 0x0414: 0xA7A5, + 0x0415: 0xA7A6, + 0x0416: 0xA7A8, + 0x0417: 0xA7A9, + 0x0418: 0xA7AA, + 0x0419: 0xA7AB, + 0x041A: 0xA7AC, + 0x041B: 0xA7AD, + 0x041C: 0xA7AE, + 0x041D: 0xA7AF, + 0x041E: 0xA7B0, + 0x041F: 0xA7B1, + 0x0420: 0xA7B2, + 0x0421: 0xA7B3, + 0x0422: 0xA7B4, + 0x0423: 0xA7B5, + 0x0424: 0xA7B6, + 0x0425: 0xA7B7, + 0x0426: 0xA7B8, + 0x0427: 0xA7B9, + 0x0428: 0xA7BA, + 0x0429: 0xA7BB, + 0x042A: 0xA7BC, + 0x042B: 0xA7BD, + 0x042C: 0xA7BE, + 0x042D: 0xA7BF, + 0x042E: 0xA7C0, + 0x042F: 0xA7C1, + 0x0430: 0xA7D1, + 0x0431: 0xA7D2, + 0x0432: 0xA7D3, + 0x0433: 0xA7D4, + 0x0434: 0xA7D5, + 0x0435: 0xA7D6, + 0x0436: 0xA7D8, + 0x0437: 0xA7D9, + 0x0438: 0xA7DA, + 0x0439: 0xA7DB, + 0x043A: 0xA7DC, + 0x043B: 0xA7DD, + 0x043C: 0xA7DE, + 0x043D: 0xA7DF, + 0x043E: 0xA7E0, + 0x043F: 0xA7E1, + 0x0440: 0xA7E2, + 0x0441: 0xA7E3, + 0x0442: 0xA7E4, + 0x0443: 0xA7E5, + 0x0444: 0xA7E6, + 0x0445: 0xA7E7, + 0x0446: 0xA7E8, + 0x0447: 0xA7E9, + 0x0448: 0xA7EA, + 0x0449: 0xA7EB, + 0x044A: 0xA7EC, + 0x044B: 0xA7ED, + 0x044C: 0xA7EE, + 0x044D: 0xA7EF, + 0x044E: 0xA7F0, + 0x044F: 0xA7F1, + 0x0451: 0xA7D7, + 0x1E3F: 0xA8BC, + 0x2010: 0xA95C, + 0x2013: 0xA843, + 0x2014: 0xA1AA, + 0x2015: 0xA844, + 0x2016: 0xA1AC, + 0x2018: 0xA1AE, + 0x2019: 0xA1AF, + 0x201C: 0xA1B0, + 0x201D: 0xA1B1, + 0x2025: 0xA845, + 0x2026: 0xA1AD, + 0x2030: 0xA1EB, + 0x2032: 0xA1E4, + 0x2033: 0xA1E5, + 0x2035: 0xA846, + 0x203B: 0xA1F9, + 0x20AC: 0xA2E3, + 0x2103: 0xA1E6, + 0x2105: 0xA847, + 0x2109: 0xA848, + 0x2116: 0xA1ED, + 0x2121: 0xA959, + 0x2160: 0xA2F1, + 0x2161: 0xA2F2, + 0x2162: 0xA2F3, + 0x2163: 0xA2F4, + 0x2164: 0xA2F5, + 0x2165: 0xA2F6, + 0x2166: 0xA2F7, + 0x2167: 0xA2F8, + 0x2168: 0xA2F9, + 0x2169: 0xA2FA, + 0x216A: 0xA2FB, + 0x216B: 0xA2FC, + 0x2170: 0xA2A1, + 0x2171: 0xA2A2, + 0x2172: 0xA2A3, + 0x2173: 0xA2A4, + 0x2174: 0xA2A5, + 0x2175: 0xA2A6, + 0x2176: 0xA2A7, + 0x2177: 0xA2A8, + 0x2178: 0xA2A9, + 0x2179: 0xA2AA, + 0x2190: 0xA1FB, + 0x2191: 0xA1FC, + 0x2192: 0xA1FA, + 0x2193: 0xA1FD, + 0x2196: 0xA849, + 0x2197: 0xA84A, + 0x2198: 0xA84B, + 0x2199: 0xA84C, + 0x2208: 0xA1CA, + 0x220F: 0xA1C7, + 0x2211: 0xA1C6, + 0x2215: 0xA84D, + 0x221A: 0xA1CC, + 0x221D: 0xA1D8, + 0x221E: 0xA1DE, + 0x221F: 0xA84E, + 0x2220: 0xA1CF, + 0x2223: 0xA84F, + 0x2225: 0xA1CE, + 0x2227: 0xA1C4, + 0x2228: 0xA1C5, + 0x2229: 0xA1C9, + 0x222A: 0xA1C8, + 0x222B: 0xA1D2, + 0x222E: 0xA1D3, + 0x2234: 0xA1E0, + 0x2235: 0xA1DF, + 0x2236: 0xA1C3, + 0x2237: 0xA1CB, + 0x223D: 0xA1D7, + 0x2248: 0xA1D6, + 0x224C: 0xA1D5, + 0x2252: 0xA850, + 0x2260: 0xA1D9, + 0x2261: 0xA1D4, + 0x2264: 0xA1DC, + 0x2265: 0xA1DD, + 0x2266: 0xA851, + 0x2267: 0xA852, + 0x226E: 0xA1DA, + 0x226F: 0xA1DB, + 0x2295: 0xA892, + 0x2299: 0xA1D1, + 0x22A5: 0xA1CD, + 0x22BF: 0xA853, + 0x2312: 0xA1D0, + 0x2460: 0xA2D9, + 0x2461: 0xA2DA, + 0x2462: 0xA2DB, + 0x2463: 0xA2DC, + 0x2464: 0xA2DD, + 0x2465: 0xA2DE, + 0x2466: 0xA2DF, + 0x2467: 0xA2E0, + 0x2468: 0xA2E1, + 0x2469: 0xA2E2, + 0x2474: 0xA2C5, + 0x2475: 0xA2C6, + 0x2476: 0xA2C7, + 0x2477: 0xA2C8, + 0x2478: 0xA2C9, + 0x2479: 0xA2CA, + 0x247A: 0xA2CB, + 0x247B: 0xA2CC, + 0x247C: 0xA2CD, + 0x247D: 0xA2CE, + 0x247E: 0xA2CF, + 0x247F: 0xA2D0, + 0x2480: 0xA2D1, + 0x2481: 0xA2D2, + 0x2482: 0xA2D3, + 0x2483: 0xA2D4, + 0x2484: 0xA2D5, + 0x2485: 0xA2D6, + 0x2486: 0xA2D7, + 0x2487: 0xA2D8, + 0x2488: 0xA2B1, + 0x2489: 0xA2B2, + 0x248A: 0xA2B3, + 0x248B: 0xA2B4, + 0x248C: 0xA2B5, + 0x248D: 0xA2B6, + 0x248E: 0xA2B7, + 0x248F: 0xA2B8, + 0x2490: 0xA2B9, + 0x2491: 0xA2BA, + 0x2492: 0xA2BB, + 0x2493: 0xA2BC, + 0x2494: 0xA2BD, + 0x2495: 0xA2BE, + 0x2496: 0xA2BF, + 0x2497: 0xA2C0, + 0x2498: 0xA2C1, + 0x2499: 0xA2C2, + 0x249A: 0xA2C3, + 0x249B: 0xA2C4, + 0x2500: 0xA9A4, + 0x2501: 0xA9A5, + 0x2502: 0xA9A6, + 0x2503: 0xA9A7, + 0x2504: 0xA9A8, + 0x2505: 0xA9A9, + 0x2506: 0xA9AA, + 0x2507: 0xA9AB, + 0x2508: 0xA9AC, + 0x2509: 0xA9AD, + 0x250A: 0xA9AE, + 0x250B: 0xA9AF, + 0x250C: 0xA9B0, + 0x250D: 0xA9B1, + 0x250E: 0xA9B2, + 0x250F: 0xA9B3, + 0x2510: 0xA9B4, + 0x2511: 0xA9B5, + 0x2512: 0xA9B6, + 0x2513: 0xA9B7, + 0x2514: 0xA9B8, + 0x2515: 0xA9B9, + 0x2516: 0xA9BA, + 0x2517: 0xA9BB, + 0x2518: 0xA9BC, + 0x2519: 0xA9BD, + 0x251A: 0xA9BE, + 0x251B: 0xA9BF, + 0x251C: 0xA9C0, + 0x251D: 0xA9C1, + 0x251E: 0xA9C2, + 0x251F: 0xA9C3, + 0x2520: 0xA9C4, + 0x2521: 0xA9C5, + 0x2522: 0xA9C6, + 0x2523: 0xA9C7, + 0x2524: 0xA9C8, + 0x2525: 0xA9C9, + 0x2526: 0xA9CA, + 0x2527: 0xA9CB, + 0x2528: 0xA9CC, + 0x2529: 0xA9CD, + 0x252A: 0xA9CE, + 0x252B: 0xA9CF, + 0x252C: 0xA9D0, + 0x252D: 0xA9D1, + 0x252E: 0xA9D2, + 0x252F: 0xA9D3, + 0x2530: 0xA9D4, + 0x2531: 0xA9D5, + 0x2532: 0xA9D6, + 0x2533: 0xA9D7, + 0x2534: 0xA9D8, + 0x2535: 0xA9D9, + 0x2536: 0xA9DA, + 0x2537: 0xA9DB, + 0x2538: 0xA9DC, + 0x2539: 0xA9DD, + 0x253A: 0xA9DE, + 0x253B: 0xA9DF, + 0x253C: 0xA9E0, + 0x253D: 0xA9E1, + 0x253E: 0xA9E2, + 0x253F: 0xA9E3, + 0x2540: 0xA9E4, + 0x2541: 0xA9E5, + 0x2542: 0xA9E6, + 0x2543: 0xA9E7, + 0x2544: 0xA9E8, + 0x2545: 0xA9E9, + 0x2546: 0xA9EA, + 0x2547: 0xA9EB, + 0x2548: 0xA9EC, + 0x2549: 0xA9ED, + 0x254A: 0xA9EE, + 0x254B: 0xA9EF, + 0x2550: 0xA854, + 0x2551: 0xA855, + 0x2552: 0xA856, + 0x2553: 0xA857, + 0x2554: 0xA858, + 0x2555: 0xA859, + 0x2556: 0xA85A, + 0x2557: 0xA85B, + 0x2558: 0xA85C, + 0x2559: 0xA85D, + 0x255A: 0xA85E, + 0x255B: 0xA85F, + 0x255C: 0xA860, + 0x255D: 0xA861, + 0x255E: 0xA862, + 0x255F: 0xA863, + 0x2560: 0xA864, + 0x2561: 0xA865, + 0x2562: 0xA866, + 0x2563: 0xA867, + 0x2564: 0xA868, + 0x2565: 0xA869, + 0x2566: 0xA86A, + 0x2567: 0xA86B, + 0x2568: 0xA86C, + 0x2569: 0xA86D, + 0x256A: 0xA86E, + 0x256B: 0xA86F, + 0x256C: 0xA870, + 0x256D: 0xA871, + 0x256E: 0xA872, + 0x256F: 0xA873, + 0x2570: 0xA874, + 0x2571: 0xA875, + 0x2572: 0xA876, + 0x2573: 0xA877, + 0x2581: 0xA878, + 0x2582: 0xA879, + 0x2583: 0xA87A, + 0x2584: 0xA87B, + 0x2585: 0xA87C, + 0x2586: 0xA87D, + 0x2587: 0xA87E, + 0x2588: 0xA880, + 0x2589: 0xA881, + 0x258A: 0xA882, + 0x258B: 0xA883, + 0x258C: 0xA884, + 0x258D: 0xA885, + 0x258E: 0xA886, + 0x258F: 0xA887, + 0x2593: 0xA888, + 0x2594: 0xA889, + 0x2595: 0xA88A, + 0x25A0: 0xA1F6, + 0x25A1: 0xA1F5, + 0x25B2: 0xA1F8, + 0x25B3: 0xA1F7, + 0x25BC: 0xA88B, + 0x25BD: 0xA88C, + 0x25C6: 0xA1F4, + 0x25C7: 0xA1F3, + 0x25CB: 0xA1F0, + 0x25CE: 0xA1F2, + 0x25CF: 0xA1F1, + 0x25E2: 0xA88D, + 0x25E3: 0xA88E, + 0x25E4: 0xA88F, + 0x25E5: 0xA890, + 0x2605: 0xA1EF, + 0x2606: 0xA1EE, + 0x2609: 0xA891, + 0x2640: 0xA1E2, + 0x2642: 0xA1E1, + 0x2E81: 0xFE50, + 0x2E84: 0xFE54, + 0x2E88: 0xFE57, + 0x2E8B: 0xFE58, + 0x2E8C: 0xFE5D, + 0x2E97: 0xFE5E, + 0x2EA7: 0xFE6B, + 0x2EAA: 0xFE6E, + 0x2EAE: 0xFE71, + 0x2EB3: 0xFE73, + 0x2EB6: 0xFE74, + 0x2EB7: 0xFE75, + 0x2EBB: 0xFE79, + 0x2ECA: 0xFE84, + 0x2FF0: 0xA98A, + 0x2FF1: 0xA98B, + 0x2FF2: 0xA98C, + 0x2FF3: 0xA98D, + 0x2FF4: 0xA98E, + 0x2FF5: 0xA98F, + 0x2FF6: 0xA990, + 0x2FF7: 0xA991, + 0x2FF8: 0xA992, + 0x2FF9: 0xA993, + 0x2FFA: 0xA994, + 0x2FFB: 0xA995, + 0x3000: 0xA1A1, + 0x3001: 0xA1A2, + 0x3002: 0xA1A3, + 0x3003: 0xA1A8, + 0x3005: 0xA1A9, + 0x3006: 0xA965, + 0x3007: 0xA996, + 0x3008: 0xA1B4, + 0x3009: 0xA1B5, + 0x300A: 0xA1B6, + 0x300B: 0xA1B7, + 0x300C: 0xA1B8, + 0x300D: 0xA1B9, + 0x300E: 0xA1BA, + 0x300F: 0xA1BB, + 0x3010: 0xA1BE, + 0x3011: 0xA1BF, + 0x3012: 0xA893, + 0x3013: 0xA1FE, + 0x3014: 0xA1B2, + 0x3015: 0xA1B3, + 0x3016: 0xA1BC, + 0x3017: 0xA1BD, + 0x301D: 0xA894, + 0x301E: 0xA895, + 0x3021: 0xA940, + 0x3022: 0xA941, + 0x3023: 0xA942, + 0x3024: 0xA943, + 0x3025: 0xA944, + 0x3026: 0xA945, + 0x3027: 0xA946, + 0x3028: 0xA947, + 0x3029: 0xA948, + 0x303E: 0xA989, + 0x3041: 0xA4A1, + 0x3042: 0xA4A2, + 0x3043: 0xA4A3, + 0x3044: 0xA4A4, + 0x3045: 0xA4A5, + 0x3046: 0xA4A6, + 0x3047: 0xA4A7, + 0x3048: 0xA4A8, + 0x3049: 0xA4A9, + 0x304A: 0xA4AA, + 0x304B: 0xA4AB, + 0x304C: 0xA4AC, + 0x304D: 0xA4AD, + 0x304E: 0xA4AE, + 0x304F: 0xA4AF, + 0x3050: 0xA4B0, + 0x3051: 0xA4B1, + 0x3052: 0xA4B2, + 0x3053: 0xA4B3, + 0x3054: 0xA4B4, + 0x3055: 0xA4B5, + 0x3056: 0xA4B6, + 0x3057: 0xA4B7, + 0x3058: 0xA4B8, + 0x3059: 0xA4B9, + 0x305A: 0xA4BA, + 0x305B: 0xA4BB, + 0x305C: 0xA4BC, + 0x305D: 0xA4BD, + 0x305E: 0xA4BE, + 0x305F: 0xA4BF, + 0x3060: 0xA4C0, + 0x3061: 0xA4C1, + 0x3062: 0xA4C2, + 0x3063: 0xA4C3, + 0x3064: 0xA4C4, + 0x3065: 0xA4C5, + 0x3066: 0xA4C6, + 0x3067: 0xA4C7, + 0x3068: 0xA4C8, + 0x3069: 0xA4C9, + 0x306A: 0xA4CA, + 0x306B: 0xA4CB, + 0x306C: 0xA4CC, + 0x306D: 0xA4CD, + 0x306E: 0xA4CE, + 0x306F: 0xA4CF, + 0x3070: 0xA4D0, + 0x3071: 0xA4D1, + 0x3072: 0xA4D2, + 0x3073: 0xA4D3, + 0x3074: 0xA4D4, + 0x3075: 0xA4D5, + 0x3076: 0xA4D6, + 0x3077: 0xA4D7, + 0x3078: 0xA4D8, + 0x3079: 0xA4D9, + 0x307A: 0xA4DA, + 0x307B: 0xA4DB, + 0x307C: 0xA4DC, + 0x307D: 0xA4DD, + 0x307E: 0xA4DE, + 0x307F: 0xA4DF, + 0x3080: 0xA4E0, + 0x3081: 0xA4E1, + 0x3082: 0xA4E2, + 0x3083: 0xA4E3, + 0x3084: 0xA4E4, + 0x3085: 0xA4E5, + 0x3086: 0xA4E6, + 0x3087: 0xA4E7, + 0x3088: 0xA4E8, + 0x3089: 0xA4E9, + 0x308A: 0xA4EA, + 0x308B: 0xA4EB, + 0x308C: 0xA4EC, + 0x308D: 0xA4ED, + 0x308E: 0xA4EE, + 0x308F: 0xA4EF, + 0x3090: 0xA4F0, + 0x3091: 0xA4F1, + 0x3092: 0xA4F2, + 0x3093: 0xA4F3, + 0x309B: 0xA961, + 0x309C: 0xA962, + 0x309D: 0xA966, + 0x309E: 0xA967, + 0x30A1: 0xA5A1, + 0x30A2: 0xA5A2, + 0x30A3: 0xA5A3, + 0x30A4: 0xA5A4, + 0x30A5: 0xA5A5, + 0x30A6: 0xA5A6, + 0x30A7: 0xA5A7, + 0x30A8: 0xA5A8, + 0x30A9: 0xA5A9, + 0x30AA: 0xA5AA, + 0x30AB: 0xA5AB, + 0x30AC: 0xA5AC, + 0x30AD: 0xA5AD, + 0x30AE: 0xA5AE, + 0x30AF: 0xA5AF, + 0x30B0: 0xA5B0, + 0x30B1: 0xA5B1, + 0x30B2: 0xA5B2, + 0x30B3: 0xA5B3, + 0x30B4: 0xA5B4, + 0x30B5: 0xA5B5, + 0x30B6: 0xA5B6, + 0x30B7: 0xA5B7, + 0x30B8: 0xA5B8, + 0x30B9: 0xA5B9, + 0x30BA: 0xA5BA, + 0x30BB: 0xA5BB, + 0x30BC: 0xA5BC, + 0x30BD: 0xA5BD, + 0x30BE: 0xA5BE, + 0x30BF: 0xA5BF, + 0x30C0: 0xA5C0, + 0x30C1: 0xA5C1, + 0x30C2: 0xA5C2, + 0x30C3: 0xA5C3, + 0x30C4: 0xA5C4, + 0x30C5: 0xA5C5, + 0x30C6: 0xA5C6, + 0x30C7: 0xA5C7, + 0x30C8: 0xA5C8, + 0x30C9: 0xA5C9, + 0x30CA: 0xA5CA, + 0x30CB: 0xA5CB, + 0x30CC: 0xA5CC, + 0x30CD: 0xA5CD, + 0x30CE: 0xA5CE, + 0x30CF: 0xA5CF, + 0x30D0: 0xA5D0, + 0x30D1: 0xA5D1, + 0x30D2: 0xA5D2, + 0x30D3: 0xA5D3, + 0x30D4: 0xA5D4, + 0x30D5: 0xA5D5, + 0x30D6: 0xA5D6, + 0x30D7: 0xA5D7, + 0x30D8: 0xA5D8, + 0x30D9: 0xA5D9, + 0x30DA: 0xA5DA, + 0x30DB: 0xA5DB, + 0x30DC: 0xA5DC, + 0x30DD: 0xA5DD, + 0x30DE: 0xA5DE, + 0x30DF: 0xA5DF, + 0x30E0: 0xA5E0, + 0x30E1: 0xA5E1, + 0x30E2: 0xA5E2, + 0x30E3: 0xA5E3, + 0x30E4: 0xA5E4, + 0x30E5: 0xA5E5, + 0x30E6: 0xA5E6, + 0x30E7: 0xA5E7, + 0x30E8: 0xA5E8, + 0x30E9: 0xA5E9, + 0x30EA: 0xA5EA, + 0x30EB: 0xA5EB, + 0x30EC: 0xA5EC, + 0x30ED: 0xA5ED, + 0x30EE: 0xA5EE, + 0x30EF: 0xA5EF, + 0x30F0: 0xA5F0, + 0x30F1: 0xA5F1, + 0x30F2: 0xA5F2, + 0x30F3: 0xA5F3, + 0x30F4: 0xA5F4, + 0x30F5: 0xA5F5, + 0x30F6: 0xA5F6, + 0x30FC: 0xA960, + 0x30FD: 0xA963, + 0x30FE: 0xA964, + 0x3105: 0xA8C5, + 0x3106: 0xA8C6, + 0x3107: 0xA8C7, + 0x3108: 0xA8C8, + 0x3109: 0xA8C9, + 0x310A: 0xA8CA, + 0x310B: 0xA8CB, + 0x310C: 0xA8CC, + 0x310D: 0xA8CD, + 0x310E: 0xA8CE, + 0x310F: 0xA8CF, + 0x3110: 0xA8D0, + 0x3111: 0xA8D1, + 0x3112: 0xA8D2, + 0x3113: 0xA8D3, + 0x3114: 0xA8D4, + 0x3115: 0xA8D5, + 0x3116: 0xA8D6, + 0x3117: 0xA8D7, + 0x3118: 0xA8D8, + 0x3119: 0xA8D9, + 0x311A: 0xA8DA, + 0x311B: 0xA8DB, + 0x311C: 0xA8DC, + 0x311D: 0xA8DD, + 0x311E: 0xA8DE, + 0x311F: 0xA8DF, + 0x3120: 0xA8E0, + 0x3121: 0xA8E1, + 0x3122: 0xA8E2, + 0x3123: 0xA8E3, + 0x3124: 0xA8E4, + 0x3125: 0xA8E5, + 0x3126: 0xA8E6, + 0x3127: 0xA8E7, + 0x3128: 0xA8E8, + 0x3129: 0xA8E9, + 0x3220: 0xA2E5, + 0x3221: 0xA2E6, + 0x3222: 0xA2E7, + 0x3223: 0xA2E8, + 0x3224: 0xA2E9, + 0x3225: 0xA2EA, + 0x3226: 0xA2EB, + 0x3227: 0xA2EC, + 0x3228: 0xA2ED, + 0x3229: 0xA2EE, + 0x3231: 0xA95A, + 0x32A3: 0xA949, + 0x338E: 0xA94A, + 0x338F: 0xA94B, + 0x339C: 0xA94C, + 0x339D: 0xA94D, + 0x339E: 0xA94E, + 0x33A1: 0xA94F, + 0x33C4: 0xA950, + 0x33CE: 0xA951, + 0x33D1: 0xA952, + 0x33D2: 0xA953, + 0x33D5: 0xA954, + 0x3447: 0xFE56, + 0x3473: 0xFE55, + 0x359E: 0xFE5A, + 0x360E: 0xFE5C, + 0x361A: 0xFE5B, + 0x3918: 0xFE60, + 0x396E: 0xFE5F, + 0x39CF: 0xFE62, + 0x39D0: 0xFE65, + 0x39DF: 0xFE63, + 0x3A73: 0xFE64, + 0x3B4E: 0xFE68, + 0x3C6E: 0xFE69, + 0x3CE0: 0xFE6A, + 0x4056: 0xFE6F, + 0x415F: 0xFE70, + 0x4337: 0xFE72, + 0x43AC: 0xFE78, + 0x43B1: 0xFE77, + 0x43DD: 0xFE7A, + 0x44D6: 0xFE7B, + 0x464C: 0xFE7D, + 0x4661: 0xFE7C, + 0x4723: 0xFE80, + 0x4729: 0xFE81, + 0x477C: 0xFE82, + 0x478D: 0xFE83, + 0x4947: 0xFE85, + 0x497A: 0xFE86, + 0x497D: 0xFE87, + 0x4982: 0xFE88, + 0x4983: 0xFE89, + 0x4985: 0xFE8A, + 0x4986: 0xFE8B, + 0x499B: 0xFE8D, + 0x499F: 0xFE8C, + 0x49B6: 0xFE8F, + 0x49B7: 0xFE8E, + 0x4C77: 0xFE96, + 0x4C9F: 0xFE93, + 0x4CA0: 0xFE94, + 0x4CA1: 0xFE95, + 0x4CA2: 0xFE97, + 0x4CA3: 0xFE92, + 0x4D13: 0xFE98, + 0x4D14: 0xFE99, + 0x4D15: 0xFE9A, + 0x4D16: 0xFE9B, + 0x4D17: 0xFE9C, + 0x4D18: 0xFE9D, + 0x4D19: 0xFE9E, + 0x4DAE: 0xFE9F, + 0x4E00: 0xD2BB, + 0x4E01: 0xB6A1, + 0x4E02: 0x8140, + 0x4E03: 0xC6DF, + 0x4E04: 0x8141, + 0x4E05: 0x8142, + 0x4E06: 0x8143, + 0x4E07: 0xCDF2, + 0x4E08: 0xD5C9, + 0x4E09: 0xC8FD, + 0x4E0A: 0xC9CF, + 0x4E0B: 0xCFC2, + 0x4E0C: 0xD8A2, + 0x4E0D: 0xB2BB, + 0x4E0E: 0xD3EB, + 0x4E0F: 0x8144, + 0x4E10: 0xD8A4, + 0x4E11: 0xB3F3, + 0x4E12: 0x8145, + 0x4E13: 0xD7A8, + 0x4E14: 0xC7D2, + 0x4E15: 0xD8A7, + 0x4E16: 0xCAC0, + 0x4E17: 0x8146, + 0x4E18: 0xC7F0, + 0x4E19: 0xB1FB, + 0x4E1A: 0xD2B5, + 0x4E1B: 0xB4D4, + 0x4E1C: 0xB6AB, + 0x4E1D: 0xCBBF, + 0x4E1E: 0xD8A9, + 0x4E1F: 0x8147, + 0x4E20: 0x8148, + 0x4E21: 0x8149, + 0x4E22: 0xB6AA, + 0x4E23: 0x814A, + 0x4E24: 0xC1BD, + 0x4E25: 0xD1CF, + 0x4E26: 0x814B, + 0x4E27: 0xC9A5, + 0x4E28: 0xD8AD, + 0x4E29: 0x814C, + 0x4E2A: 0xB8F6, + 0x4E2B: 0xD1BE, + 0x4E2C: 0xE3DC, + 0x4E2D: 0xD6D0, + 0x4E2E: 0x814D, + 0x4E2F: 0x814E, + 0x4E30: 0xB7E1, + 0x4E31: 0x814F, + 0x4E32: 0xB4AE, + 0x4E33: 0x8150, + 0x4E34: 0xC1D9, + 0x4E35: 0x8151, + 0x4E36: 0xD8BC, + 0x4E37: 0x8152, + 0x4E38: 0xCDE8, + 0x4E39: 0xB5A4, + 0x4E3A: 0xCEAA, + 0x4E3B: 0xD6F7, + 0x4E3C: 0x8153, + 0x4E3D: 0xC0F6, + 0x4E3E: 0xBED9, + 0x4E3F: 0xD8AF, + 0x4E40: 0x8154, + 0x4E41: 0x8155, + 0x4E42: 0x8156, + 0x4E43: 0xC4CB, + 0x4E44: 0x8157, + 0x4E45: 0xBEC3, + 0x4E46: 0x8158, + 0x4E47: 0xD8B1, + 0x4E48: 0xC3B4, + 0x4E49: 0xD2E5, + 0x4E4A: 0x8159, + 0x4E4B: 0xD6AE, + 0x4E4C: 0xCEDA, + 0x4E4D: 0xD5A7, + 0x4E4E: 0xBAF5, + 0x4E4F: 0xB7A6, + 0x4E50: 0xC0D6, + 0x4E51: 0x815A, + 0x4E52: 0xC6B9, + 0x4E53: 0xC5D2, + 0x4E54: 0xC7C7, + 0x4E55: 0x815B, + 0x4E56: 0xB9D4, + 0x4E57: 0x815C, + 0x4E58: 0xB3CB, + 0x4E59: 0xD2D2, + 0x4E5A: 0x815D, + 0x4E5B: 0x815E, + 0x4E5C: 0xD8BF, + 0x4E5D: 0xBEC5, + 0x4E5E: 0xC6F2, + 0x4E5F: 0xD2B2, + 0x4E60: 0xCFB0, + 0x4E61: 0xCFE7, + 0x4E62: 0x815F, + 0x4E63: 0x8160, + 0x4E64: 0x8161, + 0x4E65: 0x8162, + 0x4E66: 0xCAE9, + 0x4E67: 0x8163, + 0x4E68: 0x8164, + 0x4E69: 0xD8C0, + 0x4E6A: 0x8165, + 0x4E6B: 0x8166, + 0x4E6C: 0x8167, + 0x4E6D: 0x8168, + 0x4E6E: 0x8169, + 0x4E6F: 0x816A, + 0x4E70: 0xC2F2, + 0x4E71: 0xC2D2, + 0x4E72: 0x816B, + 0x4E73: 0xC8E9, + 0x4E74: 0x816C, + 0x4E75: 0x816D, + 0x4E76: 0x816E, + 0x4E77: 0x816F, + 0x4E78: 0x8170, + 0x4E79: 0x8171, + 0x4E7A: 0x8172, + 0x4E7B: 0x8173, + 0x4E7C: 0x8174, + 0x4E7D: 0x8175, + 0x4E7E: 0xC7AC, + 0x4E7F: 0x8176, + 0x4E80: 0x8177, + 0x4E81: 0x8178, + 0x4E82: 0x8179, + 0x4E83: 0x817A, + 0x4E84: 0x817B, + 0x4E85: 0x817C, + 0x4E86: 0xC1CB, + 0x4E87: 0x817D, + 0x4E88: 0xD3E8, + 0x4E89: 0xD5F9, + 0x4E8A: 0x817E, + 0x4E8B: 0xCAC2, + 0x4E8C: 0xB6FE, + 0x4E8D: 0xD8A1, + 0x4E8E: 0xD3DA, + 0x4E8F: 0xBFF7, + 0x4E90: 0x8180, + 0x4E91: 0xD4C6, + 0x4E92: 0xBBA5, + 0x4E93: 0xD8C1, + 0x4E94: 0xCEE5, + 0x4E95: 0xBEAE, + 0x4E96: 0x8181, + 0x4E97: 0x8182, + 0x4E98: 0xD8A8, + 0x4E99: 0x8183, + 0x4E9A: 0xD1C7, + 0x4E9B: 0xD0A9, + 0x4E9C: 0x8184, + 0x4E9D: 0x8185, + 0x4E9E: 0x8186, + 0x4E9F: 0xD8BD, + 0x4EA0: 0xD9EF, + 0x4EA1: 0xCDF6, + 0x4EA2: 0xBFBA, + 0x4EA3: 0x8187, + 0x4EA4: 0xBDBB, + 0x4EA5: 0xBAA5, + 0x4EA6: 0xD2E0, + 0x4EA7: 0xB2FA, + 0x4EA8: 0xBAE0, + 0x4EA9: 0xC4B6, + 0x4EAA: 0x8188, + 0x4EAB: 0xCFED, + 0x4EAC: 0xBEA9, + 0x4EAD: 0xCDA4, + 0x4EAE: 0xC1C1, + 0x4EAF: 0x8189, + 0x4EB0: 0x818A, + 0x4EB1: 0x818B, + 0x4EB2: 0xC7D7, + 0x4EB3: 0xD9F1, + 0x4EB4: 0x818C, + 0x4EB5: 0xD9F4, + 0x4EB6: 0x818D, + 0x4EB7: 0x818E, + 0x4EB8: 0x818F, + 0x4EB9: 0x8190, + 0x4EBA: 0xC8CB, + 0x4EBB: 0xD8E9, + 0x4EBC: 0x8191, + 0x4EBD: 0x8192, + 0x4EBE: 0x8193, + 0x4EBF: 0xD2DA, + 0x4EC0: 0xCAB2, + 0x4EC1: 0xC8CA, + 0x4EC2: 0xD8EC, + 0x4EC3: 0xD8EA, + 0x4EC4: 0xD8C6, + 0x4EC5: 0xBDF6, + 0x4EC6: 0xC6CD, + 0x4EC7: 0xB3F0, + 0x4EC8: 0x8194, + 0x4EC9: 0xD8EB, + 0x4ECA: 0xBDF1, + 0x4ECB: 0xBDE9, + 0x4ECC: 0x8195, + 0x4ECD: 0xC8D4, + 0x4ECE: 0xB4D3, + 0x4ECF: 0x8196, + 0x4ED0: 0x8197, + 0x4ED1: 0xC2D8, + 0x4ED2: 0x8198, + 0x4ED3: 0xB2D6, + 0x4ED4: 0xD7D0, + 0x4ED5: 0xCACB, + 0x4ED6: 0xCBFB, + 0x4ED7: 0xD5CC, + 0x4ED8: 0xB8B6, + 0x4ED9: 0xCFC9, + 0x4EDA: 0x8199, + 0x4EDB: 0x819A, + 0x4EDC: 0x819B, + 0x4EDD: 0xD9DA, + 0x4EDE: 0xD8F0, + 0x4EDF: 0xC7AA, + 0x4EE0: 0x819C, + 0x4EE1: 0xD8EE, + 0x4EE2: 0x819D, + 0x4EE3: 0xB4FA, + 0x4EE4: 0xC1EE, + 0x4EE5: 0xD2D4, + 0x4EE6: 0x819E, + 0x4EE7: 0x819F, + 0x4EE8: 0xD8ED, + 0x4EE9: 0x81A0, + 0x4EEA: 0xD2C7, + 0x4EEB: 0xD8EF, + 0x4EEC: 0xC3C7, + 0x4EED: 0x81A1, + 0x4EEE: 0x81A2, + 0x4EEF: 0x81A3, + 0x4EF0: 0xD1F6, + 0x4EF1: 0x81A4, + 0x4EF2: 0xD6D9, + 0x4EF3: 0xD8F2, + 0x4EF4: 0x81A5, + 0x4EF5: 0xD8F5, + 0x4EF6: 0xBCFE, + 0x4EF7: 0xBCDB, + 0x4EF8: 0x81A6, + 0x4EF9: 0x81A7, + 0x4EFA: 0x81A8, + 0x4EFB: 0xC8CE, + 0x4EFC: 0x81A9, + 0x4EFD: 0xB7DD, + 0x4EFE: 0x81AA, + 0x4EFF: 0xB7C2, + 0x4F00: 0x81AB, + 0x4F01: 0xC6F3, + 0x4F02: 0x81AC, + 0x4F03: 0x81AD, + 0x4F04: 0x81AE, + 0x4F05: 0x81AF, + 0x4F06: 0x81B0, + 0x4F07: 0x81B1, + 0x4F08: 0x81B2, + 0x4F09: 0xD8F8, + 0x4F0A: 0xD2C1, + 0x4F0B: 0x81B3, + 0x4F0C: 0x81B4, + 0x4F0D: 0xCEE9, + 0x4F0E: 0xBCBF, + 0x4F0F: 0xB7FC, + 0x4F10: 0xB7A5, + 0x4F11: 0xD0DD, + 0x4F12: 0x81B5, + 0x4F13: 0x81B6, + 0x4F14: 0x81B7, + 0x4F15: 0x81B8, + 0x4F16: 0x81B9, + 0x4F17: 0xD6DA, + 0x4F18: 0xD3C5, + 0x4F19: 0xBBEF, + 0x4F1A: 0xBBE1, + 0x4F1B: 0xD8F1, + 0x4F1C: 0x81BA, + 0x4F1D: 0x81BB, + 0x4F1E: 0xC9A1, + 0x4F1F: 0xCEB0, + 0x4F20: 0xB4AB, + 0x4F21: 0x81BC, + 0x4F22: 0xD8F3, + 0x4F23: 0x81BD, + 0x4F24: 0xC9CB, + 0x4F25: 0xD8F6, + 0x4F26: 0xC2D7, + 0x4F27: 0xD8F7, + 0x4F28: 0x81BE, + 0x4F29: 0x81BF, + 0x4F2A: 0xCEB1, + 0x4F2B: 0xD8F9, + 0x4F2C: 0x81C0, + 0x4F2D: 0x81C1, + 0x4F2E: 0x81C2, + 0x4F2F: 0xB2AE, + 0x4F30: 0xB9C0, + 0x4F31: 0x81C3, + 0x4F32: 0xD9A3, + 0x4F33: 0x81C4, + 0x4F34: 0xB0E9, + 0x4F35: 0x81C5, + 0x4F36: 0xC1E6, + 0x4F37: 0x81C6, + 0x4F38: 0xC9EC, + 0x4F39: 0x81C7, + 0x4F3A: 0xCBC5, + 0x4F3B: 0x81C8, + 0x4F3C: 0xCBC6, + 0x4F3D: 0xD9A4, + 0x4F3E: 0x81C9, + 0x4F3F: 0x81CA, + 0x4F40: 0x81CB, + 0x4F41: 0x81CC, + 0x4F42: 0x81CD, + 0x4F43: 0xB5E8, + 0x4F44: 0x81CE, + 0x4F45: 0x81CF, + 0x4F46: 0xB5AB, + 0x4F47: 0x81D0, + 0x4F48: 0x81D1, + 0x4F49: 0x81D2, + 0x4F4A: 0x81D3, + 0x4F4B: 0x81D4, + 0x4F4C: 0x81D5, + 0x4F4D: 0xCEBB, + 0x4F4E: 0xB5CD, + 0x4F4F: 0xD7A1, + 0x4F50: 0xD7F4, + 0x4F51: 0xD3D3, + 0x4F52: 0x81D6, + 0x4F53: 0xCCE5, + 0x4F54: 0x81D7, + 0x4F55: 0xBACE, + 0x4F56: 0x81D8, + 0x4F57: 0xD9A2, + 0x4F58: 0xD9DC, + 0x4F59: 0xD3E0, + 0x4F5A: 0xD8FD, + 0x4F5B: 0xB7F0, + 0x4F5C: 0xD7F7, + 0x4F5D: 0xD8FE, + 0x4F5E: 0xD8FA, + 0x4F5F: 0xD9A1, + 0x4F60: 0xC4E3, + 0x4F61: 0x81D9, + 0x4F62: 0x81DA, + 0x4F63: 0xD3B6, + 0x4F64: 0xD8F4, + 0x4F65: 0xD9DD, + 0x4F66: 0x81DB, + 0x4F67: 0xD8FB, + 0x4F68: 0x81DC, + 0x4F69: 0xC5E5, + 0x4F6A: 0x81DD, + 0x4F6B: 0x81DE, + 0x4F6C: 0xC0D0, + 0x4F6D: 0x81DF, + 0x4F6E: 0x81E0, + 0x4F6F: 0xD1F0, + 0x4F70: 0xB0DB, + 0x4F71: 0x81E1, + 0x4F72: 0x81E2, + 0x4F73: 0xBCD1, + 0x4F74: 0xD9A6, + 0x4F75: 0x81E3, + 0x4F76: 0xD9A5, + 0x4F77: 0x81E4, + 0x4F78: 0x81E5, + 0x4F79: 0x81E6, + 0x4F7A: 0x81E7, + 0x4F7B: 0xD9AC, + 0x4F7C: 0xD9AE, + 0x4F7D: 0x81E8, + 0x4F7E: 0xD9AB, + 0x4F7F: 0xCAB9, + 0x4F80: 0x81E9, + 0x4F81: 0x81EA, + 0x4F82: 0x81EB, + 0x4F83: 0xD9A9, + 0x4F84: 0xD6B6, + 0x4F85: 0x81EC, + 0x4F86: 0x81ED, + 0x4F87: 0x81EE, + 0x4F88: 0xB3DE, + 0x4F89: 0xD9A8, + 0x4F8A: 0x81EF, + 0x4F8B: 0xC0FD, + 0x4F8C: 0x81F0, + 0x4F8D: 0xCACC, + 0x4F8E: 0x81F1, + 0x4F8F: 0xD9AA, + 0x4F90: 0x81F2, + 0x4F91: 0xD9A7, + 0x4F92: 0x81F3, + 0x4F93: 0x81F4, + 0x4F94: 0xD9B0, + 0x4F95: 0x81F5, + 0x4F96: 0x81F6, + 0x4F97: 0xB6B1, + 0x4F98: 0x81F7, + 0x4F99: 0x81F8, + 0x4F9A: 0x81F9, + 0x4F9B: 0xB9A9, + 0x4F9C: 0x81FA, + 0x4F9D: 0xD2C0, + 0x4F9E: 0x81FB, + 0x4F9F: 0x81FC, + 0x4FA0: 0xCFC0, + 0x4FA1: 0x81FD, + 0x4FA2: 0x81FE, + 0x4FA3: 0xC2C2, + 0x4FA4: 0x8240, + 0x4FA5: 0xBDC4, + 0x4FA6: 0xD5EC, + 0x4FA7: 0xB2E0, + 0x4FA8: 0xC7C8, + 0x4FA9: 0xBFEB, + 0x4FAA: 0xD9AD, + 0x4FAB: 0x8241, + 0x4FAC: 0xD9AF, + 0x4FAD: 0x8242, + 0x4FAE: 0xCEEA, + 0x4FAF: 0xBAEE, + 0x4FB0: 0x8243, + 0x4FB1: 0x8244, + 0x4FB2: 0x8245, + 0x4FB3: 0x8246, + 0x4FB4: 0x8247, + 0x4FB5: 0xC7D6, + 0x4FB6: 0x8248, + 0x4FB7: 0x8249, + 0x4FB8: 0x824A, + 0x4FB9: 0x824B, + 0x4FBA: 0x824C, + 0x4FBB: 0x824D, + 0x4FBC: 0x824E, + 0x4FBD: 0x824F, + 0x4FBE: 0x8250, + 0x4FBF: 0xB1E3, + 0x4FC0: 0x8251, + 0x4FC1: 0x8252, + 0x4FC2: 0x8253, + 0x4FC3: 0xB4D9, + 0x4FC4: 0xB6ED, + 0x4FC5: 0xD9B4, + 0x4FC6: 0x8254, + 0x4FC7: 0x8255, + 0x4FC8: 0x8256, + 0x4FC9: 0x8257, + 0x4FCA: 0xBFA1, + 0x4FCB: 0x8258, + 0x4FCC: 0x8259, + 0x4FCD: 0x825A, + 0x4FCE: 0xD9DE, + 0x4FCF: 0xC7CE, + 0x4FD0: 0xC0FE, + 0x4FD1: 0xD9B8, + 0x4FD2: 0x825B, + 0x4FD3: 0x825C, + 0x4FD4: 0x825D, + 0x4FD5: 0x825E, + 0x4FD6: 0x825F, + 0x4FD7: 0xCBD7, + 0x4FD8: 0xB7FD, + 0x4FD9: 0x8260, + 0x4FDA: 0xD9B5, + 0x4FDB: 0x8261, + 0x4FDC: 0xD9B7, + 0x4FDD: 0xB1A3, + 0x4FDE: 0xD3E1, + 0x4FDF: 0xD9B9, + 0x4FE0: 0x8262, + 0x4FE1: 0xD0C5, + 0x4FE2: 0x8263, + 0x4FE3: 0xD9B6, + 0x4FE4: 0x8264, + 0x4FE5: 0x8265, + 0x4FE6: 0xD9B1, + 0x4FE7: 0x8266, + 0x4FE8: 0xD9B2, + 0x4FE9: 0xC1A9, + 0x4FEA: 0xD9B3, + 0x4FEB: 0x8267, + 0x4FEC: 0x8268, + 0x4FED: 0xBCF3, + 0x4FEE: 0xD0DE, + 0x4FEF: 0xB8A9, + 0x4FF0: 0x8269, + 0x4FF1: 0xBEE3, + 0x4FF2: 0x826A, + 0x4FF3: 0xD9BD, + 0x4FF4: 0x826B, + 0x4FF5: 0x826C, + 0x4FF6: 0x826D, + 0x4FF7: 0x826E, + 0x4FF8: 0xD9BA, + 0x4FF9: 0x826F, + 0x4FFA: 0xB0B3, + 0x4FFB: 0x8270, + 0x4FFC: 0x8271, + 0x4FFD: 0x8272, + 0x4FFE: 0xD9C2, + 0x4FFF: 0x8273, + 0x5000: 0x8274, + 0x5001: 0x8275, + 0x5002: 0x8276, + 0x5003: 0x8277, + 0x5004: 0x8278, + 0x5005: 0x8279, + 0x5006: 0x827A, + 0x5007: 0x827B, + 0x5008: 0x827C, + 0x5009: 0x827D, + 0x500A: 0x827E, + 0x500B: 0x8280, + 0x500C: 0xD9C4, + 0x500D: 0xB1B6, + 0x500E: 0x8281, + 0x500F: 0xD9BF, + 0x5010: 0x8282, + 0x5011: 0x8283, + 0x5012: 0xB5B9, + 0x5013: 0x8284, + 0x5014: 0xBEF3, + 0x5015: 0x8285, + 0x5016: 0x8286, + 0x5017: 0x8287, + 0x5018: 0xCCC8, + 0x5019: 0xBAF2, + 0x501A: 0xD2D0, + 0x501B: 0x8288, + 0x501C: 0xD9C3, + 0x501D: 0x8289, + 0x501E: 0x828A, + 0x501F: 0xBDE8, + 0x5020: 0x828B, + 0x5021: 0xB3AB, + 0x5022: 0x828C, + 0x5023: 0x828D, + 0x5024: 0x828E, + 0x5025: 0xD9C5, + 0x5026: 0xBEEB, + 0x5027: 0x828F, + 0x5028: 0xD9C6, + 0x5029: 0xD9BB, + 0x502A: 0xC4DF, + 0x502B: 0x8290, + 0x502C: 0xD9BE, + 0x502D: 0xD9C1, + 0x502E: 0xD9C0, + 0x502F: 0x8291, + 0x5030: 0x8292, + 0x5031: 0x8293, + 0x5032: 0x8294, + 0x5033: 0x8295, + 0x5034: 0x8296, + 0x5035: 0x8297, + 0x5036: 0x8298, + 0x5037: 0x8299, + 0x5038: 0x829A, + 0x5039: 0x829B, + 0x503A: 0xD5AE, + 0x503B: 0x829C, + 0x503C: 0xD6B5, + 0x503D: 0x829D, + 0x503E: 0xC7E3, + 0x503F: 0x829E, + 0x5040: 0x829F, + 0x5041: 0x82A0, + 0x5042: 0x82A1, + 0x5043: 0xD9C8, + 0x5044: 0x82A2, + 0x5045: 0x82A3, + 0x5046: 0x82A4, + 0x5047: 0xBCD9, + 0x5048: 0xD9CA, + 0x5049: 0x82A5, + 0x504A: 0x82A6, + 0x504B: 0x82A7, + 0x504C: 0xD9BC, + 0x504D: 0x82A8, + 0x504E: 0xD9CB, + 0x504F: 0xC6AB, + 0x5050: 0x82A9, + 0x5051: 0x82AA, + 0x5052: 0x82AB, + 0x5053: 0x82AC, + 0x5054: 0x82AD, + 0x5055: 0xD9C9, + 0x5056: 0x82AE, + 0x5057: 0x82AF, + 0x5058: 0x82B0, + 0x5059: 0x82B1, + 0x505A: 0xD7F6, + 0x505B: 0x82B2, + 0x505C: 0xCDA3, + 0x505D: 0x82B3, + 0x505E: 0x82B4, + 0x505F: 0x82B5, + 0x5060: 0x82B6, + 0x5061: 0x82B7, + 0x5062: 0x82B8, + 0x5063: 0x82B9, + 0x5064: 0x82BA, + 0x5065: 0xBDA1, + 0x5066: 0x82BB, + 0x5067: 0x82BC, + 0x5068: 0x82BD, + 0x5069: 0x82BE, + 0x506A: 0x82BF, + 0x506B: 0x82C0, + 0x506C: 0xD9CC, + 0x506D: 0x82C1, + 0x506E: 0x82C2, + 0x506F: 0x82C3, + 0x5070: 0x82C4, + 0x5071: 0x82C5, + 0x5072: 0x82C6, + 0x5073: 0x82C7, + 0x5074: 0x82C8, + 0x5075: 0x82C9, + 0x5076: 0xC5BC, + 0x5077: 0xCDB5, + 0x5078: 0x82CA, + 0x5079: 0x82CB, + 0x507A: 0x82CC, + 0x507B: 0xD9CD, + 0x507C: 0x82CD, + 0x507D: 0x82CE, + 0x507E: 0xD9C7, + 0x507F: 0xB3A5, + 0x5080: 0xBFFE, + 0x5081: 0x82CF, + 0x5082: 0x82D0, + 0x5083: 0x82D1, + 0x5084: 0x82D2, + 0x5085: 0xB8B5, + 0x5086: 0x82D3, + 0x5087: 0x82D4, + 0x5088: 0xC0FC, + 0x5089: 0x82D5, + 0x508A: 0x82D6, + 0x508B: 0x82D7, + 0x508C: 0x82D8, + 0x508D: 0xB0F8, + 0x508E: 0x82D9, + 0x508F: 0x82DA, + 0x5090: 0x82DB, + 0x5091: 0x82DC, + 0x5092: 0x82DD, + 0x5093: 0x82DE, + 0x5094: 0x82DF, + 0x5095: 0x82E0, + 0x5096: 0x82E1, + 0x5097: 0x82E2, + 0x5098: 0x82E3, + 0x5099: 0x82E4, + 0x509A: 0x82E5, + 0x509B: 0x82E6, + 0x509C: 0x82E7, + 0x509D: 0x82E8, + 0x509E: 0x82E9, + 0x509F: 0x82EA, + 0x50A0: 0x82EB, + 0x50A1: 0x82EC, + 0x50A2: 0x82ED, + 0x50A3: 0xB4F6, + 0x50A4: 0x82EE, + 0x50A5: 0xD9CE, + 0x50A6: 0x82EF, + 0x50A7: 0xD9CF, + 0x50A8: 0xB4A2, + 0x50A9: 0xD9D0, + 0x50AA: 0x82F0, + 0x50AB: 0x82F1, + 0x50AC: 0xB4DF, + 0x50AD: 0x82F2, + 0x50AE: 0x82F3, + 0x50AF: 0x82F4, + 0x50B0: 0x82F5, + 0x50B1: 0x82F6, + 0x50B2: 0xB0C1, + 0x50B3: 0x82F7, + 0x50B4: 0x82F8, + 0x50B5: 0x82F9, + 0x50B6: 0x82FA, + 0x50B7: 0x82FB, + 0x50B8: 0x82FC, + 0x50B9: 0x82FD, + 0x50BA: 0xD9D1, + 0x50BB: 0xC9B5, + 0x50BC: 0x82FE, + 0x50BD: 0x8340, + 0x50BE: 0x8341, + 0x50BF: 0x8342, + 0x50C0: 0x8343, + 0x50C1: 0x8344, + 0x50C2: 0x8345, + 0x50C3: 0x8346, + 0x50C4: 0x8347, + 0x50C5: 0x8348, + 0x50C6: 0x8349, + 0x50C7: 0x834A, + 0x50C8: 0x834B, + 0x50C9: 0x834C, + 0x50CA: 0x834D, + 0x50CB: 0x834E, + 0x50CC: 0x834F, + 0x50CD: 0x8350, + 0x50CE: 0x8351, + 0x50CF: 0xCFF1, + 0x50D0: 0x8352, + 0x50D1: 0x8353, + 0x50D2: 0x8354, + 0x50D3: 0x8355, + 0x50D4: 0x8356, + 0x50D5: 0x8357, + 0x50D6: 0xD9D2, + 0x50D7: 0x8358, + 0x50D8: 0x8359, + 0x50D9: 0x835A, + 0x50DA: 0xC1C5, + 0x50DB: 0x835B, + 0x50DC: 0x835C, + 0x50DD: 0x835D, + 0x50DE: 0x835E, + 0x50DF: 0x835F, + 0x50E0: 0x8360, + 0x50E1: 0x8361, + 0x50E2: 0x8362, + 0x50E3: 0x8363, + 0x50E4: 0x8364, + 0x50E5: 0x8365, + 0x50E6: 0xD9D6, + 0x50E7: 0xC9AE, + 0x50E8: 0x8366, + 0x50E9: 0x8367, + 0x50EA: 0x8368, + 0x50EB: 0x8369, + 0x50EC: 0xD9D5, + 0x50ED: 0xD9D4, + 0x50EE: 0xD9D7, + 0x50EF: 0x836A, + 0x50F0: 0x836B, + 0x50F1: 0x836C, + 0x50F2: 0x836D, + 0x50F3: 0xCBDB, + 0x50F4: 0x836E, + 0x50F5: 0xBDA9, + 0x50F6: 0x836F, + 0x50F7: 0x8370, + 0x50F8: 0x8371, + 0x50F9: 0x8372, + 0x50FA: 0x8373, + 0x50FB: 0xC6A7, + 0x50FC: 0x8374, + 0x50FD: 0x8375, + 0x50FE: 0x8376, + 0x50FF: 0x8377, + 0x5100: 0x8378, + 0x5101: 0x8379, + 0x5102: 0x837A, + 0x5103: 0x837B, + 0x5104: 0x837C, + 0x5105: 0x837D, + 0x5106: 0xD9D3, + 0x5107: 0xD9D8, + 0x5108: 0x837E, + 0x5109: 0x8380, + 0x510A: 0x8381, + 0x510B: 0xD9D9, + 0x510C: 0x8382, + 0x510D: 0x8383, + 0x510E: 0x8384, + 0x510F: 0x8385, + 0x5110: 0x8386, + 0x5111: 0x8387, + 0x5112: 0xC8E5, + 0x5113: 0x8388, + 0x5114: 0x8389, + 0x5115: 0x838A, + 0x5116: 0x838B, + 0x5117: 0x838C, + 0x5118: 0x838D, + 0x5119: 0x838E, + 0x511A: 0x838F, + 0x511B: 0x8390, + 0x511C: 0x8391, + 0x511D: 0x8392, + 0x511E: 0x8393, + 0x511F: 0x8394, + 0x5120: 0x8395, + 0x5121: 0xC0DC, + 0x5122: 0x8396, + 0x5123: 0x8397, + 0x5124: 0x8398, + 0x5125: 0x8399, + 0x5126: 0x839A, + 0x5127: 0x839B, + 0x5128: 0x839C, + 0x5129: 0x839D, + 0x512A: 0x839E, + 0x512B: 0x839F, + 0x512C: 0x83A0, + 0x512D: 0x83A1, + 0x512E: 0x83A2, + 0x512F: 0x83A3, + 0x5130: 0x83A4, + 0x5131: 0x83A5, + 0x5132: 0x83A6, + 0x5133: 0x83A7, + 0x5134: 0x83A8, + 0x5135: 0x83A9, + 0x5136: 0x83AA, + 0x5137: 0x83AB, + 0x5138: 0x83AC, + 0x5139: 0x83AD, + 0x513A: 0x83AE, + 0x513B: 0x83AF, + 0x513C: 0x83B0, + 0x513D: 0x83B1, + 0x513E: 0x83B2, + 0x513F: 0xB6F9, + 0x5140: 0xD8A3, + 0x5141: 0xD4CA, + 0x5142: 0x83B3, + 0x5143: 0xD4AA, + 0x5144: 0xD0D6, + 0x5145: 0xB3E4, + 0x5146: 0xD5D7, + 0x5147: 0x83B4, + 0x5148: 0xCFC8, + 0x5149: 0xB9E2, + 0x514A: 0x83B5, + 0x514B: 0xBFCB, + 0x514C: 0x83B6, + 0x514D: 0xC3E2, + 0x514E: 0x83B7, + 0x514F: 0x83B8, + 0x5150: 0x83B9, + 0x5151: 0xB6D2, + 0x5152: 0x83BA, + 0x5153: 0x83BB, + 0x5154: 0xCDC3, + 0x5155: 0xD9EE, + 0x5156: 0xD9F0, + 0x5157: 0x83BC, + 0x5158: 0x83BD, + 0x5159: 0x83BE, + 0x515A: 0xB5B3, + 0x515B: 0x83BF, + 0x515C: 0xB6B5, + 0x515D: 0x83C0, + 0x515E: 0x83C1, + 0x515F: 0x83C2, + 0x5160: 0x83C3, + 0x5161: 0x83C4, + 0x5162: 0xBEA4, + 0x5163: 0x83C5, + 0x5164: 0x83C6, + 0x5165: 0xC8EB, + 0x5166: 0x83C7, + 0x5167: 0x83C8, + 0x5168: 0xC8AB, + 0x5169: 0x83C9, + 0x516A: 0x83CA, + 0x516B: 0xB0CB, + 0x516C: 0xB9AB, + 0x516D: 0xC1F9, + 0x516E: 0xD9E2, + 0x516F: 0x83CB, + 0x5170: 0xC0BC, + 0x5171: 0xB9B2, + 0x5172: 0x83CC, + 0x5173: 0xB9D8, + 0x5174: 0xD0CB, + 0x5175: 0xB1F8, + 0x5176: 0xC6E4, + 0x5177: 0xBEDF, + 0x5178: 0xB5E4, + 0x5179: 0xD7C8, + 0x517A: 0x83CD, + 0x517B: 0xD1F8, + 0x517C: 0xBCE6, + 0x517D: 0xCADE, + 0x517E: 0x83CE, + 0x517F: 0x83CF, + 0x5180: 0xBCBD, + 0x5181: 0xD9E6, + 0x5182: 0xD8E7, + 0x5183: 0x83D0, + 0x5184: 0x83D1, + 0x5185: 0xC4DA, + 0x5186: 0x83D2, + 0x5187: 0x83D3, + 0x5188: 0xB8D4, + 0x5189: 0xC8BD, + 0x518A: 0x83D4, + 0x518B: 0x83D5, + 0x518C: 0xB2E1, + 0x518D: 0xD4D9, + 0x518E: 0x83D6, + 0x518F: 0x83D7, + 0x5190: 0x83D8, + 0x5191: 0x83D9, + 0x5192: 0xC3B0, + 0x5193: 0x83DA, + 0x5194: 0x83DB, + 0x5195: 0xC3E1, + 0x5196: 0xDAA2, + 0x5197: 0xC8DF, + 0x5198: 0x83DC, + 0x5199: 0xD0B4, + 0x519A: 0x83DD, + 0x519B: 0xBEFC, + 0x519C: 0xC5A9, + 0x519D: 0x83DE, + 0x519E: 0x83DF, + 0x519F: 0x83E0, + 0x51A0: 0xB9DA, + 0x51A1: 0x83E1, + 0x51A2: 0xDAA3, + 0x51A3: 0x83E2, + 0x51A4: 0xD4A9, + 0x51A5: 0xDAA4, + 0x51A6: 0x83E3, + 0x51A7: 0x83E4, + 0x51A8: 0x83E5, + 0x51A9: 0x83E6, + 0x51AA: 0x83E7, + 0x51AB: 0xD9FB, + 0x51AC: 0xB6AC, + 0x51AD: 0x83E8, + 0x51AE: 0x83E9, + 0x51AF: 0xB7EB, + 0x51B0: 0xB1F9, + 0x51B1: 0xD9FC, + 0x51B2: 0xB3E5, + 0x51B3: 0xBEF6, + 0x51B4: 0x83EA, + 0x51B5: 0xBFF6, + 0x51B6: 0xD2B1, + 0x51B7: 0xC0E4, + 0x51B8: 0x83EB, + 0x51B9: 0x83EC, + 0x51BA: 0x83ED, + 0x51BB: 0xB6B3, + 0x51BC: 0xD9FE, + 0x51BD: 0xD9FD, + 0x51BE: 0x83EE, + 0x51BF: 0x83EF, + 0x51C0: 0xBEBB, + 0x51C1: 0x83F0, + 0x51C2: 0x83F1, + 0x51C3: 0x83F2, + 0x51C4: 0xC6E0, + 0x51C5: 0x83F3, + 0x51C6: 0xD7BC, + 0x51C7: 0xDAA1, + 0x51C8: 0x83F4, + 0x51C9: 0xC1B9, + 0x51CA: 0x83F5, + 0x51CB: 0xB5F2, + 0x51CC: 0xC1E8, + 0x51CD: 0x83F6, + 0x51CE: 0x83F7, + 0x51CF: 0xBCF5, + 0x51D0: 0x83F8, + 0x51D1: 0xB4D5, + 0x51D2: 0x83F9, + 0x51D3: 0x83FA, + 0x51D4: 0x83FB, + 0x51D5: 0x83FC, + 0x51D6: 0x83FD, + 0x51D7: 0x83FE, + 0x51D8: 0x8440, + 0x51D9: 0x8441, + 0x51DA: 0x8442, + 0x51DB: 0xC1DD, + 0x51DC: 0x8443, + 0x51DD: 0xC4FD, + 0x51DE: 0x8444, + 0x51DF: 0x8445, + 0x51E0: 0xBCB8, + 0x51E1: 0xB7B2, + 0x51E2: 0x8446, + 0x51E3: 0x8447, + 0x51E4: 0xB7EF, + 0x51E5: 0x8448, + 0x51E6: 0x8449, + 0x51E7: 0x844A, + 0x51E8: 0x844B, + 0x51E9: 0x844C, + 0x51EA: 0x844D, + 0x51EB: 0xD9EC, + 0x51EC: 0x844E, + 0x51ED: 0xC6BE, + 0x51EE: 0x844F, + 0x51EF: 0xBFAD, + 0x51F0: 0xBBCB, + 0x51F1: 0x8450, + 0x51F2: 0x8451, + 0x51F3: 0xB5CA, + 0x51F4: 0x8452, + 0x51F5: 0xDBC9, + 0x51F6: 0xD0D7, + 0x51F7: 0x8453, + 0x51F8: 0xCDB9, + 0x51F9: 0xB0BC, + 0x51FA: 0xB3F6, + 0x51FB: 0xBBF7, + 0x51FC: 0xDBCA, + 0x51FD: 0xBAAF, + 0x51FE: 0x8454, + 0x51FF: 0xD4E4, + 0x5200: 0xB5B6, + 0x5201: 0xB5F3, + 0x5202: 0xD8D6, + 0x5203: 0xC8D0, + 0x5204: 0x8455, + 0x5205: 0x8456, + 0x5206: 0xB7D6, + 0x5207: 0xC7D0, + 0x5208: 0xD8D7, + 0x5209: 0x8457, + 0x520A: 0xBFAF, + 0x520B: 0x8458, + 0x520C: 0x8459, + 0x520D: 0xDBBB, + 0x520E: 0xD8D8, + 0x520F: 0x845A, + 0x5210: 0x845B, + 0x5211: 0xD0CC, + 0x5212: 0xBBAE, + 0x5213: 0x845C, + 0x5214: 0x845D, + 0x5215: 0x845E, + 0x5216: 0xEBBE, + 0x5217: 0xC1D0, + 0x5218: 0xC1F5, + 0x5219: 0xD4F2, + 0x521A: 0xB8D5, + 0x521B: 0xB4B4, + 0x521C: 0x845F, + 0x521D: 0xB3F5, + 0x521E: 0x8460, + 0x521F: 0x8461, + 0x5220: 0xC9BE, + 0x5221: 0x8462, + 0x5222: 0x8463, + 0x5223: 0x8464, + 0x5224: 0xC5D0, + 0x5225: 0x8465, + 0x5226: 0x8466, + 0x5227: 0x8467, + 0x5228: 0xC5D9, + 0x5229: 0xC0FB, + 0x522A: 0x8468, + 0x522B: 0xB1F0, + 0x522C: 0x8469, + 0x522D: 0xD8D9, + 0x522E: 0xB9CE, + 0x522F: 0x846A, + 0x5230: 0xB5BD, + 0x5231: 0x846B, + 0x5232: 0x846C, + 0x5233: 0xD8DA, + 0x5234: 0x846D, + 0x5235: 0x846E, + 0x5236: 0xD6C6, + 0x5237: 0xCBA2, + 0x5238: 0xC8AF, + 0x5239: 0xC9B2, + 0x523A: 0xB4CC, + 0x523B: 0xBFCC, + 0x523C: 0x846F, + 0x523D: 0xB9F4, + 0x523E: 0x8470, + 0x523F: 0xD8DB, + 0x5240: 0xD8DC, + 0x5241: 0xB6E7, + 0x5242: 0xBCC1, + 0x5243: 0xCCEA, + 0x5244: 0x8471, + 0x5245: 0x8472, + 0x5246: 0x8473, + 0x5247: 0x8474, + 0x5248: 0x8475, + 0x5249: 0x8476, + 0x524A: 0xCFF7, + 0x524B: 0x8477, + 0x524C: 0xD8DD, + 0x524D: 0xC7B0, + 0x524E: 0x8478, + 0x524F: 0x8479, + 0x5250: 0xB9D0, + 0x5251: 0xBDA3, + 0x5252: 0x847A, + 0x5253: 0x847B, + 0x5254: 0xCCDE, + 0x5255: 0x847C, + 0x5256: 0xC6CA, + 0x5257: 0x847D, + 0x5258: 0x847E, + 0x5259: 0x8480, + 0x525A: 0x8481, + 0x525B: 0x8482, + 0x525C: 0xD8E0, + 0x525D: 0x8483, + 0x525E: 0xD8DE, + 0x525F: 0x8484, + 0x5260: 0x8485, + 0x5261: 0xD8DF, + 0x5262: 0x8486, + 0x5263: 0x8487, + 0x5264: 0x8488, + 0x5265: 0xB0FE, + 0x5266: 0x8489, + 0x5267: 0xBEE7, + 0x5268: 0x848A, + 0x5269: 0xCAA3, + 0x526A: 0xBCF4, + 0x526B: 0x848B, + 0x526C: 0x848C, + 0x526D: 0x848D, + 0x526E: 0x848E, + 0x526F: 0xB8B1, + 0x5270: 0x848F, + 0x5271: 0x8490, + 0x5272: 0xB8EE, + 0x5273: 0x8491, + 0x5274: 0x8492, + 0x5275: 0x8493, + 0x5276: 0x8494, + 0x5277: 0x8495, + 0x5278: 0x8496, + 0x5279: 0x8497, + 0x527A: 0x8498, + 0x527B: 0x8499, + 0x527C: 0x849A, + 0x527D: 0xD8E2, + 0x527E: 0x849B, + 0x527F: 0xBDCB, + 0x5280: 0x849C, + 0x5281: 0xD8E4, + 0x5282: 0xD8E3, + 0x5283: 0x849D, + 0x5284: 0x849E, + 0x5285: 0x849F, + 0x5286: 0x84A0, + 0x5287: 0x84A1, + 0x5288: 0xC5FC, + 0x5289: 0x84A2, + 0x528A: 0x84A3, + 0x528B: 0x84A4, + 0x528C: 0x84A5, + 0x528D: 0x84A6, + 0x528E: 0x84A7, + 0x528F: 0x84A8, + 0x5290: 0xD8E5, + 0x5291: 0x84A9, + 0x5292: 0x84AA, + 0x5293: 0xD8E6, + 0x5294: 0x84AB, + 0x5295: 0x84AC, + 0x5296: 0x84AD, + 0x5297: 0x84AE, + 0x5298: 0x84AF, + 0x5299: 0x84B0, + 0x529A: 0x84B1, + 0x529B: 0xC1A6, + 0x529C: 0x84B2, + 0x529D: 0xC8B0, + 0x529E: 0xB0EC, + 0x529F: 0xB9A6, + 0x52A0: 0xBCD3, + 0x52A1: 0xCEF1, + 0x52A2: 0xDBBD, + 0x52A3: 0xC1D3, + 0x52A4: 0x84B3, + 0x52A5: 0x84B4, + 0x52A6: 0x84B5, + 0x52A7: 0x84B6, + 0x52A8: 0xB6AF, + 0x52A9: 0xD6FA, + 0x52AA: 0xC5AC, + 0x52AB: 0xBDD9, + 0x52AC: 0xDBBE, + 0x52AD: 0xDBBF, + 0x52AE: 0x84B7, + 0x52AF: 0x84B8, + 0x52B0: 0x84B9, + 0x52B1: 0xC0F8, + 0x52B2: 0xBEA2, + 0x52B3: 0xC0CD, + 0x52B4: 0x84BA, + 0x52B5: 0x84BB, + 0x52B6: 0x84BC, + 0x52B7: 0x84BD, + 0x52B8: 0x84BE, + 0x52B9: 0x84BF, + 0x52BA: 0x84C0, + 0x52BB: 0x84C1, + 0x52BC: 0x84C2, + 0x52BD: 0x84C3, + 0x52BE: 0xDBC0, + 0x52BF: 0xCAC6, + 0x52C0: 0x84C4, + 0x52C1: 0x84C5, + 0x52C2: 0x84C6, + 0x52C3: 0xB2AA, + 0x52C4: 0x84C7, + 0x52C5: 0x84C8, + 0x52C6: 0x84C9, + 0x52C7: 0xD3C2, + 0x52C8: 0x84CA, + 0x52C9: 0xC3E3, + 0x52CA: 0x84CB, + 0x52CB: 0xD1AB, + 0x52CC: 0x84CC, + 0x52CD: 0x84CD, + 0x52CE: 0x84CE, + 0x52CF: 0x84CF, + 0x52D0: 0xDBC2, + 0x52D1: 0x84D0, + 0x52D2: 0xC0D5, + 0x52D3: 0x84D1, + 0x52D4: 0x84D2, + 0x52D5: 0x84D3, + 0x52D6: 0xDBC3, + 0x52D7: 0x84D4, + 0x52D8: 0xBFB1, + 0x52D9: 0x84D5, + 0x52DA: 0x84D6, + 0x52DB: 0x84D7, + 0x52DC: 0x84D8, + 0x52DD: 0x84D9, + 0x52DE: 0x84DA, + 0x52DF: 0xC4BC, + 0x52E0: 0x84DB, + 0x52E1: 0x84DC, + 0x52E2: 0x84DD, + 0x52E3: 0x84DE, + 0x52E4: 0xC7DA, + 0x52E5: 0x84DF, + 0x52E6: 0x84E0, + 0x52E7: 0x84E1, + 0x52E8: 0x84E2, + 0x52E9: 0x84E3, + 0x52EA: 0x84E4, + 0x52EB: 0x84E5, + 0x52EC: 0x84E6, + 0x52ED: 0x84E7, + 0x52EE: 0x84E8, + 0x52EF: 0x84E9, + 0x52F0: 0xDBC4, + 0x52F1: 0x84EA, + 0x52F2: 0x84EB, + 0x52F3: 0x84EC, + 0x52F4: 0x84ED, + 0x52F5: 0x84EE, + 0x52F6: 0x84EF, + 0x52F7: 0x84F0, + 0x52F8: 0x84F1, + 0x52F9: 0xD9E8, + 0x52FA: 0xC9D7, + 0x52FB: 0x84F2, + 0x52FC: 0x84F3, + 0x52FD: 0x84F4, + 0x52FE: 0xB9B4, + 0x52FF: 0xCEF0, + 0x5300: 0xD4C8, + 0x5301: 0x84F5, + 0x5302: 0x84F6, + 0x5303: 0x84F7, + 0x5304: 0x84F8, + 0x5305: 0xB0FC, + 0x5306: 0xB4D2, + 0x5307: 0x84F9, + 0x5308: 0xD0D9, + 0x5309: 0x84FA, + 0x530A: 0x84FB, + 0x530B: 0x84FC, + 0x530C: 0x84FD, + 0x530D: 0xD9E9, + 0x530E: 0x84FE, + 0x530F: 0xDECB, + 0x5310: 0xD9EB, + 0x5311: 0x8540, + 0x5312: 0x8541, + 0x5313: 0x8542, + 0x5314: 0x8543, + 0x5315: 0xD8B0, + 0x5316: 0xBBAF, + 0x5317: 0xB1B1, + 0x5318: 0x8544, + 0x5319: 0xB3D7, + 0x531A: 0xD8CE, + 0x531B: 0x8545, + 0x531C: 0x8546, + 0x531D: 0xD4D1, + 0x531E: 0x8547, + 0x531F: 0x8548, + 0x5320: 0xBDB3, + 0x5321: 0xBFEF, + 0x5322: 0x8549, + 0x5323: 0xCFBB, + 0x5324: 0x854A, + 0x5325: 0x854B, + 0x5326: 0xD8D0, + 0x5327: 0x854C, + 0x5328: 0x854D, + 0x5329: 0x854E, + 0x532A: 0xB7CB, + 0x532B: 0x854F, + 0x532C: 0x8550, + 0x532D: 0x8551, + 0x532E: 0xD8D1, + 0x532F: 0x8552, + 0x5330: 0x8553, + 0x5331: 0x8554, + 0x5332: 0x8555, + 0x5333: 0x8556, + 0x5334: 0x8557, + 0x5335: 0x8558, + 0x5336: 0x8559, + 0x5337: 0x855A, + 0x5338: 0x855B, + 0x5339: 0xC6A5, + 0x533A: 0xC7F8, + 0x533B: 0xD2BD, + 0x533C: 0x855C, + 0x533D: 0x855D, + 0x533E: 0xD8D2, + 0x533F: 0xC4E4, + 0x5340: 0x855E, + 0x5341: 0xCAAE, + 0x5342: 0x855F, + 0x5343: 0xC7A7, + 0x5344: 0x8560, + 0x5345: 0xD8A6, + 0x5346: 0x8561, + 0x5347: 0xC9FD, + 0x5348: 0xCEE7, + 0x5349: 0xBBDC, + 0x534A: 0xB0EB, + 0x534B: 0x8562, + 0x534C: 0x8563, + 0x534D: 0x8564, + 0x534E: 0xBBAA, + 0x534F: 0xD0AD, + 0x5350: 0x8565, + 0x5351: 0xB1B0, + 0x5352: 0xD7E4, + 0x5353: 0xD7BF, + 0x5354: 0x8566, + 0x5355: 0xB5A5, + 0x5356: 0xC2F4, + 0x5357: 0xC4CF, + 0x5358: 0x8567, + 0x5359: 0x8568, + 0x535A: 0xB2A9, + 0x535B: 0x8569, + 0x535C: 0xB2B7, + 0x535D: 0x856A, + 0x535E: 0xB1E5, + 0x535F: 0xDFB2, + 0x5360: 0xD5BC, + 0x5361: 0xBFA8, + 0x5362: 0xC2AC, + 0x5363: 0xD8D5, + 0x5364: 0xC2B1, + 0x5365: 0x856B, + 0x5366: 0xD8D4, + 0x5367: 0xCED4, + 0x5368: 0x856C, + 0x5369: 0xDAE0, + 0x536A: 0x856D, + 0x536B: 0xCEC0, + 0x536C: 0x856E, + 0x536D: 0x856F, + 0x536E: 0xD8B4, + 0x536F: 0xC3AE, + 0x5370: 0xD3A1, + 0x5371: 0xCEA3, + 0x5372: 0x8570, + 0x5373: 0xBCB4, + 0x5374: 0xC8B4, + 0x5375: 0xC2D1, + 0x5376: 0x8571, + 0x5377: 0xBEED, + 0x5378: 0xD0B6, + 0x5379: 0x8572, + 0x537A: 0xDAE1, + 0x537B: 0x8573, + 0x537C: 0x8574, + 0x537D: 0x8575, + 0x537E: 0x8576, + 0x537F: 0xC7E4, + 0x5380: 0x8577, + 0x5381: 0x8578, + 0x5382: 0xB3A7, + 0x5383: 0x8579, + 0x5384: 0xB6F2, + 0x5385: 0xCCFC, + 0x5386: 0xC0FA, + 0x5387: 0x857A, + 0x5388: 0x857B, + 0x5389: 0xC0F7, + 0x538A: 0x857C, + 0x538B: 0xD1B9, + 0x538C: 0xD1E1, + 0x538D: 0xD8C7, + 0x538E: 0x857D, + 0x538F: 0x857E, + 0x5390: 0x8580, + 0x5391: 0x8581, + 0x5392: 0x8582, + 0x5393: 0x8583, + 0x5394: 0x8584, + 0x5395: 0xB2DE, + 0x5396: 0x8585, + 0x5397: 0x8586, + 0x5398: 0xC0E5, + 0x5399: 0x8587, + 0x539A: 0xBAF1, + 0x539B: 0x8588, + 0x539C: 0x8589, + 0x539D: 0xD8C8, + 0x539E: 0x858A, + 0x539F: 0xD4AD, + 0x53A0: 0x858B, + 0x53A1: 0x858C, + 0x53A2: 0xCFE1, + 0x53A3: 0xD8C9, + 0x53A4: 0x858D, + 0x53A5: 0xD8CA, + 0x53A6: 0xCFC3, + 0x53A7: 0x858E, + 0x53A8: 0xB3F8, + 0x53A9: 0xBEC7, + 0x53AA: 0x858F, + 0x53AB: 0x8590, + 0x53AC: 0x8591, + 0x53AD: 0x8592, + 0x53AE: 0xD8CB, + 0x53AF: 0x8593, + 0x53B0: 0x8594, + 0x53B1: 0x8595, + 0x53B2: 0x8596, + 0x53B3: 0x8597, + 0x53B4: 0x8598, + 0x53B5: 0x8599, + 0x53B6: 0xDBCC, + 0x53B7: 0x859A, + 0x53B8: 0x859B, + 0x53B9: 0x859C, + 0x53BA: 0x859D, + 0x53BB: 0xC8A5, + 0x53BC: 0x859E, + 0x53BD: 0x859F, + 0x53BE: 0x85A0, + 0x53BF: 0xCFD8, + 0x53C0: 0x85A1, + 0x53C1: 0xC8FE, + 0x53C2: 0xB2CE, + 0x53C3: 0x85A2, + 0x53C4: 0x85A3, + 0x53C5: 0x85A4, + 0x53C6: 0x85A5, + 0x53C7: 0x85A6, + 0x53C8: 0xD3D6, + 0x53C9: 0xB2E6, + 0x53CA: 0xBCB0, + 0x53CB: 0xD3D1, + 0x53CC: 0xCBAB, + 0x53CD: 0xB7B4, + 0x53CE: 0x85A7, + 0x53CF: 0x85A8, + 0x53D0: 0x85A9, + 0x53D1: 0xB7A2, + 0x53D2: 0x85AA, + 0x53D3: 0x85AB, + 0x53D4: 0xCAE5, + 0x53D5: 0x85AC, + 0x53D6: 0xC8A1, + 0x53D7: 0xCADC, + 0x53D8: 0xB1E4, + 0x53D9: 0xD0F0, + 0x53DA: 0x85AD, + 0x53DB: 0xC5D1, + 0x53DC: 0x85AE, + 0x53DD: 0x85AF, + 0x53DE: 0x85B0, + 0x53DF: 0xDBC5, + 0x53E0: 0xB5FE, + 0x53E1: 0x85B1, + 0x53E2: 0x85B2, + 0x53E3: 0xBFDA, + 0x53E4: 0xB9C5, + 0x53E5: 0xBEE4, + 0x53E6: 0xC1ED, + 0x53E7: 0x85B3, + 0x53E8: 0xDFB6, + 0x53E9: 0xDFB5, + 0x53EA: 0xD6BB, + 0x53EB: 0xBDD0, + 0x53EC: 0xD5D9, + 0x53ED: 0xB0C8, + 0x53EE: 0xB6A3, + 0x53EF: 0xBFC9, + 0x53F0: 0xCCA8, + 0x53F1: 0xDFB3, + 0x53F2: 0xCAB7, + 0x53F3: 0xD3D2, + 0x53F4: 0x85B4, + 0x53F5: 0xD8CF, + 0x53F6: 0xD2B6, + 0x53F7: 0xBAC5, + 0x53F8: 0xCBBE, + 0x53F9: 0xCCBE, + 0x53FA: 0x85B5, + 0x53FB: 0xDFB7, + 0x53FC: 0xB5F0, + 0x53FD: 0xDFB4, + 0x53FE: 0x85B6, + 0x53FF: 0x85B7, + 0x5400: 0x85B8, + 0x5401: 0xD3F5, + 0x5402: 0x85B9, + 0x5403: 0xB3D4, + 0x5404: 0xB8F7, + 0x5405: 0x85BA, + 0x5406: 0xDFBA, + 0x5407: 0x85BB, + 0x5408: 0xBACF, + 0x5409: 0xBCAA, + 0x540A: 0xB5F5, + 0x540B: 0x85BC, + 0x540C: 0xCDAC, + 0x540D: 0xC3FB, + 0x540E: 0xBAF3, + 0x540F: 0xC0F4, + 0x5410: 0xCDC2, + 0x5411: 0xCFF2, + 0x5412: 0xDFB8, + 0x5413: 0xCFC5, + 0x5414: 0x85BD, + 0x5415: 0xC2C0, + 0x5416: 0xDFB9, + 0x5417: 0xC2F0, + 0x5418: 0x85BE, + 0x5419: 0x85BF, + 0x541A: 0x85C0, + 0x541B: 0xBEFD, + 0x541C: 0x85C1, + 0x541D: 0xC1DF, + 0x541E: 0xCDCC, + 0x541F: 0xD2F7, + 0x5420: 0xB7CD, + 0x5421: 0xDFC1, + 0x5422: 0x85C2, + 0x5423: 0xDFC4, + 0x5424: 0x85C3, + 0x5425: 0x85C4, + 0x5426: 0xB7F1, + 0x5427: 0xB0C9, + 0x5428: 0xB6D6, + 0x5429: 0xB7D4, + 0x542A: 0x85C5, + 0x542B: 0xBAAC, + 0x542C: 0xCCFD, + 0x542D: 0xBFD4, + 0x542E: 0xCBB1, + 0x542F: 0xC6F4, + 0x5430: 0x85C6, + 0x5431: 0xD6A8, + 0x5432: 0xDFC5, + 0x5433: 0x85C7, + 0x5434: 0xCEE2, + 0x5435: 0xB3B3, + 0x5436: 0x85C8, + 0x5437: 0x85C9, + 0x5438: 0xCEFC, + 0x5439: 0xB4B5, + 0x543A: 0x85CA, + 0x543B: 0xCEC7, + 0x543C: 0xBAF0, + 0x543D: 0x85CB, + 0x543E: 0xCEE1, + 0x543F: 0x85CC, + 0x5440: 0xD1BD, + 0x5441: 0x85CD, + 0x5442: 0x85CE, + 0x5443: 0xDFC0, + 0x5444: 0x85CF, + 0x5445: 0x85D0, + 0x5446: 0xB4F4, + 0x5447: 0x85D1, + 0x5448: 0xB3CA, + 0x5449: 0x85D2, + 0x544A: 0xB8E6, + 0x544B: 0xDFBB, + 0x544C: 0x85D3, + 0x544D: 0x85D4, + 0x544E: 0x85D5, + 0x544F: 0x85D6, + 0x5450: 0xC4C5, + 0x5451: 0x85D7, + 0x5452: 0xDFBC, + 0x5453: 0xDFBD, + 0x5454: 0xDFBE, + 0x5455: 0xC5BB, + 0x5456: 0xDFBF, + 0x5457: 0xDFC2, + 0x5458: 0xD4B1, + 0x5459: 0xDFC3, + 0x545A: 0x85D8, + 0x545B: 0xC7BA, + 0x545C: 0xCED8, + 0x545D: 0x85D9, + 0x545E: 0x85DA, + 0x545F: 0x85DB, + 0x5460: 0x85DC, + 0x5461: 0x85DD, + 0x5462: 0xC4D8, + 0x5463: 0x85DE, + 0x5464: 0xDFCA, + 0x5465: 0x85DF, + 0x5466: 0xDFCF, + 0x5467: 0x85E0, + 0x5468: 0xD6DC, + 0x5469: 0x85E1, + 0x546A: 0x85E2, + 0x546B: 0x85E3, + 0x546C: 0x85E4, + 0x546D: 0x85E5, + 0x546E: 0x85E6, + 0x546F: 0x85E7, + 0x5470: 0x85E8, + 0x5471: 0xDFC9, + 0x5472: 0xDFDA, + 0x5473: 0xCEB6, + 0x5474: 0x85E9, + 0x5475: 0xBAC7, + 0x5476: 0xDFCE, + 0x5477: 0xDFC8, + 0x5478: 0xC5DE, + 0x5479: 0x85EA, + 0x547A: 0x85EB, + 0x547B: 0xC9EB, + 0x547C: 0xBAF4, + 0x547D: 0xC3FC, + 0x547E: 0x85EC, + 0x547F: 0x85ED, + 0x5480: 0xBED7, + 0x5481: 0x85EE, + 0x5482: 0xDFC6, + 0x5483: 0x85EF, + 0x5484: 0xDFCD, + 0x5485: 0x85F0, + 0x5486: 0xC5D8, + 0x5487: 0x85F1, + 0x5488: 0x85F2, + 0x5489: 0x85F3, + 0x548A: 0x85F4, + 0x548B: 0xD5A6, + 0x548C: 0xBACD, + 0x548D: 0x85F5, + 0x548E: 0xBECC, + 0x548F: 0xD3BD, + 0x5490: 0xB8C0, + 0x5491: 0x85F6, + 0x5492: 0xD6E4, + 0x5493: 0x85F7, + 0x5494: 0xDFC7, + 0x5495: 0xB9BE, + 0x5496: 0xBFA7, + 0x5497: 0x85F8, + 0x5498: 0x85F9, + 0x5499: 0xC1FC, + 0x549A: 0xDFCB, + 0x549B: 0xDFCC, + 0x549C: 0x85FA, + 0x549D: 0xDFD0, + 0x549E: 0x85FB, + 0x549F: 0x85FC, + 0x54A0: 0x85FD, + 0x54A1: 0x85FE, + 0x54A2: 0x8640, + 0x54A3: 0xDFDB, + 0x54A4: 0xDFE5, + 0x54A5: 0x8641, + 0x54A6: 0xDFD7, + 0x54A7: 0xDFD6, + 0x54A8: 0xD7C9, + 0x54A9: 0xDFE3, + 0x54AA: 0xDFE4, + 0x54AB: 0xE5EB, + 0x54AC: 0xD2A7, + 0x54AD: 0xDFD2, + 0x54AE: 0x8642, + 0x54AF: 0xBFA9, + 0x54B0: 0x8643, + 0x54B1: 0xD4DB, + 0x54B2: 0x8644, + 0x54B3: 0xBFC8, + 0x54B4: 0xDFD4, + 0x54B5: 0x8645, + 0x54B6: 0x8646, + 0x54B7: 0x8647, + 0x54B8: 0xCFCC, + 0x54B9: 0x8648, + 0x54BA: 0x8649, + 0x54BB: 0xDFDD, + 0x54BC: 0x864A, + 0x54BD: 0xD1CA, + 0x54BE: 0x864B, + 0x54BF: 0xDFDE, + 0x54C0: 0xB0A7, + 0x54C1: 0xC6B7, + 0x54C2: 0xDFD3, + 0x54C3: 0x864C, + 0x54C4: 0xBAE5, + 0x54C5: 0x864D, + 0x54C6: 0xB6DF, + 0x54C7: 0xCDDB, + 0x54C8: 0xB9FE, + 0x54C9: 0xD4D5, + 0x54CA: 0x864E, + 0x54CB: 0x864F, + 0x54CC: 0xDFDF, + 0x54CD: 0xCFEC, + 0x54CE: 0xB0A5, + 0x54CF: 0xDFE7, + 0x54D0: 0xDFD1, + 0x54D1: 0xD1C6, + 0x54D2: 0xDFD5, + 0x54D3: 0xDFD8, + 0x54D4: 0xDFD9, + 0x54D5: 0xDFDC, + 0x54D6: 0x8650, + 0x54D7: 0xBBA9, + 0x54D8: 0x8651, + 0x54D9: 0xDFE0, + 0x54DA: 0xDFE1, + 0x54DB: 0x8652, + 0x54DC: 0xDFE2, + 0x54DD: 0xDFE6, + 0x54DE: 0xDFE8, + 0x54DF: 0xD3B4, + 0x54E0: 0x8653, + 0x54E1: 0x8654, + 0x54E2: 0x8655, + 0x54E3: 0x8656, + 0x54E4: 0x8657, + 0x54E5: 0xB8E7, + 0x54E6: 0xC5B6, + 0x54E7: 0xDFEA, + 0x54E8: 0xC9DA, + 0x54E9: 0xC1A8, + 0x54EA: 0xC4C4, + 0x54EB: 0x8658, + 0x54EC: 0x8659, + 0x54ED: 0xBFDE, + 0x54EE: 0xCFF8, + 0x54EF: 0x865A, + 0x54F0: 0x865B, + 0x54F1: 0x865C, + 0x54F2: 0xD5DC, + 0x54F3: 0xDFEE, + 0x54F4: 0x865D, + 0x54F5: 0x865E, + 0x54F6: 0x865F, + 0x54F7: 0x8660, + 0x54F8: 0x8661, + 0x54F9: 0x8662, + 0x54FA: 0xB2B8, + 0x54FB: 0x8663, + 0x54FC: 0xBADF, + 0x54FD: 0xDFEC, + 0x54FE: 0x8664, + 0x54FF: 0xDBC1, + 0x5500: 0x8665, + 0x5501: 0xD1E4, + 0x5502: 0x8666, + 0x5503: 0x8667, + 0x5504: 0x8668, + 0x5505: 0x8669, + 0x5506: 0xCBF4, + 0x5507: 0xB4BD, + 0x5508: 0x866A, + 0x5509: 0xB0A6, + 0x550A: 0x866B, + 0x550B: 0x866C, + 0x550C: 0x866D, + 0x550D: 0x866E, + 0x550E: 0x866F, + 0x550F: 0xDFF1, + 0x5510: 0xCCC6, + 0x5511: 0xDFF2, + 0x5512: 0x8670, + 0x5513: 0x8671, + 0x5514: 0xDFED, + 0x5515: 0x8672, + 0x5516: 0x8673, + 0x5517: 0x8674, + 0x5518: 0x8675, + 0x5519: 0x8676, + 0x551A: 0x8677, + 0x551B: 0xDFE9, + 0x551C: 0x8678, + 0x551D: 0x8679, + 0x551E: 0x867A, + 0x551F: 0x867B, + 0x5520: 0xDFEB, + 0x5521: 0x867C, + 0x5522: 0xDFEF, + 0x5523: 0xDFF0, + 0x5524: 0xBBBD, + 0x5525: 0x867D, + 0x5526: 0x867E, + 0x5527: 0xDFF3, + 0x5528: 0x8680, + 0x5529: 0x8681, + 0x552A: 0xDFF4, + 0x552B: 0x8682, + 0x552C: 0xBBA3, + 0x552D: 0x8683, + 0x552E: 0xCADB, + 0x552F: 0xCEA8, + 0x5530: 0xE0A7, + 0x5531: 0xB3AA, + 0x5532: 0x8684, + 0x5533: 0xE0A6, + 0x5534: 0x8685, + 0x5535: 0x8686, + 0x5536: 0x8687, + 0x5537: 0xE0A1, + 0x5538: 0x8688, + 0x5539: 0x8689, + 0x553A: 0x868A, + 0x553B: 0x868B, + 0x553C: 0xDFFE, + 0x553D: 0x868C, + 0x553E: 0xCDD9, + 0x553F: 0xDFFC, + 0x5540: 0x868D, + 0x5541: 0xDFFA, + 0x5542: 0x868E, + 0x5543: 0xBFD0, + 0x5544: 0xD7C4, + 0x5545: 0x868F, + 0x5546: 0xC9CC, + 0x5547: 0x8690, + 0x5548: 0x8691, + 0x5549: 0xDFF8, + 0x554A: 0xB0A1, + 0x554B: 0x8692, + 0x554C: 0x8693, + 0x554D: 0x8694, + 0x554E: 0x8695, + 0x554F: 0x8696, + 0x5550: 0xDFFD, + 0x5551: 0x8697, + 0x5552: 0x8698, + 0x5553: 0x8699, + 0x5554: 0x869A, + 0x5555: 0xDFFB, + 0x5556: 0xE0A2, + 0x5557: 0x869B, + 0x5558: 0x869C, + 0x5559: 0x869D, + 0x555A: 0x869E, + 0x555B: 0x869F, + 0x555C: 0xE0A8, + 0x555D: 0x86A0, + 0x555E: 0x86A1, + 0x555F: 0x86A2, + 0x5560: 0x86A3, + 0x5561: 0xB7C8, + 0x5562: 0x86A4, + 0x5563: 0x86A5, + 0x5564: 0xC6A1, + 0x5565: 0xC9B6, + 0x5566: 0xC0B2, + 0x5567: 0xDFF5, + 0x5568: 0x86A6, + 0x5569: 0x86A7, + 0x556A: 0xC5BE, + 0x556B: 0x86A8, + 0x556C: 0xD8C4, + 0x556D: 0xDFF9, + 0x556E: 0xC4F6, + 0x556F: 0x86A9, + 0x5570: 0x86AA, + 0x5571: 0x86AB, + 0x5572: 0x86AC, + 0x5573: 0x86AD, + 0x5574: 0x86AE, + 0x5575: 0xE0A3, + 0x5576: 0xE0A4, + 0x5577: 0xE0A5, + 0x5578: 0xD0A5, + 0x5579: 0x86AF, + 0x557A: 0x86B0, + 0x557B: 0xE0B4, + 0x557C: 0xCCE4, + 0x557D: 0x86B1, + 0x557E: 0xE0B1, + 0x557F: 0x86B2, + 0x5580: 0xBFA6, + 0x5581: 0xE0AF, + 0x5582: 0xCEB9, + 0x5583: 0xE0AB, + 0x5584: 0xC9C6, + 0x5585: 0x86B3, + 0x5586: 0x86B4, + 0x5587: 0xC0AE, + 0x5588: 0xE0AE, + 0x5589: 0xBAED, + 0x558A: 0xBAB0, + 0x558B: 0xE0A9, + 0x558C: 0x86B5, + 0x558D: 0x86B6, + 0x558E: 0x86B7, + 0x558F: 0xDFF6, + 0x5590: 0x86B8, + 0x5591: 0xE0B3, + 0x5592: 0x86B9, + 0x5593: 0x86BA, + 0x5594: 0xE0B8, + 0x5595: 0x86BB, + 0x5596: 0x86BC, + 0x5597: 0x86BD, + 0x5598: 0xB4AD, + 0x5599: 0xE0B9, + 0x559A: 0x86BE, + 0x559B: 0x86BF, + 0x559C: 0xCFB2, + 0x559D: 0xBAC8, + 0x559E: 0x86C0, + 0x559F: 0xE0B0, + 0x55A0: 0x86C1, + 0x55A1: 0x86C2, + 0x55A2: 0x86C3, + 0x55A3: 0x86C4, + 0x55A4: 0x86C5, + 0x55A5: 0x86C6, + 0x55A6: 0x86C7, + 0x55A7: 0xD0FA, + 0x55A8: 0x86C8, + 0x55A9: 0x86C9, + 0x55AA: 0x86CA, + 0x55AB: 0x86CB, + 0x55AC: 0x86CC, + 0x55AD: 0x86CD, + 0x55AE: 0x86CE, + 0x55AF: 0x86CF, + 0x55B0: 0x86D0, + 0x55B1: 0xE0AC, + 0x55B2: 0x86D1, + 0x55B3: 0xD4FB, + 0x55B4: 0x86D2, + 0x55B5: 0xDFF7, + 0x55B6: 0x86D3, + 0x55B7: 0xC5E7, + 0x55B8: 0x86D4, + 0x55B9: 0xE0AD, + 0x55BA: 0x86D5, + 0x55BB: 0xD3F7, + 0x55BC: 0x86D6, + 0x55BD: 0xE0B6, + 0x55BE: 0xE0B7, + 0x55BF: 0x86D7, + 0x55C0: 0x86D8, + 0x55C1: 0x86D9, + 0x55C2: 0x86DA, + 0x55C3: 0x86DB, + 0x55C4: 0xE0C4, + 0x55C5: 0xD0E1, + 0x55C6: 0x86DC, + 0x55C7: 0x86DD, + 0x55C8: 0x86DE, + 0x55C9: 0xE0BC, + 0x55CA: 0x86DF, + 0x55CB: 0x86E0, + 0x55CC: 0xE0C9, + 0x55CD: 0xE0CA, + 0x55CE: 0x86E1, + 0x55CF: 0x86E2, + 0x55D0: 0x86E3, + 0x55D1: 0xE0BE, + 0x55D2: 0xE0AA, + 0x55D3: 0xC9A4, + 0x55D4: 0xE0C1, + 0x55D5: 0x86E4, + 0x55D6: 0xE0B2, + 0x55D7: 0x86E5, + 0x55D8: 0x86E6, + 0x55D9: 0x86E7, + 0x55DA: 0x86E8, + 0x55DB: 0x86E9, + 0x55DC: 0xCAC8, + 0x55DD: 0xE0C3, + 0x55DE: 0x86EA, + 0x55DF: 0xE0B5, + 0x55E0: 0x86EB, + 0x55E1: 0xCECB, + 0x55E2: 0x86EC, + 0x55E3: 0xCBC3, + 0x55E4: 0xE0CD, + 0x55E5: 0xE0C6, + 0x55E6: 0xE0C2, + 0x55E7: 0x86ED, + 0x55E8: 0xE0CB, + 0x55E9: 0x86EE, + 0x55EA: 0xE0BA, + 0x55EB: 0xE0BF, + 0x55EC: 0xE0C0, + 0x55ED: 0x86EF, + 0x55EE: 0x86F0, + 0x55EF: 0xE0C5, + 0x55F0: 0x86F1, + 0x55F1: 0x86F2, + 0x55F2: 0xE0C7, + 0x55F3: 0xE0C8, + 0x55F4: 0x86F3, + 0x55F5: 0xE0CC, + 0x55F6: 0x86F4, + 0x55F7: 0xE0BB, + 0x55F8: 0x86F5, + 0x55F9: 0x86F6, + 0x55FA: 0x86F7, + 0x55FB: 0x86F8, + 0x55FC: 0x86F9, + 0x55FD: 0xCBD4, + 0x55FE: 0xE0D5, + 0x55FF: 0x86FA, + 0x5600: 0xE0D6, + 0x5601: 0xE0D2, + 0x5602: 0x86FB, + 0x5603: 0x86FC, + 0x5604: 0x86FD, + 0x5605: 0x86FE, + 0x5606: 0x8740, + 0x5607: 0x8741, + 0x5608: 0xE0D0, + 0x5609: 0xBCCE, + 0x560A: 0x8742, + 0x560B: 0x8743, + 0x560C: 0xE0D1, + 0x560D: 0x8744, + 0x560E: 0xB8C2, + 0x560F: 0xD8C5, + 0x5610: 0x8745, + 0x5611: 0x8746, + 0x5612: 0x8747, + 0x5613: 0x8748, + 0x5614: 0x8749, + 0x5615: 0x874A, + 0x5616: 0x874B, + 0x5617: 0x874C, + 0x5618: 0xD0EA, + 0x5619: 0x874D, + 0x561A: 0x874E, + 0x561B: 0xC2EF, + 0x561C: 0x874F, + 0x561D: 0x8750, + 0x561E: 0xE0CF, + 0x561F: 0xE0BD, + 0x5620: 0x8751, + 0x5621: 0x8752, + 0x5622: 0x8753, + 0x5623: 0xE0D4, + 0x5624: 0xE0D3, + 0x5625: 0x8754, + 0x5626: 0x8755, + 0x5627: 0xE0D7, + 0x5628: 0x8756, + 0x5629: 0x8757, + 0x562A: 0x8758, + 0x562B: 0x8759, + 0x562C: 0xE0DC, + 0x562D: 0xE0D8, + 0x562E: 0x875A, + 0x562F: 0x875B, + 0x5630: 0x875C, + 0x5631: 0xD6F6, + 0x5632: 0xB3B0, + 0x5633: 0x875D, + 0x5634: 0xD7EC, + 0x5635: 0x875E, + 0x5636: 0xCBBB, + 0x5637: 0x875F, + 0x5638: 0x8760, + 0x5639: 0xE0DA, + 0x563A: 0x8761, + 0x563B: 0xCEFB, + 0x563C: 0x8762, + 0x563D: 0x8763, + 0x563E: 0x8764, + 0x563F: 0xBAD9, + 0x5640: 0x8765, + 0x5641: 0x8766, + 0x5642: 0x8767, + 0x5643: 0x8768, + 0x5644: 0x8769, + 0x5645: 0x876A, + 0x5646: 0x876B, + 0x5647: 0x876C, + 0x5648: 0x876D, + 0x5649: 0x876E, + 0x564A: 0x876F, + 0x564B: 0x8770, + 0x564C: 0xE0E1, + 0x564D: 0xE0DD, + 0x564E: 0xD2AD, + 0x564F: 0x8771, + 0x5650: 0x8772, + 0x5651: 0x8773, + 0x5652: 0x8774, + 0x5653: 0x8775, + 0x5654: 0xE0E2, + 0x5655: 0x8776, + 0x5656: 0x8777, + 0x5657: 0xE0DB, + 0x5658: 0xE0D9, + 0x5659: 0xE0DF, + 0x565A: 0x8778, + 0x565B: 0x8779, + 0x565C: 0xE0E0, + 0x565D: 0x877A, + 0x565E: 0x877B, + 0x565F: 0x877C, + 0x5660: 0x877D, + 0x5661: 0x877E, + 0x5662: 0xE0DE, + 0x5663: 0x8780, + 0x5664: 0xE0E4, + 0x5665: 0x8781, + 0x5666: 0x8782, + 0x5667: 0x8783, + 0x5668: 0xC6F7, + 0x5669: 0xD8AC, + 0x566A: 0xD4EB, + 0x566B: 0xE0E6, + 0x566C: 0xCAC9, + 0x566D: 0x8784, + 0x566E: 0x8785, + 0x566F: 0x8786, + 0x5670: 0x8787, + 0x5671: 0xE0E5, + 0x5672: 0x8788, + 0x5673: 0x8789, + 0x5674: 0x878A, + 0x5675: 0x878B, + 0x5676: 0xB8C1, + 0x5677: 0x878C, + 0x5678: 0x878D, + 0x5679: 0x878E, + 0x567A: 0x878F, + 0x567B: 0xE0E7, + 0x567C: 0xE0E8, + 0x567D: 0x8790, + 0x567E: 0x8791, + 0x567F: 0x8792, + 0x5680: 0x8793, + 0x5681: 0x8794, + 0x5682: 0x8795, + 0x5683: 0x8796, + 0x5684: 0x8797, + 0x5685: 0xE0E9, + 0x5686: 0xE0E3, + 0x5687: 0x8798, + 0x5688: 0x8799, + 0x5689: 0x879A, + 0x568A: 0x879B, + 0x568B: 0x879C, + 0x568C: 0x879D, + 0x568D: 0x879E, + 0x568E: 0xBABF, + 0x568F: 0xCCE7, + 0x5690: 0x879F, + 0x5691: 0x87A0, + 0x5692: 0x87A1, + 0x5693: 0xE0EA, + 0x5694: 0x87A2, + 0x5695: 0x87A3, + 0x5696: 0x87A4, + 0x5697: 0x87A5, + 0x5698: 0x87A6, + 0x5699: 0x87A7, + 0x569A: 0x87A8, + 0x569B: 0x87A9, + 0x569C: 0x87AA, + 0x569D: 0x87AB, + 0x569E: 0x87AC, + 0x569F: 0x87AD, + 0x56A0: 0x87AE, + 0x56A1: 0x87AF, + 0x56A2: 0x87B0, + 0x56A3: 0xCFF9, + 0x56A4: 0x87B1, + 0x56A5: 0x87B2, + 0x56A6: 0x87B3, + 0x56A7: 0x87B4, + 0x56A8: 0x87B5, + 0x56A9: 0x87B6, + 0x56AA: 0x87B7, + 0x56AB: 0x87B8, + 0x56AC: 0x87B9, + 0x56AD: 0x87BA, + 0x56AE: 0x87BB, + 0x56AF: 0xE0EB, + 0x56B0: 0x87BC, + 0x56B1: 0x87BD, + 0x56B2: 0x87BE, + 0x56B3: 0x87BF, + 0x56B4: 0x87C0, + 0x56B5: 0x87C1, + 0x56B6: 0x87C2, + 0x56B7: 0xC8C2, + 0x56B8: 0x87C3, + 0x56B9: 0x87C4, + 0x56BA: 0x87C5, + 0x56BB: 0x87C6, + 0x56BC: 0xBDC0, + 0x56BD: 0x87C7, + 0x56BE: 0x87C8, + 0x56BF: 0x87C9, + 0x56C0: 0x87CA, + 0x56C1: 0x87CB, + 0x56C2: 0x87CC, + 0x56C3: 0x87CD, + 0x56C4: 0x87CE, + 0x56C5: 0x87CF, + 0x56C6: 0x87D0, + 0x56C7: 0x87D1, + 0x56C8: 0x87D2, + 0x56C9: 0x87D3, + 0x56CA: 0xC4D2, + 0x56CB: 0x87D4, + 0x56CC: 0x87D5, + 0x56CD: 0x87D6, + 0x56CE: 0x87D7, + 0x56CF: 0x87D8, + 0x56D0: 0x87D9, + 0x56D1: 0x87DA, + 0x56D2: 0x87DB, + 0x56D3: 0x87DC, + 0x56D4: 0xE0EC, + 0x56D5: 0x87DD, + 0x56D6: 0x87DE, + 0x56D7: 0xE0ED, + 0x56D8: 0x87DF, + 0x56D9: 0x87E0, + 0x56DA: 0xC7F4, + 0x56DB: 0xCBC4, + 0x56DC: 0x87E1, + 0x56DD: 0xE0EE, + 0x56DE: 0xBBD8, + 0x56DF: 0xD8B6, + 0x56E0: 0xD2F2, + 0x56E1: 0xE0EF, + 0x56E2: 0xCDC5, + 0x56E3: 0x87E2, + 0x56E4: 0xB6DA, + 0x56E5: 0x87E3, + 0x56E6: 0x87E4, + 0x56E7: 0x87E5, + 0x56E8: 0x87E6, + 0x56E9: 0x87E7, + 0x56EA: 0x87E8, + 0x56EB: 0xE0F1, + 0x56EC: 0x87E9, + 0x56ED: 0xD4B0, + 0x56EE: 0x87EA, + 0x56EF: 0x87EB, + 0x56F0: 0xC0A7, + 0x56F1: 0xB4D1, + 0x56F2: 0x87EC, + 0x56F3: 0x87ED, + 0x56F4: 0xCEA7, + 0x56F5: 0xE0F0, + 0x56F6: 0x87EE, + 0x56F7: 0x87EF, + 0x56F8: 0x87F0, + 0x56F9: 0xE0F2, + 0x56FA: 0xB9CC, + 0x56FB: 0x87F1, + 0x56FC: 0x87F2, + 0x56FD: 0xB9FA, + 0x56FE: 0xCDBC, + 0x56FF: 0xE0F3, + 0x5700: 0x87F3, + 0x5701: 0x87F4, + 0x5702: 0x87F5, + 0x5703: 0xC6D4, + 0x5704: 0xE0F4, + 0x5705: 0x87F6, + 0x5706: 0xD4B2, + 0x5707: 0x87F7, + 0x5708: 0xC8A6, + 0x5709: 0xE0F6, + 0x570A: 0xE0F5, + 0x570B: 0x87F8, + 0x570C: 0x87F9, + 0x570D: 0x87FA, + 0x570E: 0x87FB, + 0x570F: 0x87FC, + 0x5710: 0x87FD, + 0x5711: 0x87FE, + 0x5712: 0x8840, + 0x5713: 0x8841, + 0x5714: 0x8842, + 0x5715: 0x8843, + 0x5716: 0x8844, + 0x5717: 0x8845, + 0x5718: 0x8846, + 0x5719: 0x8847, + 0x571A: 0x8848, + 0x571B: 0x8849, + 0x571C: 0xE0F7, + 0x571D: 0x884A, + 0x571E: 0x884B, + 0x571F: 0xCDC1, + 0x5720: 0x884C, + 0x5721: 0x884D, + 0x5722: 0x884E, + 0x5723: 0xCAA5, + 0x5724: 0x884F, + 0x5725: 0x8850, + 0x5726: 0x8851, + 0x5727: 0x8852, + 0x5728: 0xD4DA, + 0x5729: 0xDBD7, + 0x572A: 0xDBD9, + 0x572B: 0x8853, + 0x572C: 0xDBD8, + 0x572D: 0xB9E7, + 0x572E: 0xDBDC, + 0x572F: 0xDBDD, + 0x5730: 0xB5D8, + 0x5731: 0x8854, + 0x5732: 0x8855, + 0x5733: 0xDBDA, + 0x5734: 0x8856, + 0x5735: 0x8857, + 0x5736: 0x8858, + 0x5737: 0x8859, + 0x5738: 0x885A, + 0x5739: 0xDBDB, + 0x573A: 0xB3A1, + 0x573B: 0xDBDF, + 0x573C: 0x885B, + 0x573D: 0x885C, + 0x573E: 0xBBF8, + 0x573F: 0x885D, + 0x5740: 0xD6B7, + 0x5741: 0x885E, + 0x5742: 0xDBE0, + 0x5743: 0x885F, + 0x5744: 0x8860, + 0x5745: 0x8861, + 0x5746: 0x8862, + 0x5747: 0xBEF9, + 0x5748: 0x8863, + 0x5749: 0x8864, + 0x574A: 0xB7BB, + 0x574B: 0x8865, + 0x574C: 0xDBD0, + 0x574D: 0xCCAE, + 0x574E: 0xBFB2, + 0x574F: 0xBBB5, + 0x5750: 0xD7F8, + 0x5751: 0xBFD3, + 0x5752: 0x8866, + 0x5753: 0x8867, + 0x5754: 0x8868, + 0x5755: 0x8869, + 0x5756: 0x886A, + 0x5757: 0xBFE9, + 0x5758: 0x886B, + 0x5759: 0x886C, + 0x575A: 0xBCE1, + 0x575B: 0xCCB3, + 0x575C: 0xDBDE, + 0x575D: 0xB0D3, + 0x575E: 0xCEEB, + 0x575F: 0xB7D8, + 0x5760: 0xD7B9, + 0x5761: 0xC6C2, + 0x5762: 0x886D, + 0x5763: 0x886E, + 0x5764: 0xC0A4, + 0x5765: 0x886F, + 0x5766: 0xCCB9, + 0x5767: 0x8870, + 0x5768: 0xDBE7, + 0x5769: 0xDBE1, + 0x576A: 0xC6BA, + 0x576B: 0xDBE3, + 0x576C: 0x8871, + 0x576D: 0xDBE8, + 0x576E: 0x8872, + 0x576F: 0xC5F7, + 0x5770: 0x8873, + 0x5771: 0x8874, + 0x5772: 0x8875, + 0x5773: 0xDBEA, + 0x5774: 0x8876, + 0x5775: 0x8877, + 0x5776: 0xDBE9, + 0x5777: 0xBFC0, + 0x5778: 0x8878, + 0x5779: 0x8879, + 0x577A: 0x887A, + 0x577B: 0xDBE6, + 0x577C: 0xDBE5, + 0x577D: 0x887B, + 0x577E: 0x887C, + 0x577F: 0x887D, + 0x5780: 0x887E, + 0x5781: 0x8880, + 0x5782: 0xB4B9, + 0x5783: 0xC0AC, + 0x5784: 0xC2A2, + 0x5785: 0xDBE2, + 0x5786: 0xDBE4, + 0x5787: 0x8881, + 0x5788: 0x8882, + 0x5789: 0x8883, + 0x578A: 0x8884, + 0x578B: 0xD0CD, + 0x578C: 0xDBED, + 0x578D: 0x8885, + 0x578E: 0x8886, + 0x578F: 0x8887, + 0x5790: 0x8888, + 0x5791: 0x8889, + 0x5792: 0xC0DD, + 0x5793: 0xDBF2, + 0x5794: 0x888A, + 0x5795: 0x888B, + 0x5796: 0x888C, + 0x5797: 0x888D, + 0x5798: 0x888E, + 0x5799: 0x888F, + 0x579A: 0x8890, + 0x579B: 0xB6E2, + 0x579C: 0x8891, + 0x579D: 0x8892, + 0x579E: 0x8893, + 0x579F: 0x8894, + 0x57A0: 0xDBF3, + 0x57A1: 0xDBD2, + 0x57A2: 0xB9B8, + 0x57A3: 0xD4AB, + 0x57A4: 0xDBEC, + 0x57A5: 0x8895, + 0x57A6: 0xBFD1, + 0x57A7: 0xDBF0, + 0x57A8: 0x8896, + 0x57A9: 0xDBD1, + 0x57AA: 0x8897, + 0x57AB: 0xB5E6, + 0x57AC: 0x8898, + 0x57AD: 0xDBEB, + 0x57AE: 0xBFE5, + 0x57AF: 0x8899, + 0x57B0: 0x889A, + 0x57B1: 0x889B, + 0x57B2: 0xDBEE, + 0x57B3: 0x889C, + 0x57B4: 0xDBF1, + 0x57B5: 0x889D, + 0x57B6: 0x889E, + 0x57B7: 0x889F, + 0x57B8: 0xDBF9, + 0x57B9: 0x88A0, + 0x57BA: 0x88A1, + 0x57BB: 0x88A2, + 0x57BC: 0x88A3, + 0x57BD: 0x88A4, + 0x57BE: 0x88A5, + 0x57BF: 0x88A6, + 0x57C0: 0x88A7, + 0x57C1: 0x88A8, + 0x57C2: 0xB9A1, + 0x57C3: 0xB0A3, + 0x57C4: 0x88A9, + 0x57C5: 0x88AA, + 0x57C6: 0x88AB, + 0x57C7: 0x88AC, + 0x57C8: 0x88AD, + 0x57C9: 0x88AE, + 0x57CA: 0x88AF, + 0x57CB: 0xC2F1, + 0x57CC: 0x88B0, + 0x57CD: 0x88B1, + 0x57CE: 0xB3C7, + 0x57CF: 0xDBEF, + 0x57D0: 0x88B2, + 0x57D1: 0x88B3, + 0x57D2: 0xDBF8, + 0x57D3: 0x88B4, + 0x57D4: 0xC6D2, + 0x57D5: 0xDBF4, + 0x57D6: 0x88B5, + 0x57D7: 0x88B6, + 0x57D8: 0xDBF5, + 0x57D9: 0xDBF7, + 0x57DA: 0xDBF6, + 0x57DB: 0x88B7, + 0x57DC: 0x88B8, + 0x57DD: 0xDBFE, + 0x57DE: 0x88B9, + 0x57DF: 0xD3F2, + 0x57E0: 0xB2BA, + 0x57E1: 0x88BA, + 0x57E2: 0x88BB, + 0x57E3: 0x88BC, + 0x57E4: 0xDBFD, + 0x57E5: 0x88BD, + 0x57E6: 0x88BE, + 0x57E7: 0x88BF, + 0x57E8: 0x88C0, + 0x57E9: 0x88C1, + 0x57EA: 0x88C2, + 0x57EB: 0x88C3, + 0x57EC: 0x88C4, + 0x57ED: 0xDCA4, + 0x57EE: 0x88C5, + 0x57EF: 0xDBFB, + 0x57F0: 0x88C6, + 0x57F1: 0x88C7, + 0x57F2: 0x88C8, + 0x57F3: 0x88C9, + 0x57F4: 0xDBFA, + 0x57F5: 0x88CA, + 0x57F6: 0x88CB, + 0x57F7: 0x88CC, + 0x57F8: 0xDBFC, + 0x57F9: 0xC5E0, + 0x57FA: 0xBBF9, + 0x57FB: 0x88CD, + 0x57FC: 0x88CE, + 0x57FD: 0xDCA3, + 0x57FE: 0x88CF, + 0x57FF: 0x88D0, + 0x5800: 0xDCA5, + 0x5801: 0x88D1, + 0x5802: 0xCCC3, + 0x5803: 0x88D2, + 0x5804: 0x88D3, + 0x5805: 0x88D4, + 0x5806: 0xB6D1, + 0x5807: 0xDDC0, + 0x5808: 0x88D5, + 0x5809: 0x88D6, + 0x580A: 0x88D7, + 0x580B: 0xDCA1, + 0x580C: 0x88D8, + 0x580D: 0xDCA2, + 0x580E: 0x88D9, + 0x580F: 0x88DA, + 0x5810: 0x88DB, + 0x5811: 0xC7B5, + 0x5812: 0x88DC, + 0x5813: 0x88DD, + 0x5814: 0x88DE, + 0x5815: 0xB6E9, + 0x5816: 0x88DF, + 0x5817: 0x88E0, + 0x5818: 0x88E1, + 0x5819: 0xDCA7, + 0x581A: 0x88E2, + 0x581B: 0x88E3, + 0x581C: 0x88E4, + 0x581D: 0x88E5, + 0x581E: 0xDCA6, + 0x581F: 0x88E6, + 0x5820: 0xDCA9, + 0x5821: 0xB1A4, + 0x5822: 0x88E7, + 0x5823: 0x88E8, + 0x5824: 0xB5CC, + 0x5825: 0x88E9, + 0x5826: 0x88EA, + 0x5827: 0x88EB, + 0x5828: 0x88EC, + 0x5829: 0x88ED, + 0x582A: 0xBFB0, + 0x582B: 0x88EE, + 0x582C: 0x88EF, + 0x582D: 0x88F0, + 0x582E: 0x88F1, + 0x582F: 0x88F2, + 0x5830: 0xD1DF, + 0x5831: 0x88F3, + 0x5832: 0x88F4, + 0x5833: 0x88F5, + 0x5834: 0x88F6, + 0x5835: 0xB6C2, + 0x5836: 0x88F7, + 0x5837: 0x88F8, + 0x5838: 0x88F9, + 0x5839: 0x88FA, + 0x583A: 0x88FB, + 0x583B: 0x88FC, + 0x583C: 0x88FD, + 0x583D: 0x88FE, + 0x583E: 0x8940, + 0x583F: 0x8941, + 0x5840: 0x8942, + 0x5841: 0x8943, + 0x5842: 0x8944, + 0x5843: 0x8945, + 0x5844: 0xDCA8, + 0x5845: 0x8946, + 0x5846: 0x8947, + 0x5847: 0x8948, + 0x5848: 0x8949, + 0x5849: 0x894A, + 0x584A: 0x894B, + 0x584B: 0x894C, + 0x584C: 0xCBFA, + 0x584D: 0xEBF3, + 0x584E: 0x894D, + 0x584F: 0x894E, + 0x5850: 0x894F, + 0x5851: 0xCBDC, + 0x5852: 0x8950, + 0x5853: 0x8951, + 0x5854: 0xCBFE, + 0x5855: 0x8952, + 0x5856: 0x8953, + 0x5857: 0x8954, + 0x5858: 0xCCC1, + 0x5859: 0x8955, + 0x585A: 0x8956, + 0x585B: 0x8957, + 0x585C: 0x8958, + 0x585D: 0x8959, + 0x585E: 0xC8FB, + 0x585F: 0x895A, + 0x5860: 0x895B, + 0x5861: 0x895C, + 0x5862: 0x895D, + 0x5863: 0x895E, + 0x5864: 0x895F, + 0x5865: 0xDCAA, + 0x5866: 0x8960, + 0x5867: 0x8961, + 0x5868: 0x8962, + 0x5869: 0x8963, + 0x586A: 0x8964, + 0x586B: 0xCCEE, + 0x586C: 0xDCAB, + 0x586D: 0x8965, + 0x586E: 0x8966, + 0x586F: 0x8967, + 0x5870: 0x8968, + 0x5871: 0x8969, + 0x5872: 0x896A, + 0x5873: 0x896B, + 0x5874: 0x896C, + 0x5875: 0x896D, + 0x5876: 0x896E, + 0x5877: 0x896F, + 0x5878: 0x8970, + 0x5879: 0x8971, + 0x587A: 0x8972, + 0x587B: 0x8973, + 0x587C: 0x8974, + 0x587D: 0x8975, + 0x587E: 0xDBD3, + 0x587F: 0x8976, + 0x5880: 0xDCAF, + 0x5881: 0xDCAC, + 0x5882: 0x8977, + 0x5883: 0xBEB3, + 0x5884: 0x8978, + 0x5885: 0xCAFB, + 0x5886: 0x8979, + 0x5887: 0x897A, + 0x5888: 0x897B, + 0x5889: 0xDCAD, + 0x588A: 0x897C, + 0x588B: 0x897D, + 0x588C: 0x897E, + 0x588D: 0x8980, + 0x588E: 0x8981, + 0x588F: 0x8982, + 0x5890: 0x8983, + 0x5891: 0x8984, + 0x5892: 0xC9CA, + 0x5893: 0xC4B9, + 0x5894: 0x8985, + 0x5895: 0x8986, + 0x5896: 0x8987, + 0x5897: 0x8988, + 0x5898: 0x8989, + 0x5899: 0xC7BD, + 0x589A: 0xDCAE, + 0x589B: 0x898A, + 0x589C: 0x898B, + 0x589D: 0x898C, + 0x589E: 0xD4F6, + 0x589F: 0xD0E6, + 0x58A0: 0x898D, + 0x58A1: 0x898E, + 0x58A2: 0x898F, + 0x58A3: 0x8990, + 0x58A4: 0x8991, + 0x58A5: 0x8992, + 0x58A6: 0x8993, + 0x58A7: 0x8994, + 0x58A8: 0xC4AB, + 0x58A9: 0xB6D5, + 0x58AA: 0x8995, + 0x58AB: 0x8996, + 0x58AC: 0x8997, + 0x58AD: 0x8998, + 0x58AE: 0x8999, + 0x58AF: 0x899A, + 0x58B0: 0x899B, + 0x58B1: 0x899C, + 0x58B2: 0x899D, + 0x58B3: 0x899E, + 0x58B4: 0x899F, + 0x58B5: 0x89A0, + 0x58B6: 0x89A1, + 0x58B7: 0x89A2, + 0x58B8: 0x89A3, + 0x58B9: 0x89A4, + 0x58BA: 0x89A5, + 0x58BB: 0x89A6, + 0x58BC: 0xDBD4, + 0x58BD: 0x89A7, + 0x58BE: 0x89A8, + 0x58BF: 0x89A9, + 0x58C0: 0x89AA, + 0x58C1: 0xB1DA, + 0x58C2: 0x89AB, + 0x58C3: 0x89AC, + 0x58C4: 0x89AD, + 0x58C5: 0xDBD5, + 0x58C6: 0x89AE, + 0x58C7: 0x89AF, + 0x58C8: 0x89B0, + 0x58C9: 0x89B1, + 0x58CA: 0x89B2, + 0x58CB: 0x89B3, + 0x58CC: 0x89B4, + 0x58CD: 0x89B5, + 0x58CE: 0x89B6, + 0x58CF: 0x89B7, + 0x58D0: 0x89B8, + 0x58D1: 0xDBD6, + 0x58D2: 0x89B9, + 0x58D3: 0x89BA, + 0x58D4: 0x89BB, + 0x58D5: 0xBABE, + 0x58D6: 0x89BC, + 0x58D7: 0x89BD, + 0x58D8: 0x89BE, + 0x58D9: 0x89BF, + 0x58DA: 0x89C0, + 0x58DB: 0x89C1, + 0x58DC: 0x89C2, + 0x58DD: 0x89C3, + 0x58DE: 0x89C4, + 0x58DF: 0x89C5, + 0x58E0: 0x89C6, + 0x58E1: 0x89C7, + 0x58E2: 0x89C8, + 0x58E3: 0x89C9, + 0x58E4: 0xC8C0, + 0x58E5: 0x89CA, + 0x58E6: 0x89CB, + 0x58E7: 0x89CC, + 0x58E8: 0x89CD, + 0x58E9: 0x89CE, + 0x58EA: 0x89CF, + 0x58EB: 0xCABF, + 0x58EC: 0xC8C9, + 0x58ED: 0x89D0, + 0x58EE: 0xD7B3, + 0x58EF: 0x89D1, + 0x58F0: 0xC9F9, + 0x58F1: 0x89D2, + 0x58F2: 0x89D3, + 0x58F3: 0xBFC7, + 0x58F4: 0x89D4, + 0x58F5: 0x89D5, + 0x58F6: 0xBAF8, + 0x58F7: 0x89D6, + 0x58F8: 0x89D7, + 0x58F9: 0xD2BC, + 0x58FA: 0x89D8, + 0x58FB: 0x89D9, + 0x58FC: 0x89DA, + 0x58FD: 0x89DB, + 0x58FE: 0x89DC, + 0x58FF: 0x89DD, + 0x5900: 0x89DE, + 0x5901: 0x89DF, + 0x5902: 0xE2BA, + 0x5903: 0x89E0, + 0x5904: 0xB4A6, + 0x5905: 0x89E1, + 0x5906: 0x89E2, + 0x5907: 0xB1B8, + 0x5908: 0x89E3, + 0x5909: 0x89E4, + 0x590A: 0x89E5, + 0x590B: 0x89E6, + 0x590C: 0x89E7, + 0x590D: 0xB8B4, + 0x590E: 0x89E8, + 0x590F: 0xCFC4, + 0x5910: 0x89E9, + 0x5911: 0x89EA, + 0x5912: 0x89EB, + 0x5913: 0x89EC, + 0x5914: 0xD9E7, + 0x5915: 0xCFA6, + 0x5916: 0xCDE2, + 0x5917: 0x89ED, + 0x5918: 0x89EE, + 0x5919: 0xD9ED, + 0x591A: 0xB6E0, + 0x591B: 0x89EF, + 0x591C: 0xD2B9, + 0x591D: 0x89F0, + 0x591E: 0x89F1, + 0x591F: 0xB9BB, + 0x5920: 0x89F2, + 0x5921: 0x89F3, + 0x5922: 0x89F4, + 0x5923: 0x89F5, + 0x5924: 0xE2B9, + 0x5925: 0xE2B7, + 0x5926: 0x89F6, + 0x5927: 0xB4F3, + 0x5928: 0x89F7, + 0x5929: 0xCCEC, + 0x592A: 0xCCAB, + 0x592B: 0xB7F2, + 0x592C: 0x89F8, + 0x592D: 0xD8B2, + 0x592E: 0xD1EB, + 0x592F: 0xBABB, + 0x5930: 0x89F9, + 0x5931: 0xCAA7, + 0x5932: 0x89FA, + 0x5933: 0x89FB, + 0x5934: 0xCDB7, + 0x5935: 0x89FC, + 0x5936: 0x89FD, + 0x5937: 0xD2C4, + 0x5938: 0xBFE4, + 0x5939: 0xBCD0, + 0x593A: 0xB6E1, + 0x593B: 0x89FE, + 0x593C: 0xDEC5, + 0x593D: 0x8A40, + 0x593E: 0x8A41, + 0x593F: 0x8A42, + 0x5940: 0x8A43, + 0x5941: 0xDEC6, + 0x5942: 0xDBBC, + 0x5943: 0x8A44, + 0x5944: 0xD1D9, + 0x5945: 0x8A45, + 0x5946: 0x8A46, + 0x5947: 0xC6E6, + 0x5948: 0xC4CE, + 0x5949: 0xB7EE, + 0x594A: 0x8A47, + 0x594B: 0xB7DC, + 0x594C: 0x8A48, + 0x594D: 0x8A49, + 0x594E: 0xBFFC, + 0x594F: 0xD7E0, + 0x5950: 0x8A4A, + 0x5951: 0xC6F5, + 0x5952: 0x8A4B, + 0x5953: 0x8A4C, + 0x5954: 0xB1BC, + 0x5955: 0xDEC8, + 0x5956: 0xBDB1, + 0x5957: 0xCCD7, + 0x5958: 0xDECA, + 0x5959: 0x8A4D, + 0x595A: 0xDEC9, + 0x595B: 0x8A4E, + 0x595C: 0x8A4F, + 0x595D: 0x8A50, + 0x595E: 0x8A51, + 0x595F: 0x8A52, + 0x5960: 0xB5EC, + 0x5961: 0x8A53, + 0x5962: 0xC9DD, + 0x5963: 0x8A54, + 0x5964: 0x8A55, + 0x5965: 0xB0C2, + 0x5966: 0x8A56, + 0x5967: 0x8A57, + 0x5968: 0x8A58, + 0x5969: 0x8A59, + 0x596A: 0x8A5A, + 0x596B: 0x8A5B, + 0x596C: 0x8A5C, + 0x596D: 0x8A5D, + 0x596E: 0x8A5E, + 0x596F: 0x8A5F, + 0x5970: 0x8A60, + 0x5971: 0x8A61, + 0x5972: 0x8A62, + 0x5973: 0xC5AE, + 0x5974: 0xC5AB, + 0x5975: 0x8A63, + 0x5976: 0xC4CC, + 0x5977: 0x8A64, + 0x5978: 0xBCE9, + 0x5979: 0xCBFD, + 0x597A: 0x8A65, + 0x597B: 0x8A66, + 0x597C: 0x8A67, + 0x597D: 0xBAC3, + 0x597E: 0x8A68, + 0x597F: 0x8A69, + 0x5980: 0x8A6A, + 0x5981: 0xE5F9, + 0x5982: 0xC8E7, + 0x5983: 0xE5FA, + 0x5984: 0xCDFD, + 0x5985: 0x8A6B, + 0x5986: 0xD7B1, + 0x5987: 0xB8BE, + 0x5988: 0xC2E8, + 0x5989: 0x8A6C, + 0x598A: 0xC8D1, + 0x598B: 0x8A6D, + 0x598C: 0x8A6E, + 0x598D: 0xE5FB, + 0x598E: 0x8A6F, + 0x598F: 0x8A70, + 0x5990: 0x8A71, + 0x5991: 0x8A72, + 0x5992: 0xB6CA, + 0x5993: 0xBCCB, + 0x5994: 0x8A73, + 0x5995: 0x8A74, + 0x5996: 0xD1FD, + 0x5997: 0xE6A1, + 0x5998: 0x8A75, + 0x5999: 0xC3EE, + 0x599A: 0x8A76, + 0x599B: 0x8A77, + 0x599C: 0x8A78, + 0x599D: 0x8A79, + 0x599E: 0xE6A4, + 0x599F: 0x8A7A, + 0x59A0: 0x8A7B, + 0x59A1: 0x8A7C, + 0x59A2: 0x8A7D, + 0x59A3: 0xE5FE, + 0x59A4: 0xE6A5, + 0x59A5: 0xCDD7, + 0x59A6: 0x8A7E, + 0x59A7: 0x8A80, + 0x59A8: 0xB7C1, + 0x59A9: 0xE5FC, + 0x59AA: 0xE5FD, + 0x59AB: 0xE6A3, + 0x59AC: 0x8A81, + 0x59AD: 0x8A82, + 0x59AE: 0xC4DD, + 0x59AF: 0xE6A8, + 0x59B0: 0x8A83, + 0x59B1: 0x8A84, + 0x59B2: 0xE6A7, + 0x59B3: 0x8A85, + 0x59B4: 0x8A86, + 0x59B5: 0x8A87, + 0x59B6: 0x8A88, + 0x59B7: 0x8A89, + 0x59B8: 0x8A8A, + 0x59B9: 0xC3C3, + 0x59BA: 0x8A8B, + 0x59BB: 0xC6DE, + 0x59BC: 0x8A8C, + 0x59BD: 0x8A8D, + 0x59BE: 0xE6AA, + 0x59BF: 0x8A8E, + 0x59C0: 0x8A8F, + 0x59C1: 0x8A90, + 0x59C2: 0x8A91, + 0x59C3: 0x8A92, + 0x59C4: 0x8A93, + 0x59C5: 0x8A94, + 0x59C6: 0xC4B7, + 0x59C7: 0x8A95, + 0x59C8: 0x8A96, + 0x59C9: 0x8A97, + 0x59CA: 0xE6A2, + 0x59CB: 0xCABC, + 0x59CC: 0x8A98, + 0x59CD: 0x8A99, + 0x59CE: 0x8A9A, + 0x59CF: 0x8A9B, + 0x59D0: 0xBDE3, + 0x59D1: 0xB9C3, + 0x59D2: 0xE6A6, + 0x59D3: 0xD0D5, + 0x59D4: 0xCEAF, + 0x59D5: 0x8A9C, + 0x59D6: 0x8A9D, + 0x59D7: 0xE6A9, + 0x59D8: 0xE6B0, + 0x59D9: 0x8A9E, + 0x59DA: 0xD2A6, + 0x59DB: 0x8A9F, + 0x59DC: 0xBDAA, + 0x59DD: 0xE6AD, + 0x59DE: 0x8AA0, + 0x59DF: 0x8AA1, + 0x59E0: 0x8AA2, + 0x59E1: 0x8AA3, + 0x59E2: 0x8AA4, + 0x59E3: 0xE6AF, + 0x59E4: 0x8AA5, + 0x59E5: 0xC0D1, + 0x59E6: 0x8AA6, + 0x59E7: 0x8AA7, + 0x59E8: 0xD2CC, + 0x59E9: 0x8AA8, + 0x59EA: 0x8AA9, + 0x59EB: 0x8AAA, + 0x59EC: 0xBCA7, + 0x59ED: 0x8AAB, + 0x59EE: 0x8AAC, + 0x59EF: 0x8AAD, + 0x59F0: 0x8AAE, + 0x59F1: 0x8AAF, + 0x59F2: 0x8AB0, + 0x59F3: 0x8AB1, + 0x59F4: 0x8AB2, + 0x59F5: 0x8AB3, + 0x59F6: 0x8AB4, + 0x59F7: 0x8AB5, + 0x59F8: 0x8AB6, + 0x59F9: 0xE6B1, + 0x59FA: 0x8AB7, + 0x59FB: 0xD2F6, + 0x59FC: 0x8AB8, + 0x59FD: 0x8AB9, + 0x59FE: 0x8ABA, + 0x59FF: 0xD7CB, + 0x5A00: 0x8ABB, + 0x5A01: 0xCDFE, + 0x5A02: 0x8ABC, + 0x5A03: 0xCDDE, + 0x5A04: 0xC2A6, + 0x5A05: 0xE6AB, + 0x5A06: 0xE6AC, + 0x5A07: 0xBDBF, + 0x5A08: 0xE6AE, + 0x5A09: 0xE6B3, + 0x5A0A: 0x8ABD, + 0x5A0B: 0x8ABE, + 0x5A0C: 0xE6B2, + 0x5A0D: 0x8ABF, + 0x5A0E: 0x8AC0, + 0x5A0F: 0x8AC1, + 0x5A10: 0x8AC2, + 0x5A11: 0xE6B6, + 0x5A12: 0x8AC3, + 0x5A13: 0xE6B8, + 0x5A14: 0x8AC4, + 0x5A15: 0x8AC5, + 0x5A16: 0x8AC6, + 0x5A17: 0x8AC7, + 0x5A18: 0xC4EF, + 0x5A19: 0x8AC8, + 0x5A1A: 0x8AC9, + 0x5A1B: 0x8ACA, + 0x5A1C: 0xC4C8, + 0x5A1D: 0x8ACB, + 0x5A1E: 0x8ACC, + 0x5A1F: 0xBEEA, + 0x5A20: 0xC9EF, + 0x5A21: 0x8ACD, + 0x5A22: 0x8ACE, + 0x5A23: 0xE6B7, + 0x5A24: 0x8ACF, + 0x5A25: 0xB6F0, + 0x5A26: 0x8AD0, + 0x5A27: 0x8AD1, + 0x5A28: 0x8AD2, + 0x5A29: 0xC3E4, + 0x5A2A: 0x8AD3, + 0x5A2B: 0x8AD4, + 0x5A2C: 0x8AD5, + 0x5A2D: 0x8AD6, + 0x5A2E: 0x8AD7, + 0x5A2F: 0x8AD8, + 0x5A30: 0x8AD9, + 0x5A31: 0xD3E9, + 0x5A32: 0xE6B4, + 0x5A33: 0x8ADA, + 0x5A34: 0xE6B5, + 0x5A35: 0x8ADB, + 0x5A36: 0xC8A2, + 0x5A37: 0x8ADC, + 0x5A38: 0x8ADD, + 0x5A39: 0x8ADE, + 0x5A3A: 0x8ADF, + 0x5A3B: 0x8AE0, + 0x5A3C: 0xE6BD, + 0x5A3D: 0x8AE1, + 0x5A3E: 0x8AE2, + 0x5A3F: 0x8AE3, + 0x5A40: 0xE6B9, + 0x5A41: 0x8AE4, + 0x5A42: 0x8AE5, + 0x5A43: 0x8AE6, + 0x5A44: 0x8AE7, + 0x5A45: 0x8AE8, + 0x5A46: 0xC6C5, + 0x5A47: 0x8AE9, + 0x5A48: 0x8AEA, + 0x5A49: 0xCDF1, + 0x5A4A: 0xE6BB, + 0x5A4B: 0x8AEB, + 0x5A4C: 0x8AEC, + 0x5A4D: 0x8AED, + 0x5A4E: 0x8AEE, + 0x5A4F: 0x8AEF, + 0x5A50: 0x8AF0, + 0x5A51: 0x8AF1, + 0x5A52: 0x8AF2, + 0x5A53: 0x8AF3, + 0x5A54: 0x8AF4, + 0x5A55: 0xE6BC, + 0x5A56: 0x8AF5, + 0x5A57: 0x8AF6, + 0x5A58: 0x8AF7, + 0x5A59: 0x8AF8, + 0x5A5A: 0xBBE9, + 0x5A5B: 0x8AF9, + 0x5A5C: 0x8AFA, + 0x5A5D: 0x8AFB, + 0x5A5E: 0x8AFC, + 0x5A5F: 0x8AFD, + 0x5A60: 0x8AFE, + 0x5A61: 0x8B40, + 0x5A62: 0xE6BE, + 0x5A63: 0x8B41, + 0x5A64: 0x8B42, + 0x5A65: 0x8B43, + 0x5A66: 0x8B44, + 0x5A67: 0xE6BA, + 0x5A68: 0x8B45, + 0x5A69: 0x8B46, + 0x5A6A: 0xC0B7, + 0x5A6B: 0x8B47, + 0x5A6C: 0x8B48, + 0x5A6D: 0x8B49, + 0x5A6E: 0x8B4A, + 0x5A6F: 0x8B4B, + 0x5A70: 0x8B4C, + 0x5A71: 0x8B4D, + 0x5A72: 0x8B4E, + 0x5A73: 0x8B4F, + 0x5A74: 0xD3A4, + 0x5A75: 0xE6BF, + 0x5A76: 0xC9F4, + 0x5A77: 0xE6C3, + 0x5A78: 0x8B50, + 0x5A79: 0x8B51, + 0x5A7A: 0xE6C4, + 0x5A7B: 0x8B52, + 0x5A7C: 0x8B53, + 0x5A7D: 0x8B54, + 0x5A7E: 0x8B55, + 0x5A7F: 0xD0F6, + 0x5A80: 0x8B56, + 0x5A81: 0x8B57, + 0x5A82: 0x8B58, + 0x5A83: 0x8B59, + 0x5A84: 0x8B5A, + 0x5A85: 0x8B5B, + 0x5A86: 0x8B5C, + 0x5A87: 0x8B5D, + 0x5A88: 0x8B5E, + 0x5A89: 0x8B5F, + 0x5A8A: 0x8B60, + 0x5A8B: 0x8B61, + 0x5A8C: 0x8B62, + 0x5A8D: 0x8B63, + 0x5A8E: 0x8B64, + 0x5A8F: 0x8B65, + 0x5A90: 0x8B66, + 0x5A91: 0x8B67, + 0x5A92: 0xC3BD, + 0x5A93: 0x8B68, + 0x5A94: 0x8B69, + 0x5A95: 0x8B6A, + 0x5A96: 0x8B6B, + 0x5A97: 0x8B6C, + 0x5A98: 0x8B6D, + 0x5A99: 0x8B6E, + 0x5A9A: 0xC3C4, + 0x5A9B: 0xE6C2, + 0x5A9C: 0x8B6F, + 0x5A9D: 0x8B70, + 0x5A9E: 0x8B71, + 0x5A9F: 0x8B72, + 0x5AA0: 0x8B73, + 0x5AA1: 0x8B74, + 0x5AA2: 0x8B75, + 0x5AA3: 0x8B76, + 0x5AA4: 0x8B77, + 0x5AA5: 0x8B78, + 0x5AA6: 0x8B79, + 0x5AA7: 0x8B7A, + 0x5AA8: 0x8B7B, + 0x5AA9: 0x8B7C, + 0x5AAA: 0xE6C1, + 0x5AAB: 0x8B7D, + 0x5AAC: 0x8B7E, + 0x5AAD: 0x8B80, + 0x5AAE: 0x8B81, + 0x5AAF: 0x8B82, + 0x5AB0: 0x8B83, + 0x5AB1: 0x8B84, + 0x5AB2: 0xE6C7, + 0x5AB3: 0xCFB1, + 0x5AB4: 0x8B85, + 0x5AB5: 0xEBF4, + 0x5AB6: 0x8B86, + 0x5AB7: 0x8B87, + 0x5AB8: 0xE6CA, + 0x5AB9: 0x8B88, + 0x5ABA: 0x8B89, + 0x5ABB: 0x8B8A, + 0x5ABC: 0x8B8B, + 0x5ABD: 0x8B8C, + 0x5ABE: 0xE6C5, + 0x5ABF: 0x8B8D, + 0x5AC0: 0x8B8E, + 0x5AC1: 0xBCDE, + 0x5AC2: 0xC9A9, + 0x5AC3: 0x8B8F, + 0x5AC4: 0x8B90, + 0x5AC5: 0x8B91, + 0x5AC6: 0x8B92, + 0x5AC7: 0x8B93, + 0x5AC8: 0x8B94, + 0x5AC9: 0xBCB5, + 0x5ACA: 0x8B95, + 0x5ACB: 0x8B96, + 0x5ACC: 0xCFD3, + 0x5ACD: 0x8B97, + 0x5ACE: 0x8B98, + 0x5ACF: 0x8B99, + 0x5AD0: 0x8B9A, + 0x5AD1: 0x8B9B, + 0x5AD2: 0xE6C8, + 0x5AD3: 0x8B9C, + 0x5AD4: 0xE6C9, + 0x5AD5: 0x8B9D, + 0x5AD6: 0xE6CE, + 0x5AD7: 0x8B9E, + 0x5AD8: 0xE6D0, + 0x5AD9: 0x8B9F, + 0x5ADA: 0x8BA0, + 0x5ADB: 0x8BA1, + 0x5ADC: 0xE6D1, + 0x5ADD: 0x8BA2, + 0x5ADE: 0x8BA3, + 0x5ADF: 0x8BA4, + 0x5AE0: 0xE6CB, + 0x5AE1: 0xB5D5, + 0x5AE2: 0x8BA5, + 0x5AE3: 0xE6CC, + 0x5AE4: 0x8BA6, + 0x5AE5: 0x8BA7, + 0x5AE6: 0xE6CF, + 0x5AE7: 0x8BA8, + 0x5AE8: 0x8BA9, + 0x5AE9: 0xC4DB, + 0x5AEA: 0x8BAA, + 0x5AEB: 0xE6C6, + 0x5AEC: 0x8BAB, + 0x5AED: 0x8BAC, + 0x5AEE: 0x8BAD, + 0x5AEF: 0x8BAE, + 0x5AF0: 0x8BAF, + 0x5AF1: 0xE6CD, + 0x5AF2: 0x8BB0, + 0x5AF3: 0x8BB1, + 0x5AF4: 0x8BB2, + 0x5AF5: 0x8BB3, + 0x5AF6: 0x8BB4, + 0x5AF7: 0x8BB5, + 0x5AF8: 0x8BB6, + 0x5AF9: 0x8BB7, + 0x5AFA: 0x8BB8, + 0x5AFB: 0x8BB9, + 0x5AFC: 0x8BBA, + 0x5AFD: 0x8BBB, + 0x5AFE: 0x8BBC, + 0x5AFF: 0x8BBD, + 0x5B00: 0x8BBE, + 0x5B01: 0x8BBF, + 0x5B02: 0x8BC0, + 0x5B03: 0x8BC1, + 0x5B04: 0x8BC2, + 0x5B05: 0x8BC3, + 0x5B06: 0x8BC4, + 0x5B07: 0x8BC5, + 0x5B08: 0x8BC6, + 0x5B09: 0xE6D2, + 0x5B0A: 0x8BC7, + 0x5B0B: 0x8BC8, + 0x5B0C: 0x8BC9, + 0x5B0D: 0x8BCA, + 0x5B0E: 0x8BCB, + 0x5B0F: 0x8BCC, + 0x5B10: 0x8BCD, + 0x5B11: 0x8BCE, + 0x5B12: 0x8BCF, + 0x5B13: 0x8BD0, + 0x5B14: 0x8BD1, + 0x5B15: 0x8BD2, + 0x5B16: 0xE6D4, + 0x5B17: 0xE6D3, + 0x5B18: 0x8BD3, + 0x5B19: 0x8BD4, + 0x5B1A: 0x8BD5, + 0x5B1B: 0x8BD6, + 0x5B1C: 0x8BD7, + 0x5B1D: 0x8BD8, + 0x5B1E: 0x8BD9, + 0x5B1F: 0x8BDA, + 0x5B20: 0x8BDB, + 0x5B21: 0x8BDC, + 0x5B22: 0x8BDD, + 0x5B23: 0x8BDE, + 0x5B24: 0x8BDF, + 0x5B25: 0x8BE0, + 0x5B26: 0x8BE1, + 0x5B27: 0x8BE2, + 0x5B28: 0x8BE3, + 0x5B29: 0x8BE4, + 0x5B2A: 0x8BE5, + 0x5B2B: 0x8BE6, + 0x5B2C: 0x8BE7, + 0x5B2D: 0x8BE8, + 0x5B2E: 0x8BE9, + 0x5B2F: 0x8BEA, + 0x5B30: 0x8BEB, + 0x5B31: 0x8BEC, + 0x5B32: 0xE6D5, + 0x5B33: 0x8BED, + 0x5B34: 0xD9F8, + 0x5B35: 0x8BEE, + 0x5B36: 0x8BEF, + 0x5B37: 0xE6D6, + 0x5B38: 0x8BF0, + 0x5B39: 0x8BF1, + 0x5B3A: 0x8BF2, + 0x5B3B: 0x8BF3, + 0x5B3C: 0x8BF4, + 0x5B3D: 0x8BF5, + 0x5B3E: 0x8BF6, + 0x5B3F: 0x8BF7, + 0x5B40: 0xE6D7, + 0x5B41: 0x8BF8, + 0x5B42: 0x8BF9, + 0x5B43: 0x8BFA, + 0x5B44: 0x8BFB, + 0x5B45: 0x8BFC, + 0x5B46: 0x8BFD, + 0x5B47: 0x8BFE, + 0x5B48: 0x8C40, + 0x5B49: 0x8C41, + 0x5B4A: 0x8C42, + 0x5B4B: 0x8C43, + 0x5B4C: 0x8C44, + 0x5B4D: 0x8C45, + 0x5B4E: 0x8C46, + 0x5B4F: 0x8C47, + 0x5B50: 0xD7D3, + 0x5B51: 0xE6DD, + 0x5B52: 0x8C48, + 0x5B53: 0xE6DE, + 0x5B54: 0xBFD7, + 0x5B55: 0xD4D0, + 0x5B56: 0x8C49, + 0x5B57: 0xD7D6, + 0x5B58: 0xB4E6, + 0x5B59: 0xCBEF, + 0x5B5A: 0xE6DA, + 0x5B5B: 0xD8C3, + 0x5B5C: 0xD7CE, + 0x5B5D: 0xD0A2, + 0x5B5E: 0x8C4A, + 0x5B5F: 0xC3CF, + 0x5B60: 0x8C4B, + 0x5B61: 0x8C4C, + 0x5B62: 0xE6DF, + 0x5B63: 0xBCBE, + 0x5B64: 0xB9C2, + 0x5B65: 0xE6DB, + 0x5B66: 0xD1A7, + 0x5B67: 0x8C4D, + 0x5B68: 0x8C4E, + 0x5B69: 0xBAA2, + 0x5B6A: 0xC2CF, + 0x5B6B: 0x8C4F, + 0x5B6C: 0xD8AB, + 0x5B6D: 0x8C50, + 0x5B6E: 0x8C51, + 0x5B6F: 0x8C52, + 0x5B70: 0xCAEB, + 0x5B71: 0xE5EE, + 0x5B72: 0x8C53, + 0x5B73: 0xE6DC, + 0x5B74: 0x8C54, + 0x5B75: 0xB7F5, + 0x5B76: 0x8C55, + 0x5B77: 0x8C56, + 0x5B78: 0x8C57, + 0x5B79: 0x8C58, + 0x5B7A: 0xC8E6, + 0x5B7B: 0x8C59, + 0x5B7C: 0x8C5A, + 0x5B7D: 0xC4F5, + 0x5B7E: 0x8C5B, + 0x5B7F: 0x8C5C, + 0x5B80: 0xE5B2, + 0x5B81: 0xC4FE, + 0x5B82: 0x8C5D, + 0x5B83: 0xCBFC, + 0x5B84: 0xE5B3, + 0x5B85: 0xD5AC, + 0x5B86: 0x8C5E, + 0x5B87: 0xD3EE, + 0x5B88: 0xCAD8, + 0x5B89: 0xB0B2, + 0x5B8A: 0x8C5F, + 0x5B8B: 0xCBCE, + 0x5B8C: 0xCDEA, + 0x5B8D: 0x8C60, + 0x5B8E: 0x8C61, + 0x5B8F: 0xBAEA, + 0x5B90: 0x8C62, + 0x5B91: 0x8C63, + 0x5B92: 0x8C64, + 0x5B93: 0xE5B5, + 0x5B94: 0x8C65, + 0x5B95: 0xE5B4, + 0x5B96: 0x8C66, + 0x5B97: 0xD7DA, + 0x5B98: 0xB9D9, + 0x5B99: 0xD6E6, + 0x5B9A: 0xB6A8, + 0x5B9B: 0xCDF0, + 0x5B9C: 0xD2CB, + 0x5B9D: 0xB1A6, + 0x5B9E: 0xCAB5, + 0x5B9F: 0x8C67, + 0x5BA0: 0xB3E8, + 0x5BA1: 0xC9F3, + 0x5BA2: 0xBFCD, + 0x5BA3: 0xD0FB, + 0x5BA4: 0xCAD2, + 0x5BA5: 0xE5B6, + 0x5BA6: 0xBBC2, + 0x5BA7: 0x8C68, + 0x5BA8: 0x8C69, + 0x5BA9: 0x8C6A, + 0x5BAA: 0xCFDC, + 0x5BAB: 0xB9AC, + 0x5BAC: 0x8C6B, + 0x5BAD: 0x8C6C, + 0x5BAE: 0x8C6D, + 0x5BAF: 0x8C6E, + 0x5BB0: 0xD4D7, + 0x5BB1: 0x8C6F, + 0x5BB2: 0x8C70, + 0x5BB3: 0xBAA6, + 0x5BB4: 0xD1E7, + 0x5BB5: 0xCFFC, + 0x5BB6: 0xBCD2, + 0x5BB7: 0x8C71, + 0x5BB8: 0xE5B7, + 0x5BB9: 0xC8DD, + 0x5BBA: 0x8C72, + 0x5BBB: 0x8C73, + 0x5BBC: 0x8C74, + 0x5BBD: 0xBFED, + 0x5BBE: 0xB1F6, + 0x5BBF: 0xCBDE, + 0x5BC0: 0x8C75, + 0x5BC1: 0x8C76, + 0x5BC2: 0xBCC5, + 0x5BC3: 0x8C77, + 0x5BC4: 0xBCC4, + 0x5BC5: 0xD2FA, + 0x5BC6: 0xC3DC, + 0x5BC7: 0xBFDC, + 0x5BC8: 0x8C78, + 0x5BC9: 0x8C79, + 0x5BCA: 0x8C7A, + 0x5BCB: 0x8C7B, + 0x5BCC: 0xB8BB, + 0x5BCD: 0x8C7C, + 0x5BCE: 0x8C7D, + 0x5BCF: 0x8C7E, + 0x5BD0: 0xC3C2, + 0x5BD1: 0x8C80, + 0x5BD2: 0xBAAE, + 0x5BD3: 0xD4A2, + 0x5BD4: 0x8C81, + 0x5BD5: 0x8C82, + 0x5BD6: 0x8C83, + 0x5BD7: 0x8C84, + 0x5BD8: 0x8C85, + 0x5BD9: 0x8C86, + 0x5BDA: 0x8C87, + 0x5BDB: 0x8C88, + 0x5BDC: 0x8C89, + 0x5BDD: 0xC7DE, + 0x5BDE: 0xC4AF, + 0x5BDF: 0xB2EC, + 0x5BE0: 0x8C8A, + 0x5BE1: 0xB9D1, + 0x5BE2: 0x8C8B, + 0x5BE3: 0x8C8C, + 0x5BE4: 0xE5BB, + 0x5BE5: 0xC1C8, + 0x5BE6: 0x8C8D, + 0x5BE7: 0x8C8E, + 0x5BE8: 0xD5AF, + 0x5BE9: 0x8C8F, + 0x5BEA: 0x8C90, + 0x5BEB: 0x8C91, + 0x5BEC: 0x8C92, + 0x5BED: 0x8C93, + 0x5BEE: 0xE5BC, + 0x5BEF: 0x8C94, + 0x5BF0: 0xE5BE, + 0x5BF1: 0x8C95, + 0x5BF2: 0x8C96, + 0x5BF3: 0x8C97, + 0x5BF4: 0x8C98, + 0x5BF5: 0x8C99, + 0x5BF6: 0x8C9A, + 0x5BF7: 0x8C9B, + 0x5BF8: 0xB4E7, + 0x5BF9: 0xB6D4, + 0x5BFA: 0xCBC2, + 0x5BFB: 0xD1B0, + 0x5BFC: 0xB5BC, + 0x5BFD: 0x8C9C, + 0x5BFE: 0x8C9D, + 0x5BFF: 0xCAD9, + 0x5C00: 0x8C9E, + 0x5C01: 0xB7E2, + 0x5C02: 0x8C9F, + 0x5C03: 0x8CA0, + 0x5C04: 0xC9E4, + 0x5C05: 0x8CA1, + 0x5C06: 0xBDAB, + 0x5C07: 0x8CA2, + 0x5C08: 0x8CA3, + 0x5C09: 0xCEBE, + 0x5C0A: 0xD7F0, + 0x5C0B: 0x8CA4, + 0x5C0C: 0x8CA5, + 0x5C0D: 0x8CA6, + 0x5C0E: 0x8CA7, + 0x5C0F: 0xD0A1, + 0x5C10: 0x8CA8, + 0x5C11: 0xC9D9, + 0x5C12: 0x8CA9, + 0x5C13: 0x8CAA, + 0x5C14: 0xB6FB, + 0x5C15: 0xE6D8, + 0x5C16: 0xBCE2, + 0x5C17: 0x8CAB, + 0x5C18: 0xB3BE, + 0x5C19: 0x8CAC, + 0x5C1A: 0xC9D0, + 0x5C1B: 0x8CAD, + 0x5C1C: 0xE6D9, + 0x5C1D: 0xB3A2, + 0x5C1E: 0x8CAE, + 0x5C1F: 0x8CAF, + 0x5C20: 0x8CB0, + 0x5C21: 0x8CB1, + 0x5C22: 0xDECC, + 0x5C23: 0x8CB2, + 0x5C24: 0xD3C8, + 0x5C25: 0xDECD, + 0x5C26: 0x8CB3, + 0x5C27: 0xD2A2, + 0x5C28: 0x8CB4, + 0x5C29: 0x8CB5, + 0x5C2A: 0x8CB6, + 0x5C2B: 0x8CB7, + 0x5C2C: 0xDECE, + 0x5C2D: 0x8CB8, + 0x5C2E: 0x8CB9, + 0x5C2F: 0x8CBA, + 0x5C30: 0x8CBB, + 0x5C31: 0xBECD, + 0x5C32: 0x8CBC, + 0x5C33: 0x8CBD, + 0x5C34: 0xDECF, + 0x5C35: 0x8CBE, + 0x5C36: 0x8CBF, + 0x5C37: 0x8CC0, + 0x5C38: 0xCAAC, + 0x5C39: 0xD2FC, + 0x5C3A: 0xB3DF, + 0x5C3B: 0xE5EA, + 0x5C3C: 0xC4E1, + 0x5C3D: 0xBEA1, + 0x5C3E: 0xCEB2, + 0x5C3F: 0xC4F2, + 0x5C40: 0xBED6, + 0x5C41: 0xC6A8, + 0x5C42: 0xB2E3, + 0x5C43: 0x8CC1, + 0x5C44: 0x8CC2, + 0x5C45: 0xBED3, + 0x5C46: 0x8CC3, + 0x5C47: 0x8CC4, + 0x5C48: 0xC7FC, + 0x5C49: 0xCCEB, + 0x5C4A: 0xBDEC, + 0x5C4B: 0xCEDD, + 0x5C4C: 0x8CC5, + 0x5C4D: 0x8CC6, + 0x5C4E: 0xCABA, + 0x5C4F: 0xC6C1, + 0x5C50: 0xE5EC, + 0x5C51: 0xD0BC, + 0x5C52: 0x8CC7, + 0x5C53: 0x8CC8, + 0x5C54: 0x8CC9, + 0x5C55: 0xD5B9, + 0x5C56: 0x8CCA, + 0x5C57: 0x8CCB, + 0x5C58: 0x8CCC, + 0x5C59: 0xE5ED, + 0x5C5A: 0x8CCD, + 0x5C5B: 0x8CCE, + 0x5C5C: 0x8CCF, + 0x5C5D: 0x8CD0, + 0x5C5E: 0xCAF4, + 0x5C5F: 0x8CD1, + 0x5C60: 0xCDC0, + 0x5C61: 0xC2C5, + 0x5C62: 0x8CD2, + 0x5C63: 0xE5EF, + 0x5C64: 0x8CD3, + 0x5C65: 0xC2C4, + 0x5C66: 0xE5F0, + 0x5C67: 0x8CD4, + 0x5C68: 0x8CD5, + 0x5C69: 0x8CD6, + 0x5C6A: 0x8CD7, + 0x5C6B: 0x8CD8, + 0x5C6C: 0x8CD9, + 0x5C6D: 0x8CDA, + 0x5C6E: 0xE5F8, + 0x5C6F: 0xCDCD, + 0x5C70: 0x8CDB, + 0x5C71: 0xC9BD, + 0x5C72: 0x8CDC, + 0x5C73: 0x8CDD, + 0x5C74: 0x8CDE, + 0x5C75: 0x8CDF, + 0x5C76: 0x8CE0, + 0x5C77: 0x8CE1, + 0x5C78: 0x8CE2, + 0x5C79: 0xD2D9, + 0x5C7A: 0xE1A8, + 0x5C7B: 0x8CE3, + 0x5C7C: 0x8CE4, + 0x5C7D: 0x8CE5, + 0x5C7E: 0x8CE6, + 0x5C7F: 0xD3EC, + 0x5C80: 0x8CE7, + 0x5C81: 0xCBEA, + 0x5C82: 0xC6F1, + 0x5C83: 0x8CE8, + 0x5C84: 0x8CE9, + 0x5C85: 0x8CEA, + 0x5C86: 0x8CEB, + 0x5C87: 0x8CEC, + 0x5C88: 0xE1AC, + 0x5C89: 0x8CED, + 0x5C8A: 0x8CEE, + 0x5C8B: 0x8CEF, + 0x5C8C: 0xE1A7, + 0x5C8D: 0xE1A9, + 0x5C8E: 0x8CF0, + 0x5C8F: 0x8CF1, + 0x5C90: 0xE1AA, + 0x5C91: 0xE1AF, + 0x5C92: 0x8CF2, + 0x5C93: 0x8CF3, + 0x5C94: 0xB2ED, + 0x5C95: 0x8CF4, + 0x5C96: 0xE1AB, + 0x5C97: 0xB8DA, + 0x5C98: 0xE1AD, + 0x5C99: 0xE1AE, + 0x5C9A: 0xE1B0, + 0x5C9B: 0xB5BA, + 0x5C9C: 0xE1B1, + 0x5C9D: 0x8CF5, + 0x5C9E: 0x8CF6, + 0x5C9F: 0x8CF7, + 0x5CA0: 0x8CF8, + 0x5CA1: 0x8CF9, + 0x5CA2: 0xE1B3, + 0x5CA3: 0xE1B8, + 0x5CA4: 0x8CFA, + 0x5CA5: 0x8CFB, + 0x5CA6: 0x8CFC, + 0x5CA7: 0x8CFD, + 0x5CA8: 0x8CFE, + 0x5CA9: 0xD1D2, + 0x5CAA: 0x8D40, + 0x5CAB: 0xE1B6, + 0x5CAC: 0xE1B5, + 0x5CAD: 0xC1EB, + 0x5CAE: 0x8D41, + 0x5CAF: 0x8D42, + 0x5CB0: 0x8D43, + 0x5CB1: 0xE1B7, + 0x5CB2: 0x8D44, + 0x5CB3: 0xD4C0, + 0x5CB4: 0x8D45, + 0x5CB5: 0xE1B2, + 0x5CB6: 0x8D46, + 0x5CB7: 0xE1BA, + 0x5CB8: 0xB0B6, + 0x5CB9: 0x8D47, + 0x5CBA: 0x8D48, + 0x5CBB: 0x8D49, + 0x5CBC: 0x8D4A, + 0x5CBD: 0xE1B4, + 0x5CBE: 0x8D4B, + 0x5CBF: 0xBFF9, + 0x5CC0: 0x8D4C, + 0x5CC1: 0xE1B9, + 0x5CC2: 0x8D4D, + 0x5CC3: 0x8D4E, + 0x5CC4: 0xE1BB, + 0x5CC5: 0x8D4F, + 0x5CC6: 0x8D50, + 0x5CC7: 0x8D51, + 0x5CC8: 0x8D52, + 0x5CC9: 0x8D53, + 0x5CCA: 0x8D54, + 0x5CCB: 0xE1BE, + 0x5CCC: 0x8D55, + 0x5CCD: 0x8D56, + 0x5CCE: 0x8D57, + 0x5CCF: 0x8D58, + 0x5CD0: 0x8D59, + 0x5CD1: 0x8D5A, + 0x5CD2: 0xE1BC, + 0x5CD3: 0x8D5B, + 0x5CD4: 0x8D5C, + 0x5CD5: 0x8D5D, + 0x5CD6: 0x8D5E, + 0x5CD7: 0x8D5F, + 0x5CD8: 0x8D60, + 0x5CD9: 0xD6C5, + 0x5CDA: 0x8D61, + 0x5CDB: 0x8D62, + 0x5CDC: 0x8D63, + 0x5CDD: 0x8D64, + 0x5CDE: 0x8D65, + 0x5CDF: 0x8D66, + 0x5CE0: 0x8D67, + 0x5CE1: 0xCFBF, + 0x5CE2: 0x8D68, + 0x5CE3: 0x8D69, + 0x5CE4: 0xE1BD, + 0x5CE5: 0xE1BF, + 0x5CE6: 0xC2CD, + 0x5CE7: 0x8D6A, + 0x5CE8: 0xB6EB, + 0x5CE9: 0x8D6B, + 0x5CEA: 0xD3F8, + 0x5CEB: 0x8D6C, + 0x5CEC: 0x8D6D, + 0x5CED: 0xC7CD, + 0x5CEE: 0x8D6E, + 0x5CEF: 0x8D6F, + 0x5CF0: 0xB7E5, + 0x5CF1: 0x8D70, + 0x5CF2: 0x8D71, + 0x5CF3: 0x8D72, + 0x5CF4: 0x8D73, + 0x5CF5: 0x8D74, + 0x5CF6: 0x8D75, + 0x5CF7: 0x8D76, + 0x5CF8: 0x8D77, + 0x5CF9: 0x8D78, + 0x5CFA: 0x8D79, + 0x5CFB: 0xBEFE, + 0x5CFC: 0x8D7A, + 0x5CFD: 0x8D7B, + 0x5CFE: 0x8D7C, + 0x5CFF: 0x8D7D, + 0x5D00: 0x8D7E, + 0x5D01: 0x8D80, + 0x5D02: 0xE1C0, + 0x5D03: 0xE1C1, + 0x5D04: 0x8D81, + 0x5D05: 0x8D82, + 0x5D06: 0xE1C7, + 0x5D07: 0xB3E7, + 0x5D08: 0x8D83, + 0x5D09: 0x8D84, + 0x5D0A: 0x8D85, + 0x5D0B: 0x8D86, + 0x5D0C: 0x8D87, + 0x5D0D: 0x8D88, + 0x5D0E: 0xC6E9, + 0x5D0F: 0x8D89, + 0x5D10: 0x8D8A, + 0x5D11: 0x8D8B, + 0x5D12: 0x8D8C, + 0x5D13: 0x8D8D, + 0x5D14: 0xB4DE, + 0x5D15: 0x8D8E, + 0x5D16: 0xD1C2, + 0x5D17: 0x8D8F, + 0x5D18: 0x8D90, + 0x5D19: 0x8D91, + 0x5D1A: 0x8D92, + 0x5D1B: 0xE1C8, + 0x5D1C: 0x8D93, + 0x5D1D: 0x8D94, + 0x5D1E: 0xE1C6, + 0x5D1F: 0x8D95, + 0x5D20: 0x8D96, + 0x5D21: 0x8D97, + 0x5D22: 0x8D98, + 0x5D23: 0x8D99, + 0x5D24: 0xE1C5, + 0x5D25: 0x8D9A, + 0x5D26: 0xE1C3, + 0x5D27: 0xE1C2, + 0x5D28: 0x8D9B, + 0x5D29: 0xB1C0, + 0x5D2A: 0x8D9C, + 0x5D2B: 0x8D9D, + 0x5D2C: 0x8D9E, + 0x5D2D: 0xD5B8, + 0x5D2E: 0xE1C4, + 0x5D2F: 0x8D9F, + 0x5D30: 0x8DA0, + 0x5D31: 0x8DA1, + 0x5D32: 0x8DA2, + 0x5D33: 0x8DA3, + 0x5D34: 0xE1CB, + 0x5D35: 0x8DA4, + 0x5D36: 0x8DA5, + 0x5D37: 0x8DA6, + 0x5D38: 0x8DA7, + 0x5D39: 0x8DA8, + 0x5D3A: 0x8DA9, + 0x5D3B: 0x8DAA, + 0x5D3C: 0x8DAB, + 0x5D3D: 0xE1CC, + 0x5D3E: 0xE1CA, + 0x5D3F: 0x8DAC, + 0x5D40: 0x8DAD, + 0x5D41: 0x8DAE, + 0x5D42: 0x8DAF, + 0x5D43: 0x8DB0, + 0x5D44: 0x8DB1, + 0x5D45: 0x8DB2, + 0x5D46: 0x8DB3, + 0x5D47: 0xEFFA, + 0x5D48: 0x8DB4, + 0x5D49: 0x8DB5, + 0x5D4A: 0xE1D3, + 0x5D4B: 0xE1D2, + 0x5D4C: 0xC7B6, + 0x5D4D: 0x8DB6, + 0x5D4E: 0x8DB7, + 0x5D4F: 0x8DB8, + 0x5D50: 0x8DB9, + 0x5D51: 0x8DBA, + 0x5D52: 0x8DBB, + 0x5D53: 0x8DBC, + 0x5D54: 0x8DBD, + 0x5D55: 0x8DBE, + 0x5D56: 0x8DBF, + 0x5D57: 0x8DC0, + 0x5D58: 0xE1C9, + 0x5D59: 0x8DC1, + 0x5D5A: 0x8DC2, + 0x5D5B: 0xE1CE, + 0x5D5C: 0x8DC3, + 0x5D5D: 0xE1D0, + 0x5D5E: 0x8DC4, + 0x5D5F: 0x8DC5, + 0x5D60: 0x8DC6, + 0x5D61: 0x8DC7, + 0x5D62: 0x8DC8, + 0x5D63: 0x8DC9, + 0x5D64: 0x8DCA, + 0x5D65: 0x8DCB, + 0x5D66: 0x8DCC, + 0x5D67: 0x8DCD, + 0x5D68: 0x8DCE, + 0x5D69: 0xE1D4, + 0x5D6A: 0x8DCF, + 0x5D6B: 0xE1D1, + 0x5D6C: 0xE1CD, + 0x5D6D: 0x8DD0, + 0x5D6E: 0x8DD1, + 0x5D6F: 0xE1CF, + 0x5D70: 0x8DD2, + 0x5D71: 0x8DD3, + 0x5D72: 0x8DD4, + 0x5D73: 0x8DD5, + 0x5D74: 0xE1D5, + 0x5D75: 0x8DD6, + 0x5D76: 0x8DD7, + 0x5D77: 0x8DD8, + 0x5D78: 0x8DD9, + 0x5D79: 0x8DDA, + 0x5D7A: 0x8DDB, + 0x5D7B: 0x8DDC, + 0x5D7C: 0x8DDD, + 0x5D7D: 0x8DDE, + 0x5D7E: 0x8DDF, + 0x5D7F: 0x8DE0, + 0x5D80: 0x8DE1, + 0x5D81: 0x8DE2, + 0x5D82: 0xE1D6, + 0x5D83: 0x8DE3, + 0x5D84: 0x8DE4, + 0x5D85: 0x8DE5, + 0x5D86: 0x8DE6, + 0x5D87: 0x8DE7, + 0x5D88: 0x8DE8, + 0x5D89: 0x8DE9, + 0x5D8A: 0x8DEA, + 0x5D8B: 0x8DEB, + 0x5D8C: 0x8DEC, + 0x5D8D: 0x8DED, + 0x5D8E: 0x8DEE, + 0x5D8F: 0x8DEF, + 0x5D90: 0x8DF0, + 0x5D91: 0x8DF1, + 0x5D92: 0x8DF2, + 0x5D93: 0x8DF3, + 0x5D94: 0x8DF4, + 0x5D95: 0x8DF5, + 0x5D96: 0x8DF6, + 0x5D97: 0x8DF7, + 0x5D98: 0x8DF8, + 0x5D99: 0xE1D7, + 0x5D9A: 0x8DF9, + 0x5D9B: 0x8DFA, + 0x5D9C: 0x8DFB, + 0x5D9D: 0xE1D8, + 0x5D9E: 0x8DFC, + 0x5D9F: 0x8DFD, + 0x5DA0: 0x8DFE, + 0x5DA1: 0x8E40, + 0x5DA2: 0x8E41, + 0x5DA3: 0x8E42, + 0x5DA4: 0x8E43, + 0x5DA5: 0x8E44, + 0x5DA6: 0x8E45, + 0x5DA7: 0x8E46, + 0x5DA8: 0x8E47, + 0x5DA9: 0x8E48, + 0x5DAA: 0x8E49, + 0x5DAB: 0x8E4A, + 0x5DAC: 0x8E4B, + 0x5DAD: 0x8E4C, + 0x5DAE: 0x8E4D, + 0x5DAF: 0x8E4E, + 0x5DB0: 0x8E4F, + 0x5DB1: 0x8E50, + 0x5DB2: 0x8E51, + 0x5DB3: 0x8E52, + 0x5DB4: 0x8E53, + 0x5DB5: 0x8E54, + 0x5DB6: 0x8E55, + 0x5DB7: 0xE1DA, + 0x5DB8: 0x8E56, + 0x5DB9: 0x8E57, + 0x5DBA: 0x8E58, + 0x5DBB: 0x8E59, + 0x5DBC: 0x8E5A, + 0x5DBD: 0x8E5B, + 0x5DBE: 0x8E5C, + 0x5DBF: 0x8E5D, + 0x5DC0: 0x8E5E, + 0x5DC1: 0x8E5F, + 0x5DC2: 0x8E60, + 0x5DC3: 0x8E61, + 0x5DC4: 0x8E62, + 0x5DC5: 0xE1DB, + 0x5DC6: 0x8E63, + 0x5DC7: 0x8E64, + 0x5DC8: 0x8E65, + 0x5DC9: 0x8E66, + 0x5DCA: 0x8E67, + 0x5DCB: 0x8E68, + 0x5DCC: 0x8E69, + 0x5DCD: 0xCEA1, + 0x5DCE: 0x8E6A, + 0x5DCF: 0x8E6B, + 0x5DD0: 0x8E6C, + 0x5DD1: 0x8E6D, + 0x5DD2: 0x8E6E, + 0x5DD3: 0x8E6F, + 0x5DD4: 0x8E70, + 0x5DD5: 0x8E71, + 0x5DD6: 0x8E72, + 0x5DD7: 0x8E73, + 0x5DD8: 0x8E74, + 0x5DD9: 0x8E75, + 0x5DDA: 0x8E76, + 0x5DDB: 0xE7DD, + 0x5DDC: 0x8E77, + 0x5DDD: 0xB4A8, + 0x5DDE: 0xD6DD, + 0x5DDF: 0x8E78, + 0x5DE0: 0x8E79, + 0x5DE1: 0xD1B2, + 0x5DE2: 0xB3B2, + 0x5DE3: 0x8E7A, + 0x5DE4: 0x8E7B, + 0x5DE5: 0xB9A4, + 0x5DE6: 0xD7F3, + 0x5DE7: 0xC7C9, + 0x5DE8: 0xBEDE, + 0x5DE9: 0xB9AE, + 0x5DEA: 0x8E7C, + 0x5DEB: 0xCED7, + 0x5DEC: 0x8E7D, + 0x5DED: 0x8E7E, + 0x5DEE: 0xB2EE, + 0x5DEF: 0xDBCF, + 0x5DF0: 0x8E80, + 0x5DF1: 0xBCBA, + 0x5DF2: 0xD2D1, + 0x5DF3: 0xCBC8, + 0x5DF4: 0xB0CD, + 0x5DF5: 0x8E81, + 0x5DF6: 0x8E82, + 0x5DF7: 0xCFEF, + 0x5DF8: 0x8E83, + 0x5DF9: 0x8E84, + 0x5DFA: 0x8E85, + 0x5DFB: 0x8E86, + 0x5DFC: 0x8E87, + 0x5DFD: 0xD9E3, + 0x5DFE: 0xBDED, + 0x5DFF: 0x8E88, + 0x5E00: 0x8E89, + 0x5E01: 0xB1D2, + 0x5E02: 0xCAD0, + 0x5E03: 0xB2BC, + 0x5E04: 0x8E8A, + 0x5E05: 0xCBA7, + 0x5E06: 0xB7AB, + 0x5E07: 0x8E8B, + 0x5E08: 0xCAA6, + 0x5E09: 0x8E8C, + 0x5E0A: 0x8E8D, + 0x5E0B: 0x8E8E, + 0x5E0C: 0xCFA3, + 0x5E0D: 0x8E8F, + 0x5E0E: 0x8E90, + 0x5E0F: 0xE0F8, + 0x5E10: 0xD5CA, + 0x5E11: 0xE0FB, + 0x5E12: 0x8E91, + 0x5E13: 0x8E92, + 0x5E14: 0xE0FA, + 0x5E15: 0xC5C1, + 0x5E16: 0xCCFB, + 0x5E17: 0x8E93, + 0x5E18: 0xC1B1, + 0x5E19: 0xE0F9, + 0x5E1A: 0xD6E3, + 0x5E1B: 0xB2AF, + 0x5E1C: 0xD6C4, + 0x5E1D: 0xB5DB, + 0x5E1E: 0x8E94, + 0x5E1F: 0x8E95, + 0x5E20: 0x8E96, + 0x5E21: 0x8E97, + 0x5E22: 0x8E98, + 0x5E23: 0x8E99, + 0x5E24: 0x8E9A, + 0x5E25: 0x8E9B, + 0x5E26: 0xB4F8, + 0x5E27: 0xD6A1, + 0x5E28: 0x8E9C, + 0x5E29: 0x8E9D, + 0x5E2A: 0x8E9E, + 0x5E2B: 0x8E9F, + 0x5E2C: 0x8EA0, + 0x5E2D: 0xCFAF, + 0x5E2E: 0xB0EF, + 0x5E2F: 0x8EA1, + 0x5E30: 0x8EA2, + 0x5E31: 0xE0FC, + 0x5E32: 0x8EA3, + 0x5E33: 0x8EA4, + 0x5E34: 0x8EA5, + 0x5E35: 0x8EA6, + 0x5E36: 0x8EA7, + 0x5E37: 0xE1A1, + 0x5E38: 0xB3A3, + 0x5E39: 0x8EA8, + 0x5E3A: 0x8EA9, + 0x5E3B: 0xE0FD, + 0x5E3C: 0xE0FE, + 0x5E3D: 0xC3B1, + 0x5E3E: 0x8EAA, + 0x5E3F: 0x8EAB, + 0x5E40: 0x8EAC, + 0x5E41: 0x8EAD, + 0x5E42: 0xC3DD, + 0x5E43: 0x8EAE, + 0x5E44: 0xE1A2, + 0x5E45: 0xB7F9, + 0x5E46: 0x8EAF, + 0x5E47: 0x8EB0, + 0x5E48: 0x8EB1, + 0x5E49: 0x8EB2, + 0x5E4A: 0x8EB3, + 0x5E4B: 0x8EB4, + 0x5E4C: 0xBBCF, + 0x5E4D: 0x8EB5, + 0x5E4E: 0x8EB6, + 0x5E4F: 0x8EB7, + 0x5E50: 0x8EB8, + 0x5E51: 0x8EB9, + 0x5E52: 0x8EBA, + 0x5E53: 0x8EBB, + 0x5E54: 0xE1A3, + 0x5E55: 0xC4BB, + 0x5E56: 0x8EBC, + 0x5E57: 0x8EBD, + 0x5E58: 0x8EBE, + 0x5E59: 0x8EBF, + 0x5E5A: 0x8EC0, + 0x5E5B: 0xE1A4, + 0x5E5C: 0x8EC1, + 0x5E5D: 0x8EC2, + 0x5E5E: 0xE1A5, + 0x5E5F: 0x8EC3, + 0x5E60: 0x8EC4, + 0x5E61: 0xE1A6, + 0x5E62: 0xB4B1, + 0x5E63: 0x8EC5, + 0x5E64: 0x8EC6, + 0x5E65: 0x8EC7, + 0x5E66: 0x8EC8, + 0x5E67: 0x8EC9, + 0x5E68: 0x8ECA, + 0x5E69: 0x8ECB, + 0x5E6A: 0x8ECC, + 0x5E6B: 0x8ECD, + 0x5E6C: 0x8ECE, + 0x5E6D: 0x8ECF, + 0x5E6E: 0x8ED0, + 0x5E6F: 0x8ED1, + 0x5E70: 0x8ED2, + 0x5E71: 0x8ED3, + 0x5E72: 0xB8C9, + 0x5E73: 0xC6BD, + 0x5E74: 0xC4EA, + 0x5E75: 0x8ED4, + 0x5E76: 0xB2A2, + 0x5E77: 0x8ED5, + 0x5E78: 0xD0D2, + 0x5E79: 0x8ED6, + 0x5E7A: 0xE7DB, + 0x5E7B: 0xBBC3, + 0x5E7C: 0xD3D7, + 0x5E7D: 0xD3C4, + 0x5E7E: 0x8ED7, + 0x5E7F: 0xB9E3, + 0x5E80: 0xE2CF, + 0x5E81: 0x8ED8, + 0x5E82: 0x8ED9, + 0x5E83: 0x8EDA, + 0x5E84: 0xD7AF, + 0x5E85: 0x8EDB, + 0x5E86: 0xC7EC, + 0x5E87: 0xB1D3, + 0x5E88: 0x8EDC, + 0x5E89: 0x8EDD, + 0x5E8A: 0xB4B2, + 0x5E8B: 0xE2D1, + 0x5E8C: 0x8EDE, + 0x5E8D: 0x8EDF, + 0x5E8E: 0x8EE0, + 0x5E8F: 0xD0F2, + 0x5E90: 0xC2AE, + 0x5E91: 0xE2D0, + 0x5E92: 0x8EE1, + 0x5E93: 0xBFE2, + 0x5E94: 0xD3A6, + 0x5E95: 0xB5D7, + 0x5E96: 0xE2D2, + 0x5E97: 0xB5EA, + 0x5E98: 0x8EE2, + 0x5E99: 0xC3ED, + 0x5E9A: 0xB8FD, + 0x5E9B: 0x8EE3, + 0x5E9C: 0xB8AE, + 0x5E9D: 0x8EE4, + 0x5E9E: 0xC5D3, + 0x5E9F: 0xB7CF, + 0x5EA0: 0xE2D4, + 0x5EA1: 0x8EE5, + 0x5EA2: 0x8EE6, + 0x5EA3: 0x8EE7, + 0x5EA4: 0x8EE8, + 0x5EA5: 0xE2D3, + 0x5EA6: 0xB6C8, + 0x5EA7: 0xD7F9, + 0x5EA8: 0x8EE9, + 0x5EA9: 0x8EEA, + 0x5EAA: 0x8EEB, + 0x5EAB: 0x8EEC, + 0x5EAC: 0x8EED, + 0x5EAD: 0xCDA5, + 0x5EAE: 0x8EEE, + 0x5EAF: 0x8EEF, + 0x5EB0: 0x8EF0, + 0x5EB1: 0x8EF1, + 0x5EB2: 0x8EF2, + 0x5EB3: 0xE2D8, + 0x5EB4: 0x8EF3, + 0x5EB5: 0xE2D6, + 0x5EB6: 0xCAFC, + 0x5EB7: 0xBFB5, + 0x5EB8: 0xD3B9, + 0x5EB9: 0xE2D5, + 0x5EBA: 0x8EF4, + 0x5EBB: 0x8EF5, + 0x5EBC: 0x8EF6, + 0x5EBD: 0x8EF7, + 0x5EBE: 0xE2D7, + 0x5EBF: 0x8EF8, + 0x5EC0: 0x8EF9, + 0x5EC1: 0x8EFA, + 0x5EC2: 0x8EFB, + 0x5EC3: 0x8EFC, + 0x5EC4: 0x8EFD, + 0x5EC5: 0x8EFE, + 0x5EC6: 0x8F40, + 0x5EC7: 0x8F41, + 0x5EC8: 0x8F42, + 0x5EC9: 0xC1AE, + 0x5ECA: 0xC0C8, + 0x5ECB: 0x8F43, + 0x5ECC: 0x8F44, + 0x5ECD: 0x8F45, + 0x5ECE: 0x8F46, + 0x5ECF: 0x8F47, + 0x5ED0: 0x8F48, + 0x5ED1: 0xE2DB, + 0x5ED2: 0xE2DA, + 0x5ED3: 0xC0AA, + 0x5ED4: 0x8F49, + 0x5ED5: 0x8F4A, + 0x5ED6: 0xC1CE, + 0x5ED7: 0x8F4B, + 0x5ED8: 0x8F4C, + 0x5ED9: 0x8F4D, + 0x5EDA: 0x8F4E, + 0x5EDB: 0xE2DC, + 0x5EDC: 0x8F4F, + 0x5EDD: 0x8F50, + 0x5EDE: 0x8F51, + 0x5EDF: 0x8F52, + 0x5EE0: 0x8F53, + 0x5EE1: 0x8F54, + 0x5EE2: 0x8F55, + 0x5EE3: 0x8F56, + 0x5EE4: 0x8F57, + 0x5EE5: 0x8F58, + 0x5EE6: 0x8F59, + 0x5EE7: 0x8F5A, + 0x5EE8: 0xE2DD, + 0x5EE9: 0x8F5B, + 0x5EEA: 0xE2DE, + 0x5EEB: 0x8F5C, + 0x5EEC: 0x8F5D, + 0x5EED: 0x8F5E, + 0x5EEE: 0x8F5F, + 0x5EEF: 0x8F60, + 0x5EF0: 0x8F61, + 0x5EF1: 0x8F62, + 0x5EF2: 0x8F63, + 0x5EF3: 0x8F64, + 0x5EF4: 0xDBC8, + 0x5EF5: 0x8F65, + 0x5EF6: 0xD1D3, + 0x5EF7: 0xCDA2, + 0x5EF8: 0x8F66, + 0x5EF9: 0x8F67, + 0x5EFA: 0xBDA8, + 0x5EFB: 0x8F68, + 0x5EFC: 0x8F69, + 0x5EFD: 0x8F6A, + 0x5EFE: 0xDEC3, + 0x5EFF: 0xD8A5, + 0x5F00: 0xBFAA, + 0x5F01: 0xDBCD, + 0x5F02: 0xD2EC, + 0x5F03: 0xC6FA, + 0x5F04: 0xC5AA, + 0x5F05: 0x8F6B, + 0x5F06: 0x8F6C, + 0x5F07: 0x8F6D, + 0x5F08: 0xDEC4, + 0x5F09: 0x8F6E, + 0x5F0A: 0xB1D7, + 0x5F0B: 0xDFAE, + 0x5F0C: 0x8F6F, + 0x5F0D: 0x8F70, + 0x5F0E: 0x8F71, + 0x5F0F: 0xCABD, + 0x5F10: 0x8F72, + 0x5F11: 0xDFB1, + 0x5F12: 0x8F73, + 0x5F13: 0xB9AD, + 0x5F14: 0x8F74, + 0x5F15: 0xD2FD, + 0x5F16: 0x8F75, + 0x5F17: 0xB8A5, + 0x5F18: 0xBAEB, + 0x5F19: 0x8F76, + 0x5F1A: 0x8F77, + 0x5F1B: 0xB3DA, + 0x5F1C: 0x8F78, + 0x5F1D: 0x8F79, + 0x5F1E: 0x8F7A, + 0x5F1F: 0xB5DC, + 0x5F20: 0xD5C5, + 0x5F21: 0x8F7B, + 0x5F22: 0x8F7C, + 0x5F23: 0x8F7D, + 0x5F24: 0x8F7E, + 0x5F25: 0xC3D6, + 0x5F26: 0xCFD2, + 0x5F27: 0xBBA1, + 0x5F28: 0x8F80, + 0x5F29: 0xE5F3, + 0x5F2A: 0xE5F2, + 0x5F2B: 0x8F81, + 0x5F2C: 0x8F82, + 0x5F2D: 0xE5F4, + 0x5F2E: 0x8F83, + 0x5F2F: 0xCDE4, + 0x5F30: 0x8F84, + 0x5F31: 0xC8F5, + 0x5F32: 0x8F85, + 0x5F33: 0x8F86, + 0x5F34: 0x8F87, + 0x5F35: 0x8F88, + 0x5F36: 0x8F89, + 0x5F37: 0x8F8A, + 0x5F38: 0x8F8B, + 0x5F39: 0xB5AF, + 0x5F3A: 0xC7BF, + 0x5F3B: 0x8F8C, + 0x5F3C: 0xE5F6, + 0x5F3D: 0x8F8D, + 0x5F3E: 0x8F8E, + 0x5F3F: 0x8F8F, + 0x5F40: 0xECB0, + 0x5F41: 0x8F90, + 0x5F42: 0x8F91, + 0x5F43: 0x8F92, + 0x5F44: 0x8F93, + 0x5F45: 0x8F94, + 0x5F46: 0x8F95, + 0x5F47: 0x8F96, + 0x5F48: 0x8F97, + 0x5F49: 0x8F98, + 0x5F4A: 0x8F99, + 0x5F4B: 0x8F9A, + 0x5F4C: 0x8F9B, + 0x5F4D: 0x8F9C, + 0x5F4E: 0x8F9D, + 0x5F4F: 0x8F9E, + 0x5F50: 0xE5E6, + 0x5F51: 0x8F9F, + 0x5F52: 0xB9E9, + 0x5F53: 0xB5B1, + 0x5F54: 0x8FA0, + 0x5F55: 0xC2BC, + 0x5F56: 0xE5E8, + 0x5F57: 0xE5E7, + 0x5F58: 0xE5E9, + 0x5F59: 0x8FA1, + 0x5F5A: 0x8FA2, + 0x5F5B: 0x8FA3, + 0x5F5C: 0x8FA4, + 0x5F5D: 0xD2CD, + 0x5F5E: 0x8FA5, + 0x5F5F: 0x8FA6, + 0x5F60: 0x8FA7, + 0x5F61: 0xE1EA, + 0x5F62: 0xD0CE, + 0x5F63: 0x8FA8, + 0x5F64: 0xCDAE, + 0x5F65: 0x8FA9, + 0x5F66: 0xD1E5, + 0x5F67: 0x8FAA, + 0x5F68: 0x8FAB, + 0x5F69: 0xB2CA, + 0x5F6A: 0xB1EB, + 0x5F6B: 0x8FAC, + 0x5F6C: 0xB1F2, + 0x5F6D: 0xC5ED, + 0x5F6E: 0x8FAD, + 0x5F6F: 0x8FAE, + 0x5F70: 0xD5C3, + 0x5F71: 0xD3B0, + 0x5F72: 0x8FAF, + 0x5F73: 0xE1DC, + 0x5F74: 0x8FB0, + 0x5F75: 0x8FB1, + 0x5F76: 0x8FB2, + 0x5F77: 0xE1DD, + 0x5F78: 0x8FB3, + 0x5F79: 0xD2DB, + 0x5F7A: 0x8FB4, + 0x5F7B: 0xB3B9, + 0x5F7C: 0xB1CB, + 0x5F7D: 0x8FB5, + 0x5F7E: 0x8FB6, + 0x5F7F: 0x8FB7, + 0x5F80: 0xCDF9, + 0x5F81: 0xD5F7, + 0x5F82: 0xE1DE, + 0x5F83: 0x8FB8, + 0x5F84: 0xBEB6, + 0x5F85: 0xB4FD, + 0x5F86: 0x8FB9, + 0x5F87: 0xE1DF, + 0x5F88: 0xBADC, + 0x5F89: 0xE1E0, + 0x5F8A: 0xBBB2, + 0x5F8B: 0xC2C9, + 0x5F8C: 0xE1E1, + 0x5F8D: 0x8FBA, + 0x5F8E: 0x8FBB, + 0x5F8F: 0x8FBC, + 0x5F90: 0xD0EC, + 0x5F91: 0x8FBD, + 0x5F92: 0xCDBD, + 0x5F93: 0x8FBE, + 0x5F94: 0x8FBF, + 0x5F95: 0xE1E2, + 0x5F96: 0x8FC0, + 0x5F97: 0xB5C3, + 0x5F98: 0xC5C7, + 0x5F99: 0xE1E3, + 0x5F9A: 0x8FC1, + 0x5F9B: 0x8FC2, + 0x5F9C: 0xE1E4, + 0x5F9D: 0x8FC3, + 0x5F9E: 0x8FC4, + 0x5F9F: 0x8FC5, + 0x5FA0: 0x8FC6, + 0x5FA1: 0xD3F9, + 0x5FA2: 0x8FC7, + 0x5FA3: 0x8FC8, + 0x5FA4: 0x8FC9, + 0x5FA5: 0x8FCA, + 0x5FA6: 0x8FCB, + 0x5FA7: 0x8FCC, + 0x5FA8: 0xE1E5, + 0x5FA9: 0x8FCD, + 0x5FAA: 0xD1AD, + 0x5FAB: 0x8FCE, + 0x5FAC: 0x8FCF, + 0x5FAD: 0xE1E6, + 0x5FAE: 0xCEA2, + 0x5FAF: 0x8FD0, + 0x5FB0: 0x8FD1, + 0x5FB1: 0x8FD2, + 0x5FB2: 0x8FD3, + 0x5FB3: 0x8FD4, + 0x5FB4: 0x8FD5, + 0x5FB5: 0xE1E7, + 0x5FB6: 0x8FD6, + 0x5FB7: 0xB5C2, + 0x5FB8: 0x8FD7, + 0x5FB9: 0x8FD8, + 0x5FBA: 0x8FD9, + 0x5FBB: 0x8FDA, + 0x5FBC: 0xE1E8, + 0x5FBD: 0xBBD5, + 0x5FBE: 0x8FDB, + 0x5FBF: 0x8FDC, + 0x5FC0: 0x8FDD, + 0x5FC1: 0x8FDE, + 0x5FC2: 0x8FDF, + 0x5FC3: 0xD0C4, + 0x5FC4: 0xE2E0, + 0x5FC5: 0xB1D8, + 0x5FC6: 0xD2E4, + 0x5FC7: 0x8FE0, + 0x5FC8: 0x8FE1, + 0x5FC9: 0xE2E1, + 0x5FCA: 0x8FE2, + 0x5FCB: 0x8FE3, + 0x5FCC: 0xBCC9, + 0x5FCD: 0xC8CC, + 0x5FCE: 0x8FE4, + 0x5FCF: 0xE2E3, + 0x5FD0: 0xECFE, + 0x5FD1: 0xECFD, + 0x5FD2: 0xDFAF, + 0x5FD3: 0x8FE5, + 0x5FD4: 0x8FE6, + 0x5FD5: 0x8FE7, + 0x5FD6: 0xE2E2, + 0x5FD7: 0xD6BE, + 0x5FD8: 0xCDFC, + 0x5FD9: 0xC3A6, + 0x5FDA: 0x8FE8, + 0x5FDB: 0x8FE9, + 0x5FDC: 0x8FEA, + 0x5FDD: 0xE3C3, + 0x5FDE: 0x8FEB, + 0x5FDF: 0x8FEC, + 0x5FE0: 0xD6D2, + 0x5FE1: 0xE2E7, + 0x5FE2: 0x8FED, + 0x5FE3: 0x8FEE, + 0x5FE4: 0xE2E8, + 0x5FE5: 0x8FEF, + 0x5FE6: 0x8FF0, + 0x5FE7: 0xD3C7, + 0x5FE8: 0x8FF1, + 0x5FE9: 0x8FF2, + 0x5FEA: 0xE2EC, + 0x5FEB: 0xBFEC, + 0x5FEC: 0x8FF3, + 0x5FED: 0xE2ED, + 0x5FEE: 0xE2E5, + 0x5FEF: 0x8FF4, + 0x5FF0: 0x8FF5, + 0x5FF1: 0xB3C0, + 0x5FF2: 0x8FF6, + 0x5FF3: 0x8FF7, + 0x5FF4: 0x8FF8, + 0x5FF5: 0xC4EE, + 0x5FF6: 0x8FF9, + 0x5FF7: 0x8FFA, + 0x5FF8: 0xE2EE, + 0x5FF9: 0x8FFB, + 0x5FFA: 0x8FFC, + 0x5FFB: 0xD0C3, + 0x5FFC: 0x8FFD, + 0x5FFD: 0xBAF6, + 0x5FFE: 0xE2E9, + 0x5FFF: 0xB7DE, + 0x6000: 0xBBB3, + 0x6001: 0xCCAC, + 0x6002: 0xCBCB, + 0x6003: 0xE2E4, + 0x6004: 0xE2E6, + 0x6005: 0xE2EA, + 0x6006: 0xE2EB, + 0x6007: 0x8FFE, + 0x6008: 0x9040, + 0x6009: 0x9041, + 0x600A: 0xE2F7, + 0x600B: 0x9042, + 0x600C: 0x9043, + 0x600D: 0xE2F4, + 0x600E: 0xD4F5, + 0x600F: 0xE2F3, + 0x6010: 0x9044, + 0x6011: 0x9045, + 0x6012: 0xC5AD, + 0x6013: 0x9046, + 0x6014: 0xD5FA, + 0x6015: 0xC5C2, + 0x6016: 0xB2C0, + 0x6017: 0x9047, + 0x6018: 0x9048, + 0x6019: 0xE2EF, + 0x601A: 0x9049, + 0x601B: 0xE2F2, + 0x601C: 0xC1AF, + 0x601D: 0xCBBC, + 0x601E: 0x904A, + 0x601F: 0x904B, + 0x6020: 0xB5A1, + 0x6021: 0xE2F9, + 0x6022: 0x904C, + 0x6023: 0x904D, + 0x6024: 0x904E, + 0x6025: 0xBCB1, + 0x6026: 0xE2F1, + 0x6027: 0xD0D4, + 0x6028: 0xD4B9, + 0x6029: 0xE2F5, + 0x602A: 0xB9D6, + 0x602B: 0xE2F6, + 0x602C: 0x904F, + 0x602D: 0x9050, + 0x602E: 0x9051, + 0x602F: 0xC7D3, + 0x6030: 0x9052, + 0x6031: 0x9053, + 0x6032: 0x9054, + 0x6033: 0x9055, + 0x6034: 0x9056, + 0x6035: 0xE2F0, + 0x6036: 0x9057, + 0x6037: 0x9058, + 0x6038: 0x9059, + 0x6039: 0x905A, + 0x603A: 0x905B, + 0x603B: 0xD7DC, + 0x603C: 0xEDA1, + 0x603D: 0x905C, + 0x603E: 0x905D, + 0x603F: 0xE2F8, + 0x6040: 0x905E, + 0x6041: 0xEDA5, + 0x6042: 0xE2FE, + 0x6043: 0xCAD1, + 0x6044: 0x905F, + 0x6045: 0x9060, + 0x6046: 0x9061, + 0x6047: 0x9062, + 0x6048: 0x9063, + 0x6049: 0x9064, + 0x604A: 0x9065, + 0x604B: 0xC1B5, + 0x604C: 0x9066, + 0x604D: 0xBBD0, + 0x604E: 0x9067, + 0x604F: 0x9068, + 0x6050: 0xBFD6, + 0x6051: 0x9069, + 0x6052: 0xBAE3, + 0x6053: 0x906A, + 0x6054: 0x906B, + 0x6055: 0xCBA1, + 0x6056: 0x906C, + 0x6057: 0x906D, + 0x6058: 0x906E, + 0x6059: 0xEDA6, + 0x605A: 0xEDA3, + 0x605B: 0x906F, + 0x605C: 0x9070, + 0x605D: 0xEDA2, + 0x605E: 0x9071, + 0x605F: 0x9072, + 0x6060: 0x9073, + 0x6061: 0x9074, + 0x6062: 0xBBD6, + 0x6063: 0xEDA7, + 0x6064: 0xD0F4, + 0x6065: 0x9075, + 0x6066: 0x9076, + 0x6067: 0xEDA4, + 0x6068: 0xBADE, + 0x6069: 0xB6F7, + 0x606A: 0xE3A1, + 0x606B: 0xB6B2, + 0x606C: 0xCCF1, + 0x606D: 0xB9A7, + 0x606E: 0x9077, + 0x606F: 0xCFA2, + 0x6070: 0xC7A1, + 0x6071: 0x9078, + 0x6072: 0x9079, + 0x6073: 0xBFD2, + 0x6074: 0x907A, + 0x6075: 0x907B, + 0x6076: 0xB6F1, + 0x6077: 0x907C, + 0x6078: 0xE2FA, + 0x6079: 0xE2FB, + 0x607A: 0xE2FD, + 0x607B: 0xE2FC, + 0x607C: 0xC4D5, + 0x607D: 0xE3A2, + 0x607E: 0x907D, + 0x607F: 0xD3C1, + 0x6080: 0x907E, + 0x6081: 0x9080, + 0x6082: 0x9081, + 0x6083: 0xE3A7, + 0x6084: 0xC7C4, + 0x6085: 0x9082, + 0x6086: 0x9083, + 0x6087: 0x9084, + 0x6088: 0x9085, + 0x6089: 0xCFA4, + 0x608A: 0x9086, + 0x608B: 0x9087, + 0x608C: 0xE3A9, + 0x608D: 0xBAB7, + 0x608E: 0x9088, + 0x608F: 0x9089, + 0x6090: 0x908A, + 0x6091: 0x908B, + 0x6092: 0xE3A8, + 0x6093: 0x908C, + 0x6094: 0xBBDA, + 0x6095: 0x908D, + 0x6096: 0xE3A3, + 0x6097: 0x908E, + 0x6098: 0x908F, + 0x6099: 0x9090, + 0x609A: 0xE3A4, + 0x609B: 0xE3AA, + 0x609C: 0x9091, + 0x609D: 0xE3A6, + 0x609E: 0x9092, + 0x609F: 0xCEF2, + 0x60A0: 0xD3C6, + 0x60A1: 0x9093, + 0x60A2: 0x9094, + 0x60A3: 0xBBBC, + 0x60A4: 0x9095, + 0x60A5: 0x9096, + 0x60A6: 0xD4C3, + 0x60A7: 0x9097, + 0x60A8: 0xC4FA, + 0x60A9: 0x9098, + 0x60AA: 0x9099, + 0x60AB: 0xEDA8, + 0x60AC: 0xD0FC, + 0x60AD: 0xE3A5, + 0x60AE: 0x909A, + 0x60AF: 0xC3F5, + 0x60B0: 0x909B, + 0x60B1: 0xE3AD, + 0x60B2: 0xB1AF, + 0x60B3: 0x909C, + 0x60B4: 0xE3B2, + 0x60B5: 0x909D, + 0x60B6: 0x909E, + 0x60B7: 0x909F, + 0x60B8: 0xBCC2, + 0x60B9: 0x90A0, + 0x60BA: 0x90A1, + 0x60BB: 0xE3AC, + 0x60BC: 0xB5BF, + 0x60BD: 0x90A2, + 0x60BE: 0x90A3, + 0x60BF: 0x90A4, + 0x60C0: 0x90A5, + 0x60C1: 0x90A6, + 0x60C2: 0x90A7, + 0x60C3: 0x90A8, + 0x60C4: 0x90A9, + 0x60C5: 0xC7E9, + 0x60C6: 0xE3B0, + 0x60C7: 0x90AA, + 0x60C8: 0x90AB, + 0x60C9: 0x90AC, + 0x60CA: 0xBEAA, + 0x60CB: 0xCDEF, + 0x60CC: 0x90AD, + 0x60CD: 0x90AE, + 0x60CE: 0x90AF, + 0x60CF: 0x90B0, + 0x60D0: 0x90B1, + 0x60D1: 0xBBF3, + 0x60D2: 0x90B2, + 0x60D3: 0x90B3, + 0x60D4: 0x90B4, + 0x60D5: 0xCCE8, + 0x60D6: 0x90B5, + 0x60D7: 0x90B6, + 0x60D8: 0xE3AF, + 0x60D9: 0x90B7, + 0x60DA: 0xE3B1, + 0x60DB: 0x90B8, + 0x60DC: 0xCFA7, + 0x60DD: 0xE3AE, + 0x60DE: 0x90B9, + 0x60DF: 0xCEA9, + 0x60E0: 0xBBDD, + 0x60E1: 0x90BA, + 0x60E2: 0x90BB, + 0x60E3: 0x90BC, + 0x60E4: 0x90BD, + 0x60E5: 0x90BE, + 0x60E6: 0xB5EB, + 0x60E7: 0xBEE5, + 0x60E8: 0xB2D2, + 0x60E9: 0xB3CD, + 0x60EA: 0x90BF, + 0x60EB: 0xB1B9, + 0x60EC: 0xE3AB, + 0x60ED: 0xB2D1, + 0x60EE: 0xB5AC, + 0x60EF: 0xB9DF, + 0x60F0: 0xB6E8, + 0x60F1: 0x90C0, + 0x60F2: 0x90C1, + 0x60F3: 0xCFEB, + 0x60F4: 0xE3B7, + 0x60F5: 0x90C2, + 0x60F6: 0xBBCC, + 0x60F7: 0x90C3, + 0x60F8: 0x90C4, + 0x60F9: 0xC8C7, + 0x60FA: 0xD0CA, + 0x60FB: 0x90C5, + 0x60FC: 0x90C6, + 0x60FD: 0x90C7, + 0x60FE: 0x90C8, + 0x60FF: 0x90C9, + 0x6100: 0xE3B8, + 0x6101: 0xB3EE, + 0x6102: 0x90CA, + 0x6103: 0x90CB, + 0x6104: 0x90CC, + 0x6105: 0x90CD, + 0x6106: 0xEDA9, + 0x6107: 0x90CE, + 0x6108: 0xD3FA, + 0x6109: 0xD3E4, + 0x610A: 0x90CF, + 0x610B: 0x90D0, + 0x610C: 0x90D1, + 0x610D: 0xEDAA, + 0x610E: 0xE3B9, + 0x610F: 0xD2E2, + 0x6110: 0x90D2, + 0x6111: 0x90D3, + 0x6112: 0x90D4, + 0x6113: 0x90D5, + 0x6114: 0x90D6, + 0x6115: 0xE3B5, + 0x6116: 0x90D7, + 0x6117: 0x90D8, + 0x6118: 0x90D9, + 0x6119: 0x90DA, + 0x611A: 0xD3DE, + 0x611B: 0x90DB, + 0x611C: 0x90DC, + 0x611D: 0x90DD, + 0x611E: 0x90DE, + 0x611F: 0xB8D0, + 0x6120: 0xE3B3, + 0x6121: 0x90DF, + 0x6122: 0x90E0, + 0x6123: 0xE3B6, + 0x6124: 0xB7DF, + 0x6125: 0x90E1, + 0x6126: 0xE3B4, + 0x6127: 0xC0A2, + 0x6128: 0x90E2, + 0x6129: 0x90E3, + 0x612A: 0x90E4, + 0x612B: 0xE3BA, + 0x612C: 0x90E5, + 0x612D: 0x90E6, + 0x612E: 0x90E7, + 0x612F: 0x90E8, + 0x6130: 0x90E9, + 0x6131: 0x90EA, + 0x6132: 0x90EB, + 0x6133: 0x90EC, + 0x6134: 0x90ED, + 0x6135: 0x90EE, + 0x6136: 0x90EF, + 0x6137: 0x90F0, + 0x6138: 0x90F1, + 0x6139: 0x90F2, + 0x613A: 0x90F3, + 0x613B: 0x90F4, + 0x613C: 0x90F5, + 0x613D: 0x90F6, + 0x613E: 0x90F7, + 0x613F: 0xD4B8, + 0x6140: 0x90F8, + 0x6141: 0x90F9, + 0x6142: 0x90FA, + 0x6143: 0x90FB, + 0x6144: 0x90FC, + 0x6145: 0x90FD, + 0x6146: 0x90FE, + 0x6147: 0x9140, + 0x6148: 0xB4C8, + 0x6149: 0x9141, + 0x614A: 0xE3BB, + 0x614B: 0x9142, + 0x614C: 0xBBC5, + 0x614D: 0x9143, + 0x614E: 0xC9F7, + 0x614F: 0x9144, + 0x6150: 0x9145, + 0x6151: 0xC9E5, + 0x6152: 0x9146, + 0x6153: 0x9147, + 0x6154: 0x9148, + 0x6155: 0xC4BD, + 0x6156: 0x9149, + 0x6157: 0x914A, + 0x6158: 0x914B, + 0x6159: 0x914C, + 0x615A: 0x914D, + 0x615B: 0x914E, + 0x615C: 0x914F, + 0x615D: 0xEDAB, + 0x615E: 0x9150, + 0x615F: 0x9151, + 0x6160: 0x9152, + 0x6161: 0x9153, + 0x6162: 0xC2FD, + 0x6163: 0x9154, + 0x6164: 0x9155, + 0x6165: 0x9156, + 0x6166: 0x9157, + 0x6167: 0xBBDB, + 0x6168: 0xBFAE, + 0x6169: 0x9158, + 0x616A: 0x9159, + 0x616B: 0x915A, + 0x616C: 0x915B, + 0x616D: 0x915C, + 0x616E: 0x915D, + 0x616F: 0x915E, + 0x6170: 0xCEBF, + 0x6171: 0x915F, + 0x6172: 0x9160, + 0x6173: 0x9161, + 0x6174: 0x9162, + 0x6175: 0xE3BC, + 0x6176: 0x9163, + 0x6177: 0xBFB6, + 0x6178: 0x9164, + 0x6179: 0x9165, + 0x617A: 0x9166, + 0x617B: 0x9167, + 0x617C: 0x9168, + 0x617D: 0x9169, + 0x617E: 0x916A, + 0x617F: 0x916B, + 0x6180: 0x916C, + 0x6181: 0x916D, + 0x6182: 0x916E, + 0x6183: 0x916F, + 0x6184: 0x9170, + 0x6185: 0x9171, + 0x6186: 0x9172, + 0x6187: 0x9173, + 0x6188: 0x9174, + 0x6189: 0x9175, + 0x618A: 0x9176, + 0x618B: 0xB1EF, + 0x618C: 0x9177, + 0x618D: 0x9178, + 0x618E: 0xD4F7, + 0x618F: 0x9179, + 0x6190: 0x917A, + 0x6191: 0x917B, + 0x6192: 0x917C, + 0x6193: 0x917D, + 0x6194: 0xE3BE, + 0x6195: 0x917E, + 0x6196: 0x9180, + 0x6197: 0x9181, + 0x6198: 0x9182, + 0x6199: 0x9183, + 0x619A: 0x9184, + 0x619B: 0x9185, + 0x619C: 0x9186, + 0x619D: 0xEDAD, + 0x619E: 0x9187, + 0x619F: 0x9188, + 0x61A0: 0x9189, + 0x61A1: 0x918A, + 0x61A2: 0x918B, + 0x61A3: 0x918C, + 0x61A4: 0x918D, + 0x61A5: 0x918E, + 0x61A6: 0x918F, + 0x61A7: 0xE3BF, + 0x61A8: 0xBAA9, + 0x61A9: 0xEDAC, + 0x61AA: 0x9190, + 0x61AB: 0x9191, + 0x61AC: 0xE3BD, + 0x61AD: 0x9192, + 0x61AE: 0x9193, + 0x61AF: 0x9194, + 0x61B0: 0x9195, + 0x61B1: 0x9196, + 0x61B2: 0x9197, + 0x61B3: 0x9198, + 0x61B4: 0x9199, + 0x61B5: 0x919A, + 0x61B6: 0x919B, + 0x61B7: 0xE3C0, + 0x61B8: 0x919C, + 0x61B9: 0x919D, + 0x61BA: 0x919E, + 0x61BB: 0x919F, + 0x61BC: 0x91A0, + 0x61BD: 0x91A1, + 0x61BE: 0xBAB6, + 0x61BF: 0x91A2, + 0x61C0: 0x91A3, + 0x61C1: 0x91A4, + 0x61C2: 0xB6AE, + 0x61C3: 0x91A5, + 0x61C4: 0x91A6, + 0x61C5: 0x91A7, + 0x61C6: 0x91A8, + 0x61C7: 0x91A9, + 0x61C8: 0xD0B8, + 0x61C9: 0x91AA, + 0x61CA: 0xB0C3, + 0x61CB: 0xEDAE, + 0x61CC: 0x91AB, + 0x61CD: 0x91AC, + 0x61CE: 0x91AD, + 0x61CF: 0x91AE, + 0x61D0: 0x91AF, + 0x61D1: 0xEDAF, + 0x61D2: 0xC0C1, + 0x61D3: 0x91B0, + 0x61D4: 0xE3C1, + 0x61D5: 0x91B1, + 0x61D6: 0x91B2, + 0x61D7: 0x91B3, + 0x61D8: 0x91B4, + 0x61D9: 0x91B5, + 0x61DA: 0x91B6, + 0x61DB: 0x91B7, + 0x61DC: 0x91B8, + 0x61DD: 0x91B9, + 0x61DE: 0x91BA, + 0x61DF: 0x91BB, + 0x61E0: 0x91BC, + 0x61E1: 0x91BD, + 0x61E2: 0x91BE, + 0x61E3: 0x91BF, + 0x61E4: 0x91C0, + 0x61E5: 0x91C1, + 0x61E6: 0xC5B3, + 0x61E7: 0x91C2, + 0x61E8: 0x91C3, + 0x61E9: 0x91C4, + 0x61EA: 0x91C5, + 0x61EB: 0x91C6, + 0x61EC: 0x91C7, + 0x61ED: 0x91C8, + 0x61EE: 0x91C9, + 0x61EF: 0x91CA, + 0x61F0: 0x91CB, + 0x61F1: 0x91CC, + 0x61F2: 0x91CD, + 0x61F3: 0x91CE, + 0x61F4: 0x91CF, + 0x61F5: 0xE3C2, + 0x61F6: 0x91D0, + 0x61F7: 0x91D1, + 0x61F8: 0x91D2, + 0x61F9: 0x91D3, + 0x61FA: 0x91D4, + 0x61FB: 0x91D5, + 0x61FC: 0x91D6, + 0x61FD: 0x91D7, + 0x61FE: 0x91D8, + 0x61FF: 0xDCB2, + 0x6200: 0x91D9, + 0x6201: 0x91DA, + 0x6202: 0x91DB, + 0x6203: 0x91DC, + 0x6204: 0x91DD, + 0x6205: 0x91DE, + 0x6206: 0xEDB0, + 0x6207: 0x91DF, + 0x6208: 0xB8EA, + 0x6209: 0x91E0, + 0x620A: 0xCEEC, + 0x620B: 0xEAA7, + 0x620C: 0xD0E7, + 0x620D: 0xCAF9, + 0x620E: 0xC8D6, + 0x620F: 0xCFB7, + 0x6210: 0xB3C9, + 0x6211: 0xCED2, + 0x6212: 0xBDE4, + 0x6213: 0x91E1, + 0x6214: 0x91E2, + 0x6215: 0xE3DE, + 0x6216: 0xBBF2, + 0x6217: 0xEAA8, + 0x6218: 0xD5BD, + 0x6219: 0x91E3, + 0x621A: 0xC6DD, + 0x621B: 0xEAA9, + 0x621C: 0x91E4, + 0x621D: 0x91E5, + 0x621E: 0x91E6, + 0x621F: 0xEAAA, + 0x6220: 0x91E7, + 0x6221: 0xEAAC, + 0x6222: 0xEAAB, + 0x6223: 0x91E8, + 0x6224: 0xEAAE, + 0x6225: 0xEAAD, + 0x6226: 0x91E9, + 0x6227: 0x91EA, + 0x6228: 0x91EB, + 0x6229: 0x91EC, + 0x622A: 0xBDD8, + 0x622B: 0x91ED, + 0x622C: 0xEAAF, + 0x622D: 0x91EE, + 0x622E: 0xC2BE, + 0x622F: 0x91EF, + 0x6230: 0x91F0, + 0x6231: 0x91F1, + 0x6232: 0x91F2, + 0x6233: 0xB4C1, + 0x6234: 0xB4F7, + 0x6235: 0x91F3, + 0x6236: 0x91F4, + 0x6237: 0xBBA7, + 0x6238: 0x91F5, + 0x6239: 0x91F6, + 0x623A: 0x91F7, + 0x623B: 0x91F8, + 0x623C: 0x91F9, + 0x623D: 0xECE6, + 0x623E: 0xECE5, + 0x623F: 0xB7BF, + 0x6240: 0xCBF9, + 0x6241: 0xB1E2, + 0x6242: 0x91FA, + 0x6243: 0xECE7, + 0x6244: 0x91FB, + 0x6245: 0x91FC, + 0x6246: 0x91FD, + 0x6247: 0xC9C8, + 0x6248: 0xECE8, + 0x6249: 0xECE9, + 0x624A: 0x91FE, + 0x624B: 0xCAD6, + 0x624C: 0xDED0, + 0x624D: 0xB2C5, + 0x624E: 0xD4FA, + 0x624F: 0x9240, + 0x6250: 0x9241, + 0x6251: 0xC6CB, + 0x6252: 0xB0C7, + 0x6253: 0xB4F2, + 0x6254: 0xC8D3, + 0x6255: 0x9242, + 0x6256: 0x9243, + 0x6257: 0x9244, + 0x6258: 0xCDD0, + 0x6259: 0x9245, + 0x625A: 0x9246, + 0x625B: 0xBFB8, + 0x625C: 0x9247, + 0x625D: 0x9248, + 0x625E: 0x9249, + 0x625F: 0x924A, + 0x6260: 0x924B, + 0x6261: 0x924C, + 0x6262: 0x924D, + 0x6263: 0xBFDB, + 0x6264: 0x924E, + 0x6265: 0x924F, + 0x6266: 0xC7A4, + 0x6267: 0xD6B4, + 0x6268: 0x9250, + 0x6269: 0xC0A9, + 0x626A: 0xDED1, + 0x626B: 0xC9A8, + 0x626C: 0xD1EF, + 0x626D: 0xC5A4, + 0x626E: 0xB0E7, + 0x626F: 0xB3B6, + 0x6270: 0xC8C5, + 0x6271: 0x9251, + 0x6272: 0x9252, + 0x6273: 0xB0E2, + 0x6274: 0x9253, + 0x6275: 0x9254, + 0x6276: 0xB7F6, + 0x6277: 0x9255, + 0x6278: 0x9256, + 0x6279: 0xC5FA, + 0x627A: 0x9257, + 0x627B: 0x9258, + 0x627C: 0xB6F3, + 0x627D: 0x9259, + 0x627E: 0xD5D2, + 0x627F: 0xB3D0, + 0x6280: 0xBCBC, + 0x6281: 0x925A, + 0x6282: 0x925B, + 0x6283: 0x925C, + 0x6284: 0xB3AD, + 0x6285: 0x925D, + 0x6286: 0x925E, + 0x6287: 0x925F, + 0x6288: 0x9260, + 0x6289: 0xBEF1, + 0x628A: 0xB0D1, + 0x628B: 0x9261, + 0x628C: 0x9262, + 0x628D: 0x9263, + 0x628E: 0x9264, + 0x628F: 0x9265, + 0x6290: 0x9266, + 0x6291: 0xD2D6, + 0x6292: 0xCAE3, + 0x6293: 0xD7A5, + 0x6294: 0x9267, + 0x6295: 0xCDB6, + 0x6296: 0xB6B6, + 0x6297: 0xBFB9, + 0x6298: 0xD5DB, + 0x6299: 0x9268, + 0x629A: 0xB8A7, + 0x629B: 0xC5D7, + 0x629C: 0x9269, + 0x629D: 0x926A, + 0x629E: 0x926B, + 0x629F: 0xDED2, + 0x62A0: 0xBFD9, + 0x62A1: 0xC2D5, + 0x62A2: 0xC7C0, + 0x62A3: 0x926C, + 0x62A4: 0xBBA4, + 0x62A5: 0xB1A8, + 0x62A6: 0x926D, + 0x62A7: 0x926E, + 0x62A8: 0xC5EA, + 0x62A9: 0x926F, + 0x62AA: 0x9270, + 0x62AB: 0xC5FB, + 0x62AC: 0xCCA7, + 0x62AD: 0x9271, + 0x62AE: 0x9272, + 0x62AF: 0x9273, + 0x62B0: 0x9274, + 0x62B1: 0xB1A7, + 0x62B2: 0x9275, + 0x62B3: 0x9276, + 0x62B4: 0x9277, + 0x62B5: 0xB5D6, + 0x62B6: 0x9278, + 0x62B7: 0x9279, + 0x62B8: 0x927A, + 0x62B9: 0xC4A8, + 0x62BA: 0x927B, + 0x62BB: 0xDED3, + 0x62BC: 0xD1BA, + 0x62BD: 0xB3E9, + 0x62BE: 0x927C, + 0x62BF: 0xC3F2, + 0x62C0: 0x927D, + 0x62C1: 0x927E, + 0x62C2: 0xB7F7, + 0x62C3: 0x9280, + 0x62C4: 0xD6F4, + 0x62C5: 0xB5A3, + 0x62C6: 0xB2F0, + 0x62C7: 0xC4B4, + 0x62C8: 0xC4E9, + 0x62C9: 0xC0AD, + 0x62CA: 0xDED4, + 0x62CB: 0x9281, + 0x62CC: 0xB0E8, + 0x62CD: 0xC5C4, + 0x62CE: 0xC1E0, + 0x62CF: 0x9282, + 0x62D0: 0xB9D5, + 0x62D1: 0x9283, + 0x62D2: 0xBEDC, + 0x62D3: 0xCDD8, + 0x62D4: 0xB0CE, + 0x62D5: 0x9284, + 0x62D6: 0xCDCF, + 0x62D7: 0xDED6, + 0x62D8: 0xBED0, + 0x62D9: 0xD7BE, + 0x62DA: 0xDED5, + 0x62DB: 0xD5D0, + 0x62DC: 0xB0DD, + 0x62DD: 0x9285, + 0x62DE: 0x9286, + 0x62DF: 0xC4E2, + 0x62E0: 0x9287, + 0x62E1: 0x9288, + 0x62E2: 0xC2A3, + 0x62E3: 0xBCF0, + 0x62E4: 0x9289, + 0x62E5: 0xD3B5, + 0x62E6: 0xC0B9, + 0x62E7: 0xC5A1, + 0x62E8: 0xB2A6, + 0x62E9: 0xD4F1, + 0x62EA: 0x928A, + 0x62EB: 0x928B, + 0x62EC: 0xC0A8, + 0x62ED: 0xCAC3, + 0x62EE: 0xDED7, + 0x62EF: 0xD5FC, + 0x62F0: 0x928C, + 0x62F1: 0xB9B0, + 0x62F2: 0x928D, + 0x62F3: 0xC8AD, + 0x62F4: 0xCBA9, + 0x62F5: 0x928E, + 0x62F6: 0xDED9, + 0x62F7: 0xBFBD, + 0x62F8: 0x928F, + 0x62F9: 0x9290, + 0x62FA: 0x9291, + 0x62FB: 0x9292, + 0x62FC: 0xC6B4, + 0x62FD: 0xD7A7, + 0x62FE: 0xCAB0, + 0x62FF: 0xC4C3, + 0x6300: 0x9293, + 0x6301: 0xB3D6, + 0x6302: 0xB9D2, + 0x6303: 0x9294, + 0x6304: 0x9295, + 0x6305: 0x9296, + 0x6306: 0x9297, + 0x6307: 0xD6B8, + 0x6308: 0xEAFC, + 0x6309: 0xB0B4, + 0x630A: 0x9298, + 0x630B: 0x9299, + 0x630C: 0x929A, + 0x630D: 0x929B, + 0x630E: 0xBFE6, + 0x630F: 0x929C, + 0x6310: 0x929D, + 0x6311: 0xCCF4, + 0x6312: 0x929E, + 0x6313: 0x929F, + 0x6314: 0x92A0, + 0x6315: 0x92A1, + 0x6316: 0xCDDA, + 0x6317: 0x92A2, + 0x6318: 0x92A3, + 0x6319: 0x92A4, + 0x631A: 0xD6BF, + 0x631B: 0xC2CE, + 0x631C: 0x92A5, + 0x631D: 0xCECE, + 0x631E: 0xCCA2, + 0x631F: 0xD0AE, + 0x6320: 0xC4D3, + 0x6321: 0xB5B2, + 0x6322: 0xDED8, + 0x6323: 0xD5F5, + 0x6324: 0xBCB7, + 0x6325: 0xBBD3, + 0x6326: 0x92A6, + 0x6327: 0x92A7, + 0x6328: 0xB0A4, + 0x6329: 0x92A8, + 0x632A: 0xC5B2, + 0x632B: 0xB4EC, + 0x632C: 0x92A9, + 0x632D: 0x92AA, + 0x632E: 0x92AB, + 0x632F: 0xD5F1, + 0x6330: 0x92AC, + 0x6331: 0x92AD, + 0x6332: 0xEAFD, + 0x6333: 0x92AE, + 0x6334: 0x92AF, + 0x6335: 0x92B0, + 0x6336: 0x92B1, + 0x6337: 0x92B2, + 0x6338: 0x92B3, + 0x6339: 0xDEDA, + 0x633A: 0xCDA6, + 0x633B: 0x92B4, + 0x633C: 0x92B5, + 0x633D: 0xCDEC, + 0x633E: 0x92B6, + 0x633F: 0x92B7, + 0x6340: 0x92B8, + 0x6341: 0x92B9, + 0x6342: 0xCEE6, + 0x6343: 0xDEDC, + 0x6344: 0x92BA, + 0x6345: 0xCDB1, + 0x6346: 0xC0A6, + 0x6347: 0x92BB, + 0x6348: 0x92BC, + 0x6349: 0xD7BD, + 0x634A: 0x92BD, + 0x634B: 0xDEDB, + 0x634C: 0xB0C6, + 0x634D: 0xBAB4, + 0x634E: 0xC9D3, + 0x634F: 0xC4F3, + 0x6350: 0xBEE8, + 0x6351: 0x92BE, + 0x6352: 0x92BF, + 0x6353: 0x92C0, + 0x6354: 0x92C1, + 0x6355: 0xB2B6, + 0x6356: 0x92C2, + 0x6357: 0x92C3, + 0x6358: 0x92C4, + 0x6359: 0x92C5, + 0x635A: 0x92C6, + 0x635B: 0x92C7, + 0x635C: 0x92C8, + 0x635D: 0x92C9, + 0x635E: 0xC0CC, + 0x635F: 0xCBF0, + 0x6360: 0x92CA, + 0x6361: 0xBCF1, + 0x6362: 0xBBBB, + 0x6363: 0xB5B7, + 0x6364: 0x92CB, + 0x6365: 0x92CC, + 0x6366: 0x92CD, + 0x6367: 0xC5F5, + 0x6368: 0x92CE, + 0x6369: 0xDEE6, + 0x636A: 0x92CF, + 0x636B: 0x92D0, + 0x636C: 0x92D1, + 0x636D: 0xDEE3, + 0x636E: 0xBEDD, + 0x636F: 0x92D2, + 0x6370: 0x92D3, + 0x6371: 0xDEDF, + 0x6372: 0x92D4, + 0x6373: 0x92D5, + 0x6374: 0x92D6, + 0x6375: 0x92D7, + 0x6376: 0xB4B7, + 0x6377: 0xBDDD, + 0x6378: 0x92D8, + 0x6379: 0x92D9, + 0x637A: 0xDEE0, + 0x637B: 0xC4ED, + 0x637C: 0x92DA, + 0x637D: 0x92DB, + 0x637E: 0x92DC, + 0x637F: 0x92DD, + 0x6380: 0xCFC6, + 0x6381: 0x92DE, + 0x6382: 0xB5E0, + 0x6383: 0x92DF, + 0x6384: 0x92E0, + 0x6385: 0x92E1, + 0x6386: 0x92E2, + 0x6387: 0xB6DE, + 0x6388: 0xCADA, + 0x6389: 0xB5F4, + 0x638A: 0xDEE5, + 0x638B: 0x92E3, + 0x638C: 0xD5C6, + 0x638D: 0x92E4, + 0x638E: 0xDEE1, + 0x638F: 0xCCCD, + 0x6390: 0xC6FE, + 0x6391: 0x92E5, + 0x6392: 0xC5C5, + 0x6393: 0x92E6, + 0x6394: 0x92E7, + 0x6395: 0x92E8, + 0x6396: 0xD2B4, + 0x6397: 0x92E9, + 0x6398: 0xBEF2, + 0x6399: 0x92EA, + 0x639A: 0x92EB, + 0x639B: 0x92EC, + 0x639C: 0x92ED, + 0x639D: 0x92EE, + 0x639E: 0x92EF, + 0x639F: 0x92F0, + 0x63A0: 0xC2D3, + 0x63A1: 0x92F1, + 0x63A2: 0xCCBD, + 0x63A3: 0xB3B8, + 0x63A4: 0x92F2, + 0x63A5: 0xBDD3, + 0x63A6: 0x92F3, + 0x63A7: 0xBFD8, + 0x63A8: 0xCDC6, + 0x63A9: 0xD1DA, + 0x63AA: 0xB4EB, + 0x63AB: 0x92F4, + 0x63AC: 0xDEE4, + 0x63AD: 0xDEDD, + 0x63AE: 0xDEE7, + 0x63AF: 0x92F5, + 0x63B0: 0xEAFE, + 0x63B1: 0x92F6, + 0x63B2: 0x92F7, + 0x63B3: 0xC2B0, + 0x63B4: 0xDEE2, + 0x63B5: 0x92F8, + 0x63B6: 0x92F9, + 0x63B7: 0xD6C0, + 0x63B8: 0xB5A7, + 0x63B9: 0x92FA, + 0x63BA: 0xB2F4, + 0x63BB: 0x92FB, + 0x63BC: 0xDEE8, + 0x63BD: 0x92FC, + 0x63BE: 0xDEF2, + 0x63BF: 0x92FD, + 0x63C0: 0x92FE, + 0x63C1: 0x9340, + 0x63C2: 0x9341, + 0x63C3: 0x9342, + 0x63C4: 0xDEED, + 0x63C5: 0x9343, + 0x63C6: 0xDEF1, + 0x63C7: 0x9344, + 0x63C8: 0x9345, + 0x63C9: 0xC8E0, + 0x63CA: 0x9346, + 0x63CB: 0x9347, + 0x63CC: 0x9348, + 0x63CD: 0xD7E1, + 0x63CE: 0xDEEF, + 0x63CF: 0xC3E8, + 0x63D0: 0xCCE1, + 0x63D1: 0x9349, + 0x63D2: 0xB2E5, + 0x63D3: 0x934A, + 0x63D4: 0x934B, + 0x63D5: 0x934C, + 0x63D6: 0xD2BE, + 0x63D7: 0x934D, + 0x63D8: 0x934E, + 0x63D9: 0x934F, + 0x63DA: 0x9350, + 0x63DB: 0x9351, + 0x63DC: 0x9352, + 0x63DD: 0x9353, + 0x63DE: 0xDEEE, + 0x63DF: 0x9354, + 0x63E0: 0xDEEB, + 0x63E1: 0xCED5, + 0x63E2: 0x9355, + 0x63E3: 0xB4A7, + 0x63E4: 0x9356, + 0x63E5: 0x9357, + 0x63E6: 0x9358, + 0x63E7: 0x9359, + 0x63E8: 0x935A, + 0x63E9: 0xBFAB, + 0x63EA: 0xBEBE, + 0x63EB: 0x935B, + 0x63EC: 0x935C, + 0x63ED: 0xBDD2, + 0x63EE: 0x935D, + 0x63EF: 0x935E, + 0x63F0: 0x935F, + 0x63F1: 0x9360, + 0x63F2: 0xDEE9, + 0x63F3: 0x9361, + 0x63F4: 0xD4AE, + 0x63F5: 0x9362, + 0x63F6: 0xDEDE, + 0x63F7: 0x9363, + 0x63F8: 0xDEEA, + 0x63F9: 0x9364, + 0x63FA: 0x9365, + 0x63FB: 0x9366, + 0x63FC: 0x9367, + 0x63FD: 0xC0BF, + 0x63FE: 0x9368, + 0x63FF: 0xDEEC, + 0x6400: 0xB2F3, + 0x6401: 0xB8E9, + 0x6402: 0xC2A7, + 0x6403: 0x9369, + 0x6404: 0x936A, + 0x6405: 0xBDC1, + 0x6406: 0x936B, + 0x6407: 0x936C, + 0x6408: 0x936D, + 0x6409: 0x936E, + 0x640A: 0x936F, + 0x640B: 0xDEF5, + 0x640C: 0xDEF8, + 0x640D: 0x9370, + 0x640E: 0x9371, + 0x640F: 0xB2AB, + 0x6410: 0xB4A4, + 0x6411: 0x9372, + 0x6412: 0x9373, + 0x6413: 0xB4EA, + 0x6414: 0xC9A6, + 0x6415: 0x9374, + 0x6416: 0x9375, + 0x6417: 0x9376, + 0x6418: 0x9377, + 0x6419: 0x9378, + 0x641A: 0x9379, + 0x641B: 0xDEF6, + 0x641C: 0xCBD1, + 0x641D: 0x937A, + 0x641E: 0xB8E3, + 0x641F: 0x937B, + 0x6420: 0xDEF7, + 0x6421: 0xDEFA, + 0x6422: 0x937C, + 0x6423: 0x937D, + 0x6424: 0x937E, + 0x6425: 0x9380, + 0x6426: 0xDEF9, + 0x6427: 0x9381, + 0x6428: 0x9382, + 0x6429: 0x9383, + 0x642A: 0xCCC2, + 0x642B: 0x9384, + 0x642C: 0xB0E1, + 0x642D: 0xB4EE, + 0x642E: 0x9385, + 0x642F: 0x9386, + 0x6430: 0x9387, + 0x6431: 0x9388, + 0x6432: 0x9389, + 0x6433: 0x938A, + 0x6434: 0xE5BA, + 0x6435: 0x938B, + 0x6436: 0x938C, + 0x6437: 0x938D, + 0x6438: 0x938E, + 0x6439: 0x938F, + 0x643A: 0xD0AF, + 0x643B: 0x9390, + 0x643C: 0x9391, + 0x643D: 0xB2EB, + 0x643E: 0x9392, + 0x643F: 0xEBA1, + 0x6440: 0x9393, + 0x6441: 0xDEF4, + 0x6442: 0x9394, + 0x6443: 0x9395, + 0x6444: 0xC9E3, + 0x6445: 0xDEF3, + 0x6446: 0xB0DA, + 0x6447: 0xD2A1, + 0x6448: 0xB1F7, + 0x6449: 0x9396, + 0x644A: 0xCCAF, + 0x644B: 0x9397, + 0x644C: 0x9398, + 0x644D: 0x9399, + 0x644E: 0x939A, + 0x644F: 0x939B, + 0x6450: 0x939C, + 0x6451: 0x939D, + 0x6452: 0xDEF0, + 0x6453: 0x939E, + 0x6454: 0xCBA4, + 0x6455: 0x939F, + 0x6456: 0x93A0, + 0x6457: 0x93A1, + 0x6458: 0xD5AA, + 0x6459: 0x93A2, + 0x645A: 0x93A3, + 0x645B: 0x93A4, + 0x645C: 0x93A5, + 0x645D: 0x93A6, + 0x645E: 0xDEFB, + 0x645F: 0x93A7, + 0x6460: 0x93A8, + 0x6461: 0x93A9, + 0x6462: 0x93AA, + 0x6463: 0x93AB, + 0x6464: 0x93AC, + 0x6465: 0x93AD, + 0x6466: 0x93AE, + 0x6467: 0xB4DD, + 0x6468: 0x93AF, + 0x6469: 0xC4A6, + 0x646A: 0x93B0, + 0x646B: 0x93B1, + 0x646C: 0x93B2, + 0x646D: 0xDEFD, + 0x646E: 0x93B3, + 0x646F: 0x93B4, + 0x6470: 0x93B5, + 0x6471: 0x93B6, + 0x6472: 0x93B7, + 0x6473: 0x93B8, + 0x6474: 0x93B9, + 0x6475: 0x93BA, + 0x6476: 0x93BB, + 0x6477: 0x93BC, + 0x6478: 0xC3FE, + 0x6479: 0xC4A1, + 0x647A: 0xDFA1, + 0x647B: 0x93BD, + 0x647C: 0x93BE, + 0x647D: 0x93BF, + 0x647E: 0x93C0, + 0x647F: 0x93C1, + 0x6480: 0x93C2, + 0x6481: 0x93C3, + 0x6482: 0xC1CC, + 0x6483: 0x93C4, + 0x6484: 0xDEFC, + 0x6485: 0xBEEF, + 0x6486: 0x93C5, + 0x6487: 0xC6B2, + 0x6488: 0x93C6, + 0x6489: 0x93C7, + 0x648A: 0x93C8, + 0x648B: 0x93C9, + 0x648C: 0x93CA, + 0x648D: 0x93CB, + 0x648E: 0x93CC, + 0x648F: 0x93CD, + 0x6490: 0x93CE, + 0x6491: 0xB3C5, + 0x6492: 0xC8F6, + 0x6493: 0x93CF, + 0x6494: 0x93D0, + 0x6495: 0xCBBA, + 0x6496: 0xDEFE, + 0x6497: 0x93D1, + 0x6498: 0x93D2, + 0x6499: 0xDFA4, + 0x649A: 0x93D3, + 0x649B: 0x93D4, + 0x649C: 0x93D5, + 0x649D: 0x93D6, + 0x649E: 0xD7B2, + 0x649F: 0x93D7, + 0x64A0: 0x93D8, + 0x64A1: 0x93D9, + 0x64A2: 0x93DA, + 0x64A3: 0x93DB, + 0x64A4: 0xB3B7, + 0x64A5: 0x93DC, + 0x64A6: 0x93DD, + 0x64A7: 0x93DE, + 0x64A8: 0x93DF, + 0x64A9: 0xC1C3, + 0x64AA: 0x93E0, + 0x64AB: 0x93E1, + 0x64AC: 0xC7CB, + 0x64AD: 0xB2A5, + 0x64AE: 0xB4E9, + 0x64AF: 0x93E2, + 0x64B0: 0xD7AB, + 0x64B1: 0x93E3, + 0x64B2: 0x93E4, + 0x64B3: 0x93E5, + 0x64B4: 0x93E6, + 0x64B5: 0xC4EC, + 0x64B6: 0x93E7, + 0x64B7: 0xDFA2, + 0x64B8: 0xDFA3, + 0x64B9: 0x93E8, + 0x64BA: 0xDFA5, + 0x64BB: 0x93E9, + 0x64BC: 0xBAB3, + 0x64BD: 0x93EA, + 0x64BE: 0x93EB, + 0x64BF: 0x93EC, + 0x64C0: 0xDFA6, + 0x64C1: 0x93ED, + 0x64C2: 0xC0DE, + 0x64C3: 0x93EE, + 0x64C4: 0x93EF, + 0x64C5: 0xC9C3, + 0x64C6: 0x93F0, + 0x64C7: 0x93F1, + 0x64C8: 0x93F2, + 0x64C9: 0x93F3, + 0x64CA: 0x93F4, + 0x64CB: 0x93F5, + 0x64CC: 0x93F6, + 0x64CD: 0xB2D9, + 0x64CE: 0xC7E6, + 0x64CF: 0x93F7, + 0x64D0: 0xDFA7, + 0x64D1: 0x93F8, + 0x64D2: 0xC7DC, + 0x64D3: 0x93F9, + 0x64D4: 0x93FA, + 0x64D5: 0x93FB, + 0x64D6: 0x93FC, + 0x64D7: 0xDFA8, + 0x64D8: 0xEBA2, + 0x64D9: 0x93FD, + 0x64DA: 0x93FE, + 0x64DB: 0x9440, + 0x64DC: 0x9441, + 0x64DD: 0x9442, + 0x64DE: 0xCBD3, + 0x64DF: 0x9443, + 0x64E0: 0x9444, + 0x64E1: 0x9445, + 0x64E2: 0xDFAA, + 0x64E3: 0x9446, + 0x64E4: 0xDFA9, + 0x64E5: 0x9447, + 0x64E6: 0xB2C1, + 0x64E7: 0x9448, + 0x64E8: 0x9449, + 0x64E9: 0x944A, + 0x64EA: 0x944B, + 0x64EB: 0x944C, + 0x64EC: 0x944D, + 0x64ED: 0x944E, + 0x64EE: 0x944F, + 0x64EF: 0x9450, + 0x64F0: 0x9451, + 0x64F1: 0x9452, + 0x64F2: 0x9453, + 0x64F3: 0x9454, + 0x64F4: 0x9455, + 0x64F5: 0x9456, + 0x64F6: 0x9457, + 0x64F7: 0x9458, + 0x64F8: 0x9459, + 0x64F9: 0x945A, + 0x64FA: 0x945B, + 0x64FB: 0x945C, + 0x64FC: 0x945D, + 0x64FD: 0x945E, + 0x64FE: 0x945F, + 0x64FF: 0x9460, + 0x6500: 0xC5CA, + 0x6501: 0x9461, + 0x6502: 0x9462, + 0x6503: 0x9463, + 0x6504: 0x9464, + 0x6505: 0x9465, + 0x6506: 0x9466, + 0x6507: 0x9467, + 0x6508: 0x9468, + 0x6509: 0xDFAB, + 0x650A: 0x9469, + 0x650B: 0x946A, + 0x650C: 0x946B, + 0x650D: 0x946C, + 0x650E: 0x946D, + 0x650F: 0x946E, + 0x6510: 0x946F, + 0x6511: 0x9470, + 0x6512: 0xD4DC, + 0x6513: 0x9471, + 0x6514: 0x9472, + 0x6515: 0x9473, + 0x6516: 0x9474, + 0x6517: 0x9475, + 0x6518: 0xC8C1, + 0x6519: 0x9476, + 0x651A: 0x9477, + 0x651B: 0x9478, + 0x651C: 0x9479, + 0x651D: 0x947A, + 0x651E: 0x947B, + 0x651F: 0x947C, + 0x6520: 0x947D, + 0x6521: 0x947E, + 0x6522: 0x9480, + 0x6523: 0x9481, + 0x6524: 0x9482, + 0x6525: 0xDFAC, + 0x6526: 0x9483, + 0x6527: 0x9484, + 0x6528: 0x9485, + 0x6529: 0x9486, + 0x652A: 0x9487, + 0x652B: 0xBEF0, + 0x652C: 0x9488, + 0x652D: 0x9489, + 0x652E: 0xDFAD, + 0x652F: 0xD6A7, + 0x6530: 0x948A, + 0x6531: 0x948B, + 0x6532: 0x948C, + 0x6533: 0x948D, + 0x6534: 0xEAB7, + 0x6535: 0xEBB6, + 0x6536: 0xCAD5, + 0x6537: 0x948E, + 0x6538: 0xD8FC, + 0x6539: 0xB8C4, + 0x653A: 0x948F, + 0x653B: 0xB9A5, + 0x653C: 0x9490, + 0x653D: 0x9491, + 0x653E: 0xB7C5, + 0x653F: 0xD5FE, + 0x6540: 0x9492, + 0x6541: 0x9493, + 0x6542: 0x9494, + 0x6543: 0x9495, + 0x6544: 0x9496, + 0x6545: 0xB9CA, + 0x6546: 0x9497, + 0x6547: 0x9498, + 0x6548: 0xD0A7, + 0x6549: 0xF4CD, + 0x654A: 0x9499, + 0x654B: 0x949A, + 0x654C: 0xB5D0, + 0x654D: 0x949B, + 0x654E: 0x949C, + 0x654F: 0xC3F4, + 0x6550: 0x949D, + 0x6551: 0xBEC8, + 0x6552: 0x949E, + 0x6553: 0x949F, + 0x6554: 0x94A0, + 0x6555: 0xEBB7, + 0x6556: 0xB0BD, + 0x6557: 0x94A1, + 0x6558: 0x94A2, + 0x6559: 0xBDCC, + 0x655A: 0x94A3, + 0x655B: 0xC1B2, + 0x655C: 0x94A4, + 0x655D: 0xB1D6, + 0x655E: 0xB3A8, + 0x655F: 0x94A5, + 0x6560: 0x94A6, + 0x6561: 0x94A7, + 0x6562: 0xB8D2, + 0x6563: 0xC9A2, + 0x6564: 0x94A8, + 0x6565: 0x94A9, + 0x6566: 0xB6D8, + 0x6567: 0x94AA, + 0x6568: 0x94AB, + 0x6569: 0x94AC, + 0x656A: 0x94AD, + 0x656B: 0xEBB8, + 0x656C: 0xBEB4, + 0x656D: 0x94AE, + 0x656E: 0x94AF, + 0x656F: 0x94B0, + 0x6570: 0xCAFD, + 0x6571: 0x94B1, + 0x6572: 0xC7C3, + 0x6573: 0x94B2, + 0x6574: 0xD5FB, + 0x6575: 0x94B3, + 0x6576: 0x94B4, + 0x6577: 0xB7F3, + 0x6578: 0x94B5, + 0x6579: 0x94B6, + 0x657A: 0x94B7, + 0x657B: 0x94B8, + 0x657C: 0x94B9, + 0x657D: 0x94BA, + 0x657E: 0x94BB, + 0x657F: 0x94BC, + 0x6580: 0x94BD, + 0x6581: 0x94BE, + 0x6582: 0x94BF, + 0x6583: 0x94C0, + 0x6584: 0x94C1, + 0x6585: 0x94C2, + 0x6586: 0x94C3, + 0x6587: 0xCEC4, + 0x6588: 0x94C4, + 0x6589: 0x94C5, + 0x658A: 0x94C6, + 0x658B: 0xD5AB, + 0x658C: 0xB1F3, + 0x658D: 0x94C7, + 0x658E: 0x94C8, + 0x658F: 0x94C9, + 0x6590: 0xECB3, + 0x6591: 0xB0DF, + 0x6592: 0x94CA, + 0x6593: 0xECB5, + 0x6594: 0x94CB, + 0x6595: 0x94CC, + 0x6596: 0x94CD, + 0x6597: 0xB6B7, + 0x6598: 0x94CE, + 0x6599: 0xC1CF, + 0x659A: 0x94CF, + 0x659B: 0xF5FA, + 0x659C: 0xD0B1, + 0x659D: 0x94D0, + 0x659E: 0x94D1, + 0x659F: 0xD5E5, + 0x65A0: 0x94D2, + 0x65A1: 0xCED3, + 0x65A2: 0x94D3, + 0x65A3: 0x94D4, + 0x65A4: 0xBDEF, + 0x65A5: 0xB3E2, + 0x65A6: 0x94D5, + 0x65A7: 0xB8AB, + 0x65A8: 0x94D6, + 0x65A9: 0xD5B6, + 0x65AA: 0x94D7, + 0x65AB: 0xEDBD, + 0x65AC: 0x94D8, + 0x65AD: 0xB6CF, + 0x65AE: 0x94D9, + 0x65AF: 0xCBB9, + 0x65B0: 0xD0C2, + 0x65B1: 0x94DA, + 0x65B2: 0x94DB, + 0x65B3: 0x94DC, + 0x65B4: 0x94DD, + 0x65B5: 0x94DE, + 0x65B6: 0x94DF, + 0x65B7: 0x94E0, + 0x65B8: 0x94E1, + 0x65B9: 0xB7BD, + 0x65BA: 0x94E2, + 0x65BB: 0x94E3, + 0x65BC: 0xECB6, + 0x65BD: 0xCAA9, + 0x65BE: 0x94E4, + 0x65BF: 0x94E5, + 0x65C0: 0x94E6, + 0x65C1: 0xC5D4, + 0x65C2: 0x94E7, + 0x65C3: 0xECB9, + 0x65C4: 0xECB8, + 0x65C5: 0xC2C3, + 0x65C6: 0xECB7, + 0x65C7: 0x94E8, + 0x65C8: 0x94E9, + 0x65C9: 0x94EA, + 0x65CA: 0x94EB, + 0x65CB: 0xD0FD, + 0x65CC: 0xECBA, + 0x65CD: 0x94EC, + 0x65CE: 0xECBB, + 0x65CF: 0xD7E5, + 0x65D0: 0x94ED, + 0x65D1: 0x94EE, + 0x65D2: 0xECBC, + 0x65D3: 0x94EF, + 0x65D4: 0x94F0, + 0x65D5: 0x94F1, + 0x65D6: 0xECBD, + 0x65D7: 0xC6EC, + 0x65D8: 0x94F2, + 0x65D9: 0x94F3, + 0x65DA: 0x94F4, + 0x65DB: 0x94F5, + 0x65DC: 0x94F6, + 0x65DD: 0x94F7, + 0x65DE: 0x94F8, + 0x65DF: 0x94F9, + 0x65E0: 0xCEDE, + 0x65E1: 0x94FA, + 0x65E2: 0xBCC8, + 0x65E3: 0x94FB, + 0x65E4: 0x94FC, + 0x65E5: 0xC8D5, + 0x65E6: 0xB5A9, + 0x65E7: 0xBEC9, + 0x65E8: 0xD6BC, + 0x65E9: 0xD4E7, + 0x65EA: 0x94FD, + 0x65EB: 0x94FE, + 0x65EC: 0xD1AE, + 0x65ED: 0xD0F1, + 0x65EE: 0xEAB8, + 0x65EF: 0xEAB9, + 0x65F0: 0xEABA, + 0x65F1: 0xBAB5, + 0x65F2: 0x9540, + 0x65F3: 0x9541, + 0x65F4: 0x9542, + 0x65F5: 0x9543, + 0x65F6: 0xCAB1, + 0x65F7: 0xBFF5, + 0x65F8: 0x9544, + 0x65F9: 0x9545, + 0x65FA: 0xCDFA, + 0x65FB: 0x9546, + 0x65FC: 0x9547, + 0x65FD: 0x9548, + 0x65FE: 0x9549, + 0x65FF: 0x954A, + 0x6600: 0xEAC0, + 0x6601: 0x954B, + 0x6602: 0xB0BA, + 0x6603: 0xEABE, + 0x6604: 0x954C, + 0x6605: 0x954D, + 0x6606: 0xC0A5, + 0x6607: 0x954E, + 0x6608: 0x954F, + 0x6609: 0x9550, + 0x660A: 0xEABB, + 0x660B: 0x9551, + 0x660C: 0xB2FD, + 0x660D: 0x9552, + 0x660E: 0xC3F7, + 0x660F: 0xBBE8, + 0x6610: 0x9553, + 0x6611: 0x9554, + 0x6612: 0x9555, + 0x6613: 0xD2D7, + 0x6614: 0xCEF4, + 0x6615: 0xEABF, + 0x6616: 0x9556, + 0x6617: 0x9557, + 0x6618: 0x9558, + 0x6619: 0xEABC, + 0x661A: 0x9559, + 0x661B: 0x955A, + 0x661C: 0x955B, + 0x661D: 0xEAC3, + 0x661E: 0x955C, + 0x661F: 0xD0C7, + 0x6620: 0xD3B3, + 0x6621: 0x955D, + 0x6622: 0x955E, + 0x6623: 0x955F, + 0x6624: 0x9560, + 0x6625: 0xB4BA, + 0x6626: 0x9561, + 0x6627: 0xC3C1, + 0x6628: 0xD7F2, + 0x6629: 0x9562, + 0x662A: 0x9563, + 0x662B: 0x9564, + 0x662C: 0x9565, + 0x662D: 0xD5D1, + 0x662E: 0x9566, + 0x662F: 0xCAC7, + 0x6630: 0x9567, + 0x6631: 0xEAC5, + 0x6632: 0x9568, + 0x6633: 0x9569, + 0x6634: 0xEAC4, + 0x6635: 0xEAC7, + 0x6636: 0xEAC6, + 0x6637: 0x956A, + 0x6638: 0x956B, + 0x6639: 0x956C, + 0x663A: 0x956D, + 0x663B: 0x956E, + 0x663C: 0xD6E7, + 0x663D: 0x956F, + 0x663E: 0xCFD4, + 0x663F: 0x9570, + 0x6640: 0x9571, + 0x6641: 0xEACB, + 0x6642: 0x9572, + 0x6643: 0xBBCE, + 0x6644: 0x9573, + 0x6645: 0x9574, + 0x6646: 0x9575, + 0x6647: 0x9576, + 0x6648: 0x9577, + 0x6649: 0x9578, + 0x664A: 0x9579, + 0x664B: 0xBDFA, + 0x664C: 0xC9CE, + 0x664D: 0x957A, + 0x664E: 0x957B, + 0x664F: 0xEACC, + 0x6650: 0x957C, + 0x6651: 0x957D, + 0x6652: 0xC9B9, + 0x6653: 0xCFFE, + 0x6654: 0xEACA, + 0x6655: 0xD4CE, + 0x6656: 0xEACD, + 0x6657: 0xEACF, + 0x6658: 0x957E, + 0x6659: 0x9580, + 0x665A: 0xCDED, + 0x665B: 0x9581, + 0x665C: 0x9582, + 0x665D: 0x9583, + 0x665E: 0x9584, + 0x665F: 0xEAC9, + 0x6660: 0x9585, + 0x6661: 0xEACE, + 0x6662: 0x9586, + 0x6663: 0x9587, + 0x6664: 0xCEEE, + 0x6665: 0x9588, + 0x6666: 0xBBDE, + 0x6667: 0x9589, + 0x6668: 0xB3BF, + 0x6669: 0x958A, + 0x666A: 0x958B, + 0x666B: 0x958C, + 0x666C: 0x958D, + 0x666D: 0x958E, + 0x666E: 0xC6D5, + 0x666F: 0xBEB0, + 0x6670: 0xCEFA, + 0x6671: 0x958F, + 0x6672: 0x9590, + 0x6673: 0x9591, + 0x6674: 0xC7E7, + 0x6675: 0x9592, + 0x6676: 0xBEA7, + 0x6677: 0xEAD0, + 0x6678: 0x9593, + 0x6679: 0x9594, + 0x667A: 0xD6C7, + 0x667B: 0x9595, + 0x667C: 0x9596, + 0x667D: 0x9597, + 0x667E: 0xC1C0, + 0x667F: 0x9598, + 0x6680: 0x9599, + 0x6681: 0x959A, + 0x6682: 0xD4DD, + 0x6683: 0x959B, + 0x6684: 0xEAD1, + 0x6685: 0x959C, + 0x6686: 0x959D, + 0x6687: 0xCFBE, + 0x6688: 0x959E, + 0x6689: 0x959F, + 0x668A: 0x95A0, + 0x668B: 0x95A1, + 0x668C: 0xEAD2, + 0x668D: 0x95A2, + 0x668E: 0x95A3, + 0x668F: 0x95A4, + 0x6690: 0x95A5, + 0x6691: 0xCAEE, + 0x6692: 0x95A6, + 0x6693: 0x95A7, + 0x6694: 0x95A8, + 0x6695: 0x95A9, + 0x6696: 0xC5AF, + 0x6697: 0xB0B5, + 0x6698: 0x95AA, + 0x6699: 0x95AB, + 0x669A: 0x95AC, + 0x669B: 0x95AD, + 0x669C: 0x95AE, + 0x669D: 0xEAD4, + 0x669E: 0x95AF, + 0x669F: 0x95B0, + 0x66A0: 0x95B1, + 0x66A1: 0x95B2, + 0x66A2: 0x95B3, + 0x66A3: 0x95B4, + 0x66A4: 0x95B5, + 0x66A5: 0x95B6, + 0x66A6: 0x95B7, + 0x66A7: 0xEAD3, + 0x66A8: 0xF4DF, + 0x66A9: 0x95B8, + 0x66AA: 0x95B9, + 0x66AB: 0x95BA, + 0x66AC: 0x95BB, + 0x66AD: 0x95BC, + 0x66AE: 0xC4BA, + 0x66AF: 0x95BD, + 0x66B0: 0x95BE, + 0x66B1: 0x95BF, + 0x66B2: 0x95C0, + 0x66B3: 0x95C1, + 0x66B4: 0xB1A9, + 0x66B5: 0x95C2, + 0x66B6: 0x95C3, + 0x66B7: 0x95C4, + 0x66B8: 0x95C5, + 0x66B9: 0xE5DF, + 0x66BA: 0x95C6, + 0x66BB: 0x95C7, + 0x66BC: 0x95C8, + 0x66BD: 0x95C9, + 0x66BE: 0xEAD5, + 0x66BF: 0x95CA, + 0x66C0: 0x95CB, + 0x66C1: 0x95CC, + 0x66C2: 0x95CD, + 0x66C3: 0x95CE, + 0x66C4: 0x95CF, + 0x66C5: 0x95D0, + 0x66C6: 0x95D1, + 0x66C7: 0x95D2, + 0x66C8: 0x95D3, + 0x66C9: 0x95D4, + 0x66CA: 0x95D5, + 0x66CB: 0x95D6, + 0x66CC: 0x95D7, + 0x66CD: 0x95D8, + 0x66CE: 0x95D9, + 0x66CF: 0x95DA, + 0x66D0: 0x95DB, + 0x66D1: 0x95DC, + 0x66D2: 0x95DD, + 0x66D3: 0x95DE, + 0x66D4: 0x95DF, + 0x66D5: 0x95E0, + 0x66D6: 0x95E1, + 0x66D7: 0x95E2, + 0x66D8: 0x95E3, + 0x66D9: 0xCAEF, + 0x66DA: 0x95E4, + 0x66DB: 0xEAD6, + 0x66DC: 0xEAD7, + 0x66DD: 0xC6D8, + 0x66DE: 0x95E5, + 0x66DF: 0x95E6, + 0x66E0: 0x95E7, + 0x66E1: 0x95E8, + 0x66E2: 0x95E9, + 0x66E3: 0x95EA, + 0x66E4: 0x95EB, + 0x66E5: 0x95EC, + 0x66E6: 0xEAD8, + 0x66E7: 0x95ED, + 0x66E8: 0x95EE, + 0x66E9: 0xEAD9, + 0x66EA: 0x95EF, + 0x66EB: 0x95F0, + 0x66EC: 0x95F1, + 0x66ED: 0x95F2, + 0x66EE: 0x95F3, + 0x66EF: 0x95F4, + 0x66F0: 0xD4BB, + 0x66F1: 0x95F5, + 0x66F2: 0xC7FA, + 0x66F3: 0xD2B7, + 0x66F4: 0xB8FC, + 0x66F5: 0x95F6, + 0x66F6: 0x95F7, + 0x66F7: 0xEAC2, + 0x66F8: 0x95F8, + 0x66F9: 0xB2DC, + 0x66FA: 0x95F9, + 0x66FB: 0x95FA, + 0x66FC: 0xC2FC, + 0x66FD: 0x95FB, + 0x66FE: 0xD4F8, + 0x66FF: 0xCCE6, + 0x6700: 0xD7EE, + 0x6701: 0x95FC, + 0x6702: 0x95FD, + 0x6703: 0x95FE, + 0x6704: 0x9640, + 0x6705: 0x9641, + 0x6706: 0x9642, + 0x6707: 0x9643, + 0x6708: 0xD4C2, + 0x6709: 0xD3D0, + 0x670A: 0xEBC3, + 0x670B: 0xC5F3, + 0x670C: 0x9644, + 0x670D: 0xB7FE, + 0x670E: 0x9645, + 0x670F: 0x9646, + 0x6710: 0xEBD4, + 0x6711: 0x9647, + 0x6712: 0x9648, + 0x6713: 0x9649, + 0x6714: 0xCBB7, + 0x6715: 0xEBDE, + 0x6716: 0x964A, + 0x6717: 0xC0CA, + 0x6718: 0x964B, + 0x6719: 0x964C, + 0x671A: 0x964D, + 0x671B: 0xCDFB, + 0x671C: 0x964E, + 0x671D: 0xB3AF, + 0x671E: 0x964F, + 0x671F: 0xC6DA, + 0x6720: 0x9650, + 0x6721: 0x9651, + 0x6722: 0x9652, + 0x6723: 0x9653, + 0x6724: 0x9654, + 0x6725: 0x9655, + 0x6726: 0xEBFC, + 0x6727: 0x9656, + 0x6728: 0xC4BE, + 0x6729: 0x9657, + 0x672A: 0xCEB4, + 0x672B: 0xC4A9, + 0x672C: 0xB1BE, + 0x672D: 0xD4FD, + 0x672E: 0x9658, + 0x672F: 0xCAF5, + 0x6730: 0x9659, + 0x6731: 0xD6EC, + 0x6732: 0x965A, + 0x6733: 0x965B, + 0x6734: 0xC6D3, + 0x6735: 0xB6E4, + 0x6736: 0x965C, + 0x6737: 0x965D, + 0x6738: 0x965E, + 0x6739: 0x965F, + 0x673A: 0xBBFA, + 0x673B: 0x9660, + 0x673C: 0x9661, + 0x673D: 0xD0E0, + 0x673E: 0x9662, + 0x673F: 0x9663, + 0x6740: 0xC9B1, + 0x6741: 0x9664, + 0x6742: 0xD4D3, + 0x6743: 0xC8A8, + 0x6744: 0x9665, + 0x6745: 0x9666, + 0x6746: 0xB8CB, + 0x6747: 0x9667, + 0x6748: 0xE8BE, + 0x6749: 0xC9BC, + 0x674A: 0x9668, + 0x674B: 0x9669, + 0x674C: 0xE8BB, + 0x674D: 0x966A, + 0x674E: 0xC0EE, + 0x674F: 0xD0D3, + 0x6750: 0xB2C4, + 0x6751: 0xB4E5, + 0x6752: 0x966B, + 0x6753: 0xE8BC, + 0x6754: 0x966C, + 0x6755: 0x966D, + 0x6756: 0xD5C8, + 0x6757: 0x966E, + 0x6758: 0x966F, + 0x6759: 0x9670, + 0x675A: 0x9671, + 0x675B: 0x9672, + 0x675C: 0xB6C5, + 0x675D: 0x9673, + 0x675E: 0xE8BD, + 0x675F: 0xCAF8, + 0x6760: 0xB8DC, + 0x6761: 0xCCF5, + 0x6762: 0x9674, + 0x6763: 0x9675, + 0x6764: 0x9676, + 0x6765: 0xC0B4, + 0x6766: 0x9677, + 0x6767: 0x9678, + 0x6768: 0xD1EE, + 0x6769: 0xE8BF, + 0x676A: 0xE8C2, + 0x676B: 0x9679, + 0x676C: 0x967A, + 0x676D: 0xBABC, + 0x676E: 0x967B, + 0x676F: 0xB1AD, + 0x6770: 0xBDDC, + 0x6771: 0x967C, + 0x6772: 0xEABD, + 0x6773: 0xE8C3, + 0x6774: 0x967D, + 0x6775: 0xE8C6, + 0x6776: 0x967E, + 0x6777: 0xE8CB, + 0x6778: 0x9680, + 0x6779: 0x9681, + 0x677A: 0x9682, + 0x677B: 0x9683, + 0x677C: 0xE8CC, + 0x677D: 0x9684, + 0x677E: 0xCBC9, + 0x677F: 0xB0E5, + 0x6780: 0x9685, + 0x6781: 0xBCAB, + 0x6782: 0x9686, + 0x6783: 0x9687, + 0x6784: 0xB9B9, + 0x6785: 0x9688, + 0x6786: 0x9689, + 0x6787: 0xE8C1, + 0x6788: 0x968A, + 0x6789: 0xCDF7, + 0x678A: 0x968B, + 0x678B: 0xE8CA, + 0x678C: 0x968C, + 0x678D: 0x968D, + 0x678E: 0x968E, + 0x678F: 0x968F, + 0x6790: 0xCEF6, + 0x6791: 0x9690, + 0x6792: 0x9691, + 0x6793: 0x9692, + 0x6794: 0x9693, + 0x6795: 0xD5ED, + 0x6796: 0x9694, + 0x6797: 0xC1D6, + 0x6798: 0xE8C4, + 0x6799: 0x9695, + 0x679A: 0xC3B6, + 0x679B: 0x9696, + 0x679C: 0xB9FB, + 0x679D: 0xD6A6, + 0x679E: 0xE8C8, + 0x679F: 0x9697, + 0x67A0: 0x9698, + 0x67A1: 0x9699, + 0x67A2: 0xCAE0, + 0x67A3: 0xD4E6, + 0x67A4: 0x969A, + 0x67A5: 0xE8C0, + 0x67A6: 0x969B, + 0x67A7: 0xE8C5, + 0x67A8: 0xE8C7, + 0x67A9: 0x969C, + 0x67AA: 0xC7B9, + 0x67AB: 0xB7E3, + 0x67AC: 0x969D, + 0x67AD: 0xE8C9, + 0x67AE: 0x969E, + 0x67AF: 0xBFDD, + 0x67B0: 0xE8D2, + 0x67B1: 0x969F, + 0x67B2: 0x96A0, + 0x67B3: 0xE8D7, + 0x67B4: 0x96A1, + 0x67B5: 0xE8D5, + 0x67B6: 0xBCDC, + 0x67B7: 0xBCCF, + 0x67B8: 0xE8DB, + 0x67B9: 0x96A2, + 0x67BA: 0x96A3, + 0x67BB: 0x96A4, + 0x67BC: 0x96A5, + 0x67BD: 0x96A6, + 0x67BE: 0x96A7, + 0x67BF: 0x96A8, + 0x67C0: 0x96A9, + 0x67C1: 0xE8DE, + 0x67C2: 0x96AA, + 0x67C3: 0xE8DA, + 0x67C4: 0xB1FA, + 0x67C5: 0x96AB, + 0x67C6: 0x96AC, + 0x67C7: 0x96AD, + 0x67C8: 0x96AE, + 0x67C9: 0x96AF, + 0x67CA: 0x96B0, + 0x67CB: 0x96B1, + 0x67CC: 0x96B2, + 0x67CD: 0x96B3, + 0x67CE: 0x96B4, + 0x67CF: 0xB0D8, + 0x67D0: 0xC4B3, + 0x67D1: 0xB8CC, + 0x67D2: 0xC6E2, + 0x67D3: 0xC8BE, + 0x67D4: 0xC8E1, + 0x67D5: 0x96B5, + 0x67D6: 0x96B6, + 0x67D7: 0x96B7, + 0x67D8: 0xE8CF, + 0x67D9: 0xE8D4, + 0x67DA: 0xE8D6, + 0x67DB: 0x96B8, + 0x67DC: 0xB9F1, + 0x67DD: 0xE8D8, + 0x67DE: 0xD7F5, + 0x67DF: 0x96B9, + 0x67E0: 0xC4FB, + 0x67E1: 0x96BA, + 0x67E2: 0xE8DC, + 0x67E3: 0x96BB, + 0x67E4: 0x96BC, + 0x67E5: 0xB2E9, + 0x67E6: 0x96BD, + 0x67E7: 0x96BE, + 0x67E8: 0x96BF, + 0x67E9: 0xE8D1, + 0x67EA: 0x96C0, + 0x67EB: 0x96C1, + 0x67EC: 0xBCED, + 0x67ED: 0x96C2, + 0x67EE: 0x96C3, + 0x67EF: 0xBFC2, + 0x67F0: 0xE8CD, + 0x67F1: 0xD6F9, + 0x67F2: 0x96C4, + 0x67F3: 0xC1F8, + 0x67F4: 0xB2F1, + 0x67F5: 0x96C5, + 0x67F6: 0x96C6, + 0x67F7: 0x96C7, + 0x67F8: 0x96C8, + 0x67F9: 0x96C9, + 0x67FA: 0x96CA, + 0x67FB: 0x96CB, + 0x67FC: 0x96CC, + 0x67FD: 0xE8DF, + 0x67FE: 0x96CD, + 0x67FF: 0xCAC1, + 0x6800: 0xE8D9, + 0x6801: 0x96CE, + 0x6802: 0x96CF, + 0x6803: 0x96D0, + 0x6804: 0x96D1, + 0x6805: 0xD5A4, + 0x6806: 0x96D2, + 0x6807: 0xB1EA, + 0x6808: 0xD5BB, + 0x6809: 0xE8CE, + 0x680A: 0xE8D0, + 0x680B: 0xB6B0, + 0x680C: 0xE8D3, + 0x680D: 0x96D3, + 0x680E: 0xE8DD, + 0x680F: 0xC0B8, + 0x6810: 0x96D4, + 0x6811: 0xCAF7, + 0x6812: 0x96D5, + 0x6813: 0xCBA8, + 0x6814: 0x96D6, + 0x6815: 0x96D7, + 0x6816: 0xC6DC, + 0x6817: 0xC0F5, + 0x6818: 0x96D8, + 0x6819: 0x96D9, + 0x681A: 0x96DA, + 0x681B: 0x96DB, + 0x681C: 0x96DC, + 0x681D: 0xE8E9, + 0x681E: 0x96DD, + 0x681F: 0x96DE, + 0x6820: 0x96DF, + 0x6821: 0xD0A3, + 0x6822: 0x96E0, + 0x6823: 0x96E1, + 0x6824: 0x96E2, + 0x6825: 0x96E3, + 0x6826: 0x96E4, + 0x6827: 0x96E5, + 0x6828: 0x96E6, + 0x6829: 0xE8F2, + 0x682A: 0xD6EA, + 0x682B: 0x96E7, + 0x682C: 0x96E8, + 0x682D: 0x96E9, + 0x682E: 0x96EA, + 0x682F: 0x96EB, + 0x6830: 0x96EC, + 0x6831: 0x96ED, + 0x6832: 0xE8E0, + 0x6833: 0xE8E1, + 0x6834: 0x96EE, + 0x6835: 0x96EF, + 0x6836: 0x96F0, + 0x6837: 0xD1F9, + 0x6838: 0xBACB, + 0x6839: 0xB8F9, + 0x683A: 0x96F1, + 0x683B: 0x96F2, + 0x683C: 0xB8F1, + 0x683D: 0xD4D4, + 0x683E: 0xE8EF, + 0x683F: 0x96F3, + 0x6840: 0xE8EE, + 0x6841: 0xE8EC, + 0x6842: 0xB9F0, + 0x6843: 0xCCD2, + 0x6844: 0xE8E6, + 0x6845: 0xCEA6, + 0x6846: 0xBFF2, + 0x6847: 0x96F4, + 0x6848: 0xB0B8, + 0x6849: 0xE8F1, + 0x684A: 0xE8F0, + 0x684B: 0x96F5, + 0x684C: 0xD7C0, + 0x684D: 0x96F6, + 0x684E: 0xE8E4, + 0x684F: 0x96F7, + 0x6850: 0xCDA9, + 0x6851: 0xC9A3, + 0x6852: 0x96F8, + 0x6853: 0xBBB8, + 0x6854: 0xBDDB, + 0x6855: 0xE8EA, + 0x6856: 0x96F9, + 0x6857: 0x96FA, + 0x6858: 0x96FB, + 0x6859: 0x96FC, + 0x685A: 0x96FD, + 0x685B: 0x96FE, + 0x685C: 0x9740, + 0x685D: 0x9741, + 0x685E: 0x9742, + 0x685F: 0x9743, + 0x6860: 0xE8E2, + 0x6861: 0xE8E3, + 0x6862: 0xE8E5, + 0x6863: 0xB5B5, + 0x6864: 0xE8E7, + 0x6865: 0xC7C5, + 0x6866: 0xE8EB, + 0x6867: 0xE8ED, + 0x6868: 0xBDB0, + 0x6869: 0xD7AE, + 0x686A: 0x9744, + 0x686B: 0xE8F8, + 0x686C: 0x9745, + 0x686D: 0x9746, + 0x686E: 0x9747, + 0x686F: 0x9748, + 0x6870: 0x9749, + 0x6871: 0x974A, + 0x6872: 0x974B, + 0x6873: 0x974C, + 0x6874: 0xE8F5, + 0x6875: 0x974D, + 0x6876: 0xCDB0, + 0x6877: 0xE8F6, + 0x6878: 0x974E, + 0x6879: 0x974F, + 0x687A: 0x9750, + 0x687B: 0x9751, + 0x687C: 0x9752, + 0x687D: 0x9753, + 0x687E: 0x9754, + 0x687F: 0x9755, + 0x6880: 0x9756, + 0x6881: 0xC1BA, + 0x6882: 0x9757, + 0x6883: 0xE8E8, + 0x6884: 0x9758, + 0x6885: 0xC3B7, + 0x6886: 0xB0F0, + 0x6887: 0x9759, + 0x6888: 0x975A, + 0x6889: 0x975B, + 0x688A: 0x975C, + 0x688B: 0x975D, + 0x688C: 0x975E, + 0x688D: 0x975F, + 0x688E: 0x9760, + 0x688F: 0xE8F4, + 0x6890: 0x9761, + 0x6891: 0x9762, + 0x6892: 0x9763, + 0x6893: 0xE8F7, + 0x6894: 0x9764, + 0x6895: 0x9765, + 0x6896: 0x9766, + 0x6897: 0xB9A3, + 0x6898: 0x9767, + 0x6899: 0x9768, + 0x689A: 0x9769, + 0x689B: 0x976A, + 0x689C: 0x976B, + 0x689D: 0x976C, + 0x689E: 0x976D, + 0x689F: 0x976E, + 0x68A0: 0x976F, + 0x68A1: 0x9770, + 0x68A2: 0xC9D2, + 0x68A3: 0x9771, + 0x68A4: 0x9772, + 0x68A5: 0x9773, + 0x68A6: 0xC3CE, + 0x68A7: 0xCEE0, + 0x68A8: 0xC0E6, + 0x68A9: 0x9774, + 0x68AA: 0x9775, + 0x68AB: 0x9776, + 0x68AC: 0x9777, + 0x68AD: 0xCBF3, + 0x68AE: 0x9778, + 0x68AF: 0xCCDD, + 0x68B0: 0xD0B5, + 0x68B1: 0x9779, + 0x68B2: 0x977A, + 0x68B3: 0xCAE1, + 0x68B4: 0x977B, + 0x68B5: 0xE8F3, + 0x68B6: 0x977C, + 0x68B7: 0x977D, + 0x68B8: 0x977E, + 0x68B9: 0x9780, + 0x68BA: 0x9781, + 0x68BB: 0x9782, + 0x68BC: 0x9783, + 0x68BD: 0x9784, + 0x68BE: 0x9785, + 0x68BF: 0x9786, + 0x68C0: 0xBCEC, + 0x68C1: 0x9787, + 0x68C2: 0xE8F9, + 0x68C3: 0x9788, + 0x68C4: 0x9789, + 0x68C5: 0x978A, + 0x68C6: 0x978B, + 0x68C7: 0x978C, + 0x68C8: 0x978D, + 0x68C9: 0xC3DE, + 0x68CA: 0x978E, + 0x68CB: 0xC6E5, + 0x68CC: 0x978F, + 0x68CD: 0xB9F7, + 0x68CE: 0x9790, + 0x68CF: 0x9791, + 0x68D0: 0x9792, + 0x68D1: 0x9793, + 0x68D2: 0xB0F4, + 0x68D3: 0x9794, + 0x68D4: 0x9795, + 0x68D5: 0xD7D8, + 0x68D6: 0x9796, + 0x68D7: 0x9797, + 0x68D8: 0xBCAC, + 0x68D9: 0x9798, + 0x68DA: 0xC5EF, + 0x68DB: 0x9799, + 0x68DC: 0x979A, + 0x68DD: 0x979B, + 0x68DE: 0x979C, + 0x68DF: 0x979D, + 0x68E0: 0xCCC4, + 0x68E1: 0x979E, + 0x68E2: 0x979F, + 0x68E3: 0xE9A6, + 0x68E4: 0x97A0, + 0x68E5: 0x97A1, + 0x68E6: 0x97A2, + 0x68E7: 0x97A3, + 0x68E8: 0x97A4, + 0x68E9: 0x97A5, + 0x68EA: 0x97A6, + 0x68EB: 0x97A7, + 0x68EC: 0x97A8, + 0x68ED: 0x97A9, + 0x68EE: 0xC9AD, + 0x68EF: 0x97AA, + 0x68F0: 0xE9A2, + 0x68F1: 0xC0E2, + 0x68F2: 0x97AB, + 0x68F3: 0x97AC, + 0x68F4: 0x97AD, + 0x68F5: 0xBFC3, + 0x68F6: 0x97AE, + 0x68F7: 0x97AF, + 0x68F8: 0x97B0, + 0x68F9: 0xE8FE, + 0x68FA: 0xB9D7, + 0x68FB: 0x97B1, + 0x68FC: 0xE8FB, + 0x68FD: 0x97B2, + 0x68FE: 0x97B3, + 0x68FF: 0x97B4, + 0x6900: 0x97B5, + 0x6901: 0xE9A4, + 0x6902: 0x97B6, + 0x6903: 0x97B7, + 0x6904: 0x97B8, + 0x6905: 0xD2CE, + 0x6906: 0x97B9, + 0x6907: 0x97BA, + 0x6908: 0x97BB, + 0x6909: 0x97BC, + 0x690A: 0x97BD, + 0x690B: 0xE9A3, + 0x690C: 0x97BE, + 0x690D: 0xD6B2, + 0x690E: 0xD7B5, + 0x690F: 0x97BF, + 0x6910: 0xE9A7, + 0x6911: 0x97C0, + 0x6912: 0xBDB7, + 0x6913: 0x97C1, + 0x6914: 0x97C2, + 0x6915: 0x97C3, + 0x6916: 0x97C4, + 0x6917: 0x97C5, + 0x6918: 0x97C6, + 0x6919: 0x97C7, + 0x691A: 0x97C8, + 0x691B: 0x97C9, + 0x691C: 0x97CA, + 0x691D: 0x97CB, + 0x691E: 0x97CC, + 0x691F: 0xE8FC, + 0x6920: 0xE8FD, + 0x6921: 0x97CD, + 0x6922: 0x97CE, + 0x6923: 0x97CF, + 0x6924: 0xE9A1, + 0x6925: 0x97D0, + 0x6926: 0x97D1, + 0x6927: 0x97D2, + 0x6928: 0x97D3, + 0x6929: 0x97D4, + 0x692A: 0x97D5, + 0x692B: 0x97D6, + 0x692C: 0x97D7, + 0x692D: 0xCDD6, + 0x692E: 0x97D8, + 0x692F: 0x97D9, + 0x6930: 0xD2AC, + 0x6931: 0x97DA, + 0x6932: 0x97DB, + 0x6933: 0x97DC, + 0x6934: 0xE9B2, + 0x6935: 0x97DD, + 0x6936: 0x97DE, + 0x6937: 0x97DF, + 0x6938: 0x97E0, + 0x6939: 0xE9A9, + 0x693A: 0x97E1, + 0x693B: 0x97E2, + 0x693C: 0x97E3, + 0x693D: 0xB4AA, + 0x693E: 0x97E4, + 0x693F: 0xB4BB, + 0x6940: 0x97E5, + 0x6941: 0x97E6, + 0x6942: 0xE9AB, + 0x6943: 0x97E7, + 0x6944: 0x97E8, + 0x6945: 0x97E9, + 0x6946: 0x97EA, + 0x6947: 0x97EB, + 0x6948: 0x97EC, + 0x6949: 0x97ED, + 0x694A: 0x97EE, + 0x694B: 0x97EF, + 0x694C: 0x97F0, + 0x694D: 0x97F1, + 0x694E: 0x97F2, + 0x694F: 0x97F3, + 0x6950: 0x97F4, + 0x6951: 0x97F5, + 0x6952: 0x97F6, + 0x6953: 0x97F7, + 0x6954: 0xD0A8, + 0x6955: 0x97F8, + 0x6956: 0x97F9, + 0x6957: 0xE9A5, + 0x6958: 0x97FA, + 0x6959: 0x97FB, + 0x695A: 0xB3FE, + 0x695B: 0x97FC, + 0x695C: 0x97FD, + 0x695D: 0xE9AC, + 0x695E: 0xC0E3, + 0x695F: 0x97FE, + 0x6960: 0xE9AA, + 0x6961: 0x9840, + 0x6962: 0x9841, + 0x6963: 0xE9B9, + 0x6964: 0x9842, + 0x6965: 0x9843, + 0x6966: 0xE9B8, + 0x6967: 0x9844, + 0x6968: 0x9845, + 0x6969: 0x9846, + 0x696A: 0x9847, + 0x696B: 0xE9AE, + 0x696C: 0x9848, + 0x696D: 0x9849, + 0x696E: 0xE8FA, + 0x696F: 0x984A, + 0x6970: 0x984B, + 0x6971: 0xE9A8, + 0x6972: 0x984C, + 0x6973: 0x984D, + 0x6974: 0x984E, + 0x6975: 0x984F, + 0x6976: 0x9850, + 0x6977: 0xBFAC, + 0x6978: 0xE9B1, + 0x6979: 0xE9BA, + 0x697A: 0x9851, + 0x697B: 0x9852, + 0x697C: 0xC2A5, + 0x697D: 0x9853, + 0x697E: 0x9854, + 0x697F: 0x9855, + 0x6980: 0xE9AF, + 0x6981: 0x9856, + 0x6982: 0xB8C5, + 0x6983: 0x9857, + 0x6984: 0xE9AD, + 0x6985: 0x9858, + 0x6986: 0xD3DC, + 0x6987: 0xE9B4, + 0x6988: 0xE9B5, + 0x6989: 0xE9B7, + 0x698A: 0x9859, + 0x698B: 0x985A, + 0x698C: 0x985B, + 0x698D: 0xE9C7, + 0x698E: 0x985C, + 0x698F: 0x985D, + 0x6990: 0x985E, + 0x6991: 0x985F, + 0x6992: 0x9860, + 0x6993: 0x9861, + 0x6994: 0xC0C6, + 0x6995: 0xE9C5, + 0x6996: 0x9862, + 0x6997: 0x9863, + 0x6998: 0xE9B0, + 0x6999: 0x9864, + 0x699A: 0x9865, + 0x699B: 0xE9BB, + 0x699C: 0xB0F1, + 0x699D: 0x9866, + 0x699E: 0x9867, + 0x699F: 0x9868, + 0x69A0: 0x9869, + 0x69A1: 0x986A, + 0x69A2: 0x986B, + 0x69A3: 0x986C, + 0x69A4: 0x986D, + 0x69A5: 0x986E, + 0x69A6: 0x986F, + 0x69A7: 0xE9BC, + 0x69A8: 0xD5A5, + 0x69A9: 0x9870, + 0x69AA: 0x9871, + 0x69AB: 0xE9BE, + 0x69AC: 0x9872, + 0x69AD: 0xE9BF, + 0x69AE: 0x9873, + 0x69AF: 0x9874, + 0x69B0: 0x9875, + 0x69B1: 0xE9C1, + 0x69B2: 0x9876, + 0x69B3: 0x9877, + 0x69B4: 0xC1F1, + 0x69B5: 0x9878, + 0x69B6: 0x9879, + 0x69B7: 0xC8B6, + 0x69B8: 0x987A, + 0x69B9: 0x987B, + 0x69BA: 0x987C, + 0x69BB: 0xE9BD, + 0x69BC: 0x987D, + 0x69BD: 0x987E, + 0x69BE: 0x9880, + 0x69BF: 0x9881, + 0x69C0: 0x9882, + 0x69C1: 0xE9C2, + 0x69C2: 0x9883, + 0x69C3: 0x9884, + 0x69C4: 0x9885, + 0x69C5: 0x9886, + 0x69C6: 0x9887, + 0x69C7: 0x9888, + 0x69C8: 0x9889, + 0x69C9: 0x988A, + 0x69CA: 0xE9C3, + 0x69CB: 0x988B, + 0x69CC: 0xE9B3, + 0x69CD: 0x988C, + 0x69CE: 0xE9B6, + 0x69CF: 0x988D, + 0x69D0: 0xBBB1, + 0x69D1: 0x988E, + 0x69D2: 0x988F, + 0x69D3: 0x9890, + 0x69D4: 0xE9C0, + 0x69D5: 0x9891, + 0x69D6: 0x9892, + 0x69D7: 0x9893, + 0x69D8: 0x9894, + 0x69D9: 0x9895, + 0x69DA: 0x9896, + 0x69DB: 0xBCF7, + 0x69DC: 0x9897, + 0x69DD: 0x9898, + 0x69DE: 0x9899, + 0x69DF: 0xE9C4, + 0x69E0: 0xE9C6, + 0x69E1: 0x989A, + 0x69E2: 0x989B, + 0x69E3: 0x989C, + 0x69E4: 0x989D, + 0x69E5: 0x989E, + 0x69E6: 0x989F, + 0x69E7: 0x98A0, + 0x69E8: 0x98A1, + 0x69E9: 0x98A2, + 0x69EA: 0x98A3, + 0x69EB: 0x98A4, + 0x69EC: 0x98A5, + 0x69ED: 0xE9CA, + 0x69EE: 0x98A6, + 0x69EF: 0x98A7, + 0x69F0: 0x98A8, + 0x69F1: 0x98A9, + 0x69F2: 0xE9CE, + 0x69F3: 0x98AA, + 0x69F4: 0x98AB, + 0x69F5: 0x98AC, + 0x69F6: 0x98AD, + 0x69F7: 0x98AE, + 0x69F8: 0x98AF, + 0x69F9: 0x98B0, + 0x69FA: 0x98B1, + 0x69FB: 0x98B2, + 0x69FC: 0x98B3, + 0x69FD: 0xB2DB, + 0x69FE: 0x98B4, + 0x69FF: 0xE9C8, + 0x6A00: 0x98B5, + 0x6A01: 0x98B6, + 0x6A02: 0x98B7, + 0x6A03: 0x98B8, + 0x6A04: 0x98B9, + 0x6A05: 0x98BA, + 0x6A06: 0x98BB, + 0x6A07: 0x98BC, + 0x6A08: 0x98BD, + 0x6A09: 0x98BE, + 0x6A0A: 0xB7AE, + 0x6A0B: 0x98BF, + 0x6A0C: 0x98C0, + 0x6A0D: 0x98C1, + 0x6A0E: 0x98C2, + 0x6A0F: 0x98C3, + 0x6A10: 0x98C4, + 0x6A11: 0x98C5, + 0x6A12: 0x98C6, + 0x6A13: 0x98C7, + 0x6A14: 0x98C8, + 0x6A15: 0x98C9, + 0x6A16: 0x98CA, + 0x6A17: 0xE9CB, + 0x6A18: 0xE9CC, + 0x6A19: 0x98CB, + 0x6A1A: 0x98CC, + 0x6A1B: 0x98CD, + 0x6A1C: 0x98CE, + 0x6A1D: 0x98CF, + 0x6A1E: 0x98D0, + 0x6A1F: 0xD5C1, + 0x6A20: 0x98D1, + 0x6A21: 0xC4A3, + 0x6A22: 0x98D2, + 0x6A23: 0x98D3, + 0x6A24: 0x98D4, + 0x6A25: 0x98D5, + 0x6A26: 0x98D6, + 0x6A27: 0x98D7, + 0x6A28: 0xE9D8, + 0x6A29: 0x98D8, + 0x6A2A: 0xBAE1, + 0x6A2B: 0x98D9, + 0x6A2C: 0x98DA, + 0x6A2D: 0x98DB, + 0x6A2E: 0x98DC, + 0x6A2F: 0xE9C9, + 0x6A30: 0x98DD, + 0x6A31: 0xD3A3, + 0x6A32: 0x98DE, + 0x6A33: 0x98DF, + 0x6A34: 0x98E0, + 0x6A35: 0xE9D4, + 0x6A36: 0x98E1, + 0x6A37: 0x98E2, + 0x6A38: 0x98E3, + 0x6A39: 0x98E4, + 0x6A3A: 0x98E5, + 0x6A3B: 0x98E6, + 0x6A3C: 0x98E7, + 0x6A3D: 0xE9D7, + 0x6A3E: 0xE9D0, + 0x6A3F: 0x98E8, + 0x6A40: 0x98E9, + 0x6A41: 0x98EA, + 0x6A42: 0x98EB, + 0x6A43: 0x98EC, + 0x6A44: 0xE9CF, + 0x6A45: 0x98ED, + 0x6A46: 0x98EE, + 0x6A47: 0xC7C1, + 0x6A48: 0x98EF, + 0x6A49: 0x98F0, + 0x6A4A: 0x98F1, + 0x6A4B: 0x98F2, + 0x6A4C: 0x98F3, + 0x6A4D: 0x98F4, + 0x6A4E: 0x98F5, + 0x6A4F: 0x98F6, + 0x6A50: 0xE9D2, + 0x6A51: 0x98F7, + 0x6A52: 0x98F8, + 0x6A53: 0x98F9, + 0x6A54: 0x98FA, + 0x6A55: 0x98FB, + 0x6A56: 0x98FC, + 0x6A57: 0x98FD, + 0x6A58: 0xE9D9, + 0x6A59: 0xB3C8, + 0x6A5A: 0x98FE, + 0x6A5B: 0xE9D3, + 0x6A5C: 0x9940, + 0x6A5D: 0x9941, + 0x6A5E: 0x9942, + 0x6A5F: 0x9943, + 0x6A60: 0x9944, + 0x6A61: 0xCFF0, + 0x6A62: 0x9945, + 0x6A63: 0x9946, + 0x6A64: 0x9947, + 0x6A65: 0xE9CD, + 0x6A66: 0x9948, + 0x6A67: 0x9949, + 0x6A68: 0x994A, + 0x6A69: 0x994B, + 0x6A6A: 0x994C, + 0x6A6B: 0x994D, + 0x6A6C: 0x994E, + 0x6A6D: 0x994F, + 0x6A6E: 0x9950, + 0x6A6F: 0x9951, + 0x6A70: 0x9952, + 0x6A71: 0xB3F7, + 0x6A72: 0x9953, + 0x6A73: 0x9954, + 0x6A74: 0x9955, + 0x6A75: 0x9956, + 0x6A76: 0x9957, + 0x6A77: 0x9958, + 0x6A78: 0x9959, + 0x6A79: 0xE9D6, + 0x6A7A: 0x995A, + 0x6A7B: 0x995B, + 0x6A7C: 0xE9DA, + 0x6A7D: 0x995C, + 0x6A7E: 0x995D, + 0x6A7F: 0x995E, + 0x6A80: 0xCCB4, + 0x6A81: 0x995F, + 0x6A82: 0x9960, + 0x6A83: 0x9961, + 0x6A84: 0xCFAD, + 0x6A85: 0x9962, + 0x6A86: 0x9963, + 0x6A87: 0x9964, + 0x6A88: 0x9965, + 0x6A89: 0x9966, + 0x6A8A: 0x9967, + 0x6A8B: 0x9968, + 0x6A8C: 0x9969, + 0x6A8D: 0x996A, + 0x6A8E: 0xE9D5, + 0x6A8F: 0x996B, + 0x6A90: 0xE9DC, + 0x6A91: 0xE9DB, + 0x6A92: 0x996C, + 0x6A93: 0x996D, + 0x6A94: 0x996E, + 0x6A95: 0x996F, + 0x6A96: 0x9970, + 0x6A97: 0xE9DE, + 0x6A98: 0x9971, + 0x6A99: 0x9972, + 0x6A9A: 0x9973, + 0x6A9B: 0x9974, + 0x6A9C: 0x9975, + 0x6A9D: 0x9976, + 0x6A9E: 0x9977, + 0x6A9F: 0x9978, + 0x6AA0: 0xE9D1, + 0x6AA1: 0x9979, + 0x6AA2: 0x997A, + 0x6AA3: 0x997B, + 0x6AA4: 0x997C, + 0x6AA5: 0x997D, + 0x6AA6: 0x997E, + 0x6AA7: 0x9980, + 0x6AA8: 0x9981, + 0x6AA9: 0xE9DD, + 0x6AAA: 0x9982, + 0x6AAB: 0xE9DF, + 0x6AAC: 0xC3CA, + 0x6AAD: 0x9983, + 0x6AAE: 0x9984, + 0x6AAF: 0x9985, + 0x6AB0: 0x9986, + 0x6AB1: 0x9987, + 0x6AB2: 0x9988, + 0x6AB3: 0x9989, + 0x6AB4: 0x998A, + 0x6AB5: 0x998B, + 0x6AB6: 0x998C, + 0x6AB7: 0x998D, + 0x6AB8: 0x998E, + 0x6AB9: 0x998F, + 0x6ABA: 0x9990, + 0x6ABB: 0x9991, + 0x6ABC: 0x9992, + 0x6ABD: 0x9993, + 0x6ABE: 0x9994, + 0x6ABF: 0x9995, + 0x6AC0: 0x9996, + 0x6AC1: 0x9997, + 0x6AC2: 0x9998, + 0x6AC3: 0x9999, + 0x6AC4: 0x999A, + 0x6AC5: 0x999B, + 0x6AC6: 0x999C, + 0x6AC7: 0x999D, + 0x6AC8: 0x999E, + 0x6AC9: 0x999F, + 0x6ACA: 0x99A0, + 0x6ACB: 0x99A1, + 0x6ACC: 0x99A2, + 0x6ACD: 0x99A3, + 0x6ACE: 0x99A4, + 0x6ACF: 0x99A5, + 0x6AD0: 0x99A6, + 0x6AD1: 0x99A7, + 0x6AD2: 0x99A8, + 0x6AD3: 0x99A9, + 0x6AD4: 0x99AA, + 0x6AD5: 0x99AB, + 0x6AD6: 0x99AC, + 0x6AD7: 0x99AD, + 0x6AD8: 0x99AE, + 0x6AD9: 0x99AF, + 0x6ADA: 0x99B0, + 0x6ADB: 0x99B1, + 0x6ADC: 0x99B2, + 0x6ADD: 0x99B3, + 0x6ADE: 0x99B4, + 0x6ADF: 0x99B5, + 0x6AE0: 0x99B6, + 0x6AE1: 0x99B7, + 0x6AE2: 0x99B8, + 0x6AE3: 0x99B9, + 0x6AE4: 0x99BA, + 0x6AE5: 0x99BB, + 0x6AE6: 0x99BC, + 0x6AE7: 0x99BD, + 0x6AE8: 0x99BE, + 0x6AE9: 0x99BF, + 0x6AEA: 0x99C0, + 0x6AEB: 0x99C1, + 0x6AEC: 0x99C2, + 0x6AED: 0x99C3, + 0x6AEE: 0x99C4, + 0x6AEF: 0x99C5, + 0x6AF0: 0x99C6, + 0x6AF1: 0x99C7, + 0x6AF2: 0x99C8, + 0x6AF3: 0x99C9, + 0x6AF4: 0x99CA, + 0x6AF5: 0x99CB, + 0x6AF6: 0x99CC, + 0x6AF7: 0x99CD, + 0x6AF8: 0x99CE, + 0x6AF9: 0x99CF, + 0x6AFA: 0x99D0, + 0x6AFB: 0x99D1, + 0x6AFC: 0x99D2, + 0x6AFD: 0x99D3, + 0x6AFE: 0x99D4, + 0x6AFF: 0x99D5, + 0x6B00: 0x99D6, + 0x6B01: 0x99D7, + 0x6B02: 0x99D8, + 0x6B03: 0x99D9, + 0x6B04: 0x99DA, + 0x6B05: 0x99DB, + 0x6B06: 0x99DC, + 0x6B07: 0x99DD, + 0x6B08: 0x99DE, + 0x6B09: 0x99DF, + 0x6B0A: 0x99E0, + 0x6B0B: 0x99E1, + 0x6B0C: 0x99E2, + 0x6B0D: 0x99E3, + 0x6B0E: 0x99E4, + 0x6B0F: 0x99E5, + 0x6B10: 0x99E6, + 0x6B11: 0x99E7, + 0x6B12: 0x99E8, + 0x6B13: 0x99E9, + 0x6B14: 0x99EA, + 0x6B15: 0x99EB, + 0x6B16: 0x99EC, + 0x6B17: 0x99ED, + 0x6B18: 0x99EE, + 0x6B19: 0x99EF, + 0x6B1A: 0x99F0, + 0x6B1B: 0x99F1, + 0x6B1C: 0x99F2, + 0x6B1D: 0x99F3, + 0x6B1E: 0x99F4, + 0x6B1F: 0x99F5, + 0x6B20: 0xC7B7, + 0x6B21: 0xB4CE, + 0x6B22: 0xBBB6, + 0x6B23: 0xD0C0, + 0x6B24: 0xECA3, + 0x6B25: 0x99F6, + 0x6B26: 0x99F7, + 0x6B27: 0xC5B7, + 0x6B28: 0x99F8, + 0x6B29: 0x99F9, + 0x6B2A: 0x99FA, + 0x6B2B: 0x99FB, + 0x6B2C: 0x99FC, + 0x6B2D: 0x99FD, + 0x6B2E: 0x99FE, + 0x6B2F: 0x9A40, + 0x6B30: 0x9A41, + 0x6B31: 0x9A42, + 0x6B32: 0xD3FB, + 0x6B33: 0x9A43, + 0x6B34: 0x9A44, + 0x6B35: 0x9A45, + 0x6B36: 0x9A46, + 0x6B37: 0xECA4, + 0x6B38: 0x9A47, + 0x6B39: 0xECA5, + 0x6B3A: 0xC6DB, + 0x6B3B: 0x9A48, + 0x6B3C: 0x9A49, + 0x6B3D: 0x9A4A, + 0x6B3E: 0xBFEE, + 0x6B3F: 0x9A4B, + 0x6B40: 0x9A4C, + 0x6B41: 0x9A4D, + 0x6B42: 0x9A4E, + 0x6B43: 0xECA6, + 0x6B44: 0x9A4F, + 0x6B45: 0x9A50, + 0x6B46: 0xECA7, + 0x6B47: 0xD0AA, + 0x6B48: 0x9A51, + 0x6B49: 0xC7B8, + 0x6B4A: 0x9A52, + 0x6B4B: 0x9A53, + 0x6B4C: 0xB8E8, + 0x6B4D: 0x9A54, + 0x6B4E: 0x9A55, + 0x6B4F: 0x9A56, + 0x6B50: 0x9A57, + 0x6B51: 0x9A58, + 0x6B52: 0x9A59, + 0x6B53: 0x9A5A, + 0x6B54: 0x9A5B, + 0x6B55: 0x9A5C, + 0x6B56: 0x9A5D, + 0x6B57: 0x9A5E, + 0x6B58: 0x9A5F, + 0x6B59: 0xECA8, + 0x6B5A: 0x9A60, + 0x6B5B: 0x9A61, + 0x6B5C: 0x9A62, + 0x6B5D: 0x9A63, + 0x6B5E: 0x9A64, + 0x6B5F: 0x9A65, + 0x6B60: 0x9A66, + 0x6B61: 0x9A67, + 0x6B62: 0xD6B9, + 0x6B63: 0xD5FD, + 0x6B64: 0xB4CB, + 0x6B65: 0xB2BD, + 0x6B66: 0xCEE4, + 0x6B67: 0xC6E7, + 0x6B68: 0x9A68, + 0x6B69: 0x9A69, + 0x6B6A: 0xCDE1, + 0x6B6B: 0x9A6A, + 0x6B6C: 0x9A6B, + 0x6B6D: 0x9A6C, + 0x6B6E: 0x9A6D, + 0x6B6F: 0x9A6E, + 0x6B70: 0x9A6F, + 0x6B71: 0x9A70, + 0x6B72: 0x9A71, + 0x6B73: 0x9A72, + 0x6B74: 0x9A73, + 0x6B75: 0x9A74, + 0x6B76: 0x9A75, + 0x6B77: 0x9A76, + 0x6B78: 0x9A77, + 0x6B79: 0xB4F5, + 0x6B7A: 0x9A78, + 0x6B7B: 0xCBC0, + 0x6B7C: 0xBCDF, + 0x6B7D: 0x9A79, + 0x6B7E: 0x9A7A, + 0x6B7F: 0x9A7B, + 0x6B80: 0x9A7C, + 0x6B81: 0xE9E2, + 0x6B82: 0xE9E3, + 0x6B83: 0xD1EA, + 0x6B84: 0xE9E5, + 0x6B85: 0x9A7D, + 0x6B86: 0xB4F9, + 0x6B87: 0xE9E4, + 0x6B88: 0x9A7E, + 0x6B89: 0xD1B3, + 0x6B8A: 0xCAE2, + 0x6B8B: 0xB2D0, + 0x6B8C: 0x9A80, + 0x6B8D: 0xE9E8, + 0x6B8E: 0x9A81, + 0x6B8F: 0x9A82, + 0x6B90: 0x9A83, + 0x6B91: 0x9A84, + 0x6B92: 0xE9E6, + 0x6B93: 0xE9E7, + 0x6B94: 0x9A85, + 0x6B95: 0x9A86, + 0x6B96: 0xD6B3, + 0x6B97: 0x9A87, + 0x6B98: 0x9A88, + 0x6B99: 0x9A89, + 0x6B9A: 0xE9E9, + 0x6B9B: 0xE9EA, + 0x6B9C: 0x9A8A, + 0x6B9D: 0x9A8B, + 0x6B9E: 0x9A8C, + 0x6B9F: 0x9A8D, + 0x6BA0: 0x9A8E, + 0x6BA1: 0xE9EB, + 0x6BA2: 0x9A8F, + 0x6BA3: 0x9A90, + 0x6BA4: 0x9A91, + 0x6BA5: 0x9A92, + 0x6BA6: 0x9A93, + 0x6BA7: 0x9A94, + 0x6BA8: 0x9A95, + 0x6BA9: 0x9A96, + 0x6BAA: 0xE9EC, + 0x6BAB: 0x9A97, + 0x6BAC: 0x9A98, + 0x6BAD: 0x9A99, + 0x6BAE: 0x9A9A, + 0x6BAF: 0x9A9B, + 0x6BB0: 0x9A9C, + 0x6BB1: 0x9A9D, + 0x6BB2: 0x9A9E, + 0x6BB3: 0xECAF, + 0x6BB4: 0xC5B9, + 0x6BB5: 0xB6CE, + 0x6BB6: 0x9A9F, + 0x6BB7: 0xD2F3, + 0x6BB8: 0x9AA0, + 0x6BB9: 0x9AA1, + 0x6BBA: 0x9AA2, + 0x6BBB: 0x9AA3, + 0x6BBC: 0x9AA4, + 0x6BBD: 0x9AA5, + 0x6BBE: 0x9AA6, + 0x6BBF: 0xB5EE, + 0x6BC0: 0x9AA7, + 0x6BC1: 0xBBD9, + 0x6BC2: 0xECB1, + 0x6BC3: 0x9AA8, + 0x6BC4: 0x9AA9, + 0x6BC5: 0xD2E3, + 0x6BC6: 0x9AAA, + 0x6BC7: 0x9AAB, + 0x6BC8: 0x9AAC, + 0x6BC9: 0x9AAD, + 0x6BCA: 0x9AAE, + 0x6BCB: 0xCEE3, + 0x6BCC: 0x9AAF, + 0x6BCD: 0xC4B8, + 0x6BCE: 0x9AB0, + 0x6BCF: 0xC3BF, + 0x6BD0: 0x9AB1, + 0x6BD1: 0x9AB2, + 0x6BD2: 0xB6BE, + 0x6BD3: 0xD8B9, + 0x6BD4: 0xB1C8, + 0x6BD5: 0xB1CF, + 0x6BD6: 0xB1D1, + 0x6BD7: 0xC5FE, + 0x6BD8: 0x9AB3, + 0x6BD9: 0xB1D0, + 0x6BDA: 0x9AB4, + 0x6BDB: 0xC3AB, + 0x6BDC: 0x9AB5, + 0x6BDD: 0x9AB6, + 0x6BDE: 0x9AB7, + 0x6BDF: 0x9AB8, + 0x6BE0: 0x9AB9, + 0x6BE1: 0xD5B1, + 0x6BE2: 0x9ABA, + 0x6BE3: 0x9ABB, + 0x6BE4: 0x9ABC, + 0x6BE5: 0x9ABD, + 0x6BE6: 0x9ABE, + 0x6BE7: 0x9ABF, + 0x6BE8: 0x9AC0, + 0x6BE9: 0x9AC1, + 0x6BEA: 0xEBA4, + 0x6BEB: 0xBAC1, + 0x6BEC: 0x9AC2, + 0x6BED: 0x9AC3, + 0x6BEE: 0x9AC4, + 0x6BEF: 0xCCBA, + 0x6BF0: 0x9AC5, + 0x6BF1: 0x9AC6, + 0x6BF2: 0x9AC7, + 0x6BF3: 0xEBA5, + 0x6BF4: 0x9AC8, + 0x6BF5: 0xEBA7, + 0x6BF6: 0x9AC9, + 0x6BF7: 0x9ACA, + 0x6BF8: 0x9ACB, + 0x6BF9: 0xEBA8, + 0x6BFA: 0x9ACC, + 0x6BFB: 0x9ACD, + 0x6BFC: 0x9ACE, + 0x6BFD: 0xEBA6, + 0x6BFE: 0x9ACF, + 0x6BFF: 0x9AD0, + 0x6C00: 0x9AD1, + 0x6C01: 0x9AD2, + 0x6C02: 0x9AD3, + 0x6C03: 0x9AD4, + 0x6C04: 0x9AD5, + 0x6C05: 0xEBA9, + 0x6C06: 0xEBAB, + 0x6C07: 0xEBAA, + 0x6C08: 0x9AD6, + 0x6C09: 0x9AD7, + 0x6C0A: 0x9AD8, + 0x6C0B: 0x9AD9, + 0x6C0C: 0x9ADA, + 0x6C0D: 0xEBAC, + 0x6C0E: 0x9ADB, + 0x6C0F: 0xCACF, + 0x6C10: 0xD8B5, + 0x6C11: 0xC3F1, + 0x6C12: 0x9ADC, + 0x6C13: 0xC3A5, + 0x6C14: 0xC6F8, + 0x6C15: 0xEBAD, + 0x6C16: 0xC4CA, + 0x6C17: 0x9ADD, + 0x6C18: 0xEBAE, + 0x6C19: 0xEBAF, + 0x6C1A: 0xEBB0, + 0x6C1B: 0xB7D5, + 0x6C1C: 0x9ADE, + 0x6C1D: 0x9ADF, + 0x6C1E: 0x9AE0, + 0x6C1F: 0xB7FA, + 0x6C20: 0x9AE1, + 0x6C21: 0xEBB1, + 0x6C22: 0xC7E2, + 0x6C23: 0x9AE2, + 0x6C24: 0xEBB3, + 0x6C25: 0x9AE3, + 0x6C26: 0xBAA4, + 0x6C27: 0xD1F5, + 0x6C28: 0xB0B1, + 0x6C29: 0xEBB2, + 0x6C2A: 0xEBB4, + 0x6C2B: 0x9AE4, + 0x6C2C: 0x9AE5, + 0x6C2D: 0x9AE6, + 0x6C2E: 0xB5AA, + 0x6C2F: 0xC2C8, + 0x6C30: 0xC7E8, + 0x6C31: 0x9AE7, + 0x6C32: 0xEBB5, + 0x6C33: 0x9AE8, + 0x6C34: 0xCBAE, + 0x6C35: 0xE3DF, + 0x6C36: 0x9AE9, + 0x6C37: 0x9AEA, + 0x6C38: 0xD3C0, + 0x6C39: 0x9AEB, + 0x6C3A: 0x9AEC, + 0x6C3B: 0x9AED, + 0x6C3C: 0x9AEE, + 0x6C3D: 0xD9DB, + 0x6C3E: 0x9AEF, + 0x6C3F: 0x9AF0, + 0x6C40: 0xCDA1, + 0x6C41: 0xD6AD, + 0x6C42: 0xC7F3, + 0x6C43: 0x9AF1, + 0x6C44: 0x9AF2, + 0x6C45: 0x9AF3, + 0x6C46: 0xD9E0, + 0x6C47: 0xBBE3, + 0x6C48: 0x9AF4, + 0x6C49: 0xBABA, + 0x6C4A: 0xE3E2, + 0x6C4B: 0x9AF5, + 0x6C4C: 0x9AF6, + 0x6C4D: 0x9AF7, + 0x6C4E: 0x9AF8, + 0x6C4F: 0x9AF9, + 0x6C50: 0xCFAB, + 0x6C51: 0x9AFA, + 0x6C52: 0x9AFB, + 0x6C53: 0x9AFC, + 0x6C54: 0xE3E0, + 0x6C55: 0xC9C7, + 0x6C56: 0x9AFD, + 0x6C57: 0xBAB9, + 0x6C58: 0x9AFE, + 0x6C59: 0x9B40, + 0x6C5A: 0x9B41, + 0x6C5B: 0xD1B4, + 0x6C5C: 0xE3E1, + 0x6C5D: 0xC8EA, + 0x6C5E: 0xB9AF, + 0x6C5F: 0xBDAD, + 0x6C60: 0xB3D8, + 0x6C61: 0xCEDB, + 0x6C62: 0x9B42, + 0x6C63: 0x9B43, + 0x6C64: 0xCCC0, + 0x6C65: 0x9B44, + 0x6C66: 0x9B45, + 0x6C67: 0x9B46, + 0x6C68: 0xE3E8, + 0x6C69: 0xE3E9, + 0x6C6A: 0xCDF4, + 0x6C6B: 0x9B47, + 0x6C6C: 0x9B48, + 0x6C6D: 0x9B49, + 0x6C6E: 0x9B4A, + 0x6C6F: 0x9B4B, + 0x6C70: 0xCCAD, + 0x6C71: 0x9B4C, + 0x6C72: 0xBCB3, + 0x6C73: 0x9B4D, + 0x6C74: 0xE3EA, + 0x6C75: 0x9B4E, + 0x6C76: 0xE3EB, + 0x6C77: 0x9B4F, + 0x6C78: 0x9B50, + 0x6C79: 0xD0DA, + 0x6C7A: 0x9B51, + 0x6C7B: 0x9B52, + 0x6C7C: 0x9B53, + 0x6C7D: 0xC6FB, + 0x6C7E: 0xB7DA, + 0x6C7F: 0x9B54, + 0x6C80: 0x9B55, + 0x6C81: 0xC7DF, + 0x6C82: 0xD2CA, + 0x6C83: 0xCED6, + 0x6C84: 0x9B56, + 0x6C85: 0xE3E4, + 0x6C86: 0xE3EC, + 0x6C87: 0x9B57, + 0x6C88: 0xC9F2, + 0x6C89: 0xB3C1, + 0x6C8A: 0x9B58, + 0x6C8B: 0x9B59, + 0x6C8C: 0xE3E7, + 0x6C8D: 0x9B5A, + 0x6C8E: 0x9B5B, + 0x6C8F: 0xC6E3, + 0x6C90: 0xE3E5, + 0x6C91: 0x9B5C, + 0x6C92: 0x9B5D, + 0x6C93: 0xEDB3, + 0x6C94: 0xE3E6, + 0x6C95: 0x9B5E, + 0x6C96: 0x9B5F, + 0x6C97: 0x9B60, + 0x6C98: 0x9B61, + 0x6C99: 0xC9B3, + 0x6C9A: 0x9B62, + 0x6C9B: 0xC5E6, + 0x6C9C: 0x9B63, + 0x6C9D: 0x9B64, + 0x6C9E: 0x9B65, + 0x6C9F: 0xB9B5, + 0x6CA0: 0x9B66, + 0x6CA1: 0xC3BB, + 0x6CA2: 0x9B67, + 0x6CA3: 0xE3E3, + 0x6CA4: 0xC5BD, + 0x6CA5: 0xC1A4, + 0x6CA6: 0xC2D9, + 0x6CA7: 0xB2D7, + 0x6CA8: 0x9B68, + 0x6CA9: 0xE3ED, + 0x6CAA: 0xBBA6, + 0x6CAB: 0xC4AD, + 0x6CAC: 0x9B69, + 0x6CAD: 0xE3F0, + 0x6CAE: 0xBEDA, + 0x6CAF: 0x9B6A, + 0x6CB0: 0x9B6B, + 0x6CB1: 0xE3FB, + 0x6CB2: 0xE3F5, + 0x6CB3: 0xBAD3, + 0x6CB4: 0x9B6C, + 0x6CB5: 0x9B6D, + 0x6CB6: 0x9B6E, + 0x6CB7: 0x9B6F, + 0x6CB8: 0xB7D0, + 0x6CB9: 0xD3CD, + 0x6CBA: 0x9B70, + 0x6CBB: 0xD6CE, + 0x6CBC: 0xD5D3, + 0x6CBD: 0xB9C1, + 0x6CBE: 0xD5B4, + 0x6CBF: 0xD1D8, + 0x6CC0: 0x9B71, + 0x6CC1: 0x9B72, + 0x6CC2: 0x9B73, + 0x6CC3: 0x9B74, + 0x6CC4: 0xD0B9, + 0x6CC5: 0xC7F6, + 0x6CC6: 0x9B75, + 0x6CC7: 0x9B76, + 0x6CC8: 0x9B77, + 0x6CC9: 0xC8AA, + 0x6CCA: 0xB2B4, + 0x6CCB: 0x9B78, + 0x6CCC: 0xC3DA, + 0x6CCD: 0x9B79, + 0x6CCE: 0x9B7A, + 0x6CCF: 0x9B7B, + 0x6CD0: 0xE3EE, + 0x6CD1: 0x9B7C, + 0x6CD2: 0x9B7D, + 0x6CD3: 0xE3FC, + 0x6CD4: 0xE3EF, + 0x6CD5: 0xB7A8, + 0x6CD6: 0xE3F7, + 0x6CD7: 0xE3F4, + 0x6CD8: 0x9B7E, + 0x6CD9: 0x9B80, + 0x6CDA: 0x9B81, + 0x6CDB: 0xB7BA, + 0x6CDC: 0x9B82, + 0x6CDD: 0x9B83, + 0x6CDE: 0xC5A2, + 0x6CDF: 0x9B84, + 0x6CE0: 0xE3F6, + 0x6CE1: 0xC5DD, + 0x6CE2: 0xB2A8, + 0x6CE3: 0xC6FC, + 0x6CE4: 0x9B85, + 0x6CE5: 0xC4E0, + 0x6CE6: 0x9B86, + 0x6CE7: 0x9B87, + 0x6CE8: 0xD7A2, + 0x6CE9: 0x9B88, + 0x6CEA: 0xC0E1, + 0x6CEB: 0xE3F9, + 0x6CEC: 0x9B89, + 0x6CED: 0x9B8A, + 0x6CEE: 0xE3FA, + 0x6CEF: 0xE3FD, + 0x6CF0: 0xCCA9, + 0x6CF1: 0xE3F3, + 0x6CF2: 0x9B8B, + 0x6CF3: 0xD3BE, + 0x6CF4: 0x9B8C, + 0x6CF5: 0xB1C3, + 0x6CF6: 0xEDB4, + 0x6CF7: 0xE3F1, + 0x6CF8: 0xE3F2, + 0x6CF9: 0x9B8D, + 0x6CFA: 0xE3F8, + 0x6CFB: 0xD0BA, + 0x6CFC: 0xC6C3, + 0x6CFD: 0xD4F3, + 0x6CFE: 0xE3FE, + 0x6CFF: 0x9B8E, + 0x6D00: 0x9B8F, + 0x6D01: 0xBDE0, + 0x6D02: 0x9B90, + 0x6D03: 0x9B91, + 0x6D04: 0xE4A7, + 0x6D05: 0x9B92, + 0x6D06: 0x9B93, + 0x6D07: 0xE4A6, + 0x6D08: 0x9B94, + 0x6D09: 0x9B95, + 0x6D0A: 0x9B96, + 0x6D0B: 0xD1F3, + 0x6D0C: 0xE4A3, + 0x6D0D: 0x9B97, + 0x6D0E: 0xE4A9, + 0x6D0F: 0x9B98, + 0x6D10: 0x9B99, + 0x6D11: 0x9B9A, + 0x6D12: 0xC8F7, + 0x6D13: 0x9B9B, + 0x6D14: 0x9B9C, + 0x6D15: 0x9B9D, + 0x6D16: 0x9B9E, + 0x6D17: 0xCFB4, + 0x6D18: 0x9B9F, + 0x6D19: 0xE4A8, + 0x6D1A: 0xE4AE, + 0x6D1B: 0xC2E5, + 0x6D1C: 0x9BA0, + 0x6D1D: 0x9BA1, + 0x6D1E: 0xB6B4, + 0x6D1F: 0x9BA2, + 0x6D20: 0x9BA3, + 0x6D21: 0x9BA4, + 0x6D22: 0x9BA5, + 0x6D23: 0x9BA6, + 0x6D24: 0x9BA7, + 0x6D25: 0xBDF2, + 0x6D26: 0x9BA8, + 0x6D27: 0xE4A2, + 0x6D28: 0x9BA9, + 0x6D29: 0x9BAA, + 0x6D2A: 0xBAE9, + 0x6D2B: 0xE4AA, + 0x6D2C: 0x9BAB, + 0x6D2D: 0x9BAC, + 0x6D2E: 0xE4AC, + 0x6D2F: 0x9BAD, + 0x6D30: 0x9BAE, + 0x6D31: 0xB6FD, + 0x6D32: 0xD6DE, + 0x6D33: 0xE4B2, + 0x6D34: 0x9BAF, + 0x6D35: 0xE4AD, + 0x6D36: 0x9BB0, + 0x6D37: 0x9BB1, + 0x6D38: 0x9BB2, + 0x6D39: 0xE4A1, + 0x6D3A: 0x9BB3, + 0x6D3B: 0xBBEE, + 0x6D3C: 0xCDDD, + 0x6D3D: 0xC7A2, + 0x6D3E: 0xC5C9, + 0x6D3F: 0x9BB4, + 0x6D40: 0x9BB5, + 0x6D41: 0xC1F7, + 0x6D42: 0x9BB6, + 0x6D43: 0xE4A4, + 0x6D44: 0x9BB7, + 0x6D45: 0xC7B3, + 0x6D46: 0xBDAC, + 0x6D47: 0xBDBD, + 0x6D48: 0xE4A5, + 0x6D49: 0x9BB8, + 0x6D4A: 0xD7C7, + 0x6D4B: 0xB2E2, + 0x6D4C: 0x9BB9, + 0x6D4D: 0xE4AB, + 0x6D4E: 0xBCC3, + 0x6D4F: 0xE4AF, + 0x6D50: 0x9BBA, + 0x6D51: 0xBBEB, + 0x6D52: 0xE4B0, + 0x6D53: 0xC5A8, + 0x6D54: 0xE4B1, + 0x6D55: 0x9BBB, + 0x6D56: 0x9BBC, + 0x6D57: 0x9BBD, + 0x6D58: 0x9BBE, + 0x6D59: 0xD5E3, + 0x6D5A: 0xBFA3, + 0x6D5B: 0x9BBF, + 0x6D5C: 0xE4BA, + 0x6D5D: 0x9BC0, + 0x6D5E: 0xE4B7, + 0x6D5F: 0x9BC1, + 0x6D60: 0xE4BB, + 0x6D61: 0x9BC2, + 0x6D62: 0x9BC3, + 0x6D63: 0xE4BD, + 0x6D64: 0x9BC4, + 0x6D65: 0x9BC5, + 0x6D66: 0xC6D6, + 0x6D67: 0x9BC6, + 0x6D68: 0x9BC7, + 0x6D69: 0xBAC6, + 0x6D6A: 0xC0CB, + 0x6D6B: 0x9BC8, + 0x6D6C: 0x9BC9, + 0x6D6D: 0x9BCA, + 0x6D6E: 0xB8A1, + 0x6D6F: 0xE4B4, + 0x6D70: 0x9BCB, + 0x6D71: 0x9BCC, + 0x6D72: 0x9BCD, + 0x6D73: 0x9BCE, + 0x6D74: 0xD4A1, + 0x6D75: 0x9BCF, + 0x6D76: 0x9BD0, + 0x6D77: 0xBAA3, + 0x6D78: 0xBDFE, + 0x6D79: 0x9BD1, + 0x6D7A: 0x9BD2, + 0x6D7B: 0x9BD3, + 0x6D7C: 0xE4BC, + 0x6D7D: 0x9BD4, + 0x6D7E: 0x9BD5, + 0x6D7F: 0x9BD6, + 0x6D80: 0x9BD7, + 0x6D81: 0x9BD8, + 0x6D82: 0xCDBF, + 0x6D83: 0x9BD9, + 0x6D84: 0x9BDA, + 0x6D85: 0xC4F9, + 0x6D86: 0x9BDB, + 0x6D87: 0x9BDC, + 0x6D88: 0xCFFB, + 0x6D89: 0xC9E6, + 0x6D8A: 0x9BDD, + 0x6D8B: 0x9BDE, + 0x6D8C: 0xD3BF, + 0x6D8D: 0x9BDF, + 0x6D8E: 0xCFD1, + 0x6D8F: 0x9BE0, + 0x6D90: 0x9BE1, + 0x6D91: 0xE4B3, + 0x6D92: 0x9BE2, + 0x6D93: 0xE4B8, + 0x6D94: 0xE4B9, + 0x6D95: 0xCCE9, + 0x6D96: 0x9BE3, + 0x6D97: 0x9BE4, + 0x6D98: 0x9BE5, + 0x6D99: 0x9BE6, + 0x6D9A: 0x9BE7, + 0x6D9B: 0xCCCE, + 0x6D9C: 0x9BE8, + 0x6D9D: 0xC0D4, + 0x6D9E: 0xE4B5, + 0x6D9F: 0xC1B0, + 0x6DA0: 0xE4B6, + 0x6DA1: 0xCED0, + 0x6DA2: 0x9BE9, + 0x6DA3: 0xBBC1, + 0x6DA4: 0xB5D3, + 0x6DA5: 0x9BEA, + 0x6DA6: 0xC8F3, + 0x6DA7: 0xBDA7, + 0x6DA8: 0xD5C7, + 0x6DA9: 0xC9AC, + 0x6DAA: 0xB8A2, + 0x6DAB: 0xE4CA, + 0x6DAC: 0x9BEB, + 0x6DAD: 0x9BEC, + 0x6DAE: 0xE4CC, + 0x6DAF: 0xD1C4, + 0x6DB0: 0x9BED, + 0x6DB1: 0x9BEE, + 0x6DB2: 0xD2BA, + 0x6DB3: 0x9BEF, + 0x6DB4: 0x9BF0, + 0x6DB5: 0xBAAD, + 0x6DB6: 0x9BF1, + 0x6DB7: 0x9BF2, + 0x6DB8: 0xBAD4, + 0x6DB9: 0x9BF3, + 0x6DBA: 0x9BF4, + 0x6DBB: 0x9BF5, + 0x6DBC: 0x9BF6, + 0x6DBD: 0x9BF7, + 0x6DBE: 0x9BF8, + 0x6DBF: 0xE4C3, + 0x6DC0: 0xB5ED, + 0x6DC1: 0x9BF9, + 0x6DC2: 0x9BFA, + 0x6DC3: 0x9BFB, + 0x6DC4: 0xD7CD, + 0x6DC5: 0xE4C0, + 0x6DC6: 0xCFFD, + 0x6DC7: 0xE4BF, + 0x6DC8: 0x9BFC, + 0x6DC9: 0x9BFD, + 0x6DCA: 0x9BFE, + 0x6DCB: 0xC1DC, + 0x6DCC: 0xCCCA, + 0x6DCD: 0x9C40, + 0x6DCE: 0x9C41, + 0x6DCF: 0x9C42, + 0x6DD0: 0x9C43, + 0x6DD1: 0xCAE7, + 0x6DD2: 0x9C44, + 0x6DD3: 0x9C45, + 0x6DD4: 0x9C46, + 0x6DD5: 0x9C47, + 0x6DD6: 0xC4D7, + 0x6DD7: 0x9C48, + 0x6DD8: 0xCCD4, + 0x6DD9: 0xE4C8, + 0x6DDA: 0x9C49, + 0x6DDB: 0x9C4A, + 0x6DDC: 0x9C4B, + 0x6DDD: 0xE4C7, + 0x6DDE: 0xE4C1, + 0x6DDF: 0x9C4C, + 0x6DE0: 0xE4C4, + 0x6DE1: 0xB5AD, + 0x6DE2: 0x9C4D, + 0x6DE3: 0x9C4E, + 0x6DE4: 0xD3D9, + 0x6DE5: 0x9C4F, + 0x6DE6: 0xE4C6, + 0x6DE7: 0x9C50, + 0x6DE8: 0x9C51, + 0x6DE9: 0x9C52, + 0x6DEA: 0x9C53, + 0x6DEB: 0xD2F9, + 0x6DEC: 0xB4E3, + 0x6DED: 0x9C54, + 0x6DEE: 0xBBB4, + 0x6DEF: 0x9C55, + 0x6DF0: 0x9C56, + 0x6DF1: 0xC9EE, + 0x6DF2: 0x9C57, + 0x6DF3: 0xB4BE, + 0x6DF4: 0x9C58, + 0x6DF5: 0x9C59, + 0x6DF6: 0x9C5A, + 0x6DF7: 0xBBEC, + 0x6DF8: 0x9C5B, + 0x6DF9: 0xD1CD, + 0x6DFA: 0x9C5C, + 0x6DFB: 0xCCED, + 0x6DFC: 0xEDB5, + 0x6DFD: 0x9C5D, + 0x6DFE: 0x9C5E, + 0x6DFF: 0x9C5F, + 0x6E00: 0x9C60, + 0x6E01: 0x9C61, + 0x6E02: 0x9C62, + 0x6E03: 0x9C63, + 0x6E04: 0x9C64, + 0x6E05: 0xC7E5, + 0x6E06: 0x9C65, + 0x6E07: 0x9C66, + 0x6E08: 0x9C67, + 0x6E09: 0x9C68, + 0x6E0A: 0xD4A8, + 0x6E0B: 0x9C69, + 0x6E0C: 0xE4CB, + 0x6E0D: 0xD7D5, + 0x6E0E: 0xE4C2, + 0x6E0F: 0x9C6A, + 0x6E10: 0xBDA5, + 0x6E11: 0xE4C5, + 0x6E12: 0x9C6B, + 0x6E13: 0x9C6C, + 0x6E14: 0xD3E6, + 0x6E15: 0x9C6D, + 0x6E16: 0xE4C9, + 0x6E17: 0xC9F8, + 0x6E18: 0x9C6E, + 0x6E19: 0x9C6F, + 0x6E1A: 0xE4BE, + 0x6E1B: 0x9C70, + 0x6E1C: 0x9C71, + 0x6E1D: 0xD3E5, + 0x6E1E: 0x9C72, + 0x6E1F: 0x9C73, + 0x6E20: 0xC7FE, + 0x6E21: 0xB6C9, + 0x6E22: 0x9C74, + 0x6E23: 0xD4FC, + 0x6E24: 0xB2B3, + 0x6E25: 0xE4D7, + 0x6E26: 0x9C75, + 0x6E27: 0x9C76, + 0x6E28: 0x9C77, + 0x6E29: 0xCEC2, + 0x6E2A: 0x9C78, + 0x6E2B: 0xE4CD, + 0x6E2C: 0x9C79, + 0x6E2D: 0xCEBC, + 0x6E2E: 0x9C7A, + 0x6E2F: 0xB8DB, + 0x6E30: 0x9C7B, + 0x6E31: 0x9C7C, + 0x6E32: 0xE4D6, + 0x6E33: 0x9C7D, + 0x6E34: 0xBFCA, + 0x6E35: 0x9C7E, + 0x6E36: 0x9C80, + 0x6E37: 0x9C81, + 0x6E38: 0xD3CE, + 0x6E39: 0x9C82, + 0x6E3A: 0xC3EC, + 0x6E3B: 0x9C83, + 0x6E3C: 0x9C84, + 0x6E3D: 0x9C85, + 0x6E3E: 0x9C86, + 0x6E3F: 0x9C87, + 0x6E40: 0x9C88, + 0x6E41: 0x9C89, + 0x6E42: 0x9C8A, + 0x6E43: 0xC5C8, + 0x6E44: 0xE4D8, + 0x6E45: 0x9C8B, + 0x6E46: 0x9C8C, + 0x6E47: 0x9C8D, + 0x6E48: 0x9C8E, + 0x6E49: 0x9C8F, + 0x6E4A: 0x9C90, + 0x6E4B: 0x9C91, + 0x6E4C: 0x9C92, + 0x6E4D: 0xCDC4, + 0x6E4E: 0xE4CF, + 0x6E4F: 0x9C93, + 0x6E50: 0x9C94, + 0x6E51: 0x9C95, + 0x6E52: 0x9C96, + 0x6E53: 0xE4D4, + 0x6E54: 0xE4D5, + 0x6E55: 0x9C97, + 0x6E56: 0xBAFE, + 0x6E57: 0x9C98, + 0x6E58: 0xCFE6, + 0x6E59: 0x9C99, + 0x6E5A: 0x9C9A, + 0x6E5B: 0xD5BF, + 0x6E5C: 0x9C9B, + 0x6E5D: 0x9C9C, + 0x6E5E: 0x9C9D, + 0x6E5F: 0xE4D2, + 0x6E60: 0x9C9E, + 0x6E61: 0x9C9F, + 0x6E62: 0x9CA0, + 0x6E63: 0x9CA1, + 0x6E64: 0x9CA2, + 0x6E65: 0x9CA3, + 0x6E66: 0x9CA4, + 0x6E67: 0x9CA5, + 0x6E68: 0x9CA6, + 0x6E69: 0x9CA7, + 0x6E6A: 0x9CA8, + 0x6E6B: 0xE4D0, + 0x6E6C: 0x9CA9, + 0x6E6D: 0x9CAA, + 0x6E6E: 0xE4CE, + 0x6E6F: 0x9CAB, + 0x6E70: 0x9CAC, + 0x6E71: 0x9CAD, + 0x6E72: 0x9CAE, + 0x6E73: 0x9CAF, + 0x6E74: 0x9CB0, + 0x6E75: 0x9CB1, + 0x6E76: 0x9CB2, + 0x6E77: 0x9CB3, + 0x6E78: 0x9CB4, + 0x6E79: 0x9CB5, + 0x6E7A: 0x9CB6, + 0x6E7B: 0x9CB7, + 0x6E7C: 0x9CB8, + 0x6E7D: 0x9CB9, + 0x6E7E: 0xCDE5, + 0x6E7F: 0xCAAA, + 0x6E80: 0x9CBA, + 0x6E81: 0x9CBB, + 0x6E82: 0x9CBC, + 0x6E83: 0xC0A3, + 0x6E84: 0x9CBD, + 0x6E85: 0xBDA6, + 0x6E86: 0xE4D3, + 0x6E87: 0x9CBE, + 0x6E88: 0x9CBF, + 0x6E89: 0xB8C8, + 0x6E8A: 0x9CC0, + 0x6E8B: 0x9CC1, + 0x6E8C: 0x9CC2, + 0x6E8D: 0x9CC3, + 0x6E8E: 0x9CC4, + 0x6E8F: 0xE4E7, + 0x6E90: 0xD4B4, + 0x6E91: 0x9CC5, + 0x6E92: 0x9CC6, + 0x6E93: 0x9CC7, + 0x6E94: 0x9CC8, + 0x6E95: 0x9CC9, + 0x6E96: 0x9CCA, + 0x6E97: 0x9CCB, + 0x6E98: 0xE4DB, + 0x6E99: 0x9CCC, + 0x6E9A: 0x9CCD, + 0x6E9B: 0x9CCE, + 0x6E9C: 0xC1EF, + 0x6E9D: 0x9CCF, + 0x6E9E: 0x9CD0, + 0x6E9F: 0xE4E9, + 0x6EA0: 0x9CD1, + 0x6EA1: 0x9CD2, + 0x6EA2: 0xD2E7, + 0x6EA3: 0x9CD3, + 0x6EA4: 0x9CD4, + 0x6EA5: 0xE4DF, + 0x6EA6: 0x9CD5, + 0x6EA7: 0xE4E0, + 0x6EA8: 0x9CD6, + 0x6EA9: 0x9CD7, + 0x6EAA: 0xCFAA, + 0x6EAB: 0x9CD8, + 0x6EAC: 0x9CD9, + 0x6EAD: 0x9CDA, + 0x6EAE: 0x9CDB, + 0x6EAF: 0xCBDD, + 0x6EB0: 0x9CDC, + 0x6EB1: 0xE4DA, + 0x6EB2: 0xE4D1, + 0x6EB3: 0x9CDD, + 0x6EB4: 0xE4E5, + 0x6EB5: 0x9CDE, + 0x6EB6: 0xC8DC, + 0x6EB7: 0xE4E3, + 0x6EB8: 0x9CDF, + 0x6EB9: 0x9CE0, + 0x6EBA: 0xC4E7, + 0x6EBB: 0xE4E2, + 0x6EBC: 0x9CE1, + 0x6EBD: 0xE4E1, + 0x6EBE: 0x9CE2, + 0x6EBF: 0x9CE3, + 0x6EC0: 0x9CE4, + 0x6EC1: 0xB3FC, + 0x6EC2: 0xE4E8, + 0x6EC3: 0x9CE5, + 0x6EC4: 0x9CE6, + 0x6EC5: 0x9CE7, + 0x6EC6: 0x9CE8, + 0x6EC7: 0xB5E1, + 0x6EC8: 0x9CE9, + 0x6EC9: 0x9CEA, + 0x6ECA: 0x9CEB, + 0x6ECB: 0xD7CC, + 0x6ECC: 0x9CEC, + 0x6ECD: 0x9CED, + 0x6ECE: 0x9CEE, + 0x6ECF: 0xE4E6, + 0x6ED0: 0x9CEF, + 0x6ED1: 0xBBAC, + 0x6ED2: 0x9CF0, + 0x6ED3: 0xD7D2, + 0x6ED4: 0xCCCF, + 0x6ED5: 0xEBF8, + 0x6ED6: 0x9CF1, + 0x6ED7: 0xE4E4, + 0x6ED8: 0x9CF2, + 0x6ED9: 0x9CF3, + 0x6EDA: 0xB9F6, + 0x6EDB: 0x9CF4, + 0x6EDC: 0x9CF5, + 0x6EDD: 0x9CF6, + 0x6EDE: 0xD6CD, + 0x6EDF: 0xE4D9, + 0x6EE0: 0xE4DC, + 0x6EE1: 0xC2FA, + 0x6EE2: 0xE4DE, + 0x6EE3: 0x9CF7, + 0x6EE4: 0xC2CB, + 0x6EE5: 0xC0C4, + 0x6EE6: 0xC2D0, + 0x6EE7: 0x9CF8, + 0x6EE8: 0xB1F5, + 0x6EE9: 0xCCB2, + 0x6EEA: 0x9CF9, + 0x6EEB: 0x9CFA, + 0x6EEC: 0x9CFB, + 0x6EED: 0x9CFC, + 0x6EEE: 0x9CFD, + 0x6EEF: 0x9CFE, + 0x6EF0: 0x9D40, + 0x6EF1: 0x9D41, + 0x6EF2: 0x9D42, + 0x6EF3: 0x9D43, + 0x6EF4: 0xB5CE, + 0x6EF5: 0x9D44, + 0x6EF6: 0x9D45, + 0x6EF7: 0x9D46, + 0x6EF8: 0x9D47, + 0x6EF9: 0xE4EF, + 0x6EFA: 0x9D48, + 0x6EFB: 0x9D49, + 0x6EFC: 0x9D4A, + 0x6EFD: 0x9D4B, + 0x6EFE: 0x9D4C, + 0x6EFF: 0x9D4D, + 0x6F00: 0x9D4E, + 0x6F01: 0x9D4F, + 0x6F02: 0xC6AF, + 0x6F03: 0x9D50, + 0x6F04: 0x9D51, + 0x6F05: 0x9D52, + 0x6F06: 0xC6E1, + 0x6F07: 0x9D53, + 0x6F08: 0x9D54, + 0x6F09: 0xE4F5, + 0x6F0A: 0x9D55, + 0x6F0B: 0x9D56, + 0x6F0C: 0x9D57, + 0x6F0D: 0x9D58, + 0x6F0E: 0x9D59, + 0x6F0F: 0xC2A9, + 0x6F10: 0x9D5A, + 0x6F11: 0x9D5B, + 0x6F12: 0x9D5C, + 0x6F13: 0xC0EC, + 0x6F14: 0xD1DD, + 0x6F15: 0xE4EE, + 0x6F16: 0x9D5D, + 0x6F17: 0x9D5E, + 0x6F18: 0x9D5F, + 0x6F19: 0x9D60, + 0x6F1A: 0x9D61, + 0x6F1B: 0x9D62, + 0x6F1C: 0x9D63, + 0x6F1D: 0x9D64, + 0x6F1E: 0x9D65, + 0x6F1F: 0x9D66, + 0x6F20: 0xC4AE, + 0x6F21: 0x9D67, + 0x6F22: 0x9D68, + 0x6F23: 0x9D69, + 0x6F24: 0xE4ED, + 0x6F25: 0x9D6A, + 0x6F26: 0x9D6B, + 0x6F27: 0x9D6C, + 0x6F28: 0x9D6D, + 0x6F29: 0xE4F6, + 0x6F2A: 0xE4F4, + 0x6F2B: 0xC2FE, + 0x6F2C: 0x9D6E, + 0x6F2D: 0xE4DD, + 0x6F2E: 0x9D6F, + 0x6F2F: 0xE4F0, + 0x6F30: 0x9D70, + 0x6F31: 0xCAFE, + 0x6F32: 0x9D71, + 0x6F33: 0xD5C4, + 0x6F34: 0x9D72, + 0x6F35: 0x9D73, + 0x6F36: 0xE4F1, + 0x6F37: 0x9D74, + 0x6F38: 0x9D75, + 0x6F39: 0x9D76, + 0x6F3A: 0x9D77, + 0x6F3B: 0x9D78, + 0x6F3C: 0x9D79, + 0x6F3D: 0x9D7A, + 0x6F3E: 0xD1FA, + 0x6F3F: 0x9D7B, + 0x6F40: 0x9D7C, + 0x6F41: 0x9D7D, + 0x6F42: 0x9D7E, + 0x6F43: 0x9D80, + 0x6F44: 0x9D81, + 0x6F45: 0x9D82, + 0x6F46: 0xE4EB, + 0x6F47: 0xE4EC, + 0x6F48: 0x9D83, + 0x6F49: 0x9D84, + 0x6F4A: 0x9D85, + 0x6F4B: 0xE4F2, + 0x6F4C: 0x9D86, + 0x6F4D: 0xCEAB, + 0x6F4E: 0x9D87, + 0x6F4F: 0x9D88, + 0x6F50: 0x9D89, + 0x6F51: 0x9D8A, + 0x6F52: 0x9D8B, + 0x6F53: 0x9D8C, + 0x6F54: 0x9D8D, + 0x6F55: 0x9D8E, + 0x6F56: 0x9D8F, + 0x6F57: 0x9D90, + 0x6F58: 0xC5CB, + 0x6F59: 0x9D91, + 0x6F5A: 0x9D92, + 0x6F5B: 0x9D93, + 0x6F5C: 0xC7B1, + 0x6F5D: 0x9D94, + 0x6F5E: 0xC2BA, + 0x6F5F: 0x9D95, + 0x6F60: 0x9D96, + 0x6F61: 0x9D97, + 0x6F62: 0xE4EA, + 0x6F63: 0x9D98, + 0x6F64: 0x9D99, + 0x6F65: 0x9D9A, + 0x6F66: 0xC1CA, + 0x6F67: 0x9D9B, + 0x6F68: 0x9D9C, + 0x6F69: 0x9D9D, + 0x6F6A: 0x9D9E, + 0x6F6B: 0x9D9F, + 0x6F6C: 0x9DA0, + 0x6F6D: 0xCCB6, + 0x6F6E: 0xB3B1, + 0x6F6F: 0x9DA1, + 0x6F70: 0x9DA2, + 0x6F71: 0x9DA3, + 0x6F72: 0xE4FB, + 0x6F73: 0x9DA4, + 0x6F74: 0xE4F3, + 0x6F75: 0x9DA5, + 0x6F76: 0x9DA6, + 0x6F77: 0x9DA7, + 0x6F78: 0xE4FA, + 0x6F79: 0x9DA8, + 0x6F7A: 0xE4FD, + 0x6F7B: 0x9DA9, + 0x6F7C: 0xE4FC, + 0x6F7D: 0x9DAA, + 0x6F7E: 0x9DAB, + 0x6F7F: 0x9DAC, + 0x6F80: 0x9DAD, + 0x6F81: 0x9DAE, + 0x6F82: 0x9DAF, + 0x6F83: 0x9DB0, + 0x6F84: 0xB3CE, + 0x6F85: 0x9DB1, + 0x6F86: 0x9DB2, + 0x6F87: 0x9DB3, + 0x6F88: 0xB3BA, + 0x6F89: 0xE4F7, + 0x6F8A: 0x9DB4, + 0x6F8B: 0x9DB5, + 0x6F8C: 0xE4F9, + 0x6F8D: 0xE4F8, + 0x6F8E: 0xC5EC, + 0x6F8F: 0x9DB6, + 0x6F90: 0x9DB7, + 0x6F91: 0x9DB8, + 0x6F92: 0x9DB9, + 0x6F93: 0x9DBA, + 0x6F94: 0x9DBB, + 0x6F95: 0x9DBC, + 0x6F96: 0x9DBD, + 0x6F97: 0x9DBE, + 0x6F98: 0x9DBF, + 0x6F99: 0x9DC0, + 0x6F9A: 0x9DC1, + 0x6F9B: 0x9DC2, + 0x6F9C: 0xC0BD, + 0x6F9D: 0x9DC3, + 0x6F9E: 0x9DC4, + 0x6F9F: 0x9DC5, + 0x6FA0: 0x9DC6, + 0x6FA1: 0xD4E8, + 0x6FA2: 0x9DC7, + 0x6FA3: 0x9DC8, + 0x6FA4: 0x9DC9, + 0x6FA5: 0x9DCA, + 0x6FA6: 0x9DCB, + 0x6FA7: 0xE5A2, + 0x6FA8: 0x9DCC, + 0x6FA9: 0x9DCD, + 0x6FAA: 0x9DCE, + 0x6FAB: 0x9DCF, + 0x6FAC: 0x9DD0, + 0x6FAD: 0x9DD1, + 0x6FAE: 0x9DD2, + 0x6FAF: 0x9DD3, + 0x6FB0: 0x9DD4, + 0x6FB1: 0x9DD5, + 0x6FB2: 0x9DD6, + 0x6FB3: 0xB0C4, + 0x6FB4: 0x9DD7, + 0x6FB5: 0x9DD8, + 0x6FB6: 0xE5A4, + 0x6FB7: 0x9DD9, + 0x6FB8: 0x9DDA, + 0x6FB9: 0xE5A3, + 0x6FBA: 0x9DDB, + 0x6FBB: 0x9DDC, + 0x6FBC: 0x9DDD, + 0x6FBD: 0x9DDE, + 0x6FBE: 0x9DDF, + 0x6FBF: 0x9DE0, + 0x6FC0: 0xBCA4, + 0x6FC1: 0x9DE1, + 0x6FC2: 0xE5A5, + 0x6FC3: 0x9DE2, + 0x6FC4: 0x9DE3, + 0x6FC5: 0x9DE4, + 0x6FC6: 0x9DE5, + 0x6FC7: 0x9DE6, + 0x6FC8: 0x9DE7, + 0x6FC9: 0xE5A1, + 0x6FCA: 0x9DE8, + 0x6FCB: 0x9DE9, + 0x6FCC: 0x9DEA, + 0x6FCD: 0x9DEB, + 0x6FCE: 0x9DEC, + 0x6FCF: 0x9DED, + 0x6FD0: 0x9DEE, + 0x6FD1: 0xE4FE, + 0x6FD2: 0xB1F4, + 0x6FD3: 0x9DEF, + 0x6FD4: 0x9DF0, + 0x6FD5: 0x9DF1, + 0x6FD6: 0x9DF2, + 0x6FD7: 0x9DF3, + 0x6FD8: 0x9DF4, + 0x6FD9: 0x9DF5, + 0x6FDA: 0x9DF6, + 0x6FDB: 0x9DF7, + 0x6FDC: 0x9DF8, + 0x6FDD: 0x9DF9, + 0x6FDE: 0xE5A8, + 0x6FDF: 0x9DFA, + 0x6FE0: 0xE5A9, + 0x6FE1: 0xE5A6, + 0x6FE2: 0x9DFB, + 0x6FE3: 0x9DFC, + 0x6FE4: 0x9DFD, + 0x6FE5: 0x9DFE, + 0x6FE6: 0x9E40, + 0x6FE7: 0x9E41, + 0x6FE8: 0x9E42, + 0x6FE9: 0x9E43, + 0x6FEA: 0x9E44, + 0x6FEB: 0x9E45, + 0x6FEC: 0x9E46, + 0x6FED: 0x9E47, + 0x6FEE: 0xE5A7, + 0x6FEF: 0xE5AA, + 0x6FF0: 0x9E48, + 0x6FF1: 0x9E49, + 0x6FF2: 0x9E4A, + 0x6FF3: 0x9E4B, + 0x6FF4: 0x9E4C, + 0x6FF5: 0x9E4D, + 0x6FF6: 0x9E4E, + 0x6FF7: 0x9E4F, + 0x6FF8: 0x9E50, + 0x6FF9: 0x9E51, + 0x6FFA: 0x9E52, + 0x6FFB: 0x9E53, + 0x6FFC: 0x9E54, + 0x6FFD: 0x9E55, + 0x6FFE: 0x9E56, + 0x6FFF: 0x9E57, + 0x7000: 0x9E58, + 0x7001: 0x9E59, + 0x7002: 0x9E5A, + 0x7003: 0x9E5B, + 0x7004: 0x9E5C, + 0x7005: 0x9E5D, + 0x7006: 0x9E5E, + 0x7007: 0x9E5F, + 0x7008: 0x9E60, + 0x7009: 0x9E61, + 0x700A: 0x9E62, + 0x700B: 0x9E63, + 0x700C: 0x9E64, + 0x700D: 0x9E65, + 0x700E: 0x9E66, + 0x700F: 0x9E67, + 0x7010: 0x9E68, + 0x7011: 0xC6D9, + 0x7012: 0x9E69, + 0x7013: 0x9E6A, + 0x7014: 0x9E6B, + 0x7015: 0x9E6C, + 0x7016: 0x9E6D, + 0x7017: 0x9E6E, + 0x7018: 0x9E6F, + 0x7019: 0x9E70, + 0x701A: 0xE5AB, + 0x701B: 0xE5AD, + 0x701C: 0x9E71, + 0x701D: 0x9E72, + 0x701E: 0x9E73, + 0x701F: 0x9E74, + 0x7020: 0x9E75, + 0x7021: 0x9E76, + 0x7022: 0x9E77, + 0x7023: 0xE5AC, + 0x7024: 0x9E78, + 0x7025: 0x9E79, + 0x7026: 0x9E7A, + 0x7027: 0x9E7B, + 0x7028: 0x9E7C, + 0x7029: 0x9E7D, + 0x702A: 0x9E7E, + 0x702B: 0x9E80, + 0x702C: 0x9E81, + 0x702D: 0x9E82, + 0x702E: 0x9E83, + 0x702F: 0x9E84, + 0x7030: 0x9E85, + 0x7031: 0x9E86, + 0x7032: 0x9E87, + 0x7033: 0x9E88, + 0x7034: 0x9E89, + 0x7035: 0xE5AF, + 0x7036: 0x9E8A, + 0x7037: 0x9E8B, + 0x7038: 0x9E8C, + 0x7039: 0xE5AE, + 0x703A: 0x9E8D, + 0x703B: 0x9E8E, + 0x703C: 0x9E8F, + 0x703D: 0x9E90, + 0x703E: 0x9E91, + 0x703F: 0x9E92, + 0x7040: 0x9E93, + 0x7041: 0x9E94, + 0x7042: 0x9E95, + 0x7043: 0x9E96, + 0x7044: 0x9E97, + 0x7045: 0x9E98, + 0x7046: 0x9E99, + 0x7047: 0x9E9A, + 0x7048: 0x9E9B, + 0x7049: 0x9E9C, + 0x704A: 0x9E9D, + 0x704B: 0x9E9E, + 0x704C: 0xB9E0, + 0x704D: 0x9E9F, + 0x704E: 0x9EA0, + 0x704F: 0xE5B0, + 0x7050: 0x9EA1, + 0x7051: 0x9EA2, + 0x7052: 0x9EA3, + 0x7053: 0x9EA4, + 0x7054: 0x9EA5, + 0x7055: 0x9EA6, + 0x7056: 0x9EA7, + 0x7057: 0x9EA8, + 0x7058: 0x9EA9, + 0x7059: 0x9EAA, + 0x705A: 0x9EAB, + 0x705B: 0x9EAC, + 0x705C: 0x9EAD, + 0x705D: 0x9EAE, + 0x705E: 0xE5B1, + 0x705F: 0x9EAF, + 0x7060: 0x9EB0, + 0x7061: 0x9EB1, + 0x7062: 0x9EB2, + 0x7063: 0x9EB3, + 0x7064: 0x9EB4, + 0x7065: 0x9EB5, + 0x7066: 0x9EB6, + 0x7067: 0x9EB7, + 0x7068: 0x9EB8, + 0x7069: 0x9EB9, + 0x706A: 0x9EBA, + 0x706B: 0xBBF0, + 0x706C: 0xECE1, + 0x706D: 0xC3F0, + 0x706E: 0x9EBB, + 0x706F: 0xB5C6, + 0x7070: 0xBBD2, + 0x7071: 0x9EBC, + 0x7072: 0x9EBD, + 0x7073: 0x9EBE, + 0x7074: 0x9EBF, + 0x7075: 0xC1E9, + 0x7076: 0xD4EE, + 0x7077: 0x9EC0, + 0x7078: 0xBEC4, + 0x7079: 0x9EC1, + 0x707A: 0x9EC2, + 0x707B: 0x9EC3, + 0x707C: 0xD7C6, + 0x707D: 0x9EC4, + 0x707E: 0xD4D6, + 0x707F: 0xB2D3, + 0x7080: 0xECBE, + 0x7081: 0x9EC5, + 0x7082: 0x9EC6, + 0x7083: 0x9EC7, + 0x7084: 0x9EC8, + 0x7085: 0xEAC1, + 0x7086: 0x9EC9, + 0x7087: 0x9ECA, + 0x7088: 0x9ECB, + 0x7089: 0xC2AF, + 0x708A: 0xB4B6, + 0x708B: 0x9ECC, + 0x708C: 0x9ECD, + 0x708D: 0x9ECE, + 0x708E: 0xD1D7, + 0x708F: 0x9ECF, + 0x7090: 0x9ED0, + 0x7091: 0x9ED1, + 0x7092: 0xB3B4, + 0x7093: 0x9ED2, + 0x7094: 0xC8B2, + 0x7095: 0xBFBB, + 0x7096: 0xECC0, + 0x7097: 0x9ED3, + 0x7098: 0x9ED4, + 0x7099: 0xD6CB, + 0x709A: 0x9ED5, + 0x709B: 0x9ED6, + 0x709C: 0xECBF, + 0x709D: 0xECC1, + 0x709E: 0x9ED7, + 0x709F: 0x9ED8, + 0x70A0: 0x9ED9, + 0x70A1: 0x9EDA, + 0x70A2: 0x9EDB, + 0x70A3: 0x9EDC, + 0x70A4: 0x9EDD, + 0x70A5: 0x9EDE, + 0x70A6: 0x9EDF, + 0x70A7: 0x9EE0, + 0x70A8: 0x9EE1, + 0x70A9: 0x9EE2, + 0x70AA: 0x9EE3, + 0x70AB: 0xECC5, + 0x70AC: 0xBEE6, + 0x70AD: 0xCCBF, + 0x70AE: 0xC5DA, + 0x70AF: 0xBEBC, + 0x70B0: 0x9EE4, + 0x70B1: 0xECC6, + 0x70B2: 0x9EE5, + 0x70B3: 0xB1FE, + 0x70B4: 0x9EE6, + 0x70B5: 0x9EE7, + 0x70B6: 0x9EE8, + 0x70B7: 0xECC4, + 0x70B8: 0xD5A8, + 0x70B9: 0xB5E3, + 0x70BA: 0x9EE9, + 0x70BB: 0xECC2, + 0x70BC: 0xC1B6, + 0x70BD: 0xB3E3, + 0x70BE: 0x9EEA, + 0x70BF: 0x9EEB, + 0x70C0: 0xECC3, + 0x70C1: 0xCBB8, + 0x70C2: 0xC0C3, + 0x70C3: 0xCCFE, + 0x70C4: 0x9EEC, + 0x70C5: 0x9EED, + 0x70C6: 0x9EEE, + 0x70C7: 0x9EEF, + 0x70C8: 0xC1D2, + 0x70C9: 0x9EF0, + 0x70CA: 0xECC8, + 0x70CB: 0x9EF1, + 0x70CC: 0x9EF2, + 0x70CD: 0x9EF3, + 0x70CE: 0x9EF4, + 0x70CF: 0x9EF5, + 0x70D0: 0x9EF6, + 0x70D1: 0x9EF7, + 0x70D2: 0x9EF8, + 0x70D3: 0x9EF9, + 0x70D4: 0x9EFA, + 0x70D5: 0x9EFB, + 0x70D6: 0x9EFC, + 0x70D7: 0x9EFD, + 0x70D8: 0xBAE6, + 0x70D9: 0xC0D3, + 0x70DA: 0x9EFE, + 0x70DB: 0xD6F2, + 0x70DC: 0x9F40, + 0x70DD: 0x9F41, + 0x70DE: 0x9F42, + 0x70DF: 0xD1CC, + 0x70E0: 0x9F43, + 0x70E1: 0x9F44, + 0x70E2: 0x9F45, + 0x70E3: 0x9F46, + 0x70E4: 0xBFBE, + 0x70E5: 0x9F47, + 0x70E6: 0xB7B3, + 0x70E7: 0xC9D5, + 0x70E8: 0xECC7, + 0x70E9: 0xBBE2, + 0x70EA: 0x9F48, + 0x70EB: 0xCCCC, + 0x70EC: 0xBDFD, + 0x70ED: 0xC8C8, + 0x70EE: 0x9F49, + 0x70EF: 0xCFA9, + 0x70F0: 0x9F4A, + 0x70F1: 0x9F4B, + 0x70F2: 0x9F4C, + 0x70F3: 0x9F4D, + 0x70F4: 0x9F4E, + 0x70F5: 0x9F4F, + 0x70F6: 0x9F50, + 0x70F7: 0xCDE9, + 0x70F8: 0x9F51, + 0x70F9: 0xC5EB, + 0x70FA: 0x9F52, + 0x70FB: 0x9F53, + 0x70FC: 0x9F54, + 0x70FD: 0xB7E9, + 0x70FE: 0x9F55, + 0x70FF: 0x9F56, + 0x7100: 0x9F57, + 0x7101: 0x9F58, + 0x7102: 0x9F59, + 0x7103: 0x9F5A, + 0x7104: 0x9F5B, + 0x7105: 0x9F5C, + 0x7106: 0x9F5D, + 0x7107: 0x9F5E, + 0x7108: 0x9F5F, + 0x7109: 0xD1C9, + 0x710A: 0xBAB8, + 0x710B: 0x9F60, + 0x710C: 0x9F61, + 0x710D: 0x9F62, + 0x710E: 0x9F63, + 0x710F: 0x9F64, + 0x7110: 0xECC9, + 0x7111: 0x9F65, + 0x7112: 0x9F66, + 0x7113: 0xECCA, + 0x7114: 0x9F67, + 0x7115: 0xBBC0, + 0x7116: 0xECCB, + 0x7117: 0x9F68, + 0x7118: 0xECE2, + 0x7119: 0xB1BA, + 0x711A: 0xB7D9, + 0x711B: 0x9F69, + 0x711C: 0x9F6A, + 0x711D: 0x9F6B, + 0x711E: 0x9F6C, + 0x711F: 0x9F6D, + 0x7120: 0x9F6E, + 0x7121: 0x9F6F, + 0x7122: 0x9F70, + 0x7123: 0x9F71, + 0x7124: 0x9F72, + 0x7125: 0x9F73, + 0x7126: 0xBDB9, + 0x7127: 0x9F74, + 0x7128: 0x9F75, + 0x7129: 0x9F76, + 0x712A: 0x9F77, + 0x712B: 0x9F78, + 0x712C: 0x9F79, + 0x712D: 0x9F7A, + 0x712E: 0x9F7B, + 0x712F: 0xECCC, + 0x7130: 0xD1E6, + 0x7131: 0xECCD, + 0x7132: 0x9F7C, + 0x7133: 0x9F7D, + 0x7134: 0x9F7E, + 0x7135: 0x9F80, + 0x7136: 0xC8BB, + 0x7137: 0x9F81, + 0x7138: 0x9F82, + 0x7139: 0x9F83, + 0x713A: 0x9F84, + 0x713B: 0x9F85, + 0x713C: 0x9F86, + 0x713D: 0x9F87, + 0x713E: 0x9F88, + 0x713F: 0x9F89, + 0x7140: 0x9F8A, + 0x7141: 0x9F8B, + 0x7142: 0x9F8C, + 0x7143: 0x9F8D, + 0x7144: 0x9F8E, + 0x7145: 0xECD1, + 0x7146: 0x9F8F, + 0x7147: 0x9F90, + 0x7148: 0x9F91, + 0x7149: 0x9F92, + 0x714A: 0xECD3, + 0x714B: 0x9F93, + 0x714C: 0xBBCD, + 0x714D: 0x9F94, + 0x714E: 0xBCE5, + 0x714F: 0x9F95, + 0x7150: 0x9F96, + 0x7151: 0x9F97, + 0x7152: 0x9F98, + 0x7153: 0x9F99, + 0x7154: 0x9F9A, + 0x7155: 0x9F9B, + 0x7156: 0x9F9C, + 0x7157: 0x9F9D, + 0x7158: 0x9F9E, + 0x7159: 0x9F9F, + 0x715A: 0x9FA0, + 0x715B: 0x9FA1, + 0x715C: 0xECCF, + 0x715D: 0x9FA2, + 0x715E: 0xC9B7, + 0x715F: 0x9FA3, + 0x7160: 0x9FA4, + 0x7161: 0x9FA5, + 0x7162: 0x9FA6, + 0x7163: 0x9FA7, + 0x7164: 0xC3BA, + 0x7165: 0x9FA8, + 0x7166: 0xECE3, + 0x7167: 0xD5D5, + 0x7168: 0xECD0, + 0x7169: 0x9FA9, + 0x716A: 0x9FAA, + 0x716B: 0x9FAB, + 0x716C: 0x9FAC, + 0x716D: 0x9FAD, + 0x716E: 0xD6F3, + 0x716F: 0x9FAE, + 0x7170: 0x9FAF, + 0x7171: 0x9FB0, + 0x7172: 0xECD2, + 0x7173: 0xECCE, + 0x7174: 0x9FB1, + 0x7175: 0x9FB2, + 0x7176: 0x9FB3, + 0x7177: 0x9FB4, + 0x7178: 0xECD4, + 0x7179: 0x9FB5, + 0x717A: 0xECD5, + 0x717B: 0x9FB6, + 0x717C: 0x9FB7, + 0x717D: 0xC9BF, + 0x717E: 0x9FB8, + 0x717F: 0x9FB9, + 0x7180: 0x9FBA, + 0x7181: 0x9FBB, + 0x7182: 0x9FBC, + 0x7183: 0x9FBD, + 0x7184: 0xCFA8, + 0x7185: 0x9FBE, + 0x7186: 0x9FBF, + 0x7187: 0x9FC0, + 0x7188: 0x9FC1, + 0x7189: 0x9FC2, + 0x718A: 0xD0DC, + 0x718B: 0x9FC3, + 0x718C: 0x9FC4, + 0x718D: 0x9FC5, + 0x718E: 0x9FC6, + 0x718F: 0xD1AC, + 0x7190: 0x9FC7, + 0x7191: 0x9FC8, + 0x7192: 0x9FC9, + 0x7193: 0x9FCA, + 0x7194: 0xC8DB, + 0x7195: 0x9FCB, + 0x7196: 0x9FCC, + 0x7197: 0x9FCD, + 0x7198: 0xECD6, + 0x7199: 0xCEF5, + 0x719A: 0x9FCE, + 0x719B: 0x9FCF, + 0x719C: 0x9FD0, + 0x719D: 0x9FD1, + 0x719E: 0x9FD2, + 0x719F: 0xCAEC, + 0x71A0: 0xECDA, + 0x71A1: 0x9FD3, + 0x71A2: 0x9FD4, + 0x71A3: 0x9FD5, + 0x71A4: 0x9FD6, + 0x71A5: 0x9FD7, + 0x71A6: 0x9FD8, + 0x71A7: 0x9FD9, + 0x71A8: 0xECD9, + 0x71A9: 0x9FDA, + 0x71AA: 0x9FDB, + 0x71AB: 0x9FDC, + 0x71AC: 0xB0BE, + 0x71AD: 0x9FDD, + 0x71AE: 0x9FDE, + 0x71AF: 0x9FDF, + 0x71B0: 0x9FE0, + 0x71B1: 0x9FE1, + 0x71B2: 0x9FE2, + 0x71B3: 0xECD7, + 0x71B4: 0x9FE3, + 0x71B5: 0xECD8, + 0x71B6: 0x9FE4, + 0x71B7: 0x9FE5, + 0x71B8: 0x9FE6, + 0x71B9: 0xECE4, + 0x71BA: 0x9FE7, + 0x71BB: 0x9FE8, + 0x71BC: 0x9FE9, + 0x71BD: 0x9FEA, + 0x71BE: 0x9FEB, + 0x71BF: 0x9FEC, + 0x71C0: 0x9FED, + 0x71C1: 0x9FEE, + 0x71C2: 0x9FEF, + 0x71C3: 0xC8BC, + 0x71C4: 0x9FF0, + 0x71C5: 0x9FF1, + 0x71C6: 0x9FF2, + 0x71C7: 0x9FF3, + 0x71C8: 0x9FF4, + 0x71C9: 0x9FF5, + 0x71CA: 0x9FF6, + 0x71CB: 0x9FF7, + 0x71CC: 0x9FF8, + 0x71CD: 0x9FF9, + 0x71CE: 0xC1C7, + 0x71CF: 0x9FFA, + 0x71D0: 0x9FFB, + 0x71D1: 0x9FFC, + 0x71D2: 0x9FFD, + 0x71D3: 0x9FFE, + 0x71D4: 0xECDC, + 0x71D5: 0xD1E0, + 0x71D6: 0xA040, + 0x71D7: 0xA041, + 0x71D8: 0xA042, + 0x71D9: 0xA043, + 0x71DA: 0xA044, + 0x71DB: 0xA045, + 0x71DC: 0xA046, + 0x71DD: 0xA047, + 0x71DE: 0xA048, + 0x71DF: 0xA049, + 0x71E0: 0xECDB, + 0x71E1: 0xA04A, + 0x71E2: 0xA04B, + 0x71E3: 0xA04C, + 0x71E4: 0xA04D, + 0x71E5: 0xD4EF, + 0x71E6: 0xA04E, + 0x71E7: 0xECDD, + 0x71E8: 0xA04F, + 0x71E9: 0xA050, + 0x71EA: 0xA051, + 0x71EB: 0xA052, + 0x71EC: 0xA053, + 0x71ED: 0xA054, + 0x71EE: 0xDBC6, + 0x71EF: 0xA055, + 0x71F0: 0xA056, + 0x71F1: 0xA057, + 0x71F2: 0xA058, + 0x71F3: 0xA059, + 0x71F4: 0xA05A, + 0x71F5: 0xA05B, + 0x71F6: 0xA05C, + 0x71F7: 0xA05D, + 0x71F8: 0xA05E, + 0x71F9: 0xECDE, + 0x71FA: 0xA05F, + 0x71FB: 0xA060, + 0x71FC: 0xA061, + 0x71FD: 0xA062, + 0x71FE: 0xA063, + 0x71FF: 0xA064, + 0x7200: 0xA065, + 0x7201: 0xA066, + 0x7202: 0xA067, + 0x7203: 0xA068, + 0x7204: 0xA069, + 0x7205: 0xA06A, + 0x7206: 0xB1AC, + 0x7207: 0xA06B, + 0x7208: 0xA06C, + 0x7209: 0xA06D, + 0x720A: 0xA06E, + 0x720B: 0xA06F, + 0x720C: 0xA070, + 0x720D: 0xA071, + 0x720E: 0xA072, + 0x720F: 0xA073, + 0x7210: 0xA074, + 0x7211: 0xA075, + 0x7212: 0xA076, + 0x7213: 0xA077, + 0x7214: 0xA078, + 0x7215: 0xA079, + 0x7216: 0xA07A, + 0x7217: 0xA07B, + 0x7218: 0xA07C, + 0x7219: 0xA07D, + 0x721A: 0xA07E, + 0x721B: 0xA080, + 0x721C: 0xA081, + 0x721D: 0xECDF, + 0x721E: 0xA082, + 0x721F: 0xA083, + 0x7220: 0xA084, + 0x7221: 0xA085, + 0x7222: 0xA086, + 0x7223: 0xA087, + 0x7224: 0xA088, + 0x7225: 0xA089, + 0x7226: 0xA08A, + 0x7227: 0xA08B, + 0x7228: 0xECE0, + 0x7229: 0xA08C, + 0x722A: 0xD7A6, + 0x722B: 0xA08D, + 0x722C: 0xC5C0, + 0x722D: 0xA08E, + 0x722E: 0xA08F, + 0x722F: 0xA090, + 0x7230: 0xEBBC, + 0x7231: 0xB0AE, + 0x7232: 0xA091, + 0x7233: 0xA092, + 0x7234: 0xA093, + 0x7235: 0xBEF4, + 0x7236: 0xB8B8, + 0x7237: 0xD2AF, + 0x7238: 0xB0D6, + 0x7239: 0xB5F9, + 0x723A: 0xA094, + 0x723B: 0xD8B3, + 0x723C: 0xA095, + 0x723D: 0xCBAC, + 0x723E: 0xA096, + 0x723F: 0xE3DD, + 0x7240: 0xA097, + 0x7241: 0xA098, + 0x7242: 0xA099, + 0x7243: 0xA09A, + 0x7244: 0xA09B, + 0x7245: 0xA09C, + 0x7246: 0xA09D, + 0x7247: 0xC6AC, + 0x7248: 0xB0E6, + 0x7249: 0xA09E, + 0x724A: 0xA09F, + 0x724B: 0xA0A0, + 0x724C: 0xC5C6, + 0x724D: 0xEBB9, + 0x724E: 0xA0A1, + 0x724F: 0xA0A2, + 0x7250: 0xA0A3, + 0x7251: 0xA0A4, + 0x7252: 0xEBBA, + 0x7253: 0xA0A5, + 0x7254: 0xA0A6, + 0x7255: 0xA0A7, + 0x7256: 0xEBBB, + 0x7257: 0xA0A8, + 0x7258: 0xA0A9, + 0x7259: 0xD1C0, + 0x725A: 0xA0AA, + 0x725B: 0xC5A3, + 0x725C: 0xA0AB, + 0x725D: 0xEAF2, + 0x725E: 0xA0AC, + 0x725F: 0xC4B2, + 0x7260: 0xA0AD, + 0x7261: 0xC4B5, + 0x7262: 0xC0CE, + 0x7263: 0xA0AE, + 0x7264: 0xA0AF, + 0x7265: 0xA0B0, + 0x7266: 0xEAF3, + 0x7267: 0xC4C1, + 0x7268: 0xA0B1, + 0x7269: 0xCEEF, + 0x726A: 0xA0B2, + 0x726B: 0xA0B3, + 0x726C: 0xA0B4, + 0x726D: 0xA0B5, + 0x726E: 0xEAF0, + 0x726F: 0xEAF4, + 0x7270: 0xA0B6, + 0x7271: 0xA0B7, + 0x7272: 0xC9FC, + 0x7273: 0xA0B8, + 0x7274: 0xA0B9, + 0x7275: 0xC7A3, + 0x7276: 0xA0BA, + 0x7277: 0xA0BB, + 0x7278: 0xA0BC, + 0x7279: 0xCCD8, + 0x727A: 0xCEFE, + 0x727B: 0xA0BD, + 0x727C: 0xA0BE, + 0x727D: 0xA0BF, + 0x727E: 0xEAF5, + 0x727F: 0xEAF6, + 0x7280: 0xCFAC, + 0x7281: 0xC0E7, + 0x7282: 0xA0C0, + 0x7283: 0xA0C1, + 0x7284: 0xEAF7, + 0x7285: 0xA0C2, + 0x7286: 0xA0C3, + 0x7287: 0xA0C4, + 0x7288: 0xA0C5, + 0x7289: 0xA0C6, + 0x728A: 0xB6BF, + 0x728B: 0xEAF8, + 0x728C: 0xA0C7, + 0x728D: 0xEAF9, + 0x728E: 0xA0C8, + 0x728F: 0xEAFA, + 0x7290: 0xA0C9, + 0x7291: 0xA0CA, + 0x7292: 0xEAFB, + 0x7293: 0xA0CB, + 0x7294: 0xA0CC, + 0x7295: 0xA0CD, + 0x7296: 0xA0CE, + 0x7297: 0xA0CF, + 0x7298: 0xA0D0, + 0x7299: 0xA0D1, + 0x729A: 0xA0D2, + 0x729B: 0xA0D3, + 0x729C: 0xA0D4, + 0x729D: 0xA0D5, + 0x729E: 0xA0D6, + 0x729F: 0xEAF1, + 0x72A0: 0xA0D7, + 0x72A1: 0xA0D8, + 0x72A2: 0xA0D9, + 0x72A3: 0xA0DA, + 0x72A4: 0xA0DB, + 0x72A5: 0xA0DC, + 0x72A6: 0xA0DD, + 0x72A7: 0xA0DE, + 0x72A8: 0xA0DF, + 0x72A9: 0xA0E0, + 0x72AA: 0xA0E1, + 0x72AB: 0xA0E2, + 0x72AC: 0xC8AE, + 0x72AD: 0xE1EB, + 0x72AE: 0xA0E3, + 0x72AF: 0xB7B8, + 0x72B0: 0xE1EC, + 0x72B1: 0xA0E4, + 0x72B2: 0xA0E5, + 0x72B3: 0xA0E6, + 0x72B4: 0xE1ED, + 0x72B5: 0xA0E7, + 0x72B6: 0xD7B4, + 0x72B7: 0xE1EE, + 0x72B8: 0xE1EF, + 0x72B9: 0xD3CC, + 0x72BA: 0xA0E8, + 0x72BB: 0xA0E9, + 0x72BC: 0xA0EA, + 0x72BD: 0xA0EB, + 0x72BE: 0xA0EC, + 0x72BF: 0xA0ED, + 0x72C0: 0xA0EE, + 0x72C1: 0xE1F1, + 0x72C2: 0xBFF1, + 0x72C3: 0xE1F0, + 0x72C4: 0xB5D2, + 0x72C5: 0xA0EF, + 0x72C6: 0xA0F0, + 0x72C7: 0xA0F1, + 0x72C8: 0xB1B7, + 0x72C9: 0xA0F2, + 0x72CA: 0xA0F3, + 0x72CB: 0xA0F4, + 0x72CC: 0xA0F5, + 0x72CD: 0xE1F3, + 0x72CE: 0xE1F2, + 0x72CF: 0xA0F6, + 0x72D0: 0xBAFC, + 0x72D1: 0xA0F7, + 0x72D2: 0xE1F4, + 0x72D3: 0xA0F8, + 0x72D4: 0xA0F9, + 0x72D5: 0xA0FA, + 0x72D6: 0xA0FB, + 0x72D7: 0xB9B7, + 0x72D8: 0xA0FC, + 0x72D9: 0xBED1, + 0x72DA: 0xA0FD, + 0x72DB: 0xA0FE, + 0x72DC: 0xAA40, + 0x72DD: 0xAA41, + 0x72DE: 0xC4FC, + 0x72DF: 0xAA42, + 0x72E0: 0xBADD, + 0x72E1: 0xBDC6, + 0x72E2: 0xAA43, + 0x72E3: 0xAA44, + 0x72E4: 0xAA45, + 0x72E5: 0xAA46, + 0x72E6: 0xAA47, + 0x72E7: 0xAA48, + 0x72E8: 0xE1F5, + 0x72E9: 0xE1F7, + 0x72EA: 0xAA49, + 0x72EB: 0xAA4A, + 0x72EC: 0xB6C0, + 0x72ED: 0xCFC1, + 0x72EE: 0xCAA8, + 0x72EF: 0xE1F6, + 0x72F0: 0xD5F8, + 0x72F1: 0xD3FC, + 0x72F2: 0xE1F8, + 0x72F3: 0xE1FC, + 0x72F4: 0xE1F9, + 0x72F5: 0xAA4B, + 0x72F6: 0xAA4C, + 0x72F7: 0xE1FA, + 0x72F8: 0xC0EA, + 0x72F9: 0xAA4D, + 0x72FA: 0xE1FE, + 0x72FB: 0xE2A1, + 0x72FC: 0xC0C7, + 0x72FD: 0xAA4E, + 0x72FE: 0xAA4F, + 0x72FF: 0xAA50, + 0x7300: 0xAA51, + 0x7301: 0xE1FB, + 0x7302: 0xAA52, + 0x7303: 0xE1FD, + 0x7304: 0xAA53, + 0x7305: 0xAA54, + 0x7306: 0xAA55, + 0x7307: 0xAA56, + 0x7308: 0xAA57, + 0x7309: 0xAA58, + 0x730A: 0xE2A5, + 0x730B: 0xAA59, + 0x730C: 0xAA5A, + 0x730D: 0xAA5B, + 0x730E: 0xC1D4, + 0x730F: 0xAA5C, + 0x7310: 0xAA5D, + 0x7311: 0xAA5E, + 0x7312: 0xAA5F, + 0x7313: 0xE2A3, + 0x7314: 0xAA60, + 0x7315: 0xE2A8, + 0x7316: 0xB2FE, + 0x7317: 0xE2A2, + 0x7318: 0xAA61, + 0x7319: 0xAA62, + 0x731A: 0xAA63, + 0x731B: 0xC3CD, + 0x731C: 0xB2C2, + 0x731D: 0xE2A7, + 0x731E: 0xE2A6, + 0x731F: 0xAA64, + 0x7320: 0xAA65, + 0x7321: 0xE2A4, + 0x7322: 0xE2A9, + 0x7323: 0xAA66, + 0x7324: 0xAA67, + 0x7325: 0xE2AB, + 0x7326: 0xAA68, + 0x7327: 0xAA69, + 0x7328: 0xAA6A, + 0x7329: 0xD0C9, + 0x732A: 0xD6ED, + 0x732B: 0xC3A8, + 0x732C: 0xE2AC, + 0x732D: 0xAA6B, + 0x732E: 0xCFD7, + 0x732F: 0xAA6C, + 0x7330: 0xAA6D, + 0x7331: 0xE2AE, + 0x7332: 0xAA6E, + 0x7333: 0xAA6F, + 0x7334: 0xBAEF, + 0x7335: 0xAA70, + 0x7336: 0xAA71, + 0x7337: 0xE9E0, + 0x7338: 0xE2AD, + 0x7339: 0xE2AA, + 0x733A: 0xAA72, + 0x733B: 0xAA73, + 0x733C: 0xAA74, + 0x733D: 0xAA75, + 0x733E: 0xBBAB, + 0x733F: 0xD4B3, + 0x7340: 0xAA76, + 0x7341: 0xAA77, + 0x7342: 0xAA78, + 0x7343: 0xAA79, + 0x7344: 0xAA7A, + 0x7345: 0xAA7B, + 0x7346: 0xAA7C, + 0x7347: 0xAA7D, + 0x7348: 0xAA7E, + 0x7349: 0xAA80, + 0x734A: 0xAA81, + 0x734B: 0xAA82, + 0x734C: 0xAA83, + 0x734D: 0xE2B0, + 0x734E: 0xAA84, + 0x734F: 0xAA85, + 0x7350: 0xE2AF, + 0x7351: 0xAA86, + 0x7352: 0xE9E1, + 0x7353: 0xAA87, + 0x7354: 0xAA88, + 0x7355: 0xAA89, + 0x7356: 0xAA8A, + 0x7357: 0xE2B1, + 0x7358: 0xAA8B, + 0x7359: 0xAA8C, + 0x735A: 0xAA8D, + 0x735B: 0xAA8E, + 0x735C: 0xAA8F, + 0x735D: 0xAA90, + 0x735E: 0xAA91, + 0x735F: 0xAA92, + 0x7360: 0xE2B2, + 0x7361: 0xAA93, + 0x7362: 0xAA94, + 0x7363: 0xAA95, + 0x7364: 0xAA96, + 0x7365: 0xAA97, + 0x7366: 0xAA98, + 0x7367: 0xAA99, + 0x7368: 0xAA9A, + 0x7369: 0xAA9B, + 0x736A: 0xAA9C, + 0x736B: 0xAA9D, + 0x736C: 0xE2B3, + 0x736D: 0xCCA1, + 0x736E: 0xAA9E, + 0x736F: 0xE2B4, + 0x7370: 0xAA9F, + 0x7371: 0xAAA0, + 0x7372: 0xAB40, + 0x7373: 0xAB41, + 0x7374: 0xAB42, + 0x7375: 0xAB43, + 0x7376: 0xAB44, + 0x7377: 0xAB45, + 0x7378: 0xAB46, + 0x7379: 0xAB47, + 0x737A: 0xAB48, + 0x737B: 0xAB49, + 0x737C: 0xAB4A, + 0x737D: 0xAB4B, + 0x737E: 0xE2B5, + 0x737F: 0xAB4C, + 0x7380: 0xAB4D, + 0x7381: 0xAB4E, + 0x7382: 0xAB4F, + 0x7383: 0xAB50, + 0x7384: 0xD0FE, + 0x7385: 0xAB51, + 0x7386: 0xAB52, + 0x7387: 0xC2CA, + 0x7388: 0xAB53, + 0x7389: 0xD3F1, + 0x738A: 0xAB54, + 0x738B: 0xCDF5, + 0x738C: 0xAB55, + 0x738D: 0xAB56, + 0x738E: 0xE7E0, + 0x738F: 0xAB57, + 0x7390: 0xAB58, + 0x7391: 0xE7E1, + 0x7392: 0xAB59, + 0x7393: 0xAB5A, + 0x7394: 0xAB5B, + 0x7395: 0xAB5C, + 0x7396: 0xBEC1, + 0x7397: 0xAB5D, + 0x7398: 0xAB5E, + 0x7399: 0xAB5F, + 0x739A: 0xAB60, + 0x739B: 0xC2EA, + 0x739C: 0xAB61, + 0x739D: 0xAB62, + 0x739E: 0xAB63, + 0x739F: 0xE7E4, + 0x73A0: 0xAB64, + 0x73A1: 0xAB65, + 0x73A2: 0xE7E3, + 0x73A3: 0xAB66, + 0x73A4: 0xAB67, + 0x73A5: 0xAB68, + 0x73A6: 0xAB69, + 0x73A7: 0xAB6A, + 0x73A8: 0xAB6B, + 0x73A9: 0xCDE6, + 0x73AA: 0xAB6C, + 0x73AB: 0xC3B5, + 0x73AC: 0xAB6D, + 0x73AD: 0xAB6E, + 0x73AE: 0xE7E2, + 0x73AF: 0xBBB7, + 0x73B0: 0xCFD6, + 0x73B1: 0xAB6F, + 0x73B2: 0xC1E1, + 0x73B3: 0xE7E9, + 0x73B4: 0xAB70, + 0x73B5: 0xAB71, + 0x73B6: 0xAB72, + 0x73B7: 0xE7E8, + 0x73B8: 0xAB73, + 0x73B9: 0xAB74, + 0x73BA: 0xE7F4, + 0x73BB: 0xB2A3, + 0x73BC: 0xAB75, + 0x73BD: 0xAB76, + 0x73BE: 0xAB77, + 0x73BF: 0xAB78, + 0x73C0: 0xE7EA, + 0x73C1: 0xAB79, + 0x73C2: 0xE7E6, + 0x73C3: 0xAB7A, + 0x73C4: 0xAB7B, + 0x73C5: 0xAB7C, + 0x73C6: 0xAB7D, + 0x73C7: 0xAB7E, + 0x73C8: 0xE7EC, + 0x73C9: 0xE7EB, + 0x73CA: 0xC9BA, + 0x73CB: 0xAB80, + 0x73CC: 0xAB81, + 0x73CD: 0xD5E4, + 0x73CE: 0xAB82, + 0x73CF: 0xE7E5, + 0x73D0: 0xB7A9, + 0x73D1: 0xE7E7, + 0x73D2: 0xAB83, + 0x73D3: 0xAB84, + 0x73D4: 0xAB85, + 0x73D5: 0xAB86, + 0x73D6: 0xAB87, + 0x73D7: 0xAB88, + 0x73D8: 0xAB89, + 0x73D9: 0xE7EE, + 0x73DA: 0xAB8A, + 0x73DB: 0xAB8B, + 0x73DC: 0xAB8C, + 0x73DD: 0xAB8D, + 0x73DE: 0xE7F3, + 0x73DF: 0xAB8E, + 0x73E0: 0xD6E9, + 0x73E1: 0xAB8F, + 0x73E2: 0xAB90, + 0x73E3: 0xAB91, + 0x73E4: 0xAB92, + 0x73E5: 0xE7ED, + 0x73E6: 0xAB93, + 0x73E7: 0xE7F2, + 0x73E8: 0xAB94, + 0x73E9: 0xE7F1, + 0x73EA: 0xAB95, + 0x73EB: 0xAB96, + 0x73EC: 0xAB97, + 0x73ED: 0xB0E0, + 0x73EE: 0xAB98, + 0x73EF: 0xAB99, + 0x73F0: 0xAB9A, + 0x73F1: 0xAB9B, + 0x73F2: 0xE7F5, + 0x73F3: 0xAB9C, + 0x73F4: 0xAB9D, + 0x73F5: 0xAB9E, + 0x73F6: 0xAB9F, + 0x73F7: 0xABA0, + 0x73F8: 0xAC40, + 0x73F9: 0xAC41, + 0x73FA: 0xAC42, + 0x73FB: 0xAC43, + 0x73FC: 0xAC44, + 0x73FD: 0xAC45, + 0x73FE: 0xAC46, + 0x73FF: 0xAC47, + 0x7400: 0xAC48, + 0x7401: 0xAC49, + 0x7402: 0xAC4A, + 0x7403: 0xC7F2, + 0x7404: 0xAC4B, + 0x7405: 0xC0C5, + 0x7406: 0xC0ED, + 0x7407: 0xAC4C, + 0x7408: 0xAC4D, + 0x7409: 0xC1F0, + 0x740A: 0xE7F0, + 0x740B: 0xAC4E, + 0x740C: 0xAC4F, + 0x740D: 0xAC50, + 0x740E: 0xAC51, + 0x740F: 0xE7F6, + 0x7410: 0xCBF6, + 0x7411: 0xAC52, + 0x7412: 0xAC53, + 0x7413: 0xAC54, + 0x7414: 0xAC55, + 0x7415: 0xAC56, + 0x7416: 0xAC57, + 0x7417: 0xAC58, + 0x7418: 0xAC59, + 0x7419: 0xAC5A, + 0x741A: 0xE8A2, + 0x741B: 0xE8A1, + 0x741C: 0xAC5B, + 0x741D: 0xAC5C, + 0x741E: 0xAC5D, + 0x741F: 0xAC5E, + 0x7420: 0xAC5F, + 0x7421: 0xAC60, + 0x7422: 0xD7C1, + 0x7423: 0xAC61, + 0x7424: 0xAC62, + 0x7425: 0xE7FA, + 0x7426: 0xE7F9, + 0x7427: 0xAC63, + 0x7428: 0xE7FB, + 0x7429: 0xAC64, + 0x742A: 0xE7F7, + 0x742B: 0xAC65, + 0x742C: 0xE7FE, + 0x742D: 0xAC66, + 0x742E: 0xE7FD, + 0x742F: 0xAC67, + 0x7430: 0xE7FC, + 0x7431: 0xAC68, + 0x7432: 0xAC69, + 0x7433: 0xC1D5, + 0x7434: 0xC7D9, + 0x7435: 0xC5FD, + 0x7436: 0xC5C3, + 0x7437: 0xAC6A, + 0x7438: 0xAC6B, + 0x7439: 0xAC6C, + 0x743A: 0xAC6D, + 0x743B: 0xAC6E, + 0x743C: 0xC7ED, + 0x743D: 0xAC6F, + 0x743E: 0xAC70, + 0x743F: 0xAC71, + 0x7440: 0xAC72, + 0x7441: 0xE8A3, + 0x7442: 0xAC73, + 0x7443: 0xAC74, + 0x7444: 0xAC75, + 0x7445: 0xAC76, + 0x7446: 0xAC77, + 0x7447: 0xAC78, + 0x7448: 0xAC79, + 0x7449: 0xAC7A, + 0x744A: 0xAC7B, + 0x744B: 0xAC7C, + 0x744C: 0xAC7D, + 0x744D: 0xAC7E, + 0x744E: 0xAC80, + 0x744F: 0xAC81, + 0x7450: 0xAC82, + 0x7451: 0xAC83, + 0x7452: 0xAC84, + 0x7453: 0xAC85, + 0x7454: 0xAC86, + 0x7455: 0xE8A6, + 0x7456: 0xAC87, + 0x7457: 0xE8A5, + 0x7458: 0xAC88, + 0x7459: 0xE8A7, + 0x745A: 0xBAF7, + 0x745B: 0xE7F8, + 0x745C: 0xE8A4, + 0x745D: 0xAC89, + 0x745E: 0xC8F0, + 0x745F: 0xC9AA, + 0x7460: 0xAC8A, + 0x7461: 0xAC8B, + 0x7462: 0xAC8C, + 0x7463: 0xAC8D, + 0x7464: 0xAC8E, + 0x7465: 0xAC8F, + 0x7466: 0xAC90, + 0x7467: 0xAC91, + 0x7468: 0xAC92, + 0x7469: 0xAC93, + 0x746A: 0xAC94, + 0x746B: 0xAC95, + 0x746C: 0xAC96, + 0x746D: 0xE8A9, + 0x746E: 0xAC97, + 0x746F: 0xAC98, + 0x7470: 0xB9E5, + 0x7471: 0xAC99, + 0x7472: 0xAC9A, + 0x7473: 0xAC9B, + 0x7474: 0xAC9C, + 0x7475: 0xAC9D, + 0x7476: 0xD1FE, + 0x7477: 0xE8A8, + 0x7478: 0xAC9E, + 0x7479: 0xAC9F, + 0x747A: 0xACA0, + 0x747B: 0xAD40, + 0x747C: 0xAD41, + 0x747D: 0xAD42, + 0x747E: 0xE8AA, + 0x747F: 0xAD43, + 0x7480: 0xE8AD, + 0x7481: 0xE8AE, + 0x7482: 0xAD44, + 0x7483: 0xC1A7, + 0x7484: 0xAD45, + 0x7485: 0xAD46, + 0x7486: 0xAD47, + 0x7487: 0xE8AF, + 0x7488: 0xAD48, + 0x7489: 0xAD49, + 0x748A: 0xAD4A, + 0x748B: 0xE8B0, + 0x748C: 0xAD4B, + 0x748D: 0xAD4C, + 0x748E: 0xE8AC, + 0x748F: 0xAD4D, + 0x7490: 0xE8B4, + 0x7491: 0xAD4E, + 0x7492: 0xAD4F, + 0x7493: 0xAD50, + 0x7494: 0xAD51, + 0x7495: 0xAD52, + 0x7496: 0xAD53, + 0x7497: 0xAD54, + 0x7498: 0xAD55, + 0x7499: 0xAD56, + 0x749A: 0xAD57, + 0x749B: 0xAD58, + 0x749C: 0xE8AB, + 0x749D: 0xAD59, + 0x749E: 0xE8B1, + 0x749F: 0xAD5A, + 0x74A0: 0xAD5B, + 0x74A1: 0xAD5C, + 0x74A2: 0xAD5D, + 0x74A3: 0xAD5E, + 0x74A4: 0xAD5F, + 0x74A5: 0xAD60, + 0x74A6: 0xAD61, + 0x74A7: 0xE8B5, + 0x74A8: 0xE8B2, + 0x74A9: 0xE8B3, + 0x74AA: 0xAD62, + 0x74AB: 0xAD63, + 0x74AC: 0xAD64, + 0x74AD: 0xAD65, + 0x74AE: 0xAD66, + 0x74AF: 0xAD67, + 0x74B0: 0xAD68, + 0x74B1: 0xAD69, + 0x74B2: 0xAD6A, + 0x74B3: 0xAD6B, + 0x74B4: 0xAD6C, + 0x74B5: 0xAD6D, + 0x74B6: 0xAD6E, + 0x74B7: 0xAD6F, + 0x74B8: 0xAD70, + 0x74B9: 0xAD71, + 0x74BA: 0xE8B7, + 0x74BB: 0xAD72, + 0x74BC: 0xAD73, + 0x74BD: 0xAD74, + 0x74BE: 0xAD75, + 0x74BF: 0xAD76, + 0x74C0: 0xAD77, + 0x74C1: 0xAD78, + 0x74C2: 0xAD79, + 0x74C3: 0xAD7A, + 0x74C4: 0xAD7B, + 0x74C5: 0xAD7C, + 0x74C6: 0xAD7D, + 0x74C7: 0xAD7E, + 0x74C8: 0xAD80, + 0x74C9: 0xAD81, + 0x74CA: 0xAD82, + 0x74CB: 0xAD83, + 0x74CC: 0xAD84, + 0x74CD: 0xAD85, + 0x74CE: 0xAD86, + 0x74CF: 0xAD87, + 0x74D0: 0xAD88, + 0x74D1: 0xAD89, + 0x74D2: 0xE8B6, + 0x74D3: 0xAD8A, + 0x74D4: 0xAD8B, + 0x74D5: 0xAD8C, + 0x74D6: 0xAD8D, + 0x74D7: 0xAD8E, + 0x74D8: 0xAD8F, + 0x74D9: 0xAD90, + 0x74DA: 0xAD91, + 0x74DB: 0xAD92, + 0x74DC: 0xB9CF, + 0x74DD: 0xAD93, + 0x74DE: 0xF0AC, + 0x74DF: 0xAD94, + 0x74E0: 0xF0AD, + 0x74E1: 0xAD95, + 0x74E2: 0xC6B0, + 0x74E3: 0xB0EA, + 0x74E4: 0xC8BF, + 0x74E5: 0xAD96, + 0x74E6: 0xCDDF, + 0x74E7: 0xAD97, + 0x74E8: 0xAD98, + 0x74E9: 0xAD99, + 0x74EA: 0xAD9A, + 0x74EB: 0xAD9B, + 0x74EC: 0xAD9C, + 0x74ED: 0xAD9D, + 0x74EE: 0xCECD, + 0x74EF: 0xEAB1, + 0x74F0: 0xAD9E, + 0x74F1: 0xAD9F, + 0x74F2: 0xADA0, + 0x74F3: 0xAE40, + 0x74F4: 0xEAB2, + 0x74F5: 0xAE41, + 0x74F6: 0xC6BF, + 0x74F7: 0xB4C9, + 0x74F8: 0xAE42, + 0x74F9: 0xAE43, + 0x74FA: 0xAE44, + 0x74FB: 0xAE45, + 0x74FC: 0xAE46, + 0x74FD: 0xAE47, + 0x74FE: 0xAE48, + 0x74FF: 0xEAB3, + 0x7500: 0xAE49, + 0x7501: 0xAE4A, + 0x7502: 0xAE4B, + 0x7503: 0xAE4C, + 0x7504: 0xD5E7, + 0x7505: 0xAE4D, + 0x7506: 0xAE4E, + 0x7507: 0xAE4F, + 0x7508: 0xAE50, + 0x7509: 0xAE51, + 0x750A: 0xAE52, + 0x750B: 0xAE53, + 0x750C: 0xAE54, + 0x750D: 0xDDF9, + 0x750E: 0xAE55, + 0x750F: 0xEAB4, + 0x7510: 0xAE56, + 0x7511: 0xEAB5, + 0x7512: 0xAE57, + 0x7513: 0xEAB6, + 0x7514: 0xAE58, + 0x7515: 0xAE59, + 0x7516: 0xAE5A, + 0x7517: 0xAE5B, + 0x7518: 0xB8CA, + 0x7519: 0xDFB0, + 0x751A: 0xC9F5, + 0x751B: 0xAE5C, + 0x751C: 0xCCF0, + 0x751D: 0xAE5D, + 0x751E: 0xAE5E, + 0x751F: 0xC9FA, + 0x7520: 0xAE5F, + 0x7521: 0xAE60, + 0x7522: 0xAE61, + 0x7523: 0xAE62, + 0x7524: 0xAE63, + 0x7525: 0xC9FB, + 0x7526: 0xAE64, + 0x7527: 0xAE65, + 0x7528: 0xD3C3, + 0x7529: 0xCBA6, + 0x752A: 0xAE66, + 0x752B: 0xB8A6, + 0x752C: 0xF0AE, + 0x752D: 0xB1C2, + 0x752E: 0xAE67, + 0x752F: 0xE5B8, + 0x7530: 0xCCEF, + 0x7531: 0xD3C9, + 0x7532: 0xBCD7, + 0x7533: 0xC9EA, + 0x7534: 0xAE68, + 0x7535: 0xB5E7, + 0x7536: 0xAE69, + 0x7537: 0xC4D0, + 0x7538: 0xB5E9, + 0x7539: 0xAE6A, + 0x753A: 0xEEAE, + 0x753B: 0xBBAD, + 0x753C: 0xAE6B, + 0x753D: 0xAE6C, + 0x753E: 0xE7DE, + 0x753F: 0xAE6D, + 0x7540: 0xEEAF, + 0x7541: 0xAE6E, + 0x7542: 0xAE6F, + 0x7543: 0xAE70, + 0x7544: 0xAE71, + 0x7545: 0xB3A9, + 0x7546: 0xAE72, + 0x7547: 0xAE73, + 0x7548: 0xEEB2, + 0x7549: 0xAE74, + 0x754A: 0xAE75, + 0x754B: 0xEEB1, + 0x754C: 0xBDE7, + 0x754D: 0xAE76, + 0x754E: 0xEEB0, + 0x754F: 0xCEB7, + 0x7550: 0xAE77, + 0x7551: 0xAE78, + 0x7552: 0xAE79, + 0x7553: 0xAE7A, + 0x7554: 0xC5CF, + 0x7555: 0xAE7B, + 0x7556: 0xAE7C, + 0x7557: 0xAE7D, + 0x7558: 0xAE7E, + 0x7559: 0xC1F4, + 0x755A: 0xDBCE, + 0x755B: 0xEEB3, + 0x755C: 0xD0F3, + 0x755D: 0xAE80, + 0x755E: 0xAE81, + 0x755F: 0xAE82, + 0x7560: 0xAE83, + 0x7561: 0xAE84, + 0x7562: 0xAE85, + 0x7563: 0xAE86, + 0x7564: 0xAE87, + 0x7565: 0xC2D4, + 0x7566: 0xC6E8, + 0x7567: 0xAE88, + 0x7568: 0xAE89, + 0x7569: 0xAE8A, + 0x756A: 0xB7AC, + 0x756B: 0xAE8B, + 0x756C: 0xAE8C, + 0x756D: 0xAE8D, + 0x756E: 0xAE8E, + 0x756F: 0xAE8F, + 0x7570: 0xAE90, + 0x7571: 0xAE91, + 0x7572: 0xEEB4, + 0x7573: 0xAE92, + 0x7574: 0xB3EB, + 0x7575: 0xAE93, + 0x7576: 0xAE94, + 0x7577: 0xAE95, + 0x7578: 0xBBFB, + 0x7579: 0xEEB5, + 0x757A: 0xAE96, + 0x757B: 0xAE97, + 0x757C: 0xAE98, + 0x757D: 0xAE99, + 0x757E: 0xAE9A, + 0x757F: 0xE7DC, + 0x7580: 0xAE9B, + 0x7581: 0xAE9C, + 0x7582: 0xAE9D, + 0x7583: 0xEEB6, + 0x7584: 0xAE9E, + 0x7585: 0xAE9F, + 0x7586: 0xBDAE, + 0x7587: 0xAEA0, + 0x7588: 0xAF40, + 0x7589: 0xAF41, + 0x758A: 0xAF42, + 0x758B: 0xF1E2, + 0x758C: 0xAF43, + 0x758D: 0xAF44, + 0x758E: 0xAF45, + 0x758F: 0xCAE8, + 0x7590: 0xAF46, + 0x7591: 0xD2C9, + 0x7592: 0xF0DA, + 0x7593: 0xAF47, + 0x7594: 0xF0DB, + 0x7595: 0xAF48, + 0x7596: 0xF0DC, + 0x7597: 0xC1C6, + 0x7598: 0xAF49, + 0x7599: 0xB8ED, + 0x759A: 0xBECE, + 0x759B: 0xAF4A, + 0x759C: 0xAF4B, + 0x759D: 0xF0DE, + 0x759E: 0xAF4C, + 0x759F: 0xC5B1, + 0x75A0: 0xF0DD, + 0x75A1: 0xD1F1, + 0x75A2: 0xAF4D, + 0x75A3: 0xF0E0, + 0x75A4: 0xB0CC, + 0x75A5: 0xBDEA, + 0x75A6: 0xAF4E, + 0x75A7: 0xAF4F, + 0x75A8: 0xAF50, + 0x75A9: 0xAF51, + 0x75AA: 0xAF52, + 0x75AB: 0xD2DF, + 0x75AC: 0xF0DF, + 0x75AD: 0xAF53, + 0x75AE: 0xB4AF, + 0x75AF: 0xB7E8, + 0x75B0: 0xF0E6, + 0x75B1: 0xF0E5, + 0x75B2: 0xC6A3, + 0x75B3: 0xF0E1, + 0x75B4: 0xF0E2, + 0x75B5: 0xB4C3, + 0x75B6: 0xAF54, + 0x75B7: 0xAF55, + 0x75B8: 0xF0E3, + 0x75B9: 0xD5EE, + 0x75BA: 0xAF56, + 0x75BB: 0xAF57, + 0x75BC: 0xCCDB, + 0x75BD: 0xBED2, + 0x75BE: 0xBCB2, + 0x75BF: 0xAF58, + 0x75C0: 0xAF59, + 0x75C1: 0xAF5A, + 0x75C2: 0xF0E8, + 0x75C3: 0xF0E7, + 0x75C4: 0xF0E4, + 0x75C5: 0xB2A1, + 0x75C6: 0xAF5B, + 0x75C7: 0xD6A2, + 0x75C8: 0xD3B8, + 0x75C9: 0xBEB7, + 0x75CA: 0xC8AC, + 0x75CB: 0xAF5C, + 0x75CC: 0xAF5D, + 0x75CD: 0xF0EA, + 0x75CE: 0xAF5E, + 0x75CF: 0xAF5F, + 0x75D0: 0xAF60, + 0x75D1: 0xAF61, + 0x75D2: 0xD1F7, + 0x75D3: 0xAF62, + 0x75D4: 0xD6CC, + 0x75D5: 0xBADB, + 0x75D6: 0xF0E9, + 0x75D7: 0xAF63, + 0x75D8: 0xB6BB, + 0x75D9: 0xAF64, + 0x75DA: 0xAF65, + 0x75DB: 0xCDB4, + 0x75DC: 0xAF66, + 0x75DD: 0xAF67, + 0x75DE: 0xC6A6, + 0x75DF: 0xAF68, + 0x75E0: 0xAF69, + 0x75E1: 0xAF6A, + 0x75E2: 0xC1A1, + 0x75E3: 0xF0EB, + 0x75E4: 0xF0EE, + 0x75E5: 0xAF6B, + 0x75E6: 0xF0ED, + 0x75E7: 0xF0F0, + 0x75E8: 0xF0EC, + 0x75E9: 0xAF6C, + 0x75EA: 0xBBBE, + 0x75EB: 0xF0EF, + 0x75EC: 0xAF6D, + 0x75ED: 0xAF6E, + 0x75EE: 0xAF6F, + 0x75EF: 0xAF70, + 0x75F0: 0xCCB5, + 0x75F1: 0xF0F2, + 0x75F2: 0xAF71, + 0x75F3: 0xAF72, + 0x75F4: 0xB3D5, + 0x75F5: 0xAF73, + 0x75F6: 0xAF74, + 0x75F7: 0xAF75, + 0x75F8: 0xAF76, + 0x75F9: 0xB1D4, + 0x75FA: 0xAF77, + 0x75FB: 0xAF78, + 0x75FC: 0xF0F3, + 0x75FD: 0xAF79, + 0x75FE: 0xAF7A, + 0x75FF: 0xF0F4, + 0x7600: 0xF0F6, + 0x7601: 0xB4E1, + 0x7602: 0xAF7B, + 0x7603: 0xF0F1, + 0x7604: 0xAF7C, + 0x7605: 0xF0F7, + 0x7606: 0xAF7D, + 0x7607: 0xAF7E, + 0x7608: 0xAF80, + 0x7609: 0xAF81, + 0x760A: 0xF0FA, + 0x760B: 0xAF82, + 0x760C: 0xF0F8, + 0x760D: 0xAF83, + 0x760E: 0xAF84, + 0x760F: 0xAF85, + 0x7610: 0xF0F5, + 0x7611: 0xAF86, + 0x7612: 0xAF87, + 0x7613: 0xAF88, + 0x7614: 0xAF89, + 0x7615: 0xF0FD, + 0x7616: 0xAF8A, + 0x7617: 0xF0F9, + 0x7618: 0xF0FC, + 0x7619: 0xF0FE, + 0x761A: 0xAF8B, + 0x761B: 0xF1A1, + 0x761C: 0xAF8C, + 0x761D: 0xAF8D, + 0x761E: 0xAF8E, + 0x761F: 0xCEC1, + 0x7620: 0xF1A4, + 0x7621: 0xAF8F, + 0x7622: 0xF1A3, + 0x7623: 0xAF90, + 0x7624: 0xC1F6, + 0x7625: 0xF0FB, + 0x7626: 0xCADD, + 0x7627: 0xAF91, + 0x7628: 0xAF92, + 0x7629: 0xB4F1, + 0x762A: 0xB1F1, + 0x762B: 0xCCB1, + 0x762C: 0xAF93, + 0x762D: 0xF1A6, + 0x762E: 0xAF94, + 0x762F: 0xAF95, + 0x7630: 0xF1A7, + 0x7631: 0xAF96, + 0x7632: 0xAF97, + 0x7633: 0xF1AC, + 0x7634: 0xD5CE, + 0x7635: 0xF1A9, + 0x7636: 0xAF98, + 0x7637: 0xAF99, + 0x7638: 0xC8B3, + 0x7639: 0xAF9A, + 0x763A: 0xAF9B, + 0x763B: 0xAF9C, + 0x763C: 0xF1A2, + 0x763D: 0xAF9D, + 0x763E: 0xF1AB, + 0x763F: 0xF1A8, + 0x7640: 0xF1A5, + 0x7641: 0xAF9E, + 0x7642: 0xAF9F, + 0x7643: 0xF1AA, + 0x7644: 0xAFA0, + 0x7645: 0xB040, + 0x7646: 0xB041, + 0x7647: 0xB042, + 0x7648: 0xB043, + 0x7649: 0xB044, + 0x764A: 0xB045, + 0x764B: 0xB046, + 0x764C: 0xB0A9, + 0x764D: 0xF1AD, + 0x764E: 0xB047, + 0x764F: 0xB048, + 0x7650: 0xB049, + 0x7651: 0xB04A, + 0x7652: 0xB04B, + 0x7653: 0xB04C, + 0x7654: 0xF1AF, + 0x7655: 0xB04D, + 0x7656: 0xF1B1, + 0x7657: 0xB04E, + 0x7658: 0xB04F, + 0x7659: 0xB050, + 0x765A: 0xB051, + 0x765B: 0xB052, + 0x765C: 0xF1B0, + 0x765D: 0xB053, + 0x765E: 0xF1AE, + 0x765F: 0xB054, + 0x7660: 0xB055, + 0x7661: 0xB056, + 0x7662: 0xB057, + 0x7663: 0xD1A2, + 0x7664: 0xB058, + 0x7665: 0xB059, + 0x7666: 0xB05A, + 0x7667: 0xB05B, + 0x7668: 0xB05C, + 0x7669: 0xB05D, + 0x766A: 0xB05E, + 0x766B: 0xF1B2, + 0x766C: 0xB05F, + 0x766D: 0xB060, + 0x766E: 0xB061, + 0x766F: 0xF1B3, + 0x7670: 0xB062, + 0x7671: 0xB063, + 0x7672: 0xB064, + 0x7673: 0xB065, + 0x7674: 0xB066, + 0x7675: 0xB067, + 0x7676: 0xB068, + 0x7677: 0xB069, + 0x7678: 0xB9EF, + 0x7679: 0xB06A, + 0x767A: 0xB06B, + 0x767B: 0xB5C7, + 0x767C: 0xB06C, + 0x767D: 0xB0D7, + 0x767E: 0xB0D9, + 0x767F: 0xB06D, + 0x7680: 0xB06E, + 0x7681: 0xB06F, + 0x7682: 0xD4ED, + 0x7683: 0xB070, + 0x7684: 0xB5C4, + 0x7685: 0xB071, + 0x7686: 0xBDD4, + 0x7687: 0xBBCA, + 0x7688: 0xF0A7, + 0x7689: 0xB072, + 0x768A: 0xB073, + 0x768B: 0xB8DE, + 0x768C: 0xB074, + 0x768D: 0xB075, + 0x768E: 0xF0A8, + 0x768F: 0xB076, + 0x7690: 0xB077, + 0x7691: 0xB0A8, + 0x7692: 0xB078, + 0x7693: 0xF0A9, + 0x7694: 0xB079, + 0x7695: 0xB07A, + 0x7696: 0xCDEE, + 0x7697: 0xB07B, + 0x7698: 0xB07C, + 0x7699: 0xF0AA, + 0x769A: 0xB07D, + 0x769B: 0xB07E, + 0x769C: 0xB080, + 0x769D: 0xB081, + 0x769E: 0xB082, + 0x769F: 0xB083, + 0x76A0: 0xB084, + 0x76A1: 0xB085, + 0x76A2: 0xB086, + 0x76A3: 0xB087, + 0x76A4: 0xF0AB, + 0x76A5: 0xB088, + 0x76A6: 0xB089, + 0x76A7: 0xB08A, + 0x76A8: 0xB08B, + 0x76A9: 0xB08C, + 0x76AA: 0xB08D, + 0x76AB: 0xB08E, + 0x76AC: 0xB08F, + 0x76AD: 0xB090, + 0x76AE: 0xC6A4, + 0x76AF: 0xB091, + 0x76B0: 0xB092, + 0x76B1: 0xD6E5, + 0x76B2: 0xF1E4, + 0x76B3: 0xB093, + 0x76B4: 0xF1E5, + 0x76B5: 0xB094, + 0x76B6: 0xB095, + 0x76B7: 0xB096, + 0x76B8: 0xB097, + 0x76B9: 0xB098, + 0x76BA: 0xB099, + 0x76BB: 0xB09A, + 0x76BC: 0xB09B, + 0x76BD: 0xB09C, + 0x76BE: 0xB09D, + 0x76BF: 0xC3F3, + 0x76C0: 0xB09E, + 0x76C1: 0xB09F, + 0x76C2: 0xD3DB, + 0x76C3: 0xB0A0, + 0x76C4: 0xB140, + 0x76C5: 0xD6D1, + 0x76C6: 0xC5E8, + 0x76C7: 0xB141, + 0x76C8: 0xD3AF, + 0x76C9: 0xB142, + 0x76CA: 0xD2E6, + 0x76CB: 0xB143, + 0x76CC: 0xB144, + 0x76CD: 0xEEC1, + 0x76CE: 0xB0BB, + 0x76CF: 0xD5B5, + 0x76D0: 0xD1CE, + 0x76D1: 0xBCE0, + 0x76D2: 0xBAD0, + 0x76D3: 0xB145, + 0x76D4: 0xBFF8, + 0x76D5: 0xB146, + 0x76D6: 0xB8C7, + 0x76D7: 0xB5C1, + 0x76D8: 0xC5CC, + 0x76D9: 0xB147, + 0x76DA: 0xB148, + 0x76DB: 0xCAA2, + 0x76DC: 0xB149, + 0x76DD: 0xB14A, + 0x76DE: 0xB14B, + 0x76DF: 0xC3CB, + 0x76E0: 0xB14C, + 0x76E1: 0xB14D, + 0x76E2: 0xB14E, + 0x76E3: 0xB14F, + 0x76E4: 0xB150, + 0x76E5: 0xEEC2, + 0x76E6: 0xB151, + 0x76E7: 0xB152, + 0x76E8: 0xB153, + 0x76E9: 0xB154, + 0x76EA: 0xB155, + 0x76EB: 0xB156, + 0x76EC: 0xB157, + 0x76ED: 0xB158, + 0x76EE: 0xC4BF, + 0x76EF: 0xB6A2, + 0x76F0: 0xB159, + 0x76F1: 0xEDEC, + 0x76F2: 0xC3A4, + 0x76F3: 0xB15A, + 0x76F4: 0xD6B1, + 0x76F5: 0xB15B, + 0x76F6: 0xB15C, + 0x76F7: 0xB15D, + 0x76F8: 0xCFE0, + 0x76F9: 0xEDEF, + 0x76FA: 0xB15E, + 0x76FB: 0xB15F, + 0x76FC: 0xC5CE, + 0x76FD: 0xB160, + 0x76FE: 0xB6DC, + 0x76FF: 0xB161, + 0x7700: 0xB162, + 0x7701: 0xCAA1, + 0x7702: 0xB163, + 0x7703: 0xB164, + 0x7704: 0xEDED, + 0x7705: 0xB165, + 0x7706: 0xB166, + 0x7707: 0xEDF0, + 0x7708: 0xEDF1, + 0x7709: 0xC3BC, + 0x770A: 0xB167, + 0x770B: 0xBFB4, + 0x770C: 0xB168, + 0x770D: 0xEDEE, + 0x770E: 0xB169, + 0x770F: 0xB16A, + 0x7710: 0xB16B, + 0x7711: 0xB16C, + 0x7712: 0xB16D, + 0x7713: 0xB16E, + 0x7714: 0xB16F, + 0x7715: 0xB170, + 0x7716: 0xB171, + 0x7717: 0xB172, + 0x7718: 0xB173, + 0x7719: 0xEDF4, + 0x771A: 0xEDF2, + 0x771B: 0xB174, + 0x771C: 0xB175, + 0x771D: 0xB176, + 0x771E: 0xB177, + 0x771F: 0xD5E6, + 0x7720: 0xC3DF, + 0x7721: 0xB178, + 0x7722: 0xEDF3, + 0x7723: 0xB179, + 0x7724: 0xB17A, + 0x7725: 0xB17B, + 0x7726: 0xEDF6, + 0x7727: 0xB17C, + 0x7728: 0xD5A3, + 0x7729: 0xD1A3, + 0x772A: 0xB17D, + 0x772B: 0xB17E, + 0x772C: 0xB180, + 0x772D: 0xEDF5, + 0x772E: 0xB181, + 0x772F: 0xC3D0, + 0x7730: 0xB182, + 0x7731: 0xB183, + 0x7732: 0xB184, + 0x7733: 0xB185, + 0x7734: 0xB186, + 0x7735: 0xEDF7, + 0x7736: 0xBFF4, + 0x7737: 0xBEEC, + 0x7738: 0xEDF8, + 0x7739: 0xB187, + 0x773A: 0xCCF7, + 0x773B: 0xB188, + 0x773C: 0xD1DB, + 0x773D: 0xB189, + 0x773E: 0xB18A, + 0x773F: 0xB18B, + 0x7740: 0xD7C5, + 0x7741: 0xD5F6, + 0x7742: 0xB18C, + 0x7743: 0xEDFC, + 0x7744: 0xB18D, + 0x7745: 0xB18E, + 0x7746: 0xB18F, + 0x7747: 0xEDFB, + 0x7748: 0xB190, + 0x7749: 0xB191, + 0x774A: 0xB192, + 0x774B: 0xB193, + 0x774C: 0xB194, + 0x774D: 0xB195, + 0x774E: 0xB196, + 0x774F: 0xB197, + 0x7750: 0xEDF9, + 0x7751: 0xEDFA, + 0x7752: 0xB198, + 0x7753: 0xB199, + 0x7754: 0xB19A, + 0x7755: 0xB19B, + 0x7756: 0xB19C, + 0x7757: 0xB19D, + 0x7758: 0xB19E, + 0x7759: 0xB19F, + 0x775A: 0xEDFD, + 0x775B: 0xBEA6, + 0x775C: 0xB1A0, + 0x775D: 0xB240, + 0x775E: 0xB241, + 0x775F: 0xB242, + 0x7760: 0xB243, + 0x7761: 0xCBAF, + 0x7762: 0xEEA1, + 0x7763: 0xB6BD, + 0x7764: 0xB244, + 0x7765: 0xEEA2, + 0x7766: 0xC4C0, + 0x7767: 0xB245, + 0x7768: 0xEDFE, + 0x7769: 0xB246, + 0x776A: 0xB247, + 0x776B: 0xBDDE, + 0x776C: 0xB2C7, + 0x776D: 0xB248, + 0x776E: 0xB249, + 0x776F: 0xB24A, + 0x7770: 0xB24B, + 0x7771: 0xB24C, + 0x7772: 0xB24D, + 0x7773: 0xB24E, + 0x7774: 0xB24F, + 0x7775: 0xB250, + 0x7776: 0xB251, + 0x7777: 0xB252, + 0x7778: 0xB253, + 0x7779: 0xB6C3, + 0x777A: 0xB254, + 0x777B: 0xB255, + 0x777C: 0xB256, + 0x777D: 0xEEA5, + 0x777E: 0xD8BA, + 0x777F: 0xEEA3, + 0x7780: 0xEEA6, + 0x7781: 0xB257, + 0x7782: 0xB258, + 0x7783: 0xB259, + 0x7784: 0xC3E9, + 0x7785: 0xB3F2, + 0x7786: 0xB25A, + 0x7787: 0xB25B, + 0x7788: 0xB25C, + 0x7789: 0xB25D, + 0x778A: 0xB25E, + 0x778B: 0xB25F, + 0x778C: 0xEEA7, + 0x778D: 0xEEA4, + 0x778E: 0xCFB9, + 0x778F: 0xB260, + 0x7790: 0xB261, + 0x7791: 0xEEA8, + 0x7792: 0xC2F7, + 0x7793: 0xB262, + 0x7794: 0xB263, + 0x7795: 0xB264, + 0x7796: 0xB265, + 0x7797: 0xB266, + 0x7798: 0xB267, + 0x7799: 0xB268, + 0x779A: 0xB269, + 0x779B: 0xB26A, + 0x779C: 0xB26B, + 0x779D: 0xB26C, + 0x779E: 0xB26D, + 0x779F: 0xEEA9, + 0x77A0: 0xEEAA, + 0x77A1: 0xB26E, + 0x77A2: 0xDEAB, + 0x77A3: 0xB26F, + 0x77A4: 0xB270, + 0x77A5: 0xC6B3, + 0x77A6: 0xB271, + 0x77A7: 0xC7C6, + 0x77A8: 0xB272, + 0x77A9: 0xD6F5, + 0x77AA: 0xB5C9, + 0x77AB: 0xB273, + 0x77AC: 0xCBB2, + 0x77AD: 0xB274, + 0x77AE: 0xB275, + 0x77AF: 0xB276, + 0x77B0: 0xEEAB, + 0x77B1: 0xB277, + 0x77B2: 0xB278, + 0x77B3: 0xCDAB, + 0x77B4: 0xB279, + 0x77B5: 0xEEAC, + 0x77B6: 0xB27A, + 0x77B7: 0xB27B, + 0x77B8: 0xB27C, + 0x77B9: 0xB27D, + 0x77BA: 0xB27E, + 0x77BB: 0xD5B0, + 0x77BC: 0xB280, + 0x77BD: 0xEEAD, + 0x77BE: 0xB281, + 0x77BF: 0xF6C4, + 0x77C0: 0xB282, + 0x77C1: 0xB283, + 0x77C2: 0xB284, + 0x77C3: 0xB285, + 0x77C4: 0xB286, + 0x77C5: 0xB287, + 0x77C6: 0xB288, + 0x77C7: 0xB289, + 0x77C8: 0xB28A, + 0x77C9: 0xB28B, + 0x77CA: 0xB28C, + 0x77CB: 0xB28D, + 0x77CC: 0xB28E, + 0x77CD: 0xDBC7, + 0x77CE: 0xB28F, + 0x77CF: 0xB290, + 0x77D0: 0xB291, + 0x77D1: 0xB292, + 0x77D2: 0xB293, + 0x77D3: 0xB294, + 0x77D4: 0xB295, + 0x77D5: 0xB296, + 0x77D6: 0xB297, + 0x77D7: 0xB4A3, + 0x77D8: 0xB298, + 0x77D9: 0xB299, + 0x77DA: 0xB29A, + 0x77DB: 0xC3AC, + 0x77DC: 0xF1E6, + 0x77DD: 0xB29B, + 0x77DE: 0xB29C, + 0x77DF: 0xB29D, + 0x77E0: 0xB29E, + 0x77E1: 0xB29F, + 0x77E2: 0xCAB8, + 0x77E3: 0xD2D3, + 0x77E4: 0xB2A0, + 0x77E5: 0xD6AA, + 0x77E6: 0xB340, + 0x77E7: 0xEFF2, + 0x77E8: 0xB341, + 0x77E9: 0xBED8, + 0x77EA: 0xB342, + 0x77EB: 0xBDC3, + 0x77EC: 0xEFF3, + 0x77ED: 0xB6CC, + 0x77EE: 0xB0AB, + 0x77EF: 0xB343, + 0x77F0: 0xB344, + 0x77F1: 0xB345, + 0x77F2: 0xB346, + 0x77F3: 0xCAAF, + 0x77F4: 0xB347, + 0x77F5: 0xB348, + 0x77F6: 0xEDB6, + 0x77F7: 0xB349, + 0x77F8: 0xEDB7, + 0x77F9: 0xB34A, + 0x77FA: 0xB34B, + 0x77FB: 0xB34C, + 0x77FC: 0xB34D, + 0x77FD: 0xCEF9, + 0x77FE: 0xB7AF, + 0x77FF: 0xBFF3, + 0x7800: 0xEDB8, + 0x7801: 0xC2EB, + 0x7802: 0xC9B0, + 0x7803: 0xB34E, + 0x7804: 0xB34F, + 0x7805: 0xB350, + 0x7806: 0xB351, + 0x7807: 0xB352, + 0x7808: 0xB353, + 0x7809: 0xEDB9, + 0x780A: 0xB354, + 0x780B: 0xB355, + 0x780C: 0xC6F6, + 0x780D: 0xBFB3, + 0x780E: 0xB356, + 0x780F: 0xB357, + 0x7810: 0xB358, + 0x7811: 0xEDBC, + 0x7812: 0xC5F8, + 0x7813: 0xB359, + 0x7814: 0xD1D0, + 0x7815: 0xB35A, + 0x7816: 0xD7A9, + 0x7817: 0xEDBA, + 0x7818: 0xEDBB, + 0x7819: 0xB35B, + 0x781A: 0xD1E2, + 0x781B: 0xB35C, + 0x781C: 0xEDBF, + 0x781D: 0xEDC0, + 0x781E: 0xB35D, + 0x781F: 0xEDC4, + 0x7820: 0xB35E, + 0x7821: 0xB35F, + 0x7822: 0xB360, + 0x7823: 0xEDC8, + 0x7824: 0xB361, + 0x7825: 0xEDC6, + 0x7826: 0xEDCE, + 0x7827: 0xD5E8, + 0x7828: 0xB362, + 0x7829: 0xEDC9, + 0x782A: 0xB363, + 0x782B: 0xB364, + 0x782C: 0xEDC7, + 0x782D: 0xEDBE, + 0x782E: 0xB365, + 0x782F: 0xB366, + 0x7830: 0xC5E9, + 0x7831: 0xB367, + 0x7832: 0xB368, + 0x7833: 0xB369, + 0x7834: 0xC6C6, + 0x7835: 0xB36A, + 0x7836: 0xB36B, + 0x7837: 0xC9E9, + 0x7838: 0xD4D2, + 0x7839: 0xEDC1, + 0x783A: 0xEDC2, + 0x783B: 0xEDC3, + 0x783C: 0xEDC5, + 0x783D: 0xB36C, + 0x783E: 0xC0F9, + 0x783F: 0xB36D, + 0x7840: 0xB4A1, + 0x7841: 0xB36E, + 0x7842: 0xB36F, + 0x7843: 0xB370, + 0x7844: 0xB371, + 0x7845: 0xB9E8, + 0x7846: 0xB372, + 0x7847: 0xEDD0, + 0x7848: 0xB373, + 0x7849: 0xB374, + 0x784A: 0xB375, + 0x784B: 0xB376, + 0x784C: 0xEDD1, + 0x784D: 0xB377, + 0x784E: 0xEDCA, + 0x784F: 0xB378, + 0x7850: 0xEDCF, + 0x7851: 0xB379, + 0x7852: 0xCEF8, + 0x7853: 0xB37A, + 0x7854: 0xB37B, + 0x7855: 0xCBB6, + 0x7856: 0xEDCC, + 0x7857: 0xEDCD, + 0x7858: 0xB37C, + 0x7859: 0xB37D, + 0x785A: 0xB37E, + 0x785B: 0xB380, + 0x785C: 0xB381, + 0x785D: 0xCFF5, + 0x785E: 0xB382, + 0x785F: 0xB383, + 0x7860: 0xB384, + 0x7861: 0xB385, + 0x7862: 0xB386, + 0x7863: 0xB387, + 0x7864: 0xB388, + 0x7865: 0xB389, + 0x7866: 0xB38A, + 0x7867: 0xB38B, + 0x7868: 0xB38C, + 0x7869: 0xB38D, + 0x786A: 0xEDD2, + 0x786B: 0xC1F2, + 0x786C: 0xD3B2, + 0x786D: 0xEDCB, + 0x786E: 0xC8B7, + 0x786F: 0xB38E, + 0x7870: 0xB38F, + 0x7871: 0xB390, + 0x7872: 0xB391, + 0x7873: 0xB392, + 0x7874: 0xB393, + 0x7875: 0xB394, + 0x7876: 0xB395, + 0x7877: 0xBCEF, + 0x7878: 0xB396, + 0x7879: 0xB397, + 0x787A: 0xB398, + 0x787B: 0xB399, + 0x787C: 0xC5F0, + 0x787D: 0xB39A, + 0x787E: 0xB39B, + 0x787F: 0xB39C, + 0x7880: 0xB39D, + 0x7881: 0xB39E, + 0x7882: 0xB39F, + 0x7883: 0xB3A0, + 0x7884: 0xB440, + 0x7885: 0xB441, + 0x7886: 0xB442, + 0x7887: 0xEDD6, + 0x7888: 0xB443, + 0x7889: 0xB5EF, + 0x788A: 0xB444, + 0x788B: 0xB445, + 0x788C: 0xC2B5, + 0x788D: 0xB0AD, + 0x788E: 0xCBE9, + 0x788F: 0xB446, + 0x7890: 0xB447, + 0x7891: 0xB1AE, + 0x7892: 0xB448, + 0x7893: 0xEDD4, + 0x7894: 0xB449, + 0x7895: 0xB44A, + 0x7896: 0xB44B, + 0x7897: 0xCDEB, + 0x7898: 0xB5E2, + 0x7899: 0xB44C, + 0x789A: 0xEDD5, + 0x789B: 0xEDD3, + 0x789C: 0xEDD7, + 0x789D: 0xB44D, + 0x789E: 0xB44E, + 0x789F: 0xB5FA, + 0x78A0: 0xB44F, + 0x78A1: 0xEDD8, + 0x78A2: 0xB450, + 0x78A3: 0xEDD9, + 0x78A4: 0xB451, + 0x78A5: 0xEDDC, + 0x78A6: 0xB452, + 0x78A7: 0xB1CC, + 0x78A8: 0xB453, + 0x78A9: 0xB454, + 0x78AA: 0xB455, + 0x78AB: 0xB456, + 0x78AC: 0xB457, + 0x78AD: 0xB458, + 0x78AE: 0xB459, + 0x78AF: 0xB45A, + 0x78B0: 0xC5F6, + 0x78B1: 0xBCEE, + 0x78B2: 0xEDDA, + 0x78B3: 0xCCBC, + 0x78B4: 0xB2EA, + 0x78B5: 0xB45B, + 0x78B6: 0xB45C, + 0x78B7: 0xB45D, + 0x78B8: 0xB45E, + 0x78B9: 0xEDDB, + 0x78BA: 0xB45F, + 0x78BB: 0xB460, + 0x78BC: 0xB461, + 0x78BD: 0xB462, + 0x78BE: 0xC4EB, + 0x78BF: 0xB463, + 0x78C0: 0xB464, + 0x78C1: 0xB4C5, + 0x78C2: 0xB465, + 0x78C3: 0xB466, + 0x78C4: 0xB467, + 0x78C5: 0xB0F5, + 0x78C6: 0xB468, + 0x78C7: 0xB469, + 0x78C8: 0xB46A, + 0x78C9: 0xEDDF, + 0x78CA: 0xC0DA, + 0x78CB: 0xB4E8, + 0x78CC: 0xB46B, + 0x78CD: 0xB46C, + 0x78CE: 0xB46D, + 0x78CF: 0xB46E, + 0x78D0: 0xC5CD, + 0x78D1: 0xB46F, + 0x78D2: 0xB470, + 0x78D3: 0xB471, + 0x78D4: 0xEDDD, + 0x78D5: 0xBFC4, + 0x78D6: 0xB472, + 0x78D7: 0xB473, + 0x78D8: 0xB474, + 0x78D9: 0xEDDE, + 0x78DA: 0xB475, + 0x78DB: 0xB476, + 0x78DC: 0xB477, + 0x78DD: 0xB478, + 0x78DE: 0xB479, + 0x78DF: 0xB47A, + 0x78E0: 0xB47B, + 0x78E1: 0xB47C, + 0x78E2: 0xB47D, + 0x78E3: 0xB47E, + 0x78E4: 0xB480, + 0x78E5: 0xB481, + 0x78E6: 0xB482, + 0x78E7: 0xB483, + 0x78E8: 0xC4A5, + 0x78E9: 0xB484, + 0x78EA: 0xB485, + 0x78EB: 0xB486, + 0x78EC: 0xEDE0, + 0x78ED: 0xB487, + 0x78EE: 0xB488, + 0x78EF: 0xB489, + 0x78F0: 0xB48A, + 0x78F1: 0xB48B, + 0x78F2: 0xEDE1, + 0x78F3: 0xB48C, + 0x78F4: 0xEDE3, + 0x78F5: 0xB48D, + 0x78F6: 0xB48E, + 0x78F7: 0xC1D7, + 0x78F8: 0xB48F, + 0x78F9: 0xB490, + 0x78FA: 0xBBC7, + 0x78FB: 0xB491, + 0x78FC: 0xB492, + 0x78FD: 0xB493, + 0x78FE: 0xB494, + 0x78FF: 0xB495, + 0x7900: 0xB496, + 0x7901: 0xBDB8, + 0x7902: 0xB497, + 0x7903: 0xB498, + 0x7904: 0xB499, + 0x7905: 0xEDE2, + 0x7906: 0xB49A, + 0x7907: 0xB49B, + 0x7908: 0xB49C, + 0x7909: 0xB49D, + 0x790A: 0xB49E, + 0x790B: 0xB49F, + 0x790C: 0xB4A0, + 0x790D: 0xB540, + 0x790E: 0xB541, + 0x790F: 0xB542, + 0x7910: 0xB543, + 0x7911: 0xB544, + 0x7912: 0xB545, + 0x7913: 0xEDE4, + 0x7914: 0xB546, + 0x7915: 0xB547, + 0x7916: 0xB548, + 0x7917: 0xB549, + 0x7918: 0xB54A, + 0x7919: 0xB54B, + 0x791A: 0xB54C, + 0x791B: 0xB54D, + 0x791C: 0xB54E, + 0x791D: 0xB54F, + 0x791E: 0xEDE6, + 0x791F: 0xB550, + 0x7920: 0xB551, + 0x7921: 0xB552, + 0x7922: 0xB553, + 0x7923: 0xB554, + 0x7924: 0xEDE5, + 0x7925: 0xB555, + 0x7926: 0xB556, + 0x7927: 0xB557, + 0x7928: 0xB558, + 0x7929: 0xB559, + 0x792A: 0xB55A, + 0x792B: 0xB55B, + 0x792C: 0xB55C, + 0x792D: 0xB55D, + 0x792E: 0xB55E, + 0x792F: 0xB55F, + 0x7930: 0xB560, + 0x7931: 0xB561, + 0x7932: 0xB562, + 0x7933: 0xB563, + 0x7934: 0xEDE7, + 0x7935: 0xB564, + 0x7936: 0xB565, + 0x7937: 0xB566, + 0x7938: 0xB567, + 0x7939: 0xB568, + 0x793A: 0xCABE, + 0x793B: 0xECEA, + 0x793C: 0xC0F1, + 0x793D: 0xB569, + 0x793E: 0xC9E7, + 0x793F: 0xB56A, + 0x7940: 0xECEB, + 0x7941: 0xC6EE, + 0x7942: 0xB56B, + 0x7943: 0xB56C, + 0x7944: 0xB56D, + 0x7945: 0xB56E, + 0x7946: 0xECEC, + 0x7947: 0xB56F, + 0x7948: 0xC6ED, + 0x7949: 0xECED, + 0x794A: 0xB570, + 0x794B: 0xB571, + 0x794C: 0xB572, + 0x794D: 0xB573, + 0x794E: 0xB574, + 0x794F: 0xB575, + 0x7950: 0xB576, + 0x7951: 0xB577, + 0x7952: 0xB578, + 0x7953: 0xECF0, + 0x7954: 0xB579, + 0x7955: 0xB57A, + 0x7956: 0xD7E6, + 0x7957: 0xECF3, + 0x7958: 0xB57B, + 0x7959: 0xB57C, + 0x795A: 0xECF1, + 0x795B: 0xECEE, + 0x795C: 0xECEF, + 0x795D: 0xD7A3, + 0x795E: 0xC9F1, + 0x795F: 0xCBEE, + 0x7960: 0xECF4, + 0x7961: 0xB57D, + 0x7962: 0xECF2, + 0x7963: 0xB57E, + 0x7964: 0xB580, + 0x7965: 0xCFE9, + 0x7966: 0xB581, + 0x7967: 0xECF6, + 0x7968: 0xC6B1, + 0x7969: 0xB582, + 0x796A: 0xB583, + 0x796B: 0xB584, + 0x796C: 0xB585, + 0x796D: 0xBCC0, + 0x796E: 0xB586, + 0x796F: 0xECF5, + 0x7970: 0xB587, + 0x7971: 0xB588, + 0x7972: 0xB589, + 0x7973: 0xB58A, + 0x7974: 0xB58B, + 0x7975: 0xB58C, + 0x7976: 0xB58D, + 0x7977: 0xB5BB, + 0x7978: 0xBBF6, + 0x7979: 0xB58E, + 0x797A: 0xECF7, + 0x797B: 0xB58F, + 0x797C: 0xB590, + 0x797D: 0xB591, + 0x797E: 0xB592, + 0x797F: 0xB593, + 0x7980: 0xD9F7, + 0x7981: 0xBDFB, + 0x7982: 0xB594, + 0x7983: 0xB595, + 0x7984: 0xC2BB, + 0x7985: 0xECF8, + 0x7986: 0xB596, + 0x7987: 0xB597, + 0x7988: 0xB598, + 0x7989: 0xB599, + 0x798A: 0xECF9, + 0x798B: 0xB59A, + 0x798C: 0xB59B, + 0x798D: 0xB59C, + 0x798E: 0xB59D, + 0x798F: 0xB8A3, + 0x7990: 0xB59E, + 0x7991: 0xB59F, + 0x7992: 0xB5A0, + 0x7993: 0xB640, + 0x7994: 0xB641, + 0x7995: 0xB642, + 0x7996: 0xB643, + 0x7997: 0xB644, + 0x7998: 0xB645, + 0x7999: 0xB646, + 0x799A: 0xECFA, + 0x799B: 0xB647, + 0x799C: 0xB648, + 0x799D: 0xB649, + 0x799E: 0xB64A, + 0x799F: 0xB64B, + 0x79A0: 0xB64C, + 0x79A1: 0xB64D, + 0x79A2: 0xB64E, + 0x79A3: 0xB64F, + 0x79A4: 0xB650, + 0x79A5: 0xB651, + 0x79A6: 0xB652, + 0x79A7: 0xECFB, + 0x79A8: 0xB653, + 0x79A9: 0xB654, + 0x79AA: 0xB655, + 0x79AB: 0xB656, + 0x79AC: 0xB657, + 0x79AD: 0xB658, + 0x79AE: 0xB659, + 0x79AF: 0xB65A, + 0x79B0: 0xB65B, + 0x79B1: 0xB65C, + 0x79B2: 0xB65D, + 0x79B3: 0xECFC, + 0x79B4: 0xB65E, + 0x79B5: 0xB65F, + 0x79B6: 0xB660, + 0x79B7: 0xB661, + 0x79B8: 0xB662, + 0x79B9: 0xD3ED, + 0x79BA: 0xD8AE, + 0x79BB: 0xC0EB, + 0x79BC: 0xB663, + 0x79BD: 0xC7DD, + 0x79BE: 0xBACC, + 0x79BF: 0xB664, + 0x79C0: 0xD0E3, + 0x79C1: 0xCBBD, + 0x79C2: 0xB665, + 0x79C3: 0xCDBA, + 0x79C4: 0xB666, + 0x79C5: 0xB667, + 0x79C6: 0xB8D1, + 0x79C7: 0xB668, + 0x79C8: 0xB669, + 0x79C9: 0xB1FC, + 0x79CA: 0xB66A, + 0x79CB: 0xC7EF, + 0x79CC: 0xB66B, + 0x79CD: 0xD6D6, + 0x79CE: 0xB66C, + 0x79CF: 0xB66D, + 0x79D0: 0xB66E, + 0x79D1: 0xBFC6, + 0x79D2: 0xC3EB, + 0x79D3: 0xB66F, + 0x79D4: 0xB670, + 0x79D5: 0xEFF5, + 0x79D6: 0xB671, + 0x79D7: 0xB672, + 0x79D8: 0xC3D8, + 0x79D9: 0xB673, + 0x79DA: 0xB674, + 0x79DB: 0xB675, + 0x79DC: 0xB676, + 0x79DD: 0xB677, + 0x79DE: 0xB678, + 0x79DF: 0xD7E2, + 0x79E0: 0xB679, + 0x79E1: 0xB67A, + 0x79E2: 0xB67B, + 0x79E3: 0xEFF7, + 0x79E4: 0xB3D3, + 0x79E5: 0xB67C, + 0x79E6: 0xC7D8, + 0x79E7: 0xD1ED, + 0x79E8: 0xB67D, + 0x79E9: 0xD6C8, + 0x79EA: 0xB67E, + 0x79EB: 0xEFF8, + 0x79EC: 0xB680, + 0x79ED: 0xEFF6, + 0x79EE: 0xB681, + 0x79EF: 0xBBFD, + 0x79F0: 0xB3C6, + 0x79F1: 0xB682, + 0x79F2: 0xB683, + 0x79F3: 0xB684, + 0x79F4: 0xB685, + 0x79F5: 0xB686, + 0x79F6: 0xB687, + 0x79F7: 0xB688, + 0x79F8: 0xBDD5, + 0x79F9: 0xB689, + 0x79FA: 0xB68A, + 0x79FB: 0xD2C6, + 0x79FC: 0xB68B, + 0x79FD: 0xBBE0, + 0x79FE: 0xB68C, + 0x79FF: 0xB68D, + 0x7A00: 0xCFA1, + 0x7A01: 0xB68E, + 0x7A02: 0xEFFC, + 0x7A03: 0xEFFB, + 0x7A04: 0xB68F, + 0x7A05: 0xB690, + 0x7A06: 0xEFF9, + 0x7A07: 0xB691, + 0x7A08: 0xB692, + 0x7A09: 0xB693, + 0x7A0A: 0xB694, + 0x7A0B: 0xB3CC, + 0x7A0C: 0xB695, + 0x7A0D: 0xC9D4, + 0x7A0E: 0xCBB0, + 0x7A0F: 0xB696, + 0x7A10: 0xB697, + 0x7A11: 0xB698, + 0x7A12: 0xB699, + 0x7A13: 0xB69A, + 0x7A14: 0xEFFE, + 0x7A15: 0xB69B, + 0x7A16: 0xB69C, + 0x7A17: 0xB0DE, + 0x7A18: 0xB69D, + 0x7A19: 0xB69E, + 0x7A1A: 0xD6C9, + 0x7A1B: 0xB69F, + 0x7A1C: 0xB6A0, + 0x7A1D: 0xB740, + 0x7A1E: 0xEFFD, + 0x7A1F: 0xB741, + 0x7A20: 0xB3ED, + 0x7A21: 0xB742, + 0x7A22: 0xB743, + 0x7A23: 0xF6D5, + 0x7A24: 0xB744, + 0x7A25: 0xB745, + 0x7A26: 0xB746, + 0x7A27: 0xB747, + 0x7A28: 0xB748, + 0x7A29: 0xB749, + 0x7A2A: 0xB74A, + 0x7A2B: 0xB74B, + 0x7A2C: 0xB74C, + 0x7A2D: 0xB74D, + 0x7A2E: 0xB74E, + 0x7A2F: 0xB74F, + 0x7A30: 0xB750, + 0x7A31: 0xB751, + 0x7A32: 0xB752, + 0x7A33: 0xCEC8, + 0x7A34: 0xB753, + 0x7A35: 0xB754, + 0x7A36: 0xB755, + 0x7A37: 0xF0A2, + 0x7A38: 0xB756, + 0x7A39: 0xF0A1, + 0x7A3A: 0xB757, + 0x7A3B: 0xB5BE, + 0x7A3C: 0xBCDA, + 0x7A3D: 0xBBFC, + 0x7A3E: 0xB758, + 0x7A3F: 0xB8E5, + 0x7A40: 0xB759, + 0x7A41: 0xB75A, + 0x7A42: 0xB75B, + 0x7A43: 0xB75C, + 0x7A44: 0xB75D, + 0x7A45: 0xB75E, + 0x7A46: 0xC4C2, + 0x7A47: 0xB75F, + 0x7A48: 0xB760, + 0x7A49: 0xB761, + 0x7A4A: 0xB762, + 0x7A4B: 0xB763, + 0x7A4C: 0xB764, + 0x7A4D: 0xB765, + 0x7A4E: 0xB766, + 0x7A4F: 0xB767, + 0x7A50: 0xB768, + 0x7A51: 0xF0A3, + 0x7A52: 0xB769, + 0x7A53: 0xB76A, + 0x7A54: 0xB76B, + 0x7A55: 0xB76C, + 0x7A56: 0xB76D, + 0x7A57: 0xCBEB, + 0x7A58: 0xB76E, + 0x7A59: 0xB76F, + 0x7A5A: 0xB770, + 0x7A5B: 0xB771, + 0x7A5C: 0xB772, + 0x7A5D: 0xB773, + 0x7A5E: 0xB774, + 0x7A5F: 0xB775, + 0x7A60: 0xB776, + 0x7A61: 0xB777, + 0x7A62: 0xB778, + 0x7A63: 0xB779, + 0x7A64: 0xB77A, + 0x7A65: 0xB77B, + 0x7A66: 0xB77C, + 0x7A67: 0xB77D, + 0x7A68: 0xB77E, + 0x7A69: 0xB780, + 0x7A6A: 0xB781, + 0x7A6B: 0xB782, + 0x7A6C: 0xB783, + 0x7A6D: 0xB784, + 0x7A6E: 0xB785, + 0x7A6F: 0xB786, + 0x7A70: 0xF0A6, + 0x7A71: 0xB787, + 0x7A72: 0xB788, + 0x7A73: 0xB789, + 0x7A74: 0xD1A8, + 0x7A75: 0xB78A, + 0x7A76: 0xBEBF, + 0x7A77: 0xC7EE, + 0x7A78: 0xF1B6, + 0x7A79: 0xF1B7, + 0x7A7A: 0xBFD5, + 0x7A7B: 0xB78B, + 0x7A7C: 0xB78C, + 0x7A7D: 0xB78D, + 0x7A7E: 0xB78E, + 0x7A7F: 0xB4A9, + 0x7A80: 0xF1B8, + 0x7A81: 0xCDBB, + 0x7A82: 0xB78F, + 0x7A83: 0xC7D4, + 0x7A84: 0xD5AD, + 0x7A85: 0xB790, + 0x7A86: 0xF1B9, + 0x7A87: 0xB791, + 0x7A88: 0xF1BA, + 0x7A89: 0xB792, + 0x7A8A: 0xB793, + 0x7A8B: 0xB794, + 0x7A8C: 0xB795, + 0x7A8D: 0xC7CF, + 0x7A8E: 0xB796, + 0x7A8F: 0xB797, + 0x7A90: 0xB798, + 0x7A91: 0xD2A4, + 0x7A92: 0xD6CF, + 0x7A93: 0xB799, + 0x7A94: 0xB79A, + 0x7A95: 0xF1BB, + 0x7A96: 0xBDD1, + 0x7A97: 0xB4B0, + 0x7A98: 0xBEBD, + 0x7A99: 0xB79B, + 0x7A9A: 0xB79C, + 0x7A9B: 0xB79D, + 0x7A9C: 0xB4DC, + 0x7A9D: 0xCED1, + 0x7A9E: 0xB79E, + 0x7A9F: 0xBFDF, + 0x7AA0: 0xF1BD, + 0x7AA1: 0xB79F, + 0x7AA2: 0xB7A0, + 0x7AA3: 0xB840, + 0x7AA4: 0xB841, + 0x7AA5: 0xBFFA, + 0x7AA6: 0xF1BC, + 0x7AA7: 0xB842, + 0x7AA8: 0xF1BF, + 0x7AA9: 0xB843, + 0x7AAA: 0xB844, + 0x7AAB: 0xB845, + 0x7AAC: 0xF1BE, + 0x7AAD: 0xF1C0, + 0x7AAE: 0xB846, + 0x7AAF: 0xB847, + 0x7AB0: 0xB848, + 0x7AB1: 0xB849, + 0x7AB2: 0xB84A, + 0x7AB3: 0xF1C1, + 0x7AB4: 0xB84B, + 0x7AB5: 0xB84C, + 0x7AB6: 0xB84D, + 0x7AB7: 0xB84E, + 0x7AB8: 0xB84F, + 0x7AB9: 0xB850, + 0x7ABA: 0xB851, + 0x7ABB: 0xB852, + 0x7ABC: 0xB853, + 0x7ABD: 0xB854, + 0x7ABE: 0xB855, + 0x7ABF: 0xC1FE, + 0x7AC0: 0xB856, + 0x7AC1: 0xB857, + 0x7AC2: 0xB858, + 0x7AC3: 0xB859, + 0x7AC4: 0xB85A, + 0x7AC5: 0xB85B, + 0x7AC6: 0xB85C, + 0x7AC7: 0xB85D, + 0x7AC8: 0xB85E, + 0x7AC9: 0xB85F, + 0x7ACA: 0xB860, + 0x7ACB: 0xC1A2, + 0x7ACC: 0xB861, + 0x7ACD: 0xB862, + 0x7ACE: 0xB863, + 0x7ACF: 0xB864, + 0x7AD0: 0xB865, + 0x7AD1: 0xB866, + 0x7AD2: 0xB867, + 0x7AD3: 0xB868, + 0x7AD4: 0xB869, + 0x7AD5: 0xB86A, + 0x7AD6: 0xCAFA, + 0x7AD7: 0xB86B, + 0x7AD8: 0xB86C, + 0x7AD9: 0xD5BE, + 0x7ADA: 0xB86D, + 0x7ADB: 0xB86E, + 0x7ADC: 0xB86F, + 0x7ADD: 0xB870, + 0x7ADE: 0xBEBA, + 0x7ADF: 0xBEB9, + 0x7AE0: 0xD5C2, + 0x7AE1: 0xB871, + 0x7AE2: 0xB872, + 0x7AE3: 0xBFA2, + 0x7AE4: 0xB873, + 0x7AE5: 0xCDAF, + 0x7AE6: 0xF1B5, + 0x7AE7: 0xB874, + 0x7AE8: 0xB875, + 0x7AE9: 0xB876, + 0x7AEA: 0xB877, + 0x7AEB: 0xB878, + 0x7AEC: 0xB879, + 0x7AED: 0xBDDF, + 0x7AEE: 0xB87A, + 0x7AEF: 0xB6CB, + 0x7AF0: 0xB87B, + 0x7AF1: 0xB87C, + 0x7AF2: 0xB87D, + 0x7AF3: 0xB87E, + 0x7AF4: 0xB880, + 0x7AF5: 0xB881, + 0x7AF6: 0xB882, + 0x7AF7: 0xB883, + 0x7AF8: 0xB884, + 0x7AF9: 0xD6F1, + 0x7AFA: 0xF3C3, + 0x7AFB: 0xB885, + 0x7AFC: 0xB886, + 0x7AFD: 0xF3C4, + 0x7AFE: 0xB887, + 0x7AFF: 0xB8CD, + 0x7B00: 0xB888, + 0x7B01: 0xB889, + 0x7B02: 0xB88A, + 0x7B03: 0xF3C6, + 0x7B04: 0xF3C7, + 0x7B05: 0xB88B, + 0x7B06: 0xB0CA, + 0x7B07: 0xB88C, + 0x7B08: 0xF3C5, + 0x7B09: 0xB88D, + 0x7B0A: 0xF3C9, + 0x7B0B: 0xCBF1, + 0x7B0C: 0xB88E, + 0x7B0D: 0xB88F, + 0x7B0E: 0xB890, + 0x7B0F: 0xF3CB, + 0x7B10: 0xB891, + 0x7B11: 0xD0A6, + 0x7B12: 0xB892, + 0x7B13: 0xB893, + 0x7B14: 0xB1CA, + 0x7B15: 0xF3C8, + 0x7B16: 0xB894, + 0x7B17: 0xB895, + 0x7B18: 0xB896, + 0x7B19: 0xF3CF, + 0x7B1A: 0xB897, + 0x7B1B: 0xB5D1, + 0x7B1C: 0xB898, + 0x7B1D: 0xB899, + 0x7B1E: 0xF3D7, + 0x7B1F: 0xB89A, + 0x7B20: 0xF3D2, + 0x7B21: 0xB89B, + 0x7B22: 0xB89C, + 0x7B23: 0xB89D, + 0x7B24: 0xF3D4, + 0x7B25: 0xF3D3, + 0x7B26: 0xB7FB, + 0x7B27: 0xB89E, + 0x7B28: 0xB1BF, + 0x7B29: 0xB89F, + 0x7B2A: 0xF3CE, + 0x7B2B: 0xF3CA, + 0x7B2C: 0xB5DA, + 0x7B2D: 0xB8A0, + 0x7B2E: 0xF3D0, + 0x7B2F: 0xB940, + 0x7B30: 0xB941, + 0x7B31: 0xF3D1, + 0x7B32: 0xB942, + 0x7B33: 0xF3D5, + 0x7B34: 0xB943, + 0x7B35: 0xB944, + 0x7B36: 0xB945, + 0x7B37: 0xB946, + 0x7B38: 0xF3CD, + 0x7B39: 0xB947, + 0x7B3A: 0xBCE3, + 0x7B3B: 0xB948, + 0x7B3C: 0xC1FD, + 0x7B3D: 0xB949, + 0x7B3E: 0xF3D6, + 0x7B3F: 0xB94A, + 0x7B40: 0xB94B, + 0x7B41: 0xB94C, + 0x7B42: 0xB94D, + 0x7B43: 0xB94E, + 0x7B44: 0xB94F, + 0x7B45: 0xF3DA, + 0x7B46: 0xB950, + 0x7B47: 0xF3CC, + 0x7B48: 0xB951, + 0x7B49: 0xB5C8, + 0x7B4A: 0xB952, + 0x7B4B: 0xBDEE, + 0x7B4C: 0xF3DC, + 0x7B4D: 0xB953, + 0x7B4E: 0xB954, + 0x7B4F: 0xB7A4, + 0x7B50: 0xBFF0, + 0x7B51: 0xD6FE, + 0x7B52: 0xCDB2, + 0x7B53: 0xB955, + 0x7B54: 0xB4F0, + 0x7B55: 0xB956, + 0x7B56: 0xB2DF, + 0x7B57: 0xB957, + 0x7B58: 0xF3D8, + 0x7B59: 0xB958, + 0x7B5A: 0xF3D9, + 0x7B5B: 0xC9B8, + 0x7B5C: 0xB959, + 0x7B5D: 0xF3DD, + 0x7B5E: 0xB95A, + 0x7B5F: 0xB95B, + 0x7B60: 0xF3DE, + 0x7B61: 0xB95C, + 0x7B62: 0xF3E1, + 0x7B63: 0xB95D, + 0x7B64: 0xB95E, + 0x7B65: 0xB95F, + 0x7B66: 0xB960, + 0x7B67: 0xB961, + 0x7B68: 0xB962, + 0x7B69: 0xB963, + 0x7B6A: 0xB964, + 0x7B6B: 0xB965, + 0x7B6C: 0xB966, + 0x7B6D: 0xB967, + 0x7B6E: 0xF3DF, + 0x7B6F: 0xB968, + 0x7B70: 0xB969, + 0x7B71: 0xF3E3, + 0x7B72: 0xF3E2, + 0x7B73: 0xB96A, + 0x7B74: 0xB96B, + 0x7B75: 0xF3DB, + 0x7B76: 0xB96C, + 0x7B77: 0xBFEA, + 0x7B78: 0xB96D, + 0x7B79: 0xB3EF, + 0x7B7A: 0xB96E, + 0x7B7B: 0xF3E0, + 0x7B7C: 0xB96F, + 0x7B7D: 0xB970, + 0x7B7E: 0xC7A9, + 0x7B7F: 0xB971, + 0x7B80: 0xBCF2, + 0x7B81: 0xB972, + 0x7B82: 0xB973, + 0x7B83: 0xB974, + 0x7B84: 0xB975, + 0x7B85: 0xF3EB, + 0x7B86: 0xB976, + 0x7B87: 0xB977, + 0x7B88: 0xB978, + 0x7B89: 0xB979, + 0x7B8A: 0xB97A, + 0x7B8B: 0xB97B, + 0x7B8C: 0xB97C, + 0x7B8D: 0xB9BF, + 0x7B8E: 0xB97D, + 0x7B8F: 0xB97E, + 0x7B90: 0xF3E4, + 0x7B91: 0xB980, + 0x7B92: 0xB981, + 0x7B93: 0xB982, + 0x7B94: 0xB2AD, + 0x7B95: 0xBBFE, + 0x7B96: 0xB983, + 0x7B97: 0xCBE3, + 0x7B98: 0xB984, + 0x7B99: 0xB985, + 0x7B9A: 0xB986, + 0x7B9B: 0xB987, + 0x7B9C: 0xF3ED, + 0x7B9D: 0xF3E9, + 0x7B9E: 0xB988, + 0x7B9F: 0xB989, + 0x7BA0: 0xB98A, + 0x7BA1: 0xB9DC, + 0x7BA2: 0xF3EE, + 0x7BA3: 0xB98B, + 0x7BA4: 0xB98C, + 0x7BA5: 0xB98D, + 0x7BA6: 0xF3E5, + 0x7BA7: 0xF3E6, + 0x7BA8: 0xF3EA, + 0x7BA9: 0xC2E1, + 0x7BAA: 0xF3EC, + 0x7BAB: 0xF3EF, + 0x7BAC: 0xF3E8, + 0x7BAD: 0xBCFD, + 0x7BAE: 0xB98E, + 0x7BAF: 0xB98F, + 0x7BB0: 0xB990, + 0x7BB1: 0xCFE4, + 0x7BB2: 0xB991, + 0x7BB3: 0xB992, + 0x7BB4: 0xF3F0, + 0x7BB5: 0xB993, + 0x7BB6: 0xB994, + 0x7BB7: 0xB995, + 0x7BB8: 0xF3E7, + 0x7BB9: 0xB996, + 0x7BBA: 0xB997, + 0x7BBB: 0xB998, + 0x7BBC: 0xB999, + 0x7BBD: 0xB99A, + 0x7BBE: 0xB99B, + 0x7BBF: 0xB99C, + 0x7BC0: 0xB99D, + 0x7BC1: 0xF3F2, + 0x7BC2: 0xB99E, + 0x7BC3: 0xB99F, + 0x7BC4: 0xB9A0, + 0x7BC5: 0xBA40, + 0x7BC6: 0xD7AD, + 0x7BC7: 0xC6AA, + 0x7BC8: 0xBA41, + 0x7BC9: 0xBA42, + 0x7BCA: 0xBA43, + 0x7BCB: 0xBA44, + 0x7BCC: 0xF3F3, + 0x7BCD: 0xBA45, + 0x7BCE: 0xBA46, + 0x7BCF: 0xBA47, + 0x7BD0: 0xBA48, + 0x7BD1: 0xF3F1, + 0x7BD2: 0xBA49, + 0x7BD3: 0xC2A8, + 0x7BD4: 0xBA4A, + 0x7BD5: 0xBA4B, + 0x7BD6: 0xBA4C, + 0x7BD7: 0xBA4D, + 0x7BD8: 0xBA4E, + 0x7BD9: 0xB8DD, + 0x7BDA: 0xF3F5, + 0x7BDB: 0xBA4F, + 0x7BDC: 0xBA50, + 0x7BDD: 0xF3F4, + 0x7BDE: 0xBA51, + 0x7BDF: 0xBA52, + 0x7BE0: 0xBA53, + 0x7BE1: 0xB4DB, + 0x7BE2: 0xBA54, + 0x7BE3: 0xBA55, + 0x7BE4: 0xBA56, + 0x7BE5: 0xF3F6, + 0x7BE6: 0xF3F7, + 0x7BE7: 0xBA57, + 0x7BE8: 0xBA58, + 0x7BE9: 0xBA59, + 0x7BEA: 0xF3F8, + 0x7BEB: 0xBA5A, + 0x7BEC: 0xBA5B, + 0x7BED: 0xBA5C, + 0x7BEE: 0xC0BA, + 0x7BEF: 0xBA5D, + 0x7BF0: 0xBA5E, + 0x7BF1: 0xC0E9, + 0x7BF2: 0xBA5F, + 0x7BF3: 0xBA60, + 0x7BF4: 0xBA61, + 0x7BF5: 0xBA62, + 0x7BF6: 0xBA63, + 0x7BF7: 0xC5F1, + 0x7BF8: 0xBA64, + 0x7BF9: 0xBA65, + 0x7BFA: 0xBA66, + 0x7BFB: 0xBA67, + 0x7BFC: 0xF3FB, + 0x7BFD: 0xBA68, + 0x7BFE: 0xF3FA, + 0x7BFF: 0xBA69, + 0x7C00: 0xBA6A, + 0x7C01: 0xBA6B, + 0x7C02: 0xBA6C, + 0x7C03: 0xBA6D, + 0x7C04: 0xBA6E, + 0x7C05: 0xBA6F, + 0x7C06: 0xBA70, + 0x7C07: 0xB4D8, + 0x7C08: 0xBA71, + 0x7C09: 0xBA72, + 0x7C0A: 0xBA73, + 0x7C0B: 0xF3FE, + 0x7C0C: 0xF3F9, + 0x7C0D: 0xBA74, + 0x7C0E: 0xBA75, + 0x7C0F: 0xF3FC, + 0x7C10: 0xBA76, + 0x7C11: 0xBA77, + 0x7C12: 0xBA78, + 0x7C13: 0xBA79, + 0x7C14: 0xBA7A, + 0x7C15: 0xBA7B, + 0x7C16: 0xF3FD, + 0x7C17: 0xBA7C, + 0x7C18: 0xBA7D, + 0x7C19: 0xBA7E, + 0x7C1A: 0xBA80, + 0x7C1B: 0xBA81, + 0x7C1C: 0xBA82, + 0x7C1D: 0xBA83, + 0x7C1E: 0xBA84, + 0x7C1F: 0xF4A1, + 0x7C20: 0xBA85, + 0x7C21: 0xBA86, + 0x7C22: 0xBA87, + 0x7C23: 0xBA88, + 0x7C24: 0xBA89, + 0x7C25: 0xBA8A, + 0x7C26: 0xF4A3, + 0x7C27: 0xBBC9, + 0x7C28: 0xBA8B, + 0x7C29: 0xBA8C, + 0x7C2A: 0xF4A2, + 0x7C2B: 0xBA8D, + 0x7C2C: 0xBA8E, + 0x7C2D: 0xBA8F, + 0x7C2E: 0xBA90, + 0x7C2F: 0xBA91, + 0x7C30: 0xBA92, + 0x7C31: 0xBA93, + 0x7C32: 0xBA94, + 0x7C33: 0xBA95, + 0x7C34: 0xBA96, + 0x7C35: 0xBA97, + 0x7C36: 0xBA98, + 0x7C37: 0xBA99, + 0x7C38: 0xF4A4, + 0x7C39: 0xBA9A, + 0x7C3A: 0xBA9B, + 0x7C3B: 0xBA9C, + 0x7C3C: 0xBA9D, + 0x7C3D: 0xBA9E, + 0x7C3E: 0xBA9F, + 0x7C3F: 0xB2BE, + 0x7C40: 0xF4A6, + 0x7C41: 0xF4A5, + 0x7C42: 0xBAA0, + 0x7C43: 0xBB40, + 0x7C44: 0xBB41, + 0x7C45: 0xBB42, + 0x7C46: 0xBB43, + 0x7C47: 0xBB44, + 0x7C48: 0xBB45, + 0x7C49: 0xBB46, + 0x7C4A: 0xBB47, + 0x7C4B: 0xBB48, + 0x7C4C: 0xBB49, + 0x7C4D: 0xBCAE, + 0x7C4E: 0xBB4A, + 0x7C4F: 0xBB4B, + 0x7C50: 0xBB4C, + 0x7C51: 0xBB4D, + 0x7C52: 0xBB4E, + 0x7C53: 0xBB4F, + 0x7C54: 0xBB50, + 0x7C55: 0xBB51, + 0x7C56: 0xBB52, + 0x7C57: 0xBB53, + 0x7C58: 0xBB54, + 0x7C59: 0xBB55, + 0x7C5A: 0xBB56, + 0x7C5B: 0xBB57, + 0x7C5C: 0xBB58, + 0x7C5D: 0xBB59, + 0x7C5E: 0xBB5A, + 0x7C5F: 0xBB5B, + 0x7C60: 0xBB5C, + 0x7C61: 0xBB5D, + 0x7C62: 0xBB5E, + 0x7C63: 0xBB5F, + 0x7C64: 0xBB60, + 0x7C65: 0xBB61, + 0x7C66: 0xBB62, + 0x7C67: 0xBB63, + 0x7C68: 0xBB64, + 0x7C69: 0xBB65, + 0x7C6A: 0xBB66, + 0x7C6B: 0xBB67, + 0x7C6C: 0xBB68, + 0x7C6D: 0xBB69, + 0x7C6E: 0xBB6A, + 0x7C6F: 0xBB6B, + 0x7C70: 0xBB6C, + 0x7C71: 0xBB6D, + 0x7C72: 0xBB6E, + 0x7C73: 0xC3D7, + 0x7C74: 0xD9E1, + 0x7C75: 0xBB6F, + 0x7C76: 0xBB70, + 0x7C77: 0xBB71, + 0x7C78: 0xBB72, + 0x7C79: 0xBB73, + 0x7C7A: 0xBB74, + 0x7C7B: 0xC0E0, + 0x7C7C: 0xF4CC, + 0x7C7D: 0xD7D1, + 0x7C7E: 0xBB75, + 0x7C7F: 0xBB76, + 0x7C80: 0xBB77, + 0x7C81: 0xBB78, + 0x7C82: 0xBB79, + 0x7C83: 0xBB7A, + 0x7C84: 0xBB7B, + 0x7C85: 0xBB7C, + 0x7C86: 0xBB7D, + 0x7C87: 0xBB7E, + 0x7C88: 0xBB80, + 0x7C89: 0xB7DB, + 0x7C8A: 0xBB81, + 0x7C8B: 0xBB82, + 0x7C8C: 0xBB83, + 0x7C8D: 0xBB84, + 0x7C8E: 0xBB85, + 0x7C8F: 0xBB86, + 0x7C90: 0xBB87, + 0x7C91: 0xF4CE, + 0x7C92: 0xC1A3, + 0x7C93: 0xBB88, + 0x7C94: 0xBB89, + 0x7C95: 0xC6C9, + 0x7C96: 0xBB8A, + 0x7C97: 0xB4D6, + 0x7C98: 0xD5B3, + 0x7C99: 0xBB8B, + 0x7C9A: 0xBB8C, + 0x7C9B: 0xBB8D, + 0x7C9C: 0xF4D0, + 0x7C9D: 0xF4CF, + 0x7C9E: 0xF4D1, + 0x7C9F: 0xCBDA, + 0x7CA0: 0xBB8E, + 0x7CA1: 0xBB8F, + 0x7CA2: 0xF4D2, + 0x7CA3: 0xBB90, + 0x7CA4: 0xD4C1, + 0x7CA5: 0xD6E0, + 0x7CA6: 0xBB91, + 0x7CA7: 0xBB92, + 0x7CA8: 0xBB93, + 0x7CA9: 0xBB94, + 0x7CAA: 0xB7E0, + 0x7CAB: 0xBB95, + 0x7CAC: 0xBB96, + 0x7CAD: 0xBB97, + 0x7CAE: 0xC1B8, + 0x7CAF: 0xBB98, + 0x7CB0: 0xBB99, + 0x7CB1: 0xC1BB, + 0x7CB2: 0xF4D3, + 0x7CB3: 0xBEAC, + 0x7CB4: 0xBB9A, + 0x7CB5: 0xBB9B, + 0x7CB6: 0xBB9C, + 0x7CB7: 0xBB9D, + 0x7CB8: 0xBB9E, + 0x7CB9: 0xB4E2, + 0x7CBA: 0xBB9F, + 0x7CBB: 0xBBA0, + 0x7CBC: 0xF4D4, + 0x7CBD: 0xF4D5, + 0x7CBE: 0xBEAB, + 0x7CBF: 0xBC40, + 0x7CC0: 0xBC41, + 0x7CC1: 0xF4D6, + 0x7CC2: 0xBC42, + 0x7CC3: 0xBC43, + 0x7CC4: 0xBC44, + 0x7CC5: 0xF4DB, + 0x7CC6: 0xBC45, + 0x7CC7: 0xF4D7, + 0x7CC8: 0xF4DA, + 0x7CC9: 0xBC46, + 0x7CCA: 0xBAFD, + 0x7CCB: 0xBC47, + 0x7CCC: 0xF4D8, + 0x7CCD: 0xF4D9, + 0x7CCE: 0xBC48, + 0x7CCF: 0xBC49, + 0x7CD0: 0xBC4A, + 0x7CD1: 0xBC4B, + 0x7CD2: 0xBC4C, + 0x7CD3: 0xBC4D, + 0x7CD4: 0xBC4E, + 0x7CD5: 0xB8E2, + 0x7CD6: 0xCCC7, + 0x7CD7: 0xF4DC, + 0x7CD8: 0xBC4F, + 0x7CD9: 0xB2DA, + 0x7CDA: 0xBC50, + 0x7CDB: 0xBC51, + 0x7CDC: 0xC3D3, + 0x7CDD: 0xBC52, + 0x7CDE: 0xBC53, + 0x7CDF: 0xD4E3, + 0x7CE0: 0xBFB7, + 0x7CE1: 0xBC54, + 0x7CE2: 0xBC55, + 0x7CE3: 0xBC56, + 0x7CE4: 0xBC57, + 0x7CE5: 0xBC58, + 0x7CE6: 0xBC59, + 0x7CE7: 0xBC5A, + 0x7CE8: 0xF4DD, + 0x7CE9: 0xBC5B, + 0x7CEA: 0xBC5C, + 0x7CEB: 0xBC5D, + 0x7CEC: 0xBC5E, + 0x7CED: 0xBC5F, + 0x7CEE: 0xBC60, + 0x7CEF: 0xC5B4, + 0x7CF0: 0xBC61, + 0x7CF1: 0xBC62, + 0x7CF2: 0xBC63, + 0x7CF3: 0xBC64, + 0x7CF4: 0xBC65, + 0x7CF5: 0xBC66, + 0x7CF6: 0xBC67, + 0x7CF7: 0xBC68, + 0x7CF8: 0xF4E9, + 0x7CF9: 0xBC69, + 0x7CFA: 0xBC6A, + 0x7CFB: 0xCFB5, + 0x7CFC: 0xBC6B, + 0x7CFD: 0xBC6C, + 0x7CFE: 0xBC6D, + 0x7CFF: 0xBC6E, + 0x7D00: 0xBC6F, + 0x7D01: 0xBC70, + 0x7D02: 0xBC71, + 0x7D03: 0xBC72, + 0x7D04: 0xBC73, + 0x7D05: 0xBC74, + 0x7D06: 0xBC75, + 0x7D07: 0xBC76, + 0x7D08: 0xBC77, + 0x7D09: 0xBC78, + 0x7D0A: 0xCEC9, + 0x7D0B: 0xBC79, + 0x7D0C: 0xBC7A, + 0x7D0D: 0xBC7B, + 0x7D0E: 0xBC7C, + 0x7D0F: 0xBC7D, + 0x7D10: 0xBC7E, + 0x7D11: 0xBC80, + 0x7D12: 0xBC81, + 0x7D13: 0xBC82, + 0x7D14: 0xBC83, + 0x7D15: 0xBC84, + 0x7D16: 0xBC85, + 0x7D17: 0xBC86, + 0x7D18: 0xBC87, + 0x7D19: 0xBC88, + 0x7D1A: 0xBC89, + 0x7D1B: 0xBC8A, + 0x7D1C: 0xBC8B, + 0x7D1D: 0xBC8C, + 0x7D1E: 0xBC8D, + 0x7D1F: 0xBC8E, + 0x7D20: 0xCBD8, + 0x7D21: 0xBC8F, + 0x7D22: 0xCBF7, + 0x7D23: 0xBC90, + 0x7D24: 0xBC91, + 0x7D25: 0xBC92, + 0x7D26: 0xBC93, + 0x7D27: 0xBDF4, + 0x7D28: 0xBC94, + 0x7D29: 0xBC95, + 0x7D2A: 0xBC96, + 0x7D2B: 0xD7CF, + 0x7D2C: 0xBC97, + 0x7D2D: 0xBC98, + 0x7D2E: 0xBC99, + 0x7D2F: 0xC0DB, + 0x7D30: 0xBC9A, + 0x7D31: 0xBC9B, + 0x7D32: 0xBC9C, + 0x7D33: 0xBC9D, + 0x7D34: 0xBC9E, + 0x7D35: 0xBC9F, + 0x7D36: 0xBCA0, + 0x7D37: 0xBD40, + 0x7D38: 0xBD41, + 0x7D39: 0xBD42, + 0x7D3A: 0xBD43, + 0x7D3B: 0xBD44, + 0x7D3C: 0xBD45, + 0x7D3D: 0xBD46, + 0x7D3E: 0xBD47, + 0x7D3F: 0xBD48, + 0x7D40: 0xBD49, + 0x7D41: 0xBD4A, + 0x7D42: 0xBD4B, + 0x7D43: 0xBD4C, + 0x7D44: 0xBD4D, + 0x7D45: 0xBD4E, + 0x7D46: 0xBD4F, + 0x7D47: 0xBD50, + 0x7D48: 0xBD51, + 0x7D49: 0xBD52, + 0x7D4A: 0xBD53, + 0x7D4B: 0xBD54, + 0x7D4C: 0xBD55, + 0x7D4D: 0xBD56, + 0x7D4E: 0xBD57, + 0x7D4F: 0xBD58, + 0x7D50: 0xBD59, + 0x7D51: 0xBD5A, + 0x7D52: 0xBD5B, + 0x7D53: 0xBD5C, + 0x7D54: 0xBD5D, + 0x7D55: 0xBD5E, + 0x7D56: 0xBD5F, + 0x7D57: 0xBD60, + 0x7D58: 0xBD61, + 0x7D59: 0xBD62, + 0x7D5A: 0xBD63, + 0x7D5B: 0xBD64, + 0x7D5C: 0xBD65, + 0x7D5D: 0xBD66, + 0x7D5E: 0xBD67, + 0x7D5F: 0xBD68, + 0x7D60: 0xBD69, + 0x7D61: 0xBD6A, + 0x7D62: 0xBD6B, + 0x7D63: 0xBD6C, + 0x7D64: 0xBD6D, + 0x7D65: 0xBD6E, + 0x7D66: 0xBD6F, + 0x7D67: 0xBD70, + 0x7D68: 0xBD71, + 0x7D69: 0xBD72, + 0x7D6A: 0xBD73, + 0x7D6B: 0xBD74, + 0x7D6C: 0xBD75, + 0x7D6D: 0xBD76, + 0x7D6E: 0xD0F5, + 0x7D6F: 0xBD77, + 0x7D70: 0xBD78, + 0x7D71: 0xBD79, + 0x7D72: 0xBD7A, + 0x7D73: 0xBD7B, + 0x7D74: 0xBD7C, + 0x7D75: 0xBD7D, + 0x7D76: 0xBD7E, + 0x7D77: 0xF4EA, + 0x7D78: 0xBD80, + 0x7D79: 0xBD81, + 0x7D7A: 0xBD82, + 0x7D7B: 0xBD83, + 0x7D7C: 0xBD84, + 0x7D7D: 0xBD85, + 0x7D7E: 0xBD86, + 0x7D7F: 0xBD87, + 0x7D80: 0xBD88, + 0x7D81: 0xBD89, + 0x7D82: 0xBD8A, + 0x7D83: 0xBD8B, + 0x7D84: 0xBD8C, + 0x7D85: 0xBD8D, + 0x7D86: 0xBD8E, + 0x7D87: 0xBD8F, + 0x7D88: 0xBD90, + 0x7D89: 0xBD91, + 0x7D8A: 0xBD92, + 0x7D8B: 0xBD93, + 0x7D8C: 0xBD94, + 0x7D8D: 0xBD95, + 0x7D8E: 0xBD96, + 0x7D8F: 0xBD97, + 0x7D90: 0xBD98, + 0x7D91: 0xBD99, + 0x7D92: 0xBD9A, + 0x7D93: 0xBD9B, + 0x7D94: 0xBD9C, + 0x7D95: 0xBD9D, + 0x7D96: 0xBD9E, + 0x7D97: 0xBD9F, + 0x7D98: 0xBDA0, + 0x7D99: 0xBE40, + 0x7D9A: 0xBE41, + 0x7D9B: 0xBE42, + 0x7D9C: 0xBE43, + 0x7D9D: 0xBE44, + 0x7D9E: 0xBE45, + 0x7D9F: 0xBE46, + 0x7DA0: 0xBE47, + 0x7DA1: 0xBE48, + 0x7DA2: 0xBE49, + 0x7DA3: 0xBE4A, + 0x7DA4: 0xBE4B, + 0x7DA5: 0xBE4C, + 0x7DA6: 0xF4EB, + 0x7DA7: 0xBE4D, + 0x7DA8: 0xBE4E, + 0x7DA9: 0xBE4F, + 0x7DAA: 0xBE50, + 0x7DAB: 0xBE51, + 0x7DAC: 0xBE52, + 0x7DAD: 0xBE53, + 0x7DAE: 0xF4EC, + 0x7DAF: 0xBE54, + 0x7DB0: 0xBE55, + 0x7DB1: 0xBE56, + 0x7DB2: 0xBE57, + 0x7DB3: 0xBE58, + 0x7DB4: 0xBE59, + 0x7DB5: 0xBE5A, + 0x7DB6: 0xBE5B, + 0x7DB7: 0xBE5C, + 0x7DB8: 0xBE5D, + 0x7DB9: 0xBE5E, + 0x7DBA: 0xBE5F, + 0x7DBB: 0xBE60, + 0x7DBC: 0xBE61, + 0x7DBD: 0xBE62, + 0x7DBE: 0xBE63, + 0x7DBF: 0xBE64, + 0x7DC0: 0xBE65, + 0x7DC1: 0xBE66, + 0x7DC2: 0xBE67, + 0x7DC3: 0xBE68, + 0x7DC4: 0xBE69, + 0x7DC5: 0xBE6A, + 0x7DC6: 0xBE6B, + 0x7DC7: 0xBE6C, + 0x7DC8: 0xBE6D, + 0x7DC9: 0xBE6E, + 0x7DCA: 0xBE6F, + 0x7DCB: 0xBE70, + 0x7DCC: 0xBE71, + 0x7DCD: 0xBE72, + 0x7DCE: 0xBE73, + 0x7DCF: 0xBE74, + 0x7DD0: 0xBE75, + 0x7DD1: 0xBE76, + 0x7DD2: 0xBE77, + 0x7DD3: 0xBE78, + 0x7DD4: 0xBE79, + 0x7DD5: 0xBE7A, + 0x7DD6: 0xBE7B, + 0x7DD7: 0xBE7C, + 0x7DD8: 0xBE7D, + 0x7DD9: 0xBE7E, + 0x7DDA: 0xBE80, + 0x7DDB: 0xBE81, + 0x7DDC: 0xBE82, + 0x7DDD: 0xBE83, + 0x7DDE: 0xBE84, + 0x7DDF: 0xBE85, + 0x7DE0: 0xBE86, + 0x7DE1: 0xBE87, + 0x7DE2: 0xBE88, + 0x7DE3: 0xBE89, + 0x7DE4: 0xBE8A, + 0x7DE5: 0xBE8B, + 0x7DE6: 0xBE8C, + 0x7DE7: 0xBE8D, + 0x7DE8: 0xBE8E, + 0x7DE9: 0xBE8F, + 0x7DEA: 0xBE90, + 0x7DEB: 0xBE91, + 0x7DEC: 0xBE92, + 0x7DED: 0xBE93, + 0x7DEE: 0xBE94, + 0x7DEF: 0xBE95, + 0x7DF0: 0xBE96, + 0x7DF1: 0xBE97, + 0x7DF2: 0xBE98, + 0x7DF3: 0xBE99, + 0x7DF4: 0xBE9A, + 0x7DF5: 0xBE9B, + 0x7DF6: 0xBE9C, + 0x7DF7: 0xBE9D, + 0x7DF8: 0xBE9E, + 0x7DF9: 0xBE9F, + 0x7DFA: 0xBEA0, + 0x7DFB: 0xBF40, + 0x7DFC: 0xBF41, + 0x7DFD: 0xBF42, + 0x7DFE: 0xBF43, + 0x7DFF: 0xBF44, + 0x7E00: 0xBF45, + 0x7E01: 0xBF46, + 0x7E02: 0xBF47, + 0x7E03: 0xBF48, + 0x7E04: 0xBF49, + 0x7E05: 0xBF4A, + 0x7E06: 0xBF4B, + 0x7E07: 0xBF4C, + 0x7E08: 0xBF4D, + 0x7E09: 0xBF4E, + 0x7E0A: 0xBF4F, + 0x7E0B: 0xBF50, + 0x7E0C: 0xBF51, + 0x7E0D: 0xBF52, + 0x7E0E: 0xBF53, + 0x7E0F: 0xBF54, + 0x7E10: 0xBF55, + 0x7E11: 0xBF56, + 0x7E12: 0xBF57, + 0x7E13: 0xBF58, + 0x7E14: 0xBF59, + 0x7E15: 0xBF5A, + 0x7E16: 0xBF5B, + 0x7E17: 0xBF5C, + 0x7E18: 0xBF5D, + 0x7E19: 0xBF5E, + 0x7E1A: 0xBF5F, + 0x7E1B: 0xBF60, + 0x7E1C: 0xBF61, + 0x7E1D: 0xBF62, + 0x7E1E: 0xBF63, + 0x7E1F: 0xBF64, + 0x7E20: 0xBF65, + 0x7E21: 0xBF66, + 0x7E22: 0xBF67, + 0x7E23: 0xBF68, + 0x7E24: 0xBF69, + 0x7E25: 0xBF6A, + 0x7E26: 0xBF6B, + 0x7E27: 0xBF6C, + 0x7E28: 0xBF6D, + 0x7E29: 0xBF6E, + 0x7E2A: 0xBF6F, + 0x7E2B: 0xBF70, + 0x7E2C: 0xBF71, + 0x7E2D: 0xBF72, + 0x7E2E: 0xBF73, + 0x7E2F: 0xBF74, + 0x7E30: 0xBF75, + 0x7E31: 0xBF76, + 0x7E32: 0xBF77, + 0x7E33: 0xBF78, + 0x7E34: 0xBF79, + 0x7E35: 0xBF7A, + 0x7E36: 0xBF7B, + 0x7E37: 0xBF7C, + 0x7E38: 0xBF7D, + 0x7E39: 0xBF7E, + 0x7E3A: 0xBF80, + 0x7E3B: 0xF7E3, + 0x7E3C: 0xBF81, + 0x7E3D: 0xBF82, + 0x7E3E: 0xBF83, + 0x7E3F: 0xBF84, + 0x7E40: 0xBF85, + 0x7E41: 0xB7B1, + 0x7E42: 0xBF86, + 0x7E43: 0xBF87, + 0x7E44: 0xBF88, + 0x7E45: 0xBF89, + 0x7E46: 0xBF8A, + 0x7E47: 0xF4ED, + 0x7E48: 0xBF8B, + 0x7E49: 0xBF8C, + 0x7E4A: 0xBF8D, + 0x7E4B: 0xBF8E, + 0x7E4C: 0xBF8F, + 0x7E4D: 0xBF90, + 0x7E4E: 0xBF91, + 0x7E4F: 0xBF92, + 0x7E50: 0xBF93, + 0x7E51: 0xBF94, + 0x7E52: 0xBF95, + 0x7E53: 0xBF96, + 0x7E54: 0xBF97, + 0x7E55: 0xBF98, + 0x7E56: 0xBF99, + 0x7E57: 0xBF9A, + 0x7E58: 0xBF9B, + 0x7E59: 0xBF9C, + 0x7E5A: 0xBF9D, + 0x7E5B: 0xBF9E, + 0x7E5C: 0xBF9F, + 0x7E5D: 0xBFA0, + 0x7E5E: 0xC040, + 0x7E5F: 0xC041, + 0x7E60: 0xC042, + 0x7E61: 0xC043, + 0x7E62: 0xC044, + 0x7E63: 0xC045, + 0x7E64: 0xC046, + 0x7E65: 0xC047, + 0x7E66: 0xC048, + 0x7E67: 0xC049, + 0x7E68: 0xC04A, + 0x7E69: 0xC04B, + 0x7E6A: 0xC04C, + 0x7E6B: 0xC04D, + 0x7E6C: 0xC04E, + 0x7E6D: 0xC04F, + 0x7E6E: 0xC050, + 0x7E6F: 0xC051, + 0x7E70: 0xC052, + 0x7E71: 0xC053, + 0x7E72: 0xC054, + 0x7E73: 0xC055, + 0x7E74: 0xC056, + 0x7E75: 0xC057, + 0x7E76: 0xC058, + 0x7E77: 0xC059, + 0x7E78: 0xC05A, + 0x7E79: 0xC05B, + 0x7E7A: 0xC05C, + 0x7E7B: 0xC05D, + 0x7E7C: 0xC05E, + 0x7E7D: 0xC05F, + 0x7E7E: 0xC060, + 0x7E7F: 0xC061, + 0x7E80: 0xC062, + 0x7E81: 0xC063, + 0x7E82: 0xD7EB, + 0x7E83: 0xC064, + 0x7E84: 0xC065, + 0x7E85: 0xC066, + 0x7E86: 0xC067, + 0x7E87: 0xC068, + 0x7E88: 0xC069, + 0x7E89: 0xC06A, + 0x7E8A: 0xC06B, + 0x7E8B: 0xC06C, + 0x7E8C: 0xC06D, + 0x7E8D: 0xC06E, + 0x7E8E: 0xC06F, + 0x7E8F: 0xC070, + 0x7E90: 0xC071, + 0x7E91: 0xC072, + 0x7E92: 0xC073, + 0x7E93: 0xC074, + 0x7E94: 0xC075, + 0x7E95: 0xC076, + 0x7E96: 0xC077, + 0x7E97: 0xC078, + 0x7E98: 0xC079, + 0x7E99: 0xC07A, + 0x7E9A: 0xC07B, + 0x7E9B: 0xF4EE, + 0x7E9C: 0xC07C, + 0x7E9D: 0xC07D, + 0x7E9E: 0xC07E, + 0x7E9F: 0xE6F9, + 0x7EA0: 0xBEC0, + 0x7EA1: 0xE6FA, + 0x7EA2: 0xBAEC, + 0x7EA3: 0xE6FB, + 0x7EA4: 0xCFCB, + 0x7EA5: 0xE6FC, + 0x7EA6: 0xD4BC, + 0x7EA7: 0xBCB6, + 0x7EA8: 0xE6FD, + 0x7EA9: 0xE6FE, + 0x7EAA: 0xBCCD, + 0x7EAB: 0xC8D2, + 0x7EAC: 0xCEB3, + 0x7EAD: 0xE7A1, + 0x7EAE: 0xC080, + 0x7EAF: 0xB4BF, + 0x7EB0: 0xE7A2, + 0x7EB1: 0xC9B4, + 0x7EB2: 0xB8D9, + 0x7EB3: 0xC4C9, + 0x7EB4: 0xC081, + 0x7EB5: 0xD7DD, + 0x7EB6: 0xC2DA, + 0x7EB7: 0xB7D7, + 0x7EB8: 0xD6BD, + 0x7EB9: 0xCEC6, + 0x7EBA: 0xB7C4, + 0x7EBB: 0xC082, + 0x7EBC: 0xC083, + 0x7EBD: 0xC5A6, + 0x7EBE: 0xE7A3, + 0x7EBF: 0xCFDF, + 0x7EC0: 0xE7A4, + 0x7EC1: 0xE7A5, + 0x7EC2: 0xE7A6, + 0x7EC3: 0xC1B7, + 0x7EC4: 0xD7E9, + 0x7EC5: 0xC9F0, + 0x7EC6: 0xCFB8, + 0x7EC7: 0xD6AF, + 0x7EC8: 0xD6D5, + 0x7EC9: 0xE7A7, + 0x7ECA: 0xB0ED, + 0x7ECB: 0xE7A8, + 0x7ECC: 0xE7A9, + 0x7ECD: 0xC9DC, + 0x7ECE: 0xD2EF, + 0x7ECF: 0xBEAD, + 0x7ED0: 0xE7AA, + 0x7ED1: 0xB0F3, + 0x7ED2: 0xC8DE, + 0x7ED3: 0xBDE1, + 0x7ED4: 0xE7AB, + 0x7ED5: 0xC8C6, + 0x7ED6: 0xC084, + 0x7ED7: 0xE7AC, + 0x7ED8: 0xBBE6, + 0x7ED9: 0xB8F8, + 0x7EDA: 0xD1A4, + 0x7EDB: 0xE7AD, + 0x7EDC: 0xC2E7, + 0x7EDD: 0xBEF8, + 0x7EDE: 0xBDCA, + 0x7EDF: 0xCDB3, + 0x7EE0: 0xE7AE, + 0x7EE1: 0xE7AF, + 0x7EE2: 0xBEEE, + 0x7EE3: 0xD0E5, + 0x7EE4: 0xC085, + 0x7EE5: 0xCBE7, + 0x7EE6: 0xCCD0, + 0x7EE7: 0xBCCC, + 0x7EE8: 0xE7B0, + 0x7EE9: 0xBCA8, + 0x7EEA: 0xD0F7, + 0x7EEB: 0xE7B1, + 0x7EEC: 0xC086, + 0x7EED: 0xD0F8, + 0x7EEE: 0xE7B2, + 0x7EEF: 0xE7B3, + 0x7EF0: 0xB4C2, + 0x7EF1: 0xE7B4, + 0x7EF2: 0xE7B5, + 0x7EF3: 0xC9FE, + 0x7EF4: 0xCEAC, + 0x7EF5: 0xC3E0, + 0x7EF6: 0xE7B7, + 0x7EF7: 0xB1C1, + 0x7EF8: 0xB3F1, + 0x7EF9: 0xC087, + 0x7EFA: 0xE7B8, + 0x7EFB: 0xE7B9, + 0x7EFC: 0xD7DB, + 0x7EFD: 0xD5C0, + 0x7EFE: 0xE7BA, + 0x7EFF: 0xC2CC, + 0x7F00: 0xD7BA, + 0x7F01: 0xE7BB, + 0x7F02: 0xE7BC, + 0x7F03: 0xE7BD, + 0x7F04: 0xBCEA, + 0x7F05: 0xC3E5, + 0x7F06: 0xC0C2, + 0x7F07: 0xE7BE, + 0x7F08: 0xE7BF, + 0x7F09: 0xBCA9, + 0x7F0A: 0xC088, + 0x7F0B: 0xE7C0, + 0x7F0C: 0xE7C1, + 0x7F0D: 0xE7B6, + 0x7F0E: 0xB6D0, + 0x7F0F: 0xE7C2, + 0x7F10: 0xC089, + 0x7F11: 0xE7C3, + 0x7F12: 0xE7C4, + 0x7F13: 0xBBBA, + 0x7F14: 0xB5DE, + 0x7F15: 0xC2C6, + 0x7F16: 0xB1E0, + 0x7F17: 0xE7C5, + 0x7F18: 0xD4B5, + 0x7F19: 0xE7C6, + 0x7F1A: 0xB8BF, + 0x7F1B: 0xE7C8, + 0x7F1C: 0xE7C7, + 0x7F1D: 0xB7EC, + 0x7F1E: 0xC08A, + 0x7F1F: 0xE7C9, + 0x7F20: 0xB2F8, + 0x7F21: 0xE7CA, + 0x7F22: 0xE7CB, + 0x7F23: 0xE7CC, + 0x7F24: 0xE7CD, + 0x7F25: 0xE7CE, + 0x7F26: 0xE7CF, + 0x7F27: 0xE7D0, + 0x7F28: 0xD3A7, + 0x7F29: 0xCBF5, + 0x7F2A: 0xE7D1, + 0x7F2B: 0xE7D2, + 0x7F2C: 0xE7D3, + 0x7F2D: 0xE7D4, + 0x7F2E: 0xC9C9, + 0x7F2F: 0xE7D5, + 0x7F30: 0xE7D6, + 0x7F31: 0xE7D7, + 0x7F32: 0xE7D8, + 0x7F33: 0xE7D9, + 0x7F34: 0xBDC9, + 0x7F35: 0xE7DA, + 0x7F36: 0xF3BE, + 0x7F37: 0xC08B, + 0x7F38: 0xB8D7, + 0x7F39: 0xC08C, + 0x7F3A: 0xC8B1, + 0x7F3B: 0xC08D, + 0x7F3C: 0xC08E, + 0x7F3D: 0xC08F, + 0x7F3E: 0xC090, + 0x7F3F: 0xC091, + 0x7F40: 0xC092, + 0x7F41: 0xC093, + 0x7F42: 0xF3BF, + 0x7F43: 0xC094, + 0x7F44: 0xF3C0, + 0x7F45: 0xF3C1, + 0x7F46: 0xC095, + 0x7F47: 0xC096, + 0x7F48: 0xC097, + 0x7F49: 0xC098, + 0x7F4A: 0xC099, + 0x7F4B: 0xC09A, + 0x7F4C: 0xC09B, + 0x7F4D: 0xC09C, + 0x7F4E: 0xC09D, + 0x7F4F: 0xC09E, + 0x7F50: 0xB9DE, + 0x7F51: 0xCDF8, + 0x7F52: 0xC09F, + 0x7F53: 0xC0A0, + 0x7F54: 0xD8E8, + 0x7F55: 0xBAB1, + 0x7F56: 0xC140, + 0x7F57: 0xC2DE, + 0x7F58: 0xEEB7, + 0x7F59: 0xC141, + 0x7F5A: 0xB7A3, + 0x7F5B: 0xC142, + 0x7F5C: 0xC143, + 0x7F5D: 0xC144, + 0x7F5E: 0xC145, + 0x7F5F: 0xEEB9, + 0x7F60: 0xC146, + 0x7F61: 0xEEB8, + 0x7F62: 0xB0D5, + 0x7F63: 0xC147, + 0x7F64: 0xC148, + 0x7F65: 0xC149, + 0x7F66: 0xC14A, + 0x7F67: 0xC14B, + 0x7F68: 0xEEBB, + 0x7F69: 0xD5D6, + 0x7F6A: 0xD7EF, + 0x7F6B: 0xC14C, + 0x7F6C: 0xC14D, + 0x7F6D: 0xC14E, + 0x7F6E: 0xD6C3, + 0x7F6F: 0xC14F, + 0x7F70: 0xC150, + 0x7F71: 0xEEBD, + 0x7F72: 0xCAF0, + 0x7F73: 0xC151, + 0x7F74: 0xEEBC, + 0x7F75: 0xC152, + 0x7F76: 0xC153, + 0x7F77: 0xC154, + 0x7F78: 0xC155, + 0x7F79: 0xEEBE, + 0x7F7A: 0xC156, + 0x7F7B: 0xC157, + 0x7F7C: 0xC158, + 0x7F7D: 0xC159, + 0x7F7E: 0xEEC0, + 0x7F7F: 0xC15A, + 0x7F80: 0xC15B, + 0x7F81: 0xEEBF, + 0x7F82: 0xC15C, + 0x7F83: 0xC15D, + 0x7F84: 0xC15E, + 0x7F85: 0xC15F, + 0x7F86: 0xC160, + 0x7F87: 0xC161, + 0x7F88: 0xC162, + 0x7F89: 0xC163, + 0x7F8A: 0xD1F2, + 0x7F8B: 0xC164, + 0x7F8C: 0xC7BC, + 0x7F8D: 0xC165, + 0x7F8E: 0xC3C0, + 0x7F8F: 0xC166, + 0x7F90: 0xC167, + 0x7F91: 0xC168, + 0x7F92: 0xC169, + 0x7F93: 0xC16A, + 0x7F94: 0xB8E1, + 0x7F95: 0xC16B, + 0x7F96: 0xC16C, + 0x7F97: 0xC16D, + 0x7F98: 0xC16E, + 0x7F99: 0xC16F, + 0x7F9A: 0xC1E7, + 0x7F9B: 0xC170, + 0x7F9C: 0xC171, + 0x7F9D: 0xF4C6, + 0x7F9E: 0xD0DF, + 0x7F9F: 0xF4C7, + 0x7FA0: 0xC172, + 0x7FA1: 0xCFDB, + 0x7FA2: 0xC173, + 0x7FA3: 0xC174, + 0x7FA4: 0xC8BA, + 0x7FA5: 0xC175, + 0x7FA6: 0xC176, + 0x7FA7: 0xF4C8, + 0x7FA8: 0xC177, + 0x7FA9: 0xC178, + 0x7FAA: 0xC179, + 0x7FAB: 0xC17A, + 0x7FAC: 0xC17B, + 0x7FAD: 0xC17C, + 0x7FAE: 0xC17D, + 0x7FAF: 0xF4C9, + 0x7FB0: 0xF4CA, + 0x7FB1: 0xC17E, + 0x7FB2: 0xF4CB, + 0x7FB3: 0xC180, + 0x7FB4: 0xC181, + 0x7FB5: 0xC182, + 0x7FB6: 0xC183, + 0x7FB7: 0xC184, + 0x7FB8: 0xD9FA, + 0x7FB9: 0xB8FE, + 0x7FBA: 0xC185, + 0x7FBB: 0xC186, + 0x7FBC: 0xE5F1, + 0x7FBD: 0xD3F0, + 0x7FBE: 0xC187, + 0x7FBF: 0xF4E0, + 0x7FC0: 0xC188, + 0x7FC1: 0xCECC, + 0x7FC2: 0xC189, + 0x7FC3: 0xC18A, + 0x7FC4: 0xC18B, + 0x7FC5: 0xB3E1, + 0x7FC6: 0xC18C, + 0x7FC7: 0xC18D, + 0x7FC8: 0xC18E, + 0x7FC9: 0xC18F, + 0x7FCA: 0xF1B4, + 0x7FCB: 0xC190, + 0x7FCC: 0xD2EE, + 0x7FCD: 0xC191, + 0x7FCE: 0xF4E1, + 0x7FCF: 0xC192, + 0x7FD0: 0xC193, + 0x7FD1: 0xC194, + 0x7FD2: 0xC195, + 0x7FD3: 0xC196, + 0x7FD4: 0xCFE8, + 0x7FD5: 0xF4E2, + 0x7FD6: 0xC197, + 0x7FD7: 0xC198, + 0x7FD8: 0xC7CC, + 0x7FD9: 0xC199, + 0x7FDA: 0xC19A, + 0x7FDB: 0xC19B, + 0x7FDC: 0xC19C, + 0x7FDD: 0xC19D, + 0x7FDE: 0xC19E, + 0x7FDF: 0xB5D4, + 0x7FE0: 0xB4E4, + 0x7FE1: 0xF4E4, + 0x7FE2: 0xC19F, + 0x7FE3: 0xC1A0, + 0x7FE4: 0xC240, + 0x7FE5: 0xF4E3, + 0x7FE6: 0xF4E5, + 0x7FE7: 0xC241, + 0x7FE8: 0xC242, + 0x7FE9: 0xF4E6, + 0x7FEA: 0xC243, + 0x7FEB: 0xC244, + 0x7FEC: 0xC245, + 0x7FED: 0xC246, + 0x7FEE: 0xF4E7, + 0x7FEF: 0xC247, + 0x7FF0: 0xBAB2, + 0x7FF1: 0xB0BF, + 0x7FF2: 0xC248, + 0x7FF3: 0xF4E8, + 0x7FF4: 0xC249, + 0x7FF5: 0xC24A, + 0x7FF6: 0xC24B, + 0x7FF7: 0xC24C, + 0x7FF8: 0xC24D, + 0x7FF9: 0xC24E, + 0x7FFA: 0xC24F, + 0x7FFB: 0xB7AD, + 0x7FFC: 0xD2ED, + 0x7FFD: 0xC250, + 0x7FFE: 0xC251, + 0x7FFF: 0xC252, + 0x8000: 0xD2AB, + 0x8001: 0xC0CF, + 0x8002: 0xC253, + 0x8003: 0xBFBC, + 0x8004: 0xEBA3, + 0x8005: 0xD5DF, + 0x8006: 0xEAC8, + 0x8007: 0xC254, + 0x8008: 0xC255, + 0x8009: 0xC256, + 0x800A: 0xC257, + 0x800B: 0xF1F3, + 0x800C: 0xB6F8, + 0x800D: 0xCBA3, + 0x800E: 0xC258, + 0x800F: 0xC259, + 0x8010: 0xC4CD, + 0x8011: 0xC25A, + 0x8012: 0xF1E7, + 0x8013: 0xC25B, + 0x8014: 0xF1E8, + 0x8015: 0xB8FB, + 0x8016: 0xF1E9, + 0x8017: 0xBAC4, + 0x8018: 0xD4C5, + 0x8019: 0xB0D2, + 0x801A: 0xC25C, + 0x801B: 0xC25D, + 0x801C: 0xF1EA, + 0x801D: 0xC25E, + 0x801E: 0xC25F, + 0x801F: 0xC260, + 0x8020: 0xF1EB, + 0x8021: 0xC261, + 0x8022: 0xF1EC, + 0x8023: 0xC262, + 0x8024: 0xC263, + 0x8025: 0xF1ED, + 0x8026: 0xF1EE, + 0x8027: 0xF1EF, + 0x8028: 0xF1F1, + 0x8029: 0xF1F0, + 0x802A: 0xC5D5, + 0x802B: 0xC264, + 0x802C: 0xC265, + 0x802D: 0xC266, + 0x802E: 0xC267, + 0x802F: 0xC268, + 0x8030: 0xC269, + 0x8031: 0xF1F2, + 0x8032: 0xC26A, + 0x8033: 0xB6FA, + 0x8034: 0xC26B, + 0x8035: 0xF1F4, + 0x8036: 0xD2AE, + 0x8037: 0xDEC7, + 0x8038: 0xCBCA, + 0x8039: 0xC26C, + 0x803A: 0xC26D, + 0x803B: 0xB3DC, + 0x803C: 0xC26E, + 0x803D: 0xB5A2, + 0x803E: 0xC26F, + 0x803F: 0xB9A2, + 0x8040: 0xC270, + 0x8041: 0xC271, + 0x8042: 0xC4F4, + 0x8043: 0xF1F5, + 0x8044: 0xC272, + 0x8045: 0xC273, + 0x8046: 0xF1F6, + 0x8047: 0xC274, + 0x8048: 0xC275, + 0x8049: 0xC276, + 0x804A: 0xC1C4, + 0x804B: 0xC1FB, + 0x804C: 0xD6B0, + 0x804D: 0xF1F7, + 0x804E: 0xC277, + 0x804F: 0xC278, + 0x8050: 0xC279, + 0x8051: 0xC27A, + 0x8052: 0xF1F8, + 0x8053: 0xC27B, + 0x8054: 0xC1AA, + 0x8055: 0xC27C, + 0x8056: 0xC27D, + 0x8057: 0xC27E, + 0x8058: 0xC6B8, + 0x8059: 0xC280, + 0x805A: 0xBEDB, + 0x805B: 0xC281, + 0x805C: 0xC282, + 0x805D: 0xC283, + 0x805E: 0xC284, + 0x805F: 0xC285, + 0x8060: 0xC286, + 0x8061: 0xC287, + 0x8062: 0xC288, + 0x8063: 0xC289, + 0x8064: 0xC28A, + 0x8065: 0xC28B, + 0x8066: 0xC28C, + 0x8067: 0xC28D, + 0x8068: 0xC28E, + 0x8069: 0xF1F9, + 0x806A: 0xB4CF, + 0x806B: 0xC28F, + 0x806C: 0xC290, + 0x806D: 0xC291, + 0x806E: 0xC292, + 0x806F: 0xC293, + 0x8070: 0xC294, + 0x8071: 0xF1FA, + 0x8072: 0xC295, + 0x8073: 0xC296, + 0x8074: 0xC297, + 0x8075: 0xC298, + 0x8076: 0xC299, + 0x8077: 0xC29A, + 0x8078: 0xC29B, + 0x8079: 0xC29C, + 0x807A: 0xC29D, + 0x807B: 0xC29E, + 0x807C: 0xC29F, + 0x807D: 0xC2A0, + 0x807E: 0xC340, + 0x807F: 0xEDB2, + 0x8080: 0xEDB1, + 0x8081: 0xC341, + 0x8082: 0xC342, + 0x8083: 0xCBE0, + 0x8084: 0xD2DE, + 0x8085: 0xC343, + 0x8086: 0xCBC1, + 0x8087: 0xD5D8, + 0x8088: 0xC344, + 0x8089: 0xC8E2, + 0x808A: 0xC345, + 0x808B: 0xC0DF, + 0x808C: 0xBCA1, + 0x808D: 0xC346, + 0x808E: 0xC347, + 0x808F: 0xC348, + 0x8090: 0xC349, + 0x8091: 0xC34A, + 0x8092: 0xC34B, + 0x8093: 0xEBC1, + 0x8094: 0xC34C, + 0x8095: 0xC34D, + 0x8096: 0xD0A4, + 0x8097: 0xC34E, + 0x8098: 0xD6E2, + 0x8099: 0xC34F, + 0x809A: 0xB6C7, + 0x809B: 0xB8D8, + 0x809C: 0xEBC0, + 0x809D: 0xB8CE, + 0x809E: 0xC350, + 0x809F: 0xEBBF, + 0x80A0: 0xB3A6, + 0x80A1: 0xB9C9, + 0x80A2: 0xD6AB, + 0x80A3: 0xC351, + 0x80A4: 0xB7F4, + 0x80A5: 0xB7CA, + 0x80A6: 0xC352, + 0x80A7: 0xC353, + 0x80A8: 0xC354, + 0x80A9: 0xBCE7, + 0x80AA: 0xB7BE, + 0x80AB: 0xEBC6, + 0x80AC: 0xC355, + 0x80AD: 0xEBC7, + 0x80AE: 0xB0B9, + 0x80AF: 0xBFCF, + 0x80B0: 0xC356, + 0x80B1: 0xEBC5, + 0x80B2: 0xD3FD, + 0x80B3: 0xC357, + 0x80B4: 0xEBC8, + 0x80B5: 0xC358, + 0x80B6: 0xC359, + 0x80B7: 0xEBC9, + 0x80B8: 0xC35A, + 0x80B9: 0xC35B, + 0x80BA: 0xB7CE, + 0x80BB: 0xC35C, + 0x80BC: 0xEBC2, + 0x80BD: 0xEBC4, + 0x80BE: 0xC9F6, + 0x80BF: 0xD6D7, + 0x80C0: 0xD5CD, + 0x80C1: 0xD0B2, + 0x80C2: 0xEBCF, + 0x80C3: 0xCEB8, + 0x80C4: 0xEBD0, + 0x80C5: 0xC35D, + 0x80C6: 0xB5A8, + 0x80C7: 0xC35E, + 0x80C8: 0xC35F, + 0x80C9: 0xC360, + 0x80CA: 0xC361, + 0x80CB: 0xC362, + 0x80CC: 0xB1B3, + 0x80CD: 0xEBD2, + 0x80CE: 0xCCA5, + 0x80CF: 0xC363, + 0x80D0: 0xC364, + 0x80D1: 0xC365, + 0x80D2: 0xC366, + 0x80D3: 0xC367, + 0x80D4: 0xC368, + 0x80D5: 0xC369, + 0x80D6: 0xC5D6, + 0x80D7: 0xEBD3, + 0x80D8: 0xC36A, + 0x80D9: 0xEBD1, + 0x80DA: 0xC5DF, + 0x80DB: 0xEBCE, + 0x80DC: 0xCAA4, + 0x80DD: 0xEBD5, + 0x80DE: 0xB0FB, + 0x80DF: 0xC36B, + 0x80E0: 0xC36C, + 0x80E1: 0xBAFA, + 0x80E2: 0xC36D, + 0x80E3: 0xC36E, + 0x80E4: 0xD8B7, + 0x80E5: 0xF1E3, + 0x80E6: 0xC36F, + 0x80E7: 0xEBCA, + 0x80E8: 0xEBCB, + 0x80E9: 0xEBCC, + 0x80EA: 0xEBCD, + 0x80EB: 0xEBD6, + 0x80EC: 0xE6C0, + 0x80ED: 0xEBD9, + 0x80EE: 0xC370, + 0x80EF: 0xBFE8, + 0x80F0: 0xD2C8, + 0x80F1: 0xEBD7, + 0x80F2: 0xEBDC, + 0x80F3: 0xB8EC, + 0x80F4: 0xEBD8, + 0x80F5: 0xC371, + 0x80F6: 0xBDBA, + 0x80F7: 0xC372, + 0x80F8: 0xD0D8, + 0x80F9: 0xC373, + 0x80FA: 0xB0B7, + 0x80FB: 0xC374, + 0x80FC: 0xEBDD, + 0x80FD: 0xC4DC, + 0x80FE: 0xC375, + 0x80FF: 0xC376, + 0x8100: 0xC377, + 0x8101: 0xC378, + 0x8102: 0xD6AC, + 0x8103: 0xC379, + 0x8104: 0xC37A, + 0x8105: 0xC37B, + 0x8106: 0xB4E0, + 0x8107: 0xC37C, + 0x8108: 0xC37D, + 0x8109: 0xC2F6, + 0x810A: 0xBCB9, + 0x810B: 0xC37E, + 0x810C: 0xC380, + 0x810D: 0xEBDA, + 0x810E: 0xEBDB, + 0x810F: 0xD4E0, + 0x8110: 0xC6EA, + 0x8111: 0xC4D4, + 0x8112: 0xEBDF, + 0x8113: 0xC5A7, + 0x8114: 0xD9F5, + 0x8115: 0xC381, + 0x8116: 0xB2B1, + 0x8117: 0xC382, + 0x8118: 0xEBE4, + 0x8119: 0xC383, + 0x811A: 0xBDC5, + 0x811B: 0xC384, + 0x811C: 0xC385, + 0x811D: 0xC386, + 0x811E: 0xEBE2, + 0x811F: 0xC387, + 0x8120: 0xC388, + 0x8121: 0xC389, + 0x8122: 0xC38A, + 0x8123: 0xC38B, + 0x8124: 0xC38C, + 0x8125: 0xC38D, + 0x8126: 0xC38E, + 0x8127: 0xC38F, + 0x8128: 0xC390, + 0x8129: 0xC391, + 0x812A: 0xC392, + 0x812B: 0xC393, + 0x812C: 0xEBE3, + 0x812D: 0xC394, + 0x812E: 0xC395, + 0x812F: 0xB8AC, + 0x8130: 0xC396, + 0x8131: 0xCDD1, + 0x8132: 0xEBE5, + 0x8133: 0xC397, + 0x8134: 0xC398, + 0x8135: 0xC399, + 0x8136: 0xEBE1, + 0x8137: 0xC39A, + 0x8138: 0xC1B3, + 0x8139: 0xC39B, + 0x813A: 0xC39C, + 0x813B: 0xC39D, + 0x813C: 0xC39E, + 0x813D: 0xC39F, + 0x813E: 0xC6A2, + 0x813F: 0xC3A0, + 0x8140: 0xC440, + 0x8141: 0xC441, + 0x8142: 0xC442, + 0x8143: 0xC443, + 0x8144: 0xC444, + 0x8145: 0xC445, + 0x8146: 0xCCF3, + 0x8147: 0xC446, + 0x8148: 0xEBE6, + 0x8149: 0xC447, + 0x814A: 0xC0B0, + 0x814B: 0xD2B8, + 0x814C: 0xEBE7, + 0x814D: 0xC448, + 0x814E: 0xC449, + 0x814F: 0xC44A, + 0x8150: 0xB8AF, + 0x8151: 0xB8AD, + 0x8152: 0xC44B, + 0x8153: 0xEBE8, + 0x8154: 0xC7BB, + 0x8155: 0xCDF3, + 0x8156: 0xC44C, + 0x8157: 0xC44D, + 0x8158: 0xC44E, + 0x8159: 0xEBEA, + 0x815A: 0xEBEB, + 0x815B: 0xC44F, + 0x815C: 0xC450, + 0x815D: 0xC451, + 0x815E: 0xC452, + 0x815F: 0xC453, + 0x8160: 0xEBED, + 0x8161: 0xC454, + 0x8162: 0xC455, + 0x8163: 0xC456, + 0x8164: 0xC457, + 0x8165: 0xD0C8, + 0x8166: 0xC458, + 0x8167: 0xEBF2, + 0x8168: 0xC459, + 0x8169: 0xEBEE, + 0x816A: 0xC45A, + 0x816B: 0xC45B, + 0x816C: 0xC45C, + 0x816D: 0xEBF1, + 0x816E: 0xC8F9, + 0x816F: 0xC45D, + 0x8170: 0xD1FC, + 0x8171: 0xEBEC, + 0x8172: 0xC45E, + 0x8173: 0xC45F, + 0x8174: 0xEBE9, + 0x8175: 0xC460, + 0x8176: 0xC461, + 0x8177: 0xC462, + 0x8178: 0xC463, + 0x8179: 0xB8B9, + 0x817A: 0xCFD9, + 0x817B: 0xC4E5, + 0x817C: 0xEBEF, + 0x817D: 0xEBF0, + 0x817E: 0xCCDA, + 0x817F: 0xCDC8, + 0x8180: 0xB0F2, + 0x8181: 0xC464, + 0x8182: 0xEBF6, + 0x8183: 0xC465, + 0x8184: 0xC466, + 0x8185: 0xC467, + 0x8186: 0xC468, + 0x8187: 0xC469, + 0x8188: 0xEBF5, + 0x8189: 0xC46A, + 0x818A: 0xB2B2, + 0x818B: 0xC46B, + 0x818C: 0xC46C, + 0x818D: 0xC46D, + 0x818E: 0xC46E, + 0x818F: 0xB8E0, + 0x8190: 0xC46F, + 0x8191: 0xEBF7, + 0x8192: 0xC470, + 0x8193: 0xC471, + 0x8194: 0xC472, + 0x8195: 0xC473, + 0x8196: 0xC474, + 0x8197: 0xC475, + 0x8198: 0xB1EC, + 0x8199: 0xC476, + 0x819A: 0xC477, + 0x819B: 0xCCC5, + 0x819C: 0xC4A4, + 0x819D: 0xCFA5, + 0x819E: 0xC478, + 0x819F: 0xC479, + 0x81A0: 0xC47A, + 0x81A1: 0xC47B, + 0x81A2: 0xC47C, + 0x81A3: 0xEBF9, + 0x81A4: 0xC47D, + 0x81A5: 0xC47E, + 0x81A6: 0xECA2, + 0x81A7: 0xC480, + 0x81A8: 0xC5F2, + 0x81A9: 0xC481, + 0x81AA: 0xEBFA, + 0x81AB: 0xC482, + 0x81AC: 0xC483, + 0x81AD: 0xC484, + 0x81AE: 0xC485, + 0x81AF: 0xC486, + 0x81B0: 0xC487, + 0x81B1: 0xC488, + 0x81B2: 0xC489, + 0x81B3: 0xC9C5, + 0x81B4: 0xC48A, + 0x81B5: 0xC48B, + 0x81B6: 0xC48C, + 0x81B7: 0xC48D, + 0x81B8: 0xC48E, + 0x81B9: 0xC48F, + 0x81BA: 0xE2DF, + 0x81BB: 0xEBFE, + 0x81BC: 0xC490, + 0x81BD: 0xC491, + 0x81BE: 0xC492, + 0x81BF: 0xC493, + 0x81C0: 0xCDCE, + 0x81C1: 0xECA1, + 0x81C2: 0xB1DB, + 0x81C3: 0xD3B7, + 0x81C4: 0xC494, + 0x81C5: 0xC495, + 0x81C6: 0xD2DC, + 0x81C7: 0xC496, + 0x81C8: 0xC497, + 0x81C9: 0xC498, + 0x81CA: 0xEBFD, + 0x81CB: 0xC499, + 0x81CC: 0xEBFB, + 0x81CD: 0xC49A, + 0x81CE: 0xC49B, + 0x81CF: 0xC49C, + 0x81D0: 0xC49D, + 0x81D1: 0xC49E, + 0x81D2: 0xC49F, + 0x81D3: 0xC4A0, + 0x81D4: 0xC540, + 0x81D5: 0xC541, + 0x81D6: 0xC542, + 0x81D7: 0xC543, + 0x81D8: 0xC544, + 0x81D9: 0xC545, + 0x81DA: 0xC546, + 0x81DB: 0xC547, + 0x81DC: 0xC548, + 0x81DD: 0xC549, + 0x81DE: 0xC54A, + 0x81DF: 0xC54B, + 0x81E0: 0xC54C, + 0x81E1: 0xC54D, + 0x81E2: 0xC54E, + 0x81E3: 0xB3BC, + 0x81E4: 0xC54F, + 0x81E5: 0xC550, + 0x81E6: 0xC551, + 0x81E7: 0xEAB0, + 0x81E8: 0xC552, + 0x81E9: 0xC553, + 0x81EA: 0xD7D4, + 0x81EB: 0xC554, + 0x81EC: 0xF4AB, + 0x81ED: 0xB3F4, + 0x81EE: 0xC555, + 0x81EF: 0xC556, + 0x81F0: 0xC557, + 0x81F1: 0xC558, + 0x81F2: 0xC559, + 0x81F3: 0xD6C1, + 0x81F4: 0xD6C2, + 0x81F5: 0xC55A, + 0x81F6: 0xC55B, + 0x81F7: 0xC55C, + 0x81F8: 0xC55D, + 0x81F9: 0xC55E, + 0x81FA: 0xC55F, + 0x81FB: 0xD5E9, + 0x81FC: 0xBECA, + 0x81FD: 0xC560, + 0x81FE: 0xF4A7, + 0x81FF: 0xC561, + 0x8200: 0xD2A8, + 0x8201: 0xF4A8, + 0x8202: 0xF4A9, + 0x8203: 0xC562, + 0x8204: 0xF4AA, + 0x8205: 0xBECB, + 0x8206: 0xD3DF, + 0x8207: 0xC563, + 0x8208: 0xC564, + 0x8209: 0xC565, + 0x820A: 0xC566, + 0x820B: 0xC567, + 0x820C: 0xC9E0, + 0x820D: 0xC9E1, + 0x820E: 0xC568, + 0x820F: 0xC569, + 0x8210: 0xF3C2, + 0x8211: 0xC56A, + 0x8212: 0xCAE6, + 0x8213: 0xC56B, + 0x8214: 0xCCF2, + 0x8215: 0xC56C, + 0x8216: 0xC56D, + 0x8217: 0xC56E, + 0x8218: 0xC56F, + 0x8219: 0xC570, + 0x821A: 0xC571, + 0x821B: 0xE2B6, + 0x821C: 0xCBB4, + 0x821D: 0xC572, + 0x821E: 0xCEE8, + 0x821F: 0xD6DB, + 0x8220: 0xC573, + 0x8221: 0xF4AD, + 0x8222: 0xF4AE, + 0x8223: 0xF4AF, + 0x8224: 0xC574, + 0x8225: 0xC575, + 0x8226: 0xC576, + 0x8227: 0xC577, + 0x8228: 0xF4B2, + 0x8229: 0xC578, + 0x822A: 0xBABD, + 0x822B: 0xF4B3, + 0x822C: 0xB0E3, + 0x822D: 0xF4B0, + 0x822E: 0xC579, + 0x822F: 0xF4B1, + 0x8230: 0xBDA2, + 0x8231: 0xB2D5, + 0x8232: 0xC57A, + 0x8233: 0xF4B6, + 0x8234: 0xF4B7, + 0x8235: 0xB6E6, + 0x8236: 0xB2B0, + 0x8237: 0xCFCF, + 0x8238: 0xF4B4, + 0x8239: 0xB4AC, + 0x823A: 0xC57B, + 0x823B: 0xF4B5, + 0x823C: 0xC57C, + 0x823D: 0xC57D, + 0x823E: 0xF4B8, + 0x823F: 0xC57E, + 0x8240: 0xC580, + 0x8241: 0xC581, + 0x8242: 0xC582, + 0x8243: 0xC583, + 0x8244: 0xF4B9, + 0x8245: 0xC584, + 0x8246: 0xC585, + 0x8247: 0xCDA7, + 0x8248: 0xC586, + 0x8249: 0xF4BA, + 0x824A: 0xC587, + 0x824B: 0xF4BB, + 0x824C: 0xC588, + 0x824D: 0xC589, + 0x824E: 0xC58A, + 0x824F: 0xF4BC, + 0x8250: 0xC58B, + 0x8251: 0xC58C, + 0x8252: 0xC58D, + 0x8253: 0xC58E, + 0x8254: 0xC58F, + 0x8255: 0xC590, + 0x8256: 0xC591, + 0x8257: 0xC592, + 0x8258: 0xCBD2, + 0x8259: 0xC593, + 0x825A: 0xF4BD, + 0x825B: 0xC594, + 0x825C: 0xC595, + 0x825D: 0xC596, + 0x825E: 0xC597, + 0x825F: 0xF4BE, + 0x8260: 0xC598, + 0x8261: 0xC599, + 0x8262: 0xC59A, + 0x8263: 0xC59B, + 0x8264: 0xC59C, + 0x8265: 0xC59D, + 0x8266: 0xC59E, + 0x8267: 0xC59F, + 0x8268: 0xF4BF, + 0x8269: 0xC5A0, + 0x826A: 0xC640, + 0x826B: 0xC641, + 0x826C: 0xC642, + 0x826D: 0xC643, + 0x826E: 0xF4DE, + 0x826F: 0xC1BC, + 0x8270: 0xBCE8, + 0x8271: 0xC644, + 0x8272: 0xC9AB, + 0x8273: 0xD1DE, + 0x8274: 0xE5F5, + 0x8275: 0xC645, + 0x8276: 0xC646, + 0x8277: 0xC647, + 0x8278: 0xC648, + 0x8279: 0xDCB3, + 0x827A: 0xD2D5, + 0x827B: 0xC649, + 0x827C: 0xC64A, + 0x827D: 0xDCB4, + 0x827E: 0xB0AC, + 0x827F: 0xDCB5, + 0x8280: 0xC64B, + 0x8281: 0xC64C, + 0x8282: 0xBDDA, + 0x8283: 0xC64D, + 0x8284: 0xDCB9, + 0x8285: 0xC64E, + 0x8286: 0xC64F, + 0x8287: 0xC650, + 0x8288: 0xD8C2, + 0x8289: 0xC651, + 0x828A: 0xDCB7, + 0x828B: 0xD3F3, + 0x828C: 0xC652, + 0x828D: 0xC9D6, + 0x828E: 0xDCBA, + 0x828F: 0xDCB6, + 0x8290: 0xC653, + 0x8291: 0xDCBB, + 0x8292: 0xC3A2, + 0x8293: 0xC654, + 0x8294: 0xC655, + 0x8295: 0xC656, + 0x8296: 0xC657, + 0x8297: 0xDCBC, + 0x8298: 0xDCC5, + 0x8299: 0xDCBD, + 0x829A: 0xC658, + 0x829B: 0xC659, + 0x829C: 0xCEDF, + 0x829D: 0xD6A5, + 0x829E: 0xC65A, + 0x829F: 0xDCCF, + 0x82A0: 0xC65B, + 0x82A1: 0xDCCD, + 0x82A2: 0xC65C, + 0x82A3: 0xC65D, + 0x82A4: 0xDCD2, + 0x82A5: 0xBDE6, + 0x82A6: 0xC2AB, + 0x82A7: 0xC65E, + 0x82A8: 0xDCB8, + 0x82A9: 0xDCCB, + 0x82AA: 0xDCCE, + 0x82AB: 0xDCBE, + 0x82AC: 0xB7D2, + 0x82AD: 0xB0C5, + 0x82AE: 0xDCC7, + 0x82AF: 0xD0BE, + 0x82B0: 0xDCC1, + 0x82B1: 0xBBA8, + 0x82B2: 0xC65F, + 0x82B3: 0xB7BC, + 0x82B4: 0xDCCC, + 0x82B5: 0xC660, + 0x82B6: 0xC661, + 0x82B7: 0xDCC6, + 0x82B8: 0xDCBF, + 0x82B9: 0xC7DB, + 0x82BA: 0xC662, + 0x82BB: 0xC663, + 0x82BC: 0xC664, + 0x82BD: 0xD1BF, + 0x82BE: 0xDCC0, + 0x82BF: 0xC665, + 0x82C0: 0xC666, + 0x82C1: 0xDCCA, + 0x82C2: 0xC667, + 0x82C3: 0xC668, + 0x82C4: 0xDCD0, + 0x82C5: 0xC669, + 0x82C6: 0xC66A, + 0x82C7: 0xCEAD, + 0x82C8: 0xDCC2, + 0x82C9: 0xC66B, + 0x82CA: 0xDCC3, + 0x82CB: 0xDCC8, + 0x82CC: 0xDCC9, + 0x82CD: 0xB2D4, + 0x82CE: 0xDCD1, + 0x82CF: 0xCBD5, + 0x82D0: 0xC66C, + 0x82D1: 0xD4B7, + 0x82D2: 0xDCDB, + 0x82D3: 0xDCDF, + 0x82D4: 0xCCA6, + 0x82D5: 0xDCE6, + 0x82D6: 0xC66D, + 0x82D7: 0xC3E7, + 0x82D8: 0xDCDC, + 0x82D9: 0xC66E, + 0x82DA: 0xC66F, + 0x82DB: 0xBFC1, + 0x82DC: 0xDCD9, + 0x82DD: 0xC670, + 0x82DE: 0xB0FA, + 0x82DF: 0xB9B6, + 0x82E0: 0xDCE5, + 0x82E1: 0xDCD3, + 0x82E2: 0xC671, + 0x82E3: 0xDCC4, + 0x82E4: 0xDCD6, + 0x82E5: 0xC8F4, + 0x82E6: 0xBFE0, + 0x82E7: 0xC672, + 0x82E8: 0xC673, + 0x82E9: 0xC674, + 0x82EA: 0xC675, + 0x82EB: 0xC9BB, + 0x82EC: 0xC676, + 0x82ED: 0xC677, + 0x82EE: 0xC678, + 0x82EF: 0xB1BD, + 0x82F0: 0xC679, + 0x82F1: 0xD3A2, + 0x82F2: 0xC67A, + 0x82F3: 0xC67B, + 0x82F4: 0xDCDA, + 0x82F5: 0xC67C, + 0x82F6: 0xC67D, + 0x82F7: 0xDCD5, + 0x82F8: 0xC67E, + 0x82F9: 0xC6BB, + 0x82FA: 0xC680, + 0x82FB: 0xDCDE, + 0x82FC: 0xC681, + 0x82FD: 0xC682, + 0x82FE: 0xC683, + 0x82FF: 0xC684, + 0x8300: 0xC685, + 0x8301: 0xD7C2, + 0x8302: 0xC3AF, + 0x8303: 0xB7B6, + 0x8304: 0xC7D1, + 0x8305: 0xC3A9, + 0x8306: 0xDCE2, + 0x8307: 0xDCD8, + 0x8308: 0xDCEB, + 0x8309: 0xDCD4, + 0x830A: 0xC686, + 0x830B: 0xC687, + 0x830C: 0xDCDD, + 0x830D: 0xC688, + 0x830E: 0xBEA5, + 0x830F: 0xDCD7, + 0x8310: 0xC689, + 0x8311: 0xDCE0, + 0x8312: 0xC68A, + 0x8313: 0xC68B, + 0x8314: 0xDCE3, + 0x8315: 0xDCE4, + 0x8316: 0xC68C, + 0x8317: 0xDCF8, + 0x8318: 0xC68D, + 0x8319: 0xC68E, + 0x831A: 0xDCE1, + 0x831B: 0xDDA2, + 0x831C: 0xDCE7, + 0x831D: 0xC68F, + 0x831E: 0xC690, + 0x831F: 0xC691, + 0x8320: 0xC692, + 0x8321: 0xC693, + 0x8322: 0xC694, + 0x8323: 0xC695, + 0x8324: 0xC696, + 0x8325: 0xC697, + 0x8326: 0xC698, + 0x8327: 0xBCEB, + 0x8328: 0xB4C4, + 0x8329: 0xC699, + 0x832A: 0xC69A, + 0x832B: 0xC3A3, + 0x832C: 0xB2E7, + 0x832D: 0xDCFA, + 0x832E: 0xC69B, + 0x832F: 0xDCF2, + 0x8330: 0xC69C, + 0x8331: 0xDCEF, + 0x8332: 0xC69D, + 0x8333: 0xDCFC, + 0x8334: 0xDCEE, + 0x8335: 0xD2F0, + 0x8336: 0xB2E8, + 0x8337: 0xC69E, + 0x8338: 0xC8D7, + 0x8339: 0xC8E3, + 0x833A: 0xDCFB, + 0x833B: 0xC69F, + 0x833C: 0xDCED, + 0x833D: 0xC6A0, + 0x833E: 0xC740, + 0x833F: 0xC741, + 0x8340: 0xDCF7, + 0x8341: 0xC742, + 0x8342: 0xC743, + 0x8343: 0xDCF5, + 0x8344: 0xC744, + 0x8345: 0xC745, + 0x8346: 0xBEA3, + 0x8347: 0xDCF4, + 0x8348: 0xC746, + 0x8349: 0xB2DD, + 0x834A: 0xC747, + 0x834B: 0xC748, + 0x834C: 0xC749, + 0x834D: 0xC74A, + 0x834E: 0xC74B, + 0x834F: 0xDCF3, + 0x8350: 0xBCF6, + 0x8351: 0xDCE8, + 0x8352: 0xBBC4, + 0x8353: 0xC74C, + 0x8354: 0xC0F3, + 0x8355: 0xC74D, + 0x8356: 0xC74E, + 0x8357: 0xC74F, + 0x8358: 0xC750, + 0x8359: 0xC751, + 0x835A: 0xBCD4, + 0x835B: 0xDCE9, + 0x835C: 0xDCEA, + 0x835D: 0xC752, + 0x835E: 0xDCF1, + 0x835F: 0xDCF6, + 0x8360: 0xDCF9, + 0x8361: 0xB5B4, + 0x8362: 0xC753, + 0x8363: 0xC8D9, + 0x8364: 0xBBE7, + 0x8365: 0xDCFE, + 0x8366: 0xDCFD, + 0x8367: 0xD3AB, + 0x8368: 0xDDA1, + 0x8369: 0xDDA3, + 0x836A: 0xDDA5, + 0x836B: 0xD2F1, + 0x836C: 0xDDA4, + 0x836D: 0xDDA6, + 0x836E: 0xDDA7, + 0x836F: 0xD2A9, + 0x8370: 0xC754, + 0x8371: 0xC755, + 0x8372: 0xC756, + 0x8373: 0xC757, + 0x8374: 0xC758, + 0x8375: 0xC759, + 0x8376: 0xC75A, + 0x8377: 0xBAC9, + 0x8378: 0xDDA9, + 0x8379: 0xC75B, + 0x837A: 0xC75C, + 0x837B: 0xDDB6, + 0x837C: 0xDDB1, + 0x837D: 0xDDB4, + 0x837E: 0xC75D, + 0x837F: 0xC75E, + 0x8380: 0xC75F, + 0x8381: 0xC760, + 0x8382: 0xC761, + 0x8383: 0xC762, + 0x8384: 0xC763, + 0x8385: 0xDDB0, + 0x8386: 0xC6CE, + 0x8387: 0xC764, + 0x8388: 0xC765, + 0x8389: 0xC0F2, + 0x838A: 0xC766, + 0x838B: 0xC767, + 0x838C: 0xC768, + 0x838D: 0xC769, + 0x838E: 0xC9AF, + 0x838F: 0xC76A, + 0x8390: 0xC76B, + 0x8391: 0xC76C, + 0x8392: 0xDCEC, + 0x8393: 0xDDAE, + 0x8394: 0xC76D, + 0x8395: 0xC76E, + 0x8396: 0xC76F, + 0x8397: 0xC770, + 0x8398: 0xDDB7, + 0x8399: 0xC771, + 0x839A: 0xC772, + 0x839B: 0xDCF0, + 0x839C: 0xDDAF, + 0x839D: 0xC773, + 0x839E: 0xDDB8, + 0x839F: 0xC774, + 0x83A0: 0xDDAC, + 0x83A1: 0xC775, + 0x83A2: 0xC776, + 0x83A3: 0xC777, + 0x83A4: 0xC778, + 0x83A5: 0xC779, + 0x83A6: 0xC77A, + 0x83A7: 0xC77B, + 0x83A8: 0xDDB9, + 0x83A9: 0xDDB3, + 0x83AA: 0xDDAD, + 0x83AB: 0xC4AA, + 0x83AC: 0xC77C, + 0x83AD: 0xC77D, + 0x83AE: 0xC77E, + 0x83AF: 0xC780, + 0x83B0: 0xDDA8, + 0x83B1: 0xC0B3, + 0x83B2: 0xC1AB, + 0x83B3: 0xDDAA, + 0x83B4: 0xDDAB, + 0x83B5: 0xC781, + 0x83B6: 0xDDB2, + 0x83B7: 0xBBF1, + 0x83B8: 0xDDB5, + 0x83B9: 0xD3A8, + 0x83BA: 0xDDBA, + 0x83BB: 0xC782, + 0x83BC: 0xDDBB, + 0x83BD: 0xC3A7, + 0x83BE: 0xC783, + 0x83BF: 0xC784, + 0x83C0: 0xDDD2, + 0x83C1: 0xDDBC, + 0x83C2: 0xC785, + 0x83C3: 0xC786, + 0x83C4: 0xC787, + 0x83C5: 0xDDD1, + 0x83C6: 0xC788, + 0x83C7: 0xB9BD, + 0x83C8: 0xC789, + 0x83C9: 0xC78A, + 0x83CA: 0xBED5, + 0x83CB: 0xC78B, + 0x83CC: 0xBEFA, + 0x83CD: 0xC78C, + 0x83CE: 0xC78D, + 0x83CF: 0xBACA, + 0x83D0: 0xC78E, + 0x83D1: 0xC78F, + 0x83D2: 0xC790, + 0x83D3: 0xC791, + 0x83D4: 0xDDCA, + 0x83D5: 0xC792, + 0x83D6: 0xDDC5, + 0x83D7: 0xC793, + 0x83D8: 0xDDBF, + 0x83D9: 0xC794, + 0x83DA: 0xC795, + 0x83DB: 0xC796, + 0x83DC: 0xB2CB, + 0x83DD: 0xDDC3, + 0x83DE: 0xC797, + 0x83DF: 0xDDCB, + 0x83E0: 0xB2A4, + 0x83E1: 0xDDD5, + 0x83E2: 0xC798, + 0x83E3: 0xC799, + 0x83E4: 0xC79A, + 0x83E5: 0xDDBE, + 0x83E6: 0xC79B, + 0x83E7: 0xC79C, + 0x83E8: 0xC79D, + 0x83E9: 0xC6D0, + 0x83EA: 0xDDD0, + 0x83EB: 0xC79E, + 0x83EC: 0xC79F, + 0x83ED: 0xC7A0, + 0x83EE: 0xC840, + 0x83EF: 0xC841, + 0x83F0: 0xDDD4, + 0x83F1: 0xC1E2, + 0x83F2: 0xB7C6, + 0x83F3: 0xC842, + 0x83F4: 0xC843, + 0x83F5: 0xC844, + 0x83F6: 0xC845, + 0x83F7: 0xC846, + 0x83F8: 0xDDCE, + 0x83F9: 0xDDCF, + 0x83FA: 0xC847, + 0x83FB: 0xC848, + 0x83FC: 0xC849, + 0x83FD: 0xDDC4, + 0x83FE: 0xC84A, + 0x83FF: 0xC84B, + 0x8400: 0xC84C, + 0x8401: 0xDDBD, + 0x8402: 0xC84D, + 0x8403: 0xDDCD, + 0x8404: 0xCCD1, + 0x8405: 0xC84E, + 0x8406: 0xDDC9, + 0x8407: 0xC84F, + 0x8408: 0xC850, + 0x8409: 0xC851, + 0x840A: 0xC852, + 0x840B: 0xDDC2, + 0x840C: 0xC3C8, + 0x840D: 0xC6BC, + 0x840E: 0xCEAE, + 0x840F: 0xDDCC, + 0x8410: 0xC853, + 0x8411: 0xDDC8, + 0x8412: 0xC854, + 0x8413: 0xC855, + 0x8414: 0xC856, + 0x8415: 0xC857, + 0x8416: 0xC858, + 0x8417: 0xC859, + 0x8418: 0xDDC1, + 0x8419: 0xC85A, + 0x841A: 0xC85B, + 0x841B: 0xC85C, + 0x841C: 0xDDC6, + 0x841D: 0xC2DC, + 0x841E: 0xC85D, + 0x841F: 0xC85E, + 0x8420: 0xC85F, + 0x8421: 0xC860, + 0x8422: 0xC861, + 0x8423: 0xC862, + 0x8424: 0xD3A9, + 0x8425: 0xD3AA, + 0x8426: 0xDDD3, + 0x8427: 0xCFF4, + 0x8428: 0xC8F8, + 0x8429: 0xC863, + 0x842A: 0xC864, + 0x842B: 0xC865, + 0x842C: 0xC866, + 0x842D: 0xC867, + 0x842E: 0xC868, + 0x842F: 0xC869, + 0x8430: 0xC86A, + 0x8431: 0xDDE6, + 0x8432: 0xC86B, + 0x8433: 0xC86C, + 0x8434: 0xC86D, + 0x8435: 0xC86E, + 0x8436: 0xC86F, + 0x8437: 0xC870, + 0x8438: 0xDDC7, + 0x8439: 0xC871, + 0x843A: 0xC872, + 0x843B: 0xC873, + 0x843C: 0xDDE0, + 0x843D: 0xC2E4, + 0x843E: 0xC874, + 0x843F: 0xC875, + 0x8440: 0xC876, + 0x8441: 0xC877, + 0x8442: 0xC878, + 0x8443: 0xC879, + 0x8444: 0xC87A, + 0x8445: 0xC87B, + 0x8446: 0xDDE1, + 0x8447: 0xC87C, + 0x8448: 0xC87D, + 0x8449: 0xC87E, + 0x844A: 0xC880, + 0x844B: 0xC881, + 0x844C: 0xC882, + 0x844D: 0xC883, + 0x844E: 0xC884, + 0x844F: 0xC885, + 0x8450: 0xC886, + 0x8451: 0xDDD7, + 0x8452: 0xC887, + 0x8453: 0xC888, + 0x8454: 0xC889, + 0x8455: 0xC88A, + 0x8456: 0xC88B, + 0x8457: 0xD6F8, + 0x8458: 0xC88C, + 0x8459: 0xDDD9, + 0x845A: 0xDDD8, + 0x845B: 0xB8F0, + 0x845C: 0xDDD6, + 0x845D: 0xC88D, + 0x845E: 0xC88E, + 0x845F: 0xC88F, + 0x8460: 0xC890, + 0x8461: 0xC6CF, + 0x8462: 0xC891, + 0x8463: 0xB6AD, + 0x8464: 0xC892, + 0x8465: 0xC893, + 0x8466: 0xC894, + 0x8467: 0xC895, + 0x8468: 0xC896, + 0x8469: 0xDDE2, + 0x846A: 0xC897, + 0x846B: 0xBAF9, + 0x846C: 0xD4E1, + 0x846D: 0xDDE7, + 0x846E: 0xC898, + 0x846F: 0xC899, + 0x8470: 0xC89A, + 0x8471: 0xB4D0, + 0x8472: 0xC89B, + 0x8473: 0xDDDA, + 0x8474: 0xC89C, + 0x8475: 0xBFFB, + 0x8476: 0xDDE3, + 0x8477: 0xC89D, + 0x8478: 0xDDDF, + 0x8479: 0xC89E, + 0x847A: 0xDDDD, + 0x847B: 0xC89F, + 0x847C: 0xC8A0, + 0x847D: 0xC940, + 0x847E: 0xC941, + 0x847F: 0xC942, + 0x8480: 0xC943, + 0x8481: 0xC944, + 0x8482: 0xB5D9, + 0x8483: 0xC945, + 0x8484: 0xC946, + 0x8485: 0xC947, + 0x8486: 0xC948, + 0x8487: 0xDDDB, + 0x8488: 0xDDDC, + 0x8489: 0xDDDE, + 0x848A: 0xC949, + 0x848B: 0xBDAF, + 0x848C: 0xDDE4, + 0x848D: 0xC94A, + 0x848E: 0xDDE5, + 0x848F: 0xC94B, + 0x8490: 0xC94C, + 0x8491: 0xC94D, + 0x8492: 0xC94E, + 0x8493: 0xC94F, + 0x8494: 0xC950, + 0x8495: 0xC951, + 0x8496: 0xC952, + 0x8497: 0xDDF5, + 0x8498: 0xC953, + 0x8499: 0xC3C9, + 0x849A: 0xC954, + 0x849B: 0xC955, + 0x849C: 0xCBE2, + 0x849D: 0xC956, + 0x849E: 0xC957, + 0x849F: 0xC958, + 0x84A0: 0xC959, + 0x84A1: 0xDDF2, + 0x84A2: 0xC95A, + 0x84A3: 0xC95B, + 0x84A4: 0xC95C, + 0x84A5: 0xC95D, + 0x84A6: 0xC95E, + 0x84A7: 0xC95F, + 0x84A8: 0xC960, + 0x84A9: 0xC961, + 0x84AA: 0xC962, + 0x84AB: 0xC963, + 0x84AC: 0xC964, + 0x84AD: 0xC965, + 0x84AE: 0xC966, + 0x84AF: 0xD8E1, + 0x84B0: 0xC967, + 0x84B1: 0xC968, + 0x84B2: 0xC6D1, + 0x84B3: 0xC969, + 0x84B4: 0xDDF4, + 0x84B5: 0xC96A, + 0x84B6: 0xC96B, + 0x84B7: 0xC96C, + 0x84B8: 0xD5F4, + 0x84B9: 0xDDF3, + 0x84BA: 0xDDF0, + 0x84BB: 0xC96D, + 0x84BC: 0xC96E, + 0x84BD: 0xDDEC, + 0x84BE: 0xC96F, + 0x84BF: 0xDDEF, + 0x84C0: 0xC970, + 0x84C1: 0xDDE8, + 0x84C2: 0xC971, + 0x84C3: 0xC972, + 0x84C4: 0xD0EE, + 0x84C5: 0xC973, + 0x84C6: 0xC974, + 0x84C7: 0xC975, + 0x84C8: 0xC976, + 0x84C9: 0xC8D8, + 0x84CA: 0xDDEE, + 0x84CB: 0xC977, + 0x84CC: 0xC978, + 0x84CD: 0xDDE9, + 0x84CE: 0xC979, + 0x84CF: 0xC97A, + 0x84D0: 0xDDEA, + 0x84D1: 0xCBF2, + 0x84D2: 0xC97B, + 0x84D3: 0xDDED, + 0x84D4: 0xC97C, + 0x84D5: 0xC97D, + 0x84D6: 0xB1CD, + 0x84D7: 0xC97E, + 0x84D8: 0xC980, + 0x84D9: 0xC981, + 0x84DA: 0xC982, + 0x84DB: 0xC983, + 0x84DC: 0xC984, + 0x84DD: 0xC0B6, + 0x84DE: 0xC985, + 0x84DF: 0xBCBB, + 0x84E0: 0xDDF1, + 0x84E1: 0xC986, + 0x84E2: 0xC987, + 0x84E3: 0xDDF7, + 0x84E4: 0xC988, + 0x84E5: 0xDDF6, + 0x84E6: 0xDDEB, + 0x84E7: 0xC989, + 0x84E8: 0xC98A, + 0x84E9: 0xC98B, + 0x84EA: 0xC98C, + 0x84EB: 0xC98D, + 0x84EC: 0xC5EE, + 0x84ED: 0xC98E, + 0x84EE: 0xC98F, + 0x84EF: 0xC990, + 0x84F0: 0xDDFB, + 0x84F1: 0xC991, + 0x84F2: 0xC992, + 0x84F3: 0xC993, + 0x84F4: 0xC994, + 0x84F5: 0xC995, + 0x84F6: 0xC996, + 0x84F7: 0xC997, + 0x84F8: 0xC998, + 0x84F9: 0xC999, + 0x84FA: 0xC99A, + 0x84FB: 0xC99B, + 0x84FC: 0xDEA4, + 0x84FD: 0xC99C, + 0x84FE: 0xC99D, + 0x84FF: 0xDEA3, + 0x8500: 0xC99E, + 0x8501: 0xC99F, + 0x8502: 0xC9A0, + 0x8503: 0xCA40, + 0x8504: 0xCA41, + 0x8505: 0xCA42, + 0x8506: 0xCA43, + 0x8507: 0xCA44, + 0x8508: 0xCA45, + 0x8509: 0xCA46, + 0x850A: 0xCA47, + 0x850B: 0xCA48, + 0x850C: 0xDDF8, + 0x850D: 0xCA49, + 0x850E: 0xCA4A, + 0x850F: 0xCA4B, + 0x8510: 0xCA4C, + 0x8511: 0xC3EF, + 0x8512: 0xCA4D, + 0x8513: 0xC2FB, + 0x8514: 0xCA4E, + 0x8515: 0xCA4F, + 0x8516: 0xCA50, + 0x8517: 0xD5E1, + 0x8518: 0xCA51, + 0x8519: 0xCA52, + 0x851A: 0xCEB5, + 0x851B: 0xCA53, + 0x851C: 0xCA54, + 0x851D: 0xCA55, + 0x851E: 0xCA56, + 0x851F: 0xDDFD, + 0x8520: 0xCA57, + 0x8521: 0xB2CC, + 0x8522: 0xCA58, + 0x8523: 0xCA59, + 0x8524: 0xCA5A, + 0x8525: 0xCA5B, + 0x8526: 0xCA5C, + 0x8527: 0xCA5D, + 0x8528: 0xCA5E, + 0x8529: 0xCA5F, + 0x852A: 0xCA60, + 0x852B: 0xC4E8, + 0x852C: 0xCADF, + 0x852D: 0xCA61, + 0x852E: 0xCA62, + 0x852F: 0xCA63, + 0x8530: 0xCA64, + 0x8531: 0xCA65, + 0x8532: 0xCA66, + 0x8533: 0xCA67, + 0x8534: 0xCA68, + 0x8535: 0xCA69, + 0x8536: 0xCA6A, + 0x8537: 0xC7BE, + 0x8538: 0xDDFA, + 0x8539: 0xDDFC, + 0x853A: 0xDDFE, + 0x853B: 0xDEA2, + 0x853C: 0xB0AA, + 0x853D: 0xB1CE, + 0x853E: 0xCA6B, + 0x853F: 0xCA6C, + 0x8540: 0xCA6D, + 0x8541: 0xCA6E, + 0x8542: 0xCA6F, + 0x8543: 0xDEAC, + 0x8544: 0xCA70, + 0x8545: 0xCA71, + 0x8546: 0xCA72, + 0x8547: 0xCA73, + 0x8548: 0xDEA6, + 0x8549: 0xBDB6, + 0x854A: 0xC8EF, + 0x854B: 0xCA74, + 0x854C: 0xCA75, + 0x854D: 0xCA76, + 0x854E: 0xCA77, + 0x854F: 0xCA78, + 0x8550: 0xCA79, + 0x8551: 0xCA7A, + 0x8552: 0xCA7B, + 0x8553: 0xCA7C, + 0x8554: 0xCA7D, + 0x8555: 0xCA7E, + 0x8556: 0xDEA1, + 0x8557: 0xCA80, + 0x8558: 0xCA81, + 0x8559: 0xDEA5, + 0x855A: 0xCA82, + 0x855B: 0xCA83, + 0x855C: 0xCA84, + 0x855D: 0xCA85, + 0x855E: 0xDEA9, + 0x855F: 0xCA86, + 0x8560: 0xCA87, + 0x8561: 0xCA88, + 0x8562: 0xCA89, + 0x8563: 0xCA8A, + 0x8564: 0xDEA8, + 0x8565: 0xCA8B, + 0x8566: 0xCA8C, + 0x8567: 0xCA8D, + 0x8568: 0xDEA7, + 0x8569: 0xCA8E, + 0x856A: 0xCA8F, + 0x856B: 0xCA90, + 0x856C: 0xCA91, + 0x856D: 0xCA92, + 0x856E: 0xCA93, + 0x856F: 0xCA94, + 0x8570: 0xCA95, + 0x8571: 0xCA96, + 0x8572: 0xDEAD, + 0x8573: 0xCA97, + 0x8574: 0xD4CC, + 0x8575: 0xCA98, + 0x8576: 0xCA99, + 0x8577: 0xCA9A, + 0x8578: 0xCA9B, + 0x8579: 0xDEB3, + 0x857A: 0xDEAA, + 0x857B: 0xDEAE, + 0x857C: 0xCA9C, + 0x857D: 0xCA9D, + 0x857E: 0xC0D9, + 0x857F: 0xCA9E, + 0x8580: 0xCA9F, + 0x8581: 0xCAA0, + 0x8582: 0xCB40, + 0x8583: 0xCB41, + 0x8584: 0xB1A1, + 0x8585: 0xDEB6, + 0x8586: 0xCB42, + 0x8587: 0xDEB1, + 0x8588: 0xCB43, + 0x8589: 0xCB44, + 0x858A: 0xCB45, + 0x858B: 0xCB46, + 0x858C: 0xCB47, + 0x858D: 0xCB48, + 0x858E: 0xCB49, + 0x858F: 0xDEB2, + 0x8590: 0xCB4A, + 0x8591: 0xCB4B, + 0x8592: 0xCB4C, + 0x8593: 0xCB4D, + 0x8594: 0xCB4E, + 0x8595: 0xCB4F, + 0x8596: 0xCB50, + 0x8597: 0xCB51, + 0x8598: 0xCB52, + 0x8599: 0xCB53, + 0x859A: 0xCB54, + 0x859B: 0xD1A6, + 0x859C: 0xDEB5, + 0x859D: 0xCB55, + 0x859E: 0xCB56, + 0x859F: 0xCB57, + 0x85A0: 0xCB58, + 0x85A1: 0xCB59, + 0x85A2: 0xCB5A, + 0x85A3: 0xCB5B, + 0x85A4: 0xDEAF, + 0x85A5: 0xCB5C, + 0x85A6: 0xCB5D, + 0x85A7: 0xCB5E, + 0x85A8: 0xDEB0, + 0x85A9: 0xCB5F, + 0x85AA: 0xD0BD, + 0x85AB: 0xCB60, + 0x85AC: 0xCB61, + 0x85AD: 0xCB62, + 0x85AE: 0xDEB4, + 0x85AF: 0xCAED, + 0x85B0: 0xDEB9, + 0x85B1: 0xCB63, + 0x85B2: 0xCB64, + 0x85B3: 0xCB65, + 0x85B4: 0xCB66, + 0x85B5: 0xCB67, + 0x85B6: 0xCB68, + 0x85B7: 0xDEB8, + 0x85B8: 0xCB69, + 0x85B9: 0xDEB7, + 0x85BA: 0xCB6A, + 0x85BB: 0xCB6B, + 0x85BC: 0xCB6C, + 0x85BD: 0xCB6D, + 0x85BE: 0xCB6E, + 0x85BF: 0xCB6F, + 0x85C0: 0xCB70, + 0x85C1: 0xDEBB, + 0x85C2: 0xCB71, + 0x85C3: 0xCB72, + 0x85C4: 0xCB73, + 0x85C5: 0xCB74, + 0x85C6: 0xCB75, + 0x85C7: 0xCB76, + 0x85C8: 0xCB77, + 0x85C9: 0xBDE5, + 0x85CA: 0xCB78, + 0x85CB: 0xCB79, + 0x85CC: 0xCB7A, + 0x85CD: 0xCB7B, + 0x85CE: 0xCB7C, + 0x85CF: 0xB2D8, + 0x85D0: 0xC3EA, + 0x85D1: 0xCB7D, + 0x85D2: 0xCB7E, + 0x85D3: 0xDEBA, + 0x85D4: 0xCB80, + 0x85D5: 0xC5BA, + 0x85D6: 0xCB81, + 0x85D7: 0xCB82, + 0x85D8: 0xCB83, + 0x85D9: 0xCB84, + 0x85DA: 0xCB85, + 0x85DB: 0xCB86, + 0x85DC: 0xDEBC, + 0x85DD: 0xCB87, + 0x85DE: 0xCB88, + 0x85DF: 0xCB89, + 0x85E0: 0xCB8A, + 0x85E1: 0xCB8B, + 0x85E2: 0xCB8C, + 0x85E3: 0xCB8D, + 0x85E4: 0xCCD9, + 0x85E5: 0xCB8E, + 0x85E6: 0xCB8F, + 0x85E7: 0xCB90, + 0x85E8: 0xCB91, + 0x85E9: 0xB7AA, + 0x85EA: 0xCB92, + 0x85EB: 0xCB93, + 0x85EC: 0xCB94, + 0x85ED: 0xCB95, + 0x85EE: 0xCB96, + 0x85EF: 0xCB97, + 0x85F0: 0xCB98, + 0x85F1: 0xCB99, + 0x85F2: 0xCB9A, + 0x85F3: 0xCB9B, + 0x85F4: 0xCB9C, + 0x85F5: 0xCB9D, + 0x85F6: 0xCB9E, + 0x85F7: 0xCB9F, + 0x85F8: 0xCBA0, + 0x85F9: 0xCC40, + 0x85FA: 0xCC41, + 0x85FB: 0xD4E5, + 0x85FC: 0xCC42, + 0x85FD: 0xCC43, + 0x85FE: 0xCC44, + 0x85FF: 0xDEBD, + 0x8600: 0xCC45, + 0x8601: 0xCC46, + 0x8602: 0xCC47, + 0x8603: 0xCC48, + 0x8604: 0xCC49, + 0x8605: 0xDEBF, + 0x8606: 0xCC4A, + 0x8607: 0xCC4B, + 0x8608: 0xCC4C, + 0x8609: 0xCC4D, + 0x860A: 0xCC4E, + 0x860B: 0xCC4F, + 0x860C: 0xCC50, + 0x860D: 0xCC51, + 0x860E: 0xCC52, + 0x860F: 0xCC53, + 0x8610: 0xCC54, + 0x8611: 0xC4A2, + 0x8612: 0xCC55, + 0x8613: 0xCC56, + 0x8614: 0xCC57, + 0x8615: 0xCC58, + 0x8616: 0xDEC1, + 0x8617: 0xCC59, + 0x8618: 0xCC5A, + 0x8619: 0xCC5B, + 0x861A: 0xCC5C, + 0x861B: 0xCC5D, + 0x861C: 0xCC5E, + 0x861D: 0xCC5F, + 0x861E: 0xCC60, + 0x861F: 0xCC61, + 0x8620: 0xCC62, + 0x8621: 0xCC63, + 0x8622: 0xCC64, + 0x8623: 0xCC65, + 0x8624: 0xCC66, + 0x8625: 0xCC67, + 0x8626: 0xCC68, + 0x8627: 0xDEBE, + 0x8628: 0xCC69, + 0x8629: 0xDEC0, + 0x862A: 0xCC6A, + 0x862B: 0xCC6B, + 0x862C: 0xCC6C, + 0x862D: 0xCC6D, + 0x862E: 0xCC6E, + 0x862F: 0xCC6F, + 0x8630: 0xCC70, + 0x8631: 0xCC71, + 0x8632: 0xCC72, + 0x8633: 0xCC73, + 0x8634: 0xCC74, + 0x8635: 0xCC75, + 0x8636: 0xCC76, + 0x8637: 0xCC77, + 0x8638: 0xD5BA, + 0x8639: 0xCC78, + 0x863A: 0xCC79, + 0x863B: 0xCC7A, + 0x863C: 0xDEC2, + 0x863D: 0xCC7B, + 0x863E: 0xCC7C, + 0x863F: 0xCC7D, + 0x8640: 0xCC7E, + 0x8641: 0xCC80, + 0x8642: 0xCC81, + 0x8643: 0xCC82, + 0x8644: 0xCC83, + 0x8645: 0xCC84, + 0x8646: 0xCC85, + 0x8647: 0xCC86, + 0x8648: 0xCC87, + 0x8649: 0xCC88, + 0x864A: 0xCC89, + 0x864B: 0xCC8A, + 0x864C: 0xCC8B, + 0x864D: 0xF2AE, + 0x864E: 0xBBA2, + 0x864F: 0xC2B2, + 0x8650: 0xC5B0, + 0x8651: 0xC2C7, + 0x8652: 0xCC8C, + 0x8653: 0xCC8D, + 0x8654: 0xF2AF, + 0x8655: 0xCC8E, + 0x8656: 0xCC8F, + 0x8657: 0xCC90, + 0x8658: 0xCC91, + 0x8659: 0xCC92, + 0x865A: 0xD0E9, + 0x865B: 0xCC93, + 0x865C: 0xCC94, + 0x865D: 0xCC95, + 0x865E: 0xD3DD, + 0x865F: 0xCC96, + 0x8660: 0xCC97, + 0x8661: 0xCC98, + 0x8662: 0xEBBD, + 0x8663: 0xCC99, + 0x8664: 0xCC9A, + 0x8665: 0xCC9B, + 0x8666: 0xCC9C, + 0x8667: 0xCC9D, + 0x8668: 0xCC9E, + 0x8669: 0xCC9F, + 0x866A: 0xCCA0, + 0x866B: 0xB3E6, + 0x866C: 0xF2B0, + 0x866D: 0xCD40, + 0x866E: 0xF2B1, + 0x866F: 0xCD41, + 0x8670: 0xCD42, + 0x8671: 0xCAAD, + 0x8672: 0xCD43, + 0x8673: 0xCD44, + 0x8674: 0xCD45, + 0x8675: 0xCD46, + 0x8676: 0xCD47, + 0x8677: 0xCD48, + 0x8678: 0xCD49, + 0x8679: 0xBAE7, + 0x867A: 0xF2B3, + 0x867B: 0xF2B5, + 0x867C: 0xF2B4, + 0x867D: 0xCBE4, + 0x867E: 0xCFBA, + 0x867F: 0xF2B2, + 0x8680: 0xCAB4, + 0x8681: 0xD2CF, + 0x8682: 0xC2EC, + 0x8683: 0xCD4A, + 0x8684: 0xCD4B, + 0x8685: 0xCD4C, + 0x8686: 0xCD4D, + 0x8687: 0xCD4E, + 0x8688: 0xCD4F, + 0x8689: 0xCD50, + 0x868A: 0xCEC3, + 0x868B: 0xF2B8, + 0x868C: 0xB0F6, + 0x868D: 0xF2B7, + 0x868E: 0xCD51, + 0x868F: 0xCD52, + 0x8690: 0xCD53, + 0x8691: 0xCD54, + 0x8692: 0xCD55, + 0x8693: 0xF2BE, + 0x8694: 0xCD56, + 0x8695: 0xB2CF, + 0x8696: 0xCD57, + 0x8697: 0xCD58, + 0x8698: 0xCD59, + 0x8699: 0xCD5A, + 0x869A: 0xCD5B, + 0x869B: 0xCD5C, + 0x869C: 0xD1C1, + 0x869D: 0xF2BA, + 0x869E: 0xCD5D, + 0x869F: 0xCD5E, + 0x86A0: 0xCD5F, + 0x86A1: 0xCD60, + 0x86A2: 0xCD61, + 0x86A3: 0xF2BC, + 0x86A4: 0xD4E9, + 0x86A5: 0xCD62, + 0x86A6: 0xCD63, + 0x86A7: 0xF2BB, + 0x86A8: 0xF2B6, + 0x86A9: 0xF2BF, + 0x86AA: 0xF2BD, + 0x86AB: 0xCD64, + 0x86AC: 0xF2B9, + 0x86AD: 0xCD65, + 0x86AE: 0xCD66, + 0x86AF: 0xF2C7, + 0x86B0: 0xF2C4, + 0x86B1: 0xF2C6, + 0x86B2: 0xCD67, + 0x86B3: 0xCD68, + 0x86B4: 0xF2CA, + 0x86B5: 0xF2C2, + 0x86B6: 0xF2C0, + 0x86B7: 0xCD69, + 0x86B8: 0xCD6A, + 0x86B9: 0xCD6B, + 0x86BA: 0xF2C5, + 0x86BB: 0xCD6C, + 0x86BC: 0xCD6D, + 0x86BD: 0xCD6E, + 0x86BE: 0xCD6F, + 0x86BF: 0xCD70, + 0x86C0: 0xD6FB, + 0x86C1: 0xCD71, + 0x86C2: 0xCD72, + 0x86C3: 0xCD73, + 0x86C4: 0xF2C1, + 0x86C5: 0xCD74, + 0x86C6: 0xC7F9, + 0x86C7: 0xC9DF, + 0x86C8: 0xCD75, + 0x86C9: 0xF2C8, + 0x86CA: 0xB9C6, + 0x86CB: 0xB5B0, + 0x86CC: 0xCD76, + 0x86CD: 0xCD77, + 0x86CE: 0xF2C3, + 0x86CF: 0xF2C9, + 0x86D0: 0xF2D0, + 0x86D1: 0xF2D6, + 0x86D2: 0xCD78, + 0x86D3: 0xCD79, + 0x86D4: 0xBBD7, + 0x86D5: 0xCD7A, + 0x86D6: 0xCD7B, + 0x86D7: 0xCD7C, + 0x86D8: 0xF2D5, + 0x86D9: 0xCDDC, + 0x86DA: 0xCD7D, + 0x86DB: 0xD6EB, + 0x86DC: 0xCD7E, + 0x86DD: 0xCD80, + 0x86DE: 0xF2D2, + 0x86DF: 0xF2D4, + 0x86E0: 0xCD81, + 0x86E1: 0xCD82, + 0x86E2: 0xCD83, + 0x86E3: 0xCD84, + 0x86E4: 0xB8F2, + 0x86E5: 0xCD85, + 0x86E6: 0xCD86, + 0x86E7: 0xCD87, + 0x86E8: 0xCD88, + 0x86E9: 0xF2CB, + 0x86EA: 0xCD89, + 0x86EB: 0xCD8A, + 0x86EC: 0xCD8B, + 0x86ED: 0xF2CE, + 0x86EE: 0xC2F9, + 0x86EF: 0xCD8C, + 0x86F0: 0xD5DD, + 0x86F1: 0xF2CC, + 0x86F2: 0xF2CD, + 0x86F3: 0xF2CF, + 0x86F4: 0xF2D3, + 0x86F5: 0xCD8D, + 0x86F6: 0xCD8E, + 0x86F7: 0xCD8F, + 0x86F8: 0xF2D9, + 0x86F9: 0xD3BC, + 0x86FA: 0xCD90, + 0x86FB: 0xCD91, + 0x86FC: 0xCD92, + 0x86FD: 0xCD93, + 0x86FE: 0xB6EA, + 0x86FF: 0xCD94, + 0x8700: 0xCAF1, + 0x8701: 0xCD95, + 0x8702: 0xB7E4, + 0x8703: 0xF2D7, + 0x8704: 0xCD96, + 0x8705: 0xCD97, + 0x8706: 0xCD98, + 0x8707: 0xF2D8, + 0x8708: 0xF2DA, + 0x8709: 0xF2DD, + 0x870A: 0xF2DB, + 0x870B: 0xCD99, + 0x870C: 0xCD9A, + 0x870D: 0xF2DC, + 0x870E: 0xCD9B, + 0x870F: 0xCD9C, + 0x8710: 0xCD9D, + 0x8711: 0xCD9E, + 0x8712: 0xD1D1, + 0x8713: 0xF2D1, + 0x8714: 0xCD9F, + 0x8715: 0xCDC9, + 0x8716: 0xCDA0, + 0x8717: 0xCECF, + 0x8718: 0xD6A9, + 0x8719: 0xCE40, + 0x871A: 0xF2E3, + 0x871B: 0xCE41, + 0x871C: 0xC3DB, + 0x871D: 0xCE42, + 0x871E: 0xF2E0, + 0x871F: 0xCE43, + 0x8720: 0xCE44, + 0x8721: 0xC0AF, + 0x8722: 0xF2EC, + 0x8723: 0xF2DE, + 0x8724: 0xCE45, + 0x8725: 0xF2E1, + 0x8726: 0xCE46, + 0x8727: 0xCE47, + 0x8728: 0xCE48, + 0x8729: 0xF2E8, + 0x872A: 0xCE49, + 0x872B: 0xCE4A, + 0x872C: 0xCE4B, + 0x872D: 0xCE4C, + 0x872E: 0xF2E2, + 0x872F: 0xCE4D, + 0x8730: 0xCE4E, + 0x8731: 0xF2E7, + 0x8732: 0xCE4F, + 0x8733: 0xCE50, + 0x8734: 0xF2E6, + 0x8735: 0xCE51, + 0x8736: 0xCE52, + 0x8737: 0xF2E9, + 0x8738: 0xCE53, + 0x8739: 0xCE54, + 0x873A: 0xCE55, + 0x873B: 0xF2DF, + 0x873C: 0xCE56, + 0x873D: 0xCE57, + 0x873E: 0xF2E4, + 0x873F: 0xF2EA, + 0x8740: 0xCE58, + 0x8741: 0xCE59, + 0x8742: 0xCE5A, + 0x8743: 0xCE5B, + 0x8744: 0xCE5C, + 0x8745: 0xCE5D, + 0x8746: 0xCE5E, + 0x8747: 0xD3AC, + 0x8748: 0xF2E5, + 0x8749: 0xB2F5, + 0x874A: 0xCE5F, + 0x874B: 0xCE60, + 0x874C: 0xF2F2, + 0x874D: 0xCE61, + 0x874E: 0xD0AB, + 0x874F: 0xCE62, + 0x8750: 0xCE63, + 0x8751: 0xCE64, + 0x8752: 0xCE65, + 0x8753: 0xF2F5, + 0x8754: 0xCE66, + 0x8755: 0xCE67, + 0x8756: 0xCE68, + 0x8757: 0xBBC8, + 0x8758: 0xCE69, + 0x8759: 0xF2F9, + 0x875A: 0xCE6A, + 0x875B: 0xCE6B, + 0x875C: 0xCE6C, + 0x875D: 0xCE6D, + 0x875E: 0xCE6E, + 0x875F: 0xCE6F, + 0x8760: 0xF2F0, + 0x8761: 0xCE70, + 0x8762: 0xCE71, + 0x8763: 0xF2F6, + 0x8764: 0xF2F8, + 0x8765: 0xF2FA, + 0x8766: 0xCE72, + 0x8767: 0xCE73, + 0x8768: 0xCE74, + 0x8769: 0xCE75, + 0x876A: 0xCE76, + 0x876B: 0xCE77, + 0x876C: 0xCE78, + 0x876D: 0xCE79, + 0x876E: 0xF2F3, + 0x876F: 0xCE7A, + 0x8770: 0xF2F1, + 0x8771: 0xCE7B, + 0x8772: 0xCE7C, + 0x8773: 0xCE7D, + 0x8774: 0xBAFB, + 0x8775: 0xCE7E, + 0x8776: 0xB5FB, + 0x8777: 0xCE80, + 0x8778: 0xCE81, + 0x8779: 0xCE82, + 0x877A: 0xCE83, + 0x877B: 0xF2EF, + 0x877C: 0xF2F7, + 0x877D: 0xF2ED, + 0x877E: 0xF2EE, + 0x877F: 0xCE84, + 0x8780: 0xCE85, + 0x8781: 0xCE86, + 0x8782: 0xF2EB, + 0x8783: 0xF3A6, + 0x8784: 0xCE87, + 0x8785: 0xF3A3, + 0x8786: 0xCE88, + 0x8787: 0xCE89, + 0x8788: 0xF3A2, + 0x8789: 0xCE8A, + 0x878A: 0xCE8B, + 0x878B: 0xF2F4, + 0x878C: 0xCE8C, + 0x878D: 0xC8DA, + 0x878E: 0xCE8D, + 0x878F: 0xCE8E, + 0x8790: 0xCE8F, + 0x8791: 0xCE90, + 0x8792: 0xCE91, + 0x8793: 0xF2FB, + 0x8794: 0xCE92, + 0x8795: 0xCE93, + 0x8796: 0xCE94, + 0x8797: 0xF3A5, + 0x8798: 0xCE95, + 0x8799: 0xCE96, + 0x879A: 0xCE97, + 0x879B: 0xCE98, + 0x879C: 0xCE99, + 0x879D: 0xCE9A, + 0x879E: 0xCE9B, + 0x879F: 0xC3F8, + 0x87A0: 0xCE9C, + 0x87A1: 0xCE9D, + 0x87A2: 0xCE9E, + 0x87A3: 0xCE9F, + 0x87A4: 0xCEA0, + 0x87A5: 0xCF40, + 0x87A6: 0xCF41, + 0x87A7: 0xCF42, + 0x87A8: 0xF2FD, + 0x87A9: 0xCF43, + 0x87AA: 0xCF44, + 0x87AB: 0xF3A7, + 0x87AC: 0xF3A9, + 0x87AD: 0xF3A4, + 0x87AE: 0xCF45, + 0x87AF: 0xF2FC, + 0x87B0: 0xCF46, + 0x87B1: 0xCF47, + 0x87B2: 0xCF48, + 0x87B3: 0xF3AB, + 0x87B4: 0xCF49, + 0x87B5: 0xF3AA, + 0x87B6: 0xCF4A, + 0x87B7: 0xCF4B, + 0x87B8: 0xCF4C, + 0x87B9: 0xCF4D, + 0x87BA: 0xC2DD, + 0x87BB: 0xCF4E, + 0x87BC: 0xCF4F, + 0x87BD: 0xF3AE, + 0x87BE: 0xCF50, + 0x87BF: 0xCF51, + 0x87C0: 0xF3B0, + 0x87C1: 0xCF52, + 0x87C2: 0xCF53, + 0x87C3: 0xCF54, + 0x87C4: 0xCF55, + 0x87C5: 0xCF56, + 0x87C6: 0xF3A1, + 0x87C7: 0xCF57, + 0x87C8: 0xCF58, + 0x87C9: 0xCF59, + 0x87CA: 0xF3B1, + 0x87CB: 0xF3AC, + 0x87CC: 0xCF5A, + 0x87CD: 0xCF5B, + 0x87CE: 0xCF5C, + 0x87CF: 0xCF5D, + 0x87D0: 0xCF5E, + 0x87D1: 0xF3AF, + 0x87D2: 0xF2FE, + 0x87D3: 0xF3AD, + 0x87D4: 0xCF5F, + 0x87D5: 0xCF60, + 0x87D6: 0xCF61, + 0x87D7: 0xCF62, + 0x87D8: 0xCF63, + 0x87D9: 0xCF64, + 0x87DA: 0xCF65, + 0x87DB: 0xF3B2, + 0x87DC: 0xCF66, + 0x87DD: 0xCF67, + 0x87DE: 0xCF68, + 0x87DF: 0xCF69, + 0x87E0: 0xF3B4, + 0x87E1: 0xCF6A, + 0x87E2: 0xCF6B, + 0x87E3: 0xCF6C, + 0x87E4: 0xCF6D, + 0x87E5: 0xF3A8, + 0x87E6: 0xCF6E, + 0x87E7: 0xCF6F, + 0x87E8: 0xCF70, + 0x87E9: 0xCF71, + 0x87EA: 0xF3B3, + 0x87EB: 0xCF72, + 0x87EC: 0xCF73, + 0x87ED: 0xCF74, + 0x87EE: 0xF3B5, + 0x87EF: 0xCF75, + 0x87F0: 0xCF76, + 0x87F1: 0xCF77, + 0x87F2: 0xCF78, + 0x87F3: 0xCF79, + 0x87F4: 0xCF7A, + 0x87F5: 0xCF7B, + 0x87F6: 0xCF7C, + 0x87F7: 0xCF7D, + 0x87F8: 0xCF7E, + 0x87F9: 0xD0B7, + 0x87FA: 0xCF80, + 0x87FB: 0xCF81, + 0x87FC: 0xCF82, + 0x87FD: 0xCF83, + 0x87FE: 0xF3B8, + 0x87FF: 0xCF84, + 0x8800: 0xCF85, + 0x8801: 0xCF86, + 0x8802: 0xCF87, + 0x8803: 0xD9F9, + 0x8804: 0xCF88, + 0x8805: 0xCF89, + 0x8806: 0xCF8A, + 0x8807: 0xCF8B, + 0x8808: 0xCF8C, + 0x8809: 0xCF8D, + 0x880A: 0xF3B9, + 0x880B: 0xCF8E, + 0x880C: 0xCF8F, + 0x880D: 0xCF90, + 0x880E: 0xCF91, + 0x880F: 0xCF92, + 0x8810: 0xCF93, + 0x8811: 0xCF94, + 0x8812: 0xCF95, + 0x8813: 0xF3B7, + 0x8814: 0xCF96, + 0x8815: 0xC8E4, + 0x8816: 0xF3B6, + 0x8817: 0xCF97, + 0x8818: 0xCF98, + 0x8819: 0xCF99, + 0x881A: 0xCF9A, + 0x881B: 0xF3BA, + 0x881C: 0xCF9B, + 0x881D: 0xCF9C, + 0x881E: 0xCF9D, + 0x881F: 0xCF9E, + 0x8820: 0xCF9F, + 0x8821: 0xF3BB, + 0x8822: 0xB4C0, + 0x8823: 0xCFA0, + 0x8824: 0xD040, + 0x8825: 0xD041, + 0x8826: 0xD042, + 0x8827: 0xD043, + 0x8828: 0xD044, + 0x8829: 0xD045, + 0x882A: 0xD046, + 0x882B: 0xD047, + 0x882C: 0xD048, + 0x882D: 0xD049, + 0x882E: 0xD04A, + 0x882F: 0xD04B, + 0x8830: 0xD04C, + 0x8831: 0xD04D, + 0x8832: 0xEEC3, + 0x8833: 0xD04E, + 0x8834: 0xD04F, + 0x8835: 0xD050, + 0x8836: 0xD051, + 0x8837: 0xD052, + 0x8838: 0xD053, + 0x8839: 0xF3BC, + 0x883A: 0xD054, + 0x883B: 0xD055, + 0x883C: 0xF3BD, + 0x883D: 0xD056, + 0x883E: 0xD057, + 0x883F: 0xD058, + 0x8840: 0xD1AA, + 0x8841: 0xD059, + 0x8842: 0xD05A, + 0x8843: 0xD05B, + 0x8844: 0xF4AC, + 0x8845: 0xD0C6, + 0x8846: 0xD05C, + 0x8847: 0xD05D, + 0x8848: 0xD05E, + 0x8849: 0xD05F, + 0x884A: 0xD060, + 0x884B: 0xD061, + 0x884C: 0xD0D0, + 0x884D: 0xD1DC, + 0x884E: 0xD062, + 0x884F: 0xD063, + 0x8850: 0xD064, + 0x8851: 0xD065, + 0x8852: 0xD066, + 0x8853: 0xD067, + 0x8854: 0xCFCE, + 0x8855: 0xD068, + 0x8856: 0xD069, + 0x8857: 0xBDD6, + 0x8858: 0xD06A, + 0x8859: 0xD1C3, + 0x885A: 0xD06B, + 0x885B: 0xD06C, + 0x885C: 0xD06D, + 0x885D: 0xD06E, + 0x885E: 0xD06F, + 0x885F: 0xD070, + 0x8860: 0xD071, + 0x8861: 0xBAE2, + 0x8862: 0xE1E9, + 0x8863: 0xD2C2, + 0x8864: 0xF1C2, + 0x8865: 0xB2B9, + 0x8866: 0xD072, + 0x8867: 0xD073, + 0x8868: 0xB1ED, + 0x8869: 0xF1C3, + 0x886A: 0xD074, + 0x886B: 0xC9C0, + 0x886C: 0xB3C4, + 0x886D: 0xD075, + 0x886E: 0xD9F2, + 0x886F: 0xD076, + 0x8870: 0xCBA5, + 0x8871: 0xD077, + 0x8872: 0xF1C4, + 0x8873: 0xD078, + 0x8874: 0xD079, + 0x8875: 0xD07A, + 0x8876: 0xD07B, + 0x8877: 0xD6D4, + 0x8878: 0xD07C, + 0x8879: 0xD07D, + 0x887A: 0xD07E, + 0x887B: 0xD080, + 0x887C: 0xD081, + 0x887D: 0xF1C5, + 0x887E: 0xF4C0, + 0x887F: 0xF1C6, + 0x8880: 0xD082, + 0x8881: 0xD4AC, + 0x8882: 0xF1C7, + 0x8883: 0xD083, + 0x8884: 0xB0C0, + 0x8885: 0xF4C1, + 0x8886: 0xD084, + 0x8887: 0xD085, + 0x8888: 0xF4C2, + 0x8889: 0xD086, + 0x888A: 0xD087, + 0x888B: 0xB4FC, + 0x888C: 0xD088, + 0x888D: 0xC5DB, + 0x888E: 0xD089, + 0x888F: 0xD08A, + 0x8890: 0xD08B, + 0x8891: 0xD08C, + 0x8892: 0xCCBB, + 0x8893: 0xD08D, + 0x8894: 0xD08E, + 0x8895: 0xD08F, + 0x8896: 0xD0E4, + 0x8897: 0xD090, + 0x8898: 0xD091, + 0x8899: 0xD092, + 0x889A: 0xD093, + 0x889B: 0xD094, + 0x889C: 0xCDE0, + 0x889D: 0xD095, + 0x889E: 0xD096, + 0x889F: 0xD097, + 0x88A0: 0xD098, + 0x88A1: 0xD099, + 0x88A2: 0xF1C8, + 0x88A3: 0xD09A, + 0x88A4: 0xD9F3, + 0x88A5: 0xD09B, + 0x88A6: 0xD09C, + 0x88A7: 0xD09D, + 0x88A8: 0xD09E, + 0x88A9: 0xD09F, + 0x88AA: 0xD0A0, + 0x88AB: 0xB1BB, + 0x88AC: 0xD140, + 0x88AD: 0xCFAE, + 0x88AE: 0xD141, + 0x88AF: 0xD142, + 0x88B0: 0xD143, + 0x88B1: 0xB8A4, + 0x88B2: 0xD144, + 0x88B3: 0xD145, + 0x88B4: 0xD146, + 0x88B5: 0xD147, + 0x88B6: 0xD148, + 0x88B7: 0xF1CA, + 0x88B8: 0xD149, + 0x88B9: 0xD14A, + 0x88BA: 0xD14B, + 0x88BB: 0xD14C, + 0x88BC: 0xF1CB, + 0x88BD: 0xD14D, + 0x88BE: 0xD14E, + 0x88BF: 0xD14F, + 0x88C0: 0xD150, + 0x88C1: 0xB2C3, + 0x88C2: 0xC1D1, + 0x88C3: 0xD151, + 0x88C4: 0xD152, + 0x88C5: 0xD7B0, + 0x88C6: 0xF1C9, + 0x88C7: 0xD153, + 0x88C8: 0xD154, + 0x88C9: 0xF1CC, + 0x88CA: 0xD155, + 0x88CB: 0xD156, + 0x88CC: 0xD157, + 0x88CD: 0xD158, + 0x88CE: 0xF1CE, + 0x88CF: 0xD159, + 0x88D0: 0xD15A, + 0x88D1: 0xD15B, + 0x88D2: 0xD9F6, + 0x88D3: 0xD15C, + 0x88D4: 0xD2E1, + 0x88D5: 0xD4A3, + 0x88D6: 0xD15D, + 0x88D7: 0xD15E, + 0x88D8: 0xF4C3, + 0x88D9: 0xC8B9, + 0x88DA: 0xD15F, + 0x88DB: 0xD160, + 0x88DC: 0xD161, + 0x88DD: 0xD162, + 0x88DE: 0xD163, + 0x88DF: 0xF4C4, + 0x88E0: 0xD164, + 0x88E1: 0xD165, + 0x88E2: 0xF1CD, + 0x88E3: 0xF1CF, + 0x88E4: 0xBFE3, + 0x88E5: 0xF1D0, + 0x88E6: 0xD166, + 0x88E7: 0xD167, + 0x88E8: 0xF1D4, + 0x88E9: 0xD168, + 0x88EA: 0xD169, + 0x88EB: 0xD16A, + 0x88EC: 0xD16B, + 0x88ED: 0xD16C, + 0x88EE: 0xD16D, + 0x88EF: 0xD16E, + 0x88F0: 0xF1D6, + 0x88F1: 0xF1D1, + 0x88F2: 0xD16F, + 0x88F3: 0xC9D1, + 0x88F4: 0xC5E1, + 0x88F5: 0xD170, + 0x88F6: 0xD171, + 0x88F7: 0xD172, + 0x88F8: 0xC2E3, + 0x88F9: 0xB9FC, + 0x88FA: 0xD173, + 0x88FB: 0xD174, + 0x88FC: 0xF1D3, + 0x88FD: 0xD175, + 0x88FE: 0xF1D5, + 0x88FF: 0xD176, + 0x8900: 0xD177, + 0x8901: 0xD178, + 0x8902: 0xB9D3, + 0x8903: 0xD179, + 0x8904: 0xD17A, + 0x8905: 0xD17B, + 0x8906: 0xD17C, + 0x8907: 0xD17D, + 0x8908: 0xD17E, + 0x8909: 0xD180, + 0x890A: 0xF1DB, + 0x890B: 0xD181, + 0x890C: 0xD182, + 0x890D: 0xD183, + 0x890E: 0xD184, + 0x890F: 0xD185, + 0x8910: 0xBAD6, + 0x8911: 0xD186, + 0x8912: 0xB0FD, + 0x8913: 0xF1D9, + 0x8914: 0xD187, + 0x8915: 0xD188, + 0x8916: 0xD189, + 0x8917: 0xD18A, + 0x8918: 0xD18B, + 0x8919: 0xF1D8, + 0x891A: 0xF1D2, + 0x891B: 0xF1DA, + 0x891C: 0xD18C, + 0x891D: 0xD18D, + 0x891E: 0xD18E, + 0x891F: 0xD18F, + 0x8920: 0xD190, + 0x8921: 0xF1D7, + 0x8922: 0xD191, + 0x8923: 0xD192, + 0x8924: 0xD193, + 0x8925: 0xC8EC, + 0x8926: 0xD194, + 0x8927: 0xD195, + 0x8928: 0xD196, + 0x8929: 0xD197, + 0x892A: 0xCDCA, + 0x892B: 0xF1DD, + 0x892C: 0xD198, + 0x892D: 0xD199, + 0x892E: 0xD19A, + 0x892F: 0xD19B, + 0x8930: 0xE5BD, + 0x8931: 0xD19C, + 0x8932: 0xD19D, + 0x8933: 0xD19E, + 0x8934: 0xF1DC, + 0x8935: 0xD19F, + 0x8936: 0xF1DE, + 0x8937: 0xD1A0, + 0x8938: 0xD240, + 0x8939: 0xD241, + 0x893A: 0xD242, + 0x893B: 0xD243, + 0x893C: 0xD244, + 0x893D: 0xD245, + 0x893E: 0xD246, + 0x893F: 0xD247, + 0x8940: 0xD248, + 0x8941: 0xF1DF, + 0x8942: 0xD249, + 0x8943: 0xD24A, + 0x8944: 0xCFE5, + 0x8945: 0xD24B, + 0x8946: 0xD24C, + 0x8947: 0xD24D, + 0x8948: 0xD24E, + 0x8949: 0xD24F, + 0x894A: 0xD250, + 0x894B: 0xD251, + 0x894C: 0xD252, + 0x894D: 0xD253, + 0x894E: 0xD254, + 0x894F: 0xD255, + 0x8950: 0xD256, + 0x8951: 0xD257, + 0x8952: 0xD258, + 0x8953: 0xD259, + 0x8954: 0xD25A, + 0x8955: 0xD25B, + 0x8956: 0xD25C, + 0x8957: 0xD25D, + 0x8958: 0xD25E, + 0x8959: 0xD25F, + 0x895A: 0xD260, + 0x895B: 0xD261, + 0x895C: 0xD262, + 0x895D: 0xD263, + 0x895E: 0xF4C5, + 0x895F: 0xBDF3, + 0x8960: 0xD264, + 0x8961: 0xD265, + 0x8962: 0xD266, + 0x8963: 0xD267, + 0x8964: 0xD268, + 0x8965: 0xD269, + 0x8966: 0xF1E0, + 0x8967: 0xD26A, + 0x8968: 0xD26B, + 0x8969: 0xD26C, + 0x896A: 0xD26D, + 0x896B: 0xD26E, + 0x896C: 0xD26F, + 0x896D: 0xD270, + 0x896E: 0xD271, + 0x896F: 0xD272, + 0x8970: 0xD273, + 0x8971: 0xD274, + 0x8972: 0xD275, + 0x8973: 0xD276, + 0x8974: 0xD277, + 0x8975: 0xD278, + 0x8976: 0xD279, + 0x8977: 0xD27A, + 0x8978: 0xD27B, + 0x8979: 0xD27C, + 0x897A: 0xD27D, + 0x897B: 0xF1E1, + 0x897C: 0xD27E, + 0x897D: 0xD280, + 0x897E: 0xD281, + 0x897F: 0xCEF7, + 0x8980: 0xD282, + 0x8981: 0xD2AA, + 0x8982: 0xD283, + 0x8983: 0xF1FB, + 0x8984: 0xD284, + 0x8985: 0xD285, + 0x8986: 0xB8B2, + 0x8987: 0xD286, + 0x8988: 0xD287, + 0x8989: 0xD288, + 0x898A: 0xD289, + 0x898B: 0xD28A, + 0x898C: 0xD28B, + 0x898D: 0xD28C, + 0x898E: 0xD28D, + 0x898F: 0xD28E, + 0x8990: 0xD28F, + 0x8991: 0xD290, + 0x8992: 0xD291, + 0x8993: 0xD292, + 0x8994: 0xD293, + 0x8995: 0xD294, + 0x8996: 0xD295, + 0x8997: 0xD296, + 0x8998: 0xD297, + 0x8999: 0xD298, + 0x899A: 0xD299, + 0x899B: 0xD29A, + 0x899C: 0xD29B, + 0x899D: 0xD29C, + 0x899E: 0xD29D, + 0x899F: 0xD29E, + 0x89A0: 0xD29F, + 0x89A1: 0xD2A0, + 0x89A2: 0xD340, + 0x89A3: 0xD341, + 0x89A4: 0xD342, + 0x89A5: 0xD343, + 0x89A6: 0xD344, + 0x89A7: 0xD345, + 0x89A8: 0xD346, + 0x89A9: 0xD347, + 0x89AA: 0xD348, + 0x89AB: 0xD349, + 0x89AC: 0xD34A, + 0x89AD: 0xD34B, + 0x89AE: 0xD34C, + 0x89AF: 0xD34D, + 0x89B0: 0xD34E, + 0x89B1: 0xD34F, + 0x89B2: 0xD350, + 0x89B3: 0xD351, + 0x89B4: 0xD352, + 0x89B5: 0xD353, + 0x89B6: 0xD354, + 0x89B7: 0xD355, + 0x89B8: 0xD356, + 0x89B9: 0xD357, + 0x89BA: 0xD358, + 0x89BB: 0xD359, + 0x89BC: 0xD35A, + 0x89BD: 0xD35B, + 0x89BE: 0xD35C, + 0x89BF: 0xD35D, + 0x89C0: 0xD35E, + 0x89C1: 0xBCFB, + 0x89C2: 0xB9DB, + 0x89C3: 0xD35F, + 0x89C4: 0xB9E6, + 0x89C5: 0xC3D9, + 0x89C6: 0xCAD3, + 0x89C7: 0xEAE8, + 0x89C8: 0xC0C0, + 0x89C9: 0xBEF5, + 0x89CA: 0xEAE9, + 0x89CB: 0xEAEA, + 0x89CC: 0xEAEB, + 0x89CD: 0xD360, + 0x89CE: 0xEAEC, + 0x89CF: 0xEAED, + 0x89D0: 0xEAEE, + 0x89D1: 0xEAEF, + 0x89D2: 0xBDC7, + 0x89D3: 0xD361, + 0x89D4: 0xD362, + 0x89D5: 0xD363, + 0x89D6: 0xF5FB, + 0x89D7: 0xD364, + 0x89D8: 0xD365, + 0x89D9: 0xD366, + 0x89DA: 0xF5FD, + 0x89DB: 0xD367, + 0x89DC: 0xF5FE, + 0x89DD: 0xD368, + 0x89DE: 0xF5FC, + 0x89DF: 0xD369, + 0x89E0: 0xD36A, + 0x89E1: 0xD36B, + 0x89E2: 0xD36C, + 0x89E3: 0xBDE2, + 0x89E4: 0xD36D, + 0x89E5: 0xF6A1, + 0x89E6: 0xB4A5, + 0x89E7: 0xD36E, + 0x89E8: 0xD36F, + 0x89E9: 0xD370, + 0x89EA: 0xD371, + 0x89EB: 0xF6A2, + 0x89EC: 0xD372, + 0x89ED: 0xD373, + 0x89EE: 0xD374, + 0x89EF: 0xF6A3, + 0x89F0: 0xD375, + 0x89F1: 0xD376, + 0x89F2: 0xD377, + 0x89F3: 0xECB2, + 0x89F4: 0xD378, + 0x89F5: 0xD379, + 0x89F6: 0xD37A, + 0x89F7: 0xD37B, + 0x89F8: 0xD37C, + 0x89F9: 0xD37D, + 0x89FA: 0xD37E, + 0x89FB: 0xD380, + 0x89FC: 0xD381, + 0x89FD: 0xD382, + 0x89FE: 0xD383, + 0x89FF: 0xD384, + 0x8A00: 0xD1D4, + 0x8A01: 0xD385, + 0x8A02: 0xD386, + 0x8A03: 0xD387, + 0x8A04: 0xD388, + 0x8A05: 0xD389, + 0x8A06: 0xD38A, + 0x8A07: 0xD9EA, + 0x8A08: 0xD38B, + 0x8A09: 0xD38C, + 0x8A0A: 0xD38D, + 0x8A0B: 0xD38E, + 0x8A0C: 0xD38F, + 0x8A0D: 0xD390, + 0x8A0E: 0xD391, + 0x8A0F: 0xD392, + 0x8A10: 0xD393, + 0x8A11: 0xD394, + 0x8A12: 0xD395, + 0x8A13: 0xD396, + 0x8A14: 0xD397, + 0x8A15: 0xD398, + 0x8A16: 0xD399, + 0x8A17: 0xD39A, + 0x8A18: 0xD39B, + 0x8A19: 0xD39C, + 0x8A1A: 0xD39D, + 0x8A1B: 0xD39E, + 0x8A1C: 0xD39F, + 0x8A1D: 0xD3A0, + 0x8A1E: 0xD440, + 0x8A1F: 0xD441, + 0x8A20: 0xD442, + 0x8A21: 0xD443, + 0x8A22: 0xD444, + 0x8A23: 0xD445, + 0x8A24: 0xD446, + 0x8A25: 0xD447, + 0x8A26: 0xD448, + 0x8A27: 0xD449, + 0x8A28: 0xD44A, + 0x8A29: 0xD44B, + 0x8A2A: 0xD44C, + 0x8A2B: 0xD44D, + 0x8A2C: 0xD44E, + 0x8A2D: 0xD44F, + 0x8A2E: 0xD450, + 0x8A2F: 0xD451, + 0x8A30: 0xD452, + 0x8A31: 0xD453, + 0x8A32: 0xD454, + 0x8A33: 0xD455, + 0x8A34: 0xD456, + 0x8A35: 0xD457, + 0x8A36: 0xD458, + 0x8A37: 0xD459, + 0x8A38: 0xD45A, + 0x8A39: 0xD45B, + 0x8A3A: 0xD45C, + 0x8A3B: 0xD45D, + 0x8A3C: 0xD45E, + 0x8A3D: 0xD45F, + 0x8A3E: 0xF6A4, + 0x8A3F: 0xD460, + 0x8A40: 0xD461, + 0x8A41: 0xD462, + 0x8A42: 0xD463, + 0x8A43: 0xD464, + 0x8A44: 0xD465, + 0x8A45: 0xD466, + 0x8A46: 0xD467, + 0x8A47: 0xD468, + 0x8A48: 0xEEBA, + 0x8A49: 0xD469, + 0x8A4A: 0xD46A, + 0x8A4B: 0xD46B, + 0x8A4C: 0xD46C, + 0x8A4D: 0xD46D, + 0x8A4E: 0xD46E, + 0x8A4F: 0xD46F, + 0x8A50: 0xD470, + 0x8A51: 0xD471, + 0x8A52: 0xD472, + 0x8A53: 0xD473, + 0x8A54: 0xD474, + 0x8A55: 0xD475, + 0x8A56: 0xD476, + 0x8A57: 0xD477, + 0x8A58: 0xD478, + 0x8A59: 0xD479, + 0x8A5A: 0xD47A, + 0x8A5B: 0xD47B, + 0x8A5C: 0xD47C, + 0x8A5D: 0xD47D, + 0x8A5E: 0xD47E, + 0x8A5F: 0xD480, + 0x8A60: 0xD481, + 0x8A61: 0xD482, + 0x8A62: 0xD483, + 0x8A63: 0xD484, + 0x8A64: 0xD485, + 0x8A65: 0xD486, + 0x8A66: 0xD487, + 0x8A67: 0xD488, + 0x8A68: 0xD489, + 0x8A69: 0xD48A, + 0x8A6A: 0xD48B, + 0x8A6B: 0xD48C, + 0x8A6C: 0xD48D, + 0x8A6D: 0xD48E, + 0x8A6E: 0xD48F, + 0x8A6F: 0xD490, + 0x8A70: 0xD491, + 0x8A71: 0xD492, + 0x8A72: 0xD493, + 0x8A73: 0xD494, + 0x8A74: 0xD495, + 0x8A75: 0xD496, + 0x8A76: 0xD497, + 0x8A77: 0xD498, + 0x8A78: 0xD499, + 0x8A79: 0xD5B2, + 0x8A7A: 0xD49A, + 0x8A7B: 0xD49B, + 0x8A7C: 0xD49C, + 0x8A7D: 0xD49D, + 0x8A7E: 0xD49E, + 0x8A7F: 0xD49F, + 0x8A80: 0xD4A0, + 0x8A81: 0xD540, + 0x8A82: 0xD541, + 0x8A83: 0xD542, + 0x8A84: 0xD543, + 0x8A85: 0xD544, + 0x8A86: 0xD545, + 0x8A87: 0xD546, + 0x8A88: 0xD547, + 0x8A89: 0xD3FE, + 0x8A8A: 0xCCDC, + 0x8A8B: 0xD548, + 0x8A8C: 0xD549, + 0x8A8D: 0xD54A, + 0x8A8E: 0xD54B, + 0x8A8F: 0xD54C, + 0x8A90: 0xD54D, + 0x8A91: 0xD54E, + 0x8A92: 0xD54F, + 0x8A93: 0xCAC4, + 0x8A94: 0xD550, + 0x8A95: 0xD551, + 0x8A96: 0xD552, + 0x8A97: 0xD553, + 0x8A98: 0xD554, + 0x8A99: 0xD555, + 0x8A9A: 0xD556, + 0x8A9B: 0xD557, + 0x8A9C: 0xD558, + 0x8A9D: 0xD559, + 0x8A9E: 0xD55A, + 0x8A9F: 0xD55B, + 0x8AA0: 0xD55C, + 0x8AA1: 0xD55D, + 0x8AA2: 0xD55E, + 0x8AA3: 0xD55F, + 0x8AA4: 0xD560, + 0x8AA5: 0xD561, + 0x8AA6: 0xD562, + 0x8AA7: 0xD563, + 0x8AA8: 0xD564, + 0x8AA9: 0xD565, + 0x8AAA: 0xD566, + 0x8AAB: 0xD567, + 0x8AAC: 0xD568, + 0x8AAD: 0xD569, + 0x8AAE: 0xD56A, + 0x8AAF: 0xD56B, + 0x8AB0: 0xD56C, + 0x8AB1: 0xD56D, + 0x8AB2: 0xD56E, + 0x8AB3: 0xD56F, + 0x8AB4: 0xD570, + 0x8AB5: 0xD571, + 0x8AB6: 0xD572, + 0x8AB7: 0xD573, + 0x8AB8: 0xD574, + 0x8AB9: 0xD575, + 0x8ABA: 0xD576, + 0x8ABB: 0xD577, + 0x8ABC: 0xD578, + 0x8ABD: 0xD579, + 0x8ABE: 0xD57A, + 0x8ABF: 0xD57B, + 0x8AC0: 0xD57C, + 0x8AC1: 0xD57D, + 0x8AC2: 0xD57E, + 0x8AC3: 0xD580, + 0x8AC4: 0xD581, + 0x8AC5: 0xD582, + 0x8AC6: 0xD583, + 0x8AC7: 0xD584, + 0x8AC8: 0xD585, + 0x8AC9: 0xD586, + 0x8ACA: 0xD587, + 0x8ACB: 0xD588, + 0x8ACC: 0xD589, + 0x8ACD: 0xD58A, + 0x8ACE: 0xD58B, + 0x8ACF: 0xD58C, + 0x8AD0: 0xD58D, + 0x8AD1: 0xD58E, + 0x8AD2: 0xD58F, + 0x8AD3: 0xD590, + 0x8AD4: 0xD591, + 0x8AD5: 0xD592, + 0x8AD6: 0xD593, + 0x8AD7: 0xD594, + 0x8AD8: 0xD595, + 0x8AD9: 0xD596, + 0x8ADA: 0xD597, + 0x8ADB: 0xD598, + 0x8ADC: 0xD599, + 0x8ADD: 0xD59A, + 0x8ADE: 0xD59B, + 0x8ADF: 0xD59C, + 0x8AE0: 0xD59D, + 0x8AE1: 0xD59E, + 0x8AE2: 0xD59F, + 0x8AE3: 0xD5A0, + 0x8AE4: 0xD640, + 0x8AE5: 0xD641, + 0x8AE6: 0xD642, + 0x8AE7: 0xD643, + 0x8AE8: 0xD644, + 0x8AE9: 0xD645, + 0x8AEA: 0xD646, + 0x8AEB: 0xD647, + 0x8AEC: 0xD648, + 0x8AED: 0xD649, + 0x8AEE: 0xD64A, + 0x8AEF: 0xD64B, + 0x8AF0: 0xD64C, + 0x8AF1: 0xD64D, + 0x8AF2: 0xD64E, + 0x8AF3: 0xD64F, + 0x8AF4: 0xD650, + 0x8AF5: 0xD651, + 0x8AF6: 0xD652, + 0x8AF7: 0xD653, + 0x8AF8: 0xD654, + 0x8AF9: 0xD655, + 0x8AFA: 0xD656, + 0x8AFB: 0xD657, + 0x8AFC: 0xD658, + 0x8AFD: 0xD659, + 0x8AFE: 0xD65A, + 0x8AFF: 0xD65B, + 0x8B00: 0xD65C, + 0x8B01: 0xD65D, + 0x8B02: 0xD65E, + 0x8B03: 0xD65F, + 0x8B04: 0xD660, + 0x8B05: 0xD661, + 0x8B06: 0xD662, + 0x8B07: 0xE5C0, + 0x8B08: 0xD663, + 0x8B09: 0xD664, + 0x8B0A: 0xD665, + 0x8B0B: 0xD666, + 0x8B0C: 0xD667, + 0x8B0D: 0xD668, + 0x8B0E: 0xD669, + 0x8B0F: 0xD66A, + 0x8B10: 0xD66B, + 0x8B11: 0xD66C, + 0x8B12: 0xD66D, + 0x8B13: 0xD66E, + 0x8B14: 0xD66F, + 0x8B15: 0xD670, + 0x8B16: 0xD671, + 0x8B17: 0xD672, + 0x8B18: 0xD673, + 0x8B19: 0xD674, + 0x8B1A: 0xD675, + 0x8B1B: 0xD676, + 0x8B1C: 0xD677, + 0x8B1D: 0xD678, + 0x8B1E: 0xD679, + 0x8B1F: 0xD67A, + 0x8B20: 0xD67B, + 0x8B21: 0xD67C, + 0x8B22: 0xD67D, + 0x8B23: 0xD67E, + 0x8B24: 0xD680, + 0x8B25: 0xD681, + 0x8B26: 0xF6A5, + 0x8B27: 0xD682, + 0x8B28: 0xD683, + 0x8B29: 0xD684, + 0x8B2A: 0xD685, + 0x8B2B: 0xD686, + 0x8B2C: 0xD687, + 0x8B2D: 0xD688, + 0x8B2E: 0xD689, + 0x8B2F: 0xD68A, + 0x8B30: 0xD68B, + 0x8B31: 0xD68C, + 0x8B32: 0xD68D, + 0x8B33: 0xD68E, + 0x8B34: 0xD68F, + 0x8B35: 0xD690, + 0x8B36: 0xD691, + 0x8B37: 0xD692, + 0x8B38: 0xD693, + 0x8B39: 0xD694, + 0x8B3A: 0xD695, + 0x8B3B: 0xD696, + 0x8B3C: 0xD697, + 0x8B3D: 0xD698, + 0x8B3E: 0xD699, + 0x8B3F: 0xD69A, + 0x8B40: 0xD69B, + 0x8B41: 0xD69C, + 0x8B42: 0xD69D, + 0x8B43: 0xD69E, + 0x8B44: 0xD69F, + 0x8B45: 0xD6A0, + 0x8B46: 0xD740, + 0x8B47: 0xD741, + 0x8B48: 0xD742, + 0x8B49: 0xD743, + 0x8B4A: 0xD744, + 0x8B4B: 0xD745, + 0x8B4C: 0xD746, + 0x8B4D: 0xD747, + 0x8B4E: 0xD748, + 0x8B4F: 0xD749, + 0x8B50: 0xD74A, + 0x8B51: 0xD74B, + 0x8B52: 0xD74C, + 0x8B53: 0xD74D, + 0x8B54: 0xD74E, + 0x8B55: 0xD74F, + 0x8B56: 0xD750, + 0x8B57: 0xD751, + 0x8B58: 0xD752, + 0x8B59: 0xD753, + 0x8B5A: 0xD754, + 0x8B5B: 0xD755, + 0x8B5C: 0xD756, + 0x8B5D: 0xD757, + 0x8B5E: 0xD758, + 0x8B5F: 0xD759, + 0x8B60: 0xD75A, + 0x8B61: 0xD75B, + 0x8B62: 0xD75C, + 0x8B63: 0xD75D, + 0x8B64: 0xD75E, + 0x8B65: 0xD75F, + 0x8B66: 0xBEAF, + 0x8B67: 0xD760, + 0x8B68: 0xD761, + 0x8B69: 0xD762, + 0x8B6A: 0xD763, + 0x8B6B: 0xD764, + 0x8B6C: 0xC6A9, + 0x8B6D: 0xD765, + 0x8B6E: 0xD766, + 0x8B6F: 0xD767, + 0x8B70: 0xD768, + 0x8B71: 0xD769, + 0x8B72: 0xD76A, + 0x8B73: 0xD76B, + 0x8B74: 0xD76C, + 0x8B75: 0xD76D, + 0x8B76: 0xD76E, + 0x8B77: 0xD76F, + 0x8B78: 0xD770, + 0x8B79: 0xD771, + 0x8B7A: 0xD772, + 0x8B7B: 0xD773, + 0x8B7C: 0xD774, + 0x8B7D: 0xD775, + 0x8B7E: 0xD776, + 0x8B7F: 0xD777, + 0x8B80: 0xD778, + 0x8B81: 0xD779, + 0x8B82: 0xD77A, + 0x8B83: 0xD77B, + 0x8B84: 0xD77C, + 0x8B85: 0xD77D, + 0x8B86: 0xD77E, + 0x8B87: 0xD780, + 0x8B88: 0xD781, + 0x8B89: 0xD782, + 0x8B8A: 0xD783, + 0x8B8B: 0xD784, + 0x8B8C: 0xD785, + 0x8B8D: 0xD786, + 0x8B8E: 0xD787, + 0x8B8F: 0xD788, + 0x8B90: 0xD789, + 0x8B91: 0xD78A, + 0x8B92: 0xD78B, + 0x8B93: 0xD78C, + 0x8B94: 0xD78D, + 0x8B95: 0xD78E, + 0x8B96: 0xD78F, + 0x8B97: 0xD790, + 0x8B98: 0xD791, + 0x8B99: 0xD792, + 0x8B9A: 0xD793, + 0x8B9B: 0xD794, + 0x8B9C: 0xD795, + 0x8B9D: 0xD796, + 0x8B9E: 0xD797, + 0x8B9F: 0xD798, + 0x8BA0: 0xDAA5, + 0x8BA1: 0xBCC6, + 0x8BA2: 0xB6A9, + 0x8BA3: 0xB8BC, + 0x8BA4: 0xC8CF, + 0x8BA5: 0xBCA5, + 0x8BA6: 0xDAA6, + 0x8BA7: 0xDAA7, + 0x8BA8: 0xCCD6, + 0x8BA9: 0xC8C3, + 0x8BAA: 0xDAA8, + 0x8BAB: 0xC6FD, + 0x8BAC: 0xD799, + 0x8BAD: 0xD1B5, + 0x8BAE: 0xD2E9, + 0x8BAF: 0xD1B6, + 0x8BB0: 0xBCC7, + 0x8BB1: 0xD79A, + 0x8BB2: 0xBDB2, + 0x8BB3: 0xBBE4, + 0x8BB4: 0xDAA9, + 0x8BB5: 0xDAAA, + 0x8BB6: 0xD1C8, + 0x8BB7: 0xDAAB, + 0x8BB8: 0xD0ED, + 0x8BB9: 0xB6EF, + 0x8BBA: 0xC2DB, + 0x8BBB: 0xD79B, + 0x8BBC: 0xCBCF, + 0x8BBD: 0xB7ED, + 0x8BBE: 0xC9E8, + 0x8BBF: 0xB7C3, + 0x8BC0: 0xBEF7, + 0x8BC1: 0xD6A4, + 0x8BC2: 0xDAAC, + 0x8BC3: 0xDAAD, + 0x8BC4: 0xC6C0, + 0x8BC5: 0xD7E7, + 0x8BC6: 0xCAB6, + 0x8BC7: 0xD79C, + 0x8BC8: 0xD5A9, + 0x8BC9: 0xCBDF, + 0x8BCA: 0xD5EF, + 0x8BCB: 0xDAAE, + 0x8BCC: 0xD6DF, + 0x8BCD: 0xB4CA, + 0x8BCE: 0xDAB0, + 0x8BCF: 0xDAAF, + 0x8BD0: 0xD79D, + 0x8BD1: 0xD2EB, + 0x8BD2: 0xDAB1, + 0x8BD3: 0xDAB2, + 0x8BD4: 0xDAB3, + 0x8BD5: 0xCAD4, + 0x8BD6: 0xDAB4, + 0x8BD7: 0xCAAB, + 0x8BD8: 0xDAB5, + 0x8BD9: 0xDAB6, + 0x8BDA: 0xB3CF, + 0x8BDB: 0xD6EF, + 0x8BDC: 0xDAB7, + 0x8BDD: 0xBBB0, + 0x8BDE: 0xB5AE, + 0x8BDF: 0xDAB8, + 0x8BE0: 0xDAB9, + 0x8BE1: 0xB9EE, + 0x8BE2: 0xD1AF, + 0x8BE3: 0xD2E8, + 0x8BE4: 0xDABA, + 0x8BE5: 0xB8C3, + 0x8BE6: 0xCFEA, + 0x8BE7: 0xB2EF, + 0x8BE8: 0xDABB, + 0x8BE9: 0xDABC, + 0x8BEA: 0xD79E, + 0x8BEB: 0xBDEB, + 0x8BEC: 0xCEDC, + 0x8BED: 0xD3EF, + 0x8BEE: 0xDABD, + 0x8BEF: 0xCEF3, + 0x8BF0: 0xDABE, + 0x8BF1: 0xD3D5, + 0x8BF2: 0xBBE5, + 0x8BF3: 0xDABF, + 0x8BF4: 0xCBB5, + 0x8BF5: 0xCBD0, + 0x8BF6: 0xDAC0, + 0x8BF7: 0xC7EB, + 0x8BF8: 0xD6EE, + 0x8BF9: 0xDAC1, + 0x8BFA: 0xC5B5, + 0x8BFB: 0xB6C1, + 0x8BFC: 0xDAC2, + 0x8BFD: 0xB7CC, + 0x8BFE: 0xBFCE, + 0x8BFF: 0xDAC3, + 0x8C00: 0xDAC4, + 0x8C01: 0xCBAD, + 0x8C02: 0xDAC5, + 0x8C03: 0xB5F7, + 0x8C04: 0xDAC6, + 0x8C05: 0xC1C2, + 0x8C06: 0xD7BB, + 0x8C07: 0xDAC7, + 0x8C08: 0xCCB8, + 0x8C09: 0xD79F, + 0x8C0A: 0xD2EA, + 0x8C0B: 0xC4B1, + 0x8C0C: 0xDAC8, + 0x8C0D: 0xB5FD, + 0x8C0E: 0xBBD1, + 0x8C0F: 0xDAC9, + 0x8C10: 0xD0B3, + 0x8C11: 0xDACA, + 0x8C12: 0xDACB, + 0x8C13: 0xCEBD, + 0x8C14: 0xDACC, + 0x8C15: 0xDACD, + 0x8C16: 0xDACE, + 0x8C17: 0xB2F7, + 0x8C18: 0xDAD1, + 0x8C19: 0xDACF, + 0x8C1A: 0xD1E8, + 0x8C1B: 0xDAD0, + 0x8C1C: 0xC3D5, + 0x8C1D: 0xDAD2, + 0x8C1E: 0xD7A0, + 0x8C1F: 0xDAD3, + 0x8C20: 0xDAD4, + 0x8C21: 0xDAD5, + 0x8C22: 0xD0BB, + 0x8C23: 0xD2A5, + 0x8C24: 0xB0F9, + 0x8C25: 0xDAD6, + 0x8C26: 0xC7AB, + 0x8C27: 0xDAD7, + 0x8C28: 0xBDF7, + 0x8C29: 0xC3A1, + 0x8C2A: 0xDAD8, + 0x8C2B: 0xDAD9, + 0x8C2C: 0xC3FD, + 0x8C2D: 0xCCB7, + 0x8C2E: 0xDADA, + 0x8C2F: 0xDADB, + 0x8C30: 0xC0BE, + 0x8C31: 0xC6D7, + 0x8C32: 0xDADC, + 0x8C33: 0xDADD, + 0x8C34: 0xC7B4, + 0x8C35: 0xDADE, + 0x8C36: 0xDADF, + 0x8C37: 0xB9C8, + 0x8C38: 0xD840, + 0x8C39: 0xD841, + 0x8C3A: 0xD842, + 0x8C3B: 0xD843, + 0x8C3C: 0xD844, + 0x8C3D: 0xD845, + 0x8C3E: 0xD846, + 0x8C3F: 0xD847, + 0x8C40: 0xD848, + 0x8C41: 0xBBED, + 0x8C42: 0xD849, + 0x8C43: 0xD84A, + 0x8C44: 0xD84B, + 0x8C45: 0xD84C, + 0x8C46: 0xB6B9, + 0x8C47: 0xF4F8, + 0x8C48: 0xD84D, + 0x8C49: 0xF4F9, + 0x8C4A: 0xD84E, + 0x8C4B: 0xD84F, + 0x8C4C: 0xCDE3, + 0x8C4D: 0xD850, + 0x8C4E: 0xD851, + 0x8C4F: 0xD852, + 0x8C50: 0xD853, + 0x8C51: 0xD854, + 0x8C52: 0xD855, + 0x8C53: 0xD856, + 0x8C54: 0xD857, + 0x8C55: 0xF5B9, + 0x8C56: 0xD858, + 0x8C57: 0xD859, + 0x8C58: 0xD85A, + 0x8C59: 0xD85B, + 0x8C5A: 0xEBE0, + 0x8C5B: 0xD85C, + 0x8C5C: 0xD85D, + 0x8C5D: 0xD85E, + 0x8C5E: 0xD85F, + 0x8C5F: 0xD860, + 0x8C60: 0xD861, + 0x8C61: 0xCFF3, + 0x8C62: 0xBBBF, + 0x8C63: 0xD862, + 0x8C64: 0xD863, + 0x8C65: 0xD864, + 0x8C66: 0xD865, + 0x8C67: 0xD866, + 0x8C68: 0xD867, + 0x8C69: 0xD868, + 0x8C6A: 0xBAC0, + 0x8C6B: 0xD4A5, + 0x8C6C: 0xD869, + 0x8C6D: 0xD86A, + 0x8C6E: 0xD86B, + 0x8C6F: 0xD86C, + 0x8C70: 0xD86D, + 0x8C71: 0xD86E, + 0x8C72: 0xD86F, + 0x8C73: 0xE1D9, + 0x8C74: 0xD870, + 0x8C75: 0xD871, + 0x8C76: 0xD872, + 0x8C77: 0xD873, + 0x8C78: 0xF5F4, + 0x8C79: 0xB1AA, + 0x8C7A: 0xB2F2, + 0x8C7B: 0xD874, + 0x8C7C: 0xD875, + 0x8C7D: 0xD876, + 0x8C7E: 0xD877, + 0x8C7F: 0xD878, + 0x8C80: 0xD879, + 0x8C81: 0xD87A, + 0x8C82: 0xF5F5, + 0x8C83: 0xD87B, + 0x8C84: 0xD87C, + 0x8C85: 0xF5F7, + 0x8C86: 0xD87D, + 0x8C87: 0xD87E, + 0x8C88: 0xD880, + 0x8C89: 0xBAD1, + 0x8C8A: 0xF5F6, + 0x8C8B: 0xD881, + 0x8C8C: 0xC3B2, + 0x8C8D: 0xD882, + 0x8C8E: 0xD883, + 0x8C8F: 0xD884, + 0x8C90: 0xD885, + 0x8C91: 0xD886, + 0x8C92: 0xD887, + 0x8C93: 0xD888, + 0x8C94: 0xF5F9, + 0x8C95: 0xD889, + 0x8C96: 0xD88A, + 0x8C97: 0xD88B, + 0x8C98: 0xF5F8, + 0x8C99: 0xD88C, + 0x8C9A: 0xD88D, + 0x8C9B: 0xD88E, + 0x8C9C: 0xD88F, + 0x8C9D: 0xD890, + 0x8C9E: 0xD891, + 0x8C9F: 0xD892, + 0x8CA0: 0xD893, + 0x8CA1: 0xD894, + 0x8CA2: 0xD895, + 0x8CA3: 0xD896, + 0x8CA4: 0xD897, + 0x8CA5: 0xD898, + 0x8CA6: 0xD899, + 0x8CA7: 0xD89A, + 0x8CA8: 0xD89B, + 0x8CA9: 0xD89C, + 0x8CAA: 0xD89D, + 0x8CAB: 0xD89E, + 0x8CAC: 0xD89F, + 0x8CAD: 0xD8A0, + 0x8CAE: 0xD940, + 0x8CAF: 0xD941, + 0x8CB0: 0xD942, + 0x8CB1: 0xD943, + 0x8CB2: 0xD944, + 0x8CB3: 0xD945, + 0x8CB4: 0xD946, + 0x8CB5: 0xD947, + 0x8CB6: 0xD948, + 0x8CB7: 0xD949, + 0x8CB8: 0xD94A, + 0x8CB9: 0xD94B, + 0x8CBA: 0xD94C, + 0x8CBB: 0xD94D, + 0x8CBC: 0xD94E, + 0x8CBD: 0xD94F, + 0x8CBE: 0xD950, + 0x8CBF: 0xD951, + 0x8CC0: 0xD952, + 0x8CC1: 0xD953, + 0x8CC2: 0xD954, + 0x8CC3: 0xD955, + 0x8CC4: 0xD956, + 0x8CC5: 0xD957, + 0x8CC6: 0xD958, + 0x8CC7: 0xD959, + 0x8CC8: 0xD95A, + 0x8CC9: 0xD95B, + 0x8CCA: 0xD95C, + 0x8CCB: 0xD95D, + 0x8CCC: 0xD95E, + 0x8CCD: 0xD95F, + 0x8CCE: 0xD960, + 0x8CCF: 0xD961, + 0x8CD0: 0xD962, + 0x8CD1: 0xD963, + 0x8CD2: 0xD964, + 0x8CD3: 0xD965, + 0x8CD4: 0xD966, + 0x8CD5: 0xD967, + 0x8CD6: 0xD968, + 0x8CD7: 0xD969, + 0x8CD8: 0xD96A, + 0x8CD9: 0xD96B, + 0x8CDA: 0xD96C, + 0x8CDB: 0xD96D, + 0x8CDC: 0xD96E, + 0x8CDD: 0xD96F, + 0x8CDE: 0xD970, + 0x8CDF: 0xD971, + 0x8CE0: 0xD972, + 0x8CE1: 0xD973, + 0x8CE2: 0xD974, + 0x8CE3: 0xD975, + 0x8CE4: 0xD976, + 0x8CE5: 0xD977, + 0x8CE6: 0xD978, + 0x8CE7: 0xD979, + 0x8CE8: 0xD97A, + 0x8CE9: 0xD97B, + 0x8CEA: 0xD97C, + 0x8CEB: 0xD97D, + 0x8CEC: 0xD97E, + 0x8CED: 0xD980, + 0x8CEE: 0xD981, + 0x8CEF: 0xD982, + 0x8CF0: 0xD983, + 0x8CF1: 0xD984, + 0x8CF2: 0xD985, + 0x8CF3: 0xD986, + 0x8CF4: 0xD987, + 0x8CF5: 0xD988, + 0x8CF6: 0xD989, + 0x8CF7: 0xD98A, + 0x8CF8: 0xD98B, + 0x8CF9: 0xD98C, + 0x8CFA: 0xD98D, + 0x8CFB: 0xD98E, + 0x8CFC: 0xD98F, + 0x8CFD: 0xD990, + 0x8CFE: 0xD991, + 0x8CFF: 0xD992, + 0x8D00: 0xD993, + 0x8D01: 0xD994, + 0x8D02: 0xD995, + 0x8D03: 0xD996, + 0x8D04: 0xD997, + 0x8D05: 0xD998, + 0x8D06: 0xD999, + 0x8D07: 0xD99A, + 0x8D08: 0xD99B, + 0x8D09: 0xD99C, + 0x8D0A: 0xD99D, + 0x8D0B: 0xD99E, + 0x8D0C: 0xD99F, + 0x8D0D: 0xD9A0, + 0x8D0E: 0xDA40, + 0x8D0F: 0xDA41, + 0x8D10: 0xDA42, + 0x8D11: 0xDA43, + 0x8D12: 0xDA44, + 0x8D13: 0xDA45, + 0x8D14: 0xDA46, + 0x8D15: 0xDA47, + 0x8D16: 0xDA48, + 0x8D17: 0xDA49, + 0x8D18: 0xDA4A, + 0x8D19: 0xDA4B, + 0x8D1A: 0xDA4C, + 0x8D1B: 0xDA4D, + 0x8D1C: 0xDA4E, + 0x8D1D: 0xB1B4, + 0x8D1E: 0xD5EA, + 0x8D1F: 0xB8BA, + 0x8D20: 0xDA4F, + 0x8D21: 0xB9B1, + 0x8D22: 0xB2C6, + 0x8D23: 0xD4F0, + 0x8D24: 0xCFCD, + 0x8D25: 0xB0DC, + 0x8D26: 0xD5CB, + 0x8D27: 0xBBF5, + 0x8D28: 0xD6CA, + 0x8D29: 0xB7B7, + 0x8D2A: 0xCCB0, + 0x8D2B: 0xC6B6, + 0x8D2C: 0xB1E1, + 0x8D2D: 0xB9BA, + 0x8D2E: 0xD6FC, + 0x8D2F: 0xB9E1, + 0x8D30: 0xB7A1, + 0x8D31: 0xBCFA, + 0x8D32: 0xEADA, + 0x8D33: 0xEADB, + 0x8D34: 0xCCF9, + 0x8D35: 0xB9F3, + 0x8D36: 0xEADC, + 0x8D37: 0xB4FB, + 0x8D38: 0xC3B3, + 0x8D39: 0xB7D1, + 0x8D3A: 0xBAD8, + 0x8D3B: 0xEADD, + 0x8D3C: 0xD4F4, + 0x8D3D: 0xEADE, + 0x8D3E: 0xBCD6, + 0x8D3F: 0xBBDF, + 0x8D40: 0xEADF, + 0x8D41: 0xC1DE, + 0x8D42: 0xC2B8, + 0x8D43: 0xD4DF, + 0x8D44: 0xD7CA, + 0x8D45: 0xEAE0, + 0x8D46: 0xEAE1, + 0x8D47: 0xEAE4, + 0x8D48: 0xEAE2, + 0x8D49: 0xEAE3, + 0x8D4A: 0xC9DE, + 0x8D4B: 0xB8B3, + 0x8D4C: 0xB6C4, + 0x8D4D: 0xEAE5, + 0x8D4E: 0xCAEA, + 0x8D4F: 0xC9CD, + 0x8D50: 0xB4CD, + 0x8D51: 0xDA50, + 0x8D52: 0xDA51, + 0x8D53: 0xE2D9, + 0x8D54: 0xC5E2, + 0x8D55: 0xEAE6, + 0x8D56: 0xC0B5, + 0x8D57: 0xDA52, + 0x8D58: 0xD7B8, + 0x8D59: 0xEAE7, + 0x8D5A: 0xD7AC, + 0x8D5B: 0xC8FC, + 0x8D5C: 0xD8D3, + 0x8D5D: 0xD8CD, + 0x8D5E: 0xD4DE, + 0x8D5F: 0xDA53, + 0x8D60: 0xD4F9, + 0x8D61: 0xC9C4, + 0x8D62: 0xD3AE, + 0x8D63: 0xB8D3, + 0x8D64: 0xB3E0, + 0x8D65: 0xDA54, + 0x8D66: 0xC9E2, + 0x8D67: 0xF4F6, + 0x8D68: 0xDA55, + 0x8D69: 0xDA56, + 0x8D6A: 0xDA57, + 0x8D6B: 0xBAD5, + 0x8D6C: 0xDA58, + 0x8D6D: 0xF4F7, + 0x8D6E: 0xDA59, + 0x8D6F: 0xDA5A, + 0x8D70: 0xD7DF, + 0x8D71: 0xDA5B, + 0x8D72: 0xDA5C, + 0x8D73: 0xF4F1, + 0x8D74: 0xB8B0, + 0x8D75: 0xD5D4, + 0x8D76: 0xB8CF, + 0x8D77: 0xC6F0, + 0x8D78: 0xDA5D, + 0x8D79: 0xDA5E, + 0x8D7A: 0xDA5F, + 0x8D7B: 0xDA60, + 0x8D7C: 0xDA61, + 0x8D7D: 0xDA62, + 0x8D7E: 0xDA63, + 0x8D7F: 0xDA64, + 0x8D80: 0xDA65, + 0x8D81: 0xB3C3, + 0x8D82: 0xDA66, + 0x8D83: 0xDA67, + 0x8D84: 0xF4F2, + 0x8D85: 0xB3AC, + 0x8D86: 0xDA68, + 0x8D87: 0xDA69, + 0x8D88: 0xDA6A, + 0x8D89: 0xDA6B, + 0x8D8A: 0xD4BD, + 0x8D8B: 0xC7F7, + 0x8D8C: 0xDA6C, + 0x8D8D: 0xDA6D, + 0x8D8E: 0xDA6E, + 0x8D8F: 0xDA6F, + 0x8D90: 0xDA70, + 0x8D91: 0xF4F4, + 0x8D92: 0xDA71, + 0x8D93: 0xDA72, + 0x8D94: 0xF4F3, + 0x8D95: 0xDA73, + 0x8D96: 0xDA74, + 0x8D97: 0xDA75, + 0x8D98: 0xDA76, + 0x8D99: 0xDA77, + 0x8D9A: 0xDA78, + 0x8D9B: 0xDA79, + 0x8D9C: 0xDA7A, + 0x8D9D: 0xDA7B, + 0x8D9E: 0xDA7C, + 0x8D9F: 0xCCCB, + 0x8DA0: 0xDA7D, + 0x8DA1: 0xDA7E, + 0x8DA2: 0xDA80, + 0x8DA3: 0xC8A4, + 0x8DA4: 0xDA81, + 0x8DA5: 0xDA82, + 0x8DA6: 0xDA83, + 0x8DA7: 0xDA84, + 0x8DA8: 0xDA85, + 0x8DA9: 0xDA86, + 0x8DAA: 0xDA87, + 0x8DAB: 0xDA88, + 0x8DAC: 0xDA89, + 0x8DAD: 0xDA8A, + 0x8DAE: 0xDA8B, + 0x8DAF: 0xDA8C, + 0x8DB0: 0xDA8D, + 0x8DB1: 0xF4F5, + 0x8DB2: 0xDA8E, + 0x8DB3: 0xD7E3, + 0x8DB4: 0xC5BF, + 0x8DB5: 0xF5C0, + 0x8DB6: 0xDA8F, + 0x8DB7: 0xDA90, + 0x8DB8: 0xF5BB, + 0x8DB9: 0xDA91, + 0x8DBA: 0xF5C3, + 0x8DBB: 0xDA92, + 0x8DBC: 0xF5C2, + 0x8DBD: 0xDA93, + 0x8DBE: 0xD6BA, + 0x8DBF: 0xF5C1, + 0x8DC0: 0xDA94, + 0x8DC1: 0xDA95, + 0x8DC2: 0xDA96, + 0x8DC3: 0xD4BE, + 0x8DC4: 0xF5C4, + 0x8DC5: 0xDA97, + 0x8DC6: 0xF5CC, + 0x8DC7: 0xDA98, + 0x8DC8: 0xDA99, + 0x8DC9: 0xDA9A, + 0x8DCA: 0xDA9B, + 0x8DCB: 0xB0CF, + 0x8DCC: 0xB5F8, + 0x8DCD: 0xDA9C, + 0x8DCE: 0xF5C9, + 0x8DCF: 0xF5CA, + 0x8DD0: 0xDA9D, + 0x8DD1: 0xC5DC, + 0x8DD2: 0xDA9E, + 0x8DD3: 0xDA9F, + 0x8DD4: 0xDAA0, + 0x8DD5: 0xDB40, + 0x8DD6: 0xF5C5, + 0x8DD7: 0xF5C6, + 0x8DD8: 0xDB41, + 0x8DD9: 0xDB42, + 0x8DDA: 0xF5C7, + 0x8DDB: 0xF5CB, + 0x8DDC: 0xDB43, + 0x8DDD: 0xBEE0, + 0x8DDE: 0xF5C8, + 0x8DDF: 0xB8FA, + 0x8DE0: 0xDB44, + 0x8DE1: 0xDB45, + 0x8DE2: 0xDB46, + 0x8DE3: 0xF5D0, + 0x8DE4: 0xF5D3, + 0x8DE5: 0xDB47, + 0x8DE6: 0xDB48, + 0x8DE7: 0xDB49, + 0x8DE8: 0xBFE7, + 0x8DE9: 0xDB4A, + 0x8DEA: 0xB9F2, + 0x8DEB: 0xF5BC, + 0x8DEC: 0xF5CD, + 0x8DED: 0xDB4B, + 0x8DEE: 0xDB4C, + 0x8DEF: 0xC2B7, + 0x8DF0: 0xDB4D, + 0x8DF1: 0xDB4E, + 0x8DF2: 0xDB4F, + 0x8DF3: 0xCCF8, + 0x8DF4: 0xDB50, + 0x8DF5: 0xBCF9, + 0x8DF6: 0xDB51, + 0x8DF7: 0xF5CE, + 0x8DF8: 0xF5CF, + 0x8DF9: 0xF5D1, + 0x8DFA: 0xB6E5, + 0x8DFB: 0xF5D2, + 0x8DFC: 0xDB52, + 0x8DFD: 0xF5D5, + 0x8DFE: 0xDB53, + 0x8DFF: 0xDB54, + 0x8E00: 0xDB55, + 0x8E01: 0xDB56, + 0x8E02: 0xDB57, + 0x8E03: 0xDB58, + 0x8E04: 0xDB59, + 0x8E05: 0xF5BD, + 0x8E06: 0xDB5A, + 0x8E07: 0xDB5B, + 0x8E08: 0xDB5C, + 0x8E09: 0xF5D4, + 0x8E0A: 0xD3BB, + 0x8E0B: 0xDB5D, + 0x8E0C: 0xB3EC, + 0x8E0D: 0xDB5E, + 0x8E0E: 0xDB5F, + 0x8E0F: 0xCCA4, + 0x8E10: 0xDB60, + 0x8E11: 0xDB61, + 0x8E12: 0xDB62, + 0x8E13: 0xDB63, + 0x8E14: 0xF5D6, + 0x8E15: 0xDB64, + 0x8E16: 0xDB65, + 0x8E17: 0xDB66, + 0x8E18: 0xDB67, + 0x8E19: 0xDB68, + 0x8E1A: 0xDB69, + 0x8E1B: 0xDB6A, + 0x8E1C: 0xDB6B, + 0x8E1D: 0xF5D7, + 0x8E1E: 0xBEE1, + 0x8E1F: 0xF5D8, + 0x8E20: 0xDB6C, + 0x8E21: 0xDB6D, + 0x8E22: 0xCCDF, + 0x8E23: 0xF5DB, + 0x8E24: 0xDB6E, + 0x8E25: 0xDB6F, + 0x8E26: 0xDB70, + 0x8E27: 0xDB71, + 0x8E28: 0xDB72, + 0x8E29: 0xB2C8, + 0x8E2A: 0xD7D9, + 0x8E2B: 0xDB73, + 0x8E2C: 0xF5D9, + 0x8E2D: 0xDB74, + 0x8E2E: 0xF5DA, + 0x8E2F: 0xF5DC, + 0x8E30: 0xDB75, + 0x8E31: 0xF5E2, + 0x8E32: 0xDB76, + 0x8E33: 0xDB77, + 0x8E34: 0xDB78, + 0x8E35: 0xF5E0, + 0x8E36: 0xDB79, + 0x8E37: 0xDB7A, + 0x8E38: 0xDB7B, + 0x8E39: 0xF5DF, + 0x8E3A: 0xF5DD, + 0x8E3B: 0xDB7C, + 0x8E3C: 0xDB7D, + 0x8E3D: 0xF5E1, + 0x8E3E: 0xDB7E, + 0x8E3F: 0xDB80, + 0x8E40: 0xF5DE, + 0x8E41: 0xF5E4, + 0x8E42: 0xF5E5, + 0x8E43: 0xDB81, + 0x8E44: 0xCCE3, + 0x8E45: 0xDB82, + 0x8E46: 0xDB83, + 0x8E47: 0xE5BF, + 0x8E48: 0xB5B8, + 0x8E49: 0xF5E3, + 0x8E4A: 0xF5E8, + 0x8E4B: 0xCCA3, + 0x8E4C: 0xDB84, + 0x8E4D: 0xDB85, + 0x8E4E: 0xDB86, + 0x8E4F: 0xDB87, + 0x8E50: 0xDB88, + 0x8E51: 0xF5E6, + 0x8E52: 0xF5E7, + 0x8E53: 0xDB89, + 0x8E54: 0xDB8A, + 0x8E55: 0xDB8B, + 0x8E56: 0xDB8C, + 0x8E57: 0xDB8D, + 0x8E58: 0xDB8E, + 0x8E59: 0xF5BE, + 0x8E5A: 0xDB8F, + 0x8E5B: 0xDB90, + 0x8E5C: 0xDB91, + 0x8E5D: 0xDB92, + 0x8E5E: 0xDB93, + 0x8E5F: 0xDB94, + 0x8E60: 0xDB95, + 0x8E61: 0xDB96, + 0x8E62: 0xDB97, + 0x8E63: 0xDB98, + 0x8E64: 0xDB99, + 0x8E65: 0xDB9A, + 0x8E66: 0xB1C4, + 0x8E67: 0xDB9B, + 0x8E68: 0xDB9C, + 0x8E69: 0xF5BF, + 0x8E6A: 0xDB9D, + 0x8E6B: 0xDB9E, + 0x8E6C: 0xB5C5, + 0x8E6D: 0xB2E4, + 0x8E6E: 0xDB9F, + 0x8E6F: 0xF5EC, + 0x8E70: 0xF5E9, + 0x8E71: 0xDBA0, + 0x8E72: 0xB6D7, + 0x8E73: 0xDC40, + 0x8E74: 0xF5ED, + 0x8E75: 0xDC41, + 0x8E76: 0xF5EA, + 0x8E77: 0xDC42, + 0x8E78: 0xDC43, + 0x8E79: 0xDC44, + 0x8E7A: 0xDC45, + 0x8E7B: 0xDC46, + 0x8E7C: 0xF5EB, + 0x8E7D: 0xDC47, + 0x8E7E: 0xDC48, + 0x8E7F: 0xB4DA, + 0x8E80: 0xDC49, + 0x8E81: 0xD4EA, + 0x8E82: 0xDC4A, + 0x8E83: 0xDC4B, + 0x8E84: 0xDC4C, + 0x8E85: 0xF5EE, + 0x8E86: 0xDC4D, + 0x8E87: 0xB3F9, + 0x8E88: 0xDC4E, + 0x8E89: 0xDC4F, + 0x8E8A: 0xDC50, + 0x8E8B: 0xDC51, + 0x8E8C: 0xDC52, + 0x8E8D: 0xDC53, + 0x8E8E: 0xDC54, + 0x8E8F: 0xF5EF, + 0x8E90: 0xF5F1, + 0x8E91: 0xDC55, + 0x8E92: 0xDC56, + 0x8E93: 0xDC57, + 0x8E94: 0xF5F0, + 0x8E95: 0xDC58, + 0x8E96: 0xDC59, + 0x8E97: 0xDC5A, + 0x8E98: 0xDC5B, + 0x8E99: 0xDC5C, + 0x8E9A: 0xDC5D, + 0x8E9B: 0xDC5E, + 0x8E9C: 0xF5F2, + 0x8E9D: 0xDC5F, + 0x8E9E: 0xF5F3, + 0x8E9F: 0xDC60, + 0x8EA0: 0xDC61, + 0x8EA1: 0xDC62, + 0x8EA2: 0xDC63, + 0x8EA3: 0xDC64, + 0x8EA4: 0xDC65, + 0x8EA5: 0xDC66, + 0x8EA6: 0xDC67, + 0x8EA7: 0xDC68, + 0x8EA8: 0xDC69, + 0x8EA9: 0xDC6A, + 0x8EAA: 0xDC6B, + 0x8EAB: 0xC9ED, + 0x8EAC: 0xB9AA, + 0x8EAD: 0xDC6C, + 0x8EAE: 0xDC6D, + 0x8EAF: 0xC7FB, + 0x8EB0: 0xDC6E, + 0x8EB1: 0xDC6F, + 0x8EB2: 0xB6E3, + 0x8EB3: 0xDC70, + 0x8EB4: 0xDC71, + 0x8EB5: 0xDC72, + 0x8EB6: 0xDC73, + 0x8EB7: 0xDC74, + 0x8EB8: 0xDC75, + 0x8EB9: 0xDC76, + 0x8EBA: 0xCCC9, + 0x8EBB: 0xDC77, + 0x8EBC: 0xDC78, + 0x8EBD: 0xDC79, + 0x8EBE: 0xDC7A, + 0x8EBF: 0xDC7B, + 0x8EC0: 0xDC7C, + 0x8EC1: 0xDC7D, + 0x8EC2: 0xDC7E, + 0x8EC3: 0xDC80, + 0x8EC4: 0xDC81, + 0x8EC5: 0xDC82, + 0x8EC6: 0xDC83, + 0x8EC7: 0xDC84, + 0x8EC8: 0xDC85, + 0x8EC9: 0xDC86, + 0x8ECA: 0xDC87, + 0x8ECB: 0xDC88, + 0x8ECC: 0xDC89, + 0x8ECD: 0xDC8A, + 0x8ECE: 0xEAA6, + 0x8ECF: 0xDC8B, + 0x8ED0: 0xDC8C, + 0x8ED1: 0xDC8D, + 0x8ED2: 0xDC8E, + 0x8ED3: 0xDC8F, + 0x8ED4: 0xDC90, + 0x8ED5: 0xDC91, + 0x8ED6: 0xDC92, + 0x8ED7: 0xDC93, + 0x8ED8: 0xDC94, + 0x8ED9: 0xDC95, + 0x8EDA: 0xDC96, + 0x8EDB: 0xDC97, + 0x8EDC: 0xDC98, + 0x8EDD: 0xDC99, + 0x8EDE: 0xDC9A, + 0x8EDF: 0xDC9B, + 0x8EE0: 0xDC9C, + 0x8EE1: 0xDC9D, + 0x8EE2: 0xDC9E, + 0x8EE3: 0xDC9F, + 0x8EE4: 0xDCA0, + 0x8EE5: 0xDD40, + 0x8EE6: 0xDD41, + 0x8EE7: 0xDD42, + 0x8EE8: 0xDD43, + 0x8EE9: 0xDD44, + 0x8EEA: 0xDD45, + 0x8EEB: 0xDD46, + 0x8EEC: 0xDD47, + 0x8EED: 0xDD48, + 0x8EEE: 0xDD49, + 0x8EEF: 0xDD4A, + 0x8EF0: 0xDD4B, + 0x8EF1: 0xDD4C, + 0x8EF2: 0xDD4D, + 0x8EF3: 0xDD4E, + 0x8EF4: 0xDD4F, + 0x8EF5: 0xDD50, + 0x8EF6: 0xDD51, + 0x8EF7: 0xDD52, + 0x8EF8: 0xDD53, + 0x8EF9: 0xDD54, + 0x8EFA: 0xDD55, + 0x8EFB: 0xDD56, + 0x8EFC: 0xDD57, + 0x8EFD: 0xDD58, + 0x8EFE: 0xDD59, + 0x8EFF: 0xDD5A, + 0x8F00: 0xDD5B, + 0x8F01: 0xDD5C, + 0x8F02: 0xDD5D, + 0x8F03: 0xDD5E, + 0x8F04: 0xDD5F, + 0x8F05: 0xDD60, + 0x8F06: 0xDD61, + 0x8F07: 0xDD62, + 0x8F08: 0xDD63, + 0x8F09: 0xDD64, + 0x8F0A: 0xDD65, + 0x8F0B: 0xDD66, + 0x8F0C: 0xDD67, + 0x8F0D: 0xDD68, + 0x8F0E: 0xDD69, + 0x8F0F: 0xDD6A, + 0x8F10: 0xDD6B, + 0x8F11: 0xDD6C, + 0x8F12: 0xDD6D, + 0x8F13: 0xDD6E, + 0x8F14: 0xDD6F, + 0x8F15: 0xDD70, + 0x8F16: 0xDD71, + 0x8F17: 0xDD72, + 0x8F18: 0xDD73, + 0x8F19: 0xDD74, + 0x8F1A: 0xDD75, + 0x8F1B: 0xDD76, + 0x8F1C: 0xDD77, + 0x8F1D: 0xDD78, + 0x8F1E: 0xDD79, + 0x8F1F: 0xDD7A, + 0x8F20: 0xDD7B, + 0x8F21: 0xDD7C, + 0x8F22: 0xDD7D, + 0x8F23: 0xDD7E, + 0x8F24: 0xDD80, + 0x8F25: 0xDD81, + 0x8F26: 0xDD82, + 0x8F27: 0xDD83, + 0x8F28: 0xDD84, + 0x8F29: 0xDD85, + 0x8F2A: 0xDD86, + 0x8F2B: 0xDD87, + 0x8F2C: 0xDD88, + 0x8F2D: 0xDD89, + 0x8F2E: 0xDD8A, + 0x8F2F: 0xDD8B, + 0x8F30: 0xDD8C, + 0x8F31: 0xDD8D, + 0x8F32: 0xDD8E, + 0x8F33: 0xDD8F, + 0x8F34: 0xDD90, + 0x8F35: 0xDD91, + 0x8F36: 0xDD92, + 0x8F37: 0xDD93, + 0x8F38: 0xDD94, + 0x8F39: 0xDD95, + 0x8F3A: 0xDD96, + 0x8F3B: 0xDD97, + 0x8F3C: 0xDD98, + 0x8F3D: 0xDD99, + 0x8F3E: 0xDD9A, + 0x8F3F: 0xDD9B, + 0x8F40: 0xDD9C, + 0x8F41: 0xDD9D, + 0x8F42: 0xDD9E, + 0x8F43: 0xDD9F, + 0x8F44: 0xDDA0, + 0x8F45: 0xDE40, + 0x8F46: 0xDE41, + 0x8F47: 0xDE42, + 0x8F48: 0xDE43, + 0x8F49: 0xDE44, + 0x8F4A: 0xDE45, + 0x8F4B: 0xDE46, + 0x8F4C: 0xDE47, + 0x8F4D: 0xDE48, + 0x8F4E: 0xDE49, + 0x8F4F: 0xDE4A, + 0x8F50: 0xDE4B, + 0x8F51: 0xDE4C, + 0x8F52: 0xDE4D, + 0x8F53: 0xDE4E, + 0x8F54: 0xDE4F, + 0x8F55: 0xDE50, + 0x8F56: 0xDE51, + 0x8F57: 0xDE52, + 0x8F58: 0xDE53, + 0x8F59: 0xDE54, + 0x8F5A: 0xDE55, + 0x8F5B: 0xDE56, + 0x8F5C: 0xDE57, + 0x8F5D: 0xDE58, + 0x8F5E: 0xDE59, + 0x8F5F: 0xDE5A, + 0x8F60: 0xDE5B, + 0x8F61: 0xDE5C, + 0x8F62: 0xDE5D, + 0x8F63: 0xDE5E, + 0x8F64: 0xDE5F, + 0x8F65: 0xDE60, + 0x8F66: 0xB3B5, + 0x8F67: 0xD4FE, + 0x8F68: 0xB9EC, + 0x8F69: 0xD0F9, + 0x8F6A: 0xDE61, + 0x8F6B: 0xE9ED, + 0x8F6C: 0xD7AA, + 0x8F6D: 0xE9EE, + 0x8F6E: 0xC2D6, + 0x8F6F: 0xC8ED, + 0x8F70: 0xBAE4, + 0x8F71: 0xE9EF, + 0x8F72: 0xE9F0, + 0x8F73: 0xE9F1, + 0x8F74: 0xD6E1, + 0x8F75: 0xE9F2, + 0x8F76: 0xE9F3, + 0x8F77: 0xE9F5, + 0x8F78: 0xE9F4, + 0x8F79: 0xE9F6, + 0x8F7A: 0xE9F7, + 0x8F7B: 0xC7E1, + 0x8F7C: 0xE9F8, + 0x8F7D: 0xD4D8, + 0x8F7E: 0xE9F9, + 0x8F7F: 0xBDCE, + 0x8F80: 0xDE62, + 0x8F81: 0xE9FA, + 0x8F82: 0xE9FB, + 0x8F83: 0xBDCF, + 0x8F84: 0xE9FC, + 0x8F85: 0xB8A8, + 0x8F86: 0xC1BE, + 0x8F87: 0xE9FD, + 0x8F88: 0xB1B2, + 0x8F89: 0xBBD4, + 0x8F8A: 0xB9F5, + 0x8F8B: 0xE9FE, + 0x8F8C: 0xDE63, + 0x8F8D: 0xEAA1, + 0x8F8E: 0xEAA2, + 0x8F8F: 0xEAA3, + 0x8F90: 0xB7F8, + 0x8F91: 0xBCAD, + 0x8F92: 0xDE64, + 0x8F93: 0xCAE4, + 0x8F94: 0xE0CE, + 0x8F95: 0xD4AF, + 0x8F96: 0xCFBD, + 0x8F97: 0xD5B7, + 0x8F98: 0xEAA4, + 0x8F99: 0xD5DE, + 0x8F9A: 0xEAA5, + 0x8F9B: 0xD0C1, + 0x8F9C: 0xB9BC, + 0x8F9D: 0xDE65, + 0x8F9E: 0xB4C7, + 0x8F9F: 0xB1D9, + 0x8FA0: 0xDE66, + 0x8FA1: 0xDE67, + 0x8FA2: 0xDE68, + 0x8FA3: 0xC0B1, + 0x8FA4: 0xDE69, + 0x8FA5: 0xDE6A, + 0x8FA6: 0xDE6B, + 0x8FA7: 0xDE6C, + 0x8FA8: 0xB1E6, + 0x8FA9: 0xB1E7, + 0x8FAA: 0xDE6D, + 0x8FAB: 0xB1E8, + 0x8FAC: 0xDE6E, + 0x8FAD: 0xDE6F, + 0x8FAE: 0xDE70, + 0x8FAF: 0xDE71, + 0x8FB0: 0xB3BD, + 0x8FB1: 0xC8E8, + 0x8FB2: 0xDE72, + 0x8FB3: 0xDE73, + 0x8FB4: 0xDE74, + 0x8FB5: 0xDE75, + 0x8FB6: 0xE5C1, + 0x8FB7: 0xDE76, + 0x8FB8: 0xDE77, + 0x8FB9: 0xB1DF, + 0x8FBA: 0xDE78, + 0x8FBB: 0xDE79, + 0x8FBC: 0xDE7A, + 0x8FBD: 0xC1C9, + 0x8FBE: 0xB4EF, + 0x8FBF: 0xDE7B, + 0x8FC0: 0xDE7C, + 0x8FC1: 0xC7A8, + 0x8FC2: 0xD3D8, + 0x8FC3: 0xDE7D, + 0x8FC4: 0xC6F9, + 0x8FC5: 0xD1B8, + 0x8FC6: 0xDE7E, + 0x8FC7: 0xB9FD, + 0x8FC8: 0xC2F5, + 0x8FC9: 0xDE80, + 0x8FCA: 0xDE81, + 0x8FCB: 0xDE82, + 0x8FCC: 0xDE83, + 0x8FCD: 0xDE84, + 0x8FCE: 0xD3AD, + 0x8FCF: 0xDE85, + 0x8FD0: 0xD4CB, + 0x8FD1: 0xBDFC, + 0x8FD2: 0xDE86, + 0x8FD3: 0xE5C2, + 0x8FD4: 0xB7B5, + 0x8FD5: 0xE5C3, + 0x8FD6: 0xDE87, + 0x8FD7: 0xDE88, + 0x8FD8: 0xBBB9, + 0x8FD9: 0xD5E2, + 0x8FDA: 0xDE89, + 0x8FDB: 0xBDF8, + 0x8FDC: 0xD4B6, + 0x8FDD: 0xCEA5, + 0x8FDE: 0xC1AC, + 0x8FDF: 0xB3D9, + 0x8FE0: 0xDE8A, + 0x8FE1: 0xDE8B, + 0x8FE2: 0xCCF6, + 0x8FE3: 0xDE8C, + 0x8FE4: 0xE5C6, + 0x8FE5: 0xE5C4, + 0x8FE6: 0xE5C8, + 0x8FE7: 0xDE8D, + 0x8FE8: 0xE5CA, + 0x8FE9: 0xE5C7, + 0x8FEA: 0xB5CF, + 0x8FEB: 0xC6C8, + 0x8FEC: 0xDE8E, + 0x8FED: 0xB5FC, + 0x8FEE: 0xE5C5, + 0x8FEF: 0xDE8F, + 0x8FF0: 0xCAF6, + 0x8FF1: 0xDE90, + 0x8FF2: 0xDE91, + 0x8FF3: 0xE5C9, + 0x8FF4: 0xDE92, + 0x8FF5: 0xDE93, + 0x8FF6: 0xDE94, + 0x8FF7: 0xC3D4, + 0x8FF8: 0xB1C5, + 0x8FF9: 0xBCA3, + 0x8FFA: 0xDE95, + 0x8FFB: 0xDE96, + 0x8FFC: 0xDE97, + 0x8FFD: 0xD7B7, + 0x8FFE: 0xDE98, + 0x8FFF: 0xDE99, + 0x9000: 0xCDCB, + 0x9001: 0xCBCD, + 0x9002: 0xCACA, + 0x9003: 0xCCD3, + 0x9004: 0xE5CC, + 0x9005: 0xE5CB, + 0x9006: 0xC4E6, + 0x9007: 0xDE9A, + 0x9008: 0xDE9B, + 0x9009: 0xD1A1, + 0x900A: 0xD1B7, + 0x900B: 0xE5CD, + 0x900C: 0xDE9C, + 0x900D: 0xE5D0, + 0x900E: 0xDE9D, + 0x900F: 0xCDB8, + 0x9010: 0xD6F0, + 0x9011: 0xE5CF, + 0x9012: 0xB5DD, + 0x9013: 0xDE9E, + 0x9014: 0xCDBE, + 0x9015: 0xDE9F, + 0x9016: 0xE5D1, + 0x9017: 0xB6BA, + 0x9018: 0xDEA0, + 0x9019: 0xDF40, + 0x901A: 0xCDA8, + 0x901B: 0xB9E4, + 0x901C: 0xDF41, + 0x901D: 0xCAC5, + 0x901E: 0xB3D1, + 0x901F: 0xCBD9, + 0x9020: 0xD4EC, + 0x9021: 0xE5D2, + 0x9022: 0xB7EA, + 0x9023: 0xDF42, + 0x9024: 0xDF43, + 0x9025: 0xDF44, + 0x9026: 0xE5CE, + 0x9027: 0xDF45, + 0x9028: 0xDF46, + 0x9029: 0xDF47, + 0x902A: 0xDF48, + 0x902B: 0xDF49, + 0x902C: 0xDF4A, + 0x902D: 0xE5D5, + 0x902E: 0xB4FE, + 0x902F: 0xE5D6, + 0x9030: 0xDF4B, + 0x9031: 0xDF4C, + 0x9032: 0xDF4D, + 0x9033: 0xDF4E, + 0x9034: 0xDF4F, + 0x9035: 0xE5D3, + 0x9036: 0xE5D4, + 0x9037: 0xDF50, + 0x9038: 0xD2DD, + 0x9039: 0xDF51, + 0x903A: 0xDF52, + 0x903B: 0xC2DF, + 0x903C: 0xB1C6, + 0x903D: 0xDF53, + 0x903E: 0xD3E2, + 0x903F: 0xDF54, + 0x9040: 0xDF55, + 0x9041: 0xB6DD, + 0x9042: 0xCBEC, + 0x9043: 0xDF56, + 0x9044: 0xE5D7, + 0x9045: 0xDF57, + 0x9046: 0xDF58, + 0x9047: 0xD3F6, + 0x9048: 0xDF59, + 0x9049: 0xDF5A, + 0x904A: 0xDF5B, + 0x904B: 0xDF5C, + 0x904C: 0xDF5D, + 0x904D: 0xB1E9, + 0x904E: 0xDF5E, + 0x904F: 0xB6F4, + 0x9050: 0xE5DA, + 0x9051: 0xE5D8, + 0x9052: 0xE5D9, + 0x9053: 0xB5C0, + 0x9054: 0xDF5F, + 0x9055: 0xDF60, + 0x9056: 0xDF61, + 0x9057: 0xD2C5, + 0x9058: 0xE5DC, + 0x9059: 0xDF62, + 0x905A: 0xDF63, + 0x905B: 0xE5DE, + 0x905C: 0xDF64, + 0x905D: 0xDF65, + 0x905E: 0xDF66, + 0x905F: 0xDF67, + 0x9060: 0xDF68, + 0x9061: 0xDF69, + 0x9062: 0xE5DD, + 0x9063: 0xC7B2, + 0x9064: 0xDF6A, + 0x9065: 0xD2A3, + 0x9066: 0xDF6B, + 0x9067: 0xDF6C, + 0x9068: 0xE5DB, + 0x9069: 0xDF6D, + 0x906A: 0xDF6E, + 0x906B: 0xDF6F, + 0x906C: 0xDF70, + 0x906D: 0xD4E2, + 0x906E: 0xD5DA, + 0x906F: 0xDF71, + 0x9070: 0xDF72, + 0x9071: 0xDF73, + 0x9072: 0xDF74, + 0x9073: 0xDF75, + 0x9074: 0xE5E0, + 0x9075: 0xD7F1, + 0x9076: 0xDF76, + 0x9077: 0xDF77, + 0x9078: 0xDF78, + 0x9079: 0xDF79, + 0x907A: 0xDF7A, + 0x907B: 0xDF7B, + 0x907C: 0xDF7C, + 0x907D: 0xE5E1, + 0x907E: 0xDF7D, + 0x907F: 0xB1DC, + 0x9080: 0xD1FB, + 0x9081: 0xDF7E, + 0x9082: 0xE5E2, + 0x9083: 0xE5E4, + 0x9084: 0xDF80, + 0x9085: 0xDF81, + 0x9086: 0xDF82, + 0x9087: 0xDF83, + 0x9088: 0xE5E3, + 0x9089: 0xDF84, + 0x908A: 0xDF85, + 0x908B: 0xE5E5, + 0x908C: 0xDF86, + 0x908D: 0xDF87, + 0x908E: 0xDF88, + 0x908F: 0xDF89, + 0x9090: 0xDF8A, + 0x9091: 0xD2D8, + 0x9092: 0xDF8B, + 0x9093: 0xB5CB, + 0x9094: 0xDF8C, + 0x9095: 0xE7DF, + 0x9096: 0xDF8D, + 0x9097: 0xDAF5, + 0x9098: 0xDF8E, + 0x9099: 0xDAF8, + 0x909A: 0xDF8F, + 0x909B: 0xDAF6, + 0x909C: 0xDF90, + 0x909D: 0xDAF7, + 0x909E: 0xDF91, + 0x909F: 0xDF92, + 0x90A0: 0xDF93, + 0x90A1: 0xDAFA, + 0x90A2: 0xD0CF, + 0x90A3: 0xC4C7, + 0x90A4: 0xDF94, + 0x90A5: 0xDF95, + 0x90A6: 0xB0EE, + 0x90A7: 0xDF96, + 0x90A8: 0xDF97, + 0x90A9: 0xDF98, + 0x90AA: 0xD0B0, + 0x90AB: 0xDF99, + 0x90AC: 0xDAF9, + 0x90AD: 0xDF9A, + 0x90AE: 0xD3CA, + 0x90AF: 0xBAAA, + 0x90B0: 0xDBA2, + 0x90B1: 0xC7F1, + 0x90B2: 0xDF9B, + 0x90B3: 0xDAFC, + 0x90B4: 0xDAFB, + 0x90B5: 0xC9DB, + 0x90B6: 0xDAFD, + 0x90B7: 0xDF9C, + 0x90B8: 0xDBA1, + 0x90B9: 0xD7DE, + 0x90BA: 0xDAFE, + 0x90BB: 0xC1DA, + 0x90BC: 0xDF9D, + 0x90BD: 0xDF9E, + 0x90BE: 0xDBA5, + 0x90BF: 0xDF9F, + 0x90C0: 0xDFA0, + 0x90C1: 0xD3F4, + 0x90C2: 0xE040, + 0x90C3: 0xE041, + 0x90C4: 0xDBA7, + 0x90C5: 0xDBA4, + 0x90C6: 0xE042, + 0x90C7: 0xDBA8, + 0x90C8: 0xE043, + 0x90C9: 0xE044, + 0x90CA: 0xBDBC, + 0x90CB: 0xE045, + 0x90CC: 0xE046, + 0x90CD: 0xE047, + 0x90CE: 0xC0C9, + 0x90CF: 0xDBA3, + 0x90D0: 0xDBA6, + 0x90D1: 0xD6A3, + 0x90D2: 0xE048, + 0x90D3: 0xDBA9, + 0x90D4: 0xE049, + 0x90D5: 0xE04A, + 0x90D6: 0xE04B, + 0x90D7: 0xDBAD, + 0x90D8: 0xE04C, + 0x90D9: 0xE04D, + 0x90DA: 0xE04E, + 0x90DB: 0xDBAE, + 0x90DC: 0xDBAC, + 0x90DD: 0xBAC2, + 0x90DE: 0xE04F, + 0x90DF: 0xE050, + 0x90E0: 0xE051, + 0x90E1: 0xBFA4, + 0x90E2: 0xDBAB, + 0x90E3: 0xE052, + 0x90E4: 0xE053, + 0x90E5: 0xE054, + 0x90E6: 0xDBAA, + 0x90E7: 0xD4C7, + 0x90E8: 0xB2BF, + 0x90E9: 0xE055, + 0x90EA: 0xE056, + 0x90EB: 0xDBAF, + 0x90EC: 0xE057, + 0x90ED: 0xB9F9, + 0x90EE: 0xE058, + 0x90EF: 0xDBB0, + 0x90F0: 0xE059, + 0x90F1: 0xE05A, + 0x90F2: 0xE05B, + 0x90F3: 0xE05C, + 0x90F4: 0xB3BB, + 0x90F5: 0xE05D, + 0x90F6: 0xE05E, + 0x90F7: 0xE05F, + 0x90F8: 0xB5A6, + 0x90F9: 0xE060, + 0x90FA: 0xE061, + 0x90FB: 0xE062, + 0x90FC: 0xE063, + 0x90FD: 0xB6BC, + 0x90FE: 0xDBB1, + 0x90FF: 0xE064, + 0x9100: 0xE065, + 0x9101: 0xE066, + 0x9102: 0xB6F5, + 0x9103: 0xE067, + 0x9104: 0xDBB2, + 0x9105: 0xE068, + 0x9106: 0xE069, + 0x9107: 0xE06A, + 0x9108: 0xE06B, + 0x9109: 0xE06C, + 0x910A: 0xE06D, + 0x910B: 0xE06E, + 0x910C: 0xE06F, + 0x910D: 0xE070, + 0x910E: 0xE071, + 0x910F: 0xE072, + 0x9110: 0xE073, + 0x9111: 0xE074, + 0x9112: 0xE075, + 0x9113: 0xE076, + 0x9114: 0xE077, + 0x9115: 0xE078, + 0x9116: 0xE079, + 0x9117: 0xE07A, + 0x9118: 0xE07B, + 0x9119: 0xB1C9, + 0x911A: 0xE07C, + 0x911B: 0xE07D, + 0x911C: 0xE07E, + 0x911D: 0xE080, + 0x911E: 0xDBB4, + 0x911F: 0xE081, + 0x9120: 0xE082, + 0x9121: 0xE083, + 0x9122: 0xDBB3, + 0x9123: 0xDBB5, + 0x9124: 0xE084, + 0x9125: 0xE085, + 0x9126: 0xE086, + 0x9127: 0xE087, + 0x9128: 0xE088, + 0x9129: 0xE089, + 0x912A: 0xE08A, + 0x912B: 0xE08B, + 0x912C: 0xE08C, + 0x912D: 0xE08D, + 0x912E: 0xE08E, + 0x912F: 0xDBB7, + 0x9130: 0xE08F, + 0x9131: 0xDBB6, + 0x9132: 0xE090, + 0x9133: 0xE091, + 0x9134: 0xE092, + 0x9135: 0xE093, + 0x9136: 0xE094, + 0x9137: 0xE095, + 0x9138: 0xE096, + 0x9139: 0xDBB8, + 0x913A: 0xE097, + 0x913B: 0xE098, + 0x913C: 0xE099, + 0x913D: 0xE09A, + 0x913E: 0xE09B, + 0x913F: 0xE09C, + 0x9140: 0xE09D, + 0x9141: 0xE09E, + 0x9142: 0xE09F, + 0x9143: 0xDBB9, + 0x9144: 0xE0A0, + 0x9145: 0xE140, + 0x9146: 0xDBBA, + 0x9147: 0xE141, + 0x9148: 0xE142, + 0x9149: 0xD3CF, + 0x914A: 0xF4FA, + 0x914B: 0xC7F5, + 0x914C: 0xD7C3, + 0x914D: 0xC5E4, + 0x914E: 0xF4FC, + 0x914F: 0xF4FD, + 0x9150: 0xF4FB, + 0x9151: 0xE143, + 0x9152: 0xBEC6, + 0x9153: 0xE144, + 0x9154: 0xE145, + 0x9155: 0xE146, + 0x9156: 0xE147, + 0x9157: 0xD0EF, + 0x9158: 0xE148, + 0x9159: 0xE149, + 0x915A: 0xB7D3, + 0x915B: 0xE14A, + 0x915C: 0xE14B, + 0x915D: 0xD4CD, + 0x915E: 0xCCAA, + 0x915F: 0xE14C, + 0x9160: 0xE14D, + 0x9161: 0xF5A2, + 0x9162: 0xF5A1, + 0x9163: 0xBAA8, + 0x9164: 0xF4FE, + 0x9165: 0xCBD6, + 0x9166: 0xE14E, + 0x9167: 0xE14F, + 0x9168: 0xE150, + 0x9169: 0xF5A4, + 0x916A: 0xC0D2, + 0x916B: 0xE151, + 0x916C: 0xB3EA, + 0x916D: 0xE152, + 0x916E: 0xCDAA, + 0x916F: 0xF5A5, + 0x9170: 0xF5A3, + 0x9171: 0xBDB4, + 0x9172: 0xF5A8, + 0x9173: 0xE153, + 0x9174: 0xF5A9, + 0x9175: 0xBDCD, + 0x9176: 0xC3B8, + 0x9177: 0xBFE1, + 0x9178: 0xCBE1, + 0x9179: 0xF5AA, + 0x917A: 0xE154, + 0x917B: 0xE155, + 0x917C: 0xE156, + 0x917D: 0xF5A6, + 0x917E: 0xF5A7, + 0x917F: 0xC4F0, + 0x9180: 0xE157, + 0x9181: 0xE158, + 0x9182: 0xE159, + 0x9183: 0xE15A, + 0x9184: 0xE15B, + 0x9185: 0xF5AC, + 0x9186: 0xE15C, + 0x9187: 0xB4BC, + 0x9188: 0xE15D, + 0x9189: 0xD7ED, + 0x918A: 0xE15E, + 0x918B: 0xB4D7, + 0x918C: 0xF5AB, + 0x918D: 0xF5AE, + 0x918E: 0xE15F, + 0x918F: 0xE160, + 0x9190: 0xF5AD, + 0x9191: 0xF5AF, + 0x9192: 0xD0D1, + 0x9193: 0xE161, + 0x9194: 0xE162, + 0x9195: 0xE163, + 0x9196: 0xE164, + 0x9197: 0xE165, + 0x9198: 0xE166, + 0x9199: 0xE167, + 0x919A: 0xC3D1, + 0x919B: 0xC8A9, + 0x919C: 0xE168, + 0x919D: 0xE169, + 0x919E: 0xE16A, + 0x919F: 0xE16B, + 0x91A0: 0xE16C, + 0x91A1: 0xE16D, + 0x91A2: 0xF5B0, + 0x91A3: 0xF5B1, + 0x91A4: 0xE16E, + 0x91A5: 0xE16F, + 0x91A6: 0xE170, + 0x91A7: 0xE171, + 0x91A8: 0xE172, + 0x91A9: 0xE173, + 0x91AA: 0xF5B2, + 0x91AB: 0xE174, + 0x91AC: 0xE175, + 0x91AD: 0xF5B3, + 0x91AE: 0xF5B4, + 0x91AF: 0xF5B5, + 0x91B0: 0xE176, + 0x91B1: 0xE177, + 0x91B2: 0xE178, + 0x91B3: 0xE179, + 0x91B4: 0xF5B7, + 0x91B5: 0xF5B6, + 0x91B6: 0xE17A, + 0x91B7: 0xE17B, + 0x91B8: 0xE17C, + 0x91B9: 0xE17D, + 0x91BA: 0xF5B8, + 0x91BB: 0xE17E, + 0x91BC: 0xE180, + 0x91BD: 0xE181, + 0x91BE: 0xE182, + 0x91BF: 0xE183, + 0x91C0: 0xE184, + 0x91C1: 0xE185, + 0x91C2: 0xE186, + 0x91C3: 0xE187, + 0x91C4: 0xE188, + 0x91C5: 0xE189, + 0x91C6: 0xE18A, + 0x91C7: 0xB2C9, + 0x91C8: 0xE18B, + 0x91C9: 0xD3D4, + 0x91CA: 0xCACD, + 0x91CB: 0xE18C, + 0x91CC: 0xC0EF, + 0x91CD: 0xD6D8, + 0x91CE: 0xD2B0, + 0x91CF: 0xC1BF, + 0x91D0: 0xE18D, + 0x91D1: 0xBDF0, + 0x91D2: 0xE18E, + 0x91D3: 0xE18F, + 0x91D4: 0xE190, + 0x91D5: 0xE191, + 0x91D6: 0xE192, + 0x91D7: 0xE193, + 0x91D8: 0xE194, + 0x91D9: 0xE195, + 0x91DA: 0xE196, + 0x91DB: 0xE197, + 0x91DC: 0xB8AA, + 0x91DD: 0xE198, + 0x91DE: 0xE199, + 0x91DF: 0xE19A, + 0x91E0: 0xE19B, + 0x91E1: 0xE19C, + 0x91E2: 0xE19D, + 0x91E3: 0xE19E, + 0x91E4: 0xE19F, + 0x91E5: 0xE1A0, + 0x91E6: 0xE240, + 0x91E7: 0xE241, + 0x91E8: 0xE242, + 0x91E9: 0xE243, + 0x91EA: 0xE244, + 0x91EB: 0xE245, + 0x91EC: 0xE246, + 0x91ED: 0xE247, + 0x91EE: 0xE248, + 0x91EF: 0xE249, + 0x91F0: 0xE24A, + 0x91F1: 0xE24B, + 0x91F2: 0xE24C, + 0x91F3: 0xE24D, + 0x91F4: 0xE24E, + 0x91F5: 0xE24F, + 0x91F6: 0xE250, + 0x91F7: 0xE251, + 0x91F8: 0xE252, + 0x91F9: 0xE253, + 0x91FA: 0xE254, + 0x91FB: 0xE255, + 0x91FC: 0xE256, + 0x91FD: 0xE257, + 0x91FE: 0xE258, + 0x91FF: 0xE259, + 0x9200: 0xE25A, + 0x9201: 0xE25B, + 0x9202: 0xE25C, + 0x9203: 0xE25D, + 0x9204: 0xE25E, + 0x9205: 0xE25F, + 0x9206: 0xE260, + 0x9207: 0xE261, + 0x9208: 0xE262, + 0x9209: 0xE263, + 0x920A: 0xE264, + 0x920B: 0xE265, + 0x920C: 0xE266, + 0x920D: 0xE267, + 0x920E: 0xE268, + 0x920F: 0xE269, + 0x9210: 0xE26A, + 0x9211: 0xE26B, + 0x9212: 0xE26C, + 0x9213: 0xE26D, + 0x9214: 0xE26E, + 0x9215: 0xE26F, + 0x9216: 0xE270, + 0x9217: 0xE271, + 0x9218: 0xE272, + 0x9219: 0xE273, + 0x921A: 0xE274, + 0x921B: 0xE275, + 0x921C: 0xE276, + 0x921D: 0xE277, + 0x921E: 0xE278, + 0x921F: 0xE279, + 0x9220: 0xE27A, + 0x9221: 0xE27B, + 0x9222: 0xE27C, + 0x9223: 0xE27D, + 0x9224: 0xE27E, + 0x9225: 0xE280, + 0x9226: 0xE281, + 0x9227: 0xE282, + 0x9228: 0xE283, + 0x9229: 0xE284, + 0x922A: 0xE285, + 0x922B: 0xE286, + 0x922C: 0xE287, + 0x922D: 0xE288, + 0x922E: 0xE289, + 0x922F: 0xE28A, + 0x9230: 0xE28B, + 0x9231: 0xE28C, + 0x9232: 0xE28D, + 0x9233: 0xE28E, + 0x9234: 0xE28F, + 0x9235: 0xE290, + 0x9236: 0xE291, + 0x9237: 0xE292, + 0x9238: 0xE293, + 0x9239: 0xE294, + 0x923A: 0xE295, + 0x923B: 0xE296, + 0x923C: 0xE297, + 0x923D: 0xE298, + 0x923E: 0xE299, + 0x923F: 0xE29A, + 0x9240: 0xE29B, + 0x9241: 0xE29C, + 0x9242: 0xE29D, + 0x9243: 0xE29E, + 0x9244: 0xE29F, + 0x9245: 0xE2A0, + 0x9246: 0xE340, + 0x9247: 0xE341, + 0x9248: 0xE342, + 0x9249: 0xE343, + 0x924A: 0xE344, + 0x924B: 0xE345, + 0x924C: 0xE346, + 0x924D: 0xE347, + 0x924E: 0xE348, + 0x924F: 0xE349, + 0x9250: 0xE34A, + 0x9251: 0xE34B, + 0x9252: 0xE34C, + 0x9253: 0xE34D, + 0x9254: 0xE34E, + 0x9255: 0xE34F, + 0x9256: 0xE350, + 0x9257: 0xE351, + 0x9258: 0xE352, + 0x9259: 0xE353, + 0x925A: 0xE354, + 0x925B: 0xE355, + 0x925C: 0xE356, + 0x925D: 0xE357, + 0x925E: 0xE358, + 0x925F: 0xE359, + 0x9260: 0xE35A, + 0x9261: 0xE35B, + 0x9262: 0xE35C, + 0x9263: 0xE35D, + 0x9264: 0xE35E, + 0x9265: 0xE35F, + 0x9266: 0xE360, + 0x9267: 0xE361, + 0x9268: 0xE362, + 0x9269: 0xE363, + 0x926A: 0xE364, + 0x926B: 0xE365, + 0x926C: 0xE366, + 0x926D: 0xE367, + 0x926E: 0xE368, + 0x926F: 0xE369, + 0x9270: 0xE36A, + 0x9271: 0xE36B, + 0x9272: 0xE36C, + 0x9273: 0xE36D, + 0x9274: 0xBCF8, + 0x9275: 0xE36E, + 0x9276: 0xE36F, + 0x9277: 0xE370, + 0x9278: 0xE371, + 0x9279: 0xE372, + 0x927A: 0xE373, + 0x927B: 0xE374, + 0x927C: 0xE375, + 0x927D: 0xE376, + 0x927E: 0xE377, + 0x927F: 0xE378, + 0x9280: 0xE379, + 0x9281: 0xE37A, + 0x9282: 0xE37B, + 0x9283: 0xE37C, + 0x9284: 0xE37D, + 0x9285: 0xE37E, + 0x9286: 0xE380, + 0x9287: 0xE381, + 0x9288: 0xE382, + 0x9289: 0xE383, + 0x928A: 0xE384, + 0x928B: 0xE385, + 0x928C: 0xE386, + 0x928D: 0xE387, + 0x928E: 0xF6C6, + 0x928F: 0xE388, + 0x9290: 0xE389, + 0x9291: 0xE38A, + 0x9292: 0xE38B, + 0x9293: 0xE38C, + 0x9294: 0xE38D, + 0x9295: 0xE38E, + 0x9296: 0xE38F, + 0x9297: 0xE390, + 0x9298: 0xE391, + 0x9299: 0xE392, + 0x929A: 0xE393, + 0x929B: 0xE394, + 0x929C: 0xE395, + 0x929D: 0xE396, + 0x929E: 0xE397, + 0x929F: 0xE398, + 0x92A0: 0xE399, + 0x92A1: 0xE39A, + 0x92A2: 0xE39B, + 0x92A3: 0xE39C, + 0x92A4: 0xE39D, + 0x92A5: 0xE39E, + 0x92A6: 0xE39F, + 0x92A7: 0xE3A0, + 0x92A8: 0xE440, + 0x92A9: 0xE441, + 0x92AA: 0xE442, + 0x92AB: 0xE443, + 0x92AC: 0xE444, + 0x92AD: 0xE445, + 0x92AE: 0xF6C7, + 0x92AF: 0xE446, + 0x92B0: 0xE447, + 0x92B1: 0xE448, + 0x92B2: 0xE449, + 0x92B3: 0xE44A, + 0x92B4: 0xE44B, + 0x92B5: 0xE44C, + 0x92B6: 0xE44D, + 0x92B7: 0xE44E, + 0x92B8: 0xE44F, + 0x92B9: 0xE450, + 0x92BA: 0xE451, + 0x92BB: 0xE452, + 0x92BC: 0xE453, + 0x92BD: 0xE454, + 0x92BE: 0xE455, + 0x92BF: 0xE456, + 0x92C0: 0xE457, + 0x92C1: 0xE458, + 0x92C2: 0xE459, + 0x92C3: 0xE45A, + 0x92C4: 0xE45B, + 0x92C5: 0xE45C, + 0x92C6: 0xE45D, + 0x92C7: 0xE45E, + 0x92C8: 0xF6C8, + 0x92C9: 0xE45F, + 0x92CA: 0xE460, + 0x92CB: 0xE461, + 0x92CC: 0xE462, + 0x92CD: 0xE463, + 0x92CE: 0xE464, + 0x92CF: 0xE465, + 0x92D0: 0xE466, + 0x92D1: 0xE467, + 0x92D2: 0xE468, + 0x92D3: 0xE469, + 0x92D4: 0xE46A, + 0x92D5: 0xE46B, + 0x92D6: 0xE46C, + 0x92D7: 0xE46D, + 0x92D8: 0xE46E, + 0x92D9: 0xE46F, + 0x92DA: 0xE470, + 0x92DB: 0xE471, + 0x92DC: 0xE472, + 0x92DD: 0xE473, + 0x92DE: 0xE474, + 0x92DF: 0xE475, + 0x92E0: 0xE476, + 0x92E1: 0xE477, + 0x92E2: 0xE478, + 0x92E3: 0xE479, + 0x92E4: 0xE47A, + 0x92E5: 0xE47B, + 0x92E6: 0xE47C, + 0x92E7: 0xE47D, + 0x92E8: 0xE47E, + 0x92E9: 0xE480, + 0x92EA: 0xE481, + 0x92EB: 0xE482, + 0x92EC: 0xE483, + 0x92ED: 0xE484, + 0x92EE: 0xE485, + 0x92EF: 0xE486, + 0x92F0: 0xE487, + 0x92F1: 0xE488, + 0x92F2: 0xE489, + 0x92F3: 0xE48A, + 0x92F4: 0xE48B, + 0x92F5: 0xE48C, + 0x92F6: 0xE48D, + 0x92F7: 0xE48E, + 0x92F8: 0xE48F, + 0x92F9: 0xE490, + 0x92FA: 0xE491, + 0x92FB: 0xE492, + 0x92FC: 0xE493, + 0x92FD: 0xE494, + 0x92FE: 0xE495, + 0x92FF: 0xE496, + 0x9300: 0xE497, + 0x9301: 0xE498, + 0x9302: 0xE499, + 0x9303: 0xE49A, + 0x9304: 0xE49B, + 0x9305: 0xE49C, + 0x9306: 0xE49D, + 0x9307: 0xE49E, + 0x9308: 0xE49F, + 0x9309: 0xE4A0, + 0x930A: 0xE540, + 0x930B: 0xE541, + 0x930C: 0xE542, + 0x930D: 0xE543, + 0x930E: 0xE544, + 0x930F: 0xE545, + 0x9310: 0xE546, + 0x9311: 0xE547, + 0x9312: 0xE548, + 0x9313: 0xE549, + 0x9314: 0xE54A, + 0x9315: 0xE54B, + 0x9316: 0xE54C, + 0x9317: 0xE54D, + 0x9318: 0xE54E, + 0x9319: 0xE54F, + 0x931A: 0xE550, + 0x931B: 0xE551, + 0x931C: 0xE552, + 0x931D: 0xE553, + 0x931E: 0xE554, + 0x931F: 0xE555, + 0x9320: 0xE556, + 0x9321: 0xE557, + 0x9322: 0xE558, + 0x9323: 0xE559, + 0x9324: 0xE55A, + 0x9325: 0xE55B, + 0x9326: 0xE55C, + 0x9327: 0xE55D, + 0x9328: 0xE55E, + 0x9329: 0xE55F, + 0x932A: 0xE560, + 0x932B: 0xE561, + 0x932C: 0xE562, + 0x932D: 0xE563, + 0x932E: 0xE564, + 0x932F: 0xE565, + 0x9330: 0xE566, + 0x9331: 0xE567, + 0x9332: 0xE568, + 0x9333: 0xE569, + 0x9334: 0xE56A, + 0x9335: 0xE56B, + 0x9336: 0xE56C, + 0x9337: 0xE56D, + 0x9338: 0xE56E, + 0x9339: 0xE56F, + 0x933A: 0xE570, + 0x933B: 0xE571, + 0x933C: 0xE572, + 0x933D: 0xE573, + 0x933E: 0xF6C9, + 0x933F: 0xE574, + 0x9340: 0xE575, + 0x9341: 0xE576, + 0x9342: 0xE577, + 0x9343: 0xE578, + 0x9344: 0xE579, + 0x9345: 0xE57A, + 0x9346: 0xE57B, + 0x9347: 0xE57C, + 0x9348: 0xE57D, + 0x9349: 0xE57E, + 0x934A: 0xE580, + 0x934B: 0xE581, + 0x934C: 0xE582, + 0x934D: 0xE583, + 0x934E: 0xE584, + 0x934F: 0xE585, + 0x9350: 0xE586, + 0x9351: 0xE587, + 0x9352: 0xE588, + 0x9353: 0xE589, + 0x9354: 0xE58A, + 0x9355: 0xE58B, + 0x9356: 0xE58C, + 0x9357: 0xE58D, + 0x9358: 0xE58E, + 0x9359: 0xE58F, + 0x935A: 0xE590, + 0x935B: 0xE591, + 0x935C: 0xE592, + 0x935D: 0xE593, + 0x935E: 0xE594, + 0x935F: 0xE595, + 0x9360: 0xE596, + 0x9361: 0xE597, + 0x9362: 0xE598, + 0x9363: 0xE599, + 0x9364: 0xE59A, + 0x9365: 0xE59B, + 0x9366: 0xE59C, + 0x9367: 0xE59D, + 0x9368: 0xE59E, + 0x9369: 0xE59F, + 0x936A: 0xF6CA, + 0x936B: 0xE5A0, + 0x936C: 0xE640, + 0x936D: 0xE641, + 0x936E: 0xE642, + 0x936F: 0xE643, + 0x9370: 0xE644, + 0x9371: 0xE645, + 0x9372: 0xE646, + 0x9373: 0xE647, + 0x9374: 0xE648, + 0x9375: 0xE649, + 0x9376: 0xE64A, + 0x9377: 0xE64B, + 0x9378: 0xE64C, + 0x9379: 0xE64D, + 0x937A: 0xE64E, + 0x937B: 0xE64F, + 0x937C: 0xE650, + 0x937D: 0xE651, + 0x937E: 0xE652, + 0x937F: 0xE653, + 0x9380: 0xE654, + 0x9381: 0xE655, + 0x9382: 0xE656, + 0x9383: 0xE657, + 0x9384: 0xE658, + 0x9385: 0xE659, + 0x9386: 0xE65A, + 0x9387: 0xE65B, + 0x9388: 0xE65C, + 0x9389: 0xE65D, + 0x938A: 0xE65E, + 0x938B: 0xE65F, + 0x938C: 0xE660, + 0x938D: 0xE661, + 0x938E: 0xE662, + 0x938F: 0xF6CC, + 0x9390: 0xE663, + 0x9391: 0xE664, + 0x9392: 0xE665, + 0x9393: 0xE666, + 0x9394: 0xE667, + 0x9395: 0xE668, + 0x9396: 0xE669, + 0x9397: 0xE66A, + 0x9398: 0xE66B, + 0x9399: 0xE66C, + 0x939A: 0xE66D, + 0x939B: 0xE66E, + 0x939C: 0xE66F, + 0x939D: 0xE670, + 0x939E: 0xE671, + 0x939F: 0xE672, + 0x93A0: 0xE673, + 0x93A1: 0xE674, + 0x93A2: 0xE675, + 0x93A3: 0xE676, + 0x93A4: 0xE677, + 0x93A5: 0xE678, + 0x93A6: 0xE679, + 0x93A7: 0xE67A, + 0x93A8: 0xE67B, + 0x93A9: 0xE67C, + 0x93AA: 0xE67D, + 0x93AB: 0xE67E, + 0x93AC: 0xE680, + 0x93AD: 0xE681, + 0x93AE: 0xE682, + 0x93AF: 0xE683, + 0x93B0: 0xE684, + 0x93B1: 0xE685, + 0x93B2: 0xE686, + 0x93B3: 0xE687, + 0x93B4: 0xE688, + 0x93B5: 0xE689, + 0x93B6: 0xE68A, + 0x93B7: 0xE68B, + 0x93B8: 0xE68C, + 0x93B9: 0xE68D, + 0x93BA: 0xE68E, + 0x93BB: 0xE68F, + 0x93BC: 0xE690, + 0x93BD: 0xE691, + 0x93BE: 0xE692, + 0x93BF: 0xE693, + 0x93C0: 0xE694, + 0x93C1: 0xE695, + 0x93C2: 0xE696, + 0x93C3: 0xE697, + 0x93C4: 0xE698, + 0x93C5: 0xE699, + 0x93C6: 0xE69A, + 0x93C7: 0xE69B, + 0x93C8: 0xE69C, + 0x93C9: 0xE69D, + 0x93CA: 0xF6CB, + 0x93CB: 0xE69E, + 0x93CC: 0xE69F, + 0x93CD: 0xE6A0, + 0x93CE: 0xE740, + 0x93CF: 0xE741, + 0x93D0: 0xE742, + 0x93D1: 0xE743, + 0x93D2: 0xE744, + 0x93D3: 0xE745, + 0x93D4: 0xE746, + 0x93D5: 0xE747, + 0x93D6: 0xF7E9, + 0x93D7: 0xE748, + 0x93D8: 0xE749, + 0x93D9: 0xE74A, + 0x93DA: 0xE74B, + 0x93DB: 0xE74C, + 0x93DC: 0xE74D, + 0x93DD: 0xE74E, + 0x93DE: 0xE74F, + 0x93DF: 0xE750, + 0x93E0: 0xE751, + 0x93E1: 0xE752, + 0x93E2: 0xE753, + 0x93E3: 0xE754, + 0x93E4: 0xE755, + 0x93E5: 0xE756, + 0x93E6: 0xE757, + 0x93E7: 0xE758, + 0x93E8: 0xE759, + 0x93E9: 0xE75A, + 0x93EA: 0xE75B, + 0x93EB: 0xE75C, + 0x93EC: 0xE75D, + 0x93ED: 0xE75E, + 0x93EE: 0xE75F, + 0x93EF: 0xE760, + 0x93F0: 0xE761, + 0x93F1: 0xE762, + 0x93F2: 0xE763, + 0x93F3: 0xE764, + 0x93F4: 0xE765, + 0x93F5: 0xE766, + 0x93F6: 0xE767, + 0x93F7: 0xE768, + 0x93F8: 0xE769, + 0x93F9: 0xE76A, + 0x93FA: 0xE76B, + 0x93FB: 0xE76C, + 0x93FC: 0xE76D, + 0x93FD: 0xE76E, + 0x93FE: 0xE76F, + 0x93FF: 0xE770, + 0x9400: 0xE771, + 0x9401: 0xE772, + 0x9402: 0xE773, + 0x9403: 0xE774, + 0x9404: 0xE775, + 0x9405: 0xE776, + 0x9406: 0xE777, + 0x9407: 0xE778, + 0x9408: 0xE779, + 0x9409: 0xE77A, + 0x940A: 0xE77B, + 0x940B: 0xE77C, + 0x940C: 0xE77D, + 0x940D: 0xE77E, + 0x940E: 0xE780, + 0x940F: 0xE781, + 0x9410: 0xE782, + 0x9411: 0xE783, + 0x9412: 0xE784, + 0x9413: 0xE785, + 0x9414: 0xE786, + 0x9415: 0xE787, + 0x9416: 0xE788, + 0x9417: 0xE789, + 0x9418: 0xE78A, + 0x9419: 0xE78B, + 0x941A: 0xE78C, + 0x941B: 0xE78D, + 0x941C: 0xE78E, + 0x941D: 0xE78F, + 0x941E: 0xE790, + 0x941F: 0xE791, + 0x9420: 0xE792, + 0x9421: 0xE793, + 0x9422: 0xE794, + 0x9423: 0xE795, + 0x9424: 0xE796, + 0x9425: 0xE797, + 0x9426: 0xE798, + 0x9427: 0xE799, + 0x9428: 0xE79A, + 0x9429: 0xE79B, + 0x942A: 0xE79C, + 0x942B: 0xE79D, + 0x942C: 0xE79E, + 0x942D: 0xE79F, + 0x942E: 0xE7A0, + 0x942F: 0xE840, + 0x9430: 0xE841, + 0x9431: 0xE842, + 0x9432: 0xE843, + 0x9433: 0xE844, + 0x9434: 0xE845, + 0x9435: 0xE846, + 0x9436: 0xE847, + 0x9437: 0xE848, + 0x9438: 0xE849, + 0x9439: 0xE84A, + 0x943A: 0xE84B, + 0x943B: 0xE84C, + 0x943C: 0xE84D, + 0x943D: 0xE84E, + 0x943E: 0xF6CD, + 0x943F: 0xE84F, + 0x9440: 0xE850, + 0x9441: 0xE851, + 0x9442: 0xE852, + 0x9443: 0xE853, + 0x9444: 0xE854, + 0x9445: 0xE855, + 0x9446: 0xE856, + 0x9447: 0xE857, + 0x9448: 0xE858, + 0x9449: 0xE859, + 0x944A: 0xE85A, + 0x944B: 0xE85B, + 0x944C: 0xE85C, + 0x944D: 0xE85D, + 0x944E: 0xE85E, + 0x944F: 0xE85F, + 0x9450: 0xE860, + 0x9451: 0xE861, + 0x9452: 0xE862, + 0x9453: 0xE863, + 0x9454: 0xE864, + 0x9455: 0xE865, + 0x9456: 0xE866, + 0x9457: 0xE867, + 0x9458: 0xE868, + 0x9459: 0xE869, + 0x945A: 0xE86A, + 0x945B: 0xE86B, + 0x945C: 0xE86C, + 0x945D: 0xE86D, + 0x945E: 0xE86E, + 0x945F: 0xE86F, + 0x9460: 0xE870, + 0x9461: 0xE871, + 0x9462: 0xE872, + 0x9463: 0xE873, + 0x9464: 0xE874, + 0x9465: 0xE875, + 0x9466: 0xE876, + 0x9467: 0xE877, + 0x9468: 0xE878, + 0x9469: 0xE879, + 0x946A: 0xE87A, + 0x946B: 0xF6CE, + 0x946C: 0xE87B, + 0x946D: 0xE87C, + 0x946E: 0xE87D, + 0x946F: 0xE87E, + 0x9470: 0xE880, + 0x9471: 0xE881, + 0x9472: 0xE882, + 0x9473: 0xE883, + 0x9474: 0xE884, + 0x9475: 0xE885, + 0x9476: 0xE886, + 0x9477: 0xE887, + 0x9478: 0xE888, + 0x9479: 0xE889, + 0x947A: 0xE88A, + 0x947B: 0xE88B, + 0x947C: 0xE88C, + 0x947D: 0xE88D, + 0x947E: 0xE88E, + 0x947F: 0xE88F, + 0x9480: 0xE890, + 0x9481: 0xE891, + 0x9482: 0xE892, + 0x9483: 0xE893, + 0x9484: 0xE894, + 0x9485: 0xEEC4, + 0x9486: 0xEEC5, + 0x9487: 0xEEC6, + 0x9488: 0xD5EB, + 0x9489: 0xB6A4, + 0x948A: 0xEEC8, + 0x948B: 0xEEC7, + 0x948C: 0xEEC9, + 0x948D: 0xEECA, + 0x948E: 0xC7A5, + 0x948F: 0xEECB, + 0x9490: 0xEECC, + 0x9491: 0xE895, + 0x9492: 0xB7B0, + 0x9493: 0xB5F6, + 0x9494: 0xEECD, + 0x9495: 0xEECF, + 0x9496: 0xE896, + 0x9497: 0xEECE, + 0x9498: 0xE897, + 0x9499: 0xB8C6, + 0x949A: 0xEED0, + 0x949B: 0xEED1, + 0x949C: 0xEED2, + 0x949D: 0xB6DB, + 0x949E: 0xB3AE, + 0x949F: 0xD6D3, + 0x94A0: 0xC4C6, + 0x94A1: 0xB1B5, + 0x94A2: 0xB8D6, + 0x94A3: 0xEED3, + 0x94A4: 0xEED4, + 0x94A5: 0xD4BF, + 0x94A6: 0xC7D5, + 0x94A7: 0xBEFB, + 0x94A8: 0xCED9, + 0x94A9: 0xB9B3, + 0x94AA: 0xEED6, + 0x94AB: 0xEED5, + 0x94AC: 0xEED8, + 0x94AD: 0xEED7, + 0x94AE: 0xC5A5, + 0x94AF: 0xEED9, + 0x94B0: 0xEEDA, + 0x94B1: 0xC7AE, + 0x94B2: 0xEEDB, + 0x94B3: 0xC7AF, + 0x94B4: 0xEEDC, + 0x94B5: 0xB2A7, + 0x94B6: 0xEEDD, + 0x94B7: 0xEEDE, + 0x94B8: 0xEEDF, + 0x94B9: 0xEEE0, + 0x94BA: 0xEEE1, + 0x94BB: 0xD7EA, + 0x94BC: 0xEEE2, + 0x94BD: 0xEEE3, + 0x94BE: 0xBCD8, + 0x94BF: 0xEEE4, + 0x94C0: 0xD3CB, + 0x94C1: 0xCCFA, + 0x94C2: 0xB2AC, + 0x94C3: 0xC1E5, + 0x94C4: 0xEEE5, + 0x94C5: 0xC7A6, + 0x94C6: 0xC3AD, + 0x94C7: 0xE898, + 0x94C8: 0xEEE6, + 0x94C9: 0xEEE7, + 0x94CA: 0xEEE8, + 0x94CB: 0xEEE9, + 0x94CC: 0xEEEA, + 0x94CD: 0xEEEB, + 0x94CE: 0xEEEC, + 0x94CF: 0xE899, + 0x94D0: 0xEEED, + 0x94D1: 0xEEEE, + 0x94D2: 0xEEEF, + 0x94D3: 0xE89A, + 0x94D4: 0xE89B, + 0x94D5: 0xEEF0, + 0x94D6: 0xEEF1, + 0x94D7: 0xEEF2, + 0x94D8: 0xEEF4, + 0x94D9: 0xEEF3, + 0x94DA: 0xE89C, + 0x94DB: 0xEEF5, + 0x94DC: 0xCDAD, + 0x94DD: 0xC2C1, + 0x94DE: 0xEEF6, + 0x94DF: 0xEEF7, + 0x94E0: 0xEEF8, + 0x94E1: 0xD5A1, + 0x94E2: 0xEEF9, + 0x94E3: 0xCFB3, + 0x94E4: 0xEEFA, + 0x94E5: 0xEEFB, + 0x94E6: 0xE89D, + 0x94E7: 0xEEFC, + 0x94E8: 0xEEFD, + 0x94E9: 0xEFA1, + 0x94EA: 0xEEFE, + 0x94EB: 0xEFA2, + 0x94EC: 0xB8F5, + 0x94ED: 0xC3FA, + 0x94EE: 0xEFA3, + 0x94EF: 0xEFA4, + 0x94F0: 0xBDC2, + 0x94F1: 0xD2BF, + 0x94F2: 0xB2F9, + 0x94F3: 0xEFA5, + 0x94F4: 0xEFA6, + 0x94F5: 0xEFA7, + 0x94F6: 0xD2F8, + 0x94F7: 0xEFA8, + 0x94F8: 0xD6FD, + 0x94F9: 0xEFA9, + 0x94FA: 0xC6CC, + 0x94FB: 0xE89E, + 0x94FC: 0xEFAA, + 0x94FD: 0xEFAB, + 0x94FE: 0xC1B4, + 0x94FF: 0xEFAC, + 0x9500: 0xCFFA, + 0x9501: 0xCBF8, + 0x9502: 0xEFAE, + 0x9503: 0xEFAD, + 0x9504: 0xB3FA, + 0x9505: 0xB9F8, + 0x9506: 0xEFAF, + 0x9507: 0xEFB0, + 0x9508: 0xD0E2, + 0x9509: 0xEFB1, + 0x950A: 0xEFB2, + 0x950B: 0xB7E6, + 0x950C: 0xD0BF, + 0x950D: 0xEFB3, + 0x950E: 0xEFB4, + 0x950F: 0xEFB5, + 0x9510: 0xC8F1, + 0x9511: 0xCCE0, + 0x9512: 0xEFB6, + 0x9513: 0xEFB7, + 0x9514: 0xEFB8, + 0x9515: 0xEFB9, + 0x9516: 0xEFBA, + 0x9517: 0xD5E0, + 0x9518: 0xEFBB, + 0x9519: 0xB4ED, + 0x951A: 0xC3AA, + 0x951B: 0xEFBC, + 0x951C: 0xE89F, + 0x951D: 0xEFBD, + 0x951E: 0xEFBE, + 0x951F: 0xEFBF, + 0x9520: 0xE8A0, + 0x9521: 0xCEFD, + 0x9522: 0xEFC0, + 0x9523: 0xC2E0, + 0x9524: 0xB4B8, + 0x9525: 0xD7B6, + 0x9526: 0xBDF5, + 0x9527: 0xE940, + 0x9528: 0xCFC7, + 0x9529: 0xEFC3, + 0x952A: 0xEFC1, + 0x952B: 0xEFC2, + 0x952C: 0xEFC4, + 0x952D: 0xB6A7, + 0x952E: 0xBCFC, + 0x952F: 0xBEE2, + 0x9530: 0xC3CC, + 0x9531: 0xEFC5, + 0x9532: 0xEFC6, + 0x9533: 0xE941, + 0x9534: 0xEFC7, + 0x9535: 0xEFCF, + 0x9536: 0xEFC8, + 0x9537: 0xEFC9, + 0x9538: 0xEFCA, + 0x9539: 0xC7C2, + 0x953A: 0xEFF1, + 0x953B: 0xB6CD, + 0x953C: 0xEFCB, + 0x953D: 0xE942, + 0x953E: 0xEFCC, + 0x953F: 0xEFCD, + 0x9540: 0xB6C6, + 0x9541: 0xC3BE, + 0x9542: 0xEFCE, + 0x9543: 0xE943, + 0x9544: 0xEFD0, + 0x9545: 0xEFD1, + 0x9546: 0xEFD2, + 0x9547: 0xD5F2, + 0x9548: 0xE944, + 0x9549: 0xEFD3, + 0x954A: 0xC4F7, + 0x954B: 0xE945, + 0x954C: 0xEFD4, + 0x954D: 0xC4F8, + 0x954E: 0xEFD5, + 0x954F: 0xEFD6, + 0x9550: 0xB8E4, + 0x9551: 0xB0F7, + 0x9552: 0xEFD7, + 0x9553: 0xEFD8, + 0x9554: 0xEFD9, + 0x9555: 0xE946, + 0x9556: 0xEFDA, + 0x9557: 0xEFDB, + 0x9558: 0xEFDC, + 0x9559: 0xEFDD, + 0x955A: 0xE947, + 0x955B: 0xEFDE, + 0x955C: 0xBEB5, + 0x955D: 0xEFE1, + 0x955E: 0xEFDF, + 0x955F: 0xEFE0, + 0x9560: 0xE948, + 0x9561: 0xEFE2, + 0x9562: 0xEFE3, + 0x9563: 0xC1CD, + 0x9564: 0xEFE4, + 0x9565: 0xEFE5, + 0x9566: 0xEFE6, + 0x9567: 0xEFE7, + 0x9568: 0xEFE8, + 0x9569: 0xEFE9, + 0x956A: 0xEFEA, + 0x956B: 0xEFEB, + 0x956C: 0xEFEC, + 0x956D: 0xC0D8, + 0x956E: 0xE949, + 0x956F: 0xEFED, + 0x9570: 0xC1AD, + 0x9571: 0xEFEE, + 0x9572: 0xEFEF, + 0x9573: 0xEFF0, + 0x9574: 0xE94A, + 0x9575: 0xE94B, + 0x9576: 0xCFE2, + 0x9577: 0xE94C, + 0x9578: 0xE94D, + 0x9579: 0xE94E, + 0x957A: 0xE94F, + 0x957B: 0xE950, + 0x957C: 0xE951, + 0x957D: 0xE952, + 0x957E: 0xE953, + 0x957F: 0xB3A4, + 0x9580: 0xE954, + 0x9581: 0xE955, + 0x9582: 0xE956, + 0x9583: 0xE957, + 0x9584: 0xE958, + 0x9585: 0xE959, + 0x9586: 0xE95A, + 0x9587: 0xE95B, + 0x9588: 0xE95C, + 0x9589: 0xE95D, + 0x958A: 0xE95E, + 0x958B: 0xE95F, + 0x958C: 0xE960, + 0x958D: 0xE961, + 0x958E: 0xE962, + 0x958F: 0xE963, + 0x9590: 0xE964, + 0x9591: 0xE965, + 0x9592: 0xE966, + 0x9593: 0xE967, + 0x9594: 0xE968, + 0x9595: 0xE969, + 0x9596: 0xE96A, + 0x9597: 0xE96B, + 0x9598: 0xE96C, + 0x9599: 0xE96D, + 0x959A: 0xE96E, + 0x959B: 0xE96F, + 0x959C: 0xE970, + 0x959D: 0xE971, + 0x959E: 0xE972, + 0x959F: 0xE973, + 0x95A0: 0xE974, + 0x95A1: 0xE975, + 0x95A2: 0xE976, + 0x95A3: 0xE977, + 0x95A4: 0xE978, + 0x95A5: 0xE979, + 0x95A6: 0xE97A, + 0x95A7: 0xE97B, + 0x95A8: 0xE97C, + 0x95A9: 0xE97D, + 0x95AA: 0xE97E, + 0x95AB: 0xE980, + 0x95AC: 0xE981, + 0x95AD: 0xE982, + 0x95AE: 0xE983, + 0x95AF: 0xE984, + 0x95B0: 0xE985, + 0x95B1: 0xE986, + 0x95B2: 0xE987, + 0x95B3: 0xE988, + 0x95B4: 0xE989, + 0x95B5: 0xE98A, + 0x95B6: 0xE98B, + 0x95B7: 0xE98C, + 0x95B8: 0xE98D, + 0x95B9: 0xE98E, + 0x95BA: 0xE98F, + 0x95BB: 0xE990, + 0x95BC: 0xE991, + 0x95BD: 0xE992, + 0x95BE: 0xE993, + 0x95BF: 0xE994, + 0x95C0: 0xE995, + 0x95C1: 0xE996, + 0x95C2: 0xE997, + 0x95C3: 0xE998, + 0x95C4: 0xE999, + 0x95C5: 0xE99A, + 0x95C6: 0xE99B, + 0x95C7: 0xE99C, + 0x95C8: 0xE99D, + 0x95C9: 0xE99E, + 0x95CA: 0xE99F, + 0x95CB: 0xE9A0, + 0x95CC: 0xEA40, + 0x95CD: 0xEA41, + 0x95CE: 0xEA42, + 0x95CF: 0xEA43, + 0x95D0: 0xEA44, + 0x95D1: 0xEA45, + 0x95D2: 0xEA46, + 0x95D3: 0xEA47, + 0x95D4: 0xEA48, + 0x95D5: 0xEA49, + 0x95D6: 0xEA4A, + 0x95D7: 0xEA4B, + 0x95D8: 0xEA4C, + 0x95D9: 0xEA4D, + 0x95DA: 0xEA4E, + 0x95DB: 0xEA4F, + 0x95DC: 0xEA50, + 0x95DD: 0xEA51, + 0x95DE: 0xEA52, + 0x95DF: 0xEA53, + 0x95E0: 0xEA54, + 0x95E1: 0xEA55, + 0x95E2: 0xEA56, + 0x95E3: 0xEA57, + 0x95E4: 0xEA58, + 0x95E5: 0xEA59, + 0x95E6: 0xEA5A, + 0x95E7: 0xEA5B, + 0x95E8: 0xC3C5, + 0x95E9: 0xE3C5, + 0x95EA: 0xC9C1, + 0x95EB: 0xE3C6, + 0x95EC: 0xEA5C, + 0x95ED: 0xB1D5, + 0x95EE: 0xCECA, + 0x95EF: 0xB4B3, + 0x95F0: 0xC8F2, + 0x95F1: 0xE3C7, + 0x95F2: 0xCFD0, + 0x95F3: 0xE3C8, + 0x95F4: 0xBCE4, + 0x95F5: 0xE3C9, + 0x95F6: 0xE3CA, + 0x95F7: 0xC3C6, + 0x95F8: 0xD5A2, + 0x95F9: 0xC4D6, + 0x95FA: 0xB9EB, + 0x95FB: 0xCEC5, + 0x95FC: 0xE3CB, + 0x95FD: 0xC3F6, + 0x95FE: 0xE3CC, + 0x95FF: 0xEA5D, + 0x9600: 0xB7A7, + 0x9601: 0xB8F3, + 0x9602: 0xBAD2, + 0x9603: 0xE3CD, + 0x9604: 0xE3CE, + 0x9605: 0xD4C4, + 0x9606: 0xE3CF, + 0x9607: 0xEA5E, + 0x9608: 0xE3D0, + 0x9609: 0xD1CB, + 0x960A: 0xE3D1, + 0x960B: 0xE3D2, + 0x960C: 0xE3D3, + 0x960D: 0xE3D4, + 0x960E: 0xD1D6, + 0x960F: 0xE3D5, + 0x9610: 0xB2FB, + 0x9611: 0xC0BB, + 0x9612: 0xE3D6, + 0x9613: 0xEA5F, + 0x9614: 0xC0AB, + 0x9615: 0xE3D7, + 0x9616: 0xE3D8, + 0x9617: 0xE3D9, + 0x9618: 0xEA60, + 0x9619: 0xE3DA, + 0x961A: 0xE3DB, + 0x961B: 0xEA61, + 0x961C: 0xB8B7, + 0x961D: 0xDAE2, + 0x961E: 0xEA62, + 0x961F: 0xB6D3, + 0x9620: 0xEA63, + 0x9621: 0xDAE4, + 0x9622: 0xDAE3, + 0x9623: 0xEA64, + 0x9624: 0xEA65, + 0x9625: 0xEA66, + 0x9626: 0xEA67, + 0x9627: 0xEA68, + 0x9628: 0xEA69, + 0x9629: 0xEA6A, + 0x962A: 0xDAE6, + 0x962B: 0xEA6B, + 0x962C: 0xEA6C, + 0x962D: 0xEA6D, + 0x962E: 0xC8EE, + 0x962F: 0xEA6E, + 0x9630: 0xEA6F, + 0x9631: 0xDAE5, + 0x9632: 0xB7C0, + 0x9633: 0xD1F4, + 0x9634: 0xD2F5, + 0x9635: 0xD5F3, + 0x9636: 0xBDD7, + 0x9637: 0xEA70, + 0x9638: 0xEA71, + 0x9639: 0xEA72, + 0x963A: 0xEA73, + 0x963B: 0xD7E8, + 0x963C: 0xDAE8, + 0x963D: 0xDAE7, + 0x963E: 0xEA74, + 0x963F: 0xB0A2, + 0x9640: 0xCDD3, + 0x9641: 0xEA75, + 0x9642: 0xDAE9, + 0x9643: 0xEA76, + 0x9644: 0xB8BD, + 0x9645: 0xBCCA, + 0x9646: 0xC2BD, + 0x9647: 0xC2A4, + 0x9648: 0xB3C2, + 0x9649: 0xDAEA, + 0x964A: 0xEA77, + 0x964B: 0xC2AA, + 0x964C: 0xC4B0, + 0x964D: 0xBDB5, + 0x964E: 0xEA78, + 0x964F: 0xEA79, + 0x9650: 0xCFDE, + 0x9651: 0xEA7A, + 0x9652: 0xEA7B, + 0x9653: 0xEA7C, + 0x9654: 0xDAEB, + 0x9655: 0xC9C2, + 0x9656: 0xEA7D, + 0x9657: 0xEA7E, + 0x9658: 0xEA80, + 0x9659: 0xEA81, + 0x965A: 0xEA82, + 0x965B: 0xB1DD, + 0x965C: 0xEA83, + 0x965D: 0xEA84, + 0x965E: 0xEA85, + 0x965F: 0xDAEC, + 0x9660: 0xEA86, + 0x9661: 0xB6B8, + 0x9662: 0xD4BA, + 0x9663: 0xEA87, + 0x9664: 0xB3FD, + 0x9665: 0xEA88, + 0x9666: 0xEA89, + 0x9667: 0xDAED, + 0x9668: 0xD4C9, + 0x9669: 0xCFD5, + 0x966A: 0xC5E3, + 0x966B: 0xEA8A, + 0x966C: 0xDAEE, + 0x966D: 0xEA8B, + 0x966E: 0xEA8C, + 0x966F: 0xEA8D, + 0x9670: 0xEA8E, + 0x9671: 0xEA8F, + 0x9672: 0xDAEF, + 0x9673: 0xEA90, + 0x9674: 0xDAF0, + 0x9675: 0xC1EA, + 0x9676: 0xCCD5, + 0x9677: 0xCFDD, + 0x9678: 0xEA91, + 0x9679: 0xEA92, + 0x967A: 0xEA93, + 0x967B: 0xEA94, + 0x967C: 0xEA95, + 0x967D: 0xEA96, + 0x967E: 0xEA97, + 0x967F: 0xEA98, + 0x9680: 0xEA99, + 0x9681: 0xEA9A, + 0x9682: 0xEA9B, + 0x9683: 0xEA9C, + 0x9684: 0xEA9D, + 0x9685: 0xD3E7, + 0x9686: 0xC2A1, + 0x9687: 0xEA9E, + 0x9688: 0xDAF1, + 0x9689: 0xEA9F, + 0x968A: 0xEAA0, + 0x968B: 0xCBE5, + 0x968C: 0xEB40, + 0x968D: 0xDAF2, + 0x968E: 0xEB41, + 0x968F: 0xCBE6, + 0x9690: 0xD2FE, + 0x9691: 0xEB42, + 0x9692: 0xEB43, + 0x9693: 0xEB44, + 0x9694: 0xB8F4, + 0x9695: 0xEB45, + 0x9696: 0xEB46, + 0x9697: 0xDAF3, + 0x9698: 0xB0AF, + 0x9699: 0xCFB6, + 0x969A: 0xEB47, + 0x969B: 0xEB48, + 0x969C: 0xD5CF, + 0x969D: 0xEB49, + 0x969E: 0xEB4A, + 0x969F: 0xEB4B, + 0x96A0: 0xEB4C, + 0x96A1: 0xEB4D, + 0x96A2: 0xEB4E, + 0x96A3: 0xEB4F, + 0x96A4: 0xEB50, + 0x96A5: 0xEB51, + 0x96A6: 0xEB52, + 0x96A7: 0xCBED, + 0x96A8: 0xEB53, + 0x96A9: 0xEB54, + 0x96AA: 0xEB55, + 0x96AB: 0xEB56, + 0x96AC: 0xEB57, + 0x96AD: 0xEB58, + 0x96AE: 0xEB59, + 0x96AF: 0xEB5A, + 0x96B0: 0xDAF4, + 0x96B1: 0xEB5B, + 0x96B2: 0xEB5C, + 0x96B3: 0xE3C4, + 0x96B4: 0xEB5D, + 0x96B5: 0xEB5E, + 0x96B6: 0xC1A5, + 0x96B7: 0xEB5F, + 0x96B8: 0xEB60, + 0x96B9: 0xF6BF, + 0x96BA: 0xEB61, + 0x96BB: 0xEB62, + 0x96BC: 0xF6C0, + 0x96BD: 0xF6C1, + 0x96BE: 0xC4D1, + 0x96BF: 0xEB63, + 0x96C0: 0xC8B8, + 0x96C1: 0xD1E3, + 0x96C2: 0xEB64, + 0x96C3: 0xEB65, + 0x96C4: 0xD0DB, + 0x96C5: 0xD1C5, + 0x96C6: 0xBCAF, + 0x96C7: 0xB9CD, + 0x96C8: 0xEB66, + 0x96C9: 0xEFF4, + 0x96CA: 0xEB67, + 0x96CB: 0xEB68, + 0x96CC: 0xB4C6, + 0x96CD: 0xD3BA, + 0x96CE: 0xF6C2, + 0x96CF: 0xB3FB, + 0x96D0: 0xEB69, + 0x96D1: 0xEB6A, + 0x96D2: 0xF6C3, + 0x96D3: 0xEB6B, + 0x96D4: 0xEB6C, + 0x96D5: 0xB5F1, + 0x96D6: 0xEB6D, + 0x96D7: 0xEB6E, + 0x96D8: 0xEB6F, + 0x96D9: 0xEB70, + 0x96DA: 0xEB71, + 0x96DB: 0xEB72, + 0x96DC: 0xEB73, + 0x96DD: 0xEB74, + 0x96DE: 0xEB75, + 0x96DF: 0xEB76, + 0x96E0: 0xF6C5, + 0x96E1: 0xEB77, + 0x96E2: 0xEB78, + 0x96E3: 0xEB79, + 0x96E4: 0xEB7A, + 0x96E5: 0xEB7B, + 0x96E6: 0xEB7C, + 0x96E7: 0xEB7D, + 0x96E8: 0xD3EA, + 0x96E9: 0xF6A7, + 0x96EA: 0xD1A9, + 0x96EB: 0xEB7E, + 0x96EC: 0xEB80, + 0x96ED: 0xEB81, + 0x96EE: 0xEB82, + 0x96EF: 0xF6A9, + 0x96F0: 0xEB83, + 0x96F1: 0xEB84, + 0x96F2: 0xEB85, + 0x96F3: 0xF6A8, + 0x96F4: 0xEB86, + 0x96F5: 0xEB87, + 0x96F6: 0xC1E3, + 0x96F7: 0xC0D7, + 0x96F8: 0xEB88, + 0x96F9: 0xB1A2, + 0x96FA: 0xEB89, + 0x96FB: 0xEB8A, + 0x96FC: 0xEB8B, + 0x96FD: 0xEB8C, + 0x96FE: 0xCEED, + 0x96FF: 0xEB8D, + 0x9700: 0xD0E8, + 0x9701: 0xF6AB, + 0x9702: 0xEB8E, + 0x9703: 0xEB8F, + 0x9704: 0xCFF6, + 0x9705: 0xEB90, + 0x9706: 0xF6AA, + 0x9707: 0xD5F0, + 0x9708: 0xF6AC, + 0x9709: 0xC3B9, + 0x970A: 0xEB91, + 0x970B: 0xEB92, + 0x970C: 0xEB93, + 0x970D: 0xBBF4, + 0x970E: 0xF6AE, + 0x970F: 0xF6AD, + 0x9710: 0xEB94, + 0x9711: 0xEB95, + 0x9712: 0xEB96, + 0x9713: 0xC4DE, + 0x9714: 0xEB97, + 0x9715: 0xEB98, + 0x9716: 0xC1D8, + 0x9717: 0xEB99, + 0x9718: 0xEB9A, + 0x9719: 0xEB9B, + 0x971A: 0xEB9C, + 0x971B: 0xEB9D, + 0x971C: 0xCBAA, + 0x971D: 0xEB9E, + 0x971E: 0xCFBC, + 0x971F: 0xEB9F, + 0x9720: 0xEBA0, + 0x9721: 0xEC40, + 0x9722: 0xEC41, + 0x9723: 0xEC42, + 0x9724: 0xEC43, + 0x9725: 0xEC44, + 0x9726: 0xEC45, + 0x9727: 0xEC46, + 0x9728: 0xEC47, + 0x9729: 0xEC48, + 0x972A: 0xF6AF, + 0x972B: 0xEC49, + 0x972C: 0xEC4A, + 0x972D: 0xF6B0, + 0x972E: 0xEC4B, + 0x972F: 0xEC4C, + 0x9730: 0xF6B1, + 0x9731: 0xEC4D, + 0x9732: 0xC2B6, + 0x9733: 0xEC4E, + 0x9734: 0xEC4F, + 0x9735: 0xEC50, + 0x9736: 0xEC51, + 0x9737: 0xEC52, + 0x9738: 0xB0D4, + 0x9739: 0xC5F9, + 0x973A: 0xEC53, + 0x973B: 0xEC54, + 0x973C: 0xEC55, + 0x973D: 0xEC56, + 0x973E: 0xF6B2, + 0x973F: 0xEC57, + 0x9740: 0xEC58, + 0x9741: 0xEC59, + 0x9742: 0xEC5A, + 0x9743: 0xEC5B, + 0x9744: 0xEC5C, + 0x9745: 0xEC5D, + 0x9746: 0xEC5E, + 0x9747: 0xEC5F, + 0x9748: 0xEC60, + 0x9749: 0xEC61, + 0x974A: 0xEC62, + 0x974B: 0xEC63, + 0x974C: 0xEC64, + 0x974D: 0xEC65, + 0x974E: 0xEC66, + 0x974F: 0xEC67, + 0x9750: 0xEC68, + 0x9751: 0xEC69, + 0x9752: 0xC7E0, + 0x9753: 0xF6A6, + 0x9754: 0xEC6A, + 0x9755: 0xEC6B, + 0x9756: 0xBEB8, + 0x9757: 0xEC6C, + 0x9758: 0xEC6D, + 0x9759: 0xBEB2, + 0x975A: 0xEC6E, + 0x975B: 0xB5E5, + 0x975C: 0xEC6F, + 0x975D: 0xEC70, + 0x975E: 0xB7C7, + 0x975F: 0xEC71, + 0x9760: 0xBFBF, + 0x9761: 0xC3D2, + 0x9762: 0xC3E6, + 0x9763: 0xEC72, + 0x9764: 0xEC73, + 0x9765: 0xD8CC, + 0x9766: 0xEC74, + 0x9767: 0xEC75, + 0x9768: 0xEC76, + 0x9769: 0xB8EF, + 0x976A: 0xEC77, + 0x976B: 0xEC78, + 0x976C: 0xEC79, + 0x976D: 0xEC7A, + 0x976E: 0xEC7B, + 0x976F: 0xEC7C, + 0x9770: 0xEC7D, + 0x9771: 0xEC7E, + 0x9772: 0xEC80, + 0x9773: 0xBDF9, + 0x9774: 0xD1A5, + 0x9775: 0xEC81, + 0x9776: 0xB0D0, + 0x9777: 0xEC82, + 0x9778: 0xEC83, + 0x9779: 0xEC84, + 0x977A: 0xEC85, + 0x977B: 0xEC86, + 0x977C: 0xF7B0, + 0x977D: 0xEC87, + 0x977E: 0xEC88, + 0x977F: 0xEC89, + 0x9780: 0xEC8A, + 0x9781: 0xEC8B, + 0x9782: 0xEC8C, + 0x9783: 0xEC8D, + 0x9784: 0xEC8E, + 0x9785: 0xF7B1, + 0x9786: 0xEC8F, + 0x9787: 0xEC90, + 0x9788: 0xEC91, + 0x9789: 0xEC92, + 0x978A: 0xEC93, + 0x978B: 0xD0AC, + 0x978C: 0xEC94, + 0x978D: 0xB0B0, + 0x978E: 0xEC95, + 0x978F: 0xEC96, + 0x9790: 0xEC97, + 0x9791: 0xF7B2, + 0x9792: 0xF7B3, + 0x9793: 0xEC98, + 0x9794: 0xF7B4, + 0x9795: 0xEC99, + 0x9796: 0xEC9A, + 0x9797: 0xEC9B, + 0x9798: 0xC7CA, + 0x9799: 0xEC9C, + 0x979A: 0xEC9D, + 0x979B: 0xEC9E, + 0x979C: 0xEC9F, + 0x979D: 0xECA0, + 0x979E: 0xED40, + 0x979F: 0xED41, + 0x97A0: 0xBECF, + 0x97A1: 0xED42, + 0x97A2: 0xED43, + 0x97A3: 0xF7B7, + 0x97A4: 0xED44, + 0x97A5: 0xED45, + 0x97A6: 0xED46, + 0x97A7: 0xED47, + 0x97A8: 0xED48, + 0x97A9: 0xED49, + 0x97AA: 0xED4A, + 0x97AB: 0xF7B6, + 0x97AC: 0xED4B, + 0x97AD: 0xB1DE, + 0x97AE: 0xED4C, + 0x97AF: 0xF7B5, + 0x97B0: 0xED4D, + 0x97B1: 0xED4E, + 0x97B2: 0xF7B8, + 0x97B3: 0xED4F, + 0x97B4: 0xF7B9, + 0x97B5: 0xED50, + 0x97B6: 0xED51, + 0x97B7: 0xED52, + 0x97B8: 0xED53, + 0x97B9: 0xED54, + 0x97BA: 0xED55, + 0x97BB: 0xED56, + 0x97BC: 0xED57, + 0x97BD: 0xED58, + 0x97BE: 0xED59, + 0x97BF: 0xED5A, + 0x97C0: 0xED5B, + 0x97C1: 0xED5C, + 0x97C2: 0xED5D, + 0x97C3: 0xED5E, + 0x97C4: 0xED5F, + 0x97C5: 0xED60, + 0x97C6: 0xED61, + 0x97C7: 0xED62, + 0x97C8: 0xED63, + 0x97C9: 0xED64, + 0x97CA: 0xED65, + 0x97CB: 0xED66, + 0x97CC: 0xED67, + 0x97CD: 0xED68, + 0x97CE: 0xED69, + 0x97CF: 0xED6A, + 0x97D0: 0xED6B, + 0x97D1: 0xED6C, + 0x97D2: 0xED6D, + 0x97D3: 0xED6E, + 0x97D4: 0xED6F, + 0x97D5: 0xED70, + 0x97D6: 0xED71, + 0x97D7: 0xED72, + 0x97D8: 0xED73, + 0x97D9: 0xED74, + 0x97DA: 0xED75, + 0x97DB: 0xED76, + 0x97DC: 0xED77, + 0x97DD: 0xED78, + 0x97DE: 0xED79, + 0x97DF: 0xED7A, + 0x97E0: 0xED7B, + 0x97E1: 0xED7C, + 0x97E2: 0xED7D, + 0x97E3: 0xED7E, + 0x97E4: 0xED80, + 0x97E5: 0xED81, + 0x97E6: 0xCEA4, + 0x97E7: 0xC8CD, + 0x97E8: 0xED82, + 0x97E9: 0xBAAB, + 0x97EA: 0xE8B8, + 0x97EB: 0xE8B9, + 0x97EC: 0xE8BA, + 0x97ED: 0xBEC2, + 0x97EE: 0xED83, + 0x97EF: 0xED84, + 0x97F0: 0xED85, + 0x97F1: 0xED86, + 0x97F2: 0xED87, + 0x97F3: 0xD2F4, + 0x97F4: 0xED88, + 0x97F5: 0xD4CF, + 0x97F6: 0xC9D8, + 0x97F7: 0xED89, + 0x97F8: 0xED8A, + 0x97F9: 0xED8B, + 0x97FA: 0xED8C, + 0x97FB: 0xED8D, + 0x97FC: 0xED8E, + 0x97FD: 0xED8F, + 0x97FE: 0xED90, + 0x97FF: 0xED91, + 0x9800: 0xED92, + 0x9801: 0xED93, + 0x9802: 0xED94, + 0x9803: 0xED95, + 0x9804: 0xED96, + 0x9805: 0xED97, + 0x9806: 0xED98, + 0x9807: 0xED99, + 0x9808: 0xED9A, + 0x9809: 0xED9B, + 0x980A: 0xED9C, + 0x980B: 0xED9D, + 0x980C: 0xED9E, + 0x980D: 0xED9F, + 0x980E: 0xEDA0, + 0x980F: 0xEE40, + 0x9810: 0xEE41, + 0x9811: 0xEE42, + 0x9812: 0xEE43, + 0x9813: 0xEE44, + 0x9814: 0xEE45, + 0x9815: 0xEE46, + 0x9816: 0xEE47, + 0x9817: 0xEE48, + 0x9818: 0xEE49, + 0x9819: 0xEE4A, + 0x981A: 0xEE4B, + 0x981B: 0xEE4C, + 0x981C: 0xEE4D, + 0x981D: 0xEE4E, + 0x981E: 0xEE4F, + 0x981F: 0xEE50, + 0x9820: 0xEE51, + 0x9821: 0xEE52, + 0x9822: 0xEE53, + 0x9823: 0xEE54, + 0x9824: 0xEE55, + 0x9825: 0xEE56, + 0x9826: 0xEE57, + 0x9827: 0xEE58, + 0x9828: 0xEE59, + 0x9829: 0xEE5A, + 0x982A: 0xEE5B, + 0x982B: 0xEE5C, + 0x982C: 0xEE5D, + 0x982D: 0xEE5E, + 0x982E: 0xEE5F, + 0x982F: 0xEE60, + 0x9830: 0xEE61, + 0x9831: 0xEE62, + 0x9832: 0xEE63, + 0x9833: 0xEE64, + 0x9834: 0xEE65, + 0x9835: 0xEE66, + 0x9836: 0xEE67, + 0x9837: 0xEE68, + 0x9838: 0xEE69, + 0x9839: 0xEE6A, + 0x983A: 0xEE6B, + 0x983B: 0xEE6C, + 0x983C: 0xEE6D, + 0x983D: 0xEE6E, + 0x983E: 0xEE6F, + 0x983F: 0xEE70, + 0x9840: 0xEE71, + 0x9841: 0xEE72, + 0x9842: 0xEE73, + 0x9843: 0xEE74, + 0x9844: 0xEE75, + 0x9845: 0xEE76, + 0x9846: 0xEE77, + 0x9847: 0xEE78, + 0x9848: 0xEE79, + 0x9849: 0xEE7A, + 0x984A: 0xEE7B, + 0x984B: 0xEE7C, + 0x984C: 0xEE7D, + 0x984D: 0xEE7E, + 0x984E: 0xEE80, + 0x984F: 0xEE81, + 0x9850: 0xEE82, + 0x9851: 0xEE83, + 0x9852: 0xEE84, + 0x9853: 0xEE85, + 0x9854: 0xEE86, + 0x9855: 0xEE87, + 0x9856: 0xEE88, + 0x9857: 0xEE89, + 0x9858: 0xEE8A, + 0x9859: 0xEE8B, + 0x985A: 0xEE8C, + 0x985B: 0xEE8D, + 0x985C: 0xEE8E, + 0x985D: 0xEE8F, + 0x985E: 0xEE90, + 0x985F: 0xEE91, + 0x9860: 0xEE92, + 0x9861: 0xEE93, + 0x9862: 0xEE94, + 0x9863: 0xEE95, + 0x9864: 0xEE96, + 0x9865: 0xEE97, + 0x9866: 0xEE98, + 0x9867: 0xEE99, + 0x9868: 0xEE9A, + 0x9869: 0xEE9B, + 0x986A: 0xEE9C, + 0x986B: 0xEE9D, + 0x986C: 0xEE9E, + 0x986D: 0xEE9F, + 0x986E: 0xEEA0, + 0x986F: 0xEF40, + 0x9870: 0xEF41, + 0x9871: 0xEF42, + 0x9872: 0xEF43, + 0x9873: 0xEF44, + 0x9874: 0xEF45, + 0x9875: 0xD2B3, + 0x9876: 0xB6A5, + 0x9877: 0xC7EA, + 0x9878: 0xF1FC, + 0x9879: 0xCFEE, + 0x987A: 0xCBB3, + 0x987B: 0xD0EB, + 0x987C: 0xE7EF, + 0x987D: 0xCDE7, + 0x987E: 0xB9CB, + 0x987F: 0xB6D9, + 0x9880: 0xF1FD, + 0x9881: 0xB0E4, + 0x9882: 0xCBCC, + 0x9883: 0xF1FE, + 0x9884: 0xD4A4, + 0x9885: 0xC2AD, + 0x9886: 0xC1EC, + 0x9887: 0xC6C4, + 0x9888: 0xBEB1, + 0x9889: 0xF2A1, + 0x988A: 0xBCD5, + 0x988B: 0xEF46, + 0x988C: 0xF2A2, + 0x988D: 0xF2A3, + 0x988E: 0xEF47, + 0x988F: 0xF2A4, + 0x9890: 0xD2C3, + 0x9891: 0xC6B5, + 0x9892: 0xEF48, + 0x9893: 0xCDC7, + 0x9894: 0xF2A5, + 0x9895: 0xEF49, + 0x9896: 0xD3B1, + 0x9897: 0xBFC5, + 0x9898: 0xCCE2, + 0x9899: 0xEF4A, + 0x989A: 0xF2A6, + 0x989B: 0xF2A7, + 0x989C: 0xD1D5, + 0x989D: 0xB6EE, + 0x989E: 0xF2A8, + 0x989F: 0xF2A9, + 0x98A0: 0xB5DF, + 0x98A1: 0xF2AA, + 0x98A2: 0xF2AB, + 0x98A3: 0xEF4B, + 0x98A4: 0xB2FC, + 0x98A5: 0xF2AC, + 0x98A6: 0xF2AD, + 0x98A7: 0xC8A7, + 0x98A8: 0xEF4C, + 0x98A9: 0xEF4D, + 0x98AA: 0xEF4E, + 0x98AB: 0xEF4F, + 0x98AC: 0xEF50, + 0x98AD: 0xEF51, + 0x98AE: 0xEF52, + 0x98AF: 0xEF53, + 0x98B0: 0xEF54, + 0x98B1: 0xEF55, + 0x98B2: 0xEF56, + 0x98B3: 0xEF57, + 0x98B4: 0xEF58, + 0x98B5: 0xEF59, + 0x98B6: 0xEF5A, + 0x98B7: 0xEF5B, + 0x98B8: 0xEF5C, + 0x98B9: 0xEF5D, + 0x98BA: 0xEF5E, + 0x98BB: 0xEF5F, + 0x98BC: 0xEF60, + 0x98BD: 0xEF61, + 0x98BE: 0xEF62, + 0x98BF: 0xEF63, + 0x98C0: 0xEF64, + 0x98C1: 0xEF65, + 0x98C2: 0xEF66, + 0x98C3: 0xEF67, + 0x98C4: 0xEF68, + 0x98C5: 0xEF69, + 0x98C6: 0xEF6A, + 0x98C7: 0xEF6B, + 0x98C8: 0xEF6C, + 0x98C9: 0xEF6D, + 0x98CA: 0xEF6E, + 0x98CB: 0xEF6F, + 0x98CC: 0xEF70, + 0x98CD: 0xEF71, + 0x98CE: 0xB7E7, + 0x98CF: 0xEF72, + 0x98D0: 0xEF73, + 0x98D1: 0xECA9, + 0x98D2: 0xECAA, + 0x98D3: 0xECAB, + 0x98D4: 0xEF74, + 0x98D5: 0xECAC, + 0x98D6: 0xEF75, + 0x98D7: 0xEF76, + 0x98D8: 0xC6AE, + 0x98D9: 0xECAD, + 0x98DA: 0xECAE, + 0x98DB: 0xEF77, + 0x98DC: 0xEF78, + 0x98DD: 0xEF79, + 0x98DE: 0xB7C9, + 0x98DF: 0xCAB3, + 0x98E0: 0xEF7A, + 0x98E1: 0xEF7B, + 0x98E2: 0xEF7C, + 0x98E3: 0xEF7D, + 0x98E4: 0xEF7E, + 0x98E5: 0xEF80, + 0x98E6: 0xEF81, + 0x98E7: 0xE2B8, + 0x98E8: 0xF7CF, + 0x98E9: 0xEF82, + 0x98EA: 0xEF83, + 0x98EB: 0xEF84, + 0x98EC: 0xEF85, + 0x98ED: 0xEF86, + 0x98EE: 0xEF87, + 0x98EF: 0xEF88, + 0x98F0: 0xEF89, + 0x98F1: 0xEF8A, + 0x98F2: 0xEF8B, + 0x98F3: 0xEF8C, + 0x98F4: 0xEF8D, + 0x98F5: 0xEF8E, + 0x98F6: 0xEF8F, + 0x98F7: 0xEF90, + 0x98F8: 0xEF91, + 0x98F9: 0xEF92, + 0x98FA: 0xEF93, + 0x98FB: 0xEF94, + 0x98FC: 0xEF95, + 0x98FD: 0xEF96, + 0x98FE: 0xEF97, + 0x98FF: 0xEF98, + 0x9900: 0xEF99, + 0x9901: 0xEF9A, + 0x9902: 0xEF9B, + 0x9903: 0xEF9C, + 0x9904: 0xEF9D, + 0x9905: 0xEF9E, + 0x9906: 0xEF9F, + 0x9907: 0xEFA0, + 0x9908: 0xF040, + 0x9909: 0xF041, + 0x990A: 0xF042, + 0x990B: 0xF043, + 0x990C: 0xF044, + 0x990D: 0xF7D0, + 0x990E: 0xF045, + 0x990F: 0xF046, + 0x9910: 0xB2CD, + 0x9911: 0xF047, + 0x9912: 0xF048, + 0x9913: 0xF049, + 0x9914: 0xF04A, + 0x9915: 0xF04B, + 0x9916: 0xF04C, + 0x9917: 0xF04D, + 0x9918: 0xF04E, + 0x9919: 0xF04F, + 0x991A: 0xF050, + 0x991B: 0xF051, + 0x991C: 0xF052, + 0x991D: 0xF053, + 0x991E: 0xF054, + 0x991F: 0xF055, + 0x9920: 0xF056, + 0x9921: 0xF057, + 0x9922: 0xF058, + 0x9923: 0xF059, + 0x9924: 0xF05A, + 0x9925: 0xF05B, + 0x9926: 0xF05C, + 0x9927: 0xF05D, + 0x9928: 0xF05E, + 0x9929: 0xF05F, + 0x992A: 0xF060, + 0x992B: 0xF061, + 0x992C: 0xF062, + 0x992D: 0xF063, + 0x992E: 0xF7D1, + 0x992F: 0xF064, + 0x9930: 0xF065, + 0x9931: 0xF066, + 0x9932: 0xF067, + 0x9933: 0xF068, + 0x9934: 0xF069, + 0x9935: 0xF06A, + 0x9936: 0xF06B, + 0x9937: 0xF06C, + 0x9938: 0xF06D, + 0x9939: 0xF06E, + 0x993A: 0xF06F, + 0x993B: 0xF070, + 0x993C: 0xF071, + 0x993D: 0xF072, + 0x993E: 0xF073, + 0x993F: 0xF074, + 0x9940: 0xF075, + 0x9941: 0xF076, + 0x9942: 0xF077, + 0x9943: 0xF078, + 0x9944: 0xF079, + 0x9945: 0xF07A, + 0x9946: 0xF07B, + 0x9947: 0xF07C, + 0x9948: 0xF07D, + 0x9949: 0xF07E, + 0x994A: 0xF080, + 0x994B: 0xF081, + 0x994C: 0xF082, + 0x994D: 0xF083, + 0x994E: 0xF084, + 0x994F: 0xF085, + 0x9950: 0xF086, + 0x9951: 0xF087, + 0x9952: 0xF088, + 0x9953: 0xF089, + 0x9954: 0xF7D3, + 0x9955: 0xF7D2, + 0x9956: 0xF08A, + 0x9957: 0xF08B, + 0x9958: 0xF08C, + 0x9959: 0xF08D, + 0x995A: 0xF08E, + 0x995B: 0xF08F, + 0x995C: 0xF090, + 0x995D: 0xF091, + 0x995E: 0xF092, + 0x995F: 0xF093, + 0x9960: 0xF094, + 0x9961: 0xF095, + 0x9962: 0xF096, + 0x9963: 0xE2BB, + 0x9964: 0xF097, + 0x9965: 0xBCA2, + 0x9966: 0xF098, + 0x9967: 0xE2BC, + 0x9968: 0xE2BD, + 0x9969: 0xE2BE, + 0x996A: 0xE2BF, + 0x996B: 0xE2C0, + 0x996C: 0xE2C1, + 0x996D: 0xB7B9, + 0x996E: 0xD2FB, + 0x996F: 0xBDA4, + 0x9970: 0xCACE, + 0x9971: 0xB1A5, + 0x9972: 0xCBC7, + 0x9973: 0xF099, + 0x9974: 0xE2C2, + 0x9975: 0xB6FC, + 0x9976: 0xC8C4, + 0x9977: 0xE2C3, + 0x9978: 0xF09A, + 0x9979: 0xF09B, + 0x997A: 0xBDC8, + 0x997B: 0xF09C, + 0x997C: 0xB1FD, + 0x997D: 0xE2C4, + 0x997E: 0xF09D, + 0x997F: 0xB6F6, + 0x9980: 0xE2C5, + 0x9981: 0xC4D9, + 0x9982: 0xF09E, + 0x9983: 0xF09F, + 0x9984: 0xE2C6, + 0x9985: 0xCFDA, + 0x9986: 0xB9DD, + 0x9987: 0xE2C7, + 0x9988: 0xC0A1, + 0x9989: 0xF0A0, + 0x998A: 0xE2C8, + 0x998B: 0xB2F6, + 0x998C: 0xF140, + 0x998D: 0xE2C9, + 0x998E: 0xF141, + 0x998F: 0xC1F3, + 0x9990: 0xE2CA, + 0x9991: 0xE2CB, + 0x9992: 0xC2F8, + 0x9993: 0xE2CC, + 0x9994: 0xE2CD, + 0x9995: 0xE2CE, + 0x9996: 0xCAD7, + 0x9997: 0xD8B8, + 0x9998: 0xD9E5, + 0x9999: 0xCFE3, + 0x999A: 0xF142, + 0x999B: 0xF143, + 0x999C: 0xF144, + 0x999D: 0xF145, + 0x999E: 0xF146, + 0x999F: 0xF147, + 0x99A0: 0xF148, + 0x99A1: 0xF149, + 0x99A2: 0xF14A, + 0x99A3: 0xF14B, + 0x99A4: 0xF14C, + 0x99A5: 0xF0A5, + 0x99A6: 0xF14D, + 0x99A7: 0xF14E, + 0x99A8: 0xDCB0, + 0x99A9: 0xF14F, + 0x99AA: 0xF150, + 0x99AB: 0xF151, + 0x99AC: 0xF152, + 0x99AD: 0xF153, + 0x99AE: 0xF154, + 0x99AF: 0xF155, + 0x99B0: 0xF156, + 0x99B1: 0xF157, + 0x99B2: 0xF158, + 0x99B3: 0xF159, + 0x99B4: 0xF15A, + 0x99B5: 0xF15B, + 0x99B6: 0xF15C, + 0x99B7: 0xF15D, + 0x99B8: 0xF15E, + 0x99B9: 0xF15F, + 0x99BA: 0xF160, + 0x99BB: 0xF161, + 0x99BC: 0xF162, + 0x99BD: 0xF163, + 0x99BE: 0xF164, + 0x99BF: 0xF165, + 0x99C0: 0xF166, + 0x99C1: 0xF167, + 0x99C2: 0xF168, + 0x99C3: 0xF169, + 0x99C4: 0xF16A, + 0x99C5: 0xF16B, + 0x99C6: 0xF16C, + 0x99C7: 0xF16D, + 0x99C8: 0xF16E, + 0x99C9: 0xF16F, + 0x99CA: 0xF170, + 0x99CB: 0xF171, + 0x99CC: 0xF172, + 0x99CD: 0xF173, + 0x99CE: 0xF174, + 0x99CF: 0xF175, + 0x99D0: 0xF176, + 0x99D1: 0xF177, + 0x99D2: 0xF178, + 0x99D3: 0xF179, + 0x99D4: 0xF17A, + 0x99D5: 0xF17B, + 0x99D6: 0xF17C, + 0x99D7: 0xF17D, + 0x99D8: 0xF17E, + 0x99D9: 0xF180, + 0x99DA: 0xF181, + 0x99DB: 0xF182, + 0x99DC: 0xF183, + 0x99DD: 0xF184, + 0x99DE: 0xF185, + 0x99DF: 0xF186, + 0x99E0: 0xF187, + 0x99E1: 0xF188, + 0x99E2: 0xF189, + 0x99E3: 0xF18A, + 0x99E4: 0xF18B, + 0x99E5: 0xF18C, + 0x99E6: 0xF18D, + 0x99E7: 0xF18E, + 0x99E8: 0xF18F, + 0x99E9: 0xF190, + 0x99EA: 0xF191, + 0x99EB: 0xF192, + 0x99EC: 0xF193, + 0x99ED: 0xF194, + 0x99EE: 0xF195, + 0x99EF: 0xF196, + 0x99F0: 0xF197, + 0x99F1: 0xF198, + 0x99F2: 0xF199, + 0x99F3: 0xF19A, + 0x99F4: 0xF19B, + 0x99F5: 0xF19C, + 0x99F6: 0xF19D, + 0x99F7: 0xF19E, + 0x99F8: 0xF19F, + 0x99F9: 0xF1A0, + 0x99FA: 0xF240, + 0x99FB: 0xF241, + 0x99FC: 0xF242, + 0x99FD: 0xF243, + 0x99FE: 0xF244, + 0x99FF: 0xF245, + 0x9A00: 0xF246, + 0x9A01: 0xF247, + 0x9A02: 0xF248, + 0x9A03: 0xF249, + 0x9A04: 0xF24A, + 0x9A05: 0xF24B, + 0x9A06: 0xF24C, + 0x9A07: 0xF24D, + 0x9A08: 0xF24E, + 0x9A09: 0xF24F, + 0x9A0A: 0xF250, + 0x9A0B: 0xF251, + 0x9A0C: 0xF252, + 0x9A0D: 0xF253, + 0x9A0E: 0xF254, + 0x9A0F: 0xF255, + 0x9A10: 0xF256, + 0x9A11: 0xF257, + 0x9A12: 0xF258, + 0x9A13: 0xF259, + 0x9A14: 0xF25A, + 0x9A15: 0xF25B, + 0x9A16: 0xF25C, + 0x9A17: 0xF25D, + 0x9A18: 0xF25E, + 0x9A19: 0xF25F, + 0x9A1A: 0xF260, + 0x9A1B: 0xF261, + 0x9A1C: 0xF262, + 0x9A1D: 0xF263, + 0x9A1E: 0xF264, + 0x9A1F: 0xF265, + 0x9A20: 0xF266, + 0x9A21: 0xF267, + 0x9A22: 0xF268, + 0x9A23: 0xF269, + 0x9A24: 0xF26A, + 0x9A25: 0xF26B, + 0x9A26: 0xF26C, + 0x9A27: 0xF26D, + 0x9A28: 0xF26E, + 0x9A29: 0xF26F, + 0x9A2A: 0xF270, + 0x9A2B: 0xF271, + 0x9A2C: 0xF272, + 0x9A2D: 0xF273, + 0x9A2E: 0xF274, + 0x9A2F: 0xF275, + 0x9A30: 0xF276, + 0x9A31: 0xF277, + 0x9A32: 0xF278, + 0x9A33: 0xF279, + 0x9A34: 0xF27A, + 0x9A35: 0xF27B, + 0x9A36: 0xF27C, + 0x9A37: 0xF27D, + 0x9A38: 0xF27E, + 0x9A39: 0xF280, + 0x9A3A: 0xF281, + 0x9A3B: 0xF282, + 0x9A3C: 0xF283, + 0x9A3D: 0xF284, + 0x9A3E: 0xF285, + 0x9A3F: 0xF286, + 0x9A40: 0xF287, + 0x9A41: 0xF288, + 0x9A42: 0xF289, + 0x9A43: 0xF28A, + 0x9A44: 0xF28B, + 0x9A45: 0xF28C, + 0x9A46: 0xF28D, + 0x9A47: 0xF28E, + 0x9A48: 0xF28F, + 0x9A49: 0xF290, + 0x9A4A: 0xF291, + 0x9A4B: 0xF292, + 0x9A4C: 0xF293, + 0x9A4D: 0xF294, + 0x9A4E: 0xF295, + 0x9A4F: 0xF296, + 0x9A50: 0xF297, + 0x9A51: 0xF298, + 0x9A52: 0xF299, + 0x9A53: 0xF29A, + 0x9A54: 0xF29B, + 0x9A55: 0xF29C, + 0x9A56: 0xF29D, + 0x9A57: 0xF29E, + 0x9A58: 0xF29F, + 0x9A59: 0xF2A0, + 0x9A5A: 0xF340, + 0x9A5B: 0xF341, + 0x9A5C: 0xF342, + 0x9A5D: 0xF343, + 0x9A5E: 0xF344, + 0x9A5F: 0xF345, + 0x9A60: 0xF346, + 0x9A61: 0xF347, + 0x9A62: 0xF348, + 0x9A63: 0xF349, + 0x9A64: 0xF34A, + 0x9A65: 0xF34B, + 0x9A66: 0xF34C, + 0x9A67: 0xF34D, + 0x9A68: 0xF34E, + 0x9A69: 0xF34F, + 0x9A6A: 0xF350, + 0x9A6B: 0xF351, + 0x9A6C: 0xC2ED, + 0x9A6D: 0xD4A6, + 0x9A6E: 0xCDD4, + 0x9A6F: 0xD1B1, + 0x9A70: 0xB3DB, + 0x9A71: 0xC7FD, + 0x9A72: 0xF352, + 0x9A73: 0xB2B5, + 0x9A74: 0xC2BF, + 0x9A75: 0xE6E0, + 0x9A76: 0xCABB, + 0x9A77: 0xE6E1, + 0x9A78: 0xE6E2, + 0x9A79: 0xBED4, + 0x9A7A: 0xE6E3, + 0x9A7B: 0xD7A4, + 0x9A7C: 0xCDD5, + 0x9A7D: 0xE6E5, + 0x9A7E: 0xBCDD, + 0x9A7F: 0xE6E4, + 0x9A80: 0xE6E6, + 0x9A81: 0xE6E7, + 0x9A82: 0xC2EE, + 0x9A83: 0xF353, + 0x9A84: 0xBDBE, + 0x9A85: 0xE6E8, + 0x9A86: 0xC2E6, + 0x9A87: 0xBAA7, + 0x9A88: 0xE6E9, + 0x9A89: 0xF354, + 0x9A8A: 0xE6EA, + 0x9A8B: 0xB3D2, + 0x9A8C: 0xD1E9, + 0x9A8D: 0xF355, + 0x9A8E: 0xF356, + 0x9A8F: 0xBFA5, + 0x9A90: 0xE6EB, + 0x9A91: 0xC6EF, + 0x9A92: 0xE6EC, + 0x9A93: 0xE6ED, + 0x9A94: 0xF357, + 0x9A95: 0xF358, + 0x9A96: 0xE6EE, + 0x9A97: 0xC6AD, + 0x9A98: 0xE6EF, + 0x9A99: 0xF359, + 0x9A9A: 0xC9A7, + 0x9A9B: 0xE6F0, + 0x9A9C: 0xE6F1, + 0x9A9D: 0xE6F2, + 0x9A9E: 0xE5B9, + 0x9A9F: 0xE6F3, + 0x9AA0: 0xE6F4, + 0x9AA1: 0xC2E2, + 0x9AA2: 0xE6F5, + 0x9AA3: 0xE6F6, + 0x9AA4: 0xD6E8, + 0x9AA5: 0xE6F7, + 0x9AA6: 0xF35A, + 0x9AA7: 0xE6F8, + 0x9AA8: 0xB9C7, + 0x9AA9: 0xF35B, + 0x9AAA: 0xF35C, + 0x9AAB: 0xF35D, + 0x9AAC: 0xF35E, + 0x9AAD: 0xF35F, + 0x9AAE: 0xF360, + 0x9AAF: 0xF361, + 0x9AB0: 0xF7BB, + 0x9AB1: 0xF7BA, + 0x9AB2: 0xF362, + 0x9AB3: 0xF363, + 0x9AB4: 0xF364, + 0x9AB5: 0xF365, + 0x9AB6: 0xF7BE, + 0x9AB7: 0xF7BC, + 0x9AB8: 0xBAA1, + 0x9AB9: 0xF366, + 0x9ABA: 0xF7BF, + 0x9ABB: 0xF367, + 0x9ABC: 0xF7C0, + 0x9ABD: 0xF368, + 0x9ABE: 0xF369, + 0x9ABF: 0xF36A, + 0x9AC0: 0xF7C2, + 0x9AC1: 0xF7C1, + 0x9AC2: 0xF7C4, + 0x9AC3: 0xF36B, + 0x9AC4: 0xF36C, + 0x9AC5: 0xF7C3, + 0x9AC6: 0xF36D, + 0x9AC7: 0xF36E, + 0x9AC8: 0xF36F, + 0x9AC9: 0xF370, + 0x9ACA: 0xF371, + 0x9ACB: 0xF7C5, + 0x9ACC: 0xF7C6, + 0x9ACD: 0xF372, + 0x9ACE: 0xF373, + 0x9ACF: 0xF374, + 0x9AD0: 0xF375, + 0x9AD1: 0xF7C7, + 0x9AD2: 0xF376, + 0x9AD3: 0xCBE8, + 0x9AD4: 0xF377, + 0x9AD5: 0xF378, + 0x9AD6: 0xF379, + 0x9AD7: 0xF37A, + 0x9AD8: 0xB8DF, + 0x9AD9: 0xF37B, + 0x9ADA: 0xF37C, + 0x9ADB: 0xF37D, + 0x9ADC: 0xF37E, + 0x9ADD: 0xF380, + 0x9ADE: 0xF381, + 0x9ADF: 0xF7D4, + 0x9AE0: 0xF382, + 0x9AE1: 0xF7D5, + 0x9AE2: 0xF383, + 0x9AE3: 0xF384, + 0x9AE4: 0xF385, + 0x9AE5: 0xF386, + 0x9AE6: 0xF7D6, + 0x9AE7: 0xF387, + 0x9AE8: 0xF388, + 0x9AE9: 0xF389, + 0x9AEA: 0xF38A, + 0x9AEB: 0xF7D8, + 0x9AEC: 0xF38B, + 0x9AED: 0xF7DA, + 0x9AEE: 0xF38C, + 0x9AEF: 0xF7D7, + 0x9AF0: 0xF38D, + 0x9AF1: 0xF38E, + 0x9AF2: 0xF38F, + 0x9AF3: 0xF390, + 0x9AF4: 0xF391, + 0x9AF5: 0xF392, + 0x9AF6: 0xF393, + 0x9AF7: 0xF394, + 0x9AF8: 0xF395, + 0x9AF9: 0xF7DB, + 0x9AFA: 0xF396, + 0x9AFB: 0xF7D9, + 0x9AFC: 0xF397, + 0x9AFD: 0xF398, + 0x9AFE: 0xF399, + 0x9AFF: 0xF39A, + 0x9B00: 0xF39B, + 0x9B01: 0xF39C, + 0x9B02: 0xF39D, + 0x9B03: 0xD7D7, + 0x9B04: 0xF39E, + 0x9B05: 0xF39F, + 0x9B06: 0xF3A0, + 0x9B07: 0xF440, + 0x9B08: 0xF7DC, + 0x9B09: 0xF441, + 0x9B0A: 0xF442, + 0x9B0B: 0xF443, + 0x9B0C: 0xF444, + 0x9B0D: 0xF445, + 0x9B0E: 0xF446, + 0x9B0F: 0xF7DD, + 0x9B10: 0xF447, + 0x9B11: 0xF448, + 0x9B12: 0xF449, + 0x9B13: 0xF7DE, + 0x9B14: 0xF44A, + 0x9B15: 0xF44B, + 0x9B16: 0xF44C, + 0x9B17: 0xF44D, + 0x9B18: 0xF44E, + 0x9B19: 0xF44F, + 0x9B1A: 0xF450, + 0x9B1B: 0xF451, + 0x9B1C: 0xF452, + 0x9B1D: 0xF453, + 0x9B1E: 0xF454, + 0x9B1F: 0xF7DF, + 0x9B20: 0xF455, + 0x9B21: 0xF456, + 0x9B22: 0xF457, + 0x9B23: 0xF7E0, + 0x9B24: 0xF458, + 0x9B25: 0xF459, + 0x9B26: 0xF45A, + 0x9B27: 0xF45B, + 0x9B28: 0xF45C, + 0x9B29: 0xF45D, + 0x9B2A: 0xF45E, + 0x9B2B: 0xF45F, + 0x9B2C: 0xF460, + 0x9B2D: 0xF461, + 0x9B2E: 0xF462, + 0x9B2F: 0xDBCB, + 0x9B30: 0xF463, + 0x9B31: 0xF464, + 0x9B32: 0xD8AA, + 0x9B33: 0xF465, + 0x9B34: 0xF466, + 0x9B35: 0xF467, + 0x9B36: 0xF468, + 0x9B37: 0xF469, + 0x9B38: 0xF46A, + 0x9B39: 0xF46B, + 0x9B3A: 0xF46C, + 0x9B3B: 0xE5F7, + 0x9B3C: 0xB9ED, + 0x9B3D: 0xF46D, + 0x9B3E: 0xF46E, + 0x9B3F: 0xF46F, + 0x9B40: 0xF470, + 0x9B41: 0xBFFD, + 0x9B42: 0xBBEA, + 0x9B43: 0xF7C9, + 0x9B44: 0xC6C7, + 0x9B45: 0xF7C8, + 0x9B46: 0xF471, + 0x9B47: 0xF7CA, + 0x9B48: 0xF7CC, + 0x9B49: 0xF7CB, + 0x9B4A: 0xF472, + 0x9B4B: 0xF473, + 0x9B4C: 0xF474, + 0x9B4D: 0xF7CD, + 0x9B4E: 0xF475, + 0x9B4F: 0xCEBA, + 0x9B50: 0xF476, + 0x9B51: 0xF7CE, + 0x9B52: 0xF477, + 0x9B53: 0xF478, + 0x9B54: 0xC4A7, + 0x9B55: 0xF479, + 0x9B56: 0xF47A, + 0x9B57: 0xF47B, + 0x9B58: 0xF47C, + 0x9B59: 0xF47D, + 0x9B5A: 0xF47E, + 0x9B5B: 0xF480, + 0x9B5C: 0xF481, + 0x9B5D: 0xF482, + 0x9B5E: 0xF483, + 0x9B5F: 0xF484, + 0x9B60: 0xF485, + 0x9B61: 0xF486, + 0x9B62: 0xF487, + 0x9B63: 0xF488, + 0x9B64: 0xF489, + 0x9B65: 0xF48A, + 0x9B66: 0xF48B, + 0x9B67: 0xF48C, + 0x9B68: 0xF48D, + 0x9B69: 0xF48E, + 0x9B6A: 0xF48F, + 0x9B6B: 0xF490, + 0x9B6C: 0xF491, + 0x9B6D: 0xF492, + 0x9B6E: 0xF493, + 0x9B6F: 0xF494, + 0x9B70: 0xF495, + 0x9B71: 0xF496, + 0x9B72: 0xF497, + 0x9B73: 0xF498, + 0x9B74: 0xF499, + 0x9B75: 0xF49A, + 0x9B76: 0xF49B, + 0x9B77: 0xF49C, + 0x9B78: 0xF49D, + 0x9B79: 0xF49E, + 0x9B7A: 0xF49F, + 0x9B7B: 0xF4A0, + 0x9B7C: 0xF540, + 0x9B7D: 0xF541, + 0x9B7E: 0xF542, + 0x9B7F: 0xF543, + 0x9B80: 0xF544, + 0x9B81: 0xF545, + 0x9B82: 0xF546, + 0x9B83: 0xF547, + 0x9B84: 0xF548, + 0x9B85: 0xF549, + 0x9B86: 0xF54A, + 0x9B87: 0xF54B, + 0x9B88: 0xF54C, + 0x9B89: 0xF54D, + 0x9B8A: 0xF54E, + 0x9B8B: 0xF54F, + 0x9B8C: 0xF550, + 0x9B8D: 0xF551, + 0x9B8E: 0xF552, + 0x9B8F: 0xF553, + 0x9B90: 0xF554, + 0x9B91: 0xF555, + 0x9B92: 0xF556, + 0x9B93: 0xF557, + 0x9B94: 0xF558, + 0x9B95: 0xF559, + 0x9B96: 0xF55A, + 0x9B97: 0xF55B, + 0x9B98: 0xF55C, + 0x9B99: 0xF55D, + 0x9B9A: 0xF55E, + 0x9B9B: 0xF55F, + 0x9B9C: 0xF560, + 0x9B9D: 0xF561, + 0x9B9E: 0xF562, + 0x9B9F: 0xF563, + 0x9BA0: 0xF564, + 0x9BA1: 0xF565, + 0x9BA2: 0xF566, + 0x9BA3: 0xF567, + 0x9BA4: 0xF568, + 0x9BA5: 0xF569, + 0x9BA6: 0xF56A, + 0x9BA7: 0xF56B, + 0x9BA8: 0xF56C, + 0x9BA9: 0xF56D, + 0x9BAA: 0xF56E, + 0x9BAB: 0xF56F, + 0x9BAC: 0xF570, + 0x9BAD: 0xF571, + 0x9BAE: 0xF572, + 0x9BAF: 0xF573, + 0x9BB0: 0xF574, + 0x9BB1: 0xF575, + 0x9BB2: 0xF576, + 0x9BB3: 0xF577, + 0x9BB4: 0xF578, + 0x9BB5: 0xF579, + 0x9BB6: 0xF57A, + 0x9BB7: 0xF57B, + 0x9BB8: 0xF57C, + 0x9BB9: 0xF57D, + 0x9BBA: 0xF57E, + 0x9BBB: 0xF580, + 0x9BBC: 0xF581, + 0x9BBD: 0xF582, + 0x9BBE: 0xF583, + 0x9BBF: 0xF584, + 0x9BC0: 0xF585, + 0x9BC1: 0xF586, + 0x9BC2: 0xF587, + 0x9BC3: 0xF588, + 0x9BC4: 0xF589, + 0x9BC5: 0xF58A, + 0x9BC6: 0xF58B, + 0x9BC7: 0xF58C, + 0x9BC8: 0xF58D, + 0x9BC9: 0xF58E, + 0x9BCA: 0xF58F, + 0x9BCB: 0xF590, + 0x9BCC: 0xF591, + 0x9BCD: 0xF592, + 0x9BCE: 0xF593, + 0x9BCF: 0xF594, + 0x9BD0: 0xF595, + 0x9BD1: 0xF596, + 0x9BD2: 0xF597, + 0x9BD3: 0xF598, + 0x9BD4: 0xF599, + 0x9BD5: 0xF59A, + 0x9BD6: 0xF59B, + 0x9BD7: 0xF59C, + 0x9BD8: 0xF59D, + 0x9BD9: 0xF59E, + 0x9BDA: 0xF59F, + 0x9BDB: 0xF5A0, + 0x9BDC: 0xF640, + 0x9BDD: 0xF641, + 0x9BDE: 0xF642, + 0x9BDF: 0xF643, + 0x9BE0: 0xF644, + 0x9BE1: 0xF645, + 0x9BE2: 0xF646, + 0x9BE3: 0xF647, + 0x9BE4: 0xF648, + 0x9BE5: 0xF649, + 0x9BE6: 0xF64A, + 0x9BE7: 0xF64B, + 0x9BE8: 0xF64C, + 0x9BE9: 0xF64D, + 0x9BEA: 0xF64E, + 0x9BEB: 0xF64F, + 0x9BEC: 0xF650, + 0x9BED: 0xF651, + 0x9BEE: 0xF652, + 0x9BEF: 0xF653, + 0x9BF0: 0xF654, + 0x9BF1: 0xF655, + 0x9BF2: 0xF656, + 0x9BF3: 0xF657, + 0x9BF4: 0xF658, + 0x9BF5: 0xF659, + 0x9BF6: 0xF65A, + 0x9BF7: 0xF65B, + 0x9BF8: 0xF65C, + 0x9BF9: 0xF65D, + 0x9BFA: 0xF65E, + 0x9BFB: 0xF65F, + 0x9BFC: 0xF660, + 0x9BFD: 0xF661, + 0x9BFE: 0xF662, + 0x9BFF: 0xF663, + 0x9C00: 0xF664, + 0x9C01: 0xF665, + 0x9C02: 0xF666, + 0x9C03: 0xF667, + 0x9C04: 0xF668, + 0x9C05: 0xF669, + 0x9C06: 0xF66A, + 0x9C07: 0xF66B, + 0x9C08: 0xF66C, + 0x9C09: 0xF66D, + 0x9C0A: 0xF66E, + 0x9C0B: 0xF66F, + 0x9C0C: 0xF670, + 0x9C0D: 0xF671, + 0x9C0E: 0xF672, + 0x9C0F: 0xF673, + 0x9C10: 0xF674, + 0x9C11: 0xF675, + 0x9C12: 0xF676, + 0x9C13: 0xF677, + 0x9C14: 0xF678, + 0x9C15: 0xF679, + 0x9C16: 0xF67A, + 0x9C17: 0xF67B, + 0x9C18: 0xF67C, + 0x9C19: 0xF67D, + 0x9C1A: 0xF67E, + 0x9C1B: 0xF680, + 0x9C1C: 0xF681, + 0x9C1D: 0xF682, + 0x9C1E: 0xF683, + 0x9C1F: 0xF684, + 0x9C20: 0xF685, + 0x9C21: 0xF686, + 0x9C22: 0xF687, + 0x9C23: 0xF688, + 0x9C24: 0xF689, + 0x9C25: 0xF68A, + 0x9C26: 0xF68B, + 0x9C27: 0xF68C, + 0x9C28: 0xF68D, + 0x9C29: 0xF68E, + 0x9C2A: 0xF68F, + 0x9C2B: 0xF690, + 0x9C2C: 0xF691, + 0x9C2D: 0xF692, + 0x9C2E: 0xF693, + 0x9C2F: 0xF694, + 0x9C30: 0xF695, + 0x9C31: 0xF696, + 0x9C32: 0xF697, + 0x9C33: 0xF698, + 0x9C34: 0xF699, + 0x9C35: 0xF69A, + 0x9C36: 0xF69B, + 0x9C37: 0xF69C, + 0x9C38: 0xF69D, + 0x9C39: 0xF69E, + 0x9C3A: 0xF69F, + 0x9C3B: 0xF6A0, + 0x9C3C: 0xF740, + 0x9C3D: 0xF741, + 0x9C3E: 0xF742, + 0x9C3F: 0xF743, + 0x9C40: 0xF744, + 0x9C41: 0xF745, + 0x9C42: 0xF746, + 0x9C43: 0xF747, + 0x9C44: 0xF748, + 0x9C45: 0xF749, + 0x9C46: 0xF74A, + 0x9C47: 0xF74B, + 0x9C48: 0xF74C, + 0x9C49: 0xF74D, + 0x9C4A: 0xF74E, + 0x9C4B: 0xF74F, + 0x9C4C: 0xF750, + 0x9C4D: 0xF751, + 0x9C4E: 0xF752, + 0x9C4F: 0xF753, + 0x9C50: 0xF754, + 0x9C51: 0xF755, + 0x9C52: 0xF756, + 0x9C53: 0xF757, + 0x9C54: 0xF758, + 0x9C55: 0xF759, + 0x9C56: 0xF75A, + 0x9C57: 0xF75B, + 0x9C58: 0xF75C, + 0x9C59: 0xF75D, + 0x9C5A: 0xF75E, + 0x9C5B: 0xF75F, + 0x9C5C: 0xF760, + 0x9C5D: 0xF761, + 0x9C5E: 0xF762, + 0x9C5F: 0xF763, + 0x9C60: 0xF764, + 0x9C61: 0xF765, + 0x9C62: 0xF766, + 0x9C63: 0xF767, + 0x9C64: 0xF768, + 0x9C65: 0xF769, + 0x9C66: 0xF76A, + 0x9C67: 0xF76B, + 0x9C68: 0xF76C, + 0x9C69: 0xF76D, + 0x9C6A: 0xF76E, + 0x9C6B: 0xF76F, + 0x9C6C: 0xF770, + 0x9C6D: 0xF771, + 0x9C6E: 0xF772, + 0x9C6F: 0xF773, + 0x9C70: 0xF774, + 0x9C71: 0xF775, + 0x9C72: 0xF776, + 0x9C73: 0xF777, + 0x9C74: 0xF778, + 0x9C75: 0xF779, + 0x9C76: 0xF77A, + 0x9C77: 0xF77B, + 0x9C78: 0xF77C, + 0x9C79: 0xF77D, + 0x9C7A: 0xF77E, + 0x9C7B: 0xF780, + 0x9C7C: 0xD3E3, + 0x9C7D: 0xF781, + 0x9C7E: 0xF782, + 0x9C7F: 0xF6CF, + 0x9C80: 0xF783, + 0x9C81: 0xC2B3, + 0x9C82: 0xF6D0, + 0x9C83: 0xF784, + 0x9C84: 0xF785, + 0x9C85: 0xF6D1, + 0x9C86: 0xF6D2, + 0x9C87: 0xF6D3, + 0x9C88: 0xF6D4, + 0x9C89: 0xF786, + 0x9C8A: 0xF787, + 0x9C8B: 0xF6D6, + 0x9C8C: 0xF788, + 0x9C8D: 0xB1AB, + 0x9C8E: 0xF6D7, + 0x9C8F: 0xF789, + 0x9C90: 0xF6D8, + 0x9C91: 0xF6D9, + 0x9C92: 0xF6DA, + 0x9C93: 0xF78A, + 0x9C94: 0xF6DB, + 0x9C95: 0xF6DC, + 0x9C96: 0xF78B, + 0x9C97: 0xF78C, + 0x9C98: 0xF78D, + 0x9C99: 0xF78E, + 0x9C9A: 0xF6DD, + 0x9C9B: 0xF6DE, + 0x9C9C: 0xCFCA, + 0x9C9D: 0xF78F, + 0x9C9E: 0xF6DF, + 0x9C9F: 0xF6E0, + 0x9CA0: 0xF6E1, + 0x9CA1: 0xF6E2, + 0x9CA2: 0xF6E3, + 0x9CA3: 0xF6E4, + 0x9CA4: 0xC0F0, + 0x9CA5: 0xF6E5, + 0x9CA6: 0xF6E6, + 0x9CA7: 0xF6E7, + 0x9CA8: 0xF6E8, + 0x9CA9: 0xF6E9, + 0x9CAA: 0xF790, + 0x9CAB: 0xF6EA, + 0x9CAC: 0xF791, + 0x9CAD: 0xF6EB, + 0x9CAE: 0xF6EC, + 0x9CAF: 0xF792, + 0x9CB0: 0xF6ED, + 0x9CB1: 0xF6EE, + 0x9CB2: 0xF6EF, + 0x9CB3: 0xF6F0, + 0x9CB4: 0xF6F1, + 0x9CB5: 0xF6F2, + 0x9CB6: 0xF6F3, + 0x9CB7: 0xF6F4, + 0x9CB8: 0xBEA8, + 0x9CB9: 0xF793, + 0x9CBA: 0xF6F5, + 0x9CBB: 0xF6F6, + 0x9CBC: 0xF6F7, + 0x9CBD: 0xF6F8, + 0x9CBE: 0xF794, + 0x9CBF: 0xF795, + 0x9CC0: 0xF796, + 0x9CC1: 0xF797, + 0x9CC2: 0xF798, + 0x9CC3: 0xC8FA, + 0x9CC4: 0xF6F9, + 0x9CC5: 0xF6FA, + 0x9CC6: 0xF6FB, + 0x9CC7: 0xF6FC, + 0x9CC8: 0xF799, + 0x9CC9: 0xF79A, + 0x9CCA: 0xF6FD, + 0x9CCB: 0xF6FE, + 0x9CCC: 0xF7A1, + 0x9CCD: 0xF7A2, + 0x9CCE: 0xF7A3, + 0x9CCF: 0xF7A4, + 0x9CD0: 0xF7A5, + 0x9CD1: 0xF79B, + 0x9CD2: 0xF79C, + 0x9CD3: 0xF7A6, + 0x9CD4: 0xF7A7, + 0x9CD5: 0xF7A8, + 0x9CD6: 0xB1EE, + 0x9CD7: 0xF7A9, + 0x9CD8: 0xF7AA, + 0x9CD9: 0xF7AB, + 0x9CDA: 0xF79D, + 0x9CDB: 0xF79E, + 0x9CDC: 0xF7AC, + 0x9CDD: 0xF7AD, + 0x9CDE: 0xC1DB, + 0x9CDF: 0xF7AE, + 0x9CE0: 0xF79F, + 0x9CE1: 0xF7A0, + 0x9CE2: 0xF7AF, + 0x9CE3: 0xF840, + 0x9CE4: 0xF841, + 0x9CE5: 0xF842, + 0x9CE6: 0xF843, + 0x9CE7: 0xF844, + 0x9CE8: 0xF845, + 0x9CE9: 0xF846, + 0x9CEA: 0xF847, + 0x9CEB: 0xF848, + 0x9CEC: 0xF849, + 0x9CED: 0xF84A, + 0x9CEE: 0xF84B, + 0x9CEF: 0xF84C, + 0x9CF0: 0xF84D, + 0x9CF1: 0xF84E, + 0x9CF2: 0xF84F, + 0x9CF3: 0xF850, + 0x9CF4: 0xF851, + 0x9CF5: 0xF852, + 0x9CF6: 0xF853, + 0x9CF7: 0xF854, + 0x9CF8: 0xF855, + 0x9CF9: 0xF856, + 0x9CFA: 0xF857, + 0x9CFB: 0xF858, + 0x9CFC: 0xF859, + 0x9CFD: 0xF85A, + 0x9CFE: 0xF85B, + 0x9CFF: 0xF85C, + 0x9D00: 0xF85D, + 0x9D01: 0xF85E, + 0x9D02: 0xF85F, + 0x9D03: 0xF860, + 0x9D04: 0xF861, + 0x9D05: 0xF862, + 0x9D06: 0xF863, + 0x9D07: 0xF864, + 0x9D08: 0xF865, + 0x9D09: 0xF866, + 0x9D0A: 0xF867, + 0x9D0B: 0xF868, + 0x9D0C: 0xF869, + 0x9D0D: 0xF86A, + 0x9D0E: 0xF86B, + 0x9D0F: 0xF86C, + 0x9D10: 0xF86D, + 0x9D11: 0xF86E, + 0x9D12: 0xF86F, + 0x9D13: 0xF870, + 0x9D14: 0xF871, + 0x9D15: 0xF872, + 0x9D16: 0xF873, + 0x9D17: 0xF874, + 0x9D18: 0xF875, + 0x9D19: 0xF876, + 0x9D1A: 0xF877, + 0x9D1B: 0xF878, + 0x9D1C: 0xF879, + 0x9D1D: 0xF87A, + 0x9D1E: 0xF87B, + 0x9D1F: 0xF87C, + 0x9D20: 0xF87D, + 0x9D21: 0xF87E, + 0x9D22: 0xF880, + 0x9D23: 0xF881, + 0x9D24: 0xF882, + 0x9D25: 0xF883, + 0x9D26: 0xF884, + 0x9D27: 0xF885, + 0x9D28: 0xF886, + 0x9D29: 0xF887, + 0x9D2A: 0xF888, + 0x9D2B: 0xF889, + 0x9D2C: 0xF88A, + 0x9D2D: 0xF88B, + 0x9D2E: 0xF88C, + 0x9D2F: 0xF88D, + 0x9D30: 0xF88E, + 0x9D31: 0xF88F, + 0x9D32: 0xF890, + 0x9D33: 0xF891, + 0x9D34: 0xF892, + 0x9D35: 0xF893, + 0x9D36: 0xF894, + 0x9D37: 0xF895, + 0x9D38: 0xF896, + 0x9D39: 0xF897, + 0x9D3A: 0xF898, + 0x9D3B: 0xF899, + 0x9D3C: 0xF89A, + 0x9D3D: 0xF89B, + 0x9D3E: 0xF89C, + 0x9D3F: 0xF89D, + 0x9D40: 0xF89E, + 0x9D41: 0xF89F, + 0x9D42: 0xF8A0, + 0x9D43: 0xF940, + 0x9D44: 0xF941, + 0x9D45: 0xF942, + 0x9D46: 0xF943, + 0x9D47: 0xF944, + 0x9D48: 0xF945, + 0x9D49: 0xF946, + 0x9D4A: 0xF947, + 0x9D4B: 0xF948, + 0x9D4C: 0xF949, + 0x9D4D: 0xF94A, + 0x9D4E: 0xF94B, + 0x9D4F: 0xF94C, + 0x9D50: 0xF94D, + 0x9D51: 0xF94E, + 0x9D52: 0xF94F, + 0x9D53: 0xF950, + 0x9D54: 0xF951, + 0x9D55: 0xF952, + 0x9D56: 0xF953, + 0x9D57: 0xF954, + 0x9D58: 0xF955, + 0x9D59: 0xF956, + 0x9D5A: 0xF957, + 0x9D5B: 0xF958, + 0x9D5C: 0xF959, + 0x9D5D: 0xF95A, + 0x9D5E: 0xF95B, + 0x9D5F: 0xF95C, + 0x9D60: 0xF95D, + 0x9D61: 0xF95E, + 0x9D62: 0xF95F, + 0x9D63: 0xF960, + 0x9D64: 0xF961, + 0x9D65: 0xF962, + 0x9D66: 0xF963, + 0x9D67: 0xF964, + 0x9D68: 0xF965, + 0x9D69: 0xF966, + 0x9D6A: 0xF967, + 0x9D6B: 0xF968, + 0x9D6C: 0xF969, + 0x9D6D: 0xF96A, + 0x9D6E: 0xF96B, + 0x9D6F: 0xF96C, + 0x9D70: 0xF96D, + 0x9D71: 0xF96E, + 0x9D72: 0xF96F, + 0x9D73: 0xF970, + 0x9D74: 0xF971, + 0x9D75: 0xF972, + 0x9D76: 0xF973, + 0x9D77: 0xF974, + 0x9D78: 0xF975, + 0x9D79: 0xF976, + 0x9D7A: 0xF977, + 0x9D7B: 0xF978, + 0x9D7C: 0xF979, + 0x9D7D: 0xF97A, + 0x9D7E: 0xF97B, + 0x9D7F: 0xF97C, + 0x9D80: 0xF97D, + 0x9D81: 0xF97E, + 0x9D82: 0xF980, + 0x9D83: 0xF981, + 0x9D84: 0xF982, + 0x9D85: 0xF983, + 0x9D86: 0xF984, + 0x9D87: 0xF985, + 0x9D88: 0xF986, + 0x9D89: 0xF987, + 0x9D8A: 0xF988, + 0x9D8B: 0xF989, + 0x9D8C: 0xF98A, + 0x9D8D: 0xF98B, + 0x9D8E: 0xF98C, + 0x9D8F: 0xF98D, + 0x9D90: 0xF98E, + 0x9D91: 0xF98F, + 0x9D92: 0xF990, + 0x9D93: 0xF991, + 0x9D94: 0xF992, + 0x9D95: 0xF993, + 0x9D96: 0xF994, + 0x9D97: 0xF995, + 0x9D98: 0xF996, + 0x9D99: 0xF997, + 0x9D9A: 0xF998, + 0x9D9B: 0xF999, + 0x9D9C: 0xF99A, + 0x9D9D: 0xF99B, + 0x9D9E: 0xF99C, + 0x9D9F: 0xF99D, + 0x9DA0: 0xF99E, + 0x9DA1: 0xF99F, + 0x9DA2: 0xF9A0, + 0x9DA3: 0xFA40, + 0x9DA4: 0xFA41, + 0x9DA5: 0xFA42, + 0x9DA6: 0xFA43, + 0x9DA7: 0xFA44, + 0x9DA8: 0xFA45, + 0x9DA9: 0xFA46, + 0x9DAA: 0xFA47, + 0x9DAB: 0xFA48, + 0x9DAC: 0xFA49, + 0x9DAD: 0xFA4A, + 0x9DAE: 0xFA4B, + 0x9DAF: 0xFA4C, + 0x9DB0: 0xFA4D, + 0x9DB1: 0xFA4E, + 0x9DB2: 0xFA4F, + 0x9DB3: 0xFA50, + 0x9DB4: 0xFA51, + 0x9DB5: 0xFA52, + 0x9DB6: 0xFA53, + 0x9DB7: 0xFA54, + 0x9DB8: 0xFA55, + 0x9DB9: 0xFA56, + 0x9DBA: 0xFA57, + 0x9DBB: 0xFA58, + 0x9DBC: 0xFA59, + 0x9DBD: 0xFA5A, + 0x9DBE: 0xFA5B, + 0x9DBF: 0xFA5C, + 0x9DC0: 0xFA5D, + 0x9DC1: 0xFA5E, + 0x9DC2: 0xFA5F, + 0x9DC3: 0xFA60, + 0x9DC4: 0xFA61, + 0x9DC5: 0xFA62, + 0x9DC6: 0xFA63, + 0x9DC7: 0xFA64, + 0x9DC8: 0xFA65, + 0x9DC9: 0xFA66, + 0x9DCA: 0xFA67, + 0x9DCB: 0xFA68, + 0x9DCC: 0xFA69, + 0x9DCD: 0xFA6A, + 0x9DCE: 0xFA6B, + 0x9DCF: 0xFA6C, + 0x9DD0: 0xFA6D, + 0x9DD1: 0xFA6E, + 0x9DD2: 0xFA6F, + 0x9DD3: 0xFA70, + 0x9DD4: 0xFA71, + 0x9DD5: 0xFA72, + 0x9DD6: 0xFA73, + 0x9DD7: 0xFA74, + 0x9DD8: 0xFA75, + 0x9DD9: 0xFA76, + 0x9DDA: 0xFA77, + 0x9DDB: 0xFA78, + 0x9DDC: 0xFA79, + 0x9DDD: 0xFA7A, + 0x9DDE: 0xFA7B, + 0x9DDF: 0xFA7C, + 0x9DE0: 0xFA7D, + 0x9DE1: 0xFA7E, + 0x9DE2: 0xFA80, + 0x9DE3: 0xFA81, + 0x9DE4: 0xFA82, + 0x9DE5: 0xFA83, + 0x9DE6: 0xFA84, + 0x9DE7: 0xFA85, + 0x9DE8: 0xFA86, + 0x9DE9: 0xFA87, + 0x9DEA: 0xFA88, + 0x9DEB: 0xFA89, + 0x9DEC: 0xFA8A, + 0x9DED: 0xFA8B, + 0x9DEE: 0xFA8C, + 0x9DEF: 0xFA8D, + 0x9DF0: 0xFA8E, + 0x9DF1: 0xFA8F, + 0x9DF2: 0xFA90, + 0x9DF3: 0xFA91, + 0x9DF4: 0xFA92, + 0x9DF5: 0xFA93, + 0x9DF6: 0xFA94, + 0x9DF7: 0xFA95, + 0x9DF8: 0xFA96, + 0x9DF9: 0xFA97, + 0x9DFA: 0xFA98, + 0x9DFB: 0xFA99, + 0x9DFC: 0xFA9A, + 0x9DFD: 0xFA9B, + 0x9DFE: 0xFA9C, + 0x9DFF: 0xFA9D, + 0x9E00: 0xFA9E, + 0x9E01: 0xFA9F, + 0x9E02: 0xFAA0, + 0x9E03: 0xFB40, + 0x9E04: 0xFB41, + 0x9E05: 0xFB42, + 0x9E06: 0xFB43, + 0x9E07: 0xFB44, + 0x9E08: 0xFB45, + 0x9E09: 0xFB46, + 0x9E0A: 0xFB47, + 0x9E0B: 0xFB48, + 0x9E0C: 0xFB49, + 0x9E0D: 0xFB4A, + 0x9E0E: 0xFB4B, + 0x9E0F: 0xFB4C, + 0x9E10: 0xFB4D, + 0x9E11: 0xFB4E, + 0x9E12: 0xFB4F, + 0x9E13: 0xFB50, + 0x9E14: 0xFB51, + 0x9E15: 0xFB52, + 0x9E16: 0xFB53, + 0x9E17: 0xFB54, + 0x9E18: 0xFB55, + 0x9E19: 0xFB56, + 0x9E1A: 0xFB57, + 0x9E1B: 0xFB58, + 0x9E1C: 0xFB59, + 0x9E1D: 0xFB5A, + 0x9E1E: 0xFB5B, + 0x9E1F: 0xC4F1, + 0x9E20: 0xF0AF, + 0x9E21: 0xBCA6, + 0x9E22: 0xF0B0, + 0x9E23: 0xC3F9, + 0x9E24: 0xFB5C, + 0x9E25: 0xC5B8, + 0x9E26: 0xD1BB, + 0x9E27: 0xFB5D, + 0x9E28: 0xF0B1, + 0x9E29: 0xF0B2, + 0x9E2A: 0xF0B3, + 0x9E2B: 0xF0B4, + 0x9E2C: 0xF0B5, + 0x9E2D: 0xD1BC, + 0x9E2E: 0xFB5E, + 0x9E2F: 0xD1EC, + 0x9E30: 0xFB5F, + 0x9E31: 0xF0B7, + 0x9E32: 0xF0B6, + 0x9E33: 0xD4A7, + 0x9E34: 0xFB60, + 0x9E35: 0xCDD2, + 0x9E36: 0xF0B8, + 0x9E37: 0xF0BA, + 0x9E38: 0xF0B9, + 0x9E39: 0xF0BB, + 0x9E3A: 0xF0BC, + 0x9E3B: 0xFB61, + 0x9E3C: 0xFB62, + 0x9E3D: 0xB8EB, + 0x9E3E: 0xF0BD, + 0x9E3F: 0xBAE8, + 0x9E40: 0xFB63, + 0x9E41: 0xF0BE, + 0x9E42: 0xF0BF, + 0x9E43: 0xBEE9, + 0x9E44: 0xF0C0, + 0x9E45: 0xB6EC, + 0x9E46: 0xF0C1, + 0x9E47: 0xF0C2, + 0x9E48: 0xF0C3, + 0x9E49: 0xF0C4, + 0x9E4A: 0xC8B5, + 0x9E4B: 0xF0C5, + 0x9E4C: 0xF0C6, + 0x9E4D: 0xFB64, + 0x9E4E: 0xF0C7, + 0x9E4F: 0xC5F4, + 0x9E50: 0xFB65, + 0x9E51: 0xF0C8, + 0x9E52: 0xFB66, + 0x9E53: 0xFB67, + 0x9E54: 0xFB68, + 0x9E55: 0xF0C9, + 0x9E56: 0xFB69, + 0x9E57: 0xF0CA, + 0x9E58: 0xF7BD, + 0x9E59: 0xFB6A, + 0x9E5A: 0xF0CB, + 0x9E5B: 0xF0CC, + 0x9E5C: 0xF0CD, + 0x9E5D: 0xFB6B, + 0x9E5E: 0xF0CE, + 0x9E5F: 0xFB6C, + 0x9E60: 0xFB6D, + 0x9E61: 0xFB6E, + 0x9E62: 0xFB6F, + 0x9E63: 0xF0CF, + 0x9E64: 0xBAD7, + 0x9E65: 0xFB70, + 0x9E66: 0xF0D0, + 0x9E67: 0xF0D1, + 0x9E68: 0xF0D2, + 0x9E69: 0xF0D3, + 0x9E6A: 0xF0D4, + 0x9E6B: 0xF0D5, + 0x9E6C: 0xF0D6, + 0x9E6D: 0xF0D8, + 0x9E6E: 0xFB71, + 0x9E6F: 0xFB72, + 0x9E70: 0xD3A5, + 0x9E71: 0xF0D7, + 0x9E72: 0xFB73, + 0x9E73: 0xF0D9, + 0x9E74: 0xFB74, + 0x9E75: 0xFB75, + 0x9E76: 0xFB76, + 0x9E77: 0xFB77, + 0x9E78: 0xFB78, + 0x9E79: 0xFB79, + 0x9E7A: 0xFB7A, + 0x9E7B: 0xFB7B, + 0x9E7C: 0xFB7C, + 0x9E7D: 0xFB7D, + 0x9E7E: 0xF5BA, + 0x9E7F: 0xC2B9, + 0x9E80: 0xFB7E, + 0x9E81: 0xFB80, + 0x9E82: 0xF7E4, + 0x9E83: 0xFB81, + 0x9E84: 0xFB82, + 0x9E85: 0xFB83, + 0x9E86: 0xFB84, + 0x9E87: 0xF7E5, + 0x9E88: 0xF7E6, + 0x9E89: 0xFB85, + 0x9E8A: 0xFB86, + 0x9E8B: 0xF7E7, + 0x9E8C: 0xFB87, + 0x9E8D: 0xFB88, + 0x9E8E: 0xFB89, + 0x9E8F: 0xFB8A, + 0x9E90: 0xFB8B, + 0x9E91: 0xFB8C, + 0x9E92: 0xF7E8, + 0x9E93: 0xC2B4, + 0x9E94: 0xFB8D, + 0x9E95: 0xFB8E, + 0x9E96: 0xFB8F, + 0x9E97: 0xFB90, + 0x9E98: 0xFB91, + 0x9E99: 0xFB92, + 0x9E9A: 0xFB93, + 0x9E9B: 0xFB94, + 0x9E9C: 0xFB95, + 0x9E9D: 0xF7EA, + 0x9E9E: 0xFB96, + 0x9E9F: 0xF7EB, + 0x9EA0: 0xFB97, + 0x9EA1: 0xFB98, + 0x9EA2: 0xFB99, + 0x9EA3: 0xFB9A, + 0x9EA4: 0xFB9B, + 0x9EA5: 0xFB9C, + 0x9EA6: 0xC2F3, + 0x9EA7: 0xFB9D, + 0x9EA8: 0xFB9E, + 0x9EA9: 0xFB9F, + 0x9EAA: 0xFBA0, + 0x9EAB: 0xFC40, + 0x9EAC: 0xFC41, + 0x9EAD: 0xFC42, + 0x9EAE: 0xFC43, + 0x9EAF: 0xFC44, + 0x9EB0: 0xFC45, + 0x9EB1: 0xFC46, + 0x9EB2: 0xFC47, + 0x9EB3: 0xFC48, + 0x9EB4: 0xF4F0, + 0x9EB5: 0xFC49, + 0x9EB6: 0xFC4A, + 0x9EB7: 0xFC4B, + 0x9EB8: 0xF4EF, + 0x9EB9: 0xFC4C, + 0x9EBA: 0xFC4D, + 0x9EBB: 0xC2E9, + 0x9EBC: 0xFC4E, + 0x9EBD: 0xF7E1, + 0x9EBE: 0xF7E2, + 0x9EBF: 0xFC4F, + 0x9EC0: 0xFC50, + 0x9EC1: 0xFC51, + 0x9EC2: 0xFC52, + 0x9EC3: 0xFC53, + 0x9EC4: 0xBBC6, + 0x9EC5: 0xFC54, + 0x9EC6: 0xFC55, + 0x9EC7: 0xFC56, + 0x9EC8: 0xFC57, + 0x9EC9: 0xD9E4, + 0x9ECA: 0xFC58, + 0x9ECB: 0xFC59, + 0x9ECC: 0xFC5A, + 0x9ECD: 0xCAF2, + 0x9ECE: 0xC0E8, + 0x9ECF: 0xF0A4, + 0x9ED0: 0xFC5B, + 0x9ED1: 0xBADA, + 0x9ED2: 0xFC5C, + 0x9ED3: 0xFC5D, + 0x9ED4: 0xC7AD, + 0x9ED5: 0xFC5E, + 0x9ED6: 0xFC5F, + 0x9ED7: 0xFC60, + 0x9ED8: 0xC4AC, + 0x9ED9: 0xFC61, + 0x9EDA: 0xFC62, + 0x9EDB: 0xF7EC, + 0x9EDC: 0xF7ED, + 0x9EDD: 0xF7EE, + 0x9EDE: 0xFC63, + 0x9EDF: 0xF7F0, + 0x9EE0: 0xF7EF, + 0x9EE1: 0xFC64, + 0x9EE2: 0xF7F1, + 0x9EE3: 0xFC65, + 0x9EE4: 0xFC66, + 0x9EE5: 0xF7F4, + 0x9EE6: 0xFC67, + 0x9EE7: 0xF7F3, + 0x9EE8: 0xFC68, + 0x9EE9: 0xF7F2, + 0x9EEA: 0xF7F5, + 0x9EEB: 0xFC69, + 0x9EEC: 0xFC6A, + 0x9EED: 0xFC6B, + 0x9EEE: 0xFC6C, + 0x9EEF: 0xF7F6, + 0x9EF0: 0xFC6D, + 0x9EF1: 0xFC6E, + 0x9EF2: 0xFC6F, + 0x9EF3: 0xFC70, + 0x9EF4: 0xFC71, + 0x9EF5: 0xFC72, + 0x9EF6: 0xFC73, + 0x9EF7: 0xFC74, + 0x9EF8: 0xFC75, + 0x9EF9: 0xEDE9, + 0x9EFA: 0xFC76, + 0x9EFB: 0xEDEA, + 0x9EFC: 0xEDEB, + 0x9EFD: 0xFC77, + 0x9EFE: 0xF6BC, + 0x9EFF: 0xFC78, + 0x9F00: 0xFC79, + 0x9F01: 0xFC7A, + 0x9F02: 0xFC7B, + 0x9F03: 0xFC7C, + 0x9F04: 0xFC7D, + 0x9F05: 0xFC7E, + 0x9F06: 0xFC80, + 0x9F07: 0xFC81, + 0x9F08: 0xFC82, + 0x9F09: 0xFC83, + 0x9F0A: 0xFC84, + 0x9F0B: 0xF6BD, + 0x9F0C: 0xFC85, + 0x9F0D: 0xF6BE, + 0x9F0E: 0xB6A6, + 0x9F0F: 0xFC86, + 0x9F10: 0xD8BE, + 0x9F11: 0xFC87, + 0x9F12: 0xFC88, + 0x9F13: 0xB9C4, + 0x9F14: 0xFC89, + 0x9F15: 0xFC8A, + 0x9F16: 0xFC8B, + 0x9F17: 0xD8BB, + 0x9F18: 0xFC8C, + 0x9F19: 0xDCB1, + 0x9F1A: 0xFC8D, + 0x9F1B: 0xFC8E, + 0x9F1C: 0xFC8F, + 0x9F1D: 0xFC90, + 0x9F1E: 0xFC91, + 0x9F1F: 0xFC92, + 0x9F20: 0xCAF3, + 0x9F21: 0xFC93, + 0x9F22: 0xF7F7, + 0x9F23: 0xFC94, + 0x9F24: 0xFC95, + 0x9F25: 0xFC96, + 0x9F26: 0xFC97, + 0x9F27: 0xFC98, + 0x9F28: 0xFC99, + 0x9F29: 0xFC9A, + 0x9F2A: 0xFC9B, + 0x9F2B: 0xFC9C, + 0x9F2C: 0xF7F8, + 0x9F2D: 0xFC9D, + 0x9F2E: 0xFC9E, + 0x9F2F: 0xF7F9, + 0x9F30: 0xFC9F, + 0x9F31: 0xFCA0, + 0x9F32: 0xFD40, + 0x9F33: 0xFD41, + 0x9F34: 0xFD42, + 0x9F35: 0xFD43, + 0x9F36: 0xFD44, + 0x9F37: 0xF7FB, + 0x9F38: 0xFD45, + 0x9F39: 0xF7FA, + 0x9F3A: 0xFD46, + 0x9F3B: 0xB1C7, + 0x9F3C: 0xFD47, + 0x9F3D: 0xF7FC, + 0x9F3E: 0xF7FD, + 0x9F3F: 0xFD48, + 0x9F40: 0xFD49, + 0x9F41: 0xFD4A, + 0x9F42: 0xFD4B, + 0x9F43: 0xFD4C, + 0x9F44: 0xF7FE, + 0x9F45: 0xFD4D, + 0x9F46: 0xFD4E, + 0x9F47: 0xFD4F, + 0x9F48: 0xFD50, + 0x9F49: 0xFD51, + 0x9F4A: 0xFD52, + 0x9F4B: 0xFD53, + 0x9F4C: 0xFD54, + 0x9F4D: 0xFD55, + 0x9F4E: 0xFD56, + 0x9F4F: 0xFD57, + 0x9F50: 0xC6EB, + 0x9F51: 0xECB4, + 0x9F52: 0xFD58, + 0x9F53: 0xFD59, + 0x9F54: 0xFD5A, + 0x9F55: 0xFD5B, + 0x9F56: 0xFD5C, + 0x9F57: 0xFD5D, + 0x9F58: 0xFD5E, + 0x9F59: 0xFD5F, + 0x9F5A: 0xFD60, + 0x9F5B: 0xFD61, + 0x9F5C: 0xFD62, + 0x9F5D: 0xFD63, + 0x9F5E: 0xFD64, + 0x9F5F: 0xFD65, + 0x9F60: 0xFD66, + 0x9F61: 0xFD67, + 0x9F62: 0xFD68, + 0x9F63: 0xFD69, + 0x9F64: 0xFD6A, + 0x9F65: 0xFD6B, + 0x9F66: 0xFD6C, + 0x9F67: 0xFD6D, + 0x9F68: 0xFD6E, + 0x9F69: 0xFD6F, + 0x9F6A: 0xFD70, + 0x9F6B: 0xFD71, + 0x9F6C: 0xFD72, + 0x9F6D: 0xFD73, + 0x9F6E: 0xFD74, + 0x9F6F: 0xFD75, + 0x9F70: 0xFD76, + 0x9F71: 0xFD77, + 0x9F72: 0xFD78, + 0x9F73: 0xFD79, + 0x9F74: 0xFD7A, + 0x9F75: 0xFD7B, + 0x9F76: 0xFD7C, + 0x9F77: 0xFD7D, + 0x9F78: 0xFD7E, + 0x9F79: 0xFD80, + 0x9F7A: 0xFD81, + 0x9F7B: 0xFD82, + 0x9F7C: 0xFD83, + 0x9F7D: 0xFD84, + 0x9F7E: 0xFD85, + 0x9F7F: 0xB3DD, + 0x9F80: 0xF6B3, + 0x9F81: 0xFD86, + 0x9F82: 0xFD87, + 0x9F83: 0xF6B4, + 0x9F84: 0xC1E4, + 0x9F85: 0xF6B5, + 0x9F86: 0xF6B6, + 0x9F87: 0xF6B7, + 0x9F88: 0xF6B8, + 0x9F89: 0xF6B9, + 0x9F8A: 0xF6BA, + 0x9F8B: 0xC8A3, + 0x9F8C: 0xF6BB, + 0x9F8D: 0xFD88, + 0x9F8E: 0xFD89, + 0x9F8F: 0xFD8A, + 0x9F90: 0xFD8B, + 0x9F91: 0xFD8C, + 0x9F92: 0xFD8D, + 0x9F93: 0xFD8E, + 0x9F94: 0xFD8F, + 0x9F95: 0xFD90, + 0x9F96: 0xFD91, + 0x9F97: 0xFD92, + 0x9F98: 0xFD93, + 0x9F99: 0xC1FA, + 0x9F9A: 0xB9A8, + 0x9F9B: 0xEDE8, + 0x9F9C: 0xFD94, + 0x9F9D: 0xFD95, + 0x9F9E: 0xFD96, + 0x9F9F: 0xB9EA, + 0x9FA0: 0xD9DF, + 0x9FA1: 0xFD97, + 0x9FA2: 0xFD98, + 0x9FA3: 0xFD99, + 0x9FA4: 0xFD9A, + 0x9FA5: 0xFD9B, + 0x9FB4: 0xFE59, + 0x9FB5: 0xFE61, + 0x9FB6: 0xFE66, + 0x9FB7: 0xFE67, + 0x9FB8: 0xFE6D, + 0x9FB9: 0xFE7E, + 0x9FBA: 0xFE90, + 0x9FBB: 0xFEA0, + 0xE000: 0xAAA1, + 0xE001: 0xAAA2, + 0xE002: 0xAAA3, + 0xE003: 0xAAA4, + 0xE004: 0xAAA5, + 0xE005: 0xAAA6, + 0xE006: 0xAAA7, + 0xE007: 0xAAA8, + 0xE008: 0xAAA9, + 0xE009: 0xAAAA, + 0xE00A: 0xAAAB, + 0xE00B: 0xAAAC, + 0xE00C: 0xAAAD, + 0xE00D: 0xAAAE, + 0xE00E: 0xAAAF, + 0xE00F: 0xAAB0, + 0xE010: 0xAAB1, + 0xE011: 0xAAB2, + 0xE012: 0xAAB3, + 0xE013: 0xAAB4, + 0xE014: 0xAAB5, + 0xE015: 0xAAB6, + 0xE016: 0xAAB7, + 0xE017: 0xAAB8, + 0xE018: 0xAAB9, + 0xE019: 0xAABA, + 0xE01A: 0xAABB, + 0xE01B: 0xAABC, + 0xE01C: 0xAABD, + 0xE01D: 0xAABE, + 0xE01E: 0xAABF, + 0xE01F: 0xAAC0, + 0xE020: 0xAAC1, + 0xE021: 0xAAC2, + 0xE022: 0xAAC3, + 0xE023: 0xAAC4, + 0xE024: 0xAAC5, + 0xE025: 0xAAC6, + 0xE026: 0xAAC7, + 0xE027: 0xAAC8, + 0xE028: 0xAAC9, + 0xE029: 0xAACA, + 0xE02A: 0xAACB, + 0xE02B: 0xAACC, + 0xE02C: 0xAACD, + 0xE02D: 0xAACE, + 0xE02E: 0xAACF, + 0xE02F: 0xAAD0, + 0xE030: 0xAAD1, + 0xE031: 0xAAD2, + 0xE032: 0xAAD3, + 0xE033: 0xAAD4, + 0xE034: 0xAAD5, + 0xE035: 0xAAD6, + 0xE036: 0xAAD7, + 0xE037: 0xAAD8, + 0xE038: 0xAAD9, + 0xE039: 0xAADA, + 0xE03A: 0xAADB, + 0xE03B: 0xAADC, + 0xE03C: 0xAADD, + 0xE03D: 0xAADE, + 0xE03E: 0xAADF, + 0xE03F: 0xAAE0, + 0xE040: 0xAAE1, + 0xE041: 0xAAE2, + 0xE042: 0xAAE3, + 0xE043: 0xAAE4, + 0xE044: 0xAAE5, + 0xE045: 0xAAE6, + 0xE046: 0xAAE7, + 0xE047: 0xAAE8, + 0xE048: 0xAAE9, + 0xE049: 0xAAEA, + 0xE04A: 0xAAEB, + 0xE04B: 0xAAEC, + 0xE04C: 0xAAED, + 0xE04D: 0xAAEE, + 0xE04E: 0xAAEF, + 0xE04F: 0xAAF0, + 0xE050: 0xAAF1, + 0xE051: 0xAAF2, + 0xE052: 0xAAF3, + 0xE053: 0xAAF4, + 0xE054: 0xAAF5, + 0xE055: 0xAAF6, + 0xE056: 0xAAF7, + 0xE057: 0xAAF8, + 0xE058: 0xAAF9, + 0xE059: 0xAAFA, + 0xE05A: 0xAAFB, + 0xE05B: 0xAAFC, + 0xE05C: 0xAAFD, + 0xE05D: 0xAAFE, + 0xE05E: 0xABA1, + 0xE05F: 0xABA2, + 0xE060: 0xABA3, + 0xE061: 0xABA4, + 0xE062: 0xABA5, + 0xE063: 0xABA6, + 0xE064: 0xABA7, + 0xE065: 0xABA8, + 0xE066: 0xABA9, + 0xE067: 0xABAA, + 0xE068: 0xABAB, + 0xE069: 0xABAC, + 0xE06A: 0xABAD, + 0xE06B: 0xABAE, + 0xE06C: 0xABAF, + 0xE06D: 0xABB0, + 0xE06E: 0xABB1, + 0xE06F: 0xABB2, + 0xE070: 0xABB3, + 0xE071: 0xABB4, + 0xE072: 0xABB5, + 0xE073: 0xABB6, + 0xE074: 0xABB7, + 0xE075: 0xABB8, + 0xE076: 0xABB9, + 0xE077: 0xABBA, + 0xE078: 0xABBB, + 0xE079: 0xABBC, + 0xE07A: 0xABBD, + 0xE07B: 0xABBE, + 0xE07C: 0xABBF, + 0xE07D: 0xABC0, + 0xE07E: 0xABC1, + 0xE07F: 0xABC2, + 0xE080: 0xABC3, + 0xE081: 0xABC4, + 0xE082: 0xABC5, + 0xE083: 0xABC6, + 0xE084: 0xABC7, + 0xE085: 0xABC8, + 0xE086: 0xABC9, + 0xE087: 0xABCA, + 0xE088: 0xABCB, + 0xE089: 0xABCC, + 0xE08A: 0xABCD, + 0xE08B: 0xABCE, + 0xE08C: 0xABCF, + 0xE08D: 0xABD0, + 0xE08E: 0xABD1, + 0xE08F: 0xABD2, + 0xE090: 0xABD3, + 0xE091: 0xABD4, + 0xE092: 0xABD5, + 0xE093: 0xABD6, + 0xE094: 0xABD7, + 0xE095: 0xABD8, + 0xE096: 0xABD9, + 0xE097: 0xABDA, + 0xE098: 0xABDB, + 0xE099: 0xABDC, + 0xE09A: 0xABDD, + 0xE09B: 0xABDE, + 0xE09C: 0xABDF, + 0xE09D: 0xABE0, + 0xE09E: 0xABE1, + 0xE09F: 0xABE2, + 0xE0A0: 0xABE3, + 0xE0A1: 0xABE4, + 0xE0A2: 0xABE5, + 0xE0A3: 0xABE6, + 0xE0A4: 0xABE7, + 0xE0A5: 0xABE8, + 0xE0A6: 0xABE9, + 0xE0A7: 0xABEA, + 0xE0A8: 0xABEB, + 0xE0A9: 0xABEC, + 0xE0AA: 0xABED, + 0xE0AB: 0xABEE, + 0xE0AC: 0xABEF, + 0xE0AD: 0xABF0, + 0xE0AE: 0xABF1, + 0xE0AF: 0xABF2, + 0xE0B0: 0xABF3, + 0xE0B1: 0xABF4, + 0xE0B2: 0xABF5, + 0xE0B3: 0xABF6, + 0xE0B4: 0xABF7, + 0xE0B5: 0xABF8, + 0xE0B6: 0xABF9, + 0xE0B7: 0xABFA, + 0xE0B8: 0xABFB, + 0xE0B9: 0xABFC, + 0xE0BA: 0xABFD, + 0xE0BB: 0xABFE, + 0xE0BC: 0xACA1, + 0xE0BD: 0xACA2, + 0xE0BE: 0xACA3, + 0xE0BF: 0xACA4, + 0xE0C0: 0xACA5, + 0xE0C1: 0xACA6, + 0xE0C2: 0xACA7, + 0xE0C3: 0xACA8, + 0xE0C4: 0xACA9, + 0xE0C5: 0xACAA, + 0xE0C6: 0xACAB, + 0xE0C7: 0xACAC, + 0xE0C8: 0xACAD, + 0xE0C9: 0xACAE, + 0xE0CA: 0xACAF, + 0xE0CB: 0xACB0, + 0xE0CC: 0xACB1, + 0xE0CD: 0xACB2, + 0xE0CE: 0xACB3, + 0xE0CF: 0xACB4, + 0xE0D0: 0xACB5, + 0xE0D1: 0xACB6, + 0xE0D2: 0xACB7, + 0xE0D3: 0xACB8, + 0xE0D4: 0xACB9, + 0xE0D5: 0xACBA, + 0xE0D6: 0xACBB, + 0xE0D7: 0xACBC, + 0xE0D8: 0xACBD, + 0xE0D9: 0xACBE, + 0xE0DA: 0xACBF, + 0xE0DB: 0xACC0, + 0xE0DC: 0xACC1, + 0xE0DD: 0xACC2, + 0xE0DE: 0xACC3, + 0xE0DF: 0xACC4, + 0xE0E0: 0xACC5, + 0xE0E1: 0xACC6, + 0xE0E2: 0xACC7, + 0xE0E3: 0xACC8, + 0xE0E4: 0xACC9, + 0xE0E5: 0xACCA, + 0xE0E6: 0xACCB, + 0xE0E7: 0xACCC, + 0xE0E8: 0xACCD, + 0xE0E9: 0xACCE, + 0xE0EA: 0xACCF, + 0xE0EB: 0xACD0, + 0xE0EC: 0xACD1, + 0xE0ED: 0xACD2, + 0xE0EE: 0xACD3, + 0xE0EF: 0xACD4, + 0xE0F0: 0xACD5, + 0xE0F1: 0xACD6, + 0xE0F2: 0xACD7, + 0xE0F3: 0xACD8, + 0xE0F4: 0xACD9, + 0xE0F5: 0xACDA, + 0xE0F6: 0xACDB, + 0xE0F7: 0xACDC, + 0xE0F8: 0xACDD, + 0xE0F9: 0xACDE, + 0xE0FA: 0xACDF, + 0xE0FB: 0xACE0, + 0xE0FC: 0xACE1, + 0xE0FD: 0xACE2, + 0xE0FE: 0xACE3, + 0xE0FF: 0xACE4, + 0xE100: 0xACE5, + 0xE101: 0xACE6, + 0xE102: 0xACE7, + 0xE103: 0xACE8, + 0xE104: 0xACE9, + 0xE105: 0xACEA, + 0xE106: 0xACEB, + 0xE107: 0xACEC, + 0xE108: 0xACED, + 0xE109: 0xACEE, + 0xE10A: 0xACEF, + 0xE10B: 0xACF0, + 0xE10C: 0xACF1, + 0xE10D: 0xACF2, + 0xE10E: 0xACF3, + 0xE10F: 0xACF4, + 0xE110: 0xACF5, + 0xE111: 0xACF6, + 0xE112: 0xACF7, + 0xE113: 0xACF8, + 0xE114: 0xACF9, + 0xE115: 0xACFA, + 0xE116: 0xACFB, + 0xE117: 0xACFC, + 0xE118: 0xACFD, + 0xE119: 0xACFE, + 0xE11A: 0xADA1, + 0xE11B: 0xADA2, + 0xE11C: 0xADA3, + 0xE11D: 0xADA4, + 0xE11E: 0xADA5, + 0xE11F: 0xADA6, + 0xE120: 0xADA7, + 0xE121: 0xADA8, + 0xE122: 0xADA9, + 0xE123: 0xADAA, + 0xE124: 0xADAB, + 0xE125: 0xADAC, + 0xE126: 0xADAD, + 0xE127: 0xADAE, + 0xE128: 0xADAF, + 0xE129: 0xADB0, + 0xE12A: 0xADB1, + 0xE12B: 0xADB2, + 0xE12C: 0xADB3, + 0xE12D: 0xADB4, + 0xE12E: 0xADB5, + 0xE12F: 0xADB6, + 0xE130: 0xADB7, + 0xE131: 0xADB8, + 0xE132: 0xADB9, + 0xE133: 0xADBA, + 0xE134: 0xADBB, + 0xE135: 0xADBC, + 0xE136: 0xADBD, + 0xE137: 0xADBE, + 0xE138: 0xADBF, + 0xE139: 0xADC0, + 0xE13A: 0xADC1, + 0xE13B: 0xADC2, + 0xE13C: 0xADC3, + 0xE13D: 0xADC4, + 0xE13E: 0xADC5, + 0xE13F: 0xADC6, + 0xE140: 0xADC7, + 0xE141: 0xADC8, + 0xE142: 0xADC9, + 0xE143: 0xADCA, + 0xE144: 0xADCB, + 0xE145: 0xADCC, + 0xE146: 0xADCD, + 0xE147: 0xADCE, + 0xE148: 0xADCF, + 0xE149: 0xADD0, + 0xE14A: 0xADD1, + 0xE14B: 0xADD2, + 0xE14C: 0xADD3, + 0xE14D: 0xADD4, + 0xE14E: 0xADD5, + 0xE14F: 0xADD6, + 0xE150: 0xADD7, + 0xE151: 0xADD8, + 0xE152: 0xADD9, + 0xE153: 0xADDA, + 0xE154: 0xADDB, + 0xE155: 0xADDC, + 0xE156: 0xADDD, + 0xE157: 0xADDE, + 0xE158: 0xADDF, + 0xE159: 0xADE0, + 0xE15A: 0xADE1, + 0xE15B: 0xADE2, + 0xE15C: 0xADE3, + 0xE15D: 0xADE4, + 0xE15E: 0xADE5, + 0xE15F: 0xADE6, + 0xE160: 0xADE7, + 0xE161: 0xADE8, + 0xE162: 0xADE9, + 0xE163: 0xADEA, + 0xE164: 0xADEB, + 0xE165: 0xADEC, + 0xE166: 0xADED, + 0xE167: 0xADEE, + 0xE168: 0xADEF, + 0xE169: 0xADF0, + 0xE16A: 0xADF1, + 0xE16B: 0xADF2, + 0xE16C: 0xADF3, + 0xE16D: 0xADF4, + 0xE16E: 0xADF5, + 0xE16F: 0xADF6, + 0xE170: 0xADF7, + 0xE171: 0xADF8, + 0xE172: 0xADF9, + 0xE173: 0xADFA, + 0xE174: 0xADFB, + 0xE175: 0xADFC, + 0xE176: 0xADFD, + 0xE177: 0xADFE, + 0xE178: 0xAEA1, + 0xE179: 0xAEA2, + 0xE17A: 0xAEA3, + 0xE17B: 0xAEA4, + 0xE17C: 0xAEA5, + 0xE17D: 0xAEA6, + 0xE17E: 0xAEA7, + 0xE17F: 0xAEA8, + 0xE180: 0xAEA9, + 0xE181: 0xAEAA, + 0xE182: 0xAEAB, + 0xE183: 0xAEAC, + 0xE184: 0xAEAD, + 0xE185: 0xAEAE, + 0xE186: 0xAEAF, + 0xE187: 0xAEB0, + 0xE188: 0xAEB1, + 0xE189: 0xAEB2, + 0xE18A: 0xAEB3, + 0xE18B: 0xAEB4, + 0xE18C: 0xAEB5, + 0xE18D: 0xAEB6, + 0xE18E: 0xAEB7, + 0xE18F: 0xAEB8, + 0xE190: 0xAEB9, + 0xE191: 0xAEBA, + 0xE192: 0xAEBB, + 0xE193: 0xAEBC, + 0xE194: 0xAEBD, + 0xE195: 0xAEBE, + 0xE196: 0xAEBF, + 0xE197: 0xAEC0, + 0xE198: 0xAEC1, + 0xE199: 0xAEC2, + 0xE19A: 0xAEC3, + 0xE19B: 0xAEC4, + 0xE19C: 0xAEC5, + 0xE19D: 0xAEC6, + 0xE19E: 0xAEC7, + 0xE19F: 0xAEC8, + 0xE1A0: 0xAEC9, + 0xE1A1: 0xAECA, + 0xE1A2: 0xAECB, + 0xE1A3: 0xAECC, + 0xE1A4: 0xAECD, + 0xE1A5: 0xAECE, + 0xE1A6: 0xAECF, + 0xE1A7: 0xAED0, + 0xE1A8: 0xAED1, + 0xE1A9: 0xAED2, + 0xE1AA: 0xAED3, + 0xE1AB: 0xAED4, + 0xE1AC: 0xAED5, + 0xE1AD: 0xAED6, + 0xE1AE: 0xAED7, + 0xE1AF: 0xAED8, + 0xE1B0: 0xAED9, + 0xE1B1: 0xAEDA, + 0xE1B2: 0xAEDB, + 0xE1B3: 0xAEDC, + 0xE1B4: 0xAEDD, + 0xE1B5: 0xAEDE, + 0xE1B6: 0xAEDF, + 0xE1B7: 0xAEE0, + 0xE1B8: 0xAEE1, + 0xE1B9: 0xAEE2, + 0xE1BA: 0xAEE3, + 0xE1BB: 0xAEE4, + 0xE1BC: 0xAEE5, + 0xE1BD: 0xAEE6, + 0xE1BE: 0xAEE7, + 0xE1BF: 0xAEE8, + 0xE1C0: 0xAEE9, + 0xE1C1: 0xAEEA, + 0xE1C2: 0xAEEB, + 0xE1C3: 0xAEEC, + 0xE1C4: 0xAEED, + 0xE1C5: 0xAEEE, + 0xE1C6: 0xAEEF, + 0xE1C7: 0xAEF0, + 0xE1C8: 0xAEF1, + 0xE1C9: 0xAEF2, + 0xE1CA: 0xAEF3, + 0xE1CB: 0xAEF4, + 0xE1CC: 0xAEF5, + 0xE1CD: 0xAEF6, + 0xE1CE: 0xAEF7, + 0xE1CF: 0xAEF8, + 0xE1D0: 0xAEF9, + 0xE1D1: 0xAEFA, + 0xE1D2: 0xAEFB, + 0xE1D3: 0xAEFC, + 0xE1D4: 0xAEFD, + 0xE1D5: 0xAEFE, + 0xE1D6: 0xAFA1, + 0xE1D7: 0xAFA2, + 0xE1D8: 0xAFA3, + 0xE1D9: 0xAFA4, + 0xE1DA: 0xAFA5, + 0xE1DB: 0xAFA6, + 0xE1DC: 0xAFA7, + 0xE1DD: 0xAFA8, + 0xE1DE: 0xAFA9, + 0xE1DF: 0xAFAA, + 0xE1E0: 0xAFAB, + 0xE1E1: 0xAFAC, + 0xE1E2: 0xAFAD, + 0xE1E3: 0xAFAE, + 0xE1E4: 0xAFAF, + 0xE1E5: 0xAFB0, + 0xE1E6: 0xAFB1, + 0xE1E7: 0xAFB2, + 0xE1E8: 0xAFB3, + 0xE1E9: 0xAFB4, + 0xE1EA: 0xAFB5, + 0xE1EB: 0xAFB6, + 0xE1EC: 0xAFB7, + 0xE1ED: 0xAFB8, + 0xE1EE: 0xAFB9, + 0xE1EF: 0xAFBA, + 0xE1F0: 0xAFBB, + 0xE1F1: 0xAFBC, + 0xE1F2: 0xAFBD, + 0xE1F3: 0xAFBE, + 0xE1F4: 0xAFBF, + 0xE1F5: 0xAFC0, + 0xE1F6: 0xAFC1, + 0xE1F7: 0xAFC2, + 0xE1F8: 0xAFC3, + 0xE1F9: 0xAFC4, + 0xE1FA: 0xAFC5, + 0xE1FB: 0xAFC6, + 0xE1FC: 0xAFC7, + 0xE1FD: 0xAFC8, + 0xE1FE: 0xAFC9, + 0xE1FF: 0xAFCA, + 0xE200: 0xAFCB, + 0xE201: 0xAFCC, + 0xE202: 0xAFCD, + 0xE203: 0xAFCE, + 0xE204: 0xAFCF, + 0xE205: 0xAFD0, + 0xE206: 0xAFD1, + 0xE207: 0xAFD2, + 0xE208: 0xAFD3, + 0xE209: 0xAFD4, + 0xE20A: 0xAFD5, + 0xE20B: 0xAFD6, + 0xE20C: 0xAFD7, + 0xE20D: 0xAFD8, + 0xE20E: 0xAFD9, + 0xE20F: 0xAFDA, + 0xE210: 0xAFDB, + 0xE211: 0xAFDC, + 0xE212: 0xAFDD, + 0xE213: 0xAFDE, + 0xE214: 0xAFDF, + 0xE215: 0xAFE0, + 0xE216: 0xAFE1, + 0xE217: 0xAFE2, + 0xE218: 0xAFE3, + 0xE219: 0xAFE4, + 0xE21A: 0xAFE5, + 0xE21B: 0xAFE6, + 0xE21C: 0xAFE7, + 0xE21D: 0xAFE8, + 0xE21E: 0xAFE9, + 0xE21F: 0xAFEA, + 0xE220: 0xAFEB, + 0xE221: 0xAFEC, + 0xE222: 0xAFED, + 0xE223: 0xAFEE, + 0xE224: 0xAFEF, + 0xE225: 0xAFF0, + 0xE226: 0xAFF1, + 0xE227: 0xAFF2, + 0xE228: 0xAFF3, + 0xE229: 0xAFF4, + 0xE22A: 0xAFF5, + 0xE22B: 0xAFF6, + 0xE22C: 0xAFF7, + 0xE22D: 0xAFF8, + 0xE22E: 0xAFF9, + 0xE22F: 0xAFFA, + 0xE230: 0xAFFB, + 0xE231: 0xAFFC, + 0xE232: 0xAFFD, + 0xE233: 0xAFFE, + 0xE234: 0xF8A1, + 0xE235: 0xF8A2, + 0xE236: 0xF8A3, + 0xE237: 0xF8A4, + 0xE238: 0xF8A5, + 0xE239: 0xF8A6, + 0xE23A: 0xF8A7, + 0xE23B: 0xF8A8, + 0xE23C: 0xF8A9, + 0xE23D: 0xF8AA, + 0xE23E: 0xF8AB, + 0xE23F: 0xF8AC, + 0xE240: 0xF8AD, + 0xE241: 0xF8AE, + 0xE242: 0xF8AF, + 0xE243: 0xF8B0, + 0xE244: 0xF8B1, + 0xE245: 0xF8B2, + 0xE246: 0xF8B3, + 0xE247: 0xF8B4, + 0xE248: 0xF8B5, + 0xE249: 0xF8B6, + 0xE24A: 0xF8B7, + 0xE24B: 0xF8B8, + 0xE24C: 0xF8B9, + 0xE24D: 0xF8BA, + 0xE24E: 0xF8BB, + 0xE24F: 0xF8BC, + 0xE250: 0xF8BD, + 0xE251: 0xF8BE, + 0xE252: 0xF8BF, + 0xE253: 0xF8C0, + 0xE254: 0xF8C1, + 0xE255: 0xF8C2, + 0xE256: 0xF8C3, + 0xE257: 0xF8C4, + 0xE258: 0xF8C5, + 0xE259: 0xF8C6, + 0xE25A: 0xF8C7, + 0xE25B: 0xF8C8, + 0xE25C: 0xF8C9, + 0xE25D: 0xF8CA, + 0xE25E: 0xF8CB, + 0xE25F: 0xF8CC, + 0xE260: 0xF8CD, + 0xE261: 0xF8CE, + 0xE262: 0xF8CF, + 0xE263: 0xF8D0, + 0xE264: 0xF8D1, + 0xE265: 0xF8D2, + 0xE266: 0xF8D3, + 0xE267: 0xF8D4, + 0xE268: 0xF8D5, + 0xE269: 0xF8D6, + 0xE26A: 0xF8D7, + 0xE26B: 0xF8D8, + 0xE26C: 0xF8D9, + 0xE26D: 0xF8DA, + 0xE26E: 0xF8DB, + 0xE26F: 0xF8DC, + 0xE270: 0xF8DD, + 0xE271: 0xF8DE, + 0xE272: 0xF8DF, + 0xE273: 0xF8E0, + 0xE274: 0xF8E1, + 0xE275: 0xF8E2, + 0xE276: 0xF8E3, + 0xE277: 0xF8E4, + 0xE278: 0xF8E5, + 0xE279: 0xF8E6, + 0xE27A: 0xF8E7, + 0xE27B: 0xF8E8, + 0xE27C: 0xF8E9, + 0xE27D: 0xF8EA, + 0xE27E: 0xF8EB, + 0xE27F: 0xF8EC, + 0xE280: 0xF8ED, + 0xE281: 0xF8EE, + 0xE282: 0xF8EF, + 0xE283: 0xF8F0, + 0xE284: 0xF8F1, + 0xE285: 0xF8F2, + 0xE286: 0xF8F3, + 0xE287: 0xF8F4, + 0xE288: 0xF8F5, + 0xE289: 0xF8F6, + 0xE28A: 0xF8F7, + 0xE28B: 0xF8F8, + 0xE28C: 0xF8F9, + 0xE28D: 0xF8FA, + 0xE28E: 0xF8FB, + 0xE28F: 0xF8FC, + 0xE290: 0xF8FD, + 0xE291: 0xF8FE, + 0xE292: 0xF9A1, + 0xE293: 0xF9A2, + 0xE294: 0xF9A3, + 0xE295: 0xF9A4, + 0xE296: 0xF9A5, + 0xE297: 0xF9A6, + 0xE298: 0xF9A7, + 0xE299: 0xF9A8, + 0xE29A: 0xF9A9, + 0xE29B: 0xF9AA, + 0xE29C: 0xF9AB, + 0xE29D: 0xF9AC, + 0xE29E: 0xF9AD, + 0xE29F: 0xF9AE, + 0xE2A0: 0xF9AF, + 0xE2A1: 0xF9B0, + 0xE2A2: 0xF9B1, + 0xE2A3: 0xF9B2, + 0xE2A4: 0xF9B3, + 0xE2A5: 0xF9B4, + 0xE2A6: 0xF9B5, + 0xE2A7: 0xF9B6, + 0xE2A8: 0xF9B7, + 0xE2A9: 0xF9B8, + 0xE2AA: 0xF9B9, + 0xE2AB: 0xF9BA, + 0xE2AC: 0xF9BB, + 0xE2AD: 0xF9BC, + 0xE2AE: 0xF9BD, + 0xE2AF: 0xF9BE, + 0xE2B0: 0xF9BF, + 0xE2B1: 0xF9C0, + 0xE2B2: 0xF9C1, + 0xE2B3: 0xF9C2, + 0xE2B4: 0xF9C3, + 0xE2B5: 0xF9C4, + 0xE2B6: 0xF9C5, + 0xE2B7: 0xF9C6, + 0xE2B8: 0xF9C7, + 0xE2B9: 0xF9C8, + 0xE2BA: 0xF9C9, + 0xE2BB: 0xF9CA, + 0xE2BC: 0xF9CB, + 0xE2BD: 0xF9CC, + 0xE2BE: 0xF9CD, + 0xE2BF: 0xF9CE, + 0xE2C0: 0xF9CF, + 0xE2C1: 0xF9D0, + 0xE2C2: 0xF9D1, + 0xE2C3: 0xF9D2, + 0xE2C4: 0xF9D3, + 0xE2C5: 0xF9D4, + 0xE2C6: 0xF9D5, + 0xE2C7: 0xF9D6, + 0xE2C8: 0xF9D7, + 0xE2C9: 0xF9D8, + 0xE2CA: 0xF9D9, + 0xE2CB: 0xF9DA, + 0xE2CC: 0xF9DB, + 0xE2CD: 0xF9DC, + 0xE2CE: 0xF9DD, + 0xE2CF: 0xF9DE, + 0xE2D0: 0xF9DF, + 0xE2D1: 0xF9E0, + 0xE2D2: 0xF9E1, + 0xE2D3: 0xF9E2, + 0xE2D4: 0xF9E3, + 0xE2D5: 0xF9E4, + 0xE2D6: 0xF9E5, + 0xE2D7: 0xF9E6, + 0xE2D8: 0xF9E7, + 0xE2D9: 0xF9E8, + 0xE2DA: 0xF9E9, + 0xE2DB: 0xF9EA, + 0xE2DC: 0xF9EB, + 0xE2DD: 0xF9EC, + 0xE2DE: 0xF9ED, + 0xE2DF: 0xF9EE, + 0xE2E0: 0xF9EF, + 0xE2E1: 0xF9F0, + 0xE2E2: 0xF9F1, + 0xE2E3: 0xF9F2, + 0xE2E4: 0xF9F3, + 0xE2E5: 0xF9F4, + 0xE2E6: 0xF9F5, + 0xE2E7: 0xF9F6, + 0xE2E8: 0xF9F7, + 0xE2E9: 0xF9F8, + 0xE2EA: 0xF9F9, + 0xE2EB: 0xF9FA, + 0xE2EC: 0xF9FB, + 0xE2ED: 0xF9FC, + 0xE2EE: 0xF9FD, + 0xE2EF: 0xF9FE, + 0xE2F0: 0xFAA1, + 0xE2F1: 0xFAA2, + 0xE2F2: 0xFAA3, + 0xE2F3: 0xFAA4, + 0xE2F4: 0xFAA5, + 0xE2F5: 0xFAA6, + 0xE2F6: 0xFAA7, + 0xE2F7: 0xFAA8, + 0xE2F8: 0xFAA9, + 0xE2F9: 0xFAAA, + 0xE2FA: 0xFAAB, + 0xE2FB: 0xFAAC, + 0xE2FC: 0xFAAD, + 0xE2FD: 0xFAAE, + 0xE2FE: 0xFAAF, + 0xE2FF: 0xFAB0, + 0xE300: 0xFAB1, + 0xE301: 0xFAB2, + 0xE302: 0xFAB3, + 0xE303: 0xFAB4, + 0xE304: 0xFAB5, + 0xE305: 0xFAB6, + 0xE306: 0xFAB7, + 0xE307: 0xFAB8, + 0xE308: 0xFAB9, + 0xE309: 0xFABA, + 0xE30A: 0xFABB, + 0xE30B: 0xFABC, + 0xE30C: 0xFABD, + 0xE30D: 0xFABE, + 0xE30E: 0xFABF, + 0xE30F: 0xFAC0, + 0xE310: 0xFAC1, + 0xE311: 0xFAC2, + 0xE312: 0xFAC3, + 0xE313: 0xFAC4, + 0xE314: 0xFAC5, + 0xE315: 0xFAC6, + 0xE316: 0xFAC7, + 0xE317: 0xFAC8, + 0xE318: 0xFAC9, + 0xE319: 0xFACA, + 0xE31A: 0xFACB, + 0xE31B: 0xFACC, + 0xE31C: 0xFACD, + 0xE31D: 0xFACE, + 0xE31E: 0xFACF, + 0xE31F: 0xFAD0, + 0xE320: 0xFAD1, + 0xE321: 0xFAD2, + 0xE322: 0xFAD3, + 0xE323: 0xFAD4, + 0xE324: 0xFAD5, + 0xE325: 0xFAD6, + 0xE326: 0xFAD7, + 0xE327: 0xFAD8, + 0xE328: 0xFAD9, + 0xE329: 0xFADA, + 0xE32A: 0xFADB, + 0xE32B: 0xFADC, + 0xE32C: 0xFADD, + 0xE32D: 0xFADE, + 0xE32E: 0xFADF, + 0xE32F: 0xFAE0, + 0xE330: 0xFAE1, + 0xE331: 0xFAE2, + 0xE332: 0xFAE3, + 0xE333: 0xFAE4, + 0xE334: 0xFAE5, + 0xE335: 0xFAE6, + 0xE336: 0xFAE7, + 0xE337: 0xFAE8, + 0xE338: 0xFAE9, + 0xE339: 0xFAEA, + 0xE33A: 0xFAEB, + 0xE33B: 0xFAEC, + 0xE33C: 0xFAED, + 0xE33D: 0xFAEE, + 0xE33E: 0xFAEF, + 0xE33F: 0xFAF0, + 0xE340: 0xFAF1, + 0xE341: 0xFAF2, + 0xE342: 0xFAF3, + 0xE343: 0xFAF4, + 0xE344: 0xFAF5, + 0xE345: 0xFAF6, + 0xE346: 0xFAF7, + 0xE347: 0xFAF8, + 0xE348: 0xFAF9, + 0xE349: 0xFAFA, + 0xE34A: 0xFAFB, + 0xE34B: 0xFAFC, + 0xE34C: 0xFAFD, + 0xE34D: 0xFAFE, + 0xE34E: 0xFBA1, + 0xE34F: 0xFBA2, + 0xE350: 0xFBA3, + 0xE351: 0xFBA4, + 0xE352: 0xFBA5, + 0xE353: 0xFBA6, + 0xE354: 0xFBA7, + 0xE355: 0xFBA8, + 0xE356: 0xFBA9, + 0xE357: 0xFBAA, + 0xE358: 0xFBAB, + 0xE359: 0xFBAC, + 0xE35A: 0xFBAD, + 0xE35B: 0xFBAE, + 0xE35C: 0xFBAF, + 0xE35D: 0xFBB0, + 0xE35E: 0xFBB1, + 0xE35F: 0xFBB2, + 0xE360: 0xFBB3, + 0xE361: 0xFBB4, + 0xE362: 0xFBB5, + 0xE363: 0xFBB6, + 0xE364: 0xFBB7, + 0xE365: 0xFBB8, + 0xE366: 0xFBB9, + 0xE367: 0xFBBA, + 0xE368: 0xFBBB, + 0xE369: 0xFBBC, + 0xE36A: 0xFBBD, + 0xE36B: 0xFBBE, + 0xE36C: 0xFBBF, + 0xE36D: 0xFBC0, + 0xE36E: 0xFBC1, + 0xE36F: 0xFBC2, + 0xE370: 0xFBC3, + 0xE371: 0xFBC4, + 0xE372: 0xFBC5, + 0xE373: 0xFBC6, + 0xE374: 0xFBC7, + 0xE375: 0xFBC8, + 0xE376: 0xFBC9, + 0xE377: 0xFBCA, + 0xE378: 0xFBCB, + 0xE379: 0xFBCC, + 0xE37A: 0xFBCD, + 0xE37B: 0xFBCE, + 0xE37C: 0xFBCF, + 0xE37D: 0xFBD0, + 0xE37E: 0xFBD1, + 0xE37F: 0xFBD2, + 0xE380: 0xFBD3, + 0xE381: 0xFBD4, + 0xE382: 0xFBD5, + 0xE383: 0xFBD6, + 0xE384: 0xFBD7, + 0xE385: 0xFBD8, + 0xE386: 0xFBD9, + 0xE387: 0xFBDA, + 0xE388: 0xFBDB, + 0xE389: 0xFBDC, + 0xE38A: 0xFBDD, + 0xE38B: 0xFBDE, + 0xE38C: 0xFBDF, + 0xE38D: 0xFBE0, + 0xE38E: 0xFBE1, + 0xE38F: 0xFBE2, + 0xE390: 0xFBE3, + 0xE391: 0xFBE4, + 0xE392: 0xFBE5, + 0xE393: 0xFBE6, + 0xE394: 0xFBE7, + 0xE395: 0xFBE8, + 0xE396: 0xFBE9, + 0xE397: 0xFBEA, + 0xE398: 0xFBEB, + 0xE399: 0xFBEC, + 0xE39A: 0xFBED, + 0xE39B: 0xFBEE, + 0xE39C: 0xFBEF, + 0xE39D: 0xFBF0, + 0xE39E: 0xFBF1, + 0xE39F: 0xFBF2, + 0xE3A0: 0xFBF3, + 0xE3A1: 0xFBF4, + 0xE3A2: 0xFBF5, + 0xE3A3: 0xFBF6, + 0xE3A4: 0xFBF7, + 0xE3A5: 0xFBF8, + 0xE3A6: 0xFBF9, + 0xE3A7: 0xFBFA, + 0xE3A8: 0xFBFB, + 0xE3A9: 0xFBFC, + 0xE3AA: 0xFBFD, + 0xE3AB: 0xFBFE, + 0xE3AC: 0xFCA1, + 0xE3AD: 0xFCA2, + 0xE3AE: 0xFCA3, + 0xE3AF: 0xFCA4, + 0xE3B0: 0xFCA5, + 0xE3B1: 0xFCA6, + 0xE3B2: 0xFCA7, + 0xE3B3: 0xFCA8, + 0xE3B4: 0xFCA9, + 0xE3B5: 0xFCAA, + 0xE3B6: 0xFCAB, + 0xE3B7: 0xFCAC, + 0xE3B8: 0xFCAD, + 0xE3B9: 0xFCAE, + 0xE3BA: 0xFCAF, + 0xE3BB: 0xFCB0, + 0xE3BC: 0xFCB1, + 0xE3BD: 0xFCB2, + 0xE3BE: 0xFCB3, + 0xE3BF: 0xFCB4, + 0xE3C0: 0xFCB5, + 0xE3C1: 0xFCB6, + 0xE3C2: 0xFCB7, + 0xE3C3: 0xFCB8, + 0xE3C4: 0xFCB9, + 0xE3C5: 0xFCBA, + 0xE3C6: 0xFCBB, + 0xE3C7: 0xFCBC, + 0xE3C8: 0xFCBD, + 0xE3C9: 0xFCBE, + 0xE3CA: 0xFCBF, + 0xE3CB: 0xFCC0, + 0xE3CC: 0xFCC1, + 0xE3CD: 0xFCC2, + 0xE3CE: 0xFCC3, + 0xE3CF: 0xFCC4, + 0xE3D0: 0xFCC5, + 0xE3D1: 0xFCC6, + 0xE3D2: 0xFCC7, + 0xE3D3: 0xFCC8, + 0xE3D4: 0xFCC9, + 0xE3D5: 0xFCCA, + 0xE3D6: 0xFCCB, + 0xE3D7: 0xFCCC, + 0xE3D8: 0xFCCD, + 0xE3D9: 0xFCCE, + 0xE3DA: 0xFCCF, + 0xE3DB: 0xFCD0, + 0xE3DC: 0xFCD1, + 0xE3DD: 0xFCD2, + 0xE3DE: 0xFCD3, + 0xE3DF: 0xFCD4, + 0xE3E0: 0xFCD5, + 0xE3E1: 0xFCD6, + 0xE3E2: 0xFCD7, + 0xE3E3: 0xFCD8, + 0xE3E4: 0xFCD9, + 0xE3E5: 0xFCDA, + 0xE3E6: 0xFCDB, + 0xE3E7: 0xFCDC, + 0xE3E8: 0xFCDD, + 0xE3E9: 0xFCDE, + 0xE3EA: 0xFCDF, + 0xE3EB: 0xFCE0, + 0xE3EC: 0xFCE1, + 0xE3ED: 0xFCE2, + 0xE3EE: 0xFCE3, + 0xE3EF: 0xFCE4, + 0xE3F0: 0xFCE5, + 0xE3F1: 0xFCE6, + 0xE3F2: 0xFCE7, + 0xE3F3: 0xFCE8, + 0xE3F4: 0xFCE9, + 0xE3F5: 0xFCEA, + 0xE3F6: 0xFCEB, + 0xE3F7: 0xFCEC, + 0xE3F8: 0xFCED, + 0xE3F9: 0xFCEE, + 0xE3FA: 0xFCEF, + 0xE3FB: 0xFCF0, + 0xE3FC: 0xFCF1, + 0xE3FD: 0xFCF2, + 0xE3FE: 0xFCF3, + 0xE3FF: 0xFCF4, + 0xE400: 0xFCF5, + 0xE401: 0xFCF6, + 0xE402: 0xFCF7, + 0xE403: 0xFCF8, + 0xE404: 0xFCF9, + 0xE405: 0xFCFA, + 0xE406: 0xFCFB, + 0xE407: 0xFCFC, + 0xE408: 0xFCFD, + 0xE409: 0xFCFE, + 0xE40A: 0xFDA1, + 0xE40B: 0xFDA2, + 0xE40C: 0xFDA3, + 0xE40D: 0xFDA4, + 0xE40E: 0xFDA5, + 0xE40F: 0xFDA6, + 0xE410: 0xFDA7, + 0xE411: 0xFDA8, + 0xE412: 0xFDA9, + 0xE413: 0xFDAA, + 0xE414: 0xFDAB, + 0xE415: 0xFDAC, + 0xE416: 0xFDAD, + 0xE417: 0xFDAE, + 0xE418: 0xFDAF, + 0xE419: 0xFDB0, + 0xE41A: 0xFDB1, + 0xE41B: 0xFDB2, + 0xE41C: 0xFDB3, + 0xE41D: 0xFDB4, + 0xE41E: 0xFDB5, + 0xE41F: 0xFDB6, + 0xE420: 0xFDB7, + 0xE421: 0xFDB8, + 0xE422: 0xFDB9, + 0xE423: 0xFDBA, + 0xE424: 0xFDBB, + 0xE425: 0xFDBC, + 0xE426: 0xFDBD, + 0xE427: 0xFDBE, + 0xE428: 0xFDBF, + 0xE429: 0xFDC0, + 0xE42A: 0xFDC1, + 0xE42B: 0xFDC2, + 0xE42C: 0xFDC3, + 0xE42D: 0xFDC4, + 0xE42E: 0xFDC5, + 0xE42F: 0xFDC6, + 0xE430: 0xFDC7, + 0xE431: 0xFDC8, + 0xE432: 0xFDC9, + 0xE433: 0xFDCA, + 0xE434: 0xFDCB, + 0xE435: 0xFDCC, + 0xE436: 0xFDCD, + 0xE437: 0xFDCE, + 0xE438: 0xFDCF, + 0xE439: 0xFDD0, + 0xE43A: 0xFDD1, + 0xE43B: 0xFDD2, + 0xE43C: 0xFDD3, + 0xE43D: 0xFDD4, + 0xE43E: 0xFDD5, + 0xE43F: 0xFDD6, + 0xE440: 0xFDD7, + 0xE441: 0xFDD8, + 0xE442: 0xFDD9, + 0xE443: 0xFDDA, + 0xE444: 0xFDDB, + 0xE445: 0xFDDC, + 0xE446: 0xFDDD, + 0xE447: 0xFDDE, + 0xE448: 0xFDDF, + 0xE449: 0xFDE0, + 0xE44A: 0xFDE1, + 0xE44B: 0xFDE2, + 0xE44C: 0xFDE3, + 0xE44D: 0xFDE4, + 0xE44E: 0xFDE5, + 0xE44F: 0xFDE6, + 0xE450: 0xFDE7, + 0xE451: 0xFDE8, + 0xE452: 0xFDE9, + 0xE453: 0xFDEA, + 0xE454: 0xFDEB, + 0xE455: 0xFDEC, + 0xE456: 0xFDED, + 0xE457: 0xFDEE, + 0xE458: 0xFDEF, + 0xE459: 0xFDF0, + 0xE45A: 0xFDF1, + 0xE45B: 0xFDF2, + 0xE45C: 0xFDF3, + 0xE45D: 0xFDF4, + 0xE45E: 0xFDF5, + 0xE45F: 0xFDF6, + 0xE460: 0xFDF7, + 0xE461: 0xFDF8, + 0xE462: 0xFDF9, + 0xE463: 0xFDFA, + 0xE464: 0xFDFB, + 0xE465: 0xFDFC, + 0xE466: 0xFDFD, + 0xE467: 0xFDFE, + 0xE468: 0xFEA1, + 0xE469: 0xFEA2, + 0xE46A: 0xFEA3, + 0xE46B: 0xFEA4, + 0xE46C: 0xFEA5, + 0xE46D: 0xFEA6, + 0xE46E: 0xFEA7, + 0xE46F: 0xFEA8, + 0xE470: 0xFEA9, + 0xE471: 0xFEAA, + 0xE472: 0xFEAB, + 0xE473: 0xFEAC, + 0xE474: 0xFEAD, + 0xE475: 0xFEAE, + 0xE476: 0xFEAF, + 0xE477: 0xFEB0, + 0xE478: 0xFEB1, + 0xE479: 0xFEB2, + 0xE47A: 0xFEB3, + 0xE47B: 0xFEB4, + 0xE47C: 0xFEB5, + 0xE47D: 0xFEB6, + 0xE47E: 0xFEB7, + 0xE47F: 0xFEB8, + 0xE480: 0xFEB9, + 0xE481: 0xFEBA, + 0xE482: 0xFEBB, + 0xE483: 0xFEBC, + 0xE484: 0xFEBD, + 0xE485: 0xFEBE, + 0xE486: 0xFEBF, + 0xE487: 0xFEC0, + 0xE488: 0xFEC1, + 0xE489: 0xFEC2, + 0xE48A: 0xFEC3, + 0xE48B: 0xFEC4, + 0xE48C: 0xFEC5, + 0xE48D: 0xFEC6, + 0xE48E: 0xFEC7, + 0xE48F: 0xFEC8, + 0xE490: 0xFEC9, + 0xE491: 0xFECA, + 0xE492: 0xFECB, + 0xE493: 0xFECC, + 0xE494: 0xFECD, + 0xE495: 0xFECE, + 0xE496: 0xFECF, + 0xE497: 0xFED0, + 0xE498: 0xFED1, + 0xE499: 0xFED2, + 0xE49A: 0xFED3, + 0xE49B: 0xFED4, + 0xE49C: 0xFED5, + 0xE49D: 0xFED6, + 0xE49E: 0xFED7, + 0xE49F: 0xFED8, + 0xE4A0: 0xFED9, + 0xE4A1: 0xFEDA, + 0xE4A2: 0xFEDB, + 0xE4A3: 0xFEDC, + 0xE4A4: 0xFEDD, + 0xE4A5: 0xFEDE, + 0xE4A6: 0xFEDF, + 0xE4A7: 0xFEE0, + 0xE4A8: 0xFEE1, + 0xE4A9: 0xFEE2, + 0xE4AA: 0xFEE3, + 0xE4AB: 0xFEE4, + 0xE4AC: 0xFEE5, + 0xE4AD: 0xFEE6, + 0xE4AE: 0xFEE7, + 0xE4AF: 0xFEE8, + 0xE4B0: 0xFEE9, + 0xE4B1: 0xFEEA, + 0xE4B2: 0xFEEB, + 0xE4B3: 0xFEEC, + 0xE4B4: 0xFEED, + 0xE4B5: 0xFEEE, + 0xE4B6: 0xFEEF, + 0xE4B7: 0xFEF0, + 0xE4B8: 0xFEF1, + 0xE4B9: 0xFEF2, + 0xE4BA: 0xFEF3, + 0xE4BB: 0xFEF4, + 0xE4BC: 0xFEF5, + 0xE4BD: 0xFEF6, + 0xE4BE: 0xFEF7, + 0xE4BF: 0xFEF8, + 0xE4C0: 0xFEF9, + 0xE4C1: 0xFEFA, + 0xE4C2: 0xFEFB, + 0xE4C3: 0xFEFC, + 0xE4C4: 0xFEFD, + 0xE4C5: 0xFEFE, + 0xE4C6: 0xA140, + 0xE4C7: 0xA141, + 0xE4C8: 0xA142, + 0xE4C9: 0xA143, + 0xE4CA: 0xA144, + 0xE4CB: 0xA145, + 0xE4CC: 0xA146, + 0xE4CD: 0xA147, + 0xE4CE: 0xA148, + 0xE4CF: 0xA149, + 0xE4D0: 0xA14A, + 0xE4D1: 0xA14B, + 0xE4D2: 0xA14C, + 0xE4D3: 0xA14D, + 0xE4D4: 0xA14E, + 0xE4D5: 0xA14F, + 0xE4D6: 0xA150, + 0xE4D7: 0xA151, + 0xE4D8: 0xA152, + 0xE4D9: 0xA153, + 0xE4DA: 0xA154, + 0xE4DB: 0xA155, + 0xE4DC: 0xA156, + 0xE4DD: 0xA157, + 0xE4DE: 0xA158, + 0xE4DF: 0xA159, + 0xE4E0: 0xA15A, + 0xE4E1: 0xA15B, + 0xE4E2: 0xA15C, + 0xE4E3: 0xA15D, + 0xE4E4: 0xA15E, + 0xE4E5: 0xA15F, + 0xE4E6: 0xA160, + 0xE4E7: 0xA161, + 0xE4E8: 0xA162, + 0xE4E9: 0xA163, + 0xE4EA: 0xA164, + 0xE4EB: 0xA165, + 0xE4EC: 0xA166, + 0xE4ED: 0xA167, + 0xE4EE: 0xA168, + 0xE4EF: 0xA169, + 0xE4F0: 0xA16A, + 0xE4F1: 0xA16B, + 0xE4F2: 0xA16C, + 0xE4F3: 0xA16D, + 0xE4F4: 0xA16E, + 0xE4F5: 0xA16F, + 0xE4F6: 0xA170, + 0xE4F7: 0xA171, + 0xE4F8: 0xA172, + 0xE4F9: 0xA173, + 0xE4FA: 0xA174, + 0xE4FB: 0xA175, + 0xE4FC: 0xA176, + 0xE4FD: 0xA177, + 0xE4FE: 0xA178, + 0xE4FF: 0xA179, + 0xE500: 0xA17A, + 0xE501: 0xA17B, + 0xE502: 0xA17C, + 0xE503: 0xA17D, + 0xE504: 0xA17E, + 0xE505: 0xA180, + 0xE506: 0xA181, + 0xE507: 0xA182, + 0xE508: 0xA183, + 0xE509: 0xA184, + 0xE50A: 0xA185, + 0xE50B: 0xA186, + 0xE50C: 0xA187, + 0xE50D: 0xA188, + 0xE50E: 0xA189, + 0xE50F: 0xA18A, + 0xE510: 0xA18B, + 0xE511: 0xA18C, + 0xE512: 0xA18D, + 0xE513: 0xA18E, + 0xE514: 0xA18F, + 0xE515: 0xA190, + 0xE516: 0xA191, + 0xE517: 0xA192, + 0xE518: 0xA193, + 0xE519: 0xA194, + 0xE51A: 0xA195, + 0xE51B: 0xA196, + 0xE51C: 0xA197, + 0xE51D: 0xA198, + 0xE51E: 0xA199, + 0xE51F: 0xA19A, + 0xE520: 0xA19B, + 0xE521: 0xA19C, + 0xE522: 0xA19D, + 0xE523: 0xA19E, + 0xE524: 0xA19F, + 0xE525: 0xA1A0, + 0xE526: 0xA240, + 0xE527: 0xA241, + 0xE528: 0xA242, + 0xE529: 0xA243, + 0xE52A: 0xA244, + 0xE52B: 0xA245, + 0xE52C: 0xA246, + 0xE52D: 0xA247, + 0xE52E: 0xA248, + 0xE52F: 0xA249, + 0xE530: 0xA24A, + 0xE531: 0xA24B, + 0xE532: 0xA24C, + 0xE533: 0xA24D, + 0xE534: 0xA24E, + 0xE535: 0xA24F, + 0xE536: 0xA250, + 0xE537: 0xA251, + 0xE538: 0xA252, + 0xE539: 0xA253, + 0xE53A: 0xA254, + 0xE53B: 0xA255, + 0xE53C: 0xA256, + 0xE53D: 0xA257, + 0xE53E: 0xA258, + 0xE53F: 0xA259, + 0xE540: 0xA25A, + 0xE541: 0xA25B, + 0xE542: 0xA25C, + 0xE543: 0xA25D, + 0xE544: 0xA25E, + 0xE545: 0xA25F, + 0xE546: 0xA260, + 0xE547: 0xA261, + 0xE548: 0xA262, + 0xE549: 0xA263, + 0xE54A: 0xA264, + 0xE54B: 0xA265, + 0xE54C: 0xA266, + 0xE54D: 0xA267, + 0xE54E: 0xA268, + 0xE54F: 0xA269, + 0xE550: 0xA26A, + 0xE551: 0xA26B, + 0xE552: 0xA26C, + 0xE553: 0xA26D, + 0xE554: 0xA26E, + 0xE555: 0xA26F, + 0xE556: 0xA270, + 0xE557: 0xA271, + 0xE558: 0xA272, + 0xE559: 0xA273, + 0xE55A: 0xA274, + 0xE55B: 0xA275, + 0xE55C: 0xA276, + 0xE55D: 0xA277, + 0xE55E: 0xA278, + 0xE55F: 0xA279, + 0xE560: 0xA27A, + 0xE561: 0xA27B, + 0xE562: 0xA27C, + 0xE563: 0xA27D, + 0xE564: 0xA27E, + 0xE565: 0xA280, + 0xE566: 0xA281, + 0xE567: 0xA282, + 0xE568: 0xA283, + 0xE569: 0xA284, + 0xE56A: 0xA285, + 0xE56B: 0xA286, + 0xE56C: 0xA287, + 0xE56D: 0xA288, + 0xE56E: 0xA289, + 0xE56F: 0xA28A, + 0xE570: 0xA28B, + 0xE571: 0xA28C, + 0xE572: 0xA28D, + 0xE573: 0xA28E, + 0xE574: 0xA28F, + 0xE575: 0xA290, + 0xE576: 0xA291, + 0xE577: 0xA292, + 0xE578: 0xA293, + 0xE579: 0xA294, + 0xE57A: 0xA295, + 0xE57B: 0xA296, + 0xE57C: 0xA297, + 0xE57D: 0xA298, + 0xE57E: 0xA299, + 0xE57F: 0xA29A, + 0xE580: 0xA29B, + 0xE581: 0xA29C, + 0xE582: 0xA29D, + 0xE583: 0xA29E, + 0xE584: 0xA29F, + 0xE585: 0xA2A0, + 0xE586: 0xA340, + 0xE587: 0xA341, + 0xE588: 0xA342, + 0xE589: 0xA343, + 0xE58A: 0xA344, + 0xE58B: 0xA345, + 0xE58C: 0xA346, + 0xE58D: 0xA347, + 0xE58E: 0xA348, + 0xE58F: 0xA349, + 0xE590: 0xA34A, + 0xE591: 0xA34B, + 0xE592: 0xA34C, + 0xE593: 0xA34D, + 0xE594: 0xA34E, + 0xE595: 0xA34F, + 0xE596: 0xA350, + 0xE597: 0xA351, + 0xE598: 0xA352, + 0xE599: 0xA353, + 0xE59A: 0xA354, + 0xE59B: 0xA355, + 0xE59C: 0xA356, + 0xE59D: 0xA357, + 0xE59E: 0xA358, + 0xE59F: 0xA359, + 0xE5A0: 0xA35A, + 0xE5A1: 0xA35B, + 0xE5A2: 0xA35C, + 0xE5A3: 0xA35D, + 0xE5A4: 0xA35E, + 0xE5A5: 0xA35F, + 0xE5A6: 0xA360, + 0xE5A7: 0xA361, + 0xE5A8: 0xA362, + 0xE5A9: 0xA363, + 0xE5AA: 0xA364, + 0xE5AB: 0xA365, + 0xE5AC: 0xA366, + 0xE5AD: 0xA367, + 0xE5AE: 0xA368, + 0xE5AF: 0xA369, + 0xE5B0: 0xA36A, + 0xE5B1: 0xA36B, + 0xE5B2: 0xA36C, + 0xE5B3: 0xA36D, + 0xE5B4: 0xA36E, + 0xE5B5: 0xA36F, + 0xE5B6: 0xA370, + 0xE5B7: 0xA371, + 0xE5B8: 0xA372, + 0xE5B9: 0xA373, + 0xE5BA: 0xA374, + 0xE5BB: 0xA375, + 0xE5BC: 0xA376, + 0xE5BD: 0xA377, + 0xE5BE: 0xA378, + 0xE5BF: 0xA379, + 0xE5C0: 0xA37A, + 0xE5C1: 0xA37B, + 0xE5C2: 0xA37C, + 0xE5C3: 0xA37D, + 0xE5C4: 0xA37E, + 0xE5C5: 0xA380, + 0xE5C6: 0xA381, + 0xE5C7: 0xA382, + 0xE5C8: 0xA383, + 0xE5C9: 0xA384, + 0xE5CA: 0xA385, + 0xE5CB: 0xA386, + 0xE5CC: 0xA387, + 0xE5CD: 0xA388, + 0xE5CE: 0xA389, + 0xE5CF: 0xA38A, + 0xE5D0: 0xA38B, + 0xE5D1: 0xA38C, + 0xE5D2: 0xA38D, + 0xE5D3: 0xA38E, + 0xE5D4: 0xA38F, + 0xE5D5: 0xA390, + 0xE5D6: 0xA391, + 0xE5D7: 0xA392, + 0xE5D8: 0xA393, + 0xE5D9: 0xA394, + 0xE5DA: 0xA395, + 0xE5DB: 0xA396, + 0xE5DC: 0xA397, + 0xE5DD: 0xA398, + 0xE5DE: 0xA399, + 0xE5DF: 0xA39A, + 0xE5E0: 0xA39B, + 0xE5E1: 0xA39C, + 0xE5E2: 0xA39D, + 0xE5E3: 0xA39E, + 0xE5E4: 0xA39F, + 0xE5E5: 0xA3A0, + 0xE5E6: 0xA440, + 0xE5E7: 0xA441, + 0xE5E8: 0xA442, + 0xE5E9: 0xA443, + 0xE5EA: 0xA444, + 0xE5EB: 0xA445, + 0xE5EC: 0xA446, + 0xE5ED: 0xA447, + 0xE5EE: 0xA448, + 0xE5EF: 0xA449, + 0xE5F0: 0xA44A, + 0xE5F1: 0xA44B, + 0xE5F2: 0xA44C, + 0xE5F3: 0xA44D, + 0xE5F4: 0xA44E, + 0xE5F5: 0xA44F, + 0xE5F6: 0xA450, + 0xE5F7: 0xA451, + 0xE5F8: 0xA452, + 0xE5F9: 0xA453, + 0xE5FA: 0xA454, + 0xE5FB: 0xA455, + 0xE5FC: 0xA456, + 0xE5FD: 0xA457, + 0xE5FE: 0xA458, + 0xE5FF: 0xA459, + 0xE600: 0xA45A, + 0xE601: 0xA45B, + 0xE602: 0xA45C, + 0xE603: 0xA45D, + 0xE604: 0xA45E, + 0xE605: 0xA45F, + 0xE606: 0xA460, + 0xE607: 0xA461, + 0xE608: 0xA462, + 0xE609: 0xA463, + 0xE60A: 0xA464, + 0xE60B: 0xA465, + 0xE60C: 0xA466, + 0xE60D: 0xA467, + 0xE60E: 0xA468, + 0xE60F: 0xA469, + 0xE610: 0xA46A, + 0xE611: 0xA46B, + 0xE612: 0xA46C, + 0xE613: 0xA46D, + 0xE614: 0xA46E, + 0xE615: 0xA46F, + 0xE616: 0xA470, + 0xE617: 0xA471, + 0xE618: 0xA472, + 0xE619: 0xA473, + 0xE61A: 0xA474, + 0xE61B: 0xA475, + 0xE61C: 0xA476, + 0xE61D: 0xA477, + 0xE61E: 0xA478, + 0xE61F: 0xA479, + 0xE620: 0xA47A, + 0xE621: 0xA47B, + 0xE622: 0xA47C, + 0xE623: 0xA47D, + 0xE624: 0xA47E, + 0xE625: 0xA480, + 0xE626: 0xA481, + 0xE627: 0xA482, + 0xE628: 0xA483, + 0xE629: 0xA484, + 0xE62A: 0xA485, + 0xE62B: 0xA486, + 0xE62C: 0xA487, + 0xE62D: 0xA488, + 0xE62E: 0xA489, + 0xE62F: 0xA48A, + 0xE630: 0xA48B, + 0xE631: 0xA48C, + 0xE632: 0xA48D, + 0xE633: 0xA48E, + 0xE634: 0xA48F, + 0xE635: 0xA490, + 0xE636: 0xA491, + 0xE637: 0xA492, + 0xE638: 0xA493, + 0xE639: 0xA494, + 0xE63A: 0xA495, + 0xE63B: 0xA496, + 0xE63C: 0xA497, + 0xE63D: 0xA498, + 0xE63E: 0xA499, + 0xE63F: 0xA49A, + 0xE640: 0xA49B, + 0xE641: 0xA49C, + 0xE642: 0xA49D, + 0xE643: 0xA49E, + 0xE644: 0xA49F, + 0xE645: 0xA4A0, + 0xE646: 0xA540, + 0xE647: 0xA541, + 0xE648: 0xA542, + 0xE649: 0xA543, + 0xE64A: 0xA544, + 0xE64B: 0xA545, + 0xE64C: 0xA546, + 0xE64D: 0xA547, + 0xE64E: 0xA548, + 0xE64F: 0xA549, + 0xE650: 0xA54A, + 0xE651: 0xA54B, + 0xE652: 0xA54C, + 0xE653: 0xA54D, + 0xE654: 0xA54E, + 0xE655: 0xA54F, + 0xE656: 0xA550, + 0xE657: 0xA551, + 0xE658: 0xA552, + 0xE659: 0xA553, + 0xE65A: 0xA554, + 0xE65B: 0xA555, + 0xE65C: 0xA556, + 0xE65D: 0xA557, + 0xE65E: 0xA558, + 0xE65F: 0xA559, + 0xE660: 0xA55A, + 0xE661: 0xA55B, + 0xE662: 0xA55C, + 0xE663: 0xA55D, + 0xE664: 0xA55E, + 0xE665: 0xA55F, + 0xE666: 0xA560, + 0xE667: 0xA561, + 0xE668: 0xA562, + 0xE669: 0xA563, + 0xE66A: 0xA564, + 0xE66B: 0xA565, + 0xE66C: 0xA566, + 0xE66D: 0xA567, + 0xE66E: 0xA568, + 0xE66F: 0xA569, + 0xE670: 0xA56A, + 0xE671: 0xA56B, + 0xE672: 0xA56C, + 0xE673: 0xA56D, + 0xE674: 0xA56E, + 0xE675: 0xA56F, + 0xE676: 0xA570, + 0xE677: 0xA571, + 0xE678: 0xA572, + 0xE679: 0xA573, + 0xE67A: 0xA574, + 0xE67B: 0xA575, + 0xE67C: 0xA576, + 0xE67D: 0xA577, + 0xE67E: 0xA578, + 0xE67F: 0xA579, + 0xE680: 0xA57A, + 0xE681: 0xA57B, + 0xE682: 0xA57C, + 0xE683: 0xA57D, + 0xE684: 0xA57E, + 0xE685: 0xA580, + 0xE686: 0xA581, + 0xE687: 0xA582, + 0xE688: 0xA583, + 0xE689: 0xA584, + 0xE68A: 0xA585, + 0xE68B: 0xA586, + 0xE68C: 0xA587, + 0xE68D: 0xA588, + 0xE68E: 0xA589, + 0xE68F: 0xA58A, + 0xE690: 0xA58B, + 0xE691: 0xA58C, + 0xE692: 0xA58D, + 0xE693: 0xA58E, + 0xE694: 0xA58F, + 0xE695: 0xA590, + 0xE696: 0xA591, + 0xE697: 0xA592, + 0xE698: 0xA593, + 0xE699: 0xA594, + 0xE69A: 0xA595, + 0xE69B: 0xA596, + 0xE69C: 0xA597, + 0xE69D: 0xA598, + 0xE69E: 0xA599, + 0xE69F: 0xA59A, + 0xE6A0: 0xA59B, + 0xE6A1: 0xA59C, + 0xE6A2: 0xA59D, + 0xE6A3: 0xA59E, + 0xE6A4: 0xA59F, + 0xE6A5: 0xA5A0, + 0xE6A6: 0xA640, + 0xE6A7: 0xA641, + 0xE6A8: 0xA642, + 0xE6A9: 0xA643, + 0xE6AA: 0xA644, + 0xE6AB: 0xA645, + 0xE6AC: 0xA646, + 0xE6AD: 0xA647, + 0xE6AE: 0xA648, + 0xE6AF: 0xA649, + 0xE6B0: 0xA64A, + 0xE6B1: 0xA64B, + 0xE6B2: 0xA64C, + 0xE6B3: 0xA64D, + 0xE6B4: 0xA64E, + 0xE6B5: 0xA64F, + 0xE6B6: 0xA650, + 0xE6B7: 0xA651, + 0xE6B8: 0xA652, + 0xE6B9: 0xA653, + 0xE6BA: 0xA654, + 0xE6BB: 0xA655, + 0xE6BC: 0xA656, + 0xE6BD: 0xA657, + 0xE6BE: 0xA658, + 0xE6BF: 0xA659, + 0xE6C0: 0xA65A, + 0xE6C1: 0xA65B, + 0xE6C2: 0xA65C, + 0xE6C3: 0xA65D, + 0xE6C4: 0xA65E, + 0xE6C5: 0xA65F, + 0xE6C6: 0xA660, + 0xE6C7: 0xA661, + 0xE6C8: 0xA662, + 0xE6C9: 0xA663, + 0xE6CA: 0xA664, + 0xE6CB: 0xA665, + 0xE6CC: 0xA666, + 0xE6CD: 0xA667, + 0xE6CE: 0xA668, + 0xE6CF: 0xA669, + 0xE6D0: 0xA66A, + 0xE6D1: 0xA66B, + 0xE6D2: 0xA66C, + 0xE6D3: 0xA66D, + 0xE6D4: 0xA66E, + 0xE6D5: 0xA66F, + 0xE6D6: 0xA670, + 0xE6D7: 0xA671, + 0xE6D8: 0xA672, + 0xE6D9: 0xA673, + 0xE6DA: 0xA674, + 0xE6DB: 0xA675, + 0xE6DC: 0xA676, + 0xE6DD: 0xA677, + 0xE6DE: 0xA678, + 0xE6DF: 0xA679, + 0xE6E0: 0xA67A, + 0xE6E1: 0xA67B, + 0xE6E2: 0xA67C, + 0xE6E3: 0xA67D, + 0xE6E4: 0xA67E, + 0xE6E5: 0xA680, + 0xE6E6: 0xA681, + 0xE6E7: 0xA682, + 0xE6E8: 0xA683, + 0xE6E9: 0xA684, + 0xE6EA: 0xA685, + 0xE6EB: 0xA686, + 0xE6EC: 0xA687, + 0xE6ED: 0xA688, + 0xE6EE: 0xA689, + 0xE6EF: 0xA68A, + 0xE6F0: 0xA68B, + 0xE6F1: 0xA68C, + 0xE6F2: 0xA68D, + 0xE6F3: 0xA68E, + 0xE6F4: 0xA68F, + 0xE6F5: 0xA690, + 0xE6F6: 0xA691, + 0xE6F7: 0xA692, + 0xE6F8: 0xA693, + 0xE6F9: 0xA694, + 0xE6FA: 0xA695, + 0xE6FB: 0xA696, + 0xE6FC: 0xA697, + 0xE6FD: 0xA698, + 0xE6FE: 0xA699, + 0xE6FF: 0xA69A, + 0xE700: 0xA69B, + 0xE701: 0xA69C, + 0xE702: 0xA69D, + 0xE703: 0xA69E, + 0xE704: 0xA69F, + 0xE705: 0xA6A0, + 0xE706: 0xA740, + 0xE707: 0xA741, + 0xE708: 0xA742, + 0xE709: 0xA743, + 0xE70A: 0xA744, + 0xE70B: 0xA745, + 0xE70C: 0xA746, + 0xE70D: 0xA747, + 0xE70E: 0xA748, + 0xE70F: 0xA749, + 0xE710: 0xA74A, + 0xE711: 0xA74B, + 0xE712: 0xA74C, + 0xE713: 0xA74D, + 0xE714: 0xA74E, + 0xE715: 0xA74F, + 0xE716: 0xA750, + 0xE717: 0xA751, + 0xE718: 0xA752, + 0xE719: 0xA753, + 0xE71A: 0xA754, + 0xE71B: 0xA755, + 0xE71C: 0xA756, + 0xE71D: 0xA757, + 0xE71E: 0xA758, + 0xE71F: 0xA759, + 0xE720: 0xA75A, + 0xE721: 0xA75B, + 0xE722: 0xA75C, + 0xE723: 0xA75D, + 0xE724: 0xA75E, + 0xE725: 0xA75F, + 0xE726: 0xA760, + 0xE727: 0xA761, + 0xE728: 0xA762, + 0xE729: 0xA763, + 0xE72A: 0xA764, + 0xE72B: 0xA765, + 0xE72C: 0xA766, + 0xE72D: 0xA767, + 0xE72E: 0xA768, + 0xE72F: 0xA769, + 0xE730: 0xA76A, + 0xE731: 0xA76B, + 0xE732: 0xA76C, + 0xE733: 0xA76D, + 0xE734: 0xA76E, + 0xE735: 0xA76F, + 0xE736: 0xA770, + 0xE737: 0xA771, + 0xE738: 0xA772, + 0xE739: 0xA773, + 0xE73A: 0xA774, + 0xE73B: 0xA775, + 0xE73C: 0xA776, + 0xE73D: 0xA777, + 0xE73E: 0xA778, + 0xE73F: 0xA779, + 0xE740: 0xA77A, + 0xE741: 0xA77B, + 0xE742: 0xA77C, + 0xE743: 0xA77D, + 0xE744: 0xA77E, + 0xE745: 0xA780, + 0xE746: 0xA781, + 0xE747: 0xA782, + 0xE748: 0xA783, + 0xE749: 0xA784, + 0xE74A: 0xA785, + 0xE74B: 0xA786, + 0xE74C: 0xA787, + 0xE74D: 0xA788, + 0xE74E: 0xA789, + 0xE74F: 0xA78A, + 0xE750: 0xA78B, + 0xE751: 0xA78C, + 0xE752: 0xA78D, + 0xE753: 0xA78E, + 0xE754: 0xA78F, + 0xE755: 0xA790, + 0xE756: 0xA791, + 0xE757: 0xA792, + 0xE758: 0xA793, + 0xE759: 0xA794, + 0xE75A: 0xA795, + 0xE75B: 0xA796, + 0xE75C: 0xA797, + 0xE75D: 0xA798, + 0xE75E: 0xA799, + 0xE75F: 0xA79A, + 0xE760: 0xA79B, + 0xE761: 0xA79C, + 0xE762: 0xA79D, + 0xE763: 0xA79E, + 0xE764: 0xA79F, + 0xE765: 0xA7A0, + 0xE766: 0xA2AB, + 0xE767: 0xA2AC, + 0xE768: 0xA2AD, + 0xE769: 0xA2AE, + 0xE76A: 0xA2AF, + 0xE76B: 0xA2B0, + 0xE76D: 0xA2E4, + 0xE76E: 0xA2EF, + 0xE76F: 0xA2F0, + 0xE770: 0xA2FD, + 0xE771: 0xA2FE, + 0xE772: 0xA4F4, + 0xE773: 0xA4F5, + 0xE774: 0xA4F6, + 0xE775: 0xA4F7, + 0xE776: 0xA4F8, + 0xE777: 0xA4F9, + 0xE778: 0xA4FA, + 0xE779: 0xA4FB, + 0xE77A: 0xA4FC, + 0xE77B: 0xA4FD, + 0xE77C: 0xA4FE, + 0xE77D: 0xA5F7, + 0xE77E: 0xA5F8, + 0xE77F: 0xA5F9, + 0xE780: 0xA5FA, + 0xE781: 0xA5FB, + 0xE782: 0xA5FC, + 0xE783: 0xA5FD, + 0xE784: 0xA5FE, + 0xE785: 0xA6B9, + 0xE786: 0xA6BA, + 0xE787: 0xA6BB, + 0xE788: 0xA6BC, + 0xE789: 0xA6BD, + 0xE78A: 0xA6BE, + 0xE78B: 0xA6BF, + 0xE78C: 0xA6C0, + 0xE78D: 0xA6D9, + 0xE78E: 0xA6DA, + 0xE78F: 0xA6DB, + 0xE790: 0xA6DC, + 0xE791: 0xA6DD, + 0xE792: 0xA6DE, + 0xE793: 0xA6DF, + 0xE794: 0xA6EC, + 0xE795: 0xA6ED, + 0xE796: 0xA6F3, + 0xE797: 0xA6F6, + 0xE798: 0xA6F7, + 0xE799: 0xA6F8, + 0xE79A: 0xA6F9, + 0xE79B: 0xA6FA, + 0xE79C: 0xA6FB, + 0xE79D: 0xA6FC, + 0xE79E: 0xA6FD, + 0xE79F: 0xA6FE, + 0xE7A0: 0xA7C2, + 0xE7A1: 0xA7C3, + 0xE7A2: 0xA7C4, + 0xE7A3: 0xA7C5, + 0xE7A4: 0xA7C6, + 0xE7A5: 0xA7C7, + 0xE7A6: 0xA7C8, + 0xE7A7: 0xA7C9, + 0xE7A8: 0xA7CA, + 0xE7A9: 0xA7CB, + 0xE7AA: 0xA7CC, + 0xE7AB: 0xA7CD, + 0xE7AC: 0xA7CE, + 0xE7AD: 0xA7CF, + 0xE7AE: 0xA7D0, + 0xE7AF: 0xA7F2, + 0xE7B0: 0xA7F3, + 0xE7B1: 0xA7F4, + 0xE7B2: 0xA7F5, + 0xE7B3: 0xA7F6, + 0xE7B4: 0xA7F7, + 0xE7B5: 0xA7F8, + 0xE7B6: 0xA7F9, + 0xE7B7: 0xA7FA, + 0xE7B8: 0xA7FB, + 0xE7B9: 0xA7FC, + 0xE7BA: 0xA7FD, + 0xE7BB: 0xA7FE, + 0xE7BC: 0xA896, + 0xE7BD: 0xA897, + 0xE7BE: 0xA898, + 0xE7BF: 0xA899, + 0xE7C0: 0xA89A, + 0xE7C1: 0xA89B, + 0xE7C2: 0xA89C, + 0xE7C3: 0xA89D, + 0xE7C4: 0xA89E, + 0xE7C5: 0xA89F, + 0xE7C6: 0xA8A0, + 0xE7C9: 0xA8C1, + 0xE7CA: 0xA8C2, + 0xE7CB: 0xA8C3, + 0xE7CC: 0xA8C4, + 0xE7CD: 0xA8EA, + 0xE7CE: 0xA8EB, + 0xE7CF: 0xA8EC, + 0xE7D0: 0xA8ED, + 0xE7D1: 0xA8EE, + 0xE7D2: 0xA8EF, + 0xE7D3: 0xA8F0, + 0xE7D4: 0xA8F1, + 0xE7D5: 0xA8F2, + 0xE7D6: 0xA8F3, + 0xE7D7: 0xA8F4, + 0xE7D8: 0xA8F5, + 0xE7D9: 0xA8F6, + 0xE7DA: 0xA8F7, + 0xE7DB: 0xA8F8, + 0xE7DC: 0xA8F9, + 0xE7DD: 0xA8FA, + 0xE7DE: 0xA8FB, + 0xE7DF: 0xA8FC, + 0xE7E0: 0xA8FD, + 0xE7E1: 0xA8FE, + 0xE7E2: 0xA958, + 0xE7E3: 0xA95B, + 0xE7E4: 0xA95D, + 0xE7E5: 0xA95E, + 0xE7E6: 0xA95F, + 0xE7F4: 0xA997, + 0xE7F5: 0xA998, + 0xE7F6: 0xA999, + 0xE7F7: 0xA99A, + 0xE7F8: 0xA99B, + 0xE7F9: 0xA99C, + 0xE7FA: 0xA99D, + 0xE7FB: 0xA99E, + 0xE7FC: 0xA99F, + 0xE7FD: 0xA9A0, + 0xE7FE: 0xA9A1, + 0xE7FF: 0xA9A2, + 0xE800: 0xA9A3, + 0xE801: 0xA9F0, + 0xE802: 0xA9F1, + 0xE803: 0xA9F2, + 0xE804: 0xA9F3, + 0xE805: 0xA9F4, + 0xE806: 0xA9F5, + 0xE807: 0xA9F6, + 0xE808: 0xA9F7, + 0xE809: 0xA9F8, + 0xE80A: 0xA9F9, + 0xE80B: 0xA9FA, + 0xE80C: 0xA9FB, + 0xE80D: 0xA9FC, + 0xE80E: 0xA9FD, + 0xE80F: 0xA9FE, + 0xE810: 0xD7FA, + 0xE811: 0xD7FB, + 0xE812: 0xD7FC, + 0xE813: 0xD7FD, + 0xE814: 0xD7FE, + 0xE816: 0xFE51, + 0xE817: 0xFE52, + 0xE818: 0xFE53, + 0xE81E: 0xFE59, + 0xE826: 0xFE61, + 0xE82B: 0xFE66, + 0xE82C: 0xFE67, + 0xE831: 0xFE6C, + 0xE832: 0xFE6D, + 0xE83B: 0xFE76, + 0xE843: 0xFE7E, + 0xE854: 0xFE90, + 0xE855: 0xFE91, + 0xE864: 0xFEA0, + 0xF92C: 0xFD9C, + 0xF979: 0xFD9D, + 0xF995: 0xFD9E, + 0xF9E7: 0xFD9F, + 0xF9F1: 0xFDA0, + 0xFA0C: 0xFE40, + 0xFA0D: 0xFE41, + 0xFA0E: 0xFE42, + 0xFA0F: 0xFE43, + 0xFA11: 0xFE44, + 0xFA13: 0xFE45, + 0xFA14: 0xFE46, + 0xFA18: 0xFE47, + 0xFA1F: 0xFE48, + 0xFA20: 0xFE49, + 0xFA21: 0xFE4A, + 0xFA23: 0xFE4B, + 0xFA24: 0xFE4C, + 0xFA27: 0xFE4D, + 0xFA28: 0xFE4E, + 0xFA29: 0xFE4F, + 0xFE10: 0xA6D9, + 0xFE11: 0xA6DB, + 0xFE12: 0xA6DA, + 0xFE13: 0xA6DC, + 0xFE14: 0xA6DD, + 0xFE15: 0xA6DE, + 0xFE16: 0xA6DF, + 0xFE17: 0xA6EC, + 0xFE18: 0xA6ED, + 0xFE19: 0xA6F3, + 0xFE30: 0xA955, + 0xFE31: 0xA6F2, + 0xFE33: 0xA6F4, + 0xFE34: 0xA6F5, + 0xFE35: 0xA6E0, + 0xFE36: 0xA6E1, + 0xFE37: 0xA6F0, + 0xFE38: 0xA6F1, + 0xFE39: 0xA6E2, + 0xFE3A: 0xA6E3, + 0xFE3B: 0xA6EE, + 0xFE3C: 0xA6EF, + 0xFE3D: 0xA6E6, + 0xFE3E: 0xA6E7, + 0xFE3F: 0xA6E4, + 0xFE40: 0xA6E5, + 0xFE41: 0xA6E8, + 0xFE42: 0xA6E9, + 0xFE43: 0xA6EA, + 0xFE44: 0xA6EB, + 0xFE49: 0xA968, + 0xFE4A: 0xA969, + 0xFE4B: 0xA96A, + 0xFE4C: 0xA96B, + 0xFE4D: 0xA96C, + 0xFE4E: 0xA96D, + 0xFE4F: 0xA96E, + 0xFE50: 0xA96F, + 0xFE51: 0xA970, + 0xFE52: 0xA971, + 0xFE54: 0xA972, + 0xFE55: 0xA973, + 0xFE56: 0xA974, + 0xFE57: 0xA975, + 0xFE59: 0xA976, + 0xFE5A: 0xA977, + 0xFE5B: 0xA978, + 0xFE5C: 0xA979, + 0xFE5D: 0xA97A, + 0xFE5E: 0xA97B, + 0xFE5F: 0xA97C, + 0xFE60: 0xA97D, + 0xFE61: 0xA97E, + 0xFE62: 0xA980, + 0xFE63: 0xA981, + 0xFE64: 0xA982, + 0xFE65: 0xA983, + 0xFE66: 0xA984, + 0xFE68: 0xA985, + 0xFE69: 0xA986, + 0xFE6A: 0xA987, + 0xFE6B: 0xA988, + 0xFF01: 0xA3A1, + 0xFF02: 0xA3A2, + 0xFF03: 0xA3A3, + 0xFF04: 0xA1E7, + 0xFF05: 0xA3A5, + 0xFF06: 0xA3A6, + 0xFF07: 0xA3A7, + 0xFF08: 0xA3A8, + 0xFF09: 0xA3A9, + 0xFF0A: 0xA3AA, + 0xFF0B: 0xA3AB, + 0xFF0C: 0xA3AC, + 0xFF0D: 0xA3AD, + 0xFF0E: 0xA3AE, + 0xFF0F: 0xA3AF, + 0xFF10: 0xA3B0, + 0xFF11: 0xA3B1, + 0xFF12: 0xA3B2, + 0xFF13: 0xA3B3, + 0xFF14: 0xA3B4, + 0xFF15: 0xA3B5, + 0xFF16: 0xA3B6, + 0xFF17: 0xA3B7, + 0xFF18: 0xA3B8, + 0xFF19: 0xA3B9, + 0xFF1A: 0xA3BA, + 0xFF1B: 0xA3BB, + 0xFF1C: 0xA3BC, + 0xFF1D: 0xA3BD, + 0xFF1E: 0xA3BE, + 0xFF1F: 0xA3BF, + 0xFF20: 0xA3C0, + 0xFF21: 0xA3C1, + 0xFF22: 0xA3C2, + 0xFF23: 0xA3C3, + 0xFF24: 0xA3C4, + 0xFF25: 0xA3C5, + 0xFF26: 0xA3C6, + 0xFF27: 0xA3C7, + 0xFF28: 0xA3C8, + 0xFF29: 0xA3C9, + 0xFF2A: 0xA3CA, + 0xFF2B: 0xA3CB, + 0xFF2C: 0xA3CC, + 0xFF2D: 0xA3CD, + 0xFF2E: 0xA3CE, + 0xFF2F: 0xA3CF, + 0xFF30: 0xA3D0, + 0xFF31: 0xA3D1, + 0xFF32: 0xA3D2, + 0xFF33: 0xA3D3, + 0xFF34: 0xA3D4, + 0xFF35: 0xA3D5, + 0xFF36: 0xA3D6, + 0xFF37: 0xA3D7, + 0xFF38: 0xA3D8, + 0xFF39: 0xA3D9, + 0xFF3A: 0xA3DA, + 0xFF3B: 0xA3DB, + 0xFF3C: 0xA3DC, + 0xFF3D: 0xA3DD, + 0xFF3E: 0xA3DE, + 0xFF3F: 0xA3DF, + 0xFF40: 0xA3E0, + 0xFF41: 0xA3E1, + 0xFF42: 0xA3E2, + 0xFF43: 0xA3E3, + 0xFF44: 0xA3E4, + 0xFF45: 0xA3E5, + 0xFF46: 0xA3E6, + 0xFF47: 0xA3E7, + 0xFF48: 0xA3E8, + 0xFF49: 0xA3E9, + 0xFF4A: 0xA3EA, + 0xFF4B: 0xA3EB, + 0xFF4C: 0xA3EC, + 0xFF4D: 0xA3ED, + 0xFF4E: 0xA3EE, + 0xFF4F: 0xA3EF, + 0xFF50: 0xA3F0, + 0xFF51: 0xA3F1, + 0xFF52: 0xA3F2, + 0xFF53: 0xA3F3, + 0xFF54: 0xA3F4, + 0xFF55: 0xA3F5, + 0xFF56: 0xA3F6, + 0xFF57: 0xA3F7, + 0xFF58: 0xA3F8, + 0xFF59: 0xA3F9, + 0xFF5A: 0xA3FA, + 0xFF5B: 0xA3FB, + 0xFF5C: 0xA3FC, + 0xFF5D: 0xA3FD, + 0xFF5E: 0xA1AB, + 0xFFE0: 0xA1E9, + 0xFFE1: 0xA1EA, + 0xFFE2: 0xA956, + 0xFFE3: 0xA3FE, + 0xFFE4: 0xA957, + 0xFFE5: 0xA3A4, +} + +var gbkToUnicode = [65536]uint16{ + 0x8140: 0x4E02, + 0x8141: 0x4E04, + 0x8142: 0x4E05, + 0x8143: 0x4E06, + 0x8144: 0x4E0F, + 0x8145: 0x4E12, + 0x8146: 0x4E17, + 0x8147: 0x4E1F, + 0x8148: 0x4E20, + 0x8149: 0x4E21, + 0x814A: 0x4E23, + 0x814B: 0x4E26, + 0x814C: 0x4E29, + 0x814D: 0x4E2E, + 0x814E: 0x4E2F, + 0x814F: 0x4E31, + 0x8150: 0x4E33, + 0x8151: 0x4E35, + 0x8152: 0x4E37, + 0x8153: 0x4E3C, + 0x8154: 0x4E40, + 0x8155: 0x4E41, + 0x8156: 0x4E42, + 0x8157: 0x4E44, + 0x8158: 0x4E46, + 0x8159: 0x4E4A, + 0x815A: 0x4E51, + 0x815B: 0x4E55, + 0x815C: 0x4E57, + 0x815D: 0x4E5A, + 0x815E: 0x4E5B, + 0x815F: 0x4E62, + 0x8160: 0x4E63, + 0x8161: 0x4E64, + 0x8162: 0x4E65, + 0x8163: 0x4E67, + 0x8164: 0x4E68, + 0x8165: 0x4E6A, + 0x8166: 0x4E6B, + 0x8167: 0x4E6C, + 0x8168: 0x4E6D, + 0x8169: 0x4E6E, + 0x816A: 0x4E6F, + 0x816B: 0x4E72, + 0x816C: 0x4E74, + 0x816D: 0x4E75, + 0x816E: 0x4E76, + 0x816F: 0x4E77, + 0x8170: 0x4E78, + 0x8171: 0x4E79, + 0x8172: 0x4E7A, + 0x8173: 0x4E7B, + 0x8174: 0x4E7C, + 0x8175: 0x4E7D, + 0x8176: 0x4E7F, + 0x8177: 0x4E80, + 0x8178: 0x4E81, + 0x8179: 0x4E82, + 0x817A: 0x4E83, + 0x817B: 0x4E84, + 0x817C: 0x4E85, + 0x817D: 0x4E87, + 0x817E: 0x4E8A, + 0x8180: 0x4E90, + 0x8181: 0x4E96, + 0x8182: 0x4E97, + 0x8183: 0x4E99, + 0x8184: 0x4E9C, + 0x8185: 0x4E9D, + 0x8186: 0x4E9E, + 0x8187: 0x4EA3, + 0x8188: 0x4EAA, + 0x8189: 0x4EAF, + 0x818A: 0x4EB0, + 0x818B: 0x4EB1, + 0x818C: 0x4EB4, + 0x818D: 0x4EB6, + 0x818E: 0x4EB7, + 0x818F: 0x4EB8, + 0x8190: 0x4EB9, + 0x8191: 0x4EBC, + 0x8192: 0x4EBD, + 0x8193: 0x4EBE, + 0x8194: 0x4EC8, + 0x8195: 0x4ECC, + 0x8196: 0x4ECF, + 0x8197: 0x4ED0, + 0x8198: 0x4ED2, + 0x8199: 0x4EDA, + 0x819A: 0x4EDB, + 0x819B: 0x4EDC, + 0x819C: 0x4EE0, + 0x819D: 0x4EE2, + 0x819E: 0x4EE6, + 0x819F: 0x4EE7, + 0x81A0: 0x4EE9, + 0x81A1: 0x4EED, + 0x81A2: 0x4EEE, + 0x81A3: 0x4EEF, + 0x81A4: 0x4EF1, + 0x81A5: 0x4EF4, + 0x81A6: 0x4EF8, + 0x81A7: 0x4EF9, + 0x81A8: 0x4EFA, + 0x81A9: 0x4EFC, + 0x81AA: 0x4EFE, + 0x81AB: 0x4F00, + 0x81AC: 0x4F02, + 0x81AD: 0x4F03, + 0x81AE: 0x4F04, + 0x81AF: 0x4F05, + 0x81B0: 0x4F06, + 0x81B1: 0x4F07, + 0x81B2: 0x4F08, + 0x81B3: 0x4F0B, + 0x81B4: 0x4F0C, + 0x81B5: 0x4F12, + 0x81B6: 0x4F13, + 0x81B7: 0x4F14, + 0x81B8: 0x4F15, + 0x81B9: 0x4F16, + 0x81BA: 0x4F1C, + 0x81BB: 0x4F1D, + 0x81BC: 0x4F21, + 0x81BD: 0x4F23, + 0x81BE: 0x4F28, + 0x81BF: 0x4F29, + 0x81C0: 0x4F2C, + 0x81C1: 0x4F2D, + 0x81C2: 0x4F2E, + 0x81C3: 0x4F31, + 0x81C4: 0x4F33, + 0x81C5: 0x4F35, + 0x81C6: 0x4F37, + 0x81C7: 0x4F39, + 0x81C8: 0x4F3B, + 0x81C9: 0x4F3E, + 0x81CA: 0x4F3F, + 0x81CB: 0x4F40, + 0x81CC: 0x4F41, + 0x81CD: 0x4F42, + 0x81CE: 0x4F44, + 0x81CF: 0x4F45, + 0x81D0: 0x4F47, + 0x81D1: 0x4F48, + 0x81D2: 0x4F49, + 0x81D3: 0x4F4A, + 0x81D4: 0x4F4B, + 0x81D5: 0x4F4C, + 0x81D6: 0x4F52, + 0x81D7: 0x4F54, + 0x81D8: 0x4F56, + 0x81D9: 0x4F61, + 0x81DA: 0x4F62, + 0x81DB: 0x4F66, + 0x81DC: 0x4F68, + 0x81DD: 0x4F6A, + 0x81DE: 0x4F6B, + 0x81DF: 0x4F6D, + 0x81E0: 0x4F6E, + 0x81E1: 0x4F71, + 0x81E2: 0x4F72, + 0x81E3: 0x4F75, + 0x81E4: 0x4F77, + 0x81E5: 0x4F78, + 0x81E6: 0x4F79, + 0x81E7: 0x4F7A, + 0x81E8: 0x4F7D, + 0x81E9: 0x4F80, + 0x81EA: 0x4F81, + 0x81EB: 0x4F82, + 0x81EC: 0x4F85, + 0x81ED: 0x4F86, + 0x81EE: 0x4F87, + 0x81EF: 0x4F8A, + 0x81F0: 0x4F8C, + 0x81F1: 0x4F8E, + 0x81F2: 0x4F90, + 0x81F3: 0x4F92, + 0x81F4: 0x4F93, + 0x81F5: 0x4F95, + 0x81F6: 0x4F96, + 0x81F7: 0x4F98, + 0x81F8: 0x4F99, + 0x81F9: 0x4F9A, + 0x81FA: 0x4F9C, + 0x81FB: 0x4F9E, + 0x81FC: 0x4F9F, + 0x81FD: 0x4FA1, + 0x81FE: 0x4FA2, + 0x8240: 0x4FA4, + 0x8241: 0x4FAB, + 0x8242: 0x4FAD, + 0x8243: 0x4FB0, + 0x8244: 0x4FB1, + 0x8245: 0x4FB2, + 0x8246: 0x4FB3, + 0x8247: 0x4FB4, + 0x8248: 0x4FB6, + 0x8249: 0x4FB7, + 0x824A: 0x4FB8, + 0x824B: 0x4FB9, + 0x824C: 0x4FBA, + 0x824D: 0x4FBB, + 0x824E: 0x4FBC, + 0x824F: 0x4FBD, + 0x8250: 0x4FBE, + 0x8251: 0x4FC0, + 0x8252: 0x4FC1, + 0x8253: 0x4FC2, + 0x8254: 0x4FC6, + 0x8255: 0x4FC7, + 0x8256: 0x4FC8, + 0x8257: 0x4FC9, + 0x8258: 0x4FCB, + 0x8259: 0x4FCC, + 0x825A: 0x4FCD, + 0x825B: 0x4FD2, + 0x825C: 0x4FD3, + 0x825D: 0x4FD4, + 0x825E: 0x4FD5, + 0x825F: 0x4FD6, + 0x8260: 0x4FD9, + 0x8261: 0x4FDB, + 0x8262: 0x4FE0, + 0x8263: 0x4FE2, + 0x8264: 0x4FE4, + 0x8265: 0x4FE5, + 0x8266: 0x4FE7, + 0x8267: 0x4FEB, + 0x8268: 0x4FEC, + 0x8269: 0x4FF0, + 0x826A: 0x4FF2, + 0x826B: 0x4FF4, + 0x826C: 0x4FF5, + 0x826D: 0x4FF6, + 0x826E: 0x4FF7, + 0x826F: 0x4FF9, + 0x8270: 0x4FFB, + 0x8271: 0x4FFC, + 0x8272: 0x4FFD, + 0x8273: 0x4FFF, + 0x8274: 0x5000, + 0x8275: 0x5001, + 0x8276: 0x5002, + 0x8277: 0x5003, + 0x8278: 0x5004, + 0x8279: 0x5005, + 0x827A: 0x5006, + 0x827B: 0x5007, + 0x827C: 0x5008, + 0x827D: 0x5009, + 0x827E: 0x500A, + 0x8280: 0x500B, + 0x8281: 0x500E, + 0x8282: 0x5010, + 0x8283: 0x5011, + 0x8284: 0x5013, + 0x8285: 0x5015, + 0x8286: 0x5016, + 0x8287: 0x5017, + 0x8288: 0x501B, + 0x8289: 0x501D, + 0x828A: 0x501E, + 0x828B: 0x5020, + 0x828C: 0x5022, + 0x828D: 0x5023, + 0x828E: 0x5024, + 0x828F: 0x5027, + 0x8290: 0x502B, + 0x8291: 0x502F, + 0x8292: 0x5030, + 0x8293: 0x5031, + 0x8294: 0x5032, + 0x8295: 0x5033, + 0x8296: 0x5034, + 0x8297: 0x5035, + 0x8298: 0x5036, + 0x8299: 0x5037, + 0x829A: 0x5038, + 0x829B: 0x5039, + 0x829C: 0x503B, + 0x829D: 0x503D, + 0x829E: 0x503F, + 0x829F: 0x5040, + 0x82A0: 0x5041, + 0x82A1: 0x5042, + 0x82A2: 0x5044, + 0x82A3: 0x5045, + 0x82A4: 0x5046, + 0x82A5: 0x5049, + 0x82A6: 0x504A, + 0x82A7: 0x504B, + 0x82A8: 0x504D, + 0x82A9: 0x5050, + 0x82AA: 0x5051, + 0x82AB: 0x5052, + 0x82AC: 0x5053, + 0x82AD: 0x5054, + 0x82AE: 0x5056, + 0x82AF: 0x5057, + 0x82B0: 0x5058, + 0x82B1: 0x5059, + 0x82B2: 0x505B, + 0x82B3: 0x505D, + 0x82B4: 0x505E, + 0x82B5: 0x505F, + 0x82B6: 0x5060, + 0x82B7: 0x5061, + 0x82B8: 0x5062, + 0x82B9: 0x5063, + 0x82BA: 0x5064, + 0x82BB: 0x5066, + 0x82BC: 0x5067, + 0x82BD: 0x5068, + 0x82BE: 0x5069, + 0x82BF: 0x506A, + 0x82C0: 0x506B, + 0x82C1: 0x506D, + 0x82C2: 0x506E, + 0x82C3: 0x506F, + 0x82C4: 0x5070, + 0x82C5: 0x5071, + 0x82C6: 0x5072, + 0x82C7: 0x5073, + 0x82C8: 0x5074, + 0x82C9: 0x5075, + 0x82CA: 0x5078, + 0x82CB: 0x5079, + 0x82CC: 0x507A, + 0x82CD: 0x507C, + 0x82CE: 0x507D, + 0x82CF: 0x5081, + 0x82D0: 0x5082, + 0x82D1: 0x5083, + 0x82D2: 0x5084, + 0x82D3: 0x5086, + 0x82D4: 0x5087, + 0x82D5: 0x5089, + 0x82D6: 0x508A, + 0x82D7: 0x508B, + 0x82D8: 0x508C, + 0x82D9: 0x508E, + 0x82DA: 0x508F, + 0x82DB: 0x5090, + 0x82DC: 0x5091, + 0x82DD: 0x5092, + 0x82DE: 0x5093, + 0x82DF: 0x5094, + 0x82E0: 0x5095, + 0x82E1: 0x5096, + 0x82E2: 0x5097, + 0x82E3: 0x5098, + 0x82E4: 0x5099, + 0x82E5: 0x509A, + 0x82E6: 0x509B, + 0x82E7: 0x509C, + 0x82E8: 0x509D, + 0x82E9: 0x509E, + 0x82EA: 0x509F, + 0x82EB: 0x50A0, + 0x82EC: 0x50A1, + 0x82ED: 0x50A2, + 0x82EE: 0x50A4, + 0x82EF: 0x50A6, + 0x82F0: 0x50AA, + 0x82F1: 0x50AB, + 0x82F2: 0x50AD, + 0x82F3: 0x50AE, + 0x82F4: 0x50AF, + 0x82F5: 0x50B0, + 0x82F6: 0x50B1, + 0x82F7: 0x50B3, + 0x82F8: 0x50B4, + 0x82F9: 0x50B5, + 0x82FA: 0x50B6, + 0x82FB: 0x50B7, + 0x82FC: 0x50B8, + 0x82FD: 0x50B9, + 0x82FE: 0x50BC, + 0x8340: 0x50BD, + 0x8341: 0x50BE, + 0x8342: 0x50BF, + 0x8343: 0x50C0, + 0x8344: 0x50C1, + 0x8345: 0x50C2, + 0x8346: 0x50C3, + 0x8347: 0x50C4, + 0x8348: 0x50C5, + 0x8349: 0x50C6, + 0x834A: 0x50C7, + 0x834B: 0x50C8, + 0x834C: 0x50C9, + 0x834D: 0x50CA, + 0x834E: 0x50CB, + 0x834F: 0x50CC, + 0x8350: 0x50CD, + 0x8351: 0x50CE, + 0x8352: 0x50D0, + 0x8353: 0x50D1, + 0x8354: 0x50D2, + 0x8355: 0x50D3, + 0x8356: 0x50D4, + 0x8357: 0x50D5, + 0x8358: 0x50D7, + 0x8359: 0x50D8, + 0x835A: 0x50D9, + 0x835B: 0x50DB, + 0x835C: 0x50DC, + 0x835D: 0x50DD, + 0x835E: 0x50DE, + 0x835F: 0x50DF, + 0x8360: 0x50E0, + 0x8361: 0x50E1, + 0x8362: 0x50E2, + 0x8363: 0x50E3, + 0x8364: 0x50E4, + 0x8365: 0x50E5, + 0x8366: 0x50E8, + 0x8367: 0x50E9, + 0x8368: 0x50EA, + 0x8369: 0x50EB, + 0x836A: 0x50EF, + 0x836B: 0x50F0, + 0x836C: 0x50F1, + 0x836D: 0x50F2, + 0x836E: 0x50F4, + 0x836F: 0x50F6, + 0x8370: 0x50F7, + 0x8371: 0x50F8, + 0x8372: 0x50F9, + 0x8373: 0x50FA, + 0x8374: 0x50FC, + 0x8375: 0x50FD, + 0x8376: 0x50FE, + 0x8377: 0x50FF, + 0x8378: 0x5100, + 0x8379: 0x5101, + 0x837A: 0x5102, + 0x837B: 0x5103, + 0x837C: 0x5104, + 0x837D: 0x5105, + 0x837E: 0x5108, + 0x8380: 0x5109, + 0x8381: 0x510A, + 0x8382: 0x510C, + 0x8383: 0x510D, + 0x8384: 0x510E, + 0x8385: 0x510F, + 0x8386: 0x5110, + 0x8387: 0x5111, + 0x8388: 0x5113, + 0x8389: 0x5114, + 0x838A: 0x5115, + 0x838B: 0x5116, + 0x838C: 0x5117, + 0x838D: 0x5118, + 0x838E: 0x5119, + 0x838F: 0x511A, + 0x8390: 0x511B, + 0x8391: 0x511C, + 0x8392: 0x511D, + 0x8393: 0x511E, + 0x8394: 0x511F, + 0x8395: 0x5120, + 0x8396: 0x5122, + 0x8397: 0x5123, + 0x8398: 0x5124, + 0x8399: 0x5125, + 0x839A: 0x5126, + 0x839B: 0x5127, + 0x839C: 0x5128, + 0x839D: 0x5129, + 0x839E: 0x512A, + 0x839F: 0x512B, + 0x83A0: 0x512C, + 0x83A1: 0x512D, + 0x83A2: 0x512E, + 0x83A3: 0x512F, + 0x83A4: 0x5130, + 0x83A5: 0x5131, + 0x83A6: 0x5132, + 0x83A7: 0x5133, + 0x83A8: 0x5134, + 0x83A9: 0x5135, + 0x83AA: 0x5136, + 0x83AB: 0x5137, + 0x83AC: 0x5138, + 0x83AD: 0x5139, + 0x83AE: 0x513A, + 0x83AF: 0x513B, + 0x83B0: 0x513C, + 0x83B1: 0x513D, + 0x83B2: 0x513E, + 0x83B3: 0x5142, + 0x83B4: 0x5147, + 0x83B5: 0x514A, + 0x83B6: 0x514C, + 0x83B7: 0x514E, + 0x83B8: 0x514F, + 0x83B9: 0x5150, + 0x83BA: 0x5152, + 0x83BB: 0x5153, + 0x83BC: 0x5157, + 0x83BD: 0x5158, + 0x83BE: 0x5159, + 0x83BF: 0x515B, + 0x83C0: 0x515D, + 0x83C1: 0x515E, + 0x83C2: 0x515F, + 0x83C3: 0x5160, + 0x83C4: 0x5161, + 0x83C5: 0x5163, + 0x83C6: 0x5164, + 0x83C7: 0x5166, + 0x83C8: 0x5167, + 0x83C9: 0x5169, + 0x83CA: 0x516A, + 0x83CB: 0x516F, + 0x83CC: 0x5172, + 0x83CD: 0x517A, + 0x83CE: 0x517E, + 0x83CF: 0x517F, + 0x83D0: 0x5183, + 0x83D1: 0x5184, + 0x83D2: 0x5186, + 0x83D3: 0x5187, + 0x83D4: 0x518A, + 0x83D5: 0x518B, + 0x83D6: 0x518E, + 0x83D7: 0x518F, + 0x83D8: 0x5190, + 0x83D9: 0x5191, + 0x83DA: 0x5193, + 0x83DB: 0x5194, + 0x83DC: 0x5198, + 0x83DD: 0x519A, + 0x83DE: 0x519D, + 0x83DF: 0x519E, + 0x83E0: 0x519F, + 0x83E1: 0x51A1, + 0x83E2: 0x51A3, + 0x83E3: 0x51A6, + 0x83E4: 0x51A7, + 0x83E5: 0x51A8, + 0x83E6: 0x51A9, + 0x83E7: 0x51AA, + 0x83E8: 0x51AD, + 0x83E9: 0x51AE, + 0x83EA: 0x51B4, + 0x83EB: 0x51B8, + 0x83EC: 0x51B9, + 0x83ED: 0x51BA, + 0x83EE: 0x51BE, + 0x83EF: 0x51BF, + 0x83F0: 0x51C1, + 0x83F1: 0x51C2, + 0x83F2: 0x51C3, + 0x83F3: 0x51C5, + 0x83F4: 0x51C8, + 0x83F5: 0x51CA, + 0x83F6: 0x51CD, + 0x83F7: 0x51CE, + 0x83F8: 0x51D0, + 0x83F9: 0x51D2, + 0x83FA: 0x51D3, + 0x83FB: 0x51D4, + 0x83FC: 0x51D5, + 0x83FD: 0x51D6, + 0x83FE: 0x51D7, + 0x8440: 0x51D8, + 0x8441: 0x51D9, + 0x8442: 0x51DA, + 0x8443: 0x51DC, + 0x8444: 0x51DE, + 0x8445: 0x51DF, + 0x8446: 0x51E2, + 0x8447: 0x51E3, + 0x8448: 0x51E5, + 0x8449: 0x51E6, + 0x844A: 0x51E7, + 0x844B: 0x51E8, + 0x844C: 0x51E9, + 0x844D: 0x51EA, + 0x844E: 0x51EC, + 0x844F: 0x51EE, + 0x8450: 0x51F1, + 0x8451: 0x51F2, + 0x8452: 0x51F4, + 0x8453: 0x51F7, + 0x8454: 0x51FE, + 0x8455: 0x5204, + 0x8456: 0x5205, + 0x8457: 0x5209, + 0x8458: 0x520B, + 0x8459: 0x520C, + 0x845A: 0x520F, + 0x845B: 0x5210, + 0x845C: 0x5213, + 0x845D: 0x5214, + 0x845E: 0x5215, + 0x845F: 0x521C, + 0x8460: 0x521E, + 0x8461: 0x521F, + 0x8462: 0x5221, + 0x8463: 0x5222, + 0x8464: 0x5223, + 0x8465: 0x5225, + 0x8466: 0x5226, + 0x8467: 0x5227, + 0x8468: 0x522A, + 0x8469: 0x522C, + 0x846A: 0x522F, + 0x846B: 0x5231, + 0x846C: 0x5232, + 0x846D: 0x5234, + 0x846E: 0x5235, + 0x846F: 0x523C, + 0x8470: 0x523E, + 0x8471: 0x5244, + 0x8472: 0x5245, + 0x8473: 0x5246, + 0x8474: 0x5247, + 0x8475: 0x5248, + 0x8476: 0x5249, + 0x8477: 0x524B, + 0x8478: 0x524E, + 0x8479: 0x524F, + 0x847A: 0x5252, + 0x847B: 0x5253, + 0x847C: 0x5255, + 0x847D: 0x5257, + 0x847E: 0x5258, + 0x8480: 0x5259, + 0x8481: 0x525A, + 0x8482: 0x525B, + 0x8483: 0x525D, + 0x8484: 0x525F, + 0x8485: 0x5260, + 0x8486: 0x5262, + 0x8487: 0x5263, + 0x8488: 0x5264, + 0x8489: 0x5266, + 0x848A: 0x5268, + 0x848B: 0x526B, + 0x848C: 0x526C, + 0x848D: 0x526D, + 0x848E: 0x526E, + 0x848F: 0x5270, + 0x8490: 0x5271, + 0x8491: 0x5273, + 0x8492: 0x5274, + 0x8493: 0x5275, + 0x8494: 0x5276, + 0x8495: 0x5277, + 0x8496: 0x5278, + 0x8497: 0x5279, + 0x8498: 0x527A, + 0x8499: 0x527B, + 0x849A: 0x527C, + 0x849B: 0x527E, + 0x849C: 0x5280, + 0x849D: 0x5283, + 0x849E: 0x5284, + 0x849F: 0x5285, + 0x84A0: 0x5286, + 0x84A1: 0x5287, + 0x84A2: 0x5289, + 0x84A3: 0x528A, + 0x84A4: 0x528B, + 0x84A5: 0x528C, + 0x84A6: 0x528D, + 0x84A7: 0x528E, + 0x84A8: 0x528F, + 0x84A9: 0x5291, + 0x84AA: 0x5292, + 0x84AB: 0x5294, + 0x84AC: 0x5295, + 0x84AD: 0x5296, + 0x84AE: 0x5297, + 0x84AF: 0x5298, + 0x84B0: 0x5299, + 0x84B1: 0x529A, + 0x84B2: 0x529C, + 0x84B3: 0x52A4, + 0x84B4: 0x52A5, + 0x84B5: 0x52A6, + 0x84B6: 0x52A7, + 0x84B7: 0x52AE, + 0x84B8: 0x52AF, + 0x84B9: 0x52B0, + 0x84BA: 0x52B4, + 0x84BB: 0x52B5, + 0x84BC: 0x52B6, + 0x84BD: 0x52B7, + 0x84BE: 0x52B8, + 0x84BF: 0x52B9, + 0x84C0: 0x52BA, + 0x84C1: 0x52BB, + 0x84C2: 0x52BC, + 0x84C3: 0x52BD, + 0x84C4: 0x52C0, + 0x84C5: 0x52C1, + 0x84C6: 0x52C2, + 0x84C7: 0x52C4, + 0x84C8: 0x52C5, + 0x84C9: 0x52C6, + 0x84CA: 0x52C8, + 0x84CB: 0x52CA, + 0x84CC: 0x52CC, + 0x84CD: 0x52CD, + 0x84CE: 0x52CE, + 0x84CF: 0x52CF, + 0x84D0: 0x52D1, + 0x84D1: 0x52D3, + 0x84D2: 0x52D4, + 0x84D3: 0x52D5, + 0x84D4: 0x52D7, + 0x84D5: 0x52D9, + 0x84D6: 0x52DA, + 0x84D7: 0x52DB, + 0x84D8: 0x52DC, + 0x84D9: 0x52DD, + 0x84DA: 0x52DE, + 0x84DB: 0x52E0, + 0x84DC: 0x52E1, + 0x84DD: 0x52E2, + 0x84DE: 0x52E3, + 0x84DF: 0x52E5, + 0x84E0: 0x52E6, + 0x84E1: 0x52E7, + 0x84E2: 0x52E8, + 0x84E3: 0x52E9, + 0x84E4: 0x52EA, + 0x84E5: 0x52EB, + 0x84E6: 0x52EC, + 0x84E7: 0x52ED, + 0x84E8: 0x52EE, + 0x84E9: 0x52EF, + 0x84EA: 0x52F1, + 0x84EB: 0x52F2, + 0x84EC: 0x52F3, + 0x84ED: 0x52F4, + 0x84EE: 0x52F5, + 0x84EF: 0x52F6, + 0x84F0: 0x52F7, + 0x84F1: 0x52F8, + 0x84F2: 0x52FB, + 0x84F3: 0x52FC, + 0x84F4: 0x52FD, + 0x84F5: 0x5301, + 0x84F6: 0x5302, + 0x84F7: 0x5303, + 0x84F8: 0x5304, + 0x84F9: 0x5307, + 0x84FA: 0x5309, + 0x84FB: 0x530A, + 0x84FC: 0x530B, + 0x84FD: 0x530C, + 0x84FE: 0x530E, + 0x8540: 0x5311, + 0x8541: 0x5312, + 0x8542: 0x5313, + 0x8543: 0x5314, + 0x8544: 0x5318, + 0x8545: 0x531B, + 0x8546: 0x531C, + 0x8547: 0x531E, + 0x8548: 0x531F, + 0x8549: 0x5322, + 0x854A: 0x5324, + 0x854B: 0x5325, + 0x854C: 0x5327, + 0x854D: 0x5328, + 0x854E: 0x5329, + 0x854F: 0x532B, + 0x8550: 0x532C, + 0x8551: 0x532D, + 0x8552: 0x532F, + 0x8553: 0x5330, + 0x8554: 0x5331, + 0x8555: 0x5332, + 0x8556: 0x5333, + 0x8557: 0x5334, + 0x8558: 0x5335, + 0x8559: 0x5336, + 0x855A: 0x5337, + 0x855B: 0x5338, + 0x855C: 0x533C, + 0x855D: 0x533D, + 0x855E: 0x5340, + 0x855F: 0x5342, + 0x8560: 0x5344, + 0x8561: 0x5346, + 0x8562: 0x534B, + 0x8563: 0x534C, + 0x8564: 0x534D, + 0x8565: 0x5350, + 0x8566: 0x5354, + 0x8567: 0x5358, + 0x8568: 0x5359, + 0x8569: 0x535B, + 0x856A: 0x535D, + 0x856B: 0x5365, + 0x856C: 0x5368, + 0x856D: 0x536A, + 0x856E: 0x536C, + 0x856F: 0x536D, + 0x8570: 0x5372, + 0x8571: 0x5376, + 0x8572: 0x5379, + 0x8573: 0x537B, + 0x8574: 0x537C, + 0x8575: 0x537D, + 0x8576: 0x537E, + 0x8577: 0x5380, + 0x8578: 0x5381, + 0x8579: 0x5383, + 0x857A: 0x5387, + 0x857B: 0x5388, + 0x857C: 0x538A, + 0x857D: 0x538E, + 0x857E: 0x538F, + 0x8580: 0x5390, + 0x8581: 0x5391, + 0x8582: 0x5392, + 0x8583: 0x5393, + 0x8584: 0x5394, + 0x8585: 0x5396, + 0x8586: 0x5397, + 0x8587: 0x5399, + 0x8588: 0x539B, + 0x8589: 0x539C, + 0x858A: 0x539E, + 0x858B: 0x53A0, + 0x858C: 0x53A1, + 0x858D: 0x53A4, + 0x858E: 0x53A7, + 0x858F: 0x53AA, + 0x8590: 0x53AB, + 0x8591: 0x53AC, + 0x8592: 0x53AD, + 0x8593: 0x53AF, + 0x8594: 0x53B0, + 0x8595: 0x53B1, + 0x8596: 0x53B2, + 0x8597: 0x53B3, + 0x8598: 0x53B4, + 0x8599: 0x53B5, + 0x859A: 0x53B7, + 0x859B: 0x53B8, + 0x859C: 0x53B9, + 0x859D: 0x53BA, + 0x859E: 0x53BC, + 0x859F: 0x53BD, + 0x85A0: 0x53BE, + 0x85A1: 0x53C0, + 0x85A2: 0x53C3, + 0x85A3: 0x53C4, + 0x85A4: 0x53C5, + 0x85A5: 0x53C6, + 0x85A6: 0x53C7, + 0x85A7: 0x53CE, + 0x85A8: 0x53CF, + 0x85A9: 0x53D0, + 0x85AA: 0x53D2, + 0x85AB: 0x53D3, + 0x85AC: 0x53D5, + 0x85AD: 0x53DA, + 0x85AE: 0x53DC, + 0x85AF: 0x53DD, + 0x85B0: 0x53DE, + 0x85B1: 0x53E1, + 0x85B2: 0x53E2, + 0x85B3: 0x53E7, + 0x85B4: 0x53F4, + 0x85B5: 0x53FA, + 0x85B6: 0x53FE, + 0x85B7: 0x53FF, + 0x85B8: 0x5400, + 0x85B9: 0x5402, + 0x85BA: 0x5405, + 0x85BB: 0x5407, + 0x85BC: 0x540B, + 0x85BD: 0x5414, + 0x85BE: 0x5418, + 0x85BF: 0x5419, + 0x85C0: 0x541A, + 0x85C1: 0x541C, + 0x85C2: 0x5422, + 0x85C3: 0x5424, + 0x85C4: 0x5425, + 0x85C5: 0x542A, + 0x85C6: 0x5430, + 0x85C7: 0x5433, + 0x85C8: 0x5436, + 0x85C9: 0x5437, + 0x85CA: 0x543A, + 0x85CB: 0x543D, + 0x85CC: 0x543F, + 0x85CD: 0x5441, + 0x85CE: 0x5442, + 0x85CF: 0x5444, + 0x85D0: 0x5445, + 0x85D1: 0x5447, + 0x85D2: 0x5449, + 0x85D3: 0x544C, + 0x85D4: 0x544D, + 0x85D5: 0x544E, + 0x85D6: 0x544F, + 0x85D7: 0x5451, + 0x85D8: 0x545A, + 0x85D9: 0x545D, + 0x85DA: 0x545E, + 0x85DB: 0x545F, + 0x85DC: 0x5460, + 0x85DD: 0x5461, + 0x85DE: 0x5463, + 0x85DF: 0x5465, + 0x85E0: 0x5467, + 0x85E1: 0x5469, + 0x85E2: 0x546A, + 0x85E3: 0x546B, + 0x85E4: 0x546C, + 0x85E5: 0x546D, + 0x85E6: 0x546E, + 0x85E7: 0x546F, + 0x85E8: 0x5470, + 0x85E9: 0x5474, + 0x85EA: 0x5479, + 0x85EB: 0x547A, + 0x85EC: 0x547E, + 0x85ED: 0x547F, + 0x85EE: 0x5481, + 0x85EF: 0x5483, + 0x85F0: 0x5485, + 0x85F1: 0x5487, + 0x85F2: 0x5488, + 0x85F3: 0x5489, + 0x85F4: 0x548A, + 0x85F5: 0x548D, + 0x85F6: 0x5491, + 0x85F7: 0x5493, + 0x85F8: 0x5497, + 0x85F9: 0x5498, + 0x85FA: 0x549C, + 0x85FB: 0x549E, + 0x85FC: 0x549F, + 0x85FD: 0x54A0, + 0x85FE: 0x54A1, + 0x8640: 0x54A2, + 0x8641: 0x54A5, + 0x8642: 0x54AE, + 0x8643: 0x54B0, + 0x8644: 0x54B2, + 0x8645: 0x54B5, + 0x8646: 0x54B6, + 0x8647: 0x54B7, + 0x8648: 0x54B9, + 0x8649: 0x54BA, + 0x864A: 0x54BC, + 0x864B: 0x54BE, + 0x864C: 0x54C3, + 0x864D: 0x54C5, + 0x864E: 0x54CA, + 0x864F: 0x54CB, + 0x8650: 0x54D6, + 0x8651: 0x54D8, + 0x8652: 0x54DB, + 0x8653: 0x54E0, + 0x8654: 0x54E1, + 0x8655: 0x54E2, + 0x8656: 0x54E3, + 0x8657: 0x54E4, + 0x8658: 0x54EB, + 0x8659: 0x54EC, + 0x865A: 0x54EF, + 0x865B: 0x54F0, + 0x865C: 0x54F1, + 0x865D: 0x54F4, + 0x865E: 0x54F5, + 0x865F: 0x54F6, + 0x8660: 0x54F7, + 0x8661: 0x54F8, + 0x8662: 0x54F9, + 0x8663: 0x54FB, + 0x8664: 0x54FE, + 0x8665: 0x5500, + 0x8666: 0x5502, + 0x8667: 0x5503, + 0x8668: 0x5504, + 0x8669: 0x5505, + 0x866A: 0x5508, + 0x866B: 0x550A, + 0x866C: 0x550B, + 0x866D: 0x550C, + 0x866E: 0x550D, + 0x866F: 0x550E, + 0x8670: 0x5512, + 0x8671: 0x5513, + 0x8672: 0x5515, + 0x8673: 0x5516, + 0x8674: 0x5517, + 0x8675: 0x5518, + 0x8676: 0x5519, + 0x8677: 0x551A, + 0x8678: 0x551C, + 0x8679: 0x551D, + 0x867A: 0x551E, + 0x867B: 0x551F, + 0x867C: 0x5521, + 0x867D: 0x5525, + 0x867E: 0x5526, + 0x8680: 0x5528, + 0x8681: 0x5529, + 0x8682: 0x552B, + 0x8683: 0x552D, + 0x8684: 0x5532, + 0x8685: 0x5534, + 0x8686: 0x5535, + 0x8687: 0x5536, + 0x8688: 0x5538, + 0x8689: 0x5539, + 0x868A: 0x553A, + 0x868B: 0x553B, + 0x868C: 0x553D, + 0x868D: 0x5540, + 0x868E: 0x5542, + 0x868F: 0x5545, + 0x8690: 0x5547, + 0x8691: 0x5548, + 0x8692: 0x554B, + 0x8693: 0x554C, + 0x8694: 0x554D, + 0x8695: 0x554E, + 0x8696: 0x554F, + 0x8697: 0x5551, + 0x8698: 0x5552, + 0x8699: 0x5553, + 0x869A: 0x5554, + 0x869B: 0x5557, + 0x869C: 0x5558, + 0x869D: 0x5559, + 0x869E: 0x555A, + 0x869F: 0x555B, + 0x86A0: 0x555D, + 0x86A1: 0x555E, + 0x86A2: 0x555F, + 0x86A3: 0x5560, + 0x86A4: 0x5562, + 0x86A5: 0x5563, + 0x86A6: 0x5568, + 0x86A7: 0x5569, + 0x86A8: 0x556B, + 0x86A9: 0x556F, + 0x86AA: 0x5570, + 0x86AB: 0x5571, + 0x86AC: 0x5572, + 0x86AD: 0x5573, + 0x86AE: 0x5574, + 0x86AF: 0x5579, + 0x86B0: 0x557A, + 0x86B1: 0x557D, + 0x86B2: 0x557F, + 0x86B3: 0x5585, + 0x86B4: 0x5586, + 0x86B5: 0x558C, + 0x86B6: 0x558D, + 0x86B7: 0x558E, + 0x86B8: 0x5590, + 0x86B9: 0x5592, + 0x86BA: 0x5593, + 0x86BB: 0x5595, + 0x86BC: 0x5596, + 0x86BD: 0x5597, + 0x86BE: 0x559A, + 0x86BF: 0x559B, + 0x86C0: 0x559E, + 0x86C1: 0x55A0, + 0x86C2: 0x55A1, + 0x86C3: 0x55A2, + 0x86C4: 0x55A3, + 0x86C5: 0x55A4, + 0x86C6: 0x55A5, + 0x86C7: 0x55A6, + 0x86C8: 0x55A8, + 0x86C9: 0x55A9, + 0x86CA: 0x55AA, + 0x86CB: 0x55AB, + 0x86CC: 0x55AC, + 0x86CD: 0x55AD, + 0x86CE: 0x55AE, + 0x86CF: 0x55AF, + 0x86D0: 0x55B0, + 0x86D1: 0x55B2, + 0x86D2: 0x55B4, + 0x86D3: 0x55B6, + 0x86D4: 0x55B8, + 0x86D5: 0x55BA, + 0x86D6: 0x55BC, + 0x86D7: 0x55BF, + 0x86D8: 0x55C0, + 0x86D9: 0x55C1, + 0x86DA: 0x55C2, + 0x86DB: 0x55C3, + 0x86DC: 0x55C6, + 0x86DD: 0x55C7, + 0x86DE: 0x55C8, + 0x86DF: 0x55CA, + 0x86E0: 0x55CB, + 0x86E1: 0x55CE, + 0x86E2: 0x55CF, + 0x86E3: 0x55D0, + 0x86E4: 0x55D5, + 0x86E5: 0x55D7, + 0x86E6: 0x55D8, + 0x86E7: 0x55D9, + 0x86E8: 0x55DA, + 0x86E9: 0x55DB, + 0x86EA: 0x55DE, + 0x86EB: 0x55E0, + 0x86EC: 0x55E2, + 0x86ED: 0x55E7, + 0x86EE: 0x55E9, + 0x86EF: 0x55ED, + 0x86F0: 0x55EE, + 0x86F1: 0x55F0, + 0x86F2: 0x55F1, + 0x86F3: 0x55F4, + 0x86F4: 0x55F6, + 0x86F5: 0x55F8, + 0x86F6: 0x55F9, + 0x86F7: 0x55FA, + 0x86F8: 0x55FB, + 0x86F9: 0x55FC, + 0x86FA: 0x55FF, + 0x86FB: 0x5602, + 0x86FC: 0x5603, + 0x86FD: 0x5604, + 0x86FE: 0x5605, + 0x8740: 0x5606, + 0x8741: 0x5607, + 0x8742: 0x560A, + 0x8743: 0x560B, + 0x8744: 0x560D, + 0x8745: 0x5610, + 0x8746: 0x5611, + 0x8747: 0x5612, + 0x8748: 0x5613, + 0x8749: 0x5614, + 0x874A: 0x5615, + 0x874B: 0x5616, + 0x874C: 0x5617, + 0x874D: 0x5619, + 0x874E: 0x561A, + 0x874F: 0x561C, + 0x8750: 0x561D, + 0x8751: 0x5620, + 0x8752: 0x5621, + 0x8753: 0x5622, + 0x8754: 0x5625, + 0x8755: 0x5626, + 0x8756: 0x5628, + 0x8757: 0x5629, + 0x8758: 0x562A, + 0x8759: 0x562B, + 0x875A: 0x562E, + 0x875B: 0x562F, + 0x875C: 0x5630, + 0x875D: 0x5633, + 0x875E: 0x5635, + 0x875F: 0x5637, + 0x8760: 0x5638, + 0x8761: 0x563A, + 0x8762: 0x563C, + 0x8763: 0x563D, + 0x8764: 0x563E, + 0x8765: 0x5640, + 0x8766: 0x5641, + 0x8767: 0x5642, + 0x8768: 0x5643, + 0x8769: 0x5644, + 0x876A: 0x5645, + 0x876B: 0x5646, + 0x876C: 0x5647, + 0x876D: 0x5648, + 0x876E: 0x5649, + 0x876F: 0x564A, + 0x8770: 0x564B, + 0x8771: 0x564F, + 0x8772: 0x5650, + 0x8773: 0x5651, + 0x8774: 0x5652, + 0x8775: 0x5653, + 0x8776: 0x5655, + 0x8777: 0x5656, + 0x8778: 0x565A, + 0x8779: 0x565B, + 0x877A: 0x565D, + 0x877B: 0x565E, + 0x877C: 0x565F, + 0x877D: 0x5660, + 0x877E: 0x5661, + 0x8780: 0x5663, + 0x8781: 0x5665, + 0x8782: 0x5666, + 0x8783: 0x5667, + 0x8784: 0x566D, + 0x8785: 0x566E, + 0x8786: 0x566F, + 0x8787: 0x5670, + 0x8788: 0x5672, + 0x8789: 0x5673, + 0x878A: 0x5674, + 0x878B: 0x5675, + 0x878C: 0x5677, + 0x878D: 0x5678, + 0x878E: 0x5679, + 0x878F: 0x567A, + 0x8790: 0x567D, + 0x8791: 0x567E, + 0x8792: 0x567F, + 0x8793: 0x5680, + 0x8794: 0x5681, + 0x8795: 0x5682, + 0x8796: 0x5683, + 0x8797: 0x5684, + 0x8798: 0x5687, + 0x8799: 0x5688, + 0x879A: 0x5689, + 0x879B: 0x568A, + 0x879C: 0x568B, + 0x879D: 0x568C, + 0x879E: 0x568D, + 0x879F: 0x5690, + 0x87A0: 0x5691, + 0x87A1: 0x5692, + 0x87A2: 0x5694, + 0x87A3: 0x5695, + 0x87A4: 0x5696, + 0x87A5: 0x5697, + 0x87A6: 0x5698, + 0x87A7: 0x5699, + 0x87A8: 0x569A, + 0x87A9: 0x569B, + 0x87AA: 0x569C, + 0x87AB: 0x569D, + 0x87AC: 0x569E, + 0x87AD: 0x569F, + 0x87AE: 0x56A0, + 0x87AF: 0x56A1, + 0x87B0: 0x56A2, + 0x87B1: 0x56A4, + 0x87B2: 0x56A5, + 0x87B3: 0x56A6, + 0x87B4: 0x56A7, + 0x87B5: 0x56A8, + 0x87B6: 0x56A9, + 0x87B7: 0x56AA, + 0x87B8: 0x56AB, + 0x87B9: 0x56AC, + 0x87BA: 0x56AD, + 0x87BB: 0x56AE, + 0x87BC: 0x56B0, + 0x87BD: 0x56B1, + 0x87BE: 0x56B2, + 0x87BF: 0x56B3, + 0x87C0: 0x56B4, + 0x87C1: 0x56B5, + 0x87C2: 0x56B6, + 0x87C3: 0x56B8, + 0x87C4: 0x56B9, + 0x87C5: 0x56BA, + 0x87C6: 0x56BB, + 0x87C7: 0x56BD, + 0x87C8: 0x56BE, + 0x87C9: 0x56BF, + 0x87CA: 0x56C0, + 0x87CB: 0x56C1, + 0x87CC: 0x56C2, + 0x87CD: 0x56C3, + 0x87CE: 0x56C4, + 0x87CF: 0x56C5, + 0x87D0: 0x56C6, + 0x87D1: 0x56C7, + 0x87D2: 0x56C8, + 0x87D3: 0x56C9, + 0x87D4: 0x56CB, + 0x87D5: 0x56CC, + 0x87D6: 0x56CD, + 0x87D7: 0x56CE, + 0x87D8: 0x56CF, + 0x87D9: 0x56D0, + 0x87DA: 0x56D1, + 0x87DB: 0x56D2, + 0x87DC: 0x56D3, + 0x87DD: 0x56D5, + 0x87DE: 0x56D6, + 0x87DF: 0x56D8, + 0x87E0: 0x56D9, + 0x87E1: 0x56DC, + 0x87E2: 0x56E3, + 0x87E3: 0x56E5, + 0x87E4: 0x56E6, + 0x87E5: 0x56E7, + 0x87E6: 0x56E8, + 0x87E7: 0x56E9, + 0x87E8: 0x56EA, + 0x87E9: 0x56EC, + 0x87EA: 0x56EE, + 0x87EB: 0x56EF, + 0x87EC: 0x56F2, + 0x87ED: 0x56F3, + 0x87EE: 0x56F6, + 0x87EF: 0x56F7, + 0x87F0: 0x56F8, + 0x87F1: 0x56FB, + 0x87F2: 0x56FC, + 0x87F3: 0x5700, + 0x87F4: 0x5701, + 0x87F5: 0x5702, + 0x87F6: 0x5705, + 0x87F7: 0x5707, + 0x87F8: 0x570B, + 0x87F9: 0x570C, + 0x87FA: 0x570D, + 0x87FB: 0x570E, + 0x87FC: 0x570F, + 0x87FD: 0x5710, + 0x87FE: 0x5711, + 0x8840: 0x5712, + 0x8841: 0x5713, + 0x8842: 0x5714, + 0x8843: 0x5715, + 0x8844: 0x5716, + 0x8845: 0x5717, + 0x8846: 0x5718, + 0x8847: 0x5719, + 0x8848: 0x571A, + 0x8849: 0x571B, + 0x884A: 0x571D, + 0x884B: 0x571E, + 0x884C: 0x5720, + 0x884D: 0x5721, + 0x884E: 0x5722, + 0x884F: 0x5724, + 0x8850: 0x5725, + 0x8851: 0x5726, + 0x8852: 0x5727, + 0x8853: 0x572B, + 0x8854: 0x5731, + 0x8855: 0x5732, + 0x8856: 0x5734, + 0x8857: 0x5735, + 0x8858: 0x5736, + 0x8859: 0x5737, + 0x885A: 0x5738, + 0x885B: 0x573C, + 0x885C: 0x573D, + 0x885D: 0x573F, + 0x885E: 0x5741, + 0x885F: 0x5743, + 0x8860: 0x5744, + 0x8861: 0x5745, + 0x8862: 0x5746, + 0x8863: 0x5748, + 0x8864: 0x5749, + 0x8865: 0x574B, + 0x8866: 0x5752, + 0x8867: 0x5753, + 0x8868: 0x5754, + 0x8869: 0x5755, + 0x886A: 0x5756, + 0x886B: 0x5758, + 0x886C: 0x5759, + 0x886D: 0x5762, + 0x886E: 0x5763, + 0x886F: 0x5765, + 0x8870: 0x5767, + 0x8871: 0x576C, + 0x8872: 0x576E, + 0x8873: 0x5770, + 0x8874: 0x5771, + 0x8875: 0x5772, + 0x8876: 0x5774, + 0x8877: 0x5775, + 0x8878: 0x5778, + 0x8879: 0x5779, + 0x887A: 0x577A, + 0x887B: 0x577D, + 0x887C: 0x577E, + 0x887D: 0x577F, + 0x887E: 0x5780, + 0x8880: 0x5781, + 0x8881: 0x5787, + 0x8882: 0x5788, + 0x8883: 0x5789, + 0x8884: 0x578A, + 0x8885: 0x578D, + 0x8886: 0x578E, + 0x8887: 0x578F, + 0x8888: 0x5790, + 0x8889: 0x5791, + 0x888A: 0x5794, + 0x888B: 0x5795, + 0x888C: 0x5796, + 0x888D: 0x5797, + 0x888E: 0x5798, + 0x888F: 0x5799, + 0x8890: 0x579A, + 0x8891: 0x579C, + 0x8892: 0x579D, + 0x8893: 0x579E, + 0x8894: 0x579F, + 0x8895: 0x57A5, + 0x8896: 0x57A8, + 0x8897: 0x57AA, + 0x8898: 0x57AC, + 0x8899: 0x57AF, + 0x889A: 0x57B0, + 0x889B: 0x57B1, + 0x889C: 0x57B3, + 0x889D: 0x57B5, + 0x889E: 0x57B6, + 0x889F: 0x57B7, + 0x88A0: 0x57B9, + 0x88A1: 0x57BA, + 0x88A2: 0x57BB, + 0x88A3: 0x57BC, + 0x88A4: 0x57BD, + 0x88A5: 0x57BE, + 0x88A6: 0x57BF, + 0x88A7: 0x57C0, + 0x88A8: 0x57C1, + 0x88A9: 0x57C4, + 0x88AA: 0x57C5, + 0x88AB: 0x57C6, + 0x88AC: 0x57C7, + 0x88AD: 0x57C8, + 0x88AE: 0x57C9, + 0x88AF: 0x57CA, + 0x88B0: 0x57CC, + 0x88B1: 0x57CD, + 0x88B2: 0x57D0, + 0x88B3: 0x57D1, + 0x88B4: 0x57D3, + 0x88B5: 0x57D6, + 0x88B6: 0x57D7, + 0x88B7: 0x57DB, + 0x88B8: 0x57DC, + 0x88B9: 0x57DE, + 0x88BA: 0x57E1, + 0x88BB: 0x57E2, + 0x88BC: 0x57E3, + 0x88BD: 0x57E5, + 0x88BE: 0x57E6, + 0x88BF: 0x57E7, + 0x88C0: 0x57E8, + 0x88C1: 0x57E9, + 0x88C2: 0x57EA, + 0x88C3: 0x57EB, + 0x88C4: 0x57EC, + 0x88C5: 0x57EE, + 0x88C6: 0x57F0, + 0x88C7: 0x57F1, + 0x88C8: 0x57F2, + 0x88C9: 0x57F3, + 0x88CA: 0x57F5, + 0x88CB: 0x57F6, + 0x88CC: 0x57F7, + 0x88CD: 0x57FB, + 0x88CE: 0x57FC, + 0x88CF: 0x57FE, + 0x88D0: 0x57FF, + 0x88D1: 0x5801, + 0x88D2: 0x5803, + 0x88D3: 0x5804, + 0x88D4: 0x5805, + 0x88D5: 0x5808, + 0x88D6: 0x5809, + 0x88D7: 0x580A, + 0x88D8: 0x580C, + 0x88D9: 0x580E, + 0x88DA: 0x580F, + 0x88DB: 0x5810, + 0x88DC: 0x5812, + 0x88DD: 0x5813, + 0x88DE: 0x5814, + 0x88DF: 0x5816, + 0x88E0: 0x5817, + 0x88E1: 0x5818, + 0x88E2: 0x581A, + 0x88E3: 0x581B, + 0x88E4: 0x581C, + 0x88E5: 0x581D, + 0x88E6: 0x581F, + 0x88E7: 0x5822, + 0x88E8: 0x5823, + 0x88E9: 0x5825, + 0x88EA: 0x5826, + 0x88EB: 0x5827, + 0x88EC: 0x5828, + 0x88ED: 0x5829, + 0x88EE: 0x582B, + 0x88EF: 0x582C, + 0x88F0: 0x582D, + 0x88F1: 0x582E, + 0x88F2: 0x582F, + 0x88F3: 0x5831, + 0x88F4: 0x5832, + 0x88F5: 0x5833, + 0x88F6: 0x5834, + 0x88F7: 0x5836, + 0x88F8: 0x5837, + 0x88F9: 0x5838, + 0x88FA: 0x5839, + 0x88FB: 0x583A, + 0x88FC: 0x583B, + 0x88FD: 0x583C, + 0x88FE: 0x583D, + 0x8940: 0x583E, + 0x8941: 0x583F, + 0x8942: 0x5840, + 0x8943: 0x5841, + 0x8944: 0x5842, + 0x8945: 0x5843, + 0x8946: 0x5845, + 0x8947: 0x5846, + 0x8948: 0x5847, + 0x8949: 0x5848, + 0x894A: 0x5849, + 0x894B: 0x584A, + 0x894C: 0x584B, + 0x894D: 0x584E, + 0x894E: 0x584F, + 0x894F: 0x5850, + 0x8950: 0x5852, + 0x8951: 0x5853, + 0x8952: 0x5855, + 0x8953: 0x5856, + 0x8954: 0x5857, + 0x8955: 0x5859, + 0x8956: 0x585A, + 0x8957: 0x585B, + 0x8958: 0x585C, + 0x8959: 0x585D, + 0x895A: 0x585F, + 0x895B: 0x5860, + 0x895C: 0x5861, + 0x895D: 0x5862, + 0x895E: 0x5863, + 0x895F: 0x5864, + 0x8960: 0x5866, + 0x8961: 0x5867, + 0x8962: 0x5868, + 0x8963: 0x5869, + 0x8964: 0x586A, + 0x8965: 0x586D, + 0x8966: 0x586E, + 0x8967: 0x586F, + 0x8968: 0x5870, + 0x8969: 0x5871, + 0x896A: 0x5872, + 0x896B: 0x5873, + 0x896C: 0x5874, + 0x896D: 0x5875, + 0x896E: 0x5876, + 0x896F: 0x5877, + 0x8970: 0x5878, + 0x8971: 0x5879, + 0x8972: 0x587A, + 0x8973: 0x587B, + 0x8974: 0x587C, + 0x8975: 0x587D, + 0x8976: 0x587F, + 0x8977: 0x5882, + 0x8978: 0x5884, + 0x8979: 0x5886, + 0x897A: 0x5887, + 0x897B: 0x5888, + 0x897C: 0x588A, + 0x897D: 0x588B, + 0x897E: 0x588C, + 0x8980: 0x588D, + 0x8981: 0x588E, + 0x8982: 0x588F, + 0x8983: 0x5890, + 0x8984: 0x5891, + 0x8985: 0x5894, + 0x8986: 0x5895, + 0x8987: 0x5896, + 0x8988: 0x5897, + 0x8989: 0x5898, + 0x898A: 0x589B, + 0x898B: 0x589C, + 0x898C: 0x589D, + 0x898D: 0x58A0, + 0x898E: 0x58A1, + 0x898F: 0x58A2, + 0x8990: 0x58A3, + 0x8991: 0x58A4, + 0x8992: 0x58A5, + 0x8993: 0x58A6, + 0x8994: 0x58A7, + 0x8995: 0x58AA, + 0x8996: 0x58AB, + 0x8997: 0x58AC, + 0x8998: 0x58AD, + 0x8999: 0x58AE, + 0x899A: 0x58AF, + 0x899B: 0x58B0, + 0x899C: 0x58B1, + 0x899D: 0x58B2, + 0x899E: 0x58B3, + 0x899F: 0x58B4, + 0x89A0: 0x58B5, + 0x89A1: 0x58B6, + 0x89A2: 0x58B7, + 0x89A3: 0x58B8, + 0x89A4: 0x58B9, + 0x89A5: 0x58BA, + 0x89A6: 0x58BB, + 0x89A7: 0x58BD, + 0x89A8: 0x58BE, + 0x89A9: 0x58BF, + 0x89AA: 0x58C0, + 0x89AB: 0x58C2, + 0x89AC: 0x58C3, + 0x89AD: 0x58C4, + 0x89AE: 0x58C6, + 0x89AF: 0x58C7, + 0x89B0: 0x58C8, + 0x89B1: 0x58C9, + 0x89B2: 0x58CA, + 0x89B3: 0x58CB, + 0x89B4: 0x58CC, + 0x89B5: 0x58CD, + 0x89B6: 0x58CE, + 0x89B7: 0x58CF, + 0x89B8: 0x58D0, + 0x89B9: 0x58D2, + 0x89BA: 0x58D3, + 0x89BB: 0x58D4, + 0x89BC: 0x58D6, + 0x89BD: 0x58D7, + 0x89BE: 0x58D8, + 0x89BF: 0x58D9, + 0x89C0: 0x58DA, + 0x89C1: 0x58DB, + 0x89C2: 0x58DC, + 0x89C3: 0x58DD, + 0x89C4: 0x58DE, + 0x89C5: 0x58DF, + 0x89C6: 0x58E0, + 0x89C7: 0x58E1, + 0x89C8: 0x58E2, + 0x89C9: 0x58E3, + 0x89CA: 0x58E5, + 0x89CB: 0x58E6, + 0x89CC: 0x58E7, + 0x89CD: 0x58E8, + 0x89CE: 0x58E9, + 0x89CF: 0x58EA, + 0x89D0: 0x58ED, + 0x89D1: 0x58EF, + 0x89D2: 0x58F1, + 0x89D3: 0x58F2, + 0x89D4: 0x58F4, + 0x89D5: 0x58F5, + 0x89D6: 0x58F7, + 0x89D7: 0x58F8, + 0x89D8: 0x58FA, + 0x89D9: 0x58FB, + 0x89DA: 0x58FC, + 0x89DB: 0x58FD, + 0x89DC: 0x58FE, + 0x89DD: 0x58FF, + 0x89DE: 0x5900, + 0x89DF: 0x5901, + 0x89E0: 0x5903, + 0x89E1: 0x5905, + 0x89E2: 0x5906, + 0x89E3: 0x5908, + 0x89E4: 0x5909, + 0x89E5: 0x590A, + 0x89E6: 0x590B, + 0x89E7: 0x590C, + 0x89E8: 0x590E, + 0x89E9: 0x5910, + 0x89EA: 0x5911, + 0x89EB: 0x5912, + 0x89EC: 0x5913, + 0x89ED: 0x5917, + 0x89EE: 0x5918, + 0x89EF: 0x591B, + 0x89F0: 0x591D, + 0x89F1: 0x591E, + 0x89F2: 0x5920, + 0x89F3: 0x5921, + 0x89F4: 0x5922, + 0x89F5: 0x5923, + 0x89F6: 0x5926, + 0x89F7: 0x5928, + 0x89F8: 0x592C, + 0x89F9: 0x5930, + 0x89FA: 0x5932, + 0x89FB: 0x5933, + 0x89FC: 0x5935, + 0x89FD: 0x5936, + 0x89FE: 0x593B, + 0x8A40: 0x593D, + 0x8A41: 0x593E, + 0x8A42: 0x593F, + 0x8A43: 0x5940, + 0x8A44: 0x5943, + 0x8A45: 0x5945, + 0x8A46: 0x5946, + 0x8A47: 0x594A, + 0x8A48: 0x594C, + 0x8A49: 0x594D, + 0x8A4A: 0x5950, + 0x8A4B: 0x5952, + 0x8A4C: 0x5953, + 0x8A4D: 0x5959, + 0x8A4E: 0x595B, + 0x8A4F: 0x595C, + 0x8A50: 0x595D, + 0x8A51: 0x595E, + 0x8A52: 0x595F, + 0x8A53: 0x5961, + 0x8A54: 0x5963, + 0x8A55: 0x5964, + 0x8A56: 0x5966, + 0x8A57: 0x5967, + 0x8A58: 0x5968, + 0x8A59: 0x5969, + 0x8A5A: 0x596A, + 0x8A5B: 0x596B, + 0x8A5C: 0x596C, + 0x8A5D: 0x596D, + 0x8A5E: 0x596E, + 0x8A5F: 0x596F, + 0x8A60: 0x5970, + 0x8A61: 0x5971, + 0x8A62: 0x5972, + 0x8A63: 0x5975, + 0x8A64: 0x5977, + 0x8A65: 0x597A, + 0x8A66: 0x597B, + 0x8A67: 0x597C, + 0x8A68: 0x597E, + 0x8A69: 0x597F, + 0x8A6A: 0x5980, + 0x8A6B: 0x5985, + 0x8A6C: 0x5989, + 0x8A6D: 0x598B, + 0x8A6E: 0x598C, + 0x8A6F: 0x598E, + 0x8A70: 0x598F, + 0x8A71: 0x5990, + 0x8A72: 0x5991, + 0x8A73: 0x5994, + 0x8A74: 0x5995, + 0x8A75: 0x5998, + 0x8A76: 0x599A, + 0x8A77: 0x599B, + 0x8A78: 0x599C, + 0x8A79: 0x599D, + 0x8A7A: 0x599F, + 0x8A7B: 0x59A0, + 0x8A7C: 0x59A1, + 0x8A7D: 0x59A2, + 0x8A7E: 0x59A6, + 0x8A80: 0x59A7, + 0x8A81: 0x59AC, + 0x8A82: 0x59AD, + 0x8A83: 0x59B0, + 0x8A84: 0x59B1, + 0x8A85: 0x59B3, + 0x8A86: 0x59B4, + 0x8A87: 0x59B5, + 0x8A88: 0x59B6, + 0x8A89: 0x59B7, + 0x8A8A: 0x59B8, + 0x8A8B: 0x59BA, + 0x8A8C: 0x59BC, + 0x8A8D: 0x59BD, + 0x8A8E: 0x59BF, + 0x8A8F: 0x59C0, + 0x8A90: 0x59C1, + 0x8A91: 0x59C2, + 0x8A92: 0x59C3, + 0x8A93: 0x59C4, + 0x8A94: 0x59C5, + 0x8A95: 0x59C7, + 0x8A96: 0x59C8, + 0x8A97: 0x59C9, + 0x8A98: 0x59CC, + 0x8A99: 0x59CD, + 0x8A9A: 0x59CE, + 0x8A9B: 0x59CF, + 0x8A9C: 0x59D5, + 0x8A9D: 0x59D6, + 0x8A9E: 0x59D9, + 0x8A9F: 0x59DB, + 0x8AA0: 0x59DE, + 0x8AA1: 0x59DF, + 0x8AA2: 0x59E0, + 0x8AA3: 0x59E1, + 0x8AA4: 0x59E2, + 0x8AA5: 0x59E4, + 0x8AA6: 0x59E6, + 0x8AA7: 0x59E7, + 0x8AA8: 0x59E9, + 0x8AA9: 0x59EA, + 0x8AAA: 0x59EB, + 0x8AAB: 0x59ED, + 0x8AAC: 0x59EE, + 0x8AAD: 0x59EF, + 0x8AAE: 0x59F0, + 0x8AAF: 0x59F1, + 0x8AB0: 0x59F2, + 0x8AB1: 0x59F3, + 0x8AB2: 0x59F4, + 0x8AB3: 0x59F5, + 0x8AB4: 0x59F6, + 0x8AB5: 0x59F7, + 0x8AB6: 0x59F8, + 0x8AB7: 0x59FA, + 0x8AB8: 0x59FC, + 0x8AB9: 0x59FD, + 0x8ABA: 0x59FE, + 0x8ABB: 0x5A00, + 0x8ABC: 0x5A02, + 0x8ABD: 0x5A0A, + 0x8ABE: 0x5A0B, + 0x8ABF: 0x5A0D, + 0x8AC0: 0x5A0E, + 0x8AC1: 0x5A0F, + 0x8AC2: 0x5A10, + 0x8AC3: 0x5A12, + 0x8AC4: 0x5A14, + 0x8AC5: 0x5A15, + 0x8AC6: 0x5A16, + 0x8AC7: 0x5A17, + 0x8AC8: 0x5A19, + 0x8AC9: 0x5A1A, + 0x8ACA: 0x5A1B, + 0x8ACB: 0x5A1D, + 0x8ACC: 0x5A1E, + 0x8ACD: 0x5A21, + 0x8ACE: 0x5A22, + 0x8ACF: 0x5A24, + 0x8AD0: 0x5A26, + 0x8AD1: 0x5A27, + 0x8AD2: 0x5A28, + 0x8AD3: 0x5A2A, + 0x8AD4: 0x5A2B, + 0x8AD5: 0x5A2C, + 0x8AD6: 0x5A2D, + 0x8AD7: 0x5A2E, + 0x8AD8: 0x5A2F, + 0x8AD9: 0x5A30, + 0x8ADA: 0x5A33, + 0x8ADB: 0x5A35, + 0x8ADC: 0x5A37, + 0x8ADD: 0x5A38, + 0x8ADE: 0x5A39, + 0x8ADF: 0x5A3A, + 0x8AE0: 0x5A3B, + 0x8AE1: 0x5A3D, + 0x8AE2: 0x5A3E, + 0x8AE3: 0x5A3F, + 0x8AE4: 0x5A41, + 0x8AE5: 0x5A42, + 0x8AE6: 0x5A43, + 0x8AE7: 0x5A44, + 0x8AE8: 0x5A45, + 0x8AE9: 0x5A47, + 0x8AEA: 0x5A48, + 0x8AEB: 0x5A4B, + 0x8AEC: 0x5A4C, + 0x8AED: 0x5A4D, + 0x8AEE: 0x5A4E, + 0x8AEF: 0x5A4F, + 0x8AF0: 0x5A50, + 0x8AF1: 0x5A51, + 0x8AF2: 0x5A52, + 0x8AF3: 0x5A53, + 0x8AF4: 0x5A54, + 0x8AF5: 0x5A56, + 0x8AF6: 0x5A57, + 0x8AF7: 0x5A58, + 0x8AF8: 0x5A59, + 0x8AF9: 0x5A5B, + 0x8AFA: 0x5A5C, + 0x8AFB: 0x5A5D, + 0x8AFC: 0x5A5E, + 0x8AFD: 0x5A5F, + 0x8AFE: 0x5A60, + 0x8B40: 0x5A61, + 0x8B41: 0x5A63, + 0x8B42: 0x5A64, + 0x8B43: 0x5A65, + 0x8B44: 0x5A66, + 0x8B45: 0x5A68, + 0x8B46: 0x5A69, + 0x8B47: 0x5A6B, + 0x8B48: 0x5A6C, + 0x8B49: 0x5A6D, + 0x8B4A: 0x5A6E, + 0x8B4B: 0x5A6F, + 0x8B4C: 0x5A70, + 0x8B4D: 0x5A71, + 0x8B4E: 0x5A72, + 0x8B4F: 0x5A73, + 0x8B50: 0x5A78, + 0x8B51: 0x5A79, + 0x8B52: 0x5A7B, + 0x8B53: 0x5A7C, + 0x8B54: 0x5A7D, + 0x8B55: 0x5A7E, + 0x8B56: 0x5A80, + 0x8B57: 0x5A81, + 0x8B58: 0x5A82, + 0x8B59: 0x5A83, + 0x8B5A: 0x5A84, + 0x8B5B: 0x5A85, + 0x8B5C: 0x5A86, + 0x8B5D: 0x5A87, + 0x8B5E: 0x5A88, + 0x8B5F: 0x5A89, + 0x8B60: 0x5A8A, + 0x8B61: 0x5A8B, + 0x8B62: 0x5A8C, + 0x8B63: 0x5A8D, + 0x8B64: 0x5A8E, + 0x8B65: 0x5A8F, + 0x8B66: 0x5A90, + 0x8B67: 0x5A91, + 0x8B68: 0x5A93, + 0x8B69: 0x5A94, + 0x8B6A: 0x5A95, + 0x8B6B: 0x5A96, + 0x8B6C: 0x5A97, + 0x8B6D: 0x5A98, + 0x8B6E: 0x5A99, + 0x8B6F: 0x5A9C, + 0x8B70: 0x5A9D, + 0x8B71: 0x5A9E, + 0x8B72: 0x5A9F, + 0x8B73: 0x5AA0, + 0x8B74: 0x5AA1, + 0x8B75: 0x5AA2, + 0x8B76: 0x5AA3, + 0x8B77: 0x5AA4, + 0x8B78: 0x5AA5, + 0x8B79: 0x5AA6, + 0x8B7A: 0x5AA7, + 0x8B7B: 0x5AA8, + 0x8B7C: 0x5AA9, + 0x8B7D: 0x5AAB, + 0x8B7E: 0x5AAC, + 0x8B80: 0x5AAD, + 0x8B81: 0x5AAE, + 0x8B82: 0x5AAF, + 0x8B83: 0x5AB0, + 0x8B84: 0x5AB1, + 0x8B85: 0x5AB4, + 0x8B86: 0x5AB6, + 0x8B87: 0x5AB7, + 0x8B88: 0x5AB9, + 0x8B89: 0x5ABA, + 0x8B8A: 0x5ABB, + 0x8B8B: 0x5ABC, + 0x8B8C: 0x5ABD, + 0x8B8D: 0x5ABF, + 0x8B8E: 0x5AC0, + 0x8B8F: 0x5AC3, + 0x8B90: 0x5AC4, + 0x8B91: 0x5AC5, + 0x8B92: 0x5AC6, + 0x8B93: 0x5AC7, + 0x8B94: 0x5AC8, + 0x8B95: 0x5ACA, + 0x8B96: 0x5ACB, + 0x8B97: 0x5ACD, + 0x8B98: 0x5ACE, + 0x8B99: 0x5ACF, + 0x8B9A: 0x5AD0, + 0x8B9B: 0x5AD1, + 0x8B9C: 0x5AD3, + 0x8B9D: 0x5AD5, + 0x8B9E: 0x5AD7, + 0x8B9F: 0x5AD9, + 0x8BA0: 0x5ADA, + 0x8BA1: 0x5ADB, + 0x8BA2: 0x5ADD, + 0x8BA3: 0x5ADE, + 0x8BA4: 0x5ADF, + 0x8BA5: 0x5AE2, + 0x8BA6: 0x5AE4, + 0x8BA7: 0x5AE5, + 0x8BA8: 0x5AE7, + 0x8BA9: 0x5AE8, + 0x8BAA: 0x5AEA, + 0x8BAB: 0x5AEC, + 0x8BAC: 0x5AED, + 0x8BAD: 0x5AEE, + 0x8BAE: 0x5AEF, + 0x8BAF: 0x5AF0, + 0x8BB0: 0x5AF2, + 0x8BB1: 0x5AF3, + 0x8BB2: 0x5AF4, + 0x8BB3: 0x5AF5, + 0x8BB4: 0x5AF6, + 0x8BB5: 0x5AF7, + 0x8BB6: 0x5AF8, + 0x8BB7: 0x5AF9, + 0x8BB8: 0x5AFA, + 0x8BB9: 0x5AFB, + 0x8BBA: 0x5AFC, + 0x8BBB: 0x5AFD, + 0x8BBC: 0x5AFE, + 0x8BBD: 0x5AFF, + 0x8BBE: 0x5B00, + 0x8BBF: 0x5B01, + 0x8BC0: 0x5B02, + 0x8BC1: 0x5B03, + 0x8BC2: 0x5B04, + 0x8BC3: 0x5B05, + 0x8BC4: 0x5B06, + 0x8BC5: 0x5B07, + 0x8BC6: 0x5B08, + 0x8BC7: 0x5B0A, + 0x8BC8: 0x5B0B, + 0x8BC9: 0x5B0C, + 0x8BCA: 0x5B0D, + 0x8BCB: 0x5B0E, + 0x8BCC: 0x5B0F, + 0x8BCD: 0x5B10, + 0x8BCE: 0x5B11, + 0x8BCF: 0x5B12, + 0x8BD0: 0x5B13, + 0x8BD1: 0x5B14, + 0x8BD2: 0x5B15, + 0x8BD3: 0x5B18, + 0x8BD4: 0x5B19, + 0x8BD5: 0x5B1A, + 0x8BD6: 0x5B1B, + 0x8BD7: 0x5B1C, + 0x8BD8: 0x5B1D, + 0x8BD9: 0x5B1E, + 0x8BDA: 0x5B1F, + 0x8BDB: 0x5B20, + 0x8BDC: 0x5B21, + 0x8BDD: 0x5B22, + 0x8BDE: 0x5B23, + 0x8BDF: 0x5B24, + 0x8BE0: 0x5B25, + 0x8BE1: 0x5B26, + 0x8BE2: 0x5B27, + 0x8BE3: 0x5B28, + 0x8BE4: 0x5B29, + 0x8BE5: 0x5B2A, + 0x8BE6: 0x5B2B, + 0x8BE7: 0x5B2C, + 0x8BE8: 0x5B2D, + 0x8BE9: 0x5B2E, + 0x8BEA: 0x5B2F, + 0x8BEB: 0x5B30, + 0x8BEC: 0x5B31, + 0x8BED: 0x5B33, + 0x8BEE: 0x5B35, + 0x8BEF: 0x5B36, + 0x8BF0: 0x5B38, + 0x8BF1: 0x5B39, + 0x8BF2: 0x5B3A, + 0x8BF3: 0x5B3B, + 0x8BF4: 0x5B3C, + 0x8BF5: 0x5B3D, + 0x8BF6: 0x5B3E, + 0x8BF7: 0x5B3F, + 0x8BF8: 0x5B41, + 0x8BF9: 0x5B42, + 0x8BFA: 0x5B43, + 0x8BFB: 0x5B44, + 0x8BFC: 0x5B45, + 0x8BFD: 0x5B46, + 0x8BFE: 0x5B47, + 0x8C40: 0x5B48, + 0x8C41: 0x5B49, + 0x8C42: 0x5B4A, + 0x8C43: 0x5B4B, + 0x8C44: 0x5B4C, + 0x8C45: 0x5B4D, + 0x8C46: 0x5B4E, + 0x8C47: 0x5B4F, + 0x8C48: 0x5B52, + 0x8C49: 0x5B56, + 0x8C4A: 0x5B5E, + 0x8C4B: 0x5B60, + 0x8C4C: 0x5B61, + 0x8C4D: 0x5B67, + 0x8C4E: 0x5B68, + 0x8C4F: 0x5B6B, + 0x8C50: 0x5B6D, + 0x8C51: 0x5B6E, + 0x8C52: 0x5B6F, + 0x8C53: 0x5B72, + 0x8C54: 0x5B74, + 0x8C55: 0x5B76, + 0x8C56: 0x5B77, + 0x8C57: 0x5B78, + 0x8C58: 0x5B79, + 0x8C59: 0x5B7B, + 0x8C5A: 0x5B7C, + 0x8C5B: 0x5B7E, + 0x8C5C: 0x5B7F, + 0x8C5D: 0x5B82, + 0x8C5E: 0x5B86, + 0x8C5F: 0x5B8A, + 0x8C60: 0x5B8D, + 0x8C61: 0x5B8E, + 0x8C62: 0x5B90, + 0x8C63: 0x5B91, + 0x8C64: 0x5B92, + 0x8C65: 0x5B94, + 0x8C66: 0x5B96, + 0x8C67: 0x5B9F, + 0x8C68: 0x5BA7, + 0x8C69: 0x5BA8, + 0x8C6A: 0x5BA9, + 0x8C6B: 0x5BAC, + 0x8C6C: 0x5BAD, + 0x8C6D: 0x5BAE, + 0x8C6E: 0x5BAF, + 0x8C6F: 0x5BB1, + 0x8C70: 0x5BB2, + 0x8C71: 0x5BB7, + 0x8C72: 0x5BBA, + 0x8C73: 0x5BBB, + 0x8C74: 0x5BBC, + 0x8C75: 0x5BC0, + 0x8C76: 0x5BC1, + 0x8C77: 0x5BC3, + 0x8C78: 0x5BC8, + 0x8C79: 0x5BC9, + 0x8C7A: 0x5BCA, + 0x8C7B: 0x5BCB, + 0x8C7C: 0x5BCD, + 0x8C7D: 0x5BCE, + 0x8C7E: 0x5BCF, + 0x8C80: 0x5BD1, + 0x8C81: 0x5BD4, + 0x8C82: 0x5BD5, + 0x8C83: 0x5BD6, + 0x8C84: 0x5BD7, + 0x8C85: 0x5BD8, + 0x8C86: 0x5BD9, + 0x8C87: 0x5BDA, + 0x8C88: 0x5BDB, + 0x8C89: 0x5BDC, + 0x8C8A: 0x5BE0, + 0x8C8B: 0x5BE2, + 0x8C8C: 0x5BE3, + 0x8C8D: 0x5BE6, + 0x8C8E: 0x5BE7, + 0x8C8F: 0x5BE9, + 0x8C90: 0x5BEA, + 0x8C91: 0x5BEB, + 0x8C92: 0x5BEC, + 0x8C93: 0x5BED, + 0x8C94: 0x5BEF, + 0x8C95: 0x5BF1, + 0x8C96: 0x5BF2, + 0x8C97: 0x5BF3, + 0x8C98: 0x5BF4, + 0x8C99: 0x5BF5, + 0x8C9A: 0x5BF6, + 0x8C9B: 0x5BF7, + 0x8C9C: 0x5BFD, + 0x8C9D: 0x5BFE, + 0x8C9E: 0x5C00, + 0x8C9F: 0x5C02, + 0x8CA0: 0x5C03, + 0x8CA1: 0x5C05, + 0x8CA2: 0x5C07, + 0x8CA3: 0x5C08, + 0x8CA4: 0x5C0B, + 0x8CA5: 0x5C0C, + 0x8CA6: 0x5C0D, + 0x8CA7: 0x5C0E, + 0x8CA8: 0x5C10, + 0x8CA9: 0x5C12, + 0x8CAA: 0x5C13, + 0x8CAB: 0x5C17, + 0x8CAC: 0x5C19, + 0x8CAD: 0x5C1B, + 0x8CAE: 0x5C1E, + 0x8CAF: 0x5C1F, + 0x8CB0: 0x5C20, + 0x8CB1: 0x5C21, + 0x8CB2: 0x5C23, + 0x8CB3: 0x5C26, + 0x8CB4: 0x5C28, + 0x8CB5: 0x5C29, + 0x8CB6: 0x5C2A, + 0x8CB7: 0x5C2B, + 0x8CB8: 0x5C2D, + 0x8CB9: 0x5C2E, + 0x8CBA: 0x5C2F, + 0x8CBB: 0x5C30, + 0x8CBC: 0x5C32, + 0x8CBD: 0x5C33, + 0x8CBE: 0x5C35, + 0x8CBF: 0x5C36, + 0x8CC0: 0x5C37, + 0x8CC1: 0x5C43, + 0x8CC2: 0x5C44, + 0x8CC3: 0x5C46, + 0x8CC4: 0x5C47, + 0x8CC5: 0x5C4C, + 0x8CC6: 0x5C4D, + 0x8CC7: 0x5C52, + 0x8CC8: 0x5C53, + 0x8CC9: 0x5C54, + 0x8CCA: 0x5C56, + 0x8CCB: 0x5C57, + 0x8CCC: 0x5C58, + 0x8CCD: 0x5C5A, + 0x8CCE: 0x5C5B, + 0x8CCF: 0x5C5C, + 0x8CD0: 0x5C5D, + 0x8CD1: 0x5C5F, + 0x8CD2: 0x5C62, + 0x8CD3: 0x5C64, + 0x8CD4: 0x5C67, + 0x8CD5: 0x5C68, + 0x8CD6: 0x5C69, + 0x8CD7: 0x5C6A, + 0x8CD8: 0x5C6B, + 0x8CD9: 0x5C6C, + 0x8CDA: 0x5C6D, + 0x8CDB: 0x5C70, + 0x8CDC: 0x5C72, + 0x8CDD: 0x5C73, + 0x8CDE: 0x5C74, + 0x8CDF: 0x5C75, + 0x8CE0: 0x5C76, + 0x8CE1: 0x5C77, + 0x8CE2: 0x5C78, + 0x8CE3: 0x5C7B, + 0x8CE4: 0x5C7C, + 0x8CE5: 0x5C7D, + 0x8CE6: 0x5C7E, + 0x8CE7: 0x5C80, + 0x8CE8: 0x5C83, + 0x8CE9: 0x5C84, + 0x8CEA: 0x5C85, + 0x8CEB: 0x5C86, + 0x8CEC: 0x5C87, + 0x8CED: 0x5C89, + 0x8CEE: 0x5C8A, + 0x8CEF: 0x5C8B, + 0x8CF0: 0x5C8E, + 0x8CF1: 0x5C8F, + 0x8CF2: 0x5C92, + 0x8CF3: 0x5C93, + 0x8CF4: 0x5C95, + 0x8CF5: 0x5C9D, + 0x8CF6: 0x5C9E, + 0x8CF7: 0x5C9F, + 0x8CF8: 0x5CA0, + 0x8CF9: 0x5CA1, + 0x8CFA: 0x5CA4, + 0x8CFB: 0x5CA5, + 0x8CFC: 0x5CA6, + 0x8CFD: 0x5CA7, + 0x8CFE: 0x5CA8, + 0x8D40: 0x5CAA, + 0x8D41: 0x5CAE, + 0x8D42: 0x5CAF, + 0x8D43: 0x5CB0, + 0x8D44: 0x5CB2, + 0x8D45: 0x5CB4, + 0x8D46: 0x5CB6, + 0x8D47: 0x5CB9, + 0x8D48: 0x5CBA, + 0x8D49: 0x5CBB, + 0x8D4A: 0x5CBC, + 0x8D4B: 0x5CBE, + 0x8D4C: 0x5CC0, + 0x8D4D: 0x5CC2, + 0x8D4E: 0x5CC3, + 0x8D4F: 0x5CC5, + 0x8D50: 0x5CC6, + 0x8D51: 0x5CC7, + 0x8D52: 0x5CC8, + 0x8D53: 0x5CC9, + 0x8D54: 0x5CCA, + 0x8D55: 0x5CCC, + 0x8D56: 0x5CCD, + 0x8D57: 0x5CCE, + 0x8D58: 0x5CCF, + 0x8D59: 0x5CD0, + 0x8D5A: 0x5CD1, + 0x8D5B: 0x5CD3, + 0x8D5C: 0x5CD4, + 0x8D5D: 0x5CD5, + 0x8D5E: 0x5CD6, + 0x8D5F: 0x5CD7, + 0x8D60: 0x5CD8, + 0x8D61: 0x5CDA, + 0x8D62: 0x5CDB, + 0x8D63: 0x5CDC, + 0x8D64: 0x5CDD, + 0x8D65: 0x5CDE, + 0x8D66: 0x5CDF, + 0x8D67: 0x5CE0, + 0x8D68: 0x5CE2, + 0x8D69: 0x5CE3, + 0x8D6A: 0x5CE7, + 0x8D6B: 0x5CE9, + 0x8D6C: 0x5CEB, + 0x8D6D: 0x5CEC, + 0x8D6E: 0x5CEE, + 0x8D6F: 0x5CEF, + 0x8D70: 0x5CF1, + 0x8D71: 0x5CF2, + 0x8D72: 0x5CF3, + 0x8D73: 0x5CF4, + 0x8D74: 0x5CF5, + 0x8D75: 0x5CF6, + 0x8D76: 0x5CF7, + 0x8D77: 0x5CF8, + 0x8D78: 0x5CF9, + 0x8D79: 0x5CFA, + 0x8D7A: 0x5CFC, + 0x8D7B: 0x5CFD, + 0x8D7C: 0x5CFE, + 0x8D7D: 0x5CFF, + 0x8D7E: 0x5D00, + 0x8D80: 0x5D01, + 0x8D81: 0x5D04, + 0x8D82: 0x5D05, + 0x8D83: 0x5D08, + 0x8D84: 0x5D09, + 0x8D85: 0x5D0A, + 0x8D86: 0x5D0B, + 0x8D87: 0x5D0C, + 0x8D88: 0x5D0D, + 0x8D89: 0x5D0F, + 0x8D8A: 0x5D10, + 0x8D8B: 0x5D11, + 0x8D8C: 0x5D12, + 0x8D8D: 0x5D13, + 0x8D8E: 0x5D15, + 0x8D8F: 0x5D17, + 0x8D90: 0x5D18, + 0x8D91: 0x5D19, + 0x8D92: 0x5D1A, + 0x8D93: 0x5D1C, + 0x8D94: 0x5D1D, + 0x8D95: 0x5D1F, + 0x8D96: 0x5D20, + 0x8D97: 0x5D21, + 0x8D98: 0x5D22, + 0x8D99: 0x5D23, + 0x8D9A: 0x5D25, + 0x8D9B: 0x5D28, + 0x8D9C: 0x5D2A, + 0x8D9D: 0x5D2B, + 0x8D9E: 0x5D2C, + 0x8D9F: 0x5D2F, + 0x8DA0: 0x5D30, + 0x8DA1: 0x5D31, + 0x8DA2: 0x5D32, + 0x8DA3: 0x5D33, + 0x8DA4: 0x5D35, + 0x8DA5: 0x5D36, + 0x8DA6: 0x5D37, + 0x8DA7: 0x5D38, + 0x8DA8: 0x5D39, + 0x8DA9: 0x5D3A, + 0x8DAA: 0x5D3B, + 0x8DAB: 0x5D3C, + 0x8DAC: 0x5D3F, + 0x8DAD: 0x5D40, + 0x8DAE: 0x5D41, + 0x8DAF: 0x5D42, + 0x8DB0: 0x5D43, + 0x8DB1: 0x5D44, + 0x8DB2: 0x5D45, + 0x8DB3: 0x5D46, + 0x8DB4: 0x5D48, + 0x8DB5: 0x5D49, + 0x8DB6: 0x5D4D, + 0x8DB7: 0x5D4E, + 0x8DB8: 0x5D4F, + 0x8DB9: 0x5D50, + 0x8DBA: 0x5D51, + 0x8DBB: 0x5D52, + 0x8DBC: 0x5D53, + 0x8DBD: 0x5D54, + 0x8DBE: 0x5D55, + 0x8DBF: 0x5D56, + 0x8DC0: 0x5D57, + 0x8DC1: 0x5D59, + 0x8DC2: 0x5D5A, + 0x8DC3: 0x5D5C, + 0x8DC4: 0x5D5E, + 0x8DC5: 0x5D5F, + 0x8DC6: 0x5D60, + 0x8DC7: 0x5D61, + 0x8DC8: 0x5D62, + 0x8DC9: 0x5D63, + 0x8DCA: 0x5D64, + 0x8DCB: 0x5D65, + 0x8DCC: 0x5D66, + 0x8DCD: 0x5D67, + 0x8DCE: 0x5D68, + 0x8DCF: 0x5D6A, + 0x8DD0: 0x5D6D, + 0x8DD1: 0x5D6E, + 0x8DD2: 0x5D70, + 0x8DD3: 0x5D71, + 0x8DD4: 0x5D72, + 0x8DD5: 0x5D73, + 0x8DD6: 0x5D75, + 0x8DD7: 0x5D76, + 0x8DD8: 0x5D77, + 0x8DD9: 0x5D78, + 0x8DDA: 0x5D79, + 0x8DDB: 0x5D7A, + 0x8DDC: 0x5D7B, + 0x8DDD: 0x5D7C, + 0x8DDE: 0x5D7D, + 0x8DDF: 0x5D7E, + 0x8DE0: 0x5D7F, + 0x8DE1: 0x5D80, + 0x8DE2: 0x5D81, + 0x8DE3: 0x5D83, + 0x8DE4: 0x5D84, + 0x8DE5: 0x5D85, + 0x8DE6: 0x5D86, + 0x8DE7: 0x5D87, + 0x8DE8: 0x5D88, + 0x8DE9: 0x5D89, + 0x8DEA: 0x5D8A, + 0x8DEB: 0x5D8B, + 0x8DEC: 0x5D8C, + 0x8DED: 0x5D8D, + 0x8DEE: 0x5D8E, + 0x8DEF: 0x5D8F, + 0x8DF0: 0x5D90, + 0x8DF1: 0x5D91, + 0x8DF2: 0x5D92, + 0x8DF3: 0x5D93, + 0x8DF4: 0x5D94, + 0x8DF5: 0x5D95, + 0x8DF6: 0x5D96, + 0x8DF7: 0x5D97, + 0x8DF8: 0x5D98, + 0x8DF9: 0x5D9A, + 0x8DFA: 0x5D9B, + 0x8DFB: 0x5D9C, + 0x8DFC: 0x5D9E, + 0x8DFD: 0x5D9F, + 0x8DFE: 0x5DA0, + 0x8E40: 0x5DA1, + 0x8E41: 0x5DA2, + 0x8E42: 0x5DA3, + 0x8E43: 0x5DA4, + 0x8E44: 0x5DA5, + 0x8E45: 0x5DA6, + 0x8E46: 0x5DA7, + 0x8E47: 0x5DA8, + 0x8E48: 0x5DA9, + 0x8E49: 0x5DAA, + 0x8E4A: 0x5DAB, + 0x8E4B: 0x5DAC, + 0x8E4C: 0x5DAD, + 0x8E4D: 0x5DAE, + 0x8E4E: 0x5DAF, + 0x8E4F: 0x5DB0, + 0x8E50: 0x5DB1, + 0x8E51: 0x5DB2, + 0x8E52: 0x5DB3, + 0x8E53: 0x5DB4, + 0x8E54: 0x5DB5, + 0x8E55: 0x5DB6, + 0x8E56: 0x5DB8, + 0x8E57: 0x5DB9, + 0x8E58: 0x5DBA, + 0x8E59: 0x5DBB, + 0x8E5A: 0x5DBC, + 0x8E5B: 0x5DBD, + 0x8E5C: 0x5DBE, + 0x8E5D: 0x5DBF, + 0x8E5E: 0x5DC0, + 0x8E5F: 0x5DC1, + 0x8E60: 0x5DC2, + 0x8E61: 0x5DC3, + 0x8E62: 0x5DC4, + 0x8E63: 0x5DC6, + 0x8E64: 0x5DC7, + 0x8E65: 0x5DC8, + 0x8E66: 0x5DC9, + 0x8E67: 0x5DCA, + 0x8E68: 0x5DCB, + 0x8E69: 0x5DCC, + 0x8E6A: 0x5DCE, + 0x8E6B: 0x5DCF, + 0x8E6C: 0x5DD0, + 0x8E6D: 0x5DD1, + 0x8E6E: 0x5DD2, + 0x8E6F: 0x5DD3, + 0x8E70: 0x5DD4, + 0x8E71: 0x5DD5, + 0x8E72: 0x5DD6, + 0x8E73: 0x5DD7, + 0x8E74: 0x5DD8, + 0x8E75: 0x5DD9, + 0x8E76: 0x5DDA, + 0x8E77: 0x5DDC, + 0x8E78: 0x5DDF, + 0x8E79: 0x5DE0, + 0x8E7A: 0x5DE3, + 0x8E7B: 0x5DE4, + 0x8E7C: 0x5DEA, + 0x8E7D: 0x5DEC, + 0x8E7E: 0x5DED, + 0x8E80: 0x5DF0, + 0x8E81: 0x5DF5, + 0x8E82: 0x5DF6, + 0x8E83: 0x5DF8, + 0x8E84: 0x5DF9, + 0x8E85: 0x5DFA, + 0x8E86: 0x5DFB, + 0x8E87: 0x5DFC, + 0x8E88: 0x5DFF, + 0x8E89: 0x5E00, + 0x8E8A: 0x5E04, + 0x8E8B: 0x5E07, + 0x8E8C: 0x5E09, + 0x8E8D: 0x5E0A, + 0x8E8E: 0x5E0B, + 0x8E8F: 0x5E0D, + 0x8E90: 0x5E0E, + 0x8E91: 0x5E12, + 0x8E92: 0x5E13, + 0x8E93: 0x5E17, + 0x8E94: 0x5E1E, + 0x8E95: 0x5E1F, + 0x8E96: 0x5E20, + 0x8E97: 0x5E21, + 0x8E98: 0x5E22, + 0x8E99: 0x5E23, + 0x8E9A: 0x5E24, + 0x8E9B: 0x5E25, + 0x8E9C: 0x5E28, + 0x8E9D: 0x5E29, + 0x8E9E: 0x5E2A, + 0x8E9F: 0x5E2B, + 0x8EA0: 0x5E2C, + 0x8EA1: 0x5E2F, + 0x8EA2: 0x5E30, + 0x8EA3: 0x5E32, + 0x8EA4: 0x5E33, + 0x8EA5: 0x5E34, + 0x8EA6: 0x5E35, + 0x8EA7: 0x5E36, + 0x8EA8: 0x5E39, + 0x8EA9: 0x5E3A, + 0x8EAA: 0x5E3E, + 0x8EAB: 0x5E3F, + 0x8EAC: 0x5E40, + 0x8EAD: 0x5E41, + 0x8EAE: 0x5E43, + 0x8EAF: 0x5E46, + 0x8EB0: 0x5E47, + 0x8EB1: 0x5E48, + 0x8EB2: 0x5E49, + 0x8EB3: 0x5E4A, + 0x8EB4: 0x5E4B, + 0x8EB5: 0x5E4D, + 0x8EB6: 0x5E4E, + 0x8EB7: 0x5E4F, + 0x8EB8: 0x5E50, + 0x8EB9: 0x5E51, + 0x8EBA: 0x5E52, + 0x8EBB: 0x5E53, + 0x8EBC: 0x5E56, + 0x8EBD: 0x5E57, + 0x8EBE: 0x5E58, + 0x8EBF: 0x5E59, + 0x8EC0: 0x5E5A, + 0x8EC1: 0x5E5C, + 0x8EC2: 0x5E5D, + 0x8EC3: 0x5E5F, + 0x8EC4: 0x5E60, + 0x8EC5: 0x5E63, + 0x8EC6: 0x5E64, + 0x8EC7: 0x5E65, + 0x8EC8: 0x5E66, + 0x8EC9: 0x5E67, + 0x8ECA: 0x5E68, + 0x8ECB: 0x5E69, + 0x8ECC: 0x5E6A, + 0x8ECD: 0x5E6B, + 0x8ECE: 0x5E6C, + 0x8ECF: 0x5E6D, + 0x8ED0: 0x5E6E, + 0x8ED1: 0x5E6F, + 0x8ED2: 0x5E70, + 0x8ED3: 0x5E71, + 0x8ED4: 0x5E75, + 0x8ED5: 0x5E77, + 0x8ED6: 0x5E79, + 0x8ED7: 0x5E7E, + 0x8ED8: 0x5E81, + 0x8ED9: 0x5E82, + 0x8EDA: 0x5E83, + 0x8EDB: 0x5E85, + 0x8EDC: 0x5E88, + 0x8EDD: 0x5E89, + 0x8EDE: 0x5E8C, + 0x8EDF: 0x5E8D, + 0x8EE0: 0x5E8E, + 0x8EE1: 0x5E92, + 0x8EE2: 0x5E98, + 0x8EE3: 0x5E9B, + 0x8EE4: 0x5E9D, + 0x8EE5: 0x5EA1, + 0x8EE6: 0x5EA2, + 0x8EE7: 0x5EA3, + 0x8EE8: 0x5EA4, + 0x8EE9: 0x5EA8, + 0x8EEA: 0x5EA9, + 0x8EEB: 0x5EAA, + 0x8EEC: 0x5EAB, + 0x8EED: 0x5EAC, + 0x8EEE: 0x5EAE, + 0x8EEF: 0x5EAF, + 0x8EF0: 0x5EB0, + 0x8EF1: 0x5EB1, + 0x8EF2: 0x5EB2, + 0x8EF3: 0x5EB4, + 0x8EF4: 0x5EBA, + 0x8EF5: 0x5EBB, + 0x8EF6: 0x5EBC, + 0x8EF7: 0x5EBD, + 0x8EF8: 0x5EBF, + 0x8EF9: 0x5EC0, + 0x8EFA: 0x5EC1, + 0x8EFB: 0x5EC2, + 0x8EFC: 0x5EC3, + 0x8EFD: 0x5EC4, + 0x8EFE: 0x5EC5, + 0x8F40: 0x5EC6, + 0x8F41: 0x5EC7, + 0x8F42: 0x5EC8, + 0x8F43: 0x5ECB, + 0x8F44: 0x5ECC, + 0x8F45: 0x5ECD, + 0x8F46: 0x5ECE, + 0x8F47: 0x5ECF, + 0x8F48: 0x5ED0, + 0x8F49: 0x5ED4, + 0x8F4A: 0x5ED5, + 0x8F4B: 0x5ED7, + 0x8F4C: 0x5ED8, + 0x8F4D: 0x5ED9, + 0x8F4E: 0x5EDA, + 0x8F4F: 0x5EDC, + 0x8F50: 0x5EDD, + 0x8F51: 0x5EDE, + 0x8F52: 0x5EDF, + 0x8F53: 0x5EE0, + 0x8F54: 0x5EE1, + 0x8F55: 0x5EE2, + 0x8F56: 0x5EE3, + 0x8F57: 0x5EE4, + 0x8F58: 0x5EE5, + 0x8F59: 0x5EE6, + 0x8F5A: 0x5EE7, + 0x8F5B: 0x5EE9, + 0x8F5C: 0x5EEB, + 0x8F5D: 0x5EEC, + 0x8F5E: 0x5EED, + 0x8F5F: 0x5EEE, + 0x8F60: 0x5EEF, + 0x8F61: 0x5EF0, + 0x8F62: 0x5EF1, + 0x8F63: 0x5EF2, + 0x8F64: 0x5EF3, + 0x8F65: 0x5EF5, + 0x8F66: 0x5EF8, + 0x8F67: 0x5EF9, + 0x8F68: 0x5EFB, + 0x8F69: 0x5EFC, + 0x8F6A: 0x5EFD, + 0x8F6B: 0x5F05, + 0x8F6C: 0x5F06, + 0x8F6D: 0x5F07, + 0x8F6E: 0x5F09, + 0x8F6F: 0x5F0C, + 0x8F70: 0x5F0D, + 0x8F71: 0x5F0E, + 0x8F72: 0x5F10, + 0x8F73: 0x5F12, + 0x8F74: 0x5F14, + 0x8F75: 0x5F16, + 0x8F76: 0x5F19, + 0x8F77: 0x5F1A, + 0x8F78: 0x5F1C, + 0x8F79: 0x5F1D, + 0x8F7A: 0x5F1E, + 0x8F7B: 0x5F21, + 0x8F7C: 0x5F22, + 0x8F7D: 0x5F23, + 0x8F7E: 0x5F24, + 0x8F80: 0x5F28, + 0x8F81: 0x5F2B, + 0x8F82: 0x5F2C, + 0x8F83: 0x5F2E, + 0x8F84: 0x5F30, + 0x8F85: 0x5F32, + 0x8F86: 0x5F33, + 0x8F87: 0x5F34, + 0x8F88: 0x5F35, + 0x8F89: 0x5F36, + 0x8F8A: 0x5F37, + 0x8F8B: 0x5F38, + 0x8F8C: 0x5F3B, + 0x8F8D: 0x5F3D, + 0x8F8E: 0x5F3E, + 0x8F8F: 0x5F3F, + 0x8F90: 0x5F41, + 0x8F91: 0x5F42, + 0x8F92: 0x5F43, + 0x8F93: 0x5F44, + 0x8F94: 0x5F45, + 0x8F95: 0x5F46, + 0x8F96: 0x5F47, + 0x8F97: 0x5F48, + 0x8F98: 0x5F49, + 0x8F99: 0x5F4A, + 0x8F9A: 0x5F4B, + 0x8F9B: 0x5F4C, + 0x8F9C: 0x5F4D, + 0x8F9D: 0x5F4E, + 0x8F9E: 0x5F4F, + 0x8F9F: 0x5F51, + 0x8FA0: 0x5F54, + 0x8FA1: 0x5F59, + 0x8FA2: 0x5F5A, + 0x8FA3: 0x5F5B, + 0x8FA4: 0x5F5C, + 0x8FA5: 0x5F5E, + 0x8FA6: 0x5F5F, + 0x8FA7: 0x5F60, + 0x8FA8: 0x5F63, + 0x8FA9: 0x5F65, + 0x8FAA: 0x5F67, + 0x8FAB: 0x5F68, + 0x8FAC: 0x5F6B, + 0x8FAD: 0x5F6E, + 0x8FAE: 0x5F6F, + 0x8FAF: 0x5F72, + 0x8FB0: 0x5F74, + 0x8FB1: 0x5F75, + 0x8FB2: 0x5F76, + 0x8FB3: 0x5F78, + 0x8FB4: 0x5F7A, + 0x8FB5: 0x5F7D, + 0x8FB6: 0x5F7E, + 0x8FB7: 0x5F7F, + 0x8FB8: 0x5F83, + 0x8FB9: 0x5F86, + 0x8FBA: 0x5F8D, + 0x8FBB: 0x5F8E, + 0x8FBC: 0x5F8F, + 0x8FBD: 0x5F91, + 0x8FBE: 0x5F93, + 0x8FBF: 0x5F94, + 0x8FC0: 0x5F96, + 0x8FC1: 0x5F9A, + 0x8FC2: 0x5F9B, + 0x8FC3: 0x5F9D, + 0x8FC4: 0x5F9E, + 0x8FC5: 0x5F9F, + 0x8FC6: 0x5FA0, + 0x8FC7: 0x5FA2, + 0x8FC8: 0x5FA3, + 0x8FC9: 0x5FA4, + 0x8FCA: 0x5FA5, + 0x8FCB: 0x5FA6, + 0x8FCC: 0x5FA7, + 0x8FCD: 0x5FA9, + 0x8FCE: 0x5FAB, + 0x8FCF: 0x5FAC, + 0x8FD0: 0x5FAF, + 0x8FD1: 0x5FB0, + 0x8FD2: 0x5FB1, + 0x8FD3: 0x5FB2, + 0x8FD4: 0x5FB3, + 0x8FD5: 0x5FB4, + 0x8FD6: 0x5FB6, + 0x8FD7: 0x5FB8, + 0x8FD8: 0x5FB9, + 0x8FD9: 0x5FBA, + 0x8FDA: 0x5FBB, + 0x8FDB: 0x5FBE, + 0x8FDC: 0x5FBF, + 0x8FDD: 0x5FC0, + 0x8FDE: 0x5FC1, + 0x8FDF: 0x5FC2, + 0x8FE0: 0x5FC7, + 0x8FE1: 0x5FC8, + 0x8FE2: 0x5FCA, + 0x8FE3: 0x5FCB, + 0x8FE4: 0x5FCE, + 0x8FE5: 0x5FD3, + 0x8FE6: 0x5FD4, + 0x8FE7: 0x5FD5, + 0x8FE8: 0x5FDA, + 0x8FE9: 0x5FDB, + 0x8FEA: 0x5FDC, + 0x8FEB: 0x5FDE, + 0x8FEC: 0x5FDF, + 0x8FED: 0x5FE2, + 0x8FEE: 0x5FE3, + 0x8FEF: 0x5FE5, + 0x8FF0: 0x5FE6, + 0x8FF1: 0x5FE8, + 0x8FF2: 0x5FE9, + 0x8FF3: 0x5FEC, + 0x8FF4: 0x5FEF, + 0x8FF5: 0x5FF0, + 0x8FF6: 0x5FF2, + 0x8FF7: 0x5FF3, + 0x8FF8: 0x5FF4, + 0x8FF9: 0x5FF6, + 0x8FFA: 0x5FF7, + 0x8FFB: 0x5FF9, + 0x8FFC: 0x5FFA, + 0x8FFD: 0x5FFC, + 0x8FFE: 0x6007, + 0x9040: 0x6008, + 0x9041: 0x6009, + 0x9042: 0x600B, + 0x9043: 0x600C, + 0x9044: 0x6010, + 0x9045: 0x6011, + 0x9046: 0x6013, + 0x9047: 0x6017, + 0x9048: 0x6018, + 0x9049: 0x601A, + 0x904A: 0x601E, + 0x904B: 0x601F, + 0x904C: 0x6022, + 0x904D: 0x6023, + 0x904E: 0x6024, + 0x904F: 0x602C, + 0x9050: 0x602D, + 0x9051: 0x602E, + 0x9052: 0x6030, + 0x9053: 0x6031, + 0x9054: 0x6032, + 0x9055: 0x6033, + 0x9056: 0x6034, + 0x9057: 0x6036, + 0x9058: 0x6037, + 0x9059: 0x6038, + 0x905A: 0x6039, + 0x905B: 0x603A, + 0x905C: 0x603D, + 0x905D: 0x603E, + 0x905E: 0x6040, + 0x905F: 0x6044, + 0x9060: 0x6045, + 0x9061: 0x6046, + 0x9062: 0x6047, + 0x9063: 0x6048, + 0x9064: 0x6049, + 0x9065: 0x604A, + 0x9066: 0x604C, + 0x9067: 0x604E, + 0x9068: 0x604F, + 0x9069: 0x6051, + 0x906A: 0x6053, + 0x906B: 0x6054, + 0x906C: 0x6056, + 0x906D: 0x6057, + 0x906E: 0x6058, + 0x906F: 0x605B, + 0x9070: 0x605C, + 0x9071: 0x605E, + 0x9072: 0x605F, + 0x9073: 0x6060, + 0x9074: 0x6061, + 0x9075: 0x6065, + 0x9076: 0x6066, + 0x9077: 0x606E, + 0x9078: 0x6071, + 0x9079: 0x6072, + 0x907A: 0x6074, + 0x907B: 0x6075, + 0x907C: 0x6077, + 0x907D: 0x607E, + 0x907E: 0x6080, + 0x9080: 0x6081, + 0x9081: 0x6082, + 0x9082: 0x6085, + 0x9083: 0x6086, + 0x9084: 0x6087, + 0x9085: 0x6088, + 0x9086: 0x608A, + 0x9087: 0x608B, + 0x9088: 0x608E, + 0x9089: 0x608F, + 0x908A: 0x6090, + 0x908B: 0x6091, + 0x908C: 0x6093, + 0x908D: 0x6095, + 0x908E: 0x6097, + 0x908F: 0x6098, + 0x9090: 0x6099, + 0x9091: 0x609C, + 0x9092: 0x609E, + 0x9093: 0x60A1, + 0x9094: 0x60A2, + 0x9095: 0x60A4, + 0x9096: 0x60A5, + 0x9097: 0x60A7, + 0x9098: 0x60A9, + 0x9099: 0x60AA, + 0x909A: 0x60AE, + 0x909B: 0x60B0, + 0x909C: 0x60B3, + 0x909D: 0x60B5, + 0x909E: 0x60B6, + 0x909F: 0x60B7, + 0x90A0: 0x60B9, + 0x90A1: 0x60BA, + 0x90A2: 0x60BD, + 0x90A3: 0x60BE, + 0x90A4: 0x60BF, + 0x90A5: 0x60C0, + 0x90A6: 0x60C1, + 0x90A7: 0x60C2, + 0x90A8: 0x60C3, + 0x90A9: 0x60C4, + 0x90AA: 0x60C7, + 0x90AB: 0x60C8, + 0x90AC: 0x60C9, + 0x90AD: 0x60CC, + 0x90AE: 0x60CD, + 0x90AF: 0x60CE, + 0x90B0: 0x60CF, + 0x90B1: 0x60D0, + 0x90B2: 0x60D2, + 0x90B3: 0x60D3, + 0x90B4: 0x60D4, + 0x90B5: 0x60D6, + 0x90B6: 0x60D7, + 0x90B7: 0x60D9, + 0x90B8: 0x60DB, + 0x90B9: 0x60DE, + 0x90BA: 0x60E1, + 0x90BB: 0x60E2, + 0x90BC: 0x60E3, + 0x90BD: 0x60E4, + 0x90BE: 0x60E5, + 0x90BF: 0x60EA, + 0x90C0: 0x60F1, + 0x90C1: 0x60F2, + 0x90C2: 0x60F5, + 0x90C3: 0x60F7, + 0x90C4: 0x60F8, + 0x90C5: 0x60FB, + 0x90C6: 0x60FC, + 0x90C7: 0x60FD, + 0x90C8: 0x60FE, + 0x90C9: 0x60FF, + 0x90CA: 0x6102, + 0x90CB: 0x6103, + 0x90CC: 0x6104, + 0x90CD: 0x6105, + 0x90CE: 0x6107, + 0x90CF: 0x610A, + 0x90D0: 0x610B, + 0x90D1: 0x610C, + 0x90D2: 0x6110, + 0x90D3: 0x6111, + 0x90D4: 0x6112, + 0x90D5: 0x6113, + 0x90D6: 0x6114, + 0x90D7: 0x6116, + 0x90D8: 0x6117, + 0x90D9: 0x6118, + 0x90DA: 0x6119, + 0x90DB: 0x611B, + 0x90DC: 0x611C, + 0x90DD: 0x611D, + 0x90DE: 0x611E, + 0x90DF: 0x6121, + 0x90E0: 0x6122, + 0x90E1: 0x6125, + 0x90E2: 0x6128, + 0x90E3: 0x6129, + 0x90E4: 0x612A, + 0x90E5: 0x612C, + 0x90E6: 0x612D, + 0x90E7: 0x612E, + 0x90E8: 0x612F, + 0x90E9: 0x6130, + 0x90EA: 0x6131, + 0x90EB: 0x6132, + 0x90EC: 0x6133, + 0x90ED: 0x6134, + 0x90EE: 0x6135, + 0x90EF: 0x6136, + 0x90F0: 0x6137, + 0x90F1: 0x6138, + 0x90F2: 0x6139, + 0x90F3: 0x613A, + 0x90F4: 0x613B, + 0x90F5: 0x613C, + 0x90F6: 0x613D, + 0x90F7: 0x613E, + 0x90F8: 0x6140, + 0x90F9: 0x6141, + 0x90FA: 0x6142, + 0x90FB: 0x6143, + 0x90FC: 0x6144, + 0x90FD: 0x6145, + 0x90FE: 0x6146, + 0x9140: 0x6147, + 0x9141: 0x6149, + 0x9142: 0x614B, + 0x9143: 0x614D, + 0x9144: 0x614F, + 0x9145: 0x6150, + 0x9146: 0x6152, + 0x9147: 0x6153, + 0x9148: 0x6154, + 0x9149: 0x6156, + 0x914A: 0x6157, + 0x914B: 0x6158, + 0x914C: 0x6159, + 0x914D: 0x615A, + 0x914E: 0x615B, + 0x914F: 0x615C, + 0x9150: 0x615E, + 0x9151: 0x615F, + 0x9152: 0x6160, + 0x9153: 0x6161, + 0x9154: 0x6163, + 0x9155: 0x6164, + 0x9156: 0x6165, + 0x9157: 0x6166, + 0x9158: 0x6169, + 0x9159: 0x616A, + 0x915A: 0x616B, + 0x915B: 0x616C, + 0x915C: 0x616D, + 0x915D: 0x616E, + 0x915E: 0x616F, + 0x915F: 0x6171, + 0x9160: 0x6172, + 0x9161: 0x6173, + 0x9162: 0x6174, + 0x9163: 0x6176, + 0x9164: 0x6178, + 0x9165: 0x6179, + 0x9166: 0x617A, + 0x9167: 0x617B, + 0x9168: 0x617C, + 0x9169: 0x617D, + 0x916A: 0x617E, + 0x916B: 0x617F, + 0x916C: 0x6180, + 0x916D: 0x6181, + 0x916E: 0x6182, + 0x916F: 0x6183, + 0x9170: 0x6184, + 0x9171: 0x6185, + 0x9172: 0x6186, + 0x9173: 0x6187, + 0x9174: 0x6188, + 0x9175: 0x6189, + 0x9176: 0x618A, + 0x9177: 0x618C, + 0x9178: 0x618D, + 0x9179: 0x618F, + 0x917A: 0x6190, + 0x917B: 0x6191, + 0x917C: 0x6192, + 0x917D: 0x6193, + 0x917E: 0x6195, + 0x9180: 0x6196, + 0x9181: 0x6197, + 0x9182: 0x6198, + 0x9183: 0x6199, + 0x9184: 0x619A, + 0x9185: 0x619B, + 0x9186: 0x619C, + 0x9187: 0x619E, + 0x9188: 0x619F, + 0x9189: 0x61A0, + 0x918A: 0x61A1, + 0x918B: 0x61A2, + 0x918C: 0x61A3, + 0x918D: 0x61A4, + 0x918E: 0x61A5, + 0x918F: 0x61A6, + 0x9190: 0x61AA, + 0x9191: 0x61AB, + 0x9192: 0x61AD, + 0x9193: 0x61AE, + 0x9194: 0x61AF, + 0x9195: 0x61B0, + 0x9196: 0x61B1, + 0x9197: 0x61B2, + 0x9198: 0x61B3, + 0x9199: 0x61B4, + 0x919A: 0x61B5, + 0x919B: 0x61B6, + 0x919C: 0x61B8, + 0x919D: 0x61B9, + 0x919E: 0x61BA, + 0x919F: 0x61BB, + 0x91A0: 0x61BC, + 0x91A1: 0x61BD, + 0x91A2: 0x61BF, + 0x91A3: 0x61C0, + 0x91A4: 0x61C1, + 0x91A5: 0x61C3, + 0x91A6: 0x61C4, + 0x91A7: 0x61C5, + 0x91A8: 0x61C6, + 0x91A9: 0x61C7, + 0x91AA: 0x61C9, + 0x91AB: 0x61CC, + 0x91AC: 0x61CD, + 0x91AD: 0x61CE, + 0x91AE: 0x61CF, + 0x91AF: 0x61D0, + 0x91B0: 0x61D3, + 0x91B1: 0x61D5, + 0x91B2: 0x61D6, + 0x91B3: 0x61D7, + 0x91B4: 0x61D8, + 0x91B5: 0x61D9, + 0x91B6: 0x61DA, + 0x91B7: 0x61DB, + 0x91B8: 0x61DC, + 0x91B9: 0x61DD, + 0x91BA: 0x61DE, + 0x91BB: 0x61DF, + 0x91BC: 0x61E0, + 0x91BD: 0x61E1, + 0x91BE: 0x61E2, + 0x91BF: 0x61E3, + 0x91C0: 0x61E4, + 0x91C1: 0x61E5, + 0x91C2: 0x61E7, + 0x91C3: 0x61E8, + 0x91C4: 0x61E9, + 0x91C5: 0x61EA, + 0x91C6: 0x61EB, + 0x91C7: 0x61EC, + 0x91C8: 0x61ED, + 0x91C9: 0x61EE, + 0x91CA: 0x61EF, + 0x91CB: 0x61F0, + 0x91CC: 0x61F1, + 0x91CD: 0x61F2, + 0x91CE: 0x61F3, + 0x91CF: 0x61F4, + 0x91D0: 0x61F6, + 0x91D1: 0x61F7, + 0x91D2: 0x61F8, + 0x91D3: 0x61F9, + 0x91D4: 0x61FA, + 0x91D5: 0x61FB, + 0x91D6: 0x61FC, + 0x91D7: 0x61FD, + 0x91D8: 0x61FE, + 0x91D9: 0x6200, + 0x91DA: 0x6201, + 0x91DB: 0x6202, + 0x91DC: 0x6203, + 0x91DD: 0x6204, + 0x91DE: 0x6205, + 0x91DF: 0x6207, + 0x91E0: 0x6209, + 0x91E1: 0x6213, + 0x91E2: 0x6214, + 0x91E3: 0x6219, + 0x91E4: 0x621C, + 0x91E5: 0x621D, + 0x91E6: 0x621E, + 0x91E7: 0x6220, + 0x91E8: 0x6223, + 0x91E9: 0x6226, + 0x91EA: 0x6227, + 0x91EB: 0x6228, + 0x91EC: 0x6229, + 0x91ED: 0x622B, + 0x91EE: 0x622D, + 0x91EF: 0x622F, + 0x91F0: 0x6230, + 0x91F1: 0x6231, + 0x91F2: 0x6232, + 0x91F3: 0x6235, + 0x91F4: 0x6236, + 0x91F5: 0x6238, + 0x91F6: 0x6239, + 0x91F7: 0x623A, + 0x91F8: 0x623B, + 0x91F9: 0x623C, + 0x91FA: 0x6242, + 0x91FB: 0x6244, + 0x91FC: 0x6245, + 0x91FD: 0x6246, + 0x91FE: 0x624A, + 0x9240: 0x624F, + 0x9241: 0x6250, + 0x9242: 0x6255, + 0x9243: 0x6256, + 0x9244: 0x6257, + 0x9245: 0x6259, + 0x9246: 0x625A, + 0x9247: 0x625C, + 0x9248: 0x625D, + 0x9249: 0x625E, + 0x924A: 0x625F, + 0x924B: 0x6260, + 0x924C: 0x6261, + 0x924D: 0x6262, + 0x924E: 0x6264, + 0x924F: 0x6265, + 0x9250: 0x6268, + 0x9251: 0x6271, + 0x9252: 0x6272, + 0x9253: 0x6274, + 0x9254: 0x6275, + 0x9255: 0x6277, + 0x9256: 0x6278, + 0x9257: 0x627A, + 0x9258: 0x627B, + 0x9259: 0x627D, + 0x925A: 0x6281, + 0x925B: 0x6282, + 0x925C: 0x6283, + 0x925D: 0x6285, + 0x925E: 0x6286, + 0x925F: 0x6287, + 0x9260: 0x6288, + 0x9261: 0x628B, + 0x9262: 0x628C, + 0x9263: 0x628D, + 0x9264: 0x628E, + 0x9265: 0x628F, + 0x9266: 0x6290, + 0x9267: 0x6294, + 0x9268: 0x6299, + 0x9269: 0x629C, + 0x926A: 0x629D, + 0x926B: 0x629E, + 0x926C: 0x62A3, + 0x926D: 0x62A6, + 0x926E: 0x62A7, + 0x926F: 0x62A9, + 0x9270: 0x62AA, + 0x9271: 0x62AD, + 0x9272: 0x62AE, + 0x9273: 0x62AF, + 0x9274: 0x62B0, + 0x9275: 0x62B2, + 0x9276: 0x62B3, + 0x9277: 0x62B4, + 0x9278: 0x62B6, + 0x9279: 0x62B7, + 0x927A: 0x62B8, + 0x927B: 0x62BA, + 0x927C: 0x62BE, + 0x927D: 0x62C0, + 0x927E: 0x62C1, + 0x9280: 0x62C3, + 0x9281: 0x62CB, + 0x9282: 0x62CF, + 0x9283: 0x62D1, + 0x9284: 0x62D5, + 0x9285: 0x62DD, + 0x9286: 0x62DE, + 0x9287: 0x62E0, + 0x9288: 0x62E1, + 0x9289: 0x62E4, + 0x928A: 0x62EA, + 0x928B: 0x62EB, + 0x928C: 0x62F0, + 0x928D: 0x62F2, + 0x928E: 0x62F5, + 0x928F: 0x62F8, + 0x9290: 0x62F9, + 0x9291: 0x62FA, + 0x9292: 0x62FB, + 0x9293: 0x6300, + 0x9294: 0x6303, + 0x9295: 0x6304, + 0x9296: 0x6305, + 0x9297: 0x6306, + 0x9298: 0x630A, + 0x9299: 0x630B, + 0x929A: 0x630C, + 0x929B: 0x630D, + 0x929C: 0x630F, + 0x929D: 0x6310, + 0x929E: 0x6312, + 0x929F: 0x6313, + 0x92A0: 0x6314, + 0x92A1: 0x6315, + 0x92A2: 0x6317, + 0x92A3: 0x6318, + 0x92A4: 0x6319, + 0x92A5: 0x631C, + 0x92A6: 0x6326, + 0x92A7: 0x6327, + 0x92A8: 0x6329, + 0x92A9: 0x632C, + 0x92AA: 0x632D, + 0x92AB: 0x632E, + 0x92AC: 0x6330, + 0x92AD: 0x6331, + 0x92AE: 0x6333, + 0x92AF: 0x6334, + 0x92B0: 0x6335, + 0x92B1: 0x6336, + 0x92B2: 0x6337, + 0x92B3: 0x6338, + 0x92B4: 0x633B, + 0x92B5: 0x633C, + 0x92B6: 0x633E, + 0x92B7: 0x633F, + 0x92B8: 0x6340, + 0x92B9: 0x6341, + 0x92BA: 0x6344, + 0x92BB: 0x6347, + 0x92BC: 0x6348, + 0x92BD: 0x634A, + 0x92BE: 0x6351, + 0x92BF: 0x6352, + 0x92C0: 0x6353, + 0x92C1: 0x6354, + 0x92C2: 0x6356, + 0x92C3: 0x6357, + 0x92C4: 0x6358, + 0x92C5: 0x6359, + 0x92C6: 0x635A, + 0x92C7: 0x635B, + 0x92C8: 0x635C, + 0x92C9: 0x635D, + 0x92CA: 0x6360, + 0x92CB: 0x6364, + 0x92CC: 0x6365, + 0x92CD: 0x6366, + 0x92CE: 0x6368, + 0x92CF: 0x636A, + 0x92D0: 0x636B, + 0x92D1: 0x636C, + 0x92D2: 0x636F, + 0x92D3: 0x6370, + 0x92D4: 0x6372, + 0x92D5: 0x6373, + 0x92D6: 0x6374, + 0x92D7: 0x6375, + 0x92D8: 0x6378, + 0x92D9: 0x6379, + 0x92DA: 0x637C, + 0x92DB: 0x637D, + 0x92DC: 0x637E, + 0x92DD: 0x637F, + 0x92DE: 0x6381, + 0x92DF: 0x6383, + 0x92E0: 0x6384, + 0x92E1: 0x6385, + 0x92E2: 0x6386, + 0x92E3: 0x638B, + 0x92E4: 0x638D, + 0x92E5: 0x6391, + 0x92E6: 0x6393, + 0x92E7: 0x6394, + 0x92E8: 0x6395, + 0x92E9: 0x6397, + 0x92EA: 0x6399, + 0x92EB: 0x639A, + 0x92EC: 0x639B, + 0x92ED: 0x639C, + 0x92EE: 0x639D, + 0x92EF: 0x639E, + 0x92F0: 0x639F, + 0x92F1: 0x63A1, + 0x92F2: 0x63A4, + 0x92F3: 0x63A6, + 0x92F4: 0x63AB, + 0x92F5: 0x63AF, + 0x92F6: 0x63B1, + 0x92F7: 0x63B2, + 0x92F8: 0x63B5, + 0x92F9: 0x63B6, + 0x92FA: 0x63B9, + 0x92FB: 0x63BB, + 0x92FC: 0x63BD, + 0x92FD: 0x63BF, + 0x92FE: 0x63C0, + 0x9340: 0x63C1, + 0x9341: 0x63C2, + 0x9342: 0x63C3, + 0x9343: 0x63C5, + 0x9344: 0x63C7, + 0x9345: 0x63C8, + 0x9346: 0x63CA, + 0x9347: 0x63CB, + 0x9348: 0x63CC, + 0x9349: 0x63D1, + 0x934A: 0x63D3, + 0x934B: 0x63D4, + 0x934C: 0x63D5, + 0x934D: 0x63D7, + 0x934E: 0x63D8, + 0x934F: 0x63D9, + 0x9350: 0x63DA, + 0x9351: 0x63DB, + 0x9352: 0x63DC, + 0x9353: 0x63DD, + 0x9354: 0x63DF, + 0x9355: 0x63E2, + 0x9356: 0x63E4, + 0x9357: 0x63E5, + 0x9358: 0x63E6, + 0x9359: 0x63E7, + 0x935A: 0x63E8, + 0x935B: 0x63EB, + 0x935C: 0x63EC, + 0x935D: 0x63EE, + 0x935E: 0x63EF, + 0x935F: 0x63F0, + 0x9360: 0x63F1, + 0x9361: 0x63F3, + 0x9362: 0x63F5, + 0x9363: 0x63F7, + 0x9364: 0x63F9, + 0x9365: 0x63FA, + 0x9366: 0x63FB, + 0x9367: 0x63FC, + 0x9368: 0x63FE, + 0x9369: 0x6403, + 0x936A: 0x6404, + 0x936B: 0x6406, + 0x936C: 0x6407, + 0x936D: 0x6408, + 0x936E: 0x6409, + 0x936F: 0x640A, + 0x9370: 0x640D, + 0x9371: 0x640E, + 0x9372: 0x6411, + 0x9373: 0x6412, + 0x9374: 0x6415, + 0x9375: 0x6416, + 0x9376: 0x6417, + 0x9377: 0x6418, + 0x9378: 0x6419, + 0x9379: 0x641A, + 0x937A: 0x641D, + 0x937B: 0x641F, + 0x937C: 0x6422, + 0x937D: 0x6423, + 0x937E: 0x6424, + 0x9380: 0x6425, + 0x9381: 0x6427, + 0x9382: 0x6428, + 0x9383: 0x6429, + 0x9384: 0x642B, + 0x9385: 0x642E, + 0x9386: 0x642F, + 0x9387: 0x6430, + 0x9388: 0x6431, + 0x9389: 0x6432, + 0x938A: 0x6433, + 0x938B: 0x6435, + 0x938C: 0x6436, + 0x938D: 0x6437, + 0x938E: 0x6438, + 0x938F: 0x6439, + 0x9390: 0x643B, + 0x9391: 0x643C, + 0x9392: 0x643E, + 0x9393: 0x6440, + 0x9394: 0x6442, + 0x9395: 0x6443, + 0x9396: 0x6449, + 0x9397: 0x644B, + 0x9398: 0x644C, + 0x9399: 0x644D, + 0x939A: 0x644E, + 0x939B: 0x644F, + 0x939C: 0x6450, + 0x939D: 0x6451, + 0x939E: 0x6453, + 0x939F: 0x6455, + 0x93A0: 0x6456, + 0x93A1: 0x6457, + 0x93A2: 0x6459, + 0x93A3: 0x645A, + 0x93A4: 0x645B, + 0x93A5: 0x645C, + 0x93A6: 0x645D, + 0x93A7: 0x645F, + 0x93A8: 0x6460, + 0x93A9: 0x6461, + 0x93AA: 0x6462, + 0x93AB: 0x6463, + 0x93AC: 0x6464, + 0x93AD: 0x6465, + 0x93AE: 0x6466, + 0x93AF: 0x6468, + 0x93B0: 0x646A, + 0x93B1: 0x646B, + 0x93B2: 0x646C, + 0x93B3: 0x646E, + 0x93B4: 0x646F, + 0x93B5: 0x6470, + 0x93B6: 0x6471, + 0x93B7: 0x6472, + 0x93B8: 0x6473, + 0x93B9: 0x6474, + 0x93BA: 0x6475, + 0x93BB: 0x6476, + 0x93BC: 0x6477, + 0x93BD: 0x647B, + 0x93BE: 0x647C, + 0x93BF: 0x647D, + 0x93C0: 0x647E, + 0x93C1: 0x647F, + 0x93C2: 0x6480, + 0x93C3: 0x6481, + 0x93C4: 0x6483, + 0x93C5: 0x6486, + 0x93C6: 0x6488, + 0x93C7: 0x6489, + 0x93C8: 0x648A, + 0x93C9: 0x648B, + 0x93CA: 0x648C, + 0x93CB: 0x648D, + 0x93CC: 0x648E, + 0x93CD: 0x648F, + 0x93CE: 0x6490, + 0x93CF: 0x6493, + 0x93D0: 0x6494, + 0x93D1: 0x6497, + 0x93D2: 0x6498, + 0x93D3: 0x649A, + 0x93D4: 0x649B, + 0x93D5: 0x649C, + 0x93D6: 0x649D, + 0x93D7: 0x649F, + 0x93D8: 0x64A0, + 0x93D9: 0x64A1, + 0x93DA: 0x64A2, + 0x93DB: 0x64A3, + 0x93DC: 0x64A5, + 0x93DD: 0x64A6, + 0x93DE: 0x64A7, + 0x93DF: 0x64A8, + 0x93E0: 0x64AA, + 0x93E1: 0x64AB, + 0x93E2: 0x64AF, + 0x93E3: 0x64B1, + 0x93E4: 0x64B2, + 0x93E5: 0x64B3, + 0x93E6: 0x64B4, + 0x93E7: 0x64B6, + 0x93E8: 0x64B9, + 0x93E9: 0x64BB, + 0x93EA: 0x64BD, + 0x93EB: 0x64BE, + 0x93EC: 0x64BF, + 0x93ED: 0x64C1, + 0x93EE: 0x64C3, + 0x93EF: 0x64C4, + 0x93F0: 0x64C6, + 0x93F1: 0x64C7, + 0x93F2: 0x64C8, + 0x93F3: 0x64C9, + 0x93F4: 0x64CA, + 0x93F5: 0x64CB, + 0x93F6: 0x64CC, + 0x93F7: 0x64CF, + 0x93F8: 0x64D1, + 0x93F9: 0x64D3, + 0x93FA: 0x64D4, + 0x93FB: 0x64D5, + 0x93FC: 0x64D6, + 0x93FD: 0x64D9, + 0x93FE: 0x64DA, + 0x9440: 0x64DB, + 0x9441: 0x64DC, + 0x9442: 0x64DD, + 0x9443: 0x64DF, + 0x9444: 0x64E0, + 0x9445: 0x64E1, + 0x9446: 0x64E3, + 0x9447: 0x64E5, + 0x9448: 0x64E7, + 0x9449: 0x64E8, + 0x944A: 0x64E9, + 0x944B: 0x64EA, + 0x944C: 0x64EB, + 0x944D: 0x64EC, + 0x944E: 0x64ED, + 0x944F: 0x64EE, + 0x9450: 0x64EF, + 0x9451: 0x64F0, + 0x9452: 0x64F1, + 0x9453: 0x64F2, + 0x9454: 0x64F3, + 0x9455: 0x64F4, + 0x9456: 0x64F5, + 0x9457: 0x64F6, + 0x9458: 0x64F7, + 0x9459: 0x64F8, + 0x945A: 0x64F9, + 0x945B: 0x64FA, + 0x945C: 0x64FB, + 0x945D: 0x64FC, + 0x945E: 0x64FD, + 0x945F: 0x64FE, + 0x9460: 0x64FF, + 0x9461: 0x6501, + 0x9462: 0x6502, + 0x9463: 0x6503, + 0x9464: 0x6504, + 0x9465: 0x6505, + 0x9466: 0x6506, + 0x9467: 0x6507, + 0x9468: 0x6508, + 0x9469: 0x650A, + 0x946A: 0x650B, + 0x946B: 0x650C, + 0x946C: 0x650D, + 0x946D: 0x650E, + 0x946E: 0x650F, + 0x946F: 0x6510, + 0x9470: 0x6511, + 0x9471: 0x6513, + 0x9472: 0x6514, + 0x9473: 0x6515, + 0x9474: 0x6516, + 0x9475: 0x6517, + 0x9476: 0x6519, + 0x9477: 0x651A, + 0x9478: 0x651B, + 0x9479: 0x651C, + 0x947A: 0x651D, + 0x947B: 0x651E, + 0x947C: 0x651F, + 0x947D: 0x6520, + 0x947E: 0x6521, + 0x9480: 0x6522, + 0x9481: 0x6523, + 0x9482: 0x6524, + 0x9483: 0x6526, + 0x9484: 0x6527, + 0x9485: 0x6528, + 0x9486: 0x6529, + 0x9487: 0x652A, + 0x9488: 0x652C, + 0x9489: 0x652D, + 0x948A: 0x6530, + 0x948B: 0x6531, + 0x948C: 0x6532, + 0x948D: 0x6533, + 0x948E: 0x6537, + 0x948F: 0x653A, + 0x9490: 0x653C, + 0x9491: 0x653D, + 0x9492: 0x6540, + 0x9493: 0x6541, + 0x9494: 0x6542, + 0x9495: 0x6543, + 0x9496: 0x6544, + 0x9497: 0x6546, + 0x9498: 0x6547, + 0x9499: 0x654A, + 0x949A: 0x654B, + 0x949B: 0x654D, + 0x949C: 0x654E, + 0x949D: 0x6550, + 0x949E: 0x6552, + 0x949F: 0x6553, + 0x94A0: 0x6554, + 0x94A1: 0x6557, + 0x94A2: 0x6558, + 0x94A3: 0x655A, + 0x94A4: 0x655C, + 0x94A5: 0x655F, + 0x94A6: 0x6560, + 0x94A7: 0x6561, + 0x94A8: 0x6564, + 0x94A9: 0x6565, + 0x94AA: 0x6567, + 0x94AB: 0x6568, + 0x94AC: 0x6569, + 0x94AD: 0x656A, + 0x94AE: 0x656D, + 0x94AF: 0x656E, + 0x94B0: 0x656F, + 0x94B1: 0x6571, + 0x94B2: 0x6573, + 0x94B3: 0x6575, + 0x94B4: 0x6576, + 0x94B5: 0x6578, + 0x94B6: 0x6579, + 0x94B7: 0x657A, + 0x94B8: 0x657B, + 0x94B9: 0x657C, + 0x94BA: 0x657D, + 0x94BB: 0x657E, + 0x94BC: 0x657F, + 0x94BD: 0x6580, + 0x94BE: 0x6581, + 0x94BF: 0x6582, + 0x94C0: 0x6583, + 0x94C1: 0x6584, + 0x94C2: 0x6585, + 0x94C3: 0x6586, + 0x94C4: 0x6588, + 0x94C5: 0x6589, + 0x94C6: 0x658A, + 0x94C7: 0x658D, + 0x94C8: 0x658E, + 0x94C9: 0x658F, + 0x94CA: 0x6592, + 0x94CB: 0x6594, + 0x94CC: 0x6595, + 0x94CD: 0x6596, + 0x94CE: 0x6598, + 0x94CF: 0x659A, + 0x94D0: 0x659D, + 0x94D1: 0x659E, + 0x94D2: 0x65A0, + 0x94D3: 0x65A2, + 0x94D4: 0x65A3, + 0x94D5: 0x65A6, + 0x94D6: 0x65A8, + 0x94D7: 0x65AA, + 0x94D8: 0x65AC, + 0x94D9: 0x65AE, + 0x94DA: 0x65B1, + 0x94DB: 0x65B2, + 0x94DC: 0x65B3, + 0x94DD: 0x65B4, + 0x94DE: 0x65B5, + 0x94DF: 0x65B6, + 0x94E0: 0x65B7, + 0x94E1: 0x65B8, + 0x94E2: 0x65BA, + 0x94E3: 0x65BB, + 0x94E4: 0x65BE, + 0x94E5: 0x65BF, + 0x94E6: 0x65C0, + 0x94E7: 0x65C2, + 0x94E8: 0x65C7, + 0x94E9: 0x65C8, + 0x94EA: 0x65C9, + 0x94EB: 0x65CA, + 0x94EC: 0x65CD, + 0x94ED: 0x65D0, + 0x94EE: 0x65D1, + 0x94EF: 0x65D3, + 0x94F0: 0x65D4, + 0x94F1: 0x65D5, + 0x94F2: 0x65D8, + 0x94F3: 0x65D9, + 0x94F4: 0x65DA, + 0x94F5: 0x65DB, + 0x94F6: 0x65DC, + 0x94F7: 0x65DD, + 0x94F8: 0x65DE, + 0x94F9: 0x65DF, + 0x94FA: 0x65E1, + 0x94FB: 0x65E3, + 0x94FC: 0x65E4, + 0x94FD: 0x65EA, + 0x94FE: 0x65EB, + 0x9540: 0x65F2, + 0x9541: 0x65F3, + 0x9542: 0x65F4, + 0x9543: 0x65F5, + 0x9544: 0x65F8, + 0x9545: 0x65F9, + 0x9546: 0x65FB, + 0x9547: 0x65FC, + 0x9548: 0x65FD, + 0x9549: 0x65FE, + 0x954A: 0x65FF, + 0x954B: 0x6601, + 0x954C: 0x6604, + 0x954D: 0x6605, + 0x954E: 0x6607, + 0x954F: 0x6608, + 0x9550: 0x6609, + 0x9551: 0x660B, + 0x9552: 0x660D, + 0x9553: 0x6610, + 0x9554: 0x6611, + 0x9555: 0x6612, + 0x9556: 0x6616, + 0x9557: 0x6617, + 0x9558: 0x6618, + 0x9559: 0x661A, + 0x955A: 0x661B, + 0x955B: 0x661C, + 0x955C: 0x661E, + 0x955D: 0x6621, + 0x955E: 0x6622, + 0x955F: 0x6623, + 0x9560: 0x6624, + 0x9561: 0x6626, + 0x9562: 0x6629, + 0x9563: 0x662A, + 0x9564: 0x662B, + 0x9565: 0x662C, + 0x9566: 0x662E, + 0x9567: 0x6630, + 0x9568: 0x6632, + 0x9569: 0x6633, + 0x956A: 0x6637, + 0x956B: 0x6638, + 0x956C: 0x6639, + 0x956D: 0x663A, + 0x956E: 0x663B, + 0x956F: 0x663D, + 0x9570: 0x663F, + 0x9571: 0x6640, + 0x9572: 0x6642, + 0x9573: 0x6644, + 0x9574: 0x6645, + 0x9575: 0x6646, + 0x9576: 0x6647, + 0x9577: 0x6648, + 0x9578: 0x6649, + 0x9579: 0x664A, + 0x957A: 0x664D, + 0x957B: 0x664E, + 0x957C: 0x6650, + 0x957D: 0x6651, + 0x957E: 0x6658, + 0x9580: 0x6659, + 0x9581: 0x665B, + 0x9582: 0x665C, + 0x9583: 0x665D, + 0x9584: 0x665E, + 0x9585: 0x6660, + 0x9586: 0x6662, + 0x9587: 0x6663, + 0x9588: 0x6665, + 0x9589: 0x6667, + 0x958A: 0x6669, + 0x958B: 0x666A, + 0x958C: 0x666B, + 0x958D: 0x666C, + 0x958E: 0x666D, + 0x958F: 0x6671, + 0x9590: 0x6672, + 0x9591: 0x6673, + 0x9592: 0x6675, + 0x9593: 0x6678, + 0x9594: 0x6679, + 0x9595: 0x667B, + 0x9596: 0x667C, + 0x9597: 0x667D, + 0x9598: 0x667F, + 0x9599: 0x6680, + 0x959A: 0x6681, + 0x959B: 0x6683, + 0x959C: 0x6685, + 0x959D: 0x6686, + 0x959E: 0x6688, + 0x959F: 0x6689, + 0x95A0: 0x668A, + 0x95A1: 0x668B, + 0x95A2: 0x668D, + 0x95A3: 0x668E, + 0x95A4: 0x668F, + 0x95A5: 0x6690, + 0x95A6: 0x6692, + 0x95A7: 0x6693, + 0x95A8: 0x6694, + 0x95A9: 0x6695, + 0x95AA: 0x6698, + 0x95AB: 0x6699, + 0x95AC: 0x669A, + 0x95AD: 0x669B, + 0x95AE: 0x669C, + 0x95AF: 0x669E, + 0x95B0: 0x669F, + 0x95B1: 0x66A0, + 0x95B2: 0x66A1, + 0x95B3: 0x66A2, + 0x95B4: 0x66A3, + 0x95B5: 0x66A4, + 0x95B6: 0x66A5, + 0x95B7: 0x66A6, + 0x95B8: 0x66A9, + 0x95B9: 0x66AA, + 0x95BA: 0x66AB, + 0x95BB: 0x66AC, + 0x95BC: 0x66AD, + 0x95BD: 0x66AF, + 0x95BE: 0x66B0, + 0x95BF: 0x66B1, + 0x95C0: 0x66B2, + 0x95C1: 0x66B3, + 0x95C2: 0x66B5, + 0x95C3: 0x66B6, + 0x95C4: 0x66B7, + 0x95C5: 0x66B8, + 0x95C6: 0x66BA, + 0x95C7: 0x66BB, + 0x95C8: 0x66BC, + 0x95C9: 0x66BD, + 0x95CA: 0x66BF, + 0x95CB: 0x66C0, + 0x95CC: 0x66C1, + 0x95CD: 0x66C2, + 0x95CE: 0x66C3, + 0x95CF: 0x66C4, + 0x95D0: 0x66C5, + 0x95D1: 0x66C6, + 0x95D2: 0x66C7, + 0x95D3: 0x66C8, + 0x95D4: 0x66C9, + 0x95D5: 0x66CA, + 0x95D6: 0x66CB, + 0x95D7: 0x66CC, + 0x95D8: 0x66CD, + 0x95D9: 0x66CE, + 0x95DA: 0x66CF, + 0x95DB: 0x66D0, + 0x95DC: 0x66D1, + 0x95DD: 0x66D2, + 0x95DE: 0x66D3, + 0x95DF: 0x66D4, + 0x95E0: 0x66D5, + 0x95E1: 0x66D6, + 0x95E2: 0x66D7, + 0x95E3: 0x66D8, + 0x95E4: 0x66DA, + 0x95E5: 0x66DE, + 0x95E6: 0x66DF, + 0x95E7: 0x66E0, + 0x95E8: 0x66E1, + 0x95E9: 0x66E2, + 0x95EA: 0x66E3, + 0x95EB: 0x66E4, + 0x95EC: 0x66E5, + 0x95ED: 0x66E7, + 0x95EE: 0x66E8, + 0x95EF: 0x66EA, + 0x95F0: 0x66EB, + 0x95F1: 0x66EC, + 0x95F2: 0x66ED, + 0x95F3: 0x66EE, + 0x95F4: 0x66EF, + 0x95F5: 0x66F1, + 0x95F6: 0x66F5, + 0x95F7: 0x66F6, + 0x95F8: 0x66F8, + 0x95F9: 0x66FA, + 0x95FA: 0x66FB, + 0x95FB: 0x66FD, + 0x95FC: 0x6701, + 0x95FD: 0x6702, + 0x95FE: 0x6703, + 0x9640: 0x6704, + 0x9641: 0x6705, + 0x9642: 0x6706, + 0x9643: 0x6707, + 0x9644: 0x670C, + 0x9645: 0x670E, + 0x9646: 0x670F, + 0x9647: 0x6711, + 0x9648: 0x6712, + 0x9649: 0x6713, + 0x964A: 0x6716, + 0x964B: 0x6718, + 0x964C: 0x6719, + 0x964D: 0x671A, + 0x964E: 0x671C, + 0x964F: 0x671E, + 0x9650: 0x6720, + 0x9651: 0x6721, + 0x9652: 0x6722, + 0x9653: 0x6723, + 0x9654: 0x6724, + 0x9655: 0x6725, + 0x9656: 0x6727, + 0x9657: 0x6729, + 0x9658: 0x672E, + 0x9659: 0x6730, + 0x965A: 0x6732, + 0x965B: 0x6733, + 0x965C: 0x6736, + 0x965D: 0x6737, + 0x965E: 0x6738, + 0x965F: 0x6739, + 0x9660: 0x673B, + 0x9661: 0x673C, + 0x9662: 0x673E, + 0x9663: 0x673F, + 0x9664: 0x6741, + 0x9665: 0x6744, + 0x9666: 0x6745, + 0x9667: 0x6747, + 0x9668: 0x674A, + 0x9669: 0x674B, + 0x966A: 0x674D, + 0x966B: 0x6752, + 0x966C: 0x6754, + 0x966D: 0x6755, + 0x966E: 0x6757, + 0x966F: 0x6758, + 0x9670: 0x6759, + 0x9671: 0x675A, + 0x9672: 0x675B, + 0x9673: 0x675D, + 0x9674: 0x6762, + 0x9675: 0x6763, + 0x9676: 0x6764, + 0x9677: 0x6766, + 0x9678: 0x6767, + 0x9679: 0x676B, + 0x967A: 0x676C, + 0x967B: 0x676E, + 0x967C: 0x6771, + 0x967D: 0x6774, + 0x967E: 0x6776, + 0x9680: 0x6778, + 0x9681: 0x6779, + 0x9682: 0x677A, + 0x9683: 0x677B, + 0x9684: 0x677D, + 0x9685: 0x6780, + 0x9686: 0x6782, + 0x9687: 0x6783, + 0x9688: 0x6785, + 0x9689: 0x6786, + 0x968A: 0x6788, + 0x968B: 0x678A, + 0x968C: 0x678C, + 0x968D: 0x678D, + 0x968E: 0x678E, + 0x968F: 0x678F, + 0x9690: 0x6791, + 0x9691: 0x6792, + 0x9692: 0x6793, + 0x9693: 0x6794, + 0x9694: 0x6796, + 0x9695: 0x6799, + 0x9696: 0x679B, + 0x9697: 0x679F, + 0x9698: 0x67A0, + 0x9699: 0x67A1, + 0x969A: 0x67A4, + 0x969B: 0x67A6, + 0x969C: 0x67A9, + 0x969D: 0x67AC, + 0x969E: 0x67AE, + 0x969F: 0x67B1, + 0x96A0: 0x67B2, + 0x96A1: 0x67B4, + 0x96A2: 0x67B9, + 0x96A3: 0x67BA, + 0x96A4: 0x67BB, + 0x96A5: 0x67BC, + 0x96A6: 0x67BD, + 0x96A7: 0x67BE, + 0x96A8: 0x67BF, + 0x96A9: 0x67C0, + 0x96AA: 0x67C2, + 0x96AB: 0x67C5, + 0x96AC: 0x67C6, + 0x96AD: 0x67C7, + 0x96AE: 0x67C8, + 0x96AF: 0x67C9, + 0x96B0: 0x67CA, + 0x96B1: 0x67CB, + 0x96B2: 0x67CC, + 0x96B3: 0x67CD, + 0x96B4: 0x67CE, + 0x96B5: 0x67D5, + 0x96B6: 0x67D6, + 0x96B7: 0x67D7, + 0x96B8: 0x67DB, + 0x96B9: 0x67DF, + 0x96BA: 0x67E1, + 0x96BB: 0x67E3, + 0x96BC: 0x67E4, + 0x96BD: 0x67E6, + 0x96BE: 0x67E7, + 0x96BF: 0x67E8, + 0x96C0: 0x67EA, + 0x96C1: 0x67EB, + 0x96C2: 0x67ED, + 0x96C3: 0x67EE, + 0x96C4: 0x67F2, + 0x96C5: 0x67F5, + 0x96C6: 0x67F6, + 0x96C7: 0x67F7, + 0x96C8: 0x67F8, + 0x96C9: 0x67F9, + 0x96CA: 0x67FA, + 0x96CB: 0x67FB, + 0x96CC: 0x67FC, + 0x96CD: 0x67FE, + 0x96CE: 0x6801, + 0x96CF: 0x6802, + 0x96D0: 0x6803, + 0x96D1: 0x6804, + 0x96D2: 0x6806, + 0x96D3: 0x680D, + 0x96D4: 0x6810, + 0x96D5: 0x6812, + 0x96D6: 0x6814, + 0x96D7: 0x6815, + 0x96D8: 0x6818, + 0x96D9: 0x6819, + 0x96DA: 0x681A, + 0x96DB: 0x681B, + 0x96DC: 0x681C, + 0x96DD: 0x681E, + 0x96DE: 0x681F, + 0x96DF: 0x6820, + 0x96E0: 0x6822, + 0x96E1: 0x6823, + 0x96E2: 0x6824, + 0x96E3: 0x6825, + 0x96E4: 0x6826, + 0x96E5: 0x6827, + 0x96E6: 0x6828, + 0x96E7: 0x682B, + 0x96E8: 0x682C, + 0x96E9: 0x682D, + 0x96EA: 0x682E, + 0x96EB: 0x682F, + 0x96EC: 0x6830, + 0x96ED: 0x6831, + 0x96EE: 0x6834, + 0x96EF: 0x6835, + 0x96F0: 0x6836, + 0x96F1: 0x683A, + 0x96F2: 0x683B, + 0x96F3: 0x683F, + 0x96F4: 0x6847, + 0x96F5: 0x684B, + 0x96F6: 0x684D, + 0x96F7: 0x684F, + 0x96F8: 0x6852, + 0x96F9: 0x6856, + 0x96FA: 0x6857, + 0x96FB: 0x6858, + 0x96FC: 0x6859, + 0x96FD: 0x685A, + 0x96FE: 0x685B, + 0x9740: 0x685C, + 0x9741: 0x685D, + 0x9742: 0x685E, + 0x9743: 0x685F, + 0x9744: 0x686A, + 0x9745: 0x686C, + 0x9746: 0x686D, + 0x9747: 0x686E, + 0x9748: 0x686F, + 0x9749: 0x6870, + 0x974A: 0x6871, + 0x974B: 0x6872, + 0x974C: 0x6873, + 0x974D: 0x6875, + 0x974E: 0x6878, + 0x974F: 0x6879, + 0x9750: 0x687A, + 0x9751: 0x687B, + 0x9752: 0x687C, + 0x9753: 0x687D, + 0x9754: 0x687E, + 0x9755: 0x687F, + 0x9756: 0x6880, + 0x9757: 0x6882, + 0x9758: 0x6884, + 0x9759: 0x6887, + 0x975A: 0x6888, + 0x975B: 0x6889, + 0x975C: 0x688A, + 0x975D: 0x688B, + 0x975E: 0x688C, + 0x975F: 0x688D, + 0x9760: 0x688E, + 0x9761: 0x6890, + 0x9762: 0x6891, + 0x9763: 0x6892, + 0x9764: 0x6894, + 0x9765: 0x6895, + 0x9766: 0x6896, + 0x9767: 0x6898, + 0x9768: 0x6899, + 0x9769: 0x689A, + 0x976A: 0x689B, + 0x976B: 0x689C, + 0x976C: 0x689D, + 0x976D: 0x689E, + 0x976E: 0x689F, + 0x976F: 0x68A0, + 0x9770: 0x68A1, + 0x9771: 0x68A3, + 0x9772: 0x68A4, + 0x9773: 0x68A5, + 0x9774: 0x68A9, + 0x9775: 0x68AA, + 0x9776: 0x68AB, + 0x9777: 0x68AC, + 0x9778: 0x68AE, + 0x9779: 0x68B1, + 0x977A: 0x68B2, + 0x977B: 0x68B4, + 0x977C: 0x68B6, + 0x977D: 0x68B7, + 0x977E: 0x68B8, + 0x9780: 0x68B9, + 0x9781: 0x68BA, + 0x9782: 0x68BB, + 0x9783: 0x68BC, + 0x9784: 0x68BD, + 0x9785: 0x68BE, + 0x9786: 0x68BF, + 0x9787: 0x68C1, + 0x9788: 0x68C3, + 0x9789: 0x68C4, + 0x978A: 0x68C5, + 0x978B: 0x68C6, + 0x978C: 0x68C7, + 0x978D: 0x68C8, + 0x978E: 0x68CA, + 0x978F: 0x68CC, + 0x9790: 0x68CE, + 0x9791: 0x68CF, + 0x9792: 0x68D0, + 0x9793: 0x68D1, + 0x9794: 0x68D3, + 0x9795: 0x68D4, + 0x9796: 0x68D6, + 0x9797: 0x68D7, + 0x9798: 0x68D9, + 0x9799: 0x68DB, + 0x979A: 0x68DC, + 0x979B: 0x68DD, + 0x979C: 0x68DE, + 0x979D: 0x68DF, + 0x979E: 0x68E1, + 0x979F: 0x68E2, + 0x97A0: 0x68E4, + 0x97A1: 0x68E5, + 0x97A2: 0x68E6, + 0x97A3: 0x68E7, + 0x97A4: 0x68E8, + 0x97A5: 0x68E9, + 0x97A6: 0x68EA, + 0x97A7: 0x68EB, + 0x97A8: 0x68EC, + 0x97A9: 0x68ED, + 0x97AA: 0x68EF, + 0x97AB: 0x68F2, + 0x97AC: 0x68F3, + 0x97AD: 0x68F4, + 0x97AE: 0x68F6, + 0x97AF: 0x68F7, + 0x97B0: 0x68F8, + 0x97B1: 0x68FB, + 0x97B2: 0x68FD, + 0x97B3: 0x68FE, + 0x97B4: 0x68FF, + 0x97B5: 0x6900, + 0x97B6: 0x6902, + 0x97B7: 0x6903, + 0x97B8: 0x6904, + 0x97B9: 0x6906, + 0x97BA: 0x6907, + 0x97BB: 0x6908, + 0x97BC: 0x6909, + 0x97BD: 0x690A, + 0x97BE: 0x690C, + 0x97BF: 0x690F, + 0x97C0: 0x6911, + 0x97C1: 0x6913, + 0x97C2: 0x6914, + 0x97C3: 0x6915, + 0x97C4: 0x6916, + 0x97C5: 0x6917, + 0x97C6: 0x6918, + 0x97C7: 0x6919, + 0x97C8: 0x691A, + 0x97C9: 0x691B, + 0x97CA: 0x691C, + 0x97CB: 0x691D, + 0x97CC: 0x691E, + 0x97CD: 0x6921, + 0x97CE: 0x6922, + 0x97CF: 0x6923, + 0x97D0: 0x6925, + 0x97D1: 0x6926, + 0x97D2: 0x6927, + 0x97D3: 0x6928, + 0x97D4: 0x6929, + 0x97D5: 0x692A, + 0x97D6: 0x692B, + 0x97D7: 0x692C, + 0x97D8: 0x692E, + 0x97D9: 0x692F, + 0x97DA: 0x6931, + 0x97DB: 0x6932, + 0x97DC: 0x6933, + 0x97DD: 0x6935, + 0x97DE: 0x6936, + 0x97DF: 0x6937, + 0x97E0: 0x6938, + 0x97E1: 0x693A, + 0x97E2: 0x693B, + 0x97E3: 0x693C, + 0x97E4: 0x693E, + 0x97E5: 0x6940, + 0x97E6: 0x6941, + 0x97E7: 0x6943, + 0x97E8: 0x6944, + 0x97E9: 0x6945, + 0x97EA: 0x6946, + 0x97EB: 0x6947, + 0x97EC: 0x6948, + 0x97ED: 0x6949, + 0x97EE: 0x694A, + 0x97EF: 0x694B, + 0x97F0: 0x694C, + 0x97F1: 0x694D, + 0x97F2: 0x694E, + 0x97F3: 0x694F, + 0x97F4: 0x6950, + 0x97F5: 0x6951, + 0x97F6: 0x6952, + 0x97F7: 0x6953, + 0x97F8: 0x6955, + 0x97F9: 0x6956, + 0x97FA: 0x6958, + 0x97FB: 0x6959, + 0x97FC: 0x695B, + 0x97FD: 0x695C, + 0x97FE: 0x695F, + 0x9840: 0x6961, + 0x9841: 0x6962, + 0x9842: 0x6964, + 0x9843: 0x6965, + 0x9844: 0x6967, + 0x9845: 0x6968, + 0x9846: 0x6969, + 0x9847: 0x696A, + 0x9848: 0x696C, + 0x9849: 0x696D, + 0x984A: 0x696F, + 0x984B: 0x6970, + 0x984C: 0x6972, + 0x984D: 0x6973, + 0x984E: 0x6974, + 0x984F: 0x6975, + 0x9850: 0x6976, + 0x9851: 0x697A, + 0x9852: 0x697B, + 0x9853: 0x697D, + 0x9854: 0x697E, + 0x9855: 0x697F, + 0x9856: 0x6981, + 0x9857: 0x6983, + 0x9858: 0x6985, + 0x9859: 0x698A, + 0x985A: 0x698B, + 0x985B: 0x698C, + 0x985C: 0x698E, + 0x985D: 0x698F, + 0x985E: 0x6990, + 0x985F: 0x6991, + 0x9860: 0x6992, + 0x9861: 0x6993, + 0x9862: 0x6996, + 0x9863: 0x6997, + 0x9864: 0x6999, + 0x9865: 0x699A, + 0x9866: 0x699D, + 0x9867: 0x699E, + 0x9868: 0x699F, + 0x9869: 0x69A0, + 0x986A: 0x69A1, + 0x986B: 0x69A2, + 0x986C: 0x69A3, + 0x986D: 0x69A4, + 0x986E: 0x69A5, + 0x986F: 0x69A6, + 0x9870: 0x69A9, + 0x9871: 0x69AA, + 0x9872: 0x69AC, + 0x9873: 0x69AE, + 0x9874: 0x69AF, + 0x9875: 0x69B0, + 0x9876: 0x69B2, + 0x9877: 0x69B3, + 0x9878: 0x69B5, + 0x9879: 0x69B6, + 0x987A: 0x69B8, + 0x987B: 0x69B9, + 0x987C: 0x69BA, + 0x987D: 0x69BC, + 0x987E: 0x69BD, + 0x9880: 0x69BE, + 0x9881: 0x69BF, + 0x9882: 0x69C0, + 0x9883: 0x69C2, + 0x9884: 0x69C3, + 0x9885: 0x69C4, + 0x9886: 0x69C5, + 0x9887: 0x69C6, + 0x9888: 0x69C7, + 0x9889: 0x69C8, + 0x988A: 0x69C9, + 0x988B: 0x69CB, + 0x988C: 0x69CD, + 0x988D: 0x69CF, + 0x988E: 0x69D1, + 0x988F: 0x69D2, + 0x9890: 0x69D3, + 0x9891: 0x69D5, + 0x9892: 0x69D6, + 0x9893: 0x69D7, + 0x9894: 0x69D8, + 0x9895: 0x69D9, + 0x9896: 0x69DA, + 0x9897: 0x69DC, + 0x9898: 0x69DD, + 0x9899: 0x69DE, + 0x989A: 0x69E1, + 0x989B: 0x69E2, + 0x989C: 0x69E3, + 0x989D: 0x69E4, + 0x989E: 0x69E5, + 0x989F: 0x69E6, + 0x98A0: 0x69E7, + 0x98A1: 0x69E8, + 0x98A2: 0x69E9, + 0x98A3: 0x69EA, + 0x98A4: 0x69EB, + 0x98A5: 0x69EC, + 0x98A6: 0x69EE, + 0x98A7: 0x69EF, + 0x98A8: 0x69F0, + 0x98A9: 0x69F1, + 0x98AA: 0x69F3, + 0x98AB: 0x69F4, + 0x98AC: 0x69F5, + 0x98AD: 0x69F6, + 0x98AE: 0x69F7, + 0x98AF: 0x69F8, + 0x98B0: 0x69F9, + 0x98B1: 0x69FA, + 0x98B2: 0x69FB, + 0x98B3: 0x69FC, + 0x98B4: 0x69FE, + 0x98B5: 0x6A00, + 0x98B6: 0x6A01, + 0x98B7: 0x6A02, + 0x98B8: 0x6A03, + 0x98B9: 0x6A04, + 0x98BA: 0x6A05, + 0x98BB: 0x6A06, + 0x98BC: 0x6A07, + 0x98BD: 0x6A08, + 0x98BE: 0x6A09, + 0x98BF: 0x6A0B, + 0x98C0: 0x6A0C, + 0x98C1: 0x6A0D, + 0x98C2: 0x6A0E, + 0x98C3: 0x6A0F, + 0x98C4: 0x6A10, + 0x98C5: 0x6A11, + 0x98C6: 0x6A12, + 0x98C7: 0x6A13, + 0x98C8: 0x6A14, + 0x98C9: 0x6A15, + 0x98CA: 0x6A16, + 0x98CB: 0x6A19, + 0x98CC: 0x6A1A, + 0x98CD: 0x6A1B, + 0x98CE: 0x6A1C, + 0x98CF: 0x6A1D, + 0x98D0: 0x6A1E, + 0x98D1: 0x6A20, + 0x98D2: 0x6A22, + 0x98D3: 0x6A23, + 0x98D4: 0x6A24, + 0x98D5: 0x6A25, + 0x98D6: 0x6A26, + 0x98D7: 0x6A27, + 0x98D8: 0x6A29, + 0x98D9: 0x6A2B, + 0x98DA: 0x6A2C, + 0x98DB: 0x6A2D, + 0x98DC: 0x6A2E, + 0x98DD: 0x6A30, + 0x98DE: 0x6A32, + 0x98DF: 0x6A33, + 0x98E0: 0x6A34, + 0x98E1: 0x6A36, + 0x98E2: 0x6A37, + 0x98E3: 0x6A38, + 0x98E4: 0x6A39, + 0x98E5: 0x6A3A, + 0x98E6: 0x6A3B, + 0x98E7: 0x6A3C, + 0x98E8: 0x6A3F, + 0x98E9: 0x6A40, + 0x98EA: 0x6A41, + 0x98EB: 0x6A42, + 0x98EC: 0x6A43, + 0x98ED: 0x6A45, + 0x98EE: 0x6A46, + 0x98EF: 0x6A48, + 0x98F0: 0x6A49, + 0x98F1: 0x6A4A, + 0x98F2: 0x6A4B, + 0x98F3: 0x6A4C, + 0x98F4: 0x6A4D, + 0x98F5: 0x6A4E, + 0x98F6: 0x6A4F, + 0x98F7: 0x6A51, + 0x98F8: 0x6A52, + 0x98F9: 0x6A53, + 0x98FA: 0x6A54, + 0x98FB: 0x6A55, + 0x98FC: 0x6A56, + 0x98FD: 0x6A57, + 0x98FE: 0x6A5A, + 0x9940: 0x6A5C, + 0x9941: 0x6A5D, + 0x9942: 0x6A5E, + 0x9943: 0x6A5F, + 0x9944: 0x6A60, + 0x9945: 0x6A62, + 0x9946: 0x6A63, + 0x9947: 0x6A64, + 0x9948: 0x6A66, + 0x9949: 0x6A67, + 0x994A: 0x6A68, + 0x994B: 0x6A69, + 0x994C: 0x6A6A, + 0x994D: 0x6A6B, + 0x994E: 0x6A6C, + 0x994F: 0x6A6D, + 0x9950: 0x6A6E, + 0x9951: 0x6A6F, + 0x9952: 0x6A70, + 0x9953: 0x6A72, + 0x9954: 0x6A73, + 0x9955: 0x6A74, + 0x9956: 0x6A75, + 0x9957: 0x6A76, + 0x9958: 0x6A77, + 0x9959: 0x6A78, + 0x995A: 0x6A7A, + 0x995B: 0x6A7B, + 0x995C: 0x6A7D, + 0x995D: 0x6A7E, + 0x995E: 0x6A7F, + 0x995F: 0x6A81, + 0x9960: 0x6A82, + 0x9961: 0x6A83, + 0x9962: 0x6A85, + 0x9963: 0x6A86, + 0x9964: 0x6A87, + 0x9965: 0x6A88, + 0x9966: 0x6A89, + 0x9967: 0x6A8A, + 0x9968: 0x6A8B, + 0x9969: 0x6A8C, + 0x996A: 0x6A8D, + 0x996B: 0x6A8F, + 0x996C: 0x6A92, + 0x996D: 0x6A93, + 0x996E: 0x6A94, + 0x996F: 0x6A95, + 0x9970: 0x6A96, + 0x9971: 0x6A98, + 0x9972: 0x6A99, + 0x9973: 0x6A9A, + 0x9974: 0x6A9B, + 0x9975: 0x6A9C, + 0x9976: 0x6A9D, + 0x9977: 0x6A9E, + 0x9978: 0x6A9F, + 0x9979: 0x6AA1, + 0x997A: 0x6AA2, + 0x997B: 0x6AA3, + 0x997C: 0x6AA4, + 0x997D: 0x6AA5, + 0x997E: 0x6AA6, + 0x9980: 0x6AA7, + 0x9981: 0x6AA8, + 0x9982: 0x6AAA, + 0x9983: 0x6AAD, + 0x9984: 0x6AAE, + 0x9985: 0x6AAF, + 0x9986: 0x6AB0, + 0x9987: 0x6AB1, + 0x9988: 0x6AB2, + 0x9989: 0x6AB3, + 0x998A: 0x6AB4, + 0x998B: 0x6AB5, + 0x998C: 0x6AB6, + 0x998D: 0x6AB7, + 0x998E: 0x6AB8, + 0x998F: 0x6AB9, + 0x9990: 0x6ABA, + 0x9991: 0x6ABB, + 0x9992: 0x6ABC, + 0x9993: 0x6ABD, + 0x9994: 0x6ABE, + 0x9995: 0x6ABF, + 0x9996: 0x6AC0, + 0x9997: 0x6AC1, + 0x9998: 0x6AC2, + 0x9999: 0x6AC3, + 0x999A: 0x6AC4, + 0x999B: 0x6AC5, + 0x999C: 0x6AC6, + 0x999D: 0x6AC7, + 0x999E: 0x6AC8, + 0x999F: 0x6AC9, + 0x99A0: 0x6ACA, + 0x99A1: 0x6ACB, + 0x99A2: 0x6ACC, + 0x99A3: 0x6ACD, + 0x99A4: 0x6ACE, + 0x99A5: 0x6ACF, + 0x99A6: 0x6AD0, + 0x99A7: 0x6AD1, + 0x99A8: 0x6AD2, + 0x99A9: 0x6AD3, + 0x99AA: 0x6AD4, + 0x99AB: 0x6AD5, + 0x99AC: 0x6AD6, + 0x99AD: 0x6AD7, + 0x99AE: 0x6AD8, + 0x99AF: 0x6AD9, + 0x99B0: 0x6ADA, + 0x99B1: 0x6ADB, + 0x99B2: 0x6ADC, + 0x99B3: 0x6ADD, + 0x99B4: 0x6ADE, + 0x99B5: 0x6ADF, + 0x99B6: 0x6AE0, + 0x99B7: 0x6AE1, + 0x99B8: 0x6AE2, + 0x99B9: 0x6AE3, + 0x99BA: 0x6AE4, + 0x99BB: 0x6AE5, + 0x99BC: 0x6AE6, + 0x99BD: 0x6AE7, + 0x99BE: 0x6AE8, + 0x99BF: 0x6AE9, + 0x99C0: 0x6AEA, + 0x99C1: 0x6AEB, + 0x99C2: 0x6AEC, + 0x99C3: 0x6AED, + 0x99C4: 0x6AEE, + 0x99C5: 0x6AEF, + 0x99C6: 0x6AF0, + 0x99C7: 0x6AF1, + 0x99C8: 0x6AF2, + 0x99C9: 0x6AF3, + 0x99CA: 0x6AF4, + 0x99CB: 0x6AF5, + 0x99CC: 0x6AF6, + 0x99CD: 0x6AF7, + 0x99CE: 0x6AF8, + 0x99CF: 0x6AF9, + 0x99D0: 0x6AFA, + 0x99D1: 0x6AFB, + 0x99D2: 0x6AFC, + 0x99D3: 0x6AFD, + 0x99D4: 0x6AFE, + 0x99D5: 0x6AFF, + 0x99D6: 0x6B00, + 0x99D7: 0x6B01, + 0x99D8: 0x6B02, + 0x99D9: 0x6B03, + 0x99DA: 0x6B04, + 0x99DB: 0x6B05, + 0x99DC: 0x6B06, + 0x99DD: 0x6B07, + 0x99DE: 0x6B08, + 0x99DF: 0x6B09, + 0x99E0: 0x6B0A, + 0x99E1: 0x6B0B, + 0x99E2: 0x6B0C, + 0x99E3: 0x6B0D, + 0x99E4: 0x6B0E, + 0x99E5: 0x6B0F, + 0x99E6: 0x6B10, + 0x99E7: 0x6B11, + 0x99E8: 0x6B12, + 0x99E9: 0x6B13, + 0x99EA: 0x6B14, + 0x99EB: 0x6B15, + 0x99EC: 0x6B16, + 0x99ED: 0x6B17, + 0x99EE: 0x6B18, + 0x99EF: 0x6B19, + 0x99F0: 0x6B1A, + 0x99F1: 0x6B1B, + 0x99F2: 0x6B1C, + 0x99F3: 0x6B1D, + 0x99F4: 0x6B1E, + 0x99F5: 0x6B1F, + 0x99F6: 0x6B25, + 0x99F7: 0x6B26, + 0x99F8: 0x6B28, + 0x99F9: 0x6B29, + 0x99FA: 0x6B2A, + 0x99FB: 0x6B2B, + 0x99FC: 0x6B2C, + 0x99FD: 0x6B2D, + 0x99FE: 0x6B2E, + 0x9A40: 0x6B2F, + 0x9A41: 0x6B30, + 0x9A42: 0x6B31, + 0x9A43: 0x6B33, + 0x9A44: 0x6B34, + 0x9A45: 0x6B35, + 0x9A46: 0x6B36, + 0x9A47: 0x6B38, + 0x9A48: 0x6B3B, + 0x9A49: 0x6B3C, + 0x9A4A: 0x6B3D, + 0x9A4B: 0x6B3F, + 0x9A4C: 0x6B40, + 0x9A4D: 0x6B41, + 0x9A4E: 0x6B42, + 0x9A4F: 0x6B44, + 0x9A50: 0x6B45, + 0x9A51: 0x6B48, + 0x9A52: 0x6B4A, + 0x9A53: 0x6B4B, + 0x9A54: 0x6B4D, + 0x9A55: 0x6B4E, + 0x9A56: 0x6B4F, + 0x9A57: 0x6B50, + 0x9A58: 0x6B51, + 0x9A59: 0x6B52, + 0x9A5A: 0x6B53, + 0x9A5B: 0x6B54, + 0x9A5C: 0x6B55, + 0x9A5D: 0x6B56, + 0x9A5E: 0x6B57, + 0x9A5F: 0x6B58, + 0x9A60: 0x6B5A, + 0x9A61: 0x6B5B, + 0x9A62: 0x6B5C, + 0x9A63: 0x6B5D, + 0x9A64: 0x6B5E, + 0x9A65: 0x6B5F, + 0x9A66: 0x6B60, + 0x9A67: 0x6B61, + 0x9A68: 0x6B68, + 0x9A69: 0x6B69, + 0x9A6A: 0x6B6B, + 0x9A6B: 0x6B6C, + 0x9A6C: 0x6B6D, + 0x9A6D: 0x6B6E, + 0x9A6E: 0x6B6F, + 0x9A6F: 0x6B70, + 0x9A70: 0x6B71, + 0x9A71: 0x6B72, + 0x9A72: 0x6B73, + 0x9A73: 0x6B74, + 0x9A74: 0x6B75, + 0x9A75: 0x6B76, + 0x9A76: 0x6B77, + 0x9A77: 0x6B78, + 0x9A78: 0x6B7A, + 0x9A79: 0x6B7D, + 0x9A7A: 0x6B7E, + 0x9A7B: 0x6B7F, + 0x9A7C: 0x6B80, + 0x9A7D: 0x6B85, + 0x9A7E: 0x6B88, + 0x9A80: 0x6B8C, + 0x9A81: 0x6B8E, + 0x9A82: 0x6B8F, + 0x9A83: 0x6B90, + 0x9A84: 0x6B91, + 0x9A85: 0x6B94, + 0x9A86: 0x6B95, + 0x9A87: 0x6B97, + 0x9A88: 0x6B98, + 0x9A89: 0x6B99, + 0x9A8A: 0x6B9C, + 0x9A8B: 0x6B9D, + 0x9A8C: 0x6B9E, + 0x9A8D: 0x6B9F, + 0x9A8E: 0x6BA0, + 0x9A8F: 0x6BA2, + 0x9A90: 0x6BA3, + 0x9A91: 0x6BA4, + 0x9A92: 0x6BA5, + 0x9A93: 0x6BA6, + 0x9A94: 0x6BA7, + 0x9A95: 0x6BA8, + 0x9A96: 0x6BA9, + 0x9A97: 0x6BAB, + 0x9A98: 0x6BAC, + 0x9A99: 0x6BAD, + 0x9A9A: 0x6BAE, + 0x9A9B: 0x6BAF, + 0x9A9C: 0x6BB0, + 0x9A9D: 0x6BB1, + 0x9A9E: 0x6BB2, + 0x9A9F: 0x6BB6, + 0x9AA0: 0x6BB8, + 0x9AA1: 0x6BB9, + 0x9AA2: 0x6BBA, + 0x9AA3: 0x6BBB, + 0x9AA4: 0x6BBC, + 0x9AA5: 0x6BBD, + 0x9AA6: 0x6BBE, + 0x9AA7: 0x6BC0, + 0x9AA8: 0x6BC3, + 0x9AA9: 0x6BC4, + 0x9AAA: 0x6BC6, + 0x9AAB: 0x6BC7, + 0x9AAC: 0x6BC8, + 0x9AAD: 0x6BC9, + 0x9AAE: 0x6BCA, + 0x9AAF: 0x6BCC, + 0x9AB0: 0x6BCE, + 0x9AB1: 0x6BD0, + 0x9AB2: 0x6BD1, + 0x9AB3: 0x6BD8, + 0x9AB4: 0x6BDA, + 0x9AB5: 0x6BDC, + 0x9AB6: 0x6BDD, + 0x9AB7: 0x6BDE, + 0x9AB8: 0x6BDF, + 0x9AB9: 0x6BE0, + 0x9ABA: 0x6BE2, + 0x9ABB: 0x6BE3, + 0x9ABC: 0x6BE4, + 0x9ABD: 0x6BE5, + 0x9ABE: 0x6BE6, + 0x9ABF: 0x6BE7, + 0x9AC0: 0x6BE8, + 0x9AC1: 0x6BE9, + 0x9AC2: 0x6BEC, + 0x9AC3: 0x6BED, + 0x9AC4: 0x6BEE, + 0x9AC5: 0x6BF0, + 0x9AC6: 0x6BF1, + 0x9AC7: 0x6BF2, + 0x9AC8: 0x6BF4, + 0x9AC9: 0x6BF6, + 0x9ACA: 0x6BF7, + 0x9ACB: 0x6BF8, + 0x9ACC: 0x6BFA, + 0x9ACD: 0x6BFB, + 0x9ACE: 0x6BFC, + 0x9ACF: 0x6BFE, + 0x9AD0: 0x6BFF, + 0x9AD1: 0x6C00, + 0x9AD2: 0x6C01, + 0x9AD3: 0x6C02, + 0x9AD4: 0x6C03, + 0x9AD5: 0x6C04, + 0x9AD6: 0x6C08, + 0x9AD7: 0x6C09, + 0x9AD8: 0x6C0A, + 0x9AD9: 0x6C0B, + 0x9ADA: 0x6C0C, + 0x9ADB: 0x6C0E, + 0x9ADC: 0x6C12, + 0x9ADD: 0x6C17, + 0x9ADE: 0x6C1C, + 0x9ADF: 0x6C1D, + 0x9AE0: 0x6C1E, + 0x9AE1: 0x6C20, + 0x9AE2: 0x6C23, + 0x9AE3: 0x6C25, + 0x9AE4: 0x6C2B, + 0x9AE5: 0x6C2C, + 0x9AE6: 0x6C2D, + 0x9AE7: 0x6C31, + 0x9AE8: 0x6C33, + 0x9AE9: 0x6C36, + 0x9AEA: 0x6C37, + 0x9AEB: 0x6C39, + 0x9AEC: 0x6C3A, + 0x9AED: 0x6C3B, + 0x9AEE: 0x6C3C, + 0x9AEF: 0x6C3E, + 0x9AF0: 0x6C3F, + 0x9AF1: 0x6C43, + 0x9AF2: 0x6C44, + 0x9AF3: 0x6C45, + 0x9AF4: 0x6C48, + 0x9AF5: 0x6C4B, + 0x9AF6: 0x6C4C, + 0x9AF7: 0x6C4D, + 0x9AF8: 0x6C4E, + 0x9AF9: 0x6C4F, + 0x9AFA: 0x6C51, + 0x9AFB: 0x6C52, + 0x9AFC: 0x6C53, + 0x9AFD: 0x6C56, + 0x9AFE: 0x6C58, + 0x9B40: 0x6C59, + 0x9B41: 0x6C5A, + 0x9B42: 0x6C62, + 0x9B43: 0x6C63, + 0x9B44: 0x6C65, + 0x9B45: 0x6C66, + 0x9B46: 0x6C67, + 0x9B47: 0x6C6B, + 0x9B48: 0x6C6C, + 0x9B49: 0x6C6D, + 0x9B4A: 0x6C6E, + 0x9B4B: 0x6C6F, + 0x9B4C: 0x6C71, + 0x9B4D: 0x6C73, + 0x9B4E: 0x6C75, + 0x9B4F: 0x6C77, + 0x9B50: 0x6C78, + 0x9B51: 0x6C7A, + 0x9B52: 0x6C7B, + 0x9B53: 0x6C7C, + 0x9B54: 0x6C7F, + 0x9B55: 0x6C80, + 0x9B56: 0x6C84, + 0x9B57: 0x6C87, + 0x9B58: 0x6C8A, + 0x9B59: 0x6C8B, + 0x9B5A: 0x6C8D, + 0x9B5B: 0x6C8E, + 0x9B5C: 0x6C91, + 0x9B5D: 0x6C92, + 0x9B5E: 0x6C95, + 0x9B5F: 0x6C96, + 0x9B60: 0x6C97, + 0x9B61: 0x6C98, + 0x9B62: 0x6C9A, + 0x9B63: 0x6C9C, + 0x9B64: 0x6C9D, + 0x9B65: 0x6C9E, + 0x9B66: 0x6CA0, + 0x9B67: 0x6CA2, + 0x9B68: 0x6CA8, + 0x9B69: 0x6CAC, + 0x9B6A: 0x6CAF, + 0x9B6B: 0x6CB0, + 0x9B6C: 0x6CB4, + 0x9B6D: 0x6CB5, + 0x9B6E: 0x6CB6, + 0x9B6F: 0x6CB7, + 0x9B70: 0x6CBA, + 0x9B71: 0x6CC0, + 0x9B72: 0x6CC1, + 0x9B73: 0x6CC2, + 0x9B74: 0x6CC3, + 0x9B75: 0x6CC6, + 0x9B76: 0x6CC7, + 0x9B77: 0x6CC8, + 0x9B78: 0x6CCB, + 0x9B79: 0x6CCD, + 0x9B7A: 0x6CCE, + 0x9B7B: 0x6CCF, + 0x9B7C: 0x6CD1, + 0x9B7D: 0x6CD2, + 0x9B7E: 0x6CD8, + 0x9B80: 0x6CD9, + 0x9B81: 0x6CDA, + 0x9B82: 0x6CDC, + 0x9B83: 0x6CDD, + 0x9B84: 0x6CDF, + 0x9B85: 0x6CE4, + 0x9B86: 0x6CE6, + 0x9B87: 0x6CE7, + 0x9B88: 0x6CE9, + 0x9B89: 0x6CEC, + 0x9B8A: 0x6CED, + 0x9B8B: 0x6CF2, + 0x9B8C: 0x6CF4, + 0x9B8D: 0x6CF9, + 0x9B8E: 0x6CFF, + 0x9B8F: 0x6D00, + 0x9B90: 0x6D02, + 0x9B91: 0x6D03, + 0x9B92: 0x6D05, + 0x9B93: 0x6D06, + 0x9B94: 0x6D08, + 0x9B95: 0x6D09, + 0x9B96: 0x6D0A, + 0x9B97: 0x6D0D, + 0x9B98: 0x6D0F, + 0x9B99: 0x6D10, + 0x9B9A: 0x6D11, + 0x9B9B: 0x6D13, + 0x9B9C: 0x6D14, + 0x9B9D: 0x6D15, + 0x9B9E: 0x6D16, + 0x9B9F: 0x6D18, + 0x9BA0: 0x6D1C, + 0x9BA1: 0x6D1D, + 0x9BA2: 0x6D1F, + 0x9BA3: 0x6D20, + 0x9BA4: 0x6D21, + 0x9BA5: 0x6D22, + 0x9BA6: 0x6D23, + 0x9BA7: 0x6D24, + 0x9BA8: 0x6D26, + 0x9BA9: 0x6D28, + 0x9BAA: 0x6D29, + 0x9BAB: 0x6D2C, + 0x9BAC: 0x6D2D, + 0x9BAD: 0x6D2F, + 0x9BAE: 0x6D30, + 0x9BAF: 0x6D34, + 0x9BB0: 0x6D36, + 0x9BB1: 0x6D37, + 0x9BB2: 0x6D38, + 0x9BB3: 0x6D3A, + 0x9BB4: 0x6D3F, + 0x9BB5: 0x6D40, + 0x9BB6: 0x6D42, + 0x9BB7: 0x6D44, + 0x9BB8: 0x6D49, + 0x9BB9: 0x6D4C, + 0x9BBA: 0x6D50, + 0x9BBB: 0x6D55, + 0x9BBC: 0x6D56, + 0x9BBD: 0x6D57, + 0x9BBE: 0x6D58, + 0x9BBF: 0x6D5B, + 0x9BC0: 0x6D5D, + 0x9BC1: 0x6D5F, + 0x9BC2: 0x6D61, + 0x9BC3: 0x6D62, + 0x9BC4: 0x6D64, + 0x9BC5: 0x6D65, + 0x9BC6: 0x6D67, + 0x9BC7: 0x6D68, + 0x9BC8: 0x6D6B, + 0x9BC9: 0x6D6C, + 0x9BCA: 0x6D6D, + 0x9BCB: 0x6D70, + 0x9BCC: 0x6D71, + 0x9BCD: 0x6D72, + 0x9BCE: 0x6D73, + 0x9BCF: 0x6D75, + 0x9BD0: 0x6D76, + 0x9BD1: 0x6D79, + 0x9BD2: 0x6D7A, + 0x9BD3: 0x6D7B, + 0x9BD4: 0x6D7D, + 0x9BD5: 0x6D7E, + 0x9BD6: 0x6D7F, + 0x9BD7: 0x6D80, + 0x9BD8: 0x6D81, + 0x9BD9: 0x6D83, + 0x9BDA: 0x6D84, + 0x9BDB: 0x6D86, + 0x9BDC: 0x6D87, + 0x9BDD: 0x6D8A, + 0x9BDE: 0x6D8B, + 0x9BDF: 0x6D8D, + 0x9BE0: 0x6D8F, + 0x9BE1: 0x6D90, + 0x9BE2: 0x6D92, + 0x9BE3: 0x6D96, + 0x9BE4: 0x6D97, + 0x9BE5: 0x6D98, + 0x9BE6: 0x6D99, + 0x9BE7: 0x6D9A, + 0x9BE8: 0x6D9C, + 0x9BE9: 0x6DA2, + 0x9BEA: 0x6DA5, + 0x9BEB: 0x6DAC, + 0x9BEC: 0x6DAD, + 0x9BED: 0x6DB0, + 0x9BEE: 0x6DB1, + 0x9BEF: 0x6DB3, + 0x9BF0: 0x6DB4, + 0x9BF1: 0x6DB6, + 0x9BF2: 0x6DB7, + 0x9BF3: 0x6DB9, + 0x9BF4: 0x6DBA, + 0x9BF5: 0x6DBB, + 0x9BF6: 0x6DBC, + 0x9BF7: 0x6DBD, + 0x9BF8: 0x6DBE, + 0x9BF9: 0x6DC1, + 0x9BFA: 0x6DC2, + 0x9BFB: 0x6DC3, + 0x9BFC: 0x6DC8, + 0x9BFD: 0x6DC9, + 0x9BFE: 0x6DCA, + 0x9C40: 0x6DCD, + 0x9C41: 0x6DCE, + 0x9C42: 0x6DCF, + 0x9C43: 0x6DD0, + 0x9C44: 0x6DD2, + 0x9C45: 0x6DD3, + 0x9C46: 0x6DD4, + 0x9C47: 0x6DD5, + 0x9C48: 0x6DD7, + 0x9C49: 0x6DDA, + 0x9C4A: 0x6DDB, + 0x9C4B: 0x6DDC, + 0x9C4C: 0x6DDF, + 0x9C4D: 0x6DE2, + 0x9C4E: 0x6DE3, + 0x9C4F: 0x6DE5, + 0x9C50: 0x6DE7, + 0x9C51: 0x6DE8, + 0x9C52: 0x6DE9, + 0x9C53: 0x6DEA, + 0x9C54: 0x6DED, + 0x9C55: 0x6DEF, + 0x9C56: 0x6DF0, + 0x9C57: 0x6DF2, + 0x9C58: 0x6DF4, + 0x9C59: 0x6DF5, + 0x9C5A: 0x6DF6, + 0x9C5B: 0x6DF8, + 0x9C5C: 0x6DFA, + 0x9C5D: 0x6DFD, + 0x9C5E: 0x6DFE, + 0x9C5F: 0x6DFF, + 0x9C60: 0x6E00, + 0x9C61: 0x6E01, + 0x9C62: 0x6E02, + 0x9C63: 0x6E03, + 0x9C64: 0x6E04, + 0x9C65: 0x6E06, + 0x9C66: 0x6E07, + 0x9C67: 0x6E08, + 0x9C68: 0x6E09, + 0x9C69: 0x6E0B, + 0x9C6A: 0x6E0F, + 0x9C6B: 0x6E12, + 0x9C6C: 0x6E13, + 0x9C6D: 0x6E15, + 0x9C6E: 0x6E18, + 0x9C6F: 0x6E19, + 0x9C70: 0x6E1B, + 0x9C71: 0x6E1C, + 0x9C72: 0x6E1E, + 0x9C73: 0x6E1F, + 0x9C74: 0x6E22, + 0x9C75: 0x6E26, + 0x9C76: 0x6E27, + 0x9C77: 0x6E28, + 0x9C78: 0x6E2A, + 0x9C79: 0x6E2C, + 0x9C7A: 0x6E2E, + 0x9C7B: 0x6E30, + 0x9C7C: 0x6E31, + 0x9C7D: 0x6E33, + 0x9C7E: 0x6E35, + 0x9C80: 0x6E36, + 0x9C81: 0x6E37, + 0x9C82: 0x6E39, + 0x9C83: 0x6E3B, + 0x9C84: 0x6E3C, + 0x9C85: 0x6E3D, + 0x9C86: 0x6E3E, + 0x9C87: 0x6E3F, + 0x9C88: 0x6E40, + 0x9C89: 0x6E41, + 0x9C8A: 0x6E42, + 0x9C8B: 0x6E45, + 0x9C8C: 0x6E46, + 0x9C8D: 0x6E47, + 0x9C8E: 0x6E48, + 0x9C8F: 0x6E49, + 0x9C90: 0x6E4A, + 0x9C91: 0x6E4B, + 0x9C92: 0x6E4C, + 0x9C93: 0x6E4F, + 0x9C94: 0x6E50, + 0x9C95: 0x6E51, + 0x9C96: 0x6E52, + 0x9C97: 0x6E55, + 0x9C98: 0x6E57, + 0x9C99: 0x6E59, + 0x9C9A: 0x6E5A, + 0x9C9B: 0x6E5C, + 0x9C9C: 0x6E5D, + 0x9C9D: 0x6E5E, + 0x9C9E: 0x6E60, + 0x9C9F: 0x6E61, + 0x9CA0: 0x6E62, + 0x9CA1: 0x6E63, + 0x9CA2: 0x6E64, + 0x9CA3: 0x6E65, + 0x9CA4: 0x6E66, + 0x9CA5: 0x6E67, + 0x9CA6: 0x6E68, + 0x9CA7: 0x6E69, + 0x9CA8: 0x6E6A, + 0x9CA9: 0x6E6C, + 0x9CAA: 0x6E6D, + 0x9CAB: 0x6E6F, + 0x9CAC: 0x6E70, + 0x9CAD: 0x6E71, + 0x9CAE: 0x6E72, + 0x9CAF: 0x6E73, + 0x9CB0: 0x6E74, + 0x9CB1: 0x6E75, + 0x9CB2: 0x6E76, + 0x9CB3: 0x6E77, + 0x9CB4: 0x6E78, + 0x9CB5: 0x6E79, + 0x9CB6: 0x6E7A, + 0x9CB7: 0x6E7B, + 0x9CB8: 0x6E7C, + 0x9CB9: 0x6E7D, + 0x9CBA: 0x6E80, + 0x9CBB: 0x6E81, + 0x9CBC: 0x6E82, + 0x9CBD: 0x6E84, + 0x9CBE: 0x6E87, + 0x9CBF: 0x6E88, + 0x9CC0: 0x6E8A, + 0x9CC1: 0x6E8B, + 0x9CC2: 0x6E8C, + 0x9CC3: 0x6E8D, + 0x9CC4: 0x6E8E, + 0x9CC5: 0x6E91, + 0x9CC6: 0x6E92, + 0x9CC7: 0x6E93, + 0x9CC8: 0x6E94, + 0x9CC9: 0x6E95, + 0x9CCA: 0x6E96, + 0x9CCB: 0x6E97, + 0x9CCC: 0x6E99, + 0x9CCD: 0x6E9A, + 0x9CCE: 0x6E9B, + 0x9CCF: 0x6E9D, + 0x9CD0: 0x6E9E, + 0x9CD1: 0x6EA0, + 0x9CD2: 0x6EA1, + 0x9CD3: 0x6EA3, + 0x9CD4: 0x6EA4, + 0x9CD5: 0x6EA6, + 0x9CD6: 0x6EA8, + 0x9CD7: 0x6EA9, + 0x9CD8: 0x6EAB, + 0x9CD9: 0x6EAC, + 0x9CDA: 0x6EAD, + 0x9CDB: 0x6EAE, + 0x9CDC: 0x6EB0, + 0x9CDD: 0x6EB3, + 0x9CDE: 0x6EB5, + 0x9CDF: 0x6EB8, + 0x9CE0: 0x6EB9, + 0x9CE1: 0x6EBC, + 0x9CE2: 0x6EBE, + 0x9CE3: 0x6EBF, + 0x9CE4: 0x6EC0, + 0x9CE5: 0x6EC3, + 0x9CE6: 0x6EC4, + 0x9CE7: 0x6EC5, + 0x9CE8: 0x6EC6, + 0x9CE9: 0x6EC8, + 0x9CEA: 0x6EC9, + 0x9CEB: 0x6ECA, + 0x9CEC: 0x6ECC, + 0x9CED: 0x6ECD, + 0x9CEE: 0x6ECE, + 0x9CEF: 0x6ED0, + 0x9CF0: 0x6ED2, + 0x9CF1: 0x6ED6, + 0x9CF2: 0x6ED8, + 0x9CF3: 0x6ED9, + 0x9CF4: 0x6EDB, + 0x9CF5: 0x6EDC, + 0x9CF6: 0x6EDD, + 0x9CF7: 0x6EE3, + 0x9CF8: 0x6EE7, + 0x9CF9: 0x6EEA, + 0x9CFA: 0x6EEB, + 0x9CFB: 0x6EEC, + 0x9CFC: 0x6EED, + 0x9CFD: 0x6EEE, + 0x9CFE: 0x6EEF, + 0x9D40: 0x6EF0, + 0x9D41: 0x6EF1, + 0x9D42: 0x6EF2, + 0x9D43: 0x6EF3, + 0x9D44: 0x6EF5, + 0x9D45: 0x6EF6, + 0x9D46: 0x6EF7, + 0x9D47: 0x6EF8, + 0x9D48: 0x6EFA, + 0x9D49: 0x6EFB, + 0x9D4A: 0x6EFC, + 0x9D4B: 0x6EFD, + 0x9D4C: 0x6EFE, + 0x9D4D: 0x6EFF, + 0x9D4E: 0x6F00, + 0x9D4F: 0x6F01, + 0x9D50: 0x6F03, + 0x9D51: 0x6F04, + 0x9D52: 0x6F05, + 0x9D53: 0x6F07, + 0x9D54: 0x6F08, + 0x9D55: 0x6F0A, + 0x9D56: 0x6F0B, + 0x9D57: 0x6F0C, + 0x9D58: 0x6F0D, + 0x9D59: 0x6F0E, + 0x9D5A: 0x6F10, + 0x9D5B: 0x6F11, + 0x9D5C: 0x6F12, + 0x9D5D: 0x6F16, + 0x9D5E: 0x6F17, + 0x9D5F: 0x6F18, + 0x9D60: 0x6F19, + 0x9D61: 0x6F1A, + 0x9D62: 0x6F1B, + 0x9D63: 0x6F1C, + 0x9D64: 0x6F1D, + 0x9D65: 0x6F1E, + 0x9D66: 0x6F1F, + 0x9D67: 0x6F21, + 0x9D68: 0x6F22, + 0x9D69: 0x6F23, + 0x9D6A: 0x6F25, + 0x9D6B: 0x6F26, + 0x9D6C: 0x6F27, + 0x9D6D: 0x6F28, + 0x9D6E: 0x6F2C, + 0x9D6F: 0x6F2E, + 0x9D70: 0x6F30, + 0x9D71: 0x6F32, + 0x9D72: 0x6F34, + 0x9D73: 0x6F35, + 0x9D74: 0x6F37, + 0x9D75: 0x6F38, + 0x9D76: 0x6F39, + 0x9D77: 0x6F3A, + 0x9D78: 0x6F3B, + 0x9D79: 0x6F3C, + 0x9D7A: 0x6F3D, + 0x9D7B: 0x6F3F, + 0x9D7C: 0x6F40, + 0x9D7D: 0x6F41, + 0x9D7E: 0x6F42, + 0x9D80: 0x6F43, + 0x9D81: 0x6F44, + 0x9D82: 0x6F45, + 0x9D83: 0x6F48, + 0x9D84: 0x6F49, + 0x9D85: 0x6F4A, + 0x9D86: 0x6F4C, + 0x9D87: 0x6F4E, + 0x9D88: 0x6F4F, + 0x9D89: 0x6F50, + 0x9D8A: 0x6F51, + 0x9D8B: 0x6F52, + 0x9D8C: 0x6F53, + 0x9D8D: 0x6F54, + 0x9D8E: 0x6F55, + 0x9D8F: 0x6F56, + 0x9D90: 0x6F57, + 0x9D91: 0x6F59, + 0x9D92: 0x6F5A, + 0x9D93: 0x6F5B, + 0x9D94: 0x6F5D, + 0x9D95: 0x6F5F, + 0x9D96: 0x6F60, + 0x9D97: 0x6F61, + 0x9D98: 0x6F63, + 0x9D99: 0x6F64, + 0x9D9A: 0x6F65, + 0x9D9B: 0x6F67, + 0x9D9C: 0x6F68, + 0x9D9D: 0x6F69, + 0x9D9E: 0x6F6A, + 0x9D9F: 0x6F6B, + 0x9DA0: 0x6F6C, + 0x9DA1: 0x6F6F, + 0x9DA2: 0x6F70, + 0x9DA3: 0x6F71, + 0x9DA4: 0x6F73, + 0x9DA5: 0x6F75, + 0x9DA6: 0x6F76, + 0x9DA7: 0x6F77, + 0x9DA8: 0x6F79, + 0x9DA9: 0x6F7B, + 0x9DAA: 0x6F7D, + 0x9DAB: 0x6F7E, + 0x9DAC: 0x6F7F, + 0x9DAD: 0x6F80, + 0x9DAE: 0x6F81, + 0x9DAF: 0x6F82, + 0x9DB0: 0x6F83, + 0x9DB1: 0x6F85, + 0x9DB2: 0x6F86, + 0x9DB3: 0x6F87, + 0x9DB4: 0x6F8A, + 0x9DB5: 0x6F8B, + 0x9DB6: 0x6F8F, + 0x9DB7: 0x6F90, + 0x9DB8: 0x6F91, + 0x9DB9: 0x6F92, + 0x9DBA: 0x6F93, + 0x9DBB: 0x6F94, + 0x9DBC: 0x6F95, + 0x9DBD: 0x6F96, + 0x9DBE: 0x6F97, + 0x9DBF: 0x6F98, + 0x9DC0: 0x6F99, + 0x9DC1: 0x6F9A, + 0x9DC2: 0x6F9B, + 0x9DC3: 0x6F9D, + 0x9DC4: 0x6F9E, + 0x9DC5: 0x6F9F, + 0x9DC6: 0x6FA0, + 0x9DC7: 0x6FA2, + 0x9DC8: 0x6FA3, + 0x9DC9: 0x6FA4, + 0x9DCA: 0x6FA5, + 0x9DCB: 0x6FA6, + 0x9DCC: 0x6FA8, + 0x9DCD: 0x6FA9, + 0x9DCE: 0x6FAA, + 0x9DCF: 0x6FAB, + 0x9DD0: 0x6FAC, + 0x9DD1: 0x6FAD, + 0x9DD2: 0x6FAE, + 0x9DD3: 0x6FAF, + 0x9DD4: 0x6FB0, + 0x9DD5: 0x6FB1, + 0x9DD6: 0x6FB2, + 0x9DD7: 0x6FB4, + 0x9DD8: 0x6FB5, + 0x9DD9: 0x6FB7, + 0x9DDA: 0x6FB8, + 0x9DDB: 0x6FBA, + 0x9DDC: 0x6FBB, + 0x9DDD: 0x6FBC, + 0x9DDE: 0x6FBD, + 0x9DDF: 0x6FBE, + 0x9DE0: 0x6FBF, + 0x9DE1: 0x6FC1, + 0x9DE2: 0x6FC3, + 0x9DE3: 0x6FC4, + 0x9DE4: 0x6FC5, + 0x9DE5: 0x6FC6, + 0x9DE6: 0x6FC7, + 0x9DE7: 0x6FC8, + 0x9DE8: 0x6FCA, + 0x9DE9: 0x6FCB, + 0x9DEA: 0x6FCC, + 0x9DEB: 0x6FCD, + 0x9DEC: 0x6FCE, + 0x9DED: 0x6FCF, + 0x9DEE: 0x6FD0, + 0x9DEF: 0x6FD3, + 0x9DF0: 0x6FD4, + 0x9DF1: 0x6FD5, + 0x9DF2: 0x6FD6, + 0x9DF3: 0x6FD7, + 0x9DF4: 0x6FD8, + 0x9DF5: 0x6FD9, + 0x9DF6: 0x6FDA, + 0x9DF7: 0x6FDB, + 0x9DF8: 0x6FDC, + 0x9DF9: 0x6FDD, + 0x9DFA: 0x6FDF, + 0x9DFB: 0x6FE2, + 0x9DFC: 0x6FE3, + 0x9DFD: 0x6FE4, + 0x9DFE: 0x6FE5, + 0x9E40: 0x6FE6, + 0x9E41: 0x6FE7, + 0x9E42: 0x6FE8, + 0x9E43: 0x6FE9, + 0x9E44: 0x6FEA, + 0x9E45: 0x6FEB, + 0x9E46: 0x6FEC, + 0x9E47: 0x6FED, + 0x9E48: 0x6FF0, + 0x9E49: 0x6FF1, + 0x9E4A: 0x6FF2, + 0x9E4B: 0x6FF3, + 0x9E4C: 0x6FF4, + 0x9E4D: 0x6FF5, + 0x9E4E: 0x6FF6, + 0x9E4F: 0x6FF7, + 0x9E50: 0x6FF8, + 0x9E51: 0x6FF9, + 0x9E52: 0x6FFA, + 0x9E53: 0x6FFB, + 0x9E54: 0x6FFC, + 0x9E55: 0x6FFD, + 0x9E56: 0x6FFE, + 0x9E57: 0x6FFF, + 0x9E58: 0x7000, + 0x9E59: 0x7001, + 0x9E5A: 0x7002, + 0x9E5B: 0x7003, + 0x9E5C: 0x7004, + 0x9E5D: 0x7005, + 0x9E5E: 0x7006, + 0x9E5F: 0x7007, + 0x9E60: 0x7008, + 0x9E61: 0x7009, + 0x9E62: 0x700A, + 0x9E63: 0x700B, + 0x9E64: 0x700C, + 0x9E65: 0x700D, + 0x9E66: 0x700E, + 0x9E67: 0x700F, + 0x9E68: 0x7010, + 0x9E69: 0x7012, + 0x9E6A: 0x7013, + 0x9E6B: 0x7014, + 0x9E6C: 0x7015, + 0x9E6D: 0x7016, + 0x9E6E: 0x7017, + 0x9E6F: 0x7018, + 0x9E70: 0x7019, + 0x9E71: 0x701C, + 0x9E72: 0x701D, + 0x9E73: 0x701E, + 0x9E74: 0x701F, + 0x9E75: 0x7020, + 0x9E76: 0x7021, + 0x9E77: 0x7022, + 0x9E78: 0x7024, + 0x9E79: 0x7025, + 0x9E7A: 0x7026, + 0x9E7B: 0x7027, + 0x9E7C: 0x7028, + 0x9E7D: 0x7029, + 0x9E7E: 0x702A, + 0x9E80: 0x702B, + 0x9E81: 0x702C, + 0x9E82: 0x702D, + 0x9E83: 0x702E, + 0x9E84: 0x702F, + 0x9E85: 0x7030, + 0x9E86: 0x7031, + 0x9E87: 0x7032, + 0x9E88: 0x7033, + 0x9E89: 0x7034, + 0x9E8A: 0x7036, + 0x9E8B: 0x7037, + 0x9E8C: 0x7038, + 0x9E8D: 0x703A, + 0x9E8E: 0x703B, + 0x9E8F: 0x703C, + 0x9E90: 0x703D, + 0x9E91: 0x703E, + 0x9E92: 0x703F, + 0x9E93: 0x7040, + 0x9E94: 0x7041, + 0x9E95: 0x7042, + 0x9E96: 0x7043, + 0x9E97: 0x7044, + 0x9E98: 0x7045, + 0x9E99: 0x7046, + 0x9E9A: 0x7047, + 0x9E9B: 0x7048, + 0x9E9C: 0x7049, + 0x9E9D: 0x704A, + 0x9E9E: 0x704B, + 0x9E9F: 0x704D, + 0x9EA0: 0x704E, + 0x9EA1: 0x7050, + 0x9EA2: 0x7051, + 0x9EA3: 0x7052, + 0x9EA4: 0x7053, + 0x9EA5: 0x7054, + 0x9EA6: 0x7055, + 0x9EA7: 0x7056, + 0x9EA8: 0x7057, + 0x9EA9: 0x7058, + 0x9EAA: 0x7059, + 0x9EAB: 0x705A, + 0x9EAC: 0x705B, + 0x9EAD: 0x705C, + 0x9EAE: 0x705D, + 0x9EAF: 0x705F, + 0x9EB0: 0x7060, + 0x9EB1: 0x7061, + 0x9EB2: 0x7062, + 0x9EB3: 0x7063, + 0x9EB4: 0x7064, + 0x9EB5: 0x7065, + 0x9EB6: 0x7066, + 0x9EB7: 0x7067, + 0x9EB8: 0x7068, + 0x9EB9: 0x7069, + 0x9EBA: 0x706A, + 0x9EBB: 0x706E, + 0x9EBC: 0x7071, + 0x9EBD: 0x7072, + 0x9EBE: 0x7073, + 0x9EBF: 0x7074, + 0x9EC0: 0x7077, + 0x9EC1: 0x7079, + 0x9EC2: 0x707A, + 0x9EC3: 0x707B, + 0x9EC4: 0x707D, + 0x9EC5: 0x7081, + 0x9EC6: 0x7082, + 0x9EC7: 0x7083, + 0x9EC8: 0x7084, + 0x9EC9: 0x7086, + 0x9ECA: 0x7087, + 0x9ECB: 0x7088, + 0x9ECC: 0x708B, + 0x9ECD: 0x708C, + 0x9ECE: 0x708D, + 0x9ECF: 0x708F, + 0x9ED0: 0x7090, + 0x9ED1: 0x7091, + 0x9ED2: 0x7093, + 0x9ED3: 0x7097, + 0x9ED4: 0x7098, + 0x9ED5: 0x709A, + 0x9ED6: 0x709B, + 0x9ED7: 0x709E, + 0x9ED8: 0x709F, + 0x9ED9: 0x70A0, + 0x9EDA: 0x70A1, + 0x9EDB: 0x70A2, + 0x9EDC: 0x70A3, + 0x9EDD: 0x70A4, + 0x9EDE: 0x70A5, + 0x9EDF: 0x70A6, + 0x9EE0: 0x70A7, + 0x9EE1: 0x70A8, + 0x9EE2: 0x70A9, + 0x9EE3: 0x70AA, + 0x9EE4: 0x70B0, + 0x9EE5: 0x70B2, + 0x9EE6: 0x70B4, + 0x9EE7: 0x70B5, + 0x9EE8: 0x70B6, + 0x9EE9: 0x70BA, + 0x9EEA: 0x70BE, + 0x9EEB: 0x70BF, + 0x9EEC: 0x70C4, + 0x9EED: 0x70C5, + 0x9EEE: 0x70C6, + 0x9EEF: 0x70C7, + 0x9EF0: 0x70C9, + 0x9EF1: 0x70CB, + 0x9EF2: 0x70CC, + 0x9EF3: 0x70CD, + 0x9EF4: 0x70CE, + 0x9EF5: 0x70CF, + 0x9EF6: 0x70D0, + 0x9EF7: 0x70D1, + 0x9EF8: 0x70D2, + 0x9EF9: 0x70D3, + 0x9EFA: 0x70D4, + 0x9EFB: 0x70D5, + 0x9EFC: 0x70D6, + 0x9EFD: 0x70D7, + 0x9EFE: 0x70DA, + 0x9F40: 0x70DC, + 0x9F41: 0x70DD, + 0x9F42: 0x70DE, + 0x9F43: 0x70E0, + 0x9F44: 0x70E1, + 0x9F45: 0x70E2, + 0x9F46: 0x70E3, + 0x9F47: 0x70E5, + 0x9F48: 0x70EA, + 0x9F49: 0x70EE, + 0x9F4A: 0x70F0, + 0x9F4B: 0x70F1, + 0x9F4C: 0x70F2, + 0x9F4D: 0x70F3, + 0x9F4E: 0x70F4, + 0x9F4F: 0x70F5, + 0x9F50: 0x70F6, + 0x9F51: 0x70F8, + 0x9F52: 0x70FA, + 0x9F53: 0x70FB, + 0x9F54: 0x70FC, + 0x9F55: 0x70FE, + 0x9F56: 0x70FF, + 0x9F57: 0x7100, + 0x9F58: 0x7101, + 0x9F59: 0x7102, + 0x9F5A: 0x7103, + 0x9F5B: 0x7104, + 0x9F5C: 0x7105, + 0x9F5D: 0x7106, + 0x9F5E: 0x7107, + 0x9F5F: 0x7108, + 0x9F60: 0x710B, + 0x9F61: 0x710C, + 0x9F62: 0x710D, + 0x9F63: 0x710E, + 0x9F64: 0x710F, + 0x9F65: 0x7111, + 0x9F66: 0x7112, + 0x9F67: 0x7114, + 0x9F68: 0x7117, + 0x9F69: 0x711B, + 0x9F6A: 0x711C, + 0x9F6B: 0x711D, + 0x9F6C: 0x711E, + 0x9F6D: 0x711F, + 0x9F6E: 0x7120, + 0x9F6F: 0x7121, + 0x9F70: 0x7122, + 0x9F71: 0x7123, + 0x9F72: 0x7124, + 0x9F73: 0x7125, + 0x9F74: 0x7127, + 0x9F75: 0x7128, + 0x9F76: 0x7129, + 0x9F77: 0x712A, + 0x9F78: 0x712B, + 0x9F79: 0x712C, + 0x9F7A: 0x712D, + 0x9F7B: 0x712E, + 0x9F7C: 0x7132, + 0x9F7D: 0x7133, + 0x9F7E: 0x7134, + 0x9F80: 0x7135, + 0x9F81: 0x7137, + 0x9F82: 0x7138, + 0x9F83: 0x7139, + 0x9F84: 0x713A, + 0x9F85: 0x713B, + 0x9F86: 0x713C, + 0x9F87: 0x713D, + 0x9F88: 0x713E, + 0x9F89: 0x713F, + 0x9F8A: 0x7140, + 0x9F8B: 0x7141, + 0x9F8C: 0x7142, + 0x9F8D: 0x7143, + 0x9F8E: 0x7144, + 0x9F8F: 0x7146, + 0x9F90: 0x7147, + 0x9F91: 0x7148, + 0x9F92: 0x7149, + 0x9F93: 0x714B, + 0x9F94: 0x714D, + 0x9F95: 0x714F, + 0x9F96: 0x7150, + 0x9F97: 0x7151, + 0x9F98: 0x7152, + 0x9F99: 0x7153, + 0x9F9A: 0x7154, + 0x9F9B: 0x7155, + 0x9F9C: 0x7156, + 0x9F9D: 0x7157, + 0x9F9E: 0x7158, + 0x9F9F: 0x7159, + 0x9FA0: 0x715A, + 0x9FA1: 0x715B, + 0x9FA2: 0x715D, + 0x9FA3: 0x715F, + 0x9FA4: 0x7160, + 0x9FA5: 0x7161, + 0x9FA6: 0x7162, + 0x9FA7: 0x7163, + 0x9FA8: 0x7165, + 0x9FA9: 0x7169, + 0x9FAA: 0x716A, + 0x9FAB: 0x716B, + 0x9FAC: 0x716C, + 0x9FAD: 0x716D, + 0x9FAE: 0x716F, + 0x9FAF: 0x7170, + 0x9FB0: 0x7171, + 0x9FB1: 0x7174, + 0x9FB2: 0x7175, + 0x9FB3: 0x7176, + 0x9FB4: 0x7177, + 0x9FB5: 0x7179, + 0x9FB6: 0x717B, + 0x9FB7: 0x717C, + 0x9FB8: 0x717E, + 0x9FB9: 0x717F, + 0x9FBA: 0x7180, + 0x9FBB: 0x7181, + 0x9FBC: 0x7182, + 0x9FBD: 0x7183, + 0x9FBE: 0x7185, + 0x9FBF: 0x7186, + 0x9FC0: 0x7187, + 0x9FC1: 0x7188, + 0x9FC2: 0x7189, + 0x9FC3: 0x718B, + 0x9FC4: 0x718C, + 0x9FC5: 0x718D, + 0x9FC6: 0x718E, + 0x9FC7: 0x7190, + 0x9FC8: 0x7191, + 0x9FC9: 0x7192, + 0x9FCA: 0x7193, + 0x9FCB: 0x7195, + 0x9FCC: 0x7196, + 0x9FCD: 0x7197, + 0x9FCE: 0x719A, + 0x9FCF: 0x719B, + 0x9FD0: 0x719C, + 0x9FD1: 0x719D, + 0x9FD2: 0x719E, + 0x9FD3: 0x71A1, + 0x9FD4: 0x71A2, + 0x9FD5: 0x71A3, + 0x9FD6: 0x71A4, + 0x9FD7: 0x71A5, + 0x9FD8: 0x71A6, + 0x9FD9: 0x71A7, + 0x9FDA: 0x71A9, + 0x9FDB: 0x71AA, + 0x9FDC: 0x71AB, + 0x9FDD: 0x71AD, + 0x9FDE: 0x71AE, + 0x9FDF: 0x71AF, + 0x9FE0: 0x71B0, + 0x9FE1: 0x71B1, + 0x9FE2: 0x71B2, + 0x9FE3: 0x71B4, + 0x9FE4: 0x71B6, + 0x9FE5: 0x71B7, + 0x9FE6: 0x71B8, + 0x9FE7: 0x71BA, + 0x9FE8: 0x71BB, + 0x9FE9: 0x71BC, + 0x9FEA: 0x71BD, + 0x9FEB: 0x71BE, + 0x9FEC: 0x71BF, + 0x9FED: 0x71C0, + 0x9FEE: 0x71C1, + 0x9FEF: 0x71C2, + 0x9FF0: 0x71C4, + 0x9FF1: 0x71C5, + 0x9FF2: 0x71C6, + 0x9FF3: 0x71C7, + 0x9FF4: 0x71C8, + 0x9FF5: 0x71C9, + 0x9FF6: 0x71CA, + 0x9FF7: 0x71CB, + 0x9FF8: 0x71CC, + 0x9FF9: 0x71CD, + 0x9FFA: 0x71CF, + 0x9FFB: 0x71D0, + 0x9FFC: 0x71D1, + 0x9FFD: 0x71D2, + 0x9FFE: 0x71D3, + 0xA040: 0x71D6, + 0xA041: 0x71D7, + 0xA042: 0x71D8, + 0xA043: 0x71D9, + 0xA044: 0x71DA, + 0xA045: 0x71DB, + 0xA046: 0x71DC, + 0xA047: 0x71DD, + 0xA048: 0x71DE, + 0xA049: 0x71DF, + 0xA04A: 0x71E1, + 0xA04B: 0x71E2, + 0xA04C: 0x71E3, + 0xA04D: 0x71E4, + 0xA04E: 0x71E6, + 0xA04F: 0x71E8, + 0xA050: 0x71E9, + 0xA051: 0x71EA, + 0xA052: 0x71EB, + 0xA053: 0x71EC, + 0xA054: 0x71ED, + 0xA055: 0x71EF, + 0xA056: 0x71F0, + 0xA057: 0x71F1, + 0xA058: 0x71F2, + 0xA059: 0x71F3, + 0xA05A: 0x71F4, + 0xA05B: 0x71F5, + 0xA05C: 0x71F6, + 0xA05D: 0x71F7, + 0xA05E: 0x71F8, + 0xA05F: 0x71FA, + 0xA060: 0x71FB, + 0xA061: 0x71FC, + 0xA062: 0x71FD, + 0xA063: 0x71FE, + 0xA064: 0x71FF, + 0xA065: 0x7200, + 0xA066: 0x7201, + 0xA067: 0x7202, + 0xA068: 0x7203, + 0xA069: 0x7204, + 0xA06A: 0x7205, + 0xA06B: 0x7207, + 0xA06C: 0x7208, + 0xA06D: 0x7209, + 0xA06E: 0x720A, + 0xA06F: 0x720B, + 0xA070: 0x720C, + 0xA071: 0x720D, + 0xA072: 0x720E, + 0xA073: 0x720F, + 0xA074: 0x7210, + 0xA075: 0x7211, + 0xA076: 0x7212, + 0xA077: 0x7213, + 0xA078: 0x7214, + 0xA079: 0x7215, + 0xA07A: 0x7216, + 0xA07B: 0x7217, + 0xA07C: 0x7218, + 0xA07D: 0x7219, + 0xA07E: 0x721A, + 0xA080: 0x721B, + 0xA081: 0x721C, + 0xA082: 0x721E, + 0xA083: 0x721F, + 0xA084: 0x7220, + 0xA085: 0x7221, + 0xA086: 0x7222, + 0xA087: 0x7223, + 0xA088: 0x7224, + 0xA089: 0x7225, + 0xA08A: 0x7226, + 0xA08B: 0x7227, + 0xA08C: 0x7229, + 0xA08D: 0x722B, + 0xA08E: 0x722D, + 0xA08F: 0x722E, + 0xA090: 0x722F, + 0xA091: 0x7232, + 0xA092: 0x7233, + 0xA093: 0x7234, + 0xA094: 0x723A, + 0xA095: 0x723C, + 0xA096: 0x723E, + 0xA097: 0x7240, + 0xA098: 0x7241, + 0xA099: 0x7242, + 0xA09A: 0x7243, + 0xA09B: 0x7244, + 0xA09C: 0x7245, + 0xA09D: 0x7246, + 0xA09E: 0x7249, + 0xA09F: 0x724A, + 0xA0A0: 0x724B, + 0xA0A1: 0x724E, + 0xA0A2: 0x724F, + 0xA0A3: 0x7250, + 0xA0A4: 0x7251, + 0xA0A5: 0x7253, + 0xA0A6: 0x7254, + 0xA0A7: 0x7255, + 0xA0A8: 0x7257, + 0xA0A9: 0x7258, + 0xA0AA: 0x725A, + 0xA0AB: 0x725C, + 0xA0AC: 0x725E, + 0xA0AD: 0x7260, + 0xA0AE: 0x7263, + 0xA0AF: 0x7264, + 0xA0B0: 0x7265, + 0xA0B1: 0x7268, + 0xA0B2: 0x726A, + 0xA0B3: 0x726B, + 0xA0B4: 0x726C, + 0xA0B5: 0x726D, + 0xA0B6: 0x7270, + 0xA0B7: 0x7271, + 0xA0B8: 0x7273, + 0xA0B9: 0x7274, + 0xA0BA: 0x7276, + 0xA0BB: 0x7277, + 0xA0BC: 0x7278, + 0xA0BD: 0x727B, + 0xA0BE: 0x727C, + 0xA0BF: 0x727D, + 0xA0C0: 0x7282, + 0xA0C1: 0x7283, + 0xA0C2: 0x7285, + 0xA0C3: 0x7286, + 0xA0C4: 0x7287, + 0xA0C5: 0x7288, + 0xA0C6: 0x7289, + 0xA0C7: 0x728C, + 0xA0C8: 0x728E, + 0xA0C9: 0x7290, + 0xA0CA: 0x7291, + 0xA0CB: 0x7293, + 0xA0CC: 0x7294, + 0xA0CD: 0x7295, + 0xA0CE: 0x7296, + 0xA0CF: 0x7297, + 0xA0D0: 0x7298, + 0xA0D1: 0x7299, + 0xA0D2: 0x729A, + 0xA0D3: 0x729B, + 0xA0D4: 0x729C, + 0xA0D5: 0x729D, + 0xA0D6: 0x729E, + 0xA0D7: 0x72A0, + 0xA0D8: 0x72A1, + 0xA0D9: 0x72A2, + 0xA0DA: 0x72A3, + 0xA0DB: 0x72A4, + 0xA0DC: 0x72A5, + 0xA0DD: 0x72A6, + 0xA0DE: 0x72A7, + 0xA0DF: 0x72A8, + 0xA0E0: 0x72A9, + 0xA0E1: 0x72AA, + 0xA0E2: 0x72AB, + 0xA0E3: 0x72AE, + 0xA0E4: 0x72B1, + 0xA0E5: 0x72B2, + 0xA0E6: 0x72B3, + 0xA0E7: 0x72B5, + 0xA0E8: 0x72BA, + 0xA0E9: 0x72BB, + 0xA0EA: 0x72BC, + 0xA0EB: 0x72BD, + 0xA0EC: 0x72BE, + 0xA0ED: 0x72BF, + 0xA0EE: 0x72C0, + 0xA0EF: 0x72C5, + 0xA0F0: 0x72C6, + 0xA0F1: 0x72C7, + 0xA0F2: 0x72C9, + 0xA0F3: 0x72CA, + 0xA0F4: 0x72CB, + 0xA0F5: 0x72CC, + 0xA0F6: 0x72CF, + 0xA0F7: 0x72D1, + 0xA0F8: 0x72D3, + 0xA0F9: 0x72D4, + 0xA0FA: 0x72D5, + 0xA0FB: 0x72D6, + 0xA0FC: 0x72D8, + 0xA0FD: 0x72DA, + 0xA0FE: 0x72DB, + 0xA140: 0xE4C6, + 0xA141: 0xE4C7, + 0xA142: 0xE4C8, + 0xA143: 0xE4C9, + 0xA144: 0xE4CA, + 0xA145: 0xE4CB, + 0xA146: 0xE4CC, + 0xA147: 0xE4CD, + 0xA148: 0xE4CE, + 0xA149: 0xE4CF, + 0xA14A: 0xE4D0, + 0xA14B: 0xE4D1, + 0xA14C: 0xE4D2, + 0xA14D: 0xE4D3, + 0xA14E: 0xE4D4, + 0xA14F: 0xE4D5, + 0xA150: 0xE4D6, + 0xA151: 0xE4D7, + 0xA152: 0xE4D8, + 0xA153: 0xE4D9, + 0xA154: 0xE4DA, + 0xA155: 0xE4DB, + 0xA156: 0xE4DC, + 0xA157: 0xE4DD, + 0xA158: 0xE4DE, + 0xA159: 0xE4DF, + 0xA15A: 0xE4E0, + 0xA15B: 0xE4E1, + 0xA15C: 0xE4E2, + 0xA15D: 0xE4E3, + 0xA15E: 0xE4E4, + 0xA15F: 0xE4E5, + 0xA160: 0xE4E6, + 0xA161: 0xE4E7, + 0xA162: 0xE4E8, + 0xA163: 0xE4E9, + 0xA164: 0xE4EA, + 0xA165: 0xE4EB, + 0xA166: 0xE4EC, + 0xA167: 0xE4ED, + 0xA168: 0xE4EE, + 0xA169: 0xE4EF, + 0xA16A: 0xE4F0, + 0xA16B: 0xE4F1, + 0xA16C: 0xE4F2, + 0xA16D: 0xE4F3, + 0xA16E: 0xE4F4, + 0xA16F: 0xE4F5, + 0xA170: 0xE4F6, + 0xA171: 0xE4F7, + 0xA172: 0xE4F8, + 0xA173: 0xE4F9, + 0xA174: 0xE4FA, + 0xA175: 0xE4FB, + 0xA176: 0xE4FC, + 0xA177: 0xE4FD, + 0xA178: 0xE4FE, + 0xA179: 0xE4FF, + 0xA17A: 0xE500, + 0xA17B: 0xE501, + 0xA17C: 0xE502, + 0xA17D: 0xE503, + 0xA17E: 0xE504, + 0xA180: 0xE505, + 0xA181: 0xE506, + 0xA182: 0xE507, + 0xA183: 0xE508, + 0xA184: 0xE509, + 0xA185: 0xE50A, + 0xA186: 0xE50B, + 0xA187: 0xE50C, + 0xA188: 0xE50D, + 0xA189: 0xE50E, + 0xA18A: 0xE50F, + 0xA18B: 0xE510, + 0xA18C: 0xE511, + 0xA18D: 0xE512, + 0xA18E: 0xE513, + 0xA18F: 0xE514, + 0xA190: 0xE515, + 0xA191: 0xE516, + 0xA192: 0xE517, + 0xA193: 0xE518, + 0xA194: 0xE519, + 0xA195: 0xE51A, + 0xA196: 0xE51B, + 0xA197: 0xE51C, + 0xA198: 0xE51D, + 0xA199: 0xE51E, + 0xA19A: 0xE51F, + 0xA19B: 0xE520, + 0xA19C: 0xE521, + 0xA19D: 0xE522, + 0xA19E: 0xE523, + 0xA19F: 0xE524, + 0xA1A0: 0xE525, + 0xA1A1: 0x3000, + 0xA1A2: 0x3001, + 0xA1A3: 0x3002, + 0xA1A4: 0x00B7, + 0xA1A5: 0x02C9, + 0xA1A6: 0x02C7, + 0xA1A7: 0x00A8, + 0xA1A8: 0x3003, + 0xA1A9: 0x3005, + 0xA1AA: 0x2014, + 0xA1AB: 0xFF5E, + 0xA1AC: 0x2016, + 0xA1AD: 0x2026, + 0xA1AE: 0x2018, + 0xA1AF: 0x2019, + 0xA1B0: 0x201C, + 0xA1B1: 0x201D, + 0xA1B2: 0x3014, + 0xA1B3: 0x3015, + 0xA1B4: 0x3008, + 0xA1B5: 0x3009, + 0xA1B6: 0x300A, + 0xA1B7: 0x300B, + 0xA1B8: 0x300C, + 0xA1B9: 0x300D, + 0xA1BA: 0x300E, + 0xA1BB: 0x300F, + 0xA1BC: 0x3016, + 0xA1BD: 0x3017, + 0xA1BE: 0x3010, + 0xA1BF: 0x3011, + 0xA1C0: 0x00B1, + 0xA1C1: 0x00D7, + 0xA1C2: 0x00F7, + 0xA1C3: 0x2236, + 0xA1C4: 0x2227, + 0xA1C5: 0x2228, + 0xA1C6: 0x2211, + 0xA1C7: 0x220F, + 0xA1C8: 0x222A, + 0xA1C9: 0x2229, + 0xA1CA: 0x2208, + 0xA1CB: 0x2237, + 0xA1CC: 0x221A, + 0xA1CD: 0x22A5, + 0xA1CE: 0x2225, + 0xA1CF: 0x2220, + 0xA1D0: 0x2312, + 0xA1D1: 0x2299, + 0xA1D2: 0x222B, + 0xA1D3: 0x222E, + 0xA1D4: 0x2261, + 0xA1D5: 0x224C, + 0xA1D6: 0x2248, + 0xA1D7: 0x223D, + 0xA1D8: 0x221D, + 0xA1D9: 0x2260, + 0xA1DA: 0x226E, + 0xA1DB: 0x226F, + 0xA1DC: 0x2264, + 0xA1DD: 0x2265, + 0xA1DE: 0x221E, + 0xA1DF: 0x2235, + 0xA1E0: 0x2234, + 0xA1E1: 0x2642, + 0xA1E2: 0x2640, + 0xA1E3: 0x00B0, + 0xA1E4: 0x2032, + 0xA1E5: 0x2033, + 0xA1E6: 0x2103, + 0xA1E7: 0xFF04, + 0xA1E8: 0x00A4, + 0xA1E9: 0xFFE0, + 0xA1EA: 0xFFE1, + 0xA1EB: 0x2030, + 0xA1EC: 0x00A7, + 0xA1ED: 0x2116, + 0xA1EE: 0x2606, + 0xA1EF: 0x2605, + 0xA1F0: 0x25CB, + 0xA1F1: 0x25CF, + 0xA1F2: 0x25CE, + 0xA1F3: 0x25C7, + 0xA1F4: 0x25C6, + 0xA1F5: 0x25A1, + 0xA1F6: 0x25A0, + 0xA1F7: 0x25B3, + 0xA1F8: 0x25B2, + 0xA1F9: 0x203B, + 0xA1FA: 0x2192, + 0xA1FB: 0x2190, + 0xA1FC: 0x2191, + 0xA1FD: 0x2193, + 0xA1FE: 0x3013, + 0xA240: 0xE526, + 0xA241: 0xE527, + 0xA242: 0xE528, + 0xA243: 0xE529, + 0xA244: 0xE52A, + 0xA245: 0xE52B, + 0xA246: 0xE52C, + 0xA247: 0xE52D, + 0xA248: 0xE52E, + 0xA249: 0xE52F, + 0xA24A: 0xE530, + 0xA24B: 0xE531, + 0xA24C: 0xE532, + 0xA24D: 0xE533, + 0xA24E: 0xE534, + 0xA24F: 0xE535, + 0xA250: 0xE536, + 0xA251: 0xE537, + 0xA252: 0xE538, + 0xA253: 0xE539, + 0xA254: 0xE53A, + 0xA255: 0xE53B, + 0xA256: 0xE53C, + 0xA257: 0xE53D, + 0xA258: 0xE53E, + 0xA259: 0xE53F, + 0xA25A: 0xE540, + 0xA25B: 0xE541, + 0xA25C: 0xE542, + 0xA25D: 0xE543, + 0xA25E: 0xE544, + 0xA25F: 0xE545, + 0xA260: 0xE546, + 0xA261: 0xE547, + 0xA262: 0xE548, + 0xA263: 0xE549, + 0xA264: 0xE54A, + 0xA265: 0xE54B, + 0xA266: 0xE54C, + 0xA267: 0xE54D, + 0xA268: 0xE54E, + 0xA269: 0xE54F, + 0xA26A: 0xE550, + 0xA26B: 0xE551, + 0xA26C: 0xE552, + 0xA26D: 0xE553, + 0xA26E: 0xE554, + 0xA26F: 0xE555, + 0xA270: 0xE556, + 0xA271: 0xE557, + 0xA272: 0xE558, + 0xA273: 0xE559, + 0xA274: 0xE55A, + 0xA275: 0xE55B, + 0xA276: 0xE55C, + 0xA277: 0xE55D, + 0xA278: 0xE55E, + 0xA279: 0xE55F, + 0xA27A: 0xE560, + 0xA27B: 0xE561, + 0xA27C: 0xE562, + 0xA27D: 0xE563, + 0xA27E: 0xE564, + 0xA280: 0xE565, + 0xA281: 0xE566, + 0xA282: 0xE567, + 0xA283: 0xE568, + 0xA284: 0xE569, + 0xA285: 0xE56A, + 0xA286: 0xE56B, + 0xA287: 0xE56C, + 0xA288: 0xE56D, + 0xA289: 0xE56E, + 0xA28A: 0xE56F, + 0xA28B: 0xE570, + 0xA28C: 0xE571, + 0xA28D: 0xE572, + 0xA28E: 0xE573, + 0xA28F: 0xE574, + 0xA290: 0xE575, + 0xA291: 0xE576, + 0xA292: 0xE577, + 0xA293: 0xE578, + 0xA294: 0xE579, + 0xA295: 0xE57A, + 0xA296: 0xE57B, + 0xA297: 0xE57C, + 0xA298: 0xE57D, + 0xA299: 0xE57E, + 0xA29A: 0xE57F, + 0xA29B: 0xE580, + 0xA29C: 0xE581, + 0xA29D: 0xE582, + 0xA29E: 0xE583, + 0xA29F: 0xE584, + 0xA2A0: 0xE585, + 0xA2A1: 0x2170, + 0xA2A2: 0x2171, + 0xA2A3: 0x2172, + 0xA2A4: 0x2173, + 0xA2A5: 0x2174, + 0xA2A6: 0x2175, + 0xA2A7: 0x2176, + 0xA2A8: 0x2177, + 0xA2A9: 0x2178, + 0xA2AA: 0x2179, + 0xA2AB: 0xE766, + 0xA2AC: 0xE767, + 0xA2AD: 0xE768, + 0xA2AE: 0xE769, + 0xA2AF: 0xE76A, + 0xA2B0: 0xE76B, + 0xA2B1: 0x2488, + 0xA2B2: 0x2489, + 0xA2B3: 0x248A, + 0xA2B4: 0x248B, + 0xA2B5: 0x248C, + 0xA2B6: 0x248D, + 0xA2B7: 0x248E, + 0xA2B8: 0x248F, + 0xA2B9: 0x2490, + 0xA2BA: 0x2491, + 0xA2BB: 0x2492, + 0xA2BC: 0x2493, + 0xA2BD: 0x2494, + 0xA2BE: 0x2495, + 0xA2BF: 0x2496, + 0xA2C0: 0x2497, + 0xA2C1: 0x2498, + 0xA2C2: 0x2499, + 0xA2C3: 0x249A, + 0xA2C4: 0x249B, + 0xA2C5: 0x2474, + 0xA2C6: 0x2475, + 0xA2C7: 0x2476, + 0xA2C8: 0x2477, + 0xA2C9: 0x2478, + 0xA2CA: 0x2479, + 0xA2CB: 0x247A, + 0xA2CC: 0x247B, + 0xA2CD: 0x247C, + 0xA2CE: 0x247D, + 0xA2CF: 0x247E, + 0xA2D0: 0x247F, + 0xA2D1: 0x2480, + 0xA2D2: 0x2481, + 0xA2D3: 0x2482, + 0xA2D4: 0x2483, + 0xA2D5: 0x2484, + 0xA2D6: 0x2485, + 0xA2D7: 0x2486, + 0xA2D8: 0x2487, + 0xA2D9: 0x2460, + 0xA2DA: 0x2461, + 0xA2DB: 0x2462, + 0xA2DC: 0x2463, + 0xA2DD: 0x2464, + 0xA2DE: 0x2465, + 0xA2DF: 0x2466, + 0xA2E0: 0x2467, + 0xA2E1: 0x2468, + 0xA2E2: 0x2469, + 0xA2E3: 0x20AC, + 0xA2E4: 0xE76D, + 0xA2E5: 0x3220, + 0xA2E6: 0x3221, + 0xA2E7: 0x3222, + 0xA2E8: 0x3223, + 0xA2E9: 0x3224, + 0xA2EA: 0x3225, + 0xA2EB: 0x3226, + 0xA2EC: 0x3227, + 0xA2ED: 0x3228, + 0xA2EE: 0x3229, + 0xA2EF: 0xE76E, + 0xA2F0: 0xE76F, + 0xA2F1: 0x2160, + 0xA2F2: 0x2161, + 0xA2F3: 0x2162, + 0xA2F4: 0x2163, + 0xA2F5: 0x2164, + 0xA2F6: 0x2165, + 0xA2F7: 0x2166, + 0xA2F8: 0x2167, + 0xA2F9: 0x2168, + 0xA2FA: 0x2169, + 0xA2FB: 0x216A, + 0xA2FC: 0x216B, + 0xA2FD: 0xE770, + 0xA2FE: 0xE771, + 0xA340: 0xE586, + 0xA341: 0xE587, + 0xA342: 0xE588, + 0xA343: 0xE589, + 0xA344: 0xE58A, + 0xA345: 0xE58B, + 0xA346: 0xE58C, + 0xA347: 0xE58D, + 0xA348: 0xE58E, + 0xA349: 0xE58F, + 0xA34A: 0xE590, + 0xA34B: 0xE591, + 0xA34C: 0xE592, + 0xA34D: 0xE593, + 0xA34E: 0xE594, + 0xA34F: 0xE595, + 0xA350: 0xE596, + 0xA351: 0xE597, + 0xA352: 0xE598, + 0xA353: 0xE599, + 0xA354: 0xE59A, + 0xA355: 0xE59B, + 0xA356: 0xE59C, + 0xA357: 0xE59D, + 0xA358: 0xE59E, + 0xA359: 0xE59F, + 0xA35A: 0xE5A0, + 0xA35B: 0xE5A1, + 0xA35C: 0xE5A2, + 0xA35D: 0xE5A3, + 0xA35E: 0xE5A4, + 0xA35F: 0xE5A5, + 0xA360: 0xE5A6, + 0xA361: 0xE5A7, + 0xA362: 0xE5A8, + 0xA363: 0xE5A9, + 0xA364: 0xE5AA, + 0xA365: 0xE5AB, + 0xA366: 0xE5AC, + 0xA367: 0xE5AD, + 0xA368: 0xE5AE, + 0xA369: 0xE5AF, + 0xA36A: 0xE5B0, + 0xA36B: 0xE5B1, + 0xA36C: 0xE5B2, + 0xA36D: 0xE5B3, + 0xA36E: 0xE5B4, + 0xA36F: 0xE5B5, + 0xA370: 0xE5B6, + 0xA371: 0xE5B7, + 0xA372: 0xE5B8, + 0xA373: 0xE5B9, + 0xA374: 0xE5BA, + 0xA375: 0xE5BB, + 0xA376: 0xE5BC, + 0xA377: 0xE5BD, + 0xA378: 0xE5BE, + 0xA379: 0xE5BF, + 0xA37A: 0xE5C0, + 0xA37B: 0xE5C1, + 0xA37C: 0xE5C2, + 0xA37D: 0xE5C3, + 0xA37E: 0xE5C4, + 0xA380: 0xE5C5, + 0xA381: 0xE5C6, + 0xA382: 0xE5C7, + 0xA383: 0xE5C8, + 0xA384: 0xE5C9, + 0xA385: 0xE5CA, + 0xA386: 0xE5CB, + 0xA387: 0xE5CC, + 0xA388: 0xE5CD, + 0xA389: 0xE5CE, + 0xA38A: 0xE5CF, + 0xA38B: 0xE5D0, + 0xA38C: 0xE5D1, + 0xA38D: 0xE5D2, + 0xA38E: 0xE5D3, + 0xA38F: 0xE5D4, + 0xA390: 0xE5D5, + 0xA391: 0xE5D6, + 0xA392: 0xE5D7, + 0xA393: 0xE5D8, + 0xA394: 0xE5D9, + 0xA395: 0xE5DA, + 0xA396: 0xE5DB, + 0xA397: 0xE5DC, + 0xA398: 0xE5DD, + 0xA399: 0xE5DE, + 0xA39A: 0xE5DF, + 0xA39B: 0xE5E0, + 0xA39C: 0xE5E1, + 0xA39D: 0xE5E2, + 0xA39E: 0xE5E3, + 0xA39F: 0xE5E4, + 0xA3A0: 0xE5E5, + 0xA3A1: 0xFF01, + 0xA3A2: 0xFF02, + 0xA3A3: 0xFF03, + 0xA3A4: 0xFFE5, + 0xA3A5: 0xFF05, + 0xA3A6: 0xFF06, + 0xA3A7: 0xFF07, + 0xA3A8: 0xFF08, + 0xA3A9: 0xFF09, + 0xA3AA: 0xFF0A, + 0xA3AB: 0xFF0B, + 0xA3AC: 0xFF0C, + 0xA3AD: 0xFF0D, + 0xA3AE: 0xFF0E, + 0xA3AF: 0xFF0F, + 0xA3B0: 0xFF10, + 0xA3B1: 0xFF11, + 0xA3B2: 0xFF12, + 0xA3B3: 0xFF13, + 0xA3B4: 0xFF14, + 0xA3B5: 0xFF15, + 0xA3B6: 0xFF16, + 0xA3B7: 0xFF17, + 0xA3B8: 0xFF18, + 0xA3B9: 0xFF19, + 0xA3BA: 0xFF1A, + 0xA3BB: 0xFF1B, + 0xA3BC: 0xFF1C, + 0xA3BD: 0xFF1D, + 0xA3BE: 0xFF1E, + 0xA3BF: 0xFF1F, + 0xA3C0: 0xFF20, + 0xA3C1: 0xFF21, + 0xA3C2: 0xFF22, + 0xA3C3: 0xFF23, + 0xA3C4: 0xFF24, + 0xA3C5: 0xFF25, + 0xA3C6: 0xFF26, + 0xA3C7: 0xFF27, + 0xA3C8: 0xFF28, + 0xA3C9: 0xFF29, + 0xA3CA: 0xFF2A, + 0xA3CB: 0xFF2B, + 0xA3CC: 0xFF2C, + 0xA3CD: 0xFF2D, + 0xA3CE: 0xFF2E, + 0xA3CF: 0xFF2F, + 0xA3D0: 0xFF30, + 0xA3D1: 0xFF31, + 0xA3D2: 0xFF32, + 0xA3D3: 0xFF33, + 0xA3D4: 0xFF34, + 0xA3D5: 0xFF35, + 0xA3D6: 0xFF36, + 0xA3D7: 0xFF37, + 0xA3D8: 0xFF38, + 0xA3D9: 0xFF39, + 0xA3DA: 0xFF3A, + 0xA3DB: 0xFF3B, + 0xA3DC: 0xFF3C, + 0xA3DD: 0xFF3D, + 0xA3DE: 0xFF3E, + 0xA3DF: 0xFF3F, + 0xA3E0: 0xFF40, + 0xA3E1: 0xFF41, + 0xA3E2: 0xFF42, + 0xA3E3: 0xFF43, + 0xA3E4: 0xFF44, + 0xA3E5: 0xFF45, + 0xA3E6: 0xFF46, + 0xA3E7: 0xFF47, + 0xA3E8: 0xFF48, + 0xA3E9: 0xFF49, + 0xA3EA: 0xFF4A, + 0xA3EB: 0xFF4B, + 0xA3EC: 0xFF4C, + 0xA3ED: 0xFF4D, + 0xA3EE: 0xFF4E, + 0xA3EF: 0xFF4F, + 0xA3F0: 0xFF50, + 0xA3F1: 0xFF51, + 0xA3F2: 0xFF52, + 0xA3F3: 0xFF53, + 0xA3F4: 0xFF54, + 0xA3F5: 0xFF55, + 0xA3F6: 0xFF56, + 0xA3F7: 0xFF57, + 0xA3F8: 0xFF58, + 0xA3F9: 0xFF59, + 0xA3FA: 0xFF5A, + 0xA3FB: 0xFF5B, + 0xA3FC: 0xFF5C, + 0xA3FD: 0xFF5D, + 0xA3FE: 0xFFE3, + 0xA440: 0xE5E6, + 0xA441: 0xE5E7, + 0xA442: 0xE5E8, + 0xA443: 0xE5E9, + 0xA444: 0xE5EA, + 0xA445: 0xE5EB, + 0xA446: 0xE5EC, + 0xA447: 0xE5ED, + 0xA448: 0xE5EE, + 0xA449: 0xE5EF, + 0xA44A: 0xE5F0, + 0xA44B: 0xE5F1, + 0xA44C: 0xE5F2, + 0xA44D: 0xE5F3, + 0xA44E: 0xE5F4, + 0xA44F: 0xE5F5, + 0xA450: 0xE5F6, + 0xA451: 0xE5F7, + 0xA452: 0xE5F8, + 0xA453: 0xE5F9, + 0xA454: 0xE5FA, + 0xA455: 0xE5FB, + 0xA456: 0xE5FC, + 0xA457: 0xE5FD, + 0xA458: 0xE5FE, + 0xA459: 0xE5FF, + 0xA45A: 0xE600, + 0xA45B: 0xE601, + 0xA45C: 0xE602, + 0xA45D: 0xE603, + 0xA45E: 0xE604, + 0xA45F: 0xE605, + 0xA460: 0xE606, + 0xA461: 0xE607, + 0xA462: 0xE608, + 0xA463: 0xE609, + 0xA464: 0xE60A, + 0xA465: 0xE60B, + 0xA466: 0xE60C, + 0xA467: 0xE60D, + 0xA468: 0xE60E, + 0xA469: 0xE60F, + 0xA46A: 0xE610, + 0xA46B: 0xE611, + 0xA46C: 0xE612, + 0xA46D: 0xE613, + 0xA46E: 0xE614, + 0xA46F: 0xE615, + 0xA470: 0xE616, + 0xA471: 0xE617, + 0xA472: 0xE618, + 0xA473: 0xE619, + 0xA474: 0xE61A, + 0xA475: 0xE61B, + 0xA476: 0xE61C, + 0xA477: 0xE61D, + 0xA478: 0xE61E, + 0xA479: 0xE61F, + 0xA47A: 0xE620, + 0xA47B: 0xE621, + 0xA47C: 0xE622, + 0xA47D: 0xE623, + 0xA47E: 0xE624, + 0xA480: 0xE625, + 0xA481: 0xE626, + 0xA482: 0xE627, + 0xA483: 0xE628, + 0xA484: 0xE629, + 0xA485: 0xE62A, + 0xA486: 0xE62B, + 0xA487: 0xE62C, + 0xA488: 0xE62D, + 0xA489: 0xE62E, + 0xA48A: 0xE62F, + 0xA48B: 0xE630, + 0xA48C: 0xE631, + 0xA48D: 0xE632, + 0xA48E: 0xE633, + 0xA48F: 0xE634, + 0xA490: 0xE635, + 0xA491: 0xE636, + 0xA492: 0xE637, + 0xA493: 0xE638, + 0xA494: 0xE639, + 0xA495: 0xE63A, + 0xA496: 0xE63B, + 0xA497: 0xE63C, + 0xA498: 0xE63D, + 0xA499: 0xE63E, + 0xA49A: 0xE63F, + 0xA49B: 0xE640, + 0xA49C: 0xE641, + 0xA49D: 0xE642, + 0xA49E: 0xE643, + 0xA49F: 0xE644, + 0xA4A0: 0xE645, + 0xA4A1: 0x3041, + 0xA4A2: 0x3042, + 0xA4A3: 0x3043, + 0xA4A4: 0x3044, + 0xA4A5: 0x3045, + 0xA4A6: 0x3046, + 0xA4A7: 0x3047, + 0xA4A8: 0x3048, + 0xA4A9: 0x3049, + 0xA4AA: 0x304A, + 0xA4AB: 0x304B, + 0xA4AC: 0x304C, + 0xA4AD: 0x304D, + 0xA4AE: 0x304E, + 0xA4AF: 0x304F, + 0xA4B0: 0x3050, + 0xA4B1: 0x3051, + 0xA4B2: 0x3052, + 0xA4B3: 0x3053, + 0xA4B4: 0x3054, + 0xA4B5: 0x3055, + 0xA4B6: 0x3056, + 0xA4B7: 0x3057, + 0xA4B8: 0x3058, + 0xA4B9: 0x3059, + 0xA4BA: 0x305A, + 0xA4BB: 0x305B, + 0xA4BC: 0x305C, + 0xA4BD: 0x305D, + 0xA4BE: 0x305E, + 0xA4BF: 0x305F, + 0xA4C0: 0x3060, + 0xA4C1: 0x3061, + 0xA4C2: 0x3062, + 0xA4C3: 0x3063, + 0xA4C4: 0x3064, + 0xA4C5: 0x3065, + 0xA4C6: 0x3066, + 0xA4C7: 0x3067, + 0xA4C8: 0x3068, + 0xA4C9: 0x3069, + 0xA4CA: 0x306A, + 0xA4CB: 0x306B, + 0xA4CC: 0x306C, + 0xA4CD: 0x306D, + 0xA4CE: 0x306E, + 0xA4CF: 0x306F, + 0xA4D0: 0x3070, + 0xA4D1: 0x3071, + 0xA4D2: 0x3072, + 0xA4D3: 0x3073, + 0xA4D4: 0x3074, + 0xA4D5: 0x3075, + 0xA4D6: 0x3076, + 0xA4D7: 0x3077, + 0xA4D8: 0x3078, + 0xA4D9: 0x3079, + 0xA4DA: 0x307A, + 0xA4DB: 0x307B, + 0xA4DC: 0x307C, + 0xA4DD: 0x307D, + 0xA4DE: 0x307E, + 0xA4DF: 0x307F, + 0xA4E0: 0x3080, + 0xA4E1: 0x3081, + 0xA4E2: 0x3082, + 0xA4E3: 0x3083, + 0xA4E4: 0x3084, + 0xA4E5: 0x3085, + 0xA4E6: 0x3086, + 0xA4E7: 0x3087, + 0xA4E8: 0x3088, + 0xA4E9: 0x3089, + 0xA4EA: 0x308A, + 0xA4EB: 0x308B, + 0xA4EC: 0x308C, + 0xA4ED: 0x308D, + 0xA4EE: 0x308E, + 0xA4EF: 0x308F, + 0xA4F0: 0x3090, + 0xA4F1: 0x3091, + 0xA4F2: 0x3092, + 0xA4F3: 0x3093, + 0xA4F4: 0xE772, + 0xA4F5: 0xE773, + 0xA4F6: 0xE774, + 0xA4F7: 0xE775, + 0xA4F8: 0xE776, + 0xA4F9: 0xE777, + 0xA4FA: 0xE778, + 0xA4FB: 0xE779, + 0xA4FC: 0xE77A, + 0xA4FD: 0xE77B, + 0xA4FE: 0xE77C, + 0xA540: 0xE646, + 0xA541: 0xE647, + 0xA542: 0xE648, + 0xA543: 0xE649, + 0xA544: 0xE64A, + 0xA545: 0xE64B, + 0xA546: 0xE64C, + 0xA547: 0xE64D, + 0xA548: 0xE64E, + 0xA549: 0xE64F, + 0xA54A: 0xE650, + 0xA54B: 0xE651, + 0xA54C: 0xE652, + 0xA54D: 0xE653, + 0xA54E: 0xE654, + 0xA54F: 0xE655, + 0xA550: 0xE656, + 0xA551: 0xE657, + 0xA552: 0xE658, + 0xA553: 0xE659, + 0xA554: 0xE65A, + 0xA555: 0xE65B, + 0xA556: 0xE65C, + 0xA557: 0xE65D, + 0xA558: 0xE65E, + 0xA559: 0xE65F, + 0xA55A: 0xE660, + 0xA55B: 0xE661, + 0xA55C: 0xE662, + 0xA55D: 0xE663, + 0xA55E: 0xE664, + 0xA55F: 0xE665, + 0xA560: 0xE666, + 0xA561: 0xE667, + 0xA562: 0xE668, + 0xA563: 0xE669, + 0xA564: 0xE66A, + 0xA565: 0xE66B, + 0xA566: 0xE66C, + 0xA567: 0xE66D, + 0xA568: 0xE66E, + 0xA569: 0xE66F, + 0xA56A: 0xE670, + 0xA56B: 0xE671, + 0xA56C: 0xE672, + 0xA56D: 0xE673, + 0xA56E: 0xE674, + 0xA56F: 0xE675, + 0xA570: 0xE676, + 0xA571: 0xE677, + 0xA572: 0xE678, + 0xA573: 0xE679, + 0xA574: 0xE67A, + 0xA575: 0xE67B, + 0xA576: 0xE67C, + 0xA577: 0xE67D, + 0xA578: 0xE67E, + 0xA579: 0xE67F, + 0xA57A: 0xE680, + 0xA57B: 0xE681, + 0xA57C: 0xE682, + 0xA57D: 0xE683, + 0xA57E: 0xE684, + 0xA580: 0xE685, + 0xA581: 0xE686, + 0xA582: 0xE687, + 0xA583: 0xE688, + 0xA584: 0xE689, + 0xA585: 0xE68A, + 0xA586: 0xE68B, + 0xA587: 0xE68C, + 0xA588: 0xE68D, + 0xA589: 0xE68E, + 0xA58A: 0xE68F, + 0xA58B: 0xE690, + 0xA58C: 0xE691, + 0xA58D: 0xE692, + 0xA58E: 0xE693, + 0xA58F: 0xE694, + 0xA590: 0xE695, + 0xA591: 0xE696, + 0xA592: 0xE697, + 0xA593: 0xE698, + 0xA594: 0xE699, + 0xA595: 0xE69A, + 0xA596: 0xE69B, + 0xA597: 0xE69C, + 0xA598: 0xE69D, + 0xA599: 0xE69E, + 0xA59A: 0xE69F, + 0xA59B: 0xE6A0, + 0xA59C: 0xE6A1, + 0xA59D: 0xE6A2, + 0xA59E: 0xE6A3, + 0xA59F: 0xE6A4, + 0xA5A0: 0xE6A5, + 0xA5A1: 0x30A1, + 0xA5A2: 0x30A2, + 0xA5A3: 0x30A3, + 0xA5A4: 0x30A4, + 0xA5A5: 0x30A5, + 0xA5A6: 0x30A6, + 0xA5A7: 0x30A7, + 0xA5A8: 0x30A8, + 0xA5A9: 0x30A9, + 0xA5AA: 0x30AA, + 0xA5AB: 0x30AB, + 0xA5AC: 0x30AC, + 0xA5AD: 0x30AD, + 0xA5AE: 0x30AE, + 0xA5AF: 0x30AF, + 0xA5B0: 0x30B0, + 0xA5B1: 0x30B1, + 0xA5B2: 0x30B2, + 0xA5B3: 0x30B3, + 0xA5B4: 0x30B4, + 0xA5B5: 0x30B5, + 0xA5B6: 0x30B6, + 0xA5B7: 0x30B7, + 0xA5B8: 0x30B8, + 0xA5B9: 0x30B9, + 0xA5BA: 0x30BA, + 0xA5BB: 0x30BB, + 0xA5BC: 0x30BC, + 0xA5BD: 0x30BD, + 0xA5BE: 0x30BE, + 0xA5BF: 0x30BF, + 0xA5C0: 0x30C0, + 0xA5C1: 0x30C1, + 0xA5C2: 0x30C2, + 0xA5C3: 0x30C3, + 0xA5C4: 0x30C4, + 0xA5C5: 0x30C5, + 0xA5C6: 0x30C6, + 0xA5C7: 0x30C7, + 0xA5C8: 0x30C8, + 0xA5C9: 0x30C9, + 0xA5CA: 0x30CA, + 0xA5CB: 0x30CB, + 0xA5CC: 0x30CC, + 0xA5CD: 0x30CD, + 0xA5CE: 0x30CE, + 0xA5CF: 0x30CF, + 0xA5D0: 0x30D0, + 0xA5D1: 0x30D1, + 0xA5D2: 0x30D2, + 0xA5D3: 0x30D3, + 0xA5D4: 0x30D4, + 0xA5D5: 0x30D5, + 0xA5D6: 0x30D6, + 0xA5D7: 0x30D7, + 0xA5D8: 0x30D8, + 0xA5D9: 0x30D9, + 0xA5DA: 0x30DA, + 0xA5DB: 0x30DB, + 0xA5DC: 0x30DC, + 0xA5DD: 0x30DD, + 0xA5DE: 0x30DE, + 0xA5DF: 0x30DF, + 0xA5E0: 0x30E0, + 0xA5E1: 0x30E1, + 0xA5E2: 0x30E2, + 0xA5E3: 0x30E3, + 0xA5E4: 0x30E4, + 0xA5E5: 0x30E5, + 0xA5E6: 0x30E6, + 0xA5E7: 0x30E7, + 0xA5E8: 0x30E8, + 0xA5E9: 0x30E9, + 0xA5EA: 0x30EA, + 0xA5EB: 0x30EB, + 0xA5EC: 0x30EC, + 0xA5ED: 0x30ED, + 0xA5EE: 0x30EE, + 0xA5EF: 0x30EF, + 0xA5F0: 0x30F0, + 0xA5F1: 0x30F1, + 0xA5F2: 0x30F2, + 0xA5F3: 0x30F3, + 0xA5F4: 0x30F4, + 0xA5F5: 0x30F5, + 0xA5F6: 0x30F6, + 0xA5F7: 0xE77D, + 0xA5F8: 0xE77E, + 0xA5F9: 0xE77F, + 0xA5FA: 0xE780, + 0xA5FB: 0xE781, + 0xA5FC: 0xE782, + 0xA5FD: 0xE783, + 0xA5FE: 0xE784, + 0xA640: 0xE6A6, + 0xA641: 0xE6A7, + 0xA642: 0xE6A8, + 0xA643: 0xE6A9, + 0xA644: 0xE6AA, + 0xA645: 0xE6AB, + 0xA646: 0xE6AC, + 0xA647: 0xE6AD, + 0xA648: 0xE6AE, + 0xA649: 0xE6AF, + 0xA64A: 0xE6B0, + 0xA64B: 0xE6B1, + 0xA64C: 0xE6B2, + 0xA64D: 0xE6B3, + 0xA64E: 0xE6B4, + 0xA64F: 0xE6B5, + 0xA650: 0xE6B6, + 0xA651: 0xE6B7, + 0xA652: 0xE6B8, + 0xA653: 0xE6B9, + 0xA654: 0xE6BA, + 0xA655: 0xE6BB, + 0xA656: 0xE6BC, + 0xA657: 0xE6BD, + 0xA658: 0xE6BE, + 0xA659: 0xE6BF, + 0xA65A: 0xE6C0, + 0xA65B: 0xE6C1, + 0xA65C: 0xE6C2, + 0xA65D: 0xE6C3, + 0xA65E: 0xE6C4, + 0xA65F: 0xE6C5, + 0xA660: 0xE6C6, + 0xA661: 0xE6C7, + 0xA662: 0xE6C8, + 0xA663: 0xE6C9, + 0xA664: 0xE6CA, + 0xA665: 0xE6CB, + 0xA666: 0xE6CC, + 0xA667: 0xE6CD, + 0xA668: 0xE6CE, + 0xA669: 0xE6CF, + 0xA66A: 0xE6D0, + 0xA66B: 0xE6D1, + 0xA66C: 0xE6D2, + 0xA66D: 0xE6D3, + 0xA66E: 0xE6D4, + 0xA66F: 0xE6D5, + 0xA670: 0xE6D6, + 0xA671: 0xE6D7, + 0xA672: 0xE6D8, + 0xA673: 0xE6D9, + 0xA674: 0xE6DA, + 0xA675: 0xE6DB, + 0xA676: 0xE6DC, + 0xA677: 0xE6DD, + 0xA678: 0xE6DE, + 0xA679: 0xE6DF, + 0xA67A: 0xE6E0, + 0xA67B: 0xE6E1, + 0xA67C: 0xE6E2, + 0xA67D: 0xE6E3, + 0xA67E: 0xE6E4, + 0xA680: 0xE6E5, + 0xA681: 0xE6E6, + 0xA682: 0xE6E7, + 0xA683: 0xE6E8, + 0xA684: 0xE6E9, + 0xA685: 0xE6EA, + 0xA686: 0xE6EB, + 0xA687: 0xE6EC, + 0xA688: 0xE6ED, + 0xA689: 0xE6EE, + 0xA68A: 0xE6EF, + 0xA68B: 0xE6F0, + 0xA68C: 0xE6F1, + 0xA68D: 0xE6F2, + 0xA68E: 0xE6F3, + 0xA68F: 0xE6F4, + 0xA690: 0xE6F5, + 0xA691: 0xE6F6, + 0xA692: 0xE6F7, + 0xA693: 0xE6F8, + 0xA694: 0xE6F9, + 0xA695: 0xE6FA, + 0xA696: 0xE6FB, + 0xA697: 0xE6FC, + 0xA698: 0xE6FD, + 0xA699: 0xE6FE, + 0xA69A: 0xE6FF, + 0xA69B: 0xE700, + 0xA69C: 0xE701, + 0xA69D: 0xE702, + 0xA69E: 0xE703, + 0xA69F: 0xE704, + 0xA6A0: 0xE705, + 0xA6A1: 0x0391, + 0xA6A2: 0x0392, + 0xA6A3: 0x0393, + 0xA6A4: 0x0394, + 0xA6A5: 0x0395, + 0xA6A6: 0x0396, + 0xA6A7: 0x0397, + 0xA6A8: 0x0398, + 0xA6A9: 0x0399, + 0xA6AA: 0x039A, + 0xA6AB: 0x039B, + 0xA6AC: 0x039C, + 0xA6AD: 0x039D, + 0xA6AE: 0x039E, + 0xA6AF: 0x039F, + 0xA6B0: 0x03A0, + 0xA6B1: 0x03A1, + 0xA6B2: 0x03A3, + 0xA6B3: 0x03A4, + 0xA6B4: 0x03A5, + 0xA6B5: 0x03A6, + 0xA6B6: 0x03A7, + 0xA6B7: 0x03A8, + 0xA6B8: 0x03A9, + 0xA6B9: 0xE785, + 0xA6BA: 0xE786, + 0xA6BB: 0xE787, + 0xA6BC: 0xE788, + 0xA6BD: 0xE789, + 0xA6BE: 0xE78A, + 0xA6BF: 0xE78B, + 0xA6C0: 0xE78C, + 0xA6C1: 0x03B1, + 0xA6C2: 0x03B2, + 0xA6C3: 0x03B3, + 0xA6C4: 0x03B4, + 0xA6C5: 0x03B5, + 0xA6C6: 0x03B6, + 0xA6C7: 0x03B7, + 0xA6C8: 0x03B8, + 0xA6C9: 0x03B9, + 0xA6CA: 0x03BA, + 0xA6CB: 0x03BB, + 0xA6CC: 0x03BC, + 0xA6CD: 0x03BD, + 0xA6CE: 0x03BE, + 0xA6CF: 0x03BF, + 0xA6D0: 0x03C0, + 0xA6D1: 0x03C1, + 0xA6D2: 0x03C3, + 0xA6D3: 0x03C4, + 0xA6D4: 0x03C5, + 0xA6D5: 0x03C6, + 0xA6D6: 0x03C7, + 0xA6D7: 0x03C8, + 0xA6D8: 0x03C9, + 0xA6D9: 0xFE10, + 0xA6DA: 0xFE12, + 0xA6DB: 0xFE11, + 0xA6DC: 0xFE13, + 0xA6DD: 0xFE14, + 0xA6DE: 0xFE15, + 0xA6DF: 0xFE16, + 0xA6E0: 0xFE35, + 0xA6E1: 0xFE36, + 0xA6E2: 0xFE39, + 0xA6E3: 0xFE3A, + 0xA6E4: 0xFE3F, + 0xA6E5: 0xFE40, + 0xA6E6: 0xFE3D, + 0xA6E7: 0xFE3E, + 0xA6E8: 0xFE41, + 0xA6E9: 0xFE42, + 0xA6EA: 0xFE43, + 0xA6EB: 0xFE44, + 0xA6EC: 0xFE17, + 0xA6ED: 0xFE18, + 0xA6EE: 0xFE3B, + 0xA6EF: 0xFE3C, + 0xA6F0: 0xFE37, + 0xA6F1: 0xFE38, + 0xA6F2: 0xFE31, + 0xA6F3: 0xFE19, + 0xA6F4: 0xFE33, + 0xA6F5: 0xFE34, + 0xA6F6: 0xE797, + 0xA6F7: 0xE798, + 0xA6F8: 0xE799, + 0xA6F9: 0xE79A, + 0xA6FA: 0xE79B, + 0xA6FB: 0xE79C, + 0xA6FC: 0xE79D, + 0xA6FD: 0xE79E, + 0xA6FE: 0xE79F, + 0xA740: 0xE706, + 0xA741: 0xE707, + 0xA742: 0xE708, + 0xA743: 0xE709, + 0xA744: 0xE70A, + 0xA745: 0xE70B, + 0xA746: 0xE70C, + 0xA747: 0xE70D, + 0xA748: 0xE70E, + 0xA749: 0xE70F, + 0xA74A: 0xE710, + 0xA74B: 0xE711, + 0xA74C: 0xE712, + 0xA74D: 0xE713, + 0xA74E: 0xE714, + 0xA74F: 0xE715, + 0xA750: 0xE716, + 0xA751: 0xE717, + 0xA752: 0xE718, + 0xA753: 0xE719, + 0xA754: 0xE71A, + 0xA755: 0xE71B, + 0xA756: 0xE71C, + 0xA757: 0xE71D, + 0xA758: 0xE71E, + 0xA759: 0xE71F, + 0xA75A: 0xE720, + 0xA75B: 0xE721, + 0xA75C: 0xE722, + 0xA75D: 0xE723, + 0xA75E: 0xE724, + 0xA75F: 0xE725, + 0xA760: 0xE726, + 0xA761: 0xE727, + 0xA762: 0xE728, + 0xA763: 0xE729, + 0xA764: 0xE72A, + 0xA765: 0xE72B, + 0xA766: 0xE72C, + 0xA767: 0xE72D, + 0xA768: 0xE72E, + 0xA769: 0xE72F, + 0xA76A: 0xE730, + 0xA76B: 0xE731, + 0xA76C: 0xE732, + 0xA76D: 0xE733, + 0xA76E: 0xE734, + 0xA76F: 0xE735, + 0xA770: 0xE736, + 0xA771: 0xE737, + 0xA772: 0xE738, + 0xA773: 0xE739, + 0xA774: 0xE73A, + 0xA775: 0xE73B, + 0xA776: 0xE73C, + 0xA777: 0xE73D, + 0xA778: 0xE73E, + 0xA779: 0xE73F, + 0xA77A: 0xE740, + 0xA77B: 0xE741, + 0xA77C: 0xE742, + 0xA77D: 0xE743, + 0xA77E: 0xE744, + 0xA780: 0xE745, + 0xA781: 0xE746, + 0xA782: 0xE747, + 0xA783: 0xE748, + 0xA784: 0xE749, + 0xA785: 0xE74A, + 0xA786: 0xE74B, + 0xA787: 0xE74C, + 0xA788: 0xE74D, + 0xA789: 0xE74E, + 0xA78A: 0xE74F, + 0xA78B: 0xE750, + 0xA78C: 0xE751, + 0xA78D: 0xE752, + 0xA78E: 0xE753, + 0xA78F: 0xE754, + 0xA790: 0xE755, + 0xA791: 0xE756, + 0xA792: 0xE757, + 0xA793: 0xE758, + 0xA794: 0xE759, + 0xA795: 0xE75A, + 0xA796: 0xE75B, + 0xA797: 0xE75C, + 0xA798: 0xE75D, + 0xA799: 0xE75E, + 0xA79A: 0xE75F, + 0xA79B: 0xE760, + 0xA79C: 0xE761, + 0xA79D: 0xE762, + 0xA79E: 0xE763, + 0xA79F: 0xE764, + 0xA7A0: 0xE765, + 0xA7A1: 0x0410, + 0xA7A2: 0x0411, + 0xA7A3: 0x0412, + 0xA7A4: 0x0413, + 0xA7A5: 0x0414, + 0xA7A6: 0x0415, + 0xA7A7: 0x0401, + 0xA7A8: 0x0416, + 0xA7A9: 0x0417, + 0xA7AA: 0x0418, + 0xA7AB: 0x0419, + 0xA7AC: 0x041A, + 0xA7AD: 0x041B, + 0xA7AE: 0x041C, + 0xA7AF: 0x041D, + 0xA7B0: 0x041E, + 0xA7B1: 0x041F, + 0xA7B2: 0x0420, + 0xA7B3: 0x0421, + 0xA7B4: 0x0422, + 0xA7B5: 0x0423, + 0xA7B6: 0x0424, + 0xA7B7: 0x0425, + 0xA7B8: 0x0426, + 0xA7B9: 0x0427, + 0xA7BA: 0x0428, + 0xA7BB: 0x0429, + 0xA7BC: 0x042A, + 0xA7BD: 0x042B, + 0xA7BE: 0x042C, + 0xA7BF: 0x042D, + 0xA7C0: 0x042E, + 0xA7C1: 0x042F, + 0xA7C2: 0xE7A0, + 0xA7C3: 0xE7A1, + 0xA7C4: 0xE7A2, + 0xA7C5: 0xE7A3, + 0xA7C6: 0xE7A4, + 0xA7C7: 0xE7A5, + 0xA7C8: 0xE7A6, + 0xA7C9: 0xE7A7, + 0xA7CA: 0xE7A8, + 0xA7CB: 0xE7A9, + 0xA7CC: 0xE7AA, + 0xA7CD: 0xE7AB, + 0xA7CE: 0xE7AC, + 0xA7CF: 0xE7AD, + 0xA7D0: 0xE7AE, + 0xA7D1: 0x0430, + 0xA7D2: 0x0431, + 0xA7D3: 0x0432, + 0xA7D4: 0x0433, + 0xA7D5: 0x0434, + 0xA7D6: 0x0435, + 0xA7D7: 0x0451, + 0xA7D8: 0x0436, + 0xA7D9: 0x0437, + 0xA7DA: 0x0438, + 0xA7DB: 0x0439, + 0xA7DC: 0x043A, + 0xA7DD: 0x043B, + 0xA7DE: 0x043C, + 0xA7DF: 0x043D, + 0xA7E0: 0x043E, + 0xA7E1: 0x043F, + 0xA7E2: 0x0440, + 0xA7E3: 0x0441, + 0xA7E4: 0x0442, + 0xA7E5: 0x0443, + 0xA7E6: 0x0444, + 0xA7E7: 0x0445, + 0xA7E8: 0x0446, + 0xA7E9: 0x0447, + 0xA7EA: 0x0448, + 0xA7EB: 0x0449, + 0xA7EC: 0x044A, + 0xA7ED: 0x044B, + 0xA7EE: 0x044C, + 0xA7EF: 0x044D, + 0xA7F0: 0x044E, + 0xA7F1: 0x044F, + 0xA7F2: 0xE7AF, + 0xA7F3: 0xE7B0, + 0xA7F4: 0xE7B1, + 0xA7F5: 0xE7B2, + 0xA7F6: 0xE7B3, + 0xA7F7: 0xE7B4, + 0xA7F8: 0xE7B5, + 0xA7F9: 0xE7B6, + 0xA7FA: 0xE7B7, + 0xA7FB: 0xE7B8, + 0xA7FC: 0xE7B9, + 0xA7FD: 0xE7BA, + 0xA7FE: 0xE7BB, + 0xA840: 0x02CA, + 0xA841: 0x02CB, + 0xA842: 0x02D9, + 0xA843: 0x2013, + 0xA844: 0x2015, + 0xA845: 0x2025, + 0xA846: 0x2035, + 0xA847: 0x2105, + 0xA848: 0x2109, + 0xA849: 0x2196, + 0xA84A: 0x2197, + 0xA84B: 0x2198, + 0xA84C: 0x2199, + 0xA84D: 0x2215, + 0xA84E: 0x221F, + 0xA84F: 0x2223, + 0xA850: 0x2252, + 0xA851: 0x2266, + 0xA852: 0x2267, + 0xA853: 0x22BF, + 0xA854: 0x2550, + 0xA855: 0x2551, + 0xA856: 0x2552, + 0xA857: 0x2553, + 0xA858: 0x2554, + 0xA859: 0x2555, + 0xA85A: 0x2556, + 0xA85B: 0x2557, + 0xA85C: 0x2558, + 0xA85D: 0x2559, + 0xA85E: 0x255A, + 0xA85F: 0x255B, + 0xA860: 0x255C, + 0xA861: 0x255D, + 0xA862: 0x255E, + 0xA863: 0x255F, + 0xA864: 0x2560, + 0xA865: 0x2561, + 0xA866: 0x2562, + 0xA867: 0x2563, + 0xA868: 0x2564, + 0xA869: 0x2565, + 0xA86A: 0x2566, + 0xA86B: 0x2567, + 0xA86C: 0x2568, + 0xA86D: 0x2569, + 0xA86E: 0x256A, + 0xA86F: 0x256B, + 0xA870: 0x256C, + 0xA871: 0x256D, + 0xA872: 0x256E, + 0xA873: 0x256F, + 0xA874: 0x2570, + 0xA875: 0x2571, + 0xA876: 0x2572, + 0xA877: 0x2573, + 0xA878: 0x2581, + 0xA879: 0x2582, + 0xA87A: 0x2583, + 0xA87B: 0x2584, + 0xA87C: 0x2585, + 0xA87D: 0x2586, + 0xA87E: 0x2587, + 0xA880: 0x2588, + 0xA881: 0x2589, + 0xA882: 0x258A, + 0xA883: 0x258B, + 0xA884: 0x258C, + 0xA885: 0x258D, + 0xA886: 0x258E, + 0xA887: 0x258F, + 0xA888: 0x2593, + 0xA889: 0x2594, + 0xA88A: 0x2595, + 0xA88B: 0x25BC, + 0xA88C: 0x25BD, + 0xA88D: 0x25E2, + 0xA88E: 0x25E3, + 0xA88F: 0x25E4, + 0xA890: 0x25E5, + 0xA891: 0x2609, + 0xA892: 0x2295, + 0xA893: 0x3012, + 0xA894: 0x301D, + 0xA895: 0x301E, + 0xA896: 0xE7BC, + 0xA897: 0xE7BD, + 0xA898: 0xE7BE, + 0xA899: 0xE7BF, + 0xA89A: 0xE7C0, + 0xA89B: 0xE7C1, + 0xA89C: 0xE7C2, + 0xA89D: 0xE7C3, + 0xA89E: 0xE7C4, + 0xA89F: 0xE7C5, + 0xA8A0: 0xE7C6, + 0xA8A1: 0x0101, + 0xA8A2: 0x00E1, + 0xA8A3: 0x01CE, + 0xA8A4: 0x00E0, + 0xA8A5: 0x0113, + 0xA8A6: 0x00E9, + 0xA8A7: 0x011B, + 0xA8A8: 0x00E8, + 0xA8A9: 0x012B, + 0xA8AA: 0x00ED, + 0xA8AB: 0x01D0, + 0xA8AC: 0x00EC, + 0xA8AD: 0x014D, + 0xA8AE: 0x00F3, + 0xA8AF: 0x01D2, + 0xA8B0: 0x00F2, + 0xA8B1: 0x016B, + 0xA8B2: 0x00FA, + 0xA8B3: 0x01D4, + 0xA8B4: 0x00F9, + 0xA8B5: 0x01D6, + 0xA8B6: 0x01D8, + 0xA8B7: 0x01DA, + 0xA8B8: 0x01DC, + 0xA8B9: 0x00FC, + 0xA8BA: 0x00EA, + 0xA8BB: 0x0251, + 0xA8BC: 0x1E3F, + 0xA8BD: 0x0144, + 0xA8BE: 0x0148, + 0xA8BF: 0x01F9, + 0xA8C0: 0x0261, + 0xA8C1: 0xE7C9, + 0xA8C2: 0xE7CA, + 0xA8C3: 0xE7CB, + 0xA8C4: 0xE7CC, + 0xA8C5: 0x3105, + 0xA8C6: 0x3106, + 0xA8C7: 0x3107, + 0xA8C8: 0x3108, + 0xA8C9: 0x3109, + 0xA8CA: 0x310A, + 0xA8CB: 0x310B, + 0xA8CC: 0x310C, + 0xA8CD: 0x310D, + 0xA8CE: 0x310E, + 0xA8CF: 0x310F, + 0xA8D0: 0x3110, + 0xA8D1: 0x3111, + 0xA8D2: 0x3112, + 0xA8D3: 0x3113, + 0xA8D4: 0x3114, + 0xA8D5: 0x3115, + 0xA8D6: 0x3116, + 0xA8D7: 0x3117, + 0xA8D8: 0x3118, + 0xA8D9: 0x3119, + 0xA8DA: 0x311A, + 0xA8DB: 0x311B, + 0xA8DC: 0x311C, + 0xA8DD: 0x311D, + 0xA8DE: 0x311E, + 0xA8DF: 0x311F, + 0xA8E0: 0x3120, + 0xA8E1: 0x3121, + 0xA8E2: 0x3122, + 0xA8E3: 0x3123, + 0xA8E4: 0x3124, + 0xA8E5: 0x3125, + 0xA8E6: 0x3126, + 0xA8E7: 0x3127, + 0xA8E8: 0x3128, + 0xA8E9: 0x3129, + 0xA8EA: 0xE7CD, + 0xA8EB: 0xE7CE, + 0xA8EC: 0xE7CF, + 0xA8ED: 0xE7D0, + 0xA8EE: 0xE7D1, + 0xA8EF: 0xE7D2, + 0xA8F0: 0xE7D3, + 0xA8F1: 0xE7D4, + 0xA8F2: 0xE7D5, + 0xA8F3: 0xE7D6, + 0xA8F4: 0xE7D7, + 0xA8F5: 0xE7D8, + 0xA8F6: 0xE7D9, + 0xA8F7: 0xE7DA, + 0xA8F8: 0xE7DB, + 0xA8F9: 0xE7DC, + 0xA8FA: 0xE7DD, + 0xA8FB: 0xE7DE, + 0xA8FC: 0xE7DF, + 0xA8FD: 0xE7E0, + 0xA8FE: 0xE7E1, + 0xA940: 0x3021, + 0xA941: 0x3022, + 0xA942: 0x3023, + 0xA943: 0x3024, + 0xA944: 0x3025, + 0xA945: 0x3026, + 0xA946: 0x3027, + 0xA947: 0x3028, + 0xA948: 0x3029, + 0xA949: 0x32A3, + 0xA94A: 0x338E, + 0xA94B: 0x338F, + 0xA94C: 0x339C, + 0xA94D: 0x339D, + 0xA94E: 0x339E, + 0xA94F: 0x33A1, + 0xA950: 0x33C4, + 0xA951: 0x33CE, + 0xA952: 0x33D1, + 0xA953: 0x33D2, + 0xA954: 0x33D5, + 0xA955: 0xFE30, + 0xA956: 0xFFE2, + 0xA957: 0xFFE4, + 0xA958: 0xE7E2, + 0xA959: 0x2121, + 0xA95A: 0x3231, + 0xA95B: 0xE7E3, + 0xA95C: 0x2010, + 0xA95D: 0xE7E4, + 0xA95E: 0xE7E5, + 0xA95F: 0xE7E6, + 0xA960: 0x30FC, + 0xA961: 0x309B, + 0xA962: 0x309C, + 0xA963: 0x30FD, + 0xA964: 0x30FE, + 0xA965: 0x3006, + 0xA966: 0x309D, + 0xA967: 0x309E, + 0xA968: 0xFE49, + 0xA969: 0xFE4A, + 0xA96A: 0xFE4B, + 0xA96B: 0xFE4C, + 0xA96C: 0xFE4D, + 0xA96D: 0xFE4E, + 0xA96E: 0xFE4F, + 0xA96F: 0xFE50, + 0xA970: 0xFE51, + 0xA971: 0xFE52, + 0xA972: 0xFE54, + 0xA973: 0xFE55, + 0xA974: 0xFE56, + 0xA975: 0xFE57, + 0xA976: 0xFE59, + 0xA977: 0xFE5A, + 0xA978: 0xFE5B, + 0xA979: 0xFE5C, + 0xA97A: 0xFE5D, + 0xA97B: 0xFE5E, + 0xA97C: 0xFE5F, + 0xA97D: 0xFE60, + 0xA97E: 0xFE61, + 0xA980: 0xFE62, + 0xA981: 0xFE63, + 0xA982: 0xFE64, + 0xA983: 0xFE65, + 0xA984: 0xFE66, + 0xA985: 0xFE68, + 0xA986: 0xFE69, + 0xA987: 0xFE6A, + 0xA988: 0xFE6B, + 0xA989: 0x303E, + 0xA98A: 0x2FF0, + 0xA98B: 0x2FF1, + 0xA98C: 0x2FF2, + 0xA98D: 0x2FF3, + 0xA98E: 0x2FF4, + 0xA98F: 0x2FF5, + 0xA990: 0x2FF6, + 0xA991: 0x2FF7, + 0xA992: 0x2FF8, + 0xA993: 0x2FF9, + 0xA994: 0x2FFA, + 0xA995: 0x2FFB, + 0xA996: 0x3007, + 0xA997: 0xE7F4, + 0xA998: 0xE7F5, + 0xA999: 0xE7F6, + 0xA99A: 0xE7F7, + 0xA99B: 0xE7F8, + 0xA99C: 0xE7F9, + 0xA99D: 0xE7FA, + 0xA99E: 0xE7FB, + 0xA99F: 0xE7FC, + 0xA9A0: 0xE7FD, + 0xA9A1: 0xE7FE, + 0xA9A2: 0xE7FF, + 0xA9A3: 0xE800, + 0xA9A4: 0x2500, + 0xA9A5: 0x2501, + 0xA9A6: 0x2502, + 0xA9A7: 0x2503, + 0xA9A8: 0x2504, + 0xA9A9: 0x2505, + 0xA9AA: 0x2506, + 0xA9AB: 0x2507, + 0xA9AC: 0x2508, + 0xA9AD: 0x2509, + 0xA9AE: 0x250A, + 0xA9AF: 0x250B, + 0xA9B0: 0x250C, + 0xA9B1: 0x250D, + 0xA9B2: 0x250E, + 0xA9B3: 0x250F, + 0xA9B4: 0x2510, + 0xA9B5: 0x2511, + 0xA9B6: 0x2512, + 0xA9B7: 0x2513, + 0xA9B8: 0x2514, + 0xA9B9: 0x2515, + 0xA9BA: 0x2516, + 0xA9BB: 0x2517, + 0xA9BC: 0x2518, + 0xA9BD: 0x2519, + 0xA9BE: 0x251A, + 0xA9BF: 0x251B, + 0xA9C0: 0x251C, + 0xA9C1: 0x251D, + 0xA9C2: 0x251E, + 0xA9C3: 0x251F, + 0xA9C4: 0x2520, + 0xA9C5: 0x2521, + 0xA9C6: 0x2522, + 0xA9C7: 0x2523, + 0xA9C8: 0x2524, + 0xA9C9: 0x2525, + 0xA9CA: 0x2526, + 0xA9CB: 0x2527, + 0xA9CC: 0x2528, + 0xA9CD: 0x2529, + 0xA9CE: 0x252A, + 0xA9CF: 0x252B, + 0xA9D0: 0x252C, + 0xA9D1: 0x252D, + 0xA9D2: 0x252E, + 0xA9D3: 0x252F, + 0xA9D4: 0x2530, + 0xA9D5: 0x2531, + 0xA9D6: 0x2532, + 0xA9D7: 0x2533, + 0xA9D8: 0x2534, + 0xA9D9: 0x2535, + 0xA9DA: 0x2536, + 0xA9DB: 0x2537, + 0xA9DC: 0x2538, + 0xA9DD: 0x2539, + 0xA9DE: 0x253A, + 0xA9DF: 0x253B, + 0xA9E0: 0x253C, + 0xA9E1: 0x253D, + 0xA9E2: 0x253E, + 0xA9E3: 0x253F, + 0xA9E4: 0x2540, + 0xA9E5: 0x2541, + 0xA9E6: 0x2542, + 0xA9E7: 0x2543, + 0xA9E8: 0x2544, + 0xA9E9: 0x2545, + 0xA9EA: 0x2546, + 0xA9EB: 0x2547, + 0xA9EC: 0x2548, + 0xA9ED: 0x2549, + 0xA9EE: 0x254A, + 0xA9EF: 0x254B, + 0xA9F0: 0xE801, + 0xA9F1: 0xE802, + 0xA9F2: 0xE803, + 0xA9F3: 0xE804, + 0xA9F4: 0xE805, + 0xA9F5: 0xE806, + 0xA9F6: 0xE807, + 0xA9F7: 0xE808, + 0xA9F8: 0xE809, + 0xA9F9: 0xE80A, + 0xA9FA: 0xE80B, + 0xA9FB: 0xE80C, + 0xA9FC: 0xE80D, + 0xA9FD: 0xE80E, + 0xA9FE: 0xE80F, + 0xAA40: 0x72DC, + 0xAA41: 0x72DD, + 0xAA42: 0x72DF, + 0xAA43: 0x72E2, + 0xAA44: 0x72E3, + 0xAA45: 0x72E4, + 0xAA46: 0x72E5, + 0xAA47: 0x72E6, + 0xAA48: 0x72E7, + 0xAA49: 0x72EA, + 0xAA4A: 0x72EB, + 0xAA4B: 0x72F5, + 0xAA4C: 0x72F6, + 0xAA4D: 0x72F9, + 0xAA4E: 0x72FD, + 0xAA4F: 0x72FE, + 0xAA50: 0x72FF, + 0xAA51: 0x7300, + 0xAA52: 0x7302, + 0xAA53: 0x7304, + 0xAA54: 0x7305, + 0xAA55: 0x7306, + 0xAA56: 0x7307, + 0xAA57: 0x7308, + 0xAA58: 0x7309, + 0xAA59: 0x730B, + 0xAA5A: 0x730C, + 0xAA5B: 0x730D, + 0xAA5C: 0x730F, + 0xAA5D: 0x7310, + 0xAA5E: 0x7311, + 0xAA5F: 0x7312, + 0xAA60: 0x7314, + 0xAA61: 0x7318, + 0xAA62: 0x7319, + 0xAA63: 0x731A, + 0xAA64: 0x731F, + 0xAA65: 0x7320, + 0xAA66: 0x7323, + 0xAA67: 0x7324, + 0xAA68: 0x7326, + 0xAA69: 0x7327, + 0xAA6A: 0x7328, + 0xAA6B: 0x732D, + 0xAA6C: 0x732F, + 0xAA6D: 0x7330, + 0xAA6E: 0x7332, + 0xAA6F: 0x7333, + 0xAA70: 0x7335, + 0xAA71: 0x7336, + 0xAA72: 0x733A, + 0xAA73: 0x733B, + 0xAA74: 0x733C, + 0xAA75: 0x733D, + 0xAA76: 0x7340, + 0xAA77: 0x7341, + 0xAA78: 0x7342, + 0xAA79: 0x7343, + 0xAA7A: 0x7344, + 0xAA7B: 0x7345, + 0xAA7C: 0x7346, + 0xAA7D: 0x7347, + 0xAA7E: 0x7348, + 0xAA80: 0x7349, + 0xAA81: 0x734A, + 0xAA82: 0x734B, + 0xAA83: 0x734C, + 0xAA84: 0x734E, + 0xAA85: 0x734F, + 0xAA86: 0x7351, + 0xAA87: 0x7353, + 0xAA88: 0x7354, + 0xAA89: 0x7355, + 0xAA8A: 0x7356, + 0xAA8B: 0x7358, + 0xAA8C: 0x7359, + 0xAA8D: 0x735A, + 0xAA8E: 0x735B, + 0xAA8F: 0x735C, + 0xAA90: 0x735D, + 0xAA91: 0x735E, + 0xAA92: 0x735F, + 0xAA93: 0x7361, + 0xAA94: 0x7362, + 0xAA95: 0x7363, + 0xAA96: 0x7364, + 0xAA97: 0x7365, + 0xAA98: 0x7366, + 0xAA99: 0x7367, + 0xAA9A: 0x7368, + 0xAA9B: 0x7369, + 0xAA9C: 0x736A, + 0xAA9D: 0x736B, + 0xAA9E: 0x736E, + 0xAA9F: 0x7370, + 0xAAA0: 0x7371, + 0xAAA1: 0xE000, + 0xAAA2: 0xE001, + 0xAAA3: 0xE002, + 0xAAA4: 0xE003, + 0xAAA5: 0xE004, + 0xAAA6: 0xE005, + 0xAAA7: 0xE006, + 0xAAA8: 0xE007, + 0xAAA9: 0xE008, + 0xAAAA: 0xE009, + 0xAAAB: 0xE00A, + 0xAAAC: 0xE00B, + 0xAAAD: 0xE00C, + 0xAAAE: 0xE00D, + 0xAAAF: 0xE00E, + 0xAAB0: 0xE00F, + 0xAAB1: 0xE010, + 0xAAB2: 0xE011, + 0xAAB3: 0xE012, + 0xAAB4: 0xE013, + 0xAAB5: 0xE014, + 0xAAB6: 0xE015, + 0xAAB7: 0xE016, + 0xAAB8: 0xE017, + 0xAAB9: 0xE018, + 0xAABA: 0xE019, + 0xAABB: 0xE01A, + 0xAABC: 0xE01B, + 0xAABD: 0xE01C, + 0xAABE: 0xE01D, + 0xAABF: 0xE01E, + 0xAAC0: 0xE01F, + 0xAAC1: 0xE020, + 0xAAC2: 0xE021, + 0xAAC3: 0xE022, + 0xAAC4: 0xE023, + 0xAAC5: 0xE024, + 0xAAC6: 0xE025, + 0xAAC7: 0xE026, + 0xAAC8: 0xE027, + 0xAAC9: 0xE028, + 0xAACA: 0xE029, + 0xAACB: 0xE02A, + 0xAACC: 0xE02B, + 0xAACD: 0xE02C, + 0xAACE: 0xE02D, + 0xAACF: 0xE02E, + 0xAAD0: 0xE02F, + 0xAAD1: 0xE030, + 0xAAD2: 0xE031, + 0xAAD3: 0xE032, + 0xAAD4: 0xE033, + 0xAAD5: 0xE034, + 0xAAD6: 0xE035, + 0xAAD7: 0xE036, + 0xAAD8: 0xE037, + 0xAAD9: 0xE038, + 0xAADA: 0xE039, + 0xAADB: 0xE03A, + 0xAADC: 0xE03B, + 0xAADD: 0xE03C, + 0xAADE: 0xE03D, + 0xAADF: 0xE03E, + 0xAAE0: 0xE03F, + 0xAAE1: 0xE040, + 0xAAE2: 0xE041, + 0xAAE3: 0xE042, + 0xAAE4: 0xE043, + 0xAAE5: 0xE044, + 0xAAE6: 0xE045, + 0xAAE7: 0xE046, + 0xAAE8: 0xE047, + 0xAAE9: 0xE048, + 0xAAEA: 0xE049, + 0xAAEB: 0xE04A, + 0xAAEC: 0xE04B, + 0xAAED: 0xE04C, + 0xAAEE: 0xE04D, + 0xAAEF: 0xE04E, + 0xAAF0: 0xE04F, + 0xAAF1: 0xE050, + 0xAAF2: 0xE051, + 0xAAF3: 0xE052, + 0xAAF4: 0xE053, + 0xAAF5: 0xE054, + 0xAAF6: 0xE055, + 0xAAF7: 0xE056, + 0xAAF8: 0xE057, + 0xAAF9: 0xE058, + 0xAAFA: 0xE059, + 0xAAFB: 0xE05A, + 0xAAFC: 0xE05B, + 0xAAFD: 0xE05C, + 0xAAFE: 0xE05D, + 0xAB40: 0x7372, + 0xAB41: 0x7373, + 0xAB42: 0x7374, + 0xAB43: 0x7375, + 0xAB44: 0x7376, + 0xAB45: 0x7377, + 0xAB46: 0x7378, + 0xAB47: 0x7379, + 0xAB48: 0x737A, + 0xAB49: 0x737B, + 0xAB4A: 0x737C, + 0xAB4B: 0x737D, + 0xAB4C: 0x737F, + 0xAB4D: 0x7380, + 0xAB4E: 0x7381, + 0xAB4F: 0x7382, + 0xAB50: 0x7383, + 0xAB51: 0x7385, + 0xAB52: 0x7386, + 0xAB53: 0x7388, + 0xAB54: 0x738A, + 0xAB55: 0x738C, + 0xAB56: 0x738D, + 0xAB57: 0x738F, + 0xAB58: 0x7390, + 0xAB59: 0x7392, + 0xAB5A: 0x7393, + 0xAB5B: 0x7394, + 0xAB5C: 0x7395, + 0xAB5D: 0x7397, + 0xAB5E: 0x7398, + 0xAB5F: 0x7399, + 0xAB60: 0x739A, + 0xAB61: 0x739C, + 0xAB62: 0x739D, + 0xAB63: 0x739E, + 0xAB64: 0x73A0, + 0xAB65: 0x73A1, + 0xAB66: 0x73A3, + 0xAB67: 0x73A4, + 0xAB68: 0x73A5, + 0xAB69: 0x73A6, + 0xAB6A: 0x73A7, + 0xAB6B: 0x73A8, + 0xAB6C: 0x73AA, + 0xAB6D: 0x73AC, + 0xAB6E: 0x73AD, + 0xAB6F: 0x73B1, + 0xAB70: 0x73B4, + 0xAB71: 0x73B5, + 0xAB72: 0x73B6, + 0xAB73: 0x73B8, + 0xAB74: 0x73B9, + 0xAB75: 0x73BC, + 0xAB76: 0x73BD, + 0xAB77: 0x73BE, + 0xAB78: 0x73BF, + 0xAB79: 0x73C1, + 0xAB7A: 0x73C3, + 0xAB7B: 0x73C4, + 0xAB7C: 0x73C5, + 0xAB7D: 0x73C6, + 0xAB7E: 0x73C7, + 0xAB80: 0x73CB, + 0xAB81: 0x73CC, + 0xAB82: 0x73CE, + 0xAB83: 0x73D2, + 0xAB84: 0x73D3, + 0xAB85: 0x73D4, + 0xAB86: 0x73D5, + 0xAB87: 0x73D6, + 0xAB88: 0x73D7, + 0xAB89: 0x73D8, + 0xAB8A: 0x73DA, + 0xAB8B: 0x73DB, + 0xAB8C: 0x73DC, + 0xAB8D: 0x73DD, + 0xAB8E: 0x73DF, + 0xAB8F: 0x73E1, + 0xAB90: 0x73E2, + 0xAB91: 0x73E3, + 0xAB92: 0x73E4, + 0xAB93: 0x73E6, + 0xAB94: 0x73E8, + 0xAB95: 0x73EA, + 0xAB96: 0x73EB, + 0xAB97: 0x73EC, + 0xAB98: 0x73EE, + 0xAB99: 0x73EF, + 0xAB9A: 0x73F0, + 0xAB9B: 0x73F1, + 0xAB9C: 0x73F3, + 0xAB9D: 0x73F4, + 0xAB9E: 0x73F5, + 0xAB9F: 0x73F6, + 0xABA0: 0x73F7, + 0xABA1: 0xE05E, + 0xABA2: 0xE05F, + 0xABA3: 0xE060, + 0xABA4: 0xE061, + 0xABA5: 0xE062, + 0xABA6: 0xE063, + 0xABA7: 0xE064, + 0xABA8: 0xE065, + 0xABA9: 0xE066, + 0xABAA: 0xE067, + 0xABAB: 0xE068, + 0xABAC: 0xE069, + 0xABAD: 0xE06A, + 0xABAE: 0xE06B, + 0xABAF: 0xE06C, + 0xABB0: 0xE06D, + 0xABB1: 0xE06E, + 0xABB2: 0xE06F, + 0xABB3: 0xE070, + 0xABB4: 0xE071, + 0xABB5: 0xE072, + 0xABB6: 0xE073, + 0xABB7: 0xE074, + 0xABB8: 0xE075, + 0xABB9: 0xE076, + 0xABBA: 0xE077, + 0xABBB: 0xE078, + 0xABBC: 0xE079, + 0xABBD: 0xE07A, + 0xABBE: 0xE07B, + 0xABBF: 0xE07C, + 0xABC0: 0xE07D, + 0xABC1: 0xE07E, + 0xABC2: 0xE07F, + 0xABC3: 0xE080, + 0xABC4: 0xE081, + 0xABC5: 0xE082, + 0xABC6: 0xE083, + 0xABC7: 0xE084, + 0xABC8: 0xE085, + 0xABC9: 0xE086, + 0xABCA: 0xE087, + 0xABCB: 0xE088, + 0xABCC: 0xE089, + 0xABCD: 0xE08A, + 0xABCE: 0xE08B, + 0xABCF: 0xE08C, + 0xABD0: 0xE08D, + 0xABD1: 0xE08E, + 0xABD2: 0xE08F, + 0xABD3: 0xE090, + 0xABD4: 0xE091, + 0xABD5: 0xE092, + 0xABD6: 0xE093, + 0xABD7: 0xE094, + 0xABD8: 0xE095, + 0xABD9: 0xE096, + 0xABDA: 0xE097, + 0xABDB: 0xE098, + 0xABDC: 0xE099, + 0xABDD: 0xE09A, + 0xABDE: 0xE09B, + 0xABDF: 0xE09C, + 0xABE0: 0xE09D, + 0xABE1: 0xE09E, + 0xABE2: 0xE09F, + 0xABE3: 0xE0A0, + 0xABE4: 0xE0A1, + 0xABE5: 0xE0A2, + 0xABE6: 0xE0A3, + 0xABE7: 0xE0A4, + 0xABE8: 0xE0A5, + 0xABE9: 0xE0A6, + 0xABEA: 0xE0A7, + 0xABEB: 0xE0A8, + 0xABEC: 0xE0A9, + 0xABED: 0xE0AA, + 0xABEE: 0xE0AB, + 0xABEF: 0xE0AC, + 0xABF0: 0xE0AD, + 0xABF1: 0xE0AE, + 0xABF2: 0xE0AF, + 0xABF3: 0xE0B0, + 0xABF4: 0xE0B1, + 0xABF5: 0xE0B2, + 0xABF6: 0xE0B3, + 0xABF7: 0xE0B4, + 0xABF8: 0xE0B5, + 0xABF9: 0xE0B6, + 0xABFA: 0xE0B7, + 0xABFB: 0xE0B8, + 0xABFC: 0xE0B9, + 0xABFD: 0xE0BA, + 0xABFE: 0xE0BB, + 0xAC40: 0x73F8, + 0xAC41: 0x73F9, + 0xAC42: 0x73FA, + 0xAC43: 0x73FB, + 0xAC44: 0x73FC, + 0xAC45: 0x73FD, + 0xAC46: 0x73FE, + 0xAC47: 0x73FF, + 0xAC48: 0x7400, + 0xAC49: 0x7401, + 0xAC4A: 0x7402, + 0xAC4B: 0x7404, + 0xAC4C: 0x7407, + 0xAC4D: 0x7408, + 0xAC4E: 0x740B, + 0xAC4F: 0x740C, + 0xAC50: 0x740D, + 0xAC51: 0x740E, + 0xAC52: 0x7411, + 0xAC53: 0x7412, + 0xAC54: 0x7413, + 0xAC55: 0x7414, + 0xAC56: 0x7415, + 0xAC57: 0x7416, + 0xAC58: 0x7417, + 0xAC59: 0x7418, + 0xAC5A: 0x7419, + 0xAC5B: 0x741C, + 0xAC5C: 0x741D, + 0xAC5D: 0x741E, + 0xAC5E: 0x741F, + 0xAC5F: 0x7420, + 0xAC60: 0x7421, + 0xAC61: 0x7423, + 0xAC62: 0x7424, + 0xAC63: 0x7427, + 0xAC64: 0x7429, + 0xAC65: 0x742B, + 0xAC66: 0x742D, + 0xAC67: 0x742F, + 0xAC68: 0x7431, + 0xAC69: 0x7432, + 0xAC6A: 0x7437, + 0xAC6B: 0x7438, + 0xAC6C: 0x7439, + 0xAC6D: 0x743A, + 0xAC6E: 0x743B, + 0xAC6F: 0x743D, + 0xAC70: 0x743E, + 0xAC71: 0x743F, + 0xAC72: 0x7440, + 0xAC73: 0x7442, + 0xAC74: 0x7443, + 0xAC75: 0x7444, + 0xAC76: 0x7445, + 0xAC77: 0x7446, + 0xAC78: 0x7447, + 0xAC79: 0x7448, + 0xAC7A: 0x7449, + 0xAC7B: 0x744A, + 0xAC7C: 0x744B, + 0xAC7D: 0x744C, + 0xAC7E: 0x744D, + 0xAC80: 0x744E, + 0xAC81: 0x744F, + 0xAC82: 0x7450, + 0xAC83: 0x7451, + 0xAC84: 0x7452, + 0xAC85: 0x7453, + 0xAC86: 0x7454, + 0xAC87: 0x7456, + 0xAC88: 0x7458, + 0xAC89: 0x745D, + 0xAC8A: 0x7460, + 0xAC8B: 0x7461, + 0xAC8C: 0x7462, + 0xAC8D: 0x7463, + 0xAC8E: 0x7464, + 0xAC8F: 0x7465, + 0xAC90: 0x7466, + 0xAC91: 0x7467, + 0xAC92: 0x7468, + 0xAC93: 0x7469, + 0xAC94: 0x746A, + 0xAC95: 0x746B, + 0xAC96: 0x746C, + 0xAC97: 0x746E, + 0xAC98: 0x746F, + 0xAC99: 0x7471, + 0xAC9A: 0x7472, + 0xAC9B: 0x7473, + 0xAC9C: 0x7474, + 0xAC9D: 0x7475, + 0xAC9E: 0x7478, + 0xAC9F: 0x7479, + 0xACA0: 0x747A, + 0xACA1: 0xE0BC, + 0xACA2: 0xE0BD, + 0xACA3: 0xE0BE, + 0xACA4: 0xE0BF, + 0xACA5: 0xE0C0, + 0xACA6: 0xE0C1, + 0xACA7: 0xE0C2, + 0xACA8: 0xE0C3, + 0xACA9: 0xE0C4, + 0xACAA: 0xE0C5, + 0xACAB: 0xE0C6, + 0xACAC: 0xE0C7, + 0xACAD: 0xE0C8, + 0xACAE: 0xE0C9, + 0xACAF: 0xE0CA, + 0xACB0: 0xE0CB, + 0xACB1: 0xE0CC, + 0xACB2: 0xE0CD, + 0xACB3: 0xE0CE, + 0xACB4: 0xE0CF, + 0xACB5: 0xE0D0, + 0xACB6: 0xE0D1, + 0xACB7: 0xE0D2, + 0xACB8: 0xE0D3, + 0xACB9: 0xE0D4, + 0xACBA: 0xE0D5, + 0xACBB: 0xE0D6, + 0xACBC: 0xE0D7, + 0xACBD: 0xE0D8, + 0xACBE: 0xE0D9, + 0xACBF: 0xE0DA, + 0xACC0: 0xE0DB, + 0xACC1: 0xE0DC, + 0xACC2: 0xE0DD, + 0xACC3: 0xE0DE, + 0xACC4: 0xE0DF, + 0xACC5: 0xE0E0, + 0xACC6: 0xE0E1, + 0xACC7: 0xE0E2, + 0xACC8: 0xE0E3, + 0xACC9: 0xE0E4, + 0xACCA: 0xE0E5, + 0xACCB: 0xE0E6, + 0xACCC: 0xE0E7, + 0xACCD: 0xE0E8, + 0xACCE: 0xE0E9, + 0xACCF: 0xE0EA, + 0xACD0: 0xE0EB, + 0xACD1: 0xE0EC, + 0xACD2: 0xE0ED, + 0xACD3: 0xE0EE, + 0xACD4: 0xE0EF, + 0xACD5: 0xE0F0, + 0xACD6: 0xE0F1, + 0xACD7: 0xE0F2, + 0xACD8: 0xE0F3, + 0xACD9: 0xE0F4, + 0xACDA: 0xE0F5, + 0xACDB: 0xE0F6, + 0xACDC: 0xE0F7, + 0xACDD: 0xE0F8, + 0xACDE: 0xE0F9, + 0xACDF: 0xE0FA, + 0xACE0: 0xE0FB, + 0xACE1: 0xE0FC, + 0xACE2: 0xE0FD, + 0xACE3: 0xE0FE, + 0xACE4: 0xE0FF, + 0xACE5: 0xE100, + 0xACE6: 0xE101, + 0xACE7: 0xE102, + 0xACE8: 0xE103, + 0xACE9: 0xE104, + 0xACEA: 0xE105, + 0xACEB: 0xE106, + 0xACEC: 0xE107, + 0xACED: 0xE108, + 0xACEE: 0xE109, + 0xACEF: 0xE10A, + 0xACF0: 0xE10B, + 0xACF1: 0xE10C, + 0xACF2: 0xE10D, + 0xACF3: 0xE10E, + 0xACF4: 0xE10F, + 0xACF5: 0xE110, + 0xACF6: 0xE111, + 0xACF7: 0xE112, + 0xACF8: 0xE113, + 0xACF9: 0xE114, + 0xACFA: 0xE115, + 0xACFB: 0xE116, + 0xACFC: 0xE117, + 0xACFD: 0xE118, + 0xACFE: 0xE119, + 0xAD40: 0x747B, + 0xAD41: 0x747C, + 0xAD42: 0x747D, + 0xAD43: 0x747F, + 0xAD44: 0x7482, + 0xAD45: 0x7484, + 0xAD46: 0x7485, + 0xAD47: 0x7486, + 0xAD48: 0x7488, + 0xAD49: 0x7489, + 0xAD4A: 0x748A, + 0xAD4B: 0x748C, + 0xAD4C: 0x748D, + 0xAD4D: 0x748F, + 0xAD4E: 0x7491, + 0xAD4F: 0x7492, + 0xAD50: 0x7493, + 0xAD51: 0x7494, + 0xAD52: 0x7495, + 0xAD53: 0x7496, + 0xAD54: 0x7497, + 0xAD55: 0x7498, + 0xAD56: 0x7499, + 0xAD57: 0x749A, + 0xAD58: 0x749B, + 0xAD59: 0x749D, + 0xAD5A: 0x749F, + 0xAD5B: 0x74A0, + 0xAD5C: 0x74A1, + 0xAD5D: 0x74A2, + 0xAD5E: 0x74A3, + 0xAD5F: 0x74A4, + 0xAD60: 0x74A5, + 0xAD61: 0x74A6, + 0xAD62: 0x74AA, + 0xAD63: 0x74AB, + 0xAD64: 0x74AC, + 0xAD65: 0x74AD, + 0xAD66: 0x74AE, + 0xAD67: 0x74AF, + 0xAD68: 0x74B0, + 0xAD69: 0x74B1, + 0xAD6A: 0x74B2, + 0xAD6B: 0x74B3, + 0xAD6C: 0x74B4, + 0xAD6D: 0x74B5, + 0xAD6E: 0x74B6, + 0xAD6F: 0x74B7, + 0xAD70: 0x74B8, + 0xAD71: 0x74B9, + 0xAD72: 0x74BB, + 0xAD73: 0x74BC, + 0xAD74: 0x74BD, + 0xAD75: 0x74BE, + 0xAD76: 0x74BF, + 0xAD77: 0x74C0, + 0xAD78: 0x74C1, + 0xAD79: 0x74C2, + 0xAD7A: 0x74C3, + 0xAD7B: 0x74C4, + 0xAD7C: 0x74C5, + 0xAD7D: 0x74C6, + 0xAD7E: 0x74C7, + 0xAD80: 0x74C8, + 0xAD81: 0x74C9, + 0xAD82: 0x74CA, + 0xAD83: 0x74CB, + 0xAD84: 0x74CC, + 0xAD85: 0x74CD, + 0xAD86: 0x74CE, + 0xAD87: 0x74CF, + 0xAD88: 0x74D0, + 0xAD89: 0x74D1, + 0xAD8A: 0x74D3, + 0xAD8B: 0x74D4, + 0xAD8C: 0x74D5, + 0xAD8D: 0x74D6, + 0xAD8E: 0x74D7, + 0xAD8F: 0x74D8, + 0xAD90: 0x74D9, + 0xAD91: 0x74DA, + 0xAD92: 0x74DB, + 0xAD93: 0x74DD, + 0xAD94: 0x74DF, + 0xAD95: 0x74E1, + 0xAD96: 0x74E5, + 0xAD97: 0x74E7, + 0xAD98: 0x74E8, + 0xAD99: 0x74E9, + 0xAD9A: 0x74EA, + 0xAD9B: 0x74EB, + 0xAD9C: 0x74EC, + 0xAD9D: 0x74ED, + 0xAD9E: 0x74F0, + 0xAD9F: 0x74F1, + 0xADA0: 0x74F2, + 0xADA1: 0xE11A, + 0xADA2: 0xE11B, + 0xADA3: 0xE11C, + 0xADA4: 0xE11D, + 0xADA5: 0xE11E, + 0xADA6: 0xE11F, + 0xADA7: 0xE120, + 0xADA8: 0xE121, + 0xADA9: 0xE122, + 0xADAA: 0xE123, + 0xADAB: 0xE124, + 0xADAC: 0xE125, + 0xADAD: 0xE126, + 0xADAE: 0xE127, + 0xADAF: 0xE128, + 0xADB0: 0xE129, + 0xADB1: 0xE12A, + 0xADB2: 0xE12B, + 0xADB3: 0xE12C, + 0xADB4: 0xE12D, + 0xADB5: 0xE12E, + 0xADB6: 0xE12F, + 0xADB7: 0xE130, + 0xADB8: 0xE131, + 0xADB9: 0xE132, + 0xADBA: 0xE133, + 0xADBB: 0xE134, + 0xADBC: 0xE135, + 0xADBD: 0xE136, + 0xADBE: 0xE137, + 0xADBF: 0xE138, + 0xADC0: 0xE139, + 0xADC1: 0xE13A, + 0xADC2: 0xE13B, + 0xADC3: 0xE13C, + 0xADC4: 0xE13D, + 0xADC5: 0xE13E, + 0xADC6: 0xE13F, + 0xADC7: 0xE140, + 0xADC8: 0xE141, + 0xADC9: 0xE142, + 0xADCA: 0xE143, + 0xADCB: 0xE144, + 0xADCC: 0xE145, + 0xADCD: 0xE146, + 0xADCE: 0xE147, + 0xADCF: 0xE148, + 0xADD0: 0xE149, + 0xADD1: 0xE14A, + 0xADD2: 0xE14B, + 0xADD3: 0xE14C, + 0xADD4: 0xE14D, + 0xADD5: 0xE14E, + 0xADD6: 0xE14F, + 0xADD7: 0xE150, + 0xADD8: 0xE151, + 0xADD9: 0xE152, + 0xADDA: 0xE153, + 0xADDB: 0xE154, + 0xADDC: 0xE155, + 0xADDD: 0xE156, + 0xADDE: 0xE157, + 0xADDF: 0xE158, + 0xADE0: 0xE159, + 0xADE1: 0xE15A, + 0xADE2: 0xE15B, + 0xADE3: 0xE15C, + 0xADE4: 0xE15D, + 0xADE5: 0xE15E, + 0xADE6: 0xE15F, + 0xADE7: 0xE160, + 0xADE8: 0xE161, + 0xADE9: 0xE162, + 0xADEA: 0xE163, + 0xADEB: 0xE164, + 0xADEC: 0xE165, + 0xADED: 0xE166, + 0xADEE: 0xE167, + 0xADEF: 0xE168, + 0xADF0: 0xE169, + 0xADF1: 0xE16A, + 0xADF2: 0xE16B, + 0xADF3: 0xE16C, + 0xADF4: 0xE16D, + 0xADF5: 0xE16E, + 0xADF6: 0xE16F, + 0xADF7: 0xE170, + 0xADF8: 0xE171, + 0xADF9: 0xE172, + 0xADFA: 0xE173, + 0xADFB: 0xE174, + 0xADFC: 0xE175, + 0xADFD: 0xE176, + 0xADFE: 0xE177, + 0xAE40: 0x74F3, + 0xAE41: 0x74F5, + 0xAE42: 0x74F8, + 0xAE43: 0x74F9, + 0xAE44: 0x74FA, + 0xAE45: 0x74FB, + 0xAE46: 0x74FC, + 0xAE47: 0x74FD, + 0xAE48: 0x74FE, + 0xAE49: 0x7500, + 0xAE4A: 0x7501, + 0xAE4B: 0x7502, + 0xAE4C: 0x7503, + 0xAE4D: 0x7505, + 0xAE4E: 0x7506, + 0xAE4F: 0x7507, + 0xAE50: 0x7508, + 0xAE51: 0x7509, + 0xAE52: 0x750A, + 0xAE53: 0x750B, + 0xAE54: 0x750C, + 0xAE55: 0x750E, + 0xAE56: 0x7510, + 0xAE57: 0x7512, + 0xAE58: 0x7514, + 0xAE59: 0x7515, + 0xAE5A: 0x7516, + 0xAE5B: 0x7517, + 0xAE5C: 0x751B, + 0xAE5D: 0x751D, + 0xAE5E: 0x751E, + 0xAE5F: 0x7520, + 0xAE60: 0x7521, + 0xAE61: 0x7522, + 0xAE62: 0x7523, + 0xAE63: 0x7524, + 0xAE64: 0x7526, + 0xAE65: 0x7527, + 0xAE66: 0x752A, + 0xAE67: 0x752E, + 0xAE68: 0x7534, + 0xAE69: 0x7536, + 0xAE6A: 0x7539, + 0xAE6B: 0x753C, + 0xAE6C: 0x753D, + 0xAE6D: 0x753F, + 0xAE6E: 0x7541, + 0xAE6F: 0x7542, + 0xAE70: 0x7543, + 0xAE71: 0x7544, + 0xAE72: 0x7546, + 0xAE73: 0x7547, + 0xAE74: 0x7549, + 0xAE75: 0x754A, + 0xAE76: 0x754D, + 0xAE77: 0x7550, + 0xAE78: 0x7551, + 0xAE79: 0x7552, + 0xAE7A: 0x7553, + 0xAE7B: 0x7555, + 0xAE7C: 0x7556, + 0xAE7D: 0x7557, + 0xAE7E: 0x7558, + 0xAE80: 0x755D, + 0xAE81: 0x755E, + 0xAE82: 0x755F, + 0xAE83: 0x7560, + 0xAE84: 0x7561, + 0xAE85: 0x7562, + 0xAE86: 0x7563, + 0xAE87: 0x7564, + 0xAE88: 0x7567, + 0xAE89: 0x7568, + 0xAE8A: 0x7569, + 0xAE8B: 0x756B, + 0xAE8C: 0x756C, + 0xAE8D: 0x756D, + 0xAE8E: 0x756E, + 0xAE8F: 0x756F, + 0xAE90: 0x7570, + 0xAE91: 0x7571, + 0xAE92: 0x7573, + 0xAE93: 0x7575, + 0xAE94: 0x7576, + 0xAE95: 0x7577, + 0xAE96: 0x757A, + 0xAE97: 0x757B, + 0xAE98: 0x757C, + 0xAE99: 0x757D, + 0xAE9A: 0x757E, + 0xAE9B: 0x7580, + 0xAE9C: 0x7581, + 0xAE9D: 0x7582, + 0xAE9E: 0x7584, + 0xAE9F: 0x7585, + 0xAEA0: 0x7587, + 0xAEA1: 0xE178, + 0xAEA2: 0xE179, + 0xAEA3: 0xE17A, + 0xAEA4: 0xE17B, + 0xAEA5: 0xE17C, + 0xAEA6: 0xE17D, + 0xAEA7: 0xE17E, + 0xAEA8: 0xE17F, + 0xAEA9: 0xE180, + 0xAEAA: 0xE181, + 0xAEAB: 0xE182, + 0xAEAC: 0xE183, + 0xAEAD: 0xE184, + 0xAEAE: 0xE185, + 0xAEAF: 0xE186, + 0xAEB0: 0xE187, + 0xAEB1: 0xE188, + 0xAEB2: 0xE189, + 0xAEB3: 0xE18A, + 0xAEB4: 0xE18B, + 0xAEB5: 0xE18C, + 0xAEB6: 0xE18D, + 0xAEB7: 0xE18E, + 0xAEB8: 0xE18F, + 0xAEB9: 0xE190, + 0xAEBA: 0xE191, + 0xAEBB: 0xE192, + 0xAEBC: 0xE193, + 0xAEBD: 0xE194, + 0xAEBE: 0xE195, + 0xAEBF: 0xE196, + 0xAEC0: 0xE197, + 0xAEC1: 0xE198, + 0xAEC2: 0xE199, + 0xAEC3: 0xE19A, + 0xAEC4: 0xE19B, + 0xAEC5: 0xE19C, + 0xAEC6: 0xE19D, + 0xAEC7: 0xE19E, + 0xAEC8: 0xE19F, + 0xAEC9: 0xE1A0, + 0xAECA: 0xE1A1, + 0xAECB: 0xE1A2, + 0xAECC: 0xE1A3, + 0xAECD: 0xE1A4, + 0xAECE: 0xE1A5, + 0xAECF: 0xE1A6, + 0xAED0: 0xE1A7, + 0xAED1: 0xE1A8, + 0xAED2: 0xE1A9, + 0xAED3: 0xE1AA, + 0xAED4: 0xE1AB, + 0xAED5: 0xE1AC, + 0xAED6: 0xE1AD, + 0xAED7: 0xE1AE, + 0xAED8: 0xE1AF, + 0xAED9: 0xE1B0, + 0xAEDA: 0xE1B1, + 0xAEDB: 0xE1B2, + 0xAEDC: 0xE1B3, + 0xAEDD: 0xE1B4, + 0xAEDE: 0xE1B5, + 0xAEDF: 0xE1B6, + 0xAEE0: 0xE1B7, + 0xAEE1: 0xE1B8, + 0xAEE2: 0xE1B9, + 0xAEE3: 0xE1BA, + 0xAEE4: 0xE1BB, + 0xAEE5: 0xE1BC, + 0xAEE6: 0xE1BD, + 0xAEE7: 0xE1BE, + 0xAEE8: 0xE1BF, + 0xAEE9: 0xE1C0, + 0xAEEA: 0xE1C1, + 0xAEEB: 0xE1C2, + 0xAEEC: 0xE1C3, + 0xAEED: 0xE1C4, + 0xAEEE: 0xE1C5, + 0xAEEF: 0xE1C6, + 0xAEF0: 0xE1C7, + 0xAEF1: 0xE1C8, + 0xAEF2: 0xE1C9, + 0xAEF3: 0xE1CA, + 0xAEF4: 0xE1CB, + 0xAEF5: 0xE1CC, + 0xAEF6: 0xE1CD, + 0xAEF7: 0xE1CE, + 0xAEF8: 0xE1CF, + 0xAEF9: 0xE1D0, + 0xAEFA: 0xE1D1, + 0xAEFB: 0xE1D2, + 0xAEFC: 0xE1D3, + 0xAEFD: 0xE1D4, + 0xAEFE: 0xE1D5, + 0xAF40: 0x7588, + 0xAF41: 0x7589, + 0xAF42: 0x758A, + 0xAF43: 0x758C, + 0xAF44: 0x758D, + 0xAF45: 0x758E, + 0xAF46: 0x7590, + 0xAF47: 0x7593, + 0xAF48: 0x7595, + 0xAF49: 0x7598, + 0xAF4A: 0x759B, + 0xAF4B: 0x759C, + 0xAF4C: 0x759E, + 0xAF4D: 0x75A2, + 0xAF4E: 0x75A6, + 0xAF4F: 0x75A7, + 0xAF50: 0x75A8, + 0xAF51: 0x75A9, + 0xAF52: 0x75AA, + 0xAF53: 0x75AD, + 0xAF54: 0x75B6, + 0xAF55: 0x75B7, + 0xAF56: 0x75BA, + 0xAF57: 0x75BB, + 0xAF58: 0x75BF, + 0xAF59: 0x75C0, + 0xAF5A: 0x75C1, + 0xAF5B: 0x75C6, + 0xAF5C: 0x75CB, + 0xAF5D: 0x75CC, + 0xAF5E: 0x75CE, + 0xAF5F: 0x75CF, + 0xAF60: 0x75D0, + 0xAF61: 0x75D1, + 0xAF62: 0x75D3, + 0xAF63: 0x75D7, + 0xAF64: 0x75D9, + 0xAF65: 0x75DA, + 0xAF66: 0x75DC, + 0xAF67: 0x75DD, + 0xAF68: 0x75DF, + 0xAF69: 0x75E0, + 0xAF6A: 0x75E1, + 0xAF6B: 0x75E5, + 0xAF6C: 0x75E9, + 0xAF6D: 0x75EC, + 0xAF6E: 0x75ED, + 0xAF6F: 0x75EE, + 0xAF70: 0x75EF, + 0xAF71: 0x75F2, + 0xAF72: 0x75F3, + 0xAF73: 0x75F5, + 0xAF74: 0x75F6, + 0xAF75: 0x75F7, + 0xAF76: 0x75F8, + 0xAF77: 0x75FA, + 0xAF78: 0x75FB, + 0xAF79: 0x75FD, + 0xAF7A: 0x75FE, + 0xAF7B: 0x7602, + 0xAF7C: 0x7604, + 0xAF7D: 0x7606, + 0xAF7E: 0x7607, + 0xAF80: 0x7608, + 0xAF81: 0x7609, + 0xAF82: 0x760B, + 0xAF83: 0x760D, + 0xAF84: 0x760E, + 0xAF85: 0x760F, + 0xAF86: 0x7611, + 0xAF87: 0x7612, + 0xAF88: 0x7613, + 0xAF89: 0x7614, + 0xAF8A: 0x7616, + 0xAF8B: 0x761A, + 0xAF8C: 0x761C, + 0xAF8D: 0x761D, + 0xAF8E: 0x761E, + 0xAF8F: 0x7621, + 0xAF90: 0x7623, + 0xAF91: 0x7627, + 0xAF92: 0x7628, + 0xAF93: 0x762C, + 0xAF94: 0x762E, + 0xAF95: 0x762F, + 0xAF96: 0x7631, + 0xAF97: 0x7632, + 0xAF98: 0x7636, + 0xAF99: 0x7637, + 0xAF9A: 0x7639, + 0xAF9B: 0x763A, + 0xAF9C: 0x763B, + 0xAF9D: 0x763D, + 0xAF9E: 0x7641, + 0xAF9F: 0x7642, + 0xAFA0: 0x7644, + 0xAFA1: 0xE1D6, + 0xAFA2: 0xE1D7, + 0xAFA3: 0xE1D8, + 0xAFA4: 0xE1D9, + 0xAFA5: 0xE1DA, + 0xAFA6: 0xE1DB, + 0xAFA7: 0xE1DC, + 0xAFA8: 0xE1DD, + 0xAFA9: 0xE1DE, + 0xAFAA: 0xE1DF, + 0xAFAB: 0xE1E0, + 0xAFAC: 0xE1E1, + 0xAFAD: 0xE1E2, + 0xAFAE: 0xE1E3, + 0xAFAF: 0xE1E4, + 0xAFB0: 0xE1E5, + 0xAFB1: 0xE1E6, + 0xAFB2: 0xE1E7, + 0xAFB3: 0xE1E8, + 0xAFB4: 0xE1E9, + 0xAFB5: 0xE1EA, + 0xAFB6: 0xE1EB, + 0xAFB7: 0xE1EC, + 0xAFB8: 0xE1ED, + 0xAFB9: 0xE1EE, + 0xAFBA: 0xE1EF, + 0xAFBB: 0xE1F0, + 0xAFBC: 0xE1F1, + 0xAFBD: 0xE1F2, + 0xAFBE: 0xE1F3, + 0xAFBF: 0xE1F4, + 0xAFC0: 0xE1F5, + 0xAFC1: 0xE1F6, + 0xAFC2: 0xE1F7, + 0xAFC3: 0xE1F8, + 0xAFC4: 0xE1F9, + 0xAFC5: 0xE1FA, + 0xAFC6: 0xE1FB, + 0xAFC7: 0xE1FC, + 0xAFC8: 0xE1FD, + 0xAFC9: 0xE1FE, + 0xAFCA: 0xE1FF, + 0xAFCB: 0xE200, + 0xAFCC: 0xE201, + 0xAFCD: 0xE202, + 0xAFCE: 0xE203, + 0xAFCF: 0xE204, + 0xAFD0: 0xE205, + 0xAFD1: 0xE206, + 0xAFD2: 0xE207, + 0xAFD3: 0xE208, + 0xAFD4: 0xE209, + 0xAFD5: 0xE20A, + 0xAFD6: 0xE20B, + 0xAFD7: 0xE20C, + 0xAFD8: 0xE20D, + 0xAFD9: 0xE20E, + 0xAFDA: 0xE20F, + 0xAFDB: 0xE210, + 0xAFDC: 0xE211, + 0xAFDD: 0xE212, + 0xAFDE: 0xE213, + 0xAFDF: 0xE214, + 0xAFE0: 0xE215, + 0xAFE1: 0xE216, + 0xAFE2: 0xE217, + 0xAFE3: 0xE218, + 0xAFE4: 0xE219, + 0xAFE5: 0xE21A, + 0xAFE6: 0xE21B, + 0xAFE7: 0xE21C, + 0xAFE8: 0xE21D, + 0xAFE9: 0xE21E, + 0xAFEA: 0xE21F, + 0xAFEB: 0xE220, + 0xAFEC: 0xE221, + 0xAFED: 0xE222, + 0xAFEE: 0xE223, + 0xAFEF: 0xE224, + 0xAFF0: 0xE225, + 0xAFF1: 0xE226, + 0xAFF2: 0xE227, + 0xAFF3: 0xE228, + 0xAFF4: 0xE229, + 0xAFF5: 0xE22A, + 0xAFF6: 0xE22B, + 0xAFF7: 0xE22C, + 0xAFF8: 0xE22D, + 0xAFF9: 0xE22E, + 0xAFFA: 0xE22F, + 0xAFFB: 0xE230, + 0xAFFC: 0xE231, + 0xAFFD: 0xE232, + 0xAFFE: 0xE233, + 0xB040: 0x7645, + 0xB041: 0x7646, + 0xB042: 0x7647, + 0xB043: 0x7648, + 0xB044: 0x7649, + 0xB045: 0x764A, + 0xB046: 0x764B, + 0xB047: 0x764E, + 0xB048: 0x764F, + 0xB049: 0x7650, + 0xB04A: 0x7651, + 0xB04B: 0x7652, + 0xB04C: 0x7653, + 0xB04D: 0x7655, + 0xB04E: 0x7657, + 0xB04F: 0x7658, + 0xB050: 0x7659, + 0xB051: 0x765A, + 0xB052: 0x765B, + 0xB053: 0x765D, + 0xB054: 0x765F, + 0xB055: 0x7660, + 0xB056: 0x7661, + 0xB057: 0x7662, + 0xB058: 0x7664, + 0xB059: 0x7665, + 0xB05A: 0x7666, + 0xB05B: 0x7667, + 0xB05C: 0x7668, + 0xB05D: 0x7669, + 0xB05E: 0x766A, + 0xB05F: 0x766C, + 0xB060: 0x766D, + 0xB061: 0x766E, + 0xB062: 0x7670, + 0xB063: 0x7671, + 0xB064: 0x7672, + 0xB065: 0x7673, + 0xB066: 0x7674, + 0xB067: 0x7675, + 0xB068: 0x7676, + 0xB069: 0x7677, + 0xB06A: 0x7679, + 0xB06B: 0x767A, + 0xB06C: 0x767C, + 0xB06D: 0x767F, + 0xB06E: 0x7680, + 0xB06F: 0x7681, + 0xB070: 0x7683, + 0xB071: 0x7685, + 0xB072: 0x7689, + 0xB073: 0x768A, + 0xB074: 0x768C, + 0xB075: 0x768D, + 0xB076: 0x768F, + 0xB077: 0x7690, + 0xB078: 0x7692, + 0xB079: 0x7694, + 0xB07A: 0x7695, + 0xB07B: 0x7697, + 0xB07C: 0x7698, + 0xB07D: 0x769A, + 0xB07E: 0x769B, + 0xB080: 0x769C, + 0xB081: 0x769D, + 0xB082: 0x769E, + 0xB083: 0x769F, + 0xB084: 0x76A0, + 0xB085: 0x76A1, + 0xB086: 0x76A2, + 0xB087: 0x76A3, + 0xB088: 0x76A5, + 0xB089: 0x76A6, + 0xB08A: 0x76A7, + 0xB08B: 0x76A8, + 0xB08C: 0x76A9, + 0xB08D: 0x76AA, + 0xB08E: 0x76AB, + 0xB08F: 0x76AC, + 0xB090: 0x76AD, + 0xB091: 0x76AF, + 0xB092: 0x76B0, + 0xB093: 0x76B3, + 0xB094: 0x76B5, + 0xB095: 0x76B6, + 0xB096: 0x76B7, + 0xB097: 0x76B8, + 0xB098: 0x76B9, + 0xB099: 0x76BA, + 0xB09A: 0x76BB, + 0xB09B: 0x76BC, + 0xB09C: 0x76BD, + 0xB09D: 0x76BE, + 0xB09E: 0x76C0, + 0xB09F: 0x76C1, + 0xB0A0: 0x76C3, + 0xB0A1: 0x554A, + 0xB0A2: 0x963F, + 0xB0A3: 0x57C3, + 0xB0A4: 0x6328, + 0xB0A5: 0x54CE, + 0xB0A6: 0x5509, + 0xB0A7: 0x54C0, + 0xB0A8: 0x7691, + 0xB0A9: 0x764C, + 0xB0AA: 0x853C, + 0xB0AB: 0x77EE, + 0xB0AC: 0x827E, + 0xB0AD: 0x788D, + 0xB0AE: 0x7231, + 0xB0AF: 0x9698, + 0xB0B0: 0x978D, + 0xB0B1: 0x6C28, + 0xB0B2: 0x5B89, + 0xB0B3: 0x4FFA, + 0xB0B4: 0x6309, + 0xB0B5: 0x6697, + 0xB0B6: 0x5CB8, + 0xB0B7: 0x80FA, + 0xB0B8: 0x6848, + 0xB0B9: 0x80AE, + 0xB0BA: 0x6602, + 0xB0BB: 0x76CE, + 0xB0BC: 0x51F9, + 0xB0BD: 0x6556, + 0xB0BE: 0x71AC, + 0xB0BF: 0x7FF1, + 0xB0C0: 0x8884, + 0xB0C1: 0x50B2, + 0xB0C2: 0x5965, + 0xB0C3: 0x61CA, + 0xB0C4: 0x6FB3, + 0xB0C5: 0x82AD, + 0xB0C6: 0x634C, + 0xB0C7: 0x6252, + 0xB0C8: 0x53ED, + 0xB0C9: 0x5427, + 0xB0CA: 0x7B06, + 0xB0CB: 0x516B, + 0xB0CC: 0x75A4, + 0xB0CD: 0x5DF4, + 0xB0CE: 0x62D4, + 0xB0CF: 0x8DCB, + 0xB0D0: 0x9776, + 0xB0D1: 0x628A, + 0xB0D2: 0x8019, + 0xB0D3: 0x575D, + 0xB0D4: 0x9738, + 0xB0D5: 0x7F62, + 0xB0D6: 0x7238, + 0xB0D7: 0x767D, + 0xB0D8: 0x67CF, + 0xB0D9: 0x767E, + 0xB0DA: 0x6446, + 0xB0DB: 0x4F70, + 0xB0DC: 0x8D25, + 0xB0DD: 0x62DC, + 0xB0DE: 0x7A17, + 0xB0DF: 0x6591, + 0xB0E0: 0x73ED, + 0xB0E1: 0x642C, + 0xB0E2: 0x6273, + 0xB0E3: 0x822C, + 0xB0E4: 0x9881, + 0xB0E5: 0x677F, + 0xB0E6: 0x7248, + 0xB0E7: 0x626E, + 0xB0E8: 0x62CC, + 0xB0E9: 0x4F34, + 0xB0EA: 0x74E3, + 0xB0EB: 0x534A, + 0xB0EC: 0x529E, + 0xB0ED: 0x7ECA, + 0xB0EE: 0x90A6, + 0xB0EF: 0x5E2E, + 0xB0F0: 0x6886, + 0xB0F1: 0x699C, + 0xB0F2: 0x8180, + 0xB0F3: 0x7ED1, + 0xB0F4: 0x68D2, + 0xB0F5: 0x78C5, + 0xB0F6: 0x868C, + 0xB0F7: 0x9551, + 0xB0F8: 0x508D, + 0xB0F9: 0x8C24, + 0xB0FA: 0x82DE, + 0xB0FB: 0x80DE, + 0xB0FC: 0x5305, + 0xB0FD: 0x8912, + 0xB0FE: 0x5265, + 0xB140: 0x76C4, + 0xB141: 0x76C7, + 0xB142: 0x76C9, + 0xB143: 0x76CB, + 0xB144: 0x76CC, + 0xB145: 0x76D3, + 0xB146: 0x76D5, + 0xB147: 0x76D9, + 0xB148: 0x76DA, + 0xB149: 0x76DC, + 0xB14A: 0x76DD, + 0xB14B: 0x76DE, + 0xB14C: 0x76E0, + 0xB14D: 0x76E1, + 0xB14E: 0x76E2, + 0xB14F: 0x76E3, + 0xB150: 0x76E4, + 0xB151: 0x76E6, + 0xB152: 0x76E7, + 0xB153: 0x76E8, + 0xB154: 0x76E9, + 0xB155: 0x76EA, + 0xB156: 0x76EB, + 0xB157: 0x76EC, + 0xB158: 0x76ED, + 0xB159: 0x76F0, + 0xB15A: 0x76F3, + 0xB15B: 0x76F5, + 0xB15C: 0x76F6, + 0xB15D: 0x76F7, + 0xB15E: 0x76FA, + 0xB15F: 0x76FB, + 0xB160: 0x76FD, + 0xB161: 0x76FF, + 0xB162: 0x7700, + 0xB163: 0x7702, + 0xB164: 0x7703, + 0xB165: 0x7705, + 0xB166: 0x7706, + 0xB167: 0x770A, + 0xB168: 0x770C, + 0xB169: 0x770E, + 0xB16A: 0x770F, + 0xB16B: 0x7710, + 0xB16C: 0x7711, + 0xB16D: 0x7712, + 0xB16E: 0x7713, + 0xB16F: 0x7714, + 0xB170: 0x7715, + 0xB171: 0x7716, + 0xB172: 0x7717, + 0xB173: 0x7718, + 0xB174: 0x771B, + 0xB175: 0x771C, + 0xB176: 0x771D, + 0xB177: 0x771E, + 0xB178: 0x7721, + 0xB179: 0x7723, + 0xB17A: 0x7724, + 0xB17B: 0x7725, + 0xB17C: 0x7727, + 0xB17D: 0x772A, + 0xB17E: 0x772B, + 0xB180: 0x772C, + 0xB181: 0x772E, + 0xB182: 0x7730, + 0xB183: 0x7731, + 0xB184: 0x7732, + 0xB185: 0x7733, + 0xB186: 0x7734, + 0xB187: 0x7739, + 0xB188: 0x773B, + 0xB189: 0x773D, + 0xB18A: 0x773E, + 0xB18B: 0x773F, + 0xB18C: 0x7742, + 0xB18D: 0x7744, + 0xB18E: 0x7745, + 0xB18F: 0x7746, + 0xB190: 0x7748, + 0xB191: 0x7749, + 0xB192: 0x774A, + 0xB193: 0x774B, + 0xB194: 0x774C, + 0xB195: 0x774D, + 0xB196: 0x774E, + 0xB197: 0x774F, + 0xB198: 0x7752, + 0xB199: 0x7753, + 0xB19A: 0x7754, + 0xB19B: 0x7755, + 0xB19C: 0x7756, + 0xB19D: 0x7757, + 0xB19E: 0x7758, + 0xB19F: 0x7759, + 0xB1A0: 0x775C, + 0xB1A1: 0x8584, + 0xB1A2: 0x96F9, + 0xB1A3: 0x4FDD, + 0xB1A4: 0x5821, + 0xB1A5: 0x9971, + 0xB1A6: 0x5B9D, + 0xB1A7: 0x62B1, + 0xB1A8: 0x62A5, + 0xB1A9: 0x66B4, + 0xB1AA: 0x8C79, + 0xB1AB: 0x9C8D, + 0xB1AC: 0x7206, + 0xB1AD: 0x676F, + 0xB1AE: 0x7891, + 0xB1AF: 0x60B2, + 0xB1B0: 0x5351, + 0xB1B1: 0x5317, + 0xB1B2: 0x8F88, + 0xB1B3: 0x80CC, + 0xB1B4: 0x8D1D, + 0xB1B5: 0x94A1, + 0xB1B6: 0x500D, + 0xB1B7: 0x72C8, + 0xB1B8: 0x5907, + 0xB1B9: 0x60EB, + 0xB1BA: 0x7119, + 0xB1BB: 0x88AB, + 0xB1BC: 0x5954, + 0xB1BD: 0x82EF, + 0xB1BE: 0x672C, + 0xB1BF: 0x7B28, + 0xB1C0: 0x5D29, + 0xB1C1: 0x7EF7, + 0xB1C2: 0x752D, + 0xB1C3: 0x6CF5, + 0xB1C4: 0x8E66, + 0xB1C5: 0x8FF8, + 0xB1C6: 0x903C, + 0xB1C7: 0x9F3B, + 0xB1C8: 0x6BD4, + 0xB1C9: 0x9119, + 0xB1CA: 0x7B14, + 0xB1CB: 0x5F7C, + 0xB1CC: 0x78A7, + 0xB1CD: 0x84D6, + 0xB1CE: 0x853D, + 0xB1CF: 0x6BD5, + 0xB1D0: 0x6BD9, + 0xB1D1: 0x6BD6, + 0xB1D2: 0x5E01, + 0xB1D3: 0x5E87, + 0xB1D4: 0x75F9, + 0xB1D5: 0x95ED, + 0xB1D6: 0x655D, + 0xB1D7: 0x5F0A, + 0xB1D8: 0x5FC5, + 0xB1D9: 0x8F9F, + 0xB1DA: 0x58C1, + 0xB1DB: 0x81C2, + 0xB1DC: 0x907F, + 0xB1DD: 0x965B, + 0xB1DE: 0x97AD, + 0xB1DF: 0x8FB9, + 0xB1E0: 0x7F16, + 0xB1E1: 0x8D2C, + 0xB1E2: 0x6241, + 0xB1E3: 0x4FBF, + 0xB1E4: 0x53D8, + 0xB1E5: 0x535E, + 0xB1E6: 0x8FA8, + 0xB1E7: 0x8FA9, + 0xB1E8: 0x8FAB, + 0xB1E9: 0x904D, + 0xB1EA: 0x6807, + 0xB1EB: 0x5F6A, + 0xB1EC: 0x8198, + 0xB1ED: 0x8868, + 0xB1EE: 0x9CD6, + 0xB1EF: 0x618B, + 0xB1F0: 0x522B, + 0xB1F1: 0x762A, + 0xB1F2: 0x5F6C, + 0xB1F3: 0x658C, + 0xB1F4: 0x6FD2, + 0xB1F5: 0x6EE8, + 0xB1F6: 0x5BBE, + 0xB1F7: 0x6448, + 0xB1F8: 0x5175, + 0xB1F9: 0x51B0, + 0xB1FA: 0x67C4, + 0xB1FB: 0x4E19, + 0xB1FC: 0x79C9, + 0xB1FD: 0x997C, + 0xB1FE: 0x70B3, + 0xB240: 0x775D, + 0xB241: 0x775E, + 0xB242: 0x775F, + 0xB243: 0x7760, + 0xB244: 0x7764, + 0xB245: 0x7767, + 0xB246: 0x7769, + 0xB247: 0x776A, + 0xB248: 0x776D, + 0xB249: 0x776E, + 0xB24A: 0x776F, + 0xB24B: 0x7770, + 0xB24C: 0x7771, + 0xB24D: 0x7772, + 0xB24E: 0x7773, + 0xB24F: 0x7774, + 0xB250: 0x7775, + 0xB251: 0x7776, + 0xB252: 0x7777, + 0xB253: 0x7778, + 0xB254: 0x777A, + 0xB255: 0x777B, + 0xB256: 0x777C, + 0xB257: 0x7781, + 0xB258: 0x7782, + 0xB259: 0x7783, + 0xB25A: 0x7786, + 0xB25B: 0x7787, + 0xB25C: 0x7788, + 0xB25D: 0x7789, + 0xB25E: 0x778A, + 0xB25F: 0x778B, + 0xB260: 0x778F, + 0xB261: 0x7790, + 0xB262: 0x7793, + 0xB263: 0x7794, + 0xB264: 0x7795, + 0xB265: 0x7796, + 0xB266: 0x7797, + 0xB267: 0x7798, + 0xB268: 0x7799, + 0xB269: 0x779A, + 0xB26A: 0x779B, + 0xB26B: 0x779C, + 0xB26C: 0x779D, + 0xB26D: 0x779E, + 0xB26E: 0x77A1, + 0xB26F: 0x77A3, + 0xB270: 0x77A4, + 0xB271: 0x77A6, + 0xB272: 0x77A8, + 0xB273: 0x77AB, + 0xB274: 0x77AD, + 0xB275: 0x77AE, + 0xB276: 0x77AF, + 0xB277: 0x77B1, + 0xB278: 0x77B2, + 0xB279: 0x77B4, + 0xB27A: 0x77B6, + 0xB27B: 0x77B7, + 0xB27C: 0x77B8, + 0xB27D: 0x77B9, + 0xB27E: 0x77BA, + 0xB280: 0x77BC, + 0xB281: 0x77BE, + 0xB282: 0x77C0, + 0xB283: 0x77C1, + 0xB284: 0x77C2, + 0xB285: 0x77C3, + 0xB286: 0x77C4, + 0xB287: 0x77C5, + 0xB288: 0x77C6, + 0xB289: 0x77C7, + 0xB28A: 0x77C8, + 0xB28B: 0x77C9, + 0xB28C: 0x77CA, + 0xB28D: 0x77CB, + 0xB28E: 0x77CC, + 0xB28F: 0x77CE, + 0xB290: 0x77CF, + 0xB291: 0x77D0, + 0xB292: 0x77D1, + 0xB293: 0x77D2, + 0xB294: 0x77D3, + 0xB295: 0x77D4, + 0xB296: 0x77D5, + 0xB297: 0x77D6, + 0xB298: 0x77D8, + 0xB299: 0x77D9, + 0xB29A: 0x77DA, + 0xB29B: 0x77DD, + 0xB29C: 0x77DE, + 0xB29D: 0x77DF, + 0xB29E: 0x77E0, + 0xB29F: 0x77E1, + 0xB2A0: 0x77E4, + 0xB2A1: 0x75C5, + 0xB2A2: 0x5E76, + 0xB2A3: 0x73BB, + 0xB2A4: 0x83E0, + 0xB2A5: 0x64AD, + 0xB2A6: 0x62E8, + 0xB2A7: 0x94B5, + 0xB2A8: 0x6CE2, + 0xB2A9: 0x535A, + 0xB2AA: 0x52C3, + 0xB2AB: 0x640F, + 0xB2AC: 0x94C2, + 0xB2AD: 0x7B94, + 0xB2AE: 0x4F2F, + 0xB2AF: 0x5E1B, + 0xB2B0: 0x8236, + 0xB2B1: 0x8116, + 0xB2B2: 0x818A, + 0xB2B3: 0x6E24, + 0xB2B4: 0x6CCA, + 0xB2B5: 0x9A73, + 0xB2B6: 0x6355, + 0xB2B7: 0x535C, + 0xB2B8: 0x54FA, + 0xB2B9: 0x8865, + 0xB2BA: 0x57E0, + 0xB2BB: 0x4E0D, + 0xB2BC: 0x5E03, + 0xB2BD: 0x6B65, + 0xB2BE: 0x7C3F, + 0xB2BF: 0x90E8, + 0xB2C0: 0x6016, + 0xB2C1: 0x64E6, + 0xB2C2: 0x731C, + 0xB2C3: 0x88C1, + 0xB2C4: 0x6750, + 0xB2C5: 0x624D, + 0xB2C6: 0x8D22, + 0xB2C7: 0x776C, + 0xB2C8: 0x8E29, + 0xB2C9: 0x91C7, + 0xB2CA: 0x5F69, + 0xB2CB: 0x83DC, + 0xB2CC: 0x8521, + 0xB2CD: 0x9910, + 0xB2CE: 0x53C2, + 0xB2CF: 0x8695, + 0xB2D0: 0x6B8B, + 0xB2D1: 0x60ED, + 0xB2D2: 0x60E8, + 0xB2D3: 0x707F, + 0xB2D4: 0x82CD, + 0xB2D5: 0x8231, + 0xB2D6: 0x4ED3, + 0xB2D7: 0x6CA7, + 0xB2D8: 0x85CF, + 0xB2D9: 0x64CD, + 0xB2DA: 0x7CD9, + 0xB2DB: 0x69FD, + 0xB2DC: 0x66F9, + 0xB2DD: 0x8349, + 0xB2DE: 0x5395, + 0xB2DF: 0x7B56, + 0xB2E0: 0x4FA7, + 0xB2E1: 0x518C, + 0xB2E2: 0x6D4B, + 0xB2E3: 0x5C42, + 0xB2E4: 0x8E6D, + 0xB2E5: 0x63D2, + 0xB2E6: 0x53C9, + 0xB2E7: 0x832C, + 0xB2E8: 0x8336, + 0xB2E9: 0x67E5, + 0xB2EA: 0x78B4, + 0xB2EB: 0x643D, + 0xB2EC: 0x5BDF, + 0xB2ED: 0x5C94, + 0xB2EE: 0x5DEE, + 0xB2EF: 0x8BE7, + 0xB2F0: 0x62C6, + 0xB2F1: 0x67F4, + 0xB2F2: 0x8C7A, + 0xB2F3: 0x6400, + 0xB2F4: 0x63BA, + 0xB2F5: 0x8749, + 0xB2F6: 0x998B, + 0xB2F7: 0x8C17, + 0xB2F8: 0x7F20, + 0xB2F9: 0x94F2, + 0xB2FA: 0x4EA7, + 0xB2FB: 0x9610, + 0xB2FC: 0x98A4, + 0xB2FD: 0x660C, + 0xB2FE: 0x7316, + 0xB340: 0x77E6, + 0xB341: 0x77E8, + 0xB342: 0x77EA, + 0xB343: 0x77EF, + 0xB344: 0x77F0, + 0xB345: 0x77F1, + 0xB346: 0x77F2, + 0xB347: 0x77F4, + 0xB348: 0x77F5, + 0xB349: 0x77F7, + 0xB34A: 0x77F9, + 0xB34B: 0x77FA, + 0xB34C: 0x77FB, + 0xB34D: 0x77FC, + 0xB34E: 0x7803, + 0xB34F: 0x7804, + 0xB350: 0x7805, + 0xB351: 0x7806, + 0xB352: 0x7807, + 0xB353: 0x7808, + 0xB354: 0x780A, + 0xB355: 0x780B, + 0xB356: 0x780E, + 0xB357: 0x780F, + 0xB358: 0x7810, + 0xB359: 0x7813, + 0xB35A: 0x7815, + 0xB35B: 0x7819, + 0xB35C: 0x781B, + 0xB35D: 0x781E, + 0xB35E: 0x7820, + 0xB35F: 0x7821, + 0xB360: 0x7822, + 0xB361: 0x7824, + 0xB362: 0x7828, + 0xB363: 0x782A, + 0xB364: 0x782B, + 0xB365: 0x782E, + 0xB366: 0x782F, + 0xB367: 0x7831, + 0xB368: 0x7832, + 0xB369: 0x7833, + 0xB36A: 0x7835, + 0xB36B: 0x7836, + 0xB36C: 0x783D, + 0xB36D: 0x783F, + 0xB36E: 0x7841, + 0xB36F: 0x7842, + 0xB370: 0x7843, + 0xB371: 0x7844, + 0xB372: 0x7846, + 0xB373: 0x7848, + 0xB374: 0x7849, + 0xB375: 0x784A, + 0xB376: 0x784B, + 0xB377: 0x784D, + 0xB378: 0x784F, + 0xB379: 0x7851, + 0xB37A: 0x7853, + 0xB37B: 0x7854, + 0xB37C: 0x7858, + 0xB37D: 0x7859, + 0xB37E: 0x785A, + 0xB380: 0x785B, + 0xB381: 0x785C, + 0xB382: 0x785E, + 0xB383: 0x785F, + 0xB384: 0x7860, + 0xB385: 0x7861, + 0xB386: 0x7862, + 0xB387: 0x7863, + 0xB388: 0x7864, + 0xB389: 0x7865, + 0xB38A: 0x7866, + 0xB38B: 0x7867, + 0xB38C: 0x7868, + 0xB38D: 0x7869, + 0xB38E: 0x786F, + 0xB38F: 0x7870, + 0xB390: 0x7871, + 0xB391: 0x7872, + 0xB392: 0x7873, + 0xB393: 0x7874, + 0xB394: 0x7875, + 0xB395: 0x7876, + 0xB396: 0x7878, + 0xB397: 0x7879, + 0xB398: 0x787A, + 0xB399: 0x787B, + 0xB39A: 0x787D, + 0xB39B: 0x787E, + 0xB39C: 0x787F, + 0xB39D: 0x7880, + 0xB39E: 0x7881, + 0xB39F: 0x7882, + 0xB3A0: 0x7883, + 0xB3A1: 0x573A, + 0xB3A2: 0x5C1D, + 0xB3A3: 0x5E38, + 0xB3A4: 0x957F, + 0xB3A5: 0x507F, + 0xB3A6: 0x80A0, + 0xB3A7: 0x5382, + 0xB3A8: 0x655E, + 0xB3A9: 0x7545, + 0xB3AA: 0x5531, + 0xB3AB: 0x5021, + 0xB3AC: 0x8D85, + 0xB3AD: 0x6284, + 0xB3AE: 0x949E, + 0xB3AF: 0x671D, + 0xB3B0: 0x5632, + 0xB3B1: 0x6F6E, + 0xB3B2: 0x5DE2, + 0xB3B3: 0x5435, + 0xB3B4: 0x7092, + 0xB3B5: 0x8F66, + 0xB3B6: 0x626F, + 0xB3B7: 0x64A4, + 0xB3B8: 0x63A3, + 0xB3B9: 0x5F7B, + 0xB3BA: 0x6F88, + 0xB3BB: 0x90F4, + 0xB3BC: 0x81E3, + 0xB3BD: 0x8FB0, + 0xB3BE: 0x5C18, + 0xB3BF: 0x6668, + 0xB3C0: 0x5FF1, + 0xB3C1: 0x6C89, + 0xB3C2: 0x9648, + 0xB3C3: 0x8D81, + 0xB3C4: 0x886C, + 0xB3C5: 0x6491, + 0xB3C6: 0x79F0, + 0xB3C7: 0x57CE, + 0xB3C8: 0x6A59, + 0xB3C9: 0x6210, + 0xB3CA: 0x5448, + 0xB3CB: 0x4E58, + 0xB3CC: 0x7A0B, + 0xB3CD: 0x60E9, + 0xB3CE: 0x6F84, + 0xB3CF: 0x8BDA, + 0xB3D0: 0x627F, + 0xB3D1: 0x901E, + 0xB3D2: 0x9A8B, + 0xB3D3: 0x79E4, + 0xB3D4: 0x5403, + 0xB3D5: 0x75F4, + 0xB3D6: 0x6301, + 0xB3D7: 0x5319, + 0xB3D8: 0x6C60, + 0xB3D9: 0x8FDF, + 0xB3DA: 0x5F1B, + 0xB3DB: 0x9A70, + 0xB3DC: 0x803B, + 0xB3DD: 0x9F7F, + 0xB3DE: 0x4F88, + 0xB3DF: 0x5C3A, + 0xB3E0: 0x8D64, + 0xB3E1: 0x7FC5, + 0xB3E2: 0x65A5, + 0xB3E3: 0x70BD, + 0xB3E4: 0x5145, + 0xB3E5: 0x51B2, + 0xB3E6: 0x866B, + 0xB3E7: 0x5D07, + 0xB3E8: 0x5BA0, + 0xB3E9: 0x62BD, + 0xB3EA: 0x916C, + 0xB3EB: 0x7574, + 0xB3EC: 0x8E0C, + 0xB3ED: 0x7A20, + 0xB3EE: 0x6101, + 0xB3EF: 0x7B79, + 0xB3F0: 0x4EC7, + 0xB3F1: 0x7EF8, + 0xB3F2: 0x7785, + 0xB3F3: 0x4E11, + 0xB3F4: 0x81ED, + 0xB3F5: 0x521D, + 0xB3F6: 0x51FA, + 0xB3F7: 0x6A71, + 0xB3F8: 0x53A8, + 0xB3F9: 0x8E87, + 0xB3FA: 0x9504, + 0xB3FB: 0x96CF, + 0xB3FC: 0x6EC1, + 0xB3FD: 0x9664, + 0xB3FE: 0x695A, + 0xB440: 0x7884, + 0xB441: 0x7885, + 0xB442: 0x7886, + 0xB443: 0x7888, + 0xB444: 0x788A, + 0xB445: 0x788B, + 0xB446: 0x788F, + 0xB447: 0x7890, + 0xB448: 0x7892, + 0xB449: 0x7894, + 0xB44A: 0x7895, + 0xB44B: 0x7896, + 0xB44C: 0x7899, + 0xB44D: 0x789D, + 0xB44E: 0x789E, + 0xB44F: 0x78A0, + 0xB450: 0x78A2, + 0xB451: 0x78A4, + 0xB452: 0x78A6, + 0xB453: 0x78A8, + 0xB454: 0x78A9, + 0xB455: 0x78AA, + 0xB456: 0x78AB, + 0xB457: 0x78AC, + 0xB458: 0x78AD, + 0xB459: 0x78AE, + 0xB45A: 0x78AF, + 0xB45B: 0x78B5, + 0xB45C: 0x78B6, + 0xB45D: 0x78B7, + 0xB45E: 0x78B8, + 0xB45F: 0x78BA, + 0xB460: 0x78BB, + 0xB461: 0x78BC, + 0xB462: 0x78BD, + 0xB463: 0x78BF, + 0xB464: 0x78C0, + 0xB465: 0x78C2, + 0xB466: 0x78C3, + 0xB467: 0x78C4, + 0xB468: 0x78C6, + 0xB469: 0x78C7, + 0xB46A: 0x78C8, + 0xB46B: 0x78CC, + 0xB46C: 0x78CD, + 0xB46D: 0x78CE, + 0xB46E: 0x78CF, + 0xB46F: 0x78D1, + 0xB470: 0x78D2, + 0xB471: 0x78D3, + 0xB472: 0x78D6, + 0xB473: 0x78D7, + 0xB474: 0x78D8, + 0xB475: 0x78DA, + 0xB476: 0x78DB, + 0xB477: 0x78DC, + 0xB478: 0x78DD, + 0xB479: 0x78DE, + 0xB47A: 0x78DF, + 0xB47B: 0x78E0, + 0xB47C: 0x78E1, + 0xB47D: 0x78E2, + 0xB47E: 0x78E3, + 0xB480: 0x78E4, + 0xB481: 0x78E5, + 0xB482: 0x78E6, + 0xB483: 0x78E7, + 0xB484: 0x78E9, + 0xB485: 0x78EA, + 0xB486: 0x78EB, + 0xB487: 0x78ED, + 0xB488: 0x78EE, + 0xB489: 0x78EF, + 0xB48A: 0x78F0, + 0xB48B: 0x78F1, + 0xB48C: 0x78F3, + 0xB48D: 0x78F5, + 0xB48E: 0x78F6, + 0xB48F: 0x78F8, + 0xB490: 0x78F9, + 0xB491: 0x78FB, + 0xB492: 0x78FC, + 0xB493: 0x78FD, + 0xB494: 0x78FE, + 0xB495: 0x78FF, + 0xB496: 0x7900, + 0xB497: 0x7902, + 0xB498: 0x7903, + 0xB499: 0x7904, + 0xB49A: 0x7906, + 0xB49B: 0x7907, + 0xB49C: 0x7908, + 0xB49D: 0x7909, + 0xB49E: 0x790A, + 0xB49F: 0x790B, + 0xB4A0: 0x790C, + 0xB4A1: 0x7840, + 0xB4A2: 0x50A8, + 0xB4A3: 0x77D7, + 0xB4A4: 0x6410, + 0xB4A5: 0x89E6, + 0xB4A6: 0x5904, + 0xB4A7: 0x63E3, + 0xB4A8: 0x5DDD, + 0xB4A9: 0x7A7F, + 0xB4AA: 0x693D, + 0xB4AB: 0x4F20, + 0xB4AC: 0x8239, + 0xB4AD: 0x5598, + 0xB4AE: 0x4E32, + 0xB4AF: 0x75AE, + 0xB4B0: 0x7A97, + 0xB4B1: 0x5E62, + 0xB4B2: 0x5E8A, + 0xB4B3: 0x95EF, + 0xB4B4: 0x521B, + 0xB4B5: 0x5439, + 0xB4B6: 0x708A, + 0xB4B7: 0x6376, + 0xB4B8: 0x9524, + 0xB4B9: 0x5782, + 0xB4BA: 0x6625, + 0xB4BB: 0x693F, + 0xB4BC: 0x9187, + 0xB4BD: 0x5507, + 0xB4BE: 0x6DF3, + 0xB4BF: 0x7EAF, + 0xB4C0: 0x8822, + 0xB4C1: 0x6233, + 0xB4C2: 0x7EF0, + 0xB4C3: 0x75B5, + 0xB4C4: 0x8328, + 0xB4C5: 0x78C1, + 0xB4C6: 0x96CC, + 0xB4C7: 0x8F9E, + 0xB4C8: 0x6148, + 0xB4C9: 0x74F7, + 0xB4CA: 0x8BCD, + 0xB4CB: 0x6B64, + 0xB4CC: 0x523A, + 0xB4CD: 0x8D50, + 0xB4CE: 0x6B21, + 0xB4CF: 0x806A, + 0xB4D0: 0x8471, + 0xB4D1: 0x56F1, + 0xB4D2: 0x5306, + 0xB4D3: 0x4ECE, + 0xB4D4: 0x4E1B, + 0xB4D5: 0x51D1, + 0xB4D6: 0x7C97, + 0xB4D7: 0x918B, + 0xB4D8: 0x7C07, + 0xB4D9: 0x4FC3, + 0xB4DA: 0x8E7F, + 0xB4DB: 0x7BE1, + 0xB4DC: 0x7A9C, + 0xB4DD: 0x6467, + 0xB4DE: 0x5D14, + 0xB4DF: 0x50AC, + 0xB4E0: 0x8106, + 0xB4E1: 0x7601, + 0xB4E2: 0x7CB9, + 0xB4E3: 0x6DEC, + 0xB4E4: 0x7FE0, + 0xB4E5: 0x6751, + 0xB4E6: 0x5B58, + 0xB4E7: 0x5BF8, + 0xB4E8: 0x78CB, + 0xB4E9: 0x64AE, + 0xB4EA: 0x6413, + 0xB4EB: 0x63AA, + 0xB4EC: 0x632B, + 0xB4ED: 0x9519, + 0xB4EE: 0x642D, + 0xB4EF: 0x8FBE, + 0xB4F0: 0x7B54, + 0xB4F1: 0x7629, + 0xB4F2: 0x6253, + 0xB4F3: 0x5927, + 0xB4F4: 0x5446, + 0xB4F5: 0x6B79, + 0xB4F6: 0x50A3, + 0xB4F7: 0x6234, + 0xB4F8: 0x5E26, + 0xB4F9: 0x6B86, + 0xB4FA: 0x4EE3, + 0xB4FB: 0x8D37, + 0xB4FC: 0x888B, + 0xB4FD: 0x5F85, + 0xB4FE: 0x902E, + 0xB540: 0x790D, + 0xB541: 0x790E, + 0xB542: 0x790F, + 0xB543: 0x7910, + 0xB544: 0x7911, + 0xB545: 0x7912, + 0xB546: 0x7914, + 0xB547: 0x7915, + 0xB548: 0x7916, + 0xB549: 0x7917, + 0xB54A: 0x7918, + 0xB54B: 0x7919, + 0xB54C: 0x791A, + 0xB54D: 0x791B, + 0xB54E: 0x791C, + 0xB54F: 0x791D, + 0xB550: 0x791F, + 0xB551: 0x7920, + 0xB552: 0x7921, + 0xB553: 0x7922, + 0xB554: 0x7923, + 0xB555: 0x7925, + 0xB556: 0x7926, + 0xB557: 0x7927, + 0xB558: 0x7928, + 0xB559: 0x7929, + 0xB55A: 0x792A, + 0xB55B: 0x792B, + 0xB55C: 0x792C, + 0xB55D: 0x792D, + 0xB55E: 0x792E, + 0xB55F: 0x792F, + 0xB560: 0x7930, + 0xB561: 0x7931, + 0xB562: 0x7932, + 0xB563: 0x7933, + 0xB564: 0x7935, + 0xB565: 0x7936, + 0xB566: 0x7937, + 0xB567: 0x7938, + 0xB568: 0x7939, + 0xB569: 0x793D, + 0xB56A: 0x793F, + 0xB56B: 0x7942, + 0xB56C: 0x7943, + 0xB56D: 0x7944, + 0xB56E: 0x7945, + 0xB56F: 0x7947, + 0xB570: 0x794A, + 0xB571: 0x794B, + 0xB572: 0x794C, + 0xB573: 0x794D, + 0xB574: 0x794E, + 0xB575: 0x794F, + 0xB576: 0x7950, + 0xB577: 0x7951, + 0xB578: 0x7952, + 0xB579: 0x7954, + 0xB57A: 0x7955, + 0xB57B: 0x7958, + 0xB57C: 0x7959, + 0xB57D: 0x7961, + 0xB57E: 0x7963, + 0xB580: 0x7964, + 0xB581: 0x7966, + 0xB582: 0x7969, + 0xB583: 0x796A, + 0xB584: 0x796B, + 0xB585: 0x796C, + 0xB586: 0x796E, + 0xB587: 0x7970, + 0xB588: 0x7971, + 0xB589: 0x7972, + 0xB58A: 0x7973, + 0xB58B: 0x7974, + 0xB58C: 0x7975, + 0xB58D: 0x7976, + 0xB58E: 0x7979, + 0xB58F: 0x797B, + 0xB590: 0x797C, + 0xB591: 0x797D, + 0xB592: 0x797E, + 0xB593: 0x797F, + 0xB594: 0x7982, + 0xB595: 0x7983, + 0xB596: 0x7986, + 0xB597: 0x7987, + 0xB598: 0x7988, + 0xB599: 0x7989, + 0xB59A: 0x798B, + 0xB59B: 0x798C, + 0xB59C: 0x798D, + 0xB59D: 0x798E, + 0xB59E: 0x7990, + 0xB59F: 0x7991, + 0xB5A0: 0x7992, + 0xB5A1: 0x6020, + 0xB5A2: 0x803D, + 0xB5A3: 0x62C5, + 0xB5A4: 0x4E39, + 0xB5A5: 0x5355, + 0xB5A6: 0x90F8, + 0xB5A7: 0x63B8, + 0xB5A8: 0x80C6, + 0xB5A9: 0x65E6, + 0xB5AA: 0x6C2E, + 0xB5AB: 0x4F46, + 0xB5AC: 0x60EE, + 0xB5AD: 0x6DE1, + 0xB5AE: 0x8BDE, + 0xB5AF: 0x5F39, + 0xB5B0: 0x86CB, + 0xB5B1: 0x5F53, + 0xB5B2: 0x6321, + 0xB5B3: 0x515A, + 0xB5B4: 0x8361, + 0xB5B5: 0x6863, + 0xB5B6: 0x5200, + 0xB5B7: 0x6363, + 0xB5B8: 0x8E48, + 0xB5B9: 0x5012, + 0xB5BA: 0x5C9B, + 0xB5BB: 0x7977, + 0xB5BC: 0x5BFC, + 0xB5BD: 0x5230, + 0xB5BE: 0x7A3B, + 0xB5BF: 0x60BC, + 0xB5C0: 0x9053, + 0xB5C1: 0x76D7, + 0xB5C2: 0x5FB7, + 0xB5C3: 0x5F97, + 0xB5C4: 0x7684, + 0xB5C5: 0x8E6C, + 0xB5C6: 0x706F, + 0xB5C7: 0x767B, + 0xB5C8: 0x7B49, + 0xB5C9: 0x77AA, + 0xB5CA: 0x51F3, + 0xB5CB: 0x9093, + 0xB5CC: 0x5824, + 0xB5CD: 0x4F4E, + 0xB5CE: 0x6EF4, + 0xB5CF: 0x8FEA, + 0xB5D0: 0x654C, + 0xB5D1: 0x7B1B, + 0xB5D2: 0x72C4, + 0xB5D3: 0x6DA4, + 0xB5D4: 0x7FDF, + 0xB5D5: 0x5AE1, + 0xB5D6: 0x62B5, + 0xB5D7: 0x5E95, + 0xB5D8: 0x5730, + 0xB5D9: 0x8482, + 0xB5DA: 0x7B2C, + 0xB5DB: 0x5E1D, + 0xB5DC: 0x5F1F, + 0xB5DD: 0x9012, + 0xB5DE: 0x7F14, + 0xB5DF: 0x98A0, + 0xB5E0: 0x6382, + 0xB5E1: 0x6EC7, + 0xB5E2: 0x7898, + 0xB5E3: 0x70B9, + 0xB5E4: 0x5178, + 0xB5E5: 0x975B, + 0xB5E6: 0x57AB, + 0xB5E7: 0x7535, + 0xB5E8: 0x4F43, + 0xB5E9: 0x7538, + 0xB5EA: 0x5E97, + 0xB5EB: 0x60E6, + 0xB5EC: 0x5960, + 0xB5ED: 0x6DC0, + 0xB5EE: 0x6BBF, + 0xB5EF: 0x7889, + 0xB5F0: 0x53FC, + 0xB5F1: 0x96D5, + 0xB5F2: 0x51CB, + 0xB5F3: 0x5201, + 0xB5F4: 0x6389, + 0xB5F5: 0x540A, + 0xB5F6: 0x9493, + 0xB5F7: 0x8C03, + 0xB5F8: 0x8DCC, + 0xB5F9: 0x7239, + 0xB5FA: 0x789F, + 0xB5FB: 0x8776, + 0xB5FC: 0x8FED, + 0xB5FD: 0x8C0D, + 0xB5FE: 0x53E0, + 0xB640: 0x7993, + 0xB641: 0x7994, + 0xB642: 0x7995, + 0xB643: 0x7996, + 0xB644: 0x7997, + 0xB645: 0x7998, + 0xB646: 0x7999, + 0xB647: 0x799B, + 0xB648: 0x799C, + 0xB649: 0x799D, + 0xB64A: 0x799E, + 0xB64B: 0x799F, + 0xB64C: 0x79A0, + 0xB64D: 0x79A1, + 0xB64E: 0x79A2, + 0xB64F: 0x79A3, + 0xB650: 0x79A4, + 0xB651: 0x79A5, + 0xB652: 0x79A6, + 0xB653: 0x79A8, + 0xB654: 0x79A9, + 0xB655: 0x79AA, + 0xB656: 0x79AB, + 0xB657: 0x79AC, + 0xB658: 0x79AD, + 0xB659: 0x79AE, + 0xB65A: 0x79AF, + 0xB65B: 0x79B0, + 0xB65C: 0x79B1, + 0xB65D: 0x79B2, + 0xB65E: 0x79B4, + 0xB65F: 0x79B5, + 0xB660: 0x79B6, + 0xB661: 0x79B7, + 0xB662: 0x79B8, + 0xB663: 0x79BC, + 0xB664: 0x79BF, + 0xB665: 0x79C2, + 0xB666: 0x79C4, + 0xB667: 0x79C5, + 0xB668: 0x79C7, + 0xB669: 0x79C8, + 0xB66A: 0x79CA, + 0xB66B: 0x79CC, + 0xB66C: 0x79CE, + 0xB66D: 0x79CF, + 0xB66E: 0x79D0, + 0xB66F: 0x79D3, + 0xB670: 0x79D4, + 0xB671: 0x79D6, + 0xB672: 0x79D7, + 0xB673: 0x79D9, + 0xB674: 0x79DA, + 0xB675: 0x79DB, + 0xB676: 0x79DC, + 0xB677: 0x79DD, + 0xB678: 0x79DE, + 0xB679: 0x79E0, + 0xB67A: 0x79E1, + 0xB67B: 0x79E2, + 0xB67C: 0x79E5, + 0xB67D: 0x79E8, + 0xB67E: 0x79EA, + 0xB680: 0x79EC, + 0xB681: 0x79EE, + 0xB682: 0x79F1, + 0xB683: 0x79F2, + 0xB684: 0x79F3, + 0xB685: 0x79F4, + 0xB686: 0x79F5, + 0xB687: 0x79F6, + 0xB688: 0x79F7, + 0xB689: 0x79F9, + 0xB68A: 0x79FA, + 0xB68B: 0x79FC, + 0xB68C: 0x79FE, + 0xB68D: 0x79FF, + 0xB68E: 0x7A01, + 0xB68F: 0x7A04, + 0xB690: 0x7A05, + 0xB691: 0x7A07, + 0xB692: 0x7A08, + 0xB693: 0x7A09, + 0xB694: 0x7A0A, + 0xB695: 0x7A0C, + 0xB696: 0x7A0F, + 0xB697: 0x7A10, + 0xB698: 0x7A11, + 0xB699: 0x7A12, + 0xB69A: 0x7A13, + 0xB69B: 0x7A15, + 0xB69C: 0x7A16, + 0xB69D: 0x7A18, + 0xB69E: 0x7A19, + 0xB69F: 0x7A1B, + 0xB6A0: 0x7A1C, + 0xB6A1: 0x4E01, + 0xB6A2: 0x76EF, + 0xB6A3: 0x53EE, + 0xB6A4: 0x9489, + 0xB6A5: 0x9876, + 0xB6A6: 0x9F0E, + 0xB6A7: 0x952D, + 0xB6A8: 0x5B9A, + 0xB6A9: 0x8BA2, + 0xB6AA: 0x4E22, + 0xB6AB: 0x4E1C, + 0xB6AC: 0x51AC, + 0xB6AD: 0x8463, + 0xB6AE: 0x61C2, + 0xB6AF: 0x52A8, + 0xB6B0: 0x680B, + 0xB6B1: 0x4F97, + 0xB6B2: 0x606B, + 0xB6B3: 0x51BB, + 0xB6B4: 0x6D1E, + 0xB6B5: 0x515C, + 0xB6B6: 0x6296, + 0xB6B7: 0x6597, + 0xB6B8: 0x9661, + 0xB6B9: 0x8C46, + 0xB6BA: 0x9017, + 0xB6BB: 0x75D8, + 0xB6BC: 0x90FD, + 0xB6BD: 0x7763, + 0xB6BE: 0x6BD2, + 0xB6BF: 0x728A, + 0xB6C0: 0x72EC, + 0xB6C1: 0x8BFB, + 0xB6C2: 0x5835, + 0xB6C3: 0x7779, + 0xB6C4: 0x8D4C, + 0xB6C5: 0x675C, + 0xB6C6: 0x9540, + 0xB6C7: 0x809A, + 0xB6C8: 0x5EA6, + 0xB6C9: 0x6E21, + 0xB6CA: 0x5992, + 0xB6CB: 0x7AEF, + 0xB6CC: 0x77ED, + 0xB6CD: 0x953B, + 0xB6CE: 0x6BB5, + 0xB6CF: 0x65AD, + 0xB6D0: 0x7F0E, + 0xB6D1: 0x5806, + 0xB6D2: 0x5151, + 0xB6D3: 0x961F, + 0xB6D4: 0x5BF9, + 0xB6D5: 0x58A9, + 0xB6D6: 0x5428, + 0xB6D7: 0x8E72, + 0xB6D8: 0x6566, + 0xB6D9: 0x987F, + 0xB6DA: 0x56E4, + 0xB6DB: 0x949D, + 0xB6DC: 0x76FE, + 0xB6DD: 0x9041, + 0xB6DE: 0x6387, + 0xB6DF: 0x54C6, + 0xB6E0: 0x591A, + 0xB6E1: 0x593A, + 0xB6E2: 0x579B, + 0xB6E3: 0x8EB2, + 0xB6E4: 0x6735, + 0xB6E5: 0x8DFA, + 0xB6E6: 0x8235, + 0xB6E7: 0x5241, + 0xB6E8: 0x60F0, + 0xB6E9: 0x5815, + 0xB6EA: 0x86FE, + 0xB6EB: 0x5CE8, + 0xB6EC: 0x9E45, + 0xB6ED: 0x4FC4, + 0xB6EE: 0x989D, + 0xB6EF: 0x8BB9, + 0xB6F0: 0x5A25, + 0xB6F1: 0x6076, + 0xB6F2: 0x5384, + 0xB6F3: 0x627C, + 0xB6F4: 0x904F, + 0xB6F5: 0x9102, + 0xB6F6: 0x997F, + 0xB6F7: 0x6069, + 0xB6F8: 0x800C, + 0xB6F9: 0x513F, + 0xB6FA: 0x8033, + 0xB6FB: 0x5C14, + 0xB6FC: 0x9975, + 0xB6FD: 0x6D31, + 0xB6FE: 0x4E8C, + 0xB740: 0x7A1D, + 0xB741: 0x7A1F, + 0xB742: 0x7A21, + 0xB743: 0x7A22, + 0xB744: 0x7A24, + 0xB745: 0x7A25, + 0xB746: 0x7A26, + 0xB747: 0x7A27, + 0xB748: 0x7A28, + 0xB749: 0x7A29, + 0xB74A: 0x7A2A, + 0xB74B: 0x7A2B, + 0xB74C: 0x7A2C, + 0xB74D: 0x7A2D, + 0xB74E: 0x7A2E, + 0xB74F: 0x7A2F, + 0xB750: 0x7A30, + 0xB751: 0x7A31, + 0xB752: 0x7A32, + 0xB753: 0x7A34, + 0xB754: 0x7A35, + 0xB755: 0x7A36, + 0xB756: 0x7A38, + 0xB757: 0x7A3A, + 0xB758: 0x7A3E, + 0xB759: 0x7A40, + 0xB75A: 0x7A41, + 0xB75B: 0x7A42, + 0xB75C: 0x7A43, + 0xB75D: 0x7A44, + 0xB75E: 0x7A45, + 0xB75F: 0x7A47, + 0xB760: 0x7A48, + 0xB761: 0x7A49, + 0xB762: 0x7A4A, + 0xB763: 0x7A4B, + 0xB764: 0x7A4C, + 0xB765: 0x7A4D, + 0xB766: 0x7A4E, + 0xB767: 0x7A4F, + 0xB768: 0x7A50, + 0xB769: 0x7A52, + 0xB76A: 0x7A53, + 0xB76B: 0x7A54, + 0xB76C: 0x7A55, + 0xB76D: 0x7A56, + 0xB76E: 0x7A58, + 0xB76F: 0x7A59, + 0xB770: 0x7A5A, + 0xB771: 0x7A5B, + 0xB772: 0x7A5C, + 0xB773: 0x7A5D, + 0xB774: 0x7A5E, + 0xB775: 0x7A5F, + 0xB776: 0x7A60, + 0xB777: 0x7A61, + 0xB778: 0x7A62, + 0xB779: 0x7A63, + 0xB77A: 0x7A64, + 0xB77B: 0x7A65, + 0xB77C: 0x7A66, + 0xB77D: 0x7A67, + 0xB77E: 0x7A68, + 0xB780: 0x7A69, + 0xB781: 0x7A6A, + 0xB782: 0x7A6B, + 0xB783: 0x7A6C, + 0xB784: 0x7A6D, + 0xB785: 0x7A6E, + 0xB786: 0x7A6F, + 0xB787: 0x7A71, + 0xB788: 0x7A72, + 0xB789: 0x7A73, + 0xB78A: 0x7A75, + 0xB78B: 0x7A7B, + 0xB78C: 0x7A7C, + 0xB78D: 0x7A7D, + 0xB78E: 0x7A7E, + 0xB78F: 0x7A82, + 0xB790: 0x7A85, + 0xB791: 0x7A87, + 0xB792: 0x7A89, + 0xB793: 0x7A8A, + 0xB794: 0x7A8B, + 0xB795: 0x7A8C, + 0xB796: 0x7A8E, + 0xB797: 0x7A8F, + 0xB798: 0x7A90, + 0xB799: 0x7A93, + 0xB79A: 0x7A94, + 0xB79B: 0x7A99, + 0xB79C: 0x7A9A, + 0xB79D: 0x7A9B, + 0xB79E: 0x7A9E, + 0xB79F: 0x7AA1, + 0xB7A0: 0x7AA2, + 0xB7A1: 0x8D30, + 0xB7A2: 0x53D1, + 0xB7A3: 0x7F5A, + 0xB7A4: 0x7B4F, + 0xB7A5: 0x4F10, + 0xB7A6: 0x4E4F, + 0xB7A7: 0x9600, + 0xB7A8: 0x6CD5, + 0xB7A9: 0x73D0, + 0xB7AA: 0x85E9, + 0xB7AB: 0x5E06, + 0xB7AC: 0x756A, + 0xB7AD: 0x7FFB, + 0xB7AE: 0x6A0A, + 0xB7AF: 0x77FE, + 0xB7B0: 0x9492, + 0xB7B1: 0x7E41, + 0xB7B2: 0x51E1, + 0xB7B3: 0x70E6, + 0xB7B4: 0x53CD, + 0xB7B5: 0x8FD4, + 0xB7B6: 0x8303, + 0xB7B7: 0x8D29, + 0xB7B8: 0x72AF, + 0xB7B9: 0x996D, + 0xB7BA: 0x6CDB, + 0xB7BB: 0x574A, + 0xB7BC: 0x82B3, + 0xB7BD: 0x65B9, + 0xB7BE: 0x80AA, + 0xB7BF: 0x623F, + 0xB7C0: 0x9632, + 0xB7C1: 0x59A8, + 0xB7C2: 0x4EFF, + 0xB7C3: 0x8BBF, + 0xB7C4: 0x7EBA, + 0xB7C5: 0x653E, + 0xB7C6: 0x83F2, + 0xB7C7: 0x975E, + 0xB7C8: 0x5561, + 0xB7C9: 0x98DE, + 0xB7CA: 0x80A5, + 0xB7CB: 0x532A, + 0xB7CC: 0x8BFD, + 0xB7CD: 0x5420, + 0xB7CE: 0x80BA, + 0xB7CF: 0x5E9F, + 0xB7D0: 0x6CB8, + 0xB7D1: 0x8D39, + 0xB7D2: 0x82AC, + 0xB7D3: 0x915A, + 0xB7D4: 0x5429, + 0xB7D5: 0x6C1B, + 0xB7D6: 0x5206, + 0xB7D7: 0x7EB7, + 0xB7D8: 0x575F, + 0xB7D9: 0x711A, + 0xB7DA: 0x6C7E, + 0xB7DB: 0x7C89, + 0xB7DC: 0x594B, + 0xB7DD: 0x4EFD, + 0xB7DE: 0x5FFF, + 0xB7DF: 0x6124, + 0xB7E0: 0x7CAA, + 0xB7E1: 0x4E30, + 0xB7E2: 0x5C01, + 0xB7E3: 0x67AB, + 0xB7E4: 0x8702, + 0xB7E5: 0x5CF0, + 0xB7E6: 0x950B, + 0xB7E7: 0x98CE, + 0xB7E8: 0x75AF, + 0xB7E9: 0x70FD, + 0xB7EA: 0x9022, + 0xB7EB: 0x51AF, + 0xB7EC: 0x7F1D, + 0xB7ED: 0x8BBD, + 0xB7EE: 0x5949, + 0xB7EF: 0x51E4, + 0xB7F0: 0x4F5B, + 0xB7F1: 0x5426, + 0xB7F2: 0x592B, + 0xB7F3: 0x6577, + 0xB7F4: 0x80A4, + 0xB7F5: 0x5B75, + 0xB7F6: 0x6276, + 0xB7F7: 0x62C2, + 0xB7F8: 0x8F90, + 0xB7F9: 0x5E45, + 0xB7FA: 0x6C1F, + 0xB7FB: 0x7B26, + 0xB7FC: 0x4F0F, + 0xB7FD: 0x4FD8, + 0xB7FE: 0x670D, + 0xB840: 0x7AA3, + 0xB841: 0x7AA4, + 0xB842: 0x7AA7, + 0xB843: 0x7AA9, + 0xB844: 0x7AAA, + 0xB845: 0x7AAB, + 0xB846: 0x7AAE, + 0xB847: 0x7AAF, + 0xB848: 0x7AB0, + 0xB849: 0x7AB1, + 0xB84A: 0x7AB2, + 0xB84B: 0x7AB4, + 0xB84C: 0x7AB5, + 0xB84D: 0x7AB6, + 0xB84E: 0x7AB7, + 0xB84F: 0x7AB8, + 0xB850: 0x7AB9, + 0xB851: 0x7ABA, + 0xB852: 0x7ABB, + 0xB853: 0x7ABC, + 0xB854: 0x7ABD, + 0xB855: 0x7ABE, + 0xB856: 0x7AC0, + 0xB857: 0x7AC1, + 0xB858: 0x7AC2, + 0xB859: 0x7AC3, + 0xB85A: 0x7AC4, + 0xB85B: 0x7AC5, + 0xB85C: 0x7AC6, + 0xB85D: 0x7AC7, + 0xB85E: 0x7AC8, + 0xB85F: 0x7AC9, + 0xB860: 0x7ACA, + 0xB861: 0x7ACC, + 0xB862: 0x7ACD, + 0xB863: 0x7ACE, + 0xB864: 0x7ACF, + 0xB865: 0x7AD0, + 0xB866: 0x7AD1, + 0xB867: 0x7AD2, + 0xB868: 0x7AD3, + 0xB869: 0x7AD4, + 0xB86A: 0x7AD5, + 0xB86B: 0x7AD7, + 0xB86C: 0x7AD8, + 0xB86D: 0x7ADA, + 0xB86E: 0x7ADB, + 0xB86F: 0x7ADC, + 0xB870: 0x7ADD, + 0xB871: 0x7AE1, + 0xB872: 0x7AE2, + 0xB873: 0x7AE4, + 0xB874: 0x7AE7, + 0xB875: 0x7AE8, + 0xB876: 0x7AE9, + 0xB877: 0x7AEA, + 0xB878: 0x7AEB, + 0xB879: 0x7AEC, + 0xB87A: 0x7AEE, + 0xB87B: 0x7AF0, + 0xB87C: 0x7AF1, + 0xB87D: 0x7AF2, + 0xB87E: 0x7AF3, + 0xB880: 0x7AF4, + 0xB881: 0x7AF5, + 0xB882: 0x7AF6, + 0xB883: 0x7AF7, + 0xB884: 0x7AF8, + 0xB885: 0x7AFB, + 0xB886: 0x7AFC, + 0xB887: 0x7AFE, + 0xB888: 0x7B00, + 0xB889: 0x7B01, + 0xB88A: 0x7B02, + 0xB88B: 0x7B05, + 0xB88C: 0x7B07, + 0xB88D: 0x7B09, + 0xB88E: 0x7B0C, + 0xB88F: 0x7B0D, + 0xB890: 0x7B0E, + 0xB891: 0x7B10, + 0xB892: 0x7B12, + 0xB893: 0x7B13, + 0xB894: 0x7B16, + 0xB895: 0x7B17, + 0xB896: 0x7B18, + 0xB897: 0x7B1A, + 0xB898: 0x7B1C, + 0xB899: 0x7B1D, + 0xB89A: 0x7B1F, + 0xB89B: 0x7B21, + 0xB89C: 0x7B22, + 0xB89D: 0x7B23, + 0xB89E: 0x7B27, + 0xB89F: 0x7B29, + 0xB8A0: 0x7B2D, + 0xB8A1: 0x6D6E, + 0xB8A2: 0x6DAA, + 0xB8A3: 0x798F, + 0xB8A4: 0x88B1, + 0xB8A5: 0x5F17, + 0xB8A6: 0x752B, + 0xB8A7: 0x629A, + 0xB8A8: 0x8F85, + 0xB8A9: 0x4FEF, + 0xB8AA: 0x91DC, + 0xB8AB: 0x65A7, + 0xB8AC: 0x812F, + 0xB8AD: 0x8151, + 0xB8AE: 0x5E9C, + 0xB8AF: 0x8150, + 0xB8B0: 0x8D74, + 0xB8B1: 0x526F, + 0xB8B2: 0x8986, + 0xB8B3: 0x8D4B, + 0xB8B4: 0x590D, + 0xB8B5: 0x5085, + 0xB8B6: 0x4ED8, + 0xB8B7: 0x961C, + 0xB8B8: 0x7236, + 0xB8B9: 0x8179, + 0xB8BA: 0x8D1F, + 0xB8BB: 0x5BCC, + 0xB8BC: 0x8BA3, + 0xB8BD: 0x9644, + 0xB8BE: 0x5987, + 0xB8BF: 0x7F1A, + 0xB8C0: 0x5490, + 0xB8C1: 0x5676, + 0xB8C2: 0x560E, + 0xB8C3: 0x8BE5, + 0xB8C4: 0x6539, + 0xB8C5: 0x6982, + 0xB8C6: 0x9499, + 0xB8C7: 0x76D6, + 0xB8C8: 0x6E89, + 0xB8C9: 0x5E72, + 0xB8CA: 0x7518, + 0xB8CB: 0x6746, + 0xB8CC: 0x67D1, + 0xB8CD: 0x7AFF, + 0xB8CE: 0x809D, + 0xB8CF: 0x8D76, + 0xB8D0: 0x611F, + 0xB8D1: 0x79C6, + 0xB8D2: 0x6562, + 0xB8D3: 0x8D63, + 0xB8D4: 0x5188, + 0xB8D5: 0x521A, + 0xB8D6: 0x94A2, + 0xB8D7: 0x7F38, + 0xB8D8: 0x809B, + 0xB8D9: 0x7EB2, + 0xB8DA: 0x5C97, + 0xB8DB: 0x6E2F, + 0xB8DC: 0x6760, + 0xB8DD: 0x7BD9, + 0xB8DE: 0x768B, + 0xB8DF: 0x9AD8, + 0xB8E0: 0x818F, + 0xB8E1: 0x7F94, + 0xB8E2: 0x7CD5, + 0xB8E3: 0x641E, + 0xB8E4: 0x9550, + 0xB8E5: 0x7A3F, + 0xB8E6: 0x544A, + 0xB8E7: 0x54E5, + 0xB8E8: 0x6B4C, + 0xB8E9: 0x6401, + 0xB8EA: 0x6208, + 0xB8EB: 0x9E3D, + 0xB8EC: 0x80F3, + 0xB8ED: 0x7599, + 0xB8EE: 0x5272, + 0xB8EF: 0x9769, + 0xB8F0: 0x845B, + 0xB8F1: 0x683C, + 0xB8F2: 0x86E4, + 0xB8F3: 0x9601, + 0xB8F4: 0x9694, + 0xB8F5: 0x94EC, + 0xB8F6: 0x4E2A, + 0xB8F7: 0x5404, + 0xB8F8: 0x7ED9, + 0xB8F9: 0x6839, + 0xB8FA: 0x8DDF, + 0xB8FB: 0x8015, + 0xB8FC: 0x66F4, + 0xB8FD: 0x5E9A, + 0xB8FE: 0x7FB9, + 0xB940: 0x7B2F, + 0xB941: 0x7B30, + 0xB942: 0x7B32, + 0xB943: 0x7B34, + 0xB944: 0x7B35, + 0xB945: 0x7B36, + 0xB946: 0x7B37, + 0xB947: 0x7B39, + 0xB948: 0x7B3B, + 0xB949: 0x7B3D, + 0xB94A: 0x7B3F, + 0xB94B: 0x7B40, + 0xB94C: 0x7B41, + 0xB94D: 0x7B42, + 0xB94E: 0x7B43, + 0xB94F: 0x7B44, + 0xB950: 0x7B46, + 0xB951: 0x7B48, + 0xB952: 0x7B4A, + 0xB953: 0x7B4D, + 0xB954: 0x7B4E, + 0xB955: 0x7B53, + 0xB956: 0x7B55, + 0xB957: 0x7B57, + 0xB958: 0x7B59, + 0xB959: 0x7B5C, + 0xB95A: 0x7B5E, + 0xB95B: 0x7B5F, + 0xB95C: 0x7B61, + 0xB95D: 0x7B63, + 0xB95E: 0x7B64, + 0xB95F: 0x7B65, + 0xB960: 0x7B66, + 0xB961: 0x7B67, + 0xB962: 0x7B68, + 0xB963: 0x7B69, + 0xB964: 0x7B6A, + 0xB965: 0x7B6B, + 0xB966: 0x7B6C, + 0xB967: 0x7B6D, + 0xB968: 0x7B6F, + 0xB969: 0x7B70, + 0xB96A: 0x7B73, + 0xB96B: 0x7B74, + 0xB96C: 0x7B76, + 0xB96D: 0x7B78, + 0xB96E: 0x7B7A, + 0xB96F: 0x7B7C, + 0xB970: 0x7B7D, + 0xB971: 0x7B7F, + 0xB972: 0x7B81, + 0xB973: 0x7B82, + 0xB974: 0x7B83, + 0xB975: 0x7B84, + 0xB976: 0x7B86, + 0xB977: 0x7B87, + 0xB978: 0x7B88, + 0xB979: 0x7B89, + 0xB97A: 0x7B8A, + 0xB97B: 0x7B8B, + 0xB97C: 0x7B8C, + 0xB97D: 0x7B8E, + 0xB97E: 0x7B8F, + 0xB980: 0x7B91, + 0xB981: 0x7B92, + 0xB982: 0x7B93, + 0xB983: 0x7B96, + 0xB984: 0x7B98, + 0xB985: 0x7B99, + 0xB986: 0x7B9A, + 0xB987: 0x7B9B, + 0xB988: 0x7B9E, + 0xB989: 0x7B9F, + 0xB98A: 0x7BA0, + 0xB98B: 0x7BA3, + 0xB98C: 0x7BA4, + 0xB98D: 0x7BA5, + 0xB98E: 0x7BAE, + 0xB98F: 0x7BAF, + 0xB990: 0x7BB0, + 0xB991: 0x7BB2, + 0xB992: 0x7BB3, + 0xB993: 0x7BB5, + 0xB994: 0x7BB6, + 0xB995: 0x7BB7, + 0xB996: 0x7BB9, + 0xB997: 0x7BBA, + 0xB998: 0x7BBB, + 0xB999: 0x7BBC, + 0xB99A: 0x7BBD, + 0xB99B: 0x7BBE, + 0xB99C: 0x7BBF, + 0xB99D: 0x7BC0, + 0xB99E: 0x7BC2, + 0xB99F: 0x7BC3, + 0xB9A0: 0x7BC4, + 0xB9A1: 0x57C2, + 0xB9A2: 0x803F, + 0xB9A3: 0x6897, + 0xB9A4: 0x5DE5, + 0xB9A5: 0x653B, + 0xB9A6: 0x529F, + 0xB9A7: 0x606D, + 0xB9A8: 0x9F9A, + 0xB9A9: 0x4F9B, + 0xB9AA: 0x8EAC, + 0xB9AB: 0x516C, + 0xB9AC: 0x5BAB, + 0xB9AD: 0x5F13, + 0xB9AE: 0x5DE9, + 0xB9AF: 0x6C5E, + 0xB9B0: 0x62F1, + 0xB9B1: 0x8D21, + 0xB9B2: 0x5171, + 0xB9B3: 0x94A9, + 0xB9B4: 0x52FE, + 0xB9B5: 0x6C9F, + 0xB9B6: 0x82DF, + 0xB9B7: 0x72D7, + 0xB9B8: 0x57A2, + 0xB9B9: 0x6784, + 0xB9BA: 0x8D2D, + 0xB9BB: 0x591F, + 0xB9BC: 0x8F9C, + 0xB9BD: 0x83C7, + 0xB9BE: 0x5495, + 0xB9BF: 0x7B8D, + 0xB9C0: 0x4F30, + 0xB9C1: 0x6CBD, + 0xB9C2: 0x5B64, + 0xB9C3: 0x59D1, + 0xB9C4: 0x9F13, + 0xB9C5: 0x53E4, + 0xB9C6: 0x86CA, + 0xB9C7: 0x9AA8, + 0xB9C8: 0x8C37, + 0xB9C9: 0x80A1, + 0xB9CA: 0x6545, + 0xB9CB: 0x987E, + 0xB9CC: 0x56FA, + 0xB9CD: 0x96C7, + 0xB9CE: 0x522E, + 0xB9CF: 0x74DC, + 0xB9D0: 0x5250, + 0xB9D1: 0x5BE1, + 0xB9D2: 0x6302, + 0xB9D3: 0x8902, + 0xB9D4: 0x4E56, + 0xB9D5: 0x62D0, + 0xB9D6: 0x602A, + 0xB9D7: 0x68FA, + 0xB9D8: 0x5173, + 0xB9D9: 0x5B98, + 0xB9DA: 0x51A0, + 0xB9DB: 0x89C2, + 0xB9DC: 0x7BA1, + 0xB9DD: 0x9986, + 0xB9DE: 0x7F50, + 0xB9DF: 0x60EF, + 0xB9E0: 0x704C, + 0xB9E1: 0x8D2F, + 0xB9E2: 0x5149, + 0xB9E3: 0x5E7F, + 0xB9E4: 0x901B, + 0xB9E5: 0x7470, + 0xB9E6: 0x89C4, + 0xB9E7: 0x572D, + 0xB9E8: 0x7845, + 0xB9E9: 0x5F52, + 0xB9EA: 0x9F9F, + 0xB9EB: 0x95FA, + 0xB9EC: 0x8F68, + 0xB9ED: 0x9B3C, + 0xB9EE: 0x8BE1, + 0xB9EF: 0x7678, + 0xB9F0: 0x6842, + 0xB9F1: 0x67DC, + 0xB9F2: 0x8DEA, + 0xB9F3: 0x8D35, + 0xB9F4: 0x523D, + 0xB9F5: 0x8F8A, + 0xB9F6: 0x6EDA, + 0xB9F7: 0x68CD, + 0xB9F8: 0x9505, + 0xB9F9: 0x90ED, + 0xB9FA: 0x56FD, + 0xB9FB: 0x679C, + 0xB9FC: 0x88F9, + 0xB9FD: 0x8FC7, + 0xB9FE: 0x54C8, + 0xBA40: 0x7BC5, + 0xBA41: 0x7BC8, + 0xBA42: 0x7BC9, + 0xBA43: 0x7BCA, + 0xBA44: 0x7BCB, + 0xBA45: 0x7BCD, + 0xBA46: 0x7BCE, + 0xBA47: 0x7BCF, + 0xBA48: 0x7BD0, + 0xBA49: 0x7BD2, + 0xBA4A: 0x7BD4, + 0xBA4B: 0x7BD5, + 0xBA4C: 0x7BD6, + 0xBA4D: 0x7BD7, + 0xBA4E: 0x7BD8, + 0xBA4F: 0x7BDB, + 0xBA50: 0x7BDC, + 0xBA51: 0x7BDE, + 0xBA52: 0x7BDF, + 0xBA53: 0x7BE0, + 0xBA54: 0x7BE2, + 0xBA55: 0x7BE3, + 0xBA56: 0x7BE4, + 0xBA57: 0x7BE7, + 0xBA58: 0x7BE8, + 0xBA59: 0x7BE9, + 0xBA5A: 0x7BEB, + 0xBA5B: 0x7BEC, + 0xBA5C: 0x7BED, + 0xBA5D: 0x7BEF, + 0xBA5E: 0x7BF0, + 0xBA5F: 0x7BF2, + 0xBA60: 0x7BF3, + 0xBA61: 0x7BF4, + 0xBA62: 0x7BF5, + 0xBA63: 0x7BF6, + 0xBA64: 0x7BF8, + 0xBA65: 0x7BF9, + 0xBA66: 0x7BFA, + 0xBA67: 0x7BFB, + 0xBA68: 0x7BFD, + 0xBA69: 0x7BFF, + 0xBA6A: 0x7C00, + 0xBA6B: 0x7C01, + 0xBA6C: 0x7C02, + 0xBA6D: 0x7C03, + 0xBA6E: 0x7C04, + 0xBA6F: 0x7C05, + 0xBA70: 0x7C06, + 0xBA71: 0x7C08, + 0xBA72: 0x7C09, + 0xBA73: 0x7C0A, + 0xBA74: 0x7C0D, + 0xBA75: 0x7C0E, + 0xBA76: 0x7C10, + 0xBA77: 0x7C11, + 0xBA78: 0x7C12, + 0xBA79: 0x7C13, + 0xBA7A: 0x7C14, + 0xBA7B: 0x7C15, + 0xBA7C: 0x7C17, + 0xBA7D: 0x7C18, + 0xBA7E: 0x7C19, + 0xBA80: 0x7C1A, + 0xBA81: 0x7C1B, + 0xBA82: 0x7C1C, + 0xBA83: 0x7C1D, + 0xBA84: 0x7C1E, + 0xBA85: 0x7C20, + 0xBA86: 0x7C21, + 0xBA87: 0x7C22, + 0xBA88: 0x7C23, + 0xBA89: 0x7C24, + 0xBA8A: 0x7C25, + 0xBA8B: 0x7C28, + 0xBA8C: 0x7C29, + 0xBA8D: 0x7C2B, + 0xBA8E: 0x7C2C, + 0xBA8F: 0x7C2D, + 0xBA90: 0x7C2E, + 0xBA91: 0x7C2F, + 0xBA92: 0x7C30, + 0xBA93: 0x7C31, + 0xBA94: 0x7C32, + 0xBA95: 0x7C33, + 0xBA96: 0x7C34, + 0xBA97: 0x7C35, + 0xBA98: 0x7C36, + 0xBA99: 0x7C37, + 0xBA9A: 0x7C39, + 0xBA9B: 0x7C3A, + 0xBA9C: 0x7C3B, + 0xBA9D: 0x7C3C, + 0xBA9E: 0x7C3D, + 0xBA9F: 0x7C3E, + 0xBAA0: 0x7C42, + 0xBAA1: 0x9AB8, + 0xBAA2: 0x5B69, + 0xBAA3: 0x6D77, + 0xBAA4: 0x6C26, + 0xBAA5: 0x4EA5, + 0xBAA6: 0x5BB3, + 0xBAA7: 0x9A87, + 0xBAA8: 0x9163, + 0xBAA9: 0x61A8, + 0xBAAA: 0x90AF, + 0xBAAB: 0x97E9, + 0xBAAC: 0x542B, + 0xBAAD: 0x6DB5, + 0xBAAE: 0x5BD2, + 0xBAAF: 0x51FD, + 0xBAB0: 0x558A, + 0xBAB1: 0x7F55, + 0xBAB2: 0x7FF0, + 0xBAB3: 0x64BC, + 0xBAB4: 0x634D, + 0xBAB5: 0x65F1, + 0xBAB6: 0x61BE, + 0xBAB7: 0x608D, + 0xBAB8: 0x710A, + 0xBAB9: 0x6C57, + 0xBABA: 0x6C49, + 0xBABB: 0x592F, + 0xBABC: 0x676D, + 0xBABD: 0x822A, + 0xBABE: 0x58D5, + 0xBABF: 0x568E, + 0xBAC0: 0x8C6A, + 0xBAC1: 0x6BEB, + 0xBAC2: 0x90DD, + 0xBAC3: 0x597D, + 0xBAC4: 0x8017, + 0xBAC5: 0x53F7, + 0xBAC6: 0x6D69, + 0xBAC7: 0x5475, + 0xBAC8: 0x559D, + 0xBAC9: 0x8377, + 0xBACA: 0x83CF, + 0xBACB: 0x6838, + 0xBACC: 0x79BE, + 0xBACD: 0x548C, + 0xBACE: 0x4F55, + 0xBACF: 0x5408, + 0xBAD0: 0x76D2, + 0xBAD1: 0x8C89, + 0xBAD2: 0x9602, + 0xBAD3: 0x6CB3, + 0xBAD4: 0x6DB8, + 0xBAD5: 0x8D6B, + 0xBAD6: 0x8910, + 0xBAD7: 0x9E64, + 0xBAD8: 0x8D3A, + 0xBAD9: 0x563F, + 0xBADA: 0x9ED1, + 0xBADB: 0x75D5, + 0xBADC: 0x5F88, + 0xBADD: 0x72E0, + 0xBADE: 0x6068, + 0xBADF: 0x54FC, + 0xBAE0: 0x4EA8, + 0xBAE1: 0x6A2A, + 0xBAE2: 0x8861, + 0xBAE3: 0x6052, + 0xBAE4: 0x8F70, + 0xBAE5: 0x54C4, + 0xBAE6: 0x70D8, + 0xBAE7: 0x8679, + 0xBAE8: 0x9E3F, + 0xBAE9: 0x6D2A, + 0xBAEA: 0x5B8F, + 0xBAEB: 0x5F18, + 0xBAEC: 0x7EA2, + 0xBAED: 0x5589, + 0xBAEE: 0x4FAF, + 0xBAEF: 0x7334, + 0xBAF0: 0x543C, + 0xBAF1: 0x539A, + 0xBAF2: 0x5019, + 0xBAF3: 0x540E, + 0xBAF4: 0x547C, + 0xBAF5: 0x4E4E, + 0xBAF6: 0x5FFD, + 0xBAF7: 0x745A, + 0xBAF8: 0x58F6, + 0xBAF9: 0x846B, + 0xBAFA: 0x80E1, + 0xBAFB: 0x8774, + 0xBAFC: 0x72D0, + 0xBAFD: 0x7CCA, + 0xBAFE: 0x6E56, + 0xBB40: 0x7C43, + 0xBB41: 0x7C44, + 0xBB42: 0x7C45, + 0xBB43: 0x7C46, + 0xBB44: 0x7C47, + 0xBB45: 0x7C48, + 0xBB46: 0x7C49, + 0xBB47: 0x7C4A, + 0xBB48: 0x7C4B, + 0xBB49: 0x7C4C, + 0xBB4A: 0x7C4E, + 0xBB4B: 0x7C4F, + 0xBB4C: 0x7C50, + 0xBB4D: 0x7C51, + 0xBB4E: 0x7C52, + 0xBB4F: 0x7C53, + 0xBB50: 0x7C54, + 0xBB51: 0x7C55, + 0xBB52: 0x7C56, + 0xBB53: 0x7C57, + 0xBB54: 0x7C58, + 0xBB55: 0x7C59, + 0xBB56: 0x7C5A, + 0xBB57: 0x7C5B, + 0xBB58: 0x7C5C, + 0xBB59: 0x7C5D, + 0xBB5A: 0x7C5E, + 0xBB5B: 0x7C5F, + 0xBB5C: 0x7C60, + 0xBB5D: 0x7C61, + 0xBB5E: 0x7C62, + 0xBB5F: 0x7C63, + 0xBB60: 0x7C64, + 0xBB61: 0x7C65, + 0xBB62: 0x7C66, + 0xBB63: 0x7C67, + 0xBB64: 0x7C68, + 0xBB65: 0x7C69, + 0xBB66: 0x7C6A, + 0xBB67: 0x7C6B, + 0xBB68: 0x7C6C, + 0xBB69: 0x7C6D, + 0xBB6A: 0x7C6E, + 0xBB6B: 0x7C6F, + 0xBB6C: 0x7C70, + 0xBB6D: 0x7C71, + 0xBB6E: 0x7C72, + 0xBB6F: 0x7C75, + 0xBB70: 0x7C76, + 0xBB71: 0x7C77, + 0xBB72: 0x7C78, + 0xBB73: 0x7C79, + 0xBB74: 0x7C7A, + 0xBB75: 0x7C7E, + 0xBB76: 0x7C7F, + 0xBB77: 0x7C80, + 0xBB78: 0x7C81, + 0xBB79: 0x7C82, + 0xBB7A: 0x7C83, + 0xBB7B: 0x7C84, + 0xBB7C: 0x7C85, + 0xBB7D: 0x7C86, + 0xBB7E: 0x7C87, + 0xBB80: 0x7C88, + 0xBB81: 0x7C8A, + 0xBB82: 0x7C8B, + 0xBB83: 0x7C8C, + 0xBB84: 0x7C8D, + 0xBB85: 0x7C8E, + 0xBB86: 0x7C8F, + 0xBB87: 0x7C90, + 0xBB88: 0x7C93, + 0xBB89: 0x7C94, + 0xBB8A: 0x7C96, + 0xBB8B: 0x7C99, + 0xBB8C: 0x7C9A, + 0xBB8D: 0x7C9B, + 0xBB8E: 0x7CA0, + 0xBB8F: 0x7CA1, + 0xBB90: 0x7CA3, + 0xBB91: 0x7CA6, + 0xBB92: 0x7CA7, + 0xBB93: 0x7CA8, + 0xBB94: 0x7CA9, + 0xBB95: 0x7CAB, + 0xBB96: 0x7CAC, + 0xBB97: 0x7CAD, + 0xBB98: 0x7CAF, + 0xBB99: 0x7CB0, + 0xBB9A: 0x7CB4, + 0xBB9B: 0x7CB5, + 0xBB9C: 0x7CB6, + 0xBB9D: 0x7CB7, + 0xBB9E: 0x7CB8, + 0xBB9F: 0x7CBA, + 0xBBA0: 0x7CBB, + 0xBBA1: 0x5F27, + 0xBBA2: 0x864E, + 0xBBA3: 0x552C, + 0xBBA4: 0x62A4, + 0xBBA5: 0x4E92, + 0xBBA6: 0x6CAA, + 0xBBA7: 0x6237, + 0xBBA8: 0x82B1, + 0xBBA9: 0x54D7, + 0xBBAA: 0x534E, + 0xBBAB: 0x733E, + 0xBBAC: 0x6ED1, + 0xBBAD: 0x753B, + 0xBBAE: 0x5212, + 0xBBAF: 0x5316, + 0xBBB0: 0x8BDD, + 0xBBB1: 0x69D0, + 0xBBB2: 0x5F8A, + 0xBBB3: 0x6000, + 0xBBB4: 0x6DEE, + 0xBBB5: 0x574F, + 0xBBB6: 0x6B22, + 0xBBB7: 0x73AF, + 0xBBB8: 0x6853, + 0xBBB9: 0x8FD8, + 0xBBBA: 0x7F13, + 0xBBBB: 0x6362, + 0xBBBC: 0x60A3, + 0xBBBD: 0x5524, + 0xBBBE: 0x75EA, + 0xBBBF: 0x8C62, + 0xBBC0: 0x7115, + 0xBBC1: 0x6DA3, + 0xBBC2: 0x5BA6, + 0xBBC3: 0x5E7B, + 0xBBC4: 0x8352, + 0xBBC5: 0x614C, + 0xBBC6: 0x9EC4, + 0xBBC7: 0x78FA, + 0xBBC8: 0x8757, + 0xBBC9: 0x7C27, + 0xBBCA: 0x7687, + 0xBBCB: 0x51F0, + 0xBBCC: 0x60F6, + 0xBBCD: 0x714C, + 0xBBCE: 0x6643, + 0xBBCF: 0x5E4C, + 0xBBD0: 0x604D, + 0xBBD1: 0x8C0E, + 0xBBD2: 0x7070, + 0xBBD3: 0x6325, + 0xBBD4: 0x8F89, + 0xBBD5: 0x5FBD, + 0xBBD6: 0x6062, + 0xBBD7: 0x86D4, + 0xBBD8: 0x56DE, + 0xBBD9: 0x6BC1, + 0xBBDA: 0x6094, + 0xBBDB: 0x6167, + 0xBBDC: 0x5349, + 0xBBDD: 0x60E0, + 0xBBDE: 0x6666, + 0xBBDF: 0x8D3F, + 0xBBE0: 0x79FD, + 0xBBE1: 0x4F1A, + 0xBBE2: 0x70E9, + 0xBBE3: 0x6C47, + 0xBBE4: 0x8BB3, + 0xBBE5: 0x8BF2, + 0xBBE6: 0x7ED8, + 0xBBE7: 0x8364, + 0xBBE8: 0x660F, + 0xBBE9: 0x5A5A, + 0xBBEA: 0x9B42, + 0xBBEB: 0x6D51, + 0xBBEC: 0x6DF7, + 0xBBED: 0x8C41, + 0xBBEE: 0x6D3B, + 0xBBEF: 0x4F19, + 0xBBF0: 0x706B, + 0xBBF1: 0x83B7, + 0xBBF2: 0x6216, + 0xBBF3: 0x60D1, + 0xBBF4: 0x970D, + 0xBBF5: 0x8D27, + 0xBBF6: 0x7978, + 0xBBF7: 0x51FB, + 0xBBF8: 0x573E, + 0xBBF9: 0x57FA, + 0xBBFA: 0x673A, + 0xBBFB: 0x7578, + 0xBBFC: 0x7A3D, + 0xBBFD: 0x79EF, + 0xBBFE: 0x7B95, + 0xBC40: 0x7CBF, + 0xBC41: 0x7CC0, + 0xBC42: 0x7CC2, + 0xBC43: 0x7CC3, + 0xBC44: 0x7CC4, + 0xBC45: 0x7CC6, + 0xBC46: 0x7CC9, + 0xBC47: 0x7CCB, + 0xBC48: 0x7CCE, + 0xBC49: 0x7CCF, + 0xBC4A: 0x7CD0, + 0xBC4B: 0x7CD1, + 0xBC4C: 0x7CD2, + 0xBC4D: 0x7CD3, + 0xBC4E: 0x7CD4, + 0xBC4F: 0x7CD8, + 0xBC50: 0x7CDA, + 0xBC51: 0x7CDB, + 0xBC52: 0x7CDD, + 0xBC53: 0x7CDE, + 0xBC54: 0x7CE1, + 0xBC55: 0x7CE2, + 0xBC56: 0x7CE3, + 0xBC57: 0x7CE4, + 0xBC58: 0x7CE5, + 0xBC59: 0x7CE6, + 0xBC5A: 0x7CE7, + 0xBC5B: 0x7CE9, + 0xBC5C: 0x7CEA, + 0xBC5D: 0x7CEB, + 0xBC5E: 0x7CEC, + 0xBC5F: 0x7CED, + 0xBC60: 0x7CEE, + 0xBC61: 0x7CF0, + 0xBC62: 0x7CF1, + 0xBC63: 0x7CF2, + 0xBC64: 0x7CF3, + 0xBC65: 0x7CF4, + 0xBC66: 0x7CF5, + 0xBC67: 0x7CF6, + 0xBC68: 0x7CF7, + 0xBC69: 0x7CF9, + 0xBC6A: 0x7CFA, + 0xBC6B: 0x7CFC, + 0xBC6C: 0x7CFD, + 0xBC6D: 0x7CFE, + 0xBC6E: 0x7CFF, + 0xBC6F: 0x7D00, + 0xBC70: 0x7D01, + 0xBC71: 0x7D02, + 0xBC72: 0x7D03, + 0xBC73: 0x7D04, + 0xBC74: 0x7D05, + 0xBC75: 0x7D06, + 0xBC76: 0x7D07, + 0xBC77: 0x7D08, + 0xBC78: 0x7D09, + 0xBC79: 0x7D0B, + 0xBC7A: 0x7D0C, + 0xBC7B: 0x7D0D, + 0xBC7C: 0x7D0E, + 0xBC7D: 0x7D0F, + 0xBC7E: 0x7D10, + 0xBC80: 0x7D11, + 0xBC81: 0x7D12, + 0xBC82: 0x7D13, + 0xBC83: 0x7D14, + 0xBC84: 0x7D15, + 0xBC85: 0x7D16, + 0xBC86: 0x7D17, + 0xBC87: 0x7D18, + 0xBC88: 0x7D19, + 0xBC89: 0x7D1A, + 0xBC8A: 0x7D1B, + 0xBC8B: 0x7D1C, + 0xBC8C: 0x7D1D, + 0xBC8D: 0x7D1E, + 0xBC8E: 0x7D1F, + 0xBC8F: 0x7D21, + 0xBC90: 0x7D23, + 0xBC91: 0x7D24, + 0xBC92: 0x7D25, + 0xBC93: 0x7D26, + 0xBC94: 0x7D28, + 0xBC95: 0x7D29, + 0xBC96: 0x7D2A, + 0xBC97: 0x7D2C, + 0xBC98: 0x7D2D, + 0xBC99: 0x7D2E, + 0xBC9A: 0x7D30, + 0xBC9B: 0x7D31, + 0xBC9C: 0x7D32, + 0xBC9D: 0x7D33, + 0xBC9E: 0x7D34, + 0xBC9F: 0x7D35, + 0xBCA0: 0x7D36, + 0xBCA1: 0x808C, + 0xBCA2: 0x9965, + 0xBCA3: 0x8FF9, + 0xBCA4: 0x6FC0, + 0xBCA5: 0x8BA5, + 0xBCA6: 0x9E21, + 0xBCA7: 0x59EC, + 0xBCA8: 0x7EE9, + 0xBCA9: 0x7F09, + 0xBCAA: 0x5409, + 0xBCAB: 0x6781, + 0xBCAC: 0x68D8, + 0xBCAD: 0x8F91, + 0xBCAE: 0x7C4D, + 0xBCAF: 0x96C6, + 0xBCB0: 0x53CA, + 0xBCB1: 0x6025, + 0xBCB2: 0x75BE, + 0xBCB3: 0x6C72, + 0xBCB4: 0x5373, + 0xBCB5: 0x5AC9, + 0xBCB6: 0x7EA7, + 0xBCB7: 0x6324, + 0xBCB8: 0x51E0, + 0xBCB9: 0x810A, + 0xBCBA: 0x5DF1, + 0xBCBB: 0x84DF, + 0xBCBC: 0x6280, + 0xBCBD: 0x5180, + 0xBCBE: 0x5B63, + 0xBCBF: 0x4F0E, + 0xBCC0: 0x796D, + 0xBCC1: 0x5242, + 0xBCC2: 0x60B8, + 0xBCC3: 0x6D4E, + 0xBCC4: 0x5BC4, + 0xBCC5: 0x5BC2, + 0xBCC6: 0x8BA1, + 0xBCC7: 0x8BB0, + 0xBCC8: 0x65E2, + 0xBCC9: 0x5FCC, + 0xBCCA: 0x9645, + 0xBCCB: 0x5993, + 0xBCCC: 0x7EE7, + 0xBCCD: 0x7EAA, + 0xBCCE: 0x5609, + 0xBCCF: 0x67B7, + 0xBCD0: 0x5939, + 0xBCD1: 0x4F73, + 0xBCD2: 0x5BB6, + 0xBCD3: 0x52A0, + 0xBCD4: 0x835A, + 0xBCD5: 0x988A, + 0xBCD6: 0x8D3E, + 0xBCD7: 0x7532, + 0xBCD8: 0x94BE, + 0xBCD9: 0x5047, + 0xBCDA: 0x7A3C, + 0xBCDB: 0x4EF7, + 0xBCDC: 0x67B6, + 0xBCDD: 0x9A7E, + 0xBCDE: 0x5AC1, + 0xBCDF: 0x6B7C, + 0xBCE0: 0x76D1, + 0xBCE1: 0x575A, + 0xBCE2: 0x5C16, + 0xBCE3: 0x7B3A, + 0xBCE4: 0x95F4, + 0xBCE5: 0x714E, + 0xBCE6: 0x517C, + 0xBCE7: 0x80A9, + 0xBCE8: 0x8270, + 0xBCE9: 0x5978, + 0xBCEA: 0x7F04, + 0xBCEB: 0x8327, + 0xBCEC: 0x68C0, + 0xBCED: 0x67EC, + 0xBCEE: 0x78B1, + 0xBCEF: 0x7877, + 0xBCF0: 0x62E3, + 0xBCF1: 0x6361, + 0xBCF2: 0x7B80, + 0xBCF3: 0x4FED, + 0xBCF4: 0x526A, + 0xBCF5: 0x51CF, + 0xBCF6: 0x8350, + 0xBCF7: 0x69DB, + 0xBCF8: 0x9274, + 0xBCF9: 0x8DF5, + 0xBCFA: 0x8D31, + 0xBCFB: 0x89C1, + 0xBCFC: 0x952E, + 0xBCFD: 0x7BAD, + 0xBCFE: 0x4EF6, + 0xBD40: 0x7D37, + 0xBD41: 0x7D38, + 0xBD42: 0x7D39, + 0xBD43: 0x7D3A, + 0xBD44: 0x7D3B, + 0xBD45: 0x7D3C, + 0xBD46: 0x7D3D, + 0xBD47: 0x7D3E, + 0xBD48: 0x7D3F, + 0xBD49: 0x7D40, + 0xBD4A: 0x7D41, + 0xBD4B: 0x7D42, + 0xBD4C: 0x7D43, + 0xBD4D: 0x7D44, + 0xBD4E: 0x7D45, + 0xBD4F: 0x7D46, + 0xBD50: 0x7D47, + 0xBD51: 0x7D48, + 0xBD52: 0x7D49, + 0xBD53: 0x7D4A, + 0xBD54: 0x7D4B, + 0xBD55: 0x7D4C, + 0xBD56: 0x7D4D, + 0xBD57: 0x7D4E, + 0xBD58: 0x7D4F, + 0xBD59: 0x7D50, + 0xBD5A: 0x7D51, + 0xBD5B: 0x7D52, + 0xBD5C: 0x7D53, + 0xBD5D: 0x7D54, + 0xBD5E: 0x7D55, + 0xBD5F: 0x7D56, + 0xBD60: 0x7D57, + 0xBD61: 0x7D58, + 0xBD62: 0x7D59, + 0xBD63: 0x7D5A, + 0xBD64: 0x7D5B, + 0xBD65: 0x7D5C, + 0xBD66: 0x7D5D, + 0xBD67: 0x7D5E, + 0xBD68: 0x7D5F, + 0xBD69: 0x7D60, + 0xBD6A: 0x7D61, + 0xBD6B: 0x7D62, + 0xBD6C: 0x7D63, + 0xBD6D: 0x7D64, + 0xBD6E: 0x7D65, + 0xBD6F: 0x7D66, + 0xBD70: 0x7D67, + 0xBD71: 0x7D68, + 0xBD72: 0x7D69, + 0xBD73: 0x7D6A, + 0xBD74: 0x7D6B, + 0xBD75: 0x7D6C, + 0xBD76: 0x7D6D, + 0xBD77: 0x7D6F, + 0xBD78: 0x7D70, + 0xBD79: 0x7D71, + 0xBD7A: 0x7D72, + 0xBD7B: 0x7D73, + 0xBD7C: 0x7D74, + 0xBD7D: 0x7D75, + 0xBD7E: 0x7D76, + 0xBD80: 0x7D78, + 0xBD81: 0x7D79, + 0xBD82: 0x7D7A, + 0xBD83: 0x7D7B, + 0xBD84: 0x7D7C, + 0xBD85: 0x7D7D, + 0xBD86: 0x7D7E, + 0xBD87: 0x7D7F, + 0xBD88: 0x7D80, + 0xBD89: 0x7D81, + 0xBD8A: 0x7D82, + 0xBD8B: 0x7D83, + 0xBD8C: 0x7D84, + 0xBD8D: 0x7D85, + 0xBD8E: 0x7D86, + 0xBD8F: 0x7D87, + 0xBD90: 0x7D88, + 0xBD91: 0x7D89, + 0xBD92: 0x7D8A, + 0xBD93: 0x7D8B, + 0xBD94: 0x7D8C, + 0xBD95: 0x7D8D, + 0xBD96: 0x7D8E, + 0xBD97: 0x7D8F, + 0xBD98: 0x7D90, + 0xBD99: 0x7D91, + 0xBD9A: 0x7D92, + 0xBD9B: 0x7D93, + 0xBD9C: 0x7D94, + 0xBD9D: 0x7D95, + 0xBD9E: 0x7D96, + 0xBD9F: 0x7D97, + 0xBDA0: 0x7D98, + 0xBDA1: 0x5065, + 0xBDA2: 0x8230, + 0xBDA3: 0x5251, + 0xBDA4: 0x996F, + 0xBDA5: 0x6E10, + 0xBDA6: 0x6E85, + 0xBDA7: 0x6DA7, + 0xBDA8: 0x5EFA, + 0xBDA9: 0x50F5, + 0xBDAA: 0x59DC, + 0xBDAB: 0x5C06, + 0xBDAC: 0x6D46, + 0xBDAD: 0x6C5F, + 0xBDAE: 0x7586, + 0xBDAF: 0x848B, + 0xBDB0: 0x6868, + 0xBDB1: 0x5956, + 0xBDB2: 0x8BB2, + 0xBDB3: 0x5320, + 0xBDB4: 0x9171, + 0xBDB5: 0x964D, + 0xBDB6: 0x8549, + 0xBDB7: 0x6912, + 0xBDB8: 0x7901, + 0xBDB9: 0x7126, + 0xBDBA: 0x80F6, + 0xBDBB: 0x4EA4, + 0xBDBC: 0x90CA, + 0xBDBD: 0x6D47, + 0xBDBE: 0x9A84, + 0xBDBF: 0x5A07, + 0xBDC0: 0x56BC, + 0xBDC1: 0x6405, + 0xBDC2: 0x94F0, + 0xBDC3: 0x77EB, + 0xBDC4: 0x4FA5, + 0xBDC5: 0x811A, + 0xBDC6: 0x72E1, + 0xBDC7: 0x89D2, + 0xBDC8: 0x997A, + 0xBDC9: 0x7F34, + 0xBDCA: 0x7EDE, + 0xBDCB: 0x527F, + 0xBDCC: 0x6559, + 0xBDCD: 0x9175, + 0xBDCE: 0x8F7F, + 0xBDCF: 0x8F83, + 0xBDD0: 0x53EB, + 0xBDD1: 0x7A96, + 0xBDD2: 0x63ED, + 0xBDD3: 0x63A5, + 0xBDD4: 0x7686, + 0xBDD5: 0x79F8, + 0xBDD6: 0x8857, + 0xBDD7: 0x9636, + 0xBDD8: 0x622A, + 0xBDD9: 0x52AB, + 0xBDDA: 0x8282, + 0xBDDB: 0x6854, + 0xBDDC: 0x6770, + 0xBDDD: 0x6377, + 0xBDDE: 0x776B, + 0xBDDF: 0x7AED, + 0xBDE0: 0x6D01, + 0xBDE1: 0x7ED3, + 0xBDE2: 0x89E3, + 0xBDE3: 0x59D0, + 0xBDE4: 0x6212, + 0xBDE5: 0x85C9, + 0xBDE6: 0x82A5, + 0xBDE7: 0x754C, + 0xBDE8: 0x501F, + 0xBDE9: 0x4ECB, + 0xBDEA: 0x75A5, + 0xBDEB: 0x8BEB, + 0xBDEC: 0x5C4A, + 0xBDED: 0x5DFE, + 0xBDEE: 0x7B4B, + 0xBDEF: 0x65A4, + 0xBDF0: 0x91D1, + 0xBDF1: 0x4ECA, + 0xBDF2: 0x6D25, + 0xBDF3: 0x895F, + 0xBDF4: 0x7D27, + 0xBDF5: 0x9526, + 0xBDF6: 0x4EC5, + 0xBDF7: 0x8C28, + 0xBDF8: 0x8FDB, + 0xBDF9: 0x9773, + 0xBDFA: 0x664B, + 0xBDFB: 0x7981, + 0xBDFC: 0x8FD1, + 0xBDFD: 0x70EC, + 0xBDFE: 0x6D78, + 0xBE40: 0x7D99, + 0xBE41: 0x7D9A, + 0xBE42: 0x7D9B, + 0xBE43: 0x7D9C, + 0xBE44: 0x7D9D, + 0xBE45: 0x7D9E, + 0xBE46: 0x7D9F, + 0xBE47: 0x7DA0, + 0xBE48: 0x7DA1, + 0xBE49: 0x7DA2, + 0xBE4A: 0x7DA3, + 0xBE4B: 0x7DA4, + 0xBE4C: 0x7DA5, + 0xBE4D: 0x7DA7, + 0xBE4E: 0x7DA8, + 0xBE4F: 0x7DA9, + 0xBE50: 0x7DAA, + 0xBE51: 0x7DAB, + 0xBE52: 0x7DAC, + 0xBE53: 0x7DAD, + 0xBE54: 0x7DAF, + 0xBE55: 0x7DB0, + 0xBE56: 0x7DB1, + 0xBE57: 0x7DB2, + 0xBE58: 0x7DB3, + 0xBE59: 0x7DB4, + 0xBE5A: 0x7DB5, + 0xBE5B: 0x7DB6, + 0xBE5C: 0x7DB7, + 0xBE5D: 0x7DB8, + 0xBE5E: 0x7DB9, + 0xBE5F: 0x7DBA, + 0xBE60: 0x7DBB, + 0xBE61: 0x7DBC, + 0xBE62: 0x7DBD, + 0xBE63: 0x7DBE, + 0xBE64: 0x7DBF, + 0xBE65: 0x7DC0, + 0xBE66: 0x7DC1, + 0xBE67: 0x7DC2, + 0xBE68: 0x7DC3, + 0xBE69: 0x7DC4, + 0xBE6A: 0x7DC5, + 0xBE6B: 0x7DC6, + 0xBE6C: 0x7DC7, + 0xBE6D: 0x7DC8, + 0xBE6E: 0x7DC9, + 0xBE6F: 0x7DCA, + 0xBE70: 0x7DCB, + 0xBE71: 0x7DCC, + 0xBE72: 0x7DCD, + 0xBE73: 0x7DCE, + 0xBE74: 0x7DCF, + 0xBE75: 0x7DD0, + 0xBE76: 0x7DD1, + 0xBE77: 0x7DD2, + 0xBE78: 0x7DD3, + 0xBE79: 0x7DD4, + 0xBE7A: 0x7DD5, + 0xBE7B: 0x7DD6, + 0xBE7C: 0x7DD7, + 0xBE7D: 0x7DD8, + 0xBE7E: 0x7DD9, + 0xBE80: 0x7DDA, + 0xBE81: 0x7DDB, + 0xBE82: 0x7DDC, + 0xBE83: 0x7DDD, + 0xBE84: 0x7DDE, + 0xBE85: 0x7DDF, + 0xBE86: 0x7DE0, + 0xBE87: 0x7DE1, + 0xBE88: 0x7DE2, + 0xBE89: 0x7DE3, + 0xBE8A: 0x7DE4, + 0xBE8B: 0x7DE5, + 0xBE8C: 0x7DE6, + 0xBE8D: 0x7DE7, + 0xBE8E: 0x7DE8, + 0xBE8F: 0x7DE9, + 0xBE90: 0x7DEA, + 0xBE91: 0x7DEB, + 0xBE92: 0x7DEC, + 0xBE93: 0x7DED, + 0xBE94: 0x7DEE, + 0xBE95: 0x7DEF, + 0xBE96: 0x7DF0, + 0xBE97: 0x7DF1, + 0xBE98: 0x7DF2, + 0xBE99: 0x7DF3, + 0xBE9A: 0x7DF4, + 0xBE9B: 0x7DF5, + 0xBE9C: 0x7DF6, + 0xBE9D: 0x7DF7, + 0xBE9E: 0x7DF8, + 0xBE9F: 0x7DF9, + 0xBEA0: 0x7DFA, + 0xBEA1: 0x5C3D, + 0xBEA2: 0x52B2, + 0xBEA3: 0x8346, + 0xBEA4: 0x5162, + 0xBEA5: 0x830E, + 0xBEA6: 0x775B, + 0xBEA7: 0x6676, + 0xBEA8: 0x9CB8, + 0xBEA9: 0x4EAC, + 0xBEAA: 0x60CA, + 0xBEAB: 0x7CBE, + 0xBEAC: 0x7CB3, + 0xBEAD: 0x7ECF, + 0xBEAE: 0x4E95, + 0xBEAF: 0x8B66, + 0xBEB0: 0x666F, + 0xBEB1: 0x9888, + 0xBEB2: 0x9759, + 0xBEB3: 0x5883, + 0xBEB4: 0x656C, + 0xBEB5: 0x955C, + 0xBEB6: 0x5F84, + 0xBEB7: 0x75C9, + 0xBEB8: 0x9756, + 0xBEB9: 0x7ADF, + 0xBEBA: 0x7ADE, + 0xBEBB: 0x51C0, + 0xBEBC: 0x70AF, + 0xBEBD: 0x7A98, + 0xBEBE: 0x63EA, + 0xBEBF: 0x7A76, + 0xBEC0: 0x7EA0, + 0xBEC1: 0x7396, + 0xBEC2: 0x97ED, + 0xBEC3: 0x4E45, + 0xBEC4: 0x7078, + 0xBEC5: 0x4E5D, + 0xBEC6: 0x9152, + 0xBEC7: 0x53A9, + 0xBEC8: 0x6551, + 0xBEC9: 0x65E7, + 0xBECA: 0x81FC, + 0xBECB: 0x8205, + 0xBECC: 0x548E, + 0xBECD: 0x5C31, + 0xBECE: 0x759A, + 0xBECF: 0x97A0, + 0xBED0: 0x62D8, + 0xBED1: 0x72D9, + 0xBED2: 0x75BD, + 0xBED3: 0x5C45, + 0xBED4: 0x9A79, + 0xBED5: 0x83CA, + 0xBED6: 0x5C40, + 0xBED7: 0x5480, + 0xBED8: 0x77E9, + 0xBED9: 0x4E3E, + 0xBEDA: 0x6CAE, + 0xBEDB: 0x805A, + 0xBEDC: 0x62D2, + 0xBEDD: 0x636E, + 0xBEDE: 0x5DE8, + 0xBEDF: 0x5177, + 0xBEE0: 0x8DDD, + 0xBEE1: 0x8E1E, + 0xBEE2: 0x952F, + 0xBEE3: 0x4FF1, + 0xBEE4: 0x53E5, + 0xBEE5: 0x60E7, + 0xBEE6: 0x70AC, + 0xBEE7: 0x5267, + 0xBEE8: 0x6350, + 0xBEE9: 0x9E43, + 0xBEEA: 0x5A1F, + 0xBEEB: 0x5026, + 0xBEEC: 0x7737, + 0xBEED: 0x5377, + 0xBEEE: 0x7EE2, + 0xBEEF: 0x6485, + 0xBEF0: 0x652B, + 0xBEF1: 0x6289, + 0xBEF2: 0x6398, + 0xBEF3: 0x5014, + 0xBEF4: 0x7235, + 0xBEF5: 0x89C9, + 0xBEF6: 0x51B3, + 0xBEF7: 0x8BC0, + 0xBEF8: 0x7EDD, + 0xBEF9: 0x5747, + 0xBEFA: 0x83CC, + 0xBEFB: 0x94A7, + 0xBEFC: 0x519B, + 0xBEFD: 0x541B, + 0xBEFE: 0x5CFB, + 0xBF40: 0x7DFB, + 0xBF41: 0x7DFC, + 0xBF42: 0x7DFD, + 0xBF43: 0x7DFE, + 0xBF44: 0x7DFF, + 0xBF45: 0x7E00, + 0xBF46: 0x7E01, + 0xBF47: 0x7E02, + 0xBF48: 0x7E03, + 0xBF49: 0x7E04, + 0xBF4A: 0x7E05, + 0xBF4B: 0x7E06, + 0xBF4C: 0x7E07, + 0xBF4D: 0x7E08, + 0xBF4E: 0x7E09, + 0xBF4F: 0x7E0A, + 0xBF50: 0x7E0B, + 0xBF51: 0x7E0C, + 0xBF52: 0x7E0D, + 0xBF53: 0x7E0E, + 0xBF54: 0x7E0F, + 0xBF55: 0x7E10, + 0xBF56: 0x7E11, + 0xBF57: 0x7E12, + 0xBF58: 0x7E13, + 0xBF59: 0x7E14, + 0xBF5A: 0x7E15, + 0xBF5B: 0x7E16, + 0xBF5C: 0x7E17, + 0xBF5D: 0x7E18, + 0xBF5E: 0x7E19, + 0xBF5F: 0x7E1A, + 0xBF60: 0x7E1B, + 0xBF61: 0x7E1C, + 0xBF62: 0x7E1D, + 0xBF63: 0x7E1E, + 0xBF64: 0x7E1F, + 0xBF65: 0x7E20, + 0xBF66: 0x7E21, + 0xBF67: 0x7E22, + 0xBF68: 0x7E23, + 0xBF69: 0x7E24, + 0xBF6A: 0x7E25, + 0xBF6B: 0x7E26, + 0xBF6C: 0x7E27, + 0xBF6D: 0x7E28, + 0xBF6E: 0x7E29, + 0xBF6F: 0x7E2A, + 0xBF70: 0x7E2B, + 0xBF71: 0x7E2C, + 0xBF72: 0x7E2D, + 0xBF73: 0x7E2E, + 0xBF74: 0x7E2F, + 0xBF75: 0x7E30, + 0xBF76: 0x7E31, + 0xBF77: 0x7E32, + 0xBF78: 0x7E33, + 0xBF79: 0x7E34, + 0xBF7A: 0x7E35, + 0xBF7B: 0x7E36, + 0xBF7C: 0x7E37, + 0xBF7D: 0x7E38, + 0xBF7E: 0x7E39, + 0xBF80: 0x7E3A, + 0xBF81: 0x7E3C, + 0xBF82: 0x7E3D, + 0xBF83: 0x7E3E, + 0xBF84: 0x7E3F, + 0xBF85: 0x7E40, + 0xBF86: 0x7E42, + 0xBF87: 0x7E43, + 0xBF88: 0x7E44, + 0xBF89: 0x7E45, + 0xBF8A: 0x7E46, + 0xBF8B: 0x7E48, + 0xBF8C: 0x7E49, + 0xBF8D: 0x7E4A, + 0xBF8E: 0x7E4B, + 0xBF8F: 0x7E4C, + 0xBF90: 0x7E4D, + 0xBF91: 0x7E4E, + 0xBF92: 0x7E4F, + 0xBF93: 0x7E50, + 0xBF94: 0x7E51, + 0xBF95: 0x7E52, + 0xBF96: 0x7E53, + 0xBF97: 0x7E54, + 0xBF98: 0x7E55, + 0xBF99: 0x7E56, + 0xBF9A: 0x7E57, + 0xBF9B: 0x7E58, + 0xBF9C: 0x7E59, + 0xBF9D: 0x7E5A, + 0xBF9E: 0x7E5B, + 0xBF9F: 0x7E5C, + 0xBFA0: 0x7E5D, + 0xBFA1: 0x4FCA, + 0xBFA2: 0x7AE3, + 0xBFA3: 0x6D5A, + 0xBFA4: 0x90E1, + 0xBFA5: 0x9A8F, + 0xBFA6: 0x5580, + 0xBFA7: 0x5496, + 0xBFA8: 0x5361, + 0xBFA9: 0x54AF, + 0xBFAA: 0x5F00, + 0xBFAB: 0x63E9, + 0xBFAC: 0x6977, + 0xBFAD: 0x51EF, + 0xBFAE: 0x6168, + 0xBFAF: 0x520A, + 0xBFB0: 0x582A, + 0xBFB1: 0x52D8, + 0xBFB2: 0x574E, + 0xBFB3: 0x780D, + 0xBFB4: 0x770B, + 0xBFB5: 0x5EB7, + 0xBFB6: 0x6177, + 0xBFB7: 0x7CE0, + 0xBFB8: 0x625B, + 0xBFB9: 0x6297, + 0xBFBA: 0x4EA2, + 0xBFBB: 0x7095, + 0xBFBC: 0x8003, + 0xBFBD: 0x62F7, + 0xBFBE: 0x70E4, + 0xBFBF: 0x9760, + 0xBFC0: 0x5777, + 0xBFC1: 0x82DB, + 0xBFC2: 0x67EF, + 0xBFC3: 0x68F5, + 0xBFC4: 0x78D5, + 0xBFC5: 0x9897, + 0xBFC6: 0x79D1, + 0xBFC7: 0x58F3, + 0xBFC8: 0x54B3, + 0xBFC9: 0x53EF, + 0xBFCA: 0x6E34, + 0xBFCB: 0x514B, + 0xBFCC: 0x523B, + 0xBFCD: 0x5BA2, + 0xBFCE: 0x8BFE, + 0xBFCF: 0x80AF, + 0xBFD0: 0x5543, + 0xBFD1: 0x57A6, + 0xBFD2: 0x6073, + 0xBFD3: 0x5751, + 0xBFD4: 0x542D, + 0xBFD5: 0x7A7A, + 0xBFD6: 0x6050, + 0xBFD7: 0x5B54, + 0xBFD8: 0x63A7, + 0xBFD9: 0x62A0, + 0xBFDA: 0x53E3, + 0xBFDB: 0x6263, + 0xBFDC: 0x5BC7, + 0xBFDD: 0x67AF, + 0xBFDE: 0x54ED, + 0xBFDF: 0x7A9F, + 0xBFE0: 0x82E6, + 0xBFE1: 0x9177, + 0xBFE2: 0x5E93, + 0xBFE3: 0x88E4, + 0xBFE4: 0x5938, + 0xBFE5: 0x57AE, + 0xBFE6: 0x630E, + 0xBFE7: 0x8DE8, + 0xBFE8: 0x80EF, + 0xBFE9: 0x5757, + 0xBFEA: 0x7B77, + 0xBFEB: 0x4FA9, + 0xBFEC: 0x5FEB, + 0xBFED: 0x5BBD, + 0xBFEE: 0x6B3E, + 0xBFEF: 0x5321, + 0xBFF0: 0x7B50, + 0xBFF1: 0x72C2, + 0xBFF2: 0x6846, + 0xBFF3: 0x77FF, + 0xBFF4: 0x7736, + 0xBFF5: 0x65F7, + 0xBFF6: 0x51B5, + 0xBFF7: 0x4E8F, + 0xBFF8: 0x76D4, + 0xBFF9: 0x5CBF, + 0xBFFA: 0x7AA5, + 0xBFFB: 0x8475, + 0xBFFC: 0x594E, + 0xBFFD: 0x9B41, + 0xBFFE: 0x5080, + 0xC040: 0x7E5E, + 0xC041: 0x7E5F, + 0xC042: 0x7E60, + 0xC043: 0x7E61, + 0xC044: 0x7E62, + 0xC045: 0x7E63, + 0xC046: 0x7E64, + 0xC047: 0x7E65, + 0xC048: 0x7E66, + 0xC049: 0x7E67, + 0xC04A: 0x7E68, + 0xC04B: 0x7E69, + 0xC04C: 0x7E6A, + 0xC04D: 0x7E6B, + 0xC04E: 0x7E6C, + 0xC04F: 0x7E6D, + 0xC050: 0x7E6E, + 0xC051: 0x7E6F, + 0xC052: 0x7E70, + 0xC053: 0x7E71, + 0xC054: 0x7E72, + 0xC055: 0x7E73, + 0xC056: 0x7E74, + 0xC057: 0x7E75, + 0xC058: 0x7E76, + 0xC059: 0x7E77, + 0xC05A: 0x7E78, + 0xC05B: 0x7E79, + 0xC05C: 0x7E7A, + 0xC05D: 0x7E7B, + 0xC05E: 0x7E7C, + 0xC05F: 0x7E7D, + 0xC060: 0x7E7E, + 0xC061: 0x7E7F, + 0xC062: 0x7E80, + 0xC063: 0x7E81, + 0xC064: 0x7E83, + 0xC065: 0x7E84, + 0xC066: 0x7E85, + 0xC067: 0x7E86, + 0xC068: 0x7E87, + 0xC069: 0x7E88, + 0xC06A: 0x7E89, + 0xC06B: 0x7E8A, + 0xC06C: 0x7E8B, + 0xC06D: 0x7E8C, + 0xC06E: 0x7E8D, + 0xC06F: 0x7E8E, + 0xC070: 0x7E8F, + 0xC071: 0x7E90, + 0xC072: 0x7E91, + 0xC073: 0x7E92, + 0xC074: 0x7E93, + 0xC075: 0x7E94, + 0xC076: 0x7E95, + 0xC077: 0x7E96, + 0xC078: 0x7E97, + 0xC079: 0x7E98, + 0xC07A: 0x7E99, + 0xC07B: 0x7E9A, + 0xC07C: 0x7E9C, + 0xC07D: 0x7E9D, + 0xC07E: 0x7E9E, + 0xC080: 0x7EAE, + 0xC081: 0x7EB4, + 0xC082: 0x7EBB, + 0xC083: 0x7EBC, + 0xC084: 0x7ED6, + 0xC085: 0x7EE4, + 0xC086: 0x7EEC, + 0xC087: 0x7EF9, + 0xC088: 0x7F0A, + 0xC089: 0x7F10, + 0xC08A: 0x7F1E, + 0xC08B: 0x7F37, + 0xC08C: 0x7F39, + 0xC08D: 0x7F3B, + 0xC08E: 0x7F3C, + 0xC08F: 0x7F3D, + 0xC090: 0x7F3E, + 0xC091: 0x7F3F, + 0xC092: 0x7F40, + 0xC093: 0x7F41, + 0xC094: 0x7F43, + 0xC095: 0x7F46, + 0xC096: 0x7F47, + 0xC097: 0x7F48, + 0xC098: 0x7F49, + 0xC099: 0x7F4A, + 0xC09A: 0x7F4B, + 0xC09B: 0x7F4C, + 0xC09C: 0x7F4D, + 0xC09D: 0x7F4E, + 0xC09E: 0x7F4F, + 0xC09F: 0x7F52, + 0xC0A0: 0x7F53, + 0xC0A1: 0x9988, + 0xC0A2: 0x6127, + 0xC0A3: 0x6E83, + 0xC0A4: 0x5764, + 0xC0A5: 0x6606, + 0xC0A6: 0x6346, + 0xC0A7: 0x56F0, + 0xC0A8: 0x62EC, + 0xC0A9: 0x6269, + 0xC0AA: 0x5ED3, + 0xC0AB: 0x9614, + 0xC0AC: 0x5783, + 0xC0AD: 0x62C9, + 0xC0AE: 0x5587, + 0xC0AF: 0x8721, + 0xC0B0: 0x814A, + 0xC0B1: 0x8FA3, + 0xC0B2: 0x5566, + 0xC0B3: 0x83B1, + 0xC0B4: 0x6765, + 0xC0B5: 0x8D56, + 0xC0B6: 0x84DD, + 0xC0B7: 0x5A6A, + 0xC0B8: 0x680F, + 0xC0B9: 0x62E6, + 0xC0BA: 0x7BEE, + 0xC0BB: 0x9611, + 0xC0BC: 0x5170, + 0xC0BD: 0x6F9C, + 0xC0BE: 0x8C30, + 0xC0BF: 0x63FD, + 0xC0C0: 0x89C8, + 0xC0C1: 0x61D2, + 0xC0C2: 0x7F06, + 0xC0C3: 0x70C2, + 0xC0C4: 0x6EE5, + 0xC0C5: 0x7405, + 0xC0C6: 0x6994, + 0xC0C7: 0x72FC, + 0xC0C8: 0x5ECA, + 0xC0C9: 0x90CE, + 0xC0CA: 0x6717, + 0xC0CB: 0x6D6A, + 0xC0CC: 0x635E, + 0xC0CD: 0x52B3, + 0xC0CE: 0x7262, + 0xC0CF: 0x8001, + 0xC0D0: 0x4F6C, + 0xC0D1: 0x59E5, + 0xC0D2: 0x916A, + 0xC0D3: 0x70D9, + 0xC0D4: 0x6D9D, + 0xC0D5: 0x52D2, + 0xC0D6: 0x4E50, + 0xC0D7: 0x96F7, + 0xC0D8: 0x956D, + 0xC0D9: 0x857E, + 0xC0DA: 0x78CA, + 0xC0DB: 0x7D2F, + 0xC0DC: 0x5121, + 0xC0DD: 0x5792, + 0xC0DE: 0x64C2, + 0xC0DF: 0x808B, + 0xC0E0: 0x7C7B, + 0xC0E1: 0x6CEA, + 0xC0E2: 0x68F1, + 0xC0E3: 0x695E, + 0xC0E4: 0x51B7, + 0xC0E5: 0x5398, + 0xC0E6: 0x68A8, + 0xC0E7: 0x7281, + 0xC0E8: 0x9ECE, + 0xC0E9: 0x7BF1, + 0xC0EA: 0x72F8, + 0xC0EB: 0x79BB, + 0xC0EC: 0x6F13, + 0xC0ED: 0x7406, + 0xC0EE: 0x674E, + 0xC0EF: 0x91CC, + 0xC0F0: 0x9CA4, + 0xC0F1: 0x793C, + 0xC0F2: 0x8389, + 0xC0F3: 0x8354, + 0xC0F4: 0x540F, + 0xC0F5: 0x6817, + 0xC0F6: 0x4E3D, + 0xC0F7: 0x5389, + 0xC0F8: 0x52B1, + 0xC0F9: 0x783E, + 0xC0FA: 0x5386, + 0xC0FB: 0x5229, + 0xC0FC: 0x5088, + 0xC0FD: 0x4F8B, + 0xC0FE: 0x4FD0, + 0xC140: 0x7F56, + 0xC141: 0x7F59, + 0xC142: 0x7F5B, + 0xC143: 0x7F5C, + 0xC144: 0x7F5D, + 0xC145: 0x7F5E, + 0xC146: 0x7F60, + 0xC147: 0x7F63, + 0xC148: 0x7F64, + 0xC149: 0x7F65, + 0xC14A: 0x7F66, + 0xC14B: 0x7F67, + 0xC14C: 0x7F6B, + 0xC14D: 0x7F6C, + 0xC14E: 0x7F6D, + 0xC14F: 0x7F6F, + 0xC150: 0x7F70, + 0xC151: 0x7F73, + 0xC152: 0x7F75, + 0xC153: 0x7F76, + 0xC154: 0x7F77, + 0xC155: 0x7F78, + 0xC156: 0x7F7A, + 0xC157: 0x7F7B, + 0xC158: 0x7F7C, + 0xC159: 0x7F7D, + 0xC15A: 0x7F7F, + 0xC15B: 0x7F80, + 0xC15C: 0x7F82, + 0xC15D: 0x7F83, + 0xC15E: 0x7F84, + 0xC15F: 0x7F85, + 0xC160: 0x7F86, + 0xC161: 0x7F87, + 0xC162: 0x7F88, + 0xC163: 0x7F89, + 0xC164: 0x7F8B, + 0xC165: 0x7F8D, + 0xC166: 0x7F8F, + 0xC167: 0x7F90, + 0xC168: 0x7F91, + 0xC169: 0x7F92, + 0xC16A: 0x7F93, + 0xC16B: 0x7F95, + 0xC16C: 0x7F96, + 0xC16D: 0x7F97, + 0xC16E: 0x7F98, + 0xC16F: 0x7F99, + 0xC170: 0x7F9B, + 0xC171: 0x7F9C, + 0xC172: 0x7FA0, + 0xC173: 0x7FA2, + 0xC174: 0x7FA3, + 0xC175: 0x7FA5, + 0xC176: 0x7FA6, + 0xC177: 0x7FA8, + 0xC178: 0x7FA9, + 0xC179: 0x7FAA, + 0xC17A: 0x7FAB, + 0xC17B: 0x7FAC, + 0xC17C: 0x7FAD, + 0xC17D: 0x7FAE, + 0xC17E: 0x7FB1, + 0xC180: 0x7FB3, + 0xC181: 0x7FB4, + 0xC182: 0x7FB5, + 0xC183: 0x7FB6, + 0xC184: 0x7FB7, + 0xC185: 0x7FBA, + 0xC186: 0x7FBB, + 0xC187: 0x7FBE, + 0xC188: 0x7FC0, + 0xC189: 0x7FC2, + 0xC18A: 0x7FC3, + 0xC18B: 0x7FC4, + 0xC18C: 0x7FC6, + 0xC18D: 0x7FC7, + 0xC18E: 0x7FC8, + 0xC18F: 0x7FC9, + 0xC190: 0x7FCB, + 0xC191: 0x7FCD, + 0xC192: 0x7FCF, + 0xC193: 0x7FD0, + 0xC194: 0x7FD1, + 0xC195: 0x7FD2, + 0xC196: 0x7FD3, + 0xC197: 0x7FD6, + 0xC198: 0x7FD7, + 0xC199: 0x7FD9, + 0xC19A: 0x7FDA, + 0xC19B: 0x7FDB, + 0xC19C: 0x7FDC, + 0xC19D: 0x7FDD, + 0xC19E: 0x7FDE, + 0xC19F: 0x7FE2, + 0xC1A0: 0x7FE3, + 0xC1A1: 0x75E2, + 0xC1A2: 0x7ACB, + 0xC1A3: 0x7C92, + 0xC1A4: 0x6CA5, + 0xC1A5: 0x96B6, + 0xC1A6: 0x529B, + 0xC1A7: 0x7483, + 0xC1A8: 0x54E9, + 0xC1A9: 0x4FE9, + 0xC1AA: 0x8054, + 0xC1AB: 0x83B2, + 0xC1AC: 0x8FDE, + 0xC1AD: 0x9570, + 0xC1AE: 0x5EC9, + 0xC1AF: 0x601C, + 0xC1B0: 0x6D9F, + 0xC1B1: 0x5E18, + 0xC1B2: 0x655B, + 0xC1B3: 0x8138, + 0xC1B4: 0x94FE, + 0xC1B5: 0x604B, + 0xC1B6: 0x70BC, + 0xC1B7: 0x7EC3, + 0xC1B8: 0x7CAE, + 0xC1B9: 0x51C9, + 0xC1BA: 0x6881, + 0xC1BB: 0x7CB1, + 0xC1BC: 0x826F, + 0xC1BD: 0x4E24, + 0xC1BE: 0x8F86, + 0xC1BF: 0x91CF, + 0xC1C0: 0x667E, + 0xC1C1: 0x4EAE, + 0xC1C2: 0x8C05, + 0xC1C3: 0x64A9, + 0xC1C4: 0x804A, + 0xC1C5: 0x50DA, + 0xC1C6: 0x7597, + 0xC1C7: 0x71CE, + 0xC1C8: 0x5BE5, + 0xC1C9: 0x8FBD, + 0xC1CA: 0x6F66, + 0xC1CB: 0x4E86, + 0xC1CC: 0x6482, + 0xC1CD: 0x9563, + 0xC1CE: 0x5ED6, + 0xC1CF: 0x6599, + 0xC1D0: 0x5217, + 0xC1D1: 0x88C2, + 0xC1D2: 0x70C8, + 0xC1D3: 0x52A3, + 0xC1D4: 0x730E, + 0xC1D5: 0x7433, + 0xC1D6: 0x6797, + 0xC1D7: 0x78F7, + 0xC1D8: 0x9716, + 0xC1D9: 0x4E34, + 0xC1DA: 0x90BB, + 0xC1DB: 0x9CDE, + 0xC1DC: 0x6DCB, + 0xC1DD: 0x51DB, + 0xC1DE: 0x8D41, + 0xC1DF: 0x541D, + 0xC1E0: 0x62CE, + 0xC1E1: 0x73B2, + 0xC1E2: 0x83F1, + 0xC1E3: 0x96F6, + 0xC1E4: 0x9F84, + 0xC1E5: 0x94C3, + 0xC1E6: 0x4F36, + 0xC1E7: 0x7F9A, + 0xC1E8: 0x51CC, + 0xC1E9: 0x7075, + 0xC1EA: 0x9675, + 0xC1EB: 0x5CAD, + 0xC1EC: 0x9886, + 0xC1ED: 0x53E6, + 0xC1EE: 0x4EE4, + 0xC1EF: 0x6E9C, + 0xC1F0: 0x7409, + 0xC1F1: 0x69B4, + 0xC1F2: 0x786B, + 0xC1F3: 0x998F, + 0xC1F4: 0x7559, + 0xC1F5: 0x5218, + 0xC1F6: 0x7624, + 0xC1F7: 0x6D41, + 0xC1F8: 0x67F3, + 0xC1F9: 0x516D, + 0xC1FA: 0x9F99, + 0xC1FB: 0x804B, + 0xC1FC: 0x5499, + 0xC1FD: 0x7B3C, + 0xC1FE: 0x7ABF, + 0xC240: 0x7FE4, + 0xC241: 0x7FE7, + 0xC242: 0x7FE8, + 0xC243: 0x7FEA, + 0xC244: 0x7FEB, + 0xC245: 0x7FEC, + 0xC246: 0x7FED, + 0xC247: 0x7FEF, + 0xC248: 0x7FF2, + 0xC249: 0x7FF4, + 0xC24A: 0x7FF5, + 0xC24B: 0x7FF6, + 0xC24C: 0x7FF7, + 0xC24D: 0x7FF8, + 0xC24E: 0x7FF9, + 0xC24F: 0x7FFA, + 0xC250: 0x7FFD, + 0xC251: 0x7FFE, + 0xC252: 0x7FFF, + 0xC253: 0x8002, + 0xC254: 0x8007, + 0xC255: 0x8008, + 0xC256: 0x8009, + 0xC257: 0x800A, + 0xC258: 0x800E, + 0xC259: 0x800F, + 0xC25A: 0x8011, + 0xC25B: 0x8013, + 0xC25C: 0x801A, + 0xC25D: 0x801B, + 0xC25E: 0x801D, + 0xC25F: 0x801E, + 0xC260: 0x801F, + 0xC261: 0x8021, + 0xC262: 0x8023, + 0xC263: 0x8024, + 0xC264: 0x802B, + 0xC265: 0x802C, + 0xC266: 0x802D, + 0xC267: 0x802E, + 0xC268: 0x802F, + 0xC269: 0x8030, + 0xC26A: 0x8032, + 0xC26B: 0x8034, + 0xC26C: 0x8039, + 0xC26D: 0x803A, + 0xC26E: 0x803C, + 0xC26F: 0x803E, + 0xC270: 0x8040, + 0xC271: 0x8041, + 0xC272: 0x8044, + 0xC273: 0x8045, + 0xC274: 0x8047, + 0xC275: 0x8048, + 0xC276: 0x8049, + 0xC277: 0x804E, + 0xC278: 0x804F, + 0xC279: 0x8050, + 0xC27A: 0x8051, + 0xC27B: 0x8053, + 0xC27C: 0x8055, + 0xC27D: 0x8056, + 0xC27E: 0x8057, + 0xC280: 0x8059, + 0xC281: 0x805B, + 0xC282: 0x805C, + 0xC283: 0x805D, + 0xC284: 0x805E, + 0xC285: 0x805F, + 0xC286: 0x8060, + 0xC287: 0x8061, + 0xC288: 0x8062, + 0xC289: 0x8063, + 0xC28A: 0x8064, + 0xC28B: 0x8065, + 0xC28C: 0x8066, + 0xC28D: 0x8067, + 0xC28E: 0x8068, + 0xC28F: 0x806B, + 0xC290: 0x806C, + 0xC291: 0x806D, + 0xC292: 0x806E, + 0xC293: 0x806F, + 0xC294: 0x8070, + 0xC295: 0x8072, + 0xC296: 0x8073, + 0xC297: 0x8074, + 0xC298: 0x8075, + 0xC299: 0x8076, + 0xC29A: 0x8077, + 0xC29B: 0x8078, + 0xC29C: 0x8079, + 0xC29D: 0x807A, + 0xC29E: 0x807B, + 0xC29F: 0x807C, + 0xC2A0: 0x807D, + 0xC2A1: 0x9686, + 0xC2A2: 0x5784, + 0xC2A3: 0x62E2, + 0xC2A4: 0x9647, + 0xC2A5: 0x697C, + 0xC2A6: 0x5A04, + 0xC2A7: 0x6402, + 0xC2A8: 0x7BD3, + 0xC2A9: 0x6F0F, + 0xC2AA: 0x964B, + 0xC2AB: 0x82A6, + 0xC2AC: 0x5362, + 0xC2AD: 0x9885, + 0xC2AE: 0x5E90, + 0xC2AF: 0x7089, + 0xC2B0: 0x63B3, + 0xC2B1: 0x5364, + 0xC2B2: 0x864F, + 0xC2B3: 0x9C81, + 0xC2B4: 0x9E93, + 0xC2B5: 0x788C, + 0xC2B6: 0x9732, + 0xC2B7: 0x8DEF, + 0xC2B8: 0x8D42, + 0xC2B9: 0x9E7F, + 0xC2BA: 0x6F5E, + 0xC2BB: 0x7984, + 0xC2BC: 0x5F55, + 0xC2BD: 0x9646, + 0xC2BE: 0x622E, + 0xC2BF: 0x9A74, + 0xC2C0: 0x5415, + 0xC2C1: 0x94DD, + 0xC2C2: 0x4FA3, + 0xC2C3: 0x65C5, + 0xC2C4: 0x5C65, + 0xC2C5: 0x5C61, + 0xC2C6: 0x7F15, + 0xC2C7: 0x8651, + 0xC2C8: 0x6C2F, + 0xC2C9: 0x5F8B, + 0xC2CA: 0x7387, + 0xC2CB: 0x6EE4, + 0xC2CC: 0x7EFF, + 0xC2CD: 0x5CE6, + 0xC2CE: 0x631B, + 0xC2CF: 0x5B6A, + 0xC2D0: 0x6EE6, + 0xC2D1: 0x5375, + 0xC2D2: 0x4E71, + 0xC2D3: 0x63A0, + 0xC2D4: 0x7565, + 0xC2D5: 0x62A1, + 0xC2D6: 0x8F6E, + 0xC2D7: 0x4F26, + 0xC2D8: 0x4ED1, + 0xC2D9: 0x6CA6, + 0xC2DA: 0x7EB6, + 0xC2DB: 0x8BBA, + 0xC2DC: 0x841D, + 0xC2DD: 0x87BA, + 0xC2DE: 0x7F57, + 0xC2DF: 0x903B, + 0xC2E0: 0x9523, + 0xC2E1: 0x7BA9, + 0xC2E2: 0x9AA1, + 0xC2E3: 0x88F8, + 0xC2E4: 0x843D, + 0xC2E5: 0x6D1B, + 0xC2E6: 0x9A86, + 0xC2E7: 0x7EDC, + 0xC2E8: 0x5988, + 0xC2E9: 0x9EBB, + 0xC2EA: 0x739B, + 0xC2EB: 0x7801, + 0xC2EC: 0x8682, + 0xC2ED: 0x9A6C, + 0xC2EE: 0x9A82, + 0xC2EF: 0x561B, + 0xC2F0: 0x5417, + 0xC2F1: 0x57CB, + 0xC2F2: 0x4E70, + 0xC2F3: 0x9EA6, + 0xC2F4: 0x5356, + 0xC2F5: 0x8FC8, + 0xC2F6: 0x8109, + 0xC2F7: 0x7792, + 0xC2F8: 0x9992, + 0xC2F9: 0x86EE, + 0xC2FA: 0x6EE1, + 0xC2FB: 0x8513, + 0xC2FC: 0x66FC, + 0xC2FD: 0x6162, + 0xC2FE: 0x6F2B, + 0xC340: 0x807E, + 0xC341: 0x8081, + 0xC342: 0x8082, + 0xC343: 0x8085, + 0xC344: 0x8088, + 0xC345: 0x808A, + 0xC346: 0x808D, + 0xC347: 0x808E, + 0xC348: 0x808F, + 0xC349: 0x8090, + 0xC34A: 0x8091, + 0xC34B: 0x8092, + 0xC34C: 0x8094, + 0xC34D: 0x8095, + 0xC34E: 0x8097, + 0xC34F: 0x8099, + 0xC350: 0x809E, + 0xC351: 0x80A3, + 0xC352: 0x80A6, + 0xC353: 0x80A7, + 0xC354: 0x80A8, + 0xC355: 0x80AC, + 0xC356: 0x80B0, + 0xC357: 0x80B3, + 0xC358: 0x80B5, + 0xC359: 0x80B6, + 0xC35A: 0x80B8, + 0xC35B: 0x80B9, + 0xC35C: 0x80BB, + 0xC35D: 0x80C5, + 0xC35E: 0x80C7, + 0xC35F: 0x80C8, + 0xC360: 0x80C9, + 0xC361: 0x80CA, + 0xC362: 0x80CB, + 0xC363: 0x80CF, + 0xC364: 0x80D0, + 0xC365: 0x80D1, + 0xC366: 0x80D2, + 0xC367: 0x80D3, + 0xC368: 0x80D4, + 0xC369: 0x80D5, + 0xC36A: 0x80D8, + 0xC36B: 0x80DF, + 0xC36C: 0x80E0, + 0xC36D: 0x80E2, + 0xC36E: 0x80E3, + 0xC36F: 0x80E6, + 0xC370: 0x80EE, + 0xC371: 0x80F5, + 0xC372: 0x80F7, + 0xC373: 0x80F9, + 0xC374: 0x80FB, + 0xC375: 0x80FE, + 0xC376: 0x80FF, + 0xC377: 0x8100, + 0xC378: 0x8101, + 0xC379: 0x8103, + 0xC37A: 0x8104, + 0xC37B: 0x8105, + 0xC37C: 0x8107, + 0xC37D: 0x8108, + 0xC37E: 0x810B, + 0xC380: 0x810C, + 0xC381: 0x8115, + 0xC382: 0x8117, + 0xC383: 0x8119, + 0xC384: 0x811B, + 0xC385: 0x811C, + 0xC386: 0x811D, + 0xC387: 0x811F, + 0xC388: 0x8120, + 0xC389: 0x8121, + 0xC38A: 0x8122, + 0xC38B: 0x8123, + 0xC38C: 0x8124, + 0xC38D: 0x8125, + 0xC38E: 0x8126, + 0xC38F: 0x8127, + 0xC390: 0x8128, + 0xC391: 0x8129, + 0xC392: 0x812A, + 0xC393: 0x812B, + 0xC394: 0x812D, + 0xC395: 0x812E, + 0xC396: 0x8130, + 0xC397: 0x8133, + 0xC398: 0x8134, + 0xC399: 0x8135, + 0xC39A: 0x8137, + 0xC39B: 0x8139, + 0xC39C: 0x813A, + 0xC39D: 0x813B, + 0xC39E: 0x813C, + 0xC39F: 0x813D, + 0xC3A0: 0x813F, + 0xC3A1: 0x8C29, + 0xC3A2: 0x8292, + 0xC3A3: 0x832B, + 0xC3A4: 0x76F2, + 0xC3A5: 0x6C13, + 0xC3A6: 0x5FD9, + 0xC3A7: 0x83BD, + 0xC3A8: 0x732B, + 0xC3A9: 0x8305, + 0xC3AA: 0x951A, + 0xC3AB: 0x6BDB, + 0xC3AC: 0x77DB, + 0xC3AD: 0x94C6, + 0xC3AE: 0x536F, + 0xC3AF: 0x8302, + 0xC3B0: 0x5192, + 0xC3B1: 0x5E3D, + 0xC3B2: 0x8C8C, + 0xC3B3: 0x8D38, + 0xC3B4: 0x4E48, + 0xC3B5: 0x73AB, + 0xC3B6: 0x679A, + 0xC3B7: 0x6885, + 0xC3B8: 0x9176, + 0xC3B9: 0x9709, + 0xC3BA: 0x7164, + 0xC3BB: 0x6CA1, + 0xC3BC: 0x7709, + 0xC3BD: 0x5A92, + 0xC3BE: 0x9541, + 0xC3BF: 0x6BCF, + 0xC3C0: 0x7F8E, + 0xC3C1: 0x6627, + 0xC3C2: 0x5BD0, + 0xC3C3: 0x59B9, + 0xC3C4: 0x5A9A, + 0xC3C5: 0x95E8, + 0xC3C6: 0x95F7, + 0xC3C7: 0x4EEC, + 0xC3C8: 0x840C, + 0xC3C9: 0x8499, + 0xC3CA: 0x6AAC, + 0xC3CB: 0x76DF, + 0xC3CC: 0x9530, + 0xC3CD: 0x731B, + 0xC3CE: 0x68A6, + 0xC3CF: 0x5B5F, + 0xC3D0: 0x772F, + 0xC3D1: 0x919A, + 0xC3D2: 0x9761, + 0xC3D3: 0x7CDC, + 0xC3D4: 0x8FF7, + 0xC3D5: 0x8C1C, + 0xC3D6: 0x5F25, + 0xC3D7: 0x7C73, + 0xC3D8: 0x79D8, + 0xC3D9: 0x89C5, + 0xC3DA: 0x6CCC, + 0xC3DB: 0x871C, + 0xC3DC: 0x5BC6, + 0xC3DD: 0x5E42, + 0xC3DE: 0x68C9, + 0xC3DF: 0x7720, + 0xC3E0: 0x7EF5, + 0xC3E1: 0x5195, + 0xC3E2: 0x514D, + 0xC3E3: 0x52C9, + 0xC3E4: 0x5A29, + 0xC3E5: 0x7F05, + 0xC3E6: 0x9762, + 0xC3E7: 0x82D7, + 0xC3E8: 0x63CF, + 0xC3E9: 0x7784, + 0xC3EA: 0x85D0, + 0xC3EB: 0x79D2, + 0xC3EC: 0x6E3A, + 0xC3ED: 0x5E99, + 0xC3EE: 0x5999, + 0xC3EF: 0x8511, + 0xC3F0: 0x706D, + 0xC3F1: 0x6C11, + 0xC3F2: 0x62BF, + 0xC3F3: 0x76BF, + 0xC3F4: 0x654F, + 0xC3F5: 0x60AF, + 0xC3F6: 0x95FD, + 0xC3F7: 0x660E, + 0xC3F8: 0x879F, + 0xC3F9: 0x9E23, + 0xC3FA: 0x94ED, + 0xC3FB: 0x540D, + 0xC3FC: 0x547D, + 0xC3FD: 0x8C2C, + 0xC3FE: 0x6478, + 0xC440: 0x8140, + 0xC441: 0x8141, + 0xC442: 0x8142, + 0xC443: 0x8143, + 0xC444: 0x8144, + 0xC445: 0x8145, + 0xC446: 0x8147, + 0xC447: 0x8149, + 0xC448: 0x814D, + 0xC449: 0x814E, + 0xC44A: 0x814F, + 0xC44B: 0x8152, + 0xC44C: 0x8156, + 0xC44D: 0x8157, + 0xC44E: 0x8158, + 0xC44F: 0x815B, + 0xC450: 0x815C, + 0xC451: 0x815D, + 0xC452: 0x815E, + 0xC453: 0x815F, + 0xC454: 0x8161, + 0xC455: 0x8162, + 0xC456: 0x8163, + 0xC457: 0x8164, + 0xC458: 0x8166, + 0xC459: 0x8168, + 0xC45A: 0x816A, + 0xC45B: 0x816B, + 0xC45C: 0x816C, + 0xC45D: 0x816F, + 0xC45E: 0x8172, + 0xC45F: 0x8173, + 0xC460: 0x8175, + 0xC461: 0x8176, + 0xC462: 0x8177, + 0xC463: 0x8178, + 0xC464: 0x8181, + 0xC465: 0x8183, + 0xC466: 0x8184, + 0xC467: 0x8185, + 0xC468: 0x8186, + 0xC469: 0x8187, + 0xC46A: 0x8189, + 0xC46B: 0x818B, + 0xC46C: 0x818C, + 0xC46D: 0x818D, + 0xC46E: 0x818E, + 0xC46F: 0x8190, + 0xC470: 0x8192, + 0xC471: 0x8193, + 0xC472: 0x8194, + 0xC473: 0x8195, + 0xC474: 0x8196, + 0xC475: 0x8197, + 0xC476: 0x8199, + 0xC477: 0x819A, + 0xC478: 0x819E, + 0xC479: 0x819F, + 0xC47A: 0x81A0, + 0xC47B: 0x81A1, + 0xC47C: 0x81A2, + 0xC47D: 0x81A4, + 0xC47E: 0x81A5, + 0xC480: 0x81A7, + 0xC481: 0x81A9, + 0xC482: 0x81AB, + 0xC483: 0x81AC, + 0xC484: 0x81AD, + 0xC485: 0x81AE, + 0xC486: 0x81AF, + 0xC487: 0x81B0, + 0xC488: 0x81B1, + 0xC489: 0x81B2, + 0xC48A: 0x81B4, + 0xC48B: 0x81B5, + 0xC48C: 0x81B6, + 0xC48D: 0x81B7, + 0xC48E: 0x81B8, + 0xC48F: 0x81B9, + 0xC490: 0x81BC, + 0xC491: 0x81BD, + 0xC492: 0x81BE, + 0xC493: 0x81BF, + 0xC494: 0x81C4, + 0xC495: 0x81C5, + 0xC496: 0x81C7, + 0xC497: 0x81C8, + 0xC498: 0x81C9, + 0xC499: 0x81CB, + 0xC49A: 0x81CD, + 0xC49B: 0x81CE, + 0xC49C: 0x81CF, + 0xC49D: 0x81D0, + 0xC49E: 0x81D1, + 0xC49F: 0x81D2, + 0xC4A0: 0x81D3, + 0xC4A1: 0x6479, + 0xC4A2: 0x8611, + 0xC4A3: 0x6A21, + 0xC4A4: 0x819C, + 0xC4A5: 0x78E8, + 0xC4A6: 0x6469, + 0xC4A7: 0x9B54, + 0xC4A8: 0x62B9, + 0xC4A9: 0x672B, + 0xC4AA: 0x83AB, + 0xC4AB: 0x58A8, + 0xC4AC: 0x9ED8, + 0xC4AD: 0x6CAB, + 0xC4AE: 0x6F20, + 0xC4AF: 0x5BDE, + 0xC4B0: 0x964C, + 0xC4B1: 0x8C0B, + 0xC4B2: 0x725F, + 0xC4B3: 0x67D0, + 0xC4B4: 0x62C7, + 0xC4B5: 0x7261, + 0xC4B6: 0x4EA9, + 0xC4B7: 0x59C6, + 0xC4B8: 0x6BCD, + 0xC4B9: 0x5893, + 0xC4BA: 0x66AE, + 0xC4BB: 0x5E55, + 0xC4BC: 0x52DF, + 0xC4BD: 0x6155, + 0xC4BE: 0x6728, + 0xC4BF: 0x76EE, + 0xC4C0: 0x7766, + 0xC4C1: 0x7267, + 0xC4C2: 0x7A46, + 0xC4C3: 0x62FF, + 0xC4C4: 0x54EA, + 0xC4C5: 0x5450, + 0xC4C6: 0x94A0, + 0xC4C7: 0x90A3, + 0xC4C8: 0x5A1C, + 0xC4C9: 0x7EB3, + 0xC4CA: 0x6C16, + 0xC4CB: 0x4E43, + 0xC4CC: 0x5976, + 0xC4CD: 0x8010, + 0xC4CE: 0x5948, + 0xC4CF: 0x5357, + 0xC4D0: 0x7537, + 0xC4D1: 0x96BE, + 0xC4D2: 0x56CA, + 0xC4D3: 0x6320, + 0xC4D4: 0x8111, + 0xC4D5: 0x607C, + 0xC4D6: 0x95F9, + 0xC4D7: 0x6DD6, + 0xC4D8: 0x5462, + 0xC4D9: 0x9981, + 0xC4DA: 0x5185, + 0xC4DB: 0x5AE9, + 0xC4DC: 0x80FD, + 0xC4DD: 0x59AE, + 0xC4DE: 0x9713, + 0xC4DF: 0x502A, + 0xC4E0: 0x6CE5, + 0xC4E1: 0x5C3C, + 0xC4E2: 0x62DF, + 0xC4E3: 0x4F60, + 0xC4E4: 0x533F, + 0xC4E5: 0x817B, + 0xC4E6: 0x9006, + 0xC4E7: 0x6EBA, + 0xC4E8: 0x852B, + 0xC4E9: 0x62C8, + 0xC4EA: 0x5E74, + 0xC4EB: 0x78BE, + 0xC4EC: 0x64B5, + 0xC4ED: 0x637B, + 0xC4EE: 0x5FF5, + 0xC4EF: 0x5A18, + 0xC4F0: 0x917F, + 0xC4F1: 0x9E1F, + 0xC4F2: 0x5C3F, + 0xC4F3: 0x634F, + 0xC4F4: 0x8042, + 0xC4F5: 0x5B7D, + 0xC4F6: 0x556E, + 0xC4F7: 0x954A, + 0xC4F8: 0x954D, + 0xC4F9: 0x6D85, + 0xC4FA: 0x60A8, + 0xC4FB: 0x67E0, + 0xC4FC: 0x72DE, + 0xC4FD: 0x51DD, + 0xC4FE: 0x5B81, + 0xC540: 0x81D4, + 0xC541: 0x81D5, + 0xC542: 0x81D6, + 0xC543: 0x81D7, + 0xC544: 0x81D8, + 0xC545: 0x81D9, + 0xC546: 0x81DA, + 0xC547: 0x81DB, + 0xC548: 0x81DC, + 0xC549: 0x81DD, + 0xC54A: 0x81DE, + 0xC54B: 0x81DF, + 0xC54C: 0x81E0, + 0xC54D: 0x81E1, + 0xC54E: 0x81E2, + 0xC54F: 0x81E4, + 0xC550: 0x81E5, + 0xC551: 0x81E6, + 0xC552: 0x81E8, + 0xC553: 0x81E9, + 0xC554: 0x81EB, + 0xC555: 0x81EE, + 0xC556: 0x81EF, + 0xC557: 0x81F0, + 0xC558: 0x81F1, + 0xC559: 0x81F2, + 0xC55A: 0x81F5, + 0xC55B: 0x81F6, + 0xC55C: 0x81F7, + 0xC55D: 0x81F8, + 0xC55E: 0x81F9, + 0xC55F: 0x81FA, + 0xC560: 0x81FD, + 0xC561: 0x81FF, + 0xC562: 0x8203, + 0xC563: 0x8207, + 0xC564: 0x8208, + 0xC565: 0x8209, + 0xC566: 0x820A, + 0xC567: 0x820B, + 0xC568: 0x820E, + 0xC569: 0x820F, + 0xC56A: 0x8211, + 0xC56B: 0x8213, + 0xC56C: 0x8215, + 0xC56D: 0x8216, + 0xC56E: 0x8217, + 0xC56F: 0x8218, + 0xC570: 0x8219, + 0xC571: 0x821A, + 0xC572: 0x821D, + 0xC573: 0x8220, + 0xC574: 0x8224, + 0xC575: 0x8225, + 0xC576: 0x8226, + 0xC577: 0x8227, + 0xC578: 0x8229, + 0xC579: 0x822E, + 0xC57A: 0x8232, + 0xC57B: 0x823A, + 0xC57C: 0x823C, + 0xC57D: 0x823D, + 0xC57E: 0x823F, + 0xC580: 0x8240, + 0xC581: 0x8241, + 0xC582: 0x8242, + 0xC583: 0x8243, + 0xC584: 0x8245, + 0xC585: 0x8246, + 0xC586: 0x8248, + 0xC587: 0x824A, + 0xC588: 0x824C, + 0xC589: 0x824D, + 0xC58A: 0x824E, + 0xC58B: 0x8250, + 0xC58C: 0x8251, + 0xC58D: 0x8252, + 0xC58E: 0x8253, + 0xC58F: 0x8254, + 0xC590: 0x8255, + 0xC591: 0x8256, + 0xC592: 0x8257, + 0xC593: 0x8259, + 0xC594: 0x825B, + 0xC595: 0x825C, + 0xC596: 0x825D, + 0xC597: 0x825E, + 0xC598: 0x8260, + 0xC599: 0x8261, + 0xC59A: 0x8262, + 0xC59B: 0x8263, + 0xC59C: 0x8264, + 0xC59D: 0x8265, + 0xC59E: 0x8266, + 0xC59F: 0x8267, + 0xC5A0: 0x8269, + 0xC5A1: 0x62E7, + 0xC5A2: 0x6CDE, + 0xC5A3: 0x725B, + 0xC5A4: 0x626D, + 0xC5A5: 0x94AE, + 0xC5A6: 0x7EBD, + 0xC5A7: 0x8113, + 0xC5A8: 0x6D53, + 0xC5A9: 0x519C, + 0xC5AA: 0x5F04, + 0xC5AB: 0x5974, + 0xC5AC: 0x52AA, + 0xC5AD: 0x6012, + 0xC5AE: 0x5973, + 0xC5AF: 0x6696, + 0xC5B0: 0x8650, + 0xC5B1: 0x759F, + 0xC5B2: 0x632A, + 0xC5B3: 0x61E6, + 0xC5B4: 0x7CEF, + 0xC5B5: 0x8BFA, + 0xC5B6: 0x54E6, + 0xC5B7: 0x6B27, + 0xC5B8: 0x9E25, + 0xC5B9: 0x6BB4, + 0xC5BA: 0x85D5, + 0xC5BB: 0x5455, + 0xC5BC: 0x5076, + 0xC5BD: 0x6CA4, + 0xC5BE: 0x556A, + 0xC5BF: 0x8DB4, + 0xC5C0: 0x722C, + 0xC5C1: 0x5E15, + 0xC5C2: 0x6015, + 0xC5C3: 0x7436, + 0xC5C4: 0x62CD, + 0xC5C5: 0x6392, + 0xC5C6: 0x724C, + 0xC5C7: 0x5F98, + 0xC5C8: 0x6E43, + 0xC5C9: 0x6D3E, + 0xC5CA: 0x6500, + 0xC5CB: 0x6F58, + 0xC5CC: 0x76D8, + 0xC5CD: 0x78D0, + 0xC5CE: 0x76FC, + 0xC5CF: 0x7554, + 0xC5D0: 0x5224, + 0xC5D1: 0x53DB, + 0xC5D2: 0x4E53, + 0xC5D3: 0x5E9E, + 0xC5D4: 0x65C1, + 0xC5D5: 0x802A, + 0xC5D6: 0x80D6, + 0xC5D7: 0x629B, + 0xC5D8: 0x5486, + 0xC5D9: 0x5228, + 0xC5DA: 0x70AE, + 0xC5DB: 0x888D, + 0xC5DC: 0x8DD1, + 0xC5DD: 0x6CE1, + 0xC5DE: 0x5478, + 0xC5DF: 0x80DA, + 0xC5E0: 0x57F9, + 0xC5E1: 0x88F4, + 0xC5E2: 0x8D54, + 0xC5E3: 0x966A, + 0xC5E4: 0x914D, + 0xC5E5: 0x4F69, + 0xC5E6: 0x6C9B, + 0xC5E7: 0x55B7, + 0xC5E8: 0x76C6, + 0xC5E9: 0x7830, + 0xC5EA: 0x62A8, + 0xC5EB: 0x70F9, + 0xC5EC: 0x6F8E, + 0xC5ED: 0x5F6D, + 0xC5EE: 0x84EC, + 0xC5EF: 0x68DA, + 0xC5F0: 0x787C, + 0xC5F1: 0x7BF7, + 0xC5F2: 0x81A8, + 0xC5F3: 0x670B, + 0xC5F4: 0x9E4F, + 0xC5F5: 0x6367, + 0xC5F6: 0x78B0, + 0xC5F7: 0x576F, + 0xC5F8: 0x7812, + 0xC5F9: 0x9739, + 0xC5FA: 0x6279, + 0xC5FB: 0x62AB, + 0xC5FC: 0x5288, + 0xC5FD: 0x7435, + 0xC5FE: 0x6BD7, + 0xC640: 0x826A, + 0xC641: 0x826B, + 0xC642: 0x826C, + 0xC643: 0x826D, + 0xC644: 0x8271, + 0xC645: 0x8275, + 0xC646: 0x8276, + 0xC647: 0x8277, + 0xC648: 0x8278, + 0xC649: 0x827B, + 0xC64A: 0x827C, + 0xC64B: 0x8280, + 0xC64C: 0x8281, + 0xC64D: 0x8283, + 0xC64E: 0x8285, + 0xC64F: 0x8286, + 0xC650: 0x8287, + 0xC651: 0x8289, + 0xC652: 0x828C, + 0xC653: 0x8290, + 0xC654: 0x8293, + 0xC655: 0x8294, + 0xC656: 0x8295, + 0xC657: 0x8296, + 0xC658: 0x829A, + 0xC659: 0x829B, + 0xC65A: 0x829E, + 0xC65B: 0x82A0, + 0xC65C: 0x82A2, + 0xC65D: 0x82A3, + 0xC65E: 0x82A7, + 0xC65F: 0x82B2, + 0xC660: 0x82B5, + 0xC661: 0x82B6, + 0xC662: 0x82BA, + 0xC663: 0x82BB, + 0xC664: 0x82BC, + 0xC665: 0x82BF, + 0xC666: 0x82C0, + 0xC667: 0x82C2, + 0xC668: 0x82C3, + 0xC669: 0x82C5, + 0xC66A: 0x82C6, + 0xC66B: 0x82C9, + 0xC66C: 0x82D0, + 0xC66D: 0x82D6, + 0xC66E: 0x82D9, + 0xC66F: 0x82DA, + 0xC670: 0x82DD, + 0xC671: 0x82E2, + 0xC672: 0x82E7, + 0xC673: 0x82E8, + 0xC674: 0x82E9, + 0xC675: 0x82EA, + 0xC676: 0x82EC, + 0xC677: 0x82ED, + 0xC678: 0x82EE, + 0xC679: 0x82F0, + 0xC67A: 0x82F2, + 0xC67B: 0x82F3, + 0xC67C: 0x82F5, + 0xC67D: 0x82F6, + 0xC67E: 0x82F8, + 0xC680: 0x82FA, + 0xC681: 0x82FC, + 0xC682: 0x82FD, + 0xC683: 0x82FE, + 0xC684: 0x82FF, + 0xC685: 0x8300, + 0xC686: 0x830A, + 0xC687: 0x830B, + 0xC688: 0x830D, + 0xC689: 0x8310, + 0xC68A: 0x8312, + 0xC68B: 0x8313, + 0xC68C: 0x8316, + 0xC68D: 0x8318, + 0xC68E: 0x8319, + 0xC68F: 0x831D, + 0xC690: 0x831E, + 0xC691: 0x831F, + 0xC692: 0x8320, + 0xC693: 0x8321, + 0xC694: 0x8322, + 0xC695: 0x8323, + 0xC696: 0x8324, + 0xC697: 0x8325, + 0xC698: 0x8326, + 0xC699: 0x8329, + 0xC69A: 0x832A, + 0xC69B: 0x832E, + 0xC69C: 0x8330, + 0xC69D: 0x8332, + 0xC69E: 0x8337, + 0xC69F: 0x833B, + 0xC6A0: 0x833D, + 0xC6A1: 0x5564, + 0xC6A2: 0x813E, + 0xC6A3: 0x75B2, + 0xC6A4: 0x76AE, + 0xC6A5: 0x5339, + 0xC6A6: 0x75DE, + 0xC6A7: 0x50FB, + 0xC6A8: 0x5C41, + 0xC6A9: 0x8B6C, + 0xC6AA: 0x7BC7, + 0xC6AB: 0x504F, + 0xC6AC: 0x7247, + 0xC6AD: 0x9A97, + 0xC6AE: 0x98D8, + 0xC6AF: 0x6F02, + 0xC6B0: 0x74E2, + 0xC6B1: 0x7968, + 0xC6B2: 0x6487, + 0xC6B3: 0x77A5, + 0xC6B4: 0x62FC, + 0xC6B5: 0x9891, + 0xC6B6: 0x8D2B, + 0xC6B7: 0x54C1, + 0xC6B8: 0x8058, + 0xC6B9: 0x4E52, + 0xC6BA: 0x576A, + 0xC6BB: 0x82F9, + 0xC6BC: 0x840D, + 0xC6BD: 0x5E73, + 0xC6BE: 0x51ED, + 0xC6BF: 0x74F6, + 0xC6C0: 0x8BC4, + 0xC6C1: 0x5C4F, + 0xC6C2: 0x5761, + 0xC6C3: 0x6CFC, + 0xC6C4: 0x9887, + 0xC6C5: 0x5A46, + 0xC6C6: 0x7834, + 0xC6C7: 0x9B44, + 0xC6C8: 0x8FEB, + 0xC6C9: 0x7C95, + 0xC6CA: 0x5256, + 0xC6CB: 0x6251, + 0xC6CC: 0x94FA, + 0xC6CD: 0x4EC6, + 0xC6CE: 0x8386, + 0xC6CF: 0x8461, + 0xC6D0: 0x83E9, + 0xC6D1: 0x84B2, + 0xC6D2: 0x57D4, + 0xC6D3: 0x6734, + 0xC6D4: 0x5703, + 0xC6D5: 0x666E, + 0xC6D6: 0x6D66, + 0xC6D7: 0x8C31, + 0xC6D8: 0x66DD, + 0xC6D9: 0x7011, + 0xC6DA: 0x671F, + 0xC6DB: 0x6B3A, + 0xC6DC: 0x6816, + 0xC6DD: 0x621A, + 0xC6DE: 0x59BB, + 0xC6DF: 0x4E03, + 0xC6E0: 0x51C4, + 0xC6E1: 0x6F06, + 0xC6E2: 0x67D2, + 0xC6E3: 0x6C8F, + 0xC6E4: 0x5176, + 0xC6E5: 0x68CB, + 0xC6E6: 0x5947, + 0xC6E7: 0x6B67, + 0xC6E8: 0x7566, + 0xC6E9: 0x5D0E, + 0xC6EA: 0x8110, + 0xC6EB: 0x9F50, + 0xC6EC: 0x65D7, + 0xC6ED: 0x7948, + 0xC6EE: 0x7941, + 0xC6EF: 0x9A91, + 0xC6F0: 0x8D77, + 0xC6F1: 0x5C82, + 0xC6F2: 0x4E5E, + 0xC6F3: 0x4F01, + 0xC6F4: 0x542F, + 0xC6F5: 0x5951, + 0xC6F6: 0x780C, + 0xC6F7: 0x5668, + 0xC6F8: 0x6C14, + 0xC6F9: 0x8FC4, + 0xC6FA: 0x5F03, + 0xC6FB: 0x6C7D, + 0xC6FC: 0x6CE3, + 0xC6FD: 0x8BAB, + 0xC6FE: 0x6390, + 0xC740: 0x833E, + 0xC741: 0x833F, + 0xC742: 0x8341, + 0xC743: 0x8342, + 0xC744: 0x8344, + 0xC745: 0x8345, + 0xC746: 0x8348, + 0xC747: 0x834A, + 0xC748: 0x834B, + 0xC749: 0x834C, + 0xC74A: 0x834D, + 0xC74B: 0x834E, + 0xC74C: 0x8353, + 0xC74D: 0x8355, + 0xC74E: 0x8356, + 0xC74F: 0x8357, + 0xC750: 0x8358, + 0xC751: 0x8359, + 0xC752: 0x835D, + 0xC753: 0x8362, + 0xC754: 0x8370, + 0xC755: 0x8371, + 0xC756: 0x8372, + 0xC757: 0x8373, + 0xC758: 0x8374, + 0xC759: 0x8375, + 0xC75A: 0x8376, + 0xC75B: 0x8379, + 0xC75C: 0x837A, + 0xC75D: 0x837E, + 0xC75E: 0x837F, + 0xC75F: 0x8380, + 0xC760: 0x8381, + 0xC761: 0x8382, + 0xC762: 0x8383, + 0xC763: 0x8384, + 0xC764: 0x8387, + 0xC765: 0x8388, + 0xC766: 0x838A, + 0xC767: 0x838B, + 0xC768: 0x838C, + 0xC769: 0x838D, + 0xC76A: 0x838F, + 0xC76B: 0x8390, + 0xC76C: 0x8391, + 0xC76D: 0x8394, + 0xC76E: 0x8395, + 0xC76F: 0x8396, + 0xC770: 0x8397, + 0xC771: 0x8399, + 0xC772: 0x839A, + 0xC773: 0x839D, + 0xC774: 0x839F, + 0xC775: 0x83A1, + 0xC776: 0x83A2, + 0xC777: 0x83A3, + 0xC778: 0x83A4, + 0xC779: 0x83A5, + 0xC77A: 0x83A6, + 0xC77B: 0x83A7, + 0xC77C: 0x83AC, + 0xC77D: 0x83AD, + 0xC77E: 0x83AE, + 0xC780: 0x83AF, + 0xC781: 0x83B5, + 0xC782: 0x83BB, + 0xC783: 0x83BE, + 0xC784: 0x83BF, + 0xC785: 0x83C2, + 0xC786: 0x83C3, + 0xC787: 0x83C4, + 0xC788: 0x83C6, + 0xC789: 0x83C8, + 0xC78A: 0x83C9, + 0xC78B: 0x83CB, + 0xC78C: 0x83CD, + 0xC78D: 0x83CE, + 0xC78E: 0x83D0, + 0xC78F: 0x83D1, + 0xC790: 0x83D2, + 0xC791: 0x83D3, + 0xC792: 0x83D5, + 0xC793: 0x83D7, + 0xC794: 0x83D9, + 0xC795: 0x83DA, + 0xC796: 0x83DB, + 0xC797: 0x83DE, + 0xC798: 0x83E2, + 0xC799: 0x83E3, + 0xC79A: 0x83E4, + 0xC79B: 0x83E6, + 0xC79C: 0x83E7, + 0xC79D: 0x83E8, + 0xC79E: 0x83EB, + 0xC79F: 0x83EC, + 0xC7A0: 0x83ED, + 0xC7A1: 0x6070, + 0xC7A2: 0x6D3D, + 0xC7A3: 0x7275, + 0xC7A4: 0x6266, + 0xC7A5: 0x948E, + 0xC7A6: 0x94C5, + 0xC7A7: 0x5343, + 0xC7A8: 0x8FC1, + 0xC7A9: 0x7B7E, + 0xC7AA: 0x4EDF, + 0xC7AB: 0x8C26, + 0xC7AC: 0x4E7E, + 0xC7AD: 0x9ED4, + 0xC7AE: 0x94B1, + 0xC7AF: 0x94B3, + 0xC7B0: 0x524D, + 0xC7B1: 0x6F5C, + 0xC7B2: 0x9063, + 0xC7B3: 0x6D45, + 0xC7B4: 0x8C34, + 0xC7B5: 0x5811, + 0xC7B6: 0x5D4C, + 0xC7B7: 0x6B20, + 0xC7B8: 0x6B49, + 0xC7B9: 0x67AA, + 0xC7BA: 0x545B, + 0xC7BB: 0x8154, + 0xC7BC: 0x7F8C, + 0xC7BD: 0x5899, + 0xC7BE: 0x8537, + 0xC7BF: 0x5F3A, + 0xC7C0: 0x62A2, + 0xC7C1: 0x6A47, + 0xC7C2: 0x9539, + 0xC7C3: 0x6572, + 0xC7C4: 0x6084, + 0xC7C5: 0x6865, + 0xC7C6: 0x77A7, + 0xC7C7: 0x4E54, + 0xC7C8: 0x4FA8, + 0xC7C9: 0x5DE7, + 0xC7CA: 0x9798, + 0xC7CB: 0x64AC, + 0xC7CC: 0x7FD8, + 0xC7CD: 0x5CED, + 0xC7CE: 0x4FCF, + 0xC7CF: 0x7A8D, + 0xC7D0: 0x5207, + 0xC7D1: 0x8304, + 0xC7D2: 0x4E14, + 0xC7D3: 0x602F, + 0xC7D4: 0x7A83, + 0xC7D5: 0x94A6, + 0xC7D6: 0x4FB5, + 0xC7D7: 0x4EB2, + 0xC7D8: 0x79E6, + 0xC7D9: 0x7434, + 0xC7DA: 0x52E4, + 0xC7DB: 0x82B9, + 0xC7DC: 0x64D2, + 0xC7DD: 0x79BD, + 0xC7DE: 0x5BDD, + 0xC7DF: 0x6C81, + 0xC7E0: 0x9752, + 0xC7E1: 0x8F7B, + 0xC7E2: 0x6C22, + 0xC7E3: 0x503E, + 0xC7E4: 0x537F, + 0xC7E5: 0x6E05, + 0xC7E6: 0x64CE, + 0xC7E7: 0x6674, + 0xC7E8: 0x6C30, + 0xC7E9: 0x60C5, + 0xC7EA: 0x9877, + 0xC7EB: 0x8BF7, + 0xC7EC: 0x5E86, + 0xC7ED: 0x743C, + 0xC7EE: 0x7A77, + 0xC7EF: 0x79CB, + 0xC7F0: 0x4E18, + 0xC7F1: 0x90B1, + 0xC7F2: 0x7403, + 0xC7F3: 0x6C42, + 0xC7F4: 0x56DA, + 0xC7F5: 0x914B, + 0xC7F6: 0x6CC5, + 0xC7F7: 0x8D8B, + 0xC7F8: 0x533A, + 0xC7F9: 0x86C6, + 0xC7FA: 0x66F2, + 0xC7FB: 0x8EAF, + 0xC7FC: 0x5C48, + 0xC7FD: 0x9A71, + 0xC7FE: 0x6E20, + 0xC840: 0x83EE, + 0xC841: 0x83EF, + 0xC842: 0x83F3, + 0xC843: 0x83F4, + 0xC844: 0x83F5, + 0xC845: 0x83F6, + 0xC846: 0x83F7, + 0xC847: 0x83FA, + 0xC848: 0x83FB, + 0xC849: 0x83FC, + 0xC84A: 0x83FE, + 0xC84B: 0x83FF, + 0xC84C: 0x8400, + 0xC84D: 0x8402, + 0xC84E: 0x8405, + 0xC84F: 0x8407, + 0xC850: 0x8408, + 0xC851: 0x8409, + 0xC852: 0x840A, + 0xC853: 0x8410, + 0xC854: 0x8412, + 0xC855: 0x8413, + 0xC856: 0x8414, + 0xC857: 0x8415, + 0xC858: 0x8416, + 0xC859: 0x8417, + 0xC85A: 0x8419, + 0xC85B: 0x841A, + 0xC85C: 0x841B, + 0xC85D: 0x841E, + 0xC85E: 0x841F, + 0xC85F: 0x8420, + 0xC860: 0x8421, + 0xC861: 0x8422, + 0xC862: 0x8423, + 0xC863: 0x8429, + 0xC864: 0x842A, + 0xC865: 0x842B, + 0xC866: 0x842C, + 0xC867: 0x842D, + 0xC868: 0x842E, + 0xC869: 0x842F, + 0xC86A: 0x8430, + 0xC86B: 0x8432, + 0xC86C: 0x8433, + 0xC86D: 0x8434, + 0xC86E: 0x8435, + 0xC86F: 0x8436, + 0xC870: 0x8437, + 0xC871: 0x8439, + 0xC872: 0x843A, + 0xC873: 0x843B, + 0xC874: 0x843E, + 0xC875: 0x843F, + 0xC876: 0x8440, + 0xC877: 0x8441, + 0xC878: 0x8442, + 0xC879: 0x8443, + 0xC87A: 0x8444, + 0xC87B: 0x8445, + 0xC87C: 0x8447, + 0xC87D: 0x8448, + 0xC87E: 0x8449, + 0xC880: 0x844A, + 0xC881: 0x844B, + 0xC882: 0x844C, + 0xC883: 0x844D, + 0xC884: 0x844E, + 0xC885: 0x844F, + 0xC886: 0x8450, + 0xC887: 0x8452, + 0xC888: 0x8453, + 0xC889: 0x8454, + 0xC88A: 0x8455, + 0xC88B: 0x8456, + 0xC88C: 0x8458, + 0xC88D: 0x845D, + 0xC88E: 0x845E, + 0xC88F: 0x845F, + 0xC890: 0x8460, + 0xC891: 0x8462, + 0xC892: 0x8464, + 0xC893: 0x8465, + 0xC894: 0x8466, + 0xC895: 0x8467, + 0xC896: 0x8468, + 0xC897: 0x846A, + 0xC898: 0x846E, + 0xC899: 0x846F, + 0xC89A: 0x8470, + 0xC89B: 0x8472, + 0xC89C: 0x8474, + 0xC89D: 0x8477, + 0xC89E: 0x8479, + 0xC89F: 0x847B, + 0xC8A0: 0x847C, + 0xC8A1: 0x53D6, + 0xC8A2: 0x5A36, + 0xC8A3: 0x9F8B, + 0xC8A4: 0x8DA3, + 0xC8A5: 0x53BB, + 0xC8A6: 0x5708, + 0xC8A7: 0x98A7, + 0xC8A8: 0x6743, + 0xC8A9: 0x919B, + 0xC8AA: 0x6CC9, + 0xC8AB: 0x5168, + 0xC8AC: 0x75CA, + 0xC8AD: 0x62F3, + 0xC8AE: 0x72AC, + 0xC8AF: 0x5238, + 0xC8B0: 0x529D, + 0xC8B1: 0x7F3A, + 0xC8B2: 0x7094, + 0xC8B3: 0x7638, + 0xC8B4: 0x5374, + 0xC8B5: 0x9E4A, + 0xC8B6: 0x69B7, + 0xC8B7: 0x786E, + 0xC8B8: 0x96C0, + 0xC8B9: 0x88D9, + 0xC8BA: 0x7FA4, + 0xC8BB: 0x7136, + 0xC8BC: 0x71C3, + 0xC8BD: 0x5189, + 0xC8BE: 0x67D3, + 0xC8BF: 0x74E4, + 0xC8C0: 0x58E4, + 0xC8C1: 0x6518, + 0xC8C2: 0x56B7, + 0xC8C3: 0x8BA9, + 0xC8C4: 0x9976, + 0xC8C5: 0x6270, + 0xC8C6: 0x7ED5, + 0xC8C7: 0x60F9, + 0xC8C8: 0x70ED, + 0xC8C9: 0x58EC, + 0xC8CA: 0x4EC1, + 0xC8CB: 0x4EBA, + 0xC8CC: 0x5FCD, + 0xC8CD: 0x97E7, + 0xC8CE: 0x4EFB, + 0xC8CF: 0x8BA4, + 0xC8D0: 0x5203, + 0xC8D1: 0x598A, + 0xC8D2: 0x7EAB, + 0xC8D3: 0x6254, + 0xC8D4: 0x4ECD, + 0xC8D5: 0x65E5, + 0xC8D6: 0x620E, + 0xC8D7: 0x8338, + 0xC8D8: 0x84C9, + 0xC8D9: 0x8363, + 0xC8DA: 0x878D, + 0xC8DB: 0x7194, + 0xC8DC: 0x6EB6, + 0xC8DD: 0x5BB9, + 0xC8DE: 0x7ED2, + 0xC8DF: 0x5197, + 0xC8E0: 0x63C9, + 0xC8E1: 0x67D4, + 0xC8E2: 0x8089, + 0xC8E3: 0x8339, + 0xC8E4: 0x8815, + 0xC8E5: 0x5112, + 0xC8E6: 0x5B7A, + 0xC8E7: 0x5982, + 0xC8E8: 0x8FB1, + 0xC8E9: 0x4E73, + 0xC8EA: 0x6C5D, + 0xC8EB: 0x5165, + 0xC8EC: 0x8925, + 0xC8ED: 0x8F6F, + 0xC8EE: 0x962E, + 0xC8EF: 0x854A, + 0xC8F0: 0x745E, + 0xC8F1: 0x9510, + 0xC8F2: 0x95F0, + 0xC8F3: 0x6DA6, + 0xC8F4: 0x82E5, + 0xC8F5: 0x5F31, + 0xC8F6: 0x6492, + 0xC8F7: 0x6D12, + 0xC8F8: 0x8428, + 0xC8F9: 0x816E, + 0xC8FA: 0x9CC3, + 0xC8FB: 0x585E, + 0xC8FC: 0x8D5B, + 0xC8FD: 0x4E09, + 0xC8FE: 0x53C1, + 0xC940: 0x847D, + 0xC941: 0x847E, + 0xC942: 0x847F, + 0xC943: 0x8480, + 0xC944: 0x8481, + 0xC945: 0x8483, + 0xC946: 0x8484, + 0xC947: 0x8485, + 0xC948: 0x8486, + 0xC949: 0x848A, + 0xC94A: 0x848D, + 0xC94B: 0x848F, + 0xC94C: 0x8490, + 0xC94D: 0x8491, + 0xC94E: 0x8492, + 0xC94F: 0x8493, + 0xC950: 0x8494, + 0xC951: 0x8495, + 0xC952: 0x8496, + 0xC953: 0x8498, + 0xC954: 0x849A, + 0xC955: 0x849B, + 0xC956: 0x849D, + 0xC957: 0x849E, + 0xC958: 0x849F, + 0xC959: 0x84A0, + 0xC95A: 0x84A2, + 0xC95B: 0x84A3, + 0xC95C: 0x84A4, + 0xC95D: 0x84A5, + 0xC95E: 0x84A6, + 0xC95F: 0x84A7, + 0xC960: 0x84A8, + 0xC961: 0x84A9, + 0xC962: 0x84AA, + 0xC963: 0x84AB, + 0xC964: 0x84AC, + 0xC965: 0x84AD, + 0xC966: 0x84AE, + 0xC967: 0x84B0, + 0xC968: 0x84B1, + 0xC969: 0x84B3, + 0xC96A: 0x84B5, + 0xC96B: 0x84B6, + 0xC96C: 0x84B7, + 0xC96D: 0x84BB, + 0xC96E: 0x84BC, + 0xC96F: 0x84BE, + 0xC970: 0x84C0, + 0xC971: 0x84C2, + 0xC972: 0x84C3, + 0xC973: 0x84C5, + 0xC974: 0x84C6, + 0xC975: 0x84C7, + 0xC976: 0x84C8, + 0xC977: 0x84CB, + 0xC978: 0x84CC, + 0xC979: 0x84CE, + 0xC97A: 0x84CF, + 0xC97B: 0x84D2, + 0xC97C: 0x84D4, + 0xC97D: 0x84D5, + 0xC97E: 0x84D7, + 0xC980: 0x84D8, + 0xC981: 0x84D9, + 0xC982: 0x84DA, + 0xC983: 0x84DB, + 0xC984: 0x84DC, + 0xC985: 0x84DE, + 0xC986: 0x84E1, + 0xC987: 0x84E2, + 0xC988: 0x84E4, + 0xC989: 0x84E7, + 0xC98A: 0x84E8, + 0xC98B: 0x84E9, + 0xC98C: 0x84EA, + 0xC98D: 0x84EB, + 0xC98E: 0x84ED, + 0xC98F: 0x84EE, + 0xC990: 0x84EF, + 0xC991: 0x84F1, + 0xC992: 0x84F2, + 0xC993: 0x84F3, + 0xC994: 0x84F4, + 0xC995: 0x84F5, + 0xC996: 0x84F6, + 0xC997: 0x84F7, + 0xC998: 0x84F8, + 0xC999: 0x84F9, + 0xC99A: 0x84FA, + 0xC99B: 0x84FB, + 0xC99C: 0x84FD, + 0xC99D: 0x84FE, + 0xC99E: 0x8500, + 0xC99F: 0x8501, + 0xC9A0: 0x8502, + 0xC9A1: 0x4F1E, + 0xC9A2: 0x6563, + 0xC9A3: 0x6851, + 0xC9A4: 0x55D3, + 0xC9A5: 0x4E27, + 0xC9A6: 0x6414, + 0xC9A7: 0x9A9A, + 0xC9A8: 0x626B, + 0xC9A9: 0x5AC2, + 0xC9AA: 0x745F, + 0xC9AB: 0x8272, + 0xC9AC: 0x6DA9, + 0xC9AD: 0x68EE, + 0xC9AE: 0x50E7, + 0xC9AF: 0x838E, + 0xC9B0: 0x7802, + 0xC9B1: 0x6740, + 0xC9B2: 0x5239, + 0xC9B3: 0x6C99, + 0xC9B4: 0x7EB1, + 0xC9B5: 0x50BB, + 0xC9B6: 0x5565, + 0xC9B7: 0x715E, + 0xC9B8: 0x7B5B, + 0xC9B9: 0x6652, + 0xC9BA: 0x73CA, + 0xC9BB: 0x82EB, + 0xC9BC: 0x6749, + 0xC9BD: 0x5C71, + 0xC9BE: 0x5220, + 0xC9BF: 0x717D, + 0xC9C0: 0x886B, + 0xC9C1: 0x95EA, + 0xC9C2: 0x9655, + 0xC9C3: 0x64C5, + 0xC9C4: 0x8D61, + 0xC9C5: 0x81B3, + 0xC9C6: 0x5584, + 0xC9C7: 0x6C55, + 0xC9C8: 0x6247, + 0xC9C9: 0x7F2E, + 0xC9CA: 0x5892, + 0xC9CB: 0x4F24, + 0xC9CC: 0x5546, + 0xC9CD: 0x8D4F, + 0xC9CE: 0x664C, + 0xC9CF: 0x4E0A, + 0xC9D0: 0x5C1A, + 0xC9D1: 0x88F3, + 0xC9D2: 0x68A2, + 0xC9D3: 0x634E, + 0xC9D4: 0x7A0D, + 0xC9D5: 0x70E7, + 0xC9D6: 0x828D, + 0xC9D7: 0x52FA, + 0xC9D8: 0x97F6, + 0xC9D9: 0x5C11, + 0xC9DA: 0x54E8, + 0xC9DB: 0x90B5, + 0xC9DC: 0x7ECD, + 0xC9DD: 0x5962, + 0xC9DE: 0x8D4A, + 0xC9DF: 0x86C7, + 0xC9E0: 0x820C, + 0xC9E1: 0x820D, + 0xC9E2: 0x8D66, + 0xC9E3: 0x6444, + 0xC9E4: 0x5C04, + 0xC9E5: 0x6151, + 0xC9E6: 0x6D89, + 0xC9E7: 0x793E, + 0xC9E8: 0x8BBE, + 0xC9E9: 0x7837, + 0xC9EA: 0x7533, + 0xC9EB: 0x547B, + 0xC9EC: 0x4F38, + 0xC9ED: 0x8EAB, + 0xC9EE: 0x6DF1, + 0xC9EF: 0x5A20, + 0xC9F0: 0x7EC5, + 0xC9F1: 0x795E, + 0xC9F2: 0x6C88, + 0xC9F3: 0x5BA1, + 0xC9F4: 0x5A76, + 0xC9F5: 0x751A, + 0xC9F6: 0x80BE, + 0xC9F7: 0x614E, + 0xC9F8: 0x6E17, + 0xC9F9: 0x58F0, + 0xC9FA: 0x751F, + 0xC9FB: 0x7525, + 0xC9FC: 0x7272, + 0xC9FD: 0x5347, + 0xC9FE: 0x7EF3, + 0xCA40: 0x8503, + 0xCA41: 0x8504, + 0xCA42: 0x8505, + 0xCA43: 0x8506, + 0xCA44: 0x8507, + 0xCA45: 0x8508, + 0xCA46: 0x8509, + 0xCA47: 0x850A, + 0xCA48: 0x850B, + 0xCA49: 0x850D, + 0xCA4A: 0x850E, + 0xCA4B: 0x850F, + 0xCA4C: 0x8510, + 0xCA4D: 0x8512, + 0xCA4E: 0x8514, + 0xCA4F: 0x8515, + 0xCA50: 0x8516, + 0xCA51: 0x8518, + 0xCA52: 0x8519, + 0xCA53: 0x851B, + 0xCA54: 0x851C, + 0xCA55: 0x851D, + 0xCA56: 0x851E, + 0xCA57: 0x8520, + 0xCA58: 0x8522, + 0xCA59: 0x8523, + 0xCA5A: 0x8524, + 0xCA5B: 0x8525, + 0xCA5C: 0x8526, + 0xCA5D: 0x8527, + 0xCA5E: 0x8528, + 0xCA5F: 0x8529, + 0xCA60: 0x852A, + 0xCA61: 0x852D, + 0xCA62: 0x852E, + 0xCA63: 0x852F, + 0xCA64: 0x8530, + 0xCA65: 0x8531, + 0xCA66: 0x8532, + 0xCA67: 0x8533, + 0xCA68: 0x8534, + 0xCA69: 0x8535, + 0xCA6A: 0x8536, + 0xCA6B: 0x853E, + 0xCA6C: 0x853F, + 0xCA6D: 0x8540, + 0xCA6E: 0x8541, + 0xCA6F: 0x8542, + 0xCA70: 0x8544, + 0xCA71: 0x8545, + 0xCA72: 0x8546, + 0xCA73: 0x8547, + 0xCA74: 0x854B, + 0xCA75: 0x854C, + 0xCA76: 0x854D, + 0xCA77: 0x854E, + 0xCA78: 0x854F, + 0xCA79: 0x8550, + 0xCA7A: 0x8551, + 0xCA7B: 0x8552, + 0xCA7C: 0x8553, + 0xCA7D: 0x8554, + 0xCA7E: 0x8555, + 0xCA80: 0x8557, + 0xCA81: 0x8558, + 0xCA82: 0x855A, + 0xCA83: 0x855B, + 0xCA84: 0x855C, + 0xCA85: 0x855D, + 0xCA86: 0x855F, + 0xCA87: 0x8560, + 0xCA88: 0x8561, + 0xCA89: 0x8562, + 0xCA8A: 0x8563, + 0xCA8B: 0x8565, + 0xCA8C: 0x8566, + 0xCA8D: 0x8567, + 0xCA8E: 0x8569, + 0xCA8F: 0x856A, + 0xCA90: 0x856B, + 0xCA91: 0x856C, + 0xCA92: 0x856D, + 0xCA93: 0x856E, + 0xCA94: 0x856F, + 0xCA95: 0x8570, + 0xCA96: 0x8571, + 0xCA97: 0x8573, + 0xCA98: 0x8575, + 0xCA99: 0x8576, + 0xCA9A: 0x8577, + 0xCA9B: 0x8578, + 0xCA9C: 0x857C, + 0xCA9D: 0x857D, + 0xCA9E: 0x857F, + 0xCA9F: 0x8580, + 0xCAA0: 0x8581, + 0xCAA1: 0x7701, + 0xCAA2: 0x76DB, + 0xCAA3: 0x5269, + 0xCAA4: 0x80DC, + 0xCAA5: 0x5723, + 0xCAA6: 0x5E08, + 0xCAA7: 0x5931, + 0xCAA8: 0x72EE, + 0xCAA9: 0x65BD, + 0xCAAA: 0x6E7F, + 0xCAAB: 0x8BD7, + 0xCAAC: 0x5C38, + 0xCAAD: 0x8671, + 0xCAAE: 0x5341, + 0xCAAF: 0x77F3, + 0xCAB0: 0x62FE, + 0xCAB1: 0x65F6, + 0xCAB2: 0x4EC0, + 0xCAB3: 0x98DF, + 0xCAB4: 0x8680, + 0xCAB5: 0x5B9E, + 0xCAB6: 0x8BC6, + 0xCAB7: 0x53F2, + 0xCAB8: 0x77E2, + 0xCAB9: 0x4F7F, + 0xCABA: 0x5C4E, + 0xCABB: 0x9A76, + 0xCABC: 0x59CB, + 0xCABD: 0x5F0F, + 0xCABE: 0x793A, + 0xCABF: 0x58EB, + 0xCAC0: 0x4E16, + 0xCAC1: 0x67FF, + 0xCAC2: 0x4E8B, + 0xCAC3: 0x62ED, + 0xCAC4: 0x8A93, + 0xCAC5: 0x901D, + 0xCAC6: 0x52BF, + 0xCAC7: 0x662F, + 0xCAC8: 0x55DC, + 0xCAC9: 0x566C, + 0xCACA: 0x9002, + 0xCACB: 0x4ED5, + 0xCACC: 0x4F8D, + 0xCACD: 0x91CA, + 0xCACE: 0x9970, + 0xCACF: 0x6C0F, + 0xCAD0: 0x5E02, + 0xCAD1: 0x6043, + 0xCAD2: 0x5BA4, + 0xCAD3: 0x89C6, + 0xCAD4: 0x8BD5, + 0xCAD5: 0x6536, + 0xCAD6: 0x624B, + 0xCAD7: 0x9996, + 0xCAD8: 0x5B88, + 0xCAD9: 0x5BFF, + 0xCADA: 0x6388, + 0xCADB: 0x552E, + 0xCADC: 0x53D7, + 0xCADD: 0x7626, + 0xCADE: 0x517D, + 0xCADF: 0x852C, + 0xCAE0: 0x67A2, + 0xCAE1: 0x68B3, + 0xCAE2: 0x6B8A, + 0xCAE3: 0x6292, + 0xCAE4: 0x8F93, + 0xCAE5: 0x53D4, + 0xCAE6: 0x8212, + 0xCAE7: 0x6DD1, + 0xCAE8: 0x758F, + 0xCAE9: 0x4E66, + 0xCAEA: 0x8D4E, + 0xCAEB: 0x5B70, + 0xCAEC: 0x719F, + 0xCAED: 0x85AF, + 0xCAEE: 0x6691, + 0xCAEF: 0x66D9, + 0xCAF0: 0x7F72, + 0xCAF1: 0x8700, + 0xCAF2: 0x9ECD, + 0xCAF3: 0x9F20, + 0xCAF4: 0x5C5E, + 0xCAF5: 0x672F, + 0xCAF6: 0x8FF0, + 0xCAF7: 0x6811, + 0xCAF8: 0x675F, + 0xCAF9: 0x620D, + 0xCAFA: 0x7AD6, + 0xCAFB: 0x5885, + 0xCAFC: 0x5EB6, + 0xCAFD: 0x6570, + 0xCAFE: 0x6F31, + 0xCB40: 0x8582, + 0xCB41: 0x8583, + 0xCB42: 0x8586, + 0xCB43: 0x8588, + 0xCB44: 0x8589, + 0xCB45: 0x858A, + 0xCB46: 0x858B, + 0xCB47: 0x858C, + 0xCB48: 0x858D, + 0xCB49: 0x858E, + 0xCB4A: 0x8590, + 0xCB4B: 0x8591, + 0xCB4C: 0x8592, + 0xCB4D: 0x8593, + 0xCB4E: 0x8594, + 0xCB4F: 0x8595, + 0xCB50: 0x8596, + 0xCB51: 0x8597, + 0xCB52: 0x8598, + 0xCB53: 0x8599, + 0xCB54: 0x859A, + 0xCB55: 0x859D, + 0xCB56: 0x859E, + 0xCB57: 0x859F, + 0xCB58: 0x85A0, + 0xCB59: 0x85A1, + 0xCB5A: 0x85A2, + 0xCB5B: 0x85A3, + 0xCB5C: 0x85A5, + 0xCB5D: 0x85A6, + 0xCB5E: 0x85A7, + 0xCB5F: 0x85A9, + 0xCB60: 0x85AB, + 0xCB61: 0x85AC, + 0xCB62: 0x85AD, + 0xCB63: 0x85B1, + 0xCB64: 0x85B2, + 0xCB65: 0x85B3, + 0xCB66: 0x85B4, + 0xCB67: 0x85B5, + 0xCB68: 0x85B6, + 0xCB69: 0x85B8, + 0xCB6A: 0x85BA, + 0xCB6B: 0x85BB, + 0xCB6C: 0x85BC, + 0xCB6D: 0x85BD, + 0xCB6E: 0x85BE, + 0xCB6F: 0x85BF, + 0xCB70: 0x85C0, + 0xCB71: 0x85C2, + 0xCB72: 0x85C3, + 0xCB73: 0x85C4, + 0xCB74: 0x85C5, + 0xCB75: 0x85C6, + 0xCB76: 0x85C7, + 0xCB77: 0x85C8, + 0xCB78: 0x85CA, + 0xCB79: 0x85CB, + 0xCB7A: 0x85CC, + 0xCB7B: 0x85CD, + 0xCB7C: 0x85CE, + 0xCB7D: 0x85D1, + 0xCB7E: 0x85D2, + 0xCB80: 0x85D4, + 0xCB81: 0x85D6, + 0xCB82: 0x85D7, + 0xCB83: 0x85D8, + 0xCB84: 0x85D9, + 0xCB85: 0x85DA, + 0xCB86: 0x85DB, + 0xCB87: 0x85DD, + 0xCB88: 0x85DE, + 0xCB89: 0x85DF, + 0xCB8A: 0x85E0, + 0xCB8B: 0x85E1, + 0xCB8C: 0x85E2, + 0xCB8D: 0x85E3, + 0xCB8E: 0x85E5, + 0xCB8F: 0x85E6, + 0xCB90: 0x85E7, + 0xCB91: 0x85E8, + 0xCB92: 0x85EA, + 0xCB93: 0x85EB, + 0xCB94: 0x85EC, + 0xCB95: 0x85ED, + 0xCB96: 0x85EE, + 0xCB97: 0x85EF, + 0xCB98: 0x85F0, + 0xCB99: 0x85F1, + 0xCB9A: 0x85F2, + 0xCB9B: 0x85F3, + 0xCB9C: 0x85F4, + 0xCB9D: 0x85F5, + 0xCB9E: 0x85F6, + 0xCB9F: 0x85F7, + 0xCBA0: 0x85F8, + 0xCBA1: 0x6055, + 0xCBA2: 0x5237, + 0xCBA3: 0x800D, + 0xCBA4: 0x6454, + 0xCBA5: 0x8870, + 0xCBA6: 0x7529, + 0xCBA7: 0x5E05, + 0xCBA8: 0x6813, + 0xCBA9: 0x62F4, + 0xCBAA: 0x971C, + 0xCBAB: 0x53CC, + 0xCBAC: 0x723D, + 0xCBAD: 0x8C01, + 0xCBAE: 0x6C34, + 0xCBAF: 0x7761, + 0xCBB0: 0x7A0E, + 0xCBB1: 0x542E, + 0xCBB2: 0x77AC, + 0xCBB3: 0x987A, + 0xCBB4: 0x821C, + 0xCBB5: 0x8BF4, + 0xCBB6: 0x7855, + 0xCBB7: 0x6714, + 0xCBB8: 0x70C1, + 0xCBB9: 0x65AF, + 0xCBBA: 0x6495, + 0xCBBB: 0x5636, + 0xCBBC: 0x601D, + 0xCBBD: 0x79C1, + 0xCBBE: 0x53F8, + 0xCBBF: 0x4E1D, + 0xCBC0: 0x6B7B, + 0xCBC1: 0x8086, + 0xCBC2: 0x5BFA, + 0xCBC3: 0x55E3, + 0xCBC4: 0x56DB, + 0xCBC5: 0x4F3A, + 0xCBC6: 0x4F3C, + 0xCBC7: 0x9972, + 0xCBC8: 0x5DF3, + 0xCBC9: 0x677E, + 0xCBCA: 0x8038, + 0xCBCB: 0x6002, + 0xCBCC: 0x9882, + 0xCBCD: 0x9001, + 0xCBCE: 0x5B8B, + 0xCBCF: 0x8BBC, + 0xCBD0: 0x8BF5, + 0xCBD1: 0x641C, + 0xCBD2: 0x8258, + 0xCBD3: 0x64DE, + 0xCBD4: 0x55FD, + 0xCBD5: 0x82CF, + 0xCBD6: 0x9165, + 0xCBD7: 0x4FD7, + 0xCBD8: 0x7D20, + 0xCBD9: 0x901F, + 0xCBDA: 0x7C9F, + 0xCBDB: 0x50F3, + 0xCBDC: 0x5851, + 0xCBDD: 0x6EAF, + 0xCBDE: 0x5BBF, + 0xCBDF: 0x8BC9, + 0xCBE0: 0x8083, + 0xCBE1: 0x9178, + 0xCBE2: 0x849C, + 0xCBE3: 0x7B97, + 0xCBE4: 0x867D, + 0xCBE5: 0x968B, + 0xCBE6: 0x968F, + 0xCBE7: 0x7EE5, + 0xCBE8: 0x9AD3, + 0xCBE9: 0x788E, + 0xCBEA: 0x5C81, + 0xCBEB: 0x7A57, + 0xCBEC: 0x9042, + 0xCBED: 0x96A7, + 0xCBEE: 0x795F, + 0xCBEF: 0x5B59, + 0xCBF0: 0x635F, + 0xCBF1: 0x7B0B, + 0xCBF2: 0x84D1, + 0xCBF3: 0x68AD, + 0xCBF4: 0x5506, + 0xCBF5: 0x7F29, + 0xCBF6: 0x7410, + 0xCBF7: 0x7D22, + 0xCBF8: 0x9501, + 0xCBF9: 0x6240, + 0xCBFA: 0x584C, + 0xCBFB: 0x4ED6, + 0xCBFC: 0x5B83, + 0xCBFD: 0x5979, + 0xCBFE: 0x5854, + 0xCC40: 0x85F9, + 0xCC41: 0x85FA, + 0xCC42: 0x85FC, + 0xCC43: 0x85FD, + 0xCC44: 0x85FE, + 0xCC45: 0x8600, + 0xCC46: 0x8601, + 0xCC47: 0x8602, + 0xCC48: 0x8603, + 0xCC49: 0x8604, + 0xCC4A: 0x8606, + 0xCC4B: 0x8607, + 0xCC4C: 0x8608, + 0xCC4D: 0x8609, + 0xCC4E: 0x860A, + 0xCC4F: 0x860B, + 0xCC50: 0x860C, + 0xCC51: 0x860D, + 0xCC52: 0x860E, + 0xCC53: 0x860F, + 0xCC54: 0x8610, + 0xCC55: 0x8612, + 0xCC56: 0x8613, + 0xCC57: 0x8614, + 0xCC58: 0x8615, + 0xCC59: 0x8617, + 0xCC5A: 0x8618, + 0xCC5B: 0x8619, + 0xCC5C: 0x861A, + 0xCC5D: 0x861B, + 0xCC5E: 0x861C, + 0xCC5F: 0x861D, + 0xCC60: 0x861E, + 0xCC61: 0x861F, + 0xCC62: 0x8620, + 0xCC63: 0x8621, + 0xCC64: 0x8622, + 0xCC65: 0x8623, + 0xCC66: 0x8624, + 0xCC67: 0x8625, + 0xCC68: 0x8626, + 0xCC69: 0x8628, + 0xCC6A: 0x862A, + 0xCC6B: 0x862B, + 0xCC6C: 0x862C, + 0xCC6D: 0x862D, + 0xCC6E: 0x862E, + 0xCC6F: 0x862F, + 0xCC70: 0x8630, + 0xCC71: 0x8631, + 0xCC72: 0x8632, + 0xCC73: 0x8633, + 0xCC74: 0x8634, + 0xCC75: 0x8635, + 0xCC76: 0x8636, + 0xCC77: 0x8637, + 0xCC78: 0x8639, + 0xCC79: 0x863A, + 0xCC7A: 0x863B, + 0xCC7B: 0x863D, + 0xCC7C: 0x863E, + 0xCC7D: 0x863F, + 0xCC7E: 0x8640, + 0xCC80: 0x8641, + 0xCC81: 0x8642, + 0xCC82: 0x8643, + 0xCC83: 0x8644, + 0xCC84: 0x8645, + 0xCC85: 0x8646, + 0xCC86: 0x8647, + 0xCC87: 0x8648, + 0xCC88: 0x8649, + 0xCC89: 0x864A, + 0xCC8A: 0x864B, + 0xCC8B: 0x864C, + 0xCC8C: 0x8652, + 0xCC8D: 0x8653, + 0xCC8E: 0x8655, + 0xCC8F: 0x8656, + 0xCC90: 0x8657, + 0xCC91: 0x8658, + 0xCC92: 0x8659, + 0xCC93: 0x865B, + 0xCC94: 0x865C, + 0xCC95: 0x865D, + 0xCC96: 0x865F, + 0xCC97: 0x8660, + 0xCC98: 0x8661, + 0xCC99: 0x8663, + 0xCC9A: 0x8664, + 0xCC9B: 0x8665, + 0xCC9C: 0x8666, + 0xCC9D: 0x8667, + 0xCC9E: 0x8668, + 0xCC9F: 0x8669, + 0xCCA0: 0x866A, + 0xCCA1: 0x736D, + 0xCCA2: 0x631E, + 0xCCA3: 0x8E4B, + 0xCCA4: 0x8E0F, + 0xCCA5: 0x80CE, + 0xCCA6: 0x82D4, + 0xCCA7: 0x62AC, + 0xCCA8: 0x53F0, + 0xCCA9: 0x6CF0, + 0xCCAA: 0x915E, + 0xCCAB: 0x592A, + 0xCCAC: 0x6001, + 0xCCAD: 0x6C70, + 0xCCAE: 0x574D, + 0xCCAF: 0x644A, + 0xCCB0: 0x8D2A, + 0xCCB1: 0x762B, + 0xCCB2: 0x6EE9, + 0xCCB3: 0x575B, + 0xCCB4: 0x6A80, + 0xCCB5: 0x75F0, + 0xCCB6: 0x6F6D, + 0xCCB7: 0x8C2D, + 0xCCB8: 0x8C08, + 0xCCB9: 0x5766, + 0xCCBA: 0x6BEF, + 0xCCBB: 0x8892, + 0xCCBC: 0x78B3, + 0xCCBD: 0x63A2, + 0xCCBE: 0x53F9, + 0xCCBF: 0x70AD, + 0xCCC0: 0x6C64, + 0xCCC1: 0x5858, + 0xCCC2: 0x642A, + 0xCCC3: 0x5802, + 0xCCC4: 0x68E0, + 0xCCC5: 0x819B, + 0xCCC6: 0x5510, + 0xCCC7: 0x7CD6, + 0xCCC8: 0x5018, + 0xCCC9: 0x8EBA, + 0xCCCA: 0x6DCC, + 0xCCCB: 0x8D9F, + 0xCCCC: 0x70EB, + 0xCCCD: 0x638F, + 0xCCCE: 0x6D9B, + 0xCCCF: 0x6ED4, + 0xCCD0: 0x7EE6, + 0xCCD1: 0x8404, + 0xCCD2: 0x6843, + 0xCCD3: 0x9003, + 0xCCD4: 0x6DD8, + 0xCCD5: 0x9676, + 0xCCD6: 0x8BA8, + 0xCCD7: 0x5957, + 0xCCD8: 0x7279, + 0xCCD9: 0x85E4, + 0xCCDA: 0x817E, + 0xCCDB: 0x75BC, + 0xCCDC: 0x8A8A, + 0xCCDD: 0x68AF, + 0xCCDE: 0x5254, + 0xCCDF: 0x8E22, + 0xCCE0: 0x9511, + 0xCCE1: 0x63D0, + 0xCCE2: 0x9898, + 0xCCE3: 0x8E44, + 0xCCE4: 0x557C, + 0xCCE5: 0x4F53, + 0xCCE6: 0x66FF, + 0xCCE7: 0x568F, + 0xCCE8: 0x60D5, + 0xCCE9: 0x6D95, + 0xCCEA: 0x5243, + 0xCCEB: 0x5C49, + 0xCCEC: 0x5929, + 0xCCED: 0x6DFB, + 0xCCEE: 0x586B, + 0xCCEF: 0x7530, + 0xCCF0: 0x751C, + 0xCCF1: 0x606C, + 0xCCF2: 0x8214, + 0xCCF3: 0x8146, + 0xCCF4: 0x6311, + 0xCCF5: 0x6761, + 0xCCF6: 0x8FE2, + 0xCCF7: 0x773A, + 0xCCF8: 0x8DF3, + 0xCCF9: 0x8D34, + 0xCCFA: 0x94C1, + 0xCCFB: 0x5E16, + 0xCCFC: 0x5385, + 0xCCFD: 0x542C, + 0xCCFE: 0x70C3, + 0xCD40: 0x866D, + 0xCD41: 0x866F, + 0xCD42: 0x8670, + 0xCD43: 0x8672, + 0xCD44: 0x8673, + 0xCD45: 0x8674, + 0xCD46: 0x8675, + 0xCD47: 0x8676, + 0xCD48: 0x8677, + 0xCD49: 0x8678, + 0xCD4A: 0x8683, + 0xCD4B: 0x8684, + 0xCD4C: 0x8685, + 0xCD4D: 0x8686, + 0xCD4E: 0x8687, + 0xCD4F: 0x8688, + 0xCD50: 0x8689, + 0xCD51: 0x868E, + 0xCD52: 0x868F, + 0xCD53: 0x8690, + 0xCD54: 0x8691, + 0xCD55: 0x8692, + 0xCD56: 0x8694, + 0xCD57: 0x8696, + 0xCD58: 0x8697, + 0xCD59: 0x8698, + 0xCD5A: 0x8699, + 0xCD5B: 0x869A, + 0xCD5C: 0x869B, + 0xCD5D: 0x869E, + 0xCD5E: 0x869F, + 0xCD5F: 0x86A0, + 0xCD60: 0x86A1, + 0xCD61: 0x86A2, + 0xCD62: 0x86A5, + 0xCD63: 0x86A6, + 0xCD64: 0x86AB, + 0xCD65: 0x86AD, + 0xCD66: 0x86AE, + 0xCD67: 0x86B2, + 0xCD68: 0x86B3, + 0xCD69: 0x86B7, + 0xCD6A: 0x86B8, + 0xCD6B: 0x86B9, + 0xCD6C: 0x86BB, + 0xCD6D: 0x86BC, + 0xCD6E: 0x86BD, + 0xCD6F: 0x86BE, + 0xCD70: 0x86BF, + 0xCD71: 0x86C1, + 0xCD72: 0x86C2, + 0xCD73: 0x86C3, + 0xCD74: 0x86C5, + 0xCD75: 0x86C8, + 0xCD76: 0x86CC, + 0xCD77: 0x86CD, + 0xCD78: 0x86D2, + 0xCD79: 0x86D3, + 0xCD7A: 0x86D5, + 0xCD7B: 0x86D6, + 0xCD7C: 0x86D7, + 0xCD7D: 0x86DA, + 0xCD7E: 0x86DC, + 0xCD80: 0x86DD, + 0xCD81: 0x86E0, + 0xCD82: 0x86E1, + 0xCD83: 0x86E2, + 0xCD84: 0x86E3, + 0xCD85: 0x86E5, + 0xCD86: 0x86E6, + 0xCD87: 0x86E7, + 0xCD88: 0x86E8, + 0xCD89: 0x86EA, + 0xCD8A: 0x86EB, + 0xCD8B: 0x86EC, + 0xCD8C: 0x86EF, + 0xCD8D: 0x86F5, + 0xCD8E: 0x86F6, + 0xCD8F: 0x86F7, + 0xCD90: 0x86FA, + 0xCD91: 0x86FB, + 0xCD92: 0x86FC, + 0xCD93: 0x86FD, + 0xCD94: 0x86FF, + 0xCD95: 0x8701, + 0xCD96: 0x8704, + 0xCD97: 0x8705, + 0xCD98: 0x8706, + 0xCD99: 0x870B, + 0xCD9A: 0x870C, + 0xCD9B: 0x870E, + 0xCD9C: 0x870F, + 0xCD9D: 0x8710, + 0xCD9E: 0x8711, + 0xCD9F: 0x8714, + 0xCDA0: 0x8716, + 0xCDA1: 0x6C40, + 0xCDA2: 0x5EF7, + 0xCDA3: 0x505C, + 0xCDA4: 0x4EAD, + 0xCDA5: 0x5EAD, + 0xCDA6: 0x633A, + 0xCDA7: 0x8247, + 0xCDA8: 0x901A, + 0xCDA9: 0x6850, + 0xCDAA: 0x916E, + 0xCDAB: 0x77B3, + 0xCDAC: 0x540C, + 0xCDAD: 0x94DC, + 0xCDAE: 0x5F64, + 0xCDAF: 0x7AE5, + 0xCDB0: 0x6876, + 0xCDB1: 0x6345, + 0xCDB2: 0x7B52, + 0xCDB3: 0x7EDF, + 0xCDB4: 0x75DB, + 0xCDB5: 0x5077, + 0xCDB6: 0x6295, + 0xCDB7: 0x5934, + 0xCDB8: 0x900F, + 0xCDB9: 0x51F8, + 0xCDBA: 0x79C3, + 0xCDBB: 0x7A81, + 0xCDBC: 0x56FE, + 0xCDBD: 0x5F92, + 0xCDBE: 0x9014, + 0xCDBF: 0x6D82, + 0xCDC0: 0x5C60, + 0xCDC1: 0x571F, + 0xCDC2: 0x5410, + 0xCDC3: 0x5154, + 0xCDC4: 0x6E4D, + 0xCDC5: 0x56E2, + 0xCDC6: 0x63A8, + 0xCDC7: 0x9893, + 0xCDC8: 0x817F, + 0xCDC9: 0x8715, + 0xCDCA: 0x892A, + 0xCDCB: 0x9000, + 0xCDCC: 0x541E, + 0xCDCD: 0x5C6F, + 0xCDCE: 0x81C0, + 0xCDCF: 0x62D6, + 0xCDD0: 0x6258, + 0xCDD1: 0x8131, + 0xCDD2: 0x9E35, + 0xCDD3: 0x9640, + 0xCDD4: 0x9A6E, + 0xCDD5: 0x9A7C, + 0xCDD6: 0x692D, + 0xCDD7: 0x59A5, + 0xCDD8: 0x62D3, + 0xCDD9: 0x553E, + 0xCDDA: 0x6316, + 0xCDDB: 0x54C7, + 0xCDDC: 0x86D9, + 0xCDDD: 0x6D3C, + 0xCDDE: 0x5A03, + 0xCDDF: 0x74E6, + 0xCDE0: 0x889C, + 0xCDE1: 0x6B6A, + 0xCDE2: 0x5916, + 0xCDE3: 0x8C4C, + 0xCDE4: 0x5F2F, + 0xCDE5: 0x6E7E, + 0xCDE6: 0x73A9, + 0xCDE7: 0x987D, + 0xCDE8: 0x4E38, + 0xCDE9: 0x70F7, + 0xCDEA: 0x5B8C, + 0xCDEB: 0x7897, + 0xCDEC: 0x633D, + 0xCDED: 0x665A, + 0xCDEE: 0x7696, + 0xCDEF: 0x60CB, + 0xCDF0: 0x5B9B, + 0xCDF1: 0x5A49, + 0xCDF2: 0x4E07, + 0xCDF3: 0x8155, + 0xCDF4: 0x6C6A, + 0xCDF5: 0x738B, + 0xCDF6: 0x4EA1, + 0xCDF7: 0x6789, + 0xCDF8: 0x7F51, + 0xCDF9: 0x5F80, + 0xCDFA: 0x65FA, + 0xCDFB: 0x671B, + 0xCDFC: 0x5FD8, + 0xCDFD: 0x5984, + 0xCDFE: 0x5A01, + 0xCE40: 0x8719, + 0xCE41: 0x871B, + 0xCE42: 0x871D, + 0xCE43: 0x871F, + 0xCE44: 0x8720, + 0xCE45: 0x8724, + 0xCE46: 0x8726, + 0xCE47: 0x8727, + 0xCE48: 0x8728, + 0xCE49: 0x872A, + 0xCE4A: 0x872B, + 0xCE4B: 0x872C, + 0xCE4C: 0x872D, + 0xCE4D: 0x872F, + 0xCE4E: 0x8730, + 0xCE4F: 0x8732, + 0xCE50: 0x8733, + 0xCE51: 0x8735, + 0xCE52: 0x8736, + 0xCE53: 0x8738, + 0xCE54: 0x8739, + 0xCE55: 0x873A, + 0xCE56: 0x873C, + 0xCE57: 0x873D, + 0xCE58: 0x8740, + 0xCE59: 0x8741, + 0xCE5A: 0x8742, + 0xCE5B: 0x8743, + 0xCE5C: 0x8744, + 0xCE5D: 0x8745, + 0xCE5E: 0x8746, + 0xCE5F: 0x874A, + 0xCE60: 0x874B, + 0xCE61: 0x874D, + 0xCE62: 0x874F, + 0xCE63: 0x8750, + 0xCE64: 0x8751, + 0xCE65: 0x8752, + 0xCE66: 0x8754, + 0xCE67: 0x8755, + 0xCE68: 0x8756, + 0xCE69: 0x8758, + 0xCE6A: 0x875A, + 0xCE6B: 0x875B, + 0xCE6C: 0x875C, + 0xCE6D: 0x875D, + 0xCE6E: 0x875E, + 0xCE6F: 0x875F, + 0xCE70: 0x8761, + 0xCE71: 0x8762, + 0xCE72: 0x8766, + 0xCE73: 0x8767, + 0xCE74: 0x8768, + 0xCE75: 0x8769, + 0xCE76: 0x876A, + 0xCE77: 0x876B, + 0xCE78: 0x876C, + 0xCE79: 0x876D, + 0xCE7A: 0x876F, + 0xCE7B: 0x8771, + 0xCE7C: 0x8772, + 0xCE7D: 0x8773, + 0xCE7E: 0x8775, + 0xCE80: 0x8777, + 0xCE81: 0x8778, + 0xCE82: 0x8779, + 0xCE83: 0x877A, + 0xCE84: 0x877F, + 0xCE85: 0x8780, + 0xCE86: 0x8781, + 0xCE87: 0x8784, + 0xCE88: 0x8786, + 0xCE89: 0x8787, + 0xCE8A: 0x8789, + 0xCE8B: 0x878A, + 0xCE8C: 0x878C, + 0xCE8D: 0x878E, + 0xCE8E: 0x878F, + 0xCE8F: 0x8790, + 0xCE90: 0x8791, + 0xCE91: 0x8792, + 0xCE92: 0x8794, + 0xCE93: 0x8795, + 0xCE94: 0x8796, + 0xCE95: 0x8798, + 0xCE96: 0x8799, + 0xCE97: 0x879A, + 0xCE98: 0x879B, + 0xCE99: 0x879C, + 0xCE9A: 0x879D, + 0xCE9B: 0x879E, + 0xCE9C: 0x87A0, + 0xCE9D: 0x87A1, + 0xCE9E: 0x87A2, + 0xCE9F: 0x87A3, + 0xCEA0: 0x87A4, + 0xCEA1: 0x5DCD, + 0xCEA2: 0x5FAE, + 0xCEA3: 0x5371, + 0xCEA4: 0x97E6, + 0xCEA5: 0x8FDD, + 0xCEA6: 0x6845, + 0xCEA7: 0x56F4, + 0xCEA8: 0x552F, + 0xCEA9: 0x60DF, + 0xCEAA: 0x4E3A, + 0xCEAB: 0x6F4D, + 0xCEAC: 0x7EF4, + 0xCEAD: 0x82C7, + 0xCEAE: 0x840E, + 0xCEAF: 0x59D4, + 0xCEB0: 0x4F1F, + 0xCEB1: 0x4F2A, + 0xCEB2: 0x5C3E, + 0xCEB3: 0x7EAC, + 0xCEB4: 0x672A, + 0xCEB5: 0x851A, + 0xCEB6: 0x5473, + 0xCEB7: 0x754F, + 0xCEB8: 0x80C3, + 0xCEB9: 0x5582, + 0xCEBA: 0x9B4F, + 0xCEBB: 0x4F4D, + 0xCEBC: 0x6E2D, + 0xCEBD: 0x8C13, + 0xCEBE: 0x5C09, + 0xCEBF: 0x6170, + 0xCEC0: 0x536B, + 0xCEC1: 0x761F, + 0xCEC2: 0x6E29, + 0xCEC3: 0x868A, + 0xCEC4: 0x6587, + 0xCEC5: 0x95FB, + 0xCEC6: 0x7EB9, + 0xCEC7: 0x543B, + 0xCEC8: 0x7A33, + 0xCEC9: 0x7D0A, + 0xCECA: 0x95EE, + 0xCECB: 0x55E1, + 0xCECC: 0x7FC1, + 0xCECD: 0x74EE, + 0xCECE: 0x631D, + 0xCECF: 0x8717, + 0xCED0: 0x6DA1, + 0xCED1: 0x7A9D, + 0xCED2: 0x6211, + 0xCED3: 0x65A1, + 0xCED4: 0x5367, + 0xCED5: 0x63E1, + 0xCED6: 0x6C83, + 0xCED7: 0x5DEB, + 0xCED8: 0x545C, + 0xCED9: 0x94A8, + 0xCEDA: 0x4E4C, + 0xCEDB: 0x6C61, + 0xCEDC: 0x8BEC, + 0xCEDD: 0x5C4B, + 0xCEDE: 0x65E0, + 0xCEDF: 0x829C, + 0xCEE0: 0x68A7, + 0xCEE1: 0x543E, + 0xCEE2: 0x5434, + 0xCEE3: 0x6BCB, + 0xCEE4: 0x6B66, + 0xCEE5: 0x4E94, + 0xCEE6: 0x6342, + 0xCEE7: 0x5348, + 0xCEE8: 0x821E, + 0xCEE9: 0x4F0D, + 0xCEEA: 0x4FAE, + 0xCEEB: 0x575E, + 0xCEEC: 0x620A, + 0xCEED: 0x96FE, + 0xCEEE: 0x6664, + 0xCEEF: 0x7269, + 0xCEF0: 0x52FF, + 0xCEF1: 0x52A1, + 0xCEF2: 0x609F, + 0xCEF3: 0x8BEF, + 0xCEF4: 0x6614, + 0xCEF5: 0x7199, + 0xCEF6: 0x6790, + 0xCEF7: 0x897F, + 0xCEF8: 0x7852, + 0xCEF9: 0x77FD, + 0xCEFA: 0x6670, + 0xCEFB: 0x563B, + 0xCEFC: 0x5438, + 0xCEFD: 0x9521, + 0xCEFE: 0x727A, + 0xCF40: 0x87A5, + 0xCF41: 0x87A6, + 0xCF42: 0x87A7, + 0xCF43: 0x87A9, + 0xCF44: 0x87AA, + 0xCF45: 0x87AE, + 0xCF46: 0x87B0, + 0xCF47: 0x87B1, + 0xCF48: 0x87B2, + 0xCF49: 0x87B4, + 0xCF4A: 0x87B6, + 0xCF4B: 0x87B7, + 0xCF4C: 0x87B8, + 0xCF4D: 0x87B9, + 0xCF4E: 0x87BB, + 0xCF4F: 0x87BC, + 0xCF50: 0x87BE, + 0xCF51: 0x87BF, + 0xCF52: 0x87C1, + 0xCF53: 0x87C2, + 0xCF54: 0x87C3, + 0xCF55: 0x87C4, + 0xCF56: 0x87C5, + 0xCF57: 0x87C7, + 0xCF58: 0x87C8, + 0xCF59: 0x87C9, + 0xCF5A: 0x87CC, + 0xCF5B: 0x87CD, + 0xCF5C: 0x87CE, + 0xCF5D: 0x87CF, + 0xCF5E: 0x87D0, + 0xCF5F: 0x87D4, + 0xCF60: 0x87D5, + 0xCF61: 0x87D6, + 0xCF62: 0x87D7, + 0xCF63: 0x87D8, + 0xCF64: 0x87D9, + 0xCF65: 0x87DA, + 0xCF66: 0x87DC, + 0xCF67: 0x87DD, + 0xCF68: 0x87DE, + 0xCF69: 0x87DF, + 0xCF6A: 0x87E1, + 0xCF6B: 0x87E2, + 0xCF6C: 0x87E3, + 0xCF6D: 0x87E4, + 0xCF6E: 0x87E6, + 0xCF6F: 0x87E7, + 0xCF70: 0x87E8, + 0xCF71: 0x87E9, + 0xCF72: 0x87EB, + 0xCF73: 0x87EC, + 0xCF74: 0x87ED, + 0xCF75: 0x87EF, + 0xCF76: 0x87F0, + 0xCF77: 0x87F1, + 0xCF78: 0x87F2, + 0xCF79: 0x87F3, + 0xCF7A: 0x87F4, + 0xCF7B: 0x87F5, + 0xCF7C: 0x87F6, + 0xCF7D: 0x87F7, + 0xCF7E: 0x87F8, + 0xCF80: 0x87FA, + 0xCF81: 0x87FB, + 0xCF82: 0x87FC, + 0xCF83: 0x87FD, + 0xCF84: 0x87FF, + 0xCF85: 0x8800, + 0xCF86: 0x8801, + 0xCF87: 0x8802, + 0xCF88: 0x8804, + 0xCF89: 0x8805, + 0xCF8A: 0x8806, + 0xCF8B: 0x8807, + 0xCF8C: 0x8808, + 0xCF8D: 0x8809, + 0xCF8E: 0x880B, + 0xCF8F: 0x880C, + 0xCF90: 0x880D, + 0xCF91: 0x880E, + 0xCF92: 0x880F, + 0xCF93: 0x8810, + 0xCF94: 0x8811, + 0xCF95: 0x8812, + 0xCF96: 0x8814, + 0xCF97: 0x8817, + 0xCF98: 0x8818, + 0xCF99: 0x8819, + 0xCF9A: 0x881A, + 0xCF9B: 0x881C, + 0xCF9C: 0x881D, + 0xCF9D: 0x881E, + 0xCF9E: 0x881F, + 0xCF9F: 0x8820, + 0xCFA0: 0x8823, + 0xCFA1: 0x7A00, + 0xCFA2: 0x606F, + 0xCFA3: 0x5E0C, + 0xCFA4: 0x6089, + 0xCFA5: 0x819D, + 0xCFA6: 0x5915, + 0xCFA7: 0x60DC, + 0xCFA8: 0x7184, + 0xCFA9: 0x70EF, + 0xCFAA: 0x6EAA, + 0xCFAB: 0x6C50, + 0xCFAC: 0x7280, + 0xCFAD: 0x6A84, + 0xCFAE: 0x88AD, + 0xCFAF: 0x5E2D, + 0xCFB0: 0x4E60, + 0xCFB1: 0x5AB3, + 0xCFB2: 0x559C, + 0xCFB3: 0x94E3, + 0xCFB4: 0x6D17, + 0xCFB5: 0x7CFB, + 0xCFB6: 0x9699, + 0xCFB7: 0x620F, + 0xCFB8: 0x7EC6, + 0xCFB9: 0x778E, + 0xCFBA: 0x867E, + 0xCFBB: 0x5323, + 0xCFBC: 0x971E, + 0xCFBD: 0x8F96, + 0xCFBE: 0x6687, + 0xCFBF: 0x5CE1, + 0xCFC0: 0x4FA0, + 0xCFC1: 0x72ED, + 0xCFC2: 0x4E0B, + 0xCFC3: 0x53A6, + 0xCFC4: 0x590F, + 0xCFC5: 0x5413, + 0xCFC6: 0x6380, + 0xCFC7: 0x9528, + 0xCFC8: 0x5148, + 0xCFC9: 0x4ED9, + 0xCFCA: 0x9C9C, + 0xCFCB: 0x7EA4, + 0xCFCC: 0x54B8, + 0xCFCD: 0x8D24, + 0xCFCE: 0x8854, + 0xCFCF: 0x8237, + 0xCFD0: 0x95F2, + 0xCFD1: 0x6D8E, + 0xCFD2: 0x5F26, + 0xCFD3: 0x5ACC, + 0xCFD4: 0x663E, + 0xCFD5: 0x9669, + 0xCFD6: 0x73B0, + 0xCFD7: 0x732E, + 0xCFD8: 0x53BF, + 0xCFD9: 0x817A, + 0xCFDA: 0x9985, + 0xCFDB: 0x7FA1, + 0xCFDC: 0x5BAA, + 0xCFDD: 0x9677, + 0xCFDE: 0x9650, + 0xCFDF: 0x7EBF, + 0xCFE0: 0x76F8, + 0xCFE1: 0x53A2, + 0xCFE2: 0x9576, + 0xCFE3: 0x9999, + 0xCFE4: 0x7BB1, + 0xCFE5: 0x8944, + 0xCFE6: 0x6E58, + 0xCFE7: 0x4E61, + 0xCFE8: 0x7FD4, + 0xCFE9: 0x7965, + 0xCFEA: 0x8BE6, + 0xCFEB: 0x60F3, + 0xCFEC: 0x54CD, + 0xCFED: 0x4EAB, + 0xCFEE: 0x9879, + 0xCFEF: 0x5DF7, + 0xCFF0: 0x6A61, + 0xCFF1: 0x50CF, + 0xCFF2: 0x5411, + 0xCFF3: 0x8C61, + 0xCFF4: 0x8427, + 0xCFF5: 0x785D, + 0xCFF6: 0x9704, + 0xCFF7: 0x524A, + 0xCFF8: 0x54EE, + 0xCFF9: 0x56A3, + 0xCFFA: 0x9500, + 0xCFFB: 0x6D88, + 0xCFFC: 0x5BB5, + 0xCFFD: 0x6DC6, + 0xCFFE: 0x6653, + 0xD040: 0x8824, + 0xD041: 0x8825, + 0xD042: 0x8826, + 0xD043: 0x8827, + 0xD044: 0x8828, + 0xD045: 0x8829, + 0xD046: 0x882A, + 0xD047: 0x882B, + 0xD048: 0x882C, + 0xD049: 0x882D, + 0xD04A: 0x882E, + 0xD04B: 0x882F, + 0xD04C: 0x8830, + 0xD04D: 0x8831, + 0xD04E: 0x8833, + 0xD04F: 0x8834, + 0xD050: 0x8835, + 0xD051: 0x8836, + 0xD052: 0x8837, + 0xD053: 0x8838, + 0xD054: 0x883A, + 0xD055: 0x883B, + 0xD056: 0x883D, + 0xD057: 0x883E, + 0xD058: 0x883F, + 0xD059: 0x8841, + 0xD05A: 0x8842, + 0xD05B: 0x8843, + 0xD05C: 0x8846, + 0xD05D: 0x8847, + 0xD05E: 0x8848, + 0xD05F: 0x8849, + 0xD060: 0x884A, + 0xD061: 0x884B, + 0xD062: 0x884E, + 0xD063: 0x884F, + 0xD064: 0x8850, + 0xD065: 0x8851, + 0xD066: 0x8852, + 0xD067: 0x8853, + 0xD068: 0x8855, + 0xD069: 0x8856, + 0xD06A: 0x8858, + 0xD06B: 0x885A, + 0xD06C: 0x885B, + 0xD06D: 0x885C, + 0xD06E: 0x885D, + 0xD06F: 0x885E, + 0xD070: 0x885F, + 0xD071: 0x8860, + 0xD072: 0x8866, + 0xD073: 0x8867, + 0xD074: 0x886A, + 0xD075: 0x886D, + 0xD076: 0x886F, + 0xD077: 0x8871, + 0xD078: 0x8873, + 0xD079: 0x8874, + 0xD07A: 0x8875, + 0xD07B: 0x8876, + 0xD07C: 0x8878, + 0xD07D: 0x8879, + 0xD07E: 0x887A, + 0xD080: 0x887B, + 0xD081: 0x887C, + 0xD082: 0x8880, + 0xD083: 0x8883, + 0xD084: 0x8886, + 0xD085: 0x8887, + 0xD086: 0x8889, + 0xD087: 0x888A, + 0xD088: 0x888C, + 0xD089: 0x888E, + 0xD08A: 0x888F, + 0xD08B: 0x8890, + 0xD08C: 0x8891, + 0xD08D: 0x8893, + 0xD08E: 0x8894, + 0xD08F: 0x8895, + 0xD090: 0x8897, + 0xD091: 0x8898, + 0xD092: 0x8899, + 0xD093: 0x889A, + 0xD094: 0x889B, + 0xD095: 0x889D, + 0xD096: 0x889E, + 0xD097: 0x889F, + 0xD098: 0x88A0, + 0xD099: 0x88A1, + 0xD09A: 0x88A3, + 0xD09B: 0x88A5, + 0xD09C: 0x88A6, + 0xD09D: 0x88A7, + 0xD09E: 0x88A8, + 0xD09F: 0x88A9, + 0xD0A0: 0x88AA, + 0xD0A1: 0x5C0F, + 0xD0A2: 0x5B5D, + 0xD0A3: 0x6821, + 0xD0A4: 0x8096, + 0xD0A5: 0x5578, + 0xD0A6: 0x7B11, + 0xD0A7: 0x6548, + 0xD0A8: 0x6954, + 0xD0A9: 0x4E9B, + 0xD0AA: 0x6B47, + 0xD0AB: 0x874E, + 0xD0AC: 0x978B, + 0xD0AD: 0x534F, + 0xD0AE: 0x631F, + 0xD0AF: 0x643A, + 0xD0B0: 0x90AA, + 0xD0B1: 0x659C, + 0xD0B2: 0x80C1, + 0xD0B3: 0x8C10, + 0xD0B4: 0x5199, + 0xD0B5: 0x68B0, + 0xD0B6: 0x5378, + 0xD0B7: 0x87F9, + 0xD0B8: 0x61C8, + 0xD0B9: 0x6CC4, + 0xD0BA: 0x6CFB, + 0xD0BB: 0x8C22, + 0xD0BC: 0x5C51, + 0xD0BD: 0x85AA, + 0xD0BE: 0x82AF, + 0xD0BF: 0x950C, + 0xD0C0: 0x6B23, + 0xD0C1: 0x8F9B, + 0xD0C2: 0x65B0, + 0xD0C3: 0x5FFB, + 0xD0C4: 0x5FC3, + 0xD0C5: 0x4FE1, + 0xD0C6: 0x8845, + 0xD0C7: 0x661F, + 0xD0C8: 0x8165, + 0xD0C9: 0x7329, + 0xD0CA: 0x60FA, + 0xD0CB: 0x5174, + 0xD0CC: 0x5211, + 0xD0CD: 0x578B, + 0xD0CE: 0x5F62, + 0xD0CF: 0x90A2, + 0xD0D0: 0x884C, + 0xD0D1: 0x9192, + 0xD0D2: 0x5E78, + 0xD0D3: 0x674F, + 0xD0D4: 0x6027, + 0xD0D5: 0x59D3, + 0xD0D6: 0x5144, + 0xD0D7: 0x51F6, + 0xD0D8: 0x80F8, + 0xD0D9: 0x5308, + 0xD0DA: 0x6C79, + 0xD0DB: 0x96C4, + 0xD0DC: 0x718A, + 0xD0DD: 0x4F11, + 0xD0DE: 0x4FEE, + 0xD0DF: 0x7F9E, + 0xD0E0: 0x673D, + 0xD0E1: 0x55C5, + 0xD0E2: 0x9508, + 0xD0E3: 0x79C0, + 0xD0E4: 0x8896, + 0xD0E5: 0x7EE3, + 0xD0E6: 0x589F, + 0xD0E7: 0x620C, + 0xD0E8: 0x9700, + 0xD0E9: 0x865A, + 0xD0EA: 0x5618, + 0xD0EB: 0x987B, + 0xD0EC: 0x5F90, + 0xD0ED: 0x8BB8, + 0xD0EE: 0x84C4, + 0xD0EF: 0x9157, + 0xD0F0: 0x53D9, + 0xD0F1: 0x65ED, + 0xD0F2: 0x5E8F, + 0xD0F3: 0x755C, + 0xD0F4: 0x6064, + 0xD0F5: 0x7D6E, + 0xD0F6: 0x5A7F, + 0xD0F7: 0x7EEA, + 0xD0F8: 0x7EED, + 0xD0F9: 0x8F69, + 0xD0FA: 0x55A7, + 0xD0FB: 0x5BA3, + 0xD0FC: 0x60AC, + 0xD0FD: 0x65CB, + 0xD0FE: 0x7384, + 0xD140: 0x88AC, + 0xD141: 0x88AE, + 0xD142: 0x88AF, + 0xD143: 0x88B0, + 0xD144: 0x88B2, + 0xD145: 0x88B3, + 0xD146: 0x88B4, + 0xD147: 0x88B5, + 0xD148: 0x88B6, + 0xD149: 0x88B8, + 0xD14A: 0x88B9, + 0xD14B: 0x88BA, + 0xD14C: 0x88BB, + 0xD14D: 0x88BD, + 0xD14E: 0x88BE, + 0xD14F: 0x88BF, + 0xD150: 0x88C0, + 0xD151: 0x88C3, + 0xD152: 0x88C4, + 0xD153: 0x88C7, + 0xD154: 0x88C8, + 0xD155: 0x88CA, + 0xD156: 0x88CB, + 0xD157: 0x88CC, + 0xD158: 0x88CD, + 0xD159: 0x88CF, + 0xD15A: 0x88D0, + 0xD15B: 0x88D1, + 0xD15C: 0x88D3, + 0xD15D: 0x88D6, + 0xD15E: 0x88D7, + 0xD15F: 0x88DA, + 0xD160: 0x88DB, + 0xD161: 0x88DC, + 0xD162: 0x88DD, + 0xD163: 0x88DE, + 0xD164: 0x88E0, + 0xD165: 0x88E1, + 0xD166: 0x88E6, + 0xD167: 0x88E7, + 0xD168: 0x88E9, + 0xD169: 0x88EA, + 0xD16A: 0x88EB, + 0xD16B: 0x88EC, + 0xD16C: 0x88ED, + 0xD16D: 0x88EE, + 0xD16E: 0x88EF, + 0xD16F: 0x88F2, + 0xD170: 0x88F5, + 0xD171: 0x88F6, + 0xD172: 0x88F7, + 0xD173: 0x88FA, + 0xD174: 0x88FB, + 0xD175: 0x88FD, + 0xD176: 0x88FF, + 0xD177: 0x8900, + 0xD178: 0x8901, + 0xD179: 0x8903, + 0xD17A: 0x8904, + 0xD17B: 0x8905, + 0xD17C: 0x8906, + 0xD17D: 0x8907, + 0xD17E: 0x8908, + 0xD180: 0x8909, + 0xD181: 0x890B, + 0xD182: 0x890C, + 0xD183: 0x890D, + 0xD184: 0x890E, + 0xD185: 0x890F, + 0xD186: 0x8911, + 0xD187: 0x8914, + 0xD188: 0x8915, + 0xD189: 0x8916, + 0xD18A: 0x8917, + 0xD18B: 0x8918, + 0xD18C: 0x891C, + 0xD18D: 0x891D, + 0xD18E: 0x891E, + 0xD18F: 0x891F, + 0xD190: 0x8920, + 0xD191: 0x8922, + 0xD192: 0x8923, + 0xD193: 0x8924, + 0xD194: 0x8926, + 0xD195: 0x8927, + 0xD196: 0x8928, + 0xD197: 0x8929, + 0xD198: 0x892C, + 0xD199: 0x892D, + 0xD19A: 0x892E, + 0xD19B: 0x892F, + 0xD19C: 0x8931, + 0xD19D: 0x8932, + 0xD19E: 0x8933, + 0xD19F: 0x8935, + 0xD1A0: 0x8937, + 0xD1A1: 0x9009, + 0xD1A2: 0x7663, + 0xD1A3: 0x7729, + 0xD1A4: 0x7EDA, + 0xD1A5: 0x9774, + 0xD1A6: 0x859B, + 0xD1A7: 0x5B66, + 0xD1A8: 0x7A74, + 0xD1A9: 0x96EA, + 0xD1AA: 0x8840, + 0xD1AB: 0x52CB, + 0xD1AC: 0x718F, + 0xD1AD: 0x5FAA, + 0xD1AE: 0x65EC, + 0xD1AF: 0x8BE2, + 0xD1B0: 0x5BFB, + 0xD1B1: 0x9A6F, + 0xD1B2: 0x5DE1, + 0xD1B3: 0x6B89, + 0xD1B4: 0x6C5B, + 0xD1B5: 0x8BAD, + 0xD1B6: 0x8BAF, + 0xD1B7: 0x900A, + 0xD1B8: 0x8FC5, + 0xD1B9: 0x538B, + 0xD1BA: 0x62BC, + 0xD1BB: 0x9E26, + 0xD1BC: 0x9E2D, + 0xD1BD: 0x5440, + 0xD1BE: 0x4E2B, + 0xD1BF: 0x82BD, + 0xD1C0: 0x7259, + 0xD1C1: 0x869C, + 0xD1C2: 0x5D16, + 0xD1C3: 0x8859, + 0xD1C4: 0x6DAF, + 0xD1C5: 0x96C5, + 0xD1C6: 0x54D1, + 0xD1C7: 0x4E9A, + 0xD1C8: 0x8BB6, + 0xD1C9: 0x7109, + 0xD1CA: 0x54BD, + 0xD1CB: 0x9609, + 0xD1CC: 0x70DF, + 0xD1CD: 0x6DF9, + 0xD1CE: 0x76D0, + 0xD1CF: 0x4E25, + 0xD1D0: 0x7814, + 0xD1D1: 0x8712, + 0xD1D2: 0x5CA9, + 0xD1D3: 0x5EF6, + 0xD1D4: 0x8A00, + 0xD1D5: 0x989C, + 0xD1D6: 0x960E, + 0xD1D7: 0x708E, + 0xD1D8: 0x6CBF, + 0xD1D9: 0x5944, + 0xD1DA: 0x63A9, + 0xD1DB: 0x773C, + 0xD1DC: 0x884D, + 0xD1DD: 0x6F14, + 0xD1DE: 0x8273, + 0xD1DF: 0x5830, + 0xD1E0: 0x71D5, + 0xD1E1: 0x538C, + 0xD1E2: 0x781A, + 0xD1E3: 0x96C1, + 0xD1E4: 0x5501, + 0xD1E5: 0x5F66, + 0xD1E6: 0x7130, + 0xD1E7: 0x5BB4, + 0xD1E8: 0x8C1A, + 0xD1E9: 0x9A8C, + 0xD1EA: 0x6B83, + 0xD1EB: 0x592E, + 0xD1EC: 0x9E2F, + 0xD1ED: 0x79E7, + 0xD1EE: 0x6768, + 0xD1EF: 0x626C, + 0xD1F0: 0x4F6F, + 0xD1F1: 0x75A1, + 0xD1F2: 0x7F8A, + 0xD1F3: 0x6D0B, + 0xD1F4: 0x9633, + 0xD1F5: 0x6C27, + 0xD1F6: 0x4EF0, + 0xD1F7: 0x75D2, + 0xD1F8: 0x517B, + 0xD1F9: 0x6837, + 0xD1FA: 0x6F3E, + 0xD1FB: 0x9080, + 0xD1FC: 0x8170, + 0xD1FD: 0x5996, + 0xD1FE: 0x7476, + 0xD240: 0x8938, + 0xD241: 0x8939, + 0xD242: 0x893A, + 0xD243: 0x893B, + 0xD244: 0x893C, + 0xD245: 0x893D, + 0xD246: 0x893E, + 0xD247: 0x893F, + 0xD248: 0x8940, + 0xD249: 0x8942, + 0xD24A: 0x8943, + 0xD24B: 0x8945, + 0xD24C: 0x8946, + 0xD24D: 0x8947, + 0xD24E: 0x8948, + 0xD24F: 0x8949, + 0xD250: 0x894A, + 0xD251: 0x894B, + 0xD252: 0x894C, + 0xD253: 0x894D, + 0xD254: 0x894E, + 0xD255: 0x894F, + 0xD256: 0x8950, + 0xD257: 0x8951, + 0xD258: 0x8952, + 0xD259: 0x8953, + 0xD25A: 0x8954, + 0xD25B: 0x8955, + 0xD25C: 0x8956, + 0xD25D: 0x8957, + 0xD25E: 0x8958, + 0xD25F: 0x8959, + 0xD260: 0x895A, + 0xD261: 0x895B, + 0xD262: 0x895C, + 0xD263: 0x895D, + 0xD264: 0x8960, + 0xD265: 0x8961, + 0xD266: 0x8962, + 0xD267: 0x8963, + 0xD268: 0x8964, + 0xD269: 0x8965, + 0xD26A: 0x8967, + 0xD26B: 0x8968, + 0xD26C: 0x8969, + 0xD26D: 0x896A, + 0xD26E: 0x896B, + 0xD26F: 0x896C, + 0xD270: 0x896D, + 0xD271: 0x896E, + 0xD272: 0x896F, + 0xD273: 0x8970, + 0xD274: 0x8971, + 0xD275: 0x8972, + 0xD276: 0x8973, + 0xD277: 0x8974, + 0xD278: 0x8975, + 0xD279: 0x8976, + 0xD27A: 0x8977, + 0xD27B: 0x8978, + 0xD27C: 0x8979, + 0xD27D: 0x897A, + 0xD27E: 0x897C, + 0xD280: 0x897D, + 0xD281: 0x897E, + 0xD282: 0x8980, + 0xD283: 0x8982, + 0xD284: 0x8984, + 0xD285: 0x8985, + 0xD286: 0x8987, + 0xD287: 0x8988, + 0xD288: 0x8989, + 0xD289: 0x898A, + 0xD28A: 0x898B, + 0xD28B: 0x898C, + 0xD28C: 0x898D, + 0xD28D: 0x898E, + 0xD28E: 0x898F, + 0xD28F: 0x8990, + 0xD290: 0x8991, + 0xD291: 0x8992, + 0xD292: 0x8993, + 0xD293: 0x8994, + 0xD294: 0x8995, + 0xD295: 0x8996, + 0xD296: 0x8997, + 0xD297: 0x8998, + 0xD298: 0x8999, + 0xD299: 0x899A, + 0xD29A: 0x899B, + 0xD29B: 0x899C, + 0xD29C: 0x899D, + 0xD29D: 0x899E, + 0xD29E: 0x899F, + 0xD29F: 0x89A0, + 0xD2A0: 0x89A1, + 0xD2A1: 0x6447, + 0xD2A2: 0x5C27, + 0xD2A3: 0x9065, + 0xD2A4: 0x7A91, + 0xD2A5: 0x8C23, + 0xD2A6: 0x59DA, + 0xD2A7: 0x54AC, + 0xD2A8: 0x8200, + 0xD2A9: 0x836F, + 0xD2AA: 0x8981, + 0xD2AB: 0x8000, + 0xD2AC: 0x6930, + 0xD2AD: 0x564E, + 0xD2AE: 0x8036, + 0xD2AF: 0x7237, + 0xD2B0: 0x91CE, + 0xD2B1: 0x51B6, + 0xD2B2: 0x4E5F, + 0xD2B3: 0x9875, + 0xD2B4: 0x6396, + 0xD2B5: 0x4E1A, + 0xD2B6: 0x53F6, + 0xD2B7: 0x66F3, + 0xD2B8: 0x814B, + 0xD2B9: 0x591C, + 0xD2BA: 0x6DB2, + 0xD2BB: 0x4E00, + 0xD2BC: 0x58F9, + 0xD2BD: 0x533B, + 0xD2BE: 0x63D6, + 0xD2BF: 0x94F1, + 0xD2C0: 0x4F9D, + 0xD2C1: 0x4F0A, + 0xD2C2: 0x8863, + 0xD2C3: 0x9890, + 0xD2C4: 0x5937, + 0xD2C5: 0x9057, + 0xD2C6: 0x79FB, + 0xD2C7: 0x4EEA, + 0xD2C8: 0x80F0, + 0xD2C9: 0x7591, + 0xD2CA: 0x6C82, + 0xD2CB: 0x5B9C, + 0xD2CC: 0x59E8, + 0xD2CD: 0x5F5D, + 0xD2CE: 0x6905, + 0xD2CF: 0x8681, + 0xD2D0: 0x501A, + 0xD2D1: 0x5DF2, + 0xD2D2: 0x4E59, + 0xD2D3: 0x77E3, + 0xD2D4: 0x4EE5, + 0xD2D5: 0x827A, + 0xD2D6: 0x6291, + 0xD2D7: 0x6613, + 0xD2D8: 0x9091, + 0xD2D9: 0x5C79, + 0xD2DA: 0x4EBF, + 0xD2DB: 0x5F79, + 0xD2DC: 0x81C6, + 0xD2DD: 0x9038, + 0xD2DE: 0x8084, + 0xD2DF: 0x75AB, + 0xD2E0: 0x4EA6, + 0xD2E1: 0x88D4, + 0xD2E2: 0x610F, + 0xD2E3: 0x6BC5, + 0xD2E4: 0x5FC6, + 0xD2E5: 0x4E49, + 0xD2E6: 0x76CA, + 0xD2E7: 0x6EA2, + 0xD2E8: 0x8BE3, + 0xD2E9: 0x8BAE, + 0xD2EA: 0x8C0A, + 0xD2EB: 0x8BD1, + 0xD2EC: 0x5F02, + 0xD2ED: 0x7FFC, + 0xD2EE: 0x7FCC, + 0xD2EF: 0x7ECE, + 0xD2F0: 0x8335, + 0xD2F1: 0x836B, + 0xD2F2: 0x56E0, + 0xD2F3: 0x6BB7, + 0xD2F4: 0x97F3, + 0xD2F5: 0x9634, + 0xD2F6: 0x59FB, + 0xD2F7: 0x541F, + 0xD2F8: 0x94F6, + 0xD2F9: 0x6DEB, + 0xD2FA: 0x5BC5, + 0xD2FB: 0x996E, + 0xD2FC: 0x5C39, + 0xD2FD: 0x5F15, + 0xD2FE: 0x9690, + 0xD340: 0x89A2, + 0xD341: 0x89A3, + 0xD342: 0x89A4, + 0xD343: 0x89A5, + 0xD344: 0x89A6, + 0xD345: 0x89A7, + 0xD346: 0x89A8, + 0xD347: 0x89A9, + 0xD348: 0x89AA, + 0xD349: 0x89AB, + 0xD34A: 0x89AC, + 0xD34B: 0x89AD, + 0xD34C: 0x89AE, + 0xD34D: 0x89AF, + 0xD34E: 0x89B0, + 0xD34F: 0x89B1, + 0xD350: 0x89B2, + 0xD351: 0x89B3, + 0xD352: 0x89B4, + 0xD353: 0x89B5, + 0xD354: 0x89B6, + 0xD355: 0x89B7, + 0xD356: 0x89B8, + 0xD357: 0x89B9, + 0xD358: 0x89BA, + 0xD359: 0x89BB, + 0xD35A: 0x89BC, + 0xD35B: 0x89BD, + 0xD35C: 0x89BE, + 0xD35D: 0x89BF, + 0xD35E: 0x89C0, + 0xD35F: 0x89C3, + 0xD360: 0x89CD, + 0xD361: 0x89D3, + 0xD362: 0x89D4, + 0xD363: 0x89D5, + 0xD364: 0x89D7, + 0xD365: 0x89D8, + 0xD366: 0x89D9, + 0xD367: 0x89DB, + 0xD368: 0x89DD, + 0xD369: 0x89DF, + 0xD36A: 0x89E0, + 0xD36B: 0x89E1, + 0xD36C: 0x89E2, + 0xD36D: 0x89E4, + 0xD36E: 0x89E7, + 0xD36F: 0x89E8, + 0xD370: 0x89E9, + 0xD371: 0x89EA, + 0xD372: 0x89EC, + 0xD373: 0x89ED, + 0xD374: 0x89EE, + 0xD375: 0x89F0, + 0xD376: 0x89F1, + 0xD377: 0x89F2, + 0xD378: 0x89F4, + 0xD379: 0x89F5, + 0xD37A: 0x89F6, + 0xD37B: 0x89F7, + 0xD37C: 0x89F8, + 0xD37D: 0x89F9, + 0xD37E: 0x89FA, + 0xD380: 0x89FB, + 0xD381: 0x89FC, + 0xD382: 0x89FD, + 0xD383: 0x89FE, + 0xD384: 0x89FF, + 0xD385: 0x8A01, + 0xD386: 0x8A02, + 0xD387: 0x8A03, + 0xD388: 0x8A04, + 0xD389: 0x8A05, + 0xD38A: 0x8A06, + 0xD38B: 0x8A08, + 0xD38C: 0x8A09, + 0xD38D: 0x8A0A, + 0xD38E: 0x8A0B, + 0xD38F: 0x8A0C, + 0xD390: 0x8A0D, + 0xD391: 0x8A0E, + 0xD392: 0x8A0F, + 0xD393: 0x8A10, + 0xD394: 0x8A11, + 0xD395: 0x8A12, + 0xD396: 0x8A13, + 0xD397: 0x8A14, + 0xD398: 0x8A15, + 0xD399: 0x8A16, + 0xD39A: 0x8A17, + 0xD39B: 0x8A18, + 0xD39C: 0x8A19, + 0xD39D: 0x8A1A, + 0xD39E: 0x8A1B, + 0xD39F: 0x8A1C, + 0xD3A0: 0x8A1D, + 0xD3A1: 0x5370, + 0xD3A2: 0x82F1, + 0xD3A3: 0x6A31, + 0xD3A4: 0x5A74, + 0xD3A5: 0x9E70, + 0xD3A6: 0x5E94, + 0xD3A7: 0x7F28, + 0xD3A8: 0x83B9, + 0xD3A9: 0x8424, + 0xD3AA: 0x8425, + 0xD3AB: 0x8367, + 0xD3AC: 0x8747, + 0xD3AD: 0x8FCE, + 0xD3AE: 0x8D62, + 0xD3AF: 0x76C8, + 0xD3B0: 0x5F71, + 0xD3B1: 0x9896, + 0xD3B2: 0x786C, + 0xD3B3: 0x6620, + 0xD3B4: 0x54DF, + 0xD3B5: 0x62E5, + 0xD3B6: 0x4F63, + 0xD3B7: 0x81C3, + 0xD3B8: 0x75C8, + 0xD3B9: 0x5EB8, + 0xD3BA: 0x96CD, + 0xD3BB: 0x8E0A, + 0xD3BC: 0x86F9, + 0xD3BD: 0x548F, + 0xD3BE: 0x6CF3, + 0xD3BF: 0x6D8C, + 0xD3C0: 0x6C38, + 0xD3C1: 0x607F, + 0xD3C2: 0x52C7, + 0xD3C3: 0x7528, + 0xD3C4: 0x5E7D, + 0xD3C5: 0x4F18, + 0xD3C6: 0x60A0, + 0xD3C7: 0x5FE7, + 0xD3C8: 0x5C24, + 0xD3C9: 0x7531, + 0xD3CA: 0x90AE, + 0xD3CB: 0x94C0, + 0xD3CC: 0x72B9, + 0xD3CD: 0x6CB9, + 0xD3CE: 0x6E38, + 0xD3CF: 0x9149, + 0xD3D0: 0x6709, + 0xD3D1: 0x53CB, + 0xD3D2: 0x53F3, + 0xD3D3: 0x4F51, + 0xD3D4: 0x91C9, + 0xD3D5: 0x8BF1, + 0xD3D6: 0x53C8, + 0xD3D7: 0x5E7C, + 0xD3D8: 0x8FC2, + 0xD3D9: 0x6DE4, + 0xD3DA: 0x4E8E, + 0xD3DB: 0x76C2, + 0xD3DC: 0x6986, + 0xD3DD: 0x865E, + 0xD3DE: 0x611A, + 0xD3DF: 0x8206, + 0xD3E0: 0x4F59, + 0xD3E1: 0x4FDE, + 0xD3E2: 0x903E, + 0xD3E3: 0x9C7C, + 0xD3E4: 0x6109, + 0xD3E5: 0x6E1D, + 0xD3E6: 0x6E14, + 0xD3E7: 0x9685, + 0xD3E8: 0x4E88, + 0xD3E9: 0x5A31, + 0xD3EA: 0x96E8, + 0xD3EB: 0x4E0E, + 0xD3EC: 0x5C7F, + 0xD3ED: 0x79B9, + 0xD3EE: 0x5B87, + 0xD3EF: 0x8BED, + 0xD3F0: 0x7FBD, + 0xD3F1: 0x7389, + 0xD3F2: 0x57DF, + 0xD3F3: 0x828B, + 0xD3F4: 0x90C1, + 0xD3F5: 0x5401, + 0xD3F6: 0x9047, + 0xD3F7: 0x55BB, + 0xD3F8: 0x5CEA, + 0xD3F9: 0x5FA1, + 0xD3FA: 0x6108, + 0xD3FB: 0x6B32, + 0xD3FC: 0x72F1, + 0xD3FD: 0x80B2, + 0xD3FE: 0x8A89, + 0xD440: 0x8A1E, + 0xD441: 0x8A1F, + 0xD442: 0x8A20, + 0xD443: 0x8A21, + 0xD444: 0x8A22, + 0xD445: 0x8A23, + 0xD446: 0x8A24, + 0xD447: 0x8A25, + 0xD448: 0x8A26, + 0xD449: 0x8A27, + 0xD44A: 0x8A28, + 0xD44B: 0x8A29, + 0xD44C: 0x8A2A, + 0xD44D: 0x8A2B, + 0xD44E: 0x8A2C, + 0xD44F: 0x8A2D, + 0xD450: 0x8A2E, + 0xD451: 0x8A2F, + 0xD452: 0x8A30, + 0xD453: 0x8A31, + 0xD454: 0x8A32, + 0xD455: 0x8A33, + 0xD456: 0x8A34, + 0xD457: 0x8A35, + 0xD458: 0x8A36, + 0xD459: 0x8A37, + 0xD45A: 0x8A38, + 0xD45B: 0x8A39, + 0xD45C: 0x8A3A, + 0xD45D: 0x8A3B, + 0xD45E: 0x8A3C, + 0xD45F: 0x8A3D, + 0xD460: 0x8A3F, + 0xD461: 0x8A40, + 0xD462: 0x8A41, + 0xD463: 0x8A42, + 0xD464: 0x8A43, + 0xD465: 0x8A44, + 0xD466: 0x8A45, + 0xD467: 0x8A46, + 0xD468: 0x8A47, + 0xD469: 0x8A49, + 0xD46A: 0x8A4A, + 0xD46B: 0x8A4B, + 0xD46C: 0x8A4C, + 0xD46D: 0x8A4D, + 0xD46E: 0x8A4E, + 0xD46F: 0x8A4F, + 0xD470: 0x8A50, + 0xD471: 0x8A51, + 0xD472: 0x8A52, + 0xD473: 0x8A53, + 0xD474: 0x8A54, + 0xD475: 0x8A55, + 0xD476: 0x8A56, + 0xD477: 0x8A57, + 0xD478: 0x8A58, + 0xD479: 0x8A59, + 0xD47A: 0x8A5A, + 0xD47B: 0x8A5B, + 0xD47C: 0x8A5C, + 0xD47D: 0x8A5D, + 0xD47E: 0x8A5E, + 0xD480: 0x8A5F, + 0xD481: 0x8A60, + 0xD482: 0x8A61, + 0xD483: 0x8A62, + 0xD484: 0x8A63, + 0xD485: 0x8A64, + 0xD486: 0x8A65, + 0xD487: 0x8A66, + 0xD488: 0x8A67, + 0xD489: 0x8A68, + 0xD48A: 0x8A69, + 0xD48B: 0x8A6A, + 0xD48C: 0x8A6B, + 0xD48D: 0x8A6C, + 0xD48E: 0x8A6D, + 0xD48F: 0x8A6E, + 0xD490: 0x8A6F, + 0xD491: 0x8A70, + 0xD492: 0x8A71, + 0xD493: 0x8A72, + 0xD494: 0x8A73, + 0xD495: 0x8A74, + 0xD496: 0x8A75, + 0xD497: 0x8A76, + 0xD498: 0x8A77, + 0xD499: 0x8A78, + 0xD49A: 0x8A7A, + 0xD49B: 0x8A7B, + 0xD49C: 0x8A7C, + 0xD49D: 0x8A7D, + 0xD49E: 0x8A7E, + 0xD49F: 0x8A7F, + 0xD4A0: 0x8A80, + 0xD4A1: 0x6D74, + 0xD4A2: 0x5BD3, + 0xD4A3: 0x88D5, + 0xD4A4: 0x9884, + 0xD4A5: 0x8C6B, + 0xD4A6: 0x9A6D, + 0xD4A7: 0x9E33, + 0xD4A8: 0x6E0A, + 0xD4A9: 0x51A4, + 0xD4AA: 0x5143, + 0xD4AB: 0x57A3, + 0xD4AC: 0x8881, + 0xD4AD: 0x539F, + 0xD4AE: 0x63F4, + 0xD4AF: 0x8F95, + 0xD4B0: 0x56ED, + 0xD4B1: 0x5458, + 0xD4B2: 0x5706, + 0xD4B3: 0x733F, + 0xD4B4: 0x6E90, + 0xD4B5: 0x7F18, + 0xD4B6: 0x8FDC, + 0xD4B7: 0x82D1, + 0xD4B8: 0x613F, + 0xD4B9: 0x6028, + 0xD4BA: 0x9662, + 0xD4BB: 0x66F0, + 0xD4BC: 0x7EA6, + 0xD4BD: 0x8D8A, + 0xD4BE: 0x8DC3, + 0xD4BF: 0x94A5, + 0xD4C0: 0x5CB3, + 0xD4C1: 0x7CA4, + 0xD4C2: 0x6708, + 0xD4C3: 0x60A6, + 0xD4C4: 0x9605, + 0xD4C5: 0x8018, + 0xD4C6: 0x4E91, + 0xD4C7: 0x90E7, + 0xD4C8: 0x5300, + 0xD4C9: 0x9668, + 0xD4CA: 0x5141, + 0xD4CB: 0x8FD0, + 0xD4CC: 0x8574, + 0xD4CD: 0x915D, + 0xD4CE: 0x6655, + 0xD4CF: 0x97F5, + 0xD4D0: 0x5B55, + 0xD4D1: 0x531D, + 0xD4D2: 0x7838, + 0xD4D3: 0x6742, + 0xD4D4: 0x683D, + 0xD4D5: 0x54C9, + 0xD4D6: 0x707E, + 0xD4D7: 0x5BB0, + 0xD4D8: 0x8F7D, + 0xD4D9: 0x518D, + 0xD4DA: 0x5728, + 0xD4DB: 0x54B1, + 0xD4DC: 0x6512, + 0xD4DD: 0x6682, + 0xD4DE: 0x8D5E, + 0xD4DF: 0x8D43, + 0xD4E0: 0x810F, + 0xD4E1: 0x846C, + 0xD4E2: 0x906D, + 0xD4E3: 0x7CDF, + 0xD4E4: 0x51FF, + 0xD4E5: 0x85FB, + 0xD4E6: 0x67A3, + 0xD4E7: 0x65E9, + 0xD4E8: 0x6FA1, + 0xD4E9: 0x86A4, + 0xD4EA: 0x8E81, + 0xD4EB: 0x566A, + 0xD4EC: 0x9020, + 0xD4ED: 0x7682, + 0xD4EE: 0x7076, + 0xD4EF: 0x71E5, + 0xD4F0: 0x8D23, + 0xD4F1: 0x62E9, + 0xD4F2: 0x5219, + 0xD4F3: 0x6CFD, + 0xD4F4: 0x8D3C, + 0xD4F5: 0x600E, + 0xD4F6: 0x589E, + 0xD4F7: 0x618E, + 0xD4F8: 0x66FE, + 0xD4F9: 0x8D60, + 0xD4FA: 0x624E, + 0xD4FB: 0x55B3, + 0xD4FC: 0x6E23, + 0xD4FD: 0x672D, + 0xD4FE: 0x8F67, + 0xD540: 0x8A81, + 0xD541: 0x8A82, + 0xD542: 0x8A83, + 0xD543: 0x8A84, + 0xD544: 0x8A85, + 0xD545: 0x8A86, + 0xD546: 0x8A87, + 0xD547: 0x8A88, + 0xD548: 0x8A8B, + 0xD549: 0x8A8C, + 0xD54A: 0x8A8D, + 0xD54B: 0x8A8E, + 0xD54C: 0x8A8F, + 0xD54D: 0x8A90, + 0xD54E: 0x8A91, + 0xD54F: 0x8A92, + 0xD550: 0x8A94, + 0xD551: 0x8A95, + 0xD552: 0x8A96, + 0xD553: 0x8A97, + 0xD554: 0x8A98, + 0xD555: 0x8A99, + 0xD556: 0x8A9A, + 0xD557: 0x8A9B, + 0xD558: 0x8A9C, + 0xD559: 0x8A9D, + 0xD55A: 0x8A9E, + 0xD55B: 0x8A9F, + 0xD55C: 0x8AA0, + 0xD55D: 0x8AA1, + 0xD55E: 0x8AA2, + 0xD55F: 0x8AA3, + 0xD560: 0x8AA4, + 0xD561: 0x8AA5, + 0xD562: 0x8AA6, + 0xD563: 0x8AA7, + 0xD564: 0x8AA8, + 0xD565: 0x8AA9, + 0xD566: 0x8AAA, + 0xD567: 0x8AAB, + 0xD568: 0x8AAC, + 0xD569: 0x8AAD, + 0xD56A: 0x8AAE, + 0xD56B: 0x8AAF, + 0xD56C: 0x8AB0, + 0xD56D: 0x8AB1, + 0xD56E: 0x8AB2, + 0xD56F: 0x8AB3, + 0xD570: 0x8AB4, + 0xD571: 0x8AB5, + 0xD572: 0x8AB6, + 0xD573: 0x8AB7, + 0xD574: 0x8AB8, + 0xD575: 0x8AB9, + 0xD576: 0x8ABA, + 0xD577: 0x8ABB, + 0xD578: 0x8ABC, + 0xD579: 0x8ABD, + 0xD57A: 0x8ABE, + 0xD57B: 0x8ABF, + 0xD57C: 0x8AC0, + 0xD57D: 0x8AC1, + 0xD57E: 0x8AC2, + 0xD580: 0x8AC3, + 0xD581: 0x8AC4, + 0xD582: 0x8AC5, + 0xD583: 0x8AC6, + 0xD584: 0x8AC7, + 0xD585: 0x8AC8, + 0xD586: 0x8AC9, + 0xD587: 0x8ACA, + 0xD588: 0x8ACB, + 0xD589: 0x8ACC, + 0xD58A: 0x8ACD, + 0xD58B: 0x8ACE, + 0xD58C: 0x8ACF, + 0xD58D: 0x8AD0, + 0xD58E: 0x8AD1, + 0xD58F: 0x8AD2, + 0xD590: 0x8AD3, + 0xD591: 0x8AD4, + 0xD592: 0x8AD5, + 0xD593: 0x8AD6, + 0xD594: 0x8AD7, + 0xD595: 0x8AD8, + 0xD596: 0x8AD9, + 0xD597: 0x8ADA, + 0xD598: 0x8ADB, + 0xD599: 0x8ADC, + 0xD59A: 0x8ADD, + 0xD59B: 0x8ADE, + 0xD59C: 0x8ADF, + 0xD59D: 0x8AE0, + 0xD59E: 0x8AE1, + 0xD59F: 0x8AE2, + 0xD5A0: 0x8AE3, + 0xD5A1: 0x94E1, + 0xD5A2: 0x95F8, + 0xD5A3: 0x7728, + 0xD5A4: 0x6805, + 0xD5A5: 0x69A8, + 0xD5A6: 0x548B, + 0xD5A7: 0x4E4D, + 0xD5A8: 0x70B8, + 0xD5A9: 0x8BC8, + 0xD5AA: 0x6458, + 0xD5AB: 0x658B, + 0xD5AC: 0x5B85, + 0xD5AD: 0x7A84, + 0xD5AE: 0x503A, + 0xD5AF: 0x5BE8, + 0xD5B0: 0x77BB, + 0xD5B1: 0x6BE1, + 0xD5B2: 0x8A79, + 0xD5B3: 0x7C98, + 0xD5B4: 0x6CBE, + 0xD5B5: 0x76CF, + 0xD5B6: 0x65A9, + 0xD5B7: 0x8F97, + 0xD5B8: 0x5D2D, + 0xD5B9: 0x5C55, + 0xD5BA: 0x8638, + 0xD5BB: 0x6808, + 0xD5BC: 0x5360, + 0xD5BD: 0x6218, + 0xD5BE: 0x7AD9, + 0xD5BF: 0x6E5B, + 0xD5C0: 0x7EFD, + 0xD5C1: 0x6A1F, + 0xD5C2: 0x7AE0, + 0xD5C3: 0x5F70, + 0xD5C4: 0x6F33, + 0xD5C5: 0x5F20, + 0xD5C6: 0x638C, + 0xD5C7: 0x6DA8, + 0xD5C8: 0x6756, + 0xD5C9: 0x4E08, + 0xD5CA: 0x5E10, + 0xD5CB: 0x8D26, + 0xD5CC: 0x4ED7, + 0xD5CD: 0x80C0, + 0xD5CE: 0x7634, + 0xD5CF: 0x969C, + 0xD5D0: 0x62DB, + 0xD5D1: 0x662D, + 0xD5D2: 0x627E, + 0xD5D3: 0x6CBC, + 0xD5D4: 0x8D75, + 0xD5D5: 0x7167, + 0xD5D6: 0x7F69, + 0xD5D7: 0x5146, + 0xD5D8: 0x8087, + 0xD5D9: 0x53EC, + 0xD5DA: 0x906E, + 0xD5DB: 0x6298, + 0xD5DC: 0x54F2, + 0xD5DD: 0x86F0, + 0xD5DE: 0x8F99, + 0xD5DF: 0x8005, + 0xD5E0: 0x9517, + 0xD5E1: 0x8517, + 0xD5E2: 0x8FD9, + 0xD5E3: 0x6D59, + 0xD5E4: 0x73CD, + 0xD5E5: 0x659F, + 0xD5E6: 0x771F, + 0xD5E7: 0x7504, + 0xD5E8: 0x7827, + 0xD5E9: 0x81FB, + 0xD5EA: 0x8D1E, + 0xD5EB: 0x9488, + 0xD5EC: 0x4FA6, + 0xD5ED: 0x6795, + 0xD5EE: 0x75B9, + 0xD5EF: 0x8BCA, + 0xD5F0: 0x9707, + 0xD5F1: 0x632F, + 0xD5F2: 0x9547, + 0xD5F3: 0x9635, + 0xD5F4: 0x84B8, + 0xD5F5: 0x6323, + 0xD5F6: 0x7741, + 0xD5F7: 0x5F81, + 0xD5F8: 0x72F0, + 0xD5F9: 0x4E89, + 0xD5FA: 0x6014, + 0xD5FB: 0x6574, + 0xD5FC: 0x62EF, + 0xD5FD: 0x6B63, + 0xD5FE: 0x653F, + 0xD640: 0x8AE4, + 0xD641: 0x8AE5, + 0xD642: 0x8AE6, + 0xD643: 0x8AE7, + 0xD644: 0x8AE8, + 0xD645: 0x8AE9, + 0xD646: 0x8AEA, + 0xD647: 0x8AEB, + 0xD648: 0x8AEC, + 0xD649: 0x8AED, + 0xD64A: 0x8AEE, + 0xD64B: 0x8AEF, + 0xD64C: 0x8AF0, + 0xD64D: 0x8AF1, + 0xD64E: 0x8AF2, + 0xD64F: 0x8AF3, + 0xD650: 0x8AF4, + 0xD651: 0x8AF5, + 0xD652: 0x8AF6, + 0xD653: 0x8AF7, + 0xD654: 0x8AF8, + 0xD655: 0x8AF9, + 0xD656: 0x8AFA, + 0xD657: 0x8AFB, + 0xD658: 0x8AFC, + 0xD659: 0x8AFD, + 0xD65A: 0x8AFE, + 0xD65B: 0x8AFF, + 0xD65C: 0x8B00, + 0xD65D: 0x8B01, + 0xD65E: 0x8B02, + 0xD65F: 0x8B03, + 0xD660: 0x8B04, + 0xD661: 0x8B05, + 0xD662: 0x8B06, + 0xD663: 0x8B08, + 0xD664: 0x8B09, + 0xD665: 0x8B0A, + 0xD666: 0x8B0B, + 0xD667: 0x8B0C, + 0xD668: 0x8B0D, + 0xD669: 0x8B0E, + 0xD66A: 0x8B0F, + 0xD66B: 0x8B10, + 0xD66C: 0x8B11, + 0xD66D: 0x8B12, + 0xD66E: 0x8B13, + 0xD66F: 0x8B14, + 0xD670: 0x8B15, + 0xD671: 0x8B16, + 0xD672: 0x8B17, + 0xD673: 0x8B18, + 0xD674: 0x8B19, + 0xD675: 0x8B1A, + 0xD676: 0x8B1B, + 0xD677: 0x8B1C, + 0xD678: 0x8B1D, + 0xD679: 0x8B1E, + 0xD67A: 0x8B1F, + 0xD67B: 0x8B20, + 0xD67C: 0x8B21, + 0xD67D: 0x8B22, + 0xD67E: 0x8B23, + 0xD680: 0x8B24, + 0xD681: 0x8B25, + 0xD682: 0x8B27, + 0xD683: 0x8B28, + 0xD684: 0x8B29, + 0xD685: 0x8B2A, + 0xD686: 0x8B2B, + 0xD687: 0x8B2C, + 0xD688: 0x8B2D, + 0xD689: 0x8B2E, + 0xD68A: 0x8B2F, + 0xD68B: 0x8B30, + 0xD68C: 0x8B31, + 0xD68D: 0x8B32, + 0xD68E: 0x8B33, + 0xD68F: 0x8B34, + 0xD690: 0x8B35, + 0xD691: 0x8B36, + 0xD692: 0x8B37, + 0xD693: 0x8B38, + 0xD694: 0x8B39, + 0xD695: 0x8B3A, + 0xD696: 0x8B3B, + 0xD697: 0x8B3C, + 0xD698: 0x8B3D, + 0xD699: 0x8B3E, + 0xD69A: 0x8B3F, + 0xD69B: 0x8B40, + 0xD69C: 0x8B41, + 0xD69D: 0x8B42, + 0xD69E: 0x8B43, + 0xD69F: 0x8B44, + 0xD6A0: 0x8B45, + 0xD6A1: 0x5E27, + 0xD6A2: 0x75C7, + 0xD6A3: 0x90D1, + 0xD6A4: 0x8BC1, + 0xD6A5: 0x829D, + 0xD6A6: 0x679D, + 0xD6A7: 0x652F, + 0xD6A8: 0x5431, + 0xD6A9: 0x8718, + 0xD6AA: 0x77E5, + 0xD6AB: 0x80A2, + 0xD6AC: 0x8102, + 0xD6AD: 0x6C41, + 0xD6AE: 0x4E4B, + 0xD6AF: 0x7EC7, + 0xD6B0: 0x804C, + 0xD6B1: 0x76F4, + 0xD6B2: 0x690D, + 0xD6B3: 0x6B96, + 0xD6B4: 0x6267, + 0xD6B5: 0x503C, + 0xD6B6: 0x4F84, + 0xD6B7: 0x5740, + 0xD6B8: 0x6307, + 0xD6B9: 0x6B62, + 0xD6BA: 0x8DBE, + 0xD6BB: 0x53EA, + 0xD6BC: 0x65E8, + 0xD6BD: 0x7EB8, + 0xD6BE: 0x5FD7, + 0xD6BF: 0x631A, + 0xD6C0: 0x63B7, + 0xD6C1: 0x81F3, + 0xD6C2: 0x81F4, + 0xD6C3: 0x7F6E, + 0xD6C4: 0x5E1C, + 0xD6C5: 0x5CD9, + 0xD6C6: 0x5236, + 0xD6C7: 0x667A, + 0xD6C8: 0x79E9, + 0xD6C9: 0x7A1A, + 0xD6CA: 0x8D28, + 0xD6CB: 0x7099, + 0xD6CC: 0x75D4, + 0xD6CD: 0x6EDE, + 0xD6CE: 0x6CBB, + 0xD6CF: 0x7A92, + 0xD6D0: 0x4E2D, + 0xD6D1: 0x76C5, + 0xD6D2: 0x5FE0, + 0xD6D3: 0x949F, + 0xD6D4: 0x8877, + 0xD6D5: 0x7EC8, + 0xD6D6: 0x79CD, + 0xD6D7: 0x80BF, + 0xD6D8: 0x91CD, + 0xD6D9: 0x4EF2, + 0xD6DA: 0x4F17, + 0xD6DB: 0x821F, + 0xD6DC: 0x5468, + 0xD6DD: 0x5DDE, + 0xD6DE: 0x6D32, + 0xD6DF: 0x8BCC, + 0xD6E0: 0x7CA5, + 0xD6E1: 0x8F74, + 0xD6E2: 0x8098, + 0xD6E3: 0x5E1A, + 0xD6E4: 0x5492, + 0xD6E5: 0x76B1, + 0xD6E6: 0x5B99, + 0xD6E7: 0x663C, + 0xD6E8: 0x9AA4, + 0xD6E9: 0x73E0, + 0xD6EA: 0x682A, + 0xD6EB: 0x86DB, + 0xD6EC: 0x6731, + 0xD6ED: 0x732A, + 0xD6EE: 0x8BF8, + 0xD6EF: 0x8BDB, + 0xD6F0: 0x9010, + 0xD6F1: 0x7AF9, + 0xD6F2: 0x70DB, + 0xD6F3: 0x716E, + 0xD6F4: 0x62C4, + 0xD6F5: 0x77A9, + 0xD6F6: 0x5631, + 0xD6F7: 0x4E3B, + 0xD6F8: 0x8457, + 0xD6F9: 0x67F1, + 0xD6FA: 0x52A9, + 0xD6FB: 0x86C0, + 0xD6FC: 0x8D2E, + 0xD6FD: 0x94F8, + 0xD6FE: 0x7B51, + 0xD740: 0x8B46, + 0xD741: 0x8B47, + 0xD742: 0x8B48, + 0xD743: 0x8B49, + 0xD744: 0x8B4A, + 0xD745: 0x8B4B, + 0xD746: 0x8B4C, + 0xD747: 0x8B4D, + 0xD748: 0x8B4E, + 0xD749: 0x8B4F, + 0xD74A: 0x8B50, + 0xD74B: 0x8B51, + 0xD74C: 0x8B52, + 0xD74D: 0x8B53, + 0xD74E: 0x8B54, + 0xD74F: 0x8B55, + 0xD750: 0x8B56, + 0xD751: 0x8B57, + 0xD752: 0x8B58, + 0xD753: 0x8B59, + 0xD754: 0x8B5A, + 0xD755: 0x8B5B, + 0xD756: 0x8B5C, + 0xD757: 0x8B5D, + 0xD758: 0x8B5E, + 0xD759: 0x8B5F, + 0xD75A: 0x8B60, + 0xD75B: 0x8B61, + 0xD75C: 0x8B62, + 0xD75D: 0x8B63, + 0xD75E: 0x8B64, + 0xD75F: 0x8B65, + 0xD760: 0x8B67, + 0xD761: 0x8B68, + 0xD762: 0x8B69, + 0xD763: 0x8B6A, + 0xD764: 0x8B6B, + 0xD765: 0x8B6D, + 0xD766: 0x8B6E, + 0xD767: 0x8B6F, + 0xD768: 0x8B70, + 0xD769: 0x8B71, + 0xD76A: 0x8B72, + 0xD76B: 0x8B73, + 0xD76C: 0x8B74, + 0xD76D: 0x8B75, + 0xD76E: 0x8B76, + 0xD76F: 0x8B77, + 0xD770: 0x8B78, + 0xD771: 0x8B79, + 0xD772: 0x8B7A, + 0xD773: 0x8B7B, + 0xD774: 0x8B7C, + 0xD775: 0x8B7D, + 0xD776: 0x8B7E, + 0xD777: 0x8B7F, + 0xD778: 0x8B80, + 0xD779: 0x8B81, + 0xD77A: 0x8B82, + 0xD77B: 0x8B83, + 0xD77C: 0x8B84, + 0xD77D: 0x8B85, + 0xD77E: 0x8B86, + 0xD780: 0x8B87, + 0xD781: 0x8B88, + 0xD782: 0x8B89, + 0xD783: 0x8B8A, + 0xD784: 0x8B8B, + 0xD785: 0x8B8C, + 0xD786: 0x8B8D, + 0xD787: 0x8B8E, + 0xD788: 0x8B8F, + 0xD789: 0x8B90, + 0xD78A: 0x8B91, + 0xD78B: 0x8B92, + 0xD78C: 0x8B93, + 0xD78D: 0x8B94, + 0xD78E: 0x8B95, + 0xD78F: 0x8B96, + 0xD790: 0x8B97, + 0xD791: 0x8B98, + 0xD792: 0x8B99, + 0xD793: 0x8B9A, + 0xD794: 0x8B9B, + 0xD795: 0x8B9C, + 0xD796: 0x8B9D, + 0xD797: 0x8B9E, + 0xD798: 0x8B9F, + 0xD799: 0x8BAC, + 0xD79A: 0x8BB1, + 0xD79B: 0x8BBB, + 0xD79C: 0x8BC7, + 0xD79D: 0x8BD0, + 0xD79E: 0x8BEA, + 0xD79F: 0x8C09, + 0xD7A0: 0x8C1E, + 0xD7A1: 0x4F4F, + 0xD7A2: 0x6CE8, + 0xD7A3: 0x795D, + 0xD7A4: 0x9A7B, + 0xD7A5: 0x6293, + 0xD7A6: 0x722A, + 0xD7A7: 0x62FD, + 0xD7A8: 0x4E13, + 0xD7A9: 0x7816, + 0xD7AA: 0x8F6C, + 0xD7AB: 0x64B0, + 0xD7AC: 0x8D5A, + 0xD7AD: 0x7BC6, + 0xD7AE: 0x6869, + 0xD7AF: 0x5E84, + 0xD7B0: 0x88C5, + 0xD7B1: 0x5986, + 0xD7B2: 0x649E, + 0xD7B3: 0x58EE, + 0xD7B4: 0x72B6, + 0xD7B5: 0x690E, + 0xD7B6: 0x9525, + 0xD7B7: 0x8FFD, + 0xD7B8: 0x8D58, + 0xD7B9: 0x5760, + 0xD7BA: 0x7F00, + 0xD7BB: 0x8C06, + 0xD7BC: 0x51C6, + 0xD7BD: 0x6349, + 0xD7BE: 0x62D9, + 0xD7BF: 0x5353, + 0xD7C0: 0x684C, + 0xD7C1: 0x7422, + 0xD7C2: 0x8301, + 0xD7C3: 0x914C, + 0xD7C4: 0x5544, + 0xD7C5: 0x7740, + 0xD7C6: 0x707C, + 0xD7C7: 0x6D4A, + 0xD7C8: 0x5179, + 0xD7C9: 0x54A8, + 0xD7CA: 0x8D44, + 0xD7CB: 0x59FF, + 0xD7CC: 0x6ECB, + 0xD7CD: 0x6DC4, + 0xD7CE: 0x5B5C, + 0xD7CF: 0x7D2B, + 0xD7D0: 0x4ED4, + 0xD7D1: 0x7C7D, + 0xD7D2: 0x6ED3, + 0xD7D3: 0x5B50, + 0xD7D4: 0x81EA, + 0xD7D5: 0x6E0D, + 0xD7D6: 0x5B57, + 0xD7D7: 0x9B03, + 0xD7D8: 0x68D5, + 0xD7D9: 0x8E2A, + 0xD7DA: 0x5B97, + 0xD7DB: 0x7EFC, + 0xD7DC: 0x603B, + 0xD7DD: 0x7EB5, + 0xD7DE: 0x90B9, + 0xD7DF: 0x8D70, + 0xD7E0: 0x594F, + 0xD7E1: 0x63CD, + 0xD7E2: 0x79DF, + 0xD7E3: 0x8DB3, + 0xD7E4: 0x5352, + 0xD7E5: 0x65CF, + 0xD7E6: 0x7956, + 0xD7E7: 0x8BC5, + 0xD7E8: 0x963B, + 0xD7E9: 0x7EC4, + 0xD7EA: 0x94BB, + 0xD7EB: 0x7E82, + 0xD7EC: 0x5634, + 0xD7ED: 0x9189, + 0xD7EE: 0x6700, + 0xD7EF: 0x7F6A, + 0xD7F0: 0x5C0A, + 0xD7F1: 0x9075, + 0xD7F2: 0x6628, + 0xD7F3: 0x5DE6, + 0xD7F4: 0x4F50, + 0xD7F5: 0x67DE, + 0xD7F6: 0x505A, + 0xD7F7: 0x4F5C, + 0xD7F8: 0x5750, + 0xD7F9: 0x5EA7, + 0xD7FA: 0xE810, + 0xD7FB: 0xE811, + 0xD7FC: 0xE812, + 0xD7FD: 0xE813, + 0xD7FE: 0xE814, + 0xD840: 0x8C38, + 0xD841: 0x8C39, + 0xD842: 0x8C3A, + 0xD843: 0x8C3B, + 0xD844: 0x8C3C, + 0xD845: 0x8C3D, + 0xD846: 0x8C3E, + 0xD847: 0x8C3F, + 0xD848: 0x8C40, + 0xD849: 0x8C42, + 0xD84A: 0x8C43, + 0xD84B: 0x8C44, + 0xD84C: 0x8C45, + 0xD84D: 0x8C48, + 0xD84E: 0x8C4A, + 0xD84F: 0x8C4B, + 0xD850: 0x8C4D, + 0xD851: 0x8C4E, + 0xD852: 0x8C4F, + 0xD853: 0x8C50, + 0xD854: 0x8C51, + 0xD855: 0x8C52, + 0xD856: 0x8C53, + 0xD857: 0x8C54, + 0xD858: 0x8C56, + 0xD859: 0x8C57, + 0xD85A: 0x8C58, + 0xD85B: 0x8C59, + 0xD85C: 0x8C5B, + 0xD85D: 0x8C5C, + 0xD85E: 0x8C5D, + 0xD85F: 0x8C5E, + 0xD860: 0x8C5F, + 0xD861: 0x8C60, + 0xD862: 0x8C63, + 0xD863: 0x8C64, + 0xD864: 0x8C65, + 0xD865: 0x8C66, + 0xD866: 0x8C67, + 0xD867: 0x8C68, + 0xD868: 0x8C69, + 0xD869: 0x8C6C, + 0xD86A: 0x8C6D, + 0xD86B: 0x8C6E, + 0xD86C: 0x8C6F, + 0xD86D: 0x8C70, + 0xD86E: 0x8C71, + 0xD86F: 0x8C72, + 0xD870: 0x8C74, + 0xD871: 0x8C75, + 0xD872: 0x8C76, + 0xD873: 0x8C77, + 0xD874: 0x8C7B, + 0xD875: 0x8C7C, + 0xD876: 0x8C7D, + 0xD877: 0x8C7E, + 0xD878: 0x8C7F, + 0xD879: 0x8C80, + 0xD87A: 0x8C81, + 0xD87B: 0x8C83, + 0xD87C: 0x8C84, + 0xD87D: 0x8C86, + 0xD87E: 0x8C87, + 0xD880: 0x8C88, + 0xD881: 0x8C8B, + 0xD882: 0x8C8D, + 0xD883: 0x8C8E, + 0xD884: 0x8C8F, + 0xD885: 0x8C90, + 0xD886: 0x8C91, + 0xD887: 0x8C92, + 0xD888: 0x8C93, + 0xD889: 0x8C95, + 0xD88A: 0x8C96, + 0xD88B: 0x8C97, + 0xD88C: 0x8C99, + 0xD88D: 0x8C9A, + 0xD88E: 0x8C9B, + 0xD88F: 0x8C9C, + 0xD890: 0x8C9D, + 0xD891: 0x8C9E, + 0xD892: 0x8C9F, + 0xD893: 0x8CA0, + 0xD894: 0x8CA1, + 0xD895: 0x8CA2, + 0xD896: 0x8CA3, + 0xD897: 0x8CA4, + 0xD898: 0x8CA5, + 0xD899: 0x8CA6, + 0xD89A: 0x8CA7, + 0xD89B: 0x8CA8, + 0xD89C: 0x8CA9, + 0xD89D: 0x8CAA, + 0xD89E: 0x8CAB, + 0xD89F: 0x8CAC, + 0xD8A0: 0x8CAD, + 0xD8A1: 0x4E8D, + 0xD8A2: 0x4E0C, + 0xD8A3: 0x5140, + 0xD8A4: 0x4E10, + 0xD8A5: 0x5EFF, + 0xD8A6: 0x5345, + 0xD8A7: 0x4E15, + 0xD8A8: 0x4E98, + 0xD8A9: 0x4E1E, + 0xD8AA: 0x9B32, + 0xD8AB: 0x5B6C, + 0xD8AC: 0x5669, + 0xD8AD: 0x4E28, + 0xD8AE: 0x79BA, + 0xD8AF: 0x4E3F, + 0xD8B0: 0x5315, + 0xD8B1: 0x4E47, + 0xD8B2: 0x592D, + 0xD8B3: 0x723B, + 0xD8B4: 0x536E, + 0xD8B5: 0x6C10, + 0xD8B6: 0x56DF, + 0xD8B7: 0x80E4, + 0xD8B8: 0x9997, + 0xD8B9: 0x6BD3, + 0xD8BA: 0x777E, + 0xD8BB: 0x9F17, + 0xD8BC: 0x4E36, + 0xD8BD: 0x4E9F, + 0xD8BE: 0x9F10, + 0xD8BF: 0x4E5C, + 0xD8C0: 0x4E69, + 0xD8C1: 0x4E93, + 0xD8C2: 0x8288, + 0xD8C3: 0x5B5B, + 0xD8C4: 0x556C, + 0xD8C5: 0x560F, + 0xD8C6: 0x4EC4, + 0xD8C7: 0x538D, + 0xD8C8: 0x539D, + 0xD8C9: 0x53A3, + 0xD8CA: 0x53A5, + 0xD8CB: 0x53AE, + 0xD8CC: 0x9765, + 0xD8CD: 0x8D5D, + 0xD8CE: 0x531A, + 0xD8CF: 0x53F5, + 0xD8D0: 0x5326, + 0xD8D1: 0x532E, + 0xD8D2: 0x533E, + 0xD8D3: 0x8D5C, + 0xD8D4: 0x5366, + 0xD8D5: 0x5363, + 0xD8D6: 0x5202, + 0xD8D7: 0x5208, + 0xD8D8: 0x520E, + 0xD8D9: 0x522D, + 0xD8DA: 0x5233, + 0xD8DB: 0x523F, + 0xD8DC: 0x5240, + 0xD8DD: 0x524C, + 0xD8DE: 0x525E, + 0xD8DF: 0x5261, + 0xD8E0: 0x525C, + 0xD8E1: 0x84AF, + 0xD8E2: 0x527D, + 0xD8E3: 0x5282, + 0xD8E4: 0x5281, + 0xD8E5: 0x5290, + 0xD8E6: 0x5293, + 0xD8E7: 0x5182, + 0xD8E8: 0x7F54, + 0xD8E9: 0x4EBB, + 0xD8EA: 0x4EC3, + 0xD8EB: 0x4EC9, + 0xD8EC: 0x4EC2, + 0xD8ED: 0x4EE8, + 0xD8EE: 0x4EE1, + 0xD8EF: 0x4EEB, + 0xD8F0: 0x4EDE, + 0xD8F1: 0x4F1B, + 0xD8F2: 0x4EF3, + 0xD8F3: 0x4F22, + 0xD8F4: 0x4F64, + 0xD8F5: 0x4EF5, + 0xD8F6: 0x4F25, + 0xD8F7: 0x4F27, + 0xD8F8: 0x4F09, + 0xD8F9: 0x4F2B, + 0xD8FA: 0x4F5E, + 0xD8FB: 0x4F67, + 0xD8FC: 0x6538, + 0xD8FD: 0x4F5A, + 0xD8FE: 0x4F5D, + 0xD940: 0x8CAE, + 0xD941: 0x8CAF, + 0xD942: 0x8CB0, + 0xD943: 0x8CB1, + 0xD944: 0x8CB2, + 0xD945: 0x8CB3, + 0xD946: 0x8CB4, + 0xD947: 0x8CB5, + 0xD948: 0x8CB6, + 0xD949: 0x8CB7, + 0xD94A: 0x8CB8, + 0xD94B: 0x8CB9, + 0xD94C: 0x8CBA, + 0xD94D: 0x8CBB, + 0xD94E: 0x8CBC, + 0xD94F: 0x8CBD, + 0xD950: 0x8CBE, + 0xD951: 0x8CBF, + 0xD952: 0x8CC0, + 0xD953: 0x8CC1, + 0xD954: 0x8CC2, + 0xD955: 0x8CC3, + 0xD956: 0x8CC4, + 0xD957: 0x8CC5, + 0xD958: 0x8CC6, + 0xD959: 0x8CC7, + 0xD95A: 0x8CC8, + 0xD95B: 0x8CC9, + 0xD95C: 0x8CCA, + 0xD95D: 0x8CCB, + 0xD95E: 0x8CCC, + 0xD95F: 0x8CCD, + 0xD960: 0x8CCE, + 0xD961: 0x8CCF, + 0xD962: 0x8CD0, + 0xD963: 0x8CD1, + 0xD964: 0x8CD2, + 0xD965: 0x8CD3, + 0xD966: 0x8CD4, + 0xD967: 0x8CD5, + 0xD968: 0x8CD6, + 0xD969: 0x8CD7, + 0xD96A: 0x8CD8, + 0xD96B: 0x8CD9, + 0xD96C: 0x8CDA, + 0xD96D: 0x8CDB, + 0xD96E: 0x8CDC, + 0xD96F: 0x8CDD, + 0xD970: 0x8CDE, + 0xD971: 0x8CDF, + 0xD972: 0x8CE0, + 0xD973: 0x8CE1, + 0xD974: 0x8CE2, + 0xD975: 0x8CE3, + 0xD976: 0x8CE4, + 0xD977: 0x8CE5, + 0xD978: 0x8CE6, + 0xD979: 0x8CE7, + 0xD97A: 0x8CE8, + 0xD97B: 0x8CE9, + 0xD97C: 0x8CEA, + 0xD97D: 0x8CEB, + 0xD97E: 0x8CEC, + 0xD980: 0x8CED, + 0xD981: 0x8CEE, + 0xD982: 0x8CEF, + 0xD983: 0x8CF0, + 0xD984: 0x8CF1, + 0xD985: 0x8CF2, + 0xD986: 0x8CF3, + 0xD987: 0x8CF4, + 0xD988: 0x8CF5, + 0xD989: 0x8CF6, + 0xD98A: 0x8CF7, + 0xD98B: 0x8CF8, + 0xD98C: 0x8CF9, + 0xD98D: 0x8CFA, + 0xD98E: 0x8CFB, + 0xD98F: 0x8CFC, + 0xD990: 0x8CFD, + 0xD991: 0x8CFE, + 0xD992: 0x8CFF, + 0xD993: 0x8D00, + 0xD994: 0x8D01, + 0xD995: 0x8D02, + 0xD996: 0x8D03, + 0xD997: 0x8D04, + 0xD998: 0x8D05, + 0xD999: 0x8D06, + 0xD99A: 0x8D07, + 0xD99B: 0x8D08, + 0xD99C: 0x8D09, + 0xD99D: 0x8D0A, + 0xD99E: 0x8D0B, + 0xD99F: 0x8D0C, + 0xD9A0: 0x8D0D, + 0xD9A1: 0x4F5F, + 0xD9A2: 0x4F57, + 0xD9A3: 0x4F32, + 0xD9A4: 0x4F3D, + 0xD9A5: 0x4F76, + 0xD9A6: 0x4F74, + 0xD9A7: 0x4F91, + 0xD9A8: 0x4F89, + 0xD9A9: 0x4F83, + 0xD9AA: 0x4F8F, + 0xD9AB: 0x4F7E, + 0xD9AC: 0x4F7B, + 0xD9AD: 0x4FAA, + 0xD9AE: 0x4F7C, + 0xD9AF: 0x4FAC, + 0xD9B0: 0x4F94, + 0xD9B1: 0x4FE6, + 0xD9B2: 0x4FE8, + 0xD9B3: 0x4FEA, + 0xD9B4: 0x4FC5, + 0xD9B5: 0x4FDA, + 0xD9B6: 0x4FE3, + 0xD9B7: 0x4FDC, + 0xD9B8: 0x4FD1, + 0xD9B9: 0x4FDF, + 0xD9BA: 0x4FF8, + 0xD9BB: 0x5029, + 0xD9BC: 0x504C, + 0xD9BD: 0x4FF3, + 0xD9BE: 0x502C, + 0xD9BF: 0x500F, + 0xD9C0: 0x502E, + 0xD9C1: 0x502D, + 0xD9C2: 0x4FFE, + 0xD9C3: 0x501C, + 0xD9C4: 0x500C, + 0xD9C5: 0x5025, + 0xD9C6: 0x5028, + 0xD9C7: 0x507E, + 0xD9C8: 0x5043, + 0xD9C9: 0x5055, + 0xD9CA: 0x5048, + 0xD9CB: 0x504E, + 0xD9CC: 0x506C, + 0xD9CD: 0x507B, + 0xD9CE: 0x50A5, + 0xD9CF: 0x50A7, + 0xD9D0: 0x50A9, + 0xD9D1: 0x50BA, + 0xD9D2: 0x50D6, + 0xD9D3: 0x5106, + 0xD9D4: 0x50ED, + 0xD9D5: 0x50EC, + 0xD9D6: 0x50E6, + 0xD9D7: 0x50EE, + 0xD9D8: 0x5107, + 0xD9D9: 0x510B, + 0xD9DA: 0x4EDD, + 0xD9DB: 0x6C3D, + 0xD9DC: 0x4F58, + 0xD9DD: 0x4F65, + 0xD9DE: 0x4FCE, + 0xD9DF: 0x9FA0, + 0xD9E0: 0x6C46, + 0xD9E1: 0x7C74, + 0xD9E2: 0x516E, + 0xD9E3: 0x5DFD, + 0xD9E4: 0x9EC9, + 0xD9E5: 0x9998, + 0xD9E6: 0x5181, + 0xD9E7: 0x5914, + 0xD9E8: 0x52F9, + 0xD9E9: 0x530D, + 0xD9EA: 0x8A07, + 0xD9EB: 0x5310, + 0xD9EC: 0x51EB, + 0xD9ED: 0x5919, + 0xD9EE: 0x5155, + 0xD9EF: 0x4EA0, + 0xD9F0: 0x5156, + 0xD9F1: 0x4EB3, + 0xD9F2: 0x886E, + 0xD9F3: 0x88A4, + 0xD9F4: 0x4EB5, + 0xD9F5: 0x8114, + 0xD9F6: 0x88D2, + 0xD9F7: 0x7980, + 0xD9F8: 0x5B34, + 0xD9F9: 0x8803, + 0xD9FA: 0x7FB8, + 0xD9FB: 0x51AB, + 0xD9FC: 0x51B1, + 0xD9FD: 0x51BD, + 0xD9FE: 0x51BC, + 0xDA40: 0x8D0E, + 0xDA41: 0x8D0F, + 0xDA42: 0x8D10, + 0xDA43: 0x8D11, + 0xDA44: 0x8D12, + 0xDA45: 0x8D13, + 0xDA46: 0x8D14, + 0xDA47: 0x8D15, + 0xDA48: 0x8D16, + 0xDA49: 0x8D17, + 0xDA4A: 0x8D18, + 0xDA4B: 0x8D19, + 0xDA4C: 0x8D1A, + 0xDA4D: 0x8D1B, + 0xDA4E: 0x8D1C, + 0xDA4F: 0x8D20, + 0xDA50: 0x8D51, + 0xDA51: 0x8D52, + 0xDA52: 0x8D57, + 0xDA53: 0x8D5F, + 0xDA54: 0x8D65, + 0xDA55: 0x8D68, + 0xDA56: 0x8D69, + 0xDA57: 0x8D6A, + 0xDA58: 0x8D6C, + 0xDA59: 0x8D6E, + 0xDA5A: 0x8D6F, + 0xDA5B: 0x8D71, + 0xDA5C: 0x8D72, + 0xDA5D: 0x8D78, + 0xDA5E: 0x8D79, + 0xDA5F: 0x8D7A, + 0xDA60: 0x8D7B, + 0xDA61: 0x8D7C, + 0xDA62: 0x8D7D, + 0xDA63: 0x8D7E, + 0xDA64: 0x8D7F, + 0xDA65: 0x8D80, + 0xDA66: 0x8D82, + 0xDA67: 0x8D83, + 0xDA68: 0x8D86, + 0xDA69: 0x8D87, + 0xDA6A: 0x8D88, + 0xDA6B: 0x8D89, + 0xDA6C: 0x8D8C, + 0xDA6D: 0x8D8D, + 0xDA6E: 0x8D8E, + 0xDA6F: 0x8D8F, + 0xDA70: 0x8D90, + 0xDA71: 0x8D92, + 0xDA72: 0x8D93, + 0xDA73: 0x8D95, + 0xDA74: 0x8D96, + 0xDA75: 0x8D97, + 0xDA76: 0x8D98, + 0xDA77: 0x8D99, + 0xDA78: 0x8D9A, + 0xDA79: 0x8D9B, + 0xDA7A: 0x8D9C, + 0xDA7B: 0x8D9D, + 0xDA7C: 0x8D9E, + 0xDA7D: 0x8DA0, + 0xDA7E: 0x8DA1, + 0xDA80: 0x8DA2, + 0xDA81: 0x8DA4, + 0xDA82: 0x8DA5, + 0xDA83: 0x8DA6, + 0xDA84: 0x8DA7, + 0xDA85: 0x8DA8, + 0xDA86: 0x8DA9, + 0xDA87: 0x8DAA, + 0xDA88: 0x8DAB, + 0xDA89: 0x8DAC, + 0xDA8A: 0x8DAD, + 0xDA8B: 0x8DAE, + 0xDA8C: 0x8DAF, + 0xDA8D: 0x8DB0, + 0xDA8E: 0x8DB2, + 0xDA8F: 0x8DB6, + 0xDA90: 0x8DB7, + 0xDA91: 0x8DB9, + 0xDA92: 0x8DBB, + 0xDA93: 0x8DBD, + 0xDA94: 0x8DC0, + 0xDA95: 0x8DC1, + 0xDA96: 0x8DC2, + 0xDA97: 0x8DC5, + 0xDA98: 0x8DC7, + 0xDA99: 0x8DC8, + 0xDA9A: 0x8DC9, + 0xDA9B: 0x8DCA, + 0xDA9C: 0x8DCD, + 0xDA9D: 0x8DD0, + 0xDA9E: 0x8DD2, + 0xDA9F: 0x8DD3, + 0xDAA0: 0x8DD4, + 0xDAA1: 0x51C7, + 0xDAA2: 0x5196, + 0xDAA3: 0x51A2, + 0xDAA4: 0x51A5, + 0xDAA5: 0x8BA0, + 0xDAA6: 0x8BA6, + 0xDAA7: 0x8BA7, + 0xDAA8: 0x8BAA, + 0xDAA9: 0x8BB4, + 0xDAAA: 0x8BB5, + 0xDAAB: 0x8BB7, + 0xDAAC: 0x8BC2, + 0xDAAD: 0x8BC3, + 0xDAAE: 0x8BCB, + 0xDAAF: 0x8BCF, + 0xDAB0: 0x8BCE, + 0xDAB1: 0x8BD2, + 0xDAB2: 0x8BD3, + 0xDAB3: 0x8BD4, + 0xDAB4: 0x8BD6, + 0xDAB5: 0x8BD8, + 0xDAB6: 0x8BD9, + 0xDAB7: 0x8BDC, + 0xDAB8: 0x8BDF, + 0xDAB9: 0x8BE0, + 0xDABA: 0x8BE4, + 0xDABB: 0x8BE8, + 0xDABC: 0x8BE9, + 0xDABD: 0x8BEE, + 0xDABE: 0x8BF0, + 0xDABF: 0x8BF3, + 0xDAC0: 0x8BF6, + 0xDAC1: 0x8BF9, + 0xDAC2: 0x8BFC, + 0xDAC3: 0x8BFF, + 0xDAC4: 0x8C00, + 0xDAC5: 0x8C02, + 0xDAC6: 0x8C04, + 0xDAC7: 0x8C07, + 0xDAC8: 0x8C0C, + 0xDAC9: 0x8C0F, + 0xDACA: 0x8C11, + 0xDACB: 0x8C12, + 0xDACC: 0x8C14, + 0xDACD: 0x8C15, + 0xDACE: 0x8C16, + 0xDACF: 0x8C19, + 0xDAD0: 0x8C1B, + 0xDAD1: 0x8C18, + 0xDAD2: 0x8C1D, + 0xDAD3: 0x8C1F, + 0xDAD4: 0x8C20, + 0xDAD5: 0x8C21, + 0xDAD6: 0x8C25, + 0xDAD7: 0x8C27, + 0xDAD8: 0x8C2A, + 0xDAD9: 0x8C2B, + 0xDADA: 0x8C2E, + 0xDADB: 0x8C2F, + 0xDADC: 0x8C32, + 0xDADD: 0x8C33, + 0xDADE: 0x8C35, + 0xDADF: 0x8C36, + 0xDAE0: 0x5369, + 0xDAE1: 0x537A, + 0xDAE2: 0x961D, + 0xDAE3: 0x9622, + 0xDAE4: 0x9621, + 0xDAE5: 0x9631, + 0xDAE6: 0x962A, + 0xDAE7: 0x963D, + 0xDAE8: 0x963C, + 0xDAE9: 0x9642, + 0xDAEA: 0x9649, + 0xDAEB: 0x9654, + 0xDAEC: 0x965F, + 0xDAED: 0x9667, + 0xDAEE: 0x966C, + 0xDAEF: 0x9672, + 0xDAF0: 0x9674, + 0xDAF1: 0x9688, + 0xDAF2: 0x968D, + 0xDAF3: 0x9697, + 0xDAF4: 0x96B0, + 0xDAF5: 0x9097, + 0xDAF6: 0x909B, + 0xDAF7: 0x909D, + 0xDAF8: 0x9099, + 0xDAF9: 0x90AC, + 0xDAFA: 0x90A1, + 0xDAFB: 0x90B4, + 0xDAFC: 0x90B3, + 0xDAFD: 0x90B6, + 0xDAFE: 0x90BA, + 0xDB40: 0x8DD5, + 0xDB41: 0x8DD8, + 0xDB42: 0x8DD9, + 0xDB43: 0x8DDC, + 0xDB44: 0x8DE0, + 0xDB45: 0x8DE1, + 0xDB46: 0x8DE2, + 0xDB47: 0x8DE5, + 0xDB48: 0x8DE6, + 0xDB49: 0x8DE7, + 0xDB4A: 0x8DE9, + 0xDB4B: 0x8DED, + 0xDB4C: 0x8DEE, + 0xDB4D: 0x8DF0, + 0xDB4E: 0x8DF1, + 0xDB4F: 0x8DF2, + 0xDB50: 0x8DF4, + 0xDB51: 0x8DF6, + 0xDB52: 0x8DFC, + 0xDB53: 0x8DFE, + 0xDB54: 0x8DFF, + 0xDB55: 0x8E00, + 0xDB56: 0x8E01, + 0xDB57: 0x8E02, + 0xDB58: 0x8E03, + 0xDB59: 0x8E04, + 0xDB5A: 0x8E06, + 0xDB5B: 0x8E07, + 0xDB5C: 0x8E08, + 0xDB5D: 0x8E0B, + 0xDB5E: 0x8E0D, + 0xDB5F: 0x8E0E, + 0xDB60: 0x8E10, + 0xDB61: 0x8E11, + 0xDB62: 0x8E12, + 0xDB63: 0x8E13, + 0xDB64: 0x8E15, + 0xDB65: 0x8E16, + 0xDB66: 0x8E17, + 0xDB67: 0x8E18, + 0xDB68: 0x8E19, + 0xDB69: 0x8E1A, + 0xDB6A: 0x8E1B, + 0xDB6B: 0x8E1C, + 0xDB6C: 0x8E20, + 0xDB6D: 0x8E21, + 0xDB6E: 0x8E24, + 0xDB6F: 0x8E25, + 0xDB70: 0x8E26, + 0xDB71: 0x8E27, + 0xDB72: 0x8E28, + 0xDB73: 0x8E2B, + 0xDB74: 0x8E2D, + 0xDB75: 0x8E30, + 0xDB76: 0x8E32, + 0xDB77: 0x8E33, + 0xDB78: 0x8E34, + 0xDB79: 0x8E36, + 0xDB7A: 0x8E37, + 0xDB7B: 0x8E38, + 0xDB7C: 0x8E3B, + 0xDB7D: 0x8E3C, + 0xDB7E: 0x8E3E, + 0xDB80: 0x8E3F, + 0xDB81: 0x8E43, + 0xDB82: 0x8E45, + 0xDB83: 0x8E46, + 0xDB84: 0x8E4C, + 0xDB85: 0x8E4D, + 0xDB86: 0x8E4E, + 0xDB87: 0x8E4F, + 0xDB88: 0x8E50, + 0xDB89: 0x8E53, + 0xDB8A: 0x8E54, + 0xDB8B: 0x8E55, + 0xDB8C: 0x8E56, + 0xDB8D: 0x8E57, + 0xDB8E: 0x8E58, + 0xDB8F: 0x8E5A, + 0xDB90: 0x8E5B, + 0xDB91: 0x8E5C, + 0xDB92: 0x8E5D, + 0xDB93: 0x8E5E, + 0xDB94: 0x8E5F, + 0xDB95: 0x8E60, + 0xDB96: 0x8E61, + 0xDB97: 0x8E62, + 0xDB98: 0x8E63, + 0xDB99: 0x8E64, + 0xDB9A: 0x8E65, + 0xDB9B: 0x8E67, + 0xDB9C: 0x8E68, + 0xDB9D: 0x8E6A, + 0xDB9E: 0x8E6B, + 0xDB9F: 0x8E6E, + 0xDBA0: 0x8E71, + 0xDBA1: 0x90B8, + 0xDBA2: 0x90B0, + 0xDBA3: 0x90CF, + 0xDBA4: 0x90C5, + 0xDBA5: 0x90BE, + 0xDBA6: 0x90D0, + 0xDBA7: 0x90C4, + 0xDBA8: 0x90C7, + 0xDBA9: 0x90D3, + 0xDBAA: 0x90E6, + 0xDBAB: 0x90E2, + 0xDBAC: 0x90DC, + 0xDBAD: 0x90D7, + 0xDBAE: 0x90DB, + 0xDBAF: 0x90EB, + 0xDBB0: 0x90EF, + 0xDBB1: 0x90FE, + 0xDBB2: 0x9104, + 0xDBB3: 0x9122, + 0xDBB4: 0x911E, + 0xDBB5: 0x9123, + 0xDBB6: 0x9131, + 0xDBB7: 0x912F, + 0xDBB8: 0x9139, + 0xDBB9: 0x9143, + 0xDBBA: 0x9146, + 0xDBBB: 0x520D, + 0xDBBC: 0x5942, + 0xDBBD: 0x52A2, + 0xDBBE: 0x52AC, + 0xDBBF: 0x52AD, + 0xDBC0: 0x52BE, + 0xDBC1: 0x54FF, + 0xDBC2: 0x52D0, + 0xDBC3: 0x52D6, + 0xDBC4: 0x52F0, + 0xDBC5: 0x53DF, + 0xDBC6: 0x71EE, + 0xDBC7: 0x77CD, + 0xDBC8: 0x5EF4, + 0xDBC9: 0x51F5, + 0xDBCA: 0x51FC, + 0xDBCB: 0x9B2F, + 0xDBCC: 0x53B6, + 0xDBCD: 0x5F01, + 0xDBCE: 0x755A, + 0xDBCF: 0x5DEF, + 0xDBD0: 0x574C, + 0xDBD1: 0x57A9, + 0xDBD2: 0x57A1, + 0xDBD3: 0x587E, + 0xDBD4: 0x58BC, + 0xDBD5: 0x58C5, + 0xDBD6: 0x58D1, + 0xDBD7: 0x5729, + 0xDBD8: 0x572C, + 0xDBD9: 0x572A, + 0xDBDA: 0x5733, + 0xDBDB: 0x5739, + 0xDBDC: 0x572E, + 0xDBDD: 0x572F, + 0xDBDE: 0x575C, + 0xDBDF: 0x573B, + 0xDBE0: 0x5742, + 0xDBE1: 0x5769, + 0xDBE2: 0x5785, + 0xDBE3: 0x576B, + 0xDBE4: 0x5786, + 0xDBE5: 0x577C, + 0xDBE6: 0x577B, + 0xDBE7: 0x5768, + 0xDBE8: 0x576D, + 0xDBE9: 0x5776, + 0xDBEA: 0x5773, + 0xDBEB: 0x57AD, + 0xDBEC: 0x57A4, + 0xDBED: 0x578C, + 0xDBEE: 0x57B2, + 0xDBEF: 0x57CF, + 0xDBF0: 0x57A7, + 0xDBF1: 0x57B4, + 0xDBF2: 0x5793, + 0xDBF3: 0x57A0, + 0xDBF4: 0x57D5, + 0xDBF5: 0x57D8, + 0xDBF6: 0x57DA, + 0xDBF7: 0x57D9, + 0xDBF8: 0x57D2, + 0xDBF9: 0x57B8, + 0xDBFA: 0x57F4, + 0xDBFB: 0x57EF, + 0xDBFC: 0x57F8, + 0xDBFD: 0x57E4, + 0xDBFE: 0x57DD, + 0xDC40: 0x8E73, + 0xDC41: 0x8E75, + 0xDC42: 0x8E77, + 0xDC43: 0x8E78, + 0xDC44: 0x8E79, + 0xDC45: 0x8E7A, + 0xDC46: 0x8E7B, + 0xDC47: 0x8E7D, + 0xDC48: 0x8E7E, + 0xDC49: 0x8E80, + 0xDC4A: 0x8E82, + 0xDC4B: 0x8E83, + 0xDC4C: 0x8E84, + 0xDC4D: 0x8E86, + 0xDC4E: 0x8E88, + 0xDC4F: 0x8E89, + 0xDC50: 0x8E8A, + 0xDC51: 0x8E8B, + 0xDC52: 0x8E8C, + 0xDC53: 0x8E8D, + 0xDC54: 0x8E8E, + 0xDC55: 0x8E91, + 0xDC56: 0x8E92, + 0xDC57: 0x8E93, + 0xDC58: 0x8E95, + 0xDC59: 0x8E96, + 0xDC5A: 0x8E97, + 0xDC5B: 0x8E98, + 0xDC5C: 0x8E99, + 0xDC5D: 0x8E9A, + 0xDC5E: 0x8E9B, + 0xDC5F: 0x8E9D, + 0xDC60: 0x8E9F, + 0xDC61: 0x8EA0, + 0xDC62: 0x8EA1, + 0xDC63: 0x8EA2, + 0xDC64: 0x8EA3, + 0xDC65: 0x8EA4, + 0xDC66: 0x8EA5, + 0xDC67: 0x8EA6, + 0xDC68: 0x8EA7, + 0xDC69: 0x8EA8, + 0xDC6A: 0x8EA9, + 0xDC6B: 0x8EAA, + 0xDC6C: 0x8EAD, + 0xDC6D: 0x8EAE, + 0xDC6E: 0x8EB0, + 0xDC6F: 0x8EB1, + 0xDC70: 0x8EB3, + 0xDC71: 0x8EB4, + 0xDC72: 0x8EB5, + 0xDC73: 0x8EB6, + 0xDC74: 0x8EB7, + 0xDC75: 0x8EB8, + 0xDC76: 0x8EB9, + 0xDC77: 0x8EBB, + 0xDC78: 0x8EBC, + 0xDC79: 0x8EBD, + 0xDC7A: 0x8EBE, + 0xDC7B: 0x8EBF, + 0xDC7C: 0x8EC0, + 0xDC7D: 0x8EC1, + 0xDC7E: 0x8EC2, + 0xDC80: 0x8EC3, + 0xDC81: 0x8EC4, + 0xDC82: 0x8EC5, + 0xDC83: 0x8EC6, + 0xDC84: 0x8EC7, + 0xDC85: 0x8EC8, + 0xDC86: 0x8EC9, + 0xDC87: 0x8ECA, + 0xDC88: 0x8ECB, + 0xDC89: 0x8ECC, + 0xDC8A: 0x8ECD, + 0xDC8B: 0x8ECF, + 0xDC8C: 0x8ED0, + 0xDC8D: 0x8ED1, + 0xDC8E: 0x8ED2, + 0xDC8F: 0x8ED3, + 0xDC90: 0x8ED4, + 0xDC91: 0x8ED5, + 0xDC92: 0x8ED6, + 0xDC93: 0x8ED7, + 0xDC94: 0x8ED8, + 0xDC95: 0x8ED9, + 0xDC96: 0x8EDA, + 0xDC97: 0x8EDB, + 0xDC98: 0x8EDC, + 0xDC99: 0x8EDD, + 0xDC9A: 0x8EDE, + 0xDC9B: 0x8EDF, + 0xDC9C: 0x8EE0, + 0xDC9D: 0x8EE1, + 0xDC9E: 0x8EE2, + 0xDC9F: 0x8EE3, + 0xDCA0: 0x8EE4, + 0xDCA1: 0x580B, + 0xDCA2: 0x580D, + 0xDCA3: 0x57FD, + 0xDCA4: 0x57ED, + 0xDCA5: 0x5800, + 0xDCA6: 0x581E, + 0xDCA7: 0x5819, + 0xDCA8: 0x5844, + 0xDCA9: 0x5820, + 0xDCAA: 0x5865, + 0xDCAB: 0x586C, + 0xDCAC: 0x5881, + 0xDCAD: 0x5889, + 0xDCAE: 0x589A, + 0xDCAF: 0x5880, + 0xDCB0: 0x99A8, + 0xDCB1: 0x9F19, + 0xDCB2: 0x61FF, + 0xDCB3: 0x8279, + 0xDCB4: 0x827D, + 0xDCB5: 0x827F, + 0xDCB6: 0x828F, + 0xDCB7: 0x828A, + 0xDCB8: 0x82A8, + 0xDCB9: 0x8284, + 0xDCBA: 0x828E, + 0xDCBB: 0x8291, + 0xDCBC: 0x8297, + 0xDCBD: 0x8299, + 0xDCBE: 0x82AB, + 0xDCBF: 0x82B8, + 0xDCC0: 0x82BE, + 0xDCC1: 0x82B0, + 0xDCC2: 0x82C8, + 0xDCC3: 0x82CA, + 0xDCC4: 0x82E3, + 0xDCC5: 0x8298, + 0xDCC6: 0x82B7, + 0xDCC7: 0x82AE, + 0xDCC8: 0x82CB, + 0xDCC9: 0x82CC, + 0xDCCA: 0x82C1, + 0xDCCB: 0x82A9, + 0xDCCC: 0x82B4, + 0xDCCD: 0x82A1, + 0xDCCE: 0x82AA, + 0xDCCF: 0x829F, + 0xDCD0: 0x82C4, + 0xDCD1: 0x82CE, + 0xDCD2: 0x82A4, + 0xDCD3: 0x82E1, + 0xDCD4: 0x8309, + 0xDCD5: 0x82F7, + 0xDCD6: 0x82E4, + 0xDCD7: 0x830F, + 0xDCD8: 0x8307, + 0xDCD9: 0x82DC, + 0xDCDA: 0x82F4, + 0xDCDB: 0x82D2, + 0xDCDC: 0x82D8, + 0xDCDD: 0x830C, + 0xDCDE: 0x82FB, + 0xDCDF: 0x82D3, + 0xDCE0: 0x8311, + 0xDCE1: 0x831A, + 0xDCE2: 0x8306, + 0xDCE3: 0x8314, + 0xDCE4: 0x8315, + 0xDCE5: 0x82E0, + 0xDCE6: 0x82D5, + 0xDCE7: 0x831C, + 0xDCE8: 0x8351, + 0xDCE9: 0x835B, + 0xDCEA: 0x835C, + 0xDCEB: 0x8308, + 0xDCEC: 0x8392, + 0xDCED: 0x833C, + 0xDCEE: 0x8334, + 0xDCEF: 0x8331, + 0xDCF0: 0x839B, + 0xDCF1: 0x835E, + 0xDCF2: 0x832F, + 0xDCF3: 0x834F, + 0xDCF4: 0x8347, + 0xDCF5: 0x8343, + 0xDCF6: 0x835F, + 0xDCF7: 0x8340, + 0xDCF8: 0x8317, + 0xDCF9: 0x8360, + 0xDCFA: 0x832D, + 0xDCFB: 0x833A, + 0xDCFC: 0x8333, + 0xDCFD: 0x8366, + 0xDCFE: 0x8365, + 0xDD40: 0x8EE5, + 0xDD41: 0x8EE6, + 0xDD42: 0x8EE7, + 0xDD43: 0x8EE8, + 0xDD44: 0x8EE9, + 0xDD45: 0x8EEA, + 0xDD46: 0x8EEB, + 0xDD47: 0x8EEC, + 0xDD48: 0x8EED, + 0xDD49: 0x8EEE, + 0xDD4A: 0x8EEF, + 0xDD4B: 0x8EF0, + 0xDD4C: 0x8EF1, + 0xDD4D: 0x8EF2, + 0xDD4E: 0x8EF3, + 0xDD4F: 0x8EF4, + 0xDD50: 0x8EF5, + 0xDD51: 0x8EF6, + 0xDD52: 0x8EF7, + 0xDD53: 0x8EF8, + 0xDD54: 0x8EF9, + 0xDD55: 0x8EFA, + 0xDD56: 0x8EFB, + 0xDD57: 0x8EFC, + 0xDD58: 0x8EFD, + 0xDD59: 0x8EFE, + 0xDD5A: 0x8EFF, + 0xDD5B: 0x8F00, + 0xDD5C: 0x8F01, + 0xDD5D: 0x8F02, + 0xDD5E: 0x8F03, + 0xDD5F: 0x8F04, + 0xDD60: 0x8F05, + 0xDD61: 0x8F06, + 0xDD62: 0x8F07, + 0xDD63: 0x8F08, + 0xDD64: 0x8F09, + 0xDD65: 0x8F0A, + 0xDD66: 0x8F0B, + 0xDD67: 0x8F0C, + 0xDD68: 0x8F0D, + 0xDD69: 0x8F0E, + 0xDD6A: 0x8F0F, + 0xDD6B: 0x8F10, + 0xDD6C: 0x8F11, + 0xDD6D: 0x8F12, + 0xDD6E: 0x8F13, + 0xDD6F: 0x8F14, + 0xDD70: 0x8F15, + 0xDD71: 0x8F16, + 0xDD72: 0x8F17, + 0xDD73: 0x8F18, + 0xDD74: 0x8F19, + 0xDD75: 0x8F1A, + 0xDD76: 0x8F1B, + 0xDD77: 0x8F1C, + 0xDD78: 0x8F1D, + 0xDD79: 0x8F1E, + 0xDD7A: 0x8F1F, + 0xDD7B: 0x8F20, + 0xDD7C: 0x8F21, + 0xDD7D: 0x8F22, + 0xDD7E: 0x8F23, + 0xDD80: 0x8F24, + 0xDD81: 0x8F25, + 0xDD82: 0x8F26, + 0xDD83: 0x8F27, + 0xDD84: 0x8F28, + 0xDD85: 0x8F29, + 0xDD86: 0x8F2A, + 0xDD87: 0x8F2B, + 0xDD88: 0x8F2C, + 0xDD89: 0x8F2D, + 0xDD8A: 0x8F2E, + 0xDD8B: 0x8F2F, + 0xDD8C: 0x8F30, + 0xDD8D: 0x8F31, + 0xDD8E: 0x8F32, + 0xDD8F: 0x8F33, + 0xDD90: 0x8F34, + 0xDD91: 0x8F35, + 0xDD92: 0x8F36, + 0xDD93: 0x8F37, + 0xDD94: 0x8F38, + 0xDD95: 0x8F39, + 0xDD96: 0x8F3A, + 0xDD97: 0x8F3B, + 0xDD98: 0x8F3C, + 0xDD99: 0x8F3D, + 0xDD9A: 0x8F3E, + 0xDD9B: 0x8F3F, + 0xDD9C: 0x8F40, + 0xDD9D: 0x8F41, + 0xDD9E: 0x8F42, + 0xDD9F: 0x8F43, + 0xDDA0: 0x8F44, + 0xDDA1: 0x8368, + 0xDDA2: 0x831B, + 0xDDA3: 0x8369, + 0xDDA4: 0x836C, + 0xDDA5: 0x836A, + 0xDDA6: 0x836D, + 0xDDA7: 0x836E, + 0xDDA8: 0x83B0, + 0xDDA9: 0x8378, + 0xDDAA: 0x83B3, + 0xDDAB: 0x83B4, + 0xDDAC: 0x83A0, + 0xDDAD: 0x83AA, + 0xDDAE: 0x8393, + 0xDDAF: 0x839C, + 0xDDB0: 0x8385, + 0xDDB1: 0x837C, + 0xDDB2: 0x83B6, + 0xDDB3: 0x83A9, + 0xDDB4: 0x837D, + 0xDDB5: 0x83B8, + 0xDDB6: 0x837B, + 0xDDB7: 0x8398, + 0xDDB8: 0x839E, + 0xDDB9: 0x83A8, + 0xDDBA: 0x83BA, + 0xDDBB: 0x83BC, + 0xDDBC: 0x83C1, + 0xDDBD: 0x8401, + 0xDDBE: 0x83E5, + 0xDDBF: 0x83D8, + 0xDDC0: 0x5807, + 0xDDC1: 0x8418, + 0xDDC2: 0x840B, + 0xDDC3: 0x83DD, + 0xDDC4: 0x83FD, + 0xDDC5: 0x83D6, + 0xDDC6: 0x841C, + 0xDDC7: 0x8438, + 0xDDC8: 0x8411, + 0xDDC9: 0x8406, + 0xDDCA: 0x83D4, + 0xDDCB: 0x83DF, + 0xDDCC: 0x840F, + 0xDDCD: 0x8403, + 0xDDCE: 0x83F8, + 0xDDCF: 0x83F9, + 0xDDD0: 0x83EA, + 0xDDD1: 0x83C5, + 0xDDD2: 0x83C0, + 0xDDD3: 0x8426, + 0xDDD4: 0x83F0, + 0xDDD5: 0x83E1, + 0xDDD6: 0x845C, + 0xDDD7: 0x8451, + 0xDDD8: 0x845A, + 0xDDD9: 0x8459, + 0xDDDA: 0x8473, + 0xDDDB: 0x8487, + 0xDDDC: 0x8488, + 0xDDDD: 0x847A, + 0xDDDE: 0x8489, + 0xDDDF: 0x8478, + 0xDDE0: 0x843C, + 0xDDE1: 0x8446, + 0xDDE2: 0x8469, + 0xDDE3: 0x8476, + 0xDDE4: 0x848C, + 0xDDE5: 0x848E, + 0xDDE6: 0x8431, + 0xDDE7: 0x846D, + 0xDDE8: 0x84C1, + 0xDDE9: 0x84CD, + 0xDDEA: 0x84D0, + 0xDDEB: 0x84E6, + 0xDDEC: 0x84BD, + 0xDDED: 0x84D3, + 0xDDEE: 0x84CA, + 0xDDEF: 0x84BF, + 0xDDF0: 0x84BA, + 0xDDF1: 0x84E0, + 0xDDF2: 0x84A1, + 0xDDF3: 0x84B9, + 0xDDF4: 0x84B4, + 0xDDF5: 0x8497, + 0xDDF6: 0x84E5, + 0xDDF7: 0x84E3, + 0xDDF8: 0x850C, + 0xDDF9: 0x750D, + 0xDDFA: 0x8538, + 0xDDFB: 0x84F0, + 0xDDFC: 0x8539, + 0xDDFD: 0x851F, + 0xDDFE: 0x853A, + 0xDE40: 0x8F45, + 0xDE41: 0x8F46, + 0xDE42: 0x8F47, + 0xDE43: 0x8F48, + 0xDE44: 0x8F49, + 0xDE45: 0x8F4A, + 0xDE46: 0x8F4B, + 0xDE47: 0x8F4C, + 0xDE48: 0x8F4D, + 0xDE49: 0x8F4E, + 0xDE4A: 0x8F4F, + 0xDE4B: 0x8F50, + 0xDE4C: 0x8F51, + 0xDE4D: 0x8F52, + 0xDE4E: 0x8F53, + 0xDE4F: 0x8F54, + 0xDE50: 0x8F55, + 0xDE51: 0x8F56, + 0xDE52: 0x8F57, + 0xDE53: 0x8F58, + 0xDE54: 0x8F59, + 0xDE55: 0x8F5A, + 0xDE56: 0x8F5B, + 0xDE57: 0x8F5C, + 0xDE58: 0x8F5D, + 0xDE59: 0x8F5E, + 0xDE5A: 0x8F5F, + 0xDE5B: 0x8F60, + 0xDE5C: 0x8F61, + 0xDE5D: 0x8F62, + 0xDE5E: 0x8F63, + 0xDE5F: 0x8F64, + 0xDE60: 0x8F65, + 0xDE61: 0x8F6A, + 0xDE62: 0x8F80, + 0xDE63: 0x8F8C, + 0xDE64: 0x8F92, + 0xDE65: 0x8F9D, + 0xDE66: 0x8FA0, + 0xDE67: 0x8FA1, + 0xDE68: 0x8FA2, + 0xDE69: 0x8FA4, + 0xDE6A: 0x8FA5, + 0xDE6B: 0x8FA6, + 0xDE6C: 0x8FA7, + 0xDE6D: 0x8FAA, + 0xDE6E: 0x8FAC, + 0xDE6F: 0x8FAD, + 0xDE70: 0x8FAE, + 0xDE71: 0x8FAF, + 0xDE72: 0x8FB2, + 0xDE73: 0x8FB3, + 0xDE74: 0x8FB4, + 0xDE75: 0x8FB5, + 0xDE76: 0x8FB7, + 0xDE77: 0x8FB8, + 0xDE78: 0x8FBA, + 0xDE79: 0x8FBB, + 0xDE7A: 0x8FBC, + 0xDE7B: 0x8FBF, + 0xDE7C: 0x8FC0, + 0xDE7D: 0x8FC3, + 0xDE7E: 0x8FC6, + 0xDE80: 0x8FC9, + 0xDE81: 0x8FCA, + 0xDE82: 0x8FCB, + 0xDE83: 0x8FCC, + 0xDE84: 0x8FCD, + 0xDE85: 0x8FCF, + 0xDE86: 0x8FD2, + 0xDE87: 0x8FD6, + 0xDE88: 0x8FD7, + 0xDE89: 0x8FDA, + 0xDE8A: 0x8FE0, + 0xDE8B: 0x8FE1, + 0xDE8C: 0x8FE3, + 0xDE8D: 0x8FE7, + 0xDE8E: 0x8FEC, + 0xDE8F: 0x8FEF, + 0xDE90: 0x8FF1, + 0xDE91: 0x8FF2, + 0xDE92: 0x8FF4, + 0xDE93: 0x8FF5, + 0xDE94: 0x8FF6, + 0xDE95: 0x8FFA, + 0xDE96: 0x8FFB, + 0xDE97: 0x8FFC, + 0xDE98: 0x8FFE, + 0xDE99: 0x8FFF, + 0xDE9A: 0x9007, + 0xDE9B: 0x9008, + 0xDE9C: 0x900C, + 0xDE9D: 0x900E, + 0xDE9E: 0x9013, + 0xDE9F: 0x9015, + 0xDEA0: 0x9018, + 0xDEA1: 0x8556, + 0xDEA2: 0x853B, + 0xDEA3: 0x84FF, + 0xDEA4: 0x84FC, + 0xDEA5: 0x8559, + 0xDEA6: 0x8548, + 0xDEA7: 0x8568, + 0xDEA8: 0x8564, + 0xDEA9: 0x855E, + 0xDEAA: 0x857A, + 0xDEAB: 0x77A2, + 0xDEAC: 0x8543, + 0xDEAD: 0x8572, + 0xDEAE: 0x857B, + 0xDEAF: 0x85A4, + 0xDEB0: 0x85A8, + 0xDEB1: 0x8587, + 0xDEB2: 0x858F, + 0xDEB3: 0x8579, + 0xDEB4: 0x85AE, + 0xDEB5: 0x859C, + 0xDEB6: 0x8585, + 0xDEB7: 0x85B9, + 0xDEB8: 0x85B7, + 0xDEB9: 0x85B0, + 0xDEBA: 0x85D3, + 0xDEBB: 0x85C1, + 0xDEBC: 0x85DC, + 0xDEBD: 0x85FF, + 0xDEBE: 0x8627, + 0xDEBF: 0x8605, + 0xDEC0: 0x8629, + 0xDEC1: 0x8616, + 0xDEC2: 0x863C, + 0xDEC3: 0x5EFE, + 0xDEC4: 0x5F08, + 0xDEC5: 0x593C, + 0xDEC6: 0x5941, + 0xDEC7: 0x8037, + 0xDEC8: 0x5955, + 0xDEC9: 0x595A, + 0xDECA: 0x5958, + 0xDECB: 0x530F, + 0xDECC: 0x5C22, + 0xDECD: 0x5C25, + 0xDECE: 0x5C2C, + 0xDECF: 0x5C34, + 0xDED0: 0x624C, + 0xDED1: 0x626A, + 0xDED2: 0x629F, + 0xDED3: 0x62BB, + 0xDED4: 0x62CA, + 0xDED5: 0x62DA, + 0xDED6: 0x62D7, + 0xDED7: 0x62EE, + 0xDED8: 0x6322, + 0xDED9: 0x62F6, + 0xDEDA: 0x6339, + 0xDEDB: 0x634B, + 0xDEDC: 0x6343, + 0xDEDD: 0x63AD, + 0xDEDE: 0x63F6, + 0xDEDF: 0x6371, + 0xDEE0: 0x637A, + 0xDEE1: 0x638E, + 0xDEE2: 0x63B4, + 0xDEE3: 0x636D, + 0xDEE4: 0x63AC, + 0xDEE5: 0x638A, + 0xDEE6: 0x6369, + 0xDEE7: 0x63AE, + 0xDEE8: 0x63BC, + 0xDEE9: 0x63F2, + 0xDEEA: 0x63F8, + 0xDEEB: 0x63E0, + 0xDEEC: 0x63FF, + 0xDEED: 0x63C4, + 0xDEEE: 0x63DE, + 0xDEEF: 0x63CE, + 0xDEF0: 0x6452, + 0xDEF1: 0x63C6, + 0xDEF2: 0x63BE, + 0xDEF3: 0x6445, + 0xDEF4: 0x6441, + 0xDEF5: 0x640B, + 0xDEF6: 0x641B, + 0xDEF7: 0x6420, + 0xDEF8: 0x640C, + 0xDEF9: 0x6426, + 0xDEFA: 0x6421, + 0xDEFB: 0x645E, + 0xDEFC: 0x6484, + 0xDEFD: 0x646D, + 0xDEFE: 0x6496, + 0xDF40: 0x9019, + 0xDF41: 0x901C, + 0xDF42: 0x9023, + 0xDF43: 0x9024, + 0xDF44: 0x9025, + 0xDF45: 0x9027, + 0xDF46: 0x9028, + 0xDF47: 0x9029, + 0xDF48: 0x902A, + 0xDF49: 0x902B, + 0xDF4A: 0x902C, + 0xDF4B: 0x9030, + 0xDF4C: 0x9031, + 0xDF4D: 0x9032, + 0xDF4E: 0x9033, + 0xDF4F: 0x9034, + 0xDF50: 0x9037, + 0xDF51: 0x9039, + 0xDF52: 0x903A, + 0xDF53: 0x903D, + 0xDF54: 0x903F, + 0xDF55: 0x9040, + 0xDF56: 0x9043, + 0xDF57: 0x9045, + 0xDF58: 0x9046, + 0xDF59: 0x9048, + 0xDF5A: 0x9049, + 0xDF5B: 0x904A, + 0xDF5C: 0x904B, + 0xDF5D: 0x904C, + 0xDF5E: 0x904E, + 0xDF5F: 0x9054, + 0xDF60: 0x9055, + 0xDF61: 0x9056, + 0xDF62: 0x9059, + 0xDF63: 0x905A, + 0xDF64: 0x905C, + 0xDF65: 0x905D, + 0xDF66: 0x905E, + 0xDF67: 0x905F, + 0xDF68: 0x9060, + 0xDF69: 0x9061, + 0xDF6A: 0x9064, + 0xDF6B: 0x9066, + 0xDF6C: 0x9067, + 0xDF6D: 0x9069, + 0xDF6E: 0x906A, + 0xDF6F: 0x906B, + 0xDF70: 0x906C, + 0xDF71: 0x906F, + 0xDF72: 0x9070, + 0xDF73: 0x9071, + 0xDF74: 0x9072, + 0xDF75: 0x9073, + 0xDF76: 0x9076, + 0xDF77: 0x9077, + 0xDF78: 0x9078, + 0xDF79: 0x9079, + 0xDF7A: 0x907A, + 0xDF7B: 0x907B, + 0xDF7C: 0x907C, + 0xDF7D: 0x907E, + 0xDF7E: 0x9081, + 0xDF80: 0x9084, + 0xDF81: 0x9085, + 0xDF82: 0x9086, + 0xDF83: 0x9087, + 0xDF84: 0x9089, + 0xDF85: 0x908A, + 0xDF86: 0x908C, + 0xDF87: 0x908D, + 0xDF88: 0x908E, + 0xDF89: 0x908F, + 0xDF8A: 0x9090, + 0xDF8B: 0x9092, + 0xDF8C: 0x9094, + 0xDF8D: 0x9096, + 0xDF8E: 0x9098, + 0xDF8F: 0x909A, + 0xDF90: 0x909C, + 0xDF91: 0x909E, + 0xDF92: 0x909F, + 0xDF93: 0x90A0, + 0xDF94: 0x90A4, + 0xDF95: 0x90A5, + 0xDF96: 0x90A7, + 0xDF97: 0x90A8, + 0xDF98: 0x90A9, + 0xDF99: 0x90AB, + 0xDF9A: 0x90AD, + 0xDF9B: 0x90B2, + 0xDF9C: 0x90B7, + 0xDF9D: 0x90BC, + 0xDF9E: 0x90BD, + 0xDF9F: 0x90BF, + 0xDFA0: 0x90C0, + 0xDFA1: 0x647A, + 0xDFA2: 0x64B7, + 0xDFA3: 0x64B8, + 0xDFA4: 0x6499, + 0xDFA5: 0x64BA, + 0xDFA6: 0x64C0, + 0xDFA7: 0x64D0, + 0xDFA8: 0x64D7, + 0xDFA9: 0x64E4, + 0xDFAA: 0x64E2, + 0xDFAB: 0x6509, + 0xDFAC: 0x6525, + 0xDFAD: 0x652E, + 0xDFAE: 0x5F0B, + 0xDFAF: 0x5FD2, + 0xDFB0: 0x7519, + 0xDFB1: 0x5F11, + 0xDFB2: 0x535F, + 0xDFB3: 0x53F1, + 0xDFB4: 0x53FD, + 0xDFB5: 0x53E9, + 0xDFB6: 0x53E8, + 0xDFB7: 0x53FB, + 0xDFB8: 0x5412, + 0xDFB9: 0x5416, + 0xDFBA: 0x5406, + 0xDFBB: 0x544B, + 0xDFBC: 0x5452, + 0xDFBD: 0x5453, + 0xDFBE: 0x5454, + 0xDFBF: 0x5456, + 0xDFC0: 0x5443, + 0xDFC1: 0x5421, + 0xDFC2: 0x5457, + 0xDFC3: 0x5459, + 0xDFC4: 0x5423, + 0xDFC5: 0x5432, + 0xDFC6: 0x5482, + 0xDFC7: 0x5494, + 0xDFC8: 0x5477, + 0xDFC9: 0x5471, + 0xDFCA: 0x5464, + 0xDFCB: 0x549A, + 0xDFCC: 0x549B, + 0xDFCD: 0x5484, + 0xDFCE: 0x5476, + 0xDFCF: 0x5466, + 0xDFD0: 0x549D, + 0xDFD1: 0x54D0, + 0xDFD2: 0x54AD, + 0xDFD3: 0x54C2, + 0xDFD4: 0x54B4, + 0xDFD5: 0x54D2, + 0xDFD6: 0x54A7, + 0xDFD7: 0x54A6, + 0xDFD8: 0x54D3, + 0xDFD9: 0x54D4, + 0xDFDA: 0x5472, + 0xDFDB: 0x54A3, + 0xDFDC: 0x54D5, + 0xDFDD: 0x54BB, + 0xDFDE: 0x54BF, + 0xDFDF: 0x54CC, + 0xDFE0: 0x54D9, + 0xDFE1: 0x54DA, + 0xDFE2: 0x54DC, + 0xDFE3: 0x54A9, + 0xDFE4: 0x54AA, + 0xDFE5: 0x54A4, + 0xDFE6: 0x54DD, + 0xDFE7: 0x54CF, + 0xDFE8: 0x54DE, + 0xDFE9: 0x551B, + 0xDFEA: 0x54E7, + 0xDFEB: 0x5520, + 0xDFEC: 0x54FD, + 0xDFED: 0x5514, + 0xDFEE: 0x54F3, + 0xDFEF: 0x5522, + 0xDFF0: 0x5523, + 0xDFF1: 0x550F, + 0xDFF2: 0x5511, + 0xDFF3: 0x5527, + 0xDFF4: 0x552A, + 0xDFF5: 0x5567, + 0xDFF6: 0x558F, + 0xDFF7: 0x55B5, + 0xDFF8: 0x5549, + 0xDFF9: 0x556D, + 0xDFFA: 0x5541, + 0xDFFB: 0x5555, + 0xDFFC: 0x553F, + 0xDFFD: 0x5550, + 0xDFFE: 0x553C, + 0xE040: 0x90C2, + 0xE041: 0x90C3, + 0xE042: 0x90C6, + 0xE043: 0x90C8, + 0xE044: 0x90C9, + 0xE045: 0x90CB, + 0xE046: 0x90CC, + 0xE047: 0x90CD, + 0xE048: 0x90D2, + 0xE049: 0x90D4, + 0xE04A: 0x90D5, + 0xE04B: 0x90D6, + 0xE04C: 0x90D8, + 0xE04D: 0x90D9, + 0xE04E: 0x90DA, + 0xE04F: 0x90DE, + 0xE050: 0x90DF, + 0xE051: 0x90E0, + 0xE052: 0x90E3, + 0xE053: 0x90E4, + 0xE054: 0x90E5, + 0xE055: 0x90E9, + 0xE056: 0x90EA, + 0xE057: 0x90EC, + 0xE058: 0x90EE, + 0xE059: 0x90F0, + 0xE05A: 0x90F1, + 0xE05B: 0x90F2, + 0xE05C: 0x90F3, + 0xE05D: 0x90F5, + 0xE05E: 0x90F6, + 0xE05F: 0x90F7, + 0xE060: 0x90F9, + 0xE061: 0x90FA, + 0xE062: 0x90FB, + 0xE063: 0x90FC, + 0xE064: 0x90FF, + 0xE065: 0x9100, + 0xE066: 0x9101, + 0xE067: 0x9103, + 0xE068: 0x9105, + 0xE069: 0x9106, + 0xE06A: 0x9107, + 0xE06B: 0x9108, + 0xE06C: 0x9109, + 0xE06D: 0x910A, + 0xE06E: 0x910B, + 0xE06F: 0x910C, + 0xE070: 0x910D, + 0xE071: 0x910E, + 0xE072: 0x910F, + 0xE073: 0x9110, + 0xE074: 0x9111, + 0xE075: 0x9112, + 0xE076: 0x9113, + 0xE077: 0x9114, + 0xE078: 0x9115, + 0xE079: 0x9116, + 0xE07A: 0x9117, + 0xE07B: 0x9118, + 0xE07C: 0x911A, + 0xE07D: 0x911B, + 0xE07E: 0x911C, + 0xE080: 0x911D, + 0xE081: 0x911F, + 0xE082: 0x9120, + 0xE083: 0x9121, + 0xE084: 0x9124, + 0xE085: 0x9125, + 0xE086: 0x9126, + 0xE087: 0x9127, + 0xE088: 0x9128, + 0xE089: 0x9129, + 0xE08A: 0x912A, + 0xE08B: 0x912B, + 0xE08C: 0x912C, + 0xE08D: 0x912D, + 0xE08E: 0x912E, + 0xE08F: 0x9130, + 0xE090: 0x9132, + 0xE091: 0x9133, + 0xE092: 0x9134, + 0xE093: 0x9135, + 0xE094: 0x9136, + 0xE095: 0x9137, + 0xE096: 0x9138, + 0xE097: 0x913A, + 0xE098: 0x913B, + 0xE099: 0x913C, + 0xE09A: 0x913D, + 0xE09B: 0x913E, + 0xE09C: 0x913F, + 0xE09D: 0x9140, + 0xE09E: 0x9141, + 0xE09F: 0x9142, + 0xE0A0: 0x9144, + 0xE0A1: 0x5537, + 0xE0A2: 0x5556, + 0xE0A3: 0x5575, + 0xE0A4: 0x5576, + 0xE0A5: 0x5577, + 0xE0A6: 0x5533, + 0xE0A7: 0x5530, + 0xE0A8: 0x555C, + 0xE0A9: 0x558B, + 0xE0AA: 0x55D2, + 0xE0AB: 0x5583, + 0xE0AC: 0x55B1, + 0xE0AD: 0x55B9, + 0xE0AE: 0x5588, + 0xE0AF: 0x5581, + 0xE0B0: 0x559F, + 0xE0B1: 0x557E, + 0xE0B2: 0x55D6, + 0xE0B3: 0x5591, + 0xE0B4: 0x557B, + 0xE0B5: 0x55DF, + 0xE0B6: 0x55BD, + 0xE0B7: 0x55BE, + 0xE0B8: 0x5594, + 0xE0B9: 0x5599, + 0xE0BA: 0x55EA, + 0xE0BB: 0x55F7, + 0xE0BC: 0x55C9, + 0xE0BD: 0x561F, + 0xE0BE: 0x55D1, + 0xE0BF: 0x55EB, + 0xE0C0: 0x55EC, + 0xE0C1: 0x55D4, + 0xE0C2: 0x55E6, + 0xE0C3: 0x55DD, + 0xE0C4: 0x55C4, + 0xE0C5: 0x55EF, + 0xE0C6: 0x55E5, + 0xE0C7: 0x55F2, + 0xE0C8: 0x55F3, + 0xE0C9: 0x55CC, + 0xE0CA: 0x55CD, + 0xE0CB: 0x55E8, + 0xE0CC: 0x55F5, + 0xE0CD: 0x55E4, + 0xE0CE: 0x8F94, + 0xE0CF: 0x561E, + 0xE0D0: 0x5608, + 0xE0D1: 0x560C, + 0xE0D2: 0x5601, + 0xE0D3: 0x5624, + 0xE0D4: 0x5623, + 0xE0D5: 0x55FE, + 0xE0D6: 0x5600, + 0xE0D7: 0x5627, + 0xE0D8: 0x562D, + 0xE0D9: 0x5658, + 0xE0DA: 0x5639, + 0xE0DB: 0x5657, + 0xE0DC: 0x562C, + 0xE0DD: 0x564D, + 0xE0DE: 0x5662, + 0xE0DF: 0x5659, + 0xE0E0: 0x565C, + 0xE0E1: 0x564C, + 0xE0E2: 0x5654, + 0xE0E3: 0x5686, + 0xE0E4: 0x5664, + 0xE0E5: 0x5671, + 0xE0E6: 0x566B, + 0xE0E7: 0x567B, + 0xE0E8: 0x567C, + 0xE0E9: 0x5685, + 0xE0EA: 0x5693, + 0xE0EB: 0x56AF, + 0xE0EC: 0x56D4, + 0xE0ED: 0x56D7, + 0xE0EE: 0x56DD, + 0xE0EF: 0x56E1, + 0xE0F0: 0x56F5, + 0xE0F1: 0x56EB, + 0xE0F2: 0x56F9, + 0xE0F3: 0x56FF, + 0xE0F4: 0x5704, + 0xE0F5: 0x570A, + 0xE0F6: 0x5709, + 0xE0F7: 0x571C, + 0xE0F8: 0x5E0F, + 0xE0F9: 0x5E19, + 0xE0FA: 0x5E14, + 0xE0FB: 0x5E11, + 0xE0FC: 0x5E31, + 0xE0FD: 0x5E3B, + 0xE0FE: 0x5E3C, + 0xE140: 0x9145, + 0xE141: 0x9147, + 0xE142: 0x9148, + 0xE143: 0x9151, + 0xE144: 0x9153, + 0xE145: 0x9154, + 0xE146: 0x9155, + 0xE147: 0x9156, + 0xE148: 0x9158, + 0xE149: 0x9159, + 0xE14A: 0x915B, + 0xE14B: 0x915C, + 0xE14C: 0x915F, + 0xE14D: 0x9160, + 0xE14E: 0x9166, + 0xE14F: 0x9167, + 0xE150: 0x9168, + 0xE151: 0x916B, + 0xE152: 0x916D, + 0xE153: 0x9173, + 0xE154: 0x917A, + 0xE155: 0x917B, + 0xE156: 0x917C, + 0xE157: 0x9180, + 0xE158: 0x9181, + 0xE159: 0x9182, + 0xE15A: 0x9183, + 0xE15B: 0x9184, + 0xE15C: 0x9186, + 0xE15D: 0x9188, + 0xE15E: 0x918A, + 0xE15F: 0x918E, + 0xE160: 0x918F, + 0xE161: 0x9193, + 0xE162: 0x9194, + 0xE163: 0x9195, + 0xE164: 0x9196, + 0xE165: 0x9197, + 0xE166: 0x9198, + 0xE167: 0x9199, + 0xE168: 0x919C, + 0xE169: 0x919D, + 0xE16A: 0x919E, + 0xE16B: 0x919F, + 0xE16C: 0x91A0, + 0xE16D: 0x91A1, + 0xE16E: 0x91A4, + 0xE16F: 0x91A5, + 0xE170: 0x91A6, + 0xE171: 0x91A7, + 0xE172: 0x91A8, + 0xE173: 0x91A9, + 0xE174: 0x91AB, + 0xE175: 0x91AC, + 0xE176: 0x91B0, + 0xE177: 0x91B1, + 0xE178: 0x91B2, + 0xE179: 0x91B3, + 0xE17A: 0x91B6, + 0xE17B: 0x91B7, + 0xE17C: 0x91B8, + 0xE17D: 0x91B9, + 0xE17E: 0x91BB, + 0xE180: 0x91BC, + 0xE181: 0x91BD, + 0xE182: 0x91BE, + 0xE183: 0x91BF, + 0xE184: 0x91C0, + 0xE185: 0x91C1, + 0xE186: 0x91C2, + 0xE187: 0x91C3, + 0xE188: 0x91C4, + 0xE189: 0x91C5, + 0xE18A: 0x91C6, + 0xE18B: 0x91C8, + 0xE18C: 0x91CB, + 0xE18D: 0x91D0, + 0xE18E: 0x91D2, + 0xE18F: 0x91D3, + 0xE190: 0x91D4, + 0xE191: 0x91D5, + 0xE192: 0x91D6, + 0xE193: 0x91D7, + 0xE194: 0x91D8, + 0xE195: 0x91D9, + 0xE196: 0x91DA, + 0xE197: 0x91DB, + 0xE198: 0x91DD, + 0xE199: 0x91DE, + 0xE19A: 0x91DF, + 0xE19B: 0x91E0, + 0xE19C: 0x91E1, + 0xE19D: 0x91E2, + 0xE19E: 0x91E3, + 0xE19F: 0x91E4, + 0xE1A0: 0x91E5, + 0xE1A1: 0x5E37, + 0xE1A2: 0x5E44, + 0xE1A3: 0x5E54, + 0xE1A4: 0x5E5B, + 0xE1A5: 0x5E5E, + 0xE1A6: 0x5E61, + 0xE1A7: 0x5C8C, + 0xE1A8: 0x5C7A, + 0xE1A9: 0x5C8D, + 0xE1AA: 0x5C90, + 0xE1AB: 0x5C96, + 0xE1AC: 0x5C88, + 0xE1AD: 0x5C98, + 0xE1AE: 0x5C99, + 0xE1AF: 0x5C91, + 0xE1B0: 0x5C9A, + 0xE1B1: 0x5C9C, + 0xE1B2: 0x5CB5, + 0xE1B3: 0x5CA2, + 0xE1B4: 0x5CBD, + 0xE1B5: 0x5CAC, + 0xE1B6: 0x5CAB, + 0xE1B7: 0x5CB1, + 0xE1B8: 0x5CA3, + 0xE1B9: 0x5CC1, + 0xE1BA: 0x5CB7, + 0xE1BB: 0x5CC4, + 0xE1BC: 0x5CD2, + 0xE1BD: 0x5CE4, + 0xE1BE: 0x5CCB, + 0xE1BF: 0x5CE5, + 0xE1C0: 0x5D02, + 0xE1C1: 0x5D03, + 0xE1C2: 0x5D27, + 0xE1C3: 0x5D26, + 0xE1C4: 0x5D2E, + 0xE1C5: 0x5D24, + 0xE1C6: 0x5D1E, + 0xE1C7: 0x5D06, + 0xE1C8: 0x5D1B, + 0xE1C9: 0x5D58, + 0xE1CA: 0x5D3E, + 0xE1CB: 0x5D34, + 0xE1CC: 0x5D3D, + 0xE1CD: 0x5D6C, + 0xE1CE: 0x5D5B, + 0xE1CF: 0x5D6F, + 0xE1D0: 0x5D5D, + 0xE1D1: 0x5D6B, + 0xE1D2: 0x5D4B, + 0xE1D3: 0x5D4A, + 0xE1D4: 0x5D69, + 0xE1D5: 0x5D74, + 0xE1D6: 0x5D82, + 0xE1D7: 0x5D99, + 0xE1D8: 0x5D9D, + 0xE1D9: 0x8C73, + 0xE1DA: 0x5DB7, + 0xE1DB: 0x5DC5, + 0xE1DC: 0x5F73, + 0xE1DD: 0x5F77, + 0xE1DE: 0x5F82, + 0xE1DF: 0x5F87, + 0xE1E0: 0x5F89, + 0xE1E1: 0x5F8C, + 0xE1E2: 0x5F95, + 0xE1E3: 0x5F99, + 0xE1E4: 0x5F9C, + 0xE1E5: 0x5FA8, + 0xE1E6: 0x5FAD, + 0xE1E7: 0x5FB5, + 0xE1E8: 0x5FBC, + 0xE1E9: 0x8862, + 0xE1EA: 0x5F61, + 0xE1EB: 0x72AD, + 0xE1EC: 0x72B0, + 0xE1ED: 0x72B4, + 0xE1EE: 0x72B7, + 0xE1EF: 0x72B8, + 0xE1F0: 0x72C3, + 0xE1F1: 0x72C1, + 0xE1F2: 0x72CE, + 0xE1F3: 0x72CD, + 0xE1F4: 0x72D2, + 0xE1F5: 0x72E8, + 0xE1F6: 0x72EF, + 0xE1F7: 0x72E9, + 0xE1F8: 0x72F2, + 0xE1F9: 0x72F4, + 0xE1FA: 0x72F7, + 0xE1FB: 0x7301, + 0xE1FC: 0x72F3, + 0xE1FD: 0x7303, + 0xE1FE: 0x72FA, + 0xE240: 0x91E6, + 0xE241: 0x91E7, + 0xE242: 0x91E8, + 0xE243: 0x91E9, + 0xE244: 0x91EA, + 0xE245: 0x91EB, + 0xE246: 0x91EC, + 0xE247: 0x91ED, + 0xE248: 0x91EE, + 0xE249: 0x91EF, + 0xE24A: 0x91F0, + 0xE24B: 0x91F1, + 0xE24C: 0x91F2, + 0xE24D: 0x91F3, + 0xE24E: 0x91F4, + 0xE24F: 0x91F5, + 0xE250: 0x91F6, + 0xE251: 0x91F7, + 0xE252: 0x91F8, + 0xE253: 0x91F9, + 0xE254: 0x91FA, + 0xE255: 0x91FB, + 0xE256: 0x91FC, + 0xE257: 0x91FD, + 0xE258: 0x91FE, + 0xE259: 0x91FF, + 0xE25A: 0x9200, + 0xE25B: 0x9201, + 0xE25C: 0x9202, + 0xE25D: 0x9203, + 0xE25E: 0x9204, + 0xE25F: 0x9205, + 0xE260: 0x9206, + 0xE261: 0x9207, + 0xE262: 0x9208, + 0xE263: 0x9209, + 0xE264: 0x920A, + 0xE265: 0x920B, + 0xE266: 0x920C, + 0xE267: 0x920D, + 0xE268: 0x920E, + 0xE269: 0x920F, + 0xE26A: 0x9210, + 0xE26B: 0x9211, + 0xE26C: 0x9212, + 0xE26D: 0x9213, + 0xE26E: 0x9214, + 0xE26F: 0x9215, + 0xE270: 0x9216, + 0xE271: 0x9217, + 0xE272: 0x9218, + 0xE273: 0x9219, + 0xE274: 0x921A, + 0xE275: 0x921B, + 0xE276: 0x921C, + 0xE277: 0x921D, + 0xE278: 0x921E, + 0xE279: 0x921F, + 0xE27A: 0x9220, + 0xE27B: 0x9221, + 0xE27C: 0x9222, + 0xE27D: 0x9223, + 0xE27E: 0x9224, + 0xE280: 0x9225, + 0xE281: 0x9226, + 0xE282: 0x9227, + 0xE283: 0x9228, + 0xE284: 0x9229, + 0xE285: 0x922A, + 0xE286: 0x922B, + 0xE287: 0x922C, + 0xE288: 0x922D, + 0xE289: 0x922E, + 0xE28A: 0x922F, + 0xE28B: 0x9230, + 0xE28C: 0x9231, + 0xE28D: 0x9232, + 0xE28E: 0x9233, + 0xE28F: 0x9234, + 0xE290: 0x9235, + 0xE291: 0x9236, + 0xE292: 0x9237, + 0xE293: 0x9238, + 0xE294: 0x9239, + 0xE295: 0x923A, + 0xE296: 0x923B, + 0xE297: 0x923C, + 0xE298: 0x923D, + 0xE299: 0x923E, + 0xE29A: 0x923F, + 0xE29B: 0x9240, + 0xE29C: 0x9241, + 0xE29D: 0x9242, + 0xE29E: 0x9243, + 0xE29F: 0x9244, + 0xE2A0: 0x9245, + 0xE2A1: 0x72FB, + 0xE2A2: 0x7317, + 0xE2A3: 0x7313, + 0xE2A4: 0x7321, + 0xE2A5: 0x730A, + 0xE2A6: 0x731E, + 0xE2A7: 0x731D, + 0xE2A8: 0x7315, + 0xE2A9: 0x7322, + 0xE2AA: 0x7339, + 0xE2AB: 0x7325, + 0xE2AC: 0x732C, + 0xE2AD: 0x7338, + 0xE2AE: 0x7331, + 0xE2AF: 0x7350, + 0xE2B0: 0x734D, + 0xE2B1: 0x7357, + 0xE2B2: 0x7360, + 0xE2B3: 0x736C, + 0xE2B4: 0x736F, + 0xE2B5: 0x737E, + 0xE2B6: 0x821B, + 0xE2B7: 0x5925, + 0xE2B8: 0x98E7, + 0xE2B9: 0x5924, + 0xE2BA: 0x5902, + 0xE2BB: 0x9963, + 0xE2BC: 0x9967, + 0xE2BD: 0x9968, + 0xE2BE: 0x9969, + 0xE2BF: 0x996A, + 0xE2C0: 0x996B, + 0xE2C1: 0x996C, + 0xE2C2: 0x9974, + 0xE2C3: 0x9977, + 0xE2C4: 0x997D, + 0xE2C5: 0x9980, + 0xE2C6: 0x9984, + 0xE2C7: 0x9987, + 0xE2C8: 0x998A, + 0xE2C9: 0x998D, + 0xE2CA: 0x9990, + 0xE2CB: 0x9991, + 0xE2CC: 0x9993, + 0xE2CD: 0x9994, + 0xE2CE: 0x9995, + 0xE2CF: 0x5E80, + 0xE2D0: 0x5E91, + 0xE2D1: 0x5E8B, + 0xE2D2: 0x5E96, + 0xE2D3: 0x5EA5, + 0xE2D4: 0x5EA0, + 0xE2D5: 0x5EB9, + 0xE2D6: 0x5EB5, + 0xE2D7: 0x5EBE, + 0xE2D8: 0x5EB3, + 0xE2D9: 0x8D53, + 0xE2DA: 0x5ED2, + 0xE2DB: 0x5ED1, + 0xE2DC: 0x5EDB, + 0xE2DD: 0x5EE8, + 0xE2DE: 0x5EEA, + 0xE2DF: 0x81BA, + 0xE2E0: 0x5FC4, + 0xE2E1: 0x5FC9, + 0xE2E2: 0x5FD6, + 0xE2E3: 0x5FCF, + 0xE2E4: 0x6003, + 0xE2E5: 0x5FEE, + 0xE2E6: 0x6004, + 0xE2E7: 0x5FE1, + 0xE2E8: 0x5FE4, + 0xE2E9: 0x5FFE, + 0xE2EA: 0x6005, + 0xE2EB: 0x6006, + 0xE2EC: 0x5FEA, + 0xE2ED: 0x5FED, + 0xE2EE: 0x5FF8, + 0xE2EF: 0x6019, + 0xE2F0: 0x6035, + 0xE2F1: 0x6026, + 0xE2F2: 0x601B, + 0xE2F3: 0x600F, + 0xE2F4: 0x600D, + 0xE2F5: 0x6029, + 0xE2F6: 0x602B, + 0xE2F7: 0x600A, + 0xE2F8: 0x603F, + 0xE2F9: 0x6021, + 0xE2FA: 0x6078, + 0xE2FB: 0x6079, + 0xE2FC: 0x607B, + 0xE2FD: 0x607A, + 0xE2FE: 0x6042, + 0xE340: 0x9246, + 0xE341: 0x9247, + 0xE342: 0x9248, + 0xE343: 0x9249, + 0xE344: 0x924A, + 0xE345: 0x924B, + 0xE346: 0x924C, + 0xE347: 0x924D, + 0xE348: 0x924E, + 0xE349: 0x924F, + 0xE34A: 0x9250, + 0xE34B: 0x9251, + 0xE34C: 0x9252, + 0xE34D: 0x9253, + 0xE34E: 0x9254, + 0xE34F: 0x9255, + 0xE350: 0x9256, + 0xE351: 0x9257, + 0xE352: 0x9258, + 0xE353: 0x9259, + 0xE354: 0x925A, + 0xE355: 0x925B, + 0xE356: 0x925C, + 0xE357: 0x925D, + 0xE358: 0x925E, + 0xE359: 0x925F, + 0xE35A: 0x9260, + 0xE35B: 0x9261, + 0xE35C: 0x9262, + 0xE35D: 0x9263, + 0xE35E: 0x9264, + 0xE35F: 0x9265, + 0xE360: 0x9266, + 0xE361: 0x9267, + 0xE362: 0x9268, + 0xE363: 0x9269, + 0xE364: 0x926A, + 0xE365: 0x926B, + 0xE366: 0x926C, + 0xE367: 0x926D, + 0xE368: 0x926E, + 0xE369: 0x926F, + 0xE36A: 0x9270, + 0xE36B: 0x9271, + 0xE36C: 0x9272, + 0xE36D: 0x9273, + 0xE36E: 0x9275, + 0xE36F: 0x9276, + 0xE370: 0x9277, + 0xE371: 0x9278, + 0xE372: 0x9279, + 0xE373: 0x927A, + 0xE374: 0x927B, + 0xE375: 0x927C, + 0xE376: 0x927D, + 0xE377: 0x927E, + 0xE378: 0x927F, + 0xE379: 0x9280, + 0xE37A: 0x9281, + 0xE37B: 0x9282, + 0xE37C: 0x9283, + 0xE37D: 0x9284, + 0xE37E: 0x9285, + 0xE380: 0x9286, + 0xE381: 0x9287, + 0xE382: 0x9288, + 0xE383: 0x9289, + 0xE384: 0x928A, + 0xE385: 0x928B, + 0xE386: 0x928C, + 0xE387: 0x928D, + 0xE388: 0x928F, + 0xE389: 0x9290, + 0xE38A: 0x9291, + 0xE38B: 0x9292, + 0xE38C: 0x9293, + 0xE38D: 0x9294, + 0xE38E: 0x9295, + 0xE38F: 0x9296, + 0xE390: 0x9297, + 0xE391: 0x9298, + 0xE392: 0x9299, + 0xE393: 0x929A, + 0xE394: 0x929B, + 0xE395: 0x929C, + 0xE396: 0x929D, + 0xE397: 0x929E, + 0xE398: 0x929F, + 0xE399: 0x92A0, + 0xE39A: 0x92A1, + 0xE39B: 0x92A2, + 0xE39C: 0x92A3, + 0xE39D: 0x92A4, + 0xE39E: 0x92A5, + 0xE39F: 0x92A6, + 0xE3A0: 0x92A7, + 0xE3A1: 0x606A, + 0xE3A2: 0x607D, + 0xE3A3: 0x6096, + 0xE3A4: 0x609A, + 0xE3A5: 0x60AD, + 0xE3A6: 0x609D, + 0xE3A7: 0x6083, + 0xE3A8: 0x6092, + 0xE3A9: 0x608C, + 0xE3AA: 0x609B, + 0xE3AB: 0x60EC, + 0xE3AC: 0x60BB, + 0xE3AD: 0x60B1, + 0xE3AE: 0x60DD, + 0xE3AF: 0x60D8, + 0xE3B0: 0x60C6, + 0xE3B1: 0x60DA, + 0xE3B2: 0x60B4, + 0xE3B3: 0x6120, + 0xE3B4: 0x6126, + 0xE3B5: 0x6115, + 0xE3B6: 0x6123, + 0xE3B7: 0x60F4, + 0xE3B8: 0x6100, + 0xE3B9: 0x610E, + 0xE3BA: 0x612B, + 0xE3BB: 0x614A, + 0xE3BC: 0x6175, + 0xE3BD: 0x61AC, + 0xE3BE: 0x6194, + 0xE3BF: 0x61A7, + 0xE3C0: 0x61B7, + 0xE3C1: 0x61D4, + 0xE3C2: 0x61F5, + 0xE3C3: 0x5FDD, + 0xE3C4: 0x96B3, + 0xE3C5: 0x95E9, + 0xE3C6: 0x95EB, + 0xE3C7: 0x95F1, + 0xE3C8: 0x95F3, + 0xE3C9: 0x95F5, + 0xE3CA: 0x95F6, + 0xE3CB: 0x95FC, + 0xE3CC: 0x95FE, + 0xE3CD: 0x9603, + 0xE3CE: 0x9604, + 0xE3CF: 0x9606, + 0xE3D0: 0x9608, + 0xE3D1: 0x960A, + 0xE3D2: 0x960B, + 0xE3D3: 0x960C, + 0xE3D4: 0x960D, + 0xE3D5: 0x960F, + 0xE3D6: 0x9612, + 0xE3D7: 0x9615, + 0xE3D8: 0x9616, + 0xE3D9: 0x9617, + 0xE3DA: 0x9619, + 0xE3DB: 0x961A, + 0xE3DC: 0x4E2C, + 0xE3DD: 0x723F, + 0xE3DE: 0x6215, + 0xE3DF: 0x6C35, + 0xE3E0: 0x6C54, + 0xE3E1: 0x6C5C, + 0xE3E2: 0x6C4A, + 0xE3E3: 0x6CA3, + 0xE3E4: 0x6C85, + 0xE3E5: 0x6C90, + 0xE3E6: 0x6C94, + 0xE3E7: 0x6C8C, + 0xE3E8: 0x6C68, + 0xE3E9: 0x6C69, + 0xE3EA: 0x6C74, + 0xE3EB: 0x6C76, + 0xE3EC: 0x6C86, + 0xE3ED: 0x6CA9, + 0xE3EE: 0x6CD0, + 0xE3EF: 0x6CD4, + 0xE3F0: 0x6CAD, + 0xE3F1: 0x6CF7, + 0xE3F2: 0x6CF8, + 0xE3F3: 0x6CF1, + 0xE3F4: 0x6CD7, + 0xE3F5: 0x6CB2, + 0xE3F6: 0x6CE0, + 0xE3F7: 0x6CD6, + 0xE3F8: 0x6CFA, + 0xE3F9: 0x6CEB, + 0xE3FA: 0x6CEE, + 0xE3FB: 0x6CB1, + 0xE3FC: 0x6CD3, + 0xE3FD: 0x6CEF, + 0xE3FE: 0x6CFE, + 0xE440: 0x92A8, + 0xE441: 0x92A9, + 0xE442: 0x92AA, + 0xE443: 0x92AB, + 0xE444: 0x92AC, + 0xE445: 0x92AD, + 0xE446: 0x92AF, + 0xE447: 0x92B0, + 0xE448: 0x92B1, + 0xE449: 0x92B2, + 0xE44A: 0x92B3, + 0xE44B: 0x92B4, + 0xE44C: 0x92B5, + 0xE44D: 0x92B6, + 0xE44E: 0x92B7, + 0xE44F: 0x92B8, + 0xE450: 0x92B9, + 0xE451: 0x92BA, + 0xE452: 0x92BB, + 0xE453: 0x92BC, + 0xE454: 0x92BD, + 0xE455: 0x92BE, + 0xE456: 0x92BF, + 0xE457: 0x92C0, + 0xE458: 0x92C1, + 0xE459: 0x92C2, + 0xE45A: 0x92C3, + 0xE45B: 0x92C4, + 0xE45C: 0x92C5, + 0xE45D: 0x92C6, + 0xE45E: 0x92C7, + 0xE45F: 0x92C9, + 0xE460: 0x92CA, + 0xE461: 0x92CB, + 0xE462: 0x92CC, + 0xE463: 0x92CD, + 0xE464: 0x92CE, + 0xE465: 0x92CF, + 0xE466: 0x92D0, + 0xE467: 0x92D1, + 0xE468: 0x92D2, + 0xE469: 0x92D3, + 0xE46A: 0x92D4, + 0xE46B: 0x92D5, + 0xE46C: 0x92D6, + 0xE46D: 0x92D7, + 0xE46E: 0x92D8, + 0xE46F: 0x92D9, + 0xE470: 0x92DA, + 0xE471: 0x92DB, + 0xE472: 0x92DC, + 0xE473: 0x92DD, + 0xE474: 0x92DE, + 0xE475: 0x92DF, + 0xE476: 0x92E0, + 0xE477: 0x92E1, + 0xE478: 0x92E2, + 0xE479: 0x92E3, + 0xE47A: 0x92E4, + 0xE47B: 0x92E5, + 0xE47C: 0x92E6, + 0xE47D: 0x92E7, + 0xE47E: 0x92E8, + 0xE480: 0x92E9, + 0xE481: 0x92EA, + 0xE482: 0x92EB, + 0xE483: 0x92EC, + 0xE484: 0x92ED, + 0xE485: 0x92EE, + 0xE486: 0x92EF, + 0xE487: 0x92F0, + 0xE488: 0x92F1, + 0xE489: 0x92F2, + 0xE48A: 0x92F3, + 0xE48B: 0x92F4, + 0xE48C: 0x92F5, + 0xE48D: 0x92F6, + 0xE48E: 0x92F7, + 0xE48F: 0x92F8, + 0xE490: 0x92F9, + 0xE491: 0x92FA, + 0xE492: 0x92FB, + 0xE493: 0x92FC, + 0xE494: 0x92FD, + 0xE495: 0x92FE, + 0xE496: 0x92FF, + 0xE497: 0x9300, + 0xE498: 0x9301, + 0xE499: 0x9302, + 0xE49A: 0x9303, + 0xE49B: 0x9304, + 0xE49C: 0x9305, + 0xE49D: 0x9306, + 0xE49E: 0x9307, + 0xE49F: 0x9308, + 0xE4A0: 0x9309, + 0xE4A1: 0x6D39, + 0xE4A2: 0x6D27, + 0xE4A3: 0x6D0C, + 0xE4A4: 0x6D43, + 0xE4A5: 0x6D48, + 0xE4A6: 0x6D07, + 0xE4A7: 0x6D04, + 0xE4A8: 0x6D19, + 0xE4A9: 0x6D0E, + 0xE4AA: 0x6D2B, + 0xE4AB: 0x6D4D, + 0xE4AC: 0x6D2E, + 0xE4AD: 0x6D35, + 0xE4AE: 0x6D1A, + 0xE4AF: 0x6D4F, + 0xE4B0: 0x6D52, + 0xE4B1: 0x6D54, + 0xE4B2: 0x6D33, + 0xE4B3: 0x6D91, + 0xE4B4: 0x6D6F, + 0xE4B5: 0x6D9E, + 0xE4B6: 0x6DA0, + 0xE4B7: 0x6D5E, + 0xE4B8: 0x6D93, + 0xE4B9: 0x6D94, + 0xE4BA: 0x6D5C, + 0xE4BB: 0x6D60, + 0xE4BC: 0x6D7C, + 0xE4BD: 0x6D63, + 0xE4BE: 0x6E1A, + 0xE4BF: 0x6DC7, + 0xE4C0: 0x6DC5, + 0xE4C1: 0x6DDE, + 0xE4C2: 0x6E0E, + 0xE4C3: 0x6DBF, + 0xE4C4: 0x6DE0, + 0xE4C5: 0x6E11, + 0xE4C6: 0x6DE6, + 0xE4C7: 0x6DDD, + 0xE4C8: 0x6DD9, + 0xE4C9: 0x6E16, + 0xE4CA: 0x6DAB, + 0xE4CB: 0x6E0C, + 0xE4CC: 0x6DAE, + 0xE4CD: 0x6E2B, + 0xE4CE: 0x6E6E, + 0xE4CF: 0x6E4E, + 0xE4D0: 0x6E6B, + 0xE4D1: 0x6EB2, + 0xE4D2: 0x6E5F, + 0xE4D3: 0x6E86, + 0xE4D4: 0x6E53, + 0xE4D5: 0x6E54, + 0xE4D6: 0x6E32, + 0xE4D7: 0x6E25, + 0xE4D8: 0x6E44, + 0xE4D9: 0x6EDF, + 0xE4DA: 0x6EB1, + 0xE4DB: 0x6E98, + 0xE4DC: 0x6EE0, + 0xE4DD: 0x6F2D, + 0xE4DE: 0x6EE2, + 0xE4DF: 0x6EA5, + 0xE4E0: 0x6EA7, + 0xE4E1: 0x6EBD, + 0xE4E2: 0x6EBB, + 0xE4E3: 0x6EB7, + 0xE4E4: 0x6ED7, + 0xE4E5: 0x6EB4, + 0xE4E6: 0x6ECF, + 0xE4E7: 0x6E8F, + 0xE4E8: 0x6EC2, + 0xE4E9: 0x6E9F, + 0xE4EA: 0x6F62, + 0xE4EB: 0x6F46, + 0xE4EC: 0x6F47, + 0xE4ED: 0x6F24, + 0xE4EE: 0x6F15, + 0xE4EF: 0x6EF9, + 0xE4F0: 0x6F2F, + 0xE4F1: 0x6F36, + 0xE4F2: 0x6F4B, + 0xE4F3: 0x6F74, + 0xE4F4: 0x6F2A, + 0xE4F5: 0x6F09, + 0xE4F6: 0x6F29, + 0xE4F7: 0x6F89, + 0xE4F8: 0x6F8D, + 0xE4F9: 0x6F8C, + 0xE4FA: 0x6F78, + 0xE4FB: 0x6F72, + 0xE4FC: 0x6F7C, + 0xE4FD: 0x6F7A, + 0xE4FE: 0x6FD1, + 0xE540: 0x930A, + 0xE541: 0x930B, + 0xE542: 0x930C, + 0xE543: 0x930D, + 0xE544: 0x930E, + 0xE545: 0x930F, + 0xE546: 0x9310, + 0xE547: 0x9311, + 0xE548: 0x9312, + 0xE549: 0x9313, + 0xE54A: 0x9314, + 0xE54B: 0x9315, + 0xE54C: 0x9316, + 0xE54D: 0x9317, + 0xE54E: 0x9318, + 0xE54F: 0x9319, + 0xE550: 0x931A, + 0xE551: 0x931B, + 0xE552: 0x931C, + 0xE553: 0x931D, + 0xE554: 0x931E, + 0xE555: 0x931F, + 0xE556: 0x9320, + 0xE557: 0x9321, + 0xE558: 0x9322, + 0xE559: 0x9323, + 0xE55A: 0x9324, + 0xE55B: 0x9325, + 0xE55C: 0x9326, + 0xE55D: 0x9327, + 0xE55E: 0x9328, + 0xE55F: 0x9329, + 0xE560: 0x932A, + 0xE561: 0x932B, + 0xE562: 0x932C, + 0xE563: 0x932D, + 0xE564: 0x932E, + 0xE565: 0x932F, + 0xE566: 0x9330, + 0xE567: 0x9331, + 0xE568: 0x9332, + 0xE569: 0x9333, + 0xE56A: 0x9334, + 0xE56B: 0x9335, + 0xE56C: 0x9336, + 0xE56D: 0x9337, + 0xE56E: 0x9338, + 0xE56F: 0x9339, + 0xE570: 0x933A, + 0xE571: 0x933B, + 0xE572: 0x933C, + 0xE573: 0x933D, + 0xE574: 0x933F, + 0xE575: 0x9340, + 0xE576: 0x9341, + 0xE577: 0x9342, + 0xE578: 0x9343, + 0xE579: 0x9344, + 0xE57A: 0x9345, + 0xE57B: 0x9346, + 0xE57C: 0x9347, + 0xE57D: 0x9348, + 0xE57E: 0x9349, + 0xE580: 0x934A, + 0xE581: 0x934B, + 0xE582: 0x934C, + 0xE583: 0x934D, + 0xE584: 0x934E, + 0xE585: 0x934F, + 0xE586: 0x9350, + 0xE587: 0x9351, + 0xE588: 0x9352, + 0xE589: 0x9353, + 0xE58A: 0x9354, + 0xE58B: 0x9355, + 0xE58C: 0x9356, + 0xE58D: 0x9357, + 0xE58E: 0x9358, + 0xE58F: 0x9359, + 0xE590: 0x935A, + 0xE591: 0x935B, + 0xE592: 0x935C, + 0xE593: 0x935D, + 0xE594: 0x935E, + 0xE595: 0x935F, + 0xE596: 0x9360, + 0xE597: 0x9361, + 0xE598: 0x9362, + 0xE599: 0x9363, + 0xE59A: 0x9364, + 0xE59B: 0x9365, + 0xE59C: 0x9366, + 0xE59D: 0x9367, + 0xE59E: 0x9368, + 0xE59F: 0x9369, + 0xE5A0: 0x936B, + 0xE5A1: 0x6FC9, + 0xE5A2: 0x6FA7, + 0xE5A3: 0x6FB9, + 0xE5A4: 0x6FB6, + 0xE5A5: 0x6FC2, + 0xE5A6: 0x6FE1, + 0xE5A7: 0x6FEE, + 0xE5A8: 0x6FDE, + 0xE5A9: 0x6FE0, + 0xE5AA: 0x6FEF, + 0xE5AB: 0x701A, + 0xE5AC: 0x7023, + 0xE5AD: 0x701B, + 0xE5AE: 0x7039, + 0xE5AF: 0x7035, + 0xE5B0: 0x704F, + 0xE5B1: 0x705E, + 0xE5B2: 0x5B80, + 0xE5B3: 0x5B84, + 0xE5B4: 0x5B95, + 0xE5B5: 0x5B93, + 0xE5B6: 0x5BA5, + 0xE5B7: 0x5BB8, + 0xE5B8: 0x752F, + 0xE5B9: 0x9A9E, + 0xE5BA: 0x6434, + 0xE5BB: 0x5BE4, + 0xE5BC: 0x5BEE, + 0xE5BD: 0x8930, + 0xE5BE: 0x5BF0, + 0xE5BF: 0x8E47, + 0xE5C0: 0x8B07, + 0xE5C1: 0x8FB6, + 0xE5C2: 0x8FD3, + 0xE5C3: 0x8FD5, + 0xE5C4: 0x8FE5, + 0xE5C5: 0x8FEE, + 0xE5C6: 0x8FE4, + 0xE5C7: 0x8FE9, + 0xE5C8: 0x8FE6, + 0xE5C9: 0x8FF3, + 0xE5CA: 0x8FE8, + 0xE5CB: 0x9005, + 0xE5CC: 0x9004, + 0xE5CD: 0x900B, + 0xE5CE: 0x9026, + 0xE5CF: 0x9011, + 0xE5D0: 0x900D, + 0xE5D1: 0x9016, + 0xE5D2: 0x9021, + 0xE5D3: 0x9035, + 0xE5D4: 0x9036, + 0xE5D5: 0x902D, + 0xE5D6: 0x902F, + 0xE5D7: 0x9044, + 0xE5D8: 0x9051, + 0xE5D9: 0x9052, + 0xE5DA: 0x9050, + 0xE5DB: 0x9068, + 0xE5DC: 0x9058, + 0xE5DD: 0x9062, + 0xE5DE: 0x905B, + 0xE5DF: 0x66B9, + 0xE5E0: 0x9074, + 0xE5E1: 0x907D, + 0xE5E2: 0x9082, + 0xE5E3: 0x9088, + 0xE5E4: 0x9083, + 0xE5E5: 0x908B, + 0xE5E6: 0x5F50, + 0xE5E7: 0x5F57, + 0xE5E8: 0x5F56, + 0xE5E9: 0x5F58, + 0xE5EA: 0x5C3B, + 0xE5EB: 0x54AB, + 0xE5EC: 0x5C50, + 0xE5ED: 0x5C59, + 0xE5EE: 0x5B71, + 0xE5EF: 0x5C63, + 0xE5F0: 0x5C66, + 0xE5F1: 0x7FBC, + 0xE5F2: 0x5F2A, + 0xE5F3: 0x5F29, + 0xE5F4: 0x5F2D, + 0xE5F5: 0x8274, + 0xE5F6: 0x5F3C, + 0xE5F7: 0x9B3B, + 0xE5F8: 0x5C6E, + 0xE5F9: 0x5981, + 0xE5FA: 0x5983, + 0xE5FB: 0x598D, + 0xE5FC: 0x59A9, + 0xE5FD: 0x59AA, + 0xE5FE: 0x59A3, + 0xE640: 0x936C, + 0xE641: 0x936D, + 0xE642: 0x936E, + 0xE643: 0x936F, + 0xE644: 0x9370, + 0xE645: 0x9371, + 0xE646: 0x9372, + 0xE647: 0x9373, + 0xE648: 0x9374, + 0xE649: 0x9375, + 0xE64A: 0x9376, + 0xE64B: 0x9377, + 0xE64C: 0x9378, + 0xE64D: 0x9379, + 0xE64E: 0x937A, + 0xE64F: 0x937B, + 0xE650: 0x937C, + 0xE651: 0x937D, + 0xE652: 0x937E, + 0xE653: 0x937F, + 0xE654: 0x9380, + 0xE655: 0x9381, + 0xE656: 0x9382, + 0xE657: 0x9383, + 0xE658: 0x9384, + 0xE659: 0x9385, + 0xE65A: 0x9386, + 0xE65B: 0x9387, + 0xE65C: 0x9388, + 0xE65D: 0x9389, + 0xE65E: 0x938A, + 0xE65F: 0x938B, + 0xE660: 0x938C, + 0xE661: 0x938D, + 0xE662: 0x938E, + 0xE663: 0x9390, + 0xE664: 0x9391, + 0xE665: 0x9392, + 0xE666: 0x9393, + 0xE667: 0x9394, + 0xE668: 0x9395, + 0xE669: 0x9396, + 0xE66A: 0x9397, + 0xE66B: 0x9398, + 0xE66C: 0x9399, + 0xE66D: 0x939A, + 0xE66E: 0x939B, + 0xE66F: 0x939C, + 0xE670: 0x939D, + 0xE671: 0x939E, + 0xE672: 0x939F, + 0xE673: 0x93A0, + 0xE674: 0x93A1, + 0xE675: 0x93A2, + 0xE676: 0x93A3, + 0xE677: 0x93A4, + 0xE678: 0x93A5, + 0xE679: 0x93A6, + 0xE67A: 0x93A7, + 0xE67B: 0x93A8, + 0xE67C: 0x93A9, + 0xE67D: 0x93AA, + 0xE67E: 0x93AB, + 0xE680: 0x93AC, + 0xE681: 0x93AD, + 0xE682: 0x93AE, + 0xE683: 0x93AF, + 0xE684: 0x93B0, + 0xE685: 0x93B1, + 0xE686: 0x93B2, + 0xE687: 0x93B3, + 0xE688: 0x93B4, + 0xE689: 0x93B5, + 0xE68A: 0x93B6, + 0xE68B: 0x93B7, + 0xE68C: 0x93B8, + 0xE68D: 0x93B9, + 0xE68E: 0x93BA, + 0xE68F: 0x93BB, + 0xE690: 0x93BC, + 0xE691: 0x93BD, + 0xE692: 0x93BE, + 0xE693: 0x93BF, + 0xE694: 0x93C0, + 0xE695: 0x93C1, + 0xE696: 0x93C2, + 0xE697: 0x93C3, + 0xE698: 0x93C4, + 0xE699: 0x93C5, + 0xE69A: 0x93C6, + 0xE69B: 0x93C7, + 0xE69C: 0x93C8, + 0xE69D: 0x93C9, + 0xE69E: 0x93CB, + 0xE69F: 0x93CC, + 0xE6A0: 0x93CD, + 0xE6A1: 0x5997, + 0xE6A2: 0x59CA, + 0xE6A3: 0x59AB, + 0xE6A4: 0x599E, + 0xE6A5: 0x59A4, + 0xE6A6: 0x59D2, + 0xE6A7: 0x59B2, + 0xE6A8: 0x59AF, + 0xE6A9: 0x59D7, + 0xE6AA: 0x59BE, + 0xE6AB: 0x5A05, + 0xE6AC: 0x5A06, + 0xE6AD: 0x59DD, + 0xE6AE: 0x5A08, + 0xE6AF: 0x59E3, + 0xE6B0: 0x59D8, + 0xE6B1: 0x59F9, + 0xE6B2: 0x5A0C, + 0xE6B3: 0x5A09, + 0xE6B4: 0x5A32, + 0xE6B5: 0x5A34, + 0xE6B6: 0x5A11, + 0xE6B7: 0x5A23, + 0xE6B8: 0x5A13, + 0xE6B9: 0x5A40, + 0xE6BA: 0x5A67, + 0xE6BB: 0x5A4A, + 0xE6BC: 0x5A55, + 0xE6BD: 0x5A3C, + 0xE6BE: 0x5A62, + 0xE6BF: 0x5A75, + 0xE6C0: 0x80EC, + 0xE6C1: 0x5AAA, + 0xE6C2: 0x5A9B, + 0xE6C3: 0x5A77, + 0xE6C4: 0x5A7A, + 0xE6C5: 0x5ABE, + 0xE6C6: 0x5AEB, + 0xE6C7: 0x5AB2, + 0xE6C8: 0x5AD2, + 0xE6C9: 0x5AD4, + 0xE6CA: 0x5AB8, + 0xE6CB: 0x5AE0, + 0xE6CC: 0x5AE3, + 0xE6CD: 0x5AF1, + 0xE6CE: 0x5AD6, + 0xE6CF: 0x5AE6, + 0xE6D0: 0x5AD8, + 0xE6D1: 0x5ADC, + 0xE6D2: 0x5B09, + 0xE6D3: 0x5B17, + 0xE6D4: 0x5B16, + 0xE6D5: 0x5B32, + 0xE6D6: 0x5B37, + 0xE6D7: 0x5B40, + 0xE6D8: 0x5C15, + 0xE6D9: 0x5C1C, + 0xE6DA: 0x5B5A, + 0xE6DB: 0x5B65, + 0xE6DC: 0x5B73, + 0xE6DD: 0x5B51, + 0xE6DE: 0x5B53, + 0xE6DF: 0x5B62, + 0xE6E0: 0x9A75, + 0xE6E1: 0x9A77, + 0xE6E2: 0x9A78, + 0xE6E3: 0x9A7A, + 0xE6E4: 0x9A7F, + 0xE6E5: 0x9A7D, + 0xE6E6: 0x9A80, + 0xE6E7: 0x9A81, + 0xE6E8: 0x9A85, + 0xE6E9: 0x9A88, + 0xE6EA: 0x9A8A, + 0xE6EB: 0x9A90, + 0xE6EC: 0x9A92, + 0xE6ED: 0x9A93, + 0xE6EE: 0x9A96, + 0xE6EF: 0x9A98, + 0xE6F0: 0x9A9B, + 0xE6F1: 0x9A9C, + 0xE6F2: 0x9A9D, + 0xE6F3: 0x9A9F, + 0xE6F4: 0x9AA0, + 0xE6F5: 0x9AA2, + 0xE6F6: 0x9AA3, + 0xE6F7: 0x9AA5, + 0xE6F8: 0x9AA7, + 0xE6F9: 0x7E9F, + 0xE6FA: 0x7EA1, + 0xE6FB: 0x7EA3, + 0xE6FC: 0x7EA5, + 0xE6FD: 0x7EA8, + 0xE6FE: 0x7EA9, + 0xE740: 0x93CE, + 0xE741: 0x93CF, + 0xE742: 0x93D0, + 0xE743: 0x93D1, + 0xE744: 0x93D2, + 0xE745: 0x93D3, + 0xE746: 0x93D4, + 0xE747: 0x93D5, + 0xE748: 0x93D7, + 0xE749: 0x93D8, + 0xE74A: 0x93D9, + 0xE74B: 0x93DA, + 0xE74C: 0x93DB, + 0xE74D: 0x93DC, + 0xE74E: 0x93DD, + 0xE74F: 0x93DE, + 0xE750: 0x93DF, + 0xE751: 0x93E0, + 0xE752: 0x93E1, + 0xE753: 0x93E2, + 0xE754: 0x93E3, + 0xE755: 0x93E4, + 0xE756: 0x93E5, + 0xE757: 0x93E6, + 0xE758: 0x93E7, + 0xE759: 0x93E8, + 0xE75A: 0x93E9, + 0xE75B: 0x93EA, + 0xE75C: 0x93EB, + 0xE75D: 0x93EC, + 0xE75E: 0x93ED, + 0xE75F: 0x93EE, + 0xE760: 0x93EF, + 0xE761: 0x93F0, + 0xE762: 0x93F1, + 0xE763: 0x93F2, + 0xE764: 0x93F3, + 0xE765: 0x93F4, + 0xE766: 0x93F5, + 0xE767: 0x93F6, + 0xE768: 0x93F7, + 0xE769: 0x93F8, + 0xE76A: 0x93F9, + 0xE76B: 0x93FA, + 0xE76C: 0x93FB, + 0xE76D: 0x93FC, + 0xE76E: 0x93FD, + 0xE76F: 0x93FE, + 0xE770: 0x93FF, + 0xE771: 0x9400, + 0xE772: 0x9401, + 0xE773: 0x9402, + 0xE774: 0x9403, + 0xE775: 0x9404, + 0xE776: 0x9405, + 0xE777: 0x9406, + 0xE778: 0x9407, + 0xE779: 0x9408, + 0xE77A: 0x9409, + 0xE77B: 0x940A, + 0xE77C: 0x940B, + 0xE77D: 0x940C, + 0xE77E: 0x940D, + 0xE780: 0x940E, + 0xE781: 0x940F, + 0xE782: 0x9410, + 0xE783: 0x9411, + 0xE784: 0x9412, + 0xE785: 0x9413, + 0xE786: 0x9414, + 0xE787: 0x9415, + 0xE788: 0x9416, + 0xE789: 0x9417, + 0xE78A: 0x9418, + 0xE78B: 0x9419, + 0xE78C: 0x941A, + 0xE78D: 0x941B, + 0xE78E: 0x941C, + 0xE78F: 0x941D, + 0xE790: 0x941E, + 0xE791: 0x941F, + 0xE792: 0x9420, + 0xE793: 0x9421, + 0xE794: 0x9422, + 0xE795: 0x9423, + 0xE796: 0x9424, + 0xE797: 0x9425, + 0xE798: 0x9426, + 0xE799: 0x9427, + 0xE79A: 0x9428, + 0xE79B: 0x9429, + 0xE79C: 0x942A, + 0xE79D: 0x942B, + 0xE79E: 0x942C, + 0xE79F: 0x942D, + 0xE7A0: 0x942E, + 0xE7A1: 0x7EAD, + 0xE7A2: 0x7EB0, + 0xE7A3: 0x7EBE, + 0xE7A4: 0x7EC0, + 0xE7A5: 0x7EC1, + 0xE7A6: 0x7EC2, + 0xE7A7: 0x7EC9, + 0xE7A8: 0x7ECB, + 0xE7A9: 0x7ECC, + 0xE7AA: 0x7ED0, + 0xE7AB: 0x7ED4, + 0xE7AC: 0x7ED7, + 0xE7AD: 0x7EDB, + 0xE7AE: 0x7EE0, + 0xE7AF: 0x7EE1, + 0xE7B0: 0x7EE8, + 0xE7B1: 0x7EEB, + 0xE7B2: 0x7EEE, + 0xE7B3: 0x7EEF, + 0xE7B4: 0x7EF1, + 0xE7B5: 0x7EF2, + 0xE7B6: 0x7F0D, + 0xE7B7: 0x7EF6, + 0xE7B8: 0x7EFA, + 0xE7B9: 0x7EFB, + 0xE7BA: 0x7EFE, + 0xE7BB: 0x7F01, + 0xE7BC: 0x7F02, + 0xE7BD: 0x7F03, + 0xE7BE: 0x7F07, + 0xE7BF: 0x7F08, + 0xE7C0: 0x7F0B, + 0xE7C1: 0x7F0C, + 0xE7C2: 0x7F0F, + 0xE7C3: 0x7F11, + 0xE7C4: 0x7F12, + 0xE7C5: 0x7F17, + 0xE7C6: 0x7F19, + 0xE7C7: 0x7F1C, + 0xE7C8: 0x7F1B, + 0xE7C9: 0x7F1F, + 0xE7CA: 0x7F21, + 0xE7CB: 0x7F22, + 0xE7CC: 0x7F23, + 0xE7CD: 0x7F24, + 0xE7CE: 0x7F25, + 0xE7CF: 0x7F26, + 0xE7D0: 0x7F27, + 0xE7D1: 0x7F2A, + 0xE7D2: 0x7F2B, + 0xE7D3: 0x7F2C, + 0xE7D4: 0x7F2D, + 0xE7D5: 0x7F2F, + 0xE7D6: 0x7F30, + 0xE7D7: 0x7F31, + 0xE7D8: 0x7F32, + 0xE7D9: 0x7F33, + 0xE7DA: 0x7F35, + 0xE7DB: 0x5E7A, + 0xE7DC: 0x757F, + 0xE7DD: 0x5DDB, + 0xE7DE: 0x753E, + 0xE7DF: 0x9095, + 0xE7E0: 0x738E, + 0xE7E1: 0x7391, + 0xE7E2: 0x73AE, + 0xE7E3: 0x73A2, + 0xE7E4: 0x739F, + 0xE7E5: 0x73CF, + 0xE7E6: 0x73C2, + 0xE7E7: 0x73D1, + 0xE7E8: 0x73B7, + 0xE7E9: 0x73B3, + 0xE7EA: 0x73C0, + 0xE7EB: 0x73C9, + 0xE7EC: 0x73C8, + 0xE7ED: 0x73E5, + 0xE7EE: 0x73D9, + 0xE7EF: 0x987C, + 0xE7F0: 0x740A, + 0xE7F1: 0x73E9, + 0xE7F2: 0x73E7, + 0xE7F3: 0x73DE, + 0xE7F4: 0x73BA, + 0xE7F5: 0x73F2, + 0xE7F6: 0x740F, + 0xE7F7: 0x742A, + 0xE7F8: 0x745B, + 0xE7F9: 0x7426, + 0xE7FA: 0x7425, + 0xE7FB: 0x7428, + 0xE7FC: 0x7430, + 0xE7FD: 0x742E, + 0xE7FE: 0x742C, + 0xE840: 0x942F, + 0xE841: 0x9430, + 0xE842: 0x9431, + 0xE843: 0x9432, + 0xE844: 0x9433, + 0xE845: 0x9434, + 0xE846: 0x9435, + 0xE847: 0x9436, + 0xE848: 0x9437, + 0xE849: 0x9438, + 0xE84A: 0x9439, + 0xE84B: 0x943A, + 0xE84C: 0x943B, + 0xE84D: 0x943C, + 0xE84E: 0x943D, + 0xE84F: 0x943F, + 0xE850: 0x9440, + 0xE851: 0x9441, + 0xE852: 0x9442, + 0xE853: 0x9443, + 0xE854: 0x9444, + 0xE855: 0x9445, + 0xE856: 0x9446, + 0xE857: 0x9447, + 0xE858: 0x9448, + 0xE859: 0x9449, + 0xE85A: 0x944A, + 0xE85B: 0x944B, + 0xE85C: 0x944C, + 0xE85D: 0x944D, + 0xE85E: 0x944E, + 0xE85F: 0x944F, + 0xE860: 0x9450, + 0xE861: 0x9451, + 0xE862: 0x9452, + 0xE863: 0x9453, + 0xE864: 0x9454, + 0xE865: 0x9455, + 0xE866: 0x9456, + 0xE867: 0x9457, + 0xE868: 0x9458, + 0xE869: 0x9459, + 0xE86A: 0x945A, + 0xE86B: 0x945B, + 0xE86C: 0x945C, + 0xE86D: 0x945D, + 0xE86E: 0x945E, + 0xE86F: 0x945F, + 0xE870: 0x9460, + 0xE871: 0x9461, + 0xE872: 0x9462, + 0xE873: 0x9463, + 0xE874: 0x9464, + 0xE875: 0x9465, + 0xE876: 0x9466, + 0xE877: 0x9467, + 0xE878: 0x9468, + 0xE879: 0x9469, + 0xE87A: 0x946A, + 0xE87B: 0x946C, + 0xE87C: 0x946D, + 0xE87D: 0x946E, + 0xE87E: 0x946F, + 0xE880: 0x9470, + 0xE881: 0x9471, + 0xE882: 0x9472, + 0xE883: 0x9473, + 0xE884: 0x9474, + 0xE885: 0x9475, + 0xE886: 0x9476, + 0xE887: 0x9477, + 0xE888: 0x9478, + 0xE889: 0x9479, + 0xE88A: 0x947A, + 0xE88B: 0x947B, + 0xE88C: 0x947C, + 0xE88D: 0x947D, + 0xE88E: 0x947E, + 0xE88F: 0x947F, + 0xE890: 0x9480, + 0xE891: 0x9481, + 0xE892: 0x9482, + 0xE893: 0x9483, + 0xE894: 0x9484, + 0xE895: 0x9491, + 0xE896: 0x9496, + 0xE897: 0x9498, + 0xE898: 0x94C7, + 0xE899: 0x94CF, + 0xE89A: 0x94D3, + 0xE89B: 0x94D4, + 0xE89C: 0x94DA, + 0xE89D: 0x94E6, + 0xE89E: 0x94FB, + 0xE89F: 0x951C, + 0xE8A0: 0x9520, + 0xE8A1: 0x741B, + 0xE8A2: 0x741A, + 0xE8A3: 0x7441, + 0xE8A4: 0x745C, + 0xE8A5: 0x7457, + 0xE8A6: 0x7455, + 0xE8A7: 0x7459, + 0xE8A8: 0x7477, + 0xE8A9: 0x746D, + 0xE8AA: 0x747E, + 0xE8AB: 0x749C, + 0xE8AC: 0x748E, + 0xE8AD: 0x7480, + 0xE8AE: 0x7481, + 0xE8AF: 0x7487, + 0xE8B0: 0x748B, + 0xE8B1: 0x749E, + 0xE8B2: 0x74A8, + 0xE8B3: 0x74A9, + 0xE8B4: 0x7490, + 0xE8B5: 0x74A7, + 0xE8B6: 0x74D2, + 0xE8B7: 0x74BA, + 0xE8B8: 0x97EA, + 0xE8B9: 0x97EB, + 0xE8BA: 0x97EC, + 0xE8BB: 0x674C, + 0xE8BC: 0x6753, + 0xE8BD: 0x675E, + 0xE8BE: 0x6748, + 0xE8BF: 0x6769, + 0xE8C0: 0x67A5, + 0xE8C1: 0x6787, + 0xE8C2: 0x676A, + 0xE8C3: 0x6773, + 0xE8C4: 0x6798, + 0xE8C5: 0x67A7, + 0xE8C6: 0x6775, + 0xE8C7: 0x67A8, + 0xE8C8: 0x679E, + 0xE8C9: 0x67AD, + 0xE8CA: 0x678B, + 0xE8CB: 0x6777, + 0xE8CC: 0x677C, + 0xE8CD: 0x67F0, + 0xE8CE: 0x6809, + 0xE8CF: 0x67D8, + 0xE8D0: 0x680A, + 0xE8D1: 0x67E9, + 0xE8D2: 0x67B0, + 0xE8D3: 0x680C, + 0xE8D4: 0x67D9, + 0xE8D5: 0x67B5, + 0xE8D6: 0x67DA, + 0xE8D7: 0x67B3, + 0xE8D8: 0x67DD, + 0xE8D9: 0x6800, + 0xE8DA: 0x67C3, + 0xE8DB: 0x67B8, + 0xE8DC: 0x67E2, + 0xE8DD: 0x680E, + 0xE8DE: 0x67C1, + 0xE8DF: 0x67FD, + 0xE8E0: 0x6832, + 0xE8E1: 0x6833, + 0xE8E2: 0x6860, + 0xE8E3: 0x6861, + 0xE8E4: 0x684E, + 0xE8E5: 0x6862, + 0xE8E6: 0x6844, + 0xE8E7: 0x6864, + 0xE8E8: 0x6883, + 0xE8E9: 0x681D, + 0xE8EA: 0x6855, + 0xE8EB: 0x6866, + 0xE8EC: 0x6841, + 0xE8ED: 0x6867, + 0xE8EE: 0x6840, + 0xE8EF: 0x683E, + 0xE8F0: 0x684A, + 0xE8F1: 0x6849, + 0xE8F2: 0x6829, + 0xE8F3: 0x68B5, + 0xE8F4: 0x688F, + 0xE8F5: 0x6874, + 0xE8F6: 0x6877, + 0xE8F7: 0x6893, + 0xE8F8: 0x686B, + 0xE8F9: 0x68C2, + 0xE8FA: 0x696E, + 0xE8FB: 0x68FC, + 0xE8FC: 0x691F, + 0xE8FD: 0x6920, + 0xE8FE: 0x68F9, + 0xE940: 0x9527, + 0xE941: 0x9533, + 0xE942: 0x953D, + 0xE943: 0x9543, + 0xE944: 0x9548, + 0xE945: 0x954B, + 0xE946: 0x9555, + 0xE947: 0x955A, + 0xE948: 0x9560, + 0xE949: 0x956E, + 0xE94A: 0x9574, + 0xE94B: 0x9575, + 0xE94C: 0x9577, + 0xE94D: 0x9578, + 0xE94E: 0x9579, + 0xE94F: 0x957A, + 0xE950: 0x957B, + 0xE951: 0x957C, + 0xE952: 0x957D, + 0xE953: 0x957E, + 0xE954: 0x9580, + 0xE955: 0x9581, + 0xE956: 0x9582, + 0xE957: 0x9583, + 0xE958: 0x9584, + 0xE959: 0x9585, + 0xE95A: 0x9586, + 0xE95B: 0x9587, + 0xE95C: 0x9588, + 0xE95D: 0x9589, + 0xE95E: 0x958A, + 0xE95F: 0x958B, + 0xE960: 0x958C, + 0xE961: 0x958D, + 0xE962: 0x958E, + 0xE963: 0x958F, + 0xE964: 0x9590, + 0xE965: 0x9591, + 0xE966: 0x9592, + 0xE967: 0x9593, + 0xE968: 0x9594, + 0xE969: 0x9595, + 0xE96A: 0x9596, + 0xE96B: 0x9597, + 0xE96C: 0x9598, + 0xE96D: 0x9599, + 0xE96E: 0x959A, + 0xE96F: 0x959B, + 0xE970: 0x959C, + 0xE971: 0x959D, + 0xE972: 0x959E, + 0xE973: 0x959F, + 0xE974: 0x95A0, + 0xE975: 0x95A1, + 0xE976: 0x95A2, + 0xE977: 0x95A3, + 0xE978: 0x95A4, + 0xE979: 0x95A5, + 0xE97A: 0x95A6, + 0xE97B: 0x95A7, + 0xE97C: 0x95A8, + 0xE97D: 0x95A9, + 0xE97E: 0x95AA, + 0xE980: 0x95AB, + 0xE981: 0x95AC, + 0xE982: 0x95AD, + 0xE983: 0x95AE, + 0xE984: 0x95AF, + 0xE985: 0x95B0, + 0xE986: 0x95B1, + 0xE987: 0x95B2, + 0xE988: 0x95B3, + 0xE989: 0x95B4, + 0xE98A: 0x95B5, + 0xE98B: 0x95B6, + 0xE98C: 0x95B7, + 0xE98D: 0x95B8, + 0xE98E: 0x95B9, + 0xE98F: 0x95BA, + 0xE990: 0x95BB, + 0xE991: 0x95BC, + 0xE992: 0x95BD, + 0xE993: 0x95BE, + 0xE994: 0x95BF, + 0xE995: 0x95C0, + 0xE996: 0x95C1, + 0xE997: 0x95C2, + 0xE998: 0x95C3, + 0xE999: 0x95C4, + 0xE99A: 0x95C5, + 0xE99B: 0x95C6, + 0xE99C: 0x95C7, + 0xE99D: 0x95C8, + 0xE99E: 0x95C9, + 0xE99F: 0x95CA, + 0xE9A0: 0x95CB, + 0xE9A1: 0x6924, + 0xE9A2: 0x68F0, + 0xE9A3: 0x690B, + 0xE9A4: 0x6901, + 0xE9A5: 0x6957, + 0xE9A6: 0x68E3, + 0xE9A7: 0x6910, + 0xE9A8: 0x6971, + 0xE9A9: 0x6939, + 0xE9AA: 0x6960, + 0xE9AB: 0x6942, + 0xE9AC: 0x695D, + 0xE9AD: 0x6984, + 0xE9AE: 0x696B, + 0xE9AF: 0x6980, + 0xE9B0: 0x6998, + 0xE9B1: 0x6978, + 0xE9B2: 0x6934, + 0xE9B3: 0x69CC, + 0xE9B4: 0x6987, + 0xE9B5: 0x6988, + 0xE9B6: 0x69CE, + 0xE9B7: 0x6989, + 0xE9B8: 0x6966, + 0xE9B9: 0x6963, + 0xE9BA: 0x6979, + 0xE9BB: 0x699B, + 0xE9BC: 0x69A7, + 0xE9BD: 0x69BB, + 0xE9BE: 0x69AB, + 0xE9BF: 0x69AD, + 0xE9C0: 0x69D4, + 0xE9C1: 0x69B1, + 0xE9C2: 0x69C1, + 0xE9C3: 0x69CA, + 0xE9C4: 0x69DF, + 0xE9C5: 0x6995, + 0xE9C6: 0x69E0, + 0xE9C7: 0x698D, + 0xE9C8: 0x69FF, + 0xE9C9: 0x6A2F, + 0xE9CA: 0x69ED, + 0xE9CB: 0x6A17, + 0xE9CC: 0x6A18, + 0xE9CD: 0x6A65, + 0xE9CE: 0x69F2, + 0xE9CF: 0x6A44, + 0xE9D0: 0x6A3E, + 0xE9D1: 0x6AA0, + 0xE9D2: 0x6A50, + 0xE9D3: 0x6A5B, + 0xE9D4: 0x6A35, + 0xE9D5: 0x6A8E, + 0xE9D6: 0x6A79, + 0xE9D7: 0x6A3D, + 0xE9D8: 0x6A28, + 0xE9D9: 0x6A58, + 0xE9DA: 0x6A7C, + 0xE9DB: 0x6A91, + 0xE9DC: 0x6A90, + 0xE9DD: 0x6AA9, + 0xE9DE: 0x6A97, + 0xE9DF: 0x6AAB, + 0xE9E0: 0x7337, + 0xE9E1: 0x7352, + 0xE9E2: 0x6B81, + 0xE9E3: 0x6B82, + 0xE9E4: 0x6B87, + 0xE9E5: 0x6B84, + 0xE9E6: 0x6B92, + 0xE9E7: 0x6B93, + 0xE9E8: 0x6B8D, + 0xE9E9: 0x6B9A, + 0xE9EA: 0x6B9B, + 0xE9EB: 0x6BA1, + 0xE9EC: 0x6BAA, + 0xE9ED: 0x8F6B, + 0xE9EE: 0x8F6D, + 0xE9EF: 0x8F71, + 0xE9F0: 0x8F72, + 0xE9F1: 0x8F73, + 0xE9F2: 0x8F75, + 0xE9F3: 0x8F76, + 0xE9F4: 0x8F78, + 0xE9F5: 0x8F77, + 0xE9F6: 0x8F79, + 0xE9F7: 0x8F7A, + 0xE9F8: 0x8F7C, + 0xE9F9: 0x8F7E, + 0xE9FA: 0x8F81, + 0xE9FB: 0x8F82, + 0xE9FC: 0x8F84, + 0xE9FD: 0x8F87, + 0xE9FE: 0x8F8B, + 0xEA40: 0x95CC, + 0xEA41: 0x95CD, + 0xEA42: 0x95CE, + 0xEA43: 0x95CF, + 0xEA44: 0x95D0, + 0xEA45: 0x95D1, + 0xEA46: 0x95D2, + 0xEA47: 0x95D3, + 0xEA48: 0x95D4, + 0xEA49: 0x95D5, + 0xEA4A: 0x95D6, + 0xEA4B: 0x95D7, + 0xEA4C: 0x95D8, + 0xEA4D: 0x95D9, + 0xEA4E: 0x95DA, + 0xEA4F: 0x95DB, + 0xEA50: 0x95DC, + 0xEA51: 0x95DD, + 0xEA52: 0x95DE, + 0xEA53: 0x95DF, + 0xEA54: 0x95E0, + 0xEA55: 0x95E1, + 0xEA56: 0x95E2, + 0xEA57: 0x95E3, + 0xEA58: 0x95E4, + 0xEA59: 0x95E5, + 0xEA5A: 0x95E6, + 0xEA5B: 0x95E7, + 0xEA5C: 0x95EC, + 0xEA5D: 0x95FF, + 0xEA5E: 0x9607, + 0xEA5F: 0x9613, + 0xEA60: 0x9618, + 0xEA61: 0x961B, + 0xEA62: 0x961E, + 0xEA63: 0x9620, + 0xEA64: 0x9623, + 0xEA65: 0x9624, + 0xEA66: 0x9625, + 0xEA67: 0x9626, + 0xEA68: 0x9627, + 0xEA69: 0x9628, + 0xEA6A: 0x9629, + 0xEA6B: 0x962B, + 0xEA6C: 0x962C, + 0xEA6D: 0x962D, + 0xEA6E: 0x962F, + 0xEA6F: 0x9630, + 0xEA70: 0x9637, + 0xEA71: 0x9638, + 0xEA72: 0x9639, + 0xEA73: 0x963A, + 0xEA74: 0x963E, + 0xEA75: 0x9641, + 0xEA76: 0x9643, + 0xEA77: 0x964A, + 0xEA78: 0x964E, + 0xEA79: 0x964F, + 0xEA7A: 0x9651, + 0xEA7B: 0x9652, + 0xEA7C: 0x9653, + 0xEA7D: 0x9656, + 0xEA7E: 0x9657, + 0xEA80: 0x9658, + 0xEA81: 0x9659, + 0xEA82: 0x965A, + 0xEA83: 0x965C, + 0xEA84: 0x965D, + 0xEA85: 0x965E, + 0xEA86: 0x9660, + 0xEA87: 0x9663, + 0xEA88: 0x9665, + 0xEA89: 0x9666, + 0xEA8A: 0x966B, + 0xEA8B: 0x966D, + 0xEA8C: 0x966E, + 0xEA8D: 0x966F, + 0xEA8E: 0x9670, + 0xEA8F: 0x9671, + 0xEA90: 0x9673, + 0xEA91: 0x9678, + 0xEA92: 0x9679, + 0xEA93: 0x967A, + 0xEA94: 0x967B, + 0xEA95: 0x967C, + 0xEA96: 0x967D, + 0xEA97: 0x967E, + 0xEA98: 0x967F, + 0xEA99: 0x9680, + 0xEA9A: 0x9681, + 0xEA9B: 0x9682, + 0xEA9C: 0x9683, + 0xEA9D: 0x9684, + 0xEA9E: 0x9687, + 0xEA9F: 0x9689, + 0xEAA0: 0x968A, + 0xEAA1: 0x8F8D, + 0xEAA2: 0x8F8E, + 0xEAA3: 0x8F8F, + 0xEAA4: 0x8F98, + 0xEAA5: 0x8F9A, + 0xEAA6: 0x8ECE, + 0xEAA7: 0x620B, + 0xEAA8: 0x6217, + 0xEAA9: 0x621B, + 0xEAAA: 0x621F, + 0xEAAB: 0x6222, + 0xEAAC: 0x6221, + 0xEAAD: 0x6225, + 0xEAAE: 0x6224, + 0xEAAF: 0x622C, + 0xEAB0: 0x81E7, + 0xEAB1: 0x74EF, + 0xEAB2: 0x74F4, + 0xEAB3: 0x74FF, + 0xEAB4: 0x750F, + 0xEAB5: 0x7511, + 0xEAB6: 0x7513, + 0xEAB7: 0x6534, + 0xEAB8: 0x65EE, + 0xEAB9: 0x65EF, + 0xEABA: 0x65F0, + 0xEABB: 0x660A, + 0xEABC: 0x6619, + 0xEABD: 0x6772, + 0xEABE: 0x6603, + 0xEABF: 0x6615, + 0xEAC0: 0x6600, + 0xEAC1: 0x7085, + 0xEAC2: 0x66F7, + 0xEAC3: 0x661D, + 0xEAC4: 0x6634, + 0xEAC5: 0x6631, + 0xEAC6: 0x6636, + 0xEAC7: 0x6635, + 0xEAC8: 0x8006, + 0xEAC9: 0x665F, + 0xEACA: 0x6654, + 0xEACB: 0x6641, + 0xEACC: 0x664F, + 0xEACD: 0x6656, + 0xEACE: 0x6661, + 0xEACF: 0x6657, + 0xEAD0: 0x6677, + 0xEAD1: 0x6684, + 0xEAD2: 0x668C, + 0xEAD3: 0x66A7, + 0xEAD4: 0x669D, + 0xEAD5: 0x66BE, + 0xEAD6: 0x66DB, + 0xEAD7: 0x66DC, + 0xEAD8: 0x66E6, + 0xEAD9: 0x66E9, + 0xEADA: 0x8D32, + 0xEADB: 0x8D33, + 0xEADC: 0x8D36, + 0xEADD: 0x8D3B, + 0xEADE: 0x8D3D, + 0xEADF: 0x8D40, + 0xEAE0: 0x8D45, + 0xEAE1: 0x8D46, + 0xEAE2: 0x8D48, + 0xEAE3: 0x8D49, + 0xEAE4: 0x8D47, + 0xEAE5: 0x8D4D, + 0xEAE6: 0x8D55, + 0xEAE7: 0x8D59, + 0xEAE8: 0x89C7, + 0xEAE9: 0x89CA, + 0xEAEA: 0x89CB, + 0xEAEB: 0x89CC, + 0xEAEC: 0x89CE, + 0xEAED: 0x89CF, + 0xEAEE: 0x89D0, + 0xEAEF: 0x89D1, + 0xEAF0: 0x726E, + 0xEAF1: 0x729F, + 0xEAF2: 0x725D, + 0xEAF3: 0x7266, + 0xEAF4: 0x726F, + 0xEAF5: 0x727E, + 0xEAF6: 0x727F, + 0xEAF7: 0x7284, + 0xEAF8: 0x728B, + 0xEAF9: 0x728D, + 0xEAFA: 0x728F, + 0xEAFB: 0x7292, + 0xEAFC: 0x6308, + 0xEAFD: 0x6332, + 0xEAFE: 0x63B0, + 0xEB40: 0x968C, + 0xEB41: 0x968E, + 0xEB42: 0x9691, + 0xEB43: 0x9692, + 0xEB44: 0x9693, + 0xEB45: 0x9695, + 0xEB46: 0x9696, + 0xEB47: 0x969A, + 0xEB48: 0x969B, + 0xEB49: 0x969D, + 0xEB4A: 0x969E, + 0xEB4B: 0x969F, + 0xEB4C: 0x96A0, + 0xEB4D: 0x96A1, + 0xEB4E: 0x96A2, + 0xEB4F: 0x96A3, + 0xEB50: 0x96A4, + 0xEB51: 0x96A5, + 0xEB52: 0x96A6, + 0xEB53: 0x96A8, + 0xEB54: 0x96A9, + 0xEB55: 0x96AA, + 0xEB56: 0x96AB, + 0xEB57: 0x96AC, + 0xEB58: 0x96AD, + 0xEB59: 0x96AE, + 0xEB5A: 0x96AF, + 0xEB5B: 0x96B1, + 0xEB5C: 0x96B2, + 0xEB5D: 0x96B4, + 0xEB5E: 0x96B5, + 0xEB5F: 0x96B7, + 0xEB60: 0x96B8, + 0xEB61: 0x96BA, + 0xEB62: 0x96BB, + 0xEB63: 0x96BF, + 0xEB64: 0x96C2, + 0xEB65: 0x96C3, + 0xEB66: 0x96C8, + 0xEB67: 0x96CA, + 0xEB68: 0x96CB, + 0xEB69: 0x96D0, + 0xEB6A: 0x96D1, + 0xEB6B: 0x96D3, + 0xEB6C: 0x96D4, + 0xEB6D: 0x96D6, + 0xEB6E: 0x96D7, + 0xEB6F: 0x96D8, + 0xEB70: 0x96D9, + 0xEB71: 0x96DA, + 0xEB72: 0x96DB, + 0xEB73: 0x96DC, + 0xEB74: 0x96DD, + 0xEB75: 0x96DE, + 0xEB76: 0x96DF, + 0xEB77: 0x96E1, + 0xEB78: 0x96E2, + 0xEB79: 0x96E3, + 0xEB7A: 0x96E4, + 0xEB7B: 0x96E5, + 0xEB7C: 0x96E6, + 0xEB7D: 0x96E7, + 0xEB7E: 0x96EB, + 0xEB80: 0x96EC, + 0xEB81: 0x96ED, + 0xEB82: 0x96EE, + 0xEB83: 0x96F0, + 0xEB84: 0x96F1, + 0xEB85: 0x96F2, + 0xEB86: 0x96F4, + 0xEB87: 0x96F5, + 0xEB88: 0x96F8, + 0xEB89: 0x96FA, + 0xEB8A: 0x96FB, + 0xEB8B: 0x96FC, + 0xEB8C: 0x96FD, + 0xEB8D: 0x96FF, + 0xEB8E: 0x9702, + 0xEB8F: 0x9703, + 0xEB90: 0x9705, + 0xEB91: 0x970A, + 0xEB92: 0x970B, + 0xEB93: 0x970C, + 0xEB94: 0x9710, + 0xEB95: 0x9711, + 0xEB96: 0x9712, + 0xEB97: 0x9714, + 0xEB98: 0x9715, + 0xEB99: 0x9717, + 0xEB9A: 0x9718, + 0xEB9B: 0x9719, + 0xEB9C: 0x971A, + 0xEB9D: 0x971B, + 0xEB9E: 0x971D, + 0xEB9F: 0x971F, + 0xEBA0: 0x9720, + 0xEBA1: 0x643F, + 0xEBA2: 0x64D8, + 0xEBA3: 0x8004, + 0xEBA4: 0x6BEA, + 0xEBA5: 0x6BF3, + 0xEBA6: 0x6BFD, + 0xEBA7: 0x6BF5, + 0xEBA8: 0x6BF9, + 0xEBA9: 0x6C05, + 0xEBAA: 0x6C07, + 0xEBAB: 0x6C06, + 0xEBAC: 0x6C0D, + 0xEBAD: 0x6C15, + 0xEBAE: 0x6C18, + 0xEBAF: 0x6C19, + 0xEBB0: 0x6C1A, + 0xEBB1: 0x6C21, + 0xEBB2: 0x6C29, + 0xEBB3: 0x6C24, + 0xEBB4: 0x6C2A, + 0xEBB5: 0x6C32, + 0xEBB6: 0x6535, + 0xEBB7: 0x6555, + 0xEBB8: 0x656B, + 0xEBB9: 0x724D, + 0xEBBA: 0x7252, + 0xEBBB: 0x7256, + 0xEBBC: 0x7230, + 0xEBBD: 0x8662, + 0xEBBE: 0x5216, + 0xEBBF: 0x809F, + 0xEBC0: 0x809C, + 0xEBC1: 0x8093, + 0xEBC2: 0x80BC, + 0xEBC3: 0x670A, + 0xEBC4: 0x80BD, + 0xEBC5: 0x80B1, + 0xEBC6: 0x80AB, + 0xEBC7: 0x80AD, + 0xEBC8: 0x80B4, + 0xEBC9: 0x80B7, + 0xEBCA: 0x80E7, + 0xEBCB: 0x80E8, + 0xEBCC: 0x80E9, + 0xEBCD: 0x80EA, + 0xEBCE: 0x80DB, + 0xEBCF: 0x80C2, + 0xEBD0: 0x80C4, + 0xEBD1: 0x80D9, + 0xEBD2: 0x80CD, + 0xEBD3: 0x80D7, + 0xEBD4: 0x6710, + 0xEBD5: 0x80DD, + 0xEBD6: 0x80EB, + 0xEBD7: 0x80F1, + 0xEBD8: 0x80F4, + 0xEBD9: 0x80ED, + 0xEBDA: 0x810D, + 0xEBDB: 0x810E, + 0xEBDC: 0x80F2, + 0xEBDD: 0x80FC, + 0xEBDE: 0x6715, + 0xEBDF: 0x8112, + 0xEBE0: 0x8C5A, + 0xEBE1: 0x8136, + 0xEBE2: 0x811E, + 0xEBE3: 0x812C, + 0xEBE4: 0x8118, + 0xEBE5: 0x8132, + 0xEBE6: 0x8148, + 0xEBE7: 0x814C, + 0xEBE8: 0x8153, + 0xEBE9: 0x8174, + 0xEBEA: 0x8159, + 0xEBEB: 0x815A, + 0xEBEC: 0x8171, + 0xEBED: 0x8160, + 0xEBEE: 0x8169, + 0xEBEF: 0x817C, + 0xEBF0: 0x817D, + 0xEBF1: 0x816D, + 0xEBF2: 0x8167, + 0xEBF3: 0x584D, + 0xEBF4: 0x5AB5, + 0xEBF5: 0x8188, + 0xEBF6: 0x8182, + 0xEBF7: 0x8191, + 0xEBF8: 0x6ED5, + 0xEBF9: 0x81A3, + 0xEBFA: 0x81AA, + 0xEBFB: 0x81CC, + 0xEBFC: 0x6726, + 0xEBFD: 0x81CA, + 0xEBFE: 0x81BB, + 0xEC40: 0x9721, + 0xEC41: 0x9722, + 0xEC42: 0x9723, + 0xEC43: 0x9724, + 0xEC44: 0x9725, + 0xEC45: 0x9726, + 0xEC46: 0x9727, + 0xEC47: 0x9728, + 0xEC48: 0x9729, + 0xEC49: 0x972B, + 0xEC4A: 0x972C, + 0xEC4B: 0x972E, + 0xEC4C: 0x972F, + 0xEC4D: 0x9731, + 0xEC4E: 0x9733, + 0xEC4F: 0x9734, + 0xEC50: 0x9735, + 0xEC51: 0x9736, + 0xEC52: 0x9737, + 0xEC53: 0x973A, + 0xEC54: 0x973B, + 0xEC55: 0x973C, + 0xEC56: 0x973D, + 0xEC57: 0x973F, + 0xEC58: 0x9740, + 0xEC59: 0x9741, + 0xEC5A: 0x9742, + 0xEC5B: 0x9743, + 0xEC5C: 0x9744, + 0xEC5D: 0x9745, + 0xEC5E: 0x9746, + 0xEC5F: 0x9747, + 0xEC60: 0x9748, + 0xEC61: 0x9749, + 0xEC62: 0x974A, + 0xEC63: 0x974B, + 0xEC64: 0x974C, + 0xEC65: 0x974D, + 0xEC66: 0x974E, + 0xEC67: 0x974F, + 0xEC68: 0x9750, + 0xEC69: 0x9751, + 0xEC6A: 0x9754, + 0xEC6B: 0x9755, + 0xEC6C: 0x9757, + 0xEC6D: 0x9758, + 0xEC6E: 0x975A, + 0xEC6F: 0x975C, + 0xEC70: 0x975D, + 0xEC71: 0x975F, + 0xEC72: 0x9763, + 0xEC73: 0x9764, + 0xEC74: 0x9766, + 0xEC75: 0x9767, + 0xEC76: 0x9768, + 0xEC77: 0x976A, + 0xEC78: 0x976B, + 0xEC79: 0x976C, + 0xEC7A: 0x976D, + 0xEC7B: 0x976E, + 0xEC7C: 0x976F, + 0xEC7D: 0x9770, + 0xEC7E: 0x9771, + 0xEC80: 0x9772, + 0xEC81: 0x9775, + 0xEC82: 0x9777, + 0xEC83: 0x9778, + 0xEC84: 0x9779, + 0xEC85: 0x977A, + 0xEC86: 0x977B, + 0xEC87: 0x977D, + 0xEC88: 0x977E, + 0xEC89: 0x977F, + 0xEC8A: 0x9780, + 0xEC8B: 0x9781, + 0xEC8C: 0x9782, + 0xEC8D: 0x9783, + 0xEC8E: 0x9784, + 0xEC8F: 0x9786, + 0xEC90: 0x9787, + 0xEC91: 0x9788, + 0xEC92: 0x9789, + 0xEC93: 0x978A, + 0xEC94: 0x978C, + 0xEC95: 0x978E, + 0xEC96: 0x978F, + 0xEC97: 0x9790, + 0xEC98: 0x9793, + 0xEC99: 0x9795, + 0xEC9A: 0x9796, + 0xEC9B: 0x9797, + 0xEC9C: 0x9799, + 0xEC9D: 0x979A, + 0xEC9E: 0x979B, + 0xEC9F: 0x979C, + 0xECA0: 0x979D, + 0xECA1: 0x81C1, + 0xECA2: 0x81A6, + 0xECA3: 0x6B24, + 0xECA4: 0x6B37, + 0xECA5: 0x6B39, + 0xECA6: 0x6B43, + 0xECA7: 0x6B46, + 0xECA8: 0x6B59, + 0xECA9: 0x98D1, + 0xECAA: 0x98D2, + 0xECAB: 0x98D3, + 0xECAC: 0x98D5, + 0xECAD: 0x98D9, + 0xECAE: 0x98DA, + 0xECAF: 0x6BB3, + 0xECB0: 0x5F40, + 0xECB1: 0x6BC2, + 0xECB2: 0x89F3, + 0xECB3: 0x6590, + 0xECB4: 0x9F51, + 0xECB5: 0x6593, + 0xECB6: 0x65BC, + 0xECB7: 0x65C6, + 0xECB8: 0x65C4, + 0xECB9: 0x65C3, + 0xECBA: 0x65CC, + 0xECBB: 0x65CE, + 0xECBC: 0x65D2, + 0xECBD: 0x65D6, + 0xECBE: 0x7080, + 0xECBF: 0x709C, + 0xECC0: 0x7096, + 0xECC1: 0x709D, + 0xECC2: 0x70BB, + 0xECC3: 0x70C0, + 0xECC4: 0x70B7, + 0xECC5: 0x70AB, + 0xECC6: 0x70B1, + 0xECC7: 0x70E8, + 0xECC8: 0x70CA, + 0xECC9: 0x7110, + 0xECCA: 0x7113, + 0xECCB: 0x7116, + 0xECCC: 0x712F, + 0xECCD: 0x7131, + 0xECCE: 0x7173, + 0xECCF: 0x715C, + 0xECD0: 0x7168, + 0xECD1: 0x7145, + 0xECD2: 0x7172, + 0xECD3: 0x714A, + 0xECD4: 0x7178, + 0xECD5: 0x717A, + 0xECD6: 0x7198, + 0xECD7: 0x71B3, + 0xECD8: 0x71B5, + 0xECD9: 0x71A8, + 0xECDA: 0x71A0, + 0xECDB: 0x71E0, + 0xECDC: 0x71D4, + 0xECDD: 0x71E7, + 0xECDE: 0x71F9, + 0xECDF: 0x721D, + 0xECE0: 0x7228, + 0xECE1: 0x706C, + 0xECE2: 0x7118, + 0xECE3: 0x7166, + 0xECE4: 0x71B9, + 0xECE5: 0x623E, + 0xECE6: 0x623D, + 0xECE7: 0x6243, + 0xECE8: 0x6248, + 0xECE9: 0x6249, + 0xECEA: 0x793B, + 0xECEB: 0x7940, + 0xECEC: 0x7946, + 0xECED: 0x7949, + 0xECEE: 0x795B, + 0xECEF: 0x795C, + 0xECF0: 0x7953, + 0xECF1: 0x795A, + 0xECF2: 0x7962, + 0xECF3: 0x7957, + 0xECF4: 0x7960, + 0xECF5: 0x796F, + 0xECF6: 0x7967, + 0xECF7: 0x797A, + 0xECF8: 0x7985, + 0xECF9: 0x798A, + 0xECFA: 0x799A, + 0xECFB: 0x79A7, + 0xECFC: 0x79B3, + 0xECFD: 0x5FD1, + 0xECFE: 0x5FD0, + 0xED40: 0x979E, + 0xED41: 0x979F, + 0xED42: 0x97A1, + 0xED43: 0x97A2, + 0xED44: 0x97A4, + 0xED45: 0x97A5, + 0xED46: 0x97A6, + 0xED47: 0x97A7, + 0xED48: 0x97A8, + 0xED49: 0x97A9, + 0xED4A: 0x97AA, + 0xED4B: 0x97AC, + 0xED4C: 0x97AE, + 0xED4D: 0x97B0, + 0xED4E: 0x97B1, + 0xED4F: 0x97B3, + 0xED50: 0x97B5, + 0xED51: 0x97B6, + 0xED52: 0x97B7, + 0xED53: 0x97B8, + 0xED54: 0x97B9, + 0xED55: 0x97BA, + 0xED56: 0x97BB, + 0xED57: 0x97BC, + 0xED58: 0x97BD, + 0xED59: 0x97BE, + 0xED5A: 0x97BF, + 0xED5B: 0x97C0, + 0xED5C: 0x97C1, + 0xED5D: 0x97C2, + 0xED5E: 0x97C3, + 0xED5F: 0x97C4, + 0xED60: 0x97C5, + 0xED61: 0x97C6, + 0xED62: 0x97C7, + 0xED63: 0x97C8, + 0xED64: 0x97C9, + 0xED65: 0x97CA, + 0xED66: 0x97CB, + 0xED67: 0x97CC, + 0xED68: 0x97CD, + 0xED69: 0x97CE, + 0xED6A: 0x97CF, + 0xED6B: 0x97D0, + 0xED6C: 0x97D1, + 0xED6D: 0x97D2, + 0xED6E: 0x97D3, + 0xED6F: 0x97D4, + 0xED70: 0x97D5, + 0xED71: 0x97D6, + 0xED72: 0x97D7, + 0xED73: 0x97D8, + 0xED74: 0x97D9, + 0xED75: 0x97DA, + 0xED76: 0x97DB, + 0xED77: 0x97DC, + 0xED78: 0x97DD, + 0xED79: 0x97DE, + 0xED7A: 0x97DF, + 0xED7B: 0x97E0, + 0xED7C: 0x97E1, + 0xED7D: 0x97E2, + 0xED7E: 0x97E3, + 0xED80: 0x97E4, + 0xED81: 0x97E5, + 0xED82: 0x97E8, + 0xED83: 0x97EE, + 0xED84: 0x97EF, + 0xED85: 0x97F0, + 0xED86: 0x97F1, + 0xED87: 0x97F2, + 0xED88: 0x97F4, + 0xED89: 0x97F7, + 0xED8A: 0x97F8, + 0xED8B: 0x97F9, + 0xED8C: 0x97FA, + 0xED8D: 0x97FB, + 0xED8E: 0x97FC, + 0xED8F: 0x97FD, + 0xED90: 0x97FE, + 0xED91: 0x97FF, + 0xED92: 0x9800, + 0xED93: 0x9801, + 0xED94: 0x9802, + 0xED95: 0x9803, + 0xED96: 0x9804, + 0xED97: 0x9805, + 0xED98: 0x9806, + 0xED99: 0x9807, + 0xED9A: 0x9808, + 0xED9B: 0x9809, + 0xED9C: 0x980A, + 0xED9D: 0x980B, + 0xED9E: 0x980C, + 0xED9F: 0x980D, + 0xEDA0: 0x980E, + 0xEDA1: 0x603C, + 0xEDA2: 0x605D, + 0xEDA3: 0x605A, + 0xEDA4: 0x6067, + 0xEDA5: 0x6041, + 0xEDA6: 0x6059, + 0xEDA7: 0x6063, + 0xEDA8: 0x60AB, + 0xEDA9: 0x6106, + 0xEDAA: 0x610D, + 0xEDAB: 0x615D, + 0xEDAC: 0x61A9, + 0xEDAD: 0x619D, + 0xEDAE: 0x61CB, + 0xEDAF: 0x61D1, + 0xEDB0: 0x6206, + 0xEDB1: 0x8080, + 0xEDB2: 0x807F, + 0xEDB3: 0x6C93, + 0xEDB4: 0x6CF6, + 0xEDB5: 0x6DFC, + 0xEDB6: 0x77F6, + 0xEDB7: 0x77F8, + 0xEDB8: 0x7800, + 0xEDB9: 0x7809, + 0xEDBA: 0x7817, + 0xEDBB: 0x7818, + 0xEDBC: 0x7811, + 0xEDBD: 0x65AB, + 0xEDBE: 0x782D, + 0xEDBF: 0x781C, + 0xEDC0: 0x781D, + 0xEDC1: 0x7839, + 0xEDC2: 0x783A, + 0xEDC3: 0x783B, + 0xEDC4: 0x781F, + 0xEDC5: 0x783C, + 0xEDC6: 0x7825, + 0xEDC7: 0x782C, + 0xEDC8: 0x7823, + 0xEDC9: 0x7829, + 0xEDCA: 0x784E, + 0xEDCB: 0x786D, + 0xEDCC: 0x7856, + 0xEDCD: 0x7857, + 0xEDCE: 0x7826, + 0xEDCF: 0x7850, + 0xEDD0: 0x7847, + 0xEDD1: 0x784C, + 0xEDD2: 0x786A, + 0xEDD3: 0x789B, + 0xEDD4: 0x7893, + 0xEDD5: 0x789A, + 0xEDD6: 0x7887, + 0xEDD7: 0x789C, + 0xEDD8: 0x78A1, + 0xEDD9: 0x78A3, + 0xEDDA: 0x78B2, + 0xEDDB: 0x78B9, + 0xEDDC: 0x78A5, + 0xEDDD: 0x78D4, + 0xEDDE: 0x78D9, + 0xEDDF: 0x78C9, + 0xEDE0: 0x78EC, + 0xEDE1: 0x78F2, + 0xEDE2: 0x7905, + 0xEDE3: 0x78F4, + 0xEDE4: 0x7913, + 0xEDE5: 0x7924, + 0xEDE6: 0x791E, + 0xEDE7: 0x7934, + 0xEDE8: 0x9F9B, + 0xEDE9: 0x9EF9, + 0xEDEA: 0x9EFB, + 0xEDEB: 0x9EFC, + 0xEDEC: 0x76F1, + 0xEDED: 0x7704, + 0xEDEE: 0x770D, + 0xEDEF: 0x76F9, + 0xEDF0: 0x7707, + 0xEDF1: 0x7708, + 0xEDF2: 0x771A, + 0xEDF3: 0x7722, + 0xEDF4: 0x7719, + 0xEDF5: 0x772D, + 0xEDF6: 0x7726, + 0xEDF7: 0x7735, + 0xEDF8: 0x7738, + 0xEDF9: 0x7750, + 0xEDFA: 0x7751, + 0xEDFB: 0x7747, + 0xEDFC: 0x7743, + 0xEDFD: 0x775A, + 0xEDFE: 0x7768, + 0xEE40: 0x980F, + 0xEE41: 0x9810, + 0xEE42: 0x9811, + 0xEE43: 0x9812, + 0xEE44: 0x9813, + 0xEE45: 0x9814, + 0xEE46: 0x9815, + 0xEE47: 0x9816, + 0xEE48: 0x9817, + 0xEE49: 0x9818, + 0xEE4A: 0x9819, + 0xEE4B: 0x981A, + 0xEE4C: 0x981B, + 0xEE4D: 0x981C, + 0xEE4E: 0x981D, + 0xEE4F: 0x981E, + 0xEE50: 0x981F, + 0xEE51: 0x9820, + 0xEE52: 0x9821, + 0xEE53: 0x9822, + 0xEE54: 0x9823, + 0xEE55: 0x9824, + 0xEE56: 0x9825, + 0xEE57: 0x9826, + 0xEE58: 0x9827, + 0xEE59: 0x9828, + 0xEE5A: 0x9829, + 0xEE5B: 0x982A, + 0xEE5C: 0x982B, + 0xEE5D: 0x982C, + 0xEE5E: 0x982D, + 0xEE5F: 0x982E, + 0xEE60: 0x982F, + 0xEE61: 0x9830, + 0xEE62: 0x9831, + 0xEE63: 0x9832, + 0xEE64: 0x9833, + 0xEE65: 0x9834, + 0xEE66: 0x9835, + 0xEE67: 0x9836, + 0xEE68: 0x9837, + 0xEE69: 0x9838, + 0xEE6A: 0x9839, + 0xEE6B: 0x983A, + 0xEE6C: 0x983B, + 0xEE6D: 0x983C, + 0xEE6E: 0x983D, + 0xEE6F: 0x983E, + 0xEE70: 0x983F, + 0xEE71: 0x9840, + 0xEE72: 0x9841, + 0xEE73: 0x9842, + 0xEE74: 0x9843, + 0xEE75: 0x9844, + 0xEE76: 0x9845, + 0xEE77: 0x9846, + 0xEE78: 0x9847, + 0xEE79: 0x9848, + 0xEE7A: 0x9849, + 0xEE7B: 0x984A, + 0xEE7C: 0x984B, + 0xEE7D: 0x984C, + 0xEE7E: 0x984D, + 0xEE80: 0x984E, + 0xEE81: 0x984F, + 0xEE82: 0x9850, + 0xEE83: 0x9851, + 0xEE84: 0x9852, + 0xEE85: 0x9853, + 0xEE86: 0x9854, + 0xEE87: 0x9855, + 0xEE88: 0x9856, + 0xEE89: 0x9857, + 0xEE8A: 0x9858, + 0xEE8B: 0x9859, + 0xEE8C: 0x985A, + 0xEE8D: 0x985B, + 0xEE8E: 0x985C, + 0xEE8F: 0x985D, + 0xEE90: 0x985E, + 0xEE91: 0x985F, + 0xEE92: 0x9860, + 0xEE93: 0x9861, + 0xEE94: 0x9862, + 0xEE95: 0x9863, + 0xEE96: 0x9864, + 0xEE97: 0x9865, + 0xEE98: 0x9866, + 0xEE99: 0x9867, + 0xEE9A: 0x9868, + 0xEE9B: 0x9869, + 0xEE9C: 0x986A, + 0xEE9D: 0x986B, + 0xEE9E: 0x986C, + 0xEE9F: 0x986D, + 0xEEA0: 0x986E, + 0xEEA1: 0x7762, + 0xEEA2: 0x7765, + 0xEEA3: 0x777F, + 0xEEA4: 0x778D, + 0xEEA5: 0x777D, + 0xEEA6: 0x7780, + 0xEEA7: 0x778C, + 0xEEA8: 0x7791, + 0xEEA9: 0x779F, + 0xEEAA: 0x77A0, + 0xEEAB: 0x77B0, + 0xEEAC: 0x77B5, + 0xEEAD: 0x77BD, + 0xEEAE: 0x753A, + 0xEEAF: 0x7540, + 0xEEB0: 0x754E, + 0xEEB1: 0x754B, + 0xEEB2: 0x7548, + 0xEEB3: 0x755B, + 0xEEB4: 0x7572, + 0xEEB5: 0x7579, + 0xEEB6: 0x7583, + 0xEEB7: 0x7F58, + 0xEEB8: 0x7F61, + 0xEEB9: 0x7F5F, + 0xEEBA: 0x8A48, + 0xEEBB: 0x7F68, + 0xEEBC: 0x7F74, + 0xEEBD: 0x7F71, + 0xEEBE: 0x7F79, + 0xEEBF: 0x7F81, + 0xEEC0: 0x7F7E, + 0xEEC1: 0x76CD, + 0xEEC2: 0x76E5, + 0xEEC3: 0x8832, + 0xEEC4: 0x9485, + 0xEEC5: 0x9486, + 0xEEC6: 0x9487, + 0xEEC7: 0x948B, + 0xEEC8: 0x948A, + 0xEEC9: 0x948C, + 0xEECA: 0x948D, + 0xEECB: 0x948F, + 0xEECC: 0x9490, + 0xEECD: 0x9494, + 0xEECE: 0x9497, + 0xEECF: 0x9495, + 0xEED0: 0x949A, + 0xEED1: 0x949B, + 0xEED2: 0x949C, + 0xEED3: 0x94A3, + 0xEED4: 0x94A4, + 0xEED5: 0x94AB, + 0xEED6: 0x94AA, + 0xEED7: 0x94AD, + 0xEED8: 0x94AC, + 0xEED9: 0x94AF, + 0xEEDA: 0x94B0, + 0xEEDB: 0x94B2, + 0xEEDC: 0x94B4, + 0xEEDD: 0x94B6, + 0xEEDE: 0x94B7, + 0xEEDF: 0x94B8, + 0xEEE0: 0x94B9, + 0xEEE1: 0x94BA, + 0xEEE2: 0x94BC, + 0xEEE3: 0x94BD, + 0xEEE4: 0x94BF, + 0xEEE5: 0x94C4, + 0xEEE6: 0x94C8, + 0xEEE7: 0x94C9, + 0xEEE8: 0x94CA, + 0xEEE9: 0x94CB, + 0xEEEA: 0x94CC, + 0xEEEB: 0x94CD, + 0xEEEC: 0x94CE, + 0xEEED: 0x94D0, + 0xEEEE: 0x94D1, + 0xEEEF: 0x94D2, + 0xEEF0: 0x94D5, + 0xEEF1: 0x94D6, + 0xEEF2: 0x94D7, + 0xEEF3: 0x94D9, + 0xEEF4: 0x94D8, + 0xEEF5: 0x94DB, + 0xEEF6: 0x94DE, + 0xEEF7: 0x94DF, + 0xEEF8: 0x94E0, + 0xEEF9: 0x94E2, + 0xEEFA: 0x94E4, + 0xEEFB: 0x94E5, + 0xEEFC: 0x94E7, + 0xEEFD: 0x94E8, + 0xEEFE: 0x94EA, + 0xEF40: 0x986F, + 0xEF41: 0x9870, + 0xEF42: 0x9871, + 0xEF43: 0x9872, + 0xEF44: 0x9873, + 0xEF45: 0x9874, + 0xEF46: 0x988B, + 0xEF47: 0x988E, + 0xEF48: 0x9892, + 0xEF49: 0x9895, + 0xEF4A: 0x9899, + 0xEF4B: 0x98A3, + 0xEF4C: 0x98A8, + 0xEF4D: 0x98A9, + 0xEF4E: 0x98AA, + 0xEF4F: 0x98AB, + 0xEF50: 0x98AC, + 0xEF51: 0x98AD, + 0xEF52: 0x98AE, + 0xEF53: 0x98AF, + 0xEF54: 0x98B0, + 0xEF55: 0x98B1, + 0xEF56: 0x98B2, + 0xEF57: 0x98B3, + 0xEF58: 0x98B4, + 0xEF59: 0x98B5, + 0xEF5A: 0x98B6, + 0xEF5B: 0x98B7, + 0xEF5C: 0x98B8, + 0xEF5D: 0x98B9, + 0xEF5E: 0x98BA, + 0xEF5F: 0x98BB, + 0xEF60: 0x98BC, + 0xEF61: 0x98BD, + 0xEF62: 0x98BE, + 0xEF63: 0x98BF, + 0xEF64: 0x98C0, + 0xEF65: 0x98C1, + 0xEF66: 0x98C2, + 0xEF67: 0x98C3, + 0xEF68: 0x98C4, + 0xEF69: 0x98C5, + 0xEF6A: 0x98C6, + 0xEF6B: 0x98C7, + 0xEF6C: 0x98C8, + 0xEF6D: 0x98C9, + 0xEF6E: 0x98CA, + 0xEF6F: 0x98CB, + 0xEF70: 0x98CC, + 0xEF71: 0x98CD, + 0xEF72: 0x98CF, + 0xEF73: 0x98D0, + 0xEF74: 0x98D4, + 0xEF75: 0x98D6, + 0xEF76: 0x98D7, + 0xEF77: 0x98DB, + 0xEF78: 0x98DC, + 0xEF79: 0x98DD, + 0xEF7A: 0x98E0, + 0xEF7B: 0x98E1, + 0xEF7C: 0x98E2, + 0xEF7D: 0x98E3, + 0xEF7E: 0x98E4, + 0xEF80: 0x98E5, + 0xEF81: 0x98E6, + 0xEF82: 0x98E9, + 0xEF83: 0x98EA, + 0xEF84: 0x98EB, + 0xEF85: 0x98EC, + 0xEF86: 0x98ED, + 0xEF87: 0x98EE, + 0xEF88: 0x98EF, + 0xEF89: 0x98F0, + 0xEF8A: 0x98F1, + 0xEF8B: 0x98F2, + 0xEF8C: 0x98F3, + 0xEF8D: 0x98F4, + 0xEF8E: 0x98F5, + 0xEF8F: 0x98F6, + 0xEF90: 0x98F7, + 0xEF91: 0x98F8, + 0xEF92: 0x98F9, + 0xEF93: 0x98FA, + 0xEF94: 0x98FB, + 0xEF95: 0x98FC, + 0xEF96: 0x98FD, + 0xEF97: 0x98FE, + 0xEF98: 0x98FF, + 0xEF99: 0x9900, + 0xEF9A: 0x9901, + 0xEF9B: 0x9902, + 0xEF9C: 0x9903, + 0xEF9D: 0x9904, + 0xEF9E: 0x9905, + 0xEF9F: 0x9906, + 0xEFA0: 0x9907, + 0xEFA1: 0x94E9, + 0xEFA2: 0x94EB, + 0xEFA3: 0x94EE, + 0xEFA4: 0x94EF, + 0xEFA5: 0x94F3, + 0xEFA6: 0x94F4, + 0xEFA7: 0x94F5, + 0xEFA8: 0x94F7, + 0xEFA9: 0x94F9, + 0xEFAA: 0x94FC, + 0xEFAB: 0x94FD, + 0xEFAC: 0x94FF, + 0xEFAD: 0x9503, + 0xEFAE: 0x9502, + 0xEFAF: 0x9506, + 0xEFB0: 0x9507, + 0xEFB1: 0x9509, + 0xEFB2: 0x950A, + 0xEFB3: 0x950D, + 0xEFB4: 0x950E, + 0xEFB5: 0x950F, + 0xEFB6: 0x9512, + 0xEFB7: 0x9513, + 0xEFB8: 0x9514, + 0xEFB9: 0x9515, + 0xEFBA: 0x9516, + 0xEFBB: 0x9518, + 0xEFBC: 0x951B, + 0xEFBD: 0x951D, + 0xEFBE: 0x951E, + 0xEFBF: 0x951F, + 0xEFC0: 0x9522, + 0xEFC1: 0x952A, + 0xEFC2: 0x952B, + 0xEFC3: 0x9529, + 0xEFC4: 0x952C, + 0xEFC5: 0x9531, + 0xEFC6: 0x9532, + 0xEFC7: 0x9534, + 0xEFC8: 0x9536, + 0xEFC9: 0x9537, + 0xEFCA: 0x9538, + 0xEFCB: 0x953C, + 0xEFCC: 0x953E, + 0xEFCD: 0x953F, + 0xEFCE: 0x9542, + 0xEFCF: 0x9535, + 0xEFD0: 0x9544, + 0xEFD1: 0x9545, + 0xEFD2: 0x9546, + 0xEFD3: 0x9549, + 0xEFD4: 0x954C, + 0xEFD5: 0x954E, + 0xEFD6: 0x954F, + 0xEFD7: 0x9552, + 0xEFD8: 0x9553, + 0xEFD9: 0x9554, + 0xEFDA: 0x9556, + 0xEFDB: 0x9557, + 0xEFDC: 0x9558, + 0xEFDD: 0x9559, + 0xEFDE: 0x955B, + 0xEFDF: 0x955E, + 0xEFE0: 0x955F, + 0xEFE1: 0x955D, + 0xEFE2: 0x9561, + 0xEFE3: 0x9562, + 0xEFE4: 0x9564, + 0xEFE5: 0x9565, + 0xEFE6: 0x9566, + 0xEFE7: 0x9567, + 0xEFE8: 0x9568, + 0xEFE9: 0x9569, + 0xEFEA: 0x956A, + 0xEFEB: 0x956B, + 0xEFEC: 0x956C, + 0xEFED: 0x956F, + 0xEFEE: 0x9571, + 0xEFEF: 0x9572, + 0xEFF0: 0x9573, + 0xEFF1: 0x953A, + 0xEFF2: 0x77E7, + 0xEFF3: 0x77EC, + 0xEFF4: 0x96C9, + 0xEFF5: 0x79D5, + 0xEFF6: 0x79ED, + 0xEFF7: 0x79E3, + 0xEFF8: 0x79EB, + 0xEFF9: 0x7A06, + 0xEFFA: 0x5D47, + 0xEFFB: 0x7A03, + 0xEFFC: 0x7A02, + 0xEFFD: 0x7A1E, + 0xEFFE: 0x7A14, + 0xF040: 0x9908, + 0xF041: 0x9909, + 0xF042: 0x990A, + 0xF043: 0x990B, + 0xF044: 0x990C, + 0xF045: 0x990E, + 0xF046: 0x990F, + 0xF047: 0x9911, + 0xF048: 0x9912, + 0xF049: 0x9913, + 0xF04A: 0x9914, + 0xF04B: 0x9915, + 0xF04C: 0x9916, + 0xF04D: 0x9917, + 0xF04E: 0x9918, + 0xF04F: 0x9919, + 0xF050: 0x991A, + 0xF051: 0x991B, + 0xF052: 0x991C, + 0xF053: 0x991D, + 0xF054: 0x991E, + 0xF055: 0x991F, + 0xF056: 0x9920, + 0xF057: 0x9921, + 0xF058: 0x9922, + 0xF059: 0x9923, + 0xF05A: 0x9924, + 0xF05B: 0x9925, + 0xF05C: 0x9926, + 0xF05D: 0x9927, + 0xF05E: 0x9928, + 0xF05F: 0x9929, + 0xF060: 0x992A, + 0xF061: 0x992B, + 0xF062: 0x992C, + 0xF063: 0x992D, + 0xF064: 0x992F, + 0xF065: 0x9930, + 0xF066: 0x9931, + 0xF067: 0x9932, + 0xF068: 0x9933, + 0xF069: 0x9934, + 0xF06A: 0x9935, + 0xF06B: 0x9936, + 0xF06C: 0x9937, + 0xF06D: 0x9938, + 0xF06E: 0x9939, + 0xF06F: 0x993A, + 0xF070: 0x993B, + 0xF071: 0x993C, + 0xF072: 0x993D, + 0xF073: 0x993E, + 0xF074: 0x993F, + 0xF075: 0x9940, + 0xF076: 0x9941, + 0xF077: 0x9942, + 0xF078: 0x9943, + 0xF079: 0x9944, + 0xF07A: 0x9945, + 0xF07B: 0x9946, + 0xF07C: 0x9947, + 0xF07D: 0x9948, + 0xF07E: 0x9949, + 0xF080: 0x994A, + 0xF081: 0x994B, + 0xF082: 0x994C, + 0xF083: 0x994D, + 0xF084: 0x994E, + 0xF085: 0x994F, + 0xF086: 0x9950, + 0xF087: 0x9951, + 0xF088: 0x9952, + 0xF089: 0x9953, + 0xF08A: 0x9956, + 0xF08B: 0x9957, + 0xF08C: 0x9958, + 0xF08D: 0x9959, + 0xF08E: 0x995A, + 0xF08F: 0x995B, + 0xF090: 0x995C, + 0xF091: 0x995D, + 0xF092: 0x995E, + 0xF093: 0x995F, + 0xF094: 0x9960, + 0xF095: 0x9961, + 0xF096: 0x9962, + 0xF097: 0x9964, + 0xF098: 0x9966, + 0xF099: 0x9973, + 0xF09A: 0x9978, + 0xF09B: 0x9979, + 0xF09C: 0x997B, + 0xF09D: 0x997E, + 0xF09E: 0x9982, + 0xF09F: 0x9983, + 0xF0A0: 0x9989, + 0xF0A1: 0x7A39, + 0xF0A2: 0x7A37, + 0xF0A3: 0x7A51, + 0xF0A4: 0x9ECF, + 0xF0A5: 0x99A5, + 0xF0A6: 0x7A70, + 0xF0A7: 0x7688, + 0xF0A8: 0x768E, + 0xF0A9: 0x7693, + 0xF0AA: 0x7699, + 0xF0AB: 0x76A4, + 0xF0AC: 0x74DE, + 0xF0AD: 0x74E0, + 0xF0AE: 0x752C, + 0xF0AF: 0x9E20, + 0xF0B0: 0x9E22, + 0xF0B1: 0x9E28, + 0xF0B2: 0x9E29, + 0xF0B3: 0x9E2A, + 0xF0B4: 0x9E2B, + 0xF0B5: 0x9E2C, + 0xF0B6: 0x9E32, + 0xF0B7: 0x9E31, + 0xF0B8: 0x9E36, + 0xF0B9: 0x9E38, + 0xF0BA: 0x9E37, + 0xF0BB: 0x9E39, + 0xF0BC: 0x9E3A, + 0xF0BD: 0x9E3E, + 0xF0BE: 0x9E41, + 0xF0BF: 0x9E42, + 0xF0C0: 0x9E44, + 0xF0C1: 0x9E46, + 0xF0C2: 0x9E47, + 0xF0C3: 0x9E48, + 0xF0C4: 0x9E49, + 0xF0C5: 0x9E4B, + 0xF0C6: 0x9E4C, + 0xF0C7: 0x9E4E, + 0xF0C8: 0x9E51, + 0xF0C9: 0x9E55, + 0xF0CA: 0x9E57, + 0xF0CB: 0x9E5A, + 0xF0CC: 0x9E5B, + 0xF0CD: 0x9E5C, + 0xF0CE: 0x9E5E, + 0xF0CF: 0x9E63, + 0xF0D0: 0x9E66, + 0xF0D1: 0x9E67, + 0xF0D2: 0x9E68, + 0xF0D3: 0x9E69, + 0xF0D4: 0x9E6A, + 0xF0D5: 0x9E6B, + 0xF0D6: 0x9E6C, + 0xF0D7: 0x9E71, + 0xF0D8: 0x9E6D, + 0xF0D9: 0x9E73, + 0xF0DA: 0x7592, + 0xF0DB: 0x7594, + 0xF0DC: 0x7596, + 0xF0DD: 0x75A0, + 0xF0DE: 0x759D, + 0xF0DF: 0x75AC, + 0xF0E0: 0x75A3, + 0xF0E1: 0x75B3, + 0xF0E2: 0x75B4, + 0xF0E3: 0x75B8, + 0xF0E4: 0x75C4, + 0xF0E5: 0x75B1, + 0xF0E6: 0x75B0, + 0xF0E7: 0x75C3, + 0xF0E8: 0x75C2, + 0xF0E9: 0x75D6, + 0xF0EA: 0x75CD, + 0xF0EB: 0x75E3, + 0xF0EC: 0x75E8, + 0xF0ED: 0x75E6, + 0xF0EE: 0x75E4, + 0xF0EF: 0x75EB, + 0xF0F0: 0x75E7, + 0xF0F1: 0x7603, + 0xF0F2: 0x75F1, + 0xF0F3: 0x75FC, + 0xF0F4: 0x75FF, + 0xF0F5: 0x7610, + 0xF0F6: 0x7600, + 0xF0F7: 0x7605, + 0xF0F8: 0x760C, + 0xF0F9: 0x7617, + 0xF0FA: 0x760A, + 0xF0FB: 0x7625, + 0xF0FC: 0x7618, + 0xF0FD: 0x7615, + 0xF0FE: 0x7619, + 0xF140: 0x998C, + 0xF141: 0x998E, + 0xF142: 0x999A, + 0xF143: 0x999B, + 0xF144: 0x999C, + 0xF145: 0x999D, + 0xF146: 0x999E, + 0xF147: 0x999F, + 0xF148: 0x99A0, + 0xF149: 0x99A1, + 0xF14A: 0x99A2, + 0xF14B: 0x99A3, + 0xF14C: 0x99A4, + 0xF14D: 0x99A6, + 0xF14E: 0x99A7, + 0xF14F: 0x99A9, + 0xF150: 0x99AA, + 0xF151: 0x99AB, + 0xF152: 0x99AC, + 0xF153: 0x99AD, + 0xF154: 0x99AE, + 0xF155: 0x99AF, + 0xF156: 0x99B0, + 0xF157: 0x99B1, + 0xF158: 0x99B2, + 0xF159: 0x99B3, + 0xF15A: 0x99B4, + 0xF15B: 0x99B5, + 0xF15C: 0x99B6, + 0xF15D: 0x99B7, + 0xF15E: 0x99B8, + 0xF15F: 0x99B9, + 0xF160: 0x99BA, + 0xF161: 0x99BB, + 0xF162: 0x99BC, + 0xF163: 0x99BD, + 0xF164: 0x99BE, + 0xF165: 0x99BF, + 0xF166: 0x99C0, + 0xF167: 0x99C1, + 0xF168: 0x99C2, + 0xF169: 0x99C3, + 0xF16A: 0x99C4, + 0xF16B: 0x99C5, + 0xF16C: 0x99C6, + 0xF16D: 0x99C7, + 0xF16E: 0x99C8, + 0xF16F: 0x99C9, + 0xF170: 0x99CA, + 0xF171: 0x99CB, + 0xF172: 0x99CC, + 0xF173: 0x99CD, + 0xF174: 0x99CE, + 0xF175: 0x99CF, + 0xF176: 0x99D0, + 0xF177: 0x99D1, + 0xF178: 0x99D2, + 0xF179: 0x99D3, + 0xF17A: 0x99D4, + 0xF17B: 0x99D5, + 0xF17C: 0x99D6, + 0xF17D: 0x99D7, + 0xF17E: 0x99D8, + 0xF180: 0x99D9, + 0xF181: 0x99DA, + 0xF182: 0x99DB, + 0xF183: 0x99DC, + 0xF184: 0x99DD, + 0xF185: 0x99DE, + 0xF186: 0x99DF, + 0xF187: 0x99E0, + 0xF188: 0x99E1, + 0xF189: 0x99E2, + 0xF18A: 0x99E3, + 0xF18B: 0x99E4, + 0xF18C: 0x99E5, + 0xF18D: 0x99E6, + 0xF18E: 0x99E7, + 0xF18F: 0x99E8, + 0xF190: 0x99E9, + 0xF191: 0x99EA, + 0xF192: 0x99EB, + 0xF193: 0x99EC, + 0xF194: 0x99ED, + 0xF195: 0x99EE, + 0xF196: 0x99EF, + 0xF197: 0x99F0, + 0xF198: 0x99F1, + 0xF199: 0x99F2, + 0xF19A: 0x99F3, + 0xF19B: 0x99F4, + 0xF19C: 0x99F5, + 0xF19D: 0x99F6, + 0xF19E: 0x99F7, + 0xF19F: 0x99F8, + 0xF1A0: 0x99F9, + 0xF1A1: 0x761B, + 0xF1A2: 0x763C, + 0xF1A3: 0x7622, + 0xF1A4: 0x7620, + 0xF1A5: 0x7640, + 0xF1A6: 0x762D, + 0xF1A7: 0x7630, + 0xF1A8: 0x763F, + 0xF1A9: 0x7635, + 0xF1AA: 0x7643, + 0xF1AB: 0x763E, + 0xF1AC: 0x7633, + 0xF1AD: 0x764D, + 0xF1AE: 0x765E, + 0xF1AF: 0x7654, + 0xF1B0: 0x765C, + 0xF1B1: 0x7656, + 0xF1B2: 0x766B, + 0xF1B3: 0x766F, + 0xF1B4: 0x7FCA, + 0xF1B5: 0x7AE6, + 0xF1B6: 0x7A78, + 0xF1B7: 0x7A79, + 0xF1B8: 0x7A80, + 0xF1B9: 0x7A86, + 0xF1BA: 0x7A88, + 0xF1BB: 0x7A95, + 0xF1BC: 0x7AA6, + 0xF1BD: 0x7AA0, + 0xF1BE: 0x7AAC, + 0xF1BF: 0x7AA8, + 0xF1C0: 0x7AAD, + 0xF1C1: 0x7AB3, + 0xF1C2: 0x8864, + 0xF1C3: 0x8869, + 0xF1C4: 0x8872, + 0xF1C5: 0x887D, + 0xF1C6: 0x887F, + 0xF1C7: 0x8882, + 0xF1C8: 0x88A2, + 0xF1C9: 0x88C6, + 0xF1CA: 0x88B7, + 0xF1CB: 0x88BC, + 0xF1CC: 0x88C9, + 0xF1CD: 0x88E2, + 0xF1CE: 0x88CE, + 0xF1CF: 0x88E3, + 0xF1D0: 0x88E5, + 0xF1D1: 0x88F1, + 0xF1D2: 0x891A, + 0xF1D3: 0x88FC, + 0xF1D4: 0x88E8, + 0xF1D5: 0x88FE, + 0xF1D6: 0x88F0, + 0xF1D7: 0x8921, + 0xF1D8: 0x8919, + 0xF1D9: 0x8913, + 0xF1DA: 0x891B, + 0xF1DB: 0x890A, + 0xF1DC: 0x8934, + 0xF1DD: 0x892B, + 0xF1DE: 0x8936, + 0xF1DF: 0x8941, + 0xF1E0: 0x8966, + 0xF1E1: 0x897B, + 0xF1E2: 0x758B, + 0xF1E3: 0x80E5, + 0xF1E4: 0x76B2, + 0xF1E5: 0x76B4, + 0xF1E6: 0x77DC, + 0xF1E7: 0x8012, + 0xF1E8: 0x8014, + 0xF1E9: 0x8016, + 0xF1EA: 0x801C, + 0xF1EB: 0x8020, + 0xF1EC: 0x8022, + 0xF1ED: 0x8025, + 0xF1EE: 0x8026, + 0xF1EF: 0x8027, + 0xF1F0: 0x8029, + 0xF1F1: 0x8028, + 0xF1F2: 0x8031, + 0xF1F3: 0x800B, + 0xF1F4: 0x8035, + 0xF1F5: 0x8043, + 0xF1F6: 0x8046, + 0xF1F7: 0x804D, + 0xF1F8: 0x8052, + 0xF1F9: 0x8069, + 0xF1FA: 0x8071, + 0xF1FB: 0x8983, + 0xF1FC: 0x9878, + 0xF1FD: 0x9880, + 0xF1FE: 0x9883, + 0xF240: 0x99FA, + 0xF241: 0x99FB, + 0xF242: 0x99FC, + 0xF243: 0x99FD, + 0xF244: 0x99FE, + 0xF245: 0x99FF, + 0xF246: 0x9A00, + 0xF247: 0x9A01, + 0xF248: 0x9A02, + 0xF249: 0x9A03, + 0xF24A: 0x9A04, + 0xF24B: 0x9A05, + 0xF24C: 0x9A06, + 0xF24D: 0x9A07, + 0xF24E: 0x9A08, + 0xF24F: 0x9A09, + 0xF250: 0x9A0A, + 0xF251: 0x9A0B, + 0xF252: 0x9A0C, + 0xF253: 0x9A0D, + 0xF254: 0x9A0E, + 0xF255: 0x9A0F, + 0xF256: 0x9A10, + 0xF257: 0x9A11, + 0xF258: 0x9A12, + 0xF259: 0x9A13, + 0xF25A: 0x9A14, + 0xF25B: 0x9A15, + 0xF25C: 0x9A16, + 0xF25D: 0x9A17, + 0xF25E: 0x9A18, + 0xF25F: 0x9A19, + 0xF260: 0x9A1A, + 0xF261: 0x9A1B, + 0xF262: 0x9A1C, + 0xF263: 0x9A1D, + 0xF264: 0x9A1E, + 0xF265: 0x9A1F, + 0xF266: 0x9A20, + 0xF267: 0x9A21, + 0xF268: 0x9A22, + 0xF269: 0x9A23, + 0xF26A: 0x9A24, + 0xF26B: 0x9A25, + 0xF26C: 0x9A26, + 0xF26D: 0x9A27, + 0xF26E: 0x9A28, + 0xF26F: 0x9A29, + 0xF270: 0x9A2A, + 0xF271: 0x9A2B, + 0xF272: 0x9A2C, + 0xF273: 0x9A2D, + 0xF274: 0x9A2E, + 0xF275: 0x9A2F, + 0xF276: 0x9A30, + 0xF277: 0x9A31, + 0xF278: 0x9A32, + 0xF279: 0x9A33, + 0xF27A: 0x9A34, + 0xF27B: 0x9A35, + 0xF27C: 0x9A36, + 0xF27D: 0x9A37, + 0xF27E: 0x9A38, + 0xF280: 0x9A39, + 0xF281: 0x9A3A, + 0xF282: 0x9A3B, + 0xF283: 0x9A3C, + 0xF284: 0x9A3D, + 0xF285: 0x9A3E, + 0xF286: 0x9A3F, + 0xF287: 0x9A40, + 0xF288: 0x9A41, + 0xF289: 0x9A42, + 0xF28A: 0x9A43, + 0xF28B: 0x9A44, + 0xF28C: 0x9A45, + 0xF28D: 0x9A46, + 0xF28E: 0x9A47, + 0xF28F: 0x9A48, + 0xF290: 0x9A49, + 0xF291: 0x9A4A, + 0xF292: 0x9A4B, + 0xF293: 0x9A4C, + 0xF294: 0x9A4D, + 0xF295: 0x9A4E, + 0xF296: 0x9A4F, + 0xF297: 0x9A50, + 0xF298: 0x9A51, + 0xF299: 0x9A52, + 0xF29A: 0x9A53, + 0xF29B: 0x9A54, + 0xF29C: 0x9A55, + 0xF29D: 0x9A56, + 0xF29E: 0x9A57, + 0xF29F: 0x9A58, + 0xF2A0: 0x9A59, + 0xF2A1: 0x9889, + 0xF2A2: 0x988C, + 0xF2A3: 0x988D, + 0xF2A4: 0x988F, + 0xF2A5: 0x9894, + 0xF2A6: 0x989A, + 0xF2A7: 0x989B, + 0xF2A8: 0x989E, + 0xF2A9: 0x989F, + 0xF2AA: 0x98A1, + 0xF2AB: 0x98A2, + 0xF2AC: 0x98A5, + 0xF2AD: 0x98A6, + 0xF2AE: 0x864D, + 0xF2AF: 0x8654, + 0xF2B0: 0x866C, + 0xF2B1: 0x866E, + 0xF2B2: 0x867F, + 0xF2B3: 0x867A, + 0xF2B4: 0x867C, + 0xF2B5: 0x867B, + 0xF2B6: 0x86A8, + 0xF2B7: 0x868D, + 0xF2B8: 0x868B, + 0xF2B9: 0x86AC, + 0xF2BA: 0x869D, + 0xF2BB: 0x86A7, + 0xF2BC: 0x86A3, + 0xF2BD: 0x86AA, + 0xF2BE: 0x8693, + 0xF2BF: 0x86A9, + 0xF2C0: 0x86B6, + 0xF2C1: 0x86C4, + 0xF2C2: 0x86B5, + 0xF2C3: 0x86CE, + 0xF2C4: 0x86B0, + 0xF2C5: 0x86BA, + 0xF2C6: 0x86B1, + 0xF2C7: 0x86AF, + 0xF2C8: 0x86C9, + 0xF2C9: 0x86CF, + 0xF2CA: 0x86B4, + 0xF2CB: 0x86E9, + 0xF2CC: 0x86F1, + 0xF2CD: 0x86F2, + 0xF2CE: 0x86ED, + 0xF2CF: 0x86F3, + 0xF2D0: 0x86D0, + 0xF2D1: 0x8713, + 0xF2D2: 0x86DE, + 0xF2D3: 0x86F4, + 0xF2D4: 0x86DF, + 0xF2D5: 0x86D8, + 0xF2D6: 0x86D1, + 0xF2D7: 0x8703, + 0xF2D8: 0x8707, + 0xF2D9: 0x86F8, + 0xF2DA: 0x8708, + 0xF2DB: 0x870A, + 0xF2DC: 0x870D, + 0xF2DD: 0x8709, + 0xF2DE: 0x8723, + 0xF2DF: 0x873B, + 0xF2E0: 0x871E, + 0xF2E1: 0x8725, + 0xF2E2: 0x872E, + 0xF2E3: 0x871A, + 0xF2E4: 0x873E, + 0xF2E5: 0x8748, + 0xF2E6: 0x8734, + 0xF2E7: 0x8731, + 0xF2E8: 0x8729, + 0xF2E9: 0x8737, + 0xF2EA: 0x873F, + 0xF2EB: 0x8782, + 0xF2EC: 0x8722, + 0xF2ED: 0x877D, + 0xF2EE: 0x877E, + 0xF2EF: 0x877B, + 0xF2F0: 0x8760, + 0xF2F1: 0x8770, + 0xF2F2: 0x874C, + 0xF2F3: 0x876E, + 0xF2F4: 0x878B, + 0xF2F5: 0x8753, + 0xF2F6: 0x8763, + 0xF2F7: 0x877C, + 0xF2F8: 0x8764, + 0xF2F9: 0x8759, + 0xF2FA: 0x8765, + 0xF2FB: 0x8793, + 0xF2FC: 0x87AF, + 0xF2FD: 0x87A8, + 0xF2FE: 0x87D2, + 0xF340: 0x9A5A, + 0xF341: 0x9A5B, + 0xF342: 0x9A5C, + 0xF343: 0x9A5D, + 0xF344: 0x9A5E, + 0xF345: 0x9A5F, + 0xF346: 0x9A60, + 0xF347: 0x9A61, + 0xF348: 0x9A62, + 0xF349: 0x9A63, + 0xF34A: 0x9A64, + 0xF34B: 0x9A65, + 0xF34C: 0x9A66, + 0xF34D: 0x9A67, + 0xF34E: 0x9A68, + 0xF34F: 0x9A69, + 0xF350: 0x9A6A, + 0xF351: 0x9A6B, + 0xF352: 0x9A72, + 0xF353: 0x9A83, + 0xF354: 0x9A89, + 0xF355: 0x9A8D, + 0xF356: 0x9A8E, + 0xF357: 0x9A94, + 0xF358: 0x9A95, + 0xF359: 0x9A99, + 0xF35A: 0x9AA6, + 0xF35B: 0x9AA9, + 0xF35C: 0x9AAA, + 0xF35D: 0x9AAB, + 0xF35E: 0x9AAC, + 0xF35F: 0x9AAD, + 0xF360: 0x9AAE, + 0xF361: 0x9AAF, + 0xF362: 0x9AB2, + 0xF363: 0x9AB3, + 0xF364: 0x9AB4, + 0xF365: 0x9AB5, + 0xF366: 0x9AB9, + 0xF367: 0x9ABB, + 0xF368: 0x9ABD, + 0xF369: 0x9ABE, + 0xF36A: 0x9ABF, + 0xF36B: 0x9AC3, + 0xF36C: 0x9AC4, + 0xF36D: 0x9AC6, + 0xF36E: 0x9AC7, + 0xF36F: 0x9AC8, + 0xF370: 0x9AC9, + 0xF371: 0x9ACA, + 0xF372: 0x9ACD, + 0xF373: 0x9ACE, + 0xF374: 0x9ACF, + 0xF375: 0x9AD0, + 0xF376: 0x9AD2, + 0xF377: 0x9AD4, + 0xF378: 0x9AD5, + 0xF379: 0x9AD6, + 0xF37A: 0x9AD7, + 0xF37B: 0x9AD9, + 0xF37C: 0x9ADA, + 0xF37D: 0x9ADB, + 0xF37E: 0x9ADC, + 0xF380: 0x9ADD, + 0xF381: 0x9ADE, + 0xF382: 0x9AE0, + 0xF383: 0x9AE2, + 0xF384: 0x9AE3, + 0xF385: 0x9AE4, + 0xF386: 0x9AE5, + 0xF387: 0x9AE7, + 0xF388: 0x9AE8, + 0xF389: 0x9AE9, + 0xF38A: 0x9AEA, + 0xF38B: 0x9AEC, + 0xF38C: 0x9AEE, + 0xF38D: 0x9AF0, + 0xF38E: 0x9AF1, + 0xF38F: 0x9AF2, + 0xF390: 0x9AF3, + 0xF391: 0x9AF4, + 0xF392: 0x9AF5, + 0xF393: 0x9AF6, + 0xF394: 0x9AF7, + 0xF395: 0x9AF8, + 0xF396: 0x9AFA, + 0xF397: 0x9AFC, + 0xF398: 0x9AFD, + 0xF399: 0x9AFE, + 0xF39A: 0x9AFF, + 0xF39B: 0x9B00, + 0xF39C: 0x9B01, + 0xF39D: 0x9B02, + 0xF39E: 0x9B04, + 0xF39F: 0x9B05, + 0xF3A0: 0x9B06, + 0xF3A1: 0x87C6, + 0xF3A2: 0x8788, + 0xF3A3: 0x8785, + 0xF3A4: 0x87AD, + 0xF3A5: 0x8797, + 0xF3A6: 0x8783, + 0xF3A7: 0x87AB, + 0xF3A8: 0x87E5, + 0xF3A9: 0x87AC, + 0xF3AA: 0x87B5, + 0xF3AB: 0x87B3, + 0xF3AC: 0x87CB, + 0xF3AD: 0x87D3, + 0xF3AE: 0x87BD, + 0xF3AF: 0x87D1, + 0xF3B0: 0x87C0, + 0xF3B1: 0x87CA, + 0xF3B2: 0x87DB, + 0xF3B3: 0x87EA, + 0xF3B4: 0x87E0, + 0xF3B5: 0x87EE, + 0xF3B6: 0x8816, + 0xF3B7: 0x8813, + 0xF3B8: 0x87FE, + 0xF3B9: 0x880A, + 0xF3BA: 0x881B, + 0xF3BB: 0x8821, + 0xF3BC: 0x8839, + 0xF3BD: 0x883C, + 0xF3BE: 0x7F36, + 0xF3BF: 0x7F42, + 0xF3C0: 0x7F44, + 0xF3C1: 0x7F45, + 0xF3C2: 0x8210, + 0xF3C3: 0x7AFA, + 0xF3C4: 0x7AFD, + 0xF3C5: 0x7B08, + 0xF3C6: 0x7B03, + 0xF3C7: 0x7B04, + 0xF3C8: 0x7B15, + 0xF3C9: 0x7B0A, + 0xF3CA: 0x7B2B, + 0xF3CB: 0x7B0F, + 0xF3CC: 0x7B47, + 0xF3CD: 0x7B38, + 0xF3CE: 0x7B2A, + 0xF3CF: 0x7B19, + 0xF3D0: 0x7B2E, + 0xF3D1: 0x7B31, + 0xF3D2: 0x7B20, + 0xF3D3: 0x7B25, + 0xF3D4: 0x7B24, + 0xF3D5: 0x7B33, + 0xF3D6: 0x7B3E, + 0xF3D7: 0x7B1E, + 0xF3D8: 0x7B58, + 0xF3D9: 0x7B5A, + 0xF3DA: 0x7B45, + 0xF3DB: 0x7B75, + 0xF3DC: 0x7B4C, + 0xF3DD: 0x7B5D, + 0xF3DE: 0x7B60, + 0xF3DF: 0x7B6E, + 0xF3E0: 0x7B7B, + 0xF3E1: 0x7B62, + 0xF3E2: 0x7B72, + 0xF3E3: 0x7B71, + 0xF3E4: 0x7B90, + 0xF3E5: 0x7BA6, + 0xF3E6: 0x7BA7, + 0xF3E7: 0x7BB8, + 0xF3E8: 0x7BAC, + 0xF3E9: 0x7B9D, + 0xF3EA: 0x7BA8, + 0xF3EB: 0x7B85, + 0xF3EC: 0x7BAA, + 0xF3ED: 0x7B9C, + 0xF3EE: 0x7BA2, + 0xF3EF: 0x7BAB, + 0xF3F0: 0x7BB4, + 0xF3F1: 0x7BD1, + 0xF3F2: 0x7BC1, + 0xF3F3: 0x7BCC, + 0xF3F4: 0x7BDD, + 0xF3F5: 0x7BDA, + 0xF3F6: 0x7BE5, + 0xF3F7: 0x7BE6, + 0xF3F8: 0x7BEA, + 0xF3F9: 0x7C0C, + 0xF3FA: 0x7BFE, + 0xF3FB: 0x7BFC, + 0xF3FC: 0x7C0F, + 0xF3FD: 0x7C16, + 0xF3FE: 0x7C0B, + 0xF440: 0x9B07, + 0xF441: 0x9B09, + 0xF442: 0x9B0A, + 0xF443: 0x9B0B, + 0xF444: 0x9B0C, + 0xF445: 0x9B0D, + 0xF446: 0x9B0E, + 0xF447: 0x9B10, + 0xF448: 0x9B11, + 0xF449: 0x9B12, + 0xF44A: 0x9B14, + 0xF44B: 0x9B15, + 0xF44C: 0x9B16, + 0xF44D: 0x9B17, + 0xF44E: 0x9B18, + 0xF44F: 0x9B19, + 0xF450: 0x9B1A, + 0xF451: 0x9B1B, + 0xF452: 0x9B1C, + 0xF453: 0x9B1D, + 0xF454: 0x9B1E, + 0xF455: 0x9B20, + 0xF456: 0x9B21, + 0xF457: 0x9B22, + 0xF458: 0x9B24, + 0xF459: 0x9B25, + 0xF45A: 0x9B26, + 0xF45B: 0x9B27, + 0xF45C: 0x9B28, + 0xF45D: 0x9B29, + 0xF45E: 0x9B2A, + 0xF45F: 0x9B2B, + 0xF460: 0x9B2C, + 0xF461: 0x9B2D, + 0xF462: 0x9B2E, + 0xF463: 0x9B30, + 0xF464: 0x9B31, + 0xF465: 0x9B33, + 0xF466: 0x9B34, + 0xF467: 0x9B35, + 0xF468: 0x9B36, + 0xF469: 0x9B37, + 0xF46A: 0x9B38, + 0xF46B: 0x9B39, + 0xF46C: 0x9B3A, + 0xF46D: 0x9B3D, + 0xF46E: 0x9B3E, + 0xF46F: 0x9B3F, + 0xF470: 0x9B40, + 0xF471: 0x9B46, + 0xF472: 0x9B4A, + 0xF473: 0x9B4B, + 0xF474: 0x9B4C, + 0xF475: 0x9B4E, + 0xF476: 0x9B50, + 0xF477: 0x9B52, + 0xF478: 0x9B53, + 0xF479: 0x9B55, + 0xF47A: 0x9B56, + 0xF47B: 0x9B57, + 0xF47C: 0x9B58, + 0xF47D: 0x9B59, + 0xF47E: 0x9B5A, + 0xF480: 0x9B5B, + 0xF481: 0x9B5C, + 0xF482: 0x9B5D, + 0xF483: 0x9B5E, + 0xF484: 0x9B5F, + 0xF485: 0x9B60, + 0xF486: 0x9B61, + 0xF487: 0x9B62, + 0xF488: 0x9B63, + 0xF489: 0x9B64, + 0xF48A: 0x9B65, + 0xF48B: 0x9B66, + 0xF48C: 0x9B67, + 0xF48D: 0x9B68, + 0xF48E: 0x9B69, + 0xF48F: 0x9B6A, + 0xF490: 0x9B6B, + 0xF491: 0x9B6C, + 0xF492: 0x9B6D, + 0xF493: 0x9B6E, + 0xF494: 0x9B6F, + 0xF495: 0x9B70, + 0xF496: 0x9B71, + 0xF497: 0x9B72, + 0xF498: 0x9B73, + 0xF499: 0x9B74, + 0xF49A: 0x9B75, + 0xF49B: 0x9B76, + 0xF49C: 0x9B77, + 0xF49D: 0x9B78, + 0xF49E: 0x9B79, + 0xF49F: 0x9B7A, + 0xF4A0: 0x9B7B, + 0xF4A1: 0x7C1F, + 0xF4A2: 0x7C2A, + 0xF4A3: 0x7C26, + 0xF4A4: 0x7C38, + 0xF4A5: 0x7C41, + 0xF4A6: 0x7C40, + 0xF4A7: 0x81FE, + 0xF4A8: 0x8201, + 0xF4A9: 0x8202, + 0xF4AA: 0x8204, + 0xF4AB: 0x81EC, + 0xF4AC: 0x8844, + 0xF4AD: 0x8221, + 0xF4AE: 0x8222, + 0xF4AF: 0x8223, + 0xF4B0: 0x822D, + 0xF4B1: 0x822F, + 0xF4B2: 0x8228, + 0xF4B3: 0x822B, + 0xF4B4: 0x8238, + 0xF4B5: 0x823B, + 0xF4B6: 0x8233, + 0xF4B7: 0x8234, + 0xF4B8: 0x823E, + 0xF4B9: 0x8244, + 0xF4BA: 0x8249, + 0xF4BB: 0x824B, + 0xF4BC: 0x824F, + 0xF4BD: 0x825A, + 0xF4BE: 0x825F, + 0xF4BF: 0x8268, + 0xF4C0: 0x887E, + 0xF4C1: 0x8885, + 0xF4C2: 0x8888, + 0xF4C3: 0x88D8, + 0xF4C4: 0x88DF, + 0xF4C5: 0x895E, + 0xF4C6: 0x7F9D, + 0xF4C7: 0x7F9F, + 0xF4C8: 0x7FA7, + 0xF4C9: 0x7FAF, + 0xF4CA: 0x7FB0, + 0xF4CB: 0x7FB2, + 0xF4CC: 0x7C7C, + 0xF4CD: 0x6549, + 0xF4CE: 0x7C91, + 0xF4CF: 0x7C9D, + 0xF4D0: 0x7C9C, + 0xF4D1: 0x7C9E, + 0xF4D2: 0x7CA2, + 0xF4D3: 0x7CB2, + 0xF4D4: 0x7CBC, + 0xF4D5: 0x7CBD, + 0xF4D6: 0x7CC1, + 0xF4D7: 0x7CC7, + 0xF4D8: 0x7CCC, + 0xF4D9: 0x7CCD, + 0xF4DA: 0x7CC8, + 0xF4DB: 0x7CC5, + 0xF4DC: 0x7CD7, + 0xF4DD: 0x7CE8, + 0xF4DE: 0x826E, + 0xF4DF: 0x66A8, + 0xF4E0: 0x7FBF, + 0xF4E1: 0x7FCE, + 0xF4E2: 0x7FD5, + 0xF4E3: 0x7FE5, + 0xF4E4: 0x7FE1, + 0xF4E5: 0x7FE6, + 0xF4E6: 0x7FE9, + 0xF4E7: 0x7FEE, + 0xF4E8: 0x7FF3, + 0xF4E9: 0x7CF8, + 0xF4EA: 0x7D77, + 0xF4EB: 0x7DA6, + 0xF4EC: 0x7DAE, + 0xF4ED: 0x7E47, + 0xF4EE: 0x7E9B, + 0xF4EF: 0x9EB8, + 0xF4F0: 0x9EB4, + 0xF4F1: 0x8D73, + 0xF4F2: 0x8D84, + 0xF4F3: 0x8D94, + 0xF4F4: 0x8D91, + 0xF4F5: 0x8DB1, + 0xF4F6: 0x8D67, + 0xF4F7: 0x8D6D, + 0xF4F8: 0x8C47, + 0xF4F9: 0x8C49, + 0xF4FA: 0x914A, + 0xF4FB: 0x9150, + 0xF4FC: 0x914E, + 0xF4FD: 0x914F, + 0xF4FE: 0x9164, + 0xF540: 0x9B7C, + 0xF541: 0x9B7D, + 0xF542: 0x9B7E, + 0xF543: 0x9B7F, + 0xF544: 0x9B80, + 0xF545: 0x9B81, + 0xF546: 0x9B82, + 0xF547: 0x9B83, + 0xF548: 0x9B84, + 0xF549: 0x9B85, + 0xF54A: 0x9B86, + 0xF54B: 0x9B87, + 0xF54C: 0x9B88, + 0xF54D: 0x9B89, + 0xF54E: 0x9B8A, + 0xF54F: 0x9B8B, + 0xF550: 0x9B8C, + 0xF551: 0x9B8D, + 0xF552: 0x9B8E, + 0xF553: 0x9B8F, + 0xF554: 0x9B90, + 0xF555: 0x9B91, + 0xF556: 0x9B92, + 0xF557: 0x9B93, + 0xF558: 0x9B94, + 0xF559: 0x9B95, + 0xF55A: 0x9B96, + 0xF55B: 0x9B97, + 0xF55C: 0x9B98, + 0xF55D: 0x9B99, + 0xF55E: 0x9B9A, + 0xF55F: 0x9B9B, + 0xF560: 0x9B9C, + 0xF561: 0x9B9D, + 0xF562: 0x9B9E, + 0xF563: 0x9B9F, + 0xF564: 0x9BA0, + 0xF565: 0x9BA1, + 0xF566: 0x9BA2, + 0xF567: 0x9BA3, + 0xF568: 0x9BA4, + 0xF569: 0x9BA5, + 0xF56A: 0x9BA6, + 0xF56B: 0x9BA7, + 0xF56C: 0x9BA8, + 0xF56D: 0x9BA9, + 0xF56E: 0x9BAA, + 0xF56F: 0x9BAB, + 0xF570: 0x9BAC, + 0xF571: 0x9BAD, + 0xF572: 0x9BAE, + 0xF573: 0x9BAF, + 0xF574: 0x9BB0, + 0xF575: 0x9BB1, + 0xF576: 0x9BB2, + 0xF577: 0x9BB3, + 0xF578: 0x9BB4, + 0xF579: 0x9BB5, + 0xF57A: 0x9BB6, + 0xF57B: 0x9BB7, + 0xF57C: 0x9BB8, + 0xF57D: 0x9BB9, + 0xF57E: 0x9BBA, + 0xF580: 0x9BBB, + 0xF581: 0x9BBC, + 0xF582: 0x9BBD, + 0xF583: 0x9BBE, + 0xF584: 0x9BBF, + 0xF585: 0x9BC0, + 0xF586: 0x9BC1, + 0xF587: 0x9BC2, + 0xF588: 0x9BC3, + 0xF589: 0x9BC4, + 0xF58A: 0x9BC5, + 0xF58B: 0x9BC6, + 0xF58C: 0x9BC7, + 0xF58D: 0x9BC8, + 0xF58E: 0x9BC9, + 0xF58F: 0x9BCA, + 0xF590: 0x9BCB, + 0xF591: 0x9BCC, + 0xF592: 0x9BCD, + 0xF593: 0x9BCE, + 0xF594: 0x9BCF, + 0xF595: 0x9BD0, + 0xF596: 0x9BD1, + 0xF597: 0x9BD2, + 0xF598: 0x9BD3, + 0xF599: 0x9BD4, + 0xF59A: 0x9BD5, + 0xF59B: 0x9BD6, + 0xF59C: 0x9BD7, + 0xF59D: 0x9BD8, + 0xF59E: 0x9BD9, + 0xF59F: 0x9BDA, + 0xF5A0: 0x9BDB, + 0xF5A1: 0x9162, + 0xF5A2: 0x9161, + 0xF5A3: 0x9170, + 0xF5A4: 0x9169, + 0xF5A5: 0x916F, + 0xF5A6: 0x917D, + 0xF5A7: 0x917E, + 0xF5A8: 0x9172, + 0xF5A9: 0x9174, + 0xF5AA: 0x9179, + 0xF5AB: 0x918C, + 0xF5AC: 0x9185, + 0xF5AD: 0x9190, + 0xF5AE: 0x918D, + 0xF5AF: 0x9191, + 0xF5B0: 0x91A2, + 0xF5B1: 0x91A3, + 0xF5B2: 0x91AA, + 0xF5B3: 0x91AD, + 0xF5B4: 0x91AE, + 0xF5B5: 0x91AF, + 0xF5B6: 0x91B5, + 0xF5B7: 0x91B4, + 0xF5B8: 0x91BA, + 0xF5B9: 0x8C55, + 0xF5BA: 0x9E7E, + 0xF5BB: 0x8DB8, + 0xF5BC: 0x8DEB, + 0xF5BD: 0x8E05, + 0xF5BE: 0x8E59, + 0xF5BF: 0x8E69, + 0xF5C0: 0x8DB5, + 0xF5C1: 0x8DBF, + 0xF5C2: 0x8DBC, + 0xF5C3: 0x8DBA, + 0xF5C4: 0x8DC4, + 0xF5C5: 0x8DD6, + 0xF5C6: 0x8DD7, + 0xF5C7: 0x8DDA, + 0xF5C8: 0x8DDE, + 0xF5C9: 0x8DCE, + 0xF5CA: 0x8DCF, + 0xF5CB: 0x8DDB, + 0xF5CC: 0x8DC6, + 0xF5CD: 0x8DEC, + 0xF5CE: 0x8DF7, + 0xF5CF: 0x8DF8, + 0xF5D0: 0x8DE3, + 0xF5D1: 0x8DF9, + 0xF5D2: 0x8DFB, + 0xF5D3: 0x8DE4, + 0xF5D4: 0x8E09, + 0xF5D5: 0x8DFD, + 0xF5D6: 0x8E14, + 0xF5D7: 0x8E1D, + 0xF5D8: 0x8E1F, + 0xF5D9: 0x8E2C, + 0xF5DA: 0x8E2E, + 0xF5DB: 0x8E23, + 0xF5DC: 0x8E2F, + 0xF5DD: 0x8E3A, + 0xF5DE: 0x8E40, + 0xF5DF: 0x8E39, + 0xF5E0: 0x8E35, + 0xF5E1: 0x8E3D, + 0xF5E2: 0x8E31, + 0xF5E3: 0x8E49, + 0xF5E4: 0x8E41, + 0xF5E5: 0x8E42, + 0xF5E6: 0x8E51, + 0xF5E7: 0x8E52, + 0xF5E8: 0x8E4A, + 0xF5E9: 0x8E70, + 0xF5EA: 0x8E76, + 0xF5EB: 0x8E7C, + 0xF5EC: 0x8E6F, + 0xF5ED: 0x8E74, + 0xF5EE: 0x8E85, + 0xF5EF: 0x8E8F, + 0xF5F0: 0x8E94, + 0xF5F1: 0x8E90, + 0xF5F2: 0x8E9C, + 0xF5F3: 0x8E9E, + 0xF5F4: 0x8C78, + 0xF5F5: 0x8C82, + 0xF5F6: 0x8C8A, + 0xF5F7: 0x8C85, + 0xF5F8: 0x8C98, + 0xF5F9: 0x8C94, + 0xF5FA: 0x659B, + 0xF5FB: 0x89D6, + 0xF5FC: 0x89DE, + 0xF5FD: 0x89DA, + 0xF5FE: 0x89DC, + 0xF640: 0x9BDC, + 0xF641: 0x9BDD, + 0xF642: 0x9BDE, + 0xF643: 0x9BDF, + 0xF644: 0x9BE0, + 0xF645: 0x9BE1, + 0xF646: 0x9BE2, + 0xF647: 0x9BE3, + 0xF648: 0x9BE4, + 0xF649: 0x9BE5, + 0xF64A: 0x9BE6, + 0xF64B: 0x9BE7, + 0xF64C: 0x9BE8, + 0xF64D: 0x9BE9, + 0xF64E: 0x9BEA, + 0xF64F: 0x9BEB, + 0xF650: 0x9BEC, + 0xF651: 0x9BED, + 0xF652: 0x9BEE, + 0xF653: 0x9BEF, + 0xF654: 0x9BF0, + 0xF655: 0x9BF1, + 0xF656: 0x9BF2, + 0xF657: 0x9BF3, + 0xF658: 0x9BF4, + 0xF659: 0x9BF5, + 0xF65A: 0x9BF6, + 0xF65B: 0x9BF7, + 0xF65C: 0x9BF8, + 0xF65D: 0x9BF9, + 0xF65E: 0x9BFA, + 0xF65F: 0x9BFB, + 0xF660: 0x9BFC, + 0xF661: 0x9BFD, + 0xF662: 0x9BFE, + 0xF663: 0x9BFF, + 0xF664: 0x9C00, + 0xF665: 0x9C01, + 0xF666: 0x9C02, + 0xF667: 0x9C03, + 0xF668: 0x9C04, + 0xF669: 0x9C05, + 0xF66A: 0x9C06, + 0xF66B: 0x9C07, + 0xF66C: 0x9C08, + 0xF66D: 0x9C09, + 0xF66E: 0x9C0A, + 0xF66F: 0x9C0B, + 0xF670: 0x9C0C, + 0xF671: 0x9C0D, + 0xF672: 0x9C0E, + 0xF673: 0x9C0F, + 0xF674: 0x9C10, + 0xF675: 0x9C11, + 0xF676: 0x9C12, + 0xF677: 0x9C13, + 0xF678: 0x9C14, + 0xF679: 0x9C15, + 0xF67A: 0x9C16, + 0xF67B: 0x9C17, + 0xF67C: 0x9C18, + 0xF67D: 0x9C19, + 0xF67E: 0x9C1A, + 0xF680: 0x9C1B, + 0xF681: 0x9C1C, + 0xF682: 0x9C1D, + 0xF683: 0x9C1E, + 0xF684: 0x9C1F, + 0xF685: 0x9C20, + 0xF686: 0x9C21, + 0xF687: 0x9C22, + 0xF688: 0x9C23, + 0xF689: 0x9C24, + 0xF68A: 0x9C25, + 0xF68B: 0x9C26, + 0xF68C: 0x9C27, + 0xF68D: 0x9C28, + 0xF68E: 0x9C29, + 0xF68F: 0x9C2A, + 0xF690: 0x9C2B, + 0xF691: 0x9C2C, + 0xF692: 0x9C2D, + 0xF693: 0x9C2E, + 0xF694: 0x9C2F, + 0xF695: 0x9C30, + 0xF696: 0x9C31, + 0xF697: 0x9C32, + 0xF698: 0x9C33, + 0xF699: 0x9C34, + 0xF69A: 0x9C35, + 0xF69B: 0x9C36, + 0xF69C: 0x9C37, + 0xF69D: 0x9C38, + 0xF69E: 0x9C39, + 0xF69F: 0x9C3A, + 0xF6A0: 0x9C3B, + 0xF6A1: 0x89E5, + 0xF6A2: 0x89EB, + 0xF6A3: 0x89EF, + 0xF6A4: 0x8A3E, + 0xF6A5: 0x8B26, + 0xF6A6: 0x9753, + 0xF6A7: 0x96E9, + 0xF6A8: 0x96F3, + 0xF6A9: 0x96EF, + 0xF6AA: 0x9706, + 0xF6AB: 0x9701, + 0xF6AC: 0x9708, + 0xF6AD: 0x970F, + 0xF6AE: 0x970E, + 0xF6AF: 0x972A, + 0xF6B0: 0x972D, + 0xF6B1: 0x9730, + 0xF6B2: 0x973E, + 0xF6B3: 0x9F80, + 0xF6B4: 0x9F83, + 0xF6B5: 0x9F85, + 0xF6B6: 0x9F86, + 0xF6B7: 0x9F87, + 0xF6B8: 0x9F88, + 0xF6B9: 0x9F89, + 0xF6BA: 0x9F8A, + 0xF6BB: 0x9F8C, + 0xF6BC: 0x9EFE, + 0xF6BD: 0x9F0B, + 0xF6BE: 0x9F0D, + 0xF6BF: 0x96B9, + 0xF6C0: 0x96BC, + 0xF6C1: 0x96BD, + 0xF6C2: 0x96CE, + 0xF6C3: 0x96D2, + 0xF6C4: 0x77BF, + 0xF6C5: 0x96E0, + 0xF6C6: 0x928E, + 0xF6C7: 0x92AE, + 0xF6C8: 0x92C8, + 0xF6C9: 0x933E, + 0xF6CA: 0x936A, + 0xF6CB: 0x93CA, + 0xF6CC: 0x938F, + 0xF6CD: 0x943E, + 0xF6CE: 0x946B, + 0xF6CF: 0x9C7F, + 0xF6D0: 0x9C82, + 0xF6D1: 0x9C85, + 0xF6D2: 0x9C86, + 0xF6D3: 0x9C87, + 0xF6D4: 0x9C88, + 0xF6D5: 0x7A23, + 0xF6D6: 0x9C8B, + 0xF6D7: 0x9C8E, + 0xF6D8: 0x9C90, + 0xF6D9: 0x9C91, + 0xF6DA: 0x9C92, + 0xF6DB: 0x9C94, + 0xF6DC: 0x9C95, + 0xF6DD: 0x9C9A, + 0xF6DE: 0x9C9B, + 0xF6DF: 0x9C9E, + 0xF6E0: 0x9C9F, + 0xF6E1: 0x9CA0, + 0xF6E2: 0x9CA1, + 0xF6E3: 0x9CA2, + 0xF6E4: 0x9CA3, + 0xF6E5: 0x9CA5, + 0xF6E6: 0x9CA6, + 0xF6E7: 0x9CA7, + 0xF6E8: 0x9CA8, + 0xF6E9: 0x9CA9, + 0xF6EA: 0x9CAB, + 0xF6EB: 0x9CAD, + 0xF6EC: 0x9CAE, + 0xF6ED: 0x9CB0, + 0xF6EE: 0x9CB1, + 0xF6EF: 0x9CB2, + 0xF6F0: 0x9CB3, + 0xF6F1: 0x9CB4, + 0xF6F2: 0x9CB5, + 0xF6F3: 0x9CB6, + 0xF6F4: 0x9CB7, + 0xF6F5: 0x9CBA, + 0xF6F6: 0x9CBB, + 0xF6F7: 0x9CBC, + 0xF6F8: 0x9CBD, + 0xF6F9: 0x9CC4, + 0xF6FA: 0x9CC5, + 0xF6FB: 0x9CC6, + 0xF6FC: 0x9CC7, + 0xF6FD: 0x9CCA, + 0xF6FE: 0x9CCB, + 0xF740: 0x9C3C, + 0xF741: 0x9C3D, + 0xF742: 0x9C3E, + 0xF743: 0x9C3F, + 0xF744: 0x9C40, + 0xF745: 0x9C41, + 0xF746: 0x9C42, + 0xF747: 0x9C43, + 0xF748: 0x9C44, + 0xF749: 0x9C45, + 0xF74A: 0x9C46, + 0xF74B: 0x9C47, + 0xF74C: 0x9C48, + 0xF74D: 0x9C49, + 0xF74E: 0x9C4A, + 0xF74F: 0x9C4B, + 0xF750: 0x9C4C, + 0xF751: 0x9C4D, + 0xF752: 0x9C4E, + 0xF753: 0x9C4F, + 0xF754: 0x9C50, + 0xF755: 0x9C51, + 0xF756: 0x9C52, + 0xF757: 0x9C53, + 0xF758: 0x9C54, + 0xF759: 0x9C55, + 0xF75A: 0x9C56, + 0xF75B: 0x9C57, + 0xF75C: 0x9C58, + 0xF75D: 0x9C59, + 0xF75E: 0x9C5A, + 0xF75F: 0x9C5B, + 0xF760: 0x9C5C, + 0xF761: 0x9C5D, + 0xF762: 0x9C5E, + 0xF763: 0x9C5F, + 0xF764: 0x9C60, + 0xF765: 0x9C61, + 0xF766: 0x9C62, + 0xF767: 0x9C63, + 0xF768: 0x9C64, + 0xF769: 0x9C65, + 0xF76A: 0x9C66, + 0xF76B: 0x9C67, + 0xF76C: 0x9C68, + 0xF76D: 0x9C69, + 0xF76E: 0x9C6A, + 0xF76F: 0x9C6B, + 0xF770: 0x9C6C, + 0xF771: 0x9C6D, + 0xF772: 0x9C6E, + 0xF773: 0x9C6F, + 0xF774: 0x9C70, + 0xF775: 0x9C71, + 0xF776: 0x9C72, + 0xF777: 0x9C73, + 0xF778: 0x9C74, + 0xF779: 0x9C75, + 0xF77A: 0x9C76, + 0xF77B: 0x9C77, + 0xF77C: 0x9C78, + 0xF77D: 0x9C79, + 0xF77E: 0x9C7A, + 0xF780: 0x9C7B, + 0xF781: 0x9C7D, + 0xF782: 0x9C7E, + 0xF783: 0x9C80, + 0xF784: 0x9C83, + 0xF785: 0x9C84, + 0xF786: 0x9C89, + 0xF787: 0x9C8A, + 0xF788: 0x9C8C, + 0xF789: 0x9C8F, + 0xF78A: 0x9C93, + 0xF78B: 0x9C96, + 0xF78C: 0x9C97, + 0xF78D: 0x9C98, + 0xF78E: 0x9C99, + 0xF78F: 0x9C9D, + 0xF790: 0x9CAA, + 0xF791: 0x9CAC, + 0xF792: 0x9CAF, + 0xF793: 0x9CB9, + 0xF794: 0x9CBE, + 0xF795: 0x9CBF, + 0xF796: 0x9CC0, + 0xF797: 0x9CC1, + 0xF798: 0x9CC2, + 0xF799: 0x9CC8, + 0xF79A: 0x9CC9, + 0xF79B: 0x9CD1, + 0xF79C: 0x9CD2, + 0xF79D: 0x9CDA, + 0xF79E: 0x9CDB, + 0xF79F: 0x9CE0, + 0xF7A0: 0x9CE1, + 0xF7A1: 0x9CCC, + 0xF7A2: 0x9CCD, + 0xF7A3: 0x9CCE, + 0xF7A4: 0x9CCF, + 0xF7A5: 0x9CD0, + 0xF7A6: 0x9CD3, + 0xF7A7: 0x9CD4, + 0xF7A8: 0x9CD5, + 0xF7A9: 0x9CD7, + 0xF7AA: 0x9CD8, + 0xF7AB: 0x9CD9, + 0xF7AC: 0x9CDC, + 0xF7AD: 0x9CDD, + 0xF7AE: 0x9CDF, + 0xF7AF: 0x9CE2, + 0xF7B0: 0x977C, + 0xF7B1: 0x9785, + 0xF7B2: 0x9791, + 0xF7B3: 0x9792, + 0xF7B4: 0x9794, + 0xF7B5: 0x97AF, + 0xF7B6: 0x97AB, + 0xF7B7: 0x97A3, + 0xF7B8: 0x97B2, + 0xF7B9: 0x97B4, + 0xF7BA: 0x9AB1, + 0xF7BB: 0x9AB0, + 0xF7BC: 0x9AB7, + 0xF7BD: 0x9E58, + 0xF7BE: 0x9AB6, + 0xF7BF: 0x9ABA, + 0xF7C0: 0x9ABC, + 0xF7C1: 0x9AC1, + 0xF7C2: 0x9AC0, + 0xF7C3: 0x9AC5, + 0xF7C4: 0x9AC2, + 0xF7C5: 0x9ACB, + 0xF7C6: 0x9ACC, + 0xF7C7: 0x9AD1, + 0xF7C8: 0x9B45, + 0xF7C9: 0x9B43, + 0xF7CA: 0x9B47, + 0xF7CB: 0x9B49, + 0xF7CC: 0x9B48, + 0xF7CD: 0x9B4D, + 0xF7CE: 0x9B51, + 0xF7CF: 0x98E8, + 0xF7D0: 0x990D, + 0xF7D1: 0x992E, + 0xF7D2: 0x9955, + 0xF7D3: 0x9954, + 0xF7D4: 0x9ADF, + 0xF7D5: 0x9AE1, + 0xF7D6: 0x9AE6, + 0xF7D7: 0x9AEF, + 0xF7D8: 0x9AEB, + 0xF7D9: 0x9AFB, + 0xF7DA: 0x9AED, + 0xF7DB: 0x9AF9, + 0xF7DC: 0x9B08, + 0xF7DD: 0x9B0F, + 0xF7DE: 0x9B13, + 0xF7DF: 0x9B1F, + 0xF7E0: 0x9B23, + 0xF7E1: 0x9EBD, + 0xF7E2: 0x9EBE, + 0xF7E3: 0x7E3B, + 0xF7E4: 0x9E82, + 0xF7E5: 0x9E87, + 0xF7E6: 0x9E88, + 0xF7E7: 0x9E8B, + 0xF7E8: 0x9E92, + 0xF7E9: 0x93D6, + 0xF7EA: 0x9E9D, + 0xF7EB: 0x9E9F, + 0xF7EC: 0x9EDB, + 0xF7ED: 0x9EDC, + 0xF7EE: 0x9EDD, + 0xF7EF: 0x9EE0, + 0xF7F0: 0x9EDF, + 0xF7F1: 0x9EE2, + 0xF7F2: 0x9EE9, + 0xF7F3: 0x9EE7, + 0xF7F4: 0x9EE5, + 0xF7F5: 0x9EEA, + 0xF7F6: 0x9EEF, + 0xF7F7: 0x9F22, + 0xF7F8: 0x9F2C, + 0xF7F9: 0x9F2F, + 0xF7FA: 0x9F39, + 0xF7FB: 0x9F37, + 0xF7FC: 0x9F3D, + 0xF7FD: 0x9F3E, + 0xF7FE: 0x9F44, + 0xF840: 0x9CE3, + 0xF841: 0x9CE4, + 0xF842: 0x9CE5, + 0xF843: 0x9CE6, + 0xF844: 0x9CE7, + 0xF845: 0x9CE8, + 0xF846: 0x9CE9, + 0xF847: 0x9CEA, + 0xF848: 0x9CEB, + 0xF849: 0x9CEC, + 0xF84A: 0x9CED, + 0xF84B: 0x9CEE, + 0xF84C: 0x9CEF, + 0xF84D: 0x9CF0, + 0xF84E: 0x9CF1, + 0xF84F: 0x9CF2, + 0xF850: 0x9CF3, + 0xF851: 0x9CF4, + 0xF852: 0x9CF5, + 0xF853: 0x9CF6, + 0xF854: 0x9CF7, + 0xF855: 0x9CF8, + 0xF856: 0x9CF9, + 0xF857: 0x9CFA, + 0xF858: 0x9CFB, + 0xF859: 0x9CFC, + 0xF85A: 0x9CFD, + 0xF85B: 0x9CFE, + 0xF85C: 0x9CFF, + 0xF85D: 0x9D00, + 0xF85E: 0x9D01, + 0xF85F: 0x9D02, + 0xF860: 0x9D03, + 0xF861: 0x9D04, + 0xF862: 0x9D05, + 0xF863: 0x9D06, + 0xF864: 0x9D07, + 0xF865: 0x9D08, + 0xF866: 0x9D09, + 0xF867: 0x9D0A, + 0xF868: 0x9D0B, + 0xF869: 0x9D0C, + 0xF86A: 0x9D0D, + 0xF86B: 0x9D0E, + 0xF86C: 0x9D0F, + 0xF86D: 0x9D10, + 0xF86E: 0x9D11, + 0xF86F: 0x9D12, + 0xF870: 0x9D13, + 0xF871: 0x9D14, + 0xF872: 0x9D15, + 0xF873: 0x9D16, + 0xF874: 0x9D17, + 0xF875: 0x9D18, + 0xF876: 0x9D19, + 0xF877: 0x9D1A, + 0xF878: 0x9D1B, + 0xF879: 0x9D1C, + 0xF87A: 0x9D1D, + 0xF87B: 0x9D1E, + 0xF87C: 0x9D1F, + 0xF87D: 0x9D20, + 0xF87E: 0x9D21, + 0xF880: 0x9D22, + 0xF881: 0x9D23, + 0xF882: 0x9D24, + 0xF883: 0x9D25, + 0xF884: 0x9D26, + 0xF885: 0x9D27, + 0xF886: 0x9D28, + 0xF887: 0x9D29, + 0xF888: 0x9D2A, + 0xF889: 0x9D2B, + 0xF88A: 0x9D2C, + 0xF88B: 0x9D2D, + 0xF88C: 0x9D2E, + 0xF88D: 0x9D2F, + 0xF88E: 0x9D30, + 0xF88F: 0x9D31, + 0xF890: 0x9D32, + 0xF891: 0x9D33, + 0xF892: 0x9D34, + 0xF893: 0x9D35, + 0xF894: 0x9D36, + 0xF895: 0x9D37, + 0xF896: 0x9D38, + 0xF897: 0x9D39, + 0xF898: 0x9D3A, + 0xF899: 0x9D3B, + 0xF89A: 0x9D3C, + 0xF89B: 0x9D3D, + 0xF89C: 0x9D3E, + 0xF89D: 0x9D3F, + 0xF89E: 0x9D40, + 0xF89F: 0x9D41, + 0xF8A0: 0x9D42, + 0xF8A1: 0xE234, + 0xF8A2: 0xE235, + 0xF8A3: 0xE236, + 0xF8A4: 0xE237, + 0xF8A5: 0xE238, + 0xF8A6: 0xE239, + 0xF8A7: 0xE23A, + 0xF8A8: 0xE23B, + 0xF8A9: 0xE23C, + 0xF8AA: 0xE23D, + 0xF8AB: 0xE23E, + 0xF8AC: 0xE23F, + 0xF8AD: 0xE240, + 0xF8AE: 0xE241, + 0xF8AF: 0xE242, + 0xF8B0: 0xE243, + 0xF8B1: 0xE244, + 0xF8B2: 0xE245, + 0xF8B3: 0xE246, + 0xF8B4: 0xE247, + 0xF8B5: 0xE248, + 0xF8B6: 0xE249, + 0xF8B7: 0xE24A, + 0xF8B8: 0xE24B, + 0xF8B9: 0xE24C, + 0xF8BA: 0xE24D, + 0xF8BB: 0xE24E, + 0xF8BC: 0xE24F, + 0xF8BD: 0xE250, + 0xF8BE: 0xE251, + 0xF8BF: 0xE252, + 0xF8C0: 0xE253, + 0xF8C1: 0xE254, + 0xF8C2: 0xE255, + 0xF8C3: 0xE256, + 0xF8C4: 0xE257, + 0xF8C5: 0xE258, + 0xF8C6: 0xE259, + 0xF8C7: 0xE25A, + 0xF8C8: 0xE25B, + 0xF8C9: 0xE25C, + 0xF8CA: 0xE25D, + 0xF8CB: 0xE25E, + 0xF8CC: 0xE25F, + 0xF8CD: 0xE260, + 0xF8CE: 0xE261, + 0xF8CF: 0xE262, + 0xF8D0: 0xE263, + 0xF8D1: 0xE264, + 0xF8D2: 0xE265, + 0xF8D3: 0xE266, + 0xF8D4: 0xE267, + 0xF8D5: 0xE268, + 0xF8D6: 0xE269, + 0xF8D7: 0xE26A, + 0xF8D8: 0xE26B, + 0xF8D9: 0xE26C, + 0xF8DA: 0xE26D, + 0xF8DB: 0xE26E, + 0xF8DC: 0xE26F, + 0xF8DD: 0xE270, + 0xF8DE: 0xE271, + 0xF8DF: 0xE272, + 0xF8E0: 0xE273, + 0xF8E1: 0xE274, + 0xF8E2: 0xE275, + 0xF8E3: 0xE276, + 0xF8E4: 0xE277, + 0xF8E5: 0xE278, + 0xF8E6: 0xE279, + 0xF8E7: 0xE27A, + 0xF8E8: 0xE27B, + 0xF8E9: 0xE27C, + 0xF8EA: 0xE27D, + 0xF8EB: 0xE27E, + 0xF8EC: 0xE27F, + 0xF8ED: 0xE280, + 0xF8EE: 0xE281, + 0xF8EF: 0xE282, + 0xF8F0: 0xE283, + 0xF8F1: 0xE284, + 0xF8F2: 0xE285, + 0xF8F3: 0xE286, + 0xF8F4: 0xE287, + 0xF8F5: 0xE288, + 0xF8F6: 0xE289, + 0xF8F7: 0xE28A, + 0xF8F8: 0xE28B, + 0xF8F9: 0xE28C, + 0xF8FA: 0xE28D, + 0xF8FB: 0xE28E, + 0xF8FC: 0xE28F, + 0xF8FD: 0xE290, + 0xF8FE: 0xE291, + 0xF940: 0x9D43, + 0xF941: 0x9D44, + 0xF942: 0x9D45, + 0xF943: 0x9D46, + 0xF944: 0x9D47, + 0xF945: 0x9D48, + 0xF946: 0x9D49, + 0xF947: 0x9D4A, + 0xF948: 0x9D4B, + 0xF949: 0x9D4C, + 0xF94A: 0x9D4D, + 0xF94B: 0x9D4E, + 0xF94C: 0x9D4F, + 0xF94D: 0x9D50, + 0xF94E: 0x9D51, + 0xF94F: 0x9D52, + 0xF950: 0x9D53, + 0xF951: 0x9D54, + 0xF952: 0x9D55, + 0xF953: 0x9D56, + 0xF954: 0x9D57, + 0xF955: 0x9D58, + 0xF956: 0x9D59, + 0xF957: 0x9D5A, + 0xF958: 0x9D5B, + 0xF959: 0x9D5C, + 0xF95A: 0x9D5D, + 0xF95B: 0x9D5E, + 0xF95C: 0x9D5F, + 0xF95D: 0x9D60, + 0xF95E: 0x9D61, + 0xF95F: 0x9D62, + 0xF960: 0x9D63, + 0xF961: 0x9D64, + 0xF962: 0x9D65, + 0xF963: 0x9D66, + 0xF964: 0x9D67, + 0xF965: 0x9D68, + 0xF966: 0x9D69, + 0xF967: 0x9D6A, + 0xF968: 0x9D6B, + 0xF969: 0x9D6C, + 0xF96A: 0x9D6D, + 0xF96B: 0x9D6E, + 0xF96C: 0x9D6F, + 0xF96D: 0x9D70, + 0xF96E: 0x9D71, + 0xF96F: 0x9D72, + 0xF970: 0x9D73, + 0xF971: 0x9D74, + 0xF972: 0x9D75, + 0xF973: 0x9D76, + 0xF974: 0x9D77, + 0xF975: 0x9D78, + 0xF976: 0x9D79, + 0xF977: 0x9D7A, + 0xF978: 0x9D7B, + 0xF979: 0x9D7C, + 0xF97A: 0x9D7D, + 0xF97B: 0x9D7E, + 0xF97C: 0x9D7F, + 0xF97D: 0x9D80, + 0xF97E: 0x9D81, + 0xF980: 0x9D82, + 0xF981: 0x9D83, + 0xF982: 0x9D84, + 0xF983: 0x9D85, + 0xF984: 0x9D86, + 0xF985: 0x9D87, + 0xF986: 0x9D88, + 0xF987: 0x9D89, + 0xF988: 0x9D8A, + 0xF989: 0x9D8B, + 0xF98A: 0x9D8C, + 0xF98B: 0x9D8D, + 0xF98C: 0x9D8E, + 0xF98D: 0x9D8F, + 0xF98E: 0x9D90, + 0xF98F: 0x9D91, + 0xF990: 0x9D92, + 0xF991: 0x9D93, + 0xF992: 0x9D94, + 0xF993: 0x9D95, + 0xF994: 0x9D96, + 0xF995: 0x9D97, + 0xF996: 0x9D98, + 0xF997: 0x9D99, + 0xF998: 0x9D9A, + 0xF999: 0x9D9B, + 0xF99A: 0x9D9C, + 0xF99B: 0x9D9D, + 0xF99C: 0x9D9E, + 0xF99D: 0x9D9F, + 0xF99E: 0x9DA0, + 0xF99F: 0x9DA1, + 0xF9A0: 0x9DA2, + 0xF9A1: 0xE292, + 0xF9A2: 0xE293, + 0xF9A3: 0xE294, + 0xF9A4: 0xE295, + 0xF9A5: 0xE296, + 0xF9A6: 0xE297, + 0xF9A7: 0xE298, + 0xF9A8: 0xE299, + 0xF9A9: 0xE29A, + 0xF9AA: 0xE29B, + 0xF9AB: 0xE29C, + 0xF9AC: 0xE29D, + 0xF9AD: 0xE29E, + 0xF9AE: 0xE29F, + 0xF9AF: 0xE2A0, + 0xF9B0: 0xE2A1, + 0xF9B1: 0xE2A2, + 0xF9B2: 0xE2A3, + 0xF9B3: 0xE2A4, + 0xF9B4: 0xE2A5, + 0xF9B5: 0xE2A6, + 0xF9B6: 0xE2A7, + 0xF9B7: 0xE2A8, + 0xF9B8: 0xE2A9, + 0xF9B9: 0xE2AA, + 0xF9BA: 0xE2AB, + 0xF9BB: 0xE2AC, + 0xF9BC: 0xE2AD, + 0xF9BD: 0xE2AE, + 0xF9BE: 0xE2AF, + 0xF9BF: 0xE2B0, + 0xF9C0: 0xE2B1, + 0xF9C1: 0xE2B2, + 0xF9C2: 0xE2B3, + 0xF9C3: 0xE2B4, + 0xF9C4: 0xE2B5, + 0xF9C5: 0xE2B6, + 0xF9C6: 0xE2B7, + 0xF9C7: 0xE2B8, + 0xF9C8: 0xE2B9, + 0xF9C9: 0xE2BA, + 0xF9CA: 0xE2BB, + 0xF9CB: 0xE2BC, + 0xF9CC: 0xE2BD, + 0xF9CD: 0xE2BE, + 0xF9CE: 0xE2BF, + 0xF9CF: 0xE2C0, + 0xF9D0: 0xE2C1, + 0xF9D1: 0xE2C2, + 0xF9D2: 0xE2C3, + 0xF9D3: 0xE2C4, + 0xF9D4: 0xE2C5, + 0xF9D5: 0xE2C6, + 0xF9D6: 0xE2C7, + 0xF9D7: 0xE2C8, + 0xF9D8: 0xE2C9, + 0xF9D9: 0xE2CA, + 0xF9DA: 0xE2CB, + 0xF9DB: 0xE2CC, + 0xF9DC: 0xE2CD, + 0xF9DD: 0xE2CE, + 0xF9DE: 0xE2CF, + 0xF9DF: 0xE2D0, + 0xF9E0: 0xE2D1, + 0xF9E1: 0xE2D2, + 0xF9E2: 0xE2D3, + 0xF9E3: 0xE2D4, + 0xF9E4: 0xE2D5, + 0xF9E5: 0xE2D6, + 0xF9E6: 0xE2D7, + 0xF9E7: 0xE2D8, + 0xF9E8: 0xE2D9, + 0xF9E9: 0xE2DA, + 0xF9EA: 0xE2DB, + 0xF9EB: 0xE2DC, + 0xF9EC: 0xE2DD, + 0xF9ED: 0xE2DE, + 0xF9EE: 0xE2DF, + 0xF9EF: 0xE2E0, + 0xF9F0: 0xE2E1, + 0xF9F1: 0xE2E2, + 0xF9F2: 0xE2E3, + 0xF9F3: 0xE2E4, + 0xF9F4: 0xE2E5, + 0xF9F5: 0xE2E6, + 0xF9F6: 0xE2E7, + 0xF9F7: 0xE2E8, + 0xF9F8: 0xE2E9, + 0xF9F9: 0xE2EA, + 0xF9FA: 0xE2EB, + 0xF9FB: 0xE2EC, + 0xF9FC: 0xE2ED, + 0xF9FD: 0xE2EE, + 0xF9FE: 0xE2EF, + 0xFA40: 0x9DA3, + 0xFA41: 0x9DA4, + 0xFA42: 0x9DA5, + 0xFA43: 0x9DA6, + 0xFA44: 0x9DA7, + 0xFA45: 0x9DA8, + 0xFA46: 0x9DA9, + 0xFA47: 0x9DAA, + 0xFA48: 0x9DAB, + 0xFA49: 0x9DAC, + 0xFA4A: 0x9DAD, + 0xFA4B: 0x9DAE, + 0xFA4C: 0x9DAF, + 0xFA4D: 0x9DB0, + 0xFA4E: 0x9DB1, + 0xFA4F: 0x9DB2, + 0xFA50: 0x9DB3, + 0xFA51: 0x9DB4, + 0xFA52: 0x9DB5, + 0xFA53: 0x9DB6, + 0xFA54: 0x9DB7, + 0xFA55: 0x9DB8, + 0xFA56: 0x9DB9, + 0xFA57: 0x9DBA, + 0xFA58: 0x9DBB, + 0xFA59: 0x9DBC, + 0xFA5A: 0x9DBD, + 0xFA5B: 0x9DBE, + 0xFA5C: 0x9DBF, + 0xFA5D: 0x9DC0, + 0xFA5E: 0x9DC1, + 0xFA5F: 0x9DC2, + 0xFA60: 0x9DC3, + 0xFA61: 0x9DC4, + 0xFA62: 0x9DC5, + 0xFA63: 0x9DC6, + 0xFA64: 0x9DC7, + 0xFA65: 0x9DC8, + 0xFA66: 0x9DC9, + 0xFA67: 0x9DCA, + 0xFA68: 0x9DCB, + 0xFA69: 0x9DCC, + 0xFA6A: 0x9DCD, + 0xFA6B: 0x9DCE, + 0xFA6C: 0x9DCF, + 0xFA6D: 0x9DD0, + 0xFA6E: 0x9DD1, + 0xFA6F: 0x9DD2, + 0xFA70: 0x9DD3, + 0xFA71: 0x9DD4, + 0xFA72: 0x9DD5, + 0xFA73: 0x9DD6, + 0xFA74: 0x9DD7, + 0xFA75: 0x9DD8, + 0xFA76: 0x9DD9, + 0xFA77: 0x9DDA, + 0xFA78: 0x9DDB, + 0xFA79: 0x9DDC, + 0xFA7A: 0x9DDD, + 0xFA7B: 0x9DDE, + 0xFA7C: 0x9DDF, + 0xFA7D: 0x9DE0, + 0xFA7E: 0x9DE1, + 0xFA80: 0x9DE2, + 0xFA81: 0x9DE3, + 0xFA82: 0x9DE4, + 0xFA83: 0x9DE5, + 0xFA84: 0x9DE6, + 0xFA85: 0x9DE7, + 0xFA86: 0x9DE8, + 0xFA87: 0x9DE9, + 0xFA88: 0x9DEA, + 0xFA89: 0x9DEB, + 0xFA8A: 0x9DEC, + 0xFA8B: 0x9DED, + 0xFA8C: 0x9DEE, + 0xFA8D: 0x9DEF, + 0xFA8E: 0x9DF0, + 0xFA8F: 0x9DF1, + 0xFA90: 0x9DF2, + 0xFA91: 0x9DF3, + 0xFA92: 0x9DF4, + 0xFA93: 0x9DF5, + 0xFA94: 0x9DF6, + 0xFA95: 0x9DF7, + 0xFA96: 0x9DF8, + 0xFA97: 0x9DF9, + 0xFA98: 0x9DFA, + 0xFA99: 0x9DFB, + 0xFA9A: 0x9DFC, + 0xFA9B: 0x9DFD, + 0xFA9C: 0x9DFE, + 0xFA9D: 0x9DFF, + 0xFA9E: 0x9E00, + 0xFA9F: 0x9E01, + 0xFAA0: 0x9E02, + 0xFAA1: 0xE2F0, + 0xFAA2: 0xE2F1, + 0xFAA3: 0xE2F2, + 0xFAA4: 0xE2F3, + 0xFAA5: 0xE2F4, + 0xFAA6: 0xE2F5, + 0xFAA7: 0xE2F6, + 0xFAA8: 0xE2F7, + 0xFAA9: 0xE2F8, + 0xFAAA: 0xE2F9, + 0xFAAB: 0xE2FA, + 0xFAAC: 0xE2FB, + 0xFAAD: 0xE2FC, + 0xFAAE: 0xE2FD, + 0xFAAF: 0xE2FE, + 0xFAB0: 0xE2FF, + 0xFAB1: 0xE300, + 0xFAB2: 0xE301, + 0xFAB3: 0xE302, + 0xFAB4: 0xE303, + 0xFAB5: 0xE304, + 0xFAB6: 0xE305, + 0xFAB7: 0xE306, + 0xFAB8: 0xE307, + 0xFAB9: 0xE308, + 0xFABA: 0xE309, + 0xFABB: 0xE30A, + 0xFABC: 0xE30B, + 0xFABD: 0xE30C, + 0xFABE: 0xE30D, + 0xFABF: 0xE30E, + 0xFAC0: 0xE30F, + 0xFAC1: 0xE310, + 0xFAC2: 0xE311, + 0xFAC3: 0xE312, + 0xFAC4: 0xE313, + 0xFAC5: 0xE314, + 0xFAC6: 0xE315, + 0xFAC7: 0xE316, + 0xFAC8: 0xE317, + 0xFAC9: 0xE318, + 0xFACA: 0xE319, + 0xFACB: 0xE31A, + 0xFACC: 0xE31B, + 0xFACD: 0xE31C, + 0xFACE: 0xE31D, + 0xFACF: 0xE31E, + 0xFAD0: 0xE31F, + 0xFAD1: 0xE320, + 0xFAD2: 0xE321, + 0xFAD3: 0xE322, + 0xFAD4: 0xE323, + 0xFAD5: 0xE324, + 0xFAD6: 0xE325, + 0xFAD7: 0xE326, + 0xFAD8: 0xE327, + 0xFAD9: 0xE328, + 0xFADA: 0xE329, + 0xFADB: 0xE32A, + 0xFADC: 0xE32B, + 0xFADD: 0xE32C, + 0xFADE: 0xE32D, + 0xFADF: 0xE32E, + 0xFAE0: 0xE32F, + 0xFAE1: 0xE330, + 0xFAE2: 0xE331, + 0xFAE3: 0xE332, + 0xFAE4: 0xE333, + 0xFAE5: 0xE334, + 0xFAE6: 0xE335, + 0xFAE7: 0xE336, + 0xFAE8: 0xE337, + 0xFAE9: 0xE338, + 0xFAEA: 0xE339, + 0xFAEB: 0xE33A, + 0xFAEC: 0xE33B, + 0xFAED: 0xE33C, + 0xFAEE: 0xE33D, + 0xFAEF: 0xE33E, + 0xFAF0: 0xE33F, + 0xFAF1: 0xE340, + 0xFAF2: 0xE341, + 0xFAF3: 0xE342, + 0xFAF4: 0xE343, + 0xFAF5: 0xE344, + 0xFAF6: 0xE345, + 0xFAF7: 0xE346, + 0xFAF8: 0xE347, + 0xFAF9: 0xE348, + 0xFAFA: 0xE349, + 0xFAFB: 0xE34A, + 0xFAFC: 0xE34B, + 0xFAFD: 0xE34C, + 0xFAFE: 0xE34D, + 0xFB40: 0x9E03, + 0xFB41: 0x9E04, + 0xFB42: 0x9E05, + 0xFB43: 0x9E06, + 0xFB44: 0x9E07, + 0xFB45: 0x9E08, + 0xFB46: 0x9E09, + 0xFB47: 0x9E0A, + 0xFB48: 0x9E0B, + 0xFB49: 0x9E0C, + 0xFB4A: 0x9E0D, + 0xFB4B: 0x9E0E, + 0xFB4C: 0x9E0F, + 0xFB4D: 0x9E10, + 0xFB4E: 0x9E11, + 0xFB4F: 0x9E12, + 0xFB50: 0x9E13, + 0xFB51: 0x9E14, + 0xFB52: 0x9E15, + 0xFB53: 0x9E16, + 0xFB54: 0x9E17, + 0xFB55: 0x9E18, + 0xFB56: 0x9E19, + 0xFB57: 0x9E1A, + 0xFB58: 0x9E1B, + 0xFB59: 0x9E1C, + 0xFB5A: 0x9E1D, + 0xFB5B: 0x9E1E, + 0xFB5C: 0x9E24, + 0xFB5D: 0x9E27, + 0xFB5E: 0x9E2E, + 0xFB5F: 0x9E30, + 0xFB60: 0x9E34, + 0xFB61: 0x9E3B, + 0xFB62: 0x9E3C, + 0xFB63: 0x9E40, + 0xFB64: 0x9E4D, + 0xFB65: 0x9E50, + 0xFB66: 0x9E52, + 0xFB67: 0x9E53, + 0xFB68: 0x9E54, + 0xFB69: 0x9E56, + 0xFB6A: 0x9E59, + 0xFB6B: 0x9E5D, + 0xFB6C: 0x9E5F, + 0xFB6D: 0x9E60, + 0xFB6E: 0x9E61, + 0xFB6F: 0x9E62, + 0xFB70: 0x9E65, + 0xFB71: 0x9E6E, + 0xFB72: 0x9E6F, + 0xFB73: 0x9E72, + 0xFB74: 0x9E74, + 0xFB75: 0x9E75, + 0xFB76: 0x9E76, + 0xFB77: 0x9E77, + 0xFB78: 0x9E78, + 0xFB79: 0x9E79, + 0xFB7A: 0x9E7A, + 0xFB7B: 0x9E7B, + 0xFB7C: 0x9E7C, + 0xFB7D: 0x9E7D, + 0xFB7E: 0x9E80, + 0xFB80: 0x9E81, + 0xFB81: 0x9E83, + 0xFB82: 0x9E84, + 0xFB83: 0x9E85, + 0xFB84: 0x9E86, + 0xFB85: 0x9E89, + 0xFB86: 0x9E8A, + 0xFB87: 0x9E8C, + 0xFB88: 0x9E8D, + 0xFB89: 0x9E8E, + 0xFB8A: 0x9E8F, + 0xFB8B: 0x9E90, + 0xFB8C: 0x9E91, + 0xFB8D: 0x9E94, + 0xFB8E: 0x9E95, + 0xFB8F: 0x9E96, + 0xFB90: 0x9E97, + 0xFB91: 0x9E98, + 0xFB92: 0x9E99, + 0xFB93: 0x9E9A, + 0xFB94: 0x9E9B, + 0xFB95: 0x9E9C, + 0xFB96: 0x9E9E, + 0xFB97: 0x9EA0, + 0xFB98: 0x9EA1, + 0xFB99: 0x9EA2, + 0xFB9A: 0x9EA3, + 0xFB9B: 0x9EA4, + 0xFB9C: 0x9EA5, + 0xFB9D: 0x9EA7, + 0xFB9E: 0x9EA8, + 0xFB9F: 0x9EA9, + 0xFBA0: 0x9EAA, + 0xFBA1: 0xE34E, + 0xFBA2: 0xE34F, + 0xFBA3: 0xE350, + 0xFBA4: 0xE351, + 0xFBA5: 0xE352, + 0xFBA6: 0xE353, + 0xFBA7: 0xE354, + 0xFBA8: 0xE355, + 0xFBA9: 0xE356, + 0xFBAA: 0xE357, + 0xFBAB: 0xE358, + 0xFBAC: 0xE359, + 0xFBAD: 0xE35A, + 0xFBAE: 0xE35B, + 0xFBAF: 0xE35C, + 0xFBB0: 0xE35D, + 0xFBB1: 0xE35E, + 0xFBB2: 0xE35F, + 0xFBB3: 0xE360, + 0xFBB4: 0xE361, + 0xFBB5: 0xE362, + 0xFBB6: 0xE363, + 0xFBB7: 0xE364, + 0xFBB8: 0xE365, + 0xFBB9: 0xE366, + 0xFBBA: 0xE367, + 0xFBBB: 0xE368, + 0xFBBC: 0xE369, + 0xFBBD: 0xE36A, + 0xFBBE: 0xE36B, + 0xFBBF: 0xE36C, + 0xFBC0: 0xE36D, + 0xFBC1: 0xE36E, + 0xFBC2: 0xE36F, + 0xFBC3: 0xE370, + 0xFBC4: 0xE371, + 0xFBC5: 0xE372, + 0xFBC6: 0xE373, + 0xFBC7: 0xE374, + 0xFBC8: 0xE375, + 0xFBC9: 0xE376, + 0xFBCA: 0xE377, + 0xFBCB: 0xE378, + 0xFBCC: 0xE379, + 0xFBCD: 0xE37A, + 0xFBCE: 0xE37B, + 0xFBCF: 0xE37C, + 0xFBD0: 0xE37D, + 0xFBD1: 0xE37E, + 0xFBD2: 0xE37F, + 0xFBD3: 0xE380, + 0xFBD4: 0xE381, + 0xFBD5: 0xE382, + 0xFBD6: 0xE383, + 0xFBD7: 0xE384, + 0xFBD8: 0xE385, + 0xFBD9: 0xE386, + 0xFBDA: 0xE387, + 0xFBDB: 0xE388, + 0xFBDC: 0xE389, + 0xFBDD: 0xE38A, + 0xFBDE: 0xE38B, + 0xFBDF: 0xE38C, + 0xFBE0: 0xE38D, + 0xFBE1: 0xE38E, + 0xFBE2: 0xE38F, + 0xFBE3: 0xE390, + 0xFBE4: 0xE391, + 0xFBE5: 0xE392, + 0xFBE6: 0xE393, + 0xFBE7: 0xE394, + 0xFBE8: 0xE395, + 0xFBE9: 0xE396, + 0xFBEA: 0xE397, + 0xFBEB: 0xE398, + 0xFBEC: 0xE399, + 0xFBED: 0xE39A, + 0xFBEE: 0xE39B, + 0xFBEF: 0xE39C, + 0xFBF0: 0xE39D, + 0xFBF1: 0xE39E, + 0xFBF2: 0xE39F, + 0xFBF3: 0xE3A0, + 0xFBF4: 0xE3A1, + 0xFBF5: 0xE3A2, + 0xFBF6: 0xE3A3, + 0xFBF7: 0xE3A4, + 0xFBF8: 0xE3A5, + 0xFBF9: 0xE3A6, + 0xFBFA: 0xE3A7, + 0xFBFB: 0xE3A8, + 0xFBFC: 0xE3A9, + 0xFBFD: 0xE3AA, + 0xFBFE: 0xE3AB, + 0xFC40: 0x9EAB, + 0xFC41: 0x9EAC, + 0xFC42: 0x9EAD, + 0xFC43: 0x9EAE, + 0xFC44: 0x9EAF, + 0xFC45: 0x9EB0, + 0xFC46: 0x9EB1, + 0xFC47: 0x9EB2, + 0xFC48: 0x9EB3, + 0xFC49: 0x9EB5, + 0xFC4A: 0x9EB6, + 0xFC4B: 0x9EB7, + 0xFC4C: 0x9EB9, + 0xFC4D: 0x9EBA, + 0xFC4E: 0x9EBC, + 0xFC4F: 0x9EBF, + 0xFC50: 0x9EC0, + 0xFC51: 0x9EC1, + 0xFC52: 0x9EC2, + 0xFC53: 0x9EC3, + 0xFC54: 0x9EC5, + 0xFC55: 0x9EC6, + 0xFC56: 0x9EC7, + 0xFC57: 0x9EC8, + 0xFC58: 0x9ECA, + 0xFC59: 0x9ECB, + 0xFC5A: 0x9ECC, + 0xFC5B: 0x9ED0, + 0xFC5C: 0x9ED2, + 0xFC5D: 0x9ED3, + 0xFC5E: 0x9ED5, + 0xFC5F: 0x9ED6, + 0xFC60: 0x9ED7, + 0xFC61: 0x9ED9, + 0xFC62: 0x9EDA, + 0xFC63: 0x9EDE, + 0xFC64: 0x9EE1, + 0xFC65: 0x9EE3, + 0xFC66: 0x9EE4, + 0xFC67: 0x9EE6, + 0xFC68: 0x9EE8, + 0xFC69: 0x9EEB, + 0xFC6A: 0x9EEC, + 0xFC6B: 0x9EED, + 0xFC6C: 0x9EEE, + 0xFC6D: 0x9EF0, + 0xFC6E: 0x9EF1, + 0xFC6F: 0x9EF2, + 0xFC70: 0x9EF3, + 0xFC71: 0x9EF4, + 0xFC72: 0x9EF5, + 0xFC73: 0x9EF6, + 0xFC74: 0x9EF7, + 0xFC75: 0x9EF8, + 0xFC76: 0x9EFA, + 0xFC77: 0x9EFD, + 0xFC78: 0x9EFF, + 0xFC79: 0x9F00, + 0xFC7A: 0x9F01, + 0xFC7B: 0x9F02, + 0xFC7C: 0x9F03, + 0xFC7D: 0x9F04, + 0xFC7E: 0x9F05, + 0xFC80: 0x9F06, + 0xFC81: 0x9F07, + 0xFC82: 0x9F08, + 0xFC83: 0x9F09, + 0xFC84: 0x9F0A, + 0xFC85: 0x9F0C, + 0xFC86: 0x9F0F, + 0xFC87: 0x9F11, + 0xFC88: 0x9F12, + 0xFC89: 0x9F14, + 0xFC8A: 0x9F15, + 0xFC8B: 0x9F16, + 0xFC8C: 0x9F18, + 0xFC8D: 0x9F1A, + 0xFC8E: 0x9F1B, + 0xFC8F: 0x9F1C, + 0xFC90: 0x9F1D, + 0xFC91: 0x9F1E, + 0xFC92: 0x9F1F, + 0xFC93: 0x9F21, + 0xFC94: 0x9F23, + 0xFC95: 0x9F24, + 0xFC96: 0x9F25, + 0xFC97: 0x9F26, + 0xFC98: 0x9F27, + 0xFC99: 0x9F28, + 0xFC9A: 0x9F29, + 0xFC9B: 0x9F2A, + 0xFC9C: 0x9F2B, + 0xFC9D: 0x9F2D, + 0xFC9E: 0x9F2E, + 0xFC9F: 0x9F30, + 0xFCA0: 0x9F31, + 0xFCA1: 0xE3AC, + 0xFCA2: 0xE3AD, + 0xFCA3: 0xE3AE, + 0xFCA4: 0xE3AF, + 0xFCA5: 0xE3B0, + 0xFCA6: 0xE3B1, + 0xFCA7: 0xE3B2, + 0xFCA8: 0xE3B3, + 0xFCA9: 0xE3B4, + 0xFCAA: 0xE3B5, + 0xFCAB: 0xE3B6, + 0xFCAC: 0xE3B7, + 0xFCAD: 0xE3B8, + 0xFCAE: 0xE3B9, + 0xFCAF: 0xE3BA, + 0xFCB0: 0xE3BB, + 0xFCB1: 0xE3BC, + 0xFCB2: 0xE3BD, + 0xFCB3: 0xE3BE, + 0xFCB4: 0xE3BF, + 0xFCB5: 0xE3C0, + 0xFCB6: 0xE3C1, + 0xFCB7: 0xE3C2, + 0xFCB8: 0xE3C3, + 0xFCB9: 0xE3C4, + 0xFCBA: 0xE3C5, + 0xFCBB: 0xE3C6, + 0xFCBC: 0xE3C7, + 0xFCBD: 0xE3C8, + 0xFCBE: 0xE3C9, + 0xFCBF: 0xE3CA, + 0xFCC0: 0xE3CB, + 0xFCC1: 0xE3CC, + 0xFCC2: 0xE3CD, + 0xFCC3: 0xE3CE, + 0xFCC4: 0xE3CF, + 0xFCC5: 0xE3D0, + 0xFCC6: 0xE3D1, + 0xFCC7: 0xE3D2, + 0xFCC8: 0xE3D3, + 0xFCC9: 0xE3D4, + 0xFCCA: 0xE3D5, + 0xFCCB: 0xE3D6, + 0xFCCC: 0xE3D7, + 0xFCCD: 0xE3D8, + 0xFCCE: 0xE3D9, + 0xFCCF: 0xE3DA, + 0xFCD0: 0xE3DB, + 0xFCD1: 0xE3DC, + 0xFCD2: 0xE3DD, + 0xFCD3: 0xE3DE, + 0xFCD4: 0xE3DF, + 0xFCD5: 0xE3E0, + 0xFCD6: 0xE3E1, + 0xFCD7: 0xE3E2, + 0xFCD8: 0xE3E3, + 0xFCD9: 0xE3E4, + 0xFCDA: 0xE3E5, + 0xFCDB: 0xE3E6, + 0xFCDC: 0xE3E7, + 0xFCDD: 0xE3E8, + 0xFCDE: 0xE3E9, + 0xFCDF: 0xE3EA, + 0xFCE0: 0xE3EB, + 0xFCE1: 0xE3EC, + 0xFCE2: 0xE3ED, + 0xFCE3: 0xE3EE, + 0xFCE4: 0xE3EF, + 0xFCE5: 0xE3F0, + 0xFCE6: 0xE3F1, + 0xFCE7: 0xE3F2, + 0xFCE8: 0xE3F3, + 0xFCE9: 0xE3F4, + 0xFCEA: 0xE3F5, + 0xFCEB: 0xE3F6, + 0xFCEC: 0xE3F7, + 0xFCED: 0xE3F8, + 0xFCEE: 0xE3F9, + 0xFCEF: 0xE3FA, + 0xFCF0: 0xE3FB, + 0xFCF1: 0xE3FC, + 0xFCF2: 0xE3FD, + 0xFCF3: 0xE3FE, + 0xFCF4: 0xE3FF, + 0xFCF5: 0xE400, + 0xFCF6: 0xE401, + 0xFCF7: 0xE402, + 0xFCF8: 0xE403, + 0xFCF9: 0xE404, + 0xFCFA: 0xE405, + 0xFCFB: 0xE406, + 0xFCFC: 0xE407, + 0xFCFD: 0xE408, + 0xFCFE: 0xE409, + 0xFD40: 0x9F32, + 0xFD41: 0x9F33, + 0xFD42: 0x9F34, + 0xFD43: 0x9F35, + 0xFD44: 0x9F36, + 0xFD45: 0x9F38, + 0xFD46: 0x9F3A, + 0xFD47: 0x9F3C, + 0xFD48: 0x9F3F, + 0xFD49: 0x9F40, + 0xFD4A: 0x9F41, + 0xFD4B: 0x9F42, + 0xFD4C: 0x9F43, + 0xFD4D: 0x9F45, + 0xFD4E: 0x9F46, + 0xFD4F: 0x9F47, + 0xFD50: 0x9F48, + 0xFD51: 0x9F49, + 0xFD52: 0x9F4A, + 0xFD53: 0x9F4B, + 0xFD54: 0x9F4C, + 0xFD55: 0x9F4D, + 0xFD56: 0x9F4E, + 0xFD57: 0x9F4F, + 0xFD58: 0x9F52, + 0xFD59: 0x9F53, + 0xFD5A: 0x9F54, + 0xFD5B: 0x9F55, + 0xFD5C: 0x9F56, + 0xFD5D: 0x9F57, + 0xFD5E: 0x9F58, + 0xFD5F: 0x9F59, + 0xFD60: 0x9F5A, + 0xFD61: 0x9F5B, + 0xFD62: 0x9F5C, + 0xFD63: 0x9F5D, + 0xFD64: 0x9F5E, + 0xFD65: 0x9F5F, + 0xFD66: 0x9F60, + 0xFD67: 0x9F61, + 0xFD68: 0x9F62, + 0xFD69: 0x9F63, + 0xFD6A: 0x9F64, + 0xFD6B: 0x9F65, + 0xFD6C: 0x9F66, + 0xFD6D: 0x9F67, + 0xFD6E: 0x9F68, + 0xFD6F: 0x9F69, + 0xFD70: 0x9F6A, + 0xFD71: 0x9F6B, + 0xFD72: 0x9F6C, + 0xFD73: 0x9F6D, + 0xFD74: 0x9F6E, + 0xFD75: 0x9F6F, + 0xFD76: 0x9F70, + 0xFD77: 0x9F71, + 0xFD78: 0x9F72, + 0xFD79: 0x9F73, + 0xFD7A: 0x9F74, + 0xFD7B: 0x9F75, + 0xFD7C: 0x9F76, + 0xFD7D: 0x9F77, + 0xFD7E: 0x9F78, + 0xFD80: 0x9F79, + 0xFD81: 0x9F7A, + 0xFD82: 0x9F7B, + 0xFD83: 0x9F7C, + 0xFD84: 0x9F7D, + 0xFD85: 0x9F7E, + 0xFD86: 0x9F81, + 0xFD87: 0x9F82, + 0xFD88: 0x9F8D, + 0xFD89: 0x9F8E, + 0xFD8A: 0x9F8F, + 0xFD8B: 0x9F90, + 0xFD8C: 0x9F91, + 0xFD8D: 0x9F92, + 0xFD8E: 0x9F93, + 0xFD8F: 0x9F94, + 0xFD90: 0x9F95, + 0xFD91: 0x9F96, + 0xFD92: 0x9F97, + 0xFD93: 0x9F98, + 0xFD94: 0x9F9C, + 0xFD95: 0x9F9D, + 0xFD96: 0x9F9E, + 0xFD97: 0x9FA1, + 0xFD98: 0x9FA2, + 0xFD99: 0x9FA3, + 0xFD9A: 0x9FA4, + 0xFD9B: 0x9FA5, + 0xFD9C: 0xF92C, + 0xFD9D: 0xF979, + 0xFD9E: 0xF995, + 0xFD9F: 0xF9E7, + 0xFDA0: 0xF9F1, + 0xFDA1: 0xE40A, + 0xFDA2: 0xE40B, + 0xFDA3: 0xE40C, + 0xFDA4: 0xE40D, + 0xFDA5: 0xE40E, + 0xFDA6: 0xE40F, + 0xFDA7: 0xE410, + 0xFDA8: 0xE411, + 0xFDA9: 0xE412, + 0xFDAA: 0xE413, + 0xFDAB: 0xE414, + 0xFDAC: 0xE415, + 0xFDAD: 0xE416, + 0xFDAE: 0xE417, + 0xFDAF: 0xE418, + 0xFDB0: 0xE419, + 0xFDB1: 0xE41A, + 0xFDB2: 0xE41B, + 0xFDB3: 0xE41C, + 0xFDB4: 0xE41D, + 0xFDB5: 0xE41E, + 0xFDB6: 0xE41F, + 0xFDB7: 0xE420, + 0xFDB8: 0xE421, + 0xFDB9: 0xE422, + 0xFDBA: 0xE423, + 0xFDBB: 0xE424, + 0xFDBC: 0xE425, + 0xFDBD: 0xE426, + 0xFDBE: 0xE427, + 0xFDBF: 0xE428, + 0xFDC0: 0xE429, + 0xFDC1: 0xE42A, + 0xFDC2: 0xE42B, + 0xFDC3: 0xE42C, + 0xFDC4: 0xE42D, + 0xFDC5: 0xE42E, + 0xFDC6: 0xE42F, + 0xFDC7: 0xE430, + 0xFDC8: 0xE431, + 0xFDC9: 0xE432, + 0xFDCA: 0xE433, + 0xFDCB: 0xE434, + 0xFDCC: 0xE435, + 0xFDCD: 0xE436, + 0xFDCE: 0xE437, + 0xFDCF: 0xE438, + 0xFDD0: 0xE439, + 0xFDD1: 0xE43A, + 0xFDD2: 0xE43B, + 0xFDD3: 0xE43C, + 0xFDD4: 0xE43D, + 0xFDD5: 0xE43E, + 0xFDD6: 0xE43F, + 0xFDD7: 0xE440, + 0xFDD8: 0xE441, + 0xFDD9: 0xE442, + 0xFDDA: 0xE443, + 0xFDDB: 0xE444, + 0xFDDC: 0xE445, + 0xFDDD: 0xE446, + 0xFDDE: 0xE447, + 0xFDDF: 0xE448, + 0xFDE0: 0xE449, + 0xFDE1: 0xE44A, + 0xFDE2: 0xE44B, + 0xFDE3: 0xE44C, + 0xFDE4: 0xE44D, + 0xFDE5: 0xE44E, + 0xFDE6: 0xE44F, + 0xFDE7: 0xE450, + 0xFDE8: 0xE451, + 0xFDE9: 0xE452, + 0xFDEA: 0xE453, + 0xFDEB: 0xE454, + 0xFDEC: 0xE455, + 0xFDED: 0xE456, + 0xFDEE: 0xE457, + 0xFDEF: 0xE458, + 0xFDF0: 0xE459, + 0xFDF1: 0xE45A, + 0xFDF2: 0xE45B, + 0xFDF3: 0xE45C, + 0xFDF4: 0xE45D, + 0xFDF5: 0xE45E, + 0xFDF6: 0xE45F, + 0xFDF7: 0xE460, + 0xFDF8: 0xE461, + 0xFDF9: 0xE462, + 0xFDFA: 0xE463, + 0xFDFB: 0xE464, + 0xFDFC: 0xE465, + 0xFDFD: 0xE466, + 0xFDFE: 0xE467, + 0xFE40: 0xFA0C, + 0xFE41: 0xFA0D, + 0xFE42: 0xFA0E, + 0xFE43: 0xFA0F, + 0xFE44: 0xFA11, + 0xFE45: 0xFA13, + 0xFE46: 0xFA14, + 0xFE47: 0xFA18, + 0xFE48: 0xFA1F, + 0xFE49: 0xFA20, + 0xFE4A: 0xFA21, + 0xFE4B: 0xFA23, + 0xFE4C: 0xFA24, + 0xFE4D: 0xFA27, + 0xFE4E: 0xFA28, + 0xFE4F: 0xFA29, + 0xFE50: 0x2E81, + 0xFE54: 0x2E84, + 0xFE55: 0x3473, + 0xFE56: 0x3447, + 0xFE57: 0x2E88, + 0xFE58: 0x2E8B, + 0xFE59: 0x9FB4, + 0xFE5A: 0x359E, + 0xFE5B: 0x361A, + 0xFE5C: 0x360E, + 0xFE5D: 0x2E8C, + 0xFE5E: 0x2E97, + 0xFE5F: 0x396E, + 0xFE60: 0x3918, + 0xFE61: 0x9FB5, + 0xFE62: 0x39CF, + 0xFE63: 0x39DF, + 0xFE64: 0x3A73, + 0xFE65: 0x39D0, + 0xFE66: 0x9FB6, + 0xFE67: 0x9FB7, + 0xFE68: 0x3B4E, + 0xFE69: 0x3C6E, + 0xFE6A: 0x3CE0, + 0xFE6B: 0x2EA7, + 0xFE6D: 0x9FB8, + 0xFE6E: 0x2EAA, + 0xFE6F: 0x4056, + 0xFE70: 0x415F, + 0xFE71: 0x2EAE, + 0xFE72: 0x4337, + 0xFE73: 0x2EB3, + 0xFE74: 0x2EB6, + 0xFE75: 0x2EB7, + 0xFE77: 0x43B1, + 0xFE78: 0x43AC, + 0xFE79: 0x2EBB, + 0xFE7A: 0x43DD, + 0xFE7B: 0x44D6, + 0xFE7C: 0x4661, + 0xFE7D: 0x464C, + 0xFE7E: 0x9FB9, + 0xFE80: 0x4723, + 0xFE81: 0x4729, + 0xFE82: 0x477C, + 0xFE83: 0x478D, + 0xFE84: 0x2ECA, + 0xFE85: 0x4947, + 0xFE86: 0x497A, + 0xFE87: 0x497D, + 0xFE88: 0x4982, + 0xFE89: 0x4983, + 0xFE8A: 0x4985, + 0xFE8B: 0x4986, + 0xFE8C: 0x499F, + 0xFE8D: 0x499B, + 0xFE8E: 0x49B7, + 0xFE8F: 0x49B6, + 0xFE90: 0x9FBA, + 0xFE92: 0x4CA3, + 0xFE93: 0x4C9F, + 0xFE94: 0x4CA0, + 0xFE95: 0x4CA1, + 0xFE96: 0x4C77, + 0xFE97: 0x4CA2, + 0xFE98: 0x4D13, + 0xFE99: 0x4D14, + 0xFE9A: 0x4D15, + 0xFE9B: 0x4D16, + 0xFE9C: 0x4D17, + 0xFE9D: 0x4D18, + 0xFE9E: 0x4D19, + 0xFE9F: 0x4DAE, + 0xFEA0: 0x9FBB, + 0xFEA1: 0xE468, + 0xFEA2: 0xE469, + 0xFEA3: 0xE46A, + 0xFEA4: 0xE46B, + 0xFEA5: 0xE46C, + 0xFEA6: 0xE46D, + 0xFEA7: 0xE46E, + 0xFEA8: 0xE46F, + 0xFEA9: 0xE470, + 0xFEAA: 0xE471, + 0xFEAB: 0xE472, + 0xFEAC: 0xE473, + 0xFEAD: 0xE474, + 0xFEAE: 0xE475, + 0xFEAF: 0xE476, + 0xFEB0: 0xE477, + 0xFEB1: 0xE478, + 0xFEB2: 0xE479, + 0xFEB3: 0xE47A, + 0xFEB4: 0xE47B, + 0xFEB5: 0xE47C, + 0xFEB6: 0xE47D, + 0xFEB7: 0xE47E, + 0xFEB8: 0xE47F, + 0xFEB9: 0xE480, + 0xFEBA: 0xE481, + 0xFEBB: 0xE482, + 0xFEBC: 0xE483, + 0xFEBD: 0xE484, + 0xFEBE: 0xE485, + 0xFEBF: 0xE486, + 0xFEC0: 0xE487, + 0xFEC1: 0xE488, + 0xFEC2: 0xE489, + 0xFEC3: 0xE48A, + 0xFEC4: 0xE48B, + 0xFEC5: 0xE48C, + 0xFEC6: 0xE48D, + 0xFEC7: 0xE48E, + 0xFEC8: 0xE48F, + 0xFEC9: 0xE490, + 0xFECA: 0xE491, + 0xFECB: 0xE492, + 0xFECC: 0xE493, + 0xFECD: 0xE494, + 0xFECE: 0xE495, + 0xFECF: 0xE496, + 0xFED0: 0xE497, + 0xFED1: 0xE498, + 0xFED2: 0xE499, + 0xFED3: 0xE49A, + 0xFED4: 0xE49B, + 0xFED5: 0xE49C, + 0xFED6: 0xE49D, + 0xFED7: 0xE49E, + 0xFED8: 0xE49F, + 0xFED9: 0xE4A0, + 0xFEDA: 0xE4A1, + 0xFEDB: 0xE4A2, + 0xFEDC: 0xE4A3, + 0xFEDD: 0xE4A4, + 0xFEDE: 0xE4A5, + 0xFEDF: 0xE4A6, + 0xFEE0: 0xE4A7, + 0xFEE1: 0xE4A8, + 0xFEE2: 0xE4A9, + 0xFEE3: 0xE4AA, + 0xFEE4: 0xE4AB, + 0xFEE5: 0xE4AC, + 0xFEE6: 0xE4AD, + 0xFEE7: 0xE4AE, + 0xFEE8: 0xE4AF, + 0xFEE9: 0xE4B0, + 0xFEEA: 0xE4B1, + 0xFEEB: 0xE4B2, + 0xFEEC: 0xE4B3, + 0xFEED: 0xE4B4, + 0xFEEE: 0xE4B5, + 0xFEEF: 0xE4B6, + 0xFEF0: 0xE4B7, + 0xFEF1: 0xE4B8, + 0xFEF2: 0xE4B9, + 0xFEF3: 0xE4BA, + 0xFEF4: 0xE4BB, + 0xFEF5: 0xE4BC, + 0xFEF6: 0xE4BD, + 0xFEF7: 0xE4BE, + 0xFEF8: 0xE4BF, + 0xFEF9: 0xE4C0, + 0xFEFA: 0xE4C1, + 0xFEFB: 0xE4C2, + 0xFEFC: 0xE4C3, + 0xFEFD: 0xE4C4, + 0xFEFE: 0xE4C5, +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/gbk.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/gbk.go new file mode 100644 index 0000000000000000000000000000000000000000..c7617c64fd139bcd70f7343cea8df4ec13fabc18 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/gbk.go @@ -0,0 +1,77 @@ +package mahonia + +// Converters for GBK encoding. + +func init() { + RegisterCharset(&Charset{ + Name: "GBK", + NewDecoder: func() Decoder { + return decodeGBKRune + }, + NewEncoder: func() Encoder { + return encodeGBKRune + }, + }) +} + +func decodeGBKRune(p []byte) (r rune, size int, status Status) { + if len(p) == 0 { + status = NO_ROOM + return + } + + b := p[0] + if b < 128 { + return rune(b), 1, SUCCESS + } + + if len(p) < 2 { + status = NO_ROOM + return + } + + c := uint16(p[0])<<8 + uint16(p[1]) + r = rune(gbkToUnicode[c]) + if r == 0 { + r = gbkToUnicodeExtra[c] + } + + if r != 0 { + return r, 2, SUCCESS + } + + return 0xfffd, 1, INVALID_CHAR +} + +func encodeGBKRune(p []byte, r rune) (size int, status Status) { + if len(p) == 0 { + status = NO_ROOM + return + } + + if r < 128 { + p[0] = byte(r) + return 1, SUCCESS + } + + if len(p) < 2 { + status = NO_ROOM + return + } + + var c uint16 + if r < 0x10000 { + c = unicodeToGBK[r] + } else { + c = unicodeToGBKExtra[r] + } + + if c != 0 { + p[0] = byte(c >> 8) + p[1] = byte(c) + return 2, SUCCESS + } + + p[0] = 0x1a + return 1, INVALID_CHAR +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/jis0201-data.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/jis0201-data.go new file mode 100644 index 0000000000000000000000000000000000000000..e46a3adf5d5eb65302b31e4724db22b7598445cd --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/jis0201-data.go @@ -0,0 +1,162 @@ +package mahonia + +var jis0201ToUnicode = [256]uint16{ + 0x20: 0x0020, // SPACE + 0x21: 0x0021, // EXCLAMATION MARK + 0x22: 0x0022, // QUOTATION MARK + 0x23: 0x0023, // NUMBER SIGN + 0x24: 0x0024, // DOLLAR SIGN + 0x25: 0x0025, // PERCENT SIGN + 0x26: 0x0026, // AMPERSAND + 0x27: 0x0027, // APOSTROPHE + 0x28: 0x0028, // LEFT PARENTHESIS + 0x29: 0x0029, // RIGHT PARENTHESIS + 0x2A: 0x002A, // ASTERISK + 0x2B: 0x002B, // PLUS SIGN + 0x2C: 0x002C, // COMMA + 0x2D: 0x002D, // HYPHEN-MINUS + 0x2E: 0x002E, // FULL STOP + 0x2F: 0x002F, // SOLIDUS + 0x30: 0x0030, // DIGIT ZERO + 0x31: 0x0031, // DIGIT ONE + 0x32: 0x0032, // DIGIT TWO + 0x33: 0x0033, // DIGIT THREE + 0x34: 0x0034, // DIGIT FOUR + 0x35: 0x0035, // DIGIT FIVE + 0x36: 0x0036, // DIGIT SIX + 0x37: 0x0037, // DIGIT SEVEN + 0x38: 0x0038, // DIGIT EIGHT + 0x39: 0x0039, // DIGIT NINE + 0x3A: 0x003A, // COLON + 0x3B: 0x003B, // SEMICOLON + 0x3C: 0x003C, // LESS-THAN SIGN + 0x3D: 0x003D, // EQUALS SIGN + 0x3E: 0x003E, // GREATER-THAN SIGN + 0x3F: 0x003F, // QUESTION MARK + 0x40: 0x0040, // COMMERCIAL AT + 0x41: 0x0041, // LATIN CAPITAL LETTER A + 0x42: 0x0042, // LATIN CAPITAL LETTER B + 0x43: 0x0043, // LATIN CAPITAL LETTER C + 0x44: 0x0044, // LATIN CAPITAL LETTER D + 0x45: 0x0045, // LATIN CAPITAL LETTER E + 0x46: 0x0046, // LATIN CAPITAL LETTER F + 0x47: 0x0047, // LATIN CAPITAL LETTER G + 0x48: 0x0048, // LATIN CAPITAL LETTER H + 0x49: 0x0049, // LATIN CAPITAL LETTER I + 0x4A: 0x004A, // LATIN CAPITAL LETTER J + 0x4B: 0x004B, // LATIN CAPITAL LETTER K + 0x4C: 0x004C, // LATIN CAPITAL LETTER L + 0x4D: 0x004D, // LATIN CAPITAL LETTER M + 0x4E: 0x004E, // LATIN CAPITAL LETTER N + 0x4F: 0x004F, // LATIN CAPITAL LETTER O + 0x50: 0x0050, // LATIN CAPITAL LETTER P + 0x51: 0x0051, // LATIN CAPITAL LETTER Q + 0x52: 0x0052, // LATIN CAPITAL LETTER R + 0x53: 0x0053, // LATIN CAPITAL LETTER S + 0x54: 0x0054, // LATIN CAPITAL LETTER T + 0x55: 0x0055, // LATIN CAPITAL LETTER U + 0x56: 0x0056, // LATIN CAPITAL LETTER V + 0x57: 0x0057, // LATIN CAPITAL LETTER W + 0x58: 0x0058, // LATIN CAPITAL LETTER X + 0x59: 0x0059, // LATIN CAPITAL LETTER Y + 0x5A: 0x005A, // LATIN CAPITAL LETTER Z + 0x5B: 0x005B, // LEFT SQUARE BRACKET + 0x5C: 0x00A5, // YEN SIGN + 0x5D: 0x005D, // RIGHT SQUARE BRACKET + 0x5E: 0x005E, // CIRCUMFLEX ACCENT + 0x5F: 0x005F, // LOW LINE + 0x60: 0x0060, // GRAVE ACCENT + 0x61: 0x0061, // LATIN SMALL LETTER A + 0x62: 0x0062, // LATIN SMALL LETTER B + 0x63: 0x0063, // LATIN SMALL LETTER C + 0x64: 0x0064, // LATIN SMALL LETTER D + 0x65: 0x0065, // LATIN SMALL LETTER E + 0x66: 0x0066, // LATIN SMALL LETTER F + 0x67: 0x0067, // LATIN SMALL LETTER G + 0x68: 0x0068, // LATIN SMALL LETTER H + 0x69: 0x0069, // LATIN SMALL LETTER I + 0x6A: 0x006A, // LATIN SMALL LETTER J + 0x6B: 0x006B, // LATIN SMALL LETTER K + 0x6C: 0x006C, // LATIN SMALL LETTER L + 0x6D: 0x006D, // LATIN SMALL LETTER M + 0x6E: 0x006E, // LATIN SMALL LETTER N + 0x6F: 0x006F, // LATIN SMALL LETTER O + 0x70: 0x0070, // LATIN SMALL LETTER P + 0x71: 0x0071, // LATIN SMALL LETTER Q + 0x72: 0x0072, // LATIN SMALL LETTER R + 0x73: 0x0073, // LATIN SMALL LETTER S + 0x74: 0x0074, // LATIN SMALL LETTER T + 0x75: 0x0075, // LATIN SMALL LETTER U + 0x76: 0x0076, // LATIN SMALL LETTER V + 0x77: 0x0077, // LATIN SMALL LETTER W + 0x78: 0x0078, // LATIN SMALL LETTER X + 0x79: 0x0079, // LATIN SMALL LETTER Y + 0x7A: 0x007A, // LATIN SMALL LETTER Z + 0x7B: 0x007B, // LEFT CURLY BRACKET + 0x7C: 0x007C, // VERTICAL LINE + 0x7D: 0x007D, // RIGHT CURLY BRACKET + 0x7E: 0x203E, // OVERLINE + 0xA1: 0xFF61, // HALFWIDTH IDEOGRAPHIC FULL STOP + 0xA2: 0xFF62, // HALFWIDTH LEFT CORNER BRACKET + 0xA3: 0xFF63, // HALFWIDTH RIGHT CORNER BRACKET + 0xA4: 0xFF64, // HALFWIDTH IDEOGRAPHIC COMMA + 0xA5: 0xFF65, // HALFWIDTH KATAKANA MIDDLE DOT + 0xA6: 0xFF66, // HALFWIDTH KATAKANA LETTER WO + 0xA7: 0xFF67, // HALFWIDTH KATAKANA LETTER SMALL A + 0xA8: 0xFF68, // HALFWIDTH KATAKANA LETTER SMALL I + 0xA9: 0xFF69, // HALFWIDTH KATAKANA LETTER SMALL U + 0xAA: 0xFF6A, // HALFWIDTH KATAKANA LETTER SMALL E + 0xAB: 0xFF6B, // HALFWIDTH KATAKANA LETTER SMALL O + 0xAC: 0xFF6C, // HALFWIDTH KATAKANA LETTER SMALL YA + 0xAD: 0xFF6D, // HALFWIDTH KATAKANA LETTER SMALL YU + 0xAE: 0xFF6E, // HALFWIDTH KATAKANA LETTER SMALL YO + 0xAF: 0xFF6F, // HALFWIDTH KATAKANA LETTER SMALL TU + 0xB0: 0xFF70, // HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK + 0xB1: 0xFF71, // HALFWIDTH KATAKANA LETTER A + 0xB2: 0xFF72, // HALFWIDTH KATAKANA LETTER I + 0xB3: 0xFF73, // HALFWIDTH KATAKANA LETTER U + 0xB4: 0xFF74, // HALFWIDTH KATAKANA LETTER E + 0xB5: 0xFF75, // HALFWIDTH KATAKANA LETTER O + 0xB6: 0xFF76, // HALFWIDTH KATAKANA LETTER KA + 0xB7: 0xFF77, // HALFWIDTH KATAKANA LETTER KI + 0xB8: 0xFF78, // HALFWIDTH KATAKANA LETTER KU + 0xB9: 0xFF79, // HALFWIDTH KATAKANA LETTER KE + 0xBA: 0xFF7A, // HALFWIDTH KATAKANA LETTER KO + 0xBB: 0xFF7B, // HALFWIDTH KATAKANA LETTER SA + 0xBC: 0xFF7C, // HALFWIDTH KATAKANA LETTER SI + 0xBD: 0xFF7D, // HALFWIDTH KATAKANA LETTER SU + 0xBE: 0xFF7E, // HALFWIDTH KATAKANA LETTER SE + 0xBF: 0xFF7F, // HALFWIDTH KATAKANA LETTER SO + 0xC0: 0xFF80, // HALFWIDTH KATAKANA LETTER TA + 0xC1: 0xFF81, // HALFWIDTH KATAKANA LETTER TI + 0xC2: 0xFF82, // HALFWIDTH KATAKANA LETTER TU + 0xC3: 0xFF83, // HALFWIDTH KATAKANA LETTER TE + 0xC4: 0xFF84, // HALFWIDTH KATAKANA LETTER TO + 0xC5: 0xFF85, // HALFWIDTH KATAKANA LETTER NA + 0xC6: 0xFF86, // HALFWIDTH KATAKANA LETTER NI + 0xC7: 0xFF87, // HALFWIDTH KATAKANA LETTER NU + 0xC8: 0xFF88, // HALFWIDTH KATAKANA LETTER NE + 0xC9: 0xFF89, // HALFWIDTH KATAKANA LETTER NO + 0xCA: 0xFF8A, // HALFWIDTH KATAKANA LETTER HA + 0xCB: 0xFF8B, // HALFWIDTH KATAKANA LETTER HI + 0xCC: 0xFF8C, // HALFWIDTH KATAKANA LETTER HU + 0xCD: 0xFF8D, // HALFWIDTH KATAKANA LETTER HE + 0xCE: 0xFF8E, // HALFWIDTH KATAKANA LETTER HO + 0xCF: 0xFF8F, // HALFWIDTH KATAKANA LETTER MA + 0xD0: 0xFF90, // HALFWIDTH KATAKANA LETTER MI + 0xD1: 0xFF91, // HALFWIDTH KATAKANA LETTER MU + 0xD2: 0xFF92, // HALFWIDTH KATAKANA LETTER ME + 0xD3: 0xFF93, // HALFWIDTH KATAKANA LETTER MO + 0xD4: 0xFF94, // HALFWIDTH KATAKANA LETTER YA + 0xD5: 0xFF95, // HALFWIDTH KATAKANA LETTER YU + 0xD6: 0xFF96, // HALFWIDTH KATAKANA LETTER YO + 0xD7: 0xFF97, // HALFWIDTH KATAKANA LETTER RA + 0xD8: 0xFF98, // HALFWIDTH KATAKANA LETTER RI + 0xD9: 0xFF99, // HALFWIDTH KATAKANA LETTER RU + 0xDA: 0xFF9A, // HALFWIDTH KATAKANA LETTER RE + 0xDB: 0xFF9B, // HALFWIDTH KATAKANA LETTER RO + 0xDC: 0xFF9C, // HALFWIDTH KATAKANA LETTER WA + 0xDD: 0xFF9D, // HALFWIDTH KATAKANA LETTER N + 0xDE: 0xFF9E, // HALFWIDTH KATAKANA VOICED SOUND MARK + 0xDF: 0xFF9F, // HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/jis0208-data.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/jis0208-data.go new file mode 100644 index 0000000000000000000000000000000000000000..66571dceba6338e0cff85bb25c55d41aff9f5e9e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/jis0208-data.go @@ -0,0 +1,6883 @@ +package mahonia + +var jis0208ToUnicode = [65536]uint16{ + 0x2121: 0x3000, // IDEOGRAPHIC SPACE + 0x2122: 0x3001, // IDEOGRAPHIC COMMA + 0x2123: 0x3002, // IDEOGRAPHIC FULL STOP + 0x2124: 0xFF0C, // FULLWIDTH COMMA + 0x2125: 0xFF0E, // FULLWIDTH FULL STOP + 0x2126: 0x30FB, // KATAKANA MIDDLE DOT + 0x2127: 0xFF1A, // FULLWIDTH COLON + 0x2128: 0xFF1B, // FULLWIDTH SEMICOLON + 0x2129: 0xFF1F, // FULLWIDTH QUESTION MARK + 0x212A: 0xFF01, // FULLWIDTH EXCLAMATION MARK + 0x212B: 0x309B, // KATAKANA-HIRAGANA VOICED SOUND MARK + 0x212C: 0x309C, // KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + 0x212D: 0x00B4, // ACUTE ACCENT + 0x212E: 0xFF40, // FULLWIDTH GRAVE ACCENT + 0x212F: 0x00A8, // DIAERESIS + 0x2130: 0xFF3E, // FULLWIDTH CIRCUMFLEX ACCENT + 0x2131: 0xFFE3, // FULLWIDTH MACRON + 0x2132: 0xFF3F, // FULLWIDTH LOW LINE + 0x2133: 0x30FD, // KATAKANA ITERATION MARK + 0x2134: 0x30FE, // KATAKANA VOICED ITERATION MARK + 0x2135: 0x309D, // HIRAGANA ITERATION MARK + 0x2136: 0x309E, // HIRAGANA VOICED ITERATION MARK + 0x2137: 0x3003, // DITTO MARK + 0x2138: 0x4EDD, + 0x2139: 0x3005, // IDEOGRAPHIC ITERATION MARK + 0x213A: 0x3006, // IDEOGRAPHIC CLOSING MARK + 0x213B: 0x3007, // IDEOGRAPHIC NUMBER ZERO + 0x213C: 0x30FC, // KATAKANA-HIRAGANA PROLONGED SOUND MARK + 0x213D: 0x2015, // HORIZONTAL BAR + 0x213E: 0x2010, // HYPHEN + 0x213F: 0xFF0F, // FULLWIDTH SOLIDUS + 0x2140: 0x005C, // REVERSE SOLIDUS + 0x2141: 0x301C, // WAVE DASH + 0x2142: 0x2016, // DOUBLE VERTICAL LINE + 0x2143: 0xFF5C, // FULLWIDTH VERTICAL LINE + 0x2144: 0x2026, // HORIZONTAL ELLIPSIS + 0x2145: 0x2025, // TWO DOT LEADER + 0x2146: 0x2018, // LEFT SINGLE QUOTATION MARK + 0x2147: 0x2019, // RIGHT SINGLE QUOTATION MARK + 0x2148: 0x201C, // LEFT DOUBLE QUOTATION MARK + 0x2149: 0x201D, // RIGHT DOUBLE QUOTATION MARK + 0x214A: 0xFF08, // FULLWIDTH LEFT PARENTHESIS + 0x214B: 0xFF09, // FULLWIDTH RIGHT PARENTHESIS + 0x214C: 0x3014, // LEFT TORTOISE SHELL BRACKET + 0x214D: 0x3015, // RIGHT TORTOISE SHELL BRACKET + 0x214E: 0xFF3B, // FULLWIDTH LEFT SQUARE BRACKET + 0x214F: 0xFF3D, // FULLWIDTH RIGHT SQUARE BRACKET + 0x2150: 0xFF5B, // FULLWIDTH LEFT CURLY BRACKET + 0x2151: 0xFF5D, // FULLWIDTH RIGHT CURLY BRACKET + 0x2152: 0x3008, // LEFT ANGLE BRACKET + 0x2153: 0x3009, // RIGHT ANGLE BRACKET + 0x2154: 0x300A, // LEFT DOUBLE ANGLE BRACKET + 0x2155: 0x300B, // RIGHT DOUBLE ANGLE BRACKET + 0x2156: 0x300C, // LEFT CORNER BRACKET + 0x2157: 0x300D, // RIGHT CORNER BRACKET + 0x2158: 0x300E, // LEFT WHITE CORNER BRACKET + 0x2159: 0x300F, // RIGHT WHITE CORNER BRACKET + 0x215A: 0x3010, // LEFT BLACK LENTICULAR BRACKET + 0x215B: 0x3011, // RIGHT BLACK LENTICULAR BRACKET + 0x215C: 0xFF0B, // FULLWIDTH PLUS SIGN + 0x215D: 0x2212, // MINUS SIGN + 0x215E: 0x00B1, // PLUS-MINUS SIGN + 0x215F: 0x00D7, // MULTIPLICATION SIGN + 0x2160: 0x00F7, // DIVISION SIGN + 0x2161: 0xFF1D, // FULLWIDTH EQUALS SIGN + 0x2162: 0x2260, // NOT EQUAL TO + 0x2163: 0xFF1C, // FULLWIDTH LESS-THAN SIGN + 0x2164: 0xFF1E, // FULLWIDTH GREATER-THAN SIGN + 0x2165: 0x2266, // LESS-THAN OVER EQUAL TO + 0x2166: 0x2267, // GREATER-THAN OVER EQUAL TO + 0x2167: 0x221E, // INFINITY + 0x2168: 0x2234, // THEREFORE + 0x2169: 0x2642, // MALE SIGN + 0x216A: 0x2640, // FEMALE SIGN + 0x216B: 0x00B0, // DEGREE SIGN + 0x216C: 0x2032, // PRIME + 0x216D: 0x2033, // DOUBLE PRIME + 0x216E: 0x2103, // DEGREE CELSIUS + 0x216F: 0xFFE5, // FULLWIDTH YEN SIGN + 0x2170: 0xFF04, // FULLWIDTH DOLLAR SIGN + 0x2171: 0x00A2, // CENT SIGN + 0x2172: 0x00A3, // POUND SIGN + 0x2173: 0xFF05, // FULLWIDTH PERCENT SIGN + 0x2174: 0xFF03, // FULLWIDTH NUMBER SIGN + 0x2175: 0xFF06, // FULLWIDTH AMPERSAND + 0x2176: 0xFF0A, // FULLWIDTH ASTERISK + 0x2177: 0xFF20, // FULLWIDTH COMMERCIAL AT + 0x2178: 0x00A7, // SECTION SIGN + 0x2179: 0x2606, // WHITE STAR + 0x217A: 0x2605, // BLACK STAR + 0x217B: 0x25CB, // WHITE CIRCLE + 0x217C: 0x25CF, // BLACK CIRCLE + 0x217D: 0x25CE, // BULLSEYE + 0x217E: 0x25C7, // WHITE DIAMOND + 0x2221: 0x25C6, // BLACK DIAMOND + 0x2222: 0x25A1, // WHITE SQUARE + 0x2223: 0x25A0, // BLACK SQUARE + 0x2224: 0x25B3, // WHITE UP-POINTING TRIANGLE + 0x2225: 0x25B2, // BLACK UP-POINTING TRIANGLE + 0x2226: 0x25BD, // WHITE DOWN-POINTING TRIANGLE + 0x2227: 0x25BC, // BLACK DOWN-POINTING TRIANGLE + 0x2228: 0x203B, // REFERENCE MARK + 0x2229: 0x3012, // POSTAL MARK + 0x222A: 0x2192, // RIGHTWARDS ARROW + 0x222B: 0x2190, // LEFTWARDS ARROW + 0x222C: 0x2191, // UPWARDS ARROW + 0x222D: 0x2193, // DOWNWARDS ARROW + 0x222E: 0x3013, // GETA MARK + 0x223A: 0x2208, // ELEMENT OF + 0x223B: 0x220B, // CONTAINS AS MEMBER + 0x223C: 0x2286, // SUBSET OF OR EQUAL TO + 0x223D: 0x2287, // SUPERSET OF OR EQUAL TO + 0x223E: 0x2282, // SUBSET OF + 0x223F: 0x2283, // SUPERSET OF + 0x2240: 0x222A, // UNION + 0x2241: 0x2229, // INTERSECTION + 0x224A: 0x2227, // LOGICAL AND + 0x224B: 0x2228, // LOGICAL OR + 0x224C: 0x00AC, // NOT SIGN + 0x224D: 0x21D2, // RIGHTWARDS DOUBLE ARROW + 0x224E: 0x21D4, // LEFT RIGHT DOUBLE ARROW + 0x224F: 0x2200, // FOR ALL + 0x2250: 0x2203, // THERE EXISTS + 0x225C: 0x2220, // ANGLE + 0x225D: 0x22A5, // UP TACK + 0x225E: 0x2312, // ARC + 0x225F: 0x2202, // PARTIAL DIFFERENTIAL + 0x2260: 0x2207, // NABLA + 0x2261: 0x2261, // IDENTICAL TO + 0x2262: 0x2252, // APPROXIMATELY EQUAL TO OR THE IMAGE OF + 0x2263: 0x226A, // MUCH LESS-THAN + 0x2264: 0x226B, // MUCH GREATER-THAN + 0x2265: 0x221A, // SQUARE ROOT + 0x2266: 0x223D, // REVERSED TILDE + 0x2267: 0x221D, // PROPORTIONAL TO + 0x2268: 0x2235, // BECAUSE + 0x2269: 0x222B, // INTEGRAL + 0x226A: 0x222C, // DOUBLE INTEGRAL + 0x2272: 0x212B, // ANGSTROM SIGN + 0x2273: 0x2030, // PER MILLE SIGN + 0x2274: 0x266F, // MUSIC SHARP SIGN + 0x2275: 0x266D, // MUSIC FLAT SIGN + 0x2276: 0x266A, // EIGHTH NOTE + 0x2277: 0x2020, // DAGGER + 0x2278: 0x2021, // DOUBLE DAGGER + 0x2279: 0x00B6, // PILCROW SIGN + 0x227E: 0x25EF, // LARGE CIRCLE + 0x2330: 0xFF10, // FULLWIDTH DIGIT ZERO + 0x2331: 0xFF11, // FULLWIDTH DIGIT ONE + 0x2332: 0xFF12, // FULLWIDTH DIGIT TWO + 0x2333: 0xFF13, // FULLWIDTH DIGIT THREE + 0x2334: 0xFF14, // FULLWIDTH DIGIT FOUR + 0x2335: 0xFF15, // FULLWIDTH DIGIT FIVE + 0x2336: 0xFF16, // FULLWIDTH DIGIT SIX + 0x2337: 0xFF17, // FULLWIDTH DIGIT SEVEN + 0x2338: 0xFF18, // FULLWIDTH DIGIT EIGHT + 0x2339: 0xFF19, // FULLWIDTH DIGIT NINE + 0x2341: 0xFF21, // FULLWIDTH LATIN CAPITAL LETTER A + 0x2342: 0xFF22, // FULLWIDTH LATIN CAPITAL LETTER B + 0x2343: 0xFF23, // FULLWIDTH LATIN CAPITAL LETTER C + 0x2344: 0xFF24, // FULLWIDTH LATIN CAPITAL LETTER D + 0x2345: 0xFF25, // FULLWIDTH LATIN CAPITAL LETTER E + 0x2346: 0xFF26, // FULLWIDTH LATIN CAPITAL LETTER F + 0x2347: 0xFF27, // FULLWIDTH LATIN CAPITAL LETTER G + 0x2348: 0xFF28, // FULLWIDTH LATIN CAPITAL LETTER H + 0x2349: 0xFF29, // FULLWIDTH LATIN CAPITAL LETTER I + 0x234A: 0xFF2A, // FULLWIDTH LATIN CAPITAL LETTER J + 0x234B: 0xFF2B, // FULLWIDTH LATIN CAPITAL LETTER K + 0x234C: 0xFF2C, // FULLWIDTH LATIN CAPITAL LETTER L + 0x234D: 0xFF2D, // FULLWIDTH LATIN CAPITAL LETTER M + 0x234E: 0xFF2E, // FULLWIDTH LATIN CAPITAL LETTER N + 0x234F: 0xFF2F, // FULLWIDTH LATIN CAPITAL LETTER O + 0x2350: 0xFF30, // FULLWIDTH LATIN CAPITAL LETTER P + 0x2351: 0xFF31, // FULLWIDTH LATIN CAPITAL LETTER Q + 0x2352: 0xFF32, // FULLWIDTH LATIN CAPITAL LETTER R + 0x2353: 0xFF33, // FULLWIDTH LATIN CAPITAL LETTER S + 0x2354: 0xFF34, // FULLWIDTH LATIN CAPITAL LETTER T + 0x2355: 0xFF35, // FULLWIDTH LATIN CAPITAL LETTER U + 0x2356: 0xFF36, // FULLWIDTH LATIN CAPITAL LETTER V + 0x2357: 0xFF37, // FULLWIDTH LATIN CAPITAL LETTER W + 0x2358: 0xFF38, // FULLWIDTH LATIN CAPITAL LETTER X + 0x2359: 0xFF39, // FULLWIDTH LATIN CAPITAL LETTER Y + 0x235A: 0xFF3A, // FULLWIDTH LATIN CAPITAL LETTER Z + 0x2361: 0xFF41, // FULLWIDTH LATIN SMALL LETTER A + 0x2362: 0xFF42, // FULLWIDTH LATIN SMALL LETTER B + 0x2363: 0xFF43, // FULLWIDTH LATIN SMALL LETTER C + 0x2364: 0xFF44, // FULLWIDTH LATIN SMALL LETTER D + 0x2365: 0xFF45, // FULLWIDTH LATIN SMALL LETTER E + 0x2366: 0xFF46, // FULLWIDTH LATIN SMALL LETTER F + 0x2367: 0xFF47, // FULLWIDTH LATIN SMALL LETTER G + 0x2368: 0xFF48, // FULLWIDTH LATIN SMALL LETTER H + 0x2369: 0xFF49, // FULLWIDTH LATIN SMALL LETTER I + 0x236A: 0xFF4A, // FULLWIDTH LATIN SMALL LETTER J + 0x236B: 0xFF4B, // FULLWIDTH LATIN SMALL LETTER K + 0x236C: 0xFF4C, // FULLWIDTH LATIN SMALL LETTER L + 0x236D: 0xFF4D, // FULLWIDTH LATIN SMALL LETTER M + 0x236E: 0xFF4E, // FULLWIDTH LATIN SMALL LETTER N + 0x236F: 0xFF4F, // FULLWIDTH LATIN SMALL LETTER O + 0x2370: 0xFF50, // FULLWIDTH LATIN SMALL LETTER P + 0x2371: 0xFF51, // FULLWIDTH LATIN SMALL LETTER Q + 0x2372: 0xFF52, // FULLWIDTH LATIN SMALL LETTER R + 0x2373: 0xFF53, // FULLWIDTH LATIN SMALL LETTER S + 0x2374: 0xFF54, // FULLWIDTH LATIN SMALL LETTER T + 0x2375: 0xFF55, // FULLWIDTH LATIN SMALL LETTER U + 0x2376: 0xFF56, // FULLWIDTH LATIN SMALL LETTER V + 0x2377: 0xFF57, // FULLWIDTH LATIN SMALL LETTER W + 0x2378: 0xFF58, // FULLWIDTH LATIN SMALL LETTER X + 0x2379: 0xFF59, // FULLWIDTH LATIN SMALL LETTER Y + 0x237A: 0xFF5A, // FULLWIDTH LATIN SMALL LETTER Z + 0x2421: 0x3041, // HIRAGANA LETTER SMALL A + 0x2422: 0x3042, // HIRAGANA LETTER A + 0x2423: 0x3043, // HIRAGANA LETTER SMALL I + 0x2424: 0x3044, // HIRAGANA LETTER I + 0x2425: 0x3045, // HIRAGANA LETTER SMALL U + 0x2426: 0x3046, // HIRAGANA LETTER U + 0x2427: 0x3047, // HIRAGANA LETTER SMALL E + 0x2428: 0x3048, // HIRAGANA LETTER E + 0x2429: 0x3049, // HIRAGANA LETTER SMALL O + 0x242A: 0x304A, // HIRAGANA LETTER O + 0x242B: 0x304B, // HIRAGANA LETTER KA + 0x242C: 0x304C, // HIRAGANA LETTER GA + 0x242D: 0x304D, // HIRAGANA LETTER KI + 0x242E: 0x304E, // HIRAGANA LETTER GI + 0x242F: 0x304F, // HIRAGANA LETTER KU + 0x2430: 0x3050, // HIRAGANA LETTER GU + 0x2431: 0x3051, // HIRAGANA LETTER KE + 0x2432: 0x3052, // HIRAGANA LETTER GE + 0x2433: 0x3053, // HIRAGANA LETTER KO + 0x2434: 0x3054, // HIRAGANA LETTER GO + 0x2435: 0x3055, // HIRAGANA LETTER SA + 0x2436: 0x3056, // HIRAGANA LETTER ZA + 0x2437: 0x3057, // HIRAGANA LETTER SI + 0x2438: 0x3058, // HIRAGANA LETTER ZI + 0x2439: 0x3059, // HIRAGANA LETTER SU + 0x243A: 0x305A, // HIRAGANA LETTER ZU + 0x243B: 0x305B, // HIRAGANA LETTER SE + 0x243C: 0x305C, // HIRAGANA LETTER ZE + 0x243D: 0x305D, // HIRAGANA LETTER SO + 0x243E: 0x305E, // HIRAGANA LETTER ZO + 0x243F: 0x305F, // HIRAGANA LETTER TA + 0x2440: 0x3060, // HIRAGANA LETTER DA + 0x2441: 0x3061, // HIRAGANA LETTER TI + 0x2442: 0x3062, // HIRAGANA LETTER DI + 0x2443: 0x3063, // HIRAGANA LETTER SMALL TU + 0x2444: 0x3064, // HIRAGANA LETTER TU + 0x2445: 0x3065, // HIRAGANA LETTER DU + 0x2446: 0x3066, // HIRAGANA LETTER TE + 0x2447: 0x3067, // HIRAGANA LETTER DE + 0x2448: 0x3068, // HIRAGANA LETTER TO + 0x2449: 0x3069, // HIRAGANA LETTER DO + 0x244A: 0x306A, // HIRAGANA LETTER NA + 0x244B: 0x306B, // HIRAGANA LETTER NI + 0x244C: 0x306C, // HIRAGANA LETTER NU + 0x244D: 0x306D, // HIRAGANA LETTER NE + 0x244E: 0x306E, // HIRAGANA LETTER NO + 0x244F: 0x306F, // HIRAGANA LETTER HA + 0x2450: 0x3070, // HIRAGANA LETTER BA + 0x2451: 0x3071, // HIRAGANA LETTER PA + 0x2452: 0x3072, // HIRAGANA LETTER HI + 0x2453: 0x3073, // HIRAGANA LETTER BI + 0x2454: 0x3074, // HIRAGANA LETTER PI + 0x2455: 0x3075, // HIRAGANA LETTER HU + 0x2456: 0x3076, // HIRAGANA LETTER BU + 0x2457: 0x3077, // HIRAGANA LETTER PU + 0x2458: 0x3078, // HIRAGANA LETTER HE + 0x2459: 0x3079, // HIRAGANA LETTER BE + 0x245A: 0x307A, // HIRAGANA LETTER PE + 0x245B: 0x307B, // HIRAGANA LETTER HO + 0x245C: 0x307C, // HIRAGANA LETTER BO + 0x245D: 0x307D, // HIRAGANA LETTER PO + 0x245E: 0x307E, // HIRAGANA LETTER MA + 0x245F: 0x307F, // HIRAGANA LETTER MI + 0x2460: 0x3080, // HIRAGANA LETTER MU + 0x2461: 0x3081, // HIRAGANA LETTER ME + 0x2462: 0x3082, // HIRAGANA LETTER MO + 0x2463: 0x3083, // HIRAGANA LETTER SMALL YA + 0x2464: 0x3084, // HIRAGANA LETTER YA + 0x2465: 0x3085, // HIRAGANA LETTER SMALL YU + 0x2466: 0x3086, // HIRAGANA LETTER YU + 0x2467: 0x3087, // HIRAGANA LETTER SMALL YO + 0x2468: 0x3088, // HIRAGANA LETTER YO + 0x2469: 0x3089, // HIRAGANA LETTER RA + 0x246A: 0x308A, // HIRAGANA LETTER RI + 0x246B: 0x308B, // HIRAGANA LETTER RU + 0x246C: 0x308C, // HIRAGANA LETTER RE + 0x246D: 0x308D, // HIRAGANA LETTER RO + 0x246E: 0x308E, // HIRAGANA LETTER SMALL WA + 0x246F: 0x308F, // HIRAGANA LETTER WA + 0x2470: 0x3090, // HIRAGANA LETTER WI + 0x2471: 0x3091, // HIRAGANA LETTER WE + 0x2472: 0x3092, // HIRAGANA LETTER WO + 0x2473: 0x3093, // HIRAGANA LETTER N + 0x2521: 0x30A1, // KATAKANA LETTER SMALL A + 0x2522: 0x30A2, // KATAKANA LETTER A + 0x2523: 0x30A3, // KATAKANA LETTER SMALL I + 0x2524: 0x30A4, // KATAKANA LETTER I + 0x2525: 0x30A5, // KATAKANA LETTER SMALL U + 0x2526: 0x30A6, // KATAKANA LETTER U + 0x2527: 0x30A7, // KATAKANA LETTER SMALL E + 0x2528: 0x30A8, // KATAKANA LETTER E + 0x2529: 0x30A9, // KATAKANA LETTER SMALL O + 0x252A: 0x30AA, // KATAKANA LETTER O + 0x252B: 0x30AB, // KATAKANA LETTER KA + 0x252C: 0x30AC, // KATAKANA LETTER GA + 0x252D: 0x30AD, // KATAKANA LETTER KI + 0x252E: 0x30AE, // KATAKANA LETTER GI + 0x252F: 0x30AF, // KATAKANA LETTER KU + 0x2530: 0x30B0, // KATAKANA LETTER GU + 0x2531: 0x30B1, // KATAKANA LETTER KE + 0x2532: 0x30B2, // KATAKANA LETTER GE + 0x2533: 0x30B3, // KATAKANA LETTER KO + 0x2534: 0x30B4, // KATAKANA LETTER GO + 0x2535: 0x30B5, // KATAKANA LETTER SA + 0x2536: 0x30B6, // KATAKANA LETTER ZA + 0x2537: 0x30B7, // KATAKANA LETTER SI + 0x2538: 0x30B8, // KATAKANA LETTER ZI + 0x2539: 0x30B9, // KATAKANA LETTER SU + 0x253A: 0x30BA, // KATAKANA LETTER ZU + 0x253B: 0x30BB, // KATAKANA LETTER SE + 0x253C: 0x30BC, // KATAKANA LETTER ZE + 0x253D: 0x30BD, // KATAKANA LETTER SO + 0x253E: 0x30BE, // KATAKANA LETTER ZO + 0x253F: 0x30BF, // KATAKANA LETTER TA + 0x2540: 0x30C0, // KATAKANA LETTER DA + 0x2541: 0x30C1, // KATAKANA LETTER TI + 0x2542: 0x30C2, // KATAKANA LETTER DI + 0x2543: 0x30C3, // KATAKANA LETTER SMALL TU + 0x2544: 0x30C4, // KATAKANA LETTER TU + 0x2545: 0x30C5, // KATAKANA LETTER DU + 0x2546: 0x30C6, // KATAKANA LETTER TE + 0x2547: 0x30C7, // KATAKANA LETTER DE + 0x2548: 0x30C8, // KATAKANA LETTER TO + 0x2549: 0x30C9, // KATAKANA LETTER DO + 0x254A: 0x30CA, // KATAKANA LETTER NA + 0x254B: 0x30CB, // KATAKANA LETTER NI + 0x254C: 0x30CC, // KATAKANA LETTER NU + 0x254D: 0x30CD, // KATAKANA LETTER NE + 0x254E: 0x30CE, // KATAKANA LETTER NO + 0x254F: 0x30CF, // KATAKANA LETTER HA + 0x2550: 0x30D0, // KATAKANA LETTER BA + 0x2551: 0x30D1, // KATAKANA LETTER PA + 0x2552: 0x30D2, // KATAKANA LETTER HI + 0x2553: 0x30D3, // KATAKANA LETTER BI + 0x2554: 0x30D4, // KATAKANA LETTER PI + 0x2555: 0x30D5, // KATAKANA LETTER HU + 0x2556: 0x30D6, // KATAKANA LETTER BU + 0x2557: 0x30D7, // KATAKANA LETTER PU + 0x2558: 0x30D8, // KATAKANA LETTER HE + 0x2559: 0x30D9, // KATAKANA LETTER BE + 0x255A: 0x30DA, // KATAKANA LETTER PE + 0x255B: 0x30DB, // KATAKANA LETTER HO + 0x255C: 0x30DC, // KATAKANA LETTER BO + 0x255D: 0x30DD, // KATAKANA LETTER PO + 0x255E: 0x30DE, // KATAKANA LETTER MA + 0x255F: 0x30DF, // KATAKANA LETTER MI + 0x2560: 0x30E0, // KATAKANA LETTER MU + 0x2561: 0x30E1, // KATAKANA LETTER ME + 0x2562: 0x30E2, // KATAKANA LETTER MO + 0x2563: 0x30E3, // KATAKANA LETTER SMALL YA + 0x2564: 0x30E4, // KATAKANA LETTER YA + 0x2565: 0x30E5, // KATAKANA LETTER SMALL YU + 0x2566: 0x30E6, // KATAKANA LETTER YU + 0x2567: 0x30E7, // KATAKANA LETTER SMALL YO + 0x2568: 0x30E8, // KATAKANA LETTER YO + 0x2569: 0x30E9, // KATAKANA LETTER RA + 0x256A: 0x30EA, // KATAKANA LETTER RI + 0x256B: 0x30EB, // KATAKANA LETTER RU + 0x256C: 0x30EC, // KATAKANA LETTER RE + 0x256D: 0x30ED, // KATAKANA LETTER RO + 0x256E: 0x30EE, // KATAKANA LETTER SMALL WA + 0x256F: 0x30EF, // KATAKANA LETTER WA + 0x2570: 0x30F0, // KATAKANA LETTER WI + 0x2571: 0x30F1, // KATAKANA LETTER WE + 0x2572: 0x30F2, // KATAKANA LETTER WO + 0x2573: 0x30F3, // KATAKANA LETTER N + 0x2574: 0x30F4, // KATAKANA LETTER VU + 0x2575: 0x30F5, // KATAKANA LETTER SMALL KA + 0x2576: 0x30F6, // KATAKANA LETTER SMALL KE + 0x2621: 0x0391, // GREEK CAPITAL LETTER ALPHA + 0x2622: 0x0392, // GREEK CAPITAL LETTER BETA + 0x2623: 0x0393, // GREEK CAPITAL LETTER GAMMA + 0x2624: 0x0394, // GREEK CAPITAL LETTER DELTA + 0x2625: 0x0395, // GREEK CAPITAL LETTER EPSILON + 0x2626: 0x0396, // GREEK CAPITAL LETTER ZETA + 0x2627: 0x0397, // GREEK CAPITAL LETTER ETA + 0x2628: 0x0398, // GREEK CAPITAL LETTER THETA + 0x2629: 0x0399, // GREEK CAPITAL LETTER IOTA + 0x262A: 0x039A, // GREEK CAPITAL LETTER KAPPA + 0x262B: 0x039B, // GREEK CAPITAL LETTER LAMDA + 0x262C: 0x039C, // GREEK CAPITAL LETTER MU + 0x262D: 0x039D, // GREEK CAPITAL LETTER NU + 0x262E: 0x039E, // GREEK CAPITAL LETTER XI + 0x262F: 0x039F, // GREEK CAPITAL LETTER OMICRON + 0x2630: 0x03A0, // GREEK CAPITAL LETTER PI + 0x2631: 0x03A1, // GREEK CAPITAL LETTER RHO + 0x2632: 0x03A3, // GREEK CAPITAL LETTER SIGMA + 0x2633: 0x03A4, // GREEK CAPITAL LETTER TAU + 0x2634: 0x03A5, // GREEK CAPITAL LETTER UPSILON + 0x2635: 0x03A6, // GREEK CAPITAL LETTER PHI + 0x2636: 0x03A7, // GREEK CAPITAL LETTER CHI + 0x2637: 0x03A8, // GREEK CAPITAL LETTER PSI + 0x2638: 0x03A9, // GREEK CAPITAL LETTER OMEGA + 0x2641: 0x03B1, // GREEK SMALL LETTER ALPHA + 0x2642: 0x03B2, // GREEK SMALL LETTER BETA + 0x2643: 0x03B3, // GREEK SMALL LETTER GAMMA + 0x2644: 0x03B4, // GREEK SMALL LETTER DELTA + 0x2645: 0x03B5, // GREEK SMALL LETTER EPSILON + 0x2646: 0x03B6, // GREEK SMALL LETTER ZETA + 0x2647: 0x03B7, // GREEK SMALL LETTER ETA + 0x2648: 0x03B8, // GREEK SMALL LETTER THETA + 0x2649: 0x03B9, // GREEK SMALL LETTER IOTA + 0x264A: 0x03BA, // GREEK SMALL LETTER KAPPA + 0x264B: 0x03BB, // GREEK SMALL LETTER LAMDA + 0x264C: 0x03BC, // GREEK SMALL LETTER MU + 0x264D: 0x03BD, // GREEK SMALL LETTER NU + 0x264E: 0x03BE, // GREEK SMALL LETTER XI + 0x264F: 0x03BF, // GREEK SMALL LETTER OMICRON + 0x2650: 0x03C0, // GREEK SMALL LETTER PI + 0x2651: 0x03C1, // GREEK SMALL LETTER RHO + 0x2652: 0x03C3, // GREEK SMALL LETTER SIGMA + 0x2653: 0x03C4, // GREEK SMALL LETTER TAU + 0x2654: 0x03C5, // GREEK SMALL LETTER UPSILON + 0x2655: 0x03C6, // GREEK SMALL LETTER PHI + 0x2656: 0x03C7, // GREEK SMALL LETTER CHI + 0x2657: 0x03C8, // GREEK SMALL LETTER PSI + 0x2658: 0x03C9, // GREEK SMALL LETTER OMEGA + 0x2721: 0x0410, // CYRILLIC CAPITAL LETTER A + 0x2722: 0x0411, // CYRILLIC CAPITAL LETTER BE + 0x2723: 0x0412, // CYRILLIC CAPITAL LETTER VE + 0x2724: 0x0413, // CYRILLIC CAPITAL LETTER GHE + 0x2725: 0x0414, // CYRILLIC CAPITAL LETTER DE + 0x2726: 0x0415, // CYRILLIC CAPITAL LETTER IE + 0x2727: 0x0401, // CYRILLIC CAPITAL LETTER IO + 0x2728: 0x0416, // CYRILLIC CAPITAL LETTER ZHE + 0x2729: 0x0417, // CYRILLIC CAPITAL LETTER ZE + 0x272A: 0x0418, // CYRILLIC CAPITAL LETTER I + 0x272B: 0x0419, // CYRILLIC CAPITAL LETTER SHORT I + 0x272C: 0x041A, // CYRILLIC CAPITAL LETTER KA + 0x272D: 0x041B, // CYRILLIC CAPITAL LETTER EL + 0x272E: 0x041C, // CYRILLIC CAPITAL LETTER EM + 0x272F: 0x041D, // CYRILLIC CAPITAL LETTER EN + 0x2730: 0x041E, // CYRILLIC CAPITAL LETTER O + 0x2731: 0x041F, // CYRILLIC CAPITAL LETTER PE + 0x2732: 0x0420, // CYRILLIC CAPITAL LETTER ER + 0x2733: 0x0421, // CYRILLIC CAPITAL LETTER ES + 0x2734: 0x0422, // CYRILLIC CAPITAL LETTER TE + 0x2735: 0x0423, // CYRILLIC CAPITAL LETTER U + 0x2736: 0x0424, // CYRILLIC CAPITAL LETTER EF + 0x2737: 0x0425, // CYRILLIC CAPITAL LETTER HA + 0x2738: 0x0426, // CYRILLIC CAPITAL LETTER TSE + 0x2739: 0x0427, // CYRILLIC CAPITAL LETTER CHE + 0x273A: 0x0428, // CYRILLIC CAPITAL LETTER SHA + 0x273B: 0x0429, // CYRILLIC CAPITAL LETTER SHCHA + 0x273C: 0x042A, // CYRILLIC CAPITAL LETTER HARD SIGN + 0x273D: 0x042B, // CYRILLIC CAPITAL LETTER YERU + 0x273E: 0x042C, // CYRILLIC CAPITAL LETTER SOFT SIGN + 0x273F: 0x042D, // CYRILLIC CAPITAL LETTER E + 0x2740: 0x042E, // CYRILLIC CAPITAL LETTER YU + 0x2741: 0x042F, // CYRILLIC CAPITAL LETTER YA + 0x2751: 0x0430, // CYRILLIC SMALL LETTER A + 0x2752: 0x0431, // CYRILLIC SMALL LETTER BE + 0x2753: 0x0432, // CYRILLIC SMALL LETTER VE + 0x2754: 0x0433, // CYRILLIC SMALL LETTER GHE + 0x2755: 0x0434, // CYRILLIC SMALL LETTER DE + 0x2756: 0x0435, // CYRILLIC SMALL LETTER IE + 0x2757: 0x0451, // CYRILLIC SMALL LETTER IO + 0x2758: 0x0436, // CYRILLIC SMALL LETTER ZHE + 0x2759: 0x0437, // CYRILLIC SMALL LETTER ZE + 0x275A: 0x0438, // CYRILLIC SMALL LETTER I + 0x275B: 0x0439, // CYRILLIC SMALL LETTER SHORT I + 0x275C: 0x043A, // CYRILLIC SMALL LETTER KA + 0x275D: 0x043B, // CYRILLIC SMALL LETTER EL + 0x275E: 0x043C, // CYRILLIC SMALL LETTER EM + 0x275F: 0x043D, // CYRILLIC SMALL LETTER EN + 0x2760: 0x043E, // CYRILLIC SMALL LETTER O + 0x2761: 0x043F, // CYRILLIC SMALL LETTER PE + 0x2762: 0x0440, // CYRILLIC SMALL LETTER ER + 0x2763: 0x0441, // CYRILLIC SMALL LETTER ES + 0x2764: 0x0442, // CYRILLIC SMALL LETTER TE + 0x2765: 0x0443, // CYRILLIC SMALL LETTER U + 0x2766: 0x0444, // CYRILLIC SMALL LETTER EF + 0x2767: 0x0445, // CYRILLIC SMALL LETTER HA + 0x2768: 0x0446, // CYRILLIC SMALL LETTER TSE + 0x2769: 0x0447, // CYRILLIC SMALL LETTER CHE + 0x276A: 0x0448, // CYRILLIC SMALL LETTER SHA + 0x276B: 0x0449, // CYRILLIC SMALL LETTER SHCHA + 0x276C: 0x044A, // CYRILLIC SMALL LETTER HARD SIGN + 0x276D: 0x044B, // CYRILLIC SMALL LETTER YERU + 0x276E: 0x044C, // CYRILLIC SMALL LETTER SOFT SIGN + 0x276F: 0x044D, // CYRILLIC SMALL LETTER E + 0x2770: 0x044E, // CYRILLIC SMALL LETTER YU + 0x2771: 0x044F, // CYRILLIC SMALL LETTER YA + 0x2821: 0x2500, // BOX DRAWINGS LIGHT HORIZONTAL + 0x2822: 0x2502, // BOX DRAWINGS LIGHT VERTICAL + 0x2823: 0x250C, // BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x2824: 0x2510, // BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2825: 0x2518, // BOX DRAWINGS LIGHT UP AND LEFT + 0x2826: 0x2514, // BOX DRAWINGS LIGHT UP AND RIGHT + 0x2827: 0x251C, // BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x2828: 0x252C, // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x2829: 0x2524, // BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x282A: 0x2534, // BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x282B: 0x253C, // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x282C: 0x2501, // BOX DRAWINGS HEAVY HORIZONTAL + 0x282D: 0x2503, // BOX DRAWINGS HEAVY VERTICAL + 0x282E: 0x250F, // BOX DRAWINGS HEAVY DOWN AND RIGHT + 0x282F: 0x2513, // BOX DRAWINGS HEAVY DOWN AND LEFT + 0x2830: 0x251B, // BOX DRAWINGS HEAVY UP AND LEFT + 0x2831: 0x2517, // BOX DRAWINGS HEAVY UP AND RIGHT + 0x2832: 0x2523, // BOX DRAWINGS HEAVY VERTICAL AND RIGHT + 0x2833: 0x2533, // BOX DRAWINGS HEAVY DOWN AND HORIZONTAL + 0x2834: 0x252B, // BOX DRAWINGS HEAVY VERTICAL AND LEFT + 0x2835: 0x253B, // BOX DRAWINGS HEAVY UP AND HORIZONTAL + 0x2836: 0x254B, // BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL + 0x2837: 0x2520, // BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT + 0x2838: 0x252F, // BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY + 0x2839: 0x2528, // BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT + 0x283A: 0x2537, // BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY + 0x283B: 0x253F, // BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY + 0x283C: 0x251D, // BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY + 0x283D: 0x2530, // BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT + 0x283E: 0x2525, // BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY + 0x283F: 0x2538, // BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT + 0x2840: 0x2542, // BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT + 0x3021: 0x4E9C, + 0x3022: 0x5516, + 0x3023: 0x5A03, + 0x3024: 0x963F, + 0x3025: 0x54C0, + 0x3026: 0x611B, + 0x3027: 0x6328, + 0x3028: 0x59F6, + 0x3029: 0x9022, + 0x302A: 0x8475, + 0x302B: 0x831C, + 0x302C: 0x7A50, + 0x302D: 0x60AA, + 0x302E: 0x63E1, + 0x302F: 0x6E25, + 0x3030: 0x65ED, + 0x3031: 0x8466, + 0x3032: 0x82A6, + 0x3033: 0x9BF5, + 0x3034: 0x6893, + 0x3035: 0x5727, + 0x3036: 0x65A1, + 0x3037: 0x6271, + 0x3038: 0x5B9B, + 0x3039: 0x59D0, + 0x303A: 0x867B, + 0x303B: 0x98F4, + 0x303C: 0x7D62, + 0x303D: 0x7DBE, + 0x303E: 0x9B8E, + 0x303F: 0x6216, + 0x3040: 0x7C9F, + 0x3041: 0x88B7, + 0x3042: 0x5B89, + 0x3043: 0x5EB5, + 0x3044: 0x6309, + 0x3045: 0x6697, + 0x3046: 0x6848, + 0x3047: 0x95C7, + 0x3048: 0x978D, + 0x3049: 0x674F, + 0x304A: 0x4EE5, + 0x304B: 0x4F0A, + 0x304C: 0x4F4D, + 0x304D: 0x4F9D, + 0x304E: 0x5049, + 0x304F: 0x56F2, + 0x3050: 0x5937, + 0x3051: 0x59D4, + 0x3052: 0x5A01, + 0x3053: 0x5C09, + 0x3054: 0x60DF, + 0x3055: 0x610F, + 0x3056: 0x6170, + 0x3057: 0x6613, + 0x3058: 0x6905, + 0x3059: 0x70BA, + 0x305A: 0x754F, + 0x305B: 0x7570, + 0x305C: 0x79FB, + 0x305D: 0x7DAD, + 0x305E: 0x7DEF, + 0x305F: 0x80C3, + 0x3060: 0x840E, + 0x3061: 0x8863, + 0x3062: 0x8B02, + 0x3063: 0x9055, + 0x3064: 0x907A, + 0x3065: 0x533B, + 0x3066: 0x4E95, + 0x3067: 0x4EA5, + 0x3068: 0x57DF, + 0x3069: 0x80B2, + 0x306A: 0x90C1, + 0x306B: 0x78EF, + 0x306C: 0x4E00, + 0x306D: 0x58F1, + 0x306E: 0x6EA2, + 0x306F: 0x9038, + 0x3070: 0x7A32, + 0x3071: 0x8328, + 0x3072: 0x828B, + 0x3073: 0x9C2F, + 0x3074: 0x5141, + 0x3075: 0x5370, + 0x3076: 0x54BD, + 0x3077: 0x54E1, + 0x3078: 0x56E0, + 0x3079: 0x59FB, + 0x307A: 0x5F15, + 0x307B: 0x98F2, + 0x307C: 0x6DEB, + 0x307D: 0x80E4, + 0x307E: 0x852D, + 0x3121: 0x9662, + 0x3122: 0x9670, + 0x3123: 0x96A0, + 0x3124: 0x97FB, + 0x3125: 0x540B, + 0x3126: 0x53F3, + 0x3127: 0x5B87, + 0x3128: 0x70CF, + 0x3129: 0x7FBD, + 0x312A: 0x8FC2, + 0x312B: 0x96E8, + 0x312C: 0x536F, + 0x312D: 0x9D5C, + 0x312E: 0x7ABA, + 0x312F: 0x4E11, + 0x3130: 0x7893, + 0x3131: 0x81FC, + 0x3132: 0x6E26, + 0x3133: 0x5618, + 0x3134: 0x5504, + 0x3135: 0x6B1D, + 0x3136: 0x851A, + 0x3137: 0x9C3B, + 0x3138: 0x59E5, + 0x3139: 0x53A9, + 0x313A: 0x6D66, + 0x313B: 0x74DC, + 0x313C: 0x958F, + 0x313D: 0x5642, + 0x313E: 0x4E91, + 0x313F: 0x904B, + 0x3140: 0x96F2, + 0x3141: 0x834F, + 0x3142: 0x990C, + 0x3143: 0x53E1, + 0x3144: 0x55B6, + 0x3145: 0x5B30, + 0x3146: 0x5F71, + 0x3147: 0x6620, + 0x3148: 0x66F3, + 0x3149: 0x6804, + 0x314A: 0x6C38, + 0x314B: 0x6CF3, + 0x314C: 0x6D29, + 0x314D: 0x745B, + 0x314E: 0x76C8, + 0x314F: 0x7A4E, + 0x3150: 0x9834, + 0x3151: 0x82F1, + 0x3152: 0x885B, + 0x3153: 0x8A60, + 0x3154: 0x92ED, + 0x3155: 0x6DB2, + 0x3156: 0x75AB, + 0x3157: 0x76CA, + 0x3158: 0x99C5, + 0x3159: 0x60A6, + 0x315A: 0x8B01, + 0x315B: 0x8D8A, + 0x315C: 0x95B2, + 0x315D: 0x698E, + 0x315E: 0x53AD, + 0x315F: 0x5186, + 0x3160: 0x5712, + 0x3161: 0x5830, + 0x3162: 0x5944, + 0x3163: 0x5BB4, + 0x3164: 0x5EF6, + 0x3165: 0x6028, + 0x3166: 0x63A9, + 0x3167: 0x63F4, + 0x3168: 0x6CBF, + 0x3169: 0x6F14, + 0x316A: 0x708E, + 0x316B: 0x7114, + 0x316C: 0x7159, + 0x316D: 0x71D5, + 0x316E: 0x733F, + 0x316F: 0x7E01, + 0x3170: 0x8276, + 0x3171: 0x82D1, + 0x3172: 0x8597, + 0x3173: 0x9060, + 0x3174: 0x925B, + 0x3175: 0x9D1B, + 0x3176: 0x5869, + 0x3177: 0x65BC, + 0x3178: 0x6C5A, + 0x3179: 0x7525, + 0x317A: 0x51F9, + 0x317B: 0x592E, + 0x317C: 0x5965, + 0x317D: 0x5F80, + 0x317E: 0x5FDC, + 0x3221: 0x62BC, + 0x3222: 0x65FA, + 0x3223: 0x6A2A, + 0x3224: 0x6B27, + 0x3225: 0x6BB4, + 0x3226: 0x738B, + 0x3227: 0x7FC1, + 0x3228: 0x8956, + 0x3229: 0x9D2C, + 0x322A: 0x9D0E, + 0x322B: 0x9EC4, + 0x322C: 0x5CA1, + 0x322D: 0x6C96, + 0x322E: 0x837B, + 0x322F: 0x5104, + 0x3230: 0x5C4B, + 0x3231: 0x61B6, + 0x3232: 0x81C6, + 0x3233: 0x6876, + 0x3234: 0x7261, + 0x3235: 0x4E59, + 0x3236: 0x4FFA, + 0x3237: 0x5378, + 0x3238: 0x6069, + 0x3239: 0x6E29, + 0x323A: 0x7A4F, + 0x323B: 0x97F3, + 0x323C: 0x4E0B, + 0x323D: 0x5316, + 0x323E: 0x4EEE, + 0x323F: 0x4F55, + 0x3240: 0x4F3D, + 0x3241: 0x4FA1, + 0x3242: 0x4F73, + 0x3243: 0x52A0, + 0x3244: 0x53EF, + 0x3245: 0x5609, + 0x3246: 0x590F, + 0x3247: 0x5AC1, + 0x3248: 0x5BB6, + 0x3249: 0x5BE1, + 0x324A: 0x79D1, + 0x324B: 0x6687, + 0x324C: 0x679C, + 0x324D: 0x67B6, + 0x324E: 0x6B4C, + 0x324F: 0x6CB3, + 0x3250: 0x706B, + 0x3251: 0x73C2, + 0x3252: 0x798D, + 0x3253: 0x79BE, + 0x3254: 0x7A3C, + 0x3255: 0x7B87, + 0x3256: 0x82B1, + 0x3257: 0x82DB, + 0x3258: 0x8304, + 0x3259: 0x8377, + 0x325A: 0x83EF, + 0x325B: 0x83D3, + 0x325C: 0x8766, + 0x325D: 0x8AB2, + 0x325E: 0x5629, + 0x325F: 0x8CA8, + 0x3260: 0x8FE6, + 0x3261: 0x904E, + 0x3262: 0x971E, + 0x3263: 0x868A, + 0x3264: 0x4FC4, + 0x3265: 0x5CE8, + 0x3266: 0x6211, + 0x3267: 0x7259, + 0x3268: 0x753B, + 0x3269: 0x81E5, + 0x326A: 0x82BD, + 0x326B: 0x86FE, + 0x326C: 0x8CC0, + 0x326D: 0x96C5, + 0x326E: 0x9913, + 0x326F: 0x99D5, + 0x3270: 0x4ECB, + 0x3271: 0x4F1A, + 0x3272: 0x89E3, + 0x3273: 0x56DE, + 0x3274: 0x584A, + 0x3275: 0x58CA, + 0x3276: 0x5EFB, + 0x3277: 0x5FEB, + 0x3278: 0x602A, + 0x3279: 0x6094, + 0x327A: 0x6062, + 0x327B: 0x61D0, + 0x327C: 0x6212, + 0x327D: 0x62D0, + 0x327E: 0x6539, + 0x3321: 0x9B41, + 0x3322: 0x6666, + 0x3323: 0x68B0, + 0x3324: 0x6D77, + 0x3325: 0x7070, + 0x3326: 0x754C, + 0x3327: 0x7686, + 0x3328: 0x7D75, + 0x3329: 0x82A5, + 0x332A: 0x87F9, + 0x332B: 0x958B, + 0x332C: 0x968E, + 0x332D: 0x8C9D, + 0x332E: 0x51F1, + 0x332F: 0x52BE, + 0x3330: 0x5916, + 0x3331: 0x54B3, + 0x3332: 0x5BB3, + 0x3333: 0x5D16, + 0x3334: 0x6168, + 0x3335: 0x6982, + 0x3336: 0x6DAF, + 0x3337: 0x788D, + 0x3338: 0x84CB, + 0x3339: 0x8857, + 0x333A: 0x8A72, + 0x333B: 0x93A7, + 0x333C: 0x9AB8, + 0x333D: 0x6D6C, + 0x333E: 0x99A8, + 0x333F: 0x86D9, + 0x3340: 0x57A3, + 0x3341: 0x67FF, + 0x3342: 0x86CE, + 0x3343: 0x920E, + 0x3344: 0x5283, + 0x3345: 0x5687, + 0x3346: 0x5404, + 0x3347: 0x5ED3, + 0x3348: 0x62E1, + 0x3349: 0x64B9, + 0x334A: 0x683C, + 0x334B: 0x6838, + 0x334C: 0x6BBB, + 0x334D: 0x7372, + 0x334E: 0x78BA, + 0x334F: 0x7A6B, + 0x3350: 0x899A, + 0x3351: 0x89D2, + 0x3352: 0x8D6B, + 0x3353: 0x8F03, + 0x3354: 0x90ED, + 0x3355: 0x95A3, + 0x3356: 0x9694, + 0x3357: 0x9769, + 0x3358: 0x5B66, + 0x3359: 0x5CB3, + 0x335A: 0x697D, + 0x335B: 0x984D, + 0x335C: 0x984E, + 0x335D: 0x639B, + 0x335E: 0x7B20, + 0x335F: 0x6A2B, + 0x3360: 0x6A7F, + 0x3361: 0x68B6, + 0x3362: 0x9C0D, + 0x3363: 0x6F5F, + 0x3364: 0x5272, + 0x3365: 0x559D, + 0x3366: 0x6070, + 0x3367: 0x62EC, + 0x3368: 0x6D3B, + 0x3369: 0x6E07, + 0x336A: 0x6ED1, + 0x336B: 0x845B, + 0x336C: 0x8910, + 0x336D: 0x8F44, + 0x336E: 0x4E14, + 0x336F: 0x9C39, + 0x3370: 0x53F6, + 0x3371: 0x691B, + 0x3372: 0x6A3A, + 0x3373: 0x9784, + 0x3374: 0x682A, + 0x3375: 0x515C, + 0x3376: 0x7AC3, + 0x3377: 0x84B2, + 0x3378: 0x91DC, + 0x3379: 0x938C, + 0x337A: 0x565B, + 0x337B: 0x9D28, + 0x337C: 0x6822, + 0x337D: 0x8305, + 0x337E: 0x8431, + 0x3421: 0x7CA5, + 0x3422: 0x5208, + 0x3423: 0x82C5, + 0x3424: 0x74E6, + 0x3425: 0x4E7E, + 0x3426: 0x4F83, + 0x3427: 0x51A0, + 0x3428: 0x5BD2, + 0x3429: 0x520A, + 0x342A: 0x52D8, + 0x342B: 0x52E7, + 0x342C: 0x5DFB, + 0x342D: 0x559A, + 0x342E: 0x582A, + 0x342F: 0x59E6, + 0x3430: 0x5B8C, + 0x3431: 0x5B98, + 0x3432: 0x5BDB, + 0x3433: 0x5E72, + 0x3434: 0x5E79, + 0x3435: 0x60A3, + 0x3436: 0x611F, + 0x3437: 0x6163, + 0x3438: 0x61BE, + 0x3439: 0x63DB, + 0x343A: 0x6562, + 0x343B: 0x67D1, + 0x343C: 0x6853, + 0x343D: 0x68FA, + 0x343E: 0x6B3E, + 0x343F: 0x6B53, + 0x3440: 0x6C57, + 0x3441: 0x6F22, + 0x3442: 0x6F97, + 0x3443: 0x6F45, + 0x3444: 0x74B0, + 0x3445: 0x7518, + 0x3446: 0x76E3, + 0x3447: 0x770B, + 0x3448: 0x7AFF, + 0x3449: 0x7BA1, + 0x344A: 0x7C21, + 0x344B: 0x7DE9, + 0x344C: 0x7F36, + 0x344D: 0x7FF0, + 0x344E: 0x809D, + 0x344F: 0x8266, + 0x3450: 0x839E, + 0x3451: 0x89B3, + 0x3452: 0x8ACC, + 0x3453: 0x8CAB, + 0x3454: 0x9084, + 0x3455: 0x9451, + 0x3456: 0x9593, + 0x3457: 0x9591, + 0x3458: 0x95A2, + 0x3459: 0x9665, + 0x345A: 0x97D3, + 0x345B: 0x9928, + 0x345C: 0x8218, + 0x345D: 0x4E38, + 0x345E: 0x542B, + 0x345F: 0x5CB8, + 0x3460: 0x5DCC, + 0x3461: 0x73A9, + 0x3462: 0x764C, + 0x3463: 0x773C, + 0x3464: 0x5CA9, + 0x3465: 0x7FEB, + 0x3466: 0x8D0B, + 0x3467: 0x96C1, + 0x3468: 0x9811, + 0x3469: 0x9854, + 0x346A: 0x9858, + 0x346B: 0x4F01, + 0x346C: 0x4F0E, + 0x346D: 0x5371, + 0x346E: 0x559C, + 0x346F: 0x5668, + 0x3470: 0x57FA, + 0x3471: 0x5947, + 0x3472: 0x5B09, + 0x3473: 0x5BC4, + 0x3474: 0x5C90, + 0x3475: 0x5E0C, + 0x3476: 0x5E7E, + 0x3477: 0x5FCC, + 0x3478: 0x63EE, + 0x3479: 0x673A, + 0x347A: 0x65D7, + 0x347B: 0x65E2, + 0x347C: 0x671F, + 0x347D: 0x68CB, + 0x347E: 0x68C4, + 0x3521: 0x6A5F, + 0x3522: 0x5E30, + 0x3523: 0x6BC5, + 0x3524: 0x6C17, + 0x3525: 0x6C7D, + 0x3526: 0x757F, + 0x3527: 0x7948, + 0x3528: 0x5B63, + 0x3529: 0x7A00, + 0x352A: 0x7D00, + 0x352B: 0x5FBD, + 0x352C: 0x898F, + 0x352D: 0x8A18, + 0x352E: 0x8CB4, + 0x352F: 0x8D77, + 0x3530: 0x8ECC, + 0x3531: 0x8F1D, + 0x3532: 0x98E2, + 0x3533: 0x9A0E, + 0x3534: 0x9B3C, + 0x3535: 0x4E80, + 0x3536: 0x507D, + 0x3537: 0x5100, + 0x3538: 0x5993, + 0x3539: 0x5B9C, + 0x353A: 0x622F, + 0x353B: 0x6280, + 0x353C: 0x64EC, + 0x353D: 0x6B3A, + 0x353E: 0x72A0, + 0x353F: 0x7591, + 0x3540: 0x7947, + 0x3541: 0x7FA9, + 0x3542: 0x87FB, + 0x3543: 0x8ABC, + 0x3544: 0x8B70, + 0x3545: 0x63AC, + 0x3546: 0x83CA, + 0x3547: 0x97A0, + 0x3548: 0x5409, + 0x3549: 0x5403, + 0x354A: 0x55AB, + 0x354B: 0x6854, + 0x354C: 0x6A58, + 0x354D: 0x8A70, + 0x354E: 0x7827, + 0x354F: 0x6775, + 0x3550: 0x9ECD, + 0x3551: 0x5374, + 0x3552: 0x5BA2, + 0x3553: 0x811A, + 0x3554: 0x8650, + 0x3555: 0x9006, + 0x3556: 0x4E18, + 0x3557: 0x4E45, + 0x3558: 0x4EC7, + 0x3559: 0x4F11, + 0x355A: 0x53CA, + 0x355B: 0x5438, + 0x355C: 0x5BAE, + 0x355D: 0x5F13, + 0x355E: 0x6025, + 0x355F: 0x6551, + 0x3560: 0x673D, + 0x3561: 0x6C42, + 0x3562: 0x6C72, + 0x3563: 0x6CE3, + 0x3564: 0x7078, + 0x3565: 0x7403, + 0x3566: 0x7A76, + 0x3567: 0x7AAE, + 0x3568: 0x7B08, + 0x3569: 0x7D1A, + 0x356A: 0x7CFE, + 0x356B: 0x7D66, + 0x356C: 0x65E7, + 0x356D: 0x725B, + 0x356E: 0x53BB, + 0x356F: 0x5C45, + 0x3570: 0x5DE8, + 0x3571: 0x62D2, + 0x3572: 0x62E0, + 0x3573: 0x6319, + 0x3574: 0x6E20, + 0x3575: 0x865A, + 0x3576: 0x8A31, + 0x3577: 0x8DDD, + 0x3578: 0x92F8, + 0x3579: 0x6F01, + 0x357A: 0x79A6, + 0x357B: 0x9B5A, + 0x357C: 0x4EA8, + 0x357D: 0x4EAB, + 0x357E: 0x4EAC, + 0x3621: 0x4F9B, + 0x3622: 0x4FA0, + 0x3623: 0x50D1, + 0x3624: 0x5147, + 0x3625: 0x7AF6, + 0x3626: 0x5171, + 0x3627: 0x51F6, + 0x3628: 0x5354, + 0x3629: 0x5321, + 0x362A: 0x537F, + 0x362B: 0x53EB, + 0x362C: 0x55AC, + 0x362D: 0x5883, + 0x362E: 0x5CE1, + 0x362F: 0x5F37, + 0x3630: 0x5F4A, + 0x3631: 0x602F, + 0x3632: 0x6050, + 0x3633: 0x606D, + 0x3634: 0x631F, + 0x3635: 0x6559, + 0x3636: 0x6A4B, + 0x3637: 0x6CC1, + 0x3638: 0x72C2, + 0x3639: 0x72ED, + 0x363A: 0x77EF, + 0x363B: 0x80F8, + 0x363C: 0x8105, + 0x363D: 0x8208, + 0x363E: 0x854E, + 0x363F: 0x90F7, + 0x3640: 0x93E1, + 0x3641: 0x97FF, + 0x3642: 0x9957, + 0x3643: 0x9A5A, + 0x3644: 0x4EF0, + 0x3645: 0x51DD, + 0x3646: 0x5C2D, + 0x3647: 0x6681, + 0x3648: 0x696D, + 0x3649: 0x5C40, + 0x364A: 0x66F2, + 0x364B: 0x6975, + 0x364C: 0x7389, + 0x364D: 0x6850, + 0x364E: 0x7C81, + 0x364F: 0x50C5, + 0x3650: 0x52E4, + 0x3651: 0x5747, + 0x3652: 0x5DFE, + 0x3653: 0x9326, + 0x3654: 0x65A4, + 0x3655: 0x6B23, + 0x3656: 0x6B3D, + 0x3657: 0x7434, + 0x3658: 0x7981, + 0x3659: 0x79BD, + 0x365A: 0x7B4B, + 0x365B: 0x7DCA, + 0x365C: 0x82B9, + 0x365D: 0x83CC, + 0x365E: 0x887F, + 0x365F: 0x895F, + 0x3660: 0x8B39, + 0x3661: 0x8FD1, + 0x3662: 0x91D1, + 0x3663: 0x541F, + 0x3664: 0x9280, + 0x3665: 0x4E5D, + 0x3666: 0x5036, + 0x3667: 0x53E5, + 0x3668: 0x533A, + 0x3669: 0x72D7, + 0x366A: 0x7396, + 0x366B: 0x77E9, + 0x366C: 0x82E6, + 0x366D: 0x8EAF, + 0x366E: 0x99C6, + 0x366F: 0x99C8, + 0x3670: 0x99D2, + 0x3671: 0x5177, + 0x3672: 0x611A, + 0x3673: 0x865E, + 0x3674: 0x55B0, + 0x3675: 0x7A7A, + 0x3676: 0x5076, + 0x3677: 0x5BD3, + 0x3678: 0x9047, + 0x3679: 0x9685, + 0x367A: 0x4E32, + 0x367B: 0x6ADB, + 0x367C: 0x91E7, + 0x367D: 0x5C51, + 0x367E: 0x5C48, + 0x3721: 0x6398, + 0x3722: 0x7A9F, + 0x3723: 0x6C93, + 0x3724: 0x9774, + 0x3725: 0x8F61, + 0x3726: 0x7AAA, + 0x3727: 0x718A, + 0x3728: 0x9688, + 0x3729: 0x7C82, + 0x372A: 0x6817, + 0x372B: 0x7E70, + 0x372C: 0x6851, + 0x372D: 0x936C, + 0x372E: 0x52F2, + 0x372F: 0x541B, + 0x3730: 0x85AB, + 0x3731: 0x8A13, + 0x3732: 0x7FA4, + 0x3733: 0x8ECD, + 0x3734: 0x90E1, + 0x3735: 0x5366, + 0x3736: 0x8888, + 0x3737: 0x7941, + 0x3738: 0x4FC2, + 0x3739: 0x50BE, + 0x373A: 0x5211, + 0x373B: 0x5144, + 0x373C: 0x5553, + 0x373D: 0x572D, + 0x373E: 0x73EA, + 0x373F: 0x578B, + 0x3740: 0x5951, + 0x3741: 0x5F62, + 0x3742: 0x5F84, + 0x3743: 0x6075, + 0x3744: 0x6176, + 0x3745: 0x6167, + 0x3746: 0x61A9, + 0x3747: 0x63B2, + 0x3748: 0x643A, + 0x3749: 0x656C, + 0x374A: 0x666F, + 0x374B: 0x6842, + 0x374C: 0x6E13, + 0x374D: 0x7566, + 0x374E: 0x7A3D, + 0x374F: 0x7CFB, + 0x3750: 0x7D4C, + 0x3751: 0x7D99, + 0x3752: 0x7E4B, + 0x3753: 0x7F6B, + 0x3754: 0x830E, + 0x3755: 0x834A, + 0x3756: 0x86CD, + 0x3757: 0x8A08, + 0x3758: 0x8A63, + 0x3759: 0x8B66, + 0x375A: 0x8EFD, + 0x375B: 0x981A, + 0x375C: 0x9D8F, + 0x375D: 0x82B8, + 0x375E: 0x8FCE, + 0x375F: 0x9BE8, + 0x3760: 0x5287, + 0x3761: 0x621F, + 0x3762: 0x6483, + 0x3763: 0x6FC0, + 0x3764: 0x9699, + 0x3765: 0x6841, + 0x3766: 0x5091, + 0x3767: 0x6B20, + 0x3768: 0x6C7A, + 0x3769: 0x6F54, + 0x376A: 0x7A74, + 0x376B: 0x7D50, + 0x376C: 0x8840, + 0x376D: 0x8A23, + 0x376E: 0x6708, + 0x376F: 0x4EF6, + 0x3770: 0x5039, + 0x3771: 0x5026, + 0x3772: 0x5065, + 0x3773: 0x517C, + 0x3774: 0x5238, + 0x3775: 0x5263, + 0x3776: 0x55A7, + 0x3777: 0x570F, + 0x3778: 0x5805, + 0x3779: 0x5ACC, + 0x377A: 0x5EFA, + 0x377B: 0x61B2, + 0x377C: 0x61F8, + 0x377D: 0x62F3, + 0x377E: 0x6372, + 0x3821: 0x691C, + 0x3822: 0x6A29, + 0x3823: 0x727D, + 0x3824: 0x72AC, + 0x3825: 0x732E, + 0x3826: 0x7814, + 0x3827: 0x786F, + 0x3828: 0x7D79, + 0x3829: 0x770C, + 0x382A: 0x80A9, + 0x382B: 0x898B, + 0x382C: 0x8B19, + 0x382D: 0x8CE2, + 0x382E: 0x8ED2, + 0x382F: 0x9063, + 0x3830: 0x9375, + 0x3831: 0x967A, + 0x3832: 0x9855, + 0x3833: 0x9A13, + 0x3834: 0x9E78, + 0x3835: 0x5143, + 0x3836: 0x539F, + 0x3837: 0x53B3, + 0x3838: 0x5E7B, + 0x3839: 0x5F26, + 0x383A: 0x6E1B, + 0x383B: 0x6E90, + 0x383C: 0x7384, + 0x383D: 0x73FE, + 0x383E: 0x7D43, + 0x383F: 0x8237, + 0x3840: 0x8A00, + 0x3841: 0x8AFA, + 0x3842: 0x9650, + 0x3843: 0x4E4E, + 0x3844: 0x500B, + 0x3845: 0x53E4, + 0x3846: 0x547C, + 0x3847: 0x56FA, + 0x3848: 0x59D1, + 0x3849: 0x5B64, + 0x384A: 0x5DF1, + 0x384B: 0x5EAB, + 0x384C: 0x5F27, + 0x384D: 0x6238, + 0x384E: 0x6545, + 0x384F: 0x67AF, + 0x3850: 0x6E56, + 0x3851: 0x72D0, + 0x3852: 0x7CCA, + 0x3853: 0x88B4, + 0x3854: 0x80A1, + 0x3855: 0x80E1, + 0x3856: 0x83F0, + 0x3857: 0x864E, + 0x3858: 0x8A87, + 0x3859: 0x8DE8, + 0x385A: 0x9237, + 0x385B: 0x96C7, + 0x385C: 0x9867, + 0x385D: 0x9F13, + 0x385E: 0x4E94, + 0x385F: 0x4E92, + 0x3860: 0x4F0D, + 0x3861: 0x5348, + 0x3862: 0x5449, + 0x3863: 0x543E, + 0x3864: 0x5A2F, + 0x3865: 0x5F8C, + 0x3866: 0x5FA1, + 0x3867: 0x609F, + 0x3868: 0x68A7, + 0x3869: 0x6A8E, + 0x386A: 0x745A, + 0x386B: 0x7881, + 0x386C: 0x8A9E, + 0x386D: 0x8AA4, + 0x386E: 0x8B77, + 0x386F: 0x9190, + 0x3870: 0x4E5E, + 0x3871: 0x9BC9, + 0x3872: 0x4EA4, + 0x3873: 0x4F7C, + 0x3874: 0x4FAF, + 0x3875: 0x5019, + 0x3876: 0x5016, + 0x3877: 0x5149, + 0x3878: 0x516C, + 0x3879: 0x529F, + 0x387A: 0x52B9, + 0x387B: 0x52FE, + 0x387C: 0x539A, + 0x387D: 0x53E3, + 0x387E: 0x5411, + 0x3921: 0x540E, + 0x3922: 0x5589, + 0x3923: 0x5751, + 0x3924: 0x57A2, + 0x3925: 0x597D, + 0x3926: 0x5B54, + 0x3927: 0x5B5D, + 0x3928: 0x5B8F, + 0x3929: 0x5DE5, + 0x392A: 0x5DE7, + 0x392B: 0x5DF7, + 0x392C: 0x5E78, + 0x392D: 0x5E83, + 0x392E: 0x5E9A, + 0x392F: 0x5EB7, + 0x3930: 0x5F18, + 0x3931: 0x6052, + 0x3932: 0x614C, + 0x3933: 0x6297, + 0x3934: 0x62D8, + 0x3935: 0x63A7, + 0x3936: 0x653B, + 0x3937: 0x6602, + 0x3938: 0x6643, + 0x3939: 0x66F4, + 0x393A: 0x676D, + 0x393B: 0x6821, + 0x393C: 0x6897, + 0x393D: 0x69CB, + 0x393E: 0x6C5F, + 0x393F: 0x6D2A, + 0x3940: 0x6D69, + 0x3941: 0x6E2F, + 0x3942: 0x6E9D, + 0x3943: 0x7532, + 0x3944: 0x7687, + 0x3945: 0x786C, + 0x3946: 0x7A3F, + 0x3947: 0x7CE0, + 0x3948: 0x7D05, + 0x3949: 0x7D18, + 0x394A: 0x7D5E, + 0x394B: 0x7DB1, + 0x394C: 0x8015, + 0x394D: 0x8003, + 0x394E: 0x80AF, + 0x394F: 0x80B1, + 0x3950: 0x8154, + 0x3951: 0x818F, + 0x3952: 0x822A, + 0x3953: 0x8352, + 0x3954: 0x884C, + 0x3955: 0x8861, + 0x3956: 0x8B1B, + 0x3957: 0x8CA2, + 0x3958: 0x8CFC, + 0x3959: 0x90CA, + 0x395A: 0x9175, + 0x395B: 0x9271, + 0x395C: 0x783F, + 0x395D: 0x92FC, + 0x395E: 0x95A4, + 0x395F: 0x964D, + 0x3960: 0x9805, + 0x3961: 0x9999, + 0x3962: 0x9AD8, + 0x3963: 0x9D3B, + 0x3964: 0x525B, + 0x3965: 0x52AB, + 0x3966: 0x53F7, + 0x3967: 0x5408, + 0x3968: 0x58D5, + 0x3969: 0x62F7, + 0x396A: 0x6FE0, + 0x396B: 0x8C6A, + 0x396C: 0x8F5F, + 0x396D: 0x9EB9, + 0x396E: 0x514B, + 0x396F: 0x523B, + 0x3970: 0x544A, + 0x3971: 0x56FD, + 0x3972: 0x7A40, + 0x3973: 0x9177, + 0x3974: 0x9D60, + 0x3975: 0x9ED2, + 0x3976: 0x7344, + 0x3977: 0x6F09, + 0x3978: 0x8170, + 0x3979: 0x7511, + 0x397A: 0x5FFD, + 0x397B: 0x60DA, + 0x397C: 0x9AA8, + 0x397D: 0x72DB, + 0x397E: 0x8FBC, + 0x3A21: 0x6B64, + 0x3A22: 0x9803, + 0x3A23: 0x4ECA, + 0x3A24: 0x56F0, + 0x3A25: 0x5764, + 0x3A26: 0x58BE, + 0x3A27: 0x5A5A, + 0x3A28: 0x6068, + 0x3A29: 0x61C7, + 0x3A2A: 0x660F, + 0x3A2B: 0x6606, + 0x3A2C: 0x6839, + 0x3A2D: 0x68B1, + 0x3A2E: 0x6DF7, + 0x3A2F: 0x75D5, + 0x3A30: 0x7D3A, + 0x3A31: 0x826E, + 0x3A32: 0x9B42, + 0x3A33: 0x4E9B, + 0x3A34: 0x4F50, + 0x3A35: 0x53C9, + 0x3A36: 0x5506, + 0x3A37: 0x5D6F, + 0x3A38: 0x5DE6, + 0x3A39: 0x5DEE, + 0x3A3A: 0x67FB, + 0x3A3B: 0x6C99, + 0x3A3C: 0x7473, + 0x3A3D: 0x7802, + 0x3A3E: 0x8A50, + 0x3A3F: 0x9396, + 0x3A40: 0x88DF, + 0x3A41: 0x5750, + 0x3A42: 0x5EA7, + 0x3A43: 0x632B, + 0x3A44: 0x50B5, + 0x3A45: 0x50AC, + 0x3A46: 0x518D, + 0x3A47: 0x6700, + 0x3A48: 0x54C9, + 0x3A49: 0x585E, + 0x3A4A: 0x59BB, + 0x3A4B: 0x5BB0, + 0x3A4C: 0x5F69, + 0x3A4D: 0x624D, + 0x3A4E: 0x63A1, + 0x3A4F: 0x683D, + 0x3A50: 0x6B73, + 0x3A51: 0x6E08, + 0x3A52: 0x707D, + 0x3A53: 0x91C7, + 0x3A54: 0x7280, + 0x3A55: 0x7815, + 0x3A56: 0x7826, + 0x3A57: 0x796D, + 0x3A58: 0x658E, + 0x3A59: 0x7D30, + 0x3A5A: 0x83DC, + 0x3A5B: 0x88C1, + 0x3A5C: 0x8F09, + 0x3A5D: 0x969B, + 0x3A5E: 0x5264, + 0x3A5F: 0x5728, + 0x3A60: 0x6750, + 0x3A61: 0x7F6A, + 0x3A62: 0x8CA1, + 0x3A63: 0x51B4, + 0x3A64: 0x5742, + 0x3A65: 0x962A, + 0x3A66: 0x583A, + 0x3A67: 0x698A, + 0x3A68: 0x80B4, + 0x3A69: 0x54B2, + 0x3A6A: 0x5D0E, + 0x3A6B: 0x57FC, + 0x3A6C: 0x7895, + 0x3A6D: 0x9DFA, + 0x3A6E: 0x4F5C, + 0x3A6F: 0x524A, + 0x3A70: 0x548B, + 0x3A71: 0x643E, + 0x3A72: 0x6628, + 0x3A73: 0x6714, + 0x3A74: 0x67F5, + 0x3A75: 0x7A84, + 0x3A76: 0x7B56, + 0x3A77: 0x7D22, + 0x3A78: 0x932F, + 0x3A79: 0x685C, + 0x3A7A: 0x9BAD, + 0x3A7B: 0x7B39, + 0x3A7C: 0x5319, + 0x3A7D: 0x518A, + 0x3A7E: 0x5237, + 0x3B21: 0x5BDF, + 0x3B22: 0x62F6, + 0x3B23: 0x64AE, + 0x3B24: 0x64E6, + 0x3B25: 0x672D, + 0x3B26: 0x6BBA, + 0x3B27: 0x85A9, + 0x3B28: 0x96D1, + 0x3B29: 0x7690, + 0x3B2A: 0x9BD6, + 0x3B2B: 0x634C, + 0x3B2C: 0x9306, + 0x3B2D: 0x9BAB, + 0x3B2E: 0x76BF, + 0x3B2F: 0x6652, + 0x3B30: 0x4E09, + 0x3B31: 0x5098, + 0x3B32: 0x53C2, + 0x3B33: 0x5C71, + 0x3B34: 0x60E8, + 0x3B35: 0x6492, + 0x3B36: 0x6563, + 0x3B37: 0x685F, + 0x3B38: 0x71E6, + 0x3B39: 0x73CA, + 0x3B3A: 0x7523, + 0x3B3B: 0x7B97, + 0x3B3C: 0x7E82, + 0x3B3D: 0x8695, + 0x3B3E: 0x8B83, + 0x3B3F: 0x8CDB, + 0x3B40: 0x9178, + 0x3B41: 0x9910, + 0x3B42: 0x65AC, + 0x3B43: 0x66AB, + 0x3B44: 0x6B8B, + 0x3B45: 0x4ED5, + 0x3B46: 0x4ED4, + 0x3B47: 0x4F3A, + 0x3B48: 0x4F7F, + 0x3B49: 0x523A, + 0x3B4A: 0x53F8, + 0x3B4B: 0x53F2, + 0x3B4C: 0x55E3, + 0x3B4D: 0x56DB, + 0x3B4E: 0x58EB, + 0x3B4F: 0x59CB, + 0x3B50: 0x59C9, + 0x3B51: 0x59FF, + 0x3B52: 0x5B50, + 0x3B53: 0x5C4D, + 0x3B54: 0x5E02, + 0x3B55: 0x5E2B, + 0x3B56: 0x5FD7, + 0x3B57: 0x601D, + 0x3B58: 0x6307, + 0x3B59: 0x652F, + 0x3B5A: 0x5B5C, + 0x3B5B: 0x65AF, + 0x3B5C: 0x65BD, + 0x3B5D: 0x65E8, + 0x3B5E: 0x679D, + 0x3B5F: 0x6B62, + 0x3B60: 0x6B7B, + 0x3B61: 0x6C0F, + 0x3B62: 0x7345, + 0x3B63: 0x7949, + 0x3B64: 0x79C1, + 0x3B65: 0x7CF8, + 0x3B66: 0x7D19, + 0x3B67: 0x7D2B, + 0x3B68: 0x80A2, + 0x3B69: 0x8102, + 0x3B6A: 0x81F3, + 0x3B6B: 0x8996, + 0x3B6C: 0x8A5E, + 0x3B6D: 0x8A69, + 0x3B6E: 0x8A66, + 0x3B6F: 0x8A8C, + 0x3B70: 0x8AEE, + 0x3B71: 0x8CC7, + 0x3B72: 0x8CDC, + 0x3B73: 0x96CC, + 0x3B74: 0x98FC, + 0x3B75: 0x6B6F, + 0x3B76: 0x4E8B, + 0x3B77: 0x4F3C, + 0x3B78: 0x4F8D, + 0x3B79: 0x5150, + 0x3B7A: 0x5B57, + 0x3B7B: 0x5BFA, + 0x3B7C: 0x6148, + 0x3B7D: 0x6301, + 0x3B7E: 0x6642, + 0x3C21: 0x6B21, + 0x3C22: 0x6ECB, + 0x3C23: 0x6CBB, + 0x3C24: 0x723E, + 0x3C25: 0x74BD, + 0x3C26: 0x75D4, + 0x3C27: 0x78C1, + 0x3C28: 0x793A, + 0x3C29: 0x800C, + 0x3C2A: 0x8033, + 0x3C2B: 0x81EA, + 0x3C2C: 0x8494, + 0x3C2D: 0x8F9E, + 0x3C2E: 0x6C50, + 0x3C2F: 0x9E7F, + 0x3C30: 0x5F0F, + 0x3C31: 0x8B58, + 0x3C32: 0x9D2B, + 0x3C33: 0x7AFA, + 0x3C34: 0x8EF8, + 0x3C35: 0x5B8D, + 0x3C36: 0x96EB, + 0x3C37: 0x4E03, + 0x3C38: 0x53F1, + 0x3C39: 0x57F7, + 0x3C3A: 0x5931, + 0x3C3B: 0x5AC9, + 0x3C3C: 0x5BA4, + 0x3C3D: 0x6089, + 0x3C3E: 0x6E7F, + 0x3C3F: 0x6F06, + 0x3C40: 0x75BE, + 0x3C41: 0x8CEA, + 0x3C42: 0x5B9F, + 0x3C43: 0x8500, + 0x3C44: 0x7BE0, + 0x3C45: 0x5072, + 0x3C46: 0x67F4, + 0x3C47: 0x829D, + 0x3C48: 0x5C61, + 0x3C49: 0x854A, + 0x3C4A: 0x7E1E, + 0x3C4B: 0x820E, + 0x3C4C: 0x5199, + 0x3C4D: 0x5C04, + 0x3C4E: 0x6368, + 0x3C4F: 0x8D66, + 0x3C50: 0x659C, + 0x3C51: 0x716E, + 0x3C52: 0x793E, + 0x3C53: 0x7D17, + 0x3C54: 0x8005, + 0x3C55: 0x8B1D, + 0x3C56: 0x8ECA, + 0x3C57: 0x906E, + 0x3C58: 0x86C7, + 0x3C59: 0x90AA, + 0x3C5A: 0x501F, + 0x3C5B: 0x52FA, + 0x3C5C: 0x5C3A, + 0x3C5D: 0x6753, + 0x3C5E: 0x707C, + 0x3C5F: 0x7235, + 0x3C60: 0x914C, + 0x3C61: 0x91C8, + 0x3C62: 0x932B, + 0x3C63: 0x82E5, + 0x3C64: 0x5BC2, + 0x3C65: 0x5F31, + 0x3C66: 0x60F9, + 0x3C67: 0x4E3B, + 0x3C68: 0x53D6, + 0x3C69: 0x5B88, + 0x3C6A: 0x624B, + 0x3C6B: 0x6731, + 0x3C6C: 0x6B8A, + 0x3C6D: 0x72E9, + 0x3C6E: 0x73E0, + 0x3C6F: 0x7A2E, + 0x3C70: 0x816B, + 0x3C71: 0x8DA3, + 0x3C72: 0x9152, + 0x3C73: 0x9996, + 0x3C74: 0x5112, + 0x3C75: 0x53D7, + 0x3C76: 0x546A, + 0x3C77: 0x5BFF, + 0x3C78: 0x6388, + 0x3C79: 0x6A39, + 0x3C7A: 0x7DAC, + 0x3C7B: 0x9700, + 0x3C7C: 0x56DA, + 0x3C7D: 0x53CE, + 0x3C7E: 0x5468, + 0x3D21: 0x5B97, + 0x3D22: 0x5C31, + 0x3D23: 0x5DDE, + 0x3D24: 0x4FEE, + 0x3D25: 0x6101, + 0x3D26: 0x62FE, + 0x3D27: 0x6D32, + 0x3D28: 0x79C0, + 0x3D29: 0x79CB, + 0x3D2A: 0x7D42, + 0x3D2B: 0x7E4D, + 0x3D2C: 0x7FD2, + 0x3D2D: 0x81ED, + 0x3D2E: 0x821F, + 0x3D2F: 0x8490, + 0x3D30: 0x8846, + 0x3D31: 0x8972, + 0x3D32: 0x8B90, + 0x3D33: 0x8E74, + 0x3D34: 0x8F2F, + 0x3D35: 0x9031, + 0x3D36: 0x914B, + 0x3D37: 0x916C, + 0x3D38: 0x96C6, + 0x3D39: 0x919C, + 0x3D3A: 0x4EC0, + 0x3D3B: 0x4F4F, + 0x3D3C: 0x5145, + 0x3D3D: 0x5341, + 0x3D3E: 0x5F93, + 0x3D3F: 0x620E, + 0x3D40: 0x67D4, + 0x3D41: 0x6C41, + 0x3D42: 0x6E0B, + 0x3D43: 0x7363, + 0x3D44: 0x7E26, + 0x3D45: 0x91CD, + 0x3D46: 0x9283, + 0x3D47: 0x53D4, + 0x3D48: 0x5919, + 0x3D49: 0x5BBF, + 0x3D4A: 0x6DD1, + 0x3D4B: 0x795D, + 0x3D4C: 0x7E2E, + 0x3D4D: 0x7C9B, + 0x3D4E: 0x587E, + 0x3D4F: 0x719F, + 0x3D50: 0x51FA, + 0x3D51: 0x8853, + 0x3D52: 0x8FF0, + 0x3D53: 0x4FCA, + 0x3D54: 0x5CFB, + 0x3D55: 0x6625, + 0x3D56: 0x77AC, + 0x3D57: 0x7AE3, + 0x3D58: 0x821C, + 0x3D59: 0x99FF, + 0x3D5A: 0x51C6, + 0x3D5B: 0x5FAA, + 0x3D5C: 0x65EC, + 0x3D5D: 0x696F, + 0x3D5E: 0x6B89, + 0x3D5F: 0x6DF3, + 0x3D60: 0x6E96, + 0x3D61: 0x6F64, + 0x3D62: 0x76FE, + 0x3D63: 0x7D14, + 0x3D64: 0x5DE1, + 0x3D65: 0x9075, + 0x3D66: 0x9187, + 0x3D67: 0x9806, + 0x3D68: 0x51E6, + 0x3D69: 0x521D, + 0x3D6A: 0x6240, + 0x3D6B: 0x6691, + 0x3D6C: 0x66D9, + 0x3D6D: 0x6E1A, + 0x3D6E: 0x5EB6, + 0x3D6F: 0x7DD2, + 0x3D70: 0x7F72, + 0x3D71: 0x66F8, + 0x3D72: 0x85AF, + 0x3D73: 0x85F7, + 0x3D74: 0x8AF8, + 0x3D75: 0x52A9, + 0x3D76: 0x53D9, + 0x3D77: 0x5973, + 0x3D78: 0x5E8F, + 0x3D79: 0x5F90, + 0x3D7A: 0x6055, + 0x3D7B: 0x92E4, + 0x3D7C: 0x9664, + 0x3D7D: 0x50B7, + 0x3D7E: 0x511F, + 0x3E21: 0x52DD, + 0x3E22: 0x5320, + 0x3E23: 0x5347, + 0x3E24: 0x53EC, + 0x3E25: 0x54E8, + 0x3E26: 0x5546, + 0x3E27: 0x5531, + 0x3E28: 0x5617, + 0x3E29: 0x5968, + 0x3E2A: 0x59BE, + 0x3E2B: 0x5A3C, + 0x3E2C: 0x5BB5, + 0x3E2D: 0x5C06, + 0x3E2E: 0x5C0F, + 0x3E2F: 0x5C11, + 0x3E30: 0x5C1A, + 0x3E31: 0x5E84, + 0x3E32: 0x5E8A, + 0x3E33: 0x5EE0, + 0x3E34: 0x5F70, + 0x3E35: 0x627F, + 0x3E36: 0x6284, + 0x3E37: 0x62DB, + 0x3E38: 0x638C, + 0x3E39: 0x6377, + 0x3E3A: 0x6607, + 0x3E3B: 0x660C, + 0x3E3C: 0x662D, + 0x3E3D: 0x6676, + 0x3E3E: 0x677E, + 0x3E3F: 0x68A2, + 0x3E40: 0x6A1F, + 0x3E41: 0x6A35, + 0x3E42: 0x6CBC, + 0x3E43: 0x6D88, + 0x3E44: 0x6E09, + 0x3E45: 0x6E58, + 0x3E46: 0x713C, + 0x3E47: 0x7126, + 0x3E48: 0x7167, + 0x3E49: 0x75C7, + 0x3E4A: 0x7701, + 0x3E4B: 0x785D, + 0x3E4C: 0x7901, + 0x3E4D: 0x7965, + 0x3E4E: 0x79F0, + 0x3E4F: 0x7AE0, + 0x3E50: 0x7B11, + 0x3E51: 0x7CA7, + 0x3E52: 0x7D39, + 0x3E53: 0x8096, + 0x3E54: 0x83D6, + 0x3E55: 0x848B, + 0x3E56: 0x8549, + 0x3E57: 0x885D, + 0x3E58: 0x88F3, + 0x3E59: 0x8A1F, + 0x3E5A: 0x8A3C, + 0x3E5B: 0x8A54, + 0x3E5C: 0x8A73, + 0x3E5D: 0x8C61, + 0x3E5E: 0x8CDE, + 0x3E5F: 0x91A4, + 0x3E60: 0x9266, + 0x3E61: 0x937E, + 0x3E62: 0x9418, + 0x3E63: 0x969C, + 0x3E64: 0x9798, + 0x3E65: 0x4E0A, + 0x3E66: 0x4E08, + 0x3E67: 0x4E1E, + 0x3E68: 0x4E57, + 0x3E69: 0x5197, + 0x3E6A: 0x5270, + 0x3E6B: 0x57CE, + 0x3E6C: 0x5834, + 0x3E6D: 0x58CC, + 0x3E6E: 0x5B22, + 0x3E6F: 0x5E38, + 0x3E70: 0x60C5, + 0x3E71: 0x64FE, + 0x3E72: 0x6761, + 0x3E73: 0x6756, + 0x3E74: 0x6D44, + 0x3E75: 0x72B6, + 0x3E76: 0x7573, + 0x3E77: 0x7A63, + 0x3E78: 0x84B8, + 0x3E79: 0x8B72, + 0x3E7A: 0x91B8, + 0x3E7B: 0x9320, + 0x3E7C: 0x5631, + 0x3E7D: 0x57F4, + 0x3E7E: 0x98FE, + 0x3F21: 0x62ED, + 0x3F22: 0x690D, + 0x3F23: 0x6B96, + 0x3F24: 0x71ED, + 0x3F25: 0x7E54, + 0x3F26: 0x8077, + 0x3F27: 0x8272, + 0x3F28: 0x89E6, + 0x3F29: 0x98DF, + 0x3F2A: 0x8755, + 0x3F2B: 0x8FB1, + 0x3F2C: 0x5C3B, + 0x3F2D: 0x4F38, + 0x3F2E: 0x4FE1, + 0x3F2F: 0x4FB5, + 0x3F30: 0x5507, + 0x3F31: 0x5A20, + 0x3F32: 0x5BDD, + 0x3F33: 0x5BE9, + 0x3F34: 0x5FC3, + 0x3F35: 0x614E, + 0x3F36: 0x632F, + 0x3F37: 0x65B0, + 0x3F38: 0x664B, + 0x3F39: 0x68EE, + 0x3F3A: 0x699B, + 0x3F3B: 0x6D78, + 0x3F3C: 0x6DF1, + 0x3F3D: 0x7533, + 0x3F3E: 0x75B9, + 0x3F3F: 0x771F, + 0x3F40: 0x795E, + 0x3F41: 0x79E6, + 0x3F42: 0x7D33, + 0x3F43: 0x81E3, + 0x3F44: 0x82AF, + 0x3F45: 0x85AA, + 0x3F46: 0x89AA, + 0x3F47: 0x8A3A, + 0x3F48: 0x8EAB, + 0x3F49: 0x8F9B, + 0x3F4A: 0x9032, + 0x3F4B: 0x91DD, + 0x3F4C: 0x9707, + 0x3F4D: 0x4EBA, + 0x3F4E: 0x4EC1, + 0x3F4F: 0x5203, + 0x3F50: 0x5875, + 0x3F51: 0x58EC, + 0x3F52: 0x5C0B, + 0x3F53: 0x751A, + 0x3F54: 0x5C3D, + 0x3F55: 0x814E, + 0x3F56: 0x8A0A, + 0x3F57: 0x8FC5, + 0x3F58: 0x9663, + 0x3F59: 0x976D, + 0x3F5A: 0x7B25, + 0x3F5B: 0x8ACF, + 0x3F5C: 0x9808, + 0x3F5D: 0x9162, + 0x3F5E: 0x56F3, + 0x3F5F: 0x53A8, + 0x3F60: 0x9017, + 0x3F61: 0x5439, + 0x3F62: 0x5782, + 0x3F63: 0x5E25, + 0x3F64: 0x63A8, + 0x3F65: 0x6C34, + 0x3F66: 0x708A, + 0x3F67: 0x7761, + 0x3F68: 0x7C8B, + 0x3F69: 0x7FE0, + 0x3F6A: 0x8870, + 0x3F6B: 0x9042, + 0x3F6C: 0x9154, + 0x3F6D: 0x9310, + 0x3F6E: 0x9318, + 0x3F6F: 0x968F, + 0x3F70: 0x745E, + 0x3F71: 0x9AC4, + 0x3F72: 0x5D07, + 0x3F73: 0x5D69, + 0x3F74: 0x6570, + 0x3F75: 0x67A2, + 0x3F76: 0x8DA8, + 0x3F77: 0x96DB, + 0x3F78: 0x636E, + 0x3F79: 0x6749, + 0x3F7A: 0x6919, + 0x3F7B: 0x83C5, + 0x3F7C: 0x9817, + 0x3F7D: 0x96C0, + 0x3F7E: 0x88FE, + 0x4021: 0x6F84, + 0x4022: 0x647A, + 0x4023: 0x5BF8, + 0x4024: 0x4E16, + 0x4025: 0x702C, + 0x4026: 0x755D, + 0x4027: 0x662F, + 0x4028: 0x51C4, + 0x4029: 0x5236, + 0x402A: 0x52E2, + 0x402B: 0x59D3, + 0x402C: 0x5F81, + 0x402D: 0x6027, + 0x402E: 0x6210, + 0x402F: 0x653F, + 0x4030: 0x6574, + 0x4031: 0x661F, + 0x4032: 0x6674, + 0x4033: 0x68F2, + 0x4034: 0x6816, + 0x4035: 0x6B63, + 0x4036: 0x6E05, + 0x4037: 0x7272, + 0x4038: 0x751F, + 0x4039: 0x76DB, + 0x403A: 0x7CBE, + 0x403B: 0x8056, + 0x403C: 0x58F0, + 0x403D: 0x88FD, + 0x403E: 0x897F, + 0x403F: 0x8AA0, + 0x4040: 0x8A93, + 0x4041: 0x8ACB, + 0x4042: 0x901D, + 0x4043: 0x9192, + 0x4044: 0x9752, + 0x4045: 0x9759, + 0x4046: 0x6589, + 0x4047: 0x7A0E, + 0x4048: 0x8106, + 0x4049: 0x96BB, + 0x404A: 0x5E2D, + 0x404B: 0x60DC, + 0x404C: 0x621A, + 0x404D: 0x65A5, + 0x404E: 0x6614, + 0x404F: 0x6790, + 0x4050: 0x77F3, + 0x4051: 0x7A4D, + 0x4052: 0x7C4D, + 0x4053: 0x7E3E, + 0x4054: 0x810A, + 0x4055: 0x8CAC, + 0x4056: 0x8D64, + 0x4057: 0x8DE1, + 0x4058: 0x8E5F, + 0x4059: 0x78A9, + 0x405A: 0x5207, + 0x405B: 0x62D9, + 0x405C: 0x63A5, + 0x405D: 0x6442, + 0x405E: 0x6298, + 0x405F: 0x8A2D, + 0x4060: 0x7A83, + 0x4061: 0x7BC0, + 0x4062: 0x8AAC, + 0x4063: 0x96EA, + 0x4064: 0x7D76, + 0x4065: 0x820C, + 0x4066: 0x8749, + 0x4067: 0x4ED9, + 0x4068: 0x5148, + 0x4069: 0x5343, + 0x406A: 0x5360, + 0x406B: 0x5BA3, + 0x406C: 0x5C02, + 0x406D: 0x5C16, + 0x406E: 0x5DDD, + 0x406F: 0x6226, + 0x4070: 0x6247, + 0x4071: 0x64B0, + 0x4072: 0x6813, + 0x4073: 0x6834, + 0x4074: 0x6CC9, + 0x4075: 0x6D45, + 0x4076: 0x6D17, + 0x4077: 0x67D3, + 0x4078: 0x6F5C, + 0x4079: 0x714E, + 0x407A: 0x717D, + 0x407B: 0x65CB, + 0x407C: 0x7A7F, + 0x407D: 0x7BAD, + 0x407E: 0x7DDA, + 0x4121: 0x7E4A, + 0x4122: 0x7FA8, + 0x4123: 0x817A, + 0x4124: 0x821B, + 0x4125: 0x8239, + 0x4126: 0x85A6, + 0x4127: 0x8A6E, + 0x4128: 0x8CCE, + 0x4129: 0x8DF5, + 0x412A: 0x9078, + 0x412B: 0x9077, + 0x412C: 0x92AD, + 0x412D: 0x9291, + 0x412E: 0x9583, + 0x412F: 0x9BAE, + 0x4130: 0x524D, + 0x4131: 0x5584, + 0x4132: 0x6F38, + 0x4133: 0x7136, + 0x4134: 0x5168, + 0x4135: 0x7985, + 0x4136: 0x7E55, + 0x4137: 0x81B3, + 0x4138: 0x7CCE, + 0x4139: 0x564C, + 0x413A: 0x5851, + 0x413B: 0x5CA8, + 0x413C: 0x63AA, + 0x413D: 0x66FE, + 0x413E: 0x66FD, + 0x413F: 0x695A, + 0x4140: 0x72D9, + 0x4141: 0x758F, + 0x4142: 0x758E, + 0x4143: 0x790E, + 0x4144: 0x7956, + 0x4145: 0x79DF, + 0x4146: 0x7C97, + 0x4147: 0x7D20, + 0x4148: 0x7D44, + 0x4149: 0x8607, + 0x414A: 0x8A34, + 0x414B: 0x963B, + 0x414C: 0x9061, + 0x414D: 0x9F20, + 0x414E: 0x50E7, + 0x414F: 0x5275, + 0x4150: 0x53CC, + 0x4151: 0x53E2, + 0x4152: 0x5009, + 0x4153: 0x55AA, + 0x4154: 0x58EE, + 0x4155: 0x594F, + 0x4156: 0x723D, + 0x4157: 0x5B8B, + 0x4158: 0x5C64, + 0x4159: 0x531D, + 0x415A: 0x60E3, + 0x415B: 0x60F3, + 0x415C: 0x635C, + 0x415D: 0x6383, + 0x415E: 0x633F, + 0x415F: 0x63BB, + 0x4160: 0x64CD, + 0x4161: 0x65E9, + 0x4162: 0x66F9, + 0x4163: 0x5DE3, + 0x4164: 0x69CD, + 0x4165: 0x69FD, + 0x4166: 0x6F15, + 0x4167: 0x71E5, + 0x4168: 0x4E89, + 0x4169: 0x75E9, + 0x416A: 0x76F8, + 0x416B: 0x7A93, + 0x416C: 0x7CDF, + 0x416D: 0x7DCF, + 0x416E: 0x7D9C, + 0x416F: 0x8061, + 0x4170: 0x8349, + 0x4171: 0x8358, + 0x4172: 0x846C, + 0x4173: 0x84BC, + 0x4174: 0x85FB, + 0x4175: 0x88C5, + 0x4176: 0x8D70, + 0x4177: 0x9001, + 0x4178: 0x906D, + 0x4179: 0x9397, + 0x417A: 0x971C, + 0x417B: 0x9A12, + 0x417C: 0x50CF, + 0x417D: 0x5897, + 0x417E: 0x618E, + 0x4221: 0x81D3, + 0x4222: 0x8535, + 0x4223: 0x8D08, + 0x4224: 0x9020, + 0x4225: 0x4FC3, + 0x4226: 0x5074, + 0x4227: 0x5247, + 0x4228: 0x5373, + 0x4229: 0x606F, + 0x422A: 0x6349, + 0x422B: 0x675F, + 0x422C: 0x6E2C, + 0x422D: 0x8DB3, + 0x422E: 0x901F, + 0x422F: 0x4FD7, + 0x4230: 0x5C5E, + 0x4231: 0x8CCA, + 0x4232: 0x65CF, + 0x4233: 0x7D9A, + 0x4234: 0x5352, + 0x4235: 0x8896, + 0x4236: 0x5176, + 0x4237: 0x63C3, + 0x4238: 0x5B58, + 0x4239: 0x5B6B, + 0x423A: 0x5C0A, + 0x423B: 0x640D, + 0x423C: 0x6751, + 0x423D: 0x905C, + 0x423E: 0x4ED6, + 0x423F: 0x591A, + 0x4240: 0x592A, + 0x4241: 0x6C70, + 0x4242: 0x8A51, + 0x4243: 0x553E, + 0x4244: 0x5815, + 0x4245: 0x59A5, + 0x4246: 0x60F0, + 0x4247: 0x6253, + 0x4248: 0x67C1, + 0x4249: 0x8235, + 0x424A: 0x6955, + 0x424B: 0x9640, + 0x424C: 0x99C4, + 0x424D: 0x9A28, + 0x424E: 0x4F53, + 0x424F: 0x5806, + 0x4250: 0x5BFE, + 0x4251: 0x8010, + 0x4252: 0x5CB1, + 0x4253: 0x5E2F, + 0x4254: 0x5F85, + 0x4255: 0x6020, + 0x4256: 0x614B, + 0x4257: 0x6234, + 0x4258: 0x66FF, + 0x4259: 0x6CF0, + 0x425A: 0x6EDE, + 0x425B: 0x80CE, + 0x425C: 0x817F, + 0x425D: 0x82D4, + 0x425E: 0x888B, + 0x425F: 0x8CB8, + 0x4260: 0x9000, + 0x4261: 0x902E, + 0x4262: 0x968A, + 0x4263: 0x9EDB, + 0x4264: 0x9BDB, + 0x4265: 0x4EE3, + 0x4266: 0x53F0, + 0x4267: 0x5927, + 0x4268: 0x7B2C, + 0x4269: 0x918D, + 0x426A: 0x984C, + 0x426B: 0x9DF9, + 0x426C: 0x6EDD, + 0x426D: 0x7027, + 0x426E: 0x5353, + 0x426F: 0x5544, + 0x4270: 0x5B85, + 0x4271: 0x6258, + 0x4272: 0x629E, + 0x4273: 0x62D3, + 0x4274: 0x6CA2, + 0x4275: 0x6FEF, + 0x4276: 0x7422, + 0x4277: 0x8A17, + 0x4278: 0x9438, + 0x4279: 0x6FC1, + 0x427A: 0x8AFE, + 0x427B: 0x8338, + 0x427C: 0x51E7, + 0x427D: 0x86F8, + 0x427E: 0x53EA, + 0x4321: 0x53E9, + 0x4322: 0x4F46, + 0x4323: 0x9054, + 0x4324: 0x8FB0, + 0x4325: 0x596A, + 0x4326: 0x8131, + 0x4327: 0x5DFD, + 0x4328: 0x7AEA, + 0x4329: 0x8FBF, + 0x432A: 0x68DA, + 0x432B: 0x8C37, + 0x432C: 0x72F8, + 0x432D: 0x9C48, + 0x432E: 0x6A3D, + 0x432F: 0x8AB0, + 0x4330: 0x4E39, + 0x4331: 0x5358, + 0x4332: 0x5606, + 0x4333: 0x5766, + 0x4334: 0x62C5, + 0x4335: 0x63A2, + 0x4336: 0x65E6, + 0x4337: 0x6B4E, + 0x4338: 0x6DE1, + 0x4339: 0x6E5B, + 0x433A: 0x70AD, + 0x433B: 0x77ED, + 0x433C: 0x7AEF, + 0x433D: 0x7BAA, + 0x433E: 0x7DBB, + 0x433F: 0x803D, + 0x4340: 0x80C6, + 0x4341: 0x86CB, + 0x4342: 0x8A95, + 0x4343: 0x935B, + 0x4344: 0x56E3, + 0x4345: 0x58C7, + 0x4346: 0x5F3E, + 0x4347: 0x65AD, + 0x4348: 0x6696, + 0x4349: 0x6A80, + 0x434A: 0x6BB5, + 0x434B: 0x7537, + 0x434C: 0x8AC7, + 0x434D: 0x5024, + 0x434E: 0x77E5, + 0x434F: 0x5730, + 0x4350: 0x5F1B, + 0x4351: 0x6065, + 0x4352: 0x667A, + 0x4353: 0x6C60, + 0x4354: 0x75F4, + 0x4355: 0x7A1A, + 0x4356: 0x7F6E, + 0x4357: 0x81F4, + 0x4358: 0x8718, + 0x4359: 0x9045, + 0x435A: 0x99B3, + 0x435B: 0x7BC9, + 0x435C: 0x755C, + 0x435D: 0x7AF9, + 0x435E: 0x7B51, + 0x435F: 0x84C4, + 0x4360: 0x9010, + 0x4361: 0x79E9, + 0x4362: 0x7A92, + 0x4363: 0x8336, + 0x4364: 0x5AE1, + 0x4365: 0x7740, + 0x4366: 0x4E2D, + 0x4367: 0x4EF2, + 0x4368: 0x5B99, + 0x4369: 0x5FE0, + 0x436A: 0x62BD, + 0x436B: 0x663C, + 0x436C: 0x67F1, + 0x436D: 0x6CE8, + 0x436E: 0x866B, + 0x436F: 0x8877, + 0x4370: 0x8A3B, + 0x4371: 0x914E, + 0x4372: 0x92F3, + 0x4373: 0x99D0, + 0x4374: 0x6A17, + 0x4375: 0x7026, + 0x4376: 0x732A, + 0x4377: 0x82E7, + 0x4378: 0x8457, + 0x4379: 0x8CAF, + 0x437A: 0x4E01, + 0x437B: 0x5146, + 0x437C: 0x51CB, + 0x437D: 0x558B, + 0x437E: 0x5BF5, + 0x4421: 0x5E16, + 0x4422: 0x5E33, + 0x4423: 0x5E81, + 0x4424: 0x5F14, + 0x4425: 0x5F35, + 0x4426: 0x5F6B, + 0x4427: 0x5FB4, + 0x4428: 0x61F2, + 0x4429: 0x6311, + 0x442A: 0x66A2, + 0x442B: 0x671D, + 0x442C: 0x6F6E, + 0x442D: 0x7252, + 0x442E: 0x753A, + 0x442F: 0x773A, + 0x4430: 0x8074, + 0x4431: 0x8139, + 0x4432: 0x8178, + 0x4433: 0x8776, + 0x4434: 0x8ABF, + 0x4435: 0x8ADC, + 0x4436: 0x8D85, + 0x4437: 0x8DF3, + 0x4438: 0x929A, + 0x4439: 0x9577, + 0x443A: 0x9802, + 0x443B: 0x9CE5, + 0x443C: 0x52C5, + 0x443D: 0x6357, + 0x443E: 0x76F4, + 0x443F: 0x6715, + 0x4440: 0x6C88, + 0x4441: 0x73CD, + 0x4442: 0x8CC3, + 0x4443: 0x93AE, + 0x4444: 0x9673, + 0x4445: 0x6D25, + 0x4446: 0x589C, + 0x4447: 0x690E, + 0x4448: 0x69CC, + 0x4449: 0x8FFD, + 0x444A: 0x939A, + 0x444B: 0x75DB, + 0x444C: 0x901A, + 0x444D: 0x585A, + 0x444E: 0x6802, + 0x444F: 0x63B4, + 0x4450: 0x69FB, + 0x4451: 0x4F43, + 0x4452: 0x6F2C, + 0x4453: 0x67D8, + 0x4454: 0x8FBB, + 0x4455: 0x8526, + 0x4456: 0x7DB4, + 0x4457: 0x9354, + 0x4458: 0x693F, + 0x4459: 0x6F70, + 0x445A: 0x576A, + 0x445B: 0x58F7, + 0x445C: 0x5B2C, + 0x445D: 0x7D2C, + 0x445E: 0x722A, + 0x445F: 0x540A, + 0x4460: 0x91E3, + 0x4461: 0x9DB4, + 0x4462: 0x4EAD, + 0x4463: 0x4F4E, + 0x4464: 0x505C, + 0x4465: 0x5075, + 0x4466: 0x5243, + 0x4467: 0x8C9E, + 0x4468: 0x5448, + 0x4469: 0x5824, + 0x446A: 0x5B9A, + 0x446B: 0x5E1D, + 0x446C: 0x5E95, + 0x446D: 0x5EAD, + 0x446E: 0x5EF7, + 0x446F: 0x5F1F, + 0x4470: 0x608C, + 0x4471: 0x62B5, + 0x4472: 0x633A, + 0x4473: 0x63D0, + 0x4474: 0x68AF, + 0x4475: 0x6C40, + 0x4476: 0x7887, + 0x4477: 0x798E, + 0x4478: 0x7A0B, + 0x4479: 0x7DE0, + 0x447A: 0x8247, + 0x447B: 0x8A02, + 0x447C: 0x8AE6, + 0x447D: 0x8E44, + 0x447E: 0x9013, + 0x4521: 0x90B8, + 0x4522: 0x912D, + 0x4523: 0x91D8, + 0x4524: 0x9F0E, + 0x4525: 0x6CE5, + 0x4526: 0x6458, + 0x4527: 0x64E2, + 0x4528: 0x6575, + 0x4529: 0x6EF4, + 0x452A: 0x7684, + 0x452B: 0x7B1B, + 0x452C: 0x9069, + 0x452D: 0x93D1, + 0x452E: 0x6EBA, + 0x452F: 0x54F2, + 0x4530: 0x5FB9, + 0x4531: 0x64A4, + 0x4532: 0x8F4D, + 0x4533: 0x8FED, + 0x4534: 0x9244, + 0x4535: 0x5178, + 0x4536: 0x586B, + 0x4537: 0x5929, + 0x4538: 0x5C55, + 0x4539: 0x5E97, + 0x453A: 0x6DFB, + 0x453B: 0x7E8F, + 0x453C: 0x751C, + 0x453D: 0x8CBC, + 0x453E: 0x8EE2, + 0x453F: 0x985B, + 0x4540: 0x70B9, + 0x4541: 0x4F1D, + 0x4542: 0x6BBF, + 0x4543: 0x6FB1, + 0x4544: 0x7530, + 0x4545: 0x96FB, + 0x4546: 0x514E, + 0x4547: 0x5410, + 0x4548: 0x5835, + 0x4549: 0x5857, + 0x454A: 0x59AC, + 0x454B: 0x5C60, + 0x454C: 0x5F92, + 0x454D: 0x6597, + 0x454E: 0x675C, + 0x454F: 0x6E21, + 0x4550: 0x767B, + 0x4551: 0x83DF, + 0x4552: 0x8CED, + 0x4553: 0x9014, + 0x4554: 0x90FD, + 0x4555: 0x934D, + 0x4556: 0x7825, + 0x4557: 0x783A, + 0x4558: 0x52AA, + 0x4559: 0x5EA6, + 0x455A: 0x571F, + 0x455B: 0x5974, + 0x455C: 0x6012, + 0x455D: 0x5012, + 0x455E: 0x515A, + 0x455F: 0x51AC, + 0x4560: 0x51CD, + 0x4561: 0x5200, + 0x4562: 0x5510, + 0x4563: 0x5854, + 0x4564: 0x5858, + 0x4565: 0x5957, + 0x4566: 0x5B95, + 0x4567: 0x5CF6, + 0x4568: 0x5D8B, + 0x4569: 0x60BC, + 0x456A: 0x6295, + 0x456B: 0x642D, + 0x456C: 0x6771, + 0x456D: 0x6843, + 0x456E: 0x68BC, + 0x456F: 0x68DF, + 0x4570: 0x76D7, + 0x4571: 0x6DD8, + 0x4572: 0x6E6F, + 0x4573: 0x6D9B, + 0x4574: 0x706F, + 0x4575: 0x71C8, + 0x4576: 0x5F53, + 0x4577: 0x75D8, + 0x4578: 0x7977, + 0x4579: 0x7B49, + 0x457A: 0x7B54, + 0x457B: 0x7B52, + 0x457C: 0x7CD6, + 0x457D: 0x7D71, + 0x457E: 0x5230, + 0x4621: 0x8463, + 0x4622: 0x8569, + 0x4623: 0x85E4, + 0x4624: 0x8A0E, + 0x4625: 0x8B04, + 0x4626: 0x8C46, + 0x4627: 0x8E0F, + 0x4628: 0x9003, + 0x4629: 0x900F, + 0x462A: 0x9419, + 0x462B: 0x9676, + 0x462C: 0x982D, + 0x462D: 0x9A30, + 0x462E: 0x95D8, + 0x462F: 0x50CD, + 0x4630: 0x52D5, + 0x4631: 0x540C, + 0x4632: 0x5802, + 0x4633: 0x5C0E, + 0x4634: 0x61A7, + 0x4635: 0x649E, + 0x4636: 0x6D1E, + 0x4637: 0x77B3, + 0x4638: 0x7AE5, + 0x4639: 0x80F4, + 0x463A: 0x8404, + 0x463B: 0x9053, + 0x463C: 0x9285, + 0x463D: 0x5CE0, + 0x463E: 0x9D07, + 0x463F: 0x533F, + 0x4640: 0x5F97, + 0x4641: 0x5FB3, + 0x4642: 0x6D9C, + 0x4643: 0x7279, + 0x4644: 0x7763, + 0x4645: 0x79BF, + 0x4646: 0x7BE4, + 0x4647: 0x6BD2, + 0x4648: 0x72EC, + 0x4649: 0x8AAD, + 0x464A: 0x6803, + 0x464B: 0x6A61, + 0x464C: 0x51F8, + 0x464D: 0x7A81, + 0x464E: 0x6934, + 0x464F: 0x5C4A, + 0x4650: 0x9CF6, + 0x4651: 0x82EB, + 0x4652: 0x5BC5, + 0x4653: 0x9149, + 0x4654: 0x701E, + 0x4655: 0x5678, + 0x4656: 0x5C6F, + 0x4657: 0x60C7, + 0x4658: 0x6566, + 0x4659: 0x6C8C, + 0x465A: 0x8C5A, + 0x465B: 0x9041, + 0x465C: 0x9813, + 0x465D: 0x5451, + 0x465E: 0x66C7, + 0x465F: 0x920D, + 0x4660: 0x5948, + 0x4661: 0x90A3, + 0x4662: 0x5185, + 0x4663: 0x4E4D, + 0x4664: 0x51EA, + 0x4665: 0x8599, + 0x4666: 0x8B0E, + 0x4667: 0x7058, + 0x4668: 0x637A, + 0x4669: 0x934B, + 0x466A: 0x6962, + 0x466B: 0x99B4, + 0x466C: 0x7E04, + 0x466D: 0x7577, + 0x466E: 0x5357, + 0x466F: 0x6960, + 0x4670: 0x8EDF, + 0x4671: 0x96E3, + 0x4672: 0x6C5D, + 0x4673: 0x4E8C, + 0x4674: 0x5C3C, + 0x4675: 0x5F10, + 0x4676: 0x8FE9, + 0x4677: 0x5302, + 0x4678: 0x8CD1, + 0x4679: 0x8089, + 0x467A: 0x8679, + 0x467B: 0x5EFF, + 0x467C: 0x65E5, + 0x467D: 0x4E73, + 0x467E: 0x5165, + 0x4721: 0x5982, + 0x4722: 0x5C3F, + 0x4723: 0x97EE, + 0x4724: 0x4EFB, + 0x4725: 0x598A, + 0x4726: 0x5FCD, + 0x4727: 0x8A8D, + 0x4728: 0x6FE1, + 0x4729: 0x79B0, + 0x472A: 0x7962, + 0x472B: 0x5BE7, + 0x472C: 0x8471, + 0x472D: 0x732B, + 0x472E: 0x71B1, + 0x472F: 0x5E74, + 0x4730: 0x5FF5, + 0x4731: 0x637B, + 0x4732: 0x649A, + 0x4733: 0x71C3, + 0x4734: 0x7C98, + 0x4735: 0x4E43, + 0x4736: 0x5EFC, + 0x4737: 0x4E4B, + 0x4738: 0x57DC, + 0x4739: 0x56A2, + 0x473A: 0x60A9, + 0x473B: 0x6FC3, + 0x473C: 0x7D0D, + 0x473D: 0x80FD, + 0x473E: 0x8133, + 0x473F: 0x81BF, + 0x4740: 0x8FB2, + 0x4741: 0x8997, + 0x4742: 0x86A4, + 0x4743: 0x5DF4, + 0x4744: 0x628A, + 0x4745: 0x64AD, + 0x4746: 0x8987, + 0x4747: 0x6777, + 0x4748: 0x6CE2, + 0x4749: 0x6D3E, + 0x474A: 0x7436, + 0x474B: 0x7834, + 0x474C: 0x5A46, + 0x474D: 0x7F75, + 0x474E: 0x82AD, + 0x474F: 0x99AC, + 0x4750: 0x4FF3, + 0x4751: 0x5EC3, + 0x4752: 0x62DD, + 0x4753: 0x6392, + 0x4754: 0x6557, + 0x4755: 0x676F, + 0x4756: 0x76C3, + 0x4757: 0x724C, + 0x4758: 0x80CC, + 0x4759: 0x80BA, + 0x475A: 0x8F29, + 0x475B: 0x914D, + 0x475C: 0x500D, + 0x475D: 0x57F9, + 0x475E: 0x5A92, + 0x475F: 0x6885, + 0x4760: 0x6973, + 0x4761: 0x7164, + 0x4762: 0x72FD, + 0x4763: 0x8CB7, + 0x4764: 0x58F2, + 0x4765: 0x8CE0, + 0x4766: 0x966A, + 0x4767: 0x9019, + 0x4768: 0x877F, + 0x4769: 0x79E4, + 0x476A: 0x77E7, + 0x476B: 0x8429, + 0x476C: 0x4F2F, + 0x476D: 0x5265, + 0x476E: 0x535A, + 0x476F: 0x62CD, + 0x4770: 0x67CF, + 0x4771: 0x6CCA, + 0x4772: 0x767D, + 0x4773: 0x7B94, + 0x4774: 0x7C95, + 0x4775: 0x8236, + 0x4776: 0x8584, + 0x4777: 0x8FEB, + 0x4778: 0x66DD, + 0x4779: 0x6F20, + 0x477A: 0x7206, + 0x477B: 0x7E1B, + 0x477C: 0x83AB, + 0x477D: 0x99C1, + 0x477E: 0x9EA6, + 0x4821: 0x51FD, + 0x4822: 0x7BB1, + 0x4823: 0x7872, + 0x4824: 0x7BB8, + 0x4825: 0x8087, + 0x4826: 0x7B48, + 0x4827: 0x6AE8, + 0x4828: 0x5E61, + 0x4829: 0x808C, + 0x482A: 0x7551, + 0x482B: 0x7560, + 0x482C: 0x516B, + 0x482D: 0x9262, + 0x482E: 0x6E8C, + 0x482F: 0x767A, + 0x4830: 0x9197, + 0x4831: 0x9AEA, + 0x4832: 0x4F10, + 0x4833: 0x7F70, + 0x4834: 0x629C, + 0x4835: 0x7B4F, + 0x4836: 0x95A5, + 0x4837: 0x9CE9, + 0x4838: 0x567A, + 0x4839: 0x5859, + 0x483A: 0x86E4, + 0x483B: 0x96BC, + 0x483C: 0x4F34, + 0x483D: 0x5224, + 0x483E: 0x534A, + 0x483F: 0x53CD, + 0x4840: 0x53DB, + 0x4841: 0x5E06, + 0x4842: 0x642C, + 0x4843: 0x6591, + 0x4844: 0x677F, + 0x4845: 0x6C3E, + 0x4846: 0x6C4E, + 0x4847: 0x7248, + 0x4848: 0x72AF, + 0x4849: 0x73ED, + 0x484A: 0x7554, + 0x484B: 0x7E41, + 0x484C: 0x822C, + 0x484D: 0x85E9, + 0x484E: 0x8CA9, + 0x484F: 0x7BC4, + 0x4850: 0x91C6, + 0x4851: 0x7169, + 0x4852: 0x9812, + 0x4853: 0x98EF, + 0x4854: 0x633D, + 0x4855: 0x6669, + 0x4856: 0x756A, + 0x4857: 0x76E4, + 0x4858: 0x78D0, + 0x4859: 0x8543, + 0x485A: 0x86EE, + 0x485B: 0x532A, + 0x485C: 0x5351, + 0x485D: 0x5426, + 0x485E: 0x5983, + 0x485F: 0x5E87, + 0x4860: 0x5F7C, + 0x4861: 0x60B2, + 0x4862: 0x6249, + 0x4863: 0x6279, + 0x4864: 0x62AB, + 0x4865: 0x6590, + 0x4866: 0x6BD4, + 0x4867: 0x6CCC, + 0x4868: 0x75B2, + 0x4869: 0x76AE, + 0x486A: 0x7891, + 0x486B: 0x79D8, + 0x486C: 0x7DCB, + 0x486D: 0x7F77, + 0x486E: 0x80A5, + 0x486F: 0x88AB, + 0x4870: 0x8AB9, + 0x4871: 0x8CBB, + 0x4872: 0x907F, + 0x4873: 0x975E, + 0x4874: 0x98DB, + 0x4875: 0x6A0B, + 0x4876: 0x7C38, + 0x4877: 0x5099, + 0x4878: 0x5C3E, + 0x4879: 0x5FAE, + 0x487A: 0x6787, + 0x487B: 0x6BD8, + 0x487C: 0x7435, + 0x487D: 0x7709, + 0x487E: 0x7F8E, + 0x4921: 0x9F3B, + 0x4922: 0x67CA, + 0x4923: 0x7A17, + 0x4924: 0x5339, + 0x4925: 0x758B, + 0x4926: 0x9AED, + 0x4927: 0x5F66, + 0x4928: 0x819D, + 0x4929: 0x83F1, + 0x492A: 0x8098, + 0x492B: 0x5F3C, + 0x492C: 0x5FC5, + 0x492D: 0x7562, + 0x492E: 0x7B46, + 0x492F: 0x903C, + 0x4930: 0x6867, + 0x4931: 0x59EB, + 0x4932: 0x5A9B, + 0x4933: 0x7D10, + 0x4934: 0x767E, + 0x4935: 0x8B2C, + 0x4936: 0x4FF5, + 0x4937: 0x5F6A, + 0x4938: 0x6A19, + 0x4939: 0x6C37, + 0x493A: 0x6F02, + 0x493B: 0x74E2, + 0x493C: 0x7968, + 0x493D: 0x8868, + 0x493E: 0x8A55, + 0x493F: 0x8C79, + 0x4940: 0x5EDF, + 0x4941: 0x63CF, + 0x4942: 0x75C5, + 0x4943: 0x79D2, + 0x4944: 0x82D7, + 0x4945: 0x9328, + 0x4946: 0x92F2, + 0x4947: 0x849C, + 0x4948: 0x86ED, + 0x4949: 0x9C2D, + 0x494A: 0x54C1, + 0x494B: 0x5F6C, + 0x494C: 0x658C, + 0x494D: 0x6D5C, + 0x494E: 0x7015, + 0x494F: 0x8CA7, + 0x4950: 0x8CD3, + 0x4951: 0x983B, + 0x4952: 0x654F, + 0x4953: 0x74F6, + 0x4954: 0x4E0D, + 0x4955: 0x4ED8, + 0x4956: 0x57E0, + 0x4957: 0x592B, + 0x4958: 0x5A66, + 0x4959: 0x5BCC, + 0x495A: 0x51A8, + 0x495B: 0x5E03, + 0x495C: 0x5E9C, + 0x495D: 0x6016, + 0x495E: 0x6276, + 0x495F: 0x6577, + 0x4960: 0x65A7, + 0x4961: 0x666E, + 0x4962: 0x6D6E, + 0x4963: 0x7236, + 0x4964: 0x7B26, + 0x4965: 0x8150, + 0x4966: 0x819A, + 0x4967: 0x8299, + 0x4968: 0x8B5C, + 0x4969: 0x8CA0, + 0x496A: 0x8CE6, + 0x496B: 0x8D74, + 0x496C: 0x961C, + 0x496D: 0x9644, + 0x496E: 0x4FAE, + 0x496F: 0x64AB, + 0x4970: 0x6B66, + 0x4971: 0x821E, + 0x4972: 0x8461, + 0x4973: 0x856A, + 0x4974: 0x90E8, + 0x4975: 0x5C01, + 0x4976: 0x6953, + 0x4977: 0x98A8, + 0x4978: 0x847A, + 0x4979: 0x8557, + 0x497A: 0x4F0F, + 0x497B: 0x526F, + 0x497C: 0x5FA9, + 0x497D: 0x5E45, + 0x497E: 0x670D, + 0x4A21: 0x798F, + 0x4A22: 0x8179, + 0x4A23: 0x8907, + 0x4A24: 0x8986, + 0x4A25: 0x6DF5, + 0x4A26: 0x5F17, + 0x4A27: 0x6255, + 0x4A28: 0x6CB8, + 0x4A29: 0x4ECF, + 0x4A2A: 0x7269, + 0x4A2B: 0x9B92, + 0x4A2C: 0x5206, + 0x4A2D: 0x543B, + 0x4A2E: 0x5674, + 0x4A2F: 0x58B3, + 0x4A30: 0x61A4, + 0x4A31: 0x626E, + 0x4A32: 0x711A, + 0x4A33: 0x596E, + 0x4A34: 0x7C89, + 0x4A35: 0x7CDE, + 0x4A36: 0x7D1B, + 0x4A37: 0x96F0, + 0x4A38: 0x6587, + 0x4A39: 0x805E, + 0x4A3A: 0x4E19, + 0x4A3B: 0x4F75, + 0x4A3C: 0x5175, + 0x4A3D: 0x5840, + 0x4A3E: 0x5E63, + 0x4A3F: 0x5E73, + 0x4A40: 0x5F0A, + 0x4A41: 0x67C4, + 0x4A42: 0x4E26, + 0x4A43: 0x853D, + 0x4A44: 0x9589, + 0x4A45: 0x965B, + 0x4A46: 0x7C73, + 0x4A47: 0x9801, + 0x4A48: 0x50FB, + 0x4A49: 0x58C1, + 0x4A4A: 0x7656, + 0x4A4B: 0x78A7, + 0x4A4C: 0x5225, + 0x4A4D: 0x77A5, + 0x4A4E: 0x8511, + 0x4A4F: 0x7B86, + 0x4A50: 0x504F, + 0x4A51: 0x5909, + 0x4A52: 0x7247, + 0x4A53: 0x7BC7, + 0x4A54: 0x7DE8, + 0x4A55: 0x8FBA, + 0x4A56: 0x8FD4, + 0x4A57: 0x904D, + 0x4A58: 0x4FBF, + 0x4A59: 0x52C9, + 0x4A5A: 0x5A29, + 0x4A5B: 0x5F01, + 0x4A5C: 0x97AD, + 0x4A5D: 0x4FDD, + 0x4A5E: 0x8217, + 0x4A5F: 0x92EA, + 0x4A60: 0x5703, + 0x4A61: 0x6355, + 0x4A62: 0x6B69, + 0x4A63: 0x752B, + 0x4A64: 0x88DC, + 0x4A65: 0x8F14, + 0x4A66: 0x7A42, + 0x4A67: 0x52DF, + 0x4A68: 0x5893, + 0x4A69: 0x6155, + 0x4A6A: 0x620A, + 0x4A6B: 0x66AE, + 0x4A6C: 0x6BCD, + 0x4A6D: 0x7C3F, + 0x4A6E: 0x83E9, + 0x4A6F: 0x5023, + 0x4A70: 0x4FF8, + 0x4A71: 0x5305, + 0x4A72: 0x5446, + 0x4A73: 0x5831, + 0x4A74: 0x5949, + 0x4A75: 0x5B9D, + 0x4A76: 0x5CF0, + 0x4A77: 0x5CEF, + 0x4A78: 0x5D29, + 0x4A79: 0x5E96, + 0x4A7A: 0x62B1, + 0x4A7B: 0x6367, + 0x4A7C: 0x653E, + 0x4A7D: 0x65B9, + 0x4A7E: 0x670B, + 0x4B21: 0x6CD5, + 0x4B22: 0x6CE1, + 0x4B23: 0x70F9, + 0x4B24: 0x7832, + 0x4B25: 0x7E2B, + 0x4B26: 0x80DE, + 0x4B27: 0x82B3, + 0x4B28: 0x840C, + 0x4B29: 0x84EC, + 0x4B2A: 0x8702, + 0x4B2B: 0x8912, + 0x4B2C: 0x8A2A, + 0x4B2D: 0x8C4A, + 0x4B2E: 0x90A6, + 0x4B2F: 0x92D2, + 0x4B30: 0x98FD, + 0x4B31: 0x9CF3, + 0x4B32: 0x9D6C, + 0x4B33: 0x4E4F, + 0x4B34: 0x4EA1, + 0x4B35: 0x508D, + 0x4B36: 0x5256, + 0x4B37: 0x574A, + 0x4B38: 0x59A8, + 0x4B39: 0x5E3D, + 0x4B3A: 0x5FD8, + 0x4B3B: 0x5FD9, + 0x4B3C: 0x623F, + 0x4B3D: 0x66B4, + 0x4B3E: 0x671B, + 0x4B3F: 0x67D0, + 0x4B40: 0x68D2, + 0x4B41: 0x5192, + 0x4B42: 0x7D21, + 0x4B43: 0x80AA, + 0x4B44: 0x81A8, + 0x4B45: 0x8B00, + 0x4B46: 0x8C8C, + 0x4B47: 0x8CBF, + 0x4B48: 0x927E, + 0x4B49: 0x9632, + 0x4B4A: 0x5420, + 0x4B4B: 0x982C, + 0x4B4C: 0x5317, + 0x4B4D: 0x50D5, + 0x4B4E: 0x535C, + 0x4B4F: 0x58A8, + 0x4B50: 0x64B2, + 0x4B51: 0x6734, + 0x4B52: 0x7267, + 0x4B53: 0x7766, + 0x4B54: 0x7A46, + 0x4B55: 0x91E6, + 0x4B56: 0x52C3, + 0x4B57: 0x6CA1, + 0x4B58: 0x6B86, + 0x4B59: 0x5800, + 0x4B5A: 0x5E4C, + 0x4B5B: 0x5954, + 0x4B5C: 0x672C, + 0x4B5D: 0x7FFB, + 0x4B5E: 0x51E1, + 0x4B5F: 0x76C6, + 0x4B60: 0x6469, + 0x4B61: 0x78E8, + 0x4B62: 0x9B54, + 0x4B63: 0x9EBB, + 0x4B64: 0x57CB, + 0x4B65: 0x59B9, + 0x4B66: 0x6627, + 0x4B67: 0x679A, + 0x4B68: 0x6BCE, + 0x4B69: 0x54E9, + 0x4B6A: 0x69D9, + 0x4B6B: 0x5E55, + 0x4B6C: 0x819C, + 0x4B6D: 0x6795, + 0x4B6E: 0x9BAA, + 0x4B6F: 0x67FE, + 0x4B70: 0x9C52, + 0x4B71: 0x685D, + 0x4B72: 0x4EA6, + 0x4B73: 0x4FE3, + 0x4B74: 0x53C8, + 0x4B75: 0x62B9, + 0x4B76: 0x672B, + 0x4B77: 0x6CAB, + 0x4B78: 0x8FC4, + 0x4B79: 0x4FAD, + 0x4B7A: 0x7E6D, + 0x4B7B: 0x9EBF, + 0x4B7C: 0x4E07, + 0x4B7D: 0x6162, + 0x4B7E: 0x6E80, + 0x4C21: 0x6F2B, + 0x4C22: 0x8513, + 0x4C23: 0x5473, + 0x4C24: 0x672A, + 0x4C25: 0x9B45, + 0x4C26: 0x5DF3, + 0x4C27: 0x7B95, + 0x4C28: 0x5CAC, + 0x4C29: 0x5BC6, + 0x4C2A: 0x871C, + 0x4C2B: 0x6E4A, + 0x4C2C: 0x84D1, + 0x4C2D: 0x7A14, + 0x4C2E: 0x8108, + 0x4C2F: 0x5999, + 0x4C30: 0x7C8D, + 0x4C31: 0x6C11, + 0x4C32: 0x7720, + 0x4C33: 0x52D9, + 0x4C34: 0x5922, + 0x4C35: 0x7121, + 0x4C36: 0x725F, + 0x4C37: 0x77DB, + 0x4C38: 0x9727, + 0x4C39: 0x9D61, + 0x4C3A: 0x690B, + 0x4C3B: 0x5A7F, + 0x4C3C: 0x5A18, + 0x4C3D: 0x51A5, + 0x4C3E: 0x540D, + 0x4C3F: 0x547D, + 0x4C40: 0x660E, + 0x4C41: 0x76DF, + 0x4C42: 0x8FF7, + 0x4C43: 0x9298, + 0x4C44: 0x9CF4, + 0x4C45: 0x59EA, + 0x4C46: 0x725D, + 0x4C47: 0x6EC5, + 0x4C48: 0x514D, + 0x4C49: 0x68C9, + 0x4C4A: 0x7DBF, + 0x4C4B: 0x7DEC, + 0x4C4C: 0x9762, + 0x4C4D: 0x9EBA, + 0x4C4E: 0x6478, + 0x4C4F: 0x6A21, + 0x4C50: 0x8302, + 0x4C51: 0x5984, + 0x4C52: 0x5B5F, + 0x4C53: 0x6BDB, + 0x4C54: 0x731B, + 0x4C55: 0x76F2, + 0x4C56: 0x7DB2, + 0x4C57: 0x8017, + 0x4C58: 0x8499, + 0x4C59: 0x5132, + 0x4C5A: 0x6728, + 0x4C5B: 0x9ED9, + 0x4C5C: 0x76EE, + 0x4C5D: 0x6762, + 0x4C5E: 0x52FF, + 0x4C5F: 0x9905, + 0x4C60: 0x5C24, + 0x4C61: 0x623B, + 0x4C62: 0x7C7E, + 0x4C63: 0x8CB0, + 0x4C64: 0x554F, + 0x4C65: 0x60B6, + 0x4C66: 0x7D0B, + 0x4C67: 0x9580, + 0x4C68: 0x5301, + 0x4C69: 0x4E5F, + 0x4C6A: 0x51B6, + 0x4C6B: 0x591C, + 0x4C6C: 0x723A, + 0x4C6D: 0x8036, + 0x4C6E: 0x91CE, + 0x4C6F: 0x5F25, + 0x4C70: 0x77E2, + 0x4C71: 0x5384, + 0x4C72: 0x5F79, + 0x4C73: 0x7D04, + 0x4C74: 0x85AC, + 0x4C75: 0x8A33, + 0x4C76: 0x8E8D, + 0x4C77: 0x9756, + 0x4C78: 0x67F3, + 0x4C79: 0x85AE, + 0x4C7A: 0x9453, + 0x4C7B: 0x6109, + 0x4C7C: 0x6108, + 0x4C7D: 0x6CB9, + 0x4C7E: 0x7652, + 0x4D21: 0x8AED, + 0x4D22: 0x8F38, + 0x4D23: 0x552F, + 0x4D24: 0x4F51, + 0x4D25: 0x512A, + 0x4D26: 0x52C7, + 0x4D27: 0x53CB, + 0x4D28: 0x5BA5, + 0x4D29: 0x5E7D, + 0x4D2A: 0x60A0, + 0x4D2B: 0x6182, + 0x4D2C: 0x63D6, + 0x4D2D: 0x6709, + 0x4D2E: 0x67DA, + 0x4D2F: 0x6E67, + 0x4D30: 0x6D8C, + 0x4D31: 0x7336, + 0x4D32: 0x7337, + 0x4D33: 0x7531, + 0x4D34: 0x7950, + 0x4D35: 0x88D5, + 0x4D36: 0x8A98, + 0x4D37: 0x904A, + 0x4D38: 0x9091, + 0x4D39: 0x90F5, + 0x4D3A: 0x96C4, + 0x4D3B: 0x878D, + 0x4D3C: 0x5915, + 0x4D3D: 0x4E88, + 0x4D3E: 0x4F59, + 0x4D3F: 0x4E0E, + 0x4D40: 0x8A89, + 0x4D41: 0x8F3F, + 0x4D42: 0x9810, + 0x4D43: 0x50AD, + 0x4D44: 0x5E7C, + 0x4D45: 0x5996, + 0x4D46: 0x5BB9, + 0x4D47: 0x5EB8, + 0x4D48: 0x63DA, + 0x4D49: 0x63FA, + 0x4D4A: 0x64C1, + 0x4D4B: 0x66DC, + 0x4D4C: 0x694A, + 0x4D4D: 0x69D8, + 0x4D4E: 0x6D0B, + 0x4D4F: 0x6EB6, + 0x4D50: 0x7194, + 0x4D51: 0x7528, + 0x4D52: 0x7AAF, + 0x4D53: 0x7F8A, + 0x4D54: 0x8000, + 0x4D55: 0x8449, + 0x4D56: 0x84C9, + 0x4D57: 0x8981, + 0x4D58: 0x8B21, + 0x4D59: 0x8E0A, + 0x4D5A: 0x9065, + 0x4D5B: 0x967D, + 0x4D5C: 0x990A, + 0x4D5D: 0x617E, + 0x4D5E: 0x6291, + 0x4D5F: 0x6B32, + 0x4D60: 0x6C83, + 0x4D61: 0x6D74, + 0x4D62: 0x7FCC, + 0x4D63: 0x7FFC, + 0x4D64: 0x6DC0, + 0x4D65: 0x7F85, + 0x4D66: 0x87BA, + 0x4D67: 0x88F8, + 0x4D68: 0x6765, + 0x4D69: 0x83B1, + 0x4D6A: 0x983C, + 0x4D6B: 0x96F7, + 0x4D6C: 0x6D1B, + 0x4D6D: 0x7D61, + 0x4D6E: 0x843D, + 0x4D6F: 0x916A, + 0x4D70: 0x4E71, + 0x4D71: 0x5375, + 0x4D72: 0x5D50, + 0x4D73: 0x6B04, + 0x4D74: 0x6FEB, + 0x4D75: 0x85CD, + 0x4D76: 0x862D, + 0x4D77: 0x89A7, + 0x4D78: 0x5229, + 0x4D79: 0x540F, + 0x4D7A: 0x5C65, + 0x4D7B: 0x674E, + 0x4D7C: 0x68A8, + 0x4D7D: 0x7406, + 0x4D7E: 0x7483, + 0x4E21: 0x75E2, + 0x4E22: 0x88CF, + 0x4E23: 0x88E1, + 0x4E24: 0x91CC, + 0x4E25: 0x96E2, + 0x4E26: 0x9678, + 0x4E27: 0x5F8B, + 0x4E28: 0x7387, + 0x4E29: 0x7ACB, + 0x4E2A: 0x844E, + 0x4E2B: 0x63A0, + 0x4E2C: 0x7565, + 0x4E2D: 0x5289, + 0x4E2E: 0x6D41, + 0x4E2F: 0x6E9C, + 0x4E30: 0x7409, + 0x4E31: 0x7559, + 0x4E32: 0x786B, + 0x4E33: 0x7C92, + 0x4E34: 0x9686, + 0x4E35: 0x7ADC, + 0x4E36: 0x9F8D, + 0x4E37: 0x4FB6, + 0x4E38: 0x616E, + 0x4E39: 0x65C5, + 0x4E3A: 0x865C, + 0x4E3B: 0x4E86, + 0x4E3C: 0x4EAE, + 0x4E3D: 0x50DA, + 0x4E3E: 0x4E21, + 0x4E3F: 0x51CC, + 0x4E40: 0x5BEE, + 0x4E41: 0x6599, + 0x4E42: 0x6881, + 0x4E43: 0x6DBC, + 0x4E44: 0x731F, + 0x4E45: 0x7642, + 0x4E46: 0x77AD, + 0x4E47: 0x7A1C, + 0x4E48: 0x7CE7, + 0x4E49: 0x826F, + 0x4E4A: 0x8AD2, + 0x4E4B: 0x907C, + 0x4E4C: 0x91CF, + 0x4E4D: 0x9675, + 0x4E4E: 0x9818, + 0x4E4F: 0x529B, + 0x4E50: 0x7DD1, + 0x4E51: 0x502B, + 0x4E52: 0x5398, + 0x4E53: 0x6797, + 0x4E54: 0x6DCB, + 0x4E55: 0x71D0, + 0x4E56: 0x7433, + 0x4E57: 0x81E8, + 0x4E58: 0x8F2A, + 0x4E59: 0x96A3, + 0x4E5A: 0x9C57, + 0x4E5B: 0x9E9F, + 0x4E5C: 0x7460, + 0x4E5D: 0x5841, + 0x4E5E: 0x6D99, + 0x4E5F: 0x7D2F, + 0x4E60: 0x985E, + 0x4E61: 0x4EE4, + 0x4E62: 0x4F36, + 0x4E63: 0x4F8B, + 0x4E64: 0x51B7, + 0x4E65: 0x52B1, + 0x4E66: 0x5DBA, + 0x4E67: 0x601C, + 0x4E68: 0x73B2, + 0x4E69: 0x793C, + 0x4E6A: 0x82D3, + 0x4E6B: 0x9234, + 0x4E6C: 0x96B7, + 0x4E6D: 0x96F6, + 0x4E6E: 0x970A, + 0x4E6F: 0x9E97, + 0x4E70: 0x9F62, + 0x4E71: 0x66A6, + 0x4E72: 0x6B74, + 0x4E73: 0x5217, + 0x4E74: 0x52A3, + 0x4E75: 0x70C8, + 0x4E76: 0x88C2, + 0x4E77: 0x5EC9, + 0x4E78: 0x604B, + 0x4E79: 0x6190, + 0x4E7A: 0x6F23, + 0x4E7B: 0x7149, + 0x4E7C: 0x7C3E, + 0x4E7D: 0x7DF4, + 0x4E7E: 0x806F, + 0x4F21: 0x84EE, + 0x4F22: 0x9023, + 0x4F23: 0x932C, + 0x4F24: 0x5442, + 0x4F25: 0x9B6F, + 0x4F26: 0x6AD3, + 0x4F27: 0x7089, + 0x4F28: 0x8CC2, + 0x4F29: 0x8DEF, + 0x4F2A: 0x9732, + 0x4F2B: 0x52B4, + 0x4F2C: 0x5A41, + 0x4F2D: 0x5ECA, + 0x4F2E: 0x5F04, + 0x4F2F: 0x6717, + 0x4F30: 0x697C, + 0x4F31: 0x6994, + 0x4F32: 0x6D6A, + 0x4F33: 0x6F0F, + 0x4F34: 0x7262, + 0x4F35: 0x72FC, + 0x4F36: 0x7BED, + 0x4F37: 0x8001, + 0x4F38: 0x807E, + 0x4F39: 0x874B, + 0x4F3A: 0x90CE, + 0x4F3B: 0x516D, + 0x4F3C: 0x9E93, + 0x4F3D: 0x7984, + 0x4F3E: 0x808B, + 0x4F3F: 0x9332, + 0x4F40: 0x8AD6, + 0x4F41: 0x502D, + 0x4F42: 0x548C, + 0x4F43: 0x8A71, + 0x4F44: 0x6B6A, + 0x4F45: 0x8CC4, + 0x4F46: 0x8107, + 0x4F47: 0x60D1, + 0x4F48: 0x67A0, + 0x4F49: 0x9DF2, + 0x4F4A: 0x4E99, + 0x4F4B: 0x4E98, + 0x4F4C: 0x9C10, + 0x4F4D: 0x8A6B, + 0x4F4E: 0x85C1, + 0x4F4F: 0x8568, + 0x4F50: 0x6900, + 0x4F51: 0x6E7E, + 0x4F52: 0x7897, + 0x4F53: 0x8155, + 0x5021: 0x5F0C, + 0x5022: 0x4E10, + 0x5023: 0x4E15, + 0x5024: 0x4E2A, + 0x5025: 0x4E31, + 0x5026: 0x4E36, + 0x5027: 0x4E3C, + 0x5028: 0x4E3F, + 0x5029: 0x4E42, + 0x502A: 0x4E56, + 0x502B: 0x4E58, + 0x502C: 0x4E82, + 0x502D: 0x4E85, + 0x502E: 0x8C6B, + 0x502F: 0x4E8A, + 0x5030: 0x8212, + 0x5031: 0x5F0D, + 0x5032: 0x4E8E, + 0x5033: 0x4E9E, + 0x5034: 0x4E9F, + 0x5035: 0x4EA0, + 0x5036: 0x4EA2, + 0x5037: 0x4EB0, + 0x5038: 0x4EB3, + 0x5039: 0x4EB6, + 0x503A: 0x4ECE, + 0x503B: 0x4ECD, + 0x503C: 0x4EC4, + 0x503D: 0x4EC6, + 0x503E: 0x4EC2, + 0x503F: 0x4ED7, + 0x5040: 0x4EDE, + 0x5041: 0x4EED, + 0x5042: 0x4EDF, + 0x5043: 0x4EF7, + 0x5044: 0x4F09, + 0x5045: 0x4F5A, + 0x5046: 0x4F30, + 0x5047: 0x4F5B, + 0x5048: 0x4F5D, + 0x5049: 0x4F57, + 0x504A: 0x4F47, + 0x504B: 0x4F76, + 0x504C: 0x4F88, + 0x504D: 0x4F8F, + 0x504E: 0x4F98, + 0x504F: 0x4F7B, + 0x5050: 0x4F69, + 0x5051: 0x4F70, + 0x5052: 0x4F91, + 0x5053: 0x4F6F, + 0x5054: 0x4F86, + 0x5055: 0x4F96, + 0x5056: 0x5118, + 0x5057: 0x4FD4, + 0x5058: 0x4FDF, + 0x5059: 0x4FCE, + 0x505A: 0x4FD8, + 0x505B: 0x4FDB, + 0x505C: 0x4FD1, + 0x505D: 0x4FDA, + 0x505E: 0x4FD0, + 0x505F: 0x4FE4, + 0x5060: 0x4FE5, + 0x5061: 0x501A, + 0x5062: 0x5028, + 0x5063: 0x5014, + 0x5064: 0x502A, + 0x5065: 0x5025, + 0x5066: 0x5005, + 0x5067: 0x4F1C, + 0x5068: 0x4FF6, + 0x5069: 0x5021, + 0x506A: 0x5029, + 0x506B: 0x502C, + 0x506C: 0x4FFE, + 0x506D: 0x4FEF, + 0x506E: 0x5011, + 0x506F: 0x5006, + 0x5070: 0x5043, + 0x5071: 0x5047, + 0x5072: 0x6703, + 0x5073: 0x5055, + 0x5074: 0x5050, + 0x5075: 0x5048, + 0x5076: 0x505A, + 0x5077: 0x5056, + 0x5078: 0x506C, + 0x5079: 0x5078, + 0x507A: 0x5080, + 0x507B: 0x509A, + 0x507C: 0x5085, + 0x507D: 0x50B4, + 0x507E: 0x50B2, + 0x5121: 0x50C9, + 0x5122: 0x50CA, + 0x5123: 0x50B3, + 0x5124: 0x50C2, + 0x5125: 0x50D6, + 0x5126: 0x50DE, + 0x5127: 0x50E5, + 0x5128: 0x50ED, + 0x5129: 0x50E3, + 0x512A: 0x50EE, + 0x512B: 0x50F9, + 0x512C: 0x50F5, + 0x512D: 0x5109, + 0x512E: 0x5101, + 0x512F: 0x5102, + 0x5130: 0x5116, + 0x5131: 0x5115, + 0x5132: 0x5114, + 0x5133: 0x511A, + 0x5134: 0x5121, + 0x5135: 0x513A, + 0x5136: 0x5137, + 0x5137: 0x513C, + 0x5138: 0x513B, + 0x5139: 0x513F, + 0x513A: 0x5140, + 0x513B: 0x5152, + 0x513C: 0x514C, + 0x513D: 0x5154, + 0x513E: 0x5162, + 0x513F: 0x7AF8, + 0x5140: 0x5169, + 0x5141: 0x516A, + 0x5142: 0x516E, + 0x5143: 0x5180, + 0x5144: 0x5182, + 0x5145: 0x56D8, + 0x5146: 0x518C, + 0x5147: 0x5189, + 0x5148: 0x518F, + 0x5149: 0x5191, + 0x514A: 0x5193, + 0x514B: 0x5195, + 0x514C: 0x5196, + 0x514D: 0x51A4, + 0x514E: 0x51A6, + 0x514F: 0x51A2, + 0x5150: 0x51A9, + 0x5151: 0x51AA, + 0x5152: 0x51AB, + 0x5153: 0x51B3, + 0x5154: 0x51B1, + 0x5155: 0x51B2, + 0x5156: 0x51B0, + 0x5157: 0x51B5, + 0x5158: 0x51BD, + 0x5159: 0x51C5, + 0x515A: 0x51C9, + 0x515B: 0x51DB, + 0x515C: 0x51E0, + 0x515D: 0x8655, + 0x515E: 0x51E9, + 0x515F: 0x51ED, + 0x5160: 0x51F0, + 0x5161: 0x51F5, + 0x5162: 0x51FE, + 0x5163: 0x5204, + 0x5164: 0x520B, + 0x5165: 0x5214, + 0x5166: 0x520E, + 0x5167: 0x5227, + 0x5168: 0x522A, + 0x5169: 0x522E, + 0x516A: 0x5233, + 0x516B: 0x5239, + 0x516C: 0x524F, + 0x516D: 0x5244, + 0x516E: 0x524B, + 0x516F: 0x524C, + 0x5170: 0x525E, + 0x5171: 0x5254, + 0x5172: 0x526A, + 0x5173: 0x5274, + 0x5174: 0x5269, + 0x5175: 0x5273, + 0x5176: 0x527F, + 0x5177: 0x527D, + 0x5178: 0x528D, + 0x5179: 0x5294, + 0x517A: 0x5292, + 0x517B: 0x5271, + 0x517C: 0x5288, + 0x517D: 0x5291, + 0x517E: 0x8FA8, + 0x5221: 0x8FA7, + 0x5222: 0x52AC, + 0x5223: 0x52AD, + 0x5224: 0x52BC, + 0x5225: 0x52B5, + 0x5226: 0x52C1, + 0x5227: 0x52CD, + 0x5228: 0x52D7, + 0x5229: 0x52DE, + 0x522A: 0x52E3, + 0x522B: 0x52E6, + 0x522C: 0x98ED, + 0x522D: 0x52E0, + 0x522E: 0x52F3, + 0x522F: 0x52F5, + 0x5230: 0x52F8, + 0x5231: 0x52F9, + 0x5232: 0x5306, + 0x5233: 0x5308, + 0x5234: 0x7538, + 0x5235: 0x530D, + 0x5236: 0x5310, + 0x5237: 0x530F, + 0x5238: 0x5315, + 0x5239: 0x531A, + 0x523A: 0x5323, + 0x523B: 0x532F, + 0x523C: 0x5331, + 0x523D: 0x5333, + 0x523E: 0x5338, + 0x523F: 0x5340, + 0x5240: 0x5346, + 0x5241: 0x5345, + 0x5242: 0x4E17, + 0x5243: 0x5349, + 0x5244: 0x534D, + 0x5245: 0x51D6, + 0x5246: 0x535E, + 0x5247: 0x5369, + 0x5248: 0x536E, + 0x5249: 0x5918, + 0x524A: 0x537B, + 0x524B: 0x5377, + 0x524C: 0x5382, + 0x524D: 0x5396, + 0x524E: 0x53A0, + 0x524F: 0x53A6, + 0x5250: 0x53A5, + 0x5251: 0x53AE, + 0x5252: 0x53B0, + 0x5253: 0x53B6, + 0x5254: 0x53C3, + 0x5255: 0x7C12, + 0x5256: 0x96D9, + 0x5257: 0x53DF, + 0x5258: 0x66FC, + 0x5259: 0x71EE, + 0x525A: 0x53EE, + 0x525B: 0x53E8, + 0x525C: 0x53ED, + 0x525D: 0x53FA, + 0x525E: 0x5401, + 0x525F: 0x543D, + 0x5260: 0x5440, + 0x5261: 0x542C, + 0x5262: 0x542D, + 0x5263: 0x543C, + 0x5264: 0x542E, + 0x5265: 0x5436, + 0x5266: 0x5429, + 0x5267: 0x541D, + 0x5268: 0x544E, + 0x5269: 0x548F, + 0x526A: 0x5475, + 0x526B: 0x548E, + 0x526C: 0x545F, + 0x526D: 0x5471, + 0x526E: 0x5477, + 0x526F: 0x5470, + 0x5270: 0x5492, + 0x5271: 0x547B, + 0x5272: 0x5480, + 0x5273: 0x5476, + 0x5274: 0x5484, + 0x5275: 0x5490, + 0x5276: 0x5486, + 0x5277: 0x54C7, + 0x5278: 0x54A2, + 0x5279: 0x54B8, + 0x527A: 0x54A5, + 0x527B: 0x54AC, + 0x527C: 0x54C4, + 0x527D: 0x54C8, + 0x527E: 0x54A8, + 0x5321: 0x54AB, + 0x5322: 0x54C2, + 0x5323: 0x54A4, + 0x5324: 0x54BE, + 0x5325: 0x54BC, + 0x5326: 0x54D8, + 0x5327: 0x54E5, + 0x5328: 0x54E6, + 0x5329: 0x550F, + 0x532A: 0x5514, + 0x532B: 0x54FD, + 0x532C: 0x54EE, + 0x532D: 0x54ED, + 0x532E: 0x54FA, + 0x532F: 0x54E2, + 0x5330: 0x5539, + 0x5331: 0x5540, + 0x5332: 0x5563, + 0x5333: 0x554C, + 0x5334: 0x552E, + 0x5335: 0x555C, + 0x5336: 0x5545, + 0x5337: 0x5556, + 0x5338: 0x5557, + 0x5339: 0x5538, + 0x533A: 0x5533, + 0x533B: 0x555D, + 0x533C: 0x5599, + 0x533D: 0x5580, + 0x533E: 0x54AF, + 0x533F: 0x558A, + 0x5340: 0x559F, + 0x5341: 0x557B, + 0x5342: 0x557E, + 0x5343: 0x5598, + 0x5344: 0x559E, + 0x5345: 0x55AE, + 0x5346: 0x557C, + 0x5347: 0x5583, + 0x5348: 0x55A9, + 0x5349: 0x5587, + 0x534A: 0x55A8, + 0x534B: 0x55DA, + 0x534C: 0x55C5, + 0x534D: 0x55DF, + 0x534E: 0x55C4, + 0x534F: 0x55DC, + 0x5350: 0x55E4, + 0x5351: 0x55D4, + 0x5352: 0x5614, + 0x5353: 0x55F7, + 0x5354: 0x5616, + 0x5355: 0x55FE, + 0x5356: 0x55FD, + 0x5357: 0x561B, + 0x5358: 0x55F9, + 0x5359: 0x564E, + 0x535A: 0x5650, + 0x535B: 0x71DF, + 0x535C: 0x5634, + 0x535D: 0x5636, + 0x535E: 0x5632, + 0x535F: 0x5638, + 0x5360: 0x566B, + 0x5361: 0x5664, + 0x5362: 0x562F, + 0x5363: 0x566C, + 0x5364: 0x566A, + 0x5365: 0x5686, + 0x5366: 0x5680, + 0x5367: 0x568A, + 0x5368: 0x56A0, + 0x5369: 0x5694, + 0x536A: 0x568F, + 0x536B: 0x56A5, + 0x536C: 0x56AE, + 0x536D: 0x56B6, + 0x536E: 0x56B4, + 0x536F: 0x56C2, + 0x5370: 0x56BC, + 0x5371: 0x56C1, + 0x5372: 0x56C3, + 0x5373: 0x56C0, + 0x5374: 0x56C8, + 0x5375: 0x56CE, + 0x5376: 0x56D1, + 0x5377: 0x56D3, + 0x5378: 0x56D7, + 0x5379: 0x56EE, + 0x537A: 0x56F9, + 0x537B: 0x5700, + 0x537C: 0x56FF, + 0x537D: 0x5704, + 0x537E: 0x5709, + 0x5421: 0x5708, + 0x5422: 0x570B, + 0x5423: 0x570D, + 0x5424: 0x5713, + 0x5425: 0x5718, + 0x5426: 0x5716, + 0x5427: 0x55C7, + 0x5428: 0x571C, + 0x5429: 0x5726, + 0x542A: 0x5737, + 0x542B: 0x5738, + 0x542C: 0x574E, + 0x542D: 0x573B, + 0x542E: 0x5740, + 0x542F: 0x574F, + 0x5430: 0x5769, + 0x5431: 0x57C0, + 0x5432: 0x5788, + 0x5433: 0x5761, + 0x5434: 0x577F, + 0x5435: 0x5789, + 0x5436: 0x5793, + 0x5437: 0x57A0, + 0x5438: 0x57B3, + 0x5439: 0x57A4, + 0x543A: 0x57AA, + 0x543B: 0x57B0, + 0x543C: 0x57C3, + 0x543D: 0x57C6, + 0x543E: 0x57D4, + 0x543F: 0x57D2, + 0x5440: 0x57D3, + 0x5441: 0x580A, + 0x5442: 0x57D6, + 0x5443: 0x57E3, + 0x5444: 0x580B, + 0x5445: 0x5819, + 0x5446: 0x581D, + 0x5447: 0x5872, + 0x5448: 0x5821, + 0x5449: 0x5862, + 0x544A: 0x584B, + 0x544B: 0x5870, + 0x544C: 0x6BC0, + 0x544D: 0x5852, + 0x544E: 0x583D, + 0x544F: 0x5879, + 0x5450: 0x5885, + 0x5451: 0x58B9, + 0x5452: 0x589F, + 0x5453: 0x58AB, + 0x5454: 0x58BA, + 0x5455: 0x58DE, + 0x5456: 0x58BB, + 0x5457: 0x58B8, + 0x5458: 0x58AE, + 0x5459: 0x58C5, + 0x545A: 0x58D3, + 0x545B: 0x58D1, + 0x545C: 0x58D7, + 0x545D: 0x58D9, + 0x545E: 0x58D8, + 0x545F: 0x58E5, + 0x5460: 0x58DC, + 0x5461: 0x58E4, + 0x5462: 0x58DF, + 0x5463: 0x58EF, + 0x5464: 0x58FA, + 0x5465: 0x58F9, + 0x5466: 0x58FB, + 0x5467: 0x58FC, + 0x5468: 0x58FD, + 0x5469: 0x5902, + 0x546A: 0x590A, + 0x546B: 0x5910, + 0x546C: 0x591B, + 0x546D: 0x68A6, + 0x546E: 0x5925, + 0x546F: 0x592C, + 0x5470: 0x592D, + 0x5471: 0x5932, + 0x5472: 0x5938, + 0x5473: 0x593E, + 0x5474: 0x7AD2, + 0x5475: 0x5955, + 0x5476: 0x5950, + 0x5477: 0x594E, + 0x5478: 0x595A, + 0x5479: 0x5958, + 0x547A: 0x5962, + 0x547B: 0x5960, + 0x547C: 0x5967, + 0x547D: 0x596C, + 0x547E: 0x5969, + 0x5521: 0x5978, + 0x5522: 0x5981, + 0x5523: 0x599D, + 0x5524: 0x4F5E, + 0x5525: 0x4FAB, + 0x5526: 0x59A3, + 0x5527: 0x59B2, + 0x5528: 0x59C6, + 0x5529: 0x59E8, + 0x552A: 0x59DC, + 0x552B: 0x598D, + 0x552C: 0x59D9, + 0x552D: 0x59DA, + 0x552E: 0x5A25, + 0x552F: 0x5A1F, + 0x5530: 0x5A11, + 0x5531: 0x5A1C, + 0x5532: 0x5A09, + 0x5533: 0x5A1A, + 0x5534: 0x5A40, + 0x5535: 0x5A6C, + 0x5536: 0x5A49, + 0x5537: 0x5A35, + 0x5538: 0x5A36, + 0x5539: 0x5A62, + 0x553A: 0x5A6A, + 0x553B: 0x5A9A, + 0x553C: 0x5ABC, + 0x553D: 0x5ABE, + 0x553E: 0x5ACB, + 0x553F: 0x5AC2, + 0x5540: 0x5ABD, + 0x5541: 0x5AE3, + 0x5542: 0x5AD7, + 0x5543: 0x5AE6, + 0x5544: 0x5AE9, + 0x5545: 0x5AD6, + 0x5546: 0x5AFA, + 0x5547: 0x5AFB, + 0x5548: 0x5B0C, + 0x5549: 0x5B0B, + 0x554A: 0x5B16, + 0x554B: 0x5B32, + 0x554C: 0x5AD0, + 0x554D: 0x5B2A, + 0x554E: 0x5B36, + 0x554F: 0x5B3E, + 0x5550: 0x5B43, + 0x5551: 0x5B45, + 0x5552: 0x5B40, + 0x5553: 0x5B51, + 0x5554: 0x5B55, + 0x5555: 0x5B5A, + 0x5556: 0x5B5B, + 0x5557: 0x5B65, + 0x5558: 0x5B69, + 0x5559: 0x5B70, + 0x555A: 0x5B73, + 0x555B: 0x5B75, + 0x555C: 0x5B78, + 0x555D: 0x6588, + 0x555E: 0x5B7A, + 0x555F: 0x5B80, + 0x5560: 0x5B83, + 0x5561: 0x5BA6, + 0x5562: 0x5BB8, + 0x5563: 0x5BC3, + 0x5564: 0x5BC7, + 0x5565: 0x5BC9, + 0x5566: 0x5BD4, + 0x5567: 0x5BD0, + 0x5568: 0x5BE4, + 0x5569: 0x5BE6, + 0x556A: 0x5BE2, + 0x556B: 0x5BDE, + 0x556C: 0x5BE5, + 0x556D: 0x5BEB, + 0x556E: 0x5BF0, + 0x556F: 0x5BF6, + 0x5570: 0x5BF3, + 0x5571: 0x5C05, + 0x5572: 0x5C07, + 0x5573: 0x5C08, + 0x5574: 0x5C0D, + 0x5575: 0x5C13, + 0x5576: 0x5C20, + 0x5577: 0x5C22, + 0x5578: 0x5C28, + 0x5579: 0x5C38, + 0x557A: 0x5C39, + 0x557B: 0x5C41, + 0x557C: 0x5C46, + 0x557D: 0x5C4E, + 0x557E: 0x5C53, + 0x5621: 0x5C50, + 0x5622: 0x5C4F, + 0x5623: 0x5B71, + 0x5624: 0x5C6C, + 0x5625: 0x5C6E, + 0x5626: 0x4E62, + 0x5627: 0x5C76, + 0x5628: 0x5C79, + 0x5629: 0x5C8C, + 0x562A: 0x5C91, + 0x562B: 0x5C94, + 0x562C: 0x599B, + 0x562D: 0x5CAB, + 0x562E: 0x5CBB, + 0x562F: 0x5CB6, + 0x5630: 0x5CBC, + 0x5631: 0x5CB7, + 0x5632: 0x5CC5, + 0x5633: 0x5CBE, + 0x5634: 0x5CC7, + 0x5635: 0x5CD9, + 0x5636: 0x5CE9, + 0x5637: 0x5CFD, + 0x5638: 0x5CFA, + 0x5639: 0x5CED, + 0x563A: 0x5D8C, + 0x563B: 0x5CEA, + 0x563C: 0x5D0B, + 0x563D: 0x5D15, + 0x563E: 0x5D17, + 0x563F: 0x5D5C, + 0x5640: 0x5D1F, + 0x5641: 0x5D1B, + 0x5642: 0x5D11, + 0x5643: 0x5D14, + 0x5644: 0x5D22, + 0x5645: 0x5D1A, + 0x5646: 0x5D19, + 0x5647: 0x5D18, + 0x5648: 0x5D4C, + 0x5649: 0x5D52, + 0x564A: 0x5D4E, + 0x564B: 0x5D4B, + 0x564C: 0x5D6C, + 0x564D: 0x5D73, + 0x564E: 0x5D76, + 0x564F: 0x5D87, + 0x5650: 0x5D84, + 0x5651: 0x5D82, + 0x5652: 0x5DA2, + 0x5653: 0x5D9D, + 0x5654: 0x5DAC, + 0x5655: 0x5DAE, + 0x5656: 0x5DBD, + 0x5657: 0x5D90, + 0x5658: 0x5DB7, + 0x5659: 0x5DBC, + 0x565A: 0x5DC9, + 0x565B: 0x5DCD, + 0x565C: 0x5DD3, + 0x565D: 0x5DD2, + 0x565E: 0x5DD6, + 0x565F: 0x5DDB, + 0x5660: 0x5DEB, + 0x5661: 0x5DF2, + 0x5662: 0x5DF5, + 0x5663: 0x5E0B, + 0x5664: 0x5E1A, + 0x5665: 0x5E19, + 0x5666: 0x5E11, + 0x5667: 0x5E1B, + 0x5668: 0x5E36, + 0x5669: 0x5E37, + 0x566A: 0x5E44, + 0x566B: 0x5E43, + 0x566C: 0x5E40, + 0x566D: 0x5E4E, + 0x566E: 0x5E57, + 0x566F: 0x5E54, + 0x5670: 0x5E5F, + 0x5671: 0x5E62, + 0x5672: 0x5E64, + 0x5673: 0x5E47, + 0x5674: 0x5E75, + 0x5675: 0x5E76, + 0x5676: 0x5E7A, + 0x5677: 0x9EBC, + 0x5678: 0x5E7F, + 0x5679: 0x5EA0, + 0x567A: 0x5EC1, + 0x567B: 0x5EC2, + 0x567C: 0x5EC8, + 0x567D: 0x5ED0, + 0x567E: 0x5ECF, + 0x5721: 0x5ED6, + 0x5722: 0x5EE3, + 0x5723: 0x5EDD, + 0x5724: 0x5EDA, + 0x5725: 0x5EDB, + 0x5726: 0x5EE2, + 0x5727: 0x5EE1, + 0x5728: 0x5EE8, + 0x5729: 0x5EE9, + 0x572A: 0x5EEC, + 0x572B: 0x5EF1, + 0x572C: 0x5EF3, + 0x572D: 0x5EF0, + 0x572E: 0x5EF4, + 0x572F: 0x5EF8, + 0x5730: 0x5EFE, + 0x5731: 0x5F03, + 0x5732: 0x5F09, + 0x5733: 0x5F5D, + 0x5734: 0x5F5C, + 0x5735: 0x5F0B, + 0x5736: 0x5F11, + 0x5737: 0x5F16, + 0x5738: 0x5F29, + 0x5739: 0x5F2D, + 0x573A: 0x5F38, + 0x573B: 0x5F41, + 0x573C: 0x5F48, + 0x573D: 0x5F4C, + 0x573E: 0x5F4E, + 0x573F: 0x5F2F, + 0x5740: 0x5F51, + 0x5741: 0x5F56, + 0x5742: 0x5F57, + 0x5743: 0x5F59, + 0x5744: 0x5F61, + 0x5745: 0x5F6D, + 0x5746: 0x5F73, + 0x5747: 0x5F77, + 0x5748: 0x5F83, + 0x5749: 0x5F82, + 0x574A: 0x5F7F, + 0x574B: 0x5F8A, + 0x574C: 0x5F88, + 0x574D: 0x5F91, + 0x574E: 0x5F87, + 0x574F: 0x5F9E, + 0x5750: 0x5F99, + 0x5751: 0x5F98, + 0x5752: 0x5FA0, + 0x5753: 0x5FA8, + 0x5754: 0x5FAD, + 0x5755: 0x5FBC, + 0x5756: 0x5FD6, + 0x5757: 0x5FFB, + 0x5758: 0x5FE4, + 0x5759: 0x5FF8, + 0x575A: 0x5FF1, + 0x575B: 0x5FDD, + 0x575C: 0x60B3, + 0x575D: 0x5FFF, + 0x575E: 0x6021, + 0x575F: 0x6060, + 0x5760: 0x6019, + 0x5761: 0x6010, + 0x5762: 0x6029, + 0x5763: 0x600E, + 0x5764: 0x6031, + 0x5765: 0x601B, + 0x5766: 0x6015, + 0x5767: 0x602B, + 0x5768: 0x6026, + 0x5769: 0x600F, + 0x576A: 0x603A, + 0x576B: 0x605A, + 0x576C: 0x6041, + 0x576D: 0x606A, + 0x576E: 0x6077, + 0x576F: 0x605F, + 0x5770: 0x604A, + 0x5771: 0x6046, + 0x5772: 0x604D, + 0x5773: 0x6063, + 0x5774: 0x6043, + 0x5775: 0x6064, + 0x5776: 0x6042, + 0x5777: 0x606C, + 0x5778: 0x606B, + 0x5779: 0x6059, + 0x577A: 0x6081, + 0x577B: 0x608D, + 0x577C: 0x60E7, + 0x577D: 0x6083, + 0x577E: 0x609A, + 0x5821: 0x6084, + 0x5822: 0x609B, + 0x5823: 0x6096, + 0x5824: 0x6097, + 0x5825: 0x6092, + 0x5826: 0x60A7, + 0x5827: 0x608B, + 0x5828: 0x60E1, + 0x5829: 0x60B8, + 0x582A: 0x60E0, + 0x582B: 0x60D3, + 0x582C: 0x60B4, + 0x582D: 0x5FF0, + 0x582E: 0x60BD, + 0x582F: 0x60C6, + 0x5830: 0x60B5, + 0x5831: 0x60D8, + 0x5832: 0x614D, + 0x5833: 0x6115, + 0x5834: 0x6106, + 0x5835: 0x60F6, + 0x5836: 0x60F7, + 0x5837: 0x6100, + 0x5838: 0x60F4, + 0x5839: 0x60FA, + 0x583A: 0x6103, + 0x583B: 0x6121, + 0x583C: 0x60FB, + 0x583D: 0x60F1, + 0x583E: 0x610D, + 0x583F: 0x610E, + 0x5840: 0x6147, + 0x5841: 0x613E, + 0x5842: 0x6128, + 0x5843: 0x6127, + 0x5844: 0x614A, + 0x5845: 0x613F, + 0x5846: 0x613C, + 0x5847: 0x612C, + 0x5848: 0x6134, + 0x5849: 0x613D, + 0x584A: 0x6142, + 0x584B: 0x6144, + 0x584C: 0x6173, + 0x584D: 0x6177, + 0x584E: 0x6158, + 0x584F: 0x6159, + 0x5850: 0x615A, + 0x5851: 0x616B, + 0x5852: 0x6174, + 0x5853: 0x616F, + 0x5854: 0x6165, + 0x5855: 0x6171, + 0x5856: 0x615F, + 0x5857: 0x615D, + 0x5858: 0x6153, + 0x5859: 0x6175, + 0x585A: 0x6199, + 0x585B: 0x6196, + 0x585C: 0x6187, + 0x585D: 0x61AC, + 0x585E: 0x6194, + 0x585F: 0x619A, + 0x5860: 0x618A, + 0x5861: 0x6191, + 0x5862: 0x61AB, + 0x5863: 0x61AE, + 0x5864: 0x61CC, + 0x5865: 0x61CA, + 0x5866: 0x61C9, + 0x5867: 0x61F7, + 0x5868: 0x61C8, + 0x5869: 0x61C3, + 0x586A: 0x61C6, + 0x586B: 0x61BA, + 0x586C: 0x61CB, + 0x586D: 0x7F79, + 0x586E: 0x61CD, + 0x586F: 0x61E6, + 0x5870: 0x61E3, + 0x5871: 0x61F6, + 0x5872: 0x61FA, + 0x5873: 0x61F4, + 0x5874: 0x61FF, + 0x5875: 0x61FD, + 0x5876: 0x61FC, + 0x5877: 0x61FE, + 0x5878: 0x6200, + 0x5879: 0x6208, + 0x587A: 0x6209, + 0x587B: 0x620D, + 0x587C: 0x620C, + 0x587D: 0x6214, + 0x587E: 0x621B, + 0x5921: 0x621E, + 0x5922: 0x6221, + 0x5923: 0x622A, + 0x5924: 0x622E, + 0x5925: 0x6230, + 0x5926: 0x6232, + 0x5927: 0x6233, + 0x5928: 0x6241, + 0x5929: 0x624E, + 0x592A: 0x625E, + 0x592B: 0x6263, + 0x592C: 0x625B, + 0x592D: 0x6260, + 0x592E: 0x6268, + 0x592F: 0x627C, + 0x5930: 0x6282, + 0x5931: 0x6289, + 0x5932: 0x627E, + 0x5933: 0x6292, + 0x5934: 0x6293, + 0x5935: 0x6296, + 0x5936: 0x62D4, + 0x5937: 0x6283, + 0x5938: 0x6294, + 0x5939: 0x62D7, + 0x593A: 0x62D1, + 0x593B: 0x62BB, + 0x593C: 0x62CF, + 0x593D: 0x62FF, + 0x593E: 0x62C6, + 0x593F: 0x64D4, + 0x5940: 0x62C8, + 0x5941: 0x62DC, + 0x5942: 0x62CC, + 0x5943: 0x62CA, + 0x5944: 0x62C2, + 0x5945: 0x62C7, + 0x5946: 0x629B, + 0x5947: 0x62C9, + 0x5948: 0x630C, + 0x5949: 0x62EE, + 0x594A: 0x62F1, + 0x594B: 0x6327, + 0x594C: 0x6302, + 0x594D: 0x6308, + 0x594E: 0x62EF, + 0x594F: 0x62F5, + 0x5950: 0x6350, + 0x5951: 0x633E, + 0x5952: 0x634D, + 0x5953: 0x641C, + 0x5954: 0x634F, + 0x5955: 0x6396, + 0x5956: 0x638E, + 0x5957: 0x6380, + 0x5958: 0x63AB, + 0x5959: 0x6376, + 0x595A: 0x63A3, + 0x595B: 0x638F, + 0x595C: 0x6389, + 0x595D: 0x639F, + 0x595E: 0x63B5, + 0x595F: 0x636B, + 0x5960: 0x6369, + 0x5961: 0x63BE, + 0x5962: 0x63E9, + 0x5963: 0x63C0, + 0x5964: 0x63C6, + 0x5965: 0x63E3, + 0x5966: 0x63C9, + 0x5967: 0x63D2, + 0x5968: 0x63F6, + 0x5969: 0x63C4, + 0x596A: 0x6416, + 0x596B: 0x6434, + 0x596C: 0x6406, + 0x596D: 0x6413, + 0x596E: 0x6426, + 0x596F: 0x6436, + 0x5970: 0x651D, + 0x5971: 0x6417, + 0x5972: 0x6428, + 0x5973: 0x640F, + 0x5974: 0x6467, + 0x5975: 0x646F, + 0x5976: 0x6476, + 0x5977: 0x644E, + 0x5978: 0x652A, + 0x5979: 0x6495, + 0x597A: 0x6493, + 0x597B: 0x64A5, + 0x597C: 0x64A9, + 0x597D: 0x6488, + 0x597E: 0x64BC, + 0x5A21: 0x64DA, + 0x5A22: 0x64D2, + 0x5A23: 0x64C5, + 0x5A24: 0x64C7, + 0x5A25: 0x64BB, + 0x5A26: 0x64D8, + 0x5A27: 0x64C2, + 0x5A28: 0x64F1, + 0x5A29: 0x64E7, + 0x5A2A: 0x8209, + 0x5A2B: 0x64E0, + 0x5A2C: 0x64E1, + 0x5A2D: 0x62AC, + 0x5A2E: 0x64E3, + 0x5A2F: 0x64EF, + 0x5A30: 0x652C, + 0x5A31: 0x64F6, + 0x5A32: 0x64F4, + 0x5A33: 0x64F2, + 0x5A34: 0x64FA, + 0x5A35: 0x6500, + 0x5A36: 0x64FD, + 0x5A37: 0x6518, + 0x5A38: 0x651C, + 0x5A39: 0x6505, + 0x5A3A: 0x6524, + 0x5A3B: 0x6523, + 0x5A3C: 0x652B, + 0x5A3D: 0x6534, + 0x5A3E: 0x6535, + 0x5A3F: 0x6537, + 0x5A40: 0x6536, + 0x5A41: 0x6538, + 0x5A42: 0x754B, + 0x5A43: 0x6548, + 0x5A44: 0x6556, + 0x5A45: 0x6555, + 0x5A46: 0x654D, + 0x5A47: 0x6558, + 0x5A48: 0x655E, + 0x5A49: 0x655D, + 0x5A4A: 0x6572, + 0x5A4B: 0x6578, + 0x5A4C: 0x6582, + 0x5A4D: 0x6583, + 0x5A4E: 0x8B8A, + 0x5A4F: 0x659B, + 0x5A50: 0x659F, + 0x5A51: 0x65AB, + 0x5A52: 0x65B7, + 0x5A53: 0x65C3, + 0x5A54: 0x65C6, + 0x5A55: 0x65C1, + 0x5A56: 0x65C4, + 0x5A57: 0x65CC, + 0x5A58: 0x65D2, + 0x5A59: 0x65DB, + 0x5A5A: 0x65D9, + 0x5A5B: 0x65E0, + 0x5A5C: 0x65E1, + 0x5A5D: 0x65F1, + 0x5A5E: 0x6772, + 0x5A5F: 0x660A, + 0x5A60: 0x6603, + 0x5A61: 0x65FB, + 0x5A62: 0x6773, + 0x5A63: 0x6635, + 0x5A64: 0x6636, + 0x5A65: 0x6634, + 0x5A66: 0x661C, + 0x5A67: 0x664F, + 0x5A68: 0x6644, + 0x5A69: 0x6649, + 0x5A6A: 0x6641, + 0x5A6B: 0x665E, + 0x5A6C: 0x665D, + 0x5A6D: 0x6664, + 0x5A6E: 0x6667, + 0x5A6F: 0x6668, + 0x5A70: 0x665F, + 0x5A71: 0x6662, + 0x5A72: 0x6670, + 0x5A73: 0x6683, + 0x5A74: 0x6688, + 0x5A75: 0x668E, + 0x5A76: 0x6689, + 0x5A77: 0x6684, + 0x5A78: 0x6698, + 0x5A79: 0x669D, + 0x5A7A: 0x66C1, + 0x5A7B: 0x66B9, + 0x5A7C: 0x66C9, + 0x5A7D: 0x66BE, + 0x5A7E: 0x66BC, + 0x5B21: 0x66C4, + 0x5B22: 0x66B8, + 0x5B23: 0x66D6, + 0x5B24: 0x66DA, + 0x5B25: 0x66E0, + 0x5B26: 0x663F, + 0x5B27: 0x66E6, + 0x5B28: 0x66E9, + 0x5B29: 0x66F0, + 0x5B2A: 0x66F5, + 0x5B2B: 0x66F7, + 0x5B2C: 0x670F, + 0x5B2D: 0x6716, + 0x5B2E: 0x671E, + 0x5B2F: 0x6726, + 0x5B30: 0x6727, + 0x5B31: 0x9738, + 0x5B32: 0x672E, + 0x5B33: 0x673F, + 0x5B34: 0x6736, + 0x5B35: 0x6741, + 0x5B36: 0x6738, + 0x5B37: 0x6737, + 0x5B38: 0x6746, + 0x5B39: 0x675E, + 0x5B3A: 0x6760, + 0x5B3B: 0x6759, + 0x5B3C: 0x6763, + 0x5B3D: 0x6764, + 0x5B3E: 0x6789, + 0x5B3F: 0x6770, + 0x5B40: 0x67A9, + 0x5B41: 0x677C, + 0x5B42: 0x676A, + 0x5B43: 0x678C, + 0x5B44: 0x678B, + 0x5B45: 0x67A6, + 0x5B46: 0x67A1, + 0x5B47: 0x6785, + 0x5B48: 0x67B7, + 0x5B49: 0x67EF, + 0x5B4A: 0x67B4, + 0x5B4B: 0x67EC, + 0x5B4C: 0x67B3, + 0x5B4D: 0x67E9, + 0x5B4E: 0x67B8, + 0x5B4F: 0x67E4, + 0x5B50: 0x67DE, + 0x5B51: 0x67DD, + 0x5B52: 0x67E2, + 0x5B53: 0x67EE, + 0x5B54: 0x67B9, + 0x5B55: 0x67CE, + 0x5B56: 0x67C6, + 0x5B57: 0x67E7, + 0x5B58: 0x6A9C, + 0x5B59: 0x681E, + 0x5B5A: 0x6846, + 0x5B5B: 0x6829, + 0x5B5C: 0x6840, + 0x5B5D: 0x684D, + 0x5B5E: 0x6832, + 0x5B5F: 0x684E, + 0x5B60: 0x68B3, + 0x5B61: 0x682B, + 0x5B62: 0x6859, + 0x5B63: 0x6863, + 0x5B64: 0x6877, + 0x5B65: 0x687F, + 0x5B66: 0x689F, + 0x5B67: 0x688F, + 0x5B68: 0x68AD, + 0x5B69: 0x6894, + 0x5B6A: 0x689D, + 0x5B6B: 0x689B, + 0x5B6C: 0x6883, + 0x5B6D: 0x6AAE, + 0x5B6E: 0x68B9, + 0x5B6F: 0x6874, + 0x5B70: 0x68B5, + 0x5B71: 0x68A0, + 0x5B72: 0x68BA, + 0x5B73: 0x690F, + 0x5B74: 0x688D, + 0x5B75: 0x687E, + 0x5B76: 0x6901, + 0x5B77: 0x68CA, + 0x5B78: 0x6908, + 0x5B79: 0x68D8, + 0x5B7A: 0x6922, + 0x5B7B: 0x6926, + 0x5B7C: 0x68E1, + 0x5B7D: 0x690C, + 0x5B7E: 0x68CD, + 0x5C21: 0x68D4, + 0x5C22: 0x68E7, + 0x5C23: 0x68D5, + 0x5C24: 0x6936, + 0x5C25: 0x6912, + 0x5C26: 0x6904, + 0x5C27: 0x68D7, + 0x5C28: 0x68E3, + 0x5C29: 0x6925, + 0x5C2A: 0x68F9, + 0x5C2B: 0x68E0, + 0x5C2C: 0x68EF, + 0x5C2D: 0x6928, + 0x5C2E: 0x692A, + 0x5C2F: 0x691A, + 0x5C30: 0x6923, + 0x5C31: 0x6921, + 0x5C32: 0x68C6, + 0x5C33: 0x6979, + 0x5C34: 0x6977, + 0x5C35: 0x695C, + 0x5C36: 0x6978, + 0x5C37: 0x696B, + 0x5C38: 0x6954, + 0x5C39: 0x697E, + 0x5C3A: 0x696E, + 0x5C3B: 0x6939, + 0x5C3C: 0x6974, + 0x5C3D: 0x693D, + 0x5C3E: 0x6959, + 0x5C3F: 0x6930, + 0x5C40: 0x6961, + 0x5C41: 0x695E, + 0x5C42: 0x695D, + 0x5C43: 0x6981, + 0x5C44: 0x696A, + 0x5C45: 0x69B2, + 0x5C46: 0x69AE, + 0x5C47: 0x69D0, + 0x5C48: 0x69BF, + 0x5C49: 0x69C1, + 0x5C4A: 0x69D3, + 0x5C4B: 0x69BE, + 0x5C4C: 0x69CE, + 0x5C4D: 0x5BE8, + 0x5C4E: 0x69CA, + 0x5C4F: 0x69DD, + 0x5C50: 0x69BB, + 0x5C51: 0x69C3, + 0x5C52: 0x69A7, + 0x5C53: 0x6A2E, + 0x5C54: 0x6991, + 0x5C55: 0x69A0, + 0x5C56: 0x699C, + 0x5C57: 0x6995, + 0x5C58: 0x69B4, + 0x5C59: 0x69DE, + 0x5C5A: 0x69E8, + 0x5C5B: 0x6A02, + 0x5C5C: 0x6A1B, + 0x5C5D: 0x69FF, + 0x5C5E: 0x6B0A, + 0x5C5F: 0x69F9, + 0x5C60: 0x69F2, + 0x5C61: 0x69E7, + 0x5C62: 0x6A05, + 0x5C63: 0x69B1, + 0x5C64: 0x6A1E, + 0x5C65: 0x69ED, + 0x5C66: 0x6A14, + 0x5C67: 0x69EB, + 0x5C68: 0x6A0A, + 0x5C69: 0x6A12, + 0x5C6A: 0x6AC1, + 0x5C6B: 0x6A23, + 0x5C6C: 0x6A13, + 0x5C6D: 0x6A44, + 0x5C6E: 0x6A0C, + 0x5C6F: 0x6A72, + 0x5C70: 0x6A36, + 0x5C71: 0x6A78, + 0x5C72: 0x6A47, + 0x5C73: 0x6A62, + 0x5C74: 0x6A59, + 0x5C75: 0x6A66, + 0x5C76: 0x6A48, + 0x5C77: 0x6A38, + 0x5C78: 0x6A22, + 0x5C79: 0x6A90, + 0x5C7A: 0x6A8D, + 0x5C7B: 0x6AA0, + 0x5C7C: 0x6A84, + 0x5C7D: 0x6AA2, + 0x5C7E: 0x6AA3, + 0x5D21: 0x6A97, + 0x5D22: 0x8617, + 0x5D23: 0x6ABB, + 0x5D24: 0x6AC3, + 0x5D25: 0x6AC2, + 0x5D26: 0x6AB8, + 0x5D27: 0x6AB3, + 0x5D28: 0x6AAC, + 0x5D29: 0x6ADE, + 0x5D2A: 0x6AD1, + 0x5D2B: 0x6ADF, + 0x5D2C: 0x6AAA, + 0x5D2D: 0x6ADA, + 0x5D2E: 0x6AEA, + 0x5D2F: 0x6AFB, + 0x5D30: 0x6B05, + 0x5D31: 0x8616, + 0x5D32: 0x6AFA, + 0x5D33: 0x6B12, + 0x5D34: 0x6B16, + 0x5D35: 0x9B31, + 0x5D36: 0x6B1F, + 0x5D37: 0x6B38, + 0x5D38: 0x6B37, + 0x5D39: 0x76DC, + 0x5D3A: 0x6B39, + 0x5D3B: 0x98EE, + 0x5D3C: 0x6B47, + 0x5D3D: 0x6B43, + 0x5D3E: 0x6B49, + 0x5D3F: 0x6B50, + 0x5D40: 0x6B59, + 0x5D41: 0x6B54, + 0x5D42: 0x6B5B, + 0x5D43: 0x6B5F, + 0x5D44: 0x6B61, + 0x5D45: 0x6B78, + 0x5D46: 0x6B79, + 0x5D47: 0x6B7F, + 0x5D48: 0x6B80, + 0x5D49: 0x6B84, + 0x5D4A: 0x6B83, + 0x5D4B: 0x6B8D, + 0x5D4C: 0x6B98, + 0x5D4D: 0x6B95, + 0x5D4E: 0x6B9E, + 0x5D4F: 0x6BA4, + 0x5D50: 0x6BAA, + 0x5D51: 0x6BAB, + 0x5D52: 0x6BAF, + 0x5D53: 0x6BB2, + 0x5D54: 0x6BB1, + 0x5D55: 0x6BB3, + 0x5D56: 0x6BB7, + 0x5D57: 0x6BBC, + 0x5D58: 0x6BC6, + 0x5D59: 0x6BCB, + 0x5D5A: 0x6BD3, + 0x5D5B: 0x6BDF, + 0x5D5C: 0x6BEC, + 0x5D5D: 0x6BEB, + 0x5D5E: 0x6BF3, + 0x5D5F: 0x6BEF, + 0x5D60: 0x9EBE, + 0x5D61: 0x6C08, + 0x5D62: 0x6C13, + 0x5D63: 0x6C14, + 0x5D64: 0x6C1B, + 0x5D65: 0x6C24, + 0x5D66: 0x6C23, + 0x5D67: 0x6C5E, + 0x5D68: 0x6C55, + 0x5D69: 0x6C62, + 0x5D6A: 0x6C6A, + 0x5D6B: 0x6C82, + 0x5D6C: 0x6C8D, + 0x5D6D: 0x6C9A, + 0x5D6E: 0x6C81, + 0x5D6F: 0x6C9B, + 0x5D70: 0x6C7E, + 0x5D71: 0x6C68, + 0x5D72: 0x6C73, + 0x5D73: 0x6C92, + 0x5D74: 0x6C90, + 0x5D75: 0x6CC4, + 0x5D76: 0x6CF1, + 0x5D77: 0x6CD3, + 0x5D78: 0x6CBD, + 0x5D79: 0x6CD7, + 0x5D7A: 0x6CC5, + 0x5D7B: 0x6CDD, + 0x5D7C: 0x6CAE, + 0x5D7D: 0x6CB1, + 0x5D7E: 0x6CBE, + 0x5E21: 0x6CBA, + 0x5E22: 0x6CDB, + 0x5E23: 0x6CEF, + 0x5E24: 0x6CD9, + 0x5E25: 0x6CEA, + 0x5E26: 0x6D1F, + 0x5E27: 0x884D, + 0x5E28: 0x6D36, + 0x5E29: 0x6D2B, + 0x5E2A: 0x6D3D, + 0x5E2B: 0x6D38, + 0x5E2C: 0x6D19, + 0x5E2D: 0x6D35, + 0x5E2E: 0x6D33, + 0x5E2F: 0x6D12, + 0x5E30: 0x6D0C, + 0x5E31: 0x6D63, + 0x5E32: 0x6D93, + 0x5E33: 0x6D64, + 0x5E34: 0x6D5A, + 0x5E35: 0x6D79, + 0x5E36: 0x6D59, + 0x5E37: 0x6D8E, + 0x5E38: 0x6D95, + 0x5E39: 0x6FE4, + 0x5E3A: 0x6D85, + 0x5E3B: 0x6DF9, + 0x5E3C: 0x6E15, + 0x5E3D: 0x6E0A, + 0x5E3E: 0x6DB5, + 0x5E3F: 0x6DC7, + 0x5E40: 0x6DE6, + 0x5E41: 0x6DB8, + 0x5E42: 0x6DC6, + 0x5E43: 0x6DEC, + 0x5E44: 0x6DDE, + 0x5E45: 0x6DCC, + 0x5E46: 0x6DE8, + 0x5E47: 0x6DD2, + 0x5E48: 0x6DC5, + 0x5E49: 0x6DFA, + 0x5E4A: 0x6DD9, + 0x5E4B: 0x6DE4, + 0x5E4C: 0x6DD5, + 0x5E4D: 0x6DEA, + 0x5E4E: 0x6DEE, + 0x5E4F: 0x6E2D, + 0x5E50: 0x6E6E, + 0x5E51: 0x6E2E, + 0x5E52: 0x6E19, + 0x5E53: 0x6E72, + 0x5E54: 0x6E5F, + 0x5E55: 0x6E3E, + 0x5E56: 0x6E23, + 0x5E57: 0x6E6B, + 0x5E58: 0x6E2B, + 0x5E59: 0x6E76, + 0x5E5A: 0x6E4D, + 0x5E5B: 0x6E1F, + 0x5E5C: 0x6E43, + 0x5E5D: 0x6E3A, + 0x5E5E: 0x6E4E, + 0x5E5F: 0x6E24, + 0x5E60: 0x6EFF, + 0x5E61: 0x6E1D, + 0x5E62: 0x6E38, + 0x5E63: 0x6E82, + 0x5E64: 0x6EAA, + 0x5E65: 0x6E98, + 0x5E66: 0x6EC9, + 0x5E67: 0x6EB7, + 0x5E68: 0x6ED3, + 0x5E69: 0x6EBD, + 0x5E6A: 0x6EAF, + 0x5E6B: 0x6EC4, + 0x5E6C: 0x6EB2, + 0x5E6D: 0x6ED4, + 0x5E6E: 0x6ED5, + 0x5E6F: 0x6E8F, + 0x5E70: 0x6EA5, + 0x5E71: 0x6EC2, + 0x5E72: 0x6E9F, + 0x5E73: 0x6F41, + 0x5E74: 0x6F11, + 0x5E75: 0x704C, + 0x5E76: 0x6EEC, + 0x5E77: 0x6EF8, + 0x5E78: 0x6EFE, + 0x5E79: 0x6F3F, + 0x5E7A: 0x6EF2, + 0x5E7B: 0x6F31, + 0x5E7C: 0x6EEF, + 0x5E7D: 0x6F32, + 0x5E7E: 0x6ECC, + 0x5F21: 0x6F3E, + 0x5F22: 0x6F13, + 0x5F23: 0x6EF7, + 0x5F24: 0x6F86, + 0x5F25: 0x6F7A, + 0x5F26: 0x6F78, + 0x5F27: 0x6F81, + 0x5F28: 0x6F80, + 0x5F29: 0x6F6F, + 0x5F2A: 0x6F5B, + 0x5F2B: 0x6FF3, + 0x5F2C: 0x6F6D, + 0x5F2D: 0x6F82, + 0x5F2E: 0x6F7C, + 0x5F2F: 0x6F58, + 0x5F30: 0x6F8E, + 0x5F31: 0x6F91, + 0x5F32: 0x6FC2, + 0x5F33: 0x6F66, + 0x5F34: 0x6FB3, + 0x5F35: 0x6FA3, + 0x5F36: 0x6FA1, + 0x5F37: 0x6FA4, + 0x5F38: 0x6FB9, + 0x5F39: 0x6FC6, + 0x5F3A: 0x6FAA, + 0x5F3B: 0x6FDF, + 0x5F3C: 0x6FD5, + 0x5F3D: 0x6FEC, + 0x5F3E: 0x6FD4, + 0x5F3F: 0x6FD8, + 0x5F40: 0x6FF1, + 0x5F41: 0x6FEE, + 0x5F42: 0x6FDB, + 0x5F43: 0x7009, + 0x5F44: 0x700B, + 0x5F45: 0x6FFA, + 0x5F46: 0x7011, + 0x5F47: 0x7001, + 0x5F48: 0x700F, + 0x5F49: 0x6FFE, + 0x5F4A: 0x701B, + 0x5F4B: 0x701A, + 0x5F4C: 0x6F74, + 0x5F4D: 0x701D, + 0x5F4E: 0x7018, + 0x5F4F: 0x701F, + 0x5F50: 0x7030, + 0x5F51: 0x703E, + 0x5F52: 0x7032, + 0x5F53: 0x7051, + 0x5F54: 0x7063, + 0x5F55: 0x7099, + 0x5F56: 0x7092, + 0x5F57: 0x70AF, + 0x5F58: 0x70F1, + 0x5F59: 0x70AC, + 0x5F5A: 0x70B8, + 0x5F5B: 0x70B3, + 0x5F5C: 0x70AE, + 0x5F5D: 0x70DF, + 0x5F5E: 0x70CB, + 0x5F5F: 0x70DD, + 0x5F60: 0x70D9, + 0x5F61: 0x7109, + 0x5F62: 0x70FD, + 0x5F63: 0x711C, + 0x5F64: 0x7119, + 0x5F65: 0x7165, + 0x5F66: 0x7155, + 0x5F67: 0x7188, + 0x5F68: 0x7166, + 0x5F69: 0x7162, + 0x5F6A: 0x714C, + 0x5F6B: 0x7156, + 0x5F6C: 0x716C, + 0x5F6D: 0x718F, + 0x5F6E: 0x71FB, + 0x5F6F: 0x7184, + 0x5F70: 0x7195, + 0x5F71: 0x71A8, + 0x5F72: 0x71AC, + 0x5F73: 0x71D7, + 0x5F74: 0x71B9, + 0x5F75: 0x71BE, + 0x5F76: 0x71D2, + 0x5F77: 0x71C9, + 0x5F78: 0x71D4, + 0x5F79: 0x71CE, + 0x5F7A: 0x71E0, + 0x5F7B: 0x71EC, + 0x5F7C: 0x71E7, + 0x5F7D: 0x71F5, + 0x5F7E: 0x71FC, + 0x6021: 0x71F9, + 0x6022: 0x71FF, + 0x6023: 0x720D, + 0x6024: 0x7210, + 0x6025: 0x721B, + 0x6026: 0x7228, + 0x6027: 0x722D, + 0x6028: 0x722C, + 0x6029: 0x7230, + 0x602A: 0x7232, + 0x602B: 0x723B, + 0x602C: 0x723C, + 0x602D: 0x723F, + 0x602E: 0x7240, + 0x602F: 0x7246, + 0x6030: 0x724B, + 0x6031: 0x7258, + 0x6032: 0x7274, + 0x6033: 0x727E, + 0x6034: 0x7282, + 0x6035: 0x7281, + 0x6036: 0x7287, + 0x6037: 0x7292, + 0x6038: 0x7296, + 0x6039: 0x72A2, + 0x603A: 0x72A7, + 0x603B: 0x72B9, + 0x603C: 0x72B2, + 0x603D: 0x72C3, + 0x603E: 0x72C6, + 0x603F: 0x72C4, + 0x6040: 0x72CE, + 0x6041: 0x72D2, + 0x6042: 0x72E2, + 0x6043: 0x72E0, + 0x6044: 0x72E1, + 0x6045: 0x72F9, + 0x6046: 0x72F7, + 0x6047: 0x500F, + 0x6048: 0x7317, + 0x6049: 0x730A, + 0x604A: 0x731C, + 0x604B: 0x7316, + 0x604C: 0x731D, + 0x604D: 0x7334, + 0x604E: 0x732F, + 0x604F: 0x7329, + 0x6050: 0x7325, + 0x6051: 0x733E, + 0x6052: 0x734E, + 0x6053: 0x734F, + 0x6054: 0x9ED8, + 0x6055: 0x7357, + 0x6056: 0x736A, + 0x6057: 0x7368, + 0x6058: 0x7370, + 0x6059: 0x7378, + 0x605A: 0x7375, + 0x605B: 0x737B, + 0x605C: 0x737A, + 0x605D: 0x73C8, + 0x605E: 0x73B3, + 0x605F: 0x73CE, + 0x6060: 0x73BB, + 0x6061: 0x73C0, + 0x6062: 0x73E5, + 0x6063: 0x73EE, + 0x6064: 0x73DE, + 0x6065: 0x74A2, + 0x6066: 0x7405, + 0x6067: 0x746F, + 0x6068: 0x7425, + 0x6069: 0x73F8, + 0x606A: 0x7432, + 0x606B: 0x743A, + 0x606C: 0x7455, + 0x606D: 0x743F, + 0x606E: 0x745F, + 0x606F: 0x7459, + 0x6070: 0x7441, + 0x6071: 0x745C, + 0x6072: 0x7469, + 0x6073: 0x7470, + 0x6074: 0x7463, + 0x6075: 0x746A, + 0x6076: 0x7476, + 0x6077: 0x747E, + 0x6078: 0x748B, + 0x6079: 0x749E, + 0x607A: 0x74A7, + 0x607B: 0x74CA, + 0x607C: 0x74CF, + 0x607D: 0x74D4, + 0x607E: 0x73F1, + 0x6121: 0x74E0, + 0x6122: 0x74E3, + 0x6123: 0x74E7, + 0x6124: 0x74E9, + 0x6125: 0x74EE, + 0x6126: 0x74F2, + 0x6127: 0x74F0, + 0x6128: 0x74F1, + 0x6129: 0x74F8, + 0x612A: 0x74F7, + 0x612B: 0x7504, + 0x612C: 0x7503, + 0x612D: 0x7505, + 0x612E: 0x750C, + 0x612F: 0x750E, + 0x6130: 0x750D, + 0x6131: 0x7515, + 0x6132: 0x7513, + 0x6133: 0x751E, + 0x6134: 0x7526, + 0x6135: 0x752C, + 0x6136: 0x753C, + 0x6137: 0x7544, + 0x6138: 0x754D, + 0x6139: 0x754A, + 0x613A: 0x7549, + 0x613B: 0x755B, + 0x613C: 0x7546, + 0x613D: 0x755A, + 0x613E: 0x7569, + 0x613F: 0x7564, + 0x6140: 0x7567, + 0x6141: 0x756B, + 0x6142: 0x756D, + 0x6143: 0x7578, + 0x6144: 0x7576, + 0x6145: 0x7586, + 0x6146: 0x7587, + 0x6147: 0x7574, + 0x6148: 0x758A, + 0x6149: 0x7589, + 0x614A: 0x7582, + 0x614B: 0x7594, + 0x614C: 0x759A, + 0x614D: 0x759D, + 0x614E: 0x75A5, + 0x614F: 0x75A3, + 0x6150: 0x75C2, + 0x6151: 0x75B3, + 0x6152: 0x75C3, + 0x6153: 0x75B5, + 0x6154: 0x75BD, + 0x6155: 0x75B8, + 0x6156: 0x75BC, + 0x6157: 0x75B1, + 0x6158: 0x75CD, + 0x6159: 0x75CA, + 0x615A: 0x75D2, + 0x615B: 0x75D9, + 0x615C: 0x75E3, + 0x615D: 0x75DE, + 0x615E: 0x75FE, + 0x615F: 0x75FF, + 0x6160: 0x75FC, + 0x6161: 0x7601, + 0x6162: 0x75F0, + 0x6163: 0x75FA, + 0x6164: 0x75F2, + 0x6165: 0x75F3, + 0x6166: 0x760B, + 0x6167: 0x760D, + 0x6168: 0x7609, + 0x6169: 0x761F, + 0x616A: 0x7627, + 0x616B: 0x7620, + 0x616C: 0x7621, + 0x616D: 0x7622, + 0x616E: 0x7624, + 0x616F: 0x7634, + 0x6170: 0x7630, + 0x6171: 0x763B, + 0x6172: 0x7647, + 0x6173: 0x7648, + 0x6174: 0x7646, + 0x6175: 0x765C, + 0x6176: 0x7658, + 0x6177: 0x7661, + 0x6178: 0x7662, + 0x6179: 0x7668, + 0x617A: 0x7669, + 0x617B: 0x766A, + 0x617C: 0x7667, + 0x617D: 0x766C, + 0x617E: 0x7670, + 0x6221: 0x7672, + 0x6222: 0x7676, + 0x6223: 0x7678, + 0x6224: 0x767C, + 0x6225: 0x7680, + 0x6226: 0x7683, + 0x6227: 0x7688, + 0x6228: 0x768B, + 0x6229: 0x768E, + 0x622A: 0x7696, + 0x622B: 0x7693, + 0x622C: 0x7699, + 0x622D: 0x769A, + 0x622E: 0x76B0, + 0x622F: 0x76B4, + 0x6230: 0x76B8, + 0x6231: 0x76B9, + 0x6232: 0x76BA, + 0x6233: 0x76C2, + 0x6234: 0x76CD, + 0x6235: 0x76D6, + 0x6236: 0x76D2, + 0x6237: 0x76DE, + 0x6238: 0x76E1, + 0x6239: 0x76E5, + 0x623A: 0x76E7, + 0x623B: 0x76EA, + 0x623C: 0x862F, + 0x623D: 0x76FB, + 0x623E: 0x7708, + 0x623F: 0x7707, + 0x6240: 0x7704, + 0x6241: 0x7729, + 0x6242: 0x7724, + 0x6243: 0x771E, + 0x6244: 0x7725, + 0x6245: 0x7726, + 0x6246: 0x771B, + 0x6247: 0x7737, + 0x6248: 0x7738, + 0x6249: 0x7747, + 0x624A: 0x775A, + 0x624B: 0x7768, + 0x624C: 0x776B, + 0x624D: 0x775B, + 0x624E: 0x7765, + 0x624F: 0x777F, + 0x6250: 0x777E, + 0x6251: 0x7779, + 0x6252: 0x778E, + 0x6253: 0x778B, + 0x6254: 0x7791, + 0x6255: 0x77A0, + 0x6256: 0x779E, + 0x6257: 0x77B0, + 0x6258: 0x77B6, + 0x6259: 0x77B9, + 0x625A: 0x77BF, + 0x625B: 0x77BC, + 0x625C: 0x77BD, + 0x625D: 0x77BB, + 0x625E: 0x77C7, + 0x625F: 0x77CD, + 0x6260: 0x77D7, + 0x6261: 0x77DA, + 0x6262: 0x77DC, + 0x6263: 0x77E3, + 0x6264: 0x77EE, + 0x6265: 0x77FC, + 0x6266: 0x780C, + 0x6267: 0x7812, + 0x6268: 0x7926, + 0x6269: 0x7820, + 0x626A: 0x792A, + 0x626B: 0x7845, + 0x626C: 0x788E, + 0x626D: 0x7874, + 0x626E: 0x7886, + 0x626F: 0x787C, + 0x6270: 0x789A, + 0x6271: 0x788C, + 0x6272: 0x78A3, + 0x6273: 0x78B5, + 0x6274: 0x78AA, + 0x6275: 0x78AF, + 0x6276: 0x78D1, + 0x6277: 0x78C6, + 0x6278: 0x78CB, + 0x6279: 0x78D4, + 0x627A: 0x78BE, + 0x627B: 0x78BC, + 0x627C: 0x78C5, + 0x627D: 0x78CA, + 0x627E: 0x78EC, + 0x6321: 0x78E7, + 0x6322: 0x78DA, + 0x6323: 0x78FD, + 0x6324: 0x78F4, + 0x6325: 0x7907, + 0x6326: 0x7912, + 0x6327: 0x7911, + 0x6328: 0x7919, + 0x6329: 0x792C, + 0x632A: 0x792B, + 0x632B: 0x7940, + 0x632C: 0x7960, + 0x632D: 0x7957, + 0x632E: 0x795F, + 0x632F: 0x795A, + 0x6330: 0x7955, + 0x6331: 0x7953, + 0x6332: 0x797A, + 0x6333: 0x797F, + 0x6334: 0x798A, + 0x6335: 0x799D, + 0x6336: 0x79A7, + 0x6337: 0x9F4B, + 0x6338: 0x79AA, + 0x6339: 0x79AE, + 0x633A: 0x79B3, + 0x633B: 0x79B9, + 0x633C: 0x79BA, + 0x633D: 0x79C9, + 0x633E: 0x79D5, + 0x633F: 0x79E7, + 0x6340: 0x79EC, + 0x6341: 0x79E1, + 0x6342: 0x79E3, + 0x6343: 0x7A08, + 0x6344: 0x7A0D, + 0x6345: 0x7A18, + 0x6346: 0x7A19, + 0x6347: 0x7A20, + 0x6348: 0x7A1F, + 0x6349: 0x7980, + 0x634A: 0x7A31, + 0x634B: 0x7A3B, + 0x634C: 0x7A3E, + 0x634D: 0x7A37, + 0x634E: 0x7A43, + 0x634F: 0x7A57, + 0x6350: 0x7A49, + 0x6351: 0x7A61, + 0x6352: 0x7A62, + 0x6353: 0x7A69, + 0x6354: 0x9F9D, + 0x6355: 0x7A70, + 0x6356: 0x7A79, + 0x6357: 0x7A7D, + 0x6358: 0x7A88, + 0x6359: 0x7A97, + 0x635A: 0x7A95, + 0x635B: 0x7A98, + 0x635C: 0x7A96, + 0x635D: 0x7AA9, + 0x635E: 0x7AC8, + 0x635F: 0x7AB0, + 0x6360: 0x7AB6, + 0x6361: 0x7AC5, + 0x6362: 0x7AC4, + 0x6363: 0x7ABF, + 0x6364: 0x9083, + 0x6365: 0x7AC7, + 0x6366: 0x7ACA, + 0x6367: 0x7ACD, + 0x6368: 0x7ACF, + 0x6369: 0x7AD5, + 0x636A: 0x7AD3, + 0x636B: 0x7AD9, + 0x636C: 0x7ADA, + 0x636D: 0x7ADD, + 0x636E: 0x7AE1, + 0x636F: 0x7AE2, + 0x6370: 0x7AE6, + 0x6371: 0x7AED, + 0x6372: 0x7AF0, + 0x6373: 0x7B02, + 0x6374: 0x7B0F, + 0x6375: 0x7B0A, + 0x6376: 0x7B06, + 0x6377: 0x7B33, + 0x6378: 0x7B18, + 0x6379: 0x7B19, + 0x637A: 0x7B1E, + 0x637B: 0x7B35, + 0x637C: 0x7B28, + 0x637D: 0x7B36, + 0x637E: 0x7B50, + 0x6421: 0x7B7A, + 0x6422: 0x7B04, + 0x6423: 0x7B4D, + 0x6424: 0x7B0B, + 0x6425: 0x7B4C, + 0x6426: 0x7B45, + 0x6427: 0x7B75, + 0x6428: 0x7B65, + 0x6429: 0x7B74, + 0x642A: 0x7B67, + 0x642B: 0x7B70, + 0x642C: 0x7B71, + 0x642D: 0x7B6C, + 0x642E: 0x7B6E, + 0x642F: 0x7B9D, + 0x6430: 0x7B98, + 0x6431: 0x7B9F, + 0x6432: 0x7B8D, + 0x6433: 0x7B9C, + 0x6434: 0x7B9A, + 0x6435: 0x7B8B, + 0x6436: 0x7B92, + 0x6437: 0x7B8F, + 0x6438: 0x7B5D, + 0x6439: 0x7B99, + 0x643A: 0x7BCB, + 0x643B: 0x7BC1, + 0x643C: 0x7BCC, + 0x643D: 0x7BCF, + 0x643E: 0x7BB4, + 0x643F: 0x7BC6, + 0x6440: 0x7BDD, + 0x6441: 0x7BE9, + 0x6442: 0x7C11, + 0x6443: 0x7C14, + 0x6444: 0x7BE6, + 0x6445: 0x7BE5, + 0x6446: 0x7C60, + 0x6447: 0x7C00, + 0x6448: 0x7C07, + 0x6449: 0x7C13, + 0x644A: 0x7BF3, + 0x644B: 0x7BF7, + 0x644C: 0x7C17, + 0x644D: 0x7C0D, + 0x644E: 0x7BF6, + 0x644F: 0x7C23, + 0x6450: 0x7C27, + 0x6451: 0x7C2A, + 0x6452: 0x7C1F, + 0x6453: 0x7C37, + 0x6454: 0x7C2B, + 0x6455: 0x7C3D, + 0x6456: 0x7C4C, + 0x6457: 0x7C43, + 0x6458: 0x7C54, + 0x6459: 0x7C4F, + 0x645A: 0x7C40, + 0x645B: 0x7C50, + 0x645C: 0x7C58, + 0x645D: 0x7C5F, + 0x645E: 0x7C64, + 0x645F: 0x7C56, + 0x6460: 0x7C65, + 0x6461: 0x7C6C, + 0x6462: 0x7C75, + 0x6463: 0x7C83, + 0x6464: 0x7C90, + 0x6465: 0x7CA4, + 0x6466: 0x7CAD, + 0x6467: 0x7CA2, + 0x6468: 0x7CAB, + 0x6469: 0x7CA1, + 0x646A: 0x7CA8, + 0x646B: 0x7CB3, + 0x646C: 0x7CB2, + 0x646D: 0x7CB1, + 0x646E: 0x7CAE, + 0x646F: 0x7CB9, + 0x6470: 0x7CBD, + 0x6471: 0x7CC0, + 0x6472: 0x7CC5, + 0x6473: 0x7CC2, + 0x6474: 0x7CD8, + 0x6475: 0x7CD2, + 0x6476: 0x7CDC, + 0x6477: 0x7CE2, + 0x6478: 0x9B3B, + 0x6479: 0x7CEF, + 0x647A: 0x7CF2, + 0x647B: 0x7CF4, + 0x647C: 0x7CF6, + 0x647D: 0x7CFA, + 0x647E: 0x7D06, + 0x6521: 0x7D02, + 0x6522: 0x7D1C, + 0x6523: 0x7D15, + 0x6524: 0x7D0A, + 0x6525: 0x7D45, + 0x6526: 0x7D4B, + 0x6527: 0x7D2E, + 0x6528: 0x7D32, + 0x6529: 0x7D3F, + 0x652A: 0x7D35, + 0x652B: 0x7D46, + 0x652C: 0x7D73, + 0x652D: 0x7D56, + 0x652E: 0x7D4E, + 0x652F: 0x7D72, + 0x6530: 0x7D68, + 0x6531: 0x7D6E, + 0x6532: 0x7D4F, + 0x6533: 0x7D63, + 0x6534: 0x7D93, + 0x6535: 0x7D89, + 0x6536: 0x7D5B, + 0x6537: 0x7D8F, + 0x6538: 0x7D7D, + 0x6539: 0x7D9B, + 0x653A: 0x7DBA, + 0x653B: 0x7DAE, + 0x653C: 0x7DA3, + 0x653D: 0x7DB5, + 0x653E: 0x7DC7, + 0x653F: 0x7DBD, + 0x6540: 0x7DAB, + 0x6541: 0x7E3D, + 0x6542: 0x7DA2, + 0x6543: 0x7DAF, + 0x6544: 0x7DDC, + 0x6545: 0x7DB8, + 0x6546: 0x7D9F, + 0x6547: 0x7DB0, + 0x6548: 0x7DD8, + 0x6549: 0x7DDD, + 0x654A: 0x7DE4, + 0x654B: 0x7DDE, + 0x654C: 0x7DFB, + 0x654D: 0x7DF2, + 0x654E: 0x7DE1, + 0x654F: 0x7E05, + 0x6550: 0x7E0A, + 0x6551: 0x7E23, + 0x6552: 0x7E21, + 0x6553: 0x7E12, + 0x6554: 0x7E31, + 0x6555: 0x7E1F, + 0x6556: 0x7E09, + 0x6557: 0x7E0B, + 0x6558: 0x7E22, + 0x6559: 0x7E46, + 0x655A: 0x7E66, + 0x655B: 0x7E3B, + 0x655C: 0x7E35, + 0x655D: 0x7E39, + 0x655E: 0x7E43, + 0x655F: 0x7E37, + 0x6560: 0x7E32, + 0x6561: 0x7E3A, + 0x6562: 0x7E67, + 0x6563: 0x7E5D, + 0x6564: 0x7E56, + 0x6565: 0x7E5E, + 0x6566: 0x7E59, + 0x6567: 0x7E5A, + 0x6568: 0x7E79, + 0x6569: 0x7E6A, + 0x656A: 0x7E69, + 0x656B: 0x7E7C, + 0x656C: 0x7E7B, + 0x656D: 0x7E83, + 0x656E: 0x7DD5, + 0x656F: 0x7E7D, + 0x6570: 0x8FAE, + 0x6571: 0x7E7F, + 0x6572: 0x7E88, + 0x6573: 0x7E89, + 0x6574: 0x7E8C, + 0x6575: 0x7E92, + 0x6576: 0x7E90, + 0x6577: 0x7E93, + 0x6578: 0x7E94, + 0x6579: 0x7E96, + 0x657A: 0x7E8E, + 0x657B: 0x7E9B, + 0x657C: 0x7E9C, + 0x657D: 0x7F38, + 0x657E: 0x7F3A, + 0x6621: 0x7F45, + 0x6622: 0x7F4C, + 0x6623: 0x7F4D, + 0x6624: 0x7F4E, + 0x6625: 0x7F50, + 0x6626: 0x7F51, + 0x6627: 0x7F55, + 0x6628: 0x7F54, + 0x6629: 0x7F58, + 0x662A: 0x7F5F, + 0x662B: 0x7F60, + 0x662C: 0x7F68, + 0x662D: 0x7F69, + 0x662E: 0x7F67, + 0x662F: 0x7F78, + 0x6630: 0x7F82, + 0x6631: 0x7F86, + 0x6632: 0x7F83, + 0x6633: 0x7F88, + 0x6634: 0x7F87, + 0x6635: 0x7F8C, + 0x6636: 0x7F94, + 0x6637: 0x7F9E, + 0x6638: 0x7F9D, + 0x6639: 0x7F9A, + 0x663A: 0x7FA3, + 0x663B: 0x7FAF, + 0x663C: 0x7FB2, + 0x663D: 0x7FB9, + 0x663E: 0x7FAE, + 0x663F: 0x7FB6, + 0x6640: 0x7FB8, + 0x6641: 0x8B71, + 0x6642: 0x7FC5, + 0x6643: 0x7FC6, + 0x6644: 0x7FCA, + 0x6645: 0x7FD5, + 0x6646: 0x7FD4, + 0x6647: 0x7FE1, + 0x6648: 0x7FE6, + 0x6649: 0x7FE9, + 0x664A: 0x7FF3, + 0x664B: 0x7FF9, + 0x664C: 0x98DC, + 0x664D: 0x8006, + 0x664E: 0x8004, + 0x664F: 0x800B, + 0x6650: 0x8012, + 0x6651: 0x8018, + 0x6652: 0x8019, + 0x6653: 0x801C, + 0x6654: 0x8021, + 0x6655: 0x8028, + 0x6656: 0x803F, + 0x6657: 0x803B, + 0x6658: 0x804A, + 0x6659: 0x8046, + 0x665A: 0x8052, + 0x665B: 0x8058, + 0x665C: 0x805A, + 0x665D: 0x805F, + 0x665E: 0x8062, + 0x665F: 0x8068, + 0x6660: 0x8073, + 0x6661: 0x8072, + 0x6662: 0x8070, + 0x6663: 0x8076, + 0x6664: 0x8079, + 0x6665: 0x807D, + 0x6666: 0x807F, + 0x6667: 0x8084, + 0x6668: 0x8086, + 0x6669: 0x8085, + 0x666A: 0x809B, + 0x666B: 0x8093, + 0x666C: 0x809A, + 0x666D: 0x80AD, + 0x666E: 0x5190, + 0x666F: 0x80AC, + 0x6670: 0x80DB, + 0x6671: 0x80E5, + 0x6672: 0x80D9, + 0x6673: 0x80DD, + 0x6674: 0x80C4, + 0x6675: 0x80DA, + 0x6676: 0x80D6, + 0x6677: 0x8109, + 0x6678: 0x80EF, + 0x6679: 0x80F1, + 0x667A: 0x811B, + 0x667B: 0x8129, + 0x667C: 0x8123, + 0x667D: 0x812F, + 0x667E: 0x814B, + 0x6721: 0x968B, + 0x6722: 0x8146, + 0x6723: 0x813E, + 0x6724: 0x8153, + 0x6725: 0x8151, + 0x6726: 0x80FC, + 0x6727: 0x8171, + 0x6728: 0x816E, + 0x6729: 0x8165, + 0x672A: 0x8166, + 0x672B: 0x8174, + 0x672C: 0x8183, + 0x672D: 0x8188, + 0x672E: 0x818A, + 0x672F: 0x8180, + 0x6730: 0x8182, + 0x6731: 0x81A0, + 0x6732: 0x8195, + 0x6733: 0x81A4, + 0x6734: 0x81A3, + 0x6735: 0x815F, + 0x6736: 0x8193, + 0x6737: 0x81A9, + 0x6738: 0x81B0, + 0x6739: 0x81B5, + 0x673A: 0x81BE, + 0x673B: 0x81B8, + 0x673C: 0x81BD, + 0x673D: 0x81C0, + 0x673E: 0x81C2, + 0x673F: 0x81BA, + 0x6740: 0x81C9, + 0x6741: 0x81CD, + 0x6742: 0x81D1, + 0x6743: 0x81D9, + 0x6744: 0x81D8, + 0x6745: 0x81C8, + 0x6746: 0x81DA, + 0x6747: 0x81DF, + 0x6748: 0x81E0, + 0x6749: 0x81E7, + 0x674A: 0x81FA, + 0x674B: 0x81FB, + 0x674C: 0x81FE, + 0x674D: 0x8201, + 0x674E: 0x8202, + 0x674F: 0x8205, + 0x6750: 0x8207, + 0x6751: 0x820A, + 0x6752: 0x820D, + 0x6753: 0x8210, + 0x6754: 0x8216, + 0x6755: 0x8229, + 0x6756: 0x822B, + 0x6757: 0x8238, + 0x6758: 0x8233, + 0x6759: 0x8240, + 0x675A: 0x8259, + 0x675B: 0x8258, + 0x675C: 0x825D, + 0x675D: 0x825A, + 0x675E: 0x825F, + 0x675F: 0x8264, + 0x6760: 0x8262, + 0x6761: 0x8268, + 0x6762: 0x826A, + 0x6763: 0x826B, + 0x6764: 0x822E, + 0x6765: 0x8271, + 0x6766: 0x8277, + 0x6767: 0x8278, + 0x6768: 0x827E, + 0x6769: 0x828D, + 0x676A: 0x8292, + 0x676B: 0x82AB, + 0x676C: 0x829F, + 0x676D: 0x82BB, + 0x676E: 0x82AC, + 0x676F: 0x82E1, + 0x6770: 0x82E3, + 0x6771: 0x82DF, + 0x6772: 0x82D2, + 0x6773: 0x82F4, + 0x6774: 0x82F3, + 0x6775: 0x82FA, + 0x6776: 0x8393, + 0x6777: 0x8303, + 0x6778: 0x82FB, + 0x6779: 0x82F9, + 0x677A: 0x82DE, + 0x677B: 0x8306, + 0x677C: 0x82DC, + 0x677D: 0x8309, + 0x677E: 0x82D9, + 0x6821: 0x8335, + 0x6822: 0x8334, + 0x6823: 0x8316, + 0x6824: 0x8332, + 0x6825: 0x8331, + 0x6826: 0x8340, + 0x6827: 0x8339, + 0x6828: 0x8350, + 0x6829: 0x8345, + 0x682A: 0x832F, + 0x682B: 0x832B, + 0x682C: 0x8317, + 0x682D: 0x8318, + 0x682E: 0x8385, + 0x682F: 0x839A, + 0x6830: 0x83AA, + 0x6831: 0x839F, + 0x6832: 0x83A2, + 0x6833: 0x8396, + 0x6834: 0x8323, + 0x6835: 0x838E, + 0x6836: 0x8387, + 0x6837: 0x838A, + 0x6838: 0x837C, + 0x6839: 0x83B5, + 0x683A: 0x8373, + 0x683B: 0x8375, + 0x683C: 0x83A0, + 0x683D: 0x8389, + 0x683E: 0x83A8, + 0x683F: 0x83F4, + 0x6840: 0x8413, + 0x6841: 0x83EB, + 0x6842: 0x83CE, + 0x6843: 0x83FD, + 0x6844: 0x8403, + 0x6845: 0x83D8, + 0x6846: 0x840B, + 0x6847: 0x83C1, + 0x6848: 0x83F7, + 0x6849: 0x8407, + 0x684A: 0x83E0, + 0x684B: 0x83F2, + 0x684C: 0x840D, + 0x684D: 0x8422, + 0x684E: 0x8420, + 0x684F: 0x83BD, + 0x6850: 0x8438, + 0x6851: 0x8506, + 0x6852: 0x83FB, + 0x6853: 0x846D, + 0x6854: 0x842A, + 0x6855: 0x843C, + 0x6856: 0x855A, + 0x6857: 0x8484, + 0x6858: 0x8477, + 0x6859: 0x846B, + 0x685A: 0x84AD, + 0x685B: 0x846E, + 0x685C: 0x8482, + 0x685D: 0x8469, + 0x685E: 0x8446, + 0x685F: 0x842C, + 0x6860: 0x846F, + 0x6861: 0x8479, + 0x6862: 0x8435, + 0x6863: 0x84CA, + 0x6864: 0x8462, + 0x6865: 0x84B9, + 0x6866: 0x84BF, + 0x6867: 0x849F, + 0x6868: 0x84D9, + 0x6869: 0x84CD, + 0x686A: 0x84BB, + 0x686B: 0x84DA, + 0x686C: 0x84D0, + 0x686D: 0x84C1, + 0x686E: 0x84C6, + 0x686F: 0x84D6, + 0x6870: 0x84A1, + 0x6871: 0x8521, + 0x6872: 0x84FF, + 0x6873: 0x84F4, + 0x6874: 0x8517, + 0x6875: 0x8518, + 0x6876: 0x852C, + 0x6877: 0x851F, + 0x6878: 0x8515, + 0x6879: 0x8514, + 0x687A: 0x84FC, + 0x687B: 0x8540, + 0x687C: 0x8563, + 0x687D: 0x8558, + 0x687E: 0x8548, + 0x6921: 0x8541, + 0x6922: 0x8602, + 0x6923: 0x854B, + 0x6924: 0x8555, + 0x6925: 0x8580, + 0x6926: 0x85A4, + 0x6927: 0x8588, + 0x6928: 0x8591, + 0x6929: 0x858A, + 0x692A: 0x85A8, + 0x692B: 0x856D, + 0x692C: 0x8594, + 0x692D: 0x859B, + 0x692E: 0x85EA, + 0x692F: 0x8587, + 0x6930: 0x859C, + 0x6931: 0x8577, + 0x6932: 0x857E, + 0x6933: 0x8590, + 0x6934: 0x85C9, + 0x6935: 0x85BA, + 0x6936: 0x85CF, + 0x6937: 0x85B9, + 0x6938: 0x85D0, + 0x6939: 0x85D5, + 0x693A: 0x85DD, + 0x693B: 0x85E5, + 0x693C: 0x85DC, + 0x693D: 0x85F9, + 0x693E: 0x860A, + 0x693F: 0x8613, + 0x6940: 0x860B, + 0x6941: 0x85FE, + 0x6942: 0x85FA, + 0x6943: 0x8606, + 0x6944: 0x8622, + 0x6945: 0x861A, + 0x6946: 0x8630, + 0x6947: 0x863F, + 0x6948: 0x864D, + 0x6949: 0x4E55, + 0x694A: 0x8654, + 0x694B: 0x865F, + 0x694C: 0x8667, + 0x694D: 0x8671, + 0x694E: 0x8693, + 0x694F: 0x86A3, + 0x6950: 0x86A9, + 0x6951: 0x86AA, + 0x6952: 0x868B, + 0x6953: 0x868C, + 0x6954: 0x86B6, + 0x6955: 0x86AF, + 0x6956: 0x86C4, + 0x6957: 0x86C6, + 0x6958: 0x86B0, + 0x6959: 0x86C9, + 0x695A: 0x8823, + 0x695B: 0x86AB, + 0x695C: 0x86D4, + 0x695D: 0x86DE, + 0x695E: 0x86E9, + 0x695F: 0x86EC, + 0x6960: 0x86DF, + 0x6961: 0x86DB, + 0x6962: 0x86EF, + 0x6963: 0x8712, + 0x6964: 0x8706, + 0x6965: 0x8708, + 0x6966: 0x8700, + 0x6967: 0x8703, + 0x6968: 0x86FB, + 0x6969: 0x8711, + 0x696A: 0x8709, + 0x696B: 0x870D, + 0x696C: 0x86F9, + 0x696D: 0x870A, + 0x696E: 0x8734, + 0x696F: 0x873F, + 0x6970: 0x8737, + 0x6971: 0x873B, + 0x6972: 0x8725, + 0x6973: 0x8729, + 0x6974: 0x871A, + 0x6975: 0x8760, + 0x6976: 0x875F, + 0x6977: 0x8778, + 0x6978: 0x874C, + 0x6979: 0x874E, + 0x697A: 0x8774, + 0x697B: 0x8757, + 0x697C: 0x8768, + 0x697D: 0x876E, + 0x697E: 0x8759, + 0x6A21: 0x8753, + 0x6A22: 0x8763, + 0x6A23: 0x876A, + 0x6A24: 0x8805, + 0x6A25: 0x87A2, + 0x6A26: 0x879F, + 0x6A27: 0x8782, + 0x6A28: 0x87AF, + 0x6A29: 0x87CB, + 0x6A2A: 0x87BD, + 0x6A2B: 0x87C0, + 0x6A2C: 0x87D0, + 0x6A2D: 0x96D6, + 0x6A2E: 0x87AB, + 0x6A2F: 0x87C4, + 0x6A30: 0x87B3, + 0x6A31: 0x87C7, + 0x6A32: 0x87C6, + 0x6A33: 0x87BB, + 0x6A34: 0x87EF, + 0x6A35: 0x87F2, + 0x6A36: 0x87E0, + 0x6A37: 0x880F, + 0x6A38: 0x880D, + 0x6A39: 0x87FE, + 0x6A3A: 0x87F6, + 0x6A3B: 0x87F7, + 0x6A3C: 0x880E, + 0x6A3D: 0x87D2, + 0x6A3E: 0x8811, + 0x6A3F: 0x8816, + 0x6A40: 0x8815, + 0x6A41: 0x8822, + 0x6A42: 0x8821, + 0x6A43: 0x8831, + 0x6A44: 0x8836, + 0x6A45: 0x8839, + 0x6A46: 0x8827, + 0x6A47: 0x883B, + 0x6A48: 0x8844, + 0x6A49: 0x8842, + 0x6A4A: 0x8852, + 0x6A4B: 0x8859, + 0x6A4C: 0x885E, + 0x6A4D: 0x8862, + 0x6A4E: 0x886B, + 0x6A4F: 0x8881, + 0x6A50: 0x887E, + 0x6A51: 0x889E, + 0x6A52: 0x8875, + 0x6A53: 0x887D, + 0x6A54: 0x88B5, + 0x6A55: 0x8872, + 0x6A56: 0x8882, + 0x6A57: 0x8897, + 0x6A58: 0x8892, + 0x6A59: 0x88AE, + 0x6A5A: 0x8899, + 0x6A5B: 0x88A2, + 0x6A5C: 0x888D, + 0x6A5D: 0x88A4, + 0x6A5E: 0x88B0, + 0x6A5F: 0x88BF, + 0x6A60: 0x88B1, + 0x6A61: 0x88C3, + 0x6A62: 0x88C4, + 0x6A63: 0x88D4, + 0x6A64: 0x88D8, + 0x6A65: 0x88D9, + 0x6A66: 0x88DD, + 0x6A67: 0x88F9, + 0x6A68: 0x8902, + 0x6A69: 0x88FC, + 0x6A6A: 0x88F4, + 0x6A6B: 0x88E8, + 0x6A6C: 0x88F2, + 0x6A6D: 0x8904, + 0x6A6E: 0x890C, + 0x6A6F: 0x890A, + 0x6A70: 0x8913, + 0x6A71: 0x8943, + 0x6A72: 0x891E, + 0x6A73: 0x8925, + 0x6A74: 0x892A, + 0x6A75: 0x892B, + 0x6A76: 0x8941, + 0x6A77: 0x8944, + 0x6A78: 0x893B, + 0x6A79: 0x8936, + 0x6A7A: 0x8938, + 0x6A7B: 0x894C, + 0x6A7C: 0x891D, + 0x6A7D: 0x8960, + 0x6A7E: 0x895E, + 0x6B21: 0x8966, + 0x6B22: 0x8964, + 0x6B23: 0x896D, + 0x6B24: 0x896A, + 0x6B25: 0x896F, + 0x6B26: 0x8974, + 0x6B27: 0x8977, + 0x6B28: 0x897E, + 0x6B29: 0x8983, + 0x6B2A: 0x8988, + 0x6B2B: 0x898A, + 0x6B2C: 0x8993, + 0x6B2D: 0x8998, + 0x6B2E: 0x89A1, + 0x6B2F: 0x89A9, + 0x6B30: 0x89A6, + 0x6B31: 0x89AC, + 0x6B32: 0x89AF, + 0x6B33: 0x89B2, + 0x6B34: 0x89BA, + 0x6B35: 0x89BD, + 0x6B36: 0x89BF, + 0x6B37: 0x89C0, + 0x6B38: 0x89DA, + 0x6B39: 0x89DC, + 0x6B3A: 0x89DD, + 0x6B3B: 0x89E7, + 0x6B3C: 0x89F4, + 0x6B3D: 0x89F8, + 0x6B3E: 0x8A03, + 0x6B3F: 0x8A16, + 0x6B40: 0x8A10, + 0x6B41: 0x8A0C, + 0x6B42: 0x8A1B, + 0x6B43: 0x8A1D, + 0x6B44: 0x8A25, + 0x6B45: 0x8A36, + 0x6B46: 0x8A41, + 0x6B47: 0x8A5B, + 0x6B48: 0x8A52, + 0x6B49: 0x8A46, + 0x6B4A: 0x8A48, + 0x6B4B: 0x8A7C, + 0x6B4C: 0x8A6D, + 0x6B4D: 0x8A6C, + 0x6B4E: 0x8A62, + 0x6B4F: 0x8A85, + 0x6B50: 0x8A82, + 0x6B51: 0x8A84, + 0x6B52: 0x8AA8, + 0x6B53: 0x8AA1, + 0x6B54: 0x8A91, + 0x6B55: 0x8AA5, + 0x6B56: 0x8AA6, + 0x6B57: 0x8A9A, + 0x6B58: 0x8AA3, + 0x6B59: 0x8AC4, + 0x6B5A: 0x8ACD, + 0x6B5B: 0x8AC2, + 0x6B5C: 0x8ADA, + 0x6B5D: 0x8AEB, + 0x6B5E: 0x8AF3, + 0x6B5F: 0x8AE7, + 0x6B60: 0x8AE4, + 0x6B61: 0x8AF1, + 0x6B62: 0x8B14, + 0x6B63: 0x8AE0, + 0x6B64: 0x8AE2, + 0x6B65: 0x8AF7, + 0x6B66: 0x8ADE, + 0x6B67: 0x8ADB, + 0x6B68: 0x8B0C, + 0x6B69: 0x8B07, + 0x6B6A: 0x8B1A, + 0x6B6B: 0x8AE1, + 0x6B6C: 0x8B16, + 0x6B6D: 0x8B10, + 0x6B6E: 0x8B17, + 0x6B6F: 0x8B20, + 0x6B70: 0x8B33, + 0x6B71: 0x97AB, + 0x6B72: 0x8B26, + 0x6B73: 0x8B2B, + 0x6B74: 0x8B3E, + 0x6B75: 0x8B28, + 0x6B76: 0x8B41, + 0x6B77: 0x8B4C, + 0x6B78: 0x8B4F, + 0x6B79: 0x8B4E, + 0x6B7A: 0x8B49, + 0x6B7B: 0x8B56, + 0x6B7C: 0x8B5B, + 0x6B7D: 0x8B5A, + 0x6B7E: 0x8B6B, + 0x6C21: 0x8B5F, + 0x6C22: 0x8B6C, + 0x6C23: 0x8B6F, + 0x6C24: 0x8B74, + 0x6C25: 0x8B7D, + 0x6C26: 0x8B80, + 0x6C27: 0x8B8C, + 0x6C28: 0x8B8E, + 0x6C29: 0x8B92, + 0x6C2A: 0x8B93, + 0x6C2B: 0x8B96, + 0x6C2C: 0x8B99, + 0x6C2D: 0x8B9A, + 0x6C2E: 0x8C3A, + 0x6C2F: 0x8C41, + 0x6C30: 0x8C3F, + 0x6C31: 0x8C48, + 0x6C32: 0x8C4C, + 0x6C33: 0x8C4E, + 0x6C34: 0x8C50, + 0x6C35: 0x8C55, + 0x6C36: 0x8C62, + 0x6C37: 0x8C6C, + 0x6C38: 0x8C78, + 0x6C39: 0x8C7A, + 0x6C3A: 0x8C82, + 0x6C3B: 0x8C89, + 0x6C3C: 0x8C85, + 0x6C3D: 0x8C8A, + 0x6C3E: 0x8C8D, + 0x6C3F: 0x8C8E, + 0x6C40: 0x8C94, + 0x6C41: 0x8C7C, + 0x6C42: 0x8C98, + 0x6C43: 0x621D, + 0x6C44: 0x8CAD, + 0x6C45: 0x8CAA, + 0x6C46: 0x8CBD, + 0x6C47: 0x8CB2, + 0x6C48: 0x8CB3, + 0x6C49: 0x8CAE, + 0x6C4A: 0x8CB6, + 0x6C4B: 0x8CC8, + 0x6C4C: 0x8CC1, + 0x6C4D: 0x8CE4, + 0x6C4E: 0x8CE3, + 0x6C4F: 0x8CDA, + 0x6C50: 0x8CFD, + 0x6C51: 0x8CFA, + 0x6C52: 0x8CFB, + 0x6C53: 0x8D04, + 0x6C54: 0x8D05, + 0x6C55: 0x8D0A, + 0x6C56: 0x8D07, + 0x6C57: 0x8D0F, + 0x6C58: 0x8D0D, + 0x6C59: 0x8D10, + 0x6C5A: 0x9F4E, + 0x6C5B: 0x8D13, + 0x6C5C: 0x8CCD, + 0x6C5D: 0x8D14, + 0x6C5E: 0x8D16, + 0x6C5F: 0x8D67, + 0x6C60: 0x8D6D, + 0x6C61: 0x8D71, + 0x6C62: 0x8D73, + 0x6C63: 0x8D81, + 0x6C64: 0x8D99, + 0x6C65: 0x8DC2, + 0x6C66: 0x8DBE, + 0x6C67: 0x8DBA, + 0x6C68: 0x8DCF, + 0x6C69: 0x8DDA, + 0x6C6A: 0x8DD6, + 0x6C6B: 0x8DCC, + 0x6C6C: 0x8DDB, + 0x6C6D: 0x8DCB, + 0x6C6E: 0x8DEA, + 0x6C6F: 0x8DEB, + 0x6C70: 0x8DDF, + 0x6C71: 0x8DE3, + 0x6C72: 0x8DFC, + 0x6C73: 0x8E08, + 0x6C74: 0x8E09, + 0x6C75: 0x8DFF, + 0x6C76: 0x8E1D, + 0x6C77: 0x8E1E, + 0x6C78: 0x8E10, + 0x6C79: 0x8E1F, + 0x6C7A: 0x8E42, + 0x6C7B: 0x8E35, + 0x6C7C: 0x8E30, + 0x6C7D: 0x8E34, + 0x6C7E: 0x8E4A, + 0x6D21: 0x8E47, + 0x6D22: 0x8E49, + 0x6D23: 0x8E4C, + 0x6D24: 0x8E50, + 0x6D25: 0x8E48, + 0x6D26: 0x8E59, + 0x6D27: 0x8E64, + 0x6D28: 0x8E60, + 0x6D29: 0x8E2A, + 0x6D2A: 0x8E63, + 0x6D2B: 0x8E55, + 0x6D2C: 0x8E76, + 0x6D2D: 0x8E72, + 0x6D2E: 0x8E7C, + 0x6D2F: 0x8E81, + 0x6D30: 0x8E87, + 0x6D31: 0x8E85, + 0x6D32: 0x8E84, + 0x6D33: 0x8E8B, + 0x6D34: 0x8E8A, + 0x6D35: 0x8E93, + 0x6D36: 0x8E91, + 0x6D37: 0x8E94, + 0x6D38: 0x8E99, + 0x6D39: 0x8EAA, + 0x6D3A: 0x8EA1, + 0x6D3B: 0x8EAC, + 0x6D3C: 0x8EB0, + 0x6D3D: 0x8EC6, + 0x6D3E: 0x8EB1, + 0x6D3F: 0x8EBE, + 0x6D40: 0x8EC5, + 0x6D41: 0x8EC8, + 0x6D42: 0x8ECB, + 0x6D43: 0x8EDB, + 0x6D44: 0x8EE3, + 0x6D45: 0x8EFC, + 0x6D46: 0x8EFB, + 0x6D47: 0x8EEB, + 0x6D48: 0x8EFE, + 0x6D49: 0x8F0A, + 0x6D4A: 0x8F05, + 0x6D4B: 0x8F15, + 0x6D4C: 0x8F12, + 0x6D4D: 0x8F19, + 0x6D4E: 0x8F13, + 0x6D4F: 0x8F1C, + 0x6D50: 0x8F1F, + 0x6D51: 0x8F1B, + 0x6D52: 0x8F0C, + 0x6D53: 0x8F26, + 0x6D54: 0x8F33, + 0x6D55: 0x8F3B, + 0x6D56: 0x8F39, + 0x6D57: 0x8F45, + 0x6D58: 0x8F42, + 0x6D59: 0x8F3E, + 0x6D5A: 0x8F4C, + 0x6D5B: 0x8F49, + 0x6D5C: 0x8F46, + 0x6D5D: 0x8F4E, + 0x6D5E: 0x8F57, + 0x6D5F: 0x8F5C, + 0x6D60: 0x8F62, + 0x6D61: 0x8F63, + 0x6D62: 0x8F64, + 0x6D63: 0x8F9C, + 0x6D64: 0x8F9F, + 0x6D65: 0x8FA3, + 0x6D66: 0x8FAD, + 0x6D67: 0x8FAF, + 0x6D68: 0x8FB7, + 0x6D69: 0x8FDA, + 0x6D6A: 0x8FE5, + 0x6D6B: 0x8FE2, + 0x6D6C: 0x8FEA, + 0x6D6D: 0x8FEF, + 0x6D6E: 0x9087, + 0x6D6F: 0x8FF4, + 0x6D70: 0x9005, + 0x6D71: 0x8FF9, + 0x6D72: 0x8FFA, + 0x6D73: 0x9011, + 0x6D74: 0x9015, + 0x6D75: 0x9021, + 0x6D76: 0x900D, + 0x6D77: 0x901E, + 0x6D78: 0x9016, + 0x6D79: 0x900B, + 0x6D7A: 0x9027, + 0x6D7B: 0x9036, + 0x6D7C: 0x9035, + 0x6D7D: 0x9039, + 0x6D7E: 0x8FF8, + 0x6E21: 0x904F, + 0x6E22: 0x9050, + 0x6E23: 0x9051, + 0x6E24: 0x9052, + 0x6E25: 0x900E, + 0x6E26: 0x9049, + 0x6E27: 0x903E, + 0x6E28: 0x9056, + 0x6E29: 0x9058, + 0x6E2A: 0x905E, + 0x6E2B: 0x9068, + 0x6E2C: 0x906F, + 0x6E2D: 0x9076, + 0x6E2E: 0x96A8, + 0x6E2F: 0x9072, + 0x6E30: 0x9082, + 0x6E31: 0x907D, + 0x6E32: 0x9081, + 0x6E33: 0x9080, + 0x6E34: 0x908A, + 0x6E35: 0x9089, + 0x6E36: 0x908F, + 0x6E37: 0x90A8, + 0x6E38: 0x90AF, + 0x6E39: 0x90B1, + 0x6E3A: 0x90B5, + 0x6E3B: 0x90E2, + 0x6E3C: 0x90E4, + 0x6E3D: 0x6248, + 0x6E3E: 0x90DB, + 0x6E3F: 0x9102, + 0x6E40: 0x9112, + 0x6E41: 0x9119, + 0x6E42: 0x9132, + 0x6E43: 0x9130, + 0x6E44: 0x914A, + 0x6E45: 0x9156, + 0x6E46: 0x9158, + 0x6E47: 0x9163, + 0x6E48: 0x9165, + 0x6E49: 0x9169, + 0x6E4A: 0x9173, + 0x6E4B: 0x9172, + 0x6E4C: 0x918B, + 0x6E4D: 0x9189, + 0x6E4E: 0x9182, + 0x6E4F: 0x91A2, + 0x6E50: 0x91AB, + 0x6E51: 0x91AF, + 0x6E52: 0x91AA, + 0x6E53: 0x91B5, + 0x6E54: 0x91B4, + 0x6E55: 0x91BA, + 0x6E56: 0x91C0, + 0x6E57: 0x91C1, + 0x6E58: 0x91C9, + 0x6E59: 0x91CB, + 0x6E5A: 0x91D0, + 0x6E5B: 0x91D6, + 0x6E5C: 0x91DF, + 0x6E5D: 0x91E1, + 0x6E5E: 0x91DB, + 0x6E5F: 0x91FC, + 0x6E60: 0x91F5, + 0x6E61: 0x91F6, + 0x6E62: 0x921E, + 0x6E63: 0x91FF, + 0x6E64: 0x9214, + 0x6E65: 0x922C, + 0x6E66: 0x9215, + 0x6E67: 0x9211, + 0x6E68: 0x925E, + 0x6E69: 0x9257, + 0x6E6A: 0x9245, + 0x6E6B: 0x9249, + 0x6E6C: 0x9264, + 0x6E6D: 0x9248, + 0x6E6E: 0x9295, + 0x6E6F: 0x923F, + 0x6E70: 0x924B, + 0x6E71: 0x9250, + 0x6E72: 0x929C, + 0x6E73: 0x9296, + 0x6E74: 0x9293, + 0x6E75: 0x929B, + 0x6E76: 0x925A, + 0x6E77: 0x92CF, + 0x6E78: 0x92B9, + 0x6E79: 0x92B7, + 0x6E7A: 0x92E9, + 0x6E7B: 0x930F, + 0x6E7C: 0x92FA, + 0x6E7D: 0x9344, + 0x6E7E: 0x932E, + 0x6F21: 0x9319, + 0x6F22: 0x9322, + 0x6F23: 0x931A, + 0x6F24: 0x9323, + 0x6F25: 0x933A, + 0x6F26: 0x9335, + 0x6F27: 0x933B, + 0x6F28: 0x935C, + 0x6F29: 0x9360, + 0x6F2A: 0x937C, + 0x6F2B: 0x936E, + 0x6F2C: 0x9356, + 0x6F2D: 0x93B0, + 0x6F2E: 0x93AC, + 0x6F2F: 0x93AD, + 0x6F30: 0x9394, + 0x6F31: 0x93B9, + 0x6F32: 0x93D6, + 0x6F33: 0x93D7, + 0x6F34: 0x93E8, + 0x6F35: 0x93E5, + 0x6F36: 0x93D8, + 0x6F37: 0x93C3, + 0x6F38: 0x93DD, + 0x6F39: 0x93D0, + 0x6F3A: 0x93C8, + 0x6F3B: 0x93E4, + 0x6F3C: 0x941A, + 0x6F3D: 0x9414, + 0x6F3E: 0x9413, + 0x6F3F: 0x9403, + 0x6F40: 0x9407, + 0x6F41: 0x9410, + 0x6F42: 0x9436, + 0x6F43: 0x942B, + 0x6F44: 0x9435, + 0x6F45: 0x9421, + 0x6F46: 0x943A, + 0x6F47: 0x9441, + 0x6F48: 0x9452, + 0x6F49: 0x9444, + 0x6F4A: 0x945B, + 0x6F4B: 0x9460, + 0x6F4C: 0x9462, + 0x6F4D: 0x945E, + 0x6F4E: 0x946A, + 0x6F4F: 0x9229, + 0x6F50: 0x9470, + 0x6F51: 0x9475, + 0x6F52: 0x9477, + 0x6F53: 0x947D, + 0x6F54: 0x945A, + 0x6F55: 0x947C, + 0x6F56: 0x947E, + 0x6F57: 0x9481, + 0x6F58: 0x947F, + 0x6F59: 0x9582, + 0x6F5A: 0x9587, + 0x6F5B: 0x958A, + 0x6F5C: 0x9594, + 0x6F5D: 0x9596, + 0x6F5E: 0x9598, + 0x6F5F: 0x9599, + 0x6F60: 0x95A0, + 0x6F61: 0x95A8, + 0x6F62: 0x95A7, + 0x6F63: 0x95AD, + 0x6F64: 0x95BC, + 0x6F65: 0x95BB, + 0x6F66: 0x95B9, + 0x6F67: 0x95BE, + 0x6F68: 0x95CA, + 0x6F69: 0x6FF6, + 0x6F6A: 0x95C3, + 0x6F6B: 0x95CD, + 0x6F6C: 0x95CC, + 0x6F6D: 0x95D5, + 0x6F6E: 0x95D4, + 0x6F6F: 0x95D6, + 0x6F70: 0x95DC, + 0x6F71: 0x95E1, + 0x6F72: 0x95E5, + 0x6F73: 0x95E2, + 0x6F74: 0x9621, + 0x6F75: 0x9628, + 0x6F76: 0x962E, + 0x6F77: 0x962F, + 0x6F78: 0x9642, + 0x6F79: 0x964C, + 0x6F7A: 0x964F, + 0x6F7B: 0x964B, + 0x6F7C: 0x9677, + 0x6F7D: 0x965C, + 0x6F7E: 0x965E, + 0x7021: 0x965D, + 0x7022: 0x965F, + 0x7023: 0x9666, + 0x7024: 0x9672, + 0x7025: 0x966C, + 0x7026: 0x968D, + 0x7027: 0x9698, + 0x7028: 0x9695, + 0x7029: 0x9697, + 0x702A: 0x96AA, + 0x702B: 0x96A7, + 0x702C: 0x96B1, + 0x702D: 0x96B2, + 0x702E: 0x96B0, + 0x702F: 0x96B4, + 0x7030: 0x96B6, + 0x7031: 0x96B8, + 0x7032: 0x96B9, + 0x7033: 0x96CE, + 0x7034: 0x96CB, + 0x7035: 0x96C9, + 0x7036: 0x96CD, + 0x7037: 0x894D, + 0x7038: 0x96DC, + 0x7039: 0x970D, + 0x703A: 0x96D5, + 0x703B: 0x96F9, + 0x703C: 0x9704, + 0x703D: 0x9706, + 0x703E: 0x9708, + 0x703F: 0x9713, + 0x7040: 0x970E, + 0x7041: 0x9711, + 0x7042: 0x970F, + 0x7043: 0x9716, + 0x7044: 0x9719, + 0x7045: 0x9724, + 0x7046: 0x972A, + 0x7047: 0x9730, + 0x7048: 0x9739, + 0x7049: 0x973D, + 0x704A: 0x973E, + 0x704B: 0x9744, + 0x704C: 0x9746, + 0x704D: 0x9748, + 0x704E: 0x9742, + 0x704F: 0x9749, + 0x7050: 0x975C, + 0x7051: 0x9760, + 0x7052: 0x9764, + 0x7053: 0x9766, + 0x7054: 0x9768, + 0x7055: 0x52D2, + 0x7056: 0x976B, + 0x7057: 0x9771, + 0x7058: 0x9779, + 0x7059: 0x9785, + 0x705A: 0x977C, + 0x705B: 0x9781, + 0x705C: 0x977A, + 0x705D: 0x9786, + 0x705E: 0x978B, + 0x705F: 0x978F, + 0x7060: 0x9790, + 0x7061: 0x979C, + 0x7062: 0x97A8, + 0x7063: 0x97A6, + 0x7064: 0x97A3, + 0x7065: 0x97B3, + 0x7066: 0x97B4, + 0x7067: 0x97C3, + 0x7068: 0x97C6, + 0x7069: 0x97C8, + 0x706A: 0x97CB, + 0x706B: 0x97DC, + 0x706C: 0x97ED, + 0x706D: 0x9F4F, + 0x706E: 0x97F2, + 0x706F: 0x7ADF, + 0x7070: 0x97F6, + 0x7071: 0x97F5, + 0x7072: 0x980F, + 0x7073: 0x980C, + 0x7074: 0x9838, + 0x7075: 0x9824, + 0x7076: 0x9821, + 0x7077: 0x9837, + 0x7078: 0x983D, + 0x7079: 0x9846, + 0x707A: 0x984F, + 0x707B: 0x984B, + 0x707C: 0x986B, + 0x707D: 0x986F, + 0x707E: 0x9870, + 0x7121: 0x9871, + 0x7122: 0x9874, + 0x7123: 0x9873, + 0x7124: 0x98AA, + 0x7125: 0x98AF, + 0x7126: 0x98B1, + 0x7127: 0x98B6, + 0x7128: 0x98C4, + 0x7129: 0x98C3, + 0x712A: 0x98C6, + 0x712B: 0x98E9, + 0x712C: 0x98EB, + 0x712D: 0x9903, + 0x712E: 0x9909, + 0x712F: 0x9912, + 0x7130: 0x9914, + 0x7131: 0x9918, + 0x7132: 0x9921, + 0x7133: 0x991D, + 0x7134: 0x991E, + 0x7135: 0x9924, + 0x7136: 0x9920, + 0x7137: 0x992C, + 0x7138: 0x992E, + 0x7139: 0x993D, + 0x713A: 0x993E, + 0x713B: 0x9942, + 0x713C: 0x9949, + 0x713D: 0x9945, + 0x713E: 0x9950, + 0x713F: 0x994B, + 0x7140: 0x9951, + 0x7141: 0x9952, + 0x7142: 0x994C, + 0x7143: 0x9955, + 0x7144: 0x9997, + 0x7145: 0x9998, + 0x7146: 0x99A5, + 0x7147: 0x99AD, + 0x7148: 0x99AE, + 0x7149: 0x99BC, + 0x714A: 0x99DF, + 0x714B: 0x99DB, + 0x714C: 0x99DD, + 0x714D: 0x99D8, + 0x714E: 0x99D1, + 0x714F: 0x99ED, + 0x7150: 0x99EE, + 0x7151: 0x99F1, + 0x7152: 0x99F2, + 0x7153: 0x99FB, + 0x7154: 0x99F8, + 0x7155: 0x9A01, + 0x7156: 0x9A0F, + 0x7157: 0x9A05, + 0x7158: 0x99E2, + 0x7159: 0x9A19, + 0x715A: 0x9A2B, + 0x715B: 0x9A37, + 0x715C: 0x9A45, + 0x715D: 0x9A42, + 0x715E: 0x9A40, + 0x715F: 0x9A43, + 0x7160: 0x9A3E, + 0x7161: 0x9A55, + 0x7162: 0x9A4D, + 0x7163: 0x9A5B, + 0x7164: 0x9A57, + 0x7165: 0x9A5F, + 0x7166: 0x9A62, + 0x7167: 0x9A65, + 0x7168: 0x9A64, + 0x7169: 0x9A69, + 0x716A: 0x9A6B, + 0x716B: 0x9A6A, + 0x716C: 0x9AAD, + 0x716D: 0x9AB0, + 0x716E: 0x9ABC, + 0x716F: 0x9AC0, + 0x7170: 0x9ACF, + 0x7171: 0x9AD1, + 0x7172: 0x9AD3, + 0x7173: 0x9AD4, + 0x7174: 0x9ADE, + 0x7175: 0x9ADF, + 0x7176: 0x9AE2, + 0x7177: 0x9AE3, + 0x7178: 0x9AE6, + 0x7179: 0x9AEF, + 0x717A: 0x9AEB, + 0x717B: 0x9AEE, + 0x717C: 0x9AF4, + 0x717D: 0x9AF1, + 0x717E: 0x9AF7, + 0x7221: 0x9AFB, + 0x7222: 0x9B06, + 0x7223: 0x9B18, + 0x7224: 0x9B1A, + 0x7225: 0x9B1F, + 0x7226: 0x9B22, + 0x7227: 0x9B23, + 0x7228: 0x9B25, + 0x7229: 0x9B27, + 0x722A: 0x9B28, + 0x722B: 0x9B29, + 0x722C: 0x9B2A, + 0x722D: 0x9B2E, + 0x722E: 0x9B2F, + 0x722F: 0x9B32, + 0x7230: 0x9B44, + 0x7231: 0x9B43, + 0x7232: 0x9B4F, + 0x7233: 0x9B4D, + 0x7234: 0x9B4E, + 0x7235: 0x9B51, + 0x7236: 0x9B58, + 0x7237: 0x9B74, + 0x7238: 0x9B93, + 0x7239: 0x9B83, + 0x723A: 0x9B91, + 0x723B: 0x9B96, + 0x723C: 0x9B97, + 0x723D: 0x9B9F, + 0x723E: 0x9BA0, + 0x723F: 0x9BA8, + 0x7240: 0x9BB4, + 0x7241: 0x9BC0, + 0x7242: 0x9BCA, + 0x7243: 0x9BB9, + 0x7244: 0x9BC6, + 0x7245: 0x9BCF, + 0x7246: 0x9BD1, + 0x7247: 0x9BD2, + 0x7248: 0x9BE3, + 0x7249: 0x9BE2, + 0x724A: 0x9BE4, + 0x724B: 0x9BD4, + 0x724C: 0x9BE1, + 0x724D: 0x9C3A, + 0x724E: 0x9BF2, + 0x724F: 0x9BF1, + 0x7250: 0x9BF0, + 0x7251: 0x9C15, + 0x7252: 0x9C14, + 0x7253: 0x9C09, + 0x7254: 0x9C13, + 0x7255: 0x9C0C, + 0x7256: 0x9C06, + 0x7257: 0x9C08, + 0x7258: 0x9C12, + 0x7259: 0x9C0A, + 0x725A: 0x9C04, + 0x725B: 0x9C2E, + 0x725C: 0x9C1B, + 0x725D: 0x9C25, + 0x725E: 0x9C24, + 0x725F: 0x9C21, + 0x7260: 0x9C30, + 0x7261: 0x9C47, + 0x7262: 0x9C32, + 0x7263: 0x9C46, + 0x7264: 0x9C3E, + 0x7265: 0x9C5A, + 0x7266: 0x9C60, + 0x7267: 0x9C67, + 0x7268: 0x9C76, + 0x7269: 0x9C78, + 0x726A: 0x9CE7, + 0x726B: 0x9CEC, + 0x726C: 0x9CF0, + 0x726D: 0x9D09, + 0x726E: 0x9D08, + 0x726F: 0x9CEB, + 0x7270: 0x9D03, + 0x7271: 0x9D06, + 0x7272: 0x9D2A, + 0x7273: 0x9D26, + 0x7274: 0x9DAF, + 0x7275: 0x9D23, + 0x7276: 0x9D1F, + 0x7277: 0x9D44, + 0x7278: 0x9D15, + 0x7279: 0x9D12, + 0x727A: 0x9D41, + 0x727B: 0x9D3F, + 0x727C: 0x9D3E, + 0x727D: 0x9D46, + 0x727E: 0x9D48, + 0x7321: 0x9D5D, + 0x7322: 0x9D5E, + 0x7323: 0x9D64, + 0x7324: 0x9D51, + 0x7325: 0x9D50, + 0x7326: 0x9D59, + 0x7327: 0x9D72, + 0x7328: 0x9D89, + 0x7329: 0x9D87, + 0x732A: 0x9DAB, + 0x732B: 0x9D6F, + 0x732C: 0x9D7A, + 0x732D: 0x9D9A, + 0x732E: 0x9DA4, + 0x732F: 0x9DA9, + 0x7330: 0x9DB2, + 0x7331: 0x9DC4, + 0x7332: 0x9DC1, + 0x7333: 0x9DBB, + 0x7334: 0x9DB8, + 0x7335: 0x9DBA, + 0x7336: 0x9DC6, + 0x7337: 0x9DCF, + 0x7338: 0x9DC2, + 0x7339: 0x9DD9, + 0x733A: 0x9DD3, + 0x733B: 0x9DF8, + 0x733C: 0x9DE6, + 0x733D: 0x9DED, + 0x733E: 0x9DEF, + 0x733F: 0x9DFD, + 0x7340: 0x9E1A, + 0x7341: 0x9E1B, + 0x7342: 0x9E1E, + 0x7343: 0x9E75, + 0x7344: 0x9E79, + 0x7345: 0x9E7D, + 0x7346: 0x9E81, + 0x7347: 0x9E88, + 0x7348: 0x9E8B, + 0x7349: 0x9E8C, + 0x734A: 0x9E92, + 0x734B: 0x9E95, + 0x734C: 0x9E91, + 0x734D: 0x9E9D, + 0x734E: 0x9EA5, + 0x734F: 0x9EA9, + 0x7350: 0x9EB8, + 0x7351: 0x9EAA, + 0x7352: 0x9EAD, + 0x7353: 0x9761, + 0x7354: 0x9ECC, + 0x7355: 0x9ECE, + 0x7356: 0x9ECF, + 0x7357: 0x9ED0, + 0x7358: 0x9ED4, + 0x7359: 0x9EDC, + 0x735A: 0x9EDE, + 0x735B: 0x9EDD, + 0x735C: 0x9EE0, + 0x735D: 0x9EE5, + 0x735E: 0x9EE8, + 0x735F: 0x9EEF, + 0x7360: 0x9EF4, + 0x7361: 0x9EF6, + 0x7362: 0x9EF7, + 0x7363: 0x9EF9, + 0x7364: 0x9EFB, + 0x7365: 0x9EFC, + 0x7366: 0x9EFD, + 0x7367: 0x9F07, + 0x7368: 0x9F08, + 0x7369: 0x76B7, + 0x736A: 0x9F15, + 0x736B: 0x9F21, + 0x736C: 0x9F2C, + 0x736D: 0x9F3E, + 0x736E: 0x9F4A, + 0x736F: 0x9F52, + 0x7370: 0x9F54, + 0x7371: 0x9F63, + 0x7372: 0x9F5F, + 0x7373: 0x9F60, + 0x7374: 0x9F61, + 0x7375: 0x9F66, + 0x7376: 0x9F67, + 0x7377: 0x9F6C, + 0x7378: 0x9F6A, + 0x7379: 0x9F77, + 0x737A: 0x9F72, + 0x737B: 0x9F76, + 0x737C: 0x9F95, + 0x737D: 0x9F9C, + 0x737E: 0x9FA0, + 0x7421: 0x582F, + 0x7422: 0x69C7, + 0x7423: 0x9059, + 0x7424: 0x7464, + 0x7425: 0x51DC, + 0x7426: 0x7199, +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/jis0212-data.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/jis0212-data.go new file mode 100644 index 0000000000000000000000000000000000000000..89701868344db5ec4851e55ab55f875335c7c398 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/jis0212-data.go @@ -0,0 +1,6071 @@ +package mahonia + +var jis0212ToUnicode = [65536]uint16{ + 0x222F: 0x02D8, // BREVE + 0x2230: 0x02C7, // CARON (Mandarin Chinese third tone) + 0x2231: 0x00B8, // CEDILLA + 0x2232: 0x02D9, // DOT ABOVE (Mandarin Chinese light tone) + 0x2233: 0x02DD, // DOUBLE ACUTE ACCENT + 0x2234: 0x00AF, // MACRON + 0x2235: 0x02DB, // OGONEK + 0x2236: 0x02DA, // RING ABOVE + 0x2237: 0x007E, // TILDE + 0x2238: 0x0384, // GREEK TONOS + 0x2239: 0x0385, // GREEK DIALYTIKA TONOS + 0x2242: 0x00A1, // INVERTED EXCLAMATION MARK + 0x2243: 0x00A6, // BROKEN BAR + 0x2244: 0x00BF, // INVERTED QUESTION MARK + 0x226B: 0x00BA, // MASCULINE ORDINAL INDICATOR + 0x226C: 0x00AA, // FEMININE ORDINAL INDICATOR + 0x226D: 0x00A9, // COPYRIGHT SIGN + 0x226E: 0x00AE, // REGISTERED SIGN + 0x226F: 0x2122, // TRADE MARK SIGN + 0x2270: 0x00A4, // CURRENCY SIGN + 0x2271: 0x2116, // NUMERO SIGN + 0x2661: 0x0386, // GREEK CAPITAL LETTER ALPHA WITH TONOS + 0x2662: 0x0388, // GREEK CAPITAL LETTER EPSILON WITH TONOS + 0x2663: 0x0389, // GREEK CAPITAL LETTER ETA WITH TONOS + 0x2664: 0x038A, // GREEK CAPITAL LETTER IOTA WITH TONOS + 0x2665: 0x03AA, // GREEK CAPITAL LETTER IOTA WITH DIALYTIKA + 0x2667: 0x038C, // GREEK CAPITAL LETTER OMICRON WITH TONOS + 0x2669: 0x038E, // GREEK CAPITAL LETTER UPSILON WITH TONOS + 0x266A: 0x03AB, // GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA + 0x266C: 0x038F, // GREEK CAPITAL LETTER OMEGA WITH TONOS + 0x2671: 0x03AC, // GREEK SMALL LETTER ALPHA WITH TONOS + 0x2672: 0x03AD, // GREEK SMALL LETTER EPSILON WITH TONOS + 0x2673: 0x03AE, // GREEK SMALL LETTER ETA WITH TONOS + 0x2674: 0x03AF, // GREEK SMALL LETTER IOTA WITH TONOS + 0x2675: 0x03CA, // GREEK SMALL LETTER IOTA WITH DIALYTIKA + 0x2676: 0x0390, // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS + 0x2677: 0x03CC, // GREEK SMALL LETTER OMICRON WITH TONOS + 0x2678: 0x03C2, // GREEK SMALL LETTER FINAL SIGMA + 0x2679: 0x03CD, // GREEK SMALL LETTER UPSILON WITH TONOS + 0x267A: 0x03CB, // GREEK SMALL LETTER UPSILON WITH DIALYTIKA + 0x267B: 0x03B0, // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS + 0x267C: 0x03CE, // GREEK SMALL LETTER OMEGA WITH TONOS + 0x2742: 0x0402, // CYRILLIC CAPITAL LETTER DJE + 0x2743: 0x0403, // CYRILLIC CAPITAL LETTER GJE + 0x2744: 0x0404, // CYRILLIC CAPITAL LETTER UKRAINIAN IE + 0x2745: 0x0405, // CYRILLIC CAPITAL LETTER DZE + 0x2746: 0x0406, // CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I + 0x2747: 0x0407, // CYRILLIC CAPITAL LETTER YI + 0x2748: 0x0408, // CYRILLIC CAPITAL LETTER JE + 0x2749: 0x0409, // CYRILLIC CAPITAL LETTER LJE + 0x274A: 0x040A, // CYRILLIC CAPITAL LETTER NJE + 0x274B: 0x040B, // CYRILLIC CAPITAL LETTER TSHE + 0x274C: 0x040C, // CYRILLIC CAPITAL LETTER KJE + 0x274D: 0x040E, // CYRILLIC CAPITAL LETTER SHORT U + 0x274E: 0x040F, // CYRILLIC CAPITAL LETTER DZHE + 0x2772: 0x0452, // CYRILLIC SMALL LETTER DJE + 0x2773: 0x0453, // CYRILLIC SMALL LETTER GJE + 0x2774: 0x0454, // CYRILLIC SMALL LETTER UKRAINIAN IE + 0x2775: 0x0455, // CYRILLIC SMALL LETTER DZE + 0x2776: 0x0456, // CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + 0x2777: 0x0457, // CYRILLIC SMALL LETTER YI + 0x2778: 0x0458, // CYRILLIC SMALL LETTER JE + 0x2779: 0x0459, // CYRILLIC SMALL LETTER LJE + 0x277A: 0x045A, // CYRILLIC SMALL LETTER NJE + 0x277B: 0x045B, // CYRILLIC SMALL LETTER TSHE + 0x277C: 0x045C, // CYRILLIC SMALL LETTER KJE + 0x277D: 0x045E, // CYRILLIC SMALL LETTER SHORT U + 0x277E: 0x045F, // CYRILLIC SMALL LETTER DZHE + 0x2921: 0x00C6, // LATIN CAPITAL LIGATURE AE + 0x2922: 0x0110, // LATIN CAPITAL LETTER D WITH STROKE + 0x2924: 0x0126, // LATIN CAPITAL LETTER H WITH STROKE + 0x2926: 0x0132, // LATIN CAPITAL LIGATURE IJ + 0x2928: 0x0141, // LATIN CAPITAL LETTER L WITH STROKE + 0x2929: 0x013F, // LATIN CAPITAL LETTER L WITH MIDDLE DOT + 0x292B: 0x014A, // LATIN CAPITAL LETTER ENG + 0x292C: 0x00D8, // LATIN CAPITAL LETTER O WITH STROKE + 0x292D: 0x0152, // LATIN CAPITAL LIGATURE OE + 0x292F: 0x0166, // LATIN CAPITAL LETTER T WITH STROKE + 0x2930: 0x00DE, // LATIN CAPITAL LETTER THORN + 0x2941: 0x00E6, // LATIN SMALL LIGATURE AE + 0x2942: 0x0111, // LATIN SMALL LETTER D WITH STROKE + 0x2943: 0x00F0, // LATIN SMALL LETTER ETH + 0x2944: 0x0127, // LATIN SMALL LETTER H WITH STROKE + 0x2945: 0x0131, // LATIN SMALL LETTER DOTLESS I + 0x2946: 0x0133, // LATIN SMALL LIGATURE IJ + 0x2947: 0x0138, // LATIN SMALL LETTER KRA + 0x2948: 0x0142, // LATIN SMALL LETTER L WITH STROKE + 0x2949: 0x0140, // LATIN SMALL LETTER L WITH MIDDLE DOT + 0x294A: 0x0149, // LATIN SMALL LETTER N PRECEDED BY APOSTROPHE + 0x294B: 0x014B, // LATIN SMALL LETTER ENG + 0x294C: 0x00F8, // LATIN SMALL LETTER O WITH STROKE + 0x294D: 0x0153, // LATIN SMALL LIGATURE OE + 0x294E: 0x00DF, // LATIN SMALL LETTER SHARP S + 0x294F: 0x0167, // LATIN SMALL LETTER T WITH STROKE + 0x2950: 0x00FE, // LATIN SMALL LETTER THORN + 0x2A21: 0x00C1, // LATIN CAPITAL LETTER A WITH ACUTE + 0x2A22: 0x00C0, // LATIN CAPITAL LETTER A WITH GRAVE + 0x2A23: 0x00C4, // LATIN CAPITAL LETTER A WITH DIAERESIS + 0x2A24: 0x00C2, // LATIN CAPITAL LETTER A WITH CIRCUMFLEX + 0x2A25: 0x0102, // LATIN CAPITAL LETTER A WITH BREVE + 0x2A26: 0x01CD, // LATIN CAPITAL LETTER A WITH CARON + 0x2A27: 0x0100, // LATIN CAPITAL LETTER A WITH MACRON + 0x2A28: 0x0104, // LATIN CAPITAL LETTER A WITH OGONEK + 0x2A29: 0x00C5, // LATIN CAPITAL LETTER A WITH RING ABOVE + 0x2A2A: 0x00C3, // LATIN CAPITAL LETTER A WITH TILDE + 0x2A2B: 0x0106, // LATIN CAPITAL LETTER C WITH ACUTE + 0x2A2C: 0x0108, // LATIN CAPITAL LETTER C WITH CIRCUMFLEX + 0x2A2D: 0x010C, // LATIN CAPITAL LETTER C WITH CARON + 0x2A2E: 0x00C7, // LATIN CAPITAL LETTER C WITH CEDILLA + 0x2A2F: 0x010A, // LATIN CAPITAL LETTER C WITH DOT ABOVE + 0x2A30: 0x010E, // LATIN CAPITAL LETTER D WITH CARON + 0x2A31: 0x00C9, // LATIN CAPITAL LETTER E WITH ACUTE + 0x2A32: 0x00C8, // LATIN CAPITAL LETTER E WITH GRAVE + 0x2A33: 0x00CB, // LATIN CAPITAL LETTER E WITH DIAERESIS + 0x2A34: 0x00CA, // LATIN CAPITAL LETTER E WITH CIRCUMFLEX + 0x2A35: 0x011A, // LATIN CAPITAL LETTER E WITH CARON + 0x2A36: 0x0116, // LATIN CAPITAL LETTER E WITH DOT ABOVE + 0x2A37: 0x0112, // LATIN CAPITAL LETTER E WITH MACRON + 0x2A38: 0x0118, // LATIN CAPITAL LETTER E WITH OGONEK + 0x2A3A: 0x011C, // LATIN CAPITAL LETTER G WITH CIRCUMFLEX + 0x2A3B: 0x011E, // LATIN CAPITAL LETTER G WITH BREVE + 0x2A3C: 0x0122, // LATIN CAPITAL LETTER G WITH CEDILLA + 0x2A3D: 0x0120, // LATIN CAPITAL LETTER G WITH DOT ABOVE + 0x2A3E: 0x0124, // LATIN CAPITAL LETTER H WITH CIRCUMFLEX + 0x2A3F: 0x00CD, // LATIN CAPITAL LETTER I WITH ACUTE + 0x2A40: 0x00CC, // LATIN CAPITAL LETTER I WITH GRAVE + 0x2A41: 0x00CF, // LATIN CAPITAL LETTER I WITH DIAERESIS + 0x2A42: 0x00CE, // LATIN CAPITAL LETTER I WITH CIRCUMFLEX + 0x2A43: 0x01CF, // LATIN CAPITAL LETTER I WITH CARON + 0x2A44: 0x0130, // LATIN CAPITAL LETTER I WITH DOT ABOVE + 0x2A45: 0x012A, // LATIN CAPITAL LETTER I WITH MACRON + 0x2A46: 0x012E, // LATIN CAPITAL LETTER I WITH OGONEK + 0x2A47: 0x0128, // LATIN CAPITAL LETTER I WITH TILDE + 0x2A48: 0x0134, // LATIN CAPITAL LETTER J WITH CIRCUMFLEX + 0x2A49: 0x0136, // LATIN CAPITAL LETTER K WITH CEDILLA + 0x2A4A: 0x0139, // LATIN CAPITAL LETTER L WITH ACUTE + 0x2A4B: 0x013D, // LATIN CAPITAL LETTER L WITH CARON + 0x2A4C: 0x013B, // LATIN CAPITAL LETTER L WITH CEDILLA + 0x2A4D: 0x0143, // LATIN CAPITAL LETTER N WITH ACUTE + 0x2A4E: 0x0147, // LATIN CAPITAL LETTER N WITH CARON + 0x2A4F: 0x0145, // LATIN CAPITAL LETTER N WITH CEDILLA + 0x2A50: 0x00D1, // LATIN CAPITAL LETTER N WITH TILDE + 0x2A51: 0x00D3, // LATIN CAPITAL LETTER O WITH ACUTE + 0x2A52: 0x00D2, // LATIN CAPITAL LETTER O WITH GRAVE + 0x2A53: 0x00D6, // LATIN CAPITAL LETTER O WITH DIAERESIS + 0x2A54: 0x00D4, // LATIN CAPITAL LETTER O WITH CIRCUMFLEX + 0x2A55: 0x01D1, // LATIN CAPITAL LETTER O WITH CARON + 0x2A56: 0x0150, // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE + 0x2A57: 0x014C, // LATIN CAPITAL LETTER O WITH MACRON + 0x2A58: 0x00D5, // LATIN CAPITAL LETTER O WITH TILDE + 0x2A59: 0x0154, // LATIN CAPITAL LETTER R WITH ACUTE + 0x2A5A: 0x0158, // LATIN CAPITAL LETTER R WITH CARON + 0x2A5B: 0x0156, // LATIN CAPITAL LETTER R WITH CEDILLA + 0x2A5C: 0x015A, // LATIN CAPITAL LETTER S WITH ACUTE + 0x2A5D: 0x015C, // LATIN CAPITAL LETTER S WITH CIRCUMFLEX + 0x2A5E: 0x0160, // LATIN CAPITAL LETTER S WITH CARON + 0x2A5F: 0x015E, // LATIN CAPITAL LETTER S WITH CEDILLA + 0x2A60: 0x0164, // LATIN CAPITAL LETTER T WITH CARON + 0x2A61: 0x0162, // LATIN CAPITAL LETTER T WITH CEDILLA + 0x2A62: 0x00DA, // LATIN CAPITAL LETTER U WITH ACUTE + 0x2A63: 0x00D9, // LATIN CAPITAL LETTER U WITH GRAVE + 0x2A64: 0x00DC, // LATIN CAPITAL LETTER U WITH DIAERESIS + 0x2A65: 0x00DB, // LATIN CAPITAL LETTER U WITH CIRCUMFLEX + 0x2A66: 0x016C, // LATIN CAPITAL LETTER U WITH BREVE + 0x2A67: 0x01D3, // LATIN CAPITAL LETTER U WITH CARON + 0x2A68: 0x0170, // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE + 0x2A69: 0x016A, // LATIN CAPITAL LETTER U WITH MACRON + 0x2A6A: 0x0172, // LATIN CAPITAL LETTER U WITH OGONEK + 0x2A6B: 0x016E, // LATIN CAPITAL LETTER U WITH RING ABOVE + 0x2A6C: 0x0168, // LATIN CAPITAL LETTER U WITH TILDE + 0x2A6D: 0x01D7, // LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE + 0x2A6E: 0x01DB, // LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE + 0x2A6F: 0x01D9, // LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON + 0x2A70: 0x01D5, // LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON + 0x2A71: 0x0174, // LATIN CAPITAL LETTER W WITH CIRCUMFLEX + 0x2A72: 0x00DD, // LATIN CAPITAL LETTER Y WITH ACUTE + 0x2A73: 0x0178, // LATIN CAPITAL LETTER Y WITH DIAERESIS + 0x2A74: 0x0176, // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX + 0x2A75: 0x0179, // LATIN CAPITAL LETTER Z WITH ACUTE + 0x2A76: 0x017D, // LATIN CAPITAL LETTER Z WITH CARON + 0x2A77: 0x017B, // LATIN CAPITAL LETTER Z WITH DOT ABOVE + 0x2B21: 0x00E1, // LATIN SMALL LETTER A WITH ACUTE + 0x2B22: 0x00E0, // LATIN SMALL LETTER A WITH GRAVE + 0x2B23: 0x00E4, // LATIN SMALL LETTER A WITH DIAERESIS + 0x2B24: 0x00E2, // LATIN SMALL LETTER A WITH CIRCUMFLEX + 0x2B25: 0x0103, // LATIN SMALL LETTER A WITH BREVE + 0x2B26: 0x01CE, // LATIN SMALL LETTER A WITH CARON + 0x2B27: 0x0101, // LATIN SMALL LETTER A WITH MACRON + 0x2B28: 0x0105, // LATIN SMALL LETTER A WITH OGONEK + 0x2B29: 0x00E5, // LATIN SMALL LETTER A WITH RING ABOVE + 0x2B2A: 0x00E3, // LATIN SMALL LETTER A WITH TILDE + 0x2B2B: 0x0107, // LATIN SMALL LETTER C WITH ACUTE + 0x2B2C: 0x0109, // LATIN SMALL LETTER C WITH CIRCUMFLEX + 0x2B2D: 0x010D, // LATIN SMALL LETTER C WITH CARON + 0x2B2E: 0x00E7, // LATIN SMALL LETTER C WITH CEDILLA + 0x2B2F: 0x010B, // LATIN SMALL LETTER C WITH DOT ABOVE + 0x2B30: 0x010F, // LATIN SMALL LETTER D WITH CARON + 0x2B31: 0x00E9, // LATIN SMALL LETTER E WITH ACUTE + 0x2B32: 0x00E8, // LATIN SMALL LETTER E WITH GRAVE + 0x2B33: 0x00EB, // LATIN SMALL LETTER E WITH DIAERESIS + 0x2B34: 0x00EA, // LATIN SMALL LETTER E WITH CIRCUMFLEX + 0x2B35: 0x011B, // LATIN SMALL LETTER E WITH CARON + 0x2B36: 0x0117, // LATIN SMALL LETTER E WITH DOT ABOVE + 0x2B37: 0x0113, // LATIN SMALL LETTER E WITH MACRON + 0x2B38: 0x0119, // LATIN SMALL LETTER E WITH OGONEK + 0x2B39: 0x01F5, // LATIN SMALL LETTER G WITH ACUTE + 0x2B3A: 0x011D, // LATIN SMALL LETTER G WITH CIRCUMFLEX + 0x2B3B: 0x011F, // LATIN SMALL LETTER G WITH BREVE + 0x2B3D: 0x0121, // LATIN SMALL LETTER G WITH DOT ABOVE + 0x2B3E: 0x0125, // LATIN SMALL LETTER H WITH CIRCUMFLEX + 0x2B3F: 0x00ED, // LATIN SMALL LETTER I WITH ACUTE + 0x2B40: 0x00EC, // LATIN SMALL LETTER I WITH GRAVE + 0x2B41: 0x00EF, // LATIN SMALL LETTER I WITH DIAERESIS + 0x2B42: 0x00EE, // LATIN SMALL LETTER I WITH CIRCUMFLEX + 0x2B43: 0x01D0, // LATIN SMALL LETTER I WITH CARON + 0x2B45: 0x012B, // LATIN SMALL LETTER I WITH MACRON + 0x2B46: 0x012F, // LATIN SMALL LETTER I WITH OGONEK + 0x2B47: 0x0129, // LATIN SMALL LETTER I WITH TILDE + 0x2B48: 0x0135, // LATIN SMALL LETTER J WITH CIRCUMFLEX + 0x2B49: 0x0137, // LATIN SMALL LETTER K WITH CEDILLA + 0x2B4A: 0x013A, // LATIN SMALL LETTER L WITH ACUTE + 0x2B4B: 0x013E, // LATIN SMALL LETTER L WITH CARON + 0x2B4C: 0x013C, // LATIN SMALL LETTER L WITH CEDILLA + 0x2B4D: 0x0144, // LATIN SMALL LETTER N WITH ACUTE + 0x2B4E: 0x0148, // LATIN SMALL LETTER N WITH CARON + 0x2B4F: 0x0146, // LATIN SMALL LETTER N WITH CEDILLA + 0x2B50: 0x00F1, // LATIN SMALL LETTER N WITH TILDE + 0x2B51: 0x00F3, // LATIN SMALL LETTER O WITH ACUTE + 0x2B52: 0x00F2, // LATIN SMALL LETTER O WITH GRAVE + 0x2B53: 0x00F6, // LATIN SMALL LETTER O WITH DIAERESIS + 0x2B54: 0x00F4, // LATIN SMALL LETTER O WITH CIRCUMFLEX + 0x2B55: 0x01D2, // LATIN SMALL LETTER O WITH CARON + 0x2B56: 0x0151, // LATIN SMALL LETTER O WITH DOUBLE ACUTE + 0x2B57: 0x014D, // LATIN SMALL LETTER O WITH MACRON + 0x2B58: 0x00F5, // LATIN SMALL LETTER O WITH TILDE + 0x2B59: 0x0155, // LATIN SMALL LETTER R WITH ACUTE + 0x2B5A: 0x0159, // LATIN SMALL LETTER R WITH CARON + 0x2B5B: 0x0157, // LATIN SMALL LETTER R WITH CEDILLA + 0x2B5C: 0x015B, // LATIN SMALL LETTER S WITH ACUTE + 0x2B5D: 0x015D, // LATIN SMALL LETTER S WITH CIRCUMFLEX + 0x2B5E: 0x0161, // LATIN SMALL LETTER S WITH CARON + 0x2B5F: 0x015F, // LATIN SMALL LETTER S WITH CEDILLA + 0x2B60: 0x0165, // LATIN SMALL LETTER T WITH CARON + 0x2B61: 0x0163, // LATIN SMALL LETTER T WITH CEDILLA + 0x2B62: 0x00FA, // LATIN SMALL LETTER U WITH ACUTE + 0x2B63: 0x00F9, // LATIN SMALL LETTER U WITH GRAVE + 0x2B64: 0x00FC, // LATIN SMALL LETTER U WITH DIAERESIS + 0x2B65: 0x00FB, // LATIN SMALL LETTER U WITH CIRCUMFLEX + 0x2B66: 0x016D, // LATIN SMALL LETTER U WITH BREVE + 0x2B67: 0x01D4, // LATIN SMALL LETTER U WITH CARON + 0x2B68: 0x0171, // LATIN SMALL LETTER U WITH DOUBLE ACUTE + 0x2B69: 0x016B, // LATIN SMALL LETTER U WITH MACRON + 0x2B6A: 0x0173, // LATIN SMALL LETTER U WITH OGONEK + 0x2B6B: 0x016F, // LATIN SMALL LETTER U WITH RING ABOVE + 0x2B6C: 0x0169, // LATIN SMALL LETTER U WITH TILDE + 0x2B6D: 0x01D8, // LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE + 0x2B6E: 0x01DC, // LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE + 0x2B6F: 0x01DA, // LATIN SMALL LETTER U WITH DIAERESIS AND CARON + 0x2B70: 0x01D6, // LATIN SMALL LETTER U WITH DIAERESIS AND MACRON + 0x2B71: 0x0175, // LATIN SMALL LETTER W WITH CIRCUMFLEX + 0x2B72: 0x00FD, // LATIN SMALL LETTER Y WITH ACUTE + 0x2B73: 0x00FF, // LATIN SMALL LETTER Y WITH DIAERESIS + 0x2B74: 0x0177, // LATIN SMALL LETTER Y WITH CIRCUMFLEX + 0x2B75: 0x017A, // LATIN SMALL LETTER Z WITH ACUTE + 0x2B76: 0x017E, // LATIN SMALL LETTER Z WITH CARON + 0x2B77: 0x017C, // LATIN SMALL LETTER Z WITH DOT ABOVE + 0x3021: 0x4E02, + 0x3022: 0x4E04, + 0x3023: 0x4E05, + 0x3024: 0x4E0C, + 0x3025: 0x4E12, + 0x3026: 0x4E1F, + 0x3027: 0x4E23, + 0x3028: 0x4E24, + 0x3029: 0x4E28, + 0x302A: 0x4E2B, + 0x302B: 0x4E2E, + 0x302C: 0x4E2F, + 0x302D: 0x4E30, + 0x302E: 0x4E35, + 0x302F: 0x4E40, + 0x3030: 0x4E41, + 0x3031: 0x4E44, + 0x3032: 0x4E47, + 0x3033: 0x4E51, + 0x3034: 0x4E5A, + 0x3035: 0x4E5C, + 0x3036: 0x4E63, + 0x3037: 0x4E68, + 0x3038: 0x4E69, + 0x3039: 0x4E74, + 0x303A: 0x4E75, + 0x303B: 0x4E79, + 0x303C: 0x4E7F, + 0x303D: 0x4E8D, + 0x303E: 0x4E96, + 0x303F: 0x4E97, + 0x3040: 0x4E9D, + 0x3041: 0x4EAF, + 0x3042: 0x4EB9, + 0x3043: 0x4EC3, + 0x3044: 0x4ED0, + 0x3045: 0x4EDA, + 0x3046: 0x4EDB, + 0x3047: 0x4EE0, + 0x3048: 0x4EE1, + 0x3049: 0x4EE2, + 0x304A: 0x4EE8, + 0x304B: 0x4EEF, + 0x304C: 0x4EF1, + 0x304D: 0x4EF3, + 0x304E: 0x4EF5, + 0x304F: 0x4EFD, + 0x3050: 0x4EFE, + 0x3051: 0x4EFF, + 0x3052: 0x4F00, + 0x3053: 0x4F02, + 0x3054: 0x4F03, + 0x3055: 0x4F08, + 0x3056: 0x4F0B, + 0x3057: 0x4F0C, + 0x3058: 0x4F12, + 0x3059: 0x4F15, + 0x305A: 0x4F16, + 0x305B: 0x4F17, + 0x305C: 0x4F19, + 0x305D: 0x4F2E, + 0x305E: 0x4F31, + 0x305F: 0x4F60, + 0x3060: 0x4F33, + 0x3061: 0x4F35, + 0x3062: 0x4F37, + 0x3063: 0x4F39, + 0x3064: 0x4F3B, + 0x3065: 0x4F3E, + 0x3066: 0x4F40, + 0x3067: 0x4F42, + 0x3068: 0x4F48, + 0x3069: 0x4F49, + 0x306A: 0x4F4B, + 0x306B: 0x4F4C, + 0x306C: 0x4F52, + 0x306D: 0x4F54, + 0x306E: 0x4F56, + 0x306F: 0x4F58, + 0x3070: 0x4F5F, + 0x3071: 0x4F63, + 0x3072: 0x4F6A, + 0x3073: 0x4F6C, + 0x3074: 0x4F6E, + 0x3075: 0x4F71, + 0x3076: 0x4F77, + 0x3077: 0x4F78, + 0x3078: 0x4F79, + 0x3079: 0x4F7A, + 0x307A: 0x4F7D, + 0x307B: 0x4F7E, + 0x307C: 0x4F81, + 0x307D: 0x4F82, + 0x307E: 0x4F84, + 0x3121: 0x4F85, + 0x3122: 0x4F89, + 0x3123: 0x4F8A, + 0x3124: 0x4F8C, + 0x3125: 0x4F8E, + 0x3126: 0x4F90, + 0x3127: 0x4F92, + 0x3128: 0x4F93, + 0x3129: 0x4F94, + 0x312A: 0x4F97, + 0x312B: 0x4F99, + 0x312C: 0x4F9A, + 0x312D: 0x4F9E, + 0x312E: 0x4F9F, + 0x312F: 0x4FB2, + 0x3130: 0x4FB7, + 0x3131: 0x4FB9, + 0x3132: 0x4FBB, + 0x3133: 0x4FBC, + 0x3134: 0x4FBD, + 0x3135: 0x4FBE, + 0x3136: 0x4FC0, + 0x3137: 0x4FC1, + 0x3138: 0x4FC5, + 0x3139: 0x4FC6, + 0x313A: 0x4FC8, + 0x313B: 0x4FC9, + 0x313C: 0x4FCB, + 0x313D: 0x4FCC, + 0x313E: 0x4FCD, + 0x313F: 0x4FCF, + 0x3140: 0x4FD2, + 0x3141: 0x4FDC, + 0x3142: 0x4FE0, + 0x3143: 0x4FE2, + 0x3144: 0x4FF0, + 0x3145: 0x4FF2, + 0x3146: 0x4FFC, + 0x3147: 0x4FFD, + 0x3148: 0x4FFF, + 0x3149: 0x5000, + 0x314A: 0x5001, + 0x314B: 0x5004, + 0x314C: 0x5007, + 0x314D: 0x500A, + 0x314E: 0x500C, + 0x314F: 0x500E, + 0x3150: 0x5010, + 0x3151: 0x5013, + 0x3152: 0x5017, + 0x3153: 0x5018, + 0x3154: 0x501B, + 0x3155: 0x501C, + 0x3156: 0x501D, + 0x3157: 0x501E, + 0x3158: 0x5022, + 0x3159: 0x5027, + 0x315A: 0x502E, + 0x315B: 0x5030, + 0x315C: 0x5032, + 0x315D: 0x5033, + 0x315E: 0x5035, + 0x315F: 0x5040, + 0x3160: 0x5041, + 0x3161: 0x5042, + 0x3162: 0x5045, + 0x3163: 0x5046, + 0x3164: 0x504A, + 0x3165: 0x504C, + 0x3166: 0x504E, + 0x3167: 0x5051, + 0x3168: 0x5052, + 0x3169: 0x5053, + 0x316A: 0x5057, + 0x316B: 0x5059, + 0x316C: 0x505F, + 0x316D: 0x5060, + 0x316E: 0x5062, + 0x316F: 0x5063, + 0x3170: 0x5066, + 0x3171: 0x5067, + 0x3172: 0x506A, + 0x3173: 0x506D, + 0x3174: 0x5070, + 0x3175: 0x5071, + 0x3176: 0x503B, + 0x3177: 0x5081, + 0x3178: 0x5083, + 0x3179: 0x5084, + 0x317A: 0x5086, + 0x317B: 0x508A, + 0x317C: 0x508E, + 0x317D: 0x508F, + 0x317E: 0x5090, + 0x3221: 0x5092, + 0x3222: 0x5093, + 0x3223: 0x5094, + 0x3224: 0x5096, + 0x3225: 0x509B, + 0x3226: 0x509C, + 0x3227: 0x509E, + 0x3228: 0x509F, + 0x3229: 0x50A0, + 0x322A: 0x50A1, + 0x322B: 0x50A2, + 0x322C: 0x50AA, + 0x322D: 0x50AF, + 0x322E: 0x50B0, + 0x322F: 0x50B9, + 0x3230: 0x50BA, + 0x3231: 0x50BD, + 0x3232: 0x50C0, + 0x3233: 0x50C3, + 0x3234: 0x50C4, + 0x3235: 0x50C7, + 0x3236: 0x50CC, + 0x3237: 0x50CE, + 0x3238: 0x50D0, + 0x3239: 0x50D3, + 0x323A: 0x50D4, + 0x323B: 0x50D8, + 0x323C: 0x50DC, + 0x323D: 0x50DD, + 0x323E: 0x50DF, + 0x323F: 0x50E2, + 0x3240: 0x50E4, + 0x3241: 0x50E6, + 0x3242: 0x50E8, + 0x3243: 0x50E9, + 0x3244: 0x50EF, + 0x3245: 0x50F1, + 0x3246: 0x50F6, + 0x3247: 0x50FA, + 0x3248: 0x50FE, + 0x3249: 0x5103, + 0x324A: 0x5106, + 0x324B: 0x5107, + 0x324C: 0x5108, + 0x324D: 0x510B, + 0x324E: 0x510C, + 0x324F: 0x510D, + 0x3250: 0x510E, + 0x3251: 0x50F2, + 0x3252: 0x5110, + 0x3253: 0x5117, + 0x3254: 0x5119, + 0x3255: 0x511B, + 0x3256: 0x511C, + 0x3257: 0x511D, + 0x3258: 0x511E, + 0x3259: 0x5123, + 0x325A: 0x5127, + 0x325B: 0x5128, + 0x325C: 0x512C, + 0x325D: 0x512D, + 0x325E: 0x512F, + 0x325F: 0x5131, + 0x3260: 0x5133, + 0x3261: 0x5134, + 0x3262: 0x5135, + 0x3263: 0x5138, + 0x3264: 0x5139, + 0x3265: 0x5142, + 0x3266: 0x514A, + 0x3267: 0x514F, + 0x3268: 0x5153, + 0x3269: 0x5155, + 0x326A: 0x5157, + 0x326B: 0x5158, + 0x326C: 0x515F, + 0x326D: 0x5164, + 0x326E: 0x5166, + 0x326F: 0x517E, + 0x3270: 0x5183, + 0x3271: 0x5184, + 0x3272: 0x518B, + 0x3273: 0x518E, + 0x3274: 0x5198, + 0x3275: 0x519D, + 0x3276: 0x51A1, + 0x3277: 0x51A3, + 0x3278: 0x51AD, + 0x3279: 0x51B8, + 0x327A: 0x51BA, + 0x327B: 0x51BC, + 0x327C: 0x51BE, + 0x327D: 0x51BF, + 0x327E: 0x51C2, + 0x3321: 0x51C8, + 0x3322: 0x51CF, + 0x3323: 0x51D1, + 0x3324: 0x51D2, + 0x3325: 0x51D3, + 0x3326: 0x51D5, + 0x3327: 0x51D8, + 0x3328: 0x51DE, + 0x3329: 0x51E2, + 0x332A: 0x51E5, + 0x332B: 0x51EE, + 0x332C: 0x51F2, + 0x332D: 0x51F3, + 0x332E: 0x51F4, + 0x332F: 0x51F7, + 0x3330: 0x5201, + 0x3331: 0x5202, + 0x3332: 0x5205, + 0x3333: 0x5212, + 0x3334: 0x5213, + 0x3335: 0x5215, + 0x3336: 0x5216, + 0x3337: 0x5218, + 0x3338: 0x5222, + 0x3339: 0x5228, + 0x333A: 0x5231, + 0x333B: 0x5232, + 0x333C: 0x5235, + 0x333D: 0x523C, + 0x333E: 0x5245, + 0x333F: 0x5249, + 0x3340: 0x5255, + 0x3341: 0x5257, + 0x3342: 0x5258, + 0x3343: 0x525A, + 0x3344: 0x525C, + 0x3345: 0x525F, + 0x3346: 0x5260, + 0x3347: 0x5261, + 0x3348: 0x5266, + 0x3349: 0x526E, + 0x334A: 0x5277, + 0x334B: 0x5278, + 0x334C: 0x5279, + 0x334D: 0x5280, + 0x334E: 0x5282, + 0x334F: 0x5285, + 0x3350: 0x528A, + 0x3351: 0x528C, + 0x3352: 0x5293, + 0x3353: 0x5295, + 0x3354: 0x5296, + 0x3355: 0x5297, + 0x3356: 0x5298, + 0x3357: 0x529A, + 0x3358: 0x529C, + 0x3359: 0x52A4, + 0x335A: 0x52A5, + 0x335B: 0x52A6, + 0x335C: 0x52A7, + 0x335D: 0x52AF, + 0x335E: 0x52B0, + 0x335F: 0x52B6, + 0x3360: 0x52B7, + 0x3361: 0x52B8, + 0x3362: 0x52BA, + 0x3363: 0x52BB, + 0x3364: 0x52BD, + 0x3365: 0x52C0, + 0x3366: 0x52C4, + 0x3367: 0x52C6, + 0x3368: 0x52C8, + 0x3369: 0x52CC, + 0x336A: 0x52CF, + 0x336B: 0x52D1, + 0x336C: 0x52D4, + 0x336D: 0x52D6, + 0x336E: 0x52DB, + 0x336F: 0x52DC, + 0x3370: 0x52E1, + 0x3371: 0x52E5, + 0x3372: 0x52E8, + 0x3373: 0x52E9, + 0x3374: 0x52EA, + 0x3375: 0x52EC, + 0x3376: 0x52F0, + 0x3377: 0x52F1, + 0x3378: 0x52F4, + 0x3379: 0x52F6, + 0x337A: 0x52F7, + 0x337B: 0x5300, + 0x337C: 0x5303, + 0x337D: 0x530A, + 0x337E: 0x530B, + 0x3421: 0x530C, + 0x3422: 0x5311, + 0x3423: 0x5313, + 0x3424: 0x5318, + 0x3425: 0x531B, + 0x3426: 0x531C, + 0x3427: 0x531E, + 0x3428: 0x531F, + 0x3429: 0x5325, + 0x342A: 0x5327, + 0x342B: 0x5328, + 0x342C: 0x5329, + 0x342D: 0x532B, + 0x342E: 0x532C, + 0x342F: 0x532D, + 0x3430: 0x5330, + 0x3431: 0x5332, + 0x3432: 0x5335, + 0x3433: 0x533C, + 0x3434: 0x533D, + 0x3435: 0x533E, + 0x3436: 0x5342, + 0x3437: 0x534C, + 0x3438: 0x534B, + 0x3439: 0x5359, + 0x343A: 0x535B, + 0x343B: 0x5361, + 0x343C: 0x5363, + 0x343D: 0x5365, + 0x343E: 0x536C, + 0x343F: 0x536D, + 0x3440: 0x5372, + 0x3441: 0x5379, + 0x3442: 0x537E, + 0x3443: 0x5383, + 0x3444: 0x5387, + 0x3445: 0x5388, + 0x3446: 0x538E, + 0x3447: 0x5393, + 0x3448: 0x5394, + 0x3449: 0x5399, + 0x344A: 0x539D, + 0x344B: 0x53A1, + 0x344C: 0x53A4, + 0x344D: 0x53AA, + 0x344E: 0x53AB, + 0x344F: 0x53AF, + 0x3450: 0x53B2, + 0x3451: 0x53B4, + 0x3452: 0x53B5, + 0x3453: 0x53B7, + 0x3454: 0x53B8, + 0x3455: 0x53BA, + 0x3456: 0x53BD, + 0x3457: 0x53C0, + 0x3458: 0x53C5, + 0x3459: 0x53CF, + 0x345A: 0x53D2, + 0x345B: 0x53D3, + 0x345C: 0x53D5, + 0x345D: 0x53DA, + 0x345E: 0x53DD, + 0x345F: 0x53DE, + 0x3460: 0x53E0, + 0x3461: 0x53E6, + 0x3462: 0x53E7, + 0x3463: 0x53F5, + 0x3464: 0x5402, + 0x3465: 0x5413, + 0x3466: 0x541A, + 0x3467: 0x5421, + 0x3468: 0x5427, + 0x3469: 0x5428, + 0x346A: 0x542A, + 0x346B: 0x542F, + 0x346C: 0x5431, + 0x346D: 0x5434, + 0x346E: 0x5435, + 0x346F: 0x5443, + 0x3470: 0x5444, + 0x3471: 0x5447, + 0x3472: 0x544D, + 0x3473: 0x544F, + 0x3474: 0x545E, + 0x3475: 0x5462, + 0x3476: 0x5464, + 0x3477: 0x5466, + 0x3478: 0x5467, + 0x3479: 0x5469, + 0x347A: 0x546B, + 0x347B: 0x546D, + 0x347C: 0x546E, + 0x347D: 0x5474, + 0x347E: 0x547F, + 0x3521: 0x5481, + 0x3522: 0x5483, + 0x3523: 0x5485, + 0x3524: 0x5488, + 0x3525: 0x5489, + 0x3526: 0x548D, + 0x3527: 0x5491, + 0x3528: 0x5495, + 0x3529: 0x5496, + 0x352A: 0x549C, + 0x352B: 0x549F, + 0x352C: 0x54A1, + 0x352D: 0x54A6, + 0x352E: 0x54A7, + 0x352F: 0x54A9, + 0x3530: 0x54AA, + 0x3531: 0x54AD, + 0x3532: 0x54AE, + 0x3533: 0x54B1, + 0x3534: 0x54B7, + 0x3535: 0x54B9, + 0x3536: 0x54BA, + 0x3537: 0x54BB, + 0x3538: 0x54BF, + 0x3539: 0x54C6, + 0x353A: 0x54CA, + 0x353B: 0x54CD, + 0x353C: 0x54CE, + 0x353D: 0x54E0, + 0x353E: 0x54EA, + 0x353F: 0x54EC, + 0x3540: 0x54EF, + 0x3541: 0x54F6, + 0x3542: 0x54FC, + 0x3543: 0x54FE, + 0x3544: 0x54FF, + 0x3545: 0x5500, + 0x3546: 0x5501, + 0x3547: 0x5505, + 0x3548: 0x5508, + 0x3549: 0x5509, + 0x354A: 0x550C, + 0x354B: 0x550D, + 0x354C: 0x550E, + 0x354D: 0x5515, + 0x354E: 0x552A, + 0x354F: 0x552B, + 0x3550: 0x5532, + 0x3551: 0x5535, + 0x3552: 0x5536, + 0x3553: 0x553B, + 0x3554: 0x553C, + 0x3555: 0x553D, + 0x3556: 0x5541, + 0x3557: 0x5547, + 0x3558: 0x5549, + 0x3559: 0x554A, + 0x355A: 0x554D, + 0x355B: 0x5550, + 0x355C: 0x5551, + 0x355D: 0x5558, + 0x355E: 0x555A, + 0x355F: 0x555B, + 0x3560: 0x555E, + 0x3561: 0x5560, + 0x3562: 0x5561, + 0x3563: 0x5564, + 0x3564: 0x5566, + 0x3565: 0x557F, + 0x3566: 0x5581, + 0x3567: 0x5582, + 0x3568: 0x5586, + 0x3569: 0x5588, + 0x356A: 0x558E, + 0x356B: 0x558F, + 0x356C: 0x5591, + 0x356D: 0x5592, + 0x356E: 0x5593, + 0x356F: 0x5594, + 0x3570: 0x5597, + 0x3571: 0x55A3, + 0x3572: 0x55A4, + 0x3573: 0x55AD, + 0x3574: 0x55B2, + 0x3575: 0x55BF, + 0x3576: 0x55C1, + 0x3577: 0x55C3, + 0x3578: 0x55C6, + 0x3579: 0x55C9, + 0x357A: 0x55CB, + 0x357B: 0x55CC, + 0x357C: 0x55CE, + 0x357D: 0x55D1, + 0x357E: 0x55D2, + 0x3621: 0x55D3, + 0x3622: 0x55D7, + 0x3623: 0x55D8, + 0x3624: 0x55DB, + 0x3625: 0x55DE, + 0x3626: 0x55E2, + 0x3627: 0x55E9, + 0x3628: 0x55F6, + 0x3629: 0x55FF, + 0x362A: 0x5605, + 0x362B: 0x5608, + 0x362C: 0x560A, + 0x362D: 0x560D, + 0x362E: 0x560E, + 0x362F: 0x560F, + 0x3630: 0x5610, + 0x3631: 0x5611, + 0x3632: 0x5612, + 0x3633: 0x5619, + 0x3634: 0x562C, + 0x3635: 0x5630, + 0x3636: 0x5633, + 0x3637: 0x5635, + 0x3638: 0x5637, + 0x3639: 0x5639, + 0x363A: 0x563B, + 0x363B: 0x563C, + 0x363C: 0x563D, + 0x363D: 0x563F, + 0x363E: 0x5640, + 0x363F: 0x5641, + 0x3640: 0x5643, + 0x3641: 0x5644, + 0x3642: 0x5646, + 0x3643: 0x5649, + 0x3644: 0x564B, + 0x3645: 0x564D, + 0x3646: 0x564F, + 0x3647: 0x5654, + 0x3648: 0x565E, + 0x3649: 0x5660, + 0x364A: 0x5661, + 0x364B: 0x5662, + 0x364C: 0x5663, + 0x364D: 0x5666, + 0x364E: 0x5669, + 0x364F: 0x566D, + 0x3650: 0x566F, + 0x3651: 0x5671, + 0x3652: 0x5672, + 0x3653: 0x5675, + 0x3654: 0x5684, + 0x3655: 0x5685, + 0x3656: 0x5688, + 0x3657: 0x568B, + 0x3658: 0x568C, + 0x3659: 0x5695, + 0x365A: 0x5699, + 0x365B: 0x569A, + 0x365C: 0x569D, + 0x365D: 0x569E, + 0x365E: 0x569F, + 0x365F: 0x56A6, + 0x3660: 0x56A7, + 0x3661: 0x56A8, + 0x3662: 0x56A9, + 0x3663: 0x56AB, + 0x3664: 0x56AC, + 0x3665: 0x56AD, + 0x3666: 0x56B1, + 0x3667: 0x56B3, + 0x3668: 0x56B7, + 0x3669: 0x56BE, + 0x366A: 0x56C5, + 0x366B: 0x56C9, + 0x366C: 0x56CA, + 0x366D: 0x56CB, + 0x366E: 0x56CF, + 0x366F: 0x56D0, + 0x3670: 0x56CC, + 0x3671: 0x56CD, + 0x3672: 0x56D9, + 0x3673: 0x56DC, + 0x3674: 0x56DD, + 0x3675: 0x56DF, + 0x3676: 0x56E1, + 0x3677: 0x56E4, + 0x3678: 0x56E5, + 0x3679: 0x56E6, + 0x367A: 0x56E7, + 0x367B: 0x56E8, + 0x367C: 0x56F1, + 0x367D: 0x56EB, + 0x367E: 0x56ED, + 0x3721: 0x56F6, + 0x3722: 0x56F7, + 0x3723: 0x5701, + 0x3724: 0x5702, + 0x3725: 0x5707, + 0x3726: 0x570A, + 0x3727: 0x570C, + 0x3728: 0x5711, + 0x3729: 0x5715, + 0x372A: 0x571A, + 0x372B: 0x571B, + 0x372C: 0x571D, + 0x372D: 0x5720, + 0x372E: 0x5722, + 0x372F: 0x5723, + 0x3730: 0x5724, + 0x3731: 0x5725, + 0x3732: 0x5729, + 0x3733: 0x572A, + 0x3734: 0x572C, + 0x3735: 0x572E, + 0x3736: 0x572F, + 0x3737: 0x5733, + 0x3738: 0x5734, + 0x3739: 0x573D, + 0x373A: 0x573E, + 0x373B: 0x573F, + 0x373C: 0x5745, + 0x373D: 0x5746, + 0x373E: 0x574C, + 0x373F: 0x574D, + 0x3740: 0x5752, + 0x3741: 0x5762, + 0x3742: 0x5765, + 0x3743: 0x5767, + 0x3744: 0x5768, + 0x3745: 0x576B, + 0x3746: 0x576D, + 0x3747: 0x576E, + 0x3748: 0x576F, + 0x3749: 0x5770, + 0x374A: 0x5771, + 0x374B: 0x5773, + 0x374C: 0x5774, + 0x374D: 0x5775, + 0x374E: 0x5777, + 0x374F: 0x5779, + 0x3750: 0x577A, + 0x3751: 0x577B, + 0x3752: 0x577C, + 0x3753: 0x577E, + 0x3754: 0x5781, + 0x3755: 0x5783, + 0x3756: 0x578C, + 0x3757: 0x5794, + 0x3758: 0x5797, + 0x3759: 0x5799, + 0x375A: 0x579A, + 0x375B: 0x579C, + 0x375C: 0x579D, + 0x375D: 0x579E, + 0x375E: 0x579F, + 0x375F: 0x57A1, + 0x3760: 0x5795, + 0x3761: 0x57A7, + 0x3762: 0x57A8, + 0x3763: 0x57A9, + 0x3764: 0x57AC, + 0x3765: 0x57B8, + 0x3766: 0x57BD, + 0x3767: 0x57C7, + 0x3768: 0x57C8, + 0x3769: 0x57CC, + 0x376A: 0x57CF, + 0x376B: 0x57D5, + 0x376C: 0x57DD, + 0x376D: 0x57DE, + 0x376E: 0x57E4, + 0x376F: 0x57E6, + 0x3770: 0x57E7, + 0x3771: 0x57E9, + 0x3772: 0x57ED, + 0x3773: 0x57F0, + 0x3774: 0x57F5, + 0x3775: 0x57F6, + 0x3776: 0x57F8, + 0x3777: 0x57FD, + 0x3778: 0x57FE, + 0x3779: 0x57FF, + 0x377A: 0x5803, + 0x377B: 0x5804, + 0x377C: 0x5808, + 0x377D: 0x5809, + 0x377E: 0x57E1, + 0x3821: 0x580C, + 0x3822: 0x580D, + 0x3823: 0x581B, + 0x3824: 0x581E, + 0x3825: 0x581F, + 0x3826: 0x5820, + 0x3827: 0x5826, + 0x3828: 0x5827, + 0x3829: 0x582D, + 0x382A: 0x5832, + 0x382B: 0x5839, + 0x382C: 0x583F, + 0x382D: 0x5849, + 0x382E: 0x584C, + 0x382F: 0x584D, + 0x3830: 0x584F, + 0x3831: 0x5850, + 0x3832: 0x5855, + 0x3833: 0x585F, + 0x3834: 0x5861, + 0x3835: 0x5864, + 0x3836: 0x5867, + 0x3837: 0x5868, + 0x3838: 0x5878, + 0x3839: 0x587C, + 0x383A: 0x587F, + 0x383B: 0x5880, + 0x383C: 0x5881, + 0x383D: 0x5887, + 0x383E: 0x5888, + 0x383F: 0x5889, + 0x3840: 0x588A, + 0x3841: 0x588C, + 0x3842: 0x588D, + 0x3843: 0x588F, + 0x3844: 0x5890, + 0x3845: 0x5894, + 0x3846: 0x5896, + 0x3847: 0x589D, + 0x3848: 0x58A0, + 0x3849: 0x58A1, + 0x384A: 0x58A2, + 0x384B: 0x58A6, + 0x384C: 0x58A9, + 0x384D: 0x58B1, + 0x384E: 0x58B2, + 0x384F: 0x58C4, + 0x3850: 0x58BC, + 0x3851: 0x58C2, + 0x3852: 0x58C8, + 0x3853: 0x58CD, + 0x3854: 0x58CE, + 0x3855: 0x58D0, + 0x3856: 0x58D2, + 0x3857: 0x58D4, + 0x3858: 0x58D6, + 0x3859: 0x58DA, + 0x385A: 0x58DD, + 0x385B: 0x58E1, + 0x385C: 0x58E2, + 0x385D: 0x58E9, + 0x385E: 0x58F3, + 0x385F: 0x5905, + 0x3860: 0x5906, + 0x3861: 0x590B, + 0x3862: 0x590C, + 0x3863: 0x5912, + 0x3864: 0x5913, + 0x3865: 0x5914, + 0x3866: 0x8641, + 0x3867: 0x591D, + 0x3868: 0x5921, + 0x3869: 0x5923, + 0x386A: 0x5924, + 0x386B: 0x5928, + 0x386C: 0x592F, + 0x386D: 0x5930, + 0x386E: 0x5933, + 0x386F: 0x5935, + 0x3870: 0x5936, + 0x3871: 0x593F, + 0x3872: 0x5943, + 0x3873: 0x5946, + 0x3874: 0x5952, + 0x3875: 0x5953, + 0x3876: 0x5959, + 0x3877: 0x595B, + 0x3878: 0x595D, + 0x3879: 0x595E, + 0x387A: 0x595F, + 0x387B: 0x5961, + 0x387C: 0x5963, + 0x387D: 0x596B, + 0x387E: 0x596D, + 0x3921: 0x596F, + 0x3922: 0x5972, + 0x3923: 0x5975, + 0x3924: 0x5976, + 0x3925: 0x5979, + 0x3926: 0x597B, + 0x3927: 0x597C, + 0x3928: 0x598B, + 0x3929: 0x598C, + 0x392A: 0x598E, + 0x392B: 0x5992, + 0x392C: 0x5995, + 0x392D: 0x5997, + 0x392E: 0x599F, + 0x392F: 0x59A4, + 0x3930: 0x59A7, + 0x3931: 0x59AD, + 0x3932: 0x59AE, + 0x3933: 0x59AF, + 0x3934: 0x59B0, + 0x3935: 0x59B3, + 0x3936: 0x59B7, + 0x3937: 0x59BA, + 0x3938: 0x59BC, + 0x3939: 0x59C1, + 0x393A: 0x59C3, + 0x393B: 0x59C4, + 0x393C: 0x59C8, + 0x393D: 0x59CA, + 0x393E: 0x59CD, + 0x393F: 0x59D2, + 0x3940: 0x59DD, + 0x3941: 0x59DE, + 0x3942: 0x59DF, + 0x3943: 0x59E3, + 0x3944: 0x59E4, + 0x3945: 0x59E7, + 0x3946: 0x59EE, + 0x3947: 0x59EF, + 0x3948: 0x59F1, + 0x3949: 0x59F2, + 0x394A: 0x59F4, + 0x394B: 0x59F7, + 0x394C: 0x5A00, + 0x394D: 0x5A04, + 0x394E: 0x5A0C, + 0x394F: 0x5A0D, + 0x3950: 0x5A0E, + 0x3951: 0x5A12, + 0x3952: 0x5A13, + 0x3953: 0x5A1E, + 0x3954: 0x5A23, + 0x3955: 0x5A24, + 0x3956: 0x5A27, + 0x3957: 0x5A28, + 0x3958: 0x5A2A, + 0x3959: 0x5A2D, + 0x395A: 0x5A30, + 0x395B: 0x5A44, + 0x395C: 0x5A45, + 0x395D: 0x5A47, + 0x395E: 0x5A48, + 0x395F: 0x5A4C, + 0x3960: 0x5A50, + 0x3961: 0x5A55, + 0x3962: 0x5A5E, + 0x3963: 0x5A63, + 0x3964: 0x5A65, + 0x3965: 0x5A67, + 0x3966: 0x5A6D, + 0x3967: 0x5A77, + 0x3968: 0x5A7A, + 0x3969: 0x5A7B, + 0x396A: 0x5A7E, + 0x396B: 0x5A8B, + 0x396C: 0x5A90, + 0x396D: 0x5A93, + 0x396E: 0x5A96, + 0x396F: 0x5A99, + 0x3970: 0x5A9C, + 0x3971: 0x5A9E, + 0x3972: 0x5A9F, + 0x3973: 0x5AA0, + 0x3974: 0x5AA2, + 0x3975: 0x5AA7, + 0x3976: 0x5AAC, + 0x3977: 0x5AB1, + 0x3978: 0x5AB2, + 0x3979: 0x5AB3, + 0x397A: 0x5AB5, + 0x397B: 0x5AB8, + 0x397C: 0x5ABA, + 0x397D: 0x5ABB, + 0x397E: 0x5ABF, + 0x3A21: 0x5AC4, + 0x3A22: 0x5AC6, + 0x3A23: 0x5AC8, + 0x3A24: 0x5ACF, + 0x3A25: 0x5ADA, + 0x3A26: 0x5ADC, + 0x3A27: 0x5AE0, + 0x3A28: 0x5AE5, + 0x3A29: 0x5AEA, + 0x3A2A: 0x5AEE, + 0x3A2B: 0x5AF5, + 0x3A2C: 0x5AF6, + 0x3A2D: 0x5AFD, + 0x3A2E: 0x5B00, + 0x3A2F: 0x5B01, + 0x3A30: 0x5B08, + 0x3A31: 0x5B17, + 0x3A32: 0x5B34, + 0x3A33: 0x5B19, + 0x3A34: 0x5B1B, + 0x3A35: 0x5B1D, + 0x3A36: 0x5B21, + 0x3A37: 0x5B25, + 0x3A38: 0x5B2D, + 0x3A39: 0x5B38, + 0x3A3A: 0x5B41, + 0x3A3B: 0x5B4B, + 0x3A3C: 0x5B4C, + 0x3A3D: 0x5B52, + 0x3A3E: 0x5B56, + 0x3A3F: 0x5B5E, + 0x3A40: 0x5B68, + 0x3A41: 0x5B6E, + 0x3A42: 0x5B6F, + 0x3A43: 0x5B7C, + 0x3A44: 0x5B7D, + 0x3A45: 0x5B7E, + 0x3A46: 0x5B7F, + 0x3A47: 0x5B81, + 0x3A48: 0x5B84, + 0x3A49: 0x5B86, + 0x3A4A: 0x5B8A, + 0x3A4B: 0x5B8E, + 0x3A4C: 0x5B90, + 0x3A4D: 0x5B91, + 0x3A4E: 0x5B93, + 0x3A4F: 0x5B94, + 0x3A50: 0x5B96, + 0x3A51: 0x5BA8, + 0x3A52: 0x5BA9, + 0x3A53: 0x5BAC, + 0x3A54: 0x5BAD, + 0x3A55: 0x5BAF, + 0x3A56: 0x5BB1, + 0x3A57: 0x5BB2, + 0x3A58: 0x5BB7, + 0x3A59: 0x5BBA, + 0x3A5A: 0x5BBC, + 0x3A5B: 0x5BC0, + 0x3A5C: 0x5BC1, + 0x3A5D: 0x5BCD, + 0x3A5E: 0x5BCF, + 0x3A5F: 0x5BD6, + 0x3A60: 0x5BD7, + 0x3A61: 0x5BD8, + 0x3A62: 0x5BD9, + 0x3A63: 0x5BDA, + 0x3A64: 0x5BE0, + 0x3A65: 0x5BEF, + 0x3A66: 0x5BF1, + 0x3A67: 0x5BF4, + 0x3A68: 0x5BFD, + 0x3A69: 0x5C0C, + 0x3A6A: 0x5C17, + 0x3A6B: 0x5C1E, + 0x3A6C: 0x5C1F, + 0x3A6D: 0x5C23, + 0x3A6E: 0x5C26, + 0x3A6F: 0x5C29, + 0x3A70: 0x5C2B, + 0x3A71: 0x5C2C, + 0x3A72: 0x5C2E, + 0x3A73: 0x5C30, + 0x3A74: 0x5C32, + 0x3A75: 0x5C35, + 0x3A76: 0x5C36, + 0x3A77: 0x5C59, + 0x3A78: 0x5C5A, + 0x3A79: 0x5C5C, + 0x3A7A: 0x5C62, + 0x3A7B: 0x5C63, + 0x3A7C: 0x5C67, + 0x3A7D: 0x5C68, + 0x3A7E: 0x5C69, + 0x3B21: 0x5C6D, + 0x3B22: 0x5C70, + 0x3B23: 0x5C74, + 0x3B24: 0x5C75, + 0x3B25: 0x5C7A, + 0x3B26: 0x5C7B, + 0x3B27: 0x5C7C, + 0x3B28: 0x5C7D, + 0x3B29: 0x5C87, + 0x3B2A: 0x5C88, + 0x3B2B: 0x5C8A, + 0x3B2C: 0x5C8F, + 0x3B2D: 0x5C92, + 0x3B2E: 0x5C9D, + 0x3B2F: 0x5C9F, + 0x3B30: 0x5CA0, + 0x3B31: 0x5CA2, + 0x3B32: 0x5CA3, + 0x3B33: 0x5CA6, + 0x3B34: 0x5CAA, + 0x3B35: 0x5CB2, + 0x3B36: 0x5CB4, + 0x3B37: 0x5CB5, + 0x3B38: 0x5CBA, + 0x3B39: 0x5CC9, + 0x3B3A: 0x5CCB, + 0x3B3B: 0x5CD2, + 0x3B3C: 0x5CDD, + 0x3B3D: 0x5CD7, + 0x3B3E: 0x5CEE, + 0x3B3F: 0x5CF1, + 0x3B40: 0x5CF2, + 0x3B41: 0x5CF4, + 0x3B42: 0x5D01, + 0x3B43: 0x5D06, + 0x3B44: 0x5D0D, + 0x3B45: 0x5D12, + 0x3B46: 0x5D2B, + 0x3B47: 0x5D23, + 0x3B48: 0x5D24, + 0x3B49: 0x5D26, + 0x3B4A: 0x5D27, + 0x3B4B: 0x5D31, + 0x3B4C: 0x5D34, + 0x3B4D: 0x5D39, + 0x3B4E: 0x5D3D, + 0x3B4F: 0x5D3F, + 0x3B50: 0x5D42, + 0x3B51: 0x5D43, + 0x3B52: 0x5D46, + 0x3B53: 0x5D48, + 0x3B54: 0x5D55, + 0x3B55: 0x5D51, + 0x3B56: 0x5D59, + 0x3B57: 0x5D4A, + 0x3B58: 0x5D5F, + 0x3B59: 0x5D60, + 0x3B5A: 0x5D61, + 0x3B5B: 0x5D62, + 0x3B5C: 0x5D64, + 0x3B5D: 0x5D6A, + 0x3B5E: 0x5D6D, + 0x3B5F: 0x5D70, + 0x3B60: 0x5D79, + 0x3B61: 0x5D7A, + 0x3B62: 0x5D7E, + 0x3B63: 0x5D7F, + 0x3B64: 0x5D81, + 0x3B65: 0x5D83, + 0x3B66: 0x5D88, + 0x3B67: 0x5D8A, + 0x3B68: 0x5D92, + 0x3B69: 0x5D93, + 0x3B6A: 0x5D94, + 0x3B6B: 0x5D95, + 0x3B6C: 0x5D99, + 0x3B6D: 0x5D9B, + 0x3B6E: 0x5D9F, + 0x3B6F: 0x5DA0, + 0x3B70: 0x5DA7, + 0x3B71: 0x5DAB, + 0x3B72: 0x5DB0, + 0x3B73: 0x5DB4, + 0x3B74: 0x5DB8, + 0x3B75: 0x5DB9, + 0x3B76: 0x5DC3, + 0x3B77: 0x5DC7, + 0x3B78: 0x5DCB, + 0x3B79: 0x5DD0, + 0x3B7A: 0x5DCE, + 0x3B7B: 0x5DD8, + 0x3B7C: 0x5DD9, + 0x3B7D: 0x5DE0, + 0x3B7E: 0x5DE4, + 0x3C21: 0x5DE9, + 0x3C22: 0x5DF8, + 0x3C23: 0x5DF9, + 0x3C24: 0x5E00, + 0x3C25: 0x5E07, + 0x3C26: 0x5E0D, + 0x3C27: 0x5E12, + 0x3C28: 0x5E14, + 0x3C29: 0x5E15, + 0x3C2A: 0x5E18, + 0x3C2B: 0x5E1F, + 0x3C2C: 0x5E20, + 0x3C2D: 0x5E2E, + 0x3C2E: 0x5E28, + 0x3C2F: 0x5E32, + 0x3C30: 0x5E35, + 0x3C31: 0x5E3E, + 0x3C32: 0x5E4B, + 0x3C33: 0x5E50, + 0x3C34: 0x5E49, + 0x3C35: 0x5E51, + 0x3C36: 0x5E56, + 0x3C37: 0x5E58, + 0x3C38: 0x5E5B, + 0x3C39: 0x5E5C, + 0x3C3A: 0x5E5E, + 0x3C3B: 0x5E68, + 0x3C3C: 0x5E6A, + 0x3C3D: 0x5E6B, + 0x3C3E: 0x5E6C, + 0x3C3F: 0x5E6D, + 0x3C40: 0x5E6E, + 0x3C41: 0x5E70, + 0x3C42: 0x5E80, + 0x3C43: 0x5E8B, + 0x3C44: 0x5E8E, + 0x3C45: 0x5EA2, + 0x3C46: 0x5EA4, + 0x3C47: 0x5EA5, + 0x3C48: 0x5EA8, + 0x3C49: 0x5EAA, + 0x3C4A: 0x5EAC, + 0x3C4B: 0x5EB1, + 0x3C4C: 0x5EB3, + 0x3C4D: 0x5EBD, + 0x3C4E: 0x5EBE, + 0x3C4F: 0x5EBF, + 0x3C50: 0x5EC6, + 0x3C51: 0x5ECC, + 0x3C52: 0x5ECB, + 0x3C53: 0x5ECE, + 0x3C54: 0x5ED1, + 0x3C55: 0x5ED2, + 0x3C56: 0x5ED4, + 0x3C57: 0x5ED5, + 0x3C58: 0x5EDC, + 0x3C59: 0x5EDE, + 0x3C5A: 0x5EE5, + 0x3C5B: 0x5EEB, + 0x3C5C: 0x5F02, + 0x3C5D: 0x5F06, + 0x3C5E: 0x5F07, + 0x3C5F: 0x5F08, + 0x3C60: 0x5F0E, + 0x3C61: 0x5F19, + 0x3C62: 0x5F1C, + 0x3C63: 0x5F1D, + 0x3C64: 0x5F21, + 0x3C65: 0x5F22, + 0x3C66: 0x5F23, + 0x3C67: 0x5F24, + 0x3C68: 0x5F28, + 0x3C69: 0x5F2B, + 0x3C6A: 0x5F2C, + 0x3C6B: 0x5F2E, + 0x3C6C: 0x5F30, + 0x3C6D: 0x5F34, + 0x3C6E: 0x5F36, + 0x3C6F: 0x5F3B, + 0x3C70: 0x5F3D, + 0x3C71: 0x5F3F, + 0x3C72: 0x5F40, + 0x3C73: 0x5F44, + 0x3C74: 0x5F45, + 0x3C75: 0x5F47, + 0x3C76: 0x5F4D, + 0x3C77: 0x5F50, + 0x3C78: 0x5F54, + 0x3C79: 0x5F58, + 0x3C7A: 0x5F5B, + 0x3C7B: 0x5F60, + 0x3C7C: 0x5F63, + 0x3C7D: 0x5F64, + 0x3C7E: 0x5F67, + 0x3D21: 0x5F6F, + 0x3D22: 0x5F72, + 0x3D23: 0x5F74, + 0x3D24: 0x5F75, + 0x3D25: 0x5F78, + 0x3D26: 0x5F7A, + 0x3D27: 0x5F7D, + 0x3D28: 0x5F7E, + 0x3D29: 0x5F89, + 0x3D2A: 0x5F8D, + 0x3D2B: 0x5F8F, + 0x3D2C: 0x5F96, + 0x3D2D: 0x5F9C, + 0x3D2E: 0x5F9D, + 0x3D2F: 0x5FA2, + 0x3D30: 0x5FA7, + 0x3D31: 0x5FAB, + 0x3D32: 0x5FA4, + 0x3D33: 0x5FAC, + 0x3D34: 0x5FAF, + 0x3D35: 0x5FB0, + 0x3D36: 0x5FB1, + 0x3D37: 0x5FB8, + 0x3D38: 0x5FC4, + 0x3D39: 0x5FC7, + 0x3D3A: 0x5FC8, + 0x3D3B: 0x5FC9, + 0x3D3C: 0x5FCB, + 0x3D3D: 0x5FD0, + 0x3D3E: 0x5FD1, + 0x3D3F: 0x5FD2, + 0x3D40: 0x5FD3, + 0x3D41: 0x5FD4, + 0x3D42: 0x5FDE, + 0x3D43: 0x5FE1, + 0x3D44: 0x5FE2, + 0x3D45: 0x5FE8, + 0x3D46: 0x5FE9, + 0x3D47: 0x5FEA, + 0x3D48: 0x5FEC, + 0x3D49: 0x5FED, + 0x3D4A: 0x5FEE, + 0x3D4B: 0x5FEF, + 0x3D4C: 0x5FF2, + 0x3D4D: 0x5FF3, + 0x3D4E: 0x5FF6, + 0x3D4F: 0x5FFA, + 0x3D50: 0x5FFC, + 0x3D51: 0x6007, + 0x3D52: 0x600A, + 0x3D53: 0x600D, + 0x3D54: 0x6013, + 0x3D55: 0x6014, + 0x3D56: 0x6017, + 0x3D57: 0x6018, + 0x3D58: 0x601A, + 0x3D59: 0x601F, + 0x3D5A: 0x6024, + 0x3D5B: 0x602D, + 0x3D5C: 0x6033, + 0x3D5D: 0x6035, + 0x3D5E: 0x6040, + 0x3D5F: 0x6047, + 0x3D60: 0x6048, + 0x3D61: 0x6049, + 0x3D62: 0x604C, + 0x3D63: 0x6051, + 0x3D64: 0x6054, + 0x3D65: 0x6056, + 0x3D66: 0x6057, + 0x3D67: 0x605D, + 0x3D68: 0x6061, + 0x3D69: 0x6067, + 0x3D6A: 0x6071, + 0x3D6B: 0x607E, + 0x3D6C: 0x607F, + 0x3D6D: 0x6082, + 0x3D6E: 0x6086, + 0x3D6F: 0x6088, + 0x3D70: 0x608A, + 0x3D71: 0x608E, + 0x3D72: 0x6091, + 0x3D73: 0x6093, + 0x3D74: 0x6095, + 0x3D75: 0x6098, + 0x3D76: 0x609D, + 0x3D77: 0x609E, + 0x3D78: 0x60A2, + 0x3D79: 0x60A4, + 0x3D7A: 0x60A5, + 0x3D7B: 0x60A8, + 0x3D7C: 0x60B0, + 0x3D7D: 0x60B1, + 0x3D7E: 0x60B7, + 0x3E21: 0x60BB, + 0x3E22: 0x60BE, + 0x3E23: 0x60C2, + 0x3E24: 0x60C4, + 0x3E25: 0x60C8, + 0x3E26: 0x60C9, + 0x3E27: 0x60CA, + 0x3E28: 0x60CB, + 0x3E29: 0x60CE, + 0x3E2A: 0x60CF, + 0x3E2B: 0x60D4, + 0x3E2C: 0x60D5, + 0x3E2D: 0x60D9, + 0x3E2E: 0x60DB, + 0x3E2F: 0x60DD, + 0x3E30: 0x60DE, + 0x3E31: 0x60E2, + 0x3E32: 0x60E5, + 0x3E33: 0x60F2, + 0x3E34: 0x60F5, + 0x3E35: 0x60F8, + 0x3E36: 0x60FC, + 0x3E37: 0x60FD, + 0x3E38: 0x6102, + 0x3E39: 0x6107, + 0x3E3A: 0x610A, + 0x3E3B: 0x610C, + 0x3E3C: 0x6110, + 0x3E3D: 0x6111, + 0x3E3E: 0x6112, + 0x3E3F: 0x6113, + 0x3E40: 0x6114, + 0x3E41: 0x6116, + 0x3E42: 0x6117, + 0x3E43: 0x6119, + 0x3E44: 0x611C, + 0x3E45: 0x611E, + 0x3E46: 0x6122, + 0x3E47: 0x612A, + 0x3E48: 0x612B, + 0x3E49: 0x6130, + 0x3E4A: 0x6131, + 0x3E4B: 0x6135, + 0x3E4C: 0x6136, + 0x3E4D: 0x6137, + 0x3E4E: 0x6139, + 0x3E4F: 0x6141, + 0x3E50: 0x6145, + 0x3E51: 0x6146, + 0x3E52: 0x6149, + 0x3E53: 0x615E, + 0x3E54: 0x6160, + 0x3E55: 0x616C, + 0x3E56: 0x6172, + 0x3E57: 0x6178, + 0x3E58: 0x617B, + 0x3E59: 0x617C, + 0x3E5A: 0x617F, + 0x3E5B: 0x6180, + 0x3E5C: 0x6181, + 0x3E5D: 0x6183, + 0x3E5E: 0x6184, + 0x3E5F: 0x618B, + 0x3E60: 0x618D, + 0x3E61: 0x6192, + 0x3E62: 0x6193, + 0x3E63: 0x6197, + 0x3E64: 0x6198, + 0x3E65: 0x619C, + 0x3E66: 0x619D, + 0x3E67: 0x619F, + 0x3E68: 0x61A0, + 0x3E69: 0x61A5, + 0x3E6A: 0x61A8, + 0x3E6B: 0x61AA, + 0x3E6C: 0x61AD, + 0x3E6D: 0x61B8, + 0x3E6E: 0x61B9, + 0x3E6F: 0x61BC, + 0x3E70: 0x61C0, + 0x3E71: 0x61C1, + 0x3E72: 0x61C2, + 0x3E73: 0x61CE, + 0x3E74: 0x61CF, + 0x3E75: 0x61D5, + 0x3E76: 0x61DC, + 0x3E77: 0x61DD, + 0x3E78: 0x61DE, + 0x3E79: 0x61DF, + 0x3E7A: 0x61E1, + 0x3E7B: 0x61E2, + 0x3E7C: 0x61E7, + 0x3E7D: 0x61E9, + 0x3E7E: 0x61E5, + 0x3F21: 0x61EC, + 0x3F22: 0x61ED, + 0x3F23: 0x61EF, + 0x3F24: 0x6201, + 0x3F25: 0x6203, + 0x3F26: 0x6204, + 0x3F27: 0x6207, + 0x3F28: 0x6213, + 0x3F29: 0x6215, + 0x3F2A: 0x621C, + 0x3F2B: 0x6220, + 0x3F2C: 0x6222, + 0x3F2D: 0x6223, + 0x3F2E: 0x6227, + 0x3F2F: 0x6229, + 0x3F30: 0x622B, + 0x3F31: 0x6239, + 0x3F32: 0x623D, + 0x3F33: 0x6242, + 0x3F34: 0x6243, + 0x3F35: 0x6244, + 0x3F36: 0x6246, + 0x3F37: 0x624C, + 0x3F38: 0x6250, + 0x3F39: 0x6251, + 0x3F3A: 0x6252, + 0x3F3B: 0x6254, + 0x3F3C: 0x6256, + 0x3F3D: 0x625A, + 0x3F3E: 0x625C, + 0x3F3F: 0x6264, + 0x3F40: 0x626D, + 0x3F41: 0x626F, + 0x3F42: 0x6273, + 0x3F43: 0x627A, + 0x3F44: 0x627D, + 0x3F45: 0x628D, + 0x3F46: 0x628E, + 0x3F47: 0x628F, + 0x3F48: 0x6290, + 0x3F49: 0x62A6, + 0x3F4A: 0x62A8, + 0x3F4B: 0x62B3, + 0x3F4C: 0x62B6, + 0x3F4D: 0x62B7, + 0x3F4E: 0x62BA, + 0x3F4F: 0x62BE, + 0x3F50: 0x62BF, + 0x3F51: 0x62C4, + 0x3F52: 0x62CE, + 0x3F53: 0x62D5, + 0x3F54: 0x62D6, + 0x3F55: 0x62DA, + 0x3F56: 0x62EA, + 0x3F57: 0x62F2, + 0x3F58: 0x62F4, + 0x3F59: 0x62FC, + 0x3F5A: 0x62FD, + 0x3F5B: 0x6303, + 0x3F5C: 0x6304, + 0x3F5D: 0x630A, + 0x3F5E: 0x630B, + 0x3F5F: 0x630D, + 0x3F60: 0x6310, + 0x3F61: 0x6313, + 0x3F62: 0x6316, + 0x3F63: 0x6318, + 0x3F64: 0x6329, + 0x3F65: 0x632A, + 0x3F66: 0x632D, + 0x3F67: 0x6335, + 0x3F68: 0x6336, + 0x3F69: 0x6339, + 0x3F6A: 0x633C, + 0x3F6B: 0x6341, + 0x3F6C: 0x6342, + 0x3F6D: 0x6343, + 0x3F6E: 0x6344, + 0x3F6F: 0x6346, + 0x3F70: 0x634A, + 0x3F71: 0x634B, + 0x3F72: 0x634E, + 0x3F73: 0x6352, + 0x3F74: 0x6353, + 0x3F75: 0x6354, + 0x3F76: 0x6358, + 0x3F77: 0x635B, + 0x3F78: 0x6365, + 0x3F79: 0x6366, + 0x3F7A: 0x636C, + 0x3F7B: 0x636D, + 0x3F7C: 0x6371, + 0x3F7D: 0x6374, + 0x3F7E: 0x6375, + 0x4021: 0x6378, + 0x4022: 0x637C, + 0x4023: 0x637D, + 0x4024: 0x637F, + 0x4025: 0x6382, + 0x4026: 0x6384, + 0x4027: 0x6387, + 0x4028: 0x638A, + 0x4029: 0x6390, + 0x402A: 0x6394, + 0x402B: 0x6395, + 0x402C: 0x6399, + 0x402D: 0x639A, + 0x402E: 0x639E, + 0x402F: 0x63A4, + 0x4030: 0x63A6, + 0x4031: 0x63AD, + 0x4032: 0x63AE, + 0x4033: 0x63AF, + 0x4034: 0x63BD, + 0x4035: 0x63C1, + 0x4036: 0x63C5, + 0x4037: 0x63C8, + 0x4038: 0x63CE, + 0x4039: 0x63D1, + 0x403A: 0x63D3, + 0x403B: 0x63D4, + 0x403C: 0x63D5, + 0x403D: 0x63DC, + 0x403E: 0x63E0, + 0x403F: 0x63E5, + 0x4040: 0x63EA, + 0x4041: 0x63EC, + 0x4042: 0x63F2, + 0x4043: 0x63F3, + 0x4044: 0x63F5, + 0x4045: 0x63F8, + 0x4046: 0x63F9, + 0x4047: 0x6409, + 0x4048: 0x640A, + 0x4049: 0x6410, + 0x404A: 0x6412, + 0x404B: 0x6414, + 0x404C: 0x6418, + 0x404D: 0x641E, + 0x404E: 0x6420, + 0x404F: 0x6422, + 0x4050: 0x6424, + 0x4051: 0x6425, + 0x4052: 0x6429, + 0x4053: 0x642A, + 0x4054: 0x642F, + 0x4055: 0x6430, + 0x4056: 0x6435, + 0x4057: 0x643D, + 0x4058: 0x643F, + 0x4059: 0x644B, + 0x405A: 0x644F, + 0x405B: 0x6451, + 0x405C: 0x6452, + 0x405D: 0x6453, + 0x405E: 0x6454, + 0x405F: 0x645A, + 0x4060: 0x645B, + 0x4061: 0x645C, + 0x4062: 0x645D, + 0x4063: 0x645F, + 0x4064: 0x6460, + 0x4065: 0x6461, + 0x4066: 0x6463, + 0x4067: 0x646D, + 0x4068: 0x6473, + 0x4069: 0x6474, + 0x406A: 0x647B, + 0x406B: 0x647D, + 0x406C: 0x6485, + 0x406D: 0x6487, + 0x406E: 0x648F, + 0x406F: 0x6490, + 0x4070: 0x6491, + 0x4071: 0x6498, + 0x4072: 0x6499, + 0x4073: 0x649B, + 0x4074: 0x649D, + 0x4075: 0x649F, + 0x4076: 0x64A1, + 0x4077: 0x64A3, + 0x4078: 0x64A6, + 0x4079: 0x64A8, + 0x407A: 0x64AC, + 0x407B: 0x64B3, + 0x407C: 0x64BD, + 0x407D: 0x64BE, + 0x407E: 0x64BF, + 0x4121: 0x64C4, + 0x4122: 0x64C9, + 0x4123: 0x64CA, + 0x4124: 0x64CB, + 0x4125: 0x64CC, + 0x4126: 0x64CE, + 0x4127: 0x64D0, + 0x4128: 0x64D1, + 0x4129: 0x64D5, + 0x412A: 0x64D7, + 0x412B: 0x64E4, + 0x412C: 0x64E5, + 0x412D: 0x64E9, + 0x412E: 0x64EA, + 0x412F: 0x64ED, + 0x4130: 0x64F0, + 0x4131: 0x64F5, + 0x4132: 0x64F7, + 0x4133: 0x64FB, + 0x4134: 0x64FF, + 0x4135: 0x6501, + 0x4136: 0x6504, + 0x4137: 0x6508, + 0x4138: 0x6509, + 0x4139: 0x650A, + 0x413A: 0x650F, + 0x413B: 0x6513, + 0x413C: 0x6514, + 0x413D: 0x6516, + 0x413E: 0x6519, + 0x413F: 0x651B, + 0x4140: 0x651E, + 0x4141: 0x651F, + 0x4142: 0x6522, + 0x4143: 0x6526, + 0x4144: 0x6529, + 0x4145: 0x652E, + 0x4146: 0x6531, + 0x4147: 0x653A, + 0x4148: 0x653C, + 0x4149: 0x653D, + 0x414A: 0x6543, + 0x414B: 0x6547, + 0x414C: 0x6549, + 0x414D: 0x6550, + 0x414E: 0x6552, + 0x414F: 0x6554, + 0x4150: 0x655F, + 0x4151: 0x6560, + 0x4152: 0x6567, + 0x4153: 0x656B, + 0x4154: 0x657A, + 0x4155: 0x657D, + 0x4156: 0x6581, + 0x4157: 0x6585, + 0x4158: 0x658A, + 0x4159: 0x6592, + 0x415A: 0x6595, + 0x415B: 0x6598, + 0x415C: 0x659D, + 0x415D: 0x65A0, + 0x415E: 0x65A3, + 0x415F: 0x65A6, + 0x4160: 0x65AE, + 0x4161: 0x65B2, + 0x4162: 0x65B3, + 0x4163: 0x65B4, + 0x4164: 0x65BF, + 0x4165: 0x65C2, + 0x4166: 0x65C8, + 0x4167: 0x65C9, + 0x4168: 0x65CE, + 0x4169: 0x65D0, + 0x416A: 0x65D4, + 0x416B: 0x65D6, + 0x416C: 0x65D8, + 0x416D: 0x65DF, + 0x416E: 0x65F0, + 0x416F: 0x65F2, + 0x4170: 0x65F4, + 0x4171: 0x65F5, + 0x4172: 0x65F9, + 0x4173: 0x65FE, + 0x4174: 0x65FF, + 0x4175: 0x6600, + 0x4176: 0x6604, + 0x4177: 0x6608, + 0x4178: 0x6609, + 0x4179: 0x660D, + 0x417A: 0x6611, + 0x417B: 0x6612, + 0x417C: 0x6615, + 0x417D: 0x6616, + 0x417E: 0x661D, + 0x4221: 0x661E, + 0x4222: 0x6621, + 0x4223: 0x6622, + 0x4224: 0x6623, + 0x4225: 0x6624, + 0x4226: 0x6626, + 0x4227: 0x6629, + 0x4228: 0x662A, + 0x4229: 0x662B, + 0x422A: 0x662C, + 0x422B: 0x662E, + 0x422C: 0x6630, + 0x422D: 0x6631, + 0x422E: 0x6633, + 0x422F: 0x6639, + 0x4230: 0x6637, + 0x4231: 0x6640, + 0x4232: 0x6645, + 0x4233: 0x6646, + 0x4234: 0x664A, + 0x4235: 0x664C, + 0x4236: 0x6651, + 0x4237: 0x664E, + 0x4238: 0x6657, + 0x4239: 0x6658, + 0x423A: 0x6659, + 0x423B: 0x665B, + 0x423C: 0x665C, + 0x423D: 0x6660, + 0x423E: 0x6661, + 0x423F: 0x66FB, + 0x4240: 0x666A, + 0x4241: 0x666B, + 0x4242: 0x666C, + 0x4243: 0x667E, + 0x4244: 0x6673, + 0x4245: 0x6675, + 0x4246: 0x667F, + 0x4247: 0x6677, + 0x4248: 0x6678, + 0x4249: 0x6679, + 0x424A: 0x667B, + 0x424B: 0x6680, + 0x424C: 0x667C, + 0x424D: 0x668B, + 0x424E: 0x668C, + 0x424F: 0x668D, + 0x4250: 0x6690, + 0x4251: 0x6692, + 0x4252: 0x6699, + 0x4253: 0x669A, + 0x4254: 0x669B, + 0x4255: 0x669C, + 0x4256: 0x669F, + 0x4257: 0x66A0, + 0x4258: 0x66A4, + 0x4259: 0x66AD, + 0x425A: 0x66B1, + 0x425B: 0x66B2, + 0x425C: 0x66B5, + 0x425D: 0x66BB, + 0x425E: 0x66BF, + 0x425F: 0x66C0, + 0x4260: 0x66C2, + 0x4261: 0x66C3, + 0x4262: 0x66C8, + 0x4263: 0x66CC, + 0x4264: 0x66CE, + 0x4265: 0x66CF, + 0x4266: 0x66D4, + 0x4267: 0x66DB, + 0x4268: 0x66DF, + 0x4269: 0x66E8, + 0x426A: 0x66EB, + 0x426B: 0x66EC, + 0x426C: 0x66EE, + 0x426D: 0x66FA, + 0x426E: 0x6705, + 0x426F: 0x6707, + 0x4270: 0x670E, + 0x4271: 0x6713, + 0x4272: 0x6719, + 0x4273: 0x671C, + 0x4274: 0x6720, + 0x4275: 0x6722, + 0x4276: 0x6733, + 0x4277: 0x673E, + 0x4278: 0x6745, + 0x4279: 0x6747, + 0x427A: 0x6748, + 0x427B: 0x674C, + 0x427C: 0x6754, + 0x427D: 0x6755, + 0x427E: 0x675D, + 0x4321: 0x6766, + 0x4322: 0x676C, + 0x4323: 0x676E, + 0x4324: 0x6774, + 0x4325: 0x6776, + 0x4326: 0x677B, + 0x4327: 0x6781, + 0x4328: 0x6784, + 0x4329: 0x678E, + 0x432A: 0x678F, + 0x432B: 0x6791, + 0x432C: 0x6793, + 0x432D: 0x6796, + 0x432E: 0x6798, + 0x432F: 0x6799, + 0x4330: 0x679B, + 0x4331: 0x67B0, + 0x4332: 0x67B1, + 0x4333: 0x67B2, + 0x4334: 0x67B5, + 0x4335: 0x67BB, + 0x4336: 0x67BC, + 0x4337: 0x67BD, + 0x4338: 0x67F9, + 0x4339: 0x67C0, + 0x433A: 0x67C2, + 0x433B: 0x67C3, + 0x433C: 0x67C5, + 0x433D: 0x67C8, + 0x433E: 0x67C9, + 0x433F: 0x67D2, + 0x4340: 0x67D7, + 0x4341: 0x67D9, + 0x4342: 0x67DC, + 0x4343: 0x67E1, + 0x4344: 0x67E6, + 0x4345: 0x67F0, + 0x4346: 0x67F2, + 0x4347: 0x67F6, + 0x4348: 0x67F7, + 0x4349: 0x6852, + 0x434A: 0x6814, + 0x434B: 0x6819, + 0x434C: 0x681D, + 0x434D: 0x681F, + 0x434E: 0x6828, + 0x434F: 0x6827, + 0x4350: 0x682C, + 0x4351: 0x682D, + 0x4352: 0x682F, + 0x4353: 0x6830, + 0x4354: 0x6831, + 0x4355: 0x6833, + 0x4356: 0x683B, + 0x4357: 0x683F, + 0x4358: 0x6844, + 0x4359: 0x6845, + 0x435A: 0x684A, + 0x435B: 0x684C, + 0x435C: 0x6855, + 0x435D: 0x6857, + 0x435E: 0x6858, + 0x435F: 0x685B, + 0x4360: 0x686B, + 0x4361: 0x686E, + 0x4362: 0x686F, + 0x4363: 0x6870, + 0x4364: 0x6871, + 0x4365: 0x6872, + 0x4366: 0x6875, + 0x4367: 0x6879, + 0x4368: 0x687A, + 0x4369: 0x687B, + 0x436A: 0x687C, + 0x436B: 0x6882, + 0x436C: 0x6884, + 0x436D: 0x6886, + 0x436E: 0x6888, + 0x436F: 0x6896, + 0x4370: 0x6898, + 0x4371: 0x689A, + 0x4372: 0x689C, + 0x4373: 0x68A1, + 0x4374: 0x68A3, + 0x4375: 0x68A5, + 0x4376: 0x68A9, + 0x4377: 0x68AA, + 0x4378: 0x68AE, + 0x4379: 0x68B2, + 0x437A: 0x68BB, + 0x437B: 0x68C5, + 0x437C: 0x68C8, + 0x437D: 0x68CC, + 0x437E: 0x68CF, + 0x4421: 0x68D0, + 0x4422: 0x68D1, + 0x4423: 0x68D3, + 0x4424: 0x68D6, + 0x4425: 0x68D9, + 0x4426: 0x68DC, + 0x4427: 0x68DD, + 0x4428: 0x68E5, + 0x4429: 0x68E8, + 0x442A: 0x68EA, + 0x442B: 0x68EB, + 0x442C: 0x68EC, + 0x442D: 0x68ED, + 0x442E: 0x68F0, + 0x442F: 0x68F1, + 0x4430: 0x68F5, + 0x4431: 0x68F6, + 0x4432: 0x68FB, + 0x4433: 0x68FC, + 0x4434: 0x68FD, + 0x4435: 0x6906, + 0x4436: 0x6909, + 0x4437: 0x690A, + 0x4438: 0x6910, + 0x4439: 0x6911, + 0x443A: 0x6913, + 0x443B: 0x6916, + 0x443C: 0x6917, + 0x443D: 0x6931, + 0x443E: 0x6933, + 0x443F: 0x6935, + 0x4440: 0x6938, + 0x4441: 0x693B, + 0x4442: 0x6942, + 0x4443: 0x6945, + 0x4444: 0x6949, + 0x4445: 0x694E, + 0x4446: 0x6957, + 0x4447: 0x695B, + 0x4448: 0x6963, + 0x4449: 0x6964, + 0x444A: 0x6965, + 0x444B: 0x6966, + 0x444C: 0x6968, + 0x444D: 0x6969, + 0x444E: 0x696C, + 0x444F: 0x6970, + 0x4450: 0x6971, + 0x4451: 0x6972, + 0x4452: 0x697A, + 0x4453: 0x697B, + 0x4454: 0x697F, + 0x4455: 0x6980, + 0x4456: 0x698D, + 0x4457: 0x6992, + 0x4458: 0x6996, + 0x4459: 0x6998, + 0x445A: 0x69A1, + 0x445B: 0x69A5, + 0x445C: 0x69A6, + 0x445D: 0x69A8, + 0x445E: 0x69AB, + 0x445F: 0x69AD, + 0x4460: 0x69AF, + 0x4461: 0x69B7, + 0x4462: 0x69B8, + 0x4463: 0x69BA, + 0x4464: 0x69BC, + 0x4465: 0x69C5, + 0x4466: 0x69C8, + 0x4467: 0x69D1, + 0x4468: 0x69D6, + 0x4469: 0x69D7, + 0x446A: 0x69E2, + 0x446B: 0x69E5, + 0x446C: 0x69EE, + 0x446D: 0x69EF, + 0x446E: 0x69F1, + 0x446F: 0x69F3, + 0x4470: 0x69F5, + 0x4471: 0x69FE, + 0x4472: 0x6A00, + 0x4473: 0x6A01, + 0x4474: 0x6A03, + 0x4475: 0x6A0F, + 0x4476: 0x6A11, + 0x4477: 0x6A15, + 0x4478: 0x6A1A, + 0x4479: 0x6A1D, + 0x447A: 0x6A20, + 0x447B: 0x6A24, + 0x447C: 0x6A28, + 0x447D: 0x6A30, + 0x447E: 0x6A32, + 0x4521: 0x6A34, + 0x4522: 0x6A37, + 0x4523: 0x6A3B, + 0x4524: 0x6A3E, + 0x4525: 0x6A3F, + 0x4526: 0x6A45, + 0x4527: 0x6A46, + 0x4528: 0x6A49, + 0x4529: 0x6A4A, + 0x452A: 0x6A4E, + 0x452B: 0x6A50, + 0x452C: 0x6A51, + 0x452D: 0x6A52, + 0x452E: 0x6A55, + 0x452F: 0x6A56, + 0x4530: 0x6A5B, + 0x4531: 0x6A64, + 0x4532: 0x6A67, + 0x4533: 0x6A6A, + 0x4534: 0x6A71, + 0x4535: 0x6A73, + 0x4536: 0x6A7E, + 0x4537: 0x6A81, + 0x4538: 0x6A83, + 0x4539: 0x6A86, + 0x453A: 0x6A87, + 0x453B: 0x6A89, + 0x453C: 0x6A8B, + 0x453D: 0x6A91, + 0x453E: 0x6A9B, + 0x453F: 0x6A9D, + 0x4540: 0x6A9E, + 0x4541: 0x6A9F, + 0x4542: 0x6AA5, + 0x4543: 0x6AAB, + 0x4544: 0x6AAF, + 0x4545: 0x6AB0, + 0x4546: 0x6AB1, + 0x4547: 0x6AB4, + 0x4548: 0x6ABD, + 0x4549: 0x6ABE, + 0x454A: 0x6ABF, + 0x454B: 0x6AC6, + 0x454C: 0x6AC9, + 0x454D: 0x6AC8, + 0x454E: 0x6ACC, + 0x454F: 0x6AD0, + 0x4550: 0x6AD4, + 0x4551: 0x6AD5, + 0x4552: 0x6AD6, + 0x4553: 0x6ADC, + 0x4554: 0x6ADD, + 0x4555: 0x6AE4, + 0x4556: 0x6AE7, + 0x4557: 0x6AEC, + 0x4558: 0x6AF0, + 0x4559: 0x6AF1, + 0x455A: 0x6AF2, + 0x455B: 0x6AFC, + 0x455C: 0x6AFD, + 0x455D: 0x6B02, + 0x455E: 0x6B03, + 0x455F: 0x6B06, + 0x4560: 0x6B07, + 0x4561: 0x6B09, + 0x4562: 0x6B0F, + 0x4563: 0x6B10, + 0x4564: 0x6B11, + 0x4565: 0x6B17, + 0x4566: 0x6B1B, + 0x4567: 0x6B1E, + 0x4568: 0x6B24, + 0x4569: 0x6B28, + 0x456A: 0x6B2B, + 0x456B: 0x6B2C, + 0x456C: 0x6B2F, + 0x456D: 0x6B35, + 0x456E: 0x6B36, + 0x456F: 0x6B3B, + 0x4570: 0x6B3F, + 0x4571: 0x6B46, + 0x4572: 0x6B4A, + 0x4573: 0x6B4D, + 0x4574: 0x6B52, + 0x4575: 0x6B56, + 0x4576: 0x6B58, + 0x4577: 0x6B5D, + 0x4578: 0x6B60, + 0x4579: 0x6B67, + 0x457A: 0x6B6B, + 0x457B: 0x6B6E, + 0x457C: 0x6B70, + 0x457D: 0x6B75, + 0x457E: 0x6B7D, + 0x4621: 0x6B7E, + 0x4622: 0x6B82, + 0x4623: 0x6B85, + 0x4624: 0x6B97, + 0x4625: 0x6B9B, + 0x4626: 0x6B9F, + 0x4627: 0x6BA0, + 0x4628: 0x6BA2, + 0x4629: 0x6BA3, + 0x462A: 0x6BA8, + 0x462B: 0x6BA9, + 0x462C: 0x6BAC, + 0x462D: 0x6BAD, + 0x462E: 0x6BAE, + 0x462F: 0x6BB0, + 0x4630: 0x6BB8, + 0x4631: 0x6BB9, + 0x4632: 0x6BBD, + 0x4633: 0x6BBE, + 0x4634: 0x6BC3, + 0x4635: 0x6BC4, + 0x4636: 0x6BC9, + 0x4637: 0x6BCC, + 0x4638: 0x6BD6, + 0x4639: 0x6BDA, + 0x463A: 0x6BE1, + 0x463B: 0x6BE3, + 0x463C: 0x6BE6, + 0x463D: 0x6BE7, + 0x463E: 0x6BEE, + 0x463F: 0x6BF1, + 0x4640: 0x6BF7, + 0x4641: 0x6BF9, + 0x4642: 0x6BFF, + 0x4643: 0x6C02, + 0x4644: 0x6C04, + 0x4645: 0x6C05, + 0x4646: 0x6C09, + 0x4647: 0x6C0D, + 0x4648: 0x6C0E, + 0x4649: 0x6C10, + 0x464A: 0x6C12, + 0x464B: 0x6C19, + 0x464C: 0x6C1F, + 0x464D: 0x6C26, + 0x464E: 0x6C27, + 0x464F: 0x6C28, + 0x4650: 0x6C2C, + 0x4651: 0x6C2E, + 0x4652: 0x6C33, + 0x4653: 0x6C35, + 0x4654: 0x6C36, + 0x4655: 0x6C3A, + 0x4656: 0x6C3B, + 0x4657: 0x6C3F, + 0x4658: 0x6C4A, + 0x4659: 0x6C4B, + 0x465A: 0x6C4D, + 0x465B: 0x6C4F, + 0x465C: 0x6C52, + 0x465D: 0x6C54, + 0x465E: 0x6C59, + 0x465F: 0x6C5B, + 0x4660: 0x6C5C, + 0x4661: 0x6C6B, + 0x4662: 0x6C6D, + 0x4663: 0x6C6F, + 0x4664: 0x6C74, + 0x4665: 0x6C76, + 0x4666: 0x6C78, + 0x4667: 0x6C79, + 0x4668: 0x6C7B, + 0x4669: 0x6C85, + 0x466A: 0x6C86, + 0x466B: 0x6C87, + 0x466C: 0x6C89, + 0x466D: 0x6C94, + 0x466E: 0x6C95, + 0x466F: 0x6C97, + 0x4670: 0x6C98, + 0x4671: 0x6C9C, + 0x4672: 0x6C9F, + 0x4673: 0x6CB0, + 0x4674: 0x6CB2, + 0x4675: 0x6CB4, + 0x4676: 0x6CC2, + 0x4677: 0x6CC6, + 0x4678: 0x6CCD, + 0x4679: 0x6CCF, + 0x467A: 0x6CD0, + 0x467B: 0x6CD1, + 0x467C: 0x6CD2, + 0x467D: 0x6CD4, + 0x467E: 0x6CD6, + 0x4721: 0x6CDA, + 0x4722: 0x6CDC, + 0x4723: 0x6CE0, + 0x4724: 0x6CE7, + 0x4725: 0x6CE9, + 0x4726: 0x6CEB, + 0x4727: 0x6CEC, + 0x4728: 0x6CEE, + 0x4729: 0x6CF2, + 0x472A: 0x6CF4, + 0x472B: 0x6D04, + 0x472C: 0x6D07, + 0x472D: 0x6D0A, + 0x472E: 0x6D0E, + 0x472F: 0x6D0F, + 0x4730: 0x6D11, + 0x4731: 0x6D13, + 0x4732: 0x6D1A, + 0x4733: 0x6D26, + 0x4734: 0x6D27, + 0x4735: 0x6D28, + 0x4736: 0x6C67, + 0x4737: 0x6D2E, + 0x4738: 0x6D2F, + 0x4739: 0x6D31, + 0x473A: 0x6D39, + 0x473B: 0x6D3C, + 0x473C: 0x6D3F, + 0x473D: 0x6D57, + 0x473E: 0x6D5E, + 0x473F: 0x6D5F, + 0x4740: 0x6D61, + 0x4741: 0x6D65, + 0x4742: 0x6D67, + 0x4743: 0x6D6F, + 0x4744: 0x6D70, + 0x4745: 0x6D7C, + 0x4746: 0x6D82, + 0x4747: 0x6D87, + 0x4748: 0x6D91, + 0x4749: 0x6D92, + 0x474A: 0x6D94, + 0x474B: 0x6D96, + 0x474C: 0x6D97, + 0x474D: 0x6D98, + 0x474E: 0x6DAA, + 0x474F: 0x6DAC, + 0x4750: 0x6DB4, + 0x4751: 0x6DB7, + 0x4752: 0x6DB9, + 0x4753: 0x6DBD, + 0x4754: 0x6DBF, + 0x4755: 0x6DC4, + 0x4756: 0x6DC8, + 0x4757: 0x6DCA, + 0x4758: 0x6DCE, + 0x4759: 0x6DCF, + 0x475A: 0x6DD6, + 0x475B: 0x6DDB, + 0x475C: 0x6DDD, + 0x475D: 0x6DDF, + 0x475E: 0x6DE0, + 0x475F: 0x6DE2, + 0x4760: 0x6DE5, + 0x4761: 0x6DE9, + 0x4762: 0x6DEF, + 0x4763: 0x6DF0, + 0x4764: 0x6DF4, + 0x4765: 0x6DF6, + 0x4766: 0x6DFC, + 0x4767: 0x6E00, + 0x4768: 0x6E04, + 0x4769: 0x6E1E, + 0x476A: 0x6E22, + 0x476B: 0x6E27, + 0x476C: 0x6E32, + 0x476D: 0x6E36, + 0x476E: 0x6E39, + 0x476F: 0x6E3B, + 0x4770: 0x6E3C, + 0x4771: 0x6E44, + 0x4772: 0x6E45, + 0x4773: 0x6E48, + 0x4774: 0x6E49, + 0x4775: 0x6E4B, + 0x4776: 0x6E4F, + 0x4777: 0x6E51, + 0x4778: 0x6E52, + 0x4779: 0x6E53, + 0x477A: 0x6E54, + 0x477B: 0x6E57, + 0x477C: 0x6E5C, + 0x477D: 0x6E5D, + 0x477E: 0x6E5E, + 0x4821: 0x6E62, + 0x4822: 0x6E63, + 0x4823: 0x6E68, + 0x4824: 0x6E73, + 0x4825: 0x6E7B, + 0x4826: 0x6E7D, + 0x4827: 0x6E8D, + 0x4828: 0x6E93, + 0x4829: 0x6E99, + 0x482A: 0x6EA0, + 0x482B: 0x6EA7, + 0x482C: 0x6EAD, + 0x482D: 0x6EAE, + 0x482E: 0x6EB1, + 0x482F: 0x6EB3, + 0x4830: 0x6EBB, + 0x4831: 0x6EBF, + 0x4832: 0x6EC0, + 0x4833: 0x6EC1, + 0x4834: 0x6EC3, + 0x4835: 0x6EC7, + 0x4836: 0x6EC8, + 0x4837: 0x6ECA, + 0x4838: 0x6ECD, + 0x4839: 0x6ECE, + 0x483A: 0x6ECF, + 0x483B: 0x6EEB, + 0x483C: 0x6EED, + 0x483D: 0x6EEE, + 0x483E: 0x6EF9, + 0x483F: 0x6EFB, + 0x4840: 0x6EFD, + 0x4841: 0x6F04, + 0x4842: 0x6F08, + 0x4843: 0x6F0A, + 0x4844: 0x6F0C, + 0x4845: 0x6F0D, + 0x4846: 0x6F16, + 0x4847: 0x6F18, + 0x4848: 0x6F1A, + 0x4849: 0x6F1B, + 0x484A: 0x6F26, + 0x484B: 0x6F29, + 0x484C: 0x6F2A, + 0x484D: 0x6F2F, + 0x484E: 0x6F30, + 0x484F: 0x6F33, + 0x4850: 0x6F36, + 0x4851: 0x6F3B, + 0x4852: 0x6F3C, + 0x4853: 0x6F2D, + 0x4854: 0x6F4F, + 0x4855: 0x6F51, + 0x4856: 0x6F52, + 0x4857: 0x6F53, + 0x4858: 0x6F57, + 0x4859: 0x6F59, + 0x485A: 0x6F5A, + 0x485B: 0x6F5D, + 0x485C: 0x6F5E, + 0x485D: 0x6F61, + 0x485E: 0x6F62, + 0x485F: 0x6F68, + 0x4860: 0x6F6C, + 0x4861: 0x6F7D, + 0x4862: 0x6F7E, + 0x4863: 0x6F83, + 0x4864: 0x6F87, + 0x4865: 0x6F88, + 0x4866: 0x6F8B, + 0x4867: 0x6F8C, + 0x4868: 0x6F8D, + 0x4869: 0x6F90, + 0x486A: 0x6F92, + 0x486B: 0x6F93, + 0x486C: 0x6F94, + 0x486D: 0x6F96, + 0x486E: 0x6F9A, + 0x486F: 0x6F9F, + 0x4870: 0x6FA0, + 0x4871: 0x6FA5, + 0x4872: 0x6FA6, + 0x4873: 0x6FA7, + 0x4874: 0x6FA8, + 0x4875: 0x6FAE, + 0x4876: 0x6FAF, + 0x4877: 0x6FB0, + 0x4878: 0x6FB5, + 0x4879: 0x6FB6, + 0x487A: 0x6FBC, + 0x487B: 0x6FC5, + 0x487C: 0x6FC7, + 0x487D: 0x6FC8, + 0x487E: 0x6FCA, + 0x4921: 0x6FDA, + 0x4922: 0x6FDE, + 0x4923: 0x6FE8, + 0x4924: 0x6FE9, + 0x4925: 0x6FF0, + 0x4926: 0x6FF5, + 0x4927: 0x6FF9, + 0x4928: 0x6FFC, + 0x4929: 0x6FFD, + 0x492A: 0x7000, + 0x492B: 0x7005, + 0x492C: 0x7006, + 0x492D: 0x7007, + 0x492E: 0x700D, + 0x492F: 0x7017, + 0x4930: 0x7020, + 0x4931: 0x7023, + 0x4932: 0x702F, + 0x4933: 0x7034, + 0x4934: 0x7037, + 0x4935: 0x7039, + 0x4936: 0x703C, + 0x4937: 0x7043, + 0x4938: 0x7044, + 0x4939: 0x7048, + 0x493A: 0x7049, + 0x493B: 0x704A, + 0x493C: 0x704B, + 0x493D: 0x7054, + 0x493E: 0x7055, + 0x493F: 0x705D, + 0x4940: 0x705E, + 0x4941: 0x704E, + 0x4942: 0x7064, + 0x4943: 0x7065, + 0x4944: 0x706C, + 0x4945: 0x706E, + 0x4946: 0x7075, + 0x4947: 0x7076, + 0x4948: 0x707E, + 0x4949: 0x7081, + 0x494A: 0x7085, + 0x494B: 0x7086, + 0x494C: 0x7094, + 0x494D: 0x7095, + 0x494E: 0x7096, + 0x494F: 0x7097, + 0x4950: 0x7098, + 0x4951: 0x709B, + 0x4952: 0x70A4, + 0x4953: 0x70AB, + 0x4954: 0x70B0, + 0x4955: 0x70B1, + 0x4956: 0x70B4, + 0x4957: 0x70B7, + 0x4958: 0x70CA, + 0x4959: 0x70D1, + 0x495A: 0x70D3, + 0x495B: 0x70D4, + 0x495C: 0x70D5, + 0x495D: 0x70D6, + 0x495E: 0x70D8, + 0x495F: 0x70DC, + 0x4960: 0x70E4, + 0x4961: 0x70FA, + 0x4962: 0x7103, + 0x4963: 0x7104, + 0x4964: 0x7105, + 0x4965: 0x7106, + 0x4966: 0x7107, + 0x4967: 0x710B, + 0x4968: 0x710C, + 0x4969: 0x710F, + 0x496A: 0x711E, + 0x496B: 0x7120, + 0x496C: 0x712B, + 0x496D: 0x712D, + 0x496E: 0x712F, + 0x496F: 0x7130, + 0x4970: 0x7131, + 0x4971: 0x7138, + 0x4972: 0x7141, + 0x4973: 0x7145, + 0x4974: 0x7146, + 0x4975: 0x7147, + 0x4976: 0x714A, + 0x4977: 0x714B, + 0x4978: 0x7150, + 0x4979: 0x7152, + 0x497A: 0x7157, + 0x497B: 0x715A, + 0x497C: 0x715C, + 0x497D: 0x715E, + 0x497E: 0x7160, + 0x4A21: 0x7168, + 0x4A22: 0x7179, + 0x4A23: 0x7180, + 0x4A24: 0x7185, + 0x4A25: 0x7187, + 0x4A26: 0x718C, + 0x4A27: 0x7192, + 0x4A28: 0x719A, + 0x4A29: 0x719B, + 0x4A2A: 0x71A0, + 0x4A2B: 0x71A2, + 0x4A2C: 0x71AF, + 0x4A2D: 0x71B0, + 0x4A2E: 0x71B2, + 0x4A2F: 0x71B3, + 0x4A30: 0x71BA, + 0x4A31: 0x71BF, + 0x4A32: 0x71C0, + 0x4A33: 0x71C1, + 0x4A34: 0x71C4, + 0x4A35: 0x71CB, + 0x4A36: 0x71CC, + 0x4A37: 0x71D3, + 0x4A38: 0x71D6, + 0x4A39: 0x71D9, + 0x4A3A: 0x71DA, + 0x4A3B: 0x71DC, + 0x4A3C: 0x71F8, + 0x4A3D: 0x71FE, + 0x4A3E: 0x7200, + 0x4A3F: 0x7207, + 0x4A40: 0x7208, + 0x4A41: 0x7209, + 0x4A42: 0x7213, + 0x4A43: 0x7217, + 0x4A44: 0x721A, + 0x4A45: 0x721D, + 0x4A46: 0x721F, + 0x4A47: 0x7224, + 0x4A48: 0x722B, + 0x4A49: 0x722F, + 0x4A4A: 0x7234, + 0x4A4B: 0x7238, + 0x4A4C: 0x7239, + 0x4A4D: 0x7241, + 0x4A4E: 0x7242, + 0x4A4F: 0x7243, + 0x4A50: 0x7245, + 0x4A51: 0x724E, + 0x4A52: 0x724F, + 0x4A53: 0x7250, + 0x4A54: 0x7253, + 0x4A55: 0x7255, + 0x4A56: 0x7256, + 0x4A57: 0x725A, + 0x4A58: 0x725C, + 0x4A59: 0x725E, + 0x4A5A: 0x7260, + 0x4A5B: 0x7263, + 0x4A5C: 0x7268, + 0x4A5D: 0x726B, + 0x4A5E: 0x726E, + 0x4A5F: 0x726F, + 0x4A60: 0x7271, + 0x4A61: 0x7277, + 0x4A62: 0x7278, + 0x4A63: 0x727B, + 0x4A64: 0x727C, + 0x4A65: 0x727F, + 0x4A66: 0x7284, + 0x4A67: 0x7289, + 0x4A68: 0x728D, + 0x4A69: 0x728E, + 0x4A6A: 0x7293, + 0x4A6B: 0x729B, + 0x4A6C: 0x72A8, + 0x4A6D: 0x72AD, + 0x4A6E: 0x72AE, + 0x4A6F: 0x72B1, + 0x4A70: 0x72B4, + 0x4A71: 0x72BE, + 0x4A72: 0x72C1, + 0x4A73: 0x72C7, + 0x4A74: 0x72C9, + 0x4A75: 0x72CC, + 0x4A76: 0x72D5, + 0x4A77: 0x72D6, + 0x4A78: 0x72D8, + 0x4A79: 0x72DF, + 0x4A7A: 0x72E5, + 0x4A7B: 0x72F3, + 0x4A7C: 0x72F4, + 0x4A7D: 0x72FA, + 0x4A7E: 0x72FB, + 0x4B21: 0x72FE, + 0x4B22: 0x7302, + 0x4B23: 0x7304, + 0x4B24: 0x7305, + 0x4B25: 0x7307, + 0x4B26: 0x730B, + 0x4B27: 0x730D, + 0x4B28: 0x7312, + 0x4B29: 0x7313, + 0x4B2A: 0x7318, + 0x4B2B: 0x7319, + 0x4B2C: 0x731E, + 0x4B2D: 0x7322, + 0x4B2E: 0x7324, + 0x4B2F: 0x7327, + 0x4B30: 0x7328, + 0x4B31: 0x732C, + 0x4B32: 0x7331, + 0x4B33: 0x7332, + 0x4B34: 0x7335, + 0x4B35: 0x733A, + 0x4B36: 0x733B, + 0x4B37: 0x733D, + 0x4B38: 0x7343, + 0x4B39: 0x734D, + 0x4B3A: 0x7350, + 0x4B3B: 0x7352, + 0x4B3C: 0x7356, + 0x4B3D: 0x7358, + 0x4B3E: 0x735D, + 0x4B3F: 0x735E, + 0x4B40: 0x735F, + 0x4B41: 0x7360, + 0x4B42: 0x7366, + 0x4B43: 0x7367, + 0x4B44: 0x7369, + 0x4B45: 0x736B, + 0x4B46: 0x736C, + 0x4B47: 0x736E, + 0x4B48: 0x736F, + 0x4B49: 0x7371, + 0x4B4A: 0x7377, + 0x4B4B: 0x7379, + 0x4B4C: 0x737C, + 0x4B4D: 0x7380, + 0x4B4E: 0x7381, + 0x4B4F: 0x7383, + 0x4B50: 0x7385, + 0x4B51: 0x7386, + 0x4B52: 0x738E, + 0x4B53: 0x7390, + 0x4B54: 0x7393, + 0x4B55: 0x7395, + 0x4B56: 0x7397, + 0x4B57: 0x7398, + 0x4B58: 0x739C, + 0x4B59: 0x739E, + 0x4B5A: 0x739F, + 0x4B5B: 0x73A0, + 0x4B5C: 0x73A2, + 0x4B5D: 0x73A5, + 0x4B5E: 0x73A6, + 0x4B5F: 0x73AA, + 0x4B60: 0x73AB, + 0x4B61: 0x73AD, + 0x4B62: 0x73B5, + 0x4B63: 0x73B7, + 0x4B64: 0x73B9, + 0x4B65: 0x73BC, + 0x4B66: 0x73BD, + 0x4B67: 0x73BF, + 0x4B68: 0x73C5, + 0x4B69: 0x73C6, + 0x4B6A: 0x73C9, + 0x4B6B: 0x73CB, + 0x4B6C: 0x73CC, + 0x4B6D: 0x73CF, + 0x4B6E: 0x73D2, + 0x4B6F: 0x73D3, + 0x4B70: 0x73D6, + 0x4B71: 0x73D9, + 0x4B72: 0x73DD, + 0x4B73: 0x73E1, + 0x4B74: 0x73E3, + 0x4B75: 0x73E6, + 0x4B76: 0x73E7, + 0x4B77: 0x73E9, + 0x4B78: 0x73F4, + 0x4B79: 0x73F5, + 0x4B7A: 0x73F7, + 0x4B7B: 0x73F9, + 0x4B7C: 0x73FA, + 0x4B7D: 0x73FB, + 0x4B7E: 0x73FD, + 0x4C21: 0x73FF, + 0x4C22: 0x7400, + 0x4C23: 0x7401, + 0x4C24: 0x7404, + 0x4C25: 0x7407, + 0x4C26: 0x740A, + 0x4C27: 0x7411, + 0x4C28: 0x741A, + 0x4C29: 0x741B, + 0x4C2A: 0x7424, + 0x4C2B: 0x7426, + 0x4C2C: 0x7428, + 0x4C2D: 0x7429, + 0x4C2E: 0x742A, + 0x4C2F: 0x742B, + 0x4C30: 0x742C, + 0x4C31: 0x742D, + 0x4C32: 0x742E, + 0x4C33: 0x742F, + 0x4C34: 0x7430, + 0x4C35: 0x7431, + 0x4C36: 0x7439, + 0x4C37: 0x7440, + 0x4C38: 0x7443, + 0x4C39: 0x7444, + 0x4C3A: 0x7446, + 0x4C3B: 0x7447, + 0x4C3C: 0x744B, + 0x4C3D: 0x744D, + 0x4C3E: 0x7451, + 0x4C3F: 0x7452, + 0x4C40: 0x7457, + 0x4C41: 0x745D, + 0x4C42: 0x7462, + 0x4C43: 0x7466, + 0x4C44: 0x7467, + 0x4C45: 0x7468, + 0x4C46: 0x746B, + 0x4C47: 0x746D, + 0x4C48: 0x746E, + 0x4C49: 0x7471, + 0x4C4A: 0x7472, + 0x4C4B: 0x7480, + 0x4C4C: 0x7481, + 0x4C4D: 0x7485, + 0x4C4E: 0x7486, + 0x4C4F: 0x7487, + 0x4C50: 0x7489, + 0x4C51: 0x748F, + 0x4C52: 0x7490, + 0x4C53: 0x7491, + 0x4C54: 0x7492, + 0x4C55: 0x7498, + 0x4C56: 0x7499, + 0x4C57: 0x749A, + 0x4C58: 0x749C, + 0x4C59: 0x749F, + 0x4C5A: 0x74A0, + 0x4C5B: 0x74A1, + 0x4C5C: 0x74A3, + 0x4C5D: 0x74A6, + 0x4C5E: 0x74A8, + 0x4C5F: 0x74A9, + 0x4C60: 0x74AA, + 0x4C61: 0x74AB, + 0x4C62: 0x74AE, + 0x4C63: 0x74AF, + 0x4C64: 0x74B1, + 0x4C65: 0x74B2, + 0x4C66: 0x74B5, + 0x4C67: 0x74B9, + 0x4C68: 0x74BB, + 0x4C69: 0x74BF, + 0x4C6A: 0x74C8, + 0x4C6B: 0x74C9, + 0x4C6C: 0x74CC, + 0x4C6D: 0x74D0, + 0x4C6E: 0x74D3, + 0x4C6F: 0x74D8, + 0x4C70: 0x74DA, + 0x4C71: 0x74DB, + 0x4C72: 0x74DE, + 0x4C73: 0x74DF, + 0x4C74: 0x74E4, + 0x4C75: 0x74E8, + 0x4C76: 0x74EA, + 0x4C77: 0x74EB, + 0x4C78: 0x74EF, + 0x4C79: 0x74F4, + 0x4C7A: 0x74FA, + 0x4C7B: 0x74FB, + 0x4C7C: 0x74FC, + 0x4C7D: 0x74FF, + 0x4C7E: 0x7506, + 0x4D21: 0x7512, + 0x4D22: 0x7516, + 0x4D23: 0x7517, + 0x4D24: 0x7520, + 0x4D25: 0x7521, + 0x4D26: 0x7524, + 0x4D27: 0x7527, + 0x4D28: 0x7529, + 0x4D29: 0x752A, + 0x4D2A: 0x752F, + 0x4D2B: 0x7536, + 0x4D2C: 0x7539, + 0x4D2D: 0x753D, + 0x4D2E: 0x753E, + 0x4D2F: 0x753F, + 0x4D30: 0x7540, + 0x4D31: 0x7543, + 0x4D32: 0x7547, + 0x4D33: 0x7548, + 0x4D34: 0x754E, + 0x4D35: 0x7550, + 0x4D36: 0x7552, + 0x4D37: 0x7557, + 0x4D38: 0x755E, + 0x4D39: 0x755F, + 0x4D3A: 0x7561, + 0x4D3B: 0x756F, + 0x4D3C: 0x7571, + 0x4D3D: 0x7579, + 0x4D3E: 0x757A, + 0x4D3F: 0x757B, + 0x4D40: 0x757C, + 0x4D41: 0x757D, + 0x4D42: 0x757E, + 0x4D43: 0x7581, + 0x4D44: 0x7585, + 0x4D45: 0x7590, + 0x4D46: 0x7592, + 0x4D47: 0x7593, + 0x4D48: 0x7595, + 0x4D49: 0x7599, + 0x4D4A: 0x759C, + 0x4D4B: 0x75A2, + 0x4D4C: 0x75A4, + 0x4D4D: 0x75B4, + 0x4D4E: 0x75BA, + 0x4D4F: 0x75BF, + 0x4D50: 0x75C0, + 0x4D51: 0x75C1, + 0x4D52: 0x75C4, + 0x4D53: 0x75C6, + 0x4D54: 0x75CC, + 0x4D55: 0x75CE, + 0x4D56: 0x75CF, + 0x4D57: 0x75D7, + 0x4D58: 0x75DC, + 0x4D59: 0x75DF, + 0x4D5A: 0x75E0, + 0x4D5B: 0x75E1, + 0x4D5C: 0x75E4, + 0x4D5D: 0x75E7, + 0x4D5E: 0x75EC, + 0x4D5F: 0x75EE, + 0x4D60: 0x75EF, + 0x4D61: 0x75F1, + 0x4D62: 0x75F9, + 0x4D63: 0x7600, + 0x4D64: 0x7602, + 0x4D65: 0x7603, + 0x4D66: 0x7604, + 0x4D67: 0x7607, + 0x4D68: 0x7608, + 0x4D69: 0x760A, + 0x4D6A: 0x760C, + 0x4D6B: 0x760F, + 0x4D6C: 0x7612, + 0x4D6D: 0x7613, + 0x4D6E: 0x7615, + 0x4D6F: 0x7616, + 0x4D70: 0x7619, + 0x4D71: 0x761B, + 0x4D72: 0x761C, + 0x4D73: 0x761D, + 0x4D74: 0x761E, + 0x4D75: 0x7623, + 0x4D76: 0x7625, + 0x4D77: 0x7626, + 0x4D78: 0x7629, + 0x4D79: 0x762D, + 0x4D7A: 0x7632, + 0x4D7B: 0x7633, + 0x4D7C: 0x7635, + 0x4D7D: 0x7638, + 0x4D7E: 0x7639, + 0x4E21: 0x763A, + 0x4E22: 0x763C, + 0x4E23: 0x764A, + 0x4E24: 0x7640, + 0x4E25: 0x7641, + 0x4E26: 0x7643, + 0x4E27: 0x7644, + 0x4E28: 0x7645, + 0x4E29: 0x7649, + 0x4E2A: 0x764B, + 0x4E2B: 0x7655, + 0x4E2C: 0x7659, + 0x4E2D: 0x765F, + 0x4E2E: 0x7664, + 0x4E2F: 0x7665, + 0x4E30: 0x766D, + 0x4E31: 0x766E, + 0x4E32: 0x766F, + 0x4E33: 0x7671, + 0x4E34: 0x7674, + 0x4E35: 0x7681, + 0x4E36: 0x7685, + 0x4E37: 0x768C, + 0x4E38: 0x768D, + 0x4E39: 0x7695, + 0x4E3A: 0x769B, + 0x4E3B: 0x769C, + 0x4E3C: 0x769D, + 0x4E3D: 0x769F, + 0x4E3E: 0x76A0, + 0x4E3F: 0x76A2, + 0x4E40: 0x76A3, + 0x4E41: 0x76A4, + 0x4E42: 0x76A5, + 0x4E43: 0x76A6, + 0x4E44: 0x76A7, + 0x4E45: 0x76A8, + 0x4E46: 0x76AA, + 0x4E47: 0x76AD, + 0x4E48: 0x76BD, + 0x4E49: 0x76C1, + 0x4E4A: 0x76C5, + 0x4E4B: 0x76C9, + 0x4E4C: 0x76CB, + 0x4E4D: 0x76CC, + 0x4E4E: 0x76CE, + 0x4E4F: 0x76D4, + 0x4E50: 0x76D9, + 0x4E51: 0x76E0, + 0x4E52: 0x76E6, + 0x4E53: 0x76E8, + 0x4E54: 0x76EC, + 0x4E55: 0x76F0, + 0x4E56: 0x76F1, + 0x4E57: 0x76F6, + 0x4E58: 0x76F9, + 0x4E59: 0x76FC, + 0x4E5A: 0x7700, + 0x4E5B: 0x7706, + 0x4E5C: 0x770A, + 0x4E5D: 0x770E, + 0x4E5E: 0x7712, + 0x4E5F: 0x7714, + 0x4E60: 0x7715, + 0x4E61: 0x7717, + 0x4E62: 0x7719, + 0x4E63: 0x771A, + 0x4E64: 0x771C, + 0x4E65: 0x7722, + 0x4E66: 0x7728, + 0x4E67: 0x772D, + 0x4E68: 0x772E, + 0x4E69: 0x772F, + 0x4E6A: 0x7734, + 0x4E6B: 0x7735, + 0x4E6C: 0x7736, + 0x4E6D: 0x7739, + 0x4E6E: 0x773D, + 0x4E6F: 0x773E, + 0x4E70: 0x7742, + 0x4E71: 0x7745, + 0x4E72: 0x7746, + 0x4E73: 0x774A, + 0x4E74: 0x774D, + 0x4E75: 0x774E, + 0x4E76: 0x774F, + 0x4E77: 0x7752, + 0x4E78: 0x7756, + 0x4E79: 0x7757, + 0x4E7A: 0x775C, + 0x4E7B: 0x775E, + 0x4E7C: 0x775F, + 0x4E7D: 0x7760, + 0x4E7E: 0x7762, + 0x4F21: 0x7764, + 0x4F22: 0x7767, + 0x4F23: 0x776A, + 0x4F24: 0x776C, + 0x4F25: 0x7770, + 0x4F26: 0x7772, + 0x4F27: 0x7773, + 0x4F28: 0x7774, + 0x4F29: 0x777A, + 0x4F2A: 0x777D, + 0x4F2B: 0x7780, + 0x4F2C: 0x7784, + 0x4F2D: 0x778C, + 0x4F2E: 0x778D, + 0x4F2F: 0x7794, + 0x4F30: 0x7795, + 0x4F31: 0x7796, + 0x4F32: 0x779A, + 0x4F33: 0x779F, + 0x4F34: 0x77A2, + 0x4F35: 0x77A7, + 0x4F36: 0x77AA, + 0x4F37: 0x77AE, + 0x4F38: 0x77AF, + 0x4F39: 0x77B1, + 0x4F3A: 0x77B5, + 0x4F3B: 0x77BE, + 0x4F3C: 0x77C3, + 0x4F3D: 0x77C9, + 0x4F3E: 0x77D1, + 0x4F3F: 0x77D2, + 0x4F40: 0x77D5, + 0x4F41: 0x77D9, + 0x4F42: 0x77DE, + 0x4F43: 0x77DF, + 0x4F44: 0x77E0, + 0x4F45: 0x77E4, + 0x4F46: 0x77E6, + 0x4F47: 0x77EA, + 0x4F48: 0x77EC, + 0x4F49: 0x77F0, + 0x4F4A: 0x77F1, + 0x4F4B: 0x77F4, + 0x4F4C: 0x77F8, + 0x4F4D: 0x77FB, + 0x4F4E: 0x7805, + 0x4F4F: 0x7806, + 0x4F50: 0x7809, + 0x4F51: 0x780D, + 0x4F52: 0x780E, + 0x4F53: 0x7811, + 0x4F54: 0x781D, + 0x4F55: 0x7821, + 0x4F56: 0x7822, + 0x4F57: 0x7823, + 0x4F58: 0x782D, + 0x4F59: 0x782E, + 0x4F5A: 0x7830, + 0x4F5B: 0x7835, + 0x4F5C: 0x7837, + 0x4F5D: 0x7843, + 0x4F5E: 0x7844, + 0x4F5F: 0x7847, + 0x4F60: 0x7848, + 0x4F61: 0x784C, + 0x4F62: 0x784E, + 0x4F63: 0x7852, + 0x4F64: 0x785C, + 0x4F65: 0x785E, + 0x4F66: 0x7860, + 0x4F67: 0x7861, + 0x4F68: 0x7863, + 0x4F69: 0x7864, + 0x4F6A: 0x7868, + 0x4F6B: 0x786A, + 0x4F6C: 0x786E, + 0x4F6D: 0x787A, + 0x4F6E: 0x787E, + 0x4F6F: 0x788A, + 0x4F70: 0x788F, + 0x4F71: 0x7894, + 0x4F72: 0x7898, + 0x4F73: 0x78A1, + 0x4F74: 0x789D, + 0x4F75: 0x789E, + 0x4F76: 0x789F, + 0x4F77: 0x78A4, + 0x4F78: 0x78A8, + 0x4F79: 0x78AC, + 0x4F7A: 0x78AD, + 0x4F7B: 0x78B0, + 0x4F7C: 0x78B1, + 0x4F7D: 0x78B2, + 0x4F7E: 0x78B3, + 0x5021: 0x78BB, + 0x5022: 0x78BD, + 0x5023: 0x78BF, + 0x5024: 0x78C7, + 0x5025: 0x78C8, + 0x5026: 0x78C9, + 0x5027: 0x78CC, + 0x5028: 0x78CE, + 0x5029: 0x78D2, + 0x502A: 0x78D3, + 0x502B: 0x78D5, + 0x502C: 0x78D6, + 0x502D: 0x78E4, + 0x502E: 0x78DB, + 0x502F: 0x78DF, + 0x5030: 0x78E0, + 0x5031: 0x78E1, + 0x5032: 0x78E6, + 0x5033: 0x78EA, + 0x5034: 0x78F2, + 0x5035: 0x78F3, + 0x5036: 0x7900, + 0x5037: 0x78F6, + 0x5038: 0x78F7, + 0x5039: 0x78FA, + 0x503A: 0x78FB, + 0x503B: 0x78FF, + 0x503C: 0x7906, + 0x503D: 0x790C, + 0x503E: 0x7910, + 0x503F: 0x791A, + 0x5040: 0x791C, + 0x5041: 0x791E, + 0x5042: 0x791F, + 0x5043: 0x7920, + 0x5044: 0x7925, + 0x5045: 0x7927, + 0x5046: 0x7929, + 0x5047: 0x792D, + 0x5048: 0x7931, + 0x5049: 0x7934, + 0x504A: 0x7935, + 0x504B: 0x793B, + 0x504C: 0x793D, + 0x504D: 0x793F, + 0x504E: 0x7944, + 0x504F: 0x7945, + 0x5050: 0x7946, + 0x5051: 0x794A, + 0x5052: 0x794B, + 0x5053: 0x794F, + 0x5054: 0x7951, + 0x5055: 0x7954, + 0x5056: 0x7958, + 0x5057: 0x795B, + 0x5058: 0x795C, + 0x5059: 0x7967, + 0x505A: 0x7969, + 0x505B: 0x796B, + 0x505C: 0x7972, + 0x505D: 0x7979, + 0x505E: 0x797B, + 0x505F: 0x797C, + 0x5060: 0x797E, + 0x5061: 0x798B, + 0x5062: 0x798C, + 0x5063: 0x7991, + 0x5064: 0x7993, + 0x5065: 0x7994, + 0x5066: 0x7995, + 0x5067: 0x7996, + 0x5068: 0x7998, + 0x5069: 0x799B, + 0x506A: 0x799C, + 0x506B: 0x79A1, + 0x506C: 0x79A8, + 0x506D: 0x79A9, + 0x506E: 0x79AB, + 0x506F: 0x79AF, + 0x5070: 0x79B1, + 0x5071: 0x79B4, + 0x5072: 0x79B8, + 0x5073: 0x79BB, + 0x5074: 0x79C2, + 0x5075: 0x79C4, + 0x5076: 0x79C7, + 0x5077: 0x79C8, + 0x5078: 0x79CA, + 0x5079: 0x79CF, + 0x507A: 0x79D4, + 0x507B: 0x79D6, + 0x507C: 0x79DA, + 0x507D: 0x79DD, + 0x507E: 0x79DE, + 0x5121: 0x79E0, + 0x5122: 0x79E2, + 0x5123: 0x79E5, + 0x5124: 0x79EA, + 0x5125: 0x79EB, + 0x5126: 0x79ED, + 0x5127: 0x79F1, + 0x5128: 0x79F8, + 0x5129: 0x79FC, + 0x512A: 0x7A02, + 0x512B: 0x7A03, + 0x512C: 0x7A07, + 0x512D: 0x7A09, + 0x512E: 0x7A0A, + 0x512F: 0x7A0C, + 0x5130: 0x7A11, + 0x5131: 0x7A15, + 0x5132: 0x7A1B, + 0x5133: 0x7A1E, + 0x5134: 0x7A21, + 0x5135: 0x7A27, + 0x5136: 0x7A2B, + 0x5137: 0x7A2D, + 0x5138: 0x7A2F, + 0x5139: 0x7A30, + 0x513A: 0x7A34, + 0x513B: 0x7A35, + 0x513C: 0x7A38, + 0x513D: 0x7A39, + 0x513E: 0x7A3A, + 0x513F: 0x7A44, + 0x5140: 0x7A45, + 0x5141: 0x7A47, + 0x5142: 0x7A48, + 0x5143: 0x7A4C, + 0x5144: 0x7A55, + 0x5145: 0x7A56, + 0x5146: 0x7A59, + 0x5147: 0x7A5C, + 0x5148: 0x7A5D, + 0x5149: 0x7A5F, + 0x514A: 0x7A60, + 0x514B: 0x7A65, + 0x514C: 0x7A67, + 0x514D: 0x7A6A, + 0x514E: 0x7A6D, + 0x514F: 0x7A75, + 0x5150: 0x7A78, + 0x5151: 0x7A7E, + 0x5152: 0x7A80, + 0x5153: 0x7A82, + 0x5154: 0x7A85, + 0x5155: 0x7A86, + 0x5156: 0x7A8A, + 0x5157: 0x7A8B, + 0x5158: 0x7A90, + 0x5159: 0x7A91, + 0x515A: 0x7A94, + 0x515B: 0x7A9E, + 0x515C: 0x7AA0, + 0x515D: 0x7AA3, + 0x515E: 0x7AAC, + 0x515F: 0x7AB3, + 0x5160: 0x7AB5, + 0x5161: 0x7AB9, + 0x5162: 0x7ABB, + 0x5163: 0x7ABC, + 0x5164: 0x7AC6, + 0x5165: 0x7AC9, + 0x5166: 0x7ACC, + 0x5167: 0x7ACE, + 0x5168: 0x7AD1, + 0x5169: 0x7ADB, + 0x516A: 0x7AE8, + 0x516B: 0x7AE9, + 0x516C: 0x7AEB, + 0x516D: 0x7AEC, + 0x516E: 0x7AF1, + 0x516F: 0x7AF4, + 0x5170: 0x7AFB, + 0x5171: 0x7AFD, + 0x5172: 0x7AFE, + 0x5173: 0x7B07, + 0x5174: 0x7B14, + 0x5175: 0x7B1F, + 0x5176: 0x7B23, + 0x5177: 0x7B27, + 0x5178: 0x7B29, + 0x5179: 0x7B2A, + 0x517A: 0x7B2B, + 0x517B: 0x7B2D, + 0x517C: 0x7B2E, + 0x517D: 0x7B2F, + 0x517E: 0x7B30, + 0x5221: 0x7B31, + 0x5222: 0x7B34, + 0x5223: 0x7B3D, + 0x5224: 0x7B3F, + 0x5225: 0x7B40, + 0x5226: 0x7B41, + 0x5227: 0x7B47, + 0x5228: 0x7B4E, + 0x5229: 0x7B55, + 0x522A: 0x7B60, + 0x522B: 0x7B64, + 0x522C: 0x7B66, + 0x522D: 0x7B69, + 0x522E: 0x7B6A, + 0x522F: 0x7B6D, + 0x5230: 0x7B6F, + 0x5231: 0x7B72, + 0x5232: 0x7B73, + 0x5233: 0x7B77, + 0x5234: 0x7B84, + 0x5235: 0x7B89, + 0x5236: 0x7B8E, + 0x5237: 0x7B90, + 0x5238: 0x7B91, + 0x5239: 0x7B96, + 0x523A: 0x7B9B, + 0x523B: 0x7B9E, + 0x523C: 0x7BA0, + 0x523D: 0x7BA5, + 0x523E: 0x7BAC, + 0x523F: 0x7BAF, + 0x5240: 0x7BB0, + 0x5241: 0x7BB2, + 0x5242: 0x7BB5, + 0x5243: 0x7BB6, + 0x5244: 0x7BBA, + 0x5245: 0x7BBB, + 0x5246: 0x7BBC, + 0x5247: 0x7BBD, + 0x5248: 0x7BC2, + 0x5249: 0x7BC5, + 0x524A: 0x7BC8, + 0x524B: 0x7BCA, + 0x524C: 0x7BD4, + 0x524D: 0x7BD6, + 0x524E: 0x7BD7, + 0x524F: 0x7BD9, + 0x5250: 0x7BDA, + 0x5251: 0x7BDB, + 0x5252: 0x7BE8, + 0x5253: 0x7BEA, + 0x5254: 0x7BF2, + 0x5255: 0x7BF4, + 0x5256: 0x7BF5, + 0x5257: 0x7BF8, + 0x5258: 0x7BF9, + 0x5259: 0x7BFA, + 0x525A: 0x7BFC, + 0x525B: 0x7BFE, + 0x525C: 0x7C01, + 0x525D: 0x7C02, + 0x525E: 0x7C03, + 0x525F: 0x7C04, + 0x5260: 0x7C06, + 0x5261: 0x7C09, + 0x5262: 0x7C0B, + 0x5263: 0x7C0C, + 0x5264: 0x7C0E, + 0x5265: 0x7C0F, + 0x5266: 0x7C19, + 0x5267: 0x7C1B, + 0x5268: 0x7C20, + 0x5269: 0x7C25, + 0x526A: 0x7C26, + 0x526B: 0x7C28, + 0x526C: 0x7C2C, + 0x526D: 0x7C31, + 0x526E: 0x7C33, + 0x526F: 0x7C34, + 0x5270: 0x7C36, + 0x5271: 0x7C39, + 0x5272: 0x7C3A, + 0x5273: 0x7C46, + 0x5274: 0x7C4A, + 0x5275: 0x7C55, + 0x5276: 0x7C51, + 0x5277: 0x7C52, + 0x5278: 0x7C53, + 0x5279: 0x7C59, + 0x527A: 0x7C5A, + 0x527B: 0x7C5B, + 0x527C: 0x7C5C, + 0x527D: 0x7C5D, + 0x527E: 0x7C5E, + 0x5321: 0x7C61, + 0x5322: 0x7C63, + 0x5323: 0x7C67, + 0x5324: 0x7C69, + 0x5325: 0x7C6D, + 0x5326: 0x7C6E, + 0x5327: 0x7C70, + 0x5328: 0x7C72, + 0x5329: 0x7C79, + 0x532A: 0x7C7C, + 0x532B: 0x7C7D, + 0x532C: 0x7C86, + 0x532D: 0x7C87, + 0x532E: 0x7C8F, + 0x532F: 0x7C94, + 0x5330: 0x7C9E, + 0x5331: 0x7CA0, + 0x5332: 0x7CA6, + 0x5333: 0x7CB0, + 0x5334: 0x7CB6, + 0x5335: 0x7CB7, + 0x5336: 0x7CBA, + 0x5337: 0x7CBB, + 0x5338: 0x7CBC, + 0x5339: 0x7CBF, + 0x533A: 0x7CC4, + 0x533B: 0x7CC7, + 0x533C: 0x7CC8, + 0x533D: 0x7CC9, + 0x533E: 0x7CCD, + 0x533F: 0x7CCF, + 0x5340: 0x7CD3, + 0x5341: 0x7CD4, + 0x5342: 0x7CD5, + 0x5343: 0x7CD7, + 0x5344: 0x7CD9, + 0x5345: 0x7CDA, + 0x5346: 0x7CDD, + 0x5347: 0x7CE6, + 0x5348: 0x7CE9, + 0x5349: 0x7CEB, + 0x534A: 0x7CF5, + 0x534B: 0x7D03, + 0x534C: 0x7D07, + 0x534D: 0x7D08, + 0x534E: 0x7D09, + 0x534F: 0x7D0F, + 0x5350: 0x7D11, + 0x5351: 0x7D12, + 0x5352: 0x7D13, + 0x5353: 0x7D16, + 0x5354: 0x7D1D, + 0x5355: 0x7D1E, + 0x5356: 0x7D23, + 0x5357: 0x7D26, + 0x5358: 0x7D2A, + 0x5359: 0x7D2D, + 0x535A: 0x7D31, + 0x535B: 0x7D3C, + 0x535C: 0x7D3D, + 0x535D: 0x7D3E, + 0x535E: 0x7D40, + 0x535F: 0x7D41, + 0x5360: 0x7D47, + 0x5361: 0x7D48, + 0x5362: 0x7D4D, + 0x5363: 0x7D51, + 0x5364: 0x7D53, + 0x5365: 0x7D57, + 0x5366: 0x7D59, + 0x5367: 0x7D5A, + 0x5368: 0x7D5C, + 0x5369: 0x7D5D, + 0x536A: 0x7D65, + 0x536B: 0x7D67, + 0x536C: 0x7D6A, + 0x536D: 0x7D70, + 0x536E: 0x7D78, + 0x536F: 0x7D7A, + 0x5370: 0x7D7B, + 0x5371: 0x7D7F, + 0x5372: 0x7D81, + 0x5373: 0x7D82, + 0x5374: 0x7D83, + 0x5375: 0x7D85, + 0x5376: 0x7D86, + 0x5377: 0x7D88, + 0x5378: 0x7D8B, + 0x5379: 0x7D8C, + 0x537A: 0x7D8D, + 0x537B: 0x7D91, + 0x537C: 0x7D96, + 0x537D: 0x7D97, + 0x537E: 0x7D9D, + 0x5421: 0x7D9E, + 0x5422: 0x7DA6, + 0x5423: 0x7DA7, + 0x5424: 0x7DAA, + 0x5425: 0x7DB3, + 0x5426: 0x7DB6, + 0x5427: 0x7DB7, + 0x5428: 0x7DB9, + 0x5429: 0x7DC2, + 0x542A: 0x7DC3, + 0x542B: 0x7DC4, + 0x542C: 0x7DC5, + 0x542D: 0x7DC6, + 0x542E: 0x7DCC, + 0x542F: 0x7DCD, + 0x5430: 0x7DCE, + 0x5431: 0x7DD7, + 0x5432: 0x7DD9, + 0x5433: 0x7E00, + 0x5434: 0x7DE2, + 0x5435: 0x7DE5, + 0x5436: 0x7DE6, + 0x5437: 0x7DEA, + 0x5438: 0x7DEB, + 0x5439: 0x7DED, + 0x543A: 0x7DF1, + 0x543B: 0x7DF5, + 0x543C: 0x7DF6, + 0x543D: 0x7DF9, + 0x543E: 0x7DFA, + 0x543F: 0x7E08, + 0x5440: 0x7E10, + 0x5441: 0x7E11, + 0x5442: 0x7E15, + 0x5443: 0x7E17, + 0x5444: 0x7E1C, + 0x5445: 0x7E1D, + 0x5446: 0x7E20, + 0x5447: 0x7E27, + 0x5448: 0x7E28, + 0x5449: 0x7E2C, + 0x544A: 0x7E2D, + 0x544B: 0x7E2F, + 0x544C: 0x7E33, + 0x544D: 0x7E36, + 0x544E: 0x7E3F, + 0x544F: 0x7E44, + 0x5450: 0x7E45, + 0x5451: 0x7E47, + 0x5452: 0x7E4E, + 0x5453: 0x7E50, + 0x5454: 0x7E52, + 0x5455: 0x7E58, + 0x5456: 0x7E5F, + 0x5457: 0x7E61, + 0x5458: 0x7E62, + 0x5459: 0x7E65, + 0x545A: 0x7E6B, + 0x545B: 0x7E6E, + 0x545C: 0x7E6F, + 0x545D: 0x7E73, + 0x545E: 0x7E78, + 0x545F: 0x7E7E, + 0x5460: 0x7E81, + 0x5461: 0x7E86, + 0x5462: 0x7E87, + 0x5463: 0x7E8A, + 0x5464: 0x7E8D, + 0x5465: 0x7E91, + 0x5466: 0x7E95, + 0x5467: 0x7E98, + 0x5468: 0x7E9A, + 0x5469: 0x7E9D, + 0x546A: 0x7E9E, + 0x546B: 0x7F3C, + 0x546C: 0x7F3B, + 0x546D: 0x7F3D, + 0x546E: 0x7F3E, + 0x546F: 0x7F3F, + 0x5470: 0x7F43, + 0x5471: 0x7F44, + 0x5472: 0x7F47, + 0x5473: 0x7F4F, + 0x5474: 0x7F52, + 0x5475: 0x7F53, + 0x5476: 0x7F5B, + 0x5477: 0x7F5C, + 0x5478: 0x7F5D, + 0x5479: 0x7F61, + 0x547A: 0x7F63, + 0x547B: 0x7F64, + 0x547C: 0x7F65, + 0x547D: 0x7F66, + 0x547E: 0x7F6D, + 0x5521: 0x7F71, + 0x5522: 0x7F7D, + 0x5523: 0x7F7E, + 0x5524: 0x7F7F, + 0x5525: 0x7F80, + 0x5526: 0x7F8B, + 0x5527: 0x7F8D, + 0x5528: 0x7F8F, + 0x5529: 0x7F90, + 0x552A: 0x7F91, + 0x552B: 0x7F96, + 0x552C: 0x7F97, + 0x552D: 0x7F9C, + 0x552E: 0x7FA1, + 0x552F: 0x7FA2, + 0x5530: 0x7FA6, + 0x5531: 0x7FAA, + 0x5532: 0x7FAD, + 0x5533: 0x7FB4, + 0x5534: 0x7FBC, + 0x5535: 0x7FBF, + 0x5536: 0x7FC0, + 0x5537: 0x7FC3, + 0x5538: 0x7FC8, + 0x5539: 0x7FCE, + 0x553A: 0x7FCF, + 0x553B: 0x7FDB, + 0x553C: 0x7FDF, + 0x553D: 0x7FE3, + 0x553E: 0x7FE5, + 0x553F: 0x7FE8, + 0x5540: 0x7FEC, + 0x5541: 0x7FEE, + 0x5542: 0x7FEF, + 0x5543: 0x7FF2, + 0x5544: 0x7FFA, + 0x5545: 0x7FFD, + 0x5546: 0x7FFE, + 0x5547: 0x7FFF, + 0x5548: 0x8007, + 0x5549: 0x8008, + 0x554A: 0x800A, + 0x554B: 0x800D, + 0x554C: 0x800E, + 0x554D: 0x800F, + 0x554E: 0x8011, + 0x554F: 0x8013, + 0x5550: 0x8014, + 0x5551: 0x8016, + 0x5552: 0x801D, + 0x5553: 0x801E, + 0x5554: 0x801F, + 0x5555: 0x8020, + 0x5556: 0x8024, + 0x5557: 0x8026, + 0x5558: 0x802C, + 0x5559: 0x802E, + 0x555A: 0x8030, + 0x555B: 0x8034, + 0x555C: 0x8035, + 0x555D: 0x8037, + 0x555E: 0x8039, + 0x555F: 0x803A, + 0x5560: 0x803C, + 0x5561: 0x803E, + 0x5562: 0x8040, + 0x5563: 0x8044, + 0x5564: 0x8060, + 0x5565: 0x8064, + 0x5566: 0x8066, + 0x5567: 0x806D, + 0x5568: 0x8071, + 0x5569: 0x8075, + 0x556A: 0x8081, + 0x556B: 0x8088, + 0x556C: 0x808E, + 0x556D: 0x809C, + 0x556E: 0x809E, + 0x556F: 0x80A6, + 0x5570: 0x80A7, + 0x5571: 0x80AB, + 0x5572: 0x80B8, + 0x5573: 0x80B9, + 0x5574: 0x80C8, + 0x5575: 0x80CD, + 0x5576: 0x80CF, + 0x5577: 0x80D2, + 0x5578: 0x80D4, + 0x5579: 0x80D5, + 0x557A: 0x80D7, + 0x557B: 0x80D8, + 0x557C: 0x80E0, + 0x557D: 0x80ED, + 0x557E: 0x80EE, + 0x5621: 0x80F0, + 0x5622: 0x80F2, + 0x5623: 0x80F3, + 0x5624: 0x80F6, + 0x5625: 0x80F9, + 0x5626: 0x80FA, + 0x5627: 0x80FE, + 0x5628: 0x8103, + 0x5629: 0x810B, + 0x562A: 0x8116, + 0x562B: 0x8117, + 0x562C: 0x8118, + 0x562D: 0x811C, + 0x562E: 0x811E, + 0x562F: 0x8120, + 0x5630: 0x8124, + 0x5631: 0x8127, + 0x5632: 0x812C, + 0x5633: 0x8130, + 0x5634: 0x8135, + 0x5635: 0x813A, + 0x5636: 0x813C, + 0x5637: 0x8145, + 0x5638: 0x8147, + 0x5639: 0x814A, + 0x563A: 0x814C, + 0x563B: 0x8152, + 0x563C: 0x8157, + 0x563D: 0x8160, + 0x563E: 0x8161, + 0x563F: 0x8167, + 0x5640: 0x8168, + 0x5641: 0x8169, + 0x5642: 0x816D, + 0x5643: 0x816F, + 0x5644: 0x8177, + 0x5645: 0x8181, + 0x5646: 0x8190, + 0x5647: 0x8184, + 0x5648: 0x8185, + 0x5649: 0x8186, + 0x564A: 0x818B, + 0x564B: 0x818E, + 0x564C: 0x8196, + 0x564D: 0x8198, + 0x564E: 0x819B, + 0x564F: 0x819E, + 0x5650: 0x81A2, + 0x5651: 0x81AE, + 0x5652: 0x81B2, + 0x5653: 0x81B4, + 0x5654: 0x81BB, + 0x5655: 0x81CB, + 0x5656: 0x81C3, + 0x5657: 0x81C5, + 0x5658: 0x81CA, + 0x5659: 0x81CE, + 0x565A: 0x81CF, + 0x565B: 0x81D5, + 0x565C: 0x81D7, + 0x565D: 0x81DB, + 0x565E: 0x81DD, + 0x565F: 0x81DE, + 0x5660: 0x81E1, + 0x5661: 0x81E4, + 0x5662: 0x81EB, + 0x5663: 0x81EC, + 0x5664: 0x81F0, + 0x5665: 0x81F1, + 0x5666: 0x81F2, + 0x5667: 0x81F5, + 0x5668: 0x81F6, + 0x5669: 0x81F8, + 0x566A: 0x81F9, + 0x566B: 0x81FD, + 0x566C: 0x81FF, + 0x566D: 0x8200, + 0x566E: 0x8203, + 0x566F: 0x820F, + 0x5670: 0x8213, + 0x5671: 0x8214, + 0x5672: 0x8219, + 0x5673: 0x821A, + 0x5674: 0x821D, + 0x5675: 0x8221, + 0x5676: 0x8222, + 0x5677: 0x8228, + 0x5678: 0x8232, + 0x5679: 0x8234, + 0x567A: 0x823A, + 0x567B: 0x8243, + 0x567C: 0x8244, + 0x567D: 0x8245, + 0x567E: 0x8246, + 0x5721: 0x824B, + 0x5722: 0x824E, + 0x5723: 0x824F, + 0x5724: 0x8251, + 0x5725: 0x8256, + 0x5726: 0x825C, + 0x5727: 0x8260, + 0x5728: 0x8263, + 0x5729: 0x8267, + 0x572A: 0x826D, + 0x572B: 0x8274, + 0x572C: 0x827B, + 0x572D: 0x827D, + 0x572E: 0x827F, + 0x572F: 0x8280, + 0x5730: 0x8281, + 0x5731: 0x8283, + 0x5732: 0x8284, + 0x5733: 0x8287, + 0x5734: 0x8289, + 0x5735: 0x828A, + 0x5736: 0x828E, + 0x5737: 0x8291, + 0x5738: 0x8294, + 0x5739: 0x8296, + 0x573A: 0x8298, + 0x573B: 0x829A, + 0x573C: 0x829B, + 0x573D: 0x82A0, + 0x573E: 0x82A1, + 0x573F: 0x82A3, + 0x5740: 0x82A4, + 0x5741: 0x82A7, + 0x5742: 0x82A8, + 0x5743: 0x82A9, + 0x5744: 0x82AA, + 0x5745: 0x82AE, + 0x5746: 0x82B0, + 0x5747: 0x82B2, + 0x5748: 0x82B4, + 0x5749: 0x82B7, + 0x574A: 0x82BA, + 0x574B: 0x82BC, + 0x574C: 0x82BE, + 0x574D: 0x82BF, + 0x574E: 0x82C6, + 0x574F: 0x82D0, + 0x5750: 0x82D5, + 0x5751: 0x82DA, + 0x5752: 0x82E0, + 0x5753: 0x82E2, + 0x5754: 0x82E4, + 0x5755: 0x82E8, + 0x5756: 0x82EA, + 0x5757: 0x82ED, + 0x5758: 0x82EF, + 0x5759: 0x82F6, + 0x575A: 0x82F7, + 0x575B: 0x82FD, + 0x575C: 0x82FE, + 0x575D: 0x8300, + 0x575E: 0x8301, + 0x575F: 0x8307, + 0x5760: 0x8308, + 0x5761: 0x830A, + 0x5762: 0x830B, + 0x5763: 0x8354, + 0x5764: 0x831B, + 0x5765: 0x831D, + 0x5766: 0x831E, + 0x5767: 0x831F, + 0x5768: 0x8321, + 0x5769: 0x8322, + 0x576A: 0x832C, + 0x576B: 0x832D, + 0x576C: 0x832E, + 0x576D: 0x8330, + 0x576E: 0x8333, + 0x576F: 0x8337, + 0x5770: 0x833A, + 0x5771: 0x833C, + 0x5772: 0x833D, + 0x5773: 0x8342, + 0x5774: 0x8343, + 0x5775: 0x8344, + 0x5776: 0x8347, + 0x5777: 0x834D, + 0x5778: 0x834E, + 0x5779: 0x8351, + 0x577A: 0x8355, + 0x577B: 0x8356, + 0x577C: 0x8357, + 0x577D: 0x8370, + 0x577E: 0x8378, + 0x5821: 0x837D, + 0x5822: 0x837F, + 0x5823: 0x8380, + 0x5824: 0x8382, + 0x5825: 0x8384, + 0x5826: 0x8386, + 0x5827: 0x838D, + 0x5828: 0x8392, + 0x5829: 0x8394, + 0x582A: 0x8395, + 0x582B: 0x8398, + 0x582C: 0x8399, + 0x582D: 0x839B, + 0x582E: 0x839C, + 0x582F: 0x839D, + 0x5830: 0x83A6, + 0x5831: 0x83A7, + 0x5832: 0x83A9, + 0x5833: 0x83AC, + 0x5834: 0x83BE, + 0x5835: 0x83BF, + 0x5836: 0x83C0, + 0x5837: 0x83C7, + 0x5838: 0x83C9, + 0x5839: 0x83CF, + 0x583A: 0x83D0, + 0x583B: 0x83D1, + 0x583C: 0x83D4, + 0x583D: 0x83DD, + 0x583E: 0x8353, + 0x583F: 0x83E8, + 0x5840: 0x83EA, + 0x5841: 0x83F6, + 0x5842: 0x83F8, + 0x5843: 0x83F9, + 0x5844: 0x83FC, + 0x5845: 0x8401, + 0x5846: 0x8406, + 0x5847: 0x840A, + 0x5848: 0x840F, + 0x5849: 0x8411, + 0x584A: 0x8415, + 0x584B: 0x8419, + 0x584C: 0x83AD, + 0x584D: 0x842F, + 0x584E: 0x8439, + 0x584F: 0x8445, + 0x5850: 0x8447, + 0x5851: 0x8448, + 0x5852: 0x844A, + 0x5853: 0x844D, + 0x5854: 0x844F, + 0x5855: 0x8451, + 0x5856: 0x8452, + 0x5857: 0x8456, + 0x5858: 0x8458, + 0x5859: 0x8459, + 0x585A: 0x845A, + 0x585B: 0x845C, + 0x585C: 0x8460, + 0x585D: 0x8464, + 0x585E: 0x8465, + 0x585F: 0x8467, + 0x5860: 0x846A, + 0x5861: 0x8470, + 0x5862: 0x8473, + 0x5863: 0x8474, + 0x5864: 0x8476, + 0x5865: 0x8478, + 0x5866: 0x847C, + 0x5867: 0x847D, + 0x5868: 0x8481, + 0x5869: 0x8485, + 0x586A: 0x8492, + 0x586B: 0x8493, + 0x586C: 0x8495, + 0x586D: 0x849E, + 0x586E: 0x84A6, + 0x586F: 0x84A8, + 0x5870: 0x84A9, + 0x5871: 0x84AA, + 0x5872: 0x84AF, + 0x5873: 0x84B1, + 0x5874: 0x84B4, + 0x5875: 0x84BA, + 0x5876: 0x84BD, + 0x5877: 0x84BE, + 0x5878: 0x84C0, + 0x5879: 0x84C2, + 0x587A: 0x84C7, + 0x587B: 0x84C8, + 0x587C: 0x84CC, + 0x587D: 0x84CF, + 0x587E: 0x84D3, + 0x5921: 0x84DC, + 0x5922: 0x84E7, + 0x5923: 0x84EA, + 0x5924: 0x84EF, + 0x5925: 0x84F0, + 0x5926: 0x84F1, + 0x5927: 0x84F2, + 0x5928: 0x84F7, + 0x5929: 0x8532, + 0x592A: 0x84FA, + 0x592B: 0x84FB, + 0x592C: 0x84FD, + 0x592D: 0x8502, + 0x592E: 0x8503, + 0x592F: 0x8507, + 0x5930: 0x850C, + 0x5931: 0x850E, + 0x5932: 0x8510, + 0x5933: 0x851C, + 0x5934: 0x851E, + 0x5935: 0x8522, + 0x5936: 0x8523, + 0x5937: 0x8524, + 0x5938: 0x8525, + 0x5939: 0x8527, + 0x593A: 0x852A, + 0x593B: 0x852B, + 0x593C: 0x852F, + 0x593D: 0x8533, + 0x593E: 0x8534, + 0x593F: 0x8536, + 0x5940: 0x853F, + 0x5941: 0x8546, + 0x5942: 0x854F, + 0x5943: 0x8550, + 0x5944: 0x8551, + 0x5945: 0x8552, + 0x5946: 0x8553, + 0x5947: 0x8556, + 0x5948: 0x8559, + 0x5949: 0x855C, + 0x594A: 0x855D, + 0x594B: 0x855E, + 0x594C: 0x855F, + 0x594D: 0x8560, + 0x594E: 0x8561, + 0x594F: 0x8562, + 0x5950: 0x8564, + 0x5951: 0x856B, + 0x5952: 0x856F, + 0x5953: 0x8579, + 0x5954: 0x857A, + 0x5955: 0x857B, + 0x5956: 0x857D, + 0x5957: 0x857F, + 0x5958: 0x8581, + 0x5959: 0x8585, + 0x595A: 0x8586, + 0x595B: 0x8589, + 0x595C: 0x858B, + 0x595D: 0x858C, + 0x595E: 0x858F, + 0x595F: 0x8593, + 0x5960: 0x8598, + 0x5961: 0x859D, + 0x5962: 0x859F, + 0x5963: 0x85A0, + 0x5964: 0x85A2, + 0x5965: 0x85A5, + 0x5966: 0x85A7, + 0x5967: 0x85B4, + 0x5968: 0x85B6, + 0x5969: 0x85B7, + 0x596A: 0x85B8, + 0x596B: 0x85BC, + 0x596C: 0x85BD, + 0x596D: 0x85BE, + 0x596E: 0x85BF, + 0x596F: 0x85C2, + 0x5970: 0x85C7, + 0x5971: 0x85CA, + 0x5972: 0x85CB, + 0x5973: 0x85CE, + 0x5974: 0x85AD, + 0x5975: 0x85D8, + 0x5976: 0x85DA, + 0x5977: 0x85DF, + 0x5978: 0x85E0, + 0x5979: 0x85E6, + 0x597A: 0x85E8, + 0x597B: 0x85ED, + 0x597C: 0x85F3, + 0x597D: 0x85F6, + 0x597E: 0x85FC, + 0x5A21: 0x85FF, + 0x5A22: 0x8600, + 0x5A23: 0x8604, + 0x5A24: 0x8605, + 0x5A25: 0x860D, + 0x5A26: 0x860E, + 0x5A27: 0x8610, + 0x5A28: 0x8611, + 0x5A29: 0x8612, + 0x5A2A: 0x8618, + 0x5A2B: 0x8619, + 0x5A2C: 0x861B, + 0x5A2D: 0x861E, + 0x5A2E: 0x8621, + 0x5A2F: 0x8627, + 0x5A30: 0x8629, + 0x5A31: 0x8636, + 0x5A32: 0x8638, + 0x5A33: 0x863A, + 0x5A34: 0x863C, + 0x5A35: 0x863D, + 0x5A36: 0x8640, + 0x5A37: 0x8642, + 0x5A38: 0x8646, + 0x5A39: 0x8652, + 0x5A3A: 0x8653, + 0x5A3B: 0x8656, + 0x5A3C: 0x8657, + 0x5A3D: 0x8658, + 0x5A3E: 0x8659, + 0x5A3F: 0x865D, + 0x5A40: 0x8660, + 0x5A41: 0x8661, + 0x5A42: 0x8662, + 0x5A43: 0x8663, + 0x5A44: 0x8664, + 0x5A45: 0x8669, + 0x5A46: 0x866C, + 0x5A47: 0x866F, + 0x5A48: 0x8675, + 0x5A49: 0x8676, + 0x5A4A: 0x8677, + 0x5A4B: 0x867A, + 0x5A4C: 0x868D, + 0x5A4D: 0x8691, + 0x5A4E: 0x8696, + 0x5A4F: 0x8698, + 0x5A50: 0x869A, + 0x5A51: 0x869C, + 0x5A52: 0x86A1, + 0x5A53: 0x86A6, + 0x5A54: 0x86A7, + 0x5A55: 0x86A8, + 0x5A56: 0x86AD, + 0x5A57: 0x86B1, + 0x5A58: 0x86B3, + 0x5A59: 0x86B4, + 0x5A5A: 0x86B5, + 0x5A5B: 0x86B7, + 0x5A5C: 0x86B8, + 0x5A5D: 0x86B9, + 0x5A5E: 0x86BF, + 0x5A5F: 0x86C0, + 0x5A60: 0x86C1, + 0x5A61: 0x86C3, + 0x5A62: 0x86C5, + 0x5A63: 0x86D1, + 0x5A64: 0x86D2, + 0x5A65: 0x86D5, + 0x5A66: 0x86D7, + 0x5A67: 0x86DA, + 0x5A68: 0x86DC, + 0x5A69: 0x86E0, + 0x5A6A: 0x86E3, + 0x5A6B: 0x86E5, + 0x5A6C: 0x86E7, + 0x5A6D: 0x8688, + 0x5A6E: 0x86FA, + 0x5A6F: 0x86FC, + 0x5A70: 0x86FD, + 0x5A71: 0x8704, + 0x5A72: 0x8705, + 0x5A73: 0x8707, + 0x5A74: 0x870B, + 0x5A75: 0x870E, + 0x5A76: 0x870F, + 0x5A77: 0x8710, + 0x5A78: 0x8713, + 0x5A79: 0x8714, + 0x5A7A: 0x8719, + 0x5A7B: 0x871E, + 0x5A7C: 0x871F, + 0x5A7D: 0x8721, + 0x5A7E: 0x8723, + 0x5B21: 0x8728, + 0x5B22: 0x872E, + 0x5B23: 0x872F, + 0x5B24: 0x8731, + 0x5B25: 0x8732, + 0x5B26: 0x8739, + 0x5B27: 0x873A, + 0x5B28: 0x873C, + 0x5B29: 0x873D, + 0x5B2A: 0x873E, + 0x5B2B: 0x8740, + 0x5B2C: 0x8743, + 0x5B2D: 0x8745, + 0x5B2E: 0x874D, + 0x5B2F: 0x8758, + 0x5B30: 0x875D, + 0x5B31: 0x8761, + 0x5B32: 0x8764, + 0x5B33: 0x8765, + 0x5B34: 0x876F, + 0x5B35: 0x8771, + 0x5B36: 0x8772, + 0x5B37: 0x877B, + 0x5B38: 0x8783, + 0x5B39: 0x8784, + 0x5B3A: 0x8785, + 0x5B3B: 0x8786, + 0x5B3C: 0x8787, + 0x5B3D: 0x8788, + 0x5B3E: 0x8789, + 0x5B3F: 0x878B, + 0x5B40: 0x878C, + 0x5B41: 0x8790, + 0x5B42: 0x8793, + 0x5B43: 0x8795, + 0x5B44: 0x8797, + 0x5B45: 0x8798, + 0x5B46: 0x8799, + 0x5B47: 0x879E, + 0x5B48: 0x87A0, + 0x5B49: 0x87A3, + 0x5B4A: 0x87A7, + 0x5B4B: 0x87AC, + 0x5B4C: 0x87AD, + 0x5B4D: 0x87AE, + 0x5B4E: 0x87B1, + 0x5B4F: 0x87B5, + 0x5B50: 0x87BE, + 0x5B51: 0x87BF, + 0x5B52: 0x87C1, + 0x5B53: 0x87C8, + 0x5B54: 0x87C9, + 0x5B55: 0x87CA, + 0x5B56: 0x87CE, + 0x5B57: 0x87D5, + 0x5B58: 0x87D6, + 0x5B59: 0x87D9, + 0x5B5A: 0x87DA, + 0x5B5B: 0x87DC, + 0x5B5C: 0x87DF, + 0x5B5D: 0x87E2, + 0x5B5E: 0x87E3, + 0x5B5F: 0x87E4, + 0x5B60: 0x87EA, + 0x5B61: 0x87EB, + 0x5B62: 0x87ED, + 0x5B63: 0x87F1, + 0x5B64: 0x87F3, + 0x5B65: 0x87F8, + 0x5B66: 0x87FA, + 0x5B67: 0x87FF, + 0x5B68: 0x8801, + 0x5B69: 0x8803, + 0x5B6A: 0x8806, + 0x5B6B: 0x8809, + 0x5B6C: 0x880A, + 0x5B6D: 0x880B, + 0x5B6E: 0x8810, + 0x5B6F: 0x8819, + 0x5B70: 0x8812, + 0x5B71: 0x8813, + 0x5B72: 0x8814, + 0x5B73: 0x8818, + 0x5B74: 0x881A, + 0x5B75: 0x881B, + 0x5B76: 0x881C, + 0x5B77: 0x881E, + 0x5B78: 0x881F, + 0x5B79: 0x8828, + 0x5B7A: 0x882D, + 0x5B7B: 0x882E, + 0x5B7C: 0x8830, + 0x5B7D: 0x8832, + 0x5B7E: 0x8835, + 0x5C21: 0x883A, + 0x5C22: 0x883C, + 0x5C23: 0x8841, + 0x5C24: 0x8843, + 0x5C25: 0x8845, + 0x5C26: 0x8848, + 0x5C27: 0x8849, + 0x5C28: 0x884A, + 0x5C29: 0x884B, + 0x5C2A: 0x884E, + 0x5C2B: 0x8851, + 0x5C2C: 0x8855, + 0x5C2D: 0x8856, + 0x5C2E: 0x8858, + 0x5C2F: 0x885A, + 0x5C30: 0x885C, + 0x5C31: 0x885F, + 0x5C32: 0x8860, + 0x5C33: 0x8864, + 0x5C34: 0x8869, + 0x5C35: 0x8871, + 0x5C36: 0x8879, + 0x5C37: 0x887B, + 0x5C38: 0x8880, + 0x5C39: 0x8898, + 0x5C3A: 0x889A, + 0x5C3B: 0x889B, + 0x5C3C: 0x889C, + 0x5C3D: 0x889F, + 0x5C3E: 0x88A0, + 0x5C3F: 0x88A8, + 0x5C40: 0x88AA, + 0x5C41: 0x88BA, + 0x5C42: 0x88BD, + 0x5C43: 0x88BE, + 0x5C44: 0x88C0, + 0x5C45: 0x88CA, + 0x5C46: 0x88CB, + 0x5C47: 0x88CC, + 0x5C48: 0x88CD, + 0x5C49: 0x88CE, + 0x5C4A: 0x88D1, + 0x5C4B: 0x88D2, + 0x5C4C: 0x88D3, + 0x5C4D: 0x88DB, + 0x5C4E: 0x88DE, + 0x5C4F: 0x88E7, + 0x5C50: 0x88EF, + 0x5C51: 0x88F0, + 0x5C52: 0x88F1, + 0x5C53: 0x88F5, + 0x5C54: 0x88F7, + 0x5C55: 0x8901, + 0x5C56: 0x8906, + 0x5C57: 0x890D, + 0x5C58: 0x890E, + 0x5C59: 0x890F, + 0x5C5A: 0x8915, + 0x5C5B: 0x8916, + 0x5C5C: 0x8918, + 0x5C5D: 0x8919, + 0x5C5E: 0x891A, + 0x5C5F: 0x891C, + 0x5C60: 0x8920, + 0x5C61: 0x8926, + 0x5C62: 0x8927, + 0x5C63: 0x8928, + 0x5C64: 0x8930, + 0x5C65: 0x8931, + 0x5C66: 0x8932, + 0x5C67: 0x8935, + 0x5C68: 0x8939, + 0x5C69: 0x893A, + 0x5C6A: 0x893E, + 0x5C6B: 0x8940, + 0x5C6C: 0x8942, + 0x5C6D: 0x8945, + 0x5C6E: 0x8946, + 0x5C6F: 0x8949, + 0x5C70: 0x894F, + 0x5C71: 0x8952, + 0x5C72: 0x8957, + 0x5C73: 0x895A, + 0x5C74: 0x895B, + 0x5C75: 0x895C, + 0x5C76: 0x8961, + 0x5C77: 0x8962, + 0x5C78: 0x8963, + 0x5C79: 0x896B, + 0x5C7A: 0x896E, + 0x5C7B: 0x8970, + 0x5C7C: 0x8973, + 0x5C7D: 0x8975, + 0x5C7E: 0x897A, + 0x5D21: 0x897B, + 0x5D22: 0x897C, + 0x5D23: 0x897D, + 0x5D24: 0x8989, + 0x5D25: 0x898D, + 0x5D26: 0x8990, + 0x5D27: 0x8994, + 0x5D28: 0x8995, + 0x5D29: 0x899B, + 0x5D2A: 0x899C, + 0x5D2B: 0x899F, + 0x5D2C: 0x89A0, + 0x5D2D: 0x89A5, + 0x5D2E: 0x89B0, + 0x5D2F: 0x89B4, + 0x5D30: 0x89B5, + 0x5D31: 0x89B6, + 0x5D32: 0x89B7, + 0x5D33: 0x89BC, + 0x5D34: 0x89D4, + 0x5D35: 0x89D5, + 0x5D36: 0x89D6, + 0x5D37: 0x89D7, + 0x5D38: 0x89D8, + 0x5D39: 0x89E5, + 0x5D3A: 0x89E9, + 0x5D3B: 0x89EB, + 0x5D3C: 0x89ED, + 0x5D3D: 0x89F1, + 0x5D3E: 0x89F3, + 0x5D3F: 0x89F6, + 0x5D40: 0x89F9, + 0x5D41: 0x89FD, + 0x5D42: 0x89FF, + 0x5D43: 0x8A04, + 0x5D44: 0x8A05, + 0x5D45: 0x8A07, + 0x5D46: 0x8A0F, + 0x5D47: 0x8A11, + 0x5D48: 0x8A12, + 0x5D49: 0x8A14, + 0x5D4A: 0x8A15, + 0x5D4B: 0x8A1E, + 0x5D4C: 0x8A20, + 0x5D4D: 0x8A22, + 0x5D4E: 0x8A24, + 0x5D4F: 0x8A26, + 0x5D50: 0x8A2B, + 0x5D51: 0x8A2C, + 0x5D52: 0x8A2F, + 0x5D53: 0x8A35, + 0x5D54: 0x8A37, + 0x5D55: 0x8A3D, + 0x5D56: 0x8A3E, + 0x5D57: 0x8A40, + 0x5D58: 0x8A43, + 0x5D59: 0x8A45, + 0x5D5A: 0x8A47, + 0x5D5B: 0x8A49, + 0x5D5C: 0x8A4D, + 0x5D5D: 0x8A4E, + 0x5D5E: 0x8A53, + 0x5D5F: 0x8A56, + 0x5D60: 0x8A57, + 0x5D61: 0x8A58, + 0x5D62: 0x8A5C, + 0x5D63: 0x8A5D, + 0x5D64: 0x8A61, + 0x5D65: 0x8A65, + 0x5D66: 0x8A67, + 0x5D67: 0x8A75, + 0x5D68: 0x8A76, + 0x5D69: 0x8A77, + 0x5D6A: 0x8A79, + 0x5D6B: 0x8A7A, + 0x5D6C: 0x8A7B, + 0x5D6D: 0x8A7E, + 0x5D6E: 0x8A7F, + 0x5D6F: 0x8A80, + 0x5D70: 0x8A83, + 0x5D71: 0x8A86, + 0x5D72: 0x8A8B, + 0x5D73: 0x8A8F, + 0x5D74: 0x8A90, + 0x5D75: 0x8A92, + 0x5D76: 0x8A96, + 0x5D77: 0x8A97, + 0x5D78: 0x8A99, + 0x5D79: 0x8A9F, + 0x5D7A: 0x8AA7, + 0x5D7B: 0x8AA9, + 0x5D7C: 0x8AAE, + 0x5D7D: 0x8AAF, + 0x5D7E: 0x8AB3, + 0x5E21: 0x8AB6, + 0x5E22: 0x8AB7, + 0x5E23: 0x8ABB, + 0x5E24: 0x8ABE, + 0x5E25: 0x8AC3, + 0x5E26: 0x8AC6, + 0x5E27: 0x8AC8, + 0x5E28: 0x8AC9, + 0x5E29: 0x8ACA, + 0x5E2A: 0x8AD1, + 0x5E2B: 0x8AD3, + 0x5E2C: 0x8AD4, + 0x5E2D: 0x8AD5, + 0x5E2E: 0x8AD7, + 0x5E2F: 0x8ADD, + 0x5E30: 0x8ADF, + 0x5E31: 0x8AEC, + 0x5E32: 0x8AF0, + 0x5E33: 0x8AF4, + 0x5E34: 0x8AF5, + 0x5E35: 0x8AF6, + 0x5E36: 0x8AFC, + 0x5E37: 0x8AFF, + 0x5E38: 0x8B05, + 0x5E39: 0x8B06, + 0x5E3A: 0x8B0B, + 0x5E3B: 0x8B11, + 0x5E3C: 0x8B1C, + 0x5E3D: 0x8B1E, + 0x5E3E: 0x8B1F, + 0x5E3F: 0x8B0A, + 0x5E40: 0x8B2D, + 0x5E41: 0x8B30, + 0x5E42: 0x8B37, + 0x5E43: 0x8B3C, + 0x5E44: 0x8B42, + 0x5E45: 0x8B43, + 0x5E46: 0x8B44, + 0x5E47: 0x8B45, + 0x5E48: 0x8B46, + 0x5E49: 0x8B48, + 0x5E4A: 0x8B52, + 0x5E4B: 0x8B53, + 0x5E4C: 0x8B54, + 0x5E4D: 0x8B59, + 0x5E4E: 0x8B4D, + 0x5E4F: 0x8B5E, + 0x5E50: 0x8B63, + 0x5E51: 0x8B6D, + 0x5E52: 0x8B76, + 0x5E53: 0x8B78, + 0x5E54: 0x8B79, + 0x5E55: 0x8B7C, + 0x5E56: 0x8B7E, + 0x5E57: 0x8B81, + 0x5E58: 0x8B84, + 0x5E59: 0x8B85, + 0x5E5A: 0x8B8B, + 0x5E5B: 0x8B8D, + 0x5E5C: 0x8B8F, + 0x5E5D: 0x8B94, + 0x5E5E: 0x8B95, + 0x5E5F: 0x8B9C, + 0x5E60: 0x8B9E, + 0x5E61: 0x8B9F, + 0x5E62: 0x8C38, + 0x5E63: 0x8C39, + 0x5E64: 0x8C3D, + 0x5E65: 0x8C3E, + 0x5E66: 0x8C45, + 0x5E67: 0x8C47, + 0x5E68: 0x8C49, + 0x5E69: 0x8C4B, + 0x5E6A: 0x8C4F, + 0x5E6B: 0x8C51, + 0x5E6C: 0x8C53, + 0x5E6D: 0x8C54, + 0x5E6E: 0x8C57, + 0x5E6F: 0x8C58, + 0x5E70: 0x8C5B, + 0x5E71: 0x8C5D, + 0x5E72: 0x8C59, + 0x5E73: 0x8C63, + 0x5E74: 0x8C64, + 0x5E75: 0x8C66, + 0x5E76: 0x8C68, + 0x5E77: 0x8C69, + 0x5E78: 0x8C6D, + 0x5E79: 0x8C73, + 0x5E7A: 0x8C75, + 0x5E7B: 0x8C76, + 0x5E7C: 0x8C7B, + 0x5E7D: 0x8C7E, + 0x5E7E: 0x8C86, + 0x5F21: 0x8C87, + 0x5F22: 0x8C8B, + 0x5F23: 0x8C90, + 0x5F24: 0x8C92, + 0x5F25: 0x8C93, + 0x5F26: 0x8C99, + 0x5F27: 0x8C9B, + 0x5F28: 0x8C9C, + 0x5F29: 0x8CA4, + 0x5F2A: 0x8CB9, + 0x5F2B: 0x8CBA, + 0x5F2C: 0x8CC5, + 0x5F2D: 0x8CC6, + 0x5F2E: 0x8CC9, + 0x5F2F: 0x8CCB, + 0x5F30: 0x8CCF, + 0x5F31: 0x8CD6, + 0x5F32: 0x8CD5, + 0x5F33: 0x8CD9, + 0x5F34: 0x8CDD, + 0x5F35: 0x8CE1, + 0x5F36: 0x8CE8, + 0x5F37: 0x8CEC, + 0x5F38: 0x8CEF, + 0x5F39: 0x8CF0, + 0x5F3A: 0x8CF2, + 0x5F3B: 0x8CF5, + 0x5F3C: 0x8CF7, + 0x5F3D: 0x8CF8, + 0x5F3E: 0x8CFE, + 0x5F3F: 0x8CFF, + 0x5F40: 0x8D01, + 0x5F41: 0x8D03, + 0x5F42: 0x8D09, + 0x5F43: 0x8D12, + 0x5F44: 0x8D17, + 0x5F45: 0x8D1B, + 0x5F46: 0x8D65, + 0x5F47: 0x8D69, + 0x5F48: 0x8D6C, + 0x5F49: 0x8D6E, + 0x5F4A: 0x8D7F, + 0x5F4B: 0x8D82, + 0x5F4C: 0x8D84, + 0x5F4D: 0x8D88, + 0x5F4E: 0x8D8D, + 0x5F4F: 0x8D90, + 0x5F50: 0x8D91, + 0x5F51: 0x8D95, + 0x5F52: 0x8D9E, + 0x5F53: 0x8D9F, + 0x5F54: 0x8DA0, + 0x5F55: 0x8DA6, + 0x5F56: 0x8DAB, + 0x5F57: 0x8DAC, + 0x5F58: 0x8DAF, + 0x5F59: 0x8DB2, + 0x5F5A: 0x8DB5, + 0x5F5B: 0x8DB7, + 0x5F5C: 0x8DB9, + 0x5F5D: 0x8DBB, + 0x5F5E: 0x8DC0, + 0x5F5F: 0x8DC5, + 0x5F60: 0x8DC6, + 0x5F61: 0x8DC7, + 0x5F62: 0x8DC8, + 0x5F63: 0x8DCA, + 0x5F64: 0x8DCE, + 0x5F65: 0x8DD1, + 0x5F66: 0x8DD4, + 0x5F67: 0x8DD5, + 0x5F68: 0x8DD7, + 0x5F69: 0x8DD9, + 0x5F6A: 0x8DE4, + 0x5F6B: 0x8DE5, + 0x5F6C: 0x8DE7, + 0x5F6D: 0x8DEC, + 0x5F6E: 0x8DF0, + 0x5F6F: 0x8DBC, + 0x5F70: 0x8DF1, + 0x5F71: 0x8DF2, + 0x5F72: 0x8DF4, + 0x5F73: 0x8DFD, + 0x5F74: 0x8E01, + 0x5F75: 0x8E04, + 0x5F76: 0x8E05, + 0x5F77: 0x8E06, + 0x5F78: 0x8E0B, + 0x5F79: 0x8E11, + 0x5F7A: 0x8E14, + 0x5F7B: 0x8E16, + 0x5F7C: 0x8E20, + 0x5F7D: 0x8E21, + 0x5F7E: 0x8E22, + 0x6021: 0x8E23, + 0x6022: 0x8E26, + 0x6023: 0x8E27, + 0x6024: 0x8E31, + 0x6025: 0x8E33, + 0x6026: 0x8E36, + 0x6027: 0x8E37, + 0x6028: 0x8E38, + 0x6029: 0x8E39, + 0x602A: 0x8E3D, + 0x602B: 0x8E40, + 0x602C: 0x8E41, + 0x602D: 0x8E4B, + 0x602E: 0x8E4D, + 0x602F: 0x8E4E, + 0x6030: 0x8E4F, + 0x6031: 0x8E54, + 0x6032: 0x8E5B, + 0x6033: 0x8E5C, + 0x6034: 0x8E5D, + 0x6035: 0x8E5E, + 0x6036: 0x8E61, + 0x6037: 0x8E62, + 0x6038: 0x8E69, + 0x6039: 0x8E6C, + 0x603A: 0x8E6D, + 0x603B: 0x8E6F, + 0x603C: 0x8E70, + 0x603D: 0x8E71, + 0x603E: 0x8E79, + 0x603F: 0x8E7A, + 0x6040: 0x8E7B, + 0x6041: 0x8E82, + 0x6042: 0x8E83, + 0x6043: 0x8E89, + 0x6044: 0x8E90, + 0x6045: 0x8E92, + 0x6046: 0x8E95, + 0x6047: 0x8E9A, + 0x6048: 0x8E9B, + 0x6049: 0x8E9D, + 0x604A: 0x8E9E, + 0x604B: 0x8EA2, + 0x604C: 0x8EA7, + 0x604D: 0x8EA9, + 0x604E: 0x8EAD, + 0x604F: 0x8EAE, + 0x6050: 0x8EB3, + 0x6051: 0x8EB5, + 0x6052: 0x8EBA, + 0x6053: 0x8EBB, + 0x6054: 0x8EC0, + 0x6055: 0x8EC1, + 0x6056: 0x8EC3, + 0x6057: 0x8EC4, + 0x6058: 0x8EC7, + 0x6059: 0x8ECF, + 0x605A: 0x8ED1, + 0x605B: 0x8ED4, + 0x605C: 0x8EDC, + 0x605D: 0x8EE8, + 0x605E: 0x8EEE, + 0x605F: 0x8EF0, + 0x6060: 0x8EF1, + 0x6061: 0x8EF7, + 0x6062: 0x8EF9, + 0x6063: 0x8EFA, + 0x6064: 0x8EED, + 0x6065: 0x8F00, + 0x6066: 0x8F02, + 0x6067: 0x8F07, + 0x6068: 0x8F08, + 0x6069: 0x8F0F, + 0x606A: 0x8F10, + 0x606B: 0x8F16, + 0x606C: 0x8F17, + 0x606D: 0x8F18, + 0x606E: 0x8F1E, + 0x606F: 0x8F20, + 0x6070: 0x8F21, + 0x6071: 0x8F23, + 0x6072: 0x8F25, + 0x6073: 0x8F27, + 0x6074: 0x8F28, + 0x6075: 0x8F2C, + 0x6076: 0x8F2D, + 0x6077: 0x8F2E, + 0x6078: 0x8F34, + 0x6079: 0x8F35, + 0x607A: 0x8F36, + 0x607B: 0x8F37, + 0x607C: 0x8F3A, + 0x607D: 0x8F40, + 0x607E: 0x8F41, + 0x6121: 0x8F43, + 0x6122: 0x8F47, + 0x6123: 0x8F4F, + 0x6124: 0x8F51, + 0x6125: 0x8F52, + 0x6126: 0x8F53, + 0x6127: 0x8F54, + 0x6128: 0x8F55, + 0x6129: 0x8F58, + 0x612A: 0x8F5D, + 0x612B: 0x8F5E, + 0x612C: 0x8F65, + 0x612D: 0x8F9D, + 0x612E: 0x8FA0, + 0x612F: 0x8FA1, + 0x6130: 0x8FA4, + 0x6131: 0x8FA5, + 0x6132: 0x8FA6, + 0x6133: 0x8FB5, + 0x6134: 0x8FB6, + 0x6135: 0x8FB8, + 0x6136: 0x8FBE, + 0x6137: 0x8FC0, + 0x6138: 0x8FC1, + 0x6139: 0x8FC6, + 0x613A: 0x8FCA, + 0x613B: 0x8FCB, + 0x613C: 0x8FCD, + 0x613D: 0x8FD0, + 0x613E: 0x8FD2, + 0x613F: 0x8FD3, + 0x6140: 0x8FD5, + 0x6141: 0x8FE0, + 0x6142: 0x8FE3, + 0x6143: 0x8FE4, + 0x6144: 0x8FE8, + 0x6145: 0x8FEE, + 0x6146: 0x8FF1, + 0x6147: 0x8FF5, + 0x6148: 0x8FF6, + 0x6149: 0x8FFB, + 0x614A: 0x8FFE, + 0x614B: 0x9002, + 0x614C: 0x9004, + 0x614D: 0x9008, + 0x614E: 0x900C, + 0x614F: 0x9018, + 0x6150: 0x901B, + 0x6151: 0x9028, + 0x6152: 0x9029, + 0x6153: 0x902F, + 0x6154: 0x902A, + 0x6155: 0x902C, + 0x6156: 0x902D, + 0x6157: 0x9033, + 0x6158: 0x9034, + 0x6159: 0x9037, + 0x615A: 0x903F, + 0x615B: 0x9043, + 0x615C: 0x9044, + 0x615D: 0x904C, + 0x615E: 0x905B, + 0x615F: 0x905D, + 0x6160: 0x9062, + 0x6161: 0x9066, + 0x6162: 0x9067, + 0x6163: 0x906C, + 0x6164: 0x9070, + 0x6165: 0x9074, + 0x6166: 0x9079, + 0x6167: 0x9085, + 0x6168: 0x9088, + 0x6169: 0x908B, + 0x616A: 0x908C, + 0x616B: 0x908E, + 0x616C: 0x9090, + 0x616D: 0x9095, + 0x616E: 0x9097, + 0x616F: 0x9098, + 0x6170: 0x9099, + 0x6171: 0x909B, + 0x6172: 0x90A0, + 0x6173: 0x90A1, + 0x6174: 0x90A2, + 0x6175: 0x90A5, + 0x6176: 0x90B0, + 0x6177: 0x90B2, + 0x6178: 0x90B3, + 0x6179: 0x90B4, + 0x617A: 0x90B6, + 0x617B: 0x90BD, + 0x617C: 0x90CC, + 0x617D: 0x90BE, + 0x617E: 0x90C3, + 0x6221: 0x90C4, + 0x6222: 0x90C5, + 0x6223: 0x90C7, + 0x6224: 0x90C8, + 0x6225: 0x90D5, + 0x6226: 0x90D7, + 0x6227: 0x90D8, + 0x6228: 0x90D9, + 0x6229: 0x90DC, + 0x622A: 0x90DD, + 0x622B: 0x90DF, + 0x622C: 0x90E5, + 0x622D: 0x90D2, + 0x622E: 0x90F6, + 0x622F: 0x90EB, + 0x6230: 0x90EF, + 0x6231: 0x90F0, + 0x6232: 0x90F4, + 0x6233: 0x90FE, + 0x6234: 0x90FF, + 0x6235: 0x9100, + 0x6236: 0x9104, + 0x6237: 0x9105, + 0x6238: 0x9106, + 0x6239: 0x9108, + 0x623A: 0x910D, + 0x623B: 0x9110, + 0x623C: 0x9114, + 0x623D: 0x9116, + 0x623E: 0x9117, + 0x623F: 0x9118, + 0x6240: 0x911A, + 0x6241: 0x911C, + 0x6242: 0x911E, + 0x6243: 0x9120, + 0x6244: 0x9125, + 0x6245: 0x9122, + 0x6246: 0x9123, + 0x6247: 0x9127, + 0x6248: 0x9129, + 0x6249: 0x912E, + 0x624A: 0x912F, + 0x624B: 0x9131, + 0x624C: 0x9134, + 0x624D: 0x9136, + 0x624E: 0x9137, + 0x624F: 0x9139, + 0x6250: 0x913A, + 0x6251: 0x913C, + 0x6252: 0x913D, + 0x6253: 0x9143, + 0x6254: 0x9147, + 0x6255: 0x9148, + 0x6256: 0x914F, + 0x6257: 0x9153, + 0x6258: 0x9157, + 0x6259: 0x9159, + 0x625A: 0x915A, + 0x625B: 0x915B, + 0x625C: 0x9161, + 0x625D: 0x9164, + 0x625E: 0x9167, + 0x625F: 0x916D, + 0x6260: 0x9174, + 0x6261: 0x9179, + 0x6262: 0x917A, + 0x6263: 0x917B, + 0x6264: 0x9181, + 0x6265: 0x9183, + 0x6266: 0x9185, + 0x6267: 0x9186, + 0x6268: 0x918A, + 0x6269: 0x918E, + 0x626A: 0x9191, + 0x626B: 0x9193, + 0x626C: 0x9194, + 0x626D: 0x9195, + 0x626E: 0x9198, + 0x626F: 0x919E, + 0x6270: 0x91A1, + 0x6271: 0x91A6, + 0x6272: 0x91A8, + 0x6273: 0x91AC, + 0x6274: 0x91AD, + 0x6275: 0x91AE, + 0x6276: 0x91B0, + 0x6277: 0x91B1, + 0x6278: 0x91B2, + 0x6279: 0x91B3, + 0x627A: 0x91B6, + 0x627B: 0x91BB, + 0x627C: 0x91BC, + 0x627D: 0x91BD, + 0x627E: 0x91BF, + 0x6321: 0x91C2, + 0x6322: 0x91C3, + 0x6323: 0x91C5, + 0x6324: 0x91D3, + 0x6325: 0x91D4, + 0x6326: 0x91D7, + 0x6327: 0x91D9, + 0x6328: 0x91DA, + 0x6329: 0x91DE, + 0x632A: 0x91E4, + 0x632B: 0x91E5, + 0x632C: 0x91E9, + 0x632D: 0x91EA, + 0x632E: 0x91EC, + 0x632F: 0x91ED, + 0x6330: 0x91EE, + 0x6331: 0x91EF, + 0x6332: 0x91F0, + 0x6333: 0x91F1, + 0x6334: 0x91F7, + 0x6335: 0x91F9, + 0x6336: 0x91FB, + 0x6337: 0x91FD, + 0x6338: 0x9200, + 0x6339: 0x9201, + 0x633A: 0x9204, + 0x633B: 0x9205, + 0x633C: 0x9206, + 0x633D: 0x9207, + 0x633E: 0x9209, + 0x633F: 0x920A, + 0x6340: 0x920C, + 0x6341: 0x9210, + 0x6342: 0x9212, + 0x6343: 0x9213, + 0x6344: 0x9216, + 0x6345: 0x9218, + 0x6346: 0x921C, + 0x6347: 0x921D, + 0x6348: 0x9223, + 0x6349: 0x9224, + 0x634A: 0x9225, + 0x634B: 0x9226, + 0x634C: 0x9228, + 0x634D: 0x922E, + 0x634E: 0x922F, + 0x634F: 0x9230, + 0x6350: 0x9233, + 0x6351: 0x9235, + 0x6352: 0x9236, + 0x6353: 0x9238, + 0x6354: 0x9239, + 0x6355: 0x923A, + 0x6356: 0x923C, + 0x6357: 0x923E, + 0x6358: 0x9240, + 0x6359: 0x9242, + 0x635A: 0x9243, + 0x635B: 0x9246, + 0x635C: 0x9247, + 0x635D: 0x924A, + 0x635E: 0x924D, + 0x635F: 0x924E, + 0x6360: 0x924F, + 0x6361: 0x9251, + 0x6362: 0x9258, + 0x6363: 0x9259, + 0x6364: 0x925C, + 0x6365: 0x925D, + 0x6366: 0x9260, + 0x6367: 0x9261, + 0x6368: 0x9265, + 0x6369: 0x9267, + 0x636A: 0x9268, + 0x636B: 0x9269, + 0x636C: 0x926E, + 0x636D: 0x926F, + 0x636E: 0x9270, + 0x636F: 0x9275, + 0x6370: 0x9276, + 0x6371: 0x9277, + 0x6372: 0x9278, + 0x6373: 0x9279, + 0x6374: 0x927B, + 0x6375: 0x927C, + 0x6376: 0x927D, + 0x6377: 0x927F, + 0x6378: 0x9288, + 0x6379: 0x9289, + 0x637A: 0x928A, + 0x637B: 0x928D, + 0x637C: 0x928E, + 0x637D: 0x9292, + 0x637E: 0x9297, + 0x6421: 0x9299, + 0x6422: 0x929F, + 0x6423: 0x92A0, + 0x6424: 0x92A4, + 0x6425: 0x92A5, + 0x6426: 0x92A7, + 0x6427: 0x92A8, + 0x6428: 0x92AB, + 0x6429: 0x92AF, + 0x642A: 0x92B2, + 0x642B: 0x92B6, + 0x642C: 0x92B8, + 0x642D: 0x92BA, + 0x642E: 0x92BB, + 0x642F: 0x92BC, + 0x6430: 0x92BD, + 0x6431: 0x92BF, + 0x6432: 0x92C0, + 0x6433: 0x92C1, + 0x6434: 0x92C2, + 0x6435: 0x92C3, + 0x6436: 0x92C5, + 0x6437: 0x92C6, + 0x6438: 0x92C7, + 0x6439: 0x92C8, + 0x643A: 0x92CB, + 0x643B: 0x92CC, + 0x643C: 0x92CD, + 0x643D: 0x92CE, + 0x643E: 0x92D0, + 0x643F: 0x92D3, + 0x6440: 0x92D5, + 0x6441: 0x92D7, + 0x6442: 0x92D8, + 0x6443: 0x92D9, + 0x6444: 0x92DC, + 0x6445: 0x92DD, + 0x6446: 0x92DF, + 0x6447: 0x92E0, + 0x6448: 0x92E1, + 0x6449: 0x92E3, + 0x644A: 0x92E5, + 0x644B: 0x92E7, + 0x644C: 0x92E8, + 0x644D: 0x92EC, + 0x644E: 0x92EE, + 0x644F: 0x92F0, + 0x6450: 0x92F9, + 0x6451: 0x92FB, + 0x6452: 0x92FF, + 0x6453: 0x9300, + 0x6454: 0x9302, + 0x6455: 0x9308, + 0x6456: 0x930D, + 0x6457: 0x9311, + 0x6458: 0x9314, + 0x6459: 0x9315, + 0x645A: 0x931C, + 0x645B: 0x931D, + 0x645C: 0x931E, + 0x645D: 0x931F, + 0x645E: 0x9321, + 0x645F: 0x9324, + 0x6460: 0x9325, + 0x6461: 0x9327, + 0x6462: 0x9329, + 0x6463: 0x932A, + 0x6464: 0x9333, + 0x6465: 0x9334, + 0x6466: 0x9336, + 0x6467: 0x9337, + 0x6468: 0x9347, + 0x6469: 0x9348, + 0x646A: 0x9349, + 0x646B: 0x9350, + 0x646C: 0x9351, + 0x646D: 0x9352, + 0x646E: 0x9355, + 0x646F: 0x9357, + 0x6470: 0x9358, + 0x6471: 0x935A, + 0x6472: 0x935E, + 0x6473: 0x9364, + 0x6474: 0x9365, + 0x6475: 0x9367, + 0x6476: 0x9369, + 0x6477: 0x936A, + 0x6478: 0x936D, + 0x6479: 0x936F, + 0x647A: 0x9370, + 0x647B: 0x9371, + 0x647C: 0x9373, + 0x647D: 0x9374, + 0x647E: 0x9376, + 0x6521: 0x937A, + 0x6522: 0x937D, + 0x6523: 0x937F, + 0x6524: 0x9380, + 0x6525: 0x9381, + 0x6526: 0x9382, + 0x6527: 0x9388, + 0x6528: 0x938A, + 0x6529: 0x938B, + 0x652A: 0x938D, + 0x652B: 0x938F, + 0x652C: 0x9392, + 0x652D: 0x9395, + 0x652E: 0x9398, + 0x652F: 0x939B, + 0x6530: 0x939E, + 0x6531: 0x93A1, + 0x6532: 0x93A3, + 0x6533: 0x93A4, + 0x6534: 0x93A6, + 0x6535: 0x93A8, + 0x6536: 0x93AB, + 0x6537: 0x93B4, + 0x6538: 0x93B5, + 0x6539: 0x93B6, + 0x653A: 0x93BA, + 0x653B: 0x93A9, + 0x653C: 0x93C1, + 0x653D: 0x93C4, + 0x653E: 0x93C5, + 0x653F: 0x93C6, + 0x6540: 0x93C7, + 0x6541: 0x93C9, + 0x6542: 0x93CA, + 0x6543: 0x93CB, + 0x6544: 0x93CC, + 0x6545: 0x93CD, + 0x6546: 0x93D3, + 0x6547: 0x93D9, + 0x6548: 0x93DC, + 0x6549: 0x93DE, + 0x654A: 0x93DF, + 0x654B: 0x93E2, + 0x654C: 0x93E6, + 0x654D: 0x93E7, + 0x654E: 0x93F9, + 0x654F: 0x93F7, + 0x6550: 0x93F8, + 0x6551: 0x93FA, + 0x6552: 0x93FB, + 0x6553: 0x93FD, + 0x6554: 0x9401, + 0x6555: 0x9402, + 0x6556: 0x9404, + 0x6557: 0x9408, + 0x6558: 0x9409, + 0x6559: 0x940D, + 0x655A: 0x940E, + 0x655B: 0x940F, + 0x655C: 0x9415, + 0x655D: 0x9416, + 0x655E: 0x9417, + 0x655F: 0x941F, + 0x6560: 0x942E, + 0x6561: 0x942F, + 0x6562: 0x9431, + 0x6563: 0x9432, + 0x6564: 0x9433, + 0x6565: 0x9434, + 0x6566: 0x943B, + 0x6567: 0x943F, + 0x6568: 0x943D, + 0x6569: 0x9443, + 0x656A: 0x9445, + 0x656B: 0x9448, + 0x656C: 0x944A, + 0x656D: 0x944C, + 0x656E: 0x9455, + 0x656F: 0x9459, + 0x6570: 0x945C, + 0x6571: 0x945F, + 0x6572: 0x9461, + 0x6573: 0x9463, + 0x6574: 0x9468, + 0x6575: 0x946B, + 0x6576: 0x946D, + 0x6577: 0x946E, + 0x6578: 0x946F, + 0x6579: 0x9471, + 0x657A: 0x9472, + 0x657B: 0x9484, + 0x657C: 0x9483, + 0x657D: 0x9578, + 0x657E: 0x9579, + 0x6621: 0x957E, + 0x6622: 0x9584, + 0x6623: 0x9588, + 0x6624: 0x958C, + 0x6625: 0x958D, + 0x6626: 0x958E, + 0x6627: 0x959D, + 0x6628: 0x959E, + 0x6629: 0x959F, + 0x662A: 0x95A1, + 0x662B: 0x95A6, + 0x662C: 0x95A9, + 0x662D: 0x95AB, + 0x662E: 0x95AC, + 0x662F: 0x95B4, + 0x6630: 0x95B6, + 0x6631: 0x95BA, + 0x6632: 0x95BD, + 0x6633: 0x95BF, + 0x6634: 0x95C6, + 0x6635: 0x95C8, + 0x6636: 0x95C9, + 0x6637: 0x95CB, + 0x6638: 0x95D0, + 0x6639: 0x95D1, + 0x663A: 0x95D2, + 0x663B: 0x95D3, + 0x663C: 0x95D9, + 0x663D: 0x95DA, + 0x663E: 0x95DD, + 0x663F: 0x95DE, + 0x6640: 0x95DF, + 0x6641: 0x95E0, + 0x6642: 0x95E4, + 0x6643: 0x95E6, + 0x6644: 0x961D, + 0x6645: 0x961E, + 0x6646: 0x9622, + 0x6647: 0x9624, + 0x6648: 0x9625, + 0x6649: 0x9626, + 0x664A: 0x962C, + 0x664B: 0x9631, + 0x664C: 0x9633, + 0x664D: 0x9637, + 0x664E: 0x9638, + 0x664F: 0x9639, + 0x6650: 0x963A, + 0x6651: 0x963C, + 0x6652: 0x963D, + 0x6653: 0x9641, + 0x6654: 0x9652, + 0x6655: 0x9654, + 0x6656: 0x9656, + 0x6657: 0x9657, + 0x6658: 0x9658, + 0x6659: 0x9661, + 0x665A: 0x966E, + 0x665B: 0x9674, + 0x665C: 0x967B, + 0x665D: 0x967C, + 0x665E: 0x967E, + 0x665F: 0x967F, + 0x6660: 0x9681, + 0x6661: 0x9682, + 0x6662: 0x9683, + 0x6663: 0x9684, + 0x6664: 0x9689, + 0x6665: 0x9691, + 0x6666: 0x9696, + 0x6667: 0x969A, + 0x6668: 0x969D, + 0x6669: 0x969F, + 0x666A: 0x96A4, + 0x666B: 0x96A5, + 0x666C: 0x96A6, + 0x666D: 0x96A9, + 0x666E: 0x96AE, + 0x666F: 0x96AF, + 0x6670: 0x96B3, + 0x6671: 0x96BA, + 0x6672: 0x96CA, + 0x6673: 0x96D2, + 0x6674: 0x5DB2, + 0x6675: 0x96D8, + 0x6676: 0x96DA, + 0x6677: 0x96DD, + 0x6678: 0x96DE, + 0x6679: 0x96DF, + 0x667A: 0x96E9, + 0x667B: 0x96EF, + 0x667C: 0x96F1, + 0x667D: 0x96FA, + 0x667E: 0x9702, + 0x6721: 0x9703, + 0x6722: 0x9705, + 0x6723: 0x9709, + 0x6724: 0x971A, + 0x6725: 0x971B, + 0x6726: 0x971D, + 0x6727: 0x9721, + 0x6728: 0x9722, + 0x6729: 0x9723, + 0x672A: 0x9728, + 0x672B: 0x9731, + 0x672C: 0x9733, + 0x672D: 0x9741, + 0x672E: 0x9743, + 0x672F: 0x974A, + 0x6730: 0x974E, + 0x6731: 0x974F, + 0x6732: 0x9755, + 0x6733: 0x9757, + 0x6734: 0x9758, + 0x6735: 0x975A, + 0x6736: 0x975B, + 0x6737: 0x9763, + 0x6738: 0x9767, + 0x6739: 0x976A, + 0x673A: 0x976E, + 0x673B: 0x9773, + 0x673C: 0x9776, + 0x673D: 0x9777, + 0x673E: 0x9778, + 0x673F: 0x977B, + 0x6740: 0x977D, + 0x6741: 0x977F, + 0x6742: 0x9780, + 0x6743: 0x9789, + 0x6744: 0x9795, + 0x6745: 0x9796, + 0x6746: 0x9797, + 0x6747: 0x9799, + 0x6748: 0x979A, + 0x6749: 0x979E, + 0x674A: 0x979F, + 0x674B: 0x97A2, + 0x674C: 0x97AC, + 0x674D: 0x97AE, + 0x674E: 0x97B1, + 0x674F: 0x97B2, + 0x6750: 0x97B5, + 0x6751: 0x97B6, + 0x6752: 0x97B8, + 0x6753: 0x97B9, + 0x6754: 0x97BA, + 0x6755: 0x97BC, + 0x6756: 0x97BE, + 0x6757: 0x97BF, + 0x6758: 0x97C1, + 0x6759: 0x97C4, + 0x675A: 0x97C5, + 0x675B: 0x97C7, + 0x675C: 0x97C9, + 0x675D: 0x97CA, + 0x675E: 0x97CC, + 0x675F: 0x97CD, + 0x6760: 0x97CE, + 0x6761: 0x97D0, + 0x6762: 0x97D1, + 0x6763: 0x97D4, + 0x6764: 0x97D7, + 0x6765: 0x97D8, + 0x6766: 0x97D9, + 0x6767: 0x97DD, + 0x6768: 0x97DE, + 0x6769: 0x97E0, + 0x676A: 0x97DB, + 0x676B: 0x97E1, + 0x676C: 0x97E4, + 0x676D: 0x97EF, + 0x676E: 0x97F1, + 0x676F: 0x97F4, + 0x6770: 0x97F7, + 0x6771: 0x97F8, + 0x6772: 0x97FA, + 0x6773: 0x9807, + 0x6774: 0x980A, + 0x6775: 0x9819, + 0x6776: 0x980D, + 0x6777: 0x980E, + 0x6778: 0x9814, + 0x6779: 0x9816, + 0x677A: 0x981C, + 0x677B: 0x981E, + 0x677C: 0x9820, + 0x677D: 0x9823, + 0x677E: 0x9826, + 0x6821: 0x982B, + 0x6822: 0x982E, + 0x6823: 0x982F, + 0x6824: 0x9830, + 0x6825: 0x9832, + 0x6826: 0x9833, + 0x6827: 0x9835, + 0x6828: 0x9825, + 0x6829: 0x983E, + 0x682A: 0x9844, + 0x682B: 0x9847, + 0x682C: 0x984A, + 0x682D: 0x9851, + 0x682E: 0x9852, + 0x682F: 0x9853, + 0x6830: 0x9856, + 0x6831: 0x9857, + 0x6832: 0x9859, + 0x6833: 0x985A, + 0x6834: 0x9862, + 0x6835: 0x9863, + 0x6836: 0x9865, + 0x6837: 0x9866, + 0x6838: 0x986A, + 0x6839: 0x986C, + 0x683A: 0x98AB, + 0x683B: 0x98AD, + 0x683C: 0x98AE, + 0x683D: 0x98B0, + 0x683E: 0x98B4, + 0x683F: 0x98B7, + 0x6840: 0x98B8, + 0x6841: 0x98BA, + 0x6842: 0x98BB, + 0x6843: 0x98BF, + 0x6844: 0x98C2, + 0x6845: 0x98C5, + 0x6846: 0x98C8, + 0x6847: 0x98CC, + 0x6848: 0x98E1, + 0x6849: 0x98E3, + 0x684A: 0x98E5, + 0x684B: 0x98E6, + 0x684C: 0x98E7, + 0x684D: 0x98EA, + 0x684E: 0x98F3, + 0x684F: 0x98F6, + 0x6850: 0x9902, + 0x6851: 0x9907, + 0x6852: 0x9908, + 0x6853: 0x9911, + 0x6854: 0x9915, + 0x6855: 0x9916, + 0x6856: 0x9917, + 0x6857: 0x991A, + 0x6858: 0x991B, + 0x6859: 0x991C, + 0x685A: 0x991F, + 0x685B: 0x9922, + 0x685C: 0x9926, + 0x685D: 0x9927, + 0x685E: 0x992B, + 0x685F: 0x9931, + 0x6860: 0x9932, + 0x6861: 0x9933, + 0x6862: 0x9934, + 0x6863: 0x9935, + 0x6864: 0x9939, + 0x6865: 0x993A, + 0x6866: 0x993B, + 0x6867: 0x993C, + 0x6868: 0x9940, + 0x6869: 0x9941, + 0x686A: 0x9946, + 0x686B: 0x9947, + 0x686C: 0x9948, + 0x686D: 0x994D, + 0x686E: 0x994E, + 0x686F: 0x9954, + 0x6870: 0x9958, + 0x6871: 0x9959, + 0x6872: 0x995B, + 0x6873: 0x995C, + 0x6874: 0x995E, + 0x6875: 0x995F, + 0x6876: 0x9960, + 0x6877: 0x999B, + 0x6878: 0x999D, + 0x6879: 0x999F, + 0x687A: 0x99A6, + 0x687B: 0x99B0, + 0x687C: 0x99B1, + 0x687D: 0x99B2, + 0x687E: 0x99B5, + 0x6921: 0x99B9, + 0x6922: 0x99BA, + 0x6923: 0x99BD, + 0x6924: 0x99BF, + 0x6925: 0x99C3, + 0x6926: 0x99C9, + 0x6927: 0x99D3, + 0x6928: 0x99D4, + 0x6929: 0x99D9, + 0x692A: 0x99DA, + 0x692B: 0x99DC, + 0x692C: 0x99DE, + 0x692D: 0x99E7, + 0x692E: 0x99EA, + 0x692F: 0x99EB, + 0x6930: 0x99EC, + 0x6931: 0x99F0, + 0x6932: 0x99F4, + 0x6933: 0x99F5, + 0x6934: 0x99F9, + 0x6935: 0x99FD, + 0x6936: 0x99FE, + 0x6937: 0x9A02, + 0x6938: 0x9A03, + 0x6939: 0x9A04, + 0x693A: 0x9A0B, + 0x693B: 0x9A0C, + 0x693C: 0x9A10, + 0x693D: 0x9A11, + 0x693E: 0x9A16, + 0x693F: 0x9A1E, + 0x6940: 0x9A20, + 0x6941: 0x9A22, + 0x6942: 0x9A23, + 0x6943: 0x9A24, + 0x6944: 0x9A27, + 0x6945: 0x9A2D, + 0x6946: 0x9A2E, + 0x6947: 0x9A33, + 0x6948: 0x9A35, + 0x6949: 0x9A36, + 0x694A: 0x9A38, + 0x694B: 0x9A47, + 0x694C: 0x9A41, + 0x694D: 0x9A44, + 0x694E: 0x9A4A, + 0x694F: 0x9A4B, + 0x6950: 0x9A4C, + 0x6951: 0x9A4E, + 0x6952: 0x9A51, + 0x6953: 0x9A54, + 0x6954: 0x9A56, + 0x6955: 0x9A5D, + 0x6956: 0x9AAA, + 0x6957: 0x9AAC, + 0x6958: 0x9AAE, + 0x6959: 0x9AAF, + 0x695A: 0x9AB2, + 0x695B: 0x9AB4, + 0x695C: 0x9AB5, + 0x695D: 0x9AB6, + 0x695E: 0x9AB9, + 0x695F: 0x9ABB, + 0x6960: 0x9ABE, + 0x6961: 0x9ABF, + 0x6962: 0x9AC1, + 0x6963: 0x9AC3, + 0x6964: 0x9AC6, + 0x6965: 0x9AC8, + 0x6966: 0x9ACE, + 0x6967: 0x9AD0, + 0x6968: 0x9AD2, + 0x6969: 0x9AD5, + 0x696A: 0x9AD6, + 0x696B: 0x9AD7, + 0x696C: 0x9ADB, + 0x696D: 0x9ADC, + 0x696E: 0x9AE0, + 0x696F: 0x9AE4, + 0x6970: 0x9AE5, + 0x6971: 0x9AE7, + 0x6972: 0x9AE9, + 0x6973: 0x9AEC, + 0x6974: 0x9AF2, + 0x6975: 0x9AF3, + 0x6976: 0x9AF5, + 0x6977: 0x9AF9, + 0x6978: 0x9AFA, + 0x6979: 0x9AFD, + 0x697A: 0x9AFF, + 0x697B: 0x9B00, + 0x697C: 0x9B01, + 0x697D: 0x9B02, + 0x697E: 0x9B03, + 0x6A21: 0x9B04, + 0x6A22: 0x9B05, + 0x6A23: 0x9B08, + 0x6A24: 0x9B09, + 0x6A25: 0x9B0B, + 0x6A26: 0x9B0C, + 0x6A27: 0x9B0D, + 0x6A28: 0x9B0E, + 0x6A29: 0x9B10, + 0x6A2A: 0x9B12, + 0x6A2B: 0x9B16, + 0x6A2C: 0x9B19, + 0x6A2D: 0x9B1B, + 0x6A2E: 0x9B1C, + 0x6A2F: 0x9B20, + 0x6A30: 0x9B26, + 0x6A31: 0x9B2B, + 0x6A32: 0x9B2D, + 0x6A33: 0x9B33, + 0x6A34: 0x9B34, + 0x6A35: 0x9B35, + 0x6A36: 0x9B37, + 0x6A37: 0x9B39, + 0x6A38: 0x9B3A, + 0x6A39: 0x9B3D, + 0x6A3A: 0x9B48, + 0x6A3B: 0x9B4B, + 0x6A3C: 0x9B4C, + 0x6A3D: 0x9B55, + 0x6A3E: 0x9B56, + 0x6A3F: 0x9B57, + 0x6A40: 0x9B5B, + 0x6A41: 0x9B5E, + 0x6A42: 0x9B61, + 0x6A43: 0x9B63, + 0x6A44: 0x9B65, + 0x6A45: 0x9B66, + 0x6A46: 0x9B68, + 0x6A47: 0x9B6A, + 0x6A48: 0x9B6B, + 0x6A49: 0x9B6C, + 0x6A4A: 0x9B6D, + 0x6A4B: 0x9B6E, + 0x6A4C: 0x9B73, + 0x6A4D: 0x9B75, + 0x6A4E: 0x9B77, + 0x6A4F: 0x9B78, + 0x6A50: 0x9B79, + 0x6A51: 0x9B7F, + 0x6A52: 0x9B80, + 0x6A53: 0x9B84, + 0x6A54: 0x9B85, + 0x6A55: 0x9B86, + 0x6A56: 0x9B87, + 0x6A57: 0x9B89, + 0x6A58: 0x9B8A, + 0x6A59: 0x9B8B, + 0x6A5A: 0x9B8D, + 0x6A5B: 0x9B8F, + 0x6A5C: 0x9B90, + 0x6A5D: 0x9B94, + 0x6A5E: 0x9B9A, + 0x6A5F: 0x9B9D, + 0x6A60: 0x9B9E, + 0x6A61: 0x9BA6, + 0x6A62: 0x9BA7, + 0x6A63: 0x9BA9, + 0x6A64: 0x9BAC, + 0x6A65: 0x9BB0, + 0x6A66: 0x9BB1, + 0x6A67: 0x9BB2, + 0x6A68: 0x9BB7, + 0x6A69: 0x9BB8, + 0x6A6A: 0x9BBB, + 0x6A6B: 0x9BBC, + 0x6A6C: 0x9BBE, + 0x6A6D: 0x9BBF, + 0x6A6E: 0x9BC1, + 0x6A6F: 0x9BC7, + 0x6A70: 0x9BC8, + 0x6A71: 0x9BCE, + 0x6A72: 0x9BD0, + 0x6A73: 0x9BD7, + 0x6A74: 0x9BD8, + 0x6A75: 0x9BDD, + 0x6A76: 0x9BDF, + 0x6A77: 0x9BE5, + 0x6A78: 0x9BE7, + 0x6A79: 0x9BEA, + 0x6A7A: 0x9BEB, + 0x6A7B: 0x9BEF, + 0x6A7C: 0x9BF3, + 0x6A7D: 0x9BF7, + 0x6A7E: 0x9BF8, + 0x6B21: 0x9BF9, + 0x6B22: 0x9BFA, + 0x6B23: 0x9BFD, + 0x6B24: 0x9BFF, + 0x6B25: 0x9C00, + 0x6B26: 0x9C02, + 0x6B27: 0x9C0B, + 0x6B28: 0x9C0F, + 0x6B29: 0x9C11, + 0x6B2A: 0x9C16, + 0x6B2B: 0x9C18, + 0x6B2C: 0x9C19, + 0x6B2D: 0x9C1A, + 0x6B2E: 0x9C1C, + 0x6B2F: 0x9C1E, + 0x6B30: 0x9C22, + 0x6B31: 0x9C23, + 0x6B32: 0x9C26, + 0x6B33: 0x9C27, + 0x6B34: 0x9C28, + 0x6B35: 0x9C29, + 0x6B36: 0x9C2A, + 0x6B37: 0x9C31, + 0x6B38: 0x9C35, + 0x6B39: 0x9C36, + 0x6B3A: 0x9C37, + 0x6B3B: 0x9C3D, + 0x6B3C: 0x9C41, + 0x6B3D: 0x9C43, + 0x6B3E: 0x9C44, + 0x6B3F: 0x9C45, + 0x6B40: 0x9C49, + 0x6B41: 0x9C4A, + 0x6B42: 0x9C4E, + 0x6B43: 0x9C4F, + 0x6B44: 0x9C50, + 0x6B45: 0x9C53, + 0x6B46: 0x9C54, + 0x6B47: 0x9C56, + 0x6B48: 0x9C58, + 0x6B49: 0x9C5B, + 0x6B4A: 0x9C5D, + 0x6B4B: 0x9C5E, + 0x6B4C: 0x9C5F, + 0x6B4D: 0x9C63, + 0x6B4E: 0x9C69, + 0x6B4F: 0x9C6A, + 0x6B50: 0x9C5C, + 0x6B51: 0x9C6B, + 0x6B52: 0x9C68, + 0x6B53: 0x9C6E, + 0x6B54: 0x9C70, + 0x6B55: 0x9C72, + 0x6B56: 0x9C75, + 0x6B57: 0x9C77, + 0x6B58: 0x9C7B, + 0x6B59: 0x9CE6, + 0x6B5A: 0x9CF2, + 0x6B5B: 0x9CF7, + 0x6B5C: 0x9CF9, + 0x6B5D: 0x9D0B, + 0x6B5E: 0x9D02, + 0x6B5F: 0x9D11, + 0x6B60: 0x9D17, + 0x6B61: 0x9D18, + 0x6B62: 0x9D1C, + 0x6B63: 0x9D1D, + 0x6B64: 0x9D1E, + 0x6B65: 0x9D2F, + 0x6B66: 0x9D30, + 0x6B67: 0x9D32, + 0x6B68: 0x9D33, + 0x6B69: 0x9D34, + 0x6B6A: 0x9D3A, + 0x6B6B: 0x9D3C, + 0x6B6C: 0x9D45, + 0x6B6D: 0x9D3D, + 0x6B6E: 0x9D42, + 0x6B6F: 0x9D43, + 0x6B70: 0x9D47, + 0x6B71: 0x9D4A, + 0x6B72: 0x9D53, + 0x6B73: 0x9D54, + 0x6B74: 0x9D5F, + 0x6B75: 0x9D63, + 0x6B76: 0x9D62, + 0x6B77: 0x9D65, + 0x6B78: 0x9D69, + 0x6B79: 0x9D6A, + 0x6B7A: 0x9D6B, + 0x6B7B: 0x9D70, + 0x6B7C: 0x9D76, + 0x6B7D: 0x9D77, + 0x6B7E: 0x9D7B, + 0x6C21: 0x9D7C, + 0x6C22: 0x9D7E, + 0x6C23: 0x9D83, + 0x6C24: 0x9D84, + 0x6C25: 0x9D86, + 0x6C26: 0x9D8A, + 0x6C27: 0x9D8D, + 0x6C28: 0x9D8E, + 0x6C29: 0x9D92, + 0x6C2A: 0x9D93, + 0x6C2B: 0x9D95, + 0x6C2C: 0x9D96, + 0x6C2D: 0x9D97, + 0x6C2E: 0x9D98, + 0x6C2F: 0x9DA1, + 0x6C30: 0x9DAA, + 0x6C31: 0x9DAC, + 0x6C32: 0x9DAE, + 0x6C33: 0x9DB1, + 0x6C34: 0x9DB5, + 0x6C35: 0x9DB9, + 0x6C36: 0x9DBC, + 0x6C37: 0x9DBF, + 0x6C38: 0x9DC3, + 0x6C39: 0x9DC7, + 0x6C3A: 0x9DC9, + 0x6C3B: 0x9DCA, + 0x6C3C: 0x9DD4, + 0x6C3D: 0x9DD5, + 0x6C3E: 0x9DD6, + 0x6C3F: 0x9DD7, + 0x6C40: 0x9DDA, + 0x6C41: 0x9DDE, + 0x6C42: 0x9DDF, + 0x6C43: 0x9DE0, + 0x6C44: 0x9DE5, + 0x6C45: 0x9DE7, + 0x6C46: 0x9DE9, + 0x6C47: 0x9DEB, + 0x6C48: 0x9DEE, + 0x6C49: 0x9DF0, + 0x6C4A: 0x9DF3, + 0x6C4B: 0x9DF4, + 0x6C4C: 0x9DFE, + 0x6C4D: 0x9E0A, + 0x6C4E: 0x9E02, + 0x6C4F: 0x9E07, + 0x6C50: 0x9E0E, + 0x6C51: 0x9E10, + 0x6C52: 0x9E11, + 0x6C53: 0x9E12, + 0x6C54: 0x9E15, + 0x6C55: 0x9E16, + 0x6C56: 0x9E19, + 0x6C57: 0x9E1C, + 0x6C58: 0x9E1D, + 0x6C59: 0x9E7A, + 0x6C5A: 0x9E7B, + 0x6C5B: 0x9E7C, + 0x6C5C: 0x9E80, + 0x6C5D: 0x9E82, + 0x6C5E: 0x9E83, + 0x6C5F: 0x9E84, + 0x6C60: 0x9E85, + 0x6C61: 0x9E87, + 0x6C62: 0x9E8E, + 0x6C63: 0x9E8F, + 0x6C64: 0x9E96, + 0x6C65: 0x9E98, + 0x6C66: 0x9E9B, + 0x6C67: 0x9E9E, + 0x6C68: 0x9EA4, + 0x6C69: 0x9EA8, + 0x6C6A: 0x9EAC, + 0x6C6B: 0x9EAE, + 0x6C6C: 0x9EAF, + 0x6C6D: 0x9EB0, + 0x6C6E: 0x9EB3, + 0x6C6F: 0x9EB4, + 0x6C70: 0x9EB5, + 0x6C71: 0x9EC6, + 0x6C72: 0x9EC8, + 0x6C73: 0x9ECB, + 0x6C74: 0x9ED5, + 0x6C75: 0x9EDF, + 0x6C76: 0x9EE4, + 0x6C77: 0x9EE7, + 0x6C78: 0x9EEC, + 0x6C79: 0x9EED, + 0x6C7A: 0x9EEE, + 0x6C7B: 0x9EF0, + 0x6C7C: 0x9EF1, + 0x6C7D: 0x9EF2, + 0x6C7E: 0x9EF5, + 0x6D21: 0x9EF8, + 0x6D22: 0x9EFF, + 0x6D23: 0x9F02, + 0x6D24: 0x9F03, + 0x6D25: 0x9F09, + 0x6D26: 0x9F0F, + 0x6D27: 0x9F10, + 0x6D28: 0x9F11, + 0x6D29: 0x9F12, + 0x6D2A: 0x9F14, + 0x6D2B: 0x9F16, + 0x6D2C: 0x9F17, + 0x6D2D: 0x9F19, + 0x6D2E: 0x9F1A, + 0x6D2F: 0x9F1B, + 0x6D30: 0x9F1F, + 0x6D31: 0x9F22, + 0x6D32: 0x9F26, + 0x6D33: 0x9F2A, + 0x6D34: 0x9F2B, + 0x6D35: 0x9F2F, + 0x6D36: 0x9F31, + 0x6D37: 0x9F32, + 0x6D38: 0x9F34, + 0x6D39: 0x9F37, + 0x6D3A: 0x9F39, + 0x6D3B: 0x9F3A, + 0x6D3C: 0x9F3C, + 0x6D3D: 0x9F3D, + 0x6D3E: 0x9F3F, + 0x6D3F: 0x9F41, + 0x6D40: 0x9F43, + 0x6D41: 0x9F44, + 0x6D42: 0x9F45, + 0x6D43: 0x9F46, + 0x6D44: 0x9F47, + 0x6D45: 0x9F53, + 0x6D46: 0x9F55, + 0x6D47: 0x9F56, + 0x6D48: 0x9F57, + 0x6D49: 0x9F58, + 0x6D4A: 0x9F5A, + 0x6D4B: 0x9F5D, + 0x6D4C: 0x9F5E, + 0x6D4D: 0x9F68, + 0x6D4E: 0x9F69, + 0x6D4F: 0x9F6D, + 0x6D50: 0x9F6E, + 0x6D51: 0x9F6F, + 0x6D52: 0x9F70, + 0x6D53: 0x9F71, + 0x6D54: 0x9F73, + 0x6D55: 0x9F75, + 0x6D56: 0x9F7A, + 0x6D57: 0x9F7D, + 0x6D58: 0x9F8F, + 0x6D59: 0x9F90, + 0x6D5A: 0x9F91, + 0x6D5B: 0x9F92, + 0x6D5C: 0x9F94, + 0x6D5D: 0x9F96, + 0x6D5E: 0x9F97, + 0x6D5F: 0x9F9E, + 0x6D60: 0x9FA1, + 0x6D61: 0x9FA2, + 0x6D62: 0x9FA3, + 0x6D63: 0x9FA5, +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/mbcs.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/mbcs.go new file mode 100644 index 0000000000000000000000000000000000000000..0614c0edb27bd9336ae9dda766b57ad76ae3a783 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/mbcs.go @@ -0,0 +1,92 @@ +package mahonia + +// Generic converters for multibyte character sets. + +// An mbcsTrie contains the data to convert from the character set to Unicode. +// If a character would be encoded as "\x01\x02\x03", its unicode value would be found at t.children[1].children[2].children[3].rune +// children either is nil or has 256 elements. +type mbcsTrie struct { + // For leaf nodes, the Unicode character that is represented. + char rune + + // For non-leaf nodes, the trie to decode the remainder of the character. + children []mbcsTrie +} + +// A MBCSTable holds the data to convert to and from Unicode. +type MBCSTable struct { + toUnicode mbcsTrie + fromUnicode map[rune]string +} + +// AddCharacter adds a character to the table. rune is its Unicode code point, +// and bytes contains the bytes used to encode it in the character set. +func (table *MBCSTable) AddCharacter(c rune, bytes string) { + if table.fromUnicode == nil { + table.fromUnicode = make(map[rune]string) + } + + table.fromUnicode[c] = bytes + + trie := &table.toUnicode + for i := 0; i < len(bytes); i++ { + if trie.children == nil { + trie.children = make([]mbcsTrie, 256) + } + + b := bytes[i] + trie = &trie.children[b] + } + + trie.char = c +} + +func (table *MBCSTable) Decoder() Decoder { + return func(p []byte) (c rune, size int, status Status) { + if len(p) == 0 { + status = NO_ROOM + return + } + + if p[0] == 0 { + return 0, 1, SUCCESS + } + + trie := &table.toUnicode + for trie.char == 0 { + if trie.children == nil { + return 0xfffd, 1, INVALID_CHAR + } + if len(p) < size+1 { + return 0, 0, NO_ROOM + } + + trie = &trie.children[p[size]] + size++ + } + + c = trie.char + status = SUCCESS + return + } +} + +func (table *MBCSTable) Encoder() Encoder { + return func(p []byte, c rune) (size int, status Status) { + bytes := table.fromUnicode[c] + if bytes == "" { + if len(p) > 0 { + p[0] = '?' + return 1, INVALID_CHAR + } else { + return 0, NO_ROOM + } + } + + if len(p) < len(bytes) { + return 0, NO_ROOM + } + + return copy(p, bytes), SUCCESS + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/reader.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/reader.go new file mode 100644 index 0000000000000000000000000000000000000000..3514b95b8c423a611bae0b14694d4587ccfab0e9 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/reader.go @@ -0,0 +1,151 @@ +package mahonia + +// This file is based on bufio.Reader in the Go standard library, +// which has the following copyright notice: + +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +import ( + "io" + "unicode/utf8" +) + +const ( + defaultBufSize = 4096 +) + +// Reader implements character-set decoding for an io.Reader object. +type Reader struct { + buf []byte + rd io.Reader + decode Decoder + r, w int + err error +} + +// NewReader creates a new Reader that uses the receiver to decode text. +func (d Decoder) NewReader(rd io.Reader) *Reader { + b := new(Reader) + b.buf = make([]byte, defaultBufSize) + b.rd = rd + b.decode = d + return b +} + +// fill reads a new chunk into the buffer. +func (b *Reader) fill() { + // Slide existing data to beginning. + if b.r > 0 { + copy(b.buf, b.buf[b.r:b.w]) + b.w -= b.r + b.r = 0 + } + + // Read new data. + n, e := b.rd.Read(b.buf[b.w:]) + b.w += n + if e != nil { + b.err = e + } +} + +// Read reads data into p. +// It returns the number of bytes read into p. +// It calls Read at most once on the underlying Reader, +// hence n may be less than len(p). +// At EOF, the count will be zero and err will be os.EOF. +func (b *Reader) Read(p []byte) (n int, err error) { + n = len(p) + filled := false + if n == 0 { + return 0, b.err + } + if b.w == b.r { + if b.err != nil { + return 0, b.err + } + if n > len(b.buf) { + // Large read, empty buffer. + // Allocate a larger buffer for efficiency. + b.buf = make([]byte, n) + } + b.fill() + filled = true + if b.w == b.r { + return 0, b.err + } + } + + i := 0 + for i < n { + rune, size, status := b.decode(b.buf[b.r:b.w]) + + if status == STATE_ONLY { + b.r += size + continue + } + + if status == NO_ROOM { + if b.err != nil { + rune = 0xfffd + size = b.w - b.r + if size == 0 { + break + } + status = INVALID_CHAR + } else if filled { + break + } else { + b.fill() + filled = true + continue + } + } + + if i+utf8.RuneLen(rune) > n { + break + } + + b.r += size + if rune < 128 { + p[i] = byte(rune) + i++ + } else { + i += utf8.EncodeRune(p[i:], rune) + } + } + + return i, nil +} + +// ReadRune reads a single Unicode character and returns the +// rune and its size in bytes. +func (b *Reader) ReadRune() (c rune, size int, err error) { +read: + c, size, status := b.decode(b.buf[b.r:b.w]) + + if status == NO_ROOM && b.err == nil { + b.fill() + goto read + } + + if status == STATE_ONLY { + b.r += size + goto read + } + + if b.r == b.w { + return 0, 0, b.err + } + + if status == NO_ROOM { + c = 0xfffd + size = b.w - b.r + status = INVALID_CHAR + } + + b.r += size + return c, size, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/shiftjis.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/shiftjis.go new file mode 100644 index 0000000000000000000000000000000000000000..a5c8e3ea5c6fabd6526bd1c1876537cfc1f33b15 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/shiftjis.go @@ -0,0 +1,70 @@ +package mahonia + +// Converters for the Shift-JIS encoding. + +import ( + "sync" +) + +func init() { + RegisterCharset(&Charset{ + Name: "Shift_JIS", + Aliases: []string{"MS_Kanji", "csShiftJIS", "SJIS"}, + NewDecoder: func() Decoder { + sjisOnce.Do(makeSjisTable) + return sjisTable.Decoder() + }, + NewEncoder: func() Encoder { + sjisOnce.Do(makeSjisTable) + return sjisTable.Encoder() + }, + }) +} + +var sjisOnce sync.Once + +var sjisTable MBCSTable + +func makeSjisTable() { + var b [2]byte + + for jis0208, unicode := range jis0208ToUnicode { + if unicode == 0 { + continue + } + + j1 := byte(jis0208 >> 8) + j2 := byte(jis0208) + + if j1 < 95 { + b[0] = (j1+1)/2 + 112 + } else { + b[0] = (j1+1)/2 + 176 + } + + if j1&1 == 1 { + b[1] = j2 + 31 + if j2 >= 96 { + b[1]++ + } + } else { + b[1] = j2 + 126 + } + + sjisTable.AddCharacter(rune(unicode), string(b[:])) + } + + for jis0201, unicode := range jis0201ToUnicode { + if unicode == 0 { + continue + } + + sjisTable.AddCharacter(rune(unicode), string(byte(jis0201))) + } + + for i := '\x00'; i < 32; i++ { + sjisTable.AddCharacter(i, string(byte(i))) + } + + sjisTable.AddCharacter(0x7f, "\x7f") +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/translate.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/translate.go new file mode 100644 index 0000000000000000000000000000000000000000..ea4158448a052dd69d3366e056c62c50d9e9b7c5 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/translate.go @@ -0,0 +1,50 @@ +package mahonia + +import "unicode/utf8" + +// Translate enables a Decoder to implement go-charset's Translator interface. +func (d Decoder) Translate(data []byte, eof bool) (n int, cdata []byte, err error) { + cdata = make([]byte, len(data)+1) + destPos := 0 + + for n < len(data) { + rune, size, status := d(data[n:]) + + switch status { + case STATE_ONLY: + n += size + continue + + case NO_ROOM: + if !eof { + return n, cdata[:destPos], nil + } + rune = 0xfffd + n = len(data) + + default: + n += size + } + + if rune < 128 { + if destPos >= len(cdata) { + cdata = doubleLength(cdata) + } + cdata[destPos] = byte(rune) + destPos++ + } else { + if destPos+utf8.RuneLen(rune) > len(cdata) { + cdata = doubleLength(cdata) + } + destPos += utf8.EncodeRune(cdata[destPos:], rune) + } + } + + return n, cdata[:destPos], nil +} + +func doubleLength(b []byte) []byte { + b2 := make([]byte, 2*len(b)) + copy(b2, b) + return b2 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/utf16.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/utf16.go new file mode 100644 index 0000000000000000000000000000000000000000..3ec7b770288abbd0bbf4457fbcf629fd2c6097b4 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/utf16.go @@ -0,0 +1,170 @@ +package mahonia + +import ( + "unicode/utf16" +) + +func init() { + for i := 0; i < len(utf16Charsets); i++ { + RegisterCharset(&utf16Charsets[i]) + } +} + +var utf16Charsets = []Charset{ + { + Name: "UTF-16", + NewDecoder: func() Decoder { + var decodeRune Decoder + return func(p []byte) (c rune, size int, status Status) { + if decodeRune == nil { + // haven't read the BOM yet + if len(p) < 2 { + status = NO_ROOM + return + } + + switch { + case p[0] == 0xfe && p[1] == 0xff: + decodeRune = decodeUTF16beRune + return 0, 2, STATE_ONLY + case p[0] == 0xff && p[1] == 0xfe: + decodeRune = decodeUTF16leRune + return 0, 2, STATE_ONLY + default: + decodeRune = decodeUTF16beRune + } + } + + return decodeRune(p) + } + }, + NewEncoder: func() Encoder { + wroteBOM := false + return func(p []byte, c rune) (size int, status Status) { + if !wroteBOM { + if len(p) < 2 { + status = NO_ROOM + return + } + + p[0] = 0xfe + p[1] = 0xff + wroteBOM = true + return 2, STATE_ONLY + } + + return encodeUTF16beRune(p, c) + } + }, + }, + { + Name: "UTF-16BE", + NewDecoder: func() Decoder { return decodeUTF16beRune }, + NewEncoder: func() Encoder { return encodeUTF16beRune }, + }, + { + Name: "UTF-16LE", + NewDecoder: func() Decoder { return decodeUTF16leRune }, + NewEncoder: func() Encoder { return encodeUTF16leRune }, + }, +} + +func decodeUTF16beRune(p []byte) (r rune, size int, status Status) { + if len(p) < 2 { + status = NO_ROOM + return + } + + c := rune(p[0])<<8 + rune(p[1]) + + if utf16.IsSurrogate(c) { + if len(p) < 4 { + status = NO_ROOM + return + } + + c2 := rune(p[2])<<8 + rune(p[3]) + c = utf16.DecodeRune(c, c2) + + if c == 0xfffd { + return c, 2, INVALID_CHAR + } else { + return c, 4, SUCCESS + } + } + + return c, 2, SUCCESS +} + +func encodeUTF16beRune(p []byte, c rune) (size int, status Status) { + if c < 0x10000 { + if len(p) < 2 { + status = NO_ROOM + return + } + p[0] = byte(c >> 8) + p[1] = byte(c) + return 2, SUCCESS + } + + if len(p) < 4 { + status = NO_ROOM + return + } + s1, s2 := utf16.EncodeRune(c) + p[0] = byte(s1 >> 8) + p[1] = byte(s1) + p[2] = byte(s2 >> 8) + p[3] = byte(s2) + return 4, SUCCESS +} + +func decodeUTF16leRune(p []byte) (r rune, size int, status Status) { + if len(p) < 2 { + status = NO_ROOM + return + } + + c := rune(p[1])<<8 + rune(p[0]) + + if utf16.IsSurrogate(c) { + if len(p) < 4 { + status = NO_ROOM + return + } + + c2 := rune(p[3])<<8 + rune(p[2]) + c = utf16.DecodeRune(c, c2) + + if c == 0xfffd { + return c, 2, INVALID_CHAR + } else { + return c, 4, SUCCESS + } + } + + return c, 2, SUCCESS +} + +func encodeUTF16leRune(p []byte, c rune) (size int, status Status) { + if c < 0x10000 { + if len(p) < 2 { + status = NO_ROOM + return + } + p[1] = byte(c >> 8) + p[0] = byte(c) + return 2, SUCCESS + } + + if len(p) < 4 { + status = NO_ROOM + return + } + s1, s2 := utf16.EncodeRune(c) + p[1] = byte(s1 >> 8) + p[0] = byte(s1) + p[3] = byte(s2 >> 8) + p[2] = byte(s2) + return 4, SUCCESS +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/utf8.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/utf8.go new file mode 100644 index 0000000000000000000000000000000000000000..b14010911e4303493d816549d5de98cf094be35f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/utf8.go @@ -0,0 +1,45 @@ +package mahonia + +import "unicode/utf8" + +func init() { + RegisterCharset(&Charset{ + Name: "UTF-8", + NewDecoder: func() Decoder { return decodeUTF8Rune }, + NewEncoder: func() Encoder { return encodeUTF8Rune }, + }) +} + +func decodeUTF8Rune(p []byte) (c rune, size int, status Status) { + if len(p) == 0 { + status = NO_ROOM + return + } + + if p[0] < 128 { + return rune(p[0]), 1, SUCCESS + } + + c, size = utf8.DecodeRune(p) + + if c == 0xfffd { + if utf8.FullRune(p) { + status = INVALID_CHAR + return + } + + return 0, 0, NO_ROOM + } + + status = SUCCESS + return +} + +func encodeUTF8Rune(p []byte, c rune) (size int, status Status) { + size = utf8.RuneLen(c) + if size > len(p) { + return 0, NO_ROOM + } + + return utf8.EncodeRune(p, c), SUCCESS +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/writer.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/writer.go new file mode 100644 index 0000000000000000000000000000000000000000..bdeb519c0b13fdd1a70fa20aa41eddb01eac6061 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/axgle/mahonia/writer.go @@ -0,0 +1,108 @@ +package mahonia + +import ( + "io" + "unicode/utf8" +) + +// Writer implements character-set encoding for an io.Writer object. +type Writer struct { + wr io.Writer + encode Encoder + inbuf []byte + outbuf []byte +} + +// NewWriter creates a new Writer that uses the receiver to encode text. +func (e Encoder) NewWriter(wr io.Writer) *Writer { + w := new(Writer) + w.wr = wr + w.encode = e + return w +} + +// Write encodes and writes the data from p. +func (w *Writer) Write(p []byte) (n int, err error) { + n = len(p) + + if len(w.inbuf) > 0 { + w.inbuf = append(w.inbuf, p...) + p = w.inbuf + } + + if len(w.outbuf) < len(p) { + w.outbuf = make([]byte, len(p)+10) + } + + outpos := 0 + + for len(p) > 0 { + rune, size := utf8.DecodeRune(p) + if rune == 0xfffd && !utf8.FullRune(p) { + break + } + + p = p[size:] + + retry: + size, status := w.encode(w.outbuf[outpos:], rune) + + if status == NO_ROOM { + newDest := make([]byte, len(w.outbuf)*2) + copy(newDest, w.outbuf) + w.outbuf = newDest + goto retry + } + + if status == STATE_ONLY { + outpos += size + goto retry + } + + outpos += size + } + + w.inbuf = w.inbuf[:0] + if len(p) > 0 { + w.inbuf = append(w.inbuf, p...) + } + + n1, err := w.wr.Write(w.outbuf[0:outpos]) + + if err != nil && n1 < n { + n = n1 + } + + return +} + +func (w *Writer) WriteRune(c rune) (size int, err error) { + if len(w.inbuf) > 0 { + // There are leftover bytes, a partial UTF-8 sequence. + w.inbuf = w.inbuf[:0] + w.WriteRune(0xfffd) + } + + if w.outbuf == nil { + w.outbuf = make([]byte, 16) + } + + outpos := 0 + +retry: + size, status := w.encode(w.outbuf[outpos:], c) + + if status == NO_ROOM { + w.outbuf = make([]byte, len(w.outbuf)*2) + goto retry + } + + if status == STATE_ONLY { + outpos += size + goto retry + } + + outpos += size + + return w.wr.Write(w.outbuf[0:outpos]) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/beego/i18n/LICENSE b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/beego/i18n/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..8405e89a0b12024529554191c9b7ec20acc116fd --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/beego/i18n/LICENSE @@ -0,0 +1,191 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of Copyright License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +3. Grant of Patent License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. + +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification within +third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/beego/i18n/README.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/beego/i18n/README.md new file mode 100644 index 0000000000000000000000000000000000000000..b1cf49670dc7381ef0e1be36aa87e91ad7eba524 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/beego/i18n/README.md @@ -0,0 +1,6 @@ +i18n +==== + +Package i18n is for app Internationalization and Localization. + +[Documentation](http://beego.me/docs/module/i18n.md) \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/beego/i18n/i18n.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/beego/i18n/i18n.go new file mode 100644 index 0000000000000000000000000000000000000000..e826259011800341f0a750b51edc47d41a0dc0b3 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/beego/i18n/i18n.go @@ -0,0 +1,232 @@ +// Copyright 2013-2014 beego authors +// +// Licensed under the Apache License, Version 2.0 (the "License"): you may +// not use this file except in compliance with the License. You may obtain +// a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +// License for the specific language governing permissions and limitations +// under the License. + +// Package i18n is for app Internationalization and Localization. +package i18n + +import ( + "fmt" + "reflect" + "strings" + + "github.com/Unknwon/goconfig" +) + +var ( + locales = &localeStore{store: make(map[string]*locale)} +) + +type locale struct { + id int + lang string + langDesc string + message *goconfig.ConfigFile +} + +type localeStore struct { + langs []string + langDescs []string + store map[string]*locale +} + +// Get target language string +func (d *localeStore) Get(lang, section, format string) (string, bool) { + if locale, ok := d.store[lang]; ok { + if section == "" { + section = goconfig.DEFAULT_SECTION + } + + if value, err := locale.message.GetValue(section, format); err == nil { + return value, true + } + } + + return "", false +} + +func (d *localeStore) Add(lc *locale) bool { + if _, ok := d.store[lc.lang]; ok { + return false + } + + lc.id = len(d.langs) + d.langs = append(d.langs, lc.lang) + d.langDescs = append(d.langDescs, lc.langDesc) + d.store[lc.lang] = lc + + return true +} + +func (d *localeStore) Reload(langs ...string) error { + if len(langs) == 0 { + for _, lc := range d.store { + err := lc.message.Reload() + if err != nil { + return err + } + } + } else { + for _, lang := range langs { + if lc, ok := d.store[lang]; ok { + err := lc.message.Reload() + if err != nil { + return err + } + } + } + } + + return nil +} + +// Reload locales +func ReloadLangs(langs ...string) error { + return locales.Reload(langs...) +} + +// List all locale languages +func ListLangs() []string { + langs := make([]string, len(locales.langs)) + copy(langs, locales.langs) + return langs +} + +func ListLangDescs() []string { + langDescs := make([]string, len(locales.langDescs)) + copy(langDescs, locales.langDescs) + return langDescs +} + +// Check language name if exist +func IsExist(lang string) bool { + _, ok := locales.store[lang] + return ok +} + +// Check language name if exist +func IndexLang(lang string) int { + if lc, ok := locales.store[lang]; ok { + return lc.id + } + return -1 +} + +// Get language by index id +func GetLangByIndex(index int) string { + if index < 0 || index >= len(locales.langs) { + return "" + } + return locales.langs[index] +} + +func GetDescriptionByIndex(index int) string { + if index < 0 || index >= len(locales.langDescs) { + return "" + } + + return locales.langDescs[index] +} + +func GetDescriptionByLang(lang string) string { + return GetDescriptionByIndex(IndexLang(lang)) +} + +func SetMessageWithDesc(lang, langDesc, filePath string, appendFiles ...string) error { + message, err := goconfig.LoadConfigFile(filePath, appendFiles...) + if err == nil { + message.BlockMode = false + lc := new(locale) + lc.lang = lang + lc.langDesc = langDesc + lc.message = message + + if locales.Add(lc) == false { + return fmt.Errorf("Lang %s alread exist", lang) + } + } + return err +} + +func SetMessageDataWithDesc(lang, langDesc string, data []byte) error { + message, err := goconfig.LoadFromData(data) + if err == nil { + message.BlockMode = false + lc := new(locale) + lc.lang = lang + lc.langDesc = langDesc + lc.message = message + + if locales.Add(lc) == false { + return fmt.Errorf("Lang %s alread exist", lang) + } + } + return err +} + +// SetMessage sets the message file for localization. +func SetMessage(lang, filePath string, appendFiles ...string) error { + return SetMessageWithDesc(lang, lang, filePath, appendFiles...) +} + +func SetMessageData(lang string, data []byte) error { + return SetMessageDataWithDesc(lang, lang, data) +} + +// A Locale describles the information of localization. +type Locale struct { + Lang string +} + +// Tr translate content to target language. +func (l Locale) Tr(format string, args ...interface{}) string { + return Tr(l.Lang, format, args...) +} + +// Index get lang index of LangStore +func (l Locale) Index() int { + return IndexLang(l.Lang) +} + +// Tr translate content to target language. +func Tr(lang, format string, args ...interface{}) string { + var section string + parts := strings.SplitN(format, ".", 2) + if len(parts) == 2 { + section = parts[0] + format = parts[1] + } + + value, ok := locales.Get(lang, section, format) + if ok { + format = value + } + + if len(args) > 0 { + params := make([]interface{}, 0, len(args)) + for _, arg := range args { + if arg != nil { + val := reflect.ValueOf(arg) + if val.Kind() == reflect.Slice { + for i := 0; i < val.Len(); i++ { + params = append(params, val.Index(i).Interface()) + } + } else { + params = append(params, arg) + } + } + } + return fmt.Sprintf(format, params...) + } + return fmt.Sprintf(format) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/CHANGELOG.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..5f0ab254449cc3daf2b0b06b13ddd118995f7da2 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/CHANGELOG.md @@ -0,0 +1,116 @@ +# Changelog + +## v3.3.2 (2017-12-22) + +- Support to route trailing slashes on mounted sub-routers (#281) +- middleware: new `ContentCharset` to check matching charsets. Thank you + @csucu for your community contribution! + + +## v3.3.1 (2017-11-20) + +- middleware: new `AllowContentType` handler for explicit whitelist of accepted request Content-Types +- middleware: new `SetHeader` handler for short-hand middleware to set a response header key/value +- Minor bug fixes + + +## v3.3.0 (2017-10-10) + +- New chi.RegisterMethod(method) to add support for custom HTTP methods, see _examples/custom-method for usage +- Deprecated LINK and UNLINK methods from the default list, please use `chi.RegisterMethod("LINK")` and `chi.RegisterMethod("UNLINK")` in an `init()` function + + +## v3.2.1 (2017-08-31) + +- Add new `Match(rctx *Context, method, path string) bool` method to `Routes` interface + and `Mux`. Match searches the mux's routing tree for a handler that matches the method/path +- Add new `RouteMethod` to `*Context` +- Add new `Routes` pointer to `*Context` +- Add new `middleware.GetHead` to route missing HEAD requests to GET handler +- Updated benchmarks (see README) + + +## v3.1.5 (2017-08-02) + +- Setup golint and go vet for the project +- As per golint, we've redefined `func ServerBaseContext(h http.Handler, baseCtx context.Context) http.Handler` + to `func ServerBaseContext(baseCtx context.Context, h http.Handler) http.Handler` + + +## v3.1.0 (2017-07-10) + +- Fix a few minor issues after v3 release +- Move `docgen` sub-pkg to https://github.com/go-chi/docgen +- Move `render` sub-pkg to https://github.com/go-chi/render +- Add new `URLFormat` handler to chi/middleware sub-pkg to make working with url mime + suffixes easier, ie. parsing `/articles/1.json` and `/articles/1.xml`. See comments in + https://github.com/go-chi/chi/blob/master/middleware/url_format.go for example usage. + + +## v3.0.0 (2017-06-21) + +- Major update to chi library with many exciting updates, but also some *breaking changes* +- URL parameter syntax changed from `/:id` to `/{id}` for even more flexible routing, such as + `/articles/{month}-{day}-{year}-{slug}`, `/articles/{id}`, and `/articles/{id}.{ext}` on the + same router +- Support for regexp for routing patterns, in the form of `/{paramKey:regExp}` for example: + `r.Get("/articles/{name:[a-z]+}", h)` and `chi.URLParam(r, "name")` +- Add `Method` and `MethodFunc` to `chi.Router` to allow routing definitions such as + `r.Method("GET", "/", h)` which provides a cleaner interface for custom handlers like + in `_examples/custom-handler` +- Deprecating `mux#FileServer` helper function. Instead, we encourage users to create their + own using file handler with the stdlib, see `_examples/fileserver` for an example +- Add support for LINK/UNLINK http methods via `r.Method()` and `r.MethodFunc()` +- Moved the chi project to its own organization, to allow chi-related community packages to + be easily discovered and supported, at: https://github.com/go-chi +- *NOTE:* please update your import paths to `"github.com/go-chi/chi"` +- *NOTE:* chi v2 is still available at https://github.com/go-chi/chi/tree/v2 + + +## v2.1.0 (2017-03-30) + +- Minor improvements and update to the chi core library +- Introduced a brand new `chi/render` sub-package to complete the story of building + APIs to offer a pattern for managing well-defined request / response payloads. Please + check out the updated `_examples/rest` example for how it works. +- Added `MethodNotAllowed(h http.HandlerFunc)` to chi.Router interface + + +## v2.0.0 (2017-01-06) + +- After many months of v2 being in an RC state with many companies and users running it in + production, the inclusion of some improvements to the middlewares, we are very pleased to + announce v2.0.0 of chi. + + +## v2.0.0-rc1 (2016-07-26) + +- Huge update! chi v2 is a large refactor targetting Go 1.7+. As of Go 1.7, the popular + community `"net/context"` package has been included in the standard library as `"context"` and + utilized by `"net/http"` and `http.Request` to managing deadlines, cancelation signals and other + request-scoped values. We're very excited about the new context addition and are proud to + introduce chi v2, a minimal and powerful routing package for building large HTTP services, + with zero external dependencies. Chi focuses on idiomatic design and encourages the use of + stdlib HTTP handlers and middlwares. +- chi v2 deprecates its `chi.Handler` interface and requires `http.Handler` or `http.HandlerFunc` +- chi v2 stores URL routing parameters and patterns in the standard request context: `r.Context()` +- chi v2 lower-level routing context is accessible by `chi.RouteContext(r.Context()) *chi.Context`, + which provides direct access to URL routing parameters, the routing path and the matching + routing patterns. +- Users upgrading from chi v1 to v2, need to: + 1. Update the old chi.Handler signature, `func(ctx context.Context, w http.ResponseWriter, r *http.Request)` to + the standard http.Handler: `func(w http.ResponseWriter, r *http.Request)` + 2. Use `chi.URLParam(r *http.Request, paramKey string) string` + or `URLParamFromCtx(ctx context.Context, paramKey string) string` to access a url parameter value + + +## v1.0.0 (2016-07-01) + +- Released chi v1 stable https://github.com/go-chi/chi/tree/v1.0.0 for Go 1.6 and older. + + +## v0.9.0 (2016-03-31) + +- Reuse context objects via sync.Pool for zero-allocation routing [#33](https://github.com/go-chi/chi/pull/33) +- BREAKING NOTE: due to subtle API changes, previously `chi.URLParams(ctx)["id"]` used to access url parameters + has changed to: `chi.URLParam(ctx, "id")` diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/CONTRIBUTING.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/CONTRIBUTING.md new file mode 100644 index 0000000000000000000000000000000000000000..c0ac2dfe853bd857dcc497b2cc29f7900c8a4370 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/CONTRIBUTING.md @@ -0,0 +1,31 @@ +# Contributing + +## Prerequisites + +1. [Install Go][go-install]. +2. Download the sources and switch the working directory: + + ```bash + go get -u -d github.com/go-chi/chi + cd $GOPATH/src/github.com/go-chi/chi + ``` + +## Submitting a Pull Request + +A typical workflow is: + +1. [Fork the repository.][fork] [This tip maybe also helpful.][go-fork-tip] +2. [Create a topic branch.][branch] +3. Add tests for your change. +4. Run `go test`. If your tests pass, return to the step 3. +5. Implement the change and ensure the steps from the previous step pass. +6. Run `goimports -w .`, to ensure the new code conforms to Go formatting guideline. +7. [Add, commit and push your changes.][git-help] +8. [Submit a pull request.][pull-req] + +[go-install]: https://golang.org/doc/install +[go-fork-tip]: http://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html +[fork]: https://help.github.com/articles/fork-a-repo +[branch]: http://learn.github.com/p/branching.html +[git-help]: https://guides.github.com +[pull-req]: https://help.github.com/articles/using-pull-requests diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/LICENSE b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..d99f02ffac5185e2550770d33333a67e2cf2092b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2015-present Peter Kieltyka (https://github.com/pkieltyka), Google Inc. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/README.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/README.md new file mode 100644 index 0000000000000000000000000000000000000000..c71a3a01d7db5511c6017f4ce1de4038bec0b3f6 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/README.md @@ -0,0 +1,443 @@ +# <img alt="chi" src="https://cdn.rawgit.com/go-chi/chi/master/_examples/chi.svg" width="220" /> + + +[![GoDoc Widget]][GoDoc] [![Travis Widget]][Travis] + +`chi` is a lightweight, idiomatic and composable router for building Go 1.7+ HTTP services. It's +especially good at helping you write large REST API services that are kept maintainable as your +project grows and changes. `chi` is built on the new `context` package introduced in Go 1.7 to +handle signaling, cancelation and request-scoped values across a handler chain. + +The focus of the project has been to seek out an elegant and comfortable design for writing +REST API servers, written during the development of the Pressly API service that powers our +public API service, which in turn powers all of our client-side applications. + +The key considerations of chi's design are: project structure, maintainability, standard http +handlers (stdlib-only), developer productivity, and deconstructing a large system into many small +parts. The core router `github.com/go-chi/chi` is quite small (less than 1000 LOC), but we've also +included some useful/optional subpackages: [middleware](/middleware), [render](https://github.com/go-chi/render) and [docgen](https://github.com/go-chi/docgen). We hope you enjoy it too! + +## Install + +`go get -u github.com/go-chi/chi` + + +## Features + +* **Lightweight** - cloc'd in ~1000 LOC for the chi router +* **Fast** - yes, see [benchmarks](#benchmarks) +* **100% compatible with net/http** - use any http or middleware pkg in the ecosystem that is also compatible with `net/http` +* **Designed for modular/composable APIs** - middlewares, inline middlewares, route groups and subrouter mounting +* **Context control** - built on new `context` package, providing value chaining, cancelations and timeouts +* **Robust** - in production at Pressly, CloudFlare, Heroku, 99Designs, and many others (see [discussion](https://github.com/go-chi/chi/issues/91)) +* **Doc generation** - `docgen` auto-generates routing documentation from your source to JSON or Markdown +* **No external dependencies** - plain ol' Go 1.7+ stdlib + net/http + + +## Examples + +* [rest](https://github.com/go-chi/chi/blob/master/_examples/rest/main.go) - REST APIs made easy, productive and maintainable +* [logging](https://github.com/go-chi/chi/blob/master/_examples/logging/main.go) - Easy structured logging for any backend +* [limits](https://github.com/go-chi/chi/blob/master/_examples/limits/main.go) - Timeouts and Throttling +* [todos-resource](https://github.com/go-chi/chi/blob/master/_examples/todos-resource/main.go) - Struct routers/handlers, an example of another code layout style +* [versions](https://github.com/go-chi/chi/blob/master/_examples/versions/main.go) - Demo of `chi/render` subpkg +* [fileserver](https://github.com/go-chi/chi/blob/master/_examples/fileserver/main.go) - Easily serve static files +* [graceful](https://github.com/go-chi/chi/blob/master/_examples/graceful/main.go) - Graceful context signaling and server shutdown + + +**As easy as:** + +```go +package main + +import ( + "net/http" + "github.com/go-chi/chi" +) + +func main() { + r := chi.NewRouter() + r.Get("/", func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte("welcome")) + }) + http.ListenAndServe(":3000", r) +} +``` + +**REST Preview:** + +Here is a little preview of how routing looks like with chi. Also take a look at the generated routing docs +in JSON ([routes.json](https://github.com/go-chi/chi/blob/master/_examples/rest/routes.json)) and in +Markdown ([routes.md](https://github.com/go-chi/chi/blob/master/_examples/rest/routes.md)). + +I highly recommend reading the source of the [examples](#examples) listed above, they will show you all the features +of chi and serve as a good form of documentation. + +```go +import ( + //... + "context" + "github.com/go-chi/chi" + "github.com/go-chi/chi/middleware" +) + +func main() { + r := chi.NewRouter() + + // A good base middleware stack + r.Use(middleware.RequestID) + r.Use(middleware.RealIP) + r.Use(middleware.Logger) + r.Use(middleware.Recoverer) + + // Set a timeout value on the request context (ctx), that will signal + // through ctx.Done() that the request has timed out and further + // processing should be stopped. + r.Use(middleware.Timeout(60 * time.Second)) + + r.Get("/", func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte("hi")) + }) + + // RESTy routes for "articles" resource + r.Route("/articles", func(r chi.Router) { + r.With(paginate).Get("/", listArticles) // GET /articles + r.With(paginate).Get("/{month}-{day}-{year}", listArticlesByDate) // GET /articles/01-16-2017 + + r.Post("/", createArticle) // POST /articles + r.Get("/search", searchArticles) // GET /articles/search + + // Regexp url parameters: + r.Get("/{articleSlug:[a-z-]+}", getArticleBySlug) // GET /articles/home-is-toronto + + // Subrouters: + r.Route("/{articleID}", func(r chi.Router) { + r.Use(ArticleCtx) + r.Get("/", getArticle) // GET /articles/123 + r.Put("/", updateArticle) // PUT /articles/123 + r.Delete("/", deleteArticle) // DELETE /articles/123 + }) + }) + + // Mount the admin sub-router + r.Mount("/admin", adminRouter()) + + http.ListenAndServe(":3333", r) +} + +func ArticleCtx(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + articleID := chi.URLParam(r, "articleID") + article, err := dbGetArticle(articleID) + if err != nil { + http.Error(w, http.StatusText(404), 404) + return + } + ctx := context.WithValue(r.Context(), "article", article) + next.ServeHTTP(w, r.WithContext(ctx)) + }) +} + +func getArticle(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + article, ok := ctx.Value("article").(*Article) + if !ok { + http.Error(w, http.StatusText(422), 422) + return + } + w.Write([]byte(fmt.Sprintf("title:%s", article.Title))) +} + +// A completely separate router for administrator routes +func adminRouter() http.Handler { + r := chi.NewRouter() + r.Use(AdminOnly) + r.Get("/", adminIndex) + r.Get("/accounts", adminListAccounts) + return r +} + +func AdminOnly(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + perm, ok := ctx.Value("acl.permission").(YourPermissionType) + if !ok || !perm.IsAdmin() { + http.Error(w, http.StatusText(403), 403) + return + } + next.ServeHTTP(w, r) + }) +} +``` + + +## Router design + +chi's router is based on a kind of [Patricia Radix trie](https://en.wikipedia.org/wiki/Radix_tree). +The router is fully compatible with `net/http`. + +Built on top of the tree is the `Router` interface: + +```go +// Router consisting of the core routing methods used by chi's Mux, +// using only the standard net/http. +type Router interface { + http.Handler + Routes + + // Use appends one of more middlewares onto the Router stack. + Use(middlewares ...func(http.Handler) http.Handler) + + // With adds inline middlewares for an endpoint handler. + With(middlewares ...func(http.Handler) http.Handler) Router + + // Group adds a new inline-Router along the current routing + // path, with a fresh middleware stack for the inline-Router. + Group(fn func(r Router)) Router + + // Route mounts a sub-Router along a `pattern`` string. + Route(pattern string, fn func(r Router)) Router + + // Mount attaches another http.Handler along ./pattern/* + Mount(pattern string, h http.Handler) + + // Handle and HandleFunc adds routes for `pattern` that matches + // all HTTP methods. + Handle(pattern string, h http.Handler) + HandleFunc(pattern string, h http.HandlerFunc) + + // Method and MethodFunc adds routes for `pattern` that matches + // the `method` HTTP method. + Method(method, pattern string, h http.Handler) + MethodFunc(method, pattern string, h http.HandlerFunc) + + // HTTP-method routing along `pattern` + Connect(pattern string, h http.HandlerFunc) + Delete(pattern string, h http.HandlerFunc) + Get(pattern string, h http.HandlerFunc) + Head(pattern string, h http.HandlerFunc) + Options(pattern string, h http.HandlerFunc) + Patch(pattern string, h http.HandlerFunc) + Post(pattern string, h http.HandlerFunc) + Put(pattern string, h http.HandlerFunc) + Trace(pattern string, h http.HandlerFunc) + + // NotFound defines a handler to respond whenever a route could + // not be found. + NotFound(h http.HandlerFunc) + + // MethodNotAllowed defines a handler to respond whenever a method is + // not allowed. + MethodNotAllowed(h http.HandlerFunc) +} + +// Routes interface adds two methods for router traversal, which is also +// used by the `docgen` subpackage to generation documentation for Routers. +type Routes interface { + // Routes returns the routing tree in an easily traversable structure. + Routes() []Route + + // Middlewares returns the list of middlewares in use by the router. + Middlewares() Middlewares + + // Match searches the routing tree for a handler that matches + // the method/path - similar to routing a http request, but without + // executing the handler thereafter. + Match(rctx *Context, method, path string) bool +} +``` + +Each routing method accepts a URL `pattern` and chain of `handlers`. The URL pattern +supports named params (ie. `/users/{userID}`) and wildcards (ie. `/admin/*`). URL parameters +can be fetched at runtime by calling `chi.URLParam(r, "userID")` for named parameters +and `chi.URLParam(r, "*")` for a wildcard parameter. + + +### Middleware handlers + +chi's middlewares are just stdlib net/http middleware handlers. There is nothing special +about them, which means the router and all the tooling is designed to be compatible and +friendly with any middleware in the community. This offers much better extensibility and reuse +of packages and is at the heart of chi's purpose. + +Here is an example of a standard net/http middleware handler using the new request context +available in Go 1.7+. This middleware sets a hypothetical user identifier on the request +context and calls the next handler in the chain. + +```go +// HTTP middleware setting a value on the request context +func MyMiddleware(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ctx := context.WithValue(r.Context(), "user", "123") + next.ServeHTTP(w, r.WithContext(ctx)) + }) +} +``` + + +### Request handlers + +chi uses standard net/http request handlers. This little snippet is an example of a http.Handler +func that reads a user identifier from the request context - hypothetically, identifying +the user sending an authenticated request, validated+set by a previous middleware handler. + +```go +// HTTP handler accessing data from the request context. +func MyRequestHandler(w http.ResponseWriter, r *http.Request) { + user := r.Context().Value("user").(string) + w.Write([]byte(fmt.Sprintf("hi %s", user))) +} +``` + + +### URL parameters + +chi's router parses and stores URL parameters right onto the request context. Here is +an example of how to access URL params in your net/http handlers. And of course, middlewares +are able to access the same information. + +```go +// HTTP handler accessing the url routing parameters. +func MyRequestHandler(w http.ResponseWriter, r *http.Request) { + userID := chi.URLParam(r, "userID") // from a route like /users/{userID} + + ctx := r.Context() + key := ctx.Value("key").(string) + + w.Write([]byte(fmt.Sprintf("hi %v, %v", userID, key))) +} +``` + + +## Middlewares + +chi comes equipped with an optional `middleware` package, providing a suite of standard +`net/http` middlewares. Please note, any middleware in the ecosystem that is also compatible +with `net/http` can be used with chi's mux. + +### Core middlewares + +----------------------------------------------------------------------------------------------------------- +| chi/middleware Handler | description | +|:----------------------|:--------------------------------------------------------------------------------- +| AllowContentType | Explicit whitelist of accepted request Content-Types | +| Compress | Gzip compression for clients that accept compressed responses | +| GetHead | Automatically route undefined HEAD requests to GET handlers | +| Heartbeat | Monitoring endpoint to check the servers pulse | +| Logger | Logs the start and end of each request with the elapsed processing time | +| NoCache | Sets response headers to prevent clients from caching | +| Profiler | Easily attach net/http/pprof to your routers | +| RealIP | Sets a http.Request's RemoteAddr to either X-Forwarded-For or X-Real-IP | +| Recoverer | Gracefully absorb panics and prints the stack trace | +| RequestID | Injects a request ID into the context of each request | +| RedirectSlashes | Redirect slashes on routing paths | +| SetHeader | Short-hand middleware to set a response header key/value | +| StripSlashes | Strip slashes on routing paths | +| Throttle | Puts a ceiling on the number of concurrent requests | +| Timeout | Signals to the request context when the timeout deadline is reached | +| URLFormat | Parse extension from url and put it on request context | +| WithValue | Short-hand middleware to set a key/value on the request context | +----------------------------------------------------------------------------------------------------------- + +### Auxiliary middlewares & packages + +Please see https://github.com/go-chi for additional packages. + +-------------------------------------------------------------------------------------------------------------------- +| package | description | +|:---------------------------------------------------|:------------------------------------------------------------- +| [cors](https://github.com/go-chi/cors) | Cross-origin resource sharing (CORS) | +| [jwtauth](https://github.com/go-chi/jwtauth) | JWT authentication | +| [hostrouter](https://github.com/go-chi/hostrouter) | Domain/host based request routing | +| [httpcoala](https://github.com/go-chi/httpcoala) | HTTP request coalescer | +| [chi-authz](https://github.com/casbin/chi-authz) | Request ACL via https://github.com/hsluoyz/casbin | +| [phi](https://github.com/fate-lovely/phi) | Port chi to [fasthttp](https://github.com/valyala/fasthttp) | +-------------------------------------------------------------------------------------------------------------------- + +please [submit a PR](./CONTRIBUTING.md) if you'd like to include a link to a chi-compatible middleware + + +## context? + +`context` is a tiny pkg that provides simple interface to signal context across call stacks +and goroutines. It was originally written by [Sameer Ajmani](https://github.com/Sajmani) +and is available in stdlib since go1.7. + +Learn more at https://blog.golang.org/context + +and.. +* Docs: https://golang.org/pkg/context +* Source: https://github.com/golang/go/tree/master/src/context + + +## Benchmarks + +The benchmark suite: https://github.com/pkieltyka/go-http-routing-benchmark + +Results as of Aug 31, 2017 on Go 1.9.0 + +```shell +BenchmarkChi_Param 3000000 607 ns/op 432 B/op 3 allocs/op +BenchmarkChi_Param5 2000000 935 ns/op 432 B/op 3 allocs/op +BenchmarkChi_Param20 1000000 1944 ns/op 432 B/op 3 allocs/op +BenchmarkChi_ParamWrite 2000000 664 ns/op 432 B/op 3 allocs/op +BenchmarkChi_GithubStatic 2000000 627 ns/op 432 B/op 3 allocs/op +BenchmarkChi_GithubParam 2000000 847 ns/op 432 B/op 3 allocs/op +BenchmarkChi_GithubAll 10000 175556 ns/op 87700 B/op 609 allocs/op +BenchmarkChi_GPlusStatic 3000000 566 ns/op 432 B/op 3 allocs/op +BenchmarkChi_GPlusParam 2000000 652 ns/op 432 B/op 3 allocs/op +BenchmarkChi_GPlus2Params 2000000 767 ns/op 432 B/op 3 allocs/op +BenchmarkChi_GPlusAll 200000 9794 ns/op 5616 B/op 39 allocs/op +BenchmarkChi_ParseStatic 3000000 590 ns/op 432 B/op 3 allocs/op +BenchmarkChi_ParseParam 2000000 656 ns/op 432 B/op 3 allocs/op +BenchmarkChi_Parse2Params 2000000 715 ns/op 432 B/op 3 allocs/op +BenchmarkChi_ParseAll 100000 18045 ns/op 11232 B/op 78 allocs/op +BenchmarkChi_StaticAll 10000 108871 ns/op 67827 B/op 471 allocs/op +``` + +Comparison with other routers: https://gist.github.com/pkieltyka/c089f309abeb179cfc4deaa519956d8c + +NOTE: the allocs in the benchmark above are from the calls to http.Request's +`WithContext(context.Context)` method that clones the http.Request, sets the `Context()` +on the duplicated (alloc'd) request and returns it the new request object. This is just +how setting context on a request in Go 1.7+ works. + + +## Credits + +* Carl Jackson for https://github.com/zenazn/goji + * Parts of chi's thinking comes from goji, and chi's middleware package + sources from goji. +* Armon Dadgar for https://github.com/armon/go-radix +* Contributions: [@VojtechVitek](https://github.com/VojtechVitek) + +We'll be more than happy to see [your contributions](./CONTRIBUTING.md)! + + +## Beyond REST + +chi is just a http router that lets you decompose request handling into many smaller layers. +Many companies including Pressly.com (of course) use chi to write REST services for their public +APIs. But, REST is just a convention for managing state via HTTP, and there's a lot of other pieces +required to write a complete client-server system or network of microservices. + +Looking ahead beyond REST, I also recommend some newer works in the field coming from +[gRPC](https://github.com/grpc/grpc-go), [NATS](https://nats.io), [go-kit](https://github.com/go-kit/kit) +and even [graphql](https://github.com/graphql-go/graphql). They're all pretty cool with their +own unique approaches and benefits. Specifically, I'd look at gRPC since it makes client-server +communication feel like a single program on a single computer, no need to hand-write a client library +and the request/response payloads are typed contracts. NATS is pretty amazing too as a super +fast and lightweight pub-sub transport that can speak protobufs, with nice service discovery - +an excellent combination with gRPC. + + +## License + +Copyright (c) 2015-present [Peter Kieltyka](https://github.com/pkieltyka) + +Licensed under [MIT License](./LICENSE) + +[GoDoc]: https://godoc.org/github.com/go-chi/chi +[GoDoc Widget]: https://godoc.org/github.com/go-chi/chi?status.svg +[Travis]: https://travis-ci.org/go-chi/chi +[Travis Widget]: https://travis-ci.org/go-chi/chi.svg?branch=master diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/chain.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/chain.go new file mode 100644 index 0000000000000000000000000000000000000000..88e684613864bc96274416c0d14bbe9bb6bb6b37 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/chain.go @@ -0,0 +1,49 @@ +package chi + +import "net/http" + +// Chain returns a Middlewares type from a slice of middleware handlers. +func Chain(middlewares ...func(http.Handler) http.Handler) Middlewares { + return Middlewares(middlewares) +} + +// Handler builds and returns a http.Handler from the chain of middlewares, +// with `h http.Handler` as the final handler. +func (mws Middlewares) Handler(h http.Handler) http.Handler { + return &ChainHandler{mws, h, chain(mws, h)} +} + +// HandlerFunc builds and returns a http.Handler from the chain of middlewares, +// with `h http.Handler` as the final handler. +func (mws Middlewares) HandlerFunc(h http.HandlerFunc) http.Handler { + return &ChainHandler{mws, h, chain(mws, h)} +} + +// ChainHandler is a http.Handler with support for handler composition and +// execution. +type ChainHandler struct { + Middlewares Middlewares + Endpoint http.Handler + chain http.Handler +} + +func (c *ChainHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + c.chain.ServeHTTP(w, r) +} + +// chain builds a http.Handler composed of an inline middleware stack and endpoint +// handler in the order they are passed. +func chain(middlewares []func(http.Handler) http.Handler, endpoint http.Handler) http.Handler { + // Return ahead of time if there aren't any middlewares for the chain + if len(middlewares) == 0 { + return endpoint + } + + // Wrap the end handler with the middleware chain + h := middlewares[len(middlewares)-1](endpoint) + for i := len(middlewares) - 2; i >= 0; i-- { + h = middlewares[i](h) + } + + return h +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/chi.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/chi.go new file mode 100644 index 0000000000000000000000000000000000000000..9962229d0fdfdc72bab4f443370f0cca5f6b0102 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/chi.go @@ -0,0 +1,134 @@ +// +// Package chi is a small, idiomatic and composable router for building HTTP services. +// +// chi requires Go 1.7 or newer. +// +// Example: +// package main +// +// import ( +// "net/http" +// +// "github.com/go-chi/chi" +// "github.com/go-chi/chi/middleware" +// ) +// +// func main() { +// r := chi.NewRouter() +// r.Use(middleware.Logger) +// r.Use(middleware.Recoverer) +// +// r.Get("/", func(w http.ResponseWriter, r *http.Request) { +// w.Write([]byte("root.")) +// }) +// +// http.ListenAndServe(":3333", r) +// } +// +// See github.com/go-chi/chi/_examples/ for more in-depth examples. +// +// URL patterns allow for easy matching of path components in HTTP +// requests. The matching components can then be accessed using +// chi.URLParam(). All patterns must begin with a slash. +// +// A simple named placeholder {name} matches any sequence of characters +// up to the next / or the end of the URL. Trailing slashes on paths must +// be handled explicitly. +// +// A placeholder with a name followed by a colon allows a regular +// expression match, for example {number:\\d+}. The regular expression +// syntax is Go's normal regexp RE2 syntax, except that regular expressions +// including { or } are not supported, and / will never be +// matched. An anonymous regexp pattern is allowed, using an empty string +// before the colon in the placeholder, such as {:\\d+} +// +// The special placeholder of asterisk matches the rest of the requested +// URL. Any trailing characters in the pattern are ignored. This is the only +// placeholder which will match / characters. +// +// Examples: +// "/user/{name}" matches "/user/jsmith" but not "/user/jsmith/info" or "/user/jsmith/" +// "/user/{name}/info" matches "/user/jsmith/info" +// "/page/*" matches "/page/intro/latest" +// "/page/*/index" also matches "/page/intro/latest" +// "/date/{yyyy:\\d\\d\\d\\d}/{mm:\\d\\d}/{dd:\\d\\d}" matches "/date/2017/04/01" +// +package chi + +import "net/http" + +// NewRouter returns a new Mux object that implements the Router interface. +func NewRouter() *Mux { + return NewMux() +} + +// Router consisting of the core routing methods used by chi's Mux, +// using only the standard net/http. +type Router interface { + http.Handler + Routes + + // Use appends one of more middlewares onto the Router stack. + Use(middlewares ...func(http.Handler) http.Handler) + + // With adds inline middlewares for an endpoint handler. + With(middlewares ...func(http.Handler) http.Handler) Router + + // Group adds a new inline-Router along the current routing + // path, with a fresh middleware stack for the inline-Router. + Group(fn func(r Router)) Router + + // Route mounts a sub-Router along a `pattern`` string. + Route(pattern string, fn func(r Router)) Router + + // Mount attaches another http.Handler along ./pattern/* + Mount(pattern string, h http.Handler) + + // Handle and HandleFunc adds routes for `pattern` that matches + // all HTTP methods. + Handle(pattern string, h http.Handler) + HandleFunc(pattern string, h http.HandlerFunc) + + // Method and MethodFunc adds routes for `pattern` that matches + // the `method` HTTP method. + Method(method, pattern string, h http.Handler) + MethodFunc(method, pattern string, h http.HandlerFunc) + + // HTTP-method routing along `pattern` + Connect(pattern string, h http.HandlerFunc) + Delete(pattern string, h http.HandlerFunc) + Get(pattern string, h http.HandlerFunc) + Head(pattern string, h http.HandlerFunc) + Options(pattern string, h http.HandlerFunc) + Patch(pattern string, h http.HandlerFunc) + Post(pattern string, h http.HandlerFunc) + Put(pattern string, h http.HandlerFunc) + Trace(pattern string, h http.HandlerFunc) + + // NotFound defines a handler to respond whenever a route could + // not be found. + NotFound(h http.HandlerFunc) + + // MethodNotAllowed defines a handler to respond whenever a method is + // not allowed. + MethodNotAllowed(h http.HandlerFunc) +} + +// Routes interface adds two methods for router traversal, which is also +// used by the `docgen` subpackage to generation documentation for Routers. +type Routes interface { + // Routes returns the routing tree in an easily traversable structure. + Routes() []Route + + // Middlewares returns the list of middlewares in use by the router. + Middlewares() Middlewares + + // Match searches the routing tree for a handler that matches + // the method/path - similar to routing a http request, but without + // executing the handler thereafter. + Match(rctx *Context, method, path string) bool +} + +// Middlewares type is a slice of standard middleware handlers with methods +// to compose middleware chains and http.Handler's. +type Middlewares []func(http.Handler) http.Handler diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/context.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/context.go new file mode 100644 index 0000000000000000000000000000000000000000..30c5afed9c24cb0ef95bbe4c09e8e6666c437983 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/context.go @@ -0,0 +1,161 @@ +package chi + +import ( + "context" + "net" + "net/http" + "strings" +) + +var ( + // RouteCtxKey is the context.Context key to store the request context. + RouteCtxKey = &contextKey{"RouteContext"} +) + +// Context is the default routing context set on the root node of a +// request context to track route patterns, URL parameters and +// an optional routing path. +type Context struct { + Routes Routes + + // Routing path/method override used during the route search. + // See Mux#routeHTTP method. + RoutePath string + RouteMethod string + + // Routing pattern stack throughout the lifecycle of the request, + // across all connected routers. It is a record of all matching + // patterns across a stack of sub-routers. + RoutePatterns []string + + // URLParams are the stack of routeParams captured during the + // routing lifecycle across a stack of sub-routers. + URLParams RouteParams + + // The endpoint routing pattern that matched the request URI path + // or `RoutePath` of the current sub-router. This value will update + // during the lifecycle of a request passing through a stack of + // sub-routers. + routePattern string + + // Route parameters matched for the current sub-router. It is + // intentionally unexported so it cant be tampered. + routeParams RouteParams + + // methodNotAllowed hint + methodNotAllowed bool +} + +// NewRouteContext returns a new routing Context object. +func NewRouteContext() *Context { + return &Context{} +} + +// Reset a routing context to its initial state. +func (x *Context) Reset() { + x.Routes = nil + x.RoutePath = "" + x.RouteMethod = "" + x.RoutePatterns = x.RoutePatterns[:0] + x.URLParams.Keys = x.URLParams.Keys[:0] + x.URLParams.Values = x.URLParams.Values[:0] + + x.routePattern = "" + x.routeParams.Keys = x.routeParams.Keys[:0] + x.routeParams.Values = x.routeParams.Values[:0] + x.methodNotAllowed = false +} + +// URLParam returns the corresponding URL parameter value from the request +// routing context. +func (x *Context) URLParam(key string) string { + for k := len(x.URLParams.Keys) - 1; k >= 0; k-- { + if x.URLParams.Keys[k] == key { + return x.URLParams.Values[k] + } + } + return "" +} + +// RoutePattern builds the routing pattern string for the particular +// request, at the particular point during routing. This means, the value +// will change throughout the execution of a request in a router. That is +// why its advised to only use this value after calling the next handler. +// +// For example, +// +// func Instrument(next http.Handler) http.Handler { +// return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { +// next.ServeHTTP(w, r) +// routePattern := chi.RouteContext(r.Context()).RoutePattern() +// measure(w, r, routePattern) +// }) +// } +func (x *Context) RoutePattern() string { + routePattern := strings.Join(x.RoutePatterns, "") + return strings.Replace(routePattern, "/*/", "/", -1) +} + +// RouteContext returns chi's routing Context object from a +// http.Request Context. +func RouteContext(ctx context.Context) *Context { + return ctx.Value(RouteCtxKey).(*Context) +} + +// URLParam returns the url parameter from a http.Request object. +func URLParam(r *http.Request, key string) string { + if rctx := RouteContext(r.Context()); rctx != nil { + return rctx.URLParam(key) + } + return "" +} + +// URLParamFromCtx returns the url parameter from a http.Request Context. +func URLParamFromCtx(ctx context.Context, key string) string { + if rctx := RouteContext(ctx); rctx != nil { + return rctx.URLParam(key) + } + return "" +} + +// RouteParams is a structure to track URL routing parameters efficiently. +type RouteParams struct { + Keys, Values []string +} + +// Add will append a URL parameter to the end of the route param +func (s *RouteParams) Add(key, value string) { + (*s).Keys = append((*s).Keys, key) + (*s).Values = append((*s).Values, value) +} + +// ServerBaseContext wraps an http.Handler to set the request context to the +// `baseCtx`. +func ServerBaseContext(baseCtx context.Context, h http.Handler) http.Handler { + fn := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + baseCtx := baseCtx + + // Copy over default net/http server context keys + if v, ok := ctx.Value(http.ServerContextKey).(*http.Server); ok { + baseCtx = context.WithValue(baseCtx, http.ServerContextKey, v) + } + if v, ok := ctx.Value(http.LocalAddrContextKey).(net.Addr); ok { + baseCtx = context.WithValue(baseCtx, http.LocalAddrContextKey, v) + } + + h.ServeHTTP(w, r.WithContext(baseCtx)) + }) + return fn +} + +// contextKey is a value for use with context.WithValue. It's used as +// a pointer so it fits in an interface{} without allocation. This technique +// for defining context keys was copied from Go 1.7's new use of context in net/http. +type contextKey struct { + name string +} + +func (k *contextKey) String() string { + return "chi context value " + k.name +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/closenotify17.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/closenotify17.go new file mode 100644 index 0000000000000000000000000000000000000000..95802b13ea77c78d7c70bea10af24efa54abdcfc --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/closenotify17.go @@ -0,0 +1,42 @@ +// +build go1.7,!go1.8 + +package middleware + +import ( + "context" + "net/http" +) + +// CloseNotify is a middleware that cancels ctx when the underlying +// connection has gone away. It can be used to cancel long operations +// on the server when the client disconnects before the response is ready. +// +// Note: this behaviour is standard in Go 1.8+, so the middleware does nothing +// on 1.8+ and exists just for backwards compatibility. +func CloseNotify(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + cn, ok := w.(http.CloseNotifier) + if !ok { + panic("chi/middleware: CloseNotify expects http.ResponseWriter to implement http.CloseNotifier interface") + } + closeNotifyCh := cn.CloseNotify() + + ctx, cancel := context.WithCancel(r.Context()) + defer cancel() + + go func() { + select { + case <-ctx.Done(): + return + case <-closeNotifyCh: + cancel() + return + } + }() + + r = r.WithContext(ctx) + next.ServeHTTP(w, r) + } + + return http.HandlerFunc(fn) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/closenotify18.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/closenotify18.go new file mode 100644 index 0000000000000000000000000000000000000000..4f0d73cc284ef82fa93c22cd243ad292a8b2e745 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/closenotify18.go @@ -0,0 +1,17 @@ +// +build go1.8 appengine + +package middleware + +import ( + "net/http" +) + +// CloseNotify is a middleware that cancels ctx when the underlying +// connection has gone away. It can be used to cancel long operations +// on the server when the client disconnects before the response is ready. +// +// Note: this behaviour is standard in Go 1.8+, so the middleware does nothing +// on 1.8+ and exists just for backwards compatibility. +func CloseNotify(next http.Handler) http.Handler { + return next +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/compress.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/compress.go new file mode 100644 index 0000000000000000000000000000000000000000..006ad48f4ae831b0ba93abe698275504e94a36d6 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/compress.go @@ -0,0 +1,212 @@ +package middleware + +import ( + "bufio" + "compress/flate" + "compress/gzip" + "errors" + "io" + "net" + "net/http" + "strings" +) + +type encoding int + +const ( + encodingNone encoding = iota + encodingGzip + encodingDeflate +) + +var defaultContentTypes = map[string]struct{}{ + "text/html": struct{}{}, + "text/css": struct{}{}, + "text/plain": struct{}{}, + "text/javascript": struct{}{}, + "application/javascript": struct{}{}, + "application/x-javascript": struct{}{}, + "application/json": struct{}{}, + "application/atom+xml": struct{}{}, + "application/rss+xml": struct{}{}, +} + +// DefaultCompress is a middleware that compresses response +// body of predefined content types to a data format based +// on Accept-Encoding request header. It uses a default +// compression level. +func DefaultCompress(next http.Handler) http.Handler { + return Compress(flate.DefaultCompression)(next) +} + +// Compress is a middleware that compresses response +// body of a given content types to a data format based +// on Accept-Encoding request header. It uses a given +// compression level. +func Compress(level int, types ...string) func(next http.Handler) http.Handler { + contentTypes := defaultContentTypes + if len(types) > 0 { + contentTypes = make(map[string]struct{}, len(types)) + for _, t := range types { + contentTypes[t] = struct{}{} + } + } + + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + mcw := &maybeCompressResponseWriter{ + ResponseWriter: w, + w: w, + contentTypes: contentTypes, + encoding: selectEncoding(r.Header), + level: level, + } + defer mcw.Close() + + next.ServeHTTP(mcw, r) + } + + return http.HandlerFunc(fn) + } +} + +func selectEncoding(h http.Header) encoding { + enc := h.Get("Accept-Encoding") + + switch { + // TODO: + // case "br": // Brotli, experimental. Firefox 2016, to-be-in Chromium. + // case "lzma": // Opera. + // case "sdch": // Chrome, Android. Gzip output + dictionary header. + + case strings.Contains(enc, "gzip"): + // TODO: Exception for old MSIE browsers that can't handle non-HTML? + // https://zoompf.com/blog/2012/02/lose-the-wait-http-compression + return encodingGzip + + case strings.Contains(enc, "deflate"): + // HTTP 1.1 "deflate" (RFC 2616) stands for DEFLATE data (RFC 1951) + // wrapped with zlib (RFC 1950). The zlib wrapper uses Adler-32 + // checksum compared to CRC-32 used in "gzip" and thus is faster. + // + // But.. some old browsers (MSIE, Safari 5.1) incorrectly expect + // raw DEFLATE data only, without the mentioned zlib wrapper. + // Because of this major confusion, most modern browsers try it + // both ways, first looking for zlib headers. + // Quote by Mark Adler: http://stackoverflow.com/a/9186091/385548 + // + // The list of browsers having problems is quite big, see: + // http://zoompf.com/blog/2012/02/lose-the-wait-http-compression + // https://web.archive.org/web/20120321182910/http://www.vervestudios.co/projects/compression-tests/results + // + // That's why we prefer gzip over deflate. It's just more reliable + // and not significantly slower than gzip. + return encodingDeflate + + // NOTE: Not implemented, intentionally: + // case "compress": // LZW. Deprecated. + // case "bzip2": // Too slow on-the-fly. + // case "zopfli": // Too slow on-the-fly. + // case "xz": // Too slow on-the-fly. + } + + return encodingNone +} + +type maybeCompressResponseWriter struct { + http.ResponseWriter + w io.Writer + encoding encoding + contentTypes map[string]struct{} + level int + wroteHeader bool +} + +func (w *maybeCompressResponseWriter) WriteHeader(code int) { + if w.wroteHeader { + return + } + w.wroteHeader = true + defer w.ResponseWriter.WriteHeader(code) + + // Already compressed data? + if w.ResponseWriter.Header().Get("Content-Encoding") != "" { + return + } + // The content-length after compression is unknown + w.ResponseWriter.Header().Del("Content-Length") + + // Parse the first part of the Content-Type response header. + contentType := "" + parts := strings.Split(w.ResponseWriter.Header().Get("Content-Type"), ";") + if len(parts) > 0 { + contentType = parts[0] + } + + // Is the content type compressable? + if _, ok := w.contentTypes[contentType]; !ok { + return + } + + // Select the compress writer. + switch w.encoding { + case encodingGzip: + gw, err := gzip.NewWriterLevel(w.ResponseWriter, w.level) + if err != nil { + w.w = w.ResponseWriter + return + } + w.w = gw + w.ResponseWriter.Header().Set("Content-Encoding", "gzip") + + case encodingDeflate: + dw, err := flate.NewWriter(w.ResponseWriter, w.level) + if err != nil { + w.w = w.ResponseWriter + return + } + w.w = dw + w.ResponseWriter.Header().Set("Content-Encoding", "deflate") + } +} + +func (w *maybeCompressResponseWriter) Write(p []byte) (int, error) { + if !w.wroteHeader { + w.WriteHeader(http.StatusOK) + } + + return w.w.Write(p) +} + +func (w *maybeCompressResponseWriter) Flush() { + if f, ok := w.w.(http.Flusher); ok { + f.Flush() + } +} + +func (w *maybeCompressResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { + if hj, ok := w.w.(http.Hijacker); ok { + return hj.Hijack() + } + return nil, nil, errors.New("chi/middleware: http.Hijacker is unavailable on the writer") +} + +func (w *maybeCompressResponseWriter) CloseNotify() <-chan bool { + if cn, ok := w.w.(http.CloseNotifier); ok { + return cn.CloseNotify() + } + + // If the underlying writer does not implement http.CloseNotifier, return + // a channel that never receives a value. The semantics here is that the + // client never disconnnects before the request is processed by the + // http.Handler, which is close enough to the default behavior (when + // CloseNotify() is not even called). + return make(chan bool, 1) +} + +func (w *maybeCompressResponseWriter) Close() error { + if c, ok := w.w.(io.WriteCloser); ok { + return c.Close() + } + return errors.New("chi/middleware: io.WriteCloser is unavailable on the writer") +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/compress18.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/compress18.go new file mode 100644 index 0000000000000000000000000000000000000000..0048f7d91875c2182579d01c88c3be9956b29914 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/compress18.go @@ -0,0 +1,15 @@ +// +build go1.8 appengine + +package middleware + +import ( + "errors" + "net/http" +) + +func (w *maybeCompressResponseWriter) Push(target string, opts *http.PushOptions) error { + if ps, ok := w.w.(http.Pusher); ok { + return ps.Push(target, opts) + } + return errors.New("chi/middleware: http.Pusher is unavailable on the writer") +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/content_charset.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/content_charset.go new file mode 100644 index 0000000000000000000000000000000000000000..07b5ce6f66f3b1e16474c27f361d452b570a57c3 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/content_charset.go @@ -0,0 +1,51 @@ +package middleware + +import ( + "net/http" + "strings" +) + +// ContentCharset generates a handler that writes a 415 Unsupported Media Type response if none of the charsets match. +// An empty charset will allow requests with no Content-Type header or no specified charset. +func ContentCharset(charsets ...string) func(next http.Handler) http.Handler { + for i, c := range charsets { + charsets[i] = strings.ToLower(c) + } + + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if !contentEncoding(r.Header.Get("Content-Type"), charsets...) { + w.WriteHeader(http.StatusUnsupportedMediaType) + return + } + + next.ServeHTTP(w, r) + }) + } +} + +// Check the content encoding against a list of acceptable values. +func contentEncoding(ce string, charsets ...string) bool { + _, ce = split(strings.ToLower(ce), ";") + _, ce = split(ce, "charset=") + ce, _ = split(ce, ";") + for _, c := range charsets { + if ce == c { + return true + } + } + + return false +} + +// Split a string in two parts, cleaning any whitespace. +func split(str, sep string) (string, string) { + var a, b string + var parts = strings.SplitN(str, sep, 2) + a = strings.TrimSpace(parts[0]) + if len(parts) == 2 { + b = strings.TrimSpace(parts[1]) + } + + return a, b +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/content_type.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/content_type.go new file mode 100644 index 0000000000000000000000000000000000000000..3a2dc20af59af95801c16df8cc35e6e53d1143ae --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/content_type.go @@ -0,0 +1,45 @@ +package middleware + +import ( + "net/http" + "strings" +) + +// SetHeader is a convenience handler to set a response header key/value +func SetHeader(key, value string) func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + w.Header().Set(key, value) + next.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) + } +} + +// AllowContentType enforces a whitelist of request Content-Types otherwise responds +// with a 415 Unsupported Media Type status. +func AllowContentType(contentTypes ...string) func(next http.Handler) http.Handler { + cT := []string{} + for _, t := range contentTypes { + cT = append(cT, strings.ToLower(t)) + } + + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + s := strings.ToLower(strings.TrimSpace(r.Header.Get("Content-Type"))) + if i := strings.Index(s, ";"); i > -1 { + s = s[0:i] + } + + for _, t := range cT { + if t == s { + next.ServeHTTP(w, r) + return + } + } + + w.WriteHeader(http.StatusUnsupportedMediaType) + } + return http.HandlerFunc(fn) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/get_head.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/get_head.go new file mode 100644 index 0000000000000000000000000000000000000000..86068a96db1ffac87dcd824cb9efe0b392a58fa2 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/get_head.go @@ -0,0 +1,39 @@ +package middleware + +import ( + "net/http" + + "github.com/go-chi/chi" +) + +// GetHead automatically route undefined HEAD requests to GET handlers. +func GetHead(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method == "HEAD" { + rctx := chi.RouteContext(r.Context()) + routePath := rctx.RoutePath + if routePath == "" { + if r.URL.RawPath != "" { + routePath = r.URL.RawPath + } else { + routePath = r.URL.Path + } + } + + // Temporary routing context to look-ahead before routing the request + tctx := chi.NewRouteContext() + + // Attempt to find a HEAD handler for the routing path, if not found, traverse + // the router as through its a GET route, but proceed with the request + // with the HEAD method. + if !rctx.Routes.Match(tctx, "HEAD", routePath) { + rctx.RouteMethod = "GET" + rctx.RoutePath = routePath + next.ServeHTTP(w, r) + return + } + } + + next.ServeHTTP(w, r) + }) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/heartbeat.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/heartbeat.go new file mode 100644 index 0000000000000000000000000000000000000000..fe822fb536cb8dbed50f3b66550ea1adda6fb136 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/heartbeat.go @@ -0,0 +1,26 @@ +package middleware + +import ( + "net/http" + "strings" +) + +// Heartbeat endpoint middleware useful to setting up a path like +// `/ping` that load balancers or uptime testing external services +// can make a request before hitting any routes. It's also convenient +// to place this above ACL middlewares as well. +func Heartbeat(endpoint string) func(http.Handler) http.Handler { + f := func(h http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + if r.Method == "GET" && strings.EqualFold(r.URL.Path, endpoint) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + w.Write([]byte(".")) + return + } + h.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) + } + return f +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/logger.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/logger.go new file mode 100644 index 0000000000000000000000000000000000000000..99fac03da1160e14f6a2da0da46fa13ef747944b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/logger.go @@ -0,0 +1,154 @@ +package middleware + +import ( + "bytes" + "context" + "log" + "net/http" + "os" + "time" +) + +var ( + // LogEntryCtxKey is the context.Context key to store the request log entry. + LogEntryCtxKey = &contextKey{"LogEntry"} + + // DefaultLogger is called by the Logger middleware handler to log each request. + // Its made a package-level variable so that it can be reconfigured for custom + // logging configurations. + DefaultLogger = RequestLogger(&DefaultLogFormatter{Logger: log.New(os.Stdout, "", log.LstdFlags)}) +) + +// Logger is a middleware that logs the start and end of each request, along +// with some useful data about what was requested, what the response status was, +// and how long it took to return. When standard output is a TTY, Logger will +// print in color, otherwise it will print in black and white. Logger prints a +// request ID if one is provided. +// +// Alternatively, look at https://github.com/pressly/lg and the `lg.RequestLogger` +// middleware pkg. +func Logger(next http.Handler) http.Handler { + return DefaultLogger(next) +} + +// RequestLogger returns a logger handler using a custom LogFormatter. +func RequestLogger(f LogFormatter) func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + entry := f.NewLogEntry(r) + ww := NewWrapResponseWriter(w, r.ProtoMajor) + + t1 := time.Now() + defer func() { + entry.Write(ww.Status(), ww.BytesWritten(), time.Since(t1)) + }() + + next.ServeHTTP(ww, WithLogEntry(r, entry)) + } + return http.HandlerFunc(fn) + } +} + +// LogFormatter initiates the beginning of a new LogEntry per request. +// See DefaultLogFormatter for an example implementation. +type LogFormatter interface { + NewLogEntry(r *http.Request) LogEntry +} + +// LogEntry records the final log when a request completes. +// See defaultLogEntry for an example implementation. +type LogEntry interface { + Write(status, bytes int, elapsed time.Duration) + Panic(v interface{}, stack []byte) +} + +// GetLogEntry returns the in-context LogEntry for a request. +func GetLogEntry(r *http.Request) LogEntry { + entry, _ := r.Context().Value(LogEntryCtxKey).(LogEntry) + return entry +} + +// WithLogEntry sets the in-context LogEntry for a request. +func WithLogEntry(r *http.Request, entry LogEntry) *http.Request { + r = r.WithContext(context.WithValue(r.Context(), LogEntryCtxKey, entry)) + return r +} + +// LoggerInterface accepts printing to stdlib logger or compatible logger. +type LoggerInterface interface { + Print(v ...interface{}) +} + +// DefaultLogFormatter is a simple logger that implements a LogFormatter. +type DefaultLogFormatter struct { + Logger LoggerInterface +} + +// NewLogEntry creates a new LogEntry for the request. +func (l *DefaultLogFormatter) NewLogEntry(r *http.Request) LogEntry { + entry := &defaultLogEntry{ + DefaultLogFormatter: l, + request: r, + buf: &bytes.Buffer{}, + } + + reqID := GetReqID(r.Context()) + if reqID != "" { + cW(entry.buf, nYellow, "[%s] ", reqID) + } + cW(entry.buf, nCyan, "\"") + cW(entry.buf, bMagenta, "%s ", r.Method) + + scheme := "http" + if r.TLS != nil { + scheme = "https" + } + cW(entry.buf, nCyan, "%s://%s%s %s\" ", scheme, r.Host, r.RequestURI, r.Proto) + + entry.buf.WriteString("from ") + entry.buf.WriteString(r.RemoteAddr) + entry.buf.WriteString(" - ") + + return entry +} + +type defaultLogEntry struct { + *DefaultLogFormatter + request *http.Request + buf *bytes.Buffer +} + +func (l *defaultLogEntry) Write(status, bytes int, elapsed time.Duration) { + switch { + case status < 200: + cW(l.buf, bBlue, "%03d", status) + case status < 300: + cW(l.buf, bGreen, "%03d", status) + case status < 400: + cW(l.buf, bCyan, "%03d", status) + case status < 500: + cW(l.buf, bYellow, "%03d", status) + default: + cW(l.buf, bRed, "%03d", status) + } + + cW(l.buf, bBlue, " %dB", bytes) + + l.buf.WriteString(" in ") + if elapsed < 500*time.Millisecond { + cW(l.buf, nGreen, "%s", elapsed) + } else if elapsed < 5*time.Second { + cW(l.buf, nYellow, "%s", elapsed) + } else { + cW(l.buf, nRed, "%s", elapsed) + } + + l.Logger.Print(l.buf.String()) +} + +func (l *defaultLogEntry) Panic(v interface{}, stack []byte) { + panicEntry := l.NewLogEntry(l.request).(*defaultLogEntry) + cW(panicEntry.buf, bRed, "panic: %+v", v) + l.Logger.Print(panicEntry.buf.String()) + l.Logger.Print(string(stack)) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/middleware.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/middleware.go new file mode 100644 index 0000000000000000000000000000000000000000..be6a44fadd7389b93708522e3b2d9d2fd817754f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/middleware.go @@ -0,0 +1,12 @@ +package middleware + +// contextKey is a value for use with context.WithValue. It's used as +// a pointer so it fits in an interface{} without allocation. This technique +// for defining context keys was copied from Go 1.7's new use of context in net/http. +type contextKey struct { + name string +} + +func (k *contextKey) String() string { + return "chi/middleware context value " + k.name +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/nocache.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/nocache.go new file mode 100644 index 0000000000000000000000000000000000000000..e5819dddce41553d37bbeb5463986069be443e63 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/nocache.go @@ -0,0 +1,58 @@ +package middleware + +// Ported from Goji's middleware, source: +// https://github.com/zenazn/goji/tree/master/web/middleware + +import ( + "net/http" + "time" +) + +// Unix epoch time +var epoch = time.Unix(0, 0).Format(time.RFC1123) + +// Taken from https://github.com/mytrile/nocache +var noCacheHeaders = map[string]string{ + "Expires": epoch, + "Cache-Control": "no-cache, no-store, must-revalidate, private, max-age=0", + "Pragma": "no-cache", + "X-Accel-Expires": "0", +} + +var etagHeaders = []string{ + "ETag", + "If-Modified-Since", + "If-Match", + "If-None-Match", + "If-Range", + "If-Unmodified-Since", +} + +// NoCache is a simple piece of middleware that sets a number of HTTP headers to prevent +// a router (or subrouter) from being cached by an upstream proxy and/or client. +// +// As per http://wiki.nginx.org/HttpProxyModule - NoCache sets: +// Expires: Thu, 01 Jan 1970 00:00:00 UTC +// Cache-Control: no-cache, private, max-age=0 +// X-Accel-Expires: 0 +// Pragma: no-cache (for HTTP/1.0 proxies/clients) +func NoCache(h http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + + // Delete any ETag headers that may have been set + for _, v := range etagHeaders { + if r.Header.Get(v) != "" { + r.Header.Del(v) + } + } + + // Set our NoCache headers + for k, v := range noCacheHeaders { + w.Header().Set(k, v) + } + + h.ServeHTTP(w, r) + } + + return http.HandlerFunc(fn) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/profiler.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/profiler.go new file mode 100644 index 0000000000000000000000000000000000000000..1d44b8259aa327588fed020bd87d882161fd2e5b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/profiler.go @@ -0,0 +1,55 @@ +package middleware + +import ( + "expvar" + "fmt" + "net/http" + "net/http/pprof" + + "github.com/go-chi/chi" +) + +// Profiler is a convenient subrouter used for mounting net/http/pprof. ie. +// +// func MyService() http.Handler { +// r := chi.NewRouter() +// // ..middlewares +// r.Mount("/debug", middleware.Profiler()) +// // ..routes +// return r +// } +func Profiler() http.Handler { + r := chi.NewRouter() + r.Use(NoCache) + + r.Get("/", func(w http.ResponseWriter, r *http.Request) { + http.Redirect(w, r, r.RequestURI+"/pprof/", 301) + }) + r.HandleFunc("/pprof", func(w http.ResponseWriter, r *http.Request) { + http.Redirect(w, r, r.RequestURI+"/", 301) + }) + + r.HandleFunc("/pprof/*", pprof.Index) + r.HandleFunc("/pprof/cmdline", pprof.Cmdline) + r.HandleFunc("/pprof/profile", pprof.Profile) + r.HandleFunc("/pprof/symbol", pprof.Symbol) + r.HandleFunc("/pprof/trace", pprof.Trace) + r.HandleFunc("/vars", expVars) + + return r +} + +// Replicated from expvar.go as not public. +func expVars(w http.ResponseWriter, r *http.Request) { + first := true + w.Header().Set("Content-Type", "application/json") + fmt.Fprintf(w, "{\n") + expvar.Do(func(kv expvar.KeyValue) { + if !first { + fmt.Fprintf(w, ",\n") + } + first = false + fmt.Fprintf(w, "%q: %s", kv.Key, kv.Value) + }) + fmt.Fprintf(w, "\n}\n") +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/realip.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/realip.go new file mode 100644 index 0000000000000000000000000000000000000000..e9addbe3aafd63b6f05d14740d7c4327c9d74881 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/realip.go @@ -0,0 +1,54 @@ +package middleware + +// Ported from Goji's middleware, source: +// https://github.com/zenazn/goji/tree/master/web/middleware + +import ( + "net/http" + "strings" +) + +var xForwardedFor = http.CanonicalHeaderKey("X-Forwarded-For") +var xRealIP = http.CanonicalHeaderKey("X-Real-IP") + +// RealIP is a middleware that sets a http.Request's RemoteAddr to the results +// of parsing either the X-Forwarded-For header or the X-Real-IP header (in that +// order). +// +// This middleware should be inserted fairly early in the middleware stack to +// ensure that subsequent layers (e.g., request loggers) which examine the +// RemoteAddr will see the intended value. +// +// You should only use this middleware if you can trust the headers passed to +// you (in particular, the two headers this middleware uses), for example +// because you have placed a reverse proxy like HAProxy or nginx in front of +// Goji. If your reverse proxies are configured to pass along arbitrary header +// values from the client, or if you use this middleware without a reverse +// proxy, malicious clients will be able to make you very sad (or, depending on +// how you're using RemoteAddr, vulnerable to an attack of some sort). +func RealIP(h http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + if rip := realIP(r); rip != "" { + r.RemoteAddr = rip + } + h.ServeHTTP(w, r) + } + + return http.HandlerFunc(fn) +} + +func realIP(r *http.Request) string { + var ip string + + if xff := r.Header.Get(xForwardedFor); xff != "" { + i := strings.Index(xff, ", ") + if i == -1 { + i = len(xff) + } + ip = xff[:i] + } else if xrip := r.Header.Get(xRealIP); xrip != "" { + ip = xrip + } + + return ip +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/recoverer.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/recoverer.go new file mode 100644 index 0000000000000000000000000000000000000000..57fc3eb9da3dad94fc359d838881ff7f1686c8cd --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/recoverer.go @@ -0,0 +1,39 @@ +package middleware + +// The original work was derived from Goji's middleware, source: +// https://github.com/zenazn/goji/tree/master/web/middleware + +import ( + "fmt" + "net/http" + "os" + "runtime/debug" +) + +// Recoverer is a middleware that recovers from panics, logs the panic (and a +// backtrace), and returns a HTTP 500 (Internal Server Error) status if +// possible. Recoverer prints a request ID if one is provided. +// +// Alternatively, look at https://github.com/pressly/lg middleware pkgs. +func Recoverer(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + defer func() { + if rvr := recover(); rvr != nil { + + logEntry := GetLogEntry(r) + if logEntry != nil { + logEntry.Panic(rvr, debug.Stack()) + } else { + fmt.Fprintf(os.Stderr, "Panic: %+v\n", rvr) + debug.PrintStack() + } + + http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) + } + }() + + next.ServeHTTP(w, r) + } + + return http.HandlerFunc(fn) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/request_id.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/request_id.go new file mode 100644 index 0000000000000000000000000000000000000000..4574bde80928b3d202bc314f324180080ca02c65 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/request_id.go @@ -0,0 +1,88 @@ +package middleware + +// Ported from Goji's middleware, source: +// https://github.com/zenazn/goji/tree/master/web/middleware + +import ( + "context" + "crypto/rand" + "encoding/base64" + "fmt" + "net/http" + "os" + "strings" + "sync/atomic" +) + +// Key to use when setting the request ID. +type ctxKeyRequestID int + +// RequestIDKey is the key that holds th unique request ID in a request context. +const RequestIDKey ctxKeyRequestID = 0 + +var prefix string +var reqid uint64 + +// A quick note on the statistics here: we're trying to calculate the chance that +// two randomly generated base62 prefixes will collide. We use the formula from +// http://en.wikipedia.org/wiki/Birthday_problem +// +// P[m, n] \approx 1 - e^{-m^2/2n} +// +// We ballpark an upper bound for $m$ by imagining (for whatever reason) a server +// that restarts every second over 10 years, for $m = 86400 * 365 * 10 = 315360000$ +// +// For a $k$ character base-62 identifier, we have $n(k) = 62^k$ +// +// Plugging this in, we find $P[m, n(10)] \approx 5.75%$, which is good enough for +// our purposes, and is surely more than anyone would ever need in practice -- a +// process that is rebooted a handful of times a day for a hundred years has less +// than a millionth of a percent chance of generating two colliding IDs. + +func init() { + hostname, err := os.Hostname() + if hostname == "" || err != nil { + hostname = "localhost" + } + var buf [12]byte + var b64 string + for len(b64) < 10 { + rand.Read(buf[:]) + b64 = base64.StdEncoding.EncodeToString(buf[:]) + b64 = strings.NewReplacer("+", "", "/", "").Replace(b64) + } + + prefix = fmt.Sprintf("%s/%s", hostname, b64[0:10]) +} + +// RequestID is a middleware that injects a request ID into the context of each +// request. A request ID is a string of the form "host.example.com/random-0001", +// where "random" is a base62 random string that uniquely identifies this go +// process, and where the last number is an atomically incremented request +// counter. +func RequestID(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + myid := atomic.AddUint64(&reqid, 1) + ctx := r.Context() + ctx = context.WithValue(ctx, RequestIDKey, fmt.Sprintf("%s-%06d", prefix, myid)) + next.ServeHTTP(w, r.WithContext(ctx)) + } + return http.HandlerFunc(fn) +} + +// GetReqID returns a request ID from the given context if one is present. +// Returns the empty string if a request ID cannot be found. +func GetReqID(ctx context.Context) string { + if ctx == nil { + return "" + } + if reqID, ok := ctx.Value(RequestIDKey).(string); ok { + return reqID + } + return "" +} + +// NextRequestID generates the next request ID in the sequence. +func NextRequestID() uint64 { + return atomic.AddUint64(&reqid, 1) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/strip.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/strip.go new file mode 100644 index 0000000000000000000000000000000000000000..8f19766b147d9886fa1c35ff5e8bf7a7c4a8be8e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/strip.go @@ -0,0 +1,48 @@ +package middleware + +import ( + "net/http" + + "github.com/go-chi/chi" +) + +// StripSlashes is a middleware that will match request paths with a trailing +// slash, strip it from the path and continue routing through the mux, if a route +// matches, then it will serve the handler. +func StripSlashes(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + var path string + rctx := chi.RouteContext(r.Context()) + if rctx.RoutePath != "" { + path = rctx.RoutePath + } else { + path = r.URL.Path + } + if len(path) > 1 && path[len(path)-1] == '/' { + rctx.RoutePath = path[:len(path)-1] + } + next.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) +} + +// RedirectSlashes is a middleware that will match request paths with a trailing +// slash and redirect to the same path, less the trailing slash. +func RedirectSlashes(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + var path string + rctx := chi.RouteContext(r.Context()) + if rctx.RoutePath != "" { + path = rctx.RoutePath + } else { + path = r.URL.Path + } + if len(path) > 1 && path[len(path)-1] == '/' { + path = path[:len(path)-1] + http.Redirect(w, r, path, 301) + return + } + next.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/terminal.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/terminal.go new file mode 100644 index 0000000000000000000000000000000000000000..79930a25abac87ef0295b9b4ba2eca9478ea8eff --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/terminal.go @@ -0,0 +1,63 @@ +package middleware + +// Ported from Goji's middleware, source: +// https://github.com/zenazn/goji/tree/master/web/middleware + +import ( + "fmt" + "io" + "os" +) + +var ( + // Normal colors + nBlack = []byte{'\033', '[', '3', '0', 'm'} + nRed = []byte{'\033', '[', '3', '1', 'm'} + nGreen = []byte{'\033', '[', '3', '2', 'm'} + nYellow = []byte{'\033', '[', '3', '3', 'm'} + nBlue = []byte{'\033', '[', '3', '4', 'm'} + nMagenta = []byte{'\033', '[', '3', '5', 'm'} + nCyan = []byte{'\033', '[', '3', '6', 'm'} + nWhite = []byte{'\033', '[', '3', '7', 'm'} + // Bright colors + bBlack = []byte{'\033', '[', '3', '0', ';', '1', 'm'} + bRed = []byte{'\033', '[', '3', '1', ';', '1', 'm'} + bGreen = []byte{'\033', '[', '3', '2', ';', '1', 'm'} + bYellow = []byte{'\033', '[', '3', '3', ';', '1', 'm'} + bBlue = []byte{'\033', '[', '3', '4', ';', '1', 'm'} + bMagenta = []byte{'\033', '[', '3', '5', ';', '1', 'm'} + bCyan = []byte{'\033', '[', '3', '6', ';', '1', 'm'} + bWhite = []byte{'\033', '[', '3', '7', ';', '1', 'm'} + + reset = []byte{'\033', '[', '0', 'm'} +) + +var isTTY bool + +func init() { + // This is sort of cheating: if stdout is a character device, we assume + // that means it's a TTY. Unfortunately, there are many non-TTY + // character devices, but fortunately stdout is rarely set to any of + // them. + // + // We could solve this properly by pulling in a dependency on + // code.google.com/p/go.crypto/ssh/terminal, for instance, but as a + // heuristic for whether to print in color or in black-and-white, I'd + // really rather not. + fi, err := os.Stdout.Stat() + if err == nil { + m := os.ModeDevice | os.ModeCharDevice + isTTY = fi.Mode()&m == m + } +} + +// colorWrite +func cW(w io.Writer, color []byte, s string, args ...interface{}) { + if isTTY { + w.Write(color) + } + fmt.Fprintf(w, s, args...) + if isTTY { + w.Write(reset) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/throttle.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/throttle.go new file mode 100644 index 0000000000000000000000000000000000000000..d935e2ce646be1118bafe0d2325b09e12f6104db --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/throttle.go @@ -0,0 +1,101 @@ +package middleware + +import ( + "net/http" + "time" +) + +const ( + errCapacityExceeded = "Server capacity exceeded." + errTimedOut = "Timed out while waiting for a pending request to complete." + errContextCanceled = "Context was canceled." +) + +var ( + defaultBacklogTimeout = time.Second * 60 +) + +// Throttle is a middleware that limits number of currently processed requests +// at a time. +func Throttle(limit int) func(http.Handler) http.Handler { + return ThrottleBacklog(limit, 0, defaultBacklogTimeout) +} + +// ThrottleBacklog is a middleware that limits number of currently processed +// requests at a time and provides a backlog for holding a finite number of +// pending requests. +func ThrottleBacklog(limit int, backlogLimit int, backlogTimeout time.Duration) func(http.Handler) http.Handler { + if limit < 1 { + panic("chi/middleware: Throttle expects limit > 0") + } + + if backlogLimit < 0 { + panic("chi/middleware: Throttle expects backlogLimit to be positive") + } + + t := throttler{ + tokens: make(chan token, limit), + backlogTokens: make(chan token, limit+backlogLimit), + backlogTimeout: backlogTimeout, + } + + // Filling tokens. + for i := 0; i < limit+backlogLimit; i++ { + if i < limit { + t.tokens <- token{} + } + t.backlogTokens <- token{} + } + + fn := func(h http.Handler) http.Handler { + t.h = h + return &t + } + + return fn +} + +// token represents a request that is being processed. +type token struct{} + +// throttler limits number of currently processed requests at a time. +type throttler struct { + h http.Handler + tokens chan token + backlogTokens chan token + backlogTimeout time.Duration +} + +// ServeHTTP is the primary throttler request handler +func (t *throttler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + select { + case <-ctx.Done(): + http.Error(w, errContextCanceled, http.StatusServiceUnavailable) + return + case btok := <-t.backlogTokens: + timer := time.NewTimer(t.backlogTimeout) + + defer func() { + t.backlogTokens <- btok + }() + + select { + case <-timer.C: + http.Error(w, errTimedOut, http.StatusServiceUnavailable) + return + case <-ctx.Done(): + http.Error(w, errContextCanceled, http.StatusServiceUnavailable) + return + case tok := <-t.tokens: + defer func() { + t.tokens <- tok + }() + t.h.ServeHTTP(w, r) + } + return + default: + http.Error(w, errCapacityExceeded, http.StatusServiceUnavailable) + return + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/timeout.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/timeout.go new file mode 100644 index 0000000000000000000000000000000000000000..5cabf1f9b2ef448baf046d5a38b08b93dd6a81d7 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/timeout.go @@ -0,0 +1,48 @@ +package middleware + +import ( + "context" + "net/http" + "time" +) + +// Timeout is a middleware that cancels ctx after a given timeout and return +// a 504 Gateway Timeout error to the client. +// +// It's required that you select the ctx.Done() channel to check for the signal +// if the context has reached its deadline and return, otherwise the timeout +// signal will be just ignored. +// +// ie. a route/handler may look like: +// +// r.Get("/long", func(ctx context.Context, w http.ResponseWriter, r *http.Request) { +// processTime := time.Duration(rand.Intn(4)+1) * time.Second +// +// select { +// case <-ctx.Done(): +// return +// +// case <-time.After(processTime): +// // The above channel simulates some hard work. +// } +// +// w.Write([]byte("done")) +// }) +// +func Timeout(timeout time.Duration) func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + ctx, cancel := context.WithTimeout(r.Context(), timeout) + defer func() { + cancel() + if ctx.Err() == context.DeadlineExceeded { + w.WriteHeader(http.StatusGatewayTimeout) + } + }() + + r = r.WithContext(ctx) + next.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/url_format.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/url_format.go new file mode 100644 index 0000000000000000000000000000000000000000..5749e4f32b3a124f5e54a3cb3f635b3012b122d1 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/url_format.go @@ -0,0 +1,72 @@ +package middleware + +import ( + "context" + "net/http" + "strings" + + "github.com/go-chi/chi" +) + +var ( + // URLFormatCtxKey is the context.Context key to store the URL format data + // for a request. + URLFormatCtxKey = &contextKey{"URLFormat"} +) + +// URLFormat is a middleware that parses the url extension from a request path and stores it +// on the context as a string under the key `middleware.URLFormatCtxKey`. The middleware will +// trim the suffix from the routing path and continue routing. +// +// Routers should not include a url parameter for the suffix when using this middleware. +// +// Sample usage.. for url paths: `/articles/1`, `/articles/1.json` and `/articles/1.xml` +// +// func routes() http.Handler { +// r := chi.NewRouter() +// r.Use(middleware.URLFormat) +// +// r.Get("/articles/{id}", ListArticles) +// +// return r +// } +// +// func ListArticles(w http.ResponseWriter, r *http.Request) { +// urlFormat, _ := r.Context().Value(middleware.URLFormatCtxKey).(string) +// +// switch urlFormat { +// case "json": +// render.JSON(w, r, articles) +// case "xml:" +// render.XML(w, r, articles) +// default: +// render.JSON(w, r, articles) +// } +// } +// +func URLFormat(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + var format string + path := r.URL.Path + + if strings.Index(path, ".") > 0 { + base := strings.LastIndex(path, "/") + idx := strings.Index(path[base:], ".") + + if idx > 0 { + idx += base + format = path[idx+1:] + + rctx := chi.RouteContext(r.Context()) + rctx.RoutePath = path[:idx] + } + } + + r = r.WithContext(context.WithValue(ctx, URLFormatCtxKey, format)) + + next.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/value.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/value.go new file mode 100644 index 0000000000000000000000000000000000000000..fbbd0393fb986aada69e9d9d4bc234c7ed5c41eb --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/value.go @@ -0,0 +1,17 @@ +package middleware + +import ( + "context" + "net/http" +) + +// WithValue is a middleware that sets a given key/value in a context chain. +func WithValue(key interface{}, val interface{}) func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + r = r.WithContext(context.WithValue(r.Context(), key, val)) + next.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/wrap_writer.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/wrap_writer.go new file mode 100644 index 0000000000000000000000000000000000000000..5d1c286be135821e83c120fe89aecc5982b7328a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/wrap_writer.go @@ -0,0 +1,148 @@ +package middleware + +// The original work was derived from Goji's middleware, source: +// https://github.com/zenazn/goji/tree/master/web/middleware + +import ( + "bufio" + "io" + "net" + "net/http" +) + +// WrapResponseWriter is a proxy around an http.ResponseWriter that allows you to hook +// into various parts of the response process. +type WrapResponseWriter interface { + http.ResponseWriter + // Status returns the HTTP status of the request, or 0 if one has not + // yet been sent. + Status() int + // BytesWritten returns the total number of bytes sent to the client. + BytesWritten() int + // Tee causes the response body to be written to the given io.Writer in + // addition to proxying the writes through. Only one io.Writer can be + // tee'd to at once: setting a second one will overwrite the first. + // Writes will be sent to the proxy before being written to this + // io.Writer. It is illegal for the tee'd writer to be modified + // concurrently with writes. + Tee(io.Writer) + // Unwrap returns the original proxied target. + Unwrap() http.ResponseWriter +} + +// basicWriter wraps a http.ResponseWriter that implements the minimal +// http.ResponseWriter interface. +type basicWriter struct { + http.ResponseWriter + wroteHeader bool + code int + bytes int + tee io.Writer +} + +func (b *basicWriter) WriteHeader(code int) { + if !b.wroteHeader { + b.code = code + b.wroteHeader = true + b.ResponseWriter.WriteHeader(code) + } +} +func (b *basicWriter) Write(buf []byte) (int, error) { + b.WriteHeader(http.StatusOK) + n, err := b.ResponseWriter.Write(buf) + if b.tee != nil { + _, err2 := b.tee.Write(buf[:n]) + // Prefer errors generated by the proxied writer. + if err == nil { + err = err2 + } + } + b.bytes += n + return n, err +} +func (b *basicWriter) maybeWriteHeader() { + if !b.wroteHeader { + b.WriteHeader(http.StatusOK) + } +} +func (b *basicWriter) Status() int { + return b.code +} +func (b *basicWriter) BytesWritten() int { + return b.bytes +} +func (b *basicWriter) Tee(w io.Writer) { + b.tee = w +} +func (b *basicWriter) Unwrap() http.ResponseWriter { + return b.ResponseWriter +} + +type flushWriter struct { + basicWriter +} + +func (f *flushWriter) Flush() { + fl := f.basicWriter.ResponseWriter.(http.Flusher) + fl.Flush() +} + +var _ http.Flusher = &flushWriter{} + +// httpFancyWriter is a HTTP writer that additionally satisfies http.CloseNotifier, +// http.Flusher, http.Hijacker, and io.ReaderFrom. It exists for the common case +// of wrapping the http.ResponseWriter that package http gives you, in order to +// make the proxied object support the full method set of the proxied object. +type httpFancyWriter struct { + basicWriter +} + +func (f *httpFancyWriter) CloseNotify() <-chan bool { + cn := f.basicWriter.ResponseWriter.(http.CloseNotifier) + return cn.CloseNotify() +} +func (f *httpFancyWriter) Flush() { + fl := f.basicWriter.ResponseWriter.(http.Flusher) + fl.Flush() +} +func (f *httpFancyWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { + hj := f.basicWriter.ResponseWriter.(http.Hijacker) + return hj.Hijack() +} +func (f *httpFancyWriter) ReadFrom(r io.Reader) (int64, error) { + if f.basicWriter.tee != nil { + n, err := io.Copy(&f.basicWriter, r) + f.basicWriter.bytes += int(n) + return n, err + } + rf := f.basicWriter.ResponseWriter.(io.ReaderFrom) + f.basicWriter.maybeWriteHeader() + n, err := rf.ReadFrom(r) + f.basicWriter.bytes += int(n) + return n, err +} + +var _ http.CloseNotifier = &httpFancyWriter{} +var _ http.Flusher = &httpFancyWriter{} +var _ http.Hijacker = &httpFancyWriter{} +var _ io.ReaderFrom = &httpFancyWriter{} + +// http2FancyWriter is a HTTP2 writer that additionally satisfies http.CloseNotifier, +// http.Flusher, and io.ReaderFrom. It exists for the common case +// of wrapping the http.ResponseWriter that package http gives you, in order to +// make the proxied object support the full method set of the proxied object. +type http2FancyWriter struct { + basicWriter +} + +func (f *http2FancyWriter) CloseNotify() <-chan bool { + cn := f.basicWriter.ResponseWriter.(http.CloseNotifier) + return cn.CloseNotify() +} +func (f *http2FancyWriter) Flush() { + fl := f.basicWriter.ResponseWriter.(http.Flusher) + fl.Flush() +} + +var _ http.CloseNotifier = &http2FancyWriter{} +var _ http.Flusher = &http2FancyWriter{} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/wrap_writer17.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/wrap_writer17.go new file mode 100644 index 0000000000000000000000000000000000000000..c60df60868426192d6097b88adc4fbbbbf3edaaa --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/wrap_writer17.go @@ -0,0 +1,34 @@ +// +build go1.7,!go1.8 + +package middleware + +import ( + "io" + "net/http" +) + +// NewWrapResponseWriter wraps an http.ResponseWriter, returning a proxy that allows you to +// hook into various parts of the response process. +func NewWrapResponseWriter(w http.ResponseWriter, protoMajor int) WrapResponseWriter { + _, cn := w.(http.CloseNotifier) + _, fl := w.(http.Flusher) + + bw := basicWriter{ResponseWriter: w} + + if protoMajor == 2 { + if cn && fl { + return &http2FancyWriter{bw} + } + } else { + _, hj := w.(http.Hijacker) + _, rf := w.(io.ReaderFrom) + if cn && fl && hj && rf { + return &httpFancyWriter{bw} + } + } + if fl { + return &flushWriter{bw} + } + + return &bw +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/wrap_writer18.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/wrap_writer18.go new file mode 100644 index 0000000000000000000000000000000000000000..115c2d4f4ffa9fef2c23152c71a5dca0c3f09b2c --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/middleware/wrap_writer18.go @@ -0,0 +1,41 @@ +// +build go1.8 appengine + +package middleware + +import ( + "io" + "net/http" +) + +// NewWrapResponseWriter wraps an http.ResponseWriter, returning a proxy that allows you to +// hook into various parts of the response process. +func NewWrapResponseWriter(w http.ResponseWriter, protoMajor int) WrapResponseWriter { + _, cn := w.(http.CloseNotifier) + _, fl := w.(http.Flusher) + + bw := basicWriter{ResponseWriter: w} + + if protoMajor == 2 { + _, ps := w.(http.Pusher) + if cn && fl && ps { + return &http2FancyWriter{bw} + } + } else { + _, hj := w.(http.Hijacker) + _, rf := w.(io.ReaderFrom) + if cn && fl && hj && rf { + return &httpFancyWriter{bw} + } + } + if fl { + return &flushWriter{bw} + } + + return &bw +} + +func (f *http2FancyWriter) Push(target string, opts *http.PushOptions) error { + return f.basicWriter.ResponseWriter.(http.Pusher).Push(target, opts) +} + +var _ http.Pusher = &http2FancyWriter{} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/mux.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/mux.go new file mode 100644 index 0000000000000000000000000000000000000000..84a2424a13499b15217e919c1871578532cbaf26 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/mux.go @@ -0,0 +1,459 @@ +package chi + +import ( + "context" + "fmt" + "net/http" + "strings" + "sync" +) + +var _ Router = &Mux{} + +// Mux is a simple HTTP route multiplexer that parses a request path, +// records any URL params, and executes an end handler. It implements +// the http.Handler interface and is friendly with the standard library. +// +// Mux is designed to be fast, minimal and offer a powerful API for building +// modular and composable HTTP services with a large set of handlers. It's +// particularly useful for writing large REST API services that break a handler +// into many smaller parts composed of middlewares and end handlers. +type Mux struct { + // The radix trie router + tree *node + + // The middleware stack + middlewares []func(http.Handler) http.Handler + + // Controls the behaviour of middleware chain generation when a mux + // is registered as an inline group inside another mux. + inline bool + parent *Mux + + // The computed mux handler made of the chained middleware stack and + // the tree router + handler http.Handler + + // Routing context pool + pool *sync.Pool + + // Custom route not found handler + notFoundHandler http.HandlerFunc + + // Custom method not allowed handler + methodNotAllowedHandler http.HandlerFunc +} + +// NewMux returns a newly initialized Mux object that implements the Router +// interface. +func NewMux() *Mux { + mux := &Mux{tree: &node{}, pool: &sync.Pool{}} + mux.pool.New = func() interface{} { + return NewRouteContext() + } + return mux +} + +// ServeHTTP is the single method of the http.Handler interface that makes +// Mux interoperable with the standard library. It uses a sync.Pool to get and +// reuse routing contexts for each request. +func (mx *Mux) ServeHTTP(w http.ResponseWriter, r *http.Request) { + // Ensure the mux has some routes defined on the mux + if mx.handler == nil { + panic("chi: attempting to route to a mux with no handlers.") + } + + // Check if a routing context already exists from a parent router. + rctx, _ := r.Context().Value(RouteCtxKey).(*Context) + if rctx != nil { + mx.handler.ServeHTTP(w, r) + return + } + + // Fetch a RouteContext object from the sync pool, and call the computed + // mx.handler that is comprised of mx.middlewares + mx.routeHTTP. + // Once the request is finished, reset the routing context and put it back + // into the pool for reuse from another request. + rctx = mx.pool.Get().(*Context) + rctx.Reset() + rctx.Routes = mx + r = r.WithContext(context.WithValue(r.Context(), RouteCtxKey, rctx)) + mx.handler.ServeHTTP(w, r) + mx.pool.Put(rctx) +} + +// Use appends a middleware handler to the Mux middleware stack. +// +// The middleware stack for any Mux will execute before searching for a matching +// route to a specific handler, which provides opportunity to respond early, +// change the course of the request execution, or set request-scoped values for +// the next http.Handler. +func (mx *Mux) Use(middlewares ...func(http.Handler) http.Handler) { + if mx.handler != nil { + panic("chi: all middlewares must be defined before routes on a mux") + } + mx.middlewares = append(mx.middlewares, middlewares...) +} + +// Handle adds the route `pattern` that matches any http method to +// execute the `handler` http.Handler. +func (mx *Mux) Handle(pattern string, handler http.Handler) { + mx.handle(mALL, pattern, handler) +} + +// HandleFunc adds the route `pattern` that matches any http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) HandleFunc(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mALL, pattern, handlerFn) +} + +// Method adds the route `pattern` that matches `method` http method to +// execute the `handler` http.Handler. +func (mx *Mux) Method(method, pattern string, handler http.Handler) { + m, ok := methodMap[strings.ToUpper(method)] + if !ok { + panic(fmt.Sprintf("chi: '%s' http method is not supported.", method)) + } + mx.handle(m, pattern, handler) +} + +// MethodFunc adds the route `pattern` that matches `method` http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) MethodFunc(method, pattern string, handlerFn http.HandlerFunc) { + mx.Method(method, pattern, handlerFn) +} + +// Connect adds the route `pattern` that matches a CONNECT http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Connect(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mCONNECT, pattern, handlerFn) +} + +// Delete adds the route `pattern` that matches a DELETE http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Delete(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mDELETE, pattern, handlerFn) +} + +// Get adds the route `pattern` that matches a GET http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Get(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mGET, pattern, handlerFn) +} + +// Head adds the route `pattern` that matches a HEAD http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Head(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mHEAD, pattern, handlerFn) +} + +// Options adds the route `pattern` that matches a OPTIONS http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Options(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mOPTIONS, pattern, handlerFn) +} + +// Patch adds the route `pattern` that matches a PATCH http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Patch(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mPATCH, pattern, handlerFn) +} + +// Post adds the route `pattern` that matches a POST http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Post(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mPOST, pattern, handlerFn) +} + +// Put adds the route `pattern` that matches a PUT http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Put(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mPUT, pattern, handlerFn) +} + +// Trace adds the route `pattern` that matches a TRACE http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Trace(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mTRACE, pattern, handlerFn) +} + +// NotFound sets a custom http.HandlerFunc for routing paths that could +// not be found. The default 404 handler is `http.NotFound`. +func (mx *Mux) NotFound(handlerFn http.HandlerFunc) { + // Build NotFound handler chain + m := mx + hFn := handlerFn + if mx.inline && mx.parent != nil { + m = mx.parent + hFn = Chain(mx.middlewares...).HandlerFunc(hFn).ServeHTTP + } + + // Update the notFoundHandler from this point forward + m.notFoundHandler = hFn + m.updateSubRoutes(func(subMux *Mux) { + if subMux.notFoundHandler == nil { + subMux.NotFound(hFn) + } + }) +} + +// MethodNotAllowed sets a custom http.HandlerFunc for routing paths where the +// method is unresolved. The default handler returns a 405 with an empty body. +func (mx *Mux) MethodNotAllowed(handlerFn http.HandlerFunc) { + // Build MethodNotAllowed handler chain + m := mx + hFn := handlerFn + if mx.inline && mx.parent != nil { + m = mx.parent + hFn = Chain(mx.middlewares...).HandlerFunc(hFn).ServeHTTP + } + + // Update the methodNotAllowedHandler from this point forward + m.methodNotAllowedHandler = hFn + m.updateSubRoutes(func(subMux *Mux) { + if subMux.methodNotAllowedHandler == nil { + subMux.MethodNotAllowed(hFn) + } + }) +} + +// With adds inline middlewares for an endpoint handler. +func (mx *Mux) With(middlewares ...func(http.Handler) http.Handler) Router { + // Similarly as in handle(), we must build the mux handler once further + // middleware registration isn't allowed for this stack, like now. + if !mx.inline && mx.handler == nil { + mx.buildRouteHandler() + } + + // Copy middlewares from parent inline muxs + var mws Middlewares + if mx.inline { + mws = make(Middlewares, len(mx.middlewares)) + copy(mws, mx.middlewares) + } + mws = append(mws, middlewares...) + + im := &Mux{pool: mx.pool, inline: true, parent: mx, tree: mx.tree, middlewares: mws} + + return im +} + +// Group creates a new inline-Mux with a fresh middleware stack. It's useful +// for a group of handlers along the same routing path that use an additional +// set of middlewares. See _examples/. +func (mx *Mux) Group(fn func(r Router)) Router { + im := mx.With().(*Mux) + if fn != nil { + fn(im) + } + return im +} + +// Route creates a new Mux with a fresh middleware stack and mounts it +// along the `pattern` as a subrouter. Effectively, this is a short-hand +// call to Mount. See _examples/. +func (mx *Mux) Route(pattern string, fn func(r Router)) Router { + subRouter := NewRouter() + if fn != nil { + fn(subRouter) + } + mx.Mount(pattern, subRouter) + return subRouter +} + +// Mount attaches another http.Handler or chi Router as a subrouter along a routing +// path. It's very useful to split up a large API as many independent routers and +// compose them as a single service using Mount. See _examples/. +// +// Note that Mount() simply sets a wildcard along the `pattern` that will continue +// routing at the `handler`, which in most cases is another chi.Router. As a result, +// if you define two Mount() routes on the exact same pattern the mount will panic. +func (mx *Mux) Mount(pattern string, handler http.Handler) { + // Provide runtime safety for ensuring a pattern isn't mounted on an existing + // routing pattern. + if mx.tree.findPattern(pattern+"*") || mx.tree.findPattern(pattern+"/*") { + panic(fmt.Sprintf("chi: attempting to Mount() a handler on an existing path, '%s'", pattern)) + } + + // Assign sub-Router's with the parent not found & method not allowed handler if not specified. + subr, ok := handler.(*Mux) + if ok && subr.notFoundHandler == nil && mx.notFoundHandler != nil { + subr.NotFound(mx.notFoundHandler) + } + if ok && subr.methodNotAllowedHandler == nil && mx.methodNotAllowedHandler != nil { + subr.MethodNotAllowed(mx.methodNotAllowedHandler) + } + + // Wrap the sub-router in a handlerFunc to scope the request path for routing. + mountHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + rctx := RouteContext(r.Context()) + rctx.RoutePath = mx.nextRoutePath(rctx) + handler.ServeHTTP(w, r) + }) + + if pattern == "" || pattern[len(pattern)-1] != '/' { + mx.handle(mALL|mSTUB, pattern, mountHandler) + mx.handle(mALL|mSTUB, pattern+"/", mountHandler) + pattern += "/" + } + + method := mALL + subroutes, _ := handler.(Routes) + if subroutes != nil { + method |= mSTUB + } + n := mx.handle(method, pattern+"*", mountHandler) + + if subroutes != nil { + n.subroutes = subroutes + } +} + +// Routes returns a slice of routing information from the tree, +// useful for traversing available routes of a router. +func (mx *Mux) Routes() []Route { + return mx.tree.routes() +} + +// Middlewares returns a slice of middleware handler functions. +func (mx *Mux) Middlewares() Middlewares { + return mx.middlewares +} + +// Match searches the routing tree for a handler that matches the method/path. +// It's similar to routing a http request, but without executing the handler +// thereafter. +// +// Note: the *Context state is updated during execution, so manage +// the state carefully or make a NewRouteContext(). +func (mx *Mux) Match(rctx *Context, method, path string) bool { + m, ok := methodMap[method] + if !ok { + return false + } + + node, _, h := mx.tree.FindRoute(rctx, m, path) + + if node != nil && node.subroutes != nil { + rctx.RoutePath = mx.nextRoutePath(rctx) + return node.subroutes.Match(rctx, method, rctx.RoutePath) + } + + return h != nil +} + +// NotFoundHandler returns the default Mux 404 responder whenever a route +// cannot be found. +func (mx *Mux) NotFoundHandler() http.HandlerFunc { + if mx.notFoundHandler != nil { + return mx.notFoundHandler + } + return http.NotFound +} + +// MethodNotAllowedHandler returns the default Mux 405 responder whenever +// a method cannot be resolved for a route. +func (mx *Mux) MethodNotAllowedHandler() http.HandlerFunc { + if mx.methodNotAllowedHandler != nil { + return mx.methodNotAllowedHandler + } + return methodNotAllowedHandler +} + +// buildRouteHandler builds the single mux handler that is a chain of the middleware +// stack, as defined by calls to Use(), and the tree router (Mux) itself. After this +// point, no other middlewares can be registered on this Mux's stack. But you can still +// compose additional middlewares via Group()'s or using a chained middleware handler. +func (mx *Mux) buildRouteHandler() { + mx.handler = chain(mx.middlewares, http.HandlerFunc(mx.routeHTTP)) +} + +// handle registers a http.Handler in the routing tree for a particular http method +// and routing pattern. +func (mx *Mux) handle(method methodTyp, pattern string, handler http.Handler) *node { + if len(pattern) == 0 || pattern[0] != '/' { + panic(fmt.Sprintf("chi: routing pattern must begin with '/' in '%s'", pattern)) + } + + // Build the final routing handler for this Mux. + if !mx.inline && mx.handler == nil { + mx.buildRouteHandler() + } + + // Build endpoint handler with inline middlewares for the route + var h http.Handler + if mx.inline { + mx.handler = http.HandlerFunc(mx.routeHTTP) + h = Chain(mx.middlewares...).Handler(handler) + } else { + h = handler + } + + // Add the endpoint to the tree and return the node + return mx.tree.InsertRoute(method, pattern, h) +} + +// routeHTTP routes a http.Request through the Mux routing tree to serve +// the matching handler for a particular http method. +func (mx *Mux) routeHTTP(w http.ResponseWriter, r *http.Request) { + // Grab the route context object + rctx := r.Context().Value(RouteCtxKey).(*Context) + + // The request routing path + routePath := rctx.RoutePath + if routePath == "" { + if r.URL.RawPath != "" { + routePath = r.URL.RawPath + } else { + routePath = r.URL.Path + } + } + + // Check if method is supported by chi + if rctx.RouteMethod == "" { + rctx.RouteMethod = r.Method + } + method, ok := methodMap[rctx.RouteMethod] + if !ok { + mx.MethodNotAllowedHandler().ServeHTTP(w, r) + return + } + + // Find the route + if _, _, h := mx.tree.FindRoute(rctx, method, routePath); h != nil { + h.ServeHTTP(w, r) + return + } + if rctx.methodNotAllowed { + mx.MethodNotAllowedHandler().ServeHTTP(w, r) + } else { + mx.NotFoundHandler().ServeHTTP(w, r) + } +} + +func (mx *Mux) nextRoutePath(rctx *Context) string { + routePath := "/" + nx := len(rctx.routeParams.Keys) - 1 // index of last param in list + if nx >= 0 && rctx.routeParams.Keys[nx] == "*" && len(rctx.routeParams.Values) > nx { + routePath += rctx.routeParams.Values[nx] + } + return routePath +} + +// Recursively update data on child routers. +func (mx *Mux) updateSubRoutes(fn func(subMux *Mux)) { + for _, r := range mx.tree.routes() { + subMux, ok := r.SubRoutes.(*Mux) + if !ok { + continue + } + fn(subMux) + } +} + +// methodNotAllowedHandler is a helper function to respond with a 405, +// method not allowed. +func methodNotAllowedHandler(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(405) + w.Write(nil) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/tree.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/tree.go new file mode 100644 index 0000000000000000000000000000000000000000..a55d7f14bddecc3e5bf5f66bf60243f7c128e3d6 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-chi/chi/tree.go @@ -0,0 +1,844 @@ +package chi + +// Radix tree implementation below is a based on the original work by +// Armon Dadgar in https://github.com/armon/go-radix/blob/master/radix.go +// (MIT licensed). It's been heavily modified for use as a HTTP routing tree. + +import ( + "fmt" + "math" + "net/http" + "regexp" + "sort" + "strconv" + "strings" +) + +type methodTyp int + +const ( + mSTUB methodTyp = 1 << iota + mCONNECT + mDELETE + mGET + mHEAD + mOPTIONS + mPATCH + mPOST + mPUT + mTRACE +) + +var mALL = mCONNECT | mDELETE | mGET | mHEAD | + mOPTIONS | mPATCH | mPOST | mPUT | mTRACE + +var methodMap = map[string]methodTyp{ + "CONNECT": mCONNECT, + "DELETE": mDELETE, + "GET": mGET, + "HEAD": mHEAD, + "OPTIONS": mOPTIONS, + "PATCH": mPATCH, + "POST": mPOST, + "PUT": mPUT, + "TRACE": mTRACE, +} + +// RegisterMethod adds support for custom HTTP method handlers, available +// via Router#Method and Router#MethodFunc +func RegisterMethod(method string) { + if method == "" { + return + } + method = strings.ToUpper(method) + if _, ok := methodMap[method]; ok { + return + } + n := len(methodMap) + if n > strconv.IntSize { + panic(fmt.Sprintf("chi: max number of methods reached (%d)", strconv.IntSize)) + } + mt := methodTyp(math.Exp2(float64(n))) + methodMap[method] = mt + mALL |= mt +} + +type nodeTyp uint8 + +const ( + ntStatic nodeTyp = iota // /home + ntRegexp // /{id:[0-9]+} + ntParam // /{user} + ntCatchAll // /api/v1/* +) + +type node struct { + // node type: static, regexp, param, catchAll + typ nodeTyp + + // first byte of the prefix + label byte + + // first byte of the child prefix + tail byte + + // prefix is the common prefix we ignore + prefix string + + // regexp matcher for regexp nodes + rex *regexp.Regexp + + // HTTP handler endpoints on the leaf node + endpoints endpoints + + // subroutes on the leaf node + subroutes Routes + + // child nodes should be stored in-order for iteration, + // in groups of the node type. + children [ntCatchAll + 1]nodes +} + +// endpoints is a mapping of http method constants to handlers +// for a given route. +type endpoints map[methodTyp]*endpoint + +type endpoint struct { + // endpoint handler + handler http.Handler + + // pattern is the routing pattern for handler nodes + pattern string + + // parameter keys recorded on handler nodes + paramKeys []string +} + +func (s endpoints) Value(method methodTyp) *endpoint { + mh, ok := s[method] + if !ok { + mh = &endpoint{} + s[method] = mh + } + return mh +} + +func (n *node) InsertRoute(method methodTyp, pattern string, handler http.Handler) *node { + var parent *node + search := pattern + + for { + // Handle key exhaustion + if len(search) == 0 { + // Insert or update the node's leaf handler + n.setEndpoint(method, handler, pattern) + return n + } + + // We're going to be searching for a wild node next, + // in this case, we need to get the tail + var label = search[0] + var segTail byte + var segEndIdx int + var segTyp nodeTyp + var segRexpat string + if label == '{' || label == '*' { + segTyp, _, segRexpat, segTail, _, segEndIdx = patNextSegment(search) + } + + var prefix string + if segTyp == ntRegexp { + prefix = segRexpat + } + + // Look for the edge to attach to + parent = n + n = n.getEdge(segTyp, label, segTail, prefix) + + // No edge, create one + if n == nil { + child := &node{label: label, tail: segTail, prefix: search} + hn := parent.addChild(child, search) + hn.setEndpoint(method, handler, pattern) + + return hn + } + + // Found an edge to match the pattern + + if n.typ > ntStatic { + // We found a param node, trim the param from the search path and continue. + // This param/wild pattern segment would already be on the tree from a previous + // call to addChild when creating a new node. + search = search[segEndIdx:] + continue + } + + // Static nodes fall below here. + // Determine longest prefix of the search key on match. + commonPrefix := longestPrefix(search, n.prefix) + if commonPrefix == len(n.prefix) { + // the common prefix is as long as the current node's prefix we're attempting to insert. + // keep the search going. + search = search[commonPrefix:] + continue + } + + // Split the node + child := &node{ + typ: ntStatic, + prefix: search[:commonPrefix], + } + parent.replaceChild(search[0], segTail, child) + + // Restore the existing node + n.label = n.prefix[commonPrefix] + n.prefix = n.prefix[commonPrefix:] + child.addChild(n, n.prefix) + + // If the new key is a subset, set the method/handler on this node and finish. + search = search[commonPrefix:] + if len(search) == 0 { + child.setEndpoint(method, handler, pattern) + return child + } + + // Create a new edge for the node + subchild := &node{ + typ: ntStatic, + label: search[0], + prefix: search, + } + hn := child.addChild(subchild, search) + hn.setEndpoint(method, handler, pattern) + return hn + } +} + +// addChild appends the new `child` node to the tree using the `pattern` as the trie key. +// For a URL router like chi's, we split the static, param, regexp and wildcard segments +// into different nodes. In addition, addChild will recursively call itself until every +// pattern segment is added to the url pattern tree as individual nodes, depending on type. +func (n *node) addChild(child *node, prefix string) *node { + search := prefix + + // handler leaf node added to the tree is the child. + // this may be overridden later down the flow + hn := child + + // Parse next segment + segTyp, _, segRexpat, segTail, segStartIdx, segEndIdx := patNextSegment(search) + + // Add child depending on next up segment + switch segTyp { + + case ntStatic: + // Search prefix is all static (that is, has no params in path) + // noop + + default: + // Search prefix contains a param, regexp or wildcard + + if segTyp == ntRegexp { + rex, err := regexp.Compile(segRexpat) + if err != nil { + panic(fmt.Sprintf("chi: invalid regexp pattern '%s' in route param", segRexpat)) + } + child.prefix = segRexpat + child.rex = rex + } + + if segStartIdx == 0 { + // Route starts with a param + child.typ = segTyp + + if segTyp == ntCatchAll { + segStartIdx = -1 + } else { + segStartIdx = segEndIdx + } + if segStartIdx < 0 { + segStartIdx = len(search) + } + child.tail = segTail // for params, we set the tail + + if segStartIdx != len(search) { + // add static edge for the remaining part, split the end. + // its not possible to have adjacent param nodes, so its certainly + // going to be a static node next. + + search = search[segStartIdx:] // advance search position + + nn := &node{ + typ: ntStatic, + label: search[0], + prefix: search, + } + hn = child.addChild(nn, search) + } + + } else if segStartIdx > 0 { + // Route has some param + + // starts with a static segment + child.typ = ntStatic + child.prefix = search[:segStartIdx] + child.rex = nil + + // add the param edge node + search = search[segStartIdx:] + + nn := &node{ + typ: segTyp, + label: search[0], + tail: segTail, + } + hn = child.addChild(nn, search) + + } + } + + n.children[child.typ] = append(n.children[child.typ], child) + n.children[child.typ].Sort() + return hn +} + +func (n *node) replaceChild(label, tail byte, child *node) { + for i := 0; i < len(n.children[child.typ]); i++ { + if n.children[child.typ][i].label == label && n.children[child.typ][i].tail == tail { + n.children[child.typ][i] = child + n.children[child.typ][i].label = label + n.children[child.typ][i].tail = tail + return + } + } + panic("chi: replacing missing child") +} + +func (n *node) getEdge(ntyp nodeTyp, label, tail byte, prefix string) *node { + nds := n.children[ntyp] + for i := 0; i < len(nds); i++ { + if nds[i].label == label && nds[i].tail == tail { + if ntyp == ntRegexp && nds[i].prefix != prefix { + continue + } + return nds[i] + } + } + return nil +} + +func (n *node) setEndpoint(method methodTyp, handler http.Handler, pattern string) { + // Set the handler for the method type on the node + if n.endpoints == nil { + n.endpoints = make(endpoints, 0) + } + + paramKeys := patParamKeys(pattern) + + if method&mSTUB == mSTUB { + n.endpoints.Value(mSTUB).handler = handler + } + if method&mALL == mALL { + h := n.endpoints.Value(mALL) + h.handler = handler + h.pattern = pattern + h.paramKeys = paramKeys + for _, m := range methodMap { + h := n.endpoints.Value(m) + h.handler = handler + h.pattern = pattern + h.paramKeys = paramKeys + } + } else { + h := n.endpoints.Value(method) + h.handler = handler + h.pattern = pattern + h.paramKeys = paramKeys + } +} + +func (n *node) FindRoute(rctx *Context, method methodTyp, path string) (*node, endpoints, http.Handler) { + // Reset the context routing pattern and params + rctx.routePattern = "" + rctx.routeParams.Keys = rctx.routeParams.Keys[:0] + rctx.routeParams.Values = rctx.routeParams.Values[:0] + + // Find the routing handlers for the path + rn := n.findRoute(rctx, method, path) + if rn == nil { + return nil, nil, nil + } + + // Record the routing params in the request lifecycle + rctx.URLParams.Keys = append(rctx.URLParams.Keys, rctx.routeParams.Keys...) + rctx.URLParams.Values = append(rctx.URLParams.Values, rctx.routeParams.Values...) + + // Record the routing pattern in the request lifecycle + if rn.endpoints[method].pattern != "" { + rctx.routePattern = rn.endpoints[method].pattern + rctx.RoutePatterns = append(rctx.RoutePatterns, rctx.routePattern) + } + + return rn, rn.endpoints, rn.endpoints[method].handler +} + +// Recursive edge traversal by checking all nodeTyp groups along the way. +// It's like searching through a multi-dimensional radix trie. +func (n *node) findRoute(rctx *Context, method methodTyp, path string) *node { + nn := n + search := path + + for t, nds := range nn.children { + ntyp := nodeTyp(t) + if len(nds) == 0 { + continue + } + + var xn *node + xsearch := search + + var label byte + if search != "" { + label = search[0] + } + + switch ntyp { + case ntStatic: + xn = nds.findEdge(label) + if xn == nil || !strings.HasPrefix(xsearch, xn.prefix) { + continue + } + xsearch = xsearch[len(xn.prefix):] + + case ntParam, ntRegexp: + // short-circuit and return no matching route for empty param values + if xsearch == "" { + continue + } + + // serially loop through each node grouped by the tail delimiter + for idx := 0; idx < len(nds); idx++ { + xn = nds[idx] + + // label for param nodes is the delimiter byte + p := strings.IndexByte(xsearch, xn.tail) + + if p < 0 { + if xn.tail == '/' { + p = len(xsearch) + } else { + continue + } + } + + if ntyp == ntRegexp && xn.rex != nil { + if xn.rex.Match([]byte(xsearch[:p])) == false { + continue + } + } else if strings.IndexByte(xsearch[:p], '/') != -1 { + // avoid a match across path segments + continue + } + + rctx.routeParams.Values = append(rctx.routeParams.Values, xsearch[:p]) + xsearch = xsearch[p:] + break + } + + default: + // catch-all nodes + rctx.routeParams.Values = append(rctx.routeParams.Values, search) + xn = nds[0] + xsearch = "" + } + + if xn == nil { + continue + } + + // did we find it yet? + if len(xsearch) == 0 { + if xn.isLeaf() { + h, _ := xn.endpoints[method] + if h != nil && h.handler != nil { + rctx.routeParams.Keys = append(rctx.routeParams.Keys, h.paramKeys...) + return xn + } + + // flag that the routing context found a route, but not a corresponding + // supported method + rctx.methodNotAllowed = true + } + } + + // recursively find the next node.. + fin := xn.findRoute(rctx, method, xsearch) + if fin != nil { + return fin + } + + // Did not find final handler, let's remove the param here if it was set + if xn.typ > ntStatic { + if len(rctx.routeParams.Values) > 0 { + rctx.routeParams.Values = rctx.routeParams.Values[:len(rctx.routeParams.Values)-1] + } + } + + } + + return nil +} + +func (n *node) findEdge(ntyp nodeTyp, label byte) *node { + nds := n.children[ntyp] + num := len(nds) + idx := 0 + + switch ntyp { + case ntStatic, ntParam, ntRegexp: + i, j := 0, num-1 + for i <= j { + idx = i + (j-i)/2 + if label > nds[idx].label { + i = idx + 1 + } else if label < nds[idx].label { + j = idx - 1 + } else { + i = num // breaks cond + } + } + if nds[idx].label != label { + return nil + } + return nds[idx] + + default: // catch all + return nds[idx] + } +} + +func (n *node) isEmpty() bool { + for _, nds := range n.children { + if len(nds) > 0 { + return false + } + } + return true +} + +func (n *node) isLeaf() bool { + return n.endpoints != nil +} + +func (n *node) findPattern(pattern string) bool { + nn := n + for _, nds := range nn.children { + if len(nds) == 0 { + continue + } + + n = nn.findEdge(nds[0].typ, pattern[0]) + if n == nil { + continue + } + + var idx int + var xpattern string + + switch n.typ { + case ntStatic: + idx = longestPrefix(pattern, n.prefix) + if idx < len(n.prefix) { + continue + } + + case ntParam, ntRegexp: + idx = strings.IndexByte(pattern, '}') + 1 + + case ntCatchAll: + idx = longestPrefix(pattern, "*") + + default: + panic("chi: unknown node type") + } + + xpattern = pattern[idx:] + if len(xpattern) == 0 { + return true + } + + return n.findPattern(xpattern) + } + return false +} + +func (n *node) routes() []Route { + rts := []Route{} + + n.walk(func(eps endpoints, subroutes Routes) bool { + if eps[mSTUB] != nil && eps[mSTUB].handler != nil && subroutes == nil { + return false + } + + // Group methodHandlers by unique patterns + pats := make(map[string]endpoints, 0) + + for mt, h := range eps { + if h.pattern == "" { + continue + } + p, ok := pats[h.pattern] + if !ok { + p = endpoints{} + pats[h.pattern] = p + } + p[mt] = h + } + + for p, mh := range pats { + hs := make(map[string]http.Handler, 0) + if mh[mALL] != nil && mh[mALL].handler != nil { + hs["*"] = mh[mALL].handler + } + + for mt, h := range mh { + if h.handler == nil { + continue + } + m := methodTypString(mt) + if m == "" { + continue + } + hs[m] = h.handler + } + + rt := Route{p, hs, subroutes} + rts = append(rts, rt) + } + + return false + }) + + return rts +} + +func (n *node) walk(fn func(eps endpoints, subroutes Routes) bool) bool { + // Visit the leaf values if any + if (n.endpoints != nil || n.subroutes != nil) && fn(n.endpoints, n.subroutes) { + return true + } + + // Recurse on the children + for _, ns := range n.children { + for _, cn := range ns { + if cn.walk(fn) { + return true + } + } + } + return false +} + +// patNextSegment returns the next segment details from a pattern: +// node type, param key, regexp string, param tail byte, param starting index, param ending index +func patNextSegment(pattern string) (nodeTyp, string, string, byte, int, int) { + ps := strings.Index(pattern, "{") + ws := strings.Index(pattern, "*") + + if ps < 0 && ws < 0 { + return ntStatic, "", "", 0, 0, len(pattern) // we return the entire thing + } + + // Sanity check + if ps >= 0 && ws >= 0 && ws < ps { + panic("chi: wildcard '*' must be the last pattern in a route, otherwise use a '{param}'") + } + + var tail byte = '/' // Default endpoint tail to / byte + + if ps >= 0 { + // Param/Regexp pattern is next + nt := ntParam + + // Read to closing } taking into account opens and closes in curl count (cc) + cc := 0 + pe := ps + for i, c := range pattern[ps:] { + if c == '{' { + cc++ + } else if c == '}' { + cc-- + if cc == 0 { + pe = ps + i + break + } + } + } + if pe == ps { + panic("chi: route param closing delimiter '}' is missing") + } + + key := pattern[ps+1 : pe] + pe++ // set end to next position + + if pe < len(pattern) { + tail = pattern[pe] + } + + var rexpat string + if idx := strings.Index(key, ":"); idx >= 0 { + nt = ntRegexp + rexpat = key[idx+1:] + key = key[:idx] + } + + if len(rexpat) > 0 { + if rexpat[0] != '^' { + rexpat = "^" + rexpat + } + if rexpat[len(rexpat)-1] != '$' { + rexpat = rexpat + "$" + } + } + + return nt, key, rexpat, tail, ps, pe + } + + // Wildcard pattern as finale + // TODO: should we panic if there is stuff after the * ??? + return ntCatchAll, "*", "", 0, ws, len(pattern) +} + +func patParamKeys(pattern string) []string { + pat := pattern + paramKeys := []string{} + for { + ptyp, paramKey, _, _, _, e := patNextSegment(pat) + if ptyp == ntStatic { + return paramKeys + } + for i := 0; i < len(paramKeys); i++ { + if paramKeys[i] == paramKey { + panic(fmt.Sprintf("chi: routing pattern '%s' contains duplicate param key, '%s'", pattern, paramKey)) + } + } + paramKeys = append(paramKeys, paramKey) + pat = pat[e:] + } +} + +// longestPrefix finds the length of the shared prefix +// of two strings +func longestPrefix(k1, k2 string) int { + max := len(k1) + if l := len(k2); l < max { + max = l + } + var i int + for i = 0; i < max; i++ { + if k1[i] != k2[i] { + break + } + } + return i +} + +func methodTypString(method methodTyp) string { + for s, t := range methodMap { + if method == t { + return s + } + } + return "" +} + +type nodes []*node + +// Sort the list of nodes by label +func (ns nodes) Sort() { sort.Sort(ns); ns.tailSort() } +func (ns nodes) Len() int { return len(ns) } +func (ns nodes) Swap(i, j int) { ns[i], ns[j] = ns[j], ns[i] } +func (ns nodes) Less(i, j int) bool { return ns[i].label < ns[j].label } + +// tailSort pushes nodes with '/' as the tail to the end of the list for param nodes. +// The list order determines the traversal order. +func (ns nodes) tailSort() { + for i := len(ns) - 1; i >= 0; i-- { + if ns[i].typ > ntStatic && ns[i].tail == '/' { + ns.Swap(i, len(ns)-1) + return + } + } +} + +func (ns nodes) findEdge(label byte) *node { + num := len(ns) + idx := 0 + i, j := 0, num-1 + for i <= j { + idx = i + (j-i)/2 + if label > ns[idx].label { + i = idx + 1 + } else if label < ns[idx].label { + j = idx - 1 + } else { + i = num // breaks cond + } + } + if ns[idx].label != label { + return nil + } + return ns[idx] +} + +// Route describes the details of a routing handler. +type Route struct { + Pattern string + Handlers map[string]http.Handler + SubRoutes Routes +} + +// WalkFunc is the type of the function called for each method and route visited by Walk. +type WalkFunc func(method string, route string, handler http.Handler, middlewares ...func(http.Handler) http.Handler) error + +// Walk walks any router tree that implements Routes interface. +func Walk(r Routes, walkFn WalkFunc) error { + return walk(r, walkFn, "") +} + +func walk(r Routes, walkFn WalkFunc, parentRoute string, parentMw ...func(http.Handler) http.Handler) error { + for _, route := range r.Routes() { + mws := make([]func(http.Handler) http.Handler, len(parentMw)) + copy(mws, parentMw) + mws = append(mws, r.Middlewares()...) + + if route.SubRoutes != nil { + if err := walk(route.SubRoutes, walkFn, parentRoute+route.Pattern, mws...); err != nil { + return err + } + continue + } + + for method, handler := range route.Handlers { + if method == "*" { + // Ignore a "catchAll" method, since we pass down all the specific methods for each route. + continue + } + + fullRoute := parentRoute + route.Pattern + + if chain, ok := handler.(*ChainHandler); ok { + if err := walkFn(method, fullRoute, chain.Endpoint, append(mws, chain.Middlewares...)...); err != nil { + return err + } + } else { + if err := walkFn(method, fullRoute, handler, mws...); err != nil { + return err + } + } + } + } + + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/AUTHORS b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/AUTHORS new file mode 100644 index 0000000000000000000000000000000000000000..fbe4ec44284f4090b270cea772bf57fa57a4ae41 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/AUTHORS @@ -0,0 +1,90 @@ +# This is the official list of Go-MySQL-Driver authors for copyright purposes. + +# If you are submitting a patch, please add your name or the name of the +# organization which holds the copyright to this list in alphabetical order. + +# Names should be added to this file as +# Name <email address> +# The email address is not required for organizations. +# Please keep the list sorted. + + +# Individual Persons + +Aaron Hopkins <go-sql-driver at die.net> +Achille Roussel <achille.roussel at gmail.com> +Alexey Palazhchenko <alexey.palazhchenko at gmail.com> +Andrew Reid <andrew.reid at tixtrack.com> +Arne Hormann <arnehormann at gmail.com> +Asta Xie <xiemengjun at gmail.com> +Bulat Gaifullin <gaifullinbf at gmail.com> +Carlos Nieto <jose.carlos at menteslibres.net> +Chris Moos <chris at tech9computers.com> +Craig Wilson <craiggwilson at gmail.com> +Daniel Montoya <dsmontoyam at gmail.com> +Daniel Nichter <nil at codenode.com> +Daniël van Eeden <git at myname.nl> +Dave Protasowski <dprotaso at gmail.com> +DisposaBoy <disposaboy at dby.me> +Egor Smolyakov <egorsmkv at gmail.com> +Evan Shaw <evan at vendhq.com> +Frederick Mayle <frederickmayle at gmail.com> +Gustavo Kristic <gkristic at gmail.com> +Hajime Nakagami <nakagami at gmail.com> +Hanno Braun <mail at hannobraun.com> +Henri Yandell <flamefew at gmail.com> +Hirotaka Yamamoto <ymmt2005 at gmail.com> +ICHINOSE Shogo <shogo82148 at gmail.com> +INADA Naoki <songofacandy at gmail.com> +Jacek Szwec <szwec.jacek at gmail.com> +James Harr <james.harr at gmail.com> +Jeff Hodges <jeff at somethingsimilar.com> +Jeffrey Charles <jeffreycharles at gmail.com> +Jian Zhen <zhenjl at gmail.com> +Joshua Prunier <joshua.prunier at gmail.com> +Julien Lefevre <julien.lefevr at gmail.com> +Julien Schmidt <go-sql-driver at julienschmidt.com> +Justin Li <jli at j-li.net> +Justin Nuß <nuss.justin at gmail.com> +Kamil Dziedzic <kamil at klecza.pl> +Kevin Malachowski <kevin at chowski.com> +Kieron Woodhouse <kieron.woodhouse at infosum.com> +Lennart Rudolph <lrudolph at hmc.edu> +Leonardo YongUk Kim <dalinaum at gmail.com> +Linh Tran Tuan <linhduonggnu at gmail.com> +Lion Yang <lion at aosc.xyz> +Luca Looz <luca.looz92 at gmail.com> +Lucas Liu <extrafliu at gmail.com> +Luke Scott <luke at webconnex.com> +Maciej Zimnoch <maciej.zimnoch at codilime.com> +Michael Woolnough <michael.woolnough at gmail.com> +Nicola Peduzzi <thenikso at gmail.com> +Olivier Mengué <dolmen at cpan.org> +oscarzhao <oscarzhaosl at gmail.com> +Paul Bonser <misterpib at gmail.com> +Peter Schultz <peter.schultz at classmarkets.com> +Rebecca Chin <rchin at pivotal.io> +Reed Allman <rdallman10 at gmail.com> +Richard Wilkes <wilkes at me.com> +Robert Russell <robert at rrbrussell.com> +Runrioter Wung <runrioter at gmail.com> +Shuode Li <elemount at qq.com> +Soroush Pour <me at soroushjp.com> +Stan Putrya <root.vagner at gmail.com> +Stanley Gunawan <gunawan.stanley at gmail.com> +Thomas Wodarek <wodarekwebpage at gmail.com> +Xiangyu Hu <xiangyu.hu at outlook.com> +Xiaobing Jiang <s7v7nislands at gmail.com> +Xiuming Chen <cc at cxm.cc> +Zhenye Xie <xiezhenye at gmail.com> + +# Organizations + +Barracuda Networks, Inc. +Counting Ltd. +Google Inc. +InfoSum Ltd. +Keybase Inc. +Percona LLC +Pivotal Inc. +Stripe Inc. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..2d87d74c971be5946de96d4c0e11c715f1234270 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/CHANGELOG.md @@ -0,0 +1,167 @@ +## Version 1.4 (2018-06-03) + +Changes: + + - Documentation fixes (#530, #535, #567) + - Refactoring (#575, #579, #580, #581, #603, #615, #704) + - Cache column names (#444) + - Sort the DSN parameters in DSNs generated from a config (#637) + - Allow native password authentication by default (#644) + - Use the default port if it is missing in the DSN (#668) + - Removed the `strict` mode (#676) + - Do not query `max_allowed_packet` by default (#680) + - Dropped support Go 1.6 and lower (#696) + - Updated `ConvertValue()` to match the database/sql/driver implementation (#760) + - Document the usage of `0000-00-00T00:00:00` as the time.Time zero value (#783) + - Improved the compatibility of the authentication system (#807) + +New Features: + + - Multi-Results support (#537) + - `rejectReadOnly` DSN option (#604) + - `context.Context` support (#608, #612, #627, #761) + - Transaction isolation level support (#619, #744) + - Read-Only transactions support (#618, #634) + - `NewConfig` function which initializes a config with default values (#679) + - Implemented the `ColumnType` interfaces (#667, #724) + - Support for custom string types in `ConvertValue` (#623) + - Implemented `NamedValueChecker`, improving support for uint64 with high bit set (#690, #709, #710) + - `caching_sha2_password` authentication plugin support (#794, #800, #801, #802) + - Implemented `driver.SessionResetter` (#779) + - `sha256_password` authentication plugin support (#808) + +Bugfixes: + + - Use the DSN hostname as TLS default ServerName if `tls=true` (#564, #718) + - Fixed LOAD LOCAL DATA INFILE for empty files (#590) + - Removed columns definition cache since it sometimes cached invalid data (#592) + - Don't mutate registered TLS configs (#600) + - Make RegisterTLSConfig concurrency-safe (#613) + - Handle missing auth data in the handshake packet correctly (#646) + - Do not retry queries when data was written to avoid data corruption (#302, #736) + - Cache the connection pointer for error handling before invalidating it (#678) + - Fixed imports for appengine/cloudsql (#700) + - Fix sending STMT_LONG_DATA for 0 byte data (#734) + - Set correct capacity for []bytes read from length-encoded strings (#766) + - Make RegisterDial concurrency-safe (#773) + + +## Version 1.3 (2016-12-01) + +Changes: + + - Go 1.1 is no longer supported + - Use decimals fields in MySQL to format time types (#249) + - Buffer optimizations (#269) + - TLS ServerName defaults to the host (#283) + - Refactoring (#400, #410, #437) + - Adjusted documentation for second generation CloudSQL (#485) + - Documented DSN system var quoting rules (#502) + - Made statement.Close() calls idempotent to avoid errors in Go 1.6+ (#512) + +New Features: + + - Enable microsecond resolution on TIME, DATETIME and TIMESTAMP (#249) + - Support for returning table alias on Columns() (#289, #359, #382) + - Placeholder interpolation, can be actived with the DSN parameter `interpolateParams=true` (#309, #318, #490) + - Support for uint64 parameters with high bit set (#332, #345) + - Cleartext authentication plugin support (#327) + - Exported ParseDSN function and the Config struct (#403, #419, #429) + - Read / Write timeouts (#401) + - Support for JSON field type (#414) + - Support for multi-statements and multi-results (#411, #431) + - DSN parameter to set the driver-side max_allowed_packet value manually (#489) + - Native password authentication plugin support (#494, #524) + +Bugfixes: + + - Fixed handling of queries without columns and rows (#255) + - Fixed a panic when SetKeepAlive() failed (#298) + - Handle ERR packets while reading rows (#321) + - Fixed reading NULL length-encoded integers in MySQL 5.6+ (#349) + - Fixed absolute paths support in LOAD LOCAL DATA INFILE (#356) + - Actually zero out bytes in handshake response (#378) + - Fixed race condition in registering LOAD DATA INFILE handler (#383) + - Fixed tests with MySQL 5.7.9+ (#380) + - QueryUnescape TLS config names (#397) + - Fixed "broken pipe" error by writing to closed socket (#390) + - Fixed LOAD LOCAL DATA INFILE buffering (#424) + - Fixed parsing of floats into float64 when placeholders are used (#434) + - Fixed DSN tests with Go 1.7+ (#459) + - Handle ERR packets while waiting for EOF (#473) + - Invalidate connection on error while discarding additional results (#513) + - Allow terminating packets of length 0 (#516) + + +## Version 1.2 (2014-06-03) + +Changes: + + - We switched back to a "rolling release". `go get` installs the current master branch again + - Version v1 of the driver will not be maintained anymore. Go 1.0 is no longer supported by this driver + - Exported errors to allow easy checking from application code + - Enabled TCP Keepalives on TCP connections + - Optimized INFILE handling (better buffer size calculation, lazy init, ...) + - The DSN parser also checks for a missing separating slash + - Faster binary date / datetime to string formatting + - Also exported the MySQLWarning type + - mysqlConn.Close returns the first error encountered instead of ignoring all errors + - writePacket() automatically writes the packet size to the header + - readPacket() uses an iterative approach instead of the recursive approach to merge splitted packets + +New Features: + + - `RegisterDial` allows the usage of a custom dial function to establish the network connection + - Setting the connection collation is possible with the `collation` DSN parameter. This parameter should be preferred over the `charset` parameter + - Logging of critical errors is configurable with `SetLogger` + - Google CloudSQL support + +Bugfixes: + + - Allow more than 32 parameters in prepared statements + - Various old_password fixes + - Fixed TestConcurrent test to pass Go's race detection + - Fixed appendLengthEncodedInteger for large numbers + - Renamed readLengthEnodedString to readLengthEncodedString and skipLengthEnodedString to skipLengthEncodedString (fixed typo) + + +## Version 1.1 (2013-11-02) + +Changes: + + - Go-MySQL-Driver now requires Go 1.1 + - Connections now use the collation `utf8_general_ci` by default. Adding `&charset=UTF8` to the DSN should not be necessary anymore + - Made closing rows and connections error tolerant. This allows for example deferring rows.Close() without checking for errors + - `[]byte(nil)` is now treated as a NULL value. Before, it was treated like an empty string / `[]byte("")` + - DSN parameter values must now be url.QueryEscape'ed. This allows text values to contain special characters, such as '&'. + - Use the IO buffer also for writing. This results in zero allocations (by the driver) for most queries + - Optimized the buffer for reading + - stmt.Query now caches column metadata + - New Logo + - Changed the copyright header to include all contributors + - Improved the LOAD INFILE documentation + - The driver struct is now exported to make the driver directly accessible + - Refactored the driver tests + - Added more benchmarks and moved all to a separate file + - Other small refactoring + +New Features: + + - Added *old_passwords* support: Required in some cases, but must be enabled by adding `allowOldPasswords=true` to the DSN since it is insecure + - Added a `clientFoundRows` parameter: Return the number of matching rows instead of the number of rows changed on UPDATEs + - Added TLS/SSL support: Use a TLS/SSL encrypted connection to the server. Custom TLS configs can be registered and used + +Bugfixes: + + - Fixed MySQL 4.1 support: MySQL 4.1 sends packets with lengths which differ from the specification + - Convert to DB timezone when inserting `time.Time` + - Splitted packets (more than 16MB) are now merged correctly + - Fixed false positive `io.EOF` errors when the data was fully read + - Avoid panics on reuse of closed connections + - Fixed empty string producing false nil values + - Fixed sign byte for positive TIME fields + + +## Version 1.0 (2013-05-14) + +Initial Release diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/CONTRIBUTING.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/CONTRIBUTING.md new file mode 100644 index 0000000000000000000000000000000000000000..8fe16bcb497b7ce4bfa7deac567276ead4c17f81 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/CONTRIBUTING.md @@ -0,0 +1,23 @@ +# Contributing Guidelines + +## Reporting Issues + +Before creating a new Issue, please check first if a similar Issue [already exists](https://github.com/go-sql-driver/mysql/issues?state=open) or was [recently closed](https://github.com/go-sql-driver/mysql/issues?direction=desc&page=1&sort=updated&state=closed). + +## Contributing Code + +By contributing to this project, you share your code under the Mozilla Public License 2, as specified in the LICENSE file. +Don't forget to add yourself to the AUTHORS file. + +### Code Review + +Everyone is invited to review and comment on pull requests. +If it looks fine to you, comment with "LGTM" (Looks good to me). + +If changes are required, notice the reviewers with "PTAL" (Please take another look) after committing the fixes. + +Before merging the Pull Request, at least one [team member](https://github.com/go-sql-driver?tab=members) must have commented with "LGTM". + +## Development Ideas + +If you are looking for ideas for code contributions, please check our [Development Ideas](https://github.com/go-sql-driver/mysql/wiki/Development-Ideas) Wiki page. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/LICENSE b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..14e2f777f6c395e7e04ab4aa306bbcc4b0c1120e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/README.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/README.md new file mode 100644 index 0000000000000000000000000000000000000000..7e7df1a3dce1e9cb0da009c223d69777c8244a89 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/README.md @@ -0,0 +1,490 @@ +# Go-MySQL-Driver + +A MySQL-Driver for Go's [database/sql](https://golang.org/pkg/database/sql/) package + +![Go-MySQL-Driver logo](https://raw.github.com/wiki/go-sql-driver/mysql/gomysql_m.png "Golang Gopher holding the MySQL Dolphin") + +--------------------------------------- + * [Features](#features) + * [Requirements](#requirements) + * [Installation](#installation) + * [Usage](#usage) + * [DSN (Data Source Name)](#dsn-data-source-name) + * [Password](#password) + * [Protocol](#protocol) + * [Address](#address) + * [Parameters](#parameters) + * [Examples](#examples) + * [Connection pool and timeouts](#connection-pool-and-timeouts) + * [context.Context Support](#contextcontext-support) + * [ColumnType Support](#columntype-support) + * [LOAD DATA LOCAL INFILE support](#load-data-local-infile-support) + * [time.Time support](#timetime-support) + * [Unicode support](#unicode-support) + * [Testing / Development](#testing--development) + * [License](#license) + +--------------------------------------- + +## Features + * Lightweight and [fast](https://github.com/go-sql-driver/sql-benchmark "golang MySQL-Driver performance") + * Native Go implementation. No C-bindings, just pure Go + * Connections over TCP/IPv4, TCP/IPv6, Unix domain sockets or [custom protocols](https://godoc.org/github.com/go-sql-driver/mysql#DialFunc) + * Automatic handling of broken connections + * Automatic Connection Pooling *(by database/sql package)* + * Supports queries larger than 16MB + * Full [`sql.RawBytes`](https://golang.org/pkg/database/sql/#RawBytes) support. + * Intelligent `LONG DATA` handling in prepared statements + * Secure `LOAD DATA LOCAL INFILE` support with file Whitelisting and `io.Reader` support + * Optional `time.Time` parsing + * Optional placeholder interpolation + +## Requirements + * Go 1.8 or higher. We aim to support the 3 latest versions of Go. + * MySQL (4.1+), MariaDB, Percona Server, Google CloudSQL or Sphinx (2.2.3+) + +--------------------------------------- + +## Installation +Simple install the package to your [$GOPATH](https://github.com/golang/go/wiki/GOPATH "GOPATH") with the [go tool](https://golang.org/cmd/go/ "go command") from shell: +```bash +$ go get -u github.com/go-sql-driver/mysql +``` +Make sure [Git is installed](https://git-scm.com/downloads) on your machine and in your system's `PATH`. + +## Usage +_Go MySQL Driver_ is an implementation of Go's `database/sql/driver` interface. You only need to import the driver and can use the full [`database/sql`](https://golang.org/pkg/database/sql/) API then. + +Use `mysql` as `driverName` and a valid [DSN](#dsn-data-source-name) as `dataSourceName`: +```go +import "database/sql" +import _ "github.com/go-sql-driver/mysql" + +db, err := sql.Open("mysql", "user:password@/dbname") +``` + +[Examples are available in our Wiki](https://github.com/go-sql-driver/mysql/wiki/Examples "Go-MySQL-Driver Examples"). + + +### DSN (Data Source Name) + +The Data Source Name has a common format, like e.g. [PEAR DB](http://pear.php.net/manual/en/package.database.db.intro-dsn.php) uses it, but without type-prefix (optional parts marked by squared brackets): +``` +[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...&paramN=valueN] +``` + +A DSN in its fullest form: +``` +username:password@protocol(address)/dbname?param=value +``` + +Except for the databasename, all values are optional. So the minimal DSN is: +``` +/dbname +``` + +If you do not want to preselect a database, leave `dbname` empty: +``` +/ +``` +This has the same effect as an empty DSN string: +``` + +``` + +Alternatively, [Config.FormatDSN](https://godoc.org/github.com/go-sql-driver/mysql#Config.FormatDSN) can be used to create a DSN string by filling a struct. + +#### Password +Passwords can consist of any character. Escaping is **not** necessary. + +#### Protocol +See [net.Dial](https://golang.org/pkg/net/#Dial) for more information which networks are available. +In general you should use an Unix domain socket if available and TCP otherwise for best performance. + +#### Address +For TCP and UDP networks, addresses have the form `host[:port]`. +If `port` is omitted, the default port will be used. +If `host` is a literal IPv6 address, it must be enclosed in square brackets. +The functions [net.JoinHostPort](https://golang.org/pkg/net/#JoinHostPort) and [net.SplitHostPort](https://golang.org/pkg/net/#SplitHostPort) manipulate addresses in this form. + +For Unix domain sockets the address is the absolute path to the MySQL-Server-socket, e.g. `/var/run/mysqld/mysqld.sock` or `/tmp/mysql.sock`. + +#### Parameters +*Parameters are case-sensitive!* + +Notice that any of `true`, `TRUE`, `True` or `1` is accepted to stand for a true boolean value. Not surprisingly, false can be specified as any of: `false`, `FALSE`, `False` or `0`. + +##### `allowAllFiles` + +``` +Type: bool +Valid Values: true, false +Default: false +``` + +`allowAllFiles=true` disables the file Whitelist for `LOAD DATA LOCAL INFILE` and allows *all* files. +[*Might be insecure!*](http://dev.mysql.com/doc/refman/5.7/en/load-data-local.html) + +##### `allowCleartextPasswords` + +``` +Type: bool +Valid Values: true, false +Default: false +``` + +`allowCleartextPasswords=true` allows using the [cleartext client side plugin](http://dev.mysql.com/doc/en/cleartext-authentication-plugin.html) if required by an account, such as one defined with the [PAM authentication plugin](http://dev.mysql.com/doc/en/pam-authentication-plugin.html). Sending passwords in clear text may be a security problem in some configurations. To avoid problems if there is any possibility that the password would be intercepted, clients should connect to MySQL Server using a method that protects the password. Possibilities include [TLS / SSL](#tls), IPsec, or a private network. + +##### `allowNativePasswords` + +``` +Type: bool +Valid Values: true, false +Default: true +``` +`allowNativePasswords=false` disallows the usage of MySQL native password method. + +##### `allowOldPasswords` + +``` +Type: bool +Valid Values: true, false +Default: false +``` +`allowOldPasswords=true` allows the usage of the insecure old password method. This should be avoided, but is necessary in some cases. See also [the old_passwords wiki page](https://github.com/go-sql-driver/mysql/wiki/old_passwords). + +##### `charset` + +``` +Type: string +Valid Values: <name> +Default: none +``` + +Sets the charset used for client-server interaction (`"SET NAMES <value>"`). If multiple charsets are set (separated by a comma), the following charset is used if setting the charset failes. This enables for example support for `utf8mb4` ([introduced in MySQL 5.5.3](http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html)) with fallback to `utf8` for older servers (`charset=utf8mb4,utf8`). + +Usage of the `charset` parameter is discouraged because it issues additional queries to the server. +Unless you need the fallback behavior, please use `collation` instead. + +##### `collation` + +``` +Type: string +Valid Values: <name> +Default: utf8_general_ci +``` + +Sets the collation used for client-server interaction on connection. In contrast to `charset`, `collation` does not issue additional queries. If the specified collation is unavailable on the target server, the connection will fail. + +A list of valid charsets for a server is retrievable with `SHOW COLLATION`. + +##### `clientFoundRows` + +``` +Type: bool +Valid Values: true, false +Default: false +``` + +`clientFoundRows=true` causes an UPDATE to return the number of matching rows instead of the number of rows changed. + +##### `columnsWithAlias` + +``` +Type: bool +Valid Values: true, false +Default: false +``` + +When `columnsWithAlias` is true, calls to `sql.Rows.Columns()` will return the table alias and the column name separated by a dot. For example: + +``` +SELECT u.id FROM users as u +``` + +will return `u.id` instead of just `id` if `columnsWithAlias=true`. + +##### `interpolateParams` + +``` +Type: bool +Valid Values: true, false +Default: false +``` + +If `interpolateParams` is true, placeholders (`?`) in calls to `db.Query()` and `db.Exec()` are interpolated into a single query string with given parameters. This reduces the number of roundtrips, since the driver has to prepare a statement, execute it with given parameters and close the statement again with `interpolateParams=false`. + +*This can not be used together with the multibyte encodings BIG5, CP932, GB2312, GBK or SJIS. These are blacklisted as they may [introduce a SQL injection vulnerability](http://stackoverflow.com/a/12118602/3430118)!* + +##### `loc` + +``` +Type: string +Valid Values: <escaped name> +Default: UTC +``` + +Sets the location for time.Time values (when using `parseTime=true`). *"Local"* sets the system's location. See [time.LoadLocation](https://golang.org/pkg/time/#LoadLocation) for details. + +Note that this sets the location for time.Time values but does not change MySQL's [time_zone setting](https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html). For that see the [time_zone system variable](#system-variables), which can also be set as a DSN parameter. + +Please keep in mind, that param values must be [url.QueryEscape](https://golang.org/pkg/net/url/#QueryEscape)'ed. Alternatively you can manually replace the `/` with `%2F`. For example `US/Pacific` would be `loc=US%2FPacific`. + +##### `maxAllowedPacket` +``` +Type: decimal number +Default: 4194304 +``` + +Max packet size allowed in bytes. The default value is 4 MiB and should be adjusted to match the server settings. `maxAllowedPacket=0` can be used to automatically fetch the `max_allowed_packet` variable from server *on every connection*. + +##### `multiStatements` + +``` +Type: bool +Valid Values: true, false +Default: false +``` + +Allow multiple statements in one query. While this allows batch queries, it also greatly increases the risk of SQL injections. Only the result of the first query is returned, all other results are silently discarded. + +When `multiStatements` is used, `?` parameters must only be used in the first statement. + +##### `parseTime` + +``` +Type: bool +Valid Values: true, false +Default: false +``` + +`parseTime=true` changes the output type of `DATE` and `DATETIME` values to `time.Time` instead of `[]byte` / `string` +The date or datetime like `0000-00-00 00:00:00` is converted into zero value of `time.Time`. + + +##### `readTimeout` + +``` +Type: duration +Default: 0 +``` + +I/O read timeout. The value must be a decimal number with a unit suffix (*"ms"*, *"s"*, *"m"*, *"h"*), such as *"30s"*, *"0.5m"* or *"1m30s"*. + +##### `rejectReadOnly` + +``` +Type: bool +Valid Values: true, false +Default: false +``` + + +`rejectReadOnly=true` causes the driver to reject read-only connections. This +is for a possible race condition during an automatic failover, where the mysql +client gets connected to a read-only replica after the failover. + +Note that this should be a fairly rare case, as an automatic failover normally +happens when the primary is down, and the race condition shouldn't happen +unless it comes back up online as soon as the failover is kicked off. On the +other hand, when this happens, a MySQL application can get stuck on a +read-only connection until restarted. It is however fairly easy to reproduce, +for example, using a manual failover on AWS Aurora's MySQL-compatible cluster. + +If you are not relying on read-only transactions to reject writes that aren't +supposed to happen, setting this on some MySQL providers (such as AWS Aurora) +is safer for failovers. + +Note that ERROR 1290 can be returned for a `read-only` server and this option will +cause a retry for that error. However the same error number is used for some +other cases. You should ensure your application will never cause an ERROR 1290 +except for `read-only` mode when enabling this option. + + +##### `serverPubKey` + +``` +Type: string +Valid Values: <name> +Default: none +``` + +Server public keys can be registered with [`mysql.RegisterServerPubKey`](https://godoc.org/github.com/go-sql-driver/mysql#RegisterServerPubKey), which can then be used by the assigned name in the DSN. +Public keys are used to transmit encrypted data, e.g. for authentication. +If the server's public key is known, it should be set manually to avoid expensive and potentially insecure transmissions of the public key from the server to the client each time it is required. + + +##### `timeout` + +``` +Type: duration +Default: OS default +``` + +Timeout for establishing connections, aka dial timeout. The value must be a decimal number with a unit suffix (*"ms"*, *"s"*, *"m"*, *"h"*), such as *"30s"*, *"0.5m"* or *"1m30s"*. + + +##### `tls` + +``` +Type: bool / string +Valid Values: true, false, skip-verify, <name> +Default: false +``` + +`tls=true` enables TLS / SSL encrypted connection to the server. Use `skip-verify` if you want to use a self-signed or invalid certificate (server side). Use a custom value registered with [`mysql.RegisterTLSConfig`](https://godoc.org/github.com/go-sql-driver/mysql#RegisterTLSConfig). + + +##### `writeTimeout` + +``` +Type: duration +Default: 0 +``` + +I/O write timeout. The value must be a decimal number with a unit suffix (*"ms"*, *"s"*, *"m"*, *"h"*), such as *"30s"*, *"0.5m"* or *"1m30s"*. + + +##### System Variables + +Any other parameters are interpreted as system variables: + * `<boolean_var>=<value>`: `SET <boolean_var>=<value>` + * `<enum_var>=<value>`: `SET <enum_var>=<value>` + * `<string_var>=%27<value>%27`: `SET <string_var>='<value>'` + +Rules: +* The values for string variables must be quoted with `'`. +* The values must also be [url.QueryEscape](http://golang.org/pkg/net/url/#QueryEscape)'ed! + (which implies values of string variables must be wrapped with `%27`). + +Examples: + * `autocommit=1`: `SET autocommit=1` + * [`time_zone=%27Europe%2FParis%27`](https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html): `SET time_zone='Europe/Paris'` + * [`tx_isolation=%27REPEATABLE-READ%27`](https://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_tx_isolation): `SET tx_isolation='REPEATABLE-READ'` + + +#### Examples +``` +user@unix(/path/to/socket)/dbname +``` + +``` +root:pw@unix(/tmp/mysql.sock)/myDatabase?loc=Local +``` + +``` +user:password@tcp(localhost:5555)/dbname?tls=skip-verify&autocommit=true +``` + +Treat warnings as errors by setting the system variable [`sql_mode`](https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html): +``` +user:password@/dbname?sql_mode=TRADITIONAL +``` + +TCP via IPv6: +``` +user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname?timeout=90s&collation=utf8mb4_unicode_ci +``` + +TCP on a remote host, e.g. Amazon RDS: +``` +id:password@tcp(your-amazonaws-uri.com:3306)/dbname +``` + +Google Cloud SQL on App Engine (First Generation MySQL Server): +``` +user@cloudsql(project-id:instance-name)/dbname +``` + +Google Cloud SQL on App Engine (Second Generation MySQL Server): +``` +user@cloudsql(project-id:regionname:instance-name)/dbname +``` + +TCP using default port (3306) on localhost: +``` +user:password@tcp/dbname?charset=utf8mb4,utf8&sys_var=esc%40ped +``` + +Use the default protocol (tcp) and host (localhost:3306): +``` +user:password@/dbname +``` + +No Database preselected: +``` +user:password@/ +``` + + +### Connection pool and timeouts +The connection pool is managed by Go's database/sql package. For details on how to configure the size of the pool and how long connections stay in the pool see `*DB.SetMaxOpenConns`, `*DB.SetMaxIdleConns`, and `*DB.SetConnMaxLifetime` in the [database/sql documentation](https://golang.org/pkg/database/sql/). The read, write, and dial timeouts for each individual connection are configured with the DSN parameters [`readTimeout`](#readtimeout), [`writeTimeout`](#writetimeout), and [`timeout`](#timeout), respectively. + +## `ColumnType` Support +This driver supports the [`ColumnType` interface](https://golang.org/pkg/database/sql/#ColumnType) introduced in Go 1.8, with the exception of [`ColumnType.Length()`](https://golang.org/pkg/database/sql/#ColumnType.Length), which is currently not supported. + +## `context.Context` Support +Go 1.8 added `database/sql` support for `context.Context`. This driver supports query timeouts and cancellation via contexts. +See [context support in the database/sql package](https://golang.org/doc/go1.8#database_sql) for more details. + + +### `LOAD DATA LOCAL INFILE` support +For this feature you need direct access to the package. Therefore you must change the import path (no `_`): +```go +import "github.com/go-sql-driver/mysql" +``` + +Files must be whitelisted by registering them with `mysql.RegisterLocalFile(filepath)` (recommended) or the Whitelist check must be deactivated by using the DSN parameter `allowAllFiles=true` ([*Might be insecure!*](http://dev.mysql.com/doc/refman/5.7/en/load-data-local.html)). + +To use a `io.Reader` a handler function must be registered with `mysql.RegisterReaderHandler(name, handler)` which returns a `io.Reader` or `io.ReadCloser`. The Reader is available with the filepath `Reader::<name>` then. Choose different names for different handlers and `DeregisterReaderHandler` when you don't need it anymore. + +See the [godoc of Go-MySQL-Driver](https://godoc.org/github.com/go-sql-driver/mysql "golang mysql driver documentation") for details. + + +### `time.Time` support +The default internal output type of MySQL `DATE` and `DATETIME` values is `[]byte` which allows you to scan the value into a `[]byte`, `string` or `sql.RawBytes` variable in your program. + +However, many want to scan MySQL `DATE` and `DATETIME` values into `time.Time` variables, which is the logical opposite in Go to `DATE` and `DATETIME` in MySQL. You can do that by changing the internal output type from `[]byte` to `time.Time` with the DSN parameter `parseTime=true`. You can set the default [`time.Time` location](https://golang.org/pkg/time/#Location) with the `loc` DSN parameter. + +**Caution:** As of Go 1.1, this makes `time.Time` the only variable type you can scan `DATE` and `DATETIME` values into. This breaks for example [`sql.RawBytes` support](https://github.com/go-sql-driver/mysql/wiki/Examples#rawbytes). + +Alternatively you can use the [`NullTime`](https://godoc.org/github.com/go-sql-driver/mysql#NullTime) type as the scan destination, which works with both `time.Time` and `string` / `[]byte`. + + +### Unicode support +Since version 1.1 Go-MySQL-Driver automatically uses the collation `utf8_general_ci` by default. + +Other collations / charsets can be set using the [`collation`](#collation) DSN parameter. + +Version 1.0 of the driver recommended adding `&charset=utf8` (alias for `SET NAMES utf8`) to the DSN to enable proper UTF-8 support. This is not necessary anymore. The [`collation`](#collation) parameter should be preferred to set another collation / charset than the default. + +See http://dev.mysql.com/doc/refman/5.7/en/charset-unicode.html for more details on MySQL's Unicode support. + +## Testing / Development +To run the driver tests you may need to adjust the configuration. See the [Testing Wiki-Page](https://github.com/go-sql-driver/mysql/wiki/Testing "Testing") for details. + +Go-MySQL-Driver is not feature-complete yet. Your help is very appreciated. +If you want to contribute, you can work on an [open issue](https://github.com/go-sql-driver/mysql/issues?state=open) or review a [pull request](https://github.com/go-sql-driver/mysql/pulls). + +See the [Contribution Guidelines](https://github.com/go-sql-driver/mysql/blob/master/CONTRIBUTING.md) for details. + +--------------------------------------- + +## License +Go-MySQL-Driver is licensed under the [Mozilla Public License Version 2.0](https://raw.github.com/go-sql-driver/mysql/master/LICENSE) + +Mozilla summarizes the license scope as follows: +> MPL: The copyleft applies to any files containing MPLed code. + + +That means: + * You can **use** the **unchanged** source code both in private and commercially. + * When distributing, you **must publish** the source code of any **changed files** licensed under the MPL 2.0 under a) the MPL 2.0 itself or b) a compatible license (e.g. GPL 3.0 or Apache License 2.0). + * You **needn't publish** the source code of your library as long as the files licensed under the MPL 2.0 are **unchanged**. + +Please read the [MPL 2.0 FAQ](https://www.mozilla.org/en-US/MPL/2.0/FAQ/) if you have further questions regarding the license. + +You can read the full terms here: [LICENSE](https://raw.github.com/go-sql-driver/mysql/master/LICENSE). + +![Go Gopher and MySQL Dolphin](https://raw.github.com/wiki/go-sql-driver/mysql/go-mysql-driver_m.jpg "Golang Gopher transporting the MySQL Dolphin in a wheelbarrow") + diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/appengine.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/appengine.go new file mode 100644 index 0000000000000000000000000000000000000000..be41f2ee6d7f87ee9153066a5afb2653e481071d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/appengine.go @@ -0,0 +1,19 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2013 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +// +build appengine + +package mysql + +import ( + "google.golang.org/appengine/cloudsql" +) + +func init() { + RegisterDial("cloudsql", cloudsql.Dial) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/auth.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/auth.go new file mode 100644 index 0000000000000000000000000000000000000000..2f61ecd4f545c40245ee11a64269fe4372bf30d4 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/auth.go @@ -0,0 +1,420 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2018 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +import ( + "crypto/rand" + "crypto/rsa" + "crypto/sha1" + "crypto/sha256" + "crypto/x509" + "encoding/pem" + "sync" +) + +// server pub keys registry +var ( + serverPubKeyLock sync.RWMutex + serverPubKeyRegistry map[string]*rsa.PublicKey +) + +// RegisterServerPubKey registers a server RSA public key which can be used to +// send data in a secure manner to the server without receiving the public key +// in a potentially insecure way from the server first. +// Registered keys can afterwards be used adding serverPubKey=<name> to the DSN. +// +// Note: The provided rsa.PublicKey instance is exclusively owned by the driver +// after registering it and may not be modified. +// +// data, err := ioutil.ReadFile("mykey.pem") +// if err != nil { +// log.Fatal(err) +// } +// +// block, _ := pem.Decode(data) +// if block == nil || block.Type != "PUBLIC KEY" { +// log.Fatal("failed to decode PEM block containing public key") +// } +// +// pub, err := x509.ParsePKIXPublicKey(block.Bytes) +// if err != nil { +// log.Fatal(err) +// } +// +// if rsaPubKey, ok := pub.(*rsa.PublicKey); ok { +// mysql.RegisterServerPubKey("mykey", rsaPubKey) +// } else { +// log.Fatal("not a RSA public key") +// } +// +func RegisterServerPubKey(name string, pubKey *rsa.PublicKey) { + serverPubKeyLock.Lock() + if serverPubKeyRegistry == nil { + serverPubKeyRegistry = make(map[string]*rsa.PublicKey) + } + + serverPubKeyRegistry[name] = pubKey + serverPubKeyLock.Unlock() +} + +// DeregisterServerPubKey removes the public key registered with the given name. +func DeregisterServerPubKey(name string) { + serverPubKeyLock.Lock() + if serverPubKeyRegistry != nil { + delete(serverPubKeyRegistry, name) + } + serverPubKeyLock.Unlock() +} + +func getServerPubKey(name string) (pubKey *rsa.PublicKey) { + serverPubKeyLock.RLock() + if v, ok := serverPubKeyRegistry[name]; ok { + pubKey = v + } + serverPubKeyLock.RUnlock() + return +} + +// Hash password using pre 4.1 (old password) method +// https://github.com/atcurtis/mariadb/blob/master/mysys/my_rnd.c +type myRnd struct { + seed1, seed2 uint32 +} + +const myRndMaxVal = 0x3FFFFFFF + +// Pseudo random number generator +func newMyRnd(seed1, seed2 uint32) *myRnd { + return &myRnd{ + seed1: seed1 % myRndMaxVal, + seed2: seed2 % myRndMaxVal, + } +} + +// Tested to be equivalent to MariaDB's floating point variant +// http://play.golang.org/p/QHvhd4qved +// http://play.golang.org/p/RG0q4ElWDx +func (r *myRnd) NextByte() byte { + r.seed1 = (r.seed1*3 + r.seed2) % myRndMaxVal + r.seed2 = (r.seed1 + r.seed2 + 33) % myRndMaxVal + + return byte(uint64(r.seed1) * 31 / myRndMaxVal) +} + +// Generate binary hash from byte string using insecure pre 4.1 method +func pwHash(password []byte) (result [2]uint32) { + var add uint32 = 7 + var tmp uint32 + + result[0] = 1345345333 + result[1] = 0x12345671 + + for _, c := range password { + // skip spaces and tabs in password + if c == ' ' || c == '\t' { + continue + } + + tmp = uint32(c) + result[0] ^= (((result[0] & 63) + add) * tmp) + (result[0] << 8) + result[1] += (result[1] << 8) ^ result[0] + add += tmp + } + + // Remove sign bit (1<<31)-1) + result[0] &= 0x7FFFFFFF + result[1] &= 0x7FFFFFFF + + return +} + +// Hash password using insecure pre 4.1 method +func scrambleOldPassword(scramble []byte, password string) []byte { + if len(password) == 0 { + return nil + } + + scramble = scramble[:8] + + hashPw := pwHash([]byte(password)) + hashSc := pwHash(scramble) + + r := newMyRnd(hashPw[0]^hashSc[0], hashPw[1]^hashSc[1]) + + var out [8]byte + for i := range out { + out[i] = r.NextByte() + 64 + } + + mask := r.NextByte() + for i := range out { + out[i] ^= mask + } + + return out[:] +} + +// Hash password using 4.1+ method (SHA1) +func scramblePassword(scramble []byte, password string) []byte { + if len(password) == 0 { + return nil + } + + // stage1Hash = SHA1(password) + crypt := sha1.New() + crypt.Write([]byte(password)) + stage1 := crypt.Sum(nil) + + // scrambleHash = SHA1(scramble + SHA1(stage1Hash)) + // inner Hash + crypt.Reset() + crypt.Write(stage1) + hash := crypt.Sum(nil) + + // outer Hash + crypt.Reset() + crypt.Write(scramble) + crypt.Write(hash) + scramble = crypt.Sum(nil) + + // token = scrambleHash XOR stage1Hash + for i := range scramble { + scramble[i] ^= stage1[i] + } + return scramble +} + +// Hash password using MySQL 8+ method (SHA256) +func scrambleSHA256Password(scramble []byte, password string) []byte { + if len(password) == 0 { + return nil + } + + // XOR(SHA256(password), SHA256(SHA256(SHA256(password)), scramble)) + + crypt := sha256.New() + crypt.Write([]byte(password)) + message1 := crypt.Sum(nil) + + crypt.Reset() + crypt.Write(message1) + message1Hash := crypt.Sum(nil) + + crypt.Reset() + crypt.Write(message1Hash) + crypt.Write(scramble) + message2 := crypt.Sum(nil) + + for i := range message1 { + message1[i] ^= message2[i] + } + + return message1 +} + +func encryptPassword(password string, seed []byte, pub *rsa.PublicKey) ([]byte, error) { + plain := make([]byte, len(password)+1) + copy(plain, password) + for i := range plain { + j := i % len(seed) + plain[i] ^= seed[j] + } + sha1 := sha1.New() + return rsa.EncryptOAEP(sha1, rand.Reader, pub, plain, nil) +} + +func (mc *mysqlConn) sendEncryptedPassword(seed []byte, pub *rsa.PublicKey) error { + enc, err := encryptPassword(mc.cfg.Passwd, seed, pub) + if err != nil { + return err + } + return mc.writeAuthSwitchPacket(enc, false) +} + +func (mc *mysqlConn) auth(authData []byte, plugin string) ([]byte, bool, error) { + switch plugin { + case "caching_sha2_password": + authResp := scrambleSHA256Password(authData, mc.cfg.Passwd) + return authResp, false, nil + + case "mysql_old_password": + if !mc.cfg.AllowOldPasswords { + return nil, false, ErrOldPassword + } + // Note: there are edge cases where this should work but doesn't; + // this is currently "wontfix": + // https://github.com/go-sql-driver/mysql/issues/184 + authResp := scrambleOldPassword(authData[:8], mc.cfg.Passwd) + return authResp, true, nil + + case "mysql_clear_password": + if !mc.cfg.AllowCleartextPasswords { + return nil, false, ErrCleartextPassword + } + // http://dev.mysql.com/doc/refman/5.7/en/cleartext-authentication-plugin.html + // http://dev.mysql.com/doc/refman/5.7/en/pam-authentication-plugin.html + return []byte(mc.cfg.Passwd), true, nil + + case "mysql_native_password": + if !mc.cfg.AllowNativePasswords { + return nil, false, ErrNativePassword + } + // https://dev.mysql.com/doc/internals/en/secure-password-authentication.html + // Native password authentication only need and will need 20-byte challenge. + authResp := scramblePassword(authData[:20], mc.cfg.Passwd) + return authResp, false, nil + + case "sha256_password": + if len(mc.cfg.Passwd) == 0 { + return nil, true, nil + } + if mc.cfg.tls != nil || mc.cfg.Net == "unix" { + // write cleartext auth packet + return []byte(mc.cfg.Passwd), true, nil + } + + pubKey := mc.cfg.pubKey + if pubKey == nil { + // request public key from server + return []byte{1}, false, nil + } + + // encrypted password + enc, err := encryptPassword(mc.cfg.Passwd, authData, pubKey) + return enc, false, err + + default: + errLog.Print("unknown auth plugin:", plugin) + return nil, false, ErrUnknownPlugin + } +} + +func (mc *mysqlConn) handleAuthResult(oldAuthData []byte, plugin string) error { + // Read Result Packet + authData, newPlugin, err := mc.readAuthResult() + if err != nil { + return err + } + + // handle auth plugin switch, if requested + if newPlugin != "" { + // If CLIENT_PLUGIN_AUTH capability is not supported, no new cipher is + // sent and we have to keep using the cipher sent in the init packet. + if authData == nil { + authData = oldAuthData + } else { + // copy data from read buffer to owned slice + copy(oldAuthData, authData) + } + + plugin = newPlugin + + authResp, addNUL, err := mc.auth(authData, plugin) + if err != nil { + return err + } + if err = mc.writeAuthSwitchPacket(authResp, addNUL); err != nil { + return err + } + + // Read Result Packet + authData, newPlugin, err = mc.readAuthResult() + if err != nil { + return err + } + + // Do not allow to change the auth plugin more than once + if newPlugin != "" { + return ErrMalformPkt + } + } + + switch plugin { + + // https://insidemysql.com/preparing-your-community-connector-for-mysql-8-part-2-sha256/ + case "caching_sha2_password": + switch len(authData) { + case 0: + return nil // auth successful + case 1: + switch authData[0] { + case cachingSha2PasswordFastAuthSuccess: + if err = mc.readResultOK(); err == nil { + return nil // auth successful + } + + case cachingSha2PasswordPerformFullAuthentication: + if mc.cfg.tls != nil || mc.cfg.Net == "unix" { + // write cleartext auth packet + err = mc.writeAuthSwitchPacket([]byte(mc.cfg.Passwd), true) + if err != nil { + return err + } + } else { + pubKey := mc.cfg.pubKey + if pubKey == nil { + // request public key from server + data := mc.buf.takeSmallBuffer(4 + 1) + data[4] = cachingSha2PasswordRequestPublicKey + mc.writePacket(data) + + // parse public key + data, err := mc.readPacket() + if err != nil { + return err + } + + block, _ := pem.Decode(data[1:]) + pkix, err := x509.ParsePKIXPublicKey(block.Bytes) + if err != nil { + return err + } + pubKey = pkix.(*rsa.PublicKey) + } + + // send encrypted password + err = mc.sendEncryptedPassword(oldAuthData, pubKey) + if err != nil { + return err + } + } + return mc.readResultOK() + + default: + return ErrMalformPkt + } + default: + return ErrMalformPkt + } + + case "sha256_password": + switch len(authData) { + case 0: + return nil // auth successful + default: + block, _ := pem.Decode(authData) + pub, err := x509.ParsePKIXPublicKey(block.Bytes) + if err != nil { + return err + } + + // send encrypted password + err = mc.sendEncryptedPassword(oldAuthData, pub.(*rsa.PublicKey)) + if err != nil { + return err + } + return mc.readResultOK() + } + + default: + return nil // auth successful + } + + return err +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/buffer.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/buffer.go new file mode 100644 index 0000000000000000000000000000000000000000..eb4748bf448d65ee672198b651a4cc149ba8701d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/buffer.go @@ -0,0 +1,147 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2013 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +import ( + "io" + "net" + "time" +) + +const defaultBufSize = 4096 + +// A buffer which is used for both reading and writing. +// This is possible since communication on each connection is synchronous. +// In other words, we can't write and read simultaneously on the same connection. +// The buffer is similar to bufio.Reader / Writer but zero-copy-ish +// Also highly optimized for this particular use case. +type buffer struct { + buf []byte + nc net.Conn + idx int + length int + timeout time.Duration +} + +func newBuffer(nc net.Conn) buffer { + var b [defaultBufSize]byte + return buffer{ + buf: b[:], + nc: nc, + } +} + +// fill reads into the buffer until at least _need_ bytes are in it +func (b *buffer) fill(need int) error { + n := b.length + + // move existing data to the beginning + if n > 0 && b.idx > 0 { + copy(b.buf[0:n], b.buf[b.idx:]) + } + + // grow buffer if necessary + // TODO: let the buffer shrink again at some point + // Maybe keep the org buf slice and swap back? + if need > len(b.buf) { + // Round up to the next multiple of the default size + newBuf := make([]byte, ((need/defaultBufSize)+1)*defaultBufSize) + copy(newBuf, b.buf) + b.buf = newBuf + } + + b.idx = 0 + + for { + if b.timeout > 0 { + if err := b.nc.SetReadDeadline(time.Now().Add(b.timeout)); err != nil { + return err + } + } + + nn, err := b.nc.Read(b.buf[n:]) + n += nn + + switch err { + case nil: + if n < need { + continue + } + b.length = n + return nil + + case io.EOF: + if n >= need { + b.length = n + return nil + } + return io.ErrUnexpectedEOF + + default: + return err + } + } +} + +// returns next N bytes from buffer. +// The returned slice is only guaranteed to be valid until the next read +func (b *buffer) readNext(need int) ([]byte, error) { + if b.length < need { + // refill + if err := b.fill(need); err != nil { + return nil, err + } + } + + offset := b.idx + b.idx += need + b.length -= need + return b.buf[offset:b.idx], nil +} + +// returns a buffer with the requested size. +// If possible, a slice from the existing buffer is returned. +// Otherwise a bigger buffer is made. +// Only one buffer (total) can be used at a time. +func (b *buffer) takeBuffer(length int) []byte { + if b.length > 0 { + return nil + } + + // test (cheap) general case first + if length <= defaultBufSize || length <= cap(b.buf) { + return b.buf[:length] + } + + if length < maxPacketSize { + b.buf = make([]byte, length) + return b.buf + } + return make([]byte, length) +} + +// shortcut which can be used if the requested buffer is guaranteed to be +// smaller than defaultBufSize +// Only one buffer (total) can be used at a time. +func (b *buffer) takeSmallBuffer(length int) []byte { + if b.length > 0 { + return nil + } + return b.buf[:length] +} + +// takeCompleteBuffer returns the complete existing buffer. +// This can be used if the necessary buffer size is unknown. +// Only one buffer (total) can be used at a time. +func (b *buffer) takeCompleteBuffer() []byte { + if b.length > 0 { + return nil + } + return b.buf +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/collations.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/collations.go new file mode 100644 index 0000000000000000000000000000000000000000..136c9e4d1e91cd855486aef047dc3f623a5f1d7a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/collations.go @@ -0,0 +1,251 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2014 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +const defaultCollation = "utf8_general_ci" +const binaryCollation = "binary" + +// A list of available collations mapped to the internal ID. +// To update this map use the following MySQL query: +// SELECT COLLATION_NAME, ID FROM information_schema.COLLATIONS +var collations = map[string]byte{ + "big5_chinese_ci": 1, + "latin2_czech_cs": 2, + "dec8_swedish_ci": 3, + "cp850_general_ci": 4, + "latin1_german1_ci": 5, + "hp8_english_ci": 6, + "koi8r_general_ci": 7, + "latin1_swedish_ci": 8, + "latin2_general_ci": 9, + "swe7_swedish_ci": 10, + "ascii_general_ci": 11, + "ujis_japanese_ci": 12, + "sjis_japanese_ci": 13, + "cp1251_bulgarian_ci": 14, + "latin1_danish_ci": 15, + "hebrew_general_ci": 16, + "tis620_thai_ci": 18, + "euckr_korean_ci": 19, + "latin7_estonian_cs": 20, + "latin2_hungarian_ci": 21, + "koi8u_general_ci": 22, + "cp1251_ukrainian_ci": 23, + "gb2312_chinese_ci": 24, + "greek_general_ci": 25, + "cp1250_general_ci": 26, + "latin2_croatian_ci": 27, + "gbk_chinese_ci": 28, + "cp1257_lithuanian_ci": 29, + "latin5_turkish_ci": 30, + "latin1_german2_ci": 31, + "armscii8_general_ci": 32, + "utf8_general_ci": 33, + "cp1250_czech_cs": 34, + "ucs2_general_ci": 35, + "cp866_general_ci": 36, + "keybcs2_general_ci": 37, + "macce_general_ci": 38, + "macroman_general_ci": 39, + "cp852_general_ci": 40, + "latin7_general_ci": 41, + "latin7_general_cs": 42, + "macce_bin": 43, + "cp1250_croatian_ci": 44, + "utf8mb4_general_ci": 45, + "utf8mb4_bin": 46, + "latin1_bin": 47, + "latin1_general_ci": 48, + "latin1_general_cs": 49, + "cp1251_bin": 50, + "cp1251_general_ci": 51, + "cp1251_general_cs": 52, + "macroman_bin": 53, + "utf16_general_ci": 54, + "utf16_bin": 55, + "utf16le_general_ci": 56, + "cp1256_general_ci": 57, + "cp1257_bin": 58, + "cp1257_general_ci": 59, + "utf32_general_ci": 60, + "utf32_bin": 61, + "utf16le_bin": 62, + "binary": 63, + "armscii8_bin": 64, + "ascii_bin": 65, + "cp1250_bin": 66, + "cp1256_bin": 67, + "cp866_bin": 68, + "dec8_bin": 69, + "greek_bin": 70, + "hebrew_bin": 71, + "hp8_bin": 72, + "keybcs2_bin": 73, + "koi8r_bin": 74, + "koi8u_bin": 75, + "latin2_bin": 77, + "latin5_bin": 78, + "latin7_bin": 79, + "cp850_bin": 80, + "cp852_bin": 81, + "swe7_bin": 82, + "utf8_bin": 83, + "big5_bin": 84, + "euckr_bin": 85, + "gb2312_bin": 86, + "gbk_bin": 87, + "sjis_bin": 88, + "tis620_bin": 89, + "ucs2_bin": 90, + "ujis_bin": 91, + "geostd8_general_ci": 92, + "geostd8_bin": 93, + "latin1_spanish_ci": 94, + "cp932_japanese_ci": 95, + "cp932_bin": 96, + "eucjpms_japanese_ci": 97, + "eucjpms_bin": 98, + "cp1250_polish_ci": 99, + "utf16_unicode_ci": 101, + "utf16_icelandic_ci": 102, + "utf16_latvian_ci": 103, + "utf16_romanian_ci": 104, + "utf16_slovenian_ci": 105, + "utf16_polish_ci": 106, + "utf16_estonian_ci": 107, + "utf16_spanish_ci": 108, + "utf16_swedish_ci": 109, + "utf16_turkish_ci": 110, + "utf16_czech_ci": 111, + "utf16_danish_ci": 112, + "utf16_lithuanian_ci": 113, + "utf16_slovak_ci": 114, + "utf16_spanish2_ci": 115, + "utf16_roman_ci": 116, + "utf16_persian_ci": 117, + "utf16_esperanto_ci": 118, + "utf16_hungarian_ci": 119, + "utf16_sinhala_ci": 120, + "utf16_german2_ci": 121, + "utf16_croatian_ci": 122, + "utf16_unicode_520_ci": 123, + "utf16_vietnamese_ci": 124, + "ucs2_unicode_ci": 128, + "ucs2_icelandic_ci": 129, + "ucs2_latvian_ci": 130, + "ucs2_romanian_ci": 131, + "ucs2_slovenian_ci": 132, + "ucs2_polish_ci": 133, + "ucs2_estonian_ci": 134, + "ucs2_spanish_ci": 135, + "ucs2_swedish_ci": 136, + "ucs2_turkish_ci": 137, + "ucs2_czech_ci": 138, + "ucs2_danish_ci": 139, + "ucs2_lithuanian_ci": 140, + "ucs2_slovak_ci": 141, + "ucs2_spanish2_ci": 142, + "ucs2_roman_ci": 143, + "ucs2_persian_ci": 144, + "ucs2_esperanto_ci": 145, + "ucs2_hungarian_ci": 146, + "ucs2_sinhala_ci": 147, + "ucs2_german2_ci": 148, + "ucs2_croatian_ci": 149, + "ucs2_unicode_520_ci": 150, + "ucs2_vietnamese_ci": 151, + "ucs2_general_mysql500_ci": 159, + "utf32_unicode_ci": 160, + "utf32_icelandic_ci": 161, + "utf32_latvian_ci": 162, + "utf32_romanian_ci": 163, + "utf32_slovenian_ci": 164, + "utf32_polish_ci": 165, + "utf32_estonian_ci": 166, + "utf32_spanish_ci": 167, + "utf32_swedish_ci": 168, + "utf32_turkish_ci": 169, + "utf32_czech_ci": 170, + "utf32_danish_ci": 171, + "utf32_lithuanian_ci": 172, + "utf32_slovak_ci": 173, + "utf32_spanish2_ci": 174, + "utf32_roman_ci": 175, + "utf32_persian_ci": 176, + "utf32_esperanto_ci": 177, + "utf32_hungarian_ci": 178, + "utf32_sinhala_ci": 179, + "utf32_german2_ci": 180, + "utf32_croatian_ci": 181, + "utf32_unicode_520_ci": 182, + "utf32_vietnamese_ci": 183, + "utf8_unicode_ci": 192, + "utf8_icelandic_ci": 193, + "utf8_latvian_ci": 194, + "utf8_romanian_ci": 195, + "utf8_slovenian_ci": 196, + "utf8_polish_ci": 197, + "utf8_estonian_ci": 198, + "utf8_spanish_ci": 199, + "utf8_swedish_ci": 200, + "utf8_turkish_ci": 201, + "utf8_czech_ci": 202, + "utf8_danish_ci": 203, + "utf8_lithuanian_ci": 204, + "utf8_slovak_ci": 205, + "utf8_spanish2_ci": 206, + "utf8_roman_ci": 207, + "utf8_persian_ci": 208, + "utf8_esperanto_ci": 209, + "utf8_hungarian_ci": 210, + "utf8_sinhala_ci": 211, + "utf8_german2_ci": 212, + "utf8_croatian_ci": 213, + "utf8_unicode_520_ci": 214, + "utf8_vietnamese_ci": 215, + "utf8_general_mysql500_ci": 223, + "utf8mb4_unicode_ci": 224, + "utf8mb4_icelandic_ci": 225, + "utf8mb4_latvian_ci": 226, + "utf8mb4_romanian_ci": 227, + "utf8mb4_slovenian_ci": 228, + "utf8mb4_polish_ci": 229, + "utf8mb4_estonian_ci": 230, + "utf8mb4_spanish_ci": 231, + "utf8mb4_swedish_ci": 232, + "utf8mb4_turkish_ci": 233, + "utf8mb4_czech_ci": 234, + "utf8mb4_danish_ci": 235, + "utf8mb4_lithuanian_ci": 236, + "utf8mb4_slovak_ci": 237, + "utf8mb4_spanish2_ci": 238, + "utf8mb4_roman_ci": 239, + "utf8mb4_persian_ci": 240, + "utf8mb4_esperanto_ci": 241, + "utf8mb4_hungarian_ci": 242, + "utf8mb4_sinhala_ci": 243, + "utf8mb4_german2_ci": 244, + "utf8mb4_croatian_ci": 245, + "utf8mb4_unicode_520_ci": 246, + "utf8mb4_vietnamese_ci": 247, +} + +// A blacklist of collations which is unsafe to interpolate parameters. +// These multibyte encodings may contains 0x5c (`\`) in their trailing bytes. +var unsafeCollations = map[string]bool{ + "big5_chinese_ci": true, + "sjis_japanese_ci": true, + "gbk_chinese_ci": true, + "big5_bin": true, + "gb2312_bin": true, + "gbk_bin": true, + "sjis_bin": true, + "cp932_japanese_ci": true, + "cp932_bin": true, +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/connection.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/connection.go new file mode 100644 index 0000000000000000000000000000000000000000..911be206046b63df0e177e65b80c0034fdf1c864 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/connection.go @@ -0,0 +1,654 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +import ( + "context" + "database/sql" + "database/sql/driver" + "io" + "net" + "strconv" + "strings" + "time" +) + +// a copy of context.Context for Go 1.7 and earlier +type mysqlContext interface { + Done() <-chan struct{} + Err() error + + // defined in context.Context, but not used in this driver: + // Deadline() (deadline time.Time, ok bool) + // Value(key interface{}) interface{} +} + +type mysqlConn struct { + buf buffer + netConn net.Conn + affectedRows uint64 + insertId uint64 + cfg *Config + maxAllowedPacket int + maxWriteSize int + writeTimeout time.Duration + flags clientFlag + status statusFlag + sequence uint8 + parseTime bool + + // for context support (Go 1.8+) + watching bool + watcher chan<- mysqlContext + closech chan struct{} + finished chan<- struct{} + canceled atomicError // set non-nil if conn is canceled + closed atomicBool // set when conn is closed, before closech is closed +} + +// Handles parameters set in DSN after the connection is established +func (mc *mysqlConn) handleParams() (err error) { + for param, val := range mc.cfg.Params { + switch param { + // Charset + case "charset": + charsets := strings.Split(val, ",") + for i := range charsets { + // ignore errors here - a charset may not exist + err = mc.exec("SET NAMES " + charsets[i]) + if err == nil { + break + } + } + if err != nil { + return + } + + // System Vars + default: + err = mc.exec("SET " + param + "=" + val + "") + if err != nil { + return + } + } + } + + return +} + +func (mc *mysqlConn) markBadConn(err error) error { + if mc == nil { + return err + } + if err != errBadConnNoWrite { + return err + } + return driver.ErrBadConn +} + +func (mc *mysqlConn) Begin() (driver.Tx, error) { + return mc.begin(false) +} + +func (mc *mysqlConn) begin(readOnly bool) (driver.Tx, error) { + if mc.closed.IsSet() { + errLog.Print(ErrInvalidConn) + return nil, driver.ErrBadConn + } + var q string + if readOnly { + q = "START TRANSACTION READ ONLY" + } else { + q = "START TRANSACTION" + } + err := mc.exec(q) + if err == nil { + return &mysqlTx{mc}, err + } + return nil, mc.markBadConn(err) +} + +func (mc *mysqlConn) Close() (err error) { + // Makes Close idempotent + if !mc.closed.IsSet() { + err = mc.writeCommandPacket(comQuit) + } + + mc.cleanup() + + return +} + +// Closes the network connection and unsets internal variables. Do not call this +// function after successfully authentication, call Close instead. This function +// is called before auth or on auth failure because MySQL will have already +// closed the network connection. +func (mc *mysqlConn) cleanup() { + if !mc.closed.TrySet(true) { + return + } + + // Makes cleanup idempotent + close(mc.closech) + if mc.netConn == nil { + return + } + if err := mc.netConn.Close(); err != nil { + errLog.Print(err) + } +} + +func (mc *mysqlConn) error() error { + if mc.closed.IsSet() { + if err := mc.canceled.Value(); err != nil { + return err + } + return ErrInvalidConn + } + return nil +} + +func (mc *mysqlConn) Prepare(query string) (driver.Stmt, error) { + if mc.closed.IsSet() { + errLog.Print(ErrInvalidConn) + return nil, driver.ErrBadConn + } + // Send command + err := mc.writeCommandPacketStr(comStmtPrepare, query) + if err != nil { + return nil, mc.markBadConn(err) + } + + stmt := &mysqlStmt{ + mc: mc, + } + + // Read Result + columnCount, err := stmt.readPrepareResultPacket() + if err == nil { + if stmt.paramCount > 0 { + if err = mc.readUntilEOF(); err != nil { + return nil, err + } + } + + if columnCount > 0 { + err = mc.readUntilEOF() + } + } + + return stmt, err +} + +func (mc *mysqlConn) interpolateParams(query string, args []driver.Value) (string, error) { + // Number of ? should be same to len(args) + if strings.Count(query, "?") != len(args) { + return "", driver.ErrSkip + } + + buf := mc.buf.takeCompleteBuffer() + if buf == nil { + // can not take the buffer. Something must be wrong with the connection + errLog.Print(ErrBusyBuffer) + return "", ErrInvalidConn + } + buf = buf[:0] + argPos := 0 + + for i := 0; i < len(query); i++ { + q := strings.IndexByte(query[i:], '?') + if q == -1 { + buf = append(buf, query[i:]...) + break + } + buf = append(buf, query[i:i+q]...) + i += q + + arg := args[argPos] + argPos++ + + if arg == nil { + buf = append(buf, "NULL"...) + continue + } + + switch v := arg.(type) { + case int64: + buf = strconv.AppendInt(buf, v, 10) + case float64: + buf = strconv.AppendFloat(buf, v, 'g', -1, 64) + case bool: + if v { + buf = append(buf, '1') + } else { + buf = append(buf, '0') + } + case time.Time: + if v.IsZero() { + buf = append(buf, "'0000-00-00'"...) + } else { + v := v.In(mc.cfg.Loc) + v = v.Add(time.Nanosecond * 500) // To round under microsecond + year := v.Year() + year100 := year / 100 + year1 := year % 100 + month := v.Month() + day := v.Day() + hour := v.Hour() + minute := v.Minute() + second := v.Second() + micro := v.Nanosecond() / 1000 + + buf = append(buf, []byte{ + '\'', + digits10[year100], digits01[year100], + digits10[year1], digits01[year1], + '-', + digits10[month], digits01[month], + '-', + digits10[day], digits01[day], + ' ', + digits10[hour], digits01[hour], + ':', + digits10[minute], digits01[minute], + ':', + digits10[second], digits01[second], + }...) + + if micro != 0 { + micro10000 := micro / 10000 + micro100 := micro / 100 % 100 + micro1 := micro % 100 + buf = append(buf, []byte{ + '.', + digits10[micro10000], digits01[micro10000], + digits10[micro100], digits01[micro100], + digits10[micro1], digits01[micro1], + }...) + } + buf = append(buf, '\'') + } + case []byte: + if v == nil { + buf = append(buf, "NULL"...) + } else { + buf = append(buf, "_binary'"...) + if mc.status&statusNoBackslashEscapes == 0 { + buf = escapeBytesBackslash(buf, v) + } else { + buf = escapeBytesQuotes(buf, v) + } + buf = append(buf, '\'') + } + case string: + buf = append(buf, '\'') + if mc.status&statusNoBackslashEscapes == 0 { + buf = escapeStringBackslash(buf, v) + } else { + buf = escapeStringQuotes(buf, v) + } + buf = append(buf, '\'') + default: + return "", driver.ErrSkip + } + + if len(buf)+4 > mc.maxAllowedPacket { + return "", driver.ErrSkip + } + } + if argPos != len(args) { + return "", driver.ErrSkip + } + return string(buf), nil +} + +func (mc *mysqlConn) Exec(query string, args []driver.Value) (driver.Result, error) { + if mc.closed.IsSet() { + errLog.Print(ErrInvalidConn) + return nil, driver.ErrBadConn + } + if len(args) != 0 { + if !mc.cfg.InterpolateParams { + return nil, driver.ErrSkip + } + // try to interpolate the parameters to save extra roundtrips for preparing and closing a statement + prepared, err := mc.interpolateParams(query, args) + if err != nil { + return nil, err + } + query = prepared + } + mc.affectedRows = 0 + mc.insertId = 0 + + err := mc.exec(query) + if err == nil { + return &mysqlResult{ + affectedRows: int64(mc.affectedRows), + insertId: int64(mc.insertId), + }, err + } + return nil, mc.markBadConn(err) +} + +// Internal function to execute commands +func (mc *mysqlConn) exec(query string) error { + // Send command + if err := mc.writeCommandPacketStr(comQuery, query); err != nil { + return mc.markBadConn(err) + } + + // Read Result + resLen, err := mc.readResultSetHeaderPacket() + if err != nil { + return err + } + + if resLen > 0 { + // columns + if err := mc.readUntilEOF(); err != nil { + return err + } + + // rows + if err := mc.readUntilEOF(); err != nil { + return err + } + } + + return mc.discardResults() +} + +func (mc *mysqlConn) Query(query string, args []driver.Value) (driver.Rows, error) { + return mc.query(query, args) +} + +func (mc *mysqlConn) query(query string, args []driver.Value) (*textRows, error) { + if mc.closed.IsSet() { + errLog.Print(ErrInvalidConn) + return nil, driver.ErrBadConn + } + if len(args) != 0 { + if !mc.cfg.InterpolateParams { + return nil, driver.ErrSkip + } + // try client-side prepare to reduce roundtrip + prepared, err := mc.interpolateParams(query, args) + if err != nil { + return nil, err + } + query = prepared + } + // Send command + err := mc.writeCommandPacketStr(comQuery, query) + if err == nil { + // Read Result + var resLen int + resLen, err = mc.readResultSetHeaderPacket() + if err == nil { + rows := new(textRows) + rows.mc = mc + + if resLen == 0 { + rows.rs.done = true + + switch err := rows.NextResultSet(); err { + case nil, io.EOF: + return rows, nil + default: + return nil, err + } + } + + // Columns + rows.rs.columns, err = mc.readColumns(resLen) + return rows, err + } + } + return nil, mc.markBadConn(err) +} + +// Gets the value of the given MySQL System Variable +// The returned byte slice is only valid until the next read +func (mc *mysqlConn) getSystemVar(name string) ([]byte, error) { + // Send command + if err := mc.writeCommandPacketStr(comQuery, "SELECT @@"+name); err != nil { + return nil, err + } + + // Read Result + resLen, err := mc.readResultSetHeaderPacket() + if err == nil { + rows := new(textRows) + rows.mc = mc + rows.rs.columns = []mysqlField{{fieldType: fieldTypeVarChar}} + + if resLen > 0 { + // Columns + if err := mc.readUntilEOF(); err != nil { + return nil, err + } + } + + dest := make([]driver.Value, resLen) + if err = rows.readRow(dest); err == nil { + return dest[0].([]byte), mc.readUntilEOF() + } + } + return nil, err +} + +// finish is called when the query has canceled. +func (mc *mysqlConn) cancel(err error) { + mc.canceled.Set(err) + mc.cleanup() +} + +// finish is called when the query has succeeded. +func (mc *mysqlConn) finish() { + if !mc.watching || mc.finished == nil { + return + } + select { + case mc.finished <- struct{}{}: + mc.watching = false + case <-mc.closech: + } +} + +// Ping implements driver.Pinger interface +func (mc *mysqlConn) Ping(ctx context.Context) (err error) { + if mc.closed.IsSet() { + errLog.Print(ErrInvalidConn) + return driver.ErrBadConn + } + + if err = mc.watchCancel(ctx); err != nil { + return + } + defer mc.finish() + + if err = mc.writeCommandPacket(comPing); err != nil { + return + } + + return mc.readResultOK() +} + +// BeginTx implements driver.ConnBeginTx interface +func (mc *mysqlConn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, error) { + if err := mc.watchCancel(ctx); err != nil { + return nil, err + } + defer mc.finish() + + if sql.IsolationLevel(opts.Isolation) != sql.LevelDefault { + level, err := mapIsolationLevel(opts.Isolation) + if err != nil { + return nil, err + } + err = mc.exec("SET TRANSACTION ISOLATION LEVEL " + level) + if err != nil { + return nil, err + } + } + + return mc.begin(opts.ReadOnly) +} + +func (mc *mysqlConn) QueryContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Rows, error) { + dargs, err := namedValueToValue(args) + if err != nil { + return nil, err + } + + if err := mc.watchCancel(ctx); err != nil { + return nil, err + } + + rows, err := mc.query(query, dargs) + if err != nil { + mc.finish() + return nil, err + } + rows.finish = mc.finish + return rows, err +} + +func (mc *mysqlConn) ExecContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Result, error) { + dargs, err := namedValueToValue(args) + if err != nil { + return nil, err + } + + if err := mc.watchCancel(ctx); err != nil { + return nil, err + } + defer mc.finish() + + return mc.Exec(query, dargs) +} + +func (mc *mysqlConn) PrepareContext(ctx context.Context, query string) (driver.Stmt, error) { + if err := mc.watchCancel(ctx); err != nil { + return nil, err + } + + stmt, err := mc.Prepare(query) + mc.finish() + if err != nil { + return nil, err + } + + select { + default: + case <-ctx.Done(): + stmt.Close() + return nil, ctx.Err() + } + return stmt, nil +} + +func (stmt *mysqlStmt) QueryContext(ctx context.Context, args []driver.NamedValue) (driver.Rows, error) { + dargs, err := namedValueToValue(args) + if err != nil { + return nil, err + } + + if err := stmt.mc.watchCancel(ctx); err != nil { + return nil, err + } + + rows, err := stmt.query(dargs) + if err != nil { + stmt.mc.finish() + return nil, err + } + rows.finish = stmt.mc.finish + return rows, err +} + +func (stmt *mysqlStmt) ExecContext(ctx context.Context, args []driver.NamedValue) (driver.Result, error) { + dargs, err := namedValueToValue(args) + if err != nil { + return nil, err + } + + if err := stmt.mc.watchCancel(ctx); err != nil { + return nil, err + } + defer stmt.mc.finish() + + return stmt.Exec(dargs) +} + +func (mc *mysqlConn) watchCancel(ctx context.Context) error { + if mc.watching { + // Reach here if canceled, + // so the connection is already invalid + mc.cleanup() + return nil + } + if ctx.Done() == nil { + return nil + } + + mc.watching = true + select { + default: + case <-ctx.Done(): + return ctx.Err() + } + if mc.watcher == nil { + return nil + } + + mc.watcher <- ctx + + return nil +} + +func (mc *mysqlConn) startWatcher() { + watcher := make(chan mysqlContext, 1) + mc.watcher = watcher + finished := make(chan struct{}) + mc.finished = finished + go func() { + for { + var ctx mysqlContext + select { + case ctx = <-watcher: + case <-mc.closech: + return + } + + select { + case <-ctx.Done(): + mc.cancel(ctx.Err()) + case <-finished: + case <-mc.closech: + return + } + } + }() +} + +func (mc *mysqlConn) CheckNamedValue(nv *driver.NamedValue) (err error) { + nv.Value, err = converter{}.ConvertValue(nv.Value) + return +} + +// ResetSession implements driver.SessionResetter. +// (From Go 1.10) +func (mc *mysqlConn) ResetSession(ctx context.Context) error { + if mc.closed.IsSet() { + return driver.ErrBadConn + } + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/const.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/const.go new file mode 100644 index 0000000000000000000000000000000000000000..b1e6b85efcae4244d1028ef8054782838dca4144 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/const.go @@ -0,0 +1,174 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +const ( + defaultAuthPlugin = "mysql_native_password" + defaultMaxAllowedPacket = 4 << 20 // 4 MiB + minProtocolVersion = 10 + maxPacketSize = 1<<24 - 1 + timeFormat = "2006-01-02 15:04:05.999999" +) + +// MySQL constants documentation: +// http://dev.mysql.com/doc/internals/en/client-server-protocol.html + +const ( + iOK byte = 0x00 + iAuthMoreData byte = 0x01 + iLocalInFile byte = 0xfb + iEOF byte = 0xfe + iERR byte = 0xff +) + +// https://dev.mysql.com/doc/internals/en/capability-flags.html#packet-Protocol::CapabilityFlags +type clientFlag uint32 + +const ( + clientLongPassword clientFlag = 1 << iota + clientFoundRows + clientLongFlag + clientConnectWithDB + clientNoSchema + clientCompress + clientODBC + clientLocalFiles + clientIgnoreSpace + clientProtocol41 + clientInteractive + clientSSL + clientIgnoreSIGPIPE + clientTransactions + clientReserved + clientSecureConn + clientMultiStatements + clientMultiResults + clientPSMultiResults + clientPluginAuth + clientConnectAttrs + clientPluginAuthLenEncClientData + clientCanHandleExpiredPasswords + clientSessionTrack + clientDeprecateEOF +) + +const ( + comQuit byte = iota + 1 + comInitDB + comQuery + comFieldList + comCreateDB + comDropDB + comRefresh + comShutdown + comStatistics + comProcessInfo + comConnect + comProcessKill + comDebug + comPing + comTime + comDelayedInsert + comChangeUser + comBinlogDump + comTableDump + comConnectOut + comRegisterSlave + comStmtPrepare + comStmtExecute + comStmtSendLongData + comStmtClose + comStmtReset + comSetOption + comStmtFetch +) + +// https://dev.mysql.com/doc/internals/en/com-query-response.html#packet-Protocol::ColumnType +type fieldType byte + +const ( + fieldTypeDecimal fieldType = iota + fieldTypeTiny + fieldTypeShort + fieldTypeLong + fieldTypeFloat + fieldTypeDouble + fieldTypeNULL + fieldTypeTimestamp + fieldTypeLongLong + fieldTypeInt24 + fieldTypeDate + fieldTypeTime + fieldTypeDateTime + fieldTypeYear + fieldTypeNewDate + fieldTypeVarChar + fieldTypeBit +) +const ( + fieldTypeJSON fieldType = iota + 0xf5 + fieldTypeNewDecimal + fieldTypeEnum + fieldTypeSet + fieldTypeTinyBLOB + fieldTypeMediumBLOB + fieldTypeLongBLOB + fieldTypeBLOB + fieldTypeVarString + fieldTypeString + fieldTypeGeometry +) + +type fieldFlag uint16 + +const ( + flagNotNULL fieldFlag = 1 << iota + flagPriKey + flagUniqueKey + flagMultipleKey + flagBLOB + flagUnsigned + flagZeroFill + flagBinary + flagEnum + flagAutoIncrement + flagTimestamp + flagSet + flagUnknown1 + flagUnknown2 + flagUnknown3 + flagUnknown4 +) + +// http://dev.mysql.com/doc/internals/en/status-flags.html +type statusFlag uint16 + +const ( + statusInTrans statusFlag = 1 << iota + statusInAutocommit + statusReserved // Not in documentation + statusMoreResultsExists + statusNoGoodIndexUsed + statusNoIndexUsed + statusCursorExists + statusLastRowSent + statusDbDropped + statusNoBackslashEscapes + statusMetadataChanged + statusQueryWasSlow + statusPsOutParams + statusInTransReadonly + statusSessionStateChanged +) + +const ( + cachingSha2PasswordRequestPublicKey = 2 + cachingSha2PasswordFastAuthSuccess = 3 + cachingSha2PasswordPerformFullAuthentication = 4 +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/driver.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/driver.go new file mode 100644 index 0000000000000000000000000000000000000000..ba1297825cd1d6fb16f7075596af66a45e2b5d48 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/driver.go @@ -0,0 +1,165 @@ +// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package mysql provides a MySQL driver for Go's database/sql package. +// +// The driver should be used via the database/sql package: +// +// import "database/sql" +// import _ "github.com/go-sql-driver/mysql" +// +// db, err := sql.Open("mysql", "user:password@/dbname") +// +// See https://github.com/go-sql-driver/mysql#usage for details +package mysql + +import ( + "database/sql" + "database/sql/driver" + "net" + "sync" +) + +// MySQLDriver is exported to make the driver directly accessible. +// In general the driver is used via the database/sql package. +type MySQLDriver struct{} + +// DialFunc is a function which can be used to establish the network connection. +// Custom dial functions must be registered with RegisterDial +type DialFunc func(addr string) (net.Conn, error) + +var ( + dialsLock sync.RWMutex + dials map[string]DialFunc +) + +// RegisterDial registers a custom dial function. It can then be used by the +// network address mynet(addr), where mynet is the registered new network. +// addr is passed as a parameter to the dial function. +func RegisterDial(net string, dial DialFunc) { + dialsLock.Lock() + defer dialsLock.Unlock() + if dials == nil { + dials = make(map[string]DialFunc) + } + dials[net] = dial +} + +// Open new Connection. +// See https://github.com/go-sql-driver/mysql#dsn-data-source-name for how +// the DSN string is formated +func (d MySQLDriver) Open(dsn string) (driver.Conn, error) { + var err error + + // New mysqlConn + mc := &mysqlConn{ + maxAllowedPacket: maxPacketSize, + maxWriteSize: maxPacketSize - 1, + closech: make(chan struct{}), + } + mc.cfg, err = ParseDSN(dsn) + if err != nil { + return nil, err + } + mc.parseTime = mc.cfg.ParseTime + + // Connect to Server + dialsLock.RLock() + dial, ok := dials[mc.cfg.Net] + dialsLock.RUnlock() + if ok { + mc.netConn, err = dial(mc.cfg.Addr) + } else { + nd := net.Dialer{Timeout: mc.cfg.Timeout} + mc.netConn, err = nd.Dial(mc.cfg.Net, mc.cfg.Addr) + } + if err != nil { + return nil, err + } + + // Enable TCP Keepalives on TCP connections + if tc, ok := mc.netConn.(*net.TCPConn); ok { + if err := tc.SetKeepAlive(true); err != nil { + // Don't send COM_QUIT before handshake. + mc.netConn.Close() + mc.netConn = nil + return nil, err + } + } + + // Call startWatcher for context support (From Go 1.8) + mc.startWatcher() + + mc.buf = newBuffer(mc.netConn) + + // Set I/O timeouts + mc.buf.timeout = mc.cfg.ReadTimeout + mc.writeTimeout = mc.cfg.WriteTimeout + + // Reading Handshake Initialization Packet + authData, plugin, err := mc.readHandshakePacket() + if err != nil { + mc.cleanup() + return nil, err + } + if plugin == "" { + plugin = defaultAuthPlugin + } + + // Send Client Authentication Packet + authResp, addNUL, err := mc.auth(authData, plugin) + if err != nil { + // try the default auth plugin, if using the requested plugin failed + errLog.Print("could not use requested auth plugin '"+plugin+"': ", err.Error()) + plugin = defaultAuthPlugin + authResp, addNUL, err = mc.auth(authData, plugin) + if err != nil { + mc.cleanup() + return nil, err + } + } + if err = mc.writeHandshakeResponsePacket(authResp, addNUL, plugin); err != nil { + mc.cleanup() + return nil, err + } + + // Handle response to auth packet, switch methods if possible + if err = mc.handleAuthResult(authData, plugin); err != nil { + // Authentication failed and MySQL has already closed the connection + // (https://dev.mysql.com/doc/internals/en/authentication-fails.html). + // Do not send COM_QUIT, just cleanup and return the error. + mc.cleanup() + return nil, err + } + + if mc.cfg.MaxAllowedPacket > 0 { + mc.maxAllowedPacket = mc.cfg.MaxAllowedPacket + } else { + // Get max allowed packet size + maxap, err := mc.getSystemVar("max_allowed_packet") + if err != nil { + mc.Close() + return nil, err + } + mc.maxAllowedPacket = stringToInt(maxap) - 1 + } + if mc.maxAllowedPacket < maxPacketSize { + mc.maxWriteSize = mc.maxAllowedPacket + } + + // Handle DSN Params + err = mc.handleParams() + if err != nil { + mc.Close() + return nil, err + } + + return mc, nil +} + +func init() { + sql.Register("mysql", &MySQLDriver{}) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/dsn.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/dsn.go new file mode 100644 index 0000000000000000000000000000000000000000..be014babe3335703c74b93c4f0d3e74f6534bb5e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/dsn.go @@ -0,0 +1,611 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2016 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +import ( + "bytes" + "crypto/rsa" + "crypto/tls" + "errors" + "fmt" + "net" + "net/url" + "sort" + "strconv" + "strings" + "time" +) + +var ( + errInvalidDSNUnescaped = errors.New("invalid DSN: did you forget to escape a param value?") + errInvalidDSNAddr = errors.New("invalid DSN: network address not terminated (missing closing brace)") + errInvalidDSNNoSlash = errors.New("invalid DSN: missing the slash separating the database name") + errInvalidDSNUnsafeCollation = errors.New("invalid DSN: interpolateParams can not be used with unsafe collations") +) + +// Config is a configuration parsed from a DSN string. +// If a new Config is created instead of being parsed from a DSN string, +// the NewConfig function should be used, which sets default values. +type Config struct { + User string // Username + Passwd string // Password (requires User) + Net string // Network type + Addr string // Network address (requires Net) + DBName string // Database name + Params map[string]string // Connection parameters + Collation string // Connection collation + Loc *time.Location // Location for time.Time values + MaxAllowedPacket int // Max packet size allowed + ServerPubKey string // Server public key name + pubKey *rsa.PublicKey // Server public key + TLSConfig string // TLS configuration name + tls *tls.Config // TLS configuration + Timeout time.Duration // Dial timeout + ReadTimeout time.Duration // I/O read timeout + WriteTimeout time.Duration // I/O write timeout + + AllowAllFiles bool // Allow all files to be used with LOAD DATA LOCAL INFILE + AllowCleartextPasswords bool // Allows the cleartext client side plugin + AllowNativePasswords bool // Allows the native password authentication method + AllowOldPasswords bool // Allows the old insecure password method + ClientFoundRows bool // Return number of matching rows instead of rows changed + ColumnsWithAlias bool // Prepend table alias to column names + InterpolateParams bool // Interpolate placeholders into query string + MultiStatements bool // Allow multiple statements in one query + ParseTime bool // Parse time values to time.Time + RejectReadOnly bool // Reject read-only connections +} + +// NewConfig creates a new Config and sets default values. +func NewConfig() *Config { + return &Config{ + Collation: defaultCollation, + Loc: time.UTC, + MaxAllowedPacket: defaultMaxAllowedPacket, + AllowNativePasswords: true, + } +} + +func (cfg *Config) normalize() error { + if cfg.InterpolateParams && unsafeCollations[cfg.Collation] { + return errInvalidDSNUnsafeCollation + } + + // Set default network if empty + if cfg.Net == "" { + cfg.Net = "tcp" + } + + // Set default address if empty + if cfg.Addr == "" { + switch cfg.Net { + case "tcp": + cfg.Addr = "127.0.0.1:3306" + case "unix": + cfg.Addr = "/tmp/mysql.sock" + default: + return errors.New("default addr for network '" + cfg.Net + "' unknown") + } + + } else if cfg.Net == "tcp" { + cfg.Addr = ensureHavePort(cfg.Addr) + } + + if cfg.tls != nil { + if cfg.tls.ServerName == "" && !cfg.tls.InsecureSkipVerify { + host, _, err := net.SplitHostPort(cfg.Addr) + if err == nil { + cfg.tls.ServerName = host + } + } + } + + return nil +} + +// FormatDSN formats the given Config into a DSN string which can be passed to +// the driver. +func (cfg *Config) FormatDSN() string { + var buf bytes.Buffer + + // [username[:password]@] + if len(cfg.User) > 0 { + buf.WriteString(cfg.User) + if len(cfg.Passwd) > 0 { + buf.WriteByte(':') + buf.WriteString(cfg.Passwd) + } + buf.WriteByte('@') + } + + // [protocol[(address)]] + if len(cfg.Net) > 0 { + buf.WriteString(cfg.Net) + if len(cfg.Addr) > 0 { + buf.WriteByte('(') + buf.WriteString(cfg.Addr) + buf.WriteByte(')') + } + } + + // /dbname + buf.WriteByte('/') + buf.WriteString(cfg.DBName) + + // [?param1=value1&...&paramN=valueN] + hasParam := false + + if cfg.AllowAllFiles { + hasParam = true + buf.WriteString("?allowAllFiles=true") + } + + if cfg.AllowCleartextPasswords { + if hasParam { + buf.WriteString("&allowCleartextPasswords=true") + } else { + hasParam = true + buf.WriteString("?allowCleartextPasswords=true") + } + } + + if !cfg.AllowNativePasswords { + if hasParam { + buf.WriteString("&allowNativePasswords=false") + } else { + hasParam = true + buf.WriteString("?allowNativePasswords=false") + } + } + + if cfg.AllowOldPasswords { + if hasParam { + buf.WriteString("&allowOldPasswords=true") + } else { + hasParam = true + buf.WriteString("?allowOldPasswords=true") + } + } + + if cfg.ClientFoundRows { + if hasParam { + buf.WriteString("&clientFoundRows=true") + } else { + hasParam = true + buf.WriteString("?clientFoundRows=true") + } + } + + if col := cfg.Collation; col != defaultCollation && len(col) > 0 { + if hasParam { + buf.WriteString("&collation=") + } else { + hasParam = true + buf.WriteString("?collation=") + } + buf.WriteString(col) + } + + if cfg.ColumnsWithAlias { + if hasParam { + buf.WriteString("&columnsWithAlias=true") + } else { + hasParam = true + buf.WriteString("?columnsWithAlias=true") + } + } + + if cfg.InterpolateParams { + if hasParam { + buf.WriteString("&interpolateParams=true") + } else { + hasParam = true + buf.WriteString("?interpolateParams=true") + } + } + + if cfg.Loc != time.UTC && cfg.Loc != nil { + if hasParam { + buf.WriteString("&loc=") + } else { + hasParam = true + buf.WriteString("?loc=") + } + buf.WriteString(url.QueryEscape(cfg.Loc.String())) + } + + if cfg.MultiStatements { + if hasParam { + buf.WriteString("&multiStatements=true") + } else { + hasParam = true + buf.WriteString("?multiStatements=true") + } + } + + if cfg.ParseTime { + if hasParam { + buf.WriteString("&parseTime=true") + } else { + hasParam = true + buf.WriteString("?parseTime=true") + } + } + + if cfg.ReadTimeout > 0 { + if hasParam { + buf.WriteString("&readTimeout=") + } else { + hasParam = true + buf.WriteString("?readTimeout=") + } + buf.WriteString(cfg.ReadTimeout.String()) + } + + if cfg.RejectReadOnly { + if hasParam { + buf.WriteString("&rejectReadOnly=true") + } else { + hasParam = true + buf.WriteString("?rejectReadOnly=true") + } + } + + if len(cfg.ServerPubKey) > 0 { + if hasParam { + buf.WriteString("&serverPubKey=") + } else { + hasParam = true + buf.WriteString("?serverPubKey=") + } + buf.WriteString(url.QueryEscape(cfg.ServerPubKey)) + } + + if cfg.Timeout > 0 { + if hasParam { + buf.WriteString("&timeout=") + } else { + hasParam = true + buf.WriteString("?timeout=") + } + buf.WriteString(cfg.Timeout.String()) + } + + if len(cfg.TLSConfig) > 0 { + if hasParam { + buf.WriteString("&tls=") + } else { + hasParam = true + buf.WriteString("?tls=") + } + buf.WriteString(url.QueryEscape(cfg.TLSConfig)) + } + + if cfg.WriteTimeout > 0 { + if hasParam { + buf.WriteString("&writeTimeout=") + } else { + hasParam = true + buf.WriteString("?writeTimeout=") + } + buf.WriteString(cfg.WriteTimeout.String()) + } + + if cfg.MaxAllowedPacket != defaultMaxAllowedPacket { + if hasParam { + buf.WriteString("&maxAllowedPacket=") + } else { + hasParam = true + buf.WriteString("?maxAllowedPacket=") + } + buf.WriteString(strconv.Itoa(cfg.MaxAllowedPacket)) + + } + + // other params + if cfg.Params != nil { + var params []string + for param := range cfg.Params { + params = append(params, param) + } + sort.Strings(params) + for _, param := range params { + if hasParam { + buf.WriteByte('&') + } else { + hasParam = true + buf.WriteByte('?') + } + + buf.WriteString(param) + buf.WriteByte('=') + buf.WriteString(url.QueryEscape(cfg.Params[param])) + } + } + + return buf.String() +} + +// ParseDSN parses the DSN string to a Config +func ParseDSN(dsn string) (cfg *Config, err error) { + // New config with some default values + cfg = NewConfig() + + // [user[:password]@][net[(addr)]]/dbname[?param1=value1&paramN=valueN] + // Find the last '/' (since the password or the net addr might contain a '/') + foundSlash := false + for i := len(dsn) - 1; i >= 0; i-- { + if dsn[i] == '/' { + foundSlash = true + var j, k int + + // left part is empty if i <= 0 + if i > 0 { + // [username[:password]@][protocol[(address)]] + // Find the last '@' in dsn[:i] + for j = i; j >= 0; j-- { + if dsn[j] == '@' { + // username[:password] + // Find the first ':' in dsn[:j] + for k = 0; k < j; k++ { + if dsn[k] == ':' { + cfg.Passwd = dsn[k+1 : j] + break + } + } + cfg.User = dsn[:k] + + break + } + } + + // [protocol[(address)]] + // Find the first '(' in dsn[j+1:i] + for k = j + 1; k < i; k++ { + if dsn[k] == '(' { + // dsn[i-1] must be == ')' if an address is specified + if dsn[i-1] != ')' { + if strings.ContainsRune(dsn[k+1:i], ')') { + return nil, errInvalidDSNUnescaped + } + return nil, errInvalidDSNAddr + } + cfg.Addr = dsn[k+1 : i-1] + break + } + } + cfg.Net = dsn[j+1 : k] + } + + // dbname[?param1=value1&...&paramN=valueN] + // Find the first '?' in dsn[i+1:] + for j = i + 1; j < len(dsn); j++ { + if dsn[j] == '?' { + if err = parseDSNParams(cfg, dsn[j+1:]); err != nil { + return + } + break + } + } + cfg.DBName = dsn[i+1 : j] + + break + } + } + + if !foundSlash && len(dsn) > 0 { + return nil, errInvalidDSNNoSlash + } + + if err = cfg.normalize(); err != nil { + return nil, err + } + return +} + +// parseDSNParams parses the DSN "query string" +// Values must be url.QueryEscape'ed +func parseDSNParams(cfg *Config, params string) (err error) { + for _, v := range strings.Split(params, "&") { + param := strings.SplitN(v, "=", 2) + if len(param) != 2 { + continue + } + + // cfg params + switch value := param[1]; param[0] { + // Disable INFILE whitelist / enable all files + case "allowAllFiles": + var isBool bool + cfg.AllowAllFiles, isBool = readBool(value) + if !isBool { + return errors.New("invalid bool value: " + value) + } + + // Use cleartext authentication mode (MySQL 5.5.10+) + case "allowCleartextPasswords": + var isBool bool + cfg.AllowCleartextPasswords, isBool = readBool(value) + if !isBool { + return errors.New("invalid bool value: " + value) + } + + // Use native password authentication + case "allowNativePasswords": + var isBool bool + cfg.AllowNativePasswords, isBool = readBool(value) + if !isBool { + return errors.New("invalid bool value: " + value) + } + + // Use old authentication mode (pre MySQL 4.1) + case "allowOldPasswords": + var isBool bool + cfg.AllowOldPasswords, isBool = readBool(value) + if !isBool { + return errors.New("invalid bool value: " + value) + } + + // Switch "rowsAffected" mode + case "clientFoundRows": + var isBool bool + cfg.ClientFoundRows, isBool = readBool(value) + if !isBool { + return errors.New("invalid bool value: " + value) + } + + // Collation + case "collation": + cfg.Collation = value + break + + case "columnsWithAlias": + var isBool bool + cfg.ColumnsWithAlias, isBool = readBool(value) + if !isBool { + return errors.New("invalid bool value: " + value) + } + + // Compression + case "compress": + return errors.New("compression not implemented yet") + + // Enable client side placeholder substitution + case "interpolateParams": + var isBool bool + cfg.InterpolateParams, isBool = readBool(value) + if !isBool { + return errors.New("invalid bool value: " + value) + } + + // Time Location + case "loc": + if value, err = url.QueryUnescape(value); err != nil { + return + } + cfg.Loc, err = time.LoadLocation(value) + if err != nil { + return + } + + // multiple statements in one query + case "multiStatements": + var isBool bool + cfg.MultiStatements, isBool = readBool(value) + if !isBool { + return errors.New("invalid bool value: " + value) + } + + // time.Time parsing + case "parseTime": + var isBool bool + cfg.ParseTime, isBool = readBool(value) + if !isBool { + return errors.New("invalid bool value: " + value) + } + + // I/O read Timeout + case "readTimeout": + cfg.ReadTimeout, err = time.ParseDuration(value) + if err != nil { + return + } + + // Reject read-only connections + case "rejectReadOnly": + var isBool bool + cfg.RejectReadOnly, isBool = readBool(value) + if !isBool { + return errors.New("invalid bool value: " + value) + } + + // Server public key + case "serverPubKey": + name, err := url.QueryUnescape(value) + if err != nil { + return fmt.Errorf("invalid value for server pub key name: %v", err) + } + + if pubKey := getServerPubKey(name); pubKey != nil { + cfg.ServerPubKey = name + cfg.pubKey = pubKey + } else { + return errors.New("invalid value / unknown server pub key name: " + name) + } + + // Strict mode + case "strict": + panic("strict mode has been removed. See https://github.com/go-sql-driver/mysql/wiki/strict-mode") + + // Dial Timeout + case "timeout": + cfg.Timeout, err = time.ParseDuration(value) + if err != nil { + return + } + + // TLS-Encryption + case "tls": + boolValue, isBool := readBool(value) + if isBool { + if boolValue { + cfg.TLSConfig = "true" + cfg.tls = &tls.Config{} + } else { + cfg.TLSConfig = "false" + } + } else if vl := strings.ToLower(value); vl == "skip-verify" { + cfg.TLSConfig = vl + cfg.tls = &tls.Config{InsecureSkipVerify: true} + } else { + name, err := url.QueryUnescape(value) + if err != nil { + return fmt.Errorf("invalid value for TLS config name: %v", err) + } + + if tlsConfig := getTLSConfigClone(name); tlsConfig != nil { + cfg.TLSConfig = name + cfg.tls = tlsConfig + } else { + return errors.New("invalid value / unknown config name: " + name) + } + } + + // I/O write Timeout + case "writeTimeout": + cfg.WriteTimeout, err = time.ParseDuration(value) + if err != nil { + return + } + case "maxAllowedPacket": + cfg.MaxAllowedPacket, err = strconv.Atoi(value) + if err != nil { + return + } + default: + // lazy init + if cfg.Params == nil { + cfg.Params = make(map[string]string) + } + + if cfg.Params[param[0]], err = url.QueryUnescape(value); err != nil { + return + } + } + } + + return +} + +func ensureHavePort(addr string) string { + if _, _, err := net.SplitHostPort(addr); err != nil { + return net.JoinHostPort(addr, "3306") + } + return addr +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/errors.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/errors.go new file mode 100644 index 0000000000000000000000000000000000000000..760782ff2fb507b092db8fccfa3f598f2b1d0638 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/errors.go @@ -0,0 +1,65 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2013 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +import ( + "errors" + "fmt" + "log" + "os" +) + +// Various errors the driver might return. Can change between driver versions. +var ( + ErrInvalidConn = errors.New("invalid connection") + ErrMalformPkt = errors.New("malformed packet") + ErrNoTLS = errors.New("TLS requested but server does not support TLS") + ErrCleartextPassword = errors.New("this user requires clear text authentication. If you still want to use it, please add 'allowCleartextPasswords=1' to your DSN") + ErrNativePassword = errors.New("this user requires mysql native password authentication.") + ErrOldPassword = errors.New("this user requires old password authentication. If you still want to use it, please add 'allowOldPasswords=1' to your DSN. See also https://github.com/go-sql-driver/mysql/wiki/old_passwords") + ErrUnknownPlugin = errors.New("this authentication plugin is not supported") + ErrOldProtocol = errors.New("MySQL server does not support required protocol 41+") + ErrPktSync = errors.New("commands out of sync. You can't run this command now") + ErrPktSyncMul = errors.New("commands out of sync. Did you run multiple statements at once?") + ErrPktTooLarge = errors.New("packet for query is too large. Try adjusting the 'max_allowed_packet' variable on the server") + ErrBusyBuffer = errors.New("busy buffer") + + // errBadConnNoWrite is used for connection errors where nothing was sent to the database yet. + // If this happens first in a function starting a database interaction, it should be replaced by driver.ErrBadConn + // to trigger a resend. + // See https://github.com/go-sql-driver/mysql/pull/302 + errBadConnNoWrite = errors.New("bad connection") +) + +var errLog = Logger(log.New(os.Stderr, "[mysql] ", log.Ldate|log.Ltime|log.Lshortfile)) + +// Logger is used to log critical error messages. +type Logger interface { + Print(v ...interface{}) +} + +// SetLogger is used to set the logger for critical errors. +// The initial logger is os.Stderr. +func SetLogger(logger Logger) error { + if logger == nil { + return errors.New("logger is nil") + } + errLog = logger + return nil +} + +// MySQLError is an error type which represents a single MySQL error +type MySQLError struct { + Number uint16 + Message string +} + +func (me *MySQLError) Error() string { + return fmt.Sprintf("Error %d: %s", me.Number, me.Message) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/fields.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/fields.go new file mode 100644 index 0000000000000000000000000000000000000000..e1e2ece4b163a8b5ae3ee9c0fc6337f8e97847b4 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/fields.go @@ -0,0 +1,194 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2017 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +import ( + "database/sql" + "reflect" +) + +func (mf *mysqlField) typeDatabaseName() string { + switch mf.fieldType { + case fieldTypeBit: + return "BIT" + case fieldTypeBLOB: + if mf.charSet != collations[binaryCollation] { + return "TEXT" + } + return "BLOB" + case fieldTypeDate: + return "DATE" + case fieldTypeDateTime: + return "DATETIME" + case fieldTypeDecimal: + return "DECIMAL" + case fieldTypeDouble: + return "DOUBLE" + case fieldTypeEnum: + return "ENUM" + case fieldTypeFloat: + return "FLOAT" + case fieldTypeGeometry: + return "GEOMETRY" + case fieldTypeInt24: + return "MEDIUMINT" + case fieldTypeJSON: + return "JSON" + case fieldTypeLong: + return "INT" + case fieldTypeLongBLOB: + if mf.charSet != collations[binaryCollation] { + return "LONGTEXT" + } + return "LONGBLOB" + case fieldTypeLongLong: + return "BIGINT" + case fieldTypeMediumBLOB: + if mf.charSet != collations[binaryCollation] { + return "MEDIUMTEXT" + } + return "MEDIUMBLOB" + case fieldTypeNewDate: + return "DATE" + case fieldTypeNewDecimal: + return "DECIMAL" + case fieldTypeNULL: + return "NULL" + case fieldTypeSet: + return "SET" + case fieldTypeShort: + return "SMALLINT" + case fieldTypeString: + if mf.charSet == collations[binaryCollation] { + return "BINARY" + } + return "CHAR" + case fieldTypeTime: + return "TIME" + case fieldTypeTimestamp: + return "TIMESTAMP" + case fieldTypeTiny: + return "TINYINT" + case fieldTypeTinyBLOB: + if mf.charSet != collations[binaryCollation] { + return "TINYTEXT" + } + return "TINYBLOB" + case fieldTypeVarChar: + if mf.charSet == collations[binaryCollation] { + return "VARBINARY" + } + return "VARCHAR" + case fieldTypeVarString: + if mf.charSet == collations[binaryCollation] { + return "VARBINARY" + } + return "VARCHAR" + case fieldTypeYear: + return "YEAR" + default: + return "" + } +} + +var ( + scanTypeFloat32 = reflect.TypeOf(float32(0)) + scanTypeFloat64 = reflect.TypeOf(float64(0)) + scanTypeInt8 = reflect.TypeOf(int8(0)) + scanTypeInt16 = reflect.TypeOf(int16(0)) + scanTypeInt32 = reflect.TypeOf(int32(0)) + scanTypeInt64 = reflect.TypeOf(int64(0)) + scanTypeNullFloat = reflect.TypeOf(sql.NullFloat64{}) + scanTypeNullInt = reflect.TypeOf(sql.NullInt64{}) + scanTypeNullTime = reflect.TypeOf(NullTime{}) + scanTypeUint8 = reflect.TypeOf(uint8(0)) + scanTypeUint16 = reflect.TypeOf(uint16(0)) + scanTypeUint32 = reflect.TypeOf(uint32(0)) + scanTypeUint64 = reflect.TypeOf(uint64(0)) + scanTypeRawBytes = reflect.TypeOf(sql.RawBytes{}) + scanTypeUnknown = reflect.TypeOf(new(interface{})) +) + +type mysqlField struct { + tableName string + name string + length uint32 + flags fieldFlag + fieldType fieldType + decimals byte + charSet uint8 +} + +func (mf *mysqlField) scanType() reflect.Type { + switch mf.fieldType { + case fieldTypeTiny: + if mf.flags&flagNotNULL != 0 { + if mf.flags&flagUnsigned != 0 { + return scanTypeUint8 + } + return scanTypeInt8 + } + return scanTypeNullInt + + case fieldTypeShort, fieldTypeYear: + if mf.flags&flagNotNULL != 0 { + if mf.flags&flagUnsigned != 0 { + return scanTypeUint16 + } + return scanTypeInt16 + } + return scanTypeNullInt + + case fieldTypeInt24, fieldTypeLong: + if mf.flags&flagNotNULL != 0 { + if mf.flags&flagUnsigned != 0 { + return scanTypeUint32 + } + return scanTypeInt32 + } + return scanTypeNullInt + + case fieldTypeLongLong: + if mf.flags&flagNotNULL != 0 { + if mf.flags&flagUnsigned != 0 { + return scanTypeUint64 + } + return scanTypeInt64 + } + return scanTypeNullInt + + case fieldTypeFloat: + if mf.flags&flagNotNULL != 0 { + return scanTypeFloat32 + } + return scanTypeNullFloat + + case fieldTypeDouble: + if mf.flags&flagNotNULL != 0 { + return scanTypeFloat64 + } + return scanTypeNullFloat + + case fieldTypeDecimal, fieldTypeNewDecimal, fieldTypeVarChar, + fieldTypeBit, fieldTypeEnum, fieldTypeSet, fieldTypeTinyBLOB, + fieldTypeMediumBLOB, fieldTypeLongBLOB, fieldTypeBLOB, + fieldTypeVarString, fieldTypeString, fieldTypeGeometry, fieldTypeJSON, + fieldTypeTime: + return scanTypeRawBytes + + case fieldTypeDate, fieldTypeNewDate, + fieldTypeTimestamp, fieldTypeDateTime: + // NullTime is always returned for more consistent behavior as it can + // handle both cases of parseTime regardless if the field is nullable. + return scanTypeNullTime + + default: + return scanTypeUnknown + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/infile.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/infile.go new file mode 100644 index 0000000000000000000000000000000000000000..273cb0ba500c9c49acb844bbcbddb7ba99ae1d7e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/infile.go @@ -0,0 +1,182 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2013 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +import ( + "fmt" + "io" + "os" + "strings" + "sync" +) + +var ( + fileRegister map[string]bool + fileRegisterLock sync.RWMutex + readerRegister map[string]func() io.Reader + readerRegisterLock sync.RWMutex +) + +// RegisterLocalFile adds the given file to the file whitelist, +// so that it can be used by "LOAD DATA LOCAL INFILE <filepath>". +// Alternatively you can allow the use of all local files with +// the DSN parameter 'allowAllFiles=true' +// +// filePath := "/home/gopher/data.csv" +// mysql.RegisterLocalFile(filePath) +// err := db.Exec("LOAD DATA LOCAL INFILE '" + filePath + "' INTO TABLE foo") +// if err != nil { +// ... +// +func RegisterLocalFile(filePath string) { + fileRegisterLock.Lock() + // lazy map init + if fileRegister == nil { + fileRegister = make(map[string]bool) + } + + fileRegister[strings.Trim(filePath, `"`)] = true + fileRegisterLock.Unlock() +} + +// DeregisterLocalFile removes the given filepath from the whitelist. +func DeregisterLocalFile(filePath string) { + fileRegisterLock.Lock() + delete(fileRegister, strings.Trim(filePath, `"`)) + fileRegisterLock.Unlock() +} + +// RegisterReaderHandler registers a handler function which is used +// to receive a io.Reader. +// The Reader can be used by "LOAD DATA LOCAL INFILE Reader::<name>". +// If the handler returns a io.ReadCloser Close() is called when the +// request is finished. +// +// mysql.RegisterReaderHandler("data", func() io.Reader { +// var csvReader io.Reader // Some Reader that returns CSV data +// ... // Open Reader here +// return csvReader +// }) +// err := db.Exec("LOAD DATA LOCAL INFILE 'Reader::data' INTO TABLE foo") +// if err != nil { +// ... +// +func RegisterReaderHandler(name string, handler func() io.Reader) { + readerRegisterLock.Lock() + // lazy map init + if readerRegister == nil { + readerRegister = make(map[string]func() io.Reader) + } + + readerRegister[name] = handler + readerRegisterLock.Unlock() +} + +// DeregisterReaderHandler removes the ReaderHandler function with +// the given name from the registry. +func DeregisterReaderHandler(name string) { + readerRegisterLock.Lock() + delete(readerRegister, name) + readerRegisterLock.Unlock() +} + +func deferredClose(err *error, closer io.Closer) { + closeErr := closer.Close() + if *err == nil { + *err = closeErr + } +} + +func (mc *mysqlConn) handleInFileRequest(name string) (err error) { + var rdr io.Reader + var data []byte + packetSize := 16 * 1024 // 16KB is small enough for disk readahead and large enough for TCP + if mc.maxWriteSize < packetSize { + packetSize = mc.maxWriteSize + } + + if idx := strings.Index(name, "Reader::"); idx == 0 || (idx > 0 && name[idx-1] == '/') { // io.Reader + // The server might return an an absolute path. See issue #355. + name = name[idx+8:] + + readerRegisterLock.RLock() + handler, inMap := readerRegister[name] + readerRegisterLock.RUnlock() + + if inMap { + rdr = handler() + if rdr != nil { + if cl, ok := rdr.(io.Closer); ok { + defer deferredClose(&err, cl) + } + } else { + err = fmt.Errorf("Reader '%s' is <nil>", name) + } + } else { + err = fmt.Errorf("Reader '%s' is not registered", name) + } + } else { // File + name = strings.Trim(name, `"`) + fileRegisterLock.RLock() + fr := fileRegister[name] + fileRegisterLock.RUnlock() + if mc.cfg.AllowAllFiles || fr { + var file *os.File + var fi os.FileInfo + + if file, err = os.Open(name); err == nil { + defer deferredClose(&err, file) + + // get file size + if fi, err = file.Stat(); err == nil { + rdr = file + if fileSize := int(fi.Size()); fileSize < packetSize { + packetSize = fileSize + } + } + } + } else { + err = fmt.Errorf("local file '%s' is not registered", name) + } + } + + // send content packets + // if packetSize == 0, the Reader contains no data + if err == nil && packetSize > 0 { + data := make([]byte, 4+packetSize) + var n int + for err == nil { + n, err = rdr.Read(data[4:]) + if n > 0 { + if ioErr := mc.writePacket(data[:4+n]); ioErr != nil { + return ioErr + } + } + } + if err == io.EOF { + err = nil + } + } + + // send empty packet (termination) + if data == nil { + data = make([]byte, 4) + } + if ioErr := mc.writePacket(data[:4]); ioErr != nil { + return ioErr + } + + // read OK packet + if err == nil { + return mc.readResultOK() + } + + mc.readPacket() + return err +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/packets.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/packets.go new file mode 100644 index 0000000000000000000000000000000000000000..170aaa02bff6b759b8566a67de6e62ae56a164d8 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/packets.go @@ -0,0 +1,1298 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +import ( + "bytes" + "crypto/tls" + "database/sql/driver" + "encoding/binary" + "errors" + "fmt" + "io" + "math" + "time" +) + +// Packets documentation: +// http://dev.mysql.com/doc/internals/en/client-server-protocol.html + +// Read packet to buffer 'data' +func (mc *mysqlConn) readPacket() ([]byte, error) { + var prevData []byte + for { + // read packet header + data, err := mc.buf.readNext(4) + if err != nil { + if cerr := mc.canceled.Value(); cerr != nil { + return nil, cerr + } + errLog.Print(err) + mc.Close() + return nil, ErrInvalidConn + } + + // packet length [24 bit] + pktLen := int(uint32(data[0]) | uint32(data[1])<<8 | uint32(data[2])<<16) + + // check packet sync [8 bit] + if data[3] != mc.sequence { + if data[3] > mc.sequence { + return nil, ErrPktSyncMul + } + return nil, ErrPktSync + } + mc.sequence++ + + // packets with length 0 terminate a previous packet which is a + // multiple of (2^24)−1 bytes long + if pktLen == 0 { + // there was no previous packet + if prevData == nil { + errLog.Print(ErrMalformPkt) + mc.Close() + return nil, ErrInvalidConn + } + + return prevData, nil + } + + // read packet body [pktLen bytes] + data, err = mc.buf.readNext(pktLen) + if err != nil { + if cerr := mc.canceled.Value(); cerr != nil { + return nil, cerr + } + errLog.Print(err) + mc.Close() + return nil, ErrInvalidConn + } + + // return data if this was the last packet + if pktLen < maxPacketSize { + // zero allocations for non-split packets + if prevData == nil { + return data, nil + } + + return append(prevData, data...), nil + } + + prevData = append(prevData, data...) + } +} + +// Write packet buffer 'data' +func (mc *mysqlConn) writePacket(data []byte) error { + pktLen := len(data) - 4 + + if pktLen > mc.maxAllowedPacket { + return ErrPktTooLarge + } + + for { + var size int + if pktLen >= maxPacketSize { + data[0] = 0xff + data[1] = 0xff + data[2] = 0xff + size = maxPacketSize + } else { + data[0] = byte(pktLen) + data[1] = byte(pktLen >> 8) + data[2] = byte(pktLen >> 16) + size = pktLen + } + data[3] = mc.sequence + + // Write packet + if mc.writeTimeout > 0 { + if err := mc.netConn.SetWriteDeadline(time.Now().Add(mc.writeTimeout)); err != nil { + return err + } + } + + n, err := mc.netConn.Write(data[:4+size]) + if err == nil && n == 4+size { + mc.sequence++ + if size != maxPacketSize { + return nil + } + pktLen -= size + data = data[size:] + continue + } + + // Handle error + if err == nil { // n != len(data) + mc.cleanup() + errLog.Print(ErrMalformPkt) + } else { + if cerr := mc.canceled.Value(); cerr != nil { + return cerr + } + if n == 0 && pktLen == len(data)-4 { + // only for the first loop iteration when nothing was written yet + return errBadConnNoWrite + } + mc.cleanup() + errLog.Print(err) + } + return ErrInvalidConn + } +} + +/****************************************************************************** +* Initialization Process * +******************************************************************************/ + +// Handshake Initialization Packet +// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::Handshake +func (mc *mysqlConn) readHandshakePacket() (data []byte, plugin string, err error) { + data, err = mc.readPacket() + if err != nil { + // for init we can rewrite this to ErrBadConn for sql.Driver to retry, since + // in connection initialization we don't risk retrying non-idempotent actions. + if err == ErrInvalidConn { + return nil, "", driver.ErrBadConn + } + return + } + + if data[0] == iERR { + return nil, "", mc.handleErrorPacket(data) + } + + // protocol version [1 byte] + if data[0] < minProtocolVersion { + return nil, "", fmt.Errorf( + "unsupported protocol version %d. Version %d or higher is required", + data[0], + minProtocolVersion, + ) + } + + // server version [null terminated string] + // connection id [4 bytes] + pos := 1 + bytes.IndexByte(data[1:], 0x00) + 1 + 4 + + // first part of the password cipher [8 bytes] + authData := data[pos : pos+8] + + // (filler) always 0x00 [1 byte] + pos += 8 + 1 + + // capability flags (lower 2 bytes) [2 bytes] + mc.flags = clientFlag(binary.LittleEndian.Uint16(data[pos : pos+2])) + if mc.flags&clientProtocol41 == 0 { + return nil, "", ErrOldProtocol + } + if mc.flags&clientSSL == 0 && mc.cfg.tls != nil { + return nil, "", ErrNoTLS + } + pos += 2 + + if len(data) > pos { + // character set [1 byte] + // status flags [2 bytes] + // capability flags (upper 2 bytes) [2 bytes] + // length of auth-plugin-data [1 byte] + // reserved (all [00]) [10 bytes] + pos += 1 + 2 + 2 + 1 + 10 + + // second part of the password cipher [mininum 13 bytes], + // where len=MAX(13, length of auth-plugin-data - 8) + // + // The web documentation is ambiguous about the length. However, + // according to mysql-5.7/sql/auth/sql_authentication.cc line 538, + // the 13th byte is "\0 byte, terminating the second part of + // a scramble". So the second part of the password cipher is + // a NULL terminated string that's at least 13 bytes with the + // last byte being NULL. + // + // The official Python library uses the fixed length 12 + // which seems to work but technically could have a hidden bug. + authData = append(authData, data[pos:pos+12]...) + pos += 13 + + // EOF if version (>= 5.5.7 and < 5.5.10) or (>= 5.6.0 and < 5.6.2) + // \NUL otherwise + if end := bytes.IndexByte(data[pos:], 0x00); end != -1 { + plugin = string(data[pos : pos+end]) + } else { + plugin = string(data[pos:]) + } + + // make a memory safe copy of the cipher slice + var b [20]byte + copy(b[:], authData) + return b[:], plugin, nil + } + + // make a memory safe copy of the cipher slice + var b [8]byte + copy(b[:], authData) + return b[:], plugin, nil +} + +// Client Authentication Packet +// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::HandshakeResponse +func (mc *mysqlConn) writeHandshakeResponsePacket(authResp []byte, addNUL bool, plugin string) error { + // Adjust client flags based on server support + clientFlags := clientProtocol41 | + clientSecureConn | + clientLongPassword | + clientTransactions | + clientLocalFiles | + clientPluginAuth | + clientMultiResults | + mc.flags&clientLongFlag + + if mc.cfg.ClientFoundRows { + clientFlags |= clientFoundRows + } + + // To enable TLS / SSL + if mc.cfg.tls != nil { + clientFlags |= clientSSL + } + + if mc.cfg.MultiStatements { + clientFlags |= clientMultiStatements + } + + // encode length of the auth plugin data + var authRespLEIBuf [9]byte + authRespLEI := appendLengthEncodedInteger(authRespLEIBuf[:0], uint64(len(authResp))) + if len(authRespLEI) > 1 { + // if the length can not be written in 1 byte, it must be written as a + // length encoded integer + clientFlags |= clientPluginAuthLenEncClientData + } + + pktLen := 4 + 4 + 1 + 23 + len(mc.cfg.User) + 1 + len(authRespLEI) + len(authResp) + 21 + 1 + if addNUL { + pktLen++ + } + + // To specify a db name + if n := len(mc.cfg.DBName); n > 0 { + clientFlags |= clientConnectWithDB + pktLen += n + 1 + } + + // Calculate packet length and get buffer with that size + data := mc.buf.takeSmallBuffer(pktLen + 4) + if data == nil { + // cannot take the buffer. Something must be wrong with the connection + errLog.Print(ErrBusyBuffer) + return errBadConnNoWrite + } + + // ClientFlags [32 bit] + data[4] = byte(clientFlags) + data[5] = byte(clientFlags >> 8) + data[6] = byte(clientFlags >> 16) + data[7] = byte(clientFlags >> 24) + + // MaxPacketSize [32 bit] (none) + data[8] = 0x00 + data[9] = 0x00 + data[10] = 0x00 + data[11] = 0x00 + + // Charset [1 byte] + var found bool + data[12], found = collations[mc.cfg.Collation] + if !found { + // Note possibility for false negatives: + // could be triggered although the collation is valid if the + // collations map does not contain entries the server supports. + return errors.New("unknown collation") + } + + // SSL Connection Request Packet + // http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::SSLRequest + if mc.cfg.tls != nil { + // Send TLS / SSL request packet + if err := mc.writePacket(data[:(4+4+1+23)+4]); err != nil { + return err + } + + // Switch to TLS + tlsConn := tls.Client(mc.netConn, mc.cfg.tls) + if err := tlsConn.Handshake(); err != nil { + return err + } + mc.netConn = tlsConn + mc.buf.nc = tlsConn + } + + // Filler [23 bytes] (all 0x00) + pos := 13 + for ; pos < 13+23; pos++ { + data[pos] = 0 + } + + // User [null terminated string] + if len(mc.cfg.User) > 0 { + pos += copy(data[pos:], mc.cfg.User) + } + data[pos] = 0x00 + pos++ + + // Auth Data [length encoded integer] + pos += copy(data[pos:], authRespLEI) + pos += copy(data[pos:], authResp) + if addNUL { + data[pos] = 0x00 + pos++ + } + + // Databasename [null terminated string] + if len(mc.cfg.DBName) > 0 { + pos += copy(data[pos:], mc.cfg.DBName) + data[pos] = 0x00 + pos++ + } + + pos += copy(data[pos:], plugin) + data[pos] = 0x00 + + // Send Auth packet + return mc.writePacket(data) +} + +// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::AuthSwitchResponse +func (mc *mysqlConn) writeAuthSwitchPacket(authData []byte, addNUL bool) error { + pktLen := 4 + len(authData) + if addNUL { + pktLen++ + } + data := mc.buf.takeSmallBuffer(pktLen) + if data == nil { + // cannot take the buffer. Something must be wrong with the connection + errLog.Print(ErrBusyBuffer) + return errBadConnNoWrite + } + + // Add the auth data [EOF] + copy(data[4:], authData) + if addNUL { + data[pktLen-1] = 0x00 + } + + return mc.writePacket(data) +} + +/****************************************************************************** +* Command Packets * +******************************************************************************/ + +func (mc *mysqlConn) writeCommandPacket(command byte) error { + // Reset Packet Sequence + mc.sequence = 0 + + data := mc.buf.takeSmallBuffer(4 + 1) + if data == nil { + // cannot take the buffer. Something must be wrong with the connection + errLog.Print(ErrBusyBuffer) + return errBadConnNoWrite + } + + // Add command byte + data[4] = command + + // Send CMD packet + return mc.writePacket(data) +} + +func (mc *mysqlConn) writeCommandPacketStr(command byte, arg string) error { + // Reset Packet Sequence + mc.sequence = 0 + + pktLen := 1 + len(arg) + data := mc.buf.takeBuffer(pktLen + 4) + if data == nil { + // cannot take the buffer. Something must be wrong with the connection + errLog.Print(ErrBusyBuffer) + return errBadConnNoWrite + } + + // Add command byte + data[4] = command + + // Add arg + copy(data[5:], arg) + + // Send CMD packet + return mc.writePacket(data) +} + +func (mc *mysqlConn) writeCommandPacketUint32(command byte, arg uint32) error { + // Reset Packet Sequence + mc.sequence = 0 + + data := mc.buf.takeSmallBuffer(4 + 1 + 4) + if data == nil { + // cannot take the buffer. Something must be wrong with the connection + errLog.Print(ErrBusyBuffer) + return errBadConnNoWrite + } + + // Add command byte + data[4] = command + + // Add arg [32 bit] + data[5] = byte(arg) + data[6] = byte(arg >> 8) + data[7] = byte(arg >> 16) + data[8] = byte(arg >> 24) + + // Send CMD packet + return mc.writePacket(data) +} + +/****************************************************************************** +* Result Packets * +******************************************************************************/ + +func (mc *mysqlConn) readAuthResult() ([]byte, string, error) { + data, err := mc.readPacket() + if err != nil { + return nil, "", err + } + + // packet indicator + switch data[0] { + + case iOK: + return nil, "", mc.handleOkPacket(data) + + case iAuthMoreData: + return data[1:], "", err + + case iEOF: + if len(data) < 1 { + // https://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::OldAuthSwitchRequest + return nil, "mysql_old_password", nil + } + pluginEndIndex := bytes.IndexByte(data, 0x00) + if pluginEndIndex < 0 { + return nil, "", ErrMalformPkt + } + plugin := string(data[1:pluginEndIndex]) + authData := data[pluginEndIndex+1:] + return authData, plugin, nil + + default: // Error otherwise + return nil, "", mc.handleErrorPacket(data) + } +} + +// Returns error if Packet is not an 'Result OK'-Packet +func (mc *mysqlConn) readResultOK() error { + data, err := mc.readPacket() + if err != nil { + return err + } + + if data[0] == iOK { + return mc.handleOkPacket(data) + } + return mc.handleErrorPacket(data) +} + +// Result Set Header Packet +// http://dev.mysql.com/doc/internals/en/com-query-response.html#packet-ProtocolText::Resultset +func (mc *mysqlConn) readResultSetHeaderPacket() (int, error) { + data, err := mc.readPacket() + if err == nil { + switch data[0] { + + case iOK: + return 0, mc.handleOkPacket(data) + + case iERR: + return 0, mc.handleErrorPacket(data) + + case iLocalInFile: + return 0, mc.handleInFileRequest(string(data[1:])) + } + + // column count + num, _, n := readLengthEncodedInteger(data) + if n-len(data) == 0 { + return int(num), nil + } + + return 0, ErrMalformPkt + } + return 0, err +} + +// Error Packet +// http://dev.mysql.com/doc/internals/en/generic-response-packets.html#packet-ERR_Packet +func (mc *mysqlConn) handleErrorPacket(data []byte) error { + if data[0] != iERR { + return ErrMalformPkt + } + + // 0xff [1 byte] + + // Error Number [16 bit uint] + errno := binary.LittleEndian.Uint16(data[1:3]) + + // 1792: ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION + // 1290: ER_OPTION_PREVENTS_STATEMENT (returned by Aurora during failover) + if (errno == 1792 || errno == 1290) && mc.cfg.RejectReadOnly { + // Oops; we are connected to a read-only connection, and won't be able + // to issue any write statements. Since RejectReadOnly is configured, + // we throw away this connection hoping this one would have write + // permission. This is specifically for a possible race condition + // during failover (e.g. on AWS Aurora). See README.md for more. + // + // We explicitly close the connection before returning + // driver.ErrBadConn to ensure that `database/sql` purges this + // connection and initiates a new one for next statement next time. + mc.Close() + return driver.ErrBadConn + } + + pos := 3 + + // SQL State [optional: # + 5bytes string] + if data[3] == 0x23 { + //sqlstate := string(data[4 : 4+5]) + pos = 9 + } + + // Error Message [string] + return &MySQLError{ + Number: errno, + Message: string(data[pos:]), + } +} + +func readStatus(b []byte) statusFlag { + return statusFlag(b[0]) | statusFlag(b[1])<<8 +} + +// Ok Packet +// http://dev.mysql.com/doc/internals/en/generic-response-packets.html#packet-OK_Packet +func (mc *mysqlConn) handleOkPacket(data []byte) error { + var n, m int + + // 0x00 [1 byte] + + // Affected rows [Length Coded Binary] + mc.affectedRows, _, n = readLengthEncodedInteger(data[1:]) + + // Insert id [Length Coded Binary] + mc.insertId, _, m = readLengthEncodedInteger(data[1+n:]) + + // server_status [2 bytes] + mc.status = readStatus(data[1+n+m : 1+n+m+2]) + if mc.status&statusMoreResultsExists != 0 { + return nil + } + + // warning count [2 bytes] + + return nil +} + +// Read Packets as Field Packets until EOF-Packet or an Error appears +// http://dev.mysql.com/doc/internals/en/com-query-response.html#packet-Protocol::ColumnDefinition41 +func (mc *mysqlConn) readColumns(count int) ([]mysqlField, error) { + columns := make([]mysqlField, count) + + for i := 0; ; i++ { + data, err := mc.readPacket() + if err != nil { + return nil, err + } + + // EOF Packet + if data[0] == iEOF && (len(data) == 5 || len(data) == 1) { + if i == count { + return columns, nil + } + return nil, fmt.Errorf("column count mismatch n:%d len:%d", count, len(columns)) + } + + // Catalog + pos, err := skipLengthEncodedString(data) + if err != nil { + return nil, err + } + + // Database [len coded string] + n, err := skipLengthEncodedString(data[pos:]) + if err != nil { + return nil, err + } + pos += n + + // Table [len coded string] + if mc.cfg.ColumnsWithAlias { + tableName, _, n, err := readLengthEncodedString(data[pos:]) + if err != nil { + return nil, err + } + pos += n + columns[i].tableName = string(tableName) + } else { + n, err = skipLengthEncodedString(data[pos:]) + if err != nil { + return nil, err + } + pos += n + } + + // Original table [len coded string] + n, err = skipLengthEncodedString(data[pos:]) + if err != nil { + return nil, err + } + pos += n + + // Name [len coded string] + name, _, n, err := readLengthEncodedString(data[pos:]) + if err != nil { + return nil, err + } + columns[i].name = string(name) + pos += n + + // Original name [len coded string] + n, err = skipLengthEncodedString(data[pos:]) + if err != nil { + return nil, err + } + pos += n + + // Filler [uint8] + pos++ + + // Charset [charset, collation uint8] + columns[i].charSet = data[pos] + pos += 2 + + // Length [uint32] + columns[i].length = binary.LittleEndian.Uint32(data[pos : pos+4]) + pos += 4 + + // Field type [uint8] + columns[i].fieldType = fieldType(data[pos]) + pos++ + + // Flags [uint16] + columns[i].flags = fieldFlag(binary.LittleEndian.Uint16(data[pos : pos+2])) + pos += 2 + + // Decimals [uint8] + columns[i].decimals = data[pos] + //pos++ + + // Default value [len coded binary] + //if pos < len(data) { + // defaultVal, _, err = bytesToLengthCodedBinary(data[pos:]) + //} + } +} + +// Read Packets as Field Packets until EOF-Packet or an Error appears +// http://dev.mysql.com/doc/internals/en/com-query-response.html#packet-ProtocolText::ResultsetRow +func (rows *textRows) readRow(dest []driver.Value) error { + mc := rows.mc + + if rows.rs.done { + return io.EOF + } + + data, err := mc.readPacket() + if err != nil { + return err + } + + // EOF Packet + if data[0] == iEOF && len(data) == 5 { + // server_status [2 bytes] + rows.mc.status = readStatus(data[3:]) + rows.rs.done = true + if !rows.HasNextResultSet() { + rows.mc = nil + } + return io.EOF + } + if data[0] == iERR { + rows.mc = nil + return mc.handleErrorPacket(data) + } + + // RowSet Packet + var n int + var isNull bool + pos := 0 + + for i := range dest { + // Read bytes and convert to string + dest[i], isNull, n, err = readLengthEncodedString(data[pos:]) + pos += n + if err == nil { + if !isNull { + if !mc.parseTime { + continue + } else { + switch rows.rs.columns[i].fieldType { + case fieldTypeTimestamp, fieldTypeDateTime, + fieldTypeDate, fieldTypeNewDate: + dest[i], err = parseDateTime( + string(dest[i].([]byte)), + mc.cfg.Loc, + ) + if err == nil { + continue + } + default: + continue + } + } + + } else { + dest[i] = nil + continue + } + } + return err // err != nil + } + + return nil +} + +// Reads Packets until EOF-Packet or an Error appears. Returns count of Packets read +func (mc *mysqlConn) readUntilEOF() error { + for { + data, err := mc.readPacket() + if err != nil { + return err + } + + switch data[0] { + case iERR: + return mc.handleErrorPacket(data) + case iEOF: + if len(data) == 5 { + mc.status = readStatus(data[3:]) + } + return nil + } + } +} + +/****************************************************************************** +* Prepared Statements * +******************************************************************************/ + +// Prepare Result Packets +// http://dev.mysql.com/doc/internals/en/com-stmt-prepare-response.html +func (stmt *mysqlStmt) readPrepareResultPacket() (uint16, error) { + data, err := stmt.mc.readPacket() + if err == nil { + // packet indicator [1 byte] + if data[0] != iOK { + return 0, stmt.mc.handleErrorPacket(data) + } + + // statement id [4 bytes] + stmt.id = binary.LittleEndian.Uint32(data[1:5]) + + // Column count [16 bit uint] + columnCount := binary.LittleEndian.Uint16(data[5:7]) + + // Param count [16 bit uint] + stmt.paramCount = int(binary.LittleEndian.Uint16(data[7:9])) + + // Reserved [8 bit] + + // Warning count [16 bit uint] + + return columnCount, nil + } + return 0, err +} + +// http://dev.mysql.com/doc/internals/en/com-stmt-send-long-data.html +func (stmt *mysqlStmt) writeCommandLongData(paramID int, arg []byte) error { + maxLen := stmt.mc.maxAllowedPacket - 1 + pktLen := maxLen + + // After the header (bytes 0-3) follows before the data: + // 1 byte command + // 4 bytes stmtID + // 2 bytes paramID + const dataOffset = 1 + 4 + 2 + + // Cannot use the write buffer since + // a) the buffer is too small + // b) it is in use + data := make([]byte, 4+1+4+2+len(arg)) + + copy(data[4+dataOffset:], arg) + + for argLen := len(arg); argLen > 0; argLen -= pktLen - dataOffset { + if dataOffset+argLen < maxLen { + pktLen = dataOffset + argLen + } + + stmt.mc.sequence = 0 + // Add command byte [1 byte] + data[4] = comStmtSendLongData + + // Add stmtID [32 bit] + data[5] = byte(stmt.id) + data[6] = byte(stmt.id >> 8) + data[7] = byte(stmt.id >> 16) + data[8] = byte(stmt.id >> 24) + + // Add paramID [16 bit] + data[9] = byte(paramID) + data[10] = byte(paramID >> 8) + + // Send CMD packet + err := stmt.mc.writePacket(data[:4+pktLen]) + if err == nil { + data = data[pktLen-dataOffset:] + continue + } + return err + + } + + // Reset Packet Sequence + stmt.mc.sequence = 0 + return nil +} + +// Execute Prepared Statement +// http://dev.mysql.com/doc/internals/en/com-stmt-execute.html +func (stmt *mysqlStmt) writeExecutePacket(args []driver.Value) error { + if len(args) != stmt.paramCount { + return fmt.Errorf( + "argument count mismatch (got: %d; has: %d)", + len(args), + stmt.paramCount, + ) + } + + const minPktLen = 4 + 1 + 4 + 1 + 4 + mc := stmt.mc + + // Determine threshould dynamically to avoid packet size shortage. + longDataSize := mc.maxAllowedPacket / (stmt.paramCount + 1) + if longDataSize < 64 { + longDataSize = 64 + } + + // Reset packet-sequence + mc.sequence = 0 + + var data []byte + + if len(args) == 0 { + data = mc.buf.takeBuffer(minPktLen) + } else { + data = mc.buf.takeCompleteBuffer() + } + if data == nil { + // cannot take the buffer. Something must be wrong with the connection + errLog.Print(ErrBusyBuffer) + return errBadConnNoWrite + } + + // command [1 byte] + data[4] = comStmtExecute + + // statement_id [4 bytes] + data[5] = byte(stmt.id) + data[6] = byte(stmt.id >> 8) + data[7] = byte(stmt.id >> 16) + data[8] = byte(stmt.id >> 24) + + // flags (0: CURSOR_TYPE_NO_CURSOR) [1 byte] + data[9] = 0x00 + + // iteration_count (uint32(1)) [4 bytes] + data[10] = 0x01 + data[11] = 0x00 + data[12] = 0x00 + data[13] = 0x00 + + if len(args) > 0 { + pos := minPktLen + + var nullMask []byte + if maskLen, typesLen := (len(args)+7)/8, 1+2*len(args); pos+maskLen+typesLen >= len(data) { + // buffer has to be extended but we don't know by how much so + // we depend on append after all data with known sizes fit. + // We stop at that because we deal with a lot of columns here + // which makes the required allocation size hard to guess. + tmp := make([]byte, pos+maskLen+typesLen) + copy(tmp[:pos], data[:pos]) + data = tmp + nullMask = data[pos : pos+maskLen] + pos += maskLen + } else { + nullMask = data[pos : pos+maskLen] + for i := 0; i < maskLen; i++ { + nullMask[i] = 0 + } + pos += maskLen + } + + // newParameterBoundFlag 1 [1 byte] + data[pos] = 0x01 + pos++ + + // type of each parameter [len(args)*2 bytes] + paramTypes := data[pos:] + pos += len(args) * 2 + + // value of each parameter [n bytes] + paramValues := data[pos:pos] + valuesCap := cap(paramValues) + + for i, arg := range args { + // build NULL-bitmap + if arg == nil { + nullMask[i/8] |= 1 << (uint(i) & 7) + paramTypes[i+i] = byte(fieldTypeNULL) + paramTypes[i+i+1] = 0x00 + continue + } + + // cache types and values + switch v := arg.(type) { + case int64: + paramTypes[i+i] = byte(fieldTypeLongLong) + paramTypes[i+i+1] = 0x00 + + if cap(paramValues)-len(paramValues)-8 >= 0 { + paramValues = paramValues[:len(paramValues)+8] + binary.LittleEndian.PutUint64( + paramValues[len(paramValues)-8:], + uint64(v), + ) + } else { + paramValues = append(paramValues, + uint64ToBytes(uint64(v))..., + ) + } + + case float64: + paramTypes[i+i] = byte(fieldTypeDouble) + paramTypes[i+i+1] = 0x00 + + if cap(paramValues)-len(paramValues)-8 >= 0 { + paramValues = paramValues[:len(paramValues)+8] + binary.LittleEndian.PutUint64( + paramValues[len(paramValues)-8:], + math.Float64bits(v), + ) + } else { + paramValues = append(paramValues, + uint64ToBytes(math.Float64bits(v))..., + ) + } + + case bool: + paramTypes[i+i] = byte(fieldTypeTiny) + paramTypes[i+i+1] = 0x00 + + if v { + paramValues = append(paramValues, 0x01) + } else { + paramValues = append(paramValues, 0x00) + } + + case []byte: + // Common case (non-nil value) first + if v != nil { + paramTypes[i+i] = byte(fieldTypeString) + paramTypes[i+i+1] = 0x00 + + if len(v) < longDataSize { + paramValues = appendLengthEncodedInteger(paramValues, + uint64(len(v)), + ) + paramValues = append(paramValues, v...) + } else { + if err := stmt.writeCommandLongData(i, v); err != nil { + return err + } + } + continue + } + + // Handle []byte(nil) as a NULL value + nullMask[i/8] |= 1 << (uint(i) & 7) + paramTypes[i+i] = byte(fieldTypeNULL) + paramTypes[i+i+1] = 0x00 + + case string: + paramTypes[i+i] = byte(fieldTypeString) + paramTypes[i+i+1] = 0x00 + + if len(v) < longDataSize { + paramValues = appendLengthEncodedInteger(paramValues, + uint64(len(v)), + ) + paramValues = append(paramValues, v...) + } else { + if err := stmt.writeCommandLongData(i, []byte(v)); err != nil { + return err + } + } + + case time.Time: + paramTypes[i+i] = byte(fieldTypeString) + paramTypes[i+i+1] = 0x00 + + var a [64]byte + var b = a[:0] + + if v.IsZero() { + b = append(b, "0000-00-00"...) + } else { + b = v.In(mc.cfg.Loc).AppendFormat(b, timeFormat) + } + + paramValues = appendLengthEncodedInteger(paramValues, + uint64(len(b)), + ) + paramValues = append(paramValues, b...) + + default: + return fmt.Errorf("cannot convert type: %T", arg) + } + } + + // Check if param values exceeded the available buffer + // In that case we must build the data packet with the new values buffer + if valuesCap != cap(paramValues) { + data = append(data[:pos], paramValues...) + mc.buf.buf = data + } + + pos += len(paramValues) + data = data[:pos] + } + + return mc.writePacket(data) +} + +func (mc *mysqlConn) discardResults() error { + for mc.status&statusMoreResultsExists != 0 { + resLen, err := mc.readResultSetHeaderPacket() + if err != nil { + return err + } + if resLen > 0 { + // columns + if err := mc.readUntilEOF(); err != nil { + return err + } + // rows + if err := mc.readUntilEOF(); err != nil { + return err + } + } + } + return nil +} + +// http://dev.mysql.com/doc/internals/en/binary-protocol-resultset-row.html +func (rows *binaryRows) readRow(dest []driver.Value) error { + data, err := rows.mc.readPacket() + if err != nil { + return err + } + + // packet indicator [1 byte] + if data[0] != iOK { + // EOF Packet + if data[0] == iEOF && len(data) == 5 { + rows.mc.status = readStatus(data[3:]) + rows.rs.done = true + if !rows.HasNextResultSet() { + rows.mc = nil + } + return io.EOF + } + mc := rows.mc + rows.mc = nil + + // Error otherwise + return mc.handleErrorPacket(data) + } + + // NULL-bitmap, [(column-count + 7 + 2) / 8 bytes] + pos := 1 + (len(dest)+7+2)>>3 + nullMask := data[1:pos] + + for i := range dest { + // Field is NULL + // (byte >> bit-pos) % 2 == 1 + if ((nullMask[(i+2)>>3] >> uint((i+2)&7)) & 1) == 1 { + dest[i] = nil + continue + } + + // Convert to byte-coded string + switch rows.rs.columns[i].fieldType { + case fieldTypeNULL: + dest[i] = nil + continue + + // Numeric Types + case fieldTypeTiny: + if rows.rs.columns[i].flags&flagUnsigned != 0 { + dest[i] = int64(data[pos]) + } else { + dest[i] = int64(int8(data[pos])) + } + pos++ + continue + + case fieldTypeShort, fieldTypeYear: + if rows.rs.columns[i].flags&flagUnsigned != 0 { + dest[i] = int64(binary.LittleEndian.Uint16(data[pos : pos+2])) + } else { + dest[i] = int64(int16(binary.LittleEndian.Uint16(data[pos : pos+2]))) + } + pos += 2 + continue + + case fieldTypeInt24, fieldTypeLong: + if rows.rs.columns[i].flags&flagUnsigned != 0 { + dest[i] = int64(binary.LittleEndian.Uint32(data[pos : pos+4])) + } else { + dest[i] = int64(int32(binary.LittleEndian.Uint32(data[pos : pos+4]))) + } + pos += 4 + continue + + case fieldTypeLongLong: + if rows.rs.columns[i].flags&flagUnsigned != 0 { + val := binary.LittleEndian.Uint64(data[pos : pos+8]) + if val > math.MaxInt64 { + dest[i] = uint64ToString(val) + } else { + dest[i] = int64(val) + } + } else { + dest[i] = int64(binary.LittleEndian.Uint64(data[pos : pos+8])) + } + pos += 8 + continue + + case fieldTypeFloat: + dest[i] = math.Float32frombits(binary.LittleEndian.Uint32(data[pos : pos+4])) + pos += 4 + continue + + case fieldTypeDouble: + dest[i] = math.Float64frombits(binary.LittleEndian.Uint64(data[pos : pos+8])) + pos += 8 + continue + + // Length coded Binary Strings + case fieldTypeDecimal, fieldTypeNewDecimal, fieldTypeVarChar, + fieldTypeBit, fieldTypeEnum, fieldTypeSet, fieldTypeTinyBLOB, + fieldTypeMediumBLOB, fieldTypeLongBLOB, fieldTypeBLOB, + fieldTypeVarString, fieldTypeString, fieldTypeGeometry, fieldTypeJSON: + var isNull bool + var n int + dest[i], isNull, n, err = readLengthEncodedString(data[pos:]) + pos += n + if err == nil { + if !isNull { + continue + } else { + dest[i] = nil + continue + } + } + return err + + case + fieldTypeDate, fieldTypeNewDate, // Date YYYY-MM-DD + fieldTypeTime, // Time [-][H]HH:MM:SS[.fractal] + fieldTypeTimestamp, fieldTypeDateTime: // Timestamp YYYY-MM-DD HH:MM:SS[.fractal] + + num, isNull, n := readLengthEncodedInteger(data[pos:]) + pos += n + + switch { + case isNull: + dest[i] = nil + continue + case rows.rs.columns[i].fieldType == fieldTypeTime: + // database/sql does not support an equivalent to TIME, return a string + var dstlen uint8 + switch decimals := rows.rs.columns[i].decimals; decimals { + case 0x00, 0x1f: + dstlen = 8 + case 1, 2, 3, 4, 5, 6: + dstlen = 8 + 1 + decimals + default: + return fmt.Errorf( + "protocol error, illegal decimals value %d", + rows.rs.columns[i].decimals, + ) + } + dest[i], err = formatBinaryTime(data[pos:pos+int(num)], dstlen) + case rows.mc.parseTime: + dest[i], err = parseBinaryDateTime(num, data[pos:], rows.mc.cfg.Loc) + default: + var dstlen uint8 + if rows.rs.columns[i].fieldType == fieldTypeDate { + dstlen = 10 + } else { + switch decimals := rows.rs.columns[i].decimals; decimals { + case 0x00, 0x1f: + dstlen = 19 + case 1, 2, 3, 4, 5, 6: + dstlen = 19 + 1 + decimals + default: + return fmt.Errorf( + "protocol error, illegal decimals value %d", + rows.rs.columns[i].decimals, + ) + } + } + dest[i], err = formatBinaryDateTime(data[pos:pos+int(num)], dstlen) + } + + if err == nil { + pos += int(num) + continue + } else { + return err + } + + // Please report if this happens! + default: + return fmt.Errorf("unknown field type %d", rows.rs.columns[i].fieldType) + } + } + + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/result.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/result.go new file mode 100644 index 0000000000000000000000000000000000000000..c6438d0347db5c570524ba792975883631cce8e7 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/result.go @@ -0,0 +1,22 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +type mysqlResult struct { + affectedRows int64 + insertId int64 +} + +func (res *mysqlResult) LastInsertId() (int64, error) { + return res.insertId, nil +} + +func (res *mysqlResult) RowsAffected() (int64, error) { + return res.affectedRows, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/rows.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/rows.go new file mode 100644 index 0000000000000000000000000000000000000000..d3b1e28221765afd3c01b30c443ade9f4e2ce3ac --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/rows.go @@ -0,0 +1,216 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +import ( + "database/sql/driver" + "io" + "math" + "reflect" +) + +type resultSet struct { + columns []mysqlField + columnNames []string + done bool +} + +type mysqlRows struct { + mc *mysqlConn + rs resultSet + finish func() +} + +type binaryRows struct { + mysqlRows +} + +type textRows struct { + mysqlRows +} + +func (rows *mysqlRows) Columns() []string { + if rows.rs.columnNames != nil { + return rows.rs.columnNames + } + + columns := make([]string, len(rows.rs.columns)) + if rows.mc != nil && rows.mc.cfg.ColumnsWithAlias { + for i := range columns { + if tableName := rows.rs.columns[i].tableName; len(tableName) > 0 { + columns[i] = tableName + "." + rows.rs.columns[i].name + } else { + columns[i] = rows.rs.columns[i].name + } + } + } else { + for i := range columns { + columns[i] = rows.rs.columns[i].name + } + } + + rows.rs.columnNames = columns + return columns +} + +func (rows *mysqlRows) ColumnTypeDatabaseTypeName(i int) string { + return rows.rs.columns[i].typeDatabaseName() +} + +// func (rows *mysqlRows) ColumnTypeLength(i int) (length int64, ok bool) { +// return int64(rows.rs.columns[i].length), true +// } + +func (rows *mysqlRows) ColumnTypeNullable(i int) (nullable, ok bool) { + return rows.rs.columns[i].flags&flagNotNULL == 0, true +} + +func (rows *mysqlRows) ColumnTypePrecisionScale(i int) (int64, int64, bool) { + column := rows.rs.columns[i] + decimals := int64(column.decimals) + + switch column.fieldType { + case fieldTypeDecimal, fieldTypeNewDecimal: + if decimals > 0 { + return int64(column.length) - 2, decimals, true + } + return int64(column.length) - 1, decimals, true + case fieldTypeTimestamp, fieldTypeDateTime, fieldTypeTime: + return decimals, decimals, true + case fieldTypeFloat, fieldTypeDouble: + if decimals == 0x1f { + return math.MaxInt64, math.MaxInt64, true + } + return math.MaxInt64, decimals, true + } + + return 0, 0, false +} + +func (rows *mysqlRows) ColumnTypeScanType(i int) reflect.Type { + return rows.rs.columns[i].scanType() +} + +func (rows *mysqlRows) Close() (err error) { + if f := rows.finish; f != nil { + f() + rows.finish = nil + } + + mc := rows.mc + if mc == nil { + return nil + } + if err := mc.error(); err != nil { + return err + } + + // Remove unread packets from stream + if !rows.rs.done { + err = mc.readUntilEOF() + } + if err == nil { + if err = mc.discardResults(); err != nil { + return err + } + } + + rows.mc = nil + return err +} + +func (rows *mysqlRows) HasNextResultSet() (b bool) { + if rows.mc == nil { + return false + } + return rows.mc.status&statusMoreResultsExists != 0 +} + +func (rows *mysqlRows) nextResultSet() (int, error) { + if rows.mc == nil { + return 0, io.EOF + } + if err := rows.mc.error(); err != nil { + return 0, err + } + + // Remove unread packets from stream + if !rows.rs.done { + if err := rows.mc.readUntilEOF(); err != nil { + return 0, err + } + rows.rs.done = true + } + + if !rows.HasNextResultSet() { + rows.mc = nil + return 0, io.EOF + } + rows.rs = resultSet{} + return rows.mc.readResultSetHeaderPacket() +} + +func (rows *mysqlRows) nextNotEmptyResultSet() (int, error) { + for { + resLen, err := rows.nextResultSet() + if err != nil { + return 0, err + } + + if resLen > 0 { + return resLen, nil + } + + rows.rs.done = true + } +} + +func (rows *binaryRows) NextResultSet() error { + resLen, err := rows.nextNotEmptyResultSet() + if err != nil { + return err + } + + rows.rs.columns, err = rows.mc.readColumns(resLen) + return err +} + +func (rows *binaryRows) Next(dest []driver.Value) error { + if mc := rows.mc; mc != nil { + if err := mc.error(); err != nil { + return err + } + + // Fetch next row from stream + return rows.readRow(dest) + } + return io.EOF +} + +func (rows *textRows) NextResultSet() (err error) { + resLen, err := rows.nextNotEmptyResultSet() + if err != nil { + return err + } + + rows.rs.columns, err = rows.mc.readColumns(resLen) + return err +} + +func (rows *textRows) Next(dest []driver.Value) error { + if mc := rows.mc; mc != nil { + if err := mc.error(); err != nil { + return err + } + + // Fetch next row from stream + return rows.readRow(dest) + } + return io.EOF +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/statement.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/statement.go new file mode 100644 index 0000000000000000000000000000000000000000..ce7fe4cd049dace5c41639b732ee50e202c280bd --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/statement.go @@ -0,0 +1,211 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +import ( + "database/sql/driver" + "fmt" + "io" + "reflect" + "strconv" +) + +type mysqlStmt struct { + mc *mysqlConn + id uint32 + paramCount int +} + +func (stmt *mysqlStmt) Close() error { + if stmt.mc == nil || stmt.mc.closed.IsSet() { + // driver.Stmt.Close can be called more than once, thus this function + // has to be idempotent. + // See also Issue #450 and golang/go#16019. + //errLog.Print(ErrInvalidConn) + return driver.ErrBadConn + } + + err := stmt.mc.writeCommandPacketUint32(comStmtClose, stmt.id) + stmt.mc = nil + return err +} + +func (stmt *mysqlStmt) NumInput() int { + return stmt.paramCount +} + +func (stmt *mysqlStmt) ColumnConverter(idx int) driver.ValueConverter { + return converter{} +} + +func (stmt *mysqlStmt) Exec(args []driver.Value) (driver.Result, error) { + if stmt.mc.closed.IsSet() { + errLog.Print(ErrInvalidConn) + return nil, driver.ErrBadConn + } + // Send command + err := stmt.writeExecutePacket(args) + if err != nil { + return nil, stmt.mc.markBadConn(err) + } + + mc := stmt.mc + + mc.affectedRows = 0 + mc.insertId = 0 + + // Read Result + resLen, err := mc.readResultSetHeaderPacket() + if err != nil { + return nil, err + } + + if resLen > 0 { + // Columns + if err = mc.readUntilEOF(); err != nil { + return nil, err + } + + // Rows + if err := mc.readUntilEOF(); err != nil { + return nil, err + } + } + + if err := mc.discardResults(); err != nil { + return nil, err + } + + return &mysqlResult{ + affectedRows: int64(mc.affectedRows), + insertId: int64(mc.insertId), + }, nil +} + +func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) { + return stmt.query(args) +} + +func (stmt *mysqlStmt) query(args []driver.Value) (*binaryRows, error) { + if stmt.mc.closed.IsSet() { + errLog.Print(ErrInvalidConn) + return nil, driver.ErrBadConn + } + // Send command + err := stmt.writeExecutePacket(args) + if err != nil { + return nil, stmt.mc.markBadConn(err) + } + + mc := stmt.mc + + // Read Result + resLen, err := mc.readResultSetHeaderPacket() + if err != nil { + return nil, err + } + + rows := new(binaryRows) + + if resLen > 0 { + rows.mc = mc + rows.rs.columns, err = mc.readColumns(resLen) + } else { + rows.rs.done = true + + switch err := rows.NextResultSet(); err { + case nil, io.EOF: + return rows, nil + default: + return nil, err + } + } + + return rows, err +} + +type converter struct{} + +// ConvertValue mirrors the reference/default converter in database/sql/driver +// with _one_ exception. We support uint64 with their high bit and the default +// implementation does not. This function should be kept in sync with +// database/sql/driver defaultConverter.ConvertValue() except for that +// deliberate difference. +func (c converter) ConvertValue(v interface{}) (driver.Value, error) { + if driver.IsValue(v) { + return v, nil + } + + if vr, ok := v.(driver.Valuer); ok { + sv, err := callValuerValue(vr) + if err != nil { + return nil, err + } + if !driver.IsValue(sv) { + return nil, fmt.Errorf("non-Value type %T returned from Value", sv) + } + return sv, nil + } + + rv := reflect.ValueOf(v) + switch rv.Kind() { + case reflect.Ptr: + // indirect pointers + if rv.IsNil() { + return nil, nil + } else { + return c.ConvertValue(rv.Elem().Interface()) + } + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return rv.Int(), nil + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32: + return int64(rv.Uint()), nil + case reflect.Uint64: + u64 := rv.Uint() + if u64 >= 1<<63 { + return strconv.FormatUint(u64, 10), nil + } + return int64(u64), nil + case reflect.Float32, reflect.Float64: + return rv.Float(), nil + case reflect.Bool: + return rv.Bool(), nil + case reflect.Slice: + ek := rv.Type().Elem().Kind() + if ek == reflect.Uint8 { + return rv.Bytes(), nil + } + return nil, fmt.Errorf("unsupported type %T, a slice of %s", v, ek) + case reflect.String: + return rv.String(), nil + } + return nil, fmt.Errorf("unsupported type %T, a %s", v, rv.Kind()) +} + +var valuerReflectType = reflect.TypeOf((*driver.Valuer)(nil)).Elem() + +// callValuerValue returns vr.Value(), with one exception: +// If vr.Value is an auto-generated method on a pointer type and the +// pointer is nil, it would panic at runtime in the panicwrap +// method. Treat it like nil instead. +// +// This is so people can implement driver.Value on value types and +// still use nil pointers to those types to mean nil/NULL, just like +// string/*string. +// +// This is an exact copy of the same-named unexported function from the +// database/sql package. +func callValuerValue(vr driver.Valuer) (v driver.Value, err error) { + if rv := reflect.ValueOf(vr); rv.Kind() == reflect.Ptr && + rv.IsNil() && + rv.Type().Elem().Implements(valuerReflectType) { + return nil, nil + } + return vr.Value() +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/transaction.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/transaction.go new file mode 100644 index 0000000000000000000000000000000000000000..417d72793b1f5a83a639716a9cd47dca25071766 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/transaction.go @@ -0,0 +1,31 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +type mysqlTx struct { + mc *mysqlConn +} + +func (tx *mysqlTx) Commit() (err error) { + if tx.mc == nil || tx.mc.closed.IsSet() { + return ErrInvalidConn + } + err = tx.mc.exec("COMMIT") + tx.mc = nil + return +} + +func (tx *mysqlTx) Rollback() (err error) { + if tx.mc == nil || tx.mc.closed.IsSet() { + return ErrInvalidConn + } + err = tx.mc.exec("ROLLBACK") + tx.mc = nil + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/utils.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/utils.go new file mode 100644 index 0000000000000000000000000000000000000000..cb3650bb9b8db8dd51f360fd70aa1dc136d741cd --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/go-sql-driver/mysql/utils.go @@ -0,0 +1,755 @@ +// Go MySQL Driver - A MySQL-Driver for Go's database/sql package +// +// Copyright 2012 The Go-MySQL-Driver Authors. All rights reserved. +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this file, +// You can obtain one at http://mozilla.org/MPL/2.0/. + +package mysql + +import ( + "crypto/tls" + "database/sql" + "database/sql/driver" + "encoding/binary" + "errors" + "fmt" + "io" + "strconv" + "strings" + "sync" + "sync/atomic" + "time" +) + +// Registry for custom tls.Configs +var ( + tlsConfigLock sync.RWMutex + tlsConfigRegistry map[string]*tls.Config +) + +// RegisterTLSConfig registers a custom tls.Config to be used with sql.Open. +// Use the key as a value in the DSN where tls=value. +// +// Note: The provided tls.Config is exclusively owned by the driver after +// registering it. +// +// rootCertPool := x509.NewCertPool() +// pem, err := ioutil.ReadFile("/path/ca-cert.pem") +// if err != nil { +// log.Fatal(err) +// } +// if ok := rootCertPool.AppendCertsFromPEM(pem); !ok { +// log.Fatal("Failed to append PEM.") +// } +// clientCert := make([]tls.Certificate, 0, 1) +// certs, err := tls.LoadX509KeyPair("/path/client-cert.pem", "/path/client-key.pem") +// if err != nil { +// log.Fatal(err) +// } +// clientCert = append(clientCert, certs) +// mysql.RegisterTLSConfig("custom", &tls.Config{ +// RootCAs: rootCertPool, +// Certificates: clientCert, +// }) +// db, err := sql.Open("mysql", "user@tcp(localhost:3306)/test?tls=custom") +// +func RegisterTLSConfig(key string, config *tls.Config) error { + if _, isBool := readBool(key); isBool || strings.ToLower(key) == "skip-verify" { + return fmt.Errorf("key '%s' is reserved", key) + } + + tlsConfigLock.Lock() + if tlsConfigRegistry == nil { + tlsConfigRegistry = make(map[string]*tls.Config) + } + + tlsConfigRegistry[key] = config + tlsConfigLock.Unlock() + return nil +} + +// DeregisterTLSConfig removes the tls.Config associated with key. +func DeregisterTLSConfig(key string) { + tlsConfigLock.Lock() + if tlsConfigRegistry != nil { + delete(tlsConfigRegistry, key) + } + tlsConfigLock.Unlock() +} + +func getTLSConfigClone(key string) (config *tls.Config) { + tlsConfigLock.RLock() + if v, ok := tlsConfigRegistry[key]; ok { + config = v.Clone() + } + tlsConfigLock.RUnlock() + return +} + +// Returns the bool value of the input. +// The 2nd return value indicates if the input was a valid bool value +func readBool(input string) (value bool, valid bool) { + switch input { + case "1", "true", "TRUE", "True": + return true, true + case "0", "false", "FALSE", "False": + return false, true + } + + // Not a valid bool value + return +} + +/****************************************************************************** +* Time related utils * +******************************************************************************/ + +// NullTime represents a time.Time that may be NULL. +// NullTime implements the Scanner interface so +// it can be used as a scan destination: +// +// var nt NullTime +// err := db.QueryRow("SELECT time FROM foo WHERE id=?", id).Scan(&nt) +// ... +// if nt.Valid { +// // use nt.Time +// } else { +// // NULL value +// } +// +// This NullTime implementation is not driver-specific +type NullTime struct { + Time time.Time + Valid bool // Valid is true if Time is not NULL +} + +// Scan implements the Scanner interface. +// The value type must be time.Time or string / []byte (formatted time-string), +// otherwise Scan fails. +func (nt *NullTime) Scan(value interface{}) (err error) { + if value == nil { + nt.Time, nt.Valid = time.Time{}, false + return + } + + switch v := value.(type) { + case time.Time: + nt.Time, nt.Valid = v, true + return + case []byte: + nt.Time, err = parseDateTime(string(v), time.UTC) + nt.Valid = (err == nil) + return + case string: + nt.Time, err = parseDateTime(v, time.UTC) + nt.Valid = (err == nil) + return + } + + nt.Valid = false + return fmt.Errorf("Can't convert %T to time.Time", value) +} + +// Value implements the driver Valuer interface. +func (nt NullTime) Value() (driver.Value, error) { + if !nt.Valid { + return nil, nil + } + return nt.Time, nil +} + +func parseDateTime(str string, loc *time.Location) (t time.Time, err error) { + base := "0000-00-00 00:00:00.0000000" + switch len(str) { + case 10, 19, 21, 22, 23, 24, 25, 26: // up to "YYYY-MM-DD HH:MM:SS.MMMMMM" + if str == base[:len(str)] { + return + } + t, err = time.Parse(timeFormat[:len(str)], str) + default: + err = fmt.Errorf("invalid time string: %s", str) + return + } + + // Adjust location + if err == nil && loc != time.UTC { + y, mo, d := t.Date() + h, mi, s := t.Clock() + t, err = time.Date(y, mo, d, h, mi, s, t.Nanosecond(), loc), nil + } + + return +} + +func parseBinaryDateTime(num uint64, data []byte, loc *time.Location) (driver.Value, error) { + switch num { + case 0: + return time.Time{}, nil + case 4: + return time.Date( + int(binary.LittleEndian.Uint16(data[:2])), // year + time.Month(data[2]), // month + int(data[3]), // day + 0, 0, 0, 0, + loc, + ), nil + case 7: + return time.Date( + int(binary.LittleEndian.Uint16(data[:2])), // year + time.Month(data[2]), // month + int(data[3]), // day + int(data[4]), // hour + int(data[5]), // minutes + int(data[6]), // seconds + 0, + loc, + ), nil + case 11: + return time.Date( + int(binary.LittleEndian.Uint16(data[:2])), // year + time.Month(data[2]), // month + int(data[3]), // day + int(data[4]), // hour + int(data[5]), // minutes + int(data[6]), // seconds + int(binary.LittleEndian.Uint32(data[7:11]))*1000, // nanoseconds + loc, + ), nil + } + return nil, fmt.Errorf("invalid DATETIME packet length %d", num) +} + +// zeroDateTime is used in formatBinaryDateTime to avoid an allocation +// if the DATE or DATETIME has the zero value. +// It must never be changed. +// The current behavior depends on database/sql copying the result. +var zeroDateTime = []byte("0000-00-00 00:00:00.000000") + +const digits01 = "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" +const digits10 = "0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999" + +func appendMicrosecs(dst, src []byte, decimals int) []byte { + if decimals <= 0 { + return dst + } + if len(src) == 0 { + return append(dst, ".000000"[:decimals+1]...) + } + + microsecs := binary.LittleEndian.Uint32(src[:4]) + p1 := byte(microsecs / 10000) + microsecs -= 10000 * uint32(p1) + p2 := byte(microsecs / 100) + microsecs -= 100 * uint32(p2) + p3 := byte(microsecs) + + switch decimals { + default: + return append(dst, '.', + digits10[p1], digits01[p1], + digits10[p2], digits01[p2], + digits10[p3], digits01[p3], + ) + case 1: + return append(dst, '.', + digits10[p1], + ) + case 2: + return append(dst, '.', + digits10[p1], digits01[p1], + ) + case 3: + return append(dst, '.', + digits10[p1], digits01[p1], + digits10[p2], + ) + case 4: + return append(dst, '.', + digits10[p1], digits01[p1], + digits10[p2], digits01[p2], + ) + case 5: + return append(dst, '.', + digits10[p1], digits01[p1], + digits10[p2], digits01[p2], + digits10[p3], + ) + } +} + +func formatBinaryDateTime(src []byte, length uint8) (driver.Value, error) { + // length expects the deterministic length of the zero value, + // negative time and 100+ hours are automatically added if needed + if len(src) == 0 { + return zeroDateTime[:length], nil + } + var dst []byte // return value + var p1, p2, p3 byte // current digit pair + + switch length { + case 10, 19, 21, 22, 23, 24, 25, 26: + default: + t := "DATE" + if length > 10 { + t += "TIME" + } + return nil, fmt.Errorf("illegal %s length %d", t, length) + } + switch len(src) { + case 4, 7, 11: + default: + t := "DATE" + if length > 10 { + t += "TIME" + } + return nil, fmt.Errorf("illegal %s packet length %d", t, len(src)) + } + dst = make([]byte, 0, length) + // start with the date + year := binary.LittleEndian.Uint16(src[:2]) + pt := year / 100 + p1 = byte(year - 100*uint16(pt)) + p2, p3 = src[2], src[3] + dst = append(dst, + digits10[pt], digits01[pt], + digits10[p1], digits01[p1], '-', + digits10[p2], digits01[p2], '-', + digits10[p3], digits01[p3], + ) + if length == 10 { + return dst, nil + } + if len(src) == 4 { + return append(dst, zeroDateTime[10:length]...), nil + } + dst = append(dst, ' ') + p1 = src[4] // hour + src = src[5:] + + // p1 is 2-digit hour, src is after hour + p2, p3 = src[0], src[1] + dst = append(dst, + digits10[p1], digits01[p1], ':', + digits10[p2], digits01[p2], ':', + digits10[p3], digits01[p3], + ) + return appendMicrosecs(dst, src[2:], int(length)-20), nil +} + +func formatBinaryTime(src []byte, length uint8) (driver.Value, error) { + // length expects the deterministic length of the zero value, + // negative time and 100+ hours are automatically added if needed + if len(src) == 0 { + return zeroDateTime[11 : 11+length], nil + } + var dst []byte // return value + + switch length { + case + 8, // time (can be up to 10 when negative and 100+ hours) + 10, 11, 12, 13, 14, 15: // time with fractional seconds + default: + return nil, fmt.Errorf("illegal TIME length %d", length) + } + switch len(src) { + case 8, 12: + default: + return nil, fmt.Errorf("invalid TIME packet length %d", len(src)) + } + // +2 to enable negative time and 100+ hours + dst = make([]byte, 0, length+2) + if src[0] == 1 { + dst = append(dst, '-') + } + days := binary.LittleEndian.Uint32(src[1:5]) + hours := int64(days)*24 + int64(src[5]) + + if hours >= 100 { + dst = strconv.AppendInt(dst, hours, 10) + } else { + dst = append(dst, digits10[hours], digits01[hours]) + } + + min, sec := src[6], src[7] + dst = append(dst, ':', + digits10[min], digits01[min], ':', + digits10[sec], digits01[sec], + ) + return appendMicrosecs(dst, src[8:], int(length)-9), nil +} + +/****************************************************************************** +* Convert from and to bytes * +******************************************************************************/ + +func uint64ToBytes(n uint64) []byte { + return []byte{ + byte(n), + byte(n >> 8), + byte(n >> 16), + byte(n >> 24), + byte(n >> 32), + byte(n >> 40), + byte(n >> 48), + byte(n >> 56), + } +} + +func uint64ToString(n uint64) []byte { + var a [20]byte + i := 20 + + // U+0030 = 0 + // ... + // U+0039 = 9 + + var q uint64 + for n >= 10 { + i-- + q = n / 10 + a[i] = uint8(n-q*10) + 0x30 + n = q + } + + i-- + a[i] = uint8(n) + 0x30 + + return a[i:] +} + +// treats string value as unsigned integer representation +func stringToInt(b []byte) int { + val := 0 + for i := range b { + val *= 10 + val += int(b[i] - 0x30) + } + return val +} + +// returns the string read as a bytes slice, wheter the value is NULL, +// the number of bytes read and an error, in case the string is longer than +// the input slice +func readLengthEncodedString(b []byte) ([]byte, bool, int, error) { + // Get length + num, isNull, n := readLengthEncodedInteger(b) + if num < 1 { + return b[n:n], isNull, n, nil + } + + n += int(num) + + // Check data length + if len(b) >= n { + return b[n-int(num) : n : n], false, n, nil + } + return nil, false, n, io.EOF +} + +// returns the number of bytes skipped and an error, in case the string is +// longer than the input slice +func skipLengthEncodedString(b []byte) (int, error) { + // Get length + num, _, n := readLengthEncodedInteger(b) + if num < 1 { + return n, nil + } + + n += int(num) + + // Check data length + if len(b) >= n { + return n, nil + } + return n, io.EOF +} + +// returns the number read, whether the value is NULL and the number of bytes read +func readLengthEncodedInteger(b []byte) (uint64, bool, int) { + // See issue #349 + if len(b) == 0 { + return 0, true, 1 + } + + switch b[0] { + // 251: NULL + case 0xfb: + return 0, true, 1 + + // 252: value of following 2 + case 0xfc: + return uint64(b[1]) | uint64(b[2])<<8, false, 3 + + // 253: value of following 3 + case 0xfd: + return uint64(b[1]) | uint64(b[2])<<8 | uint64(b[3])<<16, false, 4 + + // 254: value of following 8 + case 0xfe: + return uint64(b[1]) | uint64(b[2])<<8 | uint64(b[3])<<16 | + uint64(b[4])<<24 | uint64(b[5])<<32 | uint64(b[6])<<40 | + uint64(b[7])<<48 | uint64(b[8])<<56, + false, 9 + } + + // 0-250: value of first byte + return uint64(b[0]), false, 1 +} + +// encodes a uint64 value and appends it to the given bytes slice +func appendLengthEncodedInteger(b []byte, n uint64) []byte { + switch { + case n <= 250: + return append(b, byte(n)) + + case n <= 0xffff: + return append(b, 0xfc, byte(n), byte(n>>8)) + + case n <= 0xffffff: + return append(b, 0xfd, byte(n), byte(n>>8), byte(n>>16)) + } + return append(b, 0xfe, byte(n), byte(n>>8), byte(n>>16), byte(n>>24), + byte(n>>32), byte(n>>40), byte(n>>48), byte(n>>56)) +} + +// reserveBuffer checks cap(buf) and expand buffer to len(buf) + appendSize. +// If cap(buf) is not enough, reallocate new buffer. +func reserveBuffer(buf []byte, appendSize int) []byte { + newSize := len(buf) + appendSize + if cap(buf) < newSize { + // Grow buffer exponentially + newBuf := make([]byte, len(buf)*2+appendSize) + copy(newBuf, buf) + buf = newBuf + } + return buf[:newSize] +} + +// escapeBytesBackslash escapes []byte with backslashes (\) +// This escapes the contents of a string (provided as []byte) by adding backslashes before special +// characters, and turning others into specific escape sequences, such as +// turning newlines into \n and null bytes into \0. +// https://github.com/mysql/mysql-server/blob/mysql-5.7.5/mysys/charset.c#L823-L932 +func escapeBytesBackslash(buf, v []byte) []byte { + pos := len(buf) + buf = reserveBuffer(buf, len(v)*2) + + for _, c := range v { + switch c { + case '\x00': + buf[pos] = '\\' + buf[pos+1] = '0' + pos += 2 + case '\n': + buf[pos] = '\\' + buf[pos+1] = 'n' + pos += 2 + case '\r': + buf[pos] = '\\' + buf[pos+1] = 'r' + pos += 2 + case '\x1a': + buf[pos] = '\\' + buf[pos+1] = 'Z' + pos += 2 + case '\'': + buf[pos] = '\\' + buf[pos+1] = '\'' + pos += 2 + case '"': + buf[pos] = '\\' + buf[pos+1] = '"' + pos += 2 + case '\\': + buf[pos] = '\\' + buf[pos+1] = '\\' + pos += 2 + default: + buf[pos] = c + pos++ + } + } + + return buf[:pos] +} + +// escapeStringBackslash is similar to escapeBytesBackslash but for string. +func escapeStringBackslash(buf []byte, v string) []byte { + pos := len(buf) + buf = reserveBuffer(buf, len(v)*2) + + for i := 0; i < len(v); i++ { + c := v[i] + switch c { + case '\x00': + buf[pos] = '\\' + buf[pos+1] = '0' + pos += 2 + case '\n': + buf[pos] = '\\' + buf[pos+1] = 'n' + pos += 2 + case '\r': + buf[pos] = '\\' + buf[pos+1] = 'r' + pos += 2 + case '\x1a': + buf[pos] = '\\' + buf[pos+1] = 'Z' + pos += 2 + case '\'': + buf[pos] = '\\' + buf[pos+1] = '\'' + pos += 2 + case '"': + buf[pos] = '\\' + buf[pos+1] = '"' + pos += 2 + case '\\': + buf[pos] = '\\' + buf[pos+1] = '\\' + pos += 2 + default: + buf[pos] = c + pos++ + } + } + + return buf[:pos] +} + +// escapeBytesQuotes escapes apostrophes in []byte by doubling them up. +// This escapes the contents of a string by doubling up any apostrophes that +// it contains. This is used when the NO_BACKSLASH_ESCAPES SQL_MODE is in +// effect on the server. +// https://github.com/mysql/mysql-server/blob/mysql-5.7.5/mysys/charset.c#L963-L1038 +func escapeBytesQuotes(buf, v []byte) []byte { + pos := len(buf) + buf = reserveBuffer(buf, len(v)*2) + + for _, c := range v { + if c == '\'' { + buf[pos] = '\'' + buf[pos+1] = '\'' + pos += 2 + } else { + buf[pos] = c + pos++ + } + } + + return buf[:pos] +} + +// escapeStringQuotes is similar to escapeBytesQuotes but for string. +func escapeStringQuotes(buf []byte, v string) []byte { + pos := len(buf) + buf = reserveBuffer(buf, len(v)*2) + + for i := 0; i < len(v); i++ { + c := v[i] + if c == '\'' { + buf[pos] = '\'' + buf[pos+1] = '\'' + pos += 2 + } else { + buf[pos] = c + pos++ + } + } + + return buf[:pos] +} + +/****************************************************************************** +* Sync utils * +******************************************************************************/ + +// noCopy may be embedded into structs which must not be copied +// after the first use. +// +// See https://github.com/golang/go/issues/8005#issuecomment-190753527 +// for details. +type noCopy struct{} + +// Lock is a no-op used by -copylocks checker from `go vet`. +func (*noCopy) Lock() {} + +// atomicBool is a wrapper around uint32 for usage as a boolean value with +// atomic access. +type atomicBool struct { + _noCopy noCopy + value uint32 +} + +// IsSet returns wether the current boolean value is true +func (ab *atomicBool) IsSet() bool { + return atomic.LoadUint32(&ab.value) > 0 +} + +// Set sets the value of the bool regardless of the previous value +func (ab *atomicBool) Set(value bool) { + if value { + atomic.StoreUint32(&ab.value, 1) + } else { + atomic.StoreUint32(&ab.value, 0) + } +} + +// TrySet sets the value of the bool and returns wether the value changed +func (ab *atomicBool) TrySet(value bool) bool { + if value { + return atomic.SwapUint32(&ab.value, 1) == 0 + } + return atomic.SwapUint32(&ab.value, 0) > 0 +} + +// atomicError is a wrapper for atomically accessed error values +type atomicError struct { + _noCopy noCopy + value atomic.Value +} + +// Set sets the error value regardless of the previous value. +// The value must not be nil +func (ae *atomicError) Set(value error) { + ae.value.Store(value) +} + +// Value returns the current error value +func (ae *atomicError) Value() error { + if v := ae.value.Load(); v != nil { + // this will panic if the value doesn't implement the error interface + return v.(error) + } + return nil +} + +func namedValueToValue(named []driver.NamedValue) ([]driver.Value, error) { + dargs := make([]driver.Value, len(named)) + for n, param := range named { + if len(param.Name) > 0 { + // TODO: support the use of Named Parameters #561 + return nil, errors.New("mysql: driver does not support the use of Named Parameters") + } + dargs[n] = param.Value + } + return dargs, nil +} + +func mapIsolationLevel(level driver.IsolationLevel) (string, error) { + switch sql.IsolationLevel(level) { + case sql.LevelRepeatableRead: + return "REPEATABLE READ", nil + case sql.LevelReadCommitted: + return "READ COMMITTED", nil + case sql.LevelReadUncommitted: + return "READ UNCOMMITTED", nil + case sql.LevelSerializable: + return "SERIALIZABLE", nil + default: + return "", fmt.Errorf("mysql: unsupported isolation level: %v", level) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/gopherjs/gopherjs/LICENSE b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/gopherjs/gopherjs/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..d496fef1092603190191af3ee5f232294d1e4282 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/gopherjs/gopherjs/LICENSE @@ -0,0 +1,24 @@ +Copyright (c) 2013 Richard Musiol. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/gopherjs/gopherjs/js/js.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/gopherjs/gopherjs/js/js.go new file mode 100644 index 0000000000000000000000000000000000000000..3fbf1d88c60983e43c280c732184876c19b46f87 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/gopherjs/gopherjs/js/js.go @@ -0,0 +1,168 @@ +// Package js provides functions for interacting with native JavaScript APIs. Calls to these functions are treated specially by GopherJS and translated directly to their corresponding JavaScript syntax. +// +// Use MakeWrapper to expose methods to JavaScript. When passing values directly, the following type conversions are performed: +// +// | Go type | JavaScript type | Conversions back to interface{} | +// | --------------------- | --------------------- | ------------------------------- | +// | bool | Boolean | bool | +// | integers and floats | Number | float64 | +// | string | String | string | +// | []int8 | Int8Array | []int8 | +// | []int16 | Int16Array | []int16 | +// | []int32, []int | Int32Array | []int | +// | []uint8 | Uint8Array | []uint8 | +// | []uint16 | Uint16Array | []uint16 | +// | []uint32, []uint | Uint32Array | []uint | +// | []float32 | Float32Array | []float32 | +// | []float64 | Float64Array | []float64 | +// | all other slices | Array | []interface{} | +// | arrays | see slice type | see slice type | +// | functions | Function | func(...interface{}) *js.Object | +// | time.Time | Date | time.Time | +// | - | instanceof Node | *js.Object | +// | maps, structs | instanceof Object | map[string]interface{} | +// +// Additionally, for a struct containing a *js.Object field, only the content of the field will be passed to JavaScript and vice versa. +package js + +// Object is a container for a native JavaScript object. Calls to its methods are treated specially by GopherJS and translated directly to their JavaScript syntax. A nil pointer to Object is equal to JavaScript's "null". Object can not be used as a map key. +type Object struct{ object *Object } + +// Get returns the object's property with the given key. +func (o *Object) Get(key string) *Object { return o.object.Get(key) } + +// Set assigns the value to the object's property with the given key. +func (o *Object) Set(key string, value interface{}) { o.object.Set(key, value) } + +// Delete removes the object's property with the given key. +func (o *Object) Delete(key string) { o.object.Delete(key) } + +// Length returns the object's "length" property, converted to int. +func (o *Object) Length() int { return o.object.Length() } + +// Index returns the i'th element of an array. +func (o *Object) Index(i int) *Object { return o.object.Index(i) } + +// SetIndex sets the i'th element of an array. +func (o *Object) SetIndex(i int, value interface{}) { o.object.SetIndex(i, value) } + +// Call calls the object's method with the given name. +func (o *Object) Call(name string, args ...interface{}) *Object { return o.object.Call(name, args...) } + +// Invoke calls the object itself. This will fail if it is not a function. +func (o *Object) Invoke(args ...interface{}) *Object { return o.object.Invoke(args...) } + +// New creates a new instance of this type object. This will fail if it not a function (constructor). +func (o *Object) New(args ...interface{}) *Object { return o.object.New(args...) } + +// Bool returns the object converted to bool according to JavaScript type conversions. +func (o *Object) Bool() bool { return o.object.Bool() } + +// String returns the object converted to string according to JavaScript type conversions. +func (o *Object) String() string { return o.object.String() } + +// Int returns the object converted to int according to JavaScript type conversions (parseInt). +func (o *Object) Int() int { return o.object.Int() } + +// Int64 returns the object converted to int64 according to JavaScript type conversions (parseInt). +func (o *Object) Int64() int64 { return o.object.Int64() } + +// Uint64 returns the object converted to uint64 according to JavaScript type conversions (parseInt). +func (o *Object) Uint64() uint64 { return o.object.Uint64() } + +// Float returns the object converted to float64 according to JavaScript type conversions (parseFloat). +func (o *Object) Float() float64 { return o.object.Float() } + +// Interface returns the object converted to interface{}. See table in package comment for details. +func (o *Object) Interface() interface{} { return o.object.Interface() } + +// Unsafe returns the object as an uintptr, which can be converted via unsafe.Pointer. Not intended for public use. +func (o *Object) Unsafe() uintptr { return o.object.Unsafe() } + +// Error encapsulates JavaScript errors. Those are turned into a Go panic and may be recovered, giving an *Error that holds the JavaScript error object. +type Error struct { + *Object +} + +// Error returns the message of the encapsulated JavaScript error object. +func (err *Error) Error() string { + return "JavaScript error: " + err.Get("message").String() +} + +// Stack returns the stack property of the encapsulated JavaScript error object. +func (err *Error) Stack() string { + return err.Get("stack").String() +} + +// Global gives JavaScript's global object ("window" for browsers and "GLOBAL" for Node.js). +var Global *Object + +// Module gives the value of the "module" variable set by Node.js. Hint: Set a module export with 'js.Module.Get("exports").Set("exportName", ...)'. +var Module *Object + +// Undefined gives the JavaScript value "undefined". +var Undefined *Object + +// Debugger gets compiled to JavaScript's "debugger;" statement. +func Debugger() {} + +// InternalObject returns the internal JavaScript object that represents i. Not intended for public use. +func InternalObject(i interface{}) *Object { + return nil +} + +// MakeFunc wraps a function and gives access to the values of JavaScript's "this" and "arguments" keywords. +func MakeFunc(fn func(this *Object, arguments []*Object) interface{}) *Object { + return Global.Call("$makeFunc", InternalObject(fn)) +} + +// Keys returns the keys of the given JavaScript object. +func Keys(o *Object) []string { + if o == nil || o == Undefined { + return nil + } + a := Global.Get("Object").Call("keys", o) + s := make([]string, a.Length()) + for i := 0; i < a.Length(); i++ { + s[i] = a.Index(i).String() + } + return s +} + +// MakeWrapper creates a JavaScript object which has wrappers for the exported methods of i. Use explicit getter and setter methods to expose struct fields to JavaScript. +func MakeWrapper(i interface{}) *Object { + v := InternalObject(i) + o := Global.Get("Object").New() + o.Set("__internal_object__", v) + methods := v.Get("constructor").Get("methods") + for i := 0; i < methods.Length(); i++ { + m := methods.Index(i) + if m.Get("pkg").String() != "" { // not exported + continue + } + o.Set(m.Get("name").String(), func(args ...*Object) *Object { + return Global.Call("$externalizeFunction", v.Get(m.Get("prop").String()), m.Get("typ"), true).Call("apply", v, args) + }) + } + return o +} + +// NewArrayBuffer creates a JavaScript ArrayBuffer from a byte slice. +func NewArrayBuffer(b []byte) *Object { + slice := InternalObject(b) + offset := slice.Get("$offset").Int() + length := slice.Get("$length").Int() + return slice.Get("$array").Get("buffer").Call("slice", offset, offset+length) +} + +// M is a simple map type. It is intended as a shorthand for JavaScript objects (before conversion). +type M map[string]interface{} + +// S is a simple slice type. It is intended as a shorthand for JavaScript arrays (before conversion). +type S []interface{} + +func init() { + // avoid dead code elimination + e := Error{} + _ = e +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jakecoffman/cron/LICENSE b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jakecoffman/cron/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..3a0f627ffeb534d575886207df8840e5fec8a1a7 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jakecoffman/cron/LICENSE @@ -0,0 +1,21 @@ +Copyright (C) 2012 Rob Figueiredo +All Rights Reserved. + +MIT LICENSE + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jakecoffman/cron/README.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jakecoffman/cron/README.md new file mode 100644 index 0000000000000000000000000000000000000000..d29a360ee39657a1211ac5964b845429d053e8a4 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jakecoffman/cron/README.md @@ -0,0 +1,141 @@ +cron +==== + +A cron library for Go. See the +[godoc](http://go.pkgdoc.org/github.com/robfig/cron). + +## Usage + +Callers may register Funcs to be invoked on a given schedule. Cron will run +them in their own goroutines. A name must be provided. + +```go +c := cron.New() +c.AddFunc("0 5 * * * *", func() { fmt.Println("Every 5 minutes") }, "Often") +c.AddFunc("@hourly", func() { fmt.Println("Every hour") }, "Frequent") +c.AddFunc("@every 1h30m", func() { fmt.Println("Every hour thirty") }, "Less Frequent") +c.Start() +.. +// Funcs are invoked in their own goroutine, asynchronously. +... +// Funcs may also be added to a running Cron +c.AddFunc("@daily", func() { fmt.Println("Every day") }, "My Job") +.. +// Inspect the cron job entries' next and previous run times. +inspect(c.Entries()) +.. +// Remove an entry from the cron by name. +c.RemoveJob("My Job") +.. +c.Stop() // Stop the scheduler (does not stop any jobs already running). +``` + +## CRON Expression + +This section describes the specific format accepted by this cron. Some snippets +are taken from [the wikipedia article](http://en.wikipedia.org/wiki/Cron). + +### Format + +A cron expression represents a set of times, using 6 space-separated fields. + +Field name | Mandatory? | Allowed values | Allowed special characters +---------- | ---------- | -------------- | -------------------------- +Seconds | Yes | 0-59 | * / , - +Minutes | Yes | 0-59 | * / , - +Hours | Yes | 0-23 | * / , - +Day of month | Yes | 1-31 | * / , - ? +Month | Yes | 1-12 or JAN-DEC | * / , - +Day of week | Yes | 0-6 or SUN-SAT | * / , - ? + +Note: Month and Day-of-week field values are case insensitive. "SUN", "Sun", +and "sun" are equally accepted. + +### Special Characters + +#### Asterisk ( * ) + +The asterisk indicates that the cron expression will match for all values of the +field; e.g., using an asterisk in the 5th field (month) would indicate every +month. + +#### Slash ( / ) + +Slashes are used to describe increments of ranges. For example 3-59/15 in the +1st field (minutes) would indicate the 3rd minute of the hour and every 15 +minutes thereafter. The form "*/..." is equivalent to the form "first-last/...", +that is, an increment over the largest possible range of the field. The form +"N/..." is accepted as meaning "N-MAX/...", that is, starting at N, use the +increment until the end of that specific range. It does not wrap around. + +#### Comma ( , ) + +Commas are used to separate items of a list. For example, using "MON,WED,FRI" in +the 5th field (day of week) would mean Mondays, Wednesdays and Fridays. + +#### Hyphen ( - ) + +Hyphens are used to define ranges. For example, 9-17 would indicate every +hour between 9am and 5pm inclusive. + +#### Question mark ( ? ) + +Question mark may be used instead of '*' for leaving either day-of-month or +day-of-week blank. + +### Predefined schedules + +You may use one of several pre-defined schedules in place of a cron expression. + +Entry | Description | Equivalent To +----- | ----------- | ------------- +@yearly (or @annually) | Run once a year, midnight, Jan. 1st | <code>0 0 0 1 1 *</code> +@monthly | Run once a month, midnight, first of month | <code>0 0 0 1 * *</code> +@weekly | Run once a week, midnight on Sunday | <code>0 0 0 * * 0</code> +@daily (or @midnight) | Run once a day, midnight | <code>0 0 0 * * *</code> +@hourly | Run once an hour, beginning of hour | <code>0 0 * * * *</code> + +## Intervals + +You may also schedule a job to execute at fixed intervals. This is supported by +formatting the cron spec like this: + + @every <duration> + +where `<duration>` is a string accepted by +[`time.ParseDuration`](http://golang.org/pkg/time/#ParseDuration). + +For example, `@every 1h30m10s` would indicate a schedule that activates every +1 hour, 30 minutes, 10 seconds. + +> Note: The interval does not take the job runtime into account. For example, +> if a job takes *3 minutes* to run, and it is scheduled to run every *5 minutes*, +> it will have only *2 minutes* of idle time between each run. + +## Time zones + +All interpretation and scheduling is done in the machine's local time zone (as +provided by the [Go time package](http://www.golang.org/pkg/time)). + +Be aware that jobs scheduled during daylight-savings leap-ahead transitions will +not be run! + +## Thread safety + +Since the Cron service runs concurrently with the calling code, some amount of +care must be taken to ensure proper synchronization. + +All [cron methods](http://go.pkgdoc.org/github.com/robfig/cron#Cron) are +designed to be correctly synchronized as long as the caller ensures that +invocations have a clear happens-before ordering between them. + +## Implementation + +Cron entries are stored in an array, sorted by their next activation time. Cron +sleeps until the next job is due to be run. + +Upon waking: +* it runs each entry that is active on that second +* it calculates the next run times for the jobs that were run +* it re-sorts the array of entries by next activation time. +* it goes to sleep until the soonest job. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jakecoffman/cron/constantdelay.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jakecoffman/cron/constantdelay.go new file mode 100644 index 0000000000000000000000000000000000000000..7f289000c3b52f10c22603eba6a3c340279fc7ba --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jakecoffman/cron/constantdelay.go @@ -0,0 +1,28 @@ +package cron + +import "time" + +// ConstantDelaySchedule represents a simple recurring duty cycle, e.g. "Every 5 minutes". +// It does not support jobs more frequent than once a second. +type ConstantDelaySchedule struct { + Delay time.Duration +} + +// Every returns a crontab Schedule that activates once every duration. +// Delays of less than a second are not supported (will panic). +// Any fields less than a Second are truncated. +func Every(duration time.Duration) ConstantDelaySchedule { + if duration < time.Second { + panic("cron/constantdelay: delays of less than a second are not supported: " + + duration.String()) + } + return ConstantDelaySchedule{ + Delay: duration - time.Duration(duration.Nanoseconds())%time.Second, + } +} + +// Next returns the next time this should be run. +// This rounds so that the next activation time will be on the second. +func (schedule ConstantDelaySchedule) Next(t time.Time) time.Time { + return t.Add(schedule.Delay - time.Duration(t.Nanosecond())*time.Nanosecond) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jakecoffman/cron/cron.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jakecoffman/cron/cron.go new file mode 100644 index 0000000000000000000000000000000000000000..9e3f378cdffa2899f1470d6b5fabf2e37298de73 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jakecoffman/cron/cron.go @@ -0,0 +1,245 @@ +// This library implements a cron spec parser and runner. See the README for +// more details. +package cron + +import ( + "sort" + "time" +) + +type entries []*Entry + +// Cron keeps track of any number of entries, invoking the associated func as +// specified by the schedule. It may be started, stopped, and the entries may +// be inspected while running. +type Cron struct { + entries entries + stop chan struct{} + add chan *Entry + remove chan string + snapshot chan entries + running bool +} + +// Job is an interface for submitted cron jobs. +type Job interface { + Run() +} + +// The Schedule describes a job's duty cycle. +type Schedule interface { + // Return the next activation time, later than the given time. + // Next is invoked initially, and then each time the job is run. + Next(time.Time) time.Time +} + +// Entry consists of a schedule and the func to execute on that schedule. +type Entry struct { + // The schedule on which this job should be run. + Schedule Schedule + + // The next time the job will run. This is the zero time if Cron has not been + // started or this entry's schedule is unsatisfiable + Next time.Time + + // The last time this job was run. This is the zero time if the job has never + // been run. + Prev time.Time + + // The Job to run. + Job Job + + // Unique name to identify the Entry so as to be able to remove it later. + Name string +} + +// byTime is a wrapper for sorting the entry array by time +// (with zero time at the end). +type byTime []*Entry + +func (s byTime) Len() int { return len(s) } +func (s byTime) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s byTime) Less(i, j int) bool { + // Two zero times should return false. + // Otherwise, zero is "greater" than any other time. + // (To sort it at the end of the list.) + if s[i].Next.IsZero() { + return false + } + if s[j].Next.IsZero() { + return true + } + return s[i].Next.Before(s[j].Next) +} + +// New returns a new Cron job runner. +func New() *Cron { + return &Cron{ + entries: nil, + add: make(chan *Entry), + remove: make(chan string), + stop: make(chan struct{}), + snapshot: make(chan entries), + running: false, + } +} + +// A wrapper that turns a func() into a cron.Job +type FuncJob func() + +func (f FuncJob) Run() { f() } + +// AddFunc adds a func to the Cron to be run on the given schedule. +func (c *Cron) AddFunc(spec string, cmd func(), name string) { + c.AddJob(spec, FuncJob(cmd), name) +} + +// AddFunc adds a Job to the Cron to be run on the given schedule. +func (c *Cron) AddJob(spec string, cmd Job, name string) { + c.Schedule(Parse(spec), cmd, name) +} + +// RemoveJob removes a Job from the Cron based on name. +func (c *Cron) RemoveJob(name string) { + if !c.running { + i := c.entries.pos(name) + + if i == -1 { + return + } + + c.entries = c.entries[:i+copy(c.entries[i:], c.entries[i+1:])] + return + } + + c.remove <- name +} + +func (entrySlice entries) pos(name string) int { + for p, e := range entrySlice { + if e.Name == name { + return p + } + } + return -1 +} + +// Schedule adds a Job to the Cron to be run on the given schedule. +func (c *Cron) Schedule(schedule Schedule, cmd Job, name string) { + entry := &Entry{ + Schedule: schedule, + Job: cmd, + Name: name, + } + + if !c.running { + i := c.entries.pos(entry.Name) + if i != -1 { + return + } + c.entries = append(c.entries, entry) + return + } + + c.add <- entry +} + +// Entries returns a snapshot of the cron entries. +func (c *Cron) Entries() []*Entry { + if c.running { + c.snapshot <- nil + x := <-c.snapshot + return x + } + return c.entrySnapshot() +} + +// Start the cron scheduler in its own go-routine. +func (c *Cron) Start() { + c.running = true + go c.run() +} + +// Run the scheduler.. this is private just due to the need to synchronize +// access to the 'running' state variable. +func (c *Cron) run() { + // Figure out the next activation times for each entry. + now := time.Now().Local() + for _, entry := range c.entries { + entry.Next = entry.Schedule.Next(now) + } + + for { + // Determine the next entry to run. + sort.Sort(byTime(c.entries)) + + var effective time.Time + if len(c.entries) == 0 || c.entries[0].Next.IsZero() { + // If there are no entries yet, just sleep - it still handles new entries + // and stop requests. + effective = now.AddDate(10, 0, 0) + } else { + effective = c.entries[0].Next + } + + select { + case now = <-time.After(effective.Sub(now)): + // Run every entry whose next time was this effective time. + for _, e := range c.entries { + if e.Next != effective { + break + } + go e.Job.Run() + e.Prev = e.Next + e.Next = e.Schedule.Next(effective) + } + continue + + case newEntry := <-c.add: + i := c.entries.pos(newEntry.Name) + if i != -1 { + break + } + c.entries = append(c.entries, newEntry) + newEntry.Next = newEntry.Schedule.Next(time.Now().Local()) + + case name := <-c.remove: + i := c.entries.pos(name) + + if i == -1 { + break + } + + c.entries = c.entries[:i+copy(c.entries[i:], c.entries[i+1:])] + + case <-c.snapshot: + c.snapshot <- c.entrySnapshot() + + case <-c.stop: + return + } + + // 'now' should be updated after newEntry and snapshot cases. + now = time.Now().Local() + } +} + +// Stop the cron scheduler. +func (c *Cron) Stop() { + c.stop <- struct{}{} + c.running = false +} + +// entrySnapshot returns a copy of the current cron entry list. +func (c *Cron) entrySnapshot() []*Entry { + entries := []*Entry{} + for _, e := range c.entries { + entries = append(entries, &Entry{ + Schedule: e.Schedule, + Next: e.Next, + Prev: e.Prev, + Job: e.Job, + }) + } + return entries +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jakecoffman/cron/parser.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jakecoffman/cron/parser.go new file mode 100644 index 0000000000000000000000000000000000000000..7d0ee9dec3189f5b895c237aaa399b54316f1e80 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jakecoffman/cron/parser.go @@ -0,0 +1,223 @@ +package cron + +import ( + "log" + "math" + "strconv" + "strings" + "time" +) + +// Parse returns a new crontab schedule representing the given spec. +// It panics with a descriptive error if the spec is not valid. +// +// It accepts +// - Full crontab specs, e.g. "* * * * * ?" +// - Descriptors, e.g. "@midnight", "@every 1h30m" +func Parse(spec string) Schedule { + if spec[0] == '@' { + return parseDescriptor(spec) + } + + // Split on whitespace. We require 5 or 6 fields. + // (second) (minute) (hour) (day of month) (month) (day of week, optional) + fields := strings.Fields(spec) + if len(fields) != 5 && len(fields) != 6 { + log.Panicf("Expected 5 or 6 fields, found %d: %s", len(fields), spec) + } + + // If a sixth field is not provided (DayOfWeek), then it is equivalent to star. + if len(fields) == 5 { + fields = append(fields, "*") + } + + schedule := &SpecSchedule{ + Second: getField(fields[0], seconds), + Minute: getField(fields[1], minutes), + Hour: getField(fields[2], hours), + Dom: getField(fields[3], dom), + Month: getField(fields[4], months), + Dow: getField(fields[5], dow), + } + + return schedule +} + +// getField returns an Int with the bits set representing all of the times that +// the field represents. A "field" is a comma-separated list of "ranges". +func getField(field string, r bounds) uint64 { + // list = range {"," range} + var bits uint64 + ranges := strings.FieldsFunc(field, func(r rune) bool { return r == ',' }) + for _, expr := range ranges { + bits |= getRange(expr, r) + } + return bits +} + +// getRange returns the bits indicated by the given expression: +// number | number "-" number [ "/" number ] +func getRange(expr string, r bounds) uint64 { + + var ( + start, end, step uint + rangeAndStep = strings.Split(expr, "/") + lowAndHigh = strings.Split(rangeAndStep[0], "-") + singleDigit = len(lowAndHigh) == 1 + ) + + var extra_star uint64 + if lowAndHigh[0] == "*" || lowAndHigh[0] == "?" { + start = r.min + end = r.max + extra_star = starBit + } else { + start = parseIntOrName(lowAndHigh[0], r.names) + switch len(lowAndHigh) { + case 1: + end = start + case 2: + end = parseIntOrName(lowAndHigh[1], r.names) + default: + log.Panicf("Too many hyphens: %s", expr) + } + } + + switch len(rangeAndStep) { + case 1: + step = 1 + case 2: + step = mustParseInt(rangeAndStep[1]) + + // Special handling: "N/step" means "N-max/step". + if singleDigit { + end = r.max + } + default: + log.Panicf("Too many slashes: %s", expr) + } + + if start < r.min { + log.Panicf("Beginning of range (%d) below minimum (%d): %s", start, r.min, expr) + } + if end > r.max { + log.Panicf("End of range (%d) above maximum (%d): %s", end, r.max, expr) + } + if start > end { + log.Panicf("Beginning of range (%d) beyond end of range (%d): %s", start, end, expr) + } + + return getBits(start, end, step) | extra_star +} + +// parseIntOrName returns the (possibly-named) integer contained in expr. +func parseIntOrName(expr string, names map[string]uint) uint { + if names != nil { + if namedInt, ok := names[strings.ToLower(expr)]; ok { + return namedInt + } + } + return mustParseInt(expr) +} + +// mustParseInt parses the given expression as an int or panics. +func mustParseInt(expr string) uint { + num, err := strconv.Atoi(expr) + if err != nil { + log.Panicf("Failed to parse int from %s: %s", expr, err) + } + if num < 0 { + log.Panicf("Negative number (%d) not allowed: %s", num, expr) + } + + return uint(num) +} + +// getBits sets all bits in the range [min, max], modulo the given step size. +func getBits(min, max, step uint) uint64 { + var bits uint64 + + // If step is 1, use shifts. + if step == 1 { + return ^(math.MaxUint64 << (max + 1)) & (math.MaxUint64 << min) + } + + // Else, use a simple loop. + for i := min; i <= max; i += step { + bits |= 1 << i + } + return bits +} + +// all returns all bits within the given bounds. (plus the star bit) +func all(r bounds) uint64 { + return getBits(r.min, r.max, 1) | starBit +} + +// parseDescriptor returns a pre-defined schedule for the expression, or panics +// if none matches. +func parseDescriptor(spec string) Schedule { + switch spec { + case "@yearly", "@annually": + return &SpecSchedule{ + Second: 1 << seconds.min, + Minute: 1 << minutes.min, + Hour: 1 << hours.min, + Dom: 1 << dom.min, + Month: 1 << months.min, + Dow: all(dow), + } + + case "@monthly": + return &SpecSchedule{ + Second: 1 << seconds.min, + Minute: 1 << minutes.min, + Hour: 1 << hours.min, + Dom: 1 << dom.min, + Month: all(months), + Dow: all(dow), + } + + case "@weekly": + return &SpecSchedule{ + Second: 1 << seconds.min, + Minute: 1 << minutes.min, + Hour: 1 << hours.min, + Dom: all(dom), + Month: all(months), + Dow: 1 << dow.min, + } + + case "@daily", "@midnight": + return &SpecSchedule{ + Second: 1 << seconds.min, + Minute: 1 << minutes.min, + Hour: 1 << hours.min, + Dom: all(dom), + Month: all(months), + Dow: all(dow), + } + + case "@hourly": + return &SpecSchedule{ + Second: 1 << seconds.min, + Minute: 1 << minutes.min, + Hour: all(hours), + Dom: all(dom), + Month: all(months), + Dow: all(dow), + } + } + + const every = "@every " + if strings.HasPrefix(spec, every) { + duration, err := time.ParseDuration(spec[len(every):]) + if err != nil { + log.Panicf("Failed to parse duration %s: %s", spec, err) + } + return Every(duration) + } + + log.Panicf("Unrecognized descriptor: %s", spec) + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jakecoffman/cron/spec.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jakecoffman/cron/spec.go new file mode 100644 index 0000000000000000000000000000000000000000..cb3743325d0e803981f621e7f2a1b6a9fa74007b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jakecoffman/cron/spec.go @@ -0,0 +1,161 @@ +package cron + +import ( + "time" +) + +// SpecSchedule specifies a duty cycle (to the second granularity), based on a +// traditional crontab specification. It is computed initially and stored as bit sets. +type SpecSchedule struct { + Second, Minute, Hour, Dom, Month, Dow uint64 +} + +// bounds provides a range of acceptable values (plus a map of name to value). +type bounds struct { + min, max uint + names map[string]uint +} + +// The bounds for each field. +var ( + seconds = bounds{0, 59, nil} + minutes = bounds{0, 59, nil} + hours = bounds{0, 23, nil} + dom = bounds{1, 31, nil} + months = bounds{1, 12, map[string]uint{ + "jan": 1, + "feb": 2, + "mar": 3, + "apr": 4, + "may": 5, + "jun": 6, + "jul": 7, + "aug": 8, + "sep": 9, + "oct": 10, + "nov": 11, + "dec": 12, + }} + dow = bounds{0, 6, map[string]uint{ + "sun": 0, + "mon": 1, + "tue": 2, + "wed": 3, + "thu": 4, + "fri": 5, + "sat": 6, + }} +) + +const ( + // Set the top bit if a star was included in the expression. + starBit = 1 << 63 +) + +// Next returns the next time this schedule is activated, greater than the given +// time. If no time can be found to satisfy the schedule, return the zero time. +func (s *SpecSchedule) Next(t time.Time) time.Time { + // General approach: + // For Month, Day, Hour, Minute, Second: + // Check if the time value matches. If yes, continue to the next field. + // If the field doesn't match the schedule, then increment the field until it matches. + // While incrementing the field, a wrap-around brings it back to the beginning + // of the field list (since it is necessary to re-verify previous field + // values) + + // Start at the earliest possible time (the upcoming second). + t = t.Add(1*time.Second - time.Duration(t.Nanosecond())*time.Nanosecond) + + // This flag indicates whether a field has been incremented. + added := false + + // If no time is found within five years, return zero. + yearLimit := t.Year() + 5 + +WRAP: + if t.Year() > yearLimit { + return time.Time{} + } + + // Find the first applicable month. + // If it's this month, then do nothing. + for 1<<uint(t.Month())&s.Month == 0 { + // If we have to add a month, reset the other parts to 0. + if !added { + added = true + // Otherwise, set the date at the beginning (since the current time is irrelevant). + t = time.Date(t.Year(), t.Month(), 1, 0, 0, 0, 0, t.Location()) + } + t = t.AddDate(0, 1, 0) + + // Wrapped around. + if t.Month() == time.January { + goto WRAP + } + } + + // Now get a day in that month. + for !dayMatches(s, t) { + if !added { + added = true + t = time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location()) + } + t = t.AddDate(0, 0, 1) + + if t.Day() == 1 { + goto WRAP + } + } + + for 1<<uint(t.Hour())&s.Hour == 0 { + if !added { + added = true + t = time.Date(t.Year(), t.Month(), t.Day(), t.Hour(), 0, 0, 0, t.Location()) + } + t = t.Add(1 * time.Hour) + + if t.Hour() == 0 { + goto WRAP + } + } + + for 1<<uint(t.Minute())&s.Minute == 0 { + if !added { + added = true + t = time.Date(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), 0, 0, t.Location()) + } + t = t.Add(1 * time.Minute) + + if t.Minute() == 0 { + goto WRAP + } + } + + for 1<<uint(t.Second())&s.Second == 0 { + if !added { + added = true + t = time.Date(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second(), 0, t.Location()) + } + t = t.Add(1 * time.Second) + + if t.Second() == 0 { + goto WRAP + } + } + + return t +} + +// dayMatches returns true if the schedule's day-of-week and day-of-month +// restrictions are satisfied by the given time. +func dayMatches(s *SpecSchedule, t time.Time) bool { + var ( + domMatch bool = 1<<uint(t.Day())&s.Dom > 0 + dowMatch bool = 1<<uint(t.Weekday())&s.Dow > 0 + ) + + if s.Dom&starBit > 0 || s.Dow&starBit > 0 { + return domMatch && dowMatch + } + return domMatch || dowMatch +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/COPYING b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/COPYING new file mode 100644 index 0000000000000000000000000000000000000000..68c771a099958211169377d766a7389422f5573d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/COPYING @@ -0,0 +1,176 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/Gopkg.lock b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/Gopkg.lock new file mode 100644 index 0000000000000000000000000000000000000000..58ac704fb1ccdf249f7ad2274db249444d91de2b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/Gopkg.lock @@ -0,0 +1,15 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + name = "github.com/mitchellh/go-homedir" + packages = ["."] + revision = "ae18d6b8b3205b561c79e8e5f69bff09736185f4" + version = "v1.0.0" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + inputs-digest = "48ed4c2644ddada90ad75040098599bb025e049c7535a45df7fa8191292d4fe6" + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/Gopkg.toml b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/Gopkg.toml new file mode 100644 index 0000000000000000000000000000000000000000..53185c7432b5dc4e7b5be2e2958ca32ede0af8e9 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/Gopkg.toml @@ -0,0 +1,34 @@ +# Gopkg.toml example +# +# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md +# for detailed Gopkg.toml documentation. +# +# required = ["github.com/user/thing/cmd/thing"] +# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] +# +# [[constraint]] +# name = "github.com/user/project" +# version = "1.0.0" +# +# [[constraint]] +# name = "github.com/user/project2" +# branch = "dev" +# source = "github.com/myfork/project2" +# +# [[override]] +# name = "github.com/x/y" +# version = "2.4.0" +# +# [prune] +# non-go = false +# go-tests = true +# unused-packages = true + + +[prune] + go-tests = true + unused-packages = true + +[[constraint]] + name = "github.com/mitchellh/go-homedir" + version = "1.0.0" diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/LICENSE b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..261eeb9e9f8b2b4b0d119366dda99c6fd7d35c64 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/Makefile b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..fe9c12990d8aea15845514662ecb4ce7dfd72d6e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/Makefile @@ -0,0 +1,46 @@ +VENDOR := vendor +PKGS := $(shell go list ./... | grep -v /$(VENDOR)/) +SRC = $(shell find . -type f -name '*.go' -not -path "*/$(VENDOR)/*") +BIN_DIR := $(GOPATH)/bin +DEP := $(BIN_DIR)/dep +GOMETALINTER := $(BIN_DIR)/gometalinter + +.PHONY: test +test: dep fmtcheck vet + go test $(PKGS) + +$(DEP): + go get -u github.com/golang/dep/cmd/dep + +.PHONY: dep +dep: $(DEP) + $(DEP) ensure + +$(GOMETALINTER): + go get -u github.com/alecthomas/gometalinter + $(GOMETALINTER) --install &> /dev/null + +.PHONY: lint +lint: $(GOMETALINTER) + $(GOMETALINTER) ./... --vendor + +.PHONY: fmt +fmt: + @gofmt -s -l -w $(SRC) + +.PHONY: fmtcheck +fmtcheck: + @bash -c "diff -u <(echo -n) <(gofmt -d $(SRC))" + +.PHONY: vet +vet: + go vet $(PKGS) + +.PHONY: cover +cover: + $(shell [ -e coverage.out ] && rm coverage.out) + @echo "mode: count" > coverage-all.out + @$(foreach pkg,$(PKGS),\ + go test -coverprofile=coverage.out -covermode=count $(pkg);\ + tail -n +2 coverage.out >> coverage-all.out;) + go tool cover -html=coverage-all.out -o=coverage-all.html diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/README.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/README.md new file mode 100644 index 0000000000000000000000000000000000000000..d02e98700aa8cffc4673139da169c9bae56224d9 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/README.md @@ -0,0 +1,403 @@ +# `pcidb` - the Golang PCI DB library [![Build Status](https://travis-ci.org/jaypipes/pcidb.svg?branch=master)](https://travis-ci.org/jaypipes/pcidb) + +`pcidb` is a small Golang library for programmatic querying of PCI vendor, +product and class information. + +We currently [test](https://travis-ci.org/jaypipes/pcidb/) `pcidb` on Linux, Windows and MacOSX. + +## Usage + +`pcidb` contains a PCI database inspection and querying facility that allows +developers to query for information about hardware device classes, vendor and +product information. + +The `pcidb.New()` function returns a `pcidb.PCIDB` struct. The `pcidb.PCIDB` +struct contains a number of fields that may be queried for PCI information: + +* `pcidb.PCIDB.Classes` is a map, keyed by the PCI class ID (a hex-encoded + string) of pointers to `pcidb.Class` structs, one for each class of PCI + device known to `pcidb` +* `pcidb.PCIDB.Vendors` is a map, keyed by the PCI vendor ID (a hex-encoded + string) of pointers to `pcidb.Vendor` structs, one for each PCI vendor + known to `pcidb` +* `pcidb.PCIDB.Products` is a map, keyed by the PCI product ID* (a hex-encoded + string) of pointers to `pcidb.Product` structs, one for each PCI product + known to `pcidb` + +**NOTE**: PCI products are often referred to by their "device ID". We use +the term "product ID" in `pcidb` because it more accurately reflects what the +identifier is for: a specific product line produced by the vendor. + +### Overriding the root mountpoint `pcidb` uses + +The default root mountpoint that `pcidb` uses when looking for information +about the host system is `/`. So, for example, when looking up known PCI IDS DB +files on Linux, `pcidb` will attempt to discover a pciids DB file at +`/usr/share/misc/pci.ids`. If you are calling `pcidb` from a system that has an +alternate root mountpoint, you can either set the `PCIDB_CHROOT` environment +variable to that alternate path, or call the `pcidb.New()` function with the +`pcidb.WithChroot()` modifier. + +For example, if you are executing from within an application container that has +bind-mounted the root host filesystem to the mount point `/host`, you would set +`PCIDB_CHROOT` to `/host` so that pcidb can find files like +`/usr/share/misc/pci.ids` at `/host/usr/share/misc/pci.ids`. + +Alternately, you can use the `pcidb.WithChroot()` function like so: + +```go +pci := pcidb.New(pcidb.WithChroot("/host")) +``` + +### PCI device classes + +Let's take a look at the PCI device class information and how to query the PCI +database for class, subclass, and programming interface information. + +Each `pcidb.Class` struct contains the following fields: + +* `pcidb.Class.ID` is the hex-encoded string identifier for the device + class +* `pcidb.Class.Name` is the common name/description of the class +* `pcidb.Class.Subclasses` is an array of pointers to + `pcidb.Subclass` structs, one for each subclass in the device class + +Each `pcidb.Subclass` struct contains the following fields: + +* `pcidb.Subclass.ID` is the hex-encoded string identifier for the device + subclass +* `pcidb.Subclass.Name` is the common name/description of the subclass +* `pcidb.Subclass.ProgrammingInterfaces` is an array of pointers to + `pcidb.ProgrammingInterface` structs, one for each programming interface + for the device subclass + +Each `pcidb.ProgrammingInterface` struct contains the following fields: + +* `pcidb.ProgrammingInterface.ID` is the hex-encoded string identifier for + the programming interface +* `pcidb.ProgrammingInterface.Name` is the common name/description for the + programming interface + +```go +package main + +import ( + "fmt" + + "github.com/jaypipes/pcidb" +) + +func main() { + pci, err := pcidb.New() + if err != nil { + fmt.Printf("Error getting PCI info: %v", err) + } + + for _, devClass := range pci.Classes { + fmt.Printf(" Device class: %v ('%v')\n", devClass.Name, devClass.ID) + for _, devSubclass := range devClass.Subclasses { + fmt.Printf(" Device subclass: %v ('%v')\n", devSubclass.Name, devSubclass.ID) + for _, progIface := range devSubclass.ProgrammingInterfaces { + fmt.Printf(" Programming interface: %v ('%v')\n", progIface.Name, progIface.ID) + } + } + } +} +``` + +Example output from my personal workstation, snipped for brevity: + +``` +... + Device class: Serial bus controller ('0c') + Device subclass: FireWire (IEEE 1394) ('00') + Programming interface: Generic ('00') + Programming interface: OHCI ('10') + Device subclass: ACCESS Bus ('01') + Device subclass: SSA ('02') + Device subclass: USB controller ('03') + Programming interface: UHCI ('00') + Programming interface: OHCI ('10') + Programming interface: EHCI ('20') + Programming interface: XHCI ('30') + Programming interface: Unspecified ('80') + Programming interface: USB Device ('fe') + Device subclass: Fibre Channel ('04') + Device subclass: SMBus ('05') + Device subclass: InfiniBand ('06') + Device subclass: IPMI SMIC interface ('07') + Device subclass: SERCOS interface ('08') + Device subclass: CANBUS ('09') +... +``` + +### PCI vendors and products + +Let's take a look at the PCI vendor information and how to query the PCI +database for vendor information and the products a vendor supplies. + +Each `pcidb.Vendor` struct contains the following fields: + +* `pcidb.Vendor.ID` is the hex-encoded string identifier for the vendor +* `pcidb.Vendor.Name` is the common name/description of the vendor +* `pcidb.Vendor.Products` is an array of pointers to `pcidb.Product` + structs, one for each product supplied by the vendor + +Each `pcidb.Product` struct contains the following fields: + +* `pcidb.Product.VendorID` is the hex-encoded string identifier for the + product's vendor +* `pcidb.Product.ID` is the hex-encoded string identifier for the product +* `pcidb.Product.Name` is the common name/description of the subclass +* `pcidb.Product.Subsystems` is an array of pointers to + `pcidb.Product` structs, one for each "subsystem" (sometimes called + "sub-device" in PCI literature) for the product + +**NOTE**: A subsystem product may have a different vendor than its "parent" PCI +product. This is sometimes referred to as the "sub-vendor". + +Here's some example code that demonstrates listing the PCI vendors with the +most known products: + +```go +package main + +import ( + "fmt" + "sort" + + "github.com/jaypipes/pcidb" +) + +type ByCountProducts []*pcidb.Vendor + +func (v ByCountProducts) Len() int { + return len(v) +} + +func (v ByCountProducts) Swap(i, j int) { + v[i], v[j] = v[j], v[i] +} + +func (v ByCountProducts) Less(i, j int) bool { + return len(v[i].Products) > len(v[j].Products) +} + +func main() { + pci, err := pcidb.New() + if err != nil { + fmt.Printf("Error getting PCI info: %v", err) + } + + vendors := make([]*pcidb.Vendor, len(pci.Vendors)) + x := 0 + for _, vendor := range pci.Vendors { + vendors[x] = vendor + x++ + } + + sort.Sort(ByCountProducts(vendors)) + + fmt.Println("Top 5 vendors by product") + fmt.Println("====================================================") + for _, vendor := range vendors[0:5] { + fmt.Printf("%v ('%v') has %d products\n", vendor.Name, vendor.ID, len(vendor.Products)) + } +} +``` + +which yields (on my local workstation as of July 7th, 2018): + +``` +Top 5 vendors by product +==================================================== +Intel Corporation ('8086') has 3389 products +NVIDIA Corporation ('10de') has 1358 products +Advanced Micro Devices, Inc. [AMD/ATI] ('1002') has 886 products +National Instruments ('1093') has 601 products +Chelsio Communications Inc ('1425') has 525 products +``` + +The following is an example of querying the PCI product and subsystem +information to find the products which have the most number of subsystems that +have a different vendor than the top-level product. In other words, the two +products which have been re-sold or re-manufactured with the most number of +different companies. + +```go +package main + +import ( + "fmt" + "sort" + + "github.com/jaypipes/pcidb" +) + +type ByCountSeparateSubvendors []*pcidb.Product + +func (v ByCountSeparateSubvendors) Len() int { + return len(v) +} + +func (v ByCountSeparateSubvendors) Swap(i, j int) { + v[i], v[j] = v[j], v[i] +} + +func (v ByCountSeparateSubvendors) Less(i, j int) bool { + iVendor := v[i].VendorID + iSetSubvendors := make(map[string]bool, 0) + iNumDiffSubvendors := 0 + jVendor := v[j].VendorID + jSetSubvendors := make(map[string]bool, 0) + jNumDiffSubvendors := 0 + + for _, sub := range v[i].Subsystems { + if sub.VendorID != iVendor { + iSetSubvendors[sub.VendorID] = true + } + } + iNumDiffSubvendors = len(iSetSubvendors) + + for _, sub := range v[j].Subsystems { + if sub.VendorID != jVendor { + jSetSubvendors[sub.VendorID] = true + } + } + jNumDiffSubvendors = len(jSetSubvendors) + + return iNumDiffSubvendors > jNumDiffSubvendors +} + +func main() { + pci, err := pcidb.New() + if err != nil { + fmt.Printf("Error getting PCI info: %v", err) + } + + products := make([]*pcidb.Product, len(pci.Products)) + x := 0 + for _, product := range pci.Products { + products[x] = product + x++ + } + + sort.Sort(ByCountSeparateSubvendors(products)) + + fmt.Println("Top 2 products by # different subvendors") + fmt.Println("====================================================") + for _, product := range products[0:2] { + vendorID := product.VendorID + vendor := pci.Vendors[vendorID] + setSubvendors := make(map[string]bool, 0) + + for _, sub := range product.Subsystems { + if sub.VendorID != vendorID { + setSubvendors[sub.VendorID] = true + } + } + fmt.Printf("%v ('%v') from %v\n", product.Name, product.ID, vendor.Name) + fmt.Printf(" -> %d subsystems under the following different vendors:\n", len(setSubvendors)) + for subvendorID, _ := range setSubvendors { + subvendor, exists := pci.Vendors[subvendorID] + subvendorName := "Unknown subvendor" + if exists { + subvendorName = subvendor.Name + } + fmt.Printf(" - %v ('%v')\n", subvendorName, subvendorID) + } + } +} +``` + +which yields (on my local workstation as of July 7th, 2018): + +``` +Top 2 products by # different subvendors +==================================================== +RTL-8100/8101L/8139 PCI Fast Ethernet Adapter ('8139') from Realtek Semiconductor Co., Ltd. + -> 34 subsystems under the following different vendors: + - OVISLINK Corp. ('149c') + - EPoX Computer Co., Ltd. ('1695') + - Red Hat, Inc ('1af4') + - Mitac ('1071') + - Netgear ('1385') + - Micro-Star International Co., Ltd. [MSI] ('1462') + - Hangzhou Silan Microelectronics Co., Ltd. ('1904') + - Compex ('11f6') + - Edimax Computer Co. ('1432') + - KYE Systems Corporation ('1489') + - ZyXEL Communications Corporation ('187e') + - Acer Incorporated [ALI] ('1025') + - Matsushita Electric Industrial Co., Ltd. ('10f7') + - Ruby Tech Corp. ('146c') + - Belkin ('1799') + - Allied Telesis ('1259') + - Unex Technology Corp. ('1429') + - CIS Technology Inc ('1436') + - D-Link System Inc ('1186') + - Ambicom Inc ('1395') + - AOPEN Inc. ('a0a0') + - TTTech Computertechnik AG (Wrong ID) ('0357') + - Gigabyte Technology Co., Ltd ('1458') + - Packard Bell B.V. ('1631') + - Billionton Systems Inc ('14cb') + - Kingston Technologies ('2646') + - Accton Technology Corporation ('1113') + - Samsung Electronics Co Ltd ('144d') + - Biostar Microtech Int'l Corp ('1565') + - U.S. Robotics ('16ec') + - KTI ('8e2e') + - Hewlett-Packard Company ('103c') + - ASUSTeK Computer Inc. ('1043') + - Surecom Technology ('10bd') +Bt878 Video Capture ('036e') from Brooktree Corporation + -> 30 subsystems under the following different vendors: + - iTuner ('aa00') + - Nebula Electronics Ltd. ('0071') + - DViCO Corporation ('18ac') + - iTuner ('aa05') + - iTuner ('aa0d') + - LeadTek Research Inc. ('107d') + - Avermedia Technologies Inc ('1461') + - Chaintech Computer Co. Ltd ('270f') + - iTuner ('aa07') + - iTuner ('aa0a') + - Microtune, Inc. ('1851') + - iTuner ('aa01') + - iTuner ('aa04') + - iTuner ('aa06') + - iTuner ('aa0f') + - iTuner ('aa02') + - iTuner ('aa0b') + - Pinnacle Systems, Inc. (Wrong ID) ('bd11') + - Rockwell International ('127a') + - Askey Computer Corp. ('144f') + - Twinhan Technology Co. Ltd ('1822') + - Anritsu Corp. ('1852') + - iTuner ('aa08') + - Hauppauge computer works Inc. ('0070') + - Pinnacle Systems Inc. ('11bd') + - Conexant Systems, Inc. ('14f1') + - iTuner ('aa09') + - iTuner ('aa03') + - iTuner ('aa0c') + - iTuner ('aa0e') +``` + +## Developers + +Contributions to `pcidb` are welcomed! Fork the repo on GitHub and submit a pull +request with your proposed changes. Or, feel free to log an issue for a feature +request or bug report. + +### Running tests + +You can run unit tests easily using the `make test` command, like so: + + +``` +[jaypipes@uberbox pcidb]$ make test +go test github.com/jaypipes/pcidb +ok github.com/jaypipes/pcidb 0.045s +``` diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/context.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/context.go new file mode 100644 index 0000000000000000000000000000000000000000..a04abafac9d5da4b2a658e549b16d36575c181b9 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/context.go @@ -0,0 +1,69 @@ +package pcidb + +import ( + "fmt" + "os" + "path/filepath" + "runtime" + + homedir "github.com/mitchellh/go-homedir" +) + +// Concrete merged set of configuration switches that get passed to pcidb +// internal functions +type context struct { + chroot string + cacheOnly bool + cachePath string + searchPaths []string +} + +func contextFromOptions(merged *WithOption) *context { + ctx := &context{ + chroot: *merged.Chroot, + cacheOnly: *merged.CacheOnly, + cachePath: getCachePath(), + searchPaths: make([]string, 0), + } + ctx.setSearchPaths() + return ctx +} + +func getCachePath() string { + hdir, err := homedir.Dir() + if err != nil { + fmt.Fprintf(os.Stderr, "Failed getting homedir.Dir(): %v", err) + return "" + } + fp, err := homedir.Expand(filepath.Join(hdir, ".cache", "pci.ids")) + if err != nil { + fmt.Fprintf(os.Stderr, "Failed expanding local cache path: %v", err) + return "" + } + return fp +} + +// Depending on the operating system, sets the context's searchPaths to a set +// of local filepaths to search for a pci.ids database file +func (ctx *context) setSearchPaths() { + // A set of filepaths we will first try to search for the pci-ids DB file + // on the local machine. If we fail to find one, we'll try pulling the + // latest pci-ids file from the network + ctx.searchPaths = append(ctx.searchPaths, ctx.cachePath) + if ctx.cacheOnly { + return + } + + rootPath := ctx.chroot + + if runtime.GOOS != "windows" { + ctx.searchPaths = append( + ctx.searchPaths, + filepath.Join(rootPath, "usr", "share", "hwdata", "pci.ids"), + ) + ctx.searchPaths = append( + ctx.searchPaths, + filepath.Join(rootPath, "usr", "share", "misc", "pci.ids"), + ) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/discover.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/discover.go new file mode 100644 index 0000000000000000000000000000000000000000..dd4804be9178c18792afe475de89846b29da1411 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/discover.go @@ -0,0 +1,83 @@ +// +// Use and distribution licensed under the Apache license version 2. +// +// See the COPYING file in the root project directory for full text. +// + +package pcidb + +import ( + "bufio" + "compress/gzip" + "io" + "net/http" + "os" + "path/filepath" +) + +const ( + PCIIDS_URI = "https://pci-ids.ucw.cz/v2.2/pci.ids.gz" +) + +func (db *PCIDB) load(ctx *context) error { + var foundPath string + for _, fp := range ctx.searchPaths { + if _, err := os.Stat(fp); err == nil { + foundPath = fp + break + } + } + if foundPath == "" { + // OK, so we didn't find any host-local copy of the pci-ids DB file. Let's + // try fetching it from the network and storing it + if err := cacheDBFile(ctx.cachePath); err != nil { + return err + } + foundPath = ctx.cachePath + } + f, err := os.Open(foundPath) + if err != nil { + return err + } + defer f.Close() + scanner := bufio.NewScanner(f) + return parseDBFile(db, scanner) +} + +func ensureDir(fp string) error { + fpDir := filepath.Dir(fp) + if _, err := os.Stat(fpDir); os.IsNotExist(err) { + err = os.MkdirAll(fpDir, os.ModePerm) + if err != nil { + return err + } + } + return nil +} + +// Pulls down the latest copy of the pci-ids file from the network and stores +// it in the local host filesystem +func cacheDBFile(cacheFilePath string) error { + ensureDir(cacheFilePath) + + response, err := http.Get(PCIIDS_URI) + if err != nil { + return err + } + defer response.Body.Close() + f, err := os.Create(cacheFilePath) + if err != nil { + return err + } + defer f.Close() + // write the gunzipped contents to our local cache file + zr, err := gzip.NewReader(response.Body) + if err != nil { + return err + } + defer zr.Close() + if _, err = io.Copy(f, zr); err != nil { + return err + } + return err +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/main.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/main.go new file mode 100644 index 0000000000000000000000000000000000000000..102b7b85c8ed1e16444d5631c92678bf15a4708d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/main.go @@ -0,0 +1,134 @@ +// +// Use and distribution licensed under the Apache license version 2. +// +// See the COPYING file in the root project directory for full text. +// + +package pcidb + +import ( + "fmt" + "os" + "strconv" +) + +var ( + cacheOnlyTrue = true +) + +// ProgrammingInterface is the PCI programming interface for a class of PCI +// devices +type ProgrammingInterface struct { + ID string // hex-encoded PCI_ID of the programming interface + Name string // common string name for the programming interface +} + +// Subclass is a subdivision of a PCI class +type Subclass struct { + ID string // hex-encoded PCI_ID for the device subclass + Name string // common string name for the subclass + ProgrammingInterfaces []*ProgrammingInterface // any programming interfaces this subclass might have +} + +// Class is the PCI class +type Class struct { + ID string // hex-encoded PCI_ID for the device class + Name string // common string name for the class + Subclasses []*Subclass // any subclasses belonging to this class +} + +// Product provides information about a PCI device model +// NOTE(jaypipes): In the hardware world, the PCI "device_id" is the identifier +// for the product/model +type Product struct { + VendorID string // vendor ID for the product + ID string // hex-encoded PCI_ID for the product/model + Name string // common string name of the vendor + Subsystems []*Product // "subdevices" or "subsystems" for the product +} + +// Vendor provides information about a device vendor +type Vendor struct { + ID string // hex-encoded PCI_ID for the vendor + Name string // common string name of the vendor + Products []*Product // all top-level devices for the vendor +} + +type PCIDB struct { + // hash of class ID -> class information + Classes map[string]*Class + // hash of vendor ID -> vendor information + Vendors map[string]*Vendor + // hash of vendor ID + product/device ID -> product information + Products map[string]*Product +} + +// WithOption is used to represent optionally-configured settings +type WithOption struct { + // Chroot is the directory that pcidb uses when attempting to discover + // pciids DB files + Chroot *string + // CacheOnly is mostly just useful for testing. It essentially disables + // looking for any non ~/.cache/pci.ids filepaths (which is useful when we + // want to test the fetch-from-network code paths + CacheOnly *bool +} + +func WithChroot(dir string) *WithOption { + return &WithOption{Chroot: &dir} +} + +func WithCacheOnly() *WithOption { + return &WithOption{CacheOnly: &cacheOnlyTrue} +} + +func mergeOptions(opts ...*WithOption) *WithOption { + // Grab options from the environs by default + defaultChroot := "/" + if val, exists := os.LookupEnv("PCIDB_CHROOT"); exists { + defaultChroot = val + } + defaultCacheOnly := false + if val, exists := os.LookupEnv("PCIDB_CACHE_ONLY"); exists { + if parsed, err := strconv.ParseBool(val); err != nil { + fmt.Fprintf( + os.Stderr, + "Failed parsing a bool from PCIDB_CACHE_ONLY "+ + "environ value of %s", + val, + ) + } else if parsed { + defaultCacheOnly = parsed + } + } + merged := &WithOption{} + for _, opt := range opts { + if opt.Chroot != nil { + merged.Chroot = opt.Chroot + } + if opt.CacheOnly != nil { + merged.CacheOnly = opt.CacheOnly + } + } + // Set the default value if missing from merged + if merged.Chroot == nil { + merged.Chroot = &defaultChroot + } + if merged.CacheOnly == nil { + merged.CacheOnly = &defaultCacheOnly + } + return merged +} + +// New returns a pointer to a PCIDB struct which contains information you can +// use to query PCI vendor, product and class information. It accepts zero or +// more pointers to WithOption structs. If you want to modify the behaviour of +// pcidb, use one of the option modifiers when calling New. For example, to +// change the root directory that pcidb uses when discovering pciids DB files, +// call New(WithChroot("/my/root/override")) +func New(opts ...*WithOption) (*PCIDB, error) { + ctx := contextFromOptions(mergeOptions(opts...)) + db := &PCIDB{} + err := db.load(ctx) + return db, err +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/parse.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/parse.go new file mode 100644 index 0000000000000000000000000000000000000000..8124499ebd054f02a60c661d6bd6f6ad07d2d2f2 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jaypipes/pcidb/parse.go @@ -0,0 +1,163 @@ +// +// Use and distribution licensed under the Apache license version 2. +// +// See the COPYING file in the root project directory for full text. +// + +package pcidb + +import ( + "bufio" + "strings" +) + +func parseDBFile(db *PCIDB, scanner *bufio.Scanner) error { + inClassBlock := false + db.Classes = make(map[string]*Class, 20) + db.Vendors = make(map[string]*Vendor, 200) + db.Products = make(map[string]*Product, 1000) + subclasses := make([]*Subclass, 0) + progIfaces := make([]*ProgrammingInterface, 0) + var curClass *Class + var curSubclass *Subclass + var curProgIface *ProgrammingInterface + vendorProducts := make([]*Product, 0) + var curVendor *Vendor + var curProduct *Product + var curSubsystem *Product + productSubsystems := make([]*Product, 0) + for scanner.Scan() { + line := scanner.Text() + // skip comments and blank lines + if line == "" || strings.HasPrefix(line, "#") { + continue + } + lineBytes := []rune(line) + + // Lines starting with an uppercase "C" indicate a PCI top-level class + // dbrmation block. These lines look like this: + // + // C 02 Network controller + if lineBytes[0] == 'C' { + if curClass != nil { + // finalize existing class because we found a new class block + curClass.Subclasses = subclasses + subclasses = make([]*Subclass, 0) + } + inClassBlock = true + classID := string(lineBytes[2:4]) + className := string(lineBytes[6:]) + curClass = &Class{ + ID: classID, + Name: className, + Subclasses: subclasses, + } + db.Classes[curClass.ID] = curClass + continue + } + + // Lines not beginning with an uppercase "C" or a TAB character + // indicate a top-level vendor dbrmation block. These lines look like + // this: + // + // 0a89 BREA Technologies Inc + if lineBytes[0] != '\t' { + if curVendor != nil { + // finalize existing vendor because we found a new vendor block + curVendor.Products = vendorProducts + vendorProducts = make([]*Product, 0) + } + inClassBlock = false + vendorID := string(lineBytes[0:4]) + vendorName := string(lineBytes[6:]) + curVendor = &Vendor{ + ID: vendorID, + Name: vendorName, + Products: vendorProducts, + } + db.Vendors[curVendor.ID] = curVendor + continue + } + + // Lines beginning with only a single TAB character are *either* a + // subclass OR are a device dbrmation block. If we're in a class + // block (i.e. the last parsed block header was for a PCI class), then + // we parse a subclass block. Otherwise, we parse a device dbrmation + // block. + // + // A subclass dbrmation block looks like this: + // + // \t00 Non-VGA unclassified device + // + // A device dbrmation block looks like this: + // + // \t0002 PCI to MCA Bridge + if len(lineBytes) > 1 && lineBytes[1] != '\t' { + if inClassBlock { + if curSubclass != nil { + // finalize existing subclass because we found a new subclass block + curSubclass.ProgrammingInterfaces = progIfaces + progIfaces = make([]*ProgrammingInterface, 0) + } + subclassID := string(lineBytes[1:3]) + subclassName := string(lineBytes[5:]) + curSubclass = &Subclass{ + ID: subclassID, + Name: subclassName, + ProgrammingInterfaces: progIfaces, + } + subclasses = append(subclasses, curSubclass) + } else { + if curProduct != nil { + // finalize existing product because we found a new product block + curProduct.Subsystems = productSubsystems + productSubsystems = make([]*Product, 0) + } + productID := string(lineBytes[1:5]) + productName := string(lineBytes[7:]) + productKey := curVendor.ID + productID + curProduct = &Product{ + VendorID: curVendor.ID, + ID: productID, + Name: productName, + } + vendorProducts = append(vendorProducts, curProduct) + db.Products[productKey] = curProduct + } + } else { + // Lines beginning with two TAB characters are *either* a subsystem + // (subdevice) OR are a programming interface for a PCI device + // subclass. If we're in a class block (i.e. the last parsed block + // header was for a PCI class), then we parse a programming + // interface block, otherwise we parse a subsystem block. + // + // A programming interface block looks like this: + // + // \t\t00 UHCI + // + // A subsystem block looks like this: + // + // \t\t0e11 4091 Smart Array 6i + if inClassBlock { + progIfaceID := string(lineBytes[2:4]) + progIfaceName := string(lineBytes[6:]) + curProgIface = &ProgrammingInterface{ + ID: progIfaceID, + Name: progIfaceName, + } + progIfaces = append(progIfaces, curProgIface) + } else { + vendorID := string(lineBytes[2:6]) + subsystemID := string(lineBytes[7:11]) + subsystemName := string(lineBytes[13:]) + curSubsystem = &Product{ + VendorID: vendorID, + ID: subsystemID, + Name: subsystemName, + } + productSubsystems = append(productSubsystems, curSubsystem) + } + } + } + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/License b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/License new file mode 100644 index 0000000000000000000000000000000000000000..037e1653e69a614af4884c6003750536adf99f33 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/License @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013-NOW Jinzhu <wosmvp@gmail.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/README.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/README.md new file mode 100644 index 0000000000000000000000000000000000000000..0c5c7ea6c10656ad3bdc31d22f124ef0ae8b60bc --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/README.md @@ -0,0 +1,40 @@ +# GORM + +The fantastic ORM library for Golang, aims to be developer friendly. + +[![go report card](https://goreportcard.com/badge/github.com/jinzhu/gorm "go report card")](https://goreportcard.com/report/github.com/jinzhu/gorm) +[![wercker status](https://app.wercker.com/status/8596cace912c9947dd9c8542ecc8cb8b/s/master "wercker status")](https://app.wercker.com/project/byKey/8596cace912c9947dd9c8542ecc8cb8b) +[![Join the chat at https://gitter.im/jinzhu/gorm](https://img.shields.io/gitter/room/jinzhu/gorm.svg)](https://gitter.im/jinzhu/gorm?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![Open Collective Backer](https://opencollective.com/gorm/tiers/backer/badge.svg?label=backer&color=brightgreen "Open Collective Backer")](https://opencollective.com/gorm) +[![Open Collective Sponsor](https://opencollective.com/gorm/tiers/sponsor/badge.svg?label=sponsor&color=brightgreen "Open Collective Sponsor")](https://opencollective.com/gorm) +[![MIT license](http://img.shields.io/badge/license-MIT-brightgreen.svg)](http://opensource.org/licenses/MIT) +[![GoDoc](https://godoc.org/github.com/jinzhu/gorm?status.svg)](https://godoc.org/github.com/jinzhu/gorm) + +## Overview + +* Full-Featured ORM (almost) +* Associations (Has One, Has Many, Belongs To, Many To Many, Polymorphism) +* Hooks (Before/After Create/Save/Update/Delete/Find) +* Preloading (eager loading) +* Transactions +* Composite Primary Key +* SQL Builder +* Auto Migrations +* Logger +* Extendable, write Plugins based on GORM callbacks +* Every feature comes with tests +* Developer Friendly + +## Getting Started + +* GORM Guides [http://gorm.io](http://gorm.io) + +## Contributing + +[You can help to deliver a better GORM, check out things you can do](http://gorm.io/contribute.html) + +## License + +© Jinzhu, 2013~time.Now + +Released under the [MIT License](https://github.com/jinzhu/gorm/blob/master/License) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/association.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/association.go new file mode 100644 index 0000000000000000000000000000000000000000..1b7744b54172995e668006a64c86559e5c6dd2ce --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/association.go @@ -0,0 +1,376 @@ +package gorm + +import ( + "errors" + "fmt" + "reflect" +) + +// Association Mode contains some helper methods to handle relationship things easily. +type Association struct { + Error error + scope *Scope + column string + field *Field +} + +// Find find out all related associations +func (association *Association) Find(value interface{}) *Association { + association.scope.related(value, association.column) + return association.setErr(association.scope.db.Error) +} + +// Append append new associations for many2many, has_many, replace current association for has_one, belongs_to +func (association *Association) Append(values ...interface{}) *Association { + if association.Error != nil { + return association + } + + if relationship := association.field.Relationship; relationship.Kind == "has_one" { + return association.Replace(values...) + } + return association.saveAssociations(values...) +} + +// Replace replace current associations with new one +func (association *Association) Replace(values ...interface{}) *Association { + if association.Error != nil { + return association + } + + var ( + relationship = association.field.Relationship + scope = association.scope + field = association.field.Field + newDB = scope.NewDB() + ) + + // Append new values + association.field.Set(reflect.Zero(association.field.Field.Type())) + association.saveAssociations(values...) + + // Belongs To + if relationship.Kind == "belongs_to" { + // Set foreign key to be null when clearing value (length equals 0) + if len(values) == 0 { + // Set foreign key to be nil + var foreignKeyMap = map[string]interface{}{} + for _, foreignKey := range relationship.ForeignDBNames { + foreignKeyMap[foreignKey] = nil + } + association.setErr(newDB.Model(scope.Value).UpdateColumn(foreignKeyMap).Error) + } + } else { + // Polymorphic Relations + if relationship.PolymorphicDBName != "" { + newDB = newDB.Where(fmt.Sprintf("%v = ?", scope.Quote(relationship.PolymorphicDBName)), relationship.PolymorphicValue) + } + + // Delete Relations except new created + if len(values) > 0 { + var associationForeignFieldNames, associationForeignDBNames []string + if relationship.Kind == "many_to_many" { + // if many to many relations, get association fields name from association foreign keys + associationScope := scope.New(reflect.New(field.Type()).Interface()) + for idx, dbName := range relationship.AssociationForeignFieldNames { + if field, ok := associationScope.FieldByName(dbName); ok { + associationForeignFieldNames = append(associationForeignFieldNames, field.Name) + associationForeignDBNames = append(associationForeignDBNames, relationship.AssociationForeignDBNames[idx]) + } + } + } else { + // If has one/many relations, use primary keys + for _, field := range scope.New(reflect.New(field.Type()).Interface()).PrimaryFields() { + associationForeignFieldNames = append(associationForeignFieldNames, field.Name) + associationForeignDBNames = append(associationForeignDBNames, field.DBName) + } + } + + newPrimaryKeys := scope.getColumnAsArray(associationForeignFieldNames, field.Interface()) + + if len(newPrimaryKeys) > 0 { + sql := fmt.Sprintf("%v NOT IN (%v)", toQueryCondition(scope, associationForeignDBNames), toQueryMarks(newPrimaryKeys)) + newDB = newDB.Where(sql, toQueryValues(newPrimaryKeys)...) + } + } + + if relationship.Kind == "many_to_many" { + // if many to many relations, delete related relations from join table + var sourceForeignFieldNames []string + + for _, dbName := range relationship.ForeignFieldNames { + if field, ok := scope.FieldByName(dbName); ok { + sourceForeignFieldNames = append(sourceForeignFieldNames, field.Name) + } + } + + if sourcePrimaryKeys := scope.getColumnAsArray(sourceForeignFieldNames, scope.Value); len(sourcePrimaryKeys) > 0 { + newDB = newDB.Where(fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relationship.ForeignDBNames), toQueryMarks(sourcePrimaryKeys)), toQueryValues(sourcePrimaryKeys)...) + + association.setErr(relationship.JoinTableHandler.Delete(relationship.JoinTableHandler, newDB)) + } + } else if relationship.Kind == "has_one" || relationship.Kind == "has_many" { + // has_one or has_many relations, set foreign key to be nil (TODO or delete them?) + var foreignKeyMap = map[string]interface{}{} + for idx, foreignKey := range relationship.ForeignDBNames { + foreignKeyMap[foreignKey] = nil + if field, ok := scope.FieldByName(relationship.AssociationForeignFieldNames[idx]); ok { + newDB = newDB.Where(fmt.Sprintf("%v = ?", scope.Quote(foreignKey)), field.Field.Interface()) + } + } + + fieldValue := reflect.New(association.field.Field.Type()).Interface() + association.setErr(newDB.Model(fieldValue).UpdateColumn(foreignKeyMap).Error) + } + } + return association +} + +// Delete remove relationship between source & passed arguments, but won't delete those arguments +func (association *Association) Delete(values ...interface{}) *Association { + if association.Error != nil { + return association + } + + var ( + relationship = association.field.Relationship + scope = association.scope + field = association.field.Field + newDB = scope.NewDB() + ) + + if len(values) == 0 { + return association + } + + var deletingResourcePrimaryFieldNames, deletingResourcePrimaryDBNames []string + for _, field := range scope.New(reflect.New(field.Type()).Interface()).PrimaryFields() { + deletingResourcePrimaryFieldNames = append(deletingResourcePrimaryFieldNames, field.Name) + deletingResourcePrimaryDBNames = append(deletingResourcePrimaryDBNames, field.DBName) + } + + deletingPrimaryKeys := scope.getColumnAsArray(deletingResourcePrimaryFieldNames, values...) + + if relationship.Kind == "many_to_many" { + // source value's foreign keys + for idx, foreignKey := range relationship.ForeignDBNames { + if field, ok := scope.FieldByName(relationship.ForeignFieldNames[idx]); ok { + newDB = newDB.Where(fmt.Sprintf("%v = ?", scope.Quote(foreignKey)), field.Field.Interface()) + } + } + + // get association's foreign fields name + var associationScope = scope.New(reflect.New(field.Type()).Interface()) + var associationForeignFieldNames []string + for _, associationDBName := range relationship.AssociationForeignFieldNames { + if field, ok := associationScope.FieldByName(associationDBName); ok { + associationForeignFieldNames = append(associationForeignFieldNames, field.Name) + } + } + + // association value's foreign keys + deletingPrimaryKeys := scope.getColumnAsArray(associationForeignFieldNames, values...) + sql := fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relationship.AssociationForeignDBNames), toQueryMarks(deletingPrimaryKeys)) + newDB = newDB.Where(sql, toQueryValues(deletingPrimaryKeys)...) + + association.setErr(relationship.JoinTableHandler.Delete(relationship.JoinTableHandler, newDB)) + } else { + var foreignKeyMap = map[string]interface{}{} + for _, foreignKey := range relationship.ForeignDBNames { + foreignKeyMap[foreignKey] = nil + } + + if relationship.Kind == "belongs_to" { + // find with deleting relation's foreign keys + primaryKeys := scope.getColumnAsArray(relationship.AssociationForeignFieldNames, values...) + newDB = newDB.Where( + fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relationship.ForeignDBNames), toQueryMarks(primaryKeys)), + toQueryValues(primaryKeys)..., + ) + + // set foreign key to be null if there are some records affected + modelValue := reflect.New(scope.GetModelStruct().ModelType).Interface() + if results := newDB.Model(modelValue).UpdateColumn(foreignKeyMap); results.Error == nil { + if results.RowsAffected > 0 { + scope.updatedAttrsWithValues(foreignKeyMap) + } + } else { + association.setErr(results.Error) + } + } else if relationship.Kind == "has_one" || relationship.Kind == "has_many" { + // find all relations + primaryKeys := scope.getColumnAsArray(relationship.AssociationForeignFieldNames, scope.Value) + newDB = newDB.Where( + fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relationship.ForeignDBNames), toQueryMarks(primaryKeys)), + toQueryValues(primaryKeys)..., + ) + + // only include those deleting relations + newDB = newDB.Where( + fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, deletingResourcePrimaryDBNames), toQueryMarks(deletingPrimaryKeys)), + toQueryValues(deletingPrimaryKeys)..., + ) + + // set matched relation's foreign key to be null + fieldValue := reflect.New(association.field.Field.Type()).Interface() + association.setErr(newDB.Model(fieldValue).UpdateColumn(foreignKeyMap).Error) + } + } + + // Remove deleted records from source's field + if association.Error == nil { + if field.Kind() == reflect.Slice { + leftValues := reflect.Zero(field.Type()) + + for i := 0; i < field.Len(); i++ { + reflectValue := field.Index(i) + primaryKey := scope.getColumnAsArray(deletingResourcePrimaryFieldNames, reflectValue.Interface())[0] + var isDeleted = false + for _, pk := range deletingPrimaryKeys { + if equalAsString(primaryKey, pk) { + isDeleted = true + break + } + } + if !isDeleted { + leftValues = reflect.Append(leftValues, reflectValue) + } + } + + association.field.Set(leftValues) + } else if field.Kind() == reflect.Struct { + primaryKey := scope.getColumnAsArray(deletingResourcePrimaryFieldNames, field.Interface())[0] + for _, pk := range deletingPrimaryKeys { + if equalAsString(primaryKey, pk) { + association.field.Set(reflect.Zero(field.Type())) + break + } + } + } + } + + return association +} + +// Clear remove relationship between source & current associations, won't delete those associations +func (association *Association) Clear() *Association { + return association.Replace() +} + +// Count return the count of current associations +func (association *Association) Count() int { + var ( + count = 0 + relationship = association.field.Relationship + scope = association.scope + fieldValue = association.field.Field.Interface() + query = scope.DB() + ) + + switch relationship.Kind { + case "many_to_many": + query = relationship.JoinTableHandler.JoinWith(relationship.JoinTableHandler, query, scope.Value) + case "has_many", "has_one": + primaryKeys := scope.getColumnAsArray(relationship.AssociationForeignFieldNames, scope.Value) + query = query.Where( + fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relationship.ForeignDBNames), toQueryMarks(primaryKeys)), + toQueryValues(primaryKeys)..., + ) + case "belongs_to": + primaryKeys := scope.getColumnAsArray(relationship.ForeignFieldNames, scope.Value) + query = query.Where( + fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relationship.AssociationForeignDBNames), toQueryMarks(primaryKeys)), + toQueryValues(primaryKeys)..., + ) + } + + if relationship.PolymorphicType != "" { + query = query.Where( + fmt.Sprintf("%v.%v = ?", scope.New(fieldValue).QuotedTableName(), scope.Quote(relationship.PolymorphicDBName)), + relationship.PolymorphicValue, + ) + } + + if err := query.Model(fieldValue).Count(&count).Error; err != nil { + association.Error = err + } + return count +} + +// saveAssociations save passed values as associations +func (association *Association) saveAssociations(values ...interface{}) *Association { + var ( + scope = association.scope + field = association.field + relationship = field.Relationship + ) + + saveAssociation := func(reflectValue reflect.Value) { + // value has to been pointer + if reflectValue.Kind() != reflect.Ptr { + reflectPtr := reflect.New(reflectValue.Type()) + reflectPtr.Elem().Set(reflectValue) + reflectValue = reflectPtr + } + + // value has to been saved for many2many + if relationship.Kind == "many_to_many" { + if scope.New(reflectValue.Interface()).PrimaryKeyZero() { + association.setErr(scope.NewDB().Save(reflectValue.Interface()).Error) + } + } + + // Assign Fields + var fieldType = field.Field.Type() + var setFieldBackToValue, setSliceFieldBackToValue bool + if reflectValue.Type().AssignableTo(fieldType) { + field.Set(reflectValue) + } else if reflectValue.Type().Elem().AssignableTo(fieldType) { + // if field's type is struct, then need to set value back to argument after save + setFieldBackToValue = true + field.Set(reflectValue.Elem()) + } else if fieldType.Kind() == reflect.Slice { + if reflectValue.Type().AssignableTo(fieldType.Elem()) { + field.Set(reflect.Append(field.Field, reflectValue)) + } else if reflectValue.Type().Elem().AssignableTo(fieldType.Elem()) { + // if field's type is slice of struct, then need to set value back to argument after save + setSliceFieldBackToValue = true + field.Set(reflect.Append(field.Field, reflectValue.Elem())) + } + } + + if relationship.Kind == "many_to_many" { + association.setErr(relationship.JoinTableHandler.Add(relationship.JoinTableHandler, scope.NewDB(), scope.Value, reflectValue.Interface())) + } else { + association.setErr(scope.NewDB().Select(field.Name).Save(scope.Value).Error) + + if setFieldBackToValue { + reflectValue.Elem().Set(field.Field) + } else if setSliceFieldBackToValue { + reflectValue.Elem().Set(field.Field.Index(field.Field.Len() - 1)) + } + } + } + + for _, value := range values { + reflectValue := reflect.ValueOf(value) + indirectReflectValue := reflect.Indirect(reflectValue) + if indirectReflectValue.Kind() == reflect.Struct { + saveAssociation(reflectValue) + } else if indirectReflectValue.Kind() == reflect.Slice { + for i := 0; i < indirectReflectValue.Len(); i++ { + saveAssociation(indirectReflectValue.Index(i)) + } + } else { + association.setErr(errors.New("invalid value type")) + } + } + return association +} + +func (association *Association) setErr(err error) *Association { + if err != nil { + association.Error = err + } + return association +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/callback.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/callback.go new file mode 100644 index 0000000000000000000000000000000000000000..a4382147b974a4298a0be8676ae278e7dc547d51 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/callback.go @@ -0,0 +1,242 @@ +package gorm + +import "log" + +// DefaultCallback default callbacks defined by gorm +var DefaultCallback = &Callback{} + +// Callback is a struct that contains all CRUD callbacks +// Field `creates` contains callbacks will be call when creating object +// Field `updates` contains callbacks will be call when updating object +// Field `deletes` contains callbacks will be call when deleting object +// Field `queries` contains callbacks will be call when querying object with query methods like Find, First, Related, Association... +// Field `rowQueries` contains callbacks will be call when querying object with Row, Rows... +// Field `processors` contains all callback processors, will be used to generate above callbacks in order +type Callback struct { + creates []*func(scope *Scope) + updates []*func(scope *Scope) + deletes []*func(scope *Scope) + queries []*func(scope *Scope) + rowQueries []*func(scope *Scope) + processors []*CallbackProcessor +} + +// CallbackProcessor contains callback informations +type CallbackProcessor struct { + name string // current callback's name + before string // register current callback before a callback + after string // register current callback after a callback + replace bool // replace callbacks with same name + remove bool // delete callbacks with same name + kind string // callback type: create, update, delete, query, row_query + processor *func(scope *Scope) // callback handler + parent *Callback +} + +func (c *Callback) clone() *Callback { + return &Callback{ + creates: c.creates, + updates: c.updates, + deletes: c.deletes, + queries: c.queries, + rowQueries: c.rowQueries, + processors: c.processors, + } +} + +// Create could be used to register callbacks for creating object +// db.Callback().Create().After("gorm:create").Register("plugin:run_after_create", func(*Scope) { +// // business logic +// ... +// +// // set error if some thing wrong happened, will rollback the creating +// scope.Err(errors.New("error")) +// }) +func (c *Callback) Create() *CallbackProcessor { + return &CallbackProcessor{kind: "create", parent: c} +} + +// Update could be used to register callbacks for updating object, refer `Create` for usage +func (c *Callback) Update() *CallbackProcessor { + return &CallbackProcessor{kind: "update", parent: c} +} + +// Delete could be used to register callbacks for deleting object, refer `Create` for usage +func (c *Callback) Delete() *CallbackProcessor { + return &CallbackProcessor{kind: "delete", parent: c} +} + +// Query could be used to register callbacks for querying objects with query methods like `Find`, `First`, `Related`, `Association`... +// Refer `Create` for usage +func (c *Callback) Query() *CallbackProcessor { + return &CallbackProcessor{kind: "query", parent: c} +} + +// RowQuery could be used to register callbacks for querying objects with `Row`, `Rows`, refer `Create` for usage +func (c *Callback) RowQuery() *CallbackProcessor { + return &CallbackProcessor{kind: "row_query", parent: c} +} + +// After insert a new callback after callback `callbackName`, refer `Callbacks.Create` +func (cp *CallbackProcessor) After(callbackName string) *CallbackProcessor { + cp.after = callbackName + return cp +} + +// Before insert a new callback before callback `callbackName`, refer `Callbacks.Create` +func (cp *CallbackProcessor) Before(callbackName string) *CallbackProcessor { + cp.before = callbackName + return cp +} + +// Register a new callback, refer `Callbacks.Create` +func (cp *CallbackProcessor) Register(callbackName string, callback func(scope *Scope)) { + if cp.kind == "row_query" { + if cp.before == "" && cp.after == "" && callbackName != "gorm:row_query" { + log.Printf("Registing RowQuery callback %v without specify order with Before(), After(), applying Before('gorm:row_query') by default for compatibility...\n", callbackName) + cp.before = "gorm:row_query" + } + } + + cp.name = callbackName + cp.processor = &callback + cp.parent.processors = append(cp.parent.processors, cp) + cp.parent.reorder() +} + +// Remove a registered callback +// db.Callback().Create().Remove("gorm:update_time_stamp_when_create") +func (cp *CallbackProcessor) Remove(callbackName string) { + log.Printf("[info] removing callback `%v` from %v\n", callbackName, fileWithLineNum()) + cp.name = callbackName + cp.remove = true + cp.parent.processors = append(cp.parent.processors, cp) + cp.parent.reorder() +} + +// Replace a registered callback with new callback +// db.Callback().Create().Replace("gorm:update_time_stamp_when_create", func(*Scope) { +// scope.SetColumn("Created", now) +// scope.SetColumn("Updated", now) +// }) +func (cp *CallbackProcessor) Replace(callbackName string, callback func(scope *Scope)) { + log.Printf("[info] replacing callback `%v` from %v\n", callbackName, fileWithLineNum()) + cp.name = callbackName + cp.processor = &callback + cp.replace = true + cp.parent.processors = append(cp.parent.processors, cp) + cp.parent.reorder() +} + +// Get registered callback +// db.Callback().Create().Get("gorm:create") +func (cp *CallbackProcessor) Get(callbackName string) (callback func(scope *Scope)) { + for _, p := range cp.parent.processors { + if p.name == callbackName && p.kind == cp.kind && !cp.remove { + return *p.processor + } + } + return nil +} + +// getRIndex get right index from string slice +func getRIndex(strs []string, str string) int { + for i := len(strs) - 1; i >= 0; i-- { + if strs[i] == str { + return i + } + } + return -1 +} + +// sortProcessors sort callback processors based on its before, after, remove, replace +func sortProcessors(cps []*CallbackProcessor) []*func(scope *Scope) { + var ( + allNames, sortedNames []string + sortCallbackProcessor func(c *CallbackProcessor) + ) + + for _, cp := range cps { + // show warning message the callback name already exists + if index := getRIndex(allNames, cp.name); index > -1 && !cp.replace && !cp.remove { + log.Printf("[warning] duplicated callback `%v` from %v\n", cp.name, fileWithLineNum()) + } + allNames = append(allNames, cp.name) + } + + sortCallbackProcessor = func(c *CallbackProcessor) { + if getRIndex(sortedNames, c.name) == -1 { // if not sorted + if c.before != "" { // if defined before callback + if index := getRIndex(sortedNames, c.before); index != -1 { + // if before callback already sorted, append current callback just after it + sortedNames = append(sortedNames[:index], append([]string{c.name}, sortedNames[index:]...)...) + } else if index := getRIndex(allNames, c.before); index != -1 { + // if before callback exists but haven't sorted, append current callback to last + sortedNames = append(sortedNames, c.name) + sortCallbackProcessor(cps[index]) + } + } + + if c.after != "" { // if defined after callback + if index := getRIndex(sortedNames, c.after); index != -1 { + // if after callback already sorted, append current callback just before it + sortedNames = append(sortedNames[:index+1], append([]string{c.name}, sortedNames[index+1:]...)...) + } else if index := getRIndex(allNames, c.after); index != -1 { + // if after callback exists but haven't sorted + cp := cps[index] + // set after callback's before callback to current callback + if cp.before == "" { + cp.before = c.name + } + sortCallbackProcessor(cp) + } + } + + // if current callback haven't been sorted, append it to last + if getRIndex(sortedNames, c.name) == -1 { + sortedNames = append(sortedNames, c.name) + } + } + } + + for _, cp := range cps { + sortCallbackProcessor(cp) + } + + var sortedFuncs []*func(scope *Scope) + for _, name := range sortedNames { + if index := getRIndex(allNames, name); !cps[index].remove { + sortedFuncs = append(sortedFuncs, cps[index].processor) + } + } + + return sortedFuncs +} + +// reorder all registered processors, and reset CRUD callbacks +func (c *Callback) reorder() { + var creates, updates, deletes, queries, rowQueries []*CallbackProcessor + + for _, processor := range c.processors { + if processor.name != "" { + switch processor.kind { + case "create": + creates = append(creates, processor) + case "update": + updates = append(updates, processor) + case "delete": + deletes = append(deletes, processor) + case "query": + queries = append(queries, processor) + case "row_query": + rowQueries = append(rowQueries, processor) + } + } + } + + c.creates = sortProcessors(creates) + c.updates = sortProcessors(updates) + c.deletes = sortProcessors(deletes) + c.queries = sortProcessors(queries) + c.rowQueries = sortProcessors(rowQueries) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/callback_create.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/callback_create.go new file mode 100644 index 0000000000000000000000000000000000000000..2ab05d3b07932e90ddbdc0631a5889e6c14945cb --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/callback_create.go @@ -0,0 +1,164 @@ +package gorm + +import ( + "fmt" + "strings" +) + +// Define callbacks for creating +func init() { + DefaultCallback.Create().Register("gorm:begin_transaction", beginTransactionCallback) + DefaultCallback.Create().Register("gorm:before_create", beforeCreateCallback) + DefaultCallback.Create().Register("gorm:save_before_associations", saveBeforeAssociationsCallback) + DefaultCallback.Create().Register("gorm:update_time_stamp", updateTimeStampForCreateCallback) + DefaultCallback.Create().Register("gorm:create", createCallback) + DefaultCallback.Create().Register("gorm:force_reload_after_create", forceReloadAfterCreateCallback) + DefaultCallback.Create().Register("gorm:save_after_associations", saveAfterAssociationsCallback) + DefaultCallback.Create().Register("gorm:after_create", afterCreateCallback) + DefaultCallback.Create().Register("gorm:commit_or_rollback_transaction", commitOrRollbackTransactionCallback) +} + +// beforeCreateCallback will invoke `BeforeSave`, `BeforeCreate` method before creating +func beforeCreateCallback(scope *Scope) { + if !scope.HasError() { + scope.CallMethod("BeforeSave") + } + if !scope.HasError() { + scope.CallMethod("BeforeCreate") + } +} + +// updateTimeStampForCreateCallback will set `CreatedAt`, `UpdatedAt` when creating +func updateTimeStampForCreateCallback(scope *Scope) { + if !scope.HasError() { + now := NowFunc() + + if createdAtField, ok := scope.FieldByName("CreatedAt"); ok { + if createdAtField.IsBlank { + createdAtField.Set(now) + } + } + + if updatedAtField, ok := scope.FieldByName("UpdatedAt"); ok { + if updatedAtField.IsBlank { + updatedAtField.Set(now) + } + } + } +} + +// createCallback the callback used to insert data into database +func createCallback(scope *Scope) { + if !scope.HasError() { + defer scope.trace(NowFunc()) + + var ( + columns, placeholders []string + blankColumnsWithDefaultValue []string + ) + + for _, field := range scope.Fields() { + if scope.changeableField(field) { + if field.IsNormal && !field.IsIgnored { + if field.IsBlank && field.HasDefaultValue { + blankColumnsWithDefaultValue = append(blankColumnsWithDefaultValue, scope.Quote(field.DBName)) + scope.InstanceSet("gorm:blank_columns_with_default_value", blankColumnsWithDefaultValue) + } else if !field.IsPrimaryKey || !field.IsBlank { + columns = append(columns, scope.Quote(field.DBName)) + placeholders = append(placeholders, scope.AddToVars(field.Field.Interface())) + } + } else if field.Relationship != nil && field.Relationship.Kind == "belongs_to" { + for _, foreignKey := range field.Relationship.ForeignDBNames { + if foreignField, ok := scope.FieldByName(foreignKey); ok && !scope.changeableField(foreignField) { + columns = append(columns, scope.Quote(foreignField.DBName)) + placeholders = append(placeholders, scope.AddToVars(foreignField.Field.Interface())) + } + } + } + } + } + + var ( + returningColumn = "*" + quotedTableName = scope.QuotedTableName() + primaryField = scope.PrimaryField() + extraOption string + ) + + if str, ok := scope.Get("gorm:insert_option"); ok { + extraOption = fmt.Sprint(str) + } + + if primaryField != nil { + returningColumn = scope.Quote(primaryField.DBName) + } + + lastInsertIDReturningSuffix := scope.Dialect().LastInsertIDReturningSuffix(quotedTableName, returningColumn) + + if len(columns) == 0 { + scope.Raw(fmt.Sprintf( + "INSERT INTO %v %v%v%v", + quotedTableName, + scope.Dialect().DefaultValueStr(), + addExtraSpaceIfExist(extraOption), + addExtraSpaceIfExist(lastInsertIDReturningSuffix), + )) + } else { + scope.Raw(fmt.Sprintf( + "INSERT INTO %v (%v) VALUES (%v)%v%v", + scope.QuotedTableName(), + strings.Join(columns, ","), + strings.Join(placeholders, ","), + addExtraSpaceIfExist(extraOption), + addExtraSpaceIfExist(lastInsertIDReturningSuffix), + )) + } + + // execute create sql + if lastInsertIDReturningSuffix == "" || primaryField == nil { + if result, err := scope.SQLDB().Exec(scope.SQL, scope.SQLVars...); scope.Err(err) == nil { + // set rows affected count + scope.db.RowsAffected, _ = result.RowsAffected() + + // set primary value to primary field + if primaryField != nil && primaryField.IsBlank { + if primaryValue, err := result.LastInsertId(); scope.Err(err) == nil { + scope.Err(primaryField.Set(primaryValue)) + } + } + } + } else { + if primaryField.Field.CanAddr() { + if err := scope.SQLDB().QueryRow(scope.SQL, scope.SQLVars...).Scan(primaryField.Field.Addr().Interface()); scope.Err(err) == nil { + primaryField.IsBlank = false + scope.db.RowsAffected = 1 + } + } else { + scope.Err(ErrUnaddressable) + } + } + } +} + +// forceReloadAfterCreateCallback will reload columns that having default value, and set it back to current object +func forceReloadAfterCreateCallback(scope *Scope) { + if blankColumnsWithDefaultValue, ok := scope.InstanceGet("gorm:blank_columns_with_default_value"); ok { + db := scope.DB().New().Table(scope.TableName()).Select(blankColumnsWithDefaultValue.([]string)) + for _, field := range scope.Fields() { + if field.IsPrimaryKey && !field.IsBlank { + db = db.Where(fmt.Sprintf("%v = ?", field.DBName), field.Field.Interface()) + } + } + db.Scan(scope.Value) + } +} + +// afterCreateCallback will invoke `AfterCreate`, `AfterSave` method after creating +func afterCreateCallback(scope *Scope) { + if !scope.HasError() { + scope.CallMethod("AfterCreate") + } + if !scope.HasError() { + scope.CallMethod("AfterSave") + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/callback_delete.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/callback_delete.go new file mode 100644 index 0000000000000000000000000000000000000000..73d90880673b4a3fb8709f2b3586abf675282782 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/callback_delete.go @@ -0,0 +1,63 @@ +package gorm + +import ( + "errors" + "fmt" +) + +// Define callbacks for deleting +func init() { + DefaultCallback.Delete().Register("gorm:begin_transaction", beginTransactionCallback) + DefaultCallback.Delete().Register("gorm:before_delete", beforeDeleteCallback) + DefaultCallback.Delete().Register("gorm:delete", deleteCallback) + DefaultCallback.Delete().Register("gorm:after_delete", afterDeleteCallback) + DefaultCallback.Delete().Register("gorm:commit_or_rollback_transaction", commitOrRollbackTransactionCallback) +} + +// beforeDeleteCallback will invoke `BeforeDelete` method before deleting +func beforeDeleteCallback(scope *Scope) { + if scope.DB().HasBlockGlobalUpdate() && !scope.hasConditions() { + scope.Err(errors.New("Missing WHERE clause while deleting")) + return + } + if !scope.HasError() { + scope.CallMethod("BeforeDelete") + } +} + +// deleteCallback used to delete data from database or set deleted_at to current time (when using with soft delete) +func deleteCallback(scope *Scope) { + if !scope.HasError() { + var extraOption string + if str, ok := scope.Get("gorm:delete_option"); ok { + extraOption = fmt.Sprint(str) + } + + deletedAtField, hasDeletedAtField := scope.FieldByName("DeletedAt") + + if !scope.Search.Unscoped && hasDeletedAtField { + scope.Raw(fmt.Sprintf( + "UPDATE %v SET %v=%v%v%v", + scope.QuotedTableName(), + scope.Quote(deletedAtField.DBName), + scope.AddToVars(NowFunc()), + addExtraSpaceIfExist(scope.CombinedConditionSql()), + addExtraSpaceIfExist(extraOption), + )).Exec() + } else { + scope.Raw(fmt.Sprintf( + "DELETE FROM %v%v%v", + scope.QuotedTableName(), + addExtraSpaceIfExist(scope.CombinedConditionSql()), + addExtraSpaceIfExist(extraOption), + )).Exec() + } + } +} + +// afterDeleteCallback will invoke `AfterDelete` method after deleting +func afterDeleteCallback(scope *Scope) { + if !scope.HasError() { + scope.CallMethod("AfterDelete") + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/callback_query.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/callback_query.go new file mode 100644 index 0000000000000000000000000000000000000000..593e5d304e47cb0637f4b078616b32ce7b23bb41 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/callback_query.go @@ -0,0 +1,104 @@ +package gorm + +import ( + "errors" + "fmt" + "reflect" +) + +// Define callbacks for querying +func init() { + DefaultCallback.Query().Register("gorm:query", queryCallback) + DefaultCallback.Query().Register("gorm:preload", preloadCallback) + DefaultCallback.Query().Register("gorm:after_query", afterQueryCallback) +} + +// queryCallback used to query data from database +func queryCallback(scope *Scope) { + if _, skip := scope.InstanceGet("gorm:skip_query_callback"); skip { + return + } + + //we are only preloading relations, dont touch base model + if _, skip := scope.InstanceGet("gorm:only_preload"); skip { + return + } + + defer scope.trace(NowFunc()) + + var ( + isSlice, isPtr bool + resultType reflect.Type + results = scope.IndirectValue() + ) + + if orderBy, ok := scope.Get("gorm:order_by_primary_key"); ok { + if primaryField := scope.PrimaryField(); primaryField != nil { + scope.Search.Order(fmt.Sprintf("%v.%v %v", scope.QuotedTableName(), scope.Quote(primaryField.DBName), orderBy)) + } + } + + if value, ok := scope.Get("gorm:query_destination"); ok { + results = indirect(reflect.ValueOf(value)) + } + + if kind := results.Kind(); kind == reflect.Slice { + isSlice = true + resultType = results.Type().Elem() + results.Set(reflect.MakeSlice(results.Type(), 0, 0)) + + if resultType.Kind() == reflect.Ptr { + isPtr = true + resultType = resultType.Elem() + } + } else if kind != reflect.Struct { + scope.Err(errors.New("unsupported destination, should be slice or struct")) + return + } + + scope.prepareQuerySQL() + + if !scope.HasError() { + scope.db.RowsAffected = 0 + if str, ok := scope.Get("gorm:query_option"); ok { + scope.SQL += addExtraSpaceIfExist(fmt.Sprint(str)) + } + + if rows, err := scope.SQLDB().Query(scope.SQL, scope.SQLVars...); scope.Err(err) == nil { + defer rows.Close() + + columns, _ := rows.Columns() + for rows.Next() { + scope.db.RowsAffected++ + + elem := results + if isSlice { + elem = reflect.New(resultType).Elem() + } + + scope.scan(rows, columns, scope.New(elem.Addr().Interface()).Fields()) + + if isSlice { + if isPtr { + results.Set(reflect.Append(results, elem.Addr())) + } else { + results.Set(reflect.Append(results, elem)) + } + } + } + + if err := rows.Err(); err != nil { + scope.Err(err) + } else if scope.db.RowsAffected == 0 && !isSlice { + scope.Err(ErrRecordNotFound) + } + } + } +} + +// afterQueryCallback will invoke `AfterFind` method after querying +func afterQueryCallback(scope *Scope) { + if !scope.HasError() { + scope.CallMethod("AfterFind") + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/callback_query_preload.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/callback_query_preload.go new file mode 100644 index 0000000000000000000000000000000000000000..d7c8a133e4f3097bfb791a4430afd5c0da88cb1d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/callback_query_preload.go @@ -0,0 +1,404 @@ +package gorm + +import ( + "errors" + "fmt" + "reflect" + "strconv" + "strings" +) + +// preloadCallback used to preload associations +func preloadCallback(scope *Scope) { + if _, skip := scope.InstanceGet("gorm:skip_query_callback"); skip { + return + } + + if ap, ok := scope.Get("gorm:auto_preload"); ok { + // If gorm:auto_preload IS NOT a bool then auto preload. + // Else if it IS a bool, use the value + if apb, ok := ap.(bool); !ok { + autoPreload(scope) + } else if apb { + autoPreload(scope) + } + } + + if scope.Search.preload == nil || scope.HasError() { + return + } + + var ( + preloadedMap = map[string]bool{} + fields = scope.Fields() + ) + + for _, preload := range scope.Search.preload { + var ( + preloadFields = strings.Split(preload.schema, ".") + currentScope = scope + currentFields = fields + ) + + for idx, preloadField := range preloadFields { + var currentPreloadConditions []interface{} + + if currentScope == nil { + continue + } + + // if not preloaded + if preloadKey := strings.Join(preloadFields[:idx+1], "."); !preloadedMap[preloadKey] { + + // assign search conditions to last preload + if idx == len(preloadFields)-1 { + currentPreloadConditions = preload.conditions + } + + for _, field := range currentFields { + if field.Name != preloadField || field.Relationship == nil { + continue + } + + switch field.Relationship.Kind { + case "has_one": + currentScope.handleHasOnePreload(field, currentPreloadConditions) + case "has_many": + currentScope.handleHasManyPreload(field, currentPreloadConditions) + case "belongs_to": + currentScope.handleBelongsToPreload(field, currentPreloadConditions) + case "many_to_many": + currentScope.handleManyToManyPreload(field, currentPreloadConditions) + default: + scope.Err(errors.New("unsupported relation")) + } + + preloadedMap[preloadKey] = true + break + } + + if !preloadedMap[preloadKey] { + scope.Err(fmt.Errorf("can't preload field %s for %s", preloadField, currentScope.GetModelStruct().ModelType)) + return + } + } + + // preload next level + if idx < len(preloadFields)-1 { + currentScope = currentScope.getColumnAsScope(preloadField) + if currentScope != nil { + currentFields = currentScope.Fields() + } + } + } + } +} + +func autoPreload(scope *Scope) { + for _, field := range scope.Fields() { + if field.Relationship == nil { + continue + } + + if val, ok := field.TagSettingsGet("PRELOAD"); ok { + if preload, err := strconv.ParseBool(val); err != nil { + scope.Err(errors.New("invalid preload option")) + return + } else if !preload { + continue + } + } + + scope.Search.Preload(field.Name) + } +} + +func (scope *Scope) generatePreloadDBWithConditions(conditions []interface{}) (*DB, []interface{}) { + var ( + preloadDB = scope.NewDB() + preloadConditions []interface{} + ) + + for _, condition := range conditions { + if scopes, ok := condition.(func(*DB) *DB); ok { + preloadDB = scopes(preloadDB) + } else { + preloadConditions = append(preloadConditions, condition) + } + } + + return preloadDB, preloadConditions +} + +// handleHasOnePreload used to preload has one associations +func (scope *Scope) handleHasOnePreload(field *Field, conditions []interface{}) { + relation := field.Relationship + + // get relations's primary keys + primaryKeys := scope.getColumnAsArray(relation.AssociationForeignFieldNames, scope.Value) + if len(primaryKeys) == 0 { + return + } + + // preload conditions + preloadDB, preloadConditions := scope.generatePreloadDBWithConditions(conditions) + + // find relations + query := fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relation.ForeignDBNames), toQueryMarks(primaryKeys)) + values := toQueryValues(primaryKeys) + if relation.PolymorphicType != "" { + query += fmt.Sprintf(" AND %v = ?", scope.Quote(relation.PolymorphicDBName)) + values = append(values, relation.PolymorphicValue) + } + + results := makeSlice(field.Struct.Type) + scope.Err(preloadDB.Where(query, values...).Find(results, preloadConditions...).Error) + + // assign find results + var ( + resultsValue = indirect(reflect.ValueOf(results)) + indirectScopeValue = scope.IndirectValue() + ) + + if indirectScopeValue.Kind() == reflect.Slice { + foreignValuesToResults := make(map[string]reflect.Value) + for i := 0; i < resultsValue.Len(); i++ { + result := resultsValue.Index(i) + foreignValues := toString(getValueFromFields(result, relation.ForeignFieldNames)) + foreignValuesToResults[foreignValues] = result + } + for j := 0; j < indirectScopeValue.Len(); j++ { + indirectValue := indirect(indirectScopeValue.Index(j)) + valueString := toString(getValueFromFields(indirectValue, relation.AssociationForeignFieldNames)) + if result, found := foreignValuesToResults[valueString]; found { + indirectValue.FieldByName(field.Name).Set(result) + } + } + } else { + for i := 0; i < resultsValue.Len(); i++ { + result := resultsValue.Index(i) + scope.Err(field.Set(result)) + } + } +} + +// handleHasManyPreload used to preload has many associations +func (scope *Scope) handleHasManyPreload(field *Field, conditions []interface{}) { + relation := field.Relationship + + // get relations's primary keys + primaryKeys := scope.getColumnAsArray(relation.AssociationForeignFieldNames, scope.Value) + if len(primaryKeys) == 0 { + return + } + + // preload conditions + preloadDB, preloadConditions := scope.generatePreloadDBWithConditions(conditions) + + // find relations + query := fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relation.ForeignDBNames), toQueryMarks(primaryKeys)) + values := toQueryValues(primaryKeys) + if relation.PolymorphicType != "" { + query += fmt.Sprintf(" AND %v = ?", scope.Quote(relation.PolymorphicDBName)) + values = append(values, relation.PolymorphicValue) + } + + results := makeSlice(field.Struct.Type) + scope.Err(preloadDB.Where(query, values...).Find(results, preloadConditions...).Error) + + // assign find results + var ( + resultsValue = indirect(reflect.ValueOf(results)) + indirectScopeValue = scope.IndirectValue() + ) + + if indirectScopeValue.Kind() == reflect.Slice { + preloadMap := make(map[string][]reflect.Value) + for i := 0; i < resultsValue.Len(); i++ { + result := resultsValue.Index(i) + foreignValues := getValueFromFields(result, relation.ForeignFieldNames) + preloadMap[toString(foreignValues)] = append(preloadMap[toString(foreignValues)], result) + } + + for j := 0; j < indirectScopeValue.Len(); j++ { + object := indirect(indirectScopeValue.Index(j)) + objectRealValue := getValueFromFields(object, relation.AssociationForeignFieldNames) + f := object.FieldByName(field.Name) + if results, ok := preloadMap[toString(objectRealValue)]; ok { + f.Set(reflect.Append(f, results...)) + } else { + f.Set(reflect.MakeSlice(f.Type(), 0, 0)) + } + } + } else { + scope.Err(field.Set(resultsValue)) + } +} + +// handleBelongsToPreload used to preload belongs to associations +func (scope *Scope) handleBelongsToPreload(field *Field, conditions []interface{}) { + relation := field.Relationship + + // preload conditions + preloadDB, preloadConditions := scope.generatePreloadDBWithConditions(conditions) + + // get relations's primary keys + primaryKeys := scope.getColumnAsArray(relation.ForeignFieldNames, scope.Value) + if len(primaryKeys) == 0 { + return + } + + // find relations + results := makeSlice(field.Struct.Type) + scope.Err(preloadDB.Where(fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relation.AssociationForeignDBNames), toQueryMarks(primaryKeys)), toQueryValues(primaryKeys)...).Find(results, preloadConditions...).Error) + + // assign find results + var ( + resultsValue = indirect(reflect.ValueOf(results)) + indirectScopeValue = scope.IndirectValue() + ) + + foreignFieldToObjects := make(map[string][]*reflect.Value) + if indirectScopeValue.Kind() == reflect.Slice { + for j := 0; j < indirectScopeValue.Len(); j++ { + object := indirect(indirectScopeValue.Index(j)) + valueString := toString(getValueFromFields(object, relation.ForeignFieldNames)) + foreignFieldToObjects[valueString] = append(foreignFieldToObjects[valueString], &object) + } + } + + for i := 0; i < resultsValue.Len(); i++ { + result := resultsValue.Index(i) + if indirectScopeValue.Kind() == reflect.Slice { + valueString := toString(getValueFromFields(result, relation.AssociationForeignFieldNames)) + if objects, found := foreignFieldToObjects[valueString]; found { + for _, object := range objects { + object.FieldByName(field.Name).Set(result) + } + } + } else { + scope.Err(field.Set(result)) + } + } +} + +// handleManyToManyPreload used to preload many to many associations +func (scope *Scope) handleManyToManyPreload(field *Field, conditions []interface{}) { + var ( + relation = field.Relationship + joinTableHandler = relation.JoinTableHandler + fieldType = field.Struct.Type.Elem() + foreignKeyValue interface{} + foreignKeyType = reflect.ValueOf(&foreignKeyValue).Type() + linkHash = map[string][]reflect.Value{} + isPtr bool + ) + + if fieldType.Kind() == reflect.Ptr { + isPtr = true + fieldType = fieldType.Elem() + } + + var sourceKeys = []string{} + for _, key := range joinTableHandler.SourceForeignKeys() { + sourceKeys = append(sourceKeys, key.DBName) + } + + // preload conditions + preloadDB, preloadConditions := scope.generatePreloadDBWithConditions(conditions) + + // generate query with join table + newScope := scope.New(reflect.New(fieldType).Interface()) + preloadDB = preloadDB.Table(newScope.TableName()).Model(newScope.Value) + + if len(preloadDB.search.selects) == 0 { + preloadDB = preloadDB.Select("*") + } + + preloadDB = joinTableHandler.JoinWith(joinTableHandler, preloadDB, scope.Value) + + // preload inline conditions + if len(preloadConditions) > 0 { + preloadDB = preloadDB.Where(preloadConditions[0], preloadConditions[1:]...) + } + + rows, err := preloadDB.Rows() + + if scope.Err(err) != nil { + return + } + defer rows.Close() + + columns, _ := rows.Columns() + for rows.Next() { + var ( + elem = reflect.New(fieldType).Elem() + fields = scope.New(elem.Addr().Interface()).Fields() + ) + + // register foreign keys in join tables + var joinTableFields []*Field + for _, sourceKey := range sourceKeys { + joinTableFields = append(joinTableFields, &Field{StructField: &StructField{DBName: sourceKey, IsNormal: true}, Field: reflect.New(foreignKeyType).Elem()}) + } + + scope.scan(rows, columns, append(fields, joinTableFields...)) + + scope.New(elem.Addr().Interface()). + InstanceSet("gorm:skip_query_callback", true). + callCallbacks(scope.db.parent.callbacks.queries) + + var foreignKeys = make([]interface{}, len(sourceKeys)) + // generate hashed forkey keys in join table + for idx, joinTableField := range joinTableFields { + if !joinTableField.Field.IsNil() { + foreignKeys[idx] = joinTableField.Field.Elem().Interface() + } + } + hashedSourceKeys := toString(foreignKeys) + + if isPtr { + linkHash[hashedSourceKeys] = append(linkHash[hashedSourceKeys], elem.Addr()) + } else { + linkHash[hashedSourceKeys] = append(linkHash[hashedSourceKeys], elem) + } + } + + if err := rows.Err(); err != nil { + scope.Err(err) + } + + // assign find results + var ( + indirectScopeValue = scope.IndirectValue() + fieldsSourceMap = map[string][]reflect.Value{} + foreignFieldNames = []string{} + ) + + for _, dbName := range relation.ForeignFieldNames { + if field, ok := scope.FieldByName(dbName); ok { + foreignFieldNames = append(foreignFieldNames, field.Name) + } + } + + if indirectScopeValue.Kind() == reflect.Slice { + for j := 0; j < indirectScopeValue.Len(); j++ { + object := indirect(indirectScopeValue.Index(j)) + key := toString(getValueFromFields(object, foreignFieldNames)) + fieldsSourceMap[key] = append(fieldsSourceMap[key], object.FieldByName(field.Name)) + } + } else if indirectScopeValue.IsValid() { + key := toString(getValueFromFields(indirectScopeValue, foreignFieldNames)) + fieldsSourceMap[key] = append(fieldsSourceMap[key], indirectScopeValue.FieldByName(field.Name)) + } + for source, link := range linkHash { + for i, field := range fieldsSourceMap[source] { + //If not 0 this means Value is a pointer and we already added preloaded models to it + if fieldsSourceMap[source][i].Len() != 0 { + continue + } + field.Set(reflect.Append(fieldsSourceMap[source][i], link...)) + } + + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/callback_row_query.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/callback_row_query.go new file mode 100644 index 0000000000000000000000000000000000000000..c2ff4a0838273887aa48d418d7e14223a2180698 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/callback_row_query.go @@ -0,0 +1,30 @@ +package gorm + +import "database/sql" + +// Define callbacks for row query +func init() { + DefaultCallback.RowQuery().Register("gorm:row_query", rowQueryCallback) +} + +type RowQueryResult struct { + Row *sql.Row +} + +type RowsQueryResult struct { + Rows *sql.Rows + Error error +} + +// queryCallback used to query data from database +func rowQueryCallback(scope *Scope) { + if result, ok := scope.InstanceGet("row_query_result"); ok { + scope.prepareQuerySQL() + + if rowResult, ok := result.(*RowQueryResult); ok { + rowResult.Row = scope.SQLDB().QueryRow(scope.SQL, scope.SQLVars...) + } else if rowsResult, ok := result.(*RowsQueryResult); ok { + rowsResult.Rows, rowsResult.Error = scope.SQLDB().Query(scope.SQL, scope.SQLVars...) + } + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/callback_save.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/callback_save.go new file mode 100644 index 0000000000000000000000000000000000000000..3b4e0589535e35a6d5c21da3e70c62fb80e68532 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/callback_save.go @@ -0,0 +1,170 @@ +package gorm + +import ( + "reflect" + "strings" +) + +func beginTransactionCallback(scope *Scope) { + scope.Begin() +} + +func commitOrRollbackTransactionCallback(scope *Scope) { + scope.CommitOrRollback() +} + +func saveAssociationCheck(scope *Scope, field *Field) (autoUpdate bool, autoCreate bool, saveReference bool, r *Relationship) { + checkTruth := func(value interface{}) bool { + if v, ok := value.(bool); ok && !v { + return false + } + + if v, ok := value.(string); ok { + v = strings.ToLower(v) + return v == "true" + } + + return true + } + + if scope.changeableField(field) && !field.IsBlank && !field.IsIgnored { + if r = field.Relationship; r != nil { + autoUpdate, autoCreate, saveReference = true, true, true + + if value, ok := scope.Get("gorm:save_associations"); ok { + autoUpdate = checkTruth(value) + autoCreate = autoUpdate + saveReference = autoUpdate + } else if value, ok := field.TagSettingsGet("SAVE_ASSOCIATIONS"); ok { + autoUpdate = checkTruth(value) + autoCreate = autoUpdate + saveReference = autoUpdate + } + + if value, ok := scope.Get("gorm:association_autoupdate"); ok { + autoUpdate = checkTruth(value) + } else if value, ok := field.TagSettingsGet("ASSOCIATION_AUTOUPDATE"); ok { + autoUpdate = checkTruth(value) + } + + if value, ok := scope.Get("gorm:association_autocreate"); ok { + autoCreate = checkTruth(value) + } else if value, ok := field.TagSettingsGet("ASSOCIATION_AUTOCREATE"); ok { + autoCreate = checkTruth(value) + } + + if value, ok := scope.Get("gorm:association_save_reference"); ok { + saveReference = checkTruth(value) + } else if value, ok := field.TagSettingsGet("ASSOCIATION_SAVE_REFERENCE"); ok { + saveReference = checkTruth(value) + } + } + } + + return +} + +func saveBeforeAssociationsCallback(scope *Scope) { + for _, field := range scope.Fields() { + autoUpdate, autoCreate, saveReference, relationship := saveAssociationCheck(scope, field) + + if relationship != nil && relationship.Kind == "belongs_to" { + fieldValue := field.Field.Addr().Interface() + newScope := scope.New(fieldValue) + + if newScope.PrimaryKeyZero() { + if autoCreate { + scope.Err(scope.NewDB().Save(fieldValue).Error) + } + } else if autoUpdate { + scope.Err(scope.NewDB().Save(fieldValue).Error) + } + + if saveReference { + if len(relationship.ForeignFieldNames) != 0 { + // set value's foreign key + for idx, fieldName := range relationship.ForeignFieldNames { + associationForeignName := relationship.AssociationForeignDBNames[idx] + if foreignField, ok := scope.New(fieldValue).FieldByName(associationForeignName); ok { + scope.Err(scope.SetColumn(fieldName, foreignField.Field.Interface())) + } + } + } + } + } + } +} + +func saveAfterAssociationsCallback(scope *Scope) { + for _, field := range scope.Fields() { + autoUpdate, autoCreate, saveReference, relationship := saveAssociationCheck(scope, field) + + if relationship != nil && (relationship.Kind == "has_one" || relationship.Kind == "has_many" || relationship.Kind == "many_to_many") { + value := field.Field + + switch value.Kind() { + case reflect.Slice: + for i := 0; i < value.Len(); i++ { + newDB := scope.NewDB() + elem := value.Index(i).Addr().Interface() + newScope := newDB.NewScope(elem) + + if saveReference { + if relationship.JoinTableHandler == nil && len(relationship.ForeignFieldNames) != 0 { + for idx, fieldName := range relationship.ForeignFieldNames { + associationForeignName := relationship.AssociationForeignDBNames[idx] + if f, ok := scope.FieldByName(associationForeignName); ok { + scope.Err(newScope.SetColumn(fieldName, f.Field.Interface())) + } + } + } + + if relationship.PolymorphicType != "" { + scope.Err(newScope.SetColumn(relationship.PolymorphicType, relationship.PolymorphicValue)) + } + } + + if newScope.PrimaryKeyZero() { + if autoCreate { + scope.Err(newDB.Save(elem).Error) + } + } else if autoUpdate { + scope.Err(newDB.Save(elem).Error) + } + + if !scope.New(newScope.Value).PrimaryKeyZero() && saveReference { + if joinTableHandler := relationship.JoinTableHandler; joinTableHandler != nil { + scope.Err(joinTableHandler.Add(joinTableHandler, newDB, scope.Value, newScope.Value)) + } + } + } + default: + elem := value.Addr().Interface() + newScope := scope.New(elem) + + if saveReference { + if len(relationship.ForeignFieldNames) != 0 { + for idx, fieldName := range relationship.ForeignFieldNames { + associationForeignName := relationship.AssociationForeignDBNames[idx] + if f, ok := scope.FieldByName(associationForeignName); ok { + scope.Err(newScope.SetColumn(fieldName, f.Field.Interface())) + } + } + } + + if relationship.PolymorphicType != "" { + scope.Err(newScope.SetColumn(relationship.PolymorphicType, relationship.PolymorphicValue)) + } + } + + if newScope.PrimaryKeyZero() { + if autoCreate { + scope.Err(scope.NewDB().Save(elem).Error) + } + } else if autoUpdate { + scope.Err(scope.NewDB().Save(elem).Error) + } + } + } + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/callback_update.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/callback_update.go new file mode 100644 index 0000000000000000000000000000000000000000..f6ba0ffd9079a10d3aca8bc733d146930fa75dac --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/callback_update.go @@ -0,0 +1,121 @@ +package gorm + +import ( + "errors" + "fmt" + "sort" + "strings" +) + +// Define callbacks for updating +func init() { + DefaultCallback.Update().Register("gorm:assign_updating_attributes", assignUpdatingAttributesCallback) + DefaultCallback.Update().Register("gorm:begin_transaction", beginTransactionCallback) + DefaultCallback.Update().Register("gorm:before_update", beforeUpdateCallback) + DefaultCallback.Update().Register("gorm:save_before_associations", saveBeforeAssociationsCallback) + DefaultCallback.Update().Register("gorm:update_time_stamp", updateTimeStampForUpdateCallback) + DefaultCallback.Update().Register("gorm:update", updateCallback) + DefaultCallback.Update().Register("gorm:save_after_associations", saveAfterAssociationsCallback) + DefaultCallback.Update().Register("gorm:after_update", afterUpdateCallback) + DefaultCallback.Update().Register("gorm:commit_or_rollback_transaction", commitOrRollbackTransactionCallback) +} + +// assignUpdatingAttributesCallback assign updating attributes to model +func assignUpdatingAttributesCallback(scope *Scope) { + if attrs, ok := scope.InstanceGet("gorm:update_interface"); ok { + if updateMaps, hasUpdate := scope.updatedAttrsWithValues(attrs); hasUpdate { + scope.InstanceSet("gorm:update_attrs", updateMaps) + } else { + scope.SkipLeft() + } + } +} + +// beforeUpdateCallback will invoke `BeforeSave`, `BeforeUpdate` method before updating +func beforeUpdateCallback(scope *Scope) { + if scope.DB().HasBlockGlobalUpdate() && !scope.hasConditions() { + scope.Err(errors.New("Missing WHERE clause while updating")) + return + } + if _, ok := scope.Get("gorm:update_column"); !ok { + if !scope.HasError() { + scope.CallMethod("BeforeSave") + } + if !scope.HasError() { + scope.CallMethod("BeforeUpdate") + } + } +} + +// updateTimeStampForUpdateCallback will set `UpdatedAt` when updating +func updateTimeStampForUpdateCallback(scope *Scope) { + if _, ok := scope.Get("gorm:update_column"); !ok { + scope.SetColumn("UpdatedAt", NowFunc()) + } +} + +// updateCallback the callback used to update data to database +func updateCallback(scope *Scope) { + if !scope.HasError() { + var sqls []string + + if updateAttrs, ok := scope.InstanceGet("gorm:update_attrs"); ok { + // Sort the column names so that the generated SQL is the same every time. + updateMap := updateAttrs.(map[string]interface{}) + var columns []string + for c := range updateMap { + columns = append(columns, c) + } + sort.Strings(columns) + + for _, column := range columns { + value := updateMap[column] + sqls = append(sqls, fmt.Sprintf("%v = %v", scope.Quote(column), scope.AddToVars(value))) + } + } else { + for _, field := range scope.Fields() { + if scope.changeableField(field) { + if !field.IsPrimaryKey && field.IsNormal { + if !field.IsForeignKey || !field.IsBlank || !field.HasDefaultValue { + sqls = append(sqls, fmt.Sprintf("%v = %v", scope.Quote(field.DBName), scope.AddToVars(field.Field.Interface()))) + } + } else if relationship := field.Relationship; relationship != nil && relationship.Kind == "belongs_to" { + for _, foreignKey := range relationship.ForeignDBNames { + if foreignField, ok := scope.FieldByName(foreignKey); ok && !scope.changeableField(foreignField) { + sqls = append(sqls, + fmt.Sprintf("%v = %v", scope.Quote(foreignField.DBName), scope.AddToVars(foreignField.Field.Interface()))) + } + } + } + } + } + } + + var extraOption string + if str, ok := scope.Get("gorm:update_option"); ok { + extraOption = fmt.Sprint(str) + } + + if len(sqls) > 0 { + scope.Raw(fmt.Sprintf( + "UPDATE %v SET %v%v%v", + scope.QuotedTableName(), + strings.Join(sqls, ", "), + addExtraSpaceIfExist(scope.CombinedConditionSql()), + addExtraSpaceIfExist(extraOption), + )).Exec() + } + } +} + +// afterUpdateCallback will invoke `AfterUpdate`, `AfterSave` method after updating +func afterUpdateCallback(scope *Scope) { + if _, ok := scope.Get("gorm:update_column"); !ok { + if !scope.HasError() { + scope.CallMethod("AfterUpdate") + } + if !scope.HasError() { + scope.CallMethod("AfterSave") + } + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/dialect.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/dialect.go new file mode 100644 index 0000000000000000000000000000000000000000..27b308af3756f1351c777a9ad2a1f12f702a2ae3 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/dialect.go @@ -0,0 +1,138 @@ +package gorm + +import ( + "database/sql" + "fmt" + "reflect" + "strconv" + "strings" +) + +// Dialect interface contains behaviors that differ across SQL database +type Dialect interface { + // GetName get dialect's name + GetName() string + + // SetDB set db for dialect + SetDB(db SQLCommon) + + // BindVar return the placeholder for actual values in SQL statements, in many dbs it is "?", Postgres using $1 + BindVar(i int) string + // Quote quotes field name to avoid SQL parsing exceptions by using a reserved word as a field name + Quote(key string) string + // DataTypeOf return data's sql type + DataTypeOf(field *StructField) string + + // HasIndex check has index or not + HasIndex(tableName string, indexName string) bool + // HasForeignKey check has foreign key or not + HasForeignKey(tableName string, foreignKeyName string) bool + // RemoveIndex remove index + RemoveIndex(tableName string, indexName string) error + // HasTable check has table or not + HasTable(tableName string) bool + // HasColumn check has column or not + HasColumn(tableName string, columnName string) bool + // ModifyColumn modify column's type + ModifyColumn(tableName string, columnName string, typ string) error + + // LimitAndOffsetSQL return generated SQL with Limit and Offset, as mssql has special case + LimitAndOffsetSQL(limit, offset interface{}) string + // SelectFromDummyTable return select values, for most dbs, `SELECT values` just works, mysql needs `SELECT value FROM DUAL` + SelectFromDummyTable() string + // LastInsertIdReturningSuffix most dbs support LastInsertId, but postgres needs to use `RETURNING` + LastInsertIDReturningSuffix(tableName, columnName string) string + // DefaultValueStr + DefaultValueStr() string + + // BuildKeyName returns a valid key name (foreign key, index key) for the given table, field and reference + BuildKeyName(kind, tableName string, fields ...string) string + + // CurrentDatabase return current database name + CurrentDatabase() string +} + +var dialectsMap = map[string]Dialect{} + +func newDialect(name string, db SQLCommon) Dialect { + if value, ok := dialectsMap[name]; ok { + dialect := reflect.New(reflect.TypeOf(value).Elem()).Interface().(Dialect) + dialect.SetDB(db) + return dialect + } + + fmt.Printf("`%v` is not officially supported, running under compatibility mode.\n", name) + commontDialect := &commonDialect{} + commontDialect.SetDB(db) + return commontDialect +} + +// RegisterDialect register new dialect +func RegisterDialect(name string, dialect Dialect) { + dialectsMap[name] = dialect +} + +// GetDialect gets the dialect for the specified dialect name +func GetDialect(name string) (dialect Dialect, ok bool) { + dialect, ok = dialectsMap[name] + return +} + +// ParseFieldStructForDialect get field's sql data type +var ParseFieldStructForDialect = func(field *StructField, dialect Dialect) (fieldValue reflect.Value, sqlType string, size int, additionalType string) { + // Get redirected field type + var ( + reflectType = field.Struct.Type + dataType, _ = field.TagSettingsGet("TYPE") + ) + + for reflectType.Kind() == reflect.Ptr { + reflectType = reflectType.Elem() + } + + // Get redirected field value + fieldValue = reflect.Indirect(reflect.New(reflectType)) + + if gormDataType, ok := fieldValue.Interface().(interface { + GormDataType(Dialect) string + }); ok { + dataType = gormDataType.GormDataType(dialect) + } + + // Get scanner's real value + if dataType == "" { + var getScannerValue func(reflect.Value) + getScannerValue = func(value reflect.Value) { + fieldValue = value + if _, isScanner := reflect.New(fieldValue.Type()).Interface().(sql.Scanner); isScanner && fieldValue.Kind() == reflect.Struct { + getScannerValue(fieldValue.Field(0)) + } + } + getScannerValue(fieldValue) + } + + // Default Size + if num, ok := field.TagSettingsGet("SIZE"); ok { + size, _ = strconv.Atoi(num) + } else { + size = 255 + } + + // Default type from tag setting + notNull, _ := field.TagSettingsGet("NOT NULL") + unique, _ := field.TagSettingsGet("UNIQUE") + additionalType = notNull + " " + unique + if value, ok := field.TagSettingsGet("DEFAULT"); ok { + additionalType = additionalType + " DEFAULT " + value + } + + return fieldValue, dataType, size, strings.TrimSpace(additionalType) +} + +func currentDatabaseAndTable(dialect Dialect, tableName string) (string, string) { + if strings.Contains(tableName, ".") { + splitStrings := strings.SplitN(tableName, ".", 2) + return splitStrings[0], splitStrings[1] + } + return dialect.CurrentDatabase(), tableName +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/dialect_common.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/dialect_common.go new file mode 100644 index 0000000000000000000000000000000000000000..a479be79bb4e9aff9beba730e2138b59b4b5e11e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/dialect_common.go @@ -0,0 +1,176 @@ +package gorm + +import ( + "fmt" + "reflect" + "regexp" + "strconv" + "strings" + "time" +) + +// DefaultForeignKeyNamer contains the default foreign key name generator method +type DefaultForeignKeyNamer struct { +} + +type commonDialect struct { + db SQLCommon + DefaultForeignKeyNamer +} + +func init() { + RegisterDialect("common", &commonDialect{}) +} + +func (commonDialect) GetName() string { + return "common" +} + +func (s *commonDialect) SetDB(db SQLCommon) { + s.db = db +} + +func (commonDialect) BindVar(i int) string { + return "$$$" // ? +} + +func (commonDialect) Quote(key string) string { + return fmt.Sprintf(`"%s"`, key) +} + +func (s *commonDialect) fieldCanAutoIncrement(field *StructField) bool { + if value, ok := field.TagSettingsGet("AUTO_INCREMENT"); ok { + return strings.ToLower(value) != "false" + } + return field.IsPrimaryKey +} + +func (s *commonDialect) DataTypeOf(field *StructField) string { + var dataValue, sqlType, size, additionalType = ParseFieldStructForDialect(field, s) + + if sqlType == "" { + switch dataValue.Kind() { + case reflect.Bool: + sqlType = "BOOLEAN" + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uintptr: + if s.fieldCanAutoIncrement(field) { + sqlType = "INTEGER AUTO_INCREMENT" + } else { + sqlType = "INTEGER" + } + case reflect.Int64, reflect.Uint64: + if s.fieldCanAutoIncrement(field) { + sqlType = "BIGINT AUTO_INCREMENT" + } else { + sqlType = "BIGINT" + } + case reflect.Float32, reflect.Float64: + sqlType = "FLOAT" + case reflect.String: + if size > 0 && size < 65532 { + sqlType = fmt.Sprintf("VARCHAR(%d)", size) + } else { + sqlType = "VARCHAR(65532)" + } + case reflect.Struct: + if _, ok := dataValue.Interface().(time.Time); ok { + sqlType = "TIMESTAMP" + } + default: + if _, ok := dataValue.Interface().([]byte); ok { + if size > 0 && size < 65532 { + sqlType = fmt.Sprintf("BINARY(%d)", size) + } else { + sqlType = "BINARY(65532)" + } + } + } + } + + if sqlType == "" { + panic(fmt.Sprintf("invalid sql type %s (%s) for commonDialect", dataValue.Type().Name(), dataValue.Kind().String())) + } + + if strings.TrimSpace(additionalType) == "" { + return sqlType + } + return fmt.Sprintf("%v %v", sqlType, additionalType) +} + +func (s commonDialect) HasIndex(tableName string, indexName string) bool { + var count int + currentDatabase, tableName := currentDatabaseAndTable(&s, tableName) + s.db.QueryRow("SELECT count(*) FROM INFORMATION_SCHEMA.STATISTICS WHERE table_schema = ? AND table_name = ? AND index_name = ?", currentDatabase, tableName, indexName).Scan(&count) + return count > 0 +} + +func (s commonDialect) RemoveIndex(tableName string, indexName string) error { + _, err := s.db.Exec(fmt.Sprintf("DROP INDEX %v", indexName)) + return err +} + +func (s commonDialect) HasForeignKey(tableName string, foreignKeyName string) bool { + return false +} + +func (s commonDialect) HasTable(tableName string) bool { + var count int + currentDatabase, tableName := currentDatabaseAndTable(&s, tableName) + s.db.QueryRow("SELECT count(*) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = ? AND table_name = ?", currentDatabase, tableName).Scan(&count) + return count > 0 +} + +func (s commonDialect) HasColumn(tableName string, columnName string) bool { + var count int + currentDatabase, tableName := currentDatabaseAndTable(&s, tableName) + s.db.QueryRow("SELECT count(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = ? AND table_name = ? AND column_name = ?", currentDatabase, tableName, columnName).Scan(&count) + return count > 0 +} + +func (s commonDialect) ModifyColumn(tableName string, columnName string, typ string) error { + _, err := s.db.Exec(fmt.Sprintf("ALTER TABLE %v ALTER COLUMN %v TYPE %v", tableName, columnName, typ)) + return err +} + +func (s commonDialect) CurrentDatabase() (name string) { + s.db.QueryRow("SELECT DATABASE()").Scan(&name) + return +} + +func (commonDialect) LimitAndOffsetSQL(limit, offset interface{}) (sql string) { + if limit != nil { + if parsedLimit, err := strconv.ParseInt(fmt.Sprint(limit), 0, 0); err == nil && parsedLimit >= 0 { + sql += fmt.Sprintf(" LIMIT %d", parsedLimit) + } + } + if offset != nil { + if parsedOffset, err := strconv.ParseInt(fmt.Sprint(offset), 0, 0); err == nil && parsedOffset >= 0 { + sql += fmt.Sprintf(" OFFSET %d", parsedOffset) + } + } + return +} + +func (commonDialect) SelectFromDummyTable() string { + return "" +} + +func (commonDialect) LastInsertIDReturningSuffix(tableName, columnName string) string { + return "" +} + +func (commonDialect) DefaultValueStr() string { + return "DEFAULT VALUES" +} + +// BuildKeyName returns a valid key name (foreign key, index key) for the given table, field and reference +func (DefaultForeignKeyNamer) BuildKeyName(kind, tableName string, fields ...string) string { + keyName := fmt.Sprintf("%s_%s_%s", kind, tableName, strings.Join(fields, "_")) + keyName = regexp.MustCompile("[^a-zA-Z0-9]+").ReplaceAllString(keyName, "_") + return keyName +} + +// IsByteArrayOrSlice returns true of the reflected value is an array or slice +func IsByteArrayOrSlice(value reflect.Value) bool { + return (value.Kind() == reflect.Array || value.Kind() == reflect.Slice) && value.Type().Elem() == reflect.TypeOf(uint8(0)) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/dialect_mysql.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/dialect_mysql.go new file mode 100644 index 0000000000000000000000000000000000000000..5d63e5cd2ddb6062c8673d359e9bbe29b2c8f558 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/dialect_mysql.go @@ -0,0 +1,191 @@ +package gorm + +import ( + "crypto/sha1" + "fmt" + "reflect" + "regexp" + "strconv" + "strings" + "time" + "unicode/utf8" +) + +type mysql struct { + commonDialect +} + +func init() { + RegisterDialect("mysql", &mysql{}) +} + +func (mysql) GetName() string { + return "mysql" +} + +func (mysql) Quote(key string) string { + return fmt.Sprintf("`%s`", key) +} + +// Get Data Type for MySQL Dialect +func (s *mysql) DataTypeOf(field *StructField) string { + var dataValue, sqlType, size, additionalType = ParseFieldStructForDialect(field, s) + + // MySQL allows only one auto increment column per table, and it must + // be a KEY column. + if _, ok := field.TagSettingsGet("AUTO_INCREMENT"); ok { + if _, ok = field.TagSettingsGet("INDEX"); !ok && !field.IsPrimaryKey { + field.TagSettingsDelete("AUTO_INCREMENT") + } + } + + if sqlType == "" { + switch dataValue.Kind() { + case reflect.Bool: + sqlType = "boolean" + case reflect.Int8: + if s.fieldCanAutoIncrement(field) { + field.TagSettingsSet("AUTO_INCREMENT", "AUTO_INCREMENT") + sqlType = "tinyint AUTO_INCREMENT" + } else { + sqlType = "tinyint" + } + case reflect.Int, reflect.Int16, reflect.Int32: + if s.fieldCanAutoIncrement(field) { + field.TagSettingsSet("AUTO_INCREMENT", "AUTO_INCREMENT") + sqlType = "int AUTO_INCREMENT" + } else { + sqlType = "int" + } + case reflect.Uint8: + if s.fieldCanAutoIncrement(field) { + field.TagSettingsSet("AUTO_INCREMENT", "AUTO_INCREMENT") + sqlType = "tinyint unsigned AUTO_INCREMENT" + } else { + sqlType = "tinyint unsigned" + } + case reflect.Uint, reflect.Uint16, reflect.Uint32, reflect.Uintptr: + if s.fieldCanAutoIncrement(field) { + field.TagSettingsSet("AUTO_INCREMENT", "AUTO_INCREMENT") + sqlType = "int unsigned AUTO_INCREMENT" + } else { + sqlType = "int unsigned" + } + case reflect.Int64: + if s.fieldCanAutoIncrement(field) { + field.TagSettingsSet("AUTO_INCREMENT", "AUTO_INCREMENT") + sqlType = "bigint AUTO_INCREMENT" + } else { + sqlType = "bigint" + } + case reflect.Uint64: + if s.fieldCanAutoIncrement(field) { + field.TagSettingsSet("AUTO_INCREMENT", "AUTO_INCREMENT") + sqlType = "bigint unsigned AUTO_INCREMENT" + } else { + sqlType = "bigint unsigned" + } + case reflect.Float32, reflect.Float64: + sqlType = "double" + case reflect.String: + if size > 0 && size < 65532 { + sqlType = fmt.Sprintf("varchar(%d)", size) + } else { + sqlType = "longtext" + } + case reflect.Struct: + if _, ok := dataValue.Interface().(time.Time); ok { + precision := "" + if p, ok := field.TagSettingsGet("PRECISION"); ok { + precision = fmt.Sprintf("(%s)", p) + } + + if _, ok := field.TagSettingsGet("NOT NULL"); ok { + sqlType = fmt.Sprintf("timestamp%v", precision) + } else { + sqlType = fmt.Sprintf("timestamp%v NULL", precision) + } + } + default: + if IsByteArrayOrSlice(dataValue) { + if size > 0 && size < 65532 { + sqlType = fmt.Sprintf("varbinary(%d)", size) + } else { + sqlType = "longblob" + } + } + } + } + + if sqlType == "" { + panic(fmt.Sprintf("invalid sql type %s (%s) for mysql", dataValue.Type().Name(), dataValue.Kind().String())) + } + + if strings.TrimSpace(additionalType) == "" { + return sqlType + } + return fmt.Sprintf("%v %v", sqlType, additionalType) +} + +func (s mysql) RemoveIndex(tableName string, indexName string) error { + _, err := s.db.Exec(fmt.Sprintf("DROP INDEX %v ON %v", indexName, s.Quote(tableName))) + return err +} + +func (s mysql) ModifyColumn(tableName string, columnName string, typ string) error { + _, err := s.db.Exec(fmt.Sprintf("ALTER TABLE %v MODIFY COLUMN %v %v", tableName, columnName, typ)) + return err +} + +func (s mysql) LimitAndOffsetSQL(limit, offset interface{}) (sql string) { + if limit != nil { + if parsedLimit, err := strconv.ParseInt(fmt.Sprint(limit), 0, 0); err == nil && parsedLimit >= 0 { + sql += fmt.Sprintf(" LIMIT %d", parsedLimit) + + if offset != nil { + if parsedOffset, err := strconv.ParseInt(fmt.Sprint(offset), 0, 0); err == nil && parsedOffset >= 0 { + sql += fmt.Sprintf(" OFFSET %d", parsedOffset) + } + } + } + } + return +} + +func (s mysql) HasForeignKey(tableName string, foreignKeyName string) bool { + var count int + currentDatabase, tableName := currentDatabaseAndTable(&s, tableName) + s.db.QueryRow("SELECT count(*) FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_SCHEMA=? AND TABLE_NAME=? AND CONSTRAINT_NAME=? AND CONSTRAINT_TYPE='FOREIGN KEY'", currentDatabase, tableName, foreignKeyName).Scan(&count) + return count > 0 +} + +func (s mysql) CurrentDatabase() (name string) { + s.db.QueryRow("SELECT DATABASE()").Scan(&name) + return +} + +func (mysql) SelectFromDummyTable() string { + return "FROM DUAL" +} + +func (s mysql) BuildKeyName(kind, tableName string, fields ...string) string { + keyName := s.commonDialect.BuildKeyName(kind, tableName, fields...) + if utf8.RuneCountInString(keyName) <= 64 { + return keyName + } + h := sha1.New() + h.Write([]byte(keyName)) + bs := h.Sum(nil) + + // sha1 is 40 characters, keep first 24 characters of destination + destRunes := []rune(regexp.MustCompile("[^a-zA-Z0-9]+").ReplaceAllString(fields[0], "_")) + if len(destRunes) > 24 { + destRunes = destRunes[:24] + } + + return fmt.Sprintf("%s%x", string(destRunes), bs) +} + +func (mysql) DefaultValueStr() string { + return "VALUES()" +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/dialect_postgres.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/dialect_postgres.go new file mode 100644 index 0000000000000000000000000000000000000000..53d31388ef231c4c0bfb955f1a4b95d0ca58bc49 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/dialect_postgres.go @@ -0,0 +1,143 @@ +package gorm + +import ( + "encoding/json" + "fmt" + "reflect" + "strings" + "time" +) + +type postgres struct { + commonDialect +} + +func init() { + RegisterDialect("postgres", &postgres{}) + RegisterDialect("cloudsqlpostgres", &postgres{}) +} + +func (postgres) GetName() string { + return "postgres" +} + +func (postgres) BindVar(i int) string { + return fmt.Sprintf("$%v", i) +} + +func (s *postgres) DataTypeOf(field *StructField) string { + var dataValue, sqlType, size, additionalType = ParseFieldStructForDialect(field, s) + + if sqlType == "" { + switch dataValue.Kind() { + case reflect.Bool: + sqlType = "boolean" + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uintptr: + if s.fieldCanAutoIncrement(field) { + field.TagSettingsSet("AUTO_INCREMENT", "AUTO_INCREMENT") + sqlType = "serial" + } else { + sqlType = "integer" + } + case reflect.Int64, reflect.Uint32, reflect.Uint64: + if s.fieldCanAutoIncrement(field) { + field.TagSettingsSet("AUTO_INCREMENT", "AUTO_INCREMENT") + sqlType = "bigserial" + } else { + sqlType = "bigint" + } + case reflect.Float32, reflect.Float64: + sqlType = "numeric" + case reflect.String: + if _, ok := field.TagSettingsGet("SIZE"); !ok { + size = 0 // if SIZE haven't been set, use `text` as the default type, as there are no performance different + } + + if size > 0 && size < 65532 { + sqlType = fmt.Sprintf("varchar(%d)", size) + } else { + sqlType = "text" + } + case reflect.Struct: + if _, ok := dataValue.Interface().(time.Time); ok { + sqlType = "timestamp with time zone" + } + case reflect.Map: + if dataValue.Type().Name() == "Hstore" { + sqlType = "hstore" + } + default: + if IsByteArrayOrSlice(dataValue) { + sqlType = "bytea" + + if isUUID(dataValue) { + sqlType = "uuid" + } + + if isJSON(dataValue) { + sqlType = "jsonb" + } + } + } + } + + if sqlType == "" { + panic(fmt.Sprintf("invalid sql type %s (%s) for postgres", dataValue.Type().Name(), dataValue.Kind().String())) + } + + if strings.TrimSpace(additionalType) == "" { + return sqlType + } + return fmt.Sprintf("%v %v", sqlType, additionalType) +} + +func (s postgres) HasIndex(tableName string, indexName string) bool { + var count int + s.db.QueryRow("SELECT count(*) FROM pg_indexes WHERE tablename = $1 AND indexname = $2 AND schemaname = CURRENT_SCHEMA()", tableName, indexName).Scan(&count) + return count > 0 +} + +func (s postgres) HasForeignKey(tableName string, foreignKeyName string) bool { + var count int + s.db.QueryRow("SELECT count(con.conname) FROM pg_constraint con WHERE $1::regclass::oid = con.conrelid AND con.conname = $2 AND con.contype='f'", tableName, foreignKeyName).Scan(&count) + return count > 0 +} + +func (s postgres) HasTable(tableName string) bool { + var count int + s.db.QueryRow("SELECT count(*) FROM INFORMATION_SCHEMA.tables WHERE table_name = $1 AND table_type = 'BASE TABLE' AND table_schema = CURRENT_SCHEMA()", tableName).Scan(&count) + return count > 0 +} + +func (s postgres) HasColumn(tableName string, columnName string) bool { + var count int + s.db.QueryRow("SELECT count(*) FROM INFORMATION_SCHEMA.columns WHERE table_name = $1 AND column_name = $2 AND table_schema = CURRENT_SCHEMA()", tableName, columnName).Scan(&count) + return count > 0 +} + +func (s postgres) CurrentDatabase() (name string) { + s.db.QueryRow("SELECT CURRENT_DATABASE()").Scan(&name) + return +} + +func (s postgres) LastInsertIDReturningSuffix(tableName, key string) string { + return fmt.Sprintf("RETURNING %v.%v", tableName, key) +} + +func (postgres) SupportLastInsertID() bool { + return false +} + +func isUUID(value reflect.Value) bool { + if value.Kind() != reflect.Array || value.Type().Len() != 16 { + return false + } + typename := value.Type().Name() + lower := strings.ToLower(typename) + return "uuid" == lower || "guid" == lower +} + +func isJSON(value reflect.Value) bool { + _, ok := value.Interface().(json.RawMessage) + return ok +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/dialect_sqlite3.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/dialect_sqlite3.go new file mode 100644 index 0000000000000000000000000000000000000000..5f96c363a0d5b23a19f9549fb33f5225a7d52fd5 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/dialect_sqlite3.go @@ -0,0 +1,107 @@ +package gorm + +import ( + "fmt" + "reflect" + "strings" + "time" +) + +type sqlite3 struct { + commonDialect +} + +func init() { + RegisterDialect("sqlite3", &sqlite3{}) +} + +func (sqlite3) GetName() string { + return "sqlite3" +} + +// Get Data Type for Sqlite Dialect +func (s *sqlite3) DataTypeOf(field *StructField) string { + var dataValue, sqlType, size, additionalType = ParseFieldStructForDialect(field, s) + + if sqlType == "" { + switch dataValue.Kind() { + case reflect.Bool: + sqlType = "bool" + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uintptr: + if s.fieldCanAutoIncrement(field) { + field.TagSettingsSet("AUTO_INCREMENT", "AUTO_INCREMENT") + sqlType = "integer primary key autoincrement" + } else { + sqlType = "integer" + } + case reflect.Int64, reflect.Uint64: + if s.fieldCanAutoIncrement(field) { + field.TagSettingsSet("AUTO_INCREMENT", "AUTO_INCREMENT") + sqlType = "integer primary key autoincrement" + } else { + sqlType = "bigint" + } + case reflect.Float32, reflect.Float64: + sqlType = "real" + case reflect.String: + if size > 0 && size < 65532 { + sqlType = fmt.Sprintf("varchar(%d)", size) + } else { + sqlType = "text" + } + case reflect.Struct: + if _, ok := dataValue.Interface().(time.Time); ok { + sqlType = "datetime" + } + default: + if IsByteArrayOrSlice(dataValue) { + sqlType = "blob" + } + } + } + + if sqlType == "" { + panic(fmt.Sprintf("invalid sql type %s (%s) for sqlite3", dataValue.Type().Name(), dataValue.Kind().String())) + } + + if strings.TrimSpace(additionalType) == "" { + return sqlType + } + return fmt.Sprintf("%v %v", sqlType, additionalType) +} + +func (s sqlite3) HasIndex(tableName string, indexName string) bool { + var count int + s.db.QueryRow(fmt.Sprintf("SELECT count(*) FROM sqlite_master WHERE tbl_name = ? AND sql LIKE '%%INDEX %v ON%%'", indexName), tableName).Scan(&count) + return count > 0 +} + +func (s sqlite3) HasTable(tableName string) bool { + var count int + s.db.QueryRow("SELECT count(*) FROM sqlite_master WHERE type='table' AND name=?", tableName).Scan(&count) + return count > 0 +} + +func (s sqlite3) HasColumn(tableName string, columnName string) bool { + var count int + s.db.QueryRow(fmt.Sprintf("SELECT count(*) FROM sqlite_master WHERE tbl_name = ? AND (sql LIKE '%%\"%v\" %%' OR sql LIKE '%%%v %%');\n", columnName, columnName), tableName).Scan(&count) + return count > 0 +} + +func (s sqlite3) CurrentDatabase() (name string) { + var ( + ifaces = make([]interface{}, 3) + pointers = make([]*string, 3) + i int + ) + for i = 0; i < 3; i++ { + ifaces[i] = &pointers[i] + } + if err := s.db.QueryRow("PRAGMA database_list").Scan(ifaces...); err != nil { + return + } + if pointers[1] != nil { + name = *pointers[1] + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/docker-compose.yml b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/docker-compose.yml new file mode 100644 index 0000000000000000000000000000000000000000..79bf5fc3954b713a189929b6cbb00d284410297f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/docker-compose.yml @@ -0,0 +1,30 @@ +version: '3' + +services: + mysql: + image: 'mysql:latest' + ports: + - 9910:3306 + environment: + - MYSQL_DATABASE=gorm + - MYSQL_USER=gorm + - MYSQL_PASSWORD=gorm + - MYSQL_RANDOM_ROOT_PASSWORD="yes" + postgres: + image: 'postgres:latest' + ports: + - 9920:5432 + environment: + - POSTGRES_USER=gorm + - POSTGRES_DB=gorm + - POSTGRES_PASSWORD=gorm + mssql: + image: 'mcmoe/mssqldocker:latest' + ports: + - 9930:1433 + environment: + - ACCEPT_EULA=Y + - SA_PASSWORD=LoremIpsum86 + - MSSQL_DB=gorm + - MSSQL_USER=gorm + - MSSQL_PASSWORD=LoremIpsum86 diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/errors.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/errors.go new file mode 100644 index 0000000000000000000000000000000000000000..27c9a92d076f06e4b88ef6f423165757b55959d1 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/errors.go @@ -0,0 +1,72 @@ +package gorm + +import ( + "errors" + "strings" +) + +var ( + // ErrRecordNotFound record not found error, happens when only haven't find any matched data when looking up with a struct, finding a slice won't return this error + ErrRecordNotFound = errors.New("record not found") + // ErrInvalidSQL invalid SQL error, happens when you passed invalid SQL + ErrInvalidSQL = errors.New("invalid SQL") + // ErrInvalidTransaction invalid transaction when you are trying to `Commit` or `Rollback` + ErrInvalidTransaction = errors.New("no valid transaction") + // ErrCantStartTransaction can't start transaction when you are trying to start one with `Begin` + ErrCantStartTransaction = errors.New("can't start transaction") + // ErrUnaddressable unaddressable value + ErrUnaddressable = errors.New("using unaddressable value") +) + +// Errors contains all happened errors +type Errors []error + +// IsRecordNotFoundError returns current error has record not found error or not +func IsRecordNotFoundError(err error) bool { + if errs, ok := err.(Errors); ok { + for _, err := range errs { + if err == ErrRecordNotFound { + return true + } + } + } + return err == ErrRecordNotFound +} + +// GetErrors gets all happened errors +func (errs Errors) GetErrors() []error { + return errs +} + +// Add adds an error +func (errs Errors) Add(newErrors ...error) Errors { + for _, err := range newErrors { + if err == nil { + continue + } + + if errors, ok := err.(Errors); ok { + errs = errs.Add(errors...) + } else { + ok = true + for _, e := range errs { + if err == e { + ok = false + } + } + if ok { + errs = append(errs, err) + } + } + } + return errs +} + +// Error format happened errors +func (errs Errors) Error() string { + var errors = []string{} + for _, e := range errs { + errors = append(errors, e.Error()) + } + return strings.Join(errors, "; ") +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/field.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/field.go new file mode 100644 index 0000000000000000000000000000000000000000..11c410b0ff365149208762e773d4d479503fdfc3 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/field.go @@ -0,0 +1,58 @@ +package gorm + +import ( + "database/sql" + "errors" + "fmt" + "reflect" +) + +// Field model field definition +type Field struct { + *StructField + IsBlank bool + Field reflect.Value +} + +// Set set a value to the field +func (field *Field) Set(value interface{}) (err error) { + if !field.Field.IsValid() { + return errors.New("field value not valid") + } + + if !field.Field.CanAddr() { + return ErrUnaddressable + } + + reflectValue, ok := value.(reflect.Value) + if !ok { + reflectValue = reflect.ValueOf(value) + } + + fieldValue := field.Field + if reflectValue.IsValid() { + if reflectValue.Type().ConvertibleTo(fieldValue.Type()) { + fieldValue.Set(reflectValue.Convert(fieldValue.Type())) + } else { + if fieldValue.Kind() == reflect.Ptr { + if fieldValue.IsNil() { + fieldValue.Set(reflect.New(field.Struct.Type.Elem())) + } + fieldValue = fieldValue.Elem() + } + + if reflectValue.Type().ConvertibleTo(fieldValue.Type()) { + fieldValue.Set(reflectValue.Convert(fieldValue.Type())) + } else if scanner, ok := fieldValue.Addr().Interface().(sql.Scanner); ok { + err = scanner.Scan(reflectValue.Interface()) + } else { + err = fmt.Errorf("could not convert argument of field %s from %s to %s", field.Name, reflectValue.Type(), fieldValue.Type()) + } + } + } else { + field.Field.Set(reflect.Zero(field.Field.Type())) + } + + field.IsBlank = isBlank(field.Field) + return err +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/interface.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/interface.go new file mode 100644 index 0000000000000000000000000000000000000000..55128f7fc7b0424cb0c1f08da79100e5e3824bb8 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/interface.go @@ -0,0 +1,20 @@ +package gorm + +import "database/sql" + +// SQLCommon is the minimal database connection functionality gorm requires. Implemented by *sql.DB. +type SQLCommon interface { + Exec(query string, args ...interface{}) (sql.Result, error) + Prepare(query string) (*sql.Stmt, error) + Query(query string, args ...interface{}) (*sql.Rows, error) + QueryRow(query string, args ...interface{}) *sql.Row +} + +type sqlDb interface { + Begin() (*sql.Tx, error) +} + +type sqlTx interface { + Commit() error + Rollback() error +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/join_table_handler.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/join_table_handler.go new file mode 100644 index 0000000000000000000000000000000000000000..a036d46d25f38dec78bc74ccb0d883304d7680ed --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/join_table_handler.go @@ -0,0 +1,211 @@ +package gorm + +import ( + "errors" + "fmt" + "reflect" + "strings" +) + +// JoinTableHandlerInterface is an interface for how to handle many2many relations +type JoinTableHandlerInterface interface { + // initialize join table handler + Setup(relationship *Relationship, tableName string, source reflect.Type, destination reflect.Type) + // Table return join table's table name + Table(db *DB) string + // Add create relationship in join table for source and destination + Add(handler JoinTableHandlerInterface, db *DB, source interface{}, destination interface{}) error + // Delete delete relationship in join table for sources + Delete(handler JoinTableHandlerInterface, db *DB, sources ...interface{}) error + // JoinWith query with `Join` conditions + JoinWith(handler JoinTableHandlerInterface, db *DB, source interface{}) *DB + // SourceForeignKeys return source foreign keys + SourceForeignKeys() []JoinTableForeignKey + // DestinationForeignKeys return destination foreign keys + DestinationForeignKeys() []JoinTableForeignKey +} + +// JoinTableForeignKey join table foreign key struct +type JoinTableForeignKey struct { + DBName string + AssociationDBName string +} + +// JoinTableSource is a struct that contains model type and foreign keys +type JoinTableSource struct { + ModelType reflect.Type + ForeignKeys []JoinTableForeignKey +} + +// JoinTableHandler default join table handler +type JoinTableHandler struct { + TableName string `sql:"-"` + Source JoinTableSource `sql:"-"` + Destination JoinTableSource `sql:"-"` +} + +// SourceForeignKeys return source foreign keys +func (s *JoinTableHandler) SourceForeignKeys() []JoinTableForeignKey { + return s.Source.ForeignKeys +} + +// DestinationForeignKeys return destination foreign keys +func (s *JoinTableHandler) DestinationForeignKeys() []JoinTableForeignKey { + return s.Destination.ForeignKeys +} + +// Setup initialize a default join table handler +func (s *JoinTableHandler) Setup(relationship *Relationship, tableName string, source reflect.Type, destination reflect.Type) { + s.TableName = tableName + + s.Source = JoinTableSource{ModelType: source} + s.Source.ForeignKeys = []JoinTableForeignKey{} + for idx, dbName := range relationship.ForeignFieldNames { + s.Source.ForeignKeys = append(s.Source.ForeignKeys, JoinTableForeignKey{ + DBName: relationship.ForeignDBNames[idx], + AssociationDBName: dbName, + }) + } + + s.Destination = JoinTableSource{ModelType: destination} + s.Destination.ForeignKeys = []JoinTableForeignKey{} + for idx, dbName := range relationship.AssociationForeignFieldNames { + s.Destination.ForeignKeys = append(s.Destination.ForeignKeys, JoinTableForeignKey{ + DBName: relationship.AssociationForeignDBNames[idx], + AssociationDBName: dbName, + }) + } +} + +// Table return join table's table name +func (s JoinTableHandler) Table(db *DB) string { + return DefaultTableNameHandler(db, s.TableName) +} + +func (s JoinTableHandler) updateConditionMap(conditionMap map[string]interface{}, db *DB, joinTableSources []JoinTableSource, sources ...interface{}) { + for _, source := range sources { + scope := db.NewScope(source) + modelType := scope.GetModelStruct().ModelType + + for _, joinTableSource := range joinTableSources { + if joinTableSource.ModelType == modelType { + for _, foreignKey := range joinTableSource.ForeignKeys { + if field, ok := scope.FieldByName(foreignKey.AssociationDBName); ok { + conditionMap[foreignKey.DBName] = field.Field.Interface() + } + } + break + } + } + } +} + +// Add create relationship in join table for source and destination +func (s JoinTableHandler) Add(handler JoinTableHandlerInterface, db *DB, source interface{}, destination interface{}) error { + var ( + scope = db.NewScope("") + conditionMap = map[string]interface{}{} + ) + + // Update condition map for source + s.updateConditionMap(conditionMap, db, []JoinTableSource{s.Source}, source) + + // Update condition map for destination + s.updateConditionMap(conditionMap, db, []JoinTableSource{s.Destination}, destination) + + var assignColumns, binVars, conditions []string + var values []interface{} + for key, value := range conditionMap { + assignColumns = append(assignColumns, scope.Quote(key)) + binVars = append(binVars, `?`) + conditions = append(conditions, fmt.Sprintf("%v = ?", scope.Quote(key))) + values = append(values, value) + } + + for _, value := range values { + values = append(values, value) + } + + quotedTable := scope.Quote(handler.Table(db)) + sql := fmt.Sprintf( + "INSERT INTO %v (%v) SELECT %v %v WHERE NOT EXISTS (SELECT * FROM %v WHERE %v)", + quotedTable, + strings.Join(assignColumns, ","), + strings.Join(binVars, ","), + scope.Dialect().SelectFromDummyTable(), + quotedTable, + strings.Join(conditions, " AND "), + ) + + return db.Exec(sql, values...).Error +} + +// Delete delete relationship in join table for sources +func (s JoinTableHandler) Delete(handler JoinTableHandlerInterface, db *DB, sources ...interface{}) error { + var ( + scope = db.NewScope(nil) + conditions []string + values []interface{} + conditionMap = map[string]interface{}{} + ) + + s.updateConditionMap(conditionMap, db, []JoinTableSource{s.Source, s.Destination}, sources...) + + for key, value := range conditionMap { + conditions = append(conditions, fmt.Sprintf("%v = ?", scope.Quote(key))) + values = append(values, value) + } + + return db.Table(handler.Table(db)).Where(strings.Join(conditions, " AND "), values...).Delete("").Error +} + +// JoinWith query with `Join` conditions +func (s JoinTableHandler) JoinWith(handler JoinTableHandlerInterface, db *DB, source interface{}) *DB { + var ( + scope = db.NewScope(source) + tableName = handler.Table(db) + quotedTableName = scope.Quote(tableName) + joinConditions []string + values []interface{} + ) + + if s.Source.ModelType == scope.GetModelStruct().ModelType { + destinationTableName := db.NewScope(reflect.New(s.Destination.ModelType).Interface()).QuotedTableName() + for _, foreignKey := range s.Destination.ForeignKeys { + joinConditions = append(joinConditions, fmt.Sprintf("%v.%v = %v.%v", quotedTableName, scope.Quote(foreignKey.DBName), destinationTableName, scope.Quote(foreignKey.AssociationDBName))) + } + + var foreignDBNames []string + var foreignFieldNames []string + + for _, foreignKey := range s.Source.ForeignKeys { + foreignDBNames = append(foreignDBNames, foreignKey.DBName) + if field, ok := scope.FieldByName(foreignKey.AssociationDBName); ok { + foreignFieldNames = append(foreignFieldNames, field.Name) + } + } + + foreignFieldValues := scope.getColumnAsArray(foreignFieldNames, scope.Value) + + var condString string + if len(foreignFieldValues) > 0 { + var quotedForeignDBNames []string + for _, dbName := range foreignDBNames { + quotedForeignDBNames = append(quotedForeignDBNames, tableName+"."+dbName) + } + + condString = fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, quotedForeignDBNames), toQueryMarks(foreignFieldValues)) + + keys := scope.getColumnAsArray(foreignFieldNames, scope.Value) + values = append(values, toQueryValues(keys)) + } else { + condString = fmt.Sprintf("1 <> 1") + } + + return db.Joins(fmt.Sprintf("INNER JOIN %v ON %v", quotedTableName, strings.Join(joinConditions, " AND "))). + Where(condString, toQueryValues(foreignFieldValues)...) + } + + db.Error = errors.New("wrong source type for join table handler") + return db +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/logger.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/logger.go new file mode 100644 index 0000000000000000000000000000000000000000..4324a2e40a282840dba1966f9c249278b7726e64 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/logger.go @@ -0,0 +1,119 @@ +package gorm + +import ( + "database/sql/driver" + "fmt" + "log" + "os" + "reflect" + "regexp" + "strconv" + "time" + "unicode" +) + +var ( + defaultLogger = Logger{log.New(os.Stdout, "\r\n", 0)} + sqlRegexp = regexp.MustCompile(`\?`) + numericPlaceHolderRegexp = regexp.MustCompile(`\$\d+`) +) + +func isPrintable(s string) bool { + for _, r := range s { + if !unicode.IsPrint(r) { + return false + } + } + return true +} + +var LogFormatter = func(values ...interface{}) (messages []interface{}) { + if len(values) > 1 { + var ( + sql string + formattedValues []string + level = values[0] + currentTime = "\n\033[33m[" + NowFunc().Format("2006-01-02 15:04:05") + "]\033[0m" + source = fmt.Sprintf("\033[35m(%v)\033[0m", values[1]) + ) + + messages = []interface{}{source, currentTime} + + if level == "sql" { + // duration + messages = append(messages, fmt.Sprintf(" \033[36;1m[%.2fms]\033[0m ", float64(values[2].(time.Duration).Nanoseconds()/1e4)/100.0)) + // sql + + for _, value := range values[4].([]interface{}) { + indirectValue := reflect.Indirect(reflect.ValueOf(value)) + if indirectValue.IsValid() { + value = indirectValue.Interface() + if t, ok := value.(time.Time); ok { + formattedValues = append(formattedValues, fmt.Sprintf("'%v'", t.Format("2006-01-02 15:04:05"))) + } else if b, ok := value.([]byte); ok { + if str := string(b); isPrintable(str) { + formattedValues = append(formattedValues, fmt.Sprintf("'%v'", str)) + } else { + formattedValues = append(formattedValues, "'<binary>'") + } + } else if r, ok := value.(driver.Valuer); ok { + if value, err := r.Value(); err == nil && value != nil { + formattedValues = append(formattedValues, fmt.Sprintf("'%v'", value)) + } else { + formattedValues = append(formattedValues, "NULL") + } + } else { + formattedValues = append(formattedValues, fmt.Sprintf("'%v'", value)) + } + } else { + formattedValues = append(formattedValues, "NULL") + } + } + + // differentiate between $n placeholders or else treat like ? + if numericPlaceHolderRegexp.MatchString(values[3].(string)) { + sql = values[3].(string) + for index, value := range formattedValues { + placeholder := fmt.Sprintf(`\$%d([^\d]|$)`, index+1) + sql = regexp.MustCompile(placeholder).ReplaceAllString(sql, value+"$1") + } + } else { + formattedValuesLength := len(formattedValues) + for index, value := range sqlRegexp.Split(values[3].(string), -1) { + sql += value + if index < formattedValuesLength { + sql += formattedValues[index] + } + } + } + + messages = append(messages, sql) + messages = append(messages, fmt.Sprintf(" \n\033[36;31m[%v]\033[0m ", strconv.FormatInt(values[5].(int64), 10)+" rows affected or returned ")) + } else { + messages = append(messages, "\033[31;1m") + messages = append(messages, values[2:]...) + messages = append(messages, "\033[0m") + } + } + + return +} + +type logger interface { + Print(v ...interface{}) +} + +// LogWriter log writer interface +type LogWriter interface { + Println(v ...interface{}) +} + +// Logger default logger +type Logger struct { + LogWriter +} + +// Print format & print log +func (logger Logger) Print(values ...interface{}) { + logger.Println(LogFormatter(values...)...) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/main.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/main.go new file mode 100644 index 0000000000000000000000000000000000000000..17c75ed30600b82019551e1ba08b4d587afeea3d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/main.go @@ -0,0 +1,792 @@ +package gorm + +import ( + "database/sql" + "errors" + "fmt" + "reflect" + "strings" + "sync" + "time" +) + +// DB contains information for current db connection +type DB struct { + Value interface{} + Error error + RowsAffected int64 + + // single db + db SQLCommon + blockGlobalUpdate bool + logMode int + logger logger + search *search + values sync.Map + + // global db + parent *DB + callbacks *Callback + dialect Dialect + singularTable bool +} + +// Open initialize a new db connection, need to import driver first, e.g: +// +// import _ "github.com/go-sql-driver/mysql" +// func main() { +// db, err := gorm.Open("mysql", "user:password@/dbname?charset=utf8&parseTime=True&loc=Local") +// } +// GORM has wrapped some drivers, for easier to remember driver's import path, so you could import the mysql driver with +// import _ "github.com/jinzhu/gorm/dialects/mysql" +// // import _ "github.com/jinzhu/gorm/dialects/postgres" +// // import _ "github.com/jinzhu/gorm/dialects/sqlite" +// // import _ "github.com/jinzhu/gorm/dialects/mssql" +func Open(dialect string, args ...interface{}) (db *DB, err error) { + if len(args) == 0 { + err = errors.New("invalid database source") + return nil, err + } + var source string + var dbSQL SQLCommon + var ownDbSQL bool + + switch value := args[0].(type) { + case string: + var driver = dialect + if len(args) == 1 { + source = value + } else if len(args) >= 2 { + driver = value + source = args[1].(string) + } + dbSQL, err = sql.Open(driver, source) + ownDbSQL = true + case SQLCommon: + dbSQL = value + ownDbSQL = false + default: + return nil, fmt.Errorf("invalid database source: %v is not a valid type", value) + } + + db = &DB{ + db: dbSQL, + logger: defaultLogger, + callbacks: DefaultCallback, + dialect: newDialect(dialect, dbSQL), + } + db.parent = db + if err != nil { + return + } + // Send a ping to make sure the database connection is alive. + if d, ok := dbSQL.(*sql.DB); ok { + if err = d.Ping(); err != nil && ownDbSQL { + d.Close() + } + } + return +} + +// New clone a new db connection without search conditions +func (s *DB) New() *DB { + clone := s.clone() + clone.search = nil + clone.Value = nil + return clone +} + +type closer interface { + Close() error +} + +// Close close current db connection. If database connection is not an io.Closer, returns an error. +func (s *DB) Close() error { + if db, ok := s.parent.db.(closer); ok { + return db.Close() + } + return errors.New("can't close current db") +} + +// DB get `*sql.DB` from current connection +// If the underlying database connection is not a *sql.DB, returns nil +func (s *DB) DB() *sql.DB { + db, _ := s.db.(*sql.DB) + return db +} + +// CommonDB return the underlying `*sql.DB` or `*sql.Tx` instance, mainly intended to allow coexistence with legacy non-GORM code. +func (s *DB) CommonDB() SQLCommon { + return s.db +} + +// Dialect get dialect +func (s *DB) Dialect() Dialect { + return s.dialect +} + +// Callback return `Callbacks` container, you could add/change/delete callbacks with it +// db.Callback().Create().Register("update_created_at", updateCreated) +// Refer https://jinzhu.github.io/gorm/development.html#callbacks +func (s *DB) Callback() *Callback { + s.parent.callbacks = s.parent.callbacks.clone() + return s.parent.callbacks +} + +// SetLogger replace default logger +func (s *DB) SetLogger(log logger) { + s.logger = log +} + +// LogMode set log mode, `true` for detailed logs, `false` for no log, default, will only print error logs +func (s *DB) LogMode(enable bool) *DB { + if enable { + s.logMode = 2 + } else { + s.logMode = 1 + } + return s +} + +// BlockGlobalUpdate if true, generates an error on update/delete without where clause. +// This is to prevent eventual error with empty objects updates/deletions +func (s *DB) BlockGlobalUpdate(enable bool) *DB { + s.blockGlobalUpdate = enable + return s +} + +// HasBlockGlobalUpdate return state of block +func (s *DB) HasBlockGlobalUpdate() bool { + return s.blockGlobalUpdate +} + +// SingularTable use singular table by default +func (s *DB) SingularTable(enable bool) { + modelStructsMap = sync.Map{} + s.parent.singularTable = enable +} + +// NewScope create a scope for current operation +func (s *DB) NewScope(value interface{}) *Scope { + dbClone := s.clone() + dbClone.Value = value + return &Scope{db: dbClone, Search: dbClone.search.clone(), Value: value} +} + +// QueryExpr returns the query as expr object +func (s *DB) QueryExpr() *expr { + scope := s.NewScope(s.Value) + scope.InstanceSet("skip_bindvar", true) + scope.prepareQuerySQL() + + return Expr(scope.SQL, scope.SQLVars...) +} + +// SubQuery returns the query as sub query +func (s *DB) SubQuery() *expr { + scope := s.NewScope(s.Value) + scope.InstanceSet("skip_bindvar", true) + scope.prepareQuerySQL() + + return Expr(fmt.Sprintf("(%v)", scope.SQL), scope.SQLVars...) +} + +// Where return a new relation, filter records with given conditions, accepts `map`, `struct` or `string` as conditions, refer http://jinzhu.github.io/gorm/crud.html#query +func (s *DB) Where(query interface{}, args ...interface{}) *DB { + return s.clone().search.Where(query, args...).db +} + +// Or filter records that match before conditions or this one, similar to `Where` +func (s *DB) Or(query interface{}, args ...interface{}) *DB { + return s.clone().search.Or(query, args...).db +} + +// Not filter records that don't match current conditions, similar to `Where` +func (s *DB) Not(query interface{}, args ...interface{}) *DB { + return s.clone().search.Not(query, args...).db +} + +// Limit specify the number of records to be retrieved +func (s *DB) Limit(limit interface{}) *DB { + return s.clone().search.Limit(limit).db +} + +// Offset specify the number of records to skip before starting to return the records +func (s *DB) Offset(offset interface{}) *DB { + return s.clone().search.Offset(offset).db +} + +// Order specify order when retrieve records from database, set reorder to `true` to overwrite defined conditions +// db.Order("name DESC") +// db.Order("name DESC", true) // reorder +// db.Order(gorm.Expr("name = ? DESC", "first")) // sql expression +func (s *DB) Order(value interface{}, reorder ...bool) *DB { + return s.clone().search.Order(value, reorder...).db +} + +// Select specify fields that you want to retrieve from database when querying, by default, will select all fields; +// When creating/updating, specify fields that you want to save to database +func (s *DB) Select(query interface{}, args ...interface{}) *DB { + return s.clone().search.Select(query, args...).db +} + +// Omit specify fields that you want to ignore when saving to database for creating, updating +func (s *DB) Omit(columns ...string) *DB { + return s.clone().search.Omit(columns...).db +} + +// Group specify the group method on the find +func (s *DB) Group(query string) *DB { + return s.clone().search.Group(query).db +} + +// Having specify HAVING conditions for GROUP BY +func (s *DB) Having(query interface{}, values ...interface{}) *DB { + return s.clone().search.Having(query, values...).db +} + +// Joins specify Joins conditions +// db.Joins("JOIN emails ON emails.user_id = users.id AND emails.email = ?", "jinzhu@example.org").Find(&user) +func (s *DB) Joins(query string, args ...interface{}) *DB { + return s.clone().search.Joins(query, args...).db +} + +// Scopes pass current database connection to arguments `func(*DB) *DB`, which could be used to add conditions dynamically +// func AmountGreaterThan1000(db *gorm.DB) *gorm.DB { +// return db.Where("amount > ?", 1000) +// } +// +// func OrderStatus(status []string) func (db *gorm.DB) *gorm.DB { +// return func (db *gorm.DB) *gorm.DB { +// return db.Scopes(AmountGreaterThan1000).Where("status in (?)", status) +// } +// } +// +// db.Scopes(AmountGreaterThan1000, OrderStatus([]string{"paid", "shipped"})).Find(&orders) +// Refer https://jinzhu.github.io/gorm/crud.html#scopes +func (s *DB) Scopes(funcs ...func(*DB) *DB) *DB { + for _, f := range funcs { + s = f(s) + } + return s +} + +// Unscoped return all record including deleted record, refer Soft Delete https://jinzhu.github.io/gorm/crud.html#soft-delete +func (s *DB) Unscoped() *DB { + return s.clone().search.unscoped().db +} + +// Attrs initialize struct with argument if record not found with `FirstOrInit` https://jinzhu.github.io/gorm/crud.html#firstorinit or `FirstOrCreate` https://jinzhu.github.io/gorm/crud.html#firstorcreate +func (s *DB) Attrs(attrs ...interface{}) *DB { + return s.clone().search.Attrs(attrs...).db +} + +// Assign assign result with argument regardless it is found or not with `FirstOrInit` https://jinzhu.github.io/gorm/crud.html#firstorinit or `FirstOrCreate` https://jinzhu.github.io/gorm/crud.html#firstorcreate +func (s *DB) Assign(attrs ...interface{}) *DB { + return s.clone().search.Assign(attrs...).db +} + +// First find first record that match given conditions, order by primary key +func (s *DB) First(out interface{}, where ...interface{}) *DB { + newScope := s.NewScope(out) + newScope.Search.Limit(1) + return newScope.Set("gorm:order_by_primary_key", "ASC"). + inlineCondition(where...).callCallbacks(s.parent.callbacks.queries).db +} + +// Take return a record that match given conditions, the order will depend on the database implementation +func (s *DB) Take(out interface{}, where ...interface{}) *DB { + newScope := s.NewScope(out) + newScope.Search.Limit(1) + return newScope.inlineCondition(where...).callCallbacks(s.parent.callbacks.queries).db +} + +// Last find last record that match given conditions, order by primary key +func (s *DB) Last(out interface{}, where ...interface{}) *DB { + newScope := s.NewScope(out) + newScope.Search.Limit(1) + return newScope.Set("gorm:order_by_primary_key", "DESC"). + inlineCondition(where...).callCallbacks(s.parent.callbacks.queries).db +} + +// Find find records that match given conditions +func (s *DB) Find(out interface{}, where ...interface{}) *DB { + return s.NewScope(out).inlineCondition(where...).callCallbacks(s.parent.callbacks.queries).db +} + +//Preloads preloads relations, don`t touch out +func (s *DB) Preloads(out interface{}) *DB { + return s.NewScope(out).InstanceSet("gorm:only_preload", 1).callCallbacks(s.parent.callbacks.queries).db +} + +// Scan scan value to a struct +func (s *DB) Scan(dest interface{}) *DB { + return s.NewScope(s.Value).Set("gorm:query_destination", dest).callCallbacks(s.parent.callbacks.queries).db +} + +// Row return `*sql.Row` with given conditions +func (s *DB) Row() *sql.Row { + return s.NewScope(s.Value).row() +} + +// Rows return `*sql.Rows` with given conditions +func (s *DB) Rows() (*sql.Rows, error) { + return s.NewScope(s.Value).rows() +} + +// ScanRows scan `*sql.Rows` to give struct +func (s *DB) ScanRows(rows *sql.Rows, result interface{}) error { + var ( + scope = s.NewScope(result) + clone = scope.db + columns, err = rows.Columns() + ) + + if clone.AddError(err) == nil { + scope.scan(rows, columns, scope.Fields()) + } + + return clone.Error +} + +// Pluck used to query single column from a model as a map +// var ages []int64 +// db.Find(&users).Pluck("age", &ages) +func (s *DB) Pluck(column string, value interface{}) *DB { + return s.NewScope(s.Value).pluck(column, value).db +} + +// Count get how many records for a model +func (s *DB) Count(value interface{}) *DB { + return s.NewScope(s.Value).count(value).db +} + +// Related get related associations +func (s *DB) Related(value interface{}, foreignKeys ...string) *DB { + return s.NewScope(s.Value).related(value, foreignKeys...).db +} + +// FirstOrInit find first matched record or initialize a new one with given conditions (only works with struct, map conditions) +// https://jinzhu.github.io/gorm/crud.html#firstorinit +func (s *DB) FirstOrInit(out interface{}, where ...interface{}) *DB { + c := s.clone() + if result := c.First(out, where...); result.Error != nil { + if !result.RecordNotFound() { + return result + } + c.NewScope(out).inlineCondition(where...).initialize() + } else { + c.NewScope(out).updatedAttrsWithValues(c.search.assignAttrs) + } + return c +} + +// FirstOrCreate find first matched record or create a new one with given conditions (only works with struct, map conditions) +// https://jinzhu.github.io/gorm/crud.html#firstorcreate +func (s *DB) FirstOrCreate(out interface{}, where ...interface{}) *DB { + c := s.clone() + if result := s.First(out, where...); result.Error != nil { + if !result.RecordNotFound() { + return result + } + return c.NewScope(out).inlineCondition(where...).initialize().callCallbacks(c.parent.callbacks.creates).db + } else if len(c.search.assignAttrs) > 0 { + return c.NewScope(out).InstanceSet("gorm:update_interface", c.search.assignAttrs).callCallbacks(c.parent.callbacks.updates).db + } + return c +} + +// Update update attributes with callbacks, refer: https://jinzhu.github.io/gorm/crud.html#update +func (s *DB) Update(attrs ...interface{}) *DB { + return s.Updates(toSearchableMap(attrs...), true) +} + +// Updates update attributes with callbacks, refer: https://jinzhu.github.io/gorm/crud.html#update +func (s *DB) Updates(values interface{}, ignoreProtectedAttrs ...bool) *DB { + return s.NewScope(s.Value). + Set("gorm:ignore_protected_attrs", len(ignoreProtectedAttrs) > 0). + InstanceSet("gorm:update_interface", values). + callCallbacks(s.parent.callbacks.updates).db +} + +// UpdateColumn update attributes without callbacks, refer: https://jinzhu.github.io/gorm/crud.html#update +func (s *DB) UpdateColumn(attrs ...interface{}) *DB { + return s.UpdateColumns(toSearchableMap(attrs...)) +} + +// UpdateColumns update attributes without callbacks, refer: https://jinzhu.github.io/gorm/crud.html#update +func (s *DB) UpdateColumns(values interface{}) *DB { + return s.NewScope(s.Value). + Set("gorm:update_column", true). + Set("gorm:save_associations", false). + InstanceSet("gorm:update_interface", values). + callCallbacks(s.parent.callbacks.updates).db +} + +// Save update value in database, if the value doesn't have primary key, will insert it +func (s *DB) Save(value interface{}) *DB { + scope := s.NewScope(value) + if !scope.PrimaryKeyZero() { + newDB := scope.callCallbacks(s.parent.callbacks.updates).db + if newDB.Error == nil && newDB.RowsAffected == 0 { + return s.New().FirstOrCreate(value) + } + return newDB + } + return scope.callCallbacks(s.parent.callbacks.creates).db +} + +// Create insert the value into database +func (s *DB) Create(value interface{}) *DB { + scope := s.NewScope(value) + return scope.callCallbacks(s.parent.callbacks.creates).db +} + +// Delete delete value match given conditions, if the value has primary key, then will including the primary key as condition +func (s *DB) Delete(value interface{}, where ...interface{}) *DB { + return s.NewScope(value).inlineCondition(where...).callCallbacks(s.parent.callbacks.deletes).db +} + +// Raw use raw sql as conditions, won't run it unless invoked by other methods +// db.Raw("SELECT name, age FROM users WHERE name = ?", 3).Scan(&result) +func (s *DB) Raw(sql string, values ...interface{}) *DB { + return s.clone().search.Raw(true).Where(sql, values...).db +} + +// Exec execute raw sql +func (s *DB) Exec(sql string, values ...interface{}) *DB { + scope := s.NewScope(nil) + generatedSQL := scope.buildCondition(map[string]interface{}{"query": sql, "args": values}, true) + generatedSQL = strings.TrimSuffix(strings.TrimPrefix(generatedSQL, "("), ")") + scope.Raw(generatedSQL) + return scope.Exec().db +} + +// Model specify the model you would like to run db operations +// // update all users's name to `hello` +// db.Model(&User{}).Update("name", "hello") +// // if user's primary key is non-blank, will use it as condition, then will only update the user's name to `hello` +// db.Model(&user).Update("name", "hello") +func (s *DB) Model(value interface{}) *DB { + c := s.clone() + c.Value = value + return c +} + +// Table specify the table you would like to run db operations +func (s *DB) Table(name string) *DB { + clone := s.clone() + clone.search.Table(name) + clone.Value = nil + return clone +} + +// Debug start debug mode +func (s *DB) Debug() *DB { + return s.clone().LogMode(true) +} + +// Begin begin a transaction +func (s *DB) Begin() *DB { + c := s.clone() + if db, ok := c.db.(sqlDb); ok && db != nil { + tx, err := db.Begin() + c.db = interface{}(tx).(SQLCommon) + + c.dialect.SetDB(c.db) + c.AddError(err) + } else { + c.AddError(ErrCantStartTransaction) + } + return c +} + +// Commit commit a transaction +func (s *DB) Commit() *DB { + var emptySQLTx *sql.Tx + if db, ok := s.db.(sqlTx); ok && db != nil && db != emptySQLTx { + s.AddError(db.Commit()) + } else { + s.AddError(ErrInvalidTransaction) + } + return s +} + +// Rollback rollback a transaction +func (s *DB) Rollback() *DB { + var emptySQLTx *sql.Tx + if db, ok := s.db.(sqlTx); ok && db != nil && db != emptySQLTx { + s.AddError(db.Rollback()) + } else { + s.AddError(ErrInvalidTransaction) + } + return s +} + +// NewRecord check if value's primary key is blank +func (s *DB) NewRecord(value interface{}) bool { + return s.NewScope(value).PrimaryKeyZero() +} + +// RecordNotFound check if returning ErrRecordNotFound error +func (s *DB) RecordNotFound() bool { + for _, err := range s.GetErrors() { + if err == ErrRecordNotFound { + return true + } + } + return false +} + +// CreateTable create table for models +func (s *DB) CreateTable(models ...interface{}) *DB { + db := s.Unscoped() + for _, model := range models { + db = db.NewScope(model).createTable().db + } + return db +} + +// DropTable drop table for models +func (s *DB) DropTable(values ...interface{}) *DB { + db := s.clone() + for _, value := range values { + if tableName, ok := value.(string); ok { + db = db.Table(tableName) + } + + db = db.NewScope(value).dropTable().db + } + return db +} + +// DropTableIfExists drop table if it is exist +func (s *DB) DropTableIfExists(values ...interface{}) *DB { + db := s.clone() + for _, value := range values { + if s.HasTable(value) { + db.AddError(s.DropTable(value).Error) + } + } + return db +} + +// HasTable check has table or not +func (s *DB) HasTable(value interface{}) bool { + var ( + scope = s.NewScope(value) + tableName string + ) + + if name, ok := value.(string); ok { + tableName = name + } else { + tableName = scope.TableName() + } + + has := scope.Dialect().HasTable(tableName) + s.AddError(scope.db.Error) + return has +} + +// AutoMigrate run auto migration for given models, will only add missing fields, won't delete/change current data +func (s *DB) AutoMigrate(values ...interface{}) *DB { + db := s.Unscoped() + for _, value := range values { + db = db.NewScope(value).autoMigrate().db + } + return db +} + +// ModifyColumn modify column to type +func (s *DB) ModifyColumn(column string, typ string) *DB { + scope := s.NewScope(s.Value) + scope.modifyColumn(column, typ) + return scope.db +} + +// DropColumn drop a column +func (s *DB) DropColumn(column string) *DB { + scope := s.NewScope(s.Value) + scope.dropColumn(column) + return scope.db +} + +// AddIndex add index for columns with given name +func (s *DB) AddIndex(indexName string, columns ...string) *DB { + scope := s.Unscoped().NewScope(s.Value) + scope.addIndex(false, indexName, columns...) + return scope.db +} + +// AddUniqueIndex add unique index for columns with given name +func (s *DB) AddUniqueIndex(indexName string, columns ...string) *DB { + scope := s.Unscoped().NewScope(s.Value) + scope.addIndex(true, indexName, columns...) + return scope.db +} + +// RemoveIndex remove index with name +func (s *DB) RemoveIndex(indexName string) *DB { + scope := s.NewScope(s.Value) + scope.removeIndex(indexName) + return scope.db +} + +// AddForeignKey Add foreign key to the given scope, e.g: +// db.Model(&User{}).AddForeignKey("city_id", "cities(id)", "RESTRICT", "RESTRICT") +func (s *DB) AddForeignKey(field string, dest string, onDelete string, onUpdate string) *DB { + scope := s.NewScope(s.Value) + scope.addForeignKey(field, dest, onDelete, onUpdate) + return scope.db +} + +// RemoveForeignKey Remove foreign key from the given scope, e.g: +// db.Model(&User{}).RemoveForeignKey("city_id", "cities(id)") +func (s *DB) RemoveForeignKey(field string, dest string) *DB { + scope := s.clone().NewScope(s.Value) + scope.removeForeignKey(field, dest) + return scope.db +} + +// Association start `Association Mode` to handler relations things easir in that mode, refer: https://jinzhu.github.io/gorm/associations.html#association-mode +func (s *DB) Association(column string) *Association { + var err error + var scope = s.Set("gorm:association:source", s.Value).NewScope(s.Value) + + if primaryField := scope.PrimaryField(); primaryField.IsBlank { + err = errors.New("primary key can't be nil") + } else { + if field, ok := scope.FieldByName(column); ok { + if field.Relationship == nil || len(field.Relationship.ForeignFieldNames) == 0 { + err = fmt.Errorf("invalid association %v for %v", column, scope.IndirectValue().Type()) + } else { + return &Association{scope: scope, column: column, field: field} + } + } else { + err = fmt.Errorf("%v doesn't have column %v", scope.IndirectValue().Type(), column) + } + } + + return &Association{Error: err} +} + +// Preload preload associations with given conditions +// db.Preload("Orders", "state NOT IN (?)", "cancelled").Find(&users) +func (s *DB) Preload(column string, conditions ...interface{}) *DB { + return s.clone().search.Preload(column, conditions...).db +} + +// Set set setting by name, which could be used in callbacks, will clone a new db, and update its setting +func (s *DB) Set(name string, value interface{}) *DB { + return s.clone().InstantSet(name, value) +} + +// InstantSet instant set setting, will affect current db +func (s *DB) InstantSet(name string, value interface{}) *DB { + s.values.Store(name, value) + return s +} + +// Get get setting by name +func (s *DB) Get(name string) (value interface{}, ok bool) { + value, ok = s.values.Load(name) + return +} + +// SetJoinTableHandler set a model's join table handler for a relation +func (s *DB) SetJoinTableHandler(source interface{}, column string, handler JoinTableHandlerInterface) { + scope := s.NewScope(source) + for _, field := range scope.GetModelStruct().StructFields { + if field.Name == column || field.DBName == column { + if many2many, _ := field.TagSettingsGet("MANY2MANY"); many2many != "" { + source := (&Scope{Value: source}).GetModelStruct().ModelType + destination := (&Scope{Value: reflect.New(field.Struct.Type).Interface()}).GetModelStruct().ModelType + handler.Setup(field.Relationship, many2many, source, destination) + field.Relationship.JoinTableHandler = handler + if table := handler.Table(s); scope.Dialect().HasTable(table) { + s.Table(table).AutoMigrate(handler) + } + } + } + } +} + +// AddError add error to the db +func (s *DB) AddError(err error) error { + if err != nil { + if err != ErrRecordNotFound { + if s.logMode == 0 { + go s.print(fileWithLineNum(), err) + } else { + s.log(err) + } + + errors := Errors(s.GetErrors()) + errors = errors.Add(err) + if len(errors) > 1 { + err = errors + } + } + + s.Error = err + } + return err +} + +// GetErrors get happened errors from the db +func (s *DB) GetErrors() []error { + if errs, ok := s.Error.(Errors); ok { + return errs + } else if s.Error != nil { + return []error{s.Error} + } + return []error{} +} + +//////////////////////////////////////////////////////////////////////////////// +// Private Methods For DB +//////////////////////////////////////////////////////////////////////////////// + +func (s *DB) clone() *DB { + db := &DB{ + db: s.db, + parent: s.parent, + logger: s.logger, + logMode: s.logMode, + Value: s.Value, + Error: s.Error, + blockGlobalUpdate: s.blockGlobalUpdate, + dialect: newDialect(s.dialect.GetName(), s.db), + } + + s.values.Range(func(k, v interface{}) bool { + db.values.Store(k, v) + return true + }) + + if s.search == nil { + db.search = &search{limit: -1, offset: -1} + } else { + db.search = s.search.clone() + } + + db.search.db = db + return db +} + +func (s *DB) print(v ...interface{}) { + s.logger.Print(v...) +} + +func (s *DB) log(v ...interface{}) { + if s != nil && s.logMode == 2 { + s.print(append([]interface{}{"log", fileWithLineNum()}, v...)...) + } +} + +func (s *DB) slog(sql string, t time.Time, vars ...interface{}) { + if s.logMode == 2 { + s.print("sql", fileWithLineNum(), NowFunc().Sub(t), sql, vars, s.RowsAffected) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/model.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/model.go new file mode 100644 index 0000000000000000000000000000000000000000..f37ff7eaaa3988dc4e2e6468f461f4f16857ff53 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/model.go @@ -0,0 +1,14 @@ +package gorm + +import "time" + +// Model base model definition, including fields `ID`, `CreatedAt`, `UpdatedAt`, `DeletedAt`, which could be embedded in your models +// type User struct { +// gorm.Model +// } +type Model struct { + ID uint `gorm:"primary_key"` + CreatedAt time.Time + UpdatedAt time.Time + DeletedAt *time.Time `sql:"index"` +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/model_struct.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/model_struct.go new file mode 100644 index 0000000000000000000000000000000000000000..8c27e2097c85b1f72b5a175dbf97726254877093 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/model_struct.go @@ -0,0 +1,640 @@ +package gorm + +import ( + "database/sql" + "errors" + "go/ast" + "reflect" + "strings" + "sync" + "time" + + "github.com/jinzhu/inflection" +) + +// DefaultTableNameHandler default table name handler +var DefaultTableNameHandler = func(db *DB, defaultTableName string) string { + return defaultTableName +} + +var modelStructsMap sync.Map + +// ModelStruct model definition +type ModelStruct struct { + PrimaryFields []*StructField + StructFields []*StructField + ModelType reflect.Type + + defaultTableName string + l sync.Mutex +} + +// TableName returns model's table name +func (s *ModelStruct) TableName(db *DB) string { + s.l.Lock() + defer s.l.Unlock() + + if s.defaultTableName == "" && db != nil && s.ModelType != nil { + // Set default table name + if tabler, ok := reflect.New(s.ModelType).Interface().(tabler); ok { + s.defaultTableName = tabler.TableName() + } else { + tableName := ToTableName(s.ModelType.Name()) + if db == nil || !db.parent.singularTable { + tableName = inflection.Plural(tableName) + } + s.defaultTableName = tableName + } + } + + return DefaultTableNameHandler(db, s.defaultTableName) +} + +// StructField model field's struct definition +type StructField struct { + DBName string + Name string + Names []string + IsPrimaryKey bool + IsNormal bool + IsIgnored bool + IsScanner bool + HasDefaultValue bool + Tag reflect.StructTag + TagSettings map[string]string + Struct reflect.StructField + IsForeignKey bool + Relationship *Relationship + + tagSettingsLock sync.RWMutex +} + +// TagSettingsSet Sets a tag in the tag settings map +func (s *StructField) TagSettingsSet(key, val string) { + s.tagSettingsLock.Lock() + defer s.tagSettingsLock.Unlock() + s.TagSettings[key] = val +} + +// TagSettingsGet returns a tag from the tag settings +func (s *StructField) TagSettingsGet(key string) (string, bool) { + s.tagSettingsLock.RLock() + defer s.tagSettingsLock.RUnlock() + val, ok := s.TagSettings[key] + return val, ok +} + +// TagSettingsDelete deletes a tag +func (s *StructField) TagSettingsDelete(key string) { + s.tagSettingsLock.Lock() + defer s.tagSettingsLock.Unlock() + delete(s.TagSettings, key) +} + +func (structField *StructField) clone() *StructField { + clone := &StructField{ + DBName: structField.DBName, + Name: structField.Name, + Names: structField.Names, + IsPrimaryKey: structField.IsPrimaryKey, + IsNormal: structField.IsNormal, + IsIgnored: structField.IsIgnored, + IsScanner: structField.IsScanner, + HasDefaultValue: structField.HasDefaultValue, + Tag: structField.Tag, + TagSettings: map[string]string{}, + Struct: structField.Struct, + IsForeignKey: structField.IsForeignKey, + } + + if structField.Relationship != nil { + relationship := *structField.Relationship + clone.Relationship = &relationship + } + + // copy the struct field tagSettings, they should be read-locked while they are copied + structField.tagSettingsLock.Lock() + defer structField.tagSettingsLock.Unlock() + for key, value := range structField.TagSettings { + clone.TagSettings[key] = value + } + + return clone +} + +// Relationship described the relationship between models +type Relationship struct { + Kind string + PolymorphicType string + PolymorphicDBName string + PolymorphicValue string + ForeignFieldNames []string + ForeignDBNames []string + AssociationForeignFieldNames []string + AssociationForeignDBNames []string + JoinTableHandler JoinTableHandlerInterface +} + +func getForeignField(column string, fields []*StructField) *StructField { + for _, field := range fields { + if field.Name == column || field.DBName == column || field.DBName == ToColumnName(column) { + return field + } + } + return nil +} + +// GetModelStruct get value's model struct, relationships based on struct and tag definition +func (scope *Scope) GetModelStruct() *ModelStruct { + var modelStruct ModelStruct + // Scope value can't be nil + if scope.Value == nil { + return &modelStruct + } + + reflectType := reflect.ValueOf(scope.Value).Type() + for reflectType.Kind() == reflect.Slice || reflectType.Kind() == reflect.Ptr { + reflectType = reflectType.Elem() + } + + // Scope value need to be a struct + if reflectType.Kind() != reflect.Struct { + return &modelStruct + } + + // Get Cached model struct + if value, ok := modelStructsMap.Load(reflectType); ok && value != nil { + return value.(*ModelStruct) + } + + modelStruct.ModelType = reflectType + + // Get all fields + for i := 0; i < reflectType.NumField(); i++ { + if fieldStruct := reflectType.Field(i); ast.IsExported(fieldStruct.Name) { + field := &StructField{ + Struct: fieldStruct, + Name: fieldStruct.Name, + Names: []string{fieldStruct.Name}, + Tag: fieldStruct.Tag, + TagSettings: parseTagSetting(fieldStruct.Tag), + } + + // is ignored field + if _, ok := field.TagSettingsGet("-"); ok { + field.IsIgnored = true + } else { + if _, ok := field.TagSettingsGet("PRIMARY_KEY"); ok { + field.IsPrimaryKey = true + modelStruct.PrimaryFields = append(modelStruct.PrimaryFields, field) + } + + if _, ok := field.TagSettingsGet("DEFAULT"); ok { + field.HasDefaultValue = true + } + + if _, ok := field.TagSettingsGet("AUTO_INCREMENT"); ok && !field.IsPrimaryKey { + field.HasDefaultValue = true + } + + indirectType := fieldStruct.Type + for indirectType.Kind() == reflect.Ptr { + indirectType = indirectType.Elem() + } + + fieldValue := reflect.New(indirectType).Interface() + if _, isScanner := fieldValue.(sql.Scanner); isScanner { + // is scanner + field.IsScanner, field.IsNormal = true, true + if indirectType.Kind() == reflect.Struct { + for i := 0; i < indirectType.NumField(); i++ { + for key, value := range parseTagSetting(indirectType.Field(i).Tag) { + if _, ok := field.TagSettingsGet(key); !ok { + field.TagSettingsSet(key, value) + } + } + } + } + } else if _, isTime := fieldValue.(*time.Time); isTime { + // is time + field.IsNormal = true + } else if _, ok := field.TagSettingsGet("EMBEDDED"); ok || fieldStruct.Anonymous { + // is embedded struct + for _, subField := range scope.New(fieldValue).GetModelStruct().StructFields { + subField = subField.clone() + subField.Names = append([]string{fieldStruct.Name}, subField.Names...) + if prefix, ok := field.TagSettingsGet("EMBEDDED_PREFIX"); ok { + subField.DBName = prefix + subField.DBName + } + + if subField.IsPrimaryKey { + if _, ok := subField.TagSettingsGet("PRIMARY_KEY"); ok { + modelStruct.PrimaryFields = append(modelStruct.PrimaryFields, subField) + } else { + subField.IsPrimaryKey = false + } + } + + if subField.Relationship != nil && subField.Relationship.JoinTableHandler != nil { + if joinTableHandler, ok := subField.Relationship.JoinTableHandler.(*JoinTableHandler); ok { + newJoinTableHandler := &JoinTableHandler{} + newJoinTableHandler.Setup(subField.Relationship, joinTableHandler.TableName, reflectType, joinTableHandler.Destination.ModelType) + subField.Relationship.JoinTableHandler = newJoinTableHandler + } + } + + modelStruct.StructFields = append(modelStruct.StructFields, subField) + } + continue + } else { + // build relationships + switch indirectType.Kind() { + case reflect.Slice: + defer func(field *StructField) { + var ( + relationship = &Relationship{} + toScope = scope.New(reflect.New(field.Struct.Type).Interface()) + foreignKeys []string + associationForeignKeys []string + elemType = field.Struct.Type + ) + + if foreignKey, _ := field.TagSettingsGet("FOREIGNKEY"); foreignKey != "" { + foreignKeys = strings.Split(foreignKey, ",") + } + + if foreignKey, _ := field.TagSettingsGet("ASSOCIATION_FOREIGNKEY"); foreignKey != "" { + associationForeignKeys = strings.Split(foreignKey, ",") + } else if foreignKey, _ := field.TagSettingsGet("ASSOCIATIONFOREIGNKEY"); foreignKey != "" { + associationForeignKeys = strings.Split(foreignKey, ",") + } + + for elemType.Kind() == reflect.Slice || elemType.Kind() == reflect.Ptr { + elemType = elemType.Elem() + } + + if elemType.Kind() == reflect.Struct { + if many2many, _ := field.TagSettingsGet("MANY2MANY"); many2many != "" { + relationship.Kind = "many_to_many" + + { // Foreign Keys for Source + joinTableDBNames := []string{} + + if foreignKey, _ := field.TagSettingsGet("JOINTABLE_FOREIGNKEY"); foreignKey != "" { + joinTableDBNames = strings.Split(foreignKey, ",") + } + + // if no foreign keys defined with tag + if len(foreignKeys) == 0 { + for _, field := range modelStruct.PrimaryFields { + foreignKeys = append(foreignKeys, field.DBName) + } + } + + for idx, foreignKey := range foreignKeys { + if foreignField := getForeignField(foreignKey, modelStruct.StructFields); foreignField != nil { + // source foreign keys (db names) + relationship.ForeignFieldNames = append(relationship.ForeignFieldNames, foreignField.DBName) + + // setup join table foreign keys for source + if len(joinTableDBNames) > idx { + // if defined join table's foreign key + relationship.ForeignDBNames = append(relationship.ForeignDBNames, joinTableDBNames[idx]) + } else { + defaultJointableForeignKey := ToColumnName(reflectType.Name()) + "_" + foreignField.DBName + relationship.ForeignDBNames = append(relationship.ForeignDBNames, defaultJointableForeignKey) + } + } + } + } + + { // Foreign Keys for Association (Destination) + associationJoinTableDBNames := []string{} + + if foreignKey, _ := field.TagSettingsGet("ASSOCIATION_JOINTABLE_FOREIGNKEY"); foreignKey != "" { + associationJoinTableDBNames = strings.Split(foreignKey, ",") + } + + // if no association foreign keys defined with tag + if len(associationForeignKeys) == 0 { + for _, field := range toScope.PrimaryFields() { + associationForeignKeys = append(associationForeignKeys, field.DBName) + } + } + + for idx, name := range associationForeignKeys { + if field, ok := toScope.FieldByName(name); ok { + // association foreign keys (db names) + relationship.AssociationForeignFieldNames = append(relationship.AssociationForeignFieldNames, field.DBName) + + // setup join table foreign keys for association + if len(associationJoinTableDBNames) > idx { + relationship.AssociationForeignDBNames = append(relationship.AssociationForeignDBNames, associationJoinTableDBNames[idx]) + } else { + // join table foreign keys for association + joinTableDBName := ToColumnName(elemType.Name()) + "_" + field.DBName + relationship.AssociationForeignDBNames = append(relationship.AssociationForeignDBNames, joinTableDBName) + } + } + } + } + + joinTableHandler := JoinTableHandler{} + joinTableHandler.Setup(relationship, ToTableName(many2many), reflectType, elemType) + relationship.JoinTableHandler = &joinTableHandler + field.Relationship = relationship + } else { + // User has many comments, associationType is User, comment use UserID as foreign key + var associationType = reflectType.Name() + var toFields = toScope.GetStructFields() + relationship.Kind = "has_many" + + if polymorphic, _ := field.TagSettingsGet("POLYMORPHIC"); polymorphic != "" { + // Dog has many toys, tag polymorphic is Owner, then associationType is Owner + // Toy use OwnerID, OwnerType ('dogs') as foreign key + if polymorphicType := getForeignField(polymorphic+"Type", toFields); polymorphicType != nil { + associationType = polymorphic + relationship.PolymorphicType = polymorphicType.Name + relationship.PolymorphicDBName = polymorphicType.DBName + // if Dog has multiple set of toys set name of the set (instead of default 'dogs') + if value, ok := field.TagSettingsGet("POLYMORPHIC_VALUE"); ok { + relationship.PolymorphicValue = value + } else { + relationship.PolymorphicValue = scope.TableName() + } + polymorphicType.IsForeignKey = true + } + } + + // if no foreign keys defined with tag + if len(foreignKeys) == 0 { + // if no association foreign keys defined with tag + if len(associationForeignKeys) == 0 { + for _, field := range modelStruct.PrimaryFields { + foreignKeys = append(foreignKeys, associationType+field.Name) + associationForeignKeys = append(associationForeignKeys, field.Name) + } + } else { + // generate foreign keys from defined association foreign keys + for _, scopeFieldName := range associationForeignKeys { + if foreignField := getForeignField(scopeFieldName, modelStruct.StructFields); foreignField != nil { + foreignKeys = append(foreignKeys, associationType+foreignField.Name) + associationForeignKeys = append(associationForeignKeys, foreignField.Name) + } + } + } + } else { + // generate association foreign keys from foreign keys + if len(associationForeignKeys) == 0 { + for _, foreignKey := range foreignKeys { + if strings.HasPrefix(foreignKey, associationType) { + associationForeignKey := strings.TrimPrefix(foreignKey, associationType) + if foreignField := getForeignField(associationForeignKey, modelStruct.StructFields); foreignField != nil { + associationForeignKeys = append(associationForeignKeys, associationForeignKey) + } + } + } + if len(associationForeignKeys) == 0 && len(foreignKeys) == 1 { + associationForeignKeys = []string{scope.PrimaryKey()} + } + } else if len(foreignKeys) != len(associationForeignKeys) { + scope.Err(errors.New("invalid foreign keys, should have same length")) + return + } + } + + for idx, foreignKey := range foreignKeys { + if foreignField := getForeignField(foreignKey, toFields); foreignField != nil { + if associationField := getForeignField(associationForeignKeys[idx], modelStruct.StructFields); associationField != nil { + // source foreign keys + foreignField.IsForeignKey = true + relationship.AssociationForeignFieldNames = append(relationship.AssociationForeignFieldNames, associationField.Name) + relationship.AssociationForeignDBNames = append(relationship.AssociationForeignDBNames, associationField.DBName) + + // association foreign keys + relationship.ForeignFieldNames = append(relationship.ForeignFieldNames, foreignField.Name) + relationship.ForeignDBNames = append(relationship.ForeignDBNames, foreignField.DBName) + } + } + } + + if len(relationship.ForeignFieldNames) != 0 { + field.Relationship = relationship + } + } + } else { + field.IsNormal = true + } + }(field) + case reflect.Struct: + defer func(field *StructField) { + var ( + // user has one profile, associationType is User, profile use UserID as foreign key + // user belongs to profile, associationType is Profile, user use ProfileID as foreign key + associationType = reflectType.Name() + relationship = &Relationship{} + toScope = scope.New(reflect.New(field.Struct.Type).Interface()) + toFields = toScope.GetStructFields() + tagForeignKeys []string + tagAssociationForeignKeys []string + ) + + if foreignKey, _ := field.TagSettingsGet("FOREIGNKEY"); foreignKey != "" { + tagForeignKeys = strings.Split(foreignKey, ",") + } + + if foreignKey, _ := field.TagSettingsGet("ASSOCIATION_FOREIGNKEY"); foreignKey != "" { + tagAssociationForeignKeys = strings.Split(foreignKey, ",") + } else if foreignKey, _ := field.TagSettingsGet("ASSOCIATIONFOREIGNKEY"); foreignKey != "" { + tagAssociationForeignKeys = strings.Split(foreignKey, ",") + } + + if polymorphic, _ := field.TagSettingsGet("POLYMORPHIC"); polymorphic != "" { + // Cat has one toy, tag polymorphic is Owner, then associationType is Owner + // Toy use OwnerID, OwnerType ('cats') as foreign key + if polymorphicType := getForeignField(polymorphic+"Type", toFields); polymorphicType != nil { + associationType = polymorphic + relationship.PolymorphicType = polymorphicType.Name + relationship.PolymorphicDBName = polymorphicType.DBName + // if Cat has several different types of toys set name for each (instead of default 'cats') + if value, ok := field.TagSettingsGet("POLYMORPHIC_VALUE"); ok { + relationship.PolymorphicValue = value + } else { + relationship.PolymorphicValue = scope.TableName() + } + polymorphicType.IsForeignKey = true + } + } + + // Has One + { + var foreignKeys = tagForeignKeys + var associationForeignKeys = tagAssociationForeignKeys + // if no foreign keys defined with tag + if len(foreignKeys) == 0 { + // if no association foreign keys defined with tag + if len(associationForeignKeys) == 0 { + for _, primaryField := range modelStruct.PrimaryFields { + foreignKeys = append(foreignKeys, associationType+primaryField.Name) + associationForeignKeys = append(associationForeignKeys, primaryField.Name) + } + } else { + // generate foreign keys form association foreign keys + for _, associationForeignKey := range tagAssociationForeignKeys { + if foreignField := getForeignField(associationForeignKey, modelStruct.StructFields); foreignField != nil { + foreignKeys = append(foreignKeys, associationType+foreignField.Name) + associationForeignKeys = append(associationForeignKeys, foreignField.Name) + } + } + } + } else { + // generate association foreign keys from foreign keys + if len(associationForeignKeys) == 0 { + for _, foreignKey := range foreignKeys { + if strings.HasPrefix(foreignKey, associationType) { + associationForeignKey := strings.TrimPrefix(foreignKey, associationType) + if foreignField := getForeignField(associationForeignKey, modelStruct.StructFields); foreignField != nil { + associationForeignKeys = append(associationForeignKeys, associationForeignKey) + } + } + } + if len(associationForeignKeys) == 0 && len(foreignKeys) == 1 { + associationForeignKeys = []string{scope.PrimaryKey()} + } + } else if len(foreignKeys) != len(associationForeignKeys) { + scope.Err(errors.New("invalid foreign keys, should have same length")) + return + } + } + + for idx, foreignKey := range foreignKeys { + if foreignField := getForeignField(foreignKey, toFields); foreignField != nil { + if scopeField := getForeignField(associationForeignKeys[idx], modelStruct.StructFields); scopeField != nil { + foreignField.IsForeignKey = true + // source foreign keys + relationship.AssociationForeignFieldNames = append(relationship.AssociationForeignFieldNames, scopeField.Name) + relationship.AssociationForeignDBNames = append(relationship.AssociationForeignDBNames, scopeField.DBName) + + // association foreign keys + relationship.ForeignFieldNames = append(relationship.ForeignFieldNames, foreignField.Name) + relationship.ForeignDBNames = append(relationship.ForeignDBNames, foreignField.DBName) + } + } + } + } + + if len(relationship.ForeignFieldNames) != 0 { + relationship.Kind = "has_one" + field.Relationship = relationship + } else { + var foreignKeys = tagForeignKeys + var associationForeignKeys = tagAssociationForeignKeys + + if len(foreignKeys) == 0 { + // generate foreign keys & association foreign keys + if len(associationForeignKeys) == 0 { + for _, primaryField := range toScope.PrimaryFields() { + foreignKeys = append(foreignKeys, field.Name+primaryField.Name) + associationForeignKeys = append(associationForeignKeys, primaryField.Name) + } + } else { + // generate foreign keys with association foreign keys + for _, associationForeignKey := range associationForeignKeys { + if foreignField := getForeignField(associationForeignKey, toFields); foreignField != nil { + foreignKeys = append(foreignKeys, field.Name+foreignField.Name) + associationForeignKeys = append(associationForeignKeys, foreignField.Name) + } + } + } + } else { + // generate foreign keys & association foreign keys + if len(associationForeignKeys) == 0 { + for _, foreignKey := range foreignKeys { + if strings.HasPrefix(foreignKey, field.Name) { + associationForeignKey := strings.TrimPrefix(foreignKey, field.Name) + if foreignField := getForeignField(associationForeignKey, toFields); foreignField != nil { + associationForeignKeys = append(associationForeignKeys, associationForeignKey) + } + } + } + if len(associationForeignKeys) == 0 && len(foreignKeys) == 1 { + associationForeignKeys = []string{toScope.PrimaryKey()} + } + } else if len(foreignKeys) != len(associationForeignKeys) { + scope.Err(errors.New("invalid foreign keys, should have same length")) + return + } + } + + for idx, foreignKey := range foreignKeys { + if foreignField := getForeignField(foreignKey, modelStruct.StructFields); foreignField != nil { + if associationField := getForeignField(associationForeignKeys[idx], toFields); associationField != nil { + foreignField.IsForeignKey = true + + // association foreign keys + relationship.AssociationForeignFieldNames = append(relationship.AssociationForeignFieldNames, associationField.Name) + relationship.AssociationForeignDBNames = append(relationship.AssociationForeignDBNames, associationField.DBName) + + // source foreign keys + relationship.ForeignFieldNames = append(relationship.ForeignFieldNames, foreignField.Name) + relationship.ForeignDBNames = append(relationship.ForeignDBNames, foreignField.DBName) + } + } + } + + if len(relationship.ForeignFieldNames) != 0 { + relationship.Kind = "belongs_to" + field.Relationship = relationship + } + } + }(field) + default: + field.IsNormal = true + } + } + } + + // Even it is ignored, also possible to decode db value into the field + if value, ok := field.TagSettingsGet("COLUMN"); ok { + field.DBName = value + } else { + field.DBName = ToColumnName(fieldStruct.Name) + } + + modelStruct.StructFields = append(modelStruct.StructFields, field) + } + } + + if len(modelStruct.PrimaryFields) == 0 { + if field := getForeignField("id", modelStruct.StructFields); field != nil { + field.IsPrimaryKey = true + modelStruct.PrimaryFields = append(modelStruct.PrimaryFields, field) + } + } + + modelStructsMap.Store(reflectType, &modelStruct) + + return &modelStruct +} + +// GetStructFields get model's field structs +func (scope *Scope) GetStructFields() (fields []*StructField) { + return scope.GetModelStruct().StructFields +} + +func parseTagSetting(tags reflect.StructTag) map[string]string { + setting := map[string]string{} + for _, str := range []string{tags.Get("sql"), tags.Get("gorm")} { + tags := strings.Split(str, ";") + for _, value := range tags { + v := strings.Split(value, ":") + k := strings.TrimSpace(strings.ToUpper(v[0])) + if len(v) >= 2 { + setting[k] = strings.Join(v[1:], ":") + } else { + setting[k] = k + } + } + } + return setting +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/naming.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/naming.go new file mode 100644 index 0000000000000000000000000000000000000000..6b0a4fddbc15ee55ceadddc1adc860c13da4effb --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/naming.go @@ -0,0 +1,124 @@ +package gorm + +import ( + "bytes" + "strings" +) + +// Namer is a function type which is given a string and return a string +type Namer func(string) string + +// NamingStrategy represents naming strategies +type NamingStrategy struct { + DB Namer + Table Namer + Column Namer +} + +// TheNamingStrategy is being initialized with defaultNamingStrategy +var TheNamingStrategy = &NamingStrategy{ + DB: defaultNamer, + Table: defaultNamer, + Column: defaultNamer, +} + +// AddNamingStrategy sets the naming strategy +func AddNamingStrategy(ns *NamingStrategy) { + if ns.DB == nil { + ns.DB = defaultNamer + } + if ns.Table == nil { + ns.Table = defaultNamer + } + if ns.Column == nil { + ns.Column = defaultNamer + } + TheNamingStrategy = ns +} + +// DBName alters the given name by DB +func (ns *NamingStrategy) DBName(name string) string { + return ns.DB(name) +} + +// TableName alters the given name by Table +func (ns *NamingStrategy) TableName(name string) string { + return ns.Table(name) +} + +// ColumnName alters the given name by Column +func (ns *NamingStrategy) ColumnName(name string) string { + return ns.Column(name) +} + +// ToDBName convert string to db name +func ToDBName(name string) string { + return TheNamingStrategy.DBName(name) +} + +// ToTableName convert string to table name +func ToTableName(name string) string { + return TheNamingStrategy.TableName(name) +} + +// ToColumnName convert string to db name +func ToColumnName(name string) string { + return TheNamingStrategy.ColumnName(name) +} + +var smap = newSafeMap() + +func defaultNamer(name string) string { + const ( + lower = false + upper = true + ) + + if v := smap.Get(name); v != "" { + return v + } + + if name == "" { + return "" + } + + var ( + value = commonInitialismsReplacer.Replace(name) + buf = bytes.NewBufferString("") + lastCase, currCase, nextCase, nextNumber bool + ) + + for i, v := range value[:len(value)-1] { + nextCase = bool(value[i+1] >= 'A' && value[i+1] <= 'Z') + nextNumber = bool(value[i+1] >= '0' && value[i+1] <= '9') + + if i > 0 { + if currCase == upper { + if lastCase == upper && (nextCase == upper || nextNumber == upper) { + buf.WriteRune(v) + } else { + if value[i-1] != '_' && value[i+1] != '_' { + buf.WriteRune('_') + } + buf.WriteRune(v) + } + } else { + buf.WriteRune(v) + if i == len(value)-2 && (nextCase == upper && nextNumber == lower) { + buf.WriteRune('_') + } + } + } else { + currCase = upper + buf.WriteRune(v) + } + lastCase = currCase + currCase = nextCase + } + + buf.WriteByte(value[len(value)-1]) + + s := strings.ToLower(buf.String()) + smap.Set(name, s) + return s +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/scope.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/scope.go new file mode 100644 index 0000000000000000000000000000000000000000..378025bd8dc169484f5e43a791aebdb8e6342d27 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/scope.go @@ -0,0 +1,1397 @@ +package gorm + +import ( + "bytes" + "database/sql" + "database/sql/driver" + "errors" + "fmt" + "reflect" + "regexp" + "strings" + "time" +) + +// Scope contain current operation's information when you perform any operation on the database +type Scope struct { + Search *search + Value interface{} + SQL string + SQLVars []interface{} + db *DB + instanceID string + primaryKeyField *Field + skipLeft bool + fields *[]*Field + selectAttrs *[]string +} + +// IndirectValue return scope's reflect value's indirect value +func (scope *Scope) IndirectValue() reflect.Value { + return indirect(reflect.ValueOf(scope.Value)) +} + +// New create a new Scope without search information +func (scope *Scope) New(value interface{}) *Scope { + return &Scope{db: scope.NewDB(), Search: &search{}, Value: value} +} + +//////////////////////////////////////////////////////////////////////////////// +// Scope DB +//////////////////////////////////////////////////////////////////////////////// + +// DB return scope's DB connection +func (scope *Scope) DB() *DB { + return scope.db +} + +// NewDB create a new DB without search information +func (scope *Scope) NewDB() *DB { + if scope.db != nil { + db := scope.db.clone() + db.search = nil + db.Value = nil + return db + } + return nil +} + +// SQLDB return *sql.DB +func (scope *Scope) SQLDB() SQLCommon { + return scope.db.db +} + +// Dialect get dialect +func (scope *Scope) Dialect() Dialect { + return scope.db.dialect +} + +// Quote used to quote string to escape them for database +func (scope *Scope) Quote(str string) string { + if strings.Index(str, ".") != -1 { + newStrs := []string{} + for _, str := range strings.Split(str, ".") { + newStrs = append(newStrs, scope.Dialect().Quote(str)) + } + return strings.Join(newStrs, ".") + } + + return scope.Dialect().Quote(str) +} + +// Err add error to Scope +func (scope *Scope) Err(err error) error { + if err != nil { + scope.db.AddError(err) + } + return err +} + +// HasError check if there are any error +func (scope *Scope) HasError() bool { + return scope.db.Error != nil +} + +// Log print log message +func (scope *Scope) Log(v ...interface{}) { + scope.db.log(v...) +} + +// SkipLeft skip remaining callbacks +func (scope *Scope) SkipLeft() { + scope.skipLeft = true +} + +// Fields get value's fields +func (scope *Scope) Fields() []*Field { + if scope.fields == nil { + var ( + fields []*Field + indirectScopeValue = scope.IndirectValue() + isStruct = indirectScopeValue.Kind() == reflect.Struct + ) + + for _, structField := range scope.GetModelStruct().StructFields { + if isStruct { + fieldValue := indirectScopeValue + for _, name := range structField.Names { + if fieldValue.Kind() == reflect.Ptr && fieldValue.IsNil() { + fieldValue.Set(reflect.New(fieldValue.Type().Elem())) + } + fieldValue = reflect.Indirect(fieldValue).FieldByName(name) + } + fields = append(fields, &Field{StructField: structField, Field: fieldValue, IsBlank: isBlank(fieldValue)}) + } else { + fields = append(fields, &Field{StructField: structField, IsBlank: true}) + } + } + scope.fields = &fields + } + + return *scope.fields +} + +// FieldByName find `gorm.Field` with field name or db name +func (scope *Scope) FieldByName(name string) (field *Field, ok bool) { + var ( + dbName = ToColumnName(name) + mostMatchedField *Field + ) + + for _, field := range scope.Fields() { + if field.Name == name || field.DBName == name { + return field, true + } + if field.DBName == dbName { + mostMatchedField = field + } + } + return mostMatchedField, mostMatchedField != nil +} + +// PrimaryFields return scope's primary fields +func (scope *Scope) PrimaryFields() (fields []*Field) { + for _, field := range scope.Fields() { + if field.IsPrimaryKey { + fields = append(fields, field) + } + } + return fields +} + +// PrimaryField return scope's main primary field, if defined more that one primary fields, will return the one having column name `id` or the first one +func (scope *Scope) PrimaryField() *Field { + if primaryFields := scope.GetModelStruct().PrimaryFields; len(primaryFields) > 0 { + if len(primaryFields) > 1 { + if field, ok := scope.FieldByName("id"); ok { + return field + } + } + return scope.PrimaryFields()[0] + } + return nil +} + +// PrimaryKey get main primary field's db name +func (scope *Scope) PrimaryKey() string { + if field := scope.PrimaryField(); field != nil { + return field.DBName + } + return "" +} + +// PrimaryKeyZero check main primary field's value is blank or not +func (scope *Scope) PrimaryKeyZero() bool { + field := scope.PrimaryField() + return field == nil || field.IsBlank +} + +// PrimaryKeyValue get the primary key's value +func (scope *Scope) PrimaryKeyValue() interface{} { + if field := scope.PrimaryField(); field != nil && field.Field.IsValid() { + return field.Field.Interface() + } + return 0 +} + +// HasColumn to check if has column +func (scope *Scope) HasColumn(column string) bool { + for _, field := range scope.GetStructFields() { + if field.IsNormal && (field.Name == column || field.DBName == column) { + return true + } + } + return false +} + +// SetColumn to set the column's value, column could be field or field's name/dbname +func (scope *Scope) SetColumn(column interface{}, value interface{}) error { + var updateAttrs = map[string]interface{}{} + if attrs, ok := scope.InstanceGet("gorm:update_attrs"); ok { + updateAttrs = attrs.(map[string]interface{}) + defer scope.InstanceSet("gorm:update_attrs", updateAttrs) + } + + if field, ok := column.(*Field); ok { + updateAttrs[field.DBName] = value + return field.Set(value) + } else if name, ok := column.(string); ok { + var ( + dbName = ToDBName(name) + mostMatchedField *Field + ) + for _, field := range scope.Fields() { + if field.DBName == value { + updateAttrs[field.DBName] = value + return field.Set(value) + } + if (field.DBName == dbName) || (field.Name == name && mostMatchedField == nil) { + mostMatchedField = field + } + } + + if mostMatchedField != nil { + updateAttrs[mostMatchedField.DBName] = value + return mostMatchedField.Set(value) + } + } + return errors.New("could not convert column to field") +} + +// CallMethod call scope value's method, if it is a slice, will call its element's method one by one +func (scope *Scope) CallMethod(methodName string) { + if scope.Value == nil { + return + } + + if indirectScopeValue := scope.IndirectValue(); indirectScopeValue.Kind() == reflect.Slice { + for i := 0; i < indirectScopeValue.Len(); i++ { + scope.callMethod(methodName, indirectScopeValue.Index(i)) + } + } else { + scope.callMethod(methodName, indirectScopeValue) + } +} + +// AddToVars add value as sql's vars, used to prevent SQL injection +func (scope *Scope) AddToVars(value interface{}) string { + _, skipBindVar := scope.InstanceGet("skip_bindvar") + + if expr, ok := value.(*expr); ok { + exp := expr.expr + for _, arg := range expr.args { + if skipBindVar { + scope.AddToVars(arg) + } else { + exp = strings.Replace(exp, "?", scope.AddToVars(arg), 1) + } + } + return exp + } + + scope.SQLVars = append(scope.SQLVars, value) + + if skipBindVar { + return "?" + } + return scope.Dialect().BindVar(len(scope.SQLVars)) +} + +// SelectAttrs return selected attributes +func (scope *Scope) SelectAttrs() []string { + if scope.selectAttrs == nil { + attrs := []string{} + for _, value := range scope.Search.selects { + if str, ok := value.(string); ok { + attrs = append(attrs, str) + } else if strs, ok := value.([]string); ok { + attrs = append(attrs, strs...) + } else if strs, ok := value.([]interface{}); ok { + for _, str := range strs { + attrs = append(attrs, fmt.Sprintf("%v", str)) + } + } + } + scope.selectAttrs = &attrs + } + return *scope.selectAttrs +} + +// OmitAttrs return omitted attributes +func (scope *Scope) OmitAttrs() []string { + return scope.Search.omits +} + +type tabler interface { + TableName() string +} + +type dbTabler interface { + TableName(*DB) string +} + +// TableName return table name +func (scope *Scope) TableName() string { + if scope.Search != nil && len(scope.Search.tableName) > 0 { + return scope.Search.tableName + } + + if tabler, ok := scope.Value.(tabler); ok { + return tabler.TableName() + } + + if tabler, ok := scope.Value.(dbTabler); ok { + return tabler.TableName(scope.db) + } + + return scope.GetModelStruct().TableName(scope.db.Model(scope.Value)) +} + +// QuotedTableName return quoted table name +func (scope *Scope) QuotedTableName() (name string) { + if scope.Search != nil && len(scope.Search.tableName) > 0 { + if strings.Index(scope.Search.tableName, " ") != -1 { + return scope.Search.tableName + } + return scope.Quote(scope.Search.tableName) + } + + return scope.Quote(scope.TableName()) +} + +// CombinedConditionSql return combined condition sql +func (scope *Scope) CombinedConditionSql() string { + joinSQL := scope.joinsSQL() + whereSQL := scope.whereSQL() + if scope.Search.raw { + whereSQL = strings.TrimSuffix(strings.TrimPrefix(whereSQL, "WHERE ("), ")") + } + return joinSQL + whereSQL + scope.groupSQL() + + scope.havingSQL() + scope.orderSQL() + scope.limitAndOffsetSQL() +} + +// Raw set raw sql +func (scope *Scope) Raw(sql string) *Scope { + scope.SQL = strings.Replace(sql, "$$$", "?", -1) + return scope +} + +// Exec perform generated SQL +func (scope *Scope) Exec() *Scope { + defer scope.trace(NowFunc()) + + if !scope.HasError() { + if result, err := scope.SQLDB().Exec(scope.SQL, scope.SQLVars...); scope.Err(err) == nil { + if count, err := result.RowsAffected(); scope.Err(err) == nil { + scope.db.RowsAffected = count + } + } + } + return scope +} + +// Set set value by name +func (scope *Scope) Set(name string, value interface{}) *Scope { + scope.db.InstantSet(name, value) + return scope +} + +// Get get setting by name +func (scope *Scope) Get(name string) (interface{}, bool) { + return scope.db.Get(name) +} + +// InstanceID get InstanceID for scope +func (scope *Scope) InstanceID() string { + if scope.instanceID == "" { + scope.instanceID = fmt.Sprintf("%v%v", &scope, &scope.db) + } + return scope.instanceID +} + +// InstanceSet set instance setting for current operation, but not for operations in callbacks, like saving associations callback +func (scope *Scope) InstanceSet(name string, value interface{}) *Scope { + return scope.Set(name+scope.InstanceID(), value) +} + +// InstanceGet get instance setting from current operation +func (scope *Scope) InstanceGet(name string) (interface{}, bool) { + return scope.Get(name + scope.InstanceID()) +} + +// Begin start a transaction +func (scope *Scope) Begin() *Scope { + if db, ok := scope.SQLDB().(sqlDb); ok { + if tx, err := db.Begin(); err == nil { + scope.db.db = interface{}(tx).(SQLCommon) + scope.InstanceSet("gorm:started_transaction", true) + } + } + return scope +} + +// CommitOrRollback commit current transaction if no error happened, otherwise will rollback it +func (scope *Scope) CommitOrRollback() *Scope { + if _, ok := scope.InstanceGet("gorm:started_transaction"); ok { + if db, ok := scope.db.db.(sqlTx); ok { + if scope.HasError() { + db.Rollback() + } else { + scope.Err(db.Commit()) + } + scope.db.db = scope.db.parent.db + } + } + return scope +} + +//////////////////////////////////////////////////////////////////////////////// +// Private Methods For *gorm.Scope +//////////////////////////////////////////////////////////////////////////////// + +func (scope *Scope) callMethod(methodName string, reflectValue reflect.Value) { + // Only get address from non-pointer + if reflectValue.CanAddr() && reflectValue.Kind() != reflect.Ptr { + reflectValue = reflectValue.Addr() + } + + if methodValue := reflectValue.MethodByName(methodName); methodValue.IsValid() { + switch method := methodValue.Interface().(type) { + case func(): + method() + case func(*Scope): + method(scope) + case func(*DB): + newDB := scope.NewDB() + method(newDB) + scope.Err(newDB.Error) + case func() error: + scope.Err(method()) + case func(*Scope) error: + scope.Err(method(scope)) + case func(*DB) error: + newDB := scope.NewDB() + scope.Err(method(newDB)) + scope.Err(newDB.Error) + default: + scope.Err(fmt.Errorf("unsupported function %v", methodName)) + } + } +} + +var ( + columnRegexp = regexp.MustCompile("^[a-zA-Z\\d]+(\\.[a-zA-Z\\d]+)*$") // only match string like `name`, `users.name` + isNumberRegexp = regexp.MustCompile("^\\s*\\d+\\s*$") // match if string is number + comparisonRegexp = regexp.MustCompile("(?i) (=|<>|(>|<)(=?)|LIKE|IS|IN) ") + countingQueryRegexp = regexp.MustCompile("(?i)^count(.+)$") +) + +func (scope *Scope) quoteIfPossible(str string) string { + if columnRegexp.MatchString(str) { + return scope.Quote(str) + } + return str +} + +func (scope *Scope) scan(rows *sql.Rows, columns []string, fields []*Field) { + var ( + ignored interface{} + values = make([]interface{}, len(columns)) + selectFields []*Field + selectedColumnsMap = map[string]int{} + resetFields = map[int]*Field{} + ) + + for index, column := range columns { + values[index] = &ignored + + selectFields = fields + offset := 0 + if idx, ok := selectedColumnsMap[column]; ok { + offset = idx + 1 + selectFields = selectFields[offset:] + } + + for fieldIndex, field := range selectFields { + if field.DBName == column { + if field.Field.Kind() == reflect.Ptr { + values[index] = field.Field.Addr().Interface() + } else { + reflectValue := reflect.New(reflect.PtrTo(field.Struct.Type)) + reflectValue.Elem().Set(field.Field.Addr()) + values[index] = reflectValue.Interface() + resetFields[index] = field + } + + selectedColumnsMap[column] = offset + fieldIndex + + if field.IsNormal { + break + } + } + } + } + + scope.Err(rows.Scan(values...)) + + for index, field := range resetFields { + if v := reflect.ValueOf(values[index]).Elem().Elem(); v.IsValid() { + field.Field.Set(v) + } + } +} + +func (scope *Scope) primaryCondition(value interface{}) string { + return fmt.Sprintf("(%v.%v = %v)", scope.QuotedTableName(), scope.Quote(scope.PrimaryKey()), value) +} + +func (scope *Scope) buildCondition(clause map[string]interface{}, include bool) (str string) { + var ( + quotedTableName = scope.QuotedTableName() + quotedPrimaryKey = scope.Quote(scope.PrimaryKey()) + equalSQL = "=" + inSQL = "IN" + ) + + // If building not conditions + if !include { + equalSQL = "<>" + inSQL = "NOT IN" + } + + switch value := clause["query"].(type) { + case sql.NullInt64: + return fmt.Sprintf("(%v.%v %s %v)", quotedTableName, quotedPrimaryKey, equalSQL, value.Int64) + case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: + return fmt.Sprintf("(%v.%v %s %v)", quotedTableName, quotedPrimaryKey, equalSQL, value) + case []int, []int8, []int16, []int32, []int64, []uint, []uint8, []uint16, []uint32, []uint64, []string, []interface{}: + if !include && reflect.ValueOf(value).Len() == 0 { + return + } + str = fmt.Sprintf("(%v.%v %s (?))", quotedTableName, quotedPrimaryKey, inSQL) + clause["args"] = []interface{}{value} + case string: + if isNumberRegexp.MatchString(value) { + return fmt.Sprintf("(%v.%v %s %v)", quotedTableName, quotedPrimaryKey, equalSQL, scope.AddToVars(value)) + } + + if value != "" { + if !include { + if comparisonRegexp.MatchString(value) { + str = fmt.Sprintf("NOT (%v)", value) + } else { + str = fmt.Sprintf("(%v.%v NOT IN (?))", quotedTableName, scope.Quote(value)) + } + } else { + str = fmt.Sprintf("(%v)", value) + } + } + case map[string]interface{}: + var sqls []string + for key, value := range value { + if value != nil { + sqls = append(sqls, fmt.Sprintf("(%v.%v %s %v)", quotedTableName, scope.Quote(key), equalSQL, scope.AddToVars(value))) + } else { + if !include { + sqls = append(sqls, fmt.Sprintf("(%v.%v IS NOT NULL)", quotedTableName, scope.Quote(key))) + } else { + sqls = append(sqls, fmt.Sprintf("(%v.%v IS NULL)", quotedTableName, scope.Quote(key))) + } + } + } + return strings.Join(sqls, " AND ") + case interface{}: + var sqls []string + newScope := scope.New(value) + + if len(newScope.Fields()) == 0 { + scope.Err(fmt.Errorf("invalid query condition: %v", value)) + return + } + scopeQuotedTableName := newScope.QuotedTableName() + for _, field := range newScope.Fields() { + if !field.IsIgnored && !field.IsBlank { + sqls = append(sqls, fmt.Sprintf("(%v.%v %s %v)", scopeQuotedTableName, scope.Quote(field.DBName), equalSQL, scope.AddToVars(field.Field.Interface()))) + } + } + return strings.Join(sqls, " AND ") + default: + scope.Err(fmt.Errorf("invalid query condition: %v", value)) + return + } + + replacements := []string{} + args := clause["args"].([]interface{}) + for _, arg := range args { + var err error + switch reflect.ValueOf(arg).Kind() { + case reflect.Slice: // For where("id in (?)", []int64{1,2}) + if scanner, ok := interface{}(arg).(driver.Valuer); ok { + arg, err = scanner.Value() + replacements = append(replacements, scope.AddToVars(arg)) + } else if b, ok := arg.([]byte); ok { + replacements = append(replacements, scope.AddToVars(b)) + } else if as, ok := arg.([][]interface{}); ok { + var tempMarks []string + for _, a := range as { + var arrayMarks []string + for _, v := range a { + arrayMarks = append(arrayMarks, scope.AddToVars(v)) + } + + if len(arrayMarks) > 0 { + tempMarks = append(tempMarks, fmt.Sprintf("(%v)", strings.Join(arrayMarks, ","))) + } + } + + if len(tempMarks) > 0 { + replacements = append(replacements, strings.Join(tempMarks, ",")) + } + } else if values := reflect.ValueOf(arg); values.Len() > 0 { + var tempMarks []string + for i := 0; i < values.Len(); i++ { + tempMarks = append(tempMarks, scope.AddToVars(values.Index(i).Interface())) + } + replacements = append(replacements, strings.Join(tempMarks, ",")) + } else { + replacements = append(replacements, scope.AddToVars(Expr("NULL"))) + } + default: + if valuer, ok := interface{}(arg).(driver.Valuer); ok { + arg, err = valuer.Value() + } + + replacements = append(replacements, scope.AddToVars(arg)) + } + + if err != nil { + scope.Err(err) + } + } + + buff := bytes.NewBuffer([]byte{}) + i := 0 + for _, s := range str { + if s == '?' && len(replacements) > i { + buff.WriteString(replacements[i]) + i++ + } else { + buff.WriteRune(s) + } + } + + str = buff.String() + + return +} + +func (scope *Scope) buildSelectQuery(clause map[string]interface{}) (str string) { + switch value := clause["query"].(type) { + case string: + str = value + case []string: + str = strings.Join(value, ", ") + } + + args := clause["args"].([]interface{}) + replacements := []string{} + for _, arg := range args { + switch reflect.ValueOf(arg).Kind() { + case reflect.Slice: + values := reflect.ValueOf(arg) + var tempMarks []string + for i := 0; i < values.Len(); i++ { + tempMarks = append(tempMarks, scope.AddToVars(values.Index(i).Interface())) + } + replacements = append(replacements, strings.Join(tempMarks, ",")) + default: + if valuer, ok := interface{}(arg).(driver.Valuer); ok { + arg, _ = valuer.Value() + } + replacements = append(replacements, scope.AddToVars(arg)) + } + } + + buff := bytes.NewBuffer([]byte{}) + i := 0 + for pos, char := range str { + if str[pos] == '?' { + buff.WriteString(replacements[i]) + i++ + } else { + buff.WriteRune(char) + } + } + + str = buff.String() + + return +} + +func (scope *Scope) whereSQL() (sql string) { + var ( + quotedTableName = scope.QuotedTableName() + deletedAtField, hasDeletedAtField = scope.FieldByName("DeletedAt") + primaryConditions, andConditions, orConditions []string + ) + + if !scope.Search.Unscoped && hasDeletedAtField { + sql := fmt.Sprintf("%v.%v IS NULL", quotedTableName, scope.Quote(deletedAtField.DBName)) + primaryConditions = append(primaryConditions, sql) + } + + if !scope.PrimaryKeyZero() { + for _, field := range scope.PrimaryFields() { + sql := fmt.Sprintf("%v.%v = %v", quotedTableName, scope.Quote(field.DBName), scope.AddToVars(field.Field.Interface())) + primaryConditions = append(primaryConditions, sql) + } + } + + for _, clause := range scope.Search.whereConditions { + if sql := scope.buildCondition(clause, true); sql != "" { + andConditions = append(andConditions, sql) + } + } + + for _, clause := range scope.Search.orConditions { + if sql := scope.buildCondition(clause, true); sql != "" { + orConditions = append(orConditions, sql) + } + } + + for _, clause := range scope.Search.notConditions { + if sql := scope.buildCondition(clause, false); sql != "" { + andConditions = append(andConditions, sql) + } + } + + orSQL := strings.Join(orConditions, " OR ") + combinedSQL := strings.Join(andConditions, " AND ") + if len(combinedSQL) > 0 { + if len(orSQL) > 0 { + combinedSQL = combinedSQL + " OR " + orSQL + } + } else { + combinedSQL = orSQL + } + + if len(primaryConditions) > 0 { + sql = "WHERE " + strings.Join(primaryConditions, " AND ") + if len(combinedSQL) > 0 { + sql = sql + " AND (" + combinedSQL + ")" + } + } else if len(combinedSQL) > 0 { + sql = "WHERE " + combinedSQL + } + return +} + +func (scope *Scope) selectSQL() string { + if len(scope.Search.selects) == 0 { + if len(scope.Search.joinConditions) > 0 { + return fmt.Sprintf("%v.*", scope.QuotedTableName()) + } + return "*" + } + return scope.buildSelectQuery(scope.Search.selects) +} + +func (scope *Scope) orderSQL() string { + if len(scope.Search.orders) == 0 || scope.Search.ignoreOrderQuery { + return "" + } + + var orders []string + for _, order := range scope.Search.orders { + if str, ok := order.(string); ok { + orders = append(orders, scope.quoteIfPossible(str)) + } else if expr, ok := order.(*expr); ok { + exp := expr.expr + for _, arg := range expr.args { + exp = strings.Replace(exp, "?", scope.AddToVars(arg), 1) + } + orders = append(orders, exp) + } + } + return " ORDER BY " + strings.Join(orders, ",") +} + +func (scope *Scope) limitAndOffsetSQL() string { + return scope.Dialect().LimitAndOffsetSQL(scope.Search.limit, scope.Search.offset) +} + +func (scope *Scope) groupSQL() string { + if len(scope.Search.group) == 0 { + return "" + } + return " GROUP BY " + scope.Search.group +} + +func (scope *Scope) havingSQL() string { + if len(scope.Search.havingConditions) == 0 { + return "" + } + + var andConditions []string + for _, clause := range scope.Search.havingConditions { + if sql := scope.buildCondition(clause, true); sql != "" { + andConditions = append(andConditions, sql) + } + } + + combinedSQL := strings.Join(andConditions, " AND ") + if len(combinedSQL) == 0 { + return "" + } + + return " HAVING " + combinedSQL +} + +func (scope *Scope) joinsSQL() string { + var joinConditions []string + for _, clause := range scope.Search.joinConditions { + if sql := scope.buildCondition(clause, true); sql != "" { + joinConditions = append(joinConditions, strings.TrimSuffix(strings.TrimPrefix(sql, "("), ")")) + } + } + + return strings.Join(joinConditions, " ") + " " +} + +func (scope *Scope) prepareQuerySQL() { + if scope.Search.raw { + scope.Raw(scope.CombinedConditionSql()) + } else { + scope.Raw(fmt.Sprintf("SELECT %v FROM %v %v", scope.selectSQL(), scope.QuotedTableName(), scope.CombinedConditionSql())) + } + return +} + +func (scope *Scope) inlineCondition(values ...interface{}) *Scope { + if len(values) > 0 { + scope.Search.Where(values[0], values[1:]...) + } + return scope +} + +func (scope *Scope) callCallbacks(funcs []*func(s *Scope)) *Scope { + defer func() { + if err := recover(); err != nil { + if db, ok := scope.db.db.(sqlTx); ok { + db.Rollback() + } + panic(err) + } + }() + for _, f := range funcs { + (*f)(scope) + if scope.skipLeft { + break + } + } + return scope +} + +func convertInterfaceToMap(values interface{}, withIgnoredField bool) map[string]interface{} { + var attrs = map[string]interface{}{} + + switch value := values.(type) { + case map[string]interface{}: + return value + case []interface{}: + for _, v := range value { + for key, value := range convertInterfaceToMap(v, withIgnoredField) { + attrs[key] = value + } + } + case interface{}: + reflectValue := reflect.ValueOf(values) + + switch reflectValue.Kind() { + case reflect.Map: + for _, key := range reflectValue.MapKeys() { + attrs[ToColumnName(key.Interface().(string))] = reflectValue.MapIndex(key).Interface() + } + default: + for _, field := range (&Scope{Value: values}).Fields() { + if !field.IsBlank && (withIgnoredField || !field.IsIgnored) { + attrs[field.DBName] = field.Field.Interface() + } + } + } + } + return attrs +} + +func (scope *Scope) updatedAttrsWithValues(value interface{}) (results map[string]interface{}, hasUpdate bool) { + if scope.IndirectValue().Kind() != reflect.Struct { + return convertInterfaceToMap(value, false), true + } + + results = map[string]interface{}{} + + for key, value := range convertInterfaceToMap(value, true) { + if field, ok := scope.FieldByName(key); ok && scope.changeableField(field) { + if _, ok := value.(*expr); ok { + hasUpdate = true + results[field.DBName] = value + } else { + err := field.Set(value) + if field.IsNormal && !field.IsIgnored { + hasUpdate = true + if err == ErrUnaddressable { + results[field.DBName] = value + } else { + results[field.DBName] = field.Field.Interface() + } + } + } + } + } + return +} + +func (scope *Scope) row() *sql.Row { + defer scope.trace(NowFunc()) + + result := &RowQueryResult{} + scope.InstanceSet("row_query_result", result) + scope.callCallbacks(scope.db.parent.callbacks.rowQueries) + + return result.Row +} + +func (scope *Scope) rows() (*sql.Rows, error) { + defer scope.trace(NowFunc()) + + result := &RowsQueryResult{} + scope.InstanceSet("row_query_result", result) + scope.callCallbacks(scope.db.parent.callbacks.rowQueries) + + return result.Rows, result.Error +} + +func (scope *Scope) initialize() *Scope { + for _, clause := range scope.Search.whereConditions { + scope.updatedAttrsWithValues(clause["query"]) + } + scope.updatedAttrsWithValues(scope.Search.initAttrs) + scope.updatedAttrsWithValues(scope.Search.assignAttrs) + return scope +} + +func (scope *Scope) isQueryForColumn(query interface{}, column string) bool { + queryStr := strings.ToLower(fmt.Sprint(query)) + if queryStr == column { + return true + } + + if strings.HasSuffix(queryStr, "as "+column) { + return true + } + + if strings.HasSuffix(queryStr, "as "+scope.Quote(column)) { + return true + } + + return false +} + +func (scope *Scope) pluck(column string, value interface{}) *Scope { + dest := reflect.Indirect(reflect.ValueOf(value)) + if dest.Kind() != reflect.Slice { + scope.Err(fmt.Errorf("results should be a slice, not %s", dest.Kind())) + return scope + } + + if query, ok := scope.Search.selects["query"]; !ok || !scope.isQueryForColumn(query, column) { + scope.Search.Select(column) + } + + rows, err := scope.rows() + if scope.Err(err) == nil { + defer rows.Close() + for rows.Next() { + elem := reflect.New(dest.Type().Elem()).Interface() + scope.Err(rows.Scan(elem)) + dest.Set(reflect.Append(dest, reflect.ValueOf(elem).Elem())) + } + + if err := rows.Err(); err != nil { + scope.Err(err) + } + } + return scope +} + +func (scope *Scope) count(value interface{}) *Scope { + if query, ok := scope.Search.selects["query"]; !ok || !countingQueryRegexp.MatchString(fmt.Sprint(query)) { + if len(scope.Search.group) != 0 { + scope.Search.Select("count(*) FROM ( SELECT count(*) as name ") + scope.Search.group += " ) AS count_table" + } else { + scope.Search.Select("count(*)") + } + } + scope.Search.ignoreOrderQuery = true + scope.Err(scope.row().Scan(value)) + return scope +} + +func (scope *Scope) typeName() string { + typ := scope.IndirectValue().Type() + + for typ.Kind() == reflect.Slice || typ.Kind() == reflect.Ptr { + typ = typ.Elem() + } + + return typ.Name() +} + +// trace print sql log +func (scope *Scope) trace(t time.Time) { + if len(scope.SQL) > 0 { + scope.db.slog(scope.SQL, t, scope.SQLVars...) + } +} + +func (scope *Scope) changeableField(field *Field) bool { + if selectAttrs := scope.SelectAttrs(); len(selectAttrs) > 0 { + for _, attr := range selectAttrs { + if field.Name == attr || field.DBName == attr { + return true + } + } + return false + } + + for _, attr := range scope.OmitAttrs() { + if field.Name == attr || field.DBName == attr { + return false + } + } + + return true +} + +func (scope *Scope) related(value interface{}, foreignKeys ...string) *Scope { + toScope := scope.db.NewScope(value) + tx := scope.db.Set("gorm:association:source", scope.Value) + + for _, foreignKey := range append(foreignKeys, toScope.typeName()+"Id", scope.typeName()+"Id") { + fromField, _ := scope.FieldByName(foreignKey) + toField, _ := toScope.FieldByName(foreignKey) + + if fromField != nil { + if relationship := fromField.Relationship; relationship != nil { + if relationship.Kind == "many_to_many" { + joinTableHandler := relationship.JoinTableHandler + scope.Err(joinTableHandler.JoinWith(joinTableHandler, tx, scope.Value).Find(value).Error) + } else if relationship.Kind == "belongs_to" { + for idx, foreignKey := range relationship.ForeignDBNames { + if field, ok := scope.FieldByName(foreignKey); ok { + tx = tx.Where(fmt.Sprintf("%v = ?", scope.Quote(relationship.AssociationForeignDBNames[idx])), field.Field.Interface()) + } + } + scope.Err(tx.Find(value).Error) + } else if relationship.Kind == "has_many" || relationship.Kind == "has_one" { + for idx, foreignKey := range relationship.ForeignDBNames { + if field, ok := scope.FieldByName(relationship.AssociationForeignDBNames[idx]); ok { + tx = tx.Where(fmt.Sprintf("%v = ?", scope.Quote(foreignKey)), field.Field.Interface()) + } + } + + if relationship.PolymorphicType != "" { + tx = tx.Where(fmt.Sprintf("%v = ?", scope.Quote(relationship.PolymorphicDBName)), relationship.PolymorphicValue) + } + scope.Err(tx.Find(value).Error) + } + } else { + sql := fmt.Sprintf("%v = ?", scope.Quote(toScope.PrimaryKey())) + scope.Err(tx.Where(sql, fromField.Field.Interface()).Find(value).Error) + } + return scope + } else if toField != nil { + sql := fmt.Sprintf("%v = ?", scope.Quote(toField.DBName)) + scope.Err(tx.Where(sql, scope.PrimaryKeyValue()).Find(value).Error) + return scope + } + } + + scope.Err(fmt.Errorf("invalid association %v", foreignKeys)) + return scope +} + +// getTableOptions return the table options string or an empty string if the table options does not exist +func (scope *Scope) getTableOptions() string { + tableOptions, ok := scope.Get("gorm:table_options") + if !ok { + return "" + } + return " " + tableOptions.(string) +} + +func (scope *Scope) createJoinTable(field *StructField) { + if relationship := field.Relationship; relationship != nil && relationship.JoinTableHandler != nil { + joinTableHandler := relationship.JoinTableHandler + joinTable := joinTableHandler.Table(scope.db) + if !scope.Dialect().HasTable(joinTable) { + toScope := &Scope{Value: reflect.New(field.Struct.Type).Interface()} + + var sqlTypes, primaryKeys []string + for idx, fieldName := range relationship.ForeignFieldNames { + if field, ok := scope.FieldByName(fieldName); ok { + foreignKeyStruct := field.clone() + foreignKeyStruct.IsPrimaryKey = false + foreignKeyStruct.TagSettingsSet("IS_JOINTABLE_FOREIGNKEY", "true") + foreignKeyStruct.TagSettingsDelete("AUTO_INCREMENT") + sqlTypes = append(sqlTypes, scope.Quote(relationship.ForeignDBNames[idx])+" "+scope.Dialect().DataTypeOf(foreignKeyStruct)) + primaryKeys = append(primaryKeys, scope.Quote(relationship.ForeignDBNames[idx])) + } + } + + for idx, fieldName := range relationship.AssociationForeignFieldNames { + if field, ok := toScope.FieldByName(fieldName); ok { + foreignKeyStruct := field.clone() + foreignKeyStruct.IsPrimaryKey = false + foreignKeyStruct.TagSettingsSet("IS_JOINTABLE_FOREIGNKEY", "true") + foreignKeyStruct.TagSettingsDelete("AUTO_INCREMENT") + sqlTypes = append(sqlTypes, scope.Quote(relationship.AssociationForeignDBNames[idx])+" "+scope.Dialect().DataTypeOf(foreignKeyStruct)) + primaryKeys = append(primaryKeys, scope.Quote(relationship.AssociationForeignDBNames[idx])) + } + } + + scope.Err(scope.NewDB().Exec(fmt.Sprintf("CREATE TABLE %v (%v, PRIMARY KEY (%v))%s", scope.Quote(joinTable), strings.Join(sqlTypes, ","), strings.Join(primaryKeys, ","), scope.getTableOptions())).Error) + } + scope.NewDB().Table(joinTable).AutoMigrate(joinTableHandler) + } +} + +func (scope *Scope) createTable() *Scope { + var tags []string + var primaryKeys []string + var primaryKeyInColumnType = false + for _, field := range scope.GetModelStruct().StructFields { + if field.IsNormal { + sqlTag := scope.Dialect().DataTypeOf(field) + + // Check if the primary key constraint was specified as + // part of the column type. If so, we can only support + // one column as the primary key. + if strings.Contains(strings.ToLower(sqlTag), "primary key") { + primaryKeyInColumnType = true + } + + tags = append(tags, scope.Quote(field.DBName)+" "+sqlTag) + } + + if field.IsPrimaryKey { + primaryKeys = append(primaryKeys, scope.Quote(field.DBName)) + } + scope.createJoinTable(field) + } + + var primaryKeyStr string + if len(primaryKeys) > 0 && !primaryKeyInColumnType { + primaryKeyStr = fmt.Sprintf(", PRIMARY KEY (%v)", strings.Join(primaryKeys, ",")) + } + + scope.Raw(fmt.Sprintf("CREATE TABLE %v (%v %v)%s", scope.QuotedTableName(), strings.Join(tags, ","), primaryKeyStr, scope.getTableOptions())).Exec() + + scope.autoIndex() + return scope +} + +func (scope *Scope) dropTable() *Scope { + scope.Raw(fmt.Sprintf("DROP TABLE %v%s", scope.QuotedTableName(), scope.getTableOptions())).Exec() + return scope +} + +func (scope *Scope) modifyColumn(column string, typ string) { + scope.db.AddError(scope.Dialect().ModifyColumn(scope.QuotedTableName(), scope.Quote(column), typ)) +} + +func (scope *Scope) dropColumn(column string) { + scope.Raw(fmt.Sprintf("ALTER TABLE %v DROP COLUMN %v", scope.QuotedTableName(), scope.Quote(column))).Exec() +} + +func (scope *Scope) addIndex(unique bool, indexName string, column ...string) { + if scope.Dialect().HasIndex(scope.TableName(), indexName) { + return + } + + var columns []string + for _, name := range column { + columns = append(columns, scope.quoteIfPossible(name)) + } + + sqlCreate := "CREATE INDEX" + if unique { + sqlCreate = "CREATE UNIQUE INDEX" + } + + scope.Raw(fmt.Sprintf("%s %v ON %v(%v) %v", sqlCreate, indexName, scope.QuotedTableName(), strings.Join(columns, ", "), scope.whereSQL())).Exec() +} + +func (scope *Scope) addForeignKey(field string, dest string, onDelete string, onUpdate string) { + // Compatible with old generated key + keyName := scope.Dialect().BuildKeyName(scope.TableName(), field, dest, "foreign") + + if scope.Dialect().HasForeignKey(scope.TableName(), keyName) { + return + } + var query = `ALTER TABLE %s ADD CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s ON DELETE %s ON UPDATE %s;` + scope.Raw(fmt.Sprintf(query, scope.QuotedTableName(), scope.quoteIfPossible(keyName), scope.quoteIfPossible(field), dest, onDelete, onUpdate)).Exec() +} + +func (scope *Scope) removeForeignKey(field string, dest string) { + keyName := scope.Dialect().BuildKeyName(scope.TableName(), field, dest, "foreign") + if !scope.Dialect().HasForeignKey(scope.TableName(), keyName) { + return + } + var mysql mysql + var query string + if scope.Dialect().GetName() == mysql.GetName() { + query = `ALTER TABLE %s DROP FOREIGN KEY %s;` + } else { + query = `ALTER TABLE %s DROP CONSTRAINT %s;` + } + + scope.Raw(fmt.Sprintf(query, scope.QuotedTableName(), scope.quoteIfPossible(keyName))).Exec() +} + +func (scope *Scope) removeIndex(indexName string) { + scope.Dialect().RemoveIndex(scope.TableName(), indexName) +} + +func (scope *Scope) autoMigrate() *Scope { + tableName := scope.TableName() + quotedTableName := scope.QuotedTableName() + + if !scope.Dialect().HasTable(tableName) { + scope.createTable() + } else { + for _, field := range scope.GetModelStruct().StructFields { + if !scope.Dialect().HasColumn(tableName, field.DBName) { + if field.IsNormal { + sqlTag := scope.Dialect().DataTypeOf(field) + scope.Raw(fmt.Sprintf("ALTER TABLE %v ADD %v %v;", quotedTableName, scope.Quote(field.DBName), sqlTag)).Exec() + } + } + scope.createJoinTable(field) + } + scope.autoIndex() + } + return scope +} + +func (scope *Scope) autoIndex() *Scope { + var indexes = map[string][]string{} + var uniqueIndexes = map[string][]string{} + + for _, field := range scope.GetStructFields() { + if name, ok := field.TagSettingsGet("INDEX"); ok { + names := strings.Split(name, ",") + + for _, name := range names { + if name == "INDEX" || name == "" { + name = scope.Dialect().BuildKeyName("idx", scope.TableName(), field.DBName) + } + indexes[name] = append(indexes[name], field.DBName) + } + } + + if name, ok := field.TagSettingsGet("UNIQUE_INDEX"); ok { + names := strings.Split(name, ",") + + for _, name := range names { + if name == "UNIQUE_INDEX" || name == "" { + name = scope.Dialect().BuildKeyName("uix", scope.TableName(), field.DBName) + } + uniqueIndexes[name] = append(uniqueIndexes[name], field.DBName) + } + } + } + + for name, columns := range indexes { + if db := scope.NewDB().Table(scope.TableName()).Model(scope.Value).AddIndex(name, columns...); db.Error != nil { + scope.db.AddError(db.Error) + } + } + + for name, columns := range uniqueIndexes { + if db := scope.NewDB().Table(scope.TableName()).Model(scope.Value).AddUniqueIndex(name, columns...); db.Error != nil { + scope.db.AddError(db.Error) + } + } + + return scope +} + +func (scope *Scope) getColumnAsArray(columns []string, values ...interface{}) (results [][]interface{}) { + for _, value := range values { + indirectValue := indirect(reflect.ValueOf(value)) + + switch indirectValue.Kind() { + case reflect.Slice: + for i := 0; i < indirectValue.Len(); i++ { + var result []interface{} + var object = indirect(indirectValue.Index(i)) + var hasValue = false + for _, column := range columns { + field := object.FieldByName(column) + if hasValue || !isBlank(field) { + hasValue = true + } + result = append(result, field.Interface()) + } + + if hasValue { + results = append(results, result) + } + } + case reflect.Struct: + var result []interface{} + var hasValue = false + for _, column := range columns { + field := indirectValue.FieldByName(column) + if hasValue || !isBlank(field) { + hasValue = true + } + result = append(result, field.Interface()) + } + + if hasValue { + results = append(results, result) + } + } + } + + return +} + +func (scope *Scope) getColumnAsScope(column string) *Scope { + indirectScopeValue := scope.IndirectValue() + + switch indirectScopeValue.Kind() { + case reflect.Slice: + if fieldStruct, ok := scope.GetModelStruct().ModelType.FieldByName(column); ok { + fieldType := fieldStruct.Type + if fieldType.Kind() == reflect.Slice || fieldType.Kind() == reflect.Ptr { + fieldType = fieldType.Elem() + } + + resultsMap := map[interface{}]bool{} + results := reflect.New(reflect.SliceOf(reflect.PtrTo(fieldType))).Elem() + + for i := 0; i < indirectScopeValue.Len(); i++ { + result := indirect(indirect(indirectScopeValue.Index(i)).FieldByName(column)) + + if result.Kind() == reflect.Slice { + for j := 0; j < result.Len(); j++ { + if elem := result.Index(j); elem.CanAddr() && resultsMap[elem.Addr()] != true { + resultsMap[elem.Addr()] = true + results = reflect.Append(results, elem.Addr()) + } + } + } else if result.CanAddr() && resultsMap[result.Addr()] != true { + resultsMap[result.Addr()] = true + results = reflect.Append(results, result.Addr()) + } + } + return scope.New(results.Interface()) + } + case reflect.Struct: + if field := indirectScopeValue.FieldByName(column); field.CanAddr() { + return scope.New(field.Addr().Interface()) + } + } + return nil +} + +func (scope *Scope) hasConditions() bool { + return !scope.PrimaryKeyZero() || + len(scope.Search.whereConditions) > 0 || + len(scope.Search.orConditions) > 0 || + len(scope.Search.notConditions) > 0 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/search.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/search.go new file mode 100644 index 0000000000000000000000000000000000000000..9013859562ccfa6d51bc2ff45ff58df1d740d9ee --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/search.go @@ -0,0 +1,153 @@ +package gorm + +import ( + "fmt" +) + +type search struct { + db *DB + whereConditions []map[string]interface{} + orConditions []map[string]interface{} + notConditions []map[string]interface{} + havingConditions []map[string]interface{} + joinConditions []map[string]interface{} + initAttrs []interface{} + assignAttrs []interface{} + selects map[string]interface{} + omits []string + orders []interface{} + preload []searchPreload + offset interface{} + limit interface{} + group string + tableName string + raw bool + Unscoped bool + ignoreOrderQuery bool +} + +type searchPreload struct { + schema string + conditions []interface{} +} + +func (s *search) clone() *search { + clone := *s + return &clone +} + +func (s *search) Where(query interface{}, values ...interface{}) *search { + s.whereConditions = append(s.whereConditions, map[string]interface{}{"query": query, "args": values}) + return s +} + +func (s *search) Not(query interface{}, values ...interface{}) *search { + s.notConditions = append(s.notConditions, map[string]interface{}{"query": query, "args": values}) + return s +} + +func (s *search) Or(query interface{}, values ...interface{}) *search { + s.orConditions = append(s.orConditions, map[string]interface{}{"query": query, "args": values}) + return s +} + +func (s *search) Attrs(attrs ...interface{}) *search { + s.initAttrs = append(s.initAttrs, toSearchableMap(attrs...)) + return s +} + +func (s *search) Assign(attrs ...interface{}) *search { + s.assignAttrs = append(s.assignAttrs, toSearchableMap(attrs...)) + return s +} + +func (s *search) Order(value interface{}, reorder ...bool) *search { + if len(reorder) > 0 && reorder[0] { + s.orders = []interface{}{} + } + + if value != nil && value != "" { + s.orders = append(s.orders, value) + } + return s +} + +func (s *search) Select(query interface{}, args ...interface{}) *search { + s.selects = map[string]interface{}{"query": query, "args": args} + return s +} + +func (s *search) Omit(columns ...string) *search { + s.omits = columns + return s +} + +func (s *search) Limit(limit interface{}) *search { + s.limit = limit + return s +} + +func (s *search) Offset(offset interface{}) *search { + s.offset = offset + return s +} + +func (s *search) Group(query string) *search { + s.group = s.getInterfaceAsSQL(query) + return s +} + +func (s *search) Having(query interface{}, values ...interface{}) *search { + if val, ok := query.(*expr); ok { + s.havingConditions = append(s.havingConditions, map[string]interface{}{"query": val.expr, "args": val.args}) + } else { + s.havingConditions = append(s.havingConditions, map[string]interface{}{"query": query, "args": values}) + } + return s +} + +func (s *search) Joins(query string, values ...interface{}) *search { + s.joinConditions = append(s.joinConditions, map[string]interface{}{"query": query, "args": values}) + return s +} + +func (s *search) Preload(schema string, values ...interface{}) *search { + var preloads []searchPreload + for _, preload := range s.preload { + if preload.schema != schema { + preloads = append(preloads, preload) + } + } + preloads = append(preloads, searchPreload{schema, values}) + s.preload = preloads + return s +} + +func (s *search) Raw(b bool) *search { + s.raw = b + return s +} + +func (s *search) unscoped() *search { + s.Unscoped = true + return s +} + +func (s *search) Table(name string) *search { + s.tableName = name + return s +} + +func (s *search) getInterfaceAsSQL(value interface{}) (str string) { + switch value.(type) { + case string, int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: + str = fmt.Sprintf("%v", value) + default: + s.db.AddError(ErrInvalidSQL) + } + + if str == "-1" { + return "" + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/test_all.sh b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/test_all.sh new file mode 100644 index 0000000000000000000000000000000000000000..5cfb3321a2dd9a74f4e7d71449db87ddb1e28ba2 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/test_all.sh @@ -0,0 +1,5 @@ +dialects=("postgres" "mysql" "mssql" "sqlite") + +for dialect in "${dialects[@]}" ; do + DEBUG=false GORM_DIALECT=${dialect} go test +done diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/utils.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/utils.go new file mode 100644 index 0000000000000000000000000000000000000000..e58e57a56abd81ae17ea5dd86f68a8b278bc7c26 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/utils.go @@ -0,0 +1,226 @@ +package gorm + +import ( + "database/sql/driver" + "fmt" + "reflect" + "regexp" + "runtime" + "strings" + "sync" + "time" +) + +// NowFunc returns current time, this function is exported in order to be able +// to give the flexibility to the developer to customize it according to their +// needs, e.g: +// gorm.NowFunc = func() time.Time { +// return time.Now().UTC() +// } +var NowFunc = func() time.Time { + return time.Now() +} + +// Copied from golint +var commonInitialisms = []string{"API", "ASCII", "CPU", "CSS", "DNS", "EOF", "GUID", "HTML", "HTTP", "HTTPS", "ID", "IP", "JSON", "LHS", "QPS", "RAM", "RHS", "RPC", "SLA", "SMTP", "SSH", "TLS", "TTL", "UID", "UI", "UUID", "URI", "URL", "UTF8", "VM", "XML", "XSRF", "XSS"} +var commonInitialismsReplacer *strings.Replacer + +var goSrcRegexp = regexp.MustCompile(`jinzhu/gorm(@.*)?/.*.go`) +var goTestRegexp = regexp.MustCompile(`jinzhu/gorm(@.*)?/.*test.go`) + +func init() { + var commonInitialismsForReplacer []string + for _, initialism := range commonInitialisms { + commonInitialismsForReplacer = append(commonInitialismsForReplacer, initialism, strings.Title(strings.ToLower(initialism))) + } + commonInitialismsReplacer = strings.NewReplacer(commonInitialismsForReplacer...) +} + +type safeMap struct { + m map[string]string + l *sync.RWMutex +} + +func (s *safeMap) Set(key string, value string) { + s.l.Lock() + defer s.l.Unlock() + s.m[key] = value +} + +func (s *safeMap) Get(key string) string { + s.l.RLock() + defer s.l.RUnlock() + return s.m[key] +} + +func newSafeMap() *safeMap { + return &safeMap{l: new(sync.RWMutex), m: make(map[string]string)} +} + +// SQL expression +type expr struct { + expr string + args []interface{} +} + +// Expr generate raw SQL expression, for example: +// DB.Model(&product).Update("price", gorm.Expr("price * ? + ?", 2, 100)) +func Expr(expression string, args ...interface{}) *expr { + return &expr{expr: expression, args: args} +} + +func indirect(reflectValue reflect.Value) reflect.Value { + for reflectValue.Kind() == reflect.Ptr { + reflectValue = reflectValue.Elem() + } + return reflectValue +} + +func toQueryMarks(primaryValues [][]interface{}) string { + var results []string + + for _, primaryValue := range primaryValues { + var marks []string + for range primaryValue { + marks = append(marks, "?") + } + + if len(marks) > 1 { + results = append(results, fmt.Sprintf("(%v)", strings.Join(marks, ","))) + } else { + results = append(results, strings.Join(marks, "")) + } + } + return strings.Join(results, ",") +} + +func toQueryCondition(scope *Scope, columns []string) string { + var newColumns []string + for _, column := range columns { + newColumns = append(newColumns, scope.Quote(column)) + } + + if len(columns) > 1 { + return fmt.Sprintf("(%v)", strings.Join(newColumns, ",")) + } + return strings.Join(newColumns, ",") +} + +func toQueryValues(values [][]interface{}) (results []interface{}) { + for _, value := range values { + for _, v := range value { + results = append(results, v) + } + } + return +} + +func fileWithLineNum() string { + for i := 2; i < 15; i++ { + _, file, line, ok := runtime.Caller(i) + if ok && (!goSrcRegexp.MatchString(file) || goTestRegexp.MatchString(file)) { + return fmt.Sprintf("%v:%v", file, line) + } + } + return "" +} + +func isBlank(value reflect.Value) bool { + switch value.Kind() { + case reflect.String: + return value.Len() == 0 + case reflect.Bool: + return !value.Bool() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return value.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return value.Uint() == 0 + case reflect.Float32, reflect.Float64: + return value.Float() == 0 + case reflect.Interface, reflect.Ptr: + return value.IsNil() + } + + return reflect.DeepEqual(value.Interface(), reflect.Zero(value.Type()).Interface()) +} + +func toSearchableMap(attrs ...interface{}) (result interface{}) { + if len(attrs) > 1 { + if str, ok := attrs[0].(string); ok { + result = map[string]interface{}{str: attrs[1]} + } + } else if len(attrs) == 1 { + if attr, ok := attrs[0].(map[string]interface{}); ok { + result = attr + } + + if attr, ok := attrs[0].(interface{}); ok { + result = attr + } + } + return +} + +func equalAsString(a interface{}, b interface{}) bool { + return toString(a) == toString(b) +} + +func toString(str interface{}) string { + if values, ok := str.([]interface{}); ok { + var results []string + for _, value := range values { + results = append(results, toString(value)) + } + return strings.Join(results, "_") + } else if bytes, ok := str.([]byte); ok { + return string(bytes) + } else if reflectValue := reflect.Indirect(reflect.ValueOf(str)); reflectValue.IsValid() { + return fmt.Sprintf("%v", reflectValue.Interface()) + } + return "" +} + +func makeSlice(elemType reflect.Type) interface{} { + if elemType.Kind() == reflect.Slice { + elemType = elemType.Elem() + } + sliceType := reflect.SliceOf(elemType) + slice := reflect.New(sliceType) + slice.Elem().Set(reflect.MakeSlice(sliceType, 0, 0)) + return slice.Interface() +} + +func strInSlice(a string, list []string) bool { + for _, b := range list { + if b == a { + return true + } + } + return false +} + +// getValueFromFields return given fields's value +func getValueFromFields(value reflect.Value, fieldNames []string) (results []interface{}) { + // If value is a nil pointer, Indirect returns a zero Value! + // Therefor we need to check for a zero value, + // as FieldByName could panic + if indirectValue := reflect.Indirect(value); indirectValue.IsValid() { + for _, fieldName := range fieldNames { + if fieldValue := reflect.Indirect(indirectValue.FieldByName(fieldName)); fieldValue.IsValid() { + result := fieldValue.Interface() + if r, ok := result.(driver.Valuer); ok { + result, _ = r.Value() + } + results = append(results, result) + } + } + } + return +} + +func addExtraSpaceIfExist(str string) string { + if str != "" { + return " " + str + } + return "" +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/wercker.yml b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/wercker.yml new file mode 100644 index 0000000000000000000000000000000000000000..0c3e73ef1eccf1693ac11ada040447c11da320e4 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/gorm/wercker.yml @@ -0,0 +1,148 @@ +# use the default golang container from Docker Hub +box: golang + +services: + - name: mariadb + id: mariadb:latest + env: + MYSQL_DATABASE: gorm + MYSQL_USER: gorm + MYSQL_PASSWORD: gorm + MYSQL_RANDOM_ROOT_PASSWORD: "yes" + - name: mysql57 + id: mysql:5.7 + env: + MYSQL_DATABASE: gorm + MYSQL_USER: gorm + MYSQL_PASSWORD: gorm + MYSQL_RANDOM_ROOT_PASSWORD: "yes" + - name: mysql56 + id: mysql:5.6 + env: + MYSQL_DATABASE: gorm + MYSQL_USER: gorm + MYSQL_PASSWORD: gorm + MYSQL_RANDOM_ROOT_PASSWORD: "yes" + - name: mysql55 + id: mysql:5.5 + env: + MYSQL_DATABASE: gorm + MYSQL_USER: gorm + MYSQL_PASSWORD: gorm + MYSQL_RANDOM_ROOT_PASSWORD: "yes" + - name: postgres + id: postgres:latest + env: + POSTGRES_USER: gorm + POSTGRES_PASSWORD: gorm + POSTGRES_DB: gorm + - name: postgres96 + id: postgres:9.6 + env: + POSTGRES_USER: gorm + POSTGRES_PASSWORD: gorm + POSTGRES_DB: gorm + - name: postgres95 + id: postgres:9.5 + env: + POSTGRES_USER: gorm + POSTGRES_PASSWORD: gorm + POSTGRES_DB: gorm + - name: postgres94 + id: postgres:9.4 + env: + POSTGRES_USER: gorm + POSTGRES_PASSWORD: gorm + POSTGRES_DB: gorm + - name: postgres93 + id: postgres:9.3 + env: + POSTGRES_USER: gorm + POSTGRES_PASSWORD: gorm + POSTGRES_DB: gorm + - name: mssql + id: mcmoe/mssqldocker:latest + env: + ACCEPT_EULA: Y + SA_PASSWORD: LoremIpsum86 + MSSQL_DB: gorm + MSSQL_USER: gorm + MSSQL_PASSWORD: LoremIpsum86 + +# The steps that will be executed in the build pipeline +build: + # The steps that will be executed on build + steps: + # Sets the go workspace and places you package + # at the right place in the workspace tree + - setup-go-workspace + + # Gets the dependencies + - script: + name: go get + code: | + cd $WERCKER_SOURCE_DIR + go version + go get -t ./... + + # Build the project + - script: + name: go build + code: | + go build ./... + + # Test the project + - script: + name: test sqlite + code: | + go test ./... + + - script: + name: test mariadb + code: | + GORM_DIALECT=mysql GORM_DSN="gorm:gorm@tcp(mariadb:3306)/gorm?charset=utf8&parseTime=True" go test ./... + + - script: + name: test mysql5.7 + code: | + GORM_DIALECT=mysql GORM_DSN="gorm:gorm@tcp(mysql57:3306)/gorm?charset=utf8&parseTime=True" go test ./... + + - script: + name: test mysql5.6 + code: | + GORM_DIALECT=mysql GORM_DSN="gorm:gorm@tcp(mysql56:3306)/gorm?charset=utf8&parseTime=True" go test ./... + + - script: + name: test mysql5.5 + code: | + GORM_DIALECT=mysql GORM_DSN="gorm:gorm@tcp(mysql55:3306)/gorm?charset=utf8&parseTime=True" go test ./... + + - script: + name: test postgres + code: | + GORM_DIALECT=postgres GORM_DSN="host=postgres user=gorm password=gorm DB.name=gorm port=5432 sslmode=disable" go test ./... + + - script: + name: test postgres96 + code: | + GORM_DIALECT=postgres GORM_DSN="host=postgres96 user=gorm password=gorm DB.name=gorm port=5432 sslmode=disable" go test ./... + + - script: + name: test postgres95 + code: | + GORM_DIALECT=postgres GORM_DSN="host=postgres95 user=gorm password=gorm DB.name=gorm port=5432 sslmode=disable" go test ./... + + - script: + name: test postgres94 + code: | + GORM_DIALECT=postgres GORM_DSN="host=postgres94 user=gorm password=gorm DB.name=gorm port=5432 sslmode=disable" go test ./... + + - script: + name: test postgres93 + code: | + GORM_DIALECT=postgres GORM_DSN="host=postgres93 user=gorm password=gorm DB.name=gorm port=5432 sslmode=disable" go test ./... + + - script: + name: test mssql + code: | + GORM_DIALECT=mssql GORM_DSN="sqlserver://gorm:LoremIpsum86@mssql:1433?database=gorm" go test ./... diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/inflection/LICENSE b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/inflection/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..a1ca9a0ff9fe4a2bf4bdca7a799ae5e292fb4cd6 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/inflection/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 - Jinzhu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/inflection/README.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/inflection/README.md new file mode 100644 index 0000000000000000000000000000000000000000..a3de33614c9dde291cd4209109a4e9dfb40e317d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/inflection/README.md @@ -0,0 +1,55 @@ +# Inflection + +Inflection pluralizes and singularizes English nouns + +[![wercker status](https://app.wercker.com/status/f8c7432b097d1f4ce636879670be0930/s/master "wercker status")](https://app.wercker.com/project/byKey/f8c7432b097d1f4ce636879670be0930) + +## Basic Usage + +```go +inflection.Plural("person") => "people" +inflection.Plural("Person") => "People" +inflection.Plural("PERSON") => "PEOPLE" +inflection.Plural("bus") => "buses" +inflection.Plural("BUS") => "BUSES" +inflection.Plural("Bus") => "Buses" + +inflection.Singular("people") => "person" +inflection.Singular("People") => "Person" +inflection.Singular("PEOPLE") => "PERSON" +inflection.Singular("buses") => "bus" +inflection.Singular("BUSES") => "BUS" +inflection.Singular("Buses") => "Bus" + +inflection.Plural("FancyPerson") => "FancyPeople" +inflection.Singular("FancyPeople") => "FancyPerson" +``` + +## Register Rules + +Standard rules are from Rails's ActiveSupport (https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflections.rb) + +If you want to register more rules, follow: + +``` +inflection.AddUncountable("fish") +inflection.AddIrregular("person", "people") +inflection.AddPlural("(bu)s$", "${1}ses") # "bus" => "buses" / "BUS" => "BUSES" / "Bus" => "Buses" +inflection.AddSingular("(bus)(es)?$", "${1}") # "buses" => "bus" / "Buses" => "Bus" / "BUSES" => "BUS" +``` + +## Contributing + +You can help to make the project better, check out [http://gorm.io/contribute.html](http://gorm.io/contribute.html) for things you can do. + +## Author + +**jinzhu** + +* <http://github.com/jinzhu> +* <wosmvp@gmail.com> +* <http://twitter.com/zhangjinzhu> + +## License + +Released under the [MIT License](http://www.opensource.org/licenses/MIT). diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/inflection/inflections.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/inflection/inflections.go new file mode 100644 index 0000000000000000000000000000000000000000..606263bb750765a2a60c9b73e65d0f28b26ec594 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/inflection/inflections.go @@ -0,0 +1,273 @@ +/* +Package inflection pluralizes and singularizes English nouns. + + inflection.Plural("person") => "people" + inflection.Plural("Person") => "People" + inflection.Plural("PERSON") => "PEOPLE" + + inflection.Singular("people") => "person" + inflection.Singular("People") => "Person" + inflection.Singular("PEOPLE") => "PERSON" + + inflection.Plural("FancyPerson") => "FancydPeople" + inflection.Singular("FancyPeople") => "FancydPerson" + +Standard rules are from Rails's ActiveSupport (https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflections.rb) + +If you want to register more rules, follow: + + inflection.AddUncountable("fish") + inflection.AddIrregular("person", "people") + inflection.AddPlural("(bu)s$", "${1}ses") # "bus" => "buses" / "BUS" => "BUSES" / "Bus" => "Buses" + inflection.AddSingular("(bus)(es)?$", "${1}") # "buses" => "bus" / "Buses" => "Bus" / "BUSES" => "BUS" +*/ +package inflection + +import ( + "regexp" + "strings" +) + +type inflection struct { + regexp *regexp.Regexp + replace string +} + +// Regular is a regexp find replace inflection +type Regular struct { + find string + replace string +} + +// Irregular is a hard replace inflection, +// containing both singular and plural forms +type Irregular struct { + singular string + plural string +} + +// RegularSlice is a slice of Regular inflections +type RegularSlice []Regular + +// IrregularSlice is a slice of Irregular inflections +type IrregularSlice []Irregular + +var pluralInflections = RegularSlice{ + {"([a-z])$", "${1}s"}, + {"s$", "s"}, + {"^(ax|test)is$", "${1}es"}, + {"(octop|vir)us$", "${1}i"}, + {"(octop|vir)i$", "${1}i"}, + {"(alias|status)$", "${1}es"}, + {"(bu)s$", "${1}ses"}, + {"(buffal|tomat)o$", "${1}oes"}, + {"([ti])um$", "${1}a"}, + {"([ti])a$", "${1}a"}, + {"sis$", "ses"}, + {"(?:([^f])fe|([lr])f)$", "${1}${2}ves"}, + {"(hive)$", "${1}s"}, + {"([^aeiouy]|qu)y$", "${1}ies"}, + {"(x|ch|ss|sh)$", "${1}es"}, + {"(matr|vert|ind)(?:ix|ex)$", "${1}ices"}, + {"^(m|l)ouse$", "${1}ice"}, + {"^(m|l)ice$", "${1}ice"}, + {"^(ox)$", "${1}en"}, + {"^(oxen)$", "${1}"}, + {"(quiz)$", "${1}zes"}, +} + +var singularInflections = RegularSlice{ + {"s$", ""}, + {"(ss)$", "${1}"}, + {"(n)ews$", "${1}ews"}, + {"([ti])a$", "${1}um"}, + {"((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)(sis|ses)$", "${1}sis"}, + {"(^analy)(sis|ses)$", "${1}sis"}, + {"([^f])ves$", "${1}fe"}, + {"(hive)s$", "${1}"}, + {"(tive)s$", "${1}"}, + {"([lr])ves$", "${1}f"}, + {"([^aeiouy]|qu)ies$", "${1}y"}, + {"(s)eries$", "${1}eries"}, + {"(m)ovies$", "${1}ovie"}, + {"(c)ookies$", "${1}ookie"}, + {"(x|ch|ss|sh)es$", "${1}"}, + {"^(m|l)ice$", "${1}ouse"}, + {"(bus)(es)?$", "${1}"}, + {"(o)es$", "${1}"}, + {"(shoe)s$", "${1}"}, + {"(cris|test)(is|es)$", "${1}is"}, + {"^(a)x[ie]s$", "${1}xis"}, + {"(octop|vir)(us|i)$", "${1}us"}, + {"(alias|status)(es)?$", "${1}"}, + {"^(ox)en", "${1}"}, + {"(vert|ind)ices$", "${1}ex"}, + {"(matr)ices$", "${1}ix"}, + {"(quiz)zes$", "${1}"}, + {"(database)s$", "${1}"}, +} + +var irregularInflections = IrregularSlice{ + {"person", "people"}, + {"man", "men"}, + {"child", "children"}, + {"sex", "sexes"}, + {"move", "moves"}, + {"mombie", "mombies"}, +} + +var uncountableInflections = []string{"equipment", "information", "rice", "money", "species", "series", "fish", "sheep", "jeans", "police"} + +var compiledPluralMaps []inflection +var compiledSingularMaps []inflection + +func compile() { + compiledPluralMaps = []inflection{} + compiledSingularMaps = []inflection{} + for _, uncountable := range uncountableInflections { + inf := inflection{ + regexp: regexp.MustCompile("^(?i)(" + uncountable + ")$"), + replace: "${1}", + } + compiledPluralMaps = append(compiledPluralMaps, inf) + compiledSingularMaps = append(compiledSingularMaps, inf) + } + + for _, value := range irregularInflections { + infs := []inflection{ + inflection{regexp: regexp.MustCompile(strings.ToUpper(value.singular) + "$"), replace: strings.ToUpper(value.plural)}, + inflection{regexp: regexp.MustCompile(strings.Title(value.singular) + "$"), replace: strings.Title(value.plural)}, + inflection{regexp: regexp.MustCompile(value.singular + "$"), replace: value.plural}, + } + compiledPluralMaps = append(compiledPluralMaps, infs...) + } + + for _, value := range irregularInflections { + infs := []inflection{ + inflection{regexp: regexp.MustCompile(strings.ToUpper(value.plural) + "$"), replace: strings.ToUpper(value.singular)}, + inflection{regexp: regexp.MustCompile(strings.Title(value.plural) + "$"), replace: strings.Title(value.singular)}, + inflection{regexp: regexp.MustCompile(value.plural + "$"), replace: value.singular}, + } + compiledSingularMaps = append(compiledSingularMaps, infs...) + } + + for i := len(pluralInflections) - 1; i >= 0; i-- { + value := pluralInflections[i] + infs := []inflection{ + inflection{regexp: regexp.MustCompile(strings.ToUpper(value.find)), replace: strings.ToUpper(value.replace)}, + inflection{regexp: regexp.MustCompile(value.find), replace: value.replace}, + inflection{regexp: regexp.MustCompile("(?i)" + value.find), replace: value.replace}, + } + compiledPluralMaps = append(compiledPluralMaps, infs...) + } + + for i := len(singularInflections) - 1; i >= 0; i-- { + value := singularInflections[i] + infs := []inflection{ + inflection{regexp: regexp.MustCompile(strings.ToUpper(value.find)), replace: strings.ToUpper(value.replace)}, + inflection{regexp: regexp.MustCompile(value.find), replace: value.replace}, + inflection{regexp: regexp.MustCompile("(?i)" + value.find), replace: value.replace}, + } + compiledSingularMaps = append(compiledSingularMaps, infs...) + } +} + +func init() { + compile() +} + +// AddPlural adds a plural inflection +func AddPlural(find, replace string) { + pluralInflections = append(pluralInflections, Regular{find, replace}) + compile() +} + +// AddSingular adds a singular inflection +func AddSingular(find, replace string) { + singularInflections = append(singularInflections, Regular{find, replace}) + compile() +} + +// AddIrregular adds an irregular inflection +func AddIrregular(singular, plural string) { + irregularInflections = append(irregularInflections, Irregular{singular, plural}) + compile() +} + +// AddUncountable adds an uncountable inflection +func AddUncountable(values ...string) { + uncountableInflections = append(uncountableInflections, values...) + compile() +} + +// GetPlural retrieves the plural inflection values +func GetPlural() RegularSlice { + plurals := make(RegularSlice, len(pluralInflections)) + copy(plurals, pluralInflections) + return plurals +} + +// GetSingular retrieves the singular inflection values +func GetSingular() RegularSlice { + singulars := make(RegularSlice, len(singularInflections)) + copy(singulars, singularInflections) + return singulars +} + +// GetIrregular retrieves the irregular inflection values +func GetIrregular() IrregularSlice { + irregular := make(IrregularSlice, len(irregularInflections)) + copy(irregular, irregularInflections) + return irregular +} + +// GetUncountable retrieves the uncountable inflection values +func GetUncountable() []string { + uncountables := make([]string, len(uncountableInflections)) + copy(uncountables, uncountableInflections) + return uncountables +} + +// SetPlural sets the plural inflections slice +func SetPlural(inflections RegularSlice) { + pluralInflections = inflections + compile() +} + +// SetSingular sets the singular inflections slice +func SetSingular(inflections RegularSlice) { + singularInflections = inflections + compile() +} + +// SetIrregular sets the irregular inflections slice +func SetIrregular(inflections IrregularSlice) { + irregularInflections = inflections + compile() +} + +// SetUncountable sets the uncountable inflections slice +func SetUncountable(inflections []string) { + uncountableInflections = inflections + compile() +} + +// Plural converts a word to its plural form +func Plural(str string) string { + for _, inflection := range compiledPluralMaps { + if inflection.regexp.MatchString(str) { + return inflection.regexp.ReplaceAllString(str, inflection.replace) + } + } + return str +} + +// Singular converts a word to its singular form +func Singular(str string) string { + for _, inflection := range compiledSingularMaps { + if inflection.regexp.MatchString(str) { + return inflection.regexp.ReplaceAllString(str, inflection.replace) + } + } + return str +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/inflection/wercker.yml b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/inflection/wercker.yml new file mode 100644 index 0000000000000000000000000000000000000000..5e6ce981dc3848be7645b488d74ae56c20f9b00d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jinzhu/inflection/wercker.yml @@ -0,0 +1,23 @@ +box: golang + +build: + steps: + - setup-go-workspace + + # Gets the dependencies + - script: + name: go get + code: | + go get + + # Build the project + - script: + name: go build + code: | + go build ./... + + # Test the project + - script: + name: go test + code: | + go test ./... diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/LICENSE b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..9b4a822d92c5f558f8b40576d966a76fbec6fde3 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/LICENSE @@ -0,0 +1,18 @@ +Copyright (c) 2013, Space Monkey, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/README.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/README.md new file mode 100644 index 0000000000000000000000000000000000000000..4ebb692fb1899dac7bcf9aa41b5e4e4f3c9d73f6 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/README.md @@ -0,0 +1,89 @@ +gls +=== + +Goroutine local storage + +### IMPORTANT NOTE ### + +It is my duty to point you to https://blog.golang.org/context, which is how +Google solves all of the problems you'd perhaps consider using this package +for at scale. + +One downside to Google's approach is that *all* of your functions must have +a new first argument, but after clearing that hurdle everything else is much +better. + +If you aren't interested in this warning, read on. + +### Huhwaht? Why? ### + +Every so often, a thread shows up on the +[golang-nuts](https://groups.google.com/d/forum/golang-nuts) asking for some +form of goroutine-local-storage, or some kind of goroutine id, or some kind of +context. There are a few valid use cases for goroutine-local-storage, one of +the most prominent being log line context. One poster was interested in being +able to log an HTTP request context id in every log line in the same goroutine +as the incoming HTTP request, without having to change every library and +function call he was interested in logging. + +This would be pretty useful. Provided that you could get some kind of +goroutine-local-storage, you could call +[log.SetOutput](http://golang.org/pkg/log/#SetOutput) with your own logging +writer that checks goroutine-local-storage for some context information and +adds that context to your log lines. + +But alas, Andrew Gerrand's typically diplomatic answer to the question of +goroutine-local variables was: + +> We wouldn't even be having this discussion if thread local storage wasn't +> useful. But every feature comes at a cost, and in my opinion the cost of +> threadlocals far outweighs their benefits. They're just not a good fit for +> Go. + +So, yeah, that makes sense. That's a pretty good reason for why the language +won't support a specific and (relatively) unuseful feature that requires some +runtime changes, just for the sake of a little bit of log improvement. + +But does Go require runtime changes? + +### How it works ### + +Go has pretty fantastic introspective and reflective features, but one thing Go +doesn't give you is any kind of access to the stack pointer, or frame pointer, +or goroutine id, or anything contextual about your current stack. It gives you +access to your list of callers, but only along with program counters, which are +fixed at compile time. + +But it does give you the stack. + +So, we define 16 special functions and embed base-16 tags into the stack using +the call order of those 16 functions. Then, we can read our tags back out of +the stack looking at the callers list. + +We then use these tags as an index into a traditional map for implementing +this library. + +### What are people saying? ### + +"Wow, that's horrifying." + +"This is the most terrible thing I have seen in a very long time." + +"Where is it getting a context from? Is this serializing all the requests? +What the heck is the client being bound to? What are these tags? Why does he +need callers? Oh god no. No no no." + +### Docs ### + +Please see the docs at http://godoc.org/github.com/jtolds/gls + +### Related ### + +If you're okay relying on the string format of the current runtime stacktrace +including a unique goroutine id (not guaranteed by the spec or anything, but +very unlikely to change within a Go release), you might be able to squeeze +out a bit more performance by using this similar library, inspired by some +code Brad Fitzpatrick wrote for debugging his HTTP/2 library: +https://github.com/tylerb/gls (in contrast, jtolds/gls doesn't require +any knowledge of the string format of the runtime stacktrace, which +probably adds unnecessary overhead). diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/context.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/context.go new file mode 100644 index 0000000000000000000000000000000000000000..618a1710613359d217b9e9868bf43b0fa171e23a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/context.go @@ -0,0 +1,153 @@ +// Package gls implements goroutine-local storage. +package gls + +import ( + "sync" +) + +var ( + mgrRegistry = make(map[*ContextManager]bool) + mgrRegistryMtx sync.RWMutex +) + +// Values is simply a map of key types to value types. Used by SetValues to +// set multiple values at once. +type Values map[interface{}]interface{} + +// ContextManager is the main entrypoint for interacting with +// Goroutine-local-storage. You can have multiple independent ContextManagers +// at any given time. ContextManagers are usually declared globally for a given +// class of context variables. You should use NewContextManager for +// construction. +type ContextManager struct { + mtx sync.Mutex + values map[uint]Values +} + +// NewContextManager returns a brand new ContextManager. It also registers the +// new ContextManager in the ContextManager registry which is used by the Go +// method. ContextManagers are typically defined globally at package scope. +func NewContextManager() *ContextManager { + mgr := &ContextManager{values: make(map[uint]Values)} + mgrRegistryMtx.Lock() + defer mgrRegistryMtx.Unlock() + mgrRegistry[mgr] = true + return mgr +} + +// Unregister removes a ContextManager from the global registry, used by the +// Go method. Only intended for use when you're completely done with a +// ContextManager. Use of Unregister at all is rare. +func (m *ContextManager) Unregister() { + mgrRegistryMtx.Lock() + defer mgrRegistryMtx.Unlock() + delete(mgrRegistry, m) +} + +// SetValues takes a collection of values and a function to call for those +// values to be set in. Anything further down the stack will have the set +// values available through GetValue. SetValues will add new values or replace +// existing values of the same key and will not mutate or change values for +// previous stack frames. +// SetValues is slow (makes a copy of all current and new values for the new +// gls-context) in order to reduce the amount of lookups GetValue requires. +func (m *ContextManager) SetValues(new_values Values, context_call func()) { + if len(new_values) == 0 { + context_call() + return + } + + mutated_keys := make([]interface{}, 0, len(new_values)) + mutated_vals := make(Values, len(new_values)) + + EnsureGoroutineId(func(gid uint) { + m.mtx.Lock() + state, found := m.values[gid] + if !found { + state = make(Values, len(new_values)) + m.values[gid] = state + } + m.mtx.Unlock() + + for key, new_val := range new_values { + mutated_keys = append(mutated_keys, key) + if old_val, ok := state[key]; ok { + mutated_vals[key] = old_val + } + state[key] = new_val + } + + defer func() { + if !found { + m.mtx.Lock() + delete(m.values, gid) + m.mtx.Unlock() + return + } + + for _, key := range mutated_keys { + if val, ok := mutated_vals[key]; ok { + state[key] = val + } else { + delete(state, key) + } + } + }() + + context_call() + }) +} + +// GetValue will return a previously set value, provided that the value was set +// by SetValues somewhere higher up the stack. If the value is not found, ok +// will be false. +func (m *ContextManager) GetValue(key interface{}) ( + value interface{}, ok bool) { + gid, ok := GetGoroutineId() + if !ok { + return nil, false + } + + m.mtx.Lock() + state, found := m.values[gid] + m.mtx.Unlock() + + if !found { + return nil, false + } + value, ok = state[key] + return value, ok +} + +func (m *ContextManager) getValues() Values { + gid, ok := GetGoroutineId() + if !ok { + return nil + } + m.mtx.Lock() + state, _ := m.values[gid] + m.mtx.Unlock() + return state +} + +// Go preserves ContextManager values and Goroutine-local-storage across new +// goroutine invocations. The Go method makes a copy of all existing values on +// all registered context managers and makes sure they are still set after +// kicking off the provided function in a new goroutine. If you don't use this +// Go method instead of the standard 'go' keyword, you will lose values in +// ContextManagers, as goroutines have brand new stacks. +func Go(cb func()) { + mgrRegistryMtx.RLock() + defer mgrRegistryMtx.RUnlock() + + for mgr := range mgrRegistry { + values := mgr.getValues() + if len(values) > 0 { + cb = func(mgr *ContextManager, cb func()) func() { + return func() { mgr.SetValues(values, cb) } + }(mgr, cb) + } + } + + go cb() +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/gen_sym.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/gen_sym.go new file mode 100644 index 0000000000000000000000000000000000000000..7f615cce937dd51820d423a969f9589ad8926009 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/gen_sym.go @@ -0,0 +1,21 @@ +package gls + +import ( + "sync" +) + +var ( + keyMtx sync.Mutex + keyCounter uint64 +) + +// ContextKey is a throwaway value you can use as a key to a ContextManager +type ContextKey struct{ id uint64 } + +// GenSym will return a brand new, never-before-used ContextKey +func GenSym() ContextKey { + keyMtx.Lock() + defer keyMtx.Unlock() + keyCounter += 1 + return ContextKey{id: keyCounter} +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/gid.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/gid.go new file mode 100644 index 0000000000000000000000000000000000000000..c16bf3a554f9792c2ebe22244191ce8ada4aa5f6 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/gid.go @@ -0,0 +1,25 @@ +package gls + +var ( + stackTagPool = &idPool{} +) + +// Will return this goroutine's identifier if set. If you always need a +// goroutine identifier, you should use EnsureGoroutineId which will make one +// if there isn't one already. +func GetGoroutineId() (gid uint, ok bool) { + return readStackTag() +} + +// Will call cb with the current goroutine identifier. If one hasn't already +// been generated, one will be created and set first. The goroutine identifier +// might be invalid after cb returns. +func EnsureGoroutineId(cb func(gid uint)) { + if gid, ok := readStackTag(); ok { + cb(gid) + return + } + gid := stackTagPool.Acquire() + defer stackTagPool.Release(gid) + addStackTag(gid, func() { cb(gid) }) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/id_pool.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/id_pool.go new file mode 100644 index 0000000000000000000000000000000000000000..b7974ae0026e716047037e13ed4b5ccc25a6051a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/id_pool.go @@ -0,0 +1,34 @@ +package gls + +// though this could probably be better at keeping ids smaller, the goal of +// this class is to keep a registry of the smallest unique integer ids +// per-process possible + +import ( + "sync" +) + +type idPool struct { + mtx sync.Mutex + released []uint + max_id uint +} + +func (p *idPool) Acquire() (id uint) { + p.mtx.Lock() + defer p.mtx.Unlock() + if len(p.released) > 0 { + id = p.released[len(p.released)-1] + p.released = p.released[:len(p.released)-1] + return id + } + id = p.max_id + p.max_id++ + return id +} + +func (p *idPool) Release(id uint) { + p.mtx.Lock() + defer p.mtx.Unlock() + p.released = append(p.released, id) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/stack_tags.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/stack_tags.go new file mode 100644 index 0000000000000000000000000000000000000000..37bbd3347ad589b030ba1c31b874d45d9f82843e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/stack_tags.go @@ -0,0 +1,147 @@ +package gls + +// so, basically, we're going to encode integer tags in base-16 on the stack + +const ( + bitWidth = 4 + stackBatchSize = 16 +) + +var ( + pc_lookup = make(map[uintptr]int8, 17) + mark_lookup [16]func(uint, func()) +) + +func init() { + setEntries := func(f func(uint, func()), v int8) { + var ptr uintptr + f(0, func() { + ptr = findPtr() + }) + pc_lookup[ptr] = v + if v >= 0 { + mark_lookup[v] = f + } + } + setEntries(github_com_jtolds_gls_markS, -0x1) + setEntries(github_com_jtolds_gls_mark0, 0x0) + setEntries(github_com_jtolds_gls_mark1, 0x1) + setEntries(github_com_jtolds_gls_mark2, 0x2) + setEntries(github_com_jtolds_gls_mark3, 0x3) + setEntries(github_com_jtolds_gls_mark4, 0x4) + setEntries(github_com_jtolds_gls_mark5, 0x5) + setEntries(github_com_jtolds_gls_mark6, 0x6) + setEntries(github_com_jtolds_gls_mark7, 0x7) + setEntries(github_com_jtolds_gls_mark8, 0x8) + setEntries(github_com_jtolds_gls_mark9, 0x9) + setEntries(github_com_jtolds_gls_markA, 0xa) + setEntries(github_com_jtolds_gls_markB, 0xb) + setEntries(github_com_jtolds_gls_markC, 0xc) + setEntries(github_com_jtolds_gls_markD, 0xd) + setEntries(github_com_jtolds_gls_markE, 0xe) + setEntries(github_com_jtolds_gls_markF, 0xf) +} + +func addStackTag(tag uint, context_call func()) { + if context_call == nil { + return + } + github_com_jtolds_gls_markS(tag, context_call) +} + +// these private methods are named this horrendous name so gopherjs support +// is easier. it shouldn't add any runtime cost in non-js builds. + +//go:noinline +func github_com_jtolds_gls_markS(tag uint, cb func()) { _m(tag, cb) } + +//go:noinline +func github_com_jtolds_gls_mark0(tag uint, cb func()) { _m(tag, cb) } + +//go:noinline +func github_com_jtolds_gls_mark1(tag uint, cb func()) { _m(tag, cb) } + +//go:noinline +func github_com_jtolds_gls_mark2(tag uint, cb func()) { _m(tag, cb) } + +//go:noinline +func github_com_jtolds_gls_mark3(tag uint, cb func()) { _m(tag, cb) } + +//go:noinline +func github_com_jtolds_gls_mark4(tag uint, cb func()) { _m(tag, cb) } + +//go:noinline +func github_com_jtolds_gls_mark5(tag uint, cb func()) { _m(tag, cb) } + +//go:noinline +func github_com_jtolds_gls_mark6(tag uint, cb func()) { _m(tag, cb) } + +//go:noinline +func github_com_jtolds_gls_mark7(tag uint, cb func()) { _m(tag, cb) } + +//go:noinline +func github_com_jtolds_gls_mark8(tag uint, cb func()) { _m(tag, cb) } + +//go:noinline +func github_com_jtolds_gls_mark9(tag uint, cb func()) { _m(tag, cb) } + +//go:noinline +func github_com_jtolds_gls_markA(tag uint, cb func()) { _m(tag, cb) } + +//go:noinline +func github_com_jtolds_gls_markB(tag uint, cb func()) { _m(tag, cb) } + +//go:noinline +func github_com_jtolds_gls_markC(tag uint, cb func()) { _m(tag, cb) } + +//go:noinline +func github_com_jtolds_gls_markD(tag uint, cb func()) { _m(tag, cb) } + +//go:noinline +func github_com_jtolds_gls_markE(tag uint, cb func()) { _m(tag, cb) } + +//go:noinline +func github_com_jtolds_gls_markF(tag uint, cb func()) { _m(tag, cb) } + +func _m(tag_remainder uint, cb func()) { + if tag_remainder == 0 { + cb() + } else { + mark_lookup[tag_remainder&0xf](tag_remainder>>bitWidth, cb) + } +} + +func readStackTag() (tag uint, ok bool) { + var current_tag uint + offset := 0 + for { + batch, next_offset := getStack(offset, stackBatchSize) + for _, pc := range batch { + val, ok := pc_lookup[pc] + if !ok { + continue + } + if val < 0 { + return current_tag, true + } + current_tag <<= bitWidth + current_tag += uint(val) + } + if next_offset == 0 { + break + } + offset = next_offset + } + return 0, false +} + +func (m *ContextManager) preventInlining() { + // dunno if findPtr or getStack are likely to get inlined in a future release + // of go, but if they are inlined and their callers are inlined, that could + // hork some things. let's do our best to explain to the compiler that we + // really don't want those two functions inlined by saying they could change + // at any time. assumes preventInlining doesn't get compiled out. + // this whole thing is probably overkill. + findPtr = m.values[0][0].(func() uintptr) + getStack = m.values[0][1].(func(int, int) ([]uintptr, int)) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/stack_tags_js.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/stack_tags_js.go new file mode 100644 index 0000000000000000000000000000000000000000..c4e8b801d31d0fd5a43136165400765cf418c770 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/stack_tags_js.go @@ -0,0 +1,75 @@ +// +build js + +package gls + +// This file is used for GopherJS builds, which don't have normal runtime +// stack trace support + +import ( + "strconv" + "strings" + + "github.com/gopherjs/gopherjs/js" +) + +const ( + jsFuncNamePrefix = "github_com_jtolds_gls_mark" +) + +func jsMarkStack() (f []uintptr) { + lines := strings.Split( + js.Global.Get("Error").New().Get("stack").String(), "\n") + f = make([]uintptr, 0, len(lines)) + for i, line := range lines { + line = strings.TrimSpace(line) + if line == "" { + continue + } + if i == 0 { + if line != "Error" { + panic("didn't understand js stack trace") + } + continue + } + fields := strings.Fields(line) + if len(fields) < 2 || fields[0] != "at" { + panic("didn't understand js stack trace") + } + + pos := strings.Index(fields[1], jsFuncNamePrefix) + if pos < 0 { + continue + } + pos += len(jsFuncNamePrefix) + if pos >= len(fields[1]) { + panic("didn't understand js stack trace") + } + char := string(fields[1][pos]) + switch char { + case "S": + f = append(f, uintptr(0)) + default: + val, err := strconv.ParseUint(char, 16, 8) + if err != nil { + panic("didn't understand js stack trace") + } + f = append(f, uintptr(val)+1) + } + } + return f +} + +// variables to prevent inlining +var ( + findPtr = func() uintptr { + funcs := jsMarkStack() + if len(funcs) == 0 { + panic("failed to find function pointer") + } + return funcs[0] + } + + getStack = func(offset, amount int) (stack []uintptr, next_offset int) { + return jsMarkStack(), 0 + } +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/stack_tags_main.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/stack_tags_main.go new file mode 100644 index 0000000000000000000000000000000000000000..4da89e44f8e8da2d7bedfc79f6d260aad9daea0f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/jtolds/gls/stack_tags_main.go @@ -0,0 +1,30 @@ +// +build !js + +package gls + +// This file is used for standard Go builds, which have the expected runtime +// support + +import ( + "runtime" +) + +var ( + findPtr = func() uintptr { + var pc [1]uintptr + n := runtime.Callers(4, pc[:]) + if n != 1 { + panic("failed to find function pointer") + } + return pc[0] + } + + getStack = func(offset, amount int) (stack []uintptr, next_offset int) { + stack = make([]uintptr, amount) + stack = stack[:runtime.Callers(offset, stack)] + if len(stack) < amount { + return stack, 0 + } + return stack, offset + len(stack) + } +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/mitchellh/go-homedir/LICENSE b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/mitchellh/go-homedir/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..f9c841a51e0d11ec20c19ff7600e88da826867fa --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/mitchellh/go-homedir/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013 Mitchell Hashimoto + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/mitchellh/go-homedir/README.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/mitchellh/go-homedir/README.md new file mode 100644 index 0000000000000000000000000000000000000000..d70706d5b35b6f2b877a29a6244a52c9f1f45b33 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/mitchellh/go-homedir/README.md @@ -0,0 +1,14 @@ +# go-homedir + +This is a Go library for detecting the user's home directory without +the use of cgo, so the library can be used in cross-compilation environments. + +Usage is incredibly simple, just call `homedir.Dir()` to get the home directory +for a user, and `homedir.Expand()` to expand the `~` in a path to the home +directory. + +**Why not just use `os/user`?** The built-in `os/user` package requires +cgo on Darwin systems. This means that any Go code that uses that package +cannot cross compile. But 99% of the time the use for `os/user` is just to +retrieve the home directory, which we can do for the current user without +cgo. This library does that, enabling cross-compilation. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/mitchellh/go-homedir/go.mod b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/mitchellh/go-homedir/go.mod new file mode 100644 index 0000000000000000000000000000000000000000..7efa09a0432b27071fe18574811498ee84e7d17e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/mitchellh/go-homedir/go.mod @@ -0,0 +1 @@ +module github.com/mitchellh/go-homedir diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/mitchellh/go-homedir/homedir.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/mitchellh/go-homedir/homedir.go new file mode 100644 index 0000000000000000000000000000000000000000..fb87bef94f3f7d44d2505afbdfeaec168a25e860 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/mitchellh/go-homedir/homedir.go @@ -0,0 +1,157 @@ +package homedir + +import ( + "bytes" + "errors" + "os" + "os/exec" + "path/filepath" + "runtime" + "strconv" + "strings" + "sync" +) + +// DisableCache will disable caching of the home directory. Caching is enabled +// by default. +var DisableCache bool + +var homedirCache string +var cacheLock sync.RWMutex + +// Dir returns the home directory for the executing user. +// +// This uses an OS-specific method for discovering the home directory. +// An error is returned if a home directory cannot be detected. +func Dir() (string, error) { + if !DisableCache { + cacheLock.RLock() + cached := homedirCache + cacheLock.RUnlock() + if cached != "" { + return cached, nil + } + } + + cacheLock.Lock() + defer cacheLock.Unlock() + + var result string + var err error + if runtime.GOOS == "windows" { + result, err = dirWindows() + } else { + // Unix-like system, so just assume Unix + result, err = dirUnix() + } + + if err != nil { + return "", err + } + homedirCache = result + return result, nil +} + +// Expand expands the path to include the home directory if the path +// is prefixed with `~`. If it isn't prefixed with `~`, the path is +// returned as-is. +func Expand(path string) (string, error) { + if len(path) == 0 { + return path, nil + } + + if path[0] != '~' { + return path, nil + } + + if len(path) > 1 && path[1] != '/' && path[1] != '\\' { + return "", errors.New("cannot expand user-specific home dir") + } + + dir, err := Dir() + if err != nil { + return "", err + } + + return filepath.Join(dir, path[1:]), nil +} + +func dirUnix() (string, error) { + homeEnv := "HOME" + if runtime.GOOS == "plan9" { + // On plan9, env vars are lowercase. + homeEnv = "home" + } + + // First prefer the HOME environmental variable + if home := os.Getenv(homeEnv); home != "" { + return home, nil + } + + var stdout bytes.Buffer + + // If that fails, try OS specific commands + if runtime.GOOS == "darwin" { + cmd := exec.Command("sh", "-c", `dscl -q . -read /Users/"$(whoami)" NFSHomeDirectory | sed 's/^[^ ]*: //'`) + cmd.Stdout = &stdout + if err := cmd.Run(); err == nil { + result := strings.TrimSpace(stdout.String()) + if result != "" { + return result, nil + } + } + } else { + cmd := exec.Command("getent", "passwd", strconv.Itoa(os.Getuid())) + cmd.Stdout = &stdout + if err := cmd.Run(); err != nil { + // If the error is ErrNotFound, we ignore it. Otherwise, return it. + if err != exec.ErrNotFound { + return "", err + } + } else { + if passwd := strings.TrimSpace(stdout.String()); passwd != "" { + // username:password:uid:gid:gecos:home:shell + passwdParts := strings.SplitN(passwd, ":", 7) + if len(passwdParts) > 5 { + return passwdParts[5], nil + } + } + } + } + + // If all else fails, try the shell + stdout.Reset() + cmd := exec.Command("sh", "-c", "cd && pwd") + cmd.Stdout = &stdout + if err := cmd.Run(); err != nil { + return "", err + } + + result := strings.TrimSpace(stdout.String()) + if result == "" { + return "", errors.New("blank output when reading home directory") + } + + return result, nil +} + +func dirWindows() (string, error) { + // First prefer the HOME environmental variable + if home := os.Getenv("HOME"); home != "" { + return home, nil + } + + // Prefer standard environment variable USERPROFILE + if home := os.Getenv("USERPROFILE"); home != "" { + return home, nil + } + + drive := os.Getenv("HOMEDRIVE") + path := os.Getenv("HOMEPATH") + home := drive + path + if drive == "" || path == "" { + return "", errors.New("HOMEDRIVE, HOMEPATH, or USERPROFILE are blank") + } + + return home, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/satori/go.uuid/LICENSE b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/satori/go.uuid/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..926d5498702943ebb736819bb393159e5f84634b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/satori/go.uuid/LICENSE @@ -0,0 +1,20 @@ +Copyright (C) 2013-2018 by Maxim Bublis <b@codemonkey.ru> + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/satori/go.uuid/README.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/satori/go.uuid/README.md new file mode 100644 index 0000000000000000000000000000000000000000..362b270673ba6ba6c9de2ab05d7400b77127a18e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/satori/go.uuid/README.md @@ -0,0 +1,75 @@ +# UUID package for Go language + +[![Build Status](https://travis-ci.org/satori/go.uuid.svg?branch=master)](https://travis-ci.org/satori/go.uuid) +[![Coverage Status](https://coveralls.io/repos/github/satori/go.uuid/badge.svg?branch=master)](https://coveralls.io/github/satori/go.uuid) +[![GoDoc](http://godoc.org/github.com/satori/go.uuid?status.svg)](http://godoc.org/github.com/satori/go.uuid) + +This package provides pure Go implementation of Universally Unique Identifier (UUID). Supported both creation and parsing of UUIDs. + +With 100% test coverage and benchmarks out of box. + +Supported versions: +* Version 1, based on timestamp and MAC address (RFC 4122) +* Version 2, based on timestamp, MAC address and POSIX UID/GID (DCE 1.1) +* Version 3, based on MD5 hashing (RFC 4122) +* Version 4, based on random numbers (RFC 4122) +* Version 5, based on SHA-1 hashing (RFC 4122) + +## Installation + +Use the `go` command: + + $ go get github.com/satori/go.uuid + +## Requirements + +UUID package tested against Go >= 1.6. + +## Example + +```go +package main + +import ( + "fmt" + "github.com/satori/go.uuid" +) + +func main() { + // Creating UUID Version 4 + // panic on error + u1 := uuid.Must(uuid.NewV4()) + fmt.Printf("UUIDv4: %s\n", u1) + + // or error handling + u2, err := uuid.NewV4() + if err != nil { + fmt.Printf("Something went wrong: %s", err) + return + } + fmt.Printf("UUIDv4: %s\n", u2) + + // Parsing UUID from string input + u2, err := uuid.FromString("6ba7b810-9dad-11d1-80b4-00c04fd430c8") + if err != nil { + fmt.Printf("Something went wrong: %s", err) + return + } + fmt.Printf("Successfully parsed: %s", u2) +} +``` + +## Documentation + +[Documentation](http://godoc.org/github.com/satori/go.uuid) is hosted at GoDoc project. + +## Links +* [RFC 4122](http://tools.ietf.org/html/rfc4122) +* [DCE 1.1: Authentication and Security Services](http://pubs.opengroup.org/onlinepubs/9696989899/chap5.htm#tagcjh_08_02_01_01) + +## Copyright + +Copyright (C) 2013-2018 by Maxim Bublis <b@codemonkey.ru>. + +UUID package released under MIT License. +See [LICENSE](https://github.com/satori/go.uuid/blob/master/LICENSE) for details. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/satori/go.uuid/codec.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/satori/go.uuid/codec.go new file mode 100644 index 0000000000000000000000000000000000000000..656892c53e071eb7756f9c4d4f02f72ffa4cb608 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/satori/go.uuid/codec.go @@ -0,0 +1,206 @@ +// Copyright (C) 2013-2018 by Maxim Bublis <b@codemonkey.ru> +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +package uuid + +import ( + "bytes" + "encoding/hex" + "fmt" +) + +// FromBytes returns UUID converted from raw byte slice input. +// It will return error if the slice isn't 16 bytes long. +func FromBytes(input []byte) (u UUID, err error) { + err = u.UnmarshalBinary(input) + return +} + +// FromBytesOrNil returns UUID converted from raw byte slice input. +// Same behavior as FromBytes, but returns a Nil UUID on error. +func FromBytesOrNil(input []byte) UUID { + uuid, err := FromBytes(input) + if err != nil { + return Nil + } + return uuid +} + +// FromString returns UUID parsed from string input. +// Input is expected in a form accepted by UnmarshalText. +func FromString(input string) (u UUID, err error) { + err = u.UnmarshalText([]byte(input)) + return +} + +// FromStringOrNil returns UUID parsed from string input. +// Same behavior as FromString, but returns a Nil UUID on error. +func FromStringOrNil(input string) UUID { + uuid, err := FromString(input) + if err != nil { + return Nil + } + return uuid +} + +// MarshalText implements the encoding.TextMarshaler interface. +// The encoding is the same as returned by String. +func (u UUID) MarshalText() (text []byte, err error) { + text = []byte(u.String()) + return +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface. +// Following formats are supported: +// "6ba7b810-9dad-11d1-80b4-00c04fd430c8", +// "{6ba7b810-9dad-11d1-80b4-00c04fd430c8}", +// "urn:uuid:6ba7b810-9dad-11d1-80b4-00c04fd430c8" +// "6ba7b8109dad11d180b400c04fd430c8" +// ABNF for supported UUID text representation follows: +// uuid := canonical | hashlike | braced | urn +// plain := canonical | hashlike +// canonical := 4hexoct '-' 2hexoct '-' 2hexoct '-' 6hexoct +// hashlike := 12hexoct +// braced := '{' plain '}' +// urn := URN ':' UUID-NID ':' plain +// URN := 'urn' +// UUID-NID := 'uuid' +// 12hexoct := 6hexoct 6hexoct +// 6hexoct := 4hexoct 2hexoct +// 4hexoct := 2hexoct 2hexoct +// 2hexoct := hexoct hexoct +// hexoct := hexdig hexdig +// hexdig := '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | +// 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | +// 'A' | 'B' | 'C' | 'D' | 'E' | 'F' +func (u *UUID) UnmarshalText(text []byte) (err error) { + switch len(text) { + case 32: + return u.decodeHashLike(text) + case 36: + return u.decodeCanonical(text) + case 38: + return u.decodeBraced(text) + case 41: + fallthrough + case 45: + return u.decodeURN(text) + default: + return fmt.Errorf("uuid: incorrect UUID length: %s", text) + } +} + +// decodeCanonical decodes UUID string in format +// "6ba7b810-9dad-11d1-80b4-00c04fd430c8". +func (u *UUID) decodeCanonical(t []byte) (err error) { + if t[8] != '-' || t[13] != '-' || t[18] != '-' || t[23] != '-' { + return fmt.Errorf("uuid: incorrect UUID format %s", t) + } + + src := t[:] + dst := u[:] + + for i, byteGroup := range byteGroups { + if i > 0 { + src = src[1:] // skip dash + } + _, err = hex.Decode(dst[:byteGroup/2], src[:byteGroup]) + if err != nil { + return + } + src = src[byteGroup:] + dst = dst[byteGroup/2:] + } + + return +} + +// decodeHashLike decodes UUID string in format +// "6ba7b8109dad11d180b400c04fd430c8". +func (u *UUID) decodeHashLike(t []byte) (err error) { + src := t[:] + dst := u[:] + + if _, err = hex.Decode(dst, src); err != nil { + return err + } + return +} + +// decodeBraced decodes UUID string in format +// "{6ba7b810-9dad-11d1-80b4-00c04fd430c8}" or in format +// "{6ba7b8109dad11d180b400c04fd430c8}". +func (u *UUID) decodeBraced(t []byte) (err error) { + l := len(t) + + if t[0] != '{' || t[l-1] != '}' { + return fmt.Errorf("uuid: incorrect UUID format %s", t) + } + + return u.decodePlain(t[1 : l-1]) +} + +// decodeURN decodes UUID string in format +// "urn:uuid:6ba7b810-9dad-11d1-80b4-00c04fd430c8" or in format +// "urn:uuid:6ba7b8109dad11d180b400c04fd430c8". +func (u *UUID) decodeURN(t []byte) (err error) { + total := len(t) + + urn_uuid_prefix := t[:9] + + if !bytes.Equal(urn_uuid_prefix, urnPrefix) { + return fmt.Errorf("uuid: incorrect UUID format: %s", t) + } + + return u.decodePlain(t[9:total]) +} + +// decodePlain decodes UUID string in canonical format +// "6ba7b810-9dad-11d1-80b4-00c04fd430c8" or in hash-like format +// "6ba7b8109dad11d180b400c04fd430c8". +func (u *UUID) decodePlain(t []byte) (err error) { + switch len(t) { + case 32: + return u.decodeHashLike(t) + case 36: + return u.decodeCanonical(t) + default: + return fmt.Errorf("uuid: incorrrect UUID length: %s", t) + } +} + +// MarshalBinary implements the encoding.BinaryMarshaler interface. +func (u UUID) MarshalBinary() (data []byte, err error) { + data = u.Bytes() + return +} + +// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface. +// It will return error if the slice isn't 16 bytes long. +func (u *UUID) UnmarshalBinary(data []byte) (err error) { + if len(data) != Size { + err = fmt.Errorf("uuid: UUID must be exactly 16 bytes long, got %d bytes", len(data)) + return + } + copy(u[:], data) + + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/satori/go.uuid/generator.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/satori/go.uuid/generator.go new file mode 100644 index 0000000000000000000000000000000000000000..c50d33cab461abec8b9a437dc49c6bc72219dfb7 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/satori/go.uuid/generator.go @@ -0,0 +1,265 @@ +// Copyright (C) 2013-2018 by Maxim Bublis <b@codemonkey.ru> +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +package uuid + +import ( + "crypto/md5" + "crypto/rand" + "crypto/sha1" + "encoding/binary" + "fmt" + "hash" + "io" + "net" + "os" + "sync" + "time" +) + +// Difference in 100-nanosecond intervals between +// UUID epoch (October 15, 1582) and Unix epoch (January 1, 1970). +const epochStart = 122192928000000000 + +type epochFunc func() time.Time +type hwAddrFunc func() (net.HardwareAddr, error) + +var ( + global = newRFC4122Generator() + + posixUID = uint32(os.Getuid()) + posixGID = uint32(os.Getgid()) +) + +// NewV1 returns UUID based on current timestamp and MAC address. +func NewV1() (UUID, error) { + return global.NewV1() +} + +// NewV2 returns DCE Security UUID based on POSIX UID/GID. +func NewV2(domain byte) (UUID, error) { + return global.NewV2(domain) +} + +// NewV3 returns UUID based on MD5 hash of namespace UUID and name. +func NewV3(ns UUID, name string) UUID { + return global.NewV3(ns, name) +} + +// NewV4 returns random generated UUID. +func NewV4() (UUID, error) { + return global.NewV4() +} + +// NewV5 returns UUID based on SHA-1 hash of namespace UUID and name. +func NewV5(ns UUID, name string) UUID { + return global.NewV5(ns, name) +} + +// Generator provides interface for generating UUIDs. +type Generator interface { + NewV1() (UUID, error) + NewV2(domain byte) (UUID, error) + NewV3(ns UUID, name string) UUID + NewV4() (UUID, error) + NewV5(ns UUID, name string) UUID +} + +// Default generator implementation. +type rfc4122Generator struct { + clockSequenceOnce sync.Once + hardwareAddrOnce sync.Once + storageMutex sync.Mutex + + rand io.Reader + + epochFunc epochFunc + hwAddrFunc hwAddrFunc + lastTime uint64 + clockSequence uint16 + hardwareAddr [6]byte +} + +func newRFC4122Generator() Generator { + return &rfc4122Generator{ + epochFunc: time.Now, + hwAddrFunc: defaultHWAddrFunc, + rand: rand.Reader, + } +} + +// NewV1 returns UUID based on current timestamp and MAC address. +func (g *rfc4122Generator) NewV1() (UUID, error) { + u := UUID{} + + timeNow, clockSeq, err := g.getClockSequence() + if err != nil { + return Nil, err + } + binary.BigEndian.PutUint32(u[0:], uint32(timeNow)) + binary.BigEndian.PutUint16(u[4:], uint16(timeNow>>32)) + binary.BigEndian.PutUint16(u[6:], uint16(timeNow>>48)) + binary.BigEndian.PutUint16(u[8:], clockSeq) + + hardwareAddr, err := g.getHardwareAddr() + if err != nil { + return Nil, err + } + copy(u[10:], hardwareAddr) + + u.SetVersion(V1) + u.SetVariant(VariantRFC4122) + + return u, nil +} + +// NewV2 returns DCE Security UUID based on POSIX UID/GID. +func (g *rfc4122Generator) NewV2(domain byte) (UUID, error) { + u, err := g.NewV1() + if err != nil { + return Nil, err + } + + switch domain { + case DomainPerson: + binary.BigEndian.PutUint32(u[:], posixUID) + case DomainGroup: + binary.BigEndian.PutUint32(u[:], posixGID) + } + + u[9] = domain + + u.SetVersion(V2) + u.SetVariant(VariantRFC4122) + + return u, nil +} + +// NewV3 returns UUID based on MD5 hash of namespace UUID and name. +func (g *rfc4122Generator) NewV3(ns UUID, name string) UUID { + u := newFromHash(md5.New(), ns, name) + u.SetVersion(V3) + u.SetVariant(VariantRFC4122) + + return u +} + +// NewV4 returns random generated UUID. +func (g *rfc4122Generator) NewV4() (UUID, error) { + u := UUID{} + if _, err := io.ReadFull(g.rand, u[:]); err != nil { + return Nil, err + } + u.SetVersion(V4) + u.SetVariant(VariantRFC4122) + + return u, nil +} + +// NewV5 returns UUID based on SHA-1 hash of namespace UUID and name. +func (g *rfc4122Generator) NewV5(ns UUID, name string) UUID { + u := newFromHash(sha1.New(), ns, name) + u.SetVersion(V5) + u.SetVariant(VariantRFC4122) + + return u +} + +// Returns epoch and clock sequence. +func (g *rfc4122Generator) getClockSequence() (uint64, uint16, error) { + var err error + g.clockSequenceOnce.Do(func() { + buf := make([]byte, 2) + if _, err = io.ReadFull(g.rand, buf); err != nil { + return + } + g.clockSequence = binary.BigEndian.Uint16(buf) + }) + if err != nil { + return 0, 0, err + } + + g.storageMutex.Lock() + defer g.storageMutex.Unlock() + + timeNow := g.getEpoch() + // Clock didn't change since last UUID generation. + // Should increase clock sequence. + if timeNow <= g.lastTime { + g.clockSequence++ + } + g.lastTime = timeNow + + return timeNow, g.clockSequence, nil +} + +// Returns hardware address. +func (g *rfc4122Generator) getHardwareAddr() ([]byte, error) { + var err error + g.hardwareAddrOnce.Do(func() { + if hwAddr, err := g.hwAddrFunc(); err == nil { + copy(g.hardwareAddr[:], hwAddr) + return + } + + // Initialize hardwareAddr randomly in case + // of real network interfaces absence. + if _, err = io.ReadFull(g.rand, g.hardwareAddr[:]); err != nil { + return + } + // Set multicast bit as recommended by RFC 4122 + g.hardwareAddr[0] |= 0x01 + }) + if err != nil { + return []byte{}, err + } + return g.hardwareAddr[:], nil +} + +// Returns difference in 100-nanosecond intervals between +// UUID epoch (October 15, 1582) and current time. +func (g *rfc4122Generator) getEpoch() uint64 { + return epochStart + uint64(g.epochFunc().UnixNano()/100) +} + +// Returns UUID based on hashing of namespace UUID and name. +func newFromHash(h hash.Hash, ns UUID, name string) UUID { + u := UUID{} + h.Write(ns[:]) + h.Write([]byte(name)) + copy(u[:], h.Sum(nil)) + + return u +} + +// Returns hardware address. +func defaultHWAddrFunc() (net.HardwareAddr, error) { + ifaces, err := net.Interfaces() + if err != nil { + return []byte{}, err + } + for _, iface := range ifaces { + if len(iface.HardwareAddr) >= 6 { + return iface.HardwareAddr, nil + } + } + return []byte{}, fmt.Errorf("uuid: no HW address found") +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/satori/go.uuid/sql.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/satori/go.uuid/sql.go new file mode 100644 index 0000000000000000000000000000000000000000..56759d3905099b72cf57e47c71994f37ee810066 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/satori/go.uuid/sql.go @@ -0,0 +1,78 @@ +// Copyright (C) 2013-2018 by Maxim Bublis <b@codemonkey.ru> +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +package uuid + +import ( + "database/sql/driver" + "fmt" +) + +// Value implements the driver.Valuer interface. +func (u UUID) Value() (driver.Value, error) { + return u.String(), nil +} + +// Scan implements the sql.Scanner interface. +// A 16-byte slice is handled by UnmarshalBinary, while +// a longer byte slice or a string is handled by UnmarshalText. +func (u *UUID) Scan(src interface{}) error { + switch src := src.(type) { + case []byte: + if len(src) == Size { + return u.UnmarshalBinary(src) + } + return u.UnmarshalText(src) + + case string: + return u.UnmarshalText([]byte(src)) + } + + return fmt.Errorf("uuid: cannot convert %T to UUID", src) +} + +// NullUUID can be used with the standard sql package to represent a +// UUID value that can be NULL in the database +type NullUUID struct { + UUID UUID + Valid bool +} + +// Value implements the driver.Valuer interface. +func (u NullUUID) Value() (driver.Value, error) { + if !u.Valid { + return nil, nil + } + // Delegate to UUID Value function + return u.UUID.Value() +} + +// Scan implements the sql.Scanner interface. +func (u *NullUUID) Scan(src interface{}) error { + if src == nil { + u.UUID, u.Valid = Nil, false + return nil + } + + // Delegate to UUID Scan function + u.Valid = true + return u.UUID.Scan(src) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/satori/go.uuid/uuid.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/satori/go.uuid/uuid.go new file mode 100644 index 0000000000000000000000000000000000000000..a2b8e2ca2a1e0a5ccbd14b077e04390a93ac9a14 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/satori/go.uuid/uuid.go @@ -0,0 +1,161 @@ +// Copyright (C) 2013-2018 by Maxim Bublis <b@codemonkey.ru> +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +// Package uuid provides implementation of Universally Unique Identifier (UUID). +// Supported versions are 1, 3, 4 and 5 (as specified in RFC 4122) and +// version 2 (as specified in DCE 1.1). +package uuid + +import ( + "bytes" + "encoding/hex" +) + +// Size of a UUID in bytes. +const Size = 16 + +// UUID representation compliant with specification +// described in RFC 4122. +type UUID [Size]byte + +// UUID versions +const ( + _ byte = iota + V1 + V2 + V3 + V4 + V5 +) + +// UUID layout variants. +const ( + VariantNCS byte = iota + VariantRFC4122 + VariantMicrosoft + VariantFuture +) + +// UUID DCE domains. +const ( + DomainPerson = iota + DomainGroup + DomainOrg +) + +// String parse helpers. +var ( + urnPrefix = []byte("urn:uuid:") + byteGroups = []int{8, 4, 4, 4, 12} +) + +// Nil is special form of UUID that is specified to have all +// 128 bits set to zero. +var Nil = UUID{} + +// Predefined namespace UUIDs. +var ( + NamespaceDNS = Must(FromString("6ba7b810-9dad-11d1-80b4-00c04fd430c8")) + NamespaceURL = Must(FromString("6ba7b811-9dad-11d1-80b4-00c04fd430c8")) + NamespaceOID = Must(FromString("6ba7b812-9dad-11d1-80b4-00c04fd430c8")) + NamespaceX500 = Must(FromString("6ba7b814-9dad-11d1-80b4-00c04fd430c8")) +) + +// Equal returns true if u1 and u2 equals, otherwise returns false. +func Equal(u1 UUID, u2 UUID) bool { + return bytes.Equal(u1[:], u2[:]) +} + +// Version returns algorithm version used to generate UUID. +func (u UUID) Version() byte { + return u[6] >> 4 +} + +// Variant returns UUID layout variant. +func (u UUID) Variant() byte { + switch { + case (u[8] >> 7) == 0x00: + return VariantNCS + case (u[8] >> 6) == 0x02: + return VariantRFC4122 + case (u[8] >> 5) == 0x06: + return VariantMicrosoft + case (u[8] >> 5) == 0x07: + fallthrough + default: + return VariantFuture + } +} + +// Bytes returns bytes slice representation of UUID. +func (u UUID) Bytes() []byte { + return u[:] +} + +// Returns canonical string representation of UUID: +// xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. +func (u UUID) String() string { + buf := make([]byte, 36) + + hex.Encode(buf[0:8], u[0:4]) + buf[8] = '-' + hex.Encode(buf[9:13], u[4:6]) + buf[13] = '-' + hex.Encode(buf[14:18], u[6:8]) + buf[18] = '-' + hex.Encode(buf[19:23], u[8:10]) + buf[23] = '-' + hex.Encode(buf[24:], u[10:]) + + return string(buf) +} + +// SetVersion sets version bits. +func (u *UUID) SetVersion(v byte) { + u[6] = (u[6] & 0x0f) | (v << 4) +} + +// SetVariant sets variant bits. +func (u *UUID) SetVariant(v byte) { + switch v { + case VariantNCS: + u[8] = (u[8]&(0xff>>1) | (0x00 << 7)) + case VariantRFC4122: + u[8] = (u[8]&(0xff>>2) | (0x02 << 6)) + case VariantMicrosoft: + u[8] = (u[8]&(0xff>>3) | (0x06 << 5)) + case VariantFuture: + fallthrough + default: + u[8] = (u[8]&(0xff>>3) | (0x07 << 5)) + } +} + +// Must is a helper that wraps a call to a function returning (UUID, error) +// and panics if the error is non-nil. It is intended for use in variable +// initializations such as +// var packageUUID = uuid.Must(uuid.FromString("123e4567-e89b-12d3-a456-426655440000")); +func Must(u UUID, err error) UUID { + if err != nil { + panic(err) + } + return u +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/CONTRIBUTING.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/CONTRIBUTING.md new file mode 100644 index 0000000000000000000000000000000000000000..1820ecb3310112eee4993bea497221d0f409540c --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/CONTRIBUTING.md @@ -0,0 +1,12 @@ +# Contributing + +In general, the code posted to the [SmartyStreets github organization](https://github.com/smartystreets) is created to solve specific problems at SmartyStreets that are ancillary to our core products in the address verification industry and may or may not be useful to other organizations or developers. Our reason for posting said code isn't necessarily to solicit feedback or contributions from the community but more as a showcase of some of the approaches to solving problems we have adopted. + +Having stated that, we do consider issues raised by other githubbers as well as contributions submitted via pull requests. When submitting such a pull request, please follow these guidelines: + +- _Look before you leap:_ If the changes you plan to make are significant, it's in everyone's best interest for you to discuss them with a SmartyStreets team member prior to opening a pull request. +- _License and ownership:_ If modifying the `LICENSE.md` file, limit your changes to fixing typographical mistakes. Do NOT modify the actual terms in the license or the copyright by **SmartyStreets, LLC**. Code submitted to SmartyStreets projects becomes property of SmartyStreets and must be compatible with the associated license. +- _Testing:_ If the code you are submitting resides in packages/modules covered by automated tests, be sure to add passing tests that cover your changes and assert expected behavior and state. Submit the additional test cases as part of your change set. +- _Style:_ Match your approach to **naming** and **formatting** with the surrounding code. Basically, the code you submit shouldn't stand out. + - "Naming" refers to such constructs as variables, methods, functions, classes, structs, interfaces, packages, modules, directories, files, etc... + - "Formatting" refers to such constructs as whitespace, horizontal line length, vertical function length, vertical file length, indentation, curly braces, etc... diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/LICENSE.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/LICENSE.md new file mode 100644 index 0000000000000000000000000000000000000000..8ea6f945521d7d2d5df83f020c0c420b0d0a0d85 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/LICENSE.md @@ -0,0 +1,23 @@ +Copyright (c) 2016 SmartyStreets, LLC + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +NOTE: Various optional and subordinate components carry their own licensing +requirements and restrictions. Use of those components is subject to the terms +and conditions outlined the respective license of each component. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/README.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/README.md new file mode 100644 index 0000000000000000000000000000000000000000..58e51e903ff4d3f9cc727b3bef8be5edb5c95322 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/README.md @@ -0,0 +1,611 @@ +# assertions +-- + import "github.com/smartystreets/assertions" + +Package assertions contains the implementations for all assertions which are +referenced in goconvey's `convey` package +(github.com/smartystreets/goconvey/convey) and gunit +(github.com/smartystreets/gunit) for use with the So(...) method. They can also +be used in traditional Go test functions and even in applications. + +https://smartystreets.com + +Many of the assertions lean heavily on work done by Aaron Jacobs in his +excellent oglematchers library. (https://github.com/jacobsa/oglematchers) The +ShouldResemble assertion leans heavily on work done by Daniel Jacques in his +very helpful go-render library. (https://github.com/luci/go-render) + +## Usage + +#### func GoConveyMode + +```go +func GoConveyMode(yes bool) +``` +GoConveyMode provides control over JSON serialization of failures. When using +the assertions in this package from the convey package JSON results are very +helpful and can be rendered in a DIFF view. In that case, this function will be +called with a true value to enable the JSON serialization. By default, the +assertions in this package will not serializer a JSON result, making standalone +usage more convenient. + +#### func ShouldAlmostEqual + +```go +func ShouldAlmostEqual(actual interface{}, expected ...interface{}) string +``` +ShouldAlmostEqual makes sure that two parameters are close enough to being +equal. The acceptable delta may be specified with a third argument, or a very +small default delta will be used. + +#### func ShouldBeBetween + +```go +func ShouldBeBetween(actual interface{}, expected ...interface{}) string +``` +ShouldBeBetween receives exactly three parameters: an actual value, a lower +bound, and an upper bound. It ensures that the actual value is between both +bounds (but not equal to either of them). + +#### func ShouldBeBetweenOrEqual + +```go +func ShouldBeBetweenOrEqual(actual interface{}, expected ...interface{}) string +``` +ShouldBeBetweenOrEqual receives exactly three parameters: an actual value, a +lower bound, and an upper bound. It ensures that the actual value is between +both bounds or equal to one of them. + +#### func ShouldBeBlank + +```go +func ShouldBeBlank(actual interface{}, expected ...interface{}) string +``` +ShouldBeBlank receives exactly 1 string parameter and ensures that it is equal +to "". + +#### func ShouldBeChronological + +```go +func ShouldBeChronological(actual interface{}, expected ...interface{}) string +``` +ShouldBeChronological receives a []time.Time slice and asserts that the are in +chronological order starting with the first time.Time as the earliest. + +#### func ShouldBeEmpty + +```go +func ShouldBeEmpty(actual interface{}, expected ...interface{}) string +``` +ShouldBeEmpty receives a single parameter (actual) and determines whether or not +calling len(actual) would return `0`. It obeys the rules specified by the len +function for determining length: http://golang.org/pkg/builtin/#len + +#### func ShouldBeError + +```go +func ShouldBeError(actual interface{}, expected ...interface{}) string +``` +ShouldBeError asserts that the first argument implements the error interface. It +also compares the first argument against the second argument if provided (which +must be an error message string or another error value). + +#### func ShouldBeFalse + +```go +func ShouldBeFalse(actual interface{}, expected ...interface{}) string +``` +ShouldBeFalse receives a single parameter and ensures that it is false. + +#### func ShouldBeGreaterThan + +```go +func ShouldBeGreaterThan(actual interface{}, expected ...interface{}) string +``` +ShouldBeGreaterThan receives exactly two parameters and ensures that the first +is greater than the second. + +#### func ShouldBeGreaterThanOrEqualTo + +```go +func ShouldBeGreaterThanOrEqualTo(actual interface{}, expected ...interface{}) string +``` +ShouldBeGreaterThanOrEqualTo receives exactly two parameters and ensures that +the first is greater than or equal to the second. + +#### func ShouldBeIn + +```go +func ShouldBeIn(actual interface{}, expected ...interface{}) string +``` +ShouldBeIn receives at least 2 parameters. The first is a proposed member of the +collection that is passed in either as the second parameter, or of the +collection that is comprised of all the remaining parameters. This assertion +ensures that the proposed member is in the collection (using ShouldEqual). + +#### func ShouldBeLessThan + +```go +func ShouldBeLessThan(actual interface{}, expected ...interface{}) string +``` +ShouldBeLessThan receives exactly two parameters and ensures that the first is +less than the second. + +#### func ShouldBeLessThanOrEqualTo + +```go +func ShouldBeLessThanOrEqualTo(actual interface{}, expected ...interface{}) string +``` +ShouldBeLessThan receives exactly two parameters and ensures that the first is +less than or equal to the second. + +#### func ShouldBeNil + +```go +func ShouldBeNil(actual interface{}, expected ...interface{}) string +``` +ShouldBeNil receives a single parameter and ensures that it is nil. + +#### func ShouldBeTrue + +```go +func ShouldBeTrue(actual interface{}, expected ...interface{}) string +``` +ShouldBeTrue receives a single parameter and ensures that it is true. + +#### func ShouldBeZeroValue + +```go +func ShouldBeZeroValue(actual interface{}, expected ...interface{}) string +``` +ShouldBeZeroValue receives a single parameter and ensures that it is the Go +equivalent of the default value, or "zero" value. + +#### func ShouldContain + +```go +func ShouldContain(actual interface{}, expected ...interface{}) string +``` +ShouldContain receives exactly two parameters. The first is a slice and the +second is a proposed member. Membership is determined using ShouldEqual. + +#### func ShouldContainKey + +```go +func ShouldContainKey(actual interface{}, expected ...interface{}) string +``` +ShouldContainKey receives exactly two parameters. The first is a map and the +second is a proposed key. Keys are compared with a simple '=='. + +#### func ShouldContainSubstring + +```go +func ShouldContainSubstring(actual interface{}, expected ...interface{}) string +``` +ShouldContainSubstring receives exactly 2 string parameters and ensures that the +first contains the second as a substring. + +#### func ShouldEndWith + +```go +func ShouldEndWith(actual interface{}, expected ...interface{}) string +``` +ShouldEndWith receives exactly 2 string parameters and ensures that the first +ends with the second. + +#### func ShouldEqual + +```go +func ShouldEqual(actual interface{}, expected ...interface{}) string +``` +ShouldEqual receives exactly two parameters and does an equality check using the +following semantics: 1. If the expected and actual values implement an Equal +method in the form `func (this T) Equal(that T) bool` then call the method. If +true, they are equal. 2. The expected and actual values are judged equal or not +by oglematchers.Equals. + +#### func ShouldEqualJSON + +```go +func ShouldEqualJSON(actual interface{}, expected ...interface{}) string +``` +ShouldEqualJSON receives exactly two parameters and does an equality check by +marshalling to JSON + +#### func ShouldEqualTrimSpace + +```go +func ShouldEqualTrimSpace(actual interface{}, expected ...interface{}) string +``` +ShouldEqualTrimSpace receives exactly 2 string parameters and ensures that the +first is equal to the second after removing all leading and trailing whitespace +using strings.TrimSpace(first). + +#### func ShouldEqualWithout + +```go +func ShouldEqualWithout(actual interface{}, expected ...interface{}) string +``` +ShouldEqualWithout receives exactly 3 string parameters and ensures that the +first is equal to the second after removing all instances of the third from the +first using strings.Replace(first, third, "", -1). + +#### func ShouldHappenAfter + +```go +func ShouldHappenAfter(actual interface{}, expected ...interface{}) string +``` +ShouldHappenAfter receives exactly 2 time.Time arguments and asserts that the +first happens after the second. + +#### func ShouldHappenBefore + +```go +func ShouldHappenBefore(actual interface{}, expected ...interface{}) string +``` +ShouldHappenBefore receives exactly 2 time.Time arguments and asserts that the +first happens before the second. + +#### func ShouldHappenBetween + +```go +func ShouldHappenBetween(actual interface{}, expected ...interface{}) string +``` +ShouldHappenBetween receives exactly 3 time.Time arguments and asserts that the +first happens between (not on) the second and third. + +#### func ShouldHappenOnOrAfter + +```go +func ShouldHappenOnOrAfter(actual interface{}, expected ...interface{}) string +``` +ShouldHappenOnOrAfter receives exactly 2 time.Time arguments and asserts that +the first happens on or after the second. + +#### func ShouldHappenOnOrBefore + +```go +func ShouldHappenOnOrBefore(actual interface{}, expected ...interface{}) string +``` +ShouldHappenOnOrBefore receives exactly 2 time.Time arguments and asserts that +the first happens on or before the second. + +#### func ShouldHappenOnOrBetween + +```go +func ShouldHappenOnOrBetween(actual interface{}, expected ...interface{}) string +``` +ShouldHappenOnOrBetween receives exactly 3 time.Time arguments and asserts that +the first happens between or on the second and third. + +#### func ShouldHappenWithin + +```go +func ShouldHappenWithin(actual interface{}, expected ...interface{}) string +``` +ShouldHappenWithin receives a time.Time, a time.Duration, and a time.Time (3 +arguments) and asserts that the first time.Time happens within or on the +duration specified relative to the other time.Time. + +#### func ShouldHaveLength + +```go +func ShouldHaveLength(actual interface{}, expected ...interface{}) string +``` +ShouldHaveLength receives 2 parameters. The first is a collection to check the +length of, the second being the expected length. It obeys the rules specified by +the len function for determining length: http://golang.org/pkg/builtin/#len + +#### func ShouldHaveSameTypeAs + +```go +func ShouldHaveSameTypeAs(actual interface{}, expected ...interface{}) string +``` +ShouldHaveSameTypeAs receives exactly two parameters and compares their +underlying types for equality. + +#### func ShouldImplement + +```go +func ShouldImplement(actual interface{}, expectedList ...interface{}) string +``` +ShouldImplement receives exactly two parameters and ensures that the first +implements the interface type of the second. + +#### func ShouldNotAlmostEqual + +```go +func ShouldNotAlmostEqual(actual interface{}, expected ...interface{}) string +``` +ShouldNotAlmostEqual is the inverse of ShouldAlmostEqual + +#### func ShouldNotBeBetween + +```go +func ShouldNotBeBetween(actual interface{}, expected ...interface{}) string +``` +ShouldNotBeBetween receives exactly three parameters: an actual value, a lower +bound, and an upper bound. It ensures that the actual value is NOT between both +bounds. + +#### func ShouldNotBeBetweenOrEqual + +```go +func ShouldNotBeBetweenOrEqual(actual interface{}, expected ...interface{}) string +``` +ShouldNotBeBetweenOrEqual receives exactly three parameters: an actual value, a +lower bound, and an upper bound. It ensures that the actual value is nopt +between the bounds nor equal to either of them. + +#### func ShouldNotBeBlank + +```go +func ShouldNotBeBlank(actual interface{}, expected ...interface{}) string +``` +ShouldNotBeBlank receives exactly 1 string parameter and ensures that it is +equal to "". + +#### func ShouldNotBeEmpty + +```go +func ShouldNotBeEmpty(actual interface{}, expected ...interface{}) string +``` +ShouldNotBeEmpty receives a single parameter (actual) and determines whether or +not calling len(actual) would return a value greater than zero. It obeys the +rules specified by the `len` function for determining length: +http://golang.org/pkg/builtin/#len + +#### func ShouldNotBeIn + +```go +func ShouldNotBeIn(actual interface{}, expected ...interface{}) string +``` +ShouldNotBeIn receives at least 2 parameters. The first is a proposed member of +the collection that is passed in either as the second parameter, or of the +collection that is comprised of all the remaining parameters. This assertion +ensures that the proposed member is NOT in the collection (using ShouldEqual). + +#### func ShouldNotBeNil + +```go +func ShouldNotBeNil(actual interface{}, expected ...interface{}) string +``` +ShouldNotBeNil receives a single parameter and ensures that it is not nil. + +#### func ShouldNotBeZeroValue + +```go +func ShouldNotBeZeroValue(actual interface{}, expected ...interface{}) string +``` +ShouldBeZeroValue receives a single parameter and ensures that it is NOT the Go +equivalent of the default value, or "zero" value. + +#### func ShouldNotContain + +```go +func ShouldNotContain(actual interface{}, expected ...interface{}) string +``` +ShouldNotContain receives exactly two parameters. The first is a slice and the +second is a proposed member. Membership is determinied using ShouldEqual. + +#### func ShouldNotContainKey + +```go +func ShouldNotContainKey(actual interface{}, expected ...interface{}) string +``` +ShouldNotContainKey receives exactly two parameters. The first is a map and the +second is a proposed absent key. Keys are compared with a simple '=='. + +#### func ShouldNotContainSubstring + +```go +func ShouldNotContainSubstring(actual interface{}, expected ...interface{}) string +``` +ShouldNotContainSubstring receives exactly 2 string parameters and ensures that +the first does NOT contain the second as a substring. + +#### func ShouldNotEndWith + +```go +func ShouldNotEndWith(actual interface{}, expected ...interface{}) string +``` +ShouldEndWith receives exactly 2 string parameters and ensures that the first +does not end with the second. + +#### func ShouldNotEqual + +```go +func ShouldNotEqual(actual interface{}, expected ...interface{}) string +``` +ShouldNotEqual receives exactly two parameters and does an inequality check. See +ShouldEqual for details on how equality is determined. + +#### func ShouldNotHappenOnOrBetween + +```go +func ShouldNotHappenOnOrBetween(actual interface{}, expected ...interface{}) string +``` +ShouldNotHappenOnOrBetween receives exactly 3 time.Time arguments and asserts +that the first does NOT happen between or on the second or third. + +#### func ShouldNotHappenWithin + +```go +func ShouldNotHappenWithin(actual interface{}, expected ...interface{}) string +``` +ShouldNotHappenWithin receives a time.Time, a time.Duration, and a time.Time (3 +arguments) and asserts that the first time.Time does NOT happen within or on the +duration specified relative to the other time.Time. + +#### func ShouldNotHaveSameTypeAs + +```go +func ShouldNotHaveSameTypeAs(actual interface{}, expected ...interface{}) string +``` +ShouldNotHaveSameTypeAs receives exactly two parameters and compares their +underlying types for inequality. + +#### func ShouldNotImplement + +```go +func ShouldNotImplement(actual interface{}, expectedList ...interface{}) string +``` +ShouldNotImplement receives exactly two parameters and ensures that the first +does NOT implement the interface type of the second. + +#### func ShouldNotPanic + +```go +func ShouldNotPanic(actual interface{}, expected ...interface{}) (message string) +``` +ShouldNotPanic receives a void, niladic function and expects to execute the +function without any panic. + +#### func ShouldNotPanicWith + +```go +func ShouldNotPanicWith(actual interface{}, expected ...interface{}) (message string) +``` +ShouldNotPanicWith receives a void, niladic function and expects to recover a +panic whose content differs from the second argument. + +#### func ShouldNotPointTo + +```go +func ShouldNotPointTo(actual interface{}, expected ...interface{}) string +``` +ShouldNotPointTo receives exactly two parameters and checks to see that they +point to different addresess. + +#### func ShouldNotResemble + +```go +func ShouldNotResemble(actual interface{}, expected ...interface{}) string +``` +ShouldNotResemble receives exactly two parameters and does an inverse deep equal +check (see reflect.DeepEqual) + +#### func ShouldNotStartWith + +```go +func ShouldNotStartWith(actual interface{}, expected ...interface{}) string +``` +ShouldNotStartWith receives exactly 2 string parameters and ensures that the +first does not start with the second. + +#### func ShouldPanic + +```go +func ShouldPanic(actual interface{}, expected ...interface{}) (message string) +``` +ShouldPanic receives a void, niladic function and expects to recover a panic. + +#### func ShouldPanicWith + +```go +func ShouldPanicWith(actual interface{}, expected ...interface{}) (message string) +``` +ShouldPanicWith receives a void, niladic function and expects to recover a panic +with the second argument as the content. + +#### func ShouldPointTo + +```go +func ShouldPointTo(actual interface{}, expected ...interface{}) string +``` +ShouldPointTo receives exactly two parameters and checks to see that they point +to the same address. + +#### func ShouldResemble + +```go +func ShouldResemble(actual interface{}, expected ...interface{}) string +``` +ShouldResemble receives exactly two parameters and does a deep equal check (see +reflect.DeepEqual) + +#### func ShouldStartWith + +```go +func ShouldStartWith(actual interface{}, expected ...interface{}) string +``` +ShouldStartWith receives exactly 2 string parameters and ensures that the first +starts with the second. + +#### func So + +```go +func So(actual interface{}, assert assertion, expected ...interface{}) (bool, string) +``` +So is a convenience function (as opposed to an inconvenience function?) for +running assertions on arbitrary arguments in any context, be it for testing or +even application logging. It allows you to perform assertion-like behavior (and +get nicely formatted messages detailing discrepancies) but without the program +blowing up or panicking. All that is required is to import this package and call +`So` with one of the assertions exported by this package as the second +parameter. The first return parameter is a boolean indicating if the assertion +was true. The second return parameter is the well-formatted message showing why +an assertion was incorrect, or blank if the assertion was correct. + +Example: + + if ok, message := So(x, ShouldBeGreaterThan, y); !ok { + log.Println(message) + } + +For an alternative implementation of So (that provides more flexible return +options) see the `So` function in the package at +github.com/smartystreets/assertions/assert. + +#### type Assertion + +```go +type Assertion struct { +} +``` + + +#### func New + +```go +func New(t testingT) *Assertion +``` +New swallows the *testing.T struct and prints failed assertions using t.Error. +Example: assertions.New(t).So(1, should.Equal, 1) + +#### func (*Assertion) Failed + +```go +func (this *Assertion) Failed() bool +``` +Failed reports whether any calls to So (on this Assertion instance) have failed. + +#### func (*Assertion) So + +```go +func (this *Assertion) So(actual interface{}, assert assertion, expected ...interface{}) bool +``` +So calls the standalone So function and additionally, calls t.Error in failure +scenarios. + +#### type FailureView + +```go +type FailureView struct { + Message string `json:"Message"` + Expected string `json:"Expected"` + Actual string `json:"Actual"` +} +``` + +This struct is also declared in +github.com/smartystreets/goconvey/convey/reporting. The json struct tags should +be equal in both declarations. + +#### type Serializer + +```go +type Serializer interface { + // contains filtered or unexported methods +} +``` diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/collections.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/collections.go new file mode 100644 index 0000000000000000000000000000000000000000..b534d4bafab7cb49a1a1b1f92edb15b155ffb8ac --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/collections.go @@ -0,0 +1,244 @@ +package assertions + +import ( + "fmt" + "reflect" + + "github.com/smartystreets/assertions/internal/oglematchers" +) + +// ShouldContain receives exactly two parameters. The first is a slice and the +// second is a proposed member. Membership is determined using ShouldEqual. +func ShouldContain(actual interface{}, expected ...interface{}) string { + if fail := need(1, expected); fail != success { + return fail + } + + if matchError := oglematchers.Contains(expected[0]).Matches(actual); matchError != nil { + typeName := reflect.TypeOf(actual) + + if fmt.Sprintf("%v", matchError) == "which is not a slice or array" { + return fmt.Sprintf(shouldHaveBeenAValidCollection, typeName) + } + return fmt.Sprintf(shouldHaveContained, typeName, expected[0]) + } + return success +} + +// ShouldNotContain receives exactly two parameters. The first is a slice and the +// second is a proposed member. Membership is determinied using ShouldEqual. +func ShouldNotContain(actual interface{}, expected ...interface{}) string { + if fail := need(1, expected); fail != success { + return fail + } + typeName := reflect.TypeOf(actual) + + if matchError := oglematchers.Contains(expected[0]).Matches(actual); matchError != nil { + if fmt.Sprintf("%v", matchError) == "which is not a slice or array" { + return fmt.Sprintf(shouldHaveBeenAValidCollection, typeName) + } + return success + } + return fmt.Sprintf(shouldNotHaveContained, typeName, expected[0]) +} + +// ShouldContainKey receives exactly two parameters. The first is a map and the +// second is a proposed key. Keys are compared with a simple '=='. +func ShouldContainKey(actual interface{}, expected ...interface{}) string { + if fail := need(1, expected); fail != success { + return fail + } + + keys, isMap := mapKeys(actual) + if !isMap { + return fmt.Sprintf(shouldHaveBeenAValidMap, reflect.TypeOf(actual)) + } + + if !keyFound(keys, expected[0]) { + return fmt.Sprintf(shouldHaveContainedKey, reflect.TypeOf(actual), expected) + } + + return "" +} + +// ShouldNotContainKey receives exactly two parameters. The first is a map and the +// second is a proposed absent key. Keys are compared with a simple '=='. +func ShouldNotContainKey(actual interface{}, expected ...interface{}) string { + if fail := need(1, expected); fail != success { + return fail + } + + keys, isMap := mapKeys(actual) + if !isMap { + return fmt.Sprintf(shouldHaveBeenAValidMap, reflect.TypeOf(actual)) + } + + if keyFound(keys, expected[0]) { + return fmt.Sprintf(shouldNotHaveContainedKey, reflect.TypeOf(actual), expected) + } + + return "" +} + +func mapKeys(m interface{}) ([]reflect.Value, bool) { + value := reflect.ValueOf(m) + if value.Kind() != reflect.Map { + return nil, false + } + return value.MapKeys(), true +} +func keyFound(keys []reflect.Value, expectedKey interface{}) bool { + found := false + for _, key := range keys { + if key.Interface() == expectedKey { + found = true + } + } + return found +} + +// ShouldBeIn receives at least 2 parameters. The first is a proposed member of the collection +// that is passed in either as the second parameter, or of the collection that is comprised +// of all the remaining parameters. This assertion ensures that the proposed member is in +// the collection (using ShouldEqual). +func ShouldBeIn(actual interface{}, expected ...interface{}) string { + if fail := atLeast(1, expected); fail != success { + return fail + } + + if len(expected) == 1 { + return shouldBeIn(actual, expected[0]) + } + return shouldBeIn(actual, expected) +} +func shouldBeIn(actual interface{}, expected interface{}) string { + if matchError := oglematchers.Contains(actual).Matches(expected); matchError != nil { + return fmt.Sprintf(shouldHaveBeenIn, actual, reflect.TypeOf(expected)) + } + return success +} + +// ShouldNotBeIn receives at least 2 parameters. The first is a proposed member of the collection +// that is passed in either as the second parameter, or of the collection that is comprised +// of all the remaining parameters. This assertion ensures that the proposed member is NOT in +// the collection (using ShouldEqual). +func ShouldNotBeIn(actual interface{}, expected ...interface{}) string { + if fail := atLeast(1, expected); fail != success { + return fail + } + + if len(expected) == 1 { + return shouldNotBeIn(actual, expected[0]) + } + return shouldNotBeIn(actual, expected) +} +func shouldNotBeIn(actual interface{}, expected interface{}) string { + if matchError := oglematchers.Contains(actual).Matches(expected); matchError == nil { + return fmt.Sprintf(shouldNotHaveBeenIn, actual, reflect.TypeOf(expected)) + } + return success +} + +// ShouldBeEmpty receives a single parameter (actual) and determines whether or not +// calling len(actual) would return `0`. It obeys the rules specified by the len +// function for determining length: http://golang.org/pkg/builtin/#len +func ShouldBeEmpty(actual interface{}, expected ...interface{}) string { + if fail := need(0, expected); fail != success { + return fail + } + + if actual == nil { + return success + } + + value := reflect.ValueOf(actual) + switch value.Kind() { + case reflect.Slice: + if value.Len() == 0 { + return success + } + case reflect.Chan: + if value.Len() == 0 { + return success + } + case reflect.Map: + if value.Len() == 0 { + return success + } + case reflect.String: + if value.Len() == 0 { + return success + } + case reflect.Ptr: + elem := value.Elem() + kind := elem.Kind() + if (kind == reflect.Slice || kind == reflect.Array) && elem.Len() == 0 { + return success + } + } + + return fmt.Sprintf(shouldHaveBeenEmpty, actual) +} + +// ShouldNotBeEmpty receives a single parameter (actual) and determines whether or not +// calling len(actual) would return a value greater than zero. It obeys the rules +// specified by the `len` function for determining length: http://golang.org/pkg/builtin/#len +func ShouldNotBeEmpty(actual interface{}, expected ...interface{}) string { + if fail := need(0, expected); fail != success { + return fail + } + + if empty := ShouldBeEmpty(actual, expected...); empty != success { + return success + } + return fmt.Sprintf(shouldNotHaveBeenEmpty, actual) +} + +// ShouldHaveLength receives 2 parameters. The first is a collection to check +// the length of, the second being the expected length. It obeys the rules +// specified by the len function for determining length: +// http://golang.org/pkg/builtin/#len +func ShouldHaveLength(actual interface{}, expected ...interface{}) string { + if fail := need(1, expected); fail != success { + return fail + } + + var expectedLen int64 + lenValue := reflect.ValueOf(expected[0]) + switch lenValue.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + expectedLen = lenValue.Int() + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + expectedLen = int64(lenValue.Uint()) + default: + return fmt.Sprintf(shouldHaveBeenAValidInteger, reflect.TypeOf(expected[0])) + } + + if expectedLen < 0 { + return fmt.Sprintf(shouldHaveBeenAValidLength, expected[0]) + } + + value := reflect.ValueOf(actual) + switch value.Kind() { + case reflect.Slice, + reflect.Chan, + reflect.Map, + reflect.String: + if int64(value.Len()) == expectedLen { + return success + } else { + return fmt.Sprintf(shouldHaveHadLength, expectedLen, value.Len(), actual) + } + case reflect.Ptr: + elem := value.Elem() + kind := elem.Kind() + if kind == reflect.Slice || kind == reflect.Array { + if int64(elem.Len()) == expectedLen { + return success + } else { + return fmt.Sprintf(shouldHaveHadLength, expectedLen, elem.Len(), actual) + } + } + } + return fmt.Sprintf(shouldHaveBeenAValidCollection, reflect.TypeOf(actual)) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/doc.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/doc.go new file mode 100644 index 0000000000000000000000000000000000000000..ba30a9261ac96e04854f801a04c6b7caef82396c --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/doc.go @@ -0,0 +1,109 @@ +// Package assertions contains the implementations for all assertions which +// are referenced in goconvey's `convey` package +// (github.com/smartystreets/goconvey/convey) and gunit (github.com/smartystreets/gunit) +// for use with the So(...) method. +// They can also be used in traditional Go test functions and even in +// applications. +// +// https://smartystreets.com +// +// Many of the assertions lean heavily on work done by Aaron Jacobs in his excellent oglematchers library. +// (https://github.com/jacobsa/oglematchers) +// The ShouldResemble assertion leans heavily on work done by Daniel Jacques in his very helpful go-render library. +// (https://github.com/luci/go-render) +package assertions + +import ( + "fmt" + "runtime" +) + +// By default we use a no-op serializer. The actual Serializer provides a JSON +// representation of failure results on selected assertions so the goconvey +// web UI can display a convenient diff. +var serializer Serializer = new(noopSerializer) + +// GoConveyMode provides control over JSON serialization of failures. When +// using the assertions in this package from the convey package JSON results +// are very helpful and can be rendered in a DIFF view. In that case, this function +// will be called with a true value to enable the JSON serialization. By default, +// the assertions in this package will not serializer a JSON result, making +// standalone usage more convenient. +func GoConveyMode(yes bool) { + if yes { + serializer = newSerializer() + } else { + serializer = new(noopSerializer) + } +} + +type testingT interface { + Error(args ...interface{}) +} + +type Assertion struct { + t testingT + failed bool +} + +// New swallows the *testing.T struct and prints failed assertions using t.Error. +// Example: assertions.New(t).So(1, should.Equal, 1) +func New(t testingT) *Assertion { + return &Assertion{t: t} +} + +// Failed reports whether any calls to So (on this Assertion instance) have failed. +func (this *Assertion) Failed() bool { + return this.failed +} + +// So calls the standalone So function and additionally, calls t.Error in failure scenarios. +func (this *Assertion) So(actual interface{}, assert assertion, expected ...interface{}) bool { + ok, result := So(actual, assert, expected...) + if !ok { + this.failed = true + _, file, line, _ := runtime.Caller(1) + this.t.Error(fmt.Sprintf("\n%s:%d\n%s", file, line, result)) + } + return ok +} + +// So is a convenience function (as opposed to an inconvenience function?) +// for running assertions on arbitrary arguments in any context, be it for testing or even +// application logging. It allows you to perform assertion-like behavior (and get nicely +// formatted messages detailing discrepancies) but without the program blowing up or panicking. +// All that is required is to import this package and call `So` with one of the assertions +// exported by this package as the second parameter. +// The first return parameter is a boolean indicating if the assertion was true. The second +// return parameter is the well-formatted message showing why an assertion was incorrect, or +// blank if the assertion was correct. +// +// Example: +// +// if ok, message := So(x, ShouldBeGreaterThan, y); !ok { +// log.Println(message) +// } +// +// For an alternative implementation of So (that provides more flexible return options) +// see the `So` function in the package at github.com/smartystreets/assertions/assert. +func So(actual interface{}, assert assertion, expected ...interface{}) (bool, string) { + if result := so(actual, assert, expected...); len(result) == 0 { + return true, result + } else { + return false, result + } +} + +// so is like So, except that it only returns the string message, which is blank if the +// assertion passed. Used to facilitate testing. +func so(actual interface{}, assert func(interface{}, ...interface{}) string, expected ...interface{}) string { + return assert(actual, expected...) +} + +// assertion is an alias for a function with a signature that the So() +// function can handle. Any future or custom assertions should conform to this +// method signature. The return value should be an empty string if the assertion +// passes and a well-formed failure message if not. +type assertion func(actual interface{}, expected ...interface{}) string + +//////////////////////////////////////////////////////////////////////////// diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/equal_method.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/equal_method.go new file mode 100644 index 0000000000000000000000000000000000000000..c4fc38fab5e77590b2b61d6d1f373448d09ce5ff --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/equal_method.go @@ -0,0 +1,75 @@ +package assertions + +import "reflect" + +type equalityMethodSpecification struct { + a interface{} + b interface{} + + aType reflect.Type + bType reflect.Type + + equalMethod reflect.Value +} + +func newEqualityMethodSpecification(a, b interface{}) *equalityMethodSpecification { + return &equalityMethodSpecification{ + a: a, + b: b, + } +} + +func (this *equalityMethodSpecification) IsSatisfied() bool { + if !this.bothAreSameType() { + return false + } + if !this.typeHasEqualMethod() { + return false + } + if !this.equalMethodReceivesSameTypeForComparison() { + return false + } + if !this.equalMethodReturnsBool() { + return false + } + return true +} + +func (this *equalityMethodSpecification) bothAreSameType() bool { + this.aType = reflect.TypeOf(this.a) + if this.aType == nil { + return false + } + if this.aType.Kind() == reflect.Ptr { + this.aType = this.aType.Elem() + } + this.bType = reflect.TypeOf(this.b) + return this.aType == this.bType +} +func (this *equalityMethodSpecification) typeHasEqualMethod() bool { + aInstance := reflect.ValueOf(this.a) + this.equalMethod = aInstance.MethodByName("Equal") + return this.equalMethod != reflect.Value{} +} + +func (this *equalityMethodSpecification) equalMethodReceivesSameTypeForComparison() bool { + signature := this.equalMethod.Type() + return signature.NumIn() == 1 && signature.In(0) == this.aType +} + +func (this *equalityMethodSpecification) equalMethodReturnsBool() bool { + signature := this.equalMethod.Type() + return signature.NumOut() == 1 && signature.Out(0) == reflect.TypeOf(true) +} + +func (this *equalityMethodSpecification) AreEqual() bool { + a := reflect.ValueOf(this.a) + b := reflect.ValueOf(this.b) + return areEqual(a, b) && areEqual(b, a) +} +func areEqual(receiver reflect.Value, argument reflect.Value) bool { + equalMethod := receiver.MethodByName("Equal") + argumentList := []reflect.Value{argument} + result := equalMethod.Call(argumentList) + return result[0].Bool() +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/equality.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/equality.go new file mode 100644 index 0000000000000000000000000000000000000000..6c10d24d9099bcea9c72064ec9aa6426cc570b88 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/equality.go @@ -0,0 +1,328 @@ +package assertions + +import ( + "encoding/json" + "errors" + "fmt" + "math" + "reflect" + "strings" + + "github.com/smartystreets/assertions/internal/go-render/render" + "github.com/smartystreets/assertions/internal/oglematchers" +) + +// ShouldEqual receives exactly two parameters and does an equality check +// using the following semantics: +// 1. If the expected and actual values implement an Equal method in the form +// `func (this T) Equal(that T) bool` then call the method. If true, they are equal. +// 2. The expected and actual values are judged equal or not by oglematchers.Equals. +func ShouldEqual(actual interface{}, expected ...interface{}) string { + if message := need(1, expected); message != success { + return message + } + return shouldEqual(actual, expected[0]) +} +func shouldEqual(actual, expected interface{}) (message string) { + defer func() { + if r := recover(); r != nil { + message = serializer.serialize(expected, actual, fmt.Sprintf(shouldHaveBeenEqual, expected, actual)) + } + }() + + if specification := newEqualityMethodSpecification(expected, actual); specification.IsSatisfied() { + if specification.AreEqual() { + return success + } else { + message = fmt.Sprintf(shouldHaveBeenEqual, expected, actual) + return serializer.serialize(expected, actual, message) + } + } + if matchError := oglematchers.Equals(expected).Matches(actual); matchError != nil { + expectedSyntax := fmt.Sprintf("%v", expected) + actualSyntax := fmt.Sprintf("%v", actual) + if expectedSyntax == actualSyntax && reflect.TypeOf(expected) != reflect.TypeOf(actual) { + message = fmt.Sprintf(shouldHaveBeenEqualTypeMismatch, expected, expected, actual, actual) + } else { + message = fmt.Sprintf(shouldHaveBeenEqual, expected, actual) + } + return serializer.serialize(expected, actual, message) + } + + return success +} + +// ShouldNotEqual receives exactly two parameters and does an inequality check. +// See ShouldEqual for details on how equality is determined. +func ShouldNotEqual(actual interface{}, expected ...interface{}) string { + if fail := need(1, expected); fail != success { + return fail + } else if ShouldEqual(actual, expected[0]) == success { + return fmt.Sprintf(shouldNotHaveBeenEqual, actual, expected[0]) + } + return success +} + +// ShouldAlmostEqual makes sure that two parameters are close enough to being equal. +// The acceptable delta may be specified with a third argument, +// or a very small default delta will be used. +func ShouldAlmostEqual(actual interface{}, expected ...interface{}) string { + actualFloat, expectedFloat, deltaFloat, err := cleanAlmostEqualInput(actual, expected...) + + if err != "" { + return err + } + + if math.Abs(actualFloat-expectedFloat) <= deltaFloat { + return success + } else { + return fmt.Sprintf(shouldHaveBeenAlmostEqual, actualFloat, expectedFloat) + } +} + +// ShouldNotAlmostEqual is the inverse of ShouldAlmostEqual +func ShouldNotAlmostEqual(actual interface{}, expected ...interface{}) string { + actualFloat, expectedFloat, deltaFloat, err := cleanAlmostEqualInput(actual, expected...) + + if err != "" { + return err + } + + if math.Abs(actualFloat-expectedFloat) > deltaFloat { + return success + } else { + return fmt.Sprintf(shouldHaveNotBeenAlmostEqual, actualFloat, expectedFloat) + } +} + +func cleanAlmostEqualInput(actual interface{}, expected ...interface{}) (float64, float64, float64, string) { + deltaFloat := 0.0000000001 + + if len(expected) == 0 { + return 0.0, 0.0, 0.0, "This assertion requires exactly one comparison value and an optional delta (you provided neither)" + } else if len(expected) == 2 { + delta, err := getFloat(expected[1]) + + if err != nil { + return 0.0, 0.0, 0.0, "The delta value " + err.Error() + } + + deltaFloat = delta + } else if len(expected) > 2 { + return 0.0, 0.0, 0.0, "This assertion requires exactly one comparison value and an optional delta (you provided more values)" + } + + actualFloat, err := getFloat(actual) + if err != nil { + return 0.0, 0.0, 0.0, "The actual value " + err.Error() + } + + expectedFloat, err := getFloat(expected[0]) + if err != nil { + return 0.0, 0.0, 0.0, "The comparison value " + err.Error() + } + + return actualFloat, expectedFloat, deltaFloat, "" +} + +// returns the float value of any real number, or error if it is not a numerical type +func getFloat(num interface{}) (float64, error) { + numValue := reflect.ValueOf(num) + numKind := numValue.Kind() + + if numKind == reflect.Int || + numKind == reflect.Int8 || + numKind == reflect.Int16 || + numKind == reflect.Int32 || + numKind == reflect.Int64 { + return float64(numValue.Int()), nil + } else if numKind == reflect.Uint || + numKind == reflect.Uint8 || + numKind == reflect.Uint16 || + numKind == reflect.Uint32 || + numKind == reflect.Uint64 { + return float64(numValue.Uint()), nil + } else if numKind == reflect.Float32 || + numKind == reflect.Float64 { + return numValue.Float(), nil + } else { + return 0.0, errors.New("must be a numerical type, but was: " + numKind.String()) + } +} + +// ShouldEqualJSON receives exactly two parameters and does an equality check by marshalling to JSON +func ShouldEqualJSON(actual interface{}, expected ...interface{}) string { + if message := need(1, expected); message != success { + return message + } + + expectedString, expectedErr := remarshal(expected[0].(string)) + if expectedErr != nil { + return "Expected value not valid JSON: " + expectedErr.Error() + } + + actualString, actualErr := remarshal(actual.(string)) + if actualErr != nil { + return "Actual value not valid JSON: " + actualErr.Error() + } + + return ShouldEqual(actualString, expectedString) +} +func remarshal(value string) (string, error) { + var structured map[string]interface{} + err := json.Unmarshal([]byte(value), &structured) + if err != nil { + return "", err + } + canonical, _ := json.Marshal(structured) + return string(canonical), nil +} + +// ShouldResemble receives exactly two parameters and does a deep equal check (see reflect.DeepEqual) +func ShouldResemble(actual interface{}, expected ...interface{}) string { + if message := need(1, expected); message != success { + return message + } + + if matchError := oglematchers.DeepEquals(expected[0]).Matches(actual); matchError != nil { + return serializer.serializeDetailed(expected[0], actual, + fmt.Sprintf(shouldHaveResembled, render.Render(expected[0]), render.Render(actual))) + } + + return success +} + +// ShouldNotResemble receives exactly two parameters and does an inverse deep equal check (see reflect.DeepEqual) +func ShouldNotResemble(actual interface{}, expected ...interface{}) string { + if message := need(1, expected); message != success { + return message + } else if ShouldResemble(actual, expected[0]) == success { + return fmt.Sprintf(shouldNotHaveResembled, render.Render(actual), render.Render(expected[0])) + } + return success +} + +// ShouldPointTo receives exactly two parameters and checks to see that they point to the same address. +func ShouldPointTo(actual interface{}, expected ...interface{}) string { + if message := need(1, expected); message != success { + return message + } + return shouldPointTo(actual, expected[0]) + +} +func shouldPointTo(actual, expected interface{}) string { + actualValue := reflect.ValueOf(actual) + expectedValue := reflect.ValueOf(expected) + + if ShouldNotBeNil(actual) != success { + return fmt.Sprintf(shouldHaveBeenNonNilPointer, "first", "nil") + } else if ShouldNotBeNil(expected) != success { + return fmt.Sprintf(shouldHaveBeenNonNilPointer, "second", "nil") + } else if actualValue.Kind() != reflect.Ptr { + return fmt.Sprintf(shouldHaveBeenNonNilPointer, "first", "not") + } else if expectedValue.Kind() != reflect.Ptr { + return fmt.Sprintf(shouldHaveBeenNonNilPointer, "second", "not") + } else if ShouldEqual(actualValue.Pointer(), expectedValue.Pointer()) != success { + actualAddress := reflect.ValueOf(actual).Pointer() + expectedAddress := reflect.ValueOf(expected).Pointer() + return serializer.serialize(expectedAddress, actualAddress, fmt.Sprintf(shouldHavePointedTo, + actual, actualAddress, + expected, expectedAddress)) + } + return success +} + +// ShouldNotPointTo receives exactly two parameters and checks to see that they point to different addresess. +func ShouldNotPointTo(actual interface{}, expected ...interface{}) string { + if message := need(1, expected); message != success { + return message + } + compare := ShouldPointTo(actual, expected[0]) + if strings.HasPrefix(compare, shouldBePointers) { + return compare + } else if compare == success { + return fmt.Sprintf(shouldNotHavePointedTo, actual, expected[0], reflect.ValueOf(actual).Pointer()) + } + return success +} + +// ShouldBeNil receives a single parameter and ensures that it is nil. +func ShouldBeNil(actual interface{}, expected ...interface{}) string { + if fail := need(0, expected); fail != success { + return fail + } else if actual == nil { + return success + } else if interfaceHasNilValue(actual) { + return success + } + return fmt.Sprintf(shouldHaveBeenNil, actual) +} +func interfaceHasNilValue(actual interface{}) bool { + value := reflect.ValueOf(actual) + kind := value.Kind() + nilable := kind == reflect.Slice || + kind == reflect.Chan || + kind == reflect.Func || + kind == reflect.Ptr || + kind == reflect.Map + + // Careful: reflect.Value.IsNil() will panic unless it's an interface, chan, map, func, slice, or ptr + // Reference: http://golang.org/pkg/reflect/#Value.IsNil + return nilable && value.IsNil() +} + +// ShouldNotBeNil receives a single parameter and ensures that it is not nil. +func ShouldNotBeNil(actual interface{}, expected ...interface{}) string { + if fail := need(0, expected); fail != success { + return fail + } else if ShouldBeNil(actual) == success { + return fmt.Sprintf(shouldNotHaveBeenNil, actual) + } + return success +} + +// ShouldBeTrue receives a single parameter and ensures that it is true. +func ShouldBeTrue(actual interface{}, expected ...interface{}) string { + if fail := need(0, expected); fail != success { + return fail + } else if actual != true { + return fmt.Sprintf(shouldHaveBeenTrue, actual) + } + return success +} + +// ShouldBeFalse receives a single parameter and ensures that it is false. +func ShouldBeFalse(actual interface{}, expected ...interface{}) string { + if fail := need(0, expected); fail != success { + return fail + } else if actual != false { + return fmt.Sprintf(shouldHaveBeenFalse, actual) + } + return success +} + +// ShouldBeZeroValue receives a single parameter and ensures that it is +// the Go equivalent of the default value, or "zero" value. +func ShouldBeZeroValue(actual interface{}, expected ...interface{}) string { + if fail := need(0, expected); fail != success { + return fail + } + zeroVal := reflect.Zero(reflect.TypeOf(actual)).Interface() + if !reflect.DeepEqual(zeroVal, actual) { + return serializer.serialize(zeroVal, actual, fmt.Sprintf(shouldHaveBeenZeroValue, actual)) + } + return success +} + +// ShouldBeZeroValue receives a single parameter and ensures that it is NOT +// the Go equivalent of the default value, or "zero" value. +func ShouldNotBeZeroValue(actual interface{}, expected ...interface{}) string { + if fail := need(0, expected); fail != success { + return fail + } + zeroVal := reflect.Zero(reflect.TypeOf(actual)).Interface() + if reflect.DeepEqual(zeroVal, actual) { + return serializer.serialize(zeroVal, actual, fmt.Sprintf(shouldNotHaveBeenZeroValue, actual)) + } + return success +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/filter.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/filter.go new file mode 100644 index 0000000000000000000000000000000000000000..7c46ab8e35c1e01f607d51bd46388a5a76241f9d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/filter.go @@ -0,0 +1,31 @@ +package assertions + +import "fmt" + +const ( + success = "" + needExactValues = "This assertion requires exactly %d comparison values (you provided %d)." + needNonEmptyCollection = "This assertion requires at least 1 comparison value (you provided 0)." + needFewerValues = "This assertion allows %d or fewer comparison values (you provided %d)." +) + +func need(needed int, expected []interface{}) string { + if len(expected) != needed { + return fmt.Sprintf(needExactValues, needed, len(expected)) + } + return success +} + +func atLeast(minimum int, expected []interface{}) string { + if len(expected) < 1 { + return needNonEmptyCollection + } + return success +} + +func atMost(max int, expected []interface{}) string { + if len(expected) > max { + return fmt.Sprintf(needFewerValues, max, len(expected)) + } + return success +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/go-render/LICENSE b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/go-render/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..6280ff0e06b4cf4842729e9c28a310aabf5faaa8 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/go-render/LICENSE @@ -0,0 +1,27 @@ +// Copyright (c) 2015 The Chromium Authors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/go-render/render/render.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/go-render/render/render.go new file mode 100644 index 0000000000000000000000000000000000000000..313611ef0c45eb1a54f7d9aafddef6c5273540a9 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/go-render/render/render.go @@ -0,0 +1,481 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package render + +import ( + "bytes" + "fmt" + "reflect" + "sort" + "strconv" +) + +var builtinTypeMap = map[reflect.Kind]string{ + reflect.Bool: "bool", + reflect.Complex128: "complex128", + reflect.Complex64: "complex64", + reflect.Float32: "float32", + reflect.Float64: "float64", + reflect.Int16: "int16", + reflect.Int32: "int32", + reflect.Int64: "int64", + reflect.Int8: "int8", + reflect.Int: "int", + reflect.String: "string", + reflect.Uint16: "uint16", + reflect.Uint32: "uint32", + reflect.Uint64: "uint64", + reflect.Uint8: "uint8", + reflect.Uint: "uint", + reflect.Uintptr: "uintptr", +} + +var builtinTypeSet = map[string]struct{}{} + +func init() { + for _, v := range builtinTypeMap { + builtinTypeSet[v] = struct{}{} + } +} + +var typeOfString = reflect.TypeOf("") +var typeOfInt = reflect.TypeOf(int(1)) +var typeOfUint = reflect.TypeOf(uint(1)) +var typeOfFloat = reflect.TypeOf(10.1) + +// Render converts a structure to a string representation. Unline the "%#v" +// format string, this resolves pointer types' contents in structs, maps, and +// slices/arrays and prints their field values. +func Render(v interface{}) string { + buf := bytes.Buffer{} + s := (*traverseState)(nil) + s.render(&buf, 0, reflect.ValueOf(v), false) + return buf.String() +} + +// renderPointer is called to render a pointer value. +// +// This is overridable so that the test suite can have deterministic pointer +// values in its expectations. +var renderPointer = func(buf *bytes.Buffer, p uintptr) { + fmt.Fprintf(buf, "0x%016x", p) +} + +// traverseState is used to note and avoid recursion as struct members are being +// traversed. +// +// traverseState is allowed to be nil. Specifically, the root state is nil. +type traverseState struct { + parent *traverseState + ptr uintptr +} + +func (s *traverseState) forkFor(ptr uintptr) *traverseState { + for cur := s; cur != nil; cur = cur.parent { + if ptr == cur.ptr { + return nil + } + } + + fs := &traverseState{ + parent: s, + ptr: ptr, + } + return fs +} + +func (s *traverseState) render(buf *bytes.Buffer, ptrs int, v reflect.Value, implicit bool) { + if v.Kind() == reflect.Invalid { + buf.WriteString("nil") + return + } + vt := v.Type() + + // If the type being rendered is a potentially recursive type (a type that + // can contain itself as a member), we need to avoid recursion. + // + // If we've already seen this type before, mark that this is the case and + // write a recursion placeholder instead of actually rendering it. + // + // If we haven't seen it before, fork our `seen` tracking so any higher-up + // renderers will also render it at least once, then mark that we've seen it + // to avoid recursing on lower layers. + pe := uintptr(0) + vk := vt.Kind() + switch vk { + case reflect.Ptr: + // Since structs and arrays aren't pointers, they can't directly be + // recursed, but they can contain pointers to themselves. Record their + // pointer to avoid this. + switch v.Elem().Kind() { + case reflect.Struct, reflect.Array: + pe = v.Pointer() + } + + case reflect.Slice, reflect.Map: + pe = v.Pointer() + } + if pe != 0 { + s = s.forkFor(pe) + if s == nil { + buf.WriteString("<REC(") + if !implicit { + writeType(buf, ptrs, vt) + } + buf.WriteString(")>") + return + } + } + + isAnon := func(t reflect.Type) bool { + if t.Name() != "" { + if _, ok := builtinTypeSet[t.Name()]; !ok { + return false + } + } + return t.Kind() != reflect.Interface + } + + switch vk { + case reflect.Struct: + if !implicit { + writeType(buf, ptrs, vt) + } + buf.WriteRune('{') + if rendered, ok := renderTime(v); ok { + buf.WriteString(rendered) + } else { + structAnon := vt.Name() == "" + for i := 0; i < vt.NumField(); i++ { + if i > 0 { + buf.WriteString(", ") + } + anon := structAnon && isAnon(vt.Field(i).Type) + + if !anon { + buf.WriteString(vt.Field(i).Name) + buf.WriteRune(':') + } + + s.render(buf, 0, v.Field(i), anon) + } + } + buf.WriteRune('}') + + case reflect.Slice: + if v.IsNil() { + if !implicit { + writeType(buf, ptrs, vt) + buf.WriteString("(nil)") + } else { + buf.WriteString("nil") + } + return + } + fallthrough + + case reflect.Array: + if !implicit { + writeType(buf, ptrs, vt) + } + anon := vt.Name() == "" && isAnon(vt.Elem()) + buf.WriteString("{") + for i := 0; i < v.Len(); i++ { + if i > 0 { + buf.WriteString(", ") + } + + s.render(buf, 0, v.Index(i), anon) + } + buf.WriteRune('}') + + case reflect.Map: + if !implicit { + writeType(buf, ptrs, vt) + } + if v.IsNil() { + buf.WriteString("(nil)") + } else { + buf.WriteString("{") + + mkeys := v.MapKeys() + tryAndSortMapKeys(vt, mkeys) + + kt := vt.Key() + keyAnon := typeOfString.ConvertibleTo(kt) || typeOfInt.ConvertibleTo(kt) || typeOfUint.ConvertibleTo(kt) || typeOfFloat.ConvertibleTo(kt) + valAnon := vt.Name() == "" && isAnon(vt.Elem()) + for i, mk := range mkeys { + if i > 0 { + buf.WriteString(", ") + } + + s.render(buf, 0, mk, keyAnon) + buf.WriteString(":") + s.render(buf, 0, v.MapIndex(mk), valAnon) + } + buf.WriteRune('}') + } + + case reflect.Ptr: + ptrs++ + fallthrough + case reflect.Interface: + if v.IsNil() { + writeType(buf, ptrs, v.Type()) + buf.WriteString("(nil)") + } else { + s.render(buf, ptrs, v.Elem(), false) + } + + case reflect.Chan, reflect.Func, reflect.UnsafePointer: + writeType(buf, ptrs, vt) + buf.WriteRune('(') + renderPointer(buf, v.Pointer()) + buf.WriteRune(')') + + default: + tstr := vt.String() + implicit = implicit || (ptrs == 0 && builtinTypeMap[vk] == tstr) + if !implicit { + writeType(buf, ptrs, vt) + buf.WriteRune('(') + } + + switch vk { + case reflect.String: + fmt.Fprintf(buf, "%q", v.String()) + case reflect.Bool: + fmt.Fprintf(buf, "%v", v.Bool()) + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + fmt.Fprintf(buf, "%d", v.Int()) + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + fmt.Fprintf(buf, "%d", v.Uint()) + + case reflect.Float32, reflect.Float64: + fmt.Fprintf(buf, "%g", v.Float()) + + case reflect.Complex64, reflect.Complex128: + fmt.Fprintf(buf, "%g", v.Complex()) + } + + if !implicit { + buf.WriteRune(')') + } + } +} + +func writeType(buf *bytes.Buffer, ptrs int, t reflect.Type) { + parens := ptrs > 0 + switch t.Kind() { + case reflect.Chan, reflect.Func, reflect.UnsafePointer: + parens = true + } + + if parens { + buf.WriteRune('(') + for i := 0; i < ptrs; i++ { + buf.WriteRune('*') + } + } + + switch t.Kind() { + case reflect.Ptr: + if ptrs == 0 { + // This pointer was referenced from within writeType (e.g., as part of + // rendering a list), and so hasn't had its pointer asterisk accounted + // for. + buf.WriteRune('*') + } + writeType(buf, 0, t.Elem()) + + case reflect.Interface: + if n := t.Name(); n != "" { + buf.WriteString(t.String()) + } else { + buf.WriteString("interface{}") + } + + case reflect.Array: + buf.WriteRune('[') + buf.WriteString(strconv.FormatInt(int64(t.Len()), 10)) + buf.WriteRune(']') + writeType(buf, 0, t.Elem()) + + case reflect.Slice: + if t == reflect.SliceOf(t.Elem()) { + buf.WriteString("[]") + writeType(buf, 0, t.Elem()) + } else { + // Custom slice type, use type name. + buf.WriteString(t.String()) + } + + case reflect.Map: + if t == reflect.MapOf(t.Key(), t.Elem()) { + buf.WriteString("map[") + writeType(buf, 0, t.Key()) + buf.WriteRune(']') + writeType(buf, 0, t.Elem()) + } else { + // Custom map type, use type name. + buf.WriteString(t.String()) + } + + default: + buf.WriteString(t.String()) + } + + if parens { + buf.WriteRune(')') + } +} + +type cmpFn func(a, b reflect.Value) int + +type sortableValueSlice struct { + cmp cmpFn + elements []reflect.Value +} + +func (s sortableValueSlice) Len() int { + return len(s.elements) +} + +func (s sortableValueSlice) Less(i, j int) bool { + return s.cmp(s.elements[i], s.elements[j]) < 0 +} + +func (s sortableValueSlice) Swap(i, j int) { + s.elements[i], s.elements[j] = s.elements[j], s.elements[i] +} + +// cmpForType returns a cmpFn which sorts the data for some type t in the same +// order that a go-native map key is compared for equality. +func cmpForType(t reflect.Type) cmpFn { + switch t.Kind() { + case reflect.String: + return func(av, bv reflect.Value) int { + a, b := av.String(), bv.String() + if a < b { + return -1 + } else if a > b { + return 1 + } + return 0 + } + + case reflect.Bool: + return func(av, bv reflect.Value) int { + a, b := av.Bool(), bv.Bool() + if !a && b { + return -1 + } else if a && !b { + return 1 + } + return 0 + } + + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return func(av, bv reflect.Value) int { + a, b := av.Int(), bv.Int() + if a < b { + return -1 + } else if a > b { + return 1 + } + return 0 + } + + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, + reflect.Uint64, reflect.Uintptr, reflect.UnsafePointer: + return func(av, bv reflect.Value) int { + a, b := av.Uint(), bv.Uint() + if a < b { + return -1 + } else if a > b { + return 1 + } + return 0 + } + + case reflect.Float32, reflect.Float64: + return func(av, bv reflect.Value) int { + a, b := av.Float(), bv.Float() + if a < b { + return -1 + } else if a > b { + return 1 + } + return 0 + } + + case reflect.Interface: + return func(av, bv reflect.Value) int { + a, b := av.InterfaceData(), bv.InterfaceData() + if a[0] < b[0] { + return -1 + } else if a[0] > b[0] { + return 1 + } + if a[1] < b[1] { + return -1 + } else if a[1] > b[1] { + return 1 + } + return 0 + } + + case reflect.Complex64, reflect.Complex128: + return func(av, bv reflect.Value) int { + a, b := av.Complex(), bv.Complex() + if real(a) < real(b) { + return -1 + } else if real(a) > real(b) { + return 1 + } + if imag(a) < imag(b) { + return -1 + } else if imag(a) > imag(b) { + return 1 + } + return 0 + } + + case reflect.Ptr, reflect.Chan: + return func(av, bv reflect.Value) int { + a, b := av.Pointer(), bv.Pointer() + if a < b { + return -1 + } else if a > b { + return 1 + } + return 0 + } + + case reflect.Struct: + cmpLst := make([]cmpFn, t.NumField()) + for i := range cmpLst { + cmpLst[i] = cmpForType(t.Field(i).Type) + } + return func(a, b reflect.Value) int { + for i, cmp := range cmpLst { + if rslt := cmp(a.Field(i), b.Field(i)); rslt != 0 { + return rslt + } + } + return 0 + } + } + + return nil +} + +func tryAndSortMapKeys(mt reflect.Type, k []reflect.Value) { + if cmp := cmpForType(mt.Key()); cmp != nil { + sort.Sort(sortableValueSlice{cmp, k}) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/go-render/render/render_time.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/go-render/render/render_time.go new file mode 100644 index 0000000000000000000000000000000000000000..990c75d0ffb5d1d4bed9455d642f1c30a5589074 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/go-render/render/render_time.go @@ -0,0 +1,26 @@ +package render + +import ( + "reflect" + "time" +) + +func renderTime(value reflect.Value) (string, bool) { + if instant, ok := convertTime(value); !ok { + return "", false + } else if instant.IsZero() { + return "0", true + } else { + return instant.String(), true + } +} + +func convertTime(value reflect.Value) (t time.Time, ok bool) { + if value.Type() == timeType { + defer func() { recover() }() + t, ok = value.Interface().(time.Time) + } + return +} + +var timeType = reflect.TypeOf(time.Time{}) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/LICENSE b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..d645695673349e3947e8e5ae42332d0ac3164cd7 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/README.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/README.md new file mode 100644 index 0000000000000000000000000000000000000000..215a2bb7a8bb7927ceaa48303e17d7c2db668b28 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/README.md @@ -0,0 +1,58 @@ +[![GoDoc](https://godoc.org/github.com/smartystreets/assertions/internal/oglematchers?status.svg)](https://godoc.org/github.com/smartystreets/assertions/internal/oglematchers) + +`oglematchers` is a package for the Go programming language containing a set of +matchers, useful in a testing or mocking framework, inspired by and mostly +compatible with [Google Test][googletest] for C++ and +[Google JS Test][google-js-test]. The package is used by the +[ogletest][ogletest] testing framework and [oglemock][oglemock] mocking +framework, which may be more directly useful to you, but can be generically used +elsewhere as well. + +A "matcher" is simply an object with a `Matches` method defining a set of golang +values matched by the matcher, and a `Description` method describing that set. +For example, here are some matchers: + +```go +// Numbers +Equals(17.13) +LessThan(19) + +// Strings +Equals("taco") +HasSubstr("burrito") +MatchesRegex("t.*o") + +// Combining matchers +AnyOf(LessThan(17), GreaterThan(19)) +``` + +There are lots more; see [here][reference] for a reference. You can also add +your own simply by implementing the `oglematchers.Matcher` interface. + + +Installation +------------ + +First, make sure you have installed Go 1.0.2 or newer. See +[here][golang-install] for instructions. + +Use the following command to install `oglematchers` and keep it up to date: + + go get -u github.com/smartystreets/assertions/internal/oglematchers + + +Documentation +------------- + +See [here][reference] for documentation. Alternatively, you can install the +package and then use `godoc`: + + godoc github.com/smartystreets/assertions/internal/oglematchers + + +[reference]: http://godoc.org/github.com/smartystreets/assertions/internal/oglematchers +[golang-install]: http://golang.org/doc/install.html +[googletest]: http://code.google.com/p/googletest/ +[google-js-test]: http://code.google.com/p/google-js-test/ +[ogletest]: http://github.com/smartystreets/assertions/internal/ogletest +[oglemock]: http://github.com/smartystreets/assertions/internal/oglemock diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/any_of.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/any_of.go new file mode 100644 index 0000000000000000000000000000000000000000..2918b51f21afdc0176d77e53e5892327a97860e5 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/any_of.go @@ -0,0 +1,94 @@ +// Copyright 2011 Aaron Jacobs. All Rights Reserved. +// Author: aaronjjacobs@gmail.com (Aaron Jacobs) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT 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 oglematchers + +import ( + "errors" + "fmt" + "reflect" + "strings" +) + +// AnyOf accepts a set of values S and returns a matcher that follows the +// algorithm below when considering a candidate c: +// +// 1. If there exists a value m in S such that m implements the Matcher +// interface and m matches c, return true. +// +// 2. Otherwise, if there exists a value v in S such that v does not implement +// the Matcher interface and the matcher Equals(v) matches c, return true. +// +// 3. Otherwise, if there is a value m in S such that m implements the Matcher +// interface and m returns a fatal error for c, return that fatal error. +// +// 4. Otherwise, return false. +// +// This is akin to a logical OR operation for matchers, with non-matchers x +// being treated as Equals(x). +func AnyOf(vals ...interface{}) Matcher { + // Get ahold of a type variable for the Matcher interface. + var dummy *Matcher + matcherType := reflect.TypeOf(dummy).Elem() + + // Create a matcher for each value, or use the value itself if it's already a + // matcher. + wrapped := make([]Matcher, len(vals)) + for i, v := range vals { + t := reflect.TypeOf(v) + if t != nil && t.Implements(matcherType) { + wrapped[i] = v.(Matcher) + } else { + wrapped[i] = Equals(v) + } + } + + return &anyOfMatcher{wrapped} +} + +type anyOfMatcher struct { + wrapped []Matcher +} + +func (m *anyOfMatcher) Description() string { + wrappedDescs := make([]string, len(m.wrapped)) + for i, matcher := range m.wrapped { + wrappedDescs[i] = matcher.Description() + } + + return fmt.Sprintf("or(%s)", strings.Join(wrappedDescs, ", ")) +} + +func (m *anyOfMatcher) Matches(c interface{}) (err error) { + err = errors.New("") + + // Try each matcher in turn. + for _, matcher := range m.wrapped { + wrappedErr := matcher.Matches(c) + + // Return immediately if there's a match. + if wrappedErr == nil { + err = nil + return + } + + // Note the fatal error, if any. + if _, isFatal := wrappedErr.(*FatalError); isFatal { + err = wrappedErr + } + } + + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/contains.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/contains.go new file mode 100644 index 0000000000000000000000000000000000000000..87f107d3921ff44e615100318a7f5f8d3b7b7904 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/contains.go @@ -0,0 +1,61 @@ +// Copyright 2012 Aaron Jacobs. All Rights Reserved. +// Author: aaronjjacobs@gmail.com (Aaron Jacobs) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT 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 oglematchers + +import ( + "fmt" + "reflect" +) + +// Return a matcher that matches arrays slices with at least one element that +// matches the supplied argument. If the argument x is not itself a Matcher, +// this is equivalent to Contains(Equals(x)). +func Contains(x interface{}) Matcher { + var result containsMatcher + var ok bool + + if result.elementMatcher, ok = x.(Matcher); !ok { + result.elementMatcher = DeepEquals(x) + } + + return &result +} + +type containsMatcher struct { + elementMatcher Matcher +} + +func (m *containsMatcher) Description() string { + return fmt.Sprintf("contains: %s", m.elementMatcher.Description()) +} + +func (m *containsMatcher) Matches(candidate interface{}) error { + // The candidate must be a slice or an array. + v := reflect.ValueOf(candidate) + if v.Kind() != reflect.Slice && v.Kind() != reflect.Array { + return NewFatalError("which is not a slice or array") + } + + // Check each element. + for i := 0; i < v.Len(); i++ { + elem := v.Index(i) + if matchErr := m.elementMatcher.Matches(elem.Interface()); matchErr == nil { + return nil + } + } + + return fmt.Errorf("") +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/deep_equals.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/deep_equals.go new file mode 100644 index 0000000000000000000000000000000000000000..1d91baef32e8fe6083a04d07bad65a9b951d7220 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/deep_equals.go @@ -0,0 +1,88 @@ +// Copyright 2012 Aaron Jacobs. All Rights Reserved. +// Author: aaronjjacobs@gmail.com (Aaron Jacobs) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT 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 oglematchers + +import ( + "bytes" + "errors" + "fmt" + "reflect" +) + +var byteSliceType reflect.Type = reflect.TypeOf([]byte{}) + +// DeepEquals returns a matcher that matches based on 'deep equality', as +// defined by the reflect package. This matcher requires that values have +// identical types to x. +func DeepEquals(x interface{}) Matcher { + return &deepEqualsMatcher{x} +} + +type deepEqualsMatcher struct { + x interface{} +} + +func (m *deepEqualsMatcher) Description() string { + xDesc := fmt.Sprintf("%v", m.x) + xValue := reflect.ValueOf(m.x) + + // Special case: fmt.Sprintf presents nil slices as "[]", but + // reflect.DeepEqual makes a distinction between nil and empty slices. Make + // this less confusing. + if xValue.Kind() == reflect.Slice && xValue.IsNil() { + xDesc = "<nil slice>" + } + + return fmt.Sprintf("deep equals: %s", xDesc) +} + +func (m *deepEqualsMatcher) Matches(c interface{}) error { + // Make sure the types match. + ct := reflect.TypeOf(c) + xt := reflect.TypeOf(m.x) + + if ct != xt { + return NewFatalError(fmt.Sprintf("which is of type %v", ct)) + } + + // Special case: handle byte slices more efficiently. + cValue := reflect.ValueOf(c) + xValue := reflect.ValueOf(m.x) + + if ct == byteSliceType && !cValue.IsNil() && !xValue.IsNil() { + xBytes := m.x.([]byte) + cBytes := c.([]byte) + + if bytes.Equal(cBytes, xBytes) { + return nil + } + + return errors.New("") + } + + // Defer to the reflect package. + if reflect.DeepEqual(m.x, c) { + return nil + } + + // Special case: if the comparison failed because c is the nil slice, given + // an indication of this (since its value is printed as "[]"). + if cValue.Kind() == reflect.Slice && cValue.IsNil() { + return errors.New("which is nil") + } + + return errors.New("") +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/equals.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/equals.go new file mode 100644 index 0000000000000000000000000000000000000000..a510707b3c7eeb8faf64d42233c2b5bd1af099df --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/equals.go @@ -0,0 +1,541 @@ +// Copyright 2011 Aaron Jacobs. All Rights Reserved. +// Author: aaronjjacobs@gmail.com (Aaron Jacobs) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT 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 oglematchers + +import ( + "errors" + "fmt" + "math" + "reflect" +) + +// Equals(x) returns a matcher that matches values v such that v and x are +// equivalent. This includes the case when the comparison v == x using Go's +// built-in comparison operator is legal (except for structs, which this +// matcher does not support), but for convenience the following rules also +// apply: +// +// * Type checking is done based on underlying types rather than actual +// types, so that e.g. two aliases for string can be compared: +// +// type stringAlias1 string +// type stringAlias2 string +// +// a := "taco" +// b := stringAlias1("taco") +// c := stringAlias2("taco") +// +// ExpectTrue(a == b) // Legal, passes +// ExpectTrue(b == c) // Illegal, doesn't compile +// +// ExpectThat(a, Equals(b)) // Passes +// ExpectThat(b, Equals(c)) // Passes +// +// * Values of numeric type are treated as if they were abstract numbers, and +// compared accordingly. Therefore Equals(17) will match int(17), +// int16(17), uint(17), float32(17), complex64(17), and so on. +// +// If you want a stricter matcher that contains no such cleverness, see +// IdenticalTo instead. +// +// Arrays are supported by this matcher, but do not participate in the +// exceptions above. Two arrays compared with this matcher must have identical +// types, and their element type must itself be comparable according to Go's == +// operator. +func Equals(x interface{}) Matcher { + v := reflect.ValueOf(x) + + // This matcher doesn't support structs. + if v.Kind() == reflect.Struct { + panic(fmt.Sprintf("oglematchers.Equals: unsupported kind %v", v.Kind())) + } + + // The == operator is not defined for non-nil slices. + if v.Kind() == reflect.Slice && v.Pointer() != uintptr(0) { + panic(fmt.Sprintf("oglematchers.Equals: non-nil slice")) + } + + return &equalsMatcher{v} +} + +type equalsMatcher struct { + expectedValue reflect.Value +} + +//////////////////////////////////////////////////////////////////////// +// Numeric types +//////////////////////////////////////////////////////////////////////// + +func isSignedInteger(v reflect.Value) bool { + k := v.Kind() + return k >= reflect.Int && k <= reflect.Int64 +} + +func isUnsignedInteger(v reflect.Value) bool { + k := v.Kind() + return k >= reflect.Uint && k <= reflect.Uintptr +} + +func isInteger(v reflect.Value) bool { + return isSignedInteger(v) || isUnsignedInteger(v) +} + +func isFloat(v reflect.Value) bool { + k := v.Kind() + return k == reflect.Float32 || k == reflect.Float64 +} + +func isComplex(v reflect.Value) bool { + k := v.Kind() + return k == reflect.Complex64 || k == reflect.Complex128 +} + +func checkAgainstInt64(e int64, c reflect.Value) (err error) { + err = errors.New("") + + switch { + case isSignedInteger(c): + if c.Int() == e { + err = nil + } + + case isUnsignedInteger(c): + u := c.Uint() + if u <= math.MaxInt64 && int64(u) == e { + err = nil + } + + // Turn around the various floating point types so that the checkAgainst* + // functions for them can deal with precision issues. + case isFloat(c), isComplex(c): + return Equals(c.Interface()).Matches(e) + + default: + err = NewFatalError("which is not numeric") + } + + return +} + +func checkAgainstUint64(e uint64, c reflect.Value) (err error) { + err = errors.New("") + + switch { + case isSignedInteger(c): + i := c.Int() + if i >= 0 && uint64(i) == e { + err = nil + } + + case isUnsignedInteger(c): + if c.Uint() == e { + err = nil + } + + // Turn around the various floating point types so that the checkAgainst* + // functions for them can deal with precision issues. + case isFloat(c), isComplex(c): + return Equals(c.Interface()).Matches(e) + + default: + err = NewFatalError("which is not numeric") + } + + return +} + +func checkAgainstFloat32(e float32, c reflect.Value) (err error) { + err = errors.New("") + + switch { + case isSignedInteger(c): + if float32(c.Int()) == e { + err = nil + } + + case isUnsignedInteger(c): + if float32(c.Uint()) == e { + err = nil + } + + case isFloat(c): + // Compare using float32 to avoid a false sense of precision; otherwise + // e.g. Equals(float32(0.1)) won't match float32(0.1). + if float32(c.Float()) == e { + err = nil + } + + case isComplex(c): + comp := c.Complex() + rl := real(comp) + im := imag(comp) + + // Compare using float32 to avoid a false sense of precision; otherwise + // e.g. Equals(float32(0.1)) won't match (0.1 + 0i). + if im == 0 && float32(rl) == e { + err = nil + } + + default: + err = NewFatalError("which is not numeric") + } + + return +} + +func checkAgainstFloat64(e float64, c reflect.Value) (err error) { + err = errors.New("") + + ck := c.Kind() + + switch { + case isSignedInteger(c): + if float64(c.Int()) == e { + err = nil + } + + case isUnsignedInteger(c): + if float64(c.Uint()) == e { + err = nil + } + + // If the actual value is lower precision, turn the comparison around so we + // apply the low-precision rules. Otherwise, e.g. Equals(0.1) may not match + // float32(0.1). + case ck == reflect.Float32 || ck == reflect.Complex64: + return Equals(c.Interface()).Matches(e) + + // Otherwise, compare with double precision. + case isFloat(c): + if c.Float() == e { + err = nil + } + + case isComplex(c): + comp := c.Complex() + rl := real(comp) + im := imag(comp) + + if im == 0 && rl == e { + err = nil + } + + default: + err = NewFatalError("which is not numeric") + } + + return +} + +func checkAgainstComplex64(e complex64, c reflect.Value) (err error) { + err = errors.New("") + realPart := real(e) + imaginaryPart := imag(e) + + switch { + case isInteger(c) || isFloat(c): + // If we have no imaginary part, then we should just compare against the + // real part. Otherwise, we can't be equal. + if imaginaryPart != 0 { + return + } + + return checkAgainstFloat32(realPart, c) + + case isComplex(c): + // Compare using complex64 to avoid a false sense of precision; otherwise + // e.g. Equals(0.1 + 0i) won't match float32(0.1). + if complex64(c.Complex()) == e { + err = nil + } + + default: + err = NewFatalError("which is not numeric") + } + + return +} + +func checkAgainstComplex128(e complex128, c reflect.Value) (err error) { + err = errors.New("") + realPart := real(e) + imaginaryPart := imag(e) + + switch { + case isInteger(c) || isFloat(c): + // If we have no imaginary part, then we should just compare against the + // real part. Otherwise, we can't be equal. + if imaginaryPart != 0 { + return + } + + return checkAgainstFloat64(realPart, c) + + case isComplex(c): + if c.Complex() == e { + err = nil + } + + default: + err = NewFatalError("which is not numeric") + } + + return +} + +//////////////////////////////////////////////////////////////////////// +// Other types +//////////////////////////////////////////////////////////////////////// + +func checkAgainstBool(e bool, c reflect.Value) (err error) { + if c.Kind() != reflect.Bool { + err = NewFatalError("which is not a bool") + return + } + + err = errors.New("") + if c.Bool() == e { + err = nil + } + return +} + +func checkAgainstChan(e reflect.Value, c reflect.Value) (err error) { + // Create a description of e's type, e.g. "chan int". + typeStr := fmt.Sprintf("%s %s", e.Type().ChanDir(), e.Type().Elem()) + + // Make sure c is a chan of the correct type. + if c.Kind() != reflect.Chan || + c.Type().ChanDir() != e.Type().ChanDir() || + c.Type().Elem() != e.Type().Elem() { + err = NewFatalError(fmt.Sprintf("which is not a %s", typeStr)) + return + } + + err = errors.New("") + if c.Pointer() == e.Pointer() { + err = nil + } + return +} + +func checkAgainstFunc(e reflect.Value, c reflect.Value) (err error) { + // Make sure c is a function. + if c.Kind() != reflect.Func { + err = NewFatalError("which is not a function") + return + } + + err = errors.New("") + if c.Pointer() == e.Pointer() { + err = nil + } + return +} + +func checkAgainstMap(e reflect.Value, c reflect.Value) (err error) { + // Make sure c is a map. + if c.Kind() != reflect.Map { + err = NewFatalError("which is not a map") + return + } + + err = errors.New("") + if c.Pointer() == e.Pointer() { + err = nil + } + return +} + +func checkAgainstPtr(e reflect.Value, c reflect.Value) (err error) { + // Create a description of e's type, e.g. "*int". + typeStr := fmt.Sprintf("*%v", e.Type().Elem()) + + // Make sure c is a pointer of the correct type. + if c.Kind() != reflect.Ptr || + c.Type().Elem() != e.Type().Elem() { + err = NewFatalError(fmt.Sprintf("which is not a %s", typeStr)) + return + } + + err = errors.New("") + if c.Pointer() == e.Pointer() { + err = nil + } + return +} + +func checkAgainstSlice(e reflect.Value, c reflect.Value) (err error) { + // Create a description of e's type, e.g. "[]int". + typeStr := fmt.Sprintf("[]%v", e.Type().Elem()) + + // Make sure c is a slice of the correct type. + if c.Kind() != reflect.Slice || + c.Type().Elem() != e.Type().Elem() { + err = NewFatalError(fmt.Sprintf("which is not a %s", typeStr)) + return + } + + err = errors.New("") + if c.Pointer() == e.Pointer() { + err = nil + } + return +} + +func checkAgainstString(e reflect.Value, c reflect.Value) (err error) { + // Make sure c is a string. + if c.Kind() != reflect.String { + err = NewFatalError("which is not a string") + return + } + + err = errors.New("") + if c.String() == e.String() { + err = nil + } + return +} + +func checkAgainstArray(e reflect.Value, c reflect.Value) (err error) { + // Create a description of e's type, e.g. "[2]int". + typeStr := fmt.Sprintf("%v", e.Type()) + + // Make sure c is the correct type. + if c.Type() != e.Type() { + err = NewFatalError(fmt.Sprintf("which is not %s", typeStr)) + return + } + + // Check for equality. + if e.Interface() != c.Interface() { + err = errors.New("") + return + } + + return +} + +func checkAgainstUnsafePointer(e reflect.Value, c reflect.Value) (err error) { + // Make sure c is a pointer. + if c.Kind() != reflect.UnsafePointer { + err = NewFatalError("which is not a unsafe.Pointer") + return + } + + err = errors.New("") + if c.Pointer() == e.Pointer() { + err = nil + } + return +} + +func checkForNil(c reflect.Value) (err error) { + err = errors.New("") + + // Make sure it is legal to call IsNil. + switch c.Kind() { + case reflect.Invalid: + case reflect.Chan: + case reflect.Func: + case reflect.Interface: + case reflect.Map: + case reflect.Ptr: + case reflect.Slice: + + default: + err = NewFatalError("which cannot be compared to nil") + return + } + + // Ask whether the value is nil. Handle a nil literal (kind Invalid) + // specially, since it's not legal to call IsNil there. + if c.Kind() == reflect.Invalid || c.IsNil() { + err = nil + } + return +} + +//////////////////////////////////////////////////////////////////////// +// Public implementation +//////////////////////////////////////////////////////////////////////// + +func (m *equalsMatcher) Matches(candidate interface{}) error { + e := m.expectedValue + c := reflect.ValueOf(candidate) + ek := e.Kind() + + switch { + case ek == reflect.Bool: + return checkAgainstBool(e.Bool(), c) + + case isSignedInteger(e): + return checkAgainstInt64(e.Int(), c) + + case isUnsignedInteger(e): + return checkAgainstUint64(e.Uint(), c) + + case ek == reflect.Float32: + return checkAgainstFloat32(float32(e.Float()), c) + + case ek == reflect.Float64: + return checkAgainstFloat64(e.Float(), c) + + case ek == reflect.Complex64: + return checkAgainstComplex64(complex64(e.Complex()), c) + + case ek == reflect.Complex128: + return checkAgainstComplex128(complex128(e.Complex()), c) + + case ek == reflect.Chan: + return checkAgainstChan(e, c) + + case ek == reflect.Func: + return checkAgainstFunc(e, c) + + case ek == reflect.Map: + return checkAgainstMap(e, c) + + case ek == reflect.Ptr: + return checkAgainstPtr(e, c) + + case ek == reflect.Slice: + return checkAgainstSlice(e, c) + + case ek == reflect.String: + return checkAgainstString(e, c) + + case ek == reflect.Array: + return checkAgainstArray(e, c) + + case ek == reflect.UnsafePointer: + return checkAgainstUnsafePointer(e, c) + + case ek == reflect.Invalid: + return checkForNil(c) + } + + panic(fmt.Sprintf("equalsMatcher.Matches: unexpected kind: %v", ek)) +} + +func (m *equalsMatcher) Description() string { + // Special case: handle nil. + if !m.expectedValue.IsValid() { + return "is nil" + } + + return fmt.Sprintf("%v", m.expectedValue.Interface()) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/greater_or_equal.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/greater_or_equal.go new file mode 100644 index 0000000000000000000000000000000000000000..4b9d103a381892c91a68d7038dbefe956dee11db --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/greater_or_equal.go @@ -0,0 +1,39 @@ +// Copyright 2011 Aaron Jacobs. All Rights Reserved. +// Author: aaronjjacobs@gmail.com (Aaron Jacobs) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT 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 oglematchers + +import ( + "fmt" + "reflect" +) + +// GreaterOrEqual returns a matcher that matches integer, floating point, or +// strings values v such that v >= x. Comparison is not defined between numeric +// and string types, but is defined between all integer and floating point +// types. +// +// x must itself be an integer, floating point, or string type; otherwise, +// GreaterOrEqual will panic. +func GreaterOrEqual(x interface{}) Matcher { + desc := fmt.Sprintf("greater than or equal to %v", x) + + // Special case: make it clear that strings are strings. + if reflect.TypeOf(x).Kind() == reflect.String { + desc = fmt.Sprintf("greater than or equal to \"%s\"", x) + } + + return transformDescription(Not(LessThan(x)), desc) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/greater_than.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/greater_than.go new file mode 100644 index 0000000000000000000000000000000000000000..3eef32178f8c153027cacc8d3a334a701868ff75 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/greater_than.go @@ -0,0 +1,39 @@ +// Copyright 2011 Aaron Jacobs. All Rights Reserved. +// Author: aaronjjacobs@gmail.com (Aaron Jacobs) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT 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 oglematchers + +import ( + "fmt" + "reflect" +) + +// GreaterThan returns a matcher that matches integer, floating point, or +// strings values v such that v > x. Comparison is not defined between numeric +// and string types, but is defined between all integer and floating point +// types. +// +// x must itself be an integer, floating point, or string type; otherwise, +// GreaterThan will panic. +func GreaterThan(x interface{}) Matcher { + desc := fmt.Sprintf("greater than %v", x) + + // Special case: make it clear that strings are strings. + if reflect.TypeOf(x).Kind() == reflect.String { + desc = fmt.Sprintf("greater than \"%s\"", x) + } + + return transformDescription(Not(LessOrEqual(x)), desc) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/less_or_equal.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/less_or_equal.go new file mode 100644 index 0000000000000000000000000000000000000000..8402cdeaf09961fb49749b4a041a404cdf7cda5e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/less_or_equal.go @@ -0,0 +1,41 @@ +// Copyright 2011 Aaron Jacobs. All Rights Reserved. +// Author: aaronjjacobs@gmail.com (Aaron Jacobs) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT 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 oglematchers + +import ( + "fmt" + "reflect" +) + +// LessOrEqual returns a matcher that matches integer, floating point, or +// strings values v such that v <= x. Comparison is not defined between numeric +// and string types, but is defined between all integer and floating point +// types. +// +// x must itself be an integer, floating point, or string type; otherwise, +// LessOrEqual will panic. +func LessOrEqual(x interface{}) Matcher { + desc := fmt.Sprintf("less than or equal to %v", x) + + // Special case: make it clear that strings are strings. + if reflect.TypeOf(x).Kind() == reflect.String { + desc = fmt.Sprintf("less than or equal to \"%s\"", x) + } + + // Put LessThan last so that its error messages will be used in the event of + // failure. + return transformDescription(AnyOf(Equals(x), LessThan(x)), desc) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/less_than.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/less_than.go new file mode 100644 index 0000000000000000000000000000000000000000..8258e45d99d83db0050d105e8114c8dfa5dbbabd --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/less_than.go @@ -0,0 +1,152 @@ +// Copyright 2011 Aaron Jacobs. All Rights Reserved. +// Author: aaronjjacobs@gmail.com (Aaron Jacobs) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT 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 oglematchers + +import ( + "errors" + "fmt" + "math" + "reflect" +) + +// LessThan returns a matcher that matches integer, floating point, or strings +// values v such that v < x. Comparison is not defined between numeric and +// string types, but is defined between all integer and floating point types. +// +// x must itself be an integer, floating point, or string type; otherwise, +// LessThan will panic. +func LessThan(x interface{}) Matcher { + v := reflect.ValueOf(x) + kind := v.Kind() + + switch { + case isInteger(v): + case isFloat(v): + case kind == reflect.String: + + default: + panic(fmt.Sprintf("LessThan: unexpected kind %v", kind)) + } + + return &lessThanMatcher{v} +} + +type lessThanMatcher struct { + limit reflect.Value +} + +func (m *lessThanMatcher) Description() string { + // Special case: make it clear that strings are strings. + if m.limit.Kind() == reflect.String { + return fmt.Sprintf("less than \"%s\"", m.limit.String()) + } + + return fmt.Sprintf("less than %v", m.limit.Interface()) +} + +func compareIntegers(v1, v2 reflect.Value) (err error) { + err = errors.New("") + + switch { + case isSignedInteger(v1) && isSignedInteger(v2): + if v1.Int() < v2.Int() { + err = nil + } + return + + case isSignedInteger(v1) && isUnsignedInteger(v2): + if v1.Int() < 0 || uint64(v1.Int()) < v2.Uint() { + err = nil + } + return + + case isUnsignedInteger(v1) && isSignedInteger(v2): + if v1.Uint() <= math.MaxInt64 && int64(v1.Uint()) < v2.Int() { + err = nil + } + return + + case isUnsignedInteger(v1) && isUnsignedInteger(v2): + if v1.Uint() < v2.Uint() { + err = nil + } + return + } + + panic(fmt.Sprintf("compareIntegers: %v %v", v1, v2)) +} + +func getFloat(v reflect.Value) float64 { + switch { + case isSignedInteger(v): + return float64(v.Int()) + + case isUnsignedInteger(v): + return float64(v.Uint()) + + case isFloat(v): + return v.Float() + } + + panic(fmt.Sprintf("getFloat: %v", v)) +} + +func (m *lessThanMatcher) Matches(c interface{}) (err error) { + v1 := reflect.ValueOf(c) + v2 := m.limit + + err = errors.New("") + + // Handle strings as a special case. + if v1.Kind() == reflect.String && v2.Kind() == reflect.String { + if v1.String() < v2.String() { + err = nil + } + return + } + + // If we get here, we require that we are dealing with integers or floats. + v1Legal := isInteger(v1) || isFloat(v1) + v2Legal := isInteger(v2) || isFloat(v2) + if !v1Legal || !v2Legal { + err = NewFatalError("which is not comparable") + return + } + + // Handle the various comparison cases. + switch { + // Both integers + case isInteger(v1) && isInteger(v2): + return compareIntegers(v1, v2) + + // At least one float32 + case v1.Kind() == reflect.Float32 || v2.Kind() == reflect.Float32: + if float32(getFloat(v1)) < float32(getFloat(v2)) { + err = nil + } + return + + // At least one float64 + case v1.Kind() == reflect.Float64 || v2.Kind() == reflect.Float64: + if getFloat(v1) < getFloat(v2) { + err = nil + } + return + } + + // We shouldn't get here. + panic(fmt.Sprintf("lessThanMatcher.Matches: Shouldn't get here: %v %v", v1, v2)) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/matcher.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/matcher.go new file mode 100644 index 0000000000000000000000000000000000000000..78159a0727c0dca65d0ee8adfc949a9ac4cfce56 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/matcher.go @@ -0,0 +1,86 @@ +// Copyright 2011 Aaron Jacobs. All Rights Reserved. +// Author: aaronjjacobs@gmail.com (Aaron Jacobs) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT 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 oglematchers provides a set of matchers useful in a testing or +// mocking framework. These matchers are inspired by and mostly compatible with +// Google Test for C++ and Google JS Test. +// +// This package is used by github.com/smartystreets/assertions/internal/ogletest and +// github.com/smartystreets/assertions/internal/oglemock, which may be more directly useful if you're not +// writing your own testing package or defining your own matchers. +package oglematchers + +// A Matcher is some predicate implicitly defining a set of values that it +// matches. For example, GreaterThan(17) matches all numeric values greater +// than 17, and HasSubstr("taco") matches all strings with the substring +// "taco". +// +// Matchers are typically exposed to tests via constructor functions like +// HasSubstr. In order to implement such a function you can either define your +// own matcher type or use NewMatcher. +type Matcher interface { + // Check whether the supplied value belongs to the the set defined by the + // matcher. Return a non-nil error if and only if it does not. + // + // The error describes why the value doesn't match. The error text is a + // relative clause that is suitable for being placed after the value. For + // example, a predicate that matches strings with a particular substring may, + // when presented with a numerical value, return the following error text: + // + // "which is not a string" + // + // Then the failure message may look like: + // + // Expected: has substring "taco" + // Actual: 17, which is not a string + // + // If the error is self-apparent based on the description of the matcher, the + // error text may be empty (but the error still non-nil). For example: + // + // Expected: 17 + // Actual: 19 + // + // If you are implementing a new matcher, see also the documentation on + // FatalError. + Matches(candidate interface{}) error + + // Description returns a string describing the property that values matching + // this matcher have, as a verb phrase where the subject is the value. For + // example, "is greather than 17" or "has substring "taco"". + Description() string +} + +// FatalError is an implementation of the error interface that may be returned +// from matchers, indicating the error should be propagated. Returning a +// *FatalError indicates that the matcher doesn't process values of the +// supplied type, or otherwise doesn't know how to handle the value. +// +// For example, if GreaterThan(17) returned false for the value "taco" without +// a fatal error, then Not(GreaterThan(17)) would return true. This is +// technically correct, but is surprising and may mask failures where the wrong +// sort of matcher is accidentally used. Instead, GreaterThan(17) can return a +// fatal error, which will be propagated by Not(). +type FatalError struct { + errorText string +} + +// NewFatalError creates a FatalError struct with the supplied error text. +func NewFatalError(s string) *FatalError { + return &FatalError{s} +} + +func (e *FatalError) Error() string { + return e.errorText +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/not.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/not.go new file mode 100644 index 0000000000000000000000000000000000000000..623789fe28a83450b58b4848e889ff399d741a64 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/not.go @@ -0,0 +1,53 @@ +// Copyright 2011 Aaron Jacobs. All Rights Reserved. +// Author: aaronjjacobs@gmail.com (Aaron Jacobs) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT 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 oglematchers + +import ( + "errors" + "fmt" +) + +// Not returns a matcher that inverts the set of values matched by the wrapped +// matcher. It does not transform the result for values for which the wrapped +// matcher returns a fatal error. +func Not(m Matcher) Matcher { + return &notMatcher{m} +} + +type notMatcher struct { + wrapped Matcher +} + +func (m *notMatcher) Matches(c interface{}) (err error) { + err = m.wrapped.Matches(c) + + // Did the wrapped matcher say yes? + if err == nil { + return errors.New("") + } + + // Did the wrapped matcher return a fatal error? + if _, isFatal := err.(*FatalError); isFatal { + return err + } + + // The wrapped matcher returned a non-fatal error. + return nil +} + +func (m *notMatcher) Description() string { + return fmt.Sprintf("not(%s)", m.wrapped.Description()) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/transform_description.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/transform_description.go new file mode 100644 index 0000000000000000000000000000000000000000..8ea2807c6f4e143b32a5013175d1bec4b3df03f0 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/internal/oglematchers/transform_description.go @@ -0,0 +1,36 @@ +// Copyright 2011 Aaron Jacobs. All Rights Reserved. +// Author: aaronjjacobs@gmail.com (Aaron Jacobs) +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT 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 oglematchers + +// transformDescription returns a matcher that is equivalent to the supplied +// one, except that it has the supplied description instead of the one attached +// to the existing matcher. +func transformDescription(m Matcher, newDesc string) Matcher { + return &transformDescriptionMatcher{newDesc, m} +} + +type transformDescriptionMatcher struct { + desc string + wrappedMatcher Matcher +} + +func (m *transformDescriptionMatcher) Description() string { + return m.desc +} + +func (m *transformDescriptionMatcher) Matches(c interface{}) error { + return m.wrappedMatcher.Matches(c) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/messages.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/messages.go new file mode 100644 index 0000000000000000000000000000000000000000..6ed7dc2ae99a7b975501e0bea3ef2ac2deaf21de --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/messages.go @@ -0,0 +1,97 @@ +package assertions + +const ( // equality + shouldHaveBeenEqual = "Expected: '%v'\nActual: '%v'\n(Should be equal)" + shouldNotHaveBeenEqual = "Expected '%v'\nto NOT equal '%v'\n(but it did)!" + shouldHaveBeenEqualTypeMismatch = "Expected: '%v' (%T)\nActual: '%v' (%T)\n(Should be equal, type mismatch)" + shouldHaveBeenAlmostEqual = "Expected '%v' to almost equal '%v' (but it didn't)!" + shouldHaveNotBeenAlmostEqual = "Expected '%v' to NOT almost equal '%v' (but it did)!" + shouldHaveResembled = "Expected: '%s'\nActual: '%s'\n(Should resemble)!" + shouldNotHaveResembled = "Expected '%#v'\nto NOT resemble '%#v'\n(but it did)!" + shouldBePointers = "Both arguments should be pointers " + shouldHaveBeenNonNilPointer = shouldBePointers + "(the %s was %s)!" + shouldHavePointedTo = "Expected '%+v' (address: '%v') and '%+v' (address: '%v') to be the same address (but their weren't)!" + shouldNotHavePointedTo = "Expected '%+v' and '%+v' to be different references (but they matched: '%v')!" + shouldHaveBeenNil = "Expected: nil\nActual: '%v'" + shouldNotHaveBeenNil = "Expected '%+v' to NOT be nil (but it was)!" + shouldHaveBeenTrue = "Expected: true\nActual: %v" + shouldHaveBeenFalse = "Expected: false\nActual: %v" + shouldHaveBeenZeroValue = "'%+v' should have been the zero value" //"Expected: (zero value)\nActual: %v" + shouldNotHaveBeenZeroValue = "'%+v' should NOT have been the zero value" +) + +const ( // quantity comparisons + shouldHaveBeenGreater = "Expected '%v' to be greater than '%v' (but it wasn't)!" + shouldHaveBeenGreaterOrEqual = "Expected '%v' to be greater than or equal to '%v' (but it wasn't)!" + shouldHaveBeenLess = "Expected '%v' to be less than '%v' (but it wasn't)!" + shouldHaveBeenLessOrEqual = "Expected '%v' to be less than or equal to '%v' (but it wasn't)!" + shouldHaveBeenBetween = "Expected '%v' to be between '%v' and '%v' (but it wasn't)!" + shouldNotHaveBeenBetween = "Expected '%v' NOT to be between '%v' and '%v' (but it was)!" + shouldHaveDifferentUpperAndLower = "The lower and upper bounds must be different values (they were both '%v')." + shouldHaveBeenBetweenOrEqual = "Expected '%v' to be between '%v' and '%v' or equal to one of them (but it wasn't)!" + shouldNotHaveBeenBetweenOrEqual = "Expected '%v' NOT to be between '%v' and '%v' or equal to one of them (but it was)!" +) + +const ( // collections + shouldHaveContained = "Expected the container (%v) to contain: '%v' (but it didn't)!" + shouldNotHaveContained = "Expected the container (%v) NOT to contain: '%v' (but it did)!" + shouldHaveContainedKey = "Expected the %v to contain the key: %v (but it didn't)!" + shouldNotHaveContainedKey = "Expected the %v NOT to contain the key: %v (but it did)!" + shouldHaveBeenIn = "Expected '%v' to be in the container (%v), but it wasn't!" + shouldNotHaveBeenIn = "Expected '%v' NOT to be in the container (%v), but it was!" + shouldHaveBeenAValidCollection = "You must provide a valid container (was %v)!" + shouldHaveBeenAValidMap = "You must provide a valid map type (was %v)!" + shouldHaveBeenEmpty = "Expected %+v to be empty (but it wasn't)!" + shouldNotHaveBeenEmpty = "Expected %+v to NOT be empty (but it was)!" + shouldHaveBeenAValidInteger = "You must provide a valid integer (was %v)!" + shouldHaveBeenAValidLength = "You must provide a valid positive integer (was %v)!" + shouldHaveHadLength = "Expected collection to have length equal to [%v], but it's length was [%v] instead! contents: %+v" +) + +const ( // strings + shouldHaveStartedWith = "Expected '%v'\nto start with '%v'\n(but it didn't)!" + shouldNotHaveStartedWith = "Expected '%v'\nNOT to start with '%v'\n(but it did)!" + shouldHaveEndedWith = "Expected '%v'\nto end with '%v'\n(but it didn't)!" + shouldNotHaveEndedWith = "Expected '%v'\nNOT to end with '%v'\n(but it did)!" + shouldAllBeStrings = "All arguments to this assertion must be strings (you provided: %v)." + shouldBothBeStrings = "Both arguments to this assertion must be strings (you provided %v and %v)." + shouldBeString = "The argument to this assertion must be a string (you provided %v)." + shouldHaveContainedSubstring = "Expected '%s' to contain substring '%s' (but it didn't)!" + shouldNotHaveContainedSubstring = "Expected '%s' NOT to contain substring '%s' (but it did)!" + shouldHaveBeenBlank = "Expected '%s' to be blank (but it wasn't)!" + shouldNotHaveBeenBlank = "Expected value to NOT be blank (but it was)!" +) + +const ( // panics + shouldUseVoidNiladicFunction = "You must provide a void, niladic function as the first argument!" + shouldHavePanickedWith = "Expected func() to panic with '%v' (but it panicked with '%v')!" + shouldHavePanicked = "Expected func() to panic (but it didn't)!" + shouldNotHavePanicked = "Expected func() NOT to panic (error: '%+v')!" + shouldNotHavePanickedWith = "Expected func() NOT to panic with '%v' (but it did)!" +) + +const ( // type checking + shouldHaveBeenA = "Expected '%v' to be: '%v' (but was: '%v')!" + shouldNotHaveBeenA = "Expected '%v' to NOT be: '%v' (but it was)!" + + shouldHaveImplemented = "Expected: '%v interface support'\nActual: '%v' does not implement the interface!" + shouldNotHaveImplemented = "Expected '%v'\nto NOT implement '%v'\n(but it did)!" + shouldCompareWithInterfacePointer = "The expected value must be a pointer to an interface type (eg. *fmt.Stringer)" + shouldNotBeNilActual = "The actual value was 'nil' and should be a value or a pointer to a value!" + + shouldBeError = "Expected an error value (but was '%v' instead)!" + shouldBeErrorInvalidComparisonValue = "The final argument to this assertion must be a string or an error value (you provided: '%v')." +) + +const ( // time comparisons + shouldUseTimes = "You must provide time instances as arguments to this assertion." + shouldUseTimeSlice = "You must provide a slice of time instances as the first argument to this assertion." + shouldUseDurationAndTime = "You must provide a duration and a time as arguments to this assertion." + shouldHaveHappenedBefore = "Expected '%v' to happen before '%v' (it happened '%v' after)!" + shouldHaveHappenedAfter = "Expected '%v' to happen after '%v' (it happened '%v' before)!" + shouldHaveHappenedBetween = "Expected '%v' to happen between '%v' and '%v' (it happened '%v' outside threshold)!" + shouldNotHaveHappenedOnOrBetween = "Expected '%v' to NOT happen on or between '%v' and '%v' (but it did)!" + + // format params: incorrect-index, previous-index, previous-time, incorrect-index, incorrect-time + shouldHaveBeenChronological = "The 'Time' at index [%d] should have happened after the previous one (but it didn't!):\n [%d]: %s\n [%d]: %s (see, it happened before!)" +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/panic.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/panic.go new file mode 100644 index 0000000000000000000000000000000000000000..7e75db1784b116d1569959742326efe299d739b0 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/panic.go @@ -0,0 +1,115 @@ +package assertions + +import "fmt" + +// ShouldPanic receives a void, niladic function and expects to recover a panic. +func ShouldPanic(actual interface{}, expected ...interface{}) (message string) { + if fail := need(0, expected); fail != success { + return fail + } + + action, _ := actual.(func()) + + if action == nil { + message = shouldUseVoidNiladicFunction + return + } + + defer func() { + recovered := recover() + if recovered == nil { + message = shouldHavePanicked + } else { + message = success + } + }() + action() + + return +} + +// ShouldNotPanic receives a void, niladic function and expects to execute the function without any panic. +func ShouldNotPanic(actual interface{}, expected ...interface{}) (message string) { + if fail := need(0, expected); fail != success { + return fail + } + + action, _ := actual.(func()) + + if action == nil { + message = shouldUseVoidNiladicFunction + return + } + + defer func() { + recovered := recover() + if recovered != nil { + message = fmt.Sprintf(shouldNotHavePanicked, recovered) + } else { + message = success + } + }() + action() + + return +} + +// ShouldPanicWith receives a void, niladic function and expects to recover a panic with the second argument as the content. +func ShouldPanicWith(actual interface{}, expected ...interface{}) (message string) { + if fail := need(1, expected); fail != success { + return fail + } + + action, _ := actual.(func()) + + if action == nil { + message = shouldUseVoidNiladicFunction + return + } + + defer func() { + recovered := recover() + if recovered == nil { + message = shouldHavePanicked + } else { + if equal := ShouldEqual(recovered, expected[0]); equal != success { + message = serializer.serialize(expected[0], recovered, fmt.Sprintf(shouldHavePanickedWith, expected[0], recovered)) + } else { + message = success + } + } + }() + action() + + return +} + +// ShouldNotPanicWith receives a void, niladic function and expects to recover a panic whose content differs from the second argument. +func ShouldNotPanicWith(actual interface{}, expected ...interface{}) (message string) { + if fail := need(1, expected); fail != success { + return fail + } + + action, _ := actual.(func()) + + if action == nil { + message = shouldUseVoidNiladicFunction + return + } + + defer func() { + recovered := recover() + if recovered == nil { + message = success + } else { + if equal := ShouldEqual(recovered, expected[0]); equal == success { + message = fmt.Sprintf(shouldNotHavePanickedWith, expected[0]) + } else { + message = success + } + } + }() + action() + + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/quantity.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/quantity.go new file mode 100644 index 0000000000000000000000000000000000000000..f28b0a062ba5c907cc7b941932c10f7ebb23a9b8 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/quantity.go @@ -0,0 +1,141 @@ +package assertions + +import ( + "fmt" + + "github.com/smartystreets/assertions/internal/oglematchers" +) + +// ShouldBeGreaterThan receives exactly two parameters and ensures that the first is greater than the second. +func ShouldBeGreaterThan(actual interface{}, expected ...interface{}) string { + if fail := need(1, expected); fail != success { + return fail + } + + if matchError := oglematchers.GreaterThan(expected[0]).Matches(actual); matchError != nil { + return fmt.Sprintf(shouldHaveBeenGreater, actual, expected[0]) + } + return success +} + +// ShouldBeGreaterThanOrEqualTo receives exactly two parameters and ensures that the first is greater than or equal to the second. +func ShouldBeGreaterThanOrEqualTo(actual interface{}, expected ...interface{}) string { + if fail := need(1, expected); fail != success { + return fail + } else if matchError := oglematchers.GreaterOrEqual(expected[0]).Matches(actual); matchError != nil { + return fmt.Sprintf(shouldHaveBeenGreaterOrEqual, actual, expected[0]) + } + return success +} + +// ShouldBeLessThan receives exactly two parameters and ensures that the first is less than the second. +func ShouldBeLessThan(actual interface{}, expected ...interface{}) string { + if fail := need(1, expected); fail != success { + return fail + } else if matchError := oglematchers.LessThan(expected[0]).Matches(actual); matchError != nil { + return fmt.Sprintf(shouldHaveBeenLess, actual, expected[0]) + } + return success +} + +// ShouldBeLessThan receives exactly two parameters and ensures that the first is less than or equal to the second. +func ShouldBeLessThanOrEqualTo(actual interface{}, expected ...interface{}) string { + if fail := need(1, expected); fail != success { + return fail + } else if matchError := oglematchers.LessOrEqual(expected[0]).Matches(actual); matchError != nil { + return fmt.Sprintf(shouldHaveBeenLessOrEqual, actual, expected[0]) + } + return success +} + +// ShouldBeBetween receives exactly three parameters: an actual value, a lower bound, and an upper bound. +// It ensures that the actual value is between both bounds (but not equal to either of them). +func ShouldBeBetween(actual interface{}, expected ...interface{}) string { + if fail := need(2, expected); fail != success { + return fail + } + lower, upper, fail := deriveBounds(expected) + + if fail != success { + return fail + } else if !isBetween(actual, lower, upper) { + return fmt.Sprintf(shouldHaveBeenBetween, actual, lower, upper) + } + return success +} + +// ShouldNotBeBetween receives exactly three parameters: an actual value, a lower bound, and an upper bound. +// It ensures that the actual value is NOT between both bounds. +func ShouldNotBeBetween(actual interface{}, expected ...interface{}) string { + if fail := need(2, expected); fail != success { + return fail + } + lower, upper, fail := deriveBounds(expected) + + if fail != success { + return fail + } else if isBetween(actual, lower, upper) { + return fmt.Sprintf(shouldNotHaveBeenBetween, actual, lower, upper) + } + return success +} +func deriveBounds(values []interface{}) (lower interface{}, upper interface{}, fail string) { + lower = values[0] + upper = values[1] + + if ShouldNotEqual(lower, upper) != success { + return nil, nil, fmt.Sprintf(shouldHaveDifferentUpperAndLower, lower) + } else if ShouldBeLessThan(lower, upper) != success { + lower, upper = upper, lower + } + return lower, upper, success +} +func isBetween(value, lower, upper interface{}) bool { + if ShouldBeGreaterThan(value, lower) != success { + return false + } else if ShouldBeLessThan(value, upper) != success { + return false + } + return true +} + +// ShouldBeBetweenOrEqual receives exactly three parameters: an actual value, a lower bound, and an upper bound. +// It ensures that the actual value is between both bounds or equal to one of them. +func ShouldBeBetweenOrEqual(actual interface{}, expected ...interface{}) string { + if fail := need(2, expected); fail != success { + return fail + } + lower, upper, fail := deriveBounds(expected) + + if fail != success { + return fail + } else if !isBetweenOrEqual(actual, lower, upper) { + return fmt.Sprintf(shouldHaveBeenBetweenOrEqual, actual, lower, upper) + } + return success +} + +// ShouldNotBeBetweenOrEqual receives exactly three parameters: an actual value, a lower bound, and an upper bound. +// It ensures that the actual value is nopt between the bounds nor equal to either of them. +func ShouldNotBeBetweenOrEqual(actual interface{}, expected ...interface{}) string { + if fail := need(2, expected); fail != success { + return fail + } + lower, upper, fail := deriveBounds(expected) + + if fail != success { + return fail + } else if isBetweenOrEqual(actual, lower, upper) { + return fmt.Sprintf(shouldNotHaveBeenBetweenOrEqual, actual, lower, upper) + } + return success +} + +func isBetweenOrEqual(value, lower, upper interface{}) bool { + if ShouldBeGreaterThanOrEqualTo(value, lower) != success { + return false + } else if ShouldBeLessThanOrEqualTo(value, upper) != success { + return false + } + return true +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/serializer.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/serializer.go new file mode 100644 index 0000000000000000000000000000000000000000..fa32f9403fa057e7e2b15385aa05bccedf2c1ee2 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/serializer.go @@ -0,0 +1,63 @@ +package assertions + +import ( + "encoding/json" + "fmt" + + "github.com/smartystreets/assertions/internal/go-render/render" +) + +type Serializer interface { + serialize(expected, actual interface{}, message string) string + serializeDetailed(expected, actual interface{}, message string) string +} + +type failureSerializer struct{} + +func (self *failureSerializer) serializeDetailed(expected, actual interface{}, message string) string { + view := FailureView{ + Message: message, + Expected: render.Render(expected), + Actual: render.Render(actual), + } + serialized, _ := json.Marshal(view) + return string(serialized) +} + +func (self *failureSerializer) serialize(expected, actual interface{}, message string) string { + view := FailureView{ + Message: message, + Expected: fmt.Sprintf("%+v", expected), + Actual: fmt.Sprintf("%+v", actual), + } + serialized, _ := json.Marshal(view) + return string(serialized) +} + +func newSerializer() *failureSerializer { + return &failureSerializer{} +} + +/////////////////////////////////////////////////////////////////////////////// + +// This struct is also declared in github.com/smartystreets/goconvey/convey/reporting. +// The json struct tags should be equal in both declarations. +type FailureView struct { + Message string `json:"Message"` + Expected string `json:"Expected"` + Actual string `json:"Actual"` +} + +/////////////////////////////////////////////////////// + +// noopSerializer just gives back the original message. This is useful when we are using +// the assertions from a context other than the GoConvey Web UI, that requires the JSON +// structure provided by the failureSerializer. +type noopSerializer struct{} + +func (self *noopSerializer) serialize(expected, actual interface{}, message string) string { + return message +} +func (self *noopSerializer) serializeDetailed(expected, actual interface{}, message string) string { + return message +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/strings.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/strings.go new file mode 100644 index 0000000000000000000000000000000000000000..dbc3f04790e0126c26f08539c86b6d03ddbf68b3 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/strings.go @@ -0,0 +1,227 @@ +package assertions + +import ( + "fmt" + "reflect" + "strings" +) + +// ShouldStartWith receives exactly 2 string parameters and ensures that the first starts with the second. +func ShouldStartWith(actual interface{}, expected ...interface{}) string { + if fail := need(1, expected); fail != success { + return fail + } + + value, valueIsString := actual.(string) + prefix, prefixIsString := expected[0].(string) + + if !valueIsString || !prefixIsString { + return fmt.Sprintf(shouldBothBeStrings, reflect.TypeOf(actual), reflect.TypeOf(expected[0])) + } + + return shouldStartWith(value, prefix) +} +func shouldStartWith(value, prefix string) string { + if !strings.HasPrefix(value, prefix) { + shortval := value + if len(shortval) > len(prefix) { + shortval = shortval[:len(prefix)] + "..." + } + return serializer.serialize(prefix, shortval, fmt.Sprintf(shouldHaveStartedWith, value, prefix)) + } + return success +} + +// ShouldNotStartWith receives exactly 2 string parameters and ensures that the first does not start with the second. +func ShouldNotStartWith(actual interface{}, expected ...interface{}) string { + if fail := need(1, expected); fail != success { + return fail + } + + value, valueIsString := actual.(string) + prefix, prefixIsString := expected[0].(string) + + if !valueIsString || !prefixIsString { + return fmt.Sprintf(shouldBothBeStrings, reflect.TypeOf(actual), reflect.TypeOf(expected[0])) + } + + return shouldNotStartWith(value, prefix) +} +func shouldNotStartWith(value, prefix string) string { + if strings.HasPrefix(value, prefix) { + if value == "" { + value = "<empty>" + } + if prefix == "" { + prefix = "<empty>" + } + return fmt.Sprintf(shouldNotHaveStartedWith, value, prefix) + } + return success +} + +// ShouldEndWith receives exactly 2 string parameters and ensures that the first ends with the second. +func ShouldEndWith(actual interface{}, expected ...interface{}) string { + if fail := need(1, expected); fail != success { + return fail + } + + value, valueIsString := actual.(string) + suffix, suffixIsString := expected[0].(string) + + if !valueIsString || !suffixIsString { + return fmt.Sprintf(shouldBothBeStrings, reflect.TypeOf(actual), reflect.TypeOf(expected[0])) + } + + return shouldEndWith(value, suffix) +} +func shouldEndWith(value, suffix string) string { + if !strings.HasSuffix(value, suffix) { + shortval := value + if len(shortval) > len(suffix) { + shortval = "..." + shortval[len(shortval)-len(suffix):] + } + return serializer.serialize(suffix, shortval, fmt.Sprintf(shouldHaveEndedWith, value, suffix)) + } + return success +} + +// ShouldEndWith receives exactly 2 string parameters and ensures that the first does not end with the second. +func ShouldNotEndWith(actual interface{}, expected ...interface{}) string { + if fail := need(1, expected); fail != success { + return fail + } + + value, valueIsString := actual.(string) + suffix, suffixIsString := expected[0].(string) + + if !valueIsString || !suffixIsString { + return fmt.Sprintf(shouldBothBeStrings, reflect.TypeOf(actual), reflect.TypeOf(expected[0])) + } + + return shouldNotEndWith(value, suffix) +} +func shouldNotEndWith(value, suffix string) string { + if strings.HasSuffix(value, suffix) { + if value == "" { + value = "<empty>" + } + if suffix == "" { + suffix = "<empty>" + } + return fmt.Sprintf(shouldNotHaveEndedWith, value, suffix) + } + return success +} + +// ShouldContainSubstring receives exactly 2 string parameters and ensures that the first contains the second as a substring. +func ShouldContainSubstring(actual interface{}, expected ...interface{}) string { + if fail := need(1, expected); fail != success { + return fail + } + + long, longOk := actual.(string) + short, shortOk := expected[0].(string) + + if !longOk || !shortOk { + return fmt.Sprintf(shouldBothBeStrings, reflect.TypeOf(actual), reflect.TypeOf(expected[0])) + } + + if !strings.Contains(long, short) { + return serializer.serialize(expected[0], actual, fmt.Sprintf(shouldHaveContainedSubstring, long, short)) + } + return success +} + +// ShouldNotContainSubstring receives exactly 2 string parameters and ensures that the first does NOT contain the second as a substring. +func ShouldNotContainSubstring(actual interface{}, expected ...interface{}) string { + if fail := need(1, expected); fail != success { + return fail + } + + long, longOk := actual.(string) + short, shortOk := expected[0].(string) + + if !longOk || !shortOk { + return fmt.Sprintf(shouldBothBeStrings, reflect.TypeOf(actual), reflect.TypeOf(expected[0])) + } + + if strings.Contains(long, short) { + return fmt.Sprintf(shouldNotHaveContainedSubstring, long, short) + } + return success +} + +// ShouldBeBlank receives exactly 1 string parameter and ensures that it is equal to "". +func ShouldBeBlank(actual interface{}, expected ...interface{}) string { + if fail := need(0, expected); fail != success { + return fail + } + value, ok := actual.(string) + if !ok { + return fmt.Sprintf(shouldBeString, reflect.TypeOf(actual)) + } + if value != "" { + return serializer.serialize("", value, fmt.Sprintf(shouldHaveBeenBlank, value)) + } + return success +} + +// ShouldNotBeBlank receives exactly 1 string parameter and ensures that it is equal to "". +func ShouldNotBeBlank(actual interface{}, expected ...interface{}) string { + if fail := need(0, expected); fail != success { + return fail + } + value, ok := actual.(string) + if !ok { + return fmt.Sprintf(shouldBeString, reflect.TypeOf(actual)) + } + if value == "" { + return shouldNotHaveBeenBlank + } + return success +} + +// ShouldEqualWithout receives exactly 3 string parameters and ensures that the first is equal to the second +// after removing all instances of the third from the first using strings.Replace(first, third, "", -1). +func ShouldEqualWithout(actual interface{}, expected ...interface{}) string { + if fail := need(2, expected); fail != success { + return fail + } + actualString, ok1 := actual.(string) + expectedString, ok2 := expected[0].(string) + replace, ok3 := expected[1].(string) + + if !ok1 || !ok2 || !ok3 { + return fmt.Sprintf(shouldAllBeStrings, []reflect.Type{ + reflect.TypeOf(actual), + reflect.TypeOf(expected[0]), + reflect.TypeOf(expected[1]), + }) + } + + replaced := strings.Replace(actualString, replace, "", -1) + if replaced == expectedString { + return "" + } + + return fmt.Sprintf("Expected '%s' to equal '%s' but without any '%s' (but it didn't).", actualString, expectedString, replace) +} + +// ShouldEqualTrimSpace receives exactly 2 string parameters and ensures that the first is equal to the second +// after removing all leading and trailing whitespace using strings.TrimSpace(first). +func ShouldEqualTrimSpace(actual interface{}, expected ...interface{}) string { + if fail := need(1, expected); fail != success { + return fail + } + + actualString, valueIsString := actual.(string) + _, value2IsString := expected[0].(string) + + if !valueIsString || !value2IsString { + return fmt.Sprintf(shouldBothBeStrings, reflect.TypeOf(actual), reflect.TypeOf(expected[0])) + } + + actualString = strings.TrimSpace(actualString) + return ShouldEqual(actualString, expected[0]) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/time.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/time.go new file mode 100644 index 0000000000000000000000000000000000000000..7e05026143f13b4e083d5c8dd39f23e02fb96362 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/time.go @@ -0,0 +1,202 @@ +package assertions + +import ( + "fmt" + "time" +) + +// ShouldHappenBefore receives exactly 2 time.Time arguments and asserts that the first happens before the second. +func ShouldHappenBefore(actual interface{}, expected ...interface{}) string { + if fail := need(1, expected); fail != success { + return fail + } + actualTime, firstOk := actual.(time.Time) + expectedTime, secondOk := expected[0].(time.Time) + + if !firstOk || !secondOk { + return shouldUseTimes + } + + if !actualTime.Before(expectedTime) { + return fmt.Sprintf(shouldHaveHappenedBefore, actualTime, expectedTime, actualTime.Sub(expectedTime)) + } + + return success +} + +// ShouldHappenOnOrBefore receives exactly 2 time.Time arguments and asserts that the first happens on or before the second. +func ShouldHappenOnOrBefore(actual interface{}, expected ...interface{}) string { + if fail := need(1, expected); fail != success { + return fail + } + actualTime, firstOk := actual.(time.Time) + expectedTime, secondOk := expected[0].(time.Time) + + if !firstOk || !secondOk { + return shouldUseTimes + } + + if actualTime.Equal(expectedTime) { + return success + } + return ShouldHappenBefore(actualTime, expectedTime) +} + +// ShouldHappenAfter receives exactly 2 time.Time arguments and asserts that the first happens after the second. +func ShouldHappenAfter(actual interface{}, expected ...interface{}) string { + if fail := need(1, expected); fail != success { + return fail + } + actualTime, firstOk := actual.(time.Time) + expectedTime, secondOk := expected[0].(time.Time) + + if !firstOk || !secondOk { + return shouldUseTimes + } + if !actualTime.After(expectedTime) { + return fmt.Sprintf(shouldHaveHappenedAfter, actualTime, expectedTime, expectedTime.Sub(actualTime)) + } + return success +} + +// ShouldHappenOnOrAfter receives exactly 2 time.Time arguments and asserts that the first happens on or after the second. +func ShouldHappenOnOrAfter(actual interface{}, expected ...interface{}) string { + if fail := need(1, expected); fail != success { + return fail + } + actualTime, firstOk := actual.(time.Time) + expectedTime, secondOk := expected[0].(time.Time) + + if !firstOk || !secondOk { + return shouldUseTimes + } + if actualTime.Equal(expectedTime) { + return success + } + return ShouldHappenAfter(actualTime, expectedTime) +} + +// ShouldHappenBetween receives exactly 3 time.Time arguments and asserts that the first happens between (not on) the second and third. +func ShouldHappenBetween(actual interface{}, expected ...interface{}) string { + if fail := need(2, expected); fail != success { + return fail + } + actualTime, firstOk := actual.(time.Time) + min, secondOk := expected[0].(time.Time) + max, thirdOk := expected[1].(time.Time) + + if !firstOk || !secondOk || !thirdOk { + return shouldUseTimes + } + + if !actualTime.After(min) { + return fmt.Sprintf(shouldHaveHappenedBetween, actualTime, min, max, min.Sub(actualTime)) + } + if !actualTime.Before(max) { + return fmt.Sprintf(shouldHaveHappenedBetween, actualTime, min, max, actualTime.Sub(max)) + } + return success +} + +// ShouldHappenOnOrBetween receives exactly 3 time.Time arguments and asserts that the first happens between or on the second and third. +func ShouldHappenOnOrBetween(actual interface{}, expected ...interface{}) string { + if fail := need(2, expected); fail != success { + return fail + } + actualTime, firstOk := actual.(time.Time) + min, secondOk := expected[0].(time.Time) + max, thirdOk := expected[1].(time.Time) + + if !firstOk || !secondOk || !thirdOk { + return shouldUseTimes + } + if actualTime.Equal(min) || actualTime.Equal(max) { + return success + } + return ShouldHappenBetween(actualTime, min, max) +} + +// ShouldNotHappenOnOrBetween receives exactly 3 time.Time arguments and asserts that the first +// does NOT happen between or on the second or third. +func ShouldNotHappenOnOrBetween(actual interface{}, expected ...interface{}) string { + if fail := need(2, expected); fail != success { + return fail + } + actualTime, firstOk := actual.(time.Time) + min, secondOk := expected[0].(time.Time) + max, thirdOk := expected[1].(time.Time) + + if !firstOk || !secondOk || !thirdOk { + return shouldUseTimes + } + if actualTime.Equal(min) || actualTime.Equal(max) { + return fmt.Sprintf(shouldNotHaveHappenedOnOrBetween, actualTime, min, max) + } + if actualTime.After(min) && actualTime.Before(max) { + return fmt.Sprintf(shouldNotHaveHappenedOnOrBetween, actualTime, min, max) + } + return success +} + +// ShouldHappenWithin receives a time.Time, a time.Duration, and a time.Time (3 arguments) +// and asserts that the first time.Time happens within or on the duration specified relative to +// the other time.Time. +func ShouldHappenWithin(actual interface{}, expected ...interface{}) string { + if fail := need(2, expected); fail != success { + return fail + } + actualTime, firstOk := actual.(time.Time) + tolerance, secondOk := expected[0].(time.Duration) + threshold, thirdOk := expected[1].(time.Time) + + if !firstOk || !secondOk || !thirdOk { + return shouldUseDurationAndTime + } + + min := threshold.Add(-tolerance) + max := threshold.Add(tolerance) + return ShouldHappenOnOrBetween(actualTime, min, max) +} + +// ShouldNotHappenWithin receives a time.Time, a time.Duration, and a time.Time (3 arguments) +// and asserts that the first time.Time does NOT happen within or on the duration specified relative to +// the other time.Time. +func ShouldNotHappenWithin(actual interface{}, expected ...interface{}) string { + if fail := need(2, expected); fail != success { + return fail + } + actualTime, firstOk := actual.(time.Time) + tolerance, secondOk := expected[0].(time.Duration) + threshold, thirdOk := expected[1].(time.Time) + + if !firstOk || !secondOk || !thirdOk { + return shouldUseDurationAndTime + } + + min := threshold.Add(-tolerance) + max := threshold.Add(tolerance) + return ShouldNotHappenOnOrBetween(actualTime, min, max) +} + +// ShouldBeChronological receives a []time.Time slice and asserts that the are +// in chronological order starting with the first time.Time as the earliest. +func ShouldBeChronological(actual interface{}, expected ...interface{}) string { + if fail := need(0, expected); fail != success { + return fail + } + + times, ok := actual.([]time.Time) + if !ok { + return shouldUseTimeSlice + } + + var previous time.Time + for i, current := range times { + if i > 0 && current.Before(previous) { + return fmt.Sprintf(shouldHaveBeenChronological, + i, i-1, previous.String(), i, current.String()) + } + previous = current + } + return "" +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/type.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/type.go new file mode 100644 index 0000000000000000000000000000000000000000..d2d1dc864b2d0835b8514d26a26f0d928deff073 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/assertions/type.go @@ -0,0 +1,134 @@ +package assertions + +import ( + "fmt" + "reflect" +) + +// ShouldHaveSameTypeAs receives exactly two parameters and compares their underlying types for equality. +func ShouldHaveSameTypeAs(actual interface{}, expected ...interface{}) string { + if fail := need(1, expected); fail != success { + return fail + } + + first := reflect.TypeOf(actual) + second := reflect.TypeOf(expected[0]) + + if first != second { + return serializer.serialize(second, first, fmt.Sprintf(shouldHaveBeenA, actual, second, first)) + } + + return success +} + +// ShouldNotHaveSameTypeAs receives exactly two parameters and compares their underlying types for inequality. +func ShouldNotHaveSameTypeAs(actual interface{}, expected ...interface{}) string { + if fail := need(1, expected); fail != success { + return fail + } + + first := reflect.TypeOf(actual) + second := reflect.TypeOf(expected[0]) + + if (actual == nil && expected[0] == nil) || first == second { + return fmt.Sprintf(shouldNotHaveBeenA, actual, second) + } + return success +} + +// ShouldImplement receives exactly two parameters and ensures +// that the first implements the interface type of the second. +func ShouldImplement(actual interface{}, expectedList ...interface{}) string { + if fail := need(1, expectedList); fail != success { + return fail + } + + expected := expectedList[0] + if fail := ShouldBeNil(expected); fail != success { + return shouldCompareWithInterfacePointer + } + + if fail := ShouldNotBeNil(actual); fail != success { + return shouldNotBeNilActual + } + + var actualType reflect.Type + if reflect.TypeOf(actual).Kind() != reflect.Ptr { + actualType = reflect.PtrTo(reflect.TypeOf(actual)) + } else { + actualType = reflect.TypeOf(actual) + } + + expectedType := reflect.TypeOf(expected) + if fail := ShouldNotBeNil(expectedType); fail != success { + return shouldCompareWithInterfacePointer + } + + expectedInterface := expectedType.Elem() + + if !actualType.Implements(expectedInterface) { + return fmt.Sprintf(shouldHaveImplemented, expectedInterface, actualType) + } + return success +} + +// ShouldNotImplement receives exactly two parameters and ensures +// that the first does NOT implement the interface type of the second. +func ShouldNotImplement(actual interface{}, expectedList ...interface{}) string { + if fail := need(1, expectedList); fail != success { + return fail + } + + expected := expectedList[0] + if fail := ShouldBeNil(expected); fail != success { + return shouldCompareWithInterfacePointer + } + + if fail := ShouldNotBeNil(actual); fail != success { + return shouldNotBeNilActual + } + + var actualType reflect.Type + if reflect.TypeOf(actual).Kind() != reflect.Ptr { + actualType = reflect.PtrTo(reflect.TypeOf(actual)) + } else { + actualType = reflect.TypeOf(actual) + } + + expectedType := reflect.TypeOf(expected) + if fail := ShouldNotBeNil(expectedType); fail != success { + return shouldCompareWithInterfacePointer + } + + expectedInterface := expectedType.Elem() + + if actualType.Implements(expectedInterface) { + return fmt.Sprintf(shouldNotHaveImplemented, actualType, expectedInterface) + } + return success +} + +// ShouldBeError asserts that the first argument implements the error interface. +// It also compares the first argument against the second argument if provided +// (which must be an error message string or another error value). +func ShouldBeError(actual interface{}, expected ...interface{}) string { + if fail := atMost(1, expected); fail != success { + return fail + } + + if !isError(actual) { + return fmt.Sprintf(shouldBeError, reflect.TypeOf(actual)) + } + + if len(expected) == 0 { + return success + } + + if expected := expected[0]; !isString(expected) && !isError(expected) { + return fmt.Sprintf(shouldBeErrorInvalidComparisonValue, reflect.TypeOf(expected)) + } + return ShouldEqual(fmt.Sprint(actual), fmt.Sprint(expected[0])) +} + +func isString(value interface{}) bool { _, ok := value.(string); return ok } +func isError(value interface{}) bool { _, ok := value.(error); return ok } diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/CONTRIBUTING.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/CONTRIBUTING.md new file mode 100644 index 0000000000000000000000000000000000000000..cc0e8e8e406f6c5c3f296db95f2bd3119b7d16ac --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/CONTRIBUTING.md @@ -0,0 +1,35 @@ +# Subject: GoConvey maintainers wanted + +We'd like to open the project up to additional maintainers who want to move the project forward in a meaningful way. + +We've spent significant time at SmartyStreets building GoConvey and it has perfectly met (and exceeded) all of our initial design specifications. We've used it to great effect. Being so well-matched to our development workflows at SmartyStreets, we haven't had a need to hack on it lately. This had been frustrating to many in the community who have ideas for the project and would like to see new features released (and some old bugs fixed). The release of Go 1.5 and the new vendoring experiment has been a source of confusion and hassle for those who have already upgraded and find that GoConvey needs to be brought up to speed. + +GoConvey is a popular 2-pronged, open-source github project (1,600+ stargazers, 100+ forks): + +- A package you import in your test code that allows you to write BDD-style tests. +- An executable that runs a local web server which displays auto-updating test results in a web browser. + +---- + +- http://goconvey.co/ +- https://github.com/smartystreets/goconvey +- https://github.com/smartystreets/goconvey/wiki + +_I should mention that the [assertions package](https://github.com/smartystreets/assertions) imported by the convey package is used by other projects at SmartyStreets and so we will be continuing to maintain that project internally._ + +We hope to hear from you soon. Thanks! + +--- + +# Contributing + +In general, the code posted to the [SmartyStreets github organization](https://github.com/smartystreets) is created to solve specific problems at SmartyStreets that are ancillary to our core products in the address verification industry and may or may not be useful to other organizations or developers. Our reason for posting said code isn't necessarily to solicit feedback or contributions from the community but more as a showcase of some of the approaches to solving problems we have adopted. + +Having stated that, we do consider issues raised by other githubbers as well as contributions submitted via pull requests. When submitting such a pull request, please follow these guidelines: + +- _Look before you leap:_ If the changes you plan to make are significant, it's in everyone's best interest for you to discuss them with a SmartyStreets team member prior to opening a pull request. +- _License and ownership:_ If modifying the `LICENSE.md` file, limit your changes to fixing typographical mistakes. Do NOT modify the actual terms in the license or the copyright by **SmartyStreets, LLC**. Code submitted to SmartyStreets projects becomes property of SmartyStreets and must be compatible with the associated license. +- _Testing:_ If the code you are submitting resides in packages/modules covered by automated tests, be sure to add passing tests that cover your changes and assert expected behavior and state. Submit the additional test cases as part of your change set. +- _Style:_ Match your approach to **naming** and **formatting** with the surrounding code. Basically, the code you submit shouldn't stand out. + - "Naming" refers to such constructs as variables, methods, functions, classes, structs, interfaces, packages, modules, directories, files, etc... + - "Formatting" refers to such constructs as whitespace, horizontal line length, vertical function length, vertical file length, indentation, curly braces, etc... diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/LICENSE.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/LICENSE.md new file mode 100644 index 0000000000000000000000000000000000000000..3f87a40e773060cfd580c2ef28049d0f93237c19 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/LICENSE.md @@ -0,0 +1,23 @@ +Copyright (c) 2016 SmartyStreets, LLC + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +NOTE: Various optional and subordinate components carry their own licensing +requirements and restrictions. Use of those components is subject to the terms +and conditions outlined the respective license of each component. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/README.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/README.md new file mode 100644 index 0000000000000000000000000000000000000000..00df48066f57b5393d0fd6c6e1d37a93d8dfff8b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/README.md @@ -0,0 +1,124 @@ +GoConvey is awesome Go testing +============================== + +[![Build Status](https://travis-ci.org/smartystreets/goconvey.png)](https://travis-ci.org/smartystreets/goconvey) +[![GoDoc](https://godoc.org/github.com/smartystreets/goconvey?status.svg)](http://godoc.org/github.com/smartystreets/goconvey) + + +Welcome to GoConvey, a yummy Go testing tool for gophers. Works with `go test`. Use it in the terminal or browser according to your viewing pleasure. **[View full feature tour.](http://goconvey.co)** + +**Features:** + +- Directly integrates with `go test` +- Fully-automatic web UI (works with native Go tests, too) +- Huge suite of regression tests +- Shows test coverage (Go 1.2+) +- Readable, colorized console output (understandable by any manager, IT or not) +- Test code generator +- Desktop notifications (optional) +- Immediately open problem lines in [Sublime Text](http://www.sublimetext.com) ([some assembly required](https://github.com/asuth/subl-handler)) + + +You can ask questions about how to use GoConvey on [StackOverflow](http://stackoverflow.com/questions/ask?tags=goconvey,go&title=GoConvey%3A%20). Use the tags `go` and `goconvey`. + +**Menu:** + +- [Installation](#installation) +- [Quick start](#quick-start) +- [Documentation](#documentation) +- [Screenshots](#screenshots) +- [Contributors](#contributors) + + + + +Installation +------------ + + $ go get github.com/smartystreets/goconvey + +[Quick start](https://github.com/smartystreets/goconvey/wiki#get-going-in-25-seconds) +----------- + +Make a test, for example: + +```go +package package_name + +import ( + "testing" + . "github.com/smartystreets/goconvey/convey" +) + +func TestSpec(t *testing.T) { + + // Only pass t into top-level Convey calls + Convey("Given some integer with a starting value", t, func() { + x := 1 + + Convey("When the integer is incremented", func() { + x++ + + Convey("The value should be greater by one", func() { + So(x, ShouldEqual, 2) + }) + }) + }) +} +``` + + +#### [In the browser](https://github.com/smartystreets/goconvey/wiki/Web-UI) + +Start up the GoConvey web server at your project's path: + + $ $GOPATH/bin/goconvey + +Then watch the test results display in your browser at: + + http://localhost:8080 + + +If the browser doesn't open automatically, please click [http://localhost:8080](http://localhost:8080) to open manually. + +There you have it. +![](http://d79i1fxsrar4t.cloudfront.net/goconvey.co/gc-1-dark.png) +As long as GoConvey is running, test results will automatically update in your browser window. + +![](http://d79i1fxsrar4t.cloudfront.net/goconvey.co/gc-5-dark.png) +The design is responsive, so you can squish the browser real tight if you need to put it beside your code. + + +The [web UI](https://github.com/smartystreets/goconvey/wiki/Web-UI) supports traditional Go tests, so use it even if you're not using GoConvey tests. + + + +#### [In the terminal](https://github.com/smartystreets/goconvey/wiki/Execution) + +Just do what you do best: + + $ go test + +Or if you want the output to include the story: + + $ go test -v + + +[Documentation](https://github.com/smartystreets/goconvey/wiki) +----------- + +Check out the + +- [GoConvey wiki](https://github.com/smartystreets/goconvey/wiki), +- [![GoDoc](https://godoc.org/github.com/smartystreets/goconvey?status.png)](http://godoc.org/github.com/smartystreets/goconvey) +- and the *_test.go files scattered throughout this project. + +[Screenshots](http://goconvey.co) +----------- + +For web UI and terminal screenshots, check out [the full feature tour](http://goconvey.co). + +Contributors +---------------------- + +GoConvey is brought to you by [SmartyStreets](https://github.com/smartystreets) and [several contributors](https://github.com/smartystreets/goconvey/graphs/contributors) (Thanks!). diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/assertions.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/assertions.go new file mode 100644 index 0000000000000000000000000000000000000000..b37f6b43a65bdece182fb5266041eee193b79e1a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/assertions.go @@ -0,0 +1,70 @@ +package convey + +import "github.com/smartystreets/assertions" + +var ( + ShouldEqual = assertions.ShouldEqual + ShouldNotEqual = assertions.ShouldNotEqual + ShouldAlmostEqual = assertions.ShouldAlmostEqual + ShouldNotAlmostEqual = assertions.ShouldNotAlmostEqual + ShouldResemble = assertions.ShouldResemble + ShouldNotResemble = assertions.ShouldNotResemble + ShouldPointTo = assertions.ShouldPointTo + ShouldNotPointTo = assertions.ShouldNotPointTo + ShouldBeNil = assertions.ShouldBeNil + ShouldNotBeNil = assertions.ShouldNotBeNil + ShouldBeTrue = assertions.ShouldBeTrue + ShouldBeFalse = assertions.ShouldBeFalse + ShouldBeZeroValue = assertions.ShouldBeZeroValue + + ShouldBeGreaterThan = assertions.ShouldBeGreaterThan + ShouldBeGreaterThanOrEqualTo = assertions.ShouldBeGreaterThanOrEqualTo + ShouldBeLessThan = assertions.ShouldBeLessThan + ShouldBeLessThanOrEqualTo = assertions.ShouldBeLessThanOrEqualTo + ShouldBeBetween = assertions.ShouldBeBetween + ShouldNotBeBetween = assertions.ShouldNotBeBetween + ShouldBeBetweenOrEqual = assertions.ShouldBeBetweenOrEqual + ShouldNotBeBetweenOrEqual = assertions.ShouldNotBeBetweenOrEqual + + ShouldContain = assertions.ShouldContain + ShouldNotContain = assertions.ShouldNotContain + ShouldContainKey = assertions.ShouldContainKey + ShouldNotContainKey = assertions.ShouldNotContainKey + ShouldBeIn = assertions.ShouldBeIn + ShouldNotBeIn = assertions.ShouldNotBeIn + ShouldBeEmpty = assertions.ShouldBeEmpty + ShouldNotBeEmpty = assertions.ShouldNotBeEmpty + ShouldHaveLength = assertions.ShouldHaveLength + + ShouldStartWith = assertions.ShouldStartWith + ShouldNotStartWith = assertions.ShouldNotStartWith + ShouldEndWith = assertions.ShouldEndWith + ShouldNotEndWith = assertions.ShouldNotEndWith + ShouldBeBlank = assertions.ShouldBeBlank + ShouldNotBeBlank = assertions.ShouldNotBeBlank + ShouldContainSubstring = assertions.ShouldContainSubstring + ShouldNotContainSubstring = assertions.ShouldNotContainSubstring + + ShouldPanic = assertions.ShouldPanic + ShouldNotPanic = assertions.ShouldNotPanic + ShouldPanicWith = assertions.ShouldPanicWith + ShouldNotPanicWith = assertions.ShouldNotPanicWith + + ShouldHaveSameTypeAs = assertions.ShouldHaveSameTypeAs + ShouldNotHaveSameTypeAs = assertions.ShouldNotHaveSameTypeAs + ShouldImplement = assertions.ShouldImplement + ShouldNotImplement = assertions.ShouldNotImplement + + ShouldHappenBefore = assertions.ShouldHappenBefore + ShouldHappenOnOrBefore = assertions.ShouldHappenOnOrBefore + ShouldHappenAfter = assertions.ShouldHappenAfter + ShouldHappenOnOrAfter = assertions.ShouldHappenOnOrAfter + ShouldHappenBetween = assertions.ShouldHappenBetween + ShouldHappenOnOrBetween = assertions.ShouldHappenOnOrBetween + ShouldNotHappenOnOrBetween = assertions.ShouldNotHappenOnOrBetween + ShouldHappenWithin = assertions.ShouldHappenWithin + ShouldNotHappenWithin = assertions.ShouldNotHappenWithin + ShouldBeChronological = assertions.ShouldBeChronological + + ShouldBeError = assertions.ShouldBeError +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/context.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/context.go new file mode 100644 index 0000000000000000000000000000000000000000..2c75c2d7b1b69e01b90aa9e096bbcb7e9f70f4e0 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/context.go @@ -0,0 +1,272 @@ +package convey + +import ( + "fmt" + + "github.com/jtolds/gls" + "github.com/smartystreets/goconvey/convey/reporting" +) + +type conveyErr struct { + fmt string + params []interface{} +} + +func (e *conveyErr) Error() string { + return fmt.Sprintf(e.fmt, e.params...) +} + +func conveyPanic(fmt string, params ...interface{}) { + panic(&conveyErr{fmt, params}) +} + +const ( + missingGoTest = `Top-level calls to Convey(...) need a reference to the *testing.T. + Hint: Convey("description here", t, func() { /* notice that the second argument was the *testing.T (t)! */ }) ` + extraGoTest = `Only the top-level call to Convey(...) needs a reference to the *testing.T.` + noStackContext = "Convey operation made without context on goroutine stack.\n" + + "Hint: Perhaps you meant to use `Convey(..., func(c C){...})` ?" + differentConveySituations = "Different set of Convey statements on subsequent pass!\nDid not expect %#v." + multipleIdenticalConvey = "Multiple convey suites with identical names: %#v" +) + +const ( + failureHalt = "___FAILURE_HALT___" + + nodeKey = "node" +) + +///////////////////////////////// Stack Context ///////////////////////////////// + +func getCurrentContext() *context { + ctx, ok := ctxMgr.GetValue(nodeKey) + if ok { + return ctx.(*context) + } + return nil +} + +func mustGetCurrentContext() *context { + ctx := getCurrentContext() + if ctx == nil { + conveyPanic(noStackContext) + } + return ctx +} + +//////////////////////////////////// Context //////////////////////////////////// + +// context magically handles all coordination of Convey's and So assertions. +// +// It is tracked on the stack as goroutine-local-storage with the gls package, +// or explicitly if the user decides to call convey like: +// +// Convey(..., func(c C) { +// c.So(...) +// }) +// +// This implements the `C` interface. +type context struct { + reporter reporting.Reporter + + children map[string]*context + + resets []func() + + executedOnce bool + expectChildRun *bool + complete bool + + focus bool + failureMode FailureMode +} + +// rootConvey is the main entry point to a test suite. This is called when +// there's no context in the stack already, and items must contain a `t` object, +// or this panics. +func rootConvey(items ...interface{}) { + entry := discover(items) + + if entry.Test == nil { + conveyPanic(missingGoTest) + } + + expectChildRun := true + ctx := &context{ + reporter: buildReporter(), + + children: make(map[string]*context), + + expectChildRun: &expectChildRun, + + focus: entry.Focus, + failureMode: defaultFailureMode.combine(entry.FailMode), + } + ctxMgr.SetValues(gls.Values{nodeKey: ctx}, func() { + ctx.reporter.BeginStory(reporting.NewStoryReport(entry.Test)) + defer ctx.reporter.EndStory() + + for ctx.shouldVisit() { + ctx.conveyInner(entry.Situation, entry.Func) + expectChildRun = true + } + }) +} + +//////////////////////////////////// Methods //////////////////////////////////// + +func (ctx *context) SkipConvey(items ...interface{}) { + ctx.Convey(items, skipConvey) +} + +func (ctx *context) FocusConvey(items ...interface{}) { + ctx.Convey(items, focusConvey) +} + +func (ctx *context) Convey(items ...interface{}) { + entry := discover(items) + + // we're a branch, or leaf (on the wind) + if entry.Test != nil { + conveyPanic(extraGoTest) + } + if ctx.focus && !entry.Focus { + return + } + + var inner_ctx *context + if ctx.executedOnce { + var ok bool + inner_ctx, ok = ctx.children[entry.Situation] + if !ok { + conveyPanic(differentConveySituations, entry.Situation) + } + } else { + if _, ok := ctx.children[entry.Situation]; ok { + conveyPanic(multipleIdenticalConvey, entry.Situation) + } + inner_ctx = &context{ + reporter: ctx.reporter, + + children: make(map[string]*context), + + expectChildRun: ctx.expectChildRun, + + focus: entry.Focus, + failureMode: ctx.failureMode.combine(entry.FailMode), + } + ctx.children[entry.Situation] = inner_ctx + } + + if inner_ctx.shouldVisit() { + ctxMgr.SetValues(gls.Values{nodeKey: inner_ctx}, func() { + inner_ctx.conveyInner(entry.Situation, entry.Func) + }) + } +} + +func (ctx *context) SkipSo(stuff ...interface{}) { + ctx.assertionReport(reporting.NewSkipReport()) +} + +func (ctx *context) So(actual interface{}, assert assertion, expected ...interface{}) { + if result := assert(actual, expected...); result == assertionSuccess { + ctx.assertionReport(reporting.NewSuccessReport()) + } else { + ctx.assertionReport(reporting.NewFailureReport(result)) + } +} + +func (ctx *context) Reset(action func()) { + /* TODO: Failure mode configuration */ + ctx.resets = append(ctx.resets, action) +} + +func (ctx *context) Print(items ...interface{}) (int, error) { + fmt.Fprint(ctx.reporter, items...) + return fmt.Print(items...) +} + +func (ctx *context) Println(items ...interface{}) (int, error) { + fmt.Fprintln(ctx.reporter, items...) + return fmt.Println(items...) +} + +func (ctx *context) Printf(format string, items ...interface{}) (int, error) { + fmt.Fprintf(ctx.reporter, format, items...) + return fmt.Printf(format, items...) +} + +//////////////////////////////////// Private //////////////////////////////////// + +// shouldVisit returns true iff we should traverse down into a Convey. Note +// that just because we don't traverse a Convey this time, doesn't mean that +// we may not traverse it on a subsequent pass. +func (c *context) shouldVisit() bool { + return !c.complete && *c.expectChildRun +} + +// conveyInner is the function which actually executes the user's anonymous test +// function body. At this point, Convey or RootConvey has decided that this +// function should actually run. +func (ctx *context) conveyInner(situation string, f func(C)) { + // Record/Reset state for next time. + defer func() { + ctx.executedOnce = true + + // This is only needed at the leaves, but there's no harm in also setting it + // when returning from branch Convey's + *ctx.expectChildRun = false + }() + + // Set up+tear down our scope for the reporter + ctx.reporter.Enter(reporting.NewScopeReport(situation)) + defer ctx.reporter.Exit() + + // Recover from any panics in f, and assign the `complete` status for this + // node of the tree. + defer func() { + ctx.complete = true + if problem := recover(); problem != nil { + if problem, ok := problem.(*conveyErr); ok { + panic(problem) + } + if problem != failureHalt { + ctx.reporter.Report(reporting.NewErrorReport(problem)) + } + } else { + for _, child := range ctx.children { + if !child.complete { + ctx.complete = false + return + } + } + } + }() + + // Resets are registered as the `f` function executes, so nil them here. + // All resets are run in registration order (FIFO). + ctx.resets = []func(){} + defer func() { + for _, r := range ctx.resets { + // panics handled by the previous defer + r() + } + }() + + if f == nil { + // if f is nil, this was either a Convey(..., nil), or a SkipConvey + ctx.reporter.Report(reporting.NewSkipReport()) + } else { + f(ctx) + } +} + +// assertionReport is a helper for So and SkipSo which makes the report and +// then possibly panics, depending on the current context's failureMode. +func (ctx *context) assertionReport(r *reporting.AssertionResult) { + ctx.reporter.Report(r) + if r.Failure != "" && ctx.failureMode == FailureHalts { + panic(failureHalt) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/convey.goconvey b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/convey.goconvey new file mode 100644 index 0000000000000000000000000000000000000000..a2d9327dc916486c20562305993dc3019d1f5782 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/convey.goconvey @@ -0,0 +1,4 @@ +#ignore +-timeout=1s +#-covermode=count +#-coverpkg=github.com/smartystreets/goconvey/convey,github.com/smartystreets/goconvey/convey/gotest,github.com/smartystreets/goconvey/convey/reporting \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/discovery.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/discovery.go new file mode 100644 index 0000000000000000000000000000000000000000..eb8d4cb2ceebec111233df3f06680375d76c02b0 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/discovery.go @@ -0,0 +1,103 @@ +package convey + +type actionSpecifier uint8 + +const ( + noSpecifier actionSpecifier = iota + skipConvey + focusConvey +) + +type suite struct { + Situation string + Test t + Focus bool + Func func(C) // nil means skipped + FailMode FailureMode +} + +func newSuite(situation string, failureMode FailureMode, f func(C), test t, specifier actionSpecifier) *suite { + ret := &suite{ + Situation: situation, + Test: test, + Func: f, + FailMode: failureMode, + } + switch specifier { + case skipConvey: + ret.Func = nil + case focusConvey: + ret.Focus = true + } + return ret +} + +func discover(items []interface{}) *suite { + name, items := parseName(items) + test, items := parseGoTest(items) + failure, items := parseFailureMode(items) + action, items := parseAction(items) + specifier, items := parseSpecifier(items) + + if len(items) != 0 { + conveyPanic(parseError) + } + + return newSuite(name, failure, action, test, specifier) +} +func item(items []interface{}) interface{} { + if len(items) == 0 { + conveyPanic(parseError) + } + return items[0] +} +func parseName(items []interface{}) (string, []interface{}) { + if name, parsed := item(items).(string); parsed { + return name, items[1:] + } + conveyPanic(parseError) + panic("never get here") +} +func parseGoTest(items []interface{}) (t, []interface{}) { + if test, parsed := item(items).(t); parsed { + return test, items[1:] + } + return nil, items +} +func parseFailureMode(items []interface{}) (FailureMode, []interface{}) { + if mode, parsed := item(items).(FailureMode); parsed { + return mode, items[1:] + } + return FailureInherits, items +} +func parseAction(items []interface{}) (func(C), []interface{}) { + switch x := item(items).(type) { + case nil: + return nil, items[1:] + case func(C): + return x, items[1:] + case func(): + return func(C) { x() }, items[1:] + } + conveyPanic(parseError) + panic("never get here") +} +func parseSpecifier(items []interface{}) (actionSpecifier, []interface{}) { + if len(items) == 0 { + return noSpecifier, items + } + if spec, ok := items[0].(actionSpecifier); ok { + return spec, items[1:] + } + conveyPanic(parseError) + panic("never get here") +} + +// This interface allows us to pass the *testing.T struct +// throughout the internals of this package without ever +// having to import the "testing" package. +type t interface { + Fail() +} + +const parseError = "You must provide a name (string), then a *testing.T (if in outermost scope), an optional FailureMode, and then an action (func())." diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/doc.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/doc.go new file mode 100644 index 0000000000000000000000000000000000000000..2562ce4c28480eb1cc07d5de30472a390588a1e0 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/doc.go @@ -0,0 +1,218 @@ +// Package convey contains all of the public-facing entry points to this project. +// This means that it should never be required of the user to import any other +// packages from this project as they serve internal purposes. +package convey + +import "github.com/smartystreets/goconvey/convey/reporting" + +////////////////////////////////// suite ////////////////////////////////// + +// C is the Convey context which you can optionally obtain in your action +// by calling Convey like: +// +// Convey(..., func(c C) { +// ... +// }) +// +// See the documentation on Convey for more details. +// +// All methods in this context behave identically to the global functions of the +// same name in this package. +type C interface { + Convey(items ...interface{}) + SkipConvey(items ...interface{}) + FocusConvey(items ...interface{}) + + So(actual interface{}, assert assertion, expected ...interface{}) + SkipSo(stuff ...interface{}) + + Reset(action func()) + + Println(items ...interface{}) (int, error) + Print(items ...interface{}) (int, error) + Printf(format string, items ...interface{}) (int, error) +} + +// Convey is the method intended for use when declaring the scopes of +// a specification. Each scope has a description and a func() which may contain +// other calls to Convey(), Reset() or Should-style assertions. Convey calls can +// be nested as far as you see fit. +// +// IMPORTANT NOTE: The top-level Convey() within a Test method +// must conform to the following signature: +// +// Convey(description string, t *testing.T, action func()) +// +// All other calls should look like this (no need to pass in *testing.T): +// +// Convey(description string, action func()) +// +// Don't worry, goconvey will panic if you get it wrong so you can fix it. +// +// Additionally, you may explicitly obtain access to the Convey context by doing: +// +// Convey(description string, action func(c C)) +// +// You may need to do this if you want to pass the context through to a +// goroutine, or to close over the context in a handler to a library which +// calls your handler in a goroutine (httptest comes to mind). +// +// All Convey()-blocks also accept an optional parameter of FailureMode which sets +// how goconvey should treat failures for So()-assertions in the block and +// nested blocks. See the constants in this file for the available options. +// +// By default it will inherit from its parent block and the top-level blocks +// default to the FailureHalts setting. +// +// This parameter is inserted before the block itself: +// +// Convey(description string, t *testing.T, mode FailureMode, action func()) +// Convey(description string, mode FailureMode, action func()) +// +// See the examples package for, well, examples. +func Convey(items ...interface{}) { + if ctx := getCurrentContext(); ctx == nil { + rootConvey(items...) + } else { + ctx.Convey(items...) + } +} + +// SkipConvey is analagous to Convey except that the scope is not executed +// (which means that child scopes defined within this scope are not run either). +// The reporter will be notified that this step was skipped. +func SkipConvey(items ...interface{}) { + Convey(append(items, skipConvey)...) +} + +// FocusConvey is has the inverse effect of SkipConvey. If the top-level +// Convey is changed to `FocusConvey`, only nested scopes that are defined +// with FocusConvey will be run. The rest will be ignored completely. This +// is handy when debugging a large suite that runs a misbehaving function +// repeatedly as you can disable all but one of that function +// without swaths of `SkipConvey` calls, just a targeted chain of calls +// to FocusConvey. +func FocusConvey(items ...interface{}) { + Convey(append(items, focusConvey)...) +} + +// Reset registers a cleanup function to be run after each Convey() +// in the same scope. See the examples package for a simple use case. +func Reset(action func()) { + mustGetCurrentContext().Reset(action) +} + +/////////////////////////////////// Assertions /////////////////////////////////// + +// assertion is an alias for a function with a signature that the convey.So() +// method can handle. Any future or custom assertions should conform to this +// method signature. The return value should be an empty string if the assertion +// passes and a well-formed failure message if not. +type assertion func(actual interface{}, expected ...interface{}) string + +const assertionSuccess = "" + +// So is the means by which assertions are made against the system under test. +// The majority of exported names in the assertions package begin with the word +// 'Should' and describe how the first argument (actual) should compare with any +// of the final (expected) arguments. How many final arguments are accepted +// depends on the particular assertion that is passed in as the assert argument. +// See the examples package for use cases and the assertions package for +// documentation on specific assertion methods. A failing assertion will +// cause t.Fail() to be invoked--you should never call this method (or other +// failure-inducing methods) in your test code. Leave that to GoConvey. +func So(actual interface{}, assert assertion, expected ...interface{}) { + mustGetCurrentContext().So(actual, assert, expected...) +} + +// SkipSo is analagous to So except that the assertion that would have been passed +// to So is not executed and the reporter is notified that the assertion was skipped. +func SkipSo(stuff ...interface{}) { + mustGetCurrentContext().SkipSo() +} + +// FailureMode is a type which determines how the So() blocks should fail +// if their assertion fails. See constants further down for acceptable values +type FailureMode string + +const ( + + // FailureContinues is a failure mode which prevents failing + // So()-assertions from halting Convey-block execution, instead + // allowing the test to continue past failing So()-assertions. + FailureContinues FailureMode = "continue" + + // FailureHalts is the default setting for a top-level Convey()-block + // and will cause all failing So()-assertions to halt further execution + // in that test-arm and continue on to the next arm. + FailureHalts FailureMode = "halt" + + // FailureInherits is the default setting for failure-mode, it will + // default to the failure-mode of the parent block. You should never + // need to specify this mode in your tests.. + FailureInherits FailureMode = "inherits" +) + +func (f FailureMode) combine(other FailureMode) FailureMode { + if other == FailureInherits { + return f + } + return other +} + +var defaultFailureMode FailureMode = FailureHalts + +// SetDefaultFailureMode allows you to specify the default failure mode +// for all Convey blocks. It is meant to be used in an init function to +// allow the default mode to be changdd across all tests for an entire packgae +// but it can be used anywhere. +func SetDefaultFailureMode(mode FailureMode) { + if mode == FailureContinues || mode == FailureHalts { + defaultFailureMode = mode + } else { + panic("You may only use the constants named 'FailureContinues' and 'FailureHalts' as default failure modes.") + } +} + +//////////////////////////////////// Print functions //////////////////////////////////// + +// Print is analogous to fmt.Print (and it even calls fmt.Print). It ensures that +// output is aligned with the corresponding scopes in the web UI. +func Print(items ...interface{}) (written int, err error) { + return mustGetCurrentContext().Print(items...) +} + +// Print is analogous to fmt.Println (and it even calls fmt.Println). It ensures that +// output is aligned with the corresponding scopes in the web UI. +func Println(items ...interface{}) (written int, err error) { + return mustGetCurrentContext().Println(items...) +} + +// Print is analogous to fmt.Printf (and it even calls fmt.Printf). It ensures that +// output is aligned with the corresponding scopes in the web UI. +func Printf(format string, items ...interface{}) (written int, err error) { + return mustGetCurrentContext().Printf(format, items...) +} + +/////////////////////////////////////////////////////////////////////////////// + +// SuppressConsoleStatistics prevents automatic printing of console statistics. +// Calling PrintConsoleStatistics explicitly will force printing of statistics. +func SuppressConsoleStatistics() { + reporting.SuppressConsoleStatistics() +} + +// ConsoleStatistics may be called at any time to print assertion statistics. +// Generally, the best place to do this would be in a TestMain function, +// after all tests have been run. Something like this: +// +// func TestMain(m *testing.M) { +// convey.SuppressConsoleStatistics() +// result := m.Run() +// convey.PrintConsoleStatistics() +// os.Exit(result) +// } +// +func PrintConsoleStatistics() { + reporting.PrintConsoleStatistics() +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/gotest/utils.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/gotest/utils.go new file mode 100644 index 0000000000000000000000000000000000000000..167c8fb74a4326cfcf8150975113270a9c9eea61 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/gotest/utils.go @@ -0,0 +1,28 @@ +// Package gotest contains internal functionality. Although this package +// contains one or more exported names it is not intended for public +// consumption. See the examples package for how to use this project. +package gotest + +import ( + "runtime" + "strings" +) + +func ResolveExternalCaller() (file string, line int, name string) { + var caller_id uintptr + callers := runtime.Callers(0, callStack) + + for x := 0; x < callers; x++ { + caller_id, file, line, _ = runtime.Caller(x) + if strings.HasSuffix(file, "_test.go") || strings.HasSuffix(file, "_tests.go") { + name = runtime.FuncForPC(caller_id).Name() + return + } + } + file, line, name = "<unknown file>", -1, "<unknown name>" + return // panic? +} + +const maxStackDepth = 100 // This had better be enough... + +var callStack []uintptr = make([]uintptr, maxStackDepth, maxStackDepth) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/init.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/init.go new file mode 100644 index 0000000000000000000000000000000000000000..cb930a0db4f0d49764ae5ec0a9185545d2741e68 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/init.go @@ -0,0 +1,81 @@ +package convey + +import ( + "flag" + "os" + + "github.com/jtolds/gls" + "github.com/smartystreets/assertions" + "github.com/smartystreets/goconvey/convey/reporting" +) + +func init() { + assertions.GoConveyMode(true) + + declareFlags() + + ctxMgr = gls.NewContextManager() +} + +func declareFlags() { + flag.BoolVar(&json, "convey-json", false, "When true, emits results in JSON blocks. Default: 'false'") + flag.BoolVar(&silent, "convey-silent", false, "When true, all output from GoConvey is suppressed.") + flag.BoolVar(&story, "convey-story", false, "When true, emits story output, otherwise emits dot output. When not provided, this flag mirrors the value of the '-test.v' flag") + + if noStoryFlagProvided() { + story = verboseEnabled + } + + // FYI: flag.Parse() is called from the testing package. +} + +func noStoryFlagProvided() bool { + return !story && !storyDisabled +} + +func buildReporter() reporting.Reporter { + selectReporter := os.Getenv("GOCONVEY_REPORTER") + + switch { + case testReporter != nil: + return testReporter + case json || selectReporter == "json": + return reporting.BuildJsonReporter() + case silent || selectReporter == "silent": + return reporting.BuildSilentReporter() + case selectReporter == "dot": + // Story is turned on when verbose is set, so we need to check for dot reporter first. + return reporting.BuildDotReporter() + case story || selectReporter == "story": + return reporting.BuildStoryReporter() + default: + return reporting.BuildDotReporter() + } +} + +var ( + ctxMgr *gls.ContextManager + + // only set by internal tests + testReporter reporting.Reporter +) + +var ( + json bool + silent bool + story bool + + verboseEnabled = flagFound("-test.v=true") + storyDisabled = flagFound("-story=false") +) + +// flagFound parses the command line args manually for flags defined in other +// packages. Like the '-v' flag from the "testing" package, for instance. +func flagFound(flagValue string) bool { + for _, arg := range os.Args { + if arg == flagValue { + return true + } + } + return false +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/nilReporter.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/nilReporter.go new file mode 100644 index 0000000000000000000000000000000000000000..777b2a51228f3e7cfee703556965c154de6203e0 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/nilReporter.go @@ -0,0 +1,15 @@ +package convey + +import ( + "github.com/smartystreets/goconvey/convey/reporting" +) + +type nilReporter struct{} + +func (self *nilReporter) BeginStory(story *reporting.StoryReport) {} +func (self *nilReporter) Enter(scope *reporting.ScopeReport) {} +func (self *nilReporter) Report(report *reporting.AssertionResult) {} +func (self *nilReporter) Exit() {} +func (self *nilReporter) EndStory() {} +func (self *nilReporter) Write(p []byte) (int, error) { return len(p), nil } +func newNilReporter() *nilReporter { return &nilReporter{} } diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/console.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/console.go new file mode 100644 index 0000000000000000000000000000000000000000..7bf67dbb2b14cb4534b5984ba6cbc83e1b4bc761 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/console.go @@ -0,0 +1,16 @@ +package reporting + +import ( + "fmt" + "io" +) + +type console struct{} + +func (self *console) Write(p []byte) (n int, err error) { + return fmt.Print(string(p)) +} + +func NewConsole() io.Writer { + return new(console) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/doc.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/doc.go new file mode 100644 index 0000000000000000000000000000000000000000..a37d001946612e683ddccdde0b47adc0736fc75e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/doc.go @@ -0,0 +1,5 @@ +// Package reporting contains internal functionality related +// to console reporting and output. Although this package has +// exported names is not intended for public consumption. See the +// examples package for how to use this project. +package reporting diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/dot.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/dot.go new file mode 100644 index 0000000000000000000000000000000000000000..47d57c6b0d961ac81b55f1998850692072955e4e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/dot.go @@ -0,0 +1,40 @@ +package reporting + +import "fmt" + +type dot struct{ out *Printer } + +func (self *dot) BeginStory(story *StoryReport) {} + +func (self *dot) Enter(scope *ScopeReport) {} + +func (self *dot) Report(report *AssertionResult) { + if report.Error != nil { + fmt.Print(redColor) + self.out.Insert(dotError) + } else if report.Failure != "" { + fmt.Print(yellowColor) + self.out.Insert(dotFailure) + } else if report.Skipped { + fmt.Print(yellowColor) + self.out.Insert(dotSkip) + } else { + fmt.Print(greenColor) + self.out.Insert(dotSuccess) + } + fmt.Print(resetColor) +} + +func (self *dot) Exit() {} + +func (self *dot) EndStory() {} + +func (self *dot) Write(content []byte) (written int, err error) { + return len(content), nil // no-op +} + +func NewDotReporter(out *Printer) *dot { + self := new(dot) + self.out = out + return self +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/gotest.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/gotest.go new file mode 100644 index 0000000000000000000000000000000000000000..c396e16b17a5aaa182d93b1c6414508c755e0bc8 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/gotest.go @@ -0,0 +1,33 @@ +package reporting + +type gotestReporter struct{ test T } + +func (self *gotestReporter) BeginStory(story *StoryReport) { + self.test = story.Test +} + +func (self *gotestReporter) Enter(scope *ScopeReport) {} + +func (self *gotestReporter) Report(r *AssertionResult) { + if !passed(r) { + self.test.Fail() + } +} + +func (self *gotestReporter) Exit() {} + +func (self *gotestReporter) EndStory() { + self.test = nil +} + +func (self *gotestReporter) Write(content []byte) (written int, err error) { + return len(content), nil // no-op +} + +func NewGoTestReporter() *gotestReporter { + return new(gotestReporter) +} + +func passed(r *AssertionResult) bool { + return r.Error == nil && r.Failure == "" +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/init.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/init.go new file mode 100644 index 0000000000000000000000000000000000000000..44d080e90e6383641442f573e52846d4d59c8f3b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/init.go @@ -0,0 +1,94 @@ +package reporting + +import ( + "os" + "runtime" + "strings" +) + +func init() { + if !isColorableTerminal() { + monochrome() + } + + if runtime.GOOS == "windows" { + success, failure, error_ = dotSuccess, dotFailure, dotError + } +} + +func BuildJsonReporter() Reporter { + out := NewPrinter(NewConsole()) + return NewReporters( + NewGoTestReporter(), + NewJsonReporter(out)) +} +func BuildDotReporter() Reporter { + out := NewPrinter(NewConsole()) + return NewReporters( + NewGoTestReporter(), + NewDotReporter(out), + NewProblemReporter(out), + consoleStatistics) +} +func BuildStoryReporter() Reporter { + out := NewPrinter(NewConsole()) + return NewReporters( + NewGoTestReporter(), + NewStoryReporter(out), + NewProblemReporter(out), + consoleStatistics) +} +func BuildSilentReporter() Reporter { + out := NewPrinter(NewConsole()) + return NewReporters( + NewGoTestReporter(), + NewSilentProblemReporter(out)) +} + +var ( + newline = "\n" + success = "✔" + failure = "✘" + error_ = "🔥" + skip = "⚠" + dotSuccess = "." + dotFailure = "x" + dotError = "E" + dotSkip = "S" + errorTemplate = "* %s \nLine %d: - %v \n%s\n" + failureTemplate = "* %s \nLine %d:\n%s\n" +) + +var ( + greenColor = "\033[32m" + yellowColor = "\033[33m" + redColor = "\033[31m" + resetColor = "\033[0m" +) + +var consoleStatistics = NewStatisticsReporter(NewPrinter(NewConsole())) + +func SuppressConsoleStatistics() { consoleStatistics.Suppress() } +func PrintConsoleStatistics() { consoleStatistics.PrintSummary() } + +// QuiteMode disables all console output symbols. This is only meant to be used +// for tests that are internal to goconvey where the output is distracting or +// otherwise not needed in the test output. +func QuietMode() { + success, failure, error_, skip, dotSuccess, dotFailure, dotError, dotSkip = "", "", "", "", "", "", "", "" +} + +func monochrome() { + greenColor, yellowColor, redColor, resetColor = "", "", "", "" +} + +func isColorableTerminal() bool { + return strings.Contains(os.Getenv("TERM"), "color") +} + +// This interface allows us to pass the *testing.T struct +// throughout the internals of this tool without ever +// having to import the "testing" package. +type T interface { + Fail() +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/json.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/json.go new file mode 100644 index 0000000000000000000000000000000000000000..f8526979f85516c45ce38720aa4efa4d3d251d1e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/json.go @@ -0,0 +1,88 @@ +// TODO: under unit test + +package reporting + +import ( + "bytes" + "encoding/json" + "fmt" + "strings" +) + +type JsonReporter struct { + out *Printer + currentKey []string + current *ScopeResult + index map[string]*ScopeResult + scopes []*ScopeResult +} + +func (self *JsonReporter) depth() int { return len(self.currentKey) } + +func (self *JsonReporter) BeginStory(story *StoryReport) {} + +func (self *JsonReporter) Enter(scope *ScopeReport) { + self.currentKey = append(self.currentKey, scope.Title) + ID := strings.Join(self.currentKey, "|") + if _, found := self.index[ID]; !found { + next := newScopeResult(scope.Title, self.depth(), scope.File, scope.Line) + self.scopes = append(self.scopes, next) + self.index[ID] = next + } + self.current = self.index[ID] +} + +func (self *JsonReporter) Report(report *AssertionResult) { + self.current.Assertions = append(self.current.Assertions, report) +} + +func (self *JsonReporter) Exit() { + self.currentKey = self.currentKey[:len(self.currentKey)-1] +} + +func (self *JsonReporter) EndStory() { + self.report() + self.reset() +} +func (self *JsonReporter) report() { + scopes := []string{} + for _, scope := range self.scopes { + serialized, err := json.Marshal(scope) + if err != nil { + self.out.Println(jsonMarshalFailure) + panic(err) + } + var buffer bytes.Buffer + json.Indent(&buffer, serialized, "", " ") + scopes = append(scopes, buffer.String()) + } + self.out.Print(fmt.Sprintf("%s\n%s,\n%s\n", OpenJson, strings.Join(scopes, ","), CloseJson)) +} +func (self *JsonReporter) reset() { + self.scopes = []*ScopeResult{} + self.index = map[string]*ScopeResult{} + self.currentKey = nil +} + +func (self *JsonReporter) Write(content []byte) (written int, err error) { + self.current.Output += string(content) + return len(content), nil +} + +func NewJsonReporter(out *Printer) *JsonReporter { + self := new(JsonReporter) + self.out = out + self.reset() + return self +} + +const OpenJson = ">->->OPEN-JSON->->->" // "⌦" +const CloseJson = "<-<-<-CLOSE-JSON<-<-<" // "⌫" +const jsonMarshalFailure = ` + +GOCONVEY_JSON_MARSHALL_FAILURE: There was an error when attempting to convert test results to JSON. +Please file a bug report and reference the code that caused this failure if possible. + +Here's the panic: + +` diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/printer.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/printer.go new file mode 100644 index 0000000000000000000000000000000000000000..3dac0d4d283577646c483144192489dc1f444088 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/printer.go @@ -0,0 +1,60 @@ +package reporting + +import ( + "fmt" + "io" + "strings" +) + +type Printer struct { + out io.Writer + prefix string +} + +func (self *Printer) Println(message string, values ...interface{}) { + formatted := self.format(message, values...) + newline + self.out.Write([]byte(formatted)) +} + +func (self *Printer) Print(message string, values ...interface{}) { + formatted := self.format(message, values...) + self.out.Write([]byte(formatted)) +} + +func (self *Printer) Insert(text string) { + self.out.Write([]byte(text)) +} + +func (self *Printer) format(message string, values ...interface{}) string { + var formatted string + if len(values) == 0 { + formatted = self.prefix + message + } else { + formatted = self.prefix + fmt_Sprintf(message, values...) + } + indented := strings.Replace(formatted, newline, newline+self.prefix, -1) + return strings.TrimRight(indented, space) +} + +// Extracting fmt.Sprintf to a separate variable circumvents go vet, which, as of go 1.10 is run with go test. +var fmt_Sprintf = fmt.Sprintf + +func (self *Printer) Indent() { + self.prefix += pad +} + +func (self *Printer) Dedent() { + if len(self.prefix) >= padLength { + self.prefix = self.prefix[:len(self.prefix)-padLength] + } +} + +func NewPrinter(out io.Writer) *Printer { + self := new(Printer) + self.out = out + return self +} + +const space = " " +const pad = space + space +const padLength = len(pad) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/problems.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/problems.go new file mode 100644 index 0000000000000000000000000000000000000000..9ae493ac3b70e4ea51d55d754aa93e5cfd466717 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/problems.go @@ -0,0 +1,80 @@ +package reporting + +import "fmt" + +type problem struct { + silent bool + out *Printer + errors []*AssertionResult + failures []*AssertionResult +} + +func (self *problem) BeginStory(story *StoryReport) {} + +func (self *problem) Enter(scope *ScopeReport) {} + +func (self *problem) Report(report *AssertionResult) { + if report.Error != nil { + self.errors = append(self.errors, report) + } else if report.Failure != "" { + self.failures = append(self.failures, report) + } +} + +func (self *problem) Exit() {} + +func (self *problem) EndStory() { + self.show(self.showErrors, redColor) + self.show(self.showFailures, yellowColor) + self.prepareForNextStory() +} +func (self *problem) show(display func(), color string) { + if !self.silent { + fmt.Print(color) + } + display() + if !self.silent { + fmt.Print(resetColor) + } + self.out.Dedent() +} +func (self *problem) showErrors() { + for i, e := range self.errors { + if i == 0 { + self.out.Println("\nErrors:\n") + self.out.Indent() + } + self.out.Println(errorTemplate, e.File, e.Line, e.Error, e.StackTrace) + } +} +func (self *problem) showFailures() { + for i, f := range self.failures { + if i == 0 { + self.out.Println("\nFailures:\n") + self.out.Indent() + } + self.out.Println(failureTemplate, f.File, f.Line, f.Failure) + } +} + +func (self *problem) Write(content []byte) (written int, err error) { + return len(content), nil // no-op +} + +func NewProblemReporter(out *Printer) *problem { + self := new(problem) + self.out = out + self.prepareForNextStory() + return self +} + +func NewSilentProblemReporter(out *Printer) *problem { + self := NewProblemReporter(out) + self.silent = true + return self +} + +func (self *problem) prepareForNextStory() { + self.errors = []*AssertionResult{} + self.failures = []*AssertionResult{} +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/reporter.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/reporter.go new file mode 100644 index 0000000000000000000000000000000000000000..cce6c5e4388500e1f3beadb27850dd6010687c83 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/reporter.go @@ -0,0 +1,39 @@ +package reporting + +import "io" + +type Reporter interface { + BeginStory(story *StoryReport) + Enter(scope *ScopeReport) + Report(r *AssertionResult) + Exit() + EndStory() + io.Writer +} + +type reporters struct{ collection []Reporter } + +func (self *reporters) BeginStory(s *StoryReport) { self.foreach(func(r Reporter) { r.BeginStory(s) }) } +func (self *reporters) Enter(s *ScopeReport) { self.foreach(func(r Reporter) { r.Enter(s) }) } +func (self *reporters) Report(a *AssertionResult) { self.foreach(func(r Reporter) { r.Report(a) }) } +func (self *reporters) Exit() { self.foreach(func(r Reporter) { r.Exit() }) } +func (self *reporters) EndStory() { self.foreach(func(r Reporter) { r.EndStory() }) } + +func (self *reporters) Write(contents []byte) (written int, err error) { + self.foreach(func(r Reporter) { + written, err = r.Write(contents) + }) + return written, err +} + +func (self *reporters) foreach(action func(Reporter)) { + for _, r := range self.collection { + action(r) + } +} + +func NewReporters(collection ...Reporter) *reporters { + self := new(reporters) + self.collection = collection + return self +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/reporting.goconvey b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/reporting.goconvey new file mode 100644 index 0000000000000000000000000000000000000000..79982854b533ac0fe6cc38c4de1f5d218c517f05 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/reporting.goconvey @@ -0,0 +1,2 @@ +#ignore +-timeout=1s diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/reports.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/reports.go new file mode 100644 index 0000000000000000000000000000000000000000..712e6ade625d264021e26ff1b4516feb086af533 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/reports.go @@ -0,0 +1,179 @@ +package reporting + +import ( + "encoding/json" + "fmt" + "runtime" + "strings" + + "github.com/smartystreets/goconvey/convey/gotest" +) + +////////////////// ScopeReport //////////////////// + +type ScopeReport struct { + Title string + File string + Line int +} + +func NewScopeReport(title string) *ScopeReport { + file, line, _ := gotest.ResolveExternalCaller() + self := new(ScopeReport) + self.Title = title + self.File = file + self.Line = line + return self +} + +////////////////// ScopeResult //////////////////// + +type ScopeResult struct { + Title string + File string + Line int + Depth int + Assertions []*AssertionResult + Output string +} + +func newScopeResult(title string, depth int, file string, line int) *ScopeResult { + self := new(ScopeResult) + self.Title = title + self.Depth = depth + self.File = file + self.Line = line + self.Assertions = []*AssertionResult{} + return self +} + +/////////////////// StoryReport ///////////////////// + +type StoryReport struct { + Test T + Name string + File string + Line int +} + +func NewStoryReport(test T) *StoryReport { + file, line, name := gotest.ResolveExternalCaller() + name = removePackagePath(name) + self := new(StoryReport) + self.Test = test + self.Name = name + self.File = file + self.Line = line + return self +} + +// name comes in looking like "github.com/smartystreets/goconvey/examples.TestName". +// We only want the stuff after the last '.', which is the name of the test function. +func removePackagePath(name string) string { + parts := strings.Split(name, ".") + return parts[len(parts)-1] +} + +/////////////////// FailureView //////////////////////// + +// This struct is also declared in github.com/smartystreets/assertions. +// The json struct tags should be equal in both declarations. +type FailureView struct { + Message string `json:"Message"` + Expected string `json:"Expected"` + Actual string `json:"Actual"` +} + +////////////////////AssertionResult ////////////////////// + +type AssertionResult struct { + File string + Line int + Expected string + Actual string + Failure string + Error interface{} + StackTrace string + Skipped bool +} + +func NewFailureReport(failure string) *AssertionResult { + report := new(AssertionResult) + report.File, report.Line = caller() + report.StackTrace = stackTrace() + parseFailure(failure, report) + return report +} +func parseFailure(failure string, report *AssertionResult) { + view := new(FailureView) + err := json.Unmarshal([]byte(failure), view) + if err == nil { + report.Failure = view.Message + report.Expected = view.Expected + report.Actual = view.Actual + } else { + report.Failure = failure + } +} +func NewErrorReport(err interface{}) *AssertionResult { + report := new(AssertionResult) + report.File, report.Line = caller() + report.StackTrace = fullStackTrace() + report.Error = fmt.Sprintf("%v", err) + return report +} +func NewSuccessReport() *AssertionResult { + return new(AssertionResult) +} +func NewSkipReport() *AssertionResult { + report := new(AssertionResult) + report.File, report.Line = caller() + report.StackTrace = fullStackTrace() + report.Skipped = true + return report +} + +func caller() (file string, line int) { + file, line, _ = gotest.ResolveExternalCaller() + return +} + +func stackTrace() string { + buffer := make([]byte, 1024*64) + n := runtime.Stack(buffer, false) + return removeInternalEntries(string(buffer[:n])) +} +func fullStackTrace() string { + buffer := make([]byte, 1024*64) + n := runtime.Stack(buffer, true) + return removeInternalEntries(string(buffer[:n])) +} +func removeInternalEntries(stack string) string { + lines := strings.Split(stack, newline) + filtered := []string{} + for _, line := range lines { + if !isExternal(line) { + filtered = append(filtered, line) + } + } + return strings.Join(filtered, newline) +} +func isExternal(line string) bool { + for _, p := range internalPackages { + if strings.Contains(line, p) { + return true + } + } + return false +} + +// NOTE: any new packages that host goconvey packages will need to be added here! +// An alternative is to scan the goconvey directory and then exclude stuff like +// the examples package but that's nasty too. +var internalPackages = []string{ + "goconvey/assertions", + "goconvey/convey", + "goconvey/execution", + "goconvey/gotest", + "goconvey/reporting", +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/statistics.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/statistics.go new file mode 100644 index 0000000000000000000000000000000000000000..c3ccd056a0bb09225b97dc89ae9515776a5d264b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/statistics.go @@ -0,0 +1,108 @@ +package reporting + +import ( + "fmt" + "sync" +) + +func (self *statistics) BeginStory(story *StoryReport) {} + +func (self *statistics) Enter(scope *ScopeReport) {} + +func (self *statistics) Report(report *AssertionResult) { + self.Lock() + defer self.Unlock() + + if !self.failing && report.Failure != "" { + self.failing = true + } + if !self.erroring && report.Error != nil { + self.erroring = true + } + if report.Skipped { + self.skipped += 1 + } else { + self.total++ + } +} + +func (self *statistics) Exit() {} + +func (self *statistics) EndStory() { + self.Lock() + defer self.Unlock() + + if !self.suppressed { + self.printSummaryLocked() + } +} + +func (self *statistics) Suppress() { + self.Lock() + defer self.Unlock() + self.suppressed = true +} + +func (self *statistics) PrintSummary() { + self.Lock() + defer self.Unlock() + self.printSummaryLocked() +} + +func (self *statistics) printSummaryLocked() { + self.reportAssertionsLocked() + self.reportSkippedSectionsLocked() + self.completeReportLocked() +} +func (self *statistics) reportAssertionsLocked() { + self.decideColorLocked() + self.out.Print("\n%d total %s", self.total, plural("assertion", self.total)) +} +func (self *statistics) decideColorLocked() { + if self.failing && !self.erroring { + fmt.Print(yellowColor) + } else if self.erroring { + fmt.Print(redColor) + } else { + fmt.Print(greenColor) + } +} +func (self *statistics) reportSkippedSectionsLocked() { + if self.skipped > 0 { + fmt.Print(yellowColor) + self.out.Print(" (one or more sections skipped)") + } +} +func (self *statistics) completeReportLocked() { + fmt.Print(resetColor) + self.out.Print("\n") + self.out.Print("\n") +} + +func (self *statistics) Write(content []byte) (written int, err error) { + return len(content), nil // no-op +} + +func NewStatisticsReporter(out *Printer) *statistics { + self := statistics{} + self.out = out + return &self +} + +type statistics struct { + sync.Mutex + + out *Printer + total int + failing bool + erroring bool + skipped int + suppressed bool +} + +func plural(word string, count int) string { + if count == 1 { + return word + } + return word + "s" +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/story.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/story.go new file mode 100644 index 0000000000000000000000000000000000000000..9e73c971f8fb8765ff242c1ba00db11dcdd4372e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/convey/reporting/story.go @@ -0,0 +1,73 @@ +// TODO: in order for this reporter to be completely honest +// we need to retrofit to be more like the json reporter such that: +// 1. it maintains ScopeResult collections, which count assertions +// 2. it reports only after EndStory(), so that all tick marks +// are placed near the appropriate title. +// 3. Under unit test + +package reporting + +import ( + "fmt" + "strings" +) + +type story struct { + out *Printer + titlesById map[string]string + currentKey []string +} + +func (self *story) BeginStory(story *StoryReport) {} + +func (self *story) Enter(scope *ScopeReport) { + self.out.Indent() + + self.currentKey = append(self.currentKey, scope.Title) + ID := strings.Join(self.currentKey, "|") + + if _, found := self.titlesById[ID]; !found { + self.out.Println("") + self.out.Print(scope.Title) + self.out.Insert(" ") + self.titlesById[ID] = scope.Title + } +} + +func (self *story) Report(report *AssertionResult) { + if report.Error != nil { + fmt.Print(redColor) + self.out.Insert(error_) + } else if report.Failure != "" { + fmt.Print(yellowColor) + self.out.Insert(failure) + } else if report.Skipped { + fmt.Print(yellowColor) + self.out.Insert(skip) + } else { + fmt.Print(greenColor) + self.out.Insert(success) + } + fmt.Print(resetColor) +} + +func (self *story) Exit() { + self.out.Dedent() + self.currentKey = self.currentKey[:len(self.currentKey)-1] +} + +func (self *story) EndStory() { + self.titlesById = make(map[string]string) + self.out.Println("\n") +} + +func (self *story) Write(content []byte) (written int, err error) { + return len(content), nil // no-op +} + +func NewStoryReporter(out *Printer) *story { + self := new(story) + self.out = out + self.titlesById = make(map[string]string) + return self +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/dependencies.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/dependencies.go new file mode 100644 index 0000000000000000000000000000000000000000..0839e27fdf289b92d77dc34808af54e13497d9c3 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/dependencies.go @@ -0,0 +1,4 @@ +package main + +import _ "github.com/jtolds/gls" +import _ "github.com/smartystreets/assertions" diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/goconvey.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/goconvey.go new file mode 100644 index 0000000000000000000000000000000000000000..1e6082acd00b286b9ee6a0bc7b7af3fb9de701ce --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/goconvey.go @@ -0,0 +1,307 @@ +// This executable provides an HTTP server that watches for file system changes +// to .go files within the working directory (and all nested go packages). +// Navigating to the configured host and port in a web browser will display the +// latest results of running `go test` in each go package. +package main + +import ( + "flag" + "fmt" + "log" + "net" + "net/http" + "os" + "os/exec" + "path/filepath" + "regexp" + "runtime" + "strconv" + "strings" + "time" + + "go/build" + + "github.com/smartystreets/goconvey/web/server/api" + "github.com/smartystreets/goconvey/web/server/contract" + "github.com/smartystreets/goconvey/web/server/executor" + "github.com/smartystreets/goconvey/web/server/messaging" + "github.com/smartystreets/goconvey/web/server/parser" + "github.com/smartystreets/goconvey/web/server/system" + "github.com/smartystreets/goconvey/web/server/watch" +) + +func init() { + flags() + folders() +} +func flags() { + flag.IntVar(&port, "port", 8080, "The port at which to serve http.") + flag.StringVar(&host, "host", "127.0.0.1", "The host at which to serve http.") + flag.DurationVar(&nap, "poll", quarterSecond, "The interval to wait between polling the file system for changes.") + flag.IntVar(&packages, "packages", 10, "The number of packages to test in parallel. Higher == faster but more costly in terms of computing.") + flag.StringVar(&gobin, "gobin", "go", "The path to the 'go' binary (default: search on the PATH).") + flag.BoolVar(&cover, "cover", true, "Enable package-level coverage statistics. Requires Go 1.2+ and the go cover tool.") + flag.IntVar(&depth, "depth", -1, "The directory scanning depth. If -1, scan infinitely deep directory structures. 0: scan working directory. 1+: Scan into nested directories, limited to value.") + flag.StringVar(&timeout, "timeout", "0", "The test execution timeout if none is specified in the *.goconvey file (default is '0', which is the same as not providing this option).") + flag.StringVar(&watchedSuffixes, "watchedSuffixes", ".go", "A comma separated list of file suffixes to watch for modifications.") + flag.StringVar(&excludedDirs, "excludedDirs", "vendor,node_modules", "A comma separated list of directories that will be excluded from being watched") + flag.StringVar(&workDir, "workDir", "", "set goconvey working directory (default current directory)") + flag.BoolVar(&autoLaunchBrowser, "launchBrowser", true, "toggle auto launching of browser (default: true)") + + log.SetOutput(os.Stdout) + log.SetFlags(log.LstdFlags | log.Lshortfile) +} +func folders() { + _, file, _, _ := runtime.Caller(0) + here := filepath.Dir(file) + static = filepath.Join(here, "/web/client") + reports = filepath.Join(static, "reports") +} + +func main() { + flag.Parse() + log.Printf(initialConfiguration, host, port, nap, cover) + + working := getWorkDir() + cover = coverageEnabled(cover, reports) + shell := system.NewShell(gobin, reports, cover, timeout) + + watcherInput := make(chan messaging.WatcherCommand) + watcherOutput := make(chan messaging.Folders) + excludedDirItems := strings.Split(excludedDirs, `,`) + watcher := watch.NewWatcher(working, depth, nap, watcherInput, watcherOutput, watchedSuffixes, excludedDirItems) + + parser := parser.NewParser(parser.ParsePackageResults) + tester := executor.NewConcurrentTester(shell) + tester.SetBatchSize(packages) + + longpollChan := make(chan chan string) + executor := executor.NewExecutor(tester, parser, longpollChan) + server := api.NewHTTPServer(working, watcherInput, executor, longpollChan) + listener := createListener() + go runTestOnUpdates(watcherOutput, executor, server) + go watcher.Listen() + if autoLaunchBrowser { + go launchBrowser(listener.Addr().String()) + } + serveHTTP(server, listener) +} + +func browserCmd() (string, bool) { + browser := map[string]string{ + "darwin": "open", + "linux": "xdg-open", + "win32": "start", + } + cmd, ok := browser[runtime.GOOS] + return cmd, ok +} + +func launchBrowser(addr string) { + browser, ok := browserCmd() + if !ok { + log.Printf("Skipped launching browser for this OS: %s", runtime.GOOS) + return + } + + log.Printf("Launching browser on %s", addr) + url := fmt.Sprintf("http://%s", addr) + cmd := exec.Command(browser, url) + + output, err := cmd.CombinedOutput() + if err != nil { + log.Println(err) + } + log.Println(string(output)) +} + +func runTestOnUpdates(queue chan messaging.Folders, executor contract.Executor, server contract.Server) { + for update := range queue { + log.Println("Received request from watcher to execute tests...") + packages := extractPackages(update) + output := executor.ExecuteTests(packages) + root := extractRoot(update, packages) + server.ReceiveUpdate(root, output) + } +} + +func extractPackages(folderList messaging.Folders) []*contract.Package { + packageList := []*contract.Package{} + for _, folder := range folderList { + hasImportCycle := testFilesImportTheirOwnPackage(folder.Path) + packageList = append(packageList, contract.NewPackage(folder, hasImportCycle)) + } + return packageList +} + +func extractRoot(folderList messaging.Folders, packageList []*contract.Package) string { + path := packageList[0].Path + folder := folderList[path] + return folder.Root +} + +// This method exists because of a bug in the go cover tool that +// causes an infinite loop when you try to run `go test -cover` +// on a package that has an import cycle defined in one of it's +// test files. Yuck. +func testFilesImportTheirOwnPackage(packagePath string) bool { + meta, err := build.ImportDir(packagePath, build.AllowBinary) + if err != nil { + return false + } + + for _, dependency := range meta.TestImports { + if dependency == meta.ImportPath { + return true + } + } + return false +} + +func createListener() net.Listener { + l, err := net.Listen("tcp", fmt.Sprintf("%s:%d", host, port)) + if err != nil { + log.Println(err) + } + if l == nil { + os.Exit(1) + } + return l +} + +func serveHTTP(server contract.Server, listener net.Listener) { + serveStaticResources() + serveAjaxMethods(server) + activateServer(listener) +} + +func serveStaticResources() { + http.Handle("/", http.FileServer(http.Dir(static))) +} + +func serveAjaxMethods(server contract.Server) { + http.HandleFunc("/watch", server.Watch) + http.HandleFunc("/ignore", server.Ignore) + http.HandleFunc("/reinstate", server.Reinstate) + http.HandleFunc("/latest", server.Results) + http.HandleFunc("/execute", server.Execute) + http.HandleFunc("/status", server.Status) + http.HandleFunc("/status/poll", server.LongPollStatus) + http.HandleFunc("/pause", server.TogglePause) +} + +func activateServer(listener net.Listener) { + log.Printf("Serving HTTP at: http://%s\n", listener.Addr()) + err := http.Serve(listener, nil) + if err != nil { + log.Println(err) + } +} + +func coverageEnabled(cover bool, reports string) bool { + return (cover && + goMinVersion(1, 2) && + coverToolInstalled() && + ensureReportDirectoryExists(reports)) +} +func goMinVersion(wanted ...int) bool { + version := runtime.Version() // 'go1.2....' + s := regexp.MustCompile(`go([\d]+)\.([\d]+)\.?([\d]+)?`).FindAllStringSubmatch(version, 1) + if len(s) == 0 { + log.Printf("Cannot determine if newer than go1.2, disabling coverage.") + return false + } + for idx, str := range s[0][1:] { + if len(wanted) == idx { + break + } + if v, _ := strconv.Atoi(str); v < wanted[idx] { + log.Printf(pleaseUpgradeGoVersion, version) + return false + } + } + return true +} +func coverToolInstalled() bool { + working := getWorkDir() + command := system.NewCommand(working, "go", "tool", "cover").Execute() + installed := strings.Contains(command.Output, "Usage of 'go tool cover':") + if !installed { + log.Print(coverToolMissing) + return false + } + return true +} +func ensureReportDirectoryExists(reports string) bool { + result, err := exists(reports) + if err != nil { + log.Fatal(err) + } + if result { + return true + } + + if err := os.Mkdir(reports, 0755); err == nil { + return true + } + + log.Printf(reportDirectoryUnavailable, reports) + return false +} +func exists(path string) (bool, error) { + _, err := os.Stat(path) + if err == nil { + return true, nil + } + if os.IsNotExist(err) { + return false, nil + } + return false, err +} +func getWorkDir() string { + working := "" + var err error + if workDir != "" { + working = workDir + } else { + working, err = os.Getwd() + if err != nil { + log.Fatal(err) + } + } + result, err := exists(working) + if err != nil { + log.Fatal(err) + } + if !result { + log.Fatalf("Path:%s does not exists", working) + } + return working +} + +var ( + port int + host string + gobin string + nap time.Duration + packages int + cover bool + depth int + timeout string + watchedSuffixes string + excludedDirs string + autoLaunchBrowser bool + + static string + reports string + + quarterSecond = time.Millisecond * 250 + workDir string +) + +const ( + initialConfiguration = "Initial configuration: [host: %s] [port: %d] [poll: %v] [cover: %v]\n" + pleaseUpgradeGoVersion = "Go version is less that 1.2 (%s), please upgrade to the latest stable version to enable coverage reporting.\n" + coverToolMissing = "Go cover tool is not installed or not accessible: for Go < 1.5 run`go get golang.org/x/tools/cmd/cover`\n For >= Go 1.5 run `go install $GOROOT/src/cmd/cover`\n" + reportDirectoryUnavailable = "Could not find or create the coverage report directory (at: '%s'). You probably won't see any coverage statistics...\n" +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/api/api.goconvey b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/api/api.goconvey new file mode 100644 index 0000000000000000000000000000000000000000..79982854b533ac0fe6cc38c4de1f5d218c517f05 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/api/api.goconvey @@ -0,0 +1,2 @@ +#ignore +-timeout=1s diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/api/server.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/api/server.go new file mode 100644 index 0000000000000000000000000000000000000000..6cea26daee8f05d3cefa717e5862f4d1e4b819d8 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/api/server.go @@ -0,0 +1,164 @@ +package api + +import ( + "encoding/json" + "fmt" + "net/http" + "os" + "strconv" + "time" + + "github.com/smartystreets/goconvey/web/server/contract" + "github.com/smartystreets/goconvey/web/server/messaging" +) + +type HTTPServer struct { + watcher chan messaging.WatcherCommand + executor contract.Executor + latest *contract.CompleteOutput + currentRoot string + longpoll chan chan string + paused bool +} + +func (self *HTTPServer) ReceiveUpdate(root string, update *contract.CompleteOutput) { + self.currentRoot = root + self.latest = update +} + +func (self *HTTPServer) Watch(response http.ResponseWriter, request *http.Request) { + if request.Method == "POST" { + self.adjustRoot(response, request) + } else if request.Method == "GET" { + response.Write([]byte(self.currentRoot)) + } +} + +func (self *HTTPServer) adjustRoot(response http.ResponseWriter, request *http.Request) { + newRoot := self.parseQueryString("root", response, request) + if newRoot == "" { + return + } + info, err := os.Stat(newRoot) // TODO: how to unit test? + if !info.IsDir() || err != nil { + http.Error(response, err.Error(), http.StatusNotFound) + return + } + + self.watcher <- messaging.WatcherCommand{ + Instruction: messaging.WatcherAdjustRoot, + Details: newRoot, + } +} + +func (self *HTTPServer) Ignore(response http.ResponseWriter, request *http.Request) { + paths := self.parseQueryString("paths", response, request) + if paths != "" { + self.watcher <- messaging.WatcherCommand{ + Instruction: messaging.WatcherIgnore, + Details: paths, + } + } +} + +func (self *HTTPServer) Reinstate(response http.ResponseWriter, request *http.Request) { + paths := self.parseQueryString("paths", response, request) + if paths != "" { + self.watcher <- messaging.WatcherCommand{ + Instruction: messaging.WatcherReinstate, + Details: paths, + } + } +} + +func (self *HTTPServer) parseQueryString(key string, response http.ResponseWriter, request *http.Request) string { + value := request.URL.Query()[key] + + if len(value) == 0 { + http.Error(response, fmt.Sprintf("No '%s' query string parameter included!", key), http.StatusBadRequest) + return "" + } + + path := value[0] + if path == "" { + http.Error(response, "You must provide a non-blank path.", http.StatusBadRequest) + } + return path +} + +func (self *HTTPServer) Status(response http.ResponseWriter, request *http.Request) { + status := self.executor.Status() + response.Write([]byte(status)) +} + +func (self *HTTPServer) LongPollStatus(response http.ResponseWriter, request *http.Request) { + if self.executor.ClearStatusFlag() { + response.Write([]byte(self.executor.Status())) + return + } + + timeout, err := strconv.Atoi(request.URL.Query().Get("timeout")) + if err != nil || timeout > 180000 || timeout < 0 { + timeout = 60000 // default timeout is 60 seconds + } + + myReqChan := make(chan string) + + select { + case self.longpoll <- myReqChan: // this case means the executor's status is changing + case <-time.After(time.Duration(timeout) * time.Millisecond): // this case means the executor hasn't changed status + return + } + + out := <-myReqChan + + if out != "" { // TODO: Why is this check necessary? Sometimes it writes empty string... + response.Write([]byte(out)) + } +} + +func (self *HTTPServer) Results(response http.ResponseWriter, request *http.Request) { + response.Header().Set("Content-Type", "application/json") + response.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") + response.Header().Set("Pragma", "no-cache") + response.Header().Set("Expires", "0") + if self.latest != nil { + self.latest.Paused = self.paused + } + stuff, _ := json.Marshal(self.latest) + response.Write(stuff) +} + +func (self *HTTPServer) Execute(response http.ResponseWriter, request *http.Request) { + go self.execute() +} + +func (self *HTTPServer) execute() { + self.watcher <- messaging.WatcherCommand{Instruction: messaging.WatcherExecute} +} + +func (self *HTTPServer) TogglePause(response http.ResponseWriter, request *http.Request) { + instruction := messaging.WatcherPause + if self.paused { + instruction = messaging.WatcherResume + } + + self.watcher <- messaging.WatcherCommand{Instruction: instruction} + self.paused = !self.paused + + fmt.Fprint(response, self.paused) // we could write out whatever helps keep the UI honest... +} + +func NewHTTPServer( + root string, + watcher chan messaging.WatcherCommand, + executor contract.Executor, + status chan chan string) *HTTPServer { + + self := new(HTTPServer) + self.currentRoot = root + self.watcher = watcher + self.executor = executor + self.longpoll = status + return self +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/contract/contracts.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/contract/contracts.go new file mode 100644 index 0000000000000000000000000000000000000000..e758f3e16e388de811dc7ef1fe38b7fe078c89ee --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/contract/contracts.go @@ -0,0 +1,27 @@ +package contract + +import "net/http" + +type ( + Server interface { + ReceiveUpdate(root string, update *CompleteOutput) + Watch(writer http.ResponseWriter, request *http.Request) + Ignore(writer http.ResponseWriter, request *http.Request) + Reinstate(writer http.ResponseWriter, request *http.Request) + Status(writer http.ResponseWriter, request *http.Request) + LongPollStatus(writer http.ResponseWriter, request *http.Request) + Results(writer http.ResponseWriter, request *http.Request) + Execute(writer http.ResponseWriter, request *http.Request) + TogglePause(writer http.ResponseWriter, request *http.Request) + } + + Executor interface { + ExecuteTests([]*Package) *CompleteOutput + Status() string + ClearStatusFlag() bool + } + + Shell interface { + GoTest(directory, packageName string, tags, arguments []string) (output string, err error) + } +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/contract/result.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/contract/result.go new file mode 100644 index 0000000000000000000000000000000000000000..c6f9bf2cfde3185cd7ef4aa99ea82fd9dd73d512 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/contract/result.go @@ -0,0 +1,120 @@ +package contract + +import ( + "path/filepath" + "strings" + + "go/build" + + "github.com/smartystreets/goconvey/convey/reporting" + "github.com/smartystreets/goconvey/web/server/messaging" +) + +type Package struct { + Path string + Name string + Ignored bool + Disabled bool + BuildTags []string + TestArguments []string + Error error + Output string + Result *PackageResult + + HasImportCycle bool +} + +func NewPackage(folder *messaging.Folder, hasImportCycle bool) *Package { + self := new(Package) + self.Path = folder.Path + self.Name = resolvePackageName(self.Path) + self.Result = NewPackageResult(self.Name) + self.Ignored = folder.Ignored + self.Disabled = folder.Disabled + self.BuildTags = folder.BuildTags + self.TestArguments = folder.TestArguments + self.HasImportCycle = hasImportCycle + return self +} + +func (self *Package) Active() bool { + return !self.Disabled && !self.Ignored +} + +func (self *Package) HasUsableResult() bool { + return self.Active() && (self.Error == nil || (self.Output != "")) +} + +type CompleteOutput struct { + Packages []*PackageResult + Revision string + Paused bool +} + +var ( // PackageResult.Outcome values: + Ignored = "ignored" + Disabled = "disabled" + Passed = "passed" + Failed = "failed" + Panicked = "panicked" + BuildFailure = "build failure" + NoTestFiles = "no test files" + NoTestFunctions = "no test functions" + NoGoFiles = "no go code" + + TestRunAbortedUnexpectedly = "test run aborted unexpectedly" +) + +type PackageResult struct { + PackageName string + Elapsed float64 + Coverage float64 + Outcome string + BuildOutput string + TestResults []TestResult +} + +func NewPackageResult(packageName string) *PackageResult { + self := new(PackageResult) + self.PackageName = packageName + self.TestResults = []TestResult{} + self.Coverage = -1 + return self +} + +type TestResult struct { + TestName string + Elapsed float64 + Passed bool + Skipped bool + File string + Line int + Message string + Error string + Stories []reporting.ScopeResult + + RawLines []string `json:",omitempty"` +} + +func NewTestResult(testName string) *TestResult { + self := new(TestResult) + self.Stories = []reporting.ScopeResult{} + self.RawLines = []string{} + self.TestName = testName + return self +} + +func resolvePackageName(path string) string { + pkg, err := build.ImportDir(path, build.FindOnly) + if err == nil { + return pkg.ImportPath + } + + nameArr := strings.Split(path, endGoPath) + return nameArr[len(nameArr)-1] +} + +const ( + separator = string(filepath.Separator) + endGoPath = separator + "src" + separator +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/executor/contract.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/executor/contract.go new file mode 100644 index 0000000000000000000000000000000000000000..209dbca59751269dc0159a750cd708a8164fba75 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/executor/contract.go @@ -0,0 +1,12 @@ +package executor + +import "github.com/smartystreets/goconvey/web/server/contract" + +type Parser interface { + Parse([]*contract.Package) +} + +type Tester interface { + SetBatchSize(batchSize int) + TestAll(folders []*contract.Package) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/executor/coordinator.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/executor/coordinator.go new file mode 100644 index 0000000000000000000000000000000000000000..117dd56d65adf8656ba2f4e01c0acf265d2ebb92 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/executor/coordinator.go @@ -0,0 +1,71 @@ +package executor + +import ( + "errors" + "fmt" + "log" + "strings" + "sync" + + "github.com/smartystreets/goconvey/web/server/contract" +) + +type concurrentCoordinator struct { + batchSize int + queue chan *contract.Package + folders []*contract.Package + shell contract.Shell + waiter sync.WaitGroup +} + +func (self *concurrentCoordinator) ExecuteConcurrently() { + self.enlistWorkers() + self.scheduleTasks() + self.awaitCompletion() +} + +func (self *concurrentCoordinator) enlistWorkers() { + for i := 0; i < self.batchSize; i++ { + self.waiter.Add(1) + go self.worker(i) + } +} +func (self *concurrentCoordinator) worker(id int) { + for folder := range self.queue { + packageName := strings.Replace(folder.Name, "\\", "/", -1) + if !folder.Active() { + log.Printf("Skipping concurrent execution: %s\n", packageName) + continue + } + + if folder.HasImportCycle { + message := fmt.Sprintf("can't load package: import cycle not allowed\npackage %s\n\timports %s", packageName, packageName) + log.Println(message) + folder.Output, folder.Error = message, errors.New(message) + } else { + log.Printf("Executing concurrent tests: %s\n", packageName) + folder.Output, folder.Error = self.shell.GoTest(folder.Path, packageName, folder.BuildTags, folder.TestArguments) + } + } + self.waiter.Done() +} + +func (self *concurrentCoordinator) scheduleTasks() { + for _, folder := range self.folders { + self.queue <- folder + } +} + +func (self *concurrentCoordinator) awaitCompletion() { + close(self.queue) + self.waiter.Wait() +} + +func newConcurrentCoordinator(folders []*contract.Package, batchSize int, shell contract.Shell) *concurrentCoordinator { + self := new(concurrentCoordinator) + self.queue = make(chan *contract.Package) + self.folders = folders + self.batchSize = batchSize + self.shell = shell + return self +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/executor/executor.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/executor/executor.go new file mode 100644 index 0000000000000000000000000000000000000000..887080ccd33228a7d076da2e2c60301f2f30a25c --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/executor/executor.go @@ -0,0 +1,84 @@ +package executor + +import ( + "log" + "time" + + "github.com/smartystreets/goconvey/web/server/contract" +) + +const ( + Idle = "idle" + Executing = "executing" +) + +type Executor struct { + tester Tester + parser Parser + status string + statusChan chan chan string + statusFlag bool +} + +func (self *Executor) Status() string { + return self.status +} + +func (self *Executor) ClearStatusFlag() bool { + hasNewStatus := self.statusFlag + self.statusFlag = false + return hasNewStatus +} + +func (self *Executor) ExecuteTests(folders []*contract.Package) *contract.CompleteOutput { + defer func() { self.setStatus(Idle) }() + self.execute(folders) + result := self.parse(folders) + return result +} + +func (self *Executor) execute(folders []*contract.Package) { + self.setStatus(Executing) + self.tester.TestAll(folders) +} + +func (self *Executor) parse(folders []*contract.Package) *contract.CompleteOutput { + result := &contract.CompleteOutput{Revision: now().String()} + self.parser.Parse(folders) + for _, folder := range folders { + result.Packages = append(result.Packages, folder.Result) + } + return result +} + +func (self *Executor) setStatus(status string) { + self.status = status + self.statusFlag = true + +Loop: + for { + select { + case c := <-self.statusChan: + self.statusFlag = false + c <- status + default: + break Loop + } + } + + log.Printf("Executor status: '%s'\n", self.status) +} + +func NewExecutor(tester Tester, parser Parser, ch chan chan string) *Executor { + return &Executor{ + tester: tester, + parser: parser, + status: Idle, + statusChan: ch, + statusFlag: false, + } +} + +var now = func() time.Time { + return time.Now() +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/executor/executor.goconvey b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/executor/executor.goconvey new file mode 100644 index 0000000000000000000000000000000000000000..79982854b533ac0fe6cc38c4de1f5d218c517f05 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/executor/executor.goconvey @@ -0,0 +1,2 @@ +#ignore +-timeout=1s diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/executor/tester.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/executor/tester.go new file mode 100644 index 0000000000000000000000000000000000000000..76f353a5baa5a1ac3d152dc6ad4ac4bd22cc6d90 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/executor/tester.go @@ -0,0 +1,56 @@ +package executor + +import ( + "errors" + "fmt" + "log" + "strings" + + "github.com/smartystreets/goconvey/web/server/contract" +) + +type ConcurrentTester struct { + shell contract.Shell + batchSize int +} + +func (self *ConcurrentTester) SetBatchSize(batchSize int) { + self.batchSize = batchSize + log.Printf("Now configured to test %d packages concurrently.\n", self.batchSize) +} + +func (self *ConcurrentTester) TestAll(folders []*contract.Package) { + if self.batchSize == 1 { + self.executeSynchronously(folders) + } else { + newConcurrentCoordinator(folders, self.batchSize, self.shell).ExecuteConcurrently() + } + return +} + +func (self *ConcurrentTester) executeSynchronously(folders []*contract.Package) { + for _, folder := range folders { + packageName := strings.Replace(folder.Name, "\\", "/", -1) + if !folder.Active() { + log.Printf("Skipping execution: %s\n", packageName) + continue + } + if folder.HasImportCycle { + message := fmt.Sprintf("can't load package: import cycle not allowed\npackage %s\n\timports %s", packageName, packageName) + log.Println(message) + folder.Output, folder.Error = message, errors.New(message) + } else { + log.Printf("Executing tests: %s\n", packageName) + folder.Output, folder.Error = self.shell.GoTest(folder.Path, packageName, folder.BuildTags, folder.TestArguments) + } + } +} + +func NewConcurrentTester(shell contract.Shell) *ConcurrentTester { + self := new(ConcurrentTester) + self.shell = shell + self.batchSize = defaultBatchSize + return self +} + +const defaultBatchSize = 10 diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/messaging/messages.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/messaging/messages.go new file mode 100644 index 0000000000000000000000000000000000000000..7a92091162ae17cf7a45d335038c41ae9bdd83a8 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/messaging/messages.go @@ -0,0 +1,56 @@ +package messaging + +/////////////////////////////////////////////////////////////////////////////// + +type WatcherCommand struct { + Instruction WatcherInstruction + Details string +} + +type WatcherInstruction int + +func (this WatcherInstruction) String() string { + switch this { + case WatcherPause: + return "Pause" + case WatcherResume: + return "Resume" + case WatcherIgnore: + return "Ignore" + case WatcherReinstate: + return "Reinstate" + case WatcherAdjustRoot: + return "AdjustRoot" + case WatcherExecute: + return "Execute" + case WatcherStop: + return "Stop" + default: + return "UNKNOWN INSTRUCTION" + } +} + +const ( + WatcherPause WatcherInstruction = iota + WatcherResume + WatcherIgnore + WatcherReinstate + WatcherAdjustRoot + WatcherExecute + WatcherStop +) + +/////////////////////////////////////////////////////////////////////////////// + +type Folders map[string]*Folder + +type Folder struct { + Path string // key + Root string + Ignored bool + Disabled bool + BuildTags []string + TestArguments []string +} + +/////////////////////////////////////////////////////////////////////////////// diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/parser/packageParser.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/parser/packageParser.go new file mode 100644 index 0000000000000000000000000000000000000000..406cc68cb9e3fec260f07b8c00b13d9ee04dcb70 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/parser/packageParser.go @@ -0,0 +1,178 @@ +package parser + +import ( + "fmt" + "regexp" + "sort" + "strconv" + "strings" + + "github.com/smartystreets/goconvey/web/server/contract" +) + +var ( + testNamePattern = regexp.MustCompile("^=== RUN:? +(.+)$") +) + +func ParsePackageResults(result *contract.PackageResult, rawOutput string) { + newOutputParser(result, rawOutput).parse() +} + +type outputParser struct { + raw string + lines []string + result *contract.PackageResult + tests []*contract.TestResult + + // place holders for loops + line string + test *contract.TestResult + testMap map[string]*contract.TestResult +} + +func newOutputParser(result *contract.PackageResult, rawOutput string) *outputParser { + self := new(outputParser) + self.raw = strings.TrimSpace(rawOutput) + self.lines = strings.Split(self.raw, "\n") + self.result = result + self.tests = []*contract.TestResult{} + self.testMap = make(map[string]*contract.TestResult) + return self +} + +func (self *outputParser) parse() { + self.separateTestFunctionsAndMetadata() + self.parseEachTestFunction() +} + +func (self *outputParser) separateTestFunctionsAndMetadata() { + for _, self.line = range self.lines { + if self.processNonTestOutput() { + break + } + self.processTestOutput() + } +} +func (self *outputParser) processNonTestOutput() bool { + if noGoFiles(self.line) { + self.recordFinalOutcome(contract.NoGoFiles) + + } else if buildFailed(self.line) { + self.recordFinalOutcome(contract.BuildFailure) + + } else if noTestFiles(self.line) { + self.recordFinalOutcome(contract.NoTestFiles) + + } else if noTestFunctions(self.line) { + self.recordFinalOutcome(contract.NoTestFunctions) + + } else { + return false + } + return true +} + +func (self *outputParser) recordFinalOutcome(outcome string) { + self.result.Outcome = outcome + self.result.BuildOutput = strings.Join(self.lines, "\n") +} + +func (self *outputParser) processTestOutput() { + self.line = strings.TrimSpace(self.line) + if isNewTest(self.line) { + self.registerTestFunction() + + } else if isTestResult(self.line) { + self.recordTestMetadata() + + } else if isPackageReport(self.line) { + self.recordPackageMetadata() + + } else { + self.saveLineForParsingLater() + + } +} + +func (self *outputParser) registerTestFunction() { + testNameReg := testNamePattern.FindStringSubmatch(self.line) + if len(testNameReg) < 2 { // Test-related lines that aren't about a new test + return + } + self.test = contract.NewTestResult(testNameReg[1]) + self.tests = append(self.tests, self.test) + self.testMap[self.test.TestName] = self.test +} +func (self *outputParser) recordTestMetadata() { + testName := strings.Split(self.line, " ")[2] + if test, ok := self.testMap[testName]; ok { + self.test = test + self.test.Passed = !strings.HasPrefix(self.line, "--- FAIL: ") + self.test.Skipped = strings.HasPrefix(self.line, "--- SKIP: ") + self.test.Elapsed = parseTestFunctionDuration(self.line) + } +} +func (self *outputParser) recordPackageMetadata() { + if packageFailed(self.line) { + self.recordTestingOutcome(contract.Failed) + + } else if packagePassed(self.line) { + self.recordTestingOutcome(contract.Passed) + + } else if isCoverageSummary(self.line) { + self.recordCoverageSummary(self.line) + } +} +func (self *outputParser) recordTestingOutcome(outcome string) { + self.result.Outcome = outcome + fields := strings.Split(self.line, "\t") + self.result.PackageName = strings.TrimSpace(fields[1]) + self.result.Elapsed = parseDurationInSeconds(fields[2], 3) +} +func (self *outputParser) recordCoverageSummary(summary string) { + start := len("coverage: ") + end := strings.Index(summary, "%") + value := summary[start:end] + parsed, err := strconv.ParseFloat(value, 64) + if err != nil { + self.result.Coverage = -1 + } else { + self.result.Coverage = parsed + } +} +func (self *outputParser) saveLineForParsingLater() { + self.line = strings.TrimLeft(self.line, "\t") + if self.test == nil { + fmt.Println("Potential error parsing output of", self.result.PackageName, "; couldn't handle this stray line:", self.line) + return + } + self.test.RawLines = append(self.test.RawLines, self.line) +} + +// TestResults is a collection of TestResults that implements sort.Interface. +type TestResults []contract.TestResult + +func (r TestResults) Len() int { + return len(r) +} + +// Less compares TestResults on TestName +func (r TestResults) Less(i, j int) bool { + return r[i].TestName < r[j].TestName +} + +func (r TestResults) Swap(i, j int) { + r[i], r[j] = r[j], r[i] +} + +func (self *outputParser) parseEachTestFunction() { + for _, self.test = range self.tests { + self.test = parseTestOutput(self.test) + if self.test.Error != "" { + self.result.Outcome = contract.Panicked + } + self.test.RawLines = []string{} + self.result.TestResults = append(self.result.TestResults, *self.test) + } + sort.Sort(TestResults(self.result.TestResults)) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/parser/parser.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/parser/parser.go new file mode 100644 index 0000000000000000000000000000000000000000..f6250caf346aedec004056cb1bf6ebc2552b07a1 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/parser/parser.go @@ -0,0 +1,32 @@ +package parser + +import ( + "log" + + "github.com/smartystreets/goconvey/web/server/contract" +) + +type Parser struct { + parser func(*contract.PackageResult, string) +} + +func (self *Parser) Parse(packages []*contract.Package) { + for _, p := range packages { + if p.Active() && p.HasUsableResult() { + self.parser(p.Result, p.Output) + } else if p.Ignored { + p.Result.Outcome = contract.Ignored + } else if p.Disabled { + p.Result.Outcome = contract.Disabled + } else { + p.Result.Outcome = contract.TestRunAbortedUnexpectedly + } + log.Printf("[%s]: %s\n", p.Result.Outcome, p.Name) + } +} + +func NewParser(helper func(*contract.PackageResult, string)) *Parser { + self := new(Parser) + self.parser = helper + return self +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/parser/parser.goconvey b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/parser/parser.goconvey new file mode 100644 index 0000000000000000000000000000000000000000..79982854b533ac0fe6cc38c4de1f5d218c517f05 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/parser/parser.goconvey @@ -0,0 +1,2 @@ +#ignore +-timeout=1s diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/parser/rules.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/parser/rules.go new file mode 100644 index 0000000000000000000000000000000000000000..8dc71b01a001c65a793de1f69bdacac38a161a25 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/parser/rules.go @@ -0,0 +1,44 @@ +package parser + +import "strings" + +func noGoFiles(line string) bool { + return strings.HasPrefix(line, "can't load package: ") && + (strings.Contains(line, ": no buildable Go source files in ") || strings.Contains(line, ": no Go ")) + +} +func buildFailed(line string) bool { + return strings.HasPrefix(line, "# ") || + strings.Contains(line, "cannot find package") || + (strings.HasPrefix(line, "can't load package: ") && !strings.Contains(line, ": no Go ")) || + (strings.Contains(line, ": found packages ") && strings.Contains(line, ".go) and ") && strings.Contains(line, ".go) in ")) +} +func noTestFunctions(line string) bool { + return line == "testing: warning: no tests to run" +} +func noTestFiles(line string) bool { + return strings.HasPrefix(line, "?") && strings.Contains(line, "[no test files]") +} +func isNewTest(line string) bool { + return strings.HasPrefix(line, "=== ") +} +func isTestResult(line string) bool { + return strings.HasPrefix(line, "--- FAIL:") || strings.HasPrefix(line, "--- PASS:") || strings.HasPrefix(line, "--- SKIP:") +} +func isPackageReport(line string) bool { + return (strings.HasPrefix(line, "FAIL") || + strings.HasPrefix(line, "exit status") || + strings.HasPrefix(line, "PASS") || + isCoverageSummary(line) || + packagePassed(line)) +} + +func packageFailed(line string) bool { + return strings.HasPrefix(line, "FAIL\t") +} +func packagePassed(line string) bool { + return strings.HasPrefix(line, "ok \t") +} +func isCoverageSummary(line string) bool { + return strings.HasPrefix(line, "coverage: ") && strings.Contains(line, "% of statements") +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/parser/testParser.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/parser/testParser.go new file mode 100644 index 0000000000000000000000000000000000000000..9fda980284fe38699e186130917f946a1c0cd5a3 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/parser/testParser.go @@ -0,0 +1,177 @@ +package parser + +import ( + "encoding/json" + "fmt" + "strconv" + "strings" + + "github.com/smartystreets/goconvey/convey/reporting" + "github.com/smartystreets/goconvey/web/server/contract" +) + +type testParser struct { + test *contract.TestResult + line string + index int + inJson bool + jsonLines []string + otherLines []string +} + +func parseTestOutput(test *contract.TestResult) *contract.TestResult { + parser := newTestParser(test) + parser.parseTestFunctionOutput() + return test +} + +func newTestParser(test *contract.TestResult) *testParser { + self := new(testParser) + self.test = test + return self +} + +func (self *testParser) parseTestFunctionOutput() { + if len(self.test.RawLines) > 0 { + self.processLines() + self.deserializeJson() + self.composeCapturedOutput() + } +} + +func (self *testParser) processLines() { + for self.index, self.line = range self.test.RawLines { + if !self.processLine() { + break + } + } +} + +func (self *testParser) processLine() bool { + if strings.HasSuffix(self.line, reporting.OpenJson) { + self.inJson = true + self.accountForOutputWithoutNewline() + + } else if self.line == reporting.CloseJson { + self.inJson = false + + } else if self.inJson { + self.jsonLines = append(self.jsonLines, self.line) + + } else if isPanic(self.line) { + self.parsePanicOutput() + return false + + } else if isGoTestLogOutput(self.line) { + self.parseLogLocation() + + } else { + self.otherLines = append(self.otherLines, self.line) + } + return true +} + +// If fmt.Print(f) produces output with no \n and that output +// is that last output before the framework spits out json +// (which starts with ''>>>>>'') then without this code +// all of the json is counted as output, not as json to be +// parsed and displayed by the web UI. +func (self *testParser) accountForOutputWithoutNewline() { + prefix := strings.Split(self.line, reporting.OpenJson)[0] + if prefix != "" { + self.otherLines = append(self.otherLines, prefix) + } +} + +func (self *testParser) deserializeJson() { + formatted := createArrayForJsonItems(self.jsonLines) + var scopes []reporting.ScopeResult + err := json.Unmarshal(formatted, &scopes) + if err != nil { + panic(fmt.Sprintf(bugReportRequest, err, formatted)) + } + self.test.Stories = scopes +} +func (self *testParser) parsePanicOutput() { + for index, line := range self.test.RawLines[self.index:] { + self.parsePanicLocation(index, line) + self.preserveStackTraceIndentation(index, line) + } + self.test.Error = strings.Join(self.test.RawLines, "\n") +} +func (self *testParser) parsePanicLocation(index int, line string) { + if !panicLineHasMetadata(line) { + return + } + metaLine := self.test.RawLines[index+4] + fields := strings.Split(metaLine, " ") + fileAndLine := strings.Split(fields[0], ":") + self.test.File = fileAndLine[0] + if len(fileAndLine) >= 2 { + self.test.Line, _ = strconv.Atoi(fileAndLine[1]) + } +} +func (self *testParser) preserveStackTraceIndentation(index int, line string) { + if panicLineShouldBeIndented(index, line) { + self.test.RawLines[index] = "\t" + line + } +} +func (self *testParser) parseLogLocation() { + self.otherLines = append(self.otherLines, self.line) + lineFields := strings.TrimSpace(self.line) + if strings.HasPrefix(lineFields, "Error Trace:") { + lineFields = strings.TrimPrefix(lineFields, "Error Trace:") + } + fields := strings.Split(lineFields, ":") + self.test.File = strings.TrimSpace(fields[0]) + self.test.Line, _ = strconv.Atoi(fields[1]) +} + +func (self *testParser) composeCapturedOutput() { + self.test.Message = strings.Join(self.otherLines, "\n") +} + +func createArrayForJsonItems(lines []string) []byte { + jsonArrayItems := strings.Join(lines, "") + jsonArrayItems = removeTrailingComma(jsonArrayItems) + return []byte(fmt.Sprintf("[%s]\n", jsonArrayItems)) +} +func removeTrailingComma(rawJson string) string { + if trailingComma(rawJson) { + return rawJson[:len(rawJson)-1] + } + return rawJson +} +func trailingComma(value string) bool { + return strings.HasSuffix(value, ",") +} + +func isGoTestLogOutput(line string) bool { + return strings.Count(line, ":") == 2 +} + +func isPanic(line string) bool { + return strings.HasPrefix(line, "panic: ") +} + +func panicLineHasMetadata(line string) bool { + return strings.HasPrefix(line, "goroutine") && strings.Contains(line, "[running]") +} +func panicLineShouldBeIndented(index int, line string) bool { + return strings.Contains(line, "+") || (index > 0 && strings.Contains(line, "panic: ")) +} + +const bugReportRequest = ` +Uh-oh! Looks like something went wrong. Please copy the following text and file a bug report at: + +https://github.com/smartystreets/goconvey/issues?state=open + +======= BEGIN BUG REPORT ======= + +ERROR: %v + +OUTPUT: %s + +======= END BUG REPORT ======= + +` diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/parser/util.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/parser/util.go new file mode 100644 index 0000000000000000000000000000000000000000..474bfa6d7e663f902072ea3a8384f6430652b09b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/parser/util.go @@ -0,0 +1,49 @@ +package parser + +import ( + "math" + "strings" + "time" +) + +// parseTestFunctionDuration parses the duration in seconds as a float64 +// from a line of go test output that looks something like this: +// --- PASS: TestOldSchool_PassesWithMessage (0.03 seconds) +func parseTestFunctionDuration(line string) float64 { + line = strings.Replace(line, "(", "", 1) + line = strings.Replace(line, ")", "", 1) + fields := strings.Split(line, " ") + return parseDurationInSeconds(fields[3], 2) +} + +func parseDurationInSeconds(raw string, precision int) float64 { + elapsed, err := time.ParseDuration(raw) + if err != nil { + elapsed, _ = time.ParseDuration(raw + "s") + } + return round(elapsed.Seconds(), precision) +} + +// round returns the rounded version of x with precision. +// +// Special cases are: +// round(±0) = ±0 +// round(±Inf) = ±Inf +// round(NaN) = NaN +// +// Why, oh why doesn't the math package come with a round function? +// Inspiration: http://play.golang.org/p/ZmFfr07oHp +func round(x float64, precision int) float64 { + var rounder float64 + pow := math.Pow(10, float64(precision)) + intermediate := x * pow + + if intermediate < 0.0 { + intermediate -= 0.5 + } else { + intermediate += 0.5 + } + rounder = float64(int64(intermediate)) + + return rounder / float64(pow) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/system/shell.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/system/shell.go new file mode 100644 index 0000000000000000000000000000000000000000..0adb89420d2a0b47bfe47e7ec544009d8b8d41d5 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/system/shell.go @@ -0,0 +1,174 @@ +package system + +import ( + "log" + "os/exec" + "path/filepath" + "regexp" + "strings" +) + +/////////////////////////////////////////////////////////////////////////////// +// Integration: /////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +type Shell struct { + coverage bool + gobin string + reportsPath string + defaultTimeout string +} + +func NewShell(gobin, reportsPath string, coverage bool, defaultTimeout string) *Shell { + return &Shell{ + coverage: coverage, + gobin: gobin, + reportsPath: reportsPath, + defaultTimeout: defaultTimeout, + } +} + +func (self *Shell) GoTest(directory, packageName string, tags, arguments []string) (output string, err error) { + reportFilename := strings.Replace(packageName, "/", "-", -1) + reportPath := filepath.Join(self.reportsPath, reportFilename) + reportData := reportPath + ".txt" + reportHTML := reportPath + ".html" + tagsArg := "-tags=" + strings.Join(tags, ",") + + goconvey := findGoConvey(directory, self.gobin, packageName, tagsArg).Execute() + compilation := compile(directory, self.gobin, tagsArg).Execute() + withCoverage := runWithCoverage(compilation, goconvey, self.coverage, reportData, directory, self.gobin, self.defaultTimeout, tagsArg, arguments).Execute() + final := runWithoutCoverage(compilation, withCoverage, goconvey, directory, self.gobin, self.defaultTimeout, tagsArg, arguments).Execute() + go generateReports(final, self.coverage, directory, self.gobin, reportData, reportHTML).Execute() + + return final.Output, final.Error +} + +/////////////////////////////////////////////////////////////////////////////// +// Functional Core://////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +func findGoConvey(directory, gobin, packageName, tagsArg string) Command { + return NewCommand(directory, gobin, "list", "-f", "'{{.TestImports}}{{.XTestImports}}'", tagsArg, packageName) +} + +func compile(directory, gobin, tagsArg string) Command { + return NewCommand(directory, gobin, "test", "-i", tagsArg) +} + +func runWithCoverage(compile, goconvey Command, coverage bool, reportPath, directory, gobin, defaultTimeout, tagsArg string, customArguments []string) Command { + if compile.Error != nil || goconvey.Error != nil { + return compile + } + + if !coverage { + return compile + } + + arguments := []string{"test", "-v", "-coverprofile=" + reportPath, tagsArg} + + customArgsText := strings.Join(customArguments, "\t") + if !strings.Contains(customArgsText, "-covermode=") { + arguments = append(arguments, "-covermode=set") + } + + if !strings.Contains(customArgsText, "-timeout=") { + arguments = append(arguments, "-timeout="+defaultTimeout) + } + + if strings.Contains(goconvey.Output, goconveyDSLImport) { + arguments = append(arguments, "-convey-json") + } + + arguments = append(arguments, customArguments...) + + return NewCommand(directory, gobin, arguments...) +} + +func runWithoutCoverage(compile, withCoverage, goconvey Command, directory, gobin, defaultTimeout, tagsArg string, customArguments []string) Command { + if compile.Error != nil { + return compile + } + + if goconvey.Error != nil { + log.Println(gopathProblem, goconvey.Output, goconvey.Error) + return goconvey + } + + if coverageStatementRE.MatchString(withCoverage.Output) { + return withCoverage + } + + log.Printf("Coverage output: %v", withCoverage.Output) + + log.Print("Run without coverage") + + arguments := []string{"test", "-v", tagsArg} + customArgsText := strings.Join(customArguments, "\t") + if !strings.Contains(customArgsText, "-timeout=") { + arguments = append(arguments, "-timeout="+defaultTimeout) + } + + if strings.Contains(goconvey.Output, goconveyDSLImport) { + arguments = append(arguments, "-convey-json") + } + arguments = append(arguments, customArguments...) + return NewCommand(directory, gobin, arguments...) +} + +func generateReports(previous Command, coverage bool, directory, gobin, reportData, reportHTML string) Command { + if previous.Error != nil { + return previous + } + + if !coverage { + return previous + } + + return NewCommand(directory, gobin, "tool", "cover", "-html="+reportData, "-o", reportHTML) +} + +/////////////////////////////////////////////////////////////////////////////// +// Imperative Shell: ////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// + +type Command struct { + directory string + executable string + arguments []string + + Output string + Error error +} + +func NewCommand(directory, executable string, arguments ...string) Command { + return Command{ + directory: directory, + executable: executable, + arguments: arguments, + } +} + +func (this Command) Execute() Command { + if len(this.executable) == 0 { + return this + } + + if len(this.Output) > 0 || this.Error != nil { + return this + } + + command := exec.Command(this.executable, this.arguments...) + command.Dir = this.directory + var rawOutput []byte + rawOutput, this.Error = command.CombinedOutput() + this.Output = string(rawOutput) + return this +} + +/////////////////////////////////////////////////////////////////////////////// + +const goconveyDSLImport = "github.com/smartystreets/goconvey/convey " // note the trailing space: we don't want to target packages nested in the /convey package. +const gopathProblem = "Please run goconvey from within $GOPATH/src (also, symlinks might be problematic). Output and Error: " + +var coverageStatementRE = regexp.MustCompile(`(?m)^coverage: \d+\.\d% of statements(.*)$|^panic: test timed out after `) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/system/system.goconvey b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/system/system.goconvey new file mode 100644 index 0000000000000000000000000000000000000000..aa26e8b739bb13bd522f225f98fcd98c83c772c4 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/system/system.goconvey @@ -0,0 +1,3 @@ +#ignore +-timeout=1s +-short \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/watch/functional_core.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/watch/functional_core.go new file mode 100644 index 0000000000000000000000000000000000000000..404a25d33acf0af5b7cb1864d2d7ab68aec3ca02 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/watch/functional_core.go @@ -0,0 +1,171 @@ +package watch + +import ( + "os" + "path/filepath" + "strings" + + "github.com/smartystreets/goconvey/web/server/messaging" +) + +/////////////////////////////////////////////////////////////////////////////// + +func Categorize(items chan *FileSystemItem, root string, watchSuffixes []string) (folders, profiles, goFiles []*FileSystemItem) { + for item := range items { + if item.IsFolder && !isHidden(item.Name) && !foundInHiddenDirectory(item, root) { + folders = append(folders, item) + + } else if strings.HasSuffix(item.Name, ".goconvey") && len(item.Name) > len(".goconvey") { + profiles = append(profiles, item) + + } else { + for _, suffix := range watchSuffixes { + if strings.HasSuffix(item.Name, suffix) && !isHidden(item.Name) && !foundInHiddenDirectory(item, root) { + goFiles = append(goFiles, item) + } + } + } + } + return folders, profiles, goFiles +} + +func foundInHiddenDirectory(item *FileSystemItem, root string) bool { + path := item.Path + if len(path) > len(root) { + path = path[len(root):] + } + + for _, folder := range strings.Split(filepath.Dir(path), slash) { + if isHidden(folder) { + return true + } + } + + return false +} +func isHidden(path string) bool { + return strings.HasPrefix(path, ".") || strings.HasPrefix(path, "_") || strings.HasPrefix(path, "flymake_") +} + +/////////////////////////////////////////////////////////////////////////////// + +func ParseProfile(profile string) (isDisabled bool, tags, arguments []string) { + lines := strings.Split(profile, "\n") + + for _, line := range lines { + line = strings.TrimSpace(line) + + if len(arguments) == 0 && strings.ToLower(line) == "ignore" { + return true, nil, nil + + } else if strings.HasPrefix(line, "-tags=") { + tags = append(tags, strings.Split(strings.SplitN(line, "=", 2)[1], ",")...) + continue + + } else if len(line) == 0 { + continue + + } else if strings.HasPrefix(line, "#") { + continue + + } else if strings.HasPrefix(line, "//") { + continue + + } else if line == "-cover" || strings.HasPrefix(line, "-coverprofile") { + continue + + } else if line == "-v" { + continue // Verbose mode is always enabled so there is no need to record it here. + + } + + arguments = append(arguments, line) + } + + return false, tags, arguments +} + +/////////////////////////////////////////////////////////////////////////////// + +func CreateFolders(items []*FileSystemItem) messaging.Folders { + folders := map[string]*messaging.Folder{} + + for _, item := range items { + folders[item.Path] = &messaging.Folder{Path: item.Path, Root: item.Root} + } + + return folders +} + +/////////////////////////////////////////////////////////////////////////////// + +func LimitDepth(folders messaging.Folders, depth int) { + if depth < 0 { + return + } + + for path, folder := range folders { + if strings.Count(path[len(folder.Root):], slash) > depth { + delete(folders, path) + } + } +} + +/////////////////////////////////////////////////////////////////////////////// + +func AttachProfiles(folders messaging.Folders, items []*FileSystemItem) { + for _, profile := range items { + if folder, exists := folders[filepath.Dir(profile.Path)]; exists { + folder.Disabled, folder.BuildTags, folder.TestArguments = profile.ProfileDisabled, profile.ProfileTags, profile.ProfileArguments + } + } +} + +/////////////////////////////////////////////////////////////////////////////// + +func MarkIgnored(folders messaging.Folders, ignored map[string]struct{}) { + if len(ignored) == 0 { + return + } + + for _, folder := range folders { + for ignored := range ignored { + if !folder.Ignored && strings.HasSuffix(folder.Path, ignored) { + folder.Ignored = true + } + } + } +} + +/////////////////////////////////////////////////////////////////////////////// + +func ActiveFolders(folders messaging.Folders) messaging.Folders { + var active messaging.Folders = map[string]*messaging.Folder{} + + for path, folder := range folders { + if folder.Ignored || folder.Disabled { + continue + } + + active[path] = folder + } + return active +} + +/////////////////////////////////////////////////////////////////////////////// + +func Sum(folders messaging.Folders, items []*FileSystemItem) int64 { + var sum int64 + for _, item := range items { + if _, exists := folders[filepath.Dir(item.Path)]; exists { + sum += item.Size + item.Modified + } + } + return sum +} + +/////////////////////////////////////////////////////////////////////////////// + +const slash = string(os.PathSeparator) + +/////////////////////////////////////////////////////////////////////////////// diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/watch/imperative_shell.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/watch/imperative_shell.go new file mode 100644 index 0000000000000000000000000000000000000000..9d9890d294de11dd3118336df2541f0ea451bd5f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/watch/imperative_shell.go @@ -0,0 +1,82 @@ +package watch + +import ( + "io" + "io/ioutil" + "os" + "path/filepath" + "strings" +) + +/////////////////////////////////////////////////////////////////////////////// + +type FileSystemItem struct { + Root string + Path string + Name string + Size int64 + Modified int64 + IsFolder bool + + ProfileDisabled bool + ProfileTags []string + ProfileArguments []string +} + +/////////////////////////////////////////////////////////////////////////////// + +func YieldFileSystemItems(root string, excludedDirs []string) chan *FileSystemItem { + items := make(chan *FileSystemItem) + + go func() { + filepath.Walk(root, func(path string, info os.FileInfo, err error) error { + if err != nil { + return filepath.SkipDir + } + + if info.IsDir() && strings.HasPrefix(info.Name(), ".") { + return filepath.SkipDir + } + + basePath := filepath.Base(path) + for _, item := range excludedDirs { + if item == basePath && info.IsDir() && item != "" && basePath != "" { + return filepath.SkipDir + } + } + + items <- &FileSystemItem{ + Root: root, + Path: path, + Name: info.Name(), + Size: info.Size(), + Modified: info.ModTime().Unix(), + IsFolder: info.IsDir(), + } + + return nil + }) + close(items) + }() + + return items +} + +/////////////////////////////////////////////////////////////////////////////// + +// ReadContents reads files wholesale. This function is only called on files +// that end in '.goconvey'. These files should be very small, probably not +// ever more than a few hundred bytes. The ignored errors are ok because in +// the event of an IO error all that need be returned is an empty string. +func ReadContents(path string) string { + file, err := os.Open(path) + if err != nil { + return "" + } + defer file.Close() + reader := io.LimitReader(file, 1024*4) + content, _ := ioutil.ReadAll(reader) + return string(content) +} + +/////////////////////////////////////////////////////////////////////////////// diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/watch/integration.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/watch/integration.go new file mode 100644 index 0000000000000000000000000000000000000000..9827c043ccaec02ab777f4ba85210c8374ba4a28 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/watch/integration.go @@ -0,0 +1,183 @@ +package watch + +import ( + "log" + "os" + "strings" + "sync" + "time" + + "github.com/smartystreets/goconvey/web/server/messaging" +) + +type Watcher struct { + nap time.Duration + rootFolder string + folderDepth int + ignoredFolders map[string]struct{} + fileSystemState int64 + paused bool + stopped bool + watchSuffixes []string + excludedDirs []string + + input chan messaging.WatcherCommand + output chan messaging.Folders + + lock sync.RWMutex +} + +func NewWatcher(rootFolder string, folderDepth int, nap time.Duration, + input chan messaging.WatcherCommand, output chan messaging.Folders, watchSuffixes string, excludedDirs []string) *Watcher { + + return &Watcher{ + nap: nap, + rootFolder: rootFolder, + folderDepth: folderDepth, + input: input, + output: output, + watchSuffixes: strings.Split(watchSuffixes, ","), + excludedDirs: excludedDirs, + + ignoredFolders: make(map[string]struct{}), + } +} + +func (this *Watcher) Listen() { + for { + if this.stopped { + return + } + + select { + + case command := <-this.input: + this.respond(command) + + default: + if !this.paused { + this.scan() + } + time.Sleep(this.nap) + } + } +} + +func (this *Watcher) respond(command messaging.WatcherCommand) { + switch command.Instruction { + + case messaging.WatcherAdjustRoot: + log.Println("Adjusting root...") + this.rootFolder = command.Details + this.execute() + + case messaging.WatcherIgnore: + log.Println("Ignoring specified folders") + this.ignore(command.Details) + // Prevent a filesystem change due to the number of active folders changing + _, checksum := this.gather() + this.set(checksum) + + case messaging.WatcherReinstate: + log.Println("Reinstating specified folders") + this.reinstate(command.Details) + // Prevent a filesystem change due to the number of active folders changing + _, checksum := this.gather() + this.set(checksum) + + case messaging.WatcherPause: + log.Println("Pausing watcher...") + this.paused = true + + case messaging.WatcherResume: + log.Println("Resuming watcher...") + this.paused = false + + case messaging.WatcherExecute: + log.Println("Gathering folders for immediate execution...") + this.execute() + + case messaging.WatcherStop: + log.Println("Stopping the watcher...") + close(this.output) + this.stopped = true + + default: + log.Println("Unrecognized command from server:", command.Instruction) + } +} + +func (this *Watcher) execute() { + folders, _ := this.gather() + this.sendToExecutor(folders) +} + +func (this *Watcher) scan() { + folders, checksum := this.gather() + + if checksum == this.fileSystemState { + return + } + + log.Println("File system state modified, publishing current folders...", this.fileSystemState, checksum) + + defer this.set(checksum) + this.sendToExecutor(folders) +} + +func (this *Watcher) gather() (folders messaging.Folders, checksum int64) { + items := YieldFileSystemItems(this.rootFolder, this.excludedDirs) + folderItems, profileItems, goFileItems := Categorize(items, this.rootFolder, this.watchSuffixes) + + for _, item := range profileItems { + // TODO: don't even bother if the item's size is over a few hundred bytes... + contents := ReadContents(item.Path) + item.ProfileDisabled, item.ProfileTags, item.ProfileArguments = ParseProfile(contents) + } + + folders = CreateFolders(folderItems) + LimitDepth(folders, this.folderDepth) + AttachProfiles(folders, profileItems) + this.protectedRead(func() { MarkIgnored(folders, this.ignoredFolders) }) + + active := ActiveFolders(folders) + checksum = int64(len(active)) + checksum += Sum(active, profileItems) + checksum += Sum(active, goFileItems) + + return folders, checksum +} + +func (this *Watcher) set(state int64) { + this.fileSystemState = state +} + +func (this *Watcher) sendToExecutor(folders messaging.Folders) { + this.output <- folders +} + +func (this *Watcher) ignore(paths string) { + this.protectedWrite(func() { + for _, folder := range strings.Split(paths, string(os.PathListSeparator)) { + this.ignoredFolders[folder] = struct{}{} + log.Println("Currently ignored folders:", this.ignoredFolders) + } + }) +} +func (this *Watcher) reinstate(paths string) { + this.protectedWrite(func() { + for _, folder := range strings.Split(paths, string(os.PathListSeparator)) { + delete(this.ignoredFolders, folder) + } + }) +} +func (this *Watcher) protectedWrite(protected func()) { + this.lock.Lock() + defer this.lock.Unlock() + protected() +} +func (this *Watcher) protectedRead(protected func()) { + this.lock.RLock() + defer this.lock.RUnlock() + protected() +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/watch/watch.goconvey b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/watch/watch.goconvey new file mode 100644 index 0000000000000000000000000000000000000000..aa26e8b739bb13bd522f225f98fcd98c83c772c4 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/smartystreets/goconvey/web/server/watch/watch.goconvey @@ -0,0 +1,3 @@ +#ignore +-timeout=1s +-short \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/AUTHORS.txt b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/AUTHORS.txt new file mode 100644 index 0000000000000000000000000000000000000000..b318cb6f80e88207e11ea08f8d90235b21231303 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/AUTHORS.txt @@ -0,0 +1,54 @@ +ACHER <artem.chernyak@monsanto.com> +Andrew Schwartz <andrew.schwartz@gengo.com> +Artem Chernyak <artemchernyak@Artems-MacBook-Air.local> +Artem Chernyak <artemchernyak@gmail.com> +blackss2 <blackss2@nate.com> +Brandon Mulcahy <brandon@jangler.info> +Brian Smith <ohohvi@gmail.com> +bronze1man <bronze1man@gmail.com> +Bruno Bigras <bigras.bruno@gmail.com> +Chris Glass <tribaal@gmail.com> +Colin Fox <colin.fox@cumul8.com> +Colin Fox <greenenergy@gmail.com> +crahles <christoph@rahles.de> +Daniel Upton <daniel@floppy.co> +Daniel YC Lin <dlin@u40> +DerLinkshaender <mail@arminhanisch.de> +Eric <ericscottlagergren@gmail.com> +frogs <frogs@frogss-MacBook-Air.local> +fzerorubigd <fzerorubigd@gmail.com> +Geoffrey J. Teale <geoffrey.teale@canonical.com> +Gyu-Ho Lee <gyuho.cs@gmail.com> +Herman Schaaf <hermanschaaf@gmail.com> +Hugh Gao <email@klniu.com> +Iain Lowe <i.lowe@mademediacorp.com> +ivnivnch <ivnivnch@gmail.com> +Jason Hall <imjasonh@gmail.com> +Joshua Baker <joshua.baker@cumul8.com> +Kaur Kuut <strom@nevermore.ee> +Lunny Xiao <xiaolunwen@gmail.com> +magician1 <kouta-k@mbm.nifty.com> +Mathias Fredriksson <mafredri@gmail.com> +Matt Aimonetti <mattaimonetti@gmail.com> +Moch. Lutfi <kapten_lufi@yahoo.co.id> +Moch.Lutfi <kapten_lufi@yahoo.co.id> +Neoin <Heinoldewage@gmail.com> +Nguyen Nguyen <ntn@NTN.local> +Nikita Danilov <mirt@mirt.su> +OneOfOne <OneOfOne@gmail.com> +Peter Waller <p@pwaller.net> +Philipp Klose <TheHippo@users.noreply.github.com> +richard bucker <richard@bucker.net> +Shawn Milochik <shawn@milochik.com> +Shawn Smith <shawnpsmith@gmail.com> +Shawn Smith <shawn.smith@gengo.com> +SHIMADA Koji <koji.shimada@enishi-tech.com> +Steven Degutis <steven.degutis@gmail.com> +takuya sato <sato-taku@klab.com> +Thieu Pham <thieu.pham@workiva.com> +Tormod Erevik Lea <tormodlea@gmail.com> +trinchan <andrew.schwartz@gengo.com> +U-NORTH_AMERICA\ACHER <ACHER@PBECRLK.na.ds.monsanto.com> +YAMADA Tsuyoshi <tyamada@minimum2scp.org> +Yoshiki Shibukawa <shibukawa.yoshiki@dena.jp> +zhcy <zhangchenyu2009@gmail.com> diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/CODE_OF_CONDUCT.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000000000000000000000000000000000..c550ce0c5ceae6f72aad8d240e27203bea2ed2e3 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/CODE_OF_CONDUCT.md @@ -0,0 +1,46 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at tealeg@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/LICENSE b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..49bc776d289143c4ce6997161d593e6f98d526f9 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2011-2017, Geoffrey J. Teale +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/README.org b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/README.org new file mode 100644 index 0000000000000000000000000000000000000000..4a7eee456c0d6d5a05fecc50368d19417641f8b3 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/README.org @@ -0,0 +1,102 @@ +* XLSX + +[[https://travis-ci.org/tealeg/xlsx][https://img.shields.io/travis/tealeg/xlsx/master.svg?style=flat-square]] +[[https://codecov.io/gh/tealeg/xlsx][https://codecov.io/gh/tealeg/xlsx/branch/master/graph/badge.svg]] +[[https://godoc.org/github.com/tealeg/xlsx][https://godoc.org/github.com/tealeg/xlsx?status.svg]] +[[https://github.com/tealeg/xlsx#license][https://img.shields.io/badge/license-bsd-orange.svg]] + +** Introduction +xlsx is a library to simplify reading and writing the XML format used +by recent version of Microsoft Excel in Go programs. + +The support for writing XLSX files is currently extremely minimal. It +will expand slowly, but in the meantime patches are welcome! + +** Full API docs +The full API docs can be viewed using go's built in documentation +tool, or online at [[http://godoc.org/github.com/tealeg/xlsx][godoc.org]]. + +** Basic Usage +*** Reading XLSX files +Here is a minimal example usage that will dump all cell data in a +given XLSX file. A more complete example of this kind of +functionality is contained in [[https://github.com/tealeg/xlsx2csv][the XLSX2CSV program]]: + +#+BEGIN_SRC go + +package main + +import ( + "fmt" + "github.com/tealeg/xlsx" +) + +func main() { + excelFileName := "/home/tealeg/foo.xlsx" + xlFile, err := xlsx.OpenFile(excelFileName) + if err != nil { + ... + } + for _, sheet := range xlFile.Sheets { + for _, row := range sheet.Rows { + for _, cell := range row.Cells { + text := cell.String() + fmt.Printf("%s\n", text) + } + } + } +} + +#+END_SRC + +Some additional information is available from the cell (for example, +style information). For more details see the godoc output for this +package. + +*** Writing XLSX files +The following constitutes the bare minimum required to write an XLSX document. + +#+BEGIN_SRC go + +package main + +import ( + "fmt" + "github.com/tealeg/xlsx" +) + +func main() { + var file *xlsx.File + var sheet *xlsx.Sheet + var row *xlsx.Row + var cell *xlsx.Cell + var err error + + file = xlsx.NewFile() + sheet, err = file.AddSheet("Sheet1") + if err != nil { + fmt.Printf(err.Error()) + } + row = sheet.AddRow() + cell = row.AddCell() + cell.Value = "I am a cell!" + err = file.Save("MyXLSXFile.xlsx") + if err != nil { + fmt.Printf(err.Error()) + } +} + +#+END_SRC + +** Contributing + +We're extremely happy to review pull requests. Please be patient, maintaining XLSX doesn't pay anyone's salary (to my knowledge). + +If you'd like to propose a change please ensure the following: + +- All existing tests are passing. +- There are tests in the test suite that cover the changes you're making. +- You have added documentation strings (in English) to (at least) the public functions you've added or modified. +- Your use of, or creation of, XML is compliant with [[http://www.ecma-international.org/publications/standards/Ecma-376.htm][part 1 of the 4th edition of the ECMA-376 Standard for Office Open XML]]. + +Eat a peach - Geoff diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/cell.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/cell.go new file mode 100644 index 0000000000000000000000000000000000000000..5309eb1c930e2b42223531e24853a73f003ddb84 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/cell.go @@ -0,0 +1,363 @@ +package xlsx + +import ( + "fmt" + "math" + "strconv" + "time" +) + +const ( + maxNonScientificNumber = 1e11 + minNonScientificNumber = 1e-9 +) + +// CellType is an int type for storing metadata about the data type in the cell. +type CellType int + +// These are the cell types from the ST_CellType spec +const ( + CellTypeString CellType = iota + // CellTypeStringFormula is a specific format for formulas that return string values. Formulas that return numbers + // and booleans are stored as those types. + CellTypeStringFormula + CellTypeNumeric + CellTypeBool + // CellTypeInline is not respected on save, all inline string cells will be saved as SharedStrings + // when saving to an XLSX file. This the same behavior as that found in Excel. + CellTypeInline + CellTypeError + // d (Date): Cell contains a date in the ISO 8601 format. + // That is the only mention of this format in the XLSX spec. + // Date seems to be unused by the current version of Excel, it stores dates as Numeric cells with a date format string. + // For now these cells will have their value output directly. It is unclear if the value is supposed to be parsed + // into a number and then formatted using the formatting or not. + CellTypeDate +) + +func (ct CellType) Ptr() *CellType { + return &ct +} + +// Cell is a high level structure intended to provide user access to +// the contents of Cell within an xlsx.Row. +type Cell struct { + Row *Row + Value string + formula string + style *Style + NumFmt string + parsedNumFmt *parsedNumberFormat + date1904 bool + Hidden bool + HMerge int + VMerge int + cellType CellType +} + +// CellInterface defines the public API of the Cell. +type CellInterface interface { + String() string + FormattedValue() string +} + +// NewCell creates a cell and adds it to a row. +func NewCell(r *Row) *Cell { + return &Cell{Row: r, NumFmt: "general"} +} + +// Merge with other cells, horizontally and/or vertically. +func (c *Cell) Merge(hcells, vcells int) { + c.HMerge = hcells + c.VMerge = vcells +} + +// Type returns the CellType of a cell. See CellType constants for more details. +func (c *Cell) Type() CellType { + return c.cellType +} + +// SetString sets the value of a cell to a string. +func (c *Cell) SetString(s string) { + c.Value = s + c.formula = "" + c.cellType = CellTypeString +} + +// String returns the value of a Cell as a string. If you'd like to +// see errors returned from formatting then please use +// Cell.FormattedValue() instead. +func (c *Cell) String() string { + // To preserve the String() interface we'll throw away errors. + // Not that using FormattedValue is therefore strongly + // preferred. + value, _ := c.FormattedValue() + return value +} + +// SetFloat sets the value of a cell to a float. +func (c *Cell) SetFloat(n float64) { + c.SetValue(n) +} + +//GetTime returns the value of a Cell as a time.Time +func (c *Cell) GetTime(date1904 bool) (t time.Time, err error) { + f, err := c.Float() + if err != nil { + return t, err + } + return TimeFromExcelTime(f, date1904), nil +} + +/* + The following are samples of format samples. + + * "0.00e+00" + * "0", "#,##0" + * "0.00", "#,##0.00", "@" + * "#,##0 ;(#,##0)", "#,##0 ;[red](#,##0)" + * "#,##0.00;(#,##0.00)", "#,##0.00;[red](#,##0.00)" + * "0%", "0.00%" + * "0.00e+00", "##0.0e+0" +*/ + +// SetFloatWithFormat sets the value of a cell to a float and applies +// formatting to the cell. +func (c *Cell) SetFloatWithFormat(n float64, format string) { + c.SetValue(n) + c.NumFmt = format + c.formula = "" +} + +// DateTimeOptions are additional options for exporting times +type DateTimeOptions struct { + // Location allows calculating times in other timezones/locations + Location *time.Location + // ExcelTimeFormat is the string you want excel to use to format the datetime + ExcelTimeFormat string +} + +var ( + DefaultDateFormat = builtInNumFmt[14] + DefaultDateTimeFormat = builtInNumFmt[22] + + DefaultDateOptions = DateTimeOptions{ + Location: timeLocationUTC, + ExcelTimeFormat: DefaultDateFormat, + } + + DefaultDateTimeOptions = DateTimeOptions{ + Location: timeLocationUTC, + ExcelTimeFormat: DefaultDateTimeFormat, + } +) + +// SetDate sets the value of a cell to a float. +func (c *Cell) SetDate(t time.Time) { + c.SetDateWithOptions(t, DefaultDateOptions) +} + +func (c *Cell) SetDateTime(t time.Time) { + c.SetDateWithOptions(t, DefaultDateTimeOptions) +} + +// SetDateWithOptions allows for more granular control when exporting dates and times +func (c *Cell) SetDateWithOptions(t time.Time, options DateTimeOptions) { + _, offset := t.In(options.Location).Zone() + t = time.Unix(t.Unix()+int64(offset), 0) + c.SetDateTimeWithFormat(TimeToExcelTime(t.In(timeLocationUTC), c.date1904), options.ExcelTimeFormat) +} + +func (c *Cell) SetDateTimeWithFormat(n float64, format string) { + c.Value = strconv.FormatFloat(n, 'f', -1, 64) + c.NumFmt = format + c.formula = "" + c.cellType = CellTypeNumeric +} + +// Float returns the value of cell as a number. +func (c *Cell) Float() (float64, error) { + f, err := strconv.ParseFloat(c.Value, 64) + if err != nil { + return math.NaN(), err + } + return f, nil +} + +// SetInt64 sets a cell's value to a 64-bit integer. +func (c *Cell) SetInt64(n int64) { + c.SetValue(n) +} + +// Int64 returns the value of cell as 64-bit integer. +func (c *Cell) Int64() (int64, error) { + f, err := strconv.ParseInt(c.Value, 10, 64) + if err != nil { + return -1, err + } + return f, nil +} + +// GeneralNumeric returns the value of the cell as a string. It is formatted very closely to the the XLSX spec for how +// to display values when the storage type is Number and the format type is General. It is not 100% identical to the +// spec but is as close as you can get using the built in Go formatting tools. +func (c *Cell) GeneralNumeric() (string, error) { + return generalNumericScientific(c.Value, true) +} + +// GeneralNumericWithoutScientific returns numbers that are always formatted as numbers, but it does not follow +// the rules for when XLSX should switch to scientific notation, since sometimes scientific notation is not desired, +// even if that is how the document is supposed to be formatted. +func (c *Cell) GeneralNumericWithoutScientific() (string, error) { + return generalNumericScientific(c.Value, false) +} + +// SetInt sets a cell's value to an integer. +func (c *Cell) SetInt(n int) { + c.SetValue(n) +} + +// SetInt sets a cell's value to an integer. +func (c *Cell) SetValue(n interface{}) { + switch t := n.(type) { + case time.Time: + c.SetDateTime(t) + return + case int, int8, int16, int32, int64: + c.setNumeric(fmt.Sprintf("%d", n)) + case float64: + // When formatting floats, do not use fmt.Sprintf("%v", n), this will cause numbers below 1e-4 to be printed in + // scientific notation. Scientific notation is not a valid way to store numbers in XML. + // Also not not use fmt.Sprintf("%f", n), this will cause numbers to be stored as X.XXXXXX. Which means that + // numbers will lose precision and numbers with fewer significant digits such as 0 will be stored as 0.000000 + // which causes tests to fail. + c.setNumeric(strconv.FormatFloat(t, 'f', -1, 64)) + case float32: + c.setNumeric(strconv.FormatFloat(float64(t), 'f', -1, 32)) + case string: + c.SetString(t) + case []byte: + c.SetString(string(t)) + case nil: + c.SetString("") + default: + c.SetString(fmt.Sprintf("%v", n)) + } +} + +// setNumeric sets a cell's value to a number +func (c *Cell) setNumeric(s string) { + c.Value = s + c.NumFmt = builtInNumFmt[builtInNumFmtIndex_GENERAL] + c.formula = "" + c.cellType = CellTypeNumeric +} + +// Int returns the value of cell as integer. +// Has max 53 bits of precision +// See: float64(int64(math.MaxInt)) +func (c *Cell) Int() (int, error) { + f, err := strconv.ParseFloat(c.Value, 64) + if err != nil { + return -1, err + } + return int(f), nil +} + +// SetBool sets a cell's value to a boolean. +func (c *Cell) SetBool(b bool) { + if b { + c.Value = "1" + } else { + c.Value = "0" + } + c.cellType = CellTypeBool +} + +// Bool returns a boolean from a cell's value. +// TODO: Determine if the current return value is +// appropriate for types other than CellTypeBool. +func (c *Cell) Bool() bool { + // If bool, just return the value. + if c.cellType == CellTypeBool { + return c.Value == "1" + } + // If numeric, base it on a non-zero. + if c.cellType == CellTypeNumeric { + return c.Value != "0" + } + // Return whether there's an empty string. + return c.Value != "" +} + +// SetFormula sets the format string for a cell. +func (c *Cell) SetFormula(formula string) { + c.formula = formula + c.cellType = CellTypeNumeric +} + +func (c *Cell) SetStringFormula(formula string) { + c.formula = formula + c.cellType = CellTypeStringFormula +} + +// Formula returns the formula string for the cell. +func (c *Cell) Formula() string { + return c.formula +} + +// GetStyle returns the Style associated with a Cell +func (c *Cell) GetStyle() *Style { + if c.style == nil { + c.style = NewStyle() + } + return c.style +} + +// SetStyle sets the style of a cell. +func (c *Cell) SetStyle(style *Style) { + c.style = style +} + +// GetNumberFormat returns the number format string for a cell. +func (c *Cell) GetNumberFormat() string { + return c.NumFmt +} + +func (c *Cell) formatToFloat(format string) (string, error) { + f, err := strconv.ParseFloat(c.Value, 64) + if err != nil { + return c.Value, err + } + return fmt.Sprintf(format, f), nil +} + +func (c *Cell) formatToInt(format string) (string, error) { + f, err := strconv.ParseFloat(c.Value, 64) + if err != nil { + return c.Value, err + } + return fmt.Sprintf(format, int(f)), nil +} + +// getNumberFormat will update the parsedNumFmt struct if it has become out of date, since a cell's NumFmt string is a +// public field that could be edited by clients. +func (c *Cell) getNumberFormat() *parsedNumberFormat { + if c.parsedNumFmt == nil || c.parsedNumFmt.numFmt != c.NumFmt { + c.parsedNumFmt = parseFullNumberFormatString(c.NumFmt) + } + return c.parsedNumFmt +} + +// FormattedValue returns a value, and possibly an error condition +// from a Cell. If it is possible to apply a format to the cell +// value, it will do so, if not then an error will be returned, along +// with the raw value of the Cell. +func (c *Cell) FormattedValue() (string, error) { + fullFormat := c.getNumberFormat() + returnVal, err := fullFormat.FormatValue(c) + if fullFormat.parseEncounteredError != nil { + return returnVal, *fullFormat.parseEncounteredError + } + return returnVal, err +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/col.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/col.go new file mode 100644 index 0000000000000000000000000000000000000000..9cca463133606012cbfd996e98c3892fe320ea2f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/col.go @@ -0,0 +1,49 @@ +package xlsx + +// Default column width in excel +const ColWidth = 9.5 + +type Col struct { + Min int + Max int + Hidden bool + Width float64 + Collapsed bool + OutlineLevel uint8 + numFmt string + parsedNumFmt *parsedNumberFormat + style *Style +} + +// SetType will set the format string of a column based on the type that you want to set it to. +// This function does not really make a lot of sense. +func (c *Col) SetType(cellType CellType) { + switch cellType { + case CellTypeString: + c.numFmt = builtInNumFmt[builtInNumFmtIndex_STRING] + case CellTypeNumeric: + c.numFmt = builtInNumFmt[builtInNumFmtIndex_INT] + case CellTypeBool: + c.numFmt = builtInNumFmt[builtInNumFmtIndex_GENERAL] //TEMP + case CellTypeInline: + c.numFmt = builtInNumFmt[builtInNumFmtIndex_STRING] + case CellTypeError: + c.numFmt = builtInNumFmt[builtInNumFmtIndex_GENERAL] //TEMP + case CellTypeDate: + // Cells that are stored as dates are not properly supported in this library. + // They should instead be stored as a Numeric with a date format. + c.numFmt = builtInNumFmt[builtInNumFmtIndex_GENERAL] + case CellTypeStringFormula: + c.numFmt = builtInNumFmt[builtInNumFmtIndex_STRING] + } +} + +// GetStyle returns the Style associated with a Col +func (c *Col) GetStyle() *Style { + return c.style +} + +// SetStyle sets the style of a Col +func (c *Col) SetStyle(style *Style) { + c.style = style +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/date.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/date.go new file mode 100644 index 0000000000000000000000000000000000000000..234912ab3da301a650e5613e0c6d974489b10cb0 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/date.go @@ -0,0 +1,147 @@ +package xlsx + +import ( + "math" + "time" +) + +const ( + MJD_0 float64 = 2400000.5 + MJD_JD2000 float64 = 51544.5 + + secondsInADay = float64((24*time.Hour)/time.Second) + nanosInADay = float64((24*time.Hour)/time.Nanosecond) +) + +var ( + timeLocationUTC, _ = time.LoadLocation("UTC") + + unixEpoc = time.Date(1970, time.January, 1, 0, 0, 0, 0, time.UTC) + // In 1900 mode, Excel takes dates in floating point numbers of days starting with Jan 1 1900. + // The days are not zero indexed, so Jan 1 1900 would be 1. + // Except that Excel pretends that Feb 29, 1900 occurred to be compatible with a bug in Lotus 123. + // So, this constant uses Dec 30, 1899 instead of Jan 1, 1900, so the diff will be correct. + // http://www.cpearson.com/excel/datetime.htm + excel1900Epoc = time.Date(1899, time.December, 30, 0, 0, 0, 0, time.UTC) + excel1904Epoc = time.Date(1904, time.January, 1, 0, 0, 0, 0, time.UTC) + // Days between epocs, including both off by one errors for 1900. + daysBetween1970And1900 = float64(unixEpoc.Sub(excel1900Epoc)/(24 * time.Hour)) + daysBetween1970And1904 = float64(unixEpoc.Sub(excel1904Epoc)/(24 * time.Hour)) +) + +func TimeToUTCTime(t time.Time) time.Time { + return time.Date(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second(), t.Nanosecond(), timeLocationUTC) +} + +func shiftJulianToNoon(julianDays, julianFraction float64) (float64, float64) { + switch { + case -0.5 < julianFraction && julianFraction < 0.5: + julianFraction += 0.5 + case julianFraction >= 0.5: + julianDays += 1 + julianFraction -= 0.5 + case julianFraction <= -0.5: + julianDays -= 1 + julianFraction += 1.5 + } + return julianDays, julianFraction +} + +// Return the integer values for hour, minutes, seconds and +// nanoseconds that comprised a given fraction of a day. +// values would round to 1 us. +func fractionOfADay(fraction float64) (hours, minutes, seconds, nanoseconds int) { + + const ( + c1us = 1e3 + c1s = 1e9 + c1day = 24 * 60 * 60 * c1s + ) + + frac := int64(c1day*fraction + c1us/2) + nanoseconds = int((frac%c1s)/c1us) * c1us + frac /= c1s + seconds = int(frac % 60) + frac /= 60 + minutes = int(frac % 60) + hours = int(frac / 60) + return +} + +func julianDateToGregorianTime(part1, part2 float64) time.Time { + part1I, part1F := math.Modf(part1) + part2I, part2F := math.Modf(part2) + julianDays := part1I + part2I + julianFraction := part1F + part2F + julianDays, julianFraction = shiftJulianToNoon(julianDays, julianFraction) + day, month, year := doTheFliegelAndVanFlandernAlgorithm(int(julianDays)) + hours, minutes, seconds, nanoseconds := fractionOfADay(julianFraction) + return time.Date(year, time.Month(month), day, hours, minutes, seconds, nanoseconds, time.UTC) +} + +// By this point generations of programmers have repeated the +// algorithm sent to the editor of "Communications of the ACM" in 1968 +// (published in CACM, volume 11, number 10, October 1968, p.657). +// None of those programmers seems to have found it necessary to +// explain the constants or variable names set out by Henry F. Fliegel +// and Thomas C. Van Flandern. Maybe one day I'll buy that jounal and +// expand an explanation here - that day is not today. +func doTheFliegelAndVanFlandernAlgorithm(jd int) (day, month, year int) { + l := jd + 68569 + n := (4 * l) / 146097 + l = l - (146097*n+3)/4 + i := (4000 * (l + 1)) / 1461001 + l = l - (1461*i)/4 + 31 + j := (80 * l) / 2447 + d := l - (2447*j)/80 + l = j / 11 + m := j + 2 - (12 * l) + y := 100*(n-49) + i + l + return d, m, y +} + +// Convert an excelTime representation (stored as a floating point number) to a time.Time. +func TimeFromExcelTime(excelTime float64, date1904 bool) time.Time { + var date time.Time + var wholeDaysPart = int(excelTime) + // Excel uses Julian dates prior to March 1st 1900, and + // Gregorian thereafter. + if wholeDaysPart <= 61 { + const OFFSET1900 = 15018.0 + const OFFSET1904 = 16480.0 + var date time.Time + if date1904 { + date = julianDateToGregorianTime(MJD_0, excelTime+OFFSET1904) + } else { + date = julianDateToGregorianTime(MJD_0, excelTime+OFFSET1900) + } + return date + } + var floatPart = excelTime - float64(wholeDaysPart) + if date1904 { + date = excel1904Epoc + } else { + date = excel1900Epoc + } + durationPart := time.Duration(nanosInADay * floatPart) + return date.AddDate(0,0, wholeDaysPart).Add(durationPart) +} + +// TimeToExcelTime will convert a time.Time into Excel's float representation, in either 1900 or 1904 +// mode. If you don't know which to use, set date1904 to false. +// TODO should this should handle Julian dates? +func TimeToExcelTime(t time.Time, date1904 bool) float64 { + // Get the number of days since the unix epoc + daysSinceUnixEpoc := float64(t.Unix())/secondsInADay + // Get the number of nanoseconds in days since Unix() is in seconds. + nanosPart := float64(t.Nanosecond())/nanosInADay + // Add both together plus the number of days difference between unix and Excel epocs. + var offsetDays float64 + if date1904 { + offsetDays = daysBetween1970And1904 + } else { + offsetDays = daysBetween1970And1900 + } + daysSinceExcelEpoc := daysSinceUnixEpoc + offsetDays + nanosPart + return daysSinceExcelEpoc +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/doc.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/doc.go new file mode 100644 index 0000000000000000000000000000000000000000..a9369f16a3bda14eb8d6c9acb7865beaa63adfc5 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/doc.go @@ -0,0 +1,11 @@ +// xslx is a package designed to help with reading data from +// spreadsheets stored in the XLSX format used in recent versions of +// Microsoft's Excel spreadsheet. +// +// Additionally, xlsx has started to grow some XLSX authoring +// capabilities too. +// +// For a concise example of how to use this library why not check out +// the source for xlsx2csv here: https://github.com/tealeg/xlsx2csv + +package xlsx diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/file.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/file.go new file mode 100644 index 0000000000000000000000000000000000000000..acdac8a28acc8189595b4ee19865ad6e0b9a5366 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/file.go @@ -0,0 +1,412 @@ +package xlsx + +import ( + "archive/zip" + "bytes" + "encoding/xml" + "errors" + "fmt" + "io" + "os" + "strconv" + "strings" + "unicode/utf8" +) + +// File is a high level structure providing a slice of Sheet structs +// to the user. +type File struct { + worksheets map[string]*zip.File + referenceTable *RefTable + Date1904 bool + styles *xlsxStyleSheet + Sheets []*Sheet + Sheet map[string]*Sheet + theme *theme + DefinedNames []*xlsxDefinedName +} + +const NoRowLimit int = -1 + +// Create a new File +func NewFile() *File { + return &File{ + Sheet: make(map[string]*Sheet), + Sheets: make([]*Sheet, 0), + DefinedNames: make([]*xlsxDefinedName, 0), + } +} + +// OpenFile() take the name of an XLSX file and returns a populated +// xlsx.File struct for it. +func OpenFile(fileName string) (file *File, err error) { + return OpenFileWithRowLimit(fileName, NoRowLimit) +} + +// OpenFileWithRowLimit() will open the file, but will only read the specified number of rows. +// If you save this file, it will be truncated to the number of rows specified. +func OpenFileWithRowLimit(fileName string, rowLimit int) (file *File, err error) { + var z *zip.ReadCloser + z, err = zip.OpenReader(fileName) + if err != nil { + return nil, err + } + return ReadZipWithRowLimit(z, rowLimit) +} + +// OpenBinary() take bytes of an XLSX file and returns a populated +// xlsx.File struct for it. +func OpenBinary(bs []byte) (*File, error) { + return OpenBinaryWithRowLimit(bs, NoRowLimit) +} + +// OpenBinaryWithRowLimit() take bytes of an XLSX file and returns a populated +// xlsx.File struct for it. +func OpenBinaryWithRowLimit(bs []byte, rowLimit int) (*File, error) { + r := bytes.NewReader(bs) + return OpenReaderAtWithRowLimit(r, int64(r.Len()), rowLimit) +} + +// OpenReaderAt() take io.ReaderAt of an XLSX file and returns a populated +// xlsx.File struct for it. +func OpenReaderAt(r io.ReaderAt, size int64) (*File, error) { + return OpenReaderAtWithRowLimit(r, size, NoRowLimit) +} + +// OpenReaderAtWithRowLimit() take io.ReaderAt of an XLSX file and returns a populated +// xlsx.File struct for it. +func OpenReaderAtWithRowLimit(r io.ReaderAt, size int64, rowLimit int) (*File, error) { + file, err := zip.NewReader(r, size) + if err != nil { + return nil, err + } + return ReadZipReaderWithRowLimit(file, rowLimit) +} + +// A convenient wrapper around File.ToSlice, FileToSlice will +// return the raw data contained in an Excel XLSX file as three +// dimensional slice. The first index represents the sheet number, +// the second the row number, and the third the cell number. +// +// For example: +// +// var mySlice [][][]string +// var value string +// mySlice = xlsx.FileToSlice("myXLSX.xlsx") +// value = mySlice[0][0][0] +// +// Here, value would be set to the raw value of the cell A1 in the +// first sheet in the XLSX file. +func FileToSlice(path string) ([][][]string, error) { + f, err := OpenFile(path) + if err != nil { + return nil, err + } + return f.ToSlice() +} + +// FileToSliceUnmerged is a wrapper around File.ToSliceUnmerged. +// It returns the raw data contained in an Excel XLSX file as three +// dimensional slice. Merged cells will be unmerged. Covered cells become the +// values of theirs origins. +func FileToSliceUnmerged(path string) ([][][]string, error) { + f, err := OpenFile(path) + if err != nil { + return nil, err + } + return f.ToSliceUnmerged() +} + +// Save the File to an xlsx file at the provided path. +func (f *File) Save(path string) (err error) { + target, err := os.Create(path) + if err != nil { + return err + } + err = f.Write(target) + if err != nil { + return err + } + return target.Close() +} + +// Write the File to io.Writer as xlsx +func (f *File) Write(writer io.Writer) (err error) { + parts, err := f.MarshallParts() + if err != nil { + return + } + zipWriter := zip.NewWriter(writer) + for partName, part := range parts { + w, err := zipWriter.Create(partName) + if err != nil { + return err + } + _, err = w.Write([]byte(part)) + if err != nil { + return err + } + } + return zipWriter.Close() +} + +// Add a new Sheet, with the provided name, to a File. +// The maximum sheet name length is 31 characters. If the sheet name length is exceeded an error is thrown. +// These special characters are also not allowed: : \ / ? * [ ] +func (f *File) AddSheet(sheetName string) (*Sheet, error) { + if _, exists := f.Sheet[sheetName]; exists { + return nil, fmt.Errorf("duplicate sheet name '%s'.", sheetName) + } + if utf8.RuneCountInString(sheetName) > 31 { + return nil, fmt.Errorf("sheet name must be 31 or fewer characters long. It is currently '%d' characters long", utf8.RuneCountInString(sheetName)) + } + // Iterate over the runes + for _, r := range sheetName { + // Excel forbids : \ / ? * [ ] + if r == ':' || r == '\\' || r == '/' || r == '?' || r == '*' || r == '[' || r == ']' { + return nil, fmt.Errorf("sheet name must not contain any restricted characters : \\ / ? * [ ] but contains '%s'", string(r)) + } + } + sheet := &Sheet{ + Name: sheetName, + File: f, + Selected: len(f.Sheets) == 0, + } + f.Sheet[sheetName] = sheet + f.Sheets = append(f.Sheets, sheet) + return sheet, nil +} + +// Appends an existing Sheet, with the provided name, to a File +func (f *File) AppendSheet(sheet Sheet, sheetName string) (*Sheet, error) { + if _, exists := f.Sheet[sheetName]; exists { + return nil, fmt.Errorf("duplicate sheet name '%s'.", sheetName) + } + sheet.Name = sheetName + sheet.File = f + sheet.Selected = len(f.Sheets) == 0 + f.Sheet[sheetName] = &sheet + f.Sheets = append(f.Sheets, &sheet) + return &sheet, nil +} + +func (f *File) makeWorkbook() xlsxWorkbook { + return xlsxWorkbook{ + FileVersion: xlsxFileVersion{AppName: "Go XLSX"}, + WorkbookPr: xlsxWorkbookPr{ShowObjects: "all"}, + BookViews: xlsxBookViews{ + WorkBookView: []xlsxWorkBookView{ + { + ShowHorizontalScroll: true, + ShowSheetTabs: true, + ShowVerticalScroll: true, + TabRatio: 204, + WindowHeight: 8192, + WindowWidth: 16384, + XWindow: "0", + YWindow: "0", + }, + }, + }, + Sheets: xlsxSheets{Sheet: make([]xlsxSheet, len(f.Sheets))}, + CalcPr: xlsxCalcPr{ + IterateCount: 100, + RefMode: "A1", + Iterate: false, + IterateDelta: 0.001, + }, + } +} + +// Some tools that read XLSX files have very strict requirements about +// the structure of the input XML. In particular both Numbers on the Mac +// and SAS dislike inline XML namespace declarations, or namespace +// prefixes that don't match the ones that Excel itself uses. This is a +// problem because the Go XML library doesn't multiple namespace +// declarations in a single element of a document. This function is a +// horrible hack to fix that after the XML marshalling is completed. +func replaceRelationshipsNameSpace(workbookMarshal string) string { + newWorkbook := strings.Replace(workbookMarshal, `xmlns:relationships="http://schemas.openxmlformats.org/officeDocument/2006/relationships" relationships:id`, `r:id`, -1) + // Dirty hack to fix issues #63 and #91; encoding/xml currently + // "doesn't allow for additional namespaces to be defined in the + // root element of the document," as described by @tealeg in the + // comments for #63. + oldXmlns := `<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">` + newXmlns := `<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">` + return strings.Replace(newWorkbook, oldXmlns, newXmlns, 1) +} + +// Construct a map of file name to XML content representing the file +// in terms of the structure of an XLSX file. +func (f *File) MarshallParts() (map[string]string, error) { + var parts map[string]string + var refTable *RefTable = NewSharedStringRefTable() + refTable.isWrite = true + var workbookRels WorkBookRels = make(WorkBookRels) + var err error + var workbook xlsxWorkbook + var types xlsxTypes = MakeDefaultContentTypes() + + marshal := func(thing interface{}) (string, error) { + body, err := xml.Marshal(thing) + if err != nil { + return "", err + } + return xml.Header + string(body), nil + } + + parts = make(map[string]string) + workbook = f.makeWorkbook() + sheetIndex := 1 + + if f.styles == nil { + f.styles = newXlsxStyleSheet(f.theme) + } + f.styles.reset() + if len(f.Sheets) == 0 { + err := errors.New("Workbook must contains atleast one worksheet") + return nil, err + } + for _, sheet := range f.Sheets { + xSheet := sheet.makeXLSXSheet(refTable, f.styles) + rId := fmt.Sprintf("rId%d", sheetIndex) + sheetId := strconv.Itoa(sheetIndex) + sheetPath := fmt.Sprintf("worksheets/sheet%d.xml", sheetIndex) + partName := "xl/" + sheetPath + types.Overrides = append( + types.Overrides, + xlsxOverride{ + PartName: "/" + partName, + ContentType: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml"}) + workbookRels[rId] = sheetPath + workbook.Sheets.Sheet[sheetIndex-1] = xlsxSheet{ + Name: sheet.Name, + SheetId: sheetId, + Id: rId, + State: "visible"} + parts[partName], err = marshal(xSheet) + if err != nil { + return parts, err + } + sheetIndex++ + } + + workbookMarshal, err := marshal(workbook) + if err != nil { + return parts, err + } + workbookMarshal = replaceRelationshipsNameSpace(workbookMarshal) + parts["xl/workbook.xml"] = workbookMarshal + if err != nil { + return parts, err + } + + parts["_rels/.rels"] = TEMPLATE__RELS_DOT_RELS + parts["docProps/app.xml"] = TEMPLATE_DOCPROPS_APP + // TODO - do this properly, modification and revision information + parts["docProps/core.xml"] = TEMPLATE_DOCPROPS_CORE + parts["xl/theme/theme1.xml"] = TEMPLATE_XL_THEME_THEME + + xSST := refTable.makeXLSXSST() + parts["xl/sharedStrings.xml"], err = marshal(xSST) + if err != nil { + return parts, err + } + + xWRel := workbookRels.MakeXLSXWorkbookRels() + + parts["xl/_rels/workbook.xml.rels"], err = marshal(xWRel) + if err != nil { + return parts, err + } + + parts["[Content_Types].xml"], err = marshal(types) + if err != nil { + return parts, err + } + + parts["xl/styles.xml"], err = f.styles.Marshal() + if err != nil { + return parts, err + } + + return parts, nil +} + +// Return the raw data contained in the File as three +// dimensional slice. The first index represents the sheet number, +// the second the row number, and the third the cell number. +// +// For example: +// +// var mySlice [][][]string +// var value string +// mySlice = xlsx.FileToSlice("myXLSX.xlsx") +// value = mySlice[0][0][0] +// +// Here, value would be set to the raw value of the cell A1 in the +// first sheet in the XLSX file. +func (f *File) ToSlice() (output [][][]string, err error) { + output = [][][]string{} + for _, sheet := range f.Sheets { + s := [][]string{} + for _, row := range sheet.Rows { + if row == nil { + continue + } + r := []string{} + for _, cell := range row.Cells { + str, err := cell.FormattedValue() + if err != nil { + // Recover from strconv.NumError if the value is an empty string, + // and insert an empty string in the output. + if numErr, ok := err.(*strconv.NumError); ok && numErr.Num == "" { + str = "" + } else { + return output, err + } + } + r = append(r, str) + } + s = append(s, r) + } + output = append(output, s) + } + return output, nil +} + +// ToSliceUnmerged returns the raw data contained in the File as three +// dimensional slice (s. method ToSlice). +// A covered cell become the value of its origin cell. +// Example: table where A1:A2 merged. +// | 01.01.2011 | Bread | 20 | +// | | Fish | 70 | +// This sheet will be converted to the slice: +// [ [01.01.2011 Bread 20] +// [01.01.2011 Fish 70] ] +func (f *File) ToSliceUnmerged() (output [][][]string, err error) { + output, err = f.ToSlice() + if err != nil { + return nil, err + } + + for s, sheet := range f.Sheets { + for r, row := range sheet.Rows { + for c, cell := range row.Cells { + if cell.HMerge > 0 { + for i := c + 1; i <= c+cell.HMerge; i++ { + output[s][r][i] = output[s][r][c] + } + } + + if cell.VMerge > 0 { + for i := r + 1; i <= r+cell.VMerge; i++ { + output[s][i][c] = output[s][r][c] + } + } + } + } + } + + return output, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/format_code.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/format_code.go new file mode 100644 index 0000000000000000000000000000000000000000..5b15a0507fc696a63e6384e0e7255e9662eab6b5 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/format_code.go @@ -0,0 +1,644 @@ +package xlsx + +import ( + "errors" + "fmt" + "math" + "strconv" + "strings" +) + +// Do not edit these attributes once this struct is created. This struct should only be created by +// parseFullNumberFormatString() from a number format string. If the format for a cell needs to change, change +// the number format string and getNumberFormat() will invalidate the old struct and re-parse the string. +type parsedNumberFormat struct { + numFmt string + isTimeFormat bool + negativeFormatExpectsPositive bool + positiveFormat *formatOptions + negativeFormat *formatOptions + zeroFormat *formatOptions + textFormat *formatOptions + parseEncounteredError *error +} + +type formatOptions struct { + isTimeFormat bool + showPercent bool + fullFormatString string + reducedFormatString string + prefix string + suffix string +} + +// FormatValue returns a value, and possibly an error condition +// from a Cell. If it is possible to apply a format to the cell +// value, it will do so, if not then an error will be returned, along +// with the raw value of the Cell. +// +// This is the documentation of the "General" Format in the Office Open XML spec: +// +// Numbers +// The application shall attempt to display the full number up to 11 digits (inc. decimal point). If the number is too +// large*, the application shall attempt to show exponential format. If the number has too many significant digits, the +// display shall be truncated. The optimal method of display is based on the available cell width. If the number cannot +// be displayed using any of these formats in the available width, the application shall show "#" across the width of +// the cell. +// +// Conditions for switching to exponential format: +// 1. The cell value shall have at least five digits for xE-xx +// 2. If the exponent is bigger than the size allowed, a floating point number cannot fit, so try exponential notation. +// 3. Similarly, for negative exponents, check if there is space for even one (non-zero) digit in floating point format**. +// 4. Finally, if there isn't room for all of the significant digits in floating point format (for a negative exponent), +// exponential format shall display more digits if the exponent is less than -3. (The 3 is because E-xx takes 4 +// characters, and the leading 0 in floating point takes only 1 character. Thus, for an exponent less than -3, there is +// more than 3 additional leading 0's, more than enough to compensate for the size of the E-xx.) +// +// Floating point rule: +// For general formatting in cells, max overall length for cell display is 11, not including negative sign, but includes +// leading zeros and decimal separator.*** +// +// Added Notes: +// * "If the number is too large" can also mean "if the number has more than 11 digits", so greater than or equal to +// 1e11 and less than 1e-9. +// ** Means that you should switch to scientific if there would be 9 zeros after the decimal (the decimal and first zero +// count against the 11 character limit), so less than 1e9. +// *** The way this is written, you can get numbers that are more than 11 characters because the golang Float fmt +// does not support adjusting the precision while not padding with zeros, while also not switching to scientific +// notation too early. +func (fullFormat *parsedNumberFormat) FormatValue(cell *Cell) (string, error) { + switch cell.cellType { + case CellTypeError: + // The error type is what XLSX uses in error cases such as when formulas are invalid. + // There will be text in the cell's value that can be shown, something ugly like #NAME? or ####### + return cell.Value, nil + case CellTypeBool: + if cell.Value == "0" { + return "FALSE", nil + } else if cell.Value == "1" { + return "TRUE", nil + } else { + return cell.Value, errors.New("invalid value in bool cell") + } + case CellTypeString: + fallthrough + case CellTypeInline: + fallthrough + case CellTypeStringFormula: + textFormat := cell.parsedNumFmt.textFormat + // This switch statement is only for String formats + switch textFormat.reducedFormatString { + case builtInNumFmt[builtInNumFmtIndex_GENERAL]: // General is literally "general" + return cell.Value, nil + case builtInNumFmt[builtInNumFmtIndex_STRING]: // String is "@" + return textFormat.prefix + cell.Value + textFormat.suffix, nil + case "": + // If cell is not "General" and there is not an "@" symbol in the format, then the cell's value is not + // used when determining what to display. It would be completely legal to have a format of "Error" + // for strings, and all values that are not numbers would show up as "Error". In that case, this code would + // have a prefix of "Error" and a reduced format string of "" (empty string). + return textFormat.prefix + textFormat.suffix, nil + default: + return cell.Value, errors.New("invalid or unsupported format, unsupported string format") + } + case CellTypeDate: + // These are dates that are stored in date format instead of being stored as numbers with a format to turn them + // into a date string. + return cell.Value, nil + case CellTypeNumeric: + return fullFormat.formatNumericCell(cell) + default: + return cell.Value, errors.New("unknown cell type") + } +} + +func (fullFormat *parsedNumberFormat) formatNumericCell(cell *Cell) (string, error) { + rawValue := strings.TrimSpace(cell.Value) + // If there wasn't a value in the cell, it shouldn't have been marked as Numeric. + // It's better to support this case though. + if rawValue == "" { + return "", nil + } + + if fullFormat.isTimeFormat { + return fullFormat.parseTime(rawValue, cell.date1904) + } + var numberFormat *formatOptions + floatVal, floatErr := strconv.ParseFloat(rawValue, 64) + if floatErr != nil { + return rawValue, floatErr + } + // Choose the correct format. There can be different formats for positive, negative, and zero numbers. + // Excel only uses the zero format if the value is literally zero, even if the number is so small that it shows + // up as "0" when the positive format is used. + if floatVal > 0 { + numberFormat = fullFormat.positiveFormat + } else if floatVal < 0 { + // If format string specified a different format for negative numbers, then the number should be made positive + // before getting formatted. The format string itself will contain formatting that denotes a negative number and + // this formatting will end up in the prefix or suffix. Commonly if there is a negative format specified, the + // number will get surrounded by parenthesis instead of showing it with a minus sign. + if fullFormat.negativeFormatExpectsPositive { + floatVal = math.Abs(floatVal) + } + numberFormat = fullFormat.negativeFormat + } else { + numberFormat = fullFormat.zeroFormat + } + + // When showPercent is true, multiply the number by 100. + // The percent sign will be in the prefix or suffix already, so it does not need to be added in this function. + // The number format itself will be the same as any other number format once the value is multiplied by 100. + if numberFormat.showPercent { + floatVal = 100 * floatVal + } + + // Only the most common format strings are supported here. + // Eventually this switch needs to be replaced with a more general solution. + // Some of these "supported" formats should have thousand separators, but don't get them since Go fmt + // doesn't have a way to request thousands separators. + // The only things that should be supported here are in the array formattingCharacters, + // everything else has been stripped out before and will be placed in the prefix or suffix. + // The formatting characters can have non-formatting characters mixed in with them and those should be maintained. + // However, at this time we fail to parse those formatting codes and they get replaced with "General" + var formattedNum string + switch numberFormat.reducedFormatString { + case builtInNumFmt[builtInNumFmtIndex_GENERAL]: // General is literally "general" + // prefix, showPercent, and suffix cannot apply to the general format + // The logic for showing numbers when the format is "general" is much more complicated than the rest of these. + generalFormatted, err := generalNumericScientific(cell.Value, true) + if err != nil { + return rawValue, nil + } + return generalFormatted, nil + case builtInNumFmt[builtInNumFmtIndex_STRING]: // String is "@" + formattedNum = cell.Value + case builtInNumFmt[builtInNumFmtIndex_INT], "#,##0": // Int is "0" + // Previously this case would cast to int and print with %d, but that will not round the value correctly. + formattedNum = fmt.Sprintf("%.0f", floatVal) + case "0.0", "#,##0.0": + formattedNum = fmt.Sprintf("%.1f", floatVal) + case builtInNumFmt[builtInNumFmtIndex_FLOAT], "#,##0.00": // Float is "0.00" + formattedNum = fmt.Sprintf("%.2f", floatVal) + case "0.000", "#,##0.000": + formattedNum = fmt.Sprintf("%.3f", floatVal) + case "0.0000", "#,##0.0000": + formattedNum = fmt.Sprintf("%.4f", floatVal) + case "0.00e+00", "##0.0e+0": + formattedNum = fmt.Sprintf("%e", floatVal) + case "": + // Do nothing. + default: + return rawValue, nil + } + return numberFormat.prefix + formattedNum + numberFormat.suffix, nil +} + +func generalNumericScientific(value string, allowScientific bool) (string, error) { + if strings.TrimSpace(value) == "" { + return "", nil + } + f, err := strconv.ParseFloat(value, 64) + if err != nil { + return value, err + } + if allowScientific { + absF := math.Abs(f) + // When using General format, numbers that are less than 1e-9 (0.000000001) and greater than or equal to + // 1e11 (100,000,000,000) should be shown in scientific notation. + // Numbers less than the number after zero, are assumed to be zero. + if (absF >= math.SmallestNonzeroFloat64 && absF < minNonScientificNumber) || absF >= maxNonScientificNumber { + return strconv.FormatFloat(f, 'E', -1, 64), nil + } + } + // This format (fmt="f", prec=-1) will prevent padding with zeros and will never switch to scientific notation. + // However, it will show more than 11 characters for very precise numbers, and this cannot be changed. + // You could also use fmt="g", prec=11, which doesn't pad with zeros and allows the correct precision, + // but it will use scientific notation on numbers less than 1e-4. That value is hardcoded in Go and cannot be + // configured or disabled. + return strconv.FormatFloat(f, 'f', -1, 64), nil +} + +// Format strings are a little strange to compare because empty string needs to be taken as general, and general needs +// to be compared case insensitively. +func compareFormatString(fmt1, fmt2 string) bool { + if fmt1 == fmt2 { + return true + } + if fmt1 == "" || strings.EqualFold(fmt1, "general") { + fmt1 = "general" + } + if fmt2 == "" || strings.EqualFold(fmt2, "general") { + fmt2 = "general" + } + return fmt1 == fmt2 +} + +func parseFullNumberFormatString(numFmt string) *parsedNumberFormat { + parsedNumFmt := &parsedNumberFormat{ + numFmt: numFmt, + } + if isTimeFormat(numFmt) { + // Time formats cannot have multiple groups separated by semicolons, there is only one format. + // Strings are unaffected by the time format. + parsedNumFmt.isTimeFormat = true + parsedNumFmt.textFormat, _ = parseNumberFormatSection("general") + return parsedNumFmt + } + + var fmtOptions []*formatOptions + formats, err := splitFormatOnSemicolon(numFmt) + if err == nil { + for _, formatSection := range formats { + parsedFormat, err := parseNumberFormatSection(formatSection) + if err != nil { + // If an invalid number section is found, fall back to general + parsedFormat = fallbackErrorFormat + parsedNumFmt.parseEncounteredError = &err + } + fmtOptions = append(fmtOptions, parsedFormat) + } + } else { + fmtOptions = append(fmtOptions, fallbackErrorFormat) + parsedNumFmt.parseEncounteredError = &err + } + if len(fmtOptions) > 4 { + fmtOptions = []*formatOptions{fallbackErrorFormat} + err = errors.New("invalid number format, too many format sections") + parsedNumFmt.parseEncounteredError = &err + } + + if len(fmtOptions) == 1 { + // If there is only one option, it is used for all + parsedNumFmt.positiveFormat = fmtOptions[0] + parsedNumFmt.negativeFormat = fmtOptions[0] + parsedNumFmt.zeroFormat = fmtOptions[0] + if strings.Contains(fmtOptions[0].fullFormatString, "@") { + parsedNumFmt.textFormat = fmtOptions[0] + } else { + parsedNumFmt.textFormat, _ = parseNumberFormatSection("general") + } + } else if len(fmtOptions) == 2 { + // If there are two formats, the first is used for positive and zeros, the second gets used as a negative format, + // and strings are not formatted. + // When negative numbers now have their own format, they should become positive before having the format applied. + // The format will contain a negative sign if it is desired, but they may be colored red or wrapped in + // parenthesis instead. + parsedNumFmt.negativeFormatExpectsPositive = true + parsedNumFmt.positiveFormat = fmtOptions[0] + parsedNumFmt.negativeFormat = fmtOptions[1] + parsedNumFmt.zeroFormat = fmtOptions[0] + parsedNumFmt.textFormat, _ = parseNumberFormatSection("general") + } else if len(fmtOptions) == 3 { + // If there are three formats, the first is used for positive, the second gets used as a negative format, + // the third is for negative, and strings are not formatted. + parsedNumFmt.negativeFormatExpectsPositive = true + parsedNumFmt.positiveFormat = fmtOptions[0] + parsedNumFmt.negativeFormat = fmtOptions[1] + parsedNumFmt.zeroFormat = fmtOptions[2] + parsedNumFmt.textFormat, _ = parseNumberFormatSection("general") + } else { + // With four options, the first is positive, the second is negative, the third is zero, and the fourth is strings + // Negative numbers should be still become positive before having the negative formatting applied. + parsedNumFmt.negativeFormatExpectsPositive = true + parsedNumFmt.positiveFormat = fmtOptions[0] + parsedNumFmt.negativeFormat = fmtOptions[1] + parsedNumFmt.zeroFormat = fmtOptions[2] + parsedNumFmt.textFormat = fmtOptions[3] + } + return parsedNumFmt +} + +// splitFormatOnSemicolon will split the format string into the format sections +// This logic to split the different formats on semicolon is fully correct, and will skip all literal semicolons, +// and will catch all breaking semicolons. +func splitFormatOnSemicolon(format string) ([]string, error) { + var formats []string + prevIndex := 0 + for i := 0; i < len(format); i++ { + if format[i] == ';' { + formats = append(formats, format[prevIndex:i]) + prevIndex = i + 1 + } else if format[i] == '\\' { + i++ + } else if format[i] == '"' { + endQuoteIndex := strings.Index(format[i+1:], "\"") + if endQuoteIndex == -1 { + // This is an invalid format string, fall back to general + return nil, errors.New("invalid format string, unmatched double quote") + } + i += endQuoteIndex + 1 + } + } + return append(formats, format[prevIndex:]), nil +} + +var fallbackErrorFormat = &formatOptions{ + fullFormatString: "general", + reducedFormatString: "general", +} + +// parseNumberFormatSection takes in individual format and parses out most of the options. +// Some options are parsed, removed from the string, and set as settings on formatOptions. +// There remainder of the format string is put in the reducedFormatString attribute, and supported values for these +// are handled in a switch in the Cell.FormattedValue() function. +// Ideally more and more of the format string would be parsed out here into settings until there is no remainder string +// at all. +// Features that this supports: +// - Time formats are detected, and marked in the options. Time format strings are handled when doing the formatting. +// The logic to detect time formats is currently not correct, and can catch formats that are not time formats as well +// as miss formats that are time formats. +// - Color formats are detected and removed. +// - Currency annotations are handled properly. +// - Literal strings wrapped in quotes are handled and put into prefix or suffix. +// - Numbers that should be percent are detected and marked in the options. +// - Conditionals are detected and removed, but they are not obeyed. The conditional groups will be used just like the +// positive;negative;zero;string format groups. Here is an example of a conditional format: "[Red][<=100];[Blue][>100]" +// Decoding the actual number formatting portion is out of scope, that is placed into reducedFormatString and is used +// when formatting the string. The string there will be reduced to only the things in the formattingCharacters array. +// Everything not in that array has been parsed out and put into formatOptions. +func parseNumberFormatSection(fullFormat string) (*formatOptions, error) { + reducedFormat := strings.TrimSpace(fullFormat) + + // general is the only format that does not use the normal format symbols notations + if compareFormatString(reducedFormat, "general") { + return &formatOptions{ + fullFormatString: "general", + reducedFormatString: "general", + }, nil + } + + prefix, reducedFormat, showPercent1, err := parseLiterals(reducedFormat) + if err != nil { + return nil, err + } + + reducedFormat, suffixFormat := splitFormatAndSuffixFormat(reducedFormat) + + suffix, remaining, showPercent2, err := parseLiterals(suffixFormat) + if err != nil { + return nil, err + } + if len(remaining) > 0 { + // This paradigm of codes consisting of literals, number formats, then more literals is not always correct, they can + // actually be intertwined. Though 99% of the time number formats will not do this. + // Excel uses this format string for Social Security Numbers: 000\-00\-0000 + // and this for US phone numbers: [<=9999999]###\-####;\(###\)\ ###\-#### + return nil, errors.New("invalid or unsupported format string") + } + + return &formatOptions{ + fullFormatString: fullFormat, + isTimeFormat: false, + reducedFormatString: reducedFormat, + prefix: prefix, + suffix: suffix, + showPercent: showPercent1 || showPercent2, + }, nil +} + +// formattingCharacters will be left in the reducedNumberFormat +// It is important that these be looked for in order so that the slash cases are handled correctly. +// / (slash) is a fraction format if preceded by 0, #, or ?, otherwise it is not a formatting character +// E- E+ e- e+ are scientific notation, but E, e, -, + are not formatting characters independently +// \ (back slash) makes the next character a literal (not formatting) +// " Anything in double quotes is not a formatting character +// _ (underscore) skips the width of the next character, so the next character cannot be formatting +var formattingCharacters = []string{"0/", "#/", "?/", "E-", "E+", "e-", "e+", "0", "#", "?", ".", ",", "@", "*"} + +// The following are also time format characters, but since this is only used for detecting, not decoding, they are +// redundant here: ee, gg, ggg, rr, ss, mm, hh, yyyy, dd, ddd, dddd, mm, mmm, mmmm, mmmmm, ss.0000, ss.000, ss.00, ss.0 +// The .00 type format is very tricky, because it only counts if it comes after ss or s or [ss] or [s] +// .00 is actually a valid number format by itself. +var timeFormatCharacters = []string{"m", "d", "yy", "h", "m", "AM/PM", "A/P", "am/pm", "a/p", "r", "g", "e", "b1", "b2", "[hh]", "[h]", "[mm]", "[m]", + "s.0000", "s.000", "s.00", "s.0", "s", "[ss].0000", "[ss].000", "[ss].00", "[ss].0", "[ss]", "[s].0000", "[s].000", "[s].00", "[s].0", "[s]"} + +func splitFormatAndSuffixFormat(format string) (string, string) { + var i int + for ; i < len(format); i++ { + curReducedFormat := format[i:] + var found bool + for _, special := range formattingCharacters { + if strings.HasPrefix(curReducedFormat, special) { + // Skip ahead if the special character was longer than length 1 + i += len(special) - 1 + found = true + break + } + } + if !found { + break + } + } + suffixFormat := format[i:] + format = format[:i] + return format, suffixFormat +} + +func parseLiterals(format string) (string, string, bool, error) { + var prefix string + showPercent := false + for i := 0; i < len(format); i++ { + curReducedFormat := format[i:] + switch curReducedFormat[0] { + case '\\': + // If there is a slash, skip the next character, and add it to the prefix + if len(curReducedFormat) > 1 { + i++ + prefix += curReducedFormat[1:2] + } + case '_': + // If there is an underscore, skip the next character, but don't add it to the prefix + if len(curReducedFormat) > 1 { + i++ + } + case '*': + // Asterisks are used to repeat the next character to fill the full cell width. + // There isn't really a cell size in this context, so this will be ignored. + case '"': + // If there is a quote skip to the next quote, and add the quoted characters to the prefix + endQuoteIndex := strings.Index(curReducedFormat[1:], "\"") + if endQuoteIndex == -1 { + return "", "", false, errors.New("invalid formatting code, unmatched double quote") + } + prefix = prefix + curReducedFormat[1:endQuoteIndex+1] + i += endQuoteIndex + 1 + case '%': + showPercent = true + prefix += "%" + case '[': + // Brackets can be currency annotations (e.g. [$$-409]) + // color formats (e.g. [color1] through [color56], as well as [red] etc.) + // conditionals (e.g. [>100], the valid conditionals are =, >, <, >=, <=, <>) + bracketIndex := strings.Index(curReducedFormat, "]") + if bracketIndex == -1 { + return "", "", false, errors.New("invalid formatting code, invalid brackets") + } + // Currencies in Excel are annotated with this format: [$<Currency String>-<Language Info>] + // Currency String is something like $, ¥, €, or £ + // Language Info is three hexadecimal characters + if len(curReducedFormat) > 2 && curReducedFormat[1] == '$' { + dashIndex := strings.Index(curReducedFormat, "-") + if dashIndex != -1 && dashIndex < bracketIndex { + // Get the currency symbol, and skip to the end of the currency format + prefix += curReducedFormat[2:dashIndex] + } else { + return "", "", false, errors.New("invalid formatting code, invalid currency annotation") + } + } + i += bracketIndex + case '$', '-', '+', '/', '(', ')', ':', '!', '^', '&', '\'', '~', '{', '}', '<', '>', '=', ' ': + // These symbols are allowed to be used as literal without escaping + prefix += curReducedFormat[0:1] + default: + for _, special := range formattingCharacters { + if strings.HasPrefix(curReducedFormat, special) { + // This means we found the start of the actual number formatting portion, and should return. + return prefix, format[i:], showPercent, nil + } + } + // Symbols that don't have meaning and aren't in the exempt literal characters and are not escaped. + return "", "", false, errors.New("invalid formatting code: unsupported or unescaped characters") + } + } + return prefix, "", showPercent, nil +} + +// parseTime returns a string parsed using time.Time +func (fullFormat *parsedNumberFormat) parseTime(value string, date1904 bool) (string, error) { + f, err := strconv.ParseFloat(value, 64) + if err != nil { + return value, err + } + val := TimeFromExcelTime(f, date1904) + format := fullFormat.numFmt + // Replace Excel placeholders with Go time placeholders. + // For example, replace yyyy with 2006. These are in a specific order, + // due to the fact that m is used in month, minute, and am/pm. It would + // be easier to fix that with regular expressions, but if it's possible + // to keep this simple it would be easier to maintain. + // Full-length month and days (e.g. March, Tuesday) have letters in them that would be replaced + // by other characters below (such as the 'h' in March, or the 'd' in Tuesday) below. + // First we convert them to arbitrary characters unused in Excel Date formats, and then at the end, + // turn them to what they should actually be. + // Based off: http://www.ozgrid.com/Excel/CustomFormats.htm + replacements := []struct{ xltime, gotime string }{ + {"yyyy", "2006"}, + {"yy", "06"}, + {"mmmm", "%%%%"}, + {"dddd", "&&&&"}, + {"dd", "02"}, + {"d", "2"}, + {"mmm", "Jan"}, + {"mmss", "0405"}, + {"ss", "05"}, + {"mm:", "04:"}, + {":mm", ":04"}, + {"mm", "01"}, + {"am/pm", "pm"}, + {"m/", "1/"}, + {"%%%%", "January"}, + {"&&&&", "Monday"}, + } + // It is the presence of the "am/pm" indicator that determins + // if this is a 12 hour or 24 hours time format, not the + // number of 'h' characters. + if is12HourTime(format) { + format = strings.Replace(format, "hh", "03", 1) + format = strings.Replace(format, "h", "3", 1) + } else { + format = strings.Replace(format, "hh", "15", 1) + format = strings.Replace(format, "h", "15", 1) + } + for _, repl := range replacements { + format = strings.Replace(format, repl.xltime, repl.gotime, 1) + } + // If the hour is optional, strip it out, along with the + // possible dangling colon that would remain. + if val.Hour() < 1 { + format = strings.Replace(format, "]:", "]", 1) + format = strings.Replace(format, "[03]", "", 1) + format = strings.Replace(format, "[3]", "", 1) + format = strings.Replace(format, "[15]", "", 1) + } else { + format = strings.Replace(format, "[3]", "3", 1) + format = strings.Replace(format, "[15]", "15", 1) + } + return val.Format(format), nil +} + +// isTimeFormat checks whether an Excel format string represents a time.Time. +// This function is now correct, but it can detect time format strings that cannot be correctly handled by parseTime() +func isTimeFormat(format string) bool { + var foundTimeFormatCharacters bool + for i := 0; i < len(format); i++ { + curReducedFormat := format[i:] + switch curReducedFormat[0] { + case '\\', '_': + // If there is a slash, skip the next character, and add it to the prefix + // If there is an underscore, skip the next character, but don't add it to the prefix + if len(curReducedFormat) > 1 { + i++ + } + case '*': + // Asterisks are used to repeat the next character to fill the full cell width. + // There isn't really a cell size in this context, so this will be ignored. + case '"': + // If there is a quote skip to the next quote, and add the quoted characters to the prefix + endQuoteIndex := strings.Index(curReducedFormat[1:], "\"") + if endQuoteIndex == -1 { + // This is not any type of valid format. + return false + } + i += endQuoteIndex + 1 + case '$', '-', '+', '/', '(', ')', ':', '!', '^', '&', '\'', '~', '{', '}', '<', '>', '=', ' ': + // These symbols are allowed to be used as literal without escaping + case ',': + // This is not documented in the XLSX spec as far as I can tell, but Excel and Numbers will include + // commas in number formats without escaping them, so this should be supported. + default: + foundInThisLoop := false + for _, special := range timeFormatCharacters { + if strings.HasPrefix(curReducedFormat, special) { + foundTimeFormatCharacters = true + foundInThisLoop = true + i += len(special) - 1 + break + } + } + if foundInThisLoop { + continue + } + if curReducedFormat[0] == '[' { + // For number formats, this code would happen above in a case '[': section. + // However, for time formats it must happen after looking for occurrences in timeFormatCharacters + // because there are a few time formats that can be wrapped in brackets. + + // Brackets can be currency annotations (e.g. [$$-409]) + // color formats (e.g. [color1] through [color56], as well as [red] etc.) + // conditionals (e.g. [>100], the valid conditionals are =, >, <, >=, <=, <>) + bracketIndex := strings.Index(curReducedFormat, "]") + if bracketIndex == -1 { + // This is not any type of valid format. + return false + } + i += bracketIndex + continue + } + // Symbols that don't have meaning, aren't in the exempt literal characters, and aren't escaped are invalid. + // The string could still be a valid number format string. + return false + } + } + // If the string doesn't have any time formatting characters, it could technically be a time format, but it + // would be a pretty weak time format. A valid time format with no time formatting symbols will also be a number + // format with no number formatting symbols, which is essentially a constant string that does not depend on the + // cell's value in anyway. The downstream logic will do the right thing in that case if this returns false. + return foundTimeFormatCharacters +} + +// is12HourTime checks whether an Excel time format string is a 12 +// hours form. +func is12HourTime(format string) bool { + return strings.Contains(format, "am/pm") || strings.Contains(format, "AM/PM") || strings.Contains(format, "a/p") || strings.Contains(format, "A/P") +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/hsl.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/hsl.go new file mode 100644 index 0000000000000000000000000000000000000000..d78beea498f934507ecbc43989a309d242b88baf --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/hsl.go @@ -0,0 +1,145 @@ +/* +Copyright (c) 2012 Rodrigo Moraes. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +package xlsx + +import ( + "image/color" + "math" +) + +// HSLModel converts any color.Color to a HSL color. +var HSLModel = color.ModelFunc(hslModel) + +// HSL represents a cylindrical coordinate of points in an RGB color model. +// +// Values are in the range 0 to 1. +type HSL struct { + H, S, L float64 +} + +// RGBA returns the alpha-premultiplied red, green, blue and alpha values +// for the HSL. +func (c HSL) RGBA() (uint32, uint32, uint32, uint32) { + r, g, b := HSLToRGB(c.H, c.S, c.L) + return uint32(r) * 0x101, uint32(g) * 0x101, uint32(b) * 0x101, 0xffff +} + +// hslModel converts a color.Color to HSL. +func hslModel(c color.Color) color.Color { + if _, ok := c.(HSL); ok { + return c + } + r, g, b, _ := c.RGBA() + h, s, l := RGBToHSL(uint8(r>>8), uint8(g>>8), uint8(b>>8)) + return HSL{h, s, l} +} + +// RGBToHSL converts an RGB triple to a HSL triple. +// +// Ported from http://goo.gl/Vg1h9 +func RGBToHSL(r, g, b uint8) (h, s, l float64) { + fR := float64(r) / 255 + fG := float64(g) / 255 + fB := float64(b) / 255 + max := math.Max(math.Max(fR, fG), fB) + min := math.Min(math.Min(fR, fG), fB) + l = (max + min) / 2 + if max == min { + // Achromatic. + h, s = 0, 0 + } else { + // Chromatic. + d := max - min + if l > 0.5 { + s = d / (2.0 - max - min) + } else { + s = d / (max + min) + } + switch max { + case fR: + h = (fG - fB) / d + if fG < fB { + h += 6 + } + case fG: + h = (fB-fR)/d + 2 + case fB: + h = (fR-fG)/d + 4 + } + h /= 6 + } + return +} + +// HSLToRGB converts an HSL triple to a RGB triple. +// +// Ported from http://goo.gl/Vg1h9 +func HSLToRGB(h, s, l float64) (r, g, b uint8) { + var fR, fG, fB float64 + if s == 0 { + fR, fG, fB = l, l, l + } else { + var q float64 + if l < 0.5 { + q = l * (1 + s) + } else { + q = l + s - s*l + } + p := 2*l - q + fR = hueToRGB(p, q, h+1.0/3) + fG = hueToRGB(p, q, h) + fB = hueToRGB(p, q, h-1.0/3) + } + r = uint8((fR * 255) + 0.5) + g = uint8((fG * 255) + 0.5) + b = uint8((fB * 255) + 0.5) + return +} + +// hueToRGB is a helper function for HSLToRGB. +func hueToRGB(p, q, t float64) float64 { + if t < 0 { + t += 1 + } + if t > 1 { + t -= 1 + } + if t < 1.0/6 { + return p + (q-p)*6*t + } + if t < 0.5 { + return q + } + if t < 2.0/3 { + return p + (q-p)*(2.0/3-t)*6 + } + return p +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/lib.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/lib.go new file mode 100644 index 0000000000000000000000000000000000000000..57ea7e03b79bd3468e90564036f8ee130428264b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/lib.go @@ -0,0 +1,1065 @@ +package xlsx + +import ( + "archive/zip" + "bytes" + "encoding/xml" + "errors" + "fmt" + "io" + "path" + "strconv" + "strings" +) + +const ( + sheetEnding = `</sheetData></worksheet>` +) + +// XLSXReaderError is the standard error type for otherwise undefined +// errors in the XSLX reading process. +type XLSXReaderError struct { + Err string +} + +// Error returns a string value from an XLSXReaderError struct in order +// that it might comply with the builtin.error interface. +func (e *XLSXReaderError) Error() string { + return e.Err +} + +// getRangeFromString is an internal helper function that converts +// XLSX internal range syntax to a pair of integers. For example, +// the range string "1:3" yield the upper and lower integers 1 and 3. +func getRangeFromString(rangeString string) (lower int, upper int, error error) { + var parts []string + parts = strings.SplitN(rangeString, ":", 2) + if parts[0] == "" { + error = errors.New(fmt.Sprintf("Invalid range '%s'\n", rangeString)) + } + if parts[1] == "" { + error = errors.New(fmt.Sprintf("Invalid range '%s'\n", rangeString)) + } + lower, error = strconv.Atoi(parts[0]) + if error != nil { + error = errors.New(fmt.Sprintf("Invalid range (not integer in lower bound) %s\n", rangeString)) + } + upper, error = strconv.Atoi(parts[1]) + if error != nil { + error = errors.New(fmt.Sprintf("Invalid range (not integer in upper bound) %s\n", rangeString)) + } + return lower, upper, error +} + +// ColLettersToIndex is used to convert a character based column +// reference to a zero based numeric column identifier. +func ColLettersToIndex(letters string) int { + sum, mul, n := 0, 1, 0 + for i := len(letters) - 1; i >= 0; i, mul, n = i-1, mul*26, 1 { + c := letters[i] + switch { + case 'A' <= c && c <= 'Z': + n += int(c - 'A') + case 'a' <= c && c <= 'z': + n += int(c - 'a') + } + sum += n * mul + } + return sum +} + +// Get the largestDenominator that is a multiple of a basedDenominator +// and fits at least once into a given numerator. +func getLargestDenominator(numerator, multiple, baseDenominator, power int) (int, int) { + if numerator/multiple == 0 { + return 1, power + } + next, nextPower := getLargestDenominator( + numerator, multiple*baseDenominator, baseDenominator, power+1) + if next > multiple { + return next, nextPower + } + return multiple, power +} + +// Convers a list of numbers representing a column into a alphabetic +// representation, as used in the spreadsheet. +func formatColumnName(colId []int) string { + lastPart := len(colId) - 1 + + result := "" + for n, part := range colId { + if n == lastPart { + // The least significant number is in the + // range 0-25, all other numbers are 1-26, + // hence we use a differente offset for the + // last part. + result += string(part + 65) + } else { + // Don't output leading 0s, as there is no + // representation of 0 in this format. + if part > 0 { + result += string(part + 64) + } + } + } + return result +} + +func smooshBase26Slice(b26 []int) []int { + // Smoosh values together, eliminating 0s from all but the + // least significant part. + lastButOnePart := len(b26) - 2 + for i := lastButOnePart; i > 0; i-- { + part := b26[i] + if part == 0 { + greaterPart := b26[i-1] + if greaterPart > 0 { + b26[i-1] = greaterPart - 1 + b26[i] = 26 + } + } + } + return b26 +} + +func intToBase26(x int) (parts []int) { + // Excel column codes are pure evil - in essence they're just + // base26, but they don't represent the number 0. + b26Denominator, _ := getLargestDenominator(x, 1, 26, 0) + + // This loop terminates because integer division of 1 / 26 + // returns 0. + for d := b26Denominator; d > 0; d = d / 26 { + value := x / d + remainder := x % d + parts = append(parts, value) + x = remainder + } + return parts +} + +// ColIndexToLetters is used to convert a zero based, numeric column +// indentifier into a character code. +func ColIndexToLetters(colRef int) string { + parts := intToBase26(colRef) + return formatColumnName(smooshBase26Slice(parts)) +} + +// letterOnlyMapF is used in conjunction with strings.Map to return +// only the characters A-Z and a-z in a string +func letterOnlyMapF(rune rune) rune { + switch { + case 'A' <= rune && rune <= 'Z': + return rune + case 'a' <= rune && rune <= 'z': + return rune - 32 + } + return -1 +} + +// intOnlyMapF is used in conjunction with strings.Map to return only +// the numeric portions of a string. +func intOnlyMapF(rune rune) rune { + if rune >= 48 && rune < 58 { + return rune + } + return -1 +} + +// GetCoordsFromCellIDString returns the zero based cartesian +// coordinates from a cell name in Excel format, e.g. the cellIDString +// "A1" returns 0, 0 and the "B3" return 1, 2. +func GetCoordsFromCellIDString(cellIDString string) (x, y int, error error) { + var letterPart string = strings.Map(letterOnlyMapF, cellIDString) + y, error = strconv.Atoi(strings.Map(intOnlyMapF, cellIDString)) + if error != nil { + return x, y, error + } + y -= 1 // Zero based + x = ColLettersToIndex(letterPart) + return x, y, error +} + +// GetCellIDStringFromCoords returns the Excel format cell name that +// represents a pair of zero based cartesian coordinates. +func GetCellIDStringFromCoords(x, y int) string { + letterPart := ColIndexToLetters(x) + numericPart := y + 1 + return fmt.Sprintf("%s%d", letterPart, numericPart) +} + +// getMaxMinFromDimensionRef return the zero based cartesian maximum +// and minimum coordinates from the dimension reference embedded in a +// XLSX worksheet. For example, the dimension reference "A1:B2" +// returns "0,0", "1,1". +func getMaxMinFromDimensionRef(ref string) (minx, miny, maxx, maxy int, err error) { + var parts []string + parts = strings.Split(ref, ":") + minx, miny, err = GetCoordsFromCellIDString(parts[0]) + if err != nil { + return -1, -1, -1, -1, err + } + maxx, maxy, err = GetCoordsFromCellIDString(parts[1]) + if err != nil { + return -1, -1, -1, -1, err + } + return +} + +// calculateMaxMinFromWorkSheet works out the dimensions of a spreadsheet +// that doesn't have a DimensionRef set. The only case currently +// known where this is true is with XLSX exported from Google Docs. +// This is also true for XLSX files created through the streaming APIs. +func calculateMaxMinFromWorksheet(worksheet *xlsxWorksheet) (minx, miny, maxx, maxy int, err error) { + // Note, this method could be very slow for large spreadsheets. + var x, y int + var maxVal int + maxVal = int(^uint(0) >> 1) + minx = maxVal + miny = maxVal + maxy = 0 + maxx = 0 + for _, row := range worksheet.SheetData.Row { + for _, cell := range row.C { + x, y, err = GetCoordsFromCellIDString(cell.R) + if err != nil { + return -1, -1, -1, -1, err + } + if x < minx { + minx = x + } + if x > maxx { + maxx = x + } + if y < miny { + miny = y + } + if y > maxy { + maxy = y + } + } + } + if minx == maxVal { + minx = 0 + } + if miny == maxVal { + miny = 0 + } + return +} + +// makeRowFromSpan will, when given a span expressed as a string, +// return an empty Row large enough to encompass that span and +// populate it with empty cells. All rows start from cell 1 - +// regardless of the lower bound of the span. +func makeRowFromSpan(spans string, sheet *Sheet) *Row { + var error error + var upper int + var row *Row + var cell *Cell + + row = new(Row) + row.Sheet = sheet + _, upper, error = getRangeFromString(spans) + if error != nil { + panic(error) + } + error = nil + row.Cells = make([]*Cell, upper) + for i := 0; i < upper; i++ { + cell = new(Cell) + cell.Value = "" + row.Cells[i] = cell + } + return row +} + +// makeRowFromRaw returns the Row representation of the xlsxRow. +func makeRowFromRaw(rawrow xlsxRow, sheet *Sheet) *Row { + var upper int + var row *Row + var cell *Cell + + row = new(Row) + row.Sheet = sheet + upper = -1 + + for _, rawcell := range rawrow.C { + if rawcell.R != "" { + x, _, error := GetCoordsFromCellIDString(rawcell.R) + if error != nil { + panic(fmt.Sprintf("Invalid Cell Coord, %s\n", rawcell.R)) + } + if x > upper { + upper = x + } + continue + } + upper++ + } + upper++ + + row.OutlineLevel = rawrow.OutlineLevel + + row.Cells = make([]*Cell, upper) + for i := 0; i < upper; i++ { + cell = new(Cell) + cell.Value = "" + row.Cells[i] = cell + } + return row +} + +func makeEmptyRow(sheet *Sheet) *Row { + row := new(Row) + row.Cells = make([]*Cell, 0) + row.Sheet = sheet + return row +} + +type sharedFormula struct { + x, y int + formula string +} + +func formulaForCell(rawcell xlsxC, sharedFormulas map[int]sharedFormula) string { + var res string + + f := rawcell.F + if f == nil { + return "" + } + if f.T == "shared" { + x, y, err := GetCoordsFromCellIDString(rawcell.R) + if err != nil { + res = f.Content + } else { + if f.Ref != "" { + res = f.Content + sharedFormulas[f.Si] = sharedFormula{x, y, res} + } else { + sharedFormula := sharedFormulas[f.Si] + dx := x - sharedFormula.x + dy := y - sharedFormula.y + orig := []byte(sharedFormula.formula) + var start, end int + var stringLiteral bool + for end = 0; end < len(orig); end++ { + c := orig[end] + + if c == '"' { + stringLiteral = !stringLiteral + } + + if stringLiteral { + continue // Skip characters in quotes + } + + if c >= 'A' && c <= 'Z' || c == '$' { + res += string(orig[start:end]) + start = end + end++ + foundNum := false + for ; end < len(orig); end++ { + idc := orig[end] + if idc >= '0' && idc <= '9' || idc == '$' { + foundNum = true + } else if idc >= 'A' && idc <= 'Z' { + if foundNum { + break + } + } else { + break + } + } + if foundNum { + cellID := string(orig[start:end]) + res += shiftCell(cellID, dx, dy) + start = end + } + } + } + if start < len(orig) { + res += string(orig[start:]) + } + } + } + } else { + res = f.Content + } + return strings.Trim(res, " \t\n\r") +} + +// shiftCell returns the cell shifted according to dx and dy taking into consideration of absolute +// references with dollar sign ($) +func shiftCell(cellID string, dx, dy int) string { + fx, fy, _ := GetCoordsFromCellIDString(cellID) + + // Is fixed column? + fixedCol := strings.Index(cellID, "$") == 0 + + // Is fixed row? + fixedRow := strings.LastIndex(cellID, "$") > 0 + + if !fixedCol { + // Shift column + fx += dx + } + + if !fixedRow { + // Shift row + fy += dy + } + + // New shifted cell + shiftedCellID := GetCellIDStringFromCoords(fx, fy) + + if !fixedCol && !fixedRow { + return shiftedCellID + } + + // There are absolute references, need to put the $ back into the formula. + letterPart := strings.Map(letterOnlyMapF, shiftedCellID) + numberPart := strings.Map(intOnlyMapF, shiftedCellID) + + result := "" + + if fixedCol { + result += "$" + } + + result += letterPart + + if fixedRow { + result += "$" + } + + result += numberPart + + return result +} + +// fillCellData attempts to extract a valid value, usable in +// CSV form from the raw cell value. Note - this is not actually +// general enough - we should support retaining tabs and newlines. +func fillCellData(rawCell xlsxC, refTable *RefTable, sharedFormulas map[int]sharedFormula, cell *Cell) { + val := strings.Trim(rawCell.V, " \t\n\r") + cell.formula = formulaForCell(rawCell, sharedFormulas) + switch rawCell.T { + case "s": // Shared String + cell.cellType = CellTypeString + if val != "" { + ref, err := strconv.Atoi(val) + if err != nil { + panic(err) + } + cell.Value = refTable.ResolveSharedString(ref) + } + case "inlineStr": + cell.cellType = CellTypeInline + fillCellDataFromInlineString(rawCell, cell) + case "b": // Boolean + cell.Value = val + cell.cellType = CellTypeBool + case "e": // Error + cell.Value = val + cell.cellType = CellTypeError + case "str": + // String Formula (special type for cells with formulas that return a string value) + // Unlike the other string cell types, the string is stored directly in the value. + cell.Value = val + cell.cellType = CellTypeStringFormula + case "d": // Date: Cell contains a date in the ISO 8601 format. + cell.Value = val + cell.cellType = CellTypeDate + case "": // Numeric is the default + fallthrough + case "n": // Numeric + cell.Value = val + cell.cellType = CellTypeNumeric + default: + panic(errors.New("invalid cell type")) + } +} + +// fillCellDataFromInlineString attempts to get inline string data and put it into a Cell. +func fillCellDataFromInlineString(rawcell xlsxC, cell *Cell) { + cell.Value = "" + if rawcell.Is != nil { + if rawcell.Is.T != "" { + cell.Value = strings.Trim(rawcell.Is.T, " \t\n\r") + } else { + for _, r := range rawcell.Is.R { + cell.Value += r.T + } + } + } +} + +// readRowsFromSheet is an internal helper function that extracts the +// rows from a XSLXWorksheet, populates them with Cells and resolves +// the value references from the reference table and stores them in +// the rows and columns. +func readRowsFromSheet(Worksheet *xlsxWorksheet, file *File, sheet *Sheet, rowLimit int) ([]*Row, []*Col, int, int) { + var rows []*Row + var cols []*Col + var row *Row + var minCol, maxCol, maxRow, colCount, rowCount int + var reftable *RefTable + var err error + var insertRowIndex, insertColIndex int + sharedFormulas := map[int]sharedFormula{} + + if len(Worksheet.SheetData.Row) == 0 { + return nil, nil, 0, 0 + } + reftable = file.referenceTable + if len(Worksheet.Dimension.Ref) > 0 && len(strings.Split(Worksheet.Dimension.Ref, ":")) == 2 && rowLimit == NoRowLimit { + minCol, _, maxCol, maxRow, err = getMaxMinFromDimensionRef(Worksheet.Dimension.Ref) + } else { + minCol, _, maxCol, maxRow, err = calculateMaxMinFromWorksheet(Worksheet) + } + if err != nil { + panic(err.Error()) + } + + rowCount = maxRow + 1 + colCount = maxCol + 1 + rows = make([]*Row, rowCount) + cols = make([]*Col, colCount) + for i := range cols { + cols[i] = &Col{ + Hidden: false, + } + } + + if Worksheet.Cols != nil { + // Columns can apply to a range, for convenience we expand the + // ranges out into individual column definitions. + for _, rawcol := range Worksheet.Cols.Col { + // Note, below, that sometimes column definitions can + // exist outside the defined dimensions of the + // spreadsheet - we deliberately exclude these + // columns. + for i := rawcol.Min; i <= rawcol.Max && i <= colCount; i++ { + col := &Col{ + Min: rawcol.Min, + Max: rawcol.Max, + Hidden: rawcol.Hidden, + Width: rawcol.Width, + OutlineLevel: rawcol.OutlineLevel} + cols[i-1] = col + if file.styles != nil { + col.style = file.styles.getStyle(rawcol.Style) + col.numFmt, col.parsedNumFmt = file.styles.getNumberFormat(rawcol.Style) + } + } + } + } + + numRows := len(rows) + for rowIndex := 0; rowIndex < len(Worksheet.SheetData.Row); rowIndex++ { + rawrow := Worksheet.SheetData.Row[rowIndex] + // Some spreadsheets will omit blank rows from the + // stored data + for rawrow.R > (insertRowIndex + 1) { + // Put an empty Row into the array + if insertRowIndex < numRows { + rows[insertRowIndex] = makeEmptyRow(sheet) + } + insertRowIndex++ + } + // range is not empty and only one range exist + if len(rawrow.Spans) != 0 && strings.Count(rawrow.Spans, ":") == 1 { + row = makeRowFromSpan(rawrow.Spans, sheet) + } else { + row = makeRowFromRaw(rawrow, sheet) + } + + row.Hidden = rawrow.Hidden + height, err := strconv.ParseFloat(rawrow.Ht, 64) + if err == nil { + row.Height = height + } + row.isCustom = rawrow.CustomHeight + row.OutlineLevel = rawrow.OutlineLevel + + insertColIndex = minCol + for _, rawcell := range rawrow.C { + h, v, err := Worksheet.MergeCells.getExtent(rawcell.R) + if err != nil { + panic(err.Error()) + } + x, _, _ := GetCoordsFromCellIDString(rawcell.R) + + // K1000000: Prevent panic when the range specified in the spreadsheet + // view exceeds the actual number of columns in the dataset. + + // Some spreadsheets will omit blank cells + // from the data. + for x > insertColIndex { + // Put an empty Cell into the array + if insertColIndex < len(row.Cells) { + row.Cells[insertColIndex] = new(Cell) + } + insertColIndex++ + } + cellX := insertColIndex + + if cellX < len(row.Cells) { + cell := row.Cells[cellX] + cell.HMerge = h + cell.VMerge = v + fillCellData(rawcell, reftable, sharedFormulas, cell) + if file.styles != nil { + cell.style = file.styles.getStyle(rawcell.S) + cell.NumFmt, cell.parsedNumFmt = file.styles.getNumberFormat(rawcell.S) + } + cell.date1904 = file.Date1904 + // Cell is considered hidden if the row or the column of this cell is hidden + cell.Hidden = rawrow.Hidden || (len(cols) > cellX && cols[cellX].Hidden) + insertColIndex++ + } + } + if len(rows) > insertRowIndex { + rows[insertRowIndex] = row + } + insertRowIndex++ + } + + // insert trailing empty rows for the rest of the file + for ; insertRowIndex < rowCount; insertRowIndex++ { + rows[insertRowIndex] = makeEmptyRow(sheet) + } + return rows, cols, colCount, rowCount +} + +type indexedSheet struct { + Index int + Sheet *Sheet + Error error +} + +func readSheetViews(xSheetViews xlsxSheetViews) []SheetView { + if xSheetViews.SheetView == nil || len(xSheetViews.SheetView) == 0 { + return nil + } + sheetViews := []SheetView{} + for _, xSheetView := range xSheetViews.SheetView { + sheetView := SheetView{} + if xSheetView.Pane != nil { + xlsxPane := xSheetView.Pane + pane := &Pane{} + pane.XSplit = xlsxPane.XSplit + pane.YSplit = xlsxPane.YSplit + pane.TopLeftCell = xlsxPane.TopLeftCell + pane.ActivePane = xlsxPane.ActivePane + pane.State = xlsxPane.State + sheetView.Pane = pane + } + sheetViews = append(sheetViews, sheetView) + } + return sheetViews +} + +// readSheetFromFile is the logic of converting a xlsxSheet struct +// into a Sheet struct. This work can be done in parallel and so +// readSheetsFromZipFile will spawn an instance of this function per +// sheet and get the results back on the provided channel. +func readSheetFromFile(sc chan *indexedSheet, index int, rsheet xlsxSheet, fi *File, sheetXMLMap map[string]string, rowLimit int) (errRes error) { + result := &indexedSheet{Index: index, Sheet: nil, Error: nil} + defer func() { + if e := recover(); e != nil { + switch e.(type) { + case error: + result.Error = e.(error) + errRes = e.(error) + default: + result.Error = errors.New("unexpected error") + } + // The only thing here, is if one close the channel. but its not the case + sc <- result + } + }() + + worksheet, err := getWorksheetFromSheet(rsheet, fi.worksheets, sheetXMLMap, rowLimit) + if err != nil { + result.Error = err + sc <- result + return err + } + sheet := new(Sheet) + sheet.File = fi + sheet.Rows, sheet.Cols, sheet.MaxCol, sheet.MaxRow = readRowsFromSheet(worksheet, fi, sheet, rowLimit) + sheet.Hidden = rsheet.State == sheetStateHidden || rsheet.State == sheetStateVeryHidden + sheet.SheetViews = readSheetViews(worksheet.SheetViews) + + sheet.SheetFormat.DefaultColWidth = worksheet.SheetFormatPr.DefaultColWidth + sheet.SheetFormat.DefaultRowHeight = worksheet.SheetFormatPr.DefaultRowHeight + sheet.SheetFormat.OutlineLevelCol = worksheet.SheetFormatPr.OutlineLevelCol + sheet.SheetFormat.OutlineLevelRow = worksheet.SheetFormatPr.OutlineLevelRow + + result.Sheet = sheet + sc <- result + return nil +} + +// readSheetsFromZipFile is an internal helper function that loops +// over the Worksheets defined in the XSLXWorkbook and loads them into +// Sheet objects stored in the Sheets slice of a xlsx.File struct. +func readSheetsFromZipFile(f *zip.File, file *File, sheetXMLMap map[string]string, rowLimit int) (map[string]*Sheet, []*Sheet, error) { + var workbook *xlsxWorkbook + var err error + var rc io.ReadCloser + var decoder *xml.Decoder + var sheetCount int + workbook = new(xlsxWorkbook) + rc, err = f.Open() + if err != nil { + return nil, nil, err + } + decoder = xml.NewDecoder(rc) + err = decoder.Decode(workbook) + if err != nil { + return nil, nil, err + } + file.Date1904 = workbook.WorkbookPr.Date1904 + + for entryNum := range workbook.DefinedNames.DefinedName { + file.DefinedNames = append(file.DefinedNames, &workbook.DefinedNames.DefinedName[entryNum]) + } + + // Only try and read sheets that have corresponding files. + // Notably this excludes chartsheets don't right now + var workbookSheets []xlsxSheet + for _, sheet := range workbook.Sheets.Sheet { + if f := worksheetFileForSheet(sheet, file.worksheets, sheetXMLMap); f != nil { + workbookSheets = append(workbookSheets, sheet) + } + } + sheetCount = len(workbookSheets) + sheetsByName := make(map[string]*Sheet, sheetCount) + sheets := make([]*Sheet, sheetCount) + sheetChan := make(chan *indexedSheet, sheetCount) + + go func() { + defer close(sheetChan) + err = nil + for i, rawsheet := range workbookSheets { + if err := readSheetFromFile(sheetChan, i, rawsheet, file, sheetXMLMap, rowLimit); err != nil { + return + } + } + }() + + for j := 0; j < sheetCount; j++ { + sheet := <-sheetChan + if sheet.Error != nil { + return nil, nil, sheet.Error + } + sheetName := workbookSheets[sheet.Index].Name + sheetsByName[sheetName] = sheet.Sheet + sheet.Sheet.Name = sheetName + sheets[sheet.Index] = sheet.Sheet + } + return sheetsByName, sheets, nil +} + +// readSharedStringsFromZipFile() is an internal helper function to +// extract a reference table from the sharedStrings.xml file within +// the XLSX zip file. +func readSharedStringsFromZipFile(f *zip.File) (*RefTable, error) { + var sst *xlsxSST + var error error + var rc io.ReadCloser + var decoder *xml.Decoder + var reftable *RefTable + + // In a file with no strings it's possible that + // sharedStrings.xml doesn't exist. In this case the value + // passed as f will be nil. + if f == nil { + return nil, nil + } + rc, error = f.Open() + if error != nil { + return nil, error + } + sst = new(xlsxSST) + decoder = xml.NewDecoder(rc) + error = decoder.Decode(sst) + if error != nil { + return nil, error + } + reftable = MakeSharedStringRefTable(sst) + return reftable, nil +} + +// readStylesFromZipFile() is an internal helper function to +// extract a style table from the style.xml file within +// the XLSX zip file. +func readStylesFromZipFile(f *zip.File, theme *theme) (*xlsxStyleSheet, error) { + var style *xlsxStyleSheet + var error error + var rc io.ReadCloser + var decoder *xml.Decoder + rc, error = f.Open() + if error != nil { + return nil, error + } + style = newXlsxStyleSheet(theme) + decoder = xml.NewDecoder(rc) + error = decoder.Decode(style) + if error != nil { + return nil, error + } + buildNumFmtRefTable(style) + return style, nil +} + +func buildNumFmtRefTable(style *xlsxStyleSheet) { + for _, numFmt := range style.NumFmts.NumFmt { + // We do this for the side effect of populating the NumFmtRefTable. + style.addNumFmt(numFmt) + } +} + +func readThemeFromZipFile(f *zip.File) (*theme, error) { + rc, err := f.Open() + if err != nil { + return nil, err + } + + var themeXml xlsxTheme + err = xml.NewDecoder(rc).Decode(&themeXml) + if err != nil { + return nil, err + } + + return newTheme(themeXml), nil +} + +type WorkBookRels map[string]string + +func (w *WorkBookRels) MakeXLSXWorkbookRels() xlsxWorkbookRels { + relCount := len(*w) + xWorkbookRels := xlsxWorkbookRels{} + xWorkbookRels.Relationships = make([]xlsxWorkbookRelation, relCount+3) + for k, v := range *w { + index, err := strconv.Atoi(k[3:]) + if err != nil { + panic(err.Error()) + } + xWorkbookRels.Relationships[index-1] = xlsxWorkbookRelation{ + Id: k, + Target: v, + Type: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet"} + } + + relCount++ + sheetId := fmt.Sprintf("rId%d", relCount) + xWorkbookRels.Relationships[relCount-1] = xlsxWorkbookRelation{ + Id: sheetId, + Target: "sharedStrings.xml", + Type: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings"} + + relCount++ + sheetId = fmt.Sprintf("rId%d", relCount) + xWorkbookRels.Relationships[relCount-1] = xlsxWorkbookRelation{ + Id: sheetId, + Target: "theme/theme1.xml", + Type: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme"} + + relCount++ + sheetId = fmt.Sprintf("rId%d", relCount) + xWorkbookRels.Relationships[relCount-1] = xlsxWorkbookRelation{ + Id: sheetId, + Target: "styles.xml", + Type: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles"} + + return xWorkbookRels +} + +// readWorkbookRelationsFromZipFile is an internal helper function to +// extract a map of relationship ID strings to the name of the +// worksheet.xml file they refer to. The resulting map can be used to +// reliably derefence the worksheets in the XLSX file. +func readWorkbookRelationsFromZipFile(workbookRels *zip.File) (WorkBookRels, error) { + var sheetXMLMap WorkBookRels + var wbRelationships *xlsxWorkbookRels + var rc io.ReadCloser + var decoder *xml.Decoder + var err error + + rc, err = workbookRels.Open() + if err != nil { + return nil, err + } + decoder = xml.NewDecoder(rc) + wbRelationships = new(xlsxWorkbookRels) + err = decoder.Decode(wbRelationships) + if err != nil { + return nil, err + } + sheetXMLMap = make(WorkBookRels) + for _, rel := range wbRelationships.Relationships { + if strings.HasSuffix(rel.Target, ".xml") && rel.Type == "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" { + _, filename := path.Split(rel.Target) + sheetXMLMap[rel.Id] = strings.Replace(filename, ".xml", "", 1) + } + } + return sheetXMLMap, nil +} + +// ReadZip() takes a pointer to a zip.ReadCloser and returns a +// xlsx.File struct populated with its contents. In most cases +// ReadZip is not used directly, but is called internally by OpenFile. +func ReadZip(f *zip.ReadCloser) (*File, error) { + return ReadZipWithRowLimit(f, NoRowLimit) +} + +// ReadZipWithRowLimit() takes a pointer to a zip.ReadCloser and returns a +// xlsx.File struct populated with its contents. In most cases +// ReadZip is not used directly, but is called internally by OpenFile. +func ReadZipWithRowLimit(f *zip.ReadCloser, rowLimit int) (*File, error) { + defer f.Close() + return ReadZipReaderWithRowLimit(&f.Reader, rowLimit) +} + +// ReadZipReader() can be used to read an XLSX in memory without +// touching the filesystem. +func ReadZipReader(r *zip.Reader) (*File, error) { + return ReadZipReaderWithRowLimit(r, NoRowLimit) +} + +// ReadZipReaderWithRowLimit() can be used to read an XLSX in memory without +// touching the filesystem. +// rowLimit is the number of rows that should be read from the file. If rowLimit is -1, no limit is applied. +// You can specify this with the constant NoRowLimit. +func ReadZipReaderWithRowLimit(r *zip.Reader, rowLimit int) (*File, error) { + var err error + var file *File + var reftable *RefTable + var sharedStrings *zip.File + var sheetXMLMap map[string]string + var sheetsByName map[string]*Sheet + var sheets []*Sheet + var style *xlsxStyleSheet + var styles *zip.File + var themeFile *zip.File + var v *zip.File + var workbook *zip.File + var workbookRels *zip.File + var worksheets map[string]*zip.File + + file = NewFile() + // file.numFmtRefTable = make(map[int]xlsxNumFmt, 1) + worksheets = make(map[string]*zip.File, len(r.File)) + for _, v = range r.File { + switch v.Name { + case "xl/sharedStrings.xml": + sharedStrings = v + case "xl/workbook.xml": + workbook = v + case "xl/_rels/workbook.xml.rels": + workbookRels = v + case "xl/styles.xml": + styles = v + case "xl/theme/theme1.xml": + themeFile = v + default: + if len(v.Name) > 17 { + if v.Name[0:13] == "xl/worksheets" { + worksheets[v.Name[14:len(v.Name)-4]] = v + } + } + } + } + if workbookRels == nil { + return nil, fmt.Errorf("xl/_rels/workbook.xml.rels not found in input xlsx.") + } + sheetXMLMap, err = readWorkbookRelationsFromZipFile(workbookRels) + if err != nil { + return nil, err + } + if len(worksheets) == 0 { + return nil, fmt.Errorf("Input xlsx contains no worksheets.") + } + file.worksheets = worksheets + reftable, err = readSharedStringsFromZipFile(sharedStrings) + if err != nil { + return nil, err + } + file.referenceTable = reftable + if themeFile != nil { + theme, err := readThemeFromZipFile(themeFile) + if err != nil { + return nil, err + } + + file.theme = theme + } + if styles != nil { + style, err = readStylesFromZipFile(styles, file.theme) + if err != nil { + return nil, err + } + + file.styles = style + } + sheetsByName, sheets, err = readSheetsFromZipFile(workbook, file, sheetXMLMap, rowLimit) + if err != nil { + return nil, err + } + if sheets == nil { + readerErr := new(XLSXReaderError) + readerErr.Err = "No sheets found in XLSX File" + return nil, readerErr + } + file.Sheet = sheetsByName + file.Sheets = sheets + return file, nil +} + +// truncateSheetXML will take in a reader to an XML sheet file and will return a reader that will read an equivalent +// XML sheet file with only the number of rows specified. This greatly speeds up XML unmarshalling when only +// a few rows need to be read from a large sheet. +// When sheets are truncated, all formatting present after the sheetData tag will be lost, but all of this formatting +// is related to printing and visibility, and is out of scope for most purposes of this library. +func truncateSheetXML(r io.Reader, rowLimit int) (io.Reader, error) { + var rowCount int + var token xml.Token + var readErr error + + output := new(bytes.Buffer) + r = io.TeeReader(r, output) + decoder := xml.NewDecoder(r) + + for { + token, readErr = decoder.Token() + if readErr == io.EOF { + break + } else if readErr != nil { + return nil, readErr + } + end, ok := token.(xml.EndElement) + if ok && end.Name.Local == "row" { + rowCount++ + if rowCount >= rowLimit { + break + } + } + } + + offset := decoder.InputOffset() + output.Truncate(int(offset)) + + if readErr != io.EOF { + _, err := output.Write([]byte(sheetEnding)) + if err != nil { + return nil, err + } + } + return output, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/read.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/read.go new file mode 100644 index 0000000000000000000000000000000000000000..3989c9bf6e95221bfa1d797eb8abf7cae7886adb --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/read.go @@ -0,0 +1,132 @@ +package xlsx + +import ( + "errors" + "reflect" + "strconv" + "time" +) + +var ( + errNilInterface = errors.New("nil pointer is not a valid argument") + errNotStructPointer = errors.New("argument must be a pointer to struct") + errInvalidTag = errors.New(`invalid tag: must have the format xlsx:idx`) +) + +//XLSXUnmarshaler is the interface implemented for types that can unmarshal a Row +//as a representation of themselves. +type XLSXUnmarshaler interface { + Unmarshal(*Row) error +} + +//ReadStruct reads a struct from r to ptr. Accepts a ptr +//to struct. This code expects a tag xlsx:"N", where N is the index +//of the cell to be used. Basic types like int,string,float64 and bool +//are supported +func (r *Row) ReadStruct(ptr interface{}) error { + if ptr == nil { + return errNilInterface + } + //check if the type implements XLSXUnmarshaler. If so, + //just let it do the work. + unmarshaller, ok := ptr.(XLSXUnmarshaler) + if ok { + return unmarshaller.Unmarshal(r) + } + v := reflect.ValueOf(ptr) + if v.Kind() != reflect.Ptr { + return errNotStructPointer + } + v = v.Elem() + if v.Kind() != reflect.Struct { + return errNotStructPointer + } + n := v.NumField() + for i := 0; i < n; i++ { + field := v.Type().Field(i) + idx := field.Tag.Get("xlsx") + //do a recursive check for the field if it is a struct or a pointer + //even if it doesn't have a tag + //ignore if it has a - or empty tag + isTime := false + switch { + case idx == "-": + continue + case field.Type.Kind() == reflect.Ptr || field.Type.Kind() == reflect.Struct: + var structPtr interface{} + if !v.Field(i).CanSet() { + continue + } + if field.Type.Kind() == reflect.Struct { + structPtr = v.Field(i).Addr().Interface() + } else { + structPtr = v.Field(i).Interface() + } + //check if the container is a time.Time + _, isTime = structPtr.(*time.Time) + if isTime { + break + } + err := r.ReadStruct(structPtr) + if err != nil { + return err + } + continue + case len(idx) == 0: + continue + } + pos, err := strconv.Atoi(idx) + if err != nil { + return errInvalidTag + } + + //check if desired position is not out of bounds + if pos > len(r.Cells)-1 { + continue + } + cell := r.Cells[pos] + fieldV := v.Field(i) + //continue if the field is not settable + if !fieldV.CanSet() { + continue + } + if isTime { + t, err := cell.GetTime(false) + if err != nil { + return err + } + if field.Type.Kind() == reflect.Ptr { + fieldV.Set(reflect.ValueOf(&t)) + } else { + fieldV.Set(reflect.ValueOf(t)) + } + continue + } + switch field.Type.Kind() { + case reflect.String: + value, err := cell.FormattedValue() + if err != nil { + return err + } + fieldV.SetString(value) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + value, err := cell.Int64() + if err != nil { + return err + } + fieldV.SetInt(value) + case reflect.Float64: + value, err := cell.Float() + if err != nil { + return err + } + fieldV.SetFloat(value) + case reflect.Bool: + value := cell.Bool() + fieldV.SetBool(value) + } + } + value := v.Interface() + ptr = &value + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/reftable.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/reftable.go new file mode 100644 index 0000000000000000000000000000000000000000..8739dc71563c94304581acc9e71e18eb04099297 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/reftable.go @@ -0,0 +1,77 @@ +package xlsx + +type RefTable struct { + indexedStrings []string + knownStrings map[string]int + isWrite bool +} + +// NewSharedStringRefTable() creates a new, empty RefTable. +func NewSharedStringRefTable() *RefTable { + rt := RefTable{} + rt.knownStrings = make(map[string]int) + return &rt +} + +// MakeSharedStringRefTable() takes an xlsxSST struct and converts +// it's contents to an slice of strings used to refer to string values +// by numeric index - this is the model used within XLSX worksheet (a +// numeric reference is stored to a shared cell value). +func MakeSharedStringRefTable(source *xlsxSST) *RefTable { + reftable := NewSharedStringRefTable() + reftable.isWrite = false + for _, si := range source.SI { + if len(si.R) > 0 { + newString := "" + for j := 0; j < len(si.R); j++ { + newString = newString + si.R[j].T + } + reftable.AddString(newString) + } else { + reftable.AddString(si.T) + } + } + return reftable +} + +// makeXlsxSST() takes a RefTable and returns and +// equivalent xlsxSST representation. +func (rt *RefTable) makeXLSXSST() xlsxSST { + sst := xlsxSST{} + sst.Count = len(rt.indexedStrings) + sst.UniqueCount = sst.Count + for _, ref := range rt.indexedStrings { + si := xlsxSI{} + si.T = ref + sst.SI = append(sst.SI, si) + } + return sst +} + +// Resolvesharedstring() looks up a string value by numeric index from +// a provided reference table (just a slice of strings in the correct +// order). This function only exists to provide clarity or purpose +// via it's name. +func (rt *RefTable) ResolveSharedString(index int) string { + return rt.indexedStrings[index] +} + +// AddString adds a string to the reference table and return it's +// numeric index. If the string already exists then it simply returns +// the existing index. +func (rt *RefTable) AddString(str string) int { + if rt.isWrite { + index, ok := rt.knownStrings[str] + if ok { + return index + } + } + rt.indexedStrings = append(rt.indexedStrings, str) + index := len(rt.indexedStrings) - 1 + rt.knownStrings[str] = index + return index +} + +func (rt *RefTable) Length() int { + return len(rt.indexedStrings) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/row.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/row.go new file mode 100644 index 0000000000000000000000000000000000000000..0d9dd882b3dfa0ed924004db0db135ea3d5d98eb --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/row.go @@ -0,0 +1,27 @@ +package xlsx + +type Row struct { + Cells []*Cell + Hidden bool + Sheet *Sheet + Height float64 + OutlineLevel uint8 + isCustom bool +} + +func (r *Row) SetHeight(ht float64) { + r.Height = ht + r.isCustom = true +} + +func (r *Row) SetHeightCM(ht float64) { + r.Height = ht * 28.3464567 // Convert CM to postscript points + r.isCustom = true +} + +func (r *Row) AddCell() *Cell { + cell := NewCell(r) + r.Cells = append(r.Cells, cell) + r.Sheet.maybeAddCol(len(r.Cells)) + return cell +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/sheet.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/sheet.go new file mode 100644 index 0000000000000000000000000000000000000000..1aa96b61c99d1e455b6b2599dfca3283b319e253 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/sheet.go @@ -0,0 +1,431 @@ +package xlsx + +import ( + "errors" + "fmt" + "strconv" +) + +// Sheet is a high level structure intended to provide user access to +// the contents of a particular sheet within an XLSX file. +type Sheet struct { + Name string + File *File + Rows []*Row + Cols []*Col + MaxRow int + MaxCol int + Hidden bool + Selected bool + SheetViews []SheetView + SheetFormat SheetFormat + AutoFilter *AutoFilter +} + +type SheetView struct { + Pane *Pane +} + +type Pane struct { + XSplit float64 + YSplit float64 + TopLeftCell string + ActivePane string + State string // Either "split" or "frozen" +} + +type SheetFormat struct { + DefaultColWidth float64 + DefaultRowHeight float64 + OutlineLevelCol uint8 + OutlineLevelRow uint8 +} + +type AutoFilter struct { + TopLeftCell string + BottomRightCell string +} + +// Add a new Row to a Sheet +func (s *Sheet) AddRow() *Row { + row := &Row{Sheet: s} + s.Rows = append(s.Rows, row) + if len(s.Rows) > s.MaxRow { + s.MaxRow = len(s.Rows) + } + return row +} + +// Make sure we always have as many Rows as we do cells. +func (s *Sheet) maybeAddRow(rowCount int) { + if rowCount > s.MaxRow { + loopCnt := rowCount - s.MaxRow + for i := 0; i < loopCnt; i++ { + + row := &Row{Sheet: s} + s.Rows = append(s.Rows, row) + } + s.MaxRow = rowCount + } +} + +// Make sure we always have as many Rows as we do cells. +func (s *Sheet) Row(idx int) *Row { + s.maybeAddRow(idx + 1) + return s.Rows[idx] +} + +// Make sure we always have as many Cols as we do cells. +func (s *Sheet) maybeAddCol(cellCount int) { + if cellCount > s.MaxCol { + loopCnt := cellCount - s.MaxCol + currIndex := s.MaxCol + 1 + for i := 0; i < loopCnt; i++ { + + col := &Col{ + style: NewStyle(), + Min: currIndex, + Max: currIndex, + Hidden: false, + Collapsed: false} + s.Cols = append(s.Cols, col) + currIndex++ + } + + s.MaxCol = cellCount + } +} + +// Make sure we always have as many Cols as we do cells. +func (s *Sheet) Col(idx int) *Col { + s.maybeAddCol(idx + 1) + return s.Cols[idx] +} + +// Get a Cell by passing it's cartesian coordinates (zero based) as +// row and column integer indexes. +// +// For example: +// +// cell := sheet.Cell(0,0) +// +// ... would set the variable "cell" to contain a Cell struct +// containing the data from the field "A1" on the spreadsheet. +func (sh *Sheet) Cell(row, col int) *Cell { + + // If the user requests a row beyond what we have, then extend. + for len(sh.Rows) <= row { + sh.AddRow() + } + + r := sh.Rows[row] + for len(r.Cells) <= col { + r.AddCell() + } + + return r.Cells[col] +} + +//Set the width of a single column or multiple columns. +func (s *Sheet) SetColWidth(startcol, endcol int, width float64) error { + if startcol > endcol { + return fmt.Errorf("Could not set width for range %d-%d: startcol must be less than endcol.", startcol, endcol) + } + end := endcol + 1 + s.maybeAddCol(end) + for ; startcol < end; startcol++ { + s.Cols[startcol].Width = width + } + + return nil +} + +// When merging cells, the cell may be the 'original' or the 'covered'. +// First, figure out which cells are merge starting points. Then create +// the necessary cells underlying the merge area. +// Then go through all the underlying cells and apply the appropriate +// border, based on the original cell. +func (s *Sheet) handleMerged() { + merged := make(map[string]*Cell) + + for r, row := range s.Rows { + for c, cell := range row.Cells { + if cell.HMerge > 0 || cell.VMerge > 0 { + coord := GetCellIDStringFromCoords(c, r) + merged[coord] = cell + } + } + } + + // This loop iterates over all cells that should be merged and applies the correct + // borders to them depending on their position. If any cells required by the merge + // are missing, they will be allocated by s.Cell(). + for key, cell := range merged { + mainstyle := cell.GetStyle() + + top := mainstyle.Border.Top + left := mainstyle.Border.Left + right := mainstyle.Border.Right + bottom := mainstyle.Border.Bottom + + // When merging cells, the upper left cell does not maintain + // the original borders + mainstyle.Border.Top = "none" + mainstyle.Border.Left = "none" + mainstyle.Border.Right = "none" + mainstyle.Border.Bottom = "none" + + maincol, mainrow, _ := GetCoordsFromCellIDString(key) + for rownum := 0; rownum <= cell.VMerge; rownum++ { + for colnum := 0; colnum <= cell.HMerge; colnum++ { + tmpcell := s.Cell(mainrow+rownum, maincol+colnum) + style := tmpcell.GetStyle() + style.ApplyBorder = true + + if rownum == 0 { + style.Border.Top = top + } + + if rownum == (cell.VMerge) { + style.Border.Bottom = bottom + } + + if colnum == 0 { + style.Border.Left = left + } + + if colnum == (cell.HMerge) { + style.Border.Right = right + } + } + } + } +} + +// Dump sheet to its XML representation, intended for internal use only +func (s *Sheet) makeXLSXSheet(refTable *RefTable, styles *xlsxStyleSheet) *xlsxWorksheet { + worksheet := newXlsxWorksheet() + xSheet := xlsxSheetData{} + maxRow := 0 + maxCell := 0 + var maxLevelCol, maxLevelRow uint8 + + // Scan through the sheet and see if there are any merged cells. If there + // are, we may need to extend the size of the sheet. There needs to be + // phantom cells underlying the area covered by the merged cell + s.handleMerged() + + for index, sheetView := range s.SheetViews { + if sheetView.Pane != nil { + worksheet.SheetViews.SheetView[index].Pane = &xlsxPane{ + XSplit: sheetView.Pane.XSplit, + YSplit: sheetView.Pane.YSplit, + TopLeftCell: sheetView.Pane.TopLeftCell, + ActivePane: sheetView.Pane.ActivePane, + State: sheetView.Pane.State, + } + + } + } + + if s.Selected { + worksheet.SheetViews.SheetView[0].TabSelected = true + } + + if s.SheetFormat.DefaultRowHeight != 0 { + worksheet.SheetFormatPr.DefaultRowHeight = s.SheetFormat.DefaultRowHeight + } + worksheet.SheetFormatPr.DefaultColWidth = s.SheetFormat.DefaultColWidth + + colsXfIdList := make([]int, len(s.Cols)) + worksheet.Cols = &xlsxCols{Col: []xlsxCol{}} + for c, col := range s.Cols { + XfId := 0 + if col.Min == 0 { + col.Min = 1 + } + if col.Max == 0 { + col.Max = 1 + } + style := col.GetStyle() + //col's style always not nil + if style != nil { + xNumFmt := styles.newNumFmt(col.numFmt) + XfId = handleStyleForXLSX(style, xNumFmt.NumFmtId, styles) + } + colsXfIdList[c] = XfId + + var customWidth bool + if col.Width == 0 { + col.Width = ColWidth + customWidth = false + + } else { + customWidth = true + } + worksheet.Cols.Col = append(worksheet.Cols.Col, + xlsxCol{Min: col.Min, + Max: col.Max, + Hidden: col.Hidden, + Width: col.Width, + CustomWidth: customWidth, + Collapsed: col.Collapsed, + OutlineLevel: col.OutlineLevel, + Style: XfId, + }) + + if col.OutlineLevel > maxLevelCol { + maxLevelCol = col.OutlineLevel + } + } + + for r, row := range s.Rows { + if r > maxRow { + maxRow = r + } + xRow := xlsxRow{} + xRow.R = r + 1 + if row.isCustom { + xRow.CustomHeight = true + xRow.Ht = fmt.Sprintf("%g", row.Height) + } + xRow.OutlineLevel = row.OutlineLevel + if row.OutlineLevel > maxLevelRow { + maxLevelRow = row.OutlineLevel + } + for c, cell := range row.Cells { + XfId := colsXfIdList[c] + + // generate NumFmtId and add new NumFmt + xNumFmt := styles.newNumFmt(cell.NumFmt) + + style := cell.style + if style != nil { + XfId = handleStyleForXLSX(style, xNumFmt.NumFmtId, styles) + } else if len(cell.NumFmt) > 0 && !compareFormatString(s.Cols[c].numFmt, cell.NumFmt) { + XfId = handleNumFmtIdForXLSX(xNumFmt.NumFmtId, styles) + } + + if c > maxCell { + maxCell = c + } + xC := xlsxC{ + S: XfId, + R: GetCellIDStringFromCoords(c, r), + } + if cell.formula != "" { + xC.F = &xlsxF{Content: cell.formula} + } + switch cell.cellType { + case CellTypeInline: + // Inline strings are turned into shared strings since they are more efficient. + // This is what Excel does as well. + fallthrough + case CellTypeString: + if len(cell.Value) > 0 { + xC.V = strconv.Itoa(refTable.AddString(cell.Value)) + } + xC.T = "s" + case CellTypeNumeric: + // Numeric is the default, so the type can be left blank + xC.V = cell.Value + case CellTypeBool: + xC.V = cell.Value + xC.T = "b" + case CellTypeError: + xC.V = cell.Value + xC.T = "e" + case CellTypeDate: + xC.V = cell.Value + xC.T = "d" + case CellTypeStringFormula: + xC.V = cell.Value + xC.T = "str" + default: + panic(errors.New("unknown cell type cannot be marshaled")) + } + + xRow.C = append(xRow.C, xC) + + if cell.HMerge > 0 || cell.VMerge > 0 { + // r == rownum, c == colnum + mc := xlsxMergeCell{} + start := GetCellIDStringFromCoords(c, r) + endCol := c + cell.HMerge + endRow := r + cell.VMerge + end := GetCellIDStringFromCoords(endCol, endRow) + mc.Ref = start + ":" + end + if worksheet.MergeCells == nil { + worksheet.MergeCells = &xlsxMergeCells{} + } + worksheet.MergeCells.Cells = append(worksheet.MergeCells.Cells, mc) + } + } + xSheet.Row = append(xSheet.Row, xRow) + } + + // Update sheet format with the freshly determined max levels + s.SheetFormat.OutlineLevelCol = maxLevelCol + s.SheetFormat.OutlineLevelRow = maxLevelRow + // .. and then also apply this to the xml worksheet + worksheet.SheetFormatPr.OutlineLevelCol = s.SheetFormat.OutlineLevelCol + worksheet.SheetFormatPr.OutlineLevelRow = s.SheetFormat.OutlineLevelRow + + if worksheet.MergeCells != nil { + worksheet.MergeCells.Count = len(worksheet.MergeCells.Cells) + } + + if s.AutoFilter != nil { + worksheet.AutoFilter = &xlsxAutoFilter{Ref: fmt.Sprintf("%v:%v", s.AutoFilter.TopLeftCell, s.AutoFilter.BottomRightCell)} + } + + worksheet.SheetData = xSheet + dimension := xlsxDimension{} + dimension.Ref = "A1:" + GetCellIDStringFromCoords(maxCell, maxRow) + if dimension.Ref == "A1:A1" { + dimension.Ref = "A1" + } + worksheet.Dimension = dimension + return worksheet +} + +func handleStyleForXLSX(style *Style, NumFmtId int, styles *xlsxStyleSheet) (XfId int) { + xFont, xFill, xBorder, xCellXf := style.makeXLSXStyleElements() + fontId := styles.addFont(xFont) + fillId := styles.addFill(xFill) + + // HACK - adding light grey fill, as in OO and Google + greyfill := xlsxFill{} + greyfill.PatternFill.PatternType = "lightGray" + styles.addFill(greyfill) + + borderId := styles.addBorder(xBorder) + xCellXf.FontId = fontId + xCellXf.FillId = fillId + xCellXf.BorderId = borderId + xCellXf.NumFmtId = NumFmtId + // apply the numFmtId when it is not the default cellxf + if xCellXf.NumFmtId > 0 { + xCellXf.ApplyNumberFormat = true + } + + xCellXf.Alignment.Horizontal = style.Alignment.Horizontal + xCellXf.Alignment.Indent = style.Alignment.Indent + xCellXf.Alignment.ShrinkToFit = style.Alignment.ShrinkToFit + xCellXf.Alignment.TextRotation = style.Alignment.TextRotation + xCellXf.Alignment.Vertical = style.Alignment.Vertical + xCellXf.Alignment.WrapText = style.Alignment.WrapText + + XfId = styles.addCellXf(xCellXf) + return +} + +func handleNumFmtIdForXLSX(NumFmtId int, styles *xlsxStyleSheet) (XfId int) { + xCellXf := makeXLSXCellElement() + xCellXf.NumFmtId = NumFmtId + if xCellXf.NumFmtId > 0 { + xCellXf.ApplyNumberFormat = true + } + XfId = styles.addCellXf(xCellXf) + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/stream_file.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/stream_file.go new file mode 100644 index 0000000000000000000000000000000000000000..3b5c7bd00695fccdbacf1a143288186491adbb00 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/stream_file.go @@ -0,0 +1,217 @@ +package xlsx + +import ( + "archive/zip" + "encoding/xml" + "errors" + "io" + "strconv" +) + +type StreamFile struct { + xlsxFile *File + sheetXmlPrefix []string + sheetXmlSuffix []string + zipWriter *zip.Writer + currentSheet *streamSheet + styleIds [][]int + err error +} + +type streamSheet struct { + // sheetIndex is the XLSX sheet index, which starts at 1 + index int + // The number of rows that have been written to the sheet so far + rowCount int + // The number of columns in the sheet + columnCount int + // The writer to write to this sheet's file in the XLSX Zip file + writer io.Writer + styleIds []int +} + +var ( + NoCurrentSheetError = errors.New("no Current Sheet") + WrongNumberOfRowsError = errors.New("invalid number of cells passed to Write. All calls to Write on the same sheet must have the same number of cells") + AlreadyOnLastSheetError = errors.New("NextSheet() called, but already on last sheet") +) + +// Write will write a row of cells to the current sheet. Every call to Write on the same sheet must contain the +// same number of cells as the header provided when the sheet was created or an error will be returned. This function +// will always trigger a flush on success. Currently the only supported data type is string data. +func (sf *StreamFile) Write(cells []string) error { + if sf.err != nil { + return sf.err + } + err := sf.write(cells) + if err != nil { + sf.err = err + return err + } + return sf.zipWriter.Flush() +} + +func (sf *StreamFile) WriteAll(records [][]string) error { + if sf.err != nil { + return sf.err + } + for _, row := range records { + err := sf.write(row) + if err != nil { + sf.err = err + return err + } + } + return sf.zipWriter.Flush() +} + +func (sf *StreamFile) write(cells []string) error { + if sf.currentSheet == nil { + return NoCurrentSheetError + } + if len(cells) != sf.currentSheet.columnCount { + return WrongNumberOfRowsError + } + sf.currentSheet.rowCount++ + if err := sf.currentSheet.write(`<row r="` + strconv.Itoa(sf.currentSheet.rowCount) + `">`); err != nil { + return err + } + for colIndex, cellData := range cells { + // documentation for the c.t (cell.Type) attribute: + // b (Boolean): Cell containing a boolean. + // d (Date): Cell contains a date in the ISO 8601 format. + // e (Error): Cell containing an error. + // inlineStr (Inline String): Cell containing an (inline) rich string, i.e., one not in the shared string table. + // If this cell type is used, then the cell value is in the is element rather than the v element in the cell (c element). + // n (Number): Cell containing a number. + // s (Shared String): Cell containing a shared string. + // str (String): Cell containing a formula string. + cellCoordinate := GetCellIDStringFromCoords(colIndex, sf.currentSheet.rowCount-1) + cellType := "inlineStr" + cellOpen := `<c r="` + cellCoordinate + `" t="` + cellType + `"` + // Add in the style id if the cell isn't using the default style + if colIndex < len(sf.currentSheet.styleIds) && sf.currentSheet.styleIds[colIndex] != 0 { + cellOpen += ` s="` + strconv.Itoa(sf.currentSheet.styleIds[colIndex]) + `"` + } + cellOpen += `><is><t>` + cellClose := `</t></is></c>` + + if err := sf.currentSheet.write(cellOpen); err != nil { + return err + } + if err := xml.EscapeText(sf.currentSheet.writer, []byte(cellData)); err != nil { + return err + } + if err := sf.currentSheet.write(cellClose); err != nil { + return err + } + } + if err := sf.currentSheet.write(`</row>`); err != nil { + return err + } + return sf.zipWriter.Flush() +} + +// Error reports any error that has occurred during a previous Write or Flush. +func (sf *StreamFile) Error() error { + return sf.err +} + +func (sf *StreamFile) Flush() { + if sf.err != nil { + sf.err = sf.zipWriter.Flush() + } +} + +// NextSheet will switch to the next sheet. Sheets are selected in the same order they were added. +// Once you leave a sheet, you cannot return to it. +func (sf *StreamFile) NextSheet() error { + if sf.err != nil { + return sf.err + } + var sheetIndex int + if sf.currentSheet != nil { + if sf.currentSheet.index >= len(sf.xlsxFile.Sheets) { + sf.err = AlreadyOnLastSheetError + return AlreadyOnLastSheetError + } + if err := sf.writeSheetEnd(); err != nil { + sf.currentSheet = nil + sf.err = err + return err + } + sheetIndex = sf.currentSheet.index + } + sheetIndex++ + sf.currentSheet = &streamSheet{ + index: sheetIndex, + columnCount: len(sf.xlsxFile.Sheets[sheetIndex-1].Cols), + styleIds: sf.styleIds[sheetIndex-1], + rowCount: 1, + } + sheetPath := sheetFilePathPrefix + strconv.Itoa(sf.currentSheet.index) + sheetFilePathSuffix + fileWriter, err := sf.zipWriter.Create(sheetPath) + if err != nil { + sf.err = err + return err + } + sf.currentSheet.writer = fileWriter + + if err := sf.writeSheetStart(); err != nil { + sf.err = err + return err + } + return nil +} + +// Close closes the Stream File. +// Any sheets that have not yet been written to will have an empty sheet created for them. +func (sf *StreamFile) Close() error { + if sf.err != nil { + return sf.err + } + // If there are sheets that have not been written yet, call NextSheet() which will add files to the zip for them. + // XLSX readers may error if the sheets registered in the metadata are not present in the file. + if sf.currentSheet != nil { + for sf.currentSheet.index < len(sf.xlsxFile.Sheets) { + if err := sf.NextSheet(); err != nil { + sf.err = err + return err + } + } + // Write the end of the last sheet. + if err := sf.writeSheetEnd(); err != nil { + sf.err = err + return err + } + } + err := sf.zipWriter.Close() + if err != nil { + sf.err = err + } + return err +} + +// writeSheetStart will write the start of the Sheet's XML +func (sf *StreamFile) writeSheetStart() error { + if sf.currentSheet == nil { + return NoCurrentSheetError + } + return sf.currentSheet.write(sf.sheetXmlPrefix[sf.currentSheet.index-1]) +} + +// writeSheetEnd will write the end of the Sheet's XML +func (sf *StreamFile) writeSheetEnd() error { + if sf.currentSheet == nil { + return NoCurrentSheetError + } + if err := sf.currentSheet.write(endSheetDataTag); err != nil { + return err + } + return sf.currentSheet.write(sf.sheetXmlSuffix[sf.currentSheet.index-1]) +} + +func (ss *streamSheet) write(data string) error { + _, err := ss.writer.Write([]byte(data)) + return err +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/stream_file_builder.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/stream_file_builder.go new file mode 100644 index 0000000000000000000000000000000000000000..9547ad5e9b3981c49975d6e0a4b2db22f26979d1 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/stream_file_builder.go @@ -0,0 +1,245 @@ +// Authors: Ryan Hollis (ryanh@) + +// The purpose of StreamFileBuilder and StreamFile is to allow streamed writing of XLSX files. +// Directions: +// 1. Create a StreamFileBuilder with NewStreamFileBuilder() or NewStreamFileBuilderForPath(). +// 2. Add the sheets and their first row of data by calling AddSheet(). +// 3. Call Build() to get a StreamFile. Once built, all functions on the builder will return an error. +// 4. Write to the StreamFile with Write(). Writes begin on the first sheet. New rows are always written and flushed +// to the io. All rows written to the same sheet must have the same number of cells as the header provided when the sheet +// was created or an error will be returned. +// 5. Call NextSheet() to proceed to the next sheet. Once NextSheet() is called, the previous sheet can not be edited. +// 6. Call Close() to finish. + +// Future work suggestions: +// Currently the only supported cell type is string, since the main reason this library was written was to prevent +// strings from being interpreted as numbers. It would be nice to have support for numbers and money so that the exported +// files could better take advantage of XLSX's features. +// All text is written with the same text style. Support for additional text styles could be added to highlight certain +// data in the file. +// The current default style uses fonts that are not on Macs by default so opening the XLSX files in Numbers causes a +// pop up that says there are missing fonts. The font could be changed to something that is usually found on Mac and PC. + +package xlsx + +import ( + "archive/zip" + "errors" + "fmt" + "io" + "os" + "strconv" + "strings" +) + +type StreamFileBuilder struct { + built bool + xlsxFile *File + zipWriter *zip.Writer + cellTypeToStyleIds map[CellType]int + maxStyleId int + styleIds [][]int +} + +const ( + sheetFilePathPrefix = "xl/worksheets/sheet" + sheetFilePathSuffix = ".xml" + endSheetDataTag = "</sheetData>" + dimensionTag = `<dimension ref="%s"></dimension>` + // This is the index of the max style that this library will insert into XLSX sheets by default. + // This allows us to predict what the style id of styles that we add will be. + // TestXlsxStyleBehavior tests that this behavior continues to be what we expect. + initMaxStyleId = 1 +) + +var BuiltStreamFileBuilderError = errors.New("StreamFileBuilder has already been built, functions may no longer be used") + +// NewStreamFileBuilder creates an StreamFileBuilder that will write to the the provided io.writer +func NewStreamFileBuilder(writer io.Writer) *StreamFileBuilder { + return &StreamFileBuilder{ + zipWriter: zip.NewWriter(writer), + xlsxFile: NewFile(), + cellTypeToStyleIds: make(map[CellType]int), + maxStyleId: initMaxStyleId, + } +} + +// NewStreamFileBuilderForPath takes the name of an XLSX file and returns a builder for it. +// The file will be created if it does not exist, or truncated if it does. +func NewStreamFileBuilderForPath(path string) (*StreamFileBuilder, error) { + file, err := os.Create(path) + if err != nil { + return nil, err + } + return NewStreamFileBuilder(file), nil +} + +// AddSheet will add sheets with the given name with the provided headers. The headers cannot be edited later, and all +// rows written to the sheet must contain the same number of cells as the header. Sheet names must be unique, or an +// error will be thrown. +func (sb *StreamFileBuilder) AddSheet(name string, headers []string, cellTypes []*CellType) error { + if sb.built { + return BuiltStreamFileBuilderError + } + if len(cellTypes) > len(headers) { + return errors.New("cellTypes is longer than headers") + } + sheet, err := sb.xlsxFile.AddSheet(name) + if err != nil { + // Set built on error so that all subsequent calls to the builder will also fail. + sb.built = true + return err + } + sb.styleIds = append(sb.styleIds, []int{}) + row := sheet.AddRow() + if count := row.WriteSlice(&headers, -1); count != len(headers) { + // Set built on error so that all subsequent calls to the builder will also fail. + sb.built = true + return errors.New("failed to write headers") + } + for i, cellType := range cellTypes { + var cellStyleIndex int + var ok bool + if cellType != nil { + // The cell type is one of the attributes of a Style. + // Since it is the only attribute of Style that we use, we can assume that cell types + // map one to one with Styles and their Style ID. + // If a new cell type is used, a new style gets created with an increased id, if an existing cell type is + // used, the pre-existing style will also be used. + cellStyleIndex, ok = sb.cellTypeToStyleIds[*cellType] + if !ok { + sb.maxStyleId++ + cellStyleIndex = sb.maxStyleId + sb.cellTypeToStyleIds[*cellType] = sb.maxStyleId + } + sheet.Cols[i].SetType(*cellType) + } + sb.styleIds[len(sb.styleIds)-1] = append(sb.styleIds[len(sb.styleIds)-1], cellStyleIndex) + } + return nil +} + +// Build begins streaming the XLSX file to the io, by writing all the XLSX metadata. It creates a StreamFile struct +// that can be used to write the rows to the sheets. +func (sb *StreamFileBuilder) Build() (*StreamFile, error) { + if sb.built { + return nil, BuiltStreamFileBuilderError + } + sb.built = true + parts, err := sb.xlsxFile.MarshallParts() + if err != nil { + return nil, err + } + es := &StreamFile{ + zipWriter: sb.zipWriter, + xlsxFile: sb.xlsxFile, + sheetXmlPrefix: make([]string, len(sb.xlsxFile.Sheets)), + sheetXmlSuffix: make([]string, len(sb.xlsxFile.Sheets)), + styleIds: sb.styleIds, + } + for path, data := range parts { + // If the part is a sheet, don't write it yet. We only want to write the XLSX metadata files, since at this + // point the sheets are still empty. The sheet files will be written later as their rows come in. + if strings.HasPrefix(path, sheetFilePathPrefix) { + if err := sb.processEmptySheetXML(es, path, data); err != nil { + return nil, err + } + continue + } + metadataFile, err := sb.zipWriter.Create(path) + if err != nil { + return nil, err + } + _, err = metadataFile.Write([]byte(data)) + if err != nil { + return nil, err + } + } + + if err := es.NextSheet(); err != nil { + return nil, err + } + return es, nil +} + +// processEmptySheetXML will take in the path and XML data of an empty sheet, and will save the beginning and end of the +// XML file so that these can be written at the right time. +func (sb *StreamFileBuilder) processEmptySheetXML(sf *StreamFile, path, data string) error { + // Get the sheet index from the path + sheetIndex, err := getSheetIndex(sf, path) + if err != nil { + return err + } + + // Remove the Dimension tag. Since more rows are going to be written to the sheet, it will be wrong. + // It is valid to for a sheet to be missing a Dimension tag, but it is not valid for it to be wrong. + data, err = removeDimensionTag(data, sf.xlsxFile.Sheets[sheetIndex]) + if err != nil { + return err + } + + // Split the sheet at the end of its SheetData tag so that more rows can be added inside. + prefix, suffix, err := splitSheetIntoPrefixAndSuffix(data) + if err != nil { + return err + } + sf.sheetXmlPrefix[sheetIndex] = prefix + sf.sheetXmlSuffix[sheetIndex] = suffix + return nil +} + +// getSheetIndex parses the path to the XLSX sheet data and returns the index +// The files that store the data for each sheet must have the format: +// xl/worksheets/sheet123.xml +// where 123 is the index of the sheet. This file path format is part of the XLSX file standard. +func getSheetIndex(sf *StreamFile, path string) (int, error) { + indexString := path[len(sheetFilePathPrefix) : len(path)-len(sheetFilePathSuffix)] + sheetXLSXIndex, err := strconv.Atoi(indexString) + if err != nil { + return -1, errors.New("Unexpected sheet file name from xlsx package") + } + if sheetXLSXIndex < 1 || len(sf.sheetXmlPrefix) < sheetXLSXIndex || + len(sf.sheetXmlSuffix) < sheetXLSXIndex || len(sf.xlsxFile.Sheets) < sheetXLSXIndex { + return -1, errors.New("Unexpected sheet index") + } + sheetArrayIndex := sheetXLSXIndex - 1 + return sheetArrayIndex, nil +} + +// removeDimensionTag will return the passed in XLSX Spreadsheet XML with the dimension tag removed. +// data is the XML data for the sheet +// sheet is the Sheet struct that the XML was created from. +// Can return an error if the XML's dimension tag does not match was is expected based on the provided Sheet +func removeDimensionTag(data string, sheet *Sheet) (string, error) { + x := len(sheet.Cols) - 1 + y := len(sheet.Rows) - 1 + if x < 0 { + x = 0 + } + if y < 0 { + y = 0 + } + var dimensionRef string + if x == 0 && y == 0 { + dimensionRef = "A1" + } else { + endCoordinate := GetCellIDStringFromCoords(x, y) + dimensionRef = "A1:" + endCoordinate + } + dataParts := strings.Split(data, fmt.Sprintf(dimensionTag, dimensionRef)) + if len(dataParts) != 2 { + return "", errors.New("unexpected Sheet XML: dimension tag not found") + } + return dataParts[0] + dataParts[1], nil +} + +// splitSheetIntoPrefixAndSuffix will split the provided XML sheet into a prefix and a suffix so that +// more spreadsheet rows can be inserted in between. +func splitSheetIntoPrefixAndSuffix(data string) (string, string, error) { + // Split the sheet at the end of its SheetData tag so that more rows can be added inside. + sheetParts := strings.Split(data, endSheetDataTag) + if len(sheetParts) != 2 { + return "", "", errors.New("unexpected Sheet XML: SheetData close tag not found") + } + return sheetParts[0], sheetParts[1], nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/style.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/style.go new file mode 100644 index 0000000000000000000000000000000000000000..b354e1090dbe528cffbfd9b7cffe7e8ed5ad0217 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/style.go @@ -0,0 +1,180 @@ +package xlsx + +import "strconv" + +// Style is a high level structure intended to provide user access to +// the contents of Style within an XLSX file. +type Style struct { + Border Border + Fill Fill + Font Font + ApplyBorder bool + ApplyFill bool + ApplyFont bool + ApplyAlignment bool + Alignment Alignment + NamedStyleIndex *int +} + +// Return a new Style structure initialised with the default values. +func NewStyle() *Style { + return &Style{ + Alignment: *DefaultAlignment(), + Border: *DefaultBorder(), + Fill: *DefaultFill(), + Font: *DefaultFont(), + } +} + +// Generate the underlying XLSX style elements that correspond to the Style. +func (style *Style) makeXLSXStyleElements() (xFont xlsxFont, xFill xlsxFill, xBorder xlsxBorder, xCellXf xlsxXf) { + xFont = xlsxFont{} + xFill = xlsxFill{} + xBorder = xlsxBorder{} + xCellXf = xlsxXf{} + xFont.Sz.Val = strconv.Itoa(style.Font.Size) + xFont.Name.Val = style.Font.Name + xFont.Family.Val = strconv.Itoa(style.Font.Family) + xFont.Charset.Val = strconv.Itoa(style.Font.Charset) + xFont.Color.RGB = style.Font.Color + if style.Font.Bold { + xFont.B = &xlsxVal{} + } else { + xFont.B = nil + } + if style.Font.Italic { + xFont.I = &xlsxVal{} + } else { + xFont.I = nil + } + if style.Font.Underline { + xFont.U = &xlsxVal{} + } else { + xFont.U = nil + } + xPatternFill := xlsxPatternFill{} + xPatternFill.PatternType = style.Fill.PatternType + xPatternFill.FgColor.RGB = style.Fill.FgColor + xPatternFill.BgColor.RGB = style.Fill.BgColor + xFill.PatternFill = xPatternFill + xBorder.Left = xlsxLine{ + Style: style.Border.Left, + Color: xlsxColor{RGB: style.Border.LeftColor}, + } + xBorder.Right = xlsxLine{ + Style: style.Border.Right, + Color: xlsxColor{RGB: style.Border.RightColor}, + } + xBorder.Top = xlsxLine{ + Style: style.Border.Top, + Color: xlsxColor{RGB: style.Border.TopColor}, + } + xBorder.Bottom = xlsxLine{ + Style: style.Border.Bottom, + Color: xlsxColor{RGB: style.Border.BottomColor}, + } + xCellXf = makeXLSXCellElement() + xCellXf.ApplyBorder = style.ApplyBorder + xCellXf.ApplyFill = style.ApplyFill + xCellXf.ApplyFont = style.ApplyFont + xCellXf.ApplyAlignment = style.ApplyAlignment + if style.NamedStyleIndex != nil { + xCellXf.XfId = style.NamedStyleIndex + } + return +} + +func makeXLSXCellElement() (xCellXf xlsxXf) { + xCellXf.NumFmtId = 0 + return +} + +// Border is a high level structure intended to provide user access to +// the contents of Border Style within an Sheet. +type Border struct { + Left string + LeftColor string + Right string + RightColor string + Top string + TopColor string + Bottom string + BottomColor string +} + +func NewBorder(left, right, top, bottom string) *Border { + return &Border{ + Left: left, + Right: right, + Top: top, + Bottom: bottom, + } +} + +// Fill is a high level structure intended to provide user access to +// the contents of background and foreground color index within an Sheet. +type Fill struct { + PatternType string + BgColor string + FgColor string +} + +func NewFill(patternType, fgColor, bgColor string) *Fill { + return &Fill{ + PatternType: patternType, + FgColor: fgColor, + BgColor: bgColor, + } +} + +type Font struct { + Size int + Name string + Family int + Charset int + Color string + Bold bool + Italic bool + Underline bool +} + +func NewFont(size int, name string) *Font { + return &Font{Size: size, Name: name} +} + +type Alignment struct { + Horizontal string + Indent int + ShrinkToFit bool + TextRotation int + Vertical string + WrapText bool +} + +var defaultFontSize = 12 +var defaultFontName = "Verdana" + +func SetDefaultFont(size int, name string) { + defaultFontSize = size + defaultFontName = name +} + +func DefaultFont() *Font { + return NewFont(defaultFontSize, defaultFontName) +} + +func DefaultFill() *Fill { + return NewFill("none", "FFFFFFFF", "00000000") + +} + +func DefaultBorder() *Border { + return NewBorder("none", "none", "none", "none") +} + +func DefaultAlignment() *Alignment { + return &Alignment{ + Horizontal: "general", + Vertical: "bottom", + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/templates.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/templates.go new file mode 100644 index 0000000000000000000000000000000000000000..22c9557235526bb5a1e63f0ab9994d70857d36b5 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/templates.go @@ -0,0 +1,339 @@ +// This file contains default templates for XML files we don't yet +// populated based on content. + +package xlsx + +const TEMPLATE__RELS_DOT_RELS = `<?xml version="1.0" encoding="UTF-8"?> +<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> + <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/> + <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/> + <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/> +</Relationships>` + +const TEMPLATE_DOCPROPS_APP = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<Properties xmlns="http://schemas.openxmlformats.org/officeDocument/2006/extended-properties" xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"> + <TotalTime>0</TotalTime> + <Application>Go XLSX</Application> +</Properties>` + +const TEMPLATE_DOCPROPS_CORE = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></cp:coreProperties>` + +const TEMPLATE_XL_THEME_THEME = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office-Design"> + <a:themeElements> + <a:clrScheme name="Office"> + <a:dk1> + <a:sysClr val="windowText" lastClr="000000"/> + </a:dk1> + <a:lt1> + <a:sysClr val="window" lastClr="FFFFFF"/> + </a:lt1> + <a:dk2> + <a:srgbClr val="1F497D"/> + </a:dk2> + <a:lt2> + <a:srgbClr val="EEECE1"/> + </a:lt2> + <a:accent1> + <a:srgbClr val="4F81BD"/> + </a:accent1> + <a:accent2> + <a:srgbClr val="C0504D"/> + </a:accent2> + <a:accent3> + <a:srgbClr val="9BBB59"/> + </a:accent3> + <a:accent4> + <a:srgbClr val="8064A2"/> + </a:accent4> + <a:accent5> + <a:srgbClr val="4BACC6"/> + </a:accent5> + <a:accent6> + <a:srgbClr val="F79646"/> + </a:accent6> + <a:hlink> + <a:srgbClr val="0000FF"/> + </a:hlink> + <a:folHlink> + <a:srgbClr val="800080"/> + </a:folHlink> + </a:clrScheme> + <a:fontScheme name="Office"> + <a:majorFont> + <a:latin typeface="Cambria"/> + <a:ea typeface=""/> + <a:cs typeface=""/> + <a:font script="Jpan" typeface="MS Pゴシック"/> + <a:font script="Hang" typeface="맑은 고딕"/> + <a:font script="Hans" typeface="宋体"/> + <a:font script="Hant" typeface="新細明體"/> + <a:font script="Arab" typeface="Times New Roman"/> + <a:font script="Hebr" typeface="Times New Roman"/> + <a:font script="Thai" typeface="Tahoma"/> + <a:font script="Ethi" typeface="Nyala"/> + <a:font script="Beng" typeface="Vrinda"/> + <a:font script="Gujr" typeface="Shruti"/> + <a:font script="Khmr" typeface="MoolBoran"/> + <a:font script="Knda" typeface="Tunga"/> + <a:font script="Guru" typeface="Raavi"/> + <a:font script="Cans" typeface="Euphemia"/> + <a:font script="Cher" typeface="Plantagenet Cherokee"/> + <a:font script="Yiii" typeface="Microsoft Yi Baiti"/> + <a:font script="Tibt" typeface="Microsoft Himalaya"/> + <a:font script="Thaa" typeface="MV Boli"/> + <a:font script="Deva" typeface="Mangal"/> + <a:font script="Telu" typeface="Gautami"/> + <a:font script="Taml" typeface="Latha"/> + <a:font script="Syrc" typeface="Estrangelo Edessa"/> + <a:font script="Orya" typeface="Kalinga"/> + <a:font script="Mlym" typeface="Kartika"/> + <a:font script="Laoo" typeface="DokChampa"/> + <a:font script="Sinh" typeface="Iskoola Pota"/> + <a:font script="Mong" typeface="Mongolian Baiti"/> + <a:font script="Viet" typeface="Times New Roman"/> + <a:font script="Uigh" typeface="Microsoft Uighur"/> + <a:font script="Geor" typeface="Sylfaen"/> + </a:majorFont> + <a:minorFont> + <a:latin typeface="Calibri"/> + <a:ea typeface=""/> + <a:cs typeface=""/> + <a:font script="Jpan" typeface="MS Pゴシック"/> + <a:font script="Hang" typeface="맑은 고딕"/> + <a:font script="Hans" typeface="宋体"/> + <a:font script="Hant" typeface="新細明體"/> + <a:font script="Arab" typeface="Arial"/> + <a:font script="Hebr" typeface="Arial"/> + <a:font script="Thai" typeface="Tahoma"/> + <a:font script="Ethi" typeface="Nyala"/> + <a:font script="Beng" typeface="Vrinda"/> + <a:font script="Gujr" typeface="Shruti"/> + <a:font script="Khmr" typeface="DaunPenh"/> + <a:font script="Knda" typeface="Tunga"/> + <a:font script="Guru" typeface="Raavi"/> + <a:font script="Cans" typeface="Euphemia"/> + <a:font script="Cher" typeface="Plantagenet Cherokee"/> + <a:font script="Yiii" typeface="Microsoft Yi Baiti"/> + <a:font script="Tibt" typeface="Microsoft Himalaya"/> + <a:font script="Thaa" typeface="MV Boli"/> + <a:font script="Deva" typeface="Mangal"/> + <a:font script="Telu" typeface="Gautami"/> + <a:font script="Taml" typeface="Latha"/> + <a:font script="Syrc" typeface="Estrangelo Edessa"/> + <a:font script="Orya" typeface="Kalinga"/> + <a:font script="Mlym" typeface="Kartika"/> + <a:font script="Laoo" typeface="DokChampa"/> + <a:font script="Sinh" typeface="Iskoola Pota"/> + <a:font script="Mong" typeface="Mongolian Baiti"/> + <a:font script="Viet" typeface="Arial"/> + <a:font script="Uigh" typeface="Microsoft Uighur"/> + <a:font script="Geor" typeface="Sylfaen"/> + </a:minorFont> + </a:fontScheme> + <a:fmtScheme name="Office"> + <a:fillStyleLst> + <a:solidFill> + <a:schemeClr val="phClr"/> + </a:solidFill> + <a:gradFill rotWithShape="1"> + <a:gsLst> + <a:gs pos="0"> + <a:schemeClr val="phClr"> + <a:tint val="50000"/> + <a:satMod val="300000"/> + </a:schemeClr> + </a:gs> + <a:gs pos="35000"> + <a:schemeClr val="phClr"> + <a:tint val="37000"/> + <a:satMod val="300000"/> + </a:schemeClr> + </a:gs> + <a:gs pos="100000"> + <a:schemeClr val="phClr"> + <a:tint val="15000"/> + <a:satMod val="350000"/> + </a:schemeClr> + </a:gs> + </a:gsLst> + <a:lin ang="16200000" scaled="1"/> + </a:gradFill> + <a:gradFill rotWithShape="1"> + <a:gsLst> + <a:gs pos="0"> + <a:schemeClr val="phClr"> + <a:tint val="100000"/> + <a:shade val="100000"/> + <a:satMod val="130000"/> + </a:schemeClr> + </a:gs> + <a:gs pos="100000"> + <a:schemeClr val="phClr"> + <a:tint val="50000"/> + <a:shade val="100000"/> + <a:satMod val="350000"/> + </a:schemeClr> + </a:gs> + </a:gsLst> + <a:lin ang="16200000" scaled="0"/> + </a:gradFill> + </a:fillStyleLst> + <a:lnStyleLst> + <a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"> + <a:solidFill> + <a:schemeClr val="phClr"> + <a:shade val="95000"/> + <a:satMod val="105000"/> + </a:schemeClr> + </a:solidFill> + <a:prstDash val="solid"/> + </a:ln> + <a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"> + <a:solidFill> + <a:schemeClr val="phClr"/> + </a:solidFill> + <a:prstDash val="solid"/> + </a:ln> + <a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"> + <a:solidFill> + <a:schemeClr val="phClr"/> + </a:solidFill> + <a:prstDash val="solid"/> + </a:ln> + </a:lnStyleLst> + <a:effectStyleLst> + <a:effectStyle> + <a:effectLst> + <a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"> + <a:srgbClr val="000000"> + <a:alpha val="38000"/> + </a:srgbClr> + </a:outerShdw> + </a:effectLst> + </a:effectStyle> + <a:effectStyle> + <a:effectLst> + <a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"> + <a:srgbClr val="000000"> + <a:alpha val="35000"/> + </a:srgbClr> + </a:outerShdw> + </a:effectLst> + </a:effectStyle> + <a:effectStyle> + <a:effectLst> + <a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"> + <a:srgbClr val="000000"> + <a:alpha val="35000"/> + </a:srgbClr> + </a:outerShdw> + </a:effectLst> + <a:scene3d> + <a:camera prst="orthographicFront"> + <a:rot lat="0" lon="0" rev="0"/> + </a:camera> + <a:lightRig rig="threePt" dir="t"> + <a:rot lat="0" lon="0" rev="1200000"/> + </a:lightRig> + </a:scene3d> + <a:sp3d> + <a:bevelT w="63500" h="25400"/> + </a:sp3d> + </a:effectStyle> + </a:effectStyleLst> + <a:bgFillStyleLst> + <a:solidFill> + <a:schemeClr val="phClr"/> + </a:solidFill> + <a:gradFill rotWithShape="1"> + <a:gsLst> + <a:gs pos="0"> + <a:schemeClr val="phClr"> + <a:tint val="40000"/> + <a:satMod val="350000"/> + </a:schemeClr> + </a:gs> + <a:gs pos="40000"> + <a:schemeClr val="phClr"> + <a:tint val="45000"/> + <a:shade val="99000"/> + <a:satMod val="350000"/> + </a:schemeClr> + </a:gs> + <a:gs pos="100000"> + <a:schemeClr val="phClr"> + <a:shade val="20000"/> + <a:satMod val="255000"/> + </a:schemeClr> + </a:gs> + </a:gsLst> + <a:path path="circle"> + <a:fillToRect l="50000" t="-80000" r="50000" b="180000"/> + </a:path> + </a:gradFill> + <a:gradFill rotWithShape="1"> + <a:gsLst> + <a:gs pos="0"> + <a:schemeClr val="phClr"> + <a:tint val="80000"/> + <a:satMod val="300000"/> + </a:schemeClr> + </a:gs> + <a:gs pos="100000"> + <a:schemeClr val="phClr"> + <a:shade val="30000"/> + <a:satMod val="200000"/> + </a:schemeClr> + </a:gs> + </a:gsLst> + <a:path path="circle"> + <a:fillToRect l="50000" t="50000" r="50000" b="50000"/> + </a:path> + </a:gradFill> + </a:bgFillStyleLst> + </a:fmtScheme> + </a:themeElements> + <a:objectDefaults> + <a:spDef> + <a:spPr/> + <a:bodyPr/> + <a:lstStyle/> + <a:style> + <a:lnRef idx="1"> + <a:schemeClr val="accent1"/> + </a:lnRef> + <a:fillRef idx="3"> + <a:schemeClr val="accent1"/> + </a:fillRef> + <a:effectRef idx="2"> + <a:schemeClr val="accent1"/> + </a:effectRef> + <a:fontRef idx="minor"> + <a:schemeClr val="lt1"/> + </a:fontRef> + </a:style> + </a:spDef> + <a:lnDef> + <a:spPr/> + <a:bodyPr/> + <a:lstStyle/> + <a:style> + <a:lnRef idx="2"> + <a:schemeClr val="accent1"/> + </a:lnRef> + <a:fillRef idx="0"> + <a:schemeClr val="accent1"/> + </a:fillRef> + <a:effectRef idx="1"> + <a:schemeClr val="accent1"/> + </a:effectRef> + <a:fontRef idx="minor"> + <a:schemeClr val="tx1"/> + </a:fontRef> + </a:style> + </a:lnDef> + </a:objectDefaults> + <a:extraClrSchemeLst/> +</a:theme>` diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/theme.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/theme.go new file mode 100644 index 0000000000000000000000000000000000000000..7a04df4cc2dab05b4fe9d86356c3750e6c8439c7 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/theme.go @@ -0,0 +1,47 @@ +package xlsx + +import ( + "fmt" + "strconv" +) + +type theme struct { + colors []string +} + +func newTheme(themeXml xlsxTheme) *theme { + clrMap := map[string]string{} + clrSchemes := themeXml.ThemeElements.ClrScheme.Children + for _, scheme := range clrSchemes { + var rgbColor string + if scheme.SysClr != nil { + rgbColor = scheme.SysClr.LastClr + } else { + rgbColor = scheme.SrgbClr.Val + } + clrMap[scheme.XMLName.Local] = rgbColor + } + colors := []string{clrMap["lt1"], clrMap["dk1"], clrMap["lt2"], clrMap["dk2"], clrMap["accent1"], + clrMap["accent2"], clrMap["accent3"], clrMap["accent4"], clrMap["accent5"], + clrMap["accent6"], clrMap["hlink"], clrMap["folHlink"]} + return &theme{colors} +} + +func (t *theme) themeColor(index int64, tint float64) string { + baseColor := t.colors[index] + if tint == 0 { + return "FF" + baseColor + } else { + r, _ := strconv.ParseInt(baseColor[0:2], 16, 64) + g, _ := strconv.ParseInt(baseColor[2:4], 16, 64) + b, _ := strconv.ParseInt(baseColor[4:6], 16, 64) + h, s, l := RGBToHSL(uint8(r), uint8(g), uint8(b)) + if tint < 0 { + l *= (1 + tint) + } else { + l = l*(1-tint) + (1 - (1 - tint)) + } + br, bg, bb := HSLToRGB(h, s, l) + return fmt.Sprintf("FF%02X%02X%02X", br, bg, bb) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/write.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/write.go new file mode 100644 index 0000000000000000000000000000000000000000..7696dfc65cd462cc6c8db70c2d5248391b7e599e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/write.go @@ -0,0 +1,112 @@ +package xlsx + +import ( + "fmt" + "reflect" + "time" +) + +// Writes an array to row r. Accepts a pointer to array type 'e', +// and writes the number of columns to write, 'cols'. If 'cols' is < 0, +// the entire array will be written if possible. Returns -1 if the 'e' +// doesn't point to an array, otherwise the number of columns written. +func (r *Row) WriteSlice(e interface{}, cols int) int { + if cols == 0 { + return cols + } + + // make sure 'e' is a Ptr to Slice + v := reflect.ValueOf(e) + if v.Kind() != reflect.Ptr { + return -1 + } + + v = v.Elem() + if v.Kind() != reflect.Slice { + return -1 + } + + // it's a slice, so open up its values + n := v.Len() + if cols < n && cols > 0 { + n = cols + } + + var setCell func(reflect.Value) + setCell = func(val reflect.Value) { + switch t := val.Interface().(type) { + case time.Time: + cell := r.AddCell() + cell.SetValue(t) + case fmt.Stringer: // check Stringer first + cell := r.AddCell() + cell.SetString(t.String()) + default: + switch val.Kind() { // underlying type of slice + case reflect.String, reflect.Int, reflect.Int8, + reflect.Int16, reflect.Int32, reflect.Int64, reflect.Float64, reflect.Float32: + cell := r.AddCell() + cell.SetValue(val.Interface()) + case reflect.Bool: + cell := r.AddCell() + cell.SetBool(t.(bool)) + case reflect.Interface: + setCell(reflect.ValueOf(t)) + } + } + } + + var i int + for i = 0; i < n; i++ { + setCell(v.Index(i)) + } + return i +} + +// Writes a struct to row r. Accepts a pointer to struct type 'e', +// and the number of columns to write, `cols`. If 'cols' is < 0, +// the entire struct will be written if possible. Returns -1 if the 'e' +// doesn't point to a struct, otherwise the number of columns written +func (r *Row) WriteStruct(e interface{}, cols int) int { + if cols == 0 { + return cols + } + + v := reflect.ValueOf(e).Elem() + if v.Kind() != reflect.Struct { + return -1 // bail if it's not a struct + } + + n := v.NumField() // number of fields in struct + if cols < n && cols > 0 { + n = cols + } + + var k int + for i := 0; i < n; i, k = i+1, k+1 { + f := v.Field(i) + + switch t := f.Interface().(type) { + case time.Time: + cell := r.AddCell() + cell.SetValue(t) + case fmt.Stringer: // check Stringer first + cell := r.AddCell() + cell.SetString(t.String()) + default: + switch f.Kind() { + case reflect.String, reflect.Int, reflect.Int8, + reflect.Int16, reflect.Int32, reflect.Int64, reflect.Float64, reflect.Float32: + cell := r.AddCell() + cell.SetValue(f.Interface()) + case reflect.Bool: + cell := r.AddCell() + cell.SetBool(t.(bool)) + default: + k-- // nothing set so reset to previous + } + } + } + + return k +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/xmlContentTypes.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/xmlContentTypes.go new file mode 100644 index 0000000000000000000000000000000000000000..2bf948d13477ebec617d957b69cdf3f7a1604c72 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/xmlContentTypes.go @@ -0,0 +1,50 @@ +package xlsx + +import ( + "encoding/xml" +) + +type xlsxTypes struct { + XMLName xml.Name `xml:"http://schemas.openxmlformats.org/package/2006/content-types Types"` + + Overrides []xlsxOverride `xml:"Override"` + Defaults []xlsxDefault `xml:"Default"` +} + +type xlsxOverride struct { + PartName string `xml:",attr"` + ContentType string `xml:",attr"` +} + +type xlsxDefault struct { + Extension string `xml:",attr"` + ContentType string `xml:",attr"` +} + +func MakeDefaultContentTypes() (types xlsxTypes) { + types.Overrides = make([]xlsxOverride, 8) + types.Defaults = make([]xlsxDefault, 2) + + types.Overrides[0].PartName = "/_rels/.rels" + types.Overrides[0].ContentType = "application/vnd.openxmlformats-package.relationships+xml" + types.Overrides[1].PartName = "/docProps/app.xml" + types.Overrides[1].ContentType = "application/vnd.openxmlformats-officedocument.extended-properties+xml" + types.Overrides[2].PartName = "/docProps/core.xml" + types.Overrides[2].ContentType = "application/vnd.openxmlformats-package.core-properties+xml" + types.Overrides[3].PartName = "/xl/_rels/workbook.xml.rels" + types.Overrides[3].ContentType = "application/vnd.openxmlformats-package.relationships+xml" + types.Overrides[4].PartName = "/xl/sharedStrings.xml" + types.Overrides[4].ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml" + types.Overrides[5].PartName = "/xl/styles.xml" + types.Overrides[5].ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml" + types.Overrides[6].PartName = "/xl/workbook.xml" + types.Overrides[6].ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml" + types.Overrides[7].PartName = "/xl/theme/theme1.xml" + types.Overrides[7].ContentType = "application/vnd.openxmlformats-officedocument.theme+xml" + + types.Defaults[0].Extension = "rels" + types.Defaults[0].ContentType = "application/vnd.openxmlformats-package.relationships+xml" + types.Defaults[1].Extension = "xml" + types.Defaults[1].ContentType = "application/xml" + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/xmlSharedStrings.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/xmlSharedStrings.go new file mode 100644 index 0000000000000000000000000000000000000000..306a80201da5a58fc733b7f08fe88479947408fe --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/xmlSharedStrings.go @@ -0,0 +1,32 @@ +package xlsx + +import ( + "encoding/xml" +) + +// xlsxSST directly maps the sst element from the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main currently +// I have not checked this for completeness - it does as much as I need. +type xlsxSST struct { + XMLName xml.Name `xml:"http://schemas.openxmlformats.org/spreadsheetml/2006/main sst"` + Count int `xml:"count,attr"` + UniqueCount int `xml:"uniqueCount,attr"` + SI []xlsxSI `xml:"si"` +} + +// xlsxSI directly maps the si element from the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked this for completeness - it does as +// much as I need. +type xlsxSI struct { + T string `xml:"t"` + R []xlsxR `xml:"r"` +} + +// xlsxR directly maps the r element from the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked this for completeness - it does as +// much as I need. +type xlsxR struct { + T string `xml:"t"` +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/xmlStyle.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/xmlStyle.go new file mode 100644 index 0000000000000000000000000000000000000000..7dc2b52df008bc9205f74b553388e6ecd2a9c7ce --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/xmlStyle.go @@ -0,0 +1,959 @@ +// xslx is a package designed to help with reading data from +// spreadsheets stored in the XLSX format used in recent versions of +// Microsoft's Excel spreadsheet. +// +// For a concise example of how to use this library why not check out +// the source for xlsx2csv here: https://github.com/tealeg/xlsx2csv + +package xlsx + +import ( + "bytes" + "encoding/xml" + "fmt" + "strconv" + "sync" +) + +// Excel styles can reference number formats that are built-in, all of which +// have an id less than 164. +const builtinNumFmtsCount = 163 + +// Excel styles can reference number formats that are built-in, all of which +// have an id less than 164. This is a possibly incomplete list comprised of as +// many of them as I could find. +var builtInNumFmt = map[int]string{ + 0: "general", + 1: "0", + 2: "0.00", + 3: "#,##0", + 4: "#,##0.00", + 9: "0%", + 10: "0.00%", + 11: "0.00e+00", + 12: "# ?/?", + 13: "# ??/??", + 14: "mm-dd-yy", + 15: "d-mmm-yy", + 16: "d-mmm", + 17: "mmm-yy", + 18: "h:mm am/pm", + 19: "h:mm:ss am/pm", + 20: "h:mm", + 21: "h:mm:ss", + 22: "m/d/yy h:mm", + 37: "#,##0 ;(#,##0)", + 38: "#,##0 ;[red](#,##0)", + 39: "#,##0.00;(#,##0.00)", + 40: "#,##0.00;[red](#,##0.00)", + 41: `_(* #,##0_);_(* \(#,##0\);_(* "-"_);_(@_)`, + 42: `_("$"* #,##0_);_("$* \(#,##0\);_("$"* "-"_);_(@_)`, + 43: `_(* #,##0.00_);_(* \(#,##0.00\);_(* "-"??_);_(@_)`, + 44: `_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)`, + 45: "mm:ss", + 46: "[h]:mm:ss", + 47: "mmss.0", + 48: "##0.0e+0", + 49: "@", +} + +// These are the color annotations from number format codes that contain color names. +// Also possible are [color1] through [color56] +var numFmtColorCodes = []string{ + "[red]", + "[black]", + "[green]", + "[white]", + "[blue]", + "[magenta]", + "[yellow]", + "[cyan]", +} + +var builtInNumFmtInv = make(map[string]int, 40) + +func init() { + for k, v := range builtInNumFmt { + builtInNumFmtInv[v] = k + } +} + +const ( + builtInNumFmtIndex_GENERAL = int(0) + builtInNumFmtIndex_INT = int(1) + builtInNumFmtIndex_FLOAT = int(2) + builtInNumFmtIndex_DATE = int(14) + builtInNumFmtIndex_STRING = int(49) +) + +// xlsxStyle directly maps the styleSheet element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxStyleSheet struct { + XMLName xml.Name `xml:"http://schemas.openxmlformats.org/spreadsheetml/2006/main styleSheet"` + + Fonts xlsxFonts `xml:"fonts,omitempty"` + Fills xlsxFills `xml:"fills,omitempty"` + Borders xlsxBorders `xml:"borders,omitempty"` + CellStyles *xlsxCellStyles `xml:"cellStyles,omitempty"` + CellStyleXfs *xlsxCellStyleXfs `xml:"cellStyleXfs,omitempty"` + CellXfs xlsxCellXfs `xml:"cellXfs,omitempty"` + NumFmts xlsxNumFmts `xml:"numFmts,omitempty"` + + theme *theme + + sync.RWMutex // protects the following + styleCache map[int]*Style + numFmtRefTable map[int]xlsxNumFmt + parsedNumFmtTable map[string]*parsedNumberFormat +} + +func newXlsxStyleSheet(t *theme) *xlsxStyleSheet { + return &xlsxStyleSheet{ + theme: t, + styleCache: make(map[int]*Style), + } +} + +func (styles *xlsxStyleSheet) reset() { + styles.Fonts = xlsxFonts{} + styles.Fills = xlsxFills{} + styles.Borders = xlsxBorders{} + + // Microsoft seems to want an emtpy border to start with + styles.addBorder( + xlsxBorder{ + Left: xlsxLine{Style: "none"}, + Right: xlsxLine{Style: "none"}, + Top: xlsxLine{Style: "none"}, + Bottom: xlsxLine{Style: "none"}, + }) + + styles.CellStyleXfs = &xlsxCellStyleXfs{} + + // add default xf + styles.CellXfs = xlsxCellXfs{Count: 1, Xf: []xlsxXf{{}}} + styles.NumFmts = xlsxNumFmts{} +} + +func (styles *xlsxStyleSheet) getStyle(styleIndex int) *Style { + styles.RLock() + style, ok := styles.styleCache[styleIndex] + styles.RUnlock() + if ok { + return style + } + + style = new(Style) + + var namedStyleXf xlsxXf + + xfCount := styles.CellXfs.Count + if styleIndex > -1 && xfCount > 0 && styleIndex <= xfCount { + xf := styles.CellXfs.Xf[styleIndex] + + if xf.XfId != nil && styles.CellStyleXfs != nil { + namedStyleXf = styles.CellStyleXfs.Xf[*xf.XfId] + style.NamedStyleIndex = xf.XfId + } else { + namedStyleXf = xlsxXf{} + } + + style.ApplyBorder = xf.ApplyBorder || namedStyleXf.ApplyBorder + style.ApplyFill = xf.ApplyFill || namedStyleXf.ApplyFill + style.ApplyFont = xf.ApplyFont || namedStyleXf.ApplyFont + style.ApplyAlignment = xf.ApplyAlignment || namedStyleXf.ApplyAlignment + + if xf.BorderId > -1 && xf.BorderId < styles.Borders.Count { + var border xlsxBorder + border = styles.Borders.Border[xf.BorderId] + style.Border.Left = border.Left.Style + style.Border.LeftColor = border.Left.Color.RGB + style.Border.Right = border.Right.Style + style.Border.RightColor = border.Right.Color.RGB + style.Border.Top = border.Top.Style + style.Border.TopColor = border.Top.Color.RGB + style.Border.Bottom = border.Bottom.Style + style.Border.BottomColor = border.Bottom.Color.RGB + } + + if xf.FillId > -1 && xf.FillId < styles.Fills.Count { + xFill := styles.Fills.Fill[xf.FillId] + style.Fill.PatternType = xFill.PatternFill.PatternType + style.Fill.FgColor = styles.argbValue(xFill.PatternFill.FgColor) + style.Fill.BgColor = styles.argbValue(xFill.PatternFill.BgColor) + } + + if xf.FontId > -1 && xf.FontId < styles.Fonts.Count { + xfont := styles.Fonts.Font[xf.FontId] + style.Font.Size, _ = strconv.Atoi(xfont.Sz.Val) + style.Font.Name = xfont.Name.Val + style.Font.Family, _ = strconv.Atoi(xfont.Family.Val) + style.Font.Charset, _ = strconv.Atoi(xfont.Charset.Val) + style.Font.Color = styles.argbValue(xfont.Color) + + if bold := xfont.B; bold != nil && bold.Val != "0" { + style.Font.Bold = true + } + if italic := xfont.I; italic != nil && italic.Val != "0" { + style.Font.Italic = true + } + if underline := xfont.U; underline != nil && underline.Val != "0" { + style.Font.Underline = true + } + } + if xf.Alignment.Horizontal != "" { + style.Alignment.Horizontal = xf.Alignment.Horizontal + } + + if xf.Alignment.Vertical != "" { + style.Alignment.Vertical = xf.Alignment.Vertical + } + style.Alignment.WrapText = xf.Alignment.WrapText + style.Alignment.TextRotation = xf.Alignment.TextRotation + + styles.Lock() + styles.styleCache[styleIndex] = style + styles.Unlock() + } + return style +} + +func (styles *xlsxStyleSheet) argbValue(color xlsxColor) string { + if color.Theme != nil && styles.theme != nil { + return styles.theme.themeColor(int64(*color.Theme), color.Tint) + } + return color.RGB +} + +// Excel styles can reference number formats that are built-in, all of which +// have an id less than 164. This is a possibly incomplete list comprised of as +// many of them as I could find. +func getBuiltinNumberFormat(numFmtId int) string { + return builtInNumFmt[numFmtId] +} + +func (styles *xlsxStyleSheet) getNumberFormat(styleIndex int) (string, *parsedNumberFormat) { + var numberFormat string = "general" + if styles.CellXfs.Xf != nil { + if styleIndex > -1 && styleIndex <= styles.CellXfs.Count { + xf := styles.CellXfs.Xf[styleIndex] + if builtin := getBuiltinNumberFormat(xf.NumFmtId); builtin != "" { + numberFormat = builtin + } else { + if styles.numFmtRefTable != nil { + numFmt := styles.numFmtRefTable[xf.NumFmtId] + numberFormat = numFmt.FormatCode + } + } + } + } + parsedFmt, ok := styles.parsedNumFmtTable[numberFormat] + if !ok { + if styles.parsedNumFmtTable == nil { + styles.parsedNumFmtTable = map[string]*parsedNumberFormat{} + } + parsedFmt = parseFullNumberFormatString(numberFormat) + styles.parsedNumFmtTable[numberFormat] = parsedFmt + } + return numberFormat, parsedFmt +} + +func (styles *xlsxStyleSheet) addFont(xFont xlsxFont) (index int) { + var font xlsxFont + if xFont.Name.Val == "" { + return 0 + } + for index, font = range styles.Fonts.Font { + if font.Equals(xFont) { + return index + } + } + styles.Fonts.Font = append(styles.Fonts.Font, xFont) + index = styles.Fonts.Count + styles.Fonts.Count++ + return +} + +func (styles *xlsxStyleSheet) addFill(xFill xlsxFill) (index int) { + var fill xlsxFill + for index, fill = range styles.Fills.Fill { + if fill.Equals(xFill) { + return index + } + } + styles.Fills.Fill = append(styles.Fills.Fill, xFill) + index = styles.Fills.Count + styles.Fills.Count++ + return +} + +func (styles *xlsxStyleSheet) addBorder(xBorder xlsxBorder) (index int) { + var border xlsxBorder + for index, border = range styles.Borders.Border { + if border.Equals(xBorder) { + return index + } + } + styles.Borders.Border = append(styles.Borders.Border, xBorder) + index = styles.Borders.Count + + styles.Borders.Count++ + return +} + +func (styles *xlsxStyleSheet) addCellStyleXf(xCellStyleXf xlsxXf) (index int) { + var cellStyleXf xlsxXf + if styles.CellStyleXfs == nil { + styles.CellStyleXfs = &xlsxCellStyleXfs{Count: 0} + } + for index, cellStyleXf = range styles.CellStyleXfs.Xf { + if cellStyleXf.Equals(xCellStyleXf) { + return index + } + } + styles.CellStyleXfs.Xf = append(styles.CellStyleXfs.Xf, xCellStyleXf) + index = styles.CellStyleXfs.Count + styles.CellStyleXfs.Count++ + return +} + +func (styles *xlsxStyleSheet) addCellXf(xCellXf xlsxXf) (index int) { + var cellXf xlsxXf + for index, cellXf = range styles.CellXfs.Xf { + if cellXf.Equals(xCellXf) { + return index + } + } + + styles.CellXfs.Xf = append(styles.CellXfs.Xf, xCellXf) + index = styles.CellXfs.Count + styles.CellXfs.Count++ + return +} + +// newNumFmt generate a xlsxNumFmt according the format code. When the FormatCode is built in, it will return a xlsxNumFmt with the NumFmtId defined in ECMA document, otherwise it will generate a new NumFmtId greater than 164. +func (styles *xlsxStyleSheet) newNumFmt(formatCode string) xlsxNumFmt { + if compareFormatString(formatCode, "general") { + return xlsxNumFmt{NumFmtId: 0, FormatCode: "general"} + } + // built in NumFmts in xmlStyle.go, traverse from the const. + numFmtId, ok := builtInNumFmtInv[formatCode] + if ok { + return xlsxNumFmt{NumFmtId: numFmtId, FormatCode: formatCode} + } + + // find the exist xlsxNumFmt + for _, numFmt := range styles.NumFmts.NumFmt { + if formatCode == numFmt.FormatCode { + return numFmt + } + } + + // The user define NumFmtId. The one less than 164 in built in. + numFmtId = builtinNumFmtsCount + 1 + styles.Lock() + defer styles.Unlock() + for { + // get a unused NumFmtId + if _, ok = styles.numFmtRefTable[numFmtId]; ok { + numFmtId++ + } else { + styles.addNumFmt(xlsxNumFmt{NumFmtId: numFmtId, FormatCode: formatCode}) + break + } + } + return xlsxNumFmt{NumFmtId: numFmtId, FormatCode: formatCode} +} + +// addNumFmt add xlsxNumFmt if its not exist. +func (styles *xlsxStyleSheet) addNumFmt(xNumFmt xlsxNumFmt) { + // don't add built in NumFmt + if xNumFmt.NumFmtId <= builtinNumFmtsCount { + return + } + _, ok := styles.numFmtRefTable[xNumFmt.NumFmtId] + if !ok { + if styles.numFmtRefTable == nil { + styles.numFmtRefTable = make(map[int]xlsxNumFmt) + } + styles.NumFmts.NumFmt = append(styles.NumFmts.NumFmt, xNumFmt) + styles.numFmtRefTable[xNumFmt.NumFmtId] = xNumFmt + styles.NumFmts.Count++ + } +} + +func (styles *xlsxStyleSheet) Marshal() (string, error) { + result := xml.Header + `<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">` + + xNumFmts, err := styles.NumFmts.Marshal() + if err != nil { + return "", err + } + result += xNumFmts + + outputFontMap := make(map[int]int) + xfonts, err := styles.Fonts.Marshal(outputFontMap) + if err != nil { + return "", err + } + result += xfonts + + outputFillMap := make(map[int]int) + xfills, err := styles.Fills.Marshal(outputFillMap) + if err != nil { + return "", err + } + result += xfills + + outputBorderMap := make(map[int]int) + xborders, err := styles.Borders.Marshal(outputBorderMap) + if err != nil { + return "", err + } + result += xborders + + if styles.CellStyleXfs != nil { + xcellStyleXfs, err := styles.CellStyleXfs.Marshal(outputBorderMap, outputFillMap, outputFontMap) + if err != nil { + return "", err + } + result += xcellStyleXfs + } + + xcellXfs, err := styles.CellXfs.Marshal(outputBorderMap, outputFillMap, outputFontMap) + if err != nil { + return "", err + } + result += xcellXfs + + if styles.CellStyles != nil { + xcellStyles, err := styles.CellStyles.Marshal() + if err != nil { + return "", err + } + result += xcellStyles + } + + return result + "</styleSheet>", nil +} + +// xlsxNumFmts directly maps the numFmts element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxNumFmts struct { + Count int `xml:"count,attr"` + NumFmt []xlsxNumFmt `xml:"numFmt,omitempty"` +} + +func (numFmts *xlsxNumFmts) Marshal() (result string, err error) { + if numFmts.Count > 0 { + result = fmt.Sprintf(`<numFmts count="%d">`, numFmts.Count) + for _, numFmt := range numFmts.NumFmt { + var xNumFmt string + xNumFmt, err = numFmt.Marshal() + if err != nil { + return + } + result += xNumFmt + } + result += `</numFmts>` + } + return +} + +// xlsxNumFmt directly maps the numFmt element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxNumFmt struct { + NumFmtId int `xml:"numFmtId,attr,omitempty"` + FormatCode string `xml:"formatCode,attr,omitempty"` +} + +func (numFmt *xlsxNumFmt) Marshal() (result string, err error) { + formatCode := &bytes.Buffer{} + if err := xml.EscapeText(formatCode, []byte(numFmt.FormatCode)); err != nil { + return "", err + } + + return fmt.Sprintf(`<numFmt numFmtId="%d" formatCode="%s"/>`, numFmt.NumFmtId, formatCode), nil +} + +// xlsxFonts directly maps the fonts element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxFonts struct { + XMLName xml.Name `xml:"fonts"` + + Count int `xml:"count,attr"` + Font []xlsxFont `xml:"font,omitempty"` +} + +func (fonts *xlsxFonts) Marshal(outputFontMap map[int]int) (result string, err error) { + emittedCount := 0 + subparts := "" + + for i, font := range fonts.Font { + var xfont string + xfont, err = font.Marshal() + if err != nil { + return + } + if xfont != "" { + outputFontMap[i] = emittedCount + emittedCount++ + subparts += xfont + } + } + if emittedCount > 0 { + result = fmt.Sprintf(`<fonts count="%d">`, fonts.Count) + result += subparts + result += `</fonts>` + } + return +} + +// xlsxFont directly maps the font element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxFont struct { + Sz xlsxVal `xml:"sz,omitempty"` + Name xlsxVal `xml:"name,omitempty"` + Family xlsxVal `xml:"family,omitempty"` + Charset xlsxVal `xml:"charset,omitempty"` + Color xlsxColor `xml:"color,omitempty"` + B *xlsxVal `xml:"b,omitempty"` + I *xlsxVal `xml:"i,omitempty"` + U *xlsxVal `xml:"u,omitempty"` +} + +func (font *xlsxFont) Equals(other xlsxFont) bool { + if (font.B == nil && other.B != nil) || (font.B != nil && other.B == nil) { + return false + } + if (font.I == nil && other.I != nil) || (font.I != nil && other.I == nil) { + return false + } + if (font.U == nil && other.U != nil) || (font.U != nil && other.U == nil) { + return false + } + return font.Sz.Equals(other.Sz) && font.Name.Equals(other.Name) && font.Family.Equals(other.Family) && font.Charset.Equals(other.Charset) && font.Color.Equals(other.Color) +} + +func (font *xlsxFont) Marshal() (result string, err error) { + result = "<font>" + if font.Sz.Val != "" { + result += fmt.Sprintf(`<sz val="%s"/>`, font.Sz.Val) + } + if font.Name.Val != "" { + result += fmt.Sprintf(`<name val="%s"/>`, font.Name.Val) + } + if font.Family.Val != "" { + result += fmt.Sprintf(`<family val="%s"/>`, font.Family.Val) + } + if font.Charset.Val != "" { + result += fmt.Sprintf(`<charset val="%s"/>`, font.Charset.Val) + } + if font.Color.RGB != "" { + result += fmt.Sprintf(`<color rgb="%s"/>`, font.Color.RGB) + } + if font.B != nil { + result += "<b/>" + } + if font.I != nil { + result += "<i/>" + } + if font.U != nil { + result += "<u/>" + } + return result + "</font>", nil +} + +// xlsxVal directly maps the val element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxVal struct { + Val string `xml:"val,attr,omitempty"` +} + +func (val *xlsxVal) Equals(other xlsxVal) bool { + return val.Val == other.Val +} + +// xlsxFills directly maps the fills element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxFills struct { + Count int `xml:"count,attr"` + Fill []xlsxFill `xml:"fill,omitempty"` +} + +func (fills *xlsxFills) Marshal(outputFillMap map[int]int) (string, error) { + var subparts string + var emittedCount int + for i, fill := range fills.Fill { + xfill, err := fill.Marshal() + if err != nil { + return "", err + } + if xfill != "" { + outputFillMap[i] = emittedCount + emittedCount++ + subparts += xfill + } + } + var result string + if emittedCount > 0 { + result = fmt.Sprintf(`<fills count="%d">`, emittedCount) + result += subparts + result += `</fills>` + } + return result, nil +} + +// xlsxFill directly maps the fill element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxFill struct { + PatternFill xlsxPatternFill `xml:"patternFill,omitempty"` +} + +func (fill *xlsxFill) Equals(other xlsxFill) bool { + return fill.PatternFill.Equals(other.PatternFill) +} + +func (fill *xlsxFill) Marshal() (result string, err error) { + if fill.PatternFill.PatternType != "" { + var xpatternFill string + result = `<fill>` + + xpatternFill, err = fill.PatternFill.Marshal() + if err != nil { + return + } + result += xpatternFill + result += `</fill>` + } + return +} + +// xlsxPatternFill directly maps the patternFill element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxPatternFill struct { + PatternType string `xml:"patternType,attr,omitempty"` + FgColor xlsxColor `xml:"fgColor,omitempty"` + BgColor xlsxColor `xml:"bgColor,omitempty"` +} + +func (patternFill *xlsxPatternFill) Equals(other xlsxPatternFill) bool { + return patternFill.PatternType == other.PatternType && patternFill.FgColor.Equals(other.FgColor) && patternFill.BgColor.Equals(other.BgColor) +} + +func (patternFill *xlsxPatternFill) Marshal() (result string, err error) { + result = fmt.Sprintf(`<patternFill patternType="%s"`, patternFill.PatternType) + ending := `/>` + terminator := "" + subparts := "" + if patternFill.FgColor.RGB != "" { + ending = `>` + terminator = "</patternFill>" + subparts += fmt.Sprintf(`<fgColor rgb="%s"/>`, patternFill.FgColor.RGB) + } + if patternFill.BgColor.RGB != "" { + ending = `>` + terminator = "</patternFill>" + subparts += fmt.Sprintf(`<bgColor rgb="%s"/>`, patternFill.BgColor.RGB) + } + result += ending + result += subparts + result += terminator + return +} + +// xlsxColor is a common mapping used for both the fgColor and bgColor +// elements in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxColor struct { + RGB string `xml:"rgb,attr,omitempty"` + Theme *int `xml:"theme,attr,omitempty"` + Tint float64 `xml:"tint,attr,omitempty"` +} + +func (color *xlsxColor) Equals(other xlsxColor) bool { + return color.RGB == other.RGB +} + +// xlsxBorders directly maps the borders element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxBorders struct { + Count int `xml:"count,attr"` + Border []xlsxBorder `xml:"border"` +} + +func (borders *xlsxBorders) Marshal(outputBorderMap map[int]int) (result string, err error) { + result = "" + emittedCount := 0 + subparts := "" + for i, border := range borders.Border { + var xborder string + xborder, err = border.Marshal() + if err != nil { + return + } + if xborder != "" { + outputBorderMap[i] = emittedCount + emittedCount++ + subparts += xborder + } + } + if emittedCount > 0 { + result += fmt.Sprintf(`<borders count="%d">`, emittedCount) + result += subparts + result += `</borders>` + } + return +} + +// xlsxBorder directly maps the border element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxBorder struct { + Left xlsxLine `xml:"left,omitempty"` + Right xlsxLine `xml:"right,omitempty"` + Top xlsxLine `xml:"top,omitempty"` + Bottom xlsxLine `xml:"bottom,omitempty"` +} + +func (border *xlsxBorder) Equals(other xlsxBorder) bool { + return border.Left.Equals(other.Left) && border.Right.Equals(other.Right) && border.Top.Equals(other.Top) && border.Bottom.Equals(other.Bottom) +} + +// To get borders to work correctly in Excel, you have to always start with an +// empty set of borders. There was logic in this function that would strip out +// empty elements, but unfortunately that would cause the border to fail. + +func (border *xlsxBorder) Marshal() (result string, err error) { + subparts := "" + subparts += fmt.Sprintf(`<left style="%s">`, border.Left.Style) + if border.Left.Color.RGB != "" { + subparts += fmt.Sprintf(`<color rgb="%s"/>`, border.Left.Color.RGB) + } + subparts += `</left>` + + subparts += fmt.Sprintf(`<right style="%s">`, border.Right.Style) + if border.Right.Color.RGB != "" { + subparts += fmt.Sprintf(`<color rgb="%s"/>`, border.Right.Color.RGB) + } + subparts += `</right>` + + subparts += fmt.Sprintf(`<top style="%s">`, border.Top.Style) + if border.Top.Color.RGB != "" { + subparts += fmt.Sprintf(`<color rgb="%s"/>`, border.Top.Color.RGB) + } + subparts += `</top>` + + subparts += fmt.Sprintf(`<bottom style="%s">`, border.Bottom.Style) + if border.Bottom.Color.RGB != "" { + subparts += fmt.Sprintf(`<color rgb="%s"/>`, border.Bottom.Color.RGB) + } + subparts += `</bottom>` + + result += `<border>` + result += subparts + result += `</border>` + return +} + +// xlsxLine directly maps the line style element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxLine struct { + Style string `xml:"style,attr,omitempty"` + Color xlsxColor `xml:"color,omitempty"` +} + +func (line *xlsxLine) Equals(other xlsxLine) bool { + return line.Style == other.Style && line.Color.Equals(other.Color) +} + +type xlsxCellStyles struct { + XMLName xml.Name `xml:"cellStyles"` + Count int `xml:"count,attr"` + CellStyle []xlsxCellStyle `xml:"cellStyle,omitempty"` +} + +func (cellStyles *xlsxCellStyles) Marshal() (result string, err error) { + if cellStyles.Count > 0 { + result = fmt.Sprintf(`<cellStyles count="%d">`, cellStyles.Count) + for _, cellStyle := range cellStyles.CellStyle { + var xCellStyle []byte + xCellStyle, err = xml.Marshal(cellStyle) + if err != nil { + return + } + result += string(xCellStyle) + } + result += `</cellStyles>` + } + return + +} + +type xlsxCellStyle struct { + XMLName xml.Name `xml:"cellStyle"` + BuiltInId *int `xml:"builtInId,attr,omitempty"` + CustomBuiltIn *bool `xml:"customBuiltIn,attr,omitempty"` + Hidden *bool `xml:"hidden,attr,omitempty"` + ILevel *bool `xml:"iLevel,attr,omitempty"` + Name string `xml:"name,attr"` + XfId int `xml:"xfId,attr"` +} + +// xlsxCellStyleXfs directly maps the cellStyleXfs element in the +// namespace http://schemas.openxmlformats.org/spreadsheetml/2006/main +// - currently I have not checked it for completeness - it does as +// much as I need. +type xlsxCellStyleXfs struct { + Count int `xml:"count,attr"` + Xf []xlsxXf `xml:"xf,omitempty"` +} + +func (cellStyleXfs *xlsxCellStyleXfs) Marshal(outputBorderMap, outputFillMap, outputFontMap map[int]int) (result string, err error) { + if cellStyleXfs.Count > 0 { + result = fmt.Sprintf(`<cellStyleXfs count="%d">`, cellStyleXfs.Count) + for _, xf := range cellStyleXfs.Xf { + var xxf string + xxf, err = xf.Marshal(outputBorderMap, outputFillMap, outputFontMap) + if err != nil { + return + } + result += xxf + } + result += `</cellStyleXfs>` + } + return +} + +// xlsxCellXfs directly maps the cellXfs element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxCellXfs struct { + Count int `xml:"count,attr"` + Xf []xlsxXf `xml:"xf,omitempty"` +} + +func (cellXfs *xlsxCellXfs) Marshal(outputBorderMap, outputFillMap, outputFontMap map[int]int) (result string, err error) { + if cellXfs.Count > 0 { + result = fmt.Sprintf(`<cellXfs count="%d">`, cellXfs.Count) + for _, xf := range cellXfs.Xf { + var xxf string + xxf, err = xf.Marshal(outputBorderMap, outputFillMap, outputFontMap) + if err != nil { + return + } + result += xxf + } + result += `</cellXfs>` + } + return +} + +// xlsxXf directly maps the xf element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxXf struct { + ApplyAlignment bool `xml:"applyAlignment,attr"` + ApplyBorder bool `xml:"applyBorder,attr"` + ApplyFont bool `xml:"applyFont,attr"` + ApplyFill bool `xml:"applyFill,attr"` + ApplyNumberFormat bool `xml:"applyNumberFormat,attr"` + ApplyProtection bool `xml:"applyProtection,attr"` + BorderId int `xml:"borderId,attr"` + FillId int `xml:"fillId,attr"` + FontId int `xml:"fontId,attr"` + NumFmtId int `xml:"numFmtId,attr"` + XfId *int `xml:"xfId,attr,omitempty"` + Alignment xlsxAlignment `xml:"alignment"` +} + +func (xf *xlsxXf) Equals(other xlsxXf) bool { + return xf.ApplyAlignment == other.ApplyAlignment && + xf.ApplyBorder == other.ApplyBorder && + xf.ApplyFont == other.ApplyFont && + xf.ApplyFill == other.ApplyFill && + xf.ApplyProtection == other.ApplyProtection && + xf.BorderId == other.BorderId && + xf.FillId == other.FillId && + xf.FontId == other.FontId && + xf.NumFmtId == other.NumFmtId && + (xf.XfId == other.XfId || + ((xf.XfId != nil && other.XfId != nil) && + *xf.XfId == *other.XfId)) && + xf.Alignment.Equals(other.Alignment) +} + +func (xf *xlsxXf) Marshal(outputBorderMap, outputFillMap, outputFontMap map[int]int) (result string, err error) { + result = fmt.Sprintf(`<xf applyAlignment="%b" applyBorder="%b" applyFont="%b" applyFill="%b" applyNumberFormat="%b" applyProtection="%b" borderId="%d" fillId="%d" fontId="%d" numFmtId="%d"`, bool2Int(xf.ApplyAlignment), bool2Int(xf.ApplyBorder), bool2Int(xf.ApplyFont), bool2Int(xf.ApplyFill), bool2Int(xf.ApplyNumberFormat), bool2Int(xf.ApplyProtection), outputBorderMap[xf.BorderId], outputFillMap[xf.FillId], outputFontMap[xf.FontId], xf.NumFmtId) + if xf.XfId != nil { + result += fmt.Sprintf(` xfId="%d"`, *xf.XfId) + } + result += ">" + xAlignment, err := xf.Alignment.Marshal() + if err != nil { + return result, err + } + return result + xAlignment + "</xf>", nil +} + +type xlsxAlignment struct { + Horizontal string `xml:"horizontal,attr"` + Indent int `xml:"indent,attr"` + ShrinkToFit bool `xml:"shrinkToFit,attr"` + TextRotation int `xml:"textRotation,attr"` + Vertical string `xml:"vertical,attr"` + WrapText bool `xml:"wrapText,attr"` +} + +func (alignment *xlsxAlignment) Equals(other xlsxAlignment) bool { + return alignment.Horizontal == other.Horizontal && + alignment.Indent == other.Indent && + alignment.ShrinkToFit == other.ShrinkToFit && + alignment.TextRotation == other.TextRotation && + alignment.Vertical == other.Vertical && + alignment.WrapText == other.WrapText +} + +func (alignment *xlsxAlignment) Marshal() (result string, err error) { + if alignment.Horizontal == "" { + alignment.Horizontal = "general" + } + if alignment.Vertical == "" { + alignment.Vertical = "bottom" + } + return fmt.Sprintf(`<alignment horizontal="%s" indent="%d" shrinkToFit="%b" textRotation="%d" vertical="%s" wrapText="%b"/>`, alignment.Horizontal, alignment.Indent, bool2Int(alignment.ShrinkToFit), alignment.TextRotation, alignment.Vertical, bool2Int(alignment.WrapText)), nil +} + +func bool2Int(b bool) int { + if b { + return 1 + } + return 0 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/xmlTheme.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/xmlTheme.go new file mode 100644 index 0000000000000000000000000000000000000000..1f2033b5220a3b17ffc6dc7897a50cef934e5458 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/xmlTheme.go @@ -0,0 +1,55 @@ +package xlsx + +import "encoding/xml" + +// xlsxTheme directly maps the theme element in the namespace +// http://schemas.openxmlformats.org/drawingml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxTheme struct { + ThemeElements xlsxThemeElements `xml:"themeElements"` +} + +// xlsxThemeElements directly maps the themeElements element in the namespace +// http://schemas.openxmlformats.org/drawingml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxThemeElements struct { + ClrScheme xlsxClrScheme `xml:"clrScheme"` +} + +// xlsxClrScheme directly maps the clrScheme element in the namespace +// http://schemas.openxmlformats.org/drawingml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxClrScheme struct { + Name string `xml:"name,attr"` + Children []xlsxClrSchemeEl `xml:",any"` +} + +// xlsxClrScheme maps to children of the clrScheme element in the namespace +// http://schemas.openxmlformats.org/drawingml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxClrSchemeEl struct { + XMLName xml.Name + SysClr *xlsxSysClr `xml:"sysClr"` + SrgbClr *xlsxSrgbClr `xml:"srgbClr"` +} + +// xlsxSysClr directly maps the sysClr element in the namespace +// http://schemas.openxmlformats.org/drawingml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxSysClr struct { + Val string `xml:"val,attr"` + LastClr string `xml:"lastClr,attr"` +} + +// xlsxSrgbClr directly maps the srgbClr element in the namespace +// http://schemas.openxmlformats.org/drawingml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxSrgbClr struct { + Val string `xml:"val,attr"` +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/xmlWorkbook.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/xmlWorkbook.go new file mode 100644 index 0000000000000000000000000000000000000000..0cc529ab9eadee014650ee0e330f1dde03c1234f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/xmlWorkbook.go @@ -0,0 +1,213 @@ +package xlsx + +import ( + "archive/zip" + "encoding/xml" + "fmt" + "io" +) + +const ( + // sheet state values as defined by + // http://msdn.microsoft.com/en-us/library/office/documentformat.openxml.spreadsheet.sheetstatevalues.aspx + sheetStateVisible = "visible" + sheetStateHidden = "hidden" + sheetStateVeryHidden = "veryHidden" +) + +// xmlxWorkbookRels contains xmlxWorkbookRelations +// which maps sheet id and sheet XML +type xlsxWorkbookRels struct { + XMLName xml.Name `xml:"http://schemas.openxmlformats.org/package/2006/relationships Relationships"` + Relationships []xlsxWorkbookRelation `xml:"Relationship"` +} + +// xmlxWorkbookRelation maps sheet id and xl/worksheets/sheet%d.xml +type xlsxWorkbookRelation struct { + Id string `xml:",attr"` + Target string `xml:",attr"` + Type string `xml:",attr"` +} + +// xlsxWorkbook directly maps the workbook element from the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxWorkbook struct { + XMLName xml.Name `xml:"http://schemas.openxmlformats.org/spreadsheetml/2006/main workbook"` + FileVersion xlsxFileVersion `xml:"fileVersion"` + WorkbookPr xlsxWorkbookPr `xml:"workbookPr"` + WorkbookProtection xlsxWorkbookProtection `xml:"workbookProtection"` + BookViews xlsxBookViews `xml:"bookViews"` + Sheets xlsxSheets `xml:"sheets"` + DefinedNames xlsxDefinedNames `xml:"definedNames"` + CalcPr xlsxCalcPr `xml:"calcPr"` +} + +// xlsxWorkbookProtection directly maps the workbookProtection element from the +// namespace http://schemas.openxmlformats.org/spreadsheetml/2006/main +// - currently I have not checked it for completeness - it does as +// much as I need. +type xlsxWorkbookProtection struct { + // We don't need this, yet. +} + +// xlsxFileVersion directly maps the fileVersion element from the +// namespace http://schemas.openxmlformats.org/spreadsheetml/2006/main +// - currently I have not checked it for completeness - it does as +// much as I need. +type xlsxFileVersion struct { + AppName string `xml:"appName,attr,omitempty"` + LastEdited string `xml:"lastEdited,attr,omitempty"` + LowestEdited string `xml:"lowestEdited,attr,omitempty"` + RupBuild string `xml:"rupBuild,attr,omitempty"` +} + +// xlsxWorkbookPr directly maps the workbookPr element from the +// namespace http://schemas.openxmlformats.org/spreadsheetml/2006/main +// - currently I have not checked it for completeness - it does as +// much as I need. +type xlsxWorkbookPr struct { + DefaultThemeVersion string `xml:"defaultThemeVersion,attr,omitempty"` + BackupFile bool `xml:"backupFile,attr,omitempty"` + ShowObjects string `xml:"showObjects,attr,omitempty"` + Date1904 bool `xml:"date1904,attr"` +} + +// xlsxBookViews directly maps the bookViews element from the +// namespace http://schemas.openxmlformats.org/spreadsheetml/2006/main +// - currently I have not checked it for completeness - it does as +// much as I need. +type xlsxBookViews struct { + WorkBookView []xlsxWorkBookView `xml:"workbookView"` +} + +// xlsxWorkBookView directly maps the workbookView element from the +// namespace http://schemas.openxmlformats.org/spreadsheetml/2006/main +// - currently I have not checked it for completeness - it does as +// much as I need. +type xlsxWorkBookView struct { + ActiveTab int `xml:"activeTab,attr,omitempty"` + FirstSheet int `xml:"firstSheet,attr,omitempty"` + ShowHorizontalScroll bool `xml:"showHorizontalScroll,attr,omitempty"` + ShowVerticalScroll bool `xml:"showVerticalScroll,attr,omitempty"` + ShowSheetTabs bool `xml:"showSheetTabs,attr,omitempty"` + TabRatio int `xml:"tabRatio,attr,omitempty"` + WindowHeight int `xml:"windowHeight,attr,omitempty"` + WindowWidth int `xml:"windowWidth,attr,omitempty"` + XWindow string `xml:"xWindow,attr,omitempty"` + YWindow string `xml:"yWindow,attr,omitempty"` +} + +// xlsxSheets directly maps the sheets element from the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxSheets struct { + Sheet []xlsxSheet `xml:"sheet"` +} + +// xlsxSheet directly maps the sheet element from the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxSheet struct { + Name string `xml:"name,attr,omitempty"` + SheetId string `xml:"sheetId,attr,omitempty"` + Id string `xml:"http://schemas.openxmlformats.org/officeDocument/2006/relationships id,attr,omitempty"` + State string `xml:"state,attr,omitempty"` +} + +// xlsxDefinedNames directly maps the definedNames element from the +// namespace http://schemas.openxmlformats.org/spreadsheetml/2006/main +// - currently I have not checked it for completeness - it does as +// much as I need. +type xlsxDefinedNames struct { + DefinedName []xlsxDefinedName `xml:"definedName"` +} + +// xlsxDefinedName directly maps the definedName element from the +// namespace http://schemas.openxmlformats.org/spreadsheetml/2006/main +// - currently I have not checked it for completeness - it does as +// much as I need. +// for a descriptions of the attributes see +// https://msdn.microsoft.com/en-us/library/office/documentformat.openxml.spreadsheet.definedname.aspx +type xlsxDefinedName struct { + Data string `xml:",chardata"` + Name string `xml:"name,attr"` + Comment string `xml:"comment,attr,omitempty"` + CustomMenu string `xml:"customMenu,attr,omitempty"` + Description string `xml:"description,attr,omitempty"` + Help string `xml:"help,attr,omitempty"` + ShortcutKey string `xml:"shortcutKey,attr,omitempty"` + StatusBar string `xml:"statusBar,attr,omitempty"` + LocalSheetID int `xml:"localSheetId,attr,omitempty"` + FunctionGroupID int `xml:"functionGroupId,attr,omitempty"` + Function bool `xml:"function,attr,omitempty"` + Hidden bool `xml:"hidden,attr,omitempty"` + VbProcedure bool `xml:"vbProcedure,attr,omitempty"` + PublishToServer bool `xml:"publishToServer,attr,omitempty"` + WorkbookParameter bool `xml:"workbookParameter,attr,omitempty"` + Xlm bool `xml:"xml,attr,omitempty"` +} + +// xlsxCalcPr directly maps the calcPr element from the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxCalcPr struct { + CalcId string `xml:"calcId,attr,omitempty"` + IterateCount int `xml:"iterateCount,attr,omitempty"` + RefMode string `xml:"refMode,attr,omitempty"` + Iterate bool `xml:"iterate,attr,omitempty"` + IterateDelta float64 `xml:"iterateDelta,attr,omitempty"` +} + +// Helper function to lookup the file corresponding to a xlsxSheet object in the worksheets map +func worksheetFileForSheet(sheet xlsxSheet, worksheets map[string]*zip.File, sheetXMLMap map[string]string) *zip.File { + sheetName, ok := sheetXMLMap[sheet.Id] + if !ok { + if sheet.SheetId != "" { + sheetName = fmt.Sprintf("sheet%s", sheet.SheetId) + } else { + sheetName = fmt.Sprintf("sheet%s", sheet.Id) + } + } + return worksheets[sheetName] +} + +// getWorksheetFromSheet() is an internal helper function to open a +// sheetN.xml file, referred to by an xlsx.xlsxSheet struct, from the XLSX +// file and unmarshal it an xlsx.xlsxWorksheet struct +func getWorksheetFromSheet(sheet xlsxSheet, worksheets map[string]*zip.File, sheetXMLMap map[string]string, rowLimit int) (*xlsxWorksheet, error) { + var r io.Reader + var decoder *xml.Decoder + var worksheet *xlsxWorksheet + var err error + worksheet = new(xlsxWorksheet) + + f := worksheetFileForSheet(sheet, worksheets, sheetXMLMap) + if f == nil { + return nil, fmt.Errorf("Unable to find sheet '%s'", sheet) + } + if rc, err := f.Open(); err != nil { + return nil, err + } else { + defer rc.Close() + r = rc + } + + if rowLimit != NoRowLimit { + r, err = truncateSheetXML(r, rowLimit) + if err != nil { + return nil, err + } + } + + decoder = xml.NewDecoder(r) + err = decoder.Decode(worksheet) + if err != nil { + return nil, err + } + return worksheet, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/xmlWorksheet.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/xmlWorksheet.go new file mode 100644 index 0000000000000000000000000000000000000000..71c594185a21b1f54c7b47742ae3b091f9358911 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tealeg/xlsx/xmlWorksheet.go @@ -0,0 +1,365 @@ +package xlsx + +import ( + "encoding/xml" + "strings" +) + +// xlsxWorksheet directly maps the worksheet element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxWorksheet struct { + XMLName xml.Name `xml:"http://schemas.openxmlformats.org/spreadsheetml/2006/main worksheet"` + SheetPr xlsxSheetPr `xml:"sheetPr"` + Dimension xlsxDimension `xml:"dimension"` + SheetViews xlsxSheetViews `xml:"sheetViews"` + SheetFormatPr xlsxSheetFormatPr `xml:"sheetFormatPr"` + Cols *xlsxCols `xml:"cols,omitempty"` + SheetData xlsxSheetData `xml:"sheetData"` + AutoFilter *xlsxAutoFilter `xml:"autoFilter,omitempty"` + MergeCells *xlsxMergeCells `xml:"mergeCells,omitempty"` + PrintOptions xlsxPrintOptions `xml:"printOptions"` + PageMargins xlsxPageMargins `xml:"pageMargins"` + PageSetUp xlsxPageSetUp `xml:"pageSetup"` + HeaderFooter xlsxHeaderFooter `xml:"headerFooter"` +} + +// xlsxHeaderFooter directly maps the headerFooter element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxHeaderFooter struct { + DifferentFirst bool `xml:"differentFirst,attr"` + DifferentOddEven bool `xml:"differentOddEven,attr"` + OddHeader []xlsxOddHeader `xml:"oddHeader"` + OddFooter []xlsxOddFooter `xml:"oddFooter"` +} + +// xlsxOddHeader directly maps the oddHeader element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxOddHeader struct { + Content string `xml:",chardata"` +} + +// xlsxOddFooter directly maps the oddFooter element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxOddFooter struct { + Content string `xml:",chardata"` +} + +// xlsxPageSetUp directly maps the pageSetup element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxPageSetUp struct { + PaperSize string `xml:"paperSize,attr"` + Scale int `xml:"scale,attr"` + FirstPageNumber int `xml:"firstPageNumber,attr"` + FitToWidth int `xml:"fitToWidth,attr"` + FitToHeight int `xml:"fitToHeight,attr"` + PageOrder string `xml:"pageOrder,attr"` + Orientation string `xml:"orientation,attr"` + UsePrinterDefaults bool `xml:"usePrinterDefaults,attr"` + BlackAndWhite bool `xml:"blackAndWhite,attr"` + Draft bool `xml:"draft,attr"` + CellComments string `xml:"cellComments,attr"` + UseFirstPageNumber bool `xml:"useFirstPageNumber,attr"` + HorizontalDPI float32 `xml:"horizontalDpi,attr"` + VerticalDPI float32 `xml:"verticalDpi,attr"` + Copies int `xml:"copies,attr"` +} + +// xlsxPrintOptions directly maps the printOptions element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxPrintOptions struct { + Headings bool `xml:"headings,attr"` + GridLines bool `xml:"gridLines,attr"` + GridLinesSet bool `xml:"gridLinesSet,attr"` + HorizontalCentered bool `xml:"horizontalCentered,attr"` + VerticalCentered bool `xml:"verticalCentered,attr"` +} + +// xlsxPageMargins directly maps the pageMargins element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxPageMargins struct { + Left float64 `xml:"left,attr"` + Right float64 `xml:"right,attr"` + Top float64 `xml:"top,attr"` + Bottom float64 `xml:"bottom,attr"` + Header float64 `xml:"header,attr"` + Footer float64 `xml:"footer,attr"` +} + +// xlsxSheetFormatPr directly maps the sheetFormatPr element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxSheetFormatPr struct { + DefaultColWidth float64 `xml:"defaultColWidth,attr,omitempty"` + DefaultRowHeight float64 `xml:"defaultRowHeight,attr"` + OutlineLevelCol uint8 `xml:"outlineLevelCol,attr,omitempty"` + OutlineLevelRow uint8 `xml:"outlineLevelRow,attr,omitempty"` +} + +// xlsxSheetViews directly maps the sheetViews element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxSheetViews struct { + SheetView []xlsxSheetView `xml:"sheetView"` +} + +// xlsxSheetView directly maps the sheetView element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxSheetView struct { + WindowProtection bool `xml:"windowProtection,attr"` + ShowFormulas bool `xml:"showFormulas,attr"` + ShowGridLines bool `xml:"showGridLines,attr"` + ShowRowColHeaders bool `xml:"showRowColHeaders,attr"` + ShowZeros bool `xml:"showZeros,attr"` + RightToLeft bool `xml:"rightToLeft,attr"` + TabSelected bool `xml:"tabSelected,attr"` + ShowOutlineSymbols bool `xml:"showOutlineSymbols,attr"` + DefaultGridColor bool `xml:"defaultGridColor,attr"` + View string `xml:"view,attr"` + TopLeftCell string `xml:"topLeftCell,attr"` + ColorId int `xml:"colorId,attr"` + ZoomScale float64 `xml:"zoomScale,attr"` + ZoomScaleNormal float64 `xml:"zoomScaleNormal,attr"` + ZoomScalePageLayoutView float64 `xml:"zoomScalePageLayoutView,attr"` + WorkbookViewId int `xml:"workbookViewId,attr"` + Pane *xlsxPane `xml:"pane"` + Selection []xlsxSelection `xml:"selection"` +} + +// xlsxSelection directly maps the selection element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxSelection struct { + Pane string `xml:"pane,attr"` + ActiveCell string `xml:"activeCell,attr"` + ActiveCellId int `xml:"activeCellId,attr"` + SQRef string `xml:"sqref,attr"` +} + +// xlsxSelection directly maps the selection element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxPane struct { + XSplit float64 `xml:"xSplit,attr"` + YSplit float64 `xml:"ySplit,attr"` + TopLeftCell string `xml:"topLeftCell,attr"` + ActivePane string `xml:"activePane,attr"` + State string `xml:"state,attr"` // Either "split" or "frozen" +} + +// xlsxSheetPr directly maps the sheetPr element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxSheetPr struct { + FilterMode bool `xml:"filterMode,attr"` + PageSetUpPr []xlsxPageSetUpPr `xml:"pageSetUpPr"` +} + +// xlsxPageSetUpPr directly maps the pageSetupPr element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxPageSetUpPr struct { + FitToPage bool `xml:"fitToPage,attr"` +} + +// xlsxCols directly maps the cols element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxCols struct { + Col []xlsxCol `xml:"col"` +} + +// xlsxCol directly maps the col element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxCol struct { + Collapsed bool `xml:"collapsed,attr"` + Hidden bool `xml:"hidden,attr"` + Max int `xml:"max,attr"` + Min int `xml:"min,attr"` + Style int `xml:"style,attr"` + Width float64 `xml:"width,attr"` + CustomWidth bool `xml:"customWidth,attr,omitempty"` + OutlineLevel uint8 `xml:"outlineLevel,attr,omitempty"` +} + +// xlsxDimension directly maps the dimension element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxDimension struct { + Ref string `xml:"ref,attr"` +} + +// xlsxSheetData directly maps the sheetData element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxSheetData struct { + XMLName xml.Name `xml:"sheetData"` + Row []xlsxRow `xml:"row"` +} + +// xlsxRow directly maps the row element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxRow struct { + R int `xml:"r,attr"` + Spans string `xml:"spans,attr,omitempty"` + Hidden bool `xml:"hidden,attr,omitempty"` + C []xlsxC `xml:"c"` + Ht string `xml:"ht,attr,omitempty"` + CustomHeight bool `xml:"customHeight,attr,omitempty"` + OutlineLevel uint8 `xml:"outlineLevel,attr,omitempty"` +} + +type xlsxAutoFilter struct { + Ref string `xml:"ref,attr"` +} + +type xlsxMergeCell struct { + Ref string `xml:"ref,attr"` // ref: horiz "A1:C1", vert "B3:B6", both "D3:G4" +} + +type xlsxMergeCells struct { + XMLName xml.Name //`xml:"mergeCells,omitempty"` + Count int `xml:"count,attr,omitempty"` + Cells []xlsxMergeCell `xml:"mergeCell,omitempty"` +} + +// Return the cartesian extent of a merged cell range from its origin +// cell (the closest merged cell to the to left of the sheet. +func (mc *xlsxMergeCells) getExtent(cellRef string) (int, int, error) { + if mc == nil { + return 0, 0, nil + } + for _, cell := range mc.Cells { + if strings.HasPrefix(cell.Ref, cellRef+":") { + parts := strings.Split(cell.Ref, ":") + startx, starty, err := GetCoordsFromCellIDString(parts[0]) + if err != nil { + return -1, -1, err + } + endx, endy, err := GetCoordsFromCellIDString(parts[1]) + if err != nil { + return -2, -2, err + } + return endx - startx, endy - starty, nil + } + } + return 0, 0, nil +} + +// xlsxC directly maps the c element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxC struct { + R string `xml:"r,attr"` // Cell ID, e.g. A1 + S int `xml:"s,attr,omitempty"` // Style reference. + T string `xml:"t,attr,omitempty"` // Type. + F *xlsxF `xml:"f,omitempty"` // Formula + V string `xml:"v,omitempty"` // Value + Is *xlsxSI `xml:"is,omitempty"` // Inline String. +} + +// xlsxF directly maps the f element in the namespace +// http://schemas.openxmlformats.org/spreadsheetml/2006/main - +// currently I have not checked it for completeness - it does as much +// as I need. +type xlsxF struct { + Content string `xml:",chardata"` + T string `xml:"t,attr,omitempty"` // Formula type + Ref string `xml:"ref,attr,omitempty"` // Shared formula ref + Si int `xml:"si,attr,omitempty"` // Shared formula index +} + +// Create a new XLSX Worksheet with default values populated. +// Strictly for internal use only! +func newXlsxWorksheet() (worksheet *xlsxWorksheet) { + worksheet = &xlsxWorksheet{} + worksheet.SheetPr.FilterMode = false + worksheet.SheetPr.PageSetUpPr = make([]xlsxPageSetUpPr, 1) + worksheet.SheetPr.PageSetUpPr[0] = xlsxPageSetUpPr{FitToPage: false} + worksheet.SheetViews.SheetView = make([]xlsxSheetView, 1) + worksheet.SheetViews.SheetView[0] = xlsxSheetView{ + ColorId: 64, + DefaultGridColor: true, + RightToLeft: false, + Selection: make([]xlsxSelection, 1), + ShowFormulas: false, + ShowGridLines: true, + ShowOutlineSymbols: true, + ShowRowColHeaders: true, + ShowZeros: true, + TabSelected: false, + TopLeftCell: "A1", + View: "normal", + WindowProtection: false, + WorkbookViewId: 0, + ZoomScale: 100, + ZoomScaleNormal: 100, + ZoomScalePageLayoutView: 100} + worksheet.SheetViews.SheetView[0].Selection[0] = xlsxSelection{ + Pane: "topLeft", + ActiveCell: "A1", + ActiveCellId: 0, + SQRef: "A1"} + worksheet.SheetFormatPr.DefaultRowHeight = 12.85 + worksheet.PrintOptions.Headings = false + worksheet.PrintOptions.GridLines = false + worksheet.PrintOptions.GridLinesSet = true + worksheet.PrintOptions.HorizontalCentered = false + worksheet.PrintOptions.VerticalCentered = false + worksheet.PageMargins.Left = 0.7875 + worksheet.PageMargins.Right = 0.7875 + worksheet.PageMargins.Top = 1.05277777777778 + worksheet.PageMargins.Bottom = 1.05277777777778 + worksheet.PageMargins.Header = 0.7875 + worksheet.PageMargins.Footer = 0.7875 + worksheet.PageSetUp.PaperSize = "9" + worksheet.PageSetUp.Scale = 100 + worksheet.PageSetUp.FirstPageNumber = 1 + worksheet.PageSetUp.FitToWidth = 1 + worksheet.PageSetUp.FitToHeight = 1 + worksheet.PageSetUp.PageOrder = "downThenOver" + worksheet.PageSetUp.Orientation = "portrait" + worksheet.PageSetUp.UsePrinterDefaults = false + worksheet.PageSetUp.BlackAndWhite = false + worksheet.PageSetUp.Draft = false + worksheet.PageSetUp.CellComments = "none" + worksheet.PageSetUp.UseFirstPageNumber = true + worksheet.PageSetUp.HorizontalDPI = 300 + worksheet.PageSetUp.VerticalDPI = 300 + worksheet.PageSetUp.Copies = 1 + worksheet.HeaderFooter.OddHeader = make([]xlsxOddHeader, 1) + worksheet.HeaderFooter.OddHeader[0] = xlsxOddHeader{Content: `&C&"Times New Roman,Regular"&12&A`} + worksheet.HeaderFooter.OddFooter = make([]xlsxOddFooter, 1) + worksheet.HeaderFooter.OddFooter[0] = xlsxOddFooter{Content: `&C&"Times New Roman,Regular"&12Page &P`} + + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/gjson/LICENSE b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/gjson/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..58f5819a4380fea7a84a9ebdecffc5c68b0a41eb --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/gjson/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2016 Josh Baker + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/gjson/README.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/gjson/README.md new file mode 100644 index 0000000000000000000000000000000000000000..70240d99279d3e4510ebd0c7001d669ae3c0bcc6 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/gjson/README.md @@ -0,0 +1,401 @@ +<p align="center"> +<img + src="logo.png" + width="240" height="78" border="0" alt="GJSON"> +<br> +<a href="https://travis-ci.org/tidwall/gjson"><img src="https://img.shields.io/travis/tidwall/gjson.svg?style=flat-square" alt="Build Status"></a> +<a href="https://godoc.org/github.com/tidwall/gjson"><img src="https://img.shields.io/badge/api-reference-blue.svg?style=flat-square" alt="GoDoc"></a> +<a href="http://tidwall.com/gjson-play"><img src="https://img.shields.io/badge/%F0%9F%8F%90-playground-9900cc.svg?style=flat-square" alt="GJSON Playground"></a> +</p> + + + +<p align="center">get json values quickly</a></p> + +GJSON is a Go package that provides a [fast](#performance) and [simple](#get-a-value) way to get values from a json document. +It has features such as [one line retrieval](#get-a-value), [dot notation paths](#path-syntax), [iteration](#iterate-through-an-object-or-array), and [parsing json lines](#json-lines). + +Also check out [SJSON](https://github.com/tidwall/sjson) for modifying json, and the [JJ](https://github.com/tidwall/jj) command line tool. + +Getting Started +=============== + +## Installing + +To start using GJSON, install Go and run `go get`: + +```sh +$ go get -u github.com/tidwall/gjson +``` + +This will retrieve the library. + +## Get a value +Get searches json for the specified path. A path is in dot syntax, such as "name.last" or "age". When the value is found it's returned immediately. + +```go +package main + +import "github.com/tidwall/gjson" + +const json = `{"name":{"first":"Janet","last":"Prichard"},"age":47}` + +func main() { + value := gjson.Get(json, "name.last") + println(value.String()) +} +``` + +This will print: + +``` +Prichard +``` +*There's also the [GetMany](#get-multiple-values-at-once) function to get multiple values at once, and [GetBytes](#working-with-bytes) for working with JSON byte slices.* + +## Path Syntax + +A path is a series of keys separated by a dot. +A key may contain special wildcard characters '\*' and '?'. +To access an array value use the index as the key. +To get the number of elements in an array or to access a child path, use the '#' character. +The dot and wildcard characters can be escaped with '\\'. + +```json +{ + "name": {"first": "Tom", "last": "Anderson"}, + "age":37, + "children": ["Sara","Alex","Jack"], + "fav.movie": "Deer Hunter", + "friends": [ + {"first": "Dale", "last": "Murphy", "age": 44}, + {"first": "Roger", "last": "Craig", "age": 68}, + {"first": "Jane", "last": "Murphy", "age": 47} + ] +} +``` +``` +"name.last" >> "Anderson" +"age" >> 37 +"children" >> ["Sara","Alex","Jack"] +"children.#" >> 3 +"children.1" >> "Alex" +"child*.2" >> "Jack" +"c?ildren.0" >> "Sara" +"fav\.movie" >> "Deer Hunter" +"friends.#.first" >> ["Dale","Roger","Jane"] +"friends.1.last" >> "Craig" +``` + +You can also query an array for the first match by using `#[...]`, or find all matches with `#[...]#`. +Queries support the `==`, `!=`, `<`, `<=`, `>`, `>=` comparison operators and the simple pattern matching `%` operator. + +``` +friends.#[last=="Murphy"].first >> "Dale" +friends.#[last=="Murphy"]#.first >> ["Dale","Jane"] +friends.#[age>45]#.last >> ["Craig","Murphy"] +friends.#[first%"D*"].last >> "Murphy" +``` + +## JSON Lines + +There's support for [JSON Lines](http://jsonlines.org/) using the `..` prefix, which treats a multilined document as an array. + +For example: + +``` +{"name": "Gilbert", "age": 61} +{"name": "Alexa", "age": 34} +{"name": "May", "age": 57} +{"name": "Deloise", "age": 44} +``` + +``` +..# >> 4 +..1 >> {"name": "Alexa", "age": 34} +..3 >> {"name": "Deloise", "age": 44} +..#.name >> ["Gilbert","Alexa","May","Deloise"] +..#[name="May"].age >> 57 +``` + +The `ForEachLines` function will iterate through JSON lines. + +```go +gjson.ForEachLine(json, func(line gjson.Result) bool{ + println(line.String()) + return true +}) +``` + +## Result Type + +GJSON supports the json types `string`, `number`, `bool`, and `null`. +Arrays and Objects are returned as their raw json types. + +The `Result` type holds one of these: + +``` +bool, for JSON booleans +float64, for JSON numbers +string, for JSON string literals +nil, for JSON null +``` + +To directly access the value: + +```go +result.Type // can be String, Number, True, False, Null, or JSON +result.Str // holds the string +result.Num // holds the float64 number +result.Raw // holds the raw json +result.Index // index of raw value in original json, zero means index unknown +``` + +There are a variety of handy functions that work on a result: + +```go +result.Exists() bool +result.Value() interface{} +result.Int() int64 +result.Uint() uint64 +result.Float() float64 +result.String() string +result.Bool() bool +result.Time() time.Time +result.Array() []gjson.Result +result.Map() map[string]gjson.Result +result.Get(path string) Result +result.ForEach(iterator func(key, value Result) bool) +result.Less(token Result, caseSensitive bool) bool +``` + +The `result.Value()` function returns an `interface{}` which requires type assertion and is one of the following Go types: + +The `result.Array()` function returns back an array of values. +If the result represents a non-existent value, then an empty array will be returned. +If the result is not a JSON array, the return value will be an array containing one result. + +```go +boolean >> bool +number >> float64 +string >> string +null >> nil +array >> []interface{} +object >> map[string]interface{} +``` + +### 64-bit integers + +The `result.Int()` and `result.Uint()` calls are capable of reading all 64 bits, allowing for large JSON integers. + +```go +result.Int() int64 // -9223372036854775808 to 9223372036854775807 +result.Uint() int64 // 0 to 18446744073709551615 +``` + +## Get nested array values + +Suppose you want all the last names from the following json: + +```json +{ + "programmers": [ + { + "firstName": "Janet", + "lastName": "McLaughlin", + }, { + "firstName": "Elliotte", + "lastName": "Hunter", + }, { + "firstName": "Jason", + "lastName": "Harold", + } + ] +} +``` + +You would use the path "programmers.#.lastName" like such: + +```go +result := gjson.Get(json, "programmers.#.lastName") +for _, name := range result.Array() { + println(name.String()) +} +``` + +You can also query an object inside an array: + +```go +name := gjson.Get(json, `programmers.#[lastName="Hunter"].firstName`) +println(name.String()) // prints "Elliotte" +``` + +## Iterate through an object or array + +The `ForEach` function allows for quickly iterating through an object or array. +The key and value are passed to the iterator function for objects. +Only the value is passed for arrays. +Returning `false` from an iterator will stop iteration. + +```go +result := gjson.Get(json, "programmers") +result.ForEach(func(key, value gjson.Result) bool { + println(value.String()) + return true // keep iterating +}) +``` + +## Simple Parse and Get + +There's a `Parse(json)` function that will do a simple parse, and `result.Get(path)` that will search a result. + +For example, all of these will return the same result: + +```go +gjson.Parse(json).Get("name").Get("last") +gjson.Get(json, "name").Get("last") +gjson.Get(json, "name.last") +``` + +## Check for the existence of a value + +Sometimes you just want to know if a value exists. + +```go +value := gjson.Get(json, "name.last") +if !value.Exists() { + println("no last name") +} else { + println(value.String()) +} + +// Or as one step +if gjson.Get(json, "name.last").Exists() { + println("has a last name") +} +``` + +## Validate JSON + +The `Get*` and `Parse*` functions expects that the json is well-formed. Bad json will not panic, but it may return back unexpected results. + +If you are consuming JSON from an unpredictable source then you may want to validate prior to using GJSON. + +```go +if !gjson.Valid(json) { + return errors.New("invalid json") +} +value := gjson.Get(json, "name.last") +``` + +## Unmarshal to a map + +To unmarshal to a `map[string]interface{}`: + +```go +m, ok := gjson.Parse(json).Value().(map[string]interface{}) +if !ok { + // not a map +} +``` + +## Working with Bytes + +If your JSON is contained in a `[]byte` slice, there's the [GetBytes](https://godoc.org/github.com/tidwall/gjson#GetBytes) function. This is preferred over `Get(string(data), path)`. + +```go +var json []byte = ... +result := gjson.GetBytes(json, path) +``` + +If you are using the `gjson.GetBytes(json, path)` function and you want to avoid converting `result.Raw` to a `[]byte`, then you can use this pattern: + +```go +var json []byte = ... +result := gjson.GetBytes(json, path) +var raw []byte +if result.Index > 0 { + raw = json[result.Index:result.Index+len(result.Raw)] +} else { + raw = []byte(result.Raw) +} +``` + +This is a best-effort no allocation sub slice of the original json. This method utilizes the `result.Index` field, which is the position of the raw data in the original json. It's possible that the value of `result.Index` equals zero, in which case the `result.Raw` is converted to a `[]byte`. + +## Get multiple values at once + +The `GetMany` function can be used to get multiple values at the same time. + +```go +results := gjson.GetMany(json, "name.first", "name.last", "age") +``` + +The return value is a `[]Result`, which will always contain exactly the same number of items as the input paths. + +## Performance + +Benchmarks of GJSON alongside [encoding/json](https://golang.org/pkg/encoding/json/), +[ffjson](https://github.com/pquerna/ffjson), +[EasyJSON](https://github.com/mailru/easyjson), +[jsonparser](https://github.com/buger/jsonparser), +and [json-iterator](https://github.com/json-iterator/go) + +``` +BenchmarkGJSONGet-8 3000000 372 ns/op 0 B/op 0 allocs/op +BenchmarkGJSONUnmarshalMap-8 900000 4154 ns/op 1920 B/op 26 allocs/op +BenchmarkJSONUnmarshalMap-8 600000 9019 ns/op 3048 B/op 69 allocs/op +BenchmarkJSONDecoder-8 300000 14120 ns/op 4224 B/op 184 allocs/op +BenchmarkFFJSONLexer-8 1500000 3111 ns/op 896 B/op 8 allocs/op +BenchmarkEasyJSONLexer-8 3000000 887 ns/op 613 B/op 6 allocs/op +BenchmarkJSONParserGet-8 3000000 499 ns/op 21 B/op 0 allocs/op +BenchmarkJSONIterator-8 3000000 812 ns/op 544 B/op 9 allocs/op +``` + +JSON document used: + +```json +{ + "widget": { + "debug": "on", + "window": { + "title": "Sample Konfabulator Widget", + "name": "main_window", + "width": 500, + "height": 500 + }, + "image": { + "src": "Images/Sun.png", + "hOffset": 250, + "vOffset": 250, + "alignment": "center" + }, + "text": { + "data": "Click Here", + "size": 36, + "style": "bold", + "vOffset": 100, + "alignment": "center", + "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;" + } + } +} +``` + +Each operation was rotated though one of the following search paths: + +``` +widget.window.name +widget.image.hOffset +widget.text.onMouseUp +``` + +*These benchmarks were run on a MacBook Pro 15" 2.8 GHz Intel Core i7 using Go 1.8 and can be be found [here](https://github.com/tidwall/gjson-benchmarks).* + + +## Contact +Josh Baker [@tidwall](http://twitter.com/tidwall) + +## License + +GJSON source code is available under the MIT [License](/LICENSE). diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/gjson/gjson.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/gjson/gjson.go new file mode 100644 index 0000000000000000000000000000000000000000..1da1552e923c1386b77ec04b761014ea7e38459c --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/gjson/gjson.go @@ -0,0 +1,2104 @@ +// Package gjson provides searching for json strings. +package gjson + +import ( + "encoding/base64" + "encoding/json" + "errors" + "reflect" + "strconv" + "strings" + "sync" + "sync/atomic" + "time" + "unicode/utf16" + "unicode/utf8" + + "github.com/tidwall/match" +) + +// Type is Result type +type Type int + +const ( + // Null is a null json value + Null Type = iota + // False is a json false boolean + False + // Number is json number + Number + // String is a json string + String + // True is a json true boolean + True + // JSON is a raw block of JSON + JSON +) + +// String returns a string representation of the type. +func (t Type) String() string { + switch t { + default: + return "" + case Null: + return "Null" + case False: + return "False" + case Number: + return "Number" + case String: + return "String" + case True: + return "True" + case JSON: + return "JSON" + } +} + +// Result represents a json value that is returned from Get(). +type Result struct { + // Type is the json type + Type Type + // Raw is the raw json + Raw string + // Str is the json string + Str string + // Num is the json number + Num float64 + // Index of raw value in original json, zero means index unknown + Index int +} + +// String returns a string representation of the value. +func (t Result) String() string { + switch t.Type { + default: + return "" + case False: + return "false" + case Number: + if len(t.Raw) == 0 { + // calculated result + return strconv.FormatFloat(t.Num, 'f', -1, 64) + } + var i int + if t.Raw[0] == '-' { + i++ + } + for ; i < len(t.Raw); i++ { + if t.Raw[i] < '0' || t.Raw[i] > '9' { + return strconv.FormatFloat(t.Num, 'f', -1, 64) + } + } + return t.Raw + case String: + return t.Str + case JSON: + return t.Raw + case True: + return "true" + } +} + +// Bool returns an boolean representation. +func (t Result) Bool() bool { + switch t.Type { + default: + return false + case True: + return true + case String: + return t.Str != "" && t.Str != "0" && t.Str != "false" + case Number: + return t.Num != 0 + } +} + +// Int returns an integer representation. +func (t Result) Int() int64 { + switch t.Type { + default: + return 0 + case True: + return 1 + case String: + n, _ := parseInt(t.Str) + return n + case Number: + // try to directly convert the float64 to int64 + n, ok := floatToInt(t.Num) + if !ok { + // now try to parse the raw string + n, ok = parseInt(t.Raw) + if !ok { + // fallback to a standard conversion + return int64(t.Num) + } + } + return n + } +} + +// Uint returns an unsigned integer representation. +func (t Result) Uint() uint64 { + switch t.Type { + default: + return 0 + case True: + return 1 + case String: + n, _ := parseUint(t.Str) + return n + case Number: + // try to directly convert the float64 to uint64 + n, ok := floatToUint(t.Num) + if !ok { + // now try to parse the raw string + n, ok = parseUint(t.Raw) + if !ok { + // fallback to a standard conversion + return uint64(t.Num) + } + } + return n + } +} + +// Float returns an float64 representation. +func (t Result) Float() float64 { + switch t.Type { + default: + return 0 + case True: + return 1 + case String: + n, _ := strconv.ParseFloat(t.Str, 64) + return n + case Number: + return t.Num + } +} + +// Time returns a time.Time representation. +func (t Result) Time() time.Time { + res, _ := time.Parse(time.RFC3339, t.String()) + return res +} + +// Array returns back an array of values. +// If the result represents a non-existent value, then an empty array will be returned. +// If the result is not a JSON array, the return value will be an array containing one result. +func (t Result) Array() []Result { + if t.Type == Null { + return []Result{} + } + if t.Type != JSON { + return []Result{t} + } + r := t.arrayOrMap('[', false) + return r.a +} + +// IsObject returns true if the result value is a JSON object. +func (t Result) IsObject() bool { + return t.Type == JSON && len(t.Raw) > 0 && t.Raw[0] == '{' +} + +// IsArray returns true if the result value is a JSON array. +func (t Result) IsArray() bool { + return t.Type == JSON && len(t.Raw) > 0 && t.Raw[0] == '[' +} + +// ForEach iterates through values. +// If the result represents a non-existent value, then no values will be iterated. +// If the result is an Object, the iterator will pass the key and value of each item. +// If the result is an Array, the iterator will only pass the value of each item. +// If the result is not a JSON array or object, the iterator will pass back one value equal to the result. +func (t Result) ForEach(iterator func(key, value Result) bool) { + if !t.Exists() { + return + } + if t.Type != JSON { + iterator(Result{}, t) + return + } + json := t.Raw + var keys bool + var i int + var key, value Result + for ; i < len(json); i++ { + if json[i] == '{' { + i++ + key.Type = String + keys = true + break + } else if json[i] == '[' { + i++ + break + } + if json[i] > ' ' { + return + } + } + var str string + var vesc bool + var ok bool + for ; i < len(json); i++ { + if keys { + if json[i] != '"' { + continue + } + s := i + i, str, vesc, ok = parseString(json, i+1) + if !ok { + return + } + if vesc { + key.Str = unescape(str[1 : len(str)-1]) + } else { + key.Str = str[1 : len(str)-1] + } + key.Raw = str + key.Index = s + } + for ; i < len(json); i++ { + if json[i] <= ' ' || json[i] == ',' || json[i] == ':' { + continue + } + break + } + s := i + i, value, ok = parseAny(json, i, true) + if !ok { + return + } + value.Index = s + if !iterator(key, value) { + return + } + } +} + +// Map returns back an map of values. The result should be a JSON array. +func (t Result) Map() map[string]Result { + if t.Type != JSON { + return map[string]Result{} + } + r := t.arrayOrMap('{', false) + return r.o +} + +// Get searches result for the specified path. +// The result should be a JSON array or object. +func (t Result) Get(path string) Result { + return Get(t.Raw, path) +} + +type arrayOrMapResult struct { + a []Result + ai []interface{} + o map[string]Result + oi map[string]interface{} + vc byte +} + +func (t Result) arrayOrMap(vc byte, valueize bool) (r arrayOrMapResult) { + var json = t.Raw + var i int + var value Result + var count int + var key Result + if vc == 0 { + for ; i < len(json); i++ { + if json[i] == '{' || json[i] == '[' { + r.vc = json[i] + i++ + break + } + if json[i] > ' ' { + goto end + } + } + } else { + for ; i < len(json); i++ { + if json[i] == vc { + i++ + break + } + if json[i] > ' ' { + goto end + } + } + r.vc = vc + } + if r.vc == '{' { + if valueize { + r.oi = make(map[string]interface{}) + } else { + r.o = make(map[string]Result) + } + } else { + if valueize { + r.ai = make([]interface{}, 0) + } else { + r.a = make([]Result, 0) + } + } + for ; i < len(json); i++ { + if json[i] <= ' ' { + continue + } + // get next value + if json[i] == ']' || json[i] == '}' { + break + } + switch json[i] { + default: + if (json[i] >= '0' && json[i] <= '9') || json[i] == '-' { + value.Type = Number + value.Raw, value.Num = tonum(json[i:]) + } else { + continue + } + case '{', '[': + value.Type = JSON + value.Raw = squash(json[i:]) + case 'n': + value.Type = Null + value.Raw = tolit(json[i:]) + case 't': + value.Type = True + value.Raw = tolit(json[i:]) + case 'f': + value.Type = False + value.Raw = tolit(json[i:]) + case '"': + value.Type = String + value.Raw, value.Str = tostr(json[i:]) + } + i += len(value.Raw) - 1 + + if r.vc == '{' { + if count%2 == 0 { + key = value + } else { + if valueize { + if _, ok := r.oi[key.Str]; !ok { + r.oi[key.Str] = value.Value() + } + } else { + if _, ok := r.o[key.Str]; !ok { + r.o[key.Str] = value + } + } + } + count++ + } else { + if valueize { + r.ai = append(r.ai, value.Value()) + } else { + r.a = append(r.a, value) + } + } + } +end: + return +} + +// Parse parses the json and returns a result. +// +// This function expects that the json is well-formed, and does not validate. +// Invalid json will not panic, but it may return back unexpected results. +// If you are consuming JSON from an unpredictable source then you may want to +// use the Valid function first. +func Parse(json string) Result { + var value Result + for i := 0; i < len(json); i++ { + if json[i] == '{' || json[i] == '[' { + value.Type = JSON + value.Raw = json[i:] // just take the entire raw + break + } + if json[i] <= ' ' { + continue + } + switch json[i] { + default: + if (json[i] >= '0' && json[i] <= '9') || json[i] == '-' { + value.Type = Number + value.Raw, value.Num = tonum(json[i:]) + } else { + return Result{} + } + case 'n': + value.Type = Null + value.Raw = tolit(json[i:]) + case 't': + value.Type = True + value.Raw = tolit(json[i:]) + case 'f': + value.Type = False + value.Raw = tolit(json[i:]) + case '"': + value.Type = String + value.Raw, value.Str = tostr(json[i:]) + } + break + } + return value +} + +// ParseBytes parses the json and returns a result. +// If working with bytes, this method preferred over Parse(string(data)) +func ParseBytes(json []byte) Result { + return Parse(string(json)) +} + +func squash(json string) string { + // expects that the lead character is a '[' or '{' + // squash the value, ignoring all nested arrays and objects. + // the first '[' or '{' has already been read + depth := 1 + for i := 1; i < len(json); i++ { + if json[i] >= '"' && json[i] <= '}' { + switch json[i] { + case '"': + i++ + s2 := i + for ; i < len(json); i++ { + if json[i] > '\\' { + continue + } + if json[i] == '"' { + // look for an escaped slash + if json[i-1] == '\\' { + n := 0 + for j := i - 2; j > s2-1; j-- { + if json[j] != '\\' { + break + } + n++ + } + if n%2 == 0 { + continue + } + } + break + } + } + case '{', '[': + depth++ + case '}', ']': + depth-- + if depth == 0 { + return json[:i+1] + } + } + } + } + return json +} + +func tonum(json string) (raw string, num float64) { + for i := 1; i < len(json); i++ { + // less than dash might have valid characters + if json[i] <= '-' { + if json[i] <= ' ' || json[i] == ',' { + // break on whitespace and comma + raw = json[:i] + num, _ = strconv.ParseFloat(raw, 64) + return + } + // could be a '+' or '-'. let's assume so. + continue + } + if json[i] < ']' { + // probably a valid number + continue + } + if json[i] == 'e' || json[i] == 'E' { + // allow for exponential numbers + continue + } + // likely a ']' or '}' + raw = json[:i] + num, _ = strconv.ParseFloat(raw, 64) + return + } + raw = json + num, _ = strconv.ParseFloat(raw, 64) + return +} + +func tolit(json string) (raw string) { + for i := 1; i < len(json); i++ { + if json[i] < 'a' || json[i] > 'z' { + return json[:i] + } + } + return json +} + +func tostr(json string) (raw string, str string) { + // expects that the lead character is a '"' + for i := 1; i < len(json); i++ { + if json[i] > '\\' { + continue + } + if json[i] == '"' { + return json[:i+1], json[1:i] + } + if json[i] == '\\' { + i++ + for ; i < len(json); i++ { + if json[i] > '\\' { + continue + } + if json[i] == '"' { + // look for an escaped slash + if json[i-1] == '\\' { + n := 0 + for j := i - 2; j > 0; j-- { + if json[j] != '\\' { + break + } + n++ + } + if n%2 == 0 { + continue + } + } + break + } + } + var ret string + if i+1 < len(json) { + ret = json[:i+1] + } else { + ret = json[:i] + } + return ret, unescape(json[1:i]) + } + } + return json, json[1:] +} + +// Exists returns true if value exists. +// +// if gjson.Get(json, "name.last").Exists(){ +// println("value exists") +// } +func (t Result) Exists() bool { + return t.Type != Null || len(t.Raw) != 0 +} + +// Value returns one of these types: +// +// bool, for JSON booleans +// float64, for JSON numbers +// Number, for JSON numbers +// string, for JSON string literals +// nil, for JSON null +// map[string]interface{}, for JSON objects +// []interface{}, for JSON arrays +// +func (t Result) Value() interface{} { + if t.Type == String { + return t.Str + } + switch t.Type { + default: + return nil + case False: + return false + case Number: + return t.Num + case JSON: + r := t.arrayOrMap(0, true) + if r.vc == '{' { + return r.oi + } else if r.vc == '[' { + return r.ai + } + return nil + case True: + return true + } +} + +func parseString(json string, i int) (int, string, bool, bool) { + var s = i + for ; i < len(json); i++ { + if json[i] > '\\' { + continue + } + if json[i] == '"' { + return i + 1, json[s-1 : i+1], false, true + } + if json[i] == '\\' { + i++ + for ; i < len(json); i++ { + if json[i] > '\\' { + continue + } + if json[i] == '"' { + // look for an escaped slash + if json[i-1] == '\\' { + n := 0 + for j := i - 2; j > 0; j-- { + if json[j] != '\\' { + break + } + n++ + } + if n%2 == 0 { + continue + } + } + return i + 1, json[s-1 : i+1], true, true + } + } + break + } + } + return i, json[s-1:], false, false +} + +func parseNumber(json string, i int) (int, string) { + var s = i + i++ + for ; i < len(json); i++ { + if json[i] <= ' ' || json[i] == ',' || json[i] == ']' || json[i] == '}' { + return i, json[s:i] + } + } + return i, json[s:] +} + +func parseLiteral(json string, i int) (int, string) { + var s = i + i++ + for ; i < len(json); i++ { + if json[i] < 'a' || json[i] > 'z' { + return i, json[s:i] + } + } + return i, json[s:] +} + +type arrayPathResult struct { + part string + path string + more bool + alogok bool + arrch bool + alogkey string + query struct { + on bool + path string + op string + value string + all bool + } +} + +func parseArrayPath(path string) (r arrayPathResult) { + for i := 0; i < len(path); i++ { + if path[i] == '.' { + r.part = path[:i] + r.path = path[i+1:] + r.more = true + return + } + if path[i] == '#' { + r.arrch = true + if i == 0 && len(path) > 1 { + if path[1] == '.' { + r.alogok = true + r.alogkey = path[2:] + r.path = path[:1] + } else if path[1] == '[' { + r.query.on = true + // query + i += 2 + // whitespace + for ; i < len(path); i++ { + if path[i] > ' ' { + break + } + } + s := i + for ; i < len(path); i++ { + if path[i] <= ' ' || + path[i] == '!' || + path[i] == '=' || + path[i] == '<' || + path[i] == '>' || + path[i] == '%' || + path[i] == ']' { + break + } + } + r.query.path = path[s:i] + // whitespace + for ; i < len(path); i++ { + if path[i] > ' ' { + break + } + } + if i < len(path) { + s = i + if path[i] == '!' { + if i < len(path)-1 && path[i+1] == '=' { + i++ + } + } else if path[i] == '<' || path[i] == '>' { + if i < len(path)-1 && path[i+1] == '=' { + i++ + } + } else if path[i] == '=' { + if i < len(path)-1 && path[i+1] == '=' { + s++ + i++ + } + } + i++ + r.query.op = path[s:i] + // whitespace + for ; i < len(path); i++ { + if path[i] > ' ' { + break + } + } + s = i + for ; i < len(path); i++ { + if path[i] == '"' { + i++ + s2 := i + for ; i < len(path); i++ { + if path[i] > '\\' { + continue + } + if path[i] == '"' { + // look for an escaped slash + if path[i-1] == '\\' { + n := 0 + for j := i - 2; j > s2-1; j-- { + if path[j] != '\\' { + break + } + n++ + } + if n%2 == 0 { + continue + } + } + break + } + } + } else if path[i] == ']' { + if i+1 < len(path) && path[i+1] == '#' { + r.query.all = true + } + break + } + } + if i > len(path) { + i = len(path) + } + v := path[s:i] + for len(v) > 0 && v[len(v)-1] <= ' ' { + v = v[:len(v)-1] + } + r.query.value = v + } + } + } + continue + } + } + r.part = path + r.path = "" + return +} + +type objectPathResult struct { + part string + path string + wild bool + more bool +} + +func parseObjectPath(path string) (r objectPathResult) { + for i := 0; i < len(path); i++ { + if path[i] == '.' { + r.part = path[:i] + r.path = path[i+1:] + r.more = true + return + } + if path[i] == '*' || path[i] == '?' { + r.wild = true + continue + } + if path[i] == '\\' { + // go into escape mode. this is a slower path that + // strips off the escape character from the part. + epart := []byte(path[:i]) + i++ + if i < len(path) { + epart = append(epart, path[i]) + i++ + for ; i < len(path); i++ { + if path[i] == '\\' { + i++ + if i < len(path) { + epart = append(epart, path[i]) + } + continue + } else if path[i] == '.' { + r.part = string(epart) + r.path = path[i+1:] + r.more = true + return + } else if path[i] == '*' || path[i] == '?' { + r.wild = true + } + epart = append(epart, path[i]) + } + } + // append the last part + r.part = string(epart) + return + } + } + r.part = path + return +} + +func parseSquash(json string, i int) (int, string) { + // expects that the lead character is a '[' or '{' + // squash the value, ignoring all nested arrays and objects. + // the first '[' or '{' has already been read + s := i + i++ + depth := 1 + for ; i < len(json); i++ { + if json[i] >= '"' && json[i] <= '}' { + switch json[i] { + case '"': + i++ + s2 := i + for ; i < len(json); i++ { + if json[i] > '\\' { + continue + } + if json[i] == '"' { + // look for an escaped slash + if json[i-1] == '\\' { + n := 0 + for j := i - 2; j > s2-1; j-- { + if json[j] != '\\' { + break + } + n++ + } + if n%2 == 0 { + continue + } + } + break + } + } + case '{', '[': + depth++ + case '}', ']': + depth-- + if depth == 0 { + i++ + return i, json[s:i] + } + } + } + } + return i, json[s:] +} + +func parseObject(c *parseContext, i int, path string) (int, bool) { + var pmatch, kesc, vesc, ok, hit bool + var key, val string + rp := parseObjectPath(path) + for i < len(c.json) { + for ; i < len(c.json); i++ { + if c.json[i] == '"' { + // parse_key_string + // this is slightly different from getting s string value + // because we don't need the outer quotes. + i++ + var s = i + for ; i < len(c.json); i++ { + if c.json[i] > '\\' { + continue + } + if c.json[i] == '"' { + i, key, kesc, ok = i+1, c.json[s:i], false, true + goto parse_key_string_done + } + if c.json[i] == '\\' { + i++ + for ; i < len(c.json); i++ { + if c.json[i] > '\\' { + continue + } + if c.json[i] == '"' { + // look for an escaped slash + if c.json[i-1] == '\\' { + n := 0 + for j := i - 2; j > 0; j-- { + if c.json[j] != '\\' { + break + } + n++ + } + if n%2 == 0 { + continue + } + } + i, key, kesc, ok = i+1, c.json[s:i], true, true + goto parse_key_string_done + } + } + break + } + } + key, kesc, ok = c.json[s:], false, false + parse_key_string_done: + break + } + if c.json[i] == '}' { + return i + 1, false + } + } + if !ok { + return i, false + } + if rp.wild { + if kesc { + pmatch = match.Match(unescape(key), rp.part) + } else { + pmatch = match.Match(key, rp.part) + } + } else { + if kesc { + pmatch = rp.part == unescape(key) + } else { + pmatch = rp.part == key + } + } + hit = pmatch && !rp.more + for ; i < len(c.json); i++ { + switch c.json[i] { + default: + continue + case '"': + i++ + i, val, vesc, ok = parseString(c.json, i) + if !ok { + return i, false + } + if hit { + if vesc { + c.value.Str = unescape(val[1 : len(val)-1]) + } else { + c.value.Str = val[1 : len(val)-1] + } + c.value.Raw = val + c.value.Type = String + return i, true + } + case '{': + if pmatch && !hit { + i, hit = parseObject(c, i+1, rp.path) + if hit { + return i, true + } + } else { + i, val = parseSquash(c.json, i) + if hit { + c.value.Raw = val + c.value.Type = JSON + return i, true + } + } + case '[': + if pmatch && !hit { + i, hit = parseArray(c, i+1, rp.path) + if hit { + return i, true + } + } else { + i, val = parseSquash(c.json, i) + if hit { + c.value.Raw = val + c.value.Type = JSON + return i, true + } + } + case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + i, val = parseNumber(c.json, i) + if hit { + c.value.Raw = val + c.value.Type = Number + c.value.Num, _ = strconv.ParseFloat(val, 64) + return i, true + } + case 't', 'f', 'n': + vc := c.json[i] + i, val = parseLiteral(c.json, i) + if hit { + c.value.Raw = val + switch vc { + case 't': + c.value.Type = True + case 'f': + c.value.Type = False + } + return i, true + } + } + break + } + } + return i, false +} +func queryMatches(rp *arrayPathResult, value Result) bool { + rpv := rp.query.value + if len(rpv) > 2 && rpv[0] == '"' && rpv[len(rpv)-1] == '"' { + rpv = rpv[1 : len(rpv)-1] + } + switch value.Type { + case String: + switch rp.query.op { + case "=": + return value.Str == rpv + case "!=": + return value.Str != rpv + case "<": + return value.Str < rpv + case "<=": + return value.Str <= rpv + case ">": + return value.Str > rpv + case ">=": + return value.Str >= rpv + case "%": + return match.Match(value.Str, rpv) + } + case Number: + rpvn, _ := strconv.ParseFloat(rpv, 64) + switch rp.query.op { + case "=": + return value.Num == rpvn + case "!=": + return value.Num != rpvn + case "<": + return value.Num < rpvn + case "<=": + return value.Num <= rpvn + case ">": + return value.Num > rpvn + case ">=": + return value.Num >= rpvn + } + case True: + switch rp.query.op { + case "=": + return rpv == "true" + case "!=": + return rpv != "true" + case ">": + return rpv == "false" + case ">=": + return true + } + case False: + switch rp.query.op { + case "=": + return rpv == "false" + case "!=": + return rpv != "false" + case "<": + return rpv == "true" + case "<=": + return true + } + } + return false +} +func parseArray(c *parseContext, i int, path string) (int, bool) { + var pmatch, vesc, ok, hit bool + var val string + var h int + var alog []int + var partidx int + var multires []byte + rp := parseArrayPath(path) + if !rp.arrch { + n, ok := parseUint(rp.part) + if !ok { + partidx = -1 + } else { + partidx = int(n) + } + } + for i < len(c.json)+1 { + if !rp.arrch { + pmatch = partidx == h + hit = pmatch && !rp.more + } + h++ + if rp.alogok { + alog = append(alog, i) + } + for ; ; i++ { + var ch byte + if i > len(c.json) { + break + } else if i == len(c.json) { + ch = ']' + } else { + ch = c.json[i] + } + switch ch { + default: + continue + case '"': + i++ + i, val, vesc, ok = parseString(c.json, i) + if !ok { + return i, false + } + if hit { + if rp.alogok { + break + } + if vesc { + c.value.Str = unescape(val[1 : len(val)-1]) + } else { + c.value.Str = val[1 : len(val)-1] + } + c.value.Raw = val + c.value.Type = String + return i, true + } + case '{': + if pmatch && !hit { + i, hit = parseObject(c, i+1, rp.path) + if hit { + if rp.alogok { + break + } + return i, true + } + } else { + i, val = parseSquash(c.json, i) + if rp.query.on { + res := Get(val, rp.query.path) + if queryMatches(&rp, res) { + if rp.more { + res = Get(val, rp.path) + } else { + res = Result{Raw: val, Type: JSON} + } + if rp.query.all { + if len(multires) == 0 { + multires = append(multires, '[') + } else { + multires = append(multires, ',') + } + multires = append(multires, res.Raw...) + } else { + c.value = res + return i, true + } + } + } else if hit { + if rp.alogok { + break + } + c.value.Raw = val + c.value.Type = JSON + return i, true + } + } + case '[': + if pmatch && !hit { + i, hit = parseArray(c, i+1, rp.path) + if hit { + if rp.alogok { + break + } + return i, true + } + } else { + i, val = parseSquash(c.json, i) + if hit { + if rp.alogok { + break + } + c.value.Raw = val + c.value.Type = JSON + return i, true + } + } + case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + i, val = parseNumber(c.json, i) + if hit { + if rp.alogok { + break + } + c.value.Raw = val + c.value.Type = Number + c.value.Num, _ = strconv.ParseFloat(val, 64) + return i, true + } + case 't', 'f', 'n': + vc := c.json[i] + i, val = parseLiteral(c.json, i) + if hit { + if rp.alogok { + break + } + c.value.Raw = val + switch vc { + case 't': + c.value.Type = True + case 'f': + c.value.Type = False + } + return i, true + } + case ']': + if rp.arrch && rp.part == "#" { + if rp.alogok { + var jsons = make([]byte, 0, 64) + jsons = append(jsons, '[') + + for j, k := 0, 0; j < len(alog); j++ { + _, res, ok := parseAny(c.json, alog[j], true) + if ok { + res := res.Get(rp.alogkey) + if res.Exists() { + if k > 0 { + jsons = append(jsons, ',') + } + jsons = append(jsons, []byte(res.Raw)...) + k++ + } + } + } + jsons = append(jsons, ']') + c.value.Type = JSON + c.value.Raw = string(jsons) + return i + 1, true + } + if rp.alogok { + break + } + c.value.Raw = "" + c.value.Type = Number + c.value.Num = float64(h - 1) + c.calcd = true + return i + 1, true + } + if len(multires) > 0 && !c.value.Exists() { + c.value = Result{ + Raw: string(append(multires, ']')), + Type: JSON, + } + } + return i + 1, false + } + break + } + } + return i, false +} + +// ForEachLine iterates through lines of JSON as specified by the JSON Lines +// format (http://jsonlines.org/). +// Each line is returned as a GJSON Result. +func ForEachLine(json string, iterator func(line Result) bool) { + var res Result + var i int + for { + i, res, _ = parseAny(json, i, true) + if !res.Exists() { + break + } + if !iterator(res) { + return + } + } +} + +type parseContext struct { + json string + value Result + calcd bool + lines bool +} + +// Get searches json for the specified path. +// A path is in dot syntax, such as "name.last" or "age". +// When the value is found it's returned immediately. +// +// A path is a series of keys searated by a dot. +// A key may contain special wildcard characters '*' and '?'. +// To access an array value use the index as the key. +// To get the number of elements in an array or to access a child path, use the '#' character. +// The dot and wildcard character can be escaped with '\'. +// +// { +// "name": {"first": "Tom", "last": "Anderson"}, +// "age":37, +// "children": ["Sara","Alex","Jack"], +// "friends": [ +// {"first": "James", "last": "Murphy"}, +// {"first": "Roger", "last": "Craig"} +// ] +// } +// "name.last" >> "Anderson" +// "age" >> 37 +// "children" >> ["Sara","Alex","Jack"] +// "children.#" >> 3 +// "children.1" >> "Alex" +// "child*.2" >> "Jack" +// "c?ildren.0" >> "Sara" +// "friends.#.first" >> ["James","Roger"] +// +// This function expects that the json is well-formed, and does not validate. +// Invalid json will not panic, but it may return back unexpected results. +// If you are consuming JSON from an unpredictable source then you may want to +// use the Valid function first. +func Get(json, path string) Result { + var i int + var c = &parseContext{json: json} + if len(path) >= 2 && path[0] == '.' && path[1] == '.' { + c.lines = true + parseArray(c, 0, path[2:]) + } else { + for ; i < len(c.json); i++ { + if c.json[i] == '{' { + i++ + parseObject(c, i, path) + break + } + if c.json[i] == '[' { + i++ + parseArray(c, i, path) + break + } + } + } + fillIndex(json, c) + return c.value +} + +// GetBytes searches json for the specified path. +// If working with bytes, this method preferred over Get(string(data), path) +func GetBytes(json []byte, path string) Result { + return getBytes(json, path) +} + +// runeit returns the rune from the the \uXXXX +func runeit(json string) rune { + n, _ := strconv.ParseUint(json[:4], 16, 64) + return rune(n) +} + +// unescape unescapes a string +func unescape(json string) string { //, error) { + var str = make([]byte, 0, len(json)) + for i := 0; i < len(json); i++ { + switch { + default: + str = append(str, json[i]) + case json[i] < ' ': + return string(str) + case json[i] == '\\': + i++ + if i >= len(json) { + return string(str) + } + switch json[i] { + default: + return string(str) + case '\\': + str = append(str, '\\') + case '/': + str = append(str, '/') + case 'b': + str = append(str, '\b') + case 'f': + str = append(str, '\f') + case 'n': + str = append(str, '\n') + case 'r': + str = append(str, '\r') + case 't': + str = append(str, '\t') + case '"': + str = append(str, '"') + case 'u': + if i+5 > len(json) { + return string(str) + } + r := runeit(json[i+1:]) + i += 5 + if utf16.IsSurrogate(r) { + // need another code + if len(json[i:]) >= 6 && json[i] == '\\' && json[i+1] == 'u' { + // we expect it to be correct so just consume it + r = utf16.DecodeRune(r, runeit(json[i+2:])) + i += 6 + } + } + // provide enough space to encode the largest utf8 possible + str = append(str, 0, 0, 0, 0, 0, 0, 0, 0) + n := utf8.EncodeRune(str[len(str)-8:], r) + str = str[:len(str)-8+n] + i-- // backtrack index by one + } + } + } + return string(str) +} + +// Less return true if a token is less than another token. +// The caseSensitive paramater is used when the tokens are Strings. +// The order when comparing two different type is: +// +// Null < False < Number < String < True < JSON +// +func (t Result) Less(token Result, caseSensitive bool) bool { + if t.Type < token.Type { + return true + } + if t.Type > token.Type { + return false + } + if t.Type == String { + if caseSensitive { + return t.Str < token.Str + } + return stringLessInsensitive(t.Str, token.Str) + } + if t.Type == Number { + return t.Num < token.Num + } + return t.Raw < token.Raw +} + +func stringLessInsensitive(a, b string) bool { + for i := 0; i < len(a) && i < len(b); i++ { + if a[i] >= 'A' && a[i] <= 'Z' { + if b[i] >= 'A' && b[i] <= 'Z' { + // both are uppercase, do nothing + if a[i] < b[i] { + return true + } else if a[i] > b[i] { + return false + } + } else { + // a is uppercase, convert a to lowercase + if a[i]+32 < b[i] { + return true + } else if a[i]+32 > b[i] { + return false + } + } + } else if b[i] >= 'A' && b[i] <= 'Z' { + // b is uppercase, convert b to lowercase + if a[i] < b[i]+32 { + return true + } else if a[i] > b[i]+32 { + return false + } + } else { + // neither are uppercase + if a[i] < b[i] { + return true + } else if a[i] > b[i] { + return false + } + } + } + return len(a) < len(b) +} + +// parseAny parses the next value from a json string. +// A Result is returned when the hit param is set. +// The return values are (i int, res Result, ok bool) +func parseAny(json string, i int, hit bool) (int, Result, bool) { + var res Result + var val string + for ; i < len(json); i++ { + if json[i] == '{' || json[i] == '[' { + i, val = parseSquash(json, i) + if hit { + res.Raw = val + res.Type = JSON + } + return i, res, true + } + if json[i] <= ' ' { + continue + } + switch json[i] { + case '"': + i++ + var vesc bool + var ok bool + i, val, vesc, ok = parseString(json, i) + if !ok { + return i, res, false + } + if hit { + res.Type = String + res.Raw = val + if vesc { + res.Str = unescape(val[1 : len(val)-1]) + } else { + res.Str = val[1 : len(val)-1] + } + } + return i, res, true + case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + i, val = parseNumber(json, i) + if hit { + res.Raw = val + res.Type = Number + res.Num, _ = strconv.ParseFloat(val, 64) + } + return i, res, true + case 't', 'f', 'n': + vc := json[i] + i, val = parseLiteral(json, i) + if hit { + res.Raw = val + switch vc { + case 't': + res.Type = True + case 'f': + res.Type = False + } + return i, res, true + } + } + } + return i, res, false +} + +var ( // used for testing + testWatchForFallback bool + testLastWasFallback bool +) + +// GetMany searches json for the multiple paths. +// The return value is a Result array where the number of items +// will be equal to the number of input paths. +func GetMany(json string, path ...string) []Result { + res := make([]Result, len(path)) + for i, path := range path { + res[i] = Get(json, path) + } + return res +} + +// GetManyBytes searches json for the multiple paths. +// The return value is a Result array where the number of items +// will be equal to the number of input paths. +func GetManyBytes(json []byte, path ...string) []Result { + return GetMany(string(json), path...) +} + +var fieldsmu sync.RWMutex +var fields = make(map[string]map[string]int) + +func assign(jsval Result, goval reflect.Value) { + if jsval.Type == Null { + return + } + switch goval.Kind() { + default: + case reflect.Ptr: + if !goval.IsNil() { + newval := reflect.New(goval.Elem().Type()) + assign(jsval, newval.Elem()) + goval.Elem().Set(newval.Elem()) + } else { + newval := reflect.New(goval.Type().Elem()) + assign(jsval, newval.Elem()) + goval.Set(newval) + } + case reflect.Struct: + fieldsmu.RLock() + sf := fields[goval.Type().String()] + fieldsmu.RUnlock() + if sf == nil { + fieldsmu.Lock() + sf = make(map[string]int) + for i := 0; i < goval.Type().NumField(); i++ { + f := goval.Type().Field(i) + tag := strings.Split(f.Tag.Get("json"), ",")[0] + if tag != "-" { + if tag != "" { + sf[tag] = i + sf[f.Name] = i + } else { + sf[f.Name] = i + } + } + } + fields[goval.Type().String()] = sf + fieldsmu.Unlock() + } + jsval.ForEach(func(key, value Result) bool { + if idx, ok := sf[key.Str]; ok { + f := goval.Field(idx) + if f.CanSet() { + assign(value, f) + } + } + return true + }) + case reflect.Slice: + if goval.Type().Elem().Kind() == reflect.Uint8 && jsval.Type == String { + data, _ := base64.StdEncoding.DecodeString(jsval.String()) + goval.Set(reflect.ValueOf(data)) + } else { + jsvals := jsval.Array() + slice := reflect.MakeSlice(goval.Type(), len(jsvals), len(jsvals)) + for i := 0; i < len(jsvals); i++ { + assign(jsvals[i], slice.Index(i)) + } + goval.Set(slice) + } + case reflect.Array: + i, n := 0, goval.Len() + jsval.ForEach(func(_, value Result) bool { + if i == n { + return false + } + assign(value, goval.Index(i)) + i++ + return true + }) + case reflect.Map: + if goval.Type().Key().Kind() == reflect.String && goval.Type().Elem().Kind() == reflect.Interface { + goval.Set(reflect.ValueOf(jsval.Value())) + } + case reflect.Interface: + goval.Set(reflect.ValueOf(jsval.Value())) + case reflect.Bool: + goval.SetBool(jsval.Bool()) + case reflect.Float32, reflect.Float64: + goval.SetFloat(jsval.Float()) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + goval.SetInt(jsval.Int()) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + goval.SetUint(jsval.Uint()) + case reflect.String: + goval.SetString(jsval.String()) + } + if len(goval.Type().PkgPath()) > 0 { + v := goval.Addr() + if v.Type().NumMethod() > 0 { + if u, ok := v.Interface().(json.Unmarshaler); ok { + u.UnmarshalJSON([]byte(jsval.Raw)) + } + } + } +} + +var validate uintptr = 1 + +// UnmarshalValidationEnabled provides the option to disable JSON validation +// during the Unmarshal routine. Validation is enabled by default. +// +// Deprecated: Use encoder/json.Unmarshal instead +func UnmarshalValidationEnabled(enabled bool) { + if enabled { + atomic.StoreUintptr(&validate, 1) + } else { + atomic.StoreUintptr(&validate, 0) + } +} + +// Unmarshal loads the JSON data into the value pointed to by v. +// +// This function works almost identically to json.Unmarshal except that +// gjson.Unmarshal will automatically attempt to convert JSON values to any Go +// type. For example, the JSON string "100" or the JSON number 100 can be equally +// assigned to Go string, int, byte, uint64, etc. This rule applies to all types. +// +// Deprecated: Use encoder/json.Unmarshal instead +func Unmarshal(data []byte, v interface{}) error { + if atomic.LoadUintptr(&validate) == 1 { + _, ok := validpayload(data, 0) + if !ok { + return errors.New("invalid json") + } + } + if v := reflect.ValueOf(v); v.Kind() == reflect.Ptr { + assign(ParseBytes(data), v) + } + return nil +} + +func validpayload(data []byte, i int) (outi int, ok bool) { + for ; i < len(data); i++ { + switch data[i] { + default: + i, ok = validany(data, i) + if !ok { + return i, false + } + for ; i < len(data); i++ { + switch data[i] { + default: + return i, false + case ' ', '\t', '\n', '\r': + continue + } + } + return i, true + case ' ', '\t', '\n', '\r': + continue + } + } + return i, false +} +func validany(data []byte, i int) (outi int, ok bool) { + for ; i < len(data); i++ { + switch data[i] { + default: + return i, false + case ' ', '\t', '\n', '\r': + continue + case '{': + return validobject(data, i+1) + case '[': + return validarray(data, i+1) + case '"': + return validstring(data, i+1) + case '-', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + return validnumber(data, i+1) + case 't': + return validtrue(data, i+1) + case 'f': + return validfalse(data, i+1) + case 'n': + return validnull(data, i+1) + } + } + return i, false +} +func validobject(data []byte, i int) (outi int, ok bool) { + for ; i < len(data); i++ { + switch data[i] { + default: + return i, false + case ' ', '\t', '\n', '\r': + continue + case '}': + return i + 1, true + case '"': + key: + if i, ok = validstring(data, i+1); !ok { + return i, false + } + if i, ok = validcolon(data, i); !ok { + return i, false + } + if i, ok = validany(data, i); !ok { + return i, false + } + if i, ok = validcomma(data, i, '}'); !ok { + return i, false + } + if data[i] == '}' { + return i + 1, true + } + i++ + for ; i < len(data); i++ { + switch data[i] { + default: + return i, false + case ' ', '\t', '\n', '\r': + continue + case '"': + goto key + } + } + return i, false + } + } + return i, false +} +func validcolon(data []byte, i int) (outi int, ok bool) { + for ; i < len(data); i++ { + switch data[i] { + default: + return i, false + case ' ', '\t', '\n', '\r': + continue + case ':': + return i + 1, true + } + } + return i, false +} +func validcomma(data []byte, i int, end byte) (outi int, ok bool) { + for ; i < len(data); i++ { + switch data[i] { + default: + return i, false + case ' ', '\t', '\n', '\r': + continue + case ',': + return i, true + case end: + return i, true + } + } + return i, false +} +func validarray(data []byte, i int) (outi int, ok bool) { + for ; i < len(data); i++ { + switch data[i] { + default: + for ; i < len(data); i++ { + if i, ok = validany(data, i); !ok { + return i, false + } + if i, ok = validcomma(data, i, ']'); !ok { + return i, false + } + if data[i] == ']' { + return i + 1, true + } + } + case ' ', '\t', '\n', '\r': + continue + case ']': + return i + 1, true + } + } + return i, false +} +func validstring(data []byte, i int) (outi int, ok bool) { + for ; i < len(data); i++ { + if data[i] < ' ' { + return i, false + } else if data[i] == '\\' { + i++ + if i == len(data) { + return i, false + } + switch data[i] { + default: + return i, false + case '"', '\\', '/', 'b', 'f', 'n', 'r', 't': + case 'u': + for j := 0; j < 4; j++ { + i++ + if i >= len(data) { + return i, false + } + if !((data[i] >= '0' && data[i] <= '9') || + (data[i] >= 'a' && data[i] <= 'f') || + (data[i] >= 'A' && data[i] <= 'F')) { + return i, false + } + } + } + } else if data[i] == '"' { + return i + 1, true + } + } + return i, false +} +func validnumber(data []byte, i int) (outi int, ok bool) { + i-- + // sign + if data[i] == '-' { + i++ + } + // int + if i == len(data) { + return i, false + } + if data[i] == '0' { + i++ + } else { + for ; i < len(data); i++ { + if data[i] >= '0' && data[i] <= '9' { + continue + } + break + } + } + // frac + if i == len(data) { + return i, true + } + if data[i] == '.' { + i++ + if i == len(data) { + return i, false + } + if data[i] < '0' || data[i] > '9' { + return i, false + } + i++ + for ; i < len(data); i++ { + if data[i] >= '0' && data[i] <= '9' { + continue + } + break + } + } + // exp + if i == len(data) { + return i, true + } + if data[i] == 'e' || data[i] == 'E' { + i++ + if i == len(data) { + return i, false + } + if data[i] == '+' || data[i] == '-' { + i++ + } + if i == len(data) { + return i, false + } + if data[i] < '0' || data[i] > '9' { + return i, false + } + i++ + for ; i < len(data); i++ { + if data[i] >= '0' && data[i] <= '9' { + continue + } + break + } + } + return i, true +} + +func validtrue(data []byte, i int) (outi int, ok bool) { + if i+3 <= len(data) && data[i] == 'r' && data[i+1] == 'u' && data[i+2] == 'e' { + return i + 3, true + } + return i, false +} +func validfalse(data []byte, i int) (outi int, ok bool) { + if i+4 <= len(data) && data[i] == 'a' && data[i+1] == 'l' && data[i+2] == 's' && data[i+3] == 'e' { + return i + 4, true + } + return i, false +} +func validnull(data []byte, i int) (outi int, ok bool) { + if i+3 <= len(data) && data[i] == 'u' && data[i+1] == 'l' && data[i+2] == 'l' { + return i + 3, true + } + return i, false +} + +// Valid returns true if the input is valid json. +// +// if !gjson.Valid(json) { +// return errors.New("invalid json") +// } +// value := gjson.Get(json, "name.last") +// +func Valid(json string) bool { + _, ok := validpayload([]byte(json), 0) + return ok +} + +// ValidBytes returns true if the input is valid json. +// +// if !gjson.Valid(json) { +// return errors.New("invalid json") +// } +// value := gjson.Get(json, "name.last") +// +// If working with bytes, this method preferred over Valid(string(data)) +// +func ValidBytes(json []byte) bool { + _, ok := validpayload(json, 0) + return ok +} + +func parseUint(s string) (n uint64, ok bool) { + var i int + if i == len(s) { + return 0, false + } + for ; i < len(s); i++ { + if s[i] >= '0' && s[i] <= '9' { + n = n*10 + uint64(s[i]-'0') + } else { + return 0, false + } + } + return n, true +} + +func parseInt(s string) (n int64, ok bool) { + var i int + var sign bool + if len(s) > 0 && s[0] == '-' { + sign = true + i++ + } + if i == len(s) { + return 0, false + } + for ; i < len(s); i++ { + if s[i] >= '0' && s[i] <= '9' { + n = n*10 + int64(s[i]-'0') + } else { + return 0, false + } + } + if sign { + return n * -1, true + } + return n, true +} + +const minUint53 = 0 +const maxUint53 = 4503599627370495 +const minInt53 = -2251799813685248 +const maxInt53 = 2251799813685247 + +func floatToUint(f float64) (n uint64, ok bool) { + n = uint64(f) + if float64(n) == f && n >= minUint53 && n <= maxUint53 { + return n, true + } + return 0, false +} + +func floatToInt(f float64) (n int64, ok bool) { + n = int64(f) + if float64(n) == f && n >= minInt53 && n <= maxInt53 { + return n, true + } + return 0, false +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/gjson/gjson_gae.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/gjson/gjson_gae.go new file mode 100644 index 0000000000000000000000000000000000000000..cbe2ab420b7da88709bc187fbd0bbfd724545161 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/gjson/gjson_gae.go @@ -0,0 +1,10 @@ +//+build appengine + +package gjson + +func getBytes(json []byte, path string) Result { + return Get(string(json), path) +} +func fillIndex(json string, c *parseContext) { + // noop. Use zero for the Index value. +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/gjson/gjson_ngae.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/gjson/gjson_ngae.go new file mode 100644 index 0000000000000000000000000000000000000000..ff313a7879662894650a2581647b809948276972 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/gjson/gjson_ngae.go @@ -0,0 +1,73 @@ +//+build !appengine + +package gjson + +import ( + "reflect" + "unsafe" +) + +// getBytes casts the input json bytes to a string and safely returns the +// results as uniquely allocated data. This operation is intended to minimize +// copies and allocations for the large json string->[]byte. +func getBytes(json []byte, path string) Result { + var result Result + if json != nil { + // unsafe cast to string + result = Get(*(*string)(unsafe.Pointer(&json)), path) + result = fromBytesGet(result) + } + return result +} + +func fromBytesGet(result Result) Result { + // safely get the string headers + rawhi := *(*reflect.StringHeader)(unsafe.Pointer(&result.Raw)) + strhi := *(*reflect.StringHeader)(unsafe.Pointer(&result.Str)) + // create byte slice headers + rawh := reflect.SliceHeader{Data: rawhi.Data, Len: rawhi.Len} + strh := reflect.SliceHeader{Data: strhi.Data, Len: strhi.Len} + if strh.Data == 0 { + // str is nil + if rawh.Data == 0 { + // raw is nil + result.Raw = "" + } else { + // raw has data, safely copy the slice header to a string + result.Raw = string(*(*[]byte)(unsafe.Pointer(&rawh))) + } + result.Str = "" + } else if rawh.Data == 0 { + // raw is nil + result.Raw = "" + // str has data, safely copy the slice header to a string + result.Str = string(*(*[]byte)(unsafe.Pointer(&strh))) + } else if strh.Data >= rawh.Data && + int(strh.Data)+strh.Len <= int(rawh.Data)+rawh.Len { + // Str is a substring of Raw. + start := int(strh.Data - rawh.Data) + // safely copy the raw slice header + result.Raw = string(*(*[]byte)(unsafe.Pointer(&rawh))) + // substring the raw + result.Str = result.Raw[start : start+strh.Len] + } else { + // safely copy both the raw and str slice headers to strings + result.Raw = string(*(*[]byte)(unsafe.Pointer(&rawh))) + result.Str = string(*(*[]byte)(unsafe.Pointer(&strh))) + } + return result +} + +// fillIndex finds the position of Raw data and assigns it to the Index field +// of the resulting value. If the position cannot be found then Index zero is +// used instead. +func fillIndex(json string, c *parseContext) { + if len(c.value.Raw) > 0 && !c.calcd { + jhdr := *(*reflect.StringHeader)(unsafe.Pointer(&json)) + rhdr := *(*reflect.StringHeader)(unsafe.Pointer(&(c.value.Raw))) + c.value.Index = int(rhdr.Data - jhdr.Data) + if c.value.Index < 0 || c.value.Index >= len(json) { + c.value.Index = 0 + } + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/gjson/logo.png b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/gjson/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..17a8bbe9d651e5d79cbd59a3645a152443440ad6 Binary files /dev/null and b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/gjson/logo.png differ diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/match/LICENSE b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/match/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..58f5819a4380fea7a84a9ebdecffc5c68b0a41eb --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/match/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2016 Josh Baker + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/match/README.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/match/README.md new file mode 100644 index 0000000000000000000000000000000000000000..2aa5bc38ba1167ba8460a126ce4ad7ac2a42e7e0 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/match/README.md @@ -0,0 +1,32 @@ +Match +===== +<a href="https://travis-ci.org/tidwall/match"><img src="https://img.shields.io/travis/tidwall/match.svg?style=flat-square" alt="Build Status"></a> +<a href="https://godoc.org/github.com/tidwall/match"><img src="https://img.shields.io/badge/api-reference-blue.svg?style=flat-square" alt="GoDoc"></a> + +Match is a very simple pattern matcher where '*' matches on any +number characters and '?' matches on any one character. + +Installing +---------- + +``` +go get -u github.com/tidwall/match +``` + +Example +------- + +```go +match.Match("hello", "*llo") +match.Match("jello", "?ello") +match.Match("hello", "h*o") +``` + + +Contact +------- +Josh Baker [@tidwall](http://twitter.com/tidwall) + +License +------- +Redcon source code is available under the MIT [License](/LICENSE). diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/match/match.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/match/match.go new file mode 100644 index 0000000000000000000000000000000000000000..8885add63c89449db8d1913e8f84f39d9a42543c --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/tidwall/match/match.go @@ -0,0 +1,192 @@ +// Match provides a simple pattern matcher with unicode support. +package match + +import "unicode/utf8" + +// Match returns true if str matches pattern. This is a very +// simple wildcard match where '*' matches on any number characters +// and '?' matches on any one character. + +// pattern: +// { term } +// term: +// '*' matches any sequence of non-Separator characters +// '?' matches any single non-Separator character +// c matches character c (c != '*', '?', '\\') +// '\\' c matches character c +// +func Match(str, pattern string) bool { + if pattern == "*" { + return true + } + return deepMatch(str, pattern) +} +func deepMatch(str, pattern string) bool { + for len(pattern) > 0 { + if pattern[0] > 0x7f { + return deepMatchRune(str, pattern) + } + switch pattern[0] { + default: + if len(str) == 0 { + return false + } + if str[0] > 0x7f { + return deepMatchRune(str, pattern) + } + if str[0] != pattern[0] { + return false + } + case '?': + if len(str) == 0 { + return false + } + case '*': + return deepMatch(str, pattern[1:]) || + (len(str) > 0 && deepMatch(str[1:], pattern)) + } + str = str[1:] + pattern = pattern[1:] + } + return len(str) == 0 && len(pattern) == 0 +} + +func deepMatchRune(str, pattern string) bool { + var sr, pr rune + var srsz, prsz int + + // read the first rune ahead of time + if len(str) > 0 { + if str[0] > 0x7f { + sr, srsz = utf8.DecodeRuneInString(str) + } else { + sr, srsz = rune(str[0]), 1 + } + } else { + sr, srsz = utf8.RuneError, 0 + } + if len(pattern) > 0 { + if pattern[0] > 0x7f { + pr, prsz = utf8.DecodeRuneInString(pattern) + } else { + pr, prsz = rune(pattern[0]), 1 + } + } else { + pr, prsz = utf8.RuneError, 0 + } + // done reading + for pr != utf8.RuneError { + switch pr { + default: + if srsz == utf8.RuneError { + return false + } + if sr != pr { + return false + } + case '?': + if srsz == utf8.RuneError { + return false + } + case '*': + return deepMatchRune(str, pattern[prsz:]) || + (srsz > 0 && deepMatchRune(str[srsz:], pattern)) + } + str = str[srsz:] + pattern = pattern[prsz:] + // read the next runes + if len(str) > 0 { + if str[0] > 0x7f { + sr, srsz = utf8.DecodeRuneInString(str) + } else { + sr, srsz = rune(str[0]), 1 + } + } else { + sr, srsz = utf8.RuneError, 0 + } + if len(pattern) > 0 { + if pattern[0] > 0x7f { + pr, prsz = utf8.DecodeRuneInString(pattern) + } else { + pr, prsz = rune(pattern[0]), 1 + } + } else { + pr, prsz = utf8.RuneError, 0 + } + // done reading + } + + return srsz == 0 && prsz == 0 +} + +var maxRuneBytes = func() []byte { + b := make([]byte, 4) + if utf8.EncodeRune(b, '\U0010FFFF') != 4 { + panic("invalid rune encoding") + } + return b +}() + +// Allowable parses the pattern and determines the minimum and maximum allowable +// values that the pattern can represent. +// When the max cannot be determined, 'true' will be returned +// for infinite. +func Allowable(pattern string) (min, max string) { + if pattern == "" || pattern[0] == '*' { + return "", "" + } + + minb := make([]byte, 0, len(pattern)) + maxb := make([]byte, 0, len(pattern)) + var wild bool + for i := 0; i < len(pattern); i++ { + if pattern[i] == '*' { + wild = true + break + } + if pattern[i] == '?' { + minb = append(minb, 0) + maxb = append(maxb, maxRuneBytes...) + } else { + minb = append(minb, pattern[i]) + maxb = append(maxb, pattern[i]) + } + } + if wild { + r, n := utf8.DecodeLastRune(maxb) + if r != utf8.RuneError { + if r < utf8.MaxRune { + r++ + if r > 0x7f { + b := make([]byte, 4) + nn := utf8.EncodeRune(b, r) + maxb = append(maxb[:len(maxb)-n], b[:nn]...) + } else { + maxb = append(maxb[:len(maxb)-n], byte(r)) + } + } + } + } + return string(minb), string(maxb) + /* + return + if wild { + r, n := utf8.DecodeLastRune(maxb) + if r != utf8.RuneError { + if r < utf8.MaxRune { + infinite = true + } else { + r++ + if r > 0x7f { + b := make([]byte, 4) + nn := utf8.EncodeRune(b, r) + maxb = append(maxb[:len(maxb)-n], b[:nn]...) + } else { + maxb = append(maxb[:len(maxb)-n], byte(r)) + } + } + } + } + return string(minb), string(maxb), infinite + */ +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/CHANGELOG.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..401eae5a2cc64418801262977e3a69b6839d0cd9 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/CHANGELOG.md @@ -0,0 +1,435 @@ +# Change Log + +**ATTN**: This project uses [semantic versioning](http://semver.org/). + +## [Unreleased] + +## 1.20.0 - 2017-08-10 + +### Fixed + +* `HandleExitCoder` is now correctly iterates over all errors in + a `MultiError`. The exit code is the exit code of the last error or `1` if + there are no `ExitCoder`s in the `MultiError`. +* Fixed YAML file loading on Windows (previously would fail validate the file path) +* Subcommand `Usage`, `Description`, `ArgsUsage`, `OnUsageError` correctly + propogated +* `ErrWriter` is now passed downwards through command structure to avoid the + need to redefine it +* Pass `Command` context into `OnUsageError` rather than parent context so that + all fields are avaiable +* Errors occuring in `Before` funcs are no longer double printed +* Use `UsageText` in the help templates for commands and subcommands if + defined; otherwise build the usage as before (was previously ignoring this + field) +* `IsSet` and `GlobalIsSet` now correctly return whether a flag is set if + a program calls `Set` or `GlobalSet` directly after flag parsing (would + previously only return `true` if the flag was set during parsing) + +### Changed + +* No longer exit the program on command/subcommand error if the error raised is + not an `OsExiter`. This exiting behavior was introduced in 1.19.0, but was + determined to be a regression in functionality. See [the + PR](https://github.com/urfave/cli/pull/595) for discussion. + +### Added + +* `CommandsByName` type was added to make it easy to sort `Command`s by name, + alphabetically +* `altsrc` now handles loading of string and int arrays from TOML +* Support for definition of custom help templates for `App` via + `CustomAppHelpTemplate` +* Support for arbitrary key/value fields on `App` to be used with + `CustomAppHelpTemplate` via `ExtraInfo` +* `HelpFlag`, `VersionFlag`, and `BashCompletionFlag` changed to explictly be + `cli.Flag`s allowing for the use of custom flags satisfying the `cli.Flag` + interface to be used. + + +## [1.19.1] - 2016-11-21 + +### Fixed + +- Fixes regression introduced in 1.19.0 where using an `ActionFunc` as + the `Action` for a command would cause it to error rather than calling the + function. Should not have a affected declarative cases using `func(c + *cli.Context) err)`. +- Shell completion now handles the case where the user specifies + `--generate-bash-completion` immediately after a flag that takes an argument. + Previously it call the application with `--generate-bash-completion` as the + flag value. + +## [1.19.0] - 2016-11-19 +### Added +- `FlagsByName` was added to make it easy to sort flags (e.g. `sort.Sort(cli.FlagsByName(app.Flags))`) +- A `Description` field was added to `App` for a more detailed description of + the application (similar to the existing `Description` field on `Command`) +- Flag type code generation via `go generate` +- Write to stderr and exit 1 if action returns non-nil error +- Added support for TOML to the `altsrc` loader +- `SkipArgReorder` was added to allow users to skip the argument reordering. + This is useful if you want to consider all "flags" after an argument as + arguments rather than flags (the default behavior of the stdlib `flag` + library). This is backported functionality from the [removal of the flag + reordering](https://github.com/urfave/cli/pull/398) in the unreleased version + 2 +- For formatted errors (those implementing `ErrorFormatter`), the errors will + be formatted during output. Compatible with `pkg/errors`. + +### Changed +- Raise minimum tested/supported Go version to 1.2+ + +### Fixed +- Consider empty environment variables as set (previously environment variables + with the equivalent of `""` would be skipped rather than their value used). +- Return an error if the value in a given environment variable cannot be parsed + as the flag type. Previously these errors were silently swallowed. +- Print full error when an invalid flag is specified (which includes the invalid flag) +- `App.Writer` defaults to `stdout` when `nil` +- If no action is specified on a command or app, the help is now printed instead of `panic`ing +- `App.Metadata` is initialized automatically now (previously was `nil` unless initialized) +- Correctly show help message if `-h` is provided to a subcommand +- `context.(Global)IsSet` now respects environment variables. Previously it + would return `false` if a flag was specified in the environment rather than + as an argument +- Removed deprecation warnings to STDERR to avoid them leaking to the end-user +- `altsrc`s import paths were updated to use `gopkg.in/urfave/cli.v1`. This + fixes issues that occurred when `gopkg.in/urfave/cli.v1` was imported as well + as `altsrc` where Go would complain that the types didn't match + +## [1.18.1] - 2016-08-28 +### Fixed +- Removed deprecation warnings to STDERR to avoid them leaking to the end-user (backported) + +## [1.18.0] - 2016-06-27 +### Added +- `./runtests` test runner with coverage tracking by default +- testing on OS X +- testing on Windows +- `UintFlag`, `Uint64Flag`, and `Int64Flag` types and supporting code + +### Changed +- Use spaces for alignment in help/usage output instead of tabs, making the + output alignment consistent regardless of tab width + +### Fixed +- Printing of command aliases in help text +- Printing of visible flags for both struct and struct pointer flags +- Display the `help` subcommand when using `CommandCategories` +- No longer swallows `panic`s that occur within the `Action`s themselves when + detecting the signature of the `Action` field + +## [1.17.1] - 2016-08-28 +### Fixed +- Removed deprecation warnings to STDERR to avoid them leaking to the end-user + +## [1.17.0] - 2016-05-09 +### Added +- Pluggable flag-level help text rendering via `cli.DefaultFlagStringFunc` +- `context.GlobalBoolT` was added as an analogue to `context.GlobalBool` +- Support for hiding commands by setting `Hidden: true` -- this will hide the + commands in help output + +### Changed +- `Float64Flag`, `IntFlag`, and `DurationFlag` default values are no longer + quoted in help text output. +- All flag types now include `(default: {value})` strings following usage when a + default value can be (reasonably) detected. +- `IntSliceFlag` and `StringSliceFlag` usage strings are now more consistent + with non-slice flag types +- Apps now exit with a code of 3 if an unknown subcommand is specified + (previously they printed "No help topic for...", but still exited 0. This + makes it easier to script around apps built using `cli` since they can trust + that a 0 exit code indicated a successful execution. +- cleanups based on [Go Report Card + feedback](https://goreportcard.com/report/github.com/urfave/cli) + +## [1.16.1] - 2016-08-28 +### Fixed +- Removed deprecation warnings to STDERR to avoid them leaking to the end-user + +## [1.16.0] - 2016-05-02 +### Added +- `Hidden` field on all flag struct types to omit from generated help text + +### Changed +- `BashCompletionFlag` (`--enable-bash-completion`) is now omitted from +generated help text via the `Hidden` field + +### Fixed +- handling of error values in `HandleAction` and `HandleExitCoder` + +## [1.15.0] - 2016-04-30 +### Added +- This file! +- Support for placeholders in flag usage strings +- `App.Metadata` map for arbitrary data/state management +- `Set` and `GlobalSet` methods on `*cli.Context` for altering values after +parsing. +- Support for nested lookup of dot-delimited keys in structures loaded from +YAML. + +### Changed +- The `App.Action` and `Command.Action` now prefer a return signature of +`func(*cli.Context) error`, as defined by `cli.ActionFunc`. If a non-nil +`error` is returned, there may be two outcomes: + - If the error fulfills `cli.ExitCoder`, then `os.Exit` will be called + automatically + - Else the error is bubbled up and returned from `App.Run` +- Specifying an `Action` with the legacy return signature of +`func(*cli.Context)` will produce a deprecation message to stderr +- Specifying an `Action` that is not a `func` type will produce a non-zero exit +from `App.Run` +- Specifying an `Action` func that has an invalid (input) signature will +produce a non-zero exit from `App.Run` + +### Deprecated +- <a name="deprecated-cli-app-runandexitonerror"></a> +`cli.App.RunAndExitOnError`, which should now be done by returning an error +that fulfills `cli.ExitCoder` to `cli.App.Run`. +- <a name="deprecated-cli-app-action-signature"></a> the legacy signature for +`cli.App.Action` of `func(*cli.Context)`, which should now have a return +signature of `func(*cli.Context) error`, as defined by `cli.ActionFunc`. + +### Fixed +- Added missing `*cli.Context.GlobalFloat64` method + +## [1.14.0] - 2016-04-03 (backfilled 2016-04-25) +### Added +- Codebeat badge +- Support for categorization via `CategorizedHelp` and `Categories` on app. + +### Changed +- Use `filepath.Base` instead of `path.Base` in `Name` and `HelpName`. + +### Fixed +- Ensure version is not shown in help text when `HideVersion` set. + +## [1.13.0] - 2016-03-06 (backfilled 2016-04-25) +### Added +- YAML file input support. +- `NArg` method on context. + +## [1.12.0] - 2016-02-17 (backfilled 2016-04-25) +### Added +- Custom usage error handling. +- Custom text support in `USAGE` section of help output. +- Improved help messages for empty strings. +- AppVeyor CI configuration. + +### Changed +- Removed `panic` from default help printer func. +- De-duping and optimizations. + +### Fixed +- Correctly handle `Before`/`After` at command level when no subcommands. +- Case of literal `-` argument causing flag reordering. +- Environment variable hints on Windows. +- Docs updates. + +## [1.11.1] - 2015-12-21 (backfilled 2016-04-25) +### Changed +- Use `path.Base` in `Name` and `HelpName` +- Export `GetName` on flag types. + +### Fixed +- Flag parsing when skipping is enabled. +- Test output cleanup. +- Move completion check to account for empty input case. + +## [1.11.0] - 2015-11-15 (backfilled 2016-04-25) +### Added +- Destination scan support for flags. +- Testing against `tip` in Travis CI config. + +### Changed +- Go version in Travis CI config. + +### Fixed +- Removed redundant tests. +- Use correct example naming in tests. + +## [1.10.2] - 2015-10-29 (backfilled 2016-04-25) +### Fixed +- Remove unused var in bash completion. + +## [1.10.1] - 2015-10-21 (backfilled 2016-04-25) +### Added +- Coverage and reference logos in README. + +### Fixed +- Use specified values in help and version parsing. +- Only display app version and help message once. + +## [1.10.0] - 2015-10-06 (backfilled 2016-04-25) +### Added +- More tests for existing functionality. +- `ArgsUsage` at app and command level for help text flexibility. + +### Fixed +- Honor `HideHelp` and `HideVersion` in `App.Run`. +- Remove juvenile word from README. + +## [1.9.0] - 2015-09-08 (backfilled 2016-04-25) +### Added +- `FullName` on command with accompanying help output update. +- Set default `$PROG` in bash completion. + +### Changed +- Docs formatting. + +### Fixed +- Removed self-referential imports in tests. + +## [1.8.0] - 2015-06-30 (backfilled 2016-04-25) +### Added +- Support for `Copyright` at app level. +- `Parent` func at context level to walk up context lineage. + +### Fixed +- Global flag processing at top level. + +## [1.7.1] - 2015-06-11 (backfilled 2016-04-25) +### Added +- Aggregate errors from `Before`/`After` funcs. +- Doc comments on flag structs. +- Include non-global flags when checking version and help. +- Travis CI config updates. + +### Fixed +- Ensure slice type flags have non-nil values. +- Collect global flags from the full command hierarchy. +- Docs prose. + +## [1.7.0] - 2015-05-03 (backfilled 2016-04-25) +### Changed +- `HelpPrinter` signature includes output writer. + +### Fixed +- Specify go 1.1+ in docs. +- Set `Writer` when running command as app. + +## [1.6.0] - 2015-03-23 (backfilled 2016-04-25) +### Added +- Multiple author support. +- `NumFlags` at context level. +- `Aliases` at command level. + +### Deprecated +- `ShortName` at command level. + +### Fixed +- Subcommand help output. +- Backward compatible support for deprecated `Author` and `Email` fields. +- Docs regarding `Names`/`Aliases`. + +## [1.5.0] - 2015-02-20 (backfilled 2016-04-25) +### Added +- `After` hook func support at app and command level. + +### Fixed +- Use parsed context when running command as subcommand. +- Docs prose. + +## [1.4.1] - 2015-01-09 (backfilled 2016-04-25) +### Added +- Support for hiding `-h / --help` flags, but not `help` subcommand. +- Stop flag parsing after `--`. + +### Fixed +- Help text for generic flags to specify single value. +- Use double quotes in output for defaults. +- Use `ParseInt` instead of `ParseUint` for int environment var values. +- Use `0` as base when parsing int environment var values. + +## [1.4.0] - 2014-12-12 (backfilled 2016-04-25) +### Added +- Support for environment variable lookup "cascade". +- Support for `Stdout` on app for output redirection. + +### Fixed +- Print command help instead of app help in `ShowCommandHelp`. + +## [1.3.1] - 2014-11-13 (backfilled 2016-04-25) +### Added +- Docs and example code updates. + +### Changed +- Default `-v / --version` flag made optional. + +## [1.3.0] - 2014-08-10 (backfilled 2016-04-25) +### Added +- `FlagNames` at context level. +- Exposed `VersionPrinter` var for more control over version output. +- Zsh completion hook. +- `AUTHOR` section in default app help template. +- Contribution guidelines. +- `DurationFlag` type. + +## [1.2.0] - 2014-08-02 +### Added +- Support for environment variable defaults on flags plus tests. + +## [1.1.0] - 2014-07-15 +### Added +- Bash completion. +- Optional hiding of built-in help command. +- Optional skipping of flag parsing at command level. +- `Author`, `Email`, and `Compiled` metadata on app. +- `Before` hook func support at app and command level. +- `CommandNotFound` func support at app level. +- Command reference available on context. +- `GenericFlag` type. +- `Float64Flag` type. +- `BoolTFlag` type. +- `IsSet` flag helper on context. +- More flag lookup funcs at context level. +- More tests &amp; docs. + +### Changed +- Help template updates to account for presence/absence of flags. +- Separated subcommand help template. +- Exposed `HelpPrinter` var for more control over help output. + +## [1.0.0] - 2013-11-01 +### Added +- `help` flag in default app flag set and each command flag set. +- Custom handling of argument parsing errors. +- Command lookup by name at app level. +- `StringSliceFlag` type and supporting `StringSlice` type. +- `IntSliceFlag` type and supporting `IntSlice` type. +- Slice type flag lookups by name at context level. +- Export of app and command help functions. +- More tests &amp; docs. + +## 0.1.0 - 2013-07-22 +### Added +- Initial implementation. + +[Unreleased]: https://github.com/urfave/cli/compare/v1.18.0...HEAD +[1.18.0]: https://github.com/urfave/cli/compare/v1.17.0...v1.18.0 +[1.17.0]: https://github.com/urfave/cli/compare/v1.16.0...v1.17.0 +[1.16.0]: https://github.com/urfave/cli/compare/v1.15.0...v1.16.0 +[1.15.0]: https://github.com/urfave/cli/compare/v1.14.0...v1.15.0 +[1.14.0]: https://github.com/urfave/cli/compare/v1.13.0...v1.14.0 +[1.13.0]: https://github.com/urfave/cli/compare/v1.12.0...v1.13.0 +[1.12.0]: https://github.com/urfave/cli/compare/v1.11.1...v1.12.0 +[1.11.1]: https://github.com/urfave/cli/compare/v1.11.0...v1.11.1 +[1.11.0]: https://github.com/urfave/cli/compare/v1.10.2...v1.11.0 +[1.10.2]: https://github.com/urfave/cli/compare/v1.10.1...v1.10.2 +[1.10.1]: https://github.com/urfave/cli/compare/v1.10.0...v1.10.1 +[1.10.0]: https://github.com/urfave/cli/compare/v1.9.0...v1.10.0 +[1.9.0]: https://github.com/urfave/cli/compare/v1.8.0...v1.9.0 +[1.8.0]: https://github.com/urfave/cli/compare/v1.7.1...v1.8.0 +[1.7.1]: https://github.com/urfave/cli/compare/v1.7.0...v1.7.1 +[1.7.0]: https://github.com/urfave/cli/compare/v1.6.0...v1.7.0 +[1.6.0]: https://github.com/urfave/cli/compare/v1.5.0...v1.6.0 +[1.5.0]: https://github.com/urfave/cli/compare/v1.4.1...v1.5.0 +[1.4.1]: https://github.com/urfave/cli/compare/v1.4.0...v1.4.1 +[1.4.0]: https://github.com/urfave/cli/compare/v1.3.1...v1.4.0 +[1.3.1]: https://github.com/urfave/cli/compare/v1.3.0...v1.3.1 +[1.3.0]: https://github.com/urfave/cli/compare/v1.2.0...v1.3.0 +[1.2.0]: https://github.com/urfave/cli/compare/v1.1.0...v1.2.0 +[1.1.0]: https://github.com/urfave/cli/compare/v1.0.0...v1.1.0 +[1.0.0]: https://github.com/urfave/cli/compare/v0.1.0...v1.0.0 diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/CODE_OF_CONDUCT.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000000000000000000000000000000000..41ba294f6db468d349ebeffb650e4e6b473ee49a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/CODE_OF_CONDUCT.md @@ -0,0 +1,74 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +education, socio-economic status, nationality, personal appearance, race, +religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting Dan Buch at dan@meatballhat.com. All complaints will be +reviewed and investigated and will result in a response that is deemed necessary +and appropriate to the circumstances. The project team is obligated to maintain +confidentiality with regard to the reporter of an incident. Further details of +specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/CONTRIBUTING.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/CONTRIBUTING.md new file mode 100644 index 0000000000000000000000000000000000000000..329195eeece71b9c77e7a7fd554ce1dec86a8fef --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/CONTRIBUTING.md @@ -0,0 +1,19 @@ +## Contributing + +**NOTE**: the primary maintainer(s) may be found in +[./MAINTAINERS.md](./MAINTAINERS.md). + +Feel free to put up a pull request to fix a bug or maybe add a feature. I will +give it a code review and make sure that it does not break backwards +compatibility. If I or any other collaborators agree that it is in line with +the vision of the project, we will work with you to get the code into +a mergeable state and merge it into the master branch. + +If you have contributed something significant to the project, we will most +likely add you as a collaborator. As a collaborator you are given the ability +to merge others pull requests. It is very important that new code does not +break existing code, so be careful about what code you do choose to merge. + +If you feel like you have contributed to the project but have not yet been added +as a collaborator, we probably forgot to add you :sweat_smile:. Please open an +issue! diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/LICENSE b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..42a597e29bbb8b304f0f09f7971fd61eb8d5bb9d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 Jeremy Saenz & Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/MAINTAINERS.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/MAINTAINERS.md new file mode 100644 index 0000000000000000000000000000000000000000..f6bdd99c6da30a7ba15eedfce807b34cae0fd937 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/MAINTAINERS.md @@ -0,0 +1 @@ +- @meatballhat diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/README.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/README.md new file mode 100644 index 0000000000000000000000000000000000000000..f2baef4f0794dd02a7d6f09490d84ffba735b7f3 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/README.md @@ -0,0 +1,1526 @@ +cli +=== + +[![Build Status](https://travis-ci.org/urfave/cli.svg?branch=master)](https://travis-ci.org/urfave/cli) +[![Windows Build Status](https://ci.appveyor.com/api/projects/status/rtgk5xufi932pb2v?svg=true)](https://ci.appveyor.com/project/urfave/cli) +[![GoDoc](https://godoc.org/github.com/urfave/cli?status.svg)](https://godoc.org/github.com/urfave/cli) +[![codebeat](https://codebeat.co/badges/0a8f30aa-f975-404b-b878-5fab3ae1cc5f)](https://codebeat.co/projects/github-com-urfave-cli) +[![Go Report Card](https://goreportcard.com/badge/urfave/cli)](https://goreportcard.com/report/urfave/cli) +[![top level coverage](https://gocover.io/_badge/github.com/urfave/cli?0 "top level coverage")](http://gocover.io/github.com/urfave/cli) / +[![altsrc coverage](https://gocover.io/_badge/github.com/urfave/cli/altsrc?0 "altsrc coverage")](http://gocover.io/github.com/urfave/cli/altsrc) + +This is the library formerly known as `github.com/codegangsta/cli` -- Github +will automatically redirect requests to this repository, but we recommend +updating your references for clarity. + +cli is a simple, fast, and fun package for building command line apps in Go. The +goal is to enable developers to write fast and distributable command line +applications in an expressive way. + +<!-- toc --> + +- [Overview](#overview) +- [Installation](#installation) + * [Supported platforms](#supported-platforms) + * [Using the `v2` branch](#using-the-v2-branch) + * [Pinning to the `v1` releases](#pinning-to-the-v1-releases) +- [Getting Started](#getting-started) +- [Examples](#examples) + * [Arguments](#arguments) + * [Flags](#flags) + + [Placeholder Values](#placeholder-values) + + [Alternate Names](#alternate-names) + + [Ordering](#ordering) + + [Values from the Environment](#values-from-the-environment) + + [Values from files](#values-from-files) + + [Values from alternate input sources (YAML, TOML, and others)](#values-from-alternate-input-sources-yaml-toml-and-others) + + [Precedence](#precedence) + * [Subcommands](#subcommands) + * [Subcommands categories](#subcommands-categories) + * [Exit code](#exit-code) + * [Bash Completion](#bash-completion) + + [Enabling](#enabling) + + [Distribution](#distribution) + + [Customization](#customization) + * [Generated Help Text](#generated-help-text) + + [Customization](#customization-1) + * [Version Flag](#version-flag) + + [Customization](#customization-2) + + [Full API Example](#full-api-example) + * [Combining short Bool options](#combining-short-bool-options) +- [Contribution Guidelines](#contribution-guidelines) + +<!-- tocstop --> + +## Overview + +Command line apps are usually so tiny that there is absolutely no reason why +your code should *not* be self-documenting. Things like generating help text and +parsing command flags/options should not hinder productivity when writing a +command line app. + +**This is where cli comes into play.** cli makes command line programming fun, +organized, and expressive! + +## Installation + +Make sure you have a working Go environment. Go version 1.2+ is supported. [See +the install instructions for Go](http://golang.org/doc/install.html). + +To install cli, simply run: +``` +$ go get github.com/urfave/cli +``` + +Make sure your `PATH` includes the `$GOPATH/bin` directory so your commands can +be easily used: +``` +export PATH=$PATH:$GOPATH/bin +``` + +### Supported platforms + +cli is tested against multiple versions of Go on Linux, and against the latest +released version of Go on OS X and Windows. For full details, see +[`./.travis.yml`](./.travis.yml) and [`./appveyor.yml`](./appveyor.yml). + +### Using the `v2` branch + +**Warning**: The `v2` branch is currently unreleased and considered unstable. + +There is currently a long-lived branch named `v2` that is intended to land as +the new `master` branch once development there has settled down. The current +`master` branch (mirrored as `v1`) is being manually merged into `v2` on +an irregular human-based schedule, but generally if one wants to "upgrade" to +`v2` *now* and accept the volatility (read: "awesomeness") that comes along with +that, please use whatever version pinning of your preference, such as via +`gopkg.in`: + +``` +$ go get gopkg.in/urfave/cli.v2 +``` + +``` go +... +import ( + "gopkg.in/urfave/cli.v2" // imports as package "cli" +) +... +``` + +### Pinning to the `v1` releases + +Similarly to the section above describing use of the `v2` branch, if one wants +to avoid any unexpected compatibility pains once `v2` becomes `master`, then +pinning to `v1` is an acceptable option, e.g.: + +``` +$ go get gopkg.in/urfave/cli.v1 +``` + +``` go +... +import ( + "gopkg.in/urfave/cli.v1" // imports as package "cli" +) +... +``` + +This will pull the latest tagged `v1` release (e.g. `v1.18.1` at the time of writing). + +## Getting Started + +One of the philosophies behind cli is that an API should be playful and full of +discovery. So a cli app can be as little as one line of code in `main()`. + +<!-- { + "args": ["&#45;&#45;help"], + "output": "A new cli application" +} --> +``` go +package main + +import ( + "log" + "os" + + "github.com/urfave/cli" +) + +func main() { + err := cli.NewApp().Run(os.Args) + if err != nil { + log.Fatal(err) + } +} +``` + +This app will run and show help text, but is not very useful. Let's give an +action to execute and some help documentation: + +<!-- { + "output": "boom! I say!" +} --> +``` go +package main + +import ( + "fmt" + "log" + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + app.Name = "boom" + app.Usage = "make an explosive entrance" + app.Action = func(c *cli.Context) error { + fmt.Println("boom! I say!") + return nil + } + + err := app.Run(os.Args) + if err != nil { + log.Fatal(err) + } +} +``` + +Running this already gives you a ton of functionality, plus support for things +like subcommands and flags, which are covered below. + +## Examples + +Being a programmer can be a lonely job. Thankfully by the power of automation +that is not the case! Let's create a greeter app to fend off our demons of +loneliness! + +Start by creating a directory named `greet`, and within it, add a file, +`greet.go` with the following code in it: + +<!-- { + "output": "Hello friend!" +} --> +``` go +package main + +import ( + "fmt" + "log" + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + app.Name = "greet" + app.Usage = "fight the loneliness!" + app.Action = func(c *cli.Context) error { + fmt.Println("Hello friend!") + return nil + } + + err := app.Run(os.Args) + if err != nil { + log.Fatal(err) + } +} +``` + +Install our command to the `$GOPATH/bin` directory: + +``` +$ go install +``` + +Finally run our new command: + +``` +$ greet +Hello friend! +``` + +cli also generates neat help text: + +``` +$ greet help +NAME: + greet - fight the loneliness! + +USAGE: + greet [global options] command [command options] [arguments...] + +VERSION: + 0.0.0 + +COMMANDS: + help, h Shows a list of commands or help for one command + +GLOBAL OPTIONS + --version Shows version information +``` + +### Arguments + +You can lookup arguments by calling the `Args` function on `cli.Context`, e.g.: + +<!-- { + "output": "Hello \"" +} --> +``` go +package main + +import ( + "fmt" + "log" + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Action = func(c *cli.Context) error { + fmt.Printf("Hello %q", c.Args().Get(0)) + return nil + } + + err := app.Run(os.Args) + if err != nil { + log.Fatal(err) + } +} +``` + +### Flags + +Setting and querying flags is simple. + +<!-- { + "output": "Hello Nefertiti" +} --> +``` go +package main + +import ( + "fmt" + "log" + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Flags = []cli.Flag { + cli.StringFlag{ + Name: "lang", + Value: "english", + Usage: "language for the greeting", + }, + } + + app.Action = func(c *cli.Context) error { + name := "Nefertiti" + if c.NArg() > 0 { + name = c.Args().Get(0) + } + if c.String("lang") == "spanish" { + fmt.Println("Hola", name) + } else { + fmt.Println("Hello", name) + } + return nil + } + + err := app.Run(os.Args) + if err != nil { + log.Fatal(err) + } +} +``` + +You can also set a destination variable for a flag, to which the content will be +scanned. + +<!-- { + "output": "Hello someone" +} --> +``` go +package main + +import ( + "log" + "os" + "fmt" + + "github.com/urfave/cli" +) + +func main() { + var language string + + app := cli.NewApp() + + app.Flags = []cli.Flag { + cli.StringFlag{ + Name: "lang", + Value: "english", + Usage: "language for the greeting", + Destination: &language, + }, + } + + app.Action = func(c *cli.Context) error { + name := "someone" + if c.NArg() > 0 { + name = c.Args()[0] + } + if language == "spanish" { + fmt.Println("Hola", name) + } else { + fmt.Println("Hello", name) + } + return nil + } + + err := app.Run(os.Args) + if err != nil { + log.Fatal(err) + } +} +``` + +See full list of flags at http://godoc.org/github.com/urfave/cli + +#### Placeholder Values + +Sometimes it's useful to specify a flag's value within the usage string itself. +Such placeholders are indicated with back quotes. + +For example this: + +<!-- { + "args": ["&#45;&#45;help"], + "output": "&#45;&#45;config FILE, &#45;c FILE" +} --> +```go +package main + +import ( + "log" + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Flags = []cli.Flag{ + cli.StringFlag{ + Name: "config, c", + Usage: "Load configuration from `FILE`", + }, + } + + err := app.Run(os.Args) + if err != nil { + log.Fatal(err) + } +} +``` + +Will result in help output like: + +``` +--config FILE, -c FILE Load configuration from FILE +``` + +Note that only the first placeholder is used. Subsequent back-quoted words will +be left as-is. + +#### Alternate Names + +You can set alternate (or short) names for flags by providing a comma-delimited +list for the `Name`. e.g. + +<!-- { + "args": ["&#45;&#45;help"], + "output": "&#45;&#45;lang value, &#45;l value.*language for the greeting.*default: \"english\"" +} --> +``` go +package main + +import ( + "log" + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Flags = []cli.Flag { + cli.StringFlag{ + Name: "lang, l", + Value: "english", + Usage: "language for the greeting", + }, + } + + err := app.Run(os.Args) + if err != nil { + log.Fatal(err) + } +} +``` + +That flag can then be set with `--lang spanish` or `-l spanish`. Note that +giving two different forms of the same flag in the same command invocation is an +error. + +#### Ordering + +Flags for the application and commands are shown in the order they are defined. +However, it's possible to sort them from outside this library by using `FlagsByName` +or `CommandsByName` with `sort`. + +For example this: + +<!-- { + "args": ["&#45;&#45;help"], + "output": "add a task to the list\n.*complete a task on the list\n.*\n\n.*\n.*Load configuration from FILE\n.*Language for the greeting.*" +} --> +``` go +package main + +import ( + "log" + "os" + "sort" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Flags = []cli.Flag { + cli.StringFlag{ + Name: "lang, l", + Value: "english", + Usage: "Language for the greeting", + }, + cli.StringFlag{ + Name: "config, c", + Usage: "Load configuration from `FILE`", + }, + } + + app.Commands = []cli.Command{ + { + Name: "complete", + Aliases: []string{"c"}, + Usage: "complete a task on the list", + Action: func(c *cli.Context) error { + return nil + }, + }, + { + Name: "add", + Aliases: []string{"a"}, + Usage: "add a task to the list", + Action: func(c *cli.Context) error { + return nil + }, + }, + } + + sort.Sort(cli.FlagsByName(app.Flags)) + sort.Sort(cli.CommandsByName(app.Commands)) + + err := app.Run(os.Args) + if err != nil { + log.Fatal(err) + } +} +``` + +Will result in help output like: + +``` +--config FILE, -c FILE Load configuration from FILE +--lang value, -l value Language for the greeting (default: "english") +``` + +#### Values from the Environment + +You can also have the default value set from the environment via `EnvVar`. e.g. + +<!-- { + "args": ["&#45;&#45;help"], + "output": "language for the greeting.*APP_LANG" +} --> +``` go +package main + +import ( + "log" + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Flags = []cli.Flag { + cli.StringFlag{ + Name: "lang, l", + Value: "english", + Usage: "language for the greeting", + EnvVar: "APP_LANG", + }, + } + + err := app.Run(os.Args) + if err != nil { + log.Fatal(err) + } +} +``` + +The `EnvVar` may also be given as a comma-delimited "cascade", where the first +environment variable that resolves is used as the default. + +<!-- { + "args": ["&#45;&#45;help"], + "output": "language for the greeting.*LEGACY_COMPAT_LANG.*APP_LANG.*LANG" +} --> +``` go +package main + +import ( + "log" + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Flags = []cli.Flag { + cli.StringFlag{ + Name: "lang, l", + Value: "english", + Usage: "language for the greeting", + EnvVar: "LEGACY_COMPAT_LANG,APP_LANG,LANG", + }, + } + + err := app.Run(os.Args) + if err != nil { + log.Fatal(err) + } +} +``` + +#### Values from files + +You can also have the default value set from file via `FilePath`. e.g. + +<!-- { + "args": ["&#45;&#45;help"], + "output": "password for the mysql database" +} --> +``` go +package main + +import ( + "log" + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Flags = []cli.Flag { + cli.StringFlag{ + Name: "password, p", + Usage: "password for the mysql database", + FilePath: "/etc/mysql/password", + }, + } + + err := app.Run(os.Args) + if err != nil { + log.Fatal(err) + } +} +``` + +Note that default values set from file (e.g. `FilePath`) take precedence over +default values set from the enviornment (e.g. `EnvVar`). + +#### Values from alternate input sources (YAML, TOML, and others) + +There is a separate package altsrc that adds support for getting flag values +from other file input sources. + +Currently supported input source formats: +* YAML +* TOML + +In order to get values for a flag from an alternate input source the following +code would be added to wrap an existing cli.Flag like below: + +``` go + altsrc.NewIntFlag(cli.IntFlag{Name: "test"}) +``` + +Initialization must also occur for these flags. Below is an example initializing +getting data from a yaml file below. + +``` go + command.Before = altsrc.InitInputSourceWithContext(command.Flags, NewYamlSourceFromFlagFunc("load")) +``` + +The code above will use the "load" string as a flag name to get the file name of +a yaml file from the cli.Context. It will then use that file name to initialize +the yaml input source for any flags that are defined on that command. As a note +the "load" flag used would also have to be defined on the command flags in order +for this code snipped to work. + +Currently only YAML and JSON files are supported but developers can add support +for other input sources by implementing the altsrc.InputSourceContext for their +given sources. + +Here is a more complete sample of a command using YAML support: + +<!-- { + "args": ["test-cmd", "&#45;&#45;help"], + "output": "&#45&#45;test value.*default: 0" +} --> +``` go +package notmain + +import ( + "fmt" + "log" + "os" + + "github.com/urfave/cli" + "github.com/urfave/cli/altsrc" +) + +func main() { + app := cli.NewApp() + + flags := []cli.Flag{ + altsrc.NewIntFlag(cli.IntFlag{Name: "test"}), + cli.StringFlag{Name: "load"}, + } + + app.Action = func(c *cli.Context) error { + fmt.Println("yaml ist rad") + return nil + } + + app.Before = altsrc.InitInputSourceWithContext(flags, altsrc.NewYamlSourceFromFlagFunc("load")) + app.Flags = flags + + err := app.Run(os.Args) + if err != nil { + log.Fatal(err) + } +} +``` + +#### Precedence + +The precedence for flag value sources is as follows (highest to lowest): + +0. Command line flag value from user +0. Environment variable (if specified) +0. Configuration file (if specified) +0. Default defined on the flag + +### Subcommands + +Subcommands can be defined for a more git-like command line app. + +<!-- { + "args": ["template", "add"], + "output": "new task template: .+" +} --> +```go +package main + +import ( + "fmt" + "log" + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Commands = []cli.Command{ + { + Name: "add", + Aliases: []string{"a"}, + Usage: "add a task to the list", + Action: func(c *cli.Context) error { + fmt.Println("added task: ", c.Args().First()) + return nil + }, + }, + { + Name: "complete", + Aliases: []string{"c"}, + Usage: "complete a task on the list", + Action: func(c *cli.Context) error { + fmt.Println("completed task: ", c.Args().First()) + return nil + }, + }, + { + Name: "template", + Aliases: []string{"t"}, + Usage: "options for task templates", + Subcommands: []cli.Command{ + { + Name: "add", + Usage: "add a new template", + Action: func(c *cli.Context) error { + fmt.Println("new task template: ", c.Args().First()) + return nil + }, + }, + { + Name: "remove", + Usage: "remove an existing template", + Action: func(c *cli.Context) error { + fmt.Println("removed task template: ", c.Args().First()) + return nil + }, + }, + }, + }, + } + + err := app.Run(os.Args) + if err != nil { + log.Fatal(err) + } +} +``` + +### Subcommands categories + +For additional organization in apps that have many subcommands, you can +associate a category for each command to group them together in the help +output. + +E.g. + +```go +package main + +import ( + "log" + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + + app.Commands = []cli.Command{ + { + Name: "noop", + }, + { + Name: "add", + Category: "Template actions", + }, + { + Name: "remove", + Category: "Template actions", + }, + } + + err := app.Run(os.Args) + if err != nil { + log.Fatal(err) + } +} +``` + +Will include: + +``` +COMMANDS: + noop + + Template actions: + add + remove +``` + +### Exit code + +Calling `App.Run` will not automatically call `os.Exit`, which means that by +default the exit code will "fall through" to being `0`. An explicit exit code +may be set by returning a non-nil error that fulfills `cli.ExitCoder`, *or* a +`cli.MultiError` that includes an error that fulfills `cli.ExitCoder`, e.g.: + +``` go +package main + +import ( + "log" + "os" + + "github.com/urfave/cli" +) + +func main() { + app := cli.NewApp() + app.Flags = []cli.Flag{ + cli.BoolTFlag{ + Name: "ginger-crouton", + Usage: "is it in the soup?", + }, + } + app.Action = func(ctx *cli.Context) error { + if !ctx.Bool("ginger-crouton") { + return cli.NewExitError("it is not in the soup", 86) + } + return nil + } + + err := app.Run(os.Args) + if err != nil { + log.Fatal(err) + } +} +``` + +### Bash Completion + +You can enable completion commands by setting the `EnableBashCompletion` +flag on the `App` object. By default, this setting will only auto-complete to +show an app's subcommands, but you can write your own completion methods for +the App or its subcommands. + +<!-- { + "args": ["complete", "&#45;&#45;generate&#45;bash&#45;completion"], + "output": "laundry" +} --> +``` go +package main + +import ( + "fmt" + "log" + "os" + + "github.com/urfave/cli" +) + +func main() { + tasks := []string{"cook", "clean", "laundry", "eat", "sleep", "code"} + + app := cli.NewApp() + app.EnableBashCompletion = true + app.Commands = []cli.Command{ + { + Name: "complete", + Aliases: []string{"c"}, + Usage: "complete a task on the list", + Action: func(c *cli.Context) error { + fmt.Println("completed task: ", c.Args().First()) + return nil + }, + BashComplete: func(c *cli.Context) { + // This will complete if no args are passed + if c.NArg() > 0 { + return + } + for _, t := range tasks { + fmt.Println(t) + } + }, + }, + } + + err := app.Run(os.Args) + if err != nil { + log.Fatal(err) + } +} +``` + +#### Enabling + +Source the `autocomplete/bash_autocomplete` file in your `.bashrc` file while +setting the `PROG` variable to the name of your program: + +`PROG=myprogram source /.../cli/autocomplete/bash_autocomplete` + +#### Distribution + +Copy `autocomplete/bash_autocomplete` into `/etc/bash_completion.d/` and rename +it to the name of the program you wish to add autocomplete support for (or +automatically install it there if you are distributing a package). Don't forget +to source the file to make it active in the current shell. + +``` +sudo cp src/bash_autocomplete /etc/bash_completion.d/<myprogram> +source /etc/bash_completion.d/<myprogram> +``` + +Alternatively, you can just document that users should source the generic +`autocomplete/bash_autocomplete` in their bash configuration with `$PROG` set +to the name of their program (as above). + +#### Customization + +The default bash completion flag (`--generate-bash-completion`) is defined as +`cli.BashCompletionFlag`, and may be redefined if desired, e.g.: + +<!-- { + "args": ["&#45;&#45;compgen"], + "output": "wat\nhelp\nh" +} --> +``` go +package main + +import ( + "log" + "os" + + "github.com/urfave/cli" +) + +func main() { + cli.BashCompletionFlag = cli.BoolFlag{ + Name: "compgen", + Hidden: true, + } + + app := cli.NewApp() + app.EnableBashCompletion = true + app.Commands = []cli.Command{ + { + Name: "wat", + }, + } + err := app.Run(os.Args) + if err != nil { + log.Fatal(err) + } +} +``` + +### Generated Help Text + +The default help flag (`-h/--help`) is defined as `cli.HelpFlag` and is checked +by the cli internals in order to print generated help text for the app, command, +or subcommand, and break execution. + +#### Customization + +All of the help text generation may be customized, and at multiple levels. The +templates are exposed as variables `AppHelpTemplate`, `CommandHelpTemplate`, and +`SubcommandHelpTemplate` which may be reassigned or augmented, and full override +is possible by assigning a compatible func to the `cli.HelpPrinter` variable, +e.g.: + +<!-- { + "output": "Ha HA. I pwnd the help!!1" +} --> +``` go +package main + +import ( + "fmt" + "log" + "io" + "os" + + "github.com/urfave/cli" +) + +func main() { + // EXAMPLE: Append to an existing template + cli.AppHelpTemplate = fmt.Sprintf(`%s + +WEBSITE: http://awesometown.example.com + +SUPPORT: support@awesometown.example.com + +`, cli.AppHelpTemplate) + + // EXAMPLE: Override a template + cli.AppHelpTemplate = `NAME: + {{.Name}} - {{.Usage}} +USAGE: + {{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}} + {{if len .Authors}} +AUTHOR: + {{range .Authors}}{{ . }}{{end}} + {{end}}{{if .Commands}} +COMMANDS: +{{range .Commands}}{{if not .HideHelp}} {{join .Names ", "}}{{ "\t"}}{{.Usage}}{{ "\n" }}{{end}}{{end}}{{end}}{{if .VisibleFlags}} +GLOBAL OPTIONS: + {{range .VisibleFlags}}{{.}} + {{end}}{{end}}{{if .Copyright }} +COPYRIGHT: + {{.Copyright}} + {{end}}{{if .Version}} +VERSION: + {{.Version}} + {{end}} +` + + // EXAMPLE: Replace the `HelpPrinter` func + cli.HelpPrinter = func(w io.Writer, templ string, data interface{}) { + fmt.Println("Ha HA. I pwnd the help!!1") + } + + err := cli.NewApp().Run(os.Args) + if err != nil { + log.Fatal(err) + } +} +``` + +The default flag may be customized to something other than `-h/--help` by +setting `cli.HelpFlag`, e.g.: + +<!-- { + "args": ["&#45;&#45halp"], + "output": "haaaaalp.*HALP" +} --> +``` go +package main + +import ( + "log" + "os" + + "github.com/urfave/cli" +) + +func main() { + cli.HelpFlag = cli.BoolFlag{ + Name: "halp, haaaaalp", + Usage: "HALP", + EnvVar: "SHOW_HALP,HALPPLZ", + } + + err := cli.NewApp().Run(os.Args) + if err != nil { + log.Fatal(err) + } +} +``` + +### Version Flag + +The default version flag (`-v/--version`) is defined as `cli.VersionFlag`, which +is checked by the cli internals in order to print the `App.Version` via +`cli.VersionPrinter` and break execution. + +#### Customization + +The default flag may be customized to something other than `-v/--version` by +setting `cli.VersionFlag`, e.g.: + +<!-- { + "args": ["&#45;&#45print-version"], + "output": "partay version 19\\.99\\.0" +} --> +``` go +package main + +import ( + "log" + "os" + + "github.com/urfave/cli" +) + +func main() { + cli.VersionFlag = cli.BoolFlag{ + Name: "print-version, V", + Usage: "print only the version", + } + + app := cli.NewApp() + app.Name = "partay" + app.Version = "19.99.0" + err := app.Run(os.Args) + if err != nil { + log.Fatal(err) + } +} +``` + +Alternatively, the version printer at `cli.VersionPrinter` may be overridden, e.g.: + +<!-- { + "args": ["&#45;&#45version"], + "output": "version=19\\.99\\.0 revision=fafafaf" +} --> +``` go +package main + +import ( + "fmt" + "log" + "os" + + "github.com/urfave/cli" +) + +var ( + Revision = "fafafaf" +) + +func main() { + cli.VersionPrinter = func(c *cli.Context) { + fmt.Printf("version=%s revision=%s\n", c.App.Version, Revision) + } + + app := cli.NewApp() + app.Name = "partay" + app.Version = "19.99.0" + err := app.Run(os.Args) + if err != nil { + log.Fatal(err) + } +} +``` + +#### Full API Example + +**Notice**: This is a contrived (functioning) example meant strictly for API +demonstration purposes. Use of one's imagination is encouraged. + +<!-- { + "output": "made it!\nPhew!" +} --> +``` go +package main + +import ( + "errors" + "flag" + "fmt" + "io" + "io/ioutil" + "os" + "time" + + "github.com/urfave/cli" +) + +func init() { + cli.AppHelpTemplate += "\nCUSTOMIZED: you bet ur muffins\n" + cli.CommandHelpTemplate += "\nYMMV\n" + cli.SubcommandHelpTemplate += "\nor something\n" + + cli.HelpFlag = cli.BoolFlag{Name: "halp"} + cli.BashCompletionFlag = cli.BoolFlag{Name: "compgen", Hidden: true} + cli.VersionFlag = cli.BoolFlag{Name: "print-version, V"} + + cli.HelpPrinter = func(w io.Writer, templ string, data interface{}) { + fmt.Fprintf(w, "best of luck to you\n") + } + cli.VersionPrinter = func(c *cli.Context) { + fmt.Fprintf(c.App.Writer, "version=%s\n", c.App.Version) + } + cli.OsExiter = func(c int) { + fmt.Fprintf(cli.ErrWriter, "refusing to exit %d\n", c) + } + cli.ErrWriter = ioutil.Discard + cli.FlagStringer = func(fl cli.Flag) string { + return fmt.Sprintf("\t\t%s", fl.GetName()) + } +} + +type hexWriter struct{} + +func (w *hexWriter) Write(p []byte) (int, error) { + for _, b := range p { + fmt.Printf("%x", b) + } + fmt.Printf("\n") + + return len(p), nil +} + +type genericType struct{ + s string +} + +func (g *genericType) Set(value string) error { + g.s = value + return nil +} + +func (g *genericType) String() string { + return g.s +} + +func main() { + app := cli.NewApp() + app.Name = "kənˈtrīv" + app.Version = "19.99.0" + app.Compiled = time.Now() + app.Authors = []cli.Author{ + cli.Author{ + Name: "Example Human", + Email: "human@example.com", + }, + } + app.Copyright = "(c) 1999 Serious Enterprise" + app.HelpName = "contrive" + app.Usage = "demonstrate available API" + app.UsageText = "contrive - demonstrating the available API" + app.ArgsUsage = "[args and such]" + app.Commands = []cli.Command{ + cli.Command{ + Name: "doo", + Aliases: []string{"do"}, + Category: "motion", + Usage: "do the doo", + UsageText: "doo - does the dooing", + Description: "no really, there is a lot of dooing to be done", + ArgsUsage: "[arrgh]", + Flags: []cli.Flag{ + cli.BoolFlag{Name: "forever, forevvarr"}, + }, + Subcommands: cli.Commands{ + cli.Command{ + Name: "wop", + Action: wopAction, + }, + }, + SkipFlagParsing: false, + HideHelp: false, + Hidden: false, + HelpName: "doo!", + BashComplete: func(c *cli.Context) { + fmt.Fprintf(c.App.Writer, "--better\n") + }, + Before: func(c *cli.Context) error { + fmt.Fprintf(c.App.Writer, "brace for impact\n") + return nil + }, + After: func(c *cli.Context) error { + fmt.Fprintf(c.App.Writer, "did we lose anyone?\n") + return nil + }, + Action: func(c *cli.Context) error { + c.Command.FullName() + c.Command.HasName("wop") + c.Command.Names() + c.Command.VisibleFlags() + fmt.Fprintf(c.App.Writer, "dodododododoodododddooooododododooo\n") + if c.Bool("forever") { + c.Command.Run(c) + } + return nil + }, + OnUsageError: func(c *cli.Context, err error, isSubcommand bool) error { + fmt.Fprintf(c.App.Writer, "for shame\n") + return err + }, + }, + } + app.Flags = []cli.Flag{ + cli.BoolFlag{Name: "fancy"}, + cli.BoolTFlag{Name: "fancier"}, + cli.DurationFlag{Name: "howlong, H", Value: time.Second * 3}, + cli.Float64Flag{Name: "howmuch"}, + cli.GenericFlag{Name: "wat", Value: &genericType{}}, + cli.Int64Flag{Name: "longdistance"}, + cli.Int64SliceFlag{Name: "intervals"}, + cli.IntFlag{Name: "distance"}, + cli.IntSliceFlag{Name: "times"}, + cli.StringFlag{Name: "dance-move, d"}, + cli.StringSliceFlag{Name: "names, N"}, + cli.UintFlag{Name: "age"}, + cli.Uint64Flag{Name: "bigage"}, + } + app.EnableBashCompletion = true + app.HideHelp = false + app.HideVersion = false + app.BashComplete = func(c *cli.Context) { + fmt.Fprintf(c.App.Writer, "lipstick\nkiss\nme\nlipstick\nringo\n") + } + app.Before = func(c *cli.Context) error { + fmt.Fprintf(c.App.Writer, "HEEEERE GOES\n") + return nil + } + app.After = func(c *cli.Context) error { + fmt.Fprintf(c.App.Writer, "Phew!\n") + return nil + } + app.CommandNotFound = func(c *cli.Context, command string) { + fmt.Fprintf(c.App.Writer, "Thar be no %q here.\n", command) + } + app.OnUsageError = func(c *cli.Context, err error, isSubcommand bool) error { + if isSubcommand { + return err + } + + fmt.Fprintf(c.App.Writer, "WRONG: %#v\n", err) + return nil + } + app.Action = func(c *cli.Context) error { + cli.DefaultAppComplete(c) + cli.HandleExitCoder(errors.New("not an exit coder, though")) + cli.ShowAppHelp(c) + cli.ShowCommandCompletions(c, "nope") + cli.ShowCommandHelp(c, "also-nope") + cli.ShowCompletions(c) + cli.ShowSubcommandHelp(c) + cli.ShowVersion(c) + + categories := c.App.Categories() + categories.AddCommand("sounds", cli.Command{ + Name: "bloop", + }) + + for _, category := range c.App.Categories() { + fmt.Fprintf(c.App.Writer, "%s\n", category.Name) + fmt.Fprintf(c.App.Writer, "%#v\n", category.Commands) + fmt.Fprintf(c.App.Writer, "%#v\n", category.VisibleCommands()) + } + + fmt.Printf("%#v\n", c.App.Command("doo")) + if c.Bool("infinite") { + c.App.Run([]string{"app", "doo", "wop"}) + } + + if c.Bool("forevar") { + c.App.RunAsSubcommand(c) + } + c.App.Setup() + fmt.Printf("%#v\n", c.App.VisibleCategories()) + fmt.Printf("%#v\n", c.App.VisibleCommands()) + fmt.Printf("%#v\n", c.App.VisibleFlags()) + + fmt.Printf("%#v\n", c.Args().First()) + if len(c.Args()) > 0 { + fmt.Printf("%#v\n", c.Args()[1]) + } + fmt.Printf("%#v\n", c.Args().Present()) + fmt.Printf("%#v\n", c.Args().Tail()) + + set := flag.NewFlagSet("contrive", 0) + nc := cli.NewContext(c.App, set, c) + + fmt.Printf("%#v\n", nc.Args()) + fmt.Printf("%#v\n", nc.Bool("nope")) + fmt.Printf("%#v\n", nc.BoolT("nerp")) + fmt.Printf("%#v\n", nc.Duration("howlong")) + fmt.Printf("%#v\n", nc.Float64("hay")) + fmt.Printf("%#v\n", nc.Generic("bloop")) + fmt.Printf("%#v\n", nc.Int64("bonk")) + fmt.Printf("%#v\n", nc.Int64Slice("burnks")) + fmt.Printf("%#v\n", nc.Int("bips")) + fmt.Printf("%#v\n", nc.IntSlice("blups")) + fmt.Printf("%#v\n", nc.String("snurt")) + fmt.Printf("%#v\n", nc.StringSlice("snurkles")) + fmt.Printf("%#v\n", nc.Uint("flub")) + fmt.Printf("%#v\n", nc.Uint64("florb")) + fmt.Printf("%#v\n", nc.GlobalBool("global-nope")) + fmt.Printf("%#v\n", nc.GlobalBoolT("global-nerp")) + fmt.Printf("%#v\n", nc.GlobalDuration("global-howlong")) + fmt.Printf("%#v\n", nc.GlobalFloat64("global-hay")) + fmt.Printf("%#v\n", nc.GlobalGeneric("global-bloop")) + fmt.Printf("%#v\n", nc.GlobalInt("global-bips")) + fmt.Printf("%#v\n", nc.GlobalIntSlice("global-blups")) + fmt.Printf("%#v\n", nc.GlobalString("global-snurt")) + fmt.Printf("%#v\n", nc.GlobalStringSlice("global-snurkles")) + + fmt.Printf("%#v\n", nc.FlagNames()) + fmt.Printf("%#v\n", nc.GlobalFlagNames()) + fmt.Printf("%#v\n", nc.GlobalIsSet("wat")) + fmt.Printf("%#v\n", nc.GlobalSet("wat", "nope")) + fmt.Printf("%#v\n", nc.NArg()) + fmt.Printf("%#v\n", nc.NumFlags()) + fmt.Printf("%#v\n", nc.Parent()) + + nc.Set("wat", "also-nope") + + ec := cli.NewExitError("ohwell", 86) + fmt.Fprintf(c.App.Writer, "%d", ec.ExitCode()) + fmt.Printf("made it!\n") + return nil + } + + if os.Getenv("HEXY") != "" { + app.Writer = &hexWriter{} + app.ErrWriter = &hexWriter{} + } + + app.Metadata = map[string]interface{}{ + "layers": "many", + "explicable": false, + "whatever-values": 19.99, + } + + + // ignore error so we don't exit non-zero and break gfmrun README example tests + _ = app.Run(os.Args) +} + +func wopAction(c *cli.Context) error { + fmt.Fprintf(c.App.Writer, ":wave: over here, eh\n") + return nil +} +``` + +### Combining short Bool options + +Traditional use of boolean options using their shortnames look like this: +``` +# cmd foobar -s -o +``` + +Suppose you want users to be able to combine your bool options with their shortname. This +can be done using the **UseShortOptionHandling** bool in your commands. Suppose your program +has a two bool flags such as *serve* and *option* with the short options of *-o* and +*-s* respectively. With **UseShortOptionHandling** set to *true*, a user can use a syntax +like: +``` +# cmd foobar -so +``` + +If you enable the **UseShortOptionHandling*, then you must not use any flags that have a single +leading *-* or this will result in failures. For example, **-option** can no longer be used. Flags +with two leading dashes (such as **--options**) are still valid. + +## Contribution Guidelines + +See [./CONTRIBUTING.md](./CONTRIBUTING.md) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/app.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/app.go new file mode 100644 index 0000000000000000000000000000000000000000..9add067b05bf087efeec1acc3f05e91486446891 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/app.go @@ -0,0 +1,508 @@ +package cli + +import ( + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "sort" + "time" +) + +var ( + changeLogURL = "https://github.com/urfave/cli/blob/master/CHANGELOG.md" + appActionDeprecationURL = fmt.Sprintf("%s#deprecated-cli-app-action-signature", changeLogURL) + runAndExitOnErrorDeprecationURL = fmt.Sprintf("%s#deprecated-cli-app-runandexitonerror", changeLogURL) + + contactSysadmin = "This is an error in the application. Please contact the distributor of this application if this is not you." + + errInvalidActionType = NewExitError("ERROR invalid Action type. "+ + fmt.Sprintf("Must be `func(*Context`)` or `func(*Context) error). %s", contactSysadmin)+ + fmt.Sprintf("See %s", appActionDeprecationURL), 2) +) + +// App is the main structure of a cli application. It is recommended that +// an app be created with the cli.NewApp() function +type App struct { + // The name of the program. Defaults to path.Base(os.Args[0]) + Name string + // Full name of command for help, defaults to Name + HelpName string + // Description of the program. + Usage string + // Text to override the USAGE section of help + UsageText string + // Description of the program argument format. + ArgsUsage string + // Version of the program + Version string + // Description of the program + Description string + // List of commands to execute + Commands []Command + // List of flags to parse + Flags []Flag + // Boolean to enable bash completion commands + EnableBashCompletion bool + // Boolean to hide built-in help command + HideHelp bool + // Boolean to hide built-in version flag and the VERSION section of help + HideVersion bool + // Populate on app startup, only gettable through method Categories() + categories CommandCategories + // An action to execute when the bash-completion flag is set + BashComplete BashCompleteFunc + // An action to execute before any subcommands are run, but after the context is ready + // If a non-nil error is returned, no subcommands are run + Before BeforeFunc + // An action to execute after any subcommands are run, but after the subcommand has finished + // It is run even if Action() panics + After AfterFunc + + // The action to execute when no subcommands are specified + // Expects a `cli.ActionFunc` but will accept the *deprecated* signature of `func(*cli.Context) {}` + // *Note*: support for the deprecated `Action` signature will be removed in a future version + Action interface{} + + // Execute this function if the proper command cannot be found + CommandNotFound CommandNotFoundFunc + // Execute this function if an usage error occurs + OnUsageError OnUsageErrorFunc + // Compilation date + Compiled time.Time + // List of all authors who contributed + Authors []Author + // Copyright of the binary if any + Copyright string + // Name of Author (Note: Use App.Authors, this is deprecated) + Author string + // Email of Author (Note: Use App.Authors, this is deprecated) + Email string + // Writer writer to write output to + Writer io.Writer + // ErrWriter writes error output + ErrWriter io.Writer + // Execute this function to handle ExitErrors. If not provided, HandleExitCoder is provided to + // function as a default, so this is optional. + ExitErrHandler ExitErrHandlerFunc + // Other custom info + Metadata map[string]interface{} + // Carries a function which returns app specific info. + ExtraInfo func() map[string]string + // CustomAppHelpTemplate the text template for app help topic. + // cli.go uses text/template to render templates. You can + // render custom help text by setting this variable. + CustomAppHelpTemplate string + + didSetup bool +} + +// Tries to find out when this binary was compiled. +// Returns the current time if it fails to find it. +func compileTime() time.Time { + info, err := os.Stat(os.Args[0]) + if err != nil { + return time.Now() + } + return info.ModTime() +} + +// NewApp creates a new cli Application with some reasonable defaults for Name, +// Usage, Version and Action. +func NewApp() *App { + return &App{ + Name: filepath.Base(os.Args[0]), + HelpName: filepath.Base(os.Args[0]), + Usage: "A new cli application", + UsageText: "", + Version: "0.0.0", + BashComplete: DefaultAppComplete, + Action: helpCommand.Action, + Compiled: compileTime(), + Writer: os.Stdout, + } +} + +// Setup runs initialization code to ensure all data structures are ready for +// `Run` or inspection prior to `Run`. It is internally called by `Run`, but +// will return early if setup has already happened. +func (a *App) Setup() { + if a.didSetup { + return + } + + a.didSetup = true + + if a.Author != "" || a.Email != "" { + a.Authors = append(a.Authors, Author{Name: a.Author, Email: a.Email}) + } + + newCmds := []Command{} + for _, c := range a.Commands { + if c.HelpName == "" { + c.HelpName = fmt.Sprintf("%s %s", a.HelpName, c.Name) + } + newCmds = append(newCmds, c) + } + a.Commands = newCmds + + if a.Command(helpCommand.Name) == nil && !a.HideHelp { + a.Commands = append(a.Commands, helpCommand) + if (HelpFlag != BoolFlag{}) { + a.appendFlag(HelpFlag) + } + } + + if !a.HideVersion { + a.appendFlag(VersionFlag) + } + + a.categories = CommandCategories{} + for _, command := range a.Commands { + a.categories = a.categories.AddCommand(command.Category, command) + } + sort.Sort(a.categories) + + if a.Metadata == nil { + a.Metadata = make(map[string]interface{}) + } + + if a.Writer == nil { + a.Writer = os.Stdout + } +} + +// Run is the entry point to the cli app. Parses the arguments slice and routes +// to the proper flag/args combination +func (a *App) Run(arguments []string) (err error) { + a.Setup() + + // handle the completion flag separately from the flagset since + // completion could be attempted after a flag, but before its value was put + // on the command line. this causes the flagset to interpret the completion + // flag name as the value of the flag before it which is undesirable + // note that we can only do this because the shell autocomplete function + // always appends the completion flag at the end of the command + shellComplete, arguments := checkShellCompleteFlag(a, arguments) + + // parse flags + set, err := flagSet(a.Name, a.Flags) + if err != nil { + return err + } + + set.SetOutput(ioutil.Discard) + err = set.Parse(arguments[1:]) + nerr := normalizeFlags(a.Flags, set) + context := NewContext(a, set, nil) + if nerr != nil { + fmt.Fprintln(a.Writer, nerr) + ShowAppHelp(context) + return nerr + } + context.shellComplete = shellComplete + + if checkCompletions(context) { + return nil + } + + if err != nil { + if a.OnUsageError != nil { + err := a.OnUsageError(context, err, false) + a.handleExitCoder(context, err) + return err + } + fmt.Fprintf(a.Writer, "%s %s\n\n", "Incorrect Usage.", err.Error()) + ShowAppHelp(context) + return err + } + + if !a.HideHelp && checkHelp(context) { + ShowAppHelp(context) + return nil + } + + if !a.HideVersion && checkVersion(context) { + ShowVersion(context) + return nil + } + + if a.After != nil { + defer func() { + if afterErr := a.After(context); afterErr != nil { + if err != nil { + err = NewMultiError(err, afterErr) + } else { + err = afterErr + } + } + }() + } + + if a.Before != nil { + beforeErr := a.Before(context) + if beforeErr != nil { + fmt.Fprintf(a.Writer, "%v\n\n", beforeErr) + ShowAppHelp(context) + a.handleExitCoder(context, beforeErr) + err = beforeErr + return err + } + } + + args := context.Args() + if args.Present() { + name := args.First() + c := a.Command(name) + if c != nil { + return c.Run(context) + } + } + + if a.Action == nil { + a.Action = helpCommand.Action + } + + // Run default Action + err = HandleAction(a.Action, context) + + a.handleExitCoder(context, err) + return err +} + +// RunAndExitOnError calls .Run() and exits non-zero if an error was returned +// +// Deprecated: instead you should return an error that fulfills cli.ExitCoder +// to cli.App.Run. This will cause the application to exit with the given eror +// code in the cli.ExitCoder +func (a *App) RunAndExitOnError() { + if err := a.Run(os.Args); err != nil { + fmt.Fprintln(a.errWriter(), err) + OsExiter(1) + } +} + +// RunAsSubcommand invokes the subcommand given the context, parses ctx.Args() to +// generate command-specific flags +func (a *App) RunAsSubcommand(ctx *Context) (err error) { + // append help to commands + if len(a.Commands) > 0 { + if a.Command(helpCommand.Name) == nil && !a.HideHelp { + a.Commands = append(a.Commands, helpCommand) + if (HelpFlag != BoolFlag{}) { + a.appendFlag(HelpFlag) + } + } + } + + newCmds := []Command{} + for _, c := range a.Commands { + if c.HelpName == "" { + c.HelpName = fmt.Sprintf("%s %s", a.HelpName, c.Name) + } + newCmds = append(newCmds, c) + } + a.Commands = newCmds + + // parse flags + set, err := flagSet(a.Name, a.Flags) + if err != nil { + return err + } + + set.SetOutput(ioutil.Discard) + err = set.Parse(ctx.Args().Tail()) + nerr := normalizeFlags(a.Flags, set) + context := NewContext(a, set, ctx) + + if nerr != nil { + fmt.Fprintln(a.Writer, nerr) + fmt.Fprintln(a.Writer) + if len(a.Commands) > 0 { + ShowSubcommandHelp(context) + } else { + ShowCommandHelp(ctx, context.Args().First()) + } + return nerr + } + + if checkCompletions(context) { + return nil + } + + if err != nil { + if a.OnUsageError != nil { + err = a.OnUsageError(context, err, true) + a.handleExitCoder(context, err) + return err + } + fmt.Fprintf(a.Writer, "%s %s\n\n", "Incorrect Usage.", err.Error()) + ShowSubcommandHelp(context) + return err + } + + if len(a.Commands) > 0 { + if checkSubcommandHelp(context) { + return nil + } + } else { + if checkCommandHelp(ctx, context.Args().First()) { + return nil + } + } + + if a.After != nil { + defer func() { + afterErr := a.After(context) + if afterErr != nil { + a.handleExitCoder(context, err) + if err != nil { + err = NewMultiError(err, afterErr) + } else { + err = afterErr + } + } + }() + } + + if a.Before != nil { + beforeErr := a.Before(context) + if beforeErr != nil { + a.handleExitCoder(context, beforeErr) + err = beforeErr + return err + } + } + + args := context.Args() + if args.Present() { + name := args.First() + c := a.Command(name) + if c != nil { + return c.Run(context) + } + } + + // Run default Action + err = HandleAction(a.Action, context) + + a.handleExitCoder(context, err) + return err +} + +// Command returns the named command on App. Returns nil if the command does not exist +func (a *App) Command(name string) *Command { + for _, c := range a.Commands { + if c.HasName(name) { + return &c + } + } + + return nil +} + +// Categories returns a slice containing all the categories with the commands they contain +func (a *App) Categories() CommandCategories { + return a.categories +} + +// VisibleCategories returns a slice of categories and commands that are +// Hidden=false +func (a *App) VisibleCategories() []*CommandCategory { + ret := []*CommandCategory{} + for _, category := range a.categories { + if visible := func() *CommandCategory { + for _, command := range category.Commands { + if !command.Hidden { + return category + } + } + return nil + }(); visible != nil { + ret = append(ret, visible) + } + } + return ret +} + +// VisibleCommands returns a slice of the Commands with Hidden=false +func (a *App) VisibleCommands() []Command { + ret := []Command{} + for _, command := range a.Commands { + if !command.Hidden { + ret = append(ret, command) + } + } + return ret +} + +// VisibleFlags returns a slice of the Flags with Hidden=false +func (a *App) VisibleFlags() []Flag { + return visibleFlags(a.Flags) +} + +func (a *App) hasFlag(flag Flag) bool { + for _, f := range a.Flags { + if flag == f { + return true + } + } + + return false +} + +func (a *App) errWriter() io.Writer { + // When the app ErrWriter is nil use the package level one. + if a.ErrWriter == nil { + return ErrWriter + } + + return a.ErrWriter +} + +func (a *App) appendFlag(flag Flag) { + if !a.hasFlag(flag) { + a.Flags = append(a.Flags, flag) + } +} + +func (a *App) handleExitCoder(context *Context, err error) { + if a.ExitErrHandler != nil { + a.ExitErrHandler(context, err) + } else { + HandleExitCoder(err) + } +} + +// Author represents someone who has contributed to a cli project. +type Author struct { + Name string // The Authors name + Email string // The Authors email +} + +// String makes Author comply to the Stringer interface, to allow an easy print in the templating process +func (a Author) String() string { + e := "" + if a.Email != "" { + e = " <" + a.Email + ">" + } + + return fmt.Sprintf("%v%v", a.Name, e) +} + +// HandleAction attempts to figure out which Action signature was used. If +// it's an ActionFunc or a func with the legacy signature for Action, the func +// is run! +func HandleAction(action interface{}, context *Context) (err error) { + if a, ok := action.(ActionFunc); ok { + return a(context) + } else if a, ok := action.(func(*Context) error); ok { + return a(context) + } else if a, ok := action.(func(*Context)); ok { // deprecated function signature + a(context) + return nil + } + + return errInvalidActionType +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/appveyor.yml b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/appveyor.yml new file mode 100644 index 0000000000000000000000000000000000000000..1e1489c3651dd6f514091f49e293d68453778b5d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/appveyor.yml @@ -0,0 +1,26 @@ +version: "{build}" + +os: Windows Server 2016 + +image: Visual Studio 2017 + +clone_folder: c:\gopath\src\github.com\urfave\cli + +environment: + GOPATH: C:\gopath + GOVERSION: 1.8.x + PYTHON: C:\Python36-x64 + PYTHON_VERSION: 3.6.x + PYTHON_ARCH: 64 + +install: +- set PATH=%GOPATH%\bin;C:\go\bin;%PATH% +- go version +- go env +- go get github.com/urfave/gfmrun/... +- go get -v -t ./... + +build_script: +- python runtests vet +- python runtests test +- python runtests gfmrun diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/category.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/category.go new file mode 100644 index 0000000000000000000000000000000000000000..bf3c73c55ee230ba51f38d92118bd2e843c7302b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/category.go @@ -0,0 +1,44 @@ +package cli + +// CommandCategories is a slice of *CommandCategory. +type CommandCategories []*CommandCategory + +// CommandCategory is a category containing commands. +type CommandCategory struct { + Name string + Commands Commands +} + +func (c CommandCategories) Less(i, j int) bool { + return lexicographicLess(c[i].Name, c[j].Name) +} + +func (c CommandCategories) Len() int { + return len(c) +} + +func (c CommandCategories) Swap(i, j int) { + c[i], c[j] = c[j], c[i] +} + +// AddCommand adds a command to a category. +func (c CommandCategories) AddCommand(category string, command Command) CommandCategories { + for _, commandCategory := range c { + if commandCategory.Name == category { + commandCategory.Commands = append(commandCategory.Commands, command) + return c + } + } + return append(c, &CommandCategory{Name: category, Commands: []Command{command}}) +} + +// VisibleCommands returns a slice of the Commands with Hidden=false +func (c *CommandCategory) VisibleCommands() []Command { + ret := []Command{} + for _, command := range c.Commands { + if !command.Hidden { + ret = append(ret, command) + } + } + return ret +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/cli.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/cli.go new file mode 100644 index 0000000000000000000000000000000000000000..90c07eb8ef94111729cc6e73ea81d83a096a6ba6 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/cli.go @@ -0,0 +1,22 @@ +// Package cli provides a minimal framework for creating and organizing command line +// Go applications. cli is designed to be easy to understand and write, the most simple +// cli application can be written as follows: +// func main() { +// cli.NewApp().Run(os.Args) +// } +// +// Of course this application does not do much, so let's make this an actual application: +// func main() { +// app := cli.NewApp() +// app.Name = "greet" +// app.Usage = "say a greeting" +// app.Action = func(c *cli.Context) error { +// println("Greetings") +// return nil +// } +// +// app.Run(os.Args) +// } +package cli + +//go:generate python ./generate-flag-types cli -i flag-types.json -o flag_generated.go diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/command.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/command.go new file mode 100644 index 0000000000000000000000000000000000000000..3d44404f105b63cd732ff79c48e2d44453be3c40 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/command.go @@ -0,0 +1,383 @@ +package cli + +import ( + "flag" + "fmt" + "io/ioutil" + "sort" + "strings" +) + +// Command is a subcommand for a cli.App. +type Command struct { + // The name of the command + Name string + // short name of the command. Typically one character (deprecated, use `Aliases`) + ShortName string + // A list of aliases for the command + Aliases []string + // A short description of the usage of this command + Usage string + // Custom text to show on USAGE section of help + UsageText string + // A longer explanation of how the command works + Description string + // A short description of the arguments of this command + ArgsUsage string + // The category the command is part of + Category string + // The function to call when checking for bash command completions + BashComplete BashCompleteFunc + // An action to execute before any sub-subcommands are run, but after the context is ready + // If a non-nil error is returned, no sub-subcommands are run + Before BeforeFunc + // An action to execute after any subcommands are run, but after the subcommand has finished + // It is run even if Action() panics + After AfterFunc + // The function to call when this command is invoked + Action interface{} + // TODO: replace `Action: interface{}` with `Action: ActionFunc` once some kind + // of deprecation period has passed, maybe? + + // Execute this function if a usage error occurs. + OnUsageError OnUsageErrorFunc + // List of child commands + Subcommands Commands + // List of flags to parse + Flags []Flag + // Treat all flags as normal arguments if true + SkipFlagParsing bool + // Skip argument reordering which attempts to move flags before arguments, + // but only works if all flags appear after all arguments. This behavior was + // removed n version 2 since it only works under specific conditions so we + // backport here by exposing it as an option for compatibility. + SkipArgReorder bool + // Boolean to hide built-in help command + HideHelp bool + // Boolean to hide this command from help or completion + Hidden bool + // Boolean to enable short-option handling so user can combine several + // single-character bool arguments into one + // i.e. foobar -o -v -> foobar -ov + UseShortOptionHandling bool + + // Full name of command for help, defaults to full command name, including parent commands. + HelpName string + commandNamePath []string + + // CustomHelpTemplate the text template for the command help topic. + // cli.go uses text/template to render templates. You can + // render custom help text by setting this variable. + CustomHelpTemplate string +} + +type CommandsByName []Command + +func (c CommandsByName) Len() int { + return len(c) +} + +func (c CommandsByName) Less(i, j int) bool { + return lexicographicLess(c[i].Name, c[j].Name) +} + +func (c CommandsByName) Swap(i, j int) { + c[i], c[j] = c[j], c[i] +} + +// FullName returns the full name of the command. +// For subcommands this ensures that parent commands are part of the command path +func (c Command) FullName() string { + if c.commandNamePath == nil { + return c.Name + } + return strings.Join(c.commandNamePath, " ") +} + +// Commands is a slice of Command +type Commands []Command + +// Run invokes the command given the context, parses ctx.Args() to generate command-specific flags +func (c Command) Run(ctx *Context) (err error) { + if len(c.Subcommands) > 0 { + return c.startApp(ctx) + } + + if !c.HideHelp && (HelpFlag != BoolFlag{}) { + // append help to flags + c.Flags = append( + c.Flags, + HelpFlag, + ) + } + + set, err := c.parseFlags(ctx.Args().Tail()) + + context := NewContext(ctx.App, set, ctx) + context.Command = c + if checkCommandCompletions(context, c.Name) { + return nil + } + + if err != nil { + if c.OnUsageError != nil { + err := c.OnUsageError(context, err, false) + context.App.handleExitCoder(context, err) + return err + } + fmt.Fprintln(context.App.Writer, "Incorrect Usage:", err.Error()) + fmt.Fprintln(context.App.Writer) + ShowCommandHelp(context, c.Name) + return err + } + + if checkCommandHelp(context, c.Name) { + return nil + } + + if c.After != nil { + defer func() { + afterErr := c.After(context) + if afterErr != nil { + context.App.handleExitCoder(context, err) + if err != nil { + err = NewMultiError(err, afterErr) + } else { + err = afterErr + } + } + }() + } + + if c.Before != nil { + err = c.Before(context) + if err != nil { + ShowCommandHelp(context, c.Name) + context.App.handleExitCoder(context, err) + return err + } + } + + if c.Action == nil { + c.Action = helpSubcommand.Action + } + + err = HandleAction(c.Action, context) + + if err != nil { + context.App.handleExitCoder(context, err) + } + return err +} + +func (c *Command) parseFlags(args Args) (*flag.FlagSet, error) { + set, err := flagSet(c.Name, c.Flags) + if err != nil { + return nil, err + } + set.SetOutput(ioutil.Discard) + + if c.SkipFlagParsing { + return set, set.Parse(append([]string{"--"}, args...)) + } + + if !c.SkipArgReorder { + args = reorderArgs(args) + } + +PARSE: + err = set.Parse(args) + if err != nil { + if c.UseShortOptionHandling { + // To enable short-option handling (e.g., "-it" vs "-i -t") + // we have to iteratively catch parsing errors. This way + // we achieve LR parsing without transforming any arguments. + // Otherwise, there is no way we can discriminate combined + // short options from common arguments that should be left + // untouched. + errStr := err.Error() + trimmed := strings.TrimPrefix(errStr, "flag provided but not defined: ") + if errStr == trimmed { + return nil, err + } + // regenerate the initial args with the split short opts + newArgs := Args{} + for i, arg := range args { + if arg != trimmed { + newArgs = append(newArgs, arg) + continue + } + shortOpts := translateShortOptions(set, Args{trimmed}) + if len(shortOpts) == 1 { + return nil, err + } + // add each short option and all remaining arguments + newArgs = append(newArgs, shortOpts...) + newArgs = append(newArgs, args[i+1:]...) + args = newArgs + // now reset the flagset parse again + set, err = flagSet(c.Name, c.Flags) + if err != nil { + return nil, err + } + set.SetOutput(ioutil.Discard) + goto PARSE + } + } + return nil, err + } + + err = normalizeFlags(c.Flags, set) + if err != nil { + return nil, err + } + + return set, nil +} + +// reorderArgs moves all flags before arguments as this is what flag expects +func reorderArgs(args []string) []string { + var nonflags, flags []string + + readFlagValue := false + for i, arg := range args { + if arg == "--" { + nonflags = append(nonflags, args[i:]...) + break + } + + if readFlagValue && !strings.HasPrefix(arg, "-") && !strings.HasPrefix(arg, "--") { + readFlagValue = false + flags = append(flags, arg) + continue + } + readFlagValue = false + + if arg != "-" && strings.HasPrefix(arg, "-") { + flags = append(flags, arg) + + readFlagValue = !strings.Contains(arg, "=") + } else { + nonflags = append(nonflags, arg) + } + } + + return append(flags, nonflags...) +} + +func translateShortOptions(set *flag.FlagSet, flagArgs Args) []string { + allCharsFlags := func (s string) bool { + for i := range s { + f := set.Lookup(string(s[i])) + if f == nil { + return false + } + } + return true + } + + // separate combined flags + var flagArgsSeparated []string + for _, flagArg := range flagArgs { + if strings.HasPrefix(flagArg, "-") && strings.HasPrefix(flagArg, "--") == false && len(flagArg) > 2 { + if !allCharsFlags(flagArg[1:]) { + flagArgsSeparated = append(flagArgsSeparated, flagArg) + continue + } + for _, flagChar := range flagArg[1:] { + flagArgsSeparated = append(flagArgsSeparated, "-"+string(flagChar)) + } + } else { + flagArgsSeparated = append(flagArgsSeparated, flagArg) + } + } + return flagArgsSeparated +} + +// Names returns the names including short names and aliases. +func (c Command) Names() []string { + names := []string{c.Name} + + if c.ShortName != "" { + names = append(names, c.ShortName) + } + + return append(names, c.Aliases...) +} + +// HasName returns true if Command.Name or Command.ShortName matches given name +func (c Command) HasName(name string) bool { + for _, n := range c.Names() { + if n == name { + return true + } + } + return false +} + +func (c Command) startApp(ctx *Context) error { + app := NewApp() + app.Metadata = ctx.App.Metadata + // set the name and usage + app.Name = fmt.Sprintf("%s %s", ctx.App.Name, c.Name) + if c.HelpName == "" { + app.HelpName = c.HelpName + } else { + app.HelpName = app.Name + } + + app.Usage = c.Usage + app.Description = c.Description + app.ArgsUsage = c.ArgsUsage + + // set CommandNotFound + app.CommandNotFound = ctx.App.CommandNotFound + app.CustomAppHelpTemplate = c.CustomHelpTemplate + + // set the flags and commands + app.Commands = c.Subcommands + app.Flags = c.Flags + app.HideHelp = c.HideHelp + + app.Version = ctx.App.Version + app.HideVersion = ctx.App.HideVersion + app.Compiled = ctx.App.Compiled + app.Author = ctx.App.Author + app.Email = ctx.App.Email + app.Writer = ctx.App.Writer + app.ErrWriter = ctx.App.ErrWriter + + app.categories = CommandCategories{} + for _, command := range c.Subcommands { + app.categories = app.categories.AddCommand(command.Category, command) + } + + sort.Sort(app.categories) + + // bash completion + app.EnableBashCompletion = ctx.App.EnableBashCompletion + if c.BashComplete != nil { + app.BashComplete = c.BashComplete + } + + // set the actions + app.Before = c.Before + app.After = c.After + if c.Action != nil { + app.Action = c.Action + } else { + app.Action = helpSubcommand.Action + } + app.OnUsageError = c.OnUsageError + + for index, cc := range app.Commands { + app.Commands[index].commandNamePath = []string{c.Name, cc.Name} + } + + return app.RunAsSubcommand(ctx) +} + +// VisibleFlags returns a slice of the Flags with Hidden=false +func (c Command) VisibleFlags() []Flag { + return visibleFlags(c.Flags) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/context.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/context.go new file mode 100644 index 0000000000000000000000000000000000000000..552ee740522137927718d52864d8511d90afcedc --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/context.go @@ -0,0 +1,287 @@ +package cli + +import ( + "errors" + "flag" + "os" + "reflect" + "strings" + "syscall" +) + +// Context is a type that is passed through to +// each Handler action in a cli application. Context +// can be used to retrieve context-specific Args and +// parsed command-line options. +type Context struct { + App *App + Command Command + shellComplete bool + flagSet *flag.FlagSet + setFlags map[string]bool + parentContext *Context +} + +// NewContext creates a new context. For use in when invoking an App or Command action. +func NewContext(app *App, set *flag.FlagSet, parentCtx *Context) *Context { + c := &Context{App: app, flagSet: set, parentContext: parentCtx} + + if parentCtx != nil { + c.shellComplete = parentCtx.shellComplete + } + + return c +} + +// NumFlags returns the number of flags set +func (c *Context) NumFlags() int { + return c.flagSet.NFlag() +} + +// Set sets a context flag to a value. +func (c *Context) Set(name, value string) error { + c.setFlags = nil + return c.flagSet.Set(name, value) +} + +// GlobalSet sets a context flag to a value on the global flagset +func (c *Context) GlobalSet(name, value string) error { + globalContext(c).setFlags = nil + return globalContext(c).flagSet.Set(name, value) +} + +// IsSet determines if the flag was actually set +func (c *Context) IsSet(name string) bool { + if c.setFlags == nil { + c.setFlags = make(map[string]bool) + + c.flagSet.Visit(func(f *flag.Flag) { + c.setFlags[f.Name] = true + }) + + c.flagSet.VisitAll(func(f *flag.Flag) { + if _, ok := c.setFlags[f.Name]; ok { + return + } + c.setFlags[f.Name] = false + }) + + // XXX hack to support IsSet for flags with EnvVar + // + // There isn't an easy way to do this with the current implementation since + // whether a flag was set via an environment variable is very difficult to + // determine here. Instead, we intend to introduce a backwards incompatible + // change in version 2 to add `IsSet` to the Flag interface to push the + // responsibility closer to where the information required to determine + // whether a flag is set by non-standard means such as environment + // variables is available. + // + // See https://github.com/urfave/cli/issues/294 for additional discussion + flags := c.Command.Flags + if c.Command.Name == "" { // cannot == Command{} since it contains slice types + if c.App != nil { + flags = c.App.Flags + } + } + for _, f := range flags { + eachName(f.GetName(), func(name string) { + if isSet, ok := c.setFlags[name]; isSet || !ok { + return + } + + val := reflect.ValueOf(f) + if val.Kind() == reflect.Ptr { + val = val.Elem() + } + + filePathValue := val.FieldByName("FilePath") + if filePathValue.IsValid() { + eachName(filePathValue.String(), func(filePath string) { + if _, err := os.Stat(filePath); err == nil { + c.setFlags[name] = true + return + } + }) + } + + envVarValue := val.FieldByName("EnvVar") + if envVarValue.IsValid() { + eachName(envVarValue.String(), func(envVar string) { + envVar = strings.TrimSpace(envVar) + if _, ok := syscall.Getenv(envVar); ok { + c.setFlags[name] = true + return + } + }) + } + }) + } + } + + return c.setFlags[name] +} + +// GlobalIsSet determines if the global flag was actually set +func (c *Context) GlobalIsSet(name string) bool { + ctx := c + if ctx.parentContext != nil { + ctx = ctx.parentContext + } + + for ; ctx != nil; ctx = ctx.parentContext { + if ctx.IsSet(name) { + return true + } + } + return false +} + +// FlagNames returns a slice of flag names used in this context. +func (c *Context) FlagNames() (names []string) { + for _, flag := range c.Command.Flags { + name := strings.Split(flag.GetName(), ",")[0] + if name == "help" { + continue + } + names = append(names, name) + } + return +} + +// GlobalFlagNames returns a slice of global flag names used by the app. +func (c *Context) GlobalFlagNames() (names []string) { + for _, flag := range c.App.Flags { + name := strings.Split(flag.GetName(), ",")[0] + if name == "help" || name == "version" { + continue + } + names = append(names, name) + } + return +} + +// Parent returns the parent context, if any +func (c *Context) Parent() *Context { + return c.parentContext +} + +// value returns the value of the flag coressponding to `name` +func (c *Context) value(name string) interface{} { + return c.flagSet.Lookup(name).Value.(flag.Getter).Get() +} + +// Args contains apps console arguments +type Args []string + +// Args returns the command line arguments associated with the context. +func (c *Context) Args() Args { + args := Args(c.flagSet.Args()) + return args +} + +// NArg returns the number of the command line arguments. +func (c *Context) NArg() int { + return len(c.Args()) +} + +// Get returns the nth argument, or else a blank string +func (a Args) Get(n int) string { + if len(a) > n { + return a[n] + } + return "" +} + +// First returns the first argument, or else a blank string +func (a Args) First() string { + return a.Get(0) +} + +// Tail returns the rest of the arguments (not the first one) +// or else an empty string slice +func (a Args) Tail() []string { + if len(a) >= 2 { + return []string(a)[1:] + } + return []string{} +} + +// Present checks if there are any arguments present +func (a Args) Present() bool { + return len(a) != 0 +} + +// Swap swaps arguments at the given indexes +func (a Args) Swap(from, to int) error { + if from >= len(a) || to >= len(a) { + return errors.New("index out of range") + } + a[from], a[to] = a[to], a[from] + return nil +} + +func globalContext(ctx *Context) *Context { + if ctx == nil { + return nil + } + + for { + if ctx.parentContext == nil { + return ctx + } + ctx = ctx.parentContext + } +} + +func lookupGlobalFlagSet(name string, ctx *Context) *flag.FlagSet { + if ctx.parentContext != nil { + ctx = ctx.parentContext + } + for ; ctx != nil; ctx = ctx.parentContext { + if f := ctx.flagSet.Lookup(name); f != nil { + return ctx.flagSet + } + } + return nil +} + +func copyFlag(name string, ff *flag.Flag, set *flag.FlagSet) { + switch ff.Value.(type) { + case *StringSlice: + default: + set.Set(name, ff.Value.String()) + } +} + +func normalizeFlags(flags []Flag, set *flag.FlagSet) error { + visited := make(map[string]bool) + set.Visit(func(f *flag.Flag) { + visited[f.Name] = true + }) + for _, f := range flags { + parts := strings.Split(f.GetName(), ",") + if len(parts) == 1 { + continue + } + var ff *flag.Flag + for _, name := range parts { + name = strings.Trim(name, " ") + if visited[name] { + if ff != nil { + return errors.New("Cannot use two forms of the same flag: " + name + " " + ff.Name) + } + ff = set.Lookup(name) + } + } + if ff == nil { + continue + } + for _, name := range parts { + name = strings.Trim(name, " ") + if !visited[name] { + copyFlag(name, ff, set) + } + } + } + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/errors.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/errors.go new file mode 100644 index 0000000000000000000000000000000000000000..562b2953cf218736a1734d503a9cf488ab3ac184 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/errors.go @@ -0,0 +1,115 @@ +package cli + +import ( + "fmt" + "io" + "os" + "strings" +) + +// OsExiter is the function used when the app exits. If not set defaults to os.Exit. +var OsExiter = os.Exit + +// ErrWriter is used to write errors to the user. This can be anything +// implementing the io.Writer interface and defaults to os.Stderr. +var ErrWriter io.Writer = os.Stderr + +// MultiError is an error that wraps multiple errors. +type MultiError struct { + Errors []error +} + +// NewMultiError creates a new MultiError. Pass in one or more errors. +func NewMultiError(err ...error) MultiError { + return MultiError{Errors: err} +} + +// Error implements the error interface. +func (m MultiError) Error() string { + errs := make([]string, len(m.Errors)) + for i, err := range m.Errors { + errs[i] = err.Error() + } + + return strings.Join(errs, "\n") +} + +type ErrorFormatter interface { + Format(s fmt.State, verb rune) +} + +// ExitCoder is the interface checked by `App` and `Command` for a custom exit +// code +type ExitCoder interface { + error + ExitCode() int +} + +// ExitError fulfills both the builtin `error` interface and `ExitCoder` +type ExitError struct { + exitCode int + message interface{} +} + +// NewExitError makes a new *ExitError +func NewExitError(message interface{}, exitCode int) *ExitError { + return &ExitError{ + exitCode: exitCode, + message: message, + } +} + +// Error returns the string message, fulfilling the interface required by +// `error` +func (ee *ExitError) Error() string { + return fmt.Sprintf("%v", ee.message) +} + +// ExitCode returns the exit code, fulfilling the interface required by +// `ExitCoder` +func (ee *ExitError) ExitCode() int { + return ee.exitCode +} + +// HandleExitCoder checks if the error fulfills the ExitCoder interface, and if +// so prints the error to stderr (if it is non-empty) and calls OsExiter with the +// given exit code. If the given error is a MultiError, then this func is +// called on all members of the Errors slice and calls OsExiter with the last exit code. +func HandleExitCoder(err error) { + if err == nil { + return + } + + if exitErr, ok := err.(ExitCoder); ok { + if err.Error() != "" { + if _, ok := exitErr.(ErrorFormatter); ok { + fmt.Fprintf(ErrWriter, "%+v\n", err) + } else { + fmt.Fprintln(ErrWriter, err) + } + } + OsExiter(exitErr.ExitCode()) + return + } + + if multiErr, ok := err.(MultiError); ok { + code := handleMultiError(multiErr) + OsExiter(code) + return + } +} + +func handleMultiError(multiErr MultiError) int { + code := 1 + for _, merr := range multiErr.Errors { + if multiErr2, ok := merr.(MultiError); ok { + code = handleMultiError(multiErr2) + } else { + fmt.Fprintln(ErrWriter, merr) + if exitErr, ok := merr.(ExitCoder); ok { + code = exitErr.ExitCode() + } + } + } + return code +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/flag-types.json b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/flag-types.json new file mode 100644 index 0000000000000000000000000000000000000000..1223107859a17d1be2d0a2f2767291d08326cc4b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/flag-types.json @@ -0,0 +1,93 @@ +[ + { + "name": "Bool", + "type": "bool", + "value": false, + "context_default": "false", + "parser": "strconv.ParseBool(f.Value.String())" + }, + { + "name": "BoolT", + "type": "bool", + "value": false, + "doctail": " that is true by default", + "context_default": "false", + "parser": "strconv.ParseBool(f.Value.String())" + }, + { + "name": "Duration", + "type": "time.Duration", + "doctail": " (see https://golang.org/pkg/time/#ParseDuration)", + "context_default": "0", + "parser": "time.ParseDuration(f.Value.String())" + }, + { + "name": "Float64", + "type": "float64", + "context_default": "0", + "parser": "strconv.ParseFloat(f.Value.String(), 64)" + }, + { + "name": "Generic", + "type": "Generic", + "dest": false, + "context_default": "nil", + "context_type": "interface{}" + }, + { + "name": "Int64", + "type": "int64", + "context_default": "0", + "parser": "strconv.ParseInt(f.Value.String(), 0, 64)" + }, + { + "name": "Int", + "type": "int", + "context_default": "0", + "parser": "strconv.ParseInt(f.Value.String(), 0, 64)", + "parser_cast": "int(parsed)" + }, + { + "name": "IntSlice", + "type": "*IntSlice", + "dest": false, + "context_default": "nil", + "context_type": "[]int", + "parser": "(f.Value.(*IntSlice)).Value(), error(nil)" + }, + { + "name": "Int64Slice", + "type": "*Int64Slice", + "dest": false, + "context_default": "nil", + "context_type": "[]int64", + "parser": "(f.Value.(*Int64Slice)).Value(), error(nil)" + }, + { + "name": "String", + "type": "string", + "context_default": "\"\"", + "parser": "f.Value.String(), error(nil)" + }, + { + "name": "StringSlice", + "type": "*StringSlice", + "dest": false, + "context_default": "nil", + "context_type": "[]string", + "parser": "(f.Value.(*StringSlice)).Value(), error(nil)" + }, + { + "name": "Uint64", + "type": "uint64", + "context_default": "0", + "parser": "strconv.ParseUint(f.Value.String(), 0, 64)" + }, + { + "name": "Uint", + "type": "uint", + "context_default": "0", + "parser": "strconv.ParseUint(f.Value.String(), 0, 64)", + "parser_cast": "uint(parsed)" + } +] diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/flag.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/flag.go new file mode 100644 index 0000000000000000000000000000000000000000..b0cffc006e5135c5f55bac94c4d8b6fcb6d37aca --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/flag.go @@ -0,0 +1,786 @@ +package cli + +import ( + "flag" + "fmt" + "io/ioutil" + "reflect" + "runtime" + "strconv" + "strings" + "syscall" + "time" +) + +const defaultPlaceholder = "value" + +// BashCompletionFlag enables bash-completion for all commands and subcommands +var BashCompletionFlag Flag = BoolFlag{ + Name: "generate-bash-completion", + Hidden: true, +} + +// VersionFlag prints the version for the application +var VersionFlag Flag = BoolFlag{ + Name: "version, v", + Usage: "print the version", +} + +// HelpFlag prints the help for all commands and subcommands +// Set to the zero value (BoolFlag{}) to disable flag -- keeps subcommand +// unless HideHelp is set to true) +var HelpFlag Flag = BoolFlag{ + Name: "help, h", + Usage: "show help", +} + +// FlagStringer converts a flag definition to a string. This is used by help +// to display a flag. +var FlagStringer FlagStringFunc = stringifyFlag + +// FlagNamePrefixer converts a full flag name and its placeholder into the help +// message flag prefix. This is used by the default FlagStringer. +var FlagNamePrefixer FlagNamePrefixFunc = prefixedNames + +// FlagEnvHinter annotates flag help message with the environment variable +// details. This is used by the default FlagStringer. +var FlagEnvHinter FlagEnvHintFunc = withEnvHint + +// FlagFileHinter annotates flag help message with the environment variable +// details. This is used by the default FlagStringer. +var FlagFileHinter FlagFileHintFunc = withFileHint + +// FlagsByName is a slice of Flag. +type FlagsByName []Flag + +func (f FlagsByName) Len() int { + return len(f) +} + +func (f FlagsByName) Less(i, j int) bool { + return lexicographicLess(f[i].GetName(), f[j].GetName()) +} + +func (f FlagsByName) Swap(i, j int) { + f[i], f[j] = f[j], f[i] +} + +// Flag is a common interface related to parsing flags in cli. +// For more advanced flag parsing techniques, it is recommended that +// this interface be implemented. +type Flag interface { + fmt.Stringer + // Apply Flag settings to the given flag set + Apply(*flag.FlagSet) + GetName() string +} + +// errorableFlag is an interface that allows us to return errors during apply +// it allows flags defined in this library to return errors in a fashion backwards compatible +// TODO remove in v2 and modify the existing Flag interface to return errors +type errorableFlag interface { + Flag + + ApplyWithError(*flag.FlagSet) error +} + +func flagSet(name string, flags []Flag) (*flag.FlagSet, error) { + set := flag.NewFlagSet(name, flag.ContinueOnError) + + for _, f := range flags { + //TODO remove in v2 when errorableFlag is removed + if ef, ok := f.(errorableFlag); ok { + if err := ef.ApplyWithError(set); err != nil { + return nil, err + } + } else { + f.Apply(set) + } + } + return set, nil +} + +func eachName(longName string, fn func(string)) { + parts := strings.Split(longName, ",") + for _, name := range parts { + name = strings.Trim(name, " ") + fn(name) + } +} + +// Generic is a generic parseable type identified by a specific flag +type Generic interface { + Set(value string) error + String() string +} + +// Apply takes the flagset and calls Set on the generic flag with the value +// provided by the user for parsing by the flag +// Ignores parsing errors +func (f GenericFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError takes the flagset and calls Set on the generic flag with the value +// provided by the user for parsing by the flag +func (f GenericFlag) ApplyWithError(set *flag.FlagSet) error { + val := f.Value + if fileEnvVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok { + if err := val.Set(fileEnvVal); err != nil { + return fmt.Errorf("could not parse %s as value for flag %s: %s", fileEnvVal, f.Name, err) + } + } + + eachName(f.Name, func(name string) { + set.Var(f.Value, name, f.Usage) + }) + + return nil +} + +// StringSlice is an opaque type for []string to satisfy flag.Value and flag.Getter +type StringSlice []string + +// Set appends the string value to the list of values +func (f *StringSlice) Set(value string) error { + *f = append(*f, value) + return nil +} + +// String returns a readable representation of this value (for usage defaults) +func (f *StringSlice) String() string { + return fmt.Sprintf("%s", *f) +} + +// Value returns the slice of strings set by this flag +func (f *StringSlice) Value() []string { + return *f +} + +// Get returns the slice of strings set by this flag +func (f *StringSlice) Get() interface{} { + return *f +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f StringSliceFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f StringSliceFlag) ApplyWithError(set *flag.FlagSet) error { + if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok { + newVal := &StringSlice{} + for _, s := range strings.Split(envVal, ",") { + s = strings.TrimSpace(s) + if err := newVal.Set(s); err != nil { + return fmt.Errorf("could not parse %s as string value for flag %s: %s", envVal, f.Name, err) + } + } + if f.Value == nil { + f.Value = newVal + } else { + *f.Value = *newVal + } + } + + eachName(f.Name, func(name string) { + if f.Value == nil { + f.Value = &StringSlice{} + } + set.Var(f.Value, name, f.Usage) + }) + + return nil +} + +// IntSlice is an opaque type for []int to satisfy flag.Value and flag.Getter +type IntSlice []int + +// Set parses the value into an integer and appends it to the list of values +func (f *IntSlice) Set(value string) error { + tmp, err := strconv.Atoi(value) + if err != nil { + return err + } + *f = append(*f, tmp) + return nil +} + +// String returns a readable representation of this value (for usage defaults) +func (f *IntSlice) String() string { + return fmt.Sprintf("%#v", *f) +} + +// Value returns the slice of ints set by this flag +func (f *IntSlice) Value() []int { + return *f +} + +// Get returns the slice of ints set by this flag +func (f *IntSlice) Get() interface{} { + return *f +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f IntSliceFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f IntSliceFlag) ApplyWithError(set *flag.FlagSet) error { + if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok { + newVal := &IntSlice{} + for _, s := range strings.Split(envVal, ",") { + s = strings.TrimSpace(s) + if err := newVal.Set(s); err != nil { + return fmt.Errorf("could not parse %s as int slice value for flag %s: %s", envVal, f.Name, err) + } + } + if f.Value == nil { + f.Value = newVal + } else { + *f.Value = *newVal + } + } + + eachName(f.Name, func(name string) { + if f.Value == nil { + f.Value = &IntSlice{} + } + set.Var(f.Value, name, f.Usage) + }) + + return nil +} + +// Int64Slice is an opaque type for []int to satisfy flag.Value and flag.Getter +type Int64Slice []int64 + +// Set parses the value into an integer and appends it to the list of values +func (f *Int64Slice) Set(value string) error { + tmp, err := strconv.ParseInt(value, 10, 64) + if err != nil { + return err + } + *f = append(*f, tmp) + return nil +} + +// String returns a readable representation of this value (for usage defaults) +func (f *Int64Slice) String() string { + return fmt.Sprintf("%#v", *f) +} + +// Value returns the slice of ints set by this flag +func (f *Int64Slice) Value() []int64 { + return *f +} + +// Get returns the slice of ints set by this flag +func (f *Int64Slice) Get() interface{} { + return *f +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f Int64SliceFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f Int64SliceFlag) ApplyWithError(set *flag.FlagSet) error { + if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok { + newVal := &Int64Slice{} + for _, s := range strings.Split(envVal, ",") { + s = strings.TrimSpace(s) + if err := newVal.Set(s); err != nil { + return fmt.Errorf("could not parse %s as int64 slice value for flag %s: %s", envVal, f.Name, err) + } + } + if f.Value == nil { + f.Value = newVal + } else { + *f.Value = *newVal + } + } + + eachName(f.Name, func(name string) { + if f.Value == nil { + f.Value = &Int64Slice{} + } + set.Var(f.Value, name, f.Usage) + }) + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f BoolFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f BoolFlag) ApplyWithError(set *flag.FlagSet) error { + val := false + if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok { + if envVal == "" { + val = false + } else { + envValBool, err := strconv.ParseBool(envVal) + if err != nil { + return fmt.Errorf("could not parse %s as bool value for flag %s: %s", envVal, f.Name, err) + } + val = envValBool + } + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.BoolVar(f.Destination, name, val, f.Usage) + return + } + set.Bool(name, val, f.Usage) + }) + + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f BoolTFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f BoolTFlag) ApplyWithError(set *flag.FlagSet) error { + val := true + + if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok { + if envVal == "" { + val = false + } else { + envValBool, err := strconv.ParseBool(envVal) + if err != nil { + return fmt.Errorf("could not parse %s as bool value for flag %s: %s", envVal, f.Name, err) + } + val = envValBool + } + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.BoolVar(f.Destination, name, val, f.Usage) + return + } + set.Bool(name, val, f.Usage) + }) + + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f StringFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f StringFlag) ApplyWithError(set *flag.FlagSet) error { + if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok { + f.Value = envVal + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.StringVar(f.Destination, name, f.Value, f.Usage) + return + } + set.String(name, f.Value, f.Usage) + }) + + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f IntFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f IntFlag) ApplyWithError(set *flag.FlagSet) error { + if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok { + envValInt, err := strconv.ParseInt(envVal, 0, 64) + if err != nil { + return fmt.Errorf("could not parse %s as int value for flag %s: %s", envVal, f.Name, err) + } + f.Value = int(envValInt) + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.IntVar(f.Destination, name, f.Value, f.Usage) + return + } + set.Int(name, f.Value, f.Usage) + }) + + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f Int64Flag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f Int64Flag) ApplyWithError(set *flag.FlagSet) error { + if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok { + envValInt, err := strconv.ParseInt(envVal, 0, 64) + if err != nil { + return fmt.Errorf("could not parse %s as int value for flag %s: %s", envVal, f.Name, err) + } + + f.Value = envValInt + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.Int64Var(f.Destination, name, f.Value, f.Usage) + return + } + set.Int64(name, f.Value, f.Usage) + }) + + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f UintFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f UintFlag) ApplyWithError(set *flag.FlagSet) error { + if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok { + envValInt, err := strconv.ParseUint(envVal, 0, 64) + if err != nil { + return fmt.Errorf("could not parse %s as uint value for flag %s: %s", envVal, f.Name, err) + } + + f.Value = uint(envValInt) + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.UintVar(f.Destination, name, f.Value, f.Usage) + return + } + set.Uint(name, f.Value, f.Usage) + }) + + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f Uint64Flag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f Uint64Flag) ApplyWithError(set *flag.FlagSet) error { + if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok { + envValInt, err := strconv.ParseUint(envVal, 0, 64) + if err != nil { + return fmt.Errorf("could not parse %s as uint64 value for flag %s: %s", envVal, f.Name, err) + } + + f.Value = uint64(envValInt) + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.Uint64Var(f.Destination, name, f.Value, f.Usage) + return + } + set.Uint64(name, f.Value, f.Usage) + }) + + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f DurationFlag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f DurationFlag) ApplyWithError(set *flag.FlagSet) error { + if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok { + envValDuration, err := time.ParseDuration(envVal) + if err != nil { + return fmt.Errorf("could not parse %s as duration for flag %s: %s", envVal, f.Name, err) + } + + f.Value = envValDuration + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.DurationVar(f.Destination, name, f.Value, f.Usage) + return + } + set.Duration(name, f.Value, f.Usage) + }) + + return nil +} + +// Apply populates the flag given the flag set and environment +// Ignores errors +func (f Float64Flag) Apply(set *flag.FlagSet) { + f.ApplyWithError(set) +} + +// ApplyWithError populates the flag given the flag set and environment +func (f Float64Flag) ApplyWithError(set *flag.FlagSet) error { + if envVal, ok := flagFromFileEnv(f.FilePath, f.EnvVar); ok { + envValFloat, err := strconv.ParseFloat(envVal, 10) + if err != nil { + return fmt.Errorf("could not parse %s as float64 value for flag %s: %s", envVal, f.Name, err) + } + + f.Value = float64(envValFloat) + } + + eachName(f.Name, func(name string) { + if f.Destination != nil { + set.Float64Var(f.Destination, name, f.Value, f.Usage) + return + } + set.Float64(name, f.Value, f.Usage) + }) + + return nil +} + +func visibleFlags(fl []Flag) []Flag { + visible := []Flag{} + for _, flag := range fl { + field := flagValue(flag).FieldByName("Hidden") + if !field.IsValid() || !field.Bool() { + visible = append(visible, flag) + } + } + return visible +} + +func prefixFor(name string) (prefix string) { + if len(name) == 1 { + prefix = "-" + } else { + prefix = "--" + } + + return +} + +// Returns the placeholder, if any, and the unquoted usage string. +func unquoteUsage(usage string) (string, string) { + for i := 0; i < len(usage); i++ { + if usage[i] == '`' { + for j := i + 1; j < len(usage); j++ { + if usage[j] == '`' { + name := usage[i+1 : j] + usage = usage[:i] + name + usage[j+1:] + return name, usage + } + } + break + } + } + return "", usage +} + +func prefixedNames(fullName, placeholder string) string { + var prefixed string + parts := strings.Split(fullName, ",") + for i, name := range parts { + name = strings.Trim(name, " ") + prefixed += prefixFor(name) + name + if placeholder != "" { + prefixed += " " + placeholder + } + if i < len(parts)-1 { + prefixed += ", " + } + } + return prefixed +} + +func withEnvHint(envVar, str string) string { + envText := "" + if envVar != "" { + prefix := "$" + suffix := "" + sep := ", $" + if runtime.GOOS == "windows" { + prefix = "%" + suffix = "%" + sep = "%, %" + } + envText = " [" + prefix + strings.Join(strings.Split(envVar, ","), sep) + suffix + "]" + } + return str + envText +} + +func withFileHint(filePath, str string) string { + fileText := "" + if filePath != "" { + fileText = fmt.Sprintf(" [%s]", filePath) + } + return str + fileText +} + +func flagValue(f Flag) reflect.Value { + fv := reflect.ValueOf(f) + for fv.Kind() == reflect.Ptr { + fv = reflect.Indirect(fv) + } + return fv +} + +func stringifyFlag(f Flag) string { + fv := flagValue(f) + + switch f.(type) { + case IntSliceFlag: + return FlagFileHinter( + fv.FieldByName("FilePath").String(), + FlagEnvHinter( + fv.FieldByName("EnvVar").String(), + stringifyIntSliceFlag(f.(IntSliceFlag)), + ), + ) + case Int64SliceFlag: + return FlagFileHinter( + fv.FieldByName("FilePath").String(), + FlagEnvHinter( + fv.FieldByName("EnvVar").String(), + stringifyInt64SliceFlag(f.(Int64SliceFlag)), + ), + ) + case StringSliceFlag: + return FlagFileHinter( + fv.FieldByName("FilePath").String(), + FlagEnvHinter( + fv.FieldByName("EnvVar").String(), + stringifyStringSliceFlag(f.(StringSliceFlag)), + ), + ) + } + + placeholder, usage := unquoteUsage(fv.FieldByName("Usage").String()) + + needsPlaceholder := false + defaultValueString := "" + + if val := fv.FieldByName("Value"); val.IsValid() { + needsPlaceholder = true + defaultValueString = fmt.Sprintf(" (default: %v)", val.Interface()) + + if val.Kind() == reflect.String && val.String() != "" { + defaultValueString = fmt.Sprintf(" (default: %q)", val.String()) + } + } + + if defaultValueString == " (default: )" { + defaultValueString = "" + } + + if needsPlaceholder && placeholder == "" { + placeholder = defaultPlaceholder + } + + usageWithDefault := strings.TrimSpace(usage + defaultValueString) + + return FlagFileHinter( + fv.FieldByName("FilePath").String(), + FlagEnvHinter( + fv.FieldByName("EnvVar").String(), + FlagNamePrefixer(fv.FieldByName("Name").String(), placeholder)+"\t"+usageWithDefault, + ), + ) +} + +func stringifyIntSliceFlag(f IntSliceFlag) string { + defaultVals := []string{} + if f.Value != nil && len(f.Value.Value()) > 0 { + for _, i := range f.Value.Value() { + defaultVals = append(defaultVals, strconv.Itoa(i)) + } + } + + return stringifySliceFlag(f.Usage, f.Name, defaultVals) +} + +func stringifyInt64SliceFlag(f Int64SliceFlag) string { + defaultVals := []string{} + if f.Value != nil && len(f.Value.Value()) > 0 { + for _, i := range f.Value.Value() { + defaultVals = append(defaultVals, strconv.FormatInt(i, 10)) + } + } + + return stringifySliceFlag(f.Usage, f.Name, defaultVals) +} + +func stringifyStringSliceFlag(f StringSliceFlag) string { + defaultVals := []string{} + if f.Value != nil && len(f.Value.Value()) > 0 { + for _, s := range f.Value.Value() { + if len(s) > 0 { + defaultVals = append(defaultVals, strconv.Quote(s)) + } + } + } + + return stringifySliceFlag(f.Usage, f.Name, defaultVals) +} + +func stringifySliceFlag(usage, name string, defaultVals []string) string { + placeholder, usage := unquoteUsage(usage) + if placeholder == "" { + placeholder = defaultPlaceholder + } + + defaultVal := "" + if len(defaultVals) > 0 { + defaultVal = fmt.Sprintf(" (default: %s)", strings.Join(defaultVals, ", ")) + } + + usageWithDefault := strings.TrimSpace(usage + defaultVal) + return FlagNamePrefixer(name, placeholder) + "\t" + usageWithDefault +} + +func flagFromFileEnv(filePath, envName string) (val string, ok bool) { + for _, envVar := range strings.Split(envName, ",") { + envVar = strings.TrimSpace(envVar) + if envVal, ok := syscall.Getenv(envVar); ok { + return envVal, true + } + } + for _, fileVar := range strings.Split(filePath, ",") { + if data, err := ioutil.ReadFile(fileVar); err == nil { + return string(data), true + } + } + return "", false +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/flag_generated.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/flag_generated.go new file mode 100644 index 0000000000000000000000000000000000000000..001576c8b3917af528f00d19fc75ae3ea711c7bf --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/flag_generated.go @@ -0,0 +1,640 @@ +package cli + +import ( + "flag" + "strconv" + "time" +) + +// WARNING: This file is generated! + +// BoolFlag is a flag with type bool +type BoolFlag struct { + Name string + Usage string + EnvVar string + FilePath string + Hidden bool + Destination *bool +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f BoolFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f BoolFlag) GetName() string { + return f.Name +} + +// Bool looks up the value of a local BoolFlag, returns +// false if not found +func (c *Context) Bool(name string) bool { + return lookupBool(name, c.flagSet) +} + +// GlobalBool looks up the value of a global BoolFlag, returns +// false if not found +func (c *Context) GlobalBool(name string) bool { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupBool(name, fs) + } + return false +} + +func lookupBool(name string, set *flag.FlagSet) bool { + f := set.Lookup(name) + if f != nil { + parsed, err := strconv.ParseBool(f.Value.String()) + if err != nil { + return false + } + return parsed + } + return false +} + +// BoolTFlag is a flag with type bool that is true by default +type BoolTFlag struct { + Name string + Usage string + EnvVar string + FilePath string + Hidden bool + Destination *bool +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f BoolTFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f BoolTFlag) GetName() string { + return f.Name +} + +// BoolT looks up the value of a local BoolTFlag, returns +// false if not found +func (c *Context) BoolT(name string) bool { + return lookupBoolT(name, c.flagSet) +} + +// GlobalBoolT looks up the value of a global BoolTFlag, returns +// false if not found +func (c *Context) GlobalBoolT(name string) bool { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupBoolT(name, fs) + } + return false +} + +func lookupBoolT(name string, set *flag.FlagSet) bool { + f := set.Lookup(name) + if f != nil { + parsed, err := strconv.ParseBool(f.Value.String()) + if err != nil { + return false + } + return parsed + } + return false +} + +// DurationFlag is a flag with type time.Duration (see https://golang.org/pkg/time/#ParseDuration) +type DurationFlag struct { + Name string + Usage string + EnvVar string + FilePath string + Hidden bool + Value time.Duration + Destination *time.Duration +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f DurationFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f DurationFlag) GetName() string { + return f.Name +} + +// Duration looks up the value of a local DurationFlag, returns +// 0 if not found +func (c *Context) Duration(name string) time.Duration { + return lookupDuration(name, c.flagSet) +} + +// GlobalDuration looks up the value of a global DurationFlag, returns +// 0 if not found +func (c *Context) GlobalDuration(name string) time.Duration { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupDuration(name, fs) + } + return 0 +} + +func lookupDuration(name string, set *flag.FlagSet) time.Duration { + f := set.Lookup(name) + if f != nil { + parsed, err := time.ParseDuration(f.Value.String()) + if err != nil { + return 0 + } + return parsed + } + return 0 +} + +// Float64Flag is a flag with type float64 +type Float64Flag struct { + Name string + Usage string + EnvVar string + FilePath string + Hidden bool + Value float64 + Destination *float64 +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f Float64Flag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f Float64Flag) GetName() string { + return f.Name +} + +// Float64 looks up the value of a local Float64Flag, returns +// 0 if not found +func (c *Context) Float64(name string) float64 { + return lookupFloat64(name, c.flagSet) +} + +// GlobalFloat64 looks up the value of a global Float64Flag, returns +// 0 if not found +func (c *Context) GlobalFloat64(name string) float64 { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupFloat64(name, fs) + } + return 0 +} + +func lookupFloat64(name string, set *flag.FlagSet) float64 { + f := set.Lookup(name) + if f != nil { + parsed, err := strconv.ParseFloat(f.Value.String(), 64) + if err != nil { + return 0 + } + return parsed + } + return 0 +} + +// GenericFlag is a flag with type Generic +type GenericFlag struct { + Name string + Usage string + EnvVar string + FilePath string + Hidden bool + Value Generic +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f GenericFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f GenericFlag) GetName() string { + return f.Name +} + +// Generic looks up the value of a local GenericFlag, returns +// nil if not found +func (c *Context) Generic(name string) interface{} { + return lookupGeneric(name, c.flagSet) +} + +// GlobalGeneric looks up the value of a global GenericFlag, returns +// nil if not found +func (c *Context) GlobalGeneric(name string) interface{} { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupGeneric(name, fs) + } + return nil +} + +func lookupGeneric(name string, set *flag.FlagSet) interface{} { + f := set.Lookup(name) + if f != nil { + parsed, err := f.Value, error(nil) + if err != nil { + return nil + } + return parsed + } + return nil +} + +// Int64Flag is a flag with type int64 +type Int64Flag struct { + Name string + Usage string + EnvVar string + FilePath string + Hidden bool + Value int64 + Destination *int64 +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f Int64Flag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f Int64Flag) GetName() string { + return f.Name +} + +// Int64 looks up the value of a local Int64Flag, returns +// 0 if not found +func (c *Context) Int64(name string) int64 { + return lookupInt64(name, c.flagSet) +} + +// GlobalInt64 looks up the value of a global Int64Flag, returns +// 0 if not found +func (c *Context) GlobalInt64(name string) int64 { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupInt64(name, fs) + } + return 0 +} + +func lookupInt64(name string, set *flag.FlagSet) int64 { + f := set.Lookup(name) + if f != nil { + parsed, err := strconv.ParseInt(f.Value.String(), 0, 64) + if err != nil { + return 0 + } + return parsed + } + return 0 +} + +// IntFlag is a flag with type int +type IntFlag struct { + Name string + Usage string + EnvVar string + FilePath string + Hidden bool + Value int + Destination *int +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f IntFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f IntFlag) GetName() string { + return f.Name +} + +// Int looks up the value of a local IntFlag, returns +// 0 if not found +func (c *Context) Int(name string) int { + return lookupInt(name, c.flagSet) +} + +// GlobalInt looks up the value of a global IntFlag, returns +// 0 if not found +func (c *Context) GlobalInt(name string) int { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupInt(name, fs) + } + return 0 +} + +func lookupInt(name string, set *flag.FlagSet) int { + f := set.Lookup(name) + if f != nil { + parsed, err := strconv.ParseInt(f.Value.String(), 0, 64) + if err != nil { + return 0 + } + return int(parsed) + } + return 0 +} + +// IntSliceFlag is a flag with type *IntSlice +type IntSliceFlag struct { + Name string + Usage string + EnvVar string + FilePath string + Hidden bool + Value *IntSlice +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f IntSliceFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f IntSliceFlag) GetName() string { + return f.Name +} + +// IntSlice looks up the value of a local IntSliceFlag, returns +// nil if not found +func (c *Context) IntSlice(name string) []int { + return lookupIntSlice(name, c.flagSet) +} + +// GlobalIntSlice looks up the value of a global IntSliceFlag, returns +// nil if not found +func (c *Context) GlobalIntSlice(name string) []int { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupIntSlice(name, fs) + } + return nil +} + +func lookupIntSlice(name string, set *flag.FlagSet) []int { + f := set.Lookup(name) + if f != nil { + parsed, err := (f.Value.(*IntSlice)).Value(), error(nil) + if err != nil { + return nil + } + return parsed + } + return nil +} + +// Int64SliceFlag is a flag with type *Int64Slice +type Int64SliceFlag struct { + Name string + Usage string + EnvVar string + FilePath string + Hidden bool + Value *Int64Slice +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f Int64SliceFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f Int64SliceFlag) GetName() string { + return f.Name +} + +// Int64Slice looks up the value of a local Int64SliceFlag, returns +// nil if not found +func (c *Context) Int64Slice(name string) []int64 { + return lookupInt64Slice(name, c.flagSet) +} + +// GlobalInt64Slice looks up the value of a global Int64SliceFlag, returns +// nil if not found +func (c *Context) GlobalInt64Slice(name string) []int64 { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupInt64Slice(name, fs) + } + return nil +} + +func lookupInt64Slice(name string, set *flag.FlagSet) []int64 { + f := set.Lookup(name) + if f != nil { + parsed, err := (f.Value.(*Int64Slice)).Value(), error(nil) + if err != nil { + return nil + } + return parsed + } + return nil +} + +// StringFlag is a flag with type string +type StringFlag struct { + Name string + Usage string + EnvVar string + FilePath string + Hidden bool + Value string + Destination *string +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f StringFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f StringFlag) GetName() string { + return f.Name +} + +// String looks up the value of a local StringFlag, returns +// "" if not found +func (c *Context) String(name string) string { + return lookupString(name, c.flagSet) +} + +// GlobalString looks up the value of a global StringFlag, returns +// "" if not found +func (c *Context) GlobalString(name string) string { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupString(name, fs) + } + return "" +} + +func lookupString(name string, set *flag.FlagSet) string { + f := set.Lookup(name) + if f != nil { + parsed, err := f.Value.String(), error(nil) + if err != nil { + return "" + } + return parsed + } + return "" +} + +// StringSliceFlag is a flag with type *StringSlice +type StringSliceFlag struct { + Name string + Usage string + EnvVar string + FilePath string + Hidden bool + Value *StringSlice +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f StringSliceFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f StringSliceFlag) GetName() string { + return f.Name +} + +// StringSlice looks up the value of a local StringSliceFlag, returns +// nil if not found +func (c *Context) StringSlice(name string) []string { + return lookupStringSlice(name, c.flagSet) +} + +// GlobalStringSlice looks up the value of a global StringSliceFlag, returns +// nil if not found +func (c *Context) GlobalStringSlice(name string) []string { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupStringSlice(name, fs) + } + return nil +} + +func lookupStringSlice(name string, set *flag.FlagSet) []string { + f := set.Lookup(name) + if f != nil { + parsed, err := (f.Value.(*StringSlice)).Value(), error(nil) + if err != nil { + return nil + } + return parsed + } + return nil +} + +// Uint64Flag is a flag with type uint64 +type Uint64Flag struct { + Name string + Usage string + EnvVar string + FilePath string + Hidden bool + Value uint64 + Destination *uint64 +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f Uint64Flag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f Uint64Flag) GetName() string { + return f.Name +} + +// Uint64 looks up the value of a local Uint64Flag, returns +// 0 if not found +func (c *Context) Uint64(name string) uint64 { + return lookupUint64(name, c.flagSet) +} + +// GlobalUint64 looks up the value of a global Uint64Flag, returns +// 0 if not found +func (c *Context) GlobalUint64(name string) uint64 { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupUint64(name, fs) + } + return 0 +} + +func lookupUint64(name string, set *flag.FlagSet) uint64 { + f := set.Lookup(name) + if f != nil { + parsed, err := strconv.ParseUint(f.Value.String(), 0, 64) + if err != nil { + return 0 + } + return parsed + } + return 0 +} + +// UintFlag is a flag with type uint +type UintFlag struct { + Name string + Usage string + EnvVar string + FilePath string + Hidden bool + Value uint + Destination *uint +} + +// String returns a readable representation of this value +// (for usage defaults) +func (f UintFlag) String() string { + return FlagStringer(f) +} + +// GetName returns the name of the flag +func (f UintFlag) GetName() string { + return f.Name +} + +// Uint looks up the value of a local UintFlag, returns +// 0 if not found +func (c *Context) Uint(name string) uint { + return lookupUint(name, c.flagSet) +} + +// GlobalUint looks up the value of a global UintFlag, returns +// 0 if not found +func (c *Context) GlobalUint(name string) uint { + if fs := lookupGlobalFlagSet(name, c); fs != nil { + return lookupUint(name, fs) + } + return 0 +} + +func lookupUint(name string, set *flag.FlagSet) uint { + f := set.Lookup(name) + if f != nil { + parsed, err := strconv.ParseUint(f.Value.String(), 0, 64) + if err != nil { + return 0 + } + return uint(parsed) + } + return 0 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/funcs.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/funcs.go new file mode 100644 index 0000000000000000000000000000000000000000..0036b1130aa07369d82f11125200421bf5f300fe --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/funcs.go @@ -0,0 +1,44 @@ +package cli + +// BashCompleteFunc is an action to execute when the bash-completion flag is set +type BashCompleteFunc func(*Context) + +// BeforeFunc is an action to execute before any subcommands are run, but after +// the context is ready if a non-nil error is returned, no subcommands are run +type BeforeFunc func(*Context) error + +// AfterFunc is an action to execute after any subcommands are run, but after the +// subcommand has finished it is run even if Action() panics +type AfterFunc func(*Context) error + +// ActionFunc is the action to execute when no subcommands are specified +type ActionFunc func(*Context) error + +// CommandNotFoundFunc is executed if the proper command cannot be found +type CommandNotFoundFunc func(*Context, string) + +// OnUsageErrorFunc is executed if an usage error occurs. This is useful for displaying +// customized usage error messages. This function is able to replace the +// original error messages. If this function is not set, the "Incorrect usage" +// is displayed and the execution is interrupted. +type OnUsageErrorFunc func(context *Context, err error, isSubcommand bool) error + +// ExitErrHandlerFunc is executed if provided in order to handle ExitError values +// returned by Actions and Before/After functions. +type ExitErrHandlerFunc func(context *Context, err error) + +// FlagStringFunc is used by the help generation to display a flag, which is +// expected to be a single line. +type FlagStringFunc func(Flag) string + +// FlagNamePrefixFunc is used by the default FlagStringFunc to create prefix +// text for a flag's full name. +type FlagNamePrefixFunc func(fullName, placeholder string) string + +// FlagEnvHintFunc is used by the default FlagStringFunc to annotate flag help +// with the environment variable details. +type FlagEnvHintFunc func(envVar, str string) string + +// FlagFileHintFunc is used by the default FlagStringFunc to annotate flag help +// with the file path details. +type FlagFileHintFunc func(filePath, str string) string diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/generate-flag-types b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/generate-flag-types new file mode 100644 index 0000000000000000000000000000000000000000..1358857312351d4b1a7aaa9b69b46b36ba387a25 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/generate-flag-types @@ -0,0 +1,256 @@ +#!/usr/bin/env python +""" +The flag types that ship with the cli library have many things in common, and +so we can take advantage of the `go generate` command to create much of the +source code from a list of definitions. These definitions attempt to cover +the parts that vary between flag types, and should evolve as needed. + +An example of the minimum definition needed is: + + { + "name": "SomeType", + "type": "sometype", + "context_default": "nil" + } + +In this example, the code generated for the `cli` package will include a type +named `SomeTypeFlag` that is expected to wrap a value of type `sometype`. +Fetching values by name via `*cli.Context` will default to a value of `nil`. + +A more complete, albeit somewhat redundant, example showing all available +definition keys is: + + { + "name": "VeryMuchType", + "type": "*VeryMuchType", + "value": true, + "dest": false, + "doctail": " which really only wraps a []float64, oh well!", + "context_type": "[]float64", + "context_default": "nil", + "parser": "parseVeryMuchType(f.Value.String())", + "parser_cast": "[]float64(parsed)" + } + +The meaning of each field is as follows: + + name (string) - The type "name", which will be suffixed with + `Flag` when generating the type definition + for `cli` and the wrapper type for `altsrc` + type (string) - The type that the generated `Flag` type for `cli` + is expected to "contain" as its `.Value` member + value (bool) - Should the generated `cli` type have a `Value` + member? + dest (bool) - Should the generated `cli` type support a + destination pointer? + doctail (string) - Additional docs for the `cli` flag type comment + context_type (string) - The literal type used in the `*cli.Context` + reader func signature + context_default (string) - The literal value used as the default by the + `*cli.Context` reader funcs when no value is + present + parser (string) - Literal code used to parse the flag `f`, + expected to have a return signature of + (value, error) + parser_cast (string) - Literal code used to cast the `parsed` value + returned from the `parser` code +""" + +from __future__ import print_function, unicode_literals + +import argparse +import json +import os +import subprocess +import sys +import tempfile +import textwrap + + +class _FancyFormatter(argparse.ArgumentDefaultsHelpFormatter, + argparse.RawDescriptionHelpFormatter): + pass + + +def main(sysargs=sys.argv[:]): + parser = argparse.ArgumentParser( + description='Generate flag type code!', + formatter_class=_FancyFormatter) + parser.add_argument( + 'package', + type=str, default='cli', choices=_WRITEFUNCS.keys(), + help='Package for which flag types will be generated' + ) + parser.add_argument( + '-i', '--in-json', + type=argparse.FileType('r'), + default=sys.stdin, + help='Input JSON file which defines each type to be generated' + ) + parser.add_argument( + '-o', '--out-go', + type=argparse.FileType('w'), + default=sys.stdout, + help='Output file/stream to which generated source will be written' + ) + parser.epilog = __doc__ + + args = parser.parse_args(sysargs[1:]) + _generate_flag_types(_WRITEFUNCS[args.package], args.out_go, args.in_json) + return 0 + + +def _generate_flag_types(writefunc, output_go, input_json): + types = json.load(input_json) + + tmp = tempfile.NamedTemporaryFile(suffix='.go', delete=False) + writefunc(tmp, types) + tmp.close() + + new_content = subprocess.check_output( + ['goimports', tmp.name] + ).decode('utf-8') + + print(new_content, file=output_go, end='') + output_go.flush() + os.remove(tmp.name) + + +def _set_typedef_defaults(typedef): + typedef.setdefault('doctail', '') + typedef.setdefault('context_type', typedef['type']) + typedef.setdefault('dest', True) + typedef.setdefault('value', True) + typedef.setdefault('parser', 'f.Value, error(nil)') + typedef.setdefault('parser_cast', 'parsed') + + +def _write_cli_flag_types(outfile, types): + _fwrite(outfile, """\ + package cli + + // WARNING: This file is generated! + + """) + + for typedef in types: + _set_typedef_defaults(typedef) + + _fwrite(outfile, """\ + // {name}Flag is a flag with type {type}{doctail} + type {name}Flag struct {{ + Name string + Usage string + EnvVar string + FilePath string + Hidden bool + """.format(**typedef)) + + if typedef['value']: + _fwrite(outfile, """\ + Value {type} + """.format(**typedef)) + + if typedef['dest']: + _fwrite(outfile, """\ + Destination *{type} + """.format(**typedef)) + + _fwrite(outfile, "\n}\n\n") + + _fwrite(outfile, """\ + // String returns a readable representation of this value + // (for usage defaults) + func (f {name}Flag) String() string {{ + return FlagStringer(f) + }} + + // GetName returns the name of the flag + func (f {name}Flag) GetName() string {{ + return f.Name + }} + + // {name} looks up the value of a local {name}Flag, returns + // {context_default} if not found + func (c *Context) {name}(name string) {context_type} {{ + return lookup{name}(name, c.flagSet) + }} + + // Global{name} looks up the value of a global {name}Flag, returns + // {context_default} if not found + func (c *Context) Global{name}(name string) {context_type} {{ + if fs := lookupGlobalFlagSet(name, c); fs != nil {{ + return lookup{name}(name, fs) + }} + return {context_default} + }} + + func lookup{name}(name string, set *flag.FlagSet) {context_type} {{ + f := set.Lookup(name) + if f != nil {{ + parsed, err := {parser} + if err != nil {{ + return {context_default} + }} + return {parser_cast} + }} + return {context_default} + }} + """.format(**typedef)) + + +def _write_altsrc_flag_types(outfile, types): + _fwrite(outfile, """\ + package altsrc + + import ( + "gopkg.in/urfave/cli.v1" + ) + + // WARNING: This file is generated! + + """) + + for typedef in types: + _set_typedef_defaults(typedef) + + _fwrite(outfile, """\ + // {name}Flag is the flag type that wraps cli.{name}Flag to allow + // for other values to be specified + type {name}Flag struct {{ + cli.{name}Flag + set *flag.FlagSet + }} + + // New{name}Flag creates a new {name}Flag + func New{name}Flag(fl cli.{name}Flag) *{name}Flag {{ + return &{name}Flag{{{name}Flag: fl, set: nil}} + }} + + // Apply saves the flagSet for later usage calls, then calls the + // wrapped {name}Flag.Apply + func (f *{name}Flag) Apply(set *flag.FlagSet) {{ + f.set = set + f.{name}Flag.Apply(set) + }} + + // ApplyWithError saves the flagSet for later usage calls, then calls the + // wrapped {name}Flag.ApplyWithError + func (f *{name}Flag) ApplyWithError(set *flag.FlagSet) error {{ + f.set = set + return f.{name}Flag.ApplyWithError(set) + }} + """.format(**typedef)) + + +def _fwrite(outfile, text): + print(textwrap.dedent(text), end='', file=outfile) + + +_WRITEFUNCS = { + 'cli': _write_cli_flag_types, + 'altsrc': _write_altsrc_flag_types +} + +if __name__ == '__main__': + sys.exit(main()) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/help.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/help.go new file mode 100644 index 0000000000000000000000000000000000000000..65874fa2fcafa2bda81b8ed08fbf672565b73511 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/help.go @@ -0,0 +1,345 @@ +package cli + +import ( + "fmt" + "io" + "os" + "strings" + "text/tabwriter" + "text/template" +) + +// AppHelpTemplate is the text template for the Default help topic. +// cli.go uses text/template to render templates. You can +// render custom help text by setting this variable. +var AppHelpTemplate = `NAME: + {{.Name}}{{if .Usage}} - {{.Usage}}{{end}} + +USAGE: + {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Version}}{{if not .HideVersion}} + +VERSION: + {{.Version}}{{end}}{{end}}{{if .Description}} + +DESCRIPTION: + {{.Description}}{{end}}{{if len .Authors}} + +AUTHOR{{with $length := len .Authors}}{{if ne 1 $length}}S{{end}}{{end}}: + {{range $index, $author := .Authors}}{{if $index}} + {{end}}{{$author}}{{end}}{{end}}{{if .VisibleCommands}} + +COMMANDS:{{range .VisibleCategories}}{{if .Name}} + + {{.Name}}:{{end}}{{range .VisibleCommands}} + {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{end}}{{end}}{{if .VisibleFlags}} + +GLOBAL OPTIONS: + {{range $index, $option := .VisibleFlags}}{{if $index}} + {{end}}{{$option}}{{end}}{{end}}{{if .Copyright}} + +COPYRIGHT: + {{.Copyright}}{{end}} +` + +// CommandHelpTemplate is the text template for the command help topic. +// cli.go uses text/template to render templates. You can +// render custom help text by setting this variable. +var CommandHelpTemplate = `NAME: + {{.HelpName}} - {{.Usage}} + +USAGE: + {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}}{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Category}} + +CATEGORY: + {{.Category}}{{end}}{{if .Description}} + +DESCRIPTION: + {{.Description}}{{end}}{{if .VisibleFlags}} + +OPTIONS: + {{range .VisibleFlags}}{{.}} + {{end}}{{end}} +` + +// SubcommandHelpTemplate is the text template for the subcommand help topic. +// cli.go uses text/template to render templates. You can +// render custom help text by setting this variable. +var SubcommandHelpTemplate = `NAME: + {{.HelpName}} - {{if .Description}}{{.Description}}{{else}}{{.Usage}}{{end}} + +USAGE: + {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} command{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}} + +COMMANDS:{{range .VisibleCategories}}{{if .Name}} + {{.Name}}:{{end}}{{range .VisibleCommands}} + {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}} +{{end}}{{if .VisibleFlags}} +OPTIONS: + {{range .VisibleFlags}}{{.}} + {{end}}{{end}} +` + +var helpCommand = Command{ + Name: "help", + Aliases: []string{"h"}, + Usage: "Shows a list of commands or help for one command", + ArgsUsage: "[command]", + Action: func(c *Context) error { + args := c.Args() + if args.Present() { + return ShowCommandHelp(c, args.First()) + } + + ShowAppHelp(c) + return nil + }, +} + +var helpSubcommand = Command{ + Name: "help", + Aliases: []string{"h"}, + Usage: "Shows a list of commands or help for one command", + ArgsUsage: "[command]", + Action: func(c *Context) error { + args := c.Args() + if args.Present() { + return ShowCommandHelp(c, args.First()) + } + + return ShowSubcommandHelp(c) + }, +} + +// Prints help for the App or Command +type helpPrinter func(w io.Writer, templ string, data interface{}) + +// Prints help for the App or Command with custom template function. +type helpPrinterCustom func(w io.Writer, templ string, data interface{}, customFunc map[string]interface{}) + +// HelpPrinter is a function that writes the help output. If not set a default +// is used. The function signature is: +// func(w io.Writer, templ string, data interface{}) +var HelpPrinter helpPrinter = printHelp + +// HelpPrinterCustom is same as HelpPrinter but +// takes a custom function for template function map. +var HelpPrinterCustom helpPrinterCustom = printHelpCustom + +// VersionPrinter prints the version for the App +var VersionPrinter = printVersion + +// ShowAppHelpAndExit - Prints the list of subcommands for the app and exits with exit code. +func ShowAppHelpAndExit(c *Context, exitCode int) { + ShowAppHelp(c) + os.Exit(exitCode) +} + +// ShowAppHelp is an action that displays the help. +func ShowAppHelp(c *Context) (err error) { + if c.App.CustomAppHelpTemplate == "" { + HelpPrinter(c.App.Writer, AppHelpTemplate, c.App) + return + } + customAppData := func() map[string]interface{} { + if c.App.ExtraInfo == nil { + return nil + } + return map[string]interface{}{ + "ExtraInfo": c.App.ExtraInfo, + } + } + HelpPrinterCustom(c.App.Writer, c.App.CustomAppHelpTemplate, c.App, customAppData()) + return nil +} + +// DefaultAppComplete prints the list of subcommands as the default app completion method +func DefaultAppComplete(c *Context) { + for _, command := range c.App.Commands { + if command.Hidden { + continue + } + if os.Getenv("_CLI_ZSH_AUTOCOMPLETE_HACK") == "1" { + for _, name := range command.Names() { + fmt.Fprintf(c.App.Writer, "%s:%s\n", name, command.Usage) + } + } else { + for _, name := range command.Names() { + fmt.Fprintf(c.App.Writer, "%s\n", name) + } + } + } +} + +// ShowCommandHelpAndExit - exits with code after showing help +func ShowCommandHelpAndExit(c *Context, command string, code int) { + ShowCommandHelp(c, command) + os.Exit(code) +} + +// ShowCommandHelp prints help for the given command +func ShowCommandHelp(ctx *Context, command string) error { + // show the subcommand help for a command with subcommands + if command == "" { + HelpPrinter(ctx.App.Writer, SubcommandHelpTemplate, ctx.App) + return nil + } + + for _, c := range ctx.App.Commands { + if c.HasName(command) { + if c.CustomHelpTemplate != "" { + HelpPrinterCustom(ctx.App.Writer, c.CustomHelpTemplate, c, nil) + } else { + HelpPrinter(ctx.App.Writer, CommandHelpTemplate, c) + } + return nil + } + } + + if ctx.App.CommandNotFound == nil { + return NewExitError(fmt.Sprintf("No help topic for '%v'", command), 3) + } + + ctx.App.CommandNotFound(ctx, command) + return nil +} + +// ShowSubcommandHelp prints help for the given subcommand +func ShowSubcommandHelp(c *Context) error { + return ShowCommandHelp(c, c.Command.Name) +} + +// ShowVersion prints the version number of the App +func ShowVersion(c *Context) { + VersionPrinter(c) +} + +func printVersion(c *Context) { + fmt.Fprintf(c.App.Writer, "%v version %v\n", c.App.Name, c.App.Version) +} + +// ShowCompletions prints the lists of commands within a given context +func ShowCompletions(c *Context) { + a := c.App + if a != nil && a.BashComplete != nil { + a.BashComplete(c) + } +} + +// ShowCommandCompletions prints the custom completions for a given command +func ShowCommandCompletions(ctx *Context, command string) { + c := ctx.App.Command(command) + if c != nil && c.BashComplete != nil { + c.BashComplete(ctx) + } +} + +func printHelpCustom(out io.Writer, templ string, data interface{}, customFunc map[string]interface{}) { + funcMap := template.FuncMap{ + "join": strings.Join, + } + if customFunc != nil { + for key, value := range customFunc { + funcMap[key] = value + } + } + + w := tabwriter.NewWriter(out, 1, 8, 2, ' ', 0) + t := template.Must(template.New("help").Funcs(funcMap).Parse(templ)) + err := t.Execute(w, data) + if err != nil { + // If the writer is closed, t.Execute will fail, and there's nothing + // we can do to recover. + if os.Getenv("CLI_TEMPLATE_ERROR_DEBUG") != "" { + fmt.Fprintf(ErrWriter, "CLI TEMPLATE ERROR: %#v\n", err) + } + return + } + w.Flush() +} + +func printHelp(out io.Writer, templ string, data interface{}) { + printHelpCustom(out, templ, data, nil) +} + +func checkVersion(c *Context) bool { + found := false + if VersionFlag.GetName() != "" { + eachName(VersionFlag.GetName(), func(name string) { + if c.GlobalBool(name) || c.Bool(name) { + found = true + } + }) + } + return found +} + +func checkHelp(c *Context) bool { + found := false + if HelpFlag.GetName() != "" { + eachName(HelpFlag.GetName(), func(name string) { + if c.GlobalBool(name) || c.Bool(name) { + found = true + } + }) + } + return found +} + +func checkCommandHelp(c *Context, name string) bool { + if c.Bool("h") || c.Bool("help") { + ShowCommandHelp(c, name) + return true + } + + return false +} + +func checkSubcommandHelp(c *Context) bool { + if c.Bool("h") || c.Bool("help") { + ShowSubcommandHelp(c) + return true + } + + return false +} + +func checkShellCompleteFlag(a *App, arguments []string) (bool, []string) { + if !a.EnableBashCompletion { + return false, arguments + } + + pos := len(arguments) - 1 + lastArg := arguments[pos] + + if lastArg != "--"+BashCompletionFlag.GetName() { + return false, arguments + } + + return true, arguments[:pos] +} + +func checkCompletions(c *Context) bool { + if !c.shellComplete { + return false + } + + if args := c.Args(); args.Present() { + name := args.First() + if cmd := c.App.Command(name); cmd != nil { + // let the command handle the completion + return false + } + } + + ShowCompletions(c) + return true +} + +func checkCommandCompletions(c *Context, name string) bool { + if !c.shellComplete { + return false + } + + ShowCommandCompletions(c, name) + return true +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/runtests b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/runtests new file mode 100644 index 0000000000000000000000000000000000000000..ee22bdeed5581b8a001f50a4cab9f0663a53518e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/runtests @@ -0,0 +1,122 @@ +#!/usr/bin/env python +from __future__ import print_function + +import argparse +import os +import sys +import tempfile + +from subprocess import check_call, check_output + + +PACKAGE_NAME = os.environ.get( + 'CLI_PACKAGE_NAME', 'github.com/urfave/cli' +) + + +def main(sysargs=sys.argv[:]): + targets = { + 'vet': _vet, + 'test': _test, + 'gfmrun': _gfmrun, + 'toc': _toc, + 'gen': _gen, + } + + parser = argparse.ArgumentParser() + parser.add_argument( + 'target', nargs='?', choices=tuple(targets.keys()), default='test' + ) + args = parser.parse_args(sysargs[1:]) + + targets[args.target]() + return 0 + + +def _test(): + if check_output('go version'.split()).split()[2] < 'go1.2': + _run('go test -v .') + return + + coverprofiles = [] + for subpackage in ['', 'altsrc']: + coverprofile = 'cli.coverprofile' + if subpackage != '': + coverprofile = '{}.coverprofile'.format(subpackage) + + coverprofiles.append(coverprofile) + + _run('go test -v'.split() + [ + '-coverprofile={}'.format(coverprofile), + ('{}/{}'.format(PACKAGE_NAME, subpackage)).rstrip('/') + ]) + + combined_name = _combine_coverprofiles(coverprofiles) + _run('go tool cover -func={}'.format(combined_name)) + os.remove(combined_name) + + +def _gfmrun(): + go_version = check_output('go version'.split()).split()[2] + if go_version < 'go1.3': + print('runtests: skip on {}'.format(go_version), file=sys.stderr) + return + _run(['gfmrun', '-c', str(_gfmrun_count()), '-s', 'README.md']) + + +def _vet(): + _run('go vet ./...') + + +def _toc(): + _run('node_modules/.bin/markdown-toc -i README.md') + _run('git diff --exit-code') + + +def _gen(): + go_version = check_output('go version'.split()).split()[2] + if go_version < 'go1.5': + print('runtests: skip on {}'.format(go_version), file=sys.stderr) + return + + _run('go generate ./...') + _run('git diff --exit-code') + + +def _run(command): + if hasattr(command, 'split'): + command = command.split() + print('runtests: {}'.format(' '.join(command)), file=sys.stderr) + check_call(command) + + +def _gfmrun_count(): + with open('README.md') as infile: + lines = infile.read().splitlines() + return len(filter(_is_go_runnable, lines)) + + +def _is_go_runnable(line): + return line.startswith('package main') + + +def _combine_coverprofiles(coverprofiles): + combined = tempfile.NamedTemporaryFile( + suffix='.coverprofile', delete=False + ) + combined.write('mode: set\n') + + for coverprofile in coverprofiles: + with open(coverprofile, 'r') as infile: + for line in infile.readlines(): + if not line.startswith('mode: '): + combined.write(line) + + combined.flush() + name = combined.name + combined.close() + return name + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/sort.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/sort.go new file mode 100644 index 0000000000000000000000000000000000000000..23d1c2f77207192fa9cc21add5c44aaffdb5d452 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/urfave/cli/sort.go @@ -0,0 +1,29 @@ +package cli + +import "unicode" + +// lexicographicLess compares strings alphabetically considering case. +func lexicographicLess(i, j string) bool { + iRunes := []rune(i) + jRunes := []rune(j) + + lenShared := len(iRunes) + if lenShared > len(jRunes) { + lenShared = len(jRunes) + } + + for index := 0; index < lenShared; index++ { + ir := iRunes[index] + jr := jRunes[index] + + if lir, ljr := unicode.ToLower(ir), unicode.ToLower(jr); lir != ljr { + return lir < ljr + } + + if ir != jr { + return ir < jr + } + } + + return i < j +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/binding/LICENSE b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/binding/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..2f5f2e6ed7ac4c53b0714893d92e7bd57a168bbd --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/binding/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Matt + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/binding/README.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/binding/README.md new file mode 100644 index 0000000000000000000000000000000000000000..2fbac00ff6dbf606cb6f178d9c581c459f785316 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/binding/README.md @@ -0,0 +1,238 @@ +[<img src="http://mholt.github.io/binding/resources/images/binding-sm.png" height="250" alt="binding is reflectionless data binding for Go"></a>](http://mholt.github.io/binding) + + +binding +======= + +Reflectionless data binding for Go's net/http + + + +Features +--------- + +- HTTP request data binding +- Data validation (custom and built-in) +- Error handling + + + +Benefits +--------- + +- Moves data binding, validation, and error handling out of your application's handler +- Reads Content-Type to deserialize form, multipart form, and JSON data from requests +- No middleware: just a function call +- Usable in any setting where `net/http` is present (Negroni, gocraft/web, std lib, etc.) +- No reflection + + + +Usage example +-------------- + +```go +package main + +import ( + "fmt" + "net/http" + + "github.com/mholt/binding" +) + +// First define a type to hold the data +// (If the data comes from JSON, see: http://mholt.github.io/json-to-go) +type ContactForm struct { + User struct { + ID int + } + Email string + Message string +} + +// Then provide a field mapping (pointer receiver is vital) +func (cf *ContactForm) FieldMap(req *http.Request) binding.FieldMap { + return binding.FieldMap{ + &cf.User.ID: "user_id", + &cf.Email: "email", + &cf.Message: binding.Field{ + Form: "message", + Required: true, + }, + } +} + +// Now your handlers can stay clean and simple +func handler(resp http.ResponseWriter, req *http.Request) { + contactForm := new(ContactForm) + errs := binding.Bind(req, contactForm) + if errs.Handle(resp) { + return + } + fmt.Fprintf(resp, "From: %d\n", contactForm.User.ID) + fmt.Fprintf(resp, "Message: %s\n", contactForm.Message) +} + +func main() { + http.HandleFunc("/contact", handler) + http.ListenAndServe(":3000", nil) +} +``` + +Multipart/form-data usage example +--------------------------------- + +```go +package main + +import ( + "bytes" + "fmt" + "github.com/mholt/binding" + "io" + "log" + "mime/multipart" + "net/http" +) + +// We expect a multipart/form-data upload with +// a file field named 'data' +type MultipartForm struct { + Data *multipart.FileHeader `json:"data"` +} + +func (f *MultipartForm) FieldMap(req *http.Request) binding.FieldMap { + return binding.FieldMap{ + &f.Data: "data", + } +} + +// Handlers are still clean and simple +func handler(resp http.ResponseWriter, req *http.Request) { + multipartForm := new(MultipartForm) + errs := binding.Bind(req, multipartForm) + if errs.Handle(resp) { + return + } + + // To access the file data you need to Open the file + // handler and read the bytes out. + var fh io.ReadCloser + var err error + if fh, err = multipartForm.Data.Open(); err != nil { + http.Error(resp, + fmt.Sprint("Error opening Mime::Data %+v", err), + http.StatusInternalServerError) + return + } + defer fh.Close() + dataBytes := bytes.Buffer{} + var size int64 + if size, err = dataBytes.ReadFrom(fh); err != nil { + http.Error(resp, + fmt.Sprint("Error reading Mime::Data %+v", err), + http.StatusInternalServerError) + return + } + // Now you have the attachment in databytes. + // Maximum size is default is 10MB. + log.Printf("Read %v bytes with filename %s", + size, multipartForm.Data.Filename) +} + +func main() { + http.HandleFunc("/upload", handler) + http.ListenAndServe(":3000", nil) +} + +``` + +You can test from CLI using the excellent httpie client + + `http -f POST localhost:3000/upload data@myupload` + +Custom data validation +----------------------- + +You may optionally have your type implement the `binding.Validator` interface to perform your own data validation. The `.Validate()` method is called after the struct is populated. + +```go +func (cf ContactForm) Validate(req *http.Request, errs binding.Errors) binding.Errors { + if cf.Message == "Go needs generics" { + errs = append(errs, binding.Error{ + FieldNames: []string{"message"}, + Classification: "ComplaintError", + Message: "Go has generics. They're called interfaces.", + }) + } + return errs +} +``` + + + +Error Handling +--------------- + +`binding.Bind()` and each deserializer returns errors. You don't have to use them, but the `binding.Errors` type comes with a kind of built-in "handler" to write the errors to the response as JSON for you. For example, you might do this in your HTTP handler: + +```go +if binding.Bind(req, contactForm).Handle(resp) { + return +} +``` + +As you can see, if `.Handle(resp)` wrote errors to the response, your handler may gracefully exit. + + + +Binding custom types +--------------------- + +For types you've defined, you can bind form data to it by implementing the `Binder` interface. Here's a contrived example: + + +```go +type MyType map[string]string + +func (t *MyType) Bind(fieldName string, strVals []string, errs binding.Errors) binding.Errors { + t["formData"] = strVals[0] + return errs +} +``` + +If you can't add a method to the type, you can still specify a `Binder` func in the field spec. Here's a contrived example that binds an integer (not necessary, but you get the idea): + +```go +func (t *MyType) FieldMap() binding.FieldMap { + return binding.FieldMap{ + "number": binding.Field{ + Binder: func(fieldName string, formVals []string, errs binding.Errors) binding.Errors { + val, err := strconv.Atoi(formVals[0]) + if err != nil { + errs.Add([]string{fieldName}, binding.DeserializationError, err.Error()) + } + t.SomeNumber = val + return errs + }, + }, + } +} +``` + +Notice that the `binding.Errors` type has a convenience method `.Add()` which you can use to append to the slice if you prefer. + + +Supported types (forms) +------------------------ + +The following types are supported in form deserialization by default. (JSON requests are delegated to `encoding/json`.) + +- uint, *uint, []uint, uint8, *uint8, []uint8, uint16, *uint16, []uint16, uint32, *uint32, []uint32, uint64, *uint64, []uint64 +- int, *int, []int, int8, *int8, []int8, int16, *int16, []int16, int32, *int32, []int32, int64, *int64, []int64 +- float32, *float32, []float32, float64, *float64, []float64 +- bool, *bool, []bool +- string, *string, []string +- time.Time, *time.Time, []time.Time +- *multipart.FileHeader, []*multipart.FileHeader diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/binding/binding.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/binding/binding.go new file mode 100644 index 0000000000000000000000000000000000000000..5a4340eef25add98b6310f14627c997e0ab39f53 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/binding/binding.go @@ -0,0 +1,756 @@ +// Package binding deserializes data from HTTP requests into a struct +// ready for your application to use (without reflection). It also +// facilitates data validation and error handling. +package binding + +import ( + "encoding/json" + "errors" + "io" + "mime/multipart" + "net/http" + "strconv" + "strings" + "time" +) + +type requestBinder func(req *http.Request, userStruct FieldMapper) Errors + +// Bind takes data out of the request and deserializes into a struct according +// to the Content-Type of the request. If no Content-Type is specified, there +// better be data in the query string, otherwise an error will be produced. +func Bind(req *http.Request, userStruct FieldMapper) Errors { + var errs Errors + + contentType := req.Header.Get("Content-Type") + + if strings.Contains(contentType, "form-urlencoded") { + return Form(req, userStruct) + } + + if strings.Contains(contentType, "multipart/form-data") { + return MultipartForm(req, userStruct) + } + + if strings.Contains(contentType, "json") { + return Json(req, userStruct) + } + + if contentType == "" { + if len(req.URL.Query()) > 0 { + return Form(req, userStruct) + } + } else { + errs.Add([]string{}, ContentTypeError, "Unsupported Content-Type") + } + + return errs +} + +// Form deserializes form data out of the request into a struct you provide. +// This function invokes data validation after deserialization. +func Form(req *http.Request, userStruct FieldMapper) Errors { + return formBinder(req, userStruct) +} + +var formBinder requestBinder = defaultFormBinder + +func defaultFormBinder(req *http.Request, userStruct FieldMapper) Errors { + var errs Errors + + parseErr := req.ParseForm() + if parseErr != nil { + errs.Add([]string{}, DeserializationError, parseErr.Error()) + return errs + } + + return bindForm(req, userStruct, req.Form, nil, errs) +} + +// MultipartForm reads a multipart form request and deserializes its data and +// files into a struct you provide. Files should be deserialized into +// *multipart.FileHeader fields. +func MultipartForm(req *http.Request, userStruct FieldMapper) Errors { + return multipartFormBinder(req, userStruct) +} + +var multipartFormBinder requestBinder = defaultMultipartFormBinder + +func defaultMultipartFormBinder(req *http.Request, userStruct FieldMapper) Errors { + var errs Errors + + multipartReader, err := req.MultipartReader() + if err != nil { + errs.Add([]string{}, DeserializationError, err.Error()) + return errs + } + + form, parseErr := multipartReader.ReadForm(MaxMemory) + if parseErr != nil { + errs.Add([]string{}, DeserializationError, parseErr.Error()) + return errs + } + + req.MultipartForm = form + + return bindForm(req, userStruct, req.MultipartForm.Value, req.MultipartForm.File, errs) +} + +// Json deserializes a JSON request body into a struct you specify +// using the standard encoding/json package (which uses reflection). +// This function invokes data validation after deserialization. +func Json(req *http.Request, userStruct FieldMapper) Errors { + return jsonBinder(req, userStruct) +} + +var jsonBinder requestBinder = defaultJsonBinder + +func defaultJsonBinder(req *http.Request, userStruct FieldMapper) Errors { + var errs Errors + + if req.Body != nil { + defer req.Body.Close() + err := json.NewDecoder(req.Body).Decode(userStruct) + if err != nil && err != io.EOF { + errs.Add([]string{}, DeserializationError, err.Error()) + return errs + } + } else { + errs.Add([]string{}, DeserializationError, "Empty request body") + return errs + } + + errs = append(errs, Validate(req, userStruct)...) + + return errs +} + +// Validate ensures that all conditions have been met on every field in the +// populated struct. Validation should occur after the request has been +// deserialized into the struct. +func Validate(req *http.Request, userStruct FieldMapper) Errors { + var errs Errors + + fm := userStruct.FieldMap(req) + + for fieldPointer, fieldNameOrSpec := range fm { + fieldName, fieldHasSpec, fieldSpec := fieldNameAndSpec(fieldNameOrSpec) + + if !fieldHasSpec { + continue + } + + addRequiredError := func() { + errorMsg := "Required" + if len(fieldSpec.ErrorMessage) > 0 { + errorMsg = fieldSpec.ErrorMessage + } + + errs.Add([]string{fieldName}, RequiredError, errorMsg) + } + if fieldSpec.Required { + switch t := fieldPointer.(type) { + case *uint8: + if *t == 0 { + addRequiredError() + } + case **uint8: + if *t == nil { + addRequiredError() + } + case *[]uint8: + if len(*t) == 0 { + addRequiredError() + } + case *uint16: + if *t == 0 { + addRequiredError() + } + case **uint16: + if *t == nil { + addRequiredError() + } + case *[]uint16: + if len(*t) == 0 { + addRequiredError() + } + case *uint32: + if *t == 0 { + addRequiredError() + } + case **uint32: + if *t == nil { + addRequiredError() + } + case *[]uint32: + if len(*t) == 0 { + addRequiredError() + } + case *uint64: + if *t == 0 { + addRequiredError() + } + case **uint64: + if *t == nil { + addRequiredError() + } + case *[]uint64: + if len(*t) == 0 { + addRequiredError() + } + case *int8: + if *t == 0 { + addRequiredError() + } + case **int8: + if *t == nil { + addRequiredError() + } + case *[]int8: + if len(*t) == 0 { + addRequiredError() + } + case *int16: + if *t == 0 { + addRequiredError() + } + case **int16: + if *t == nil { + addRequiredError() + } + case *[]int16: + if len(*t) == 0 { + addRequiredError() + } + case *int32: + if *t == 0 { + addRequiredError() + } + case **int32: + if *t == nil { + addRequiredError() + } + case *[]int32: + if len(*t) == 0 { + addRequiredError() + } + case *int64: + if *t == 0 { + addRequiredError() + } + case **int64: + if *t == nil { + addRequiredError() + } + case *[]int64: + if len(*t) == 0 { + addRequiredError() + } + case *float32: + if *t == 0 { + addRequiredError() + } + case **float32: + if *t == nil { + addRequiredError() + } + case *[]float32: + if len(*t) == 0 { + addRequiredError() + } + case *float64: + if *t == 0 { + addRequiredError() + } + case **float64: + if *t == nil { + addRequiredError() + } + case *[]float64: + if len(*t) == 0 { + addRequiredError() + } + case *uint: + if *t == 0 { + addRequiredError() + } + case **uint: + if *t == nil { + addRequiredError() + } + case *[]uint: + if len(*t) == 0 { + addRequiredError() + } + case *int: + if *t == 0 { + addRequiredError() + } + case **int: + if *t == nil { + addRequiredError() + } + case *[]int: + if len(*t) == 0 { + addRequiredError() + } + case *bool: + if *t == false { + addRequiredError() + } + case **bool: + if *t == nil { + addRequiredError() + } + case *[]bool: + if len(*t) == 0 { + addRequiredError() + } + case *string: + if *t == "" { + addRequiredError() + } + case **string: + if *t == nil { + addRequiredError() + } + case *[]string: + if len(*t) == 0 { + addRequiredError() + } + case *time.Time: + if t.IsZero() { + addRequiredError() + } + case **time.Time: + if *t == nil { + addRequiredError() + } + case *[]time.Time: + if len(*t) == 0 { + addRequiredError() + } + } + } + } + + if validator, ok := userStruct.(Validator); ok { + errs = validator.Validate(req, errs) + } + + return errs +} + +func bindForm(req *http.Request, userStruct FieldMapper, formData map[string][]string, + formFile map[string][]*multipart.FileHeader, errs Errors) Errors { + + fm := userStruct.FieldMap(req) + + for fieldPointer, fieldNameOrSpec := range fm { + + fieldName, _, fieldSpec := fieldNameAndSpec(fieldNameOrSpec) + _, isFile := fieldPointer.(**multipart.FileHeader) + _, isFileSlice := fieldPointer.(*[]**multipart.FileHeader) + strs := formData[fieldName] + + if !isFile && !isFileSlice { + if len(strs) == 0 { + continue + } + if binder, ok := fieldPointer.(Binder); ok { + errs = binder.Bind(fieldName, strs, errs) + continue + } + } + + errorHandler := func(err error) { + if err != nil { + errs.Add([]string{fieldName}, TypeError, err.Error()) + } + } + + if fieldSpec.Binder != nil { + errs = fieldSpec.Binder(fieldName, strs, errs) + continue + } + + switch t := fieldPointer.(type) { + case *uint8: + val, err := strconv.ParseUint(strs[0], 10, 8) + errorHandler(err) + *t = uint8(val) + case **uint8: + parsed, err := strconv.ParseUint(strs[0], 10, 8) + if err != nil { + errorHandler(err) + continue + } + val := uint8(parsed) + *t = &val + case *[]uint8: + for _, str := range strs { + val, err := strconv.ParseUint(str, 10, 8) + errorHandler(err) + *t = append(*t, uint8(val)) + } + case *uint16: + val, err := strconv.ParseUint(strs[0], 10, 16) + errorHandler(err) + *t = uint16(val) + case **uint16: + parsed, err := strconv.ParseUint(strs[0], 10, 16) + if err != nil { + errorHandler(err) + continue + } + val := uint16(parsed) + *t = &val + case *[]uint16: + for _, str := range strs { + val, err := strconv.ParseUint(str, 10, 16) + errorHandler(err) + *t = append(*t, uint16(val)) + } + case *uint32: + val, err := strconv.ParseUint(strs[0], 10, 32) + errorHandler(err) + *t = uint32(val) + case **uint32: + parsed, err := strconv.ParseUint(strs[0], 10, 32) + if err != nil { + errorHandler(err) + continue + } + val := uint32(parsed) + *t = &val + case *[]uint32: + for _, str := range strs { + val, err := strconv.ParseUint(str, 10, 32) + errorHandler(err) + *t = append(*t, uint32(val)) + } + case *uint64: + val, err := strconv.ParseUint(strs[0], 10, 64) + errorHandler(err) + *t = val + case **uint64: + parsed, err := strconv.ParseUint(strs[0], 10, 64) + if err != nil { + errorHandler(err) + continue + } + val := uint64(parsed) + *t = &val + case *[]uint64: + for _, str := range strs { + val, err := strconv.ParseUint(str, 10, 64) + errorHandler(err) + *t = append(*t, uint64(val)) + } + case *int8: + val, err := strconv.ParseInt(strs[0], 10, 8) + errorHandler(err) + *t = int8(val) + case **int8: + parsed, err := strconv.ParseInt(strs[0], 10, 8) + if err != nil { + errorHandler(err) + continue + } + val := int8(parsed) + *t = &val + case *[]int8: + for _, str := range strs { + val, err := strconv.ParseInt(str, 10, 8) + errorHandler(err) + *t = append(*t, int8(val)) + } + case *int16: + val, err := strconv.ParseInt(strs[0], 10, 16) + errorHandler(err) + *t = int16(val) + case **int16: + parsed, err := strconv.ParseInt(strs[0], 10, 16) + if err != nil { + errorHandler(err) + continue + } + val := int16(parsed) + *t = &val + case *[]int16: + for _, str := range strs { + val, err := strconv.ParseInt(str, 10, 16) + errorHandler(err) + *t = append(*t, int16(val)) + } + case *int32: + val, err := strconv.ParseInt(strs[0], 10, 32) + errorHandler(err) + *t = int32(val) + case **int32: + parsed, err := strconv.ParseInt(strs[0], 10, 32) + if err != nil { + errorHandler(err) + continue + } + val := int32(parsed) + *t = &val + case *[]int32: + for _, str := range strs { + val, err := strconv.ParseInt(str, 10, 32) + errorHandler(err) + *t = append(*t, int32(val)) + } + case *int64: + val, err := strconv.ParseInt(strs[0], 10, 64) + errorHandler(err) + *t = val + case **int64: + parsed, err := strconv.ParseInt(strs[0], 10, 64) + if err != nil { + errorHandler(err) + continue + } + val := int64(parsed) + *t = &val + case *[]int64: + for _, str := range strs { + val, err := strconv.ParseInt(str, 10, 64) + errorHandler(err) + *t = append(*t, int64(val)) + } + case *float32: + val, err := strconv.ParseFloat(strs[0], 32) + errorHandler(err) + *t = float32(val) + case **float32: + parsed, err := strconv.ParseFloat(strs[0], 32) + if err != nil { + errorHandler(err) + continue + } + val := float32(parsed) + *t = &val + case *[]float32: + for _, str := range strs { + val, err := strconv.ParseFloat(str, 32) + errorHandler(err) + *t = append(*t, float32(val)) + } + case *float64: + val, err := strconv.ParseFloat(strs[0], 64) + errorHandler(err) + *t = val + case **float64: + parsed, err := strconv.ParseFloat(strs[0], 64) + if err != nil { + errorHandler(err) + continue + } + val := float64(parsed) + *t = &val + case *[]float64: + for _, str := range strs { + val, err := strconv.ParseFloat(str, 64) + errorHandler(err) + *t = append(*t, val) + } + case *uint: + val, err := strconv.ParseUint(strs[0], 10, 0) + errorHandler(err) + *t = uint(val) + case **uint: + parsed, err := strconv.ParseUint(strs[0], 10, 0) + if err != nil { + errorHandler(err) + continue + } + val := uint(parsed) + *t = &val + case *[]uint: + for _, str := range strs { + val, err := strconv.ParseUint(str, 10, 0) + errorHandler(err) + *t = append(*t, uint(val)) + } + case *int: + val, err := strconv.ParseInt(strs[0], 10, 0) + errorHandler(err) + *t = int(val) + case **int: + parsed, err := strconv.ParseInt(strs[0], 10, 0) + if err != nil { + errorHandler(err) + continue + } + val := int(parsed) + *t = &val + case *[]int: + for _, str := range strs { + val, err := strconv.ParseInt(str, 10, 0) + errorHandler(err) + *t = append(*t, int(val)) + } + case *bool: + val, err := strconv.ParseBool(strs[0]) + errorHandler(err) + *t = val + case **bool: + val, err := strconv.ParseBool(strs[0]) + if err != nil { + errorHandler(err) + continue + } + *t = &val + case *[]bool: + for _, str := range strs { + val, err := strconv.ParseBool(str) + errorHandler(err) + *t = append(*t, val) + } + case *string: + *t = strs[0] + case **string: + s := strs[0] + *t = &s + case *[]string: + *t = strs + case *time.Time: + timeFormat := TimeFormat + if fieldSpec.TimeFormat != "" { + timeFormat = fieldSpec.TimeFormat + } + val, err := time.Parse(timeFormat, strs[0]) + errorHandler(err) + *t = val + case **time.Time: + timeFormat := TimeFormat + if fieldSpec.TimeFormat != "" { + timeFormat = fieldSpec.TimeFormat + } + val, err := time.Parse(timeFormat, strs[0]) + if err != nil { + errorHandler(err) + continue + } + *t = &val + case *[]time.Time: + timeFormat := TimeFormat + if fieldSpec.TimeFormat != "" { + timeFormat = fieldSpec.TimeFormat + } + for _, str := range strs { + val, err := time.Parse(timeFormat, str) + errorHandler(err) + *t = append(*t, val) + } + case **multipart.FileHeader: + if files, ok := formFile[fieldName]; ok { + *t = files[0] + } + case *[]**multipart.FileHeader: + if files, ok := formFile[fieldName]; ok { + for _, file := range files { + *t = append(*t, &file) + } + } + default: + errorHandler(errors.New("Field type is unsupported by the application")) + } + + } + + errs = append(errs, Validate(req, userStruct)...) + + return errs +} + +func fieldNameAndSpec(fieldNameOrSpec interface{}) (string, bool, Field) { + var fieldName string + + fieldSpec, fieldHasSpec := fieldNameOrSpec.(Field) + + if fieldHasSpec { + fieldName = fieldSpec.Form + } else if name, ok := fieldNameOrSpec.(string); ok { + fieldName = name + } + + return fieldName, fieldHasSpec, fieldSpec +} + +type ( + // Only types that are FieldMappers can have request data deserialized into them. + FieldMapper interface { + // FieldMap returns a map of pointers into which the values will + // be deserialized to field names from the request's form body. + FieldMap(*http.Request) FieldMap + } + + // FieldMap is a map of pointers to struct fields -> field names from the request. + // The values could also be Field structs to specify metadata about the field. + FieldMap map[interface{}]interface{} + + // Field describes the properties of a struct field. + Field struct { + // Target is the struct field to deserialize into. + //Target interface{} + + // Form is the form field name to bind from + Form string + + // Required indicates whether the field is required. A required + // field that deserializes into the zero value for that type + // will generate an error. + Required bool + + // TimeFormat specifies the time format for time.Time fields. + TimeFormat string + + // Binder is a function that converts the incoming request value(s) + // to the field type; in other words, this field is populated + // by executing this function. Useful when the custom type doesn't + // implement the Binder interface. + Binder func(string, []string, Errors) Errors + + //A custom error message + ErrorMessage string + } + + // Binder is an interface which can deserialize itself from a slice of string + // coming from the request. Implement this interface so the type can be + // populated from form data in HTTP requests. + Binder interface { + // Bind populates the type with data in []string which comes from the + // HTTP request. The first argument is the field name. + Bind(string, []string, Errors) Errors + } + + // Validator can be implemented by your type to handle some + // rudimentary request validation separately from your + // application logic. + Validator interface { + // Validate validates that the request is OK. It is recommended + // that validation be limited to checking values for syntax and + // semantics, enough to know that you can make sense of the request + // in your application. For example, you might verify that a credit + // card number matches a valid pattern, but you probably wouldn't + // perform an actual credit card authorization here. + Validate(*http.Request, Errors) Errors + } +) + +var ( + // Maximum amount of memory to use when parsing a multipart form. + // Set this to whatever value you prefer; default is 10 MB. + MaxMemory = int64(1024 * 1024 * 10) + + // If no TimeFormat is specified for a time.Time field, this + // format will be used by default when parsing. + TimeFormat = time.RFC3339 +) + +const ( + jsonContentType = "application/json; charset=utf-8" + StatusUnprocessableEntity = 422 +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/binding/errors.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/binding/errors.go new file mode 100644 index 0000000000000000000000000000000000000000..921e3be2bc33d8fe25d274e7916be1c643d02268 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/binding/errors.go @@ -0,0 +1,129 @@ +package binding + +import ( + "encoding/json" + "net/http" + "strings" +) + +// This file shamelessly adapted from martini-contrib/binding + +type ( + // Errors may be generated during deserialization, binding, + // or validation. It implements the built-in error interface. + Errors []Error + + // Error is a powerful implementation of the built-in error + // interface that allows for error classification, custom error + // messages associated with specific fields, or with no + // associations at all. + Error struct { + // An error supports zero or more field names, because an + // error can morph three ways: (1) it can indicate something + // wrong with the request as a whole, (2) it can point to a + // specific problem with a particular input field, or (3) it + // can span multiple related input fields. + FieldNames []string `json:"fieldNames,omitempty"` + + // The classification is like an error code, convenient to + // use when processing or categorizing an error programmatically. + // It may also be called the "kind" of error. + Classification string `json:"classification,omitempty"` + + // Message should be human-readable and detailed enough to + // pinpoint and resolve the problem, but it should be brief. For + // example, a payload of 100 objects in a JSON array might have + // an error in the 41st object. The message should help the + // end user find and fix the error with their request. + Message string `json:"message,omitempty"` + } +) + +// Add adds an error associated with the fields indicated +// by fieldNames, with the given classification and message. +func (e *Errors) Add(fieldNames []string, classification, message string) { + *e = append(*e, Error{ + FieldNames: fieldNames, + Classification: classification, + Message: message, + }) +} + +// Len returns the number of errors. +func (e *Errors) Len() int { + return len(*e) +} + +// Has determines whether an Errors slice has an Error with +// a given classification in it; it does not search on messages +// or field names. +func (e *Errors) Has(class string) bool { + for _, err := range *e { + if err.Kind() == class { + return true + } + } + return false +} + +// Handle writes the errors to response in JSON form if any errors +// are contained, and it will return true. Otherwise, nothing happens +// and false is returned. +// (The value receiver is due to issue 8: https://github.com/mholt/binding/issues/8) +func (e Errors) Handle(response http.ResponseWriter) bool { + if e.Len() > 0 { + response.Header().Set("Content-Type", jsonContentType) + if e.Has(ContentTypeError) { + response.WriteHeader(http.StatusUnsupportedMediaType) + } else { + response.WriteHeader(http.StatusBadRequest) + } + errOutput, _ := json.Marshal(e) + response.Write(errOutput) + return true + } + return false +} + +// ErrorsHandleFunc Errors custom handler +type ErrorsHandleFunc func(e Errors, response http.ResponseWriter) bool + +// CustomHandle writes the errors to response by yourself if any errors are contained, +// and it will return true. Otherwise, nothing happens and false is returned. +func (e Errors) CustomHandle(handler ErrorsHandleFunc, response http.ResponseWriter) bool { + return handler(e, response) +} + +// Error returns a concatenation of all its error messages. +func (e Errors) Error() string { + messages := make([]string, 0, e.Len()) + for _, err := range e { + messages = append(messages, err.Error()) + } + return strings.Join(messages, ", ") +} + +// Fields returns the list of field names this error is +// associated with. +func (e Error) Fields() []string { + return e.FieldNames +} + +// Kind returns this error's classification. +func (e Error) Kind() string { + return e.Classification +} + +// Error returns this error's message. +func (e Error) Error() string { + return e.Message +} + +const ( + RequiredError = "RequiredError" + ContentTypeError = "ContentTypeError" + DeserializationError = "DeserializationError" + TypeError = "TypeError" + BusinessError = "BusinessError" + SystemError = "SystemError" +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/page/LICENSE b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/page/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..8dada3edaf50dbc082c9a125058f25def75e625a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/page/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/page/README.md b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/page/README.md new file mode 100644 index 0000000000000000000000000000000000000000..91469da358025a362a36474c66da47879e521b44 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/page/README.md @@ -0,0 +1,6 @@ +# page +[![GoDoc](https://godoc.org/github.com/voidint/page?status.svg)](https://godoc.org/github.com/voidint/page) +[![Build Status](https://travis-ci.org/voidint/page.png)](https://travis-ci.org/voidint/page) +[![Coverage Status](https://coveralls.io/repos/github/voidint/page/badge.svg)](https://coveralls.io/github/voidint/page) + +Pagination component written in golang. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/page/go.mod b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/page/go.mod new file mode 100644 index 0000000000000000000000000000000000000000..91c30fdbc71082c0ba362ecc2d785183cc93586a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/page/go.mod @@ -0,0 +1,3 @@ +module github.com/voidint/page + +go 1.13 diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/page/page.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/page/page.go new file mode 100644 index 0000000000000000000000000000000000000000..4cfee0ec9699bd0f338b204918a09017a4c00798 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/page/page.go @@ -0,0 +1,113 @@ +package page + +import ( + "fmt" + "reflect" +) + +// Limiter database limit clause in MySQL. +// +// eg. SELECT * FROM `user` LIMIT 0,2 +// +// eg. SELECT * FROM `user` LIMIT 2 OFFSET 0 +type Limiter struct { + Offset int64 + Limit int64 +} + +// Page business layer pagination struct. +type Page struct { + Page int64 `json:"page"` // page number + PageSize int64 `json:"page_size"` + TotalPages int64 `json:"total_pages"` + TotalRecords int64 `json:"total_records"` + Records []interface{} `json:"records"` +} + +// Pager business layer pagination interface. +type Pager interface { + // BuildLimiter get database limit clause for data access layer. + BuildLimiter() *Limiter + // AddRecords append record to collection. + AddRecords(records ...interface{}) error + // BuildPage get page object for serialization. + BuildPage() *Page +} + +// NewPager return business layer pagination instance. +func NewPager(elemType reflect.Type, page, pageSize, totalRecords int64) Pager { + if page <= 0 { + page = 1 + } + if pageSize <= 0 { + pageSize = 10 + } + if totalRecords < 0 { + totalRecords = 0 + } + capacity := pageSize + if pageSize > totalRecords { + capacity = totalRecords + } + + totalPages, _ := calcTotalPages(pageSize, totalRecords) + return &pagerImpl{ + page: page, + pageSize: pageSize, + totalPages: totalPages, + totalRecords: totalRecords, + records: make([]interface{}, 0, capacity), + elemType: elemType, + } +} + +type pagerImpl struct { + page int64 + pageSize int64 + totalPages int64 + totalRecords int64 + records []interface{} + elemType reflect.Type +} + +func (p *pagerImpl) BuildLimiter() *Limiter { + return &Limiter{ + Limit: p.pageSize, + Offset: (p.page - 1) * p.pageSize, + } +} + +func (p *pagerImpl) isAcceptableElem(k interface{}) bool { + return reflect.TypeOf(k) == p.elemType +} + +func (p *pagerImpl) AddRecords(records ...interface{}) error { + for _, record := range records { + if !p.isAcceptableElem(record) { + return fmt.Errorf("invalid element: %#v", record) + } + } + p.records = append(p.records, records...) + return nil +} + +func (p *pagerImpl) BuildPage() *Page { + return &Page{ + Page: p.page, + PageSize: p.pageSize, + TotalPages: p.totalPages, + TotalRecords: p.totalRecords, + Records: p.records, + } +} + +// EmptyPage return empty record object. +func EmptyPage(page, pageSize int64) *Page { + return &Page{ + Page: page, + PageSize: pageSize, + TotalPages: 0, + TotalRecords: 0, + Records: make([]interface{}, 0), + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/page/util.go b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/page/util.go new file mode 100644 index 0000000000000000000000000000000000000000..beec5bc770ab29ad9be3253b8b898517967fb48b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/github.com/voidint/page/util.go @@ -0,0 +1,24 @@ +package page + +import "errors" + +func calcTotalPages(pageSize, totalRecords int64) (totalPages int64, err error) { + if pageSize <= 0 { + return 0, errors.New("page size should be positive integer") + } + + if totalRecords < 0 { + return 0, errors.New("total records should not be negative integer") + } + + if totalRecords == 0 { + return 0, nil + } + + if totalRecords%pageSize == 0 { + totalPages = totalRecords / pageSize + } else { + totalPages = totalRecords/pageSize + 1 + } + return totalPages, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/LICENSE b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..6a66aea5eafe0ca6a688840c47219556c552488e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/PATENTS b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/PATENTS new file mode 100644 index 0000000000000000000000000000000000000000..733099041f84fa1e58611ab2e11af51c1f26d1d2 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/buffer.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/buffer.go new file mode 100644 index 0000000000000000000000000000000000000000..1ab07d078db1633be8977102b2defc0da0a6d4e8 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/buffer.go @@ -0,0 +1,97 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "io" + "sync" +) + +// buffer provides a linked list buffer for data exchange +// between producer and consumer. Theoretically the buffer is +// of unlimited capacity as it does no allocation of its own. +type buffer struct { + // protects concurrent access to head, tail and closed + *sync.Cond + + head *element // the buffer that will be read first + tail *element // the buffer that will be read last + + closed bool +} + +// An element represents a single link in a linked list. +type element struct { + buf []byte + next *element +} + +// newBuffer returns an empty buffer that is not closed. +func newBuffer() *buffer { + e := new(element) + b := &buffer{ + Cond: newCond(), + head: e, + tail: e, + } + return b +} + +// write makes buf available for Read to receive. +// buf must not be modified after the call to write. +func (b *buffer) write(buf []byte) { + b.Cond.L.Lock() + e := &element{buf: buf} + b.tail.next = e + b.tail = e + b.Cond.Signal() + b.Cond.L.Unlock() +} + +// eof closes the buffer. Reads from the buffer once all +// the data has been consumed will receive io.EOF. +func (b *buffer) eof() { + b.Cond.L.Lock() + b.closed = true + b.Cond.Signal() + b.Cond.L.Unlock() +} + +// Read reads data from the internal buffer in buf. Reads will block +// if no data is available, or until the buffer is closed. +func (b *buffer) Read(buf []byte) (n int, err error) { + b.Cond.L.Lock() + defer b.Cond.L.Unlock() + + for len(buf) > 0 { + // if there is data in b.head, copy it + if len(b.head.buf) > 0 { + r := copy(buf, b.head.buf) + buf, b.head.buf = buf[r:], b.head.buf[r:] + n += r + continue + } + // if there is a next buffer, make it the head + if len(b.head.buf) == 0 && b.head != b.tail { + b.head = b.head.next + continue + } + + // if at least one byte has been copied, return + if n > 0 { + break + } + + // if nothing was read, and there is nothing outstanding + // check to see if the buffer is closed. + if b.closed { + err = io.EOF + break + } + // out of buffers, wait for producer + b.Cond.Wait() + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/certs.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/certs.go new file mode 100644 index 0000000000000000000000000000000000000000..42106f3f2cb11ed4615735c588e71edff7a6bf11 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/certs.go @@ -0,0 +1,521 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "bytes" + "errors" + "fmt" + "io" + "net" + "sort" + "time" +) + +// These constants from [PROTOCOL.certkeys] represent the algorithm names +// for certificate types supported by this package. +const ( + CertAlgoRSAv01 = "ssh-rsa-cert-v01@openssh.com" + CertAlgoDSAv01 = "ssh-dss-cert-v01@openssh.com" + CertAlgoECDSA256v01 = "ecdsa-sha2-nistp256-cert-v01@openssh.com" + CertAlgoECDSA384v01 = "ecdsa-sha2-nistp384-cert-v01@openssh.com" + CertAlgoECDSA521v01 = "ecdsa-sha2-nistp521-cert-v01@openssh.com" + CertAlgoED25519v01 = "ssh-ed25519-cert-v01@openssh.com" +) + +// Certificate types distinguish between host and user +// certificates. The values can be set in the CertType field of +// Certificate. +const ( + UserCert = 1 + HostCert = 2 +) + +// Signature represents a cryptographic signature. +type Signature struct { + Format string + Blob []byte +} + +// CertTimeInfinity can be used for OpenSSHCertV01.ValidBefore to indicate that +// a certificate does not expire. +const CertTimeInfinity = 1<<64 - 1 + +// An Certificate represents an OpenSSH certificate as defined in +// [PROTOCOL.certkeys]?rev=1.8. The Certificate type implements the +// PublicKey interface, so it can be unmarshaled using +// ParsePublicKey. +type Certificate struct { + Nonce []byte + Key PublicKey + Serial uint64 + CertType uint32 + KeyId string + ValidPrincipals []string + ValidAfter uint64 + ValidBefore uint64 + Permissions + Reserved []byte + SignatureKey PublicKey + Signature *Signature +} + +// genericCertData holds the key-independent part of the certificate data. +// Overall, certificates contain an nonce, public key fields and +// key-independent fields. +type genericCertData struct { + Serial uint64 + CertType uint32 + KeyId string + ValidPrincipals []byte + ValidAfter uint64 + ValidBefore uint64 + CriticalOptions []byte + Extensions []byte + Reserved []byte + SignatureKey []byte + Signature []byte +} + +func marshalStringList(namelist []string) []byte { + var to []byte + for _, name := range namelist { + s := struct{ N string }{name} + to = append(to, Marshal(&s)...) + } + return to +} + +type optionsTuple struct { + Key string + Value []byte +} + +type optionsTupleValue struct { + Value string +} + +// serialize a map of critical options or extensions +// issue #10569 - per [PROTOCOL.certkeys] and SSH implementation, +// we need two length prefixes for a non-empty string value +func marshalTuples(tups map[string]string) []byte { + keys := make([]string, 0, len(tups)) + for key := range tups { + keys = append(keys, key) + } + sort.Strings(keys) + + var ret []byte + for _, key := range keys { + s := optionsTuple{Key: key} + if value := tups[key]; len(value) > 0 { + s.Value = Marshal(&optionsTupleValue{value}) + } + ret = append(ret, Marshal(&s)...) + } + return ret +} + +// issue #10569 - per [PROTOCOL.certkeys] and SSH implementation, +// we need two length prefixes for a non-empty option value +func parseTuples(in []byte) (map[string]string, error) { + tups := map[string]string{} + var lastKey string + var haveLastKey bool + + for len(in) > 0 { + var key, val, extra []byte + var ok bool + + if key, in, ok = parseString(in); !ok { + return nil, errShortRead + } + keyStr := string(key) + // according to [PROTOCOL.certkeys], the names must be in + // lexical order. + if haveLastKey && keyStr <= lastKey { + return nil, fmt.Errorf("ssh: certificate options are not in lexical order") + } + lastKey, haveLastKey = keyStr, true + // the next field is a data field, which if non-empty has a string embedded + if val, in, ok = parseString(in); !ok { + return nil, errShortRead + } + if len(val) > 0 { + val, extra, ok = parseString(val) + if !ok { + return nil, errShortRead + } + if len(extra) > 0 { + return nil, fmt.Errorf("ssh: unexpected trailing data after certificate option value") + } + tups[keyStr] = string(val) + } else { + tups[keyStr] = "" + } + } + return tups, nil +} + +func parseCert(in []byte, privAlgo string) (*Certificate, error) { + nonce, rest, ok := parseString(in) + if !ok { + return nil, errShortRead + } + + key, rest, err := parsePubKey(rest, privAlgo) + if err != nil { + return nil, err + } + + var g genericCertData + if err := Unmarshal(rest, &g); err != nil { + return nil, err + } + + c := &Certificate{ + Nonce: nonce, + Key: key, + Serial: g.Serial, + CertType: g.CertType, + KeyId: g.KeyId, + ValidAfter: g.ValidAfter, + ValidBefore: g.ValidBefore, + } + + for principals := g.ValidPrincipals; len(principals) > 0; { + principal, rest, ok := parseString(principals) + if !ok { + return nil, errShortRead + } + c.ValidPrincipals = append(c.ValidPrincipals, string(principal)) + principals = rest + } + + c.CriticalOptions, err = parseTuples(g.CriticalOptions) + if err != nil { + return nil, err + } + c.Extensions, err = parseTuples(g.Extensions) + if err != nil { + return nil, err + } + c.Reserved = g.Reserved + k, err := ParsePublicKey(g.SignatureKey) + if err != nil { + return nil, err + } + + c.SignatureKey = k + c.Signature, rest, ok = parseSignatureBody(g.Signature) + if !ok || len(rest) > 0 { + return nil, errors.New("ssh: signature parse error") + } + + return c, nil +} + +type openSSHCertSigner struct { + pub *Certificate + signer Signer +} + +// NewCertSigner returns a Signer that signs with the given Certificate, whose +// private key is held by signer. It returns an error if the public key in cert +// doesn't match the key used by signer. +func NewCertSigner(cert *Certificate, signer Signer) (Signer, error) { + if bytes.Compare(cert.Key.Marshal(), signer.PublicKey().Marshal()) != 0 { + return nil, errors.New("ssh: signer and cert have different public key") + } + + return &openSSHCertSigner{cert, signer}, nil +} + +func (s *openSSHCertSigner) Sign(rand io.Reader, data []byte) (*Signature, error) { + return s.signer.Sign(rand, data) +} + +func (s *openSSHCertSigner) PublicKey() PublicKey { + return s.pub +} + +const sourceAddressCriticalOption = "source-address" + +// CertChecker does the work of verifying a certificate. Its methods +// can be plugged into ClientConfig.HostKeyCallback and +// ServerConfig.PublicKeyCallback. For the CertChecker to work, +// minimally, the IsAuthority callback should be set. +type CertChecker struct { + // SupportedCriticalOptions lists the CriticalOptions that the + // server application layer understands. These are only used + // for user certificates. + SupportedCriticalOptions []string + + // IsUserAuthority should return true if the key is recognized as an + // authority for the given user certificate. This allows for + // certificates to be signed by other certificates. This must be set + // if this CertChecker will be checking user certificates. + IsUserAuthority func(auth PublicKey) bool + + // IsHostAuthority should report whether the key is recognized as + // an authority for this host. This allows for certificates to be + // signed by other keys, and for those other keys to only be valid + // signers for particular hostnames. This must be set if this + // CertChecker will be checking host certificates. + IsHostAuthority func(auth PublicKey, address string) bool + + // Clock is used for verifying time stamps. If nil, time.Now + // is used. + Clock func() time.Time + + // UserKeyFallback is called when CertChecker.Authenticate encounters a + // public key that is not a certificate. It must implement validation + // of user keys or else, if nil, all such keys are rejected. + UserKeyFallback func(conn ConnMetadata, key PublicKey) (*Permissions, error) + + // HostKeyFallback is called when CertChecker.CheckHostKey encounters a + // public key that is not a certificate. It must implement host key + // validation or else, if nil, all such keys are rejected. + HostKeyFallback HostKeyCallback + + // IsRevoked is called for each certificate so that revocation checking + // can be implemented. It should return true if the given certificate + // is revoked and false otherwise. If nil, no certificates are + // considered to have been revoked. + IsRevoked func(cert *Certificate) bool +} + +// CheckHostKey checks a host key certificate. This method can be +// plugged into ClientConfig.HostKeyCallback. +func (c *CertChecker) CheckHostKey(addr string, remote net.Addr, key PublicKey) error { + cert, ok := key.(*Certificate) + if !ok { + if c.HostKeyFallback != nil { + return c.HostKeyFallback(addr, remote, key) + } + return errors.New("ssh: non-certificate host key") + } + if cert.CertType != HostCert { + return fmt.Errorf("ssh: certificate presented as a host key has type %d", cert.CertType) + } + if !c.IsHostAuthority(cert.SignatureKey, addr) { + return fmt.Errorf("ssh: no authorities for hostname: %v", addr) + } + + hostname, _, err := net.SplitHostPort(addr) + if err != nil { + return err + } + + // Pass hostname only as principal for host certificates (consistent with OpenSSH) + return c.CheckCert(hostname, cert) +} + +// Authenticate checks a user certificate. Authenticate can be used as +// a value for ServerConfig.PublicKeyCallback. +func (c *CertChecker) Authenticate(conn ConnMetadata, pubKey PublicKey) (*Permissions, error) { + cert, ok := pubKey.(*Certificate) + if !ok { + if c.UserKeyFallback != nil { + return c.UserKeyFallback(conn, pubKey) + } + return nil, errors.New("ssh: normal key pairs not accepted") + } + + if cert.CertType != UserCert { + return nil, fmt.Errorf("ssh: cert has type %d", cert.CertType) + } + if !c.IsUserAuthority(cert.SignatureKey) { + return nil, fmt.Errorf("ssh: certificate signed by unrecognized authority") + } + + if err := c.CheckCert(conn.User(), cert); err != nil { + return nil, err + } + + return &cert.Permissions, nil +} + +// CheckCert checks CriticalOptions, ValidPrincipals, revocation, timestamp and +// the signature of the certificate. +func (c *CertChecker) CheckCert(principal string, cert *Certificate) error { + if c.IsRevoked != nil && c.IsRevoked(cert) { + return fmt.Errorf("ssh: certificate serial %d revoked", cert.Serial) + } + + for opt := range cert.CriticalOptions { + // sourceAddressCriticalOption will be enforced by + // serverAuthenticate + if opt == sourceAddressCriticalOption { + continue + } + + found := false + for _, supp := range c.SupportedCriticalOptions { + if supp == opt { + found = true + break + } + } + if !found { + return fmt.Errorf("ssh: unsupported critical option %q in certificate", opt) + } + } + + if len(cert.ValidPrincipals) > 0 { + // By default, certs are valid for all users/hosts. + found := false + for _, p := range cert.ValidPrincipals { + if p == principal { + found = true + break + } + } + if !found { + return fmt.Errorf("ssh: principal %q not in the set of valid principals for given certificate: %q", principal, cert.ValidPrincipals) + } + } + + clock := c.Clock + if clock == nil { + clock = time.Now + } + + unixNow := clock().Unix() + if after := int64(cert.ValidAfter); after < 0 || unixNow < int64(cert.ValidAfter) { + return fmt.Errorf("ssh: cert is not yet valid") + } + if before := int64(cert.ValidBefore); cert.ValidBefore != uint64(CertTimeInfinity) && (unixNow >= before || before < 0) { + return fmt.Errorf("ssh: cert has expired") + } + if err := cert.SignatureKey.Verify(cert.bytesForSigning(), cert.Signature); err != nil { + return fmt.Errorf("ssh: certificate signature does not verify") + } + + return nil +} + +// SignCert sets c.SignatureKey to the authority's public key and stores a +// Signature, by authority, in the certificate. +func (c *Certificate) SignCert(rand io.Reader, authority Signer) error { + c.Nonce = make([]byte, 32) + if _, err := io.ReadFull(rand, c.Nonce); err != nil { + return err + } + c.SignatureKey = authority.PublicKey() + + sig, err := authority.Sign(rand, c.bytesForSigning()) + if err != nil { + return err + } + c.Signature = sig + return nil +} + +var certAlgoNames = map[string]string{ + KeyAlgoRSA: CertAlgoRSAv01, + KeyAlgoDSA: CertAlgoDSAv01, + KeyAlgoECDSA256: CertAlgoECDSA256v01, + KeyAlgoECDSA384: CertAlgoECDSA384v01, + KeyAlgoECDSA521: CertAlgoECDSA521v01, + KeyAlgoED25519: CertAlgoED25519v01, +} + +// certToPrivAlgo returns the underlying algorithm for a certificate algorithm. +// Panics if a non-certificate algorithm is passed. +func certToPrivAlgo(algo string) string { + for privAlgo, pubAlgo := range certAlgoNames { + if pubAlgo == algo { + return privAlgo + } + } + panic("unknown cert algorithm") +} + +func (cert *Certificate) bytesForSigning() []byte { + c2 := *cert + c2.Signature = nil + out := c2.Marshal() + // Drop trailing signature length. + return out[:len(out)-4] +} + +// Marshal serializes c into OpenSSH's wire format. It is part of the +// PublicKey interface. +func (c *Certificate) Marshal() []byte { + generic := genericCertData{ + Serial: c.Serial, + CertType: c.CertType, + KeyId: c.KeyId, + ValidPrincipals: marshalStringList(c.ValidPrincipals), + ValidAfter: uint64(c.ValidAfter), + ValidBefore: uint64(c.ValidBefore), + CriticalOptions: marshalTuples(c.CriticalOptions), + Extensions: marshalTuples(c.Extensions), + Reserved: c.Reserved, + SignatureKey: c.SignatureKey.Marshal(), + } + if c.Signature != nil { + generic.Signature = Marshal(c.Signature) + } + genericBytes := Marshal(&generic) + keyBytes := c.Key.Marshal() + _, keyBytes, _ = parseString(keyBytes) + prefix := Marshal(&struct { + Name string + Nonce []byte + Key []byte `ssh:"rest"` + }{c.Type(), c.Nonce, keyBytes}) + + result := make([]byte, 0, len(prefix)+len(genericBytes)) + result = append(result, prefix...) + result = append(result, genericBytes...) + return result +} + +// Type returns the key name. It is part of the PublicKey interface. +func (c *Certificate) Type() string { + algo, ok := certAlgoNames[c.Key.Type()] + if !ok { + panic("unknown cert key type " + c.Key.Type()) + } + return algo +} + +// Verify verifies a signature against the certificate's public +// key. It is part of the PublicKey interface. +func (c *Certificate) Verify(data []byte, sig *Signature) error { + return c.Key.Verify(data, sig) +} + +func parseSignatureBody(in []byte) (out *Signature, rest []byte, ok bool) { + format, in, ok := parseString(in) + if !ok { + return + } + + out = &Signature{ + Format: string(format), + } + + if out.Blob, in, ok = parseString(in); !ok { + return + } + + return out, in, ok +} + +func parseSignature(in []byte) (out *Signature, rest []byte, ok bool) { + sigBytes, rest, ok := parseString(in) + if !ok { + return + } + + out, trailing, ok := parseSignatureBody(sigBytes) + if !ok || len(trailing) > 0 { + return nil, nil, false + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/channel.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/channel.go new file mode 100644 index 0000000000000000000000000000000000000000..c0834c00dfee9a4e9ac17ed8eb4527b8fe33cf67 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/channel.go @@ -0,0 +1,633 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "encoding/binary" + "errors" + "fmt" + "io" + "log" + "sync" +) + +const ( + minPacketLength = 9 + // channelMaxPacket contains the maximum number of bytes that will be + // sent in a single packet. As per RFC 4253, section 6.1, 32k is also + // the minimum. + channelMaxPacket = 1 << 15 + // We follow OpenSSH here. + channelWindowSize = 64 * channelMaxPacket +) + +// NewChannel represents an incoming request to a channel. It must either be +// accepted for use by calling Accept, or rejected by calling Reject. +type NewChannel interface { + // Accept accepts the channel creation request. It returns the Channel + // and a Go channel containing SSH requests. The Go channel must be + // serviced otherwise the Channel will hang. + Accept() (Channel, <-chan *Request, error) + + // Reject rejects the channel creation request. After calling + // this, no other methods on the Channel may be called. + Reject(reason RejectionReason, message string) error + + // ChannelType returns the type of the channel, as supplied by the + // client. + ChannelType() string + + // ExtraData returns the arbitrary payload for this channel, as supplied + // by the client. This data is specific to the channel type. + ExtraData() []byte +} + +// A Channel is an ordered, reliable, flow-controlled, duplex stream +// that is multiplexed over an SSH connection. +type Channel interface { + // Read reads up to len(data) bytes from the channel. + Read(data []byte) (int, error) + + // Write writes len(data) bytes to the channel. + Write(data []byte) (int, error) + + // Close signals end of channel use. No data may be sent after this + // call. + Close() error + + // CloseWrite signals the end of sending in-band + // data. Requests may still be sent, and the other side may + // still send data + CloseWrite() error + + // SendRequest sends a channel request. If wantReply is true, + // it will wait for a reply and return the result as a + // boolean, otherwise the return value will be false. Channel + // requests are out-of-band messages so they may be sent even + // if the data stream is closed or blocked by flow control. + // If the channel is closed before a reply is returned, io.EOF + // is returned. + SendRequest(name string, wantReply bool, payload []byte) (bool, error) + + // Stderr returns an io.ReadWriter that writes to this channel + // with the extended data type set to stderr. Stderr may + // safely be read and written from a different goroutine than + // Read and Write respectively. + Stderr() io.ReadWriter +} + +// Request is a request sent outside of the normal stream of +// data. Requests can either be specific to an SSH channel, or they +// can be global. +type Request struct { + Type string + WantReply bool + Payload []byte + + ch *channel + mux *mux +} + +// Reply sends a response to a request. It must be called for all requests +// where WantReply is true and is a no-op otherwise. The payload argument is +// ignored for replies to channel-specific requests. +func (r *Request) Reply(ok bool, payload []byte) error { + if !r.WantReply { + return nil + } + + if r.ch == nil { + return r.mux.ackRequest(ok, payload) + } + + return r.ch.ackRequest(ok) +} + +// RejectionReason is an enumeration used when rejecting channel creation +// requests. See RFC 4254, section 5.1. +type RejectionReason uint32 + +const ( + Prohibited RejectionReason = iota + 1 + ConnectionFailed + UnknownChannelType + ResourceShortage +) + +// String converts the rejection reason to human readable form. +func (r RejectionReason) String() string { + switch r { + case Prohibited: + return "administratively prohibited" + case ConnectionFailed: + return "connect failed" + case UnknownChannelType: + return "unknown channel type" + case ResourceShortage: + return "resource shortage" + } + return fmt.Sprintf("unknown reason %d", int(r)) +} + +func min(a uint32, b int) uint32 { + if a < uint32(b) { + return a + } + return uint32(b) +} + +type channelDirection uint8 + +const ( + channelInbound channelDirection = iota + channelOutbound +) + +// channel is an implementation of the Channel interface that works +// with the mux class. +type channel struct { + // R/O after creation + chanType string + extraData []byte + localId, remoteId uint32 + + // maxIncomingPayload and maxRemotePayload are the maximum + // payload sizes of normal and extended data packets for + // receiving and sending, respectively. The wire packet will + // be 9 or 13 bytes larger (excluding encryption overhead). + maxIncomingPayload uint32 + maxRemotePayload uint32 + + mux *mux + + // decided is set to true if an accept or reject message has been sent + // (for outbound channels) or received (for inbound channels). + decided bool + + // direction contains either channelOutbound, for channels created + // locally, or channelInbound, for channels created by the peer. + direction channelDirection + + // Pending internal channel messages. + msg chan interface{} + + // Since requests have no ID, there can be only one request + // with WantReply=true outstanding. This lock is held by a + // goroutine that has such an outgoing request pending. + sentRequestMu sync.Mutex + + incomingRequests chan *Request + + sentEOF bool + + // thread-safe data + remoteWin window + pending *buffer + extPending *buffer + + // windowMu protects myWindow, the flow-control window. + windowMu sync.Mutex + myWindow uint32 + + // writeMu serializes calls to mux.conn.writePacket() and + // protects sentClose and packetPool. This mutex must be + // different from windowMu, as writePacket can block if there + // is a key exchange pending. + writeMu sync.Mutex + sentClose bool + + // packetPool has a buffer for each extended channel ID to + // save allocations during writes. + packetPool map[uint32][]byte +} + +// writePacket sends a packet. If the packet is a channel close, it updates +// sentClose. This method takes the lock c.writeMu. +func (ch *channel) writePacket(packet []byte) error { + ch.writeMu.Lock() + if ch.sentClose { + ch.writeMu.Unlock() + return io.EOF + } + ch.sentClose = (packet[0] == msgChannelClose) + err := ch.mux.conn.writePacket(packet) + ch.writeMu.Unlock() + return err +} + +func (ch *channel) sendMessage(msg interface{}) error { + if debugMux { + log.Printf("send(%d): %#v", ch.mux.chanList.offset, msg) + } + + p := Marshal(msg) + binary.BigEndian.PutUint32(p[1:], ch.remoteId) + return ch.writePacket(p) +} + +// WriteExtended writes data to a specific extended stream. These streams are +// used, for example, for stderr. +func (ch *channel) WriteExtended(data []byte, extendedCode uint32) (n int, err error) { + if ch.sentEOF { + return 0, io.EOF + } + // 1 byte message type, 4 bytes remoteId, 4 bytes data length + opCode := byte(msgChannelData) + headerLength := uint32(9) + if extendedCode > 0 { + headerLength += 4 + opCode = msgChannelExtendedData + } + + ch.writeMu.Lock() + packet := ch.packetPool[extendedCode] + // We don't remove the buffer from packetPool, so + // WriteExtended calls from different goroutines will be + // flagged as errors by the race detector. + ch.writeMu.Unlock() + + for len(data) > 0 { + space := min(ch.maxRemotePayload, len(data)) + if space, err = ch.remoteWin.reserve(space); err != nil { + return n, err + } + if want := headerLength + space; uint32(cap(packet)) < want { + packet = make([]byte, want) + } else { + packet = packet[:want] + } + + todo := data[:space] + + packet[0] = opCode + binary.BigEndian.PutUint32(packet[1:], ch.remoteId) + if extendedCode > 0 { + binary.BigEndian.PutUint32(packet[5:], uint32(extendedCode)) + } + binary.BigEndian.PutUint32(packet[headerLength-4:], uint32(len(todo))) + copy(packet[headerLength:], todo) + if err = ch.writePacket(packet); err != nil { + return n, err + } + + n += len(todo) + data = data[len(todo):] + } + + ch.writeMu.Lock() + ch.packetPool[extendedCode] = packet + ch.writeMu.Unlock() + + return n, err +} + +func (ch *channel) handleData(packet []byte) error { + headerLen := 9 + isExtendedData := packet[0] == msgChannelExtendedData + if isExtendedData { + headerLen = 13 + } + if len(packet) < headerLen { + // malformed data packet + return parseError(packet[0]) + } + + var extended uint32 + if isExtendedData { + extended = binary.BigEndian.Uint32(packet[5:]) + } + + length := binary.BigEndian.Uint32(packet[headerLen-4 : headerLen]) + if length == 0 { + return nil + } + if length > ch.maxIncomingPayload { + // TODO(hanwen): should send Disconnect? + return errors.New("ssh: incoming packet exceeds maximum payload size") + } + + data := packet[headerLen:] + if length != uint32(len(data)) { + return errors.New("ssh: wrong packet length") + } + + ch.windowMu.Lock() + if ch.myWindow < length { + ch.windowMu.Unlock() + // TODO(hanwen): should send Disconnect with reason? + return errors.New("ssh: remote side wrote too much") + } + ch.myWindow -= length + ch.windowMu.Unlock() + + if extended == 1 { + ch.extPending.write(data) + } else if extended > 0 { + // discard other extended data. + } else { + ch.pending.write(data) + } + return nil +} + +func (c *channel) adjustWindow(n uint32) error { + c.windowMu.Lock() + // Since myWindow is managed on our side, and can never exceed + // the initial window setting, we don't worry about overflow. + c.myWindow += uint32(n) + c.windowMu.Unlock() + return c.sendMessage(windowAdjustMsg{ + AdditionalBytes: uint32(n), + }) +} + +func (c *channel) ReadExtended(data []byte, extended uint32) (n int, err error) { + switch extended { + case 1: + n, err = c.extPending.Read(data) + case 0: + n, err = c.pending.Read(data) + default: + return 0, fmt.Errorf("ssh: extended code %d unimplemented", extended) + } + + if n > 0 { + err = c.adjustWindow(uint32(n)) + // sendWindowAdjust can return io.EOF if the remote + // peer has closed the connection, however we want to + // defer forwarding io.EOF to the caller of Read until + // the buffer has been drained. + if n > 0 && err == io.EOF { + err = nil + } + } + + return n, err +} + +func (c *channel) close() { + c.pending.eof() + c.extPending.eof() + close(c.msg) + close(c.incomingRequests) + c.writeMu.Lock() + // This is not necessary for a normal channel teardown, but if + // there was another error, it is. + c.sentClose = true + c.writeMu.Unlock() + // Unblock writers. + c.remoteWin.close() +} + +// responseMessageReceived is called when a success or failure message is +// received on a channel to check that such a message is reasonable for the +// given channel. +func (ch *channel) responseMessageReceived() error { + if ch.direction == channelInbound { + return errors.New("ssh: channel response message received on inbound channel") + } + if ch.decided { + return errors.New("ssh: duplicate response received for channel") + } + ch.decided = true + return nil +} + +func (ch *channel) handlePacket(packet []byte) error { + switch packet[0] { + case msgChannelData, msgChannelExtendedData: + return ch.handleData(packet) + case msgChannelClose: + ch.sendMessage(channelCloseMsg{PeersID: ch.remoteId}) + ch.mux.chanList.remove(ch.localId) + ch.close() + return nil + case msgChannelEOF: + // RFC 4254 is mute on how EOF affects dataExt messages but + // it is logical to signal EOF at the same time. + ch.extPending.eof() + ch.pending.eof() + return nil + } + + decoded, err := decode(packet) + if err != nil { + return err + } + + switch msg := decoded.(type) { + case *channelOpenFailureMsg: + if err := ch.responseMessageReceived(); err != nil { + return err + } + ch.mux.chanList.remove(msg.PeersID) + ch.msg <- msg + case *channelOpenConfirmMsg: + if err := ch.responseMessageReceived(); err != nil { + return err + } + if msg.MaxPacketSize < minPacketLength || msg.MaxPacketSize > 1<<31 { + return fmt.Errorf("ssh: invalid MaxPacketSize %d from peer", msg.MaxPacketSize) + } + ch.remoteId = msg.MyID + ch.maxRemotePayload = msg.MaxPacketSize + ch.remoteWin.add(msg.MyWindow) + ch.msg <- msg + case *windowAdjustMsg: + if !ch.remoteWin.add(msg.AdditionalBytes) { + return fmt.Errorf("ssh: invalid window update for %d bytes", msg.AdditionalBytes) + } + case *channelRequestMsg: + req := Request{ + Type: msg.Request, + WantReply: msg.WantReply, + Payload: msg.RequestSpecificData, + ch: ch, + } + + ch.incomingRequests <- &req + default: + ch.msg <- msg + } + return nil +} + +func (m *mux) newChannel(chanType string, direction channelDirection, extraData []byte) *channel { + ch := &channel{ + remoteWin: window{Cond: newCond()}, + myWindow: channelWindowSize, + pending: newBuffer(), + extPending: newBuffer(), + direction: direction, + incomingRequests: make(chan *Request, chanSize), + msg: make(chan interface{}, chanSize), + chanType: chanType, + extraData: extraData, + mux: m, + packetPool: make(map[uint32][]byte), + } + ch.localId = m.chanList.add(ch) + return ch +} + +var errUndecided = errors.New("ssh: must Accept or Reject channel") +var errDecidedAlready = errors.New("ssh: can call Accept or Reject only once") + +type extChannel struct { + code uint32 + ch *channel +} + +func (e *extChannel) Write(data []byte) (n int, err error) { + return e.ch.WriteExtended(data, e.code) +} + +func (e *extChannel) Read(data []byte) (n int, err error) { + return e.ch.ReadExtended(data, e.code) +} + +func (ch *channel) Accept() (Channel, <-chan *Request, error) { + if ch.decided { + return nil, nil, errDecidedAlready + } + ch.maxIncomingPayload = channelMaxPacket + confirm := channelOpenConfirmMsg{ + PeersID: ch.remoteId, + MyID: ch.localId, + MyWindow: ch.myWindow, + MaxPacketSize: ch.maxIncomingPayload, + } + ch.decided = true + if err := ch.sendMessage(confirm); err != nil { + return nil, nil, err + } + + return ch, ch.incomingRequests, nil +} + +func (ch *channel) Reject(reason RejectionReason, message string) error { + if ch.decided { + return errDecidedAlready + } + reject := channelOpenFailureMsg{ + PeersID: ch.remoteId, + Reason: reason, + Message: message, + Language: "en", + } + ch.decided = true + return ch.sendMessage(reject) +} + +func (ch *channel) Read(data []byte) (int, error) { + if !ch.decided { + return 0, errUndecided + } + return ch.ReadExtended(data, 0) +} + +func (ch *channel) Write(data []byte) (int, error) { + if !ch.decided { + return 0, errUndecided + } + return ch.WriteExtended(data, 0) +} + +func (ch *channel) CloseWrite() error { + if !ch.decided { + return errUndecided + } + ch.sentEOF = true + return ch.sendMessage(channelEOFMsg{ + PeersID: ch.remoteId}) +} + +func (ch *channel) Close() error { + if !ch.decided { + return errUndecided + } + + return ch.sendMessage(channelCloseMsg{ + PeersID: ch.remoteId}) +} + +// Extended returns an io.ReadWriter that sends and receives data on the given, +// SSH extended stream. Such streams are used, for example, for stderr. +func (ch *channel) Extended(code uint32) io.ReadWriter { + if !ch.decided { + return nil + } + return &extChannel{code, ch} +} + +func (ch *channel) Stderr() io.ReadWriter { + return ch.Extended(1) +} + +func (ch *channel) SendRequest(name string, wantReply bool, payload []byte) (bool, error) { + if !ch.decided { + return false, errUndecided + } + + if wantReply { + ch.sentRequestMu.Lock() + defer ch.sentRequestMu.Unlock() + } + + msg := channelRequestMsg{ + PeersID: ch.remoteId, + Request: name, + WantReply: wantReply, + RequestSpecificData: payload, + } + + if err := ch.sendMessage(msg); err != nil { + return false, err + } + + if wantReply { + m, ok := (<-ch.msg) + if !ok { + return false, io.EOF + } + switch m.(type) { + case *channelRequestFailureMsg: + return false, nil + case *channelRequestSuccessMsg: + return true, nil + default: + return false, fmt.Errorf("ssh: unexpected response to channel request: %#v", m) + } + } + + return false, nil +} + +// ackRequest either sends an ack or nack to the channel request. +func (ch *channel) ackRequest(ok bool) error { + if !ch.decided { + return errUndecided + } + + var msg interface{} + if !ok { + msg = channelRequestFailureMsg{ + PeersID: ch.remoteId, + } + } else { + msg = channelRequestSuccessMsg{ + PeersID: ch.remoteId, + } + } + return ch.sendMessage(msg) +} + +func (ch *channel) ChannelType() string { + return ch.chanType +} + +func (ch *channel) ExtraData() []byte { + return ch.extraData +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/cipher.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/cipher.go new file mode 100644 index 0000000000000000000000000000000000000000..67b0126105944fa06accf88bde03bb0b5c397da0 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/cipher.go @@ -0,0 +1,770 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "crypto/aes" + "crypto/cipher" + "crypto/des" + "crypto/rc4" + "crypto/subtle" + "encoding/binary" + "errors" + "fmt" + "hash" + "io" + "io/ioutil" + "math/bits" + + "golang.org/x/crypto/internal/chacha20" + "golang.org/x/crypto/poly1305" +) + +const ( + packetSizeMultiple = 16 // TODO(huin) this should be determined by the cipher. + + // RFC 4253 section 6.1 defines a minimum packet size of 32768 that implementations + // MUST be able to process (plus a few more kilobytes for padding and mac). The RFC + // indicates implementations SHOULD be able to handle larger packet sizes, but then + // waffles on about reasonable limits. + // + // OpenSSH caps their maxPacket at 256kB so we choose to do + // the same. maxPacket is also used to ensure that uint32 + // length fields do not overflow, so it should remain well + // below 4G. + maxPacket = 256 * 1024 +) + +// noneCipher implements cipher.Stream and provides no encryption. It is used +// by the transport before the first key-exchange. +type noneCipher struct{} + +func (c noneCipher) XORKeyStream(dst, src []byte) { + copy(dst, src) +} + +func newAESCTR(key, iv []byte) (cipher.Stream, error) { + c, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + return cipher.NewCTR(c, iv), nil +} + +func newRC4(key, iv []byte) (cipher.Stream, error) { + return rc4.NewCipher(key) +} + +type cipherMode struct { + keySize int + ivSize int + create func(key, iv []byte, macKey []byte, algs directionAlgorithms) (packetCipher, error) +} + +func streamCipherMode(skip int, createFunc func(key, iv []byte) (cipher.Stream, error)) func(key, iv []byte, macKey []byte, algs directionAlgorithms) (packetCipher, error) { + return func(key, iv, macKey []byte, algs directionAlgorithms) (packetCipher, error) { + stream, err := createFunc(key, iv) + if err != nil { + return nil, err + } + + var streamDump []byte + if skip > 0 { + streamDump = make([]byte, 512) + } + + for remainingToDump := skip; remainingToDump > 0; { + dumpThisTime := remainingToDump + if dumpThisTime > len(streamDump) { + dumpThisTime = len(streamDump) + } + stream.XORKeyStream(streamDump[:dumpThisTime], streamDump[:dumpThisTime]) + remainingToDump -= dumpThisTime + } + + mac := macModes[algs.MAC].new(macKey) + return &streamPacketCipher{ + mac: mac, + etm: macModes[algs.MAC].etm, + macResult: make([]byte, mac.Size()), + cipher: stream, + }, nil + } +} + +// cipherModes documents properties of supported ciphers. Ciphers not included +// are not supported and will not be negotiated, even if explicitly requested in +// ClientConfig.Crypto.Ciphers. +var cipherModes = map[string]*cipherMode{ + // Ciphers from RFC4344, which introduced many CTR-based ciphers. Algorithms + // are defined in the order specified in the RFC. + "aes128-ctr": {16, aes.BlockSize, streamCipherMode(0, newAESCTR)}, + "aes192-ctr": {24, aes.BlockSize, streamCipherMode(0, newAESCTR)}, + "aes256-ctr": {32, aes.BlockSize, streamCipherMode(0, newAESCTR)}, + + // Ciphers from RFC4345, which introduces security-improved arcfour ciphers. + // They are defined in the order specified in the RFC. + "arcfour128": {16, 0, streamCipherMode(1536, newRC4)}, + "arcfour256": {32, 0, streamCipherMode(1536, newRC4)}, + + // Cipher defined in RFC 4253, which describes SSH Transport Layer Protocol. + // Note that this cipher is not safe, as stated in RFC 4253: "Arcfour (and + // RC4) has problems with weak keys, and should be used with caution." + // RFC4345 introduces improved versions of Arcfour. + "arcfour": {16, 0, streamCipherMode(0, newRC4)}, + + // AEAD ciphers + gcmCipherID: {16, 12, newGCMCipher}, + chacha20Poly1305ID: {64, 0, newChaCha20Cipher}, + + // CBC mode is insecure and so is not included in the default config. + // (See http://www.isg.rhul.ac.uk/~kp/SandPfinal.pdf). If absolutely + // needed, it's possible to specify a custom Config to enable it. + // You should expect that an active attacker can recover plaintext if + // you do. + aes128cbcID: {16, aes.BlockSize, newAESCBCCipher}, + + // 3des-cbc is insecure and is not included in the default + // config. + tripledescbcID: {24, des.BlockSize, newTripleDESCBCCipher}, +} + +// prefixLen is the length of the packet prefix that contains the packet length +// and number of padding bytes. +const prefixLen = 5 + +// streamPacketCipher is a packetCipher using a stream cipher. +type streamPacketCipher struct { + mac hash.Hash + cipher cipher.Stream + etm bool + + // The following members are to avoid per-packet allocations. + prefix [prefixLen]byte + seqNumBytes [4]byte + padding [2 * packetSizeMultiple]byte + packetData []byte + macResult []byte +} + +// readPacket reads and decrypt a single packet from the reader argument. +func (s *streamPacketCipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) { + if _, err := io.ReadFull(r, s.prefix[:]); err != nil { + return nil, err + } + + var encryptedPaddingLength [1]byte + if s.mac != nil && s.etm { + copy(encryptedPaddingLength[:], s.prefix[4:5]) + s.cipher.XORKeyStream(s.prefix[4:5], s.prefix[4:5]) + } else { + s.cipher.XORKeyStream(s.prefix[:], s.prefix[:]) + } + + length := binary.BigEndian.Uint32(s.prefix[0:4]) + paddingLength := uint32(s.prefix[4]) + + var macSize uint32 + if s.mac != nil { + s.mac.Reset() + binary.BigEndian.PutUint32(s.seqNumBytes[:], seqNum) + s.mac.Write(s.seqNumBytes[:]) + if s.etm { + s.mac.Write(s.prefix[:4]) + s.mac.Write(encryptedPaddingLength[:]) + } else { + s.mac.Write(s.prefix[:]) + } + macSize = uint32(s.mac.Size()) + } + + if length <= paddingLength+1 { + return nil, errors.New("ssh: invalid packet length, packet too small") + } + + if length > maxPacket { + return nil, errors.New("ssh: invalid packet length, packet too large") + } + + // the maxPacket check above ensures that length-1+macSize + // does not overflow. + if uint32(cap(s.packetData)) < length-1+macSize { + s.packetData = make([]byte, length-1+macSize) + } else { + s.packetData = s.packetData[:length-1+macSize] + } + + if _, err := io.ReadFull(r, s.packetData); err != nil { + return nil, err + } + mac := s.packetData[length-1:] + data := s.packetData[:length-1] + + if s.mac != nil && s.etm { + s.mac.Write(data) + } + + s.cipher.XORKeyStream(data, data) + + if s.mac != nil { + if !s.etm { + s.mac.Write(data) + } + s.macResult = s.mac.Sum(s.macResult[:0]) + if subtle.ConstantTimeCompare(s.macResult, mac) != 1 { + return nil, errors.New("ssh: MAC failure") + } + } + + return s.packetData[:length-paddingLength-1], nil +} + +// writePacket encrypts and sends a packet of data to the writer argument +func (s *streamPacketCipher) writePacket(seqNum uint32, w io.Writer, rand io.Reader, packet []byte) error { + if len(packet) > maxPacket { + return errors.New("ssh: packet too large") + } + + aadlen := 0 + if s.mac != nil && s.etm { + // packet length is not encrypted for EtM modes + aadlen = 4 + } + + paddingLength := packetSizeMultiple - (prefixLen+len(packet)-aadlen)%packetSizeMultiple + if paddingLength < 4 { + paddingLength += packetSizeMultiple + } + + length := len(packet) + 1 + paddingLength + binary.BigEndian.PutUint32(s.prefix[:], uint32(length)) + s.prefix[4] = byte(paddingLength) + padding := s.padding[:paddingLength] + if _, err := io.ReadFull(rand, padding); err != nil { + return err + } + + if s.mac != nil { + s.mac.Reset() + binary.BigEndian.PutUint32(s.seqNumBytes[:], seqNum) + s.mac.Write(s.seqNumBytes[:]) + + if s.etm { + // For EtM algorithms, the packet length must stay unencrypted, + // but the following data (padding length) must be encrypted + s.cipher.XORKeyStream(s.prefix[4:5], s.prefix[4:5]) + } + + s.mac.Write(s.prefix[:]) + + if !s.etm { + // For non-EtM algorithms, the algorithm is applied on unencrypted data + s.mac.Write(packet) + s.mac.Write(padding) + } + } + + if !(s.mac != nil && s.etm) { + // For EtM algorithms, the padding length has already been encrypted + // and the packet length must remain unencrypted + s.cipher.XORKeyStream(s.prefix[:], s.prefix[:]) + } + + s.cipher.XORKeyStream(packet, packet) + s.cipher.XORKeyStream(padding, padding) + + if s.mac != nil && s.etm { + // For EtM algorithms, packet and padding must be encrypted + s.mac.Write(packet) + s.mac.Write(padding) + } + + if _, err := w.Write(s.prefix[:]); err != nil { + return err + } + if _, err := w.Write(packet); err != nil { + return err + } + if _, err := w.Write(padding); err != nil { + return err + } + + if s.mac != nil { + s.macResult = s.mac.Sum(s.macResult[:0]) + if _, err := w.Write(s.macResult); err != nil { + return err + } + } + + return nil +} + +type gcmCipher struct { + aead cipher.AEAD + prefix [4]byte + iv []byte + buf []byte +} + +func newGCMCipher(key, iv, unusedMacKey []byte, unusedAlgs directionAlgorithms) (packetCipher, error) { + c, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + + aead, err := cipher.NewGCM(c) + if err != nil { + return nil, err + } + + return &gcmCipher{ + aead: aead, + iv: iv, + }, nil +} + +const gcmTagSize = 16 + +func (c *gcmCipher) writePacket(seqNum uint32, w io.Writer, rand io.Reader, packet []byte) error { + // Pad out to multiple of 16 bytes. This is different from the + // stream cipher because that encrypts the length too. + padding := byte(packetSizeMultiple - (1+len(packet))%packetSizeMultiple) + if padding < 4 { + padding += packetSizeMultiple + } + + length := uint32(len(packet) + int(padding) + 1) + binary.BigEndian.PutUint32(c.prefix[:], length) + if _, err := w.Write(c.prefix[:]); err != nil { + return err + } + + if cap(c.buf) < int(length) { + c.buf = make([]byte, length) + } else { + c.buf = c.buf[:length] + } + + c.buf[0] = padding + copy(c.buf[1:], packet) + if _, err := io.ReadFull(rand, c.buf[1+len(packet):]); err != nil { + return err + } + c.buf = c.aead.Seal(c.buf[:0], c.iv, c.buf, c.prefix[:]) + if _, err := w.Write(c.buf); err != nil { + return err + } + c.incIV() + + return nil +} + +func (c *gcmCipher) incIV() { + for i := 4 + 7; i >= 4; i-- { + c.iv[i]++ + if c.iv[i] != 0 { + break + } + } +} + +func (c *gcmCipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) { + if _, err := io.ReadFull(r, c.prefix[:]); err != nil { + return nil, err + } + length := binary.BigEndian.Uint32(c.prefix[:]) + if length > maxPacket { + return nil, errors.New("ssh: max packet length exceeded") + } + + if cap(c.buf) < int(length+gcmTagSize) { + c.buf = make([]byte, length+gcmTagSize) + } else { + c.buf = c.buf[:length+gcmTagSize] + } + + if _, err := io.ReadFull(r, c.buf); err != nil { + return nil, err + } + + plain, err := c.aead.Open(c.buf[:0], c.iv, c.buf, c.prefix[:]) + if err != nil { + return nil, err + } + c.incIV() + + padding := plain[0] + if padding < 4 { + // padding is a byte, so it automatically satisfies + // the maximum size, which is 255. + return nil, fmt.Errorf("ssh: illegal padding %d", padding) + } + + if int(padding+1) >= len(plain) { + return nil, fmt.Errorf("ssh: padding %d too large", padding) + } + plain = plain[1 : length-uint32(padding)] + return plain, nil +} + +// cbcCipher implements aes128-cbc cipher defined in RFC 4253 section 6.1 +type cbcCipher struct { + mac hash.Hash + macSize uint32 + decrypter cipher.BlockMode + encrypter cipher.BlockMode + + // The following members are to avoid per-packet allocations. + seqNumBytes [4]byte + packetData []byte + macResult []byte + + // Amount of data we should still read to hide which + // verification error triggered. + oracleCamouflage uint32 +} + +func newCBCCipher(c cipher.Block, key, iv, macKey []byte, algs directionAlgorithms) (packetCipher, error) { + cbc := &cbcCipher{ + mac: macModes[algs.MAC].new(macKey), + decrypter: cipher.NewCBCDecrypter(c, iv), + encrypter: cipher.NewCBCEncrypter(c, iv), + packetData: make([]byte, 1024), + } + if cbc.mac != nil { + cbc.macSize = uint32(cbc.mac.Size()) + } + + return cbc, nil +} + +func newAESCBCCipher(key, iv, macKey []byte, algs directionAlgorithms) (packetCipher, error) { + c, err := aes.NewCipher(key) + if err != nil { + return nil, err + } + + cbc, err := newCBCCipher(c, key, iv, macKey, algs) + if err != nil { + return nil, err + } + + return cbc, nil +} + +func newTripleDESCBCCipher(key, iv, macKey []byte, algs directionAlgorithms) (packetCipher, error) { + c, err := des.NewTripleDESCipher(key) + if err != nil { + return nil, err + } + + cbc, err := newCBCCipher(c, key, iv, macKey, algs) + if err != nil { + return nil, err + } + + return cbc, nil +} + +func maxUInt32(a, b int) uint32 { + if a > b { + return uint32(a) + } + return uint32(b) +} + +const ( + cbcMinPacketSizeMultiple = 8 + cbcMinPacketSize = 16 + cbcMinPaddingSize = 4 +) + +// cbcError represents a verification error that may leak information. +type cbcError string + +func (e cbcError) Error() string { return string(e) } + +func (c *cbcCipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) { + p, err := c.readPacketLeaky(seqNum, r) + if err != nil { + if _, ok := err.(cbcError); ok { + // Verification error: read a fixed amount of + // data, to make distinguishing between + // failing MAC and failing length check more + // difficult. + io.CopyN(ioutil.Discard, r, int64(c.oracleCamouflage)) + } + } + return p, err +} + +func (c *cbcCipher) readPacketLeaky(seqNum uint32, r io.Reader) ([]byte, error) { + blockSize := c.decrypter.BlockSize() + + // Read the header, which will include some of the subsequent data in the + // case of block ciphers - this is copied back to the payload later. + // How many bytes of payload/padding will be read with this first read. + firstBlockLength := uint32((prefixLen + blockSize - 1) / blockSize * blockSize) + firstBlock := c.packetData[:firstBlockLength] + if _, err := io.ReadFull(r, firstBlock); err != nil { + return nil, err + } + + c.oracleCamouflage = maxPacket + 4 + c.macSize - firstBlockLength + + c.decrypter.CryptBlocks(firstBlock, firstBlock) + length := binary.BigEndian.Uint32(firstBlock[:4]) + if length > maxPacket { + return nil, cbcError("ssh: packet too large") + } + if length+4 < maxUInt32(cbcMinPacketSize, blockSize) { + // The minimum size of a packet is 16 (or the cipher block size, whichever + // is larger) bytes. + return nil, cbcError("ssh: packet too small") + } + // The length of the packet (including the length field but not the MAC) must + // be a multiple of the block size or 8, whichever is larger. + if (length+4)%maxUInt32(cbcMinPacketSizeMultiple, blockSize) != 0 { + return nil, cbcError("ssh: invalid packet length multiple") + } + + paddingLength := uint32(firstBlock[4]) + if paddingLength < cbcMinPaddingSize || length <= paddingLength+1 { + return nil, cbcError("ssh: invalid packet length") + } + + // Positions within the c.packetData buffer: + macStart := 4 + length + paddingStart := macStart - paddingLength + + // Entire packet size, starting before length, ending at end of mac. + entirePacketSize := macStart + c.macSize + + // Ensure c.packetData is large enough for the entire packet data. + if uint32(cap(c.packetData)) < entirePacketSize { + // Still need to upsize and copy, but this should be rare at runtime, only + // on upsizing the packetData buffer. + c.packetData = make([]byte, entirePacketSize) + copy(c.packetData, firstBlock) + } else { + c.packetData = c.packetData[:entirePacketSize] + } + + n, err := io.ReadFull(r, c.packetData[firstBlockLength:]) + if err != nil { + return nil, err + } + c.oracleCamouflage -= uint32(n) + + remainingCrypted := c.packetData[firstBlockLength:macStart] + c.decrypter.CryptBlocks(remainingCrypted, remainingCrypted) + + mac := c.packetData[macStart:] + if c.mac != nil { + c.mac.Reset() + binary.BigEndian.PutUint32(c.seqNumBytes[:], seqNum) + c.mac.Write(c.seqNumBytes[:]) + c.mac.Write(c.packetData[:macStart]) + c.macResult = c.mac.Sum(c.macResult[:0]) + if subtle.ConstantTimeCompare(c.macResult, mac) != 1 { + return nil, cbcError("ssh: MAC failure") + } + } + + return c.packetData[prefixLen:paddingStart], nil +} + +func (c *cbcCipher) writePacket(seqNum uint32, w io.Writer, rand io.Reader, packet []byte) error { + effectiveBlockSize := maxUInt32(cbcMinPacketSizeMultiple, c.encrypter.BlockSize()) + + // Length of encrypted portion of the packet (header, payload, padding). + // Enforce minimum padding and packet size. + encLength := maxUInt32(prefixLen+len(packet)+cbcMinPaddingSize, cbcMinPaddingSize) + // Enforce block size. + encLength = (encLength + effectiveBlockSize - 1) / effectiveBlockSize * effectiveBlockSize + + length := encLength - 4 + paddingLength := int(length) - (1 + len(packet)) + + // Overall buffer contains: header, payload, padding, mac. + // Space for the MAC is reserved in the capacity but not the slice length. + bufferSize := encLength + c.macSize + if uint32(cap(c.packetData)) < bufferSize { + c.packetData = make([]byte, encLength, bufferSize) + } else { + c.packetData = c.packetData[:encLength] + } + + p := c.packetData + + // Packet header. + binary.BigEndian.PutUint32(p, length) + p = p[4:] + p[0] = byte(paddingLength) + + // Payload. + p = p[1:] + copy(p, packet) + + // Padding. + p = p[len(packet):] + if _, err := io.ReadFull(rand, p); err != nil { + return err + } + + if c.mac != nil { + c.mac.Reset() + binary.BigEndian.PutUint32(c.seqNumBytes[:], seqNum) + c.mac.Write(c.seqNumBytes[:]) + c.mac.Write(c.packetData) + // The MAC is now appended into the capacity reserved for it earlier. + c.packetData = c.mac.Sum(c.packetData) + } + + c.encrypter.CryptBlocks(c.packetData[:encLength], c.packetData[:encLength]) + + if _, err := w.Write(c.packetData); err != nil { + return err + } + + return nil +} + +const chacha20Poly1305ID = "chacha20-poly1305@openssh.com" + +// chacha20Poly1305Cipher implements the chacha20-poly1305@openssh.com +// AEAD, which is described here: +// +// https://tools.ietf.org/html/draft-josefsson-ssh-chacha20-poly1305-openssh-00 +// +// the methods here also implement padding, which RFC4253 Section 6 +// also requires of stream ciphers. +type chacha20Poly1305Cipher struct { + lengthKey [8]uint32 + contentKey [8]uint32 + buf []byte +} + +func newChaCha20Cipher(key, unusedIV, unusedMACKey []byte, unusedAlgs directionAlgorithms) (packetCipher, error) { + if len(key) != 64 { + panic(len(key)) + } + + c := &chacha20Poly1305Cipher{ + buf: make([]byte, 256), + } + + for i := range c.contentKey { + c.contentKey[i] = binary.LittleEndian.Uint32(key[i*4 : (i+1)*4]) + } + for i := range c.lengthKey { + c.lengthKey[i] = binary.LittleEndian.Uint32(key[(i+8)*4 : (i+9)*4]) + } + return c, nil +} + +func (c *chacha20Poly1305Cipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) { + nonce := [3]uint32{0, 0, bits.ReverseBytes32(seqNum)} + s := chacha20.New(c.contentKey, nonce) + var polyKey [32]byte + s.XORKeyStream(polyKey[:], polyKey[:]) + s.Advance() // skip next 32 bytes + + encryptedLength := c.buf[:4] + if _, err := io.ReadFull(r, encryptedLength); err != nil { + return nil, err + } + + var lenBytes [4]byte + chacha20.New(c.lengthKey, nonce).XORKeyStream(lenBytes[:], encryptedLength) + + length := binary.BigEndian.Uint32(lenBytes[:]) + if length > maxPacket { + return nil, errors.New("ssh: invalid packet length, packet too large") + } + + contentEnd := 4 + length + packetEnd := contentEnd + poly1305.TagSize + if uint32(cap(c.buf)) < packetEnd { + c.buf = make([]byte, packetEnd) + copy(c.buf[:], encryptedLength) + } else { + c.buf = c.buf[:packetEnd] + } + + if _, err := io.ReadFull(r, c.buf[4:packetEnd]); err != nil { + return nil, err + } + + var mac [poly1305.TagSize]byte + copy(mac[:], c.buf[contentEnd:packetEnd]) + if !poly1305.Verify(&mac, c.buf[:contentEnd], &polyKey) { + return nil, errors.New("ssh: MAC failure") + } + + plain := c.buf[4:contentEnd] + s.XORKeyStream(plain, plain) + + padding := plain[0] + if padding < 4 { + // padding is a byte, so it automatically satisfies + // the maximum size, which is 255. + return nil, fmt.Errorf("ssh: illegal padding %d", padding) + } + + if int(padding)+1 >= len(plain) { + return nil, fmt.Errorf("ssh: padding %d too large", padding) + } + + plain = plain[1 : len(plain)-int(padding)] + + return plain, nil +} + +func (c *chacha20Poly1305Cipher) writePacket(seqNum uint32, w io.Writer, rand io.Reader, payload []byte) error { + nonce := [3]uint32{0, 0, bits.ReverseBytes32(seqNum)} + s := chacha20.New(c.contentKey, nonce) + var polyKey [32]byte + s.XORKeyStream(polyKey[:], polyKey[:]) + s.Advance() // skip next 32 bytes + + // There is no blocksize, so fall back to multiple of 8 byte + // padding, as described in RFC 4253, Sec 6. + const packetSizeMultiple = 8 + + padding := packetSizeMultiple - (1+len(payload))%packetSizeMultiple + if padding < 4 { + padding += packetSizeMultiple + } + + // size (4 bytes), padding (1), payload, padding, tag. + totalLength := 4 + 1 + len(payload) + padding + poly1305.TagSize + if cap(c.buf) < totalLength { + c.buf = make([]byte, totalLength) + } else { + c.buf = c.buf[:totalLength] + } + + binary.BigEndian.PutUint32(c.buf, uint32(1+len(payload)+padding)) + chacha20.New(c.lengthKey, nonce).XORKeyStream(c.buf, c.buf[:4]) + c.buf[4] = byte(padding) + copy(c.buf[5:], payload) + packetEnd := 5 + len(payload) + padding + if _, err := io.ReadFull(rand, c.buf[5+len(payload):packetEnd]); err != nil { + return err + } + + s.XORKeyStream(c.buf[4:], c.buf[4:packetEnd]) + + var mac [poly1305.TagSize]byte + poly1305.Sum(&mac, c.buf[:packetEnd], &polyKey) + + copy(c.buf[packetEnd:], mac[:]) + + if _, err := w.Write(c.buf); err != nil { + return err + } + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/client.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/client.go new file mode 100644 index 0000000000000000000000000000000000000000..ae6ca775eed63f44582010b355e062a02e3afc7d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/client.go @@ -0,0 +1,278 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "bytes" + "errors" + "fmt" + "net" + "os" + "sync" + "time" +) + +// Client implements a traditional SSH client that supports shells, +// subprocesses, TCP port/streamlocal forwarding and tunneled dialing. +type Client struct { + Conn + + handleForwardsOnce sync.Once // guards calling (*Client).handleForwards + + forwards forwardList // forwarded tcpip connections from the remote side + mu sync.Mutex + channelHandlers map[string]chan NewChannel +} + +// HandleChannelOpen returns a channel on which NewChannel requests +// for the given type are sent. If the type already is being handled, +// nil is returned. The channel is closed when the connection is closed. +func (c *Client) HandleChannelOpen(channelType string) <-chan NewChannel { + c.mu.Lock() + defer c.mu.Unlock() + if c.channelHandlers == nil { + // The SSH channel has been closed. + c := make(chan NewChannel) + close(c) + return c + } + + ch := c.channelHandlers[channelType] + if ch != nil { + return nil + } + + ch = make(chan NewChannel, chanSize) + c.channelHandlers[channelType] = ch + return ch +} + +// NewClient creates a Client on top of the given connection. +func NewClient(c Conn, chans <-chan NewChannel, reqs <-chan *Request) *Client { + conn := &Client{ + Conn: c, + channelHandlers: make(map[string]chan NewChannel, 1), + } + + go conn.handleGlobalRequests(reqs) + go conn.handleChannelOpens(chans) + go func() { + conn.Wait() + conn.forwards.closeAll() + }() + return conn +} + +// NewClientConn establishes an authenticated SSH connection using c +// as the underlying transport. The Request and NewChannel channels +// must be serviced or the connection will hang. +func NewClientConn(c net.Conn, addr string, config *ClientConfig) (Conn, <-chan NewChannel, <-chan *Request, error) { + fullConf := *config + fullConf.SetDefaults() + if fullConf.HostKeyCallback == nil { + c.Close() + return nil, nil, nil, errors.New("ssh: must specify HostKeyCallback") + } + + conn := &connection{ + sshConn: sshConn{conn: c}, + } + + if err := conn.clientHandshake(addr, &fullConf); err != nil { + c.Close() + return nil, nil, nil, fmt.Errorf("ssh: handshake failed: %v", err) + } + conn.mux = newMux(conn.transport) + return conn, conn.mux.incomingChannels, conn.mux.incomingRequests, nil +} + +// clientHandshake performs the client side key exchange. See RFC 4253 Section +// 7. +func (c *connection) clientHandshake(dialAddress string, config *ClientConfig) error { + if config.ClientVersion != "" { + c.clientVersion = []byte(config.ClientVersion) + } else { + c.clientVersion = []byte(packageVersion) + } + var err error + c.serverVersion, err = exchangeVersions(c.sshConn.conn, c.clientVersion) + if err != nil { + return err + } + + c.transport = newClientTransport( + newTransport(c.sshConn.conn, config.Rand, true /* is client */), + c.clientVersion, c.serverVersion, config, dialAddress, c.sshConn.RemoteAddr()) + if err := c.transport.waitSession(); err != nil { + return err + } + + c.sessionID = c.transport.getSessionID() + return c.clientAuthenticate(config) +} + +// verifyHostKeySignature verifies the host key obtained in the key +// exchange. +func verifyHostKeySignature(hostKey PublicKey, result *kexResult) error { + sig, rest, ok := parseSignatureBody(result.Signature) + if len(rest) > 0 || !ok { + return errors.New("ssh: signature parse error") + } + + return hostKey.Verify(result.H, sig) +} + +// NewSession opens a new Session for this client. (A session is a remote +// execution of a program.) +func (c *Client) NewSession() (*Session, error) { + ch, in, err := c.OpenChannel("session", nil) + if err != nil { + return nil, err + } + return newSession(ch, in) +} + +func (c *Client) handleGlobalRequests(incoming <-chan *Request) { + for r := range incoming { + // This handles keepalive messages and matches + // the behaviour of OpenSSH. + r.Reply(false, nil) + } +} + +// handleChannelOpens channel open messages from the remote side. +func (c *Client) handleChannelOpens(in <-chan NewChannel) { + for ch := range in { + c.mu.Lock() + handler := c.channelHandlers[ch.ChannelType()] + c.mu.Unlock() + + if handler != nil { + handler <- ch + } else { + ch.Reject(UnknownChannelType, fmt.Sprintf("unknown channel type: %v", ch.ChannelType())) + } + } + + c.mu.Lock() + for _, ch := range c.channelHandlers { + close(ch) + } + c.channelHandlers = nil + c.mu.Unlock() +} + +// Dial starts a client connection to the given SSH server. It is a +// convenience function that connects to the given network address, +// initiates the SSH handshake, and then sets up a Client. For access +// to incoming channels and requests, use net.Dial with NewClientConn +// instead. +func Dial(network, addr string, config *ClientConfig) (*Client, error) { + conn, err := net.DialTimeout(network, addr, config.Timeout) + if err != nil { + return nil, err + } + c, chans, reqs, err := NewClientConn(conn, addr, config) + if err != nil { + return nil, err + } + return NewClient(c, chans, reqs), nil +} + +// HostKeyCallback is the function type used for verifying server +// keys. A HostKeyCallback must return nil if the host key is OK, or +// an error to reject it. It receives the hostname as passed to Dial +// or NewClientConn. The remote address is the RemoteAddr of the +// net.Conn underlying the the SSH connection. +type HostKeyCallback func(hostname string, remote net.Addr, key PublicKey) error + +// BannerCallback is the function type used for treat the banner sent by +// the server. A BannerCallback receives the message sent by the remote server. +type BannerCallback func(message string) error + +// A ClientConfig structure is used to configure a Client. It must not be +// modified after having been passed to an SSH function. +type ClientConfig struct { + // Config contains configuration that is shared between clients and + // servers. + Config + + // User contains the username to authenticate as. + User string + + // Auth contains possible authentication methods to use with the + // server. Only the first instance of a particular RFC 4252 method will + // be used during authentication. + Auth []AuthMethod + + // HostKeyCallback is called during the cryptographic + // handshake to validate the server's host key. The client + // configuration must supply this callback for the connection + // to succeed. The functions InsecureIgnoreHostKey or + // FixedHostKey can be used for simplistic host key checks. + HostKeyCallback HostKeyCallback + + // BannerCallback is called during the SSH dance to display a custom + // server's message. The client configuration can supply this callback to + // handle it as wished. The function BannerDisplayStderr can be used for + // simplistic display on Stderr. + BannerCallback BannerCallback + + // ClientVersion contains the version identification string that will + // be used for the connection. If empty, a reasonable default is used. + ClientVersion string + + // HostKeyAlgorithms lists the key types that the client will + // accept from the server as host key, in order of + // preference. If empty, a reasonable default is used. Any + // string returned from PublicKey.Type method may be used, or + // any of the CertAlgoXxxx and KeyAlgoXxxx constants. + HostKeyAlgorithms []string + + // Timeout is the maximum amount of time for the TCP connection to establish. + // + // A Timeout of zero means no timeout. + Timeout time.Duration +} + +// InsecureIgnoreHostKey returns a function that can be used for +// ClientConfig.HostKeyCallback to accept any host key. It should +// not be used for production code. +func InsecureIgnoreHostKey() HostKeyCallback { + return func(hostname string, remote net.Addr, key PublicKey) error { + return nil + } +} + +type fixedHostKey struct { + key PublicKey +} + +func (f *fixedHostKey) check(hostname string, remote net.Addr, key PublicKey) error { + if f.key == nil { + return fmt.Errorf("ssh: required host key was nil") + } + if !bytes.Equal(key.Marshal(), f.key.Marshal()) { + return fmt.Errorf("ssh: host key mismatch") + } + return nil +} + +// FixedHostKey returns a function for use in +// ClientConfig.HostKeyCallback to accept only a specific host key. +func FixedHostKey(key PublicKey) HostKeyCallback { + hk := &fixedHostKey{key} + return hk.check +} + +// BannerDisplayStderr returns a function that can be used for +// ClientConfig.BannerCallback to display banners on os.Stderr. +func BannerDisplayStderr() BannerCallback { + return func(banner string) error { + _, err := os.Stderr.WriteString(banner) + + return err + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/client_auth.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/client_auth.go new file mode 100644 index 0000000000000000000000000000000000000000..5f44b77403e849b4dbb3b04c1266e95ff2a3bb8f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/client_auth.go @@ -0,0 +1,525 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "bytes" + "errors" + "fmt" + "io" +) + +type authResult int + +const ( + authFailure authResult = iota + authPartialSuccess + authSuccess +) + +// clientAuthenticate authenticates with the remote server. See RFC 4252. +func (c *connection) clientAuthenticate(config *ClientConfig) error { + // initiate user auth session + if err := c.transport.writePacket(Marshal(&serviceRequestMsg{serviceUserAuth})); err != nil { + return err + } + packet, err := c.transport.readPacket() + if err != nil { + return err + } + var serviceAccept serviceAcceptMsg + if err := Unmarshal(packet, &serviceAccept); err != nil { + return err + } + + // during the authentication phase the client first attempts the "none" method + // then any untried methods suggested by the server. + tried := make(map[string]bool) + var lastMethods []string + + sessionID := c.transport.getSessionID() + for auth := AuthMethod(new(noneAuth)); auth != nil; { + ok, methods, err := auth.auth(sessionID, config.User, c.transport, config.Rand) + if err != nil { + return err + } + if ok == authSuccess { + // success + return nil + } else if ok == authFailure { + tried[auth.method()] = true + } + if methods == nil { + methods = lastMethods + } + lastMethods = methods + + auth = nil + + findNext: + for _, a := range config.Auth { + candidateMethod := a.method() + if tried[candidateMethod] { + continue + } + for _, meth := range methods { + if meth == candidateMethod { + auth = a + break findNext + } + } + } + } + return fmt.Errorf("ssh: unable to authenticate, attempted methods %v, no supported methods remain", keys(tried)) +} + +func keys(m map[string]bool) []string { + s := make([]string, 0, len(m)) + + for key := range m { + s = append(s, key) + } + return s +} + +// An AuthMethod represents an instance of an RFC 4252 authentication method. +type AuthMethod interface { + // auth authenticates user over transport t. + // Returns true if authentication is successful. + // If authentication is not successful, a []string of alternative + // method names is returned. If the slice is nil, it will be ignored + // and the previous set of possible methods will be reused. + auth(session []byte, user string, p packetConn, rand io.Reader) (authResult, []string, error) + + // method returns the RFC 4252 method name. + method() string +} + +// "none" authentication, RFC 4252 section 5.2. +type noneAuth int + +func (n *noneAuth) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { + if err := c.writePacket(Marshal(&userAuthRequestMsg{ + User: user, + Service: serviceSSH, + Method: "none", + })); err != nil { + return authFailure, nil, err + } + + return handleAuthResponse(c) +} + +func (n *noneAuth) method() string { + return "none" +} + +// passwordCallback is an AuthMethod that fetches the password through +// a function call, e.g. by prompting the user. +type passwordCallback func() (password string, err error) + +func (cb passwordCallback) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { + type passwordAuthMsg struct { + User string `sshtype:"50"` + Service string + Method string + Reply bool + Password string + } + + pw, err := cb() + // REVIEW NOTE: is there a need to support skipping a password attempt? + // The program may only find out that the user doesn't have a password + // when prompting. + if err != nil { + return authFailure, nil, err + } + + if err := c.writePacket(Marshal(&passwordAuthMsg{ + User: user, + Service: serviceSSH, + Method: cb.method(), + Reply: false, + Password: pw, + })); err != nil { + return authFailure, nil, err + } + + return handleAuthResponse(c) +} + +func (cb passwordCallback) method() string { + return "password" +} + +// Password returns an AuthMethod using the given password. +func Password(secret string) AuthMethod { + return passwordCallback(func() (string, error) { return secret, nil }) +} + +// PasswordCallback returns an AuthMethod that uses a callback for +// fetching a password. +func PasswordCallback(prompt func() (secret string, err error)) AuthMethod { + return passwordCallback(prompt) +} + +type publickeyAuthMsg struct { + User string `sshtype:"50"` + Service string + Method string + // HasSig indicates to the receiver packet that the auth request is signed and + // should be used for authentication of the request. + HasSig bool + Algoname string + PubKey []byte + // Sig is tagged with "rest" so Marshal will exclude it during + // validateKey + Sig []byte `ssh:"rest"` +} + +// publicKeyCallback is an AuthMethod that uses a set of key +// pairs for authentication. +type publicKeyCallback func() ([]Signer, error) + +func (cb publicKeyCallback) method() string { + return "publickey" +} + +func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { + // Authentication is performed by sending an enquiry to test if a key is + // acceptable to the remote. If the key is acceptable, the client will + // attempt to authenticate with the valid key. If not the client will repeat + // the process with the remaining keys. + + signers, err := cb() + if err != nil { + return authFailure, nil, err + } + var methods []string + for _, signer := range signers { + ok, err := validateKey(signer.PublicKey(), user, c) + if err != nil { + return authFailure, nil, err + } + if !ok { + continue + } + + pub := signer.PublicKey() + pubKey := pub.Marshal() + sign, err := signer.Sign(rand, buildDataSignedForAuth(session, userAuthRequestMsg{ + User: user, + Service: serviceSSH, + Method: cb.method(), + }, []byte(pub.Type()), pubKey)) + if err != nil { + return authFailure, nil, err + } + + // manually wrap the serialized signature in a string + s := Marshal(sign) + sig := make([]byte, stringLength(len(s))) + marshalString(sig, s) + msg := publickeyAuthMsg{ + User: user, + Service: serviceSSH, + Method: cb.method(), + HasSig: true, + Algoname: pub.Type(), + PubKey: pubKey, + Sig: sig, + } + p := Marshal(&msg) + if err := c.writePacket(p); err != nil { + return authFailure, nil, err + } + var success authResult + success, methods, err = handleAuthResponse(c) + if err != nil { + return authFailure, nil, err + } + + // If authentication succeeds or the list of available methods does not + // contain the "publickey" method, do not attempt to authenticate with any + // other keys. According to RFC 4252 Section 7, the latter can occur when + // additional authentication methods are required. + if success == authSuccess || !containsMethod(methods, cb.method()) { + return success, methods, err + } + } + + return authFailure, methods, nil +} + +func containsMethod(methods []string, method string) bool { + for _, m := range methods { + if m == method { + return true + } + } + + return false +} + +// validateKey validates the key provided is acceptable to the server. +func validateKey(key PublicKey, user string, c packetConn) (bool, error) { + pubKey := key.Marshal() + msg := publickeyAuthMsg{ + User: user, + Service: serviceSSH, + Method: "publickey", + HasSig: false, + Algoname: key.Type(), + PubKey: pubKey, + } + if err := c.writePacket(Marshal(&msg)); err != nil { + return false, err + } + + return confirmKeyAck(key, c) +} + +func confirmKeyAck(key PublicKey, c packetConn) (bool, error) { + pubKey := key.Marshal() + algoname := key.Type() + + for { + packet, err := c.readPacket() + if err != nil { + return false, err + } + switch packet[0] { + case msgUserAuthBanner: + if err := handleBannerResponse(c, packet); err != nil { + return false, err + } + case msgUserAuthPubKeyOk: + var msg userAuthPubKeyOkMsg + if err := Unmarshal(packet, &msg); err != nil { + return false, err + } + if msg.Algo != algoname || !bytes.Equal(msg.PubKey, pubKey) { + return false, nil + } + return true, nil + case msgUserAuthFailure: + return false, nil + default: + return false, unexpectedMessageError(msgUserAuthSuccess, packet[0]) + } + } +} + +// PublicKeys returns an AuthMethod that uses the given key +// pairs. +func PublicKeys(signers ...Signer) AuthMethod { + return publicKeyCallback(func() ([]Signer, error) { return signers, nil }) +} + +// PublicKeysCallback returns an AuthMethod that runs the given +// function to obtain a list of key pairs. +func PublicKeysCallback(getSigners func() (signers []Signer, err error)) AuthMethod { + return publicKeyCallback(getSigners) +} + +// handleAuthResponse returns whether the preceding authentication request succeeded +// along with a list of remaining authentication methods to try next and +// an error if an unexpected response was received. +func handleAuthResponse(c packetConn) (authResult, []string, error) { + for { + packet, err := c.readPacket() + if err != nil { + return authFailure, nil, err + } + + switch packet[0] { + case msgUserAuthBanner: + if err := handleBannerResponse(c, packet); err != nil { + return authFailure, nil, err + } + case msgUserAuthFailure: + var msg userAuthFailureMsg + if err := Unmarshal(packet, &msg); err != nil { + return authFailure, nil, err + } + if msg.PartialSuccess { + return authPartialSuccess, msg.Methods, nil + } + return authFailure, msg.Methods, nil + case msgUserAuthSuccess: + return authSuccess, nil, nil + default: + return authFailure, nil, unexpectedMessageError(msgUserAuthSuccess, packet[0]) + } + } +} + +func handleBannerResponse(c packetConn, packet []byte) error { + var msg userAuthBannerMsg + if err := Unmarshal(packet, &msg); err != nil { + return err + } + + transport, ok := c.(*handshakeTransport) + if !ok { + return nil + } + + if transport.bannerCallback != nil { + return transport.bannerCallback(msg.Message) + } + + return nil +} + +// KeyboardInteractiveChallenge should print questions, optionally +// disabling echoing (e.g. for passwords), and return all the answers. +// Challenge may be called multiple times in a single session. After +// successful authentication, the server may send a challenge with no +// questions, for which the user and instruction messages should be +// printed. RFC 4256 section 3.3 details how the UI should behave for +// both CLI and GUI environments. +type KeyboardInteractiveChallenge func(user, instruction string, questions []string, echos []bool) (answers []string, err error) + +// KeyboardInteractive returns an AuthMethod using a prompt/response +// sequence controlled by the server. +func KeyboardInteractive(challenge KeyboardInteractiveChallenge) AuthMethod { + return challenge +} + +func (cb KeyboardInteractiveChallenge) method() string { + return "keyboard-interactive" +} + +func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { + type initiateMsg struct { + User string `sshtype:"50"` + Service string + Method string + Language string + Submethods string + } + + if err := c.writePacket(Marshal(&initiateMsg{ + User: user, + Service: serviceSSH, + Method: "keyboard-interactive", + })); err != nil { + return authFailure, nil, err + } + + for { + packet, err := c.readPacket() + if err != nil { + return authFailure, nil, err + } + + // like handleAuthResponse, but with less options. + switch packet[0] { + case msgUserAuthBanner: + if err := handleBannerResponse(c, packet); err != nil { + return authFailure, nil, err + } + continue + case msgUserAuthInfoRequest: + // OK + case msgUserAuthFailure: + var msg userAuthFailureMsg + if err := Unmarshal(packet, &msg); err != nil { + return authFailure, nil, err + } + if msg.PartialSuccess { + return authPartialSuccess, msg.Methods, nil + } + return authFailure, msg.Methods, nil + case msgUserAuthSuccess: + return authSuccess, nil, nil + default: + return authFailure, nil, unexpectedMessageError(msgUserAuthInfoRequest, packet[0]) + } + + var msg userAuthInfoRequestMsg + if err := Unmarshal(packet, &msg); err != nil { + return authFailure, nil, err + } + + // Manually unpack the prompt/echo pairs. + rest := msg.Prompts + var prompts []string + var echos []bool + for i := 0; i < int(msg.NumPrompts); i++ { + prompt, r, ok := parseString(rest) + if !ok || len(r) == 0 { + return authFailure, nil, errors.New("ssh: prompt format error") + } + prompts = append(prompts, string(prompt)) + echos = append(echos, r[0] != 0) + rest = r[1:] + } + + if len(rest) != 0 { + return authFailure, nil, errors.New("ssh: extra data following keyboard-interactive pairs") + } + + answers, err := cb(msg.User, msg.Instruction, prompts, echos) + if err != nil { + return authFailure, nil, err + } + + if len(answers) != len(prompts) { + return authFailure, nil, errors.New("ssh: not enough answers from keyboard-interactive callback") + } + responseLength := 1 + 4 + for _, a := range answers { + responseLength += stringLength(len(a)) + } + serialized := make([]byte, responseLength) + p := serialized + p[0] = msgUserAuthInfoResponse + p = p[1:] + p = marshalUint32(p, uint32(len(answers))) + for _, a := range answers { + p = marshalString(p, []byte(a)) + } + + if err := c.writePacket(serialized); err != nil { + return authFailure, nil, err + } + } +} + +type retryableAuthMethod struct { + authMethod AuthMethod + maxTries int +} + +func (r *retryableAuthMethod) auth(session []byte, user string, c packetConn, rand io.Reader) (ok authResult, methods []string, err error) { + for i := 0; r.maxTries <= 0 || i < r.maxTries; i++ { + ok, methods, err = r.authMethod.auth(session, user, c, rand) + if ok != authFailure || err != nil { // either success, partial success or error terminate + return ok, methods, err + } + } + return ok, methods, err +} + +func (r *retryableAuthMethod) method() string { + return r.authMethod.method() +} + +// RetryableAuthMethod is a decorator for other auth methods enabling them to +// be retried up to maxTries before considering that AuthMethod itself failed. +// If maxTries is <= 0, will retry indefinitely +// +// This is useful for interactive clients using challenge/response type +// authentication (e.g. Keyboard-Interactive, Password, etc) where the user +// could mistype their response resulting in the server issuing a +// SSH_MSG_USERAUTH_FAILURE (rfc4252 #8 [password] and rfc4256 #3.4 +// [keyboard-interactive]); Without this decorator, the non-retryable +// AuthMethod would be removed from future consideration, and never tried again +// (and so the user would never be able to retry their entry). +func RetryableAuthMethod(auth AuthMethod, maxTries int) AuthMethod { + return &retryableAuthMethod{authMethod: auth, maxTries: maxTries} +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/common.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/common.go new file mode 100644 index 0000000000000000000000000000000000000000..04f3620b3d5ebe9252b0c8cabe2c4a54181d1548 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/common.go @@ -0,0 +1,383 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "crypto" + "crypto/rand" + "fmt" + "io" + "math" + "sync" + + _ "crypto/sha1" + _ "crypto/sha256" + _ "crypto/sha512" +) + +// These are string constants in the SSH protocol. +const ( + compressionNone = "none" + serviceUserAuth = "ssh-userauth" + serviceSSH = "ssh-connection" +) + +// supportedCiphers lists ciphers we support but might not recommend. +var supportedCiphers = []string{ + "aes128-ctr", "aes192-ctr", "aes256-ctr", + "aes128-gcm@openssh.com", + chacha20Poly1305ID, + "arcfour256", "arcfour128", "arcfour", + aes128cbcID, + tripledescbcID, +} + +// preferredCiphers specifies the default preference for ciphers. +var preferredCiphers = []string{ + "aes128-gcm@openssh.com", + chacha20Poly1305ID, + "aes128-ctr", "aes192-ctr", "aes256-ctr", +} + +// supportedKexAlgos specifies the supported key-exchange algorithms in +// preference order. +var supportedKexAlgos = []string{ + kexAlgoCurve25519SHA256, + // P384 and P521 are not constant-time yet, but since we don't + // reuse ephemeral keys, using them for ECDH should be OK. + kexAlgoECDH256, kexAlgoECDH384, kexAlgoECDH521, + kexAlgoDH14SHA1, kexAlgoDH1SHA1, +} + +// supportedHostKeyAlgos specifies the supported host-key algorithms (i.e. methods +// of authenticating servers) in preference order. +var supportedHostKeyAlgos = []string{ + CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, + CertAlgoECDSA384v01, CertAlgoECDSA521v01, CertAlgoED25519v01, + + KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521, + KeyAlgoRSA, KeyAlgoDSA, + + KeyAlgoED25519, +} + +// supportedMACs specifies a default set of MAC algorithms in preference order. +// This is based on RFC 4253, section 6.4, but with hmac-md5 variants removed +// because they have reached the end of their useful life. +var supportedMACs = []string{ + "hmac-sha2-256-etm@openssh.com", "hmac-sha2-256", "hmac-sha1", "hmac-sha1-96", +} + +var supportedCompressions = []string{compressionNone} + +// hashFuncs keeps the mapping of supported algorithms to their respective +// hashes needed for signature verification. +var hashFuncs = map[string]crypto.Hash{ + KeyAlgoRSA: crypto.SHA1, + KeyAlgoDSA: crypto.SHA1, + KeyAlgoECDSA256: crypto.SHA256, + KeyAlgoECDSA384: crypto.SHA384, + KeyAlgoECDSA521: crypto.SHA512, + CertAlgoRSAv01: crypto.SHA1, + CertAlgoDSAv01: crypto.SHA1, + CertAlgoECDSA256v01: crypto.SHA256, + CertAlgoECDSA384v01: crypto.SHA384, + CertAlgoECDSA521v01: crypto.SHA512, +} + +// unexpectedMessageError results when the SSH message that we received didn't +// match what we wanted. +func unexpectedMessageError(expected, got uint8) error { + return fmt.Errorf("ssh: unexpected message type %d (expected %d)", got, expected) +} + +// parseError results from a malformed SSH message. +func parseError(tag uint8) error { + return fmt.Errorf("ssh: parse error in message type %d", tag) +} + +func findCommon(what string, client []string, server []string) (common string, err error) { + for _, c := range client { + for _, s := range server { + if c == s { + return c, nil + } + } + } + return "", fmt.Errorf("ssh: no common algorithm for %s; client offered: %v, server offered: %v", what, client, server) +} + +type directionAlgorithms struct { + Cipher string + MAC string + Compression string +} + +// rekeyBytes returns a rekeying intervals in bytes. +func (a *directionAlgorithms) rekeyBytes() int64 { + // According to RFC4344 block ciphers should rekey after + // 2^(BLOCKSIZE/4) blocks. For all AES flavors BLOCKSIZE is + // 128. + switch a.Cipher { + case "aes128-ctr", "aes192-ctr", "aes256-ctr", gcmCipherID, aes128cbcID: + return 16 * (1 << 32) + + } + + // For others, stick with RFC4253 recommendation to rekey after 1 Gb of data. + return 1 << 30 +} + +type algorithms struct { + kex string + hostKey string + w directionAlgorithms + r directionAlgorithms +} + +func findAgreedAlgorithms(clientKexInit, serverKexInit *kexInitMsg) (algs *algorithms, err error) { + result := &algorithms{} + + result.kex, err = findCommon("key exchange", clientKexInit.KexAlgos, serverKexInit.KexAlgos) + if err != nil { + return + } + + result.hostKey, err = findCommon("host key", clientKexInit.ServerHostKeyAlgos, serverKexInit.ServerHostKeyAlgos) + if err != nil { + return + } + + result.w.Cipher, err = findCommon("client to server cipher", clientKexInit.CiphersClientServer, serverKexInit.CiphersClientServer) + if err != nil { + return + } + + result.r.Cipher, err = findCommon("server to client cipher", clientKexInit.CiphersServerClient, serverKexInit.CiphersServerClient) + if err != nil { + return + } + + result.w.MAC, err = findCommon("client to server MAC", clientKexInit.MACsClientServer, serverKexInit.MACsClientServer) + if err != nil { + return + } + + result.r.MAC, err = findCommon("server to client MAC", clientKexInit.MACsServerClient, serverKexInit.MACsServerClient) + if err != nil { + return + } + + result.w.Compression, err = findCommon("client to server compression", clientKexInit.CompressionClientServer, serverKexInit.CompressionClientServer) + if err != nil { + return + } + + result.r.Compression, err = findCommon("server to client compression", clientKexInit.CompressionServerClient, serverKexInit.CompressionServerClient) + if err != nil { + return + } + + return result, nil +} + +// If rekeythreshold is too small, we can't make any progress sending +// stuff. +const minRekeyThreshold uint64 = 256 + +// Config contains configuration data common to both ServerConfig and +// ClientConfig. +type Config struct { + // Rand provides the source of entropy for cryptographic + // primitives. If Rand is nil, the cryptographic random reader + // in package crypto/rand will be used. + Rand io.Reader + + // The maximum number of bytes sent or received after which a + // new key is negotiated. It must be at least 256. If + // unspecified, a size suitable for the chosen cipher is used. + RekeyThreshold uint64 + + // The allowed key exchanges algorithms. If unspecified then a + // default set of algorithms is used. + KeyExchanges []string + + // The allowed cipher algorithms. If unspecified then a sensible + // default is used. + Ciphers []string + + // The allowed MAC algorithms. If unspecified then a sensible default + // is used. + MACs []string +} + +// SetDefaults sets sensible values for unset fields in config. This is +// exported for testing: Configs passed to SSH functions are copied and have +// default values set automatically. +func (c *Config) SetDefaults() { + if c.Rand == nil { + c.Rand = rand.Reader + } + if c.Ciphers == nil { + c.Ciphers = preferredCiphers + } + var ciphers []string + for _, c := range c.Ciphers { + if cipherModes[c] != nil { + // reject the cipher if we have no cipherModes definition + ciphers = append(ciphers, c) + } + } + c.Ciphers = ciphers + + if c.KeyExchanges == nil { + c.KeyExchanges = supportedKexAlgos + } + + if c.MACs == nil { + c.MACs = supportedMACs + } + + if c.RekeyThreshold == 0 { + // cipher specific default + } else if c.RekeyThreshold < minRekeyThreshold { + c.RekeyThreshold = minRekeyThreshold + } else if c.RekeyThreshold >= math.MaxInt64 { + // Avoid weirdness if somebody uses -1 as a threshold. + c.RekeyThreshold = math.MaxInt64 + } +} + +// buildDataSignedForAuth returns the data that is signed in order to prove +// possession of a private key. See RFC 4252, section 7. +func buildDataSignedForAuth(sessionID []byte, req userAuthRequestMsg, algo, pubKey []byte) []byte { + data := struct { + Session []byte + Type byte + User string + Service string + Method string + Sign bool + Algo []byte + PubKey []byte + }{ + sessionID, + msgUserAuthRequest, + req.User, + req.Service, + req.Method, + true, + algo, + pubKey, + } + return Marshal(data) +} + +func appendU16(buf []byte, n uint16) []byte { + return append(buf, byte(n>>8), byte(n)) +} + +func appendU32(buf []byte, n uint32) []byte { + return append(buf, byte(n>>24), byte(n>>16), byte(n>>8), byte(n)) +} + +func appendU64(buf []byte, n uint64) []byte { + return append(buf, + byte(n>>56), byte(n>>48), byte(n>>40), byte(n>>32), + byte(n>>24), byte(n>>16), byte(n>>8), byte(n)) +} + +func appendInt(buf []byte, n int) []byte { + return appendU32(buf, uint32(n)) +} + +func appendString(buf []byte, s string) []byte { + buf = appendU32(buf, uint32(len(s))) + buf = append(buf, s...) + return buf +} + +func appendBool(buf []byte, b bool) []byte { + if b { + return append(buf, 1) + } + return append(buf, 0) +} + +// newCond is a helper to hide the fact that there is no usable zero +// value for sync.Cond. +func newCond() *sync.Cond { return sync.NewCond(new(sync.Mutex)) } + +// window represents the buffer available to clients +// wishing to write to a channel. +type window struct { + *sync.Cond + win uint32 // RFC 4254 5.2 says the window size can grow to 2^32-1 + writeWaiters int + closed bool +} + +// add adds win to the amount of window available +// for consumers. +func (w *window) add(win uint32) bool { + // a zero sized window adjust is a noop. + if win == 0 { + return true + } + w.L.Lock() + if w.win+win < win { + w.L.Unlock() + return false + } + w.win += win + // It is unusual that multiple goroutines would be attempting to reserve + // window space, but not guaranteed. Use broadcast to notify all waiters + // that additional window is available. + w.Broadcast() + w.L.Unlock() + return true +} + +// close sets the window to closed, so all reservations fail +// immediately. +func (w *window) close() { + w.L.Lock() + w.closed = true + w.Broadcast() + w.L.Unlock() +} + +// reserve reserves win from the available window capacity. +// If no capacity remains, reserve will block. reserve may +// return less than requested. +func (w *window) reserve(win uint32) (uint32, error) { + var err error + w.L.Lock() + w.writeWaiters++ + w.Broadcast() + for w.win == 0 && !w.closed { + w.Wait() + } + w.writeWaiters-- + if w.win < win { + win = w.win + } + w.win -= win + if w.closed { + err = io.EOF + } + w.L.Unlock() + return win, err +} + +// waitWriterBlocked waits until some goroutine is blocked for further +// writes. It is used in tests only. +func (w *window) waitWriterBlocked() { + w.Cond.L.Lock() + for w.writeWaiters == 0 { + w.Cond.Wait() + } + w.Cond.L.Unlock() +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/connection.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/connection.go new file mode 100644 index 0000000000000000000000000000000000000000..fd6b0681b5121fd0a8b92c7be7edc7fd5f5998b4 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/connection.go @@ -0,0 +1,143 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "fmt" + "net" +) + +// OpenChannelError is returned if the other side rejects an +// OpenChannel request. +type OpenChannelError struct { + Reason RejectionReason + Message string +} + +func (e *OpenChannelError) Error() string { + return fmt.Sprintf("ssh: rejected: %s (%s)", e.Reason, e.Message) +} + +// ConnMetadata holds metadata for the connection. +type ConnMetadata interface { + // User returns the user ID for this connection. + User() string + + // SessionID returns the session hash, also denoted by H. + SessionID() []byte + + // ClientVersion returns the client's version string as hashed + // into the session ID. + ClientVersion() []byte + + // ServerVersion returns the server's version string as hashed + // into the session ID. + ServerVersion() []byte + + // RemoteAddr returns the remote address for this connection. + RemoteAddr() net.Addr + + // LocalAddr returns the local address for this connection. + LocalAddr() net.Addr +} + +// Conn represents an SSH connection for both server and client roles. +// Conn is the basis for implementing an application layer, such +// as ClientConn, which implements the traditional shell access for +// clients. +type Conn interface { + ConnMetadata + + // SendRequest sends a global request, and returns the + // reply. If wantReply is true, it returns the response status + // and payload. See also RFC4254, section 4. + SendRequest(name string, wantReply bool, payload []byte) (bool, []byte, error) + + // OpenChannel tries to open an channel. If the request is + // rejected, it returns *OpenChannelError. On success it returns + // the SSH Channel and a Go channel for incoming, out-of-band + // requests. The Go channel must be serviced, or the + // connection will hang. + OpenChannel(name string, data []byte) (Channel, <-chan *Request, error) + + // Close closes the underlying network connection + Close() error + + // Wait blocks until the connection has shut down, and returns the + // error causing the shutdown. + Wait() error + + // TODO(hanwen): consider exposing: + // RequestKeyChange + // Disconnect +} + +// DiscardRequests consumes and rejects all requests from the +// passed-in channel. +func DiscardRequests(in <-chan *Request) { + for req := range in { + if req.WantReply { + req.Reply(false, nil) + } + } +} + +// A connection represents an incoming connection. +type connection struct { + transport *handshakeTransport + sshConn + + // The connection protocol. + *mux +} + +func (c *connection) Close() error { + return c.sshConn.conn.Close() +} + +// sshconn provides net.Conn metadata, but disallows direct reads and +// writes. +type sshConn struct { + conn net.Conn + + user string + sessionID []byte + clientVersion []byte + serverVersion []byte +} + +func dup(src []byte) []byte { + dst := make([]byte, len(src)) + copy(dst, src) + return dst +} + +func (c *sshConn) User() string { + return c.user +} + +func (c *sshConn) RemoteAddr() net.Addr { + return c.conn.RemoteAddr() +} + +func (c *sshConn) Close() error { + return c.conn.Close() +} + +func (c *sshConn) LocalAddr() net.Addr { + return c.conn.LocalAddr() +} + +func (c *sshConn) SessionID() []byte { + return dup(c.sessionID) +} + +func (c *sshConn) ClientVersion() []byte { + return dup(c.clientVersion) +} + +func (c *sshConn) ServerVersion() []byte { + return dup(c.serverVersion) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/doc.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/doc.go new file mode 100644 index 0000000000000000000000000000000000000000..67b7322c058058f4f794aab619d49b68b7289bd6 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/doc.go @@ -0,0 +1,21 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +/* +Package ssh implements an SSH client and server. + +SSH is a transport security protocol, an authentication protocol and a +family of application protocols. The most typical application level +protocol is a remote shell and this is specifically implemented. However, +the multiplexed nature of SSH is exposed to users that wish to support +others. + +References: + [PROTOCOL.certkeys]: http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.certkeys?rev=HEAD + [SSH-PARAMETERS]: http://www.iana.org/assignments/ssh-parameters/ssh-parameters.xml#ssh-parameters-1 + +This package does not fall under the stability promise of the Go language itself, +so its API may be changed when pressing needs arise. +*/ +package ssh // import "golang.org/x/crypto/ssh" diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/handshake.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/handshake.go new file mode 100644 index 0000000000000000000000000000000000000000..4f7912ecd6565bf1b5405b7c2a68d31493411697 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/handshake.go @@ -0,0 +1,646 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "crypto/rand" + "errors" + "fmt" + "io" + "log" + "net" + "sync" +) + +// debugHandshake, if set, prints messages sent and received. Key +// exchange messages are printed as if DH were used, so the debug +// messages are wrong when using ECDH. +const debugHandshake = false + +// chanSize sets the amount of buffering SSH connections. This is +// primarily for testing: setting chanSize=0 uncovers deadlocks more +// quickly. +const chanSize = 16 + +// keyingTransport is a packet based transport that supports key +// changes. It need not be thread-safe. It should pass through +// msgNewKeys in both directions. +type keyingTransport interface { + packetConn + + // prepareKeyChange sets up a key change. The key change for a + // direction will be effected if a msgNewKeys message is sent + // or received. + prepareKeyChange(*algorithms, *kexResult) error +} + +// handshakeTransport implements rekeying on top of a keyingTransport +// and offers a thread-safe writePacket() interface. +type handshakeTransport struct { + conn keyingTransport + config *Config + + serverVersion []byte + clientVersion []byte + + // hostKeys is non-empty if we are the server. In that case, + // it contains all host keys that can be used to sign the + // connection. + hostKeys []Signer + + // hostKeyAlgorithms is non-empty if we are the client. In that case, + // we accept these key types from the server as host key. + hostKeyAlgorithms []string + + // On read error, incoming is closed, and readError is set. + incoming chan []byte + readError error + + mu sync.Mutex + writeError error + sentInitPacket []byte + sentInitMsg *kexInitMsg + pendingPackets [][]byte // Used when a key exchange is in progress. + + // If the read loop wants to schedule a kex, it pings this + // channel, and the write loop will send out a kex + // message. + requestKex chan struct{} + + // If the other side requests or confirms a kex, its kexInit + // packet is sent here for the write loop to find it. + startKex chan *pendingKex + + // data for host key checking + hostKeyCallback HostKeyCallback + dialAddress string + remoteAddr net.Addr + + // bannerCallback is non-empty if we are the client and it has been set in + // ClientConfig. In that case it is called during the user authentication + // dance to handle a custom server's message. + bannerCallback BannerCallback + + // Algorithms agreed in the last key exchange. + algorithms *algorithms + + readPacketsLeft uint32 + readBytesLeft int64 + + writePacketsLeft uint32 + writeBytesLeft int64 + + // The session ID or nil if first kex did not complete yet. + sessionID []byte +} + +type pendingKex struct { + otherInit []byte + done chan error +} + +func newHandshakeTransport(conn keyingTransport, config *Config, clientVersion, serverVersion []byte) *handshakeTransport { + t := &handshakeTransport{ + conn: conn, + serverVersion: serverVersion, + clientVersion: clientVersion, + incoming: make(chan []byte, chanSize), + requestKex: make(chan struct{}, 1), + startKex: make(chan *pendingKex, 1), + + config: config, + } + t.resetReadThresholds() + t.resetWriteThresholds() + + // We always start with a mandatory key exchange. + t.requestKex <- struct{}{} + return t +} + +func newClientTransport(conn keyingTransport, clientVersion, serverVersion []byte, config *ClientConfig, dialAddr string, addr net.Addr) *handshakeTransport { + t := newHandshakeTransport(conn, &config.Config, clientVersion, serverVersion) + t.dialAddress = dialAddr + t.remoteAddr = addr + t.hostKeyCallback = config.HostKeyCallback + t.bannerCallback = config.BannerCallback + if config.HostKeyAlgorithms != nil { + t.hostKeyAlgorithms = config.HostKeyAlgorithms + } else { + t.hostKeyAlgorithms = supportedHostKeyAlgos + } + go t.readLoop() + go t.kexLoop() + return t +} + +func newServerTransport(conn keyingTransport, clientVersion, serverVersion []byte, config *ServerConfig) *handshakeTransport { + t := newHandshakeTransport(conn, &config.Config, clientVersion, serverVersion) + t.hostKeys = config.hostKeys + go t.readLoop() + go t.kexLoop() + return t +} + +func (t *handshakeTransport) getSessionID() []byte { + return t.sessionID +} + +// waitSession waits for the session to be established. This should be +// the first thing to call after instantiating handshakeTransport. +func (t *handshakeTransport) waitSession() error { + p, err := t.readPacket() + if err != nil { + return err + } + if p[0] != msgNewKeys { + return fmt.Errorf("ssh: first packet should be msgNewKeys") + } + + return nil +} + +func (t *handshakeTransport) id() string { + if len(t.hostKeys) > 0 { + return "server" + } + return "client" +} + +func (t *handshakeTransport) printPacket(p []byte, write bool) { + action := "got" + if write { + action = "sent" + } + + if p[0] == msgChannelData || p[0] == msgChannelExtendedData { + log.Printf("%s %s data (packet %d bytes)", t.id(), action, len(p)) + } else { + msg, err := decode(p) + log.Printf("%s %s %T %v (%v)", t.id(), action, msg, msg, err) + } +} + +func (t *handshakeTransport) readPacket() ([]byte, error) { + p, ok := <-t.incoming + if !ok { + return nil, t.readError + } + return p, nil +} + +func (t *handshakeTransport) readLoop() { + first := true + for { + p, err := t.readOnePacket(first) + first = false + if err != nil { + t.readError = err + close(t.incoming) + break + } + if p[0] == msgIgnore || p[0] == msgDebug { + continue + } + t.incoming <- p + } + + // Stop writers too. + t.recordWriteError(t.readError) + + // Unblock the writer should it wait for this. + close(t.startKex) + + // Don't close t.requestKex; it's also written to from writePacket. +} + +func (t *handshakeTransport) pushPacket(p []byte) error { + if debugHandshake { + t.printPacket(p, true) + } + return t.conn.writePacket(p) +} + +func (t *handshakeTransport) getWriteError() error { + t.mu.Lock() + defer t.mu.Unlock() + return t.writeError +} + +func (t *handshakeTransport) recordWriteError(err error) { + t.mu.Lock() + defer t.mu.Unlock() + if t.writeError == nil && err != nil { + t.writeError = err + } +} + +func (t *handshakeTransport) requestKeyExchange() { + select { + case t.requestKex <- struct{}{}: + default: + // something already requested a kex, so do nothing. + } +} + +func (t *handshakeTransport) resetWriteThresholds() { + t.writePacketsLeft = packetRekeyThreshold + if t.config.RekeyThreshold > 0 { + t.writeBytesLeft = int64(t.config.RekeyThreshold) + } else if t.algorithms != nil { + t.writeBytesLeft = t.algorithms.w.rekeyBytes() + } else { + t.writeBytesLeft = 1 << 30 + } +} + +func (t *handshakeTransport) kexLoop() { + +write: + for t.getWriteError() == nil { + var request *pendingKex + var sent bool + + for request == nil || !sent { + var ok bool + select { + case request, ok = <-t.startKex: + if !ok { + break write + } + case <-t.requestKex: + break + } + + if !sent { + if err := t.sendKexInit(); err != nil { + t.recordWriteError(err) + break + } + sent = true + } + } + + if err := t.getWriteError(); err != nil { + if request != nil { + request.done <- err + } + break + } + + // We're not servicing t.requestKex, but that is OK: + // we never block on sending to t.requestKex. + + // We're not servicing t.startKex, but the remote end + // has just sent us a kexInitMsg, so it can't send + // another key change request, until we close the done + // channel on the pendingKex request. + + err := t.enterKeyExchange(request.otherInit) + + t.mu.Lock() + t.writeError = err + t.sentInitPacket = nil + t.sentInitMsg = nil + + t.resetWriteThresholds() + + // we have completed the key exchange. Since the + // reader is still blocked, it is safe to clear out + // the requestKex channel. This avoids the situation + // where: 1) we consumed our own request for the + // initial kex, and 2) the kex from the remote side + // caused another send on the requestKex channel, + clear: + for { + select { + case <-t.requestKex: + // + default: + break clear + } + } + + request.done <- t.writeError + + // kex finished. Push packets that we received while + // the kex was in progress. Don't look at t.startKex + // and don't increment writtenSinceKex: if we trigger + // another kex while we are still busy with the last + // one, things will become very confusing. + for _, p := range t.pendingPackets { + t.writeError = t.pushPacket(p) + if t.writeError != nil { + break + } + } + t.pendingPackets = t.pendingPackets[:0] + t.mu.Unlock() + } + + // drain startKex channel. We don't service t.requestKex + // because nobody does blocking sends there. + go func() { + for init := range t.startKex { + init.done <- t.writeError + } + }() + + // Unblock reader. + t.conn.Close() +} + +// The protocol uses uint32 for packet counters, so we can't let them +// reach 1<<32. We will actually read and write more packets than +// this, though: the other side may send more packets, and after we +// hit this limit on writing we will send a few more packets for the +// key exchange itself. +const packetRekeyThreshold = (1 << 31) + +func (t *handshakeTransport) resetReadThresholds() { + t.readPacketsLeft = packetRekeyThreshold + if t.config.RekeyThreshold > 0 { + t.readBytesLeft = int64(t.config.RekeyThreshold) + } else if t.algorithms != nil { + t.readBytesLeft = t.algorithms.r.rekeyBytes() + } else { + t.readBytesLeft = 1 << 30 + } +} + +func (t *handshakeTransport) readOnePacket(first bool) ([]byte, error) { + p, err := t.conn.readPacket() + if err != nil { + return nil, err + } + + if t.readPacketsLeft > 0 { + t.readPacketsLeft-- + } else { + t.requestKeyExchange() + } + + if t.readBytesLeft > 0 { + t.readBytesLeft -= int64(len(p)) + } else { + t.requestKeyExchange() + } + + if debugHandshake { + t.printPacket(p, false) + } + + if first && p[0] != msgKexInit { + return nil, fmt.Errorf("ssh: first packet should be msgKexInit") + } + + if p[0] != msgKexInit { + return p, nil + } + + firstKex := t.sessionID == nil + + kex := pendingKex{ + done: make(chan error, 1), + otherInit: p, + } + t.startKex <- &kex + err = <-kex.done + + if debugHandshake { + log.Printf("%s exited key exchange (first %v), err %v", t.id(), firstKex, err) + } + + if err != nil { + return nil, err + } + + t.resetReadThresholds() + + // By default, a key exchange is hidden from higher layers by + // translating it into msgIgnore. + successPacket := []byte{msgIgnore} + if firstKex { + // sendKexInit() for the first kex waits for + // msgNewKeys so the authentication process is + // guaranteed to happen over an encrypted transport. + successPacket = []byte{msgNewKeys} + } + + return successPacket, nil +} + +// sendKexInit sends a key change message. +func (t *handshakeTransport) sendKexInit() error { + t.mu.Lock() + defer t.mu.Unlock() + if t.sentInitMsg != nil { + // kexInits may be sent either in response to the other side, + // or because our side wants to initiate a key change, so we + // may have already sent a kexInit. In that case, don't send a + // second kexInit. + return nil + } + + msg := &kexInitMsg{ + KexAlgos: t.config.KeyExchanges, + CiphersClientServer: t.config.Ciphers, + CiphersServerClient: t.config.Ciphers, + MACsClientServer: t.config.MACs, + MACsServerClient: t.config.MACs, + CompressionClientServer: supportedCompressions, + CompressionServerClient: supportedCompressions, + } + io.ReadFull(rand.Reader, msg.Cookie[:]) + + if len(t.hostKeys) > 0 { + for _, k := range t.hostKeys { + msg.ServerHostKeyAlgos = append( + msg.ServerHostKeyAlgos, k.PublicKey().Type()) + } + } else { + msg.ServerHostKeyAlgos = t.hostKeyAlgorithms + } + packet := Marshal(msg) + + // writePacket destroys the contents, so save a copy. + packetCopy := make([]byte, len(packet)) + copy(packetCopy, packet) + + if err := t.pushPacket(packetCopy); err != nil { + return err + } + + t.sentInitMsg = msg + t.sentInitPacket = packet + + return nil +} + +func (t *handshakeTransport) writePacket(p []byte) error { + switch p[0] { + case msgKexInit: + return errors.New("ssh: only handshakeTransport can send kexInit") + case msgNewKeys: + return errors.New("ssh: only handshakeTransport can send newKeys") + } + + t.mu.Lock() + defer t.mu.Unlock() + if t.writeError != nil { + return t.writeError + } + + if t.sentInitMsg != nil { + // Copy the packet so the writer can reuse the buffer. + cp := make([]byte, len(p)) + copy(cp, p) + t.pendingPackets = append(t.pendingPackets, cp) + return nil + } + + if t.writeBytesLeft > 0 { + t.writeBytesLeft -= int64(len(p)) + } else { + t.requestKeyExchange() + } + + if t.writePacketsLeft > 0 { + t.writePacketsLeft-- + } else { + t.requestKeyExchange() + } + + if err := t.pushPacket(p); err != nil { + t.writeError = err + } + + return nil +} + +func (t *handshakeTransport) Close() error { + return t.conn.Close() +} + +func (t *handshakeTransport) enterKeyExchange(otherInitPacket []byte) error { + if debugHandshake { + log.Printf("%s entered key exchange", t.id()) + } + + otherInit := &kexInitMsg{} + if err := Unmarshal(otherInitPacket, otherInit); err != nil { + return err + } + + magics := handshakeMagics{ + clientVersion: t.clientVersion, + serverVersion: t.serverVersion, + clientKexInit: otherInitPacket, + serverKexInit: t.sentInitPacket, + } + + clientInit := otherInit + serverInit := t.sentInitMsg + if len(t.hostKeys) == 0 { + clientInit, serverInit = serverInit, clientInit + + magics.clientKexInit = t.sentInitPacket + magics.serverKexInit = otherInitPacket + } + + var err error + t.algorithms, err = findAgreedAlgorithms(clientInit, serverInit) + if err != nil { + return err + } + + // We don't send FirstKexFollows, but we handle receiving it. + // + // RFC 4253 section 7 defines the kex and the agreement method for + // first_kex_packet_follows. It states that the guessed packet + // should be ignored if the "kex algorithm and/or the host + // key algorithm is guessed wrong (server and client have + // different preferred algorithm), or if any of the other + // algorithms cannot be agreed upon". The other algorithms have + // already been checked above so the kex algorithm and host key + // algorithm are checked here. + if otherInit.FirstKexFollows && (clientInit.KexAlgos[0] != serverInit.KexAlgos[0] || clientInit.ServerHostKeyAlgos[0] != serverInit.ServerHostKeyAlgos[0]) { + // other side sent a kex message for the wrong algorithm, + // which we have to ignore. + if _, err := t.conn.readPacket(); err != nil { + return err + } + } + + kex, ok := kexAlgoMap[t.algorithms.kex] + if !ok { + return fmt.Errorf("ssh: unexpected key exchange algorithm %v", t.algorithms.kex) + } + + var result *kexResult + if len(t.hostKeys) > 0 { + result, err = t.server(kex, t.algorithms, &magics) + } else { + result, err = t.client(kex, t.algorithms, &magics) + } + + if err != nil { + return err + } + + if t.sessionID == nil { + t.sessionID = result.H + } + result.SessionID = t.sessionID + + if err := t.conn.prepareKeyChange(t.algorithms, result); err != nil { + return err + } + if err = t.conn.writePacket([]byte{msgNewKeys}); err != nil { + return err + } + if packet, err := t.conn.readPacket(); err != nil { + return err + } else if packet[0] != msgNewKeys { + return unexpectedMessageError(msgNewKeys, packet[0]) + } + + return nil +} + +func (t *handshakeTransport) server(kex kexAlgorithm, algs *algorithms, magics *handshakeMagics) (*kexResult, error) { + var hostKey Signer + for _, k := range t.hostKeys { + if algs.hostKey == k.PublicKey().Type() { + hostKey = k + } + } + + r, err := kex.Server(t.conn, t.config.Rand, magics, hostKey) + return r, err +} + +func (t *handshakeTransport) client(kex kexAlgorithm, algs *algorithms, magics *handshakeMagics) (*kexResult, error) { + result, err := kex.Client(t.conn, t.config.Rand, magics) + if err != nil { + return nil, err + } + + hostKey, err := ParsePublicKey(result.HostKey) + if err != nil { + return nil, err + } + + if err := verifyHostKeySignature(hostKey, result); err != nil { + return nil, err + } + + err = t.hostKeyCallback(t.dialAddress, t.remoteAddr, hostKey) + if err != nil { + return nil, err + } + + return result, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/kex.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/kex.go new file mode 100644 index 0000000000000000000000000000000000000000..f34bcc013325fb6d62fa6e84eec3ce9ed740c15d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/kex.go @@ -0,0 +1,540 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "crypto" + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + "crypto/subtle" + "errors" + "io" + "math/big" + + "golang.org/x/crypto/curve25519" +) + +const ( + kexAlgoDH1SHA1 = "diffie-hellman-group1-sha1" + kexAlgoDH14SHA1 = "diffie-hellman-group14-sha1" + kexAlgoECDH256 = "ecdh-sha2-nistp256" + kexAlgoECDH384 = "ecdh-sha2-nistp384" + kexAlgoECDH521 = "ecdh-sha2-nistp521" + kexAlgoCurve25519SHA256 = "curve25519-sha256@libssh.org" +) + +// kexResult captures the outcome of a key exchange. +type kexResult struct { + // Session hash. See also RFC 4253, section 8. + H []byte + + // Shared secret. See also RFC 4253, section 8. + K []byte + + // Host key as hashed into H. + HostKey []byte + + // Signature of H. + Signature []byte + + // A cryptographic hash function that matches the security + // level of the key exchange algorithm. It is used for + // calculating H, and for deriving keys from H and K. + Hash crypto.Hash + + // The session ID, which is the first H computed. This is used + // to derive key material inside the transport. + SessionID []byte +} + +// handshakeMagics contains data that is always included in the +// session hash. +type handshakeMagics struct { + clientVersion, serverVersion []byte + clientKexInit, serverKexInit []byte +} + +func (m *handshakeMagics) write(w io.Writer) { + writeString(w, m.clientVersion) + writeString(w, m.serverVersion) + writeString(w, m.clientKexInit) + writeString(w, m.serverKexInit) +} + +// kexAlgorithm abstracts different key exchange algorithms. +type kexAlgorithm interface { + // Server runs server-side key agreement, signing the result + // with a hostkey. + Server(p packetConn, rand io.Reader, magics *handshakeMagics, s Signer) (*kexResult, error) + + // Client runs the client-side key agreement. Caller is + // responsible for verifying the host key signature. + Client(p packetConn, rand io.Reader, magics *handshakeMagics) (*kexResult, error) +} + +// dhGroup is a multiplicative group suitable for implementing Diffie-Hellman key agreement. +type dhGroup struct { + g, p, pMinus1 *big.Int +} + +func (group *dhGroup) diffieHellman(theirPublic, myPrivate *big.Int) (*big.Int, error) { + if theirPublic.Cmp(bigOne) <= 0 || theirPublic.Cmp(group.pMinus1) >= 0 { + return nil, errors.New("ssh: DH parameter out of bounds") + } + return new(big.Int).Exp(theirPublic, myPrivate, group.p), nil +} + +func (group *dhGroup) Client(c packetConn, randSource io.Reader, magics *handshakeMagics) (*kexResult, error) { + hashFunc := crypto.SHA1 + + var x *big.Int + for { + var err error + if x, err = rand.Int(randSource, group.pMinus1); err != nil { + return nil, err + } + if x.Sign() > 0 { + break + } + } + + X := new(big.Int).Exp(group.g, x, group.p) + kexDHInit := kexDHInitMsg{ + X: X, + } + if err := c.writePacket(Marshal(&kexDHInit)); err != nil { + return nil, err + } + + packet, err := c.readPacket() + if err != nil { + return nil, err + } + + var kexDHReply kexDHReplyMsg + if err = Unmarshal(packet, &kexDHReply); err != nil { + return nil, err + } + + ki, err := group.diffieHellman(kexDHReply.Y, x) + if err != nil { + return nil, err + } + + h := hashFunc.New() + magics.write(h) + writeString(h, kexDHReply.HostKey) + writeInt(h, X) + writeInt(h, kexDHReply.Y) + K := make([]byte, intLength(ki)) + marshalInt(K, ki) + h.Write(K) + + return &kexResult{ + H: h.Sum(nil), + K: K, + HostKey: kexDHReply.HostKey, + Signature: kexDHReply.Signature, + Hash: crypto.SHA1, + }, nil +} + +func (group *dhGroup) Server(c packetConn, randSource io.Reader, magics *handshakeMagics, priv Signer) (result *kexResult, err error) { + hashFunc := crypto.SHA1 + packet, err := c.readPacket() + if err != nil { + return + } + var kexDHInit kexDHInitMsg + if err = Unmarshal(packet, &kexDHInit); err != nil { + return + } + + var y *big.Int + for { + if y, err = rand.Int(randSource, group.pMinus1); err != nil { + return + } + if y.Sign() > 0 { + break + } + } + + Y := new(big.Int).Exp(group.g, y, group.p) + ki, err := group.diffieHellman(kexDHInit.X, y) + if err != nil { + return nil, err + } + + hostKeyBytes := priv.PublicKey().Marshal() + + h := hashFunc.New() + magics.write(h) + writeString(h, hostKeyBytes) + writeInt(h, kexDHInit.X) + writeInt(h, Y) + + K := make([]byte, intLength(ki)) + marshalInt(K, ki) + h.Write(K) + + H := h.Sum(nil) + + // H is already a hash, but the hostkey signing will apply its + // own key-specific hash algorithm. + sig, err := signAndMarshal(priv, randSource, H) + if err != nil { + return nil, err + } + + kexDHReply := kexDHReplyMsg{ + HostKey: hostKeyBytes, + Y: Y, + Signature: sig, + } + packet = Marshal(&kexDHReply) + + err = c.writePacket(packet) + return &kexResult{ + H: H, + K: K, + HostKey: hostKeyBytes, + Signature: sig, + Hash: crypto.SHA1, + }, nil +} + +// ecdh performs Elliptic Curve Diffie-Hellman key exchange as +// described in RFC 5656, section 4. +type ecdh struct { + curve elliptic.Curve +} + +func (kex *ecdh) Client(c packetConn, rand io.Reader, magics *handshakeMagics) (*kexResult, error) { + ephKey, err := ecdsa.GenerateKey(kex.curve, rand) + if err != nil { + return nil, err + } + + kexInit := kexECDHInitMsg{ + ClientPubKey: elliptic.Marshal(kex.curve, ephKey.PublicKey.X, ephKey.PublicKey.Y), + } + + serialized := Marshal(&kexInit) + if err := c.writePacket(serialized); err != nil { + return nil, err + } + + packet, err := c.readPacket() + if err != nil { + return nil, err + } + + var reply kexECDHReplyMsg + if err = Unmarshal(packet, &reply); err != nil { + return nil, err + } + + x, y, err := unmarshalECKey(kex.curve, reply.EphemeralPubKey) + if err != nil { + return nil, err + } + + // generate shared secret + secret, _ := kex.curve.ScalarMult(x, y, ephKey.D.Bytes()) + + h := ecHash(kex.curve).New() + magics.write(h) + writeString(h, reply.HostKey) + writeString(h, kexInit.ClientPubKey) + writeString(h, reply.EphemeralPubKey) + K := make([]byte, intLength(secret)) + marshalInt(K, secret) + h.Write(K) + + return &kexResult{ + H: h.Sum(nil), + K: K, + HostKey: reply.HostKey, + Signature: reply.Signature, + Hash: ecHash(kex.curve), + }, nil +} + +// unmarshalECKey parses and checks an EC key. +func unmarshalECKey(curve elliptic.Curve, pubkey []byte) (x, y *big.Int, err error) { + x, y = elliptic.Unmarshal(curve, pubkey) + if x == nil { + return nil, nil, errors.New("ssh: elliptic.Unmarshal failure") + } + if !validateECPublicKey(curve, x, y) { + return nil, nil, errors.New("ssh: public key not on curve") + } + return x, y, nil +} + +// validateECPublicKey checks that the point is a valid public key for +// the given curve. See [SEC1], 3.2.2 +func validateECPublicKey(curve elliptic.Curve, x, y *big.Int) bool { + if x.Sign() == 0 && y.Sign() == 0 { + return false + } + + if x.Cmp(curve.Params().P) >= 0 { + return false + } + + if y.Cmp(curve.Params().P) >= 0 { + return false + } + + if !curve.IsOnCurve(x, y) { + return false + } + + // We don't check if N * PubKey == 0, since + // + // - the NIST curves have cofactor = 1, so this is implicit. + // (We don't foresee an implementation that supports non NIST + // curves) + // + // - for ephemeral keys, we don't need to worry about small + // subgroup attacks. + return true +} + +func (kex *ecdh) Server(c packetConn, rand io.Reader, magics *handshakeMagics, priv Signer) (result *kexResult, err error) { + packet, err := c.readPacket() + if err != nil { + return nil, err + } + + var kexECDHInit kexECDHInitMsg + if err = Unmarshal(packet, &kexECDHInit); err != nil { + return nil, err + } + + clientX, clientY, err := unmarshalECKey(kex.curve, kexECDHInit.ClientPubKey) + if err != nil { + return nil, err + } + + // We could cache this key across multiple users/multiple + // connection attempts, but the benefit is small. OpenSSH + // generates a new key for each incoming connection. + ephKey, err := ecdsa.GenerateKey(kex.curve, rand) + if err != nil { + return nil, err + } + + hostKeyBytes := priv.PublicKey().Marshal() + + serializedEphKey := elliptic.Marshal(kex.curve, ephKey.PublicKey.X, ephKey.PublicKey.Y) + + // generate shared secret + secret, _ := kex.curve.ScalarMult(clientX, clientY, ephKey.D.Bytes()) + + h := ecHash(kex.curve).New() + magics.write(h) + writeString(h, hostKeyBytes) + writeString(h, kexECDHInit.ClientPubKey) + writeString(h, serializedEphKey) + + K := make([]byte, intLength(secret)) + marshalInt(K, secret) + h.Write(K) + + H := h.Sum(nil) + + // H is already a hash, but the hostkey signing will apply its + // own key-specific hash algorithm. + sig, err := signAndMarshal(priv, rand, H) + if err != nil { + return nil, err + } + + reply := kexECDHReplyMsg{ + EphemeralPubKey: serializedEphKey, + HostKey: hostKeyBytes, + Signature: sig, + } + + serialized := Marshal(&reply) + if err := c.writePacket(serialized); err != nil { + return nil, err + } + + return &kexResult{ + H: H, + K: K, + HostKey: reply.HostKey, + Signature: sig, + Hash: ecHash(kex.curve), + }, nil +} + +var kexAlgoMap = map[string]kexAlgorithm{} + +func init() { + // This is the group called diffie-hellman-group1-sha1 in RFC + // 4253 and Oakley Group 2 in RFC 2409. + p, _ := new(big.Int).SetString("FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF", 16) + kexAlgoMap[kexAlgoDH1SHA1] = &dhGroup{ + g: new(big.Int).SetInt64(2), + p: p, + pMinus1: new(big.Int).Sub(p, bigOne), + } + + // This is the group called diffie-hellman-group14-sha1 in RFC + // 4253 and Oakley Group 14 in RFC 3526. + p, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF", 16) + + kexAlgoMap[kexAlgoDH14SHA1] = &dhGroup{ + g: new(big.Int).SetInt64(2), + p: p, + pMinus1: new(big.Int).Sub(p, bigOne), + } + + kexAlgoMap[kexAlgoECDH521] = &ecdh{elliptic.P521()} + kexAlgoMap[kexAlgoECDH384] = &ecdh{elliptic.P384()} + kexAlgoMap[kexAlgoECDH256] = &ecdh{elliptic.P256()} + kexAlgoMap[kexAlgoCurve25519SHA256] = &curve25519sha256{} +} + +// curve25519sha256 implements the curve25519-sha256@libssh.org key +// agreement protocol, as described in +// https://git.libssh.org/projects/libssh.git/tree/doc/curve25519-sha256@libssh.org.txt +type curve25519sha256 struct{} + +type curve25519KeyPair struct { + priv [32]byte + pub [32]byte +} + +func (kp *curve25519KeyPair) generate(rand io.Reader) error { + if _, err := io.ReadFull(rand, kp.priv[:]); err != nil { + return err + } + curve25519.ScalarBaseMult(&kp.pub, &kp.priv) + return nil +} + +// curve25519Zeros is just an array of 32 zero bytes so that we have something +// convenient to compare against in order to reject curve25519 points with the +// wrong order. +var curve25519Zeros [32]byte + +func (kex *curve25519sha256) Client(c packetConn, rand io.Reader, magics *handshakeMagics) (*kexResult, error) { + var kp curve25519KeyPair + if err := kp.generate(rand); err != nil { + return nil, err + } + if err := c.writePacket(Marshal(&kexECDHInitMsg{kp.pub[:]})); err != nil { + return nil, err + } + + packet, err := c.readPacket() + if err != nil { + return nil, err + } + + var reply kexECDHReplyMsg + if err = Unmarshal(packet, &reply); err != nil { + return nil, err + } + if len(reply.EphemeralPubKey) != 32 { + return nil, errors.New("ssh: peer's curve25519 public value has wrong length") + } + + var servPub, secret [32]byte + copy(servPub[:], reply.EphemeralPubKey) + curve25519.ScalarMult(&secret, &kp.priv, &servPub) + if subtle.ConstantTimeCompare(secret[:], curve25519Zeros[:]) == 1 { + return nil, errors.New("ssh: peer's curve25519 public value has wrong order") + } + + h := crypto.SHA256.New() + magics.write(h) + writeString(h, reply.HostKey) + writeString(h, kp.pub[:]) + writeString(h, reply.EphemeralPubKey) + + ki := new(big.Int).SetBytes(secret[:]) + K := make([]byte, intLength(ki)) + marshalInt(K, ki) + h.Write(K) + + return &kexResult{ + H: h.Sum(nil), + K: K, + HostKey: reply.HostKey, + Signature: reply.Signature, + Hash: crypto.SHA256, + }, nil +} + +func (kex *curve25519sha256) Server(c packetConn, rand io.Reader, magics *handshakeMagics, priv Signer) (result *kexResult, err error) { + packet, err := c.readPacket() + if err != nil { + return + } + var kexInit kexECDHInitMsg + if err = Unmarshal(packet, &kexInit); err != nil { + return + } + + if len(kexInit.ClientPubKey) != 32 { + return nil, errors.New("ssh: peer's curve25519 public value has wrong length") + } + + var kp curve25519KeyPair + if err := kp.generate(rand); err != nil { + return nil, err + } + + var clientPub, secret [32]byte + copy(clientPub[:], kexInit.ClientPubKey) + curve25519.ScalarMult(&secret, &kp.priv, &clientPub) + if subtle.ConstantTimeCompare(secret[:], curve25519Zeros[:]) == 1 { + return nil, errors.New("ssh: peer's curve25519 public value has wrong order") + } + + hostKeyBytes := priv.PublicKey().Marshal() + + h := crypto.SHA256.New() + magics.write(h) + writeString(h, hostKeyBytes) + writeString(h, kexInit.ClientPubKey) + writeString(h, kp.pub[:]) + + ki := new(big.Int).SetBytes(secret[:]) + K := make([]byte, intLength(ki)) + marshalInt(K, ki) + h.Write(K) + + H := h.Sum(nil) + + sig, err := signAndMarshal(priv, rand, H) + if err != nil { + return nil, err + } + + reply := kexECDHReplyMsg{ + EphemeralPubKey: kp.pub[:], + HostKey: hostKeyBytes, + Signature: sig, + } + if err := c.writePacket(Marshal(&reply)); err != nil { + return nil, err + } + return &kexResult{ + H: H, + K: K, + HostKey: hostKeyBytes, + Signature: sig, + Hash: crypto.SHA256, + }, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/keys.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/keys.go new file mode 100644 index 0000000000000000000000000000000000000000..2261dc386c30987b471a60ef7dae25217ba2b38e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/keys.go @@ -0,0 +1,1035 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "bytes" + "crypto" + "crypto/dsa" + "crypto/ecdsa" + "crypto/elliptic" + "crypto/md5" + "crypto/rsa" + "crypto/sha256" + "crypto/x509" + "encoding/asn1" + "encoding/base64" + "encoding/hex" + "encoding/pem" + "errors" + "fmt" + "io" + "math/big" + "strings" + + "golang.org/x/crypto/ed25519" +) + +// These constants represent the algorithm names for key types supported by this +// package. +const ( + KeyAlgoRSA = "ssh-rsa" + KeyAlgoDSA = "ssh-dss" + KeyAlgoECDSA256 = "ecdsa-sha2-nistp256" + KeyAlgoECDSA384 = "ecdsa-sha2-nistp384" + KeyAlgoECDSA521 = "ecdsa-sha2-nistp521" + KeyAlgoED25519 = "ssh-ed25519" +) + +// parsePubKey parses a public key of the given algorithm. +// Use ParsePublicKey for keys with prepended algorithm. +func parsePubKey(in []byte, algo string) (pubKey PublicKey, rest []byte, err error) { + switch algo { + case KeyAlgoRSA: + return parseRSA(in) + case KeyAlgoDSA: + return parseDSA(in) + case KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521: + return parseECDSA(in) + case KeyAlgoED25519: + return parseED25519(in) + case CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01, CertAlgoED25519v01: + cert, err := parseCert(in, certToPrivAlgo(algo)) + if err != nil { + return nil, nil, err + } + return cert, nil, nil + } + return nil, nil, fmt.Errorf("ssh: unknown key algorithm: %v", algo) +} + +// parseAuthorizedKey parses a public key in OpenSSH authorized_keys format +// (see sshd(8) manual page) once the options and key type fields have been +// removed. +func parseAuthorizedKey(in []byte) (out PublicKey, comment string, err error) { + in = bytes.TrimSpace(in) + + i := bytes.IndexAny(in, " \t") + if i == -1 { + i = len(in) + } + base64Key := in[:i] + + key := make([]byte, base64.StdEncoding.DecodedLen(len(base64Key))) + n, err := base64.StdEncoding.Decode(key, base64Key) + if err != nil { + return nil, "", err + } + key = key[:n] + out, err = ParsePublicKey(key) + if err != nil { + return nil, "", err + } + comment = string(bytes.TrimSpace(in[i:])) + return out, comment, nil +} + +// ParseKnownHosts parses an entry in the format of the known_hosts file. +// +// The known_hosts format is documented in the sshd(8) manual page. This +// function will parse a single entry from in. On successful return, marker +// will contain the optional marker value (i.e. "cert-authority" or "revoked") +// or else be empty, hosts will contain the hosts that this entry matches, +// pubKey will contain the public key and comment will contain any trailing +// comment at the end of the line. See the sshd(8) manual page for the various +// forms that a host string can take. +// +// The unparsed remainder of the input will be returned in rest. This function +// can be called repeatedly to parse multiple entries. +// +// If no entries were found in the input then err will be io.EOF. Otherwise a +// non-nil err value indicates a parse error. +func ParseKnownHosts(in []byte) (marker string, hosts []string, pubKey PublicKey, comment string, rest []byte, err error) { + for len(in) > 0 { + end := bytes.IndexByte(in, '\n') + if end != -1 { + rest = in[end+1:] + in = in[:end] + } else { + rest = nil + } + + end = bytes.IndexByte(in, '\r') + if end != -1 { + in = in[:end] + } + + in = bytes.TrimSpace(in) + if len(in) == 0 || in[0] == '#' { + in = rest + continue + } + + i := bytes.IndexAny(in, " \t") + if i == -1 { + in = rest + continue + } + + // Strip out the beginning of the known_host key. + // This is either an optional marker or a (set of) hostname(s). + keyFields := bytes.Fields(in) + if len(keyFields) < 3 || len(keyFields) > 5 { + return "", nil, nil, "", nil, errors.New("ssh: invalid entry in known_hosts data") + } + + // keyFields[0] is either "@cert-authority", "@revoked" or a comma separated + // list of hosts + marker := "" + if keyFields[0][0] == '@' { + marker = string(keyFields[0][1:]) + keyFields = keyFields[1:] + } + + hosts := string(keyFields[0]) + // keyFields[1] contains the key type (e.g. “ssh-rsa”). + // However, that information is duplicated inside the + // base64-encoded key and so is ignored here. + + key := bytes.Join(keyFields[2:], []byte(" ")) + if pubKey, comment, err = parseAuthorizedKey(key); err != nil { + return "", nil, nil, "", nil, err + } + + return marker, strings.Split(hosts, ","), pubKey, comment, rest, nil + } + + return "", nil, nil, "", nil, io.EOF +} + +// ParseAuthorizedKeys parses a public key from an authorized_keys +// file used in OpenSSH according to the sshd(8) manual page. +func ParseAuthorizedKey(in []byte) (out PublicKey, comment string, options []string, rest []byte, err error) { + for len(in) > 0 { + end := bytes.IndexByte(in, '\n') + if end != -1 { + rest = in[end+1:] + in = in[:end] + } else { + rest = nil + } + + end = bytes.IndexByte(in, '\r') + if end != -1 { + in = in[:end] + } + + in = bytes.TrimSpace(in) + if len(in) == 0 || in[0] == '#' { + in = rest + continue + } + + i := bytes.IndexAny(in, " \t") + if i == -1 { + in = rest + continue + } + + if out, comment, err = parseAuthorizedKey(in[i:]); err == nil { + return out, comment, options, rest, nil + } + + // No key type recognised. Maybe there's an options field at + // the beginning. + var b byte + inQuote := false + var candidateOptions []string + optionStart := 0 + for i, b = range in { + isEnd := !inQuote && (b == ' ' || b == '\t') + if (b == ',' && !inQuote) || isEnd { + if i-optionStart > 0 { + candidateOptions = append(candidateOptions, string(in[optionStart:i])) + } + optionStart = i + 1 + } + if isEnd { + break + } + if b == '"' && (i == 0 || (i > 0 && in[i-1] != '\\')) { + inQuote = !inQuote + } + } + for i < len(in) && (in[i] == ' ' || in[i] == '\t') { + i++ + } + if i == len(in) { + // Invalid line: unmatched quote + in = rest + continue + } + + in = in[i:] + i = bytes.IndexAny(in, " \t") + if i == -1 { + in = rest + continue + } + + if out, comment, err = parseAuthorizedKey(in[i:]); err == nil { + options = candidateOptions + return out, comment, options, rest, nil + } + + in = rest + continue + } + + return nil, "", nil, nil, errors.New("ssh: no key found") +} + +// ParsePublicKey parses an SSH public key formatted for use in +// the SSH wire protocol according to RFC 4253, section 6.6. +func ParsePublicKey(in []byte) (out PublicKey, err error) { + algo, in, ok := parseString(in) + if !ok { + return nil, errShortRead + } + var rest []byte + out, rest, err = parsePubKey(in, string(algo)) + if len(rest) > 0 { + return nil, errors.New("ssh: trailing junk in public key") + } + + return out, err +} + +// MarshalAuthorizedKey serializes key for inclusion in an OpenSSH +// authorized_keys file. The return value ends with newline. +func MarshalAuthorizedKey(key PublicKey) []byte { + b := &bytes.Buffer{} + b.WriteString(key.Type()) + b.WriteByte(' ') + e := base64.NewEncoder(base64.StdEncoding, b) + e.Write(key.Marshal()) + e.Close() + b.WriteByte('\n') + return b.Bytes() +} + +// PublicKey is an abstraction of different types of public keys. +type PublicKey interface { + // Type returns the key's type, e.g. "ssh-rsa". + Type() string + + // Marshal returns the serialized key data in SSH wire format, + // with the name prefix. To unmarshal the returned data, use + // the ParsePublicKey function. + Marshal() []byte + + // Verify that sig is a signature on the given data using this + // key. This function will hash the data appropriately first. + Verify(data []byte, sig *Signature) error +} + +// CryptoPublicKey, if implemented by a PublicKey, +// returns the underlying crypto.PublicKey form of the key. +type CryptoPublicKey interface { + CryptoPublicKey() crypto.PublicKey +} + +// A Signer can create signatures that verify against a public key. +type Signer interface { + // PublicKey returns an associated PublicKey instance. + PublicKey() PublicKey + + // Sign returns raw signature for the given data. This method + // will apply the hash specified for the keytype to the data. + Sign(rand io.Reader, data []byte) (*Signature, error) +} + +type rsaPublicKey rsa.PublicKey + +func (r *rsaPublicKey) Type() string { + return "ssh-rsa" +} + +// parseRSA parses an RSA key according to RFC 4253, section 6.6. +func parseRSA(in []byte) (out PublicKey, rest []byte, err error) { + var w struct { + E *big.Int + N *big.Int + Rest []byte `ssh:"rest"` + } + if err := Unmarshal(in, &w); err != nil { + return nil, nil, err + } + + if w.E.BitLen() > 24 { + return nil, nil, errors.New("ssh: exponent too large") + } + e := w.E.Int64() + if e < 3 || e&1 == 0 { + return nil, nil, errors.New("ssh: incorrect exponent") + } + + var key rsa.PublicKey + key.E = int(e) + key.N = w.N + return (*rsaPublicKey)(&key), w.Rest, nil +} + +func (r *rsaPublicKey) Marshal() []byte { + e := new(big.Int).SetInt64(int64(r.E)) + // RSA publickey struct layout should match the struct used by + // parseRSACert in the x/crypto/ssh/agent package. + wirekey := struct { + Name string + E *big.Int + N *big.Int + }{ + KeyAlgoRSA, + e, + r.N, + } + return Marshal(&wirekey) +} + +func (r *rsaPublicKey) Verify(data []byte, sig *Signature) error { + if sig.Format != r.Type() { + return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, r.Type()) + } + h := crypto.SHA1.New() + h.Write(data) + digest := h.Sum(nil) + return rsa.VerifyPKCS1v15((*rsa.PublicKey)(r), crypto.SHA1, digest, sig.Blob) +} + +func (r *rsaPublicKey) CryptoPublicKey() crypto.PublicKey { + return (*rsa.PublicKey)(r) +} + +type dsaPublicKey dsa.PublicKey + +func (k *dsaPublicKey) Type() string { + return "ssh-dss" +} + +func checkDSAParams(param *dsa.Parameters) error { + // SSH specifies FIPS 186-2, which only provided a single size + // (1024 bits) DSA key. FIPS 186-3 allows for larger key + // sizes, which would confuse SSH. + if l := param.P.BitLen(); l != 1024 { + return fmt.Errorf("ssh: unsupported DSA key size %d", l) + } + + return nil +} + +// parseDSA parses an DSA key according to RFC 4253, section 6.6. +func parseDSA(in []byte) (out PublicKey, rest []byte, err error) { + var w struct { + P, Q, G, Y *big.Int + Rest []byte `ssh:"rest"` + } + if err := Unmarshal(in, &w); err != nil { + return nil, nil, err + } + + param := dsa.Parameters{ + P: w.P, + Q: w.Q, + G: w.G, + } + if err := checkDSAParams(&param); err != nil { + return nil, nil, err + } + + key := &dsaPublicKey{ + Parameters: param, + Y: w.Y, + } + return key, w.Rest, nil +} + +func (k *dsaPublicKey) Marshal() []byte { + // DSA publickey struct layout should match the struct used by + // parseDSACert in the x/crypto/ssh/agent package. + w := struct { + Name string + P, Q, G, Y *big.Int + }{ + k.Type(), + k.P, + k.Q, + k.G, + k.Y, + } + + return Marshal(&w) +} + +func (k *dsaPublicKey) Verify(data []byte, sig *Signature) error { + if sig.Format != k.Type() { + return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type()) + } + h := crypto.SHA1.New() + h.Write(data) + digest := h.Sum(nil) + + // Per RFC 4253, section 6.6, + // The value for 'dss_signature_blob' is encoded as a string containing + // r, followed by s (which are 160-bit integers, without lengths or + // padding, unsigned, and in network byte order). + // For DSS purposes, sig.Blob should be exactly 40 bytes in length. + if len(sig.Blob) != 40 { + return errors.New("ssh: DSA signature parse error") + } + r := new(big.Int).SetBytes(sig.Blob[:20]) + s := new(big.Int).SetBytes(sig.Blob[20:]) + if dsa.Verify((*dsa.PublicKey)(k), digest, r, s) { + return nil + } + return errors.New("ssh: signature did not verify") +} + +func (k *dsaPublicKey) CryptoPublicKey() crypto.PublicKey { + return (*dsa.PublicKey)(k) +} + +type dsaPrivateKey struct { + *dsa.PrivateKey +} + +func (k *dsaPrivateKey) PublicKey() PublicKey { + return (*dsaPublicKey)(&k.PrivateKey.PublicKey) +} + +func (k *dsaPrivateKey) Sign(rand io.Reader, data []byte) (*Signature, error) { + h := crypto.SHA1.New() + h.Write(data) + digest := h.Sum(nil) + r, s, err := dsa.Sign(rand, k.PrivateKey, digest) + if err != nil { + return nil, err + } + + sig := make([]byte, 40) + rb := r.Bytes() + sb := s.Bytes() + + copy(sig[20-len(rb):20], rb) + copy(sig[40-len(sb):], sb) + + return &Signature{ + Format: k.PublicKey().Type(), + Blob: sig, + }, nil +} + +type ecdsaPublicKey ecdsa.PublicKey + +func (k *ecdsaPublicKey) Type() string { + return "ecdsa-sha2-" + k.nistID() +} + +func (k *ecdsaPublicKey) nistID() string { + switch k.Params().BitSize { + case 256: + return "nistp256" + case 384: + return "nistp384" + case 521: + return "nistp521" + } + panic("ssh: unsupported ecdsa key size") +} + +type ed25519PublicKey ed25519.PublicKey + +func (k ed25519PublicKey) Type() string { + return KeyAlgoED25519 +} + +func parseED25519(in []byte) (out PublicKey, rest []byte, err error) { + var w struct { + KeyBytes []byte + Rest []byte `ssh:"rest"` + } + + if err := Unmarshal(in, &w); err != nil { + return nil, nil, err + } + + key := ed25519.PublicKey(w.KeyBytes) + + return (ed25519PublicKey)(key), w.Rest, nil +} + +func (k ed25519PublicKey) Marshal() []byte { + w := struct { + Name string + KeyBytes []byte + }{ + KeyAlgoED25519, + []byte(k), + } + return Marshal(&w) +} + +func (k ed25519PublicKey) Verify(b []byte, sig *Signature) error { + if sig.Format != k.Type() { + return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type()) + } + + edKey := (ed25519.PublicKey)(k) + if ok := ed25519.Verify(edKey, b, sig.Blob); !ok { + return errors.New("ssh: signature did not verify") + } + + return nil +} + +func (k ed25519PublicKey) CryptoPublicKey() crypto.PublicKey { + return ed25519.PublicKey(k) +} + +func supportedEllipticCurve(curve elliptic.Curve) bool { + return curve == elliptic.P256() || curve == elliptic.P384() || curve == elliptic.P521() +} + +// ecHash returns the hash to match the given elliptic curve, see RFC +// 5656, section 6.2.1 +func ecHash(curve elliptic.Curve) crypto.Hash { + bitSize := curve.Params().BitSize + switch { + case bitSize <= 256: + return crypto.SHA256 + case bitSize <= 384: + return crypto.SHA384 + } + return crypto.SHA512 +} + +// parseECDSA parses an ECDSA key according to RFC 5656, section 3.1. +func parseECDSA(in []byte) (out PublicKey, rest []byte, err error) { + var w struct { + Curve string + KeyBytes []byte + Rest []byte `ssh:"rest"` + } + + if err := Unmarshal(in, &w); err != nil { + return nil, nil, err + } + + key := new(ecdsa.PublicKey) + + switch w.Curve { + case "nistp256": + key.Curve = elliptic.P256() + case "nistp384": + key.Curve = elliptic.P384() + case "nistp521": + key.Curve = elliptic.P521() + default: + return nil, nil, errors.New("ssh: unsupported curve") + } + + key.X, key.Y = elliptic.Unmarshal(key.Curve, w.KeyBytes) + if key.X == nil || key.Y == nil { + return nil, nil, errors.New("ssh: invalid curve point") + } + return (*ecdsaPublicKey)(key), w.Rest, nil +} + +func (k *ecdsaPublicKey) Marshal() []byte { + // See RFC 5656, section 3.1. + keyBytes := elliptic.Marshal(k.Curve, k.X, k.Y) + // ECDSA publickey struct layout should match the struct used by + // parseECDSACert in the x/crypto/ssh/agent package. + w := struct { + Name string + ID string + Key []byte + }{ + k.Type(), + k.nistID(), + keyBytes, + } + + return Marshal(&w) +} + +func (k *ecdsaPublicKey) Verify(data []byte, sig *Signature) error { + if sig.Format != k.Type() { + return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type()) + } + + h := ecHash(k.Curve).New() + h.Write(data) + digest := h.Sum(nil) + + // Per RFC 5656, section 3.1.2, + // The ecdsa_signature_blob value has the following specific encoding: + // mpint r + // mpint s + var ecSig struct { + R *big.Int + S *big.Int + } + + if err := Unmarshal(sig.Blob, &ecSig); err != nil { + return err + } + + if ecdsa.Verify((*ecdsa.PublicKey)(k), digest, ecSig.R, ecSig.S) { + return nil + } + return errors.New("ssh: signature did not verify") +} + +func (k *ecdsaPublicKey) CryptoPublicKey() crypto.PublicKey { + return (*ecdsa.PublicKey)(k) +} + +// NewSignerFromKey takes an *rsa.PrivateKey, *dsa.PrivateKey, +// *ecdsa.PrivateKey or any other crypto.Signer and returns a +// corresponding Signer instance. ECDSA keys must use P-256, P-384 or +// P-521. DSA keys must use parameter size L1024N160. +func NewSignerFromKey(key interface{}) (Signer, error) { + switch key := key.(type) { + case crypto.Signer: + return NewSignerFromSigner(key) + case *dsa.PrivateKey: + return newDSAPrivateKey(key) + default: + return nil, fmt.Errorf("ssh: unsupported key type %T", key) + } +} + +func newDSAPrivateKey(key *dsa.PrivateKey) (Signer, error) { + if err := checkDSAParams(&key.PublicKey.Parameters); err != nil { + return nil, err + } + + return &dsaPrivateKey{key}, nil +} + +type wrappedSigner struct { + signer crypto.Signer + pubKey PublicKey +} + +// NewSignerFromSigner takes any crypto.Signer implementation and +// returns a corresponding Signer interface. This can be used, for +// example, with keys kept in hardware modules. +func NewSignerFromSigner(signer crypto.Signer) (Signer, error) { + pubKey, err := NewPublicKey(signer.Public()) + if err != nil { + return nil, err + } + + return &wrappedSigner{signer, pubKey}, nil +} + +func (s *wrappedSigner) PublicKey() PublicKey { + return s.pubKey +} + +func (s *wrappedSigner) Sign(rand io.Reader, data []byte) (*Signature, error) { + var hashFunc crypto.Hash + + switch key := s.pubKey.(type) { + case *rsaPublicKey, *dsaPublicKey: + hashFunc = crypto.SHA1 + case *ecdsaPublicKey: + hashFunc = ecHash(key.Curve) + case ed25519PublicKey: + default: + return nil, fmt.Errorf("ssh: unsupported key type %T", key) + } + + var digest []byte + if hashFunc != 0 { + h := hashFunc.New() + h.Write(data) + digest = h.Sum(nil) + } else { + digest = data + } + + signature, err := s.signer.Sign(rand, digest, hashFunc) + if err != nil { + return nil, err + } + + // crypto.Signer.Sign is expected to return an ASN.1-encoded signature + // for ECDSA and DSA, but that's not the encoding expected by SSH, so + // re-encode. + switch s.pubKey.(type) { + case *ecdsaPublicKey, *dsaPublicKey: + type asn1Signature struct { + R, S *big.Int + } + asn1Sig := new(asn1Signature) + _, err := asn1.Unmarshal(signature, asn1Sig) + if err != nil { + return nil, err + } + + switch s.pubKey.(type) { + case *ecdsaPublicKey: + signature = Marshal(asn1Sig) + + case *dsaPublicKey: + signature = make([]byte, 40) + r := asn1Sig.R.Bytes() + s := asn1Sig.S.Bytes() + copy(signature[20-len(r):20], r) + copy(signature[40-len(s):40], s) + } + } + + return &Signature{ + Format: s.pubKey.Type(), + Blob: signature, + }, nil +} + +// NewPublicKey takes an *rsa.PublicKey, *dsa.PublicKey, *ecdsa.PublicKey, +// or ed25519.PublicKey returns a corresponding PublicKey instance. +// ECDSA keys must use P-256, P-384 or P-521. +func NewPublicKey(key interface{}) (PublicKey, error) { + switch key := key.(type) { + case *rsa.PublicKey: + return (*rsaPublicKey)(key), nil + case *ecdsa.PublicKey: + if !supportedEllipticCurve(key.Curve) { + return nil, errors.New("ssh: only P-256, P-384 and P-521 EC keys are supported") + } + return (*ecdsaPublicKey)(key), nil + case *dsa.PublicKey: + return (*dsaPublicKey)(key), nil + case ed25519.PublicKey: + return (ed25519PublicKey)(key), nil + default: + return nil, fmt.Errorf("ssh: unsupported key type %T", key) + } +} + +// ParsePrivateKey returns a Signer from a PEM encoded private key. It supports +// the same keys as ParseRawPrivateKey. +func ParsePrivateKey(pemBytes []byte) (Signer, error) { + key, err := ParseRawPrivateKey(pemBytes) + if err != nil { + return nil, err + } + + return NewSignerFromKey(key) +} + +// ParsePrivateKeyWithPassphrase returns a Signer from a PEM encoded private +// key and passphrase. It supports the same keys as +// ParseRawPrivateKeyWithPassphrase. +func ParsePrivateKeyWithPassphrase(pemBytes, passPhrase []byte) (Signer, error) { + key, err := ParseRawPrivateKeyWithPassphrase(pemBytes, passPhrase) + if err != nil { + return nil, err + } + + return NewSignerFromKey(key) +} + +// encryptedBlock tells whether a private key is +// encrypted by examining its Proc-Type header +// for a mention of ENCRYPTED +// according to RFC 1421 Section 4.6.1.1. +func encryptedBlock(block *pem.Block) bool { + return strings.Contains(block.Headers["Proc-Type"], "ENCRYPTED") +} + +// ParseRawPrivateKey returns a private key from a PEM encoded private key. It +// supports RSA (PKCS#1), PKCS#8, DSA (OpenSSL), and ECDSA private keys. +func ParseRawPrivateKey(pemBytes []byte) (interface{}, error) { + block, _ := pem.Decode(pemBytes) + if block == nil { + return nil, errors.New("ssh: no key found") + } + + if encryptedBlock(block) { + return nil, errors.New("ssh: cannot decode encrypted private keys") + } + + switch block.Type { + case "RSA PRIVATE KEY": + return x509.ParsePKCS1PrivateKey(block.Bytes) + // RFC5208 - https://tools.ietf.org/html/rfc5208 + case "PRIVATE KEY": + return x509.ParsePKCS8PrivateKey(block.Bytes) + case "EC PRIVATE KEY": + return x509.ParseECPrivateKey(block.Bytes) + case "DSA PRIVATE KEY": + return ParseDSAPrivateKey(block.Bytes) + case "OPENSSH PRIVATE KEY": + return parseOpenSSHPrivateKey(block.Bytes) + default: + return nil, fmt.Errorf("ssh: unsupported key type %q", block.Type) + } +} + +// ParseRawPrivateKeyWithPassphrase returns a private key decrypted with +// passphrase from a PEM encoded private key. If wrong passphrase, return +// x509.IncorrectPasswordError. +func ParseRawPrivateKeyWithPassphrase(pemBytes, passPhrase []byte) (interface{}, error) { + block, _ := pem.Decode(pemBytes) + if block == nil { + return nil, errors.New("ssh: no key found") + } + buf := block.Bytes + + if encryptedBlock(block) { + if x509.IsEncryptedPEMBlock(block) { + var err error + buf, err = x509.DecryptPEMBlock(block, passPhrase) + if err != nil { + if err == x509.IncorrectPasswordError { + return nil, err + } + return nil, fmt.Errorf("ssh: cannot decode encrypted private keys: %v", err) + } + } + } + + switch block.Type { + case "RSA PRIVATE KEY": + return x509.ParsePKCS1PrivateKey(buf) + case "EC PRIVATE KEY": + return x509.ParseECPrivateKey(buf) + case "DSA PRIVATE KEY": + return ParseDSAPrivateKey(buf) + case "OPENSSH PRIVATE KEY": + return parseOpenSSHPrivateKey(buf) + default: + return nil, fmt.Errorf("ssh: unsupported key type %q", block.Type) + } +} + +// ParseDSAPrivateKey returns a DSA private key from its ASN.1 DER encoding, as +// specified by the OpenSSL DSA man page. +func ParseDSAPrivateKey(der []byte) (*dsa.PrivateKey, error) { + var k struct { + Version int + P *big.Int + Q *big.Int + G *big.Int + Pub *big.Int + Priv *big.Int + } + rest, err := asn1.Unmarshal(der, &k) + if err != nil { + return nil, errors.New("ssh: failed to parse DSA key: " + err.Error()) + } + if len(rest) > 0 { + return nil, errors.New("ssh: garbage after DSA key") + } + + return &dsa.PrivateKey{ + PublicKey: dsa.PublicKey{ + Parameters: dsa.Parameters{ + P: k.P, + Q: k.Q, + G: k.G, + }, + Y: k.Pub, + }, + X: k.Priv, + }, nil +} + +// Implemented based on the documentation at +// https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.key +func parseOpenSSHPrivateKey(key []byte) (crypto.PrivateKey, error) { + const magic = "openssh-key-v1\x00" + if len(key) < len(magic) || string(key[:len(magic)]) != magic { + return nil, errors.New("ssh: invalid openssh private key format") + } + remaining := key[len(magic):] + + var w struct { + CipherName string + KdfName string + KdfOpts string + NumKeys uint32 + PubKey []byte + PrivKeyBlock []byte + } + + if err := Unmarshal(remaining, &w); err != nil { + return nil, err + } + + if w.KdfName != "none" || w.CipherName != "none" { + return nil, errors.New("ssh: cannot decode encrypted private keys") + } + + pk1 := struct { + Check1 uint32 + Check2 uint32 + Keytype string + Rest []byte `ssh:"rest"` + }{} + + if err := Unmarshal(w.PrivKeyBlock, &pk1); err != nil { + return nil, err + } + + if pk1.Check1 != pk1.Check2 { + return nil, errors.New("ssh: checkint mismatch") + } + + // we only handle ed25519 and rsa keys currently + switch pk1.Keytype { + case KeyAlgoRSA: + // https://github.com/openssh/openssh-portable/blob/master/sshkey.c#L2760-L2773 + key := struct { + N *big.Int + E *big.Int + D *big.Int + Iqmp *big.Int + P *big.Int + Q *big.Int + Comment string + Pad []byte `ssh:"rest"` + }{} + + if err := Unmarshal(pk1.Rest, &key); err != nil { + return nil, err + } + + for i, b := range key.Pad { + if int(b) != i+1 { + return nil, errors.New("ssh: padding not as expected") + } + } + + pk := &rsa.PrivateKey{ + PublicKey: rsa.PublicKey{ + N: key.N, + E: int(key.E.Int64()), + }, + D: key.D, + Primes: []*big.Int{key.P, key.Q}, + } + + if err := pk.Validate(); err != nil { + return nil, err + } + + pk.Precompute() + + return pk, nil + case KeyAlgoED25519: + key := struct { + Pub []byte + Priv []byte + Comment string + Pad []byte `ssh:"rest"` + }{} + + if err := Unmarshal(pk1.Rest, &key); err != nil { + return nil, err + } + + if len(key.Priv) != ed25519.PrivateKeySize { + return nil, errors.New("ssh: private key unexpected length") + } + + for i, b := range key.Pad { + if int(b) != i+1 { + return nil, errors.New("ssh: padding not as expected") + } + } + + pk := ed25519.PrivateKey(make([]byte, ed25519.PrivateKeySize)) + copy(pk, key.Priv) + return &pk, nil + default: + return nil, errors.New("ssh: unhandled key type") + } +} + +// FingerprintLegacyMD5 returns the user presentation of the key's +// fingerprint as described by RFC 4716 section 4. +func FingerprintLegacyMD5(pubKey PublicKey) string { + md5sum := md5.Sum(pubKey.Marshal()) + hexarray := make([]string, len(md5sum)) + for i, c := range md5sum { + hexarray[i] = hex.EncodeToString([]byte{c}) + } + return strings.Join(hexarray, ":") +} + +// FingerprintSHA256 returns the user presentation of the key's +// fingerprint as unpadded base64 encoded sha256 hash. +// This format was introduced from OpenSSH 6.8. +// https://www.openssh.com/txt/release-6.8 +// https://tools.ietf.org/html/rfc4648#section-3.2 (unpadded base64 encoding) +func FingerprintSHA256(pubKey PublicKey) string { + sha256sum := sha256.Sum256(pubKey.Marshal()) + hash := base64.RawStdEncoding.EncodeToString(sha256sum[:]) + return "SHA256:" + hash +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/mac.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/mac.go new file mode 100644 index 0000000000000000000000000000000000000000..c07a06285e66617febc7bac604e91ba10a967e34 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/mac.go @@ -0,0 +1,61 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +// Message authentication support + +import ( + "crypto/hmac" + "crypto/sha1" + "crypto/sha256" + "hash" +) + +type macMode struct { + keySize int + etm bool + new func(key []byte) hash.Hash +} + +// truncatingMAC wraps around a hash.Hash and truncates the output digest to +// a given size. +type truncatingMAC struct { + length int + hmac hash.Hash +} + +func (t truncatingMAC) Write(data []byte) (int, error) { + return t.hmac.Write(data) +} + +func (t truncatingMAC) Sum(in []byte) []byte { + out := t.hmac.Sum(in) + return out[:len(in)+t.length] +} + +func (t truncatingMAC) Reset() { + t.hmac.Reset() +} + +func (t truncatingMAC) Size() int { + return t.length +} + +func (t truncatingMAC) BlockSize() int { return t.hmac.BlockSize() } + +var macModes = map[string]*macMode{ + "hmac-sha2-256-etm@openssh.com": {32, true, func(key []byte) hash.Hash { + return hmac.New(sha256.New, key) + }}, + "hmac-sha2-256": {32, false, func(key []byte) hash.Hash { + return hmac.New(sha256.New, key) + }}, + "hmac-sha1": {20, false, func(key []byte) hash.Hash { + return hmac.New(sha1.New, key) + }}, + "hmac-sha1-96": {20, false, func(key []byte) hash.Hash { + return truncatingMAC{12, hmac.New(sha1.New, key)} + }}, +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/messages.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/messages.go new file mode 100644 index 0000000000000000000000000000000000000000..08d28117305d9d3ec4c6cfeef36931203e1aac96 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/messages.go @@ -0,0 +1,766 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "bytes" + "encoding/binary" + "errors" + "fmt" + "io" + "math/big" + "reflect" + "strconv" + "strings" +) + +// These are SSH message type numbers. They are scattered around several +// documents but many were taken from [SSH-PARAMETERS]. +const ( + msgIgnore = 2 + msgUnimplemented = 3 + msgDebug = 4 + msgNewKeys = 21 +) + +// SSH messages: +// +// These structures mirror the wire format of the corresponding SSH messages. +// They are marshaled using reflection with the marshal and unmarshal functions +// in this file. The only wrinkle is that a final member of type []byte with a +// ssh tag of "rest" receives the remainder of a packet when unmarshaling. + +// See RFC 4253, section 11.1. +const msgDisconnect = 1 + +// disconnectMsg is the message that signals a disconnect. It is also +// the error type returned from mux.Wait() +type disconnectMsg struct { + Reason uint32 `sshtype:"1"` + Message string + Language string +} + +func (d *disconnectMsg) Error() string { + return fmt.Sprintf("ssh: disconnect, reason %d: %s", d.Reason, d.Message) +} + +// See RFC 4253, section 7.1. +const msgKexInit = 20 + +type kexInitMsg struct { + Cookie [16]byte `sshtype:"20"` + KexAlgos []string + ServerHostKeyAlgos []string + CiphersClientServer []string + CiphersServerClient []string + MACsClientServer []string + MACsServerClient []string + CompressionClientServer []string + CompressionServerClient []string + LanguagesClientServer []string + LanguagesServerClient []string + FirstKexFollows bool + Reserved uint32 +} + +// See RFC 4253, section 8. + +// Diffie-Helman +const msgKexDHInit = 30 + +type kexDHInitMsg struct { + X *big.Int `sshtype:"30"` +} + +const msgKexECDHInit = 30 + +type kexECDHInitMsg struct { + ClientPubKey []byte `sshtype:"30"` +} + +const msgKexECDHReply = 31 + +type kexECDHReplyMsg struct { + HostKey []byte `sshtype:"31"` + EphemeralPubKey []byte + Signature []byte +} + +const msgKexDHReply = 31 + +type kexDHReplyMsg struct { + HostKey []byte `sshtype:"31"` + Y *big.Int + Signature []byte +} + +// See RFC 4253, section 10. +const msgServiceRequest = 5 + +type serviceRequestMsg struct { + Service string `sshtype:"5"` +} + +// See RFC 4253, section 10. +const msgServiceAccept = 6 + +type serviceAcceptMsg struct { + Service string `sshtype:"6"` +} + +// See RFC 4252, section 5. +const msgUserAuthRequest = 50 + +type userAuthRequestMsg struct { + User string `sshtype:"50"` + Service string + Method string + Payload []byte `ssh:"rest"` +} + +// Used for debug printouts of packets. +type userAuthSuccessMsg struct { +} + +// See RFC 4252, section 5.1 +const msgUserAuthFailure = 51 + +type userAuthFailureMsg struct { + Methods []string `sshtype:"51"` + PartialSuccess bool +} + +// See RFC 4252, section 5.1 +const msgUserAuthSuccess = 52 + +// See RFC 4252, section 5.4 +const msgUserAuthBanner = 53 + +type userAuthBannerMsg struct { + Message string `sshtype:"53"` + // unused, but required to allow message parsing + Language string +} + +// See RFC 4256, section 3.2 +const msgUserAuthInfoRequest = 60 +const msgUserAuthInfoResponse = 61 + +type userAuthInfoRequestMsg struct { + User string `sshtype:"60"` + Instruction string + DeprecatedLanguage string + NumPrompts uint32 + Prompts []byte `ssh:"rest"` +} + +// See RFC 4254, section 5.1. +const msgChannelOpen = 90 + +type channelOpenMsg struct { + ChanType string `sshtype:"90"` + PeersID uint32 + PeersWindow uint32 + MaxPacketSize uint32 + TypeSpecificData []byte `ssh:"rest"` +} + +const msgChannelExtendedData = 95 +const msgChannelData = 94 + +// Used for debug print outs of packets. +type channelDataMsg struct { + PeersID uint32 `sshtype:"94"` + Length uint32 + Rest []byte `ssh:"rest"` +} + +// See RFC 4254, section 5.1. +const msgChannelOpenConfirm = 91 + +type channelOpenConfirmMsg struct { + PeersID uint32 `sshtype:"91"` + MyID uint32 + MyWindow uint32 + MaxPacketSize uint32 + TypeSpecificData []byte `ssh:"rest"` +} + +// See RFC 4254, section 5.1. +const msgChannelOpenFailure = 92 + +type channelOpenFailureMsg struct { + PeersID uint32 `sshtype:"92"` + Reason RejectionReason + Message string + Language string +} + +const msgChannelRequest = 98 + +type channelRequestMsg struct { + PeersID uint32 `sshtype:"98"` + Request string + WantReply bool + RequestSpecificData []byte `ssh:"rest"` +} + +// See RFC 4254, section 5.4. +const msgChannelSuccess = 99 + +type channelRequestSuccessMsg struct { + PeersID uint32 `sshtype:"99"` +} + +// See RFC 4254, section 5.4. +const msgChannelFailure = 100 + +type channelRequestFailureMsg struct { + PeersID uint32 `sshtype:"100"` +} + +// See RFC 4254, section 5.3 +const msgChannelClose = 97 + +type channelCloseMsg struct { + PeersID uint32 `sshtype:"97"` +} + +// See RFC 4254, section 5.3 +const msgChannelEOF = 96 + +type channelEOFMsg struct { + PeersID uint32 `sshtype:"96"` +} + +// See RFC 4254, section 4 +const msgGlobalRequest = 80 + +type globalRequestMsg struct { + Type string `sshtype:"80"` + WantReply bool + Data []byte `ssh:"rest"` +} + +// See RFC 4254, section 4 +const msgRequestSuccess = 81 + +type globalRequestSuccessMsg struct { + Data []byte `ssh:"rest" sshtype:"81"` +} + +// See RFC 4254, section 4 +const msgRequestFailure = 82 + +type globalRequestFailureMsg struct { + Data []byte `ssh:"rest" sshtype:"82"` +} + +// See RFC 4254, section 5.2 +const msgChannelWindowAdjust = 93 + +type windowAdjustMsg struct { + PeersID uint32 `sshtype:"93"` + AdditionalBytes uint32 +} + +// See RFC 4252, section 7 +const msgUserAuthPubKeyOk = 60 + +type userAuthPubKeyOkMsg struct { + Algo string `sshtype:"60"` + PubKey []byte +} + +// typeTags returns the possible type bytes for the given reflect.Type, which +// should be a struct. The possible values are separated by a '|' character. +func typeTags(structType reflect.Type) (tags []byte) { + tagStr := structType.Field(0).Tag.Get("sshtype") + + for _, tag := range strings.Split(tagStr, "|") { + i, err := strconv.Atoi(tag) + if err == nil { + tags = append(tags, byte(i)) + } + } + + return tags +} + +func fieldError(t reflect.Type, field int, problem string) error { + if problem != "" { + problem = ": " + problem + } + return fmt.Errorf("ssh: unmarshal error for field %s of type %s%s", t.Field(field).Name, t.Name(), problem) +} + +var errShortRead = errors.New("ssh: short read") + +// Unmarshal parses data in SSH wire format into a structure. The out +// argument should be a pointer to struct. If the first member of the +// struct has the "sshtype" tag set to a '|'-separated set of numbers +// in decimal, the packet must start with one of those numbers. In +// case of error, Unmarshal returns a ParseError or +// UnexpectedMessageError. +func Unmarshal(data []byte, out interface{}) error { + v := reflect.ValueOf(out).Elem() + structType := v.Type() + expectedTypes := typeTags(structType) + + var expectedType byte + if len(expectedTypes) > 0 { + expectedType = expectedTypes[0] + } + + if len(data) == 0 { + return parseError(expectedType) + } + + if len(expectedTypes) > 0 { + goodType := false + for _, e := range expectedTypes { + if e > 0 && data[0] == e { + goodType = true + break + } + } + if !goodType { + return fmt.Errorf("ssh: unexpected message type %d (expected one of %v)", data[0], expectedTypes) + } + data = data[1:] + } + + var ok bool + for i := 0; i < v.NumField(); i++ { + field := v.Field(i) + t := field.Type() + switch t.Kind() { + case reflect.Bool: + if len(data) < 1 { + return errShortRead + } + field.SetBool(data[0] != 0) + data = data[1:] + case reflect.Array: + if t.Elem().Kind() != reflect.Uint8 { + return fieldError(structType, i, "array of unsupported type") + } + if len(data) < t.Len() { + return errShortRead + } + for j, n := 0, t.Len(); j < n; j++ { + field.Index(j).Set(reflect.ValueOf(data[j])) + } + data = data[t.Len():] + case reflect.Uint64: + var u64 uint64 + if u64, data, ok = parseUint64(data); !ok { + return errShortRead + } + field.SetUint(u64) + case reflect.Uint32: + var u32 uint32 + if u32, data, ok = parseUint32(data); !ok { + return errShortRead + } + field.SetUint(uint64(u32)) + case reflect.Uint8: + if len(data) < 1 { + return errShortRead + } + field.SetUint(uint64(data[0])) + data = data[1:] + case reflect.String: + var s []byte + if s, data, ok = parseString(data); !ok { + return fieldError(structType, i, "") + } + field.SetString(string(s)) + case reflect.Slice: + switch t.Elem().Kind() { + case reflect.Uint8: + if structType.Field(i).Tag.Get("ssh") == "rest" { + field.Set(reflect.ValueOf(data)) + data = nil + } else { + var s []byte + if s, data, ok = parseString(data); !ok { + return errShortRead + } + field.Set(reflect.ValueOf(s)) + } + case reflect.String: + var nl []string + if nl, data, ok = parseNameList(data); !ok { + return errShortRead + } + field.Set(reflect.ValueOf(nl)) + default: + return fieldError(structType, i, "slice of unsupported type") + } + case reflect.Ptr: + if t == bigIntType { + var n *big.Int + if n, data, ok = parseInt(data); !ok { + return errShortRead + } + field.Set(reflect.ValueOf(n)) + } else { + return fieldError(structType, i, "pointer to unsupported type") + } + default: + return fieldError(structType, i, fmt.Sprintf("unsupported type: %v", t)) + } + } + + if len(data) != 0 { + return parseError(expectedType) + } + + return nil +} + +// Marshal serializes the message in msg to SSH wire format. The msg +// argument should be a struct or pointer to struct. If the first +// member has the "sshtype" tag set to a number in decimal, that +// number is prepended to the result. If the last of member has the +// "ssh" tag set to "rest", its contents are appended to the output. +func Marshal(msg interface{}) []byte { + out := make([]byte, 0, 64) + return marshalStruct(out, msg) +} + +func marshalStruct(out []byte, msg interface{}) []byte { + v := reflect.Indirect(reflect.ValueOf(msg)) + msgTypes := typeTags(v.Type()) + if len(msgTypes) > 0 { + out = append(out, msgTypes[0]) + } + + for i, n := 0, v.NumField(); i < n; i++ { + field := v.Field(i) + switch t := field.Type(); t.Kind() { + case reflect.Bool: + var v uint8 + if field.Bool() { + v = 1 + } + out = append(out, v) + case reflect.Array: + if t.Elem().Kind() != reflect.Uint8 { + panic(fmt.Sprintf("array of non-uint8 in field %d: %T", i, field.Interface())) + } + for j, l := 0, t.Len(); j < l; j++ { + out = append(out, uint8(field.Index(j).Uint())) + } + case reflect.Uint32: + out = appendU32(out, uint32(field.Uint())) + case reflect.Uint64: + out = appendU64(out, uint64(field.Uint())) + case reflect.Uint8: + out = append(out, uint8(field.Uint())) + case reflect.String: + s := field.String() + out = appendInt(out, len(s)) + out = append(out, s...) + case reflect.Slice: + switch t.Elem().Kind() { + case reflect.Uint8: + if v.Type().Field(i).Tag.Get("ssh") != "rest" { + out = appendInt(out, field.Len()) + } + out = append(out, field.Bytes()...) + case reflect.String: + offset := len(out) + out = appendU32(out, 0) + if n := field.Len(); n > 0 { + for j := 0; j < n; j++ { + f := field.Index(j) + if j != 0 { + out = append(out, ',') + } + out = append(out, f.String()...) + } + // overwrite length value + binary.BigEndian.PutUint32(out[offset:], uint32(len(out)-offset-4)) + } + default: + panic(fmt.Sprintf("slice of unknown type in field %d: %T", i, field.Interface())) + } + case reflect.Ptr: + if t == bigIntType { + var n *big.Int + nValue := reflect.ValueOf(&n) + nValue.Elem().Set(field) + needed := intLength(n) + oldLength := len(out) + + if cap(out)-len(out) < needed { + newOut := make([]byte, len(out), 2*(len(out)+needed)) + copy(newOut, out) + out = newOut + } + out = out[:oldLength+needed] + marshalInt(out[oldLength:], n) + } else { + panic(fmt.Sprintf("pointer to unknown type in field %d: %T", i, field.Interface())) + } + } + } + + return out +} + +var bigOne = big.NewInt(1) + +func parseString(in []byte) (out, rest []byte, ok bool) { + if len(in) < 4 { + return + } + length := binary.BigEndian.Uint32(in) + in = in[4:] + if uint32(len(in)) < length { + return + } + out = in[:length] + rest = in[length:] + ok = true + return +} + +var ( + comma = []byte{','} + emptyNameList = []string{} +) + +func parseNameList(in []byte) (out []string, rest []byte, ok bool) { + contents, rest, ok := parseString(in) + if !ok { + return + } + if len(contents) == 0 { + out = emptyNameList + return + } + parts := bytes.Split(contents, comma) + out = make([]string, len(parts)) + for i, part := range parts { + out[i] = string(part) + } + return +} + +func parseInt(in []byte) (out *big.Int, rest []byte, ok bool) { + contents, rest, ok := parseString(in) + if !ok { + return + } + out = new(big.Int) + + if len(contents) > 0 && contents[0]&0x80 == 0x80 { + // This is a negative number + notBytes := make([]byte, len(contents)) + for i := range notBytes { + notBytes[i] = ^contents[i] + } + out.SetBytes(notBytes) + out.Add(out, bigOne) + out.Neg(out) + } else { + // Positive number + out.SetBytes(contents) + } + ok = true + return +} + +func parseUint32(in []byte) (uint32, []byte, bool) { + if len(in) < 4 { + return 0, nil, false + } + return binary.BigEndian.Uint32(in), in[4:], true +} + +func parseUint64(in []byte) (uint64, []byte, bool) { + if len(in) < 8 { + return 0, nil, false + } + return binary.BigEndian.Uint64(in), in[8:], true +} + +func intLength(n *big.Int) int { + length := 4 /* length bytes */ + if n.Sign() < 0 { + nMinus1 := new(big.Int).Neg(n) + nMinus1.Sub(nMinus1, bigOne) + bitLen := nMinus1.BitLen() + if bitLen%8 == 0 { + // The number will need 0xff padding + length++ + } + length += (bitLen + 7) / 8 + } else if n.Sign() == 0 { + // A zero is the zero length string + } else { + bitLen := n.BitLen() + if bitLen%8 == 0 { + // The number will need 0x00 padding + length++ + } + length += (bitLen + 7) / 8 + } + + return length +} + +func marshalUint32(to []byte, n uint32) []byte { + binary.BigEndian.PutUint32(to, n) + return to[4:] +} + +func marshalUint64(to []byte, n uint64) []byte { + binary.BigEndian.PutUint64(to, n) + return to[8:] +} + +func marshalInt(to []byte, n *big.Int) []byte { + lengthBytes := to + to = to[4:] + length := 0 + + if n.Sign() < 0 { + // A negative number has to be converted to two's-complement + // form. So we'll subtract 1 and invert. If the + // most-significant-bit isn't set then we'll need to pad the + // beginning with 0xff in order to keep the number negative. + nMinus1 := new(big.Int).Neg(n) + nMinus1.Sub(nMinus1, bigOne) + bytes := nMinus1.Bytes() + for i := range bytes { + bytes[i] ^= 0xff + } + if len(bytes) == 0 || bytes[0]&0x80 == 0 { + to[0] = 0xff + to = to[1:] + length++ + } + nBytes := copy(to, bytes) + to = to[nBytes:] + length += nBytes + } else if n.Sign() == 0 { + // A zero is the zero length string + } else { + bytes := n.Bytes() + if len(bytes) > 0 && bytes[0]&0x80 != 0 { + // We'll have to pad this with a 0x00 in order to + // stop it looking like a negative number. + to[0] = 0 + to = to[1:] + length++ + } + nBytes := copy(to, bytes) + to = to[nBytes:] + length += nBytes + } + + lengthBytes[0] = byte(length >> 24) + lengthBytes[1] = byte(length >> 16) + lengthBytes[2] = byte(length >> 8) + lengthBytes[3] = byte(length) + return to +} + +func writeInt(w io.Writer, n *big.Int) { + length := intLength(n) + buf := make([]byte, length) + marshalInt(buf, n) + w.Write(buf) +} + +func writeString(w io.Writer, s []byte) { + var lengthBytes [4]byte + lengthBytes[0] = byte(len(s) >> 24) + lengthBytes[1] = byte(len(s) >> 16) + lengthBytes[2] = byte(len(s) >> 8) + lengthBytes[3] = byte(len(s)) + w.Write(lengthBytes[:]) + w.Write(s) +} + +func stringLength(n int) int { + return 4 + n +} + +func marshalString(to []byte, s []byte) []byte { + to[0] = byte(len(s) >> 24) + to[1] = byte(len(s) >> 16) + to[2] = byte(len(s) >> 8) + to[3] = byte(len(s)) + to = to[4:] + copy(to, s) + return to[len(s):] +} + +var bigIntType = reflect.TypeOf((*big.Int)(nil)) + +// Decode a packet into its corresponding message. +func decode(packet []byte) (interface{}, error) { + var msg interface{} + switch packet[0] { + case msgDisconnect: + msg = new(disconnectMsg) + case msgServiceRequest: + msg = new(serviceRequestMsg) + case msgServiceAccept: + msg = new(serviceAcceptMsg) + case msgKexInit: + msg = new(kexInitMsg) + case msgKexDHInit: + msg = new(kexDHInitMsg) + case msgKexDHReply: + msg = new(kexDHReplyMsg) + case msgUserAuthRequest: + msg = new(userAuthRequestMsg) + case msgUserAuthSuccess: + return new(userAuthSuccessMsg), nil + case msgUserAuthFailure: + msg = new(userAuthFailureMsg) + case msgUserAuthPubKeyOk: + msg = new(userAuthPubKeyOkMsg) + case msgGlobalRequest: + msg = new(globalRequestMsg) + case msgRequestSuccess: + msg = new(globalRequestSuccessMsg) + case msgRequestFailure: + msg = new(globalRequestFailureMsg) + case msgChannelOpen: + msg = new(channelOpenMsg) + case msgChannelData: + msg = new(channelDataMsg) + case msgChannelOpenConfirm: + msg = new(channelOpenConfirmMsg) + case msgChannelOpenFailure: + msg = new(channelOpenFailureMsg) + case msgChannelWindowAdjust: + msg = new(windowAdjustMsg) + case msgChannelEOF: + msg = new(channelEOFMsg) + case msgChannelClose: + msg = new(channelCloseMsg) + case msgChannelRequest: + msg = new(channelRequestMsg) + case msgChannelSuccess: + msg = new(channelRequestSuccessMsg) + case msgChannelFailure: + msg = new(channelRequestFailureMsg) + default: + return nil, unexpectedMessageError(0, packet[0]) + } + if err := Unmarshal(packet, msg); err != nil { + return nil, err + } + return msg, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/mux.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/mux.go new file mode 100644 index 0000000000000000000000000000000000000000..f19016270e8f9a27e159277a14ef60c771ed1ba5 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/mux.go @@ -0,0 +1,330 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "encoding/binary" + "fmt" + "io" + "log" + "sync" + "sync/atomic" +) + +// debugMux, if set, causes messages in the connection protocol to be +// logged. +const debugMux = false + +// chanList is a thread safe channel list. +type chanList struct { + // protects concurrent access to chans + sync.Mutex + + // chans are indexed by the local id of the channel, which the + // other side should send in the PeersId field. + chans []*channel + + // This is a debugging aid: it offsets all IDs by this + // amount. This helps distinguish otherwise identical + // server/client muxes + offset uint32 +} + +// Assigns a channel ID to the given channel. +func (c *chanList) add(ch *channel) uint32 { + c.Lock() + defer c.Unlock() + for i := range c.chans { + if c.chans[i] == nil { + c.chans[i] = ch + return uint32(i) + c.offset + } + } + c.chans = append(c.chans, ch) + return uint32(len(c.chans)-1) + c.offset +} + +// getChan returns the channel for the given ID. +func (c *chanList) getChan(id uint32) *channel { + id -= c.offset + + c.Lock() + defer c.Unlock() + if id < uint32(len(c.chans)) { + return c.chans[id] + } + return nil +} + +func (c *chanList) remove(id uint32) { + id -= c.offset + c.Lock() + if id < uint32(len(c.chans)) { + c.chans[id] = nil + } + c.Unlock() +} + +// dropAll forgets all channels it knows, returning them in a slice. +func (c *chanList) dropAll() []*channel { + c.Lock() + defer c.Unlock() + var r []*channel + + for _, ch := range c.chans { + if ch == nil { + continue + } + r = append(r, ch) + } + c.chans = nil + return r +} + +// mux represents the state for the SSH connection protocol, which +// multiplexes many channels onto a single packet transport. +type mux struct { + conn packetConn + chanList chanList + + incomingChannels chan NewChannel + + globalSentMu sync.Mutex + globalResponses chan interface{} + incomingRequests chan *Request + + errCond *sync.Cond + err error +} + +// When debugging, each new chanList instantiation has a different +// offset. +var globalOff uint32 + +func (m *mux) Wait() error { + m.errCond.L.Lock() + defer m.errCond.L.Unlock() + for m.err == nil { + m.errCond.Wait() + } + return m.err +} + +// newMux returns a mux that runs over the given connection. +func newMux(p packetConn) *mux { + m := &mux{ + conn: p, + incomingChannels: make(chan NewChannel, chanSize), + globalResponses: make(chan interface{}, 1), + incomingRequests: make(chan *Request, chanSize), + errCond: newCond(), + } + if debugMux { + m.chanList.offset = atomic.AddUint32(&globalOff, 1) + } + + go m.loop() + return m +} + +func (m *mux) sendMessage(msg interface{}) error { + p := Marshal(msg) + if debugMux { + log.Printf("send global(%d): %#v", m.chanList.offset, msg) + } + return m.conn.writePacket(p) +} + +func (m *mux) SendRequest(name string, wantReply bool, payload []byte) (bool, []byte, error) { + if wantReply { + m.globalSentMu.Lock() + defer m.globalSentMu.Unlock() + } + + if err := m.sendMessage(globalRequestMsg{ + Type: name, + WantReply: wantReply, + Data: payload, + }); err != nil { + return false, nil, err + } + + if !wantReply { + return false, nil, nil + } + + msg, ok := <-m.globalResponses + if !ok { + return false, nil, io.EOF + } + switch msg := msg.(type) { + case *globalRequestFailureMsg: + return false, msg.Data, nil + case *globalRequestSuccessMsg: + return true, msg.Data, nil + default: + return false, nil, fmt.Errorf("ssh: unexpected response to request: %#v", msg) + } +} + +// ackRequest must be called after processing a global request that +// has WantReply set. +func (m *mux) ackRequest(ok bool, data []byte) error { + if ok { + return m.sendMessage(globalRequestSuccessMsg{Data: data}) + } + return m.sendMessage(globalRequestFailureMsg{Data: data}) +} + +func (m *mux) Close() error { + return m.conn.Close() +} + +// loop runs the connection machine. It will process packets until an +// error is encountered. To synchronize on loop exit, use mux.Wait. +func (m *mux) loop() { + var err error + for err == nil { + err = m.onePacket() + } + + for _, ch := range m.chanList.dropAll() { + ch.close() + } + + close(m.incomingChannels) + close(m.incomingRequests) + close(m.globalResponses) + + m.conn.Close() + + m.errCond.L.Lock() + m.err = err + m.errCond.Broadcast() + m.errCond.L.Unlock() + + if debugMux { + log.Println("loop exit", err) + } +} + +// onePacket reads and processes one packet. +func (m *mux) onePacket() error { + packet, err := m.conn.readPacket() + if err != nil { + return err + } + + if debugMux { + if packet[0] == msgChannelData || packet[0] == msgChannelExtendedData { + log.Printf("decoding(%d): data packet - %d bytes", m.chanList.offset, len(packet)) + } else { + p, _ := decode(packet) + log.Printf("decoding(%d): %d %#v - %d bytes", m.chanList.offset, packet[0], p, len(packet)) + } + } + + switch packet[0] { + case msgChannelOpen: + return m.handleChannelOpen(packet) + case msgGlobalRequest, msgRequestSuccess, msgRequestFailure: + return m.handleGlobalPacket(packet) + } + + // assume a channel packet. + if len(packet) < 5 { + return parseError(packet[0]) + } + id := binary.BigEndian.Uint32(packet[1:]) + ch := m.chanList.getChan(id) + if ch == nil { + return fmt.Errorf("ssh: invalid channel %d", id) + } + + return ch.handlePacket(packet) +} + +func (m *mux) handleGlobalPacket(packet []byte) error { + msg, err := decode(packet) + if err != nil { + return err + } + + switch msg := msg.(type) { + case *globalRequestMsg: + m.incomingRequests <- &Request{ + Type: msg.Type, + WantReply: msg.WantReply, + Payload: msg.Data, + mux: m, + } + case *globalRequestSuccessMsg, *globalRequestFailureMsg: + m.globalResponses <- msg + default: + panic(fmt.Sprintf("not a global message %#v", msg)) + } + + return nil +} + +// handleChannelOpen schedules a channel to be Accept()ed. +func (m *mux) handleChannelOpen(packet []byte) error { + var msg channelOpenMsg + if err := Unmarshal(packet, &msg); err != nil { + return err + } + + if msg.MaxPacketSize < minPacketLength || msg.MaxPacketSize > 1<<31 { + failMsg := channelOpenFailureMsg{ + PeersID: msg.PeersID, + Reason: ConnectionFailed, + Message: "invalid request", + Language: "en_US.UTF-8", + } + return m.sendMessage(failMsg) + } + + c := m.newChannel(msg.ChanType, channelInbound, msg.TypeSpecificData) + c.remoteId = msg.PeersID + c.maxRemotePayload = msg.MaxPacketSize + c.remoteWin.add(msg.PeersWindow) + m.incomingChannels <- c + return nil +} + +func (m *mux) OpenChannel(chanType string, extra []byte) (Channel, <-chan *Request, error) { + ch, err := m.openChannel(chanType, extra) + if err != nil { + return nil, nil, err + } + + return ch, ch.incomingRequests, nil +} + +func (m *mux) openChannel(chanType string, extra []byte) (*channel, error) { + ch := m.newChannel(chanType, channelOutbound, extra) + + ch.maxIncomingPayload = channelMaxPacket + + open := channelOpenMsg{ + ChanType: chanType, + PeersWindow: ch.myWindow, + MaxPacketSize: ch.maxIncomingPayload, + TypeSpecificData: extra, + PeersID: ch.localId, + } + if err := m.sendMessage(open); err != nil { + return nil, err + } + + switch msg := (<-ch.msg).(type) { + case *channelOpenConfirmMsg: + return ch, nil + case *channelOpenFailureMsg: + return nil, &OpenChannelError{msg.Reason, msg.Message} + default: + return nil, fmt.Errorf("ssh: unexpected packet in response to channel open: %T", msg) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/server.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/server.go new file mode 100644 index 0000000000000000000000000000000000000000..122c03e70a705a81e462785803ad12f7bf3644a6 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/server.go @@ -0,0 +1,593 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "bytes" + "errors" + "fmt" + "io" + "net" + "strings" +) + +// The Permissions type holds fine-grained permissions that are +// specific to a user or a specific authentication method for a user. +// The Permissions value for a successful authentication attempt is +// available in ServerConn, so it can be used to pass information from +// the user-authentication phase to the application layer. +type Permissions struct { + // CriticalOptions indicate restrictions to the default + // permissions, and are typically used in conjunction with + // user certificates. The standard for SSH certificates + // defines "force-command" (only allow the given command to + // execute) and "source-address" (only allow connections from + // the given address). The SSH package currently only enforces + // the "source-address" critical option. It is up to server + // implementations to enforce other critical options, such as + // "force-command", by checking them after the SSH handshake + // is successful. In general, SSH servers should reject + // connections that specify critical options that are unknown + // or not supported. + CriticalOptions map[string]string + + // Extensions are extra functionality that the server may + // offer on authenticated connections. Lack of support for an + // extension does not preclude authenticating a user. Common + // extensions are "permit-agent-forwarding", + // "permit-X11-forwarding". The Go SSH library currently does + // not act on any extension, and it is up to server + // implementations to honor them. Extensions can be used to + // pass data from the authentication callbacks to the server + // application layer. + Extensions map[string]string +} + +// ServerConfig holds server specific configuration data. +type ServerConfig struct { + // Config contains configuration shared between client and server. + Config + + hostKeys []Signer + + // NoClientAuth is true if clients are allowed to connect without + // authenticating. + NoClientAuth bool + + // MaxAuthTries specifies the maximum number of authentication attempts + // permitted per connection. If set to a negative number, the number of + // attempts are unlimited. If set to zero, the number of attempts are limited + // to 6. + MaxAuthTries int + + // PasswordCallback, if non-nil, is called when a user + // attempts to authenticate using a password. + PasswordCallback func(conn ConnMetadata, password []byte) (*Permissions, error) + + // PublicKeyCallback, if non-nil, is called when a client + // offers a public key for authentication. It must return a nil error + // if the given public key can be used to authenticate the + // given user. For example, see CertChecker.Authenticate. A + // call to this function does not guarantee that the key + // offered is in fact used to authenticate. To record any data + // depending on the public key, store it inside a + // Permissions.Extensions entry. + PublicKeyCallback func(conn ConnMetadata, key PublicKey) (*Permissions, error) + + // KeyboardInteractiveCallback, if non-nil, is called when + // keyboard-interactive authentication is selected (RFC + // 4256). The client object's Challenge function should be + // used to query the user. The callback may offer multiple + // Challenge rounds. To avoid information leaks, the client + // should be presented a challenge even if the user is + // unknown. + KeyboardInteractiveCallback func(conn ConnMetadata, client KeyboardInteractiveChallenge) (*Permissions, error) + + // AuthLogCallback, if non-nil, is called to log all authentication + // attempts. + AuthLogCallback func(conn ConnMetadata, method string, err error) + + // ServerVersion is the version identification string to announce in + // the public handshake. + // If empty, a reasonable default is used. + // Note that RFC 4253 section 4.2 requires that this string start with + // "SSH-2.0-". + ServerVersion string + + // BannerCallback, if present, is called and the return string is sent to + // the client after key exchange completed but before authentication. + BannerCallback func(conn ConnMetadata) string +} + +// AddHostKey adds a private key as a host key. If an existing host +// key exists with the same algorithm, it is overwritten. Each server +// config must have at least one host key. +func (s *ServerConfig) AddHostKey(key Signer) { + for i, k := range s.hostKeys { + if k.PublicKey().Type() == key.PublicKey().Type() { + s.hostKeys[i] = key + return + } + } + + s.hostKeys = append(s.hostKeys, key) +} + +// cachedPubKey contains the results of querying whether a public key is +// acceptable for a user. +type cachedPubKey struct { + user string + pubKeyData []byte + result error + perms *Permissions +} + +const maxCachedPubKeys = 16 + +// pubKeyCache caches tests for public keys. Since SSH clients +// will query whether a public key is acceptable before attempting to +// authenticate with it, we end up with duplicate queries for public +// key validity. The cache only applies to a single ServerConn. +type pubKeyCache struct { + keys []cachedPubKey +} + +// get returns the result for a given user/algo/key tuple. +func (c *pubKeyCache) get(user string, pubKeyData []byte) (cachedPubKey, bool) { + for _, k := range c.keys { + if k.user == user && bytes.Equal(k.pubKeyData, pubKeyData) { + return k, true + } + } + return cachedPubKey{}, false +} + +// add adds the given tuple to the cache. +func (c *pubKeyCache) add(candidate cachedPubKey) { + if len(c.keys) < maxCachedPubKeys { + c.keys = append(c.keys, candidate) + } +} + +// ServerConn is an authenticated SSH connection, as seen from the +// server +type ServerConn struct { + Conn + + // If the succeeding authentication callback returned a + // non-nil Permissions pointer, it is stored here. + Permissions *Permissions +} + +// NewServerConn starts a new SSH server with c as the underlying +// transport. It starts with a handshake and, if the handshake is +// unsuccessful, it closes the connection and returns an error. The +// Request and NewChannel channels must be serviced, or the connection +// will hang. +// +// The returned error may be of type *ServerAuthError for +// authentication errors. +func NewServerConn(c net.Conn, config *ServerConfig) (*ServerConn, <-chan NewChannel, <-chan *Request, error) { + fullConf := *config + fullConf.SetDefaults() + if fullConf.MaxAuthTries == 0 { + fullConf.MaxAuthTries = 6 + } + + s := &connection{ + sshConn: sshConn{conn: c}, + } + perms, err := s.serverHandshake(&fullConf) + if err != nil { + c.Close() + return nil, nil, nil, err + } + return &ServerConn{s, perms}, s.mux.incomingChannels, s.mux.incomingRequests, nil +} + +// signAndMarshal signs the data with the appropriate algorithm, +// and serializes the result in SSH wire format. +func signAndMarshal(k Signer, rand io.Reader, data []byte) ([]byte, error) { + sig, err := k.Sign(rand, data) + if err != nil { + return nil, err + } + + return Marshal(sig), nil +} + +// handshake performs key exchange and user authentication. +func (s *connection) serverHandshake(config *ServerConfig) (*Permissions, error) { + if len(config.hostKeys) == 0 { + return nil, errors.New("ssh: server has no host keys") + } + + if !config.NoClientAuth && config.PasswordCallback == nil && config.PublicKeyCallback == nil && config.KeyboardInteractiveCallback == nil { + return nil, errors.New("ssh: no authentication methods configured but NoClientAuth is also false") + } + + if config.ServerVersion != "" { + s.serverVersion = []byte(config.ServerVersion) + } else { + s.serverVersion = []byte(packageVersion) + } + var err error + s.clientVersion, err = exchangeVersions(s.sshConn.conn, s.serverVersion) + if err != nil { + return nil, err + } + + tr := newTransport(s.sshConn.conn, config.Rand, false /* not client */) + s.transport = newServerTransport(tr, s.clientVersion, s.serverVersion, config) + + if err := s.transport.waitSession(); err != nil { + return nil, err + } + + // We just did the key change, so the session ID is established. + s.sessionID = s.transport.getSessionID() + + var packet []byte + if packet, err = s.transport.readPacket(); err != nil { + return nil, err + } + + var serviceRequest serviceRequestMsg + if err = Unmarshal(packet, &serviceRequest); err != nil { + return nil, err + } + if serviceRequest.Service != serviceUserAuth { + return nil, errors.New("ssh: requested service '" + serviceRequest.Service + "' before authenticating") + } + serviceAccept := serviceAcceptMsg{ + Service: serviceUserAuth, + } + if err := s.transport.writePacket(Marshal(&serviceAccept)); err != nil { + return nil, err + } + + perms, err := s.serverAuthenticate(config) + if err != nil { + return nil, err + } + s.mux = newMux(s.transport) + return perms, err +} + +func isAcceptableAlgo(algo string) bool { + switch algo { + case KeyAlgoRSA, KeyAlgoDSA, KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521, KeyAlgoED25519, + CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01, CertAlgoED25519v01: + return true + } + return false +} + +func checkSourceAddress(addr net.Addr, sourceAddrs string) error { + if addr == nil { + return errors.New("ssh: no address known for client, but source-address match required") + } + + tcpAddr, ok := addr.(*net.TCPAddr) + if !ok { + return fmt.Errorf("ssh: remote address %v is not an TCP address when checking source-address match", addr) + } + + for _, sourceAddr := range strings.Split(sourceAddrs, ",") { + if allowedIP := net.ParseIP(sourceAddr); allowedIP != nil { + if allowedIP.Equal(tcpAddr.IP) { + return nil + } + } else { + _, ipNet, err := net.ParseCIDR(sourceAddr) + if err != nil { + return fmt.Errorf("ssh: error parsing source-address restriction %q: %v", sourceAddr, err) + } + + if ipNet.Contains(tcpAddr.IP) { + return nil + } + } + } + + return fmt.Errorf("ssh: remote address %v is not allowed because of source-address restriction", addr) +} + +// ServerAuthError represents server authentication errors and is +// sometimes returned by NewServerConn. It appends any authentication +// errors that may occur, and is returned if all of the authentication +// methods provided by the user failed to authenticate. +type ServerAuthError struct { + // Errors contains authentication errors returned by the authentication + // callback methods. The first entry is typically ErrNoAuth. + Errors []error +} + +func (l ServerAuthError) Error() string { + var errs []string + for _, err := range l.Errors { + errs = append(errs, err.Error()) + } + return "[" + strings.Join(errs, ", ") + "]" +} + +// ErrNoAuth is the error value returned if no +// authentication method has been passed yet. This happens as a normal +// part of the authentication loop, since the client first tries +// 'none' authentication to discover available methods. +// It is returned in ServerAuthError.Errors from NewServerConn. +var ErrNoAuth = errors.New("ssh: no auth passed yet") + +func (s *connection) serverAuthenticate(config *ServerConfig) (*Permissions, error) { + sessionID := s.transport.getSessionID() + var cache pubKeyCache + var perms *Permissions + + authFailures := 0 + var authErrs []error + var displayedBanner bool + +userAuthLoop: + for { + if authFailures >= config.MaxAuthTries && config.MaxAuthTries > 0 { + discMsg := &disconnectMsg{ + Reason: 2, + Message: "too many authentication failures", + } + + if err := s.transport.writePacket(Marshal(discMsg)); err != nil { + return nil, err + } + + return nil, discMsg + } + + var userAuthReq userAuthRequestMsg + if packet, err := s.transport.readPacket(); err != nil { + if err == io.EOF { + return nil, &ServerAuthError{Errors: authErrs} + } + return nil, err + } else if err = Unmarshal(packet, &userAuthReq); err != nil { + return nil, err + } + + if userAuthReq.Service != serviceSSH { + return nil, errors.New("ssh: client attempted to negotiate for unknown service: " + userAuthReq.Service) + } + + s.user = userAuthReq.User + + if !displayedBanner && config.BannerCallback != nil { + displayedBanner = true + msg := config.BannerCallback(s) + if msg != "" { + bannerMsg := &userAuthBannerMsg{ + Message: msg, + } + if err := s.transport.writePacket(Marshal(bannerMsg)); err != nil { + return nil, err + } + } + } + + perms = nil + authErr := ErrNoAuth + + switch userAuthReq.Method { + case "none": + if config.NoClientAuth { + authErr = nil + } + + // allow initial attempt of 'none' without penalty + if authFailures == 0 { + authFailures-- + } + case "password": + if config.PasswordCallback == nil { + authErr = errors.New("ssh: password auth not configured") + break + } + payload := userAuthReq.Payload + if len(payload) < 1 || payload[0] != 0 { + return nil, parseError(msgUserAuthRequest) + } + payload = payload[1:] + password, payload, ok := parseString(payload) + if !ok || len(payload) > 0 { + return nil, parseError(msgUserAuthRequest) + } + + perms, authErr = config.PasswordCallback(s, password) + case "keyboard-interactive": + if config.KeyboardInteractiveCallback == nil { + authErr = errors.New("ssh: keyboard-interactive auth not configured") + break + } + + prompter := &sshClientKeyboardInteractive{s} + perms, authErr = config.KeyboardInteractiveCallback(s, prompter.Challenge) + case "publickey": + if config.PublicKeyCallback == nil { + authErr = errors.New("ssh: publickey auth not configured") + break + } + payload := userAuthReq.Payload + if len(payload) < 1 { + return nil, parseError(msgUserAuthRequest) + } + isQuery := payload[0] == 0 + payload = payload[1:] + algoBytes, payload, ok := parseString(payload) + if !ok { + return nil, parseError(msgUserAuthRequest) + } + algo := string(algoBytes) + if !isAcceptableAlgo(algo) { + authErr = fmt.Errorf("ssh: algorithm %q not accepted", algo) + break + } + + pubKeyData, payload, ok := parseString(payload) + if !ok { + return nil, parseError(msgUserAuthRequest) + } + + pubKey, err := ParsePublicKey(pubKeyData) + if err != nil { + return nil, err + } + + candidate, ok := cache.get(s.user, pubKeyData) + if !ok { + candidate.user = s.user + candidate.pubKeyData = pubKeyData + candidate.perms, candidate.result = config.PublicKeyCallback(s, pubKey) + if candidate.result == nil && candidate.perms != nil && candidate.perms.CriticalOptions != nil && candidate.perms.CriticalOptions[sourceAddressCriticalOption] != "" { + candidate.result = checkSourceAddress( + s.RemoteAddr(), + candidate.perms.CriticalOptions[sourceAddressCriticalOption]) + } + cache.add(candidate) + } + + if isQuery { + // The client can query if the given public key + // would be okay. + + if len(payload) > 0 { + return nil, parseError(msgUserAuthRequest) + } + + if candidate.result == nil { + okMsg := userAuthPubKeyOkMsg{ + Algo: algo, + PubKey: pubKeyData, + } + if err = s.transport.writePacket(Marshal(&okMsg)); err != nil { + return nil, err + } + continue userAuthLoop + } + authErr = candidate.result + } else { + sig, payload, ok := parseSignature(payload) + if !ok || len(payload) > 0 { + return nil, parseError(msgUserAuthRequest) + } + // Ensure the public key algo and signature algo + // are supported. Compare the private key + // algorithm name that corresponds to algo with + // sig.Format. This is usually the same, but + // for certs, the names differ. + if !isAcceptableAlgo(sig.Format) { + break + } + signedData := buildDataSignedForAuth(sessionID, userAuthReq, algoBytes, pubKeyData) + + if err := pubKey.Verify(signedData, sig); err != nil { + return nil, err + } + + authErr = candidate.result + perms = candidate.perms + } + default: + authErr = fmt.Errorf("ssh: unknown method %q", userAuthReq.Method) + } + + authErrs = append(authErrs, authErr) + + if config.AuthLogCallback != nil { + config.AuthLogCallback(s, userAuthReq.Method, authErr) + } + + if authErr == nil { + break userAuthLoop + } + + authFailures++ + + var failureMsg userAuthFailureMsg + if config.PasswordCallback != nil { + failureMsg.Methods = append(failureMsg.Methods, "password") + } + if config.PublicKeyCallback != nil { + failureMsg.Methods = append(failureMsg.Methods, "publickey") + } + if config.KeyboardInteractiveCallback != nil { + failureMsg.Methods = append(failureMsg.Methods, "keyboard-interactive") + } + + if len(failureMsg.Methods) == 0 { + return nil, errors.New("ssh: no authentication methods configured but NoClientAuth is also false") + } + + if err := s.transport.writePacket(Marshal(&failureMsg)); err != nil { + return nil, err + } + } + + if err := s.transport.writePacket([]byte{msgUserAuthSuccess}); err != nil { + return nil, err + } + return perms, nil +} + +// sshClientKeyboardInteractive implements a ClientKeyboardInteractive by +// asking the client on the other side of a ServerConn. +type sshClientKeyboardInteractive struct { + *connection +} + +func (c *sshClientKeyboardInteractive) Challenge(user, instruction string, questions []string, echos []bool) (answers []string, err error) { + if len(questions) != len(echos) { + return nil, errors.New("ssh: echos and questions must have equal length") + } + + var prompts []byte + for i := range questions { + prompts = appendString(prompts, questions[i]) + prompts = appendBool(prompts, echos[i]) + } + + if err := c.transport.writePacket(Marshal(&userAuthInfoRequestMsg{ + Instruction: instruction, + NumPrompts: uint32(len(questions)), + Prompts: prompts, + })); err != nil { + return nil, err + } + + packet, err := c.transport.readPacket() + if err != nil { + return nil, err + } + if packet[0] != msgUserAuthInfoResponse { + return nil, unexpectedMessageError(msgUserAuthInfoResponse, packet[0]) + } + packet = packet[1:] + + n, packet, ok := parseUint32(packet) + if !ok || int(n) != len(questions) { + return nil, parseError(msgUserAuthInfoResponse) + } + + for i := uint32(0); i < n; i++ { + ans, rest, ok := parseString(packet) + if !ok { + return nil, parseError(msgUserAuthInfoResponse) + } + + answers = append(answers, string(ans)) + packet = rest + } + if len(packet) != 0 { + return nil, errors.New("ssh: junk at end of message") + } + + return answers, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/session.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/session.go new file mode 100644 index 0000000000000000000000000000000000000000..d3321f6b784b580fddbd7d3f1d4a6ca21b42e497 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/session.go @@ -0,0 +1,647 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +// Session implements an interactive session described in +// "RFC 4254, section 6". + +import ( + "bytes" + "encoding/binary" + "errors" + "fmt" + "io" + "io/ioutil" + "sync" +) + +type Signal string + +// POSIX signals as listed in RFC 4254 Section 6.10. +const ( + SIGABRT Signal = "ABRT" + SIGALRM Signal = "ALRM" + SIGFPE Signal = "FPE" + SIGHUP Signal = "HUP" + SIGILL Signal = "ILL" + SIGINT Signal = "INT" + SIGKILL Signal = "KILL" + SIGPIPE Signal = "PIPE" + SIGQUIT Signal = "QUIT" + SIGSEGV Signal = "SEGV" + SIGTERM Signal = "TERM" + SIGUSR1 Signal = "USR1" + SIGUSR2 Signal = "USR2" +) + +var signals = map[Signal]int{ + SIGABRT: 6, + SIGALRM: 14, + SIGFPE: 8, + SIGHUP: 1, + SIGILL: 4, + SIGINT: 2, + SIGKILL: 9, + SIGPIPE: 13, + SIGQUIT: 3, + SIGSEGV: 11, + SIGTERM: 15, +} + +type TerminalModes map[uint8]uint32 + +// POSIX terminal mode flags as listed in RFC 4254 Section 8. +const ( + tty_OP_END = 0 + VINTR = 1 + VQUIT = 2 + VERASE = 3 + VKILL = 4 + VEOF = 5 + VEOL = 6 + VEOL2 = 7 + VSTART = 8 + VSTOP = 9 + VSUSP = 10 + VDSUSP = 11 + VREPRINT = 12 + VWERASE = 13 + VLNEXT = 14 + VFLUSH = 15 + VSWTCH = 16 + VSTATUS = 17 + VDISCARD = 18 + IGNPAR = 30 + PARMRK = 31 + INPCK = 32 + ISTRIP = 33 + INLCR = 34 + IGNCR = 35 + ICRNL = 36 + IUCLC = 37 + IXON = 38 + IXANY = 39 + IXOFF = 40 + IMAXBEL = 41 + ISIG = 50 + ICANON = 51 + XCASE = 52 + ECHO = 53 + ECHOE = 54 + ECHOK = 55 + ECHONL = 56 + NOFLSH = 57 + TOSTOP = 58 + IEXTEN = 59 + ECHOCTL = 60 + ECHOKE = 61 + PENDIN = 62 + OPOST = 70 + OLCUC = 71 + ONLCR = 72 + OCRNL = 73 + ONOCR = 74 + ONLRET = 75 + CS7 = 90 + CS8 = 91 + PARENB = 92 + PARODD = 93 + TTY_OP_ISPEED = 128 + TTY_OP_OSPEED = 129 +) + +// A Session represents a connection to a remote command or shell. +type Session struct { + // Stdin specifies the remote process's standard input. + // If Stdin is nil, the remote process reads from an empty + // bytes.Buffer. + Stdin io.Reader + + // Stdout and Stderr specify the remote process's standard + // output and error. + // + // If either is nil, Run connects the corresponding file + // descriptor to an instance of ioutil.Discard. There is a + // fixed amount of buffering that is shared for the two streams. + // If either blocks it may eventually cause the remote + // command to block. + Stdout io.Writer + Stderr io.Writer + + ch Channel // the channel backing this session + started bool // true once Start, Run or Shell is invoked. + copyFuncs []func() error + errors chan error // one send per copyFunc + + // true if pipe method is active + stdinpipe, stdoutpipe, stderrpipe bool + + // stdinPipeWriter is non-nil if StdinPipe has not been called + // and Stdin was specified by the user; it is the write end of + // a pipe connecting Session.Stdin to the stdin channel. + stdinPipeWriter io.WriteCloser + + exitStatus chan error +} + +// SendRequest sends an out-of-band channel request on the SSH channel +// underlying the session. +func (s *Session) SendRequest(name string, wantReply bool, payload []byte) (bool, error) { + return s.ch.SendRequest(name, wantReply, payload) +} + +func (s *Session) Close() error { + return s.ch.Close() +} + +// RFC 4254 Section 6.4. +type setenvRequest struct { + Name string + Value string +} + +// Setenv sets an environment variable that will be applied to any +// command executed by Shell or Run. +func (s *Session) Setenv(name, value string) error { + msg := setenvRequest{ + Name: name, + Value: value, + } + ok, err := s.ch.SendRequest("env", true, Marshal(&msg)) + if err == nil && !ok { + err = errors.New("ssh: setenv failed") + } + return err +} + +// RFC 4254 Section 6.2. +type ptyRequestMsg struct { + Term string + Columns uint32 + Rows uint32 + Width uint32 + Height uint32 + Modelist string +} + +// RequestPty requests the association of a pty with the session on the remote host. +func (s *Session) RequestPty(term string, h, w int, termmodes TerminalModes) error { + var tm []byte + for k, v := range termmodes { + kv := struct { + Key byte + Val uint32 + }{k, v} + + tm = append(tm, Marshal(&kv)...) + } + tm = append(tm, tty_OP_END) + req := ptyRequestMsg{ + Term: term, + Columns: uint32(w), + Rows: uint32(h), + Width: uint32(w * 8), + Height: uint32(h * 8), + Modelist: string(tm), + } + ok, err := s.ch.SendRequest("pty-req", true, Marshal(&req)) + if err == nil && !ok { + err = errors.New("ssh: pty-req failed") + } + return err +} + +// RFC 4254 Section 6.5. +type subsystemRequestMsg struct { + Subsystem string +} + +// RequestSubsystem requests the association of a subsystem with the session on the remote host. +// A subsystem is a predefined command that runs in the background when the ssh session is initiated +func (s *Session) RequestSubsystem(subsystem string) error { + msg := subsystemRequestMsg{ + Subsystem: subsystem, + } + ok, err := s.ch.SendRequest("subsystem", true, Marshal(&msg)) + if err == nil && !ok { + err = errors.New("ssh: subsystem request failed") + } + return err +} + +// RFC 4254 Section 6.7. +type ptyWindowChangeMsg struct { + Columns uint32 + Rows uint32 + Width uint32 + Height uint32 +} + +// WindowChange informs the remote host about a terminal window dimension change to h rows and w columns. +func (s *Session) WindowChange(h, w int) error { + req := ptyWindowChangeMsg{ + Columns: uint32(w), + Rows: uint32(h), + Width: uint32(w * 8), + Height: uint32(h * 8), + } + _, err := s.ch.SendRequest("window-change", false, Marshal(&req)) + return err +} + +// RFC 4254 Section 6.9. +type signalMsg struct { + Signal string +} + +// Signal sends the given signal to the remote process. +// sig is one of the SIG* constants. +func (s *Session) Signal(sig Signal) error { + msg := signalMsg{ + Signal: string(sig), + } + + _, err := s.ch.SendRequest("signal", false, Marshal(&msg)) + return err +} + +// RFC 4254 Section 6.5. +type execMsg struct { + Command string +} + +// Start runs cmd on the remote host. Typically, the remote +// server passes cmd to the shell for interpretation. +// A Session only accepts one call to Run, Start or Shell. +func (s *Session) Start(cmd string) error { + if s.started { + return errors.New("ssh: session already started") + } + req := execMsg{ + Command: cmd, + } + + ok, err := s.ch.SendRequest("exec", true, Marshal(&req)) + if err == nil && !ok { + err = fmt.Errorf("ssh: command %v failed", cmd) + } + if err != nil { + return err + } + return s.start() +} + +// Run runs cmd on the remote host. Typically, the remote +// server passes cmd to the shell for interpretation. +// A Session only accepts one call to Run, Start, Shell, Output, +// or CombinedOutput. +// +// The returned error is nil if the command runs, has no problems +// copying stdin, stdout, and stderr, and exits with a zero exit +// status. +// +// If the remote server does not send an exit status, an error of type +// *ExitMissingError is returned. If the command completes +// unsuccessfully or is interrupted by a signal, the error is of type +// *ExitError. Other error types may be returned for I/O problems. +func (s *Session) Run(cmd string) error { + err := s.Start(cmd) + if err != nil { + return err + } + return s.Wait() +} + +// Output runs cmd on the remote host and returns its standard output. +func (s *Session) Output(cmd string) ([]byte, error) { + if s.Stdout != nil { + return nil, errors.New("ssh: Stdout already set") + } + var b bytes.Buffer + s.Stdout = &b + err := s.Run(cmd) + return b.Bytes(), err +} + +type singleWriter struct { + b bytes.Buffer + mu sync.Mutex +} + +func (w *singleWriter) Write(p []byte) (int, error) { + w.mu.Lock() + defer w.mu.Unlock() + return w.b.Write(p) +} + +// CombinedOutput runs cmd on the remote host and returns its combined +// standard output and standard error. +func (s *Session) CombinedOutput(cmd string) ([]byte, error) { + if s.Stdout != nil { + return nil, errors.New("ssh: Stdout already set") + } + if s.Stderr != nil { + return nil, errors.New("ssh: Stderr already set") + } + var b singleWriter + s.Stdout = &b + s.Stderr = &b + err := s.Run(cmd) + return b.b.Bytes(), err +} + +// Shell starts a login shell on the remote host. A Session only +// accepts one call to Run, Start, Shell, Output, or CombinedOutput. +func (s *Session) Shell() error { + if s.started { + return errors.New("ssh: session already started") + } + + ok, err := s.ch.SendRequest("shell", true, nil) + if err == nil && !ok { + return errors.New("ssh: could not start shell") + } + if err != nil { + return err + } + return s.start() +} + +func (s *Session) start() error { + s.started = true + + type F func(*Session) + for _, setupFd := range []F{(*Session).stdin, (*Session).stdout, (*Session).stderr} { + setupFd(s) + } + + s.errors = make(chan error, len(s.copyFuncs)) + for _, fn := range s.copyFuncs { + go func(fn func() error) { + s.errors <- fn() + }(fn) + } + return nil +} + +// Wait waits for the remote command to exit. +// +// The returned error is nil if the command runs, has no problems +// copying stdin, stdout, and stderr, and exits with a zero exit +// status. +// +// If the remote server does not send an exit status, an error of type +// *ExitMissingError is returned. If the command completes +// unsuccessfully or is interrupted by a signal, the error is of type +// *ExitError. Other error types may be returned for I/O problems. +func (s *Session) Wait() error { + if !s.started { + return errors.New("ssh: session not started") + } + waitErr := <-s.exitStatus + + if s.stdinPipeWriter != nil { + s.stdinPipeWriter.Close() + } + var copyError error + for range s.copyFuncs { + if err := <-s.errors; err != nil && copyError == nil { + copyError = err + } + } + if waitErr != nil { + return waitErr + } + return copyError +} + +func (s *Session) wait(reqs <-chan *Request) error { + wm := Waitmsg{status: -1} + // Wait for msg channel to be closed before returning. + for msg := range reqs { + switch msg.Type { + case "exit-status": + wm.status = int(binary.BigEndian.Uint32(msg.Payload)) + case "exit-signal": + var sigval struct { + Signal string + CoreDumped bool + Error string + Lang string + } + if err := Unmarshal(msg.Payload, &sigval); err != nil { + return err + } + + // Must sanitize strings? + wm.signal = sigval.Signal + wm.msg = sigval.Error + wm.lang = sigval.Lang + default: + // This handles keepalives and matches + // OpenSSH's behaviour. + if msg.WantReply { + msg.Reply(false, nil) + } + } + } + if wm.status == 0 { + return nil + } + if wm.status == -1 { + // exit-status was never sent from server + if wm.signal == "" { + // signal was not sent either. RFC 4254 + // section 6.10 recommends against this + // behavior, but it is allowed, so we let + // clients handle it. + return &ExitMissingError{} + } + wm.status = 128 + if _, ok := signals[Signal(wm.signal)]; ok { + wm.status += signals[Signal(wm.signal)] + } + } + + return &ExitError{wm} +} + +// ExitMissingError is returned if a session is torn down cleanly, but +// the server sends no confirmation of the exit status. +type ExitMissingError struct{} + +func (e *ExitMissingError) Error() string { + return "wait: remote command exited without exit status or exit signal" +} + +func (s *Session) stdin() { + if s.stdinpipe { + return + } + var stdin io.Reader + if s.Stdin == nil { + stdin = new(bytes.Buffer) + } else { + r, w := io.Pipe() + go func() { + _, err := io.Copy(w, s.Stdin) + w.CloseWithError(err) + }() + stdin, s.stdinPipeWriter = r, w + } + s.copyFuncs = append(s.copyFuncs, func() error { + _, err := io.Copy(s.ch, stdin) + if err1 := s.ch.CloseWrite(); err == nil && err1 != io.EOF { + err = err1 + } + return err + }) +} + +func (s *Session) stdout() { + if s.stdoutpipe { + return + } + if s.Stdout == nil { + s.Stdout = ioutil.Discard + } + s.copyFuncs = append(s.copyFuncs, func() error { + _, err := io.Copy(s.Stdout, s.ch) + return err + }) +} + +func (s *Session) stderr() { + if s.stderrpipe { + return + } + if s.Stderr == nil { + s.Stderr = ioutil.Discard + } + s.copyFuncs = append(s.copyFuncs, func() error { + _, err := io.Copy(s.Stderr, s.ch.Stderr()) + return err + }) +} + +// sessionStdin reroutes Close to CloseWrite. +type sessionStdin struct { + io.Writer + ch Channel +} + +func (s *sessionStdin) Close() error { + return s.ch.CloseWrite() +} + +// StdinPipe returns a pipe that will be connected to the +// remote command's standard input when the command starts. +func (s *Session) StdinPipe() (io.WriteCloser, error) { + if s.Stdin != nil { + return nil, errors.New("ssh: Stdin already set") + } + if s.started { + return nil, errors.New("ssh: StdinPipe after process started") + } + s.stdinpipe = true + return &sessionStdin{s.ch, s.ch}, nil +} + +// StdoutPipe returns a pipe that will be connected to the +// remote command's standard output when the command starts. +// There is a fixed amount of buffering that is shared between +// stdout and stderr streams. If the StdoutPipe reader is +// not serviced fast enough it may eventually cause the +// remote command to block. +func (s *Session) StdoutPipe() (io.Reader, error) { + if s.Stdout != nil { + return nil, errors.New("ssh: Stdout already set") + } + if s.started { + return nil, errors.New("ssh: StdoutPipe after process started") + } + s.stdoutpipe = true + return s.ch, nil +} + +// StderrPipe returns a pipe that will be connected to the +// remote command's standard error when the command starts. +// There is a fixed amount of buffering that is shared between +// stdout and stderr streams. If the StderrPipe reader is +// not serviced fast enough it may eventually cause the +// remote command to block. +func (s *Session) StderrPipe() (io.Reader, error) { + if s.Stderr != nil { + return nil, errors.New("ssh: Stderr already set") + } + if s.started { + return nil, errors.New("ssh: StderrPipe after process started") + } + s.stderrpipe = true + return s.ch.Stderr(), nil +} + +// newSession returns a new interactive session on the remote host. +func newSession(ch Channel, reqs <-chan *Request) (*Session, error) { + s := &Session{ + ch: ch, + } + s.exitStatus = make(chan error, 1) + go func() { + s.exitStatus <- s.wait(reqs) + }() + + return s, nil +} + +// An ExitError reports unsuccessful completion of a remote command. +type ExitError struct { + Waitmsg +} + +func (e *ExitError) Error() string { + return e.Waitmsg.String() +} + +// Waitmsg stores the information about an exited remote command +// as reported by Wait. +type Waitmsg struct { + status int + signal string + msg string + lang string +} + +// ExitStatus returns the exit status of the remote command. +func (w Waitmsg) ExitStatus() int { + return w.status +} + +// Signal returns the exit signal of the remote command if +// it was terminated violently. +func (w Waitmsg) Signal() string { + return w.signal +} + +// Msg returns the exit message given by the remote command +func (w Waitmsg) Msg() string { + return w.msg +} + +// Lang returns the language tag. See RFC 3066 +func (w Waitmsg) Lang() string { + return w.lang +} + +func (w Waitmsg) String() string { + str := fmt.Sprintf("Process exited with status %v", w.status) + if w.signal != "" { + str += fmt.Sprintf(" from signal %v", w.signal) + } + if w.msg != "" { + str += fmt.Sprintf(". Reason was: %v", w.msg) + } + return str +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/streamlocal.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/streamlocal.go new file mode 100644 index 0000000000000000000000000000000000000000..b171b330bc380ae8e7b57527307b3b133ca9c694 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/streamlocal.go @@ -0,0 +1,116 @@ +package ssh + +import ( + "errors" + "io" + "net" +) + +// streamLocalChannelOpenDirectMsg is a struct used for SSH_MSG_CHANNEL_OPEN message +// with "direct-streamlocal@openssh.com" string. +// +// See openssh-portable/PROTOCOL, section 2.4. connection: Unix domain socket forwarding +// https://github.com/openssh/openssh-portable/blob/master/PROTOCOL#L235 +type streamLocalChannelOpenDirectMsg struct { + socketPath string + reserved0 string + reserved1 uint32 +} + +// forwardedStreamLocalPayload is a struct used for SSH_MSG_CHANNEL_OPEN message +// with "forwarded-streamlocal@openssh.com" string. +type forwardedStreamLocalPayload struct { + SocketPath string + Reserved0 string +} + +// streamLocalChannelForwardMsg is a struct used for SSH2_MSG_GLOBAL_REQUEST message +// with "streamlocal-forward@openssh.com"/"cancel-streamlocal-forward@openssh.com" string. +type streamLocalChannelForwardMsg struct { + socketPath string +} + +// ListenUnix is similar to ListenTCP but uses a Unix domain socket. +func (c *Client) ListenUnix(socketPath string) (net.Listener, error) { + c.handleForwardsOnce.Do(c.handleForwards) + m := streamLocalChannelForwardMsg{ + socketPath, + } + // send message + ok, _, err := c.SendRequest("streamlocal-forward@openssh.com", true, Marshal(&m)) + if err != nil { + return nil, err + } + if !ok { + return nil, errors.New("ssh: streamlocal-forward@openssh.com request denied by peer") + } + ch := c.forwards.add(&net.UnixAddr{Name: socketPath, Net: "unix"}) + + return &unixListener{socketPath, c, ch}, nil +} + +func (c *Client) dialStreamLocal(socketPath string) (Channel, error) { + msg := streamLocalChannelOpenDirectMsg{ + socketPath: socketPath, + } + ch, in, err := c.OpenChannel("direct-streamlocal@openssh.com", Marshal(&msg)) + if err != nil { + return nil, err + } + go DiscardRequests(in) + return ch, err +} + +type unixListener struct { + socketPath string + + conn *Client + in <-chan forward +} + +// Accept waits for and returns the next connection to the listener. +func (l *unixListener) Accept() (net.Conn, error) { + s, ok := <-l.in + if !ok { + return nil, io.EOF + } + ch, incoming, err := s.newCh.Accept() + if err != nil { + return nil, err + } + go DiscardRequests(incoming) + + return &chanConn{ + Channel: ch, + laddr: &net.UnixAddr{ + Name: l.socketPath, + Net: "unix", + }, + raddr: &net.UnixAddr{ + Name: "@", + Net: "unix", + }, + }, nil +} + +// Close closes the listener. +func (l *unixListener) Close() error { + // this also closes the listener. + l.conn.forwards.remove(&net.UnixAddr{Name: l.socketPath, Net: "unix"}) + m := streamLocalChannelForwardMsg{ + l.socketPath, + } + ok, _, err := l.conn.SendRequest("cancel-streamlocal-forward@openssh.com", true, Marshal(&m)) + if err == nil && !ok { + err = errors.New("ssh: cancel-streamlocal-forward@openssh.com failed") + } + return err +} + +// Addr returns the listener's network address. +func (l *unixListener) Addr() net.Addr { + return &net.UnixAddr{ + Name: l.socketPath, + Net: "unix", + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/tcpip.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/tcpip.go new file mode 100644 index 0000000000000000000000000000000000000000..80d35f5ec187a4e51626685394f5da84ea02446b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/tcpip.go @@ -0,0 +1,474 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "errors" + "fmt" + "io" + "math/rand" + "net" + "strconv" + "strings" + "sync" + "time" +) + +// Listen requests the remote peer open a listening socket on +// addr. Incoming connections will be available by calling Accept on +// the returned net.Listener. The listener must be serviced, or the +// SSH connection may hang. +// N must be "tcp", "tcp4", "tcp6", or "unix". +func (c *Client) Listen(n, addr string) (net.Listener, error) { + switch n { + case "tcp", "tcp4", "tcp6": + laddr, err := net.ResolveTCPAddr(n, addr) + if err != nil { + return nil, err + } + return c.ListenTCP(laddr) + case "unix": + return c.ListenUnix(addr) + default: + return nil, fmt.Errorf("ssh: unsupported protocol: %s", n) + } +} + +// Automatic port allocation is broken with OpenSSH before 6.0. See +// also https://bugzilla.mindrot.org/show_bug.cgi?id=2017. In +// particular, OpenSSH 5.9 sends a channelOpenMsg with port number 0, +// rather than the actual port number. This means you can never open +// two different listeners with auto allocated ports. We work around +// this by trying explicit ports until we succeed. + +const openSSHPrefix = "OpenSSH_" + +var portRandomizer = rand.New(rand.NewSource(time.Now().UnixNano())) + +// isBrokenOpenSSHVersion returns true if the given version string +// specifies a version of OpenSSH that is known to have a bug in port +// forwarding. +func isBrokenOpenSSHVersion(versionStr string) bool { + i := strings.Index(versionStr, openSSHPrefix) + if i < 0 { + return false + } + i += len(openSSHPrefix) + j := i + for ; j < len(versionStr); j++ { + if versionStr[j] < '0' || versionStr[j] > '9' { + break + } + } + version, _ := strconv.Atoi(versionStr[i:j]) + return version < 6 +} + +// autoPortListenWorkaround simulates automatic port allocation by +// trying random ports repeatedly. +func (c *Client) autoPortListenWorkaround(laddr *net.TCPAddr) (net.Listener, error) { + var sshListener net.Listener + var err error + const tries = 10 + for i := 0; i < tries; i++ { + addr := *laddr + addr.Port = 1024 + portRandomizer.Intn(60000) + sshListener, err = c.ListenTCP(&addr) + if err == nil { + laddr.Port = addr.Port + return sshListener, err + } + } + return nil, fmt.Errorf("ssh: listen on random port failed after %d tries: %v", tries, err) +} + +// RFC 4254 7.1 +type channelForwardMsg struct { + addr string + rport uint32 +} + +// handleForwards starts goroutines handling forwarded connections. +// It's called on first use by (*Client).ListenTCP to not launch +// goroutines until needed. +func (c *Client) handleForwards() { + go c.forwards.handleChannels(c.HandleChannelOpen("forwarded-tcpip")) + go c.forwards.handleChannels(c.HandleChannelOpen("forwarded-streamlocal@openssh.com")) +} + +// ListenTCP requests the remote peer open a listening socket +// on laddr. Incoming connections will be available by calling +// Accept on the returned net.Listener. +func (c *Client) ListenTCP(laddr *net.TCPAddr) (net.Listener, error) { + c.handleForwardsOnce.Do(c.handleForwards) + if laddr.Port == 0 && isBrokenOpenSSHVersion(string(c.ServerVersion())) { + return c.autoPortListenWorkaround(laddr) + } + + m := channelForwardMsg{ + laddr.IP.String(), + uint32(laddr.Port), + } + // send message + ok, resp, err := c.SendRequest("tcpip-forward", true, Marshal(&m)) + if err != nil { + return nil, err + } + if !ok { + return nil, errors.New("ssh: tcpip-forward request denied by peer") + } + + // If the original port was 0, then the remote side will + // supply a real port number in the response. + if laddr.Port == 0 { + var p struct { + Port uint32 + } + if err := Unmarshal(resp, &p); err != nil { + return nil, err + } + laddr.Port = int(p.Port) + } + + // Register this forward, using the port number we obtained. + ch := c.forwards.add(laddr) + + return &tcpListener{laddr, c, ch}, nil +} + +// forwardList stores a mapping between remote +// forward requests and the tcpListeners. +type forwardList struct { + sync.Mutex + entries []forwardEntry +} + +// forwardEntry represents an established mapping of a laddr on a +// remote ssh server to a channel connected to a tcpListener. +type forwardEntry struct { + laddr net.Addr + c chan forward +} + +// forward represents an incoming forwarded tcpip connection. The +// arguments to add/remove/lookup should be address as specified in +// the original forward-request. +type forward struct { + newCh NewChannel // the ssh client channel underlying this forward + raddr net.Addr // the raddr of the incoming connection +} + +func (l *forwardList) add(addr net.Addr) chan forward { + l.Lock() + defer l.Unlock() + f := forwardEntry{ + laddr: addr, + c: make(chan forward, 1), + } + l.entries = append(l.entries, f) + return f.c +} + +// See RFC 4254, section 7.2 +type forwardedTCPPayload struct { + Addr string + Port uint32 + OriginAddr string + OriginPort uint32 +} + +// parseTCPAddr parses the originating address from the remote into a *net.TCPAddr. +func parseTCPAddr(addr string, port uint32) (*net.TCPAddr, error) { + if port == 0 || port > 65535 { + return nil, fmt.Errorf("ssh: port number out of range: %d", port) + } + ip := net.ParseIP(string(addr)) + if ip == nil { + return nil, fmt.Errorf("ssh: cannot parse IP address %q", addr) + } + return &net.TCPAddr{IP: ip, Port: int(port)}, nil +} + +func (l *forwardList) handleChannels(in <-chan NewChannel) { + for ch := range in { + var ( + laddr net.Addr + raddr net.Addr + err error + ) + switch channelType := ch.ChannelType(); channelType { + case "forwarded-tcpip": + var payload forwardedTCPPayload + if err = Unmarshal(ch.ExtraData(), &payload); err != nil { + ch.Reject(ConnectionFailed, "could not parse forwarded-tcpip payload: "+err.Error()) + continue + } + + // RFC 4254 section 7.2 specifies that incoming + // addresses should list the address, in string + // format. It is implied that this should be an IP + // address, as it would be impossible to connect to it + // otherwise. + laddr, err = parseTCPAddr(payload.Addr, payload.Port) + if err != nil { + ch.Reject(ConnectionFailed, err.Error()) + continue + } + raddr, err = parseTCPAddr(payload.OriginAddr, payload.OriginPort) + if err != nil { + ch.Reject(ConnectionFailed, err.Error()) + continue + } + + case "forwarded-streamlocal@openssh.com": + var payload forwardedStreamLocalPayload + if err = Unmarshal(ch.ExtraData(), &payload); err != nil { + ch.Reject(ConnectionFailed, "could not parse forwarded-streamlocal@openssh.com payload: "+err.Error()) + continue + } + laddr = &net.UnixAddr{ + Name: payload.SocketPath, + Net: "unix", + } + raddr = &net.UnixAddr{ + Name: "@", + Net: "unix", + } + default: + panic(fmt.Errorf("ssh: unknown channel type %s", channelType)) + } + if ok := l.forward(laddr, raddr, ch); !ok { + // Section 7.2, implementations MUST reject spurious incoming + // connections. + ch.Reject(Prohibited, "no forward for address") + continue + } + + } +} + +// remove removes the forward entry, and the channel feeding its +// listener. +func (l *forwardList) remove(addr net.Addr) { + l.Lock() + defer l.Unlock() + for i, f := range l.entries { + if addr.Network() == f.laddr.Network() && addr.String() == f.laddr.String() { + l.entries = append(l.entries[:i], l.entries[i+1:]...) + close(f.c) + return + } + } +} + +// closeAll closes and clears all forwards. +func (l *forwardList) closeAll() { + l.Lock() + defer l.Unlock() + for _, f := range l.entries { + close(f.c) + } + l.entries = nil +} + +func (l *forwardList) forward(laddr, raddr net.Addr, ch NewChannel) bool { + l.Lock() + defer l.Unlock() + for _, f := range l.entries { + if laddr.Network() == f.laddr.Network() && laddr.String() == f.laddr.String() { + f.c <- forward{newCh: ch, raddr: raddr} + return true + } + } + return false +} + +type tcpListener struct { + laddr *net.TCPAddr + + conn *Client + in <-chan forward +} + +// Accept waits for and returns the next connection to the listener. +func (l *tcpListener) Accept() (net.Conn, error) { + s, ok := <-l.in + if !ok { + return nil, io.EOF + } + ch, incoming, err := s.newCh.Accept() + if err != nil { + return nil, err + } + go DiscardRequests(incoming) + + return &chanConn{ + Channel: ch, + laddr: l.laddr, + raddr: s.raddr, + }, nil +} + +// Close closes the listener. +func (l *tcpListener) Close() error { + m := channelForwardMsg{ + l.laddr.IP.String(), + uint32(l.laddr.Port), + } + + // this also closes the listener. + l.conn.forwards.remove(l.laddr) + ok, _, err := l.conn.SendRequest("cancel-tcpip-forward", true, Marshal(&m)) + if err == nil && !ok { + err = errors.New("ssh: cancel-tcpip-forward failed") + } + return err +} + +// Addr returns the listener's network address. +func (l *tcpListener) Addr() net.Addr { + return l.laddr +} + +// Dial initiates a connection to the addr from the remote host. +// The resulting connection has a zero LocalAddr() and RemoteAddr(). +func (c *Client) Dial(n, addr string) (net.Conn, error) { + var ch Channel + switch n { + case "tcp", "tcp4", "tcp6": + // Parse the address into host and numeric port. + host, portString, err := net.SplitHostPort(addr) + if err != nil { + return nil, err + } + port, err := strconv.ParseUint(portString, 10, 16) + if err != nil { + return nil, err + } + ch, err = c.dial(net.IPv4zero.String(), 0, host, int(port)) + if err != nil { + return nil, err + } + // Use a zero address for local and remote address. + zeroAddr := &net.TCPAddr{ + IP: net.IPv4zero, + Port: 0, + } + return &chanConn{ + Channel: ch, + laddr: zeroAddr, + raddr: zeroAddr, + }, nil + case "unix": + var err error + ch, err = c.dialStreamLocal(addr) + if err != nil { + return nil, err + } + return &chanConn{ + Channel: ch, + laddr: &net.UnixAddr{ + Name: "@", + Net: "unix", + }, + raddr: &net.UnixAddr{ + Name: addr, + Net: "unix", + }, + }, nil + default: + return nil, fmt.Errorf("ssh: unsupported protocol: %s", n) + } +} + +// DialTCP connects to the remote address raddr on the network net, +// which must be "tcp", "tcp4", or "tcp6". If laddr is not nil, it is used +// as the local address for the connection. +func (c *Client) DialTCP(n string, laddr, raddr *net.TCPAddr) (net.Conn, error) { + if laddr == nil { + laddr = &net.TCPAddr{ + IP: net.IPv4zero, + Port: 0, + } + } + ch, err := c.dial(laddr.IP.String(), laddr.Port, raddr.IP.String(), raddr.Port) + if err != nil { + return nil, err + } + return &chanConn{ + Channel: ch, + laddr: laddr, + raddr: raddr, + }, nil +} + +// RFC 4254 7.2 +type channelOpenDirectMsg struct { + raddr string + rport uint32 + laddr string + lport uint32 +} + +func (c *Client) dial(laddr string, lport int, raddr string, rport int) (Channel, error) { + msg := channelOpenDirectMsg{ + raddr: raddr, + rport: uint32(rport), + laddr: laddr, + lport: uint32(lport), + } + ch, in, err := c.OpenChannel("direct-tcpip", Marshal(&msg)) + if err != nil { + return nil, err + } + go DiscardRequests(in) + return ch, err +} + +type tcpChan struct { + Channel // the backing channel +} + +// chanConn fulfills the net.Conn interface without +// the tcpChan having to hold laddr or raddr directly. +type chanConn struct { + Channel + laddr, raddr net.Addr +} + +// LocalAddr returns the local network address. +func (t *chanConn) LocalAddr() net.Addr { + return t.laddr +} + +// RemoteAddr returns the remote network address. +func (t *chanConn) RemoteAddr() net.Addr { + return t.raddr +} + +// SetDeadline sets the read and write deadlines associated +// with the connection. +func (t *chanConn) SetDeadline(deadline time.Time) error { + if err := t.SetReadDeadline(deadline); err != nil { + return err + } + return t.SetWriteDeadline(deadline) +} + +// SetReadDeadline sets the read deadline. +// A zero value for t means Read will not time out. +// After the deadline, the error from Read will implement net.Error +// with Timeout() == true. +func (t *chanConn) SetReadDeadline(deadline time.Time) error { + // for compatibility with previous version, + // the error message contains "tcpChan" + return errors.New("ssh: tcpChan: deadline not supported") +} + +// SetWriteDeadline exists to satisfy the net.Conn interface +// but is not implemented by this type. It always returns an error. +func (t *chanConn) SetWriteDeadline(deadline time.Time) error { + return errors.New("ssh: tcpChan: deadline not supported") +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/terminal/terminal.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/terminal/terminal.go new file mode 100644 index 0000000000000000000000000000000000000000..9a887598ff40437dae4a6a85dd8502e428917450 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/terminal/terminal.go @@ -0,0 +1,951 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package terminal + +import ( + "bytes" + "io" + "sync" + "unicode/utf8" +) + +// EscapeCodes contains escape sequences that can be written to the terminal in +// order to achieve different styles of text. +type EscapeCodes struct { + // Foreground colors + Black, Red, Green, Yellow, Blue, Magenta, Cyan, White []byte + + // Reset all attributes + Reset []byte +} + +var vt100EscapeCodes = EscapeCodes{ + Black: []byte{keyEscape, '[', '3', '0', 'm'}, + Red: []byte{keyEscape, '[', '3', '1', 'm'}, + Green: []byte{keyEscape, '[', '3', '2', 'm'}, + Yellow: []byte{keyEscape, '[', '3', '3', 'm'}, + Blue: []byte{keyEscape, '[', '3', '4', 'm'}, + Magenta: []byte{keyEscape, '[', '3', '5', 'm'}, + Cyan: []byte{keyEscape, '[', '3', '6', 'm'}, + White: []byte{keyEscape, '[', '3', '7', 'm'}, + + Reset: []byte{keyEscape, '[', '0', 'm'}, +} + +// Terminal contains the state for running a VT100 terminal that is capable of +// reading lines of input. +type Terminal struct { + // AutoCompleteCallback, if non-null, is called for each keypress with + // the full input line and the current position of the cursor (in + // bytes, as an index into |line|). If it returns ok=false, the key + // press is processed normally. Otherwise it returns a replacement line + // and the new cursor position. + AutoCompleteCallback func(line string, pos int, key rune) (newLine string, newPos int, ok bool) + + // Escape contains a pointer to the escape codes for this terminal. + // It's always a valid pointer, although the escape codes themselves + // may be empty if the terminal doesn't support them. + Escape *EscapeCodes + + // lock protects the terminal and the state in this object from + // concurrent processing of a key press and a Write() call. + lock sync.Mutex + + c io.ReadWriter + prompt []rune + + // line is the current line being entered. + line []rune + // pos is the logical position of the cursor in line + pos int + // echo is true if local echo is enabled + echo bool + // pasteActive is true iff there is a bracketed paste operation in + // progress. + pasteActive bool + + // cursorX contains the current X value of the cursor where the left + // edge is 0. cursorY contains the row number where the first row of + // the current line is 0. + cursorX, cursorY int + // maxLine is the greatest value of cursorY so far. + maxLine int + + termWidth, termHeight int + + // outBuf contains the terminal data to be sent. + outBuf []byte + // remainder contains the remainder of any partial key sequences after + // a read. It aliases into inBuf. + remainder []byte + inBuf [256]byte + + // history contains previously entered commands so that they can be + // accessed with the up and down keys. + history stRingBuffer + // historyIndex stores the currently accessed history entry, where zero + // means the immediately previous entry. + historyIndex int + // When navigating up and down the history it's possible to return to + // the incomplete, initial line. That value is stored in + // historyPending. + historyPending string +} + +// NewTerminal runs a VT100 terminal on the given ReadWriter. If the ReadWriter is +// a local terminal, that terminal must first have been put into raw mode. +// prompt is a string that is written at the start of each input line (i.e. +// "> "). +func NewTerminal(c io.ReadWriter, prompt string) *Terminal { + return &Terminal{ + Escape: &vt100EscapeCodes, + c: c, + prompt: []rune(prompt), + termWidth: 80, + termHeight: 24, + echo: true, + historyIndex: -1, + } +} + +const ( + keyCtrlD = 4 + keyCtrlU = 21 + keyEnter = '\r' + keyEscape = 27 + keyBackspace = 127 + keyUnknown = 0xd800 /* UTF-16 surrogate area */ + iota + keyUp + keyDown + keyLeft + keyRight + keyAltLeft + keyAltRight + keyHome + keyEnd + keyDeleteWord + keyDeleteLine + keyClearScreen + keyPasteStart + keyPasteEnd +) + +var ( + crlf = []byte{'\r', '\n'} + pasteStart = []byte{keyEscape, '[', '2', '0', '0', '~'} + pasteEnd = []byte{keyEscape, '[', '2', '0', '1', '~'} +) + +// bytesToKey tries to parse a key sequence from b. If successful, it returns +// the key and the remainder of the input. Otherwise it returns utf8.RuneError. +func bytesToKey(b []byte, pasteActive bool) (rune, []byte) { + if len(b) == 0 { + return utf8.RuneError, nil + } + + if !pasteActive { + switch b[0] { + case 1: // ^A + return keyHome, b[1:] + case 5: // ^E + return keyEnd, b[1:] + case 8: // ^H + return keyBackspace, b[1:] + case 11: // ^K + return keyDeleteLine, b[1:] + case 12: // ^L + return keyClearScreen, b[1:] + case 23: // ^W + return keyDeleteWord, b[1:] + } + } + + if b[0] != keyEscape { + if !utf8.FullRune(b) { + return utf8.RuneError, b + } + r, l := utf8.DecodeRune(b) + return r, b[l:] + } + + if !pasteActive && len(b) >= 3 && b[0] == keyEscape && b[1] == '[' { + switch b[2] { + case 'A': + return keyUp, b[3:] + case 'B': + return keyDown, b[3:] + case 'C': + return keyRight, b[3:] + case 'D': + return keyLeft, b[3:] + case 'H': + return keyHome, b[3:] + case 'F': + return keyEnd, b[3:] + } + } + + if !pasteActive && len(b) >= 6 && b[0] == keyEscape && b[1] == '[' && b[2] == '1' && b[3] == ';' && b[4] == '3' { + switch b[5] { + case 'C': + return keyAltRight, b[6:] + case 'D': + return keyAltLeft, b[6:] + } + } + + if !pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteStart) { + return keyPasteStart, b[6:] + } + + if pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteEnd) { + return keyPasteEnd, b[6:] + } + + // If we get here then we have a key that we don't recognise, or a + // partial sequence. It's not clear how one should find the end of a + // sequence without knowing them all, but it seems that [a-zA-Z~] only + // appears at the end of a sequence. + for i, c := range b[0:] { + if c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '~' { + return keyUnknown, b[i+1:] + } + } + + return utf8.RuneError, b +} + +// queue appends data to the end of t.outBuf +func (t *Terminal) queue(data []rune) { + t.outBuf = append(t.outBuf, []byte(string(data))...) +} + +var eraseUnderCursor = []rune{' ', keyEscape, '[', 'D'} +var space = []rune{' '} + +func isPrintable(key rune) bool { + isInSurrogateArea := key >= 0xd800 && key <= 0xdbff + return key >= 32 && !isInSurrogateArea +} + +// moveCursorToPos appends data to t.outBuf which will move the cursor to the +// given, logical position in the text. +func (t *Terminal) moveCursorToPos(pos int) { + if !t.echo { + return + } + + x := visualLength(t.prompt) + pos + y := x / t.termWidth + x = x % t.termWidth + + up := 0 + if y < t.cursorY { + up = t.cursorY - y + } + + down := 0 + if y > t.cursorY { + down = y - t.cursorY + } + + left := 0 + if x < t.cursorX { + left = t.cursorX - x + } + + right := 0 + if x > t.cursorX { + right = x - t.cursorX + } + + t.cursorX = x + t.cursorY = y + t.move(up, down, left, right) +} + +func (t *Terminal) move(up, down, left, right int) { + movement := make([]rune, 3*(up+down+left+right)) + m := movement + for i := 0; i < up; i++ { + m[0] = keyEscape + m[1] = '[' + m[2] = 'A' + m = m[3:] + } + for i := 0; i < down; i++ { + m[0] = keyEscape + m[1] = '[' + m[2] = 'B' + m = m[3:] + } + for i := 0; i < left; i++ { + m[0] = keyEscape + m[1] = '[' + m[2] = 'D' + m = m[3:] + } + for i := 0; i < right; i++ { + m[0] = keyEscape + m[1] = '[' + m[2] = 'C' + m = m[3:] + } + + t.queue(movement) +} + +func (t *Terminal) clearLineToRight() { + op := []rune{keyEscape, '[', 'K'} + t.queue(op) +} + +const maxLineLength = 4096 + +func (t *Terminal) setLine(newLine []rune, newPos int) { + if t.echo { + t.moveCursorToPos(0) + t.writeLine(newLine) + for i := len(newLine); i < len(t.line); i++ { + t.writeLine(space) + } + t.moveCursorToPos(newPos) + } + t.line = newLine + t.pos = newPos +} + +func (t *Terminal) advanceCursor(places int) { + t.cursorX += places + t.cursorY += t.cursorX / t.termWidth + if t.cursorY > t.maxLine { + t.maxLine = t.cursorY + } + t.cursorX = t.cursorX % t.termWidth + + if places > 0 && t.cursorX == 0 { + // Normally terminals will advance the current position + // when writing a character. But that doesn't happen + // for the last character in a line. However, when + // writing a character (except a new line) that causes + // a line wrap, the position will be advanced two + // places. + // + // So, if we are stopping at the end of a line, we + // need to write a newline so that our cursor can be + // advanced to the next line. + t.outBuf = append(t.outBuf, '\r', '\n') + } +} + +func (t *Terminal) eraseNPreviousChars(n int) { + if n == 0 { + return + } + + if t.pos < n { + n = t.pos + } + t.pos -= n + t.moveCursorToPos(t.pos) + + copy(t.line[t.pos:], t.line[n+t.pos:]) + t.line = t.line[:len(t.line)-n] + if t.echo { + t.writeLine(t.line[t.pos:]) + for i := 0; i < n; i++ { + t.queue(space) + } + t.advanceCursor(n) + t.moveCursorToPos(t.pos) + } +} + +// countToLeftWord returns then number of characters from the cursor to the +// start of the previous word. +func (t *Terminal) countToLeftWord() int { + if t.pos == 0 { + return 0 + } + + pos := t.pos - 1 + for pos > 0 { + if t.line[pos] != ' ' { + break + } + pos-- + } + for pos > 0 { + if t.line[pos] == ' ' { + pos++ + break + } + pos-- + } + + return t.pos - pos +} + +// countToRightWord returns then number of characters from the cursor to the +// start of the next word. +func (t *Terminal) countToRightWord() int { + pos := t.pos + for pos < len(t.line) { + if t.line[pos] == ' ' { + break + } + pos++ + } + for pos < len(t.line) { + if t.line[pos] != ' ' { + break + } + pos++ + } + return pos - t.pos +} + +// visualLength returns the number of visible glyphs in s. +func visualLength(runes []rune) int { + inEscapeSeq := false + length := 0 + + for _, r := range runes { + switch { + case inEscapeSeq: + if (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') { + inEscapeSeq = false + } + case r == '\x1b': + inEscapeSeq = true + default: + length++ + } + } + + return length +} + +// handleKey processes the given key and, optionally, returns a line of text +// that the user has entered. +func (t *Terminal) handleKey(key rune) (line string, ok bool) { + if t.pasteActive && key != keyEnter { + t.addKeyToLine(key) + return + } + + switch key { + case keyBackspace: + if t.pos == 0 { + return + } + t.eraseNPreviousChars(1) + case keyAltLeft: + // move left by a word. + t.pos -= t.countToLeftWord() + t.moveCursorToPos(t.pos) + case keyAltRight: + // move right by a word. + t.pos += t.countToRightWord() + t.moveCursorToPos(t.pos) + case keyLeft: + if t.pos == 0 { + return + } + t.pos-- + t.moveCursorToPos(t.pos) + case keyRight: + if t.pos == len(t.line) { + return + } + t.pos++ + t.moveCursorToPos(t.pos) + case keyHome: + if t.pos == 0 { + return + } + t.pos = 0 + t.moveCursorToPos(t.pos) + case keyEnd: + if t.pos == len(t.line) { + return + } + t.pos = len(t.line) + t.moveCursorToPos(t.pos) + case keyUp: + entry, ok := t.history.NthPreviousEntry(t.historyIndex + 1) + if !ok { + return "", false + } + if t.historyIndex == -1 { + t.historyPending = string(t.line) + } + t.historyIndex++ + runes := []rune(entry) + t.setLine(runes, len(runes)) + case keyDown: + switch t.historyIndex { + case -1: + return + case 0: + runes := []rune(t.historyPending) + t.setLine(runes, len(runes)) + t.historyIndex-- + default: + entry, ok := t.history.NthPreviousEntry(t.historyIndex - 1) + if ok { + t.historyIndex-- + runes := []rune(entry) + t.setLine(runes, len(runes)) + } + } + case keyEnter: + t.moveCursorToPos(len(t.line)) + t.queue([]rune("\r\n")) + line = string(t.line) + ok = true + t.line = t.line[:0] + t.pos = 0 + t.cursorX = 0 + t.cursorY = 0 + t.maxLine = 0 + case keyDeleteWord: + // Delete zero or more spaces and then one or more characters. + t.eraseNPreviousChars(t.countToLeftWord()) + case keyDeleteLine: + // Delete everything from the current cursor position to the + // end of line. + for i := t.pos; i < len(t.line); i++ { + t.queue(space) + t.advanceCursor(1) + } + t.line = t.line[:t.pos] + t.moveCursorToPos(t.pos) + case keyCtrlD: + // Erase the character under the current position. + // The EOF case when the line is empty is handled in + // readLine(). + if t.pos < len(t.line) { + t.pos++ + t.eraseNPreviousChars(1) + } + case keyCtrlU: + t.eraseNPreviousChars(t.pos) + case keyClearScreen: + // Erases the screen and moves the cursor to the home position. + t.queue([]rune("\x1b[2J\x1b[H")) + t.queue(t.prompt) + t.cursorX, t.cursorY = 0, 0 + t.advanceCursor(visualLength(t.prompt)) + t.setLine(t.line, t.pos) + default: + if t.AutoCompleteCallback != nil { + prefix := string(t.line[:t.pos]) + suffix := string(t.line[t.pos:]) + + t.lock.Unlock() + newLine, newPos, completeOk := t.AutoCompleteCallback(prefix+suffix, len(prefix), key) + t.lock.Lock() + + if completeOk { + t.setLine([]rune(newLine), utf8.RuneCount([]byte(newLine)[:newPos])) + return + } + } + if !isPrintable(key) { + return + } + if len(t.line) == maxLineLength { + return + } + t.addKeyToLine(key) + } + return +} + +// addKeyToLine inserts the given key at the current position in the current +// line. +func (t *Terminal) addKeyToLine(key rune) { + if len(t.line) == cap(t.line) { + newLine := make([]rune, len(t.line), 2*(1+len(t.line))) + copy(newLine, t.line) + t.line = newLine + } + t.line = t.line[:len(t.line)+1] + copy(t.line[t.pos+1:], t.line[t.pos:]) + t.line[t.pos] = key + if t.echo { + t.writeLine(t.line[t.pos:]) + } + t.pos++ + t.moveCursorToPos(t.pos) +} + +func (t *Terminal) writeLine(line []rune) { + for len(line) != 0 { + remainingOnLine := t.termWidth - t.cursorX + todo := len(line) + if todo > remainingOnLine { + todo = remainingOnLine + } + t.queue(line[:todo]) + t.advanceCursor(visualLength(line[:todo])) + line = line[todo:] + } +} + +// writeWithCRLF writes buf to w but replaces all occurrences of \n with \r\n. +func writeWithCRLF(w io.Writer, buf []byte) (n int, err error) { + for len(buf) > 0 { + i := bytes.IndexByte(buf, '\n') + todo := len(buf) + if i >= 0 { + todo = i + } + + var nn int + nn, err = w.Write(buf[:todo]) + n += nn + if err != nil { + return n, err + } + buf = buf[todo:] + + if i >= 0 { + if _, err = w.Write(crlf); err != nil { + return n, err + } + n++ + buf = buf[1:] + } + } + + return n, nil +} + +func (t *Terminal) Write(buf []byte) (n int, err error) { + t.lock.Lock() + defer t.lock.Unlock() + + if t.cursorX == 0 && t.cursorY == 0 { + // This is the easy case: there's nothing on the screen that we + // have to move out of the way. + return writeWithCRLF(t.c, buf) + } + + // We have a prompt and possibly user input on the screen. We + // have to clear it first. + t.move(0 /* up */, 0 /* down */, t.cursorX /* left */, 0 /* right */) + t.cursorX = 0 + t.clearLineToRight() + + for t.cursorY > 0 { + t.move(1 /* up */, 0, 0, 0) + t.cursorY-- + t.clearLineToRight() + } + + if _, err = t.c.Write(t.outBuf); err != nil { + return + } + t.outBuf = t.outBuf[:0] + + if n, err = writeWithCRLF(t.c, buf); err != nil { + return + } + + t.writeLine(t.prompt) + if t.echo { + t.writeLine(t.line) + } + + t.moveCursorToPos(t.pos) + + if _, err = t.c.Write(t.outBuf); err != nil { + return + } + t.outBuf = t.outBuf[:0] + return +} + +// ReadPassword temporarily changes the prompt and reads a password, without +// echo, from the terminal. +func (t *Terminal) ReadPassword(prompt string) (line string, err error) { + t.lock.Lock() + defer t.lock.Unlock() + + oldPrompt := t.prompt + t.prompt = []rune(prompt) + t.echo = false + + line, err = t.readLine() + + t.prompt = oldPrompt + t.echo = true + + return +} + +// ReadLine returns a line of input from the terminal. +func (t *Terminal) ReadLine() (line string, err error) { + t.lock.Lock() + defer t.lock.Unlock() + + return t.readLine() +} + +func (t *Terminal) readLine() (line string, err error) { + // t.lock must be held at this point + + if t.cursorX == 0 && t.cursorY == 0 { + t.writeLine(t.prompt) + t.c.Write(t.outBuf) + t.outBuf = t.outBuf[:0] + } + + lineIsPasted := t.pasteActive + + for { + rest := t.remainder + lineOk := false + for !lineOk { + var key rune + key, rest = bytesToKey(rest, t.pasteActive) + if key == utf8.RuneError { + break + } + if !t.pasteActive { + if key == keyCtrlD { + if len(t.line) == 0 { + return "", io.EOF + } + } + if key == keyPasteStart { + t.pasteActive = true + if len(t.line) == 0 { + lineIsPasted = true + } + continue + } + } else if key == keyPasteEnd { + t.pasteActive = false + continue + } + if !t.pasteActive { + lineIsPasted = false + } + line, lineOk = t.handleKey(key) + } + if len(rest) > 0 { + n := copy(t.inBuf[:], rest) + t.remainder = t.inBuf[:n] + } else { + t.remainder = nil + } + t.c.Write(t.outBuf) + t.outBuf = t.outBuf[:0] + if lineOk { + if t.echo { + t.historyIndex = -1 + t.history.Add(line) + } + if lineIsPasted { + err = ErrPasteIndicator + } + return + } + + // t.remainder is a slice at the beginning of t.inBuf + // containing a partial key sequence + readBuf := t.inBuf[len(t.remainder):] + var n int + + t.lock.Unlock() + n, err = t.c.Read(readBuf) + t.lock.Lock() + + if err != nil { + return + } + + t.remainder = t.inBuf[:n+len(t.remainder)] + } +} + +// SetPrompt sets the prompt to be used when reading subsequent lines. +func (t *Terminal) SetPrompt(prompt string) { + t.lock.Lock() + defer t.lock.Unlock() + + t.prompt = []rune(prompt) +} + +func (t *Terminal) clearAndRepaintLinePlusNPrevious(numPrevLines int) { + // Move cursor to column zero at the start of the line. + t.move(t.cursorY, 0, t.cursorX, 0) + t.cursorX, t.cursorY = 0, 0 + t.clearLineToRight() + for t.cursorY < numPrevLines { + // Move down a line + t.move(0, 1, 0, 0) + t.cursorY++ + t.clearLineToRight() + } + // Move back to beginning. + t.move(t.cursorY, 0, 0, 0) + t.cursorX, t.cursorY = 0, 0 + + t.queue(t.prompt) + t.advanceCursor(visualLength(t.prompt)) + t.writeLine(t.line) + t.moveCursorToPos(t.pos) +} + +func (t *Terminal) SetSize(width, height int) error { + t.lock.Lock() + defer t.lock.Unlock() + + if width == 0 { + width = 1 + } + + oldWidth := t.termWidth + t.termWidth, t.termHeight = width, height + + switch { + case width == oldWidth: + // If the width didn't change then nothing else needs to be + // done. + return nil + case len(t.line) == 0 && t.cursorX == 0 && t.cursorY == 0: + // If there is nothing on current line and no prompt printed, + // just do nothing + return nil + case width < oldWidth: + // Some terminals (e.g. xterm) will truncate lines that were + // too long when shinking. Others, (e.g. gnome-terminal) will + // attempt to wrap them. For the former, repainting t.maxLine + // works great, but that behaviour goes badly wrong in the case + // of the latter because they have doubled every full line. + + // We assume that we are working on a terminal that wraps lines + // and adjust the cursor position based on every previous line + // wrapping and turning into two. This causes the prompt on + // xterms to move upwards, which isn't great, but it avoids a + // huge mess with gnome-terminal. + if t.cursorX >= t.termWidth { + t.cursorX = t.termWidth - 1 + } + t.cursorY *= 2 + t.clearAndRepaintLinePlusNPrevious(t.maxLine * 2) + case width > oldWidth: + // If the terminal expands then our position calculations will + // be wrong in the future because we think the cursor is + // |t.pos| chars into the string, but there will be a gap at + // the end of any wrapped line. + // + // But the position will actually be correct until we move, so + // we can move back to the beginning and repaint everything. + t.clearAndRepaintLinePlusNPrevious(t.maxLine) + } + + _, err := t.c.Write(t.outBuf) + t.outBuf = t.outBuf[:0] + return err +} + +type pasteIndicatorError struct{} + +func (pasteIndicatorError) Error() string { + return "terminal: ErrPasteIndicator not correctly handled" +} + +// ErrPasteIndicator may be returned from ReadLine as the error, in addition +// to valid line data. It indicates that bracketed paste mode is enabled and +// that the returned line consists only of pasted data. Programs may wish to +// interpret pasted data more literally than typed data. +var ErrPasteIndicator = pasteIndicatorError{} + +// SetBracketedPasteMode requests that the terminal bracket paste operations +// with markers. Not all terminals support this but, if it is supported, then +// enabling this mode will stop any autocomplete callback from running due to +// pastes. Additionally, any lines that are completely pasted will be returned +// from ReadLine with the error set to ErrPasteIndicator. +func (t *Terminal) SetBracketedPasteMode(on bool) { + if on { + io.WriteString(t.c, "\x1b[?2004h") + } else { + io.WriteString(t.c, "\x1b[?2004l") + } +} + +// stRingBuffer is a ring buffer of strings. +type stRingBuffer struct { + // entries contains max elements. + entries []string + max int + // head contains the index of the element most recently added to the ring. + head int + // size contains the number of elements in the ring. + size int +} + +func (s *stRingBuffer) Add(a string) { + if s.entries == nil { + const defaultNumEntries = 100 + s.entries = make([]string, defaultNumEntries) + s.max = defaultNumEntries + } + + s.head = (s.head + 1) % s.max + s.entries[s.head] = a + if s.size < s.max { + s.size++ + } +} + +// NthPreviousEntry returns the value passed to the nth previous call to Add. +// If n is zero then the immediately prior value is returned, if one, then the +// next most recent, and so on. If such an element doesn't exist then ok is +// false. +func (s *stRingBuffer) NthPreviousEntry(n int) (value string, ok bool) { + if n >= s.size { + return "", false + } + index := s.head - n + if index < 0 { + index += s.max + } + return s.entries[index], true +} + +// readPasswordLine reads from reader until it finds \n or io.EOF. +// The slice returned does not include the \n. +// readPasswordLine also ignores any \r it finds. +func readPasswordLine(reader io.Reader) ([]byte, error) { + var buf [1]byte + var ret []byte + + for { + n, err := reader.Read(buf[:]) + if n > 0 { + switch buf[0] { + case '\n': + return ret, nil + case '\r': + // remove \r from passwords on Windows + default: + ret = append(ret, buf[0]) + } + continue + } + if err != nil { + if err == io.EOF && len(ret) > 0 { + return ret, nil + } + return ret, err + } + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/terminal/util.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/terminal/util.go new file mode 100644 index 0000000000000000000000000000000000000000..731c89a284a29f479297461539b17535ab5321d6 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/terminal/util.go @@ -0,0 +1,114 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux,!appengine netbsd openbsd + +// Package terminal provides support functions for dealing with terminals, as +// commonly found on UNIX systems. +// +// Putting a terminal into raw mode is the most common requirement: +// +// oldState, err := terminal.MakeRaw(0) +// if err != nil { +// panic(err) +// } +// defer terminal.Restore(0, oldState) +package terminal // import "golang.org/x/crypto/ssh/terminal" + +import ( + "golang.org/x/sys/unix" +) + +// State contains the state of a terminal. +type State struct { + termios unix.Termios +} + +// IsTerminal returns true if the given file descriptor is a terminal. +func IsTerminal(fd int) bool { + _, err := unix.IoctlGetTermios(fd, ioctlReadTermios) + return err == nil +} + +// MakeRaw put the terminal connected to the given file descriptor into raw +// mode and returns the previous state of the terminal so that it can be +// restored. +func MakeRaw(fd int) (*State, error) { + termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios) + if err != nil { + return nil, err + } + + oldState := State{termios: *termios} + + // This attempts to replicate the behaviour documented for cfmakeraw in + // the termios(3) manpage. + termios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON + termios.Oflag &^= unix.OPOST + termios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN + termios.Cflag &^= unix.CSIZE | unix.PARENB + termios.Cflag |= unix.CS8 + termios.Cc[unix.VMIN] = 1 + termios.Cc[unix.VTIME] = 0 + if err := unix.IoctlSetTermios(fd, ioctlWriteTermios, termios); err != nil { + return nil, err + } + + return &oldState, nil +} + +// GetState returns the current state of a terminal which may be useful to +// restore the terminal after a signal. +func GetState(fd int) (*State, error) { + termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios) + if err != nil { + return nil, err + } + + return &State{termios: *termios}, nil +} + +// Restore restores the terminal connected to the given file descriptor to a +// previous state. +func Restore(fd int, state *State) error { + return unix.IoctlSetTermios(fd, ioctlWriteTermios, &state.termios) +} + +// GetSize returns the dimensions of the given terminal. +func GetSize(fd int) (width, height int, err error) { + ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ) + if err != nil { + return -1, -1, err + } + return int(ws.Col), int(ws.Row), nil +} + +// passwordReader is an io.Reader that reads from a specific file descriptor. +type passwordReader int + +func (r passwordReader) Read(buf []byte) (int, error) { + return unix.Read(int(r), buf) +} + +// ReadPassword reads a line of input from a terminal without local echo. This +// is commonly used for inputting passwords and other sensitive data. The slice +// returned does not include the \n. +func ReadPassword(fd int) ([]byte, error) { + termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios) + if err != nil { + return nil, err + } + + newState := *termios + newState.Lflag &^= unix.ECHO + newState.Lflag |= unix.ICANON | unix.ISIG + newState.Iflag |= unix.ICRNL + if err := unix.IoctlSetTermios(fd, ioctlWriteTermios, &newState); err != nil { + return nil, err + } + + defer unix.IoctlSetTermios(fd, ioctlWriteTermios, termios) + + return readPasswordLine(passwordReader(fd)) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go new file mode 100644 index 0000000000000000000000000000000000000000..cb23a590494015a5689166d40852762b777dd994 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go @@ -0,0 +1,12 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd netbsd openbsd + +package terminal + +import "golang.org/x/sys/unix" + +const ioctlReadTermios = unix.TIOCGETA +const ioctlWriteTermios = unix.TIOCSETA diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go new file mode 100644 index 0000000000000000000000000000000000000000..5fadfe8a1d50ba10d6d4fea349fe5c7a983eb5da --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go @@ -0,0 +1,10 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package terminal + +import "golang.org/x/sys/unix" + +const ioctlReadTermios = unix.TCGETS +const ioctlWriteTermios = unix.TCSETS diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go new file mode 100644 index 0000000000000000000000000000000000000000..799f049f04ea0ce665e44e018780921e2bed0d02 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go @@ -0,0 +1,58 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package terminal provides support functions for dealing with terminals, as +// commonly found on UNIX systems. +// +// Putting a terminal into raw mode is the most common requirement: +// +// oldState, err := terminal.MakeRaw(0) +// if err != nil { +// panic(err) +// } +// defer terminal.Restore(0, oldState) +package terminal + +import ( + "fmt" + "runtime" +) + +type State struct{} + +// IsTerminal returns true if the given file descriptor is a terminal. +func IsTerminal(fd int) bool { + return false +} + +// MakeRaw put the terminal connected to the given file descriptor into raw +// mode and returns the previous state of the terminal so that it can be +// restored. +func MakeRaw(fd int) (*State, error) { + return nil, fmt.Errorf("terminal: MakeRaw not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) +} + +// GetState returns the current state of a terminal which may be useful to +// restore the terminal after a signal. +func GetState(fd int) (*State, error) { + return nil, fmt.Errorf("terminal: GetState not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) +} + +// Restore restores the terminal connected to the given file descriptor to a +// previous state. +func Restore(fd int, state *State) error { + return fmt.Errorf("terminal: Restore not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) +} + +// GetSize returns the dimensions of the given terminal. +func GetSize(fd int) (width, height int, err error) { + return 0, 0, fmt.Errorf("terminal: GetSize not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) +} + +// ReadPassword reads a line of input from a terminal without local echo. This +// is commonly used for inputting passwords and other sensitive data. The slice +// returned does not include the \n. +func ReadPassword(fd int) ([]byte, error) { + return nil, fmt.Errorf("terminal: ReadPassword not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go new file mode 100644 index 0000000000000000000000000000000000000000..9e41b9f43f089fbefb87121d19378deef35558a3 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go @@ -0,0 +1,124 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build solaris + +package terminal // import "golang.org/x/crypto/ssh/terminal" + +import ( + "golang.org/x/sys/unix" + "io" + "syscall" +) + +// State contains the state of a terminal. +type State struct { + termios unix.Termios +} + +// IsTerminal returns true if the given file descriptor is a terminal. +func IsTerminal(fd int) bool { + _, err := unix.IoctlGetTermio(fd, unix.TCGETA) + return err == nil +} + +// ReadPassword reads a line of input from a terminal without local echo. This +// is commonly used for inputting passwords and other sensitive data. The slice +// returned does not include the \n. +func ReadPassword(fd int) ([]byte, error) { + // see also: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libast/common/uwin/getpass.c + val, err := unix.IoctlGetTermios(fd, unix.TCGETS) + if err != nil { + return nil, err + } + oldState := *val + + newState := oldState + newState.Lflag &^= syscall.ECHO + newState.Lflag |= syscall.ICANON | syscall.ISIG + newState.Iflag |= syscall.ICRNL + err = unix.IoctlSetTermios(fd, unix.TCSETS, &newState) + if err != nil { + return nil, err + } + + defer unix.IoctlSetTermios(fd, unix.TCSETS, &oldState) + + var buf [16]byte + var ret []byte + for { + n, err := syscall.Read(fd, buf[:]) + if err != nil { + return nil, err + } + if n == 0 { + if len(ret) == 0 { + return nil, io.EOF + } + break + } + if buf[n-1] == '\n' { + n-- + } + ret = append(ret, buf[:n]...) + if n < len(buf) { + break + } + } + + return ret, nil +} + +// MakeRaw puts the terminal connected to the given file descriptor into raw +// mode and returns the previous state of the terminal so that it can be +// restored. +// see http://cr.illumos.org/~webrev/andy_js/1060/ +func MakeRaw(fd int) (*State, error) { + termios, err := unix.IoctlGetTermios(fd, unix.TCGETS) + if err != nil { + return nil, err + } + + oldState := State{termios: *termios} + + termios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON + termios.Oflag &^= unix.OPOST + termios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN + termios.Cflag &^= unix.CSIZE | unix.PARENB + termios.Cflag |= unix.CS8 + termios.Cc[unix.VMIN] = 1 + termios.Cc[unix.VTIME] = 0 + + if err := unix.IoctlSetTermios(fd, unix.TCSETS, termios); err != nil { + return nil, err + } + + return &oldState, nil +} + +// Restore restores the terminal connected to the given file descriptor to a +// previous state. +func Restore(fd int, oldState *State) error { + return unix.IoctlSetTermios(fd, unix.TCSETS, &oldState.termios) +} + +// GetState returns the current state of a terminal which may be useful to +// restore the terminal after a signal. +func GetState(fd int) (*State, error) { + termios, err := unix.IoctlGetTermios(fd, unix.TCGETS) + if err != nil { + return nil, err + } + + return &State{termios: *termios}, nil +} + +// GetSize returns the dimensions of the given terminal. +func GetSize(fd int) (width, height int, err error) { + ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ) + if err != nil { + return 0, 0, err + } + return int(ws.Col), int(ws.Row), nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go new file mode 100644 index 0000000000000000000000000000000000000000..8618955df7383cc1c33135befc356599a3be0199 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go @@ -0,0 +1,103 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build windows + +// Package terminal provides support functions for dealing with terminals, as +// commonly found on UNIX systems. +// +// Putting a terminal into raw mode is the most common requirement: +// +// oldState, err := terminal.MakeRaw(0) +// if err != nil { +// panic(err) +// } +// defer terminal.Restore(0, oldState) +package terminal + +import ( + "os" + + "golang.org/x/sys/windows" +) + +type State struct { + mode uint32 +} + +// IsTerminal returns true if the given file descriptor is a terminal. +func IsTerminal(fd int) bool { + var st uint32 + err := windows.GetConsoleMode(windows.Handle(fd), &st) + return err == nil +} + +// MakeRaw put the terminal connected to the given file descriptor into raw +// mode and returns the previous state of the terminal so that it can be +// restored. +func MakeRaw(fd int) (*State, error) { + var st uint32 + if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil { + return nil, err + } + raw := st &^ (windows.ENABLE_ECHO_INPUT | windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT | windows.ENABLE_PROCESSED_OUTPUT) + if err := windows.SetConsoleMode(windows.Handle(fd), raw); err != nil { + return nil, err + } + return &State{st}, nil +} + +// GetState returns the current state of a terminal which may be useful to +// restore the terminal after a signal. +func GetState(fd int) (*State, error) { + var st uint32 + if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil { + return nil, err + } + return &State{st}, nil +} + +// Restore restores the terminal connected to the given file descriptor to a +// previous state. +func Restore(fd int, state *State) error { + return windows.SetConsoleMode(windows.Handle(fd), state.mode) +} + +// GetSize returns the dimensions of the given terminal. +func GetSize(fd int) (width, height int, err error) { + var info windows.ConsoleScreenBufferInfo + if err := windows.GetConsoleScreenBufferInfo(windows.Handle(fd), &info); err != nil { + return 0, 0, err + } + return int(info.Size.X), int(info.Size.Y), nil +} + +// ReadPassword reads a line of input from a terminal without local echo. This +// is commonly used for inputting passwords and other sensitive data. The slice +// returned does not include the \n. +func ReadPassword(fd int) ([]byte, error) { + var st uint32 + if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil { + return nil, err + } + old := st + + st &^= (windows.ENABLE_ECHO_INPUT) + st |= (windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT | windows.ENABLE_PROCESSED_OUTPUT) + if err := windows.SetConsoleMode(windows.Handle(fd), st); err != nil { + return nil, err + } + + defer windows.SetConsoleMode(windows.Handle(fd), old) + + var h windows.Handle + p, _ := windows.GetCurrentProcess() + if err := windows.DuplicateHandle(p, windows.Handle(fd), p, &h, 0, false, windows.DUPLICATE_SAME_ACCESS); err != nil { + return nil, err + } + + f := os.NewFile(uintptr(h), "stdin") + defer f.Close() + return readPasswordLine(f) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/transport.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/transport.go new file mode 100644 index 0000000000000000000000000000000000000000..f6fae1db460465b4991e6ff07e12e31508367aaa --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/crypto/ssh/transport.go @@ -0,0 +1,353 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ssh + +import ( + "bufio" + "bytes" + "errors" + "io" + "log" +) + +// debugTransport if set, will print packet types as they go over the +// wire. No message decoding is done, to minimize the impact on timing. +const debugTransport = false + +const ( + gcmCipherID = "aes128-gcm@openssh.com" + aes128cbcID = "aes128-cbc" + tripledescbcID = "3des-cbc" +) + +// packetConn represents a transport that implements packet based +// operations. +type packetConn interface { + // Encrypt and send a packet of data to the remote peer. + writePacket(packet []byte) error + + // Read a packet from the connection. The read is blocking, + // i.e. if error is nil, then the returned byte slice is + // always non-empty. + readPacket() ([]byte, error) + + // Close closes the write-side of the connection. + Close() error +} + +// transport is the keyingTransport that implements the SSH packet +// protocol. +type transport struct { + reader connectionState + writer connectionState + + bufReader *bufio.Reader + bufWriter *bufio.Writer + rand io.Reader + isClient bool + io.Closer +} + +// packetCipher represents a combination of SSH encryption/MAC +// protocol. A single instance should be used for one direction only. +type packetCipher interface { + // writePacket encrypts the packet and writes it to w. The + // contents of the packet are generally scrambled. + writePacket(seqnum uint32, w io.Writer, rand io.Reader, packet []byte) error + + // readPacket reads and decrypts a packet of data. The + // returned packet may be overwritten by future calls of + // readPacket. + readPacket(seqnum uint32, r io.Reader) ([]byte, error) +} + +// connectionState represents one side (read or write) of the +// connection. This is necessary because each direction has its own +// keys, and can even have its own algorithms +type connectionState struct { + packetCipher + seqNum uint32 + dir direction + pendingKeyChange chan packetCipher +} + +// prepareKeyChange sets up key material for a keychange. The key changes in +// both directions are triggered by reading and writing a msgNewKey packet +// respectively. +func (t *transport) prepareKeyChange(algs *algorithms, kexResult *kexResult) error { + ciph, err := newPacketCipher(t.reader.dir, algs.r, kexResult) + if err != nil { + return err + } + t.reader.pendingKeyChange <- ciph + + ciph, err = newPacketCipher(t.writer.dir, algs.w, kexResult) + if err != nil { + return err + } + t.writer.pendingKeyChange <- ciph + + return nil +} + +func (t *transport) printPacket(p []byte, write bool) { + if len(p) == 0 { + return + } + who := "server" + if t.isClient { + who = "client" + } + what := "read" + if write { + what = "write" + } + + log.Println(what, who, p[0]) +} + +// Read and decrypt next packet. +func (t *transport) readPacket() (p []byte, err error) { + for { + p, err = t.reader.readPacket(t.bufReader) + if err != nil { + break + } + if len(p) == 0 || (p[0] != msgIgnore && p[0] != msgDebug) { + break + } + } + if debugTransport { + t.printPacket(p, false) + } + + return p, err +} + +func (s *connectionState) readPacket(r *bufio.Reader) ([]byte, error) { + packet, err := s.packetCipher.readPacket(s.seqNum, r) + s.seqNum++ + if err == nil && len(packet) == 0 { + err = errors.New("ssh: zero length packet") + } + + if len(packet) > 0 { + switch packet[0] { + case msgNewKeys: + select { + case cipher := <-s.pendingKeyChange: + s.packetCipher = cipher + default: + return nil, errors.New("ssh: got bogus newkeys message") + } + + case msgDisconnect: + // Transform a disconnect message into an + // error. Since this is lowest level at which + // we interpret message types, doing it here + // ensures that we don't have to handle it + // elsewhere. + var msg disconnectMsg + if err := Unmarshal(packet, &msg); err != nil { + return nil, err + } + return nil, &msg + } + } + + // The packet may point to an internal buffer, so copy the + // packet out here. + fresh := make([]byte, len(packet)) + copy(fresh, packet) + + return fresh, err +} + +func (t *transport) writePacket(packet []byte) error { + if debugTransport { + t.printPacket(packet, true) + } + return t.writer.writePacket(t.bufWriter, t.rand, packet) +} + +func (s *connectionState) writePacket(w *bufio.Writer, rand io.Reader, packet []byte) error { + changeKeys := len(packet) > 0 && packet[0] == msgNewKeys + + err := s.packetCipher.writePacket(s.seqNum, w, rand, packet) + if err != nil { + return err + } + if err = w.Flush(); err != nil { + return err + } + s.seqNum++ + if changeKeys { + select { + case cipher := <-s.pendingKeyChange: + s.packetCipher = cipher + default: + panic("ssh: no key material for msgNewKeys") + } + } + return err +} + +func newTransport(rwc io.ReadWriteCloser, rand io.Reader, isClient bool) *transport { + t := &transport{ + bufReader: bufio.NewReader(rwc), + bufWriter: bufio.NewWriter(rwc), + rand: rand, + reader: connectionState{ + packetCipher: &streamPacketCipher{cipher: noneCipher{}}, + pendingKeyChange: make(chan packetCipher, 1), + }, + writer: connectionState{ + packetCipher: &streamPacketCipher{cipher: noneCipher{}}, + pendingKeyChange: make(chan packetCipher, 1), + }, + Closer: rwc, + } + t.isClient = isClient + + if isClient { + t.reader.dir = serverKeys + t.writer.dir = clientKeys + } else { + t.reader.dir = clientKeys + t.writer.dir = serverKeys + } + + return t +} + +type direction struct { + ivTag []byte + keyTag []byte + macKeyTag []byte +} + +var ( + serverKeys = direction{[]byte{'B'}, []byte{'D'}, []byte{'F'}} + clientKeys = direction{[]byte{'A'}, []byte{'C'}, []byte{'E'}} +) + +// setupKeys sets the cipher and MAC keys from kex.K, kex.H and sessionId, as +// described in RFC 4253, section 6.4. direction should either be serverKeys +// (to setup server->client keys) or clientKeys (for client->server keys). +func newPacketCipher(d direction, algs directionAlgorithms, kex *kexResult) (packetCipher, error) { + cipherMode := cipherModes[algs.Cipher] + macMode := macModes[algs.MAC] + + iv := make([]byte, cipherMode.ivSize) + key := make([]byte, cipherMode.keySize) + macKey := make([]byte, macMode.keySize) + + generateKeyMaterial(iv, d.ivTag, kex) + generateKeyMaterial(key, d.keyTag, kex) + generateKeyMaterial(macKey, d.macKeyTag, kex) + + return cipherModes[algs.Cipher].create(key, iv, macKey, algs) +} + +// generateKeyMaterial fills out with key material generated from tag, K, H +// and sessionId, as specified in RFC 4253, section 7.2. +func generateKeyMaterial(out, tag []byte, r *kexResult) { + var digestsSoFar []byte + + h := r.Hash.New() + for len(out) > 0 { + h.Reset() + h.Write(r.K) + h.Write(r.H) + + if len(digestsSoFar) == 0 { + h.Write(tag) + h.Write(r.SessionID) + } else { + h.Write(digestsSoFar) + } + + digest := h.Sum(nil) + n := copy(out, digest) + out = out[n:] + if len(out) > 0 { + digestsSoFar = append(digestsSoFar, digest...) + } + } +} + +const packageVersion = "SSH-2.0-Go" + +// Sends and receives a version line. The versionLine string should +// be US ASCII, start with "SSH-2.0-", and should not include a +// newline. exchangeVersions returns the other side's version line. +func exchangeVersions(rw io.ReadWriter, versionLine []byte) (them []byte, err error) { + // Contrary to the RFC, we do not ignore lines that don't + // start with "SSH-2.0-" to make the library usable with + // nonconforming servers. + for _, c := range versionLine { + // The spec disallows non US-ASCII chars, and + // specifically forbids null chars. + if c < 32 { + return nil, errors.New("ssh: junk character in version line") + } + } + if _, err = rw.Write(append(versionLine, '\r', '\n')); err != nil { + return + } + + them, err = readVersion(rw) + return them, err +} + +// maxVersionStringBytes is the maximum number of bytes that we'll +// accept as a version string. RFC 4253 section 4.2 limits this at 255 +// chars +const maxVersionStringBytes = 255 + +// Read version string as specified by RFC 4253, section 4.2. +func readVersion(r io.Reader) ([]byte, error) { + versionString := make([]byte, 0, 64) + var ok bool + var buf [1]byte + + for length := 0; length < maxVersionStringBytes; length++ { + _, err := io.ReadFull(r, buf[:]) + if err != nil { + return nil, err + } + // The RFC says that the version should be terminated with \r\n + // but several SSH servers actually only send a \n. + if buf[0] == '\n' { + if !bytes.HasPrefix(versionString, []byte("SSH-")) { + // RFC 4253 says we need to ignore all version string lines + // except the one containing the SSH version (provided that + // all the lines do not exceed 255 bytes in total). + versionString = versionString[:0] + continue + } + ok = true + break + } + + // non ASCII chars are disallowed, but we are lenient, + // since Go doesn't use null-terminated strings. + + // The RFC allows a comment after a space, however, + // all of it (version and comments) goes into the + // session hash. + versionString = append(versionString, buf[0]) + } + + if !ok { + return nil, errors.New("ssh: overflow reading version string") + } + + // There might be a '\r' on the end which we should remove. + if len(versionString) > 0 && versionString[len(versionString)-1] == '\r' { + versionString = versionString[:len(versionString)-1] + } + return versionString, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/net/LICENSE b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/net/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..6a66aea5eafe0ca6a688840c47219556c552488e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/net/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/net/PATENTS b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/net/PATENTS new file mode 100644 index 0000000000000000000000000000000000000000..733099041f84fa1e58611ab2e11af51c1f26d1d2 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/net/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/net/publicsuffix/gen.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/net/publicsuffix/gen.go new file mode 100644 index 0000000000000000000000000000000000000000..372ffbb24c882225d441f4b7107517cbf9fd8a17 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/net/publicsuffix/gen.go @@ -0,0 +1,717 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +package main + +// This program generates table.go and table_test.go based on the authoritative +// public suffix list at https://publicsuffix.org/list/effective_tld_names.dat +// +// The version is derived from +// https://api.github.com/repos/publicsuffix/list/commits?path=public_suffix_list.dat +// and a human-readable form is at +// https://github.com/publicsuffix/list/commits/master/public_suffix_list.dat +// +// To fetch a particular git revision, such as 5c70ccd250, pass +// -url "https://raw.githubusercontent.com/publicsuffix/list/5c70ccd250/public_suffix_list.dat" +// and -version "an explicit version string". + +import ( + "bufio" + "bytes" + "flag" + "fmt" + "go/format" + "io" + "io/ioutil" + "net/http" + "os" + "regexp" + "sort" + "strings" + + "golang.org/x/net/idna" +) + +const ( + // These sum of these four values must be no greater than 32. + nodesBitsChildren = 10 + nodesBitsICANN = 1 + nodesBitsTextOffset = 15 + nodesBitsTextLength = 6 + + // These sum of these four values must be no greater than 32. + childrenBitsWildcard = 1 + childrenBitsNodeType = 2 + childrenBitsHi = 14 + childrenBitsLo = 14 +) + +var ( + maxChildren int + maxTextOffset int + maxTextLength int + maxHi uint32 + maxLo uint32 +) + +func max(a, b int) int { + if a < b { + return b + } + return a +} + +func u32max(a, b uint32) uint32 { + if a < b { + return b + } + return a +} + +const ( + nodeTypeNormal = 0 + nodeTypeException = 1 + nodeTypeParentOnly = 2 + numNodeType = 3 +) + +func nodeTypeStr(n int) string { + switch n { + case nodeTypeNormal: + return "+" + case nodeTypeException: + return "!" + case nodeTypeParentOnly: + return "o" + } + panic("unreachable") +} + +const ( + defaultURL = "https://publicsuffix.org/list/effective_tld_names.dat" + gitCommitURL = "https://api.github.com/repos/publicsuffix/list/commits?path=public_suffix_list.dat" +) + +var ( + labelEncoding = map[string]uint32{} + labelsList = []string{} + labelsMap = map[string]bool{} + rules = []string{} + numICANNRules = 0 + + // validSuffixRE is used to check that the entries in the public suffix + // list are in canonical form (after Punycode encoding). Specifically, + // capital letters are not allowed. + validSuffixRE = regexp.MustCompile(`^[a-z0-9_\!\*\-\.]+$`) + + shaRE = regexp.MustCompile(`"sha":"([^"]+)"`) + dateRE = regexp.MustCompile(`"committer":{[^{]+"date":"([^"]+)"`) + + comments = flag.Bool("comments", false, "generate table.go comments, for debugging") + subset = flag.Bool("subset", false, "generate only a subset of the full table, for debugging") + url = flag.String("url", defaultURL, "URL of the publicsuffix.org list. If empty, stdin is read instead") + v = flag.Bool("v", false, "verbose output (to stderr)") + version = flag.String("version", "", "the effective_tld_names.dat version") +) + +func main() { + if err := main1(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} + +func main1() error { + flag.Parse() + if nodesBitsTextLength+nodesBitsTextOffset+nodesBitsICANN+nodesBitsChildren > 32 { + return fmt.Errorf("not enough bits to encode the nodes table") + } + if childrenBitsLo+childrenBitsHi+childrenBitsNodeType+childrenBitsWildcard > 32 { + return fmt.Errorf("not enough bits to encode the children table") + } + if *version == "" { + if *url != defaultURL { + return fmt.Errorf("-version was not specified, and the -url is not the default one") + } + sha, date, err := gitCommit() + if err != nil { + return err + } + *version = fmt.Sprintf("publicsuffix.org's public_suffix_list.dat, git revision %s (%s)", sha, date) + } + var r io.Reader = os.Stdin + if *url != "" { + res, err := http.Get(*url) + if err != nil { + return err + } + if res.StatusCode != http.StatusOK { + return fmt.Errorf("bad GET status for %s: %d", *url, res.Status) + } + r = res.Body + defer res.Body.Close() + } + + var root node + icann := false + br := bufio.NewReader(r) + for { + s, err := br.ReadString('\n') + if err != nil { + if err == io.EOF { + break + } + return err + } + s = strings.TrimSpace(s) + if strings.Contains(s, "BEGIN ICANN DOMAINS") { + if len(rules) != 0 { + return fmt.Errorf(`expected no rules before "BEGIN ICANN DOMAINS"`) + } + icann = true + continue + } + if strings.Contains(s, "END ICANN DOMAINS") { + icann, numICANNRules = false, len(rules) + continue + } + if s == "" || strings.HasPrefix(s, "//") { + continue + } + s, err = idna.ToASCII(s) + if err != nil { + return err + } + if !validSuffixRE.MatchString(s) { + return fmt.Errorf("bad publicsuffix.org list data: %q", s) + } + + if *subset { + switch { + case s == "ac.jp" || strings.HasSuffix(s, ".ac.jp"): + case s == "ak.us" || strings.HasSuffix(s, ".ak.us"): + case s == "ao" || strings.HasSuffix(s, ".ao"): + case s == "ar" || strings.HasSuffix(s, ".ar"): + case s == "arpa" || strings.HasSuffix(s, ".arpa"): + case s == "cy" || strings.HasSuffix(s, ".cy"): + case s == "dyndns.org" || strings.HasSuffix(s, ".dyndns.org"): + case s == "jp": + case s == "kobe.jp" || strings.HasSuffix(s, ".kobe.jp"): + case s == "kyoto.jp" || strings.HasSuffix(s, ".kyoto.jp"): + case s == "om" || strings.HasSuffix(s, ".om"): + case s == "uk" || strings.HasSuffix(s, ".uk"): + case s == "uk.com" || strings.HasSuffix(s, ".uk.com"): + case s == "tw" || strings.HasSuffix(s, ".tw"): + case s == "zw" || strings.HasSuffix(s, ".zw"): + case s == "xn--p1ai" || strings.HasSuffix(s, ".xn--p1ai"): + // xn--p1ai is Russian-Cyrillic "рф". + default: + continue + } + } + + rules = append(rules, s) + + nt, wildcard := nodeTypeNormal, false + switch { + case strings.HasPrefix(s, "*."): + s, nt = s[2:], nodeTypeParentOnly + wildcard = true + case strings.HasPrefix(s, "!"): + s, nt = s[1:], nodeTypeException + } + labels := strings.Split(s, ".") + for n, i := &root, len(labels)-1; i >= 0; i-- { + label := labels[i] + n = n.child(label) + if i == 0 { + if nt != nodeTypeParentOnly && n.nodeType == nodeTypeParentOnly { + n.nodeType = nt + } + n.icann = n.icann && icann + n.wildcard = n.wildcard || wildcard + } + labelsMap[label] = true + } + } + labelsList = make([]string, 0, len(labelsMap)) + for label := range labelsMap { + labelsList = append(labelsList, label) + } + sort.Strings(labelsList) + + if err := generate(printReal, &root, "table.go"); err != nil { + return err + } + if err := generate(printTest, &root, "table_test.go"); err != nil { + return err + } + return nil +} + +func generate(p func(io.Writer, *node) error, root *node, filename string) error { + buf := new(bytes.Buffer) + if err := p(buf, root); err != nil { + return err + } + b, err := format.Source(buf.Bytes()) + if err != nil { + return err + } + return ioutil.WriteFile(filename, b, 0644) +} + +func gitCommit() (sha, date string, retErr error) { + res, err := http.Get(gitCommitURL) + if err != nil { + return "", "", err + } + if res.StatusCode != http.StatusOK { + return "", "", fmt.Errorf("bad GET status for %s: %d", gitCommitURL, res.Status) + } + defer res.Body.Close() + b, err := ioutil.ReadAll(res.Body) + if err != nil { + return "", "", err + } + if m := shaRE.FindSubmatch(b); m != nil { + sha = string(m[1]) + } + if m := dateRE.FindSubmatch(b); m != nil { + date = string(m[1]) + } + if sha == "" || date == "" { + retErr = fmt.Errorf("could not find commit SHA and date in %s", gitCommitURL) + } + return sha, date, retErr +} + +func printTest(w io.Writer, n *node) error { + fmt.Fprintf(w, "// generated by go run gen.go; DO NOT EDIT\n\n") + fmt.Fprintf(w, "package publicsuffix\n\nconst numICANNRules = %d\n\nvar rules = [...]string{\n", numICANNRules) + for _, rule := range rules { + fmt.Fprintf(w, "%q,\n", rule) + } + fmt.Fprintf(w, "}\n\nvar nodeLabels = [...]string{\n") + if err := n.walk(w, printNodeLabel); err != nil { + return err + } + fmt.Fprintf(w, "}\n") + return nil +} + +func printReal(w io.Writer, n *node) error { + const header = `// generated by go run gen.go; DO NOT EDIT + +package publicsuffix + +const version = %q + +const ( + nodesBitsChildren = %d + nodesBitsICANN = %d + nodesBitsTextOffset = %d + nodesBitsTextLength = %d + + childrenBitsWildcard = %d + childrenBitsNodeType = %d + childrenBitsHi = %d + childrenBitsLo = %d +) + +const ( + nodeTypeNormal = %d + nodeTypeException = %d + nodeTypeParentOnly = %d +) + +// numTLD is the number of top level domains. +const numTLD = %d + +` + fmt.Fprintf(w, header, *version, + nodesBitsChildren, nodesBitsICANN, nodesBitsTextOffset, nodesBitsTextLength, + childrenBitsWildcard, childrenBitsNodeType, childrenBitsHi, childrenBitsLo, + nodeTypeNormal, nodeTypeException, nodeTypeParentOnly, len(n.children)) + + text := combineText(labelsList) + if text == "" { + return fmt.Errorf("internal error: makeText returned no text") + } + for _, label := range labelsList { + offset, length := strings.Index(text, label), len(label) + if offset < 0 { + return fmt.Errorf("internal error: could not find %q in text %q", label, text) + } + maxTextOffset, maxTextLength = max(maxTextOffset, offset), max(maxTextLength, length) + if offset >= 1<<nodesBitsTextOffset { + return fmt.Errorf("text offset %d is too large, or nodeBitsTextOffset is too small", offset) + } + if length >= 1<<nodesBitsTextLength { + return fmt.Errorf("text length %d is too large, or nodeBitsTextLength is too small", length) + } + labelEncoding[label] = uint32(offset)<<nodesBitsTextLength | uint32(length) + } + fmt.Fprintf(w, "// Text is the combined text of all labels.\nconst text = ") + for len(text) > 0 { + n, plus := len(text), "" + if n > 64 { + n, plus = 64, " +" + } + fmt.Fprintf(w, "%q%s\n", text[:n], plus) + text = text[n:] + } + + if err := n.walk(w, assignIndexes); err != nil { + return err + } + + fmt.Fprintf(w, ` + +// nodes is the list of nodes. Each node is represented as a uint32, which +// encodes the node's children, wildcard bit and node type (as an index into +// the children array), ICANN bit and text. +// +// If the table was generated with the -comments flag, there is a //-comment +// after each node's data. In it is the nodes-array indexes of the children, +// formatted as (n0x1234-n0x1256), with * denoting the wildcard bit. The +// nodeType is printed as + for normal, ! for exception, and o for parent-only +// nodes that have children but don't match a domain label in their own right. +// An I denotes an ICANN domain. +// +// The layout within the uint32, from MSB to LSB, is: +// [%2d bits] unused +// [%2d bits] children index +// [%2d bits] ICANN bit +// [%2d bits] text index +// [%2d bits] text length +var nodes = [...]uint32{ +`, + 32-nodesBitsChildren-nodesBitsICANN-nodesBitsTextOffset-nodesBitsTextLength, + nodesBitsChildren, nodesBitsICANN, nodesBitsTextOffset, nodesBitsTextLength) + if err := n.walk(w, printNode); err != nil { + return err + } + fmt.Fprintf(w, `} + +// children is the list of nodes' children, the parent's wildcard bit and the +// parent's node type. If a node has no children then their children index +// will be in the range [0, 6), depending on the wildcard bit and node type. +// +// The layout within the uint32, from MSB to LSB, is: +// [%2d bits] unused +// [%2d bits] wildcard bit +// [%2d bits] node type +// [%2d bits] high nodes index (exclusive) of children +// [%2d bits] low nodes index (inclusive) of children +var children=[...]uint32{ +`, + 32-childrenBitsWildcard-childrenBitsNodeType-childrenBitsHi-childrenBitsLo, + childrenBitsWildcard, childrenBitsNodeType, childrenBitsHi, childrenBitsLo) + for i, c := range childrenEncoding { + s := "---------------" + lo := c & (1<<childrenBitsLo - 1) + hi := (c >> childrenBitsLo) & (1<<childrenBitsHi - 1) + if lo != hi { + s = fmt.Sprintf("n0x%04x-n0x%04x", lo, hi) + } + nodeType := int(c>>(childrenBitsLo+childrenBitsHi)) & (1<<childrenBitsNodeType - 1) + wildcard := c>>(childrenBitsLo+childrenBitsHi+childrenBitsNodeType) != 0 + if *comments { + fmt.Fprintf(w, "0x%08x, // c0x%04x (%s)%s %s\n", + c, i, s, wildcardStr(wildcard), nodeTypeStr(nodeType)) + } else { + fmt.Fprintf(w, "0x%x,\n", c) + } + } + fmt.Fprintf(w, "}\n\n") + fmt.Fprintf(w, "// max children %d (capacity %d)\n", maxChildren, 1<<nodesBitsChildren-1) + fmt.Fprintf(w, "// max text offset %d (capacity %d)\n", maxTextOffset, 1<<nodesBitsTextOffset-1) + fmt.Fprintf(w, "// max text length %d (capacity %d)\n", maxTextLength, 1<<nodesBitsTextLength-1) + fmt.Fprintf(w, "// max hi %d (capacity %d)\n", maxHi, 1<<childrenBitsHi-1) + fmt.Fprintf(w, "// max lo %d (capacity %d)\n", maxLo, 1<<childrenBitsLo-1) + return nil +} + +type node struct { + label string + nodeType int + icann bool + wildcard bool + // nodesIndex and childrenIndex are the index of this node in the nodes + // and the index of its children offset/length in the children arrays. + nodesIndex, childrenIndex int + // firstChild is the index of this node's first child, or zero if this + // node has no children. + firstChild int + // children are the node's children, in strictly increasing node label order. + children []*node +} + +func (n *node) walk(w io.Writer, f func(w1 io.Writer, n1 *node) error) error { + if err := f(w, n); err != nil { + return err + } + for _, c := range n.children { + if err := c.walk(w, f); err != nil { + return err + } + } + return nil +} + +// child returns the child of n with the given label. The child is created if +// it did not exist beforehand. +func (n *node) child(label string) *node { + for _, c := range n.children { + if c.label == label { + return c + } + } + c := &node{ + label: label, + nodeType: nodeTypeParentOnly, + icann: true, + } + n.children = append(n.children, c) + sort.Sort(byLabel(n.children)) + return c +} + +type byLabel []*node + +func (b byLabel) Len() int { return len(b) } +func (b byLabel) Swap(i, j int) { b[i], b[j] = b[j], b[i] } +func (b byLabel) Less(i, j int) bool { return b[i].label < b[j].label } + +var nextNodesIndex int + +// childrenEncoding are the encoded entries in the generated children array. +// All these pre-defined entries have no children. +var childrenEncoding = []uint32{ + 0 << (childrenBitsLo + childrenBitsHi), // Without wildcard bit, nodeTypeNormal. + 1 << (childrenBitsLo + childrenBitsHi), // Without wildcard bit, nodeTypeException. + 2 << (childrenBitsLo + childrenBitsHi), // Without wildcard bit, nodeTypeParentOnly. + 4 << (childrenBitsLo + childrenBitsHi), // With wildcard bit, nodeTypeNormal. + 5 << (childrenBitsLo + childrenBitsHi), // With wildcard bit, nodeTypeException. + 6 << (childrenBitsLo + childrenBitsHi), // With wildcard bit, nodeTypeParentOnly. +} + +var firstCallToAssignIndexes = true + +func assignIndexes(w io.Writer, n *node) error { + if len(n.children) != 0 { + // Assign nodesIndex. + n.firstChild = nextNodesIndex + for _, c := range n.children { + c.nodesIndex = nextNodesIndex + nextNodesIndex++ + } + + // The root node's children is implicit. + if firstCallToAssignIndexes { + firstCallToAssignIndexes = false + return nil + } + + // Assign childrenIndex. + maxChildren = max(maxChildren, len(childrenEncoding)) + if len(childrenEncoding) >= 1<<nodesBitsChildren { + return fmt.Errorf("children table size %d is too large, or nodeBitsChildren is too small", len(childrenEncoding)) + } + n.childrenIndex = len(childrenEncoding) + lo := uint32(n.firstChild) + hi := lo + uint32(len(n.children)) + maxLo, maxHi = u32max(maxLo, lo), u32max(maxHi, hi) + if lo >= 1<<childrenBitsLo { + return fmt.Errorf("children lo %d is too large, or childrenBitsLo is too small", lo) + } + if hi >= 1<<childrenBitsHi { + return fmt.Errorf("children hi %d is too large, or childrenBitsHi is too small", hi) + } + enc := hi<<childrenBitsLo | lo + enc |= uint32(n.nodeType) << (childrenBitsLo + childrenBitsHi) + if n.wildcard { + enc |= 1 << (childrenBitsLo + childrenBitsHi + childrenBitsNodeType) + } + childrenEncoding = append(childrenEncoding, enc) + } else { + n.childrenIndex = n.nodeType + if n.wildcard { + n.childrenIndex += numNodeType + } + } + return nil +} + +func printNode(w io.Writer, n *node) error { + for _, c := range n.children { + s := "---------------" + if len(c.children) != 0 { + s = fmt.Sprintf("n0x%04x-n0x%04x", c.firstChild, c.firstChild+len(c.children)) + } + encoding := labelEncoding[c.label] + if c.icann { + encoding |= 1 << (nodesBitsTextLength + nodesBitsTextOffset) + } + encoding |= uint32(c.childrenIndex) << (nodesBitsTextLength + nodesBitsTextOffset + nodesBitsICANN) + if *comments { + fmt.Fprintf(w, "0x%08x, // n0x%04x c0x%04x (%s)%s %s %s %s\n", + encoding, c.nodesIndex, c.childrenIndex, s, wildcardStr(c.wildcard), + nodeTypeStr(c.nodeType), icannStr(c.icann), c.label, + ) + } else { + fmt.Fprintf(w, "0x%x,\n", encoding) + } + } + return nil +} + +func printNodeLabel(w io.Writer, n *node) error { + for _, c := range n.children { + fmt.Fprintf(w, "%q,\n", c.label) + } + return nil +} + +func icannStr(icann bool) string { + if icann { + return "I" + } + return " " +} + +func wildcardStr(wildcard bool) string { + if wildcard { + return "*" + } + return " " +} + +// combineText combines all the strings in labelsList to form one giant string. +// Overlapping strings will be merged: "arpa" and "parliament" could yield +// "arparliament". +func combineText(labelsList []string) string { + beforeLength := 0 + for _, s := range labelsList { + beforeLength += len(s) + } + + text := crush(removeSubstrings(labelsList)) + if *v { + fmt.Fprintf(os.Stderr, "crushed %d bytes to become %d bytes\n", beforeLength, len(text)) + } + return text +} + +type byLength []string + +func (s byLength) Len() int { return len(s) } +func (s byLength) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s byLength) Less(i, j int) bool { return len(s[i]) < len(s[j]) } + +// removeSubstrings returns a copy of its input with any strings removed +// that are substrings of other provided strings. +func removeSubstrings(input []string) []string { + // Make a copy of input. + ss := append(make([]string, 0, len(input)), input...) + sort.Sort(byLength(ss)) + + for i, shortString := range ss { + // For each string, only consider strings higher than it in sort order, i.e. + // of equal length or greater. + for _, longString := range ss[i+1:] { + if strings.Contains(longString, shortString) { + ss[i] = "" + break + } + } + } + + // Remove the empty strings. + sort.Strings(ss) + for len(ss) > 0 && ss[0] == "" { + ss = ss[1:] + } + return ss +} + +// crush combines a list of strings, taking advantage of overlaps. It returns a +// single string that contains each input string as a substring. +func crush(ss []string) string { + maxLabelLen := 0 + for _, s := range ss { + if maxLabelLen < len(s) { + maxLabelLen = len(s) + } + } + + for prefixLen := maxLabelLen; prefixLen > 0; prefixLen-- { + prefixes := makePrefixMap(ss, prefixLen) + for i, s := range ss { + if len(s) <= prefixLen { + continue + } + mergeLabel(ss, i, prefixLen, prefixes) + } + } + + return strings.Join(ss, "") +} + +// mergeLabel merges the label at ss[i] with the first available matching label +// in prefixMap, where the last "prefixLen" characters in ss[i] match the first +// "prefixLen" characters in the matching label. +// It will merge ss[i] repeatedly until no more matches are available. +// All matching labels merged into ss[i] are replaced by "". +func mergeLabel(ss []string, i, prefixLen int, prefixes prefixMap) { + s := ss[i] + suffix := s[len(s)-prefixLen:] + for _, j := range prefixes[suffix] { + // Empty strings mean "already used." Also avoid merging with self. + if ss[j] == "" || i == j { + continue + } + if *v { + fmt.Fprintf(os.Stderr, "%d-length overlap at (%4d,%4d): %q and %q share %q\n", + prefixLen, i, j, ss[i], ss[j], suffix) + } + ss[i] += ss[j][prefixLen:] + ss[j] = "" + // ss[i] has a new suffix, so merge again if possible. + // Note: we only have to merge again at the same prefix length. Shorter + // prefix lengths will be handled in the next iteration of crush's for loop. + // Can there be matches for longer prefix lengths, introduced by the merge? + // I believe that any such matches would by necessity have been eliminated + // during substring removal or merged at a higher prefix length. For + // instance, in crush("abc", "cde", "bcdef"), combining "abc" and "cde" + // would yield "abcde", which could be merged with "bcdef." However, in + // practice "cde" would already have been elimintated by removeSubstrings. + mergeLabel(ss, i, prefixLen, prefixes) + return + } +} + +// prefixMap maps from a prefix to a list of strings containing that prefix. The +// list of strings is represented as indexes into a slice of strings stored +// elsewhere. +type prefixMap map[string][]int + +// makePrefixMap constructs a prefixMap from a slice of strings. +func makePrefixMap(ss []string, prefixLen int) prefixMap { + prefixes := make(prefixMap) + for i, s := range ss { + // We use < rather than <= because if a label matches on a prefix equal to + // its full length, that's actually a substring match handled by + // removeSubstrings. + if prefixLen < len(s) { + prefix := s[:prefixLen] + prefixes[prefix] = append(prefixes[prefix], i) + } + } + + return prefixes +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/net/publicsuffix/list.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/net/publicsuffix/list.go new file mode 100644 index 0000000000000000000000000000000000000000..8405ac1b7457f40c71d69fc118a07eb1ab3cd46e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/net/publicsuffix/list.go @@ -0,0 +1,177 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:generate go run gen.go + +// Package publicsuffix provides a public suffix list based on data from +// https://publicsuffix.org/ +// +// A public suffix is one under which Internet users can directly register +// names. It is related to, but different from, a TLD (top level domain). +// +// "com" is a TLD (top level domain). Top level means it has no dots. +// +// "com" is also a public suffix. Amazon and Google have registered different +// siblings under that domain: "amazon.com" and "google.com". +// +// "au" is another TLD, again because it has no dots. But it's not "amazon.au". +// Instead, it's "amazon.com.au". +// +// "com.au" isn't an actual TLD, because it's not at the top level (it has +// dots). But it is an eTLD (effective TLD), because that's the branching point +// for domain name registrars. +// +// Another name for "an eTLD" is "a public suffix". Often, what's more of +// interest is the eTLD+1, or one more label than the public suffix. For +// example, browsers partition read/write access to HTTP cookies according to +// the eTLD+1. Web pages served from "amazon.com.au" can't read cookies from +// "google.com.au", but web pages served from "maps.google.com" can share +// cookies from "www.google.com", so you don't have to sign into Google Maps +// separately from signing into Google Web Search. Note that all four of those +// domains have 3 labels and 2 dots. The first two domains are each an eTLD+1, +// the last two are not (but share the same eTLD+1: "google.com"). +// +// All of these domains have the same eTLD+1: +// - "www.books.amazon.co.uk" +// - "books.amazon.co.uk" +// - "amazon.co.uk" +// Specifically, the eTLD+1 is "amazon.co.uk", because the eTLD is "co.uk". +// +// There is no closed form algorithm to calculate the eTLD of a domain. +// Instead, the calculation is data driven. This package provides a +// pre-compiled snapshot of Mozilla's PSL (Public Suffix List) data at +// https://publicsuffix.org/ +package publicsuffix // import "golang.org/x/net/publicsuffix" + +// TODO: specify case sensitivity and leading/trailing dot behavior for +// func PublicSuffix and func EffectiveTLDPlusOne. + +import ( + "fmt" + "net/http/cookiejar" + "strings" +) + +// List implements the cookiejar.PublicSuffixList interface by calling the +// PublicSuffix function. +var List cookiejar.PublicSuffixList = list{} + +type list struct{} + +func (list) PublicSuffix(domain string) string { + ps, _ := PublicSuffix(domain) + return ps +} + +func (list) String() string { + return version +} + +// PublicSuffix returns the public suffix of the domain using a copy of the +// publicsuffix.org database compiled into the library. +// +// icann is whether the public suffix is managed by the Internet Corporation +// for Assigned Names and Numbers. If not, the public suffix is either a +// privately managed domain (and in practice, not a top level domain) or an +// unmanaged top level domain (and not explicitly mentioned in the +// publicsuffix.org list). For example, "foo.org" and "foo.co.uk" are ICANN +// domains, "foo.dyndns.org" and "foo.blogspot.co.uk" are private domains and +// "cromulent" is an unmanaged top level domain. +// +// Use cases for distinguishing ICANN domains like "foo.com" from private +// domains like "foo.appspot.com" can be found at +// https://wiki.mozilla.org/Public_Suffix_List/Use_Cases +func PublicSuffix(domain string) (publicSuffix string, icann bool) { + lo, hi := uint32(0), uint32(numTLD) + s, suffix, icannNode, wildcard := domain, len(domain), false, false +loop: + for { + dot := strings.LastIndex(s, ".") + if wildcard { + icann = icannNode + suffix = 1 + dot + } + if lo == hi { + break + } + f := find(s[1+dot:], lo, hi) + if f == notFound { + break + } + + u := nodes[f] >> (nodesBitsTextOffset + nodesBitsTextLength) + icannNode = u&(1<<nodesBitsICANN-1) != 0 + u >>= nodesBitsICANN + u = children[u&(1<<nodesBitsChildren-1)] + lo = u & (1<<childrenBitsLo - 1) + u >>= childrenBitsLo + hi = u & (1<<childrenBitsHi - 1) + u >>= childrenBitsHi + switch u & (1<<childrenBitsNodeType - 1) { + case nodeTypeNormal: + suffix = 1 + dot + case nodeTypeException: + suffix = 1 + len(s) + break loop + } + u >>= childrenBitsNodeType + wildcard = u&(1<<childrenBitsWildcard-1) != 0 + if !wildcard { + icann = icannNode + } + + if dot == -1 { + break + } + s = s[:dot] + } + if suffix == len(domain) { + // If no rules match, the prevailing rule is "*". + return domain[1+strings.LastIndex(domain, "."):], icann + } + return domain[suffix:], icann +} + +const notFound uint32 = 1<<32 - 1 + +// find returns the index of the node in the range [lo, hi) whose label equals +// label, or notFound if there is no such node. The range is assumed to be in +// strictly increasing node label order. +func find(label string, lo, hi uint32) uint32 { + for lo < hi { + mid := lo + (hi-lo)/2 + s := nodeLabel(mid) + if s < label { + lo = mid + 1 + } else if s == label { + return mid + } else { + hi = mid + } + } + return notFound +} + +// nodeLabel returns the label for the i'th node. +func nodeLabel(i uint32) string { + x := nodes[i] + length := x & (1<<nodesBitsTextLength - 1) + x >>= nodesBitsTextLength + offset := x & (1<<nodesBitsTextOffset - 1) + return text[offset : offset+length] +} + +// EffectiveTLDPlusOne returns the effective top level domain plus one more +// label. For example, the eTLD+1 for "foo.bar.golang.org" is "golang.org". +func EffectiveTLDPlusOne(domain string) (string, error) { + suffix, _ := PublicSuffix(domain) + if len(domain) <= len(suffix) { + return "", fmt.Errorf("publicsuffix: cannot derive eTLD+1 for domain %q", domain) + } + i := len(domain) - len(suffix) - 1 + if domain[i] != '.' { + return "", fmt.Errorf("publicsuffix: invalid public suffix %q for domain %q", suffix, domain) + } + return domain[1+strings.LastIndex(domain[:i], "."):], nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/net/publicsuffix/table.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/net/publicsuffix/table.go new file mode 100644 index 0000000000000000000000000000000000000000..418f21677436ac6afc8b1887cf6de8fde4a36e83 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/net/publicsuffix/table.go @@ -0,0 +1,9753 @@ +// generated by go run gen.go; DO NOT EDIT + +package publicsuffix + +const version = "publicsuffix.org's public_suffix_list.dat, git revision 6f2b9e75eaf65bb75da83677655a59110088ebc5 (2018-10-03T13:34:55Z)" + +const ( + nodesBitsChildren = 10 + nodesBitsICANN = 1 + nodesBitsTextOffset = 15 + nodesBitsTextLength = 6 + + childrenBitsWildcard = 1 + childrenBitsNodeType = 2 + childrenBitsHi = 14 + childrenBitsLo = 14 +) + +const ( + nodeTypeNormal = 0 + nodeTypeException = 1 + nodeTypeParentOnly = 2 +) + +// numTLD is the number of top level domains. +const numTLD = 1546 + +// Text is the combined text of all labels. +const text = "9guacuiababia-goracleaningroks-theatreebinagisoccertificationatu" + + "rhistorisches3-ap-south-16-bambleclerc66biomutashinaiiyamanouchi" + + "kuhokuryugasakitcheninomiyakonojorpelandiyukindigenaklodzkochiku" + + "shinonsenergyukuhashimoichinosekigaharabirdartcenterprisesakimob" + + "etsuitainairforceoppdalimitednpalmspringsakerbirkenesoddtangenov" + + "araholtalenirasakindustriabirthplacebitballooningjovikarelianceb" + + "jarkoyurihonjournalisteinkjerusalembroideryusuharabjerkreimbarcl" + + "aycards3-eu-west-3utilitiesquare7bjugnieznord-aurdalpha-myqnapcl" + + "oud66blackfridayusuisserveircateringebuilderschmidtre-gauldalimo" + + "liserniablancomedicaltanissettaipeiheijindustriesteamfamberkeley" + + "uu2-localhostrowwlkpmgladefensells-for-less3-website-us-east-1bl" + + "oombergbauernuorochesterbloxcms3-website-us-west-1bluedancebmoat" + + "tachments3-website-us-west-2bms5yuzawabmweddinglassassinationalh" + + "eritagebnpparibaselburgleezebnrwedeploybomloabathsbcatholicaxias" + + "colipicenodumetlifeinsurancebondrangedalindaskvollindesnesakyota" + + "nabellunombresciabonnishiazainfinitintuitjomemorialinkyard-cloud" + + "eitybookingliwiceboomladbrokesalangenishigoboschaefflerdalvdalas" + + "kanittedallasallebesbyglandroverhalla-speziabostikariyaltakasago" + + "tpantheonsitebostonakijinsekikogentinglobalashovhachinohedmarkar" + + "lsoybotanicalgardenishiharabotanicgardenishiizunazukinuyamashina" + + "tsukigatakarazukameokameyamatotakadabotanybouncemerckmsdnipropet" + + "rovskjervoyagebounty-fullensakerrypropertiesalondonetskarmoybout" + + "iquebechattanooganordkappanamatsuzakinvestmentsaltdalivornobozen" + + "-suedtirolkuszczytnord-frontierbplacedekagaminord-odalwaysdataba" + + "seballangenoamishirasatochigiessensiositelemarkarpaczeladzlglobo" + + "avistaprintelligencebrandywinevalleybrasiliabrindisibenikebristo" + + "loseyouripirangap-northeast-3britishcolumbialowiezachpomorskieni" + + "shikatakatsukinzais-a-candidatebroadcastlefrakkestadray-dnstrace" + + "broadwaybroke-itjxfinitybrokerbronnoysundrayddnsfreebox-osascoli" + + "-picenordlandraydnsupdaterbrothermesaverdealstahaugesunderseapor" + + "tsinfolldalomzaporizhzheguris-a-catererbrowsersafetymarketsaludr" + + "ivefsnillfjordrobaknoluoktagajobojis-a-celticsfanishikatsuragit-" + + "repostre-totendofinternet-dnsalvadordalibabalsan-suedtirollagden" + + "esnaaseralingenkainanaejrietisalatinabenonicheltenham-radio-open" + + "airbusantiquest-a-la-maisondre-landroidrudunsalzburglogowegrowei" + + "bolognagatorockartuzybrumunddalondrinamsskoganeis-a-chefarmstead" + + "upontariodejaneirodoybrunelasticbeanstalkaruizawabrusselsamegawa" + + "bruxellesamnangerbryanskleppgafanpachigasakievennodesaarlandurba" + + "namexnetlifyis-a-conservativegarsheis-a-cpadualstackarumaifarsun" + + "durhamburgloppenzaolbia-tempio-olbiatempioolbialystokkembuchikum" + + "agayagawakkanaibetsubamericanfamilydscloudapplinzis-a-cubicle-sl" + + "avellinotairestaurantkmaxxjavald-aostaplesampagespeedmobilizerob" + + "rynewjerseybuskerudinewportlligatksatxn--0trq7p7nnishikawazukami" + + "tsuebuzentsujiiebuzzpanasonichernigovernmentmparaglidinglugmbhar" + + "tiffanybweirbzhitomirumalatvuopmicrolightingminakamichiharacolog" + + "nextdirectozsdeloittenrightathomeftparsannancolonialwilliamsburg" + + "rongacoloradoplateaudiocolumbusheycommunitysnesannohelplfinancia" + + "luccarbonia-iglesias-carboniaiglesiascarboniacomobaracomparemark" + + "erryhotelsanokashiwaracompute-1computerhistoryofscience-fictionc" + + "omsecuritytacticsantabarbaracondoshichinohealth-carereformitakeh" + + "araconferenceconstructionconsuladoharuovatrani-andria-barletta-t" + + "rani-andriaconsultanthropologyconsultingrossetouchihayaakasakawa" + + "haracontactraniandriabarlettatraniandriacontagematsubaracontempo" + + "raryarteducationalchikugojomedio-campidano-mediocampidanomedioco" + + "ntractorskenconventureshinodearthdfcbankashiwazakiyosemitecookin" + + "gchannelsdvrdnsdojoetsuwanouchikujogaszkolahppiacenzagancoolucer" + + "necooperativano-frankivskoleikangercopenhagencyclopedichirurgien" + + "s-dentistes-en-francecorsicahcesuolocus-2corvettemp-dnsantacruzs" + + "antafedjejuifminamidaitomandalukowfashioncosenzakopanexus-3cosid" + + "nsfor-better-thanawatchesantamariakecostumedizinhistorischesanto" + + "andreamhostersanukis-a-doctoraycouchpotatofriesaobernardownloady" + + "ndns-remotewdyndns-serverdaluroycouncilutskasukabedzin-the-banda" + + "ioiraseeklogesurancechirealmpmncouponsaogoncartoonartdecologiaco" + + "ursesaotomeloyalistjordalshalsencq-acranbrookuwanalyticsapporocr" + + "editcardyndns-webhopencraftranoycreditunioncremonashgabadaddjagu" + + "arqhachiojiyahoooshikamaishimodatecrewhalingroundhandlingroznycr" + + "icketrzyncrimeast-kazakhstanangercrotonecrownipartis-a-financial" + + "advisor-aurdaluxembourgrpartsardegnaroycrsvpartycruisesardiniacr" + + "yptonomichigangwoncuisinellair-traffic-controlleyculturalcentern" + + "opilawawhoswhokksundyndns-wikiracuneocupcakecuritibaghdadyndns-w" + + "orkisboringruecxn--12c1fe0bradescorporationcyberlevagangaviikano" + + "njis-a-geekasumigaurawa-mazowszextraspace-to-rentalstomakomaibar" + + "acymrussiacyonabaruminamiechizencyoutheworkpccwiiheyakageferrari" + + "ssagamiharaferreroticapebretonamicrosoftbankasuyamelbournefetsun" + + "dynnsarluxuryfguitarsaskatchewanfhvalerfidonnakanojohanamakinoha" + + "rafieldynservebbsarpsborguidefinimakanegasakinkobayashikaoirmina" + + "mifuranofigueresinstagingujoinvillevangerfilateliafilegearfilmin" + + "amiizukamishihoronobeauxartsandcraftsassaris-a-greenfinalfinance" + + "fineartsaudafinlandynuconnectransportefinnoyfirebaseappasadenara" + + "shinofirenzefirestonefirmdaleirvikaszubyfishingolffansauheradynv" + + "6fitjarfitnessettlementravelchannelfjalerflesbergulenflickragero" + + "tikakamigaharaflightsavannahgaflirflogintogurafloraflorenceflori" + + "davvenjargaulardalfloripaderbornfloristanohatajirittohmalvikatow" + + "iceflorogersaves-the-whalessandria-trani-barletta-andriatranibar" + + "lettaandriaflowersavonarusawafltravelersinsuranceflynnhosting-cl" + + "usterflynnhubargainstitutelevisionayorovigovtatsunobninskaragand" + + "authordalandemoneyokotempresashibetsukuibmdeportevadsobetsulikes" + + "-piedmonticellodingenavuotnaples3-eu-central-1fndynvpnplus-4for-" + + "ourfor-someeresistancefor-theaterforexrothachirogatakamatsukawaf" + + "orgotdnsaxoforsaleitungsenforsandasuololfortalfortmissoulancashi" + + "reggio-calabriafortworthadanorthwesternmutualforumzwildlifedorai" + + "nfracloudcontrolappassagensbschokokekschokoladenfosnescholarship" + + "schoolfotarivnefoxfordeatnurembergunmaoris-a-gurulvikatsushikabe" + + "eldengeluidyroyfozorafredrikstadtvschulefreeddnsgeekgalaxyfreede" + + "sktoperauniteroizumizakirovogradoyfreemasonryfreesitexashorokana" + + "iefreetlschwarzgwangjuniperfreiburguovdageaidnunzenfreightrdfres" + + "eniuscountryestateofdelawarezzoologyfribourgushikamifuranorth-ka" + + "zakhstanfriuli-v-giuliafriuli-ve-giuliafriuli-vegiuliafriuli-ven" + + "ezia-giuliafriuli-veneziagiuliafriuli-vgiuliafriuliv-giuliafriul" + + "ive-giuliafriulivegiuliafriulivenezia-giuliafriuliveneziagiuliaf" + + "riulivgiuliafrlfroganschweizfrognfrolandfrom-akrehamnfrom-alfrom" + + "-arfrom-azfrom-capetownnews-stagingwiddlewismillerfrom-codynalia" + + "sdaburfrom-ctrentin-sued-tirolfrom-dchiryukyuragifuchungbukharau" + + "malopolskanlandyndns-at-workinggrouparliamentoyosatoyonakagyokut" + + "oyokawafrom-debianfrom-flandersciencecentersciencehistoryfrom-ga" + + "usdalfrom-hichisochildrensgardenfrom-iafrom-idfrom-ilfrom-incheo" + + "nfrom-kscientistockholmestrandfrom-kyowariasahikawafrom-lancaste" + + "rfrom-mangonohejis-a-hard-workerfrom-mdfrom-meethnologyfrom-mifu" + + "nefrom-mnfrom-modalenfrom-mscjohnsonfrom-mtnfrom-nchitachinakaga" + + "wassamukawataricohdatsunanjoburgmodellingmxn--11b4c3dyndns-blogd" + + "nsamsclubindalorenskogrimstadyndns-freeboxosloftranakanotoddenis" + + "hinomiyashironofrom-ndfrom-nefrom-nh-serveblogsitextileksvikatsu" + + "yamarumorimachidafrom-njaworznotogawafrom-nminamimakis-a-hunterf" + + "rom-nv-infoodnetworkshoppingxn--12co0c3b4evalleaostaticscotlandf" + + "rom-nyfrom-ohkurafrom-oketohnoshooguyfrom-orfrom-padovaksdalfrom" + + "-pratohobby-sitefrom-ris-a-knightpointtokamachintaifun-dnsaliasi" + + "afrom-schoenbrunnfrom-sdfrom-tnfrom-txn--1ck2e1barreauctionflfan" + + "fshostrowiecasertairanzanquannefrankfurtattooceanographics3-fips" + + "-us-gov-west-1from-utazuerichardlikescandynamic-dnscrapper-sitef" + + "rom-val-daostavalleyfrom-vtrentin-suedtirolfrom-wafrom-wielunner" + + "from-wvalled-aostatoilfrom-wyfrosinonefrostalowa-wolawafroyahiko" + + "beardubaiduckdnscrappingfstavernfujiiderafujikawaguchikonefujimi" + + "nokamoenairportland-4-salernoboribetsuckscrysechitosetogitsuldal" + + "otenkawafujinomiyadavvesiidattowebcampinashikiminohosteroyrvikin" + + "gfujiokayamangyshlakasamatsudontexistmein-iservebeerfujisatoshon" + + "airtelefonicable-modemocraciafujisawafujishiroishidakabiratoride" + + "dyn-ip24fujitsurugashimaniwakuratefujixeroxn--1ctwolominamatakko" + + "kaminoyamaxunusualpersonfujiyoshidazaifudaigokaseljordfukayabeat" + + "serveminecraftrentino-a-adigefukuchiyamadafukudominichocolatemas" + + "ekasaokaminokawanishiaizubangefukuis-a-landscaperfukumitsubishig" + + "akiryuohtawaramotoineppuboliviajessheimperiafukuokazakisarazurec" + + "ontainerdpolicefukuroishikarikaturindalfukusakishiwadafukuyamaga" + + "takaharuslivinghistoryfunabashiriuchinadafunagatakahashimamakiso" + + "fukushimannore-og-uvdalfunahashikamiamakusatsumasendaisennangoog" + + "lecodespotaruis-a-lawyerfundaciofuoiskujukuriyamansionservemp3fu" + + "osskoczowilliamhillfurnitureggio-emilia-romagnakatombetsumitakag" + + "iizefurubirafurudonostiaafurukawairtrafficplexus-1fusodegaurafus" + + "saikisosakitagawafutabayamaguchinomigawafutboldlygoingnowhere-fo" + + "r-morenakatsugawafuttsurugiminamiminowafuturecmservep2passenger-" + + "associationfuturehostingfuturemailingfvgfylkesbiblackbaudcdn77-s" + + "ecurecifedexhibitionfyresdalhangoutsystemscloudfrontdoorhannanmo" + + "kuizumodenakayamarburghannosegawahanyuzenhapmirhareidsbergenhars" + + "tadharvestcelebrationhasamarcheapigeelvinckautokeinow-dnservesar" + + "casmatartanddesignhasaminami-alpssells-itrentino-aadigehashbangh" + + "asudahasura-appaviancarrierhasvikazohatogayaitakamoriokalmykiaha" + + "toyamazakitakamiizumisanofidelityhatsukaichikaiseis-a-linux-user" + + "anishiaritabashijonawatehattfjelldalhayashimamotobungotakadaplie" + + "rnewmexicoalhazuminobusellsyourhomegoodservicesevastopolehbodoes" + + "-itvedestrandhelsinkitakatakanabeautysfjordhembygdsforbundhemnes" + + "evenassisicilyhemsedalhepforgeherokussldheroyhgtvalledaostavange" + + "rhigashiagatsumagoianiahigashichichibunkyonanaoshimageandsoundan" + + "dvisionhigashihiroshimanehigashiizumozakitakyushuaiahigashikagaw" + + "ahigashikagurasoedahigashikawakitaaikitamihamadahigashikurumegur" + + "omskoghigashimatsushimaritimodernhigashimatsuyamakitaakitadaitoi" + + "gawahigashimurayamamotorcyclesewinbarrel-of-knowledgeologyokozem" + + "rhigashinarusembokukitamotosumy-gatewayhigashinehigashiomihachim" + + "anaustdalhigashiosakasayamanakakogawahigashishirakawamatakanezaw" + + "ahigashisumiyoshikawaminamiaikitanakagusukumoduminamiogunicomcas" + + "tresindevicesharis-a-llamarriottrentino-alto-adigehigashitsunosh" + + "iroomurahigashiurausukitashiobarahigashiyamatokoriyamanashiftedi" + + "tchyouripfizerhigashiyodogawahigashiyoshinogaris-a-musicianhirai" + + "zumisatokaizukaluganskypehirakatashinagawahiranais-a-nascarfanhi" + + "rarahiratsukagawahirayaizuwakamatsubushikusakadogawahistorichous" + + "esharpgfoggiahitachiomiyagildeskaliszhitachiotagopocznorfolkebib" + + "lelhitraeumtgeradellogliastradinghjartdalhjelmelandholeckobierzy" + + "ceholidayhomeipharmacienshawaiijimarnardalhomelinkitoolsztynsett" + + "lershellaspeziahomelinuxn--1lqs03nhomeofficehomesecuritymacapare" + + "cidahomesecuritypchofunatoriginsurecreationishinoomotegohomesens" + + "eminehomeunixn--1lqs71dhondahoneywellbeingzonehongotembaixadahon" + + "jyoitakaokamakurazakitaurayasudahornindalhorseoullensvanguardhor" + + "teneis-a-nurservegame-serverhospitalhoteleshimojis-a-painteracti" + + "vegaskimitsubatamibudejjuedischesapeakebayernrtrentino-altoadige" + + "hotmailhoyangerhoylandetroitskazunowruzhgorodeohumanitieshimokaw" + + "ahurdalhurumajis-a-patsfanhyllestadhyogoris-a-personaltrainerhyu" + + "gawarahyundaiwafunejfkharkovaojlljmphilatelyjnjcphiladelphiaarea" + + "dmyblogspotrentino-sued-tiroljoyentrentinoa-adigejoyokaichibalat" + + "inogiftshimotsumajpmorganjpnchoseiroumuenchenishinoshimatsushige" + + "jprshinichinanjurkoshunantankhmelnitskiyamarylandkosugekotohirad" + + "omainshinshinotsurgerykotourakouhokutamakis-a-studentalkounosupp" + + "lieshinshirokouyamashikekouzushimashikis-a-teacherkassymantechno" + + "logykozagawakozakis-a-techietis-a-photographerokuappharmacyshimo" + + "kitayamakozowindmillkpnkppspdnshintokushimakrasnodarkredstonekri" + + "stiansandcatshintomikasaharakristiansundkrodsheradkrokstadelvald" + + "aostarnbergkryminamisanrikubetsurfastpanelblagrarchaeologyeongbu" + + "klugsmileasinglest-mon-blogueurovisionionjukudoyamaceratabusebas" + + "topologyeonggiehtavuoatnagaivuotnagaokakyotambabydgoszczecinemad" + + "ridvagsoygardendoftheinternetflixilovecollegefantasyleaguernseyk" + + "umatorinokumejimasoykumenantokonamegatakasugais-a-therapistoiaku" + + "nisakis-an-accountantshimonitayanagithubusercontentrentino-s-tir" + + "olkunitachiarailwaykunitomigusukumamotoyamashikokuchuokunneppugl" + + "iakunstsammlungkunstunddesignkuokgrouphotographysiokurehabmerkur" + + "gankurobelaudiblebtimnetzkurogiminamiashigarakuroisoftwarendalen" + + "ugkuromatsunais-an-actorkurotakikawasakis-an-actresshimonosekika" + + "wakushirogawakustanais-an-anarchistoricalsocietykusupplykutchane" + + "lkutnokuzumakis-an-artisteigenkvafjordkvalsundkvamlidlugolekafjo" + + "rdkvanangenkvinesdalkvinnheradkviteseidskogkvitsoykwpspectrumina" + + "mitanekzmissilezajskmpspbarrell-of-knowledgeometre-experts-compt" + + "ables3-sa-east-1misugitokuyamatsumaebashikshacknetrentinoaadigem" + + "itourismolangevagrigentomologyeongnamegawakayamagazineat-urlmito" + + "yoakemiuramiyazurewebsiteshikagamiishibukawamiyotamanomjondalenm" + + "lbfanmonstermontrealestatefarmequipmentrentinoalto-adigemonza-br" + + "ianzaporizhzhiamonza-e-della-brianzapposhioyanaizumonzabrianzapt" + + "okyotangotsukitahatakahatakaishimogosenmonzaebrianzaramonzaedell" + + "abrianzamoonscalemoparachutingmordoviamoriyamatsumotofukemoriyos" + + "himinamiawajikis-certifiedogawarabikomaezakirunordreisa-geekddie" + + "lddanuorrikuzentakataiwanairguardiannakadomarinebraskaunjargalsa" + + "certmgretachikawakeisenbahnmormonmouthaebaruericssonyoursidegree" + + "moroyamatsunomortgagemoscowindowshirahamatonbetsurnadalmoseushis" + + "torymosjoenmoskeneshirakofuefukihaborokunohealthcareershiranukan" + + "agawamosshiraois-foundationmosviknx-serverrankoshigayanagawamote" + + "ginowaniihamatamakawajimanxn--2scrj9choshibuyachiyodattorelaymov" + + "iemovimientolgamovistargardmozilla-iotrentinoaltoadigemtranbymue" + + "nstermuginozawaonsenmuikamisunagawamukodairamulhouservehalflifes" + + "tylemunakatanemuncienciamuosattemupictetrentinos-tirolmurmanskol" + + "obrzegersundmurotorcraftrentinostirolmusashimurayamatsusakahogin" + + "ankokubunjis-gonemusashinoharamuseetrentinosued-tirolmuseumveren" + + "igingmusicargodaddyn-vpndnshiraokananiimihoboleslawiechoyodobash" + + "ichikashukujitawaravennakaiwamizawatchandclockashibatakasakiyosa" + + "tokigawamutsuzawamy-vigorgemy-wanggouvicenzamyactivedirectorymya" + + "sustor-elvdalmycdn77-sslattuminamiuonumassa-carrara-massacarrara" + + "massabusinessebyklegalloanshinyoshitomiokamogawamydattolocalhist" + + "orymyddnskingmydissentrentinosuedtirolmydroboehringerikemydshira" + + "takahagitlabormyeffectrentinsued-tirolmyfirewallonieruchomoscien" + + "ceandindustrynmyfritzmyftpaccesshishikuis-into-animeiwamarshalls" + + "tatebankfhappousrlmyhome-servermyjinomykolaivarggatrentinsuedtir" + + "olmymailermymediapchristiansburgriwataraidyndns-homednsamsungrok" + + "s-thisayamanobeokakudamatsuemyokohamamatsudamypepictureshisognem" + + "ypetshisuifuelveruminamiyamashirokawanabelembetsukubankhmelnytsk" + + "yivaporcloudnshinjournalismailillehammerfeste-iphilipsynology-di" + + "skstationmyphotoshibalestrandabergamoarekeymachinewhampshirebung" + + "oonoipifonyminanomypiagetmyiphostfoldnavymypsxn--30rr7ymysecurit" + + "ycamerakermyshopblockshitaramamytis-a-bookkeeperugiamytuleapiemo" + + "ntemyvnchristmasakinderoymywireitrentoyonezawapippulawypiszpitts" + + "burghofficialpiwatepixolinopizzapkomakiyosunndalplanetariumincom" + + "mbanklabudhabikinokawabarthadselfipatriaplantationplantshizuokan" + + "azawaplatformshangrilanshoujis-into-cartoonshimotsukeplaystation" + + "plazaplchromedicinakamagayachtsandnessjoenishiokoppegardyndns-ip" + + "armatta-varjjatoyotaparocherkasyno-dsandoyplumbingoplurinacional" + + "podlasiellaktyubinskiptveterinairealtorlandpodzonepohlpoivronpok" + + "erpokrovskomatsushimasfjordenpoliticartierpolitiendapolkowicepol" + + "tavalle-aostarostwodzislawinnershowapomorzeszowioshowtimemergenc" + + "yahabahcavuotnagareyamakeupowiathletajimabaridagawalbrzycharityd" + + "alceshriramsterdamnserverbaniapordenonepornporsangerporsangugepo" + + "rsgrunnanyokoshibahikariwanumatakazakis-into-gamessinazawapoznan" + + "praxis-a-bruinsfanprdpreservationpresidioprgmrprimelhusdecorativ" + + "eartsienarutomobellevuelosangelesjabbottrevisohughesigdalprincip" + + "eprivatizehealthinsuranceprochowiceproductionsilkomforbarsycente" + + "rtainmentaxihuanhktcp4profesionalprogressivenneslaskerrylogistic" + + "simple-urlpromombetsurgeonshalloffameldalpropertyprotectionproto" + + "netritonprudentialpruszkowitdkommunalforbundprzeworskogptplusgar" + + "denpupilotshizukuishimofusaitamatsukuris-into-carshimosuwalkis-a" + + "-playerpvhagakhanamigawapvtroandinosaurepaircraftingvollombardyn" + + "amisches-dnsirdalpwchryslerpzqldqponpesaro-urbino-pesarourbinope" + + "saromasvuotnaritakurashikis-leetnedalqslgbtrogstadquicksytesting" + + "quipelementslingqvchungnamdalseidfjordyndns-mailottestorfjordsto" + + "rjdevcloudcontrolledstpetersburgstreamuneuesokaneyamazoestudiost" + + "udyndns-at-homedepotenzamamidsundstuff-4-salestufftoread-booksne" + + "sokndalstuttgartrusteesusakis-lostrodawarasusonosuzakaniepcesuzu" + + "kanmakiwiensuzukis-not-certifieducatorahimeshimamateramobilysval" + + "bardunloppacifichurcharternidyndns-office-on-the-weberlincolnish" + + "itosashimizunaminamibosogndalottokorozawasveiosvelvikongsbergsvi" + + "zzerasvn-reposolarssonswedenswidnicasacamdvrcampinagrandebugatti" + + "pschlesischesologneswiebodzindianapolis-a-bloggerswiftcoverswino" + + "ujscienceandhistoryswisshikis-savedunetbankhakassiasynology-dsol" + + "undbeckomonowtvareservehttphoenixn--1qqw23atushuissier-justicetu" + + "valle-daostatic-accessootuxfamilytwmailvestre-slidrepbodynathome" + + "builtrvbashkiriautomotiveconomiasakuchinotsuchiurakawalmartatesh" + + "inanomachimkentateyamaustevollavangenaval-d-aosta-valleyboltatar" + + "antoyakokonoehimejibestaddnslivelanddnss3-ap-southeast-2ix4432-b" + + "ananarepublicaseihicampobassociatest-iservecounterstrike12hpaleo" + + "bihirosakikamijimatsuurabogadocscbgdyniabruzzoologicalvinklein-a" + + "ddrammenuernberggfarmerseine164-barcelonagasukeastcoastaldefence" + + "atonsbergjemnes3-ap-northeast-1337vestre-totennishiawakuravestva" + + "goyvevelstadvibo-valentiavibovalentiavideovillasnesoddenmarkhang" + + "elskjakdnepropetrovskiervaapsteiermarkoninjambylvinnicasadelamon" + + "edatingvinnytsiavipsinaappimientakayamattelekommunikationvirgini" + + "avirtual-userveexchangevirtualuserveftpinkomaganevirtueeldomein-" + + "vigorlicevirtuelvisakegawaviterboknowsitallvivoldavixn--32vp30ha" + + "gebostadvlaanderenvladikavkazimierz-dolnyvladimirvlogoipioneervo" + + "lkswagentsor-odalvologdanskonskowolayangrouphonefosshinjukumanov" + + "olvolkenkundenvolyngdalvossevangenvotevotingvotoyonowiwatsukiyon" + + "oticiaskoyabearalvahkijobserveronagarahkkeravjuegoshikikonaikawa" + + "chinaganoharamcoachampionshiphoptobishimaintenancebetsuikidsmyna" + + "sushiobarackmazerbaijan-mayenebakkeshibechambagriculturennebudap" + + "est-a-la-masionthewifiat-band-campaniawloclawekonsulatrobeepilep" + + "sydneywmflabsor-varangerworldworse-thandawowithgoogleapisa-hocke" + + "ynutsiracusakataketomisatotalwpdevcloudyclusterwritesthisblogsyt" + + "ewroclawithyoutuberspacekitagatakinouewtcminnesotaketakatoris-an" + + "-engineeringwtfastvps-serverisignwuozuwzmiuwajimaxn--3pxu8konyve" + + "lombardiamondshinkamigotoyohashimotottoris-a-rockstarachowicexn-" + + "-42c2d9axn--45br5cylxn--45brj9circustomerxn--45q11cistrondheimmo" + + "bilienishiwakis-a-democratoyotomiyazakis-a-designerxn--4gbrimini" + + "ngxn--4it168dxn--4it797kooris-a-socialistcgrouphdxn--4pvxs4allxn" + + "--54b7fta0ccitadeliveryggeexn--55qw42gxn--55qx5dxn--5js045dxn--5" + + "rtp49citichernihivgubarclays3-external-1xn--5rtq34kopervikherson" + + "xn--5su34j936bgsgxn--5tzm5gxn--6btw5axn--6frz82gxn--6orx2rxn--6q" + + "q986b3xlxn--7t0a264civilaviationissandiegoxn--80adxhksorfoldxn--" + + "80ao21axn--80aqecdr1axn--80asehdbasilicataniautoscanadaejeonbuk1" + + "2xn--80aswgxn--80audnedalnxn--8ltr62koryokamikawanehonbetsurutah" + + "araxn--8pvr4uxn--8y0a063axn--90a3academiamicaaarborteaches-yogas" + + "awaracingxn--90aeroportalabamagasakishimabaraogakibichuoxn--90ai" + + "shobarakawagoexn--90azhytomyravendbasketballyngenvironmentalcons" + + "ervationhlfanhs3-us-east-2xn--9dbhblg6dietcimdbatodayolasiteu-2x" + + "n--9dbq2axn--9et52uxn--9krt00axn--andy-iraxn--aroport-byandexn--" + + "3bst00minternationalfirearmshiojirishirifujiedaxn--asky-iraxn--a" + + "urskog-hland-jnbatsfjordiscountysvardolls3-us-gov-west-1xn--aver" + + "y-yuasakuhokkaidoomdnsiskinkyotobetsumidatlanticivilisationissay" + + "okkaichiropractichernivtsiciliaxn--b-5gaxn--b4w605ferdxn--balsan" + + "-sudtirol-rqis-slickharkivanylvenicexn--bck1b9a5dre4civilization" + + "issedalouvreisenisshingucciprianiigataishinomakindlegnicagliarib" + + "eiraokinawashirosatochiokinoshimaizuruhrxn--bdddj-mrabdxn--beara" + + "lvhki-y4axn--berlevg-jxaxn--bhcavuotna-s4axn--bhccavuotna-k7axn-" + + "-bidr-5nachikatsuuraxn--bievt-0qa2xn--bjarky-fyaotsurreyxn--bjdd" + + "ar-ptamayufuettertdasnetzxn--blt-elabourxn--bmlo-graingerxn--bod" + + "-2natalxn--bozen-sudtirol-76haibarakitahiroshimapartmentservepic" + + "servequakexn--brnny-wuacademy-firewall-gatewayxn--brnnysund-m8ac" + + "cident-investigation-aptibleaseating-organicbcieszynxn--brum-voa" + + "gatrysiljanxn--btsfjord-9zaxn--bulsan-sudtirol-rqis-uberleetrent" + + "ino-stirolxn--c1avgxn--c2br7gxn--c3s14misakis-an-entertainerxn--" + + "cck2b3bauhausposts-and-telecommunicationsncfdiscoveryombolzano-a" + + "ltoadigeu-3xn--cesena-forli-c2gxn--cesenaforli-0jgoraxn--cg4bkis" + + "-very-badajozxn--ciqpnxn--clchc0ea0b2g2a9gcdxn--comunicaes-v6a2o" + + "xn--correios-e-telecomunicaes-ghc29axn--czr694bbcn-north-1xn--cz" + + "rs0tulanxessolutionslupskommunexn--czru2dxn--czrw28bbtjmaxxxboxe" + + "napponazure-mobileu-4xn--d1acj3bbvacationswatch-and-clockerxn--d" + + "1alfaromeoxn--d1atunesomaxn--d5qv7z876civilwarmanagementoyotsuka" + + "idoxn--davvenjrga-y4axn--djrs72d6uyxn--djty4kosaigawaxn--dnna-gr" + + "ajewolterskluwerxn--drbak-wuaxn--dyry-iraxn--e1a4claimsandvikcor" + + "omantovalle-d-aostathellexn--eckvdtc9dxn--efvn9sorocabalsfjordxn" + + "--efvy88hair-surveillancexn--ehqz56nxn--elqq16hakatanortonxn--es" + + "tv75gxn--eveni-0qa01gaxn--f6qx53axn--fct429kosakaerodromegallupi" + + "nbarsyonlinewhollandevelopmentjeldsundgcanonoichinomiyakeu-1xn--" + + "fhbeiarnxn--finny-yuaxn--fiq228c5hsorreisahayakawakamiichikawami" + + "satourslzxn--fiq64beneventoeidsvollillesandefjordishakotanikkoeb" + + "enhavnikolaevents3-us-west-1xn--fiqs8sortlandxn--fiqz9soruminise" + + "rversicherungxn--fjord-lraxn--fjq720axn--fl-ziaxn--flor-jraxn--f" + + "lw351exn--forli-cesena-41gxn--forlicesena-ujgxn--fpcrj9c3dxn--fr" + + "de-grandrapidsoundcastronomy-routerxn--frna-woaraisaijosoyroroso" + + "uthcarolinarvikomorotsukamiokamikitayamatsuris-a-republicancerre" + + "searchaeologicaliforniaxn--frya-hraxn--fzc2c9e2clanbibaidarmenia" + + "xn--fzys8d69uvgmailxn--g2xx48cldmailowiczest-le-patroniyodogawax" + + "n--gckr3f0fauskedsmokorsetagayasells-for-ufcfanxn--gecrj9clickas" + + "hiharaxn--ggaviika-8ya47hakodatexn--gildeskl-g0axn--givuotna-8ya" + + "sakaiminatoyookannamilanotteroyxn--gjvik-wuaxn--gk3at1exn--gls-e" + + "lacaixaxn--gmq050is-very-evillagexn--gmqw5axn--h-2failxn--h1aegh" + + "akonexn--h2breg3evenesouthwestfalenxn--h2brj9c8clinichernovtsykk" + + "ylvenetogakushimotoganewyorkshirecipescaravantaarparisor-fronish" + + "imeraxn--h3cuzk1digitalxn--hbmer-xqaxn--hcesuolo-7ya35bentleyomi" + + "tanoceanographiqueverbankarasjohkamikoaniikappueblockbustermezgo" + + "rzeleccoffeedbackplaneapplegodoesntexisteingeekarasjokarasuyamar" + + "ugame-hostrolekamiminers3-us-west-2xn--hery-iraxn--hgebostad-g3a" + + "xn--hmmrfeasta-s4accident-prevention-webhostingxn--hnefoss-q1axn" + + "--hobl-iraxn--holtlen-hxaxn--hpmir-xqaxn--hxt814exn--hyanger-q1a" + + "xn--hylandet-54axn--i1b6b1a6a2exn--imr513nxn--indery-fyasugiving" + + "xn--io0a7is-very-goodyearxn--j1aefbsbxn--12cfi8ixb8luzernxn--j1a" + + "mhakubahccavuotnagasakikuchikuseikarugamvikaufenxn--j6w193gxn--j" + + "lq61u9w7beppublishproxyzjampagefrontappalmaseratiitatebayashiiba" + + "jddarchitecturealtychyattorneyagawakuyabukihokumakogenglandisrec" + + "htrainingjesdalillyonagoyaveroykeniwaizumiotsukumiyamazonawsadod" + + "gemologicallaziobiraustinnavigationavoibigawaukraanghkepnogataij" + + "i234lima-cityeatselinogradultarnobrzegyptian4tarumizusawaetnagah" + + "amaroyereportashkentatamotors3-ap-northeast-20001wwwebredirectme" + + "msettsupport3l3p0rtargets-itargivestbytomaritimekeeping12038xn--" + + "jlster-byasuokanraxn--jrpeland-54axn--jvr189misasaguris-byxn--k7" + + "yn95exn--karmy-yuaxn--kbrq7oxn--kcrx77d1x4axn--kfjord-iuaxn--klb" + + "u-woaxn--klt787dxn--kltp7dxn--kltx9axn--klty5xn--3ds443gxn--kolu" + + "okta-7ya57hakuis-a-liberalxn--kprw13dxn--kpry57dxn--kpu716fbx-os" + + "arufutsunomiyawakasaikaitakoelnxn--kput3is-very-nicexn--krager-g" + + "yatomitamamuraxn--kranghke-b0axn--krdsherad-m8axn--krehamn-dxaxn" + + "--krjohka-hwab49jdfastlylbarefootballfinanzgoraustrheimatunduhre" + + "nnesoyokosukanzakiyokawaraurskog-holandingjerdrumetacentrumeteor" + + "appalermomahachijolstereviewskrakowebspacebizenakasatsunairlined" + + "re-eikerevistanbulsan-suedtirol-o-g-i-natuurwetenschappenaumburg" + + "jerstadotsuruokakegawaugustowadaeguambulancebinordre-landd-dnsho" + + "me-webservercelliguriagrocerybnikahokutobamagentositecnologiajud" + + "aicadaques3-ap-southeast-1kappchizippodhaleangaviikadenaamesjevu" + + "emielno-ip6xn--ksnes-uuaxn--kvfjord-nxaxn--kvitsy-fyatsukanumazu" + + "ryxn--kvnangen-k0axn--l-1fairwindsowaxn--l1accentureklamborghini" + + "kis-very-sweetpepperxn--laheadju-7yatsushiroxn--langevg-jxaxn--l" + + "cvr32dxn--ldingen-q1axn--leagaviika-52beskidyn-o-saurlandes3-web" + + "site-ap-northeast-1xn--lesund-huaxn--lgbbat1ad8jelenia-goraxn--l" + + "grd-poacctunkongsvingerxn--lhppi-xqaxn--linds-pramericanarturyst" + + "ykanoyakumoldelmenhorstalbansomnarviikamitondabayashiogamagorizi" + + "axn--lns-qlapyxn--loabt-0qaxn--lrdal-sraxn--lrenskog-54axn--lt-l" + + "iacliniquenoharaxn--lten-granexn--lury-iraxn--m3ch0j3axn--mely-i" + + "raxn--merker-kuaxn--mgb2ddespeedpartnersnoasaitoshimayfirstjohnx" + + "n--mgb9awbfbxosasayamaxn--mgba3a3ejtuscanyxn--mgba3a4f16axn--mgb" + + "a3a4franamizuholdingspiegelxn--mgba7c0bbn0axn--mgbaakc7dvfedorap" + + "eopleirfjordyndns1xn--mgbaam7a8hakusanagochijiwadell-ogliastrade" + + "rxn--mgbab2bdxn--mgbai9a5eva00bestbuyshouses3-website-ap-southea" + + "st-1xn--mgbai9azgqp6jeonnamerikawauexn--mgbayh7gpalacexn--mgbb9f" + + "bpobanazawaxn--mgbbh1a71exn--mgbc0a9azcgxn--mgbca7dzdoxn--mgberp" + + "4a5d4a87gxn--mgberp4a5d4arxn--mgbgu82axn--mgbi4ecexposedxn--mgbp" + + "l2fhskydivingxn--mgbqly7c0a67fbclintonoshoesanfranciscofreakunem" + + "urorangeiseiyoichippubetsubetsugarugbyengerdalaheadjudygarlandyn" + + "dns-picsangoxn--mgbqly7cvafranziskanerimaringatlantakahamamuroga" + + "waxn--mgbt3dhdxn--mgbtf8flatangerxn--mgbtx2betainaboxfusejnynysa" + + "gaeroclubmedecincinnationwidealerimo-i-ranadexeterxn--mgbx4cd0ab" + + "bvieeexn--mix082fedoraprojectransurlvivanovodkamisatokashikiwaku" + + "nigamiharulminamiiselectrapaniizaxn--mix891feiraquarelleborkange" + + "rxn--mjndalen-64axn--mk0axindianmarketingxn--mk1bu44clothingdust" + + "kagoshimalselvendrellucaniaxn--mkru45is-with-thebandovre-eikerxn" + + "--mlatvuopmi-s4axn--mli-tlaquilanciaxn--mlselv-iuaxn--moreke-jua" + + "xn--mori-qsakuragawaxn--mosjen-eyawaraxn--mot-tlarvikoseis-a-sox" + + "fanxn--mre-og-romsdal-qqbhzcasinorddalimanowarudavocatanzarownpr" + + "oviderhcloudfunctions3-eu-west-1xn--msy-ula0haldenxn--mtta-vrjja" + + "t-k7afamilycompanycn-northwest-1xn--muost-0qaxn--mxtq1misawaxn--" + + "ngbc5azdxn--ngbe9e0axn--ngbrxn--3e0b707exn--nit225kosherbrookega" + + "waxn--nmesjevuemie-tcbaltimore-og-romsdalipayxn--nnx388axn--node" + + "ssakuraisleofmanchesterxn--nqv7fs00emaxn--nry-yla5gxn--ntso0iqx3" + + "axn--ntsq17gxn--nttery-byaeservehumourxn--nvuotna-hwaxn--nyqy26a" + + "xn--o1achaseljeepsongdalenviknaharimalborkdalxn--o3cw4halsaintlo" + + "uis-a-anarchistoireggiocalabriaxn--o3cyx2axn--od0algxn--od0aq3bi" + + "eigersundivtasvuodnakamuratajimidoriopretogoldpoint2thisamitsuke" + + "vje-og-hornnes3-website-ap-southeast-2xn--ogbpf8flekkefjordxn--o" + + "ppegrd-ixaxn--ostery-fyawatahamaxn--osyro-wuaxn--otu796dxn--p1ac" + + "fermochizukirkenesasebofagexn--p1aissmarterthanyoutwentexn--pbt9" + + "77cngrondarxn--pgbs0dhlxn--porsgu-sta26ferraraxn--pssu33lxn--pss" + + "y2uxn--q9jyb4cnpyatigorskodjeffersonxn--qcka1pmckinseyxn--qqqt11" + + "misconfusedxn--qxamusementdllcube-serversaillespjelkavikomvuxn--" + + "2m4a15exn--rady-iraxn--rdal-poaxn--rde-ulavagiskexn--rdy-0nabari" + + "xn--rennesy-v1axn--rhkkervju-01aflakstadaokagakicks-assedicnsanj" + + "otoyouraxn--rholt-mragowoodsideltaitogliattirespreadbettingxn--r" + + "hqv96gxn--rht27zxn--rht3dxn--rht61exn--risa-5nativeamericanantiq" + + "uespydebergxn--risr-iraxn--rland-uuaxn--rlingen-mxaxn--rmskog-by" + + "axn--rny31hammarfeastafricapitalonewspaperxn--rovu88bielawalterx" + + "n--rros-granvindafjordxn--rskog-uuaxn--rst-0naturalhistorymuseum" + + "centerxn--rsta-francaiseharaxn--rvc1e0am3exn--ryken-vuaxn--ryrvi" + + "k-byaxn--s-1faithruheredumbrellajollamericanexpressexyxn--s9brj9" + + "cntoystre-slidrettozawaxn--sandnessjen-ogbizxn--sandy-yuaxn--ser" + + "al-lraxn--ses554gxn--sgne-gratangenxn--skierv-utazassnasabaeroba" + + "ticketsrtromsojamisonxn--skjervy-v1axn--skjk-soaxn--sknit-yqaxn-" + + "-sknland-fxaxn--slat-5naturalsciencesnaturellesrvaroyxn--slt-ela" + + "bcgxn--smla-hraxn--smna-gratis-a-bulls-fanxn--snase-nraxn--sndre" + + "-land-0cbremangerxn--snes-poaxn--snsa-roaxn--sr-aurdal-l8axn--sr" + + "-fron-q1axn--sr-odal-q1axn--sr-varanger-ggbiellaakesvuemieleccex" + + "n--srfold-byaxn--srreisa-q1axn--srum-grazxn--stfold-9xaxn--stjrd" + + "al-s1axn--stjrdalshalsen-sqbieszczadygeyachimataikikugawarszawas" + + "hingtondclkaratexn--stre-toten-zcbstoragexn--sudtirol-y0emmafann" + + "-arboretumbriamallamaceioxn--t60b56axn--tckweatherchannelxn--tiq" + + "49xqyjetztrentino-suedtirolxn--tjme-hraxn--tn0agrinet-freakstord" + + "alxn--tnsberg-q1axn--tor131oxn--trany-yuaxn--trentin-sud-tirol-t" + + "sjcbnlxn--trentin-sudtirol-b9ixn--trentino-sud-tirol-dckoshimizu" + + "makizunokunimimatakashimarylhurstgoryxn--trentino-sudtirol-usjev" + + "nakershuscultureggioemiliaromagnamsosnowiechonanbuildingripexn--" + + "trentinosud-tirol-tsjewelryxn--trentinosudtirol-b9ixn--trentinsu" + + "d-tirol-98ixn--trentinsudtirol-rqixn--trgstad-r1axn--trna-woaxn-" + + "-troms-zuaxn--tysvr-vraxn--uc0atvestfoldxn--uc0ay4axn--uist22ham" + + "urakamigoris-a-libertarianxn--uisz3gxn--unjrga-rtaobaomoriguchih" + + "aragusartstoregontrailroadxn--unup4yxn--uuwu58axn--vads-jraxn--v" + + "allee-aoste-i2gxn--vallee-d-aoste-43handsonxn--valleeaoste-6jgxn" + + "--valleedaoste-i2gxn--vard-jraxn--vegrshei-c0axn--vermgensberate" + + "r-ctbievatmallorcafederationikonanporovnoddavoues3-eu-west-2xn--" + + "vermgensberatung-pwbifukagawashtenawdev-myqnapcloudaccesscambrid" + + "gestoneustarhubs3-website-eu-west-1xn--vestvgy-ixa6oxn--vg-yiabk" + + "haziaxn--vgan-qoaxn--vgsy-qoa0jewishartgalleryxn--vgu402coguchik" + + "uzenxn--vhquvestnesopotromsakakinokiaxn--vler-qoaxn--vre-eiker-k" + + "8axn--vrggt-xqadxn--vry-yla5gxn--vuq861bihorologyonaguniversityo" + + "riikaratsuginamikatagamilitaryoshiokaracoldwarmiastagexn--w4r85e" + + "l8fhu5dnraxn--w4rs40lxn--wcvs22dxn--wgbh1collectionxn--wgbl6axn-" + + "-xhq521bikedagestangeorgeorgiaxaustraliaisondriobranconagawalesu" + + "ndds3-ca-central-1xn--xkc2al3hye2axn--xkc2dl3a5ee0hangglidingxn-" + + "-y9a3aquariumishimasudaxn--yer-znaturbruksgymnxn--yfro4i67oxn--y" + + "garden-p1axn--ygbi2ammxn--3hcrj9circleverappspotagerxn--ystre-sl" + + "idre-ujbilbaogashimadachicagoboats3-website-sa-east-1xn--zbx025d" + + "xn--zf0ao64axn--zf0avxn--3oq18vl8pn36axn--zfr164billustrationino" + + "hekinannestadivttasvuotnakaniikawatanaguraxnbayxz" + +// nodes is the list of nodes. Each node is represented as a uint32, which +// encodes the node's children, wildcard bit and node type (as an index into +// the children array), ICANN bit and text. +// +// If the table was generated with the -comments flag, there is a //-comment +// after each node's data. In it is the nodes-array indexes of the children, +// formatted as (n0x1234-n0x1256), with * denoting the wildcard bit. The +// nodeType is printed as + for normal, ! for exception, and o for parent-only +// nodes that have children but don't match a domain label in their own right. +// An I denotes an ICANN domain. +// +// The layout within the uint32, from MSB to LSB, is: +// [ 0 bits] unused +// [10 bits] children index +// [ 1 bits] ICANN bit +// [15 bits] text index +// [ 6 bits] text length +var nodes = [...]uint32{ + 0x32bb03, + 0x35ab84, + 0x2ea546, + 0x2f5883, + 0x2f5886, + 0x38df86, + 0x3b0fc3, + 0x27d304, + 0x30e5c7, + 0x2ea188, + 0x1a000c2, + 0x1f3b587, + 0x379ac9, + 0x2bc2ca, + 0x2bc2cb, + 0x22ce83, + 0x2aaf06, + 0x2360c5, + 0x220a5c2, + 0x3d04c4, + 0x256c83, + 0x368605, + 0x2610c02, + 0x358f03, + 0x2b2c3c4, + 0x368e05, + 0x2e1ebc2, + 0x39610e, + 0x251343, + 0x3a9546, + 0x3200a82, + 0x2fb287, + 0x238a46, + 0x3601cc2, + 0x22f703, + 0x27fa44, + 0x222006, + 0x204248, + 0x27d006, + 0x312144, + 0x3a04542, + 0x345049, + 0x220947, + 0x3989c6, + 0x371889, + 0x2dff08, + 0x32da44, + 0x2cdf06, + 0x247c46, + 0x3e01702, + 0x3ac90f, + 0x22854e, + 0x226044, + 0x209cc5, + 0x32ba05, + 0x2f2249, + 0x23fbc9, + 0x222807, + 0x2755c6, + 0x275503, + 0x4227442, + 0x227443, + 0x33abca, + 0x4616583, + 0x35d585, + 0x329342, + 0x38fbc9, + 0x4a03902, + 0x203904, + 0x31a286, + 0x2c1705, + 0x36c284, + 0x5218bc4, + 0x203ac3, + 0x235104, + 0x5601b82, + 0x265fc4, + 0x5a73f44, + 0x30d64a, + 0x5e00882, + 0x2f1787, + 0x365588, + 0x6e07b82, + 0x274d07, + 0x22e484, + 0x2bf287, + 0x22e485, + 0x33f287, + 0x256006, + 0x28eac4, + 0x329b05, + 0x2903c7, + 0x7e0c8c2, + 0x366e43, + 0x20dec2, + 0x3cc743, + 0x820f642, + 0x282e85, + 0x8600202, + 0x2b9b44, + 0x279185, + 0x225f87, + 0x30cfce, + 0x23dec4, + 0x236904, + 0x206ec3, + 0x30f809, + 0x206ecb, + 0x326508, + 0x371648, + 0x255308, + 0x217f88, + 0x32d88a, + 0x33f187, + 0x2ab9c6, + 0x8a4b382, + 0x342b83, + 0x343cc3, + 0x3447c4, + 0x3b1003, + 0x342bc3, + 0x1736b02, + 0x8e03fc2, + 0x27ff05, + 0x2947c6, + 0x27cc04, + 0x35bd87, + 0x303cc6, + 0x30c4c4, + 0x385787, + 0x203fc3, + 0x92c8042, + 0x970e842, + 0x9a2bf02, + 0x22bf06, + 0x9e00282, + 0x2a3f45, + 0x338043, + 0x3cc1c4, + 0x2edb84, + 0x2edb85, + 0x201a03, + 0xa373a83, + 0xa605fc2, + 0x208145, + 0x20814b, + 0x209206, + 0x35cc0b, + 0x26dec4, + 0x20af89, + 0x20bc84, + 0xaa0bec2, + 0x20c703, + 0x20c983, + 0xae0d1c2, + 0x3ba0c3, + 0x20d1ca, + 0xb20d9c2, + 0x3d0745, + 0x2ddaca, + 0x3a0544, + 0x20d9c3, + 0x20e704, + 0x210103, + 0x210104, + 0x210107, + 0x210ac5, + 0x211b06, + 0x212346, + 0x213103, + 0x215f08, + 0x21cd03, + 0xb6068c2, + 0x246688, + 0x3c5f0b, + 0x21c008, + 0x21c606, + 0x21d687, + 0x224c48, + 0xc60abc2, + 0xcabf442, + 0x31bec8, + 0x305e47, + 0x208945, + 0x208948, + 0x2dc148, + 0x2d2a83, + 0x22b404, + 0x344802, + 0xce2c1c2, + 0xd211502, + 0xda2c302, + 0x22c303, + 0xde00dc2, + 0x27d2c3, + 0x3c4404, + 0x209483, + 0x367204, + 0x30eccb, + 0x235843, + 0x2e7046, + 0x235844, + 0x352e0e, + 0x34b9c5, + 0x2653c8, + 0x3a9647, + 0x3a964a, + 0x207083, + 0x35a987, + 0x207085, + 0x231c04, + 0x2d0c06, + 0x2d0c07, + 0x2fab84, + 0x2ef8c7, + 0x305884, + 0x2752c4, + 0x30d306, + 0x259ec4, + 0x3946c6, + 0x200dc3, + 0x208708, + 0x20dcc8, + 0x2368c3, + 0x3ba083, + 0x3b21c4, + 0x3b6803, + 0xe200bc2, + 0xe68be42, + 0x205883, + 0x203b86, + 0x2043c3, + 0x237f44, + 0xeb3fa82, + 0x355ac3, + 0x33fa83, + 0x213842, + 0xee01242, + 0x2c1ec6, + 0x237047, + 0x2f1e07, + 0x39b1c5, + 0x216184, + 0x28e705, + 0x273b07, + 0x2e81c9, + 0x2ec1c6, + 0x2fc4c8, + 0x3033c6, + 0xf20f382, + 0x335648, + 0x3cf806, + 0x389c85, + 0x3252c7, + 0x326144, + 0x326145, + 0x368244, + 0x368248, + 0xf608202, + 0xfa00482, + 0x347c46, + 0x200488, + 0x355e45, + 0x359bc6, + 0x380088, + 0x390d08, + 0xfe07f85, + 0x1026e144, + 0x38d147, + 0x1060b702, + 0x10b42c02, + 0x11e09302, + 0x31a385, + 0x286085, + 0x35d186, + 0x2ba987, + 0x22cec7, + 0x12609303, + 0x29de87, + 0x2e9f48, + 0x1ba2e889, + 0x3962c7, + 0x22fd47, + 0x2307c8, + 0x230fc6, + 0x231706, + 0x23234c, + 0x23378a, + 0x234107, + 0x235f8b, + 0x236e87, + 0x236e8e, + 0x1be37e04, + 0x238084, + 0x239547, + 0x260147, + 0x23e7c6, + 0x23e7c7, + 0x23ef87, + 0x1c22c842, + 0x23ff86, + 0x23ff8a, + 0x24080b, + 0x241f87, + 0x242a05, + 0x2439c3, + 0x243c06, + 0x243c07, + 0x271d83, + 0x1c600102, + 0x24448a, + 0x1cb7b002, + 0x1ce48b42, + 0x1d246382, + 0x1d638b42, + 0x248045, + 0x248804, + 0x1de17382, + 0x266045, + 0x240e03, + 0x20bd85, + 0x217e84, + 0x21b6c4, + 0x313046, + 0x26d486, + 0x208343, + 0x3b61c4, + 0x3cd043, + 0x1ee069c2, + 0x21da04, + 0x38d6c6, + 0x21da05, + 0x2cee86, + 0x3253c8, + 0x26d884, + 0x22d348, + 0x3a6745, + 0x323488, + 0x2b2c46, + 0x239087, + 0x28f304, + 0x28f306, + 0x29e183, + 0x3a1503, + 0x321188, + 0x32e984, + 0x35b407, + 0x2022d106, + 0x2dad09, + 0x3315c8, + 0x33fb08, + 0x34dc04, + 0x2029c3, + 0x23a182, + 0x20616502, + 0x20a12e42, + 0x204703, + 0x20e15c02, + 0x30e704, + 0x23c5c6, + 0x366f45, + 0x2a05c3, + 0x232804, + 0x2b1fc7, + 0x375183, + 0x23cdc8, + 0x21ef85, + 0x25d7c3, + 0x279105, + 0x279244, + 0x3030c6, + 0x222a44, + 0x223fc6, + 0x225ec6, + 0x2ba084, + 0x237243, + 0x21202dc2, + 0x236705, + 0x200843, + 0x21601802, + 0x232303, + 0x217905, + 0x2351c3, + 0x2351c9, + 0x21a00942, + 0x2221e5c2, + 0x28b745, + 0x214bc6, + 0x2031c6, + 0x320048, + 0x32004b, + 0x203bcb, + 0x220045, + 0x39b3c5, + 0x2c8789, + 0x1600c42, + 0x2ceb08, + 0x2090c4, + 0x22a012c2, + 0x207643, + 0x23260306, + 0x23e308, + 0x23604002, + 0x221688, + 0x23a07242, + 0x2b870a, + 0x23ecfe83, + 0x34e2c6, + 0x35c448, + 0x3143c8, + 0x2c4cc6, + 0x388c47, + 0x3acb07, + 0x2477ca, + 0x3a05c4, + 0x358c84, + 0x379649, + 0x247ac305, + 0x228746, + 0x21fb83, + 0x24fc84, + 0x24a23dc4, + 0x30f447, + 0x23a887, + 0x2b7844, + 0x28c1c5, + 0x35d248, + 0x248e47, + 0x2492c7, + 0x24e00d42, + 0x31c504, + 0x291648, + 0x24a9c4, + 0x24ce84, + 0x24dd05, + 0x24de47, + 0x22ee09, + 0x24eb04, + 0x24f309, + 0x24f548, + 0x24fa04, + 0x24fa07, + 0x25250043, + 0x2501c7, + 0x161f242, + 0x16ae502, + 0x250d46, + 0x251387, + 0x251784, + 0x252807, + 0x2542c7, + 0x254c43, + 0x23a302, + 0x204302, + 0x271243, + 0x271244, + 0x27124b, + 0x371748, + 0x25c484, + 0x258845, + 0x2592c7, + 0x25ab45, + 0x2d144a, + 0x25c3c3, + 0x25608282, + 0x21cc04, + 0x25ff09, + 0x264303, + 0x2643c7, + 0x28cbc9, + 0x2175c8, + 0x240643, + 0x27e207, + 0x27e889, + 0x26bf83, + 0x286604, + 0x2874c9, + 0x289a06, + 0x226283, + 0x202242, + 0x25dd03, + 0x3c79c7, + 0x2dc4c5, + 0x34ae46, + 0x2aa444, + 0x2f3b45, + 0x21a383, + 0x213346, + 0x20b182, + 0x3ada04, + 0x25a20f02, + 0x25e6df83, + 0x26202c02, + 0x24cd83, + 0x2127c4, + 0x2127c7, + 0x3cc4c6, + 0x2795c2, + 0x2665a082, + 0x3255c4, + 0x26a2c982, + 0x26e00ac2, + 0x2b00c4, + 0x2b00c5, + 0x36a785, + 0x361e86, + 0x2720a542, + 0x20a545, + 0x20cb85, + 0x20d583, + 0x212946, + 0x218ec5, + 0x22be82, + 0x354385, + 0x22be84, + 0x26d7c3, + 0x26da03, + 0x27607902, + 0x2d8307, + 0x39da84, + 0x39da89, + 0x24fb84, + 0x285f03, + 0x362448, + 0x27a85f04, + 0x285f06, + 0x2a3bc3, + 0x211f83, + 0x22b883, + 0x27ef9d82, + 0x2fdfc2, + 0x28200642, + 0x339c48, + 0x275c88, + 0x3b1606, + 0x24dbc5, + 0x3bcdc5, + 0x376587, + 0x2677c5, + 0x2049c2, + 0x28695b82, + 0x28a00042, + 0x2cd708, + 0x335585, + 0x2f2e84, + 0x24b605, + 0x24a387, + 0x25cb44, + 0x244382, + 0x28e032c2, + 0x349204, + 0x2270c7, + 0x28c707, + 0x33f244, + 0x293e43, + 0x236804, + 0x236808, + 0x231a46, + 0x2d0a8a, + 0x22ecc4, + 0x294348, + 0x289e44, + 0x21d786, + 0x295b44, + 0x31a686, + 0x39dd49, + 0x26ccc7, + 0x3263c3, + 0x29272302, + 0x2f7403, + 0x208b82, + 0x2966bc02, + 0x31dec6, + 0x383348, + 0x2a5087, + 0x3002c9, + 0x2937c9, + 0x2a6b05, + 0x2a7e09, + 0x2a85c5, + 0x2a8709, + 0x2a9a45, + 0x2aa708, + 0x29a0a244, + 0x29e54d87, + 0x230103, + 0x2aa907, + 0x230106, + 0x2ac007, + 0x2a2f05, + 0x2f0803, + 0x2a233542, + 0x20dc04, + 0x2a62c9c2, + 0x2aa55282, + 0x2f5b86, + 0x365505, + 0x2ae187, + 0x2569c3, + 0x33ca84, + 0x20e143, + 0x31bc03, + 0x2ae06982, + 0x2b607602, + 0x38e084, + 0x23a2c3, + 0x246ec5, + 0x2ba07502, + 0x2c203502, + 0x302b46, + 0x32eac4, + 0x322f04, + 0x322f0a, + 0x2ca005c2, + 0x269e83, + 0x2099ca, + 0x20f708, + 0x2ce1e084, + 0x2005c3, + 0x2065c3, + 0x255449, + 0x20e4c9, + 0x2a7746, + 0x2d20f8c3, + 0x219205, + 0x3301cd, + 0x20f8c6, + 0x21690b, + 0x2d600e82, + 0x21a208, + 0x2fe16002, + 0x30203a02, + 0x330805, + 0x30600b02, + 0x38f447, + 0x2e4607, + 0x201083, + 0x374288, + 0x30a02382, + 0x2a9504, + 0x294043, + 0x30a585, + 0x240f06, + 0x229684, + 0x3ba043, + 0x2aeb83, + 0x30e06682, + 0x39b344, + 0x3b8145, + 0x3bd507, + 0x27c0c3, + 0x2ae783, + 0x16ae842, + 0x2ae843, + 0x2aeb03, + 0x312027c2, + 0x319584, + 0x26d686, + 0x3a5fc3, + 0x2af743, + 0x316b0442, + 0x2b0448, + 0x2b1004, + 0x319b46, + 0x25f507, + 0x363a86, + 0x2ccec4, + 0x3f204a82, + 0x22ffcb, + 0x2f7cce, + 0x21574f, + 0x2e01c3, + 0x3fa5dcc2, + 0x1642582, + 0x3fe02342, + 0x290ec3, + 0x203ec3, + 0x2e8446, + 0x335b86, + 0x202347, + 0x302144, + 0x40214d02, + 0x4061f482, + 0x36f685, + 0x2ef247, + 0x397c86, + 0x40a0a482, + 0x20a484, + 0x2b5503, + 0x40e06d82, + 0x41370883, + 0x2b5d04, + 0x2be749, + 0x416c3c82, + 0x41a0eec2, + 0x3326c5, + 0x41ec4182, + 0x42202902, + 0x358007, + 0x210549, + 0x379d4b, + 0x3ac8c5, + 0x26ae09, + 0x392786, + 0x209247, + 0x42602904, + 0x2115c9, + 0x343147, + 0x211287, + 0x2217c3, + 0x2aff46, + 0x31ccc7, + 0x2450c3, + 0x286486, + 0x42e0d482, + 0x43235442, + 0x34b803, + 0x33c685, + 0x2017c7, + 0x21ba06, + 0x2dc445, + 0x35d644, + 0x288ac5, + 0x2fd9c4, + 0x43604582, + 0x3cc947, + 0x2c2c84, + 0x20e3c4, + 0x20e3cd, + 0x2d4ec9, + 0x22c908, + 0x256ec4, + 0x366385, + 0x204587, + 0x208f04, + 0x303d87, + 0x20ec45, + 0x43a0fc84, + 0x2e4c85, + 0x262fc4, + 0x284246, + 0x2ba785, + 0x43e0a442, + 0x3a36c3, + 0x2dc584, + 0x2dc585, + 0x344d46, + 0x239885, + 0x26eb04, + 0x259943, + 0x215b46, + 0x2febc5, + 0x304705, + 0x2ba884, + 0x22ed43, + 0x22ed4c, + 0x4434f5c2, + 0x4460a802, + 0x44a05142, + 0x216c03, + 0x216c04, + 0x44e0bcc2, + 0x307fc8, + 0x34af05, + 0x243344, + 0x24a1c6, + 0x45210e42, + 0x45627bc2, + 0x45a01e02, + 0x2b4dc5, + 0x2b9f46, + 0x226dc4, + 0x222546, + 0x2f1546, + 0x201e03, + 0x45f45b8a, + 0x26b185, + 0x33ab83, + 0x21ed06, + 0x390809, + 0x21ed07, + 0x29e608, + 0x2dfdc9, + 0x364a48, + 0x313946, + 0x206e83, + 0x4629df02, + 0x3a2b88, + 0x4664f602, + 0x46a09382, + 0x209383, + 0x2e1305, + 0x26bb04, + 0x249c49, + 0x2f0dc4, + 0x20fac8, + 0x20c103, + 0x4730f144, + 0x214c08, + 0x20e307, + 0x4760a502, + 0x23c182, + 0x32b985, + 0x2497c9, + 0x2287c3, + 0x280c04, + 0x330184, + 0x204603, + 0x281d4a, + 0x47b0b282, + 0x47e0da42, + 0x2c7fc3, + 0x392a03, + 0x162e902, + 0x3a9303, + 0x48225282, + 0x48603542, + 0x48a29d44, + 0x344306, + 0x302d86, + 0x241704, + 0x27a103, + 0x203543, + 0x2f8343, + 0x240b86, + 0x256345, + 0x2c8147, + 0x2cb445, + 0x2ce6c6, + 0x2cf348, + 0x2cf546, + 0x282384, + 0x29a4cb, + 0x2d2f43, + 0x2d2f45, + 0x2d33c8, + 0x227682, + 0x358302, + 0x48e480c2, + 0x49204842, + 0x214d43, + 0x4966ca42, + 0x26ca43, + 0x2d3d83, + 0x49e01ac2, + 0x4a2d7d46, + 0x25a9c6, + 0x4a6d7e82, + 0x4aa0c9c2, + 0x4ae6da42, + 0x4b207e02, + 0x4b61e302, + 0x4ba00a42, + 0x20f003, + 0x38da45, + 0x366506, + 0x4be26004, + 0x38d4ca, + 0x3aab06, + 0x2e6944, + 0x29a843, + 0x4ca05f02, + 0x203202, + 0x238003, + 0x4ce15c83, + 0x307907, + 0x2ba687, + 0x4e671347, + 0x3c6147, + 0x22a083, + 0x34b28a, + 0x2655c4, + 0x22d004, + 0x22d00a, + 0x23ad05, + 0x4ea0f742, + 0x250d03, + 0x4ee00602, + 0x24fb43, + 0x2f73c3, + 0x4f600582, + 0x29de04, + 0x219d84, + 0x3c46c5, + 0x3129c5, + 0x3287c6, + 0x332e86, + 0x4fa3ce82, + 0x4fe01e82, + 0x3c8805, + 0x25a6d2, + 0x349d06, + 0x289d83, + 0x2ac846, + 0x308285, + 0x1604742, + 0x5820d742, + 0x36b3c3, + 0x20d743, + 0x273903, + 0x5860b302, + 0x241f03, + 0x58a1b382, + 0x229d83, + 0x3195c8, + 0x2a6983, + 0x2a6986, + 0x336107, + 0x317846, + 0x31784b, + 0x2e6887, + 0x2fbd44, + 0x59201a82, + 0x34ad85, + 0x59615c43, + 0x22e043, + 0x2b8905, + 0x34b183, + 0x59b4b186, + 0x2cec8a, + 0x241383, + 0x221f04, + 0x2003c6, + 0x38a086, + 0x59e4b583, + 0x33c947, + 0x2a7647, + 0x29c405, + 0x345e86, + 0x29e743, + 0x5ca12b83, + 0x5ce04782, + 0x229b04, + 0x22b509, + 0x35ac45, + 0x22d8c4, + 0x381808, + 0x243605, + 0x5d243ac5, + 0x25b489, + 0x398a83, + 0x248ac4, + 0x5d602882, + 0x214f43, + 0x5da95602, + 0x2a0206, + 0x16256c2, + 0x5de07d02, + 0x2b4cc8, + 0x324b83, + 0x2e4bc7, + 0x317ac5, + 0x2b4885, + 0x2be94b, + 0x2e52c6, + 0x2beb46, + 0x2e64c6, + 0x33af44, + 0x2d5886, + 0x5e2e2c08, + 0x235903, + 0x271603, + 0x271604, + 0x314984, + 0x316dc7, + 0x2e96c5, + 0x5e6e9802, + 0x5ea057c2, + 0x2057c5, + 0x2ebd44, + 0x2ebd4b, + 0x2eda88, + 0x257d84, + 0x5f20a4c2, + 0x5f657d02, + 0x2b0683, + 0x2eec84, + 0x2eef45, + 0x2efa87, + 0x2f29c4, + 0x220084, + 0x5fa03d02, + 0x37db89, + 0x2f4005, + 0x3acb85, + 0x2f4b85, + 0x5fe14e83, + 0x2f68c4, + 0x2f68cb, + 0x2f7584, + 0x2f784b, + 0x2f8285, + 0x21588a, + 0x2f8a48, + 0x2f8c4a, + 0x2f9203, + 0x2f920a, + 0x6064b4c2, + 0x60a44042, + 0x60e82583, + 0x612fc442, + 0x2fc443, + 0x6177f302, + 0x61b387c2, + 0x2fc804, + 0x216046, + 0x222285, + 0x2fe403, + 0x32c0c6, + 0x221d85, + 0x2e1984, + 0x61e00902, + 0x2aef44, + 0x2c840a, + 0x2ee807, + 0x365346, + 0x35a7c7, + 0x23ffc3, + 0x2b5d48, + 0x3ac54b, + 0x2bed45, + 0x335285, + 0x335286, + 0x2e8744, + 0x205dc8, + 0x232203, + 0x247b44, + 0x247b47, + 0x2fb986, + 0x3691c6, + 0x352c4a, + 0x2292c4, + 0x2292ca, + 0x62373586, + 0x373587, + 0x2588c7, + 0x276644, + 0x276649, + 0x26d345, + 0x22d58b, + 0x2eb483, + 0x224183, + 0x6261a1c3, + 0x231e04, + 0x62a00682, + 0x2ed586, + 0x62f21b45, + 0x2aca85, + 0x253186, + 0x29f044, + 0x63208ac2, + 0x243a04, + 0x63606702, + 0x38a845, + 0x336904, + 0x64224583, + 0x6460d782, + 0x20d783, + 0x2669c6, + 0x64a022c2, + 0x225d08, + 0x21eb84, + 0x21eb86, + 0x393286, + 0x206784, + 0x215ac5, + 0x26e048, + 0x2e1d87, + 0x347d87, + 0x347d8f, + 0x291546, + 0x23fdc3, + 0x24a104, + 0x20cc83, + 0x21d8c4, + 0x2591c4, + 0x64e0dc42, + 0x28bb43, + 0x25b683, + 0x65201202, + 0x22f903, + 0x30e7c3, + 0x210b4a, + 0x208b07, + 0x25bd4c, + 0x25c006, + 0x25d886, + 0x25f207, + 0x65630c07, + 0x26c6c9, + 0x2467c4, + 0x271dc4, + 0x65a14d82, + 0x65e03182, + 0x353006, + 0x33c744, + 0x28bfc6, + 0x231088, + 0x23e144, + 0x38f486, + 0x203185, + 0x2939c8, + 0x203dc3, + 0x294fc5, + 0x29a743, + 0x3acc83, + 0x3acc84, + 0x21cbc3, + 0x6625dbc2, + 0x66601bc2, + 0x2eb349, + 0x2a3045, + 0x2a5604, + 0x2a60c5, + 0x20f584, + 0x2c5987, + 0x3899c5, + 0x66a71504, + 0x271508, + 0x2eb5c6, + 0x2f07c4, + 0x2f0c48, + 0x2f2107, + 0x66e0ac02, + 0x2f6b44, + 0x20cd44, + 0x2b8287, + 0x6720ac04, + 0x2d0182, + 0x6760eb02, + 0x21ae83, + 0x2dd204, + 0x2a1503, + 0x2a1505, + 0x67a28f82, + 0x2fe2c5, + 0x265ac2, + 0x3a0905, + 0x2b8105, + 0x67e0ed82, + 0x33fa04, + 0x68200b42, + 0x200b46, + 0x324806, + 0x249908, + 0x2bfc88, + 0x2f5b04, + 0x305345, + 0x3432c9, + 0x39b444, + 0x2cec44, + 0x213043, + 0x68647905, + 0x383507, + 0x24e805, + 0x286184, + 0x3a6b8d, + 0x2e03c2, + 0x2e03c3, + 0x3af183, + 0x68a010c2, + 0x3a5905, + 0x2298c7, + 0x2b7084, + 0x3c6207, + 0x2dffc9, + 0x2c8549, + 0x2783c7, + 0x28e203, + 0x3249c8, + 0x26a389, + 0x3b6887, + 0x3c1245, + 0x2ff806, + 0x2ffe06, + 0x2fff85, + 0x2d4fc5, + 0x68e04082, + 0x27a905, + 0x2b2f08, + 0x2c1c86, + 0x6936a147, + 0x2b7784, + 0x2b23c7, + 0x3022c6, + 0x69643a42, + 0x344a46, + 0x306c4a, + 0x3074c5, + 0x69ae6b02, + 0x69e8c8c2, + 0x31d006, + 0x2b3d48, + 0x6a28c8c7, + 0x6a617302, + 0x217f03, + 0x209746, + 0x224944, + 0x3c0c06, + 0x36a486, + 0x3694ca, + 0x30bec5, + 0x2759c6, + 0x2f7203, + 0x2f7204, + 0x2023c2, + 0x32ea43, + 0x6aa16c42, + 0x2f96c3, + 0x209c44, + 0x2b3e84, + 0x2b3e8a, + 0x2189c3, + 0x27d0ca, + 0x280ec7, + 0x310ac6, + 0x256bc4, + 0x2926c2, + 0x2a42c2, + 0x6ae007c2, + 0x2367c3, + 0x258687, + 0x2007c7, + 0x288544, + 0x3af007, + 0x2efb86, + 0x22c007, + 0x305f84, + 0x3a6a85, + 0x217145, + 0x6b20fa02, + 0x343d46, + 0x21c3c3, + 0x229502, + 0x229506, + 0x6b60e382, + 0x6ba16a42, + 0x3c4245, + 0x6be17442, + 0x6c201102, + 0x32ec05, + 0x2c9fc5, + 0x2a5cc5, + 0x6c65e083, + 0x23c685, + 0x2e5387, + 0x31e605, + 0x34d085, + 0x2654c4, + 0x2ed386, + 0x3ad084, + 0x6ca008c2, + 0x6d784ec5, + 0x2a4687, + 0x366048, + 0x250586, + 0x25058d, + 0x2547c9, + 0x2547d2, + 0x3013c5, + 0x30a103, + 0x6da09702, + 0x31f384, + 0x20f943, + 0x345445, + 0x308ac5, + 0x6de2c682, + 0x25d803, + 0x6e25a482, + 0x6eabf5c2, + 0x6ee00082, + 0x2e3c85, + 0x3c6343, + 0x24e548, + 0x6f202202, + 0x6f602a82, + 0x29ddc6, + 0x3c9d4a, + 0x20f183, + 0x239803, + 0x343543, + 0x70602fc2, + 0x7ea13d82, + 0x7f20c842, + 0x204fc2, + 0x344849, + 0x2c30c4, + 0x2a9d48, + 0x7f6fe442, + 0x7fa08602, + 0x2ab005, + 0x2363c8, + 0x320648, + 0x34f04c, + 0x239b03, + 0x7fe62982, + 0x80205cc2, + 0x282706, + 0x311945, + 0x2559c3, + 0x27bec6, + 0x311a86, + 0x2842c3, + 0x313403, + 0x313e46, + 0x315404, + 0x255706, + 0x21904a, + 0x38e904, + 0x315ac4, + 0x31620a, + 0x8065c302, + 0x38ea85, + 0x316f8a, + 0x317fc5, + 0x318884, + 0x318986, + 0x318b04, + 0x215206, + 0x80a2c6c2, + 0x2f5506, + 0x3cce85, + 0x30ad07, + 0x3a9e46, + 0x25f404, + 0x2da787, + 0x345ac6, + 0x23b485, + 0x23b487, + 0x3b7ac7, + 0x3b7ace, + 0x27b7c6, + 0x303c45, + 0x20ab47, + 0x20ca03, + 0x20ca07, + 0x222f45, + 0x22c204, + 0x23a842, + 0x2451c7, + 0x3021c4, + 0x245684, + 0x28720b, + 0x219683, + 0x2cf687, + 0x219684, + 0x2f0647, + 0x2930c3, + 0x3470cd, + 0x3a65c8, + 0x245fc4, + 0x271405, + 0x31d605, + 0x31da43, + 0x80e1ea82, + 0x31f983, + 0x320303, + 0x343ec4, + 0x27e985, + 0x21c447, + 0x2f7286, + 0x390643, + 0x26da8b, + 0x27494b, + 0x30880b, + 0x2d268b, + 0x2e6b4a, + 0x32ff0b, + 0x36db4b, + 0x39770c, + 0x3cf58b, + 0x3d1551, + 0x320c4a, + 0x321f4b, + 0x32220c, + 0x32250b, + 0x322a4a, + 0x323cca, + 0x324f8e, + 0x3256cb, + 0x32598a, + 0x327011, + 0x32744a, + 0x32794b, + 0x327e8e, + 0x328a8c, + 0x328f0b, + 0x3291ce, + 0x32954c, + 0x32a04a, + 0x32b34c, + 0x8132b64a, + 0x32c248, + 0x32ce09, + 0x32efca, + 0x32f24a, + 0x32f4cb, + 0x333a0e, + 0x334911, + 0x33e289, + 0x33e4ca, + 0x33ef0b, + 0x340d4a, + 0x341596, + 0x34290b, + 0x342e8a, + 0x3437ca, + 0x34454b, + 0x344ec9, + 0x347a49, + 0x34864d, + 0x348f8b, + 0x349e8b, + 0x34a84b, + 0x34bf09, + 0x34c54e, + 0x34d24a, + 0x34e70a, + 0x34eb4a, + 0x34f68b, + 0x34fecb, + 0x350b4d, + 0x3538cd, + 0x354010, + 0x3544cb, + 0x354fcc, + 0x355bcb, + 0x357b0b, + 0x35914e, + 0x3598cb, + 0x3598cd, + 0x36098b, + 0x36140f, + 0x3617cb, + 0x36200a, + 0x362649, + 0x362e49, + 0x81763c0b, + 0x363ece, + 0x36b88b, + 0x36c70f, + 0x36e68b, + 0x36e94b, + 0x36ec0b, + 0x36f7ca, + 0x379949, + 0x37c84f, + 0x38140c, + 0x381fcc, + 0x38258e, + 0x382a8f, + 0x382e4e, + 0x3836d0, + 0x383acf, + 0x38448e, + 0x38504c, + 0x385352, + 0x386111, + 0x38690e, + 0x386d8e, + 0x3872cb, + 0x3872ce, + 0x38764f, + 0x387a0e, + 0x387d93, + 0x388251, + 0x38868c, + 0x38898e, + 0x388e0c, + 0x389353, + 0x38b310, + 0x38c08c, + 0x38c38c, + 0x38c84b, + 0x38dc8e, + 0x38e18b, + 0x38f84b, + 0x390a4c, + 0x396b4a, + 0x396f0c, + 0x39720c, + 0x397509, + 0x398b4b, + 0x398e08, + 0x3995c9, + 0x3995cf, + 0x39ad4b, + 0x81b9bb4a, + 0x39e98c, + 0x39fb4b, + 0x39fe09, + 0x3a06c8, + 0x3a0e0b, + 0x3a12cb, + 0x3a1e4a, + 0x3a20cb, + 0x3a290c, + 0x3a32c8, + 0x3a6ecb, + 0x3a9a8b, + 0x3ab70e, + 0x3acd8b, + 0x3ae18b, + 0x3b764b, + 0x3b7909, + 0x3b7e4d, + 0x3c168a, + 0x3c3b97, + 0x3c4f18, + 0x3c8109, + 0x3c974b, + 0x3cad94, + 0x3cb28b, + 0x3cb80a, + 0x3cbcca, + 0x3cbf4b, + 0x3cd490, + 0x3cd891, + 0x3cdf4a, + 0x3ceb8d, + 0x3cf28d, + 0x3d198b, + 0x343e43, + 0x81f64543, + 0x2ec646, + 0x2412c5, + 0x27f187, + 0x32fdc6, + 0x16602c2, + 0x2d8e09, + 0x32bec4, + 0x2e2748, + 0x21a103, + 0x31f2c7, + 0x217402, + 0x2ae1c3, + 0x8220c882, + 0x2c9886, + 0x2cac84, + 0x229ec4, + 0x377843, + 0x377845, + 0x82ac41c2, + 0x82ea8a84, + 0x276587, + 0x8325ac82, + 0x209303, + 0x2351c3, + 0x22b883, + 0x2287c3, + 0x215c83, + 0x24b583, + 0xe9148, + 0x202543, + 0x2000c2, + 0xaf0c8, + 0x209302, + 0x22b883, + 0x2287c3, + 0x215c83, + 0x2543, + 0x24b583, + 0x201203, + 0x33bf96, + 0x35f453, + 0x3aee89, + 0x38d048, + 0x34ac09, + 0x317106, + 0x349250, + 0x2446d3, + 0x2fba48, + 0x373e07, + 0x27a207, + 0x28880a, + 0x3758c9, + 0x3a3449, + 0x28b00b, + 0x256006, + 0x2059ca, + 0x21c606, + 0x32bac3, + 0x2d8245, + 0x208708, + 0x200c0d, + 0x31a44c, + 0x3034c7, + 0x3284cd, + 0x26e144, + 0x2320ca, + 0x2332ca, + 0x23378a, + 0x2449c7, + 0x23d807, + 0x241884, + 0x28f306, + 0x34b944, + 0x302788, + 0x2f0e09, + 0x320046, + 0x320048, + 0x2f6f0d, + 0x2c8789, + 0x3143c8, + 0x3acb07, + 0x3c448a, + 0x251386, + 0x25fcc7, + 0x2e3284, + 0x22bc47, + 0x22b88a, + 0x241ace, + 0x2677c5, + 0x3cdc8b, + 0x309f09, + 0x20e4c9, + 0x206307, + 0x20630a, + 0x2b81c7, + 0x2f7e09, + 0x2c6b88, + 0x31a9cb, + 0x2e1305, + 0x22c7ca, + 0x26d809, + 0x36764a, + 0x2cb4cb, + 0x22bb4b, + 0x28ad95, + 0x2fa145, + 0x3acb85, + 0x2f68ca, + 0x2a784a, + 0x309c87, + 0x20f2c3, + 0x352f88, + 0x2d638a, + 0x21eb86, + 0x26a1c9, + 0x2939c8, + 0x2f07c4, + 0x389109, + 0x2bfc88, + 0x2b2b87, + 0x384ec6, + 0x2a4687, + 0x2add87, + 0x240985, + 0x26760c, + 0x271405, + 0x209303, + 0x2351c3, + 0x22b883, + 0x215c83, + 0x2543, + 0x24b583, + 0x209302, + 0x209303, + 0x215c83, + 0x202543, + 0x24b583, + 0x209303, + 0x215c83, + 0x2543, + 0x2a6983, + 0x24b583, + 0xaf0c8, + 0x209303, + 0x2351c3, + 0x22b883, + 0x2287c3, + 0x215c83, + 0x2543, + 0x24b583, + 0xaf0c8, + 0x209302, + 0x2046c2, + 0x2fbcc2, + 0x202382, + 0x212782, + 0x2c45c2, + 0x90146, + 0x4e09303, + 0x2351c3, + 0x210a43, + 0x22b883, + 0x20f8c3, + 0x2287c3, + 0x2d8146, + 0x215c83, + 0x24b583, + 0x200f83, + 0xaf0c8, + 0x30f6c4, + 0x30ef07, + 0x378203, + 0x330804, + 0x206183, + 0x206383, + 0x22b883, + 0xe41c7, + 0x10de04, + 0x10cdc3, + 0x1680c5, + 0x2000c2, + 0x173a83, + 0x6209302, + 0x648a9c9, + 0x8b2cd, + 0x8b60d, + 0x2fbcc2, + 0x1e084, + 0x168109, + 0x2003c2, + 0x6a1df88, + 0xf6044, + 0xaf0c8, + 0x14260c2, + 0x14005c2, + 0x14260c2, + 0x1518206, + 0x2312c3, + 0x2b5b43, + 0x7209303, + 0x2320c4, + 0x76351c3, + 0x7a2b883, + 0x206982, + 0x21e084, + 0x215c83, + 0x305543, + 0x203c02, + 0x24b583, + 0x216f02, + 0x2fc743, + 0x2022c2, + 0x201b43, + 0x293a83, + 0x20c902, + 0xaf0c8, + 0x2312c3, + 0x305543, + 0x203c02, + 0x2fc743, + 0x2022c2, + 0x201b43, + 0x293a83, + 0x20c902, + 0x2fc743, + 0x2022c2, + 0x201b43, + 0x293a83, + 0x20c902, + 0x209303, + 0x373a83, + 0x209303, + 0x2351c3, + 0x22b883, + 0x21e084, + 0x20f8c3, + 0x2287c3, + 0x226004, + 0x215c83, + 0x24b583, + 0x204482, + 0x214e83, + 0xaf0c8, + 0x209303, + 0x2351c3, + 0x22b883, + 0x2287c3, + 0x215c83, + 0x24b583, + 0x373a83, + 0x209302, + 0x209303, + 0x2351c3, + 0x22b883, + 0x21e084, + 0x215c83, + 0x24b583, + 0x3c1245, + 0x22c682, + 0x2000c2, + 0xaf0c8, + 0x158e708, + 0x15f94a, + 0x22b883, + 0x22aa41, + 0x201601, + 0x20a081, + 0x201341, + 0x257ec1, + 0x20c7c1, + 0x201641, + 0x207801, + 0x320e41, + 0x200001, + 0x2000c1, + 0x200201, + 0xf6d85, + 0xaf0c8, + 0x200101, + 0x2029c1, + 0x200501, + 0x200d41, + 0x200041, + 0x200801, + 0x200181, + 0x2027c1, + 0x200701, + 0x2004c1, + 0x201741, + 0x200581, + 0x2003c1, + 0x201401, + 0x2076c1, + 0x200401, + 0x200741, + 0x2007c1, + 0x200081, + 0x204fc1, + 0x207301, + 0x20b6c1, + 0x201d81, + 0x202e01, + 0x209303, + 0x2351c3, + 0x22b883, + 0x215c83, + 0x24b583, + 0x209302, + 0x209303, + 0x2351c3, + 0x2003c2, + 0x24b583, + 0xe41c7, + 0x288c7, + 0x3cf86, + 0x3b08a, + 0x89f88, + 0x580c8, + 0x58587, + 0x1b6e46, + 0xdf545, + 0x178145, + 0xea746, + 0x40386, + 0x28b004, + 0x274bc7, + 0xaf0c8, + 0x2da884, + 0x209303, + 0x2351c3, + 0x22b883, + 0x215c83, + 0x24b583, + 0x209303, + 0x2351c3, + 0x22b883, + 0x215c83, + 0x24b583, + 0x32b848, + 0x376544, + 0x235104, + 0x26dec4, + 0x282607, + 0x2d5447, + 0x209303, + 0x23808b, + 0x27d4ca, + 0x256a87, + 0x23ed88, + 0x30a608, + 0x2351c3, + 0x256587, + 0x210a43, + 0x202b08, + 0x205449, + 0x21e084, + 0x20f8c3, + 0x2ec2c8, + 0x2287c3, + 0x2d308a, + 0x2d8146, + 0x3aab07, + 0x215c83, + 0x20f1c6, + 0x318fc8, + 0x24b583, + 0x2ea886, + 0x2edccd, + 0x2ef748, + 0x2f758b, + 0x35cb46, + 0x3741c7, + 0x21ee85, + 0x376cca, + 0x22a805, + 0x24e70a, + 0x22c682, + 0x20ab43, + 0x245684, + 0x200006, + 0x3b0fc3, + 0x2aefc3, + 0x243003, + 0x2b7b03, + 0x376f03, + 0x201702, + 0x2d8845, + 0x2a6ec9, + 0x241003, + 0x203ac3, + 0x2146c3, + 0x200201, + 0x2cea07, + 0x2e39c5, + 0x394603, + 0x201a03, + 0x26dec4, + 0x256a03, + 0x218f88, + 0x362883, + 0x305b0d, + 0x27b888, + 0x20de86, + 0x32ea83, + 0x3a1083, + 0x3ad003, + 0xba09303, + 0x234a08, + 0x238084, + 0x241f83, + 0x200106, + 0x245b08, + 0x20a603, + 0x376d03, + 0x232303, + 0x2351c3, + 0x227643, + 0x25d0c3, + 0x229bc3, + 0x32ea03, + 0x221683, + 0x223dc3, + 0x38fac5, + 0x251884, + 0x252487, + 0x23a302, + 0x257b83, + 0x259a06, + 0x25c183, + 0x25d3c3, + 0x279603, + 0x36ad83, + 0x30f3c3, + 0x296407, + 0xbe2b883, + 0x246283, + 0x206e43, + 0x202b03, + 0x20f703, + 0x2f5843, + 0x364605, + 0x371403, + 0x24c689, + 0x2027c3, + 0x308dc3, + 0xc24cd03, + 0x2a4003, + 0x223788, + 0x2a6e06, + 0x3b74c6, + 0x29bfc6, + 0x38b9c7, + 0x214683, + 0x209383, + 0x2287c3, + 0x28a086, + 0x227682, + 0x2a0cc3, + 0x33a085, + 0x215c83, + 0x25e247, + 0x1602543, + 0x229183, + 0x236003, + 0x224443, + 0x22e043, + 0x24b583, + 0x21ce06, + 0x364986, + 0x37d103, + 0x225683, + 0x214e83, + 0x25bfc3, + 0x313483, + 0x2fb1c3, + 0x2fd943, + 0x221d85, + 0x22d183, + 0x28c0c6, + 0x335f48, + 0x224183, + 0x3ccb49, + 0x39d888, + 0x220708, + 0x229a45, + 0x23b60a, + 0x23beca, + 0x23cb8b, + 0x23e948, + 0x3ba003, + 0x2fd983, + 0x34d183, + 0x348bc8, + 0x3b0b83, + 0x2f7204, + 0x260403, + 0x2007c3, + 0x22bac3, + 0x25fe43, + 0x200f83, + 0x22c682, + 0x22a443, + 0x239b03, + 0x315c83, + 0x316c44, + 0x245684, + 0x218e43, + 0xaf0c8, + 0x2000c2, + 0x204542, + 0x201702, + 0x2013c2, + 0x200202, + 0x200c02, + 0x236842, + 0x2012c2, + 0x200382, + 0x201e02, + 0x20a502, + 0x204842, + 0x26ca42, + 0x204782, + 0x2c45c2, + 0x202882, + 0x20e102, + 0x203d02, + 0x2d2842, + 0x2063c2, + 0x200682, + 0x2157c2, + 0x208ac2, + 0x201202, + 0x203182, + 0x204882, + 0x201102, + 0xc2, + 0x4542, + 0x1702, + 0x13c2, + 0x202, + 0xc02, + 0x36842, + 0x12c2, + 0x382, + 0x1e02, + 0xa502, + 0x4842, + 0x6ca42, + 0x4782, + 0xc45c2, + 0x2882, + 0xe102, + 0x3d02, + 0xd2842, + 0x63c2, + 0x682, + 0x157c2, + 0x8ac2, + 0x1202, + 0x3182, + 0x4882, + 0x1102, + 0x209303, + 0x2351c3, + 0x22b883, + 0x215c83, + 0x24b583, + 0x7302, + 0x209303, + 0x2351c3, + 0x22b883, + 0x215c83, + 0x24b583, + 0x209302, + 0x24b583, + 0xd609303, + 0x22b883, + 0x2287c3, + 0xe6243, + 0x2203c2, + 0xaf0c8, + 0x209303, + 0x2351c3, + 0x22b883, + 0x215c83, + 0xe6243, + 0x24b583, + 0xc882, + 0x2001c2, + 0x15c5885, + 0x20dc82, + 0xaf0c8, + 0x9302, + 0x237002, + 0x201742, + 0x23f9c2, + 0x20f742, + 0x23ce82, + 0x178145, + 0x203142, + 0x203c02, + 0x20b302, + 0x200ec2, + 0x202882, + 0x3a2a02, + 0x20eb02, + 0x290e82, + 0xe41c7, + 0xbab4d, + 0xdf5c9, + 0xaa44b, + 0xe5248, + 0x793c9, + 0x109846, + 0x22b883, + 0xaf0c8, + 0x10de04, + 0x10cdc3, + 0x1680c5, + 0xaf0c8, + 0xdd187, + 0x59086, + 0x168109, + 0xfc8e, + 0x7687, + 0x2000c2, + 0x28b004, + 0x209302, + 0x209303, + 0x2046c2, + 0x2351c3, + 0x200382, + 0x2da884, + 0x20f8c3, + 0x24f602, + 0x215c83, + 0x2003c2, + 0x24b583, + 0x3acb86, + 0x32fa8f, + 0x769c43, + 0xaf0c8, + 0x209302, + 0x210a43, + 0x22b883, + 0x2287c3, + 0x2543, + 0xfc88, + 0x1576a8b, + 0x14187ca, + 0x1471c47, + 0x888cb, + 0xe4085, + 0xf6d85, + 0xe41c7, + 0x209302, + 0x209303, + 0x22b883, + 0x215c83, + 0x2000c2, + 0x203882, + 0x205fc2, + 0x10e09303, + 0x23f802, + 0x2351c3, + 0x21f242, + 0x220f02, + 0x22b883, + 0x2049c2, + 0x2716c2, + 0x2a8a42, + 0x203402, + 0x28fe82, + 0x200802, + 0x201042, + 0x272302, + 0x27c402, + 0x26bc02, + 0x2ae782, + 0x2c4442, + 0x21c402, + 0x2b1802, + 0x2287c3, + 0x203542, + 0x215c83, + 0x22b9c2, + 0x2d1842, + 0x24b583, + 0x241082, + 0x201202, + 0x214d82, + 0x201bc2, + 0x20ed82, + 0x2e6b02, + 0x20fa02, + 0x25a482, + 0x229642, + 0x32598a, + 0x36200a, + 0x39ca8a, + 0x3d2bc2, + 0x22a042, + 0x3645c2, + 0x11366cc9, + 0x11742c0a, + 0x1430587, + 0x11a00982, + 0x140d443, + 0x1302, + 0x142c0a, + 0x19648e, + 0x243644, + 0x12209303, + 0x2351c3, + 0x24f544, + 0x22b883, + 0x21e084, + 0x20f8c3, + 0x2287c3, + 0xe6444, + 0x168ac3, + 0x215c83, + 0xe205, + 0x202543, + 0x24b583, + 0x14ed444, + 0x22d183, + 0x20ab43, + 0xaf0c8, + 0x169b86, + 0x15b6dc4, + 0x177645, + 0x744a, + 0x12b2c2, + 0x1a9546, + 0x7c91, + 0x12b66cc9, + 0x1776c8, + 0x28a88, + 0x1cfa47, + 0x3902, + 0xf6d8b, + 0x14b04b, + 0x18caca, + 0x590a, + 0x6dec7, + 0xaf0c8, + 0x11ee48, + 0xb607, + 0x1941538b, + 0x177c7, + 0x68c2, + 0x3e487, + 0x189c8a, + 0x5b10f, + 0xff14f, + 0x142c02, + 0x9302, + 0x86088, + 0xf23ca, + 0xdcc8a, + 0xd2cca, + 0x7b688, + 0x1cb08, + 0x5db08, + 0xdd148, + 0x10c608, + 0x69c2, + 0x1c590f, + 0x9ff8b, + 0x73dc8, + 0x37307, + 0x1324ca, + 0x15d74b, + 0x7c709, + 0x1323c7, + 0x1ca08, + 0x3c08c, + 0x11ae87, + 0x17baca, + 0x65e48, + 0x10004e, + 0x6738e, + 0x6dd0b, + 0x6e70b, + 0xe1a4b, + 0xecdc9, + 0xfe94b, + 0x10370d, + 0x18af4b, + 0x3cf8d, + 0x3d30d, + 0x401ca, + 0x454cb, + 0x45e0b, + 0x4a005, + 0x19824650, + 0x2230f, + 0x11c00f, + 0x154a4d, + 0xb83d0, + 0x7242, + 0x19e25b08, + 0x28748, + 0x12038e, + 0x1a362845, + 0x4eb0b, + 0x13b790, + 0x55148, + 0x1cc0a, + 0x6e8c9, + 0x64a07, + 0x64d47, + 0x64f07, + 0x65287, + 0x66187, + 0x66787, + 0x681c7, + 0x68487, + 0x68e47, + 0x69147, + 0x69807, + 0x699c7, + 0x69b87, + 0x69d47, + 0x6a047, + 0x6a787, + 0x6b047, + 0x6b807, + 0x6bdc7, + 0x6c087, + 0x6c247, + 0x6c547, + 0x6c907, + 0x6cb07, + 0x6f3c7, + 0x6f587, + 0x6f747, + 0x70447, + 0x70947, + 0x70fc7, + 0x72187, + 0x72447, + 0x72947, + 0x72b07, + 0x72f07, + 0x73407, + 0x74047, + 0x74447, + 0x74607, + 0x747c7, + 0x76387, + 0x76fc7, + 0x77507, + 0x77ac7, + 0x77c87, + 0x78007, + 0x78587, + 0xb182, + 0x5dc0a, + 0xe6587, + 0x87fc5, + 0xbc891, + 0xd586, + 0x11dbca, + 0x85f0a, + 0x59086, + 0x11f8b, + 0x642, + 0x31a51, + 0xb4ac9, + 0x95789, + 0x72302, + 0x7318a, + 0xa63c9, + 0xa6b0f, + 0xa710e, + 0xa8148, + 0x55282, + 0x1b7309, + 0x19c04e, + 0x10694c, + 0xe784f, + 0x1b170e, + 0x1e6cc, + 0x23bc9, + 0x26311, + 0x268c8, + 0x28c52, + 0x12334d, + 0x12398d, + 0x3c48b, + 0x42c95, + 0x47089, + 0x4da8a, + 0x5ca09, + 0x6b410, + 0x70d0b, + 0x8188f, + 0x8634b, + 0x16e38c, + 0x1c0290, + 0x9e40a, + 0xa0b8d, + 0xa1c0e, + 0xaa10a, + 0xaac0c, + 0xada54, + 0xb4751, + 0xfaf0b, + 0x152b0f, + 0x121a0d, + 0x1246ce, + 0xb2a4c, + 0xb398c, + 0xb444b, + 0xbbb4e, + 0xbc150, + 0xc034b, + 0xc09cd, + 0xc150f, + 0xc234c, + 0x11fece, + 0x13ead1, + 0xcc38c, + 0xd7287, + 0xdf9cd, + 0xfa98c, + 0xeb710, + 0xf394d, + 0xfd647, + 0x102410, + 0x134308, + 0x13dc4b, + 0x19194f, + 0xccd08, + 0x11ddcd, + 0x1a0890, + 0xff049, + 0x1a6af746, + 0xb0643, + 0xb5205, + 0x6d82, + 0x56ec9, + 0x7680a, + 0x1aa3e684, + 0x116c86, + 0x1a00a, + 0x1ad72e89, + 0x26083, + 0x14ee8a, + 0xdab11, + 0xdaf49, + 0xdcc07, + 0xdd987, + 0xe6648, + 0x7e0b, + 0x12d689, + 0xe6dd0, + 0xe728c, + 0xe7d08, + 0xe80c5, + 0xc6d08, + 0x1b8c8a, + 0x26147, + 0x74fc7, + 0x1e82, + 0x13c48a, + 0x11c349, + 0x72805, + 0x5e0ca, + 0x8c80f, + 0x194ecb, + 0x1646cc, + 0x29b12, + 0xa3145, + 0xe94c8, + 0x19db8a, + 0x1b2f4a45, + 0x1642cc, + 0x1387c3, + 0x1a2a02, + 0xfdc8a, + 0x14fe00c, + 0x11b208, + 0x3d148, + 0x195147, + 0x6702, + 0x22c2, + 0x532d0, + 0x7aa07, + 0x3108f, + 0xea746, + 0xa74e, + 0x1557cb, + 0x4b248, + 0x7cac9, + 0x10d992, + 0x11428d, + 0x1147c8, + 0xaa309, + 0xd4c8d, + 0x108489, + 0x19a6cb, + 0x8548, + 0x86d88, + 0x8abc8, + 0x13ae09, + 0x13b00a, + 0x8ee0c, + 0xf800a, + 0x1134c7, + 0x4790d, + 0x100b4b, + 0x12bccc, + 0x39bc8, + 0x48909, + 0x654d0, + 0x2a82, + 0x7f2cd, + 0x2fc2, + 0x13d82, + 0x11340a, + 0x11daca, + 0x11f1cb, + 0x45fcc, + 0x11e74a, + 0x11ebce, + 0x143f8d, + 0x1b5d2a85, + 0x12ed08, + 0xc882, + 0x12f1044e, + 0x137697ce, + 0x13e013ca, + 0x1477730e, + 0x14f0ca8e, + 0x157cd18c, + 0x1430587, + 0x1430589, + 0x140d443, + 0x15e5788c, + 0x167955c9, + 0x16fc4cc9, + 0x17607249, + 0x1302, + 0x110391, + 0x169711, + 0x130d, + 0x177251, + 0x10c9d1, + 0x1cd0cf, + 0x577cf, + 0x19550c, + 0x1c4c0c, + 0x718c, + 0x1266cd, + 0x75e55, + 0xc510c, + 0x12e38c, + 0x131a10, + 0x14e40c, + 0x15e5cc, + 0x17be99, + 0x185ad9, + 0x19e359, + 0x1c63d4, + 0x1d0854, + 0xaa94, + 0xb794, + 0xc214, + 0x17ec51c9, + 0x1840ad49, + 0x18f2e449, + 0x13226ac9, + 0x1302, + 0x13a26ac9, + 0x1302, + 0xaa8a, + 0x1302, + 0x14226ac9, + 0x1302, + 0xaa8a, + 0x1302, + 0x14a26ac9, + 0x1302, + 0x15226ac9, + 0x1302, + 0x15a26ac9, + 0x1302, + 0xaa8a, + 0x1302, + 0x16226ac9, + 0x1302, + 0xaa8a, + 0x1302, + 0x16a26ac9, + 0x1302, + 0x17226ac9, + 0x1302, + 0xaa8a, + 0x1302, + 0x17a26ac9, + 0x1302, + 0xaa8a, + 0x1302, + 0x18226ac9, + 0x1302, + 0x18a26ac9, + 0x1302, + 0x19226ac9, + 0x1302, + 0xaa8a, + 0x1302, + 0x7c85, + 0x18cac4, + 0x11044e, + 0x1697ce, + 0x1a3ce, + 0x13ca, + 0x17730e, + 0x10ca8e, + 0x1cd18c, + 0x5788c, + 0x1955c9, + 0x1c4cc9, + 0x7249, + 0xc51c9, + 0xad49, + 0x12e449, + 0x7604d, + 0xba49, + 0xc4c9, + 0x14be04, + 0x12eec4, + 0x1401c4, + 0x144444, + 0x88b84, + 0x39944, + 0x3adc4, + 0x57e04, + 0x1cfa44, + 0x15a5e83, + 0x16583, + 0x7242, + 0x143f83, + 0xa042, + 0xa048, + 0x12d707, + 0x69c2, + 0x2000c2, + 0x209302, + 0x2046c2, + 0x200d42, + 0x200382, + 0x2003c2, + 0x2022c2, + 0x209303, + 0x2351c3, + 0x22b883, + 0x20f703, + 0x215c83, + 0x24b583, + 0xaf0c8, + 0x209303, + 0x2351c3, + 0x215c83, + 0x24b583, + 0xdb83, + 0x22b883, + 0x1e084, + 0x2000c2, + 0x373a83, + 0x1da09303, + 0x23e1c7, + 0x22b883, + 0x216c03, + 0x226004, + 0x215c83, + 0x24b583, + 0x2678ca, + 0x3acb85, + 0x214e83, + 0x216a42, + 0xaf0c8, + 0xaf0c8, + 0x9302, + 0x134c82, + 0x1e372c0b, + 0x1e62e944, + 0x3e5c5, + 0x7f85, + 0x122846, + 0x1ea07f85, + 0x54743, + 0xe0383, + 0x10de04, + 0x10cdc3, + 0x1680c5, + 0xf6d85, + 0xaf0c8, + 0x177c7, + 0x9303, + 0x1f23aec7, + 0x175e06, + 0x1f50c8c5, + 0x175ec7, + 0x1d40a, + 0x1bcc8, + 0x1d307, + 0x7e008, + 0xd8447, + 0xfbf4f, + 0x1842c7, + 0x57c06, + 0x13b790, + 0x13928f, + 0x1ff09, + 0x116d04, + 0x1f975f8e, + 0x2044c, + 0x15d94a, + 0x7c887, + 0xe5a0a, + 0x174789, + 0x1a370c, + 0xbf3ca, + 0x5940a, + 0x168109, + 0x116c86, + 0x7c94a, + 0x114eca, + 0x9b74a, + 0x151689, + 0xda448, + 0xda6c6, + 0xe048d, + 0xb5685, + 0x1ff816cc, + 0x7687, + 0x105149, + 0xed787, + 0xe4d54, + 0x107ccb, + 0x73c0a, + 0x10d80a, + 0xa414d, + 0x151f3c9, + 0x11404c, + 0x1145cb, + 0x3cf83, + 0x3cf83, + 0x3cf86, + 0x3cf83, + 0x122848, + 0xb7849, + 0x173a83, + 0xaf0c8, + 0x9302, + 0x4f544, + 0x5a003, + 0x1c1245, + 0x209303, + 0x2351c3, + 0x22b883, + 0x215c83, + 0x24b583, + 0x203ac3, + 0x209303, + 0x2351c3, + 0x210a43, + 0x22b883, + 0x2287c3, + 0x215c83, + 0x24b583, + 0x295943, + 0x20ab43, + 0x203ac3, + 0x28b004, + 0x209303, + 0x2351c3, + 0x22b883, + 0x215c83, + 0x24b583, + 0x233603, + 0x209303, + 0x2351c3, + 0x20f783, + 0x210a43, + 0x22b883, + 0x21e084, + 0x329f83, + 0x209383, + 0x2287c3, + 0x215c83, + 0x24b583, + 0x214e83, + 0x209783, + 0x21e09303, + 0x2351c3, + 0x24b083, + 0x22b883, + 0x220983, + 0x209383, + 0x24b583, + 0x203d03, + 0x3ca004, + 0xaf0c8, + 0x22609303, + 0x2351c3, + 0x2a8203, + 0x22b883, + 0x2287c3, + 0x226004, + 0x215c83, + 0x24b583, + 0x20f343, + 0xaf0c8, + 0x22e09303, + 0x2351c3, + 0x210a43, + 0x202543, + 0x24b583, + 0xaf0c8, + 0x1430587, + 0x373a83, + 0x209303, + 0x2351c3, + 0x22b883, + 0x21e084, + 0x226004, + 0x215c83, + 0x24b583, + 0xf6d85, + 0xe41c7, + 0xe4f8b, + 0xdb344, + 0xb5685, + 0x158e708, + 0xa884d, + 0x24243ac5, + 0x91f04, + 0xd983, + 0xfef45, + 0x2561c5, + 0xaf0c8, + 0x19602, + 0x456c3, + 0xf9dc6, + 0x32c3c8, + 0x3a5d07, + 0x28b004, + 0x394c06, + 0x3c4ac6, + 0xaf0c8, + 0x325283, + 0x31ba09, + 0x238d95, + 0x38d9f, + 0x209303, + 0x2c4cd2, + 0x16ee86, + 0x182285, + 0x1cc0a, + 0x6e8c9, + 0x2c4a8f, + 0x2da884, + 0x2ce145, + 0x308b90, + 0x38d247, + 0x202543, + 0x229188, + 0x15f886, + 0x2a538a, + 0x21df44, + 0x2f4483, + 0x3acb86, + 0x216a42, + 0x2ee5cb, + 0x2543, + 0x1a2344, + 0x209303, + 0x2351c3, + 0x22b883, + 0x2287c3, + 0x215c83, + 0x2543, + 0x24b583, + 0x2fb603, + 0x209302, + 0xf0fc3, + 0x215c83, + 0x24b583, + 0x209303, + 0x2351c3, + 0x22b883, + 0x2287c3, + 0x24b583, + 0x209303, + 0x2351c3, + 0x22b883, + 0x216c03, + 0x241703, + 0x24b583, + 0x209302, + 0x209303, + 0x2351c3, + 0x215c83, + 0x2543, + 0x24b583, + 0x2000c2, + 0x209303, + 0x2351c3, + 0x22b883, + 0x215c83, + 0x24b583, + 0x7f85, + 0x28b004, + 0x209303, + 0x2351c3, + 0x229d44, + 0x215c83, + 0x24b583, + 0xaf0c8, + 0x209303, + 0x2351c3, + 0x22b883, + 0x215c83, + 0xe6243, + 0x24b583, + 0x209303, + 0x2351c3, + 0x210a43, + 0x202b03, + 0x2287c3, + 0x215c83, + 0x2543, + 0x24b583, + 0x209303, + 0x2351c3, + 0x22b883, + 0x375844, + 0x21e084, + 0x215c83, + 0x24b583, + 0x20ab43, + 0x209302, + 0x209303, + 0x2351c3, + 0x22b883, + 0x215c83, + 0xe6243, + 0x24b583, + 0xaf0c8, + 0x209303, + 0x2351c3, + 0x22b883, + 0x2ba043, + 0x69e83, + 0x16c03, + 0x215c83, + 0x24b583, + 0x32598a, + 0x341349, + 0x3581cb, + 0x35884a, + 0x36200a, + 0x37aecb, + 0x39044a, + 0x396b4a, + 0x39ca8a, + 0x39cd0b, + 0x3b89c9, + 0x3bf5ca, + 0x3bfa0b, + 0x3cb54b, + 0x3d130a, + 0x209303, + 0x2351c3, + 0x210a43, + 0x2287c3, + 0x215c83, + 0x2543, + 0x24b583, + 0x1c5b8b, + 0x5eb48, + 0xd4dc4, + 0x7f46, + 0x40489, + 0xaf0c8, + 0x209303, + 0x264a04, + 0x213b02, + 0x226004, + 0x368605, + 0x203ac3, + 0x28b004, + 0x209303, + 0x238084, + 0x2351c3, + 0x24f544, + 0x2da884, + 0x21e084, + 0x209383, + 0x215c83, + 0x24b583, + 0x27f485, + 0x233603, + 0x214e83, + 0x205dc3, + 0x271504, + 0x369b04, + 0x2b7b05, + 0xaf0c8, + 0x30be04, + 0x3946c6, + 0x368244, + 0x209302, + 0x2493c7, + 0x250f47, + 0x24ce84, + 0x25ab45, + 0x2f3b45, + 0x230105, + 0x21e084, + 0x38ba88, + 0x237846, + 0x320e88, + 0x27c445, + 0x2e1305, + 0x2655c4, + 0x24b583, + 0x2f6044, + 0x379c86, + 0x3acc83, + 0x271504, + 0x24e805, + 0x256e44, + 0x247744, + 0x216a42, + 0x22d246, + 0x3aeb86, + 0x311945, + 0x2000c2, + 0x373a83, + 0x2b209302, + 0x225c84, + 0x200382, + 0x2287c3, + 0x207e02, + 0x215c83, + 0x2003c2, + 0x2fc846, + 0x201203, + 0x20ab43, + 0xa8a84, + 0xaf0c8, + 0xaf0c8, + 0x22b883, + 0xe6243, + 0x2000c2, + 0x2be09302, + 0x22b883, + 0x269b03, + 0x329f83, + 0x22e944, + 0x215c83, + 0x24b583, + 0xaf0c8, + 0x2000c2, + 0x2c609302, + 0x209303, + 0x215c83, + 0x2543, + 0x24b583, + 0x682, + 0x209702, + 0x22c682, + 0x216c03, + 0x2ec143, + 0x2000c2, + 0xf6d85, + 0xaf0c8, + 0xe41c7, + 0x209302, + 0x2351c3, + 0x24f544, + 0x202c03, + 0x22b883, + 0x202b03, + 0x2287c3, + 0x215c83, + 0x213203, + 0x24b583, + 0x20f2c3, + 0x9a893, + 0xc4614, + 0xf6d85, + 0xe41c7, + 0x105a46, + 0x76a0b, + 0x3cf86, + 0x57f07, + 0x5ab46, + 0x649, + 0xe1f0a, + 0x89e4d, + 0xba84c, + 0x11584a, + 0x181cc8, + 0x178145, + 0x1d448, + 0xea746, + 0x71146, + 0x40386, + 0x207242, + 0x16ae04, + 0x8e7c6, + 0x82e8e, + 0x15d34c, + 0xf6d85, + 0x18cc87, + 0x1e9d1, + 0x1cf8ca, + 0x209303, + 0x7df85, + 0x4b6c8, + 0x22984, + 0x2d821986, + 0xbc886, + 0xde186, + 0x9014a, + 0x194643, + 0x2de44684, + 0x605, + 0x103683, + 0x2e236647, + 0xe205, + 0x1204c, + 0xf8ec8, + 0x9e04b, + 0x2e64c34c, + 0x140c783, + 0xb6148, + 0x9fe09, + 0x11f4c8, + 0x1419f46, + 0x2eb90dc9, + 0x1a0c47, + 0xe408a, + 0xd7c8, + 0x122848, + 0x1cfa44, + 0x1cac45, + 0x9e187, + 0x2ee9e183, + 0x2f365e86, + 0x2f6f68c4, + 0x2fafde47, + 0x122844, + 0x122844, + 0x122844, + 0x122844, + 0x209303, + 0x2351c3, + 0x22b883, + 0x2287c3, + 0x215c83, + 0x24b583, + 0x2000c2, + 0x209302, + 0x22b883, + 0x206982, + 0x215c83, + 0x24b583, + 0x201203, + 0x382a8f, + 0x382e4e, + 0xaf0c8, + 0x209303, + 0x45947, + 0x2351c3, + 0x22b883, + 0x20f8c3, + 0x215c83, + 0x24b583, + 0x1604, + 0x10cf04, + 0x10f744, + 0x219ac3, + 0x30e9c7, + 0x200a82, + 0x2c63c9, + 0x204542, + 0x2535cb, + 0x29ea0a, + 0x2abdc9, + 0x200542, + 0x3ccc86, + 0x232bd5, + 0x253715, + 0x2343d3, + 0x253c93, + 0x227442, + 0x229845, + 0x30bb0c, + 0x27724b, + 0x3c2185, + 0x2013c2, + 0x329342, + 0x392686, + 0x203902, + 0x260646, + 0x21ce8d, + 0x20df8c, + 0x2246c4, + 0x200882, + 0x219002, + 0x229008, + 0x200202, + 0x220a86, + 0x333e8f, + 0x220a90, + 0x2f1a44, + 0x232d95, + 0x234553, + 0x20d383, + 0x32980a, + 0x20f087, + 0x34d489, + 0x2e5787, + 0x30e842, + 0x200282, + 0x3b3a86, + 0x201782, + 0xaf0c8, + 0x20d1c2, + 0x20d9c2, + 0x223007, + 0x33fdc7, + 0x33fdd1, + 0x216ec5, + 0x33a2ce, + 0x216ecf, + 0x2068c2, + 0x20f287, + 0x219b08, + 0x20abc2, + 0x2bf442, + 0x33d7c6, + 0x33d7cf, + 0x3743d0, + 0x22c302, + 0x200dc2, + 0x335dc8, + 0x209483, + 0x25a1c8, + 0x20948d, + 0x235843, + 0x31c788, + 0x23584f, + 0x235c0e, + 0x30d4ca, + 0x22f0d1, + 0x22f550, + 0x2dbb0d, + 0x2dbe4c, + 0x2752c7, + 0x329987, + 0x394cc9, + 0x2247c2, + 0x200c02, + 0x3403cc, + 0x3408cb, + 0x201242, + 0x2b4606, + 0x20f382, + 0x200482, + 0x342c02, + 0x209302, + 0x22fb44, + 0x23aa47, + 0x22c842, + 0x240ac7, + 0x242847, + 0x21fb02, + 0x22d202, + 0x245805, + 0x217382, + 0x384c0e, + 0x2a440d, + 0x2351c3, + 0x28784e, + 0x3bc50d, + 0x29af83, + 0x202482, + 0x285dc4, + 0x236882, + 0x20a682, + 0x3a0005, + 0x3a19c7, + 0x24a342, + 0x200d42, + 0x24f147, + 0x251cc8, + 0x23a302, + 0x2a31c6, + 0x35028c, + 0x35078b, + 0x208282, + 0x26120f, + 0x2615d0, + 0x2619cf, + 0x261d95, + 0x2622d4, + 0x2627ce, + 0x262b4e, + 0x262ecf, + 0x26328e, + 0x263614, + 0x263b13, + 0x263fcd, + 0x278749, + 0x28b943, + 0x202c02, + 0x218205, + 0x204ec6, + 0x200382, + 0x37ee87, + 0x22b883, + 0x200642, + 0x2339c8, + 0x22f311, + 0x22f750, + 0x203502, + 0x282947, + 0x200b02, + 0x209047, + 0x206d82, + 0x2118c9, + 0x392647, + 0x2a61c8, + 0x2217c6, + 0x2ec043, + 0x3672c5, + 0x235442, + 0x2004c2, + 0x3b3e85, + 0x35d0c5, + 0x204582, + 0x219343, + 0x3763c7, + 0x216d07, + 0x202d42, + 0x257344, + 0x21e283, + 0x321009, + 0x2fbdc8, + 0x205142, + 0x20bcc2, + 0x391507, + 0x22f005, + 0x2b8c48, + 0x348047, + 0x212e83, + 0x28e646, + 0x2db98d, + 0x2dbd0c, + 0x302c06, + 0x201742, + 0x29df02, + 0x209382, + 0x2356cf, + 0x235ace, + 0x2f3bc7, + 0x2025c2, + 0x3574c5, + 0x3574c6, + 0x225282, + 0x203542, + 0x28d146, + 0x208f83, + 0x208f86, + 0x2c8e05, + 0x2c8e0d, + 0x2c93d5, + 0x2c9c8c, + 0x2ca9cd, + 0x2cad92, + 0x204842, + 0x26ca42, + 0x200a42, + 0x257686, + 0x306806, + 0x201e82, + 0x204f46, + 0x20b302, + 0x20b305, + 0x212782, + 0x2a4509, + 0x22748c, + 0x2277cb, + 0x2003c2, + 0x252888, + 0x20ef42, + 0x204782, + 0x272c46, + 0x226a45, + 0x373087, + 0x2ecfc5, + 0x290385, + 0x207f42, + 0x2044c2, + 0x202882, + 0x2e7b47, + 0x2fc90d, + 0x2fcc8c, + 0x35a8c7, + 0x2256c2, + 0x20e102, + 0x237b48, + 0x257048, + 0x2e7ec8, + 0x31dd84, + 0x2bbdc7, + 0x23e703, + 0x257d02, + 0x21ad42, + 0x2f2789, + 0x300447, + 0x203d02, + 0x273045, + 0x244042, + 0x230642, + 0x2bdf03, + 0x2bdf06, + 0x2fb1c2, + 0x2fc6c2, + 0x200402, + 0x3c1046, + 0x2d9447, + 0x201902, + 0x200902, + 0x25a00f, + 0x28768d, + 0x39c44e, + 0x3bc38c, + 0x203282, + 0x201182, + 0x221605, + 0x323e86, + 0x215e02, + 0x2063c2, + 0x200682, + 0x287a04, + 0x2ec244, + 0x255946, + 0x2022c2, + 0x27a587, + 0x243703, + 0x243708, + 0x243d88, + 0x24d907, + 0x254446, + 0x20ac02, + 0x239603, + 0x333607, + 0x295206, + 0x2f5105, + 0x31e108, + 0x200b42, + 0x3cca47, + 0x204882, + 0x2e03c2, + 0x208502, + 0x217049, + 0x243a42, + 0x201b42, + 0x2540c3, + 0x30bf47, + 0x203c42, + 0x22760c, + 0x22790b, + 0x302c86, + 0x3035c5, + 0x217442, + 0x201102, + 0x2bb0c6, + 0x27ac43, + 0x329b87, + 0x212002, + 0x2008c2, + 0x232a55, + 0x2538d5, + 0x234293, + 0x253e13, + 0x38f5c7, + 0x3b9b51, + 0x3ba290, + 0x266312, + 0x277691, + 0x280348, + 0x280350, + 0x28fa0f, + 0x29e7d3, + 0x2abb92, + 0x2bcc90, + 0x33decf, + 0x3ba892, + 0x3bba51, + 0x2af293, + 0x3b8252, + 0x2af88f, + 0x2c5c4e, + 0x2c8992, + 0x2d3951, + 0x2d59cf, + 0x2d65ce, + 0x3bd011, + 0x3bd7d0, + 0x2d78d2, + 0x2dd551, + 0x3bddd0, + 0x3be3cf, + 0x2de551, + 0x2e0c90, + 0x2e8806, + 0x2f59c7, + 0x209b07, + 0x204042, + 0x2837c5, + 0x3828c7, + 0x22c682, + 0x208042, + 0x22a445, + 0x21a9c3, + 0x3b7206, + 0x2fcacd, + 0x2fce0c, + 0x204fc2, + 0x30b98b, + 0x27710a, + 0x22970a, + 0x2b6f09, + 0x2f008b, + 0x34818d, + 0x30900c, + 0x271a8a, + 0x27818c, + 0x295c0b, + 0x3c1fcc, + 0x3c24ce, + 0x3c2bcb, + 0x3c308c, + 0x2ae6c3, + 0x308386, + 0x30a182, + 0x2fe442, + 0x210e83, + 0x208602, + 0x225b43, + 0x35a086, + 0x261f47, + 0x334786, + 0x2f2588, + 0x376248, + 0x319706, + 0x205cc2, + 0x31130d, + 0x31164c, + 0x2da947, + 0x315687, + 0x237282, + 0x215082, + 0x255ac2, + 0x252082, + 0x333d97, + 0x33a1d6, + 0x33d6d7, + 0x3402d4, + 0x3407d3, + 0x350194, + 0x350693, + 0x3b6a50, + 0x3b9a59, + 0x3ba198, + 0x3ba79a, + 0x3bb959, + 0x3bcf19, + 0x3bd6d8, + 0x3bdcd8, + 0x3be2d7, + 0x3c1ed4, + 0x3c23d6, + 0x3c2ad3, + 0x3c2f94, + 0x209302, + 0x215c83, + 0x24b583, + 0x209303, + 0x2351c3, + 0x22b883, + 0x2287c3, + 0x226004, + 0x215c83, + 0x24b583, + 0x201203, + 0x2000c2, + 0x20a5c2, + 0x31a919c5, + 0x31e89205, + 0x323c0d06, + 0xaf0c8, + 0x326afe05, + 0x209302, + 0x2046c2, + 0x32b0c305, + 0x32e81785, + 0x33282b07, + 0x33685009, + 0x33a66bc4, + 0x200382, + 0x200642, + 0x33e5c845, + 0x34297389, + 0x34732248, + 0x34aad8c5, + 0x34f3a787, + 0x3522ac88, + 0x356e9385, + 0x35a6cf06, + 0x35f91009, + 0x362d0f48, + 0x366c0808, + 0x36a979ca, + 0x36e78f84, + 0x37202e45, + 0x376bd7c8, + 0x37b326c5, + 0x213302, + 0x37e485c3, + 0x382a3546, + 0x387237c8, + 0x38b1a0c6, + 0x38f633c8, + 0x39366506, + 0x3964ef04, + 0x203202, + 0x39b357c7, + 0x39ea9084, + 0x3a27c147, + 0x3a736107, + 0x2003c2, + 0x3aa9c405, + 0x3ae49044, + 0x3b2fa647, + 0x3b63fdc7, + 0x3ba85c06, + 0x3be81f05, + 0x3c297487, + 0x3c6eadc8, + 0x3ca18587, + 0x3ceb5889, + 0x3d2c9fc5, + 0x3d721887, + 0x3da91006, + 0x3dec6a08, + 0x22a94d, + 0x27ea89, + 0x2a65cb, + 0x2a830b, + 0x3a3f0b, + 0x315d0b, + 0x32408b, + 0x32434b, + 0x324c49, + 0x325c0b, + 0x325ecb, + 0x326a0b, + 0x3276ca, + 0x327c0a, + 0x32820c, + 0x32a68b, + 0x32b0ca, + 0x33e74a, + 0x34564e, + 0x34654e, + 0x3468ca, + 0x34898a, + 0x34964b, + 0x34990b, + 0x34a58b, + 0x36be8b, + 0x36c48a, + 0x36d14b, + 0x36d40a, + 0x36d68a, + 0x36d90a, + 0x3916cb, + 0x397a0b, + 0x399cce, + 0x39a04b, + 0x3a1b8b, + 0x3a2d8b, + 0x3a718a, + 0x3a7409, + 0x3a764a, + 0x3a904a, + 0x3b944b, + 0x3bfccb, + 0x3c068a, + 0x3c190b, + 0x3c7b8b, + 0x3d0d4b, + 0x3e283e88, + 0x3e6895c9, + 0x3ea9fc89, + 0x3eee2748, + 0x351c05, + 0x201dc3, + 0x26d604, + 0x30fa85, + 0x266906, + 0x26cc85, + 0x288c84, + 0x37ed88, + 0x31d905, + 0x293304, + 0x3d2007, + 0x29f20a, + 0x34bb4a, + 0x2f3cc7, + 0x213d07, + 0x307547, + 0x27e647, + 0x301d05, + 0x211c46, + 0x2bb9c7, + 0x245704, + 0x2e9946, + 0x2e9846, + 0x3c4745, + 0x34dd44, + 0x298a06, + 0x29d287, + 0x2eca46, + 0x3353c7, + 0x26d6c3, + 0x3c7e46, + 0x232845, + 0x282c07, + 0x26a94a, + 0x233ac4, + 0x21fc88, + 0x2b30c9, + 0x2e7547, + 0x32af46, + 0x38bc88, + 0x31a809, + 0x34d644, + 0x39da04, + 0x2a1185, + 0x2bb6c8, + 0x2c6f87, + 0x3215c9, + 0x267fc8, + 0x2e8906, + 0x2ed386, + 0x2993c8, + 0x370006, + 0x289205, + 0x285cc6, + 0x27cd08, + 0x2355c6, + 0x258a4b, + 0x2e0246, + 0x29b04d, + 0x206245, + 0x2a8f46, + 0x22ad45, + 0x35c809, + 0x3525c7, + 0x3ca408, + 0x2ac746, + 0x299c49, + 0x34aac6, + 0x26a8c5, + 0x2a1086, + 0x2c4006, + 0x2cbe49, + 0x376786, + 0x29ef07, + 0x241745, + 0x216383, + 0x258bc5, + 0x29b307, + 0x256446, + 0x206149, + 0x3c0d06, + 0x26b246, + 0x212c09, + 0x2856c9, + 0x2a1a87, + 0x30e088, + 0x2bc6c9, + 0x283448, + 0x396d86, + 0x2da205, + 0x2cd90a, + 0x26b2c6, + 0x23e046, + 0x2d20c5, + 0x2d0908, + 0x22eb87, + 0x23184a, + 0x24fa86, + 0x27eec5, + 0x375686, + 0x38a707, + 0x32ae07, + 0x2cc805, + 0x26aa85, + 0x3bca86, + 0x2b0706, + 0x2d2906, + 0x2bdc84, + 0x284589, + 0x28a446, + 0x2fb38a, + 0x22ccc8, + 0x34cd88, + 0x34bb4a, + 0x21b345, + 0x29d1c5, + 0x2ec4c8, + 0x2dca08, + 0x230347, + 0x31fd86, + 0x338308, + 0x2ab147, + 0x282d48, + 0x2b4306, + 0x286948, + 0x2969c6, + 0x27c5c7, + 0x39d786, + 0x298a06, + 0x30438a, + 0x22fbc6, + 0x2da209, + 0x319806, + 0x2f134a, + 0x24ef09, + 0x2fd2c6, + 0x2b5bc4, + 0x2182cd, + 0x289847, + 0x2b89c6, + 0x2c06c5, + 0x34ab45, + 0x393286, + 0x2fa489, + 0x2d0487, + 0x27da46, + 0x2e3106, + 0x288d09, + 0x289144, + 0x36f604, + 0x30b388, + 0x35a446, + 0x272648, + 0x31e488, + 0x2a95c7, + 0x3b59c9, + 0x2d2b07, + 0x2afcca, + 0x2f324f, + 0x345e4a, + 0x221405, + 0x27cf45, + 0x21b085, + 0x2f1987, + 0x236c43, + 0x30e288, + 0x365a46, + 0x365b49, + 0x2e8346, + 0x2cf187, + 0x299a09, + 0x3ca308, + 0x2d2187, + 0x3208c3, + 0x351c85, + 0x38a245, + 0x2bdacb, + 0x332784, + 0x23eb84, + 0x279c86, + 0x320a87, + 0x39f58a, + 0x248647, + 0x209847, + 0x281785, + 0x3cc205, + 0x26fec9, + 0x298a06, + 0x2484cd, + 0x3769c5, + 0x2b1e83, + 0x202703, + 0x3aedc5, + 0x357005, + 0x38bc88, + 0x27e307, + 0x36f386, + 0x29f906, + 0x22b105, + 0x235487, + 0x201f47, + 0x237707, + 0x202eca, + 0x3c7f08, + 0x2bdc84, + 0x27f847, + 0x280747, + 0x349b86, + 0x296047, + 0x2e3748, + 0x2e20c8, + 0x24d086, + 0x213f48, + 0x2d6e44, + 0x2bb9c6, + 0x249ac6, + 0x372506, + 0x2ce446, + 0x223a44, + 0x27e706, + 0x2bf646, + 0x298dc6, + 0x23a346, + 0x2025c6, + 0x2e3586, + 0x36f288, + 0x3baf08, + 0x2d5108, + 0x26ce88, + 0x2ec446, + 0x20f505, + 0x367e06, + 0x2ad945, + 0x3a5a47, + 0x268085, + 0x210183, + 0x201a85, + 0x22e044, + 0x202705, + 0x23f183, + 0x346b87, + 0x36bb88, + 0x335486, + 0x2dc68d, + 0x27cf06, + 0x298385, + 0x217043, + 0x2bd189, + 0x2892c6, + 0x294546, + 0x273104, + 0x345dc7, + 0x31ad06, + 0x2d0745, + 0x247343, + 0x208404, + 0x280906, + 0x249bc4, + 0x2d1d08, + 0x203309, + 0x281549, + 0x2a0f8a, + 0x2a258d, + 0x233e47, + 0x23dec6, + 0x21b6c4, + 0x285009, + 0x288308, + 0x289446, + 0x23b386, + 0x296047, + 0x2ddf06, + 0x26f246, + 0x364c06, + 0x33618a, + 0x22ac88, + 0x323245, + 0x25e3c9, + 0x2c770a, + 0x2ffb48, + 0x29cc48, + 0x2944c8, + 0x29f54c, + 0x3245c5, + 0x29fb88, + 0x3bb206, + 0x38f106, + 0x3ce307, + 0x248545, + 0x285e45, + 0x281409, + 0x210907, + 0x365b05, + 0x2a7c47, + 0x202703, + 0x2c7bc5, + 0x224e08, + 0x2ca747, + 0x29cb09, + 0x2f07c5, + 0x345544, + 0x2a2248, + 0x335907, + 0x2d2348, + 0x3d2888, + 0x2aa005, + 0x365946, + 0x214606, + 0x352909, + 0x2c9ac7, + 0x2adf86, + 0x2257c7, + 0x202c43, + 0x266bc4, + 0x2d6f45, + 0x35d6c4, + 0x24c604, + 0x284cc7, + 0x269287, + 0x270344, + 0x29c950, + 0x367987, + 0x3cc205, + 0x25108c, + 0x211004, + 0x2b6508, + 0x27c4c9, + 0x386786, + 0x31f608, + 0x217ac4, + 0x279f88, + 0x231e46, + 0x304208, + 0x29b5c6, + 0x28a18b, + 0x32cb45, + 0x2d6dc8, + 0x203744, + 0x20374a, + 0x29cb09, + 0x39d686, + 0x3137c8, + 0x286245, + 0x2da004, + 0x2b6406, + 0x2375c8, + 0x283e88, + 0x338b86, + 0x2558c4, + 0x2cd886, + 0x2d2b87, + 0x27c047, + 0x29604f, + 0x203d87, + 0x2fd387, + 0x357385, + 0x36b345, + 0x2a1749, + 0x2ea486, + 0x282045, + 0x2859c7, + 0x2c5848, + 0x2dfc85, + 0x39d786, + 0x22cb08, + 0x31a0ca, + 0x24ab08, + 0x28cec7, + 0x2f3686, + 0x25e386, + 0x2003c3, + 0x20ef43, + 0x2c78c9, + 0x2bc549, + 0x2b5786, + 0x2f07c5, + 0x2d9d08, + 0x3137c8, + 0x370188, + 0x364c8b, + 0x2dc8c7, + 0x318e09, + 0x2962c8, + 0x380204, + 0x3ca748, + 0x28f4c9, + 0x2ae285, + 0x2f1887, + 0x266c45, + 0x283d88, + 0x29184b, + 0x2971d0, + 0x2a8b85, + 0x21258c, + 0x36f545, + 0x256943, + 0x317e46, + 0x2becc4, + 0x249146, + 0x29d287, + 0x22cb84, + 0x2440c8, + 0x30e14d, + 0x31fbc5, + 0x233e84, + 0x221144, + 0x291f49, + 0x2b10c8, + 0x32d007, + 0x231ec8, + 0x284648, + 0x27dd45, + 0x228347, + 0x27dcc7, + 0x31b7c7, + 0x26aa89, + 0x256709, + 0x25ed86, + 0x2dc046, + 0x285a86, + 0x353cc5, + 0x39cf84, + 0x3c54c6, + 0x3c99c6, + 0x27dd88, + 0x38a3cb, + 0x27ab87, + 0x21b6c4, + 0x31ac46, + 0x2e3a87, + 0x366805, + 0x38d7c5, + 0x22eb44, + 0x256686, + 0x3c5548, + 0x285009, + 0x24c086, + 0x288108, + 0x2d0806, + 0x356608, + 0x2cf94c, + 0x27dc06, + 0x29804d, + 0x2984cb, + 0x29efc5, + 0x202087, + 0x376886, + 0x32acc8, + 0x25ee09, + 0x24d348, + 0x3cc205, + 0x24b807, + 0x283548, + 0x2d9689, + 0x2cd546, + 0x260c0a, + 0x32aa48, + 0x24d18b, + 0x2d45cc, + 0x27a088, + 0x27fe06, + 0x227d48, + 0x319d47, + 0x203ec9, + 0x33a8cd, + 0x298906, + 0x2d9e88, + 0x3badc9, + 0x2bdd88, + 0x286a48, + 0x2c008c, + 0x2c1087, + 0x2c1e07, + 0x26a8c5, + 0x2b3447, + 0x2c5708, + 0x2b6486, + 0x24bf0c, + 0x2f8348, + 0x2cfdc8, + 0x26d146, + 0x389fc7, + 0x25ef84, + 0x26ce88, + 0x373b8c, + 0x287b4c, + 0x221485, + 0x3c47c7, + 0x255846, + 0x389f46, + 0x35c9c8, + 0x379f84, + 0x2eca4b, + 0x27a6cb, + 0x2f3686, + 0x30dfc7, + 0x3673c5, + 0x272585, + 0x2ecb86, + 0x286205, + 0x332745, + 0x2cbc87, + 0x2823c9, + 0x2b08c4, + 0x25d405, + 0x2e8b85, + 0x2d1a88, + 0x2e5e85, + 0x2b75c9, + 0x330847, + 0x33084b, + 0x2fd006, + 0x36efc9, + 0x34dc88, + 0x29e305, + 0x31b8c8, + 0x256748, + 0x25ce47, + 0x24bd07, + 0x284d49, + 0x304147, + 0x2ace09, + 0x2b214c, + 0x2b5788, + 0x2d0d89, + 0x2d1207, + 0x284709, + 0x256d07, + 0x2d46c8, + 0x3b5b85, + 0x2bb946, + 0x2c0708, + 0x31f788, + 0x2c75c9, + 0x332787, + 0x252cc5, + 0x247d09, + 0x36a986, + 0x291004, + 0x30c086, + 0x323648, + 0x3a6047, + 0x38a5c8, + 0x214009, + 0x30abc7, + 0x29f3c6, + 0x202144, + 0x201b09, + 0x2281c8, + 0x26d007, + 0x37e146, + 0x38a306, + 0x23dfc4, + 0x3bb446, + 0x202683, + 0x32c6c9, + 0x32cb06, + 0x211ec5, + 0x29f906, + 0x2cc205, + 0x2839c8, + 0x319c07, + 0x39b7c6, + 0x30c346, + 0x34cd88, + 0x2a18c7, + 0x298945, + 0x29c748, + 0x3c00c8, + 0x32aa48, + 0x36f405, + 0x2bb9c6, + 0x281309, + 0x352784, + 0x2cc08b, + 0x26ef4b, + 0x323149, + 0x202703, + 0x259745, + 0x22d986, + 0x382388, + 0x332f44, + 0x335486, + 0x203009, + 0x2e2dc5, + 0x2cbbc6, + 0x335906, + 0x211e04, + 0x2141ca, + 0x211e08, + 0x31f786, + 0x2b9a85, + 0x255b07, + 0x357247, + 0x365944, + 0x26f187, + 0x268044, + 0x268046, + 0x217a83, + 0x26aa85, + 0x391c05, + 0x363648, + 0x27fa05, + 0x27d949, + 0x26ccc7, + 0x26cccb, + 0x2a334c, + 0x2a394a, + 0x33a787, + 0x200a03, + 0x27b988, + 0x36f5c5, + 0x2dfd05, + 0x351d44, + 0x2d45c6, + 0x27c4c6, + 0x3bb487, + 0x24728b, + 0x223a44, + 0x2d89c4, + 0x2c5fc4, + 0x2cb986, + 0x22cb84, + 0x2bb7c8, + 0x351b45, + 0x270805, + 0x3700c7, + 0x202189, + 0x357005, + 0x39328a, + 0x241649, + 0x2b01ca, + 0x3362c9, + 0x379844, + 0x2e31c5, + 0x2de008, + 0x2fa70b, + 0x2a1185, + 0x2f52c6, + 0x242904, + 0x27de86, + 0x30aa49, + 0x2e3b87, + 0x3c0ec8, + 0x2a2906, + 0x2d2b07, + 0x283e88, + 0x393806, + 0x202a44, + 0x383187, + 0x36e285, + 0x3847c7, + 0x2179c4, + 0x376806, + 0x2eaf48, + 0x298688, + 0x2ef247, + 0x26ec88, + 0x296a85, + 0x202544, + 0x34ba48, + 0x26ed84, + 0x21b005, + 0x301f04, + 0x2ab247, + 0x28a507, + 0x284848, + 0x2d24c6, + 0x27f985, + 0x27d748, + 0x24ad08, + 0x2a0ec9, + 0x26f246, + 0x2318c8, + 0x2035ca, + 0x366888, + 0x2e9385, + 0x21f746, + 0x241508, + 0x24b8ca, + 0x226cc7, + 0x288745, + 0x291208, + 0x2d9244, + 0x2d0986, + 0x2c2188, + 0x2025c6, + 0x368c48, + 0x290c47, + 0x3d1f06, + 0x2b5bc4, + 0x2a74c7, + 0x2b1484, + 0x30aa07, + 0x2cd20d, + 0x2303c5, + 0x2fa28b, + 0x287dc6, + 0x252988, + 0x244084, + 0x2f1006, + 0x280906, + 0x228087, + 0x297d0d, + 0x246f07, + 0x2b1dc8, + 0x2851c5, + 0x35df48, + 0x2c6f06, + 0x296b08, + 0x23c346, + 0x375107, + 0x258c89, + 0x3898c7, + 0x289708, + 0x2764c5, + 0x22b188, + 0x389e85, + 0x3005c5, + 0x336545, + 0x221703, + 0x285d44, + 0x25e3c5, + 0x391009, + 0x37e046, + 0x2e3848, + 0x24bac5, + 0x2b3307, + 0x2a92ca, + 0x2cbb09, + 0x2c3f0a, + 0x2d5188, + 0x2a7a8c, + 0x285a4d, + 0x309543, + 0x368b48, + 0x2083c5, + 0x319e86, + 0x3ca186, + 0x355705, + 0x2258c9, + 0x200985, + 0x27d748, + 0x25a5c6, + 0x358fc6, + 0x2a2109, + 0x3ab547, + 0x291b06, + 0x2a9248, + 0x372408, + 0x2e2947, + 0x2bf7ce, + 0x2c7145, + 0x2d9585, + 0x2024c8, + 0x3018c7, + 0x203582, + 0x2bfc04, + 0x24904a, + 0x26d0c8, + 0x256886, + 0x299b48, + 0x214606, + 0x372148, + 0x2adf88, + 0x300584, + 0x2b36c5, + 0x768244, + 0x768244, + 0x768244, + 0x202303, + 0x38a186, + 0x27dc06, + 0x29ec8c, + 0x202503, + 0x2179c6, + 0x22af04, + 0x289248, + 0x202e45, + 0x249146, + 0x2bd8c8, + 0x2d6306, + 0x39b746, + 0x39d488, + 0x2d6fc7, + 0x303f09, + 0x354d4a, + 0x202e84, + 0x268085, + 0x318b45, + 0x2ca206, + 0x233e86, + 0x29d9c6, + 0x301586, + 0x304044, + 0x30404b, + 0x267b04, + 0x255b85, + 0x2ad285, + 0x2a9686, + 0x206a88, + 0x285907, + 0x32ca84, + 0x22b5c3, + 0x2d8d45, + 0x267e87, + 0x28580b, + 0x363547, + 0x2bd7c8, + 0x2b3807, + 0x26bf06, + 0x27ed48, + 0x29dbcb, + 0x30f9c6, + 0x213489, + 0x29dd45, + 0x3208c3, + 0x2cbbc6, + 0x290b48, + 0x202a83, + 0x267f83, + 0x283e86, + 0x214606, + 0x37a88a, + 0x27fe45, + 0x28074b, + 0x29f84b, + 0x206983, + 0x2196c3, + 0x2afc44, + 0x2143c7, + 0x27a084, + 0x289244, + 0x3bb084, + 0x366b88, + 0x2b99c8, + 0x20eec9, + 0x2ca048, + 0x3367c7, + 0x23a346, + 0x2e348f, + 0x2c7286, + 0x2d48c4, + 0x2b980a, + 0x267d87, + 0x2b1586, + 0x291049, + 0x20ee45, + 0x363785, + 0x20ef86, + 0x22b2c3, + 0x2d9289, + 0x22ae06, + 0x213dc9, + 0x39f586, + 0x26aa85, + 0x221885, + 0x203d83, + 0x214508, + 0x32d1c7, + 0x365a44, + 0x2890c8, + 0x38ee84, + 0x308186, + 0x317e46, + 0x23fb06, + 0x2d6c89, + 0x2dfc85, + 0x298a06, + 0x38f2c9, + 0x2c5406, + 0x2e3586, + 0x3a4e86, + 0x27e4c5, + 0x301f06, + 0x375104, + 0x3b5b85, + 0x2c0704, + 0x2b2906, + 0x376984, + 0x204043, + 0x2883c5, + 0x2364c8, + 0x2e1887, + 0x332fc9, + 0x288648, + 0x299191, + 0x33598a, + 0x2f35c7, + 0x2e2406, + 0x22af04, + 0x2c0808, + 0x270088, + 0x29934a, + 0x2b738d, + 0x2a1086, + 0x39d586, + 0x2a7586, + 0x2cc687, + 0x2b1e85, + 0x3ccd47, + 0x289185, + 0x330984, + 0x2a7fc6, + 0x2d9bc7, + 0x2d8f8d, + 0x241447, + 0x37ec88, + 0x27da49, + 0x21f646, + 0x2cd4c5, + 0x23f1c4, + 0x323746, + 0x365846, + 0x26d246, + 0x29a3c8, + 0x227403, + 0x228083, + 0x375ac5, + 0x27fac6, + 0x2adf45, + 0x2a2b08, + 0x29d44a, + 0x319504, + 0x289248, + 0x2944c8, + 0x2a94c7, + 0x24bb89, + 0x2bd4c8, + 0x285087, + 0x3bb306, + 0x2025ca, + 0x3237c8, + 0x352409, + 0x2b1188, + 0x35af09, + 0x2e22c7, + 0x381ac5, + 0x364e86, + 0x2b6308, + 0x284008, + 0x294648, + 0x2f3788, + 0x255b85, + 0x212c44, + 0x234b08, + 0x242684, + 0x3360c4, + 0x26aa85, + 0x293347, + 0x201f49, + 0x227e87, + 0x203605, + 0x279e86, + 0x363046, + 0x2038c4, + 0x2a2446, + 0x27b604, + 0x2a5746, + 0x201d06, + 0x213ac6, + 0x3cc205, + 0x2a29c7, + 0x200a03, + 0x224a09, + 0x34cb88, + 0x284f04, + 0x284f0d, + 0x298788, + 0x314a48, + 0x352386, + 0x258d89, + 0x2cbb09, + 0x30a745, + 0x29d54a, + 0x270aca, + 0x28a6cc, + 0x28a846, + 0x27b386, + 0x2c7b06, + 0x3a00c9, + 0x31a0c6, + 0x2a1906, + 0x200a46, + 0x26ce88, + 0x24ab06, + 0x2d424b, + 0x2934c5, + 0x270805, + 0x27c145, + 0x30b106, + 0x202583, + 0x23fa86, + 0x2413c7, + 0x2c06c5, + 0x25c1c5, + 0x34ab45, + 0x3c8686, + 0x30a804, + 0x332146, + 0x2fac49, + 0x30af8c, + 0x3306c8, + 0x237544, + 0x301c06, + 0x287ec6, + 0x290b48, + 0x3137c8, + 0x30ae89, + 0x255b07, + 0x35a189, + 0x251a06, + 0x22c404, + 0x20bd04, + 0x283c84, + 0x283e88, + 0x201d8a, + 0x356f86, + 0x36b207, + 0x384a47, + 0x36f0c5, + 0x321544, + 0x28f486, + 0x2b1ec6, + 0x2456c3, + 0x34c9c7, + 0x3d2788, + 0x30a88a, + 0x30e408, + 0x3633c8, + 0x3769c5, + 0x29f0c5, + 0x27ac85, + 0x36f486, + 0x3a0446, + 0x30d385, + 0x32c909, + 0x32134c, + 0x27ad47, + 0x2993c8, + 0x25fb85, + 0x768244, + 0x2ed944, + 0x2ca884, + 0x21e586, + 0x2a074e, + 0x363807, + 0x2cc885, + 0x35270c, + 0x302007, + 0x2d9b47, + 0x355f49, + 0x21fd49, + 0x288745, + 0x34cb88, + 0x281309, + 0x32a905, + 0x2c0608, + 0x22af86, + 0x34bcc6, + 0x24ef04, + 0x28d648, + 0x21f803, + 0x2289c4, + 0x2d8dc5, + 0x399047, + 0x38b1c5, + 0x203489, + 0x2b4ecd, + 0x2e4346, + 0x22b604, + 0x31fd08, + 0x28220a, + 0x27b047, + 0x22d4c5, + 0x228a03, + 0x29fa0e, + 0x21460c, + 0x2ffc47, + 0x2a0907, + 0x217a03, + 0x31a105, + 0x2ca885, + 0x299f08, + 0x297809, + 0x237446, + 0x27a084, + 0x2f3506, + 0x2369cb, + 0x2db70c, + 0x39de47, + 0x2d4505, + 0x3bffc8, + 0x2e2705, + 0x2b9807, + 0x3357c7, + 0x241205, + 0x202583, + 0x366ec4, + 0x3a5f05, + 0x2b07c5, + 0x2b07c6, + 0x2c0e88, + 0x2d9bc7, + 0x3ca486, + 0x204146, + 0x336486, + 0x273989, + 0x228447, + 0x26d506, + 0x2db886, + 0x278e86, + 0x2a9045, + 0x20c806, + 0x364205, + 0x2e5f08, + 0x292c4b, + 0x28e546, + 0x384a84, + 0x3029c9, + 0x26ccc4, + 0x22af08, + 0x30c187, + 0x286944, + 0x2bbf88, + 0x2c1c04, + 0x2a9084, + 0x289005, + 0x31fc06, + 0x366ac7, + 0x206743, + 0x29f485, + 0x339204, + 0x2d95c6, + 0x30a7c8, + 0x373a85, + 0x292909, + 0x247f05, + 0x2179c8, + 0x281047, + 0x32cc08, + 0x2bb507, + 0x2fd449, + 0x27e586, + 0x33e986, + 0x200a44, + 0x2d8905, + 0x310b8c, + 0x27c147, + 0x27ce07, + 0x233ac8, + 0x2e4346, + 0x272784, + 0x3af304, + 0x284bc9, + 0x2c7c06, + 0x26ff47, + 0x2ce3c4, + 0x248cc6, + 0x3c9cc5, + 0x2d2007, + 0x2d41c6, + 0x260ac9, + 0x2ce947, + 0x296047, + 0x2a1f86, + 0x248c05, + 0x281ec8, + 0x22ac88, + 0x23a546, + 0x373ac5, + 0x377c86, + 0x202ac3, + 0x299d89, + 0x29d74e, + 0x2bb248, + 0x38ef88, + 0x23a34b, + 0x292b46, + 0x366504, + 0x285644, + 0x29d84a, + 0x212487, + 0x26d5c5, + 0x213489, + 0x2bf705, + 0x336107, + 0x24aa84, + 0x2aaa87, + 0x31e388, + 0x2e7606, + 0x38ecc9, + 0x2bd5ca, + 0x212406, + 0x2982c6, + 0x2ad205, + 0x39a605, + 0x35bf07, + 0x2482c8, + 0x3c9c08, + 0x300586, + 0x221905, + 0x233c0e, + 0x2bdc84, + 0x23a4c5, + 0x279809, + 0x2ea288, + 0x28ce06, + 0x29c24c, + 0x29d050, + 0x2a038f, + 0x2a1648, + 0x33a787, + 0x3cc205, + 0x25e3c5, + 0x366949, + 0x291409, + 0x2cd986, + 0x2a1207, + 0x2d8805, + 0x230349, + 0x349c06, + 0x319f0d, + 0x283b49, + 0x289244, + 0x2bafc8, + 0x234bc9, + 0x357146, + 0x27bb85, + 0x33e986, + 0x3c0d89, + 0x3656c8, + 0x20f505, + 0x2036c4, + 0x29c40b, + 0x357005, + 0x29c546, + 0x285d86, + 0x36a046, + 0x29234b, + 0x292a09, + 0x204085, + 0x3a5947, + 0x335906, + 0x252b06, + 0x2ca608, + 0x21b149, + 0x37ea4c, + 0x267c88, + 0x318b86, + 0x338b83, + 0x23b786, + 0x292185, + 0x280a88, + 0x221306, + 0x2d2248, + 0x2486c5, + 0x299505, + 0x35e388, + 0x3722c7, + 0x3ca0c7, + 0x3bb487, + 0x31f608, + 0x2ca308, + 0x2b1946, + 0x2b2747, + 0x266a87, + 0x29204a, + 0x23ee83, + 0x30b106, + 0x201ec5, + 0x249044, + 0x27da49, + 0x2fd3c4, + 0x2e1904, + 0x29b644, + 0x2a090b, + 0x32d107, + 0x233e45, + 0x296788, + 0x279e86, + 0x279e88, + 0x27fd86, + 0x28d585, + 0x28d845, + 0x28ffc6, + 0x290908, + 0x290f88, + 0x27dc06, + 0x2965cf, + 0x299850, + 0x206245, + 0x200a03, + 0x22c4c5, + 0x318d48, + 0x291309, + 0x32aa48, + 0x38eb48, + 0x23da88, + 0x32d1c7, + 0x279b49, + 0x2d2448, + 0x290804, + 0x29b4c8, + 0x2d1b49, + 0x2b2dc7, + 0x29b444, + 0x227f48, + 0x2a278a, + 0x2e62c6, + 0x2a1086, + 0x26f109, + 0x29d287, + 0x2cf008, + 0x223148, + 0x2c6888, + 0x38f705, + 0x216385, + 0x270805, + 0x2ca845, + 0x397ec7, + 0x202585, + 0x2c06c5, + 0x2754c6, + 0x32a987, + 0x2fa647, + 0x2a2a86, + 0x2d56c5, + 0x29c546, + 0x27ba45, + 0x2d8688, + 0x2ffac4, + 0x2c5486, + 0x32ec04, + 0x2da008, + 0x3047ca, + 0x27e30c, + 0x247485, + 0x2cc746, + 0x37ec06, + 0x29ae46, + 0x318c04, + 0x3c9f85, + 0x27f707, + 0x29d309, + 0x2cbf47, + 0x768244, + 0x768244, + 0x32cf85, + 0x2d3344, + 0x29bc0a, + 0x279d06, + 0x27ef84, + 0x3c4745, + 0x393d05, + 0x2b1dc4, + 0x2859c7, + 0x247e87, + 0x2cb988, + 0x368ec8, + 0x20f509, + 0x270748, + 0x29bdcb, + 0x2b02c4, + 0x252c05, + 0x2820c5, + 0x3bb409, + 0x21b149, + 0x3028c8, + 0x267b08, + 0x2a9684, + 0x287f05, + 0x201dc3, + 0x2ca1c5, + 0x298a86, + 0x29764c, + 0x22ad06, + 0x27ba86, + 0x28d085, + 0x3c8708, + 0x3ce446, + 0x2e2586, + 0x2a1086, + 0x2b0b0c, + 0x26d404, + 0x3365ca, + 0x28cfc8, + 0x297487, + 0x339106, + 0x237507, + 0x2f3105, + 0x37e146, + 0x361d86, + 0x378cc7, + 0x2bd2c4, + 0x2ab345, + 0x279804, + 0x330a07, + 0x279a48, + 0x27b20a, + 0x2833c7, + 0x2a8c47, + 0x33a707, + 0x2e2849, + 0x29764a, + 0x22c3c3, + 0x2e1845, + 0x213b03, + 0x3bb0c9, + 0x375388, + 0x357387, + 0x32ab49, + 0x22ad86, + 0x3b5c48, + 0x346b05, + 0x24ae0a, + 0x216709, + 0x24cf49, + 0x3ce307, + 0x270189, + 0x2139c8, + 0x378e86, + 0x2cc908, + 0x3d03c7, + 0x304147, + 0x241647, + 0x2eadc8, + 0x301a86, + 0x2a2545, + 0x27f707, + 0x297dc8, + 0x32eb84, + 0x2fb244, + 0x291a07, + 0x2ae307, + 0x28118a, + 0x378e06, + 0x35dd4a, + 0x2bfb47, + 0x2bda47, + 0x2ab404, + 0x2acec4, + 0x2d1f06, + 0x31af84, + 0x31af8c, + 0x34de45, + 0x21af89, + 0x2b0044, + 0x2b1e85, + 0x282188, + 0x27f145, + 0x393286, + 0x230244, + 0x2ebaca, + 0x2c99c6, + 0x29cdca, + 0x218587, + 0x28a285, + 0x22b2c5, + 0x36f10a, + 0x290a85, + 0x2a0f86, + 0x242684, + 0x2afdc6, + 0x35bfc5, + 0x2213c6, + 0x2ef24c, + 0x2b0d8a, + 0x270bc4, + 0x23a346, + 0x29d287, + 0x2d4144, + 0x26ce88, + 0x2f51c6, + 0x3848c9, + 0x2df7c9, + 0x2b5889, + 0x2cc246, + 0x3d04c6, + 0x2cca47, + 0x32c848, + 0x3d02c9, + 0x32d107, + 0x296906, + 0x2d2b87, + 0x2a7445, + 0x2bdc84, + 0x2cc607, + 0x266c45, + 0x288f45, + 0x3732c7, + 0x2410c8, + 0x3bff46, + 0x298c0d, + 0x29a10f, + 0x29f84d, + 0x203044, + 0x2365c6, + 0x2d7588, + 0x200a05, + 0x292208, + 0x25cd0a, + 0x289244, + 0x236c06, + 0x2d4947, + 0x223a47, + 0x2d7089, + 0x2cc8c5, + 0x2b1dc4, + 0x2b360a, + 0x2bd089, + 0x270287, + 0x298ec6, + 0x357146, + 0x287e46, + 0x383246, + 0x2d694f, + 0x2d7449, + 0x24ab06, + 0x38b8c6, + 0x32bf09, + 0x2b2847, + 0x209343, + 0x296b86, + 0x20ef43, + 0x3555c8, + 0x2d29c7, + 0x2a1849, + 0x317cc8, + 0x3ca208, + 0x3328c6, + 0x2ce209, + 0x3a6805, + 0x23b6c4, + 0x381b87, + 0x3a0145, + 0x203044, + 0x233f08, + 0x212744, + 0x2b2587, + 0x36bb06, + 0x3bcb45, + 0x2b1188, + 0x35700b, + 0x321887, + 0x36f386, + 0x2c7304, + 0x366486, + 0x26aa85, + 0x266c45, + 0x281c49, + 0x2855c9, + 0x2cc004, + 0x3041c5, + 0x23a385, + 0x24ac86, + 0x34cc88, + 0x2bf0c6, + 0x3d25cb, + 0x38660a, + 0x2bb605, + 0x28d8c6, + 0x319205, + 0x275405, + 0x2a9107, + 0x30b388, + 0x2707c4, + 0x2496c6, + 0x291006, + 0x213b87, + 0x320884, + 0x280906, + 0x2f1a85, + 0x2f1a89, + 0x210a44, + 0x3216c9, + 0x27dc06, + 0x2c1148, + 0x23a385, + 0x384b45, + 0x2213c6, + 0x37e949, + 0x21fd49, + 0x27bb06, + 0x2ea388, + 0x2b5008, + 0x3191c4, + 0x2b4104, + 0x2b4108, + 0x2b8ac8, + 0x35a289, + 0x298a06, + 0x2a1086, + 0x3381cd, + 0x335486, + 0x2cf809, + 0x367f05, + 0x20ef86, + 0x2c6a08, + 0x332085, + 0x266ac4, + 0x26aa85, + 0x284a48, + 0x29b9c9, + 0x2798c4, + 0x376806, + 0x27f00a, + 0x2ffb48, + 0x281309, + 0x38be0a, + 0x32aac6, + 0x29a2c8, + 0x2b95c5, + 0x28d248, + 0x2f3185, + 0x22ac49, + 0x387089, + 0x237482, + 0x29dd45, + 0x2722c6, + 0x27db47, + 0x38cf85, + 0x31e286, + 0x315488, + 0x2e4346, + 0x2ddec9, + 0x27cf06, + 0x2ca488, + 0x2202c5, + 0x3ad446, + 0x375208, + 0x283e88, + 0x2e21c8, + 0x2e8988, + 0x20c804, + 0x266083, + 0x2de104, + 0x2835c6, + 0x2a7484, + 0x38eec7, + 0x2e2489, + 0x2c5fc5, + 0x223146, + 0x296b86, + 0x2c0ccb, + 0x2b14c6, + 0x2b8dc6, + 0x2c5588, + 0x2ed386, + 0x2b7683, + 0x209fc3, + 0x2bdc84, + 0x2317c5, + 0x2d0647, + 0x279a48, + 0x279a4f, + 0x27f60b, + 0x34ca88, + 0x376886, + 0x34cd8e, + 0x2213c3, + 0x2d05c4, + 0x2b1445, + 0x2b1c46, + 0x28f58b, + 0x293406, + 0x22cb89, + 0x3bcb45, + 0x254548, + 0x205288, + 0x21fc0c, + 0x2a0946, + 0x2ca206, + 0x2f07c5, + 0x2894c8, + 0x27e305, + 0x380208, + 0x29c5ca, + 0x29fc89, + 0x768244, + 0x2000c2, + 0x3f609302, + 0x200382, + 0x21e084, + 0x209382, + 0x229d44, + 0x203202, + 0x2543, + 0x2003c2, + 0x201202, + 0xaf0c8, + 0x209303, + 0x2351c3, + 0x22b883, + 0x2287c3, + 0x215c83, + 0x24b583, + 0x373a83, + 0x209303, + 0x2351c3, + 0x22b883, + 0x21e084, + 0x215c83, + 0x24b583, + 0x20cc03, + 0x28b004, + 0x209303, + 0x238084, + 0x2351c3, + 0x2da884, + 0x22b883, + 0x38d247, + 0x2287c3, + 0x202543, + 0x229188, + 0x24b583, + 0x2a538b, + 0x2f4483, + 0x3acb86, + 0x216a42, + 0x2ee5cb, + 0x2351c3, + 0x22b883, + 0x215c83, + 0x24b583, + 0x209303, + 0x2351c3, + 0x22b883, + 0x24b583, + 0x220003, + 0x21bec3, + 0x2000c2, + 0xaf0c8, + 0x2220c5, + 0x266cc8, + 0x2fe488, + 0x209302, + 0x375785, + 0x329d47, + 0x2012c2, + 0x2442c7, + 0x200382, + 0x25f3c7, + 0x2b7e09, + 0x2b9188, + 0x2c6709, + 0x20dc02, + 0x269e87, + 0x23a1c4, + 0x329e07, + 0x386507, + 0x25dcc2, + 0x2287c3, + 0x204842, + 0x203202, + 0x2003c2, + 0x202882, + 0x200902, + 0x201202, + 0x2a9b05, + 0x33d805, + 0x9302, + 0x351c3, + 0x209303, + 0x2351c3, + 0x206843, + 0x22b883, + 0x202b03, + 0x215c83, + 0x24b583, + 0x209303, + 0x2351c3, + 0x22b883, + 0x215c83, + 0x24b583, + 0x209303, + 0x2351c3, + 0x22b883, + 0x2287c3, + 0x215c83, + 0xe6243, + 0x24b583, + 0xd703, + 0x101, + 0x209303, + 0x2351c3, + 0x22b883, + 0x21e084, + 0x20f8c3, + 0x215c83, + 0xe6243, + 0x24b583, + 0x215943, + 0x42871c46, + 0x9e183, + 0xc7545, + 0x209303, + 0x2351c3, + 0x22b883, + 0x215c83, + 0x24b583, + 0x209302, + 0x209303, + 0x2351c3, + 0x22b883, + 0x215c83, + 0xe6243, + 0x24b583, + 0x6102, + 0xaf0c8, + 0x2543, + 0xe6243, + 0x48284, + 0xe2b05, + 0x2000c2, + 0x3aec84, + 0x209303, + 0x2351c3, + 0x22b883, + 0x243583, + 0x230105, + 0x20f8c3, + 0x216c03, + 0x215c83, + 0x24fb43, + 0x24b583, + 0x201203, + 0x200b43, + 0x20ab43, + 0x209303, + 0x2351c3, + 0x22b883, + 0x215c83, + 0x24b583, + 0x209302, + 0x24b583, + 0xaf0c8, + 0x22b883, + 0xe6243, + 0xaf0c8, + 0xe6243, + 0x2b5b43, + 0x209303, + 0x2320c4, + 0x2351c3, + 0x22b883, + 0x206982, + 0x2287c3, + 0x215c83, + 0x24b583, + 0x209303, + 0x2351c3, + 0x22b883, + 0x206982, + 0x209383, + 0x215c83, + 0x24b583, + 0x2ec143, + 0x201203, + 0x2000c2, + 0x209302, + 0x22b883, + 0x215c83, + 0x24b583, + 0x3acb85, + 0x151746, + 0x28b004, + 0x216a42, + 0xaf0c8, + 0x2000c2, + 0xf6d85, + 0x19908, + 0x1943, + 0x209302, + 0x46c92e86, + 0x1cb04, + 0xe4f8b, + 0x3afc6, + 0x288c7, + 0x2351c3, + 0x4cc88, + 0x22b883, + 0x11a745, + 0x168004, + 0x22afc3, + 0x518c7, + 0xdde04, + 0x215c83, + 0x7bc06, + 0xe6084, + 0xe6243, + 0x24b583, + 0x2f6044, + 0x12d707, + 0x151349, + 0xe4d48, + 0xf7484, + 0x40386, + 0xd7c8, + 0x13fd05, + 0xa109, + 0xf6d85, + 0x209302, + 0x209303, + 0x2351c3, + 0x22b883, + 0x2287c3, + 0x202543, + 0x24b583, + 0x2f4483, + 0x216a42, + 0xaf0c8, + 0x209303, + 0x2351c3, + 0x22b883, + 0x20f703, + 0x226004, + 0x215c83, + 0x2543, + 0x24b583, + 0x209303, + 0x2351c3, + 0x2da884, + 0x22b883, + 0x215c83, + 0x24b583, + 0x3acb86, + 0x2351c3, + 0x22b883, + 0x41f03, + 0xe6243, + 0x24b583, + 0x209303, + 0x2351c3, + 0x22b883, + 0x215c83, + 0x24b583, + 0xf6d85, + 0x288c7, + 0xaf0c8, + 0x22b883, + 0x209303, + 0x2351c3, + 0x22b883, + 0x215c83, + 0x24b583, + 0x49a09303, + 0x2351c3, + 0x215c83, + 0x24b583, + 0xaf0c8, + 0x2000c2, + 0x209302, + 0x209303, + 0x22b883, + 0x215c83, + 0x2003c2, + 0x24b583, + 0x33b587, + 0x31bb4b, + 0x204243, + 0x2cd648, + 0x32c5c7, + 0x210f06, + 0x209d85, + 0x3758c9, + 0x228548, + 0x37dc09, + 0x3a7cd0, + 0x37dc0b, + 0x2f2249, + 0x202943, + 0x2756c9, + 0x233486, + 0x23348c, + 0x222188, + 0x3ce148, + 0x3b7049, + 0x35308e, + 0x2b7bcb, + 0x3650cc, + 0x203ac3, + 0x28f18c, + 0x203ac9, + 0x23ec87, + 0x23510c, + 0x3c790a, + 0x243644, + 0x24d60d, + 0x28f048, + 0x20cc0d, + 0x295106, + 0x28b00b, + 0x3514c9, + 0x38bb47, + 0x3674c6, + 0x3cc7c9, + 0x30a3ca, + 0x328608, + 0x2f4084, + 0x341187, + 0x245c87, + 0x2ce5c4, + 0x2e54c4, + 0x398549, + 0x30f809, + 0x217f88, + 0x20d385, + 0x20db45, + 0x20b1c6, + 0x24d4c9, + 0x25cf8d, + 0x2f53c8, + 0x20b0c7, + 0x209e08, + 0x303cc6, + 0x23cc44, + 0x2a3f45, + 0x3d01c6, + 0x3d1c04, + 0x2039c7, + 0x20568a, + 0x20f444, + 0x212346, + 0x213109, + 0x21310f, + 0x2136cd, + 0x214906, + 0x219510, + 0x219906, + 0x219e87, + 0x21a747, + 0x21a74f, + 0x21b7c9, + 0x224546, + 0x224c47, + 0x224c48, + 0x225009, + 0x3bcc08, + 0x2e9007, + 0x2220c3, + 0x22e706, + 0x377088, + 0x35334a, + 0x3c5e49, + 0x21b583, + 0x329c46, + 0x24950a, + 0x290507, + 0x23eaca, + 0x312d4e, + 0x21b906, + 0x29df47, + 0x21f9c6, + 0x203b86, + 0x21618b, + 0x221aca, + 0x2ab74d, + 0x3d0587, + 0x269448, + 0x269449, + 0x26944f, + 0x33314c, + 0x280d09, + 0x2e148e, + 0x38d34a, + 0x2b9e46, + 0x322786, + 0x332bcc, + 0x334d0c, + 0x345988, + 0x3897c7, + 0x2d9a45, + 0x293204, + 0x30fc8e, + 0x265dc4, + 0x3ca9c7, + 0x3cba4a, + 0x22db14, + 0x22e14f, + 0x21a908, + 0x22e5c8, + 0x33f6cd, + 0x33f6ce, + 0x22e889, + 0x2307c8, + 0x2307cf, + 0x234e0c, + 0x234e0f, + 0x236307, + 0x2388ca, + 0x24680b, + 0x239a48, + 0x23b907, + 0x26014d, + 0x331686, + 0x24d7c6, + 0x23f909, + 0x2a78c8, + 0x244c48, + 0x244c4e, + 0x31bc47, + 0x246ac5, + 0x248045, + 0x204504, + 0x2111c6, + 0x217e88, + 0x30f003, + 0x2f4dce, + 0x260508, + 0x37e30b, + 0x311d47, + 0x3003c5, + 0x28f306, + 0x2ac547, + 0x2fb7c8, + 0x33fb09, + 0x331905, + 0x288408, + 0x227006, + 0x3a944a, + 0x30fb89, + 0x2351c9, + 0x2351cb, + 0x368908, + 0x2ce489, + 0x20d446, + 0x3912ca, + 0x20684a, + 0x238acc, + 0x365d07, + 0x2c650a, + 0x32dbcb, + 0x32dbd9, + 0x31ce88, + 0x3acc05, + 0x260306, + 0x26bb89, + 0x38db06, + 0x28c28a, + 0x228746, + 0x223dc4, + 0x2c868d, + 0x30f447, + 0x223dc9, + 0x24b085, + 0x24c208, + 0x24ca49, + 0x24ce84, + 0x24e007, + 0x24e008, + 0x24e307, + 0x2685c8, + 0x251ec7, + 0x204305, + 0x259b8c, + 0x25a3c9, + 0x2d144a, + 0x3ab3c9, + 0x2757c9, + 0x38b68c, + 0x25e88b, + 0x25f6c8, + 0x260908, + 0x2643c4, + 0x286608, + 0x2874c9, + 0x3c79c7, + 0x213346, + 0x29b807, + 0x28e889, + 0x36700b, + 0x29acc7, + 0x3cc5c7, + 0x2186c7, + 0x20cb84, + 0x20cb85, + 0x2da585, + 0x3510cb, + 0x3b4944, + 0x2badc8, + 0x2f86ca, + 0x2270c7, + 0x3c2907, + 0x28e0d2, + 0x2a5646, + 0x231a46, + 0x371cce, + 0x2a6106, + 0x294348, + 0x294acf, + 0x20cfc8, + 0x39c2c8, + 0x2c17ca, + 0x2c17d1, + 0x2a2d0e, + 0x20104a, + 0x20104c, + 0x2309c7, + 0x2309d0, + 0x3c9a48, + 0x2a2f05, + 0x2acbca, + 0x3d1c4c, + 0x296c4d, + 0x3066c6, + 0x3066c7, + 0x3066cc, + 0x39068c, + 0x21920c, + 0x2aadcb, + 0x38fb44, + 0x26f284, + 0x3991c9, + 0x3af387, + 0x3a26c9, + 0x206689, + 0x3bd507, + 0x3c7786, + 0x3c7789, + 0x2ae4c3, + 0x2e444a, + 0x376f47, + 0x38accb, + 0x2ab5ca, + 0x23a244, + 0x3b6286, + 0x283649, + 0x31ae04, + 0x34df0a, + 0x36f685, + 0x2be085, + 0x2be08d, + 0x2be3ce, + 0x2de245, + 0x339886, + 0x3ac787, + 0x259e0a, + 0x37bd46, + 0x2eb504, + 0x3053c7, + 0x2659cb, + 0x303d87, + 0x228b44, + 0x284246, + 0x28424d, + 0x2dcdcc, + 0x215b46, + 0x2f55ca, + 0x335186, + 0x23f2c8, + 0x237ec7, + 0x24334a, + 0x362cc6, + 0x280983, + 0x2b9f46, + 0x3c4288, + 0x39934a, + 0x286bc7, + 0x286bc8, + 0x2d25c4, + 0x28d3c7, + 0x36aa08, + 0x299548, + 0x2b1a48, + 0x3bb5ca, + 0x2e1305, + 0x209387, + 0x23ba53, + 0x258246, + 0x20fac8, + 0x21d849, + 0x244188, + 0x33294b, + 0x3ca588, + 0x265b04, + 0x35e486, + 0x323f06, + 0x31fa49, + 0x2c4207, + 0x259c88, + 0x2996c6, + 0x3731c4, + 0x256345, + 0x2ce788, + 0x25714a, + 0x2c8308, + 0x2cf546, + 0x29a4ca, + 0x2b0948, + 0x2d3f48, + 0x2d4b08, + 0x2d5386, + 0x2d7786, + 0x3aae8c, + 0x2d7d50, + 0x2a0cc5, + 0x20cdc8, + 0x330310, + 0x20cdd0, + 0x3a7b4e, + 0x3aab0e, + 0x3aab14, + 0x3b058f, + 0x3b0946, + 0x200f11, + 0x374993, + 0x374e08, + 0x30b905, + 0x2cdb88, + 0x2ff9c5, + 0x2e5c0c, + 0x22a089, + 0x293049, + 0x22a507, + 0x3a9849, + 0x35a547, + 0x301d86, + 0x2a3d47, + 0x21a485, + 0x20d743, + 0x30f1c9, + 0x25c649, + 0x241f03, + 0x38ce84, + 0x275b0d, + 0x35c0cf, + 0x373205, + 0x34b186, + 0x224087, + 0x221f07, + 0x3c12c6, + 0x3c12cb, + 0x2a3b05, + 0x25c406, + 0x303247, + 0x2525c9, + 0x386c06, + 0x30dec5, + 0x20478b, + 0x216606, + 0x35ac45, + 0x24ed88, + 0x2b4cc8, + 0x2aec0c, + 0x2aec10, + 0x2ae8c9, + 0x308687, + 0x2be94b, + 0x2fa146, + 0x2e8eca, + 0x2e9c0b, + 0x2eaa0a, + 0x2eac86, + 0x2ec005, + 0x32c4c6, + 0x27a2c8, + 0x22a5ca, + 0x33f35c, + 0x2f454c, + 0x2f4848, + 0x3acb85, + 0x38e587, + 0x30d1c6, + 0x282585, + 0x216046, + 0x3c1488, + 0x2bd307, + 0x352f88, + 0x25830a, + 0x22418c, + 0x20b3c9, + 0x2232c7, + 0x287a04, + 0x248106, + 0x39be4a, + 0x206785, + 0x22070c, + 0x222b08, + 0x328888, + 0x389acc, + 0x23140c, + 0x239d89, + 0x239fc7, + 0x24a50c, + 0x22a884, + 0x25150a, + 0x30604c, + 0x27418b, + 0x25b94b, + 0x25c006, + 0x264547, + 0x230c07, + 0x230c0f, + 0x307091, + 0x2deed2, + 0x26878d, + 0x26878e, + 0x268ace, + 0x3b0748, + 0x3b0752, + 0x271dc8, + 0x21de87, + 0x25034a, + 0x2a5f08, + 0x2a60c5, + 0x397d0a, + 0x219c87, + 0x2f6b44, + 0x21ae83, + 0x2385c5, + 0x2c1a47, + 0x306307, + 0x296e4e, + 0x351f8d, + 0x359549, + 0x247905, + 0x3a8083, + 0x207686, + 0x25d705, + 0x37e548, + 0x2b7089, + 0x260345, + 0x26034f, + 0x2e5087, + 0x209c05, + 0x31270a, + 0x381e46, + 0x26a389, + 0x2ff50c, + 0x3011c9, + 0x208446, + 0x2f84cc, + 0x338c86, + 0x304f48, + 0x305586, + 0x31d006, + 0x2b1644, + 0x31f9c3, + 0x2b3e8a, + 0x313a11, + 0x25560a, + 0x25ecc5, + 0x26fc07, + 0x258687, + 0x2f0d44, + 0x36ab0b, + 0x2b9008, + 0x2bb0c6, + 0x233b45, + 0x2654c4, + 0x24e709, + 0x2008c4, + 0x244a87, + 0x3013c5, + 0x3013c7, + 0x371f05, + 0x38f243, + 0x21dd48, + 0x3c9d4a, + 0x206743, + 0x22210a, + 0x3c1106, + 0x2600cf, + 0x3bc1c9, + 0x2f4d50, + 0x2f9ec8, + 0x2cfec9, + 0x297b47, + 0x2841cf, + 0x32af04, + 0x2da904, + 0x219786, + 0x35aa86, + 0x3a394a, + 0x27bec6, + 0x358687, + 0x313e48, + 0x314047, + 0x315247, + 0x31620a, + 0x31808b, + 0x3cce85, + 0x2deb08, + 0x230483, + 0x3b5f4c, + 0x344a8f, + 0x2d984d, + 0x25a807, + 0x359689, + 0x241947, + 0x25acc8, + 0x22dd0c, + 0x2b5308, + 0x271408, + 0x32e68e, + 0x341b14, + 0x342024, + 0x358d8a, + 0x37f04b, + 0x35a604, + 0x35a609, + 0x236c88, + 0x248845, + 0x30eb0a, + 0x260747, + 0x32c3c4, + 0x373a83, + 0x209303, + 0x238084, + 0x2351c3, + 0x22b883, + 0x21e084, + 0x20f8c3, + 0x2287c3, + 0x2d7d46, + 0x226004, + 0x215c83, + 0x24b583, + 0x214e83, + 0x2000c2, + 0x373a83, + 0x209302, + 0x209303, + 0x238084, + 0x2351c3, + 0x22b883, + 0x20f8c3, + 0x2d7d46, + 0x215c83, + 0x24b583, + 0xaf0c8, + 0x209303, + 0x2351c3, + 0x210a43, + 0x215c83, + 0xe6243, + 0x24b583, + 0xaf0c8, + 0x209303, + 0x2351c3, + 0x22b883, + 0x2287c3, + 0x226004, + 0x215c83, + 0x24b583, + 0x2000c2, + 0x243003, + 0x209302, + 0x2351c3, + 0x22b883, + 0x2287c3, + 0x215c83, + 0x24b583, + 0x200dc2, + 0x200bc2, + 0x209302, + 0x209303, + 0x20e7c2, + 0x2005c2, + 0x21e084, + 0x229d44, + 0x26da42, + 0x226004, + 0x2003c2, + 0x24b583, + 0x214e83, + 0x25c006, + 0x22c682, + 0x202fc2, + 0x21ea82, + 0x4c20cfc3, + 0x4c601043, + 0x58fc6, + 0x58fc6, + 0x28b004, + 0x202543, + 0x17d0a, + 0x11c58c, + 0x14418c, + 0xc734d, + 0xf6d85, + 0x8bc0c, + 0x6dec7, + 0x10446, + 0x14a88, + 0x177c7, + 0x1c208, + 0x18588a, + 0x105887, + 0x4d28be45, + 0xdb3c9, + 0x3704b, + 0x1c5b8b, + 0x28948, + 0xfec9, + 0x8ca8a, + 0x1951ce, + 0x11e88d, + 0x1443f8b, + 0xdcc8a, + 0x1cb04, + 0x68306, + 0x4b6c8, + 0x73dc8, + 0x37307, + 0x1d405, + 0x93f07, + 0x7c709, + 0x11ae87, + 0x65e48, + 0x109dc9, + 0x4e484, + 0x4ff05, + 0x13c78e, + 0x2030d, + 0x28748, + 0x4d771486, + 0x4e171488, + 0xe4a08, + 0x13b790, + 0x54c4c, + 0x650c7, + 0x65c87, + 0x6acc7, + 0x71fc7, + 0xb182, + 0x16a547, + 0x21c8c, + 0x10d445, + 0x2d747, + 0xa5246, + 0xa63c9, + 0xa8148, + 0x55282, + 0x5c2, + 0x3dd0b, + 0xe6107, + 0x23bc9, + 0x47089, + 0xccd08, + 0xb0442, + 0x1a5b89, + 0xd180a, + 0x169f86, + 0xcb209, + 0xdcc07, + 0xdd349, + 0xde388, + 0xdf387, + 0xe1289, + 0xe6a45, + 0xe6dd0, + 0x12e1c6, + 0x178145, + 0x8ec87, + 0x1038cd, + 0x42a85, + 0x256c6, + 0xeeac7, + 0xf6058, + 0x11b208, + 0x169d8a, + 0x6702, + 0x5b70a, + 0x76c8d, + 0x3182, + 0xea746, + 0x8f848, + 0x4b248, + 0x6f949, + 0x1147c8, + 0x8000e, + 0x7687, + 0x10924d, + 0xfddc5, + 0x16a2c8, + 0x1ac3c8, + 0x109846, + 0x2a82, + 0xd8546, + 0x40386, + 0xc882, + 0x401, + 0x5f087, + 0x13ab83, + 0x4daf68c4, + 0x4de95903, + 0xc1, + 0x12946, + 0xc1, + 0x201, + 0x12946, + 0x13ab83, + 0x14f2005, + 0x243644, + 0x209303, + 0x24f544, + 0x21e084, + 0x215c83, + 0x21d705, + 0x215943, + 0x22d183, + 0x3c1245, + 0x20ab43, + 0x4f209303, + 0x2351c3, + 0x22b883, + 0x200181, + 0x2287c3, + 0x229d44, + 0x226004, + 0x215c83, + 0x24b583, + 0x201203, + 0xaf0c8, + 0x2000c2, + 0x373a83, + 0x209302, + 0x209303, + 0x2351c3, + 0x210a43, + 0x2005c2, + 0x21e084, + 0x20f8c3, + 0x2287c3, + 0x215c83, + 0x202543, + 0x24b583, + 0x20ab43, + 0xaf0c8, + 0x344802, + 0x122c87, + 0x9302, + 0x562c5, + 0x54d8f, + 0x158e708, + 0x114c4e, + 0x502210c2, + 0x32bb48, + 0x221546, + 0x2c2806, + 0x220ec7, + 0x50603882, + 0x50bbc048, + 0x21f44a, + 0x264b48, + 0x204542, + 0x38ab09, + 0x3ccec7, + 0x2132c6, + 0x21da89, + 0x2094c4, + 0x210e06, + 0x2c2c04, + 0x282344, + 0x259789, + 0x305d46, + 0x2ed945, + 0x252345, + 0x22fe47, + 0x2bfdc7, + 0x2a5884, + 0x221106, + 0x2f7c45, + 0x2ab0c5, + 0x319145, + 0x20eac7, + 0x311b85, + 0x32a449, + 0x367b05, + 0x2fb904, + 0x37bc87, + 0x37264e, + 0x30b549, + 0x371b89, + 0x366646, + 0x240d88, + 0x2f110b, + 0x36314c, + 0x353d46, + 0x364f87, + 0x2afec5, + 0x2e54ca, + 0x218089, + 0x348d49, + 0x2016c6, + 0x303005, + 0x2483c5, + 0x3313c9, + 0x3192cb, + 0x279006, + 0x34c086, + 0x20b0c4, + 0x28dd86, + 0x246b48, + 0x3c4106, + 0x26e206, + 0x204b48, + 0x205fc7, + 0x206c89, + 0x207845, + 0xaf0c8, + 0x293e84, + 0x3157c4, + 0x20d9c5, + 0x3b2209, + 0x21c787, + 0x21c78b, + 0x22354a, + 0x229fc5, + 0x50e08942, + 0x2ab487, + 0x5122a2c8, + 0x211507, + 0x2dc385, + 0x23968a, + 0x9302, + 0x25200b, + 0x27b48a, + 0x25c546, + 0x20d843, + 0x2ccf4d, + 0x39d20c, + 0x3d230d, + 0x24aa45, + 0x391cc5, + 0x30f047, + 0x20e7c9, + 0x21f346, + 0x25d285, + 0x2d6108, + 0x28dc83, + 0x2fe788, + 0x28dc88, + 0x2c3907, + 0x34d6c8, + 0x39d009, + 0x2e3307, + 0x31b6c7, + 0x38a988, + 0x2fd784, + 0x2fd787, + 0x295008, + 0x359406, + 0x39dfcf, + 0x226e87, + 0x355286, + 0x23a105, + 0x21ec03, + 0x249e87, + 0x389083, + 0x24e986, + 0x250046, + 0x2508c6, + 0x292705, + 0x2685c3, + 0x3a5808, + 0x38c609, + 0x39ec0b, + 0x250a48, + 0x251b85, + 0x2530c5, + 0x5163a302, + 0x2a3e09, + 0x21e107, + 0x25c485, + 0x259687, + 0x25bc06, + 0x383105, + 0x25d54b, + 0x25f6c4, + 0x264705, + 0x264847, + 0x278986, + 0x278dc5, + 0x286807, + 0x286f87, + 0x2fa5c4, + 0x28ba0a, + 0x28c508, + 0x2b9649, + 0x2cdec5, + 0x363946, + 0x246d0a, + 0x252246, + 0x268f87, + 0x2b930d, + 0x2a3649, + 0x3a4b05, + 0x310207, + 0x372a48, + 0x374fc8, + 0x366207, + 0x205c06, + 0x227247, + 0x24fb83, + 0x305cc4, + 0x380645, + 0x3aa207, + 0x3ae689, + 0x26e548, + 0x22dfc5, + 0x246284, + 0x250c05, + 0x25f88d, + 0x203402, + 0x2bedc6, + 0x2ea686, + 0x315f8a, + 0x395b06, + 0x39bd85, + 0x368fc5, + 0x368fc7, + 0x3a928c, + 0x2e488a, + 0x28da46, + 0x2d7685, + 0x28dbc6, + 0x28df07, + 0x2906c6, + 0x29260c, + 0x21dbc9, + 0x51a12dc7, + 0x294e85, + 0x294e86, + 0x295388, + 0x24fe05, + 0x2a40c5, + 0x2a4848, + 0x2a4a4a, + 0x51e7c402, + 0x52208b82, + 0x2d8a45, + 0x2a7483, + 0x245308, + 0x2050c3, + 0x2a4cc4, + 0x26a4cb, + 0x2050c8, + 0x317b08, + 0x526560c9, + 0x2a9809, + 0x2a9f46, + 0x2ac1c8, + 0x2ac3c9, + 0x2ad046, + 0x2ad1c5, + 0x24a846, + 0x2ad689, + 0x30c487, + 0x3ad306, + 0x2e8487, + 0x30c747, + 0x326404, + 0x52b1b509, + 0x2827c8, + 0x3bbf48, + 0x373407, + 0x2c7dc6, + 0x2027c9, + 0x2c2ec7, + 0x35c60a, + 0x35db88, + 0x212f47, + 0x215d86, + 0x28ea8a, + 0x3a0288, + 0x2ea105, + 0x2255c5, + 0x343607, + 0x304d09, + 0x37d30b, + 0x326c88, + 0x367b89, + 0x250e47, + 0x2b5f4c, + 0x2b670c, + 0x2b6a0a, + 0x2b6c8c, + 0x2c2788, + 0x2c2988, + 0x2c2b84, + 0x2c3089, + 0x2c32c9, + 0x2c350a, + 0x2c3789, + 0x2c3ac7, + 0x3b3b8c, + 0x237a46, + 0x2c6248, + 0x252306, + 0x393bc6, + 0x3a4a07, + 0x30b748, + 0x377a4b, + 0x2113c7, + 0x238689, + 0x3840c9, + 0x24f6c7, + 0x2c2e44, + 0x26fd47, + 0x39b5c6, + 0x210d06, + 0x2f5785, + 0x24c848, + 0x292f44, + 0x292f46, + 0x2e474b, + 0x34d889, + 0x20e9c6, + 0x20ec49, + 0x20da86, + 0x257348, + 0x21e283, + 0x303185, + 0x26e349, + 0x27afc5, + 0x307fc4, + 0x277e86, + 0x23d6c5, + 0x254fc6, + 0x318407, + 0x32dac6, + 0x22c58b, + 0x3911c7, + 0x252d86, + 0x23a606, + 0x22ff06, + 0x2a5849, + 0x2ef4ca, + 0x2bb3c5, + 0x2ed08d, + 0x2a4b46, + 0x2f88c6, + 0x2f4c46, + 0x23f245, + 0x2e70c7, + 0x300687, + 0x208bce, + 0x2287c3, + 0x2c7d89, + 0x38d889, + 0x2e58c7, + 0x26c387, + 0x29dac5, + 0x37e245, + 0x52f9868f, + 0x2d0107, + 0x2d02c8, + 0x2d1144, + 0x2d16c6, + 0x532480c2, + 0x2d5606, + 0x2d7d46, + 0x377d8e, + 0x2fe5ca, + 0x3bc7c6, + 0x22390a, + 0x3d2109, + 0x243885, + 0x37e7c8, + 0x352246, + 0x29c048, + 0x257508, + 0x373f4b, + 0x220fc5, + 0x311c08, + 0x204c8c, + 0x2dc247, + 0x250286, + 0x334fc8, + 0x211088, + 0x5363ce82, + 0x207a4b, + 0x217489, + 0x217b49, + 0x3947c7, + 0x216448, + 0x53a1d148, + 0x375b8b, + 0x2ccb89, + 0x28528d, + 0x26ed88, + 0x3575c8, + 0x53e03c02, + 0x3c4a04, + 0x542203c2, + 0x300ec6, + 0x54605102, + 0x2fd0ca, + 0x204446, + 0x2ecc08, + 0x38fe48, + 0x39b9c6, + 0x2ee946, + 0x2f9c46, + 0x37e4c5, + 0x23aa84, + 0x54a6ea84, + 0x351d86, + 0x27bcc7, + 0x54ee6787, + 0x2200cb, + 0x211709, + 0x391d0a, + 0x369104, + 0x2ba1c8, + 0x3ad0cd, + 0x2f2ac9, + 0x2f2d08, + 0x2f2f89, + 0x2f6044, + 0x2466c4, + 0x25e745, + 0x31990b, + 0x205046, + 0x351bc5, + 0x21bac9, + 0x2211c8, + 0x26ec04, + 0x2e5649, + 0x266f45, + 0x2bfe08, + 0x31bd87, + 0x371f88, + 0x283846, + 0x208807, + 0x2ddbc9, + 0x204909, + 0x35acc5, + 0x248f85, + 0x55212fc2, + 0x2fb6c4, + 0x224405, + 0x220dc6, + 0x3c85c5, + 0x298fc7, + 0x351e85, + 0x2789c4, + 0x366706, + 0x27bdc7, + 0x232906, + 0x325545, + 0x210748, + 0x221745, + 0x216b87, + 0x225209, + 0x34d9ca, + 0x2ec787, + 0x2ec78c, + 0x2ed906, + 0x24b409, + 0x24e1c5, + 0x24fd48, + 0x20a743, + 0x20d405, + 0x39b285, + 0x27fbc7, + 0x5561cbc2, + 0x2ee147, + 0x2f5cc6, + 0x33d146, + 0x2fc2c6, + 0x210fc6, + 0x2671c8, + 0x2cdcc5, + 0x355347, + 0x35534d, + 0x21ae83, + 0x21ae85, + 0x3124c7, + 0x2ee488, + 0x312085, + 0x2150c8, + 0x3a25c6, + 0x2db587, + 0x2c6185, + 0x221046, + 0x3aed05, + 0x21f10a, + 0x3819c6, + 0x304587, + 0x2e2e85, + 0x301007, + 0x305344, + 0x307f46, + 0x37e705, + 0x22260b, + 0x39b449, + 0x24310a, + 0x35ad48, + 0x317248, + 0x31d30c, + 0x328d47, + 0x34c888, + 0x34e948, + 0x34ed85, + 0x3a3b8a, + 0x3a8089, + 0x55a010c2, + 0x3cc3c6, + 0x260344, + 0x348409, + 0x295e09, + 0x279647, + 0x2c25c7, + 0x206509, + 0x23f448, + 0x23f44f, + 0x227c46, + 0x2db08b, + 0x3b8ec5, + 0x3b8ec7, + 0x2fed09, + 0x26a606, + 0x2e55c7, + 0x2df245, + 0x232704, + 0x27ae86, + 0x21c944, + 0x2e9a47, + 0x2cfbc8, + 0x55f02f08, + 0x304a45, + 0x304b87, + 0x359f09, + 0x20ef84, + 0x242648, + 0x562189c8, + 0x2f0d44, + 0x2fbc08, + 0x367584, + 0x34b749, + 0x20fa05, + 0x56616a42, + 0x227c85, + 0x2d3285, + 0x310048, + 0x236147, + 0x56a008c2, + 0x26ebc5, + 0x2d3dc6, + 0x240686, + 0x2fb688, + 0x2fda88, + 0x3c8586, + 0x3af206, + 0x322d49, + 0x33d086, + 0x29408b, + 0x2f1f45, + 0x2a5e46, + 0x2948c8, + 0x22ea46, + 0x331786, + 0x21558a, + 0x2a9bca, + 0x25cc05, + 0x2cdd87, + 0x31e086, + 0x56e04fc2, + 0x312607, + 0x256c45, + 0x246c84, + 0x246c85, + 0x2ba0c6, + 0x272d47, + 0x219785, + 0x24c8c4, + 0x334648, + 0x331845, + 0x2e0b07, + 0x3b0c05, + 0x21f045, + 0x2266c4, + 0x2266c9, + 0x2f7a88, + 0x23d586, + 0x2d19c6, + 0x36a806, + 0x573bf808, + 0x3c8307, + 0x3099cd, + 0x31088c, + 0x310e89, + 0x3110c9, + 0x57778742, + 0x3c7543, + 0x205cc3, + 0x39b685, + 0x3aa30a, + 0x33cf46, + 0x315b45, + 0x3185c4, + 0x3185cb, + 0x32f78c, + 0x330bcc, + 0x330ed5, + 0x331e0d, + 0x336a0f, + 0x336dd2, + 0x33724f, + 0x337612, + 0x337a93, + 0x337f4d, + 0x33850d, + 0x33888e, + 0x338e0e, + 0x33964c, + 0x339a0c, + 0x339e4b, + 0x33b28e, + 0x33bb92, + 0x33cd0c, + 0x33d2d0, + 0x3460d2, + 0x346d4c, + 0x34740d, + 0x34774c, + 0x34a151, + 0x34c20d, + 0x34f34d, + 0x34f94a, + 0x34fbcc, + 0x350e8c, + 0x3518cc, + 0x3535cc, + 0x356193, + 0x356810, + 0x356c10, + 0x3577cd, + 0x357dcc, + 0x358ac9, + 0x35b5cd, + 0x35b913, + 0x35ebd1, + 0x35f013, + 0x35fbcf, + 0x35ff8c, + 0x36028f, + 0x36064d, + 0x360c4f, + 0x361010, + 0x361a8e, + 0x36af0e, + 0x36b490, + 0x36c14d, + 0x36cace, + 0x36ce4c, + 0x36de13, + 0x36fd0e, + 0x370390, + 0x370791, + 0x370bcf, + 0x370f93, + 0x3782cd, + 0x37860f, + 0x3789ce, + 0x379090, + 0x379489, + 0x37a510, + 0x37ab0f, + 0x37b18f, + 0x37b552, + 0x37c4ce, + 0x37cecd, + 0x37d5cd, + 0x37d90d, + 0x37f38d, + 0x37f6cd, + 0x37fa10, + 0x37fe0b, + 0x38040c, + 0x38078c, + 0x380d8c, + 0x38108e, + 0x390050, + 0x391f92, + 0x39240b, + 0x39290e, + 0x392c8e, + 0x39350e, + 0x39398b, + 0x57b940d6, + 0x39580d, + 0x395c94, + 0x39680d, + 0x398095, + 0x39998d, + 0x39a30f, + 0x39a98f, + 0x39eecf, + 0x39f28e, + 0x39f80d, + 0x3a15d1, + 0x3a41cc, + 0x3a44cc, + 0x3a47cb, + 0x3a4c4c, + 0x3a500f, + 0x3a53d2, + 0x3a620d, + 0x3a78cc, + 0x3a82cc, + 0x3a85cd, + 0x3a890f, + 0x3a8cce, + 0x3a9fcc, + 0x3aa58d, + 0x3aa8cb, + 0x3ab18c, + 0x3aba8d, + 0x3abdce, + 0x3ac149, + 0x3ad5d3, + 0x3adb0d, + 0x3ade4d, + 0x3ae44c, + 0x3ae8ce, + 0x3af54f, + 0x3af90c, + 0x3afc0d, + 0x3aff4f, + 0x3b030c, + 0x3b0d4c, + 0x3b10cc, + 0x3b13cc, + 0x3b1a8d, + 0x3b1dd2, + 0x3b244c, + 0x3b274c, + 0x3b2a51, + 0x3b2e8f, + 0x3b324f, + 0x3b3613, + 0x3b3fce, + 0x3b434f, + 0x3b470c, + 0x57fb4a4e, + 0x3b4dcf, + 0x3b5196, + 0x3b6412, + 0x3b86cc, + 0x3b908f, + 0x3b970d, + 0x3be88f, + 0x3bec4c, + 0x3bef4d, + 0x3bf28d, + 0x3c090e, + 0x3c1bcc, + 0x3c348c, + 0x3c3790, + 0x3c68d1, + 0x3c6d0b, + 0x3c714c, + 0x3c744e, + 0x3c8c51, + 0x3c908e, + 0x3c940d, + 0x3ce5cb, + 0x3ceecf, + 0x3cfd14, + 0x2049c2, + 0x2049c2, + 0x204c83, + 0x2049c2, + 0x204c83, + 0x2049c2, + 0x203702, + 0x24a885, + 0x3c894c, + 0x2049c2, + 0x2049c2, + 0x203702, + 0x2049c2, + 0x295a05, + 0x34d9c5, + 0x2049c2, + 0x2049c2, + 0x20d9c2, + 0x295a05, + 0x3337c9, + 0x35e8cc, + 0x2049c2, + 0x2049c2, + 0x2049c2, + 0x2049c2, + 0x24a885, + 0x2049c2, + 0x2049c2, + 0x2049c2, + 0x2049c2, + 0x20d9c2, + 0x3337c9, + 0x2049c2, + 0x2049c2, + 0x2049c2, + 0x34d9c5, + 0x2049c2, + 0x34d9c5, + 0x35e8cc, + 0x3c894c, + 0x373a83, + 0x209303, + 0x2351c3, + 0x22b883, + 0x21e084, + 0x215c83, + 0x24b583, + 0x10f508, + 0x80144, + 0x2543, + 0xc5a88, + 0x2000c2, + 0x58e09302, + 0x241f83, + 0x2471c4, + 0x202c03, + 0x255a44, + 0x231a46, + 0x210303, + 0x302144, + 0x25c905, + 0x2287c3, + 0x215c83, + 0xe6243, + 0x24b583, + 0x2678ca, + 0x25c006, + 0x39300c, + 0xaf0c8, + 0x209302, + 0x209303, + 0x2351c3, + 0x22b883, + 0x209383, + 0x2d7d46, + 0x215c83, + 0x24b583, + 0x214e83, + 0xa5a88, + 0xf6d85, + 0x1c5cc9, + 0x10c02, + 0x5a2ff905, + 0xf6d85, + 0x6dec7, + 0x6fa88, + 0xbece, + 0x89ad2, + 0x7d2cb, + 0x105986, + 0x5a68be45, + 0x5aa8be4c, + 0xce007, + 0xe41c7, + 0xba98a, + 0x3c7d0, + 0x10c8c5, + 0xe4f8b, + 0x73dc8, + 0x37307, + 0x15d74b, + 0x7c709, + 0x1323c7, + 0x11ae87, + 0x79247, + 0x37246, + 0x65e48, + 0x5b03cf86, + 0x4b187, + 0x2030d, + 0xba350, + 0x5b407242, + 0x28748, + 0x5ae50, + 0x183e4c, + 0x5bb8e40d, + 0x5da08, + 0x5de8b, + 0x6b9c7, + 0x15e049, + 0x59086, + 0x95588, + 0x72302, + 0x7318a, + 0xe1c07, + 0x2d747, + 0xa63c9, + 0xa8148, + 0x11a745, + 0xf410e, + 0x1b44e, + 0x1f88f, + 0x23bc9, + 0x47089, + 0x7358b, + 0x91c4f, + 0xad38c, + 0x193e0b, + 0xd1388, + 0x1016c7, + 0x1076c8, + 0x140f8b, + 0x15844c, + 0x16224c, + 0x16fa0c, + 0x17a04d, + 0xccd08, + 0xc4442, + 0x1a5b89, + 0x181cc8, + 0x1a300b, + 0xc7fc6, + 0xd36cb, + 0x13b6cb, + 0xde98a, + 0xdf545, + 0xe6dd0, + 0xe8646, + 0x74e86, + 0x178145, + 0x8ec87, + 0x113648, + 0xeeac7, + 0xeed87, + 0x1cfb47, + 0x100d0a, + 0xaef4a, + 0xea746, + 0x9358d, + 0x4b248, + 0x1147c8, + 0xaa309, + 0xb5685, + 0x10084c, + 0x17a24b, + 0x17d244, + 0x109609, + 0x109846, + 0x155a46, + 0xb7fc6, + 0x2fc2, + 0x40386, + 0x169ccb, + 0x11d187, + 0xc882, + 0xc9f05, + 0x189c4, + 0x101, + 0x8ac3, + 0x5aea7646, + 0x95903, + 0x382, + 0x2d744, + 0x4542, + 0x8b004, + 0x882, + 0x7b82, + 0x3fc2, + 0x10e842, + 0xdc2, + 0x8be42, + 0x1242, + 0x142c02, + 0x38b42, + 0x17382, + 0x69c2, + 0x16502, + 0x351c3, + 0x942, + 0x12c2, + 0xd42, + 0x8282, + 0x642, + 0x33542, + 0x55282, + 0x7602, + 0x7502, + 0x5c2, + 0xf8c3, + 0xb02, + 0x2382, + 0xb0442, + 0x6d82, + 0x5142, + 0xbcc2, + 0x10e42, + 0x9df02, + 0x9382, + 0x10b282, + 0x6ca42, + 0x7e02, + 0x15c83, + 0x602, + 0x3ce82, + 0x1e82, + 0x1b382, + 0x15ac45, + 0x57c2, + 0x44042, + 0x3f843, + 0x682, + 0x6702, + 0x3182, + 0xac02, + 0xeb02, + 0x8c2, + 0x2a82, + 0x2fc2, + 0x7f85, + 0x5be03702, + 0x5c3bb7c3, + 0x16583, + 0x5c603702, + 0x16583, + 0x83147, + 0x20f403, + 0x2000c2, + 0x209303, + 0x2351c3, + 0x210a43, + 0x2005c3, + 0x209383, + 0x215c83, + 0x202543, + 0x24b583, + 0x295943, + 0xd983, + 0xaf0c8, + 0x209303, + 0x2351c3, + 0x210a43, + 0x2287c3, + 0x215c83, + 0x202543, + 0xe6243, + 0x24b583, + 0x209303, + 0x2351c3, + 0x24b583, + 0x209303, + 0x2351c3, + 0x22b883, + 0x200181, + 0x2287c3, + 0x215c83, + 0x24fb43, + 0x24b583, + 0x110784, + 0x373a83, + 0x209303, + 0x2351c3, + 0x209d43, + 0x210a43, + 0x27fac3, + 0x23ea03, + 0x2a3bc3, + 0x2b9c83, + 0x22b883, + 0x21e084, + 0x215c83, + 0x24b583, + 0x20ab43, + 0x376544, + 0x25fa83, + 0x3ac3, + 0x3c4203, + 0x375548, + 0x28eac4, + 0x20020a, + 0x23dc06, + 0x11ce04, + 0x37b987, + 0x21aa4a, + 0x227b09, + 0x3a9d07, + 0x3b56ca, + 0x373a83, + 0x2d8acb, + 0x2b9bc9, + 0x36a905, + 0x33cb47, + 0x9302, + 0x209303, + 0x218cc7, + 0x3549c5, + 0x2c2d09, + 0x2351c3, + 0x2b7a06, + 0x2c1fc3, + 0xf5d43, + 0x117546, + 0x10e886, + 0x10287, + 0x222cc6, + 0x22cac5, + 0x207907, + 0x315087, + 0x5ee2b883, + 0x346f87, + 0x2b80c3, + 0x245085, + 0x21e084, + 0x2705c8, + 0x37cbcc, + 0x340c05, + 0x2a37c6, + 0x218b87, + 0x223387, + 0x24f847, + 0x252ec8, + 0x31668f, + 0x367d45, + 0x242087, + 0x202d07, + 0x2a4e0a, + 0x2d5f49, + 0x312945, + 0x31768a, + 0x173746, + 0x2c2045, + 0x37f284, + 0x38fd86, + 0x335c87, + 0x2c4347, + 0x394948, + 0x21e285, + 0x3548c6, + 0x26e185, + 0x23a745, + 0x28b784, + 0x39b8c7, + 0x26700a, + 0x247608, + 0x378f06, + 0x9383, + 0x2e1305, + 0x3cab86, + 0x3b3dc6, + 0x378046, + 0x2287c3, + 0x3a6487, + 0x202c85, + 0x215c83, + 0x2dec4d, + 0x202543, + 0x394a48, + 0x38cf04, + 0x278c85, + 0x2a4d06, + 0x217206, + 0x2a5d47, + 0x2a3c07, + 0x293d05, + 0x24b583, + 0x3017c7, + 0x35e1c9, + 0x2750c9, + 0x20a28a, + 0x207f42, + 0x245044, + 0x2e8dc4, + 0x377907, + 0x2ee008, + 0x2efd09, + 0x21ad49, + 0x2f0907, + 0x2f1686, + 0xf3e86, + 0x2f6044, + 0x2f664a, + 0x2f9488, + 0x2f9b09, + 0x2e8c46, + 0x2b1f45, + 0x2474c8, + 0x2c840a, + 0x205dc3, + 0x3766c6, + 0x2f0a07, + 0x230245, + 0x38cdc5, + 0x3acc83, + 0x271504, + 0x225585, + 0x287087, + 0x2f7bc5, + 0x3434c6, + 0x1c8485, + 0x289143, + 0x3bc889, + 0x278a4c, + 0x321c4c, + 0x2d34c8, + 0x2fad87, + 0x305708, + 0x3064ca, + 0x306ecb, + 0x2b9d08, + 0x217308, + 0x237946, + 0x36a6c5, + 0x36870a, + 0x3bb805, + 0x216a42, + 0x2c6047, + 0x250586, + 0x379c05, + 0x37de89, + 0x365445, + 0x390f45, + 0x2f1c49, + 0x3caac6, + 0x3b5dc8, + 0x245143, + 0x222e06, + 0x277dc6, + 0x31c985, + 0x31c989, + 0x2f0449, + 0x27ec47, + 0x11f044, + 0x31f047, + 0x21ac49, + 0x237cc5, + 0x3ab88, + 0x394e05, + 0x371a85, + 0x35cf49, + 0x2013c2, + 0x2e17c4, + 0x200d82, + 0x200b02, + 0x2c44c5, + 0x31cb88, + 0x2b55c5, + 0x2c3c83, + 0x2c3c85, + 0x2d5803, + 0x20c9c2, + 0x24be44, + 0x2b08c3, + 0x204782, + 0x34af84, + 0x2e9343, + 0x21ad42, + 0x2b5643, + 0x28f7c4, + 0x2fa0c3, + 0x25f344, + 0x2022c2, + 0x214d83, + 0x223a03, + 0x200b42, + 0x2e03c2, + 0x2f0289, + 0x202202, + 0x28a604, + 0x20e2c2, + 0x247344, + 0x2f1644, + 0x36a184, + 0x202fc2, + 0x237582, + 0x239f43, + 0x306c83, + 0x248b84, + 0x29a7c4, + 0x2f0b84, + 0x2f9644, + 0x318d03, + 0x366e83, + 0x3736c4, + 0x320844, + 0x320986, + 0x22b4c2, + 0x3ce03, + 0x209302, + 0x2351c3, + 0x22b883, + 0x215c83, + 0x24b583, + 0x2000c2, + 0x373a83, + 0x209303, + 0x2351c3, + 0x207343, + 0x22b883, + 0x21e084, + 0x2f0544, + 0x226004, + 0x215c83, + 0x24b583, + 0x214e83, + 0x2f7584, + 0x32bb03, + 0x2a6e43, + 0x37d184, + 0x394c06, + 0x206ec3, + 0xf6d85, + 0xe41c7, + 0x226a03, + 0x6021be08, + 0x25d0c3, + 0x2b1383, + 0x2450c3, + 0x209383, + 0x365f45, + 0x13cb03, + 0x209303, + 0x2351c3, + 0x22b883, + 0x215c83, + 0x24b583, + 0x20d8c3, + 0x231083, + 0xaf0c8, + 0x209303, + 0x2351c3, + 0x22b883, + 0x20f8c3, + 0x215c83, + 0x235dc4, + 0xe6243, + 0x24b583, + 0x30d1c4, + 0xf6d85, + 0x2bf1c5, + 0xe41c7, + 0x209302, + 0x2046c2, + 0x200382, + 0x203202, + 0x2543, + 0x2003c2, + 0x10ce44, + 0x209303, + 0x238084, + 0x2351c3, + 0x22b883, + 0x2287c3, + 0x215c83, + 0x24b583, + 0xaf0c8, + 0x209303, + 0x2351c3, + 0x22b883, + 0x2287c3, + 0x226004, + 0x215c83, + 0x2543, + 0x24b583, + 0x201203, + 0x28b004, + 0xaf0c8, + 0x209303, + 0x202543, + 0xd983, + 0x153bc4, + 0x243644, + 0xaf0c8, + 0x209303, + 0x24f544, + 0x21e084, + 0x202543, + 0x203c02, + 0xe6243, + 0x24b583, + 0x22d183, + 0x71504, + 0x3c1245, + 0x216a42, + 0x369c43, + 0x168109, + 0xdd0c6, + 0x173888, + 0x2000c2, + 0xaf0c8, + 0x209302, + 0x2351c3, + 0x22b883, + 0x2005c2, + 0x2543, + 0x24b583, + 0xb682, + 0x2000c2, + 0x1b5887, + 0x10a1c9, + 0x39c3, + 0xaf0c8, + 0x10e803, + 0x63b54747, + 0x9303, + 0x1cc2c8, + 0x2351c3, + 0x22b883, + 0x41e06, + 0x20f8c3, + 0x90d88, + 0xc1348, + 0xcda86, + 0x2287c3, + 0xcb788, + 0x99043, + 0x63ce07c6, + 0xe7785, + 0x353c7, + 0x15c83, + 0x4f43, + 0x4b583, + 0x4482, + 0x1a23ca, + 0x5303, + 0xc4583, + 0x2fde44, + 0x11648b, + 0x116a48, + 0x8fe82, + 0x1454d87, + 0x15728c7, + 0x14c3d48, + 0x1520483, + 0x14b4cb, + 0x12d707, + 0x2000c2, + 0x209302, + 0x209303, + 0x2351c3, + 0x2da884, + 0x22b883, + 0x20f8c3, + 0x2287c3, + 0x215c83, + 0x209303, + 0x2351c3, + 0x22b883, + 0x209383, + 0x215c83, + 0x24b583, + 0x282583, + 0x201203, + 0x209303, + 0x2351c3, + 0x22b883, + 0x215c83, + 0x24b583, + 0x209303, + 0x2351c3, + 0x22b883, + 0x215c83, + 0x24b583, + 0xd983, + 0x209303, + 0x2351c3, + 0x22b883, + 0x21e084, + 0x209383, + 0x215c83, + 0x24b583, + 0x22c682, + 0x2000c1, + 0x2000c2, + 0x200201, + 0x336b02, + 0xaf0c8, + 0x219505, + 0x200101, + 0x9303, + 0x2029c1, + 0x200501, + 0x200d41, + 0x24a802, + 0x389084, + 0x24a803, + 0x200041, + 0x200801, + 0x200181, + 0x200701, + 0x2f6c07, + 0x2f974f, + 0x3a3dc6, + 0x2004c1, + 0x353c06, + 0x201741, + 0x200581, + 0x3ce80e, + 0x2003c1, + 0x24b583, + 0x201401, + 0x242b85, + 0x204482, + 0x3acb85, + 0x200401, + 0x200741, + 0x2007c1, + 0x216a42, + 0x200081, + 0x207301, + 0x20b6c1, + 0x201d81, + 0x202e01, + 0xaf0c8, + 0x209303, + 0x2351c3, + 0x22b883, + 0x215c83, + 0x24b583, + 0x215943, + 0x209303, + 0x22b883, + 0x8fdc8, + 0x2287c3, + 0x215c83, + 0x89d83, + 0x24b583, + 0x14eb148, + 0xd7c8, + 0xf6d85, + 0xaf0c8, + 0x2543, + 0xf6d85, + 0x18a904, + 0x48284, + 0x14eb14a, + 0xaf0c8, + 0xe6243, + 0x209303, + 0x2351c3, + 0x22b883, + 0x215c83, + 0x24b583, + 0x203ac3, + 0xaf0c8, + 0x209303, + 0x2351c3, + 0x2da884, + 0x24b583, + 0x27f485, + 0x3c9d44, + 0x209303, + 0x215c83, + 0x24b583, + 0xa5b8a, + 0x11f3c4, + 0x124e06, + 0x209302, + 0x209303, + 0x232649, + 0x2351c3, + 0x2a8d09, + 0x22b883, + 0x2287c3, + 0x215c83, + 0x7bc04, + 0x2543, + 0x24b583, + 0x2f5e48, + 0x23f107, + 0x3c1245, + 0x1c6f48, + 0x1b5887, + 0xee28a, + 0x111e4b, + 0x153e47, + 0x40c48, + 0x11b34a, + 0x12a08, + 0x10a1c9, + 0x25447, + 0x66e07, + 0x10b1c8, + 0x1cc2c8, + 0x4234f, + 0x260c5, + 0x1cc5c7, + 0x41e06, + 0x18e947, + 0x112a86, + 0x90d88, + 0xa1346, + 0x1ca8c7, + 0x55e09, + 0x5d47, + 0x107a89, + 0xb5ac9, + 0xbef46, + 0xc1348, + 0xbff45, + 0x7c28a, + 0xcb788, + 0x99043, + 0xd5d88, + 0x353c7, + 0x167885, + 0x60e10, + 0x4f43, + 0xe6243, + 0x55c87, + 0x27345, + 0xef088, + 0x693c5, + 0xc4583, + 0x169308, + 0x15ce06, + 0x1a68c9, + 0xac5c7, + 0x1683cb, + 0x1430c4, + 0x108f84, + 0x11648b, + 0x116a48, + 0x117447, + 0xf6d85, + 0x209303, + 0x2351c3, + 0x210a43, + 0x24b583, + 0x23ffc3, + 0x22b883, + 0xe6243, + 0x209303, + 0x2351c3, + 0x22b883, + 0x2287c3, + 0x215c83, + 0x24b583, + 0x736cb, + 0x2000c2, + 0x209302, + 0x24b583, + 0xaf0c8, + 0x2000c2, + 0x209302, + 0x200382, + 0x2005c2, + 0x2025c2, + 0x215c83, + 0x2003c2, + 0x2000c2, + 0x373a83, + 0x209302, + 0x209303, + 0x2351c3, + 0x200382, + 0x22b883, + 0x20f8c3, + 0x2287c3, + 0x226004, + 0x215c83, + 0x213203, + 0x2543, + 0x24b583, + 0x2fde44, + 0x20ab43, + 0x22b883, + 0x209302, + 0x209303, + 0x2351c3, + 0x22b883, + 0x2287c3, + 0x215c83, + 0x202543, + 0x24b583, + 0x3b8b87, + 0x209303, + 0x20a607, + 0x307846, + 0x20a6c3, + 0x20f783, + 0x22b883, + 0x202b03, + 0x21e084, + 0x39bec4, + 0x2e9e86, + 0x200f03, + 0x215c83, + 0x24b583, + 0x27f485, + 0x2abac4, + 0x2bae83, + 0x20b2c3, + 0x2c6047, + 0x31bd05, + 0x209303, + 0x2351c3, + 0x22b883, + 0x2287c3, + 0x215c83, + 0x24b583, + 0x57cc7, + 0x8ec87, + 0x1a3605, + 0x219002, + 0x24b383, + 0x20f083, + 0x373a83, + 0x6ce09303, + 0x20e7c2, + 0x2351c3, + 0x202c03, + 0x22b883, + 0x21e084, + 0x329f83, + 0x2ebcc3, + 0x2287c3, + 0x226004, + 0x6d205f02, + 0x215c83, + 0x24b583, + 0x233603, + 0x2189c3, + 0x22c682, + 0x20ab43, + 0xaf0c8, + 0x22b883, + 0xd983, + 0x32c3c4, + 0x373a83, + 0x209302, + 0x209303, + 0x238084, + 0x2351c3, + 0x22b883, + 0x21e084, + 0x20f8c3, + 0x319584, + 0x229d44, + 0x2d7d46, + 0x226004, + 0x215c83, + 0x24b583, + 0x214e83, + 0x250586, + 0x3b18b, + 0x3cf86, + 0x103a8a, + 0x11d74a, + 0xaf0c8, + 0x26e144, + 0x6e609303, + 0x373a44, + 0x2351c3, + 0x2aa444, + 0x22b883, + 0x2ba043, + 0x2287c3, + 0x215c83, + 0xe6243, + 0x24b583, + 0xc6e43, + 0x343a4b, + 0x3bf5ca, + 0x3d100c, + 0xe1088, + 0x2000c2, + 0x209302, + 0x200382, + 0x230105, + 0x21e084, + 0x209382, + 0x2287c3, + 0x229d44, + 0x203202, + 0x2003c2, + 0x201202, + 0x22c682, + 0x173a83, + 0xbc2, + 0x2b3b89, + 0x2ed608, + 0x22b709, + 0x326249, + 0x33340a, + 0x359d0a, + 0x208202, + 0x342c02, + 0x9302, + 0x209303, + 0x22c842, + 0x242246, + 0x37b002, + 0x204702, + 0x3121ce, + 0x214dce, + 0x280b87, + 0x215c07, + 0x283202, + 0x2351c3, + 0x22b883, + 0x200d02, + 0x2005c2, + 0xf703, + 0x23828f, + 0x242582, + 0x3344c7, + 0x2ae547, + 0x326e47, + 0x2b170c, + 0x2e3d8c, + 0x225a84, + 0x25e58a, + 0x214d02, + 0x206d82, + 0x2b72c4, + 0x200702, + 0x20eb42, + 0x2e3fc4, + 0x213302, + 0x205142, + 0x16c03, + 0x2a13c7, + 0x23d985, + 0x210e42, + 0x315a84, + 0x30b282, + 0x2e0948, + 0x215c83, + 0x34e148, + 0x202d82, + 0x225c45, + 0x398f46, + 0x24b583, + 0x2057c2, + 0x2eff47, + 0x4482, + 0x25c285, + 0x3c4905, + 0x2085c2, + 0x20dc42, + 0x2b8eca, + 0x293b8a, + 0x265ac2, + 0x29b6c4, + 0x203c42, + 0x244f08, + 0x20c842, + 0x2ac948, + 0x312c07, + 0x3131c9, + 0x25c302, + 0x318385, + 0x211d45, + 0x21e34b, + 0x2c90cc, + 0x22c348, + 0x32d548, + 0x22b4c2, + 0x2a5e02, + 0x2000c2, + 0xaf0c8, + 0x209302, + 0x209303, + 0x200382, + 0x203202, + 0x2543, + 0x2003c2, + 0x24b583, + 0x201202, + 0x2000c2, + 0xf6d85, + 0x6fa09302, + 0x6fe2b883, + 0x216c03, + 0x209382, + 0x215c83, + 0x32e303, + 0x7024b583, + 0x2ec143, + 0x283246, + 0x1601203, + 0xf6d85, + 0x14b04b, + 0xaf0c8, + 0x65887, + 0x6f887, + 0x178145, + 0xa884d, + 0xa688a, + 0x939c7, + 0x2bdc4, + 0x2be03, + 0xb8044, + 0x70a02302, + 0x70e04542, + 0x71203902, + 0x71601b82, + 0x71a0f642, + 0x71e00dc2, + 0xe41c7, + 0x72209302, + 0x7262d202, + 0x72a1b8c2, + 0x72e069c2, + 0x214dc3, + 0x22984, + 0x23a103, + 0x73210cc2, + 0x5da08, + 0x73602242, + 0x4fb87, + 0x73a00042, + 0x73e01042, + 0x74200182, + 0x74606982, + 0x74a07502, + 0x74e005c2, + 0x16bd45, + 0x221703, + 0x31ae04, + 0x75200702, + 0x7560eec2, + 0x75a02902, + 0x7a3cb, + 0x75e01e02, + 0x7664f602, + 0x76a09382, + 0x76e025c2, + 0x77225282, + 0x77603542, + 0x77a04842, + 0x77e6ca42, + 0x78205f02, + 0x78602982, + 0x78a03202, + 0x78e21c42, + 0x792062c2, + 0x7962b9c2, + 0xe6084, + 0x33f9c3, + 0x79a16942, + 0x79e14a02, + 0x7a212d82, + 0x7a6006c2, + 0x7aa003c2, + 0x7ae04782, + 0x73847, + 0x7b203d02, + 0x7b601182, + 0x7ba01202, + 0x7be14d82, + 0x10084c, + 0x7c217442, + 0x7c62a902, + 0x7ca01502, + 0x7ce04fc2, + 0x7d205cc2, + 0x7d655ac2, + 0x7da0c902, + 0x7de10342, + 0x7e278142, + 0x7e6786c2, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x20983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x76329f83, + 0x220983, + 0x365fc4, + 0x2ed506, + 0x2fb603, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x3b6f49, + 0x200bc2, + 0x3c7e03, + 0x2b5dc3, + 0x30ffc5, + 0x202c03, + 0x329f83, + 0x220983, + 0x2a0cc3, + 0x236e03, + 0x3c56c9, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x329f83, + 0x220983, + 0x200bc2, + 0x200bc2, + 0x329f83, + 0x220983, + 0x7ee09303, + 0x2351c3, + 0x326483, + 0x2287c3, + 0x215c83, + 0x2543, + 0x24b583, + 0xaf0c8, + 0x209302, + 0x209303, + 0x215c83, + 0x24b583, + 0x209303, + 0x2351c3, + 0x22b883, + 0x2287c3, + 0x215c83, + 0x2543, + 0x24b583, + 0x243644, + 0x209302, + 0x209303, + 0x30ddc3, + 0x2351c3, + 0x24f544, + 0x210a43, + 0x22b883, + 0x21e084, + 0x20f8c3, + 0x2287c3, + 0x215c83, + 0x24b583, + 0x22d183, + 0x3c1245, + 0x236e03, + 0x20ab43, + 0x2543, + 0x209302, + 0x209303, + 0x329f83, + 0x215c83, + 0x24b583, + 0x2000c2, + 0x373a83, + 0xaf0c8, + 0x209303, + 0x2351c3, + 0x22b883, + 0x231a46, + 0x21e084, + 0x20f8c3, + 0x226004, + 0x215c83, + 0x24b583, + 0x214e83, + 0x209303, + 0x2351c3, + 0x215c83, + 0x24b583, + 0x1443007, + 0x7f87, + 0x209303, + 0x3cf86, + 0x2351c3, + 0x22b883, + 0xe2fc6, + 0x215c83, + 0x24b583, + 0x32a2c8, + 0x32d389, + 0x33e289, + 0x345288, + 0x39b008, + 0x39b009, + 0x32598a, + 0x35884a, + 0x396b4a, + 0x39ca8a, + 0x3bf5ca, + 0x3cb54b, + 0x2463cd, + 0x36294f, + 0x271710, + 0x35b14d, + 0x380a8c, + 0x39c7cb, + 0x6fa88, + 0xfbb08, + 0xe0205, + 0xc9f05, + 0x2000c2, + 0x31bb45, + 0x2094c3, + 0x82609302, + 0x2351c3, + 0x22b883, + 0x3a1107, + 0x2450c3, + 0x2287c3, + 0x215c83, + 0x24fb43, + 0x2095c3, + 0x202543, + 0x24b583, + 0x25c006, + 0x216a42, + 0x20ab43, + 0xaf0c8, + 0x2000c2, + 0x373a83, + 0x209302, + 0x209303, + 0x2351c3, + 0x22b883, + 0x21e084, + 0x2287c3, + 0x215c83, + 0x24b583, + 0x201203, + 0x168104, + 0x14f9086, + 0x2000c2, + 0x209302, + 0x22b883, + 0x2287c3, + 0x24b583, +} + +// children is the list of nodes' children, the parent's wildcard bit and the +// parent's node type. If a node has no children then their children index +// will be in the range [0, 6), depending on the wildcard bit and node type. +// +// The layout within the uint32, from MSB to LSB, is: +// [ 1 bits] unused +// [ 1 bits] wildcard bit +// [ 2 bits] node type +// [14 bits] high nodes index (exclusive) of children +// [14 bits] low nodes index (inclusive) of children +var children = [...]uint32{ + 0x0, + 0x10000000, + 0x20000000, + 0x40000000, + 0x50000000, + 0x60000000, + 0x184060a, + 0x1844610, + 0x1848611, + 0x186c612, + 0x19c861b, + 0x19e0672, + 0x19f4678, + 0x1a0867d, + 0x1a28682, + 0x1a2c68a, + 0x1a4468b, + 0x1a48691, + 0x1a70692, + 0x1a7469c, + 0x1a8c69d, + 0x1a906a3, + 0x1a946a4, + 0x1ad06a5, + 0x1ad46b4, + 0x61adc6b5, + 0x21ae46b7, + 0x1b2c6b9, + 0x1b306cb, + 0x1b506cc, + 0x1b646d4, + 0x1b686d9, + 0x1b986da, + 0x1bb46e6, + 0x1bdc6ed, + 0x1bec6f7, + 0x1bf06fb, + 0x1c886fc, + 0x1c9c722, + 0x1cb0727, + 0x1ce072c, + 0x1cf0738, + 0x1d0473c, + 0x1d18741, + 0x1dbc746, + 0x1fbc76f, + 0x1fc07ef, + 0x202c7f0, + 0x209880b, + 0x20b0826, + 0x20c482c, + 0x20cc831, + 0x20e0833, + 0x20e4838, + 0x2100839, + 0x214c840, + 0x2168853, + 0x216c85a, + 0x217085b, + 0x219485c, + 0x21d0865, + 0x621d4874, + 0x21ec875, + 0x220487b, + 0x220c881, + 0x221c883, + 0x22cc887, + 0x22d08b3, + 0x222e08b4, + 0x222e48b8, + 0x222ec8b9, + 0x23308bb, + 0x23348cc, + 0x27f08cd, + 0x228989fc, + 0x2289ca26, + 0x228a0a27, + 0x228aca28, + 0x228b0a2b, + 0x228bca2c, + 0x228c0a2f, + 0x228c4a30, + 0x228c8a31, + 0x228cca32, + 0x228d0a33, + 0x228dca34, + 0x228e0a37, + 0x228eca38, + 0x228f0a3b, + 0x228f4a3c, + 0x228f8a3d, + 0x22904a3e, + 0x22908a41, + 0x22914a42, + 0x22918a45, + 0x2291ca46, + 0x22920a47, + 0x2924a48, + 0x22928a49, + 0x22934a4a, + 0x22938a4d, + 0x2940a4e, + 0x2984a50, + 0x229a4a61, + 0x229a8a69, + 0x229aca6a, + 0x229b0a6b, + 0x29b4a6c, + 0x229b8a6d, + 0x29c0a6e, + 0x29c4a70, + 0x29c8a71, + 0x29e4a72, + 0x29fca79, + 0x2a00a7f, + 0x2a10a80, + 0x2a1ca84, + 0x2a50a87, + 0x2a54a94, + 0x2a6ca95, + 0x22a74a9b, + 0x22a78a9d, + 0x22a80a9e, + 0x2b58aa0, + 0x22b5cad6, + 0x2b64ad7, + 0x2b68ad9, + 0x22b6cada, + 0x2b70adb, + 0x2b88adc, + 0x2b9cae2, + 0x2bc4ae7, + 0x2be4af1, + 0x2c14af9, + 0x2c3cb05, + 0x2c40b0f, + 0x2c64b10, + 0x2c68b19, + 0x2c7cb1a, + 0x2c80b1f, + 0x2c84b20, + 0x2ca4b21, + 0x2cc0b29, + 0x2cc4b30, + 0x22cc8b31, + 0x2cccb32, + 0x2cd0b33, + 0x2ce0b34, + 0x2ce4b38, + 0x2d5cb39, + 0x2d60b57, + 0x2d64b58, + 0x2d84b59, + 0x2d94b61, + 0x2da8b65, + 0x2dc0b6a, + 0x2dd8b70, + 0x2df0b76, + 0x2df4b7c, + 0x2e0cb7d, + 0x2e28b83, + 0x2e48b8a, + 0x2e68b92, + 0x2e84b9a, + 0x2ee4ba1, + 0x2f00bb9, + 0x2f10bc0, + 0x2f14bc4, + 0x2f28bc5, + 0x2f6cbca, + 0x2fecbdb, + 0x3020bfb, + 0x3024c08, + 0x3030c09, + 0x3050c0c, + 0x3054c14, + 0x3078c15, + 0x3080c1e, + 0x30bcc20, + 0x310cc2f, + 0x3110c43, + 0x319cc44, + 0x31a0c67, + 0x231a4c68, + 0x231a8c69, + 0x231acc6a, + 0x231bcc6b, + 0x231c0c6f, + 0x231c4c70, + 0x231c8c71, + 0x231ccc72, + 0x31e4c73, + 0x3208c79, + 0x3228c82, + 0x3890c8a, + 0x389ce24, + 0x38bce27, + 0x3a78e2f, + 0x3b48e9e, + 0x3bb8ed2, + 0x3c10eee, + 0x3cf8f04, + 0x3d50f3e, + 0x3d8cf54, + 0x3e88f63, + 0x3f54fa2, + 0x3fecfd5, + 0x407cffb, + 0x40e101f, + 0x4319038, + 0x43d10c6, + 0x449d0f4, + 0x44e9127, + 0x457113a, + 0x45ad15c, + 0x45fd16b, + 0x467517f, + 0x6467919d, + 0x6467d19e, + 0x6468119f, + 0x46fd1a0, + 0x47591bf, + 0x47d51d6, + 0x484d1f5, + 0x48cd213, + 0x4939233, + 0x4a6524e, + 0x4abd299, + 0x64ac12af, + 0x4b592b0, + 0x4be12d6, + 0x4c2d2f8, + 0x4c9530b, + 0x4d3d325, + 0x4e0534f, + 0x4e6d381, + 0x4f8139b, + 0x64f853e0, + 0x64f893e1, + 0x4fe53e2, + 0x50413f9, + 0x50d1410, + 0x514d434, + 0x5191453, + 0x5275464, + 0x52a949d, + 0x53094aa, + 0x537d4c2, + 0x54054df, + 0x5445501, + 0x54b5511, + 0x654b952d, + 0x54e152e, + 0x54e5538, + 0x54fd539, + 0x551953f, + 0x555d546, + 0x556d557, + 0x558555b, + 0x55fd561, + 0x560557f, + 0x5621581, + 0x5635588, + 0x565158d, + 0x567d594, + 0x568159f, + 0x56895a0, + 0x569d5a2, + 0x56bd5a7, + 0x56c95af, + 0x56d15b2, + 0x570d5b4, + 0x57215c3, + 0x57295c8, + 0x57355ca, + 0x573d5cd, + 0x57615cf, + 0x57855d8, + 0x579d5e1, + 0x57a15e7, + 0x57a95e8, + 0x57ad5ea, + 0x58295eb, + 0x582d60a, + 0x583160b, + 0x585560c, + 0x5879615, + 0x589561e, + 0x58a9625, + 0x58bd62a, + 0x58c562f, + 0x58cd631, + 0x58e1633, + 0x58f1638, + 0x58f563c, + 0x591163d, + 0x61a1644, + 0x61d9868, + 0x6205876, + 0x6221881, + 0x6241888, + 0x6261890, + 0x62a5898, + 0x62ad8a9, + 0x262b18ab, + 0x262b58ac, + 0x62bd8ad, + 0x64658af, + 0x26469919, + 0x2647991a, + 0x2648191e, + 0x2648d920, + 0x6491923, + 0x6495924, + 0x64bd925, + 0x64e592f, + 0x64e9939, + 0x652193a, + 0x6541948, + 0x7099950, + 0x709dc26, + 0x70a1c27, + 0x270a5c28, + 0x70a9c29, + 0x270adc2a, + 0x70b1c2b, + 0x270bdc2c, + 0x70c1c2f, + 0x70c5c30, + 0x270c9c31, + 0x70cdc32, + 0x270d5c33, + 0x70d9c35, + 0x70ddc36, + 0x270edc37, + 0x70f1c3b, + 0x70f5c3c, + 0x70f9c3d, + 0x70fdc3e, + 0x27101c3f, + 0x7105c40, + 0x7109c41, + 0x710dc42, + 0x7111c43, + 0x27119c44, + 0x711dc46, + 0x7121c47, + 0x7125c48, + 0x27129c49, + 0x712dc4a, + 0x27135c4b, + 0x27139c4d, + 0x7155c4e, + 0x7165c55, + 0x71a9c59, + 0x71adc6a, + 0x71d1c6b, + 0x71d5c74, + 0x71d9c75, + 0x7381c76, + 0x27385ce0, + 0x2738dce1, + 0x27391ce3, + 0x27395ce4, + 0x739dce5, + 0x7479ce7, + 0x27485d1e, + 0x27489d21, + 0x2748dd22, + 0x27491d23, + 0x7495d24, + 0x74c1d25, + 0x74c5d30, + 0x74e9d31, + 0x74f5d3a, + 0x7515d3d, + 0x7519d45, + 0x7551d46, + 0x77e9d54, + 0x78a5dfa, + 0x78a9e29, + 0x78bde2a, + 0x78f1e2f, + 0x7929e3c, + 0x2792de4a, + 0x7949e4b, + 0x7971e52, + 0x7975e5c, + 0x7999e5d, + 0x79b5e66, + 0x79dde6d, + 0x79ede77, + 0x79f1e7b, + 0x79f5e7c, + 0x7a2de7d, + 0x7a39e8b, + 0x7a5de8e, + 0x7adde97, + 0x27ae1eb7, + 0x7af1eb8, + 0x7af9ebc, + 0x7b1debe, + 0x7b3dec7, + 0x7b51ecf, + 0x7b65ed4, + 0x7b69ed9, + 0x7b89eda, + 0x7c2dee2, + 0x7c49f0b, + 0x7c6df12, + 0x7c71f1b, + 0x7c79f1c, + 0x7c89f1e, + 0x7c91f22, + 0x7ca5f24, + 0x7cc5f29, + 0x7cd1f31, + 0x7cddf34, + 0x7d15f37, + 0x7de9f45, + 0x7dedf7a, + 0x7e01f7b, + 0x7e09f80, + 0x7e21f82, + 0x7e25f88, + 0x7e31f89, + 0x7e35f8c, + 0x7e51f8d, + 0x7e91f94, + 0x7e95fa4, + 0x7eb5fa5, + 0x7f05fad, + 0x7f21fc1, + 0x7f29fc8, + 0x7f7dfca, + 0x7f81fdf, + 0x7f85fe0, + 0x7f89fe1, + 0x7fcdfe2, + 0x7fddff3, + 0x801dff7, + 0x8022007, + 0x8052008, + 0x819a014, + 0x81c2066, + 0x81f2070, + 0x820e07c, + 0x8216083, + 0x8222085, + 0x8336088, + 0x83420cd, + 0x834e0d0, + 0x835a0d3, + 0x83660d6, + 0x83720d9, + 0x837e0dc, + 0x838a0df, + 0x83960e2, + 0x83a20e5, + 0x83ae0e8, + 0x83ba0eb, + 0x83c60ee, + 0x83d20f1, + 0x83da0f4, + 0x83e60f6, + 0x83f20f9, + 0x83fe0fc, + 0x840a0ff, + 0x8416102, + 0x8422105, + 0x842e108, + 0x843a10b, + 0x844610e, + 0x8452111, + 0x845e114, + 0x848a117, + 0x8496122, + 0x84a2125, + 0x84ae128, + 0x84ba12b, + 0x84c612e, + 0x84ce131, + 0x84da133, + 0x84e6136, + 0x84f2139, + 0x84fe13c, + 0x850a13f, + 0x8516142, + 0x8522145, + 0x852e148, + 0x853a14b, + 0x854614e, + 0x8552151, + 0x855e154, + 0x856a157, + 0x857215a, + 0x857e15c, + 0x858a15f, + 0x8596162, + 0x85a2165, + 0x85ae168, + 0x85ba16b, + 0x85c616e, + 0x85d2171, + 0x85d6174, + 0x85e2175, + 0x85fe178, + 0x860217f, + 0x8612180, + 0x862e184, + 0x867218b, + 0x867619c, + 0x868a19d, + 0x86be1a2, + 0x86ce1af, + 0x86f21b3, + 0x870a1bc, + 0x87221c2, + 0x873a1c8, + 0x874a1ce, + 0x2878e1d2, + 0x87921e3, + 0x87be1e4, + 0x87c61ef, + 0x87da1f1, +} + +// max children 524 (capacity 1023) +// max text offset 29871 (capacity 32767) +// max text length 36 (capacity 63) +// max hi 8694 (capacity 16383) +// max lo 8689 (capacity 16383) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/LICENSE b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..6a66aea5eafe0ca6a688840c47219556c552488e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/PATENTS b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/PATENTS new file mode 100644 index 0000000000000000000000000000000000000000..733099041f84fa1e58611ab2e11af51c1f26d1d2 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/PATENTS @@ -0,0 +1,22 @@ +Additional IP Rights Grant (Patents) + +"This implementation" means the copyrightable works distributed by +Google as part of the Go project. + +Google hereby grants to You a perpetual, worldwide, non-exclusive, +no-charge, royalty-free, irrevocable (except as stated in this section) +patent license to make, have made, use, offer to sell, sell, import, +transfer and otherwise run, modify and propagate the contents of this +implementation of Go, where such license applies only to those patent +claims, both currently owned or controlled by Google and acquired in +the future, licensable by Google that are necessarily infringed by this +implementation of Go. This grant does not include claims that would be +infringed only as a consequence of further modification of this +implementation. If you or your agent or exclusive licensee institute or +order or agree to the institution of patent litigation against any +entity (including a cross-claim or counterclaim in a lawsuit) alleging +that this implementation of Go or any code incorporated within this +implementation of Go constitutes direct or contributory patent +infringement, or inducement of patent infringement, then any patent +rights granted to you under this License for this implementation of Go +shall terminate as of the date such litigation is filed. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm.s b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm.s new file mode 100644 index 0000000000000000000000000000000000000000..8ed2fdb94b1d83dd88ea050954f0d7a57ebc6acd --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm.s @@ -0,0 +1,10 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +TEXT ·use(SB),NOSPLIT,$0 + RET diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_darwin_386.s b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_darwin_386.s new file mode 100644 index 0000000000000000000000000000000000000000..8a7278319e31908d0b74d70e4e5165345dc7529f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_darwin_386.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for 386, Darwin +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_darwin_amd64.s b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_darwin_amd64.s new file mode 100644 index 0000000000000000000000000000000000000000..6321421f27263574265e99878a6072f1e3b68ede --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_darwin_amd64.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for AMD64, Darwin +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_darwin_arm.s b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_darwin_arm.s new file mode 100644 index 0000000000000000000000000000000000000000..333242d50619789c5d9c27de6551cc69096d4a4f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_darwin_arm.s @@ -0,0 +1,30 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo +// +build arm,darwin + +#include "textflag.h" + +// +// System call support for ARM, Darwin +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + B syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + B syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + B syscall·RawSyscall6(SB) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_darwin_arm64.s b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_darwin_arm64.s new file mode 100644 index 0000000000000000000000000000000000000000..97e0174371868cb3e31b0bed3c2d63e04fe3ea9b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_darwin_arm64.s @@ -0,0 +1,30 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo +// +build arm64,darwin + +#include "textflag.h" + +// +// System call support for AMD64, Darwin +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + B syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + B syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + B syscall·RawSyscall6(SB) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s new file mode 100644 index 0000000000000000000000000000000000000000..d5ed6726cc14c7dc14fc7b87a49d1905b675e7b4 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for AMD64, DragonFly +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-64 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-88 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-112 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-64 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-88 + JMP syscall·RawSyscall6(SB) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_freebsd_386.s b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_freebsd_386.s new file mode 100644 index 0000000000000000000000000000000000000000..c9a0a2601562f55587d357b5b4a63919409443d5 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_freebsd_386.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for 386, FreeBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s new file mode 100644 index 0000000000000000000000000000000000000000..35172477c8697ca290a4663765c79c06ac38761d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for AMD64, FreeBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_freebsd_arm.s b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_freebsd_arm.s new file mode 100644 index 0000000000000000000000000000000000000000..9227c875bfebb539b62c37514f4d22353c32122a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_freebsd_arm.s @@ -0,0 +1,29 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for ARM, FreeBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + B syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + B syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + B syscall·RawSyscall6(SB) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_linux_386.s b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_linux_386.s new file mode 100644 index 0000000000000000000000000000000000000000..4db2909323fb4727c18ae8ec58d1673c35c8ffe5 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_linux_386.s @@ -0,0 +1,35 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System calls for 386, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) + +TEXT ·socketcall(SB),NOSPLIT,$0-36 + JMP syscall·socketcall(SB) + +TEXT ·rawsocketcall(SB),NOSPLIT,$0-36 + JMP syscall·rawsocketcall(SB) + +TEXT ·seek(SB),NOSPLIT,$0-28 + JMP syscall·seek(SB) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_linux_amd64.s b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_linux_amd64.s new file mode 100644 index 0000000000000000000000000000000000000000..44e25c62f92e8852982f94dc0bf1c7a1ae47b2ab --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_linux_amd64.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System calls for AMD64, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) + +TEXT ·gettimeofday(SB),NOSPLIT,$0-16 + JMP syscall·gettimeofday(SB) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_linux_arm.s b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_linux_arm.s new file mode 100644 index 0000000000000000000000000000000000000000..cf0b57465822d141765306422924858e15d8835c --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_linux_arm.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System calls for arm, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + B syscall·Syscall6(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + B syscall·RawSyscall6(SB) + +TEXT ·seek(SB),NOSPLIT,$0-32 + B syscall·seek(SB) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_linux_arm64.s b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_linux_arm64.s new file mode 100644 index 0000000000000000000000000000000000000000..4be9bfedeaf3e867b0f3ab08f7e067226c16b9d4 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_linux_arm64.s @@ -0,0 +1,24 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux +// +build arm64 +// +build !gccgo + +#include "textflag.h" + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + B syscall·Syscall6(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + B syscall·RawSyscall6(SB) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s new file mode 100644 index 0000000000000000000000000000000000000000..724e580c4ea7787476bbd2bf5cc9105808ac1c3d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_linux_mips64x.s @@ -0,0 +1,28 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux +// +build mips64 mips64le +// +build !gccgo + +#include "textflag.h" + +// +// System calls for mips64, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s new file mode 100644 index 0000000000000000000000000000000000000000..8d231feb4b93cfd82522b819e42ec6fa542f8844 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s @@ -0,0 +1,28 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux +// +build ppc64 ppc64le +// +build !gccgo + +#include "textflag.h" + +// +// System calls for ppc64, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + BR syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + BR syscall·Syscall6(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + BR syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + BR syscall·RawSyscall6(SB) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_linux_s390x.s b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_linux_s390x.s new file mode 100644 index 0000000000000000000000000000000000000000..11889859fb050f12da7257727bde399125b5847a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_linux_s390x.s @@ -0,0 +1,28 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build s390x +// +build linux +// +build !gccgo + +#include "textflag.h" + +// +// System calls for s390x, Linux +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + BR syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + BR syscall·Syscall6(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + BR syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + BR syscall·RawSyscall6(SB) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_netbsd_386.s b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_netbsd_386.s new file mode 100644 index 0000000000000000000000000000000000000000..48bdcd7632affa9089e993bf7eabf76f8b8c6a4e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_netbsd_386.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for 386, NetBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_netbsd_amd64.s b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_netbsd_amd64.s new file mode 100644 index 0000000000000000000000000000000000000000..2ede05c72f09d03f2211e051afd919346d941d3b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_netbsd_amd64.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for AMD64, NetBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_netbsd_arm.s b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_netbsd_arm.s new file mode 100644 index 0000000000000000000000000000000000000000..e8928571c450e909516f5e2aa6bfca68e24a51ca --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_netbsd_arm.s @@ -0,0 +1,29 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for ARM, NetBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + B syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + B syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + B syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + B syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + B syscall·RawSyscall6(SB) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_openbsd_386.s b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_openbsd_386.s new file mode 100644 index 0000000000000000000000000000000000000000..00576f3c835590d7d4ab3ae36ba4b703242296c4 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_openbsd_386.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for 386, OpenBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-28 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-40 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-52 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-28 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 + JMP syscall·RawSyscall6(SB) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s new file mode 100644 index 0000000000000000000000000000000000000000..790ef77f86ef7255cd04a6e1b0b93e0553fc435f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s @@ -0,0 +1,29 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System call support for AMD64, OpenBSD +// + +// Just jump to package syscall's implementation for all these functions. +// The runtime may know about them. + +TEXT ·Syscall(SB),NOSPLIT,$0-56 + JMP syscall·Syscall(SB) + +TEXT ·Syscall6(SB),NOSPLIT,$0-80 + JMP syscall·Syscall6(SB) + +TEXT ·Syscall9(SB),NOSPLIT,$0-104 + JMP syscall·Syscall9(SB) + +TEXT ·RawSyscall(SB),NOSPLIT,$0-56 + JMP syscall·RawSyscall(SB) + +TEXT ·RawSyscall6(SB),NOSPLIT,$0-80 + JMP syscall·RawSyscall6(SB) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s new file mode 100644 index 0000000000000000000000000000000000000000..43ed17a05f36f6bc1a186eb86ece5d2e67925771 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/asm_solaris_amd64.s @@ -0,0 +1,17 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build !gccgo + +#include "textflag.h" + +// +// System calls for amd64, Solaris are implemented in runtime/syscall_solaris.go +// + +TEXT ·sysvicall6(SB),NOSPLIT,$0-64 + JMP syscall·sysvicall6(SB) + +TEXT ·rawSysvicall6(SB),NOSPLIT,$0-64 + JMP syscall·rawSysvicall6(SB) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/bluetooth_linux.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/bluetooth_linux.go new file mode 100644 index 0000000000000000000000000000000000000000..6e322969706fff3a0b03743b103a511ff03ac8d0 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/bluetooth_linux.go @@ -0,0 +1,35 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Bluetooth sockets and messages + +package unix + +// Bluetooth Protocols +const ( + BTPROTO_L2CAP = 0 + BTPROTO_HCI = 1 + BTPROTO_SCO = 2 + BTPROTO_RFCOMM = 3 + BTPROTO_BNEP = 4 + BTPROTO_CMTP = 5 + BTPROTO_HIDP = 6 + BTPROTO_AVDTP = 7 +) + +const ( + HCI_CHANNEL_RAW = 0 + HCI_CHANNEL_USER = 1 + HCI_CHANNEL_MONITOR = 2 + HCI_CHANNEL_CONTROL = 3 +) + +// Socketoption Level +const ( + SOL_BLUETOOTH = 0x112 + SOL_HCI = 0x0 + SOL_L2CAP = 0x6 + SOL_RFCOMM = 0x12 + SOL_SCO = 0x11 +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/constants.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/constants.go new file mode 100644 index 0000000000000000000000000000000000000000..a96f0ebc26446cc91688e8608663d40077efee82 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/constants.go @@ -0,0 +1,13 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix + +const ( + R_OK = 0x4 + W_OK = 0x2 + X_OK = 0x1 +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/env_unix.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/env_unix.go new file mode 100644 index 0000000000000000000000000000000000000000..45e281a047dc06b8d0c5cf87012592193e644b14 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/env_unix.go @@ -0,0 +1,27 @@ +// Copyright 2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +// Unix environment variables. + +package unix + +import "syscall" + +func Getenv(key string) (value string, found bool) { + return syscall.Getenv(key) +} + +func Setenv(key, value string) error { + return syscall.Setenv(key, value) +} + +func Clearenv() { + syscall.Clearenv() +} + +func Environ() []string { + return syscall.Environ() +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/env_unset.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/env_unset.go new file mode 100644 index 0000000000000000000000000000000000000000..9222262559b80b1135a973d518dcef06f1a59113 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/env_unset.go @@ -0,0 +1,14 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build go1.4 + +package unix + +import "syscall" + +func Unsetenv(key string) error { + // This was added in Go 1.4. + return syscall.Unsetenv(key) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/flock.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/flock.go new file mode 100644 index 0000000000000000000000000000000000000000..ce67a59528a1c83d731af49d8efaa85b88056116 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/flock.go @@ -0,0 +1,24 @@ +// +build linux darwin freebsd openbsd netbsd dragonfly + +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux netbsd openbsd + +package unix + +import "unsafe" + +// fcntl64Syscall is usually SYS_FCNTL, but is overridden on 32-bit Linux +// systems by flock_linux_32bit.go to be SYS_FCNTL64. +var fcntl64Syscall uintptr = SYS_FCNTL + +// FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command. +func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error { + _, _, errno := Syscall(fcntl64Syscall, fd, uintptr(cmd), uintptr(unsafe.Pointer(lk))) + if errno == 0 { + return nil + } + return errno +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/flock_linux_32bit.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/flock_linux_32bit.go new file mode 100644 index 0000000000000000000000000000000000000000..362831c3f70c8fc99207a3135f276b3ca06f64cd --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/flock_linux_32bit.go @@ -0,0 +1,13 @@ +// +build linux,386 linux,arm + +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package unix + +func init() { + // On 32-bit Linux systems, the fcntl syscall that matches Go's + // Flock_t type is SYS_FCNTL64, not SYS_FCNTL. + fcntl64Syscall = SYS_FCNTL64 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/gccgo.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/gccgo.go new file mode 100644 index 0000000000000000000000000000000000000000..94c82321247646fa2bf8923de3c58043f34a8786 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/gccgo.go @@ -0,0 +1,46 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build gccgo + +package unix + +import "syscall" + +// We can't use the gc-syntax .s files for gccgo. On the plus side +// much of the functionality can be written directly in Go. + +//extern gccgoRealSyscall +func realSyscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r, errno uintptr) + +func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) { + syscall.Entersyscall() + r, errno := realSyscall(trap, a1, a2, a3, 0, 0, 0, 0, 0, 0) + syscall.Exitsyscall() + return r, 0, syscall.Errno(errno) +} + +func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) { + syscall.Entersyscall() + r, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, 0, 0, 0) + syscall.Exitsyscall() + return r, 0, syscall.Errno(errno) +} + +func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) { + syscall.Entersyscall() + r, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9) + syscall.Exitsyscall() + return r, 0, syscall.Errno(errno) +} + +func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) { + r, errno := realSyscall(trap, a1, a2, a3, 0, 0, 0, 0, 0, 0) + return r, 0, syscall.Errno(errno) +} + +func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) { + r, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, 0, 0, 0) + return r, 0, syscall.Errno(errno) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/gccgo_c.c b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/gccgo_c.c new file mode 100644 index 0000000000000000000000000000000000000000..07f6be0392e2518a7354fb7e0472d01a24c834c7 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/gccgo_c.c @@ -0,0 +1,41 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build gccgo + +#include <errno.h> +#include <stdint.h> +#include <unistd.h> + +#define _STRINGIFY2_(x) #x +#define _STRINGIFY_(x) _STRINGIFY2_(x) +#define GOSYM_PREFIX _STRINGIFY_(__USER_LABEL_PREFIX__) + +// Call syscall from C code because the gccgo support for calling from +// Go to C does not support varargs functions. + +struct ret { + uintptr_t r; + uintptr_t err; +}; + +struct ret +gccgoRealSyscall(uintptr_t trap, uintptr_t a1, uintptr_t a2, uintptr_t a3, uintptr_t a4, uintptr_t a5, uintptr_t a6, uintptr_t a7, uintptr_t a8, uintptr_t a9) +{ + struct ret r; + + errno = 0; + r.r = syscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9); + r.err = errno; + return r; +} + +// Define the use function in C so that it is not inlined. + +extern void use(void *) __asm__ (GOSYM_PREFIX GOPKGPATH ".use") __attribute__((noinline)); + +void +use(void *p __attribute__ ((unused))) +{ +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..bffe1a77db5716f5dcd691379552dbe4a9b665aa --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go @@ -0,0 +1,20 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build gccgo,linux,amd64 + +package unix + +import "syscall" + +//extern gettimeofday +func realGettimeofday(*Timeval, *byte) int32 + +func gettimeofday(tv *Timeval) (err syscall.Errno) { + r := realGettimeofday(tv, nil) + if r < 0 { + return syscall.GetErrno() + } + return 0 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mkall.sh b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mkall.sh new file mode 100644 index 0000000000000000000000000000000000000000..3e224c57e2ab4660f844b94523fec24a6283f944 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mkall.sh @@ -0,0 +1,285 @@ +#!/usr/bin/env bash +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +# The unix package provides access to the raw system call +# interface of the underlying operating system. Porting Go to +# a new architecture/operating system combination requires +# some manual effort, though there are tools that automate +# much of the process. The auto-generated files have names +# beginning with z. +# +# This script runs or (given -n) prints suggested commands to generate z files +# for the current system. Running those commands is not automatic. +# This script is documentation more than anything else. +# +# * asm_${GOOS}_${GOARCH}.s +# +# This hand-written assembly file implements system call dispatch. +# There are three entry points: +# +# func Syscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr); +# func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr); +# func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr); +# +# The first and second are the standard ones; they differ only in +# how many arguments can be passed to the kernel. +# The third is for low-level use by the ForkExec wrapper; +# unlike the first two, it does not call into the scheduler to +# let it know that a system call is running. +# +# * syscall_${GOOS}.go +# +# This hand-written Go file implements system calls that need +# special handling and lists "//sys" comments giving prototypes +# for ones that can be auto-generated. Mksyscall reads those +# comments to generate the stubs. +# +# * syscall_${GOOS}_${GOARCH}.go +# +# Same as syscall_${GOOS}.go except that it contains code specific +# to ${GOOS} on one particular architecture. +# +# * types_${GOOS}.c +# +# This hand-written C file includes standard C headers and then +# creates typedef or enum names beginning with a dollar sign +# (use of $ in variable names is a gcc extension). The hardest +# part about preparing this file is figuring out which headers to +# include and which symbols need to be #defined to get the +# actual data structures that pass through to the kernel system calls. +# Some C libraries present alternate versions for binary compatibility +# and translate them on the way in and out of system calls, but +# there is almost always a #define that can get the real ones. +# See types_darwin.c and types_linux.c for examples. +# +# * zerror_${GOOS}_${GOARCH}.go +# +# This machine-generated file defines the system's error numbers, +# error strings, and signal numbers. The generator is "mkerrors.sh". +# Usually no arguments are needed, but mkerrors.sh will pass its +# arguments on to godefs. +# +# * zsyscall_${GOOS}_${GOARCH}.go +# +# Generated by mksyscall.pl; see syscall_${GOOS}.go above. +# +# * zsysnum_${GOOS}_${GOARCH}.go +# +# Generated by mksysnum_${GOOS}. +# +# * ztypes_${GOOS}_${GOARCH}.go +# +# Generated by godefs; see types_${GOOS}.c above. + +GOOSARCH="${GOOS}_${GOARCH}" + +# defaults +mksyscall="./mksyscall.pl" +mkerrors="./mkerrors.sh" +zerrors="zerrors_$GOOSARCH.go" +mksysctl="" +zsysctl="zsysctl_$GOOSARCH.go" +mksysnum= +mktypes= +run="sh" + +case "$1" in +-syscalls) + for i in zsyscall*go + do + sed 1q $i | sed 's;^// ;;' | sh > _$i && gofmt < _$i > $i + rm _$i + done + exit 0 + ;; +-n) + run="cat" + shift +esac + +case "$#" in +0) + ;; +*) + echo 'usage: mkall.sh [-n]' 1>&2 + exit 2 +esac + +GOOSARCH_in=syscall_$GOOSARCH.go +case "$GOOSARCH" in +_* | *_ | _) + echo 'undefined $GOOS_$GOARCH:' "$GOOSARCH" 1>&2 + exit 1 + ;; +darwin_386) + mkerrors="$mkerrors -m32" + mksyscall="./mksyscall.pl -l32" + mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk macosx)/usr/include/sys/syscall.h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +darwin_amd64) + mkerrors="$mkerrors -m64" + mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk macosx)/usr/include/sys/syscall.h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +darwin_arm) + mkerrors="$mkerrors" + mksysnum="./mksysnum_darwin.pl /usr/include/sys/syscall.h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +darwin_arm64) + mkerrors="$mkerrors -m64" + mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk iphoneos)/usr/include/sys/syscall.h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +dragonfly_386) + mkerrors="$mkerrors -m32" + mksyscall="./mksyscall.pl -l32 -dragonfly" + mksysnum="curl -s 'http://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/sys/kern/syscalls.master' | ./mksysnum_dragonfly.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +dragonfly_amd64) + mkerrors="$mkerrors -m64" + mksyscall="./mksyscall.pl -dragonfly" + mksysnum="curl -s 'http://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/sys/kern/syscalls.master' | ./mksysnum_dragonfly.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +freebsd_386) + mkerrors="$mkerrors -m32" + mksyscall="./mksyscall.pl -l32" + mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +freebsd_amd64) + mkerrors="$mkerrors -m64" + mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +freebsd_arm) + mkerrors="$mkerrors" + mksyscall="./mksyscall.pl -l32 -arm" + mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl" + # Let the type of C char be signed for making the bare syscall + # API consistent across over platforms. + mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" + ;; +linux_386) + mkerrors="$mkerrors -m32" + mksyscall="./mksyscall.pl -l32" + mksysnum="./mksysnum_linux.pl /usr/include/asm/unistd_32.h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +linux_amd64) + unistd_h=$(ls -1 /usr/include/asm/unistd_64.h /usr/include/x86_64-linux-gnu/asm/unistd_64.h 2>/dev/null | head -1) + if [ "$unistd_h" = "" ]; then + echo >&2 cannot find unistd_64.h + exit 1 + fi + mkerrors="$mkerrors -m64" + mksysnum="./mksysnum_linux.pl $unistd_h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +linux_arm) + mkerrors="$mkerrors" + mksyscall="./mksyscall.pl -l32 -arm" + mksysnum="curl -s 'http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/plain/arch/arm/include/uapi/asm/unistd.h' | ./mksysnum_linux.pl -" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +linux_arm64) + unistd_h=$(ls -1 /usr/include/asm/unistd.h /usr/include/asm-generic/unistd.h 2>/dev/null | head -1) + if [ "$unistd_h" = "" ]; then + echo >&2 cannot find unistd_64.h + exit 1 + fi + mksysnum="./mksysnum_linux.pl $unistd_h" + # Let the type of C char be signed for making the bare syscall + # API consistent across over platforms. + mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" + ;; +linux_ppc64) + GOOSARCH_in=syscall_linux_ppc64x.go + unistd_h=/usr/include/asm/unistd.h + mkerrors="$mkerrors -m64" + mksysnum="./mksysnum_linux.pl $unistd_h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +linux_ppc64le) + GOOSARCH_in=syscall_linux_ppc64x.go + unistd_h=/usr/include/powerpc64le-linux-gnu/asm/unistd.h + mkerrors="$mkerrors -m64" + mksysnum="./mksysnum_linux.pl $unistd_h" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +linux_s390x) + GOOSARCH_in=syscall_linux_s390x.go + unistd_h=/usr/include/asm/unistd.h + mkerrors="$mkerrors -m64" + mksysnum="./mksysnum_linux.pl $unistd_h" + # Let the type of C char be signed to make the bare sys + # API more consistent between platforms. + # This is a deliberate departure from the way the syscall + # package generates its version of the types file. + mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char" + ;; +netbsd_386) + mkerrors="$mkerrors -m32" + mksyscall="./mksyscall.pl -l32 -netbsd" + mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +netbsd_amd64) + mkerrors="$mkerrors -m64" + mksyscall="./mksyscall.pl -netbsd" + mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +openbsd_386) + mkerrors="$mkerrors -m32" + mksyscall="./mksyscall.pl -l32 -openbsd" + mksysctl="./mksysctl_openbsd.pl" + zsysctl="zsysctl_openbsd.go" + mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +openbsd_amd64) + mkerrors="$mkerrors -m64" + mksyscall="./mksyscall.pl -openbsd" + mksysctl="./mksysctl_openbsd.pl" + zsysctl="zsysctl_openbsd.go" + mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl" + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +solaris_amd64) + mksyscall="./mksyscall_solaris.pl" + mkerrors="$mkerrors -m64" + mksysnum= + mktypes="GOARCH=$GOARCH go tool cgo -godefs" + ;; +*) + echo 'unrecognized $GOOS_$GOARCH: ' "$GOOSARCH" 1>&2 + exit 1 + ;; +esac + +( + if [ -n "$mkerrors" ]; then echo "$mkerrors |gofmt >$zerrors"; fi + case "$GOOS" in + *) + syscall_goos="syscall_$GOOS.go" + case "$GOOS" in + darwin | dragonfly | freebsd | netbsd | openbsd) + syscall_goos="syscall_bsd.go $syscall_goos" + ;; + esac + if [ -n "$mksyscall" ]; then echo "$mksyscall $syscall_goos $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.go"; fi + ;; + esac + if [ -n "$mksysctl" ]; then echo "$mksysctl |gofmt >$zsysctl"; fi + if [ -n "$mksysnum" ]; then echo "$mksysnum |gofmt >zsysnum_$GOOSARCH.go"; fi + if [ -n "$mktypes" ]; then + echo "echo // +build $GOARCH,$GOOS > ztypes_$GOOSARCH.go"; + echo "$mktypes types_$GOOS.go | go run mkpost.go >>ztypes_$GOOSARCH.go"; + fi +) | $run diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mkerrors.sh b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mkerrors.sh new file mode 100644 index 0000000000000000000000000000000000000000..c40d788c4ab3f5b6327bb21e11a73c1a57a64a19 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -0,0 +1,476 @@ +#!/usr/bin/env bash +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +# Generate Go code listing errors and other #defined constant +# values (ENAMETOOLONG etc.), by asking the preprocessor +# about the definitions. + +unset LANG +export LC_ALL=C +export LC_CTYPE=C + +if test -z "$GOARCH" -o -z "$GOOS"; then + echo 1>&2 "GOARCH or GOOS not defined in environment" + exit 1 +fi + +CC=${CC:-cc} + +if [[ "$GOOS" -eq "solaris" ]]; then + # Assumes GNU versions of utilities in PATH. + export PATH=/usr/gnu/bin:$PATH +fi + +uname=$(uname) + +includes_Darwin=' +#define _DARWIN_C_SOURCE +#define KERNEL +#define _DARWIN_USE_64_BIT_INODE +#include <sys/types.h> +#include <sys/event.h> +#include <sys/ptrace.h> +#include <sys/socket.h> +#include <sys/sockio.h> +#include <sys/sysctl.h> +#include <sys/mman.h> +#include <sys/wait.h> +#include <net/bpf.h> +#include <net/if.h> +#include <net/if_types.h> +#include <net/route.h> +#include <netinet/in.h> +#include <netinet/ip.h> +#include <termios.h> +' + +includes_DragonFly=' +#include <sys/types.h> +#include <sys/event.h> +#include <sys/socket.h> +#include <sys/sockio.h> +#include <sys/sysctl.h> +#include <sys/mman.h> +#include <sys/wait.h> +#include <sys/ioctl.h> +#include <net/bpf.h> +#include <net/if.h> +#include <net/if_types.h> +#include <net/route.h> +#include <netinet/in.h> +#include <termios.h> +#include <netinet/ip.h> +#include <net/ip_mroute/ip_mroute.h> +' + +includes_FreeBSD=' +#include <sys/param.h> +#include <sys/types.h> +#include <sys/event.h> +#include <sys/socket.h> +#include <sys/sockio.h> +#include <sys/sysctl.h> +#include <sys/mman.h> +#include <sys/wait.h> +#include <sys/ioctl.h> +#include <net/bpf.h> +#include <net/if.h> +#include <net/if_types.h> +#include <net/route.h> +#include <netinet/in.h> +#include <termios.h> +#include <netinet/ip.h> +#include <netinet/ip_mroute.h> +#include <sys/extattr.h> + +#if __FreeBSD__ >= 10 +#define IFT_CARP 0xf8 // IFT_CARP is deprecated in FreeBSD 10 +#undef SIOCAIFADDR +#define SIOCAIFADDR _IOW(105, 26, struct oifaliasreq) // ifaliasreq contains if_data +#undef SIOCSIFPHYADDR +#define SIOCSIFPHYADDR _IOW(105, 70, struct oifaliasreq) // ifaliasreq contains if_data +#endif +' + +includes_Linux=' +#define _LARGEFILE_SOURCE +#define _LARGEFILE64_SOURCE +#ifndef __LP64__ +#define _FILE_OFFSET_BITS 64 +#endif +#define _GNU_SOURCE + +#include <bits/sockaddr.h> +#include <sys/epoll.h> +#include <sys/inotify.h> +#include <sys/ioctl.h> +#include <sys/mman.h> +#include <sys/mount.h> +#include <sys/prctl.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <sys/time.h> +#include <sys/socket.h> +#include <linux/if.h> +#include <linux/if_arp.h> +#include <linux/if_ether.h> +#include <linux/if_tun.h> +#include <linux/if_packet.h> +#include <linux/if_addr.h> +#include <linux/filter.h> +#include <linux/netlink.h> +#include <linux/reboot.h> +#include <linux/rtnetlink.h> +#include <linux/ptrace.h> +#include <linux/sched.h> +#include <linux/wait.h> +#include <linux/icmpv6.h> +#include <net/route.h> +#include <asm/termbits.h> + +#ifndef MSG_FASTOPEN +#define MSG_FASTOPEN 0x20000000 +#endif + +#ifndef PTRACE_GETREGS +#define PTRACE_GETREGS 0xc +#endif + +#ifndef PTRACE_SETREGS +#define PTRACE_SETREGS 0xd +#endif +' + +includes_NetBSD=' +#include <sys/types.h> +#include <sys/param.h> +#include <sys/event.h> +#include <sys/mman.h> +#include <sys/socket.h> +#include <sys/sockio.h> +#include <sys/sysctl.h> +#include <sys/termios.h> +#include <sys/ttycom.h> +#include <sys/wait.h> +#include <net/bpf.h> +#include <net/if.h> +#include <net/if_types.h> +#include <net/route.h> +#include <netinet/in.h> +#include <netinet/in_systm.h> +#include <netinet/ip.h> +#include <netinet/ip_mroute.h> +#include <netinet/if_ether.h> + +// Needed since <sys/param.h> refers to it... +#define schedppq 1 +' + +includes_OpenBSD=' +#include <sys/types.h> +#include <sys/param.h> +#include <sys/event.h> +#include <sys/mman.h> +#include <sys/socket.h> +#include <sys/sockio.h> +#include <sys/sysctl.h> +#include <sys/termios.h> +#include <sys/ttycom.h> +#include <sys/wait.h> +#include <net/bpf.h> +#include <net/if.h> +#include <net/if_types.h> +#include <net/if_var.h> +#include <net/route.h> +#include <netinet/in.h> +#include <netinet/in_systm.h> +#include <netinet/ip.h> +#include <netinet/ip_mroute.h> +#include <netinet/if_ether.h> +#include <net/if_bridge.h> + +// We keep some constants not supported in OpenBSD 5.5 and beyond for +// the promise of compatibility. +#define EMUL_ENABLED 0x1 +#define EMUL_NATIVE 0x2 +#define IPV6_FAITH 0x1d +#define IPV6_OPTIONS 0x1 +#define IPV6_RTHDR_STRICT 0x1 +#define IPV6_SOCKOPT_RESERVED1 0x3 +#define SIOCGIFGENERIC 0xc020693a +#define SIOCSIFGENERIC 0x80206939 +#define WALTSIG 0x4 +' + +includes_SunOS=' +#include <limits.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/sockio.h> +#include <sys/mman.h> +#include <sys/wait.h> +#include <sys/ioctl.h> +#include <net/bpf.h> +#include <net/if.h> +#include <net/if_arp.h> +#include <net/if_types.h> +#include <net/route.h> +#include <netinet/in.h> +#include <termios.h> +#include <netinet/ip.h> +#include <netinet/ip_mroute.h> +' + + +includes=' +#include <sys/types.h> +#include <sys/file.h> +#include <fcntl.h> +#include <dirent.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <netinet/ip.h> +#include <netinet/ip6.h> +#include <netinet/tcp.h> +#include <errno.h> +#include <sys/signal.h> +#include <signal.h> +#include <sys/resource.h> +#include <time.h> +' +ccflags="$@" + +# Write go tool cgo -godefs input. +( + echo package unix + echo + echo '/*' + indirect="includes_$(uname)" + echo "${!indirect} $includes" + echo '*/' + echo 'import "C"' + echo 'import "syscall"' + echo + echo 'const (' + + # The gcc command line prints all the #defines + # it encounters while processing the input + echo "${!indirect} $includes" | $CC -x c - -E -dM $ccflags | + awk ' + $1 != "#define" || $2 ~ /\(/ || $3 == "" {next} + + $2 ~ /^E([ABCD]X|[BIS]P|[SD]I|S|FL)$/ {next} # 386 registers + $2 ~ /^(SIGEV_|SIGSTKSZ|SIGRT(MIN|MAX))/ {next} + $2 ~ /^(SCM_SRCRT)$/ {next} + $2 ~ /^(MAP_FAILED)$/ {next} + $2 ~ /^ELF_.*$/ {next}# <asm/elf.h> contains ELF_ARCH, etc. + + $2 ~ /^EXTATTR_NAMESPACE_NAMES/ || + $2 ~ /^EXTATTR_NAMESPACE_[A-Z]+_STRING/ {next} + + $2 !~ /^ETH_/ && + $2 !~ /^EPROC_/ && + $2 !~ /^EQUIV_/ && + $2 !~ /^EXPR_/ && + $2 ~ /^E[A-Z0-9_]+$/ || + $2 ~ /^B[0-9_]+$/ || + $2 == "BOTHER" || + $2 ~ /^CI?BAUD(EX)?$/ || + $2 == "IBSHIFT" || + $2 ~ /^V[A-Z0-9]+$/ || + $2 ~ /^CS[A-Z0-9]/ || + $2 ~ /^I(SIG|CANON|CRNL|UCLC|EXTEN|MAXBEL|STRIP|UTF8)$/ || + $2 ~ /^IGN/ || + $2 ~ /^IX(ON|ANY|OFF)$/ || + $2 ~ /^IN(LCR|PCK)$/ || + $2 ~ /(^FLU?SH)|(FLU?SH$)/ || + $2 ~ /^C(LOCAL|READ|MSPAR|RTSCTS)$/ || + $2 == "BRKINT" || + $2 == "HUPCL" || + $2 == "PENDIN" || + $2 == "TOSTOP" || + $2 == "XCASE" || + $2 == "ALTWERASE" || + $2 == "NOKERNINFO" || + $2 ~ /^PAR/ || + $2 ~ /^SIG[^_]/ || + $2 ~ /^O[CNPFPL][A-Z]+[^_][A-Z]+$/ || + $2 ~ /^(NL|CR|TAB|BS|VT|FF)DLY$/ || + $2 ~ /^(NL|CR|TAB|BS|VT|FF)[0-9]$/ || + $2 ~ /^O?XTABS$/ || + $2 ~ /^TC[IO](ON|OFF)$/ || + $2 ~ /^IN_/ || + $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || + $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|EVFILT|NOTE|EV|SHUT|PROT|MAP|PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ || + $2 == "ICMPV6_FILTER" || + $2 == "SOMAXCONN" || + $2 == "NAME_MAX" || + $2 == "IFNAMSIZ" || + $2 ~ /^CTL_(MAXNAME|NET|QUERY)$/ || + $2 ~ /^SYSCTL_VERS/ || + $2 ~ /^(MS|MNT)_/ || + $2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ || + $2 ~ /^(O|F|FD|NAME|S|PTRACE|PT)_/ || + $2 ~ /^LINUX_REBOOT_CMD_/ || + $2 ~ /^LINUX_REBOOT_MAGIC[12]$/ || + $2 !~ "NLA_TYPE_MASK" && + $2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P)_/ || + $2 ~ /^SIOC/ || + $2 ~ /^TIOC/ || + $2 ~ /^TCGET/ || + $2 ~ /^TCSET/ || + $2 ~ /^TC(FLSH|SBRKP?|XONC)$/ || + $2 !~ "RTF_BITS" && + $2 ~ /^(IFF|IFT|NET_RT|RTM|RTF|RTV|RTA|RTAX)_/ || + $2 ~ /^BIOC/ || + $2 ~ /^RUSAGE_(SELF|CHILDREN|THREAD)/ || + $2 ~ /^RLIMIT_(AS|CORE|CPU|DATA|FSIZE|NOFILE|STACK)|RLIM_INFINITY/ || + $2 ~ /^PRIO_(PROCESS|PGRP|USER)/ || + $2 ~ /^CLONE_[A-Z_]+/ || + $2 !~ /^(BPF_TIMEVAL)$/ && + $2 ~ /^(BPF|DLT)_/ || + $2 ~ /^CLOCK_/ || + $2 !~ "WMESGLEN" && + $2 ~ /^W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", $2, $2)} + $2 ~ /^__WCOREFLAG$/ {next} + $2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)} + + {next} + ' | sort + + echo ')' +) >_const.go + +# Pull out the error names for later. +errors=$( + echo '#include <errno.h>' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print $2 }' | + sort +) + +# Pull out the signal names for later. +signals=$( + echo '#include <signal.h>' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print $2 }' | + egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT)' | + sort +) + +# Again, writing regexps to a file. +echo '#include <errno.h>' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print "^\t" $2 "[ \t]*=" }' | + sort >_error.grep +echo '#include <signal.h>' | $CC -x c - -E -dM $ccflags | + awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print "^\t" $2 "[ \t]*=" }' | + egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT)' | + sort >_signal.grep + +echo '// mkerrors.sh' "$@" +echo '// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT' +echo +echo "// +build ${GOARCH},${GOOS}" +echo +go tool cgo -godefs -- "$@" _const.go >_error.out +cat _error.out | grep -vf _error.grep | grep -vf _signal.grep +echo +echo '// Errors' +echo 'const (' +cat _error.out | grep -f _error.grep | sed 's/=\(.*\)/= syscall.Errno(\1)/' +echo ')' + +echo +echo '// Signals' +echo 'const (' +cat _error.out | grep -f _signal.grep | sed 's/=\(.*\)/= syscall.Signal(\1)/' +echo ')' + +# Run C program to print error and syscall strings. +( + echo -E " +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <ctype.h> +#include <string.h> +#include <signal.h> + +#define nelem(x) (sizeof(x)/sizeof((x)[0])) + +enum { A = 'A', Z = 'Z', a = 'a', z = 'z' }; // avoid need for single quotes below + +int errors[] = { +" + for i in $errors + do + echo -E ' '$i, + done + + echo -E " +}; + +int signals[] = { +" + for i in $signals + do + echo -E ' '$i, + done + + # Use -E because on some systems bash builtin interprets \n itself. + echo -E ' +}; + +static int +intcmp(const void *a, const void *b) +{ + return *(int*)a - *(int*)b; +} + +int +main(void) +{ + int i, j, e; + char buf[1024], *p; + + printf("\n\n// Error table\n"); + printf("var errors = [...]string {\n"); + qsort(errors, nelem(errors), sizeof errors[0], intcmp); + for(i=0; i<nelem(errors); i++) { + e = errors[i]; + if(i > 0 && errors[i-1] == e) + continue; + strcpy(buf, strerror(e)); + // lowercase first letter: Bad -> bad, but STREAM -> STREAM. + if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) + buf[0] += a - A; + printf("\t%d: \"%s\",\n", e, buf); + } + printf("}\n\n"); + + printf("\n\n// Signal table\n"); + printf("var signals = [...]string {\n"); + qsort(signals, nelem(signals), sizeof signals[0], intcmp); + for(i=0; i<nelem(signals); i++) { + e = signals[i]; + if(i > 0 && signals[i-1] == e) + continue; + strcpy(buf, strsignal(e)); + // lowercase first letter: Bad -> bad, but STREAM -> STREAM. + if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z) + buf[0] += a - A; + // cut trailing : number. + p = strrchr(buf, ":"[0]); + if(p) + *p = '\0'; + printf("\t%d: \"%s\",\n", e, buf); + } + printf("}\n\n"); + + return 0; +} + +' +) >_errors.c + +$CC $ccflags -o _errors _errors.c && $GORUN ./_errors && rm -f _errors.c _errors _const.go _error.grep _signal.grep _error.out diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mkpost.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mkpost.go new file mode 100644 index 0000000000000000000000000000000000000000..ed50d902af5971d86441e3cc385671858f610d04 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mkpost.go @@ -0,0 +1,62 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +// mkpost processes the output of cgo -godefs to +// modify the generated types. It is used to clean up +// the sys API in an architecture specific manner. +// +// mkpost is run after cgo -godefs by mkall.sh. +package main + +import ( + "fmt" + "go/format" + "io/ioutil" + "log" + "os" + "regexp" +) + +func main() { + b, err := ioutil.ReadAll(os.Stdin) + if err != nil { + log.Fatal(err) + } + s := string(b) + + goarch := os.Getenv("GOARCH") + goos := os.Getenv("GOOS") + if goarch == "s390x" && goos == "linux" { + // Export the types of PtraceRegs fields. + re := regexp.MustCompile("ptrace(Psw|Fpregs|Per)") + s = re.ReplaceAllString(s, "Ptrace$1") + + // Replace padding fields inserted by cgo with blank identifiers. + re = regexp.MustCompile("Pad_cgo[A-Za-z0-9_]*") + s = re.ReplaceAllString(s, "_") + + // Replace other unwanted fields with blank identifiers. + re = regexp.MustCompile("X_[A-Za-z0-9_]*") + s = re.ReplaceAllString(s, "_") + + // Replace the control_regs union with a blank identifier for now. + re = regexp.MustCompile("(Control_regs)\\s+\\[0\\]uint64") + s = re.ReplaceAllString(s, "_ [0]uint64") + } + + // gofmt + b, err = format.Source([]byte(s)) + if err != nil { + log.Fatal(err) + } + + // Append this command to the header to show where the new file + // came from. + re := regexp.MustCompile("(cgo -godefs [a-zA-Z0-9_]+\\.go.*)") + b = re.ReplaceAll(b, []byte("$1 | go run mkpost.go")) + + fmt.Printf("%s", b) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksyscall.pl b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksyscall.pl new file mode 100644 index 0000000000000000000000000000000000000000..b1e7766daeb9623069d68508b4b845096b446d86 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksyscall.pl @@ -0,0 +1,323 @@ +#!/usr/bin/env perl +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +# This program reads a file containing function prototypes +# (like syscall_darwin.go) and generates system call bodies. +# The prototypes are marked by lines beginning with "//sys" +# and read like func declarations if //sys is replaced by func, but: +# * The parameter lists must give a name for each argument. +# This includes return parameters. +# * The parameter lists must give a type for each argument: +# the (x, y, z int) shorthand is not allowed. +# * If the return parameter is an error number, it must be named errno. + +# A line beginning with //sysnb is like //sys, except that the +# goroutine will not be suspended during the execution of the system +# call. This must only be used for system calls which can never +# block, as otherwise the system call could cause all goroutines to +# hang. + +use strict; + +my $cmdline = "mksyscall.pl " . join(' ', @ARGV); +my $errors = 0; +my $_32bit = ""; +my $plan9 = 0; +my $openbsd = 0; +my $netbsd = 0; +my $dragonfly = 0; +my $arm = 0; # 64-bit value should use (even, odd)-pair + +if($ARGV[0] eq "-b32") { + $_32bit = "big-endian"; + shift; +} elsif($ARGV[0] eq "-l32") { + $_32bit = "little-endian"; + shift; +} +if($ARGV[0] eq "-plan9") { + $plan9 = 1; + shift; +} +if($ARGV[0] eq "-openbsd") { + $openbsd = 1; + shift; +} +if($ARGV[0] eq "-netbsd") { + $netbsd = 1; + shift; +} +if($ARGV[0] eq "-dragonfly") { + $dragonfly = 1; + shift; +} +if($ARGV[0] eq "-arm") { + $arm = 1; + shift; +} + +if($ARGV[0] =~ /^-/) { + print STDERR "usage: mksyscall.pl [-b32 | -l32] [file ...]\n"; + exit 1; +} + +if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") { + print STDERR "GOARCH or GOOS not defined in environment\n"; + exit 1; +} + +sub parseparamlist($) { + my ($list) = @_; + $list =~ s/^\s*//; + $list =~ s/\s*$//; + if($list eq "") { + return (); + } + return split(/\s*,\s*/, $list); +} + +sub parseparam($) { + my ($p) = @_; + if($p !~ /^(\S*) (\S*)$/) { + print STDERR "$ARGV:$.: malformed parameter: $p\n"; + $errors = 1; + return ("xx", "int"); + } + return ($1, $2); +} + +my $text = ""; +while(<>) { + chomp; + s/\s+/ /g; + s/^\s+//; + s/\s+$//; + my $nonblock = /^\/\/sysnb /; + next if !/^\/\/sys / && !$nonblock; + + # Line must be of the form + # func Open(path string, mode int, perm int) (fd int, errno error) + # Split into name, in params, out params. + if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*((?i)SYS_[A-Z0-9_]+))?$/) { + print STDERR "$ARGV:$.: malformed //sys declaration\n"; + $errors = 1; + next; + } + my ($func, $in, $out, $sysname) = ($2, $3, $4, $5); + + # Split argument lists on comma. + my @in = parseparamlist($in); + my @out = parseparamlist($out); + + # Try in vain to keep people from editing this file. + # The theory is that they jump into the middle of the file + # without reading the header. + $text .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n"; + + # Go function header. + my $out_decl = @out ? sprintf(" (%s)", join(', ', @out)) : ""; + $text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out_decl; + + # Check if err return available + my $errvar = ""; + foreach my $p (@out) { + my ($name, $type) = parseparam($p); + if($type eq "error") { + $errvar = $name; + last; + } + } + + # Prepare arguments to Syscall. + my @args = (); + my @uses = (); + my $n = 0; + foreach my $p (@in) { + my ($name, $type) = parseparam($p); + if($type =~ /^\*/) { + push @args, "uintptr(unsafe.Pointer($name))"; + } elsif($type eq "string" && $errvar ne "") { + $text .= "\tvar _p$n *byte\n"; + $text .= "\t_p$n, $errvar = BytePtrFromString($name)\n"; + $text .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + push @uses, "use(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type eq "string") { + print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; + $text .= "\tvar _p$n *byte\n"; + $text .= "\t_p$n, _ = BytePtrFromString($name)\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + push @uses, "use(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type =~ /^\[\](.*)/) { + # Convert slice into pointer, length. + # Have to be careful not to take address of &a[0] if len == 0: + # pass dummy pointer in that case. + # Used to pass nil, but some OSes or simulators reject write(fd, nil, 0). + $text .= "\tvar _p$n unsafe.Pointer\n"; + $text .= "\tif len($name) > 0 {\n\t\t_p$n = unsafe.Pointer(\&${name}[0])\n\t}"; + $text .= " else {\n\t\t_p$n = unsafe.Pointer(&_zero)\n\t}"; + $text .= "\n"; + push @args, "uintptr(_p$n)", "uintptr(len($name))"; + $n++; + } elsif($type eq "int64" && ($openbsd || $netbsd)) { + push @args, "0"; + if($_32bit eq "big-endian") { + push @args, "uintptr($name>>32)", "uintptr($name)"; + } elsif($_32bit eq "little-endian") { + push @args, "uintptr($name)", "uintptr($name>>32)"; + } else { + push @args, "uintptr($name)"; + } + } elsif($type eq "int64" && $dragonfly) { + if ($func !~ /^extp(read|write)/i) { + push @args, "0"; + } + if($_32bit eq "big-endian") { + push @args, "uintptr($name>>32)", "uintptr($name)"; + } elsif($_32bit eq "little-endian") { + push @args, "uintptr($name)", "uintptr($name>>32)"; + } else { + push @args, "uintptr($name)"; + } + } elsif($type eq "int64" && $_32bit ne "") { + if(@args % 2 && $arm) { + # arm abi specifies 64-bit argument uses + # (even, odd) pair + push @args, "0" + } + if($_32bit eq "big-endian") { + push @args, "uintptr($name>>32)", "uintptr($name)"; + } else { + push @args, "uintptr($name)", "uintptr($name>>32)"; + } + } else { + push @args, "uintptr($name)"; + } + } + + # Determine which form to use; pad args with zeros. + my $asm = "Syscall"; + if ($nonblock) { + $asm = "RawSyscall"; + } + if(@args <= 3) { + while(@args < 3) { + push @args, "0"; + } + } elsif(@args <= 6) { + $asm .= "6"; + while(@args < 6) { + push @args, "0"; + } + } elsif(@args <= 9) { + $asm .= "9"; + while(@args < 9) { + push @args, "0"; + } + } else { + print STDERR "$ARGV:$.: too many arguments to system call\n"; + } + + # System call number. + if($sysname eq "") { + $sysname = "SYS_$func"; + $sysname =~ s/([a-z])([A-Z])/${1}_$2/g; # turn FooBar into Foo_Bar + $sysname =~ y/a-z/A-Z/; + } + + # Actual call. + my $args = join(', ', @args); + my $call = "$asm($sysname, $args)"; + + # Assign return values. + my $body = ""; + my @ret = ("_", "_", "_"); + my $do_errno = 0; + for(my $i=0; $i<@out; $i++) { + my $p = $out[$i]; + my ($name, $type) = parseparam($p); + my $reg = ""; + if($name eq "err" && !$plan9) { + $reg = "e1"; + $ret[2] = $reg; + $do_errno = 1; + } elsif($name eq "err" && $plan9) { + $ret[0] = "r0"; + $ret[2] = "e1"; + next; + } else { + $reg = sprintf("r%d", $i); + $ret[$i] = $reg; + } + if($type eq "bool") { + $reg = "$reg != 0"; + } + if($type eq "int64" && $_32bit ne "") { + # 64-bit number in r1:r0 or r0:r1. + if($i+2 > @out) { + print STDERR "$ARGV:$.: not enough registers for int64 return\n"; + } + if($_32bit eq "big-endian") { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i, $i+1); + } else { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i+1, $i); + } + $ret[$i] = sprintf("r%d", $i); + $ret[$i+1] = sprintf("r%d", $i+1); + } + if($reg ne "e1" || $plan9) { + $body .= "\t$name = $type($reg)\n"; + } + } + if ($ret[0] eq "_" && $ret[1] eq "_" && $ret[2] eq "_") { + $text .= "\t$call\n"; + } else { + $text .= "\t$ret[0], $ret[1], $ret[2] := $call\n"; + } + foreach my $use (@uses) { + $text .= "\t$use\n"; + } + $text .= $body; + + if ($plan9 && $ret[2] eq "e1") { + $text .= "\tif int32(r0) == -1 {\n"; + $text .= "\t\terr = e1\n"; + $text .= "\t}\n"; + } elsif ($do_errno) { + $text .= "\tif e1 != 0 {\n"; + $text .= "\t\terr = errnoErr(e1)\n"; + $text .= "\t}\n"; + } + $text .= "\treturn\n"; + $text .= "}\n\n"; +} + +chomp $text; +chomp $text; + +if($errors) { + exit 1; +} + +print <<EOF; +// $cmdline +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build $ENV{'GOARCH'},$ENV{'GOOS'} + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +$text +EOF +exit 0; diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksyscall_solaris.pl b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksyscall_solaris.pl new file mode 100644 index 0000000000000000000000000000000000000000..06bade76877612905c43023cd54011e311c908b4 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksyscall_solaris.pl @@ -0,0 +1,294 @@ +#!/usr/bin/env perl +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +# This program reads a file containing function prototypes +# (like syscall_solaris.go) and generates system call bodies. +# The prototypes are marked by lines beginning with "//sys" +# and read like func declarations if //sys is replaced by func, but: +# * The parameter lists must give a name for each argument. +# This includes return parameters. +# * The parameter lists must give a type for each argument: +# the (x, y, z int) shorthand is not allowed. +# * If the return parameter is an error number, it must be named err. +# * If go func name needs to be different than its libc name, +# * or the function is not in libc, name could be specified +# * at the end, after "=" sign, like +# //sys getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (err error) = libsocket.getsockopt + +use strict; + +my $cmdline = "mksyscall_solaris.pl " . join(' ', @ARGV); +my $errors = 0; +my $_32bit = ""; + +binmode STDOUT; + +if($ARGV[0] eq "-b32") { + $_32bit = "big-endian"; + shift; +} elsif($ARGV[0] eq "-l32") { + $_32bit = "little-endian"; + shift; +} + +if($ARGV[0] =~ /^-/) { + print STDERR "usage: mksyscall_solaris.pl [-b32 | -l32] [file ...]\n"; + exit 1; +} + +if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") { + print STDERR "GOARCH or GOOS not defined in environment\n"; + exit 1; +} + +sub parseparamlist($) { + my ($list) = @_; + $list =~ s/^\s*//; + $list =~ s/\s*$//; + if($list eq "") { + return (); + } + return split(/\s*,\s*/, $list); +} + +sub parseparam($) { + my ($p) = @_; + if($p !~ /^(\S*) (\S*)$/) { + print STDERR "$ARGV:$.: malformed parameter: $p\n"; + $errors = 1; + return ("xx", "int"); + } + return ($1, $2); +} + +my $package = ""; +my $text = ""; +my $dynimports = ""; +my $linknames = ""; +my @vars = (); +while(<>) { + chomp; + s/\s+/ /g; + s/^\s+//; + s/\s+$//; + $package = $1 if !$package && /^package (\S+)$/; + my $nonblock = /^\/\/sysnb /; + next if !/^\/\/sys / && !$nonblock; + + # Line must be of the form + # func Open(path string, mode int, perm int) (fd int, err error) + # Split into name, in params, out params. + if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$/) { + print STDERR "$ARGV:$.: malformed //sys declaration\n"; + $errors = 1; + next; + } + my ($nb, $func, $in, $out, $modname, $sysname) = ($1, $2, $3, $4, $5, $6); + + # Split argument lists on comma. + my @in = parseparamlist($in); + my @out = parseparamlist($out); + + # So file name. + if($modname eq "") { + $modname = "libc"; + } + + # System call name. + if($sysname eq "") { + $sysname = "$func"; + } + + # System call pointer variable name. + my $sysvarname = "proc$sysname"; + + my $strconvfunc = "BytePtrFromString"; + my $strconvtype = "*byte"; + + $sysname =~ y/A-Z/a-z/; # All libc functions are lowercase. + + # Runtime import of function to allow cross-platform builds. + $dynimports .= "//go:cgo_import_dynamic libc_${sysname} ${sysname} \"$modname.so\"\n"; + # Link symbol to proc address variable. + $linknames .= "//go:linkname ${sysvarname} libc_${sysname}\n"; + # Library proc address variable. + push @vars, $sysvarname; + + # Go function header. + $out = join(', ', @out); + if($out ne "") { + $out = " ($out)"; + } + if($text ne "") { + $text .= "\n" + } + $text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out; + + # Check if err return available + my $errvar = ""; + foreach my $p (@out) { + my ($name, $type) = parseparam($p); + if($type eq "error") { + $errvar = $name; + last; + } + } + + # Prepare arguments to Syscall. + my @args = (); + my @uses = (); + my $n = 0; + foreach my $p (@in) { + my ($name, $type) = parseparam($p); + if($type =~ /^\*/) { + push @args, "uintptr(unsafe.Pointer($name))"; + } elsif($type eq "string" && $errvar ne "") { + $text .= "\tvar _p$n $strconvtype\n"; + $text .= "\t_p$n, $errvar = $strconvfunc($name)\n"; + $text .= "\tif $errvar != nil {\n\t\treturn\n\t}\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + push @uses, "use(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type eq "string") { + print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n"; + $text .= "\tvar _p$n $strconvtype\n"; + $text .= "\t_p$n, _ = $strconvfunc($name)\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))"; + push @uses, "use(unsafe.Pointer(_p$n))"; + $n++; + } elsif($type =~ /^\[\](.*)/) { + # Convert slice into pointer, length. + # Have to be careful not to take address of &a[0] if len == 0: + # pass nil in that case. + $text .= "\tvar _p$n *$1\n"; + $text .= "\tif len($name) > 0 {\n\t\t_p$n = \&$name\[0]\n\t}\n"; + push @args, "uintptr(unsafe.Pointer(_p$n))", "uintptr(len($name))"; + $n++; + } elsif($type eq "int64" && $_32bit ne "") { + if($_32bit eq "big-endian") { + push @args, "uintptr($name >> 32)", "uintptr($name)"; + } else { + push @args, "uintptr($name)", "uintptr($name >> 32)"; + } + } elsif($type eq "bool") { + $text .= "\tvar _p$n uint32\n"; + $text .= "\tif $name {\n\t\t_p$n = 1\n\t} else {\n\t\t_p$n = 0\n\t}\n"; + push @args, "uintptr(_p$n)"; + $n++; + } else { + push @args, "uintptr($name)"; + } + } + my $nargs = @args; + + # Determine which form to use; pad args with zeros. + my $asm = "sysvicall6"; + if ($nonblock) { + $asm = "rawSysvicall6"; + } + if(@args <= 6) { + while(@args < 6) { + push @args, "0"; + } + } else { + print STDERR "$ARGV:$.: too many arguments to system call\n"; + } + + # Actual call. + my $args = join(', ', @args); + my $call = "$asm(uintptr(unsafe.Pointer(&$sysvarname)), $nargs, $args)"; + + # Assign return values. + my $body = ""; + my $failexpr = ""; + my @ret = ("_", "_", "_"); + my @pout= (); + my $do_errno = 0; + for(my $i=0; $i<@out; $i++) { + my $p = $out[$i]; + my ($name, $type) = parseparam($p); + my $reg = ""; + if($name eq "err") { + $reg = "e1"; + $ret[2] = $reg; + $do_errno = 1; + } else { + $reg = sprintf("r%d", $i); + $ret[$i] = $reg; + } + if($type eq "bool") { + $reg = "$reg != 0"; + } + if($type eq "int64" && $_32bit ne "") { + # 64-bit number in r1:r0 or r0:r1. + if($i+2 > @out) { + print STDERR "$ARGV:$.: not enough registers for int64 return\n"; + } + if($_32bit eq "big-endian") { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i, $i+1); + } else { + $reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i+1, $i); + } + $ret[$i] = sprintf("r%d", $i); + $ret[$i+1] = sprintf("r%d", $i+1); + } + if($reg ne "e1") { + $body .= "\t$name = $type($reg)\n"; + } + } + if ($ret[0] eq "_" && $ret[1] eq "_" && $ret[2] eq "_") { + $text .= "\t$call\n"; + } else { + $text .= "\t$ret[0], $ret[1], $ret[2] := $call\n"; + } + foreach my $use (@uses) { + $text .= "\t$use\n"; + } + $text .= $body; + + if ($do_errno) { + $text .= "\tif e1 != 0 {\n"; + $text .= "\t\terr = e1\n"; + $text .= "\t}\n"; + } + $text .= "\treturn\n"; + $text .= "}\n"; +} + +if($errors) { + exit 1; +} + +print <<EOF; +// $cmdline +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build $ENV{'GOARCH'},$ENV{'GOOS'} + +package $package + +import ( + "syscall" + "unsafe" +) +EOF + +print "import \"golang.org/x/sys/unix\"\n" if $package ne "unix"; + +my $vardecls = "\t" . join(",\n\t", @vars); +$vardecls .= " syscallFunc"; + +chomp($_=<<EOF); + +$dynimports +$linknames +var ( +$vardecls +) + +$text +EOF +print $_; +exit 0; diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksysctl_openbsd.pl b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksysctl_openbsd.pl new file mode 100644 index 0000000000000000000000000000000000000000..be67afa4175f92bae6ccf5f2788dcd583a475f62 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksysctl_openbsd.pl @@ -0,0 +1,264 @@ +#!/usr/bin/env perl + +# Copyright 2011 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +# +# Parse the header files for OpenBSD and generate a Go usable sysctl MIB. +# +# Build a MIB with each entry being an array containing the level, type and +# a hash that will contain additional entries if the current entry is a node. +# We then walk this MIB and create a flattened sysctl name to OID hash. +# + +use strict; + +if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") { + print STDERR "GOARCH or GOOS not defined in environment\n"; + exit 1; +} + +my $debug = 0; +my %ctls = (); + +my @headers = qw ( + sys/sysctl.h + sys/socket.h + sys/tty.h + sys/malloc.h + sys/mount.h + sys/namei.h + sys/sem.h + sys/shm.h + sys/vmmeter.h + uvm/uvm_param.h + uvm/uvm_swap_encrypt.h + ddb/db_var.h + net/if.h + net/if_pfsync.h + net/pipex.h + netinet/in.h + netinet/icmp_var.h + netinet/igmp_var.h + netinet/ip_ah.h + netinet/ip_carp.h + netinet/ip_divert.h + netinet/ip_esp.h + netinet/ip_ether.h + netinet/ip_gre.h + netinet/ip_ipcomp.h + netinet/ip_ipip.h + netinet/pim_var.h + netinet/tcp_var.h + netinet/udp_var.h + netinet6/in6.h + netinet6/ip6_divert.h + netinet6/pim6_var.h + netinet/icmp6.h + netmpls/mpls.h +); + +my @ctls = qw ( + kern + vm + fs + net + #debug # Special handling required + hw + #machdep # Arch specific + user + ddb + #vfs # Special handling required + fs.posix + kern.forkstat + kern.intrcnt + kern.malloc + kern.nchstats + kern.seminfo + kern.shminfo + kern.timecounter + kern.tty + kern.watchdog + net.bpf + net.ifq + net.inet + net.inet.ah + net.inet.carp + net.inet.divert + net.inet.esp + net.inet.etherip + net.inet.gre + net.inet.icmp + net.inet.igmp + net.inet.ip + net.inet.ip.ifq + net.inet.ipcomp + net.inet.ipip + net.inet.mobileip + net.inet.pfsync + net.inet.pim + net.inet.tcp + net.inet.udp + net.inet6 + net.inet6.divert + net.inet6.ip6 + net.inet6.icmp6 + net.inet6.pim6 + net.inet6.tcp6 + net.inet6.udp6 + net.mpls + net.mpls.ifq + net.key + net.pflow + net.pfsync + net.pipex + net.rt + vm.swapencrypt + #vfsgenctl # Special handling required +); + +# Node name "fixups" +my %ctl_map = ( + "ipproto" => "net.inet", + "net.inet.ipproto" => "net.inet", + "net.inet6.ipv6proto" => "net.inet6", + "net.inet6.ipv6" => "net.inet6.ip6", + "net.inet.icmpv6" => "net.inet6.icmp6", + "net.inet6.divert6" => "net.inet6.divert", + "net.inet6.tcp6" => "net.inet.tcp", + "net.inet6.udp6" => "net.inet.udp", + "mpls" => "net.mpls", + "swpenc" => "vm.swapencrypt" +); + +# Node mappings +my %node_map = ( + "net.inet.ip.ifq" => "net.ifq", + "net.inet.pfsync" => "net.pfsync", + "net.mpls.ifq" => "net.ifq" +); + +my $ctlname; +my %mib = (); +my %sysctl = (); +my $node; + +sub debug() { + print STDERR "$_[0]\n" if $debug; +} + +# Walk the MIB and build a sysctl name to OID mapping. +sub build_sysctl() { + my ($node, $name, $oid) = @_; + my %node = %{$node}; + my @oid = @{$oid}; + + foreach my $key (sort keys %node) { + my @node = @{$node{$key}}; + my $nodename = $name.($name ne '' ? '.' : '').$key; + my @nodeoid = (@oid, $node[0]); + if ($node[1] eq 'CTLTYPE_NODE') { + if (exists $node_map{$nodename}) { + $node = \%mib; + $ctlname = $node_map{$nodename}; + foreach my $part (split /\./, $ctlname) { + $node = \%{@{$$node{$part}}[2]}; + } + } else { + $node = $node[2]; + } + &build_sysctl($node, $nodename, \@nodeoid); + } elsif ($node[1] ne '') { + $sysctl{$nodename} = \@nodeoid; + } + } +} + +foreach my $ctl (@ctls) { + $ctls{$ctl} = $ctl; +} + +# Build MIB +foreach my $header (@headers) { + &debug("Processing $header..."); + open HEADER, "/usr/include/$header" || + print STDERR "Failed to open $header\n"; + while (<HEADER>) { + if ($_ =~ /^#define\s+(CTL_NAMES)\s+{/ || + $_ =~ /^#define\s+(CTL_(.*)_NAMES)\s+{/ || + $_ =~ /^#define\s+((.*)CTL_NAMES)\s+{/) { + if ($1 eq 'CTL_NAMES') { + # Top level. + $node = \%mib; + } else { + # Node. + my $nodename = lc($2); + if ($header =~ /^netinet\//) { + $ctlname = "net.inet.$nodename"; + } elsif ($header =~ /^netinet6\//) { + $ctlname = "net.inet6.$nodename"; + } elsif ($header =~ /^net\//) { + $ctlname = "net.$nodename"; + } else { + $ctlname = "$nodename"; + $ctlname =~ s/^(fs|net|kern)_/$1\./; + } + if (exists $ctl_map{$ctlname}) { + $ctlname = $ctl_map{$ctlname}; + } + if (not exists $ctls{$ctlname}) { + &debug("Ignoring $ctlname..."); + next; + } + + # Walk down from the top of the MIB. + $node = \%mib; + foreach my $part (split /\./, $ctlname) { + if (not exists $$node{$part}) { + &debug("Missing node $part"); + $$node{$part} = [ 0, '', {} ]; + } + $node = \%{@{$$node{$part}}[2]}; + } + } + + # Populate current node with entries. + my $i = -1; + while (defined($_) && $_ !~ /^}/) { + $_ = <HEADER>; + $i++ if $_ =~ /{.*}/; + next if $_ !~ /{\s+"(\w+)",\s+(CTLTYPE_[A-Z]+)\s+}/; + $$node{$1} = [ $i, $2, {} ]; + } + } + } + close HEADER; +} + +&build_sysctl(\%mib, "", []); + +print <<EOF; +// mksysctl_openbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build $ENV{'GOARCH'},$ENV{'GOOS'} + +package unix; + +type mibentry struct { + ctlname string + ctloid []_C_int +} + +var sysctlMib = []mibentry { +EOF + +foreach my $name (sort keys %sysctl) { + my @oid = @{$sysctl{$name}}; + print "\t{ \"$name\", []_C_int{ ", join(', ', @oid), " } }, \n"; +} + +print <<EOF; +} +EOF diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksysnum_darwin.pl b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksysnum_darwin.pl new file mode 100644 index 0000000000000000000000000000000000000000..d3e5147fcb3790e7b6903346bcb0e36169b0f1e5 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksysnum_darwin.pl @@ -0,0 +1,39 @@ +#!/usr/bin/env perl +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. +# +# Generate system call table for Darwin from sys/syscall.h + +use strict; + +if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") { + print STDERR "GOARCH or GOOS not defined in environment\n"; + exit 1; +} + +my $command = "mksysnum_darwin.pl " . join(' ', @ARGV); + +print <<EOF; +// $command +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build $ENV{'GOARCH'},$ENV{'GOOS'} + +package unix + +const ( +EOF + +while(<>){ + if(/^#define\s+SYS_(\w+)\s+([0-9]+)/){ + my $name = $1; + my $num = $2; + $name =~ y/a-z/A-Z/; + print " SYS_$name = $num;" + } +} + +print <<EOF; +) +EOF diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksysnum_dragonfly.pl b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksysnum_dragonfly.pl new file mode 100644 index 0000000000000000000000000000000000000000..266a248c75c1cf5c994a8f2801534843bb055f40 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksysnum_dragonfly.pl @@ -0,0 +1,50 @@ +#!/usr/bin/env perl +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. +# +# Generate system call table for DragonFly from master list +# (for example, /usr/src/sys/kern/syscalls.master). + +use strict; + +if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") { + print STDERR "GOARCH or GOOS not defined in environment\n"; + exit 1; +} + +my $command = "mksysnum_dragonfly.pl " . join(' ', @ARGV); + +print <<EOF; +// $command +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build $ENV{'GOARCH'},$ENV{'GOOS'} + +package unix + +const ( +EOF + +while(<>){ + if(/^([0-9]+)\s+STD\s+({ \S+\s+(\w+).*)$/){ + my $num = $1; + my $proto = $2; + my $name = "SYS_$3"; + $name =~ y/a-z/A-Z/; + + # There are multiple entries for enosys and nosys, so comment them out. + if($name =~ /^SYS_E?NOSYS$/){ + $name = "// $name"; + } + if($name eq 'SYS_SYS_EXIT'){ + $name = 'SYS_EXIT'; + } + + print " $name = $num; // $proto\n"; + } +} + +print <<EOF; +) +EOF diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksysnum_freebsd.pl b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksysnum_freebsd.pl new file mode 100644 index 0000000000000000000000000000000000000000..b767e124cc271e3f5f3c90a3bb6f90bf093d7728 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksysnum_freebsd.pl @@ -0,0 +1,63 @@ +#!/usr/bin/env perl +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. +# +# Generate system call table for FreeBSD from master list +# (for example, /usr/src/sys/kern/syscalls.master). + +use strict; + +if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") { + print STDERR "GOARCH or GOOS not defined in environment\n"; + exit 1; +} + +my $command = "mksysnum_freebsd.pl " . join(' ', @ARGV); + +print <<EOF; +// $command +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build $ENV{'GOARCH'},$ENV{'GOOS'} + +package unix + +const ( +EOF + +while(<>){ + if(/^([0-9]+)\s+\S+\s+STD\s+({ \S+\s+(\w+).*)$/){ + my $num = $1; + my $proto = $2; + my $name = "SYS_$3"; + $name =~ y/a-z/A-Z/; + + # There are multiple entries for enosys and nosys, so comment them out. + if($name =~ /^SYS_E?NOSYS$/){ + $name = "// $name"; + } + if($name eq 'SYS_SYS_EXIT'){ + $name = 'SYS_EXIT'; + } + if($name =~ /^SYS_CAP_+/ || $name =~ /^SYS___CAP_+/){ + next + } + + print " $name = $num; // $proto\n"; + + # We keep Capsicum syscall numbers for FreeBSD + # 9-STABLE here because we are not sure whether they + # are mature and stable. + if($num == 513){ + print " SYS_CAP_NEW = 514 // { int cap_new(int fd, uint64_t rights); }\n"; + print " SYS_CAP_GETRIGHTS = 515 // { int cap_getrights(int fd, \\\n"; + print " SYS_CAP_ENTER = 516 // { int cap_enter(void); }\n"; + print " SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); }\n"; + } + } +} + +print <<EOF; +) +EOF diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksysnum_linux.pl b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksysnum_linux.pl new file mode 100644 index 0000000000000000000000000000000000000000..4d4017deb2dd8094043c2d344f9172427c7de9be --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksysnum_linux.pl @@ -0,0 +1,58 @@ +#!/usr/bin/env perl +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +use strict; + +if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") { + print STDERR "GOARCH or GOOS not defined in environment\n"; + exit 1; +} + +my $command = "mksysnum_linux.pl ". join(' ', @ARGV); + +print <<EOF; +// $command +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build $ENV{'GOARCH'},$ENV{'GOOS'} + +package unix + +const( +EOF + +sub fmt { + my ($name, $num) = @_; + if($num > 999){ + # ignore deprecated syscalls that are no longer implemented + # https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/include/uapi/asm-generic/unistd.h?id=refs/heads/master#n716 + return; + } + $name =~ y/a-z/A-Z/; + print " SYS_$name = $num;\n"; +} + +my $prev; +open(GCC, "gcc -E -dD $ARGV[0] |") || die "can't run gcc"; +while(<GCC>){ + if(/^#define __NR_syscalls\s+/) { + # ignore redefinitions of __NR_syscalls + } + elsif(/^#define __NR_(\w+)\s+([0-9]+)/){ + $prev = $2; + fmt($1, $2); + } + elsif(/^#define __NR3264_(\w+)\s+([0-9]+)/){ + $prev = $2; + fmt($1, $2); + } + elsif(/^#define __NR_(\w+)\s+\(\w+\+\s*([0-9]+)\)/){ + fmt($1, $prev+$2) + } +} + +print <<EOF; +) +EOF diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksysnum_netbsd.pl b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksysnum_netbsd.pl new file mode 100644 index 0000000000000000000000000000000000000000..e74616a65aefe69191954e0569929ee51c1f1f8e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksysnum_netbsd.pl @@ -0,0 +1,58 @@ +#!/usr/bin/env perl +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. +# +# Generate system call table for OpenBSD from master list +# (for example, /usr/src/sys/kern/syscalls.master). + +use strict; + +if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") { + print STDERR "GOARCH or GOOS not defined in environment\n"; + exit 1; +} + +my $command = "mksysnum_netbsd.pl " . join(' ', @ARGV); + +print <<EOF; +// $command +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build $ENV{'GOARCH'},$ENV{'GOOS'} + +package unix + +const ( +EOF + +my $line = ''; +while(<>){ + if($line =~ /^(.*)\\$/) { + # Handle continuation + $line = $1; + $_ =~ s/^\s+//; + $line .= $_; + } else { + # New line + $line = $_; + } + next if $line =~ /\\$/; + if($line =~ /^([0-9]+)\s+((STD)|(NOERR))\s+(RUMP\s+)?({\s+\S+\s*\*?\s*\|(\S+)\|(\S*)\|(\w+).*\s+})(\s+(\S+))?$/) { + my $num = $1; + my $proto = $6; + my $compat = $8; + my $name = "$7_$9"; + + $name = "$7_$11" if $11 ne ''; + $name =~ y/a-z/A-Z/; + + if($compat eq '' || $compat eq '30' || $compat eq '50') { + print " $name = $num; // $proto\n"; + } + } +} + +print <<EOF; +) +EOF diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksysnum_openbsd.pl b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksysnum_openbsd.pl new file mode 100644 index 0000000000000000000000000000000000000000..ae5aad58660845c98d30984ab843b67d9c71cf05 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/mksysnum_openbsd.pl @@ -0,0 +1,50 @@ +#!/usr/bin/env perl +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. +# +# Generate system call table for OpenBSD from master list +# (for example, /usr/src/sys/kern/syscalls.master). + +use strict; + +if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") { + print STDERR "GOARCH or GOOS not defined in environment\n"; + exit 1; +} + +my $command = "mksysnum_openbsd.pl " . join(' ', @ARGV); + +print <<EOF; +// $command +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build $ENV{'GOARCH'},$ENV{'GOOS'} + +package unix + +const ( +EOF + +while(<>){ + if(/^([0-9]+)\s+STD\s+(NOLOCK\s+)?({ \S+\s+\*?(\w+).*)$/){ + my $num = $1; + my $proto = $3; + my $name = $4; + $name =~ y/a-z/A-Z/; + + # There are multiple entries for enosys and nosys, so comment them out. + if($name =~ /^SYS_E?NOSYS$/){ + $name = "// $name"; + } + if($name eq 'SYS_SYS_EXIT'){ + $name = 'SYS_EXIT'; + } + + print " $name = $num; // $proto\n"; + } +} + +print <<EOF; +) +EOF diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/race.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/race.go new file mode 100644 index 0000000000000000000000000000000000000000..3c7627eb5ce9f475ccfef09d7901e5b810d22a28 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/race.go @@ -0,0 +1,30 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin,race linux,race freebsd,race + +package unix + +import ( + "runtime" + "unsafe" +) + +const raceenabled = true + +func raceAcquire(addr unsafe.Pointer) { + runtime.RaceAcquire(addr) +} + +func raceReleaseMerge(addr unsafe.Pointer) { + runtime.RaceReleaseMerge(addr) +} + +func raceReadRange(addr unsafe.Pointer, len int) { + runtime.RaceReadRange(addr, len) +} + +func raceWriteRange(addr unsafe.Pointer, len int) { + runtime.RaceWriteRange(addr, len) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/race0.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/race0.go new file mode 100644 index 0000000000000000000000000000000000000000..f8678e0d21561fae9f50feda2fe57a9cd8385b56 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/race0.go @@ -0,0 +1,25 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin,!race linux,!race freebsd,!race netbsd openbsd solaris dragonfly + +package unix + +import ( + "unsafe" +) + +const raceenabled = false + +func raceAcquire(addr unsafe.Pointer) { +} + +func raceReleaseMerge(addr unsafe.Pointer) { +} + +func raceReadRange(addr unsafe.Pointer, len int) { +} + +func raceWriteRange(addr unsafe.Pointer, len int) { +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/sockcmsg_linux.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/sockcmsg_linux.go new file mode 100644 index 0000000000000000000000000000000000000000..d9ff4731a2ecd448ae96f861b38f4721f64850fb --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/sockcmsg_linux.go @@ -0,0 +1,36 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Socket control messages + +package unix + +import "unsafe" + +// UnixCredentials encodes credentials into a socket control message +// for sending to another process. This can be used for +// authentication. +func UnixCredentials(ucred *Ucred) []byte { + b := make([]byte, CmsgSpace(SizeofUcred)) + h := (*Cmsghdr)(unsafe.Pointer(&b[0])) + h.Level = SOL_SOCKET + h.Type = SCM_CREDENTIALS + h.SetLen(CmsgLen(SizeofUcred)) + *((*Ucred)(cmsgData(h))) = *ucred + return b +} + +// ParseUnixCredentials decodes a socket control message that contains +// credentials in a Ucred structure. To receive such a message, the +// SO_PASSCRED option must be enabled on the socket. +func ParseUnixCredentials(m *SocketControlMessage) (*Ucred, error) { + if m.Header.Level != SOL_SOCKET { + return nil, EINVAL + } + if m.Header.Type != SCM_CREDENTIALS { + return nil, EINVAL + } + ucred := *(*Ucred)(unsafe.Pointer(&m.Data[0])) + return &ucred, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/sockcmsg_unix.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/sockcmsg_unix.go new file mode 100644 index 0000000000000000000000000000000000000000..f1493a3e6f27138e36efa0074d802ebd47bf4b6d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/sockcmsg_unix.go @@ -0,0 +1,103 @@ +// Copyright 2011 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +// Socket control messages + +package unix + +import "unsafe" + +// Round the length of a raw sockaddr up to align it properly. +func cmsgAlignOf(salen int) int { + salign := sizeofPtr + // NOTE: It seems like 64-bit Darwin and DragonFly BSD kernels + // still require 32-bit aligned access to network subsystem. + if darwin64Bit || dragonfly64Bit { + salign = 4 + } + return (salen + salign - 1) & ^(salign - 1) +} + +// CmsgLen returns the value to store in the Len field of the Cmsghdr +// structure, taking into account any necessary alignment. +func CmsgLen(datalen int) int { + return cmsgAlignOf(SizeofCmsghdr) + datalen +} + +// CmsgSpace returns the number of bytes an ancillary element with +// payload of the passed data length occupies. +func CmsgSpace(datalen int) int { + return cmsgAlignOf(SizeofCmsghdr) + cmsgAlignOf(datalen) +} + +func cmsgData(h *Cmsghdr) unsafe.Pointer { + return unsafe.Pointer(uintptr(unsafe.Pointer(h)) + uintptr(cmsgAlignOf(SizeofCmsghdr))) +} + +// SocketControlMessage represents a socket control message. +type SocketControlMessage struct { + Header Cmsghdr + Data []byte +} + +// ParseSocketControlMessage parses b as an array of socket control +// messages. +func ParseSocketControlMessage(b []byte) ([]SocketControlMessage, error) { + var msgs []SocketControlMessage + i := 0 + for i+CmsgLen(0) <= len(b) { + h, dbuf, err := socketControlMessageHeaderAndData(b[i:]) + if err != nil { + return nil, err + } + m := SocketControlMessage{Header: *h, Data: dbuf} + msgs = append(msgs, m) + i += cmsgAlignOf(int(h.Len)) + } + return msgs, nil +} + +func socketControlMessageHeaderAndData(b []byte) (*Cmsghdr, []byte, error) { + h := (*Cmsghdr)(unsafe.Pointer(&b[0])) + if h.Len < SizeofCmsghdr || uint64(h.Len) > uint64(len(b)) { + return nil, nil, EINVAL + } + return h, b[cmsgAlignOf(SizeofCmsghdr):h.Len], nil +} + +// UnixRights encodes a set of open file descriptors into a socket +// control message for sending to another process. +func UnixRights(fds ...int) []byte { + datalen := len(fds) * 4 + b := make([]byte, CmsgSpace(datalen)) + h := (*Cmsghdr)(unsafe.Pointer(&b[0])) + h.Level = SOL_SOCKET + h.Type = SCM_RIGHTS + h.SetLen(CmsgLen(datalen)) + data := cmsgData(h) + for _, fd := range fds { + *(*int32)(data) = int32(fd) + data = unsafe.Pointer(uintptr(data) + 4) + } + return b +} + +// ParseUnixRights decodes a socket control message that contains an +// integer array of open file descriptors from another process. +func ParseUnixRights(m *SocketControlMessage) ([]int, error) { + if m.Header.Level != SOL_SOCKET { + return nil, EINVAL + } + if m.Header.Type != SCM_RIGHTS { + return nil, EINVAL + } + fds := make([]int, len(m.Data)>>2) + for i, j := 0, 0; i < len(m.Data); i += 4 { + fds[j] = int(*(*int32)(unsafe.Pointer(&m.Data[i]))) + j++ + } + return fds, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/str.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/str.go new file mode 100644 index 0000000000000000000000000000000000000000..35ed6643536f4db3c9ac52e66d4bacce25b1cde7 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/str.go @@ -0,0 +1,26 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix + +func itoa(val int) string { // do it here rather than with fmt to avoid dependency + if val < 0 { + return "-" + uitoa(uint(-val)) + } + return uitoa(uint(val)) +} + +func uitoa(val uint) string { + var buf [32]byte // big enough for int64 + i := len(buf) - 1 + for val >= 10 { + buf[i] = byte(val%10 + '0') + i-- + val /= 10 + } + buf[i] = byte(val + '0') + return string(buf[i:]) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall.go new file mode 100644 index 0000000000000000000000000000000000000000..a0bcf842ca8fd36a11f4e589366e8a13d0182ab8 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall.go @@ -0,0 +1,76 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +// Package unix contains an interface to the low-level operating system +// primitives. OS details vary depending on the underlying system, and +// by default, godoc will display OS-specific documentation for the current +// system. If you want godoc to display OS documentation for another +// system, set $GOOS and $GOARCH to the desired system. For example, if +// you want to view documentation for freebsd/arm on linux/amd64, set $GOOS +// to freebsd and $GOARCH to arm. +// The primary use of this package is inside other packages that provide a more +// portable interface to the system, such as "os", "time" and "net". Use +// those packages rather than this one if you can. +// For details of the functions and data types in this package consult +// the manuals for the appropriate operating system. +// These calls return err == nil to indicate success; otherwise +// err represents an operating system error describing the failure and +// holds a value of type syscall.Errno. +package unix // import "golang.org/x/sys/unix" + +import "unsafe" + +// ByteSliceFromString returns a NUL-terminated slice of bytes +// containing the text of s. If s contains a NUL byte at any +// location, it returns (nil, EINVAL). +func ByteSliceFromString(s string) ([]byte, error) { + for i := 0; i < len(s); i++ { + if s[i] == 0 { + return nil, EINVAL + } + } + a := make([]byte, len(s)+1) + copy(a, s) + return a, nil +} + +// BytePtrFromString returns a pointer to a NUL-terminated array of +// bytes containing the text of s. If s contains a NUL byte at any +// location, it returns (nil, EINVAL). +func BytePtrFromString(s string) (*byte, error) { + a, err := ByteSliceFromString(s) + if err != nil { + return nil, err + } + return &a[0], nil +} + +// Single-word zero for use when we need a valid pointer to 0 bytes. +// See mkunix.pl. +var _zero uintptr + +func (ts *Timespec) Unix() (sec int64, nsec int64) { + return int64(ts.Sec), int64(ts.Nsec) +} + +func (tv *Timeval) Unix() (sec int64, nsec int64) { + return int64(tv.Sec), int64(tv.Usec) * 1000 +} + +func (ts *Timespec) Nano() int64 { + return int64(ts.Sec)*1e9 + int64(ts.Nsec) +} + +func (tv *Timeval) Nano() int64 { + return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000 +} + +func TimevalToNsec(tv Timeval) int64 { return int64(tv.Sec)*1e9 + int64(tv.Usec)*1e3 } + +// use is a no-op, but the compiler cannot see that it is. +// Calling use(p) ensures that p is kept live until that point. +//go:noescape +func use(p unsafe.Pointer) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_bsd.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_bsd.go new file mode 100644 index 0000000000000000000000000000000000000000..e9671764ccb4e4dfd8d49f2002a5abbdd6b1015b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_bsd.go @@ -0,0 +1,628 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd netbsd openbsd + +// BSD system call wrappers shared by *BSD based systems +// including OS X (Darwin) and FreeBSD. Like the other +// syscall_*.go files it is compiled as Go code but also +// used as input to mksyscall which parses the //sys +// lines and generates system call stubs. + +package unix + +import ( + "runtime" + "syscall" + "unsafe" +) + +/* + * Wrapped + */ + +//sysnb getgroups(ngid int, gid *_Gid_t) (n int, err error) +//sysnb setgroups(ngid int, gid *_Gid_t) (err error) + +func Getgroups() (gids []int, err error) { + n, err := getgroups(0, nil) + if err != nil { + return nil, err + } + if n == 0 { + return nil, nil + } + + // Sanity check group count. Max is 16 on BSD. + if n < 0 || n > 1000 { + return nil, EINVAL + } + + a := make([]_Gid_t, n) + n, err = getgroups(n, &a[0]) + if err != nil { + return nil, err + } + gids = make([]int, n) + for i, v := range a[0:n] { + gids[i] = int(v) + } + return +} + +func Setgroups(gids []int) (err error) { + if len(gids) == 0 { + return setgroups(0, nil) + } + + a := make([]_Gid_t, len(gids)) + for i, v := range gids { + a[i] = _Gid_t(v) + } + return setgroups(len(a), &a[0]) +} + +func ReadDirent(fd int, buf []byte) (n int, err error) { + // Final argument is (basep *uintptr) and the syscall doesn't take nil. + // 64 bits should be enough. (32 bits isn't even on 386). Since the + // actual system call is getdirentries64, 64 is a good guess. + // TODO(rsc): Can we use a single global basep for all calls? + var base = (*uintptr)(unsafe.Pointer(new(uint64))) + return Getdirentries(fd, buf, base) +} + +// Wait status is 7 bits at bottom, either 0 (exited), +// 0x7F (stopped), or a signal number that caused an exit. +// The 0x80 bit is whether there was a core dump. +// An extra number (exit code, signal causing a stop) +// is in the high bits. + +type WaitStatus uint32 + +const ( + mask = 0x7F + core = 0x80 + shift = 8 + + exited = 0 + stopped = 0x7F +) + +func (w WaitStatus) Exited() bool { return w&mask == exited } + +func (w WaitStatus) ExitStatus() int { + if w&mask != exited { + return -1 + } + return int(w >> shift) +} + +func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != 0 } + +func (w WaitStatus) Signal() syscall.Signal { + sig := syscall.Signal(w & mask) + if sig == stopped || sig == 0 { + return -1 + } + return sig +} + +func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 } + +func (w WaitStatus) Stopped() bool { return w&mask == stopped && syscall.Signal(w>>shift) != SIGSTOP } + +func (w WaitStatus) Continued() bool { return w&mask == stopped && syscall.Signal(w>>shift) == SIGSTOP } + +func (w WaitStatus) StopSignal() syscall.Signal { + if !w.Stopped() { + return -1 + } + return syscall.Signal(w>>shift) & 0xFF +} + +func (w WaitStatus) TrapCause() int { return -1 } + +//sys wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) + +func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) { + var status _C_int + wpid, err = wait4(pid, &status, options, rusage) + if wstatus != nil { + *wstatus = WaitStatus(status) + } + return +} + +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys Shutdown(s int, how int) (err error) + +func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Len = SizeofSockaddrInet4 + sa.raw.Family = AF_INET + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil +} + +func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Len = SizeofSockaddrInet6 + sa.raw.Family = AF_INET6 + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + sa.raw.Scope_id = sa.ZoneId + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil +} + +func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { + name := sa.Name + n := len(name) + if n >= len(sa.raw.Path) || n == 0 { + return nil, 0, EINVAL + } + sa.raw.Len = byte(3 + n) // 2 for Family, Len; 1 for NUL + sa.raw.Family = AF_UNIX + for i := 0; i < n; i++ { + sa.raw.Path[i] = int8(name[i]) + } + return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil +} + +func (sa *SockaddrDatalink) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Index == 0 { + return nil, 0, EINVAL + } + sa.raw.Len = sa.Len + sa.raw.Family = AF_LINK + sa.raw.Index = sa.Index + sa.raw.Type = sa.Type + sa.raw.Nlen = sa.Nlen + sa.raw.Alen = sa.Alen + sa.raw.Slen = sa.Slen + for i := 0; i < len(sa.raw.Data); i++ { + sa.raw.Data[i] = sa.Data[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrDatalink, nil +} + +func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) { + switch rsa.Addr.Family { + case AF_LINK: + pp := (*RawSockaddrDatalink)(unsafe.Pointer(rsa)) + sa := new(SockaddrDatalink) + sa.Len = pp.Len + sa.Family = pp.Family + sa.Index = pp.Index + sa.Type = pp.Type + sa.Nlen = pp.Nlen + sa.Alen = pp.Alen + sa.Slen = pp.Slen + for i := 0; i < len(sa.Data); i++ { + sa.Data[i] = pp.Data[i] + } + return sa, nil + + case AF_UNIX: + pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa)) + if pp.Len < 2 || pp.Len > SizeofSockaddrUnix { + return nil, EINVAL + } + sa := new(SockaddrUnix) + + // Some BSDs include the trailing NUL in the length, whereas + // others do not. Work around this by subtracting the leading + // family and len. The path is then scanned to see if a NUL + // terminator still exists within the length. + n := int(pp.Len) - 2 // subtract leading Family, Len + for i := 0; i < n; i++ { + if pp.Path[i] == 0 { + // found early NUL; assume Len included the NUL + // or was overestimating. + n = i + break + } + } + bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] + sa.Name = string(bytes) + return sa, nil + + case AF_INET: + pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet4) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_INET6: + pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet6) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + sa.ZoneId = pp.Scope_id + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + } + return nil, EAFNOSUPPORT +} + +func Accept(fd int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept(fd, &rsa, &len) + if err != nil { + return + } + if runtime.GOOS == "darwin" && len == 0 { + // Accepted socket has no address. + // This is likely due to a bug in xnu kernels, + // where instead of ECONNABORTED error socket + // is accepted, but has no address. + Close(nfd) + return 0, nil, ECONNABORTED + } + sa, err = anyToSockaddr(&rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +func Getsockname(fd int) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if err = getsockname(fd, &rsa, &len); err != nil { + return + } + // TODO(jsing): DragonFly has a "bug" (see issue 3349), which should be + // reported upstream. + if runtime.GOOS == "dragonfly" && rsa.Addr.Family == AF_UNSPEC && rsa.Addr.Len == 0 { + rsa.Addr.Family = AF_UNIX + rsa.Addr.Len = SizeofSockaddrUnix + } + return anyToSockaddr(&rsa) +} + +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) + +func GetsockoptByte(fd, level, opt int) (value byte, err error) { + var n byte + vallen := _Socklen(1) + err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen) + return n, err +} + +func GetsockoptInet4Addr(fd, level, opt int) (value [4]byte, err error) { + vallen := _Socklen(4) + err = getsockopt(fd, level, opt, unsafe.Pointer(&value[0]), &vallen) + return value, err +} + +func GetsockoptIPMreq(fd, level, opt int) (*IPMreq, error) { + var value IPMreq + vallen := _Socklen(SizeofIPMreq) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptIPv6Mreq(fd, level, opt int) (*IPv6Mreq, error) { + var value IPv6Mreq + vallen := _Socklen(SizeofIPv6Mreq) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptIPv6MTUInfo(fd, level, opt int) (*IPv6MTUInfo, error) { + var value IPv6MTUInfo + vallen := _Socklen(SizeofIPv6MTUInfo) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptICMPv6Filter(fd, level, opt int) (*ICMPv6Filter, error) { + var value ICMPv6Filter + vallen := _Socklen(SizeofICMPv6Filter) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) + +func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { + var msg Msghdr + var rsa RawSockaddrAny + msg.Name = (*byte)(unsafe.Pointer(&rsa)) + msg.Namelen = uint32(SizeofSockaddrAny) + var iov Iovec + if len(p) > 0 { + iov.Base = (*byte)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy byte + if len(oob) > 0 { + // receive at least one normal byte + if len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Control = (*byte)(unsafe.Pointer(&oob[0])) + msg.SetControllen(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = recvmsg(fd, &msg, flags); err != nil { + return + } + oobn = int(msg.Controllen) + recvflags = int(msg.Flags) + // source address is only specified if the socket is unconnected + if rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(&rsa) + } + return +} + +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) + +func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { + _, err = SendmsgN(fd, p, oob, to, flags) + return +} + +func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { + var ptr unsafe.Pointer + var salen _Socklen + if to != nil { + ptr, salen, err = to.sockaddr() + if err != nil { + return 0, err + } + } + var msg Msghdr + msg.Name = (*byte)(unsafe.Pointer(ptr)) + msg.Namelen = uint32(salen) + var iov Iovec + if len(p) > 0 { + iov.Base = (*byte)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy byte + if len(oob) > 0 { + // send at least one normal byte + if len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Control = (*byte)(unsafe.Pointer(&oob[0])) + msg.SetControllen(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = sendmsg(fd, &msg, flags); err != nil { + return 0, err + } + if len(oob) > 0 && len(p) == 0 { + n = 0 + } + return n, nil +} + +//sys kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) + +func Kevent(kq int, changes, events []Kevent_t, timeout *Timespec) (n int, err error) { + var change, event unsafe.Pointer + if len(changes) > 0 { + change = unsafe.Pointer(&changes[0]) + } + if len(events) > 0 { + event = unsafe.Pointer(&events[0]) + } + return kevent(kq, change, len(changes), event, len(events), timeout) +} + +//sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL + +// sysctlmib translates name to mib number and appends any additional args. +func sysctlmib(name string, args ...int) ([]_C_int, error) { + // Translate name to mib number. + mib, err := nametomib(name) + if err != nil { + return nil, err + } + + for _, a := range args { + mib = append(mib, _C_int(a)) + } + + return mib, nil +} + +func Sysctl(name string) (string, error) { + return SysctlArgs(name) +} + +func SysctlArgs(name string, args ...int) (string, error) { + mib, err := sysctlmib(name, args...) + if err != nil { + return "", err + } + + // Find size. + n := uintptr(0) + if err := sysctl(mib, nil, &n, nil, 0); err != nil { + return "", err + } + if n == 0 { + return "", nil + } + + // Read into buffer of that size. + buf := make([]byte, n) + if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { + return "", err + } + + // Throw away terminating NUL. + if n > 0 && buf[n-1] == '\x00' { + n-- + } + return string(buf[0:n]), nil +} + +func SysctlUint32(name string) (uint32, error) { + return SysctlUint32Args(name) +} + +func SysctlUint32Args(name string, args ...int) (uint32, error) { + mib, err := sysctlmib(name, args...) + if err != nil { + return 0, err + } + + n := uintptr(4) + buf := make([]byte, 4) + if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { + return 0, err + } + if n != 4 { + return 0, EIO + } + return *(*uint32)(unsafe.Pointer(&buf[0])), nil +} + +func SysctlUint64(name string, args ...int) (uint64, error) { + mib, err := sysctlmib(name, args...) + if err != nil { + return 0, err + } + + n := uintptr(8) + buf := make([]byte, 8) + if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { + return 0, err + } + if n != 8 { + return 0, EIO + } + return *(*uint64)(unsafe.Pointer(&buf[0])), nil +} + +func SysctlRaw(name string, args ...int) ([]byte, error) { + mib, err := sysctlmib(name, args...) + if err != nil { + return nil, err + } + + // Find size. + n := uintptr(0) + if err := sysctl(mib, nil, &n, nil, 0); err != nil { + return nil, err + } + if n == 0 { + return nil, nil + } + + // Read into buffer of that size. + buf := make([]byte, n) + if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil { + return nil, err + } + + // The actual call may return less than the original reported required + // size so ensure we deal with that. + return buf[:n], nil +} + +//sys utimes(path string, timeval *[2]Timeval) (err error) + +func Utimes(path string, tv []Timeval) error { + if tv == nil { + return utimes(path, nil) + } + if len(tv) != 2 { + return EINVAL + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +func UtimesNano(path string, ts []Timespec) error { + if ts == nil { + return utimes(path, nil) + } + // TODO: The BSDs can do utimensat with SYS_UTIMENSAT but it + // isn't supported by darwin so this uses utimes instead + if len(ts) != 2 { + return EINVAL + } + // Not as efficient as it could be because Timespec and + // Timeval have different types in the different OSes + tv := [2]Timeval{ + NsecToTimeval(TimespecToNsec(ts[0])), + NsecToTimeval(TimespecToNsec(ts[1])), + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +//sys futimes(fd int, timeval *[2]Timeval) (err error) + +func Futimes(fd int, tv []Timeval) error { + if tv == nil { + return futimes(fd, nil) + } + if len(tv) != 2 { + return EINVAL + } + return futimes(fd, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +//sys fcntl(fd int, cmd int, arg int) (val int, err error) + +// TODO: wrap +// Acct(name nil-string) (err error) +// Gethostuuid(uuid *byte, timeout *Timespec) (err error) +// Madvise(addr *byte, len int, behav int) (err error) +// Mprotect(addr *byte, len int, prot int) (err error) +// Msync(addr *byte, len int, flags int) (err error) +// Ptrace(req int, pid int, addr uintptr, data int) (ret uintptr, err error) + +var mapper = &mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, +} + +func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + return mapper.Mmap(fd, offset, length, prot, flags) +} + +func Munmap(b []byte) (err error) { + return mapper.Munmap(b) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_darwin.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_darwin.go new file mode 100644 index 0000000000000000000000000000000000000000..0d1771c3fca35ec02e2be3b144b6ff84a7e6330a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_darwin.go @@ -0,0 +1,509 @@ +// Copyright 2009,2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Darwin system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_bsd.go or syscall_unix.go. + +package unix + +import ( + errorspkg "errors" + "syscall" + "unsafe" +) + +const ImplementsGetwd = true + +func Getwd() (string, error) { + buf := make([]byte, 2048) + attrs, err := getAttrList(".", attrList{CommonAttr: attrCmnFullpath}, buf, 0) + if err == nil && len(attrs) == 1 && len(attrs[0]) >= 2 { + wd := string(attrs[0]) + // Sanity check that it's an absolute path and ends + // in a null byte, which we then strip. + if wd[0] == '/' && wd[len(wd)-1] == 0 { + return wd[:len(wd)-1], nil + } + } + // If pkg/os/getwd.go gets ENOTSUP, it will fall back to the + // slow algorithm. + return "", ENOTSUP +} + +type SockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 + raw RawSockaddrDatalink +} + +// Translate "kern.hostname" to []_C_int{0,1,2,3}. +func nametomib(name string) (mib []_C_int, err error) { + const siz = unsafe.Sizeof(mib[0]) + + // NOTE(rsc): It seems strange to set the buffer to have + // size CTL_MAXNAME+2 but use only CTL_MAXNAME + // as the size. I don't know why the +2 is here, but the + // kernel uses +2 for its own implementation of this function. + // I am scared that if we don't include the +2 here, the kernel + // will silently write 2 words farther than we specify + // and we'll get memory corruption. + var buf [CTL_MAXNAME + 2]_C_int + n := uintptr(CTL_MAXNAME) * siz + + p := (*byte)(unsafe.Pointer(&buf[0])) + bytes, err := ByteSliceFromString(name) + if err != nil { + return nil, err + } + + // Magic sysctl: "setting" 0.3 to a string name + // lets you read back the array of integers form. + if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil { + return nil, err + } + return buf[0 : n/siz], nil +} + +// ParseDirent parses up to max directory entries in buf, +// appending the names to names. It returns the number +// bytes consumed from buf, the number of entries added +// to names, and the new names slice. +func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) { + origlen := len(buf) + for max != 0 && len(buf) > 0 { + dirent := (*Dirent)(unsafe.Pointer(&buf[0])) + if dirent.Reclen == 0 { + buf = nil + break + } + buf = buf[dirent.Reclen:] + if dirent.Ino == 0 { // File absent in directory. + continue + } + bytes := (*[10000]byte)(unsafe.Pointer(&dirent.Name[0])) + var name = string(bytes[0:dirent.Namlen]) + if name == "." || name == ".." { // Useless names + continue + } + max-- + count++ + names = append(names, name) + } + return origlen - len(buf), count, names +} + +//sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error) +func PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) } +func PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) } + +const ( + attrBitMapCount = 5 + attrCmnFullpath = 0x08000000 +) + +type attrList struct { + bitmapCount uint16 + _ uint16 + CommonAttr uint32 + VolAttr uint32 + DirAttr uint32 + FileAttr uint32 + Forkattr uint32 +} + +func getAttrList(path string, attrList attrList, attrBuf []byte, options uint) (attrs [][]byte, err error) { + if len(attrBuf) < 4 { + return nil, errorspkg.New("attrBuf too small") + } + attrList.bitmapCount = attrBitMapCount + + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return nil, err + } + + _, _, e1 := Syscall6( + SYS_GETATTRLIST, + uintptr(unsafe.Pointer(_p0)), + uintptr(unsafe.Pointer(&attrList)), + uintptr(unsafe.Pointer(&attrBuf[0])), + uintptr(len(attrBuf)), + uintptr(options), + 0, + ) + if e1 != 0 { + return nil, e1 + } + size := *(*uint32)(unsafe.Pointer(&attrBuf[0])) + + // dat is the section of attrBuf that contains valid data, + // without the 4 byte length header. All attribute offsets + // are relative to dat. + dat := attrBuf + if int(size) < len(attrBuf) { + dat = dat[:size] + } + dat = dat[4:] // remove length prefix + + for i := uint32(0); int(i) < len(dat); { + header := dat[i:] + if len(header) < 8 { + return attrs, errorspkg.New("truncated attribute header") + } + datOff := *(*int32)(unsafe.Pointer(&header[0])) + attrLen := *(*uint32)(unsafe.Pointer(&header[4])) + if datOff < 0 || uint32(datOff)+attrLen > uint32(len(dat)) { + return attrs, errorspkg.New("truncated results; attrBuf too small") + } + end := uint32(datOff) + attrLen + attrs = append(attrs, dat[datOff:end]) + i = end + if r := i % 4; r != 0 { + i += (4 - r) + } + } + return +} + +//sysnb pipe() (r int, w int, err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + p[0], p[1], err = pipe() + return +} + +func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { + var _p0 unsafe.Pointer + var bufsize uintptr + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) + } + r0, _, e1 := Syscall(SYS_GETFSSTAT64, uintptr(_p0), bufsize, uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +/* + * Wrapped + */ + +//sys kill(pid int, signum int, posix int) (err error) + +func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(signum), 1) } + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys Chdir(path string) (err error) +//sys Chflags(path string, flags int) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(from int, to int) (err error) +//sys Exchangedata(path1 string, path2 string, options int) (err error) +//sys Exit(code int) +//sys Fchdir(fd int) (err error) +//sys Fchflags(fd int, flags int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 +//sys Fstatfs(fd int, stat *Statfs_t) (err error) = SYS_FSTATFS64 +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) = SYS_GETDIRENTRIES64 +//sys Getdtablesize() (size int) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) +//sysnb Getgid() (gid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgrp int) +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Getuid() (uid int) +//sysnb Issetugid() (tainted bool) +//sys Kqueue() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Listen(s int, backlog int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Mlock(b []byte) (err error) +//sys Mlockall(flags int) (err error) +//sys Mprotect(b []byte, prot int) (err error) +//sys Munlock(b []byte) (err error) +//sys Munlockall() (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Revoke(path string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sys Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sys Setlogin(name string) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sys Setprivexec(flag int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tp *Timeval) (err error) +//sysnb Setuid(uid int) (err error) +//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 +//sys Statfs(path string, stat *Statfs_t) (err error) = SYS_STATFS64 +//sys Symlink(path string, link string) (err error) +//sys Sync() (err error) +//sys Truncate(path string, length int64) (err error) +//sys Umask(newmask int) (oldmask int) +//sys Undelete(path string) (err error) +//sys Unlink(path string) (err error) +//sys Unmount(path string, flags int) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE + +/* + * Unimplemented + */ +// Profil +// Sigaction +// Sigprocmask +// Getlogin +// Sigpending +// Sigaltstack +// Ioctl +// Reboot +// Execve +// Vfork +// Sbrk +// Sstk +// Ovadvise +// Mincore +// Setitimer +// Swapon +// Select +// Sigsuspend +// Readv +// Writev +// Nfssvc +// Getfh +// Quotactl +// Mount +// Csops +// Waitid +// Add_profil +// Kdebug_trace +// Sigreturn +// Mmap +// Mlock +// Munlock +// Atsocket +// Kqueue_from_portset_np +// Kqueue_portset +// Getattrlist +// Setattrlist +// Getdirentriesattr +// Searchfs +// Delete +// Copyfile +// Poll +// Watchevent +// Waitevent +// Modwatch +// Getxattr +// Fgetxattr +// Setxattr +// Fsetxattr +// Removexattr +// Fremovexattr +// Listxattr +// Flistxattr +// Fsctl +// Initgroups +// Posix_spawn +// Nfsclnt +// Fhopen +// Minherit +// Semsys +// Msgsys +// Shmsys +// Semctl +// Semget +// Semop +// Msgctl +// Msgget +// Msgsnd +// Msgrcv +// Shmat +// Shmctl +// Shmdt +// Shmget +// Shm_open +// Shm_unlink +// Sem_open +// Sem_close +// Sem_unlink +// Sem_wait +// Sem_trywait +// Sem_post +// Sem_getvalue +// Sem_init +// Sem_destroy +// Open_extended +// Umask_extended +// Stat_extended +// Lstat_extended +// Fstat_extended +// Chmod_extended +// Fchmod_extended +// Access_extended +// Settid +// Gettid +// Setsgroups +// Getsgroups +// Setwgroups +// Getwgroups +// Mkfifo_extended +// Mkdir_extended +// Identitysvc +// Shared_region_check_np +// Shared_region_map_np +// __pthread_mutex_destroy +// __pthread_mutex_init +// __pthread_mutex_lock +// __pthread_mutex_trylock +// __pthread_mutex_unlock +// __pthread_cond_init +// __pthread_cond_destroy +// __pthread_cond_broadcast +// __pthread_cond_signal +// Setsid_with_pid +// __pthread_cond_timedwait +// Aio_fsync +// Aio_return +// Aio_suspend +// Aio_cancel +// Aio_error +// Aio_read +// Aio_write +// Lio_listio +// __pthread_cond_wait +// Iopolicysys +// Mlockall +// Munlockall +// __pthread_kill +// __pthread_sigmask +// __sigwait +// __disable_threadsignal +// __pthread_markcancel +// __pthread_canceled +// __semwait_signal +// Proc_info +// sendfile +// Stat64_extended +// Lstat64_extended +// Fstat64_extended +// __pthread_chdir +// __pthread_fchdir +// Audit +// Auditon +// Getauid +// Setauid +// Getaudit +// Setaudit +// Getaudit_addr +// Setaudit_addr +// Auditctl +// Bsdthread_create +// Bsdthread_terminate +// Stack_snapshot +// Bsdthread_register +// Workq_open +// Workq_ops +// __mac_execve +// __mac_syscall +// __mac_get_file +// __mac_set_file +// __mac_get_link +// __mac_set_link +// __mac_get_proc +// __mac_set_proc +// __mac_get_fd +// __mac_set_fd +// __mac_get_pid +// __mac_get_lcid +// __mac_get_lctx +// __mac_set_lctx +// Setlcid +// Read_nocancel +// Write_nocancel +// Open_nocancel +// Close_nocancel +// Wait4_nocancel +// Recvmsg_nocancel +// Sendmsg_nocancel +// Recvfrom_nocancel +// Accept_nocancel +// Msync_nocancel +// Fcntl_nocancel +// Select_nocancel +// Fsync_nocancel +// Connect_nocancel +// Sigsuspend_nocancel +// Readv_nocancel +// Writev_nocancel +// Sendto_nocancel +// Pread_nocancel +// Pwrite_nocancel +// Waitid_nocancel +// Poll_nocancel +// Msgsnd_nocancel +// Msgrcv_nocancel +// Sem_wait_nocancel +// Aio_suspend_nocancel +// __sigwait_nocancel +// __semwait_signal_nocancel +// __mac_mount +// __mac_get_mount +// __mac_getfsstat diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_darwin_386.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_darwin_386.go new file mode 100644 index 0000000000000000000000000000000000000000..c172a3da5a3ab666e19ad71b1977c8a55cd3414a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_darwin_386.go @@ -0,0 +1,77 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build 386,darwin + +package unix + +import ( + "syscall" + "unsafe" +) + +func Getpagesize() int { return 4096 } + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = int32(nsec / 1e9) + ts.Nsec = int32(nsec % 1e9) + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = int32(nsec % 1e9 / 1e3) + tv.Sec = int32(nsec / 1e9) + return +} + +//sysnb gettimeofday(tp *Timeval) (sec int32, usec int32, err error) +func Gettimeofday(tv *Timeval) (err error) { + // The tv passed to gettimeofday must be non-nil + // but is otherwise unused. The answers come back + // in the two registers. + sec, usec, err := gettimeofday(tv) + tv.Sec = int32(sec) + tv.Usec = int32(usec) + return err +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var length = uint64(count) + + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(*offset>>32), uintptr(unsafe.Pointer(&length)), 0, 0, 0, 0) + + written = int(length) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions +// of darwin/386 the syscall is called sysctl instead of __sysctl. +const SYS___SYSCTL = SYS_SYSCTL diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..fc1e5a4a8257de048e8af82fdc9e49841785bae0 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go @@ -0,0 +1,79 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,darwin + +package unix + +import ( + "syscall" + "unsafe" +) + +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) + +func Getpagesize() int { return 4096 } + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = int32(nsec % 1e9 / 1e3) + tv.Sec = int64(nsec / 1e9) + return +} + +//sysnb gettimeofday(tp *Timeval) (sec int64, usec int32, err error) +func Gettimeofday(tv *Timeval) (err error) { + // The tv passed to gettimeofday must be non-nil + // but is otherwise unused. The answers come back + // in the two registers. + sec, usec, err := gettimeofday(tv) + tv.Sec = sec + tv.Usec = usec + return err +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var length = uint64(count) + + _, _, e1 := Syscall6(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(unsafe.Pointer(&length)), 0, 0) + + written = int(length) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions +// of darwin/amd64 the syscall is called sysctl instead of __sysctl. +const SYS___SYSCTL = SYS_SYSCTL diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go new file mode 100644 index 0000000000000000000000000000000000000000..d286cf408d802757371504aada45c504ecc600d1 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_darwin_arm.go @@ -0,0 +1,71 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package unix + +import ( + "syscall" + "unsafe" +) + +func Getpagesize() int { return 4096 } + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = int32(nsec / 1e9) + ts.Nsec = int32(nsec % 1e9) + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = int32(nsec % 1e9 / 1e3) + tv.Sec = int32(nsec / 1e9) + return +} + +//sysnb gettimeofday(tp *Timeval) (sec int32, usec int32, err error) +func Gettimeofday(tv *Timeval) (err error) { + // The tv passed to gettimeofday must be non-nil + // but is otherwise unused. The answers come back + // in the two registers. + sec, usec, err := gettimeofday(tv) + tv.Sec = int32(sec) + tv.Usec = int32(usec) + return err +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var length = uint64(count) + + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(*offset>>32), uintptr(unsafe.Pointer(&length)), 0, 0, 0, 0) + + written = int(length) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) // sic diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go new file mode 100644 index 0000000000000000000000000000000000000000..c33905cdcd962c71da781e587101b32fda04e973 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go @@ -0,0 +1,77 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm64,darwin + +package unix + +import ( + "syscall" + "unsafe" +) + +func Getpagesize() int { return 16384 } + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = int32(nsec % 1e9 / 1e3) + tv.Sec = int64(nsec / 1e9) + return +} + +//sysnb gettimeofday(tp *Timeval) (sec int64, usec int32, err error) +func Gettimeofday(tv *Timeval) (err error) { + // The tv passed to gettimeofday must be non-nil + // but is otherwise unused. The answers come back + // in the two registers. + sec, usec, err := gettimeofday(tv) + tv.Sec = sec + tv.Usec = usec + return err +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var length = uint64(count) + + _, _, e1 := Syscall6(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(unsafe.Pointer(&length)), 0, 0) + + written = int(length) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) // sic + +// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions +// of darwin/arm64 the syscall is called sysctl instead of __sysctl. +const SYS___SYSCTL = SYS_SYSCTL diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_dragonfly.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_dragonfly.go new file mode 100644 index 0000000000000000000000000000000000000000..fbbe0dce2551921b47e955015b8f8b342c22ec77 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_dragonfly.go @@ -0,0 +1,411 @@ +// Copyright 2009,2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// FreeBSD system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_bsd.go or syscall_unix.go. + +package unix + +import "unsafe" + +type SockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 + Rcf uint16 + Route [16]uint16 + raw RawSockaddrDatalink +} + +// Translate "kern.hostname" to []_C_int{0,1,2,3}. +func nametomib(name string) (mib []_C_int, err error) { + const siz = unsafe.Sizeof(mib[0]) + + // NOTE(rsc): It seems strange to set the buffer to have + // size CTL_MAXNAME+2 but use only CTL_MAXNAME + // as the size. I don't know why the +2 is here, but the + // kernel uses +2 for its own implementation of this function. + // I am scared that if we don't include the +2 here, the kernel + // will silently write 2 words farther than we specify + // and we'll get memory corruption. + var buf [CTL_MAXNAME + 2]_C_int + n := uintptr(CTL_MAXNAME) * siz + + p := (*byte)(unsafe.Pointer(&buf[0])) + bytes, err := ByteSliceFromString(name) + if err != nil { + return nil, err + } + + // Magic sysctl: "setting" 0.3 to a string name + // lets you read back the array of integers form. + if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil { + return nil, err + } + return buf[0 : n/siz], nil +} + +// ParseDirent parses up to max directory entries in buf, +// appending the names to names. It returns the number +// bytes consumed from buf, the number of entries added +// to names, and the new names slice. +func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) { + origlen := len(buf) + for max != 0 && len(buf) > 0 { + dirent := (*Dirent)(unsafe.Pointer(&buf[0])) + reclen := int(16+dirent.Namlen+1+7) & ^7 + buf = buf[reclen:] + if dirent.Fileno == 0 { // File absent in directory. + continue + } + bytes := (*[10000]byte)(unsafe.Pointer(&dirent.Name[0])) + var name = string(bytes[0:dirent.Namlen]) + if name == "." || name == ".." { // Useless names + continue + } + max-- + count++ + names = append(names, name) + } + return origlen - len(buf), count, names +} + +//sysnb pipe() (r int, w int, err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + p[0], p[1], err = pipe() + return +} + +//sys extpread(fd int, p []byte, flags int, offset int64) (n int, err error) +func Pread(fd int, p []byte, offset int64) (n int, err error) { + return extpread(fd, p, 0, offset) +} + +//sys extpwrite(fd int, p []byte, flags int, offset int64) (n int, err error) +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + return extpwrite(fd, p, 0, offset) +} + +func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { + var _p0 unsafe.Pointer + var bufsize uintptr + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) + } + r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys Chdir(path string) (err error) +//sys Chflags(path string, flags int) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(from int, to int) (err error) +//sys Exit(code int) +//sys Fchdir(fd int) (err error) +//sys Fchflags(fd int, flags int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatfs(fd int, stat *Statfs_t) (err error) +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) +//sys Getdtablesize() (size int) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) +//sysnb Getgid() (gid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgrp int) +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Getuid() (uid int) +//sys Issetugid() (tainted bool) +//sys Kill(pid int, signum syscall.Signal) (err error) +//sys Kqueue() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Listen(s int, backlog int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Mlock(b []byte) (err error) +//sys Mlockall(flags int) (err error) +//sys Mprotect(b []byte, prot int) (err error) +//sys Munlock(b []byte) (err error) +//sys Munlockall() (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Revoke(path string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sysnb Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sys Setlogin(name string) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tp *Timeval) (err error) +//sysnb Setuid(uid int) (err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statfs(path string, stat *Statfs_t) (err error) +//sys Symlink(path string, link string) (err error) +//sys Sync() (err error) +//sys Truncate(path string, length int64) (err error) +//sys Umask(newmask int) (oldmask int) +//sys Undelete(path string) (err error) +//sys Unlink(path string) (err error) +//sys Unmount(path string, flags int) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE + +/* + * Unimplemented + * TODO(jsing): Update this list for DragonFly. + */ +// Profil +// Sigaction +// Sigprocmask +// Getlogin +// Sigpending +// Sigaltstack +// Ioctl +// Reboot +// Execve +// Vfork +// Sbrk +// Sstk +// Ovadvise +// Mincore +// Setitimer +// Swapon +// Select +// Sigsuspend +// Readv +// Writev +// Nfssvc +// Getfh +// Quotactl +// Mount +// Csops +// Waitid +// Add_profil +// Kdebug_trace +// Sigreturn +// Mmap +// Atsocket +// Kqueue_from_portset_np +// Kqueue_portset +// Getattrlist +// Setattrlist +// Getdirentriesattr +// Searchfs +// Delete +// Copyfile +// Poll +// Watchevent +// Waitevent +// Modwatch +// Getxattr +// Fgetxattr +// Setxattr +// Fsetxattr +// Removexattr +// Fremovexattr +// Listxattr +// Flistxattr +// Fsctl +// Initgroups +// Posix_spawn +// Nfsclnt +// Fhopen +// Minherit +// Semsys +// Msgsys +// Shmsys +// Semctl +// Semget +// Semop +// Msgctl +// Msgget +// Msgsnd +// Msgrcv +// Shmat +// Shmctl +// Shmdt +// Shmget +// Shm_open +// Shm_unlink +// Sem_open +// Sem_close +// Sem_unlink +// Sem_wait +// Sem_trywait +// Sem_post +// Sem_getvalue +// Sem_init +// Sem_destroy +// Open_extended +// Umask_extended +// Stat_extended +// Lstat_extended +// Fstat_extended +// Chmod_extended +// Fchmod_extended +// Access_extended +// Settid +// Gettid +// Setsgroups +// Getsgroups +// Setwgroups +// Getwgroups +// Mkfifo_extended +// Mkdir_extended +// Identitysvc +// Shared_region_check_np +// Shared_region_map_np +// __pthread_mutex_destroy +// __pthread_mutex_init +// __pthread_mutex_lock +// __pthread_mutex_trylock +// __pthread_mutex_unlock +// __pthread_cond_init +// __pthread_cond_destroy +// __pthread_cond_broadcast +// __pthread_cond_signal +// Setsid_with_pid +// __pthread_cond_timedwait +// Aio_fsync +// Aio_return +// Aio_suspend +// Aio_cancel +// Aio_error +// Aio_read +// Aio_write +// Lio_listio +// __pthread_cond_wait +// Iopolicysys +// __pthread_kill +// __pthread_sigmask +// __sigwait +// __disable_threadsignal +// __pthread_markcancel +// __pthread_canceled +// __semwait_signal +// Proc_info +// Stat64_extended +// Lstat64_extended +// Fstat64_extended +// __pthread_chdir +// __pthread_fchdir +// Audit +// Auditon +// Getauid +// Setauid +// Getaudit +// Setaudit +// Getaudit_addr +// Setaudit_addr +// Auditctl +// Bsdthread_create +// Bsdthread_terminate +// Stack_snapshot +// Bsdthread_register +// Workq_open +// Workq_ops +// __mac_execve +// __mac_syscall +// __mac_get_file +// __mac_set_file +// __mac_get_link +// __mac_set_link +// __mac_get_proc +// __mac_set_proc +// __mac_get_fd +// __mac_set_fd +// __mac_get_pid +// __mac_get_lcid +// __mac_get_lctx +// __mac_set_lctx +// Setlcid +// Read_nocancel +// Write_nocancel +// Open_nocancel +// Close_nocancel +// Wait4_nocancel +// Recvmsg_nocancel +// Sendmsg_nocancel +// Recvfrom_nocancel +// Accept_nocancel +// Msync_nocancel +// Fcntl_nocancel +// Select_nocancel +// Fsync_nocancel +// Connect_nocancel +// Sigsuspend_nocancel +// Readv_nocancel +// Writev_nocancel +// Sendto_nocancel +// Pread_nocancel +// Pwrite_nocancel +// Waitid_nocancel +// Poll_nocancel +// Msgsnd_nocancel +// Msgrcv_nocancel +// Sem_wait_nocancel +// Aio_suspend_nocancel +// __sigwait_nocancel +// __semwait_signal_nocancel +// __mac_mount +// __mac_get_mount +// __mac_getfsstat diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..da7cb7982cddb54f21998e7043bb95a30fd74609 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go @@ -0,0 +1,61 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,dragonfly + +package unix + +import ( + "syscall" + "unsafe" +) + +func Getpagesize() int { return 4096 } + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = nsec % 1e9 / 1e3 + tv.Sec = int64(nsec / 1e9) + return +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var writtenOut uint64 = 0 + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0, 0) + + written = int(writtenOut) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_freebsd.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_freebsd.go new file mode 100644 index 0000000000000000000000000000000000000000..ec56ed608a30e861ab1cd524f5dead8edf58cd8e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_freebsd.go @@ -0,0 +1,682 @@ +// Copyright 2009,2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// FreeBSD system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_bsd.go or syscall_unix.go. + +package unix + +import "unsafe" + +type SockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [46]int8 + raw RawSockaddrDatalink +} + +// Translate "kern.hostname" to []_C_int{0,1,2,3}. +func nametomib(name string) (mib []_C_int, err error) { + const siz = unsafe.Sizeof(mib[0]) + + // NOTE(rsc): It seems strange to set the buffer to have + // size CTL_MAXNAME+2 but use only CTL_MAXNAME + // as the size. I don't know why the +2 is here, but the + // kernel uses +2 for its own implementation of this function. + // I am scared that if we don't include the +2 here, the kernel + // will silently write 2 words farther than we specify + // and we'll get memory corruption. + var buf [CTL_MAXNAME + 2]_C_int + n := uintptr(CTL_MAXNAME) * siz + + p := (*byte)(unsafe.Pointer(&buf[0])) + bytes, err := ByteSliceFromString(name) + if err != nil { + return nil, err + } + + // Magic sysctl: "setting" 0.3 to a string name + // lets you read back the array of integers form. + if err = sysctl([]_C_int{0, 3}, p, &n, &bytes[0], uintptr(len(name))); err != nil { + return nil, err + } + return buf[0 : n/siz], nil +} + +// ParseDirent parses up to max directory entries in buf, +// appending the names to names. It returns the number +// bytes consumed from buf, the number of entries added +// to names, and the new names slice. +func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) { + origlen := len(buf) + for max != 0 && len(buf) > 0 { + dirent := (*Dirent)(unsafe.Pointer(&buf[0])) + if dirent.Reclen == 0 { + buf = nil + break + } + buf = buf[dirent.Reclen:] + if dirent.Fileno == 0 { // File absent in directory. + continue + } + bytes := (*[10000]byte)(unsafe.Pointer(&dirent.Name[0])) + var name = string(bytes[0:dirent.Namlen]) + if name == "." || name == ".." { // Useless names + continue + } + max-- + count++ + names = append(names, name) + } + return origlen - len(buf), count, names +} + +//sysnb pipe() (r int, w int, err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + p[0], p[1], err = pipe() + return +} + +func GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, error) { + var value IPMreqn + vallen := _Socklen(SizeofIPMreqn) + errno := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, errno +} + +func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq)) +} + +func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept4(fd, &rsa, &len, flags) + if err != nil { + return + } + if len > SizeofSockaddrAny { + panic("RawSockaddrAny too small") + } + sa, err = anyToSockaddr(&rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { + var _p0 unsafe.Pointer + var bufsize uintptr + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) + } + r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// Derive extattr namespace and attribute name + +func xattrnamespace(fullattr string) (ns int, attr string, err error) { + s := -1 + for idx, val := range fullattr { + if val == '.' { + s = idx + break + } + } + + if s == -1 { + return -1, "", ENOATTR + } + + namespace := fullattr[0:s] + attr = fullattr[s+1:] + + switch namespace { + case "user": + return EXTATTR_NAMESPACE_USER, attr, nil + case "system": + return EXTATTR_NAMESPACE_SYSTEM, attr, nil + default: + return -1, "", ENOATTR + } +} + +func initxattrdest(dest []byte, idx int) (d unsafe.Pointer) { + if len(dest) > idx { + return unsafe.Pointer(&dest[idx]) + } else { + return unsafe.Pointer(_zero) + } +} + +// FreeBSD implements its own syscalls to handle extended attributes + +func Getxattr(file string, attr string, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsize := len(dest) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return -1, err + } + + return ExtattrGetFile(file, nsid, a, uintptr(d), destsize) +} + +func Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsize := len(dest) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return -1, err + } + + return ExtattrGetFd(fd, nsid, a, uintptr(d), destsize) +} + +func Lgetxattr(link string, attr string, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsize := len(dest) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return -1, err + } + + return ExtattrGetLink(link, nsid, a, uintptr(d), destsize) +} + +// flags are unused on FreeBSD + +func Fsetxattr(fd int, attr string, data []byte, flags int) (err error) { + d := unsafe.Pointer(&data[0]) + datasiz := len(data) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + _, err = ExtattrSetFd(fd, nsid, a, uintptr(d), datasiz) + return +} + +func Setxattr(file string, attr string, data []byte, flags int) (err error) { + d := unsafe.Pointer(&data[0]) + datasiz := len(data) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + _, err = ExtattrSetFile(file, nsid, a, uintptr(d), datasiz) + return +} + +func Lsetxattr(link string, attr string, data []byte, flags int) (err error) { + d := unsafe.Pointer(&data[0]) + datasiz := len(data) + + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + _, err = ExtattrSetLink(link, nsid, a, uintptr(d), datasiz) + return +} + +func Removexattr(file string, attr string) (err error) { + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + err = ExtattrDeleteFile(file, nsid, a) + return +} + +func Fremovexattr(fd int, attr string) (err error) { + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + err = ExtattrDeleteFd(fd, nsid, a) + return +} + +func Lremovexattr(link string, attr string) (err error) { + nsid, a, err := xattrnamespace(attr) + if err != nil { + return + } + + err = ExtattrDeleteLink(link, nsid, a) + return +} + +func Listxattr(file string, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsiz := len(dest) + + // FreeBSD won't allow you to list xattrs from multiple namespaces + s := 0 + var e error + for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} { + stmp, e := ExtattrListFile(file, nsid, uintptr(d), destsiz) + + /* Errors accessing system attrs are ignored so that + * we can implement the Linux-like behavior of omitting errors that + * we don't have read permissions on + * + * Linux will still error if we ask for user attributes on a file that + * we don't have read permissions on, so don't ignore those errors + */ + if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER { + e = nil + continue + } else if e != nil { + return s, e + } + + s += stmp + destsiz -= s + if destsiz < 0 { + destsiz = 0 + } + d = initxattrdest(dest, s) + } + + return s, e +} + +func Flistxattr(fd int, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsiz := len(dest) + + s := 0 + var e error + for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} { + stmp, e := ExtattrListFd(fd, nsid, uintptr(d), destsiz) + if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER { + e = nil + continue + } else if e != nil { + return s, e + } + + s += stmp + destsiz -= s + if destsiz < 0 { + destsiz = 0 + } + d = initxattrdest(dest, s) + } + + return s, e +} + +func Llistxattr(link string, dest []byte) (sz int, err error) { + d := initxattrdest(dest, 0) + destsiz := len(dest) + + s := 0 + var e error + for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} { + stmp, e := ExtattrListLink(link, nsid, uintptr(d), destsiz) + if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER { + e = nil + continue + } else if e != nil { + return s, e + } + + s += stmp + destsiz -= s + if destsiz < 0 { + destsiz = 0 + } + d = initxattrdest(dest, s) + } + + return s, e +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys Chdir(path string) (err error) +//sys Chflags(path string, flags int) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(from int, to int) (err error) +//sys Exit(code int) +//sys ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) +//sys ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) +//sys ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) +//sys ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) +//sys ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_POSIX_FADVISE +//sys Fchdir(fd int) (err error) +//sys Fchflags(fd int, flags int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatfs(fd int, stat *Statfs_t) (err error) +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sys Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) +//sys Getdtablesize() (size int) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) +//sysnb Getgid() (gid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgrp int) +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Getuid() (uid int) +//sys Issetugid() (tainted bool) +//sys Kill(pid int, signum syscall.Signal) (err error) +//sys Kqueue() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Listen(s int, backlog int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Mlock(b []byte) (err error) +//sys Mlockall(flags int) (err error) +//sys Mprotect(b []byte, prot int) (err error) +//sys Munlock(b []byte) (err error) +//sys Munlockall() (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Revoke(path string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sysnb Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sys Setlogin(name string) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tp *Timeval) (err error) +//sysnb Setuid(uid int) (err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statfs(path string, stat *Statfs_t) (err error) +//sys Symlink(path string, link string) (err error) +//sys Sync() (err error) +//sys Truncate(path string, length int64) (err error) +//sys Umask(newmask int) (oldmask int) +//sys Undelete(path string) (err error) +//sys Unlink(path string) (err error) +//sys Unmount(path string, flags int) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE +//sys accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) + +/* + * Unimplemented + */ +// Profil +// Sigaction +// Sigprocmask +// Getlogin +// Sigpending +// Sigaltstack +// Ioctl +// Reboot +// Execve +// Vfork +// Sbrk +// Sstk +// Ovadvise +// Mincore +// Setitimer +// Swapon +// Select +// Sigsuspend +// Readv +// Writev +// Nfssvc +// Getfh +// Quotactl +// Mount +// Csops +// Waitid +// Add_profil +// Kdebug_trace +// Sigreturn +// Mmap +// Mlock +// Munlock +// Atsocket +// Kqueue_from_portset_np +// Kqueue_portset +// Getattrlist +// Setattrlist +// Getdirentriesattr +// Searchfs +// Delete +// Copyfile +// Poll +// Watchevent +// Waitevent +// Modwatch +// Getxattr +// Fgetxattr +// Setxattr +// Fsetxattr +// Removexattr +// Fremovexattr +// Listxattr +// Flistxattr +// Fsctl +// Initgroups +// Posix_spawn +// Nfsclnt +// Fhopen +// Minherit +// Semsys +// Msgsys +// Shmsys +// Semctl +// Semget +// Semop +// Msgctl +// Msgget +// Msgsnd +// Msgrcv +// Shmat +// Shmctl +// Shmdt +// Shmget +// Shm_open +// Shm_unlink +// Sem_open +// Sem_close +// Sem_unlink +// Sem_wait +// Sem_trywait +// Sem_post +// Sem_getvalue +// Sem_init +// Sem_destroy +// Open_extended +// Umask_extended +// Stat_extended +// Lstat_extended +// Fstat_extended +// Chmod_extended +// Fchmod_extended +// Access_extended +// Settid +// Gettid +// Setsgroups +// Getsgroups +// Setwgroups +// Getwgroups +// Mkfifo_extended +// Mkdir_extended +// Identitysvc +// Shared_region_check_np +// Shared_region_map_np +// __pthread_mutex_destroy +// __pthread_mutex_init +// __pthread_mutex_lock +// __pthread_mutex_trylock +// __pthread_mutex_unlock +// __pthread_cond_init +// __pthread_cond_destroy +// __pthread_cond_broadcast +// __pthread_cond_signal +// Setsid_with_pid +// __pthread_cond_timedwait +// Aio_fsync +// Aio_return +// Aio_suspend +// Aio_cancel +// Aio_error +// Aio_read +// Aio_write +// Lio_listio +// __pthread_cond_wait +// Iopolicysys +// Mlockall +// Munlockall +// __pthread_kill +// __pthread_sigmask +// __sigwait +// __disable_threadsignal +// __pthread_markcancel +// __pthread_canceled +// __semwait_signal +// Proc_info +// Stat64_extended +// Lstat64_extended +// Fstat64_extended +// __pthread_chdir +// __pthread_fchdir +// Audit +// Auditon +// Getauid +// Setauid +// Getaudit +// Setaudit +// Getaudit_addr +// Setaudit_addr +// Auditctl +// Bsdthread_create +// Bsdthread_terminate +// Stack_snapshot +// Bsdthread_register +// Workq_open +// Workq_ops +// __mac_execve +// __mac_syscall +// __mac_get_file +// __mac_set_file +// __mac_get_link +// __mac_set_link +// __mac_get_proc +// __mac_set_proc +// __mac_get_fd +// __mac_set_fd +// __mac_get_pid +// __mac_get_lcid +// __mac_get_lctx +// __mac_set_lctx +// Setlcid +// Read_nocancel +// Write_nocancel +// Open_nocancel +// Close_nocancel +// Wait4_nocancel +// Recvmsg_nocancel +// Sendmsg_nocancel +// Recvfrom_nocancel +// Accept_nocancel +// Msync_nocancel +// Fcntl_nocancel +// Select_nocancel +// Fsync_nocancel +// Connect_nocancel +// Sigsuspend_nocancel +// Readv_nocancel +// Writev_nocancel +// Sendto_nocancel +// Pread_nocancel +// Pwrite_nocancel +// Waitid_nocancel +// Poll_nocancel +// Msgsnd_nocancel +// Msgrcv_nocancel +// Sem_wait_nocancel +// Aio_suspend_nocancel +// __sigwait_nocancel +// __semwait_signal_nocancel +// __mac_mount +// __mac_get_mount +// __mac_getfsstat diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go new file mode 100644 index 0000000000000000000000000000000000000000..6a0cd804d88275ee6f6107b9931ef90c8a2c4ddb --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_freebsd_386.go @@ -0,0 +1,61 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build 386,freebsd + +package unix + +import ( + "syscall" + "unsafe" +) + +func Getpagesize() int { return 4096 } + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = int32(nsec / 1e9) + ts.Nsec = int32(nsec % 1e9) + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = int32(nsec % 1e9 / 1e3) + tv.Sec = int32(nsec / 1e9) + return +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var writtenOut uint64 = 0 + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr((*offset)>>32), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0) + + written = int(writtenOut) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..e142540efa428ac99f0eceb55f60655b9734ec32 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go @@ -0,0 +1,61 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,freebsd + +package unix + +import ( + "syscall" + "unsafe" +) + +func Getpagesize() int { return 4096 } + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = nsec % 1e9 / 1e3 + tv.Sec = int64(nsec / 1e9) + return +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var writtenOut uint64 = 0 + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0, 0) + + written = int(writtenOut) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go new file mode 100644 index 0000000000000000000000000000000000000000..5504cb1255941c90fdfa09ac8615de5729fb4adf --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go @@ -0,0 +1,61 @@ +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm,freebsd + +package unix + +import ( + "syscall" + "unsafe" +) + +func Getpagesize() int { return 4096 } + +func TimespecToNsec(ts Timespec) int64 { return ts.Sec*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = int32(nsec % 1e9) + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = int32(nsec % 1e9 / 1e3) + tv.Sec = nsec / 1e9 + return +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + var writtenOut uint64 = 0 + _, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr((*offset)>>32), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0) + + written = int(writtenOut) + + if e1 != 0 { + err = e1 + } + return +} + +func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_linux.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_linux.go new file mode 100644 index 0000000000000000000000000000000000000000..a4b35420fd299393578581d7e01d857d2e72606a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -0,0 +1,1116 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Linux system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and +// wrap it in our own nicer implementation. + +package unix + +import ( + "syscall" + "unsafe" +) + +/* + * Wrapped + */ + +func Access(path string, mode uint32) (err error) { + return Faccessat(AT_FDCWD, path, mode, 0) +} + +func Chmod(path string, mode uint32) (err error) { + return Fchmodat(AT_FDCWD, path, mode, 0) +} + +func Chown(path string, uid int, gid int) (err error) { + return Fchownat(AT_FDCWD, path, uid, gid, 0) +} + +func Creat(path string, mode uint32) (fd int, err error) { + return Open(path, O_CREAT|O_WRONLY|O_TRUNC, mode) +} + +//sys Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) + +func Link(oldpath string, newpath string) (err error) { + return Linkat(AT_FDCWD, oldpath, AT_FDCWD, newpath, 0) +} + +func Mkdir(path string, mode uint32) (err error) { + return Mkdirat(AT_FDCWD, path, mode) +} + +func Mknod(path string, mode uint32, dev int) (err error) { + return Mknodat(AT_FDCWD, path, mode, dev) +} + +func Open(path string, mode int, perm uint32) (fd int, err error) { + return openat(AT_FDCWD, path, mode|O_LARGEFILE, perm) +} + +//sys openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) + +func Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + return openat(dirfd, path, flags|O_LARGEFILE, mode) +} + +//sys poll(fds *PollFd, nfd int, timeout int) (n int, err error) + +func Poll(fds []PollFd, timeout int) (n int, err error) { + if len(fds) == 0 { + return poll(nil, 0, timeout) + } + return poll(&fds[0], len(fds), timeout) +} + +//sys readlinkat(dirfd int, path string, buf []byte) (n int, err error) + +func Readlink(path string, buf []byte) (n int, err error) { + return readlinkat(AT_FDCWD, path, buf) +} + +func Rename(oldpath string, newpath string) (err error) { + return Renameat(AT_FDCWD, oldpath, AT_FDCWD, newpath) +} + +func Rmdir(path string) error { + return unlinkat(AT_FDCWD, path, AT_REMOVEDIR) +} + +//sys symlinkat(oldpath string, newdirfd int, newpath string) (err error) + +func Symlink(oldpath string, newpath string) (err error) { + return symlinkat(oldpath, AT_FDCWD, newpath) +} + +func Unlink(path string) error { + return unlinkat(AT_FDCWD, path, 0) +} + +//sys unlinkat(dirfd int, path string, flags int) (err error) + +func Unlinkat(dirfd int, path string, flags int) error { + return unlinkat(dirfd, path, flags) +} + +//sys utimes(path string, times *[2]Timeval) (err error) + +func Utimes(path string, tv []Timeval) error { + if tv == nil { + err := utimensat(AT_FDCWD, path, nil, 0) + if err != ENOSYS { + return err + } + return utimes(path, nil) + } + if len(tv) != 2 { + return EINVAL + } + var ts [2]Timespec + ts[0] = NsecToTimespec(TimevalToNsec(tv[0])) + ts[1] = NsecToTimespec(TimevalToNsec(tv[1])) + err := utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) + if err != ENOSYS { + return err + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +//sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) + +func UtimesNano(path string, ts []Timespec) error { + if ts == nil { + err := utimensat(AT_FDCWD, path, nil, 0) + if err != ENOSYS { + return err + } + return utimes(path, nil) + } + if len(ts) != 2 { + return EINVAL + } + err := utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) + if err != ENOSYS { + return err + } + // If the utimensat syscall isn't available (utimensat was added to Linux + // in 2.6.22, Released, 8 July 2007) then fall back to utimes + var tv [2]Timeval + for i := 0; i < 2; i++ { + tv[i].Sec = ts[i].Sec + tv[i].Usec = ts[i].Nsec / 1000 + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error { + if ts == nil { + return utimensat(dirfd, path, nil, flags) + } + if len(ts) != 2 { + return EINVAL + } + return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags) +} + +//sys futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) + +func Futimesat(dirfd int, path string, tv []Timeval) error { + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + if tv == nil { + return futimesat(dirfd, pathp, nil) + } + if len(tv) != 2 { + return EINVAL + } + return futimesat(dirfd, pathp, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +func Futimes(fd int, tv []Timeval) (err error) { + // Believe it or not, this is the best we can do on Linux + // (and is what glibc does). + return Utimes("/proc/self/fd/"+itoa(fd), tv) +} + +const ImplementsGetwd = true + +//sys Getcwd(buf []byte) (n int, err error) + +func Getwd() (wd string, err error) { + var buf [PathMax]byte + n, err := Getcwd(buf[0:]) + if err != nil { + return "", err + } + // Getcwd returns the number of bytes written to buf, including the NUL. + if n < 1 || n > len(buf) || buf[n-1] != 0 { + return "", EINVAL + } + return string(buf[0 : n-1]), nil +} + +func Getgroups() (gids []int, err error) { + n, err := getgroups(0, nil) + if err != nil { + return nil, err + } + if n == 0 { + return nil, nil + } + + // Sanity check group count. Max is 1<<16 on Linux. + if n < 0 || n > 1<<20 { + return nil, EINVAL + } + + a := make([]_Gid_t, n) + n, err = getgroups(n, &a[0]) + if err != nil { + return nil, err + } + gids = make([]int, n) + for i, v := range a[0:n] { + gids[i] = int(v) + } + return +} + +func Setgroups(gids []int) (err error) { + if len(gids) == 0 { + return setgroups(0, nil) + } + + a := make([]_Gid_t, len(gids)) + for i, v := range gids { + a[i] = _Gid_t(v) + } + return setgroups(len(a), &a[0]) +} + +type WaitStatus uint32 + +// Wait status is 7 bits at bottom, either 0 (exited), +// 0x7F (stopped), or a signal number that caused an exit. +// The 0x80 bit is whether there was a core dump. +// An extra number (exit code, signal causing a stop) +// is in the high bits. At least that's the idea. +// There are various irregularities. For example, the +// "continued" status is 0xFFFF, distinguishing itself +// from stopped via the core dump bit. + +const ( + mask = 0x7F + core = 0x80 + exited = 0x00 + stopped = 0x7F + shift = 8 +) + +func (w WaitStatus) Exited() bool { return w&mask == exited } + +func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != exited } + +func (w WaitStatus) Stopped() bool { return w&0xFF == stopped } + +func (w WaitStatus) Continued() bool { return w == 0xFFFF } + +func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 } + +func (w WaitStatus) ExitStatus() int { + if !w.Exited() { + return -1 + } + return int(w>>shift) & 0xFF +} + +func (w WaitStatus) Signal() syscall.Signal { + if !w.Signaled() { + return -1 + } + return syscall.Signal(w & mask) +} + +func (w WaitStatus) StopSignal() syscall.Signal { + if !w.Stopped() { + return -1 + } + return syscall.Signal(w>>shift) & 0xFF +} + +func (w WaitStatus) TrapCause() int { + if w.StopSignal() != SIGTRAP { + return -1 + } + return int(w>>shift) >> 8 +} + +//sys wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) + +func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) { + var status _C_int + wpid, err = wait4(pid, &status, options, rusage) + if wstatus != nil { + *wstatus = WaitStatus(status) + } + return +} + +func Mkfifo(path string, mode uint32) (err error) { + return Mknod(path, mode|S_IFIFO, 0) +} + +func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Family = AF_INET + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil +} + +func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Family = AF_INET6 + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + sa.raw.Scope_id = sa.ZoneId + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil +} + +func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { + name := sa.Name + n := len(name) + if n >= len(sa.raw.Path) { + return nil, 0, EINVAL + } + sa.raw.Family = AF_UNIX + for i := 0; i < n; i++ { + sa.raw.Path[i] = int8(name[i]) + } + // length is family (uint16), name, NUL. + sl := _Socklen(2) + if n > 0 { + sl += _Socklen(n) + 1 + } + if sa.raw.Path[0] == '@' { + sa.raw.Path[0] = 0 + // Don't count trailing NUL for abstract address. + sl-- + } + + return unsafe.Pointer(&sa.raw), sl, nil +} + +type SockaddrLinklayer struct { + Protocol uint16 + Ifindex int + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]byte + raw RawSockaddrLinklayer +} + +func (sa *SockaddrLinklayer) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Ifindex < 0 || sa.Ifindex > 0x7fffffff { + return nil, 0, EINVAL + } + sa.raw.Family = AF_PACKET + sa.raw.Protocol = sa.Protocol + sa.raw.Ifindex = int32(sa.Ifindex) + sa.raw.Hatype = sa.Hatype + sa.raw.Pkttype = sa.Pkttype + sa.raw.Halen = sa.Halen + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrLinklayer, nil +} + +type SockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 + raw RawSockaddrNetlink +} + +func (sa *SockaddrNetlink) sockaddr() (unsafe.Pointer, _Socklen, error) { + sa.raw.Family = AF_NETLINK + sa.raw.Pad = sa.Pad + sa.raw.Pid = sa.Pid + sa.raw.Groups = sa.Groups + return unsafe.Pointer(&sa.raw), SizeofSockaddrNetlink, nil +} + +type SockaddrHCI struct { + Dev uint16 + Channel uint16 + raw RawSockaddrHCI +} + +func (sa *SockaddrHCI) sockaddr() (unsafe.Pointer, _Socklen, error) { + sa.raw.Family = AF_BLUETOOTH + sa.raw.Dev = sa.Dev + sa.raw.Channel = sa.Channel + return unsafe.Pointer(&sa.raw), SizeofSockaddrHCI, nil +} + +func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) { + switch rsa.Addr.Family { + case AF_NETLINK: + pp := (*RawSockaddrNetlink)(unsafe.Pointer(rsa)) + sa := new(SockaddrNetlink) + sa.Family = pp.Family + sa.Pad = pp.Pad + sa.Pid = pp.Pid + sa.Groups = pp.Groups + return sa, nil + + case AF_PACKET: + pp := (*RawSockaddrLinklayer)(unsafe.Pointer(rsa)) + sa := new(SockaddrLinklayer) + sa.Protocol = pp.Protocol + sa.Ifindex = int(pp.Ifindex) + sa.Hatype = pp.Hatype + sa.Pkttype = pp.Pkttype + sa.Halen = pp.Halen + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_UNIX: + pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa)) + sa := new(SockaddrUnix) + if pp.Path[0] == 0 { + // "Abstract" Unix domain socket. + // Rewrite leading NUL as @ for textual display. + // (This is the standard convention.) + // Not friendly to overwrite in place, + // but the callers below don't care. + pp.Path[0] = '@' + } + + // Assume path ends at NUL. + // This is not technically the Linux semantics for + // abstract Unix domain sockets--they are supposed + // to be uninterpreted fixed-size binary blobs--but + // everyone uses this convention. + n := 0 + for n < len(pp.Path) && pp.Path[n] != 0 { + n++ + } + bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] + sa.Name = string(bytes) + return sa, nil + + case AF_INET: + pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet4) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_INET6: + pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet6) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + sa.ZoneId = pp.Scope_id + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + } + return nil, EAFNOSUPPORT +} + +func Accept(fd int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept(fd, &rsa, &len) + if err != nil { + return + } + sa, err = anyToSockaddr(&rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +func Accept4(fd int, flags int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept4(fd, &rsa, &len, flags) + if err != nil { + return + } + if len > SizeofSockaddrAny { + panic("RawSockaddrAny too small") + } + sa, err = anyToSockaddr(&rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +func Getsockname(fd int) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if err = getsockname(fd, &rsa, &len); err != nil { + return + } + return anyToSockaddr(&rsa) +} + +func GetsockoptInet4Addr(fd, level, opt int) (value [4]byte, err error) { + vallen := _Socklen(4) + err = getsockopt(fd, level, opt, unsafe.Pointer(&value[0]), &vallen) + return value, err +} + +func GetsockoptIPMreq(fd, level, opt int) (*IPMreq, error) { + var value IPMreq + vallen := _Socklen(SizeofIPMreq) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, error) { + var value IPMreqn + vallen := _Socklen(SizeofIPMreqn) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptIPv6Mreq(fd, level, opt int) (*IPv6Mreq, error) { + var value IPv6Mreq + vallen := _Socklen(SizeofIPv6Mreq) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptIPv6MTUInfo(fd, level, opt int) (*IPv6MTUInfo, error) { + var value IPv6MTUInfo + vallen := _Socklen(SizeofIPv6MTUInfo) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptICMPv6Filter(fd, level, opt int) (*ICMPv6Filter, error) { + var value ICMPv6Filter + vallen := _Socklen(SizeofICMPv6Filter) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func GetsockoptUcred(fd, level, opt int) (*Ucred, error) { + var value Ucred + vallen := _Socklen(SizeofUcred) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen) + return &value, err +} + +func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq)) +} + +func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { + var msg Msghdr + var rsa RawSockaddrAny + msg.Name = (*byte)(unsafe.Pointer(&rsa)) + msg.Namelen = uint32(SizeofSockaddrAny) + var iov Iovec + if len(p) > 0 { + iov.Base = (*byte)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy byte + if len(oob) > 0 { + // receive at least one normal byte + if len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Control = (*byte)(unsafe.Pointer(&oob[0])) + msg.SetControllen(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = recvmsg(fd, &msg, flags); err != nil { + return + } + oobn = int(msg.Controllen) + recvflags = int(msg.Flags) + // source address is only specified if the socket is unconnected + if rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(&rsa) + } + return +} + +func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { + _, err = SendmsgN(fd, p, oob, to, flags) + return +} + +func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { + var ptr unsafe.Pointer + var salen _Socklen + if to != nil { + var err error + ptr, salen, err = to.sockaddr() + if err != nil { + return 0, err + } + } + var msg Msghdr + msg.Name = (*byte)(unsafe.Pointer(ptr)) + msg.Namelen = uint32(salen) + var iov Iovec + if len(p) > 0 { + iov.Base = (*byte)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy byte + if len(oob) > 0 { + // send at least one normal byte + if len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Control = (*byte)(unsafe.Pointer(&oob[0])) + msg.SetControllen(len(oob)) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = sendmsg(fd, &msg, flags); err != nil { + return 0, err + } + if len(oob) > 0 && len(p) == 0 { + n = 0 + } + return n, nil +} + +// BindToDevice binds the socket associated with fd to device. +func BindToDevice(fd int, device string) (err error) { + return SetsockoptString(fd, SOL_SOCKET, SO_BINDTODEVICE, device) +} + +//sys ptrace(request int, pid int, addr uintptr, data uintptr) (err error) + +func ptracePeek(req int, pid int, addr uintptr, out []byte) (count int, err error) { + // The peek requests are machine-size oriented, so we wrap it + // to retrieve arbitrary-length data. + + // The ptrace syscall differs from glibc's ptrace. + // Peeks returns the word in *data, not as the return value. + + var buf [sizeofPtr]byte + + // Leading edge. PEEKTEXT/PEEKDATA don't require aligned + // access (PEEKUSER warns that it might), but if we don't + // align our reads, we might straddle an unmapped page + // boundary and not get the bytes leading up to the page + // boundary. + n := 0 + if addr%sizeofPtr != 0 { + err = ptrace(req, pid, addr-addr%sizeofPtr, uintptr(unsafe.Pointer(&buf[0]))) + if err != nil { + return 0, err + } + n += copy(out, buf[addr%sizeofPtr:]) + out = out[n:] + } + + // Remainder. + for len(out) > 0 { + // We use an internal buffer to guarantee alignment. + // It's not documented if this is necessary, but we're paranoid. + err = ptrace(req, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0]))) + if err != nil { + return n, err + } + copied := copy(out, buf[0:]) + n += copied + out = out[copied:] + } + + return n, nil +} + +func PtracePeekText(pid int, addr uintptr, out []byte) (count int, err error) { + return ptracePeek(PTRACE_PEEKTEXT, pid, addr, out) +} + +func PtracePeekData(pid int, addr uintptr, out []byte) (count int, err error) { + return ptracePeek(PTRACE_PEEKDATA, pid, addr, out) +} + +func ptracePoke(pokeReq int, peekReq int, pid int, addr uintptr, data []byte) (count int, err error) { + // As for ptracePeek, we need to align our accesses to deal + // with the possibility of straddling an invalid page. + + // Leading edge. + n := 0 + if addr%sizeofPtr != 0 { + var buf [sizeofPtr]byte + err = ptrace(peekReq, pid, addr-addr%sizeofPtr, uintptr(unsafe.Pointer(&buf[0]))) + if err != nil { + return 0, err + } + n += copy(buf[addr%sizeofPtr:], data) + word := *((*uintptr)(unsafe.Pointer(&buf[0]))) + err = ptrace(pokeReq, pid, addr-addr%sizeofPtr, word) + if err != nil { + return 0, err + } + data = data[n:] + } + + // Interior. + for len(data) > sizeofPtr { + word := *((*uintptr)(unsafe.Pointer(&data[0]))) + err = ptrace(pokeReq, pid, addr+uintptr(n), word) + if err != nil { + return n, err + } + n += sizeofPtr + data = data[sizeofPtr:] + } + + // Trailing edge. + if len(data) > 0 { + var buf [sizeofPtr]byte + err = ptrace(peekReq, pid, addr+uintptr(n), uintptr(unsafe.Pointer(&buf[0]))) + if err != nil { + return n, err + } + copy(buf[0:], data) + word := *((*uintptr)(unsafe.Pointer(&buf[0]))) + err = ptrace(pokeReq, pid, addr+uintptr(n), word) + if err != nil { + return n, err + } + n += len(data) + } + + return n, nil +} + +func PtracePokeText(pid int, addr uintptr, data []byte) (count int, err error) { + return ptracePoke(PTRACE_POKETEXT, PTRACE_PEEKTEXT, pid, addr, data) +} + +func PtracePokeData(pid int, addr uintptr, data []byte) (count int, err error) { + return ptracePoke(PTRACE_POKEDATA, PTRACE_PEEKDATA, pid, addr, data) +} + +func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) { + return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout))) +} + +func PtraceSetRegs(pid int, regs *PtraceRegs) (err error) { + return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs))) +} + +func PtraceSetOptions(pid int, options int) (err error) { + return ptrace(PTRACE_SETOPTIONS, pid, 0, uintptr(options)) +} + +func PtraceGetEventMsg(pid int) (msg uint, err error) { + var data _C_long + err = ptrace(PTRACE_GETEVENTMSG, pid, 0, uintptr(unsafe.Pointer(&data))) + msg = uint(data) + return +} + +func PtraceCont(pid int, signal int) (err error) { + return ptrace(PTRACE_CONT, pid, 0, uintptr(signal)) +} + +func PtraceSyscall(pid int, signal int) (err error) { + return ptrace(PTRACE_SYSCALL, pid, 0, uintptr(signal)) +} + +func PtraceSingleStep(pid int) (err error) { return ptrace(PTRACE_SINGLESTEP, pid, 0, 0) } + +func PtraceAttach(pid int) (err error) { return ptrace(PTRACE_ATTACH, pid, 0, 0) } + +func PtraceDetach(pid int) (err error) { return ptrace(PTRACE_DETACH, pid, 0, 0) } + +//sys reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) + +func Reboot(cmd int) (err error) { + return reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, cmd, "") +} + +func clen(n []byte) int { + for i := 0; i < len(n); i++ { + if n[i] == 0 { + return i + } + } + return len(n) +} + +func ReadDirent(fd int, buf []byte) (n int, err error) { + return Getdents(fd, buf) +} + +func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) { + origlen := len(buf) + count = 0 + for max != 0 && len(buf) > 0 { + dirent := (*Dirent)(unsafe.Pointer(&buf[0])) + buf = buf[dirent.Reclen:] + if dirent.Ino == 0 { // File absent in directory. + continue + } + bytes := (*[10000]byte)(unsafe.Pointer(&dirent.Name[0])) + var name = string(bytes[0:clen(bytes[:])]) + if name == "." || name == ".." { // Useless names + continue + } + max-- + count++ + names = append(names, name) + } + return origlen - len(buf), count, names +} + +//sys mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) + +func Mount(source string, target string, fstype string, flags uintptr, data string) (err error) { + // Certain file systems get rather angry and EINVAL if you give + // them an empty string of data, rather than NULL. + if data == "" { + return mount(source, target, fstype, flags, nil) + } + datap, err := BytePtrFromString(data) + if err != nil { + return err + } + return mount(source, target, fstype, flags, datap) +} + +// Sendto +// Recvfrom +// Socketpair + +/* + * Direct access + */ +//sys Acct(path string) (err error) +//sys Adjtimex(buf *Timex) (state int, err error) +//sys Chdir(path string) (err error) +//sys Chroot(path string) (err error) +//sys ClockGettime(clockid int32, time *Timespec) (err error) +//sys Close(fd int) (err error) +//sys Dup(oldfd int) (fd int, err error) +//sys Dup3(oldfd int, newfd int, flags int) (err error) +//sysnb EpollCreate(size int) (fd int, err error) +//sysnb EpollCreate1(flag int) (fd int, err error) +//sysnb EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) +//sys Exit(code int) = SYS_EXIT_GROUP +//sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fallocate(fd int, mode uint32, off int64, len int64) (err error) +//sys Fchdir(fd int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) +//sys fcntl(fd int, cmd int, arg int) (val int, err error) +//sys Fdatasync(fd int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fsync(fd int) (err error) +//sys Getdents(fd int, buf []byte) (n int, err error) = SYS_GETDENTS64 +//sysnb Getpgid(pid int) (pgid int, err error) + +func Getpgrp() (pid int) { + pid, _ = Getpgid(0) + return +} + +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Gettid() (tid int) +//sys Getxattr(path string, attr string, dest []byte) (sz int, err error) +//sys InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) +//sysnb InotifyInit1(flags int) (fd int, err error) +//sysnb InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) +//sysnb Kill(pid int, sig syscall.Signal) (err error) +//sys Klogctl(typ int, buf []byte) (n int, err error) = SYS_SYSLOG +//sys Listxattr(path string, dest []byte) (sz int, err error) +//sys Mkdirat(dirfd int, path string, mode uint32) (err error) +//sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys PivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT +//sysnb prlimit(pid int, resource int, old *Rlimit, newlimit *Rlimit) (err error) = SYS_PRLIMIT64 +//sys Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Removexattr(path string, attr string) (err error) +//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) +//sys Setdomainname(p []byte) (err error) +//sys Sethostname(p []byte) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tv *Timeval) (err error) +//sys Setns(fd int, nstype int) (err error) + +// issue 1435. +// On linux Setuid and Setgid only affects the current thread, not the process. +// This does not match what most callers expect so we must return an error +// here rather than letting the caller think that the call succeeded. + +func Setuid(uid int) (err error) { + return EOPNOTSUPP +} + +func Setgid(uid int) (err error) { + return EOPNOTSUPP +} + +//sys Setpriority(which int, who int, prio int) (err error) +//sys Setxattr(path string, attr string, data []byte, flags int) (err error) +//sys Sync() +//sysnb Sysinfo(info *Sysinfo_t) (err error) +//sys Tee(rfd int, wfd int, len int, flags int) (n int64, err error) +//sysnb Tgkill(tgid int, tid int, sig syscall.Signal) (err error) +//sysnb Times(tms *Tms) (ticks uintptr, err error) +//sysnb Umask(mask int) (oldmask int) +//sysnb Uname(buf *Utsname) (err error) +//sys Unmount(target string, flags int) (err error) = SYS_UMOUNT2 +//sys Unshare(flags int) (err error) +//sys Ustat(dev int, ubuf *Ustat_t) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys exitThread(code int) (err error) = SYS_EXIT +//sys readlen(fd int, p *byte, np int) (n int, err error) = SYS_READ +//sys writelen(fd int, p *byte, np int) (n int, err error) = SYS_WRITE + +// mmap varies by architecture; see syscall_linux_*.go. +//sys munmap(addr uintptr, length uintptr) (err error) + +var mapper = &mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, +} + +func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + return mapper.Mmap(fd, offset, length, prot, flags) +} + +func Munmap(b []byte) (err error) { + return mapper.Munmap(b) +} + +//sys Madvise(b []byte, advice int) (err error) +//sys Mprotect(b []byte, prot int) (err error) +//sys Mlock(b []byte) (err error) +//sys Munlock(b []byte) (err error) +//sys Mlockall(flags int) (err error) +//sys Munlockall() (err error) + +/* + * Unimplemented + */ +// AddKey +// AfsSyscall +// Alarm +// ArchPrctl +// Brk +// Capget +// Capset +// ClockGetres +// ClockNanosleep +// ClockSettime +// Clone +// CreateModule +// DeleteModule +// EpollCtlOld +// EpollPwait +// EpollWaitOld +// Eventfd +// Execve +// Fgetxattr +// Flistxattr +// Fork +// Fremovexattr +// Fsetxattr +// Futex +// GetKernelSyms +// GetMempolicy +// GetRobustList +// GetThreadArea +// Getitimer +// Getpmsg +// IoCancel +// IoDestroy +// IoGetevents +// IoSetup +// IoSubmit +// Ioctl +// IoprioGet +// IoprioSet +// KexecLoad +// Keyctl +// Lgetxattr +// Llistxattr +// LookupDcookie +// Lremovexattr +// Lsetxattr +// Mbind +// MigratePages +// Mincore +// ModifyLdt +// Mount +// MovePages +// Mprotect +// MqGetsetattr +// MqNotify +// MqOpen +// MqTimedreceive +// MqTimedsend +// MqUnlink +// Mremap +// Msgctl +// Msgget +// Msgrcv +// Msgsnd +// Msync +// Newfstatat +// Nfsservctl +// Personality +// Ppoll +// Pselect6 +// Ptrace +// Putpmsg +// QueryModule +// Quotactl +// Readahead +// Readv +// RemapFilePages +// RequestKey +// RestartSyscall +// RtSigaction +// RtSigpending +// RtSigprocmask +// RtSigqueueinfo +// RtSigreturn +// RtSigsuspend +// RtSigtimedwait +// SchedGetPriorityMax +// SchedGetPriorityMin +// SchedGetaffinity +// SchedGetparam +// SchedGetscheduler +// SchedRrGetInterval +// SchedSetaffinity +// SchedSetparam +// SchedYield +// Security +// Semctl +// Semget +// Semop +// Semtimedop +// SetMempolicy +// SetRobustList +// SetThreadArea +// SetTidAddress +// Shmat +// Shmctl +// Shmdt +// Shmget +// Sigaltstack +// Signalfd +// Swapoff +// Swapon +// Sysfs +// TimerCreate +// TimerDelete +// TimerGetoverrun +// TimerGettime +// TimerSettime +// Timerfd +// Tkill (obsolete) +// Tuxcall +// Umount2 +// Uselib +// Utimensat +// Vfork +// Vhangup +// Vmsplice +// Vserver +// Waitid +// _Sysctl diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_linux_386.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_linux_386.go new file mode 100644 index 0000000000000000000000000000000000000000..bea01cb506c35fbbd38f85e4c5b860c61556ec5f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_linux_386.go @@ -0,0 +1,390 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// TODO(rsc): Rewrite all nn(SP) references into name+(nn-8)(FP) +// so that go vet can check that they are correct. + +// +build 386,linux + +package unix + +import ( + "syscall" + "unsafe" +) + +func Getpagesize() int { return 4096 } + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = int32(nsec / 1e9) + ts.Nsec = int32(nsec % 1e9) + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Sec = int32(nsec / 1e9) + tv.Usec = int32(nsec % 1e9 / 1e3) + return +} + +//sysnb pipe(p *[2]_C_int) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +// 64-bit file system and 32-bit uid calls +// (386 default is 32-bit file system and 16-bit uid). +//sys Dup2(oldfd int, newfd int) (err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64_64 +//sys Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32 +//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 +//sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64 +//sysnb Getegid() (egid int) = SYS_GETEGID32 +//sysnb Geteuid() (euid int) = SYS_GETEUID32 +//sysnb Getgid() (gid int) = SYS_GETGID32 +//sysnb Getuid() (uid int) = SYS_GETUID32 +//sysnb InotifyInit() (fd int, err error) +//sys Ioperm(from int, num int, on int) (err error) +//sys Iopl(level int) (err error) +//sys Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32 +//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 +//sys Setfsgid(gid int) (err error) = SYS_SETFSGID32 +//sys Setfsuid(uid int) (err error) = SYS_SETFSUID32 +//sysnb Setregid(rgid int, egid int) (err error) = SYS_SETREGID32 +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32 +//sysnb Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32 +//sysnb Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32 +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) +//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) +//sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) = SYS_GETGROUPS32 +//sysnb setgroups(n int, list *_Gid_t) (err error) = SYS_SETGROUPS32 +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT + +//sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Pause() (err error) + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + page := uintptr(offset / 4096) + if offset != int64(page)*4096 { + return 0, EINVAL + } + return mmap2(addr, length, prot, flags, fd, page) +} + +type rlimit32 struct { + Cur uint32 + Max uint32 +} + +//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT + +const rlimInf32 = ^uint32(0) +const rlimInf64 = ^uint64(0) + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, nil, rlim) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + err = getrlimit(resource, &rl) + if err != nil { + return + } + + if rl.Cur == rlimInf32 { + rlim.Cur = rlimInf64 + } else { + rlim.Cur = uint64(rl.Cur) + } + + if rl.Max == rlimInf32 { + rlim.Max = rlimInf64 + } else { + rlim.Max = uint64(rl.Max) + } + return +} + +//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, rlim, nil) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + if rlim.Cur == rlimInf64 { + rl.Cur = rlimInf32 + } else if rlim.Cur < uint64(rlimInf32) { + rl.Cur = uint32(rlim.Cur) + } else { + return EINVAL + } + if rlim.Max == rlimInf64 { + rl.Max = rlimInf32 + } else if rlim.Max < uint64(rlimInf32) { + rl.Max = uint32(rlim.Max) + } else { + return EINVAL + } + + return setrlimit(resource, &rl) +} + +// Underlying system call writes to newoffset via pointer. +// Implemented in assembly to avoid allocation. +func seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno) + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + newoffset, errno := seek(fd, offset, whence) + if errno != 0 { + return 0, errno + } + return newoffset, nil +} + +// Vsyscalls on amd64. +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Time(t *Time_t) (tt Time_t, err error) + +//sys Utime(path string, buf *Utimbuf) (err error) + +// On x86 Linux, all the socket calls go through an extra indirection, +// I think because the 5-register system call interface can't handle +// the 6-argument calls like sendto and recvfrom. Instead the +// arguments to the underlying system call are the number below +// and a pointer to an array of uintptr. We hide the pointer in the +// socketcall assembly to avoid allocation on every system call. + +const ( + // see linux/net.h + _SOCKET = 1 + _BIND = 2 + _CONNECT = 3 + _LISTEN = 4 + _ACCEPT = 5 + _GETSOCKNAME = 6 + _GETPEERNAME = 7 + _SOCKETPAIR = 8 + _SEND = 9 + _RECV = 10 + _SENDTO = 11 + _RECVFROM = 12 + _SHUTDOWN = 13 + _SETSOCKOPT = 14 + _GETSOCKOPT = 15 + _SENDMSG = 16 + _RECVMSG = 17 + _ACCEPT4 = 18 + _RECVMMSG = 19 + _SENDMMSG = 20 +) + +func socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err syscall.Errno) +func rawsocketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err syscall.Errno) + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + fd, e := socketcall(_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + fd, e := socketcall(_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + if e != 0 { + err = e + } + return +} + +func getsockname(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, e := rawsocketcall(_GETSOCKNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func getpeername(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, e := rawsocketcall(_GETPEERNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) { + _, e := rawsocketcall(_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd)), 0, 0) + if e != 0 { + err = e + } + return +} + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, e := socketcall(_BIND, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, e := socketcall(_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func socket(domain int, typ int, proto int) (fd int, err error) { + fd, e := rawsocketcall(_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, e := socketcall(_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e != 0 { + err = e + } + return +} + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, e := socketcall(_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), vallen, 0) + if e != 0 { + err = e + } + return +} + +func recvfrom(s int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var base uintptr + if len(p) > 0 { + base = uintptr(unsafe.Pointer(&p[0])) + } + n, e := socketcall(_RECVFROM, uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + if e != 0 { + err = e + } + return +} + +func sendto(s int, p []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var base uintptr + if len(p) > 0 { + base = uintptr(unsafe.Pointer(&p[0])) + } + _, e := socketcall(_SENDTO, uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e != 0 { + err = e + } + return +} + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + n, e := socketcall(_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + n, e := socketcall(_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func Listen(s int, n int) (err error) { + _, e := socketcall(_LISTEN, uintptr(s), uintptr(n), 0, 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func Shutdown(s, how int) (err error) { + _, e := socketcall(_SHUTDOWN, uintptr(s), uintptr(how), 0, 0, 0, 0) + if e != 0 { + err = e + } + return +} + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = e + } + return +} + +func Statfs(path string, buf *Statfs_t) (err error) { + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + _, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = e + } + return +} + +func (r *PtraceRegs) PC() uint64 { return uint64(uint32(r.Eip)) } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Eip = int32(pc) } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..721f24b68d3b963cd6f75240867e06ad040badf4 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go @@ -0,0 +1,148 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,linux + +package unix + +import "syscall" + +//sys Dup2(oldfd int, newfd int) (err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Getuid() (uid int) +//sysnb InotifyInit() (fd int, err error) +//sys Ioperm(from int, num int, on int) (err error) +//sys Iopl(level int) (err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Listen(s int, n int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statfs(path string, buf *Statfs_t) (err error) +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) +//sys Truncate(path string, length int64) (err error) +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) +//sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +//go:noescape +func gettimeofday(tv *Timeval) (err syscall.Errno) + +func Gettimeofday(tv *Timeval) (err error) { + errno := gettimeofday(tv) + if errno != 0 { + return errno + } + return nil +} + +func Getpagesize() int { return 4096 } + +func Time(t *Time_t) (tt Time_t, err error) { + var tv Timeval + errno := gettimeofday(&tv) + if errno != 0 { + return 0, errno + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +//sys Utime(path string, buf *Utimbuf) (err error) + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Sec = nsec / 1e9 + tv.Usec = nsec % 1e9 / 1e3 + return +} + +//sysnb pipe(p *[2]_C_int) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func (r *PtraceRegs) PC() uint64 { return r.Rip } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Rip = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_linux_arm.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_linux_arm.go new file mode 100644 index 0000000000000000000000000000000000000000..122df649af655508b7eca0c9734a12cd863cc149 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_linux_arm.go @@ -0,0 +1,254 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm,linux + +package unix + +import ( + "syscall" + "unsafe" +) + +func Getpagesize() int { return 4096 } + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = int32(nsec / 1e9) + ts.Nsec = int32(nsec % 1e9) + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Sec = int32(nsec / 1e9) + tv.Usec = int32(nsec % 1e9 / 1e3) + return +} + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, 0) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +// Underlying system call writes to newoffset via pointer. +// Implemented in assembly to avoid allocation. +func seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno) + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + newoffset, errno := seek(fd, offset, whence) + if errno != 0 { + return 0, errno + } + return newoffset, nil +} + +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) +//sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) = SYS_GETGROUPS32 +//sysnb setgroups(n int, list *_Gid_t) (err error) = SYS_SETGROUPS32 +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) + +// 64-bit file system and 32-bit uid calls +// (16-bit uid calls are not always supported in newer kernels) +//sys Dup2(oldfd int, newfd int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32 +//sys Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64 +//sysnb Getegid() (egid int) = SYS_GETEGID32 +//sysnb Geteuid() (euid int) = SYS_GETEUID32 +//sysnb Getgid() (gid int) = SYS_GETGID32 +//sysnb Getuid() (uid int) = SYS_GETUID32 +//sysnb InotifyInit() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32 +//sys Listen(s int, n int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64 +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64 +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT +//sys Setfsgid(gid int) (err error) = SYS_SETFSGID32 +//sys Setfsuid(uid int) (err error) = SYS_SETFSUID32 +//sysnb Setregid(rgid int, egid int) (err error) = SYS_SETREGID32 +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32 +//sysnb Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32 +//sysnb Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32 +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) +//sys Stat(path string, stat *Stat_t) (err error) = SYS_STAT64 + +// Vsyscalls on amd64. +//sysnb Gettimeofday(tv *Timeval) (err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Pause() (err error) + +func Time(t *Time_t) (Time_t, error) { + var tv Timeval + err := Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +func Utime(path string, buf *Utimbuf) error { + tv := []Timeval{ + {Sec: buf.Actime}, + {Sec: buf.Modtime}, + } + return Utimes(path, tv) +} + +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Truncate(path string, length int64) (err error) = SYS_TRUNCATE64 +//sys Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64 + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_ARM_FADVISE64_64, uintptr(fd), uintptr(advice), uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +//sys mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = e + } + return +} + +func Statfs(path string, buf *Statfs_t) (err error) { + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + _, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf))) + if e != 0 { + err = e + } + return +} + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + page := uintptr(offset / 4096) + if offset != int64(page)*4096 { + return 0, EINVAL + } + return mmap2(addr, length, prot, flags, fd, page) +} + +type rlimit32 struct { + Cur uint32 + Max uint32 +} + +//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_UGETRLIMIT + +const rlimInf32 = ^uint32(0) +const rlimInf64 = ^uint64(0) + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, nil, rlim) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + err = getrlimit(resource, &rl) + if err != nil { + return + } + + if rl.Cur == rlimInf32 { + rlim.Cur = rlimInf64 + } else { + rlim.Cur = uint64(rl.Cur) + } + + if rl.Max == rlimInf32 { + rlim.Max = rlimInf64 + } else { + rlim.Max = uint64(rl.Max) + } + return +} + +//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + err = prlimit(0, resource, rlim, nil) + if err != ENOSYS { + return err + } + + rl := rlimit32{} + if rlim.Cur == rlimInf64 { + rl.Cur = rlimInf32 + } else if rlim.Cur < uint64(rlimInf32) { + rl.Cur = uint32(rlim.Cur) + } else { + return EINVAL + } + if rlim.Max == rlimInf64 { + rl.Max = rlimInf32 + } else if rlim.Max < uint64(rlimInf32) { + rl.Max = uint32(rlim.Max) + } else { + return EINVAL + } + + return setrlimit(resource, &rl) +} + +func (r *PtraceRegs) PC() uint64 { return uint64(r.Uregs[15]) } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Uregs[15] = uint32(pc) } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go new file mode 100644 index 0000000000000000000000000000000000000000..d105186803448f7f4318cf3e7e82bcef6f15e1ae --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go @@ -0,0 +1,180 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm64,linux + +package unix + +const _SYS_dup = SYS_DUP3 + +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = SYS_EPOLL_PWAIT +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Getuid() (uid int) +//sys Listen(s int, n int) (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS_PSELECT6 +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) + +func Stat(path string, stat *Stat_t) (err error) { + return Fstatat(AT_FDCWD, path, stat, 0) +} + +func Lchown(path string, uid int, gid int) (err error) { + return Fchownat(AT_FDCWD, path, uid, gid, AT_SYMLINK_NOFOLLOW) +} + +func Lstat(path string, stat *Stat_t) (err error) { + return Fstatat(AT_FDCWD, path, stat, AT_SYMLINK_NOFOLLOW) +} + +//sys Statfs(path string, buf *Statfs_t) (err error) +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) +//sys Truncate(path string, length int64) (err error) +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) +//sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +func Getpagesize() int { return 65536 } + +//sysnb Gettimeofday(tv *Timeval) (err error) + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Sec = nsec / 1e9 + tv.Usec = nsec % 1e9 / 1e3 + return +} + +func Time(t *Time_t) (Time_t, error) { + var tv Timeval + err := Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +func Utime(path string, buf *Utimbuf) error { + tv := []Timeval{ + {Sec: buf.Actime}, + {Sec: buf.Modtime}, + } + return Utimes(path, tv) +} + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, 0) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func (r *PtraceRegs) PC() uint64 { return r.Pc } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Pc = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +func InotifyInit() (fd int, err error) { + return InotifyInit1(0) +} + +func Dup2(oldfd int, newfd int) (err error) { + return Dup3(oldfd, newfd, 0) +} + +func Pause() (err error) { + _, _, e1 := Syscall6(SYS_PPOLL, 0, 0, 0, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// TODO(dfc): constants that should be in zsysnum_linux_arm64.go, remove +// these when the deprecated syscalls that the syscall package relies on +// are removed. +const ( + SYS_GETPGRP = 1060 + SYS_UTIMES = 1037 + SYS_FUTIMESAT = 1066 + SYS_PAUSE = 1061 + SYS_USTAT = 1070 + SYS_UTIME = 1063 + SYS_LCHOWN = 1032 + SYS_TIME = 1062 + SYS_EPOLL_CREATE = 1042 + SYS_EPOLL_WAIT = 1069 +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go new file mode 100644 index 0000000000000000000000000000000000000000..bb15ba3e68a9e6fcc94a6b2821e0dcd3303fb517 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go @@ -0,0 +1,206 @@ +// Copyright 2015 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux +// +build mips64 mips64le + +package unix + +// Linux introduced getdents64 syscall for N64 ABI only in 3.10 +// (May 21 2013, rev dec33abaafc89bcbd78f85fad0513170415a26d5), +// to support older kernels, we have to use getdents for mips64. +// Also note that struct dirent is different for these two. +// Lookup linux_dirent{,64} in kernel source code for details. +const _SYS_getdents = SYS_GETDENTS + +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Getuid() (uid int) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Listen(s int, n int) (err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS_PSELECT6 +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) +//sys Statfs(path string, buf *Statfs_t) (err error) +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) +//sys Truncate(path string, length int64) (err error) +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) +//sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +func Getpagesize() int { return 65536 } + +//sysnb Gettimeofday(tv *Timeval) (err error) + +func Time(t *Time_t) (tt Time_t, err error) { + var tv Timeval + err = Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +//sys Utime(path string, buf *Utimbuf) (err error) + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Sec = nsec / 1e9 + tv.Usec = nsec % 1e9 / 1e3 + return +} + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, 0) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func Ioperm(from int, num int, on int) (err error) { + return ENOSYS +} + +func Iopl(level int) (err error) { + return ENOSYS +} + +type stat_t struct { + Dev uint32 + Pad0 [3]int32 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint32 + Pad1 [3]uint32 + Size int64 + Atime uint32 + Atime_nsec uint32 + Mtime uint32 + Mtime_nsec uint32 + Ctime uint32 + Ctime_nsec uint32 + Blksize uint32 + Pad2 uint32 + Blocks int64 +} + +//sys fstat(fd int, st *stat_t) (err error) +//sys lstat(path string, st *stat_t) (err error) +//sys stat(path string, st *stat_t) (err error) + +func Fstat(fd int, s *Stat_t) (err error) { + st := &stat_t{} + err = fstat(fd, st) + fillStat_t(s, st) + return +} + +func Lstat(path string, s *Stat_t) (err error) { + st := &stat_t{} + err = lstat(path, st) + fillStat_t(s, st) + return +} + +func Stat(path string, s *Stat_t) (err error) { + st := &stat_t{} + err = stat(path, st) + fillStat_t(s, st) + return +} + +func fillStat_t(s *Stat_t, st *stat_t) { + s.Dev = st.Dev + s.Ino = st.Ino + s.Mode = st.Mode + s.Nlink = st.Nlink + s.Uid = st.Uid + s.Gid = st.Gid + s.Rdev = st.Rdev + s.Size = st.Size + s.Atim = Timespec{int64(st.Atime), int64(st.Atime_nsec)} + s.Mtim = Timespec{int64(st.Mtime), int64(st.Mtime_nsec)} + s.Ctim = Timespec{int64(st.Ctime), int64(st.Ctime_nsec)} + s.Blksize = st.Blksize + s.Blocks = st.Blocks +} + +func (r *PtraceRegs) PC() uint64 { return r.Regs[64] } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Regs[64] = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go new file mode 100644 index 0000000000000000000000000000000000000000..acd2e1c789dc16632950479362320111b29e285d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go @@ -0,0 +1,126 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build linux +// +build ppc64 ppc64le + +package unix + +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Dup2(oldfd int, newfd int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) = SYS_UGETRLIMIT +//sysnb Getuid() (uid int) +//sysnb InotifyInit() (fd int, err error) +//sys Ioperm(from int, num int, on int) (err error) +//sys Iopl(level int) (err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Listen(s int, n int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Shutdown(fd int, how int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statfs(path string, buf *Statfs_t) (err error) +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) = SYS_SYNC_FILE_RANGE2 +//sys Truncate(path string, length int64) (err error) +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) +//sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) +//sysnb socket(domain int, typ int, proto int) (fd int, err error) +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) + +func Getpagesize() int { return 65536 } + +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Time(t *Time_t) (tt Time_t, err error) + +//sys Utime(path string, buf *Utimbuf) (err error) + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Sec = nsec / 1e9 + tv.Usec = nsec % 1e9 / 1e3 + return +} + +func (r *PtraceRegs) PC() uint64 { return r.Nip } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Nip = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +//sysnb pipe(p *[2]_C_int) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go new file mode 100644 index 0000000000000000000000000000000000000000..3f98904e3cff4dfec929c22505bb20e9ab3fe517 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_linux_s390x.go @@ -0,0 +1,320 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build s390x,linux + +package unix + +import ( + "unsafe" +) + +//sys Dup2(oldfd int, newfd int) (err error) +//sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) +//sys Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64 +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatfs(fd int, buf *Statfs_t) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (euid int) +//sysnb Getgid() (gid int) +//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Getuid() (uid int) +//sysnb InotifyInit() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64 +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64 +//sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK +//sys Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) +//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) +//sys Setfsgid(gid int) (err error) +//sys Setfsuid(uid int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statfs(path string, buf *Statfs_t) (err error) +//sys SyncFileRange(fd int, off int64, n int64, flags int) (err error) +//sys Truncate(path string, length int64) (err error) +//sysnb getgroups(n int, list *_Gid_t) (nn int, err error) +//sysnb setgroups(n int, list *_Gid_t) (err error) + +func Getpagesize() int { return 4096 } + +//sysnb Gettimeofday(tv *Timeval) (err error) + +func Time(t *Time_t) (tt Time_t, err error) { + var tv Timeval + err = Gettimeofday(&tv) + if err != nil { + return 0, err + } + if t != nil { + *t = Time_t(tv.Sec) + } + return Time_t(tv.Sec), nil +} + +//sys Utime(path string, buf *Utimbuf) (err error) + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Sec = nsec / 1e9 + tv.Usec = nsec % 1e9 / 1e3 + return +} + +//sysnb pipe2(p *[2]_C_int, flags int) (err error) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, 0) // pipe2 is the same as pipe when flags are set to 0. + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func Pipe2(p []int, flags int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe2(&pp, flags) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +func Ioperm(from int, num int, on int) (err error) { + return ENOSYS +} + +func Iopl(level int) (err error) { + return ENOSYS +} + +func (r *PtraceRegs) PC() uint64 { return r.Psw.Addr } + +func (r *PtraceRegs) SetPC(pc uint64) { r.Psw.Addr = pc } + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint64(length) +} + +// Linux on s390x uses the old mmap interface, which requires arguments to be passed in a struct. +// mmap2 also requires arguments to be passed in a struct; it is currently not exposed in <asm/unistd.h>. +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + mmap_args := [6]uintptr{addr, length, uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)} + r0, _, e1 := Syscall(SYS_MMAP, uintptr(unsafe.Pointer(&mmap_args[0])), 0, 0) + use(unsafe.Pointer(&mmap_args[0])) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// On s390x Linux, all the socket calls go through an extra indirection. +// The arguments to the underlying system call (SYS_SOCKETCALL) are the +// number below and a pointer to an array of uintptr. +const ( + // see linux/net.h + netSocket = 1 + netBind = 2 + netConnect = 3 + netListen = 4 + netAccept = 5 + netGetSockName = 6 + netGetPeerName = 7 + netSocketPair = 8 + netSend = 9 + netRecv = 10 + netSendTo = 11 + netRecvFrom = 12 + netShutdown = 13 + netSetSockOpt = 14 + netGetSockOpt = 15 + netSendMsg = 16 + netRecvMsg = 17 + netAccept4 = 18 + netRecvMMsg = 19 + netSendMMsg = 20 +) + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (int, error) { + args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))} + fd, _, err := Syscall(SYS_SOCKETCALL, netAccept, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return 0, err + } + return int(fd), nil +} + +func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (int, error) { + args := [4]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags)} + fd, _, err := Syscall(SYS_SOCKETCALL, netAccept4, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return 0, err + } + return int(fd), nil +} + +func getsockname(s int, rsa *RawSockaddrAny, addrlen *_Socklen) error { + args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))} + _, _, err := RawSyscall(SYS_SOCKETCALL, netGetSockName, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func getpeername(s int, rsa *RawSockaddrAny, addrlen *_Socklen) error { + args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))} + _, _, err := RawSyscall(SYS_SOCKETCALL, netGetPeerName, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func socketpair(domain int, typ int, flags int, fd *[2]int32) error { + args := [4]uintptr{uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd))} + _, _, err := RawSyscall(SYS_SOCKETCALL, netSocketPair, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) error { + args := [3]uintptr{uintptr(s), uintptr(addr), uintptr(addrlen)} + _, _, err := Syscall(SYS_SOCKETCALL, netBind, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) error { + args := [3]uintptr{uintptr(s), uintptr(addr), uintptr(addrlen)} + _, _, err := Syscall(SYS_SOCKETCALL, netConnect, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func socket(domain int, typ int, proto int) (int, error) { + args := [3]uintptr{uintptr(domain), uintptr(typ), uintptr(proto)} + fd, _, err := RawSyscall(SYS_SOCKETCALL, netSocket, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return 0, err + } + return int(fd), nil +} + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) error { + args := [5]uintptr{uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen))} + _, _, err := Syscall(SYS_SOCKETCALL, netGetSockOpt, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) error { + args := [4]uintptr{uintptr(s), uintptr(level), uintptr(name), uintptr(val)} + _, _, err := Syscall(SYS_SOCKETCALL, netSetSockOpt, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func recvfrom(s int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (int, error) { + var base uintptr + if len(p) > 0 { + base = uintptr(unsafe.Pointer(&p[0])) + } + args := [6]uintptr{uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))} + n, _, err := Syscall(SYS_SOCKETCALL, netRecvFrom, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return 0, err + } + return int(n), nil +} + +func sendto(s int, p []byte, flags int, to unsafe.Pointer, addrlen _Socklen) error { + var base uintptr + if len(p) > 0 { + base = uintptr(unsafe.Pointer(&p[0])) + } + args := [6]uintptr{uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(to), uintptr(addrlen)} + _, _, err := Syscall(SYS_SOCKETCALL, netSendTo, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func recvmsg(s int, msg *Msghdr, flags int) (int, error) { + args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)} + n, _, err := Syscall(SYS_SOCKETCALL, netRecvMsg, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return 0, err + } + return int(n), nil +} + +func sendmsg(s int, msg *Msghdr, flags int) (int, error) { + args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)} + n, _, err := Syscall(SYS_SOCKETCALL, netSendMsg, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return 0, err + } + return int(n), nil +} + +func Listen(s int, n int) error { + args := [2]uintptr{uintptr(s), uintptr(n)} + _, _, err := Syscall(SYS_SOCKETCALL, netListen, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} + +func Shutdown(s, how int) error { + args := [2]uintptr{uintptr(s), uintptr(how)} + _, _, err := Syscall(SYS_SOCKETCALL, netShutdown, uintptr(unsafe.Pointer(&args)), 0) + if err != 0 { + return err + } + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_netbsd.go new file mode 100644 index 0000000000000000000000000000000000000000..c4e945cd696286e9b95e064bfa548d0d5ddc185e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_netbsd.go @@ -0,0 +1,492 @@ +// Copyright 2009,2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// NetBSD system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_bsd.go or syscall_unix.go. + +package unix + +import ( + "syscall" + "unsafe" +) + +type SockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 + raw RawSockaddrDatalink +} + +func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +func sysctlNodes(mib []_C_int) (nodes []Sysctlnode, err error) { + var olen uintptr + + // Get a list of all sysctl nodes below the given MIB by performing + // a sysctl for the given MIB with CTL_QUERY appended. + mib = append(mib, CTL_QUERY) + qnode := Sysctlnode{Flags: SYSCTL_VERS_1} + qp := (*byte)(unsafe.Pointer(&qnode)) + sz := unsafe.Sizeof(qnode) + if err = sysctl(mib, nil, &olen, qp, sz); err != nil { + return nil, err + } + + // Now that we know the size, get the actual nodes. + nodes = make([]Sysctlnode, olen/sz) + np := (*byte)(unsafe.Pointer(&nodes[0])) + if err = sysctl(mib, np, &olen, qp, sz); err != nil { + return nil, err + } + + return nodes, nil +} + +func nametomib(name string) (mib []_C_int, err error) { + + // Split name into components. + var parts []string + last := 0 + for i := 0; i < len(name); i++ { + if name[i] == '.' { + parts = append(parts, name[last:i]) + last = i + 1 + } + } + parts = append(parts, name[last:]) + + // Discover the nodes and construct the MIB OID. + for partno, part := range parts { + nodes, err := sysctlNodes(mib) + if err != nil { + return nil, err + } + for _, node := range nodes { + n := make([]byte, 0) + for i := range node.Name { + if node.Name[i] != 0 { + n = append(n, byte(node.Name[i])) + } + } + if string(n) == part { + mib = append(mib, _C_int(node.Num)) + break + } + } + if len(mib) != partno+1 { + return nil, EINVAL + } + } + + return mib, nil +} + +// ParseDirent parses up to max directory entries in buf, +// appending the names to names. It returns the number +// bytes consumed from buf, the number of entries added +// to names, and the new names slice. +func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) { + origlen := len(buf) + for max != 0 && len(buf) > 0 { + dirent := (*Dirent)(unsafe.Pointer(&buf[0])) + if dirent.Reclen == 0 { + buf = nil + break + } + buf = buf[dirent.Reclen:] + if dirent.Fileno == 0 { // File absent in directory. + continue + } + bytes := (*[10000]byte)(unsafe.Pointer(&dirent.Name[0])) + var name = string(bytes[0:dirent.Namlen]) + if name == "." || name == ".." { // Useless names + continue + } + max-- + count++ + names = append(names, name) + } + return origlen - len(buf), count, names +} + +//sysnb pipe() (fd1 int, fd2 int, err error) +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + p[0], p[1], err = pipe() + return +} + +//sys getdents(fd int, buf []byte) (n int, err error) +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + return getdents(fd, buf) +} + +// TODO +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + return -1, ENOSYS +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys Chdir(path string) (err error) +//sys Chflags(path string, flags int) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(from int, to int) (err error) +//sys Exit(code int) +//sys Fchdir(fd int) (err error) +//sys Fchflags(fd int, flags int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) +//sysnb Getgid() (gid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgrp int) +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Getuid() (uid int) +//sys Issetugid() (tainted bool) +//sys Kill(pid int, signum syscall.Signal) (err error) +//sys Kqueue() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Listen(s int, backlog int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Mlock(b []byte) (err error) +//sys Mlockall(flags int) (err error) +//sys Mprotect(b []byte, prot int) (err error) +//sys Munlock(b []byte) (err error) +//sys Munlockall() (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Revoke(path string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sysnb Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tp *Timeval) (err error) +//sysnb Setuid(uid int) (err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Symlink(path string, link string) (err error) +//sys Sync() (err error) +//sys Truncate(path string, length int64) (err error) +//sys Umask(newmask int) (oldmask int) +//sys Unlink(path string) (err error) +//sys Unmount(path string, flags int) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE + +/* + * Unimplemented + */ +// ____semctl13 +// __clone +// __fhopen40 +// __fhstat40 +// __fhstatvfs140 +// __fstat30 +// __getcwd +// __getfh30 +// __getlogin +// __lstat30 +// __mount50 +// __msgctl13 +// __msync13 +// __ntp_gettime30 +// __posix_chown +// __posix_fadvise50 +// __posix_fchown +// __posix_lchown +// __posix_rename +// __setlogin +// __shmctl13 +// __sigaction_sigtramp +// __sigaltstack14 +// __sigpending14 +// __sigprocmask14 +// __sigsuspend14 +// __sigtimedwait +// __stat30 +// __syscall +// __vfork14 +// _ksem_close +// _ksem_destroy +// _ksem_getvalue +// _ksem_init +// _ksem_open +// _ksem_post +// _ksem_trywait +// _ksem_unlink +// _ksem_wait +// _lwp_continue +// _lwp_create +// _lwp_ctl +// _lwp_detach +// _lwp_exit +// _lwp_getname +// _lwp_getprivate +// _lwp_kill +// _lwp_park +// _lwp_self +// _lwp_setname +// _lwp_setprivate +// _lwp_suspend +// _lwp_unpark +// _lwp_unpark_all +// _lwp_wait +// _lwp_wakeup +// _pset_bind +// _sched_getaffinity +// _sched_getparam +// _sched_setaffinity +// _sched_setparam +// acct +// aio_cancel +// aio_error +// aio_fsync +// aio_read +// aio_return +// aio_suspend +// aio_write +// break +// clock_getres +// clock_gettime +// clock_settime +// compat_09_ogetdomainname +// compat_09_osetdomainname +// compat_09_ouname +// compat_10_omsgsys +// compat_10_osemsys +// compat_10_oshmsys +// compat_12_fstat12 +// compat_12_getdirentries +// compat_12_lstat12 +// compat_12_msync +// compat_12_oreboot +// compat_12_oswapon +// compat_12_stat12 +// compat_13_sigaction13 +// compat_13_sigaltstack13 +// compat_13_sigpending13 +// compat_13_sigprocmask13 +// compat_13_sigreturn13 +// compat_13_sigsuspend13 +// compat_14___semctl +// compat_14_msgctl +// compat_14_shmctl +// compat_16___sigaction14 +// compat_16___sigreturn14 +// compat_20_fhstatfs +// compat_20_fstatfs +// compat_20_getfsstat +// compat_20_statfs +// compat_30___fhstat30 +// compat_30___fstat13 +// compat_30___lstat13 +// compat_30___stat13 +// compat_30_fhopen +// compat_30_fhstat +// compat_30_fhstatvfs1 +// compat_30_getdents +// compat_30_getfh +// compat_30_ntp_gettime +// compat_30_socket +// compat_40_mount +// compat_43_fstat43 +// compat_43_lstat43 +// compat_43_oaccept +// compat_43_ocreat +// compat_43_oftruncate +// compat_43_ogetdirentries +// compat_43_ogetdtablesize +// compat_43_ogethostid +// compat_43_ogethostname +// compat_43_ogetkerninfo +// compat_43_ogetpagesize +// compat_43_ogetpeername +// compat_43_ogetrlimit +// compat_43_ogetsockname +// compat_43_okillpg +// compat_43_olseek +// compat_43_ommap +// compat_43_oquota +// compat_43_orecv +// compat_43_orecvfrom +// compat_43_orecvmsg +// compat_43_osend +// compat_43_osendmsg +// compat_43_osethostid +// compat_43_osethostname +// compat_43_osetrlimit +// compat_43_osigblock +// compat_43_osigsetmask +// compat_43_osigstack +// compat_43_osigvec +// compat_43_otruncate +// compat_43_owait +// compat_43_stat43 +// execve +// extattr_delete_fd +// extattr_delete_file +// extattr_delete_link +// extattr_get_fd +// extattr_get_file +// extattr_get_link +// extattr_list_fd +// extattr_list_file +// extattr_list_link +// extattr_set_fd +// extattr_set_file +// extattr_set_link +// extattrctl +// fchroot +// fdatasync +// fgetxattr +// fktrace +// flistxattr +// fork +// fremovexattr +// fsetxattr +// fstatvfs1 +// fsync_range +// getcontext +// getitimer +// getvfsstat +// getxattr +// ioctl +// ktrace +// lchflags +// lchmod +// lfs_bmapv +// lfs_markv +// lfs_segclean +// lfs_segwait +// lgetxattr +// lio_listio +// listxattr +// llistxattr +// lremovexattr +// lseek +// lsetxattr +// lutimes +// madvise +// mincore +// minherit +// modctl +// mq_close +// mq_getattr +// mq_notify +// mq_open +// mq_receive +// mq_send +// mq_setattr +// mq_timedreceive +// mq_timedsend +// mq_unlink +// mremap +// msgget +// msgrcv +// msgsnd +// nfssvc +// ntp_adjtime +// pmc_control +// pmc_get_info +// poll +// pollts +// preadv +// profil +// pselect +// pset_assign +// pset_create +// pset_destroy +// ptrace +// pwritev +// quotactl +// rasctl +// readv +// reboot +// removexattr +// sa_enable +// sa_preempt +// sa_register +// sa_setconcurrency +// sa_stacks +// sa_yield +// sbrk +// sched_yield +// semconfig +// semget +// semop +// setcontext +// setitimer +// setxattr +// shmat +// shmdt +// shmget +// sstk +// statvfs1 +// swapctl +// sysarch +// syscall +// timer_create +// timer_delete +// timer_getoverrun +// timer_gettime +// timer_settime +// undelete +// utrace +// uuidgen +// vadvise +// vfork +// writev diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go new file mode 100644 index 0000000000000000000000000000000000000000..afaca09838afe9133e961de8b10c7274309b6deb --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_netbsd_386.go @@ -0,0 +1,42 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build 386,netbsd + +package unix + +func Getpagesize() int { return 4096 } + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = int64(nsec / 1e9) + ts.Nsec = int32(nsec % 1e9) + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = int32(nsec % 1e9 / 1e3) + tv.Sec = int64(nsec / 1e9) + return +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = uint32(mode) + k.Flags = uint32(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..a6ff04ce5bd2e28293722e69acf822ff13c79f41 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go @@ -0,0 +1,42 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,netbsd + +package unix + +func Getpagesize() int { return 4096 } + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = int64(nsec / 1e9) + ts.Nsec = int64(nsec % 1e9) + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = int32(nsec % 1e9 / 1e3) + tv.Sec = int64(nsec / 1e9) + return +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = uint32(mode) + k.Flags = uint32(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go new file mode 100644 index 0000000000000000000000000000000000000000..68a6969b285b5e6cf4365eb39bf6d2b3883e8537 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go @@ -0,0 +1,42 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build arm,netbsd + +package unix + +func Getpagesize() int { return 4096 } + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = int64(nsec / 1e9) + ts.Nsec = int32(nsec % 1e9) + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = int32(nsec % 1e9 / 1e3) + tv.Sec = int64(nsec / 1e9) + return +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = uint32(mode) + k.Flags = uint32(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_no_getwd.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_no_getwd.go new file mode 100644 index 0000000000000000000000000000000000000000..530792ea93b5abf5c82286e7fd80826039d1e95c --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_no_getwd.go @@ -0,0 +1,11 @@ +// Copyright 2013 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build dragonfly freebsd netbsd openbsd + +package unix + +const ImplementsGetwd = false + +func Getwd() (string, error) { return "", ENOTSUP } diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_openbsd.go new file mode 100644 index 0000000000000000000000000000000000000000..246131d2afce35aa0b4bd3ed39dfc73332294691 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_openbsd.go @@ -0,0 +1,303 @@ +// Copyright 2009,2010 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// OpenBSD system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_bsd.go or syscall_unix.go. + +package unix + +import ( + "syscall" + "unsafe" +) + +type SockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [24]int8 + raw RawSockaddrDatalink +} + +func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) + +func nametomib(name string) (mib []_C_int, err error) { + + // Perform lookup via a binary search + left := 0 + right := len(sysctlMib) - 1 + for { + idx := left + (right-left)/2 + switch { + case name == sysctlMib[idx].ctlname: + return sysctlMib[idx].ctloid, nil + case name > sysctlMib[idx].ctlname: + left = idx + 1 + default: + right = idx - 1 + } + if left > right { + break + } + } + return nil, EINVAL +} + +// ParseDirent parses up to max directory entries in buf, +// appending the names to names. It returns the number +// bytes consumed from buf, the number of entries added +// to names, and the new names slice. +func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) { + origlen := len(buf) + for max != 0 && len(buf) > 0 { + dirent := (*Dirent)(unsafe.Pointer(&buf[0])) + if dirent.Reclen == 0 { + buf = nil + break + } + buf = buf[dirent.Reclen:] + if dirent.Fileno == 0 { // File absent in directory. + continue + } + bytes := (*[10000]byte)(unsafe.Pointer(&dirent.Name[0])) + var name = string(bytes[0:dirent.Namlen]) + if name == "." || name == ".." { // Useless names + continue + } + max-- + count++ + names = append(names, name) + } + return origlen - len(buf), count, names +} + +//sysnb pipe(p *[2]_C_int) (err error) +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + var pp [2]_C_int + err = pipe(&pp) + p[0] = int(pp[0]) + p[1] = int(pp[1]) + return +} + +//sys getdents(fd int, buf []byte) (n int, err error) +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + return getdents(fd, buf) +} + +// TODO +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + return -1, ENOSYS +} + +func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { + var _p0 unsafe.Pointer + var bufsize uintptr + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + bufsize = unsafe.Sizeof(Statfs_t{}) * uintptr(len(buf)) + } + r0, _, e1 := Syscall(SYS_GETFSSTAT, uintptr(_p0), bufsize, uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys Chdir(path string) (err error) +//sys Chflags(path string, flags int) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(from int, to int) (err error) +//sys Exit(code int) +//sys Fchdir(fd int) (err error) +//sys Fchflags(fd int, flags int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Flock(fd int, how int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Fstatfs(fd int, stat *Statfs_t) (err error) +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sysnb Getegid() (egid int) +//sysnb Geteuid() (uid int) +//sysnb Getgid() (gid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgrp int) +//sysnb Getpid() (pid int) +//sysnb Getppid() (ppid int) +//sys Getpriority(which int, who int) (prio int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Getsid(pid int) (sid int, err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Getuid() (uid int) +//sys Issetugid() (tainted bool) +//sys Kill(pid int, signum syscall.Signal) (err error) +//sys Kqueue() (fd int, err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Listen(s int, backlog int) (err error) +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Mlock(b []byte) (err error) +//sys Mlockall(flags int) (err error) +//sys Mprotect(b []byte, prot int) (err error) +//sys Munlock(b []byte) (err error) +//sys Munlockall() (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Revoke(path string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = SYS_LSEEK +//sys Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) +//sysnb Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sys Setlogin(name string) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setresgid(rgid int, egid int, sgid int) (err error) +//sysnb Setresuid(ruid int, euid int, suid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Settimeofday(tp *Timeval) (err error) +//sysnb Setuid(uid int) (err error) +//sys Stat(path string, stat *Stat_t) (err error) +//sys Statfs(path string, stat *Statfs_t) (err error) +//sys Symlink(path string, link string) (err error) +//sys Sync() (err error) +//sys Truncate(path string, length int64) (err error) +//sys Umask(newmask int) (oldmask int) +//sys Unlink(path string) (err error) +//sys Unmount(path string, flags int) (err error) +//sys write(fd int, p []byte) (n int, err error) +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ +//sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE + +/* + * Unimplemented + */ +// __getcwd +// __semctl +// __syscall +// __sysctl +// adjfreq +// break +// clock_getres +// clock_gettime +// clock_settime +// closefrom +// execve +// faccessat +// fchmodat +// fchownat +// fcntl +// fhopen +// fhstat +// fhstatfs +// fork +// fstatat +// futimens +// getfh +// getgid +// getitimer +// getlogin +// getresgid +// getresuid +// getrtable +// getthrid +// ioctl +// ktrace +// lfs_bmapv +// lfs_markv +// lfs_segclean +// lfs_segwait +// linkat +// mincore +// minherit +// mkdirat +// mkfifoat +// mknodat +// mount +// mquery +// msgctl +// msgget +// msgrcv +// msgsnd +// nfssvc +// nnpfspioctl +// openat +// poll +// preadv +// profil +// pwritev +// quotactl +// readlinkat +// readv +// reboot +// renameat +// rfork +// sched_yield +// semget +// semop +// setgroups +// setitimer +// setrtable +// setsockopt +// shmat +// shmctl +// shmdt +// shmget +// sigaction +// sigaltstack +// sigpending +// sigprocmask +// sigreturn +// sigsuspend +// symlinkat +// sysarch +// syscall +// threxit +// thrsigdivert +// thrsleep +// thrwakeup +// unlinkat +// utimensat +// vfork +// writev diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go new file mode 100644 index 0000000000000000000000000000000000000000..a66ddc59ce9e70f5a097f305e75a991e08fe4caa --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_openbsd_386.go @@ -0,0 +1,42 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build 386,openbsd + +package unix + +func Getpagesize() int { return 4096 } + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = int64(nsec / 1e9) + ts.Nsec = int32(nsec % 1e9) + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = int32(nsec % 1e9 / 1e3) + tv.Sec = int64(nsec / 1e9) + return +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint32(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint32(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..0776c1faf98babcd2b9cdddcd0040f864505fa6f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go @@ -0,0 +1,42 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,openbsd + +package unix + +func Getpagesize() int { return 4096 } + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = nsec % 1e9 / 1e3 + tv.Sec = nsec / 1e9 + return +} + +func SetKevent(k *Kevent_t, fd, mode, flags int) { + k.Ident = uint64(fd) + k.Filter = int16(mode) + k.Flags = uint16(flags) +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (msghdr *Msghdr) SetControllen(length int) { + msghdr.Controllen = uint32(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_solaris.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_solaris.go new file mode 100644 index 0000000000000000000000000000000000000000..eb489b159fd611ffebf511029c32b4da86bf79ad --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -0,0 +1,713 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Solaris system calls. +// This file is compiled as ordinary Go code, +// but it is also input to mksyscall, +// which parses the //sys lines and generates system call stubs. +// Note that sometimes we use a lowercase //sys name and wrap +// it in our own nicer implementation, either here or in +// syscall_solaris.go or syscall_unix.go. + +package unix + +import ( + "sync/atomic" + "syscall" + "unsafe" +) + +// Implemented in runtime/syscall_solaris.go. +type syscallFunc uintptr + +func rawSysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) +func sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) + +type SockaddrDatalink struct { + Family uint16 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [244]int8 + raw RawSockaddrDatalink +} + +func clen(n []byte) int { + for i := 0; i < len(n); i++ { + if n[i] == 0 { + return i + } + } + return len(n) +} + +// ParseDirent parses up to max directory entries in buf, +// appending the names to names. It returns the number +// bytes consumed from buf, the number of entries added +// to names, and the new names slice. +func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, newnames []string) { + origlen := len(buf) + for max != 0 && len(buf) > 0 { + dirent := (*Dirent)(unsafe.Pointer(&buf[0])) + if dirent.Reclen == 0 { + buf = nil + break + } + buf = buf[dirent.Reclen:] + if dirent.Ino == 0 { // File absent in directory. + continue + } + bytes := (*[10000]byte)(unsafe.Pointer(&dirent.Name[0])) + var name = string(bytes[0:clen(bytes[:])]) + if name == "." || name == ".." { // Useless names + continue + } + max-- + count++ + names = append(names, name) + } + return origlen - len(buf), count, names +} + +func pipe() (r uintptr, w uintptr, err uintptr) + +func Pipe(p []int) (err error) { + if len(p) != 2 { + return EINVAL + } + r0, w0, e1 := pipe() + if e1 != 0 { + err = syscall.Errno(e1) + } + p[0], p[1] = int(r0), int(w0) + return +} + +func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Family = AF_INET + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil +} + +func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) { + if sa.Port < 0 || sa.Port > 0xFFFF { + return nil, 0, EINVAL + } + sa.raw.Family = AF_INET6 + p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port)) + p[0] = byte(sa.Port >> 8) + p[1] = byte(sa.Port) + sa.raw.Scope_id = sa.ZoneId + for i := 0; i < len(sa.Addr); i++ { + sa.raw.Addr[i] = sa.Addr[i] + } + return unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil +} + +func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) { + name := sa.Name + n := len(name) + if n >= len(sa.raw.Path) { + return nil, 0, EINVAL + } + sa.raw.Family = AF_UNIX + for i := 0; i < n; i++ { + sa.raw.Path[i] = int8(name[i]) + } + // length is family (uint16), name, NUL. + sl := _Socklen(2) + if n > 0 { + sl += _Socklen(n) + 1 + } + if sa.raw.Path[0] == '@' { + sa.raw.Path[0] = 0 + // Don't count trailing NUL for abstract address. + sl-- + } + + return unsafe.Pointer(&sa.raw), sl, nil +} + +//sys getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getsockname + +func Getsockname(fd int) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if err = getsockname(fd, &rsa, &len); err != nil { + return + } + return anyToSockaddr(&rsa) +} + +const ImplementsGetwd = true + +//sys Getcwd(buf []byte) (n int, err error) + +func Getwd() (wd string, err error) { + var buf [PathMax]byte + // Getcwd will return an error if it failed for any reason. + _, err = Getcwd(buf[0:]) + if err != nil { + return "", err + } + n := clen(buf[:]) + if n < 1 { + return "", EINVAL + } + return string(buf[:n]), nil +} + +/* + * Wrapped + */ + +//sysnb getgroups(ngid int, gid *_Gid_t) (n int, err error) +//sysnb setgroups(ngid int, gid *_Gid_t) (err error) + +func Getgroups() (gids []int, err error) { + n, err := getgroups(0, nil) + // Check for error and sanity check group count. Newer versions of + // Solaris allow up to 1024 (NGROUPS_MAX). + if n < 0 || n > 1024 { + if err != nil { + return nil, err + } + return nil, EINVAL + } else if n == 0 { + return nil, nil + } + + a := make([]_Gid_t, n) + n, err = getgroups(n, &a[0]) + if n == -1 { + return nil, err + } + gids = make([]int, n) + for i, v := range a[0:n] { + gids[i] = int(v) + } + return +} + +func Setgroups(gids []int) (err error) { + if len(gids) == 0 { + return setgroups(0, nil) + } + + a := make([]_Gid_t, len(gids)) + for i, v := range gids { + a[i] = _Gid_t(v) + } + return setgroups(len(a), &a[0]) +} + +func ReadDirent(fd int, buf []byte) (n int, err error) { + // Final argument is (basep *uintptr) and the syscall doesn't take nil. + // TODO(rsc): Can we use a single global basep for all calls? + return Getdents(fd, buf, new(uintptr)) +} + +// Wait status is 7 bits at bottom, either 0 (exited), +// 0x7F (stopped), or a signal number that caused an exit. +// The 0x80 bit is whether there was a core dump. +// An extra number (exit code, signal causing a stop) +// is in the high bits. + +type WaitStatus uint32 + +const ( + mask = 0x7F + core = 0x80 + shift = 8 + + exited = 0 + stopped = 0x7F +) + +func (w WaitStatus) Exited() bool { return w&mask == exited } + +func (w WaitStatus) ExitStatus() int { + if w&mask != exited { + return -1 + } + return int(w >> shift) +} + +func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != 0 } + +func (w WaitStatus) Signal() syscall.Signal { + sig := syscall.Signal(w & mask) + if sig == stopped || sig == 0 { + return -1 + } + return sig +} + +func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 } + +func (w WaitStatus) Stopped() bool { return w&mask == stopped && syscall.Signal(w>>shift) != SIGSTOP } + +func (w WaitStatus) Continued() bool { return w&mask == stopped && syscall.Signal(w>>shift) == SIGSTOP } + +func (w WaitStatus) StopSignal() syscall.Signal { + if !w.Stopped() { + return -1 + } + return syscall.Signal(w>>shift) & 0xFF +} + +func (w WaitStatus) TrapCause() int { return -1 } + +func wait4(pid uintptr, wstatus *WaitStatus, options uintptr, rusage *Rusage) (wpid uintptr, err uintptr) + +func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) { + r0, e1 := wait4(uintptr(pid), wstatus, uintptr(options), rusage) + if e1 != 0 { + err = syscall.Errno(e1) + } + return int(r0), err +} + +func gethostname() (name string, err uintptr) + +func Gethostname() (name string, err error) { + name, e1 := gethostname() + if e1 != 0 { + err = syscall.Errno(e1) + } + return name, err +} + +//sys utimes(path string, times *[2]Timeval) (err error) + +func Utimes(path string, tv []Timeval) (err error) { + if tv == nil { + return utimes(path, nil) + } + if len(tv) != 2 { + return EINVAL + } + return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +//sys utimensat(fd int, path string, times *[2]Timespec, flag int) (err error) + +func UtimesNano(path string, ts []Timespec) error { + if ts == nil { + return utimensat(AT_FDCWD, path, nil, 0) + } + if len(ts) != 2 { + return EINVAL + } + return utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0) +} + +func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error { + if ts == nil { + return utimensat(dirfd, path, nil, flags) + } + if len(ts) != 2 { + return EINVAL + } + return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags) +} + +//sys fcntl(fd int, cmd int, arg int) (val int, err error) + +// FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command. +func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfcntl)), 3, uintptr(fd), uintptr(cmd), uintptr(unsafe.Pointer(lk)), 0, 0, 0) + if e1 != 0 { + return e1 + } + return nil +} + +//sys futimesat(fildes int, path *byte, times *[2]Timeval) (err error) + +func Futimesat(dirfd int, path string, tv []Timeval) error { + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + if tv == nil { + return futimesat(dirfd, pathp, nil) + } + if len(tv) != 2 { + return EINVAL + } + return futimesat(dirfd, pathp, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +// Solaris doesn't have an futimes function because it allows NULL to be +// specified as the path for futimesat. However, Go doesn't like +// NULL-style string interfaces, so this simple wrapper is provided. +func Futimes(fd int, tv []Timeval) error { + if tv == nil { + return futimesat(fd, nil, nil) + } + if len(tv) != 2 { + return EINVAL + } + return futimesat(fd, nil, (*[2]Timeval)(unsafe.Pointer(&tv[0]))) +} + +func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) { + switch rsa.Addr.Family { + case AF_UNIX: + pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa)) + sa := new(SockaddrUnix) + // Assume path ends at NUL. + // This is not technically the Solaris semantics for + // abstract Unix domain sockets -- they are supposed + // to be uninterpreted fixed-size binary blobs -- but + // everyone uses this convention. + n := 0 + for n < len(pp.Path) && pp.Path[n] != 0 { + n++ + } + bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n] + sa.Name = string(bytes) + return sa, nil + + case AF_INET: + pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet4) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + + case AF_INET6: + pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa)) + sa := new(SockaddrInet6) + p := (*[2]byte)(unsafe.Pointer(&pp.Port)) + sa.Port = int(p[0])<<8 + int(p[1]) + sa.ZoneId = pp.Scope_id + for i := 0; i < len(sa.Addr); i++ { + sa.Addr[i] = pp.Addr[i] + } + return sa, nil + } + return nil, EAFNOSUPPORT +} + +//sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) = libsocket.accept + +func Accept(fd int) (nfd int, sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + nfd, err = accept(fd, &rsa, &len) + if nfd == -1 { + return + } + sa, err = anyToSockaddr(&rsa) + if err != nil { + Close(nfd) + nfd = 0 + } + return +} + +//sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.recvmsg + +func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { + var msg Msghdr + var rsa RawSockaddrAny + msg.Name = (*byte)(unsafe.Pointer(&rsa)) + msg.Namelen = uint32(SizeofSockaddrAny) + var iov Iovec + if len(p) > 0 { + iov.Base = (*int8)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy int8 + if len(oob) > 0 { + // receive at least one normal byte + if len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Accrights = (*int8)(unsafe.Pointer(&oob[0])) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = recvmsg(fd, &msg, flags); n == -1 { + return + } + oobn = int(msg.Accrightslen) + // source address is only specified if the socket is unconnected + if rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(&rsa) + } + return +} + +func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) { + _, err = SendmsgN(fd, p, oob, to, flags) + return +} + +//sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.sendmsg + +func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) { + var ptr unsafe.Pointer + var salen _Socklen + if to != nil { + ptr, salen, err = to.sockaddr() + if err != nil { + return 0, err + } + } + var msg Msghdr + msg.Name = (*byte)(unsafe.Pointer(ptr)) + msg.Namelen = uint32(salen) + var iov Iovec + if len(p) > 0 { + iov.Base = (*int8)(unsafe.Pointer(&p[0])) + iov.SetLen(len(p)) + } + var dummy int8 + if len(oob) > 0 { + // send at least one normal byte + if len(p) == 0 { + iov.Base = &dummy + iov.SetLen(1) + } + msg.Accrights = (*int8)(unsafe.Pointer(&oob[0])) + } + msg.Iov = &iov + msg.Iovlen = 1 + if n, err = sendmsg(fd, &msg, flags); err != nil { + return 0, err + } + if len(oob) > 0 && len(p) == 0 { + n = 0 + } + return n, nil +} + +//sys acct(path *byte) (err error) + +func Acct(path string) (err error) { + if len(path) == 0 { + // Assume caller wants to disable accounting. + return acct(nil) + } + + pathp, err := BytePtrFromString(path) + if err != nil { + return err + } + return acct(pathp) +} + +/* + * Expose the ioctl function + */ + +//sys ioctl(fd int, req int, arg uintptr) (err error) + +func IoctlSetInt(fd int, req int, value int) (err error) { + return ioctl(fd, req, uintptr(value)) +} + +func IoctlSetWinsize(fd int, req int, value *Winsize) (err error) { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermios(fd int, req int, value *Termios) (err error) { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlSetTermio(fd int, req int, value *Termio) (err error) { + return ioctl(fd, req, uintptr(unsafe.Pointer(value))) +} + +func IoctlGetInt(fd int, req int) (int, error) { + var value int + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return value, err +} + +func IoctlGetWinsize(fd int, req int) (*Winsize, error) { + var value Winsize + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermios(fd int, req int) (*Termios, error) { + var value Termios + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +func IoctlGetTermio(fd int, req int) (*Termio, error) { + var value Termio + err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + return &value, err +} + +/* + * Exposed directly + */ +//sys Access(path string, mode uint32) (err error) +//sys Adjtime(delta *Timeval, olddelta *Timeval) (err error) +//sys Chdir(path string) (err error) +//sys Chmod(path string, mode uint32) (err error) +//sys Chown(path string, uid int, gid int) (err error) +//sys Chroot(path string) (err error) +//sys Close(fd int) (err error) +//sys Creat(path string, mode uint32) (fd int, err error) +//sys Dup(fd int) (nfd int, err error) +//sys Dup2(oldfd int, newfd int) (err error) +//sys Exit(code int) +//sys Fchdir(fd int) (err error) +//sys Fchmod(fd int, mode uint32) (err error) +//sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) +//sys Fchown(fd int, uid int, gid int) (err error) +//sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) +//sys Fdatasync(fd int) (err error) +//sys Fpathconf(fd int, name int) (val int, err error) +//sys Fstat(fd int, stat *Stat_t) (err error) +//sys Getdents(fd int, buf []byte, basep *uintptr) (n int, err error) +//sysnb Getgid() (gid int) +//sysnb Getpid() (pid int) +//sysnb Getpgid(pid int) (pgid int, err error) +//sysnb Getpgrp() (pgid int, err error) +//sys Geteuid() (euid int) +//sys Getegid() (egid int) +//sys Getppid() (ppid int) +//sys Getpriority(which int, who int) (n int, err error) +//sysnb Getrlimit(which int, lim *Rlimit) (err error) +//sysnb Getrusage(who int, rusage *Rusage) (err error) +//sysnb Gettimeofday(tv *Timeval) (err error) +//sysnb Getuid() (uid int) +//sys Kill(pid int, signum syscall.Signal) (err error) +//sys Lchown(path string, uid int, gid int) (err error) +//sys Link(path string, link string) (err error) +//sys Listen(s int, backlog int) (err error) = libsocket.listen +//sys Lstat(path string, stat *Stat_t) (err error) +//sys Madvise(b []byte, advice int) (err error) +//sys Mkdir(path string, mode uint32) (err error) +//sys Mkdirat(dirfd int, path string, mode uint32) (err error) +//sys Mkfifo(path string, mode uint32) (err error) +//sys Mkfifoat(dirfd int, path string, mode uint32) (err error) +//sys Mknod(path string, mode uint32, dev int) (err error) +//sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error) +//sys Mlock(b []byte) (err error) +//sys Mlockall(flags int) (err error) +//sys Mprotect(b []byte, prot int) (err error) +//sys Munlock(b []byte) (err error) +//sys Munlockall() (err error) +//sys Nanosleep(time *Timespec, leftover *Timespec) (err error) +//sys Open(path string, mode int, perm uint32) (fd int, err error) +//sys Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) +//sys Pathconf(path string, name int) (val int, err error) +//sys Pause() (err error) +//sys Pread(fd int, p []byte, offset int64) (n int, err error) +//sys Pwrite(fd int, p []byte, offset int64) (n int, err error) +//sys read(fd int, p []byte) (n int, err error) +//sys Readlink(path string, buf []byte) (n int, err error) +//sys Rename(from string, to string) (err error) +//sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) +//sys Rmdir(path string) (err error) +//sys Seek(fd int, offset int64, whence int) (newoffset int64, err error) = lseek +//sysnb Setegid(egid int) (err error) +//sysnb Seteuid(euid int) (err error) +//sysnb Setgid(gid int) (err error) +//sys Sethostname(p []byte) (err error) +//sysnb Setpgid(pid int, pgid int) (err error) +//sys Setpriority(which int, who int, prio int) (err error) +//sysnb Setregid(rgid int, egid int) (err error) +//sysnb Setreuid(ruid int, euid int) (err error) +//sysnb Setrlimit(which int, lim *Rlimit) (err error) +//sysnb Setsid() (pid int, err error) +//sysnb Setuid(uid int) (err error) +//sys Shutdown(s int, how int) (err error) = libsocket.shutdown +//sys Stat(path string, stat *Stat_t) (err error) +//sys Symlink(path string, link string) (err error) +//sys Sync() (err error) +//sysnb Times(tms *Tms) (ticks uintptr, err error) +//sys Truncate(path string, length int64) (err error) +//sys Fsync(fd int) (err error) +//sys Ftruncate(fd int, length int64) (err error) +//sys Umask(mask int) (oldmask int) +//sysnb Uname(buf *Utsname) (err error) +//sys Unmount(target string, flags int) (err error) = libc.umount +//sys Unlink(path string) (err error) +//sys Unlinkat(dirfd int, path string, flags int) (err error) +//sys Ustat(dev int, ubuf *Ustat_t) (err error) +//sys Utime(path string, buf *Utimbuf) (err error) +//sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.bind +//sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.connect +//sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) +//sys munmap(addr uintptr, length uintptr) (err error) +//sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.sendto +//sys socket(domain int, typ int, proto int) (fd int, err error) = libsocket.socket +//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) = libsocket.socketpair +//sys write(fd int, p []byte) (n int, err error) +//sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) = libsocket.getsockopt +//sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getpeername +//sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) = libsocket.setsockopt +//sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) = libsocket.recvfrom + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procread)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwrite)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +var mapper = &mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, +} + +func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + return mapper.Mmap(fd, offset, length, prot, flags) +} + +func Munmap(b []byte) (err error) { + return mapper.Munmap(b) +} + +//sys sysconf(name int) (n int64, err error) + +// pageSize caches the value of Getpagesize, since it can't change +// once the system is booted. +var pageSize int64 // accessed atomically + +func Getpagesize() int { + n := atomic.LoadInt64(&pageSize) + if n == 0 { + n, _ = sysconf(_SC_PAGESIZE) + atomic.StoreInt64(&pageSize, n) + } + return int(n) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..5aff62c3bbeac100bfdaa31af0087e4d473a908e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go @@ -0,0 +1,35 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,solaris + +package unix + +func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) } + +func NsecToTimespec(nsec int64) (ts Timespec) { + ts.Sec = nsec / 1e9 + ts.Nsec = nsec % 1e9 + return +} + +func NsecToTimeval(nsec int64) (tv Timeval) { + nsec += 999 // round up to microsecond + tv.Usec = nsec % 1e9 / 1e3 + tv.Sec = int64(nsec / 1e9) + return +} + +func (iov *Iovec) SetLen(length int) { + iov.Len = uint64(length) +} + +func (cmsg *Cmsghdr) SetLen(length int) { + cmsg.Len = uint32(length) +} + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + // TODO(aram): implement this, see issue 5847. + panic("unimplemented") +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_unix.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_unix.go new file mode 100644 index 0000000000000000000000000000000000000000..b46b25028c9f7b8250c41654652dfe95354465e4 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/syscall_unix.go @@ -0,0 +1,297 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build darwin dragonfly freebsd linux netbsd openbsd solaris + +package unix + +import ( + "runtime" + "sync" + "syscall" + "unsafe" +) + +var ( + Stdin = 0 + Stdout = 1 + Stderr = 2 +) + +const ( + darwin64Bit = runtime.GOOS == "darwin" && sizeofPtr == 8 + dragonfly64Bit = runtime.GOOS == "dragonfly" && sizeofPtr == 8 + netbsd32Bit = runtime.GOOS == "netbsd" && sizeofPtr == 4 +) + +// Do the interface allocations only once for common +// Errno values. +var ( + errEAGAIN error = syscall.EAGAIN + errEINVAL error = syscall.EINVAL + errENOENT error = syscall.ENOENT +) + +// errnoErr returns common boxed Errno values, to prevent +// allocations at runtime. +func errnoErr(e syscall.Errno) error { + switch e { + case 0: + return nil + case EAGAIN: + return errEAGAIN + case EINVAL: + return errEINVAL + case ENOENT: + return errENOENT + } + return e +} + +func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) +func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) +func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) +func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) + +// Mmap manager, for use by operating system-specific implementations. + +type mmapper struct { + sync.Mutex + active map[*byte][]byte // active mappings; key is last byte in mapping + mmap func(addr, length uintptr, prot, flags, fd int, offset int64) (uintptr, error) + munmap func(addr uintptr, length uintptr) error +} + +func (m *mmapper) Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + if length <= 0 { + return nil, EINVAL + } + + // Map the requested memory. + addr, errno := m.mmap(0, uintptr(length), prot, flags, fd, offset) + if errno != nil { + return nil, errno + } + + // Slice memory layout + var sl = struct { + addr uintptr + len int + cap int + }{addr, length, length} + + // Use unsafe to turn sl into a []byte. + b := *(*[]byte)(unsafe.Pointer(&sl)) + + // Register mapping in m and return it. + p := &b[cap(b)-1] + m.Lock() + defer m.Unlock() + m.active[p] = b + return b, nil +} + +func (m *mmapper) Munmap(data []byte) (err error) { + if len(data) == 0 || len(data) != cap(data) { + return EINVAL + } + + // Find the base of the mapping. + p := &data[cap(data)-1] + m.Lock() + defer m.Unlock() + b := m.active[p] + if b == nil || &b[0] != &data[0] { + return EINVAL + } + + // Unmap the memory and update m. + if errno := m.munmap(uintptr(unsafe.Pointer(&b[0])), uintptr(len(b))); errno != nil { + return errno + } + delete(m.active, p) + return nil +} + +func Read(fd int, p []byte) (n int, err error) { + n, err = read(fd, p) + if raceenabled { + if n > 0 { + raceWriteRange(unsafe.Pointer(&p[0]), n) + } + if err == nil { + raceAcquire(unsafe.Pointer(&ioSync)) + } + } + return +} + +func Write(fd int, p []byte) (n int, err error) { + if raceenabled { + raceReleaseMerge(unsafe.Pointer(&ioSync)) + } + n, err = write(fd, p) + if raceenabled && n > 0 { + raceReadRange(unsafe.Pointer(&p[0]), n) + } + return +} + +// For testing: clients can set this flag to force +// creation of IPv6 sockets to return EAFNOSUPPORT. +var SocketDisableIPv6 bool + +type Sockaddr interface { + sockaddr() (ptr unsafe.Pointer, len _Socklen, err error) // lowercase; only we can define Sockaddrs +} + +type SockaddrInet4 struct { + Port int + Addr [4]byte + raw RawSockaddrInet4 +} + +type SockaddrInet6 struct { + Port int + ZoneId uint32 + Addr [16]byte + raw RawSockaddrInet6 +} + +type SockaddrUnix struct { + Name string + raw RawSockaddrUnix +} + +func Bind(fd int, sa Sockaddr) (err error) { + ptr, n, err := sa.sockaddr() + if err != nil { + return err + } + return bind(fd, ptr, n) +} + +func Connect(fd int, sa Sockaddr) (err error) { + ptr, n, err := sa.sockaddr() + if err != nil { + return err + } + return connect(fd, ptr, n) +} + +func Getpeername(fd int) (sa Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if err = getpeername(fd, &rsa, &len); err != nil { + return + } + return anyToSockaddr(&rsa) +} + +func GetsockoptInt(fd, level, opt int) (value int, err error) { + var n int32 + vallen := _Socklen(4) + err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen) + return int(n), err +} + +func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) { + var rsa RawSockaddrAny + var len _Socklen = SizeofSockaddrAny + if n, err = recvfrom(fd, p, flags, &rsa, &len); err != nil { + return + } + if rsa.Addr.Family != AF_UNSPEC { + from, err = anyToSockaddr(&rsa) + } + return +} + +func Sendto(fd int, p []byte, flags int, to Sockaddr) (err error) { + ptr, n, err := to.sockaddr() + if err != nil { + return err + } + return sendto(fd, p, flags, ptr, n) +} + +func SetsockoptByte(fd, level, opt int, value byte) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(&value), 1) +} + +func SetsockoptInt(fd, level, opt int, value int) (err error) { + var n = int32(value) + return setsockopt(fd, level, opt, unsafe.Pointer(&n), 4) +} + +func SetsockoptInet4Addr(fd, level, opt int, value [4]byte) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(&value[0]), 4) +} + +func SetsockoptIPMreq(fd, level, opt int, mreq *IPMreq) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPMreq) +} + +func SetsockoptIPv6Mreq(fd, level, opt int, mreq *IPv6Mreq) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPv6Mreq) +} + +func SetsockoptICMPv6Filter(fd, level, opt int, filter *ICMPv6Filter) error { + return setsockopt(fd, level, opt, unsafe.Pointer(filter), SizeofICMPv6Filter) +} + +func SetsockoptLinger(fd, level, opt int, l *Linger) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(l), SizeofLinger) +} + +func SetsockoptString(fd, level, opt int, s string) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(&[]byte(s)[0]), uintptr(len(s))) +} + +func SetsockoptTimeval(fd, level, opt int, tv *Timeval) (err error) { + return setsockopt(fd, level, opt, unsafe.Pointer(tv), unsafe.Sizeof(*tv)) +} + +func Socket(domain, typ, proto int) (fd int, err error) { + if domain == AF_INET6 && SocketDisableIPv6 { + return -1, EAFNOSUPPORT + } + fd, err = socket(domain, typ, proto) + return +} + +func Socketpair(domain, typ, proto int) (fd [2]int, err error) { + var fdx [2]int32 + err = socketpair(domain, typ, proto, &fdx) + if err == nil { + fd[0] = int(fdx[0]) + fd[1] = int(fdx[1]) + } + return +} + +func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + if raceenabled { + raceReleaseMerge(unsafe.Pointer(&ioSync)) + } + return sendfile(outfd, infd, offset, count) +} + +var ioSync int64 + +func CloseOnExec(fd int) { fcntl(fd, F_SETFD, FD_CLOEXEC) } + +func SetNonblock(fd int, nonblocking bool) (err error) { + flag, err := fcntl(fd, F_GETFL, 0) + if err != nil { + return err + } + if nonblocking { + flag |= O_NONBLOCK + } else { + flag &= ^O_NONBLOCK + } + _, err = fcntl(fd, F_SETFL, flag) + return err +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/types_darwin.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/types_darwin.go new file mode 100644 index 0000000000000000000000000000000000000000..1153261822b22494e2596ea6f5fdd070f4fdda9a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/types_darwin.go @@ -0,0 +1,250 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +Input to cgo -godefs. See also mkerrors.sh and mkall.sh +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define __DARWIN_UNIX03 0 +#define KERNEL +#define _DARWIN_USE_64_BIT_INODE +#include <dirent.h> +#include <fcntl.h> +#include <signal.h> +#include <termios.h> +#include <unistd.h> +#include <mach/mach.h> +#include <mach/message.h> +#include <sys/event.h> +#include <sys/mman.h> +#include <sys/mount.h> +#include <sys/param.h> +#include <sys/ptrace.h> +#include <sys/resource.h> +#include <sys/select.h> +#include <sys/signal.h> +#include <sys/socket.h> +#include <sys/stat.h> +#include <sys/time.h> +#include <sys/types.h> +#include <sys/uio.h> +#include <sys/un.h> +#include <sys/wait.h> +#include <net/bpf.h> +#include <net/if.h> +#include <net/if_dl.h> +#include <net/if_var.h> +#include <net/route.h> +#include <netinet/in.h> +#include <netinet/icmp6.h> +#include <netinet/tcp.h> + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +type Timeval32 C.struct_timeval32 + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +type Stat_t C.struct_stat64 + +type Statfs_t C.struct_statfs64 + +type Flock_t C.struct_flock + +type Fstore_t C.struct_fstore + +type Radvisory_t C.struct_radvisory + +type Fbootstraptransfer_t C.struct_fbootstraptransfer + +type Log2phys_t C.struct_log2phys + +type Fsid C.struct_fsid + +type Dirent C.struct_dirent + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet4Pktinfo C.struct_in_pktinfo + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet4Pktinfo = C.sizeof_struct_in_pktinfo + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr + SizeofIfmaMsghdr2 = C.sizeof_struct_ifma_msghdr2 + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfmaMsghdr C.struct_ifma_msghdr + +type IfmaMsghdr2 C.struct_ifma_msghdr2 + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +// Terminal handling + +type Termios C.struct_termios + +// fchmodat-like syscalls. + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/types_dragonfly.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/types_dragonfly.go new file mode 100644 index 0000000000000000000000000000000000000000..f3c971dffd49663d0afedf34a5fe9175fcfccb12 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/types_dragonfly.go @@ -0,0 +1,242 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +Input to cgo -godefs. See also mkerrors.sh and mkall.sh +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +#include <dirent.h> +#include <fcntl.h> +#include <signal.h> +#include <termios.h> +#include <stdio.h> +#include <unistd.h> +#include <sys/event.h> +#include <sys/mman.h> +#include <sys/mount.h> +#include <sys/param.h> +#include <sys/ptrace.h> +#include <sys/resource.h> +#include <sys/select.h> +#include <sys/signal.h> +#include <sys/socket.h> +#include <sys/stat.h> +#include <sys/time.h> +#include <sys/types.h> +#include <sys/un.h> +#include <sys/wait.h> +#include <net/bpf.h> +#include <net/if.h> +#include <net/if_dl.h> +#include <net/route.h> +#include <netinet/in.h> +#include <netinet/icmp6.h> +#include <netinet/tcp.h> + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +const ( // Directory mode bits + S_IFMT = C.S_IFMT + S_IFIFO = C.S_IFIFO + S_IFCHR = C.S_IFCHR + S_IFDIR = C.S_IFDIR + S_IFBLK = C.S_IFBLK + S_IFREG = C.S_IFREG + S_IFLNK = C.S_IFLNK + S_IFSOCK = C.S_IFSOCK + S_ISUID = C.S_ISUID + S_ISGID = C.S_ISGID + S_ISVTX = C.S_ISVTX + S_IRUSR = C.S_IRUSR + S_IWUSR = C.S_IWUSR + S_IXUSR = C.S_IXUSR +) + +type Stat_t C.struct_stat + +type Statfs_t C.struct_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type Fsid C.struct_fsid + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfmaMsghdr C.struct_ifma_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +// Terminal handling + +type Termios C.struct_termios diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/types_freebsd.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/types_freebsd.go new file mode 100644 index 0000000000000000000000000000000000000000..ae24557ad15511cc31063679e725794ee6139d63 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/types_freebsd.go @@ -0,0 +1,353 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +Input to cgo -godefs. See also mkerrors.sh and mkall.sh +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +#include <dirent.h> +#include <fcntl.h> +#include <signal.h> +#include <termios.h> +#include <stdio.h> +#include <unistd.h> +#include <sys/event.h> +#include <sys/mman.h> +#include <sys/mount.h> +#include <sys/param.h> +#include <sys/ptrace.h> +#include <sys/resource.h> +#include <sys/select.h> +#include <sys/signal.h> +#include <sys/socket.h> +#include <sys/stat.h> +#include <sys/time.h> +#include <sys/types.h> +#include <sys/un.h> +#include <sys/wait.h> +#include <net/bpf.h> +#include <net/if.h> +#include <net/if_dl.h> +#include <net/route.h> +#include <netinet/in.h> +#include <netinet/icmp6.h> +#include <netinet/tcp.h> + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +// This structure is a duplicate of stat on FreeBSD 8-STABLE. +// See /usr/include/sys/stat.h. +struct stat8 { +#undef st_atimespec st_atim +#undef st_mtimespec st_mtim +#undef st_ctimespec st_ctim +#undef st_birthtimespec st_birthtim + __dev_t st_dev; + ino_t st_ino; + mode_t st_mode; + nlink_t st_nlink; + uid_t st_uid; + gid_t st_gid; + __dev_t st_rdev; +#if __BSD_VISIBLE + struct timespec st_atimespec; + struct timespec st_mtimespec; + struct timespec st_ctimespec; +#else + time_t st_atime; + long __st_atimensec; + time_t st_mtime; + long __st_mtimensec; + time_t st_ctime; + long __st_ctimensec; +#endif + off_t st_size; + blkcnt_t st_blocks; + blksize_t st_blksize; + fflags_t st_flags; + __uint32_t st_gen; + __int32_t st_lspare; +#if __BSD_VISIBLE + struct timespec st_birthtimespec; + unsigned int :(8 / 2) * (16 - (int)sizeof(struct timespec)); + unsigned int :(8 / 2) * (16 - (int)sizeof(struct timespec)); +#else + time_t st_birthtime; + long st_birthtimensec; + unsigned int :(8 / 2) * (16 - (int)sizeof(struct __timespec)); + unsigned int :(8 / 2) * (16 - (int)sizeof(struct __timespec)); +#endif +}; + +// This structure is a duplicate of if_data on FreeBSD 8-STABLE. +// See /usr/include/net/if.h. +struct if_data8 { + u_char ifi_type; + u_char ifi_physical; + u_char ifi_addrlen; + u_char ifi_hdrlen; + u_char ifi_link_state; + u_char ifi_spare_char1; + u_char ifi_spare_char2; + u_char ifi_datalen; + u_long ifi_mtu; + u_long ifi_metric; + u_long ifi_baudrate; + u_long ifi_ipackets; + u_long ifi_ierrors; + u_long ifi_opackets; + u_long ifi_oerrors; + u_long ifi_collisions; + u_long ifi_ibytes; + u_long ifi_obytes; + u_long ifi_imcasts; + u_long ifi_omcasts; + u_long ifi_iqdrops; + u_long ifi_noproto; + u_long ifi_hwassist; + time_t ifi_epoch; + struct timeval ifi_lastchange; +}; + +// This structure is a duplicate of if_msghdr on FreeBSD 8-STABLE. +// See /usr/include/net/if.h. +struct if_msghdr8 { + u_short ifm_msglen; + u_char ifm_version; + u_char ifm_type; + int ifm_addrs; + int ifm_flags; + u_short ifm_index; + struct if_data8 ifm_data; +}; +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +const ( // Directory mode bits + S_IFMT = C.S_IFMT + S_IFIFO = C.S_IFIFO + S_IFCHR = C.S_IFCHR + S_IFDIR = C.S_IFDIR + S_IFBLK = C.S_IFBLK + S_IFREG = C.S_IFREG + S_IFLNK = C.S_IFLNK + S_IFSOCK = C.S_IFSOCK + S_ISUID = C.S_ISUID + S_ISGID = C.S_ISGID + S_ISVTX = C.S_ISVTX + S_IRUSR = C.S_IRUSR + S_IWUSR = C.S_IWUSR + S_IXUSR = C.S_IXUSR +) + +type Stat_t C.struct_stat8 + +type Statfs_t C.struct_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type Fsid C.struct_fsid + +// Advice to Fadvise + +const ( + FADV_NORMAL = C.POSIX_FADV_NORMAL + FADV_RANDOM = C.POSIX_FADV_RANDOM + FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL + FADV_WILLNEED = C.POSIX_FADV_WILLNEED + FADV_DONTNEED = C.POSIX_FADV_DONTNEED + FADV_NOREUSE = C.POSIX_FADV_NOREUSE +) + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPMreqn C.struct_ip_mreqn + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPMreqn = C.sizeof_struct_ip_mreqn + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + sizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfMsghdr = C.sizeof_struct_if_msghdr8 + sizeofIfData = C.sizeof_struct_if_data + SizeofIfData = C.sizeof_struct_if_data8 + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfmaMsghdr = C.sizeof_struct_ifma_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type ifMsghdr C.struct_if_msghdr + +type IfMsghdr C.struct_if_msghdr8 + +type ifData C.struct_if_data + +type IfData C.struct_if_data8 + +type IfaMsghdr C.struct_ifa_msghdr + +type IfmaMsghdr C.struct_ifma_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfZbuf = C.sizeof_struct_bpf_zbuf + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr + SizeofBpfZbufHeader = C.sizeof_struct_bpf_zbuf_header +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfZbuf C.struct_bpf_zbuf + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +type BpfZbufHeader C.struct_bpf_zbuf_header + +// Terminal handling + +type Termios C.struct_termios diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/types_linux.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/types_linux.go new file mode 100644 index 0000000000000000000000000000000000000000..10cbd09f6a004de310bcb320204e7b2db8c4f0f9 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/types_linux.go @@ -0,0 +1,448 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +Input to cgo -godefs. See also mkerrors.sh and mkall.sh +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define _LARGEFILE_SOURCE +#define _LARGEFILE64_SOURCE +#define _FILE_OFFSET_BITS 64 +#define _GNU_SOURCE + +#include <dirent.h> +#include <fcntl.h> +#include <netinet/in.h> +#include <netinet/tcp.h> +#include <netpacket/packet.h> +#include <poll.h> +#include <signal.h> +#include <stdio.h> +#include <sys/epoll.h> +#include <sys/inotify.h> +#include <sys/mman.h> +#include <sys/mount.h> +#include <sys/param.h> +#include <sys/ptrace.h> +#include <sys/resource.h> +#include <sys/select.h> +#include <sys/signal.h> +#include <sys/stat.h> +#include <sys/statfs.h> +#include <sys/sysinfo.h> +#include <sys/time.h> +#include <sys/times.h> +#include <sys/timex.h> +#include <sys/types.h> +#include <sys/un.h> +#include <sys/user.h> +#include <sys/utsname.h> +#include <sys/wait.h> +#include <linux/filter.h> +#include <linux/netlink.h> +#include <linux/rtnetlink.h> +#include <linux/icmpv6.h> +#include <asm/termbits.h> +#include <time.h> +#include <unistd.h> +#include <ustat.h> +#include <utime.h> +#include <bluetooth/bluetooth.h> +#include <bluetooth/hci.h> + +#ifdef TCSETS2 +// On systems that have "struct termios2" use this as type Termios. +typedef struct termios2 termios_t; +#else +typedef struct termios termios_t; +#endif + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_ll s5; + struct sockaddr_nl s6; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +// copied from /usr/include/linux/un.h +struct my_sockaddr_un { + sa_family_t sun_family; +#if defined(__ARM_EABI__) || defined(__powerpc64__) + // on ARM char is by default unsigned + signed char sun_path[108]; +#else + char sun_path[108]; +#endif +}; + +#ifdef __ARM_EABI__ +typedef struct user_regs PtraceRegs; +#elif defined(__aarch64__) +typedef struct user_pt_regs PtraceRegs; +#elif defined(__powerpc64__) +typedef struct pt_regs PtraceRegs; +#elif defined(__mips__) +typedef struct user PtraceRegs; +#elif defined(__s390x__) +typedef struct _user_regs_struct PtraceRegs; +#else +typedef struct user_regs_struct PtraceRegs; +#endif + +#if defined(__s390x__) +typedef struct _user_psw_struct ptracePsw; +typedef struct _user_fpregs_struct ptraceFpregs; +typedef struct _user_per_struct ptracePer; +#else +typedef struct {} ptracePsw; +typedef struct {} ptraceFpregs; +typedef struct {} ptracePer; +#endif + +// The real epoll_event is a union, and godefs doesn't handle it well. +struct my_epoll_event { + uint32_t events; +#if defined(__ARM_EABI__) || defined(__aarch64__) + // padding is not specified in linux/eventpoll.h but added to conform to the + // alignment requirements of EABI + int32_t padFd; +#elif defined(__powerpc64__) || defined(__s390x__) + int32_t _padFd; +#endif + int32_t fd; + int32_t pad; +}; + +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong + PathMax = C.PATH_MAX +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +type Timex C.struct_timex + +type Time_t C.time_t + +type Tms C.struct_tms + +type Utimbuf C.struct_utimbuf + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +type Stat_t C.struct_stat + +type Statfs_t C.struct_statfs + +type Dirent C.struct_dirent + +type Fsid C.fsid_t + +type Flock_t C.struct_flock + +// Advice to Fadvise + +const ( + FADV_NORMAL = C.POSIX_FADV_NORMAL + FADV_RANDOM = C.POSIX_FADV_RANDOM + FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL + FADV_WILLNEED = C.POSIX_FADV_WILLNEED + FADV_DONTNEED = C.POSIX_FADV_DONTNEED + FADV_NOREUSE = C.POSIX_FADV_NOREUSE +) + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_my_sockaddr_un + +type RawSockaddrLinklayer C.struct_sockaddr_ll + +type RawSockaddrNetlink C.struct_sockaddr_nl + +type RawSockaddrHCI C.struct_sockaddr_hci + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPMreqn C.struct_ip_mreqn + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet4Pktinfo C.struct_in_pktinfo + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +type Ucred C.struct_ucred + +type TCPInfo C.struct_tcp_info + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrLinklayer = C.sizeof_struct_sockaddr_ll + SizeofSockaddrNetlink = C.sizeof_struct_sockaddr_nl + SizeofSockaddrHCI = C.sizeof_struct_sockaddr_hci + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPMreqn = C.sizeof_struct_ip_mreqn + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet4Pktinfo = C.sizeof_struct_in_pktinfo + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter + SizeofUcred = C.sizeof_struct_ucred + SizeofTCPInfo = C.sizeof_struct_tcp_info +) + +// Netlink routing and interface messages + +const ( + IFA_UNSPEC = C.IFA_UNSPEC + IFA_ADDRESS = C.IFA_ADDRESS + IFA_LOCAL = C.IFA_LOCAL + IFA_LABEL = C.IFA_LABEL + IFA_BROADCAST = C.IFA_BROADCAST + IFA_ANYCAST = C.IFA_ANYCAST + IFA_CACHEINFO = C.IFA_CACHEINFO + IFA_MULTICAST = C.IFA_MULTICAST + IFLA_UNSPEC = C.IFLA_UNSPEC + IFLA_ADDRESS = C.IFLA_ADDRESS + IFLA_BROADCAST = C.IFLA_BROADCAST + IFLA_IFNAME = C.IFLA_IFNAME + IFLA_MTU = C.IFLA_MTU + IFLA_LINK = C.IFLA_LINK + IFLA_QDISC = C.IFLA_QDISC + IFLA_STATS = C.IFLA_STATS + IFLA_COST = C.IFLA_COST + IFLA_PRIORITY = C.IFLA_PRIORITY + IFLA_MASTER = C.IFLA_MASTER + IFLA_WIRELESS = C.IFLA_WIRELESS + IFLA_PROTINFO = C.IFLA_PROTINFO + IFLA_TXQLEN = C.IFLA_TXQLEN + IFLA_MAP = C.IFLA_MAP + IFLA_WEIGHT = C.IFLA_WEIGHT + IFLA_OPERSTATE = C.IFLA_OPERSTATE + IFLA_LINKMODE = C.IFLA_LINKMODE + IFLA_LINKINFO = C.IFLA_LINKINFO + IFLA_NET_NS_PID = C.IFLA_NET_NS_PID + IFLA_IFALIAS = C.IFLA_IFALIAS + IFLA_MAX = C.IFLA_MAX + RT_SCOPE_UNIVERSE = C.RT_SCOPE_UNIVERSE + RT_SCOPE_SITE = C.RT_SCOPE_SITE + RT_SCOPE_LINK = C.RT_SCOPE_LINK + RT_SCOPE_HOST = C.RT_SCOPE_HOST + RT_SCOPE_NOWHERE = C.RT_SCOPE_NOWHERE + RT_TABLE_UNSPEC = C.RT_TABLE_UNSPEC + RT_TABLE_COMPAT = C.RT_TABLE_COMPAT + RT_TABLE_DEFAULT = C.RT_TABLE_DEFAULT + RT_TABLE_MAIN = C.RT_TABLE_MAIN + RT_TABLE_LOCAL = C.RT_TABLE_LOCAL + RT_TABLE_MAX = C.RT_TABLE_MAX + RTA_UNSPEC = C.RTA_UNSPEC + RTA_DST = C.RTA_DST + RTA_SRC = C.RTA_SRC + RTA_IIF = C.RTA_IIF + RTA_OIF = C.RTA_OIF + RTA_GATEWAY = C.RTA_GATEWAY + RTA_PRIORITY = C.RTA_PRIORITY + RTA_PREFSRC = C.RTA_PREFSRC + RTA_METRICS = C.RTA_METRICS + RTA_MULTIPATH = C.RTA_MULTIPATH + RTA_FLOW = C.RTA_FLOW + RTA_CACHEINFO = C.RTA_CACHEINFO + RTA_TABLE = C.RTA_TABLE + RTN_UNSPEC = C.RTN_UNSPEC + RTN_UNICAST = C.RTN_UNICAST + RTN_LOCAL = C.RTN_LOCAL + RTN_BROADCAST = C.RTN_BROADCAST + RTN_ANYCAST = C.RTN_ANYCAST + RTN_MULTICAST = C.RTN_MULTICAST + RTN_BLACKHOLE = C.RTN_BLACKHOLE + RTN_UNREACHABLE = C.RTN_UNREACHABLE + RTN_PROHIBIT = C.RTN_PROHIBIT + RTN_THROW = C.RTN_THROW + RTN_NAT = C.RTN_NAT + RTN_XRESOLVE = C.RTN_XRESOLVE + RTNLGRP_NONE = C.RTNLGRP_NONE + RTNLGRP_LINK = C.RTNLGRP_LINK + RTNLGRP_NOTIFY = C.RTNLGRP_NOTIFY + RTNLGRP_NEIGH = C.RTNLGRP_NEIGH + RTNLGRP_TC = C.RTNLGRP_TC + RTNLGRP_IPV4_IFADDR = C.RTNLGRP_IPV4_IFADDR + RTNLGRP_IPV4_MROUTE = C.RTNLGRP_IPV4_MROUTE + RTNLGRP_IPV4_ROUTE = C.RTNLGRP_IPV4_ROUTE + RTNLGRP_IPV4_RULE = C.RTNLGRP_IPV4_RULE + RTNLGRP_IPV6_IFADDR = C.RTNLGRP_IPV6_IFADDR + RTNLGRP_IPV6_MROUTE = C.RTNLGRP_IPV6_MROUTE + RTNLGRP_IPV6_ROUTE = C.RTNLGRP_IPV6_ROUTE + RTNLGRP_IPV6_IFINFO = C.RTNLGRP_IPV6_IFINFO + RTNLGRP_IPV6_PREFIX = C.RTNLGRP_IPV6_PREFIX + RTNLGRP_IPV6_RULE = C.RTNLGRP_IPV6_RULE + RTNLGRP_ND_USEROPT = C.RTNLGRP_ND_USEROPT + SizeofNlMsghdr = C.sizeof_struct_nlmsghdr + SizeofNlMsgerr = C.sizeof_struct_nlmsgerr + SizeofRtGenmsg = C.sizeof_struct_rtgenmsg + SizeofNlAttr = C.sizeof_struct_nlattr + SizeofRtAttr = C.sizeof_struct_rtattr + SizeofIfInfomsg = C.sizeof_struct_ifinfomsg + SizeofIfAddrmsg = C.sizeof_struct_ifaddrmsg + SizeofRtMsg = C.sizeof_struct_rtmsg + SizeofRtNexthop = C.sizeof_struct_rtnexthop +) + +type NlMsghdr C.struct_nlmsghdr + +type NlMsgerr C.struct_nlmsgerr + +type RtGenmsg C.struct_rtgenmsg + +type NlAttr C.struct_nlattr + +type RtAttr C.struct_rtattr + +type IfInfomsg C.struct_ifinfomsg + +type IfAddrmsg C.struct_ifaddrmsg + +type RtMsg C.struct_rtmsg + +type RtNexthop C.struct_rtnexthop + +// Linux socket filter + +const ( + SizeofSockFilter = C.sizeof_struct_sock_filter + SizeofSockFprog = C.sizeof_struct_sock_fprog +) + +type SockFilter C.struct_sock_filter + +type SockFprog C.struct_sock_fprog + +// Inotify + +type InotifyEvent C.struct_inotify_event + +const SizeofInotifyEvent = C.sizeof_struct_inotify_event + +// Ptrace + +// Register structures +type PtraceRegs C.PtraceRegs + +// Structures contained in PtraceRegs on s390x (exported by mkpost.go) +type ptracePsw C.ptracePsw + +type ptraceFpregs C.ptraceFpregs + +type ptracePer C.ptracePer + +// Misc + +type FdSet C.fd_set + +type Sysinfo_t C.struct_sysinfo + +type Utsname C.struct_utsname + +type Ustat_t C.struct_ustat + +type EpollEvent C.struct_my_epoll_event + +const ( + AT_FDCWD = C.AT_FDCWD + AT_REMOVEDIR = C.AT_REMOVEDIR + AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW +) + +type PollFd C.struct_pollfd + +const ( + POLLIN = C.POLLIN + POLLPRI = C.POLLPRI + POLLOUT = C.POLLOUT + POLLRDHUP = C.POLLRDHUP + POLLERR = C.POLLERR + POLLHUP = C.POLLHUP + POLLNVAL = C.POLLNVAL +) + +// Terminal handling + +type Termios C.termios_t diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/types_netbsd.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/types_netbsd.go new file mode 100644 index 0000000000000000000000000000000000000000..d15f93d19251db2ccfc057015005b2a1a166445e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/types_netbsd.go @@ -0,0 +1,232 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +Input to cgo -godefs. See also mkerrors.sh and mkall.sh +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +#include <dirent.h> +#include <fcntl.h> +#include <signal.h> +#include <termios.h> +#include <stdio.h> +#include <unistd.h> +#include <sys/param.h> +#include <sys/types.h> +#include <sys/event.h> +#include <sys/mman.h> +#include <sys/mount.h> +#include <sys/ptrace.h> +#include <sys/resource.h> +#include <sys/select.h> +#include <sys/signal.h> +#include <sys/socket.h> +#include <sys/stat.h> +#include <sys/sysctl.h> +#include <sys/time.h> +#include <sys/uio.h> +#include <sys/un.h> +#include <sys/wait.h> +#include <net/bpf.h> +#include <net/if.h> +#include <net/if_dl.h> +#include <net/route.h> +#include <netinet/in.h> +#include <netinet/icmp6.h> +#include <netinet/tcp.h> + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +type Stat_t C.struct_stat + +type Statfs_t C.struct_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type Fsid C.fsid_t + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +type Mclpool C.struct_mclpool + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +type BpfTimeval C.struct_bpf_timeval + +// Terminal handling + +type Termios C.struct_termios + +// Sysctl + +type Sysctlnode C.struct_sysctlnode diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/types_openbsd.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/types_openbsd.go new file mode 100644 index 0000000000000000000000000000000000000000..b66fe25f73bd08643cfb5226942b58e3d280f98a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/types_openbsd.go @@ -0,0 +1,244 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +Input to cgo -godefs. See also mkerrors.sh and mkall.sh +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +#include <dirent.h> +#include <fcntl.h> +#include <signal.h> +#include <termios.h> +#include <stdio.h> +#include <unistd.h> +#include <sys/param.h> +#include <sys/types.h> +#include <sys/event.h> +#include <sys/mman.h> +#include <sys/mount.h> +#include <sys/ptrace.h> +#include <sys/resource.h> +#include <sys/select.h> +#include <sys/signal.h> +#include <sys/socket.h> +#include <sys/stat.h> +#include <sys/time.h> +#include <sys/uio.h> +#include <sys/un.h> +#include <sys/wait.h> +#include <net/bpf.h> +#include <net/if.h> +#include <net/if_dl.h> +#include <net/route.h> +#include <netinet/in.h> +#include <netinet/icmp6.h> +#include <netinet/tcp.h> + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +const ( // Directory mode bits + S_IFMT = C.S_IFMT + S_IFIFO = C.S_IFIFO + S_IFCHR = C.S_IFCHR + S_IFDIR = C.S_IFDIR + S_IFBLK = C.S_IFBLK + S_IFREG = C.S_IFREG + S_IFLNK = C.S_IFLNK + S_IFSOCK = C.S_IFSOCK + S_ISUID = C.S_ISUID + S_ISGID = C.S_ISGID + S_ISVTX = C.S_ISVTX + S_IRUSR = C.S_IRUSR + S_IWUSR = C.S_IWUSR + S_IXUSR = C.S_IXUSR +) + +type Stat_t C.struct_stat + +type Statfs_t C.struct_statfs + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +type Fsid C.fsid_t + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Ptrace requests + +const ( + PTRACE_TRACEME = C.PT_TRACE_ME + PTRACE_CONT = C.PT_CONTINUE + PTRACE_KILL = C.PT_KILL +) + +// Events (kqueue, kevent) + +type Kevent_t C.struct_kevent + +// Select + +type FdSet C.fd_set + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type IfAnnounceMsghdr C.struct_if_announcemsghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +type Mclpool C.struct_mclpool + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfHdr C.struct_bpf_hdr + +type BpfTimeval C.struct_bpf_timeval + +// Terminal handling + +type Termios C.struct_termios diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/types_solaris.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/types_solaris.go new file mode 100644 index 0000000000000000000000000000000000000000..6ad50eaba61c43d03a42eeb796ed3fe1b4fe57c8 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/types_solaris.go @@ -0,0 +1,260 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ignore + +/* +Input to cgo -godefs. See also mkerrors.sh and mkall.sh +*/ + +// +godefs map struct_in_addr [4]byte /* in_addr */ +// +godefs map struct_in6_addr [16]byte /* in6_addr */ + +package unix + +/* +#define KERNEL +// These defines ensure that builds done on newer versions of Solaris are +// backwards-compatible with older versions of Solaris and +// OpenSolaris-based derivatives. +#define __USE_SUNOS_SOCKETS__ // msghdr +#define __USE_LEGACY_PROTOTYPES__ // iovec +#include <dirent.h> +#include <fcntl.h> +#include <limits.h> +#include <signal.h> +#include <termios.h> +#include <termio.h> +#include <stdio.h> +#include <unistd.h> +#include <sys/mman.h> +#include <sys/mount.h> +#include <sys/param.h> +#include <sys/resource.h> +#include <sys/select.h> +#include <sys/signal.h> +#include <sys/socket.h> +#include <sys/stat.h> +#include <sys/time.h> +#include <sys/times.h> +#include <sys/types.h> +#include <sys/utsname.h> +#include <sys/un.h> +#include <sys/wait.h> +#include <net/bpf.h> +#include <net/if.h> +#include <net/if_dl.h> +#include <net/route.h> +#include <netinet/in.h> +#include <netinet/icmp6.h> +#include <netinet/tcp.h> +#include <ustat.h> +#include <utime.h> + +enum { + sizeofPtr = sizeof(void*), +}; + +union sockaddr_all { + struct sockaddr s1; // this one gets used for fields + struct sockaddr_in s2; // these pad it out + struct sockaddr_in6 s3; + struct sockaddr_un s4; + struct sockaddr_dl s5; +}; + +struct sockaddr_any { + struct sockaddr addr; + char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)]; +}; + +*/ +import "C" + +// Machine characteristics; for internal use. + +const ( + sizeofPtr = C.sizeofPtr + sizeofShort = C.sizeof_short + sizeofInt = C.sizeof_int + sizeofLong = C.sizeof_long + sizeofLongLong = C.sizeof_longlong + PathMax = C.PATH_MAX +) + +// Basic types + +type ( + _C_short C.short + _C_int C.int + _C_long C.long + _C_long_long C.longlong +) + +// Time + +type Timespec C.struct_timespec + +type Timeval C.struct_timeval + +type Timeval32 C.struct_timeval32 + +type Tms C.struct_tms + +type Utimbuf C.struct_utimbuf + +// Processes + +type Rusage C.struct_rusage + +type Rlimit C.struct_rlimit + +type _Gid_t C.gid_t + +// Files + +const ( // Directory mode bits + S_IFMT = C.S_IFMT + S_IFIFO = C.S_IFIFO + S_IFCHR = C.S_IFCHR + S_IFDIR = C.S_IFDIR + S_IFBLK = C.S_IFBLK + S_IFREG = C.S_IFREG + S_IFLNK = C.S_IFLNK + S_IFSOCK = C.S_IFSOCK + S_ISUID = C.S_ISUID + S_ISGID = C.S_ISGID + S_ISVTX = C.S_ISVTX + S_IRUSR = C.S_IRUSR + S_IWUSR = C.S_IWUSR + S_IXUSR = C.S_IXUSR +) + +type Stat_t C.struct_stat + +type Flock_t C.struct_flock + +type Dirent C.struct_dirent + +// Sockets + +type RawSockaddrInet4 C.struct_sockaddr_in + +type RawSockaddrInet6 C.struct_sockaddr_in6 + +type RawSockaddrUnix C.struct_sockaddr_un + +type RawSockaddrDatalink C.struct_sockaddr_dl + +type RawSockaddr C.struct_sockaddr + +type RawSockaddrAny C.struct_sockaddr_any + +type _Socklen C.socklen_t + +type Linger C.struct_linger + +type Iovec C.struct_iovec + +type IPMreq C.struct_ip_mreq + +type IPv6Mreq C.struct_ipv6_mreq + +type Msghdr C.struct_msghdr + +type Cmsghdr C.struct_cmsghdr + +type Inet6Pktinfo C.struct_in6_pktinfo + +type IPv6MTUInfo C.struct_ip6_mtuinfo + +type ICMPv6Filter C.struct_icmp6_filter + +const ( + SizeofSockaddrInet4 = C.sizeof_struct_sockaddr_in + SizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 + SizeofSockaddrAny = C.sizeof_struct_sockaddr_any + SizeofSockaddrUnix = C.sizeof_struct_sockaddr_un + SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl + SizeofLinger = C.sizeof_struct_linger + SizeofIPMreq = C.sizeof_struct_ip_mreq + SizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq + SizeofMsghdr = C.sizeof_struct_msghdr + SizeofCmsghdr = C.sizeof_struct_cmsghdr + SizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo + SizeofIPv6MTUInfo = C.sizeof_struct_ip6_mtuinfo + SizeofICMPv6Filter = C.sizeof_struct_icmp6_filter +) + +// Select + +type FdSet C.fd_set + +// Misc + +type Utsname C.struct_utsname + +type Ustat_t C.struct_ustat + +const ( + AT_FDCWD = C.AT_FDCWD + AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW + AT_SYMLINK_FOLLOW = C.AT_SYMLINK_FOLLOW + AT_REMOVEDIR = C.AT_REMOVEDIR + AT_EACCESS = C.AT_EACCESS +) + +// Routing and interface messages + +const ( + SizeofIfMsghdr = C.sizeof_struct_if_msghdr + SizeofIfData = C.sizeof_struct_if_data + SizeofIfaMsghdr = C.sizeof_struct_ifa_msghdr + SizeofRtMsghdr = C.sizeof_struct_rt_msghdr + SizeofRtMetrics = C.sizeof_struct_rt_metrics +) + +type IfMsghdr C.struct_if_msghdr + +type IfData C.struct_if_data + +type IfaMsghdr C.struct_ifa_msghdr + +type RtMsghdr C.struct_rt_msghdr + +type RtMetrics C.struct_rt_metrics + +// Berkeley packet filter + +const ( + SizeofBpfVersion = C.sizeof_struct_bpf_version + SizeofBpfStat = C.sizeof_struct_bpf_stat + SizeofBpfProgram = C.sizeof_struct_bpf_program + SizeofBpfInsn = C.sizeof_struct_bpf_insn + SizeofBpfHdr = C.sizeof_struct_bpf_hdr +) + +type BpfVersion C.struct_bpf_version + +type BpfStat C.struct_bpf_stat + +type BpfProgram C.struct_bpf_program + +type BpfInsn C.struct_bpf_insn + +type BpfTimeval C.struct_bpf_timeval + +type BpfHdr C.struct_bpf_hdr + +// sysconf information + +const _SC_PAGESIZE = C._SC_PAGESIZE + +// Terminal handling + +type Termios C.struct_termios + +type Termio C.struct_termio + +type Winsize C.struct_winsize diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go new file mode 100644 index 0000000000000000000000000000000000000000..8e63888351e6285cb4ebe710a819aa3812f118c3 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_darwin_386.go @@ -0,0 +1,1576 @@ +// mkerrors.sh -m32 +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build 386,darwin + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m32 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1c + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1e + AF_IPX = 0x17 + AF_ISDN = 0x1c + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x28 + AF_NATM = 0x1f + AF_NDRV = 0x1b + AF_NETBIOS = 0x21 + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PPP = 0x22 + AF_PUP = 0x4 + AF_RESERVED_36 = 0x24 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_SYSTEM = 0x20 + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_UTUN = 0x26 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc00c4279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4008426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80084267 + BIOCSETFNR = 0x8008427e + BIOCSETIF = 0x8020426c + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8008426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CREAD = 0x800 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0xf5 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_FS = -0x9 + EVFILT_MACHPORT = -0x8 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xe + EVFILT_THREADMARKER = 0xe + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xa + EVFILT_VM = -0xc + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG0 = 0x1000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_OOBAND = 0x2000 + EV_POLL = 0x1000 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_ADDFILESIGS = 0x3d + F_ADDSIGS = 0x3b + F_ALLOCATEALL = 0x4 + F_ALLOCATECONTIG = 0x2 + F_CHKCLEAN = 0x29 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x43 + F_FINDSIGS = 0x4e + F_FLUSH_DATA = 0x28 + F_FREEZE_FS = 0x35 + F_FULLFSYNC = 0x33 + F_GETCODEDIR = 0x48 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETLKPID = 0x42 + F_GETNOSIGPIPE = 0x4a + F_GETOWN = 0x5 + F_GETPATH = 0x32 + F_GETPATH_MTMINFO = 0x47 + F_GETPROTECTIONCLASS = 0x3f + F_GETPROTECTIONLEVEL = 0x4d + F_GLOBAL_NOCACHE = 0x37 + F_LOG2PHYS = 0x31 + F_LOG2PHYS_EXT = 0x41 + F_NOCACHE = 0x30 + F_NODIRECT = 0x3e + F_OK = 0x0 + F_PATHPKG_CHECK = 0x34 + F_PEOFPOSMODE = 0x3 + F_PREALLOCATE = 0x2a + F_RDADVISE = 0x2c + F_RDAHEAD = 0x2d + F_RDLCK = 0x1 + F_SETBACKINGSTORE = 0x46 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETLKWTIMEOUT = 0xa + F_SETNOSIGPIPE = 0x49 + F_SETOWN = 0x6 + F_SETPROTECTIONCLASS = 0x40 + F_SETSIZE = 0x2b + F_SINGLE_WRITER = 0x4c + F_THAW_FS = 0x36 + F_TRANSCODEKEY = 0x4b + F_UNLCK = 0x2 + F_VOLPOSMODE = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_CELLULAR = 0xff + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FAITH = 0x38 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_GIF = 0x37 + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IEEE1394 = 0x90 + IFT_IEEE8023ADLAG = 0x88 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_L2VLAN = 0x87 + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PDP = 0xff + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PKTAP = 0xfe + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_STF = 0x39 + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LINKLOCALNETNUM = 0xa9fe0000 + IN_LOOPBACKNET = 0x7f + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_2292DSTOPTS = 0x17 + IPV6_2292HOPLIMIT = 0x14 + IPV6_2292HOPOPTS = 0x16 + IPV6_2292NEXTHOP = 0x15 + IPV6_2292PKTINFO = 0x13 + IPV6_2292PKTOPTIONS = 0x19 + IPV6_2292RTHDR = 0x18 + IPV6_BINDV6ONLY = 0x1b + IPV6_BOUND_IF = 0x7d + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x3c + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVTCLASS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x24 + IPV6_UNICAST_HOPS = 0x4 + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BLOCK_SOURCE = 0x48 + IP_BOUND_IF = 0x19 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x28 + IP_FW_DEL = 0x29 + IP_FW_FLUSH = 0x2a + IP_FW_GET = 0x2c + IP_FW_RESETLOG = 0x2d + IP_FW_ZERO = 0x2b + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MF = 0x2000 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_IFINDEX = 0x42 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_NAT__XXX = 0x37 + IP_OFFMASK = 0x1fff + IP_OLD_FW_ADD = 0x32 + IP_OLD_FW_DEL = 0x33 + IP_OLD_FW_FLUSH = 0x34 + IP_OLD_FW_GET = 0x36 + IP_OLD_FW_RESETLOG = 0x38 + IP_OLD_FW_ZERO = 0x35 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x18 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_STRIPHDR = 0x17 + IP_TOS = 0x3 + IP_TRAFFIC_MGT_BACKGROUND = 0x41 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_CAN_REUSE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_FREE_REUSABLE = 0x7 + MADV_FREE_REUSE = 0x8 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MADV_ZERO_WIRED_PAGES = 0x6 + MAP_ANON = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_JIT = 0x800 + MAP_NOCACHE = 0x400 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_RESERVED0080 = 0x80 + MAP_SHARED = 0x1 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FLUSH = 0x400 + MSG_HAVEMORE = 0x2000 + MSG_HOLD = 0x800 + MSG_NEEDSA = 0x10000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_RCVMORE = 0x4000 + MSG_SEND = 0x1000 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITSTREAM = 0x200 + MS_ASYNC = 0x1 + MS_DEACTIVATE = 0x8 + MS_INVALIDATE = 0x2 + MS_KILLPAGES = 0x4 + MS_SYNC = 0x10 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_DUMP2 = 0x7 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLIST2 = 0x6 + NET_RT_MAXID = 0xa + NET_RT_STAT = 0x4 + NET_RT_TRASH = 0x5 + NOFLSH = 0x80000000 + NOTE_ABSOLUTE = 0x8 + NOTE_ATTRIB = 0x8 + NOTE_BACKGROUND = 0x40 + NOTE_CHILD = 0x4 + NOTE_CRITICAL = 0x20 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXITSTATUS = 0x4000000 + NOTE_EXIT_CSERROR = 0x40000 + NOTE_EXIT_DECRYPTFAIL = 0x10000 + NOTE_EXIT_DETAIL = 0x2000000 + NOTE_EXIT_DETAIL_MASK = 0x70000 + NOTE_EXIT_MEMORY = 0x20000 + NOTE_EXIT_REPARENTED = 0x80000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_LEEWAY = 0x10 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_NONE = 0x80 + NOTE_NSECONDS = 0x4 + NOTE_PCTRLMASK = -0x100000 + NOTE_PDATAMASK = 0xfffff + NOTE_REAP = 0x10000000 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_SIGNAL = 0x8000000 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x2 + NOTE_VM_ERROR = 0x10000000 + NOTE_VM_PRESSURE = 0x80000000 + NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 + NOTE_VM_PRESSURE_TERMINATE = 0x40000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFDEL = 0x20000 + OFILL = 0x80 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_ALERT = 0x20000000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x1000000 + O_CREAT = 0x200 + O_DIRECTORY = 0x100000 + O_DP_GETRAWENCRYPTED = 0x1 + O_DSYNC = 0x400000 + O_EVTONLY = 0x8000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x20000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_POPUP = 0x80000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYMLINK = 0x200000 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_ATTACH = 0xa + PT_ATTACHEXC = 0xe + PT_CONTINUE = 0x7 + PT_DENY_ATTACH = 0x1f + PT_DETACH = 0xb + PT_FIRSTMACH = 0x20 + PT_FORCEQUOTA = 0x1e + PT_KILL = 0x8 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_READ_U = 0x3 + PT_SIGEXC = 0xc + PT_STEP = 0x9 + PT_THUPDATE = 0xd + PT_TRACE_ME = 0x0 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + PT_WRITE_U = 0x6 + RLIMIT_AS = 0x5 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_CPU_USAGE_MONITOR = 0x2 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_CONDEMNED = 0x2000000 + RTF_DELCLONE = 0x80 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_IFREF = 0x4000000 + RTF_IFSCOPE = 0x1000000 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_NOIFREF = 0x2000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_PROXY = 0x8000000 + RTF_REJECT = 0x8 + RTF_ROUTER = 0x10000000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_GET2 = 0x14 + RTM_IFINFO = 0xe + RTM_IFINFO2 = 0x12 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_NEWMADDR2 = 0x13 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SCM_TIMESTAMP_MONOTONIC = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCARPIPLL = 0xc0206928 + SIOCATMARK = 0x40047307 + SIOCAUTOADDR = 0xc0206926 + SIOCAUTONETMASK = 0x80206927 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206941 + SIOCGDRVSPEC = 0xc01c697b + SIOCGETVLAN = 0xc020697f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFALTMTU = 0xc0206948 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBOND = 0xc0206947 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020695b + SIOCGIFCONF = 0xc0086924 + SIOCGIFDEVMTU = 0xc0206944 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFKPI = 0xc0206987 + SIOCGIFMAC = 0xc0206982 + SIOCGIFMEDIA = 0xc0286938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206940 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc020693f + SIOCGIFSTATUS = 0xc331693d + SIOCGIFVLAN = 0xc020697f + SIOCGIFWAKEFLAGS = 0xc0206988 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCIFCREATE = 0xc0206978 + SIOCIFCREATE2 = 0xc020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6981 + SIOCRSLVMULTI = 0xc008693b + SIOCSDRVSPEC = 0x801c697b + SIOCSETVLAN = 0x8020697e + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFALTMTU = 0x80206945 + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBOND = 0x80206946 + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020695a + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFKPI = 0x80206986 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206983 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x8040693e + SIOCSIFPHYS = 0x80206936 + SIOCSIFVLAN = 0x8020697e + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_DONTTRUNC = 0x2000 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1010 + SO_LINGER = 0x80 + SO_LINGER_SEC = 0x1080 + SO_NKE = 0x1021 + SO_NOADDRERR = 0x1023 + SO_NOSIGPIPE = 0x1022 + SO_NOTIFYCONFLICT = 0x1026 + SO_NP_EXTENSIONS = 0x1083 + SO_NREAD = 0x1020 + SO_NUMRCVPKT = 0x1112 + SO_NWRITE = 0x1024 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1011 + SO_RANDOMPORT = 0x1082 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_REUSESHAREUID = 0x1025 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TIMESTAMP_MONOTONIC = 0x800 + SO_TYPE = 0x1008 + SO_UPCALLCLOSEWAIT = 0x1027 + SO_USELOOPBACK = 0x40 + SO_WANTMORE = 0x4000 + SO_WANTOOBFLAG = 0x8000 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_CONNECTIONTIMEOUT = 0x20 + TCP_ENABLE_ECN = 0x104 + TCP_KEEPALIVE = 0x10 + TCP_KEEPCNT = 0x102 + TCP_KEEPINTVL = 0x101 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0xd8 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_NOTSENT_LOWAT = 0x201 + TCP_RXT_CONNDROPTIME = 0x80 + TCP_RXT_FINDROP = 0x100 + TCP_SENDMOREACKS = 0x103 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40087458 + TIOCDRAIN = 0x2000745e + TIOCDSIMICROCODE = 0x20007455 + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGWINSZ = 0x40087468 + TIOCIXOFF = 0x20007480 + TIOCIXON = 0x20007481 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTYGNAME = 0x40807453 + TIOCPTYGRANT = 0x20007454 + TIOCPTYUNLK = 0x20007452 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCONS = 0x20007463 + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40087459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x10 + WCOREFLAG = 0x80 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOWAIT = 0x20 + WORDSIZE = 0x20 + WSTOPPED = 0x8 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADARCH = syscall.Errno(0x56) + EBADEXEC = syscall.Errno(0x55) + EBADF = syscall.Errno(0x9) + EBADMACHO = syscall.Errno(0x58) + EBADMSG = syscall.Errno(0x5e) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x59) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDEVERR = syscall.Errno(0x53) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x5a) + EILSEQ = syscall.Errno(0x5c) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x6a) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5f) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x60) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x61) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5b) + ENOPOLICY = syscall.Errno(0x67) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x62) + ENOSTR = syscall.Errno(0x63) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x68) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x66) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x69) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x64) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + EPWROFF = syscall.Errno(0x52) + EQFULL = syscall.Errno(0x6a) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHLIBVERS = syscall.Errno(0x57) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x65) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "resource busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "operation timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "device power is off", + 83: "device error", + 84: "value too large to be stored in data type", + 85: "bad executable (or shared library)", + 86: "bad CPU type in executable", + 87: "shared library version mismatch", + 88: "malformed Mach-o file", + 89: "operation canceled", + 90: "identifier removed", + 91: "no message of desired type", + 92: "illegal byte sequence", + 93: "attribute not found", + 94: "bad message", + 95: "EMULTIHOP (Reserved)", + 96: "no message available on STREAM", + 97: "ENOLINK (Reserved)", + 98: "no STREAM resources", + 99: "not a STREAM", + 100: "protocol error", + 101: "STREAM ioctl timeout", + 102: "operation not supported on socket", + 103: "policy not found", + 104: "state not recoverable", + 105: "previous owner died", + 106: "interface output queue is full", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "suspended (signal)", + 18: "suspended", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..9594f93817a341417086948cdb4fdc1bb93329b9 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go @@ -0,0 +1,1576 @@ +// mkerrors.sh -m64 +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build amd64,darwin + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1c + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1e + AF_IPX = 0x17 + AF_ISDN = 0x1c + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x28 + AF_NATM = 0x1f + AF_NDRV = 0x1b + AF_NETBIOS = 0x21 + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PPP = 0x22 + AF_PUP = 0x4 + AF_RESERVED_36 = 0x24 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_SYSTEM = 0x20 + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_UTUN = 0x26 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc00c4279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80104267 + BIOCSETFNR = 0x8010427e + BIOCSETIF = 0x8020426c + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CREAD = 0x800 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0xf5 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_FS = -0x9 + EVFILT_MACHPORT = -0x8 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xe + EVFILT_THREADMARKER = 0xe + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xa + EVFILT_VM = -0xc + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG0 = 0x1000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_OOBAND = 0x2000 + EV_POLL = 0x1000 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_ADDFILESIGS = 0x3d + F_ADDSIGS = 0x3b + F_ALLOCATEALL = 0x4 + F_ALLOCATECONTIG = 0x2 + F_CHKCLEAN = 0x29 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x43 + F_FINDSIGS = 0x4e + F_FLUSH_DATA = 0x28 + F_FREEZE_FS = 0x35 + F_FULLFSYNC = 0x33 + F_GETCODEDIR = 0x48 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETLKPID = 0x42 + F_GETNOSIGPIPE = 0x4a + F_GETOWN = 0x5 + F_GETPATH = 0x32 + F_GETPATH_MTMINFO = 0x47 + F_GETPROTECTIONCLASS = 0x3f + F_GETPROTECTIONLEVEL = 0x4d + F_GLOBAL_NOCACHE = 0x37 + F_LOG2PHYS = 0x31 + F_LOG2PHYS_EXT = 0x41 + F_NOCACHE = 0x30 + F_NODIRECT = 0x3e + F_OK = 0x0 + F_PATHPKG_CHECK = 0x34 + F_PEOFPOSMODE = 0x3 + F_PREALLOCATE = 0x2a + F_RDADVISE = 0x2c + F_RDAHEAD = 0x2d + F_RDLCK = 0x1 + F_SETBACKINGSTORE = 0x46 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETLKWTIMEOUT = 0xa + F_SETNOSIGPIPE = 0x49 + F_SETOWN = 0x6 + F_SETPROTECTIONCLASS = 0x40 + F_SETSIZE = 0x2b + F_SINGLE_WRITER = 0x4c + F_THAW_FS = 0x36 + F_TRANSCODEKEY = 0x4b + F_UNLCK = 0x2 + F_VOLPOSMODE = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_CELLULAR = 0xff + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FAITH = 0x38 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_GIF = 0x37 + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IEEE1394 = 0x90 + IFT_IEEE8023ADLAG = 0x88 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_L2VLAN = 0x87 + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PDP = 0xff + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PKTAP = 0xfe + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_STF = 0x39 + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LINKLOCALNETNUM = 0xa9fe0000 + IN_LOOPBACKNET = 0x7f + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_2292DSTOPTS = 0x17 + IPV6_2292HOPLIMIT = 0x14 + IPV6_2292HOPOPTS = 0x16 + IPV6_2292NEXTHOP = 0x15 + IPV6_2292PKTINFO = 0x13 + IPV6_2292PKTOPTIONS = 0x19 + IPV6_2292RTHDR = 0x18 + IPV6_BINDV6ONLY = 0x1b + IPV6_BOUND_IF = 0x7d + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x3c + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVTCLASS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x24 + IPV6_UNICAST_HOPS = 0x4 + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BLOCK_SOURCE = 0x48 + IP_BOUND_IF = 0x19 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x28 + IP_FW_DEL = 0x29 + IP_FW_FLUSH = 0x2a + IP_FW_GET = 0x2c + IP_FW_RESETLOG = 0x2d + IP_FW_ZERO = 0x2b + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MF = 0x2000 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_IFINDEX = 0x42 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_NAT__XXX = 0x37 + IP_OFFMASK = 0x1fff + IP_OLD_FW_ADD = 0x32 + IP_OLD_FW_DEL = 0x33 + IP_OLD_FW_FLUSH = 0x34 + IP_OLD_FW_GET = 0x36 + IP_OLD_FW_RESETLOG = 0x38 + IP_OLD_FW_ZERO = 0x35 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x18 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_STRIPHDR = 0x17 + IP_TOS = 0x3 + IP_TRAFFIC_MGT_BACKGROUND = 0x41 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_CAN_REUSE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_FREE_REUSABLE = 0x7 + MADV_FREE_REUSE = 0x8 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MADV_ZERO_WIRED_PAGES = 0x6 + MAP_ANON = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_JIT = 0x800 + MAP_NOCACHE = 0x400 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_RESERVED0080 = 0x80 + MAP_SHARED = 0x1 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FLUSH = 0x400 + MSG_HAVEMORE = 0x2000 + MSG_HOLD = 0x800 + MSG_NEEDSA = 0x10000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_RCVMORE = 0x4000 + MSG_SEND = 0x1000 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITSTREAM = 0x200 + MS_ASYNC = 0x1 + MS_DEACTIVATE = 0x8 + MS_INVALIDATE = 0x2 + MS_KILLPAGES = 0x4 + MS_SYNC = 0x10 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_DUMP2 = 0x7 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLIST2 = 0x6 + NET_RT_MAXID = 0xa + NET_RT_STAT = 0x4 + NET_RT_TRASH = 0x5 + NOFLSH = 0x80000000 + NOTE_ABSOLUTE = 0x8 + NOTE_ATTRIB = 0x8 + NOTE_BACKGROUND = 0x40 + NOTE_CHILD = 0x4 + NOTE_CRITICAL = 0x20 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXITSTATUS = 0x4000000 + NOTE_EXIT_CSERROR = 0x40000 + NOTE_EXIT_DECRYPTFAIL = 0x10000 + NOTE_EXIT_DETAIL = 0x2000000 + NOTE_EXIT_DETAIL_MASK = 0x70000 + NOTE_EXIT_MEMORY = 0x20000 + NOTE_EXIT_REPARENTED = 0x80000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_LEEWAY = 0x10 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_NONE = 0x80 + NOTE_NSECONDS = 0x4 + NOTE_PCTRLMASK = -0x100000 + NOTE_PDATAMASK = 0xfffff + NOTE_REAP = 0x10000000 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_SIGNAL = 0x8000000 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x2 + NOTE_VM_ERROR = 0x10000000 + NOTE_VM_PRESSURE = 0x80000000 + NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 + NOTE_VM_PRESSURE_TERMINATE = 0x40000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFDEL = 0x20000 + OFILL = 0x80 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_ALERT = 0x20000000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x1000000 + O_CREAT = 0x200 + O_DIRECTORY = 0x100000 + O_DP_GETRAWENCRYPTED = 0x1 + O_DSYNC = 0x400000 + O_EVTONLY = 0x8000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x20000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_POPUP = 0x80000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYMLINK = 0x200000 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_ATTACH = 0xa + PT_ATTACHEXC = 0xe + PT_CONTINUE = 0x7 + PT_DENY_ATTACH = 0x1f + PT_DETACH = 0xb + PT_FIRSTMACH = 0x20 + PT_FORCEQUOTA = 0x1e + PT_KILL = 0x8 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_READ_U = 0x3 + PT_SIGEXC = 0xc + PT_STEP = 0x9 + PT_THUPDATE = 0xd + PT_TRACE_ME = 0x0 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + PT_WRITE_U = 0x6 + RLIMIT_AS = 0x5 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_CPU_USAGE_MONITOR = 0x2 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_CONDEMNED = 0x2000000 + RTF_DELCLONE = 0x80 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_IFREF = 0x4000000 + RTF_IFSCOPE = 0x1000000 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_NOIFREF = 0x2000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_PROXY = 0x8000000 + RTF_REJECT = 0x8 + RTF_ROUTER = 0x10000000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_GET2 = 0x14 + RTM_IFINFO = 0xe + RTM_IFINFO2 = 0x12 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_NEWMADDR2 = 0x13 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SCM_TIMESTAMP_MONOTONIC = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCARPIPLL = 0xc0206928 + SIOCATMARK = 0x40047307 + SIOCAUTOADDR = 0xc0206926 + SIOCAUTONETMASK = 0x80206927 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206941 + SIOCGDRVSPEC = 0xc028697b + SIOCGETVLAN = 0xc020697f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFALTMTU = 0xc0206948 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBOND = 0xc0206947 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020695b + SIOCGIFCONF = 0xc00c6924 + SIOCGIFDEVMTU = 0xc0206944 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFKPI = 0xc0206987 + SIOCGIFMAC = 0xc0206982 + SIOCGIFMEDIA = 0xc02c6938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206940 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc020693f + SIOCGIFSTATUS = 0xc331693d + SIOCGIFVLAN = 0xc020697f + SIOCGIFWAKEFLAGS = 0xc0206988 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCIFCREATE = 0xc0206978 + SIOCIFCREATE2 = 0xc020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106981 + SIOCRSLVMULTI = 0xc010693b + SIOCSDRVSPEC = 0x8028697b + SIOCSETVLAN = 0x8020697e + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFALTMTU = 0x80206945 + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBOND = 0x80206946 + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020695a + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFKPI = 0x80206986 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206983 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x8040693e + SIOCSIFPHYS = 0x80206936 + SIOCSIFVLAN = 0x8020697e + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_DONTTRUNC = 0x2000 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1010 + SO_LINGER = 0x80 + SO_LINGER_SEC = 0x1080 + SO_NKE = 0x1021 + SO_NOADDRERR = 0x1023 + SO_NOSIGPIPE = 0x1022 + SO_NOTIFYCONFLICT = 0x1026 + SO_NP_EXTENSIONS = 0x1083 + SO_NREAD = 0x1020 + SO_NUMRCVPKT = 0x1112 + SO_NWRITE = 0x1024 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1011 + SO_RANDOMPORT = 0x1082 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_REUSESHAREUID = 0x1025 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TIMESTAMP_MONOTONIC = 0x800 + SO_TYPE = 0x1008 + SO_UPCALLCLOSEWAIT = 0x1027 + SO_USELOOPBACK = 0x40 + SO_WANTMORE = 0x4000 + SO_WANTOOBFLAG = 0x8000 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_CONNECTIONTIMEOUT = 0x20 + TCP_ENABLE_ECN = 0x104 + TCP_KEEPALIVE = 0x10 + TCP_KEEPCNT = 0x102 + TCP_KEEPINTVL = 0x101 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0xd8 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_NOTSENT_LOWAT = 0x201 + TCP_RXT_CONNDROPTIME = 0x80 + TCP_RXT_FINDROP = 0x100 + TCP_SENDMOREACKS = 0x103 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCDSIMICROCODE = 0x20007455 + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x40487413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGWINSZ = 0x40087468 + TIOCIXOFF = 0x20007480 + TIOCIXON = 0x20007481 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTYGNAME = 0x40807453 + TIOCPTYGRANT = 0x20007454 + TIOCPTYUNLK = 0x20007452 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCONS = 0x20007463 + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x80487414 + TIOCSETAF = 0x80487416 + TIOCSETAW = 0x80487415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x10 + WCOREFLAG = 0x80 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOWAIT = 0x20 + WORDSIZE = 0x40 + WSTOPPED = 0x8 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADARCH = syscall.Errno(0x56) + EBADEXEC = syscall.Errno(0x55) + EBADF = syscall.Errno(0x9) + EBADMACHO = syscall.Errno(0x58) + EBADMSG = syscall.Errno(0x5e) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x59) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDEVERR = syscall.Errno(0x53) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x5a) + EILSEQ = syscall.Errno(0x5c) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x6a) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5f) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x60) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x61) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5b) + ENOPOLICY = syscall.Errno(0x67) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x62) + ENOSTR = syscall.Errno(0x63) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x68) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x66) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x69) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x64) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + EPWROFF = syscall.Errno(0x52) + EQFULL = syscall.Errno(0x6a) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHLIBVERS = syscall.Errno(0x57) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x65) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "resource busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "operation timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "device power is off", + 83: "device error", + 84: "value too large to be stored in data type", + 85: "bad executable (or shared library)", + 86: "bad CPU type in executable", + 87: "shared library version mismatch", + 88: "malformed Mach-o file", + 89: "operation canceled", + 90: "identifier removed", + 91: "no message of desired type", + 92: "illegal byte sequence", + 93: "attribute not found", + 94: "bad message", + 95: "EMULTIHOP (Reserved)", + 96: "no message available on STREAM", + 97: "ENOLINK (Reserved)", + 98: "no STREAM resources", + 99: "not a STREAM", + 100: "protocol error", + 101: "STREAM ioctl timeout", + 102: "operation not supported on socket", + 103: "policy not found", + 104: "state not recoverable", + 105: "previous owner died", + 106: "interface output queue is full", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "suspended (signal)", + 18: "suspended", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go new file mode 100644 index 0000000000000000000000000000000000000000..a410e88eddee07d3e425b1dcc8a4b53bb5a62031 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go @@ -0,0 +1,1293 @@ +// mkerrors.sh +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- _const.go + +// +build arm,darwin + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1c + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1e + AF_IPX = 0x17 + AF_ISDN = 0x1c + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x28 + AF_NATM = 0x1f + AF_NDRV = 0x1b + AF_NETBIOS = 0x21 + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PPP = 0x22 + AF_PUP = 0x4 + AF_RESERVED_36 = 0x24 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_SYSTEM = 0x20 + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_UTUN = 0x26 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc00c4279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80104267 + BIOCSETIF = 0x8020426c + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CREAD = 0x800 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AX25 = 0x3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_C_HDLC = 0x68 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_FDDI = 0xa + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_NULL = 0x0 + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_SERIAL = 0x32 + DLT_PRONET = 0x4 + DLT_RAW = 0xc + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_FS = -0x9 + EVFILT_MACHPORT = -0x8 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xe + EVFILT_THREADMARKER = 0xe + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xa + EVFILT_VM = -0xc + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG0 = 0x1000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_OOBAND = 0x2000 + EV_POLL = 0x1000 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_ADDFILESIGS = 0x3d + F_ADDSIGS = 0x3b + F_ALLOCATEALL = 0x4 + F_ALLOCATECONTIG = 0x2 + F_CHKCLEAN = 0x29 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x43 + F_FINDSIGS = 0x4e + F_FLUSH_DATA = 0x28 + F_FREEZE_FS = 0x35 + F_FULLFSYNC = 0x33 + F_GETCODEDIR = 0x48 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETLKPID = 0x42 + F_GETNOSIGPIPE = 0x4a + F_GETOWN = 0x5 + F_GETPATH = 0x32 + F_GETPATH_MTMINFO = 0x47 + F_GETPROTECTIONCLASS = 0x3f + F_GETPROTECTIONLEVEL = 0x4d + F_GLOBAL_NOCACHE = 0x37 + F_LOG2PHYS = 0x31 + F_LOG2PHYS_EXT = 0x41 + F_NOCACHE = 0x30 + F_NODIRECT = 0x3e + F_OK = 0x0 + F_PATHPKG_CHECK = 0x34 + F_PEOFPOSMODE = 0x3 + F_PREALLOCATE = 0x2a + F_RDADVISE = 0x2c + F_RDAHEAD = 0x2d + F_RDLCK = 0x1 + F_SETBACKINGSTORE = 0x46 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETLKWTIMEOUT = 0xa + F_SETNOSIGPIPE = 0x49 + F_SETOWN = 0x6 + F_SETPROTECTIONCLASS = 0x40 + F_SETSIZE = 0x2b + F_SINGLE_WRITER = 0x4c + F_THAW_FS = 0x36 + F_TRANSCODEKEY = 0x4b + F_UNLCK = 0x2 + F_VOLPOSMODE = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_CELLULAR = 0xff + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FAITH = 0x38 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_GIF = 0x37 + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IEEE1394 = 0x90 + IFT_IEEE8023ADLAG = 0x88 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_L2VLAN = 0x87 + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PDP = 0xff + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_STF = 0x39 + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LINKLOCALNETNUM = 0xa9fe0000 + IN_LOOPBACKNET = 0x7f + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_2292DSTOPTS = 0x17 + IPV6_2292HOPLIMIT = 0x14 + IPV6_2292HOPOPTS = 0x16 + IPV6_2292NEXTHOP = 0x15 + IPV6_2292PKTINFO = 0x13 + IPV6_2292PKTOPTIONS = 0x19 + IPV6_2292RTHDR = 0x18 + IPV6_BINDV6ONLY = 0x1b + IPV6_BOUND_IF = 0x7d + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVTCLASS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x24 + IPV6_UNICAST_HOPS = 0x4 + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BLOCK_SOURCE = 0x48 + IP_BOUND_IF = 0x19 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x28 + IP_FW_DEL = 0x29 + IP_FW_FLUSH = 0x2a + IP_FW_GET = 0x2c + IP_FW_RESETLOG = 0x2d + IP_FW_ZERO = 0x2b + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MF = 0x2000 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_IFINDEX = 0x42 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_NAT__XXX = 0x37 + IP_OFFMASK = 0x1fff + IP_OLD_FW_ADD = 0x32 + IP_OLD_FW_DEL = 0x33 + IP_OLD_FW_FLUSH = 0x34 + IP_OLD_FW_GET = 0x36 + IP_OLD_FW_RESETLOG = 0x38 + IP_OLD_FW_ZERO = 0x35 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x18 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_STRIPHDR = 0x17 + IP_TOS = 0x3 + IP_TRAFFIC_MGT_BACKGROUND = 0x41 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_CAN_REUSE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_FREE_REUSABLE = 0x7 + MADV_FREE_REUSE = 0x8 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MADV_ZERO_WIRED_PAGES = 0x6 + MAP_ANON = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_JIT = 0x800 + MAP_NOCACHE = 0x400 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_RESERVED0080 = 0x80 + MAP_SHARED = 0x1 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FLUSH = 0x400 + MSG_HAVEMORE = 0x2000 + MSG_HOLD = 0x800 + MSG_NEEDSA = 0x10000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_RCVMORE = 0x4000 + MSG_SEND = 0x1000 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITSTREAM = 0x200 + MS_ASYNC = 0x1 + MS_DEACTIVATE = 0x8 + MS_INVALIDATE = 0x2 + MS_KILLPAGES = 0x4 + MS_SYNC = 0x10 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_DUMP2 = 0x7 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLIST2 = 0x6 + NET_RT_MAXID = 0xa + NET_RT_STAT = 0x4 + NET_RT_TRASH = 0x5 + NOFLSH = 0x80000000 + NOTE_ABSOLUTE = 0x8 + NOTE_ATTRIB = 0x8 + NOTE_BACKGROUND = 0x40 + NOTE_CHILD = 0x4 + NOTE_CRITICAL = 0x20 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXITSTATUS = 0x4000000 + NOTE_EXIT_CSERROR = 0x40000 + NOTE_EXIT_DECRYPTFAIL = 0x10000 + NOTE_EXIT_DETAIL = 0x2000000 + NOTE_EXIT_DETAIL_MASK = 0x70000 + NOTE_EXIT_MEMORY = 0x20000 + NOTE_EXIT_REPARENTED = 0x80000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_LEEWAY = 0x10 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_NONE = 0x80 + NOTE_NSECONDS = 0x4 + NOTE_PCTRLMASK = -0x100000 + NOTE_PDATAMASK = 0xfffff + NOTE_REAP = 0x10000000 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_SIGNAL = 0x8000000 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x2 + NOTE_VM_ERROR = 0x10000000 + NOTE_VM_PRESSURE = 0x80000000 + NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 + NOTE_VM_PRESSURE_TERMINATE = 0x40000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFDEL = 0x20000 + OFILL = 0x80 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_ALERT = 0x20000000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x1000000 + O_CREAT = 0x200 + O_DIRECTORY = 0x100000 + O_DP_GETRAWENCRYPTED = 0x1 + O_DSYNC = 0x400000 + O_EVTONLY = 0x8000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x20000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_POPUP = 0x80000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYMLINK = 0x200000 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_ATTACH = 0xa + PT_ATTACHEXC = 0xe + PT_CONTINUE = 0x7 + PT_DENY_ATTACH = 0x1f + PT_DETACH = 0xb + PT_FIRSTMACH = 0x20 + PT_FORCEQUOTA = 0x1e + PT_KILL = 0x8 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_READ_U = 0x3 + PT_SIGEXC = 0xc + PT_STEP = 0x9 + PT_THUPDATE = 0xd + PT_TRACE_ME = 0x0 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + PT_WRITE_U = 0x6 + RLIMIT_AS = 0x5 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_CPU_USAGE_MONITOR = 0x2 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_CONDEMNED = 0x2000000 + RTF_DELCLONE = 0x80 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_IFREF = 0x4000000 + RTF_IFSCOPE = 0x1000000 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_PROXY = 0x8000000 + RTF_REJECT = 0x8 + RTF_ROUTER = 0x10000000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_GET2 = 0x14 + RTM_IFINFO = 0xe + RTM_IFINFO2 = 0x12 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_NEWMADDR2 = 0x13 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SCM_TIMESTAMP_MONOTONIC = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCARPIPLL = 0xc0206928 + SIOCATMARK = 0x40047307 + SIOCAUTOADDR = 0xc0206926 + SIOCAUTONETMASK = 0x80206927 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206941 + SIOCGDRVSPEC = 0xc028697b + SIOCGETVLAN = 0xc020697f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFALTMTU = 0xc0206948 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBOND = 0xc0206947 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020695b + SIOCGIFCONF = 0xc00c6924 + SIOCGIFDEVMTU = 0xc0206944 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFKPI = 0xc0206987 + SIOCGIFMAC = 0xc0206982 + SIOCGIFMEDIA = 0xc02c6938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206940 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc020693f + SIOCGIFSTATUS = 0xc331693d + SIOCGIFVLAN = 0xc020697f + SIOCGIFWAKEFLAGS = 0xc0206988 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCIFCREATE = 0xc0206978 + SIOCIFCREATE2 = 0xc020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106981 + SIOCRSLVMULTI = 0xc010693b + SIOCSDRVSPEC = 0x8028697b + SIOCSETVLAN = 0x8020697e + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFALTMTU = 0x80206945 + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBOND = 0x80206946 + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020695a + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFKPI = 0x80206986 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206983 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x8040693e + SIOCSIFPHYS = 0x80206936 + SIOCSIFVLAN = 0x8020697e + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_DONTTRUNC = 0x2000 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1010 + SO_LINGER = 0x80 + SO_LINGER_SEC = 0x1080 + SO_NKE = 0x1021 + SO_NOADDRERR = 0x1023 + SO_NOSIGPIPE = 0x1022 + SO_NOTIFYCONFLICT = 0x1026 + SO_NP_EXTENSIONS = 0x1083 + SO_NREAD = 0x1020 + SO_NUMRCVPKT = 0x1112 + SO_NWRITE = 0x1024 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1011 + SO_RANDOMPORT = 0x1082 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_REUSESHAREUID = 0x1025 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TIMESTAMP_MONOTONIC = 0x800 + SO_TYPE = 0x1008 + SO_UPCALLCLOSEWAIT = 0x1027 + SO_USELOOPBACK = 0x40 + SO_WANTMORE = 0x4000 + SO_WANTOOBFLAG = 0x8000 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_CONNECTIONTIMEOUT = 0x20 + TCP_ENABLE_ECN = 0x104 + TCP_KEEPALIVE = 0x10 + TCP_KEEPCNT = 0x102 + TCP_KEEPINTVL = 0x101 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0xd8 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_NOTSENT_LOWAT = 0x201 + TCP_RXT_CONNDROPTIME = 0x80 + TCP_RXT_FINDROP = 0x100 + TCP_SENDMOREACKS = 0x103 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCDSIMICROCODE = 0x20007455 + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x40487413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGWINSZ = 0x40087468 + TIOCIXOFF = 0x20007480 + TIOCIXON = 0x20007481 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTYGNAME = 0x40807453 + TIOCPTYGRANT = 0x20007454 + TIOCPTYUNLK = 0x20007452 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCONS = 0x20007463 + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x80487414 + TIOCSETAF = 0x80487416 + TIOCSETAW = 0x80487415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x10 + WCOREFLAG = 0x80 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOWAIT = 0x20 + WORDSIZE = 0x40 + WSTOPPED = 0x8 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADARCH = syscall.Errno(0x56) + EBADEXEC = syscall.Errno(0x55) + EBADF = syscall.Errno(0x9) + EBADMACHO = syscall.Errno(0x58) + EBADMSG = syscall.Errno(0x5e) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x59) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDEVERR = syscall.Errno(0x53) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x5a) + EILSEQ = syscall.Errno(0x5c) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x6a) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5f) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x60) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x61) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5b) + ENOPOLICY = syscall.Errno(0x67) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x62) + ENOSTR = syscall.Errno(0x63) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x68) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x66) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x69) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x64) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + EPWROFF = syscall.Errno(0x52) + EQFULL = syscall.Errno(0x6a) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHLIBVERS = syscall.Errno(0x57) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x65) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go new file mode 100644 index 0000000000000000000000000000000000000000..3189c6b34595fadf84b1ba29009993a9def18dc7 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go @@ -0,0 +1,1576 @@ +// mkerrors.sh -m64 +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build arm64,darwin + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1c + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1e + AF_IPX = 0x17 + AF_ISDN = 0x1c + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x28 + AF_NATM = 0x1f + AF_NDRV = 0x1b + AF_NETBIOS = 0x21 + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PPP = 0x22 + AF_PUP = 0x4 + AF_RESERVED_36 = 0x24 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_SYSTEM = 0x20 + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_UTUN = 0x26 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc00c4279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80104267 + BIOCSETFNR = 0x8010427e + BIOCSETIF = 0x8020426c + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CREAD = 0x800 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0xf5 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_FS = -0x9 + EVFILT_MACHPORT = -0x8 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xe + EVFILT_THREADMARKER = 0xe + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xa + EVFILT_VM = -0xc + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG0 = 0x1000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_OOBAND = 0x2000 + EV_POLL = 0x1000 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_ADDFILESIGS = 0x3d + F_ADDSIGS = 0x3b + F_ALLOCATEALL = 0x4 + F_ALLOCATECONTIG = 0x2 + F_CHKCLEAN = 0x29 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x43 + F_FINDSIGS = 0x4e + F_FLUSH_DATA = 0x28 + F_FREEZE_FS = 0x35 + F_FULLFSYNC = 0x33 + F_GETCODEDIR = 0x48 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETLKPID = 0x42 + F_GETNOSIGPIPE = 0x4a + F_GETOWN = 0x5 + F_GETPATH = 0x32 + F_GETPATH_MTMINFO = 0x47 + F_GETPROTECTIONCLASS = 0x3f + F_GETPROTECTIONLEVEL = 0x4d + F_GLOBAL_NOCACHE = 0x37 + F_LOG2PHYS = 0x31 + F_LOG2PHYS_EXT = 0x41 + F_NOCACHE = 0x30 + F_NODIRECT = 0x3e + F_OK = 0x0 + F_PATHPKG_CHECK = 0x34 + F_PEOFPOSMODE = 0x3 + F_PREALLOCATE = 0x2a + F_RDADVISE = 0x2c + F_RDAHEAD = 0x2d + F_RDLCK = 0x1 + F_SETBACKINGSTORE = 0x46 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETLKWTIMEOUT = 0xa + F_SETNOSIGPIPE = 0x49 + F_SETOWN = 0x6 + F_SETPROTECTIONCLASS = 0x40 + F_SETSIZE = 0x2b + F_SINGLE_WRITER = 0x4c + F_THAW_FS = 0x36 + F_TRANSCODEKEY = 0x4b + F_UNLCK = 0x2 + F_VOLPOSMODE = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_BRIDGE = 0xd1 + IFT_CARP = 0xf8 + IFT_CELLULAR = 0xff + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FAITH = 0x38 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_GIF = 0x37 + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IEEE1394 = 0x90 + IFT_IEEE8023ADLAG = 0x88 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_L2VLAN = 0x87 + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PDP = 0xff + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PKTAP = 0xfe + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_STF = 0x39 + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LINKLOCALNETNUM = 0xa9fe0000 + IN_LOOPBACKNET = 0x7f + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_2292DSTOPTS = 0x17 + IPV6_2292HOPLIMIT = 0x14 + IPV6_2292HOPOPTS = 0x16 + IPV6_2292NEXTHOP = 0x15 + IPV6_2292PKTINFO = 0x13 + IPV6_2292PKTOPTIONS = 0x19 + IPV6_2292RTHDR = 0x18 + IPV6_BINDV6ONLY = 0x1b + IPV6_BOUND_IF = 0x7d + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x3c + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVTCLASS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x24 + IPV6_UNICAST_HOPS = 0x4 + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BLOCK_SOURCE = 0x48 + IP_BOUND_IF = 0x19 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x28 + IP_FW_DEL = 0x29 + IP_FW_FLUSH = 0x2a + IP_FW_GET = 0x2c + IP_FW_RESETLOG = 0x2d + IP_FW_ZERO = 0x2b + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MF = 0x2000 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_IFINDEX = 0x42 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_NAT__XXX = 0x37 + IP_OFFMASK = 0x1fff + IP_OLD_FW_ADD = 0x32 + IP_OLD_FW_DEL = 0x33 + IP_OLD_FW_FLUSH = 0x34 + IP_OLD_FW_GET = 0x36 + IP_OLD_FW_RESETLOG = 0x38 + IP_OLD_FW_ZERO = 0x35 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x18 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_STRIPHDR = 0x17 + IP_TOS = 0x3 + IP_TRAFFIC_MGT_BACKGROUND = 0x41 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_CAN_REUSE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_FREE_REUSABLE = 0x7 + MADV_FREE_REUSE = 0x8 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MADV_ZERO_WIRED_PAGES = 0x6 + MAP_ANON = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_JIT = 0x800 + MAP_NOCACHE = 0x400 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_RESERVED0080 = 0x80 + MAP_SHARED = 0x1 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FLUSH = 0x400 + MSG_HAVEMORE = 0x2000 + MSG_HOLD = 0x800 + MSG_NEEDSA = 0x10000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_RCVMORE = 0x4000 + MSG_SEND = 0x1000 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MSG_WAITSTREAM = 0x200 + MS_ASYNC = 0x1 + MS_DEACTIVATE = 0x8 + MS_INVALIDATE = 0x2 + MS_KILLPAGES = 0x4 + MS_SYNC = 0x10 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_DUMP2 = 0x7 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLIST2 = 0x6 + NET_RT_MAXID = 0xa + NET_RT_STAT = 0x4 + NET_RT_TRASH = 0x5 + NOFLSH = 0x80000000 + NOTE_ABSOLUTE = 0x8 + NOTE_ATTRIB = 0x8 + NOTE_BACKGROUND = 0x40 + NOTE_CHILD = 0x4 + NOTE_CRITICAL = 0x20 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXITSTATUS = 0x4000000 + NOTE_EXIT_CSERROR = 0x40000 + NOTE_EXIT_DECRYPTFAIL = 0x10000 + NOTE_EXIT_DETAIL = 0x2000000 + NOTE_EXIT_DETAIL_MASK = 0x70000 + NOTE_EXIT_MEMORY = 0x20000 + NOTE_EXIT_REPARENTED = 0x80000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_LEEWAY = 0x10 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_NONE = 0x80 + NOTE_NSECONDS = 0x4 + NOTE_PCTRLMASK = -0x100000 + NOTE_PDATAMASK = 0xfffff + NOTE_REAP = 0x10000000 + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_SIGNAL = 0x8000000 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x2 + NOTE_VM_ERROR = 0x10000000 + NOTE_VM_PRESSURE = 0x80000000 + NOTE_VM_PRESSURE_SUDDEN_TERMINATE = 0x20000000 + NOTE_VM_PRESSURE_TERMINATE = 0x40000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFDEL = 0x20000 + OFILL = 0x80 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_ALERT = 0x20000000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x1000000 + O_CREAT = 0x200 + O_DIRECTORY = 0x100000 + O_DP_GETRAWENCRYPTED = 0x1 + O_DSYNC = 0x400000 + O_EVTONLY = 0x8000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x20000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_POPUP = 0x80000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYMLINK = 0x200000 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_ATTACH = 0xa + PT_ATTACHEXC = 0xe + PT_CONTINUE = 0x7 + PT_DENY_ATTACH = 0x1f + PT_DETACH = 0xb + PT_FIRSTMACH = 0x20 + PT_FORCEQUOTA = 0x1e + PT_KILL = 0x8 + PT_READ_D = 0x2 + PT_READ_I = 0x1 + PT_READ_U = 0x3 + PT_SIGEXC = 0xc + PT_STEP = 0x9 + PT_THUPDATE = 0xd + PT_TRACE_ME = 0x0 + PT_WRITE_D = 0x5 + PT_WRITE_I = 0x4 + PT_WRITE_U = 0x6 + RLIMIT_AS = 0x5 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_CPU_USAGE_MONITOR = 0x2 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_CONDEMNED = 0x2000000 + RTF_DELCLONE = 0x80 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_IFREF = 0x4000000 + RTF_IFSCOPE = 0x1000000 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_NOIFREF = 0x2000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_PROXY = 0x8000000 + RTF_REJECT = 0x8 + RTF_ROUTER = 0x10000000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_GET2 = 0x14 + RTM_IFINFO = 0xe + RTM_IFINFO2 = 0x12 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_NEWMADDR2 = 0x13 + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SCM_TIMESTAMP_MONOTONIC = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCARPIPLL = 0xc0206928 + SIOCATMARK = 0x40047307 + SIOCAUTOADDR = 0xc0206926 + SIOCAUTONETMASK = 0x80206927 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206941 + SIOCGDRVSPEC = 0xc028697b + SIOCGETVLAN = 0xc020697f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFALTMTU = 0xc0206948 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBOND = 0xc0206947 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020695b + SIOCGIFCONF = 0xc00c6924 + SIOCGIFDEVMTU = 0xc0206944 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFKPI = 0xc0206987 + SIOCGIFMAC = 0xc0206982 + SIOCGIFMEDIA = 0xc02c6938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206940 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc020693f + SIOCGIFSTATUS = 0xc331693d + SIOCGIFVLAN = 0xc020697f + SIOCGIFWAKEFLAGS = 0xc0206988 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCIFCREATE = 0xc0206978 + SIOCIFCREATE2 = 0xc020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106981 + SIOCRSLVMULTI = 0xc010693b + SIOCSDRVSPEC = 0x8028697b + SIOCSETVLAN = 0x8020697e + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFALTMTU = 0x80206945 + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBOND = 0x80206946 + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020695a + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFKPI = 0x80206986 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206983 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x8040693e + SIOCSIFPHYS = 0x80206936 + SIOCSIFVLAN = 0x8020697e + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_DONTTRUNC = 0x2000 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1010 + SO_LINGER = 0x80 + SO_LINGER_SEC = 0x1080 + SO_NKE = 0x1021 + SO_NOADDRERR = 0x1023 + SO_NOSIGPIPE = 0x1022 + SO_NOTIFYCONFLICT = 0x1026 + SO_NP_EXTENSIONS = 0x1083 + SO_NREAD = 0x1020 + SO_NUMRCVPKT = 0x1112 + SO_NWRITE = 0x1024 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1011 + SO_RANDOMPORT = 0x1082 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_REUSESHAREUID = 0x1025 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TIMESTAMP_MONOTONIC = 0x800 + SO_TYPE = 0x1008 + SO_UPCALLCLOSEWAIT = 0x1027 + SO_USELOOPBACK = 0x40 + SO_WANTMORE = 0x4000 + SO_WANTOOBFLAG = 0x8000 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_CONNECTIONTIMEOUT = 0x20 + TCP_ENABLE_ECN = 0x104 + TCP_KEEPALIVE = 0x10 + TCP_KEEPCNT = 0x102 + TCP_KEEPINTVL = 0x101 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0xd8 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_NOTSENT_LOWAT = 0x201 + TCP_RXT_CONNDROPTIME = 0x80 + TCP_RXT_FINDROP = 0x100 + TCP_SENDMOREACKS = 0x103 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCDSIMICROCODE = 0x20007455 + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x40487413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGWINSZ = 0x40087468 + TIOCIXOFF = 0x20007480 + TIOCIXON = 0x20007481 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTYGNAME = 0x40807453 + TIOCPTYGRANT = 0x20007454 + TIOCPTYUNLK = 0x20007452 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCONS = 0x20007463 + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x80487414 + TIOCSETAF = 0x80487416 + TIOCSETAW = 0x80487415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x10 + WCOREFLAG = 0x80 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOWAIT = 0x20 + WORDSIZE = 0x40 + WSTOPPED = 0x8 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADARCH = syscall.Errno(0x56) + EBADEXEC = syscall.Errno(0x55) + EBADF = syscall.Errno(0x9) + EBADMACHO = syscall.Errno(0x58) + EBADMSG = syscall.Errno(0x5e) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x59) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDEVERR = syscall.Errno(0x53) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x5a) + EILSEQ = syscall.Errno(0x5c) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x6a) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5f) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x60) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x61) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5b) + ENOPOLICY = syscall.Errno(0x67) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x62) + ENOSTR = syscall.Errno(0x63) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x68) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x66) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x69) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x64) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + EPWROFF = syscall.Errno(0x52) + EQFULL = syscall.Errno(0x6a) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHLIBVERS = syscall.Errno(0x57) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x65) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "resource busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "operation timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "device power is off", + 83: "device error", + 84: "value too large to be stored in data type", + 85: "bad executable (or shared library)", + 86: "bad CPU type in executable", + 87: "shared library version mismatch", + 88: "malformed Mach-o file", + 89: "operation canceled", + 90: "identifier removed", + 91: "no message of desired type", + 92: "illegal byte sequence", + 93: "attribute not found", + 94: "bad message", + 95: "EMULTIHOP (Reserved)", + 96: "no message available on STREAM", + 97: "ENOLINK (Reserved)", + 98: "no STREAM resources", + 99: "not a STREAM", + 100: "protocol error", + 101: "STREAM ioctl timeout", + 102: "operation not supported on socket", + 103: "policy not found", + 104: "state not recoverable", + 105: "previous owner died", + 106: "interface output queue is full", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "suspended (signal)", + 18: "suspended", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..0feceee15167c658857bdb24e29d5b27724a9e5f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go @@ -0,0 +1,1530 @@ +// mkerrors.sh -m64 +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build amd64,dragonfly + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ATM = 0x1e + AF_BLUETOOTH = 0x21 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x23 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1c + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x24 + AF_MPLS = 0x22 + AF_NATM = 0x1d + AF_NETGRAPH = 0x20 + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SIP = 0x18 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0104279 + BIOCGETIF = 0x4020426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x2000427a + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044278 + BIOCSETF = 0x80104267 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x8010427b + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x8 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DEFAULTBUFSIZE = 0x1000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MAX_CLONES = 0x80 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CREAD = 0x800 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_REDBACK_SMARTEDGE = 0x20 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DBF = 0xf + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_EXCEPT = -0x8 + EVFILT_MARKER = 0xf + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0x8 + EVFILT_TIMER = -0x7 + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_NODATA = 0x1000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTEXIT_LWP = 0x10000 + EXTEXIT_PROC = 0x0 + EXTEXIT_SETINT = 0x1 + EXTEXIT_SIMPLE = 0x0 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_DUP2FD = 0xa + F_DUP2FD_CLOEXEC = 0x12 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x11 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETOWN = 0x5 + F_OK = 0x0 + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x118e72 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MONITOR = 0x40000 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NPOLLING = 0x100000 + IFF_OACTIVE = 0x400 + IFF_OACTIVE_COMPAT = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_POLLING = 0x10000 + IFF_POLLING_COMPAT = 0x10000 + IFF_PPROMISC = 0x20000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_SMART = 0x20 + IFF_STATICARP = 0x80000 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf8 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xf3 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VOICEEM = 0x64 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CARP = 0x70 + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0xfe + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MOBILE = 0x37 + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEP = 0x21 + IPPROTO_SKIP = 0x39 + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TLSP = 0x38 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_UNKNOWN = 0x102 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDV6ONLY = 0x1b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PKTOPTIONS = 0x34 + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW_ADD = 0x32 + IP_FW_DEL = 0x33 + IP_FW_FLUSH = 0x34 + IP_FW_GET = 0x36 + IP_FW_RESETLOG = 0x37 + IP_FW_ZERO = 0x35 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x42 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x41 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_AUTOSYNC = 0x7 + MADV_CONTROL_END = 0xb + MADV_CONTROL_START = 0xa + MADV_CORE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_INVAL = 0xa + MADV_NOCORE = 0x8 + MADV_NORMAL = 0x0 + MADV_NOSYNC = 0x6 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SETMAP = 0xb + MADV_WILLNEED = 0x3 + MAP_ANON = 0x1000 + MAP_COPY = 0x2 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_NOCORE = 0x20000 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_NOSYNC = 0x800 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_SIZEALIGN = 0x40000 + MAP_STACK = 0x400 + MAP_TRYFIXED = 0x10000 + MAP_VPAGETABLE = 0x2000 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_FBLOCKING = 0x10000 + MSG_FMASK = 0xffff0000 + MSG_FNONBLOCKING = 0x20000 + MSG_NOSIGNAL = 0x400 + MSG_NOTIFICATION = 0x200 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_SYNC = 0x800 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x0 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_MAXID = 0x4 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_OOB = 0x2 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x20000 + O_CREAT = 0x200 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x8000000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FAPPEND = 0x100000 + O_FASYNCWRITE = 0x800000 + O_FBLOCKING = 0x40000 + O_FBUFFERED = 0x2000000 + O_FMASK = 0x7fc0000 + O_FNONBLOCKING = 0x80000 + O_FOFFSET = 0x200000 + O_FSYNC = 0x80 + O_FSYNCWRITE = 0x400000 + O_FUNBUFFERED = 0x1000000 + O_MAPONREAD = 0x4000000 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0xb + RTAX_MPLS1 = 0x8 + RTAX_MPLS2 = 0x9 + RTAX_MPLS3 = 0xa + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_MPLS1 = 0x100 + RTA_MPLS2 = 0x200 + RTA_MPLS3 = 0x400 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MPLSOPS = 0x1000000 + RTF_MULTICAST = 0x800000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_WASCLONED = 0x20000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x12 + RTM_IFANNOUNCE = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x6 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_IWCAPSEGS = 0x400 + RTV_IWMAXSEGS = 0x200 + RTV_MSL = 0x100 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCADDRT = 0x8040720a + SIOCAIFADDR = 0x8040691a + SIOCALIFADDR = 0x8118691b + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80206932 + SIOCDELRT = 0x8040720b + SIOCDIFADDR = 0x80206919 + SIOCDIFPHYADDR = 0x80206949 + SIOCDLIFADDR = 0x8118691d + SIOCGDRVSPEC = 0xc028697b + SIOCGETSGCNT = 0xc0207210 + SIOCGETVIFCNT = 0xc028720f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020691f + SIOCGIFCONF = 0xc0106924 + SIOCGIFDATA = 0xc0206926 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc028698a + SIOCGIFINDEX = 0xc0206920 + SIOCGIFMEDIA = 0xc0306938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPOLLCPU = 0xc020697e + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFSTATUS = 0xc331693b + SIOCGIFTSOLEN = 0xc0206980 + SIOCGLIFADDR = 0xc118691c + SIOCGLIFPHYADDR = 0xc118694b + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGPRIVATE_0 = 0xc0206950 + SIOCGPRIVATE_1 = 0xc0206951 + SIOCIFCREATE = 0xc020697a + SIOCIFCREATE2 = 0xc020697c + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106978 + SIOCSDRVSPEC = 0x8028697b + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020691e + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNAME = 0x80206928 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPHYS = 0x80206936 + SIOCSIFPOLLCPU = 0x8020697d + SIOCSIFTSOLEN = 0x8020697f + SIOCSLIFPHYADDR = 0x8118694a + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NOSIGPIPE = 0x800 + SO_OOBINLINE = 0x100 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDSPACE = 0x100a + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_FASTKEEP = 0x80 + TCP_KEEPCNT = 0x400 + TCP_KEEPIDLE = 0x100 + TCP_KEEPINIT = 0x20 + TCP_KEEPINTVL = 0x200 + TCP_MAXBURST = 0x4 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MINMSS = 0x100 + TCP_MIN_WINSHIFT = 0x5 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_SIGNATURE_ENABLE = 0x10 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGSID = 0x40047463 + TIOCGSIZE = 0x40087468 + TIOCGWINSZ = 0x40087468 + TIOCISPTMASTER = 0x20007455 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMODG = 0x40047403 + TIOCMODS = 0x80047404 + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2000745f + TIOCSPGRP = 0x80047476 + TIOCSSIZE = 0x80087467 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VCHECKPT = 0x13 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VERASE2 = 0x7 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x4 + WCOREFLAG = 0x80 + WLINUXCLONE = 0x80000000 + WNOHANG = 0x1 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EASYNC = syscall.Errno(0x63) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x59) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x55) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDOOFUS = syscall.Errno(0x58) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x56) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x63) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5a) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x57) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5b) + ENOMEDIUM = syscall.Errno(0x5d) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x5c) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUNUSED94 = syscall.Errno(0x5e) + EUNUSED95 = syscall.Errno(0x5f) + EUNUSED96 = syscall.Errno(0x60) + EUNUSED97 = syscall.Errno(0x61) + EUNUSED98 = syscall.Errno(0x62) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCKPT = syscall.Signal(0x21) + SIGCKPTEXIT = syscall.Signal(0x22) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "operation timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "identifier removed", + 83: "no message of desired type", + 84: "value too large to be stored in data type", + 85: "operation canceled", + 86: "illegal byte sequence", + 87: "attribute not found", + 88: "programming error", + 89: "bad message", + 90: "multihop attempted", + 91: "link has been severed", + 92: "protocol error", + 93: "no medium found", + 94: "unknown error: 94", + 95: "unknown error: 95", + 96: "unknown error: 96", + 97: "unknown error: 97", + 98: "unknown error: 98", + 99: "unknown error: 99", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "suspended (signal)", + 18: "suspended", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", + 32: "thread Scheduler", + 33: "checkPoint", + 34: "checkPointExit", +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go new file mode 100644 index 0000000000000000000000000000000000000000..7b95751c3db36f742a398d049828989eb8f4d63a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go @@ -0,0 +1,1743 @@ +// mkerrors.sh -m32 +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build 386,freebsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m32 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x23 + AF_ATM = 0x1e + AF_BLUETOOTH = 0x24 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1c + AF_INET6_SDP = 0x2a + AF_INET_SDP = 0x28 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x2a + AF_NATM = 0x1d + AF_NETBIOS = 0x6 + AF_NETGRAPH = 0x20 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SCLUSTER = 0x22 + AF_SIP = 0x18 + AF_SLOW = 0x21 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VENDOR00 = 0x27 + AF_VENDOR01 = 0x29 + AF_VENDOR02 = 0x2b + AF_VENDOR03 = 0x2d + AF_VENDOR04 = 0x2f + AF_VENDOR05 = 0x31 + AF_VENDOR06 = 0x33 + AF_VENDOR07 = 0x35 + AF_VENDOR08 = 0x37 + AF_VENDOR09 = 0x39 + AF_VENDOR10 = 0x3b + AF_VENDOR11 = 0x3d + AF_VENDOR12 = 0x3f + AF_VENDOR13 = 0x41 + AF_VENDOR14 = 0x43 + AF_VENDOR15 = 0x45 + AF_VENDOR16 = 0x47 + AF_VENDOR17 = 0x49 + AF_VENDOR18 = 0x4b + AF_VENDOR19 = 0x4d + AF_VENDOR20 = 0x4f + AF_VENDOR21 = 0x51 + AF_VENDOR22 = 0x53 + AF_VENDOR23 = 0x55 + AF_VENDOR24 = 0x57 + AF_VENDOR25 = 0x59 + AF_VENDOR26 = 0x5b + AF_VENDOR27 = 0x5d + AF_VENDOR28 = 0x5f + AF_VENDOR29 = 0x61 + AF_VENDOR30 = 0x63 + AF_VENDOR31 = 0x65 + AF_VENDOR32 = 0x67 + AF_VENDOR33 = 0x69 + AF_VENDOR34 = 0x6b + AF_VENDOR35 = 0x6d + AF_VENDOR36 = 0x6f + AF_VENDOR37 = 0x71 + AF_VENDOR38 = 0x73 + AF_VENDOR39 = 0x75 + AF_VENDOR40 = 0x77 + AF_VENDOR41 = 0x79 + AF_VENDOR42 = 0x7b + AF_VENDOR43 = 0x7d + AF_VENDOR44 = 0x7f + AF_VENDOR45 = 0x81 + AF_VENDOR46 = 0x83 + AF_VENDOR47 = 0x85 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427c + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRECTION = 0x40044276 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0084279 + BIOCGETBUFMODE = 0x4004427d + BIOCGETIF = 0x4020426b + BIOCGETZMAX = 0x4004427f + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4008426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCGTSTAMP = 0x40044283 + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x2000427a + BIOCPROMISC = 0x20004269 + BIOCROTZBUF = 0x400c4280 + BIOCSBLEN = 0xc0044266 + BIOCSDIRECTION = 0x80044277 + BIOCSDLT = 0x80044278 + BIOCSETBUFMODE = 0x8004427e + BIOCSETF = 0x80084267 + BIOCSETFNR = 0x80084282 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x8008427b + BIOCSETZBUF = 0x800c4281 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8008426d + BIOCSSEESENT = 0x80044277 + BIOCSTSTAMP = 0x80044284 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_BUFMODE_BUFFER = 0x1 + BPF_BUFMODE_ZBUF = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_T_BINTIME = 0x2 + BPF_T_BINTIME_FAST = 0x102 + BPF_T_BINTIME_MONOTONIC = 0x202 + BPF_T_BINTIME_MONOTONIC_FAST = 0x302 + BPF_T_FAST = 0x100 + BPF_T_FLAG_MASK = 0x300 + BPF_T_FORMAT_MASK = 0x3 + BPF_T_MICROTIME = 0x0 + BPF_T_MICROTIME_FAST = 0x100 + BPF_T_MICROTIME_MONOTONIC = 0x200 + BPF_T_MICROTIME_MONOTONIC_FAST = 0x300 + BPF_T_MONOTONIC = 0x200 + BPF_T_MONOTONIC_FAST = 0x300 + BPF_T_NANOTIME = 0x1 + BPF_T_NANOTIME_FAST = 0x101 + BPF_T_NANOTIME_MONOTONIC = 0x201 + BPF_T_NANOTIME_MONOTONIC_FAST = 0x301 + BPF_T_NONE = 0x3 + BPF_T_NORMAL = 0x0 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 + CREAD = 0x800 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0x18 + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0xf6 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x79 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_FS = -0x9 + EVFILT_LIO = -0xa + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xb + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xb + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DROP = 0x1000 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTATTR_NAMESPACE_EMPTY = 0x0 + EXTATTR_NAMESPACE_SYSTEM = 0x2 + EXTATTR_NAMESPACE_USER = 0x1 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_CANCEL = 0x5 + F_DUP2FD = 0xa + F_DUP2FD_CLOEXEC = 0x12 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x11 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0xb + F_GETOWN = 0x5 + F_OGETLK = 0x7 + F_OK = 0x0 + F_OSETLK = 0x8 + F_OSETLKW = 0x9 + F_RDAHEAD = 0x10 + F_RDLCK = 0x1 + F_READAHEAD = 0xf + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0xc + F_SETLKW = 0xd + F_SETLK_REMOTE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_UNLCKSYS = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x218f72 + IFF_CANTCONFIG = 0x10000 + IFF_DEBUG = 0x4 + IFF_DRV_OACTIVE = 0x400 + IFF_DRV_RUNNING = 0x40 + IFF_DYING = 0x200000 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MONITOR = 0x40000 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PPROMISC = 0x20000 + IFF_PROMISC = 0x100 + IFF_RENAMING = 0x400000 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_SMART = 0x20 + IFF_STATICARP = 0x80000 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf8 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_IPXIP = 0xf9 + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf6 + IFT_PFSYNC = 0xf7 + IFT_PLC = 0xae + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VOICEEM = 0x64 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_MASK = 0xfffffffe + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CARP = 0x70 + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0x102 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HIP = 0x8b + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MH = 0x87 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OLD_DIVERT = 0xfe + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_RESERVED_253 = 0xfd + IPPROTO_RESERVED_254 = 0xfe + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEND = 0x103 + IPPROTO_SEP = 0x21 + IPPROTO_SHIM6 = 0x8c + IPPROTO_SKIP = 0x39 + IPPROTO_SPACER = 0x7fff + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TLSP = 0x38 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDANY = 0x40 + IPV6_BINDV6ONLY = 0x1b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BINDANY = 0x18 + IP_BLOCK_SOURCE = 0x48 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DONTFRAG = 0x43 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET3 = 0x31 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW3 = 0x30 + IP_FW_ADD = 0x32 + IP_FW_DEL = 0x33 + IP_FW_FLUSH = 0x34 + IP_FW_GET = 0x36 + IP_FW_NAT_CFG = 0x38 + IP_FW_NAT_DEL = 0x39 + IP_FW_NAT_GET_CONFIG = 0x3a + IP_FW_NAT_GET_LOG = 0x3b + IP_FW_RESETLOG = 0x37 + IP_FW_TABLE_ADD = 0x28 + IP_FW_TABLE_DEL = 0x29 + IP_FW_TABLE_FLUSH = 0x2a + IP_FW_TABLE_GETSIZE = 0x2b + IP_FW_TABLE_LIST = 0x2c + IP_FW_ZERO = 0x35 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MAX_SOURCE_FILTER = 0x400 + IP_MF = 0x2000 + IP_MINTTL = 0x42 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_OFFMASK = 0x1fff + IP_ONESBCAST = 0x17 + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTOS = 0x44 + IP_RECVTTL = 0x41 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_SENDSRCADDR = 0x7 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_AUTOSYNC = 0x7 + MADV_CORE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_NOCORE = 0x8 + MADV_NORMAL = 0x0 + MADV_NOSYNC = 0x6 + MADV_PROTECT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MAP_ALIGNED_SUPER = 0x1000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_EXCL = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_NOCORE = 0x20000 + MAP_NORESERVE = 0x40 + MAP_NOSYNC = 0x800 + MAP_PREFAULT_READ = 0x40000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_RESERVED0080 = 0x80 + MAP_RESERVED0100 = 0x100 + MAP_SHARED = 0x1 + MAP_STACK = 0x400 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_CMSG_CLOEXEC = 0x40000 + MSG_COMPAT = 0x8000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_NBIO = 0x4000 + MSG_NOSIGNAL = 0x20000 + MSG_NOTIFICATION = 0x2000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x0 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLISTL = 0x5 + NET_RT_IFMALIST = 0x4 + NET_RT_MAXID = 0x6 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x100000 + O_CREAT = 0x200 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x20000 + O_EXCL = 0x800 + O_EXEC = 0x40000 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_TTY_INIT = 0x80000 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FMASK = 0x1004d808 + RTF_GATEWAY = 0x2 + RTF_GWFLAG_COMPAT = 0x80000000 + RTF_HOST = 0x4 + RTF_LLDATA = 0x400 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_RNH_LOCKED = 0x40000000 + RTF_STATIC = 0x800 + RTF_STICKY = 0x10000000 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x12 + RTM_IFANNOUNCE = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RTV_WEIGHT = 0x100 + RT_ALL_FIBS = -0x1 + RT_CACHING_CONTEXT = 0x1 + RT_DEFAULT_FIB = 0x0 + RT_NORTREF = 0x2 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_BINTIME = 0x4 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCADDRT = 0x8030720a + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80246987 + SIOCALIFADDR = 0x8118691b + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80206932 + SIOCDELRT = 0x8030720b + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80246989 + SIOCDIFPHYADDR = 0x80206949 + SIOCDLIFADDR = 0x8118691d + SIOCGDRVSPEC = 0xc01c697b + SIOCGETSGCNT = 0xc0147210 + SIOCGETVIFCNT = 0xc014720f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020691f + SIOCGIFCONF = 0xc0086924 + SIOCGIFDESCR = 0xc020692a + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFIB = 0xc020695c + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc024698a + SIOCGIFGROUP = 0xc0246988 + SIOCGIFINDEX = 0xc0206920 + SIOCGIFMAC = 0xc0206926 + SIOCGIFMEDIA = 0xc0286938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFSTATUS = 0xc331693b + SIOCGLIFADDR = 0xc118691c + SIOCGLIFPHYADDR = 0xc118694b + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGPRIVATE_0 = 0xc0206950 + SIOCGPRIVATE_1 = 0xc0206951 + SIOCIFCREATE = 0xc020697a + SIOCIFCREATE2 = 0xc020697c + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCSDRVSPEC = 0x801c697b + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020691e + SIOCSIFDESCR = 0x80206929 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFIB = 0x8020695d + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206927 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNAME = 0x80206928 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPHYS = 0x80206936 + SIOCSIFRVNET = 0xc020695b + SIOCSIFVNET = 0xc020695a + SIOCSLIFPHYADDR = 0x8118694a + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_NONBLOCK = 0x20000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BINTIME = 0x2000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1009 + SO_LINGER = 0x80 + SO_LISTENINCQLEN = 0x1013 + SO_LISTENQLEN = 0x1012 + SO_LISTENQLIMIT = 0x1011 + SO_NOSIGPIPE = 0x800 + SO_NO_DDP = 0x8000 + SO_NO_OFFLOAD = 0x4000 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1010 + SO_PROTOCOL = 0x1016 + SO_PROTOTYPE = 0x1016 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SETFIB = 0x1014 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_USER_COOKIE = 0x1015 + SO_VENDOR = 0x80000000 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_CA_NAME_MAX = 0x10 + TCP_CONGESTION = 0x40 + TCP_INFO = 0x20 + TCP_KEEPCNT = 0x400 + TCP_KEEPIDLE = 0x100 + TCP_KEEPINIT = 0x80 + TCP_KEEPINTVL = 0x200 + TCP_MAXBURST = 0x4 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_VENDOR = 0x80000000 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGPTN = 0x4004740f + TIOCGSID = 0x40047463 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DCD = 0x40 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMASTER = 0x2000741c + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40087459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VERASE2 = 0x7 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x4 + WCOREFLAG = 0x80 + WEXITED = 0x10 + WLINUXCLONE = 0x80000000 + WNOHANG = 0x1 + WNOWAIT = 0x8 + WSTOPPED = 0x2 + WTRAPPED = 0x20 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x59) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x55) + ECAPMODE = syscall.Errno(0x5e) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDOOFUS = syscall.Errno(0x58) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x56) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5a) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x57) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCAPABLE = syscall.Errno(0x5d) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x5f) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x60) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x5c) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGLIBRT = syscall.Signal(0x21) + SIGLWP = syscall.Signal(0x20) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "operation timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "identifier removed", + 83: "no message of desired type", + 84: "value too large to be stored in data type", + 85: "operation canceled", + 86: "illegal byte sequence", + 87: "attribute not found", + 88: "programming error", + 89: "bad message", + 90: "multihop attempted", + 91: "link has been severed", + 92: "protocol error", + 93: "capabilities insufficient", + 94: "not permitted in capability mode", + 95: "state not recoverable", + 96: "previous owner died", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "suspended (signal)", + 18: "suspended", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", + 32: "unknown signal", + 33: "unknown signal", +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..e48e7799a1d673b55512095970aa2feb96057b26 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go @@ -0,0 +1,1748 @@ +// mkerrors.sh -m64 +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build amd64,freebsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x23 + AF_ATM = 0x1e + AF_BLUETOOTH = 0x24 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1c + AF_INET6_SDP = 0x2a + AF_INET_SDP = 0x28 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x2a + AF_NATM = 0x1d + AF_NETBIOS = 0x6 + AF_NETGRAPH = 0x20 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SCLUSTER = 0x22 + AF_SIP = 0x18 + AF_SLOW = 0x21 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VENDOR00 = 0x27 + AF_VENDOR01 = 0x29 + AF_VENDOR02 = 0x2b + AF_VENDOR03 = 0x2d + AF_VENDOR04 = 0x2f + AF_VENDOR05 = 0x31 + AF_VENDOR06 = 0x33 + AF_VENDOR07 = 0x35 + AF_VENDOR08 = 0x37 + AF_VENDOR09 = 0x39 + AF_VENDOR10 = 0x3b + AF_VENDOR11 = 0x3d + AF_VENDOR12 = 0x3f + AF_VENDOR13 = 0x41 + AF_VENDOR14 = 0x43 + AF_VENDOR15 = 0x45 + AF_VENDOR16 = 0x47 + AF_VENDOR17 = 0x49 + AF_VENDOR18 = 0x4b + AF_VENDOR19 = 0x4d + AF_VENDOR20 = 0x4f + AF_VENDOR21 = 0x51 + AF_VENDOR22 = 0x53 + AF_VENDOR23 = 0x55 + AF_VENDOR24 = 0x57 + AF_VENDOR25 = 0x59 + AF_VENDOR26 = 0x5b + AF_VENDOR27 = 0x5d + AF_VENDOR28 = 0x5f + AF_VENDOR29 = 0x61 + AF_VENDOR30 = 0x63 + AF_VENDOR31 = 0x65 + AF_VENDOR32 = 0x67 + AF_VENDOR33 = 0x69 + AF_VENDOR34 = 0x6b + AF_VENDOR35 = 0x6d + AF_VENDOR36 = 0x6f + AF_VENDOR37 = 0x71 + AF_VENDOR38 = 0x73 + AF_VENDOR39 = 0x75 + AF_VENDOR40 = 0x77 + AF_VENDOR41 = 0x79 + AF_VENDOR42 = 0x7b + AF_VENDOR43 = 0x7d + AF_VENDOR44 = 0x7f + AF_VENDOR45 = 0x81 + AF_VENDOR46 = 0x83 + AF_VENDOR47 = 0x85 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427c + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRECTION = 0x40044276 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0104279 + BIOCGETBUFMODE = 0x4004427d + BIOCGETIF = 0x4020426b + BIOCGETZMAX = 0x4008427f + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCGTSTAMP = 0x40044283 + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x2000427a + BIOCPROMISC = 0x20004269 + BIOCROTZBUF = 0x40184280 + BIOCSBLEN = 0xc0044266 + BIOCSDIRECTION = 0x80044277 + BIOCSDLT = 0x80044278 + BIOCSETBUFMODE = 0x8004427e + BIOCSETF = 0x80104267 + BIOCSETFNR = 0x80104282 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x8010427b + BIOCSETZBUF = 0x80184281 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8010426d + BIOCSSEESENT = 0x80044277 + BIOCSTSTAMP = 0x80044284 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x8 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_BUFMODE_BUFFER = 0x1 + BPF_BUFMODE_ZBUF = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_T_BINTIME = 0x2 + BPF_T_BINTIME_FAST = 0x102 + BPF_T_BINTIME_MONOTONIC = 0x202 + BPF_T_BINTIME_MONOTONIC_FAST = 0x302 + BPF_T_FAST = 0x100 + BPF_T_FLAG_MASK = 0x300 + BPF_T_FORMAT_MASK = 0x3 + BPF_T_MICROTIME = 0x0 + BPF_T_MICROTIME_FAST = 0x100 + BPF_T_MICROTIME_MONOTONIC = 0x200 + BPF_T_MICROTIME_MONOTONIC_FAST = 0x300 + BPF_T_MONOTONIC = 0x200 + BPF_T_MONOTONIC_FAST = 0x300 + BPF_T_NANOTIME = 0x1 + BPF_T_NANOTIME_FAST = 0x101 + BPF_T_NANOTIME_MONOTONIC = 0x201 + BPF_T_NANOTIME_MONOTONIC_FAST = 0x301 + BPF_T_NONE = 0x3 + BPF_T_NORMAL = 0x0 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLOCK_MONOTONIC = 0x4 + CLOCK_MONOTONIC_FAST = 0xc + CLOCK_MONOTONIC_PRECISE = 0xb + CLOCK_PROCESS_CPUTIME_ID = 0xf + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_FAST = 0xa + CLOCK_REALTIME_PRECISE = 0x9 + CLOCK_SECOND = 0xd + CLOCK_THREAD_CPUTIME_ID = 0xe + CLOCK_UPTIME = 0x5 + CLOCK_UPTIME_FAST = 0x8 + CLOCK_UPTIME_PRECISE = 0x7 + CLOCK_VIRTUAL = 0x1 + CREAD = 0x800 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0x18 + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0xf6 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x79 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_FS = -0x9 + EVFILT_LIO = -0xa + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xb + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xb + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DROP = 0x1000 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTATTR_NAMESPACE_EMPTY = 0x0 + EXTATTR_NAMESPACE_SYSTEM = 0x2 + EXTATTR_NAMESPACE_USER = 0x1 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_CANCEL = 0x5 + F_DUP2FD = 0xa + F_DUP2FD_CLOEXEC = 0x12 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x11 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0xb + F_GETOWN = 0x5 + F_OGETLK = 0x7 + F_OK = 0x0 + F_OSETLK = 0x8 + F_OSETLKW = 0x9 + F_RDAHEAD = 0x10 + F_RDLCK = 0x1 + F_READAHEAD = 0xf + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0xc + F_SETLKW = 0xd + F_SETLK_REMOTE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_UNLCKSYS = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x218f72 + IFF_CANTCONFIG = 0x10000 + IFF_DEBUG = 0x4 + IFF_DRV_OACTIVE = 0x400 + IFF_DRV_RUNNING = 0x40 + IFF_DYING = 0x200000 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MONITOR = 0x40000 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PPROMISC = 0x20000 + IFF_PROMISC = 0x100 + IFF_RENAMING = 0x400000 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_SMART = 0x20 + IFF_STATICARP = 0x80000 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf8 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_IPXIP = 0xf9 + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf6 + IFT_PFSYNC = 0xf7 + IFT_PLC = 0xae + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VOICEEM = 0x64 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_MASK = 0xfffffffe + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CARP = 0x70 + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0x102 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HIP = 0x8b + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MH = 0x87 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OLD_DIVERT = 0xfe + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_RESERVED_253 = 0xfd + IPPROTO_RESERVED_254 = 0xfe + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEND = 0x103 + IPPROTO_SEP = 0x21 + IPPROTO_SHIM6 = 0x8c + IPPROTO_SKIP = 0x39 + IPPROTO_SPACER = 0x7fff + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TLSP = 0x38 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDANY = 0x40 + IPV6_BINDV6ONLY = 0x1b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BINDANY = 0x18 + IP_BLOCK_SOURCE = 0x48 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DONTFRAG = 0x43 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET3 = 0x31 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW3 = 0x30 + IP_FW_ADD = 0x32 + IP_FW_DEL = 0x33 + IP_FW_FLUSH = 0x34 + IP_FW_GET = 0x36 + IP_FW_NAT_CFG = 0x38 + IP_FW_NAT_DEL = 0x39 + IP_FW_NAT_GET_CONFIG = 0x3a + IP_FW_NAT_GET_LOG = 0x3b + IP_FW_RESETLOG = 0x37 + IP_FW_TABLE_ADD = 0x28 + IP_FW_TABLE_DEL = 0x29 + IP_FW_TABLE_FLUSH = 0x2a + IP_FW_TABLE_GETSIZE = 0x2b + IP_FW_TABLE_LIST = 0x2c + IP_FW_ZERO = 0x35 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MAX_SOURCE_FILTER = 0x400 + IP_MF = 0x2000 + IP_MINTTL = 0x42 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_OFFMASK = 0x1fff + IP_ONESBCAST = 0x17 + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTOS = 0x44 + IP_RECVTTL = 0x41 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_SENDSRCADDR = 0x7 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_AUTOSYNC = 0x7 + MADV_CORE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_NOCORE = 0x8 + MADV_NORMAL = 0x0 + MADV_NOSYNC = 0x6 + MADV_PROTECT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MAP_32BIT = 0x80000 + MAP_ALIGNED_SUPER = 0x1000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_EXCL = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_NOCORE = 0x20000 + MAP_NORESERVE = 0x40 + MAP_NOSYNC = 0x800 + MAP_PREFAULT_READ = 0x40000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_RESERVED0080 = 0x80 + MAP_RESERVED0100 = 0x100 + MAP_SHARED = 0x1 + MAP_STACK = 0x400 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_CMSG_CLOEXEC = 0x40000 + MSG_COMPAT = 0x8000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_NBIO = 0x4000 + MSG_NOSIGNAL = 0x20000 + MSG_NOTIFICATION = 0x2000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x0 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLISTL = 0x5 + NET_RT_IFMALIST = 0x4 + NET_RT_MAXID = 0x6 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_MSECONDS = 0x2 + NOTE_NSECONDS = 0x8 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_SECONDS = 0x1 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_USECONDS = 0x4 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x100000 + O_CREAT = 0x200 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x20000 + O_EXCL = 0x800 + O_EXEC = 0x40000 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_TTY_INIT = 0x80000 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FMASK = 0x1004d808 + RTF_GATEWAY = 0x2 + RTF_GWFLAG_COMPAT = 0x80000000 + RTF_HOST = 0x4 + RTF_LLDATA = 0x400 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_RNH_LOCKED = 0x40000000 + RTF_STATIC = 0x800 + RTF_STICKY = 0x10000000 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x12 + RTM_IFANNOUNCE = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RTV_WEIGHT = 0x100 + RT_ALL_FIBS = -0x1 + RT_CACHING_CONTEXT = 0x1 + RT_DEFAULT_FIB = 0x0 + RT_NORTREF = 0x2 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_BINTIME = 0x4 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCADDRT = 0x8040720a + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80286987 + SIOCALIFADDR = 0x8118691b + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80206932 + SIOCDELRT = 0x8040720b + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80286989 + SIOCDIFPHYADDR = 0x80206949 + SIOCDLIFADDR = 0x8118691d + SIOCGDRVSPEC = 0xc028697b + SIOCGETSGCNT = 0xc0207210 + SIOCGETVIFCNT = 0xc028720f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020691f + SIOCGIFCONF = 0xc0106924 + SIOCGIFDESCR = 0xc020692a + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFIB = 0xc020695c + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc028698a + SIOCGIFGROUP = 0xc0286988 + SIOCGIFINDEX = 0xc0206920 + SIOCGIFMAC = 0xc0206926 + SIOCGIFMEDIA = 0xc0306938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFSTATUS = 0xc331693b + SIOCGLIFADDR = 0xc118691c + SIOCGLIFPHYADDR = 0xc118694b + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGPRIVATE_0 = 0xc0206950 + SIOCGPRIVATE_1 = 0xc0206951 + SIOCIFCREATE = 0xc020697a + SIOCIFCREATE2 = 0xc020697c + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106978 + SIOCSDRVSPEC = 0x8028697b + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020691e + SIOCSIFDESCR = 0x80206929 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFIB = 0x8020695d + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206927 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNAME = 0x80206928 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPHYS = 0x80206936 + SIOCSIFRVNET = 0xc020695b + SIOCSIFVNET = 0xc020695a + SIOCSLIFPHYADDR = 0x8118694a + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_NONBLOCK = 0x20000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BINTIME = 0x2000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1009 + SO_LINGER = 0x80 + SO_LISTENINCQLEN = 0x1013 + SO_LISTENQLEN = 0x1012 + SO_LISTENQLIMIT = 0x1011 + SO_NOSIGPIPE = 0x800 + SO_NO_DDP = 0x8000 + SO_NO_OFFLOAD = 0x4000 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1010 + SO_PROTOCOL = 0x1016 + SO_PROTOTYPE = 0x1016 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SETFIB = 0x1014 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_USER_COOKIE = 0x1015 + SO_VENDOR = 0x80000000 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_CA_NAME_MAX = 0x10 + TCP_CONGESTION = 0x40 + TCP_INFO = 0x20 + TCP_KEEPCNT = 0x400 + TCP_KEEPIDLE = 0x100 + TCP_KEEPINIT = 0x80 + TCP_KEEPINTVL = 0x200 + TCP_MAXBURST = 0x4 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_VENDOR = 0x80000000 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGPTN = 0x4004740f + TIOCGSID = 0x40047463 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DCD = 0x40 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMASTER = 0x2000741c + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40107459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VERASE2 = 0x7 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x4 + WCOREFLAG = 0x80 + WEXITED = 0x10 + WLINUXCLONE = 0x80000000 + WNOHANG = 0x1 + WNOWAIT = 0x8 + WSTOPPED = 0x2 + WTRAPPED = 0x20 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x59) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x55) + ECAPMODE = syscall.Errno(0x5e) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDOOFUS = syscall.Errno(0x58) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x56) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5a) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x57) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCAPABLE = syscall.Errno(0x5d) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x5f) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x60) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x5c) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGLIBRT = syscall.Signal(0x21) + SIGLWP = syscall.Signal(0x20) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "operation timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "identifier removed", + 83: "no message of desired type", + 84: "value too large to be stored in data type", + 85: "operation canceled", + 86: "illegal byte sequence", + 87: "attribute not found", + 88: "programming error", + 89: "bad message", + 90: "multihop attempted", + 91: "link has been severed", + 92: "protocol error", + 93: "capabilities insufficient", + 94: "not permitted in capability mode", + 95: "state not recoverable", + 96: "previous owner died", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "suspended (signal)", + 18: "suspended", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", + 32: "unknown signal", + 33: "unknown signal", +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go new file mode 100644 index 0000000000000000000000000000000000000000..2afbe2d5ed7978ea0574a90304bbb4aecf792df0 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go @@ -0,0 +1,1729 @@ +// mkerrors.sh +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build arm,freebsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x23 + AF_ATM = 0x1e + AF_BLUETOOTH = 0x24 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x25 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1c + AF_INET6_SDP = 0x2a + AF_INET_SDP = 0x28 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x2a + AF_NATM = 0x1d + AF_NETBIOS = 0x6 + AF_NETGRAPH = 0x20 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SCLUSTER = 0x22 + AF_SIP = 0x18 + AF_SLOW = 0x21 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VENDOR00 = 0x27 + AF_VENDOR01 = 0x29 + AF_VENDOR02 = 0x2b + AF_VENDOR03 = 0x2d + AF_VENDOR04 = 0x2f + AF_VENDOR05 = 0x31 + AF_VENDOR06 = 0x33 + AF_VENDOR07 = 0x35 + AF_VENDOR08 = 0x37 + AF_VENDOR09 = 0x39 + AF_VENDOR10 = 0x3b + AF_VENDOR11 = 0x3d + AF_VENDOR12 = 0x3f + AF_VENDOR13 = 0x41 + AF_VENDOR14 = 0x43 + AF_VENDOR15 = 0x45 + AF_VENDOR16 = 0x47 + AF_VENDOR17 = 0x49 + AF_VENDOR18 = 0x4b + AF_VENDOR19 = 0x4d + AF_VENDOR20 = 0x4f + AF_VENDOR21 = 0x51 + AF_VENDOR22 = 0x53 + AF_VENDOR23 = 0x55 + AF_VENDOR24 = 0x57 + AF_VENDOR25 = 0x59 + AF_VENDOR26 = 0x5b + AF_VENDOR27 = 0x5d + AF_VENDOR28 = 0x5f + AF_VENDOR29 = 0x61 + AF_VENDOR30 = 0x63 + AF_VENDOR31 = 0x65 + AF_VENDOR32 = 0x67 + AF_VENDOR33 = 0x69 + AF_VENDOR34 = 0x6b + AF_VENDOR35 = 0x6d + AF_VENDOR36 = 0x6f + AF_VENDOR37 = 0x71 + AF_VENDOR38 = 0x73 + AF_VENDOR39 = 0x75 + AF_VENDOR40 = 0x77 + AF_VENDOR41 = 0x79 + AF_VENDOR42 = 0x7b + AF_VENDOR43 = 0x7d + AF_VENDOR44 = 0x7f + AF_VENDOR45 = 0x81 + AF_VENDOR46 = 0x83 + AF_VENDOR47 = 0x85 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427c + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRECTION = 0x40044276 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0084279 + BIOCGETBUFMODE = 0x4004427d + BIOCGETIF = 0x4020426b + BIOCGETZMAX = 0x4004427f + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044272 + BIOCGRTIMEOUT = 0x4008426e + BIOCGSEESENT = 0x40044276 + BIOCGSTATS = 0x4008426f + BIOCGTSTAMP = 0x40044283 + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x2000427a + BIOCPROMISC = 0x20004269 + BIOCROTZBUF = 0x400c4280 + BIOCSBLEN = 0xc0044266 + BIOCSDIRECTION = 0x80044277 + BIOCSDLT = 0x80044278 + BIOCSETBUFMODE = 0x8004427e + BIOCSETF = 0x80084267 + BIOCSETFNR = 0x80084282 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x8008427b + BIOCSETZBUF = 0x800c4281 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044273 + BIOCSRTIMEOUT = 0x8008426d + BIOCSSEESENT = 0x80044277 + BIOCSTSTAMP = 0x80044284 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_BUFMODE_BUFFER = 0x1 + BPF_BUFMODE_ZBUF = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x80000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_T_BINTIME = 0x2 + BPF_T_BINTIME_FAST = 0x102 + BPF_T_BINTIME_MONOTONIC = 0x202 + BPF_T_BINTIME_MONOTONIC_FAST = 0x302 + BPF_T_FAST = 0x100 + BPF_T_FLAG_MASK = 0x300 + BPF_T_FORMAT_MASK = 0x3 + BPF_T_MICROTIME = 0x0 + BPF_T_MICROTIME_FAST = 0x100 + BPF_T_MICROTIME_MONOTONIC = 0x200 + BPF_T_MICROTIME_MONOTONIC_FAST = 0x300 + BPF_T_MONOTONIC = 0x200 + BPF_T_MONOTONIC_FAST = 0x300 + BPF_T_NANOTIME = 0x1 + BPF_T_NANOTIME_FAST = 0x101 + BPF_T_NANOTIME_MONOTONIC = 0x201 + BPF_T_NANOTIME_MONOTONIC_FAST = 0x301 + BPF_T_NONE = 0x3 + BPF_T_NORMAL = 0x0 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CREAD = 0x800 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0x18 + CTL_NET = 0x4 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CHDLC = 0x68 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DBUS = 0xe7 + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_DVB_CI = 0xeb + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HHDLC = 0x79 + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NOFCS = 0xe6 + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPFILTER = 0x74 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xf2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_ATM_CEMIC = 0xee + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FIBRECHANNEL = 0xea + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_SRX_E2E = 0xe9 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_JUNIPER_VS = 0xe8 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_PPP_WITHDIRECTION = 0xa6 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MATCHING_MAX = 0xf6 + DLT_MATCHING_MIN = 0x68 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPEG_2_TS = 0xf3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_MUX27010 = 0xec + DLT_NETANALYZER = 0xf0 + DLT_NETANALYZER_TRANSPARENT = 0xf1 + DLT_NFC_LLCP = 0xf5 + DLT_NFLOG = 0xef + DLT_NG40 = 0xf4 + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x79 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PPP_WITH_DIRECTION = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DLT_STANAG_5066_D_PDU = 0xed + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_USER0 = 0x93 + DLT_USER1 = 0x94 + DLT_USER10 = 0x9d + DLT_USER11 = 0x9e + DLT_USER12 = 0x9f + DLT_USER13 = 0xa0 + DLT_USER14 = 0xa1 + DLT_USER15 = 0xa2 + DLT_USER2 = 0x95 + DLT_USER3 = 0x96 + DLT_USER4 = 0x97 + DLT_USER5 = 0x98 + DLT_USER6 = 0x99 + DLT_USER7 = 0x9a + DLT_USER8 = 0x9b + DLT_USER9 = 0x9c + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EVFILT_AIO = -0x3 + EVFILT_FS = -0x9 + EVFILT_LIO = -0xa + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0xb + EVFILT_TIMER = -0x7 + EVFILT_USER = -0xb + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_DISPATCH = 0x80 + EV_DROP = 0x1000 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_RECEIPT = 0x40 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTATTR_NAMESPACE_EMPTY = 0x0 + EXTATTR_NAMESPACE_SYSTEM = 0x2 + EXTATTR_NAMESPACE_USER = 0x1 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_CANCEL = 0x5 + F_DUP2FD = 0xa + F_DUP2FD_CLOEXEC = 0x12 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x11 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0xb + F_GETOWN = 0x5 + F_OGETLK = 0x7 + F_OK = 0x0 + F_OSETLK = 0x8 + F_OSETLKW = 0x9 + F_RDAHEAD = 0x10 + F_RDLCK = 0x1 + F_READAHEAD = 0xf + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0xc + F_SETLKW = 0xd + F_SETLK_REMOTE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_UNLCKSYS = 0x4 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_ALTPHYS = 0x4000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x218f72 + IFF_CANTCONFIG = 0x10000 + IFF_DEBUG = 0x4 + IFF_DRV_OACTIVE = 0x400 + IFF_DRV_RUNNING = 0x40 + IFF_DYING = 0x200000 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MONITOR = 0x40000 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PPROMISC = 0x20000 + IFF_PROMISC = 0x100 + IFF_RENAMING = 0x400000 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_SMART = 0x20 + IFF_STATICARP = 0x80000 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf8 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_IPXIP = 0xf9 + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf6 + IFT_PFSYNC = 0xf7 + IFT_PLC = 0xae + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VOICEEM = 0x64 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_MASK = 0xfffffffe + IPPROTO_3PC = 0x22 + IPPROTO_ADFS = 0x44 + IPPROTO_AH = 0x33 + IPPROTO_AHIP = 0x3d + IPPROTO_APES = 0x63 + IPPROTO_ARGUS = 0xd + IPPROTO_AX25 = 0x5d + IPPROTO_BHA = 0x31 + IPPROTO_BLT = 0x1e + IPPROTO_BRSATMON = 0x4c + IPPROTO_CARP = 0x70 + IPPROTO_CFTP = 0x3e + IPPROTO_CHAOS = 0x10 + IPPROTO_CMTP = 0x26 + IPPROTO_CPHB = 0x49 + IPPROTO_CPNX = 0x48 + IPPROTO_DDP = 0x25 + IPPROTO_DGP = 0x56 + IPPROTO_DIVERT = 0x102 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_EMCON = 0xe + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GMTP = 0x64 + IPPROTO_GRE = 0x2f + IPPROTO_HELLO = 0x3f + IPPROTO_HIP = 0x8b + IPPROTO_HMP = 0x14 + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IDPR = 0x23 + IPPROTO_IDRP = 0x2d + IPPROTO_IGMP = 0x2 + IPPROTO_IGP = 0x55 + IPPROTO_IGRP = 0x58 + IPPROTO_IL = 0x28 + IPPROTO_INLSP = 0x34 + IPPROTO_INP = 0x20 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPCV = 0x47 + IPPROTO_IPEIP = 0x5e + IPPROTO_IPIP = 0x4 + IPPROTO_IPPC = 0x43 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IRTP = 0x1c + IPPROTO_KRYPTOLAN = 0x41 + IPPROTO_LARP = 0x5b + IPPROTO_LEAF1 = 0x19 + IPPROTO_LEAF2 = 0x1a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MEAS = 0x13 + IPPROTO_MH = 0x87 + IPPROTO_MHRP = 0x30 + IPPROTO_MICP = 0x5f + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_MUX = 0x12 + IPPROTO_ND = 0x4d + IPPROTO_NHRP = 0x36 + IPPROTO_NONE = 0x3b + IPPROTO_NSP = 0x1f + IPPROTO_NVPII = 0xb + IPPROTO_OLD_DIVERT = 0xfe + IPPROTO_OSPFIGP = 0x59 + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PGM = 0x71 + IPPROTO_PIGP = 0x9 + IPPROTO_PIM = 0x67 + IPPROTO_PRM = 0x15 + IPPROTO_PUP = 0xc + IPPROTO_PVP = 0x4b + IPPROTO_RAW = 0xff + IPPROTO_RCCMON = 0xa + IPPROTO_RDP = 0x1b + IPPROTO_RESERVED_253 = 0xfd + IPPROTO_RESERVED_254 = 0xfe + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_RVD = 0x42 + IPPROTO_SATEXPAK = 0x40 + IPPROTO_SATMON = 0x45 + IPPROTO_SCCSP = 0x60 + IPPROTO_SCTP = 0x84 + IPPROTO_SDRP = 0x2a + IPPROTO_SEND = 0x103 + IPPROTO_SEP = 0x21 + IPPROTO_SHIM6 = 0x8c + IPPROTO_SKIP = 0x39 + IPPROTO_SPACER = 0x7fff + IPPROTO_SRPC = 0x5a + IPPROTO_ST = 0x7 + IPPROTO_SVMTP = 0x52 + IPPROTO_SWIPE = 0x35 + IPPROTO_TCF = 0x57 + IPPROTO_TCP = 0x6 + IPPROTO_TLSP = 0x38 + IPPROTO_TP = 0x1d + IPPROTO_TPXX = 0x27 + IPPROTO_TRUNK1 = 0x17 + IPPROTO_TRUNK2 = 0x18 + IPPROTO_TTP = 0x54 + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPPROTO_VINES = 0x53 + IPPROTO_VISA = 0x46 + IPPROTO_VMTP = 0x51 + IPPROTO_WBEXPAK = 0x4f + IPPROTO_WBMON = 0x4e + IPPROTO_WSN = 0x4a + IPPROTO_XNET = 0xf + IPPROTO_XTP = 0x24 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_BINDANY = 0x40 + IPV6_BINDV6ONLY = 0x1b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_FW_ADD = 0x1e + IPV6_FW_DEL = 0x1f + IPV6_FW_FLUSH = 0x20 + IPV6_FW_GET = 0x22 + IPV6_FW_ZERO = 0x21 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXOPTHDR = 0x800 + IPV6_MAXPACKET = 0xffff + IPV6_MAX_GROUP_SRC_FILTER = 0x200 + IPV6_MAX_MEMBERSHIPS = 0xfff + IPV6_MAX_SOCK_SRC_FILTER = 0x80 + IPV6_MIN_MEMBERSHIPS = 0x1f + IPV6_MMTU = 0x500 + IPV6_MSFILTER = 0x4a + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_PREFER_TEMPADDR = 0x3f + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_ADD_SOURCE_MEMBERSHIP = 0x46 + IP_BINDANY = 0x18 + IP_BLOCK_SOURCE = 0x48 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DONTFRAG = 0x43 + IP_DROP_MEMBERSHIP = 0xd + IP_DROP_SOURCE_MEMBERSHIP = 0x47 + IP_DUMMYNET3 = 0x31 + IP_DUMMYNET_CONFIGURE = 0x3c + IP_DUMMYNET_DEL = 0x3d + IP_DUMMYNET_FLUSH = 0x3e + IP_DUMMYNET_GET = 0x40 + IP_FAITH = 0x16 + IP_FW3 = 0x30 + IP_FW_ADD = 0x32 + IP_FW_DEL = 0x33 + IP_FW_FLUSH = 0x34 + IP_FW_GET = 0x36 + IP_FW_NAT_CFG = 0x38 + IP_FW_NAT_DEL = 0x39 + IP_FW_NAT_GET_CONFIG = 0x3a + IP_FW_NAT_GET_LOG = 0x3b + IP_FW_RESETLOG = 0x37 + IP_FW_TABLE_ADD = 0x28 + IP_FW_TABLE_DEL = 0x29 + IP_FW_TABLE_FLUSH = 0x2a + IP_FW_TABLE_GETSIZE = 0x2b + IP_FW_TABLE_LIST = 0x2c + IP_FW_ZERO = 0x35 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x15 + IP_MAXPACKET = 0xffff + IP_MAX_GROUP_SRC_FILTER = 0x200 + IP_MAX_MEMBERSHIPS = 0xfff + IP_MAX_SOCK_MUTE_FILTER = 0x80 + IP_MAX_SOCK_SRC_FILTER = 0x80 + IP_MAX_SOURCE_FILTER = 0x400 + IP_MF = 0x2000 + IP_MINTTL = 0x42 + IP_MIN_MEMBERSHIPS = 0x1f + IP_MSFILTER = 0x4a + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_MULTICAST_VIF = 0xe + IP_OFFMASK = 0x1fff + IP_ONESBCAST = 0x17 + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTOS = 0x44 + IP_RECVTTL = 0x41 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RSVP_OFF = 0x10 + IP_RSVP_ON = 0xf + IP_RSVP_VIF_OFF = 0x12 + IP_RSVP_VIF_ON = 0x11 + IP_SENDSRCADDR = 0x7 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x49 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_AUTOSYNC = 0x7 + MADV_CORE = 0x9 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_NOCORE = 0x8 + MADV_NORMAL = 0x0 + MADV_NOSYNC = 0x6 + MADV_PROTECT = 0xa + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MAP_ALIGNED_SUPER = 0x1000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_ANONYMOUS = 0x1000 + MAP_COPY = 0x2 + MAP_EXCL = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_NOCORE = 0x20000 + MAP_NORESERVE = 0x40 + MAP_NOSYNC = 0x800 + MAP_PREFAULT_READ = 0x40000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_RESERVED0080 = 0x80 + MAP_RESERVED0100 = 0x100 + MAP_SHARED = 0x1 + MAP_STACK = 0x400 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_CMSG_CLOEXEC = 0x40000 + MSG_COMPAT = 0x8000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOF = 0x100 + MSG_EOR = 0x8 + MSG_NBIO = 0x4000 + MSG_NOSIGNAL = 0x20000 + MSG_NOTIFICATION = 0x2000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x0 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_IFLISTL = 0x5 + NET_RT_IFMALIST = 0x4 + NET_RT_MAXID = 0x6 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FFAND = 0x40000000 + NOTE_FFCOPY = 0xc0000000 + NOTE_FFCTRLMASK = 0xc0000000 + NOTE_FFLAGSMASK = 0xffffff + NOTE_FFNOP = 0x0 + NOTE_FFOR = 0x80000000 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRIGGER = 0x1000000 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x100000 + O_CREAT = 0x200 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x20000 + O_EXCL = 0x800 + O_EXEC = 0x40000 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_TTY_INIT = 0x80000 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x8 + RTAX_NETMASK = 0x2 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTF_BLACKHOLE = 0x1000 + RTF_BROADCAST = 0x400000 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FMASK = 0x1004d808 + RTF_GATEWAY = 0x2 + RTF_GWFLAG_COMPAT = 0x80000000 + RTF_HOST = 0x4 + RTF_LLDATA = 0x400 + RTF_LLINFO = 0x400 + RTF_LOCAL = 0x200000 + RTF_MODIFIED = 0x20 + RTF_MULTICAST = 0x800000 + RTF_PINNED = 0x100000 + RTF_PRCLONING = 0x10000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x40000 + RTF_REJECT = 0x8 + RTF_RNH_LOCKED = 0x40000000 + RTF_STATIC = 0x800 + RTF_STICKY = 0x10000000 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DELMADDR = 0x10 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x12 + RTM_IFANNOUNCE = 0x11 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_NEWMADDR = 0xf + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RTV_WEIGHT = 0x100 + RT_ALL_FIBS = -0x1 + RT_CACHING_CONTEXT = 0x1 + RT_DEFAULT_FIB = 0x0 + RT_NORTREF = 0x2 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_BINTIME = 0x4 + SCM_CREDS = 0x3 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x2 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCADDRT = 0x8030720a + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80246987 + SIOCALIFADDR = 0x8118691b + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80206932 + SIOCDELRT = 0x8030720b + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80246989 + SIOCDIFPHYADDR = 0x80206949 + SIOCDLIFADDR = 0x8118691d + SIOCGDRVSPEC = 0xc01c697b + SIOCGETSGCNT = 0xc0147210 + SIOCGETVIFCNT = 0xc014720f + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCAP = 0xc020691f + SIOCGIFCONF = 0xc0086924 + SIOCGIFDESCR = 0xc020692a + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFIB = 0xc020695c + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc024698a + SIOCGIFGROUP = 0xc0246988 + SIOCGIFINDEX = 0xc0206920 + SIOCGIFMAC = 0xc0206926 + SIOCGIFMEDIA = 0xc0286938 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc0206933 + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPHYS = 0xc0206935 + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFSTATUS = 0xc331693b + SIOCGLIFADDR = 0xc118691c + SIOCGLIFPHYADDR = 0xc118694b + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGPRIVATE_0 = 0xc0206950 + SIOCGPRIVATE_1 = 0xc0206951 + SIOCIFCREATE = 0xc020697a + SIOCIFCREATE2 = 0xc020697c + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCSDRVSPEC = 0x801c697b + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFCAP = 0x8020691e + SIOCSIFDESCR = 0x80206929 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFIB = 0x8020695d + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020693c + SIOCSIFMAC = 0x80206927 + SIOCSIFMEDIA = 0xc0206937 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x80206934 + SIOCSIFNAME = 0x80206928 + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPHYS = 0x80206936 + SIOCSIFRVNET = 0xc020695b + SIOCSIFVNET = 0xc020695a + SIOCSLIFPHYADDR = 0x8118694a + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_MAXADDRLEN = 0xff + SOCK_NONBLOCK = 0x20000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BINTIME = 0x2000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LABEL = 0x1009 + SO_LINGER = 0x80 + SO_LISTENINCQLEN = 0x1013 + SO_LISTENQLEN = 0x1012 + SO_LISTENQLIMIT = 0x1011 + SO_NOSIGPIPE = 0x800 + SO_NO_DDP = 0x8000 + SO_NO_OFFLOAD = 0x4000 + SO_OOBINLINE = 0x100 + SO_PEERLABEL = 0x1010 + SO_PROTOCOL = 0x1016 + SO_PROTOTYPE = 0x1016 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SETFIB = 0x1014 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_TIMESTAMP = 0x400 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_USER_COOKIE = 0x1015 + SO_VENDOR = 0x80000000 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_CA_NAME_MAX = 0x10 + TCP_CONGESTION = 0x40 + TCP_INFO = 0x20 + TCP_KEEPCNT = 0x400 + TCP_KEEPIDLE = 0x100 + TCP_KEEPINIT = 0x80 + TCP_KEEPINTVL = 0x200 + TCP_MAXBURST = 0x4 + TCP_MAXHLEN = 0x3c + TCP_MAXOLEN = 0x28 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x4 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCP_NOOPT = 0x8 + TCP_NOPUSH = 0x4 + TCP_VENDOR = 0x80000000 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLUSH = 0x80047410 + TIOCGDRAINWAIT = 0x40047456 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGPGRP = 0x40047477 + TIOCGPTN = 0x4004740f + TIOCGSID = 0x40047463 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGDTRWAIT = 0x4004745a + TIOCMGET = 0x4004746a + TIOCMSDTRWAIT = 0x8004745b + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DCD = 0x40 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMASTER = 0x2000741c + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDRAINWAIT = 0x80047457 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSIG = 0x2004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x20007465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCTIMESTAMP = 0x40087459 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VERASE2 = 0x7 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WCONTINUED = 0x4 + WCOREFLAG = 0x80 + WEXITED = 0x10 + WLINUXCLONE = 0x80000000 + WNOHANG = 0x1 + WNOWAIT = 0x8 + WSTOPPED = 0x2 + WTRAPPED = 0x20 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x59) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x55) + ECAPMODE = syscall.Errno(0x5e) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDOOFUS = syscall.Errno(0x58) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x56) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5a) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x57) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCAPABLE = syscall.Errno(0x5d) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTRECOVERABLE = syscall.Errno(0x5f) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x2d) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EOWNERDEAD = syscall.Errno(0x60) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x5c) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGLIBRT = syscall.Signal(0x21) + SIGLWP = syscall.Signal(0x20) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "operation timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "identifier removed", + 83: "no message of desired type", + 84: "value too large to be stored in data type", + 85: "operation canceled", + 86: "illegal byte sequence", + 87: "attribute not found", + 88: "programming error", + 89: "bad message", + 90: "multihop attempted", + 91: "link has been severed", + 92: "protocol error", + 93: "capabilities insufficient", + 94: "not permitted in capability mode", + 95: "state not recoverable", + 96: "previous owner died", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "suspended (signal)", + 18: "suspended", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", + 32: "unknown signal", + 33: "unknown signal", +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_386.go new file mode 100644 index 0000000000000000000000000000000000000000..8f920124b877cec4f34a4d9a1081dd6b346c6157 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -0,0 +1,1819 @@ +// mkerrors.sh -m32 +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build 386,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m32 _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x28 + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + EPOLL_NONBLOCK = 0x800 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xc + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0xd + F_SETLK64 = 0xd + F_SETLKW = 0xe + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_NODAD = 0x2 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x7 + IFF_802_1Q_VLAN = 0x1 + IFF_ALLMULTI = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BONDING = 0x20 + IFF_BRIDGE_PORT = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DISABLE_NETPOLL = 0x1000 + IFF_DONT_BRIDGE = 0x800 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_EBRIDGE = 0x2 + IFF_ECHO = 0x40000 + IFF_ISATAP = 0x80 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MACVLAN_PORT = 0x2000 + IFF_MASTER = 0x400 + IFF_MASTER_8023AD = 0x8 + IFF_MASTER_ALB = 0x10 + IFF_MASTER_ARPMON = 0x100 + IFF_MULTICAST = 0x1000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_OVS_DATAPATH = 0x8000 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_SLAVE_INACTIVE = 0x4 + IFF_SLAVE_NEEDARP = 0x40 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_TX_SKB_SHARING = 0x10000 + IFF_UNICAST_FLT = 0x20000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFF_WAN_HDLC = 0x200 + IFF_XMIT_DST_RELEASE = 0x400 + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IPPROTO_AH = 0x33 + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_CHECKSUM = 0x7 + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_UNICAST_HOPS = 0x10 + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BLOCK_SOURCE = 0x26 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DOFORK = 0xb + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_32BIT = 0x40 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x4000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x8000 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = 0xffffffff + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETFPXREGS = 0x12 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_MASK = 0xff + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SEIZE = 0x4206 + PTRACE_SEIZE_DEVEL = 0x80000000 + PTRACE_SETFPREGS = 0xf + PTRACE_SETFPXREGS = 0x13 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SINGLEBLOCK = 0x21 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_SYSEMU = 0x1f + PTRACE_SYSEMU_SINGLESTEP = 0x20 + PTRACE_TRACEME = 0x0 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x7 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x1 + RTAX_ADVMSS = 0x8 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0xe + RTAX_MTU = 0x2 + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x10 + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELNEIGH = 0x1d + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x4f + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWLINK = 0x10 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x10 + RTM_NR_MSGTYPES = 0x40 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_F_DEAD = 0x1 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTN_MAX = 0xb + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPNS = 0x23 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCGARP = 0x8954 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ATM = 0x108 + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_PACKET = 0x107 + SOL_RAW = 0xff + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_FILTER = 0x1a + SO_BINDTODEVICE = 0x19 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_DEBUG = 0x1 + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_MARK = 0x24 + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEERCRED = 0x11 + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CONGESTION = 0xd + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_QUICKACK = 0xc + TCP_SYNCNT = 0x7 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x100 + TUNATTACHFILTER = 0x400854d5 + TUNDETACHFILTER = 0x400854d6 + TUNGETFEATURES = 0x800454cf + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETHDRSZ = 0x800454d7 + TUNSETDEBUG = 0x400454c9 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETSNDBUF = 0x400454d4 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETHDRSZ = 0x400454d8 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMIN = 0x6 + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x20 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGUNUSED = syscall.Signal(0x1f) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "no such device or address", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource temporarily unavailable", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device or resource busy", + 17: "file exists", + 18: "invalid cross-device link", + 19: "no such device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "numerical result out of range", + 35: "resource deadlock avoided", + 36: "file name too long", + 37: "no locks available", + 38: "function not implemented", + 39: "directory not empty", + 40: "too many levels of symbolic links", + 42: "no message of desired type", + 43: "identifier removed", + 44: "channel number out of range", + 45: "level 2 not synchronized", + 46: "level 3 halted", + 47: "level 3 reset", + 48: "link number out of range", + 49: "protocol driver not attached", + 50: "no CSI structure available", + 51: "level 2 halted", + 52: "invalid exchange", + 53: "invalid request descriptor", + 54: "exchange full", + 55: "no anode", + 56: "invalid request code", + 57: "invalid slot", + 59: "bad font file format", + 60: "device not a stream", + 61: "no data available", + 62: "timer expired", + 63: "out of streams resources", + 64: "machine is not on the network", + 65: "package not installed", + 66: "object is remote", + 67: "link has been severed", + 68: "advertise error", + 69: "srmount error", + 70: "communication error on send", + 71: "protocol error", + 72: "multihop attempted", + 73: "RFS specific error", + 74: "bad message", + 75: "value too large for defined data type", + 76: "name not unique on network", + 77: "file descriptor in bad state", + 78: "remote address changed", + 79: "can not access a needed shared library", + 80: "accessing a corrupted shared library", + 81: ".lib section in a.out corrupted", + 82: "attempting to link in too many shared libraries", + 83: "cannot exec a shared library directly", + 84: "invalid or incomplete multibyte or wide character", + 85: "interrupted system call should be restarted", + 86: "streams pipe error", + 87: "too many users", + 88: "socket operation on non-socket", + 89: "destination address required", + 90: "message too long", + 91: "protocol wrong type for socket", + 92: "protocol not available", + 93: "protocol not supported", + 94: "socket type not supported", + 95: "operation not supported", + 96: "protocol family not supported", + 97: "address family not supported by protocol", + 98: "address already in use", + 99: "cannot assign requested address", + 100: "network is down", + 101: "network is unreachable", + 102: "network dropped connection on reset", + 103: "software caused connection abort", + 104: "connection reset by peer", + 105: "no buffer space available", + 106: "transport endpoint is already connected", + 107: "transport endpoint is not connected", + 108: "cannot send after transport endpoint shutdown", + 109: "too many references: cannot splice", + 110: "connection timed out", + 111: "connection refused", + 112: "host is down", + 113: "no route to host", + 114: "operation already in progress", + 115: "operation now in progress", + 116: "stale NFS file handle", + 117: "structure needs cleaning", + 118: "not a XENIX named type file", + 119: "no XENIX semaphores available", + 120: "is a named type file", + 121: "remote I/O error", + 122: "disk quota exceeded", + 123: "no medium found", + 124: "wrong medium type", + 125: "operation canceled", + 126: "required key not available", + 127: "key has expired", + 128: "key has been revoked", + 129: "key was rejected by service", + 130: "owner died", + 131: "state not recoverable", + 132: "operation not possible due to RF-kill", + 133: "unknown error 133", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "bus error", + 8: "floating point exception", + 9: "killed", + 10: "user defined signal 1", + 11: "segmentation fault", + 12: "user defined signal 2", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "stack fault", + 17: "child exited", + 18: "continued", + 19: "stopped (signal)", + 20: "stopped", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "urgent I/O condition", + 24: "CPU time limit exceeded", + 25: "file size limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window changed", + 29: "I/O possible", + 30: "power failure", + 31: "bad system call", +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..49b6c354675846c9517067597306984175682e33 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -0,0 +1,1820 @@ +// mkerrors.sh -m64 +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build amd64,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x28 + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + EPOLL_NONBLOCK = 0x800 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0x5 + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_NODAD = 0x2 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x7 + IFF_802_1Q_VLAN = 0x1 + IFF_ALLMULTI = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BONDING = 0x20 + IFF_BRIDGE_PORT = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DISABLE_NETPOLL = 0x1000 + IFF_DONT_BRIDGE = 0x800 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_EBRIDGE = 0x2 + IFF_ECHO = 0x40000 + IFF_ISATAP = 0x80 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MACVLAN_PORT = 0x2000 + IFF_MASTER = 0x400 + IFF_MASTER_8023AD = 0x8 + IFF_MASTER_ALB = 0x10 + IFF_MASTER_ARPMON = 0x100 + IFF_MULTICAST = 0x1000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_OVS_DATAPATH = 0x8000 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_SLAVE_INACTIVE = 0x4 + IFF_SLAVE_NEEDARP = 0x40 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_TX_SKB_SHARING = 0x10000 + IFF_UNICAST_FLT = 0x20000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFF_WAN_HDLC = 0x200 + IFF_XMIT_DST_RELEASE = 0x400 + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IPPROTO_AH = 0x33 + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_CHECKSUM = 0x7 + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_UNICAST_HOPS = 0x10 + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BLOCK_SOURCE = 0x26 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DOFORK = 0xb + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_32BIT = 0x40 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x4000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = -0x1 + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ARCH_PRCTL = 0x1e + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETFPXREGS = 0x12 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_MASK = 0xff + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SEIZE = 0x4206 + PTRACE_SEIZE_DEVEL = 0x80000000 + PTRACE_SETFPREGS = 0xf + PTRACE_SETFPXREGS = 0x13 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SINGLEBLOCK = 0x21 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_SYSEMU = 0x1f + PTRACE_SYSEMU_SINGLESTEP = 0x20 + PTRACE_TRACEME = 0x0 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x7 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x1 + RTAX_ADVMSS = 0x8 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0xe + RTAX_MTU = 0x2 + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x10 + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELNEIGH = 0x1d + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x4f + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWLINK = 0x10 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x10 + RTM_NR_MSGTYPES = 0x40 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_F_DEAD = 0x1 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTN_MAX = 0xb + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPNS = 0x23 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCGARP = 0x8954 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ATM = 0x108 + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_PACKET = 0x107 + SOL_RAW = 0xff + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_FILTER = 0x1a + SO_BINDTODEVICE = 0x19 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_DEBUG = 0x1 + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_MARK = 0x24 + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEERCRED = 0x11 + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CONGESTION = 0xd + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_QUICKACK = 0xc + TCP_SYNCNT = 0x7 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x100 + TUNATTACHFILTER = 0x401054d5 + TUNDETACHFILTER = 0x401054d6 + TUNGETFEATURES = 0x800454cf + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETHDRSZ = 0x800454d7 + TUNSETDEBUG = 0x400454c9 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETSNDBUF = 0x400454d4 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETHDRSZ = 0x400454d8 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMIN = 0x6 + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGUNUSED = syscall.Signal(0x1f) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "no such device or address", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource temporarily unavailable", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device or resource busy", + 17: "file exists", + 18: "invalid cross-device link", + 19: "no such device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "numerical result out of range", + 35: "resource deadlock avoided", + 36: "file name too long", + 37: "no locks available", + 38: "function not implemented", + 39: "directory not empty", + 40: "too many levels of symbolic links", + 42: "no message of desired type", + 43: "identifier removed", + 44: "channel number out of range", + 45: "level 2 not synchronized", + 46: "level 3 halted", + 47: "level 3 reset", + 48: "link number out of range", + 49: "protocol driver not attached", + 50: "no CSI structure available", + 51: "level 2 halted", + 52: "invalid exchange", + 53: "invalid request descriptor", + 54: "exchange full", + 55: "no anode", + 56: "invalid request code", + 57: "invalid slot", + 59: "bad font file format", + 60: "device not a stream", + 61: "no data available", + 62: "timer expired", + 63: "out of streams resources", + 64: "machine is not on the network", + 65: "package not installed", + 66: "object is remote", + 67: "link has been severed", + 68: "advertise error", + 69: "srmount error", + 70: "communication error on send", + 71: "protocol error", + 72: "multihop attempted", + 73: "RFS specific error", + 74: "bad message", + 75: "value too large for defined data type", + 76: "name not unique on network", + 77: "file descriptor in bad state", + 78: "remote address changed", + 79: "can not access a needed shared library", + 80: "accessing a corrupted shared library", + 81: ".lib section in a.out corrupted", + 82: "attempting to link in too many shared libraries", + 83: "cannot exec a shared library directly", + 84: "invalid or incomplete multibyte or wide character", + 85: "interrupted system call should be restarted", + 86: "streams pipe error", + 87: "too many users", + 88: "socket operation on non-socket", + 89: "destination address required", + 90: "message too long", + 91: "protocol wrong type for socket", + 92: "protocol not available", + 93: "protocol not supported", + 94: "socket type not supported", + 95: "operation not supported", + 96: "protocol family not supported", + 97: "address family not supported by protocol", + 98: "address already in use", + 99: "cannot assign requested address", + 100: "network is down", + 101: "network is unreachable", + 102: "network dropped connection on reset", + 103: "software caused connection abort", + 104: "connection reset by peer", + 105: "no buffer space available", + 106: "transport endpoint is already connected", + 107: "transport endpoint is not connected", + 108: "cannot send after transport endpoint shutdown", + 109: "too many references: cannot splice", + 110: "connection timed out", + 111: "connection refused", + 112: "host is down", + 113: "no route to host", + 114: "operation already in progress", + 115: "operation now in progress", + 116: "stale NFS file handle", + 117: "structure needs cleaning", + 118: "not a XENIX named type file", + 119: "no XENIX semaphores available", + 120: "is a named type file", + 121: "remote I/O error", + 122: "disk quota exceeded", + 123: "no medium found", + 124: "wrong medium type", + 125: "operation canceled", + 126: "required key not available", + 127: "key has expired", + 128: "key has been revoked", + 129: "key was rejected by service", + 130: "owner died", + 131: "state not recoverable", + 132: "operation not possible due to RF-kill", + 133: "unknown error 133", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "bus error", + 8: "floating point exception", + 9: "killed", + 10: "user defined signal 1", + 11: "segmentation fault", + 12: "user defined signal 2", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "stack fault", + 17: "child exited", + 18: "continued", + 19: "stopped (signal)", + 20: "stopped", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "urgent I/O condition", + 24: "CPU time limit exceeded", + 25: "file size limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window changed", + 29: "I/O possible", + 30: "power failure", + 31: "bad system call", +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go new file mode 100644 index 0000000000000000000000000000000000000000..f036758f9263ec8a387a5615be4f04956ade6cd6 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -0,0 +1,1743 @@ +// mkerrors.sh +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build arm,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x27 + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_PHY = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ELF_NGREG = 0x12 + ELF_PRARGSZ = 0x50 + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EPOLLERR = 0x8 + EPOLLET = -0x80000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + EPOLL_NONBLOCK = 0x800 + ETH_P_1588 = 0x88f7 + ETH_P_8021Q = 0x8100 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_AARP = 0x80f3 + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xc + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0xd + F_SETLK64 = 0xd + F_SETLKW = 0xe + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_NODAD = 0x2 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x7 + IFF_ALLMULTI = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DYNAMIC = 0x8000 + IFF_LOOPBACK = 0x8 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IPPROTO_AH = 0x33 + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_CHECKSUM = 0x7 + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_UNICAST_HOPS = 0x10 + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BLOCK_SOURCE = 0x26 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DOFORK = 0xb + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CONNECTOR = 0xb + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x1000 + O_LARGEFILE = 0x20000 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x1000 + O_SYNC = 0x1000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_BROADCAST = 0x1 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FASTROUTE = 0x6 + PACKET_HOST = 0x0 + PACKET_LOOPBACK = 0x5 + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MULTICAST = 0x2 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PARENB = 0x100 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CLEAR_SECCOMP_FILTER = 0x25 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECCOMP_FILTER = 0x23 + PR_GET_SECUREBITS = 0x1b + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_SECCOMP_FILTER_EVENT = 0x1 + PR_SECCOMP_FILTER_SYSCALL = 0x0 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_KEEPCAPS = 0x8 + PR_SET_NAME = 0xf + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_SECCOMP = 0x16 + PR_SET_SECCOMP_FILTER = 0x24 + PR_SET_SECUREBITS = 0x1c + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETCRUNCHREGS = 0x19 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETHBPREGS = 0x1d + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETVFPREGS = 0x1b + PTRACE_GETWMMXREGS = 0x12 + PTRACE_GET_THREAD_AREA = 0x16 + PTRACE_KILL = 0x8 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_MASK = 0x7f + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SETCRUNCHREGS = 0x1a + PTRACE_SETFPREGS = 0xf + PTRACE_SETHBPREGS = 0x1e + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETVFPREGS = 0x1c + PTRACE_SETWMMXREGS = 0x13 + PTRACE_SET_SYSCALL = 0x17 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + PT_DATA_ADDR = 0x10004 + PT_TEXT_ADDR = 0x10000 + PT_TEXT_END_ADDR = 0x10008 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x7 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x1 + RTAX_ADVMSS = 0x8 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0xe + RTAX_MTU = 0x2 + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x10 + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELNEIGH = 0x1d + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x4f + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWLINK = 0x10 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x10 + RTM_NR_MSGTYPES = 0x40 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_F_DEAD = 0x1 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTN_MAX = 0xb + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPNS = 0x23 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCGARP = 0x8954 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ATM = 0x108 + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_PACKET = 0x107 + SOL_RAW = 0xff + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_FILTER = 0x1a + SO_BINDTODEVICE = 0x19 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_DEBUG = 0x1 + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_MARK = 0x24 + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEERCRED = 0x11 + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CONGESTION = 0xd + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_QUICKACK = 0xc + TCP_SYNCNT = 0x7 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x100 + TUNATTACHFILTER = 0x400854d5 + TUNDETACHFILTER = 0x400854d6 + TUNGETFEATURES = 0x800454cf + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETHDRSZ = 0x800454d7 + TUNSETDEBUG = 0x400454c9 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETSNDBUF = 0x400454d4 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETHDRSZ = 0x400454d8 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMIN = 0x6 + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x20 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGUNUSED = syscall.Signal(0x1f) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "no such device or address", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource temporarily unavailable", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device or resource busy", + 17: "file exists", + 18: "invalid cross-device link", + 19: "no such device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "numerical result out of range", + 35: "resource deadlock avoided", + 36: "file name too long", + 37: "no locks available", + 38: "function not implemented", + 39: "directory not empty", + 40: "too many levels of symbolic links", + 42: "no message of desired type", + 43: "identifier removed", + 44: "channel number out of range", + 45: "level 2 not synchronized", + 46: "level 3 halted", + 47: "level 3 reset", + 48: "link number out of range", + 49: "protocol driver not attached", + 50: "no CSI structure available", + 51: "level 2 halted", + 52: "invalid exchange", + 53: "invalid request descriptor", + 54: "exchange full", + 55: "no anode", + 56: "invalid request code", + 57: "invalid slot", + 59: "bad font file format", + 60: "device not a stream", + 61: "no data available", + 62: "timer expired", + 63: "out of streams resources", + 64: "machine is not on the network", + 65: "package not installed", + 66: "object is remote", + 67: "link has been severed", + 68: "advertise error", + 69: "srmount error", + 70: "communication error on send", + 71: "protocol error", + 72: "multihop attempted", + 73: "RFS specific error", + 74: "bad message", + 75: "value too large for defined data type", + 76: "name not unique on network", + 77: "file descriptor in bad state", + 78: "remote address changed", + 79: "can not access a needed shared library", + 80: "accessing a corrupted shared library", + 81: ".lib section in a.out corrupted", + 82: "attempting to link in too many shared libraries", + 83: "cannot exec a shared library directly", + 84: "invalid or incomplete multibyte or wide character", + 85: "interrupted system call should be restarted", + 86: "streams pipe error", + 87: "too many users", + 88: "socket operation on non-socket", + 89: "destination address required", + 90: "message too long", + 91: "protocol wrong type for socket", + 92: "protocol not available", + 93: "protocol not supported", + 94: "socket type not supported", + 95: "operation not supported", + 96: "protocol family not supported", + 97: "address family not supported by protocol", + 98: "address already in use", + 99: "cannot assign requested address", + 100: "network is down", + 101: "network is unreachable", + 102: "network dropped connection on reset", + 103: "software caused connection abort", + 104: "connection reset by peer", + 105: "no buffer space available", + 106: "transport endpoint is already connected", + 107: "transport endpoint is not connected", + 108: "cannot send after transport endpoint shutdown", + 109: "too many references: cannot splice", + 110: "connection timed out", + 111: "connection refused", + 112: "host is down", + 113: "no route to host", + 114: "operation already in progress", + 115: "operation now in progress", + 116: "stale NFS file handle", + 117: "structure needs cleaning", + 118: "not a XENIX named type file", + 119: "no XENIX semaphores available", + 120: "is a named type file", + 121: "remote I/O error", + 122: "disk quota exceeded", + 123: "no medium found", + 124: "wrong medium type", + 125: "operation canceled", + 126: "required key not available", + 127: "key has expired", + 128: "key has been revoked", + 129: "key was rejected by service", + 130: "owner died", + 131: "state not recoverable", + 132: "operation not possible due to RF-kill", + 133: "unknown error 133", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "bus error", + 8: "floating point exception", + 9: "killed", + 10: "user defined signal 1", + 11: "segmentation fault", + 12: "user defined signal 2", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "stack fault", + 17: "child exited", + 18: "continued", + 19: "stopped (signal)", + 20: "stopped", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "urgent I/O condition", + 24: "CPU time limit exceeded", + 25: "file size limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window changed", + 29: "I/O possible", + 30: "power failure", + 31: "bad system call", +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go new file mode 100644 index 0000000000000000000000000000000000000000..16dcbc9cb2155c54824caaca6cd3330cafd04878 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -0,0 +1,1897 @@ +// mkerrors.sh +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build arm64,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x29 + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ELF_NGREG = 0x22 + ELF_PRARGSZ = 0x50 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0x5 + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_NODAD = 0x2 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x7 + IFF_802_1Q_VLAN = 0x1 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BONDING = 0x20 + IFF_BRIDGE_PORT = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DISABLE_NETPOLL = 0x1000 + IFF_DONT_BRIDGE = 0x800 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_EBRIDGE = 0x2 + IFF_ECHO = 0x40000 + IFF_ISATAP = 0x80 + IFF_LIVE_ADDR_CHANGE = 0x100000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MACVLAN = 0x200000 + IFF_MACVLAN_PORT = 0x2000 + IFF_MASTER = 0x400 + IFF_MASTER_8023AD = 0x8 + IFF_MASTER_ALB = 0x10 + IFF_MASTER_ARPMON = 0x100 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_OVS_DATAPATH = 0x8000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_SLAVE_INACTIVE = 0x4 + IFF_SLAVE_NEEDARP = 0x40 + IFF_SUPP_NOFCS = 0x80000 + IFF_TAP = 0x2 + IFF_TEAM_PORT = 0x40000 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_TX_SKB_SHARING = 0x10000 + IFF_UNICAST_FLT = 0x20000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFF_WAN_HDLC = 0x200 + IFF_XMIT_DST_RELEASE = 0x400 + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_CHECKSUM = 0x7 + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_UNICAST_HOPS = 0x10 + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BLOCK_SOURCE = 0x26 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x10000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = -0x1 + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x1000ff + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SEIZE = 0x4206 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x7 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x1 + RTAX_ADVMSS = 0x8 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0xf + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x11 + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x57 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x12 + RTM_NR_MSGTYPES = 0x48 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_F_DEAD = 0x1 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTN_MAX = 0xb + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCGARP = 0x8954 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ATM = 0x108 + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_PACKET = 0x107 + SOL_RAW = 0xff + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_FILTER = 0x1a + SO_BINDTODEVICE = 0x19 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_DEBUG = 0x1 + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_WIFI_STATUS = 0x29 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x100 + TUNATTACHFILTER = 0x401054d5 + TUNDETACHFILTER = 0x401054d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x801054db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETHDRSZ = 0x800454d7 + TUNSETDEBUG = 0x400454c9 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETHDRSZ = 0x400454d8 + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMIN = 0x6 + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGUNUSED = syscall.Signal(0x1f) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "no such device or address", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource temporarily unavailable", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device or resource busy", + 17: "file exists", + 18: "invalid cross-device link", + 19: "no such device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "numerical result out of range", + 35: "resource deadlock avoided", + 36: "file name too long", + 37: "no locks available", + 38: "function not implemented", + 39: "directory not empty", + 40: "too many levels of symbolic links", + 42: "no message of desired type", + 43: "identifier removed", + 44: "channel number out of range", + 45: "level 2 not synchronized", + 46: "level 3 halted", + 47: "level 3 reset", + 48: "link number out of range", + 49: "protocol driver not attached", + 50: "no CSI structure available", + 51: "level 2 halted", + 52: "invalid exchange", + 53: "invalid request descriptor", + 54: "exchange full", + 55: "no anode", + 56: "invalid request code", + 57: "invalid slot", + 59: "bad font file format", + 60: "device not a stream", + 61: "no data available", + 62: "timer expired", + 63: "out of streams resources", + 64: "machine is not on the network", + 65: "package not installed", + 66: "object is remote", + 67: "link has been severed", + 68: "advertise error", + 69: "srmount error", + 70: "communication error on send", + 71: "protocol error", + 72: "multihop attempted", + 73: "RFS specific error", + 74: "bad message", + 75: "value too large for defined data type", + 76: "name not unique on network", + 77: "file descriptor in bad state", + 78: "remote address changed", + 79: "can not access a needed shared library", + 80: "accessing a corrupted shared library", + 81: ".lib section in a.out corrupted", + 82: "attempting to link in too many shared libraries", + 83: "cannot exec a shared library directly", + 84: "invalid or incomplete multibyte or wide character", + 85: "interrupted system call should be restarted", + 86: "streams pipe error", + 87: "too many users", + 88: "socket operation on non-socket", + 89: "destination address required", + 90: "message too long", + 91: "protocol wrong type for socket", + 92: "protocol not available", + 93: "protocol not supported", + 94: "socket type not supported", + 95: "operation not supported", + 96: "protocol family not supported", + 97: "address family not supported by protocol", + 98: "address already in use", + 99: "cannot assign requested address", + 100: "network is down", + 101: "network is unreachable", + 102: "network dropped connection on reset", + 103: "software caused connection abort", + 104: "connection reset by peer", + 105: "no buffer space available", + 106: "transport endpoint is already connected", + 107: "transport endpoint is not connected", + 108: "cannot send after transport endpoint shutdown", + 109: "too many references: cannot splice", + 110: "connection timed out", + 111: "connection refused", + 112: "host is down", + 113: "no route to host", + 114: "operation already in progress", + 115: "operation now in progress", + 116: "stale file handle", + 117: "structure needs cleaning", + 118: "not a XENIX named type file", + 119: "no XENIX semaphores available", + 120: "is a named type file", + 121: "remote I/O error", + 122: "disk quota exceeded", + 123: "no medium found", + 124: "wrong medium type", + 125: "operation canceled", + 126: "required key not available", + 127: "key has expired", + 128: "key has been revoked", + 129: "key was rejected by service", + 130: "owner died", + 131: "state not recoverable", + 132: "operation not possible due to RF-kill", + 133: "memory page has hardware error", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "bus error", + 8: "floating point exception", + 9: "killed", + 10: "user defined signal 1", + 11: "segmentation fault", + 12: "user defined signal 2", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "stack fault", + 17: "child exited", + 18: "continued", + 19: "stopped (signal)", + 20: "stopped", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "urgent I/O condition", + 24: "CPU time limit exceeded", + 25: "file size limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window changed", + 29: "I/O possible", + 30: "power failure", + 31: "bad system call", +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go new file mode 100644 index 0000000000000000000000000000000000000000..36535b242d2872907b54a93a87dc8a6f4e3613d9 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -0,0 +1,1917 @@ +// mkerrors.sh +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build mips64,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x29 + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CREAD = 0x80 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x2000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xe + F_GETLK64 = 0xe + F_GETOWN = 0x17 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x18 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + HUPCL = 0x400 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x100 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x80 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_UNICAST_HOPS = 0x10 + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x800 + MAP_ANONYMOUS = 0x800 + MAP_DENYWRITE = 0x2000 + MAP_EXECUTABLE = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x1000 + MAP_HUGETLB = 0x80000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x8000 + MAP_NONBLOCK = 0x20000 + MAP_NORESERVE = 0x400 + MAP_POPULATE = 0x10000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x800 + MAP_SHARED = 0x1 + MAP_STACK = 0x40000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x1000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x100 + O_DIRECT = 0x8000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x10 + O_EXCL = 0x400 + O_FSYNC = 0x4010 + O_LARGEFILE = 0x0 + O_NDELAY = 0x80 + O_NOATIME = 0x40000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x80 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x4010 + O_SYNC = 0x4010 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = -0x1 + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_GET_THREAD_AREA_3264 = 0xc4 + PTRACE_GET_WATCH_REGS = 0xd0 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_3264 = 0xc1 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_3264 = 0xc0 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_3264 = 0xc3 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_3264 = 0xc2 + PTRACE_POKEUSR = 0x6 + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SET_WATCH_REGS = 0xd1 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x1 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x16 + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x5b + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x13 + RTM_NR_MSGTYPES = 0x4c + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x11 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x40047307 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCGARP = 0x8954 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGPGRP = 0x40047309 + SIOCGRARP = 0x8961 + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSPGRP = 0x80047308 + SIOCSRARP = 0x8962 + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x1 + SOCK_NONBLOCK = 0x80 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x2 + SOL_AAL = 0x109 + SOL_ATM = 0x108 + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_PACKET = 0x107 + SOL_RAW = 0xff + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1009 + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x11 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x12 + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x1f + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STYLE = 0x1008 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x1008 + SO_WIFI_STATUS = 0x29 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TCFLSH = 0x5407 + TCIFLUSH = 0x0 + TCIOFLUSH = 0x2 + TCOFLUSH = 0x1 + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCXONC = 0x5406 + TIOCCBRK = 0x5428 + TIOCCONS = 0x80047478 + TIOCEXCL = 0x740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x5492 + TIOCGLCKTRMIOS = 0x548b + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGRS485 = 0x4020542e + TIOCGSERIAL = 0x5484 + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5481 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x467f + TIOCLINUX = 0x5483 + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMIWAIT = 0x5491 + TIOCMSET = 0x741a + TIOCM_CAR = 0x100 + TIOCM_CD = 0x100 + TIOCM_CTS = 0x40 + TIOCM_DSR = 0x400 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x200 + TIOCM_RNG = 0x200 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x20 + TIOCM_ST = 0x10 + TIOCNOTTY = 0x5471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7472 + TIOCPKT = 0x5470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x5480 + TIOCSERCONFIG = 0x5488 + TIOCSERGETLSR = 0x548e + TIOCSERGETMULTI = 0x548f + TIOCSERGSTRUCT = 0x548d + TIOCSERGWILD = 0x5489 + TIOCSERSETMULTI = 0x5490 + TIOCSERSWILD = 0x548a + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x548c + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0xc020542f + TIOCSSERIAL = 0x5485 + TIOCSSOFTCAR = 0x5482 + TIOCSTI = 0x5472 + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x8000 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + VDISCARD = 0xd + VEOF = 0x10 + VEOL = 0x11 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMIN = 0x4 + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x7d) + EADDRNOTAVAIL = syscall.Errno(0x7e) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x7c) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x95) + EBADE = syscall.Errno(0x32) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x51) + EBADMSG = syscall.Errno(0x4d) + EBADR = syscall.Errno(0x33) + EBADRQC = syscall.Errno(0x36) + EBADSLT = syscall.Errno(0x37) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x9e) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x25) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x82) + ECONNREFUSED = syscall.Errno(0x92) + ECONNRESET = syscall.Errno(0x83) + EDEADLK = syscall.Errno(0x2d) + EDEADLOCK = syscall.Errno(0x38) + EDESTADDRREQ = syscall.Errno(0x60) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x46d) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x93) + EHOSTUNREACH = syscall.Errno(0x94) + EHWPOISON = syscall.Errno(0xa8) + EIDRM = syscall.Errno(0x24) + EILSEQ = syscall.Errno(0x58) + EINIT = syscall.Errno(0x8d) + EINPROGRESS = syscall.Errno(0x96) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x85) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x8b) + EKEYEXPIRED = syscall.Errno(0xa2) + EKEYREJECTED = syscall.Errno(0xa4) + EKEYREVOKED = syscall.Errno(0xa3) + EL2HLT = syscall.Errno(0x2c) + EL2NSYNC = syscall.Errno(0x26) + EL3HLT = syscall.Errno(0x27) + EL3RST = syscall.Errno(0x28) + ELIBACC = syscall.Errno(0x53) + ELIBBAD = syscall.Errno(0x54) + ELIBEXEC = syscall.Errno(0x57) + ELIBMAX = syscall.Errno(0x56) + ELIBSCN = syscall.Errno(0x55) + ELNRNG = syscall.Errno(0x29) + ELOOP = syscall.Errno(0x5a) + EMEDIUMTYPE = syscall.Errno(0xa0) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x61) + EMULTIHOP = syscall.Errno(0x4a) + ENAMETOOLONG = syscall.Errno(0x4e) + ENAVAIL = syscall.Errno(0x8a) + ENETDOWN = syscall.Errno(0x7f) + ENETRESET = syscall.Errno(0x81) + ENETUNREACH = syscall.Errno(0x80) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x35) + ENOBUFS = syscall.Errno(0x84) + ENOCSI = syscall.Errno(0x2b) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0xa1) + ENOLCK = syscall.Errno(0x2e) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x9f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x23) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x63) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x59) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x86) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x5d) + ENOTNAM = syscall.Errno(0x89) + ENOTRECOVERABLE = syscall.Errno(0xa6) + ENOTSOCK = syscall.Errno(0x5f) + ENOTSUP = syscall.Errno(0x7a) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x50) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x7a) + EOVERFLOW = syscall.Errno(0x4f) + EOWNERDEAD = syscall.Errno(0xa5) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x7b) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x78) + EPROTOTYPE = syscall.Errno(0x62) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x52) + EREMDEV = syscall.Errno(0x8e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x8c) + ERESTART = syscall.Errno(0x5b) + ERFKILL = syscall.Errno(0xa7) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x8f) + ESOCKTNOSUPPORT = syscall.Errno(0x79) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x97) + ESTRPIPE = syscall.Errno(0x5c) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x91) + ETOOMANYREFS = syscall.Errno(0x90) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x87) + EUNATCH = syscall.Errno(0x2a) + EUSERS = syscall.Errno(0x5e) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x34) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x12) + SIGCLD = syscall.Signal(0x12) + SIGCONT = syscall.Signal(0x19) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x16) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x16) + SIGPROF = syscall.Signal(0x1d) + SIGPWR = syscall.Signal(0x13) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x17) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x18) + SIGTTIN = syscall.Signal(0x1a) + SIGTTOU = syscall.Signal(0x1b) + SIGURG = syscall.Signal(0x15) + SIGUSR1 = syscall.Signal(0x10) + SIGUSR2 = syscall.Signal(0x11) + SIGVTALRM = syscall.Signal(0x1c) + SIGWINCH = syscall.Signal(0x14) + SIGXCPU = syscall.Signal(0x1e) + SIGXFSZ = syscall.Signal(0x1f) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "no such device or address", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource temporarily unavailable", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device or resource busy", + 17: "file exists", + 18: "invalid cross-device link", + 19: "no such device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "numerical result out of range", + 35: "no message of desired type", + 36: "identifier removed", + 37: "channel number out of range", + 38: "level 2 not synchronized", + 39: "level 3 halted", + 40: "level 3 reset", + 41: "link number out of range", + 42: "protocol driver not attached", + 43: "no CSI structure available", + 44: "level 2 halted", + 45: "resource deadlock avoided", + 46: "no locks available", + 50: "invalid exchange", + 51: "invalid request descriptor", + 52: "exchange full", + 53: "no anode", + 54: "invalid request code", + 55: "invalid slot", + 56: "file locking deadlock error", + 59: "bad font file format", + 60: "device not a stream", + 61: "no data available", + 62: "timer expired", + 63: "out of streams resources", + 64: "machine is not on the network", + 65: "package not installed", + 66: "object is remote", + 67: "link has been severed", + 68: "advertise error", + 69: "srmount error", + 70: "communication error on send", + 71: "protocol error", + 73: "RFS specific error", + 74: "multihop attempted", + 77: "bad message", + 78: "file name too long", + 79: "value too large for defined data type", + 80: "name not unique on network", + 81: "file descriptor in bad state", + 82: "remote address changed", + 83: "can not access a needed shared library", + 84: "accessing a corrupted shared library", + 85: ".lib section in a.out corrupted", + 86: "attempting to link in too many shared libraries", + 87: "cannot exec a shared library directly", + 88: "invalid or incomplete multibyte or wide character", + 89: "function not implemented", + 90: "too many levels of symbolic links", + 91: "interrupted system call should be restarted", + 92: "streams pipe error", + 93: "directory not empty", + 94: "too many users", + 95: "socket operation on non-socket", + 96: "destination address required", + 97: "message too long", + 98: "protocol wrong type for socket", + 99: "protocol not available", + 120: "protocol not supported", + 121: "socket type not supported", + 122: "operation not supported", + 123: "protocol family not supported", + 124: "address family not supported by protocol", + 125: "address already in use", + 126: "cannot assign requested address", + 127: "network is down", + 128: "network is unreachable", + 129: "network dropped connection on reset", + 130: "software caused connection abort", + 131: "connection reset by peer", + 132: "no buffer space available", + 133: "transport endpoint is already connected", + 134: "transport endpoint is not connected", + 135: "structure needs cleaning", + 137: "not a XENIX named type file", + 138: "no XENIX semaphores available", + 139: "is a named type file", + 140: "remote I/O error", + 141: "unknown error 141", + 142: "unknown error 142", + 143: "cannot send after transport endpoint shutdown", + 144: "too many references: cannot splice", + 145: "connection timed out", + 146: "connection refused", + 147: "host is down", + 148: "no route to host", + 149: "operation already in progress", + 150: "operation now in progress", + 151: "stale file handle", + 158: "operation canceled", + 159: "no medium found", + 160: "wrong medium type", + 161: "required key not available", + 162: "key has expired", + 163: "key has been revoked", + 164: "key was rejected by service", + 165: "owner died", + 166: "state not recoverable", + 167: "operation not possible due to RF-kill", + 168: "memory page has hardware error", + 1133: "disk quota exceeded", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "user defined signal 1", + 17: "user defined signal 2", + 18: "child exited", + 19: "power failure", + 20: "window changed", + 21: "urgent I/O condition", + 22: "I/O possible", + 23: "stopped (signal)", + 24: "stopped", + 25: "continued", + 26: "stopped (tty input)", + 27: "stopped (tty output)", + 28: "virtual timer expired", + 29: "profiling timer expired", + 30: "CPU time limit exceeded", + 31: "file size limit exceeded", +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go new file mode 100644 index 0000000000000000000000000000000000000000..112f05de56e985d32407578c65f743e5c3f622d6 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -0,0 +1,1917 @@ +// mkerrors.sh +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build mips64le,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x29 + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CREAD = 0x80 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x2000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0xe + F_GETLK64 = 0xe + F_GETOWN = 0x17 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x18 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + HUPCL = 0x400 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x100 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x80 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_UNICAST_HOPS = 0x10 + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x800 + MAP_ANONYMOUS = 0x800 + MAP_DENYWRITE = 0x2000 + MAP_EXECUTABLE = 0x4000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x1000 + MAP_HUGETLB = 0x80000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x8000 + MAP_NONBLOCK = 0x20000 + MAP_NORESERVE = 0x400 + MAP_POPULATE = 0x10000 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x800 + MAP_SHARED = 0x1 + MAP_STACK = 0x40000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x1000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x100 + O_DIRECT = 0x8000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x10 + O_EXCL = 0x400 + O_FSYNC = 0x4010 + O_LARGEFILE = 0x0 + O_NDELAY = 0x80 + O_NOATIME = 0x40000 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x80 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x4010 + O_SYNC = 0x4010 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = -0x1 + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_THREAD_AREA = 0x19 + PTRACE_GET_THREAD_AREA_3264 = 0xc4 + PTRACE_GET_WATCH_REGS = 0xd0 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_3264 = 0xc1 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_3264 = 0xc0 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_3264 = 0xc3 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_3264 = 0xc2 + PTRACE_POKEUSR = 0x6 + PTRACE_SEIZE = 0x4206 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_THREAD_AREA = 0x1a + PTRACE_SET_WATCH_REGS = 0xd1 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x1 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x16 + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x5b + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x13 + RTM_NR_MSGTYPES = 0x4c + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x11 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x40047307 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCGARP = 0x8954 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGPGRP = 0x40047309 + SIOCGRARP = 0x8961 + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSPGRP = 0x80047308 + SIOCSRARP = 0x8962 + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x1 + SOCK_NONBLOCK = 0x80 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x2 + SOL_AAL = 0x109 + SOL_ATM = 0x108 + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_PACKET = 0x107 + SOL_RAW = 0xff + SOL_SOCKET = 0xffff + SOL_TCP = 0x6 + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1009 + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x20 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x1029 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0x100 + SO_PASSCRED = 0x11 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x12 + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1e + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x1028 + SO_RCVBUF = 0x1002 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x1001 + SO_SNDBUFFORCE = 0x1f + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STYLE = 0x1008 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x1008 + SO_WIFI_STATUS = 0x29 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TCFLSH = 0x5407 + TCIFLUSH = 0x0 + TCIOFLUSH = 0x2 + TCOFLUSH = 0x1 + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCXONC = 0x5406 + TIOCCBRK = 0x5428 + TIOCCONS = 0x80047478 + TIOCEXCL = 0x740d + TIOCGDEV = 0x40045432 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x5492 + TIOCGLCKTRMIOS = 0x548b + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGRS485 = 0x4020542e + TIOCGSERIAL = 0x5484 + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5481 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x467f + TIOCLINUX = 0x5483 + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMIWAIT = 0x5491 + TIOCMSET = 0x741a + TIOCM_CAR = 0x100 + TIOCM_CD = 0x100 + TIOCM_CTS = 0x40 + TIOCM_DSR = 0x400 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x200 + TIOCM_RNG = 0x200 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x20 + TIOCM_ST = 0x10 + TIOCNOTTY = 0x5471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7472 + TIOCPKT = 0x5470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x5480 + TIOCSERCONFIG = 0x5488 + TIOCSERGETLSR = 0x548e + TIOCSERGETMULTI = 0x548f + TIOCSERGSTRUCT = 0x548d + TIOCSERGWILD = 0x5489 + TIOCSERSETMULTI = 0x5490 + TIOCSERSWILD = 0x548a + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x548c + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0xc020542f + TIOCSSERIAL = 0x5485 + TIOCSSOFTCAR = 0x5482 + TIOCSTI = 0x5472 + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x8000 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETBE = 0x400454df + TUNGETVNETHDRSZ = 0x400454d7 + TUNGETVNETLE = 0x400454dd + TUNSETDEBUG = 0x800454c9 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETBE = 0x800454de + TUNSETVNETHDRSZ = 0x800454d8 + TUNSETVNETLE = 0x800454dc + VDISCARD = 0xd + VEOF = 0x10 + VEOL = 0x11 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMIN = 0x4 + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x7d) + EADDRNOTAVAIL = syscall.Errno(0x7e) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x7c) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x95) + EBADE = syscall.Errno(0x32) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x51) + EBADMSG = syscall.Errno(0x4d) + EBADR = syscall.Errno(0x33) + EBADRQC = syscall.Errno(0x36) + EBADSLT = syscall.Errno(0x37) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x9e) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x25) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x82) + ECONNREFUSED = syscall.Errno(0x92) + ECONNRESET = syscall.Errno(0x83) + EDEADLK = syscall.Errno(0x2d) + EDEADLOCK = syscall.Errno(0x38) + EDESTADDRREQ = syscall.Errno(0x60) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x46d) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x93) + EHOSTUNREACH = syscall.Errno(0x94) + EHWPOISON = syscall.Errno(0xa8) + EIDRM = syscall.Errno(0x24) + EILSEQ = syscall.Errno(0x58) + EINIT = syscall.Errno(0x8d) + EINPROGRESS = syscall.Errno(0x96) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x85) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x8b) + EKEYEXPIRED = syscall.Errno(0xa2) + EKEYREJECTED = syscall.Errno(0xa4) + EKEYREVOKED = syscall.Errno(0xa3) + EL2HLT = syscall.Errno(0x2c) + EL2NSYNC = syscall.Errno(0x26) + EL3HLT = syscall.Errno(0x27) + EL3RST = syscall.Errno(0x28) + ELIBACC = syscall.Errno(0x53) + ELIBBAD = syscall.Errno(0x54) + ELIBEXEC = syscall.Errno(0x57) + ELIBMAX = syscall.Errno(0x56) + ELIBSCN = syscall.Errno(0x55) + ELNRNG = syscall.Errno(0x29) + ELOOP = syscall.Errno(0x5a) + EMEDIUMTYPE = syscall.Errno(0xa0) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x61) + EMULTIHOP = syscall.Errno(0x4a) + ENAMETOOLONG = syscall.Errno(0x4e) + ENAVAIL = syscall.Errno(0x8a) + ENETDOWN = syscall.Errno(0x7f) + ENETRESET = syscall.Errno(0x81) + ENETUNREACH = syscall.Errno(0x80) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x35) + ENOBUFS = syscall.Errno(0x84) + ENOCSI = syscall.Errno(0x2b) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0xa1) + ENOLCK = syscall.Errno(0x2e) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x9f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x23) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x63) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x59) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x86) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x5d) + ENOTNAM = syscall.Errno(0x89) + ENOTRECOVERABLE = syscall.Errno(0xa6) + ENOTSOCK = syscall.Errno(0x5f) + ENOTSUP = syscall.Errno(0x7a) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x50) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x7a) + EOVERFLOW = syscall.Errno(0x4f) + EOWNERDEAD = syscall.Errno(0xa5) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x7b) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x78) + EPROTOTYPE = syscall.Errno(0x62) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x52) + EREMDEV = syscall.Errno(0x8e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x8c) + ERESTART = syscall.Errno(0x5b) + ERFKILL = syscall.Errno(0xa7) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x8f) + ESOCKTNOSUPPORT = syscall.Errno(0x79) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x97) + ESTRPIPE = syscall.Errno(0x5c) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x91) + ETOOMANYREFS = syscall.Errno(0x90) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x87) + EUNATCH = syscall.Errno(0x2a) + EUSERS = syscall.Errno(0x5e) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x34) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x12) + SIGCLD = syscall.Signal(0x12) + SIGCONT = syscall.Signal(0x19) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x16) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x16) + SIGPROF = syscall.Signal(0x1d) + SIGPWR = syscall.Signal(0x13) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x17) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x18) + SIGTTIN = syscall.Signal(0x1a) + SIGTTOU = syscall.Signal(0x1b) + SIGURG = syscall.Signal(0x15) + SIGUSR1 = syscall.Signal(0x10) + SIGUSR2 = syscall.Signal(0x11) + SIGVTALRM = syscall.Signal(0x1c) + SIGWINCH = syscall.Signal(0x14) + SIGXCPU = syscall.Signal(0x1e) + SIGXFSZ = syscall.Signal(0x1f) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "no such device or address", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource temporarily unavailable", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device or resource busy", + 17: "file exists", + 18: "invalid cross-device link", + 19: "no such device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "numerical result out of range", + 35: "no message of desired type", + 36: "identifier removed", + 37: "channel number out of range", + 38: "level 2 not synchronized", + 39: "level 3 halted", + 40: "level 3 reset", + 41: "link number out of range", + 42: "protocol driver not attached", + 43: "no CSI structure available", + 44: "level 2 halted", + 45: "resource deadlock avoided", + 46: "no locks available", + 50: "invalid exchange", + 51: "invalid request descriptor", + 52: "exchange full", + 53: "no anode", + 54: "invalid request code", + 55: "invalid slot", + 56: "file locking deadlock error", + 59: "bad font file format", + 60: "device not a stream", + 61: "no data available", + 62: "timer expired", + 63: "out of streams resources", + 64: "machine is not on the network", + 65: "package not installed", + 66: "object is remote", + 67: "link has been severed", + 68: "advertise error", + 69: "srmount error", + 70: "communication error on send", + 71: "protocol error", + 73: "RFS specific error", + 74: "multihop attempted", + 77: "bad message", + 78: "file name too long", + 79: "value too large for defined data type", + 80: "name not unique on network", + 81: "file descriptor in bad state", + 82: "remote address changed", + 83: "can not access a needed shared library", + 84: "accessing a corrupted shared library", + 85: ".lib section in a.out corrupted", + 86: "attempting to link in too many shared libraries", + 87: "cannot exec a shared library directly", + 88: "invalid or incomplete multibyte or wide character", + 89: "function not implemented", + 90: "too many levels of symbolic links", + 91: "interrupted system call should be restarted", + 92: "streams pipe error", + 93: "directory not empty", + 94: "too many users", + 95: "socket operation on non-socket", + 96: "destination address required", + 97: "message too long", + 98: "protocol wrong type for socket", + 99: "protocol not available", + 120: "protocol not supported", + 121: "socket type not supported", + 122: "operation not supported", + 123: "protocol family not supported", + 124: "address family not supported by protocol", + 125: "address already in use", + 126: "cannot assign requested address", + 127: "network is down", + 128: "network is unreachable", + 129: "network dropped connection on reset", + 130: "software caused connection abort", + 131: "connection reset by peer", + 132: "no buffer space available", + 133: "transport endpoint is already connected", + 134: "transport endpoint is not connected", + 135: "structure needs cleaning", + 137: "not a XENIX named type file", + 138: "no XENIX semaphores available", + 139: "is a named type file", + 140: "remote I/O error", + 141: "unknown error 141", + 142: "unknown error 142", + 143: "cannot send after transport endpoint shutdown", + 144: "too many references: cannot splice", + 145: "connection timed out", + 146: "connection refused", + 147: "host is down", + 148: "no route to host", + 149: "operation already in progress", + 150: "operation now in progress", + 151: "stale file handle", + 158: "operation canceled", + 159: "no medium found", + 160: "wrong medium type", + 161: "required key not available", + 162: "key has expired", + 163: "key has been revoked", + 164: "key was rejected by service", + 165: "owner died", + 166: "state not recoverable", + 167: "operation not possible due to RF-kill", + 168: "memory page has hardware error", + 1133: "disk quota exceeded", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "user defined signal 1", + 17: "user defined signal 2", + 18: "child exited", + 19: "power failure", + 20: "window changed", + 21: "urgent I/O condition", + 22: "I/O possible", + 23: "stopped (signal)", + 24: "stopped", + 25: "continued", + 26: "stopped (tty input)", + 27: "stopped (tty output)", + 28: "virtual timer expired", + 29: "profiling timer expired", + 30: "CPU time limit exceeded", + 31: "file size limit exceeded", +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go new file mode 100644 index 0000000000000000000000000000000000000000..8b42ca2fe9b54c49abbfe32f5888b126bdc53e3e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -0,0 +1,1970 @@ +// mkerrors.sh -m64 +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build ppc64,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x29 + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x17 + B110 = 0x3 + B115200 = 0x11 + B1152000 = 0x18 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x19 + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x1a + B230400 = 0x12 + B2400 = 0xb + B2500000 = 0x1b + B300 = 0x7 + B3000000 = 0x1c + B3500000 = 0x1d + B38400 = 0xf + B4000000 = 0x1e + B460800 = 0x13 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x14 + B57600 = 0x10 + B576000 = 0x15 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x16 + B9600 = 0xd + BOTHER = 0x1f + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + CBAUD = 0xff + CBAUDEX = 0x0 + CFLUSH = 0xf + CIBAUD = 0xff0000 + CLOCAL = 0x8000 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIGNAL = 0xff + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000000 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0xd + F_SETLKW = 0x7 + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + HUPCL = 0x4000 + IBSHIFT = 0x10 + ICANON = 0x100 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x400 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_CHECKSUM = 0x7 + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_UNICAST_HOPS = 0x10 + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BLOCK_SOURCE = 0x26 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x80 + ISTRIP = 0x20 + IUCLC = 0x1000 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x80 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x40 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x2000 + MCL_FUTURE = 0x4000 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x300 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80000000 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x4 + ONLCR = 0x2 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x20000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x1000 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_SAO = 0x10 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = -0x1 + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETEVRREGS = 0x14 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGS64 = 0x16 + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GETVRREGS = 0x12 + PTRACE_GETVSRREGS = 0x1b + PTRACE_GET_DEBUGREG = 0x19 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x1000ff + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SEIZE = 0x4206 + PTRACE_SETEVRREGS = 0x15 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGS64 = 0x17 + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SETVRREGS = 0x13 + PTRACE_SETVSRREGS = 0x1c + PTRACE_SET_DEBUGREG = 0x1a + PTRACE_SINGLEBLOCK = 0x100 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + PT_CCR = 0x26 + PT_CTR = 0x23 + PT_DAR = 0x29 + PT_DSCR = 0x2c + PT_DSISR = 0x2a + PT_FPR0 = 0x30 + PT_FPSCR = 0x50 + PT_LNK = 0x24 + PT_MSR = 0x21 + PT_NIP = 0x20 + PT_ORIG_R3 = 0x22 + PT_R0 = 0x0 + PT_R1 = 0x1 + PT_R10 = 0xa + PT_R11 = 0xb + PT_R12 = 0xc + PT_R13 = 0xd + PT_R14 = 0xe + PT_R15 = 0xf + PT_R16 = 0x10 + PT_R17 = 0x11 + PT_R18 = 0x12 + PT_R19 = 0x13 + PT_R2 = 0x2 + PT_R20 = 0x14 + PT_R21 = 0x15 + PT_R22 = 0x16 + PT_R23 = 0x17 + PT_R24 = 0x18 + PT_R25 = 0x19 + PT_R26 = 0x1a + PT_R27 = 0x1b + PT_R28 = 0x1c + PT_R29 = 0x1d + PT_R3 = 0x3 + PT_R30 = 0x1e + PT_R31 = 0x1f + PT_R4 = 0x4 + PT_R5 = 0x5 + PT_R6 = 0x6 + PT_R7 = 0x7 + PT_R8 = 0x8 + PT_R9 = 0x9 + PT_REGS_COUNT = 0x2c + PT_RESULT = 0x2b + PT_SOFTE = 0x27 + PT_TRAP = 0x28 + PT_VR0 = 0x52 + PT_VRSAVE = 0x94 + PT_VSCR = 0x93 + PT_VSR0 = 0x96 + PT_VSR31 = 0xd4 + PT_XER = 0x25 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x7 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x1 + RTAX_ADVMSS = 0x8 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0xf + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x11 + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x57 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x12 + RTM_NR_MSGTYPES = 0x48 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_F_DEAD = 0x1 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTN_MAX = 0xb + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCGARP = 0x8954 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ATM = 0x108 + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_PACKET = 0x107 + SOL_RAW = 0xff + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_FILTER = 0x1a + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_DEBUG = 0x1 + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x14 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x15 + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x10 + SO_RCVTIMEO = 0x12 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x11 + SO_SNDTIMEO = 0x13 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_WIFI_STATUS = 0x29 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0xc00 + TABDLY = 0xc00 + TCFLSH = 0x2000741f + TCGETA = 0x40147417 + TCGETS = 0x402c7413 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x2000741d + TCSBRKP = 0x5425 + TCSETA = 0x80147418 + TCSETAF = 0x8014741c + TCSETAW = 0x80147419 + TCSETS = 0x802c7414 + TCSETSF = 0x802c7416 + TCSETSW = 0x802c7415 + TCXONC = 0x2000741e + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x40045432 + TIOCGETC = 0x40067412 + TIOCGETD = 0x5424 + TIOCGETP = 0x40067408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGLTC = 0x40067474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x4004667f + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_LOOP = 0x8000 + TIOCM_OUT1 = 0x2000 + TIOCM_OUT2 = 0x4000 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETC = 0x80067411 + TIOCSETD = 0x5423 + TIOCSETN = 0x8006740a + TIOCSETP = 0x80067409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSLTC = 0x80067475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTART = 0x2000746e + TIOCSTI = 0x5412 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x400000 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETHDRSZ = 0x400454d7 + TUNSETDEBUG = 0x800454c9 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETHDRSZ = 0x800454d8 + VDISCARD = 0x10 + VEOF = 0x4 + VEOL = 0x6 + VEOL2 = 0x8 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMIN = 0x5 + VQUIT = 0x1 + VREPRINT = 0xb + VSTART = 0xd + VSTOP = 0xe + VSUSP = 0xc + VSWTC = 0x9 + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x7 + VWERASE = 0xa + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XCASE = 0x4000 + XTABS = 0xc00 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x3a) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGUNUSED = syscall.Signal(0x1f) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "no such device or address", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource temporarily unavailable", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device or resource busy", + 17: "file exists", + 18: "invalid cross-device link", + 19: "no such device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "numerical result out of range", + 35: "resource deadlock avoided", + 36: "file name too long", + 37: "no locks available", + 38: "function not implemented", + 39: "directory not empty", + 40: "too many levels of symbolic links", + 42: "no message of desired type", + 43: "identifier removed", + 44: "channel number out of range", + 45: "level 2 not synchronized", + 46: "level 3 halted", + 47: "level 3 reset", + 48: "link number out of range", + 49: "protocol driver not attached", + 50: "no CSI structure available", + 51: "level 2 halted", + 52: "invalid exchange", + 53: "invalid request descriptor", + 54: "exchange full", + 55: "no anode", + 56: "invalid request code", + 57: "invalid slot", + 58: "file locking deadlock error", + 59: "bad font file format", + 60: "device not a stream", + 61: "no data available", + 62: "timer expired", + 63: "out of streams resources", + 64: "machine is not on the network", + 65: "package not installed", + 66: "object is remote", + 67: "link has been severed", + 68: "advertise error", + 69: "srmount error", + 70: "communication error on send", + 71: "protocol error", + 72: "multihop attempted", + 73: "RFS specific error", + 74: "bad message", + 75: "value too large for defined data type", + 76: "name not unique on network", + 77: "file descriptor in bad state", + 78: "remote address changed", + 79: "can not access a needed shared library", + 80: "accessing a corrupted shared library", + 81: ".lib section in a.out corrupted", + 82: "attempting to link in too many shared libraries", + 83: "cannot exec a shared library directly", + 84: "invalid or incomplete multibyte or wide character", + 85: "interrupted system call should be restarted", + 86: "streams pipe error", + 87: "too many users", + 88: "socket operation on non-socket", + 89: "destination address required", + 90: "message too long", + 91: "protocol wrong type for socket", + 92: "protocol not available", + 93: "protocol not supported", + 94: "socket type not supported", + 95: "operation not supported", + 96: "protocol family not supported", + 97: "address family not supported by protocol", + 98: "address already in use", + 99: "cannot assign requested address", + 100: "network is down", + 101: "network is unreachable", + 102: "network dropped connection on reset", + 103: "software caused connection abort", + 104: "connection reset by peer", + 105: "no buffer space available", + 106: "transport endpoint is already connected", + 107: "transport endpoint is not connected", + 108: "cannot send after transport endpoint shutdown", + 109: "too many references: cannot splice", + 110: "connection timed out", + 111: "connection refused", + 112: "host is down", + 113: "no route to host", + 114: "operation already in progress", + 115: "operation now in progress", + 116: "stale file handle", + 117: "structure needs cleaning", + 118: "not a XENIX named type file", + 119: "no XENIX semaphores available", + 120: "is a named type file", + 121: "remote I/O error", + 122: "disk quota exceeded", + 123: "no medium found", + 124: "wrong medium type", + 125: "operation canceled", + 126: "required key not available", + 127: "key has expired", + 128: "key has been revoked", + 129: "key was rejected by service", + 130: "owner died", + 131: "state not recoverable", + 132: "operation not possible due to RF-kill", + 133: "memory page has hardware error", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "bus error", + 8: "floating point exception", + 9: "killed", + 10: "user defined signal 1", + 11: "segmentation fault", + 12: "user defined signal 2", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "stack fault", + 17: "child exited", + 18: "continued", + 19: "stopped (signal)", + 20: "stopped", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "urgent I/O condition", + 24: "CPU time limit exceeded", + 25: "file size limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window changed", + 29: "I/O possible", + 30: "power failure", + 31: "bad system call", +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go new file mode 100644 index 0000000000000000000000000000000000000000..e8d12b5d6d453b3cec6a5a9e64dfa1a1ba9cd086 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -0,0 +1,1969 @@ +// mkerrors.sh -m64 +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build ppc64le,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x29 + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x17 + B110 = 0x3 + B115200 = 0x11 + B1152000 = 0x18 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x19 + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x1a + B230400 = 0x12 + B2400 = 0xb + B2500000 = 0x1b + B300 = 0x7 + B3000000 = 0x1c + B3500000 = 0x1d + B38400 = 0xf + B4000000 = 0x1e + B460800 = 0x13 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x14 + B57600 = 0x10 + B576000 = 0x15 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x16 + B9600 = 0xd + BOTHER = 0x1f + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x8000 + BSDLY = 0x8000 + CBAUD = 0xff + CBAUDEX = 0x0 + CFLUSH = 0xf + CIBAUD = 0xff0000 + CLOCAL = 0x8000 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x1000 + CR2 = 0x2000 + CR3 = 0x3000 + CRDLY = 0x3000 + CREAD = 0x800 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIGNAL = 0xff + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000000 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x4000 + FFDLY = 0x4000 + FLUSHO = 0x800000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0xc + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0xd + F_SETLKW = 0x7 + F_SETLKW64 = 0xe + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + HUPCL = 0x4000 + IBSHIFT = 0x10 + ICANON = 0x100 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x400 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_NODAD = 0x2 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x7 + IFF_802_1Q_VLAN = 0x1 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BONDING = 0x20 + IFF_BRIDGE_PORT = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DISABLE_NETPOLL = 0x1000 + IFF_DONT_BRIDGE = 0x800 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_EBRIDGE = 0x2 + IFF_ECHO = 0x40000 + IFF_ISATAP = 0x80 + IFF_LIVE_ADDR_CHANGE = 0x100000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MACVLAN = 0x200000 + IFF_MACVLAN_PORT = 0x2000 + IFF_MASTER = 0x400 + IFF_MASTER_8023AD = 0x8 + IFF_MASTER_ALB = 0x10 + IFF_MASTER_ARPMON = 0x100 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_OVS_DATAPATH = 0x8000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_SLAVE_INACTIVE = 0x4 + IFF_SLAVE_NEEDARP = 0x40 + IFF_SUPP_NOFCS = 0x80000 + IFF_TAP = 0x2 + IFF_TEAM_PORT = 0x40000 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_TX_SKB_SHARING = 0x10000 + IFF_UNICAST_FLT = 0x20000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFF_WAN_HDLC = 0x200 + IFF_XMIT_DST_RELEASE = 0x400 + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_CHECKSUM = 0x7 + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_UNICAST_HOPS = 0x10 + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BLOCK_SOURCE = 0x26 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x80 + ISTRIP = 0x20 + IUCLC = 0x1000 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x80 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x40 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x2000 + MCL_FUTURE = 0x4000 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NL2 = 0x200 + NL3 = 0x300 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x300 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80000000 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x4 + ONLCR = 0x2 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x20000 + O_DIRECTORY = 0x4000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x8000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x1000 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_SAO = 0x10 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = -0x1 + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETEVRREGS = 0x14 + PTRACE_GETFPREGS = 0xe + PTRACE_GETREGS = 0xc + PTRACE_GETREGS64 = 0x16 + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GETVRREGS = 0x12 + PTRACE_GETVSRREGS = 0x1b + PTRACE_GET_DEBUGREG = 0x19 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x1000ff + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKUSR = 0x3 + PTRACE_POKEDATA = 0x5 + PTRACE_POKETEXT = 0x4 + PTRACE_POKEUSR = 0x6 + PTRACE_SEIZE = 0x4206 + PTRACE_SETEVRREGS = 0x15 + PTRACE_SETFPREGS = 0xf + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGS64 = 0x17 + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SETVRREGS = 0x13 + PTRACE_SETVSRREGS = 0x1c + PTRACE_SET_DEBUGREG = 0x1a + PTRACE_SINGLEBLOCK = 0x100 + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TRACEME = 0x0 + PT_CCR = 0x26 + PT_CTR = 0x23 + PT_DAR = 0x29 + PT_DSCR = 0x2c + PT_DSISR = 0x2a + PT_FPR0 = 0x30 + PT_FPSCR = 0x50 + PT_LNK = 0x24 + PT_MSR = 0x21 + PT_NIP = 0x20 + PT_ORIG_R3 = 0x22 + PT_R0 = 0x0 + PT_R1 = 0x1 + PT_R10 = 0xa + PT_R11 = 0xb + PT_R12 = 0xc + PT_R13 = 0xd + PT_R14 = 0xe + PT_R15 = 0xf + PT_R16 = 0x10 + PT_R17 = 0x11 + PT_R18 = 0x12 + PT_R19 = 0x13 + PT_R2 = 0x2 + PT_R20 = 0x14 + PT_R21 = 0x15 + PT_R22 = 0x16 + PT_R23 = 0x17 + PT_R24 = 0x18 + PT_R25 = 0x19 + PT_R26 = 0x1a + PT_R27 = 0x1b + PT_R28 = 0x1c + PT_R29 = 0x1d + PT_R3 = 0x3 + PT_R30 = 0x1e + PT_R31 = 0x1f + PT_R4 = 0x4 + PT_R5 = 0x5 + PT_R6 = 0x6 + PT_R7 = 0x7 + PT_R8 = 0x8 + PT_R9 = 0x9 + PT_REGS_COUNT = 0x2c + PT_RESULT = 0x2b + PT_SOFTE = 0x27 + PT_TRAP = 0x28 + PT_VR0 = 0x52 + PT_VRSAVE = 0x94 + PT_VSCR = 0x93 + PT_VSR0 = 0x96 + PT_VSR31 = 0xd4 + PT_XER = 0x25 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x7 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x1 + RTAX_ADVMSS = 0x8 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0xf + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x11 + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x57 + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x12 + RTM_NR_MSGTYPES = 0x48 + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_F_DEAD = 0x1 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTN_MAX = 0xb + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCGARP = 0x8954 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ATM = 0x108 + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_PACKET = 0x107 + SOL_RAW = 0xff + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_FILTER = 0x1a + SO_BINDTODEVICE = 0x19 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_DEBUG = 0x1 + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x14 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x15 + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x10 + SO_RCVTIMEO = 0x12 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x11 + SO_SNDTIMEO = 0x13 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_WIFI_STATUS = 0x29 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x400 + TAB2 = 0x800 + TAB3 = 0xc00 + TABDLY = 0xc00 + TCFLSH = 0x2000741f + TCGETA = 0x40147417 + TCGETS = 0x402c7413 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x2000741d + TCSBRKP = 0x5425 + TCSETA = 0x80147418 + TCSETAF = 0x8014741c + TCSETAW = 0x80147419 + TCSETS = 0x802c7414 + TCSETSF = 0x802c7416 + TCSETSW = 0x802c7415 + TCXONC = 0x2000741e + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x40045432 + TIOCGETC = 0x40067412 + TIOCGETD = 0x5424 + TIOCGETP = 0x40067408 + TIOCGEXCL = 0x40045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGLTC = 0x40067474 + TIOCGPGRP = 0x40047477 + TIOCGPKT = 0x40045438 + TIOCGPTLCK = 0x40045439 + TIOCGPTN = 0x40045430 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x40087468 + TIOCINQ = 0x4004667f + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_LOOP = 0x8000 + TIOCM_OUT1 = 0x2000 + TIOCM_OUT2 = 0x4000 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETC = 0x80067411 + TIOCSETD = 0x5423 + TIOCSETN = 0x8006740a + TIOCSETP = 0x80067409 + TIOCSIG = 0x80045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSLTC = 0x80067475 + TIOCSPGRP = 0x80047476 + TIOCSPTLCK = 0x80045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTART = 0x2000746e + TIOCSTI = 0x5412 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x400000 + TUNATTACHFILTER = 0x801054d5 + TUNDETACHFILTER = 0x801054d6 + TUNGETFEATURES = 0x400454cf + TUNGETFILTER = 0x401054db + TUNGETIFF = 0x400454d2 + TUNGETSNDBUF = 0x400454d3 + TUNGETVNETHDRSZ = 0x400454d7 + TUNSETDEBUG = 0x800454c9 + TUNSETGROUP = 0x800454ce + TUNSETIFF = 0x800454ca + TUNSETIFINDEX = 0x800454da + TUNSETLINK = 0x800454cd + TUNSETNOCSUM = 0x800454c8 + TUNSETOFFLOAD = 0x800454d0 + TUNSETOWNER = 0x800454cc + TUNSETPERSIST = 0x800454cb + TUNSETQUEUE = 0x800454d9 + TUNSETSNDBUF = 0x800454d4 + TUNSETTXFILTER = 0x800454d1 + TUNSETVNETHDRSZ = 0x800454d8 + VDISCARD = 0x10 + VEOF = 0x4 + VEOL = 0x6 + VEOL2 = 0x8 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMIN = 0x5 + VQUIT = 0x1 + VREPRINT = 0xb + VSTART = 0xd + VSTOP = 0xe + VSUSP = 0xc + VSWTC = 0x9 + VT0 = 0x0 + VT1 = 0x10000 + VTDLY = 0x10000 + VTIME = 0x7 + VWERASE = 0xa + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XCASE = 0x4000 + XTABS = 0xc00 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x3a) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGUNUSED = syscall.Signal(0x1f) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "no such device or address", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource temporarily unavailable", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device or resource busy", + 17: "file exists", + 18: "invalid cross-device link", + 19: "no such device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "numerical result out of range", + 35: "resource deadlock avoided", + 36: "file name too long", + 37: "no locks available", + 38: "function not implemented", + 39: "directory not empty", + 40: "too many levels of symbolic links", + 42: "no message of desired type", + 43: "identifier removed", + 44: "channel number out of range", + 45: "level 2 not synchronized", + 46: "level 3 halted", + 47: "level 3 reset", + 48: "link number out of range", + 49: "protocol driver not attached", + 50: "no CSI structure available", + 51: "level 2 halted", + 52: "invalid exchange", + 53: "invalid request descriptor", + 54: "exchange full", + 55: "no anode", + 56: "invalid request code", + 57: "invalid slot", + 58: "file locking deadlock error", + 59: "bad font file format", + 60: "device not a stream", + 61: "no data available", + 62: "timer expired", + 63: "out of streams resources", + 64: "machine is not on the network", + 65: "package not installed", + 66: "object is remote", + 67: "link has been severed", + 68: "advertise error", + 69: "srmount error", + 70: "communication error on send", + 71: "protocol error", + 72: "multihop attempted", + 73: "RFS specific error", + 74: "bad message", + 75: "value too large for defined data type", + 76: "name not unique on network", + 77: "file descriptor in bad state", + 78: "remote address changed", + 79: "can not access a needed shared library", + 80: "accessing a corrupted shared library", + 81: ".lib section in a.out corrupted", + 82: "attempting to link in too many shared libraries", + 83: "cannot exec a shared library directly", + 84: "invalid or incomplete multibyte or wide character", + 85: "interrupted system call should be restarted", + 86: "streams pipe error", + 87: "too many users", + 88: "socket operation on non-socket", + 89: "destination address required", + 90: "message too long", + 91: "protocol wrong type for socket", + 92: "protocol not available", + 93: "protocol not supported", + 94: "socket type not supported", + 95: "operation not supported", + 96: "protocol family not supported", + 97: "address family not supported by protocol", + 98: "address already in use", + 99: "cannot assign requested address", + 100: "network is down", + 101: "network is unreachable", + 102: "network dropped connection on reset", + 103: "software caused connection abort", + 104: "connection reset by peer", + 105: "no buffer space available", + 106: "transport endpoint is already connected", + 107: "transport endpoint is not connected", + 108: "cannot send after transport endpoint shutdown", + 109: "too many references: cannot splice", + 110: "connection timed out", + 111: "connection refused", + 112: "host is down", + 113: "no route to host", + 114: "operation already in progress", + 115: "operation now in progress", + 116: "stale file handle", + 117: "structure needs cleaning", + 118: "not a XENIX named type file", + 119: "no XENIX semaphores available", + 120: "is a named type file", + 121: "remote I/O error", + 122: "disk quota exceeded", + 123: "no medium found", + 124: "wrong medium type", + 125: "operation canceled", + 126: "required key not available", + 127: "key has expired", + 128: "key has been revoked", + 129: "key was rejected by service", + 130: "owner died", + 131: "state not recoverable", + 132: "operation not possible due to RF-kill", + 133: "memory page has hardware error", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "bus error", + 8: "floating point exception", + 9: "killed", + 10: "user defined signal 1", + 11: "segmentation fault", + 12: "user defined signal 2", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "stack fault", + 17: "child exited", + 18: "continued", + 19: "stopped (signal)", + 20: "stopped", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "urgent I/O condition", + 24: "CPU time limit exceeded", + 25: "file size limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window changed", + 29: "I/O possible", + 30: "power failure", + 31: "bad system call", +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go new file mode 100644 index 0000000000000000000000000000000000000000..329f25e7cf6df164b4005febb03f04530ec22392 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -0,0 +1,2027 @@ +// mkerrors.sh -m64 +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build s390x,linux + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_ALG = 0x26 + AF_APPLETALK = 0x5 + AF_ASH = 0x12 + AF_ATMPVC = 0x8 + AF_ATMSVC = 0x14 + AF_AX25 = 0x3 + AF_BLUETOOTH = 0x1f + AF_BRIDGE = 0x7 + AF_CAIF = 0x25 + AF_CAN = 0x1d + AF_DECnet = 0xc + AF_ECONET = 0x13 + AF_FILE = 0x1 + AF_IB = 0x1b + AF_IEEE802154 = 0x24 + AF_INET = 0x2 + AF_INET6 = 0xa + AF_IPX = 0x4 + AF_IRDA = 0x17 + AF_ISDN = 0x22 + AF_IUCV = 0x20 + AF_KEY = 0xf + AF_LLC = 0x1a + AF_LOCAL = 0x1 + AF_MAX = 0x29 + AF_MPLS = 0x1c + AF_NETBEUI = 0xd + AF_NETLINK = 0x10 + AF_NETROM = 0x6 + AF_NFC = 0x27 + AF_PACKET = 0x11 + AF_PHONET = 0x23 + AF_PPPOX = 0x18 + AF_RDS = 0x15 + AF_ROSE = 0xb + AF_ROUTE = 0x10 + AF_RXRPC = 0x21 + AF_SECURITY = 0xe + AF_SNA = 0x16 + AF_TIPC = 0x1e + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_VSOCK = 0x28 + AF_WANPIPE = 0x19 + AF_X25 = 0x9 + ARPHRD_6LOWPAN = 0x339 + ARPHRD_ADAPT = 0x108 + ARPHRD_APPLETLK = 0x8 + ARPHRD_ARCNET = 0x7 + ARPHRD_ASH = 0x30d + ARPHRD_ATM = 0x13 + ARPHRD_AX25 = 0x3 + ARPHRD_BIF = 0x307 + ARPHRD_CAIF = 0x336 + ARPHRD_CAN = 0x118 + ARPHRD_CHAOS = 0x5 + ARPHRD_CISCO = 0x201 + ARPHRD_CSLIP = 0x101 + ARPHRD_CSLIP6 = 0x103 + ARPHRD_DDCMP = 0x205 + ARPHRD_DLCI = 0xf + ARPHRD_ECONET = 0x30e + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_EUI64 = 0x1b + ARPHRD_FCAL = 0x311 + ARPHRD_FCFABRIC = 0x313 + ARPHRD_FCPL = 0x312 + ARPHRD_FCPP = 0x310 + ARPHRD_FDDI = 0x306 + ARPHRD_FRAD = 0x302 + ARPHRD_HDLC = 0x201 + ARPHRD_HIPPI = 0x30c + ARPHRD_HWX25 = 0x110 + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IEEE80211 = 0x321 + ARPHRD_IEEE80211_PRISM = 0x322 + ARPHRD_IEEE80211_RADIOTAP = 0x323 + ARPHRD_IEEE802154 = 0x324 + ARPHRD_IEEE802154_MONITOR = 0x325 + ARPHRD_IEEE802_TR = 0x320 + ARPHRD_INFINIBAND = 0x20 + ARPHRD_IP6GRE = 0x337 + ARPHRD_IPDDP = 0x309 + ARPHRD_IPGRE = 0x30a + ARPHRD_IRDA = 0x30f + ARPHRD_LAPB = 0x204 + ARPHRD_LOCALTLK = 0x305 + ARPHRD_LOOPBACK = 0x304 + ARPHRD_METRICOM = 0x17 + ARPHRD_NETLINK = 0x338 + ARPHRD_NETROM = 0x0 + ARPHRD_NONE = 0xfffe + ARPHRD_PHONET = 0x334 + ARPHRD_PHONET_PIPE = 0x335 + ARPHRD_PIMREG = 0x30b + ARPHRD_PPP = 0x200 + ARPHRD_PRONET = 0x4 + ARPHRD_RAWHDLC = 0x206 + ARPHRD_ROSE = 0x10e + ARPHRD_RSRVD = 0x104 + ARPHRD_SIT = 0x308 + ARPHRD_SKIP = 0x303 + ARPHRD_SLIP = 0x100 + ARPHRD_SLIP6 = 0x102 + ARPHRD_TUNNEL = 0x300 + ARPHRD_TUNNEL6 = 0x301 + ARPHRD_VOID = 0xffff + ARPHRD_X25 = 0x10f + B0 = 0x0 + B1000000 = 0x1008 + B110 = 0x3 + B115200 = 0x1002 + B1152000 = 0x1009 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B1500000 = 0x100a + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B2000000 = 0x100b + B230400 = 0x1003 + B2400 = 0xb + B2500000 = 0x100c + B300 = 0x7 + B3000000 = 0x100d + B3500000 = 0x100e + B38400 = 0xf + B4000000 = 0x100f + B460800 = 0x1004 + B4800 = 0xc + B50 = 0x1 + B500000 = 0x1005 + B57600 = 0x1001 + B576000 = 0x1006 + B600 = 0x8 + B75 = 0x2 + B921600 = 0x1007 + B9600 = 0xd + BOTHER = 0x1000 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LL_OFF = -0x200000 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXINSNS = 0x1000 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MOD = 0x90 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_NET_OFF = -0x100000 + BPF_OR = 0x40 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BPF_XOR = 0xa0 + BRKINT = 0x2 + BS0 = 0x0 + BS1 = 0x2000 + BSDLY = 0x2000 + CBAUD = 0x100f + CBAUDEX = 0x1000 + CFLUSH = 0xf + CIBAUD = 0x100f0000 + CLOCAL = 0x800 + CLOCK_BOOTTIME = 0x7 + CLOCK_BOOTTIME_ALARM = 0x9 + CLOCK_DEFAULT = 0x0 + CLOCK_EXT = 0x1 + CLOCK_INT = 0x2 + CLOCK_MONOTONIC = 0x1 + CLOCK_MONOTONIC_COARSE = 0x6 + CLOCK_MONOTONIC_RAW = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x2 + CLOCK_REALTIME = 0x0 + CLOCK_REALTIME_ALARM = 0x8 + CLOCK_REALTIME_COARSE = 0x5 + CLOCK_TAI = 0xb + CLOCK_THREAD_CPUTIME_ID = 0x3 + CLOCK_TXFROMRX = 0x4 + CLOCK_TXINT = 0x3 + CLONE_CHILD_CLEARTID = 0x200000 + CLONE_CHILD_SETTID = 0x1000000 + CLONE_DETACHED = 0x400000 + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_IO = 0x80000000 + CLONE_NEWCGROUP = 0x2000000 + CLONE_NEWIPC = 0x8000000 + CLONE_NEWNET = 0x40000000 + CLONE_NEWNS = 0x20000 + CLONE_NEWPID = 0x20000000 + CLONE_NEWUSER = 0x10000000 + CLONE_NEWUTS = 0x4000000 + CLONE_PARENT = 0x8000 + CLONE_PARENT_SETTID = 0x100000 + CLONE_PTRACE = 0x2000 + CLONE_SETTLS = 0x80000 + CLONE_SIGHAND = 0x800 + CLONE_SYSVSEM = 0x40000 + CLONE_THREAD = 0x10000 + CLONE_UNTRACED = 0x800000 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CMSPAR = 0x40000000 + CR0 = 0x0 + CR1 = 0x200 + CR2 = 0x400 + CR3 = 0x600 + CRDLY = 0x600 + CREAD = 0x80 + CRTSCTS = 0x80000000 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIGNAL = 0xff + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x0 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + ENCODING_DEFAULT = 0x0 + ENCODING_FM_MARK = 0x3 + ENCODING_FM_SPACE = 0x4 + ENCODING_MANCHESTER = 0x5 + ENCODING_NRZ = 0x1 + ENCODING_NRZI = 0x2 + EPOLLERR = 0x8 + EPOLLET = 0x80000000 + EPOLLHUP = 0x10 + EPOLLIN = 0x1 + EPOLLMSG = 0x400 + EPOLLONESHOT = 0x40000000 + EPOLLOUT = 0x4 + EPOLLPRI = 0x2 + EPOLLRDBAND = 0x80 + EPOLLRDHUP = 0x2000 + EPOLLRDNORM = 0x40 + EPOLLWAKEUP = 0x20000000 + EPOLLWRBAND = 0x200 + EPOLLWRNORM = 0x100 + EPOLL_CLOEXEC = 0x80000 + EPOLL_CTL_ADD = 0x1 + EPOLL_CTL_DEL = 0x2 + EPOLL_CTL_MOD = 0x3 + ETH_P_1588 = 0x88f7 + ETH_P_8021AD = 0x88a8 + ETH_P_8021AH = 0x88e7 + ETH_P_8021Q = 0x8100 + ETH_P_80221 = 0x8917 + ETH_P_802_2 = 0x4 + ETH_P_802_3 = 0x1 + ETH_P_802_3_MIN = 0x600 + ETH_P_802_EX1 = 0x88b5 + ETH_P_AARP = 0x80f3 + ETH_P_AF_IUCV = 0xfbfb + ETH_P_ALL = 0x3 + ETH_P_AOE = 0x88a2 + ETH_P_ARCNET = 0x1a + ETH_P_ARP = 0x806 + ETH_P_ATALK = 0x809b + ETH_P_ATMFATE = 0x8884 + ETH_P_ATMMPOA = 0x884c + ETH_P_AX25 = 0x2 + ETH_P_BATMAN = 0x4305 + ETH_P_BPQ = 0x8ff + ETH_P_CAIF = 0xf7 + ETH_P_CAN = 0xc + ETH_P_CANFD = 0xd + ETH_P_CONTROL = 0x16 + ETH_P_CUST = 0x6006 + ETH_P_DDCMP = 0x6 + ETH_P_DEC = 0x6000 + ETH_P_DIAG = 0x6005 + ETH_P_DNA_DL = 0x6001 + ETH_P_DNA_RC = 0x6002 + ETH_P_DNA_RT = 0x6003 + ETH_P_DSA = 0x1b + ETH_P_ECONET = 0x18 + ETH_P_EDSA = 0xdada + ETH_P_FCOE = 0x8906 + ETH_P_FIP = 0x8914 + ETH_P_HDLC = 0x19 + ETH_P_IEEE802154 = 0xf6 + ETH_P_IEEEPUP = 0xa00 + ETH_P_IEEEPUPAT = 0xa01 + ETH_P_IP = 0x800 + ETH_P_IPV6 = 0x86dd + ETH_P_IPX = 0x8137 + ETH_P_IRDA = 0x17 + ETH_P_LAT = 0x6004 + ETH_P_LINK_CTL = 0x886c + ETH_P_LOCALTALK = 0x9 + ETH_P_LOOP = 0x60 + ETH_P_LOOPBACK = 0x9000 + ETH_P_MOBITEX = 0x15 + ETH_P_MPLS_MC = 0x8848 + ETH_P_MPLS_UC = 0x8847 + ETH_P_MVRP = 0x88f5 + ETH_P_PAE = 0x888e + ETH_P_PAUSE = 0x8808 + ETH_P_PHONET = 0xf5 + ETH_P_PPPTALK = 0x10 + ETH_P_PPP_DISC = 0x8863 + ETH_P_PPP_MP = 0x8 + ETH_P_PPP_SES = 0x8864 + ETH_P_PRP = 0x88fb + ETH_P_PUP = 0x200 + ETH_P_PUPAT = 0x201 + ETH_P_QINQ1 = 0x9100 + ETH_P_QINQ2 = 0x9200 + ETH_P_QINQ3 = 0x9300 + ETH_P_RARP = 0x8035 + ETH_P_SCA = 0x6007 + ETH_P_SLOW = 0x8809 + ETH_P_SNAP = 0x5 + ETH_P_TDLS = 0x890d + ETH_P_TEB = 0x6558 + ETH_P_TIPC = 0x88ca + ETH_P_TRAILER = 0x1c + ETH_P_TR_802_2 = 0x11 + ETH_P_TSN = 0x22f0 + ETH_P_WAN_PPP = 0x7 + ETH_P_WCCP = 0x883e + ETH_P_X25 = 0x805 + ETH_P_XDSA = 0xf8 + EXTA = 0xe + EXTB = 0xf + EXTPROC = 0x10000 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FF0 = 0x0 + FF1 = 0x8000 + FFDLY = 0x8000 + FLUSHO = 0x1000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x406 + F_EXLCK = 0x4 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLEASE = 0x401 + F_GETLK = 0x5 + F_GETLK64 = 0x5 + F_GETOWN = 0x9 + F_GETOWN_EX = 0x10 + F_GETPIPE_SZ = 0x408 + F_GETSIG = 0xb + F_LOCK = 0x1 + F_NOTIFY = 0x402 + F_OFD_GETLK = 0x24 + F_OFD_SETLK = 0x25 + F_OFD_SETLKW = 0x26 + F_OK = 0x0 + F_RDLCK = 0x0 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLEASE = 0x400 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETOWN = 0x8 + F_SETOWN_EX = 0xf + F_SETPIPE_SZ = 0x407 + F_SETSIG = 0xa + F_SHLCK = 0x8 + F_TEST = 0x3 + F_TLOCK = 0x2 + F_ULOCK = 0x0 + F_UNLCK = 0x2 + F_WRLCK = 0x1 + HUPCL = 0x400 + IBSHIFT = 0x10 + ICANON = 0x2 + ICMPV6_FILTER = 0x1 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFA_F_DADFAILED = 0x8 + IFA_F_DEPRECATED = 0x20 + IFA_F_HOMEADDRESS = 0x10 + IFA_F_MANAGETEMPADDR = 0x100 + IFA_F_MCAUTOJOIN = 0x400 + IFA_F_NODAD = 0x2 + IFA_F_NOPREFIXROUTE = 0x200 + IFA_F_OPTIMISTIC = 0x4 + IFA_F_PERMANENT = 0x80 + IFA_F_SECONDARY = 0x1 + IFA_F_STABLE_PRIVACY = 0x800 + IFA_F_TEMPORARY = 0x1 + IFA_F_TENTATIVE = 0x40 + IFA_MAX = 0x8 + IFF_ALLMULTI = 0x200 + IFF_ATTACH_QUEUE = 0x200 + IFF_AUTOMEDIA = 0x4000 + IFF_BROADCAST = 0x2 + IFF_DEBUG = 0x4 + IFF_DETACH_QUEUE = 0x400 + IFF_DORMANT = 0x20000 + IFF_DYNAMIC = 0x8000 + IFF_ECHO = 0x40000 + IFF_LOOPBACK = 0x8 + IFF_LOWER_UP = 0x10000 + IFF_MASTER = 0x400 + IFF_MULTICAST = 0x1000 + IFF_MULTI_QUEUE = 0x100 + IFF_NOARP = 0x80 + IFF_NOFILTER = 0x1000 + IFF_NOTRAILERS = 0x20 + IFF_NO_PI = 0x1000 + IFF_ONE_QUEUE = 0x2000 + IFF_PERSIST = 0x800 + IFF_POINTOPOINT = 0x10 + IFF_PORTSEL = 0x2000 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SLAVE = 0x800 + IFF_TAP = 0x2 + IFF_TUN = 0x1 + IFF_TUN_EXCL = 0x8000 + IFF_UP = 0x1 + IFF_VNET_HDR = 0x4000 + IFF_VOLATILE = 0x70c5a + IFNAMSIZ = 0x10 + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_ACCESS = 0x1 + IN_ALL_EVENTS = 0xfff + IN_ATTRIB = 0x4 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLOEXEC = 0x80000 + IN_CLOSE = 0x18 + IN_CLOSE_NOWRITE = 0x10 + IN_CLOSE_WRITE = 0x8 + IN_CREATE = 0x100 + IN_DELETE = 0x200 + IN_DELETE_SELF = 0x400 + IN_DONT_FOLLOW = 0x2000000 + IN_EXCL_UNLINK = 0x4000000 + IN_IGNORED = 0x8000 + IN_ISDIR = 0x40000000 + IN_LOOPBACKNET = 0x7f + IN_MASK_ADD = 0x20000000 + IN_MODIFY = 0x2 + IN_MOVE = 0xc0 + IN_MOVED_FROM = 0x40 + IN_MOVED_TO = 0x80 + IN_MOVE_SELF = 0x800 + IN_NONBLOCK = 0x800 + IN_ONESHOT = 0x80000000 + IN_ONLYDIR = 0x1000000 + IN_OPEN = 0x20 + IN_Q_OVERFLOW = 0x4000 + IN_UNMOUNT = 0x2000 + IPPROTO_AH = 0x33 + IPPROTO_BEETPH = 0x5e + IPPROTO_COMP = 0x6c + IPPROTO_DCCP = 0x21 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPIP = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MH = 0x87 + IPPROTO_MPLS = 0x89 + IPPROTO_MTP = 0x5c + IPPROTO_NONE = 0x3b + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_UDPLITE = 0x88 + IPV6_2292DSTOPTS = 0x4 + IPV6_2292HOPLIMIT = 0x8 + IPV6_2292HOPOPTS = 0x3 + IPV6_2292PKTINFO = 0x2 + IPV6_2292PKTOPTIONS = 0x6 + IPV6_2292RTHDR = 0x5 + IPV6_ADDRFORM = 0x1 + IPV6_ADD_MEMBERSHIP = 0x14 + IPV6_AUTHHDR = 0xa + IPV6_CHECKSUM = 0x7 + IPV6_DONTFRAG = 0x3e + IPV6_DROP_MEMBERSHIP = 0x15 + IPV6_DSTOPTS = 0x3b + IPV6_HOPLIMIT = 0x34 + IPV6_HOPOPTS = 0x36 + IPV6_IPSEC_POLICY = 0x22 + IPV6_JOIN_ANYCAST = 0x1b + IPV6_JOIN_GROUP = 0x14 + IPV6_LEAVE_ANYCAST = 0x1c + IPV6_LEAVE_GROUP = 0x15 + IPV6_MTU = 0x18 + IPV6_MTU_DISCOVER = 0x17 + IPV6_MULTICAST_HOPS = 0x12 + IPV6_MULTICAST_IF = 0x11 + IPV6_MULTICAST_LOOP = 0x13 + IPV6_NEXTHOP = 0x9 + IPV6_PATHMTU = 0x3d + IPV6_PKTINFO = 0x32 + IPV6_PMTUDISC_DO = 0x2 + IPV6_PMTUDISC_DONT = 0x0 + IPV6_PMTUDISC_INTERFACE = 0x4 + IPV6_PMTUDISC_OMIT = 0x5 + IPV6_PMTUDISC_PROBE = 0x3 + IPV6_PMTUDISC_WANT = 0x1 + IPV6_RECVDSTOPTS = 0x3a + IPV6_RECVERR = 0x19 + IPV6_RECVHOPLIMIT = 0x33 + IPV6_RECVHOPOPTS = 0x35 + IPV6_RECVPATHMTU = 0x3c + IPV6_RECVPKTINFO = 0x31 + IPV6_RECVRTHDR = 0x38 + IPV6_RECVTCLASS = 0x42 + IPV6_ROUTER_ALERT = 0x16 + IPV6_RTHDR = 0x39 + IPV6_RTHDRDSTOPTS = 0x37 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_RXDSTOPTS = 0x3b + IPV6_RXHOPOPTS = 0x36 + IPV6_TCLASS = 0x43 + IPV6_UNICAST_HOPS = 0x10 + IPV6_V6ONLY = 0x1a + IPV6_XFRM_POLICY = 0x23 + IP_ADD_MEMBERSHIP = 0x23 + IP_ADD_SOURCE_MEMBERSHIP = 0x27 + IP_BIND_ADDRESS_NO_PORT = 0x18 + IP_BLOCK_SOURCE = 0x26 + IP_CHECKSUM = 0x17 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0x24 + IP_DROP_SOURCE_MEMBERSHIP = 0x28 + IP_FREEBIND = 0xf + IP_HDRINCL = 0x3 + IP_IPSEC_POLICY = 0x10 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINTTL = 0x15 + IP_MSFILTER = 0x29 + IP_MSS = 0x240 + IP_MTU = 0xe + IP_MTU_DISCOVER = 0xa + IP_MULTICAST_ALL = 0x31 + IP_MULTICAST_IF = 0x20 + IP_MULTICAST_LOOP = 0x22 + IP_MULTICAST_TTL = 0x21 + IP_NODEFRAG = 0x16 + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x4 + IP_ORIGDSTADDR = 0x14 + IP_PASSSEC = 0x12 + IP_PKTINFO = 0x8 + IP_PKTOPTIONS = 0x9 + IP_PMTUDISC = 0xa + IP_PMTUDISC_DO = 0x2 + IP_PMTUDISC_DONT = 0x0 + IP_PMTUDISC_INTERFACE = 0x4 + IP_PMTUDISC_OMIT = 0x5 + IP_PMTUDISC_PROBE = 0x3 + IP_PMTUDISC_WANT = 0x1 + IP_RECVERR = 0xb + IP_RECVOPTS = 0x6 + IP_RECVORIGDSTADDR = 0x14 + IP_RECVRETOPTS = 0x7 + IP_RECVTOS = 0xd + IP_RECVTTL = 0xc + IP_RETOPTS = 0x7 + IP_RF = 0x8000 + IP_ROUTER_ALERT = 0x5 + IP_TOS = 0x1 + IP_TRANSPARENT = 0x13 + IP_TTL = 0x2 + IP_UNBLOCK_SOURCE = 0x25 + IP_UNICAST_IF = 0x32 + IP_XFRM_POLICY = 0x11 + ISIG = 0x1 + ISTRIP = 0x20 + IUCLC = 0x200 + IUTF8 = 0x4000 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + LINUX_REBOOT_CMD_CAD_OFF = 0x0 + LINUX_REBOOT_CMD_CAD_ON = 0x89abcdef + LINUX_REBOOT_CMD_HALT = 0xcdef0123 + LINUX_REBOOT_CMD_KEXEC = 0x45584543 + LINUX_REBOOT_CMD_POWER_OFF = 0x4321fedc + LINUX_REBOOT_CMD_RESTART = 0x1234567 + LINUX_REBOOT_CMD_RESTART2 = 0xa1b2c3d4 + LINUX_REBOOT_CMD_SW_SUSPEND = 0xd000fce2 + LINUX_REBOOT_MAGIC1 = 0xfee1dead + LINUX_REBOOT_MAGIC2 = 0x28121969 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DODUMP = 0x11 + MADV_DOFORK = 0xb + MADV_DONTDUMP = 0x10 + MADV_DONTFORK = 0xa + MADV_DONTNEED = 0x4 + MADV_HUGEPAGE = 0xe + MADV_HWPOISON = 0x64 + MADV_MERGEABLE = 0xc + MADV_NOHUGEPAGE = 0xf + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_REMOVE = 0x9 + MADV_SEQUENTIAL = 0x2 + MADV_UNMERGEABLE = 0xd + MADV_WILLNEED = 0x3 + MAP_ANON = 0x20 + MAP_ANONYMOUS = 0x20 + MAP_DENYWRITE = 0x800 + MAP_EXECUTABLE = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_GROWSDOWN = 0x100 + MAP_HUGETLB = 0x40000 + MAP_HUGE_MASK = 0x3f + MAP_HUGE_SHIFT = 0x1a + MAP_LOCKED = 0x2000 + MAP_NONBLOCK = 0x10000 + MAP_NORESERVE = 0x4000 + MAP_POPULATE = 0x8000 + MAP_PRIVATE = 0x2 + MAP_SHARED = 0x1 + MAP_STACK = 0x20000 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MCL_ONFAULT = 0x4 + MNT_DETACH = 0x2 + MNT_EXPIRE = 0x4 + MNT_FORCE = 0x1 + MSG_CMSG_CLOEXEC = 0x40000000 + MSG_CONFIRM = 0x800 + MSG_CTRUNC = 0x8 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x40 + MSG_EOR = 0x80 + MSG_ERRQUEUE = 0x2000 + MSG_FASTOPEN = 0x20000000 + MSG_FIN = 0x200 + MSG_MORE = 0x8000 + MSG_NOSIGNAL = 0x4000 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_PROXY = 0x10 + MSG_RST = 0x1000 + MSG_SYN = 0x400 + MSG_TRUNC = 0x20 + MSG_TRYHARD = 0x4 + MSG_WAITALL = 0x100 + MSG_WAITFORONE = 0x10000 + MS_ACTIVE = 0x40000000 + MS_ASYNC = 0x1 + MS_BIND = 0x1000 + MS_DIRSYNC = 0x80 + MS_INVALIDATE = 0x2 + MS_I_VERSION = 0x800000 + MS_KERNMOUNT = 0x400000 + MS_LAZYTIME = 0x2000000 + MS_MANDLOCK = 0x40 + MS_MGC_MSK = 0xffff0000 + MS_MGC_VAL = 0xc0ed0000 + MS_MOVE = 0x2000 + MS_NOATIME = 0x400 + MS_NODEV = 0x4 + MS_NODIRATIME = 0x800 + MS_NOEXEC = 0x8 + MS_NOSUID = 0x2 + MS_NOUSER = -0x80000000 + MS_POSIXACL = 0x10000 + MS_PRIVATE = 0x40000 + MS_RDONLY = 0x1 + MS_REC = 0x4000 + MS_RELATIME = 0x200000 + MS_REMOUNT = 0x20 + MS_RMT_MASK = 0x2800051 + MS_SHARED = 0x100000 + MS_SILENT = 0x8000 + MS_SLAVE = 0x80000 + MS_STRICTATIME = 0x1000000 + MS_SYNC = 0x4 + MS_SYNCHRONOUS = 0x10 + MS_UNBINDABLE = 0x20000 + NAME_MAX = 0xff + NETLINK_ADD_MEMBERSHIP = 0x1 + NETLINK_AUDIT = 0x9 + NETLINK_BROADCAST_ERROR = 0x4 + NETLINK_CAP_ACK = 0xa + NETLINK_CONNECTOR = 0xb + NETLINK_CRYPTO = 0x15 + NETLINK_DNRTMSG = 0xe + NETLINK_DROP_MEMBERSHIP = 0x2 + NETLINK_ECRYPTFS = 0x13 + NETLINK_FIB_LOOKUP = 0xa + NETLINK_FIREWALL = 0x3 + NETLINK_GENERIC = 0x10 + NETLINK_INET_DIAG = 0x4 + NETLINK_IP6_FW = 0xd + NETLINK_ISCSI = 0x8 + NETLINK_KOBJECT_UEVENT = 0xf + NETLINK_LISTEN_ALL_NSID = 0x8 + NETLINK_LIST_MEMBERSHIPS = 0x9 + NETLINK_NETFILTER = 0xc + NETLINK_NFLOG = 0x5 + NETLINK_NO_ENOBUFS = 0x5 + NETLINK_PKTINFO = 0x3 + NETLINK_RDMA = 0x14 + NETLINK_ROUTE = 0x0 + NETLINK_RX_RING = 0x6 + NETLINK_SCSITRANSPORT = 0x12 + NETLINK_SELINUX = 0x7 + NETLINK_SOCK_DIAG = 0x4 + NETLINK_TX_RING = 0x7 + NETLINK_UNUSED = 0x1 + NETLINK_USERSOCK = 0x2 + NETLINK_XFRM = 0x6 + NL0 = 0x0 + NL1 = 0x100 + NLA_ALIGNTO = 0x4 + NLA_F_NESTED = 0x8000 + NLA_F_NET_BYTEORDER = 0x4000 + NLA_HDRLEN = 0x4 + NLDLY = 0x100 + NLMSG_ALIGNTO = 0x4 + NLMSG_DONE = 0x3 + NLMSG_ERROR = 0x2 + NLMSG_HDRLEN = 0x10 + NLMSG_MIN_TYPE = 0x10 + NLMSG_NOOP = 0x1 + NLMSG_OVERRUN = 0x4 + NLM_F_ACK = 0x4 + NLM_F_APPEND = 0x800 + NLM_F_ATOMIC = 0x400 + NLM_F_CREATE = 0x400 + NLM_F_DUMP = 0x300 + NLM_F_DUMP_FILTERED = 0x20 + NLM_F_DUMP_INTR = 0x10 + NLM_F_ECHO = 0x8 + NLM_F_EXCL = 0x200 + NLM_F_MATCH = 0x200 + NLM_F_MULTI = 0x2 + NLM_F_REPLACE = 0x100 + NLM_F_REQUEST = 0x1 + NLM_F_ROOT = 0x100 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + OLCUC = 0x2 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x400 + O_ASYNC = 0x2000 + O_CLOEXEC = 0x80000 + O_CREAT = 0x40 + O_DIRECT = 0x4000 + O_DIRECTORY = 0x10000 + O_DSYNC = 0x1000 + O_EXCL = 0x80 + O_FSYNC = 0x101000 + O_LARGEFILE = 0x0 + O_NDELAY = 0x800 + O_NOATIME = 0x40000 + O_NOCTTY = 0x100 + O_NOFOLLOW = 0x20000 + O_NONBLOCK = 0x800 + O_PATH = 0x200000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x101000 + O_SYNC = 0x101000 + O_TMPFILE = 0x410000 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + PACKET_ADD_MEMBERSHIP = 0x1 + PACKET_AUXDATA = 0x8 + PACKET_BROADCAST = 0x1 + PACKET_COPY_THRESH = 0x7 + PACKET_DROP_MEMBERSHIP = 0x2 + PACKET_FANOUT = 0x12 + PACKET_FANOUT_CBPF = 0x6 + PACKET_FANOUT_CPU = 0x2 + PACKET_FANOUT_DATA = 0x16 + PACKET_FANOUT_EBPF = 0x7 + PACKET_FANOUT_FLAG_DEFRAG = 0x8000 + PACKET_FANOUT_FLAG_ROLLOVER = 0x1000 + PACKET_FANOUT_HASH = 0x0 + PACKET_FANOUT_LB = 0x1 + PACKET_FANOUT_QM = 0x5 + PACKET_FANOUT_RND = 0x4 + PACKET_FANOUT_ROLLOVER = 0x3 + PACKET_FASTROUTE = 0x6 + PACKET_HDRLEN = 0xb + PACKET_HOST = 0x0 + PACKET_KERNEL = 0x7 + PACKET_LOOPBACK = 0x5 + PACKET_LOSS = 0xe + PACKET_MR_ALLMULTI = 0x2 + PACKET_MR_MULTICAST = 0x0 + PACKET_MR_PROMISC = 0x1 + PACKET_MR_UNICAST = 0x3 + PACKET_MULTICAST = 0x2 + PACKET_ORIGDEV = 0x9 + PACKET_OTHERHOST = 0x3 + PACKET_OUTGOING = 0x4 + PACKET_QDISC_BYPASS = 0x14 + PACKET_RECV_OUTPUT = 0x3 + PACKET_RESERVE = 0xc + PACKET_ROLLOVER_STATS = 0x15 + PACKET_RX_RING = 0x5 + PACKET_STATISTICS = 0x6 + PACKET_TIMESTAMP = 0x11 + PACKET_TX_HAS_OFF = 0x13 + PACKET_TX_RING = 0xd + PACKET_TX_TIMESTAMP = 0x10 + PACKET_USER = 0x6 + PACKET_VERSION = 0xa + PACKET_VNET_HDR = 0xf + PARENB = 0x100 + PARITY_CRC16_PR0 = 0x2 + PARITY_CRC16_PR0_CCITT = 0x4 + PARITY_CRC16_PR1 = 0x3 + PARITY_CRC16_PR1_CCITT = 0x5 + PARITY_CRC32_PR0_CCITT = 0x6 + PARITY_CRC32_PR1_CCITT = 0x7 + PARITY_DEFAULT = 0x0 + PARITY_NONE = 0x1 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_GROWSDOWN = 0x1000000 + PROT_GROWSUP = 0x2000000 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PR_CAPBSET_DROP = 0x18 + PR_CAPBSET_READ = 0x17 + PR_CAP_AMBIENT = 0x2f + PR_CAP_AMBIENT_CLEAR_ALL = 0x4 + PR_CAP_AMBIENT_IS_SET = 0x1 + PR_CAP_AMBIENT_LOWER = 0x3 + PR_CAP_AMBIENT_RAISE = 0x2 + PR_ENDIAN_BIG = 0x0 + PR_ENDIAN_LITTLE = 0x1 + PR_ENDIAN_PPC_LITTLE = 0x2 + PR_FPEMU_NOPRINT = 0x1 + PR_FPEMU_SIGFPE = 0x2 + PR_FP_EXC_ASYNC = 0x2 + PR_FP_EXC_DISABLED = 0x0 + PR_FP_EXC_DIV = 0x10000 + PR_FP_EXC_INV = 0x100000 + PR_FP_EXC_NONRECOV = 0x1 + PR_FP_EXC_OVF = 0x20000 + PR_FP_EXC_PRECISE = 0x3 + PR_FP_EXC_RES = 0x80000 + PR_FP_EXC_SW_ENABLE = 0x80 + PR_FP_EXC_UND = 0x40000 + PR_FP_MODE_FR = 0x1 + PR_FP_MODE_FRE = 0x2 + PR_GET_CHILD_SUBREAPER = 0x25 + PR_GET_DUMPABLE = 0x3 + PR_GET_ENDIAN = 0x13 + PR_GET_FPEMU = 0x9 + PR_GET_FPEXC = 0xb + PR_GET_FP_MODE = 0x2e + PR_GET_KEEPCAPS = 0x7 + PR_GET_NAME = 0x10 + PR_GET_NO_NEW_PRIVS = 0x27 + PR_GET_PDEATHSIG = 0x2 + PR_GET_SECCOMP = 0x15 + PR_GET_SECUREBITS = 0x1b + PR_GET_THP_DISABLE = 0x2a + PR_GET_TID_ADDRESS = 0x28 + PR_GET_TIMERSLACK = 0x1e + PR_GET_TIMING = 0xd + PR_GET_TSC = 0x19 + PR_GET_UNALIGN = 0x5 + PR_MCE_KILL = 0x21 + PR_MCE_KILL_CLEAR = 0x0 + PR_MCE_KILL_DEFAULT = 0x2 + PR_MCE_KILL_EARLY = 0x1 + PR_MCE_KILL_GET = 0x22 + PR_MCE_KILL_LATE = 0x0 + PR_MCE_KILL_SET = 0x1 + PR_MPX_DISABLE_MANAGEMENT = 0x2c + PR_MPX_ENABLE_MANAGEMENT = 0x2b + PR_SET_CHILD_SUBREAPER = 0x24 + PR_SET_DUMPABLE = 0x4 + PR_SET_ENDIAN = 0x14 + PR_SET_FPEMU = 0xa + PR_SET_FPEXC = 0xc + PR_SET_FP_MODE = 0x2d + PR_SET_KEEPCAPS = 0x8 + PR_SET_MM = 0x23 + PR_SET_MM_ARG_END = 0x9 + PR_SET_MM_ARG_START = 0x8 + PR_SET_MM_AUXV = 0xc + PR_SET_MM_BRK = 0x7 + PR_SET_MM_END_CODE = 0x2 + PR_SET_MM_END_DATA = 0x4 + PR_SET_MM_ENV_END = 0xb + PR_SET_MM_ENV_START = 0xa + PR_SET_MM_EXE_FILE = 0xd + PR_SET_MM_MAP = 0xe + PR_SET_MM_MAP_SIZE = 0xf + PR_SET_MM_START_BRK = 0x6 + PR_SET_MM_START_CODE = 0x1 + PR_SET_MM_START_DATA = 0x3 + PR_SET_MM_START_STACK = 0x5 + PR_SET_NAME = 0xf + PR_SET_NO_NEW_PRIVS = 0x26 + PR_SET_PDEATHSIG = 0x1 + PR_SET_PTRACER = 0x59616d61 + PR_SET_PTRACER_ANY = -0x1 + PR_SET_SECCOMP = 0x16 + PR_SET_SECUREBITS = 0x1c + PR_SET_THP_DISABLE = 0x29 + PR_SET_TIMERSLACK = 0x1d + PR_SET_TIMING = 0xe + PR_SET_TSC = 0x1a + PR_SET_UNALIGN = 0x6 + PR_TASK_PERF_EVENTS_DISABLE = 0x1f + PR_TASK_PERF_EVENTS_ENABLE = 0x20 + PR_TIMING_STATISTICAL = 0x0 + PR_TIMING_TIMESTAMP = 0x1 + PR_TSC_ENABLE = 0x1 + PR_TSC_SIGSEGV = 0x2 + PR_UNALIGN_NOPRINT = 0x1 + PR_UNALIGN_SIGBUS = 0x2 + PTRACE_ATTACH = 0x10 + PTRACE_CONT = 0x7 + PTRACE_DETACH = 0x11 + PTRACE_DISABLE_TE = 0x5010 + PTRACE_ENABLE_TE = 0x5009 + PTRACE_EVENT_CLONE = 0x3 + PTRACE_EVENT_EXEC = 0x4 + PTRACE_EVENT_EXIT = 0x6 + PTRACE_EVENT_FORK = 0x1 + PTRACE_EVENT_SECCOMP = 0x7 + PTRACE_EVENT_STOP = 0x80 + PTRACE_EVENT_VFORK = 0x2 + PTRACE_EVENT_VFORK_DONE = 0x5 + PTRACE_GETEVENTMSG = 0x4201 + PTRACE_GETREGS = 0xc + PTRACE_GETREGSET = 0x4204 + PTRACE_GETSIGINFO = 0x4202 + PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_LAST_BREAK = 0x5006 + PTRACE_INTERRUPT = 0x4207 + PTRACE_KILL = 0x8 + PTRACE_LISTEN = 0x4208 + PTRACE_OLDSETOPTIONS = 0x15 + PTRACE_O_EXITKILL = 0x100000 + PTRACE_O_MASK = 0x3000ff + PTRACE_O_SUSPEND_SECCOMP = 0x200000 + PTRACE_O_TRACECLONE = 0x8 + PTRACE_O_TRACEEXEC = 0x10 + PTRACE_O_TRACEEXIT = 0x40 + PTRACE_O_TRACEFORK = 0x2 + PTRACE_O_TRACESECCOMP = 0x80 + PTRACE_O_TRACESYSGOOD = 0x1 + PTRACE_O_TRACEVFORK = 0x4 + PTRACE_O_TRACEVFORKDONE = 0x20 + PTRACE_PEEKDATA = 0x2 + PTRACE_PEEKDATA_AREA = 0x5003 + PTRACE_PEEKSIGINFO = 0x4209 + PTRACE_PEEKSIGINFO_SHARED = 0x1 + PTRACE_PEEKTEXT = 0x1 + PTRACE_PEEKTEXT_AREA = 0x5002 + PTRACE_PEEKUSR = 0x3 + PTRACE_PEEKUSR_AREA = 0x5000 + PTRACE_PEEK_SYSTEM_CALL = 0x5007 + PTRACE_POKEDATA = 0x5 + PTRACE_POKEDATA_AREA = 0x5005 + PTRACE_POKETEXT = 0x4 + PTRACE_POKETEXT_AREA = 0x5004 + PTRACE_POKEUSR = 0x6 + PTRACE_POKEUSR_AREA = 0x5001 + PTRACE_POKE_SYSTEM_CALL = 0x5008 + PTRACE_PROT = 0x15 + PTRACE_SECCOMP_GET_FILTER = 0x420c + PTRACE_SEIZE = 0x4206 + PTRACE_SETOPTIONS = 0x4200 + PTRACE_SETREGS = 0xd + PTRACE_SETREGSET = 0x4205 + PTRACE_SETSIGINFO = 0x4203 + PTRACE_SETSIGMASK = 0x420b + PTRACE_SINGLEBLOCK = 0xc + PTRACE_SINGLESTEP = 0x9 + PTRACE_SYSCALL = 0x18 + PTRACE_TE_ABORT_RAND = 0x5011 + PTRACE_TRACEME = 0x0 + PT_ACR0 = 0x90 + PT_ACR1 = 0x94 + PT_ACR10 = 0xb8 + PT_ACR11 = 0xbc + PT_ACR12 = 0xc0 + PT_ACR13 = 0xc4 + PT_ACR14 = 0xc8 + PT_ACR15 = 0xcc + PT_ACR2 = 0x98 + PT_ACR3 = 0x9c + PT_ACR4 = 0xa0 + PT_ACR5 = 0xa4 + PT_ACR6 = 0xa8 + PT_ACR7 = 0xac + PT_ACR8 = 0xb0 + PT_ACR9 = 0xb4 + PT_CR_10 = 0x168 + PT_CR_11 = 0x170 + PT_CR_9 = 0x160 + PT_ENDREGS = 0x1af + PT_FPC = 0xd8 + PT_FPR0 = 0xe0 + PT_FPR1 = 0xe8 + PT_FPR10 = 0x130 + PT_FPR11 = 0x138 + PT_FPR12 = 0x140 + PT_FPR13 = 0x148 + PT_FPR14 = 0x150 + PT_FPR15 = 0x158 + PT_FPR2 = 0xf0 + PT_FPR3 = 0xf8 + PT_FPR4 = 0x100 + PT_FPR5 = 0x108 + PT_FPR6 = 0x110 + PT_FPR7 = 0x118 + PT_FPR8 = 0x120 + PT_FPR9 = 0x128 + PT_GPR0 = 0x10 + PT_GPR1 = 0x18 + PT_GPR10 = 0x60 + PT_GPR11 = 0x68 + PT_GPR12 = 0x70 + PT_GPR13 = 0x78 + PT_GPR14 = 0x80 + PT_GPR15 = 0x88 + PT_GPR2 = 0x20 + PT_GPR3 = 0x28 + PT_GPR4 = 0x30 + PT_GPR5 = 0x38 + PT_GPR6 = 0x40 + PT_GPR7 = 0x48 + PT_GPR8 = 0x50 + PT_GPR9 = 0x58 + PT_IEEE_IP = 0x1a8 + PT_LASTOFF = 0x1a8 + PT_ORIGGPR2 = 0xd0 + PT_PSWADDR = 0x8 + PT_PSWMASK = 0x0 + RLIMIT_AS = 0x9 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x7 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x1 + RTAX_ADVMSS = 0x8 + RTAX_CC_ALGO = 0x10 + RTAX_CWND = 0x7 + RTAX_FEATURES = 0xc + RTAX_FEATURE_ALLFRAG = 0x8 + RTAX_FEATURE_ECN = 0x1 + RTAX_FEATURE_MASK = 0xf + RTAX_FEATURE_SACK = 0x2 + RTAX_FEATURE_TIMESTAMP = 0x4 + RTAX_HOPLIMIT = 0xa + RTAX_INITCWND = 0xb + RTAX_INITRWND = 0xe + RTAX_LOCK = 0x1 + RTAX_MAX = 0x10 + RTAX_MTU = 0x2 + RTAX_QUICKACK = 0xf + RTAX_REORDERING = 0x9 + RTAX_RTO_MIN = 0xd + RTAX_RTT = 0x4 + RTAX_RTTVAR = 0x5 + RTAX_SSTHRESH = 0x6 + RTAX_UNSPEC = 0x0 + RTAX_WINDOW = 0x3 + RTA_ALIGNTO = 0x4 + RTA_MAX = 0x16 + RTCF_DIRECTSRC = 0x4000000 + RTCF_DOREDIRECT = 0x1000000 + RTCF_LOG = 0x2000000 + RTCF_MASQ = 0x400000 + RTCF_NAT = 0x800000 + RTCF_VALVE = 0x200000 + RTF_ADDRCLASSMASK = 0xf8000000 + RTF_ADDRCONF = 0x40000 + RTF_ALLONLINK = 0x20000 + RTF_BROADCAST = 0x10000000 + RTF_CACHE = 0x1000000 + RTF_DEFAULT = 0x10000 + RTF_DYNAMIC = 0x10 + RTF_FLOW = 0x2000000 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INTERFACE = 0x40000000 + RTF_IRTT = 0x100 + RTF_LINKRT = 0x100000 + RTF_LOCAL = 0x80000000 + RTF_MODIFIED = 0x20 + RTF_MSS = 0x40 + RTF_MTU = 0x40 + RTF_MULTICAST = 0x20000000 + RTF_NAT = 0x8000000 + RTF_NOFORWARD = 0x1000 + RTF_NONEXTHOP = 0x200000 + RTF_NOPMTUDISC = 0x4000 + RTF_POLICY = 0x4000000 + RTF_REINSTATE = 0x8 + RTF_REJECT = 0x200 + RTF_STATIC = 0x400 + RTF_THROW = 0x2000 + RTF_UP = 0x1 + RTF_WINDOW = 0x80 + RTF_XRESOLVE = 0x800 + RTM_BASE = 0x10 + RTM_DELACTION = 0x31 + RTM_DELADDR = 0x15 + RTM_DELADDRLABEL = 0x49 + RTM_DELLINK = 0x11 + RTM_DELMDB = 0x55 + RTM_DELNEIGH = 0x1d + RTM_DELNSID = 0x59 + RTM_DELQDISC = 0x25 + RTM_DELROUTE = 0x19 + RTM_DELRULE = 0x21 + RTM_DELTCLASS = 0x29 + RTM_DELTFILTER = 0x2d + RTM_F_CLONED = 0x200 + RTM_F_EQUALIZE = 0x400 + RTM_F_LOOKUP_TABLE = 0x1000 + RTM_F_NOTIFY = 0x100 + RTM_F_PREFIX = 0x800 + RTM_GETACTION = 0x32 + RTM_GETADDR = 0x16 + RTM_GETADDRLABEL = 0x4a + RTM_GETANYCAST = 0x3e + RTM_GETDCB = 0x4e + RTM_GETLINK = 0x12 + RTM_GETMDB = 0x56 + RTM_GETMULTICAST = 0x3a + RTM_GETNEIGH = 0x1e + RTM_GETNEIGHTBL = 0x42 + RTM_GETNETCONF = 0x52 + RTM_GETNSID = 0x5a + RTM_GETQDISC = 0x26 + RTM_GETROUTE = 0x1a + RTM_GETRULE = 0x22 + RTM_GETTCLASS = 0x2a + RTM_GETTFILTER = 0x2e + RTM_MAX = 0x5b + RTM_NEWACTION = 0x30 + RTM_NEWADDR = 0x14 + RTM_NEWADDRLABEL = 0x48 + RTM_NEWLINK = 0x10 + RTM_NEWMDB = 0x54 + RTM_NEWNDUSEROPT = 0x44 + RTM_NEWNEIGH = 0x1c + RTM_NEWNEIGHTBL = 0x40 + RTM_NEWNETCONF = 0x50 + RTM_NEWNSID = 0x58 + RTM_NEWPREFIX = 0x34 + RTM_NEWQDISC = 0x24 + RTM_NEWROUTE = 0x18 + RTM_NEWRULE = 0x20 + RTM_NEWTCLASS = 0x28 + RTM_NEWTFILTER = 0x2c + RTM_NR_FAMILIES = 0x13 + RTM_NR_MSGTYPES = 0x4c + RTM_SETDCB = 0x4f + RTM_SETLINK = 0x13 + RTM_SETNEIGHTBL = 0x43 + RTNH_ALIGNTO = 0x4 + RTNH_COMPARE_MASK = 0x11 + RTNH_F_DEAD = 0x1 + RTNH_F_LINKDOWN = 0x10 + RTNH_F_OFFLOAD = 0x8 + RTNH_F_ONLINK = 0x4 + RTNH_F_PERVASIVE = 0x2 + RTN_MAX = 0xb + RTPROT_BABEL = 0x2a + RTPROT_BIRD = 0xc + RTPROT_BOOT = 0x3 + RTPROT_DHCP = 0x10 + RTPROT_DNROUTED = 0xd + RTPROT_GATED = 0x8 + RTPROT_KERNEL = 0x2 + RTPROT_MROUTED = 0x11 + RTPROT_MRT = 0xa + RTPROT_NTK = 0xf + RTPROT_RA = 0x9 + RTPROT_REDIRECT = 0x1 + RTPROT_STATIC = 0x4 + RTPROT_UNSPEC = 0x0 + RTPROT_XORP = 0xe + RTPROT_ZEBRA = 0xb + RT_CLASS_DEFAULT = 0xfd + RT_CLASS_LOCAL = 0xff + RT_CLASS_MAIN = 0xfe + RT_CLASS_MAX = 0xff + RT_CLASS_UNSPEC = 0x0 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_CREDENTIALS = 0x2 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x1d + SCM_TIMESTAMPING = 0x25 + SCM_TIMESTAMPNS = 0x23 + SCM_WIFI_STATUS = 0x29 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDDLCI = 0x8980 + SIOCADDMULTI = 0x8931 + SIOCADDRT = 0x890b + SIOCATMARK = 0x8905 + SIOCDARP = 0x8953 + SIOCDELDLCI = 0x8981 + SIOCDELMULTI = 0x8932 + SIOCDELRT = 0x890c + SIOCDEVPRIVATE = 0x89f0 + SIOCDIFADDR = 0x8936 + SIOCDRARP = 0x8960 + SIOCGARP = 0x8954 + SIOCGIFADDR = 0x8915 + SIOCGIFBR = 0x8940 + SIOCGIFBRDADDR = 0x8919 + SIOCGIFCONF = 0x8912 + SIOCGIFCOUNT = 0x8938 + SIOCGIFDSTADDR = 0x8917 + SIOCGIFENCAP = 0x8925 + SIOCGIFFLAGS = 0x8913 + SIOCGIFHWADDR = 0x8927 + SIOCGIFINDEX = 0x8933 + SIOCGIFMAP = 0x8970 + SIOCGIFMEM = 0x891f + SIOCGIFMETRIC = 0x891d + SIOCGIFMTU = 0x8921 + SIOCGIFNAME = 0x8910 + SIOCGIFNETMASK = 0x891b + SIOCGIFPFLAGS = 0x8935 + SIOCGIFSLAVE = 0x8929 + SIOCGIFTXQLEN = 0x8942 + SIOCGPGRP = 0x8904 + SIOCGRARP = 0x8961 + SIOCGSTAMP = 0x8906 + SIOCGSTAMPNS = 0x8907 + SIOCPROTOPRIVATE = 0x89e0 + SIOCRTMSG = 0x890d + SIOCSARP = 0x8955 + SIOCSIFADDR = 0x8916 + SIOCSIFBR = 0x8941 + SIOCSIFBRDADDR = 0x891a + SIOCSIFDSTADDR = 0x8918 + SIOCSIFENCAP = 0x8926 + SIOCSIFFLAGS = 0x8914 + SIOCSIFHWADDR = 0x8924 + SIOCSIFHWBROADCAST = 0x8937 + SIOCSIFLINK = 0x8911 + SIOCSIFMAP = 0x8971 + SIOCSIFMEM = 0x8920 + SIOCSIFMETRIC = 0x891e + SIOCSIFMTU = 0x8922 + SIOCSIFNAME = 0x8923 + SIOCSIFNETMASK = 0x891c + SIOCSIFPFLAGS = 0x8934 + SIOCSIFSLAVE = 0x8930 + SIOCSIFTXQLEN = 0x8943 + SIOCSPGRP = 0x8902 + SIOCSRARP = 0x8962 + SOCK_CLOEXEC = 0x80000 + SOCK_DCCP = 0x6 + SOCK_DGRAM = 0x2 + SOCK_NONBLOCK = 0x800 + SOCK_PACKET = 0xa + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_AAL = 0x109 + SOL_ATM = 0x108 + SOL_DECNET = 0x105 + SOL_ICMPV6 = 0x3a + SOL_IP = 0x0 + SOL_IPV6 = 0x29 + SOL_IRDA = 0x10a + SOL_PACKET = 0x107 + SOL_RAW = 0xff + SOL_SOCKET = 0x1 + SOL_TCP = 0x6 + SOL_X25 = 0x106 + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x1e + SO_ATTACH_BPF = 0x32 + SO_ATTACH_FILTER = 0x1a + SO_BINDTODEVICE = 0x19 + SO_BPF_EXTENSIONS = 0x30 + SO_BROADCAST = 0x6 + SO_BSDCOMPAT = 0xe + SO_BUSY_POLL = 0x2e + SO_DEBUG = 0x1 + SO_DETACH_BPF = 0x1b + SO_DETACH_FILTER = 0x1b + SO_DOMAIN = 0x27 + SO_DONTROUTE = 0x5 + SO_ERROR = 0x4 + SO_GET_FILTER = 0x1a + SO_INCOMING_CPU = 0x31 + SO_KEEPALIVE = 0x9 + SO_LINGER = 0xd + SO_LOCK_FILTER = 0x2c + SO_MARK = 0x24 + SO_MAX_PACING_RATE = 0x2f + SO_NOFCS = 0x2b + SO_NO_CHECK = 0xb + SO_OOBINLINE = 0xa + SO_PASSCRED = 0x10 + SO_PASSSEC = 0x22 + SO_PEEK_OFF = 0x2a + SO_PEERCRED = 0x11 + SO_PEERNAME = 0x1c + SO_PEERSEC = 0x1f + SO_PRIORITY = 0xc + SO_PROTOCOL = 0x26 + SO_RCVBUF = 0x8 + SO_RCVBUFFORCE = 0x21 + SO_RCVLOWAT = 0x12 + SO_RCVTIMEO = 0x14 + SO_REUSEADDR = 0x2 + SO_REUSEPORT = 0xf + SO_RXQ_OVFL = 0x28 + SO_SECURITY_AUTHENTICATION = 0x16 + SO_SECURITY_ENCRYPTION_NETWORK = 0x18 + SO_SECURITY_ENCRYPTION_TRANSPORT = 0x17 + SO_SELECT_ERR_QUEUE = 0x2d + SO_SNDBUF = 0x7 + SO_SNDBUFFORCE = 0x20 + SO_SNDLOWAT = 0x13 + SO_SNDTIMEO = 0x15 + SO_TIMESTAMP = 0x1d + SO_TIMESTAMPING = 0x25 + SO_TIMESTAMPNS = 0x23 + SO_TYPE = 0x3 + SO_WIFI_STATUS = 0x29 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TAB0 = 0x0 + TAB1 = 0x800 + TAB2 = 0x1000 + TAB3 = 0x1800 + TABDLY = 0x1800 + TCFLSH = 0x540b + TCGETA = 0x5405 + TCGETS = 0x5401 + TCGETS2 = 0x802c542a + TCGETX = 0x5432 + TCIFLUSH = 0x0 + TCIOFF = 0x2 + TCIOFLUSH = 0x2 + TCION = 0x3 + TCOFLUSH = 0x1 + TCOOFF = 0x0 + TCOON = 0x1 + TCP_CC_INFO = 0x1a + TCP_CONGESTION = 0xd + TCP_COOKIE_IN_ALWAYS = 0x1 + TCP_COOKIE_MAX = 0x10 + TCP_COOKIE_MIN = 0x8 + TCP_COOKIE_OUT_NEVER = 0x2 + TCP_COOKIE_PAIR_SIZE = 0x20 + TCP_COOKIE_TRANSACTIONS = 0xf + TCP_CORK = 0x3 + TCP_DEFER_ACCEPT = 0x9 + TCP_FASTOPEN = 0x17 + TCP_INFO = 0xb + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x4 + TCP_KEEPINTVL = 0x5 + TCP_LINGER2 = 0x8 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0xe + TCP_MD5SIG_MAXKEYLEN = 0x50 + TCP_MSS = 0x200 + TCP_MSS_DEFAULT = 0x218 + TCP_MSS_DESIRED = 0x4c4 + TCP_NODELAY = 0x1 + TCP_NOTSENT_LOWAT = 0x19 + TCP_QUEUE_SEQ = 0x15 + TCP_QUICKACK = 0xc + TCP_REPAIR = 0x13 + TCP_REPAIR_OPTIONS = 0x16 + TCP_REPAIR_QUEUE = 0x14 + TCP_SAVED_SYN = 0x1c + TCP_SAVE_SYN = 0x1b + TCP_SYNCNT = 0x7 + TCP_S_DATA_IN = 0x4 + TCP_S_DATA_OUT = 0x8 + TCP_THIN_DUPACK = 0x11 + TCP_THIN_LINEAR_TIMEOUTS = 0x10 + TCP_TIMESTAMP = 0x18 + TCP_USER_TIMEOUT = 0x12 + TCP_WINDOW_CLAMP = 0xa + TCSAFLUSH = 0x2 + TCSBRK = 0x5409 + TCSBRKP = 0x5425 + TCSETA = 0x5406 + TCSETAF = 0x5408 + TCSETAW = 0x5407 + TCSETS = 0x5402 + TCSETS2 = 0x402c542b + TCSETSF = 0x5404 + TCSETSF2 = 0x402c542d + TCSETSW = 0x5403 + TCSETSW2 = 0x402c542c + TCSETX = 0x5433 + TCSETXF = 0x5434 + TCSETXW = 0x5435 + TCXONC = 0x540a + TIOCCBRK = 0x5428 + TIOCCONS = 0x541d + TIOCEXCL = 0x540c + TIOCGDEV = 0x80045432 + TIOCGETD = 0x5424 + TIOCGEXCL = 0x80045440 + TIOCGICOUNT = 0x545d + TIOCGLCKTRMIOS = 0x5456 + TIOCGPGRP = 0x540f + TIOCGPKT = 0x80045438 + TIOCGPTLCK = 0x80045439 + TIOCGPTN = 0x80045430 + TIOCGRS485 = 0x542e + TIOCGSERIAL = 0x541e + TIOCGSID = 0x5429 + TIOCGSOFTCAR = 0x5419 + TIOCGWINSZ = 0x5413 + TIOCINQ = 0x541b + TIOCLINUX = 0x541c + TIOCMBIC = 0x5417 + TIOCMBIS = 0x5416 + TIOCMGET = 0x5415 + TIOCMIWAIT = 0x545c + TIOCMSET = 0x5418 + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x5422 + TIOCNXCL = 0x540d + TIOCOUTQ = 0x5411 + TIOCPKT = 0x5420 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCSBRK = 0x5427 + TIOCSCTTY = 0x540e + TIOCSERCONFIG = 0x5453 + TIOCSERGETLSR = 0x5459 + TIOCSERGETMULTI = 0x545a + TIOCSERGSTRUCT = 0x5458 + TIOCSERGWILD = 0x5454 + TIOCSERSETMULTI = 0x545b + TIOCSERSWILD = 0x5455 + TIOCSER_TEMT = 0x1 + TIOCSETD = 0x5423 + TIOCSIG = 0x40045436 + TIOCSLCKTRMIOS = 0x5457 + TIOCSPGRP = 0x5410 + TIOCSPTLCK = 0x40045431 + TIOCSRS485 = 0x542f + TIOCSSERIAL = 0x541f + TIOCSSOFTCAR = 0x541a + TIOCSTI = 0x5412 + TIOCSWINSZ = 0x5414 + TIOCVHANGUP = 0x5437 + TOSTOP = 0x100 + TUNATTACHFILTER = 0x401054d5 + TUNDETACHFILTER = 0x401054d6 + TUNGETFEATURES = 0x800454cf + TUNGETFILTER = 0x801054db + TUNGETIFF = 0x800454d2 + TUNGETSNDBUF = 0x800454d3 + TUNGETVNETBE = 0x800454df + TUNGETVNETHDRSZ = 0x800454d7 + TUNGETVNETLE = 0x800454dd + TUNSETDEBUG = 0x400454c9 + TUNSETGROUP = 0x400454ce + TUNSETIFF = 0x400454ca + TUNSETIFINDEX = 0x400454da + TUNSETLINK = 0x400454cd + TUNSETNOCSUM = 0x400454c8 + TUNSETOFFLOAD = 0x400454d0 + TUNSETOWNER = 0x400454cc + TUNSETPERSIST = 0x400454cb + TUNSETQUEUE = 0x400454d9 + TUNSETSNDBUF = 0x400454d4 + TUNSETTXFILTER = 0x400454d1 + TUNSETVNETBE = 0x400454de + TUNSETVNETHDRSZ = 0x400454d8 + TUNSETVNETLE = 0x400454dc + VDISCARD = 0xd + VEOF = 0x4 + VEOL = 0xb + VEOL2 = 0x10 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMIN = 0x6 + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTOP = 0x9 + VSUSP = 0xa + VSWTC = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WALL = 0x40000000 + WCLONE = 0x80000000 + WCONTINUED = 0x8 + WEXITED = 0x4 + WNOHANG = 0x1 + WNOTHREAD = 0x20000000 + WNOWAIT = 0x1000000 + WORDSIZE = 0x40 + WSTOPPED = 0x2 + WUNTRACED = 0x2 + XCASE = 0x4 + XTABS = 0x1800 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x62) + EADDRNOTAVAIL = syscall.Errno(0x63) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x61) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x72) + EBADE = syscall.Errno(0x34) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x4d) + EBADMSG = syscall.Errno(0x4a) + EBADR = syscall.Errno(0x35) + EBADRQC = syscall.Errno(0x38) + EBADSLT = syscall.Errno(0x39) + EBFONT = syscall.Errno(0x3b) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x7d) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x2c) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x67) + ECONNREFUSED = syscall.Errno(0x6f) + ECONNRESET = syscall.Errno(0x68) + EDEADLK = syscall.Errno(0x23) + EDEADLOCK = syscall.Errno(0x23) + EDESTADDRREQ = syscall.Errno(0x59) + EDOM = syscall.Errno(0x21) + EDOTDOT = syscall.Errno(0x49) + EDQUOT = syscall.Errno(0x7a) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x70) + EHOSTUNREACH = syscall.Errno(0x71) + EHWPOISON = syscall.Errno(0x85) + EIDRM = syscall.Errno(0x2b) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x73) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x6a) + EISDIR = syscall.Errno(0x15) + EISNAM = syscall.Errno(0x78) + EKEYEXPIRED = syscall.Errno(0x7f) + EKEYREJECTED = syscall.Errno(0x81) + EKEYREVOKED = syscall.Errno(0x80) + EL2HLT = syscall.Errno(0x33) + EL2NSYNC = syscall.Errno(0x2d) + EL3HLT = syscall.Errno(0x2e) + EL3RST = syscall.Errno(0x2f) + ELIBACC = syscall.Errno(0x4f) + ELIBBAD = syscall.Errno(0x50) + ELIBEXEC = syscall.Errno(0x53) + ELIBMAX = syscall.Errno(0x52) + ELIBSCN = syscall.Errno(0x51) + ELNRNG = syscall.Errno(0x30) + ELOOP = syscall.Errno(0x28) + EMEDIUMTYPE = syscall.Errno(0x7c) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x5a) + EMULTIHOP = syscall.Errno(0x48) + ENAMETOOLONG = syscall.Errno(0x24) + ENAVAIL = syscall.Errno(0x77) + ENETDOWN = syscall.Errno(0x64) + ENETRESET = syscall.Errno(0x66) + ENETUNREACH = syscall.Errno(0x65) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x37) + ENOBUFS = syscall.Errno(0x69) + ENOCSI = syscall.Errno(0x32) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOKEY = syscall.Errno(0x7e) + ENOLCK = syscall.Errno(0x25) + ENOLINK = syscall.Errno(0x43) + ENOMEDIUM = syscall.Errno(0x7b) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x2a) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x5c) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x26) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x6b) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x27) + ENOTNAM = syscall.Errno(0x76) + ENOTRECOVERABLE = syscall.Errno(0x83) + ENOTSOCK = syscall.Errno(0x58) + ENOTSUP = syscall.Errno(0x5f) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x4c) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x5f) + EOVERFLOW = syscall.Errno(0x4b) + EOWNERDEAD = syscall.Errno(0x82) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x60) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x5d) + EPROTOTYPE = syscall.Errno(0x5b) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x4e) + EREMOTE = syscall.Errno(0x42) + EREMOTEIO = syscall.Errno(0x79) + ERESTART = syscall.Errno(0x55) + ERFKILL = syscall.Errno(0x84) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x6c) + ESOCKTNOSUPPORT = syscall.Errno(0x5e) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x74) + ESTRPIPE = syscall.Errno(0x56) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x6e) + ETOOMANYREFS = syscall.Errno(0x6d) + ETXTBSY = syscall.Errno(0x1a) + EUCLEAN = syscall.Errno(0x75) + EUNATCH = syscall.Errno(0x31) + EUSERS = syscall.Errno(0x57) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x36) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0x7) + SIGCHLD = syscall.Signal(0x11) + SIGCLD = syscall.Signal(0x11) + SIGCONT = syscall.Signal(0x12) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x1d) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x1d) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x1e) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTKFLT = syscall.Signal(0x10) + SIGSTOP = syscall.Signal(0x13) + SIGSYS = syscall.Signal(0x1f) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x14) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGUNUSED = syscall.Signal(0x1f) + SIGURG = syscall.Signal(0x17) + SIGUSR1 = syscall.Signal(0xa) + SIGUSR2 = syscall.Signal(0xc) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "no such device or address", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource temporarily unavailable", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device or resource busy", + 17: "file exists", + 18: "invalid cross-device link", + 19: "no such device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "numerical result out of range", + 35: "resource deadlock avoided", + 36: "file name too long", + 37: "no locks available", + 38: "function not implemented", + 39: "directory not empty", + 40: "too many levels of symbolic links", + 42: "no message of desired type", + 43: "identifier removed", + 44: "channel number out of range", + 45: "level 2 not synchronized", + 46: "level 3 halted", + 47: "level 3 reset", + 48: "link number out of range", + 49: "protocol driver not attached", + 50: "no CSI structure available", + 51: "level 2 halted", + 52: "invalid exchange", + 53: "invalid request descriptor", + 54: "exchange full", + 55: "no anode", + 56: "invalid request code", + 57: "invalid slot", + 59: "bad font file format", + 60: "device not a stream", + 61: "no data available", + 62: "timer expired", + 63: "out of streams resources", + 64: "machine is not on the network", + 65: "package not installed", + 66: "object is remote", + 67: "link has been severed", + 68: "advertise error", + 69: "srmount error", + 70: "communication error on send", + 71: "protocol error", + 72: "multihop attempted", + 73: "RFS specific error", + 74: "bad message", + 75: "value too large for defined data type", + 76: "name not unique on network", + 77: "file descriptor in bad state", + 78: "remote address changed", + 79: "can not access a needed shared library", + 80: "accessing a corrupted shared library", + 81: ".lib section in a.out corrupted", + 82: "attempting to link in too many shared libraries", + 83: "cannot exec a shared library directly", + 84: "invalid or incomplete multibyte or wide character", + 85: "interrupted system call should be restarted", + 86: "streams pipe error", + 87: "too many users", + 88: "socket operation on non-socket", + 89: "destination address required", + 90: "message too long", + 91: "protocol wrong type for socket", + 92: "protocol not available", + 93: "protocol not supported", + 94: "socket type not supported", + 95: "operation not supported", + 96: "protocol family not supported", + 97: "address family not supported by protocol", + 98: "address already in use", + 99: "cannot assign requested address", + 100: "network is down", + 101: "network is unreachable", + 102: "network dropped connection on reset", + 103: "software caused connection abort", + 104: "connection reset by peer", + 105: "no buffer space available", + 106: "transport endpoint is already connected", + 107: "transport endpoint is not connected", + 108: "cannot send after transport endpoint shutdown", + 109: "too many references: cannot splice", + 110: "connection timed out", + 111: "connection refused", + 112: "host is down", + 113: "no route to host", + 114: "operation already in progress", + 115: "operation now in progress", + 116: "stale file handle", + 117: "structure needs cleaning", + 118: "not a XENIX named type file", + 119: "no XENIX semaphores available", + 120: "is a named type file", + 121: "remote I/O error", + 122: "disk quota exceeded", + 123: "no medium found", + 124: "wrong medium type", + 125: "operation canceled", + 126: "required key not available", + 127: "key has expired", + 128: "key has been revoked", + 129: "key was rejected by service", + 130: "owner died", + 131: "state not recoverable", + 132: "operation not possible due to RF-kill", + 133: "memory page has hardware error", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/breakpoint trap", + 6: "aborted", + 7: "bus error", + 8: "floating point exception", + 9: "killed", + 10: "user defined signal 1", + 11: "segmentation fault", + 12: "user defined signal 2", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "stack fault", + 17: "child exited", + 18: "continued", + 19: "stopped (signal)", + 20: "stopped", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "urgent I/O condition", + 24: "CPU time limit exceeded", + 25: "file size limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window changed", + 29: "I/O possible", + 30: "power failure", + 31: "bad system call", +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go new file mode 100644 index 0000000000000000000000000000000000000000..b4338d5f26362f2c5ff3c3896a930d41e9629cdb --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go @@ -0,0 +1,1712 @@ +// mkerrors.sh -m32 +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build 386,netbsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m32 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x1c + AF_BLUETOOTH = 0x1f + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x20 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x23 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OROUTE = 0x11 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x22 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ARCNET = 0x7 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_STRIP = 0x17 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427d + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0084277 + BIOCGETIF = 0x4090426b + BIOCGFEEDBACK = 0x4004427c + BIOCGHDRCMPLT = 0x40044274 + BIOCGRTIMEOUT = 0x400c427b + BIOCGSEESENT = 0x40044278 + BIOCGSTATS = 0x4080426f + BIOCGSTATSOLD = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044276 + BIOCSETF = 0x80084267 + BIOCSETIF = 0x8090426c + BIOCSFEEDBACK = 0x8004427d + BIOCSHDRCMPLT = 0x80044275 + BIOCSRTIMEOUT = 0x800c427a + BIOCSSEESENT = 0x80044279 + BIOCSTCPF = 0x80084272 + BIOCSUDPF = 0x80084273 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALIGNMENT32 = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DFLTBUFSIZE = 0x100000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x1000000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLONE_CSIGNAL = 0xff + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_PID = 0x1000 + CLONE_PTRACE = 0x2000 + CLONE_SIGHAND = 0x800 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CREAD = 0x800 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + CTL_QUERY = -0x2 + DIOCBSFLUSH = 0x20006478 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HDLC = 0x10 + DLT_HHDLC = 0x79 + DLT_HIPPI = 0xf + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RAWAF_MASK = 0x2240000 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMUL_LINUX = 0x1 + EMUL_LINUX32 = 0x5 + EMUL_MAXID = 0x6 + EN_SW_CTL_INF = 0x1000 + EN_SW_CTL_PREC = 0x300 + EN_SW_CTL_ROUND = 0xc00 + EN_SW_DATACHAIN = 0x80 + EN_SW_DENORM = 0x2 + EN_SW_INVOP = 0x1 + EN_SW_OVERFLOW = 0x8 + EN_SW_PRECLOSS = 0x20 + EN_SW_UNDERFLOW = 0x10 + EN_SW_ZERODIV = 0x4 + ETHERCAP_JUMBO_MTU = 0x4 + ETHERCAP_VLAN_HWTAGGING = 0x2 + ETHERCAP_VLAN_MTU = 0x1 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERMTU_JUMBO = 0x2328 + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOWPROTOCOLS = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_LEN = 0x5ee + ETHER_MAX_LEN_JUMBO = 0x233a + ETHER_MIN_LEN = 0x40 + ETHER_PPPOE_ENCAP_LEN = 0x8 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = 0x2 + EVFILT_PROC = 0x4 + EVFILT_READ = 0x0 + EVFILT_SIGNAL = 0x5 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = 0x6 + EVFILT_VNODE = 0x3 + EVFILT_WRITE = 0x1 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x100 + FLUSHO = 0x800000 + F_CLOSEM = 0xa + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xc + F_FSCTL = -0x80000000 + F_FSDIRMASK = 0x70000000 + F_FSIN = 0x10000000 + F_FSINOUT = 0x30000000 + F_FSOUT = 0x20000000 + F_FSPRIV = 0x8000 + F_FSVOID = 0x40000000 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETNOSIGPIPE = 0xd + F_GETOWN = 0x5 + F_MAXFD = 0xb + F_OK = 0x0 + F_PARAM_MASK = 0xfff + F_PARAM_MAX = 0xfff + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETNOSIGPIPE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8f52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf8 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IPV6_ICMP = 0x3a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MOBILE = 0x37 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_VRRP = 0x70 + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_EF = 0x8000 + IP_ERRORMTU = 0x15 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x16 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINFRAGSIZE = 0x45 + IP_MINTTL = 0x18 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x17 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ALIGNMENT_16MB = 0x18000000 + MAP_ALIGNMENT_1TB = 0x28000000 + MAP_ALIGNMENT_256TB = 0x30000000 + MAP_ALIGNMENT_4GB = 0x20000000 + MAP_ALIGNMENT_64KB = 0x10000000 + MAP_ALIGNMENT_64PB = 0x38000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_DEFAULT = 0x1 + MAP_INHERIT_DONATE_COPY = 0x3 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_STACK = 0x2000 + MAP_TRYFIXED = 0x400 + MAP_WIRED = 0x800 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_BCAST = 0x100 + MSG_CMSG_CLOEXEC = 0x800 + MSG_CONTROLMBUF = 0x2000000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_IOVUSRSPACE = 0x4000000 + MSG_LENUSRSPACE = 0x8000000 + MSG_MCAST = 0x200 + MSG_NAMEMBUF = 0x1000000 + MSG_NBIO = 0x1000 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_USERFLAGS = 0xffffff + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x4 + NAME_MAX = 0x1ff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x5 + NET_RT_MAXID = 0x6 + NET_RT_OIFLIST = 0x4 + NET_RT_OOIFLIST = 0x3 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFIOGETBMAP = 0xc004667a + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_ALT_IO = 0x40000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x400000 + O_CREAT = 0x200 + O_DIRECT = 0x80000 + O_DIRECTORY = 0x200000 + O_DSYNC = 0x10000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_NOSIGPIPE = 0x1000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x20000 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PRI_IOFLUSH = 0x7c + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x9 + RTAX_NETMASK = 0x2 + RTAX_TAG = 0x8 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTA_TAG = 0x100 + RTF_ANNOUNCE = 0x20000 + RTF_BLACKHOLE = 0x1000 + RTF_CLONED = 0x2000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_REJECT = 0x8 + RTF_SRC = 0x10000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_CHGADDR = 0x15 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x11 + RTM_IFANNOUNCE = 0x10 + RTM_IFINFO = 0x14 + RTM_LLINFO_UPD = 0x13 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_OIFINFO = 0xf + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_OOIFINFO = 0xe + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_SETGATE = 0x12 + RTM_VERSION = 0x4 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x4 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x8 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80906931 + SIOCADDRT = 0x8030720a + SIOCAIFADDR = 0x8040691a + SIOCALIFADDR = 0x8118691c + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80906932 + SIOCDELRT = 0x8030720b + SIOCDIFADDR = 0x80906919 + SIOCDIFPHYADDR = 0x80906949 + SIOCDLIFADDR = 0x8118691e + SIOCGDRVSPEC = 0xc01c697b + SIOCGETPFSYNC = 0xc09069f8 + SIOCGETSGCNT = 0xc0147534 + SIOCGETVIFCNT = 0xc0147533 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0906921 + SIOCGIFADDRPREF = 0xc0946920 + SIOCGIFALIAS = 0xc040691b + SIOCGIFBRDADDR = 0xc0906923 + SIOCGIFCAP = 0xc0206976 + SIOCGIFCONF = 0xc0086926 + SIOCGIFDATA = 0xc0946985 + SIOCGIFDLT = 0xc0906977 + SIOCGIFDSTADDR = 0xc0906922 + SIOCGIFFLAGS = 0xc0906911 + SIOCGIFGENERIC = 0xc090693a + SIOCGIFMEDIA = 0xc0286936 + SIOCGIFMETRIC = 0xc0906917 + SIOCGIFMTU = 0xc090697e + SIOCGIFNETMASK = 0xc0906925 + SIOCGIFPDSTADDR = 0xc0906948 + SIOCGIFPSRCADDR = 0xc0906947 + SIOCGLIFADDR = 0xc118691d + SIOCGLIFPHYADDR = 0xc118694b + SIOCGLINKSTR = 0xc01c6987 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGVH = 0xc0906983 + SIOCIFCREATE = 0x8090697a + SIOCIFDESTROY = 0x80906979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCINITIFADDR = 0xc0446984 + SIOCSDRVSPEC = 0x801c697b + SIOCSETPFSYNC = 0x809069f7 + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8090690c + SIOCSIFADDRPREF = 0x8094691f + SIOCSIFBRDADDR = 0x80906913 + SIOCSIFCAP = 0x80206975 + SIOCSIFDSTADDR = 0x8090690e + SIOCSIFFLAGS = 0x80906910 + SIOCSIFGENERIC = 0x80906939 + SIOCSIFMEDIA = 0xc0906935 + SIOCSIFMETRIC = 0x80906918 + SIOCSIFMTU = 0x8090697f + SIOCSIFNETMASK = 0x80906916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSLIFPHYADDR = 0x8118694a + SIOCSLINKSTR = 0x801c6988 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSVH = 0xc0906982 + SIOCZIFDATA = 0xc0946986 + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_FLAGS_MASK = 0xf0000000 + SOCK_NONBLOCK = 0x20000000 + SOCK_NOSIGPIPE = 0x40000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NOHEADER = 0x100a + SO_NOSIGPIPE = 0x800 + SO_OOBINLINE = 0x100 + SO_OVERFLOWED = 0x1009 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x100c + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x100b + SO_TIMESTAMP = 0x2000 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SYSCTL_VERSION = 0x1000000 + SYSCTL_VERS_0 = 0x0 + SYSCTL_VERS_1 = 0x1000000 + SYSCTL_VERS_MASK = 0xff000000 + S_ARCH1 = 0x10000 + S_ARCH2 = 0x20000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + S_LOGIN_SET = 0x1 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_CONGCTL = 0x20 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x3 + TCP_KEEPINIT = 0x7 + TCP_KEEPINTVL = 0x5 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x400c7458 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CDTRCTS = 0x10 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGLINED = 0x40207442 + TIOCGPGRP = 0x40047477 + TIOCGQSIZE = 0x40047481 + TIOCGRANTPT = 0x20007447 + TIOCGSID = 0x40047463 + TIOCGSIZE = 0x40087468 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMGET = 0x40287446 + TIOCPTSNAME = 0x40287448 + TIOCRCVFRAME = 0x80047445 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x2000745f + TIOCSLINED = 0x80207443 + TIOCSPGRP = 0x80047476 + TIOCSQSIZE = 0x80047480 + TIOCSSIZE = 0x80087467 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TIOCXMTFRAME = 0x80047444 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALL = 0x8 + WALLSIG = 0x8 + WALTSIG = 0x4 + WCLONE = 0x4 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WNOWAIT = 0x10000 + WNOZOMBIE = 0x20000 + WOPTSCHECKED = 0x40000 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x58) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x57) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x55) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5e) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x59) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x5a) + ENOSTR = syscall.Errno(0x5b) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x56) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x60) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x5c) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x20) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large or too small", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol option not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "connection timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "identifier removed", + 83: "no message of desired type", + 84: "value too large to be stored in data type", + 85: "illegal byte sequence", + 86: "not supported", + 87: "operation Canceled", + 88: "bad or Corrupt message", + 89: "no message available", + 90: "no STREAM resources", + 91: "not a STREAM", + 92: "STREAM ioctl timeout", + 93: "attribute not found", + 94: "multihop attempted", + 95: "link has been severed", + 96: "protocol error", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "stopped (signal)", + 18: "stopped", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", + 32: "power fail/restart", +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..4994437b63d02400c50204911f1f5988258787a9 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go @@ -0,0 +1,1702 @@ +// mkerrors.sh -m64 +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build amd64,netbsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x1c + AF_BLUETOOTH = 0x1f + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x20 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x23 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OROUTE = 0x11 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x22 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ARCNET = 0x7 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_STRIP = 0x17 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427d + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0104277 + BIOCGETIF = 0x4090426b + BIOCGFEEDBACK = 0x4004427c + BIOCGHDRCMPLT = 0x40044274 + BIOCGRTIMEOUT = 0x4010427b + BIOCGSEESENT = 0x40044278 + BIOCGSTATS = 0x4080426f + BIOCGSTATSOLD = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044276 + BIOCSETF = 0x80104267 + BIOCSETIF = 0x8090426c + BIOCSFEEDBACK = 0x8004427d + BIOCSHDRCMPLT = 0x80044275 + BIOCSRTIMEOUT = 0x8010427a + BIOCSSEESENT = 0x80044279 + BIOCSTCPF = 0x80104272 + BIOCSUDPF = 0x80104273 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x8 + BPF_ALIGNMENT32 = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DFLTBUFSIZE = 0x100000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x1000000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CLONE_CSIGNAL = 0xff + CLONE_FILES = 0x400 + CLONE_FS = 0x200 + CLONE_PID = 0x1000 + CLONE_PTRACE = 0x2000 + CLONE_SIGHAND = 0x800 + CLONE_VFORK = 0x4000 + CLONE_VM = 0x100 + CREAD = 0x800 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + CTL_QUERY = -0x2 + DIOCBSFLUSH = 0x20006478 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HDLC = 0x10 + DLT_HHDLC = 0x79 + DLT_HIPPI = 0xf + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RAWAF_MASK = 0x2240000 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMUL_LINUX = 0x1 + EMUL_LINUX32 = 0x5 + EMUL_MAXID = 0x6 + ETHERCAP_JUMBO_MTU = 0x4 + ETHERCAP_VLAN_HWTAGGING = 0x2 + ETHERCAP_VLAN_MTU = 0x1 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERMTU_JUMBO = 0x2328 + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOWPROTOCOLS = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_LEN = 0x5ee + ETHER_MAX_LEN_JUMBO = 0x233a + ETHER_MIN_LEN = 0x40 + ETHER_PPPOE_ENCAP_LEN = 0x8 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = 0x2 + EVFILT_PROC = 0x4 + EVFILT_READ = 0x0 + EVFILT_SIGNAL = 0x5 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = 0x6 + EVFILT_VNODE = 0x3 + EVFILT_WRITE = 0x1 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x100 + FLUSHO = 0x800000 + F_CLOSEM = 0xa + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xc + F_FSCTL = -0x80000000 + F_FSDIRMASK = 0x70000000 + F_FSIN = 0x10000000 + F_FSINOUT = 0x30000000 + F_FSOUT = 0x20000000 + F_FSPRIV = 0x8000 + F_FSVOID = 0x40000000 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETNOSIGPIPE = 0xd + F_GETOWN = 0x5 + F_MAXFD = 0xb + F_OK = 0x0 + F_PARAM_MASK = 0xfff + F_PARAM_MAX = 0xfff + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETNOSIGPIPE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8f52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf8 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IPV6_ICMP = 0x3a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MOBILE = 0x37 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_VRRP = 0x70 + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_EF = 0x8000 + IP_ERRORMTU = 0x15 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x16 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINFRAGSIZE = 0x45 + IP_MINTTL = 0x18 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x17 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ALIGNMENT_16MB = 0x18000000 + MAP_ALIGNMENT_1TB = 0x28000000 + MAP_ALIGNMENT_256TB = 0x30000000 + MAP_ALIGNMENT_4GB = 0x20000000 + MAP_ALIGNMENT_64KB = 0x10000000 + MAP_ALIGNMENT_64PB = 0x38000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_DEFAULT = 0x1 + MAP_INHERIT_DONATE_COPY = 0x3 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_STACK = 0x2000 + MAP_TRYFIXED = 0x400 + MAP_WIRED = 0x800 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_BCAST = 0x100 + MSG_CMSG_CLOEXEC = 0x800 + MSG_CONTROLMBUF = 0x2000000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_IOVUSRSPACE = 0x4000000 + MSG_LENUSRSPACE = 0x8000000 + MSG_MCAST = 0x200 + MSG_NAMEMBUF = 0x1000000 + MSG_NBIO = 0x1000 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_USERFLAGS = 0xffffff + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_SYNC = 0x4 + NAME_MAX = 0x1ff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x5 + NET_RT_MAXID = 0x6 + NET_RT_OIFLIST = 0x4 + NET_RT_OOIFLIST = 0x3 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFIOGETBMAP = 0xc004667a + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_ALT_IO = 0x40000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x400000 + O_CREAT = 0x200 + O_DIRECT = 0x80000 + O_DIRECTORY = 0x200000 + O_DSYNC = 0x10000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_NOSIGPIPE = 0x1000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x20000 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PRI_IOFLUSH = 0x7c + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x9 + RTAX_NETMASK = 0x2 + RTAX_TAG = 0x8 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTA_TAG = 0x100 + RTF_ANNOUNCE = 0x20000 + RTF_BLACKHOLE = 0x1000 + RTF_CLONED = 0x2000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_REJECT = 0x8 + RTF_SRC = 0x10000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_CHGADDR = 0x15 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x11 + RTM_IFANNOUNCE = 0x10 + RTM_IFINFO = 0x14 + RTM_LLINFO_UPD = 0x13 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_OIFINFO = 0xf + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_OOIFINFO = 0xe + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_SETGATE = 0x12 + RTM_VERSION = 0x4 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x4 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x8 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80906931 + SIOCADDRT = 0x8038720a + SIOCAIFADDR = 0x8040691a + SIOCALIFADDR = 0x8118691c + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80906932 + SIOCDELRT = 0x8038720b + SIOCDIFADDR = 0x80906919 + SIOCDIFPHYADDR = 0x80906949 + SIOCDLIFADDR = 0x8118691e + SIOCGDRVSPEC = 0xc028697b + SIOCGETPFSYNC = 0xc09069f8 + SIOCGETSGCNT = 0xc0207534 + SIOCGETVIFCNT = 0xc0287533 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0906921 + SIOCGIFADDRPREF = 0xc0986920 + SIOCGIFALIAS = 0xc040691b + SIOCGIFBRDADDR = 0xc0906923 + SIOCGIFCAP = 0xc0206976 + SIOCGIFCONF = 0xc0106926 + SIOCGIFDATA = 0xc0986985 + SIOCGIFDLT = 0xc0906977 + SIOCGIFDSTADDR = 0xc0906922 + SIOCGIFFLAGS = 0xc0906911 + SIOCGIFGENERIC = 0xc090693a + SIOCGIFMEDIA = 0xc0306936 + SIOCGIFMETRIC = 0xc0906917 + SIOCGIFMTU = 0xc090697e + SIOCGIFNETMASK = 0xc0906925 + SIOCGIFPDSTADDR = 0xc0906948 + SIOCGIFPSRCADDR = 0xc0906947 + SIOCGLIFADDR = 0xc118691d + SIOCGLIFPHYADDR = 0xc118694b + SIOCGLINKSTR = 0xc0286987 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGVH = 0xc0906983 + SIOCIFCREATE = 0x8090697a + SIOCIFDESTROY = 0x80906979 + SIOCIFGCLONERS = 0xc0106978 + SIOCINITIFADDR = 0xc0706984 + SIOCSDRVSPEC = 0x8028697b + SIOCSETPFSYNC = 0x809069f7 + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8090690c + SIOCSIFADDRPREF = 0x8098691f + SIOCSIFBRDADDR = 0x80906913 + SIOCSIFCAP = 0x80206975 + SIOCSIFDSTADDR = 0x8090690e + SIOCSIFFLAGS = 0x80906910 + SIOCSIFGENERIC = 0x80906939 + SIOCSIFMEDIA = 0xc0906935 + SIOCSIFMETRIC = 0x80906918 + SIOCSIFMTU = 0x8090697f + SIOCSIFNETMASK = 0x80906916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSLIFPHYADDR = 0x8118694a + SIOCSLINKSTR = 0x80286988 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSVH = 0xc0906982 + SIOCZIFDATA = 0xc0986986 + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_FLAGS_MASK = 0xf0000000 + SOCK_NONBLOCK = 0x20000000 + SOCK_NOSIGPIPE = 0x40000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NOHEADER = 0x100a + SO_NOSIGPIPE = 0x800 + SO_OOBINLINE = 0x100 + SO_OVERFLOWED = 0x1009 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x100c + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x100b + SO_TIMESTAMP = 0x2000 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SYSCTL_VERSION = 0x1000000 + SYSCTL_VERS_0 = 0x0 + SYSCTL_VERS_1 = 0x1000000 + SYSCTL_VERS_MASK = 0xff000000 + S_ARCH1 = 0x10000 + S_ARCH2 = 0x20000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + S_LOGIN_SET = 0x1 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_CONGCTL = 0x20 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x3 + TCP_KEEPINIT = 0x7 + TCP_KEEPINTVL = 0x5 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x40107458 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CDTRCTS = 0x10 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGLINED = 0x40207442 + TIOCGPGRP = 0x40047477 + TIOCGQSIZE = 0x40047481 + TIOCGRANTPT = 0x20007447 + TIOCGSID = 0x40047463 + TIOCGSIZE = 0x40087468 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMGET = 0x40287446 + TIOCPTSNAME = 0x40287448 + TIOCRCVFRAME = 0x80087445 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x2000745f + TIOCSLINED = 0x80207443 + TIOCSPGRP = 0x80047476 + TIOCSQSIZE = 0x80047480 + TIOCSSIZE = 0x80087467 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TIOCXMTFRAME = 0x80087444 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALL = 0x8 + WALLSIG = 0x8 + WALTSIG = 0x4 + WCLONE = 0x4 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WNOWAIT = 0x10000 + WNOZOMBIE = 0x20000 + WOPTSCHECKED = 0x40000 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x58) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x57) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x55) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5e) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x59) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x5a) + ENOSTR = syscall.Errno(0x5b) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x56) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x60) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x5c) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x20) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large or too small", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol option not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "connection timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "identifier removed", + 83: "no message of desired type", + 84: "value too large to be stored in data type", + 85: "illegal byte sequence", + 86: "not supported", + 87: "operation Canceled", + 88: "bad or Corrupt message", + 89: "no message available", + 90: "no STREAM resources", + 91: "not a STREAM", + 92: "STREAM ioctl timeout", + 93: "attribute not found", + 94: "multihop attempted", + 95: "link has been severed", + 96: "protocol error", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "stopped (signal)", + 18: "stopped", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", + 32: "power fail/restart", +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go new file mode 100644 index 0000000000000000000000000000000000000000..ac85ca6452953fd888e0319e02272e71fb25d9e5 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go @@ -0,0 +1,1688 @@ +// mkerrors.sh -marm +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build arm,netbsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -marm _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_ARP = 0x1c + AF_BLUETOOTH = 0x1f + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_HYLINK = 0xf + AF_IEEE80211 = 0x20 + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x23 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OROUTE = 0x11 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x22 + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ARCNET = 0x7 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + ARPHRD_STRIP = 0x17 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B460800 = 0x70800 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B921600 = 0xe1000 + B9600 = 0x2580 + BIOCFEEDBACK = 0x8004427d + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc0084277 + BIOCGETIF = 0x4090426b + BIOCGFEEDBACK = 0x4004427c + BIOCGHDRCMPLT = 0x40044274 + BIOCGRTIMEOUT = 0x400c427b + BIOCGSEESENT = 0x40044278 + BIOCGSTATS = 0x4080426f + BIOCGSTATSOLD = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDLT = 0x80044276 + BIOCSETF = 0x80084267 + BIOCSETIF = 0x8090426c + BIOCSFEEDBACK = 0x8004427d + BIOCSHDRCMPLT = 0x80044275 + BIOCSRTIMEOUT = 0x800c427a + BIOCSSEESENT = 0x80044279 + BIOCSTCPF = 0x80084272 + BIOCSUDPF = 0x80084273 + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALIGNMENT32 = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DFLTBUFSIZE = 0x100000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x1000000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CREAD = 0x800 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + CTL_QUERY = -0x2 + DIOCBSFLUSH = 0x20006478 + DLT_A429 = 0xb8 + DLT_A653_ICM = 0xb9 + DLT_AIRONET_HEADER = 0x78 + DLT_AOS = 0xde + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_AX25_KISS = 0xca + DLT_BACNET_MS_TP = 0xa5 + DLT_BLUETOOTH_HCI_H4 = 0xbb + DLT_BLUETOOTH_HCI_H4_WITH_PHDR = 0xc9 + DLT_CAN20B = 0xbe + DLT_CAN_SOCKETCAN = 0xe3 + DLT_CHAOS = 0x5 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_C_HDLC_WITH_DIR = 0xcd + DLT_DECT = 0xdd + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF = 0xc5 + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FC_2 = 0xe0 + DLT_FC_2_WITH_FRAME_DELIMS = 0xe1 + DLT_FDDI = 0xa + DLT_FLEXRAY = 0xd2 + DLT_FRELAY = 0x6b + DLT_FRELAY_WITH_DIR = 0xce + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_GSMTAP_ABIS = 0xda + DLT_GSMTAP_UM = 0xd9 + DLT_HDLC = 0x10 + DLT_HHDLC = 0x79 + DLT_HIPPI = 0xf + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IEEE802_15_4 = 0xc3 + DLT_IEEE802_15_4_LINUX = 0xbf + DLT_IEEE802_15_4_NONASK_PHY = 0xd7 + DLT_IEEE802_16_MAC_CPS = 0xbc + DLT_IEEE802_16_MAC_CPS_RADIO = 0xc1 + DLT_IPMB = 0xc7 + DLT_IPMB_LINUX = 0xd1 + DLT_IPNET = 0xe2 + DLT_IPV4 = 0xe4 + DLT_IPV6 = 0xe5 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_ISM = 0xc2 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_JUNIPER_ST = 0xc8 + DLT_JUNIPER_VP = 0xb7 + DLT_LAPB_WITH_DIR = 0xcf + DLT_LAPD = 0xcb + DLT_LIN = 0xd4 + DLT_LINUX_EVDEV = 0xd8 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MFR = 0xb6 + DLT_MOST = 0xd3 + DLT_MPLS = 0xdb + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPI = 0xc0 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_ETHER = 0x33 + DLT_PPP_PPPD = 0xa6 + DLT_PPP_SERIAL = 0x32 + DLT_PPP_WITH_DIR = 0xcc + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAIF1 = 0xc6 + DLT_RAW = 0xc + DLT_RAWAF_MASK = 0x2240000 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SITA = 0xc4 + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + DLT_USB = 0xba + DLT_USB_LINUX = 0xbd + DLT_USB_LINUX_MMAPPED = 0xdc + DLT_WIHART = 0xdf + DLT_X2E_SERIAL = 0xd5 + DLT_X2E_XORAYA = 0xd6 + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + DT_WHT = 0xe + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMUL_LINUX = 0x1 + EMUL_LINUX32 = 0x5 + EMUL_MAXID = 0x6 + ETHERCAP_JUMBO_MTU = 0x4 + ETHERCAP_VLAN_HWTAGGING = 0x2 + ETHERCAP_VLAN_MTU = 0x1 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERMTU_JUMBO = 0x2328 + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOWPROTOCOLS = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_LEN = 0x5ee + ETHER_MAX_LEN_JUMBO = 0x233a + ETHER_MIN_LEN = 0x40 + ETHER_PPPOE_ENCAP_LEN = 0x8 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = 0x2 + EVFILT_PROC = 0x4 + EVFILT_READ = 0x0 + EVFILT_SIGNAL = 0x5 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = 0x6 + EVFILT_VNODE = 0x3 + EVFILT_WRITE = 0x1 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x100 + FLUSHO = 0x800000 + F_CLOSEM = 0xa + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xc + F_FSCTL = -0x80000000 + F_FSDIRMASK = 0x70000000 + F_FSIN = 0x10000000 + F_FSINOUT = 0x30000000 + F_FSOUT = 0x20000000 + F_FSPRIV = 0x8000 + F_FSVOID = 0x40000000 + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETNOSIGPIPE = 0xd + F_GETOWN = 0x5 + F_MAXFD = 0xb + F_OK = 0x0 + F_PARAM_MASK = 0xfff + F_PARAM_MAX = 0xfff + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETNOSIGPIPE = 0xe + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8f52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf8 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf2 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf1 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_STF = 0xd7 + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_IPV6_ICMP = 0x3a + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x34 + IPPROTO_MOBILE = 0x37 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPPROTO_VRRP = 0x70 + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPSEC_POLICY = 0x1c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_PATHMTU = 0x2c + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DROP_MEMBERSHIP = 0xd + IP_EF = 0x8000 + IP_ERRORMTU = 0x15 + IP_HDRINCL = 0x2 + IP_IPSEC_POLICY = 0x16 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0x14 + IP_MF = 0x2000 + IP_MINFRAGSIZE = 0x45 + IP_MINTTL = 0x18 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x14 + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVTTL = 0x17 + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ALIGNMENT_16MB = 0x18000000 + MAP_ALIGNMENT_1TB = 0x28000000 + MAP_ALIGNMENT_256TB = 0x30000000 + MAP_ALIGNMENT_4GB = 0x20000000 + MAP_ALIGNMENT_64KB = 0x10000000 + MAP_ALIGNMENT_64PB = 0x38000000 + MAP_ALIGNMENT_MASK = -0x1000000 + MAP_ALIGNMENT_SHIFT = 0x18 + MAP_ANON = 0x1000 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_DEFAULT = 0x1 + MAP_INHERIT_DONATE_COPY = 0x3 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_STACK = 0x2000 + MAP_TRYFIXED = 0x400 + MAP_WIRED = 0x800 + MSG_BCAST = 0x100 + MSG_CMSG_CLOEXEC = 0x800 + MSG_CONTROLMBUF = 0x2000000 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_IOVUSRSPACE = 0x4000000 + MSG_LENUSRSPACE = 0x8000000 + MSG_MCAST = 0x200 + MSG_NAMEMBUF = 0x1000000 + MSG_NBIO = 0x1000 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_USERFLAGS = 0xffffff + MSG_WAITALL = 0x40 + NAME_MAX = 0x1ff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x5 + NET_RT_MAXID = 0x6 + NET_RT_OIFLIST = 0x4 + NET_RT_OOIFLIST = 0x3 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + OFIOGETBMAP = 0xc004667a + ONLCR = 0x2 + ONLRET = 0x40 + ONOCR = 0x20 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_ALT_IO = 0x40000 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x400000 + O_CREAT = 0x200 + O_DIRECT = 0x80000 + O_DIRECTORY = 0x200000 + O_DSYNC = 0x10000 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_NOSIGPIPE = 0x1000000 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x20000 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PRI_IOFLUSH = 0x7c + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + RLIMIT_AS = 0xa + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x9 + RTAX_NETMASK = 0x2 + RTAX_TAG = 0x8 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTA_TAG = 0x100 + RTF_ANNOUNCE = 0x20000 + RTF_BLACKHOLE = 0x1000 + RTF_CLONED = 0x2000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_REJECT = 0x8 + RTF_SRC = 0x10000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_CHGADDR = 0x15 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_GET = 0x4 + RTM_IEEE80211 = 0x11 + RTM_IFANNOUNCE = 0x10 + RTM_IFINFO = 0x14 + RTM_LLINFO_UPD = 0x13 + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_OIFINFO = 0xf + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_OOIFINFO = 0xe + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_SETGATE = 0x12 + RTM_VERSION = 0x4 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_CREDS = 0x4 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x8 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80906931 + SIOCADDRT = 0x8030720a + SIOCAIFADDR = 0x8040691a + SIOCALIFADDR = 0x8118691c + SIOCATMARK = 0x40047307 + SIOCDELMULTI = 0x80906932 + SIOCDELRT = 0x8030720b + SIOCDIFADDR = 0x80906919 + SIOCDIFPHYADDR = 0x80906949 + SIOCDLIFADDR = 0x8118691e + SIOCGDRVSPEC = 0xc01c697b + SIOCGETPFSYNC = 0xc09069f8 + SIOCGETSGCNT = 0xc0147534 + SIOCGETVIFCNT = 0xc0147533 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0906921 + SIOCGIFADDRPREF = 0xc0946920 + SIOCGIFALIAS = 0xc040691b + SIOCGIFBRDADDR = 0xc0906923 + SIOCGIFCAP = 0xc0206976 + SIOCGIFCONF = 0xc0086926 + SIOCGIFDATA = 0xc0946985 + SIOCGIFDLT = 0xc0906977 + SIOCGIFDSTADDR = 0xc0906922 + SIOCGIFFLAGS = 0xc0906911 + SIOCGIFGENERIC = 0xc090693a + SIOCGIFMEDIA = 0xc0286936 + SIOCGIFMETRIC = 0xc0906917 + SIOCGIFMTU = 0xc090697e + SIOCGIFNETMASK = 0xc0906925 + SIOCGIFPDSTADDR = 0xc0906948 + SIOCGIFPSRCADDR = 0xc0906947 + SIOCGLIFADDR = 0xc118691d + SIOCGLIFPHYADDR = 0xc118694b + SIOCGLINKSTR = 0xc01c6987 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGVH = 0xc0906983 + SIOCIFCREATE = 0x8090697a + SIOCIFDESTROY = 0x80906979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCINITIFADDR = 0xc0446984 + SIOCSDRVSPEC = 0x801c697b + SIOCSETPFSYNC = 0x809069f7 + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8090690c + SIOCSIFADDRPREF = 0x8094691f + SIOCSIFBRDADDR = 0x80906913 + SIOCSIFCAP = 0x80206975 + SIOCSIFDSTADDR = 0x8090690e + SIOCSIFFLAGS = 0x80906910 + SIOCSIFGENERIC = 0x80906939 + SIOCSIFMEDIA = 0xc0906935 + SIOCSIFMETRIC = 0x80906918 + SIOCSIFMTU = 0x8090697f + SIOCSIFNETMASK = 0x80906916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSLIFPHYADDR = 0x8118694a + SIOCSLINKSTR = 0x801c6988 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSVH = 0xc0906982 + SIOCZIFDATA = 0xc0946986 + SOCK_CLOEXEC = 0x10000000 + SOCK_DGRAM = 0x2 + SOCK_FLAGS_MASK = 0xf0000000 + SOCK_NONBLOCK = 0x20000000 + SOCK_NOSIGPIPE = 0x40000000 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ACCEPTFILTER = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NOHEADER = 0x100a + SO_NOSIGPIPE = 0x800 + SO_OOBINLINE = 0x100 + SO_OVERFLOWED = 0x1009 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x100c + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x100b + SO_TIMESTAMP = 0x2000 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SYSCTL_VERSION = 0x1000000 + SYSCTL_VERS_0 = 0x0 + SYSCTL_VERS_1 = 0x1000000 + SYSCTL_VERS_MASK = 0xff000000 + S_ARCH1 = 0x10000 + S_ARCH2 = 0x20000 + S_BLKSIZE = 0x200 + S_IEXEC = 0x40 + S_IFBLK = 0x6000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFIFO = 0x1000 + S_IFLNK = 0xa000 + S_IFMT = 0xf000 + S_IFREG = 0x8000 + S_IFSOCK = 0xc000 + S_IFWHT = 0xe000 + S_IREAD = 0x100 + S_IRGRP = 0x20 + S_IROTH = 0x4 + S_IRUSR = 0x100 + S_IRWXG = 0x38 + S_IRWXO = 0x7 + S_IRWXU = 0x1c0 + S_ISGID = 0x400 + S_ISTXT = 0x200 + S_ISUID = 0x800 + S_ISVTX = 0x200 + S_IWGRP = 0x10 + S_IWOTH = 0x2 + S_IWRITE = 0x80 + S_IWUSR = 0x80 + S_IXGRP = 0x8 + S_IXOTH = 0x1 + S_IXUSR = 0x40 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_CONGCTL = 0x20 + TCP_KEEPCNT = 0x6 + TCP_KEEPIDLE = 0x3 + TCP_KEEPINIT = 0x7 + TCP_KEEPINTVL = 0x5 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x10 + TCP_MINMSS = 0xd8 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDCDTIMESTAMP = 0x400c7458 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CDTRCTS = 0x10 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGLINED = 0x40207442 + TIOCGPGRP = 0x40047477 + TIOCGQSIZE = 0x40047481 + TIOCGRANTPT = 0x20007447 + TIOCGSID = 0x40047463 + TIOCGSIZE = 0x40087468 + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCPTMGET = 0x48087446 + TIOCPTSNAME = 0x48087448 + TIOCRCVFRAME = 0x80047445 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x2000745f + TIOCSLINED = 0x80207443 + TIOCSPGRP = 0x80047476 + TIOCSQSIZE = 0x80047480 + TIOCSSIZE = 0x80087467 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TIOCXMTFRAME = 0x80047444 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALL = 0x8 + WALLSIG = 0x8 + WALTSIG = 0x4 + WCLONE = 0x4 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WNOWAIT = 0x10000 + WNOZOMBIE = 0x20000 + WOPTSCHECKED = 0x40000 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADMSG = syscall.Errno(0x58) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x57) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x52) + EILSEQ = syscall.Errno(0x55) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x60) + ELOOP = syscall.Errno(0x3e) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + EMULTIHOP = syscall.Errno(0x5e) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x5d) + ENOBUFS = syscall.Errno(0x37) + ENODATA = syscall.Errno(0x59) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOLINK = syscall.Errno(0x5f) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x53) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x5a) + ENOSTR = syscall.Errno(0x5b) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x56) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x54) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTO = syscall.Errno(0x60) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIME = syscall.Errno(0x5c) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGPWR = syscall.Signal(0x20) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large or too small", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol option not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "connection timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "identifier removed", + 83: "no message of desired type", + 84: "value too large to be stored in data type", + 85: "illegal byte sequence", + 86: "not supported", + 87: "operation Canceled", + 88: "bad or Corrupt message", + 89: "no message available", + 90: "no STREAM resources", + 91: "not a STREAM", + 92: "STREAM ioctl timeout", + 93: "attribute not found", + 94: "multihop attempted", + 95: "link has been severed", + 96: "protocol error", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "stopped (signal)", + 18: "stopped", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", + 32: "power fail/restart", +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go new file mode 100644 index 0000000000000000000000000000000000000000..3322e998d3012d7ad60cdafc21bb5ec50328964d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go @@ -0,0 +1,1584 @@ +// mkerrors.sh -m32 +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build 386,openbsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m32 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_BLUETOOTH = 0x20 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_ENCAP = 0x1c + AF_HYLINK = 0xf + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_KEY = 0x1e + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x24 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SIP = 0x1d + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRFILT = 0x4004427c + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc008427b + BIOCGETIF = 0x4020426b + BIOCGFILDROP = 0x40044278 + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044273 + BIOCGRTIMEOUT = 0x400c426e + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x20004276 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDIRFILT = 0x8004427d + BIOCSDLT = 0x8004427a + BIOCSETF = 0x80084267 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x80084277 + BIOCSFILDROP = 0x80044279 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044272 + BIOCSRTIMEOUT = 0x800c426d + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIRECTION_IN = 0x1 + BPF_DIRECTION_OUT = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x200000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CREAD = 0x800 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0xff + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DIOCOSFPFLUSH = 0x2000444e + DLT_ARCNET = 0x7 + DLT_ATM_RFC1483 = 0xb + DLT_AX25 = 0x3 + DLT_CHAOS = 0x5 + DLT_C_HDLC = 0x68 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0xd + DLT_FDDI = 0xa + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_LOOP = 0xc + DLT_MPLS = 0xdb + DLT_NULL = 0x0 + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_SERIAL = 0x32 + DLT_PRONET = 0x4 + DLT_RAW = 0xe + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMT_TAGOVF = 0x1 + EMUL_ENABLED = 0x1 + EMUL_NATIVE = 0x2 + ENDRUNDISC = 0x9 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_AOE = 0x88a2 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LLDP = 0x88cc + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_QINQ = 0x88a8 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOW = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_ALIGN = 0x2 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_DIX_LEN = 0x600 + ETHER_MAX_LEN = 0x5ee + ETHER_MIN_LEN = 0x40 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = -0x3 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = -0x7 + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xa + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETOWN = 0x5 + F_OK = 0x0 + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8e52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BLUETOOTH = 0xf8 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf7 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DUMMY = 0xf1 + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf3 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFLOW = 0xf9 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf2 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_HOST = 0x1 + IN_RFC3021_NET = 0xfffffffe + IN_RFC3021_NSHIFT = 0x1f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DIVERT = 0x102 + IPPROTO_DIVERT_INIT = 0x2 + IPPROTO_DIVERT_RESP = 0x1 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x103 + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPV6_AUTH_LEVEL = 0x35 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_ESP_NETWORK_LEVEL = 0x37 + IPV6_ESP_TRANS_LEVEL = 0x36 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPCOMP_LEVEL = 0x3c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_OPTIONS = 0x1 + IPV6_PATHMTU = 0x2c + IPV6_PIPEX = 0x3f + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVDSTPORT = 0x40 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTABLE = 0x1021 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_AUTH_LEVEL = 0x14 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DIVERTFL = 0x1022 + IP_DROP_MEMBERSHIP = 0xd + IP_ESP_NETWORK_LEVEL = 0x16 + IP_ESP_TRANS_LEVEL = 0x15 + IP_HDRINCL = 0x2 + IP_IPCOMP_LEVEL = 0x1d + IP_IPSECFLOWINFO = 0x24 + IP_IPSEC_LOCAL_AUTH = 0x1b + IP_IPSEC_LOCAL_CRED = 0x19 + IP_IPSEC_LOCAL_ID = 0x17 + IP_IPSEC_REMOTE_AUTH = 0x1c + IP_IPSEC_REMOTE_CRED = 0x1a + IP_IPSEC_REMOTE_ID = 0x18 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0xfff + IP_MF = 0x2000 + IP_MINTTL = 0x20 + IP_MIN_MEMBERSHIPS = 0xf + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PIPEX = 0x22 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVDSTPORT = 0x21 + IP_RECVIF = 0x1e + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRTABLE = 0x23 + IP_RECVTTL = 0x1f + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RTABLE = 0x1021 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LCNT_OVERLOAD_FLUSH = 0x6 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ANON = 0x1000 + MAP_COPY = 0x4 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FLAGMASK = 0x1ff7 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_DONATE_COPY = 0x3 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_TRYFIXED = 0x400 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_BCAST = 0x100 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_MCAST = 0x200 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x4 + MS_SYNC = 0x2 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_MAXID = 0x6 + NET_RT_STATS = 0x4 + NET_RT_TABLE = 0x5 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EOF = 0x2 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRUNCATE = 0x80 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x80 + ONOCR = 0x40 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x10000 + O_CREAT = 0x200 + O_DIRECTORY = 0x20000 + O_DSYNC = 0x80 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x80 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PF_FLUSH = 0x1 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + PT_MASK = 0x3ff000 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_LABEL = 0xa + RTAX_MAX = 0xb + RTAX_NETMASK = 0x2 + RTAX_SRC = 0x8 + RTAX_SRCMASK = 0x9 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_LABEL = 0x400 + RTA_NETMASK = 0x4 + RTA_SRC = 0x100 + RTA_SRCMASK = 0x200 + RTF_ANNOUNCE = 0x4000 + RTF_BLACKHOLE = 0x1000 + RTF_CLONED = 0x10000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FMASK = 0x10f808 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_MPATH = 0x40000 + RTF_MPLS = 0x100000 + RTF_PERMANENT_ARP = 0x2000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x2000 + RTF_REJECT = 0x8 + RTF_SOURCE = 0x20000 + RTF_STATIC = 0x800 + RTF_TUNNEL = 0x100000 + RTF_UP = 0x1 + RTF_USETRAILERS = 0x8000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DESYNC = 0x10 + RTM_GET = 0x4 + RTM_IFANNOUNCE = 0xf + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MAXSIZE = 0x800 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RT_TABLEID_MAX = 0xff + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80246987 + SIOCALIFADDR = 0x8218691c + SIOCATMARK = 0x40047307 + SIOCBRDGADD = 0x8054693c + SIOCBRDGADDS = 0x80546941 + SIOCBRDGARL = 0x806e694d + SIOCBRDGDADDR = 0x81286947 + SIOCBRDGDEL = 0x8054693d + SIOCBRDGDELS = 0x80546942 + SIOCBRDGFLUSH = 0x80546948 + SIOCBRDGFRL = 0x806e694e + SIOCBRDGGCACHE = 0xc0146941 + SIOCBRDGGFD = 0xc0146952 + SIOCBRDGGHT = 0xc0146951 + SIOCBRDGGIFFLGS = 0xc054693e + SIOCBRDGGMA = 0xc0146953 + SIOCBRDGGPARAM = 0xc03c6958 + SIOCBRDGGPRI = 0xc0146950 + SIOCBRDGGRL = 0xc028694f + SIOCBRDGGSIFS = 0xc054693c + SIOCBRDGGTO = 0xc0146946 + SIOCBRDGIFS = 0xc0546942 + SIOCBRDGRTS = 0xc0186943 + SIOCBRDGSADDR = 0xc1286944 + SIOCBRDGSCACHE = 0x80146940 + SIOCBRDGSFD = 0x80146952 + SIOCBRDGSHT = 0x80146951 + SIOCBRDGSIFCOST = 0x80546955 + SIOCBRDGSIFFLGS = 0x8054693f + SIOCBRDGSIFPRIO = 0x80546954 + SIOCBRDGSMA = 0x80146953 + SIOCBRDGSPRI = 0x80146950 + SIOCBRDGSPROTO = 0x8014695a + SIOCBRDGSTO = 0x80146945 + SIOCBRDGSTXHC = 0x80146959 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80246989 + SIOCDIFPHYADDR = 0x80206949 + SIOCDLIFADDR = 0x8218691e + SIOCGETKALIVE = 0xc01869a4 + SIOCGETLABEL = 0x8020699a + SIOCGETPFLOW = 0xc02069fe + SIOCGETPFSYNC = 0xc02069f8 + SIOCGETSGCNT = 0xc0147534 + SIOCGETVIFCNT = 0xc0147533 + SIOCGETVLAN = 0xc0206990 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCONF = 0xc0086924 + SIOCGIFDATA = 0xc020691b + SIOCGIFDESCR = 0xc0206981 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGATTR = 0xc024698b + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc024698a + SIOCGIFGROUP = 0xc0246988 + SIOCGIFHARDMTU = 0xc02069a5 + SIOCGIFMEDIA = 0xc0286936 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc020697e + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPRIORITY = 0xc020699c + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFRDOMAIN = 0xc02069a0 + SIOCGIFRTLABEL = 0xc0206983 + SIOCGIFTIMESLOT = 0xc0206986 + SIOCGIFXFLAGS = 0xc020699e + SIOCGLIFADDR = 0xc218691d + SIOCGLIFPHYADDR = 0xc218694b + SIOCGLIFPHYRTABLE = 0xc02069a2 + SIOCGLIFPHYTTL = 0xc02069a9 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGSPPPPARAMS = 0xc0206994 + SIOCGVH = 0xc02069f6 + SIOCGVNETID = 0xc02069a7 + SIOCIFCREATE = 0x8020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc00c6978 + SIOCSETKALIVE = 0x801869a3 + SIOCSETLABEL = 0x80206999 + SIOCSETPFLOW = 0x802069fd + SIOCSETPFSYNC = 0x802069f7 + SIOCSETVLAN = 0x8020698f + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFDESCR = 0x80206980 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGATTR = 0x8024698c + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020691f + SIOCSIFMEDIA = 0xc0206935 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x8020697f + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPRIORITY = 0x8020699b + SIOCSIFRDOMAIN = 0x8020699f + SIOCSIFRTLABEL = 0x80206982 + SIOCSIFTIMESLOT = 0x80206985 + SIOCSIFXFLAGS = 0x8020699d + SIOCSLIFPHYADDR = 0x8218694a + SIOCSLIFPHYRTABLE = 0x802069a1 + SIOCSLIFPHYTTL = 0x802069a8 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSSPPPPARAMS = 0x80206993 + SIOCSVH = 0xc02069f5 + SIOCSVNETID = 0x802069a6 + SOCK_DGRAM = 0x2 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BINDANY = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NETPROC = 0x1020 + SO_OOBINLINE = 0x100 + SO_PEERCRED = 0x1022 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RTABLE = 0x1021 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_SPLICE = 0x1023 + SO_TIMESTAMP = 0x800 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x3 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x4 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOPUSH = 0x10 + TCP_NSTATES = 0xb + TCP_SACK_ENABLE = 0x8 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_PPS = 0x10 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGPGRP = 0x40047477 + TIOCGSID = 0x40047463 + TIOCGTSTAMP = 0x400c745b + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMODG = 0x4004746a + TIOCMODS = 0x8004746d + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x8004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSTSTAMP = 0x8008745a + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALTSIG = 0x4 + WCONTINUED = 0x8 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x58) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x59) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EIPSEC = syscall.Errno(0x52) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x5b) + ELOOP = syscall.Errno(0x3e) + EMEDIUMTYPE = syscall.Errno(0x56) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x53) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOMEDIUM = syscall.Errno(0x55) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5a) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x5b) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x57) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "connection timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "IPsec processing failure", + 83: "attribute not found", + 84: "illegal byte sequence", + 85: "no medium found", + 86: "wrong medium type", + 87: "value too large to be stored in data type", + 88: "operation canceled", + 89: "identifier removed", + 90: "no message of desired type", + 91: "not supported", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "stopped (signal)", + 18: "stopped", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", + 32: "thread AST", +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..1758ecca93e253211cf9219cc9339502d7fc35e9 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go @@ -0,0 +1,1583 @@ +// mkerrors.sh -m64 +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build amd64,openbsd + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_APPLETALK = 0x10 + AF_BLUETOOTH = 0x20 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_CNT = 0x15 + AF_COIP = 0x14 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_E164 = 0x1a + AF_ECMA = 0x8 + AF_ENCAP = 0x1c + AF_HYLINK = 0xf + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x18 + AF_IPX = 0x17 + AF_ISDN = 0x1a + AF_ISO = 0x7 + AF_KEY = 0x1e + AF_LAT = 0xe + AF_LINK = 0x12 + AF_LOCAL = 0x1 + AF_MAX = 0x24 + AF_MPLS = 0x21 + AF_NATM = 0x1b + AF_NS = 0x6 + AF_OSI = 0x7 + AF_PUP = 0x4 + AF_ROUTE = 0x11 + AF_SIP = 0x1d + AF_SNA = 0xb + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + ARPHRD_ETHER = 0x1 + ARPHRD_FRELAY = 0xf + ARPHRD_IEEE1394 = 0x18 + ARPHRD_IEEE802 = 0x6 + B0 = 0x0 + B110 = 0x6e + B115200 = 0x1c200 + B1200 = 0x4b0 + B134 = 0x86 + B14400 = 0x3840 + B150 = 0x96 + B1800 = 0x708 + B19200 = 0x4b00 + B200 = 0xc8 + B230400 = 0x38400 + B2400 = 0x960 + B28800 = 0x7080 + B300 = 0x12c + B38400 = 0x9600 + B4800 = 0x12c0 + B50 = 0x32 + B57600 = 0xe100 + B600 = 0x258 + B7200 = 0x1c20 + B75 = 0x4b + B76800 = 0x12c00 + B9600 = 0x2580 + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDIRFILT = 0x4004427c + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = 0xc010427b + BIOCGETIF = 0x4020426b + BIOCGFILDROP = 0x40044278 + BIOCGHDRCMPLT = 0x40044274 + BIOCGRSIG = 0x40044273 + BIOCGRTIMEOUT = 0x4010426e + BIOCGSTATS = 0x4008426f + BIOCIMMEDIATE = 0x80044270 + BIOCLOCK = 0x20004276 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = 0xc0044266 + BIOCSDIRFILT = 0x8004427d + BIOCSDLT = 0x8004427a + BIOCSETF = 0x80104267 + BIOCSETIF = 0x8020426c + BIOCSETWF = 0x80104277 + BIOCSFILDROP = 0x80044279 + BIOCSHDRCMPLT = 0x80044275 + BIOCSRSIG = 0x80044272 + BIOCSRTIMEOUT = 0x8010426d + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DIRECTION_IN = 0x1 + BPF_DIRECTION_OUT = 0x2 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x200000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x8000 + CREAD = 0x800 + CS5 = 0x0 + CS6 = 0x100 + CS7 = 0x200 + CS8 = 0x300 + CSIZE = 0x300 + CSTART = 0x11 + CSTATUS = 0xff + CSTOP = 0x13 + CSTOPB = 0x400 + CSUSP = 0x1a + CTL_MAXNAME = 0xc + CTL_NET = 0x4 + DIOCOSFPFLUSH = 0x2000444e + DLT_ARCNET = 0x7 + DLT_ATM_RFC1483 = 0xb + DLT_AX25 = 0x3 + DLT_CHAOS = 0x5 + DLT_C_HDLC = 0x68 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0xd + DLT_FDDI = 0xa + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_LOOP = 0xc + DLT_MPLS = 0xdb + DLT_NULL = 0x0 + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0x10 + DLT_PPP_ETHER = 0x33 + DLT_PPP_SERIAL = 0x32 + DLT_PRONET = 0x4 + DLT_RAW = 0xe + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xf + DT_BLK = 0x6 + DT_CHR = 0x2 + DT_DIR = 0x4 + DT_FIFO = 0x1 + DT_LNK = 0xa + DT_REG = 0x8 + DT_SOCK = 0xc + DT_UNKNOWN = 0x0 + ECHO = 0x8 + ECHOCTL = 0x40 + ECHOE = 0x2 + ECHOK = 0x4 + ECHOKE = 0x1 + ECHONL = 0x10 + ECHOPRT = 0x20 + EMT_TAGOVF = 0x1 + EMUL_ENABLED = 0x1 + EMUL_NATIVE = 0x2 + ENDRUNDISC = 0x9 + ETHERMIN = 0x2e + ETHERMTU = 0x5dc + ETHERTYPE_8023 = 0x4 + ETHERTYPE_AARP = 0x80f3 + ETHERTYPE_ACCTON = 0x8390 + ETHERTYPE_AEONIC = 0x8036 + ETHERTYPE_ALPHA = 0x814a + ETHERTYPE_AMBER = 0x6008 + ETHERTYPE_AMOEBA = 0x8145 + ETHERTYPE_AOE = 0x88a2 + ETHERTYPE_APOLLO = 0x80f7 + ETHERTYPE_APOLLODOMAIN = 0x8019 + ETHERTYPE_APPLETALK = 0x809b + ETHERTYPE_APPLITEK = 0x80c7 + ETHERTYPE_ARGONAUT = 0x803a + ETHERTYPE_ARP = 0x806 + ETHERTYPE_AT = 0x809b + ETHERTYPE_ATALK = 0x809b + ETHERTYPE_ATOMIC = 0x86df + ETHERTYPE_ATT = 0x8069 + ETHERTYPE_ATTSTANFORD = 0x8008 + ETHERTYPE_AUTOPHON = 0x806a + ETHERTYPE_AXIS = 0x8856 + ETHERTYPE_BCLOOP = 0x9003 + ETHERTYPE_BOFL = 0x8102 + ETHERTYPE_CABLETRON = 0x7034 + ETHERTYPE_CHAOS = 0x804 + ETHERTYPE_COMDESIGN = 0x806c + ETHERTYPE_COMPUGRAPHIC = 0x806d + ETHERTYPE_COUNTERPOINT = 0x8062 + ETHERTYPE_CRONUS = 0x8004 + ETHERTYPE_CRONUSVLN = 0x8003 + ETHERTYPE_DCA = 0x1234 + ETHERTYPE_DDE = 0x807b + ETHERTYPE_DEBNI = 0xaaaa + ETHERTYPE_DECAM = 0x8048 + ETHERTYPE_DECCUST = 0x6006 + ETHERTYPE_DECDIAG = 0x6005 + ETHERTYPE_DECDNS = 0x803c + ETHERTYPE_DECDTS = 0x803e + ETHERTYPE_DECEXPER = 0x6000 + ETHERTYPE_DECLAST = 0x8041 + ETHERTYPE_DECLTM = 0x803f + ETHERTYPE_DECMUMPS = 0x6009 + ETHERTYPE_DECNETBIOS = 0x8040 + ETHERTYPE_DELTACON = 0x86de + ETHERTYPE_DIDDLE = 0x4321 + ETHERTYPE_DLOG1 = 0x660 + ETHERTYPE_DLOG2 = 0x661 + ETHERTYPE_DN = 0x6003 + ETHERTYPE_DOGFIGHT = 0x1989 + ETHERTYPE_DSMD = 0x8039 + ETHERTYPE_ECMA = 0x803 + ETHERTYPE_ENCRYPT = 0x803d + ETHERTYPE_ES = 0x805d + ETHERTYPE_EXCELAN = 0x8010 + ETHERTYPE_EXPERDATA = 0x8049 + ETHERTYPE_FLIP = 0x8146 + ETHERTYPE_FLOWCONTROL = 0x8808 + ETHERTYPE_FRARP = 0x808 + ETHERTYPE_GENDYN = 0x8068 + ETHERTYPE_HAYES = 0x8130 + ETHERTYPE_HIPPI_FP = 0x8180 + ETHERTYPE_HITACHI = 0x8820 + ETHERTYPE_HP = 0x8005 + ETHERTYPE_IEEEPUP = 0xa00 + ETHERTYPE_IEEEPUPAT = 0xa01 + ETHERTYPE_IMLBL = 0x4c42 + ETHERTYPE_IMLBLDIAG = 0x424c + ETHERTYPE_IP = 0x800 + ETHERTYPE_IPAS = 0x876c + ETHERTYPE_IPV6 = 0x86dd + ETHERTYPE_IPX = 0x8137 + ETHERTYPE_IPXNEW = 0x8037 + ETHERTYPE_KALPANA = 0x8582 + ETHERTYPE_LANBRIDGE = 0x8038 + ETHERTYPE_LANPROBE = 0x8888 + ETHERTYPE_LAT = 0x6004 + ETHERTYPE_LBACK = 0x9000 + ETHERTYPE_LITTLE = 0x8060 + ETHERTYPE_LLDP = 0x88cc + ETHERTYPE_LOGICRAFT = 0x8148 + ETHERTYPE_LOOPBACK = 0x9000 + ETHERTYPE_MATRA = 0x807a + ETHERTYPE_MAX = 0xffff + ETHERTYPE_MERIT = 0x807c + ETHERTYPE_MICP = 0x873a + ETHERTYPE_MOPDL = 0x6001 + ETHERTYPE_MOPRC = 0x6002 + ETHERTYPE_MOTOROLA = 0x818d + ETHERTYPE_MPLS = 0x8847 + ETHERTYPE_MPLS_MCAST = 0x8848 + ETHERTYPE_MUMPS = 0x813f + ETHERTYPE_NBPCC = 0x3c04 + ETHERTYPE_NBPCLAIM = 0x3c09 + ETHERTYPE_NBPCLREQ = 0x3c05 + ETHERTYPE_NBPCLRSP = 0x3c06 + ETHERTYPE_NBPCREQ = 0x3c02 + ETHERTYPE_NBPCRSP = 0x3c03 + ETHERTYPE_NBPDG = 0x3c07 + ETHERTYPE_NBPDGB = 0x3c08 + ETHERTYPE_NBPDLTE = 0x3c0a + ETHERTYPE_NBPRAR = 0x3c0c + ETHERTYPE_NBPRAS = 0x3c0b + ETHERTYPE_NBPRST = 0x3c0d + ETHERTYPE_NBPSCD = 0x3c01 + ETHERTYPE_NBPVCD = 0x3c00 + ETHERTYPE_NBS = 0x802 + ETHERTYPE_NCD = 0x8149 + ETHERTYPE_NESTAR = 0x8006 + ETHERTYPE_NETBEUI = 0x8191 + ETHERTYPE_NOVELL = 0x8138 + ETHERTYPE_NS = 0x600 + ETHERTYPE_NSAT = 0x601 + ETHERTYPE_NSCOMPAT = 0x807 + ETHERTYPE_NTRAILER = 0x10 + ETHERTYPE_OS9 = 0x7007 + ETHERTYPE_OS9NET = 0x7009 + ETHERTYPE_PACER = 0x80c6 + ETHERTYPE_PAE = 0x888e + ETHERTYPE_PCS = 0x4242 + ETHERTYPE_PLANNING = 0x8044 + ETHERTYPE_PPP = 0x880b + ETHERTYPE_PPPOE = 0x8864 + ETHERTYPE_PPPOEDISC = 0x8863 + ETHERTYPE_PRIMENTS = 0x7031 + ETHERTYPE_PUP = 0x200 + ETHERTYPE_PUPAT = 0x200 + ETHERTYPE_QINQ = 0x88a8 + ETHERTYPE_RACAL = 0x7030 + ETHERTYPE_RATIONAL = 0x8150 + ETHERTYPE_RAWFR = 0x6559 + ETHERTYPE_RCL = 0x1995 + ETHERTYPE_RDP = 0x8739 + ETHERTYPE_RETIX = 0x80f2 + ETHERTYPE_REVARP = 0x8035 + ETHERTYPE_SCA = 0x6007 + ETHERTYPE_SECTRA = 0x86db + ETHERTYPE_SECUREDATA = 0x876d + ETHERTYPE_SGITW = 0x817e + ETHERTYPE_SG_BOUNCE = 0x8016 + ETHERTYPE_SG_DIAG = 0x8013 + ETHERTYPE_SG_NETGAMES = 0x8014 + ETHERTYPE_SG_RESV = 0x8015 + ETHERTYPE_SIMNET = 0x5208 + ETHERTYPE_SLOW = 0x8809 + ETHERTYPE_SNA = 0x80d5 + ETHERTYPE_SNMP = 0x814c + ETHERTYPE_SONIX = 0xfaf5 + ETHERTYPE_SPIDER = 0x809f + ETHERTYPE_SPRITE = 0x500 + ETHERTYPE_STP = 0x8181 + ETHERTYPE_TALARIS = 0x812b + ETHERTYPE_TALARISMC = 0x852b + ETHERTYPE_TCPCOMP = 0x876b + ETHERTYPE_TCPSM = 0x9002 + ETHERTYPE_TEC = 0x814f + ETHERTYPE_TIGAN = 0x802f + ETHERTYPE_TRAIL = 0x1000 + ETHERTYPE_TRANSETHER = 0x6558 + ETHERTYPE_TYMSHARE = 0x802e + ETHERTYPE_UBBST = 0x7005 + ETHERTYPE_UBDEBUG = 0x900 + ETHERTYPE_UBDIAGLOOP = 0x7002 + ETHERTYPE_UBDL = 0x7000 + ETHERTYPE_UBNIU = 0x7001 + ETHERTYPE_UBNMC = 0x7003 + ETHERTYPE_VALID = 0x1600 + ETHERTYPE_VARIAN = 0x80dd + ETHERTYPE_VAXELN = 0x803b + ETHERTYPE_VEECO = 0x8067 + ETHERTYPE_VEXP = 0x805b + ETHERTYPE_VGLAB = 0x8131 + ETHERTYPE_VINES = 0xbad + ETHERTYPE_VINESECHO = 0xbaf + ETHERTYPE_VINESLOOP = 0xbae + ETHERTYPE_VITAL = 0xff00 + ETHERTYPE_VLAN = 0x8100 + ETHERTYPE_VLTLMAN = 0x8080 + ETHERTYPE_VPROD = 0x805c + ETHERTYPE_VURESERVED = 0x8147 + ETHERTYPE_WATERLOO = 0x8130 + ETHERTYPE_WELLFLEET = 0x8103 + ETHERTYPE_X25 = 0x805 + ETHERTYPE_X75 = 0x801 + ETHERTYPE_XNSSM = 0x9001 + ETHERTYPE_XTP = 0x817d + ETHER_ADDR_LEN = 0x6 + ETHER_ALIGN = 0x2 + ETHER_CRC_LEN = 0x4 + ETHER_CRC_POLY_BE = 0x4c11db6 + ETHER_CRC_POLY_LE = 0xedb88320 + ETHER_HDR_LEN = 0xe + ETHER_MAX_DIX_LEN = 0x600 + ETHER_MAX_LEN = 0x5ee + ETHER_MIN_LEN = 0x40 + ETHER_TYPE_LEN = 0x2 + ETHER_VLAN_ENCAP_LEN = 0x4 + EVFILT_AIO = -0x3 + EVFILT_PROC = -0x5 + EVFILT_READ = -0x1 + EVFILT_SIGNAL = -0x6 + EVFILT_SYSCOUNT = 0x7 + EVFILT_TIMER = -0x7 + EVFILT_VNODE = -0x4 + EVFILT_WRITE = -0x2 + EV_ADD = 0x1 + EV_CLEAR = 0x20 + EV_DELETE = 0x2 + EV_DISABLE = 0x8 + EV_ENABLE = 0x4 + EV_EOF = 0x8000 + EV_ERROR = 0x4000 + EV_FLAG1 = 0x2000 + EV_ONESHOT = 0x10 + EV_SYSFLAGS = 0xf000 + EXTA = 0x4b00 + EXTB = 0x9600 + EXTPROC = 0x800 + FD_CLOEXEC = 0x1 + FD_SETSIZE = 0x400 + FLUSHO = 0x800000 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0xa + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0x7 + F_GETOWN = 0x5 + F_OK = 0x0 + F_RDLCK = 0x1 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x8 + F_SETLKW = 0x9 + F_SETOWN = 0x6 + F_UNLCK = 0x2 + F_WRLCK = 0x3 + HUPCL = 0x4000 + ICANON = 0x100 + ICMP6_FILTER = 0x12 + ICRNL = 0x100 + IEXTEN = 0x400 + IFAN_ARRIVAL = 0x0 + IFAN_DEPARTURE = 0x1 + IFA_ROUTE = 0x1 + IFF_ALLMULTI = 0x200 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x8e52 + IFF_DEBUG = 0x4 + IFF_LINK0 = 0x1000 + IFF_LINK1 = 0x2000 + IFF_LINK2 = 0x4000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x8000 + IFF_NOARP = 0x80 + IFF_NOTRAILERS = 0x20 + IFF_OACTIVE = 0x400 + IFF_POINTOPOINT = 0x10 + IFF_PROMISC = 0x100 + IFF_RUNNING = 0x40 + IFF_SIMPLEX = 0x800 + IFF_UP = 0x1 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_A12MPPSWITCH = 0x82 + IFT_AAL2 = 0xbb + IFT_AAL5 = 0x31 + IFT_ADSL = 0x5e + IFT_AFLANE8023 = 0x3b + IFT_AFLANE8025 = 0x3c + IFT_ARAP = 0x58 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ASYNC = 0x54 + IFT_ATM = 0x25 + IFT_ATMDXI = 0x69 + IFT_ATMFUNI = 0x6a + IFT_ATMIMA = 0x6b + IFT_ATMLOGICAL = 0x50 + IFT_ATMRADIO = 0xbd + IFT_ATMSUBINTERFACE = 0x86 + IFT_ATMVCIENDPT = 0xc2 + IFT_ATMVIRTUAL = 0x95 + IFT_BGPPOLICYACCOUNTING = 0xa2 + IFT_BLUETOOTH = 0xf8 + IFT_BRIDGE = 0xd1 + IFT_BSC = 0x53 + IFT_CARP = 0xf7 + IFT_CCTEMUL = 0x3d + IFT_CEPT = 0x13 + IFT_CES = 0x85 + IFT_CHANNEL = 0x46 + IFT_CNR = 0x55 + IFT_COFFEE = 0x84 + IFT_COMPOSITELINK = 0x9b + IFT_DCN = 0x8d + IFT_DIGITALPOWERLINE = 0x8a + IFT_DIGITALWRAPPEROVERHEADCHANNEL = 0xba + IFT_DLSW = 0x4a + IFT_DOCSCABLEDOWNSTREAM = 0x80 + IFT_DOCSCABLEMACLAYER = 0x7f + IFT_DOCSCABLEUPSTREAM = 0x81 + IFT_DOCSCABLEUPSTREAMCHANNEL = 0xcd + IFT_DS0 = 0x51 + IFT_DS0BUNDLE = 0x52 + IFT_DS1FDL = 0xaa + IFT_DS3 = 0x1e + IFT_DTM = 0x8c + IFT_DUMMY = 0xf1 + IFT_DVBASILN = 0xac + IFT_DVBASIOUT = 0xad + IFT_DVBRCCDOWNSTREAM = 0x93 + IFT_DVBRCCMACLAYER = 0x92 + IFT_DVBRCCUPSTREAM = 0x94 + IFT_ECONET = 0xce + IFT_ENC = 0xf4 + IFT_EON = 0x19 + IFT_EPLRS = 0x57 + IFT_ESCON = 0x49 + IFT_ETHER = 0x6 + IFT_FAITH = 0xf3 + IFT_FAST = 0x7d + IFT_FASTETHER = 0x3e + IFT_FASTETHERFX = 0x45 + IFT_FDDI = 0xf + IFT_FIBRECHANNEL = 0x38 + IFT_FRAMERELAYINTERCONNECT = 0x3a + IFT_FRAMERELAYMPI = 0x5c + IFT_FRDLCIENDPT = 0xc1 + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_FRF16MFRBUNDLE = 0xa3 + IFT_FRFORWARD = 0x9e + IFT_G703AT2MB = 0x43 + IFT_G703AT64K = 0x42 + IFT_GIF = 0xf0 + IFT_GIGABITETHERNET = 0x75 + IFT_GR303IDT = 0xb2 + IFT_GR303RDT = 0xb1 + IFT_H323GATEKEEPER = 0xa4 + IFT_H323PROXY = 0xa5 + IFT_HDH1822 = 0x3 + IFT_HDLC = 0x76 + IFT_HDSL2 = 0xa8 + IFT_HIPERLAN2 = 0xb7 + IFT_HIPPI = 0x2f + IFT_HIPPIINTERFACE = 0x39 + IFT_HOSTPAD = 0x5a + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IBM370PARCHAN = 0x48 + IFT_IDSL = 0x9a + IFT_IEEE1394 = 0x90 + IFT_IEEE80211 = 0x47 + IFT_IEEE80212 = 0x37 + IFT_IEEE8023ADLAG = 0xa1 + IFT_IFGSN = 0x91 + IFT_IMT = 0xbe + IFT_INFINIBAND = 0xc7 + IFT_INTERLEAVE = 0x7c + IFT_IP = 0x7e + IFT_IPFORWARD = 0x8e + IFT_IPOVERATM = 0x72 + IFT_IPOVERCDLC = 0x6d + IFT_IPOVERCLAW = 0x6e + IFT_IPSWITCH = 0x4e + IFT_ISDN = 0x3f + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISDNS = 0x4b + IFT_ISDNU = 0x4c + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88025CRFPINT = 0x62 + IFT_ISO88025DTR = 0x56 + IFT_ISO88025FIBER = 0x73 + IFT_ISO88026 = 0xa + IFT_ISUP = 0xb3 + IFT_L2VLAN = 0x87 + IFT_L3IPVLAN = 0x88 + IFT_L3IPXVLAN = 0x89 + IFT_LAPB = 0x10 + IFT_LAPD = 0x4d + IFT_LAPF = 0x77 + IFT_LINEGROUP = 0xd2 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MEDIAMAILOVERIP = 0x8b + IFT_MFSIGLINK = 0xa7 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_MPC = 0x71 + IFT_MPLS = 0xa6 + IFT_MPLSTUNNEL = 0x96 + IFT_MSDSL = 0x8f + IFT_MVL = 0xbf + IFT_MYRINET = 0x63 + IFT_NFAS = 0xaf + IFT_NSIP = 0x1b + IFT_OPTICALCHANNEL = 0xc3 + IFT_OPTICALTRANSPORT = 0xc4 + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PFLOG = 0xf5 + IFT_PFLOW = 0xf9 + IFT_PFSYNC = 0xf6 + IFT_PLC = 0xae + IFT_PON155 = 0xcf + IFT_PON622 = 0xd0 + IFT_POS = 0xab + IFT_PPP = 0x17 + IFT_PPPMULTILINKBUNDLE = 0x6c + IFT_PROPATM = 0xc5 + IFT_PROPBWAP2MP = 0xb8 + IFT_PROPCNLS = 0x59 + IFT_PROPDOCSWIRELESSDOWNSTREAM = 0xb5 + IFT_PROPDOCSWIRELESSMACLAYER = 0xb4 + IFT_PROPDOCSWIRELESSUPSTREAM = 0xb6 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PROPWIRELESSP2P = 0x9d + IFT_PTPSERIAL = 0x16 + IFT_PVC = 0xf2 + IFT_Q2931 = 0xc9 + IFT_QLLC = 0x44 + IFT_RADIOMAC = 0xbc + IFT_RADSL = 0x5f + IFT_REACHDSL = 0xc0 + IFT_RFC1483 = 0x9f + IFT_RS232 = 0x21 + IFT_RSRB = 0x4f + IFT_SDLC = 0x11 + IFT_SDSL = 0x60 + IFT_SHDSL = 0xa9 + IFT_SIP = 0x1f + IFT_SIPSIG = 0xcc + IFT_SIPTG = 0xcb + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETOVERHEADCHANNEL = 0xb9 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_SRP = 0x97 + IFT_SS7SIGLINK = 0x9c + IFT_STACKTOSTACK = 0x6f + IFT_STARLAN = 0xb + IFT_T1 = 0x12 + IFT_TDLC = 0x74 + IFT_TELINK = 0xc8 + IFT_TERMPAD = 0x5b + IFT_TR008 = 0xb0 + IFT_TRANSPHDLC = 0x7b + IFT_TUNNEL = 0x83 + IFT_ULTRA = 0x1d + IFT_USB = 0xa0 + IFT_V11 = 0x40 + IFT_V35 = 0x2d + IFT_V36 = 0x41 + IFT_V37 = 0x78 + IFT_VDSL = 0x61 + IFT_VIRTUALIPADDRESS = 0x70 + IFT_VIRTUALTG = 0xca + IFT_VOICEDID = 0xd5 + IFT_VOICEEM = 0x64 + IFT_VOICEEMFGD = 0xd3 + IFT_VOICEENCAP = 0x67 + IFT_VOICEFGDEANA = 0xd4 + IFT_VOICEFXO = 0x65 + IFT_VOICEFXS = 0x66 + IFT_VOICEOVERATM = 0x98 + IFT_VOICEOVERCABLE = 0xc6 + IFT_VOICEOVERFRAMERELAY = 0x99 + IFT_VOICEOVERIP = 0x68 + IFT_X213 = 0x5d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25HUNTGROUP = 0x7a + IFT_X25MLP = 0x79 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_LOOPBACKNET = 0x7f + IN_RFC3021_HOST = 0x1 + IN_RFC3021_NET = 0xfffffffe + IN_RFC3021_NSHIFT = 0x1f + IPPROTO_AH = 0x33 + IPPROTO_CARP = 0x70 + IPPROTO_DIVERT = 0x102 + IPPROTO_DIVERT_INIT = 0x2 + IPPROTO_DIVERT_RESP = 0x1 + IPPROTO_DONE = 0x101 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x62 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_ETHERIP = 0x61 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_GRE = 0x2f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPCOMP = 0x6c + IPPROTO_IPIP = 0x4 + IPPROTO_IPV4 = 0x4 + IPPROTO_IPV6 = 0x29 + IPPROTO_MAX = 0x100 + IPPROTO_MAXID = 0x103 + IPPROTO_MOBILE = 0x37 + IPPROTO_MPLS = 0x89 + IPPROTO_NONE = 0x3b + IPPROTO_PFSYNC = 0xf0 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_TCP = 0x6 + IPPROTO_TP = 0x1d + IPPROTO_UDP = 0x11 + IPV6_AUTH_LEVEL = 0x35 + IPV6_AUTOFLOWLABEL = 0x3b + IPV6_CHECKSUM = 0x1a + IPV6_DEFAULT_MULTICAST_HOPS = 0x1 + IPV6_DEFAULT_MULTICAST_LOOP = 0x1 + IPV6_DEFHLIM = 0x40 + IPV6_DONTFRAG = 0x3e + IPV6_DSTOPTS = 0x32 + IPV6_ESP_NETWORK_LEVEL = 0x37 + IPV6_ESP_TRANS_LEVEL = 0x36 + IPV6_FAITH = 0x1d + IPV6_FLOWINFO_MASK = 0xffffff0f + IPV6_FLOWLABEL_MASK = 0xffff0f00 + IPV6_FRAGTTL = 0x78 + IPV6_HLIMDEC = 0x1 + IPV6_HOPLIMIT = 0x2f + IPV6_HOPOPTS = 0x31 + IPV6_IPCOMP_LEVEL = 0x3c + IPV6_JOIN_GROUP = 0xc + IPV6_LEAVE_GROUP = 0xd + IPV6_MAXHLIM = 0xff + IPV6_MAXPACKET = 0xffff + IPV6_MMTU = 0x500 + IPV6_MULTICAST_HOPS = 0xa + IPV6_MULTICAST_IF = 0x9 + IPV6_MULTICAST_LOOP = 0xb + IPV6_NEXTHOP = 0x30 + IPV6_OPTIONS = 0x1 + IPV6_PATHMTU = 0x2c + IPV6_PIPEX = 0x3f + IPV6_PKTINFO = 0x2e + IPV6_PORTRANGE = 0xe + IPV6_PORTRANGE_DEFAULT = 0x0 + IPV6_PORTRANGE_HIGH = 0x1 + IPV6_PORTRANGE_LOW = 0x2 + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVDSTPORT = 0x40 + IPV6_RECVHOPLIMIT = 0x25 + IPV6_RECVHOPOPTS = 0x27 + IPV6_RECVPATHMTU = 0x2b + IPV6_RECVPKTINFO = 0x24 + IPV6_RECVRTHDR = 0x26 + IPV6_RECVTCLASS = 0x39 + IPV6_RTABLE = 0x1021 + IPV6_RTHDR = 0x33 + IPV6_RTHDRDSTOPTS = 0x23 + IPV6_RTHDR_LOOSE = 0x0 + IPV6_RTHDR_STRICT = 0x1 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SOCKOPT_RESERVED1 = 0x3 + IPV6_TCLASS = 0x3d + IPV6_UNICAST_HOPS = 0x4 + IPV6_USE_MIN_MTU = 0x2a + IPV6_V6ONLY = 0x1b + IPV6_VERSION = 0x60 + IPV6_VERSION_MASK = 0xf0 + IP_ADD_MEMBERSHIP = 0xc + IP_AUTH_LEVEL = 0x14 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DIVERTFL = 0x1022 + IP_DROP_MEMBERSHIP = 0xd + IP_ESP_NETWORK_LEVEL = 0x16 + IP_ESP_TRANS_LEVEL = 0x15 + IP_HDRINCL = 0x2 + IP_IPCOMP_LEVEL = 0x1d + IP_IPSECFLOWINFO = 0x24 + IP_IPSEC_LOCAL_AUTH = 0x1b + IP_IPSEC_LOCAL_CRED = 0x19 + IP_IPSEC_LOCAL_ID = 0x17 + IP_IPSEC_REMOTE_AUTH = 0x1c + IP_IPSEC_REMOTE_CRED = 0x1a + IP_IPSEC_REMOTE_ID = 0x18 + IP_MAXPACKET = 0xffff + IP_MAX_MEMBERSHIPS = 0xfff + IP_MF = 0x2000 + IP_MINTTL = 0x20 + IP_MIN_MEMBERSHIPS = 0xf + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x9 + IP_MULTICAST_LOOP = 0xb + IP_MULTICAST_TTL = 0xa + IP_OFFMASK = 0x1fff + IP_OPTIONS = 0x1 + IP_PIPEX = 0x22 + IP_PORTRANGE = 0x13 + IP_PORTRANGE_DEFAULT = 0x0 + IP_PORTRANGE_HIGH = 0x1 + IP_PORTRANGE_LOW = 0x2 + IP_RECVDSTADDR = 0x7 + IP_RECVDSTPORT = 0x21 + IP_RECVIF = 0x1e + IP_RECVOPTS = 0x5 + IP_RECVRETOPTS = 0x6 + IP_RECVRTABLE = 0x23 + IP_RECVTTL = 0x1f + IP_RETOPTS = 0x8 + IP_RF = 0x8000 + IP_RTABLE = 0x1021 + IP_TOS = 0x3 + IP_TTL = 0x4 + ISIG = 0x80 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x400 + IXON = 0x200 + LCNT_OVERLOAD_FLUSH = 0x6 + LOCK_EX = 0x2 + LOCK_NB = 0x4 + LOCK_SH = 0x1 + LOCK_UN = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x6 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_SPACEAVAIL = 0x5 + MADV_WILLNEED = 0x3 + MAP_ANON = 0x1000 + MAP_COPY = 0x4 + MAP_FILE = 0x0 + MAP_FIXED = 0x10 + MAP_FLAGMASK = 0x1ff7 + MAP_HASSEMAPHORE = 0x200 + MAP_INHERIT = 0x80 + MAP_INHERIT_COPY = 0x1 + MAP_INHERIT_DONATE_COPY = 0x3 + MAP_INHERIT_NONE = 0x2 + MAP_INHERIT_SHARE = 0x0 + MAP_NOEXTEND = 0x100 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_TRYFIXED = 0x400 + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_BCAST = 0x100 + MSG_CTRUNC = 0x20 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_EOR = 0x8 + MSG_MCAST = 0x200 + MSG_NOSIGNAL = 0x400 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x10 + MSG_WAITALL = 0x40 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x4 + MS_SYNC = 0x2 + NAME_MAX = 0xff + NET_RT_DUMP = 0x1 + NET_RT_FLAGS = 0x2 + NET_RT_IFLIST = 0x3 + NET_RT_MAXID = 0x6 + NET_RT_STATS = 0x4 + NET_RT_TABLE = 0x5 + NOFLSH = 0x80000000 + NOTE_ATTRIB = 0x8 + NOTE_CHILD = 0x4 + NOTE_DELETE = 0x1 + NOTE_EOF = 0x2 + NOTE_EXEC = 0x20000000 + NOTE_EXIT = 0x80000000 + NOTE_EXTEND = 0x4 + NOTE_FORK = 0x40000000 + NOTE_LINK = 0x10 + NOTE_LOWAT = 0x1 + NOTE_PCTRLMASK = 0xf0000000 + NOTE_PDATAMASK = 0xfffff + NOTE_RENAME = 0x20 + NOTE_REVOKE = 0x40 + NOTE_TRACK = 0x1 + NOTE_TRACKERR = 0x2 + NOTE_TRUNCATE = 0x80 + NOTE_WRITE = 0x2 + OCRNL = 0x10 + ONLCR = 0x2 + ONLRET = 0x80 + ONOCR = 0x40 + ONOEOT = 0x8 + OPOST = 0x1 + O_ACCMODE = 0x3 + O_APPEND = 0x8 + O_ASYNC = 0x40 + O_CLOEXEC = 0x10000 + O_CREAT = 0x200 + O_DIRECTORY = 0x20000 + O_DSYNC = 0x80 + O_EXCL = 0x800 + O_EXLOCK = 0x20 + O_FSYNC = 0x80 + O_NDELAY = 0x4 + O_NOCTTY = 0x8000 + O_NOFOLLOW = 0x100 + O_NONBLOCK = 0x4 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x80 + O_SHLOCK = 0x10 + O_SYNC = 0x80 + O_TRUNC = 0x400 + O_WRONLY = 0x1 + PARENB = 0x1000 + PARMRK = 0x8 + PARODD = 0x2000 + PENDIN = 0x20000000 + PF_FLUSH = 0x1 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x8 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = 0x7fffffffffffffff + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_LABEL = 0xa + RTAX_MAX = 0xb + RTAX_NETMASK = 0x2 + RTAX_SRC = 0x8 + RTAX_SRCMASK = 0x9 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_LABEL = 0x400 + RTA_NETMASK = 0x4 + RTA_SRC = 0x100 + RTA_SRCMASK = 0x200 + RTF_ANNOUNCE = 0x4000 + RTF_BLACKHOLE = 0x1000 + RTF_CLONED = 0x10000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_FMASK = 0x10f808 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_MPATH = 0x40000 + RTF_MPLS = 0x100000 + RTF_PERMANENT_ARP = 0x2000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_PROTO3 = 0x2000 + RTF_REJECT = 0x8 + RTF_SOURCE = 0x20000 + RTF_STATIC = 0x800 + RTF_TUNNEL = 0x100000 + RTF_UP = 0x1 + RTF_USETRAILERS = 0x8000 + RTF_XRESOLVE = 0x200 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_DESYNC = 0x10 + RTM_GET = 0x4 + RTM_IFANNOUNCE = 0xf + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MAXSIZE = 0x800 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_RTTUNIT = 0xf4240 + RTM_VERSION = 0x5 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RT_TABLEID_MAX = 0xff + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + RUSAGE_THREAD = 0x1 + SCM_RIGHTS = 0x1 + SCM_TIMESTAMP = 0x4 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIOCADDMULTI = 0x80206931 + SIOCAIFADDR = 0x8040691a + SIOCAIFGROUP = 0x80286987 + SIOCALIFADDR = 0x8218691c + SIOCATMARK = 0x40047307 + SIOCBRDGADD = 0x8058693c + SIOCBRDGADDS = 0x80586941 + SIOCBRDGARL = 0x806e694d + SIOCBRDGDADDR = 0x81286947 + SIOCBRDGDEL = 0x8058693d + SIOCBRDGDELS = 0x80586942 + SIOCBRDGFLUSH = 0x80586948 + SIOCBRDGFRL = 0x806e694e + SIOCBRDGGCACHE = 0xc0146941 + SIOCBRDGGFD = 0xc0146952 + SIOCBRDGGHT = 0xc0146951 + SIOCBRDGGIFFLGS = 0xc058693e + SIOCBRDGGMA = 0xc0146953 + SIOCBRDGGPARAM = 0xc0406958 + SIOCBRDGGPRI = 0xc0146950 + SIOCBRDGGRL = 0xc030694f + SIOCBRDGGSIFS = 0xc058693c + SIOCBRDGGTO = 0xc0146946 + SIOCBRDGIFS = 0xc0586942 + SIOCBRDGRTS = 0xc0206943 + SIOCBRDGSADDR = 0xc1286944 + SIOCBRDGSCACHE = 0x80146940 + SIOCBRDGSFD = 0x80146952 + SIOCBRDGSHT = 0x80146951 + SIOCBRDGSIFCOST = 0x80586955 + SIOCBRDGSIFFLGS = 0x8058693f + SIOCBRDGSIFPRIO = 0x80586954 + SIOCBRDGSMA = 0x80146953 + SIOCBRDGSPRI = 0x80146950 + SIOCBRDGSPROTO = 0x8014695a + SIOCBRDGSTO = 0x80146945 + SIOCBRDGSTXHC = 0x80146959 + SIOCDELMULTI = 0x80206932 + SIOCDIFADDR = 0x80206919 + SIOCDIFGROUP = 0x80286989 + SIOCDIFPHYADDR = 0x80206949 + SIOCDLIFADDR = 0x8218691e + SIOCGETKALIVE = 0xc01869a4 + SIOCGETLABEL = 0x8020699a + SIOCGETPFLOW = 0xc02069fe + SIOCGETPFSYNC = 0xc02069f8 + SIOCGETSGCNT = 0xc0207534 + SIOCGETVIFCNT = 0xc0287533 + SIOCGETVLAN = 0xc0206990 + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = 0xc0206921 + SIOCGIFASYNCMAP = 0xc020697c + SIOCGIFBRDADDR = 0xc0206923 + SIOCGIFCONF = 0xc0106924 + SIOCGIFDATA = 0xc020691b + SIOCGIFDESCR = 0xc0206981 + SIOCGIFDSTADDR = 0xc0206922 + SIOCGIFFLAGS = 0xc0206911 + SIOCGIFGATTR = 0xc028698b + SIOCGIFGENERIC = 0xc020693a + SIOCGIFGMEMB = 0xc028698a + SIOCGIFGROUP = 0xc0286988 + SIOCGIFHARDMTU = 0xc02069a5 + SIOCGIFMEDIA = 0xc0306936 + SIOCGIFMETRIC = 0xc0206917 + SIOCGIFMTU = 0xc020697e + SIOCGIFNETMASK = 0xc0206925 + SIOCGIFPDSTADDR = 0xc0206948 + SIOCGIFPRIORITY = 0xc020699c + SIOCGIFPSRCADDR = 0xc0206947 + SIOCGIFRDOMAIN = 0xc02069a0 + SIOCGIFRTLABEL = 0xc0206983 + SIOCGIFTIMESLOT = 0xc0206986 + SIOCGIFXFLAGS = 0xc020699e + SIOCGLIFADDR = 0xc218691d + SIOCGLIFPHYADDR = 0xc218694b + SIOCGLIFPHYRTABLE = 0xc02069a2 + SIOCGLIFPHYTTL = 0xc02069a9 + SIOCGLOWAT = 0x40047303 + SIOCGPGRP = 0x40047309 + SIOCGSPPPPARAMS = 0xc0206994 + SIOCGVH = 0xc02069f6 + SIOCGVNETID = 0xc02069a7 + SIOCIFCREATE = 0x8020697a + SIOCIFDESTROY = 0x80206979 + SIOCIFGCLONERS = 0xc0106978 + SIOCSETKALIVE = 0x801869a3 + SIOCSETLABEL = 0x80206999 + SIOCSETPFLOW = 0x802069fd + SIOCSETPFSYNC = 0x802069f7 + SIOCSETVLAN = 0x8020698f + SIOCSHIWAT = 0x80047300 + SIOCSIFADDR = 0x8020690c + SIOCSIFASYNCMAP = 0x8020697d + SIOCSIFBRDADDR = 0x80206913 + SIOCSIFDESCR = 0x80206980 + SIOCSIFDSTADDR = 0x8020690e + SIOCSIFFLAGS = 0x80206910 + SIOCSIFGATTR = 0x8028698c + SIOCSIFGENERIC = 0x80206939 + SIOCSIFLLADDR = 0x8020691f + SIOCSIFMEDIA = 0xc0206935 + SIOCSIFMETRIC = 0x80206918 + SIOCSIFMTU = 0x8020697f + SIOCSIFNETMASK = 0x80206916 + SIOCSIFPHYADDR = 0x80406946 + SIOCSIFPRIORITY = 0x8020699b + SIOCSIFRDOMAIN = 0x8020699f + SIOCSIFRTLABEL = 0x80206982 + SIOCSIFTIMESLOT = 0x80206985 + SIOCSIFXFLAGS = 0x8020699d + SIOCSLIFPHYADDR = 0x8218694a + SIOCSLIFPHYRTABLE = 0x802069a1 + SIOCSLIFPHYTTL = 0x802069a8 + SIOCSLOWAT = 0x80047302 + SIOCSPGRP = 0x80047308 + SIOCSSPPPPARAMS = 0x80206993 + SIOCSVH = 0xc02069f5 + SIOCSVNETID = 0x802069a6 + SOCK_DGRAM = 0x2 + SOCK_RAW = 0x3 + SOCK_RDM = 0x4 + SOCK_SEQPACKET = 0x5 + SOCK_STREAM = 0x1 + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_BINDANY = 0x1000 + SO_BROADCAST = 0x20 + SO_DEBUG = 0x1 + SO_DONTROUTE = 0x10 + SO_ERROR = 0x1007 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_NETPROC = 0x1020 + SO_OOBINLINE = 0x100 + SO_PEERCRED = 0x1022 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVTIMEO = 0x1006 + SO_REUSEADDR = 0x4 + SO_REUSEPORT = 0x200 + SO_RTABLE = 0x1021 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_SPLICE = 0x1023 + SO_TIMESTAMP = 0x800 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + TCIFLUSH = 0x1 + TCIOFLUSH = 0x3 + TCOFLUSH = 0x2 + TCP_MAXBURST = 0x4 + TCP_MAXSEG = 0x2 + TCP_MAXWIN = 0xffff + TCP_MAX_SACK = 0x3 + TCP_MAX_WINSHIFT = 0xe + TCP_MD5SIG = 0x4 + TCP_MSS = 0x200 + TCP_NODELAY = 0x1 + TCP_NOPUSH = 0x10 + TCP_NSTATES = 0xb + TCP_SACK_ENABLE = 0x8 + TCSAFLUSH = 0x2 + TIOCCBRK = 0x2000747a + TIOCCDTR = 0x20007478 + TIOCCONS = 0x80047462 + TIOCDRAIN = 0x2000745e + TIOCEXCL = 0x2000740d + TIOCEXT = 0x80047460 + TIOCFLAG_CLOCAL = 0x2 + TIOCFLAG_CRTSCTS = 0x4 + TIOCFLAG_MDMBUF = 0x8 + TIOCFLAG_PPS = 0x10 + TIOCFLAG_SOFTCAR = 0x1 + TIOCFLUSH = 0x80047410 + TIOCGETA = 0x402c7413 + TIOCGETD = 0x4004741a + TIOCGFLAGS = 0x4004745d + TIOCGPGRP = 0x40047477 + TIOCGSID = 0x40047463 + TIOCGTSTAMP = 0x4010745b + TIOCGWINSZ = 0x40087468 + TIOCMBIC = 0x8004746b + TIOCMBIS = 0x8004746c + TIOCMGET = 0x4004746a + TIOCMODG = 0x4004746a + TIOCMODS = 0x8004746d + TIOCMSET = 0x8004746d + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x20007471 + TIOCNXCL = 0x2000740e + TIOCOUTQ = 0x40047473 + TIOCPKT = 0x80047470 + TIOCPKT_DATA = 0x0 + TIOCPKT_DOSTOP = 0x20 + TIOCPKT_FLUSHREAD = 0x1 + TIOCPKT_FLUSHWRITE = 0x2 + TIOCPKT_IOCTL = 0x40 + TIOCPKT_NOSTOP = 0x10 + TIOCPKT_START = 0x8 + TIOCPKT_STOP = 0x4 + TIOCREMOTE = 0x80047469 + TIOCSBRK = 0x2000747b + TIOCSCTTY = 0x20007461 + TIOCSDTR = 0x20007479 + TIOCSETA = 0x802c7414 + TIOCSETAF = 0x802c7416 + TIOCSETAW = 0x802c7415 + TIOCSETD = 0x8004741b + TIOCSFLAGS = 0x8004745c + TIOCSIG = 0x8004745f + TIOCSPGRP = 0x80047476 + TIOCSTART = 0x2000746e + TIOCSTAT = 0x80047465 + TIOCSTI = 0x80017472 + TIOCSTOP = 0x2000746f + TIOCSTSTAMP = 0x8008745a + TIOCSWINSZ = 0x80087467 + TIOCUCNTL = 0x80047466 + TOSTOP = 0x400000 + VDISCARD = 0xf + VDSUSP = 0xb + VEOF = 0x0 + VEOL = 0x1 + VEOL2 = 0x2 + VERASE = 0x3 + VINTR = 0x8 + VKILL = 0x5 + VLNEXT = 0xe + VMIN = 0x10 + VQUIT = 0x9 + VREPRINT = 0x6 + VSTART = 0xc + VSTATUS = 0x12 + VSTOP = 0xd + VSUSP = 0xa + VTIME = 0x11 + VWERASE = 0x4 + WALTSIG = 0x4 + WCONTINUED = 0x8 + WCOREFLAG = 0x80 + WNOHANG = 0x1 + WSTOPPED = 0x7f + WUNTRACED = 0x2 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x30) + EADDRNOTAVAIL = syscall.Errno(0x31) + EAFNOSUPPORT = syscall.Errno(0x2f) + EAGAIN = syscall.Errno(0x23) + EALREADY = syscall.Errno(0x25) + EAUTH = syscall.Errno(0x50) + EBADF = syscall.Errno(0x9) + EBADRPC = syscall.Errno(0x48) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x58) + ECHILD = syscall.Errno(0xa) + ECONNABORTED = syscall.Errno(0x35) + ECONNREFUSED = syscall.Errno(0x3d) + ECONNRESET = syscall.Errno(0x36) + EDEADLK = syscall.Errno(0xb) + EDESTADDRREQ = syscall.Errno(0x27) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x45) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EFTYPE = syscall.Errno(0x4f) + EHOSTDOWN = syscall.Errno(0x40) + EHOSTUNREACH = syscall.Errno(0x41) + EIDRM = syscall.Errno(0x59) + EILSEQ = syscall.Errno(0x54) + EINPROGRESS = syscall.Errno(0x24) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EIPSEC = syscall.Errno(0x52) + EISCONN = syscall.Errno(0x38) + EISDIR = syscall.Errno(0x15) + ELAST = syscall.Errno(0x5b) + ELOOP = syscall.Errno(0x3e) + EMEDIUMTYPE = syscall.Errno(0x56) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x28) + ENAMETOOLONG = syscall.Errno(0x3f) + ENEEDAUTH = syscall.Errno(0x51) + ENETDOWN = syscall.Errno(0x32) + ENETRESET = syscall.Errno(0x34) + ENETUNREACH = syscall.Errno(0x33) + ENFILE = syscall.Errno(0x17) + ENOATTR = syscall.Errno(0x53) + ENOBUFS = syscall.Errno(0x37) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x4d) + ENOMEDIUM = syscall.Errno(0x55) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x5a) + ENOPROTOOPT = syscall.Errno(0x2a) + ENOSPC = syscall.Errno(0x1c) + ENOSYS = syscall.Errno(0x4e) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x39) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x42) + ENOTSOCK = syscall.Errno(0x26) + ENOTSUP = syscall.Errno(0x5b) + ENOTTY = syscall.Errno(0x19) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x2d) + EOVERFLOW = syscall.Errno(0x57) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x2e) + EPIPE = syscall.Errno(0x20) + EPROCLIM = syscall.Errno(0x43) + EPROCUNAVAIL = syscall.Errno(0x4c) + EPROGMISMATCH = syscall.Errno(0x4b) + EPROGUNAVAIL = syscall.Errno(0x4a) + EPROTONOSUPPORT = syscall.Errno(0x2b) + EPROTOTYPE = syscall.Errno(0x29) + ERANGE = syscall.Errno(0x22) + EREMOTE = syscall.Errno(0x47) + EROFS = syscall.Errno(0x1e) + ERPCMISMATCH = syscall.Errno(0x49) + ESHUTDOWN = syscall.Errno(0x3a) + ESOCKTNOSUPPORT = syscall.Errno(0x2c) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESTALE = syscall.Errno(0x46) + ETIMEDOUT = syscall.Errno(0x3c) + ETOOMANYREFS = syscall.Errno(0x3b) + ETXTBSY = syscall.Errno(0x1a) + EUSERS = syscall.Errno(0x44) + EWOULDBLOCK = syscall.Errno(0x23) + EXDEV = syscall.Errno(0x12) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCHLD = syscall.Signal(0x14) + SIGCONT = syscall.Signal(0x13) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x1d) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x17) + SIGIOT = syscall.Signal(0x6) + SIGKILL = syscall.Signal(0x9) + SIGPIPE = syscall.Signal(0xd) + SIGPROF = syscall.Signal(0x1b) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x11) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHR = syscall.Signal(0x20) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x12) + SIGTTIN = syscall.Signal(0x15) + SIGTTOU = syscall.Signal(0x16) + SIGURG = syscall.Signal(0x10) + SIGUSR1 = syscall.Signal(0x1e) + SIGUSR2 = syscall.Signal(0x1f) + SIGVTALRM = syscall.Signal(0x1a) + SIGWINCH = syscall.Signal(0x1c) + SIGXCPU = syscall.Signal(0x18) + SIGXFSZ = syscall.Signal(0x19) +) + +// Error table +var errors = [...]string{ + 1: "operation not permitted", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "input/output error", + 6: "device not configured", + 7: "argument list too long", + 8: "exec format error", + 9: "bad file descriptor", + 10: "no child processes", + 11: "resource deadlock avoided", + 12: "cannot allocate memory", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device busy", + 17: "file exists", + 18: "cross-device link", + 19: "operation not supported by device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "too many open files in system", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "numerical argument out of domain", + 34: "result too large", + 35: "resource temporarily unavailable", + 36: "operation now in progress", + 37: "operation already in progress", + 38: "socket operation on non-socket", + 39: "destination address required", + 40: "message too long", + 41: "protocol wrong type for socket", + 42: "protocol not available", + 43: "protocol not supported", + 44: "socket type not supported", + 45: "operation not supported", + 46: "protocol family not supported", + 47: "address family not supported by protocol family", + 48: "address already in use", + 49: "can't assign requested address", + 50: "network is down", + 51: "network is unreachable", + 52: "network dropped connection on reset", + 53: "software caused connection abort", + 54: "connection reset by peer", + 55: "no buffer space available", + 56: "socket is already connected", + 57: "socket is not connected", + 58: "can't send after socket shutdown", + 59: "too many references: can't splice", + 60: "connection timed out", + 61: "connection refused", + 62: "too many levels of symbolic links", + 63: "file name too long", + 64: "host is down", + 65: "no route to host", + 66: "directory not empty", + 67: "too many processes", + 68: "too many users", + 69: "disc quota exceeded", + 70: "stale NFS file handle", + 71: "too many levels of remote in path", + 72: "RPC struct is bad", + 73: "RPC version wrong", + 74: "RPC prog. not avail", + 75: "program version wrong", + 76: "bad procedure for program", + 77: "no locks available", + 78: "function not implemented", + 79: "inappropriate file type or format", + 80: "authentication error", + 81: "need authenticator", + 82: "IPsec processing failure", + 83: "attribute not found", + 84: "illegal byte sequence", + 85: "no medium found", + 86: "wrong medium type", + 87: "value too large to be stored in data type", + 88: "operation canceled", + 89: "identifier removed", + 90: "no message of desired type", + 91: "not supported", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal instruction", + 5: "trace/BPT trap", + 6: "abort trap", + 7: "EMT trap", + 8: "floating point exception", + 9: "killed", + 10: "bus error", + 11: "segmentation fault", + 12: "bad system call", + 13: "broken pipe", + 14: "alarm clock", + 15: "terminated", + 16: "urgent I/O condition", + 17: "stopped (signal)", + 18: "stopped", + 19: "continued", + 20: "child exited", + 21: "stopped (tty input)", + 22: "stopped (tty output)", + 23: "I/O possible", + 24: "cputime limit exceeded", + 25: "filesize limit exceeded", + 26: "virtual timer expired", + 27: "profiling timer expired", + 28: "window size changes", + 29: "information request", + 30: "user defined signal 1", + 31: "user defined signal 2", + 32: "thread AST", +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..a08922b9818d5b8043ebb0e9d561e2d56006a4ff --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go @@ -0,0 +1,1436 @@ +// mkerrors.sh -m64 +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build amd64,solaris + +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -m64 _const.go + +package unix + +import "syscall" + +const ( + AF_802 = 0x12 + AF_APPLETALK = 0x10 + AF_CCITT = 0xa + AF_CHAOS = 0x5 + AF_DATAKIT = 0x9 + AF_DECnet = 0xc + AF_DLI = 0xd + AF_ECMA = 0x8 + AF_FILE = 0x1 + AF_GOSIP = 0x16 + AF_HYLINK = 0xf + AF_IMPLINK = 0x3 + AF_INET = 0x2 + AF_INET6 = 0x1a + AF_INET_OFFLOAD = 0x1e + AF_IPX = 0x17 + AF_KEY = 0x1b + AF_LAT = 0xe + AF_LINK = 0x19 + AF_LOCAL = 0x1 + AF_MAX = 0x20 + AF_NBS = 0x7 + AF_NCA = 0x1c + AF_NIT = 0x11 + AF_NS = 0x6 + AF_OSI = 0x13 + AF_OSINET = 0x15 + AF_PACKET = 0x20 + AF_POLICY = 0x1d + AF_PUP = 0x4 + AF_ROUTE = 0x18 + AF_SNA = 0xb + AF_TRILL = 0x1f + AF_UNIX = 0x1 + AF_UNSPEC = 0x0 + AF_X25 = 0x14 + ARPHRD_ARCNET = 0x7 + ARPHRD_ATM = 0x10 + ARPHRD_AX25 = 0x3 + ARPHRD_CHAOS = 0x5 + ARPHRD_EETHER = 0x2 + ARPHRD_ETHER = 0x1 + ARPHRD_FC = 0x12 + ARPHRD_FRAME = 0xf + ARPHRD_HDLC = 0x11 + ARPHRD_IB = 0x20 + ARPHRD_IEEE802 = 0x6 + ARPHRD_IPATM = 0x13 + ARPHRD_METRICOM = 0x17 + ARPHRD_TUNNEL = 0x1f + B0 = 0x0 + B110 = 0x3 + B115200 = 0x12 + B1200 = 0x9 + B134 = 0x4 + B150 = 0x5 + B153600 = 0x13 + B1800 = 0xa + B19200 = 0xe + B200 = 0x6 + B230400 = 0x14 + B2400 = 0xb + B300 = 0x7 + B307200 = 0x15 + B38400 = 0xf + B460800 = 0x16 + B4800 = 0xc + B50 = 0x1 + B57600 = 0x10 + B600 = 0x8 + B75 = 0x2 + B76800 = 0x11 + B921600 = 0x17 + B9600 = 0xd + BIOCFLUSH = 0x20004268 + BIOCGBLEN = 0x40044266 + BIOCGDLT = 0x4004426a + BIOCGDLTLIST = -0x3fefbd89 + BIOCGDLTLIST32 = -0x3ff7bd89 + BIOCGETIF = 0x4020426b + BIOCGETLIF = 0x4078426b + BIOCGHDRCMPLT = 0x40044274 + BIOCGRTIMEOUT = 0x4010427b + BIOCGRTIMEOUT32 = 0x4008427b + BIOCGSEESENT = 0x40044278 + BIOCGSTATS = 0x4080426f + BIOCGSTATSOLD = 0x4008426f + BIOCIMMEDIATE = -0x7ffbbd90 + BIOCPROMISC = 0x20004269 + BIOCSBLEN = -0x3ffbbd9a + BIOCSDLT = -0x7ffbbd8a + BIOCSETF = -0x7fefbd99 + BIOCSETF32 = -0x7ff7bd99 + BIOCSETIF = -0x7fdfbd94 + BIOCSETLIF = -0x7f87bd94 + BIOCSHDRCMPLT = -0x7ffbbd8b + BIOCSRTIMEOUT = -0x7fefbd86 + BIOCSRTIMEOUT32 = -0x7ff7bd86 + BIOCSSEESENT = -0x7ffbbd87 + BIOCSTCPF = -0x7fefbd8e + BIOCSUDPF = -0x7fefbd8d + BIOCVERSION = 0x40044271 + BPF_A = 0x10 + BPF_ABS = 0x20 + BPF_ADD = 0x0 + BPF_ALIGNMENT = 0x4 + BPF_ALU = 0x4 + BPF_AND = 0x50 + BPF_B = 0x10 + BPF_DFLTBUFSIZE = 0x100000 + BPF_DIV = 0x30 + BPF_H = 0x8 + BPF_IMM = 0x0 + BPF_IND = 0x40 + BPF_JA = 0x0 + BPF_JEQ = 0x10 + BPF_JGE = 0x30 + BPF_JGT = 0x20 + BPF_JMP = 0x5 + BPF_JSET = 0x40 + BPF_K = 0x0 + BPF_LD = 0x0 + BPF_LDX = 0x1 + BPF_LEN = 0x80 + BPF_LSH = 0x60 + BPF_MAJOR_VERSION = 0x1 + BPF_MAXBUFSIZE = 0x1000000 + BPF_MAXINSNS = 0x200 + BPF_MEM = 0x60 + BPF_MEMWORDS = 0x10 + BPF_MINBUFSIZE = 0x20 + BPF_MINOR_VERSION = 0x1 + BPF_MISC = 0x7 + BPF_MSH = 0xa0 + BPF_MUL = 0x20 + BPF_NEG = 0x80 + BPF_OR = 0x40 + BPF_RELEASE = 0x30bb6 + BPF_RET = 0x6 + BPF_RSH = 0x70 + BPF_ST = 0x2 + BPF_STX = 0x3 + BPF_SUB = 0x10 + BPF_TAX = 0x0 + BPF_TXA = 0x80 + BPF_W = 0x0 + BPF_X = 0x8 + BRKINT = 0x2 + CFLUSH = 0xf + CLOCAL = 0x800 + CLOCK_HIGHRES = 0x4 + CLOCK_LEVEL = 0xa + CLOCK_MONOTONIC = 0x4 + CLOCK_PROCESS_CPUTIME_ID = 0x5 + CLOCK_PROF = 0x2 + CLOCK_REALTIME = 0x3 + CLOCK_THREAD_CPUTIME_ID = 0x2 + CLOCK_VIRTUAL = 0x1 + CREAD = 0x80 + CS5 = 0x0 + CS6 = 0x10 + CS7 = 0x20 + CS8 = 0x30 + CSIZE = 0x30 + CSTART = 0x11 + CSTATUS = 0x14 + CSTOP = 0x13 + CSTOPB = 0x40 + CSUSP = 0x1a + CSWTCH = 0x1a + DLT_AIRONET_HEADER = 0x78 + DLT_APPLE_IP_OVER_IEEE1394 = 0x8a + DLT_ARCNET = 0x7 + DLT_ARCNET_LINUX = 0x81 + DLT_ATM_CLIP = 0x13 + DLT_ATM_RFC1483 = 0xb + DLT_AURORA = 0x7e + DLT_AX25 = 0x3 + DLT_BACNET_MS_TP = 0xa5 + DLT_CHAOS = 0x5 + DLT_CISCO_IOS = 0x76 + DLT_C_HDLC = 0x68 + DLT_DOCSIS = 0x8f + DLT_ECONET = 0x73 + DLT_EN10MB = 0x1 + DLT_EN3MB = 0x2 + DLT_ENC = 0x6d + DLT_ERF_ETH = 0xaf + DLT_ERF_POS = 0xb0 + DLT_FDDI = 0xa + DLT_FRELAY = 0x6b + DLT_GCOM_SERIAL = 0xad + DLT_GCOM_T1E1 = 0xac + DLT_GPF_F = 0xab + DLT_GPF_T = 0xaa + DLT_GPRS_LLC = 0xa9 + DLT_HDLC = 0x10 + DLT_HHDLC = 0x79 + DLT_HIPPI = 0xf + DLT_IBM_SN = 0x92 + DLT_IBM_SP = 0x91 + DLT_IEEE802 = 0x6 + DLT_IEEE802_11 = 0x69 + DLT_IEEE802_11_RADIO = 0x7f + DLT_IEEE802_11_RADIO_AVS = 0xa3 + DLT_IPNET = 0xe2 + DLT_IPOIB = 0xa2 + DLT_IP_OVER_FC = 0x7a + DLT_JUNIPER_ATM1 = 0x89 + DLT_JUNIPER_ATM2 = 0x87 + DLT_JUNIPER_CHDLC = 0xb5 + DLT_JUNIPER_ES = 0x84 + DLT_JUNIPER_ETHER = 0xb2 + DLT_JUNIPER_FRELAY = 0xb4 + DLT_JUNIPER_GGSN = 0x85 + DLT_JUNIPER_MFR = 0x86 + DLT_JUNIPER_MLFR = 0x83 + DLT_JUNIPER_MLPPP = 0x82 + DLT_JUNIPER_MONITOR = 0xa4 + DLT_JUNIPER_PIC_PEER = 0xae + DLT_JUNIPER_PPP = 0xb3 + DLT_JUNIPER_PPPOE = 0xa7 + DLT_JUNIPER_PPPOE_ATM = 0xa8 + DLT_JUNIPER_SERVICES = 0x88 + DLT_LINUX_IRDA = 0x90 + DLT_LINUX_LAPD = 0xb1 + DLT_LINUX_SLL = 0x71 + DLT_LOOP = 0x6c + DLT_LTALK = 0x72 + DLT_MTP2 = 0x8c + DLT_MTP2_WITH_PHDR = 0x8b + DLT_MTP3 = 0x8d + DLT_NULL = 0x0 + DLT_PCI_EXP = 0x7d + DLT_PFLOG = 0x75 + DLT_PFSYNC = 0x12 + DLT_PPP = 0x9 + DLT_PPP_BSDOS = 0xe + DLT_PPP_PPPD = 0xa6 + DLT_PRISM_HEADER = 0x77 + DLT_PRONET = 0x4 + DLT_RAW = 0xc + DLT_RAWAF_MASK = 0x2240000 + DLT_RIO = 0x7c + DLT_SCCP = 0x8e + DLT_SLIP = 0x8 + DLT_SLIP_BSDOS = 0xd + DLT_SUNATM = 0x7b + DLT_SYMANTEC_FIREWALL = 0x63 + DLT_TZSP = 0x80 + ECHO = 0x8 + ECHOCTL = 0x200 + ECHOE = 0x10 + ECHOK = 0x20 + ECHOKE = 0x800 + ECHONL = 0x40 + ECHOPRT = 0x400 + EMPTY_SET = 0x0 + EMT_CPCOVF = 0x1 + EQUALITY_CHECK = 0x0 + EXTA = 0xe + EXTB = 0xf + FD_CLOEXEC = 0x1 + FD_NFDBITS = 0x40 + FD_SETSIZE = 0x10000 + FLUSHALL = 0x1 + FLUSHDATA = 0x0 + FLUSHO = 0x2000 + F_ALLOCSP = 0xa + F_ALLOCSP64 = 0xa + F_BADFD = 0x2e + F_BLKSIZE = 0x13 + F_BLOCKS = 0x12 + F_CHKFL = 0x8 + F_COMPAT = 0x8 + F_DUP2FD = 0x9 + F_DUP2FD_CLOEXEC = 0x24 + F_DUPFD = 0x0 + F_DUPFD_CLOEXEC = 0x25 + F_FREESP = 0xb + F_FREESP64 = 0xb + F_GETFD = 0x1 + F_GETFL = 0x3 + F_GETLK = 0xe + F_GETLK64 = 0xe + F_GETOWN = 0x17 + F_GETXFL = 0x2d + F_HASREMOTELOCKS = 0x1a + F_ISSTREAM = 0xd + F_MANDDNY = 0x10 + F_MDACC = 0x20 + F_NODNY = 0x0 + F_NPRIV = 0x10 + F_PRIV = 0xf + F_QUOTACTL = 0x11 + F_RDACC = 0x1 + F_RDDNY = 0x1 + F_RDLCK = 0x1 + F_REVOKE = 0x19 + F_RMACC = 0x4 + F_RMDNY = 0x4 + F_RWACC = 0x3 + F_RWDNY = 0x3 + F_SETFD = 0x2 + F_SETFL = 0x4 + F_SETLK = 0x6 + F_SETLK64 = 0x6 + F_SETLK64_NBMAND = 0x2a + F_SETLKW = 0x7 + F_SETLKW64 = 0x7 + F_SETLK_NBMAND = 0x2a + F_SETOWN = 0x18 + F_SHARE = 0x28 + F_SHARE_NBMAND = 0x2b + F_UNLCK = 0x3 + F_UNLKSYS = 0x4 + F_UNSHARE = 0x29 + F_WRACC = 0x2 + F_WRDNY = 0x2 + F_WRLCK = 0x2 + HUPCL = 0x400 + ICANON = 0x2 + ICRNL = 0x100 + IEXTEN = 0x8000 + IFF_ADDRCONF = 0x80000 + IFF_ALLMULTI = 0x200 + IFF_ANYCAST = 0x400000 + IFF_BROADCAST = 0x2 + IFF_CANTCHANGE = 0x7f203003b5a + IFF_COS_ENABLED = 0x200000000 + IFF_DEBUG = 0x4 + IFF_DEPRECATED = 0x40000 + IFF_DHCPRUNNING = 0x4000 + IFF_DUPLICATE = 0x4000000000 + IFF_FAILED = 0x10000000 + IFF_FIXEDMTU = 0x1000000000 + IFF_INACTIVE = 0x40000000 + IFF_INTELLIGENT = 0x400 + IFF_IPMP = 0x8000000000 + IFF_IPMP_CANTCHANGE = 0x10000000 + IFF_IPMP_INVALID = 0x1ec200080 + IFF_IPV4 = 0x1000000 + IFF_IPV6 = 0x2000000 + IFF_L3PROTECT = 0x40000000000 + IFF_LOOPBACK = 0x8 + IFF_MULTICAST = 0x800 + IFF_MULTI_BCAST = 0x1000 + IFF_NOACCEPT = 0x4000000 + IFF_NOARP = 0x80 + IFF_NOFAILOVER = 0x8000000 + IFF_NOLINKLOCAL = 0x20000000000 + IFF_NOLOCAL = 0x20000 + IFF_NONUD = 0x200000 + IFF_NORTEXCH = 0x800000 + IFF_NOTRAILERS = 0x20 + IFF_NOXMIT = 0x10000 + IFF_OFFLINE = 0x80000000 + IFF_POINTOPOINT = 0x10 + IFF_PREFERRED = 0x400000000 + IFF_PRIVATE = 0x8000 + IFF_PROMISC = 0x100 + IFF_ROUTER = 0x100000 + IFF_RUNNING = 0x40 + IFF_STANDBY = 0x20000000 + IFF_TEMPORARY = 0x800000000 + IFF_UNNUMBERED = 0x2000 + IFF_UP = 0x1 + IFF_VIRTUAL = 0x2000000000 + IFF_VRRP = 0x10000000000 + IFF_XRESOLV = 0x100000000 + IFNAMSIZ = 0x10 + IFT_1822 = 0x2 + IFT_6TO4 = 0xca + IFT_AAL5 = 0x31 + IFT_ARCNET = 0x23 + IFT_ARCNETPLUS = 0x24 + IFT_ATM = 0x25 + IFT_CEPT = 0x13 + IFT_DS3 = 0x1e + IFT_EON = 0x19 + IFT_ETHER = 0x6 + IFT_FDDI = 0xf + IFT_FRELAY = 0x20 + IFT_FRELAYDCE = 0x2c + IFT_HDH1822 = 0x3 + IFT_HIPPI = 0x2f + IFT_HSSI = 0x2e + IFT_HY = 0xe + IFT_IB = 0xc7 + IFT_IPV4 = 0xc8 + IFT_IPV6 = 0xc9 + IFT_ISDNBASIC = 0x14 + IFT_ISDNPRIMARY = 0x15 + IFT_ISO88022LLC = 0x29 + IFT_ISO88023 = 0x7 + IFT_ISO88024 = 0x8 + IFT_ISO88025 = 0x9 + IFT_ISO88026 = 0xa + IFT_LAPB = 0x10 + IFT_LOCALTALK = 0x2a + IFT_LOOP = 0x18 + IFT_MIOX25 = 0x26 + IFT_MODEM = 0x30 + IFT_NSIP = 0x1b + IFT_OTHER = 0x1 + IFT_P10 = 0xc + IFT_P80 = 0xd + IFT_PARA = 0x22 + IFT_PPP = 0x17 + IFT_PROPMUX = 0x36 + IFT_PROPVIRTUAL = 0x35 + IFT_PTPSERIAL = 0x16 + IFT_RS232 = 0x21 + IFT_SDLC = 0x11 + IFT_SIP = 0x1f + IFT_SLIP = 0x1c + IFT_SMDSDXI = 0x2b + IFT_SMDSICIP = 0x34 + IFT_SONET = 0x27 + IFT_SONETPATH = 0x32 + IFT_SONETVT = 0x33 + IFT_STARLAN = 0xb + IFT_T1 = 0x12 + IFT_ULTRA = 0x1d + IFT_V35 = 0x2d + IFT_X25 = 0x5 + IFT_X25DDN = 0x4 + IFT_X25PLE = 0x28 + IFT_XETHER = 0x1a + IGNBRK = 0x1 + IGNCR = 0x80 + IGNPAR = 0x4 + IMAXBEL = 0x2000 + INLCR = 0x40 + INPCK = 0x10 + IN_AUTOCONF_MASK = 0xffff0000 + IN_AUTOCONF_NET = 0xa9fe0000 + IN_CLASSA_HOST = 0xffffff + IN_CLASSA_MAX = 0x80 + IN_CLASSA_NET = 0xff000000 + IN_CLASSA_NSHIFT = 0x18 + IN_CLASSB_HOST = 0xffff + IN_CLASSB_MAX = 0x10000 + IN_CLASSB_NET = 0xffff0000 + IN_CLASSB_NSHIFT = 0x10 + IN_CLASSC_HOST = 0xff + IN_CLASSC_NET = 0xffffff00 + IN_CLASSC_NSHIFT = 0x8 + IN_CLASSD_HOST = 0xfffffff + IN_CLASSD_NET = 0xf0000000 + IN_CLASSD_NSHIFT = 0x1c + IN_CLASSE_NET = 0xffffffff + IN_LOOPBACKNET = 0x7f + IN_PRIVATE12_MASK = 0xfff00000 + IN_PRIVATE12_NET = 0xac100000 + IN_PRIVATE16_MASK = 0xffff0000 + IN_PRIVATE16_NET = 0xc0a80000 + IN_PRIVATE8_MASK = 0xff000000 + IN_PRIVATE8_NET = 0xa000000 + IPPROTO_AH = 0x33 + IPPROTO_DSTOPTS = 0x3c + IPPROTO_EGP = 0x8 + IPPROTO_ENCAP = 0x4 + IPPROTO_EON = 0x50 + IPPROTO_ESP = 0x32 + IPPROTO_FRAGMENT = 0x2c + IPPROTO_GGP = 0x3 + IPPROTO_HELLO = 0x3f + IPPROTO_HOPOPTS = 0x0 + IPPROTO_ICMP = 0x1 + IPPROTO_ICMPV6 = 0x3a + IPPROTO_IDP = 0x16 + IPPROTO_IGMP = 0x2 + IPPROTO_IP = 0x0 + IPPROTO_IPV6 = 0x29 + IPPROTO_MAX = 0x100 + IPPROTO_ND = 0x4d + IPPROTO_NONE = 0x3b + IPPROTO_OSPF = 0x59 + IPPROTO_PIM = 0x67 + IPPROTO_PUP = 0xc + IPPROTO_RAW = 0xff + IPPROTO_ROUTING = 0x2b + IPPROTO_RSVP = 0x2e + IPPROTO_SCTP = 0x84 + IPPROTO_TCP = 0x6 + IPPROTO_UDP = 0x11 + IPV6_ADD_MEMBERSHIP = 0x9 + IPV6_BOUND_IF = 0x41 + IPV6_CHECKSUM = 0x18 + IPV6_DONTFRAG = 0x21 + IPV6_DROP_MEMBERSHIP = 0xa + IPV6_DSTOPTS = 0xf + IPV6_FLOWINFO_FLOWLABEL = 0xffff0f00 + IPV6_FLOWINFO_TCLASS = 0xf00f + IPV6_HOPLIMIT = 0xc + IPV6_HOPOPTS = 0xe + IPV6_JOIN_GROUP = 0x9 + IPV6_LEAVE_GROUP = 0xa + IPV6_MULTICAST_HOPS = 0x7 + IPV6_MULTICAST_IF = 0x6 + IPV6_MULTICAST_LOOP = 0x8 + IPV6_NEXTHOP = 0xd + IPV6_PAD1_OPT = 0x0 + IPV6_PATHMTU = 0x25 + IPV6_PKTINFO = 0xb + IPV6_PREFER_SRC_CGA = 0x20 + IPV6_PREFER_SRC_CGADEFAULT = 0x10 + IPV6_PREFER_SRC_CGAMASK = 0x30 + IPV6_PREFER_SRC_COA = 0x2 + IPV6_PREFER_SRC_DEFAULT = 0x15 + IPV6_PREFER_SRC_HOME = 0x1 + IPV6_PREFER_SRC_MASK = 0x3f + IPV6_PREFER_SRC_MIPDEFAULT = 0x1 + IPV6_PREFER_SRC_MIPMASK = 0x3 + IPV6_PREFER_SRC_NONCGA = 0x10 + IPV6_PREFER_SRC_PUBLIC = 0x4 + IPV6_PREFER_SRC_TMP = 0x8 + IPV6_PREFER_SRC_TMPDEFAULT = 0x4 + IPV6_PREFER_SRC_TMPMASK = 0xc + IPV6_RECVDSTOPTS = 0x28 + IPV6_RECVHOPLIMIT = 0x13 + IPV6_RECVHOPOPTS = 0x14 + IPV6_RECVPATHMTU = 0x24 + IPV6_RECVPKTINFO = 0x12 + IPV6_RECVRTHDR = 0x16 + IPV6_RECVRTHDRDSTOPTS = 0x17 + IPV6_RECVTCLASS = 0x19 + IPV6_RTHDR = 0x10 + IPV6_RTHDRDSTOPTS = 0x11 + IPV6_RTHDR_TYPE_0 = 0x0 + IPV6_SEC_OPT = 0x22 + IPV6_SRC_PREFERENCES = 0x23 + IPV6_TCLASS = 0x26 + IPV6_UNICAST_HOPS = 0x5 + IPV6_UNSPEC_SRC = 0x42 + IPV6_USE_MIN_MTU = 0x20 + IPV6_V6ONLY = 0x27 + IP_ADD_MEMBERSHIP = 0x13 + IP_ADD_SOURCE_MEMBERSHIP = 0x17 + IP_BLOCK_SOURCE = 0x15 + IP_BOUND_IF = 0x41 + IP_BROADCAST = 0x106 + IP_BROADCAST_TTL = 0x43 + IP_DEFAULT_MULTICAST_LOOP = 0x1 + IP_DEFAULT_MULTICAST_TTL = 0x1 + IP_DF = 0x4000 + IP_DHCPINIT_IF = 0x45 + IP_DONTFRAG = 0x1b + IP_DONTROUTE = 0x105 + IP_DROP_MEMBERSHIP = 0x14 + IP_DROP_SOURCE_MEMBERSHIP = 0x18 + IP_HDRINCL = 0x2 + IP_MAXPACKET = 0xffff + IP_MF = 0x2000 + IP_MSS = 0x240 + IP_MULTICAST_IF = 0x10 + IP_MULTICAST_LOOP = 0x12 + IP_MULTICAST_TTL = 0x11 + IP_NEXTHOP = 0x19 + IP_OPTIONS = 0x1 + IP_PKTINFO = 0x1a + IP_RECVDSTADDR = 0x7 + IP_RECVIF = 0x9 + IP_RECVOPTS = 0x5 + IP_RECVPKTINFO = 0x1a + IP_RECVRETOPTS = 0x6 + IP_RECVSLLA = 0xa + IP_RECVTTL = 0xb + IP_RETOPTS = 0x8 + IP_REUSEADDR = 0x104 + IP_SEC_OPT = 0x22 + IP_TOS = 0x3 + IP_TTL = 0x4 + IP_UNBLOCK_SOURCE = 0x16 + IP_UNSPEC_SRC = 0x42 + ISIG = 0x1 + ISTRIP = 0x20 + IXANY = 0x800 + IXOFF = 0x1000 + IXON = 0x400 + MADV_ACCESS_DEFAULT = 0x6 + MADV_ACCESS_LWP = 0x7 + MADV_ACCESS_MANY = 0x8 + MADV_DONTNEED = 0x4 + MADV_FREE = 0x5 + MADV_NORMAL = 0x0 + MADV_RANDOM = 0x1 + MADV_SEQUENTIAL = 0x2 + MADV_WILLNEED = 0x3 + MAP_32BIT = 0x80 + MAP_ALIGN = 0x200 + MAP_ANON = 0x100 + MAP_ANONYMOUS = 0x100 + MAP_FIXED = 0x10 + MAP_INITDATA = 0x800 + MAP_NORESERVE = 0x40 + MAP_PRIVATE = 0x2 + MAP_RENAME = 0x20 + MAP_SHARED = 0x1 + MAP_TEXT = 0x400 + MAP_TYPE = 0xf + MCL_CURRENT = 0x1 + MCL_FUTURE = 0x2 + MSG_CTRUNC = 0x10 + MSG_DONTROUTE = 0x4 + MSG_DONTWAIT = 0x80 + MSG_DUPCTRL = 0x800 + MSG_EOR = 0x8 + MSG_MAXIOVLEN = 0x10 + MSG_NOTIFICATION = 0x100 + MSG_OOB = 0x1 + MSG_PEEK = 0x2 + MSG_TRUNC = 0x20 + MSG_WAITALL = 0x40 + MSG_XPG4_2 = 0x8000 + MS_ASYNC = 0x1 + MS_INVALIDATE = 0x2 + MS_OLDSYNC = 0x0 + MS_SYNC = 0x4 + M_FLUSH = 0x86 + NOFLSH = 0x80 + OCRNL = 0x8 + OFDEL = 0x80 + OFILL = 0x40 + ONLCR = 0x4 + ONLRET = 0x20 + ONOCR = 0x10 + OPENFAIL = -0x1 + OPOST = 0x1 + O_ACCMODE = 0x600003 + O_APPEND = 0x8 + O_CLOEXEC = 0x800000 + O_CREAT = 0x100 + O_DSYNC = 0x40 + O_EXCL = 0x400 + O_EXEC = 0x400000 + O_LARGEFILE = 0x2000 + O_NDELAY = 0x4 + O_NOCTTY = 0x800 + O_NOFOLLOW = 0x20000 + O_NOLINKS = 0x40000 + O_NONBLOCK = 0x80 + O_RDONLY = 0x0 + O_RDWR = 0x2 + O_RSYNC = 0x8000 + O_SEARCH = 0x200000 + O_SIOCGIFCONF = -0x3ff796ec + O_SIOCGLIFCONF = -0x3fef9688 + O_SYNC = 0x10 + O_TRUNC = 0x200 + O_WRONLY = 0x1 + O_XATTR = 0x4000 + PARENB = 0x100 + PAREXT = 0x100000 + PARMRK = 0x8 + PARODD = 0x200 + PENDIN = 0x4000 + PRIO_PGRP = 0x1 + PRIO_PROCESS = 0x0 + PRIO_USER = 0x2 + PROT_EXEC = 0x4 + PROT_NONE = 0x0 + PROT_READ = 0x1 + PROT_WRITE = 0x2 + RLIMIT_AS = 0x6 + RLIMIT_CORE = 0x4 + RLIMIT_CPU = 0x0 + RLIMIT_DATA = 0x2 + RLIMIT_FSIZE = 0x1 + RLIMIT_NOFILE = 0x5 + RLIMIT_STACK = 0x3 + RLIM_INFINITY = -0x3 + RTAX_AUTHOR = 0x6 + RTAX_BRD = 0x7 + RTAX_DST = 0x0 + RTAX_GATEWAY = 0x1 + RTAX_GENMASK = 0x3 + RTAX_IFA = 0x5 + RTAX_IFP = 0x4 + RTAX_MAX = 0x9 + RTAX_NETMASK = 0x2 + RTAX_SRC = 0x8 + RTA_AUTHOR = 0x40 + RTA_BRD = 0x80 + RTA_DST = 0x1 + RTA_GATEWAY = 0x2 + RTA_GENMASK = 0x8 + RTA_IFA = 0x20 + RTA_IFP = 0x10 + RTA_NETMASK = 0x4 + RTA_NUMBITS = 0x9 + RTA_SRC = 0x100 + RTF_BLACKHOLE = 0x1000 + RTF_CLONING = 0x100 + RTF_DONE = 0x40 + RTF_DYNAMIC = 0x10 + RTF_GATEWAY = 0x2 + RTF_HOST = 0x4 + RTF_INDIRECT = 0x40000 + RTF_KERNEL = 0x80000 + RTF_LLINFO = 0x400 + RTF_MASK = 0x80 + RTF_MODIFIED = 0x20 + RTF_MULTIRT = 0x10000 + RTF_PRIVATE = 0x2000 + RTF_PROTO1 = 0x8000 + RTF_PROTO2 = 0x4000 + RTF_REJECT = 0x8 + RTF_SETSRC = 0x20000 + RTF_STATIC = 0x800 + RTF_UP = 0x1 + RTF_XRESOLVE = 0x200 + RTF_ZONE = 0x100000 + RTM_ADD = 0x1 + RTM_CHANGE = 0x3 + RTM_CHGADDR = 0xf + RTM_DELADDR = 0xd + RTM_DELETE = 0x2 + RTM_FREEADDR = 0x10 + RTM_GET = 0x4 + RTM_IFINFO = 0xe + RTM_LOCK = 0x8 + RTM_LOSING = 0x5 + RTM_MISS = 0x7 + RTM_NEWADDR = 0xc + RTM_OLDADD = 0x9 + RTM_OLDDEL = 0xa + RTM_REDIRECT = 0x6 + RTM_RESOLVE = 0xb + RTM_VERSION = 0x3 + RTV_EXPIRE = 0x4 + RTV_HOPCOUNT = 0x2 + RTV_MTU = 0x1 + RTV_RPIPE = 0x8 + RTV_RTT = 0x40 + RTV_RTTVAR = 0x80 + RTV_SPIPE = 0x10 + RTV_SSTHRESH = 0x20 + RT_AWARE = 0x1 + RUSAGE_CHILDREN = -0x1 + RUSAGE_SELF = 0x0 + SCM_RIGHTS = 0x1010 + SCM_TIMESTAMP = 0x1013 + SCM_UCRED = 0x1012 + SHUT_RD = 0x0 + SHUT_RDWR = 0x2 + SHUT_WR = 0x1 + SIG2STR_MAX = 0x20 + SIOCADDMULTI = -0x7fdf96cf + SIOCADDRT = -0x7fcf8df6 + SIOCATMARK = 0x40047307 + SIOCDARP = -0x7fdb96e0 + SIOCDELMULTI = -0x7fdf96ce + SIOCDELRT = -0x7fcf8df5 + SIOCDXARP = -0x7fff9658 + SIOCGARP = -0x3fdb96e1 + SIOCGDSTINFO = -0x3fff965c + SIOCGENADDR = -0x3fdf96ab + SIOCGENPSTATS = -0x3fdf96c7 + SIOCGETLSGCNT = -0x3fef8deb + SIOCGETNAME = 0x40107334 + SIOCGETPEER = 0x40107335 + SIOCGETPROP = -0x3fff8f44 + SIOCGETSGCNT = -0x3feb8deb + SIOCGETSYNC = -0x3fdf96d3 + SIOCGETVIFCNT = -0x3feb8dec + SIOCGHIWAT = 0x40047301 + SIOCGIFADDR = -0x3fdf96f3 + SIOCGIFBRDADDR = -0x3fdf96e9 + SIOCGIFCONF = -0x3ff796a4 + SIOCGIFDSTADDR = -0x3fdf96f1 + SIOCGIFFLAGS = -0x3fdf96ef + SIOCGIFHWADDR = -0x3fdf9647 + SIOCGIFINDEX = -0x3fdf96a6 + SIOCGIFMEM = -0x3fdf96ed + SIOCGIFMETRIC = -0x3fdf96e5 + SIOCGIFMTU = -0x3fdf96ea + SIOCGIFMUXID = -0x3fdf96a8 + SIOCGIFNETMASK = -0x3fdf96e7 + SIOCGIFNUM = 0x40046957 + SIOCGIP6ADDRPOLICY = -0x3fff965e + SIOCGIPMSFILTER = -0x3ffb964c + SIOCGLIFADDR = -0x3f87968f + SIOCGLIFBINDING = -0x3f879666 + SIOCGLIFBRDADDR = -0x3f879685 + SIOCGLIFCONF = -0x3fef965b + SIOCGLIFDADSTATE = -0x3f879642 + SIOCGLIFDSTADDR = -0x3f87968d + SIOCGLIFFLAGS = -0x3f87968b + SIOCGLIFGROUPINFO = -0x3f4b9663 + SIOCGLIFGROUPNAME = -0x3f879664 + SIOCGLIFHWADDR = -0x3f879640 + SIOCGLIFINDEX = -0x3f87967b + SIOCGLIFLNKINFO = -0x3f879674 + SIOCGLIFMETRIC = -0x3f879681 + SIOCGLIFMTU = -0x3f879686 + SIOCGLIFMUXID = -0x3f87967d + SIOCGLIFNETMASK = -0x3f879683 + SIOCGLIFNUM = -0x3ff3967e + SIOCGLIFSRCOF = -0x3fef964f + SIOCGLIFSUBNET = -0x3f879676 + SIOCGLIFTOKEN = -0x3f879678 + SIOCGLIFUSESRC = -0x3f879651 + SIOCGLIFZONE = -0x3f879656 + SIOCGLOWAT = 0x40047303 + SIOCGMSFILTER = -0x3ffb964e + SIOCGPGRP = 0x40047309 + SIOCGSTAMP = -0x3fef9646 + SIOCGXARP = -0x3fff9659 + SIOCIFDETACH = -0x7fdf96c8 + SIOCILB = -0x3ffb9645 + SIOCLIFADDIF = -0x3f879691 + SIOCLIFDELND = -0x7f879673 + SIOCLIFGETND = -0x3f879672 + SIOCLIFREMOVEIF = -0x7f879692 + SIOCLIFSETND = -0x7f879671 + SIOCLOWER = -0x7fdf96d7 + SIOCSARP = -0x7fdb96e2 + SIOCSCTPGOPT = -0x3fef9653 + SIOCSCTPPEELOFF = -0x3ffb9652 + SIOCSCTPSOPT = -0x7fef9654 + SIOCSENABLESDP = -0x3ffb9649 + SIOCSETPROP = -0x7ffb8f43 + SIOCSETSYNC = -0x7fdf96d4 + SIOCSHIWAT = -0x7ffb8d00 + SIOCSIFADDR = -0x7fdf96f4 + SIOCSIFBRDADDR = -0x7fdf96e8 + SIOCSIFDSTADDR = -0x7fdf96f2 + SIOCSIFFLAGS = -0x7fdf96f0 + SIOCSIFINDEX = -0x7fdf96a5 + SIOCSIFMEM = -0x7fdf96ee + SIOCSIFMETRIC = -0x7fdf96e4 + SIOCSIFMTU = -0x7fdf96eb + SIOCSIFMUXID = -0x7fdf96a7 + SIOCSIFNAME = -0x7fdf96b7 + SIOCSIFNETMASK = -0x7fdf96e6 + SIOCSIP6ADDRPOLICY = -0x7fff965d + SIOCSIPMSFILTER = -0x7ffb964b + SIOCSLGETREQ = -0x3fdf96b9 + SIOCSLIFADDR = -0x7f879690 + SIOCSLIFBRDADDR = -0x7f879684 + SIOCSLIFDSTADDR = -0x7f87968e + SIOCSLIFFLAGS = -0x7f87968c + SIOCSLIFGROUPNAME = -0x7f879665 + SIOCSLIFINDEX = -0x7f87967a + SIOCSLIFLNKINFO = -0x7f879675 + SIOCSLIFMETRIC = -0x7f879680 + SIOCSLIFMTU = -0x7f879687 + SIOCSLIFMUXID = -0x7f87967c + SIOCSLIFNAME = -0x3f87967f + SIOCSLIFNETMASK = -0x7f879682 + SIOCSLIFPREFIX = -0x3f879641 + SIOCSLIFSUBNET = -0x7f879677 + SIOCSLIFTOKEN = -0x7f879679 + SIOCSLIFUSESRC = -0x7f879650 + SIOCSLIFZONE = -0x7f879655 + SIOCSLOWAT = -0x7ffb8cfe + SIOCSLSTAT = -0x7fdf96b8 + SIOCSMSFILTER = -0x7ffb964d + SIOCSPGRP = -0x7ffb8cf8 + SIOCSPROMISC = -0x7ffb96d0 + SIOCSQPTR = -0x3ffb9648 + SIOCSSDSTATS = -0x3fdf96d2 + SIOCSSESTATS = -0x3fdf96d1 + SIOCSXARP = -0x7fff965a + SIOCTMYADDR = -0x3ff79670 + SIOCTMYSITE = -0x3ff7966e + SIOCTONLINK = -0x3ff7966f + SIOCUPPER = -0x7fdf96d8 + SIOCX25RCV = -0x3fdf96c4 + SIOCX25TBL = -0x3fdf96c3 + SIOCX25XMT = -0x3fdf96c5 + SIOCXPROTO = 0x20007337 + SOCK_CLOEXEC = 0x80000 + SOCK_DGRAM = 0x1 + SOCK_NDELAY = 0x200000 + SOCK_NONBLOCK = 0x100000 + SOCK_RAW = 0x4 + SOCK_RDM = 0x5 + SOCK_SEQPACKET = 0x6 + SOCK_STREAM = 0x2 + SOCK_TYPE_MASK = 0xffff + SOL_FILTER = 0xfffc + SOL_PACKET = 0xfffd + SOL_ROUTE = 0xfffe + SOL_SOCKET = 0xffff + SOMAXCONN = 0x80 + SO_ACCEPTCONN = 0x2 + SO_ALL = 0x3f + SO_ALLZONES = 0x1014 + SO_ANON_MLP = 0x100a + SO_ATTACH_FILTER = 0x40000001 + SO_BAND = 0x4000 + SO_BROADCAST = 0x20 + SO_COPYOPT = 0x80000 + SO_DEBUG = 0x1 + SO_DELIM = 0x8000 + SO_DETACH_FILTER = 0x40000002 + SO_DGRAM_ERRIND = 0x200 + SO_DOMAIN = 0x100c + SO_DONTLINGER = -0x81 + SO_DONTROUTE = 0x10 + SO_ERROPT = 0x40000 + SO_ERROR = 0x1007 + SO_EXCLBIND = 0x1015 + SO_HIWAT = 0x10 + SO_ISNTTY = 0x800 + SO_ISTTY = 0x400 + SO_KEEPALIVE = 0x8 + SO_LINGER = 0x80 + SO_LOWAT = 0x20 + SO_MAC_EXEMPT = 0x100b + SO_MAC_IMPLICIT = 0x1016 + SO_MAXBLK = 0x100000 + SO_MAXPSZ = 0x8 + SO_MINPSZ = 0x4 + SO_MREADOFF = 0x80 + SO_MREADON = 0x40 + SO_NDELOFF = 0x200 + SO_NDELON = 0x100 + SO_NODELIM = 0x10000 + SO_OOBINLINE = 0x100 + SO_PROTOTYPE = 0x1009 + SO_RCVBUF = 0x1002 + SO_RCVLOWAT = 0x1004 + SO_RCVPSH = 0x100d + SO_RCVTIMEO = 0x1006 + SO_READOPT = 0x1 + SO_RECVUCRED = 0x400 + SO_REUSEADDR = 0x4 + SO_SECATTR = 0x1011 + SO_SNDBUF = 0x1001 + SO_SNDLOWAT = 0x1003 + SO_SNDTIMEO = 0x1005 + SO_STRHOLD = 0x20000 + SO_TAIL = 0x200000 + SO_TIMESTAMP = 0x1013 + SO_TONSTOP = 0x2000 + SO_TOSTOP = 0x1000 + SO_TYPE = 0x1008 + SO_USELOOPBACK = 0x40 + SO_VRRP = 0x1017 + SO_WROFF = 0x2 + TCFLSH = 0x5407 + TCGETA = 0x5401 + TCGETS = 0x540d + TCIFLUSH = 0x0 + TCIOFLUSH = 0x2 + TCOFLUSH = 0x1 + TCP_ABORT_THRESHOLD = 0x11 + TCP_ANONPRIVBIND = 0x20 + TCP_CONN_ABORT_THRESHOLD = 0x13 + TCP_CONN_NOTIFY_THRESHOLD = 0x12 + TCP_CORK = 0x18 + TCP_EXCLBIND = 0x21 + TCP_INIT_CWND = 0x15 + TCP_KEEPALIVE = 0x8 + TCP_KEEPALIVE_ABORT_THRESHOLD = 0x17 + TCP_KEEPALIVE_THRESHOLD = 0x16 + TCP_KEEPCNT = 0x23 + TCP_KEEPIDLE = 0x22 + TCP_KEEPINTVL = 0x24 + TCP_LINGER2 = 0x1c + TCP_MAXSEG = 0x2 + TCP_MSS = 0x218 + TCP_NODELAY = 0x1 + TCP_NOTIFY_THRESHOLD = 0x10 + TCP_RECVDSTADDR = 0x14 + TCP_RTO_INITIAL = 0x19 + TCP_RTO_MAX = 0x1b + TCP_RTO_MIN = 0x1a + TCSAFLUSH = 0x5410 + TCSBRK = 0x5405 + TCSETA = 0x5402 + TCSETAF = 0x5404 + TCSETAW = 0x5403 + TCSETS = 0x540e + TCSETSF = 0x5410 + TCSETSW = 0x540f + TCXONC = 0x5406 + TIOC = 0x5400 + TIOCCBRK = 0x747a + TIOCCDTR = 0x7478 + TIOCCILOOP = 0x746c + TIOCEXCL = 0x740d + TIOCFLUSH = 0x7410 + TIOCGETC = 0x7412 + TIOCGETD = 0x7400 + TIOCGETP = 0x7408 + TIOCGLTC = 0x7474 + TIOCGPGRP = 0x7414 + TIOCGPPS = 0x547d + TIOCGPPSEV = 0x547f + TIOCGSID = 0x7416 + TIOCGSOFTCAR = 0x5469 + TIOCGWINSZ = 0x5468 + TIOCHPCL = 0x7402 + TIOCKBOF = 0x5409 + TIOCKBON = 0x5408 + TIOCLBIC = 0x747e + TIOCLBIS = 0x747f + TIOCLGET = 0x747c + TIOCLSET = 0x747d + TIOCMBIC = 0x741c + TIOCMBIS = 0x741b + TIOCMGET = 0x741d + TIOCMSET = 0x741a + TIOCM_CAR = 0x40 + TIOCM_CD = 0x40 + TIOCM_CTS = 0x20 + TIOCM_DSR = 0x100 + TIOCM_DTR = 0x2 + TIOCM_LE = 0x1 + TIOCM_RI = 0x80 + TIOCM_RNG = 0x80 + TIOCM_RTS = 0x4 + TIOCM_SR = 0x10 + TIOCM_ST = 0x8 + TIOCNOTTY = 0x7471 + TIOCNXCL = 0x740e + TIOCOUTQ = 0x7473 + TIOCREMOTE = 0x741e + TIOCSBRK = 0x747b + TIOCSCTTY = 0x7484 + TIOCSDTR = 0x7479 + TIOCSETC = 0x7411 + TIOCSETD = 0x7401 + TIOCSETN = 0x740a + TIOCSETP = 0x7409 + TIOCSIGNAL = 0x741f + TIOCSILOOP = 0x746d + TIOCSLTC = 0x7475 + TIOCSPGRP = 0x7415 + TIOCSPPS = 0x547e + TIOCSSOFTCAR = 0x546a + TIOCSTART = 0x746e + TIOCSTI = 0x7417 + TIOCSTOP = 0x746f + TIOCSWINSZ = 0x5467 + TOSTOP = 0x100 + VCEOF = 0x8 + VCEOL = 0x9 + VDISCARD = 0xd + VDSUSP = 0xb + VEOF = 0x4 + VEOL = 0x5 + VEOL2 = 0x6 + VERASE = 0x2 + VINTR = 0x0 + VKILL = 0x3 + VLNEXT = 0xf + VMIN = 0x4 + VQUIT = 0x1 + VREPRINT = 0xc + VSTART = 0x8 + VSTATUS = 0x10 + VSTOP = 0x9 + VSUSP = 0xa + VSWTCH = 0x7 + VT0 = 0x0 + VT1 = 0x4000 + VTDLY = 0x4000 + VTIME = 0x5 + VWERASE = 0xe + WCONTFLG = 0xffff + WCONTINUED = 0x8 + WCOREFLG = 0x80 + WEXITED = 0x1 + WNOHANG = 0x40 + WNOWAIT = 0x80 + WOPTMASK = 0xcf + WRAP = 0x20000 + WSIGMASK = 0x7f + WSTOPFLG = 0x7f + WSTOPPED = 0x4 + WTRAPPED = 0x2 + WUNTRACED = 0x4 +) + +// Errors +const ( + E2BIG = syscall.Errno(0x7) + EACCES = syscall.Errno(0xd) + EADDRINUSE = syscall.Errno(0x7d) + EADDRNOTAVAIL = syscall.Errno(0x7e) + EADV = syscall.Errno(0x44) + EAFNOSUPPORT = syscall.Errno(0x7c) + EAGAIN = syscall.Errno(0xb) + EALREADY = syscall.Errno(0x95) + EBADE = syscall.Errno(0x32) + EBADF = syscall.Errno(0x9) + EBADFD = syscall.Errno(0x51) + EBADMSG = syscall.Errno(0x4d) + EBADR = syscall.Errno(0x33) + EBADRQC = syscall.Errno(0x36) + EBADSLT = syscall.Errno(0x37) + EBFONT = syscall.Errno(0x39) + EBUSY = syscall.Errno(0x10) + ECANCELED = syscall.Errno(0x2f) + ECHILD = syscall.Errno(0xa) + ECHRNG = syscall.Errno(0x25) + ECOMM = syscall.Errno(0x46) + ECONNABORTED = syscall.Errno(0x82) + ECONNREFUSED = syscall.Errno(0x92) + ECONNRESET = syscall.Errno(0x83) + EDEADLK = syscall.Errno(0x2d) + EDEADLOCK = syscall.Errno(0x38) + EDESTADDRREQ = syscall.Errno(0x60) + EDOM = syscall.Errno(0x21) + EDQUOT = syscall.Errno(0x31) + EEXIST = syscall.Errno(0x11) + EFAULT = syscall.Errno(0xe) + EFBIG = syscall.Errno(0x1b) + EHOSTDOWN = syscall.Errno(0x93) + EHOSTUNREACH = syscall.Errno(0x94) + EIDRM = syscall.Errno(0x24) + EILSEQ = syscall.Errno(0x58) + EINPROGRESS = syscall.Errno(0x96) + EINTR = syscall.Errno(0x4) + EINVAL = syscall.Errno(0x16) + EIO = syscall.Errno(0x5) + EISCONN = syscall.Errno(0x85) + EISDIR = syscall.Errno(0x15) + EL2HLT = syscall.Errno(0x2c) + EL2NSYNC = syscall.Errno(0x26) + EL3HLT = syscall.Errno(0x27) + EL3RST = syscall.Errno(0x28) + ELIBACC = syscall.Errno(0x53) + ELIBBAD = syscall.Errno(0x54) + ELIBEXEC = syscall.Errno(0x57) + ELIBMAX = syscall.Errno(0x56) + ELIBSCN = syscall.Errno(0x55) + ELNRNG = syscall.Errno(0x29) + ELOCKUNMAPPED = syscall.Errno(0x48) + ELOOP = syscall.Errno(0x5a) + EMFILE = syscall.Errno(0x18) + EMLINK = syscall.Errno(0x1f) + EMSGSIZE = syscall.Errno(0x61) + EMULTIHOP = syscall.Errno(0x4a) + ENAMETOOLONG = syscall.Errno(0x4e) + ENETDOWN = syscall.Errno(0x7f) + ENETRESET = syscall.Errno(0x81) + ENETUNREACH = syscall.Errno(0x80) + ENFILE = syscall.Errno(0x17) + ENOANO = syscall.Errno(0x35) + ENOBUFS = syscall.Errno(0x84) + ENOCSI = syscall.Errno(0x2b) + ENODATA = syscall.Errno(0x3d) + ENODEV = syscall.Errno(0x13) + ENOENT = syscall.Errno(0x2) + ENOEXEC = syscall.Errno(0x8) + ENOLCK = syscall.Errno(0x2e) + ENOLINK = syscall.Errno(0x43) + ENOMEM = syscall.Errno(0xc) + ENOMSG = syscall.Errno(0x23) + ENONET = syscall.Errno(0x40) + ENOPKG = syscall.Errno(0x41) + ENOPROTOOPT = syscall.Errno(0x63) + ENOSPC = syscall.Errno(0x1c) + ENOSR = syscall.Errno(0x3f) + ENOSTR = syscall.Errno(0x3c) + ENOSYS = syscall.Errno(0x59) + ENOTACTIVE = syscall.Errno(0x49) + ENOTBLK = syscall.Errno(0xf) + ENOTCONN = syscall.Errno(0x86) + ENOTDIR = syscall.Errno(0x14) + ENOTEMPTY = syscall.Errno(0x5d) + ENOTRECOVERABLE = syscall.Errno(0x3b) + ENOTSOCK = syscall.Errno(0x5f) + ENOTSUP = syscall.Errno(0x30) + ENOTTY = syscall.Errno(0x19) + ENOTUNIQ = syscall.Errno(0x50) + ENXIO = syscall.Errno(0x6) + EOPNOTSUPP = syscall.Errno(0x7a) + EOVERFLOW = syscall.Errno(0x4f) + EOWNERDEAD = syscall.Errno(0x3a) + EPERM = syscall.Errno(0x1) + EPFNOSUPPORT = syscall.Errno(0x7b) + EPIPE = syscall.Errno(0x20) + EPROTO = syscall.Errno(0x47) + EPROTONOSUPPORT = syscall.Errno(0x78) + EPROTOTYPE = syscall.Errno(0x62) + ERANGE = syscall.Errno(0x22) + EREMCHG = syscall.Errno(0x52) + EREMOTE = syscall.Errno(0x42) + ERESTART = syscall.Errno(0x5b) + EROFS = syscall.Errno(0x1e) + ESHUTDOWN = syscall.Errno(0x8f) + ESOCKTNOSUPPORT = syscall.Errno(0x79) + ESPIPE = syscall.Errno(0x1d) + ESRCH = syscall.Errno(0x3) + ESRMNT = syscall.Errno(0x45) + ESTALE = syscall.Errno(0x97) + ESTRPIPE = syscall.Errno(0x5c) + ETIME = syscall.Errno(0x3e) + ETIMEDOUT = syscall.Errno(0x91) + ETOOMANYREFS = syscall.Errno(0x90) + ETXTBSY = syscall.Errno(0x1a) + EUNATCH = syscall.Errno(0x2a) + EUSERS = syscall.Errno(0x5e) + EWOULDBLOCK = syscall.Errno(0xb) + EXDEV = syscall.Errno(0x12) + EXFULL = syscall.Errno(0x34) +) + +// Signals +const ( + SIGABRT = syscall.Signal(0x6) + SIGALRM = syscall.Signal(0xe) + SIGBUS = syscall.Signal(0xa) + SIGCANCEL = syscall.Signal(0x24) + SIGCHLD = syscall.Signal(0x12) + SIGCLD = syscall.Signal(0x12) + SIGCONT = syscall.Signal(0x19) + SIGEMT = syscall.Signal(0x7) + SIGFPE = syscall.Signal(0x8) + SIGFREEZE = syscall.Signal(0x22) + SIGHUP = syscall.Signal(0x1) + SIGILL = syscall.Signal(0x4) + SIGINFO = syscall.Signal(0x29) + SIGINT = syscall.Signal(0x2) + SIGIO = syscall.Signal(0x16) + SIGIOT = syscall.Signal(0x6) + SIGJVM1 = syscall.Signal(0x27) + SIGJVM2 = syscall.Signal(0x28) + SIGKILL = syscall.Signal(0x9) + SIGLOST = syscall.Signal(0x25) + SIGLWP = syscall.Signal(0x21) + SIGPIPE = syscall.Signal(0xd) + SIGPOLL = syscall.Signal(0x16) + SIGPROF = syscall.Signal(0x1d) + SIGPWR = syscall.Signal(0x13) + SIGQUIT = syscall.Signal(0x3) + SIGSEGV = syscall.Signal(0xb) + SIGSTOP = syscall.Signal(0x17) + SIGSYS = syscall.Signal(0xc) + SIGTERM = syscall.Signal(0xf) + SIGTHAW = syscall.Signal(0x23) + SIGTRAP = syscall.Signal(0x5) + SIGTSTP = syscall.Signal(0x18) + SIGTTIN = syscall.Signal(0x1a) + SIGTTOU = syscall.Signal(0x1b) + SIGURG = syscall.Signal(0x15) + SIGUSR1 = syscall.Signal(0x10) + SIGUSR2 = syscall.Signal(0x11) + SIGVTALRM = syscall.Signal(0x1c) + SIGWAITING = syscall.Signal(0x20) + SIGWINCH = syscall.Signal(0x14) + SIGXCPU = syscall.Signal(0x1e) + SIGXFSZ = syscall.Signal(0x1f) + SIGXRES = syscall.Signal(0x26) +) + +// Error table +var errors = [...]string{ + 1: "not owner", + 2: "no such file or directory", + 3: "no such process", + 4: "interrupted system call", + 5: "I/O error", + 6: "no such device or address", + 7: "arg list too long", + 8: "exec format error", + 9: "bad file number", + 10: "no child processes", + 11: "resource temporarily unavailable", + 12: "not enough space", + 13: "permission denied", + 14: "bad address", + 15: "block device required", + 16: "device busy", + 17: "file exists", + 18: "cross-device link", + 19: "no such device", + 20: "not a directory", + 21: "is a directory", + 22: "invalid argument", + 23: "file table overflow", + 24: "too many open files", + 25: "inappropriate ioctl for device", + 26: "text file busy", + 27: "file too large", + 28: "no space left on device", + 29: "illegal seek", + 30: "read-only file system", + 31: "too many links", + 32: "broken pipe", + 33: "argument out of domain", + 34: "result too large", + 35: "no message of desired type", + 36: "identifier removed", + 37: "channel number out of range", + 38: "level 2 not synchronized", + 39: "level 3 halted", + 40: "level 3 reset", + 41: "link number out of range", + 42: "protocol driver not attached", + 43: "no CSI structure available", + 44: "level 2 halted", + 45: "deadlock situation detected/avoided", + 46: "no record locks available", + 47: "operation canceled", + 48: "operation not supported", + 49: "disc quota exceeded", + 50: "bad exchange descriptor", + 51: "bad request descriptor", + 52: "message tables full", + 53: "anode table overflow", + 54: "bad request code", + 55: "invalid slot", + 56: "file locking deadlock", + 57: "bad font file format", + 58: "owner of the lock died", + 59: "lock is not recoverable", + 60: "not a stream device", + 61: "no data available", + 62: "timer expired", + 63: "out of stream resources", + 64: "machine is not on the network", + 65: "package not installed", + 66: "object is remote", + 67: "link has been severed", + 68: "advertise error", + 69: "srmount error", + 70: "communication error on send", + 71: "protocol error", + 72: "locked lock was unmapped ", + 73: "facility is not active", + 74: "multihop attempted", + 77: "not a data message", + 78: "file name too long", + 79: "value too large for defined data type", + 80: "name not unique on network", + 81: "file descriptor in bad state", + 82: "remote address changed", + 83: "can not access a needed shared library", + 84: "accessing a corrupted shared library", + 85: ".lib section in a.out corrupted", + 86: "attempting to link in more shared libraries than system limit", + 87: "can not exec a shared library directly", + 88: "illegal byte sequence", + 89: "operation not applicable", + 90: "number of symbolic links encountered during path name traversal exceeds MAXSYMLINKS", + 91: "error 91", + 92: "error 92", + 93: "directory not empty", + 94: "too many users", + 95: "socket operation on non-socket", + 96: "destination address required", + 97: "message too long", + 98: "protocol wrong type for socket", + 99: "option not supported by protocol", + 120: "protocol not supported", + 121: "socket type not supported", + 122: "operation not supported on transport endpoint", + 123: "protocol family not supported", + 124: "address family not supported by protocol family", + 125: "address already in use", + 126: "cannot assign requested address", + 127: "network is down", + 128: "network is unreachable", + 129: "network dropped connection because of reset", + 130: "software caused connection abort", + 131: "connection reset by peer", + 132: "no buffer space available", + 133: "transport endpoint is already connected", + 134: "transport endpoint is not connected", + 143: "cannot send after socket shutdown", + 144: "too many references: cannot splice", + 145: "connection timed out", + 146: "connection refused", + 147: "host is down", + 148: "no route to host", + 149: "operation already in progress", + 150: "operation now in progress", + 151: "stale NFS file handle", +} + +// Signal table +var signals = [...]string{ + 1: "hangup", + 2: "interrupt", + 3: "quit", + 4: "illegal Instruction", + 5: "trace/Breakpoint Trap", + 6: "abort", + 7: "emulation Trap", + 8: "arithmetic Exception", + 9: "killed", + 10: "bus Error", + 11: "segmentation Fault", + 12: "bad System Call", + 13: "broken Pipe", + 14: "alarm Clock", + 15: "terminated", + 16: "user Signal 1", + 17: "user Signal 2", + 18: "child Status Changed", + 19: "power-Fail/Restart", + 20: "window Size Change", + 21: "urgent Socket Condition", + 22: "pollable Event", + 23: "stopped (signal)", + 24: "stopped (user)", + 25: "continued", + 26: "stopped (tty input)", + 27: "stopped (tty output)", + 28: "virtual Timer Expired", + 29: "profiling Timer Expired", + 30: "cpu Limit Exceeded", + 31: "file Size Limit Exceeded", + 32: "no runnable lwp", + 33: "inter-lwp signal", + 34: "checkpoint Freeze", + 35: "checkpoint Thaw", + 36: "thread Cancellation", + 37: "resource Lost", + 38: "resource Control Exceeded", + 39: "reserved for JVM 1", + 40: "reserved for JVM 2", + 41: "information Request", +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go new file mode 100644 index 0000000000000000000000000000000000000000..031034a345d1fa34f0a1254966f4b740ac11620a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go @@ -0,0 +1,1427 @@ +// mksyscall.pl -l32 syscall_bsd.go syscall_darwin.go syscall_darwin_386.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build 386,darwin + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + use(_p0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kill(pid int, signum int, posix int) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exchangedata(path1 string, path2 string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path1) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(path2) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + use(unsafe.Pointer(_p0)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + use(unsafe.Pointer(_p0)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(whence), 0, 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := Syscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setprivexec(flag int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos), uintptr(pos>>32), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func gettimeofday(tp *Timeval) (sec int32, usec int32, err error) { + r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + sec = int32(r0) + usec = int32(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..ee96f78badc81656858abae0bf2b4f5736939a7a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go @@ -0,0 +1,1443 @@ +// mksyscall.pl syscall_bsd.go syscall_darwin.go syscall_darwin_amd64.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build amd64,darwin + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + use(_p0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kill(pid int, signum int, posix int) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exchangedata(path1 string, path2 string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path1) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(path2) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + use(unsafe.Pointer(_p0)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + use(unsafe.Pointer(_p0)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := Syscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setprivexec(flag int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func gettimeofday(tp *Timeval) (sec int64, usec int32, err error) { + r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + sec = int64(r0) + usec = int32(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go new file mode 100644 index 0000000000000000000000000000000000000000..e52cd0d54c09aa569a9af9ec97e8ff134a598e8c --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go @@ -0,0 +1,1427 @@ +// mksyscall.pl syscall_bsd.go syscall_darwin.go syscall_darwin_arm.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build arm,darwin + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + use(_p0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kill(pid int, signum int, posix int) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exchangedata(path1 string, path2 string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path1) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(path2) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + use(unsafe.Pointer(_p0)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + use(unsafe.Pointer(_p0)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := Syscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setprivexec(flag int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func gettimeofday(tp *Timeval) (sec int32, usec int32, err error) { + r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + sec = int32(r0) + usec = int32(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go new file mode 100644 index 0000000000000000000000000000000000000000..9863ef99e3deba28ac0252dc3a5b5ca81a756ccf --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go @@ -0,0 +1,1427 @@ +// mksyscall.pl syscall_bsd.go syscall_darwin.go syscall_darwin_arm64.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build arm64,darwin + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + use(_p0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kill(pid int, signum int, posix int) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), uintptr(posix)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exchangedata(path1 string, path2 string, options int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path1) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(path2) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXCHANGEDATA, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(options)) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES64, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := RawSyscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + use(unsafe.Pointer(_p0)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + use(unsafe.Pointer(_p0)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := Syscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setprivexec(flag int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIVEXEC, uintptr(flag), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func gettimeofday(tp *Timeval) (sec int64, usec int32, err error) { + r0, r1, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + sec = int64(r0) + usec = int32(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..78de48dcf3a18d6c07b6d5c77efbc0b562019abd --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go @@ -0,0 +1,1413 @@ +// mksyscall.pl -dragonfly syscall_bsd.go syscall_dragonfly.go syscall_dragonfly_amd64.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build amd64,dragonfly + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + use(_p0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func extpread(fd int, p []byte, flags int, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EXTPREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func extpwrite(fd int, p []byte, flags int, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EXTPWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + use(unsafe.Pointer(_p0)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + use(unsafe.Pointer(_p0)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go new file mode 100644 index 0000000000000000000000000000000000000000..fade994dcf6f77e7839cf04eff7569a3c58ab088 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go @@ -0,0 +1,1665 @@ +// mksyscall.pl -l32 syscall_bsd.go syscall_freebsd.go syscall_freebsd_386.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build 386,freebsd + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + use(_p0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + use(unsafe.Pointer(_p0)) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + use(unsafe.Pointer(_p0)) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + use(unsafe.Pointer(_p0)) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + use(unsafe.Pointer(_p0)) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_POSIX_FADVISE, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + use(unsafe.Pointer(_p0)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + use(unsafe.Pointer(_p0)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(whence), 0, 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos), uintptr(pos>>32), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..c28281e83e227a598994390d76f9f3bbaaf47068 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go @@ -0,0 +1,1665 @@ +// mksyscall.pl syscall_bsd.go syscall_freebsd.go syscall_freebsd_amd64.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build amd64,freebsd + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + use(_p0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + use(unsafe.Pointer(_p0)) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + use(unsafe.Pointer(_p0)) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + use(unsafe.Pointer(_p0)) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + use(unsafe.Pointer(_p0)) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_POSIX_FADVISE, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + use(unsafe.Pointer(_p0)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + use(unsafe.Pointer(_p0)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go new file mode 100644 index 0000000000000000000000000000000000000000..a18ba5c88bbc535d627a9f8539b6d107e1e39ff6 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go @@ -0,0 +1,1665 @@ +// mksyscall.pl -l32 -arm syscall_bsd.go syscall_freebsd.go syscall_freebsd_arm.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build arm,freebsd + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + use(_p0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (r int, w int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + r = int(r0) + w = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + use(unsafe.Pointer(_p0)) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0)), uintptr(data), uintptr(nbytes), 0) + use(unsafe.Pointer(_p0)) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FD, uintptr(fd), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p0))) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FD, uintptr(fd), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(file) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_FILE, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + use(unsafe.Pointer(_p0)) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_GET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_SET_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1)), uintptr(data), uintptr(nbytes), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attrname) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_EXTATTR_DELETE_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(unsafe.Pointer(_p1))) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(link) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_EXTATTR_LIST_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(attrnamespace), uintptr(data), uintptr(nbytes), 0, 0) + use(unsafe.Pointer(_p0)) + ret = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall9(SYS_POSIX_FADVISE, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETDIRENTRIES, uintptr(fd), uintptr(_p0), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdtablesize() (size int) { + r0, _, _ := Syscall(SYS_GETDTABLESIZE, 0, 0, 0) + size = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + use(unsafe.Pointer(_p0)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + use(unsafe.Pointer(_p0)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Undelete(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNDELETE, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go new file mode 100644 index 0000000000000000000000000000000000000000..b7aa1784c52a4c303faf87cbeff167dc1c36b25a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_386.go @@ -0,0 +1,1649 @@ +// mksyscall.pl -l32 syscall_linux.go syscall_linux_386.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build 386,linux + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfd int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfd), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + use(unsafe.Pointer(_p0)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + use(unsafe.Pointer(_p2)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(off>>32), uintptr(len), uintptr(len>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + use(unsafe.Pointer(_p0)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + use(unsafe.Pointer(_p0)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, old *Rlimit, newlimit *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(newlimit)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + Syscall(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64_64, uintptr(fd), uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN32, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE64, uintptr(fd), uintptr(length), uintptr(length>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID32, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _, _ := RawSyscall(SYS_GETEUID32, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID32, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID32, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN32, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), uintptr(offset>>32), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID32, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID32, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID32, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID32, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID32, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID32, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(off>>32), uintptr(n), uintptr(n>>32), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), uintptr(length), uintptr(length>>32)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Time(t *Time_t) (tt Time_t, err error) { + r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) + tt = Time_t(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..be4f62b913681151745b92f18a000fbfdc87b826 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go @@ -0,0 +1,1843 @@ +// mksyscall.pl syscall_linux.go syscall_linux_amd64.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build amd64,linux + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfd int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfd), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + use(unsafe.Pointer(_p0)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + use(unsafe.Pointer(_p2)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + use(unsafe.Pointer(_p0)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + use(unsafe.Pointer(_p0)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, old *Rlimit, newlimit *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(newlimit)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + Syscall(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go new file mode 100644 index 0000000000000000000000000000000000000000..9f7700177aa4f3cdd37cfd1e0669e3252a661c51 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go @@ -0,0 +1,1750 @@ +// mksyscall.pl -l32 -arm syscall_linux.go syscall_linux_arm.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build arm,linux + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfd int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfd), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + use(unsafe.Pointer(_p0)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + use(unsafe.Pointer(_p2)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(off>>32), uintptr(len), uintptr(len>>32)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + use(unsafe.Pointer(_p0)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + use(unsafe.Pointer(_p0)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, old *Rlimit, newlimit *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(newlimit)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + Syscall(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, r1, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS32, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN32, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT64, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID32, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _, _ := RawSyscall(SYS_GETEUID32, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID32, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID32, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN32, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE64, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS__NEWSELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID32, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID32, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID32, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID32, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID32, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID32, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT64, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE64, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE64, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP2, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(pageOffset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_UGETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setrlimit(resource int, rlim *rlimit32) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go new file mode 100644 index 0000000000000000000000000000000000000000..fadbe4b6b7b84fb66647357f8d01de32a5f4a37c --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go @@ -0,0 +1,1734 @@ +// mksyscall.pl syscall_linux.go syscall_linux_arm64.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build arm64,linux + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfd int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfd), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + use(unsafe.Pointer(_p0)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + use(unsafe.Pointer(_p2)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + use(unsafe.Pointer(_p0)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + use(unsafe.Pointer(_p0)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, old *Rlimit, newlimit *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(newlimit)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + Syscall(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_PWAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatat(fd int, path string, stat *Stat_t, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FSTATAT, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go new file mode 100644 index 0000000000000000000000000000000000000000..0389f1ff85fe070b89f8546d82751e5e87247230 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go @@ -0,0 +1,1792 @@ +// mksyscall.pl syscall_linux.go syscall_linux_mips64x.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build mips64,linux + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfd int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfd), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + use(unsafe.Pointer(_p0)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + use(unsafe.Pointer(_p2)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + use(unsafe.Pointer(_p0)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + use(unsafe.Pointer(_p0)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, old *Rlimit, newlimit *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(newlimit)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + Syscall(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstat(fd int, st *stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(st)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func lstat(path string, st *stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func stat(path string, st *stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go new file mode 100644 index 0000000000000000000000000000000000000000..86951886180441b3d7440c59a658c9dbe8c34c4f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go @@ -0,0 +1,1792 @@ +// mksyscall.pl syscall_linux.go syscall_linux_mips64x.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build mips64le,linux + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfd int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfd), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + use(unsafe.Pointer(_p0)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + use(unsafe.Pointer(_p2)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + use(unsafe.Pointer(_p0)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + use(unsafe.Pointer(_p0)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, old *Rlimit, newlimit *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(newlimit)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + Syscall(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fstat(fd int, st *stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(st)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func lstat(path string, st *stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func stat(path string, st *stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(st)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go new file mode 100644 index 0000000000000000000000000000000000000000..240197629c94f20b21ed5e598a2450920ee0454f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go @@ -0,0 +1,1854 @@ +// mksyscall.pl syscall_linux.go syscall_linux_ppc64x.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build ppc64,linux + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfd int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfd), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + use(unsafe.Pointer(_p0)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + use(unsafe.Pointer(_p2)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + use(unsafe.Pointer(_p0)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + use(unsafe.Pointer(_p0)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, old *Rlimit, newlimit *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(newlimit)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + Syscall(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_UGETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE2, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Time(t *Time_t) (tt Time_t, err error) { + r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) + tt = Time_t(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go new file mode 100644 index 0000000000000000000000000000000000000000..d6d62ea9276da4a3aa9f06acca6a7771476f27f1 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go @@ -0,0 +1,1854 @@ +// mksyscall.pl syscall_linux.go syscall_linux_ppc64x.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build ppc64le,linux + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfd int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfd), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + use(unsafe.Pointer(_p0)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + use(unsafe.Pointer(_p2)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + use(unsafe.Pointer(_p0)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + use(unsafe.Pointer(_p0)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, old *Rlimit, newlimit *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(newlimit)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + Syscall(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_UGETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ioperm(from int, num int, on int) (err error) { + _, _, e1 := Syscall(SYS_IOPERM, uintptr(from), uintptr(num), uintptr(on)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Iopl(level int) (err error) { + _, _, e1 := Syscall(SYS_IOPL, uintptr(level), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, n int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(n), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE2, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) { + r0, _, e1 := Syscall6(SYS_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Time(t *Time_t) (tt Time_t, err error) { + r0, _, e1 := RawSyscall(SYS_TIME, uintptr(unsafe.Pointer(t)), 0, 0) + tt = Time_t(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go new file mode 100644 index 0000000000000000000000000000000000000000..3ff6a93178d86181b2e98996e2b50e38e480e60e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go @@ -0,0 +1,1634 @@ +// mksyscall.pl syscall_linux.go syscall_linux_s390x.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build s390x,linux + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_LINKAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall6(SYS_OPENAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func poll(fds *PollFd, nfd int, timeout int) (n int, err error) { + r0, _, e1 := Syscall(SYS_POLL, uintptr(unsafe.Pointer(fds)), uintptr(nfd), uintptr(timeout)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlinkat(dirfd int, path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_READLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)), 0, 0) + use(unsafe.Pointer(_p0)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func symlinkat(oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINKAT, uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1))) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINKAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_UTIMENSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimesat(dirfd int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMESAT, uintptr(dirfd), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getcwd(buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETCWD, uintptr(_p0), uintptr(len(buf)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ptrace(request int, pid int, addr uintptr, data uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PTRACE, uintptr(request), uintptr(pid), uintptr(addr), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func reboot(magic1 uint, magic2 uint, cmd int, arg string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(arg) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_REBOOT, uintptr(magic1), uintptr(magic2), uintptr(cmd), uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mount(source string, target string, fstype string, flags uintptr, data *byte) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(source) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(target) + if err != nil { + return + } + var _p2 *byte + _p2, err = BytePtrFromString(fstype) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(data)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + use(unsafe.Pointer(_p2)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Acct(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtimex(buf *Timex) (state int, err error) { + r0, _, e1 := Syscall(SYS_ADJTIMEX, uintptr(unsafe.Pointer(buf)), 0, 0) + state = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func ClockGettime(clockid int32, time *Timespec) (err error) { + _, _, e1 := Syscall(SYS_CLOCK_GETTIME, uintptr(clockid), uintptr(unsafe.Pointer(time)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(oldfd int) (fd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(oldfd), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup3(oldfd int, newfd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_DUP3, uintptr(oldfd), uintptr(newfd), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate(size int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE, uintptr(size), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCreate1(flag int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_EPOLL_CREATE1, uintptr(flag), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) { + _, _, e1 := RawSyscall6(SYS_EPOLL_CTL, uintptr(epfd), uintptr(op), uintptr(fd), uintptr(unsafe.Pointer(event)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT_GROUP, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FACCESSAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fallocate(fd int, mode uint32, off int64, len int64) (err error) { + _, _, e1 := Syscall6(SYS_FALLOCATE, uintptr(fd), uintptr(mode), uintptr(off), uintptr(len), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHOWNAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fdatasync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FDATASYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS64, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettid() (tid int) { + r0, _, _ := RawSyscall(SYS_GETTID, 0, 0, 0) + tid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getxattr(path string, attr string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(dest) > 0 { + _p2 = unsafe.Pointer(&dest[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_GETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)), 0, 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(pathname) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_INOTIFY_ADD_WATCH, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(mask)) + use(unsafe.Pointer(_p0)) + watchdesc = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit1(flags int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT1, uintptr(flags), 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_RM_WATCH, uintptr(fd), uintptr(watchdesc), 0) + success = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_KILL, uintptr(pid), uintptr(sig), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Klogctl(typ int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_SYSLOG, uintptr(typ), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listxattr(path string, dest []byte) (sz int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(dest) > 0 { + _p1 = unsafe.Pointer(&dest[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_LISTXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(dest))) + use(unsafe.Pointer(_p0)) + sz = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIRAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_MKNODAT, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func PivotRoot(newroot string, putold string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(newroot) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(putold) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_PIVOT_ROOT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func prlimit(pid int, resource int, old *Rlimit, newlimit *Rlimit) (err error) { + _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(newlimit)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) { + _, _, e1 := Syscall6(SYS_PRCTL, uintptr(option), uintptr(arg2), uintptr(arg3), uintptr(arg4), uintptr(arg5), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Removexattr(path string, attr string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REMOVEXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_RENAMEAT, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setdomainname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETDOMAINNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sethostname(p []byte) (err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_SETHOSTNAME, uintptr(_p0), uintptr(len(p)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setns(fd int, nstype int) (err error) { + _, _, e1 := Syscall(SYS_SETNS, uintptr(fd), uintptr(nstype), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setxattr(path string, attr string, data []byte, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(attr) + if err != nil { + return + } + var _p2 unsafe.Pointer + if len(data) > 0 { + _p2 = unsafe.Pointer(&data[0]) + } else { + _p2 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SETXATTR, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() { + Syscall(SYS_SYNC, 0, 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sysinfo(info *Sysinfo_t) (err error) { + _, _, e1 := RawSyscall(SYS_SYSINFO, uintptr(unsafe.Pointer(info)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tee(rfd int, wfd int, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_TEE, uintptr(rfd), uintptr(wfd), uintptr(len), uintptr(flags), 0, 0) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) { + _, _, e1 := RawSyscall(SYS_TGKILL, uintptr(tgid), uintptr(tid), uintptr(sig)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := RawSyscall(SYS_TIMES, uintptr(unsafe.Pointer(tms)), 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(mask int) (oldmask int) { + r0, _, _ := RawSyscall(SYS_UMASK, uintptr(mask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Uname(buf *Utsname) (err error) { + _, _, e1 := RawSyscall(SYS_UNAME, uintptr(unsafe.Pointer(buf)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UMOUNT2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unshare(flags int) (err error) { + _, _, e1 := Syscall(SYS_UNSHARE, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := Syscall(SYS_USTAT, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func exitThread(code int) (err error) { + _, _, e1 := Syscall(SYS_EXIT, uintptr(code), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, p *byte, np int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(np)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Madvise(b []byte, advice int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MADVISE, uintptr(_p0), uintptr(len(b)), uintptr(advice)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(oldfd), uintptr(newfd), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) { + var _p0 unsafe.Pointer + if len(events) > 0 { + _p0 = unsafe.Pointer(&events[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_EPOLL_WAIT, uintptr(epfd), uintptr(_p0), uintptr(len(events)), uintptr(msec), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fadvise(fd int, offset int64, length int64, advice int) (err error) { + _, _, e1 := Syscall6(SYS_FADVISE64, uintptr(fd), uintptr(offset), uintptr(length), uintptr(advice), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, buf *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(buf)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (euid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + euid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func InotifyInit() (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_INOTIFY_INIT, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pause() (err error) { + _, _, e1 := Syscall(SYS_PAUSE, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE64, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (off int64, err error) { + r0, _, e1 := Syscall(SYS_LSEEK, uintptr(fd), uintptr(offset), uintptr(whence)) + off = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) { + r0, _, e1 := Syscall6(SYS_SELECT, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) { + r0, _, e1 := Syscall6(SYS_SENDFILE, uintptr(outfd), uintptr(infd), uintptr(unsafe.Pointer(offset)), uintptr(count), 0, 0) + written = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsgid(gid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setfsuid(uid int) (err error) { + _, _, e1 := Syscall(SYS_SETFSUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(resource int, rlim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error) { + r0, _, e1 := Syscall6(SYS_SPLICE, uintptr(rfd), uintptr(unsafe.Pointer(roff)), uintptr(wfd), uintptr(unsafe.Pointer(woff)), uintptr(len), uintptr(flags)) + n = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, buf *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func SyncFileRange(fd int, off int64, n int64, flags int) (err error) { + _, _, e1 := Syscall6(SYS_SYNC_FILE_RANGE, uintptr(fd), uintptr(off), uintptr(n), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(n int, list *_Gid_t) (nn int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + nn = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(n int, list *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(n), uintptr(unsafe.Pointer(list)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe2(p *[2]_C_int, flags int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE2, uintptr(unsafe.Pointer(p)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go new file mode 100644 index 0000000000000000000000000000000000000000..b16e1d0ee3388827d87247d02f8bd0a3d5ab1b8f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go @@ -0,0 +1,1327 @@ +// mksyscall.pl -l32 -netbsd syscall_bsd.go syscall_netbsd.go syscall_netbsd_386.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build 386,netbsd + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + use(_p0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (fd1 int, fd2 int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + fd1 = int(r0) + fd2 = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + use(unsafe.Pointer(_p0)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + use(unsafe.Pointer(_p0)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..b63667da9cf547d15c6b7709dc78070032f4c4a6 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go @@ -0,0 +1,1327 @@ +// mksyscall.pl -netbsd syscall_bsd.go syscall_netbsd.go syscall_netbsd_amd64.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build amd64,netbsd + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + use(_p0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (fd1 int, fd2 int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + fd1 = int(r0) + fd2 = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + use(unsafe.Pointer(_p0)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + use(unsafe.Pointer(_p0)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go new file mode 100644 index 0000000000000000000000000000000000000000..b0d19038d2e17e7255528d07152880cea5c3719d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go @@ -0,0 +1,1327 @@ +// mksyscall.pl -l32 -arm syscall_bsd.go syscall_netbsd.go syscall_netbsd_arm.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build arm,netbsd + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + use(_p0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe() (fd1 int, fd2 int, err error) { + r0, r1, e1 := RawSyscall(SYS_PIPE, 0, 0, 0) + fd1 = int(r0) + fd2 = int(r1) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + use(unsafe.Pointer(_p0)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + use(unsafe.Pointer(_p0)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go new file mode 100644 index 0000000000000000000000000000000000000000..f91a5b8564faabe6702086169e9565b2887ca21d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go @@ -0,0 +1,1387 @@ +// mksyscall.pl -l32 -openbsd syscall_bsd.go syscall_openbsd.go syscall_openbsd_386.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build 386,openbsd + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + use(_p0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall6(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length), uintptr(length>>32), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + use(unsafe.Pointer(_p0)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), uintptr(offset>>32)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + use(unsafe.Pointer(_p0)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, r1, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(offset>>32), uintptr(whence), 0) + newoffset = int64(int64(r1)<<32 | int64(r0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length), uintptr(length>>32), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..2e8d59d724ae49997d576ab2422f7fd562524aec --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go @@ -0,0 +1,1387 @@ +// mksyscall.pl -openbsd syscall_bsd.go syscall_openbsd.go syscall_openbsd_amd64.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build amd64,openbsd + +package unix + +import ( + "syscall" + "unsafe" +) + +var _ syscall.Errno + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := RawSyscall(SYS_GETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := RawSyscall(SYS_SETGROUPS, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error) { + r0, _, e1 := Syscall6(SYS_WAIT4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)), 0, 0) + wpid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := Syscall(SYS_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_BIND, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := Syscall(SYS_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := RawSyscall(SYS_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := Syscall6(SYS_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := Syscall6(SYS_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETPEERNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := RawSyscall(SYS_GETSOCKNAME, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Shutdown(s int, how int) (err error) { + _, _, e1 := Syscall(SYS_SHUTDOWN, uintptr(s), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := RawSyscall6(SYS_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_RECVFROM, uintptr(fd), uintptr(_p0), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_SENDTO, uintptr(s), uintptr(_p0), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := Syscall(SYS_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error) { + r0, _, e1 := Syscall6(SYS_KEVENT, uintptr(kq), uintptr(change), uintptr(nchange), uintptr(event), uintptr(nevent), uintptr(unsafe.Pointer(timeout))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { + var _p0 unsafe.Pointer + if len(mib) > 0 { + _p0 = unsafe.Pointer(&mib[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS___SYSCTL, uintptr(_p0), uintptr(len(mib)), uintptr(unsafe.Pointer(old)), uintptr(unsafe.Pointer(oldlen)), uintptr(unsafe.Pointer(new)), uintptr(newlen)) + use(_p0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func utimes(path string, timeval *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UTIMES, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(timeval)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func futimes(fd int, timeval *[2]Timeval) (err error) { + _, _, e1 := Syscall(SYS_FUTIMES, uintptr(fd), uintptr(unsafe.Pointer(timeval)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FCNTL, uintptr(fd), uintptr(cmd), uintptr(arg)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func pipe(p *[2]_C_int) (err error) { + _, _, e1 := RawSyscall(SYS_PIPE, uintptr(unsafe.Pointer(p)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func getdents(fd int, buf []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(buf) > 0 { + _p0 = unsafe.Pointer(&buf[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_GETDENTS, uintptr(fd), uintptr(_p0), uintptr(len(buf))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_ACCESS, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := Syscall(SYS_ADJTIME, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chflags(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHFLAGS, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHMOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_CHROOT, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Close(fd int) (err error) { + _, _, e1 := Syscall(SYS_CLOSE, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := Syscall(SYS_DUP, uintptr(fd), 0, 0) + nfd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Dup2(from int, to int) (err error) { + _, _, e1 := Syscall(SYS_DUP2, uintptr(from), uintptr(to), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Exit(code int) { + Syscall(SYS_EXIT, uintptr(code), 0, 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchdir(fd int) (err error) { + _, _, e1 := Syscall(SYS_FCHDIR, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchflags(fd int, flags int) (err error) { + _, _, e1 := Syscall(SYS_FCHFLAGS, uintptr(fd), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := Syscall(SYS_FCHMOD, uintptr(fd), uintptr(mode), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := Syscall(SYS_FCHOWN, uintptr(fd), uintptr(uid), uintptr(gid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Flock(fd int, how int) (err error) { + _, _, e1 := Syscall(SYS_FLOCK, uintptr(fd), uintptr(how), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := Syscall(SYS_FPATHCONF, uintptr(fd), uintptr(name), 0) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := Syscall(SYS_FSTAT, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fstatfs(fd int, stat *Statfs_t) (err error) { + _, _, e1 := Syscall(SYS_FSTATFS, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Fsync(fd int) (err error) { + _, _, e1 := Syscall(SYS_FSYNC, uintptr(fd), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := Syscall(SYS_FTRUNCATE, uintptr(fd), 0, uintptr(length)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getegid() (egid int) { + r0, _, _ := RawSyscall(SYS_GETEGID, 0, 0, 0) + egid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Geteuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETEUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getgid() (gid int) { + r0, _, _ := RawSyscall(SYS_GETGID, 0, 0, 0) + gid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETPGID, uintptr(pid), 0, 0) + pgid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpgrp() (pgrp int) { + r0, _, _ := RawSyscall(SYS_GETPGRP, 0, 0, 0) + pgrp = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpid() (pid int) { + r0, _, _ := RawSyscall(SYS_GETPID, 0, 0, 0) + pid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getppid() (ppid int) { + r0, _, _ := RawSyscall(SYS_GETPPID, 0, 0, 0) + ppid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getpriority(which int, who int) (prio int, err error) { + r0, _, e1 := Syscall(SYS_GETPRIORITY, uintptr(which), uintptr(who), 0) + prio = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getsid(pid int) (sid int, err error) { + r0, _, e1 := RawSyscall(SYS_GETSID, uintptr(pid), 0, 0) + sid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_GETTIMEOFDAY, uintptr(unsafe.Pointer(tv)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Getuid() (uid int) { + r0, _, _ := RawSyscall(SYS_GETUID, 0, 0, 0) + uid = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Issetugid() (tainted bool) { + r0, _, _ := Syscall(SYS_ISSETUGID, 0, 0, 0) + tainted = bool(r0 != 0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := Syscall(SYS_KILL, uintptr(pid), uintptr(signum), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Kqueue() (fd int, err error) { + r0, _, e1 := Syscall(SYS_KQUEUE, 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LCHOWN, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Listen(s int, backlog int) (err error) { + _, _, e1 := Syscall(SYS_LISTEN, uintptr(s), uintptr(backlog), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_LSTAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKDIR, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKFIFO, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_MKNOD, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mlockall(flags int) (err error) { + _, _, e1 := Syscall(SYS_MLOCKALL, uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mprotect(b []byte, prot int) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MPROTECT, uintptr(_p0), uintptr(len(b)), uintptr(prot)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlock(b []byte) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MUNLOCK, uintptr(_p0), uintptr(len(b)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Munlockall() (err error) { + _, _, e1 := Syscall(SYS_MUNLOCKALL, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := Syscall(SYS_NANOSLEEP, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_OPEN, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm)) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := Syscall(SYS_PATHCONF, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0) + use(unsafe.Pointer(_p0)) + val = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PREAD, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall6(SYS_PWRITE, uintptr(fd), uintptr(_p0), uintptr(len(p)), 0, uintptr(offset), 0) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func read(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 unsafe.Pointer + if len(buf) > 0 { + _p1 = unsafe.Pointer(&buf[0]) + } else { + _p1 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_READLINK, uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))) + use(unsafe.Pointer(_p0)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RENAME, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Revoke(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_REVOKE, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_RMDIR, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := Syscall6(SYS_LSEEK, uintptr(fd), 0, uintptr(offset), uintptr(whence), 0, 0) + newoffset = int64(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Select(n int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (err error) { + _, _, e1 := Syscall6(SYS_SELECT, uintptr(n), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setegid(egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEGID, uintptr(egid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Seteuid(euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETEUID, uintptr(euid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setgid(gid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETGID, uintptr(gid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setlogin(name string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(name) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SETLOGIN, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETPGID, uintptr(pid), uintptr(pgid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := Syscall(SYS_SETPRIORITY, uintptr(which), uintptr(who), uintptr(prio)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREGID, uintptr(rgid), uintptr(egid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETREUID, uintptr(ruid), uintptr(euid), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresgid(rgid int, egid int, sgid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESGID, uintptr(rgid), uintptr(egid), uintptr(sgid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setresuid(ruid int, euid int, suid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETRESUID, uintptr(ruid), uintptr(euid), uintptr(suid)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(which), uintptr(unsafe.Pointer(lim)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setsid() (pid int, err error) { + r0, _, e1 := RawSyscall(SYS_SETSID, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Settimeofday(tp *Timeval) (err error) { + _, _, e1 := RawSyscall(SYS_SETTIMEOFDAY, uintptr(unsafe.Pointer(tp)), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Setuid(uid int) (err error) { + _, _, e1 := RawSyscall(SYS_SETUID, uintptr(uid), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STAT, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Statfs(path string, stat *Statfs_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_STATFS, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_SYMLINK, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Sync() (err error) { + _, _, e1 := Syscall(SYS_SYNC, 0, 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_TRUNCATE, uintptr(unsafe.Pointer(_p0)), 0, uintptr(length)) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Umask(newmask int) (oldmask int) { + r0, _, _ := Syscall(SYS_UMASK, uintptr(newmask), 0, 0) + oldmask = int(r0) + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNLINK, uintptr(unsafe.Pointer(_p0)), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Unmount(path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall(SYS_UNMOUNT, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func write(fd int, p []byte) (n int, err error) { + var _p0 unsafe.Pointer + if len(p) > 0 { + _p0 = unsafe.Pointer(&p[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(_p0), uintptr(len(p))) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := Syscall9(SYS_MMAP, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), 0, 0) + ret = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := Syscall(SYS_MUNMAP, uintptr(addr), uintptr(length), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func readlen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_READ, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func writelen(fd int, buf *byte, nbuf int) (n int, err error) { + r0, _, e1 := Syscall(SYS_WRITE, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..4326427817e0c1b991c5098ac7a06f35ffc6fa1b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go @@ -0,0 +1,1559 @@ +// mksyscall_solaris.pl syscall_solaris.go syscall_solaris_amd64.go +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +// +build amd64,solaris + +package unix + +import ( + "syscall" + "unsafe" +) + +//go:cgo_import_dynamic libc_getsockname getsockname "libsocket.so" +//go:cgo_import_dynamic libc_getcwd getcwd "libc.so" +//go:cgo_import_dynamic libc_getgroups getgroups "libc.so" +//go:cgo_import_dynamic libc_setgroups setgroups "libc.so" +//go:cgo_import_dynamic libc_utimes utimes "libc.so" +//go:cgo_import_dynamic libc_utimensat utimensat "libc.so" +//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" +//go:cgo_import_dynamic libc_futimesat futimesat "libc.so" +//go:cgo_import_dynamic libc_accept accept "libsocket.so" +//go:cgo_import_dynamic libc_recvmsg recvmsg "libsocket.so" +//go:cgo_import_dynamic libc_sendmsg sendmsg "libsocket.so" +//go:cgo_import_dynamic libc_acct acct "libc.so" +//go:cgo_import_dynamic libc_ioctl ioctl "libc.so" +//go:cgo_import_dynamic libc_access access "libc.so" +//go:cgo_import_dynamic libc_adjtime adjtime "libc.so" +//go:cgo_import_dynamic libc_chdir chdir "libc.so" +//go:cgo_import_dynamic libc_chmod chmod "libc.so" +//go:cgo_import_dynamic libc_chown chown "libc.so" +//go:cgo_import_dynamic libc_chroot chroot "libc.so" +//go:cgo_import_dynamic libc_close close "libc.so" +//go:cgo_import_dynamic libc_creat creat "libc.so" +//go:cgo_import_dynamic libc_dup dup "libc.so" +//go:cgo_import_dynamic libc_dup2 dup2 "libc.so" +//go:cgo_import_dynamic libc_exit exit "libc.so" +//go:cgo_import_dynamic libc_fchdir fchdir "libc.so" +//go:cgo_import_dynamic libc_fchmod fchmod "libc.so" +//go:cgo_import_dynamic libc_fchmodat fchmodat "libc.so" +//go:cgo_import_dynamic libc_fchown fchown "libc.so" +//go:cgo_import_dynamic libc_fchownat fchownat "libc.so" +//go:cgo_import_dynamic libc_fdatasync fdatasync "libc.so" +//go:cgo_import_dynamic libc_fpathconf fpathconf "libc.so" +//go:cgo_import_dynamic libc_fstat fstat "libc.so" +//go:cgo_import_dynamic libc_getdents getdents "libc.so" +//go:cgo_import_dynamic libc_getgid getgid "libc.so" +//go:cgo_import_dynamic libc_getpid getpid "libc.so" +//go:cgo_import_dynamic libc_getpgid getpgid "libc.so" +//go:cgo_import_dynamic libc_getpgrp getpgrp "libc.so" +//go:cgo_import_dynamic libc_geteuid geteuid "libc.so" +//go:cgo_import_dynamic libc_getegid getegid "libc.so" +//go:cgo_import_dynamic libc_getppid getppid "libc.so" +//go:cgo_import_dynamic libc_getpriority getpriority "libc.so" +//go:cgo_import_dynamic libc_getrlimit getrlimit "libc.so" +//go:cgo_import_dynamic libc_getrusage getrusage "libc.so" +//go:cgo_import_dynamic libc_gettimeofday gettimeofday "libc.so" +//go:cgo_import_dynamic libc_getuid getuid "libc.so" +//go:cgo_import_dynamic libc_kill kill "libc.so" +//go:cgo_import_dynamic libc_lchown lchown "libc.so" +//go:cgo_import_dynamic libc_link link "libc.so" +//go:cgo_import_dynamic libc_listen listen "libsocket.so" +//go:cgo_import_dynamic libc_lstat lstat "libc.so" +//go:cgo_import_dynamic libc_madvise madvise "libc.so" +//go:cgo_import_dynamic libc_mkdir mkdir "libc.so" +//go:cgo_import_dynamic libc_mkdirat mkdirat "libc.so" +//go:cgo_import_dynamic libc_mkfifo mkfifo "libc.so" +//go:cgo_import_dynamic libc_mkfifoat mkfifoat "libc.so" +//go:cgo_import_dynamic libc_mknod mknod "libc.so" +//go:cgo_import_dynamic libc_mknodat mknodat "libc.so" +//go:cgo_import_dynamic libc_mlock mlock "libc.so" +//go:cgo_import_dynamic libc_mlockall mlockall "libc.so" +//go:cgo_import_dynamic libc_mprotect mprotect "libc.so" +//go:cgo_import_dynamic libc_munlock munlock "libc.so" +//go:cgo_import_dynamic libc_munlockall munlockall "libc.so" +//go:cgo_import_dynamic libc_nanosleep nanosleep "libc.so" +//go:cgo_import_dynamic libc_open open "libc.so" +//go:cgo_import_dynamic libc_openat openat "libc.so" +//go:cgo_import_dynamic libc_pathconf pathconf "libc.so" +//go:cgo_import_dynamic libc_pause pause "libc.so" +//go:cgo_import_dynamic libc_pread pread "libc.so" +//go:cgo_import_dynamic libc_pwrite pwrite "libc.so" +//go:cgo_import_dynamic libc_read read "libc.so" +//go:cgo_import_dynamic libc_readlink readlink "libc.so" +//go:cgo_import_dynamic libc_rename rename "libc.so" +//go:cgo_import_dynamic libc_renameat renameat "libc.so" +//go:cgo_import_dynamic libc_rmdir rmdir "libc.so" +//go:cgo_import_dynamic libc_lseek lseek "libc.so" +//go:cgo_import_dynamic libc_setegid setegid "libc.so" +//go:cgo_import_dynamic libc_seteuid seteuid "libc.so" +//go:cgo_import_dynamic libc_setgid setgid "libc.so" +//go:cgo_import_dynamic libc_sethostname sethostname "libc.so" +//go:cgo_import_dynamic libc_setpgid setpgid "libc.so" +//go:cgo_import_dynamic libc_setpriority setpriority "libc.so" +//go:cgo_import_dynamic libc_setregid setregid "libc.so" +//go:cgo_import_dynamic libc_setreuid setreuid "libc.so" +//go:cgo_import_dynamic libc_setrlimit setrlimit "libc.so" +//go:cgo_import_dynamic libc_setsid setsid "libc.so" +//go:cgo_import_dynamic libc_setuid setuid "libc.so" +//go:cgo_import_dynamic libc_shutdown shutdown "libsocket.so" +//go:cgo_import_dynamic libc_stat stat "libc.so" +//go:cgo_import_dynamic libc_symlink symlink "libc.so" +//go:cgo_import_dynamic libc_sync sync "libc.so" +//go:cgo_import_dynamic libc_times times "libc.so" +//go:cgo_import_dynamic libc_truncate truncate "libc.so" +//go:cgo_import_dynamic libc_fsync fsync "libc.so" +//go:cgo_import_dynamic libc_ftruncate ftruncate "libc.so" +//go:cgo_import_dynamic libc_umask umask "libc.so" +//go:cgo_import_dynamic libc_uname uname "libc.so" +//go:cgo_import_dynamic libc_umount umount "libc.so" +//go:cgo_import_dynamic libc_unlink unlink "libc.so" +//go:cgo_import_dynamic libc_unlinkat unlinkat "libc.so" +//go:cgo_import_dynamic libc_ustat ustat "libc.so" +//go:cgo_import_dynamic libc_utime utime "libc.so" +//go:cgo_import_dynamic libc_bind bind "libsocket.so" +//go:cgo_import_dynamic libc_connect connect "libsocket.so" +//go:cgo_import_dynamic libc_mmap mmap "libc.so" +//go:cgo_import_dynamic libc_munmap munmap "libc.so" +//go:cgo_import_dynamic libc_sendto sendto "libsocket.so" +//go:cgo_import_dynamic libc_socket socket "libsocket.so" +//go:cgo_import_dynamic libc_socketpair socketpair "libsocket.so" +//go:cgo_import_dynamic libc_write write "libc.so" +//go:cgo_import_dynamic libc_getsockopt getsockopt "libsocket.so" +//go:cgo_import_dynamic libc_getpeername getpeername "libsocket.so" +//go:cgo_import_dynamic libc_setsockopt setsockopt "libsocket.so" +//go:cgo_import_dynamic libc_recvfrom recvfrom "libsocket.so" +//go:cgo_import_dynamic libc_sysconf sysconf "libc.so" + +//go:linkname procgetsockname libc_getsockname +//go:linkname procGetcwd libc_getcwd +//go:linkname procgetgroups libc_getgroups +//go:linkname procsetgroups libc_setgroups +//go:linkname procutimes libc_utimes +//go:linkname procutimensat libc_utimensat +//go:linkname procfcntl libc_fcntl +//go:linkname procfutimesat libc_futimesat +//go:linkname procaccept libc_accept +//go:linkname procrecvmsg libc_recvmsg +//go:linkname procsendmsg libc_sendmsg +//go:linkname procacct libc_acct +//go:linkname procioctl libc_ioctl +//go:linkname procAccess libc_access +//go:linkname procAdjtime libc_adjtime +//go:linkname procChdir libc_chdir +//go:linkname procChmod libc_chmod +//go:linkname procChown libc_chown +//go:linkname procChroot libc_chroot +//go:linkname procClose libc_close +//go:linkname procCreat libc_creat +//go:linkname procDup libc_dup +//go:linkname procDup2 libc_dup2 +//go:linkname procExit libc_exit +//go:linkname procFchdir libc_fchdir +//go:linkname procFchmod libc_fchmod +//go:linkname procFchmodat libc_fchmodat +//go:linkname procFchown libc_fchown +//go:linkname procFchownat libc_fchownat +//go:linkname procFdatasync libc_fdatasync +//go:linkname procFpathconf libc_fpathconf +//go:linkname procFstat libc_fstat +//go:linkname procGetdents libc_getdents +//go:linkname procGetgid libc_getgid +//go:linkname procGetpid libc_getpid +//go:linkname procGetpgid libc_getpgid +//go:linkname procGetpgrp libc_getpgrp +//go:linkname procGeteuid libc_geteuid +//go:linkname procGetegid libc_getegid +//go:linkname procGetppid libc_getppid +//go:linkname procGetpriority libc_getpriority +//go:linkname procGetrlimit libc_getrlimit +//go:linkname procGetrusage libc_getrusage +//go:linkname procGettimeofday libc_gettimeofday +//go:linkname procGetuid libc_getuid +//go:linkname procKill libc_kill +//go:linkname procLchown libc_lchown +//go:linkname procLink libc_link +//go:linkname proclisten libc_listen +//go:linkname procLstat libc_lstat +//go:linkname procMadvise libc_madvise +//go:linkname procMkdir libc_mkdir +//go:linkname procMkdirat libc_mkdirat +//go:linkname procMkfifo libc_mkfifo +//go:linkname procMkfifoat libc_mkfifoat +//go:linkname procMknod libc_mknod +//go:linkname procMknodat libc_mknodat +//go:linkname procMlock libc_mlock +//go:linkname procMlockall libc_mlockall +//go:linkname procMprotect libc_mprotect +//go:linkname procMunlock libc_munlock +//go:linkname procMunlockall libc_munlockall +//go:linkname procNanosleep libc_nanosleep +//go:linkname procOpen libc_open +//go:linkname procOpenat libc_openat +//go:linkname procPathconf libc_pathconf +//go:linkname procPause libc_pause +//go:linkname procPread libc_pread +//go:linkname procPwrite libc_pwrite +//go:linkname procread libc_read +//go:linkname procReadlink libc_readlink +//go:linkname procRename libc_rename +//go:linkname procRenameat libc_renameat +//go:linkname procRmdir libc_rmdir +//go:linkname proclseek libc_lseek +//go:linkname procSetegid libc_setegid +//go:linkname procSeteuid libc_seteuid +//go:linkname procSetgid libc_setgid +//go:linkname procSethostname libc_sethostname +//go:linkname procSetpgid libc_setpgid +//go:linkname procSetpriority libc_setpriority +//go:linkname procSetregid libc_setregid +//go:linkname procSetreuid libc_setreuid +//go:linkname procSetrlimit libc_setrlimit +//go:linkname procSetsid libc_setsid +//go:linkname procSetuid libc_setuid +//go:linkname procshutdown libc_shutdown +//go:linkname procStat libc_stat +//go:linkname procSymlink libc_symlink +//go:linkname procSync libc_sync +//go:linkname procTimes libc_times +//go:linkname procTruncate libc_truncate +//go:linkname procFsync libc_fsync +//go:linkname procFtruncate libc_ftruncate +//go:linkname procUmask libc_umask +//go:linkname procUname libc_uname +//go:linkname procumount libc_umount +//go:linkname procUnlink libc_unlink +//go:linkname procUnlinkat libc_unlinkat +//go:linkname procUstat libc_ustat +//go:linkname procUtime libc_utime +//go:linkname procbind libc_bind +//go:linkname procconnect libc_connect +//go:linkname procmmap libc_mmap +//go:linkname procmunmap libc_munmap +//go:linkname procsendto libc_sendto +//go:linkname procsocket libc_socket +//go:linkname procsocketpair libc_socketpair +//go:linkname procwrite libc_write +//go:linkname procgetsockopt libc_getsockopt +//go:linkname procgetpeername libc_getpeername +//go:linkname procsetsockopt libc_setsockopt +//go:linkname procrecvfrom libc_recvfrom +//go:linkname procsysconf libc_sysconf + +var ( + procgetsockname, + procGetcwd, + procgetgroups, + procsetgroups, + procutimes, + procutimensat, + procfcntl, + procfutimesat, + procaccept, + procrecvmsg, + procsendmsg, + procacct, + procioctl, + procAccess, + procAdjtime, + procChdir, + procChmod, + procChown, + procChroot, + procClose, + procCreat, + procDup, + procDup2, + procExit, + procFchdir, + procFchmod, + procFchmodat, + procFchown, + procFchownat, + procFdatasync, + procFpathconf, + procFstat, + procGetdents, + procGetgid, + procGetpid, + procGetpgid, + procGetpgrp, + procGeteuid, + procGetegid, + procGetppid, + procGetpriority, + procGetrlimit, + procGetrusage, + procGettimeofday, + procGetuid, + procKill, + procLchown, + procLink, + proclisten, + procLstat, + procMadvise, + procMkdir, + procMkdirat, + procMkfifo, + procMkfifoat, + procMknod, + procMknodat, + procMlock, + procMlockall, + procMprotect, + procMunlock, + procMunlockall, + procNanosleep, + procOpen, + procOpenat, + procPathconf, + procPause, + procPread, + procPwrite, + procread, + procReadlink, + procRename, + procRenameat, + procRmdir, + proclseek, + procSetegid, + procSeteuid, + procSetgid, + procSethostname, + procSetpgid, + procSetpriority, + procSetregid, + procSetreuid, + procSetrlimit, + procSetsid, + procSetuid, + procshutdown, + procStat, + procSymlink, + procSync, + procTimes, + procTruncate, + procFsync, + procFtruncate, + procUmask, + procUname, + procumount, + procUnlink, + procUnlinkat, + procUstat, + procUtime, + procbind, + procconnect, + procmmap, + procmunmap, + procsendto, + procsocket, + procsocketpair, + procwrite, + procgetsockopt, + procgetpeername, + procsetsockopt, + procrecvfrom, + procsysconf syscallFunc +) + +func getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgetsockname)), 3, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Getcwd(buf []byte) (n int, err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetcwd)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func getgroups(ngid int, gid *_Gid_t) (n int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procgetgroups)), 2, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func setgroups(ngid int, gid *_Gid_t) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procsetgroups)), 2, uintptr(ngid), uintptr(unsafe.Pointer(gid)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func utimes(path string, times *[2]Timeval) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procutimes)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func utimensat(fd int, path string, times *[2]Timespec, flag int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procutimensat)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(times)), uintptr(flag), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func fcntl(fd int, cmd int, arg int) (val int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfcntl)), 3, uintptr(fd), uintptr(cmd), uintptr(arg), 0, 0, 0) + val = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func futimesat(fildes int, path *byte, times *[2]Timeval) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfutimesat)), 3, uintptr(fildes), uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(times)), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procaccept)), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procrecvmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsendmsg)), 3, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func acct(path *byte) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procacct)), 1, uintptr(unsafe.Pointer(path)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func ioctl(fd int, req int, arg uintptr) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procioctl)), 3, uintptr(fd), uintptr(req), uintptr(arg), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Access(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procAccess)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Adjtime(delta *Timeval, olddelta *Timeval) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procAdjtime)), 2, uintptr(unsafe.Pointer(delta)), uintptr(unsafe.Pointer(olddelta)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Chdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChdir)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Chmod(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChmod)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Chown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChown)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Chroot(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procChroot)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Close(fd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procClose)), 1, uintptr(fd), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Creat(path string, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procCreat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Dup(fd int) (nfd int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procDup)), 1, uintptr(fd), 0, 0, 0, 0, 0) + nfd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Dup2(oldfd int, newfd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procDup2)), 2, uintptr(oldfd), uintptr(newfd), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Exit(code int) { + sysvicall6(uintptr(unsafe.Pointer(&procExit)), 1, uintptr(code), 0, 0, 0, 0, 0) + return +} + +func Fchdir(fd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchdir)), 1, uintptr(fd), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fchmod(fd int, mode uint32) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchmod)), 2, uintptr(fd), uintptr(mode), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchmodat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Fchown(fd int, uid int, gid int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchown)), 3, uintptr(fd), uintptr(uid), uintptr(gid), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFchownat)), 5, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), uintptr(flags), 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Fdatasync(fd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFdatasync)), 1, uintptr(fd), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Fpathconf(fd int, name int) (val int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFpathconf)), 2, uintptr(fd), uintptr(name), 0, 0, 0, 0) + val = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Fstat(fd int, stat *Stat_t) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFstat)), 2, uintptr(fd), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Getdents(fd int, buf []byte, basep *uintptr) (n int, err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetdents)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(basep)), 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Getgid() (gid int) { + r0, _, _ := rawSysvicall6(uintptr(unsafe.Pointer(&procGetgid)), 0, 0, 0, 0, 0, 0, 0) + gid = int(r0) + return +} + +func Getpid() (pid int) { + r0, _, _ := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpid)), 0, 0, 0, 0, 0, 0, 0) + pid = int(r0) + return +} + +func Getpgid(pid int) (pgid int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpgid)), 1, uintptr(pid), 0, 0, 0, 0, 0) + pgid = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Getpgrp() (pgid int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetpgrp)), 0, 0, 0, 0, 0, 0, 0) + pgid = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Geteuid() (euid int) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procGeteuid)), 0, 0, 0, 0, 0, 0, 0) + euid = int(r0) + return +} + +func Getegid() (egid int) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procGetegid)), 0, 0, 0, 0, 0, 0, 0) + egid = int(r0) + return +} + +func Getppid() (ppid int) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procGetppid)), 0, 0, 0, 0, 0, 0, 0) + ppid = int(r0) + return +} + +func Getpriority(which int, who int) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procGetpriority)), 2, uintptr(which), uintptr(who), 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Getrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetrlimit)), 2, uintptr(which), uintptr(unsafe.Pointer(lim)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Getrusage(who int, rusage *Rusage) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGetrusage)), 2, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Gettimeofday(tv *Timeval) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procGettimeofday)), 1, uintptr(unsafe.Pointer(tv)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Getuid() (uid int) { + r0, _, _ := rawSysvicall6(uintptr(unsafe.Pointer(&procGetuid)), 0, 0, 0, 0, 0, 0, 0) + uid = int(r0) + return +} + +func Kill(pid int, signum syscall.Signal) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procKill)), 2, uintptr(pid), uintptr(signum), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Lchown(path string, uid int, gid int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLchown)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(uid), uintptr(gid), 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Link(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLink)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = e1 + } + return +} + +func Listen(s int, backlog int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proclisten)), 2, uintptr(s), uintptr(backlog), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Lstat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procLstat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Madvise(b []byte, advice int) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMadvise)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(advice), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mkdir(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkdir)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Mkdirat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkdirat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Mkfifo(path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkfifo)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Mkfifoat(dirfd int, path string, mode uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMkfifoat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Mknod(path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMknod)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Mknodat(dirfd int, path string, mode uint32, dev int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMknodat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(dev), 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Mlock(b []byte) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMlock)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mlockall(flags int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMlockall)), 1, uintptr(flags), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Mprotect(b []byte, prot int) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMprotect)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), uintptr(prot), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Munlock(b []byte) (err error) { + var _p0 *byte + if len(b) > 0 { + _p0 = &b[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMunlock)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(b)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Munlockall() (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procMunlockall)), 0, 0, 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Nanosleep(time *Timespec, leftover *Timespec) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procNanosleep)), 2, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Open(path string, mode int, perm uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procOpen)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(perm), 0, 0, 0) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procOpenat)), 4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), uintptr(mode), 0, 0) + use(unsafe.Pointer(_p0)) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Pathconf(path string, name int) (val int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPathconf)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(name), 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + val = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Pause() (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPause)), 0, 0, 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Pread(fd int, p []byte, offset int64) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPread)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Pwrite(fd int, p []byte, offset int64) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procPwrite)), 4, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(offset), 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func read(fd int, p []byte) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procread)), 3, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Readlink(path string, buf []byte) (n int, err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + if len(buf) > 0 { + _p1 = &buf[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procReadlink)), 3, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(len(buf)), 0, 0, 0) + use(unsafe.Pointer(_p0)) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Rename(from string, to string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRename)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = e1 + } + return +} + +func Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(oldpath) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(newpath) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRenameat)), 4, uintptr(olddirfd), uintptr(unsafe.Pointer(_p0)), uintptr(newdirfd), uintptr(unsafe.Pointer(_p1)), 0, 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = e1 + } + return +} + +func Rmdir(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procRmdir)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Seek(fd int, offset int64, whence int) (newoffset int64, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&proclseek)), 3, uintptr(fd), uintptr(offset), uintptr(whence), 0, 0, 0) + newoffset = int64(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Setegid(egid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetegid)), 1, uintptr(egid), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Seteuid(euid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSeteuid)), 1, uintptr(euid), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setgid(gid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetgid)), 1, uintptr(gid), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Sethostname(p []byte) (err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSethostname)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setpgid(pid int, pgid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetpgid)), 2, uintptr(pid), uintptr(pgid), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setpriority(which int, who int, prio int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSetpriority)), 3, uintptr(which), uintptr(who), uintptr(prio), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setregid(rgid int, egid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetregid)), 2, uintptr(rgid), uintptr(egid), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setreuid(ruid int, euid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetreuid)), 2, uintptr(ruid), uintptr(euid), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setrlimit(which int, lim *Rlimit) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetrlimit)), 2, uintptr(which), uintptr(unsafe.Pointer(lim)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Setsid() (pid int, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetsid)), 0, 0, 0, 0, 0, 0, 0) + pid = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Setuid(uid int) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procSetuid)), 1, uintptr(uid), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Shutdown(s int, how int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procshutdown)), 2, uintptr(s), uintptr(how), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Stat(path string, stat *Stat_t) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procStat)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(stat)), 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Symlink(path string, link string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(link) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSymlink)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + use(unsafe.Pointer(_p1)) + if e1 != 0 { + err = e1 + } + return +} + +func Sync() (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procSync)), 0, 0, 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Times(tms *Tms) (ticks uintptr, err error) { + r0, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procTimes)), 1, uintptr(unsafe.Pointer(tms)), 0, 0, 0, 0, 0) + ticks = uintptr(r0) + if e1 != 0 { + err = e1 + } + return +} + +func Truncate(path string, length int64) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procTruncate)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(length), 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Fsync(fd int) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFsync)), 1, uintptr(fd), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Ftruncate(fd int, length int64) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procFtruncate)), 2, uintptr(fd), uintptr(length), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Umask(mask int) (oldmask int) { + r0, _, _ := sysvicall6(uintptr(unsafe.Pointer(&procUmask)), 1, uintptr(mask), 0, 0, 0, 0, 0) + oldmask = int(r0) + return +} + +func Uname(buf *Utsname) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procUname)), 1, uintptr(unsafe.Pointer(buf)), 0, 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Unmount(target string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(target) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procumount)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Unlink(path string) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUnlink)), 1, uintptr(unsafe.Pointer(_p0)), 0, 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Unlinkat(dirfd int, path string, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUnlinkat)), 3, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(flags), 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func Ustat(dev int, ubuf *Ustat_t) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUstat)), 2, uintptr(dev), uintptr(unsafe.Pointer(ubuf)), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func Utime(path string, buf *Utimbuf) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procUtime)), 2, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(buf)), 0, 0, 0, 0) + use(unsafe.Pointer(_p0)) + if e1 != 0 { + err = e1 + } + return +} + +func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procbind)), 3, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procconnect)), 3, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procmmap)), 6, uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) + ret = uintptr(r0) + if e1 != 0 { + err = e1 + } + return +} + +func munmap(addr uintptr, length uintptr) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procmunmap)), 2, uintptr(addr), uintptr(length), 0, 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) { + var _p0 *byte + if len(buf) > 0 { + _p0 = &buf[0] + } + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsendto)), 6, uintptr(s), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(flags), uintptr(to), uintptr(addrlen)) + if e1 != 0 { + err = e1 + } + return +} + +func socket(domain int, typ int, proto int) (fd int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsocket)), 3, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0) + fd = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procsocketpair)), 4, uintptr(domain), uintptr(typ), uintptr(proto), uintptr(unsafe.Pointer(fd)), 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func write(fd int, p []byte) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwrite)), 3, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procgetsockopt)), 5, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0) + if e1 != 0 { + err = e1 + } + return +} + +func getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) { + _, _, e1 := rawSysvicall6(uintptr(unsafe.Pointer(&procgetpeername)), 3, uintptr(fd), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0) + if e1 != 0 { + err = e1 + } + return +} + +func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) { + _, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsetsockopt)), 5, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(vallen), 0) + if e1 != 0 { + err = e1 + } + return +} + +func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) { + var _p0 *byte + if len(p) > 0 { + _p0 = &p[0] + } + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procrecvfrom)), 6, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +func sysconf(name int) (n int64, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procsysconf)), 1, uintptr(name), 0, 0, 0, 0, 0) + n = int64(r0) + if e1 != 0 { + err = e1 + } + return +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysctl_openbsd.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysctl_openbsd.go new file mode 100644 index 0000000000000000000000000000000000000000..83bb935b91c57c8ef568b4da26c9609a324b6e60 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysctl_openbsd.go @@ -0,0 +1,270 @@ +// mksysctl_openbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +package unix + +type mibentry struct { + ctlname string + ctloid []_C_int +} + +var sysctlMib = []mibentry{ + {"ddb.console", []_C_int{9, 6}}, + {"ddb.log", []_C_int{9, 7}}, + {"ddb.max_line", []_C_int{9, 3}}, + {"ddb.max_width", []_C_int{9, 2}}, + {"ddb.panic", []_C_int{9, 5}}, + {"ddb.radix", []_C_int{9, 1}}, + {"ddb.tab_stop_width", []_C_int{9, 4}}, + {"ddb.trigger", []_C_int{9, 8}}, + {"fs.posix.setuid", []_C_int{3, 1, 1}}, + {"hw.allowpowerdown", []_C_int{6, 22}}, + {"hw.byteorder", []_C_int{6, 4}}, + {"hw.cpuspeed", []_C_int{6, 12}}, + {"hw.diskcount", []_C_int{6, 10}}, + {"hw.disknames", []_C_int{6, 8}}, + {"hw.diskstats", []_C_int{6, 9}}, + {"hw.machine", []_C_int{6, 1}}, + {"hw.model", []_C_int{6, 2}}, + {"hw.ncpu", []_C_int{6, 3}}, + {"hw.ncpufound", []_C_int{6, 21}}, + {"hw.pagesize", []_C_int{6, 7}}, + {"hw.physmem", []_C_int{6, 19}}, + {"hw.product", []_C_int{6, 15}}, + {"hw.serialno", []_C_int{6, 17}}, + {"hw.setperf", []_C_int{6, 13}}, + {"hw.usermem", []_C_int{6, 20}}, + {"hw.uuid", []_C_int{6, 18}}, + {"hw.vendor", []_C_int{6, 14}}, + {"hw.version", []_C_int{6, 16}}, + {"kern.arandom", []_C_int{1, 37}}, + {"kern.argmax", []_C_int{1, 8}}, + {"kern.boottime", []_C_int{1, 21}}, + {"kern.bufcachepercent", []_C_int{1, 72}}, + {"kern.ccpu", []_C_int{1, 45}}, + {"kern.clockrate", []_C_int{1, 12}}, + {"kern.consdev", []_C_int{1, 75}}, + {"kern.cp_time", []_C_int{1, 40}}, + {"kern.cp_time2", []_C_int{1, 71}}, + {"kern.cryptodevallowsoft", []_C_int{1, 53}}, + {"kern.domainname", []_C_int{1, 22}}, + {"kern.file", []_C_int{1, 73}}, + {"kern.forkstat", []_C_int{1, 42}}, + {"kern.fscale", []_C_int{1, 46}}, + {"kern.fsync", []_C_int{1, 33}}, + {"kern.hostid", []_C_int{1, 11}}, + {"kern.hostname", []_C_int{1, 10}}, + {"kern.intrcnt.nintrcnt", []_C_int{1, 63, 1}}, + {"kern.job_control", []_C_int{1, 19}}, + {"kern.malloc.buckets", []_C_int{1, 39, 1}}, + {"kern.malloc.kmemnames", []_C_int{1, 39, 3}}, + {"kern.maxclusters", []_C_int{1, 67}}, + {"kern.maxfiles", []_C_int{1, 7}}, + {"kern.maxlocksperuid", []_C_int{1, 70}}, + {"kern.maxpartitions", []_C_int{1, 23}}, + {"kern.maxproc", []_C_int{1, 6}}, + {"kern.maxthread", []_C_int{1, 25}}, + {"kern.maxvnodes", []_C_int{1, 5}}, + {"kern.mbstat", []_C_int{1, 59}}, + {"kern.msgbuf", []_C_int{1, 48}}, + {"kern.msgbufsize", []_C_int{1, 38}}, + {"kern.nchstats", []_C_int{1, 41}}, + {"kern.netlivelocks", []_C_int{1, 76}}, + {"kern.nfiles", []_C_int{1, 56}}, + {"kern.ngroups", []_C_int{1, 18}}, + {"kern.nosuidcoredump", []_C_int{1, 32}}, + {"kern.nprocs", []_C_int{1, 47}}, + {"kern.nselcoll", []_C_int{1, 43}}, + {"kern.nthreads", []_C_int{1, 26}}, + {"kern.numvnodes", []_C_int{1, 58}}, + {"kern.osrelease", []_C_int{1, 2}}, + {"kern.osrevision", []_C_int{1, 3}}, + {"kern.ostype", []_C_int{1, 1}}, + {"kern.osversion", []_C_int{1, 27}}, + {"kern.pool_debug", []_C_int{1, 77}}, + {"kern.posix1version", []_C_int{1, 17}}, + {"kern.proc", []_C_int{1, 66}}, + {"kern.random", []_C_int{1, 31}}, + {"kern.rawpartition", []_C_int{1, 24}}, + {"kern.saved_ids", []_C_int{1, 20}}, + {"kern.securelevel", []_C_int{1, 9}}, + {"kern.seminfo", []_C_int{1, 61}}, + {"kern.shminfo", []_C_int{1, 62}}, + {"kern.somaxconn", []_C_int{1, 28}}, + {"kern.sominconn", []_C_int{1, 29}}, + {"kern.splassert", []_C_int{1, 54}}, + {"kern.stackgap_random", []_C_int{1, 50}}, + {"kern.sysvipc_info", []_C_int{1, 51}}, + {"kern.sysvmsg", []_C_int{1, 34}}, + {"kern.sysvsem", []_C_int{1, 35}}, + {"kern.sysvshm", []_C_int{1, 36}}, + {"kern.timecounter.choice", []_C_int{1, 69, 4}}, + {"kern.timecounter.hardware", []_C_int{1, 69, 3}}, + {"kern.timecounter.tick", []_C_int{1, 69, 1}}, + {"kern.timecounter.timestepwarnings", []_C_int{1, 69, 2}}, + {"kern.tty.maxptys", []_C_int{1, 44, 6}}, + {"kern.tty.nptys", []_C_int{1, 44, 7}}, + {"kern.tty.tk_cancc", []_C_int{1, 44, 4}}, + {"kern.tty.tk_nin", []_C_int{1, 44, 1}}, + {"kern.tty.tk_nout", []_C_int{1, 44, 2}}, + {"kern.tty.tk_rawcc", []_C_int{1, 44, 3}}, + {"kern.tty.ttyinfo", []_C_int{1, 44, 5}}, + {"kern.ttycount", []_C_int{1, 57}}, + {"kern.userasymcrypto", []_C_int{1, 60}}, + {"kern.usercrypto", []_C_int{1, 52}}, + {"kern.usermount", []_C_int{1, 30}}, + {"kern.version", []_C_int{1, 4}}, + {"kern.vnode", []_C_int{1, 13}}, + {"kern.watchdog.auto", []_C_int{1, 64, 2}}, + {"kern.watchdog.period", []_C_int{1, 64, 1}}, + {"net.bpf.bufsize", []_C_int{4, 31, 1}}, + {"net.bpf.maxbufsize", []_C_int{4, 31, 2}}, + {"net.inet.ah.enable", []_C_int{4, 2, 51, 1}}, + {"net.inet.ah.stats", []_C_int{4, 2, 51, 2}}, + {"net.inet.carp.allow", []_C_int{4, 2, 112, 1}}, + {"net.inet.carp.log", []_C_int{4, 2, 112, 3}}, + {"net.inet.carp.preempt", []_C_int{4, 2, 112, 2}}, + {"net.inet.carp.stats", []_C_int{4, 2, 112, 4}}, + {"net.inet.divert.recvspace", []_C_int{4, 2, 258, 1}}, + {"net.inet.divert.sendspace", []_C_int{4, 2, 258, 2}}, + {"net.inet.divert.stats", []_C_int{4, 2, 258, 3}}, + {"net.inet.esp.enable", []_C_int{4, 2, 50, 1}}, + {"net.inet.esp.stats", []_C_int{4, 2, 50, 4}}, + {"net.inet.esp.udpencap", []_C_int{4, 2, 50, 2}}, + {"net.inet.esp.udpencap_port", []_C_int{4, 2, 50, 3}}, + {"net.inet.etherip.allow", []_C_int{4, 2, 97, 1}}, + {"net.inet.etherip.stats", []_C_int{4, 2, 97, 2}}, + {"net.inet.gre.allow", []_C_int{4, 2, 47, 1}}, + {"net.inet.gre.wccp", []_C_int{4, 2, 47, 2}}, + {"net.inet.icmp.bmcastecho", []_C_int{4, 2, 1, 2}}, + {"net.inet.icmp.errppslimit", []_C_int{4, 2, 1, 3}}, + {"net.inet.icmp.maskrepl", []_C_int{4, 2, 1, 1}}, + {"net.inet.icmp.rediraccept", []_C_int{4, 2, 1, 4}}, + {"net.inet.icmp.redirtimeout", []_C_int{4, 2, 1, 5}}, + {"net.inet.icmp.stats", []_C_int{4, 2, 1, 7}}, + {"net.inet.icmp.tstamprepl", []_C_int{4, 2, 1, 6}}, + {"net.inet.igmp.stats", []_C_int{4, 2, 2, 1}}, + {"net.inet.ip.arpqueued", []_C_int{4, 2, 0, 36}}, + {"net.inet.ip.encdebug", []_C_int{4, 2, 0, 12}}, + {"net.inet.ip.forwarding", []_C_int{4, 2, 0, 1}}, + {"net.inet.ip.ifq.congestion", []_C_int{4, 2, 0, 30, 4}}, + {"net.inet.ip.ifq.drops", []_C_int{4, 2, 0, 30, 3}}, + {"net.inet.ip.ifq.len", []_C_int{4, 2, 0, 30, 1}}, + {"net.inet.ip.ifq.maxlen", []_C_int{4, 2, 0, 30, 2}}, + {"net.inet.ip.maxqueue", []_C_int{4, 2, 0, 11}}, + {"net.inet.ip.mforwarding", []_C_int{4, 2, 0, 31}}, + {"net.inet.ip.mrtproto", []_C_int{4, 2, 0, 34}}, + {"net.inet.ip.mrtstats", []_C_int{4, 2, 0, 35}}, + {"net.inet.ip.mtu", []_C_int{4, 2, 0, 4}}, + {"net.inet.ip.mtudisc", []_C_int{4, 2, 0, 27}}, + {"net.inet.ip.mtudisctimeout", []_C_int{4, 2, 0, 28}}, + {"net.inet.ip.multipath", []_C_int{4, 2, 0, 32}}, + {"net.inet.ip.portfirst", []_C_int{4, 2, 0, 7}}, + {"net.inet.ip.porthifirst", []_C_int{4, 2, 0, 9}}, + {"net.inet.ip.porthilast", []_C_int{4, 2, 0, 10}}, + {"net.inet.ip.portlast", []_C_int{4, 2, 0, 8}}, + {"net.inet.ip.redirect", []_C_int{4, 2, 0, 2}}, + {"net.inet.ip.sourceroute", []_C_int{4, 2, 0, 5}}, + {"net.inet.ip.stats", []_C_int{4, 2, 0, 33}}, + {"net.inet.ip.ttl", []_C_int{4, 2, 0, 3}}, + {"net.inet.ipcomp.enable", []_C_int{4, 2, 108, 1}}, + {"net.inet.ipcomp.stats", []_C_int{4, 2, 108, 2}}, + {"net.inet.ipip.allow", []_C_int{4, 2, 4, 1}}, + {"net.inet.ipip.stats", []_C_int{4, 2, 4, 2}}, + {"net.inet.mobileip.allow", []_C_int{4, 2, 55, 1}}, + {"net.inet.pfsync.stats", []_C_int{4, 2, 240, 1}}, + {"net.inet.pim.stats", []_C_int{4, 2, 103, 1}}, + {"net.inet.tcp.ackonpush", []_C_int{4, 2, 6, 13}}, + {"net.inet.tcp.always_keepalive", []_C_int{4, 2, 6, 22}}, + {"net.inet.tcp.baddynamic", []_C_int{4, 2, 6, 6}}, + {"net.inet.tcp.drop", []_C_int{4, 2, 6, 19}}, + {"net.inet.tcp.ecn", []_C_int{4, 2, 6, 14}}, + {"net.inet.tcp.ident", []_C_int{4, 2, 6, 9}}, + {"net.inet.tcp.keepidle", []_C_int{4, 2, 6, 3}}, + {"net.inet.tcp.keepinittime", []_C_int{4, 2, 6, 2}}, + {"net.inet.tcp.keepintvl", []_C_int{4, 2, 6, 4}}, + {"net.inet.tcp.mssdflt", []_C_int{4, 2, 6, 11}}, + {"net.inet.tcp.reasslimit", []_C_int{4, 2, 6, 18}}, + {"net.inet.tcp.rfc1323", []_C_int{4, 2, 6, 1}}, + {"net.inet.tcp.rfc3390", []_C_int{4, 2, 6, 17}}, + {"net.inet.tcp.rstppslimit", []_C_int{4, 2, 6, 12}}, + {"net.inet.tcp.sack", []_C_int{4, 2, 6, 10}}, + {"net.inet.tcp.sackholelimit", []_C_int{4, 2, 6, 20}}, + {"net.inet.tcp.slowhz", []_C_int{4, 2, 6, 5}}, + {"net.inet.tcp.stats", []_C_int{4, 2, 6, 21}}, + {"net.inet.tcp.synbucketlimit", []_C_int{4, 2, 6, 16}}, + {"net.inet.tcp.syncachelimit", []_C_int{4, 2, 6, 15}}, + {"net.inet.udp.baddynamic", []_C_int{4, 2, 17, 2}}, + {"net.inet.udp.checksum", []_C_int{4, 2, 17, 1}}, + {"net.inet.udp.recvspace", []_C_int{4, 2, 17, 3}}, + {"net.inet.udp.sendspace", []_C_int{4, 2, 17, 4}}, + {"net.inet.udp.stats", []_C_int{4, 2, 17, 5}}, + {"net.inet6.divert.recvspace", []_C_int{4, 24, 86, 1}}, + {"net.inet6.divert.sendspace", []_C_int{4, 24, 86, 2}}, + {"net.inet6.divert.stats", []_C_int{4, 24, 86, 3}}, + {"net.inet6.icmp6.errppslimit", []_C_int{4, 24, 30, 14}}, + {"net.inet6.icmp6.mtudisc_hiwat", []_C_int{4, 24, 30, 16}}, + {"net.inet6.icmp6.mtudisc_lowat", []_C_int{4, 24, 30, 17}}, + {"net.inet6.icmp6.nd6_debug", []_C_int{4, 24, 30, 18}}, + {"net.inet6.icmp6.nd6_delay", []_C_int{4, 24, 30, 8}}, + {"net.inet6.icmp6.nd6_maxnudhint", []_C_int{4, 24, 30, 15}}, + {"net.inet6.icmp6.nd6_mmaxtries", []_C_int{4, 24, 30, 10}}, + {"net.inet6.icmp6.nd6_prune", []_C_int{4, 24, 30, 6}}, + {"net.inet6.icmp6.nd6_umaxtries", []_C_int{4, 24, 30, 9}}, + {"net.inet6.icmp6.nd6_useloopback", []_C_int{4, 24, 30, 11}}, + {"net.inet6.icmp6.nodeinfo", []_C_int{4, 24, 30, 13}}, + {"net.inet6.icmp6.rediraccept", []_C_int{4, 24, 30, 2}}, + {"net.inet6.icmp6.redirtimeout", []_C_int{4, 24, 30, 3}}, + {"net.inet6.ip6.accept_rtadv", []_C_int{4, 24, 17, 12}}, + {"net.inet6.ip6.auto_flowlabel", []_C_int{4, 24, 17, 17}}, + {"net.inet6.ip6.dad_count", []_C_int{4, 24, 17, 16}}, + {"net.inet6.ip6.dad_pending", []_C_int{4, 24, 17, 49}}, + {"net.inet6.ip6.defmcasthlim", []_C_int{4, 24, 17, 18}}, + {"net.inet6.ip6.forwarding", []_C_int{4, 24, 17, 1}}, + {"net.inet6.ip6.forwsrcrt", []_C_int{4, 24, 17, 5}}, + {"net.inet6.ip6.hdrnestlimit", []_C_int{4, 24, 17, 15}}, + {"net.inet6.ip6.hlim", []_C_int{4, 24, 17, 3}}, + {"net.inet6.ip6.log_interval", []_C_int{4, 24, 17, 14}}, + {"net.inet6.ip6.maxdynroutes", []_C_int{4, 24, 17, 48}}, + {"net.inet6.ip6.maxfragpackets", []_C_int{4, 24, 17, 9}}, + {"net.inet6.ip6.maxfrags", []_C_int{4, 24, 17, 41}}, + {"net.inet6.ip6.maxifdefrouters", []_C_int{4, 24, 17, 47}}, + {"net.inet6.ip6.maxifprefixes", []_C_int{4, 24, 17, 46}}, + {"net.inet6.ip6.mforwarding", []_C_int{4, 24, 17, 42}}, + {"net.inet6.ip6.mrtproto", []_C_int{4, 24, 17, 8}}, + {"net.inet6.ip6.mtudisctimeout", []_C_int{4, 24, 17, 50}}, + {"net.inet6.ip6.multicast_mtudisc", []_C_int{4, 24, 17, 44}}, + {"net.inet6.ip6.multipath", []_C_int{4, 24, 17, 43}}, + {"net.inet6.ip6.neighborgcthresh", []_C_int{4, 24, 17, 45}}, + {"net.inet6.ip6.redirect", []_C_int{4, 24, 17, 2}}, + {"net.inet6.ip6.rr_prune", []_C_int{4, 24, 17, 22}}, + {"net.inet6.ip6.sourcecheck", []_C_int{4, 24, 17, 10}}, + {"net.inet6.ip6.sourcecheck_logint", []_C_int{4, 24, 17, 11}}, + {"net.inet6.ip6.use_deprecated", []_C_int{4, 24, 17, 21}}, + {"net.inet6.ip6.v6only", []_C_int{4, 24, 17, 24}}, + {"net.key.sadb_dump", []_C_int{4, 30, 1}}, + {"net.key.spd_dump", []_C_int{4, 30, 2}}, + {"net.mpls.ifq.congestion", []_C_int{4, 33, 3, 4}}, + {"net.mpls.ifq.drops", []_C_int{4, 33, 3, 3}}, + {"net.mpls.ifq.len", []_C_int{4, 33, 3, 1}}, + {"net.mpls.ifq.maxlen", []_C_int{4, 33, 3, 2}}, + {"net.mpls.mapttl_ip", []_C_int{4, 33, 5}}, + {"net.mpls.mapttl_ip6", []_C_int{4, 33, 6}}, + {"net.mpls.maxloop_inkernel", []_C_int{4, 33, 4}}, + {"net.mpls.ttl", []_C_int{4, 33, 2}}, + {"net.pflow.stats", []_C_int{4, 34, 1}}, + {"net.pipex.enable", []_C_int{4, 35, 1}}, + {"vm.anonmin", []_C_int{2, 7}}, + {"vm.loadavg", []_C_int{2, 2}}, + {"vm.maxslp", []_C_int{2, 10}}, + {"vm.nkmempages", []_C_int{2, 6}}, + {"vm.psstrings", []_C_int{2, 3}}, + {"vm.swapencrypt.enable", []_C_int{2, 5, 0}}, + {"vm.swapencrypt.keyscreated", []_C_int{2, 5, 1}}, + {"vm.swapencrypt.keysdeleted", []_C_int{2, 5, 2}}, + {"vm.uspace", []_C_int{2, 11}}, + {"vm.uvmexp", []_C_int{2, 4}}, + {"vm.vmmeter", []_C_int{2, 1}}, + {"vm.vnodemin", []_C_int{2, 9}}, + {"vm.vtextmin", []_C_int{2, 8}}, +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go new file mode 100644 index 0000000000000000000000000000000000000000..2786773ba3764b562584583d1f5481a908ef8142 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go @@ -0,0 +1,398 @@ +// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/sys/syscall.h +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build 386,darwin + +package unix + +const ( + SYS_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAIT4 = 7 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_CHDIR = 12 + SYS_FCHDIR = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_CHOWN = 16 + SYS_GETFSSTAT = 18 + SYS_GETPID = 20 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_GETEUID = 25 + SYS_PTRACE = 26 + SYS_RECVMSG = 27 + SYS_SENDMSG = 28 + SYS_RECVFROM = 29 + SYS_ACCEPT = 30 + SYS_GETPEERNAME = 31 + SYS_GETSOCKNAME = 32 + SYS_ACCESS = 33 + SYS_CHFLAGS = 34 + SYS_FCHFLAGS = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_GETPPID = 39 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_GETEGID = 43 + SYS_SIGACTION = 46 + SYS_GETGID = 47 + SYS_SIGPROCMASK = 48 + SYS_GETLOGIN = 49 + SYS_SETLOGIN = 50 + SYS_ACCT = 51 + SYS_SIGPENDING = 52 + SYS_SIGALTSTACK = 53 + SYS_IOCTL = 54 + SYS_REBOOT = 55 + SYS_REVOKE = 56 + SYS_SYMLINK = 57 + SYS_READLINK = 58 + SYS_EXECVE = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_MSYNC = 65 + SYS_VFORK = 66 + SYS_MUNMAP = 73 + SYS_MPROTECT = 74 + SYS_MADVISE = 75 + SYS_MINCORE = 78 + SYS_GETGROUPS = 79 + SYS_SETGROUPS = 80 + SYS_GETPGRP = 81 + SYS_SETPGID = 82 + SYS_SETITIMER = 83 + SYS_SWAPON = 85 + SYS_GETITIMER = 86 + SYS_GETDTABLESIZE = 89 + SYS_DUP2 = 90 + SYS_FCNTL = 92 + SYS_SELECT = 93 + SYS_FSYNC = 95 + SYS_SETPRIORITY = 96 + SYS_SOCKET = 97 + SYS_CONNECT = 98 + SYS_GETPRIORITY = 100 + SYS_BIND = 104 + SYS_SETSOCKOPT = 105 + SYS_LISTEN = 106 + SYS_SIGSUSPEND = 111 + SYS_GETTIMEOFDAY = 116 + SYS_GETRUSAGE = 117 + SYS_GETSOCKOPT = 118 + SYS_READV = 120 + SYS_WRITEV = 121 + SYS_SETTIMEOFDAY = 122 + SYS_FCHOWN = 123 + SYS_FCHMOD = 124 + SYS_SETREUID = 126 + SYS_SETREGID = 127 + SYS_RENAME = 128 + SYS_FLOCK = 131 + SYS_MKFIFO = 132 + SYS_SENDTO = 133 + SYS_SHUTDOWN = 134 + SYS_SOCKETPAIR = 135 + SYS_MKDIR = 136 + SYS_RMDIR = 137 + SYS_UTIMES = 138 + SYS_FUTIMES = 139 + SYS_ADJTIME = 140 + SYS_GETHOSTUUID = 142 + SYS_SETSID = 147 + SYS_GETPGID = 151 + SYS_SETPRIVEXEC = 152 + SYS_PREAD = 153 + SYS_PWRITE = 154 + SYS_NFSSVC = 155 + SYS_STATFS = 157 + SYS_FSTATFS = 158 + SYS_UNMOUNT = 159 + SYS_GETFH = 161 + SYS_QUOTACTL = 165 + SYS_MOUNT = 167 + SYS_CSOPS = 169 + SYS_CSOPS_AUDITTOKEN = 170 + SYS_WAITID = 173 + SYS_KDEBUG_TRACE64 = 179 + SYS_KDEBUG_TRACE = 180 + SYS_SETGID = 181 + SYS_SETEGID = 182 + SYS_SETEUID = 183 + SYS_SIGRETURN = 184 + SYS_CHUD = 185 + SYS_FDATASYNC = 187 + SYS_STAT = 188 + SYS_FSTAT = 189 + SYS_LSTAT = 190 + SYS_PATHCONF = 191 + SYS_FPATHCONF = 192 + SYS_GETRLIMIT = 194 + SYS_SETRLIMIT = 195 + SYS_GETDIRENTRIES = 196 + SYS_MMAP = 197 + SYS_LSEEK = 199 + SYS_TRUNCATE = 200 + SYS_FTRUNCATE = 201 + SYS_SYSCTL = 202 + SYS_MLOCK = 203 + SYS_MUNLOCK = 204 + SYS_UNDELETE = 205 + SYS_OPEN_DPROTECTED_NP = 216 + SYS_GETATTRLIST = 220 + SYS_SETATTRLIST = 221 + SYS_GETDIRENTRIESATTR = 222 + SYS_EXCHANGEDATA = 223 + SYS_SEARCHFS = 225 + SYS_DELETE = 226 + SYS_COPYFILE = 227 + SYS_FGETATTRLIST = 228 + SYS_FSETATTRLIST = 229 + SYS_POLL = 230 + SYS_WATCHEVENT = 231 + SYS_WAITEVENT = 232 + SYS_MODWATCH = 233 + SYS_GETXATTR = 234 + SYS_FGETXATTR = 235 + SYS_SETXATTR = 236 + SYS_FSETXATTR = 237 + SYS_REMOVEXATTR = 238 + SYS_FREMOVEXATTR = 239 + SYS_LISTXATTR = 240 + SYS_FLISTXATTR = 241 + SYS_FSCTL = 242 + SYS_INITGROUPS = 243 + SYS_POSIX_SPAWN = 244 + SYS_FFSCTL = 245 + SYS_NFSCLNT = 247 + SYS_FHOPEN = 248 + SYS_MINHERIT = 250 + SYS_SEMSYS = 251 + SYS_MSGSYS = 252 + SYS_SHMSYS = 253 + SYS_SEMCTL = 254 + SYS_SEMGET = 255 + SYS_SEMOP = 256 + SYS_MSGCTL = 258 + SYS_MSGGET = 259 + SYS_MSGSND = 260 + SYS_MSGRCV = 261 + SYS_SHMAT = 262 + SYS_SHMCTL = 263 + SYS_SHMDT = 264 + SYS_SHMGET = 265 + SYS_SHM_OPEN = 266 + SYS_SHM_UNLINK = 267 + SYS_SEM_OPEN = 268 + SYS_SEM_CLOSE = 269 + SYS_SEM_UNLINK = 270 + SYS_SEM_WAIT = 271 + SYS_SEM_TRYWAIT = 272 + SYS_SEM_POST = 273 + SYS_SYSCTLBYNAME = 274 + SYS_OPEN_EXTENDED = 277 + SYS_UMASK_EXTENDED = 278 + SYS_STAT_EXTENDED = 279 + SYS_LSTAT_EXTENDED = 280 + SYS_FSTAT_EXTENDED = 281 + SYS_CHMOD_EXTENDED = 282 + SYS_FCHMOD_EXTENDED = 283 + SYS_ACCESS_EXTENDED = 284 + SYS_SETTID = 285 + SYS_GETTID = 286 + SYS_SETSGROUPS = 287 + SYS_GETSGROUPS = 288 + SYS_SETWGROUPS = 289 + SYS_GETWGROUPS = 290 + SYS_MKFIFO_EXTENDED = 291 + SYS_MKDIR_EXTENDED = 292 + SYS_IDENTITYSVC = 293 + SYS_SHARED_REGION_CHECK_NP = 294 + SYS_VM_PRESSURE_MONITOR = 296 + SYS_PSYNCH_RW_LONGRDLOCK = 297 + SYS_PSYNCH_RW_YIELDWRLOCK = 298 + SYS_PSYNCH_RW_DOWNGRADE = 299 + SYS_PSYNCH_RW_UPGRADE = 300 + SYS_PSYNCH_MUTEXWAIT = 301 + SYS_PSYNCH_MUTEXDROP = 302 + SYS_PSYNCH_CVBROAD = 303 + SYS_PSYNCH_CVSIGNAL = 304 + SYS_PSYNCH_CVWAIT = 305 + SYS_PSYNCH_RW_RDLOCK = 306 + SYS_PSYNCH_RW_WRLOCK = 307 + SYS_PSYNCH_RW_UNLOCK = 308 + SYS_PSYNCH_RW_UNLOCK2 = 309 + SYS_GETSID = 310 + SYS_SETTID_WITH_PID = 311 + SYS_PSYNCH_CVCLRPREPOST = 312 + SYS_AIO_FSYNC = 313 + SYS_AIO_RETURN = 314 + SYS_AIO_SUSPEND = 315 + SYS_AIO_CANCEL = 316 + SYS_AIO_ERROR = 317 + SYS_AIO_READ = 318 + SYS_AIO_WRITE = 319 + SYS_LIO_LISTIO = 320 + SYS_IOPOLICYSYS = 322 + SYS_PROCESS_POLICY = 323 + SYS_MLOCKALL = 324 + SYS_MUNLOCKALL = 325 + SYS_ISSETUGID = 327 + SYS___PTHREAD_KILL = 328 + SYS___PTHREAD_SIGMASK = 329 + SYS___SIGWAIT = 330 + SYS___DISABLE_THREADSIGNAL = 331 + SYS___PTHREAD_MARKCANCEL = 332 + SYS___PTHREAD_CANCELED = 333 + SYS___SEMWAIT_SIGNAL = 334 + SYS_PROC_INFO = 336 + SYS_SENDFILE = 337 + SYS_STAT64 = 338 + SYS_FSTAT64 = 339 + SYS_LSTAT64 = 340 + SYS_STAT64_EXTENDED = 341 + SYS_LSTAT64_EXTENDED = 342 + SYS_FSTAT64_EXTENDED = 343 + SYS_GETDIRENTRIES64 = 344 + SYS_STATFS64 = 345 + SYS_FSTATFS64 = 346 + SYS_GETFSSTAT64 = 347 + SYS___PTHREAD_CHDIR = 348 + SYS___PTHREAD_FCHDIR = 349 + SYS_AUDIT = 350 + SYS_AUDITON = 351 + SYS_GETAUID = 353 + SYS_SETAUID = 354 + SYS_GETAUDIT_ADDR = 357 + SYS_SETAUDIT_ADDR = 358 + SYS_AUDITCTL = 359 + SYS_BSDTHREAD_CREATE = 360 + SYS_BSDTHREAD_TERMINATE = 361 + SYS_KQUEUE = 362 + SYS_KEVENT = 363 + SYS_LCHOWN = 364 + SYS_STACK_SNAPSHOT = 365 + SYS_BSDTHREAD_REGISTER = 366 + SYS_WORKQ_OPEN = 367 + SYS_WORKQ_KERNRETURN = 368 + SYS_KEVENT64 = 369 + SYS___OLD_SEMWAIT_SIGNAL = 370 + SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 + SYS_THREAD_SELFID = 372 + SYS_LEDGER = 373 + SYS___MAC_EXECVE = 380 + SYS___MAC_SYSCALL = 381 + SYS___MAC_GET_FILE = 382 + SYS___MAC_SET_FILE = 383 + SYS___MAC_GET_LINK = 384 + SYS___MAC_SET_LINK = 385 + SYS___MAC_GET_PROC = 386 + SYS___MAC_SET_PROC = 387 + SYS___MAC_GET_FD = 388 + SYS___MAC_SET_FD = 389 + SYS___MAC_GET_PID = 390 + SYS___MAC_GET_LCID = 391 + SYS___MAC_GET_LCTX = 392 + SYS___MAC_SET_LCTX = 393 + SYS_SETLCID = 394 + SYS_GETLCID = 395 + SYS_READ_NOCANCEL = 396 + SYS_WRITE_NOCANCEL = 397 + SYS_OPEN_NOCANCEL = 398 + SYS_CLOSE_NOCANCEL = 399 + SYS_WAIT4_NOCANCEL = 400 + SYS_RECVMSG_NOCANCEL = 401 + SYS_SENDMSG_NOCANCEL = 402 + SYS_RECVFROM_NOCANCEL = 403 + SYS_ACCEPT_NOCANCEL = 404 + SYS_MSYNC_NOCANCEL = 405 + SYS_FCNTL_NOCANCEL = 406 + SYS_SELECT_NOCANCEL = 407 + SYS_FSYNC_NOCANCEL = 408 + SYS_CONNECT_NOCANCEL = 409 + SYS_SIGSUSPEND_NOCANCEL = 410 + SYS_READV_NOCANCEL = 411 + SYS_WRITEV_NOCANCEL = 412 + SYS_SENDTO_NOCANCEL = 413 + SYS_PREAD_NOCANCEL = 414 + SYS_PWRITE_NOCANCEL = 415 + SYS_WAITID_NOCANCEL = 416 + SYS_POLL_NOCANCEL = 417 + SYS_MSGSND_NOCANCEL = 418 + SYS_MSGRCV_NOCANCEL = 419 + SYS_SEM_WAIT_NOCANCEL = 420 + SYS_AIO_SUSPEND_NOCANCEL = 421 + SYS___SIGWAIT_NOCANCEL = 422 + SYS___SEMWAIT_SIGNAL_NOCANCEL = 423 + SYS___MAC_MOUNT = 424 + SYS___MAC_GET_MOUNT = 425 + SYS___MAC_GETFSSTAT = 426 + SYS_FSGETPATH = 427 + SYS_AUDIT_SESSION_SELF = 428 + SYS_AUDIT_SESSION_JOIN = 429 + SYS_FILEPORT_MAKEPORT = 430 + SYS_FILEPORT_MAKEFD = 431 + SYS_AUDIT_SESSION_PORT = 432 + SYS_PID_SUSPEND = 433 + SYS_PID_RESUME = 434 + SYS_PID_HIBERNATE = 435 + SYS_PID_SHUTDOWN_SOCKETS = 436 + SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438 + SYS_KAS_INFO = 439 + SYS_MEMORYSTATUS_CONTROL = 440 + SYS_GUARDED_OPEN_NP = 441 + SYS_GUARDED_CLOSE_NP = 442 + SYS_GUARDED_KQUEUE_NP = 443 + SYS_CHANGE_FDGUARD_NP = 444 + SYS_PROC_RLIMIT_CONTROL = 446 + SYS_CONNECTX = 447 + SYS_DISCONNECTX = 448 + SYS_PEELOFF = 449 + SYS_SOCKET_DELEGATE = 450 + SYS_TELEMETRY = 451 + SYS_PROC_UUID_POLICY = 452 + SYS_MEMORYSTATUS_GET_LEVEL = 453 + SYS_SYSTEM_OVERRIDE = 454 + SYS_VFS_PURGE = 455 + SYS_SFI_CTL = 456 + SYS_SFI_PIDCTL = 457 + SYS_COALITION = 458 + SYS_COALITION_INFO = 459 + SYS_NECP_MATCH_POLICY = 460 + SYS_GETATTRLISTBULK = 461 + SYS_OPENAT = 463 + SYS_OPENAT_NOCANCEL = 464 + SYS_RENAMEAT = 465 + SYS_FACCESSAT = 466 + SYS_FCHMODAT = 467 + SYS_FCHOWNAT = 468 + SYS_FSTATAT = 469 + SYS_FSTATAT64 = 470 + SYS_LINKAT = 471 + SYS_UNLINKAT = 472 + SYS_READLINKAT = 473 + SYS_SYMLINKAT = 474 + SYS_MKDIRAT = 475 + SYS_GETATTRLISTAT = 476 + SYS_PROC_TRACE_LOG = 477 + SYS_BSDTHREAD_CTL = 478 + SYS_OPENBYID_NP = 479 + SYS_RECVMSG_X = 480 + SYS_SENDMSG_X = 481 + SYS_THREAD_SELFUSAGE = 482 + SYS_CSRCTL = 483 + SYS_GUARDED_OPEN_DPROTECTED_NP = 484 + SYS_GUARDED_WRITE_NP = 485 + SYS_GUARDED_PWRITE_NP = 486 + SYS_GUARDED_WRITEV_NP = 487 + SYS_RENAME_EXT = 488 + SYS_MREMAP_ENCRYPTED = 489 + SYS_MAXSYSCALL = 490 +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..09de240c8f8257c73e51afefd5adf26e4baeefae --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go @@ -0,0 +1,398 @@ +// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/sys/syscall.h +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build amd64,darwin + +package unix + +const ( + SYS_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAIT4 = 7 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_CHDIR = 12 + SYS_FCHDIR = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_CHOWN = 16 + SYS_GETFSSTAT = 18 + SYS_GETPID = 20 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_GETEUID = 25 + SYS_PTRACE = 26 + SYS_RECVMSG = 27 + SYS_SENDMSG = 28 + SYS_RECVFROM = 29 + SYS_ACCEPT = 30 + SYS_GETPEERNAME = 31 + SYS_GETSOCKNAME = 32 + SYS_ACCESS = 33 + SYS_CHFLAGS = 34 + SYS_FCHFLAGS = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_GETPPID = 39 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_GETEGID = 43 + SYS_SIGACTION = 46 + SYS_GETGID = 47 + SYS_SIGPROCMASK = 48 + SYS_GETLOGIN = 49 + SYS_SETLOGIN = 50 + SYS_ACCT = 51 + SYS_SIGPENDING = 52 + SYS_SIGALTSTACK = 53 + SYS_IOCTL = 54 + SYS_REBOOT = 55 + SYS_REVOKE = 56 + SYS_SYMLINK = 57 + SYS_READLINK = 58 + SYS_EXECVE = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_MSYNC = 65 + SYS_VFORK = 66 + SYS_MUNMAP = 73 + SYS_MPROTECT = 74 + SYS_MADVISE = 75 + SYS_MINCORE = 78 + SYS_GETGROUPS = 79 + SYS_SETGROUPS = 80 + SYS_GETPGRP = 81 + SYS_SETPGID = 82 + SYS_SETITIMER = 83 + SYS_SWAPON = 85 + SYS_GETITIMER = 86 + SYS_GETDTABLESIZE = 89 + SYS_DUP2 = 90 + SYS_FCNTL = 92 + SYS_SELECT = 93 + SYS_FSYNC = 95 + SYS_SETPRIORITY = 96 + SYS_SOCKET = 97 + SYS_CONNECT = 98 + SYS_GETPRIORITY = 100 + SYS_BIND = 104 + SYS_SETSOCKOPT = 105 + SYS_LISTEN = 106 + SYS_SIGSUSPEND = 111 + SYS_GETTIMEOFDAY = 116 + SYS_GETRUSAGE = 117 + SYS_GETSOCKOPT = 118 + SYS_READV = 120 + SYS_WRITEV = 121 + SYS_SETTIMEOFDAY = 122 + SYS_FCHOWN = 123 + SYS_FCHMOD = 124 + SYS_SETREUID = 126 + SYS_SETREGID = 127 + SYS_RENAME = 128 + SYS_FLOCK = 131 + SYS_MKFIFO = 132 + SYS_SENDTO = 133 + SYS_SHUTDOWN = 134 + SYS_SOCKETPAIR = 135 + SYS_MKDIR = 136 + SYS_RMDIR = 137 + SYS_UTIMES = 138 + SYS_FUTIMES = 139 + SYS_ADJTIME = 140 + SYS_GETHOSTUUID = 142 + SYS_SETSID = 147 + SYS_GETPGID = 151 + SYS_SETPRIVEXEC = 152 + SYS_PREAD = 153 + SYS_PWRITE = 154 + SYS_NFSSVC = 155 + SYS_STATFS = 157 + SYS_FSTATFS = 158 + SYS_UNMOUNT = 159 + SYS_GETFH = 161 + SYS_QUOTACTL = 165 + SYS_MOUNT = 167 + SYS_CSOPS = 169 + SYS_CSOPS_AUDITTOKEN = 170 + SYS_WAITID = 173 + SYS_KDEBUG_TRACE64 = 179 + SYS_KDEBUG_TRACE = 180 + SYS_SETGID = 181 + SYS_SETEGID = 182 + SYS_SETEUID = 183 + SYS_SIGRETURN = 184 + SYS_CHUD = 185 + SYS_FDATASYNC = 187 + SYS_STAT = 188 + SYS_FSTAT = 189 + SYS_LSTAT = 190 + SYS_PATHCONF = 191 + SYS_FPATHCONF = 192 + SYS_GETRLIMIT = 194 + SYS_SETRLIMIT = 195 + SYS_GETDIRENTRIES = 196 + SYS_MMAP = 197 + SYS_LSEEK = 199 + SYS_TRUNCATE = 200 + SYS_FTRUNCATE = 201 + SYS_SYSCTL = 202 + SYS_MLOCK = 203 + SYS_MUNLOCK = 204 + SYS_UNDELETE = 205 + SYS_OPEN_DPROTECTED_NP = 216 + SYS_GETATTRLIST = 220 + SYS_SETATTRLIST = 221 + SYS_GETDIRENTRIESATTR = 222 + SYS_EXCHANGEDATA = 223 + SYS_SEARCHFS = 225 + SYS_DELETE = 226 + SYS_COPYFILE = 227 + SYS_FGETATTRLIST = 228 + SYS_FSETATTRLIST = 229 + SYS_POLL = 230 + SYS_WATCHEVENT = 231 + SYS_WAITEVENT = 232 + SYS_MODWATCH = 233 + SYS_GETXATTR = 234 + SYS_FGETXATTR = 235 + SYS_SETXATTR = 236 + SYS_FSETXATTR = 237 + SYS_REMOVEXATTR = 238 + SYS_FREMOVEXATTR = 239 + SYS_LISTXATTR = 240 + SYS_FLISTXATTR = 241 + SYS_FSCTL = 242 + SYS_INITGROUPS = 243 + SYS_POSIX_SPAWN = 244 + SYS_FFSCTL = 245 + SYS_NFSCLNT = 247 + SYS_FHOPEN = 248 + SYS_MINHERIT = 250 + SYS_SEMSYS = 251 + SYS_MSGSYS = 252 + SYS_SHMSYS = 253 + SYS_SEMCTL = 254 + SYS_SEMGET = 255 + SYS_SEMOP = 256 + SYS_MSGCTL = 258 + SYS_MSGGET = 259 + SYS_MSGSND = 260 + SYS_MSGRCV = 261 + SYS_SHMAT = 262 + SYS_SHMCTL = 263 + SYS_SHMDT = 264 + SYS_SHMGET = 265 + SYS_SHM_OPEN = 266 + SYS_SHM_UNLINK = 267 + SYS_SEM_OPEN = 268 + SYS_SEM_CLOSE = 269 + SYS_SEM_UNLINK = 270 + SYS_SEM_WAIT = 271 + SYS_SEM_TRYWAIT = 272 + SYS_SEM_POST = 273 + SYS_SYSCTLBYNAME = 274 + SYS_OPEN_EXTENDED = 277 + SYS_UMASK_EXTENDED = 278 + SYS_STAT_EXTENDED = 279 + SYS_LSTAT_EXTENDED = 280 + SYS_FSTAT_EXTENDED = 281 + SYS_CHMOD_EXTENDED = 282 + SYS_FCHMOD_EXTENDED = 283 + SYS_ACCESS_EXTENDED = 284 + SYS_SETTID = 285 + SYS_GETTID = 286 + SYS_SETSGROUPS = 287 + SYS_GETSGROUPS = 288 + SYS_SETWGROUPS = 289 + SYS_GETWGROUPS = 290 + SYS_MKFIFO_EXTENDED = 291 + SYS_MKDIR_EXTENDED = 292 + SYS_IDENTITYSVC = 293 + SYS_SHARED_REGION_CHECK_NP = 294 + SYS_VM_PRESSURE_MONITOR = 296 + SYS_PSYNCH_RW_LONGRDLOCK = 297 + SYS_PSYNCH_RW_YIELDWRLOCK = 298 + SYS_PSYNCH_RW_DOWNGRADE = 299 + SYS_PSYNCH_RW_UPGRADE = 300 + SYS_PSYNCH_MUTEXWAIT = 301 + SYS_PSYNCH_MUTEXDROP = 302 + SYS_PSYNCH_CVBROAD = 303 + SYS_PSYNCH_CVSIGNAL = 304 + SYS_PSYNCH_CVWAIT = 305 + SYS_PSYNCH_RW_RDLOCK = 306 + SYS_PSYNCH_RW_WRLOCK = 307 + SYS_PSYNCH_RW_UNLOCK = 308 + SYS_PSYNCH_RW_UNLOCK2 = 309 + SYS_GETSID = 310 + SYS_SETTID_WITH_PID = 311 + SYS_PSYNCH_CVCLRPREPOST = 312 + SYS_AIO_FSYNC = 313 + SYS_AIO_RETURN = 314 + SYS_AIO_SUSPEND = 315 + SYS_AIO_CANCEL = 316 + SYS_AIO_ERROR = 317 + SYS_AIO_READ = 318 + SYS_AIO_WRITE = 319 + SYS_LIO_LISTIO = 320 + SYS_IOPOLICYSYS = 322 + SYS_PROCESS_POLICY = 323 + SYS_MLOCKALL = 324 + SYS_MUNLOCKALL = 325 + SYS_ISSETUGID = 327 + SYS___PTHREAD_KILL = 328 + SYS___PTHREAD_SIGMASK = 329 + SYS___SIGWAIT = 330 + SYS___DISABLE_THREADSIGNAL = 331 + SYS___PTHREAD_MARKCANCEL = 332 + SYS___PTHREAD_CANCELED = 333 + SYS___SEMWAIT_SIGNAL = 334 + SYS_PROC_INFO = 336 + SYS_SENDFILE = 337 + SYS_STAT64 = 338 + SYS_FSTAT64 = 339 + SYS_LSTAT64 = 340 + SYS_STAT64_EXTENDED = 341 + SYS_LSTAT64_EXTENDED = 342 + SYS_FSTAT64_EXTENDED = 343 + SYS_GETDIRENTRIES64 = 344 + SYS_STATFS64 = 345 + SYS_FSTATFS64 = 346 + SYS_GETFSSTAT64 = 347 + SYS___PTHREAD_CHDIR = 348 + SYS___PTHREAD_FCHDIR = 349 + SYS_AUDIT = 350 + SYS_AUDITON = 351 + SYS_GETAUID = 353 + SYS_SETAUID = 354 + SYS_GETAUDIT_ADDR = 357 + SYS_SETAUDIT_ADDR = 358 + SYS_AUDITCTL = 359 + SYS_BSDTHREAD_CREATE = 360 + SYS_BSDTHREAD_TERMINATE = 361 + SYS_KQUEUE = 362 + SYS_KEVENT = 363 + SYS_LCHOWN = 364 + SYS_STACK_SNAPSHOT = 365 + SYS_BSDTHREAD_REGISTER = 366 + SYS_WORKQ_OPEN = 367 + SYS_WORKQ_KERNRETURN = 368 + SYS_KEVENT64 = 369 + SYS___OLD_SEMWAIT_SIGNAL = 370 + SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 + SYS_THREAD_SELFID = 372 + SYS_LEDGER = 373 + SYS___MAC_EXECVE = 380 + SYS___MAC_SYSCALL = 381 + SYS___MAC_GET_FILE = 382 + SYS___MAC_SET_FILE = 383 + SYS___MAC_GET_LINK = 384 + SYS___MAC_SET_LINK = 385 + SYS___MAC_GET_PROC = 386 + SYS___MAC_SET_PROC = 387 + SYS___MAC_GET_FD = 388 + SYS___MAC_SET_FD = 389 + SYS___MAC_GET_PID = 390 + SYS___MAC_GET_LCID = 391 + SYS___MAC_GET_LCTX = 392 + SYS___MAC_SET_LCTX = 393 + SYS_SETLCID = 394 + SYS_GETLCID = 395 + SYS_READ_NOCANCEL = 396 + SYS_WRITE_NOCANCEL = 397 + SYS_OPEN_NOCANCEL = 398 + SYS_CLOSE_NOCANCEL = 399 + SYS_WAIT4_NOCANCEL = 400 + SYS_RECVMSG_NOCANCEL = 401 + SYS_SENDMSG_NOCANCEL = 402 + SYS_RECVFROM_NOCANCEL = 403 + SYS_ACCEPT_NOCANCEL = 404 + SYS_MSYNC_NOCANCEL = 405 + SYS_FCNTL_NOCANCEL = 406 + SYS_SELECT_NOCANCEL = 407 + SYS_FSYNC_NOCANCEL = 408 + SYS_CONNECT_NOCANCEL = 409 + SYS_SIGSUSPEND_NOCANCEL = 410 + SYS_READV_NOCANCEL = 411 + SYS_WRITEV_NOCANCEL = 412 + SYS_SENDTO_NOCANCEL = 413 + SYS_PREAD_NOCANCEL = 414 + SYS_PWRITE_NOCANCEL = 415 + SYS_WAITID_NOCANCEL = 416 + SYS_POLL_NOCANCEL = 417 + SYS_MSGSND_NOCANCEL = 418 + SYS_MSGRCV_NOCANCEL = 419 + SYS_SEM_WAIT_NOCANCEL = 420 + SYS_AIO_SUSPEND_NOCANCEL = 421 + SYS___SIGWAIT_NOCANCEL = 422 + SYS___SEMWAIT_SIGNAL_NOCANCEL = 423 + SYS___MAC_MOUNT = 424 + SYS___MAC_GET_MOUNT = 425 + SYS___MAC_GETFSSTAT = 426 + SYS_FSGETPATH = 427 + SYS_AUDIT_SESSION_SELF = 428 + SYS_AUDIT_SESSION_JOIN = 429 + SYS_FILEPORT_MAKEPORT = 430 + SYS_FILEPORT_MAKEFD = 431 + SYS_AUDIT_SESSION_PORT = 432 + SYS_PID_SUSPEND = 433 + SYS_PID_RESUME = 434 + SYS_PID_HIBERNATE = 435 + SYS_PID_SHUTDOWN_SOCKETS = 436 + SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438 + SYS_KAS_INFO = 439 + SYS_MEMORYSTATUS_CONTROL = 440 + SYS_GUARDED_OPEN_NP = 441 + SYS_GUARDED_CLOSE_NP = 442 + SYS_GUARDED_KQUEUE_NP = 443 + SYS_CHANGE_FDGUARD_NP = 444 + SYS_PROC_RLIMIT_CONTROL = 446 + SYS_CONNECTX = 447 + SYS_DISCONNECTX = 448 + SYS_PEELOFF = 449 + SYS_SOCKET_DELEGATE = 450 + SYS_TELEMETRY = 451 + SYS_PROC_UUID_POLICY = 452 + SYS_MEMORYSTATUS_GET_LEVEL = 453 + SYS_SYSTEM_OVERRIDE = 454 + SYS_VFS_PURGE = 455 + SYS_SFI_CTL = 456 + SYS_SFI_PIDCTL = 457 + SYS_COALITION = 458 + SYS_COALITION_INFO = 459 + SYS_NECP_MATCH_POLICY = 460 + SYS_GETATTRLISTBULK = 461 + SYS_OPENAT = 463 + SYS_OPENAT_NOCANCEL = 464 + SYS_RENAMEAT = 465 + SYS_FACCESSAT = 466 + SYS_FCHMODAT = 467 + SYS_FCHOWNAT = 468 + SYS_FSTATAT = 469 + SYS_FSTATAT64 = 470 + SYS_LINKAT = 471 + SYS_UNLINKAT = 472 + SYS_READLINKAT = 473 + SYS_SYMLINKAT = 474 + SYS_MKDIRAT = 475 + SYS_GETATTRLISTAT = 476 + SYS_PROC_TRACE_LOG = 477 + SYS_BSDTHREAD_CTL = 478 + SYS_OPENBYID_NP = 479 + SYS_RECVMSG_X = 480 + SYS_SENDMSG_X = 481 + SYS_THREAD_SELFUSAGE = 482 + SYS_CSRCTL = 483 + SYS_GUARDED_OPEN_DPROTECTED_NP = 484 + SYS_GUARDED_WRITE_NP = 485 + SYS_GUARDED_PWRITE_NP = 486 + SYS_GUARDED_WRITEV_NP = 487 + SYS_RENAME_EXT = 488 + SYS_MREMAP_ENCRYPTED = 489 + SYS_MAXSYSCALL = 490 +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go new file mode 100644 index 0000000000000000000000000000000000000000..b8c9aea852f70f0c059afd49d7fc2c9ae4c5a3f9 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go @@ -0,0 +1,358 @@ +// mksysnum_darwin.pl /usr/include/sys/syscall.h +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build arm,darwin + +package unix + +const ( + SYS_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAIT4 = 7 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_CHDIR = 12 + SYS_FCHDIR = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_CHOWN = 16 + SYS_GETFSSTAT = 18 + SYS_GETPID = 20 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_GETEUID = 25 + SYS_PTRACE = 26 + SYS_RECVMSG = 27 + SYS_SENDMSG = 28 + SYS_RECVFROM = 29 + SYS_ACCEPT = 30 + SYS_GETPEERNAME = 31 + SYS_GETSOCKNAME = 32 + SYS_ACCESS = 33 + SYS_CHFLAGS = 34 + SYS_FCHFLAGS = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_GETPPID = 39 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_GETEGID = 43 + SYS_SIGACTION = 46 + SYS_GETGID = 47 + SYS_SIGPROCMASK = 48 + SYS_GETLOGIN = 49 + SYS_SETLOGIN = 50 + SYS_ACCT = 51 + SYS_SIGPENDING = 52 + SYS_SIGALTSTACK = 53 + SYS_IOCTL = 54 + SYS_REBOOT = 55 + SYS_REVOKE = 56 + SYS_SYMLINK = 57 + SYS_READLINK = 58 + SYS_EXECVE = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_MSYNC = 65 + SYS_VFORK = 66 + SYS_MUNMAP = 73 + SYS_MPROTECT = 74 + SYS_MADVISE = 75 + SYS_MINCORE = 78 + SYS_GETGROUPS = 79 + SYS_SETGROUPS = 80 + SYS_GETPGRP = 81 + SYS_SETPGID = 82 + SYS_SETITIMER = 83 + SYS_SWAPON = 85 + SYS_GETITIMER = 86 + SYS_GETDTABLESIZE = 89 + SYS_DUP2 = 90 + SYS_FCNTL = 92 + SYS_SELECT = 93 + SYS_FSYNC = 95 + SYS_SETPRIORITY = 96 + SYS_SOCKET = 97 + SYS_CONNECT = 98 + SYS_GETPRIORITY = 100 + SYS_BIND = 104 + SYS_SETSOCKOPT = 105 + SYS_LISTEN = 106 + SYS_SIGSUSPEND = 111 + SYS_GETTIMEOFDAY = 116 + SYS_GETRUSAGE = 117 + SYS_GETSOCKOPT = 118 + SYS_READV = 120 + SYS_WRITEV = 121 + SYS_SETTIMEOFDAY = 122 + SYS_FCHOWN = 123 + SYS_FCHMOD = 124 + SYS_SETREUID = 126 + SYS_SETREGID = 127 + SYS_RENAME = 128 + SYS_FLOCK = 131 + SYS_MKFIFO = 132 + SYS_SENDTO = 133 + SYS_SHUTDOWN = 134 + SYS_SOCKETPAIR = 135 + SYS_MKDIR = 136 + SYS_RMDIR = 137 + SYS_UTIMES = 138 + SYS_FUTIMES = 139 + SYS_ADJTIME = 140 + SYS_GETHOSTUUID = 142 + SYS_SETSID = 147 + SYS_GETPGID = 151 + SYS_SETPRIVEXEC = 152 + SYS_PREAD = 153 + SYS_PWRITE = 154 + SYS_NFSSVC = 155 + SYS_STATFS = 157 + SYS_FSTATFS = 158 + SYS_UNMOUNT = 159 + SYS_GETFH = 161 + SYS_QUOTACTL = 165 + SYS_MOUNT = 167 + SYS_CSOPS = 169 + SYS_CSOPS_AUDITTOKEN = 170 + SYS_WAITID = 173 + SYS_KDEBUG_TRACE = 180 + SYS_SETGID = 181 + SYS_SETEGID = 182 + SYS_SETEUID = 183 + SYS_SIGRETURN = 184 + SYS_CHUD = 185 + SYS_FDATASYNC = 187 + SYS_STAT = 188 + SYS_FSTAT = 189 + SYS_LSTAT = 190 + SYS_PATHCONF = 191 + SYS_FPATHCONF = 192 + SYS_GETRLIMIT = 194 + SYS_SETRLIMIT = 195 + SYS_GETDIRENTRIES = 196 + SYS_MMAP = 197 + SYS_LSEEK = 199 + SYS_TRUNCATE = 200 + SYS_FTRUNCATE = 201 + SYS___SYSCTL = 202 + SYS_MLOCK = 203 + SYS_MUNLOCK = 204 + SYS_UNDELETE = 205 + SYS_ATSOCKET = 206 + SYS_ATGETMSG = 207 + SYS_ATPUTMSG = 208 + SYS_ATPSNDREQ = 209 + SYS_ATPSNDRSP = 210 + SYS_ATPGETREQ = 211 + SYS_ATPGETRSP = 212 + SYS_OPEN_DPROTECTED_NP = 216 + SYS_GETATTRLIST = 220 + SYS_SETATTRLIST = 221 + SYS_GETDIRENTRIESATTR = 222 + SYS_EXCHANGEDATA = 223 + SYS_SEARCHFS = 225 + SYS_DELETE = 226 + SYS_COPYFILE = 227 + SYS_FGETATTRLIST = 228 + SYS_FSETATTRLIST = 229 + SYS_POLL = 230 + SYS_WATCHEVENT = 231 + SYS_WAITEVENT = 232 + SYS_MODWATCH = 233 + SYS_GETXATTR = 234 + SYS_FGETXATTR = 235 + SYS_SETXATTR = 236 + SYS_FSETXATTR = 237 + SYS_REMOVEXATTR = 238 + SYS_FREMOVEXATTR = 239 + SYS_LISTXATTR = 240 + SYS_FLISTXATTR = 241 + SYS_FSCTL = 242 + SYS_INITGROUPS = 243 + SYS_POSIX_SPAWN = 244 + SYS_FFSCTL = 245 + SYS_NFSCLNT = 247 + SYS_FHOPEN = 248 + SYS_MINHERIT = 250 + SYS_SEMSYS = 251 + SYS_MSGSYS = 252 + SYS_SHMSYS = 253 + SYS_SEMCTL = 254 + SYS_SEMGET = 255 + SYS_SEMOP = 256 + SYS_MSGCTL = 258 + SYS_MSGGET = 259 + SYS_MSGSND = 260 + SYS_MSGRCV = 261 + SYS_SHMAT = 262 + SYS_SHMCTL = 263 + SYS_SHMDT = 264 + SYS_SHMGET = 265 + SYS_SHM_OPEN = 266 + SYS_SHM_UNLINK = 267 + SYS_SEM_OPEN = 268 + SYS_SEM_CLOSE = 269 + SYS_SEM_UNLINK = 270 + SYS_SEM_WAIT = 271 + SYS_SEM_TRYWAIT = 272 + SYS_SEM_POST = 273 + SYS_SEM_GETVALUE = 274 + SYS_SEM_INIT = 275 + SYS_SEM_DESTROY = 276 + SYS_OPEN_EXTENDED = 277 + SYS_UMASK_EXTENDED = 278 + SYS_STAT_EXTENDED = 279 + SYS_LSTAT_EXTENDED = 280 + SYS_FSTAT_EXTENDED = 281 + SYS_CHMOD_EXTENDED = 282 + SYS_FCHMOD_EXTENDED = 283 + SYS_ACCESS_EXTENDED = 284 + SYS_SETTID = 285 + SYS_GETTID = 286 + SYS_SETSGROUPS = 287 + SYS_GETSGROUPS = 288 + SYS_SETWGROUPS = 289 + SYS_GETWGROUPS = 290 + SYS_MKFIFO_EXTENDED = 291 + SYS_MKDIR_EXTENDED = 292 + SYS_IDENTITYSVC = 293 + SYS_SHARED_REGION_CHECK_NP = 294 + SYS_VM_PRESSURE_MONITOR = 296 + SYS_PSYNCH_RW_LONGRDLOCK = 297 + SYS_PSYNCH_RW_YIELDWRLOCK = 298 + SYS_PSYNCH_RW_DOWNGRADE = 299 + SYS_PSYNCH_RW_UPGRADE = 300 + SYS_PSYNCH_MUTEXWAIT = 301 + SYS_PSYNCH_MUTEXDROP = 302 + SYS_PSYNCH_CVBROAD = 303 + SYS_PSYNCH_CVSIGNAL = 304 + SYS_PSYNCH_CVWAIT = 305 + SYS_PSYNCH_RW_RDLOCK = 306 + SYS_PSYNCH_RW_WRLOCK = 307 + SYS_PSYNCH_RW_UNLOCK = 308 + SYS_PSYNCH_RW_UNLOCK2 = 309 + SYS_GETSID = 310 + SYS_SETTID_WITH_PID = 311 + SYS_PSYNCH_CVCLRPREPOST = 312 + SYS_AIO_FSYNC = 313 + SYS_AIO_RETURN = 314 + SYS_AIO_SUSPEND = 315 + SYS_AIO_CANCEL = 316 + SYS_AIO_ERROR = 317 + SYS_AIO_READ = 318 + SYS_AIO_WRITE = 319 + SYS_LIO_LISTIO = 320 + SYS_IOPOLICYSYS = 322 + SYS_PROCESS_POLICY = 323 + SYS_MLOCKALL = 324 + SYS_MUNLOCKALL = 325 + SYS_ISSETUGID = 327 + SYS___PTHREAD_KILL = 328 + SYS___PTHREAD_SIGMASK = 329 + SYS___SIGWAIT = 330 + SYS___DISABLE_THREADSIGNAL = 331 + SYS___PTHREAD_MARKCANCEL = 332 + SYS___PTHREAD_CANCELED = 333 + SYS___SEMWAIT_SIGNAL = 334 + SYS_PROC_INFO = 336 + SYS_SENDFILE = 337 + SYS_STAT64 = 338 + SYS_FSTAT64 = 339 + SYS_LSTAT64 = 340 + SYS_STAT64_EXTENDED = 341 + SYS_LSTAT64_EXTENDED = 342 + SYS_FSTAT64_EXTENDED = 343 + SYS_GETDIRENTRIES64 = 344 + SYS_STATFS64 = 345 + SYS_FSTATFS64 = 346 + SYS_GETFSSTAT64 = 347 + SYS___PTHREAD_CHDIR = 348 + SYS___PTHREAD_FCHDIR = 349 + SYS_AUDIT = 350 + SYS_AUDITON = 351 + SYS_GETAUID = 353 + SYS_SETAUID = 354 + SYS_GETAUDIT_ADDR = 357 + SYS_SETAUDIT_ADDR = 358 + SYS_AUDITCTL = 359 + SYS_BSDTHREAD_CREATE = 360 + SYS_BSDTHREAD_TERMINATE = 361 + SYS_KQUEUE = 362 + SYS_KEVENT = 363 + SYS_LCHOWN = 364 + SYS_STACK_SNAPSHOT = 365 + SYS_BSDTHREAD_REGISTER = 366 + SYS_WORKQ_OPEN = 367 + SYS_WORKQ_KERNRETURN = 368 + SYS_KEVENT64 = 369 + SYS___OLD_SEMWAIT_SIGNAL = 370 + SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 + SYS_THREAD_SELFID = 372 + SYS_LEDGER = 373 + SYS___MAC_EXECVE = 380 + SYS___MAC_SYSCALL = 381 + SYS___MAC_GET_FILE = 382 + SYS___MAC_SET_FILE = 383 + SYS___MAC_GET_LINK = 384 + SYS___MAC_SET_LINK = 385 + SYS___MAC_GET_PROC = 386 + SYS___MAC_SET_PROC = 387 + SYS___MAC_GET_FD = 388 + SYS___MAC_SET_FD = 389 + SYS___MAC_GET_PID = 390 + SYS___MAC_GET_LCID = 391 + SYS___MAC_GET_LCTX = 392 + SYS___MAC_SET_LCTX = 393 + SYS_SETLCID = 394 + SYS_GETLCID = 395 + SYS_READ_NOCANCEL = 396 + SYS_WRITE_NOCANCEL = 397 + SYS_OPEN_NOCANCEL = 398 + SYS_CLOSE_NOCANCEL = 399 + SYS_WAIT4_NOCANCEL = 400 + SYS_RECVMSG_NOCANCEL = 401 + SYS_SENDMSG_NOCANCEL = 402 + SYS_RECVFROM_NOCANCEL = 403 + SYS_ACCEPT_NOCANCEL = 404 + SYS_MSYNC_NOCANCEL = 405 + SYS_FCNTL_NOCANCEL = 406 + SYS_SELECT_NOCANCEL = 407 + SYS_FSYNC_NOCANCEL = 408 + SYS_CONNECT_NOCANCEL = 409 + SYS_SIGSUSPEND_NOCANCEL = 410 + SYS_READV_NOCANCEL = 411 + SYS_WRITEV_NOCANCEL = 412 + SYS_SENDTO_NOCANCEL = 413 + SYS_PREAD_NOCANCEL = 414 + SYS_PWRITE_NOCANCEL = 415 + SYS_WAITID_NOCANCEL = 416 + SYS_POLL_NOCANCEL = 417 + SYS_MSGSND_NOCANCEL = 418 + SYS_MSGRCV_NOCANCEL = 419 + SYS_SEM_WAIT_NOCANCEL = 420 + SYS_AIO_SUSPEND_NOCANCEL = 421 + SYS___SIGWAIT_NOCANCEL = 422 + SYS___SEMWAIT_SIGNAL_NOCANCEL = 423 + SYS___MAC_MOUNT = 424 + SYS___MAC_GET_MOUNT = 425 + SYS___MAC_GETFSSTAT = 426 + SYS_FSGETPATH = 427 + SYS_AUDIT_SESSION_SELF = 428 + SYS_AUDIT_SESSION_JOIN = 429 + SYS_FILEPORT_MAKEPORT = 430 + SYS_FILEPORT_MAKEFD = 431 + SYS_AUDIT_SESSION_PORT = 432 + SYS_PID_SUSPEND = 433 + SYS_PID_RESUME = 434 + SYS_PID_HIBERNATE = 435 + SYS_PID_SHUTDOWN_SOCKETS = 436 + SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438 + SYS_KAS_INFO = 439 + SYS_MAXSYSCALL = 440 +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go new file mode 100644 index 0000000000000000000000000000000000000000..26677ebbf5b769ddd22e4f0cbcf35f5a2d4055c2 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go @@ -0,0 +1,398 @@ +// mksysnum_darwin.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.4.sdk/usr/include/sys/syscall.h +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build arm64,darwin + +package unix + +const ( + SYS_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAIT4 = 7 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_CHDIR = 12 + SYS_FCHDIR = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_CHOWN = 16 + SYS_GETFSSTAT = 18 + SYS_GETPID = 20 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_GETEUID = 25 + SYS_PTRACE = 26 + SYS_RECVMSG = 27 + SYS_SENDMSG = 28 + SYS_RECVFROM = 29 + SYS_ACCEPT = 30 + SYS_GETPEERNAME = 31 + SYS_GETSOCKNAME = 32 + SYS_ACCESS = 33 + SYS_CHFLAGS = 34 + SYS_FCHFLAGS = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_GETPPID = 39 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_GETEGID = 43 + SYS_SIGACTION = 46 + SYS_GETGID = 47 + SYS_SIGPROCMASK = 48 + SYS_GETLOGIN = 49 + SYS_SETLOGIN = 50 + SYS_ACCT = 51 + SYS_SIGPENDING = 52 + SYS_SIGALTSTACK = 53 + SYS_IOCTL = 54 + SYS_REBOOT = 55 + SYS_REVOKE = 56 + SYS_SYMLINK = 57 + SYS_READLINK = 58 + SYS_EXECVE = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_MSYNC = 65 + SYS_VFORK = 66 + SYS_MUNMAP = 73 + SYS_MPROTECT = 74 + SYS_MADVISE = 75 + SYS_MINCORE = 78 + SYS_GETGROUPS = 79 + SYS_SETGROUPS = 80 + SYS_GETPGRP = 81 + SYS_SETPGID = 82 + SYS_SETITIMER = 83 + SYS_SWAPON = 85 + SYS_GETITIMER = 86 + SYS_GETDTABLESIZE = 89 + SYS_DUP2 = 90 + SYS_FCNTL = 92 + SYS_SELECT = 93 + SYS_FSYNC = 95 + SYS_SETPRIORITY = 96 + SYS_SOCKET = 97 + SYS_CONNECT = 98 + SYS_GETPRIORITY = 100 + SYS_BIND = 104 + SYS_SETSOCKOPT = 105 + SYS_LISTEN = 106 + SYS_SIGSUSPEND = 111 + SYS_GETTIMEOFDAY = 116 + SYS_GETRUSAGE = 117 + SYS_GETSOCKOPT = 118 + SYS_READV = 120 + SYS_WRITEV = 121 + SYS_SETTIMEOFDAY = 122 + SYS_FCHOWN = 123 + SYS_FCHMOD = 124 + SYS_SETREUID = 126 + SYS_SETREGID = 127 + SYS_RENAME = 128 + SYS_FLOCK = 131 + SYS_MKFIFO = 132 + SYS_SENDTO = 133 + SYS_SHUTDOWN = 134 + SYS_SOCKETPAIR = 135 + SYS_MKDIR = 136 + SYS_RMDIR = 137 + SYS_UTIMES = 138 + SYS_FUTIMES = 139 + SYS_ADJTIME = 140 + SYS_GETHOSTUUID = 142 + SYS_SETSID = 147 + SYS_GETPGID = 151 + SYS_SETPRIVEXEC = 152 + SYS_PREAD = 153 + SYS_PWRITE = 154 + SYS_NFSSVC = 155 + SYS_STATFS = 157 + SYS_FSTATFS = 158 + SYS_UNMOUNT = 159 + SYS_GETFH = 161 + SYS_QUOTACTL = 165 + SYS_MOUNT = 167 + SYS_CSOPS = 169 + SYS_CSOPS_AUDITTOKEN = 170 + SYS_WAITID = 173 + SYS_KDEBUG_TRACE64 = 179 + SYS_KDEBUG_TRACE = 180 + SYS_SETGID = 181 + SYS_SETEGID = 182 + SYS_SETEUID = 183 + SYS_SIGRETURN = 184 + SYS_CHUD = 185 + SYS_FDATASYNC = 187 + SYS_STAT = 188 + SYS_FSTAT = 189 + SYS_LSTAT = 190 + SYS_PATHCONF = 191 + SYS_FPATHCONF = 192 + SYS_GETRLIMIT = 194 + SYS_SETRLIMIT = 195 + SYS_GETDIRENTRIES = 196 + SYS_MMAP = 197 + SYS_LSEEK = 199 + SYS_TRUNCATE = 200 + SYS_FTRUNCATE = 201 + SYS_SYSCTL = 202 + SYS_MLOCK = 203 + SYS_MUNLOCK = 204 + SYS_UNDELETE = 205 + SYS_OPEN_DPROTECTED_NP = 216 + SYS_GETATTRLIST = 220 + SYS_SETATTRLIST = 221 + SYS_GETDIRENTRIESATTR = 222 + SYS_EXCHANGEDATA = 223 + SYS_SEARCHFS = 225 + SYS_DELETE = 226 + SYS_COPYFILE = 227 + SYS_FGETATTRLIST = 228 + SYS_FSETATTRLIST = 229 + SYS_POLL = 230 + SYS_WATCHEVENT = 231 + SYS_WAITEVENT = 232 + SYS_MODWATCH = 233 + SYS_GETXATTR = 234 + SYS_FGETXATTR = 235 + SYS_SETXATTR = 236 + SYS_FSETXATTR = 237 + SYS_REMOVEXATTR = 238 + SYS_FREMOVEXATTR = 239 + SYS_LISTXATTR = 240 + SYS_FLISTXATTR = 241 + SYS_FSCTL = 242 + SYS_INITGROUPS = 243 + SYS_POSIX_SPAWN = 244 + SYS_FFSCTL = 245 + SYS_NFSCLNT = 247 + SYS_FHOPEN = 248 + SYS_MINHERIT = 250 + SYS_SEMSYS = 251 + SYS_MSGSYS = 252 + SYS_SHMSYS = 253 + SYS_SEMCTL = 254 + SYS_SEMGET = 255 + SYS_SEMOP = 256 + SYS_MSGCTL = 258 + SYS_MSGGET = 259 + SYS_MSGSND = 260 + SYS_MSGRCV = 261 + SYS_SHMAT = 262 + SYS_SHMCTL = 263 + SYS_SHMDT = 264 + SYS_SHMGET = 265 + SYS_SHM_OPEN = 266 + SYS_SHM_UNLINK = 267 + SYS_SEM_OPEN = 268 + SYS_SEM_CLOSE = 269 + SYS_SEM_UNLINK = 270 + SYS_SEM_WAIT = 271 + SYS_SEM_TRYWAIT = 272 + SYS_SEM_POST = 273 + SYS_SYSCTLBYNAME = 274 + SYS_OPEN_EXTENDED = 277 + SYS_UMASK_EXTENDED = 278 + SYS_STAT_EXTENDED = 279 + SYS_LSTAT_EXTENDED = 280 + SYS_FSTAT_EXTENDED = 281 + SYS_CHMOD_EXTENDED = 282 + SYS_FCHMOD_EXTENDED = 283 + SYS_ACCESS_EXTENDED = 284 + SYS_SETTID = 285 + SYS_GETTID = 286 + SYS_SETSGROUPS = 287 + SYS_GETSGROUPS = 288 + SYS_SETWGROUPS = 289 + SYS_GETWGROUPS = 290 + SYS_MKFIFO_EXTENDED = 291 + SYS_MKDIR_EXTENDED = 292 + SYS_IDENTITYSVC = 293 + SYS_SHARED_REGION_CHECK_NP = 294 + SYS_VM_PRESSURE_MONITOR = 296 + SYS_PSYNCH_RW_LONGRDLOCK = 297 + SYS_PSYNCH_RW_YIELDWRLOCK = 298 + SYS_PSYNCH_RW_DOWNGRADE = 299 + SYS_PSYNCH_RW_UPGRADE = 300 + SYS_PSYNCH_MUTEXWAIT = 301 + SYS_PSYNCH_MUTEXDROP = 302 + SYS_PSYNCH_CVBROAD = 303 + SYS_PSYNCH_CVSIGNAL = 304 + SYS_PSYNCH_CVWAIT = 305 + SYS_PSYNCH_RW_RDLOCK = 306 + SYS_PSYNCH_RW_WRLOCK = 307 + SYS_PSYNCH_RW_UNLOCK = 308 + SYS_PSYNCH_RW_UNLOCK2 = 309 + SYS_GETSID = 310 + SYS_SETTID_WITH_PID = 311 + SYS_PSYNCH_CVCLRPREPOST = 312 + SYS_AIO_FSYNC = 313 + SYS_AIO_RETURN = 314 + SYS_AIO_SUSPEND = 315 + SYS_AIO_CANCEL = 316 + SYS_AIO_ERROR = 317 + SYS_AIO_READ = 318 + SYS_AIO_WRITE = 319 + SYS_LIO_LISTIO = 320 + SYS_IOPOLICYSYS = 322 + SYS_PROCESS_POLICY = 323 + SYS_MLOCKALL = 324 + SYS_MUNLOCKALL = 325 + SYS_ISSETUGID = 327 + SYS___PTHREAD_KILL = 328 + SYS___PTHREAD_SIGMASK = 329 + SYS___SIGWAIT = 330 + SYS___DISABLE_THREADSIGNAL = 331 + SYS___PTHREAD_MARKCANCEL = 332 + SYS___PTHREAD_CANCELED = 333 + SYS___SEMWAIT_SIGNAL = 334 + SYS_PROC_INFO = 336 + SYS_SENDFILE = 337 + SYS_STAT64 = 338 + SYS_FSTAT64 = 339 + SYS_LSTAT64 = 340 + SYS_STAT64_EXTENDED = 341 + SYS_LSTAT64_EXTENDED = 342 + SYS_FSTAT64_EXTENDED = 343 + SYS_GETDIRENTRIES64 = 344 + SYS_STATFS64 = 345 + SYS_FSTATFS64 = 346 + SYS_GETFSSTAT64 = 347 + SYS___PTHREAD_CHDIR = 348 + SYS___PTHREAD_FCHDIR = 349 + SYS_AUDIT = 350 + SYS_AUDITON = 351 + SYS_GETAUID = 353 + SYS_SETAUID = 354 + SYS_GETAUDIT_ADDR = 357 + SYS_SETAUDIT_ADDR = 358 + SYS_AUDITCTL = 359 + SYS_BSDTHREAD_CREATE = 360 + SYS_BSDTHREAD_TERMINATE = 361 + SYS_KQUEUE = 362 + SYS_KEVENT = 363 + SYS_LCHOWN = 364 + SYS_STACK_SNAPSHOT = 365 + SYS_BSDTHREAD_REGISTER = 366 + SYS_WORKQ_OPEN = 367 + SYS_WORKQ_KERNRETURN = 368 + SYS_KEVENT64 = 369 + SYS___OLD_SEMWAIT_SIGNAL = 370 + SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL = 371 + SYS_THREAD_SELFID = 372 + SYS_LEDGER = 373 + SYS___MAC_EXECVE = 380 + SYS___MAC_SYSCALL = 381 + SYS___MAC_GET_FILE = 382 + SYS___MAC_SET_FILE = 383 + SYS___MAC_GET_LINK = 384 + SYS___MAC_SET_LINK = 385 + SYS___MAC_GET_PROC = 386 + SYS___MAC_SET_PROC = 387 + SYS___MAC_GET_FD = 388 + SYS___MAC_SET_FD = 389 + SYS___MAC_GET_PID = 390 + SYS___MAC_GET_LCID = 391 + SYS___MAC_GET_LCTX = 392 + SYS___MAC_SET_LCTX = 393 + SYS_SETLCID = 394 + SYS_GETLCID = 395 + SYS_READ_NOCANCEL = 396 + SYS_WRITE_NOCANCEL = 397 + SYS_OPEN_NOCANCEL = 398 + SYS_CLOSE_NOCANCEL = 399 + SYS_WAIT4_NOCANCEL = 400 + SYS_RECVMSG_NOCANCEL = 401 + SYS_SENDMSG_NOCANCEL = 402 + SYS_RECVFROM_NOCANCEL = 403 + SYS_ACCEPT_NOCANCEL = 404 + SYS_MSYNC_NOCANCEL = 405 + SYS_FCNTL_NOCANCEL = 406 + SYS_SELECT_NOCANCEL = 407 + SYS_FSYNC_NOCANCEL = 408 + SYS_CONNECT_NOCANCEL = 409 + SYS_SIGSUSPEND_NOCANCEL = 410 + SYS_READV_NOCANCEL = 411 + SYS_WRITEV_NOCANCEL = 412 + SYS_SENDTO_NOCANCEL = 413 + SYS_PREAD_NOCANCEL = 414 + SYS_PWRITE_NOCANCEL = 415 + SYS_WAITID_NOCANCEL = 416 + SYS_POLL_NOCANCEL = 417 + SYS_MSGSND_NOCANCEL = 418 + SYS_MSGRCV_NOCANCEL = 419 + SYS_SEM_WAIT_NOCANCEL = 420 + SYS_AIO_SUSPEND_NOCANCEL = 421 + SYS___SIGWAIT_NOCANCEL = 422 + SYS___SEMWAIT_SIGNAL_NOCANCEL = 423 + SYS___MAC_MOUNT = 424 + SYS___MAC_GET_MOUNT = 425 + SYS___MAC_GETFSSTAT = 426 + SYS_FSGETPATH = 427 + SYS_AUDIT_SESSION_SELF = 428 + SYS_AUDIT_SESSION_JOIN = 429 + SYS_FILEPORT_MAKEPORT = 430 + SYS_FILEPORT_MAKEFD = 431 + SYS_AUDIT_SESSION_PORT = 432 + SYS_PID_SUSPEND = 433 + SYS_PID_RESUME = 434 + SYS_PID_HIBERNATE = 435 + SYS_PID_SHUTDOWN_SOCKETS = 436 + SYS_SHARED_REGION_MAP_AND_SLIDE_NP = 438 + SYS_KAS_INFO = 439 + SYS_MEMORYSTATUS_CONTROL = 440 + SYS_GUARDED_OPEN_NP = 441 + SYS_GUARDED_CLOSE_NP = 442 + SYS_GUARDED_KQUEUE_NP = 443 + SYS_CHANGE_FDGUARD_NP = 444 + SYS_PROC_RLIMIT_CONTROL = 446 + SYS_CONNECTX = 447 + SYS_DISCONNECTX = 448 + SYS_PEELOFF = 449 + SYS_SOCKET_DELEGATE = 450 + SYS_TELEMETRY = 451 + SYS_PROC_UUID_POLICY = 452 + SYS_MEMORYSTATUS_GET_LEVEL = 453 + SYS_SYSTEM_OVERRIDE = 454 + SYS_VFS_PURGE = 455 + SYS_SFI_CTL = 456 + SYS_SFI_PIDCTL = 457 + SYS_COALITION = 458 + SYS_COALITION_INFO = 459 + SYS_NECP_MATCH_POLICY = 460 + SYS_GETATTRLISTBULK = 461 + SYS_OPENAT = 463 + SYS_OPENAT_NOCANCEL = 464 + SYS_RENAMEAT = 465 + SYS_FACCESSAT = 466 + SYS_FCHMODAT = 467 + SYS_FCHOWNAT = 468 + SYS_FSTATAT = 469 + SYS_FSTATAT64 = 470 + SYS_LINKAT = 471 + SYS_UNLINKAT = 472 + SYS_READLINKAT = 473 + SYS_SYMLINKAT = 474 + SYS_MKDIRAT = 475 + SYS_GETATTRLISTAT = 476 + SYS_PROC_TRACE_LOG = 477 + SYS_BSDTHREAD_CTL = 478 + SYS_OPENBYID_NP = 479 + SYS_RECVMSG_X = 480 + SYS_SENDMSG_X = 481 + SYS_THREAD_SELFUSAGE = 482 + SYS_CSRCTL = 483 + SYS_GUARDED_OPEN_DPROTECTED_NP = 484 + SYS_GUARDED_WRITE_NP = 485 + SYS_GUARDED_PWRITE_NP = 486 + SYS_GUARDED_WRITEV_NP = 487 + SYS_RENAME_EXT = 488 + SYS_MREMAP_ENCRYPTED = 489 + SYS_MAXSYSCALL = 490 +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..d6038fa9b082898ca962aae2ea4cfc66de155801 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go @@ -0,0 +1,304 @@ +// mksysnum_dragonfly.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build amd64,dragonfly + +package unix + +const ( + // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int + SYS_EXIT = 1 // { void exit(int rval); } + SYS_FORK = 2 // { int fork(void); } + SYS_READ = 3 // { ssize_t read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, size_t nbyte); } + SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } + SYS_CLOSE = 6 // { int close(int fd); } + SYS_WAIT4 = 7 // { int wait4(int pid, int *status, int options, \ + SYS_LINK = 9 // { int link(char *path, char *link); } + SYS_UNLINK = 10 // { int unlink(char *path); } + SYS_CHDIR = 12 // { int chdir(char *path); } + SYS_FCHDIR = 13 // { int fchdir(int fd); } + SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } + SYS_CHMOD = 15 // { int chmod(char *path, int mode); } + SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } + SYS_OBREAK = 17 // { int obreak(char *nsize); } break obreak_args int + SYS_GETFSSTAT = 18 // { int getfsstat(struct statfs *buf, long bufsize, \ + SYS_GETPID = 20 // { pid_t getpid(void); } + SYS_MOUNT = 21 // { int mount(char *type, char *path, int flags, \ + SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } + SYS_SETUID = 23 // { int setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t getuid(void); } + SYS_GETEUID = 25 // { uid_t geteuid(void); } + SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, caddr_t addr, \ + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, int flags); } + SYS_SENDMSG = 28 // { int sendmsg(int s, caddr_t msg, int flags); } + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, size_t len, \ + SYS_ACCEPT = 30 // { int accept(int s, caddr_t name, int *anamelen); } + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, caddr_t asa, int *alen); } + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, caddr_t asa, int *alen); } + SYS_ACCESS = 33 // { int access(char *path, int flags); } + SYS_CHFLAGS = 34 // { int chflags(char *path, int flags); } + SYS_FCHFLAGS = 35 // { int fchflags(int fd, int flags); } + SYS_SYNC = 36 // { int sync(void); } + SYS_KILL = 37 // { int kill(int pid, int signum); } + SYS_GETPPID = 39 // { pid_t getppid(void); } + SYS_DUP = 41 // { int dup(u_int fd); } + SYS_PIPE = 42 // { int pipe(void); } + SYS_GETEGID = 43 // { gid_t getegid(void); } + SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, int facs, \ + SYS_GETGID = 47 // { gid_t getgid(void); } + SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int namelen); } + SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } + SYS_ACCT = 51 // { int acct(char *path); } + SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, stack_t *oss); } + SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, caddr_t data); } + SYS_REBOOT = 55 // { int reboot(int opt); } + SYS_REVOKE = 56 // { int revoke(char *path); } + SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } + SYS_READLINK = 58 // { int readlink(char *path, char *buf, int count); } + SYS_EXECVE = 59 // { int execve(char *fname, char **argv, char **envv); } + SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args int + SYS_CHROOT = 61 // { int chroot(char *path); } + SYS_MSYNC = 65 // { int msync(void *addr, size_t len, int flags); } + SYS_VFORK = 66 // { pid_t vfork(void); } + SYS_SBRK = 69 // { int sbrk(int incr); } + SYS_SSTK = 70 // { int sstk(int incr); } + SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int mprotect(void *addr, size_t len, int prot); } + SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, int behav); } + SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, gid_t *gidset); } + SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, gid_t *gidset); } + SYS_GETPGRP = 81 // { int getpgrp(void); } + SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } + SYS_SETITIMER = 83 // { int setitimer(u_int which, struct itimerval *itv, \ + SYS_SWAPON = 85 // { int swapon(char *name); } + SYS_GETITIMER = 86 // { int getitimer(u_int which, struct itimerval *itv); } + SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } + SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } + SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ + SYS_FSYNC = 95 // { int fsync(int fd); } + SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, int prio); } + SYS_SOCKET = 97 // { int socket(int domain, int type, int protocol); } + SYS_CONNECT = 98 // { int connect(int s, caddr_t name, int namelen); } + SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } + SYS_BIND = 104 // { int bind(int s, caddr_t name, int namelen); } + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int listen(int s, int backlog); } + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ + SYS_GETRUSAGE = 117 // { int getrusage(int who, struct rusage *rusage); } + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, u_int iovcnt); } + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ + SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } + SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } + SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } + SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } + SYS_RENAME = 128 // { int rename(char *from, char *to); } + SYS_FLOCK = 131 // { int flock(int fd, int how); } + SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ + SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, int protocol, \ + SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } + SYS_RMDIR = 137 // { int rmdir(char *path); } + SYS_UTIMES = 138 // { int utimes(char *path, struct timeval *tptr); } + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ + SYS_SETSID = 147 // { int setsid(void); } + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ + SYS_STATFS = 157 // { int statfs(char *path, struct statfs *buf); } + SYS_FSTATFS = 158 // { int fstatfs(int fd, struct statfs *buf); } + SYS_GETFH = 161 // { int getfh(char *fname, struct fhandle *fhp); } + SYS_GETDOMAINNAME = 162 // { int getdomainname(char *domainname, int len); } + SYS_SETDOMAINNAME = 163 // { int setdomainname(char *domainname, int len); } + SYS_UNAME = 164 // { int uname(struct utsname *name); } + SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ + SYS_EXTPREAD = 173 // { ssize_t extpread(int fd, void *buf, \ + SYS_EXTPWRITE = 174 // { ssize_t extpwrite(int fd, const void *buf, \ + SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int setgid(gid_t gid); } + SYS_SETEGID = 182 // { int setegid(gid_t egid); } + SYS_SETEUID = 183 // { int seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } + SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ + SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ + SYS_MMAP = 197 // { caddr_t mmap(caddr_t addr, size_t len, int prot, \ + // SYS_NOSYS = 198; // { int nosys(void); } __syscall __syscall_args int + SYS_LSEEK = 199 // { off_t lseek(int fd, int pad, off_t offset, \ + SYS_TRUNCATE = 200 // { int truncate(char *path, int pad, off_t length); } + SYS_FTRUNCATE = 201 // { int ftruncate(int fd, int pad, off_t length); } + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, void *old, \ + SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int undelete(char *path); } + SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } + SYS_GETPGID = 207 // { int getpgid(pid_t pid); } + SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ + SYS___SEMCTL = 220 // { int __semctl(int semid, int semnum, int cmd, \ + SYS_SEMGET = 221 // { int semget(key_t key, int nsems, int semflg); } + SYS_SEMOP = 222 // { int semop(int semid, struct sembuf *sops, \ + SYS_MSGCTL = 224 // { int msgctl(int msqid, int cmd, \ + SYS_MSGGET = 225 // { int msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int msgsnd(int msqid, void *msgp, size_t msgsz, \ + SYS_MSGRCV = 227 // { int msgrcv(int msqid, void *msgp, size_t msgsz, \ + SYS_SHMAT = 228 // { caddr_t shmat(int shmid, const void *shmaddr, \ + SYS_SHMCTL = 229 // { int shmctl(int shmid, int cmd, \ + SYS_SHMDT = 230 // { int shmdt(const void *shmaddr); } + SYS_SHMGET = 231 // { int shmget(key_t key, size_t size, int shmflg); } + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 233 // { int clock_settime(clockid_t clock_id, \ + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ + SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, int inherit); } + SYS_RFORK = 251 // { int rfork(int flags); } + SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, u_int nfds, \ + SYS_ISSETUGID = 253 // { int issetugid(void); } + SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } + SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } + SYS_LUTIMES = 276 // { int lutimes(char *path, struct timeval *tptr); } + SYS_EXTPREADV = 289 // { ssize_t extpreadv(int fd, struct iovec *iovp, \ + SYS_EXTPWRITEV = 290 // { ssize_t extpwritev(int fd, struct iovec *iovp,\ + SYS_FHSTATFS = 297 // { int fhstatfs(const struct fhandle *u_fhp, struct statfs *buf); } + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, int flags); } + SYS_MODNEXT = 300 // { int modnext(int modid); } + SYS_MODSTAT = 301 // { int modstat(int modid, struct module_stat* stat); } + SYS_MODFNEXT = 302 // { int modfnext(int modid); } + SYS_MODFIND = 303 // { int modfind(const char *name); } + SYS_KLDLOAD = 304 // { int kldload(const char *file); } + SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } + SYS_KLDFIND = 306 // { int kldfind(const char *file); } + SYS_KLDNEXT = 307 // { int kldnext(int fileid); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct kld_file_stat* stat); } + SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } + SYS_GETSID = 310 // { int getsid(pid_t pid); } + SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, uid_t suid); } + SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); } + SYS_AIO_RETURN = 314 // { int aio_return(struct aiocb *aiocbp); } + SYS_AIO_SUSPEND = 315 // { int aio_suspend(struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); } + SYS_AIO_CANCEL = 316 // { int aio_cancel(int fd, struct aiocb *aiocbp); } + SYS_AIO_ERROR = 317 // { int aio_error(struct aiocb *aiocbp); } + SYS_AIO_READ = 318 // { int aio_read(struct aiocb *aiocbp); } + SYS_AIO_WRITE = 319 // { int aio_write(struct aiocb *aiocbp); } + SYS_LIO_LISTIO = 320 // { int lio_listio(int mode, struct aiocb * const *acb_list, int nent, struct sigevent *sig); } + SYS_YIELD = 321 // { int yield(void); } + SYS_MLOCKALL = 324 // { int mlockall(int how); } + SYS_MUNLOCKALL = 325 // { int munlockall(void); } + SYS___GETCWD = 326 // { int __getcwd(u_char *buf, u_int buflen); } + SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, const struct sched_param *param); } + SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct sched_param *param); } + SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int policy, const struct sched_param *param); } + SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } + SYS_SCHED_YIELD = 331 // { int sched_yield (void); } + SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } + SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } + SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, struct timespec *interval); } + SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } + SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, void *data); } + SYS_JAIL = 338 // { int jail(struct jail *jail); } + SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, const sigset_t *set, \ + SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } + SYS_SIGACTION = 342 // { int sigaction(int sig, const struct sigaction *act, \ + SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } + SYS_SIGRETURN = 344 // { int sigreturn(ucontext_t *sigcntxp); } + SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set,\ + SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set,\ + SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ + SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ + SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, acl_type_t type, \ + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, acl_type_t type, \ + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ + SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, acl_type_t type); } + SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, acl_type_t type, \ + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ + SYS_EXTATTR_SET_FILE = 356 // { int extattr_set_file(const char *path, \ + SYS_EXTATTR_GET_FILE = 357 // { int extattr_get_file(const char *path, \ + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ + SYS_AIO_WAITCOMPLETE = 359 // { int aio_waitcomplete(struct aiocb **aiocbp, struct timespec *timeout); } + SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); } + SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } + SYS_KQUEUE = 362 // { int kqueue(void); } + SYS_KEVENT = 363 // { int kevent(int fd, \ + SYS_SCTP_PEELOFF = 364 // { int sctp_peeloff(int sd, caddr_t name ); } + SYS_LCHFLAGS = 391 // { int lchflags(char *path, int flags); } + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, int count); } + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, size_t nbytes, \ + SYS_VARSYM_SET = 450 // { int varsym_set(int level, const char *name, const char *data); } + SYS_VARSYM_GET = 451 // { int varsym_get(int mask, const char *wild, char *buf, int bufsize); } + SYS_VARSYM_LIST = 452 // { int varsym_list(int level, char *buf, int maxsize, int *marker); } + SYS_EXEC_SYS_REGISTER = 465 // { int exec_sys_register(void *entry); } + SYS_EXEC_SYS_UNREGISTER = 466 // { int exec_sys_unregister(int id); } + SYS_SYS_CHECKPOINT = 467 // { int sys_checkpoint(int type, int fd, pid_t pid, int retval); } + SYS_MOUNTCTL = 468 // { int mountctl(const char *path, int op, int fd, const void *ctl, int ctllen, void *buf, int buflen); } + SYS_UMTX_SLEEP = 469 // { int umtx_sleep(volatile const int *ptr, int value, int timeout); } + SYS_UMTX_WAKEUP = 470 // { int umtx_wakeup(volatile const int *ptr, int count); } + SYS_JAIL_ATTACH = 471 // { int jail_attach(int jid); } + SYS_SET_TLS_AREA = 472 // { int set_tls_area(int which, struct tls_info *info, size_t infosize); } + SYS_GET_TLS_AREA = 473 // { int get_tls_area(int which, struct tls_info *info, size_t infosize); } + SYS_CLOSEFROM = 474 // { int closefrom(int fd); } + SYS_STAT = 475 // { int stat(const char *path, struct stat *ub); } + SYS_FSTAT = 476 // { int fstat(int fd, struct stat *sb); } + SYS_LSTAT = 477 // { int lstat(const char *path, struct stat *ub); } + SYS_FHSTAT = 478 // { int fhstat(const struct fhandle *u_fhp, struct stat *sb); } + SYS_GETDIRENTRIES = 479 // { int getdirentries(int fd, char *buf, u_int count, \ + SYS_GETDENTS = 480 // { int getdents(int fd, char *buf, size_t count); } + SYS_USCHED_SET = 481 // { int usched_set(pid_t pid, int cmd, void *data, \ + SYS_EXTACCEPT = 482 // { int extaccept(int s, int flags, caddr_t name, int *anamelen); } + SYS_EXTCONNECT = 483 // { int extconnect(int s, int flags, caddr_t name, int namelen); } + SYS_MCONTROL = 485 // { int mcontrol(void *addr, size_t len, int behav, off_t value); } + SYS_VMSPACE_CREATE = 486 // { int vmspace_create(void *id, int type, void *data); } + SYS_VMSPACE_DESTROY = 487 // { int vmspace_destroy(void *id); } + SYS_VMSPACE_CTL = 488 // { int vmspace_ctl(void *id, int cmd, \ + SYS_VMSPACE_MMAP = 489 // { int vmspace_mmap(void *id, void *addr, size_t len, \ + SYS_VMSPACE_MUNMAP = 490 // { int vmspace_munmap(void *id, void *addr, \ + SYS_VMSPACE_MCONTROL = 491 // { int vmspace_mcontrol(void *id, void *addr, \ + SYS_VMSPACE_PREAD = 492 // { ssize_t vmspace_pread(void *id, void *buf, \ + SYS_VMSPACE_PWRITE = 493 // { ssize_t vmspace_pwrite(void *id, const void *buf, \ + SYS_EXTEXIT = 494 // { void extexit(int how, int status, void *addr); } + SYS_LWP_CREATE = 495 // { int lwp_create(struct lwp_params *params); } + SYS_LWP_GETTID = 496 // { lwpid_t lwp_gettid(void); } + SYS_LWP_KILL = 497 // { int lwp_kill(pid_t pid, lwpid_t tid, int signum); } + SYS_LWP_RTPRIO = 498 // { int lwp_rtprio(int function, pid_t pid, lwpid_t tid, struct rtprio *rtp); } + SYS_PSELECT = 499 // { int pselect(int nd, fd_set *in, fd_set *ou, \ + SYS_STATVFS = 500 // { int statvfs(const char *path, struct statvfs *buf); } + SYS_FSTATVFS = 501 // { int fstatvfs(int fd, struct statvfs *buf); } + SYS_FHSTATVFS = 502 // { int fhstatvfs(const struct fhandle *u_fhp, struct statvfs *buf); } + SYS_GETVFSSTAT = 503 // { int getvfsstat(struct statfs *buf, \ + SYS_OPENAT = 504 // { int openat(int fd, char *path, int flags, int mode); } + SYS_FSTATAT = 505 // { int fstatat(int fd, char *path, \ + SYS_FCHMODAT = 506 // { int fchmodat(int fd, char *path, int mode, \ + SYS_FCHOWNAT = 507 // { int fchownat(int fd, char *path, int uid, int gid, \ + SYS_UNLINKAT = 508 // { int unlinkat(int fd, char *path, int flags); } + SYS_FACCESSAT = 509 // { int faccessat(int fd, char *path, int amode, \ + SYS_MQ_OPEN = 510 // { mqd_t mq_open(const char * name, int oflag, \ + SYS_MQ_CLOSE = 511 // { int mq_close(mqd_t mqdes); } + SYS_MQ_UNLINK = 512 // { int mq_unlink(const char *name); } + SYS_MQ_GETATTR = 513 // { int mq_getattr(mqd_t mqdes, \ + SYS_MQ_SETATTR = 514 // { int mq_setattr(mqd_t mqdes, \ + SYS_MQ_NOTIFY = 515 // { int mq_notify(mqd_t mqdes, \ + SYS_MQ_SEND = 516 // { int mq_send(mqd_t mqdes, const char *msg_ptr, \ + SYS_MQ_RECEIVE = 517 // { ssize_t mq_receive(mqd_t mqdes, char *msg_ptr, \ + SYS_MQ_TIMEDSEND = 518 // { int mq_timedsend(mqd_t mqdes, \ + SYS_MQ_TIMEDRECEIVE = 519 // { ssize_t mq_timedreceive(mqd_t mqdes, \ + SYS_IOPRIO_SET = 520 // { int ioprio_set(int which, int who, int prio); } + SYS_IOPRIO_GET = 521 // { int ioprio_get(int which, int who); } + SYS_CHROOT_KERNEL = 522 // { int chroot_kernel(char *path); } + SYS_RENAMEAT = 523 // { int renameat(int oldfd, char *old, int newfd, \ + SYS_MKDIRAT = 524 // { int mkdirat(int fd, char *path, mode_t mode); } + SYS_MKFIFOAT = 525 // { int mkfifoat(int fd, char *path, mode_t mode); } + SYS_MKNODAT = 526 // { int mknodat(int fd, char *path, mode_t mode, \ + SYS_READLINKAT = 527 // { int readlinkat(int fd, char *path, char *buf, \ + SYS_SYMLINKAT = 528 // { int symlinkat(char *path1, int fd, char *path2); } + SYS_SWAPOFF = 529 // { int swapoff(char *name); } + SYS_VQUOTACTL = 530 // { int vquotactl(const char *path, \ + SYS_LINKAT = 531 // { int linkat(int fd1, char *path1, int fd2, \ + SYS_EACCESS = 532 // { int eaccess(char *path, int flags); } + SYS_LPATHCONF = 533 // { int lpathconf(char *path, int name); } + SYS_VMM_GUEST_CTL = 534 // { int vmm_guest_ctl(int op, struct vmm_guest_options *options); } + SYS_VMM_GUEST_SYNC_ADDR = 535 // { int vmm_guest_sync_addr(long *dstaddr, long *srcaddr); } +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go new file mode 100644 index 0000000000000000000000000000000000000000..262a84536a70e37fa6bfed172cd20d5382c9de6c --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go @@ -0,0 +1,351 @@ +// mksysnum_freebsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build 386,freebsd + +package unix + +const ( + // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int + SYS_EXIT = 1 // { void sys_exit(int rval); } exit \ + SYS_FORK = 2 // { int fork(void); } + SYS_READ = 3 // { ssize_t read(int fd, void *buf, \ + SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } + SYS_CLOSE = 6 // { int close(int fd); } + SYS_WAIT4 = 7 // { int wait4(int pid, int *status, \ + SYS_LINK = 9 // { int link(char *path, char *link); } + SYS_UNLINK = 10 // { int unlink(char *path); } + SYS_CHDIR = 12 // { int chdir(char *path); } + SYS_FCHDIR = 13 // { int fchdir(int fd); } + SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } + SYS_CHMOD = 15 // { int chmod(char *path, int mode); } + SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } + SYS_OBREAK = 17 // { int obreak(char *nsize); } break \ + SYS_GETPID = 20 // { pid_t getpid(void); } + SYS_MOUNT = 21 // { int mount(char *type, char *path, \ + SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } + SYS_SETUID = 23 // { int setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t getuid(void); } + SYS_GETEUID = 25 // { uid_t geteuid(void); } + SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, \ + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, \ + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, \ + SYS_ACCEPT = 30 // { int accept(int s, \ + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, \ + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, \ + SYS_ACCESS = 33 // { int access(char *path, int amode); } + SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { int sync(void); } + SYS_KILL = 37 // { int kill(int pid, int signum); } + SYS_GETPPID = 39 // { pid_t getppid(void); } + SYS_DUP = 41 // { int dup(u_int fd); } + SYS_PIPE = 42 // { int pipe(void); } + SYS_GETEGID = 43 // { gid_t getegid(void); } + SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, \ + SYS_GETGID = 47 // { gid_t getgid(void); } + SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int \ + SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } + SYS_ACCT = 51 // { int acct(char *path); } + SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, \ + SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, \ + SYS_REBOOT = 55 // { int reboot(int opt); } + SYS_REVOKE = 56 // { int revoke(char *path); } + SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } + SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, \ + SYS_EXECVE = 59 // { int execve(char *fname, char **argv, \ + SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args \ + SYS_CHROOT = 61 // { int chroot(char *path); } + SYS_MSYNC = 65 // { int msync(void *addr, size_t len, \ + SYS_VFORK = 66 // { int vfork(void); } + SYS_SBRK = 69 // { int sbrk(int incr); } + SYS_SSTK = 70 // { int sstk(int incr); } + SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise \ + SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, \ + SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, \ + SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, \ + SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, \ + SYS_GETPGRP = 81 // { int getpgrp(void); } + SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } + SYS_SETITIMER = 83 // { int setitimer(u_int which, struct \ + SYS_SWAPON = 85 // { int swapon(char *name); } + SYS_GETITIMER = 86 // { int getitimer(u_int which, \ + SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } + SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } + SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ + SYS_FSYNC = 95 // { int fsync(int fd); } + SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, \ + SYS_SOCKET = 97 // { int socket(int domain, int type, \ + SYS_CONNECT = 98 // { int connect(int s, caddr_t name, \ + SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } + SYS_BIND = 104 // { int bind(int s, caddr_t name, \ + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int listen(int s, int backlog); } + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ + SYS_GETRUSAGE = 117 // { int getrusage(int who, \ + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, \ + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ + SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } + SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } + SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } + SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } + SYS_RENAME = 128 // { int rename(char *from, char *to); } + SYS_FLOCK = 131 // { int flock(int fd, int how); } + SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ + SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } + SYS_RMDIR = 137 // { int rmdir(char *path); } + SYS_UTIMES = 138 // { int utimes(char *path, \ + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ + SYS_SETSID = 147 // { int setsid(void); } + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ + SYS_LGETFH = 160 // { int lgetfh(char *fname, \ + SYS_GETFH = 161 // { int getfh(char *fname, \ + SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ + SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \ + SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, \ + SYS_SETFIB = 175 // { int setfib(int fibnum); } + SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int setgid(gid_t gid); } + SYS_SETEGID = 182 // { int setegid(gid_t egid); } + SYS_SETEUID = 183 // { int seteuid(uid_t euid); } + SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } + SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } + SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } + SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } + SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ + SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ + SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, \ + SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \ + SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, \ + SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, \ + SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, \ + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int undelete(char *path); } + SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } + SYS_GETPGID = 207 // { int getpgid(pid_t pid); } + SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 233 // { int clock_settime( \ + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ + SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, \ + SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } + SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, \ + SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct \ + SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ + SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( \ + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( \ + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,\ + SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } + SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, \ + SYS_RFORK = 251 // { int rfork(int flags); } + SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int issetugid(void); } + SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } + SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, \ + SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } + SYS_LUTIMES = 276 // { int lutimes(char *path, \ + SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } + SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } + SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } + SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \ + SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \ + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, \ + SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, \ + SYS_MODNEXT = 300 // { int modnext(int modid); } + SYS_MODSTAT = 301 // { int modstat(int modid, \ + SYS_MODFNEXT = 302 // { int modfnext(int modid); } + SYS_MODFIND = 303 // { int modfind(const char *name); } + SYS_KLDLOAD = 304 // { int kldload(const char *file); } + SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } + SYS_KLDFIND = 306 // { int kldfind(const char *file); } + SYS_KLDNEXT = 307 // { int kldnext(int fileid); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct \ + SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } + SYS_GETSID = 310 // { int getsid(pid_t pid); } + SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, \ + SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, \ + SYS_YIELD = 321 // { int yield(void); } + SYS_MLOCKALL = 324 // { int mlockall(int how); } + SYS_MUNLOCKALL = 325 // { int munlockall(void); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } + SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, \ + SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct \ + SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int \ + SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } + SYS_SCHED_YIELD = 331 // { int sched_yield (void); } + SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } + SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } + SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, \ + SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } + SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, \ + SYS_JAIL = 338 // { int jail(struct jail *jail); } + SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, \ + SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } + SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } + SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, \ + SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, \ + SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ + SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ + SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, \ + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, \ + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ + SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, \ + SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, \ + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( \ + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( \ + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ + SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \ + SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \ + SYS_KQUEUE = 362 // { int kqueue(void); } + SYS_KEVENT = 363 // { int kevent(int fd, \ + SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, \ + SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, \ + SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, \ + SYS___SETUGID = 374 // { int __setugid(int flag); } + SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } + SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, \ + SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } + SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } + SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, \ + SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, \ + SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, \ + SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, \ + SYS_KENV = 390 // { int kenv(int what, const char *name, \ + SYS_LCHFLAGS = 391 // { int lchflags(const char *path, \ + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, \ + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, \ + SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, \ + SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, \ + SYS_STATFS = 396 // { int statfs(char *path, \ + SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, \ + SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, \ + SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, \ + SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, \ + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( \ + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( \ + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( \ + SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, \ + SYS_SIGACTION = 416 // { int sigaction(int sig, \ + SYS_SIGRETURN = 417 // { int sigreturn( \ + SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext( \ + SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, \ + SYS_SWAPOFF = 424 // { int swapoff(const char *name); } + SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, \ + SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, \ + SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, \ + SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, \ + SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, \ + SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, \ + SYS_THR_EXIT = 431 // { void thr_exit(long *state); } + SYS_THR_SELF = 432 // { int thr_self(long *id); } + SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } + SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } + SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } + SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } + SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, \ + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( \ + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( \ + SYS_THR_SUSPEND = 442 // { int thr_suspend( \ + SYS_THR_WAKE = 443 // { int thr_wake(long id); } + SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } + SYS_AUDIT = 445 // { int audit(const void *record, \ + SYS_AUDITON = 446 // { int auditon(int cmd, void *data, \ + SYS_GETAUID = 447 // { int getauid(uid_t *auid); } + SYS_SETAUID = 448 // { int setauid(uid_t *auid); } + SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } + SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( \ + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( \ + SYS_AUDITCTL = 453 // { int auditctl(char *path); } + SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, \ + SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, \ + SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } + SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } + SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } + SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, \ + SYS_SCTP_PEELOFF = 471 // { int sctp_peeloff(int sd, uint32_t name); } + SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, \ + SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, \ + SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, \ + SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, \ + SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, \ + SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, \ + SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, \ + SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } + SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } + SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } + SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, \ + SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } + SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } + SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \ + SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, \ + SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, \ + SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, \ + SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, \ + SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, \ + SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, \ + SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, \ + SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, \ + SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, \ + SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, \ + SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } + SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } + SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, \ + SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, \ + SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, \ + SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, \ + SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, \ + SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } + SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } + SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, \ + SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, \ + SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } + SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } + SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } + SYS_CAP_NEW = 514 // { int cap_new(int fd, uint64_t rights); } + SYS_CAP_GETRIGHTS = 515 // { int cap_getrights(int fd, \ + SYS_CAP_ENTER = 516 // { int cap_enter(void); } + SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } + SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } + SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } + SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } + SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, \ + SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, \ + SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } + SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, \ + SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, \ + SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, \ + SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, \ + SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, \ + SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, \ + SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, \ + SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, \ + SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, \ + SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, \ + SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, \ + SYS_ACCEPT4 = 541 // { int accept4(int s, \ + SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } + SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, \ + SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \ +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..57a60ea126d62271e6229b66d237314a64b204e2 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go @@ -0,0 +1,351 @@ +// mksysnum_freebsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build amd64,freebsd + +package unix + +const ( + // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int + SYS_EXIT = 1 // { void sys_exit(int rval); } exit \ + SYS_FORK = 2 // { int fork(void); } + SYS_READ = 3 // { ssize_t read(int fd, void *buf, \ + SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } + SYS_CLOSE = 6 // { int close(int fd); } + SYS_WAIT4 = 7 // { int wait4(int pid, int *status, \ + SYS_LINK = 9 // { int link(char *path, char *link); } + SYS_UNLINK = 10 // { int unlink(char *path); } + SYS_CHDIR = 12 // { int chdir(char *path); } + SYS_FCHDIR = 13 // { int fchdir(int fd); } + SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } + SYS_CHMOD = 15 // { int chmod(char *path, int mode); } + SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } + SYS_OBREAK = 17 // { int obreak(char *nsize); } break \ + SYS_GETPID = 20 // { pid_t getpid(void); } + SYS_MOUNT = 21 // { int mount(char *type, char *path, \ + SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } + SYS_SETUID = 23 // { int setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t getuid(void); } + SYS_GETEUID = 25 // { uid_t geteuid(void); } + SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, \ + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, \ + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, \ + SYS_ACCEPT = 30 // { int accept(int s, \ + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, \ + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, \ + SYS_ACCESS = 33 // { int access(char *path, int amode); } + SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { int sync(void); } + SYS_KILL = 37 // { int kill(int pid, int signum); } + SYS_GETPPID = 39 // { pid_t getppid(void); } + SYS_DUP = 41 // { int dup(u_int fd); } + SYS_PIPE = 42 // { int pipe(void); } + SYS_GETEGID = 43 // { gid_t getegid(void); } + SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, \ + SYS_GETGID = 47 // { gid_t getgid(void); } + SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int \ + SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } + SYS_ACCT = 51 // { int acct(char *path); } + SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, \ + SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, \ + SYS_REBOOT = 55 // { int reboot(int opt); } + SYS_REVOKE = 56 // { int revoke(char *path); } + SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } + SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, \ + SYS_EXECVE = 59 // { int execve(char *fname, char **argv, \ + SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args \ + SYS_CHROOT = 61 // { int chroot(char *path); } + SYS_MSYNC = 65 // { int msync(void *addr, size_t len, \ + SYS_VFORK = 66 // { int vfork(void); } + SYS_SBRK = 69 // { int sbrk(int incr); } + SYS_SSTK = 70 // { int sstk(int incr); } + SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise \ + SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, \ + SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, \ + SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, \ + SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, \ + SYS_GETPGRP = 81 // { int getpgrp(void); } + SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } + SYS_SETITIMER = 83 // { int setitimer(u_int which, struct \ + SYS_SWAPON = 85 // { int swapon(char *name); } + SYS_GETITIMER = 86 // { int getitimer(u_int which, \ + SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } + SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } + SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ + SYS_FSYNC = 95 // { int fsync(int fd); } + SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, \ + SYS_SOCKET = 97 // { int socket(int domain, int type, \ + SYS_CONNECT = 98 // { int connect(int s, caddr_t name, \ + SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } + SYS_BIND = 104 // { int bind(int s, caddr_t name, \ + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int listen(int s, int backlog); } + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ + SYS_GETRUSAGE = 117 // { int getrusage(int who, \ + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, \ + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ + SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } + SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } + SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } + SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } + SYS_RENAME = 128 // { int rename(char *from, char *to); } + SYS_FLOCK = 131 // { int flock(int fd, int how); } + SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ + SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } + SYS_RMDIR = 137 // { int rmdir(char *path); } + SYS_UTIMES = 138 // { int utimes(char *path, \ + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ + SYS_SETSID = 147 // { int setsid(void); } + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ + SYS_LGETFH = 160 // { int lgetfh(char *fname, \ + SYS_GETFH = 161 // { int getfh(char *fname, \ + SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ + SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \ + SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, \ + SYS_SETFIB = 175 // { int setfib(int fibnum); } + SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int setgid(gid_t gid); } + SYS_SETEGID = 182 // { int setegid(gid_t egid); } + SYS_SETEUID = 183 // { int seteuid(uid_t euid); } + SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } + SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } + SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } + SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } + SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ + SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ + SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, \ + SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \ + SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, \ + SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, \ + SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, \ + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int undelete(char *path); } + SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } + SYS_GETPGID = 207 // { int getpgid(pid_t pid); } + SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 233 // { int clock_settime( \ + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ + SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, \ + SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } + SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, \ + SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct \ + SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ + SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( \ + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( \ + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,\ + SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } + SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, \ + SYS_RFORK = 251 // { int rfork(int flags); } + SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int issetugid(void); } + SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } + SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, \ + SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } + SYS_LUTIMES = 276 // { int lutimes(char *path, \ + SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } + SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } + SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } + SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \ + SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \ + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, \ + SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, \ + SYS_MODNEXT = 300 // { int modnext(int modid); } + SYS_MODSTAT = 301 // { int modstat(int modid, \ + SYS_MODFNEXT = 302 // { int modfnext(int modid); } + SYS_MODFIND = 303 // { int modfind(const char *name); } + SYS_KLDLOAD = 304 // { int kldload(const char *file); } + SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } + SYS_KLDFIND = 306 // { int kldfind(const char *file); } + SYS_KLDNEXT = 307 // { int kldnext(int fileid); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct \ + SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } + SYS_GETSID = 310 // { int getsid(pid_t pid); } + SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, \ + SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, \ + SYS_YIELD = 321 // { int yield(void); } + SYS_MLOCKALL = 324 // { int mlockall(int how); } + SYS_MUNLOCKALL = 325 // { int munlockall(void); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } + SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, \ + SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct \ + SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int \ + SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } + SYS_SCHED_YIELD = 331 // { int sched_yield (void); } + SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } + SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } + SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, \ + SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } + SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, \ + SYS_JAIL = 338 // { int jail(struct jail *jail); } + SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, \ + SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } + SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } + SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, \ + SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, \ + SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ + SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ + SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, \ + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, \ + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ + SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, \ + SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, \ + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( \ + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( \ + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ + SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \ + SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \ + SYS_KQUEUE = 362 // { int kqueue(void); } + SYS_KEVENT = 363 // { int kevent(int fd, \ + SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, \ + SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, \ + SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, \ + SYS___SETUGID = 374 // { int __setugid(int flag); } + SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } + SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, \ + SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } + SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } + SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, \ + SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, \ + SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, \ + SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, \ + SYS_KENV = 390 // { int kenv(int what, const char *name, \ + SYS_LCHFLAGS = 391 // { int lchflags(const char *path, \ + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, \ + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, \ + SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, \ + SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, \ + SYS_STATFS = 396 // { int statfs(char *path, \ + SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, \ + SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, \ + SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, \ + SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, \ + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( \ + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( \ + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( \ + SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, \ + SYS_SIGACTION = 416 // { int sigaction(int sig, \ + SYS_SIGRETURN = 417 // { int sigreturn( \ + SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext( \ + SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, \ + SYS_SWAPOFF = 424 // { int swapoff(const char *name); } + SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, \ + SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, \ + SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, \ + SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, \ + SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, \ + SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, \ + SYS_THR_EXIT = 431 // { void thr_exit(long *state); } + SYS_THR_SELF = 432 // { int thr_self(long *id); } + SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } + SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } + SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } + SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } + SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, \ + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( \ + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( \ + SYS_THR_SUSPEND = 442 // { int thr_suspend( \ + SYS_THR_WAKE = 443 // { int thr_wake(long id); } + SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } + SYS_AUDIT = 445 // { int audit(const void *record, \ + SYS_AUDITON = 446 // { int auditon(int cmd, void *data, \ + SYS_GETAUID = 447 // { int getauid(uid_t *auid); } + SYS_SETAUID = 448 // { int setauid(uid_t *auid); } + SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } + SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( \ + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( \ + SYS_AUDITCTL = 453 // { int auditctl(char *path); } + SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, \ + SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, \ + SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } + SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } + SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } + SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, \ + SYS_SCTP_PEELOFF = 471 // { int sctp_peeloff(int sd, uint32_t name); } + SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, \ + SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, \ + SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, \ + SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, \ + SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, \ + SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, \ + SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, \ + SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } + SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } + SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } + SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, \ + SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } + SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } + SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \ + SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, \ + SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, \ + SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, \ + SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, \ + SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, \ + SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, \ + SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, \ + SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, \ + SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, \ + SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, \ + SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } + SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } + SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, \ + SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, \ + SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, \ + SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, \ + SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, \ + SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } + SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } + SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, \ + SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, \ + SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } + SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } + SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } + SYS_CAP_NEW = 514 // { int cap_new(int fd, uint64_t rights); } + SYS_CAP_GETRIGHTS = 515 // { int cap_getrights(int fd, \ + SYS_CAP_ENTER = 516 // { int cap_enter(void); } + SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } + SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } + SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } + SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } + SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, \ + SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, \ + SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } + SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, \ + SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, \ + SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, \ + SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, \ + SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, \ + SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, \ + SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, \ + SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, \ + SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, \ + SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, \ + SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, \ + SYS_ACCEPT4 = 541 // { int accept4(int s, \ + SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } + SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, \ + SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \ +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go new file mode 100644 index 0000000000000000000000000000000000000000..206b9f612d4aa6eb7042a25ab1dc23c8180d2f23 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go @@ -0,0 +1,351 @@ +// mksysnum_freebsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build arm,freebsd + +package unix + +const ( + // SYS_NOSYS = 0; // { int nosys(void); } syscall nosys_args int + SYS_EXIT = 1 // { void sys_exit(int rval); } exit \ + SYS_FORK = 2 // { int fork(void); } + SYS_READ = 3 // { ssize_t read(int fd, void *buf, \ + SYS_WRITE = 4 // { ssize_t write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int open(char *path, int flags, int mode); } + SYS_CLOSE = 6 // { int close(int fd); } + SYS_WAIT4 = 7 // { int wait4(int pid, int *status, \ + SYS_LINK = 9 // { int link(char *path, char *link); } + SYS_UNLINK = 10 // { int unlink(char *path); } + SYS_CHDIR = 12 // { int chdir(char *path); } + SYS_FCHDIR = 13 // { int fchdir(int fd); } + SYS_MKNOD = 14 // { int mknod(char *path, int mode, int dev); } + SYS_CHMOD = 15 // { int chmod(char *path, int mode); } + SYS_CHOWN = 16 // { int chown(char *path, int uid, int gid); } + SYS_OBREAK = 17 // { int obreak(char *nsize); } break \ + SYS_GETPID = 20 // { pid_t getpid(void); } + SYS_MOUNT = 21 // { int mount(char *type, char *path, \ + SYS_UNMOUNT = 22 // { int unmount(char *path, int flags); } + SYS_SETUID = 23 // { int setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t getuid(void); } + SYS_GETEUID = 25 // { uid_t geteuid(void); } + SYS_PTRACE = 26 // { int ptrace(int req, pid_t pid, \ + SYS_RECVMSG = 27 // { int recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { int sendmsg(int s, struct msghdr *msg, \ + SYS_RECVFROM = 29 // { int recvfrom(int s, caddr_t buf, \ + SYS_ACCEPT = 30 // { int accept(int s, \ + SYS_GETPEERNAME = 31 // { int getpeername(int fdes, \ + SYS_GETSOCKNAME = 32 // { int getsockname(int fdes, \ + SYS_ACCESS = 33 // { int access(char *path, int amode); } + SYS_CHFLAGS = 34 // { int chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { int sync(void); } + SYS_KILL = 37 // { int kill(int pid, int signum); } + SYS_GETPPID = 39 // { pid_t getppid(void); } + SYS_DUP = 41 // { int dup(u_int fd); } + SYS_PIPE = 42 // { int pipe(void); } + SYS_GETEGID = 43 // { gid_t getegid(void); } + SYS_PROFIL = 44 // { int profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int ktrace(const char *fname, int ops, \ + SYS_GETGID = 47 // { gid_t getgid(void); } + SYS_GETLOGIN = 49 // { int getlogin(char *namebuf, u_int \ + SYS_SETLOGIN = 50 // { int setlogin(char *namebuf); } + SYS_ACCT = 51 // { int acct(char *path); } + SYS_SIGALTSTACK = 53 // { int sigaltstack(stack_t *ss, \ + SYS_IOCTL = 54 // { int ioctl(int fd, u_long com, \ + SYS_REBOOT = 55 // { int reboot(int opt); } + SYS_REVOKE = 56 // { int revoke(char *path); } + SYS_SYMLINK = 57 // { int symlink(char *path, char *link); } + SYS_READLINK = 58 // { ssize_t readlink(char *path, char *buf, \ + SYS_EXECVE = 59 // { int execve(char *fname, char **argv, \ + SYS_UMASK = 60 // { int umask(int newmask); } umask umask_args \ + SYS_CHROOT = 61 // { int chroot(char *path); } + SYS_MSYNC = 65 // { int msync(void *addr, size_t len, \ + SYS_VFORK = 66 // { int vfork(void); } + SYS_SBRK = 69 // { int sbrk(int incr); } + SYS_SSTK = 70 // { int sstk(int incr); } + SYS_OVADVISE = 72 // { int ovadvise(int anom); } vadvise \ + SYS_MUNMAP = 73 // { int munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int mprotect(const void *addr, size_t len, \ + SYS_MADVISE = 75 // { int madvise(void *addr, size_t len, \ + SYS_MINCORE = 78 // { int mincore(const void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int getgroups(u_int gidsetsize, \ + SYS_SETGROUPS = 80 // { int setgroups(u_int gidsetsize, \ + SYS_GETPGRP = 81 // { int getpgrp(void); } + SYS_SETPGID = 82 // { int setpgid(int pid, int pgid); } + SYS_SETITIMER = 83 // { int setitimer(u_int which, struct \ + SYS_SWAPON = 85 // { int swapon(char *name); } + SYS_GETITIMER = 86 // { int getitimer(u_int which, \ + SYS_GETDTABLESIZE = 89 // { int getdtablesize(void); } + SYS_DUP2 = 90 // { int dup2(u_int from, u_int to); } + SYS_FCNTL = 92 // { int fcntl(int fd, int cmd, long arg); } + SYS_SELECT = 93 // { int select(int nd, fd_set *in, fd_set *ou, \ + SYS_FSYNC = 95 // { int fsync(int fd); } + SYS_SETPRIORITY = 96 // { int setpriority(int which, int who, \ + SYS_SOCKET = 97 // { int socket(int domain, int type, \ + SYS_CONNECT = 98 // { int connect(int s, caddr_t name, \ + SYS_GETPRIORITY = 100 // { int getpriority(int which, int who); } + SYS_BIND = 104 // { int bind(int s, caddr_t name, \ + SYS_SETSOCKOPT = 105 // { int setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int listen(int s, int backlog); } + SYS_GETTIMEOFDAY = 116 // { int gettimeofday(struct timeval *tp, \ + SYS_GETRUSAGE = 117 // { int getrusage(int who, \ + SYS_GETSOCKOPT = 118 // { int getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { int readv(int fd, struct iovec *iovp, \ + SYS_WRITEV = 121 // { int writev(int fd, struct iovec *iovp, \ + SYS_SETTIMEOFDAY = 122 // { int settimeofday(struct timeval *tv, \ + SYS_FCHOWN = 123 // { int fchown(int fd, int uid, int gid); } + SYS_FCHMOD = 124 // { int fchmod(int fd, int mode); } + SYS_SETREUID = 126 // { int setreuid(int ruid, int euid); } + SYS_SETREGID = 127 // { int setregid(int rgid, int egid); } + SYS_RENAME = 128 // { int rename(char *from, char *to); } + SYS_FLOCK = 131 // { int flock(int fd, int how); } + SYS_MKFIFO = 132 // { int mkfifo(char *path, int mode); } + SYS_SENDTO = 133 // { int sendto(int s, caddr_t buf, size_t len, \ + SYS_SHUTDOWN = 134 // { int shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int mkdir(char *path, int mode); } + SYS_RMDIR = 137 // { int rmdir(char *path); } + SYS_UTIMES = 138 // { int utimes(char *path, \ + SYS_ADJTIME = 140 // { int adjtime(struct timeval *delta, \ + SYS_SETSID = 147 // { int setsid(void); } + SYS_QUOTACTL = 148 // { int quotactl(char *path, int cmd, int uid, \ + SYS_LGETFH = 160 // { int lgetfh(char *fname, \ + SYS_GETFH = 161 // { int getfh(char *fname, \ + SYS_SYSARCH = 165 // { int sysarch(int op, char *parms); } + SYS_RTPRIO = 166 // { int rtprio(int function, pid_t pid, \ + SYS_FREEBSD6_PREAD = 173 // { ssize_t freebsd6_pread(int fd, void *buf, \ + SYS_FREEBSD6_PWRITE = 174 // { ssize_t freebsd6_pwrite(int fd, \ + SYS_SETFIB = 175 // { int setfib(int fibnum); } + SYS_NTP_ADJTIME = 176 // { int ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int setgid(gid_t gid); } + SYS_SETEGID = 182 // { int setegid(gid_t egid); } + SYS_SETEUID = 183 // { int seteuid(uid_t euid); } + SYS_STAT = 188 // { int stat(char *path, struct stat *ub); } + SYS_FSTAT = 189 // { int fstat(int fd, struct stat *sb); } + SYS_LSTAT = 190 // { int lstat(char *path, struct stat *ub); } + SYS_PATHCONF = 191 // { int pathconf(char *path, int name); } + SYS_FPATHCONF = 192 // { int fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int getrlimit(u_int which, \ + SYS_SETRLIMIT = 195 // { int setrlimit(u_int which, \ + SYS_GETDIRENTRIES = 196 // { int getdirentries(int fd, char *buf, \ + SYS_FREEBSD6_MMAP = 197 // { caddr_t freebsd6_mmap(caddr_t addr, \ + SYS_FREEBSD6_LSEEK = 199 // { off_t freebsd6_lseek(int fd, int pad, \ + SYS_FREEBSD6_TRUNCATE = 200 // { int freebsd6_truncate(char *path, int pad, \ + SYS_FREEBSD6_FTRUNCATE = 201 // { int freebsd6_ftruncate(int fd, int pad, \ + SYS___SYSCTL = 202 // { int __sysctl(int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int undelete(char *path); } + SYS_FUTIMES = 206 // { int futimes(int fd, struct timeval *tptr); } + SYS_GETPGID = 207 // { int getpgid(pid_t pid); } + SYS_POLL = 209 // { int poll(struct pollfd *fds, u_int nfds, \ + SYS_CLOCK_GETTIME = 232 // { int clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 233 // { int clock_settime( \ + SYS_CLOCK_GETRES = 234 // { int clock_getres(clockid_t clock_id, \ + SYS_KTIMER_CREATE = 235 // { int ktimer_create(clockid_t clock_id, \ + SYS_KTIMER_DELETE = 236 // { int ktimer_delete(int timerid); } + SYS_KTIMER_SETTIME = 237 // { int ktimer_settime(int timerid, int flags, \ + SYS_KTIMER_GETTIME = 238 // { int ktimer_gettime(int timerid, struct \ + SYS_KTIMER_GETOVERRUN = 239 // { int ktimer_getoverrun(int timerid); } + SYS_NANOSLEEP = 240 // { int nanosleep(const struct timespec *rqtp, \ + SYS_FFCLOCK_GETCOUNTER = 241 // { int ffclock_getcounter(ffcounter *ffcount); } + SYS_FFCLOCK_SETESTIMATE = 242 // { int ffclock_setestimate( \ + SYS_FFCLOCK_GETESTIMATE = 243 // { int ffclock_getestimate( \ + SYS_CLOCK_GETCPUCLOCKID2 = 247 // { int clock_getcpuclockid2(id_t id,\ + SYS_NTP_GETTIME = 248 // { int ntp_gettime(struct ntptimeval *ntvp); } + SYS_MINHERIT = 250 // { int minherit(void *addr, size_t len, \ + SYS_RFORK = 251 // { int rfork(int flags); } + SYS_OPENBSD_POLL = 252 // { int openbsd_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int issetugid(void); } + SYS_LCHOWN = 254 // { int lchown(char *path, int uid, int gid); } + SYS_GETDENTS = 272 // { int getdents(int fd, char *buf, \ + SYS_LCHMOD = 274 // { int lchmod(char *path, mode_t mode); } + SYS_LUTIMES = 276 // { int lutimes(char *path, \ + SYS_NSTAT = 278 // { int nstat(char *path, struct nstat *ub); } + SYS_NFSTAT = 279 // { int nfstat(int fd, struct nstat *sb); } + SYS_NLSTAT = 280 // { int nlstat(char *path, struct nstat *ub); } + SYS_PREADV = 289 // { ssize_t preadv(int fd, struct iovec *iovp, \ + SYS_PWRITEV = 290 // { ssize_t pwritev(int fd, struct iovec *iovp, \ + SYS_FHOPEN = 298 // { int fhopen(const struct fhandle *u_fhp, \ + SYS_FHSTAT = 299 // { int fhstat(const struct fhandle *u_fhp, \ + SYS_MODNEXT = 300 // { int modnext(int modid); } + SYS_MODSTAT = 301 // { int modstat(int modid, \ + SYS_MODFNEXT = 302 // { int modfnext(int modid); } + SYS_MODFIND = 303 // { int modfind(const char *name); } + SYS_KLDLOAD = 304 // { int kldload(const char *file); } + SYS_KLDUNLOAD = 305 // { int kldunload(int fileid); } + SYS_KLDFIND = 306 // { int kldfind(const char *file); } + SYS_KLDNEXT = 307 // { int kldnext(int fileid); } + SYS_KLDSTAT = 308 // { int kldstat(int fileid, struct \ + SYS_KLDFIRSTMOD = 309 // { int kldfirstmod(int fileid); } + SYS_GETSID = 310 // { int getsid(pid_t pid); } + SYS_SETRESUID = 311 // { int setresuid(uid_t ruid, uid_t euid, \ + SYS_SETRESGID = 312 // { int setresgid(gid_t rgid, gid_t egid, \ + SYS_YIELD = 321 // { int yield(void); } + SYS_MLOCKALL = 324 // { int mlockall(int how); } + SYS_MUNLOCKALL = 325 // { int munlockall(void); } + SYS___GETCWD = 326 // { int __getcwd(char *buf, u_int buflen); } + SYS_SCHED_SETPARAM = 327 // { int sched_setparam (pid_t pid, \ + SYS_SCHED_GETPARAM = 328 // { int sched_getparam (pid_t pid, struct \ + SYS_SCHED_SETSCHEDULER = 329 // { int sched_setscheduler (pid_t pid, int \ + SYS_SCHED_GETSCHEDULER = 330 // { int sched_getscheduler (pid_t pid); } + SYS_SCHED_YIELD = 331 // { int sched_yield (void); } + SYS_SCHED_GET_PRIORITY_MAX = 332 // { int sched_get_priority_max (int policy); } + SYS_SCHED_GET_PRIORITY_MIN = 333 // { int sched_get_priority_min (int policy); } + SYS_SCHED_RR_GET_INTERVAL = 334 // { int sched_rr_get_interval (pid_t pid, \ + SYS_UTRACE = 335 // { int utrace(const void *addr, size_t len); } + SYS_KLDSYM = 337 // { int kldsym(int fileid, int cmd, \ + SYS_JAIL = 338 // { int jail(struct jail *jail); } + SYS_SIGPROCMASK = 340 // { int sigprocmask(int how, \ + SYS_SIGSUSPEND = 341 // { int sigsuspend(const sigset_t *sigmask); } + SYS_SIGPENDING = 343 // { int sigpending(sigset_t *set); } + SYS_SIGTIMEDWAIT = 345 // { int sigtimedwait(const sigset_t *set, \ + SYS_SIGWAITINFO = 346 // { int sigwaitinfo(const sigset_t *set, \ + SYS___ACL_GET_FILE = 347 // { int __acl_get_file(const char *path, \ + SYS___ACL_SET_FILE = 348 // { int __acl_set_file(const char *path, \ + SYS___ACL_GET_FD = 349 // { int __acl_get_fd(int filedes, \ + SYS___ACL_SET_FD = 350 // { int __acl_set_fd(int filedes, \ + SYS___ACL_DELETE_FILE = 351 // { int __acl_delete_file(const char *path, \ + SYS___ACL_DELETE_FD = 352 // { int __acl_delete_fd(int filedes, \ + SYS___ACL_ACLCHECK_FILE = 353 // { int __acl_aclcheck_file(const char *path, \ + SYS___ACL_ACLCHECK_FD = 354 // { int __acl_aclcheck_fd(int filedes, \ + SYS_EXTATTRCTL = 355 // { int extattrctl(const char *path, int cmd, \ + SYS_EXTATTR_SET_FILE = 356 // { ssize_t extattr_set_file( \ + SYS_EXTATTR_GET_FILE = 357 // { ssize_t extattr_get_file( \ + SYS_EXTATTR_DELETE_FILE = 358 // { int extattr_delete_file(const char *path, \ + SYS_GETRESUID = 360 // { int getresuid(uid_t *ruid, uid_t *euid, \ + SYS_GETRESGID = 361 // { int getresgid(gid_t *rgid, gid_t *egid, \ + SYS_KQUEUE = 362 // { int kqueue(void); } + SYS_KEVENT = 363 // { int kevent(int fd, \ + SYS_EXTATTR_SET_FD = 371 // { ssize_t extattr_set_fd(int fd, \ + SYS_EXTATTR_GET_FD = 372 // { ssize_t extattr_get_fd(int fd, \ + SYS_EXTATTR_DELETE_FD = 373 // { int extattr_delete_fd(int fd, \ + SYS___SETUGID = 374 // { int __setugid(int flag); } + SYS_EACCESS = 376 // { int eaccess(char *path, int amode); } + SYS_NMOUNT = 378 // { int nmount(struct iovec *iovp, \ + SYS___MAC_GET_PROC = 384 // { int __mac_get_proc(struct mac *mac_p); } + SYS___MAC_SET_PROC = 385 // { int __mac_set_proc(struct mac *mac_p); } + SYS___MAC_GET_FD = 386 // { int __mac_get_fd(int fd, \ + SYS___MAC_GET_FILE = 387 // { int __mac_get_file(const char *path_p, \ + SYS___MAC_SET_FD = 388 // { int __mac_set_fd(int fd, \ + SYS___MAC_SET_FILE = 389 // { int __mac_set_file(const char *path_p, \ + SYS_KENV = 390 // { int kenv(int what, const char *name, \ + SYS_LCHFLAGS = 391 // { int lchflags(const char *path, \ + SYS_UUIDGEN = 392 // { int uuidgen(struct uuid *store, \ + SYS_SENDFILE = 393 // { int sendfile(int fd, int s, off_t offset, \ + SYS_MAC_SYSCALL = 394 // { int mac_syscall(const char *policy, \ + SYS_GETFSSTAT = 395 // { int getfsstat(struct statfs *buf, \ + SYS_STATFS = 396 // { int statfs(char *path, \ + SYS_FSTATFS = 397 // { int fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 398 // { int fhstatfs(const struct fhandle *u_fhp, \ + SYS___MAC_GET_PID = 409 // { int __mac_get_pid(pid_t pid, \ + SYS___MAC_GET_LINK = 410 // { int __mac_get_link(const char *path_p, \ + SYS___MAC_SET_LINK = 411 // { int __mac_set_link(const char *path_p, \ + SYS_EXTATTR_SET_LINK = 412 // { ssize_t extattr_set_link( \ + SYS_EXTATTR_GET_LINK = 413 // { ssize_t extattr_get_link( \ + SYS_EXTATTR_DELETE_LINK = 414 // { int extattr_delete_link( \ + SYS___MAC_EXECVE = 415 // { int __mac_execve(char *fname, char **argv, \ + SYS_SIGACTION = 416 // { int sigaction(int sig, \ + SYS_SIGRETURN = 417 // { int sigreturn( \ + SYS_GETCONTEXT = 421 // { int getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 422 // { int setcontext( \ + SYS_SWAPCONTEXT = 423 // { int swapcontext(struct __ucontext *oucp, \ + SYS_SWAPOFF = 424 // { int swapoff(const char *name); } + SYS___ACL_GET_LINK = 425 // { int __acl_get_link(const char *path, \ + SYS___ACL_SET_LINK = 426 // { int __acl_set_link(const char *path, \ + SYS___ACL_DELETE_LINK = 427 // { int __acl_delete_link(const char *path, \ + SYS___ACL_ACLCHECK_LINK = 428 // { int __acl_aclcheck_link(const char *path, \ + SYS_SIGWAIT = 429 // { int sigwait(const sigset_t *set, \ + SYS_THR_CREATE = 430 // { int thr_create(ucontext_t *ctx, long *id, \ + SYS_THR_EXIT = 431 // { void thr_exit(long *state); } + SYS_THR_SELF = 432 // { int thr_self(long *id); } + SYS_THR_KILL = 433 // { int thr_kill(long id, int sig); } + SYS__UMTX_LOCK = 434 // { int _umtx_lock(struct umtx *umtx); } + SYS__UMTX_UNLOCK = 435 // { int _umtx_unlock(struct umtx *umtx); } + SYS_JAIL_ATTACH = 436 // { int jail_attach(int jid); } + SYS_EXTATTR_LIST_FD = 437 // { ssize_t extattr_list_fd(int fd, \ + SYS_EXTATTR_LIST_FILE = 438 // { ssize_t extattr_list_file( \ + SYS_EXTATTR_LIST_LINK = 439 // { ssize_t extattr_list_link( \ + SYS_THR_SUSPEND = 442 // { int thr_suspend( \ + SYS_THR_WAKE = 443 // { int thr_wake(long id); } + SYS_KLDUNLOADF = 444 // { int kldunloadf(int fileid, int flags); } + SYS_AUDIT = 445 // { int audit(const void *record, \ + SYS_AUDITON = 446 // { int auditon(int cmd, void *data, \ + SYS_GETAUID = 447 // { int getauid(uid_t *auid); } + SYS_SETAUID = 448 // { int setauid(uid_t *auid); } + SYS_GETAUDIT = 449 // { int getaudit(struct auditinfo *auditinfo); } + SYS_SETAUDIT = 450 // { int setaudit(struct auditinfo *auditinfo); } + SYS_GETAUDIT_ADDR = 451 // { int getaudit_addr( \ + SYS_SETAUDIT_ADDR = 452 // { int setaudit_addr( \ + SYS_AUDITCTL = 453 // { int auditctl(char *path); } + SYS__UMTX_OP = 454 // { int _umtx_op(void *obj, int op, \ + SYS_THR_NEW = 455 // { int thr_new(struct thr_param *param, \ + SYS_SIGQUEUE = 456 // { int sigqueue(pid_t pid, int signum, void *value); } + SYS_ABORT2 = 463 // { int abort2(const char *why, int nargs, void **args); } + SYS_THR_SET_NAME = 464 // { int thr_set_name(long id, const char *name); } + SYS_RTPRIO_THREAD = 466 // { int rtprio_thread(int function, \ + SYS_SCTP_PEELOFF = 471 // { int sctp_peeloff(int sd, uint32_t name); } + SYS_SCTP_GENERIC_SENDMSG = 472 // { int sctp_generic_sendmsg(int sd, caddr_t msg, int mlen, \ + SYS_SCTP_GENERIC_SENDMSG_IOV = 473 // { int sctp_generic_sendmsg_iov(int sd, struct iovec *iov, int iovlen, \ + SYS_SCTP_GENERIC_RECVMSG = 474 // { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, \ + SYS_PREAD = 475 // { ssize_t pread(int fd, void *buf, \ + SYS_PWRITE = 476 // { ssize_t pwrite(int fd, const void *buf, \ + SYS_MMAP = 477 // { caddr_t mmap(caddr_t addr, size_t len, \ + SYS_LSEEK = 478 // { off_t lseek(int fd, off_t offset, \ + SYS_TRUNCATE = 479 // { int truncate(char *path, off_t length); } + SYS_FTRUNCATE = 480 // { int ftruncate(int fd, off_t length); } + SYS_THR_KILL2 = 481 // { int thr_kill2(pid_t pid, long id, int sig); } + SYS_SHM_OPEN = 482 // { int shm_open(const char *path, int flags, \ + SYS_SHM_UNLINK = 483 // { int shm_unlink(const char *path); } + SYS_CPUSET = 484 // { int cpuset(cpusetid_t *setid); } + SYS_CPUSET_SETID = 485 // { int cpuset_setid(cpuwhich_t which, id_t id, \ + SYS_CPUSET_GETID = 486 // { int cpuset_getid(cpulevel_t level, \ + SYS_CPUSET_GETAFFINITY = 487 // { int cpuset_getaffinity(cpulevel_t level, \ + SYS_CPUSET_SETAFFINITY = 488 // { int cpuset_setaffinity(cpulevel_t level, \ + SYS_FACCESSAT = 489 // { int faccessat(int fd, char *path, int amode, \ + SYS_FCHMODAT = 490 // { int fchmodat(int fd, char *path, mode_t mode, \ + SYS_FCHOWNAT = 491 // { int fchownat(int fd, char *path, uid_t uid, \ + SYS_FEXECVE = 492 // { int fexecve(int fd, char **argv, \ + SYS_FSTATAT = 493 // { int fstatat(int fd, char *path, \ + SYS_FUTIMESAT = 494 // { int futimesat(int fd, char *path, \ + SYS_LINKAT = 495 // { int linkat(int fd1, char *path1, int fd2, \ + SYS_MKDIRAT = 496 // { int mkdirat(int fd, char *path, mode_t mode); } + SYS_MKFIFOAT = 497 // { int mkfifoat(int fd, char *path, mode_t mode); } + SYS_MKNODAT = 498 // { int mknodat(int fd, char *path, mode_t mode, \ + SYS_OPENAT = 499 // { int openat(int fd, char *path, int flag, \ + SYS_READLINKAT = 500 // { int readlinkat(int fd, char *path, char *buf, \ + SYS_RENAMEAT = 501 // { int renameat(int oldfd, char *old, int newfd, \ + SYS_SYMLINKAT = 502 // { int symlinkat(char *path1, int fd, \ + SYS_UNLINKAT = 503 // { int unlinkat(int fd, char *path, int flag); } + SYS_POSIX_OPENPT = 504 // { int posix_openpt(int flags); } + SYS_JAIL_GET = 506 // { int jail_get(struct iovec *iovp, \ + SYS_JAIL_SET = 507 // { int jail_set(struct iovec *iovp, \ + SYS_JAIL_REMOVE = 508 // { int jail_remove(int jid); } + SYS_CLOSEFROM = 509 // { int closefrom(int lowfd); } + SYS_LPATHCONF = 513 // { int lpathconf(char *path, int name); } + SYS_CAP_NEW = 514 // { int cap_new(int fd, uint64_t rights); } + SYS_CAP_GETRIGHTS = 515 // { int cap_getrights(int fd, \ + SYS_CAP_ENTER = 516 // { int cap_enter(void); } + SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); } + SYS_PDFORK = 518 // { int pdfork(int *fdp, int flags); } + SYS_PDKILL = 519 // { int pdkill(int fd, int signum); } + SYS_PDGETPID = 520 // { int pdgetpid(int fd, pid_t *pidp); } + SYS_PSELECT = 522 // { int pselect(int nd, fd_set *in, \ + SYS_GETLOGINCLASS = 523 // { int getloginclass(char *namebuf, \ + SYS_SETLOGINCLASS = 524 // { int setloginclass(const char *namebuf); } + SYS_RCTL_GET_RACCT = 525 // { int rctl_get_racct(const void *inbufp, \ + SYS_RCTL_GET_RULES = 526 // { int rctl_get_rules(const void *inbufp, \ + SYS_RCTL_GET_LIMITS = 527 // { int rctl_get_limits(const void *inbufp, \ + SYS_RCTL_ADD_RULE = 528 // { int rctl_add_rule(const void *inbufp, \ + SYS_RCTL_REMOVE_RULE = 529 // { int rctl_remove_rule(const void *inbufp, \ + SYS_POSIX_FALLOCATE = 530 // { int posix_fallocate(int fd, \ + SYS_POSIX_FADVISE = 531 // { int posix_fadvise(int fd, off_t offset, \ + SYS_WAIT6 = 532 // { int wait6(idtype_t idtype, id_t id, \ + SYS_BINDAT = 538 // { int bindat(int fd, int s, caddr_t name, \ + SYS_CONNECTAT = 539 // { int connectat(int fd, int s, caddr_t name, \ + SYS_CHFLAGSAT = 540 // { int chflagsat(int fd, const char *path, \ + SYS_ACCEPT4 = 541 // { int accept4(int s, \ + SYS_PIPE2 = 542 // { int pipe2(int *fildes, int flags); } + SYS_PROCCTL = 544 // { int procctl(idtype_t idtype, id_t id, \ + SYS_PPOLL = 545 // { int ppoll(struct pollfd *fds, u_int nfds, \ +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go new file mode 100644 index 0000000000000000000000000000000000000000..ba952c67548a96d3756fd69be9b28ec6e2eef7ae --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go @@ -0,0 +1,355 @@ +// mksysnum_linux.pl /usr/include/asm/unistd_32.h +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build 386,linux + +package unix + +const ( + SYS_RESTART_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAITPID = 7 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECVE = 11 + SYS_CHDIR = 12 + SYS_TIME = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LCHOWN = 16 + SYS_BREAK = 17 + SYS_OLDSTAT = 18 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_MOUNT = 21 + SYS_UMOUNT = 22 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_STIME = 25 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_OLDFSTAT = 28 + SYS_PAUSE = 29 + SYS_UTIME = 30 + SYS_STTY = 31 + SYS_GTTY = 32 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_FTIME = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_RENAME = 38 + SYS_MKDIR = 39 + SYS_RMDIR = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_PROF = 44 + SYS_BRK = 45 + SYS_SETGID = 46 + SYS_GETGID = 47 + SYS_SIGNAL = 48 + SYS_GETEUID = 49 + SYS_GETEGID = 50 + SYS_ACCT = 51 + SYS_UMOUNT2 = 52 + SYS_LOCK = 53 + SYS_IOCTL = 54 + SYS_FCNTL = 55 + SYS_MPX = 56 + SYS_SETPGID = 57 + SYS_ULIMIT = 58 + SYS_OLDOLDUNAME = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_USTAT = 62 + SYS_DUP2 = 63 + SYS_GETPPID = 64 + SYS_GETPGRP = 65 + SYS_SETSID = 66 + SYS_SIGACTION = 67 + SYS_SGETMASK = 68 + SYS_SSETMASK = 69 + SYS_SETREUID = 70 + SYS_SETREGID = 71 + SYS_SIGSUSPEND = 72 + SYS_SIGPENDING = 73 + SYS_SETHOSTNAME = 74 + SYS_SETRLIMIT = 75 + SYS_GETRLIMIT = 76 + SYS_GETRUSAGE = 77 + SYS_GETTIMEOFDAY = 78 + SYS_SETTIMEOFDAY = 79 + SYS_GETGROUPS = 80 + SYS_SETGROUPS = 81 + SYS_SELECT = 82 + SYS_SYMLINK = 83 + SYS_OLDLSTAT = 84 + SYS_READLINK = 85 + SYS_USELIB = 86 + SYS_SWAPON = 87 + SYS_REBOOT = 88 + SYS_READDIR = 89 + SYS_MMAP = 90 + SYS_MUNMAP = 91 + SYS_TRUNCATE = 92 + SYS_FTRUNCATE = 93 + SYS_FCHMOD = 94 + SYS_FCHOWN = 95 + SYS_GETPRIORITY = 96 + SYS_SETPRIORITY = 97 + SYS_PROFIL = 98 + SYS_STATFS = 99 + SYS_FSTATFS = 100 + SYS_IOPERM = 101 + SYS_SOCKETCALL = 102 + SYS_SYSLOG = 103 + SYS_SETITIMER = 104 + SYS_GETITIMER = 105 + SYS_STAT = 106 + SYS_LSTAT = 107 + SYS_FSTAT = 108 + SYS_OLDUNAME = 109 + SYS_IOPL = 110 + SYS_VHANGUP = 111 + SYS_IDLE = 112 + SYS_VM86OLD = 113 + SYS_WAIT4 = 114 + SYS_SWAPOFF = 115 + SYS_SYSINFO = 116 + SYS_IPC = 117 + SYS_FSYNC = 118 + SYS_SIGRETURN = 119 + SYS_CLONE = 120 + SYS_SETDOMAINNAME = 121 + SYS_UNAME = 122 + SYS_MODIFY_LDT = 123 + SYS_ADJTIMEX = 124 + SYS_MPROTECT = 125 + SYS_SIGPROCMASK = 126 + SYS_CREATE_MODULE = 127 + SYS_INIT_MODULE = 128 + SYS_DELETE_MODULE = 129 + SYS_GET_KERNEL_SYMS = 130 + SYS_QUOTACTL = 131 + SYS_GETPGID = 132 + SYS_FCHDIR = 133 + SYS_BDFLUSH = 134 + SYS_SYSFS = 135 + SYS_PERSONALITY = 136 + SYS_AFS_SYSCALL = 137 + SYS_SETFSUID = 138 + SYS_SETFSGID = 139 + SYS__LLSEEK = 140 + SYS_GETDENTS = 141 + SYS__NEWSELECT = 142 + SYS_FLOCK = 143 + SYS_MSYNC = 144 + SYS_READV = 145 + SYS_WRITEV = 146 + SYS_GETSID = 147 + SYS_FDATASYNC = 148 + SYS__SYSCTL = 149 + SYS_MLOCK = 150 + SYS_MUNLOCK = 151 + SYS_MLOCKALL = 152 + SYS_MUNLOCKALL = 153 + SYS_SCHED_SETPARAM = 154 + SYS_SCHED_GETPARAM = 155 + SYS_SCHED_SETSCHEDULER = 156 + SYS_SCHED_GETSCHEDULER = 157 + SYS_SCHED_YIELD = 158 + SYS_SCHED_GET_PRIORITY_MAX = 159 + SYS_SCHED_GET_PRIORITY_MIN = 160 + SYS_SCHED_RR_GET_INTERVAL = 161 + SYS_NANOSLEEP = 162 + SYS_MREMAP = 163 + SYS_SETRESUID = 164 + SYS_GETRESUID = 165 + SYS_VM86 = 166 + SYS_QUERY_MODULE = 167 + SYS_POLL = 168 + SYS_NFSSERVCTL = 169 + SYS_SETRESGID = 170 + SYS_GETRESGID = 171 + SYS_PRCTL = 172 + SYS_RT_SIGRETURN = 173 + SYS_RT_SIGACTION = 174 + SYS_RT_SIGPROCMASK = 175 + SYS_RT_SIGPENDING = 176 + SYS_RT_SIGTIMEDWAIT = 177 + SYS_RT_SIGQUEUEINFO = 178 + SYS_RT_SIGSUSPEND = 179 + SYS_PREAD64 = 180 + SYS_PWRITE64 = 181 + SYS_CHOWN = 182 + SYS_GETCWD = 183 + SYS_CAPGET = 184 + SYS_CAPSET = 185 + SYS_SIGALTSTACK = 186 + SYS_SENDFILE = 187 + SYS_GETPMSG = 188 + SYS_PUTPMSG = 189 + SYS_VFORK = 190 + SYS_UGETRLIMIT = 191 + SYS_MMAP2 = 192 + SYS_TRUNCATE64 = 193 + SYS_FTRUNCATE64 = 194 + SYS_STAT64 = 195 + SYS_LSTAT64 = 196 + SYS_FSTAT64 = 197 + SYS_LCHOWN32 = 198 + SYS_GETUID32 = 199 + SYS_GETGID32 = 200 + SYS_GETEUID32 = 201 + SYS_GETEGID32 = 202 + SYS_SETREUID32 = 203 + SYS_SETREGID32 = 204 + SYS_GETGROUPS32 = 205 + SYS_SETGROUPS32 = 206 + SYS_FCHOWN32 = 207 + SYS_SETRESUID32 = 208 + SYS_GETRESUID32 = 209 + SYS_SETRESGID32 = 210 + SYS_GETRESGID32 = 211 + SYS_CHOWN32 = 212 + SYS_SETUID32 = 213 + SYS_SETGID32 = 214 + SYS_SETFSUID32 = 215 + SYS_SETFSGID32 = 216 + SYS_PIVOT_ROOT = 217 + SYS_MINCORE = 218 + SYS_MADVISE = 219 + SYS_MADVISE1 = 219 + SYS_GETDENTS64 = 220 + SYS_FCNTL64 = 221 + SYS_GETTID = 224 + SYS_READAHEAD = 225 + SYS_SETXATTR = 226 + SYS_LSETXATTR = 227 + SYS_FSETXATTR = 228 + SYS_GETXATTR = 229 + SYS_LGETXATTR = 230 + SYS_FGETXATTR = 231 + SYS_LISTXATTR = 232 + SYS_LLISTXATTR = 233 + SYS_FLISTXATTR = 234 + SYS_REMOVEXATTR = 235 + SYS_LREMOVEXATTR = 236 + SYS_FREMOVEXATTR = 237 + SYS_TKILL = 238 + SYS_SENDFILE64 = 239 + SYS_FUTEX = 240 + SYS_SCHED_SETAFFINITY = 241 + SYS_SCHED_GETAFFINITY = 242 + SYS_SET_THREAD_AREA = 243 + SYS_GET_THREAD_AREA = 244 + SYS_IO_SETUP = 245 + SYS_IO_DESTROY = 246 + SYS_IO_GETEVENTS = 247 + SYS_IO_SUBMIT = 248 + SYS_IO_CANCEL = 249 + SYS_FADVISE64 = 250 + SYS_EXIT_GROUP = 252 + SYS_LOOKUP_DCOOKIE = 253 + SYS_EPOLL_CREATE = 254 + SYS_EPOLL_CTL = 255 + SYS_EPOLL_WAIT = 256 + SYS_REMAP_FILE_PAGES = 257 + SYS_SET_TID_ADDRESS = 258 + SYS_TIMER_CREATE = 259 + SYS_TIMER_SETTIME = 260 + SYS_TIMER_GETTIME = 261 + SYS_TIMER_GETOVERRUN = 262 + SYS_TIMER_DELETE = 263 + SYS_CLOCK_SETTIME = 264 + SYS_CLOCK_GETTIME = 265 + SYS_CLOCK_GETRES = 266 + SYS_CLOCK_NANOSLEEP = 267 + SYS_STATFS64 = 268 + SYS_FSTATFS64 = 269 + SYS_TGKILL = 270 + SYS_UTIMES = 271 + SYS_FADVISE64_64 = 272 + SYS_VSERVER = 273 + SYS_MBIND = 274 + SYS_GET_MEMPOLICY = 275 + SYS_SET_MEMPOLICY = 276 + SYS_MQ_OPEN = 277 + SYS_MQ_UNLINK = 278 + SYS_MQ_TIMEDSEND = 279 + SYS_MQ_TIMEDRECEIVE = 280 + SYS_MQ_NOTIFY = 281 + SYS_MQ_GETSETATTR = 282 + SYS_KEXEC_LOAD = 283 + SYS_WAITID = 284 + SYS_ADD_KEY = 286 + SYS_REQUEST_KEY = 287 + SYS_KEYCTL = 288 + SYS_IOPRIO_SET = 289 + SYS_IOPRIO_GET = 290 + SYS_INOTIFY_INIT = 291 + SYS_INOTIFY_ADD_WATCH = 292 + SYS_INOTIFY_RM_WATCH = 293 + SYS_MIGRATE_PAGES = 294 + SYS_OPENAT = 295 + SYS_MKDIRAT = 296 + SYS_MKNODAT = 297 + SYS_FCHOWNAT = 298 + SYS_FUTIMESAT = 299 + SYS_FSTATAT64 = 300 + SYS_UNLINKAT = 301 + SYS_RENAMEAT = 302 + SYS_LINKAT = 303 + SYS_SYMLINKAT = 304 + SYS_READLINKAT = 305 + SYS_FCHMODAT = 306 + SYS_FACCESSAT = 307 + SYS_PSELECT6 = 308 + SYS_PPOLL = 309 + SYS_UNSHARE = 310 + SYS_SET_ROBUST_LIST = 311 + SYS_GET_ROBUST_LIST = 312 + SYS_SPLICE = 313 + SYS_SYNC_FILE_RANGE = 314 + SYS_TEE = 315 + SYS_VMSPLICE = 316 + SYS_MOVE_PAGES = 317 + SYS_GETCPU = 318 + SYS_EPOLL_PWAIT = 319 + SYS_UTIMENSAT = 320 + SYS_SIGNALFD = 321 + SYS_TIMERFD_CREATE = 322 + SYS_EVENTFD = 323 + SYS_FALLOCATE = 324 + SYS_TIMERFD_SETTIME = 325 + SYS_TIMERFD_GETTIME = 326 + SYS_SIGNALFD4 = 327 + SYS_EVENTFD2 = 328 + SYS_EPOLL_CREATE1 = 329 + SYS_DUP3 = 330 + SYS_PIPE2 = 331 + SYS_INOTIFY_INIT1 = 332 + SYS_PREADV = 333 + SYS_PWRITEV = 334 + SYS_RT_TGSIGQUEUEINFO = 335 + SYS_PERF_EVENT_OPEN = 336 + SYS_RECVMMSG = 337 + SYS_FANOTIFY_INIT = 338 + SYS_FANOTIFY_MARK = 339 + SYS_PRLIMIT64 = 340 + SYS_NAME_TO_HANDLE_AT = 341 + SYS_OPEN_BY_HANDLE_AT = 342 + SYS_CLOCK_ADJTIME = 343 + SYS_SYNCFS = 344 + SYS_SENDMMSG = 345 + SYS_SETNS = 346 + SYS_PROCESS_VM_READV = 347 + SYS_PROCESS_VM_WRITEV = 348 +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..ddac31f58adac095a54d277e512188a184b653a1 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go @@ -0,0 +1,321 @@ +// mksysnum_linux.pl /usr/include/asm/unistd_64.h +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build amd64,linux + +package unix + +const ( + SYS_READ = 0 + SYS_WRITE = 1 + SYS_OPEN = 2 + SYS_CLOSE = 3 + SYS_STAT = 4 + SYS_FSTAT = 5 + SYS_LSTAT = 6 + SYS_POLL = 7 + SYS_LSEEK = 8 + SYS_MMAP = 9 + SYS_MPROTECT = 10 + SYS_MUNMAP = 11 + SYS_BRK = 12 + SYS_RT_SIGACTION = 13 + SYS_RT_SIGPROCMASK = 14 + SYS_RT_SIGRETURN = 15 + SYS_IOCTL = 16 + SYS_PREAD64 = 17 + SYS_PWRITE64 = 18 + SYS_READV = 19 + SYS_WRITEV = 20 + SYS_ACCESS = 21 + SYS_PIPE = 22 + SYS_SELECT = 23 + SYS_SCHED_YIELD = 24 + SYS_MREMAP = 25 + SYS_MSYNC = 26 + SYS_MINCORE = 27 + SYS_MADVISE = 28 + SYS_SHMGET = 29 + SYS_SHMAT = 30 + SYS_SHMCTL = 31 + SYS_DUP = 32 + SYS_DUP2 = 33 + SYS_PAUSE = 34 + SYS_NANOSLEEP = 35 + SYS_GETITIMER = 36 + SYS_ALARM = 37 + SYS_SETITIMER = 38 + SYS_GETPID = 39 + SYS_SENDFILE = 40 + SYS_SOCKET = 41 + SYS_CONNECT = 42 + SYS_ACCEPT = 43 + SYS_SENDTO = 44 + SYS_RECVFROM = 45 + SYS_SENDMSG = 46 + SYS_RECVMSG = 47 + SYS_SHUTDOWN = 48 + SYS_BIND = 49 + SYS_LISTEN = 50 + SYS_GETSOCKNAME = 51 + SYS_GETPEERNAME = 52 + SYS_SOCKETPAIR = 53 + SYS_SETSOCKOPT = 54 + SYS_GETSOCKOPT = 55 + SYS_CLONE = 56 + SYS_FORK = 57 + SYS_VFORK = 58 + SYS_EXECVE = 59 + SYS_EXIT = 60 + SYS_WAIT4 = 61 + SYS_KILL = 62 + SYS_UNAME = 63 + SYS_SEMGET = 64 + SYS_SEMOP = 65 + SYS_SEMCTL = 66 + SYS_SHMDT = 67 + SYS_MSGGET = 68 + SYS_MSGSND = 69 + SYS_MSGRCV = 70 + SYS_MSGCTL = 71 + SYS_FCNTL = 72 + SYS_FLOCK = 73 + SYS_FSYNC = 74 + SYS_FDATASYNC = 75 + SYS_TRUNCATE = 76 + SYS_FTRUNCATE = 77 + SYS_GETDENTS = 78 + SYS_GETCWD = 79 + SYS_CHDIR = 80 + SYS_FCHDIR = 81 + SYS_RENAME = 82 + SYS_MKDIR = 83 + SYS_RMDIR = 84 + SYS_CREAT = 85 + SYS_LINK = 86 + SYS_UNLINK = 87 + SYS_SYMLINK = 88 + SYS_READLINK = 89 + SYS_CHMOD = 90 + SYS_FCHMOD = 91 + SYS_CHOWN = 92 + SYS_FCHOWN = 93 + SYS_LCHOWN = 94 + SYS_UMASK = 95 + SYS_GETTIMEOFDAY = 96 + SYS_GETRLIMIT = 97 + SYS_GETRUSAGE = 98 + SYS_SYSINFO = 99 + SYS_TIMES = 100 + SYS_PTRACE = 101 + SYS_GETUID = 102 + SYS_SYSLOG = 103 + SYS_GETGID = 104 + SYS_SETUID = 105 + SYS_SETGID = 106 + SYS_GETEUID = 107 + SYS_GETEGID = 108 + SYS_SETPGID = 109 + SYS_GETPPID = 110 + SYS_GETPGRP = 111 + SYS_SETSID = 112 + SYS_SETREUID = 113 + SYS_SETREGID = 114 + SYS_GETGROUPS = 115 + SYS_SETGROUPS = 116 + SYS_SETRESUID = 117 + SYS_GETRESUID = 118 + SYS_SETRESGID = 119 + SYS_GETRESGID = 120 + SYS_GETPGID = 121 + SYS_SETFSUID = 122 + SYS_SETFSGID = 123 + SYS_GETSID = 124 + SYS_CAPGET = 125 + SYS_CAPSET = 126 + SYS_RT_SIGPENDING = 127 + SYS_RT_SIGTIMEDWAIT = 128 + SYS_RT_SIGQUEUEINFO = 129 + SYS_RT_SIGSUSPEND = 130 + SYS_SIGALTSTACK = 131 + SYS_UTIME = 132 + SYS_MKNOD = 133 + SYS_USELIB = 134 + SYS_PERSONALITY = 135 + SYS_USTAT = 136 + SYS_STATFS = 137 + SYS_FSTATFS = 138 + SYS_SYSFS = 139 + SYS_GETPRIORITY = 140 + SYS_SETPRIORITY = 141 + SYS_SCHED_SETPARAM = 142 + SYS_SCHED_GETPARAM = 143 + SYS_SCHED_SETSCHEDULER = 144 + SYS_SCHED_GETSCHEDULER = 145 + SYS_SCHED_GET_PRIORITY_MAX = 146 + SYS_SCHED_GET_PRIORITY_MIN = 147 + SYS_SCHED_RR_GET_INTERVAL = 148 + SYS_MLOCK = 149 + SYS_MUNLOCK = 150 + SYS_MLOCKALL = 151 + SYS_MUNLOCKALL = 152 + SYS_VHANGUP = 153 + SYS_MODIFY_LDT = 154 + SYS_PIVOT_ROOT = 155 + SYS__SYSCTL = 156 + SYS_PRCTL = 157 + SYS_ARCH_PRCTL = 158 + SYS_ADJTIMEX = 159 + SYS_SETRLIMIT = 160 + SYS_CHROOT = 161 + SYS_SYNC = 162 + SYS_ACCT = 163 + SYS_SETTIMEOFDAY = 164 + SYS_MOUNT = 165 + SYS_UMOUNT2 = 166 + SYS_SWAPON = 167 + SYS_SWAPOFF = 168 + SYS_REBOOT = 169 + SYS_SETHOSTNAME = 170 + SYS_SETDOMAINNAME = 171 + SYS_IOPL = 172 + SYS_IOPERM = 173 + SYS_CREATE_MODULE = 174 + SYS_INIT_MODULE = 175 + SYS_DELETE_MODULE = 176 + SYS_GET_KERNEL_SYMS = 177 + SYS_QUERY_MODULE = 178 + SYS_QUOTACTL = 179 + SYS_NFSSERVCTL = 180 + SYS_GETPMSG = 181 + SYS_PUTPMSG = 182 + SYS_AFS_SYSCALL = 183 + SYS_TUXCALL = 184 + SYS_SECURITY = 185 + SYS_GETTID = 186 + SYS_READAHEAD = 187 + SYS_SETXATTR = 188 + SYS_LSETXATTR = 189 + SYS_FSETXATTR = 190 + SYS_GETXATTR = 191 + SYS_LGETXATTR = 192 + SYS_FGETXATTR = 193 + SYS_LISTXATTR = 194 + SYS_LLISTXATTR = 195 + SYS_FLISTXATTR = 196 + SYS_REMOVEXATTR = 197 + SYS_LREMOVEXATTR = 198 + SYS_FREMOVEXATTR = 199 + SYS_TKILL = 200 + SYS_TIME = 201 + SYS_FUTEX = 202 + SYS_SCHED_SETAFFINITY = 203 + SYS_SCHED_GETAFFINITY = 204 + SYS_SET_THREAD_AREA = 205 + SYS_IO_SETUP = 206 + SYS_IO_DESTROY = 207 + SYS_IO_GETEVENTS = 208 + SYS_IO_SUBMIT = 209 + SYS_IO_CANCEL = 210 + SYS_GET_THREAD_AREA = 211 + SYS_LOOKUP_DCOOKIE = 212 + SYS_EPOLL_CREATE = 213 + SYS_EPOLL_CTL_OLD = 214 + SYS_EPOLL_WAIT_OLD = 215 + SYS_REMAP_FILE_PAGES = 216 + SYS_GETDENTS64 = 217 + SYS_SET_TID_ADDRESS = 218 + SYS_RESTART_SYSCALL = 219 + SYS_SEMTIMEDOP = 220 + SYS_FADVISE64 = 221 + SYS_TIMER_CREATE = 222 + SYS_TIMER_SETTIME = 223 + SYS_TIMER_GETTIME = 224 + SYS_TIMER_GETOVERRUN = 225 + SYS_TIMER_DELETE = 226 + SYS_CLOCK_SETTIME = 227 + SYS_CLOCK_GETTIME = 228 + SYS_CLOCK_GETRES = 229 + SYS_CLOCK_NANOSLEEP = 230 + SYS_EXIT_GROUP = 231 + SYS_EPOLL_WAIT = 232 + SYS_EPOLL_CTL = 233 + SYS_TGKILL = 234 + SYS_UTIMES = 235 + SYS_VSERVER = 236 + SYS_MBIND = 237 + SYS_SET_MEMPOLICY = 238 + SYS_GET_MEMPOLICY = 239 + SYS_MQ_OPEN = 240 + SYS_MQ_UNLINK = 241 + SYS_MQ_TIMEDSEND = 242 + SYS_MQ_TIMEDRECEIVE = 243 + SYS_MQ_NOTIFY = 244 + SYS_MQ_GETSETATTR = 245 + SYS_KEXEC_LOAD = 246 + SYS_WAITID = 247 + SYS_ADD_KEY = 248 + SYS_REQUEST_KEY = 249 + SYS_KEYCTL = 250 + SYS_IOPRIO_SET = 251 + SYS_IOPRIO_GET = 252 + SYS_INOTIFY_INIT = 253 + SYS_INOTIFY_ADD_WATCH = 254 + SYS_INOTIFY_RM_WATCH = 255 + SYS_MIGRATE_PAGES = 256 + SYS_OPENAT = 257 + SYS_MKDIRAT = 258 + SYS_MKNODAT = 259 + SYS_FCHOWNAT = 260 + SYS_FUTIMESAT = 261 + SYS_NEWFSTATAT = 262 + SYS_UNLINKAT = 263 + SYS_RENAMEAT = 264 + SYS_LINKAT = 265 + SYS_SYMLINKAT = 266 + SYS_READLINKAT = 267 + SYS_FCHMODAT = 268 + SYS_FACCESSAT = 269 + SYS_PSELECT6 = 270 + SYS_PPOLL = 271 + SYS_UNSHARE = 272 + SYS_SET_ROBUST_LIST = 273 + SYS_GET_ROBUST_LIST = 274 + SYS_SPLICE = 275 + SYS_TEE = 276 + SYS_SYNC_FILE_RANGE = 277 + SYS_VMSPLICE = 278 + SYS_MOVE_PAGES = 279 + SYS_UTIMENSAT = 280 + SYS_EPOLL_PWAIT = 281 + SYS_SIGNALFD = 282 + SYS_TIMERFD_CREATE = 283 + SYS_EVENTFD = 284 + SYS_FALLOCATE = 285 + SYS_TIMERFD_SETTIME = 286 + SYS_TIMERFD_GETTIME = 287 + SYS_ACCEPT4 = 288 + SYS_SIGNALFD4 = 289 + SYS_EVENTFD2 = 290 + SYS_EPOLL_CREATE1 = 291 + SYS_DUP3 = 292 + SYS_PIPE2 = 293 + SYS_INOTIFY_INIT1 = 294 + SYS_PREADV = 295 + SYS_PWRITEV = 296 + SYS_RT_TGSIGQUEUEINFO = 297 + SYS_PERF_EVENT_OPEN = 298 + SYS_RECVMMSG = 299 + SYS_FANOTIFY_INIT = 300 + SYS_FANOTIFY_MARK = 301 + SYS_PRLIMIT64 = 302 + SYS_NAME_TO_HANDLE_AT = 303 + SYS_OPEN_BY_HANDLE_AT = 304 + SYS_CLOCK_ADJTIME = 305 + SYS_SYNCFS = 306 + SYS_SENDMMSG = 307 + SYS_SETNS = 308 + SYS_GETCPU = 309 + SYS_PROCESS_VM_READV = 310 + SYS_PROCESS_VM_WRITEV = 311 +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go new file mode 100644 index 0000000000000000000000000000000000000000..45ced17fc4cb516d630c6ef2c22d451fcbb47baa --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go @@ -0,0 +1,356 @@ +// mksysnum_linux.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build arm,linux + +package unix + +const ( + SYS_OABI_SYSCALL_BASE = 0 + SYS_SYSCALL_BASE = 0 + SYS_RESTART_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECVE = 11 + SYS_CHDIR = 12 + SYS_TIME = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LCHOWN = 16 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_MOUNT = 21 + SYS_UMOUNT = 22 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_STIME = 25 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_PAUSE = 29 + SYS_UTIME = 30 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_RENAME = 38 + SYS_MKDIR = 39 + SYS_RMDIR = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_BRK = 45 + SYS_SETGID = 46 + SYS_GETGID = 47 + SYS_GETEUID = 49 + SYS_GETEGID = 50 + SYS_ACCT = 51 + SYS_UMOUNT2 = 52 + SYS_IOCTL = 54 + SYS_FCNTL = 55 + SYS_SETPGID = 57 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_USTAT = 62 + SYS_DUP2 = 63 + SYS_GETPPID = 64 + SYS_GETPGRP = 65 + SYS_SETSID = 66 + SYS_SIGACTION = 67 + SYS_SETREUID = 70 + SYS_SETREGID = 71 + SYS_SIGSUSPEND = 72 + SYS_SIGPENDING = 73 + SYS_SETHOSTNAME = 74 + SYS_SETRLIMIT = 75 + SYS_GETRLIMIT = 76 + SYS_GETRUSAGE = 77 + SYS_GETTIMEOFDAY = 78 + SYS_SETTIMEOFDAY = 79 + SYS_GETGROUPS = 80 + SYS_SETGROUPS = 81 + SYS_SELECT = 82 + SYS_SYMLINK = 83 + SYS_READLINK = 85 + SYS_USELIB = 86 + SYS_SWAPON = 87 + SYS_REBOOT = 88 + SYS_READDIR = 89 + SYS_MMAP = 90 + SYS_MUNMAP = 91 + SYS_TRUNCATE = 92 + SYS_FTRUNCATE = 93 + SYS_FCHMOD = 94 + SYS_FCHOWN = 95 + SYS_GETPRIORITY = 96 + SYS_SETPRIORITY = 97 + SYS_STATFS = 99 + SYS_FSTATFS = 100 + SYS_SOCKETCALL = 102 + SYS_SYSLOG = 103 + SYS_SETITIMER = 104 + SYS_GETITIMER = 105 + SYS_STAT = 106 + SYS_LSTAT = 107 + SYS_FSTAT = 108 + SYS_VHANGUP = 111 + SYS_SYSCALL = 113 + SYS_WAIT4 = 114 + SYS_SWAPOFF = 115 + SYS_SYSINFO = 116 + SYS_IPC = 117 + SYS_FSYNC = 118 + SYS_SIGRETURN = 119 + SYS_CLONE = 120 + SYS_SETDOMAINNAME = 121 + SYS_UNAME = 122 + SYS_ADJTIMEX = 124 + SYS_MPROTECT = 125 + SYS_SIGPROCMASK = 126 + SYS_INIT_MODULE = 128 + SYS_DELETE_MODULE = 129 + SYS_QUOTACTL = 131 + SYS_GETPGID = 132 + SYS_FCHDIR = 133 + SYS_BDFLUSH = 134 + SYS_SYSFS = 135 + SYS_PERSONALITY = 136 + SYS_SETFSUID = 138 + SYS_SETFSGID = 139 + SYS__LLSEEK = 140 + SYS_GETDENTS = 141 + SYS__NEWSELECT = 142 + SYS_FLOCK = 143 + SYS_MSYNC = 144 + SYS_READV = 145 + SYS_WRITEV = 146 + SYS_GETSID = 147 + SYS_FDATASYNC = 148 + SYS__SYSCTL = 149 + SYS_MLOCK = 150 + SYS_MUNLOCK = 151 + SYS_MLOCKALL = 152 + SYS_MUNLOCKALL = 153 + SYS_SCHED_SETPARAM = 154 + SYS_SCHED_GETPARAM = 155 + SYS_SCHED_SETSCHEDULER = 156 + SYS_SCHED_GETSCHEDULER = 157 + SYS_SCHED_YIELD = 158 + SYS_SCHED_GET_PRIORITY_MAX = 159 + SYS_SCHED_GET_PRIORITY_MIN = 160 + SYS_SCHED_RR_GET_INTERVAL = 161 + SYS_NANOSLEEP = 162 + SYS_MREMAP = 163 + SYS_SETRESUID = 164 + SYS_GETRESUID = 165 + SYS_POLL = 168 + SYS_NFSSERVCTL = 169 + SYS_SETRESGID = 170 + SYS_GETRESGID = 171 + SYS_PRCTL = 172 + SYS_RT_SIGRETURN = 173 + SYS_RT_SIGACTION = 174 + SYS_RT_SIGPROCMASK = 175 + SYS_RT_SIGPENDING = 176 + SYS_RT_SIGTIMEDWAIT = 177 + SYS_RT_SIGQUEUEINFO = 178 + SYS_RT_SIGSUSPEND = 179 + SYS_PREAD64 = 180 + SYS_PWRITE64 = 181 + SYS_CHOWN = 182 + SYS_GETCWD = 183 + SYS_CAPGET = 184 + SYS_CAPSET = 185 + SYS_SIGALTSTACK = 186 + SYS_SENDFILE = 187 + SYS_VFORK = 190 + SYS_UGETRLIMIT = 191 + SYS_MMAP2 = 192 + SYS_TRUNCATE64 = 193 + SYS_FTRUNCATE64 = 194 + SYS_STAT64 = 195 + SYS_LSTAT64 = 196 + SYS_FSTAT64 = 197 + SYS_LCHOWN32 = 198 + SYS_GETUID32 = 199 + SYS_GETGID32 = 200 + SYS_GETEUID32 = 201 + SYS_GETEGID32 = 202 + SYS_SETREUID32 = 203 + SYS_SETREGID32 = 204 + SYS_GETGROUPS32 = 205 + SYS_SETGROUPS32 = 206 + SYS_FCHOWN32 = 207 + SYS_SETRESUID32 = 208 + SYS_GETRESUID32 = 209 + SYS_SETRESGID32 = 210 + SYS_GETRESGID32 = 211 + SYS_CHOWN32 = 212 + SYS_SETUID32 = 213 + SYS_SETGID32 = 214 + SYS_SETFSUID32 = 215 + SYS_SETFSGID32 = 216 + SYS_GETDENTS64 = 217 + SYS_PIVOT_ROOT = 218 + SYS_MINCORE = 219 + SYS_MADVISE = 220 + SYS_FCNTL64 = 221 + SYS_GETTID = 224 + SYS_READAHEAD = 225 + SYS_SETXATTR = 226 + SYS_LSETXATTR = 227 + SYS_FSETXATTR = 228 + SYS_GETXATTR = 229 + SYS_LGETXATTR = 230 + SYS_FGETXATTR = 231 + SYS_LISTXATTR = 232 + SYS_LLISTXATTR = 233 + SYS_FLISTXATTR = 234 + SYS_REMOVEXATTR = 235 + SYS_LREMOVEXATTR = 236 + SYS_FREMOVEXATTR = 237 + SYS_TKILL = 238 + SYS_SENDFILE64 = 239 + SYS_FUTEX = 240 + SYS_SCHED_SETAFFINITY = 241 + SYS_SCHED_GETAFFINITY = 242 + SYS_IO_SETUP = 243 + SYS_IO_DESTROY = 244 + SYS_IO_GETEVENTS = 245 + SYS_IO_SUBMIT = 246 + SYS_IO_CANCEL = 247 + SYS_EXIT_GROUP = 248 + SYS_LOOKUP_DCOOKIE = 249 + SYS_EPOLL_CREATE = 250 + SYS_EPOLL_CTL = 251 + SYS_EPOLL_WAIT = 252 + SYS_REMAP_FILE_PAGES = 253 + SYS_SET_TID_ADDRESS = 256 + SYS_TIMER_CREATE = 257 + SYS_TIMER_SETTIME = 258 + SYS_TIMER_GETTIME = 259 + SYS_TIMER_GETOVERRUN = 260 + SYS_TIMER_DELETE = 261 + SYS_CLOCK_SETTIME = 262 + SYS_CLOCK_GETTIME = 263 + SYS_CLOCK_GETRES = 264 + SYS_CLOCK_NANOSLEEP = 265 + SYS_STATFS64 = 266 + SYS_FSTATFS64 = 267 + SYS_TGKILL = 268 + SYS_UTIMES = 269 + SYS_ARM_FADVISE64_64 = 270 + SYS_PCICONFIG_IOBASE = 271 + SYS_PCICONFIG_READ = 272 + SYS_PCICONFIG_WRITE = 273 + SYS_MQ_OPEN = 274 + SYS_MQ_UNLINK = 275 + SYS_MQ_TIMEDSEND = 276 + SYS_MQ_TIMEDRECEIVE = 277 + SYS_MQ_NOTIFY = 278 + SYS_MQ_GETSETATTR = 279 + SYS_WAITID = 280 + SYS_SOCKET = 281 + SYS_BIND = 282 + SYS_CONNECT = 283 + SYS_LISTEN = 284 + SYS_ACCEPT = 285 + SYS_GETSOCKNAME = 286 + SYS_GETPEERNAME = 287 + SYS_SOCKETPAIR = 288 + SYS_SEND = 289 + SYS_SENDTO = 290 + SYS_RECV = 291 + SYS_RECVFROM = 292 + SYS_SHUTDOWN = 293 + SYS_SETSOCKOPT = 294 + SYS_GETSOCKOPT = 295 + SYS_SENDMSG = 296 + SYS_RECVMSG = 297 + SYS_SEMOP = 298 + SYS_SEMGET = 299 + SYS_SEMCTL = 300 + SYS_MSGSND = 301 + SYS_MSGRCV = 302 + SYS_MSGGET = 303 + SYS_MSGCTL = 304 + SYS_SHMAT = 305 + SYS_SHMDT = 306 + SYS_SHMGET = 307 + SYS_SHMCTL = 308 + SYS_ADD_KEY = 309 + SYS_REQUEST_KEY = 310 + SYS_KEYCTL = 311 + SYS_SEMTIMEDOP = 312 + SYS_VSERVER = 313 + SYS_IOPRIO_SET = 314 + SYS_IOPRIO_GET = 315 + SYS_INOTIFY_INIT = 316 + SYS_INOTIFY_ADD_WATCH = 317 + SYS_INOTIFY_RM_WATCH = 318 + SYS_MBIND = 319 + SYS_GET_MEMPOLICY = 320 + SYS_SET_MEMPOLICY = 321 + SYS_OPENAT = 322 + SYS_MKDIRAT = 323 + SYS_MKNODAT = 324 + SYS_FCHOWNAT = 325 + SYS_FUTIMESAT = 326 + SYS_FSTATAT64 = 327 + SYS_UNLINKAT = 328 + SYS_RENAMEAT = 329 + SYS_LINKAT = 330 + SYS_SYMLINKAT = 331 + SYS_READLINKAT = 332 + SYS_FCHMODAT = 333 + SYS_FACCESSAT = 334 + SYS_PSELECT6 = 335 + SYS_PPOLL = 336 + SYS_UNSHARE = 337 + SYS_SET_ROBUST_LIST = 338 + SYS_GET_ROBUST_LIST = 339 + SYS_SPLICE = 340 + SYS_ARM_SYNC_FILE_RANGE = 341 + SYS_TEE = 342 + SYS_VMSPLICE = 343 + SYS_MOVE_PAGES = 344 + SYS_GETCPU = 345 + SYS_EPOLL_PWAIT = 346 + SYS_KEXEC_LOAD = 347 + SYS_UTIMENSAT = 348 + SYS_SIGNALFD = 349 + SYS_TIMERFD_CREATE = 350 + SYS_EVENTFD = 351 + SYS_FALLOCATE = 352 + SYS_TIMERFD_SETTIME = 353 + SYS_TIMERFD_GETTIME = 354 + SYS_SIGNALFD4 = 355 + SYS_EVENTFD2 = 356 + SYS_EPOLL_CREATE1 = 357 + SYS_DUP3 = 358 + SYS_PIPE2 = 359 + SYS_INOTIFY_INIT1 = 360 + SYS_PREADV = 361 + SYS_PWRITEV = 362 + SYS_RT_TGSIGQUEUEINFO = 363 + SYS_PERF_EVENT_OPEN = 364 + SYS_RECVMMSG = 365 + SYS_ACCEPT4 = 366 + SYS_FANOTIFY_INIT = 367 + SYS_FANOTIFY_MARK = 368 + SYS_PRLIMIT64 = 369 + SYS_NAME_TO_HANDLE_AT = 370 + SYS_OPEN_BY_HANDLE_AT = 371 + SYS_CLOCK_ADJTIME = 372 + SYS_SYNCFS = 373 + SYS_SENDMMSG = 374 + SYS_SETNS = 375 + SYS_PROCESS_VM_READV = 376 + SYS_PROCESS_VM_WRITEV = 377 +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go new file mode 100644 index 0000000000000000000000000000000000000000..2e9514f280332d583879cbddbe56713a18cc3d10 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go @@ -0,0 +1,272 @@ +// mksysnum_linux.pl /usr/include/asm-generic/unistd.h +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build arm64,linux + +package unix + +const ( + SYS_IO_SETUP = 0 + SYS_IO_DESTROY = 1 + SYS_IO_SUBMIT = 2 + SYS_IO_CANCEL = 3 + SYS_IO_GETEVENTS = 4 + SYS_SETXATTR = 5 + SYS_LSETXATTR = 6 + SYS_FSETXATTR = 7 + SYS_GETXATTR = 8 + SYS_LGETXATTR = 9 + SYS_FGETXATTR = 10 + SYS_LISTXATTR = 11 + SYS_LLISTXATTR = 12 + SYS_FLISTXATTR = 13 + SYS_REMOVEXATTR = 14 + SYS_LREMOVEXATTR = 15 + SYS_FREMOVEXATTR = 16 + SYS_GETCWD = 17 + SYS_LOOKUP_DCOOKIE = 18 + SYS_EVENTFD2 = 19 + SYS_EPOLL_CREATE1 = 20 + SYS_EPOLL_CTL = 21 + SYS_EPOLL_PWAIT = 22 + SYS_DUP = 23 + SYS_DUP3 = 24 + SYS_FCNTL = 25 + SYS_INOTIFY_INIT1 = 26 + SYS_INOTIFY_ADD_WATCH = 27 + SYS_INOTIFY_RM_WATCH = 28 + SYS_IOCTL = 29 + SYS_IOPRIO_SET = 30 + SYS_IOPRIO_GET = 31 + SYS_FLOCK = 32 + SYS_MKNODAT = 33 + SYS_MKDIRAT = 34 + SYS_UNLINKAT = 35 + SYS_SYMLINKAT = 36 + SYS_LINKAT = 37 + SYS_RENAMEAT = 38 + SYS_UMOUNT2 = 39 + SYS_MOUNT = 40 + SYS_PIVOT_ROOT = 41 + SYS_NFSSERVCTL = 42 + SYS_STATFS = 43 + SYS_FSTATFS = 44 + SYS_TRUNCATE = 45 + SYS_FTRUNCATE = 46 + SYS_FALLOCATE = 47 + SYS_FACCESSAT = 48 + SYS_CHDIR = 49 + SYS_FCHDIR = 50 + SYS_CHROOT = 51 + SYS_FCHMOD = 52 + SYS_FCHMODAT = 53 + SYS_FCHOWNAT = 54 + SYS_FCHOWN = 55 + SYS_OPENAT = 56 + SYS_CLOSE = 57 + SYS_VHANGUP = 58 + SYS_PIPE2 = 59 + SYS_QUOTACTL = 60 + SYS_GETDENTS64 = 61 + SYS_LSEEK = 62 + SYS_READ = 63 + SYS_WRITE = 64 + SYS_READV = 65 + SYS_WRITEV = 66 + SYS_PREAD64 = 67 + SYS_PWRITE64 = 68 + SYS_PREADV = 69 + SYS_PWRITEV = 70 + SYS_SENDFILE = 71 + SYS_PSELECT6 = 72 + SYS_PPOLL = 73 + SYS_SIGNALFD4 = 74 + SYS_VMSPLICE = 75 + SYS_SPLICE = 76 + SYS_TEE = 77 + SYS_READLINKAT = 78 + SYS_FSTATAT = 79 + SYS_FSTAT = 80 + SYS_SYNC = 81 + SYS_FSYNC = 82 + SYS_FDATASYNC = 83 + SYS_SYNC_FILE_RANGE = 84 + SYS_TIMERFD_CREATE = 85 + SYS_TIMERFD_SETTIME = 86 + SYS_TIMERFD_GETTIME = 87 + SYS_UTIMENSAT = 88 + SYS_ACCT = 89 + SYS_CAPGET = 90 + SYS_CAPSET = 91 + SYS_PERSONALITY = 92 + SYS_EXIT = 93 + SYS_EXIT_GROUP = 94 + SYS_WAITID = 95 + SYS_SET_TID_ADDRESS = 96 + SYS_UNSHARE = 97 + SYS_FUTEX = 98 + SYS_SET_ROBUST_LIST = 99 + SYS_GET_ROBUST_LIST = 100 + SYS_NANOSLEEP = 101 + SYS_GETITIMER = 102 + SYS_SETITIMER = 103 + SYS_KEXEC_LOAD = 104 + SYS_INIT_MODULE = 105 + SYS_DELETE_MODULE = 106 + SYS_TIMER_CREATE = 107 + SYS_TIMER_GETTIME = 108 + SYS_TIMER_GETOVERRUN = 109 + SYS_TIMER_SETTIME = 110 + SYS_TIMER_DELETE = 111 + SYS_CLOCK_SETTIME = 112 + SYS_CLOCK_GETTIME = 113 + SYS_CLOCK_GETRES = 114 + SYS_CLOCK_NANOSLEEP = 115 + SYS_SYSLOG = 116 + SYS_PTRACE = 117 + SYS_SCHED_SETPARAM = 118 + SYS_SCHED_SETSCHEDULER = 119 + SYS_SCHED_GETSCHEDULER = 120 + SYS_SCHED_GETPARAM = 121 + SYS_SCHED_SETAFFINITY = 122 + SYS_SCHED_GETAFFINITY = 123 + SYS_SCHED_YIELD = 124 + SYS_SCHED_GET_PRIORITY_MAX = 125 + SYS_SCHED_GET_PRIORITY_MIN = 126 + SYS_SCHED_RR_GET_INTERVAL = 127 + SYS_RESTART_SYSCALL = 128 + SYS_KILL = 129 + SYS_TKILL = 130 + SYS_TGKILL = 131 + SYS_SIGALTSTACK = 132 + SYS_RT_SIGSUSPEND = 133 + SYS_RT_SIGACTION = 134 + SYS_RT_SIGPROCMASK = 135 + SYS_RT_SIGPENDING = 136 + SYS_RT_SIGTIMEDWAIT = 137 + SYS_RT_SIGQUEUEINFO = 138 + SYS_RT_SIGRETURN = 139 + SYS_SETPRIORITY = 140 + SYS_GETPRIORITY = 141 + SYS_REBOOT = 142 + SYS_SETREGID = 143 + SYS_SETGID = 144 + SYS_SETREUID = 145 + SYS_SETUID = 146 + SYS_SETRESUID = 147 + SYS_GETRESUID = 148 + SYS_SETRESGID = 149 + SYS_GETRESGID = 150 + SYS_SETFSUID = 151 + SYS_SETFSGID = 152 + SYS_TIMES = 153 + SYS_SETPGID = 154 + SYS_GETPGID = 155 + SYS_GETSID = 156 + SYS_SETSID = 157 + SYS_GETGROUPS = 158 + SYS_SETGROUPS = 159 + SYS_UNAME = 160 + SYS_SETHOSTNAME = 161 + SYS_SETDOMAINNAME = 162 + SYS_GETRLIMIT = 163 + SYS_SETRLIMIT = 164 + SYS_GETRUSAGE = 165 + SYS_UMASK = 166 + SYS_PRCTL = 167 + SYS_GETCPU = 168 + SYS_GETTIMEOFDAY = 169 + SYS_SETTIMEOFDAY = 170 + SYS_ADJTIMEX = 171 + SYS_GETPID = 172 + SYS_GETPPID = 173 + SYS_GETUID = 174 + SYS_GETEUID = 175 + SYS_GETGID = 176 + SYS_GETEGID = 177 + SYS_GETTID = 178 + SYS_SYSINFO = 179 + SYS_MQ_OPEN = 180 + SYS_MQ_UNLINK = 181 + SYS_MQ_TIMEDSEND = 182 + SYS_MQ_TIMEDRECEIVE = 183 + SYS_MQ_NOTIFY = 184 + SYS_MQ_GETSETATTR = 185 + SYS_MSGGET = 186 + SYS_MSGCTL = 187 + SYS_MSGRCV = 188 + SYS_MSGSND = 189 + SYS_SEMGET = 190 + SYS_SEMCTL = 191 + SYS_SEMTIMEDOP = 192 + SYS_SEMOP = 193 + SYS_SHMGET = 194 + SYS_SHMCTL = 195 + SYS_SHMAT = 196 + SYS_SHMDT = 197 + SYS_SOCKET = 198 + SYS_SOCKETPAIR = 199 + SYS_BIND = 200 + SYS_LISTEN = 201 + SYS_ACCEPT = 202 + SYS_CONNECT = 203 + SYS_GETSOCKNAME = 204 + SYS_GETPEERNAME = 205 + SYS_SENDTO = 206 + SYS_RECVFROM = 207 + SYS_SETSOCKOPT = 208 + SYS_GETSOCKOPT = 209 + SYS_SHUTDOWN = 210 + SYS_SENDMSG = 211 + SYS_RECVMSG = 212 + SYS_READAHEAD = 213 + SYS_BRK = 214 + SYS_MUNMAP = 215 + SYS_MREMAP = 216 + SYS_ADD_KEY = 217 + SYS_REQUEST_KEY = 218 + SYS_KEYCTL = 219 + SYS_CLONE = 220 + SYS_EXECVE = 221 + SYS_MMAP = 222 + SYS_FADVISE64 = 223 + SYS_SWAPON = 224 + SYS_SWAPOFF = 225 + SYS_MPROTECT = 226 + SYS_MSYNC = 227 + SYS_MLOCK = 228 + SYS_MUNLOCK = 229 + SYS_MLOCKALL = 230 + SYS_MUNLOCKALL = 231 + SYS_MINCORE = 232 + SYS_MADVISE = 233 + SYS_REMAP_FILE_PAGES = 234 + SYS_MBIND = 235 + SYS_GET_MEMPOLICY = 236 + SYS_SET_MEMPOLICY = 237 + SYS_MIGRATE_PAGES = 238 + SYS_MOVE_PAGES = 239 + SYS_RT_TGSIGQUEUEINFO = 240 + SYS_PERF_EVENT_OPEN = 241 + SYS_ACCEPT4 = 242 + SYS_RECVMMSG = 243 + SYS_ARCH_SPECIFIC_SYSCALL = 244 + SYS_WAIT4 = 260 + SYS_PRLIMIT64 = 261 + SYS_FANOTIFY_INIT = 262 + SYS_FANOTIFY_MARK = 263 + SYS_NAME_TO_HANDLE_AT = 264 + SYS_OPEN_BY_HANDLE_AT = 265 + SYS_CLOCK_ADJTIME = 266 + SYS_SYNCFS = 267 + SYS_SETNS = 268 + SYS_SENDMMSG = 269 + SYS_PROCESS_VM_READV = 270 + SYS_PROCESS_VM_WRITEV = 271 + SYS_KCMP = 272 + SYS_FINIT_MODULE = 273 + SYS_SCHED_SETATTR = 274 + SYS_SCHED_GETATTR = 275 + SYS_RENAMEAT2 = 276 + SYS_SECCOMP = 277 +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go new file mode 100644 index 0000000000000000000000000000000000000000..5ffe1c7191beb4f33024090a1dc23bd4bf6f9958 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go @@ -0,0 +1,327 @@ +// mksysnum_linux.pl /usr/include/asm/unistd.h +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build mips64,linux + +package unix + +const ( + SYS_READ = 5000 + SYS_WRITE = 5001 + SYS_OPEN = 5002 + SYS_CLOSE = 5003 + SYS_STAT = 5004 + SYS_FSTAT = 5005 + SYS_LSTAT = 5006 + SYS_POLL = 5007 + SYS_LSEEK = 5008 + SYS_MMAP = 5009 + SYS_MPROTECT = 5010 + SYS_MUNMAP = 5011 + SYS_BRK = 5012 + SYS_RT_SIGACTION = 5013 + SYS_RT_SIGPROCMASK = 5014 + SYS_IOCTL = 5015 + SYS_PREAD64 = 5016 + SYS_PWRITE64 = 5017 + SYS_READV = 5018 + SYS_WRITEV = 5019 + SYS_ACCESS = 5020 + SYS_PIPE = 5021 + SYS__NEWSELECT = 5022 + SYS_SCHED_YIELD = 5023 + SYS_MREMAP = 5024 + SYS_MSYNC = 5025 + SYS_MINCORE = 5026 + SYS_MADVISE = 5027 + SYS_SHMGET = 5028 + SYS_SHMAT = 5029 + SYS_SHMCTL = 5030 + SYS_DUP = 5031 + SYS_DUP2 = 5032 + SYS_PAUSE = 5033 + SYS_NANOSLEEP = 5034 + SYS_GETITIMER = 5035 + SYS_SETITIMER = 5036 + SYS_ALARM = 5037 + SYS_GETPID = 5038 + SYS_SENDFILE = 5039 + SYS_SOCKET = 5040 + SYS_CONNECT = 5041 + SYS_ACCEPT = 5042 + SYS_SENDTO = 5043 + SYS_RECVFROM = 5044 + SYS_SENDMSG = 5045 + SYS_RECVMSG = 5046 + SYS_SHUTDOWN = 5047 + SYS_BIND = 5048 + SYS_LISTEN = 5049 + SYS_GETSOCKNAME = 5050 + SYS_GETPEERNAME = 5051 + SYS_SOCKETPAIR = 5052 + SYS_SETSOCKOPT = 5053 + SYS_GETSOCKOPT = 5054 + SYS_CLONE = 5055 + SYS_FORK = 5056 + SYS_EXECVE = 5057 + SYS_EXIT = 5058 + SYS_WAIT4 = 5059 + SYS_KILL = 5060 + SYS_UNAME = 5061 + SYS_SEMGET = 5062 + SYS_SEMOP = 5063 + SYS_SEMCTL = 5064 + SYS_SHMDT = 5065 + SYS_MSGGET = 5066 + SYS_MSGSND = 5067 + SYS_MSGRCV = 5068 + SYS_MSGCTL = 5069 + SYS_FCNTL = 5070 + SYS_FLOCK = 5071 + SYS_FSYNC = 5072 + SYS_FDATASYNC = 5073 + SYS_TRUNCATE = 5074 + SYS_FTRUNCATE = 5075 + SYS_GETDENTS = 5076 + SYS_GETCWD = 5077 + SYS_CHDIR = 5078 + SYS_FCHDIR = 5079 + SYS_RENAME = 5080 + SYS_MKDIR = 5081 + SYS_RMDIR = 5082 + SYS_CREAT = 5083 + SYS_LINK = 5084 + SYS_UNLINK = 5085 + SYS_SYMLINK = 5086 + SYS_READLINK = 5087 + SYS_CHMOD = 5088 + SYS_FCHMOD = 5089 + SYS_CHOWN = 5090 + SYS_FCHOWN = 5091 + SYS_LCHOWN = 5092 + SYS_UMASK = 5093 + SYS_GETTIMEOFDAY = 5094 + SYS_GETRLIMIT = 5095 + SYS_GETRUSAGE = 5096 + SYS_SYSINFO = 5097 + SYS_TIMES = 5098 + SYS_PTRACE = 5099 + SYS_GETUID = 5100 + SYS_SYSLOG = 5101 + SYS_GETGID = 5102 + SYS_SETUID = 5103 + SYS_SETGID = 5104 + SYS_GETEUID = 5105 + SYS_GETEGID = 5106 + SYS_SETPGID = 5107 + SYS_GETPPID = 5108 + SYS_GETPGRP = 5109 + SYS_SETSID = 5110 + SYS_SETREUID = 5111 + SYS_SETREGID = 5112 + SYS_GETGROUPS = 5113 + SYS_SETGROUPS = 5114 + SYS_SETRESUID = 5115 + SYS_GETRESUID = 5116 + SYS_SETRESGID = 5117 + SYS_GETRESGID = 5118 + SYS_GETPGID = 5119 + SYS_SETFSUID = 5120 + SYS_SETFSGID = 5121 + SYS_GETSID = 5122 + SYS_CAPGET = 5123 + SYS_CAPSET = 5124 + SYS_RT_SIGPENDING = 5125 + SYS_RT_SIGTIMEDWAIT = 5126 + SYS_RT_SIGQUEUEINFO = 5127 + SYS_RT_SIGSUSPEND = 5128 + SYS_SIGALTSTACK = 5129 + SYS_UTIME = 5130 + SYS_MKNOD = 5131 + SYS_PERSONALITY = 5132 + SYS_USTAT = 5133 + SYS_STATFS = 5134 + SYS_FSTATFS = 5135 + SYS_SYSFS = 5136 + SYS_GETPRIORITY = 5137 + SYS_SETPRIORITY = 5138 + SYS_SCHED_SETPARAM = 5139 + SYS_SCHED_GETPARAM = 5140 + SYS_SCHED_SETSCHEDULER = 5141 + SYS_SCHED_GETSCHEDULER = 5142 + SYS_SCHED_GET_PRIORITY_MAX = 5143 + SYS_SCHED_GET_PRIORITY_MIN = 5144 + SYS_SCHED_RR_GET_INTERVAL = 5145 + SYS_MLOCK = 5146 + SYS_MUNLOCK = 5147 + SYS_MLOCKALL = 5148 + SYS_MUNLOCKALL = 5149 + SYS_VHANGUP = 5150 + SYS_PIVOT_ROOT = 5151 + SYS__SYSCTL = 5152 + SYS_PRCTL = 5153 + SYS_ADJTIMEX = 5154 + SYS_SETRLIMIT = 5155 + SYS_CHROOT = 5156 + SYS_SYNC = 5157 + SYS_ACCT = 5158 + SYS_SETTIMEOFDAY = 5159 + SYS_MOUNT = 5160 + SYS_UMOUNT2 = 5161 + SYS_SWAPON = 5162 + SYS_SWAPOFF = 5163 + SYS_REBOOT = 5164 + SYS_SETHOSTNAME = 5165 + SYS_SETDOMAINNAME = 5166 + SYS_CREATE_MODULE = 5167 + SYS_INIT_MODULE = 5168 + SYS_DELETE_MODULE = 5169 + SYS_GET_KERNEL_SYMS = 5170 + SYS_QUERY_MODULE = 5171 + SYS_QUOTACTL = 5172 + SYS_NFSSERVCTL = 5173 + SYS_GETPMSG = 5174 + SYS_PUTPMSG = 5175 + SYS_AFS_SYSCALL = 5176 + SYS_RESERVED177 = 5177 + SYS_GETTID = 5178 + SYS_READAHEAD = 5179 + SYS_SETXATTR = 5180 + SYS_LSETXATTR = 5181 + SYS_FSETXATTR = 5182 + SYS_GETXATTR = 5183 + SYS_LGETXATTR = 5184 + SYS_FGETXATTR = 5185 + SYS_LISTXATTR = 5186 + SYS_LLISTXATTR = 5187 + SYS_FLISTXATTR = 5188 + SYS_REMOVEXATTR = 5189 + SYS_LREMOVEXATTR = 5190 + SYS_FREMOVEXATTR = 5191 + SYS_TKILL = 5192 + SYS_RESERVED193 = 5193 + SYS_FUTEX = 5194 + SYS_SCHED_SETAFFINITY = 5195 + SYS_SCHED_GETAFFINITY = 5196 + SYS_CACHEFLUSH = 5197 + SYS_CACHECTL = 5198 + SYS_SYSMIPS = 5199 + SYS_IO_SETUP = 5200 + SYS_IO_DESTROY = 5201 + SYS_IO_GETEVENTS = 5202 + SYS_IO_SUBMIT = 5203 + SYS_IO_CANCEL = 5204 + SYS_EXIT_GROUP = 5205 + SYS_LOOKUP_DCOOKIE = 5206 + SYS_EPOLL_CREATE = 5207 + SYS_EPOLL_CTL = 5208 + SYS_EPOLL_WAIT = 5209 + SYS_REMAP_FILE_PAGES = 5210 + SYS_RT_SIGRETURN = 5211 + SYS_SET_TID_ADDRESS = 5212 + SYS_RESTART_SYSCALL = 5213 + SYS_SEMTIMEDOP = 5214 + SYS_FADVISE64 = 5215 + SYS_TIMER_CREATE = 5216 + SYS_TIMER_SETTIME = 5217 + SYS_TIMER_GETTIME = 5218 + SYS_TIMER_GETOVERRUN = 5219 + SYS_TIMER_DELETE = 5220 + SYS_CLOCK_SETTIME = 5221 + SYS_CLOCK_GETTIME = 5222 + SYS_CLOCK_GETRES = 5223 + SYS_CLOCK_NANOSLEEP = 5224 + SYS_TGKILL = 5225 + SYS_UTIMES = 5226 + SYS_MBIND = 5227 + SYS_GET_MEMPOLICY = 5228 + SYS_SET_MEMPOLICY = 5229 + SYS_MQ_OPEN = 5230 + SYS_MQ_UNLINK = 5231 + SYS_MQ_TIMEDSEND = 5232 + SYS_MQ_TIMEDRECEIVE = 5233 + SYS_MQ_NOTIFY = 5234 + SYS_MQ_GETSETATTR = 5235 + SYS_VSERVER = 5236 + SYS_WAITID = 5237 + SYS_ADD_KEY = 5239 + SYS_REQUEST_KEY = 5240 + SYS_KEYCTL = 5241 + SYS_SET_THREAD_AREA = 5242 + SYS_INOTIFY_INIT = 5243 + SYS_INOTIFY_ADD_WATCH = 5244 + SYS_INOTIFY_RM_WATCH = 5245 + SYS_MIGRATE_PAGES = 5246 + SYS_OPENAT = 5247 + SYS_MKDIRAT = 5248 + SYS_MKNODAT = 5249 + SYS_FCHOWNAT = 5250 + SYS_FUTIMESAT = 5251 + SYS_NEWFSTATAT = 5252 + SYS_UNLINKAT = 5253 + SYS_RENAMEAT = 5254 + SYS_LINKAT = 5255 + SYS_SYMLINKAT = 5256 + SYS_READLINKAT = 5257 + SYS_FCHMODAT = 5258 + SYS_FACCESSAT = 5259 + SYS_PSELECT6 = 5260 + SYS_PPOLL = 5261 + SYS_UNSHARE = 5262 + SYS_SPLICE = 5263 + SYS_SYNC_FILE_RANGE = 5264 + SYS_TEE = 5265 + SYS_VMSPLICE = 5266 + SYS_MOVE_PAGES = 5267 + SYS_SET_ROBUST_LIST = 5268 + SYS_GET_ROBUST_LIST = 5269 + SYS_KEXEC_LOAD = 5270 + SYS_GETCPU = 5271 + SYS_EPOLL_PWAIT = 5272 + SYS_IOPRIO_SET = 5273 + SYS_IOPRIO_GET = 5274 + SYS_UTIMENSAT = 5275 + SYS_SIGNALFD = 5276 + SYS_TIMERFD = 5277 + SYS_EVENTFD = 5278 + SYS_FALLOCATE = 5279 + SYS_TIMERFD_CREATE = 5280 + SYS_TIMERFD_GETTIME = 5281 + SYS_TIMERFD_SETTIME = 5282 + SYS_SIGNALFD4 = 5283 + SYS_EVENTFD2 = 5284 + SYS_EPOLL_CREATE1 = 5285 + SYS_DUP3 = 5286 + SYS_PIPE2 = 5287 + SYS_INOTIFY_INIT1 = 5288 + SYS_PREADV = 5289 + SYS_PWRITEV = 5290 + SYS_RT_TGSIGQUEUEINFO = 5291 + SYS_PERF_EVENT_OPEN = 5292 + SYS_ACCEPT4 = 5293 + SYS_RECVMMSG = 5294 + SYS_FANOTIFY_INIT = 5295 + SYS_FANOTIFY_MARK = 5296 + SYS_PRLIMIT64 = 5297 + SYS_NAME_TO_HANDLE_AT = 5298 + SYS_OPEN_BY_HANDLE_AT = 5299 + SYS_CLOCK_ADJTIME = 5300 + SYS_SYNCFS = 5301 + SYS_SENDMMSG = 5302 + SYS_SETNS = 5303 + SYS_PROCESS_VM_READV = 5304 + SYS_PROCESS_VM_WRITEV = 5305 + SYS_KCMP = 5306 + SYS_FINIT_MODULE = 5307 + SYS_GETDENTS64 = 5308 + SYS_SCHED_SETATTR = 5309 + SYS_SCHED_GETATTR = 5310 + SYS_RENAMEAT2 = 5311 + SYS_SECCOMP = 5312 + SYS_GETRANDOM = 5313 + SYS_MEMFD_CREATE = 5314 + SYS_BPF = 5315 + SYS_EXECVEAT = 5316 + SYS_USERFAULTFD = 5317 + SYS_MEMBARRIER = 5318 +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go new file mode 100644 index 0000000000000000000000000000000000000000..d192b940ce311d075ae594eed1e5956b2bc7dd3c --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go @@ -0,0 +1,327 @@ +// mksysnum_linux.pl /usr/include/asm/unistd.h +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build mips64le,linux + +package unix + +const ( + SYS_READ = 5000 + SYS_WRITE = 5001 + SYS_OPEN = 5002 + SYS_CLOSE = 5003 + SYS_STAT = 5004 + SYS_FSTAT = 5005 + SYS_LSTAT = 5006 + SYS_POLL = 5007 + SYS_LSEEK = 5008 + SYS_MMAP = 5009 + SYS_MPROTECT = 5010 + SYS_MUNMAP = 5011 + SYS_BRK = 5012 + SYS_RT_SIGACTION = 5013 + SYS_RT_SIGPROCMASK = 5014 + SYS_IOCTL = 5015 + SYS_PREAD64 = 5016 + SYS_PWRITE64 = 5017 + SYS_READV = 5018 + SYS_WRITEV = 5019 + SYS_ACCESS = 5020 + SYS_PIPE = 5021 + SYS__NEWSELECT = 5022 + SYS_SCHED_YIELD = 5023 + SYS_MREMAP = 5024 + SYS_MSYNC = 5025 + SYS_MINCORE = 5026 + SYS_MADVISE = 5027 + SYS_SHMGET = 5028 + SYS_SHMAT = 5029 + SYS_SHMCTL = 5030 + SYS_DUP = 5031 + SYS_DUP2 = 5032 + SYS_PAUSE = 5033 + SYS_NANOSLEEP = 5034 + SYS_GETITIMER = 5035 + SYS_SETITIMER = 5036 + SYS_ALARM = 5037 + SYS_GETPID = 5038 + SYS_SENDFILE = 5039 + SYS_SOCKET = 5040 + SYS_CONNECT = 5041 + SYS_ACCEPT = 5042 + SYS_SENDTO = 5043 + SYS_RECVFROM = 5044 + SYS_SENDMSG = 5045 + SYS_RECVMSG = 5046 + SYS_SHUTDOWN = 5047 + SYS_BIND = 5048 + SYS_LISTEN = 5049 + SYS_GETSOCKNAME = 5050 + SYS_GETPEERNAME = 5051 + SYS_SOCKETPAIR = 5052 + SYS_SETSOCKOPT = 5053 + SYS_GETSOCKOPT = 5054 + SYS_CLONE = 5055 + SYS_FORK = 5056 + SYS_EXECVE = 5057 + SYS_EXIT = 5058 + SYS_WAIT4 = 5059 + SYS_KILL = 5060 + SYS_UNAME = 5061 + SYS_SEMGET = 5062 + SYS_SEMOP = 5063 + SYS_SEMCTL = 5064 + SYS_SHMDT = 5065 + SYS_MSGGET = 5066 + SYS_MSGSND = 5067 + SYS_MSGRCV = 5068 + SYS_MSGCTL = 5069 + SYS_FCNTL = 5070 + SYS_FLOCK = 5071 + SYS_FSYNC = 5072 + SYS_FDATASYNC = 5073 + SYS_TRUNCATE = 5074 + SYS_FTRUNCATE = 5075 + SYS_GETDENTS = 5076 + SYS_GETCWD = 5077 + SYS_CHDIR = 5078 + SYS_FCHDIR = 5079 + SYS_RENAME = 5080 + SYS_MKDIR = 5081 + SYS_RMDIR = 5082 + SYS_CREAT = 5083 + SYS_LINK = 5084 + SYS_UNLINK = 5085 + SYS_SYMLINK = 5086 + SYS_READLINK = 5087 + SYS_CHMOD = 5088 + SYS_FCHMOD = 5089 + SYS_CHOWN = 5090 + SYS_FCHOWN = 5091 + SYS_LCHOWN = 5092 + SYS_UMASK = 5093 + SYS_GETTIMEOFDAY = 5094 + SYS_GETRLIMIT = 5095 + SYS_GETRUSAGE = 5096 + SYS_SYSINFO = 5097 + SYS_TIMES = 5098 + SYS_PTRACE = 5099 + SYS_GETUID = 5100 + SYS_SYSLOG = 5101 + SYS_GETGID = 5102 + SYS_SETUID = 5103 + SYS_SETGID = 5104 + SYS_GETEUID = 5105 + SYS_GETEGID = 5106 + SYS_SETPGID = 5107 + SYS_GETPPID = 5108 + SYS_GETPGRP = 5109 + SYS_SETSID = 5110 + SYS_SETREUID = 5111 + SYS_SETREGID = 5112 + SYS_GETGROUPS = 5113 + SYS_SETGROUPS = 5114 + SYS_SETRESUID = 5115 + SYS_GETRESUID = 5116 + SYS_SETRESGID = 5117 + SYS_GETRESGID = 5118 + SYS_GETPGID = 5119 + SYS_SETFSUID = 5120 + SYS_SETFSGID = 5121 + SYS_GETSID = 5122 + SYS_CAPGET = 5123 + SYS_CAPSET = 5124 + SYS_RT_SIGPENDING = 5125 + SYS_RT_SIGTIMEDWAIT = 5126 + SYS_RT_SIGQUEUEINFO = 5127 + SYS_RT_SIGSUSPEND = 5128 + SYS_SIGALTSTACK = 5129 + SYS_UTIME = 5130 + SYS_MKNOD = 5131 + SYS_PERSONALITY = 5132 + SYS_USTAT = 5133 + SYS_STATFS = 5134 + SYS_FSTATFS = 5135 + SYS_SYSFS = 5136 + SYS_GETPRIORITY = 5137 + SYS_SETPRIORITY = 5138 + SYS_SCHED_SETPARAM = 5139 + SYS_SCHED_GETPARAM = 5140 + SYS_SCHED_SETSCHEDULER = 5141 + SYS_SCHED_GETSCHEDULER = 5142 + SYS_SCHED_GET_PRIORITY_MAX = 5143 + SYS_SCHED_GET_PRIORITY_MIN = 5144 + SYS_SCHED_RR_GET_INTERVAL = 5145 + SYS_MLOCK = 5146 + SYS_MUNLOCK = 5147 + SYS_MLOCKALL = 5148 + SYS_MUNLOCKALL = 5149 + SYS_VHANGUP = 5150 + SYS_PIVOT_ROOT = 5151 + SYS__SYSCTL = 5152 + SYS_PRCTL = 5153 + SYS_ADJTIMEX = 5154 + SYS_SETRLIMIT = 5155 + SYS_CHROOT = 5156 + SYS_SYNC = 5157 + SYS_ACCT = 5158 + SYS_SETTIMEOFDAY = 5159 + SYS_MOUNT = 5160 + SYS_UMOUNT2 = 5161 + SYS_SWAPON = 5162 + SYS_SWAPOFF = 5163 + SYS_REBOOT = 5164 + SYS_SETHOSTNAME = 5165 + SYS_SETDOMAINNAME = 5166 + SYS_CREATE_MODULE = 5167 + SYS_INIT_MODULE = 5168 + SYS_DELETE_MODULE = 5169 + SYS_GET_KERNEL_SYMS = 5170 + SYS_QUERY_MODULE = 5171 + SYS_QUOTACTL = 5172 + SYS_NFSSERVCTL = 5173 + SYS_GETPMSG = 5174 + SYS_PUTPMSG = 5175 + SYS_AFS_SYSCALL = 5176 + SYS_RESERVED177 = 5177 + SYS_GETTID = 5178 + SYS_READAHEAD = 5179 + SYS_SETXATTR = 5180 + SYS_LSETXATTR = 5181 + SYS_FSETXATTR = 5182 + SYS_GETXATTR = 5183 + SYS_LGETXATTR = 5184 + SYS_FGETXATTR = 5185 + SYS_LISTXATTR = 5186 + SYS_LLISTXATTR = 5187 + SYS_FLISTXATTR = 5188 + SYS_REMOVEXATTR = 5189 + SYS_LREMOVEXATTR = 5190 + SYS_FREMOVEXATTR = 5191 + SYS_TKILL = 5192 + SYS_RESERVED193 = 5193 + SYS_FUTEX = 5194 + SYS_SCHED_SETAFFINITY = 5195 + SYS_SCHED_GETAFFINITY = 5196 + SYS_CACHEFLUSH = 5197 + SYS_CACHECTL = 5198 + SYS_SYSMIPS = 5199 + SYS_IO_SETUP = 5200 + SYS_IO_DESTROY = 5201 + SYS_IO_GETEVENTS = 5202 + SYS_IO_SUBMIT = 5203 + SYS_IO_CANCEL = 5204 + SYS_EXIT_GROUP = 5205 + SYS_LOOKUP_DCOOKIE = 5206 + SYS_EPOLL_CREATE = 5207 + SYS_EPOLL_CTL = 5208 + SYS_EPOLL_WAIT = 5209 + SYS_REMAP_FILE_PAGES = 5210 + SYS_RT_SIGRETURN = 5211 + SYS_SET_TID_ADDRESS = 5212 + SYS_RESTART_SYSCALL = 5213 + SYS_SEMTIMEDOP = 5214 + SYS_FADVISE64 = 5215 + SYS_TIMER_CREATE = 5216 + SYS_TIMER_SETTIME = 5217 + SYS_TIMER_GETTIME = 5218 + SYS_TIMER_GETOVERRUN = 5219 + SYS_TIMER_DELETE = 5220 + SYS_CLOCK_SETTIME = 5221 + SYS_CLOCK_GETTIME = 5222 + SYS_CLOCK_GETRES = 5223 + SYS_CLOCK_NANOSLEEP = 5224 + SYS_TGKILL = 5225 + SYS_UTIMES = 5226 + SYS_MBIND = 5227 + SYS_GET_MEMPOLICY = 5228 + SYS_SET_MEMPOLICY = 5229 + SYS_MQ_OPEN = 5230 + SYS_MQ_UNLINK = 5231 + SYS_MQ_TIMEDSEND = 5232 + SYS_MQ_TIMEDRECEIVE = 5233 + SYS_MQ_NOTIFY = 5234 + SYS_MQ_GETSETATTR = 5235 + SYS_VSERVER = 5236 + SYS_WAITID = 5237 + SYS_ADD_KEY = 5239 + SYS_REQUEST_KEY = 5240 + SYS_KEYCTL = 5241 + SYS_SET_THREAD_AREA = 5242 + SYS_INOTIFY_INIT = 5243 + SYS_INOTIFY_ADD_WATCH = 5244 + SYS_INOTIFY_RM_WATCH = 5245 + SYS_MIGRATE_PAGES = 5246 + SYS_OPENAT = 5247 + SYS_MKDIRAT = 5248 + SYS_MKNODAT = 5249 + SYS_FCHOWNAT = 5250 + SYS_FUTIMESAT = 5251 + SYS_NEWFSTATAT = 5252 + SYS_UNLINKAT = 5253 + SYS_RENAMEAT = 5254 + SYS_LINKAT = 5255 + SYS_SYMLINKAT = 5256 + SYS_READLINKAT = 5257 + SYS_FCHMODAT = 5258 + SYS_FACCESSAT = 5259 + SYS_PSELECT6 = 5260 + SYS_PPOLL = 5261 + SYS_UNSHARE = 5262 + SYS_SPLICE = 5263 + SYS_SYNC_FILE_RANGE = 5264 + SYS_TEE = 5265 + SYS_VMSPLICE = 5266 + SYS_MOVE_PAGES = 5267 + SYS_SET_ROBUST_LIST = 5268 + SYS_GET_ROBUST_LIST = 5269 + SYS_KEXEC_LOAD = 5270 + SYS_GETCPU = 5271 + SYS_EPOLL_PWAIT = 5272 + SYS_IOPRIO_SET = 5273 + SYS_IOPRIO_GET = 5274 + SYS_UTIMENSAT = 5275 + SYS_SIGNALFD = 5276 + SYS_TIMERFD = 5277 + SYS_EVENTFD = 5278 + SYS_FALLOCATE = 5279 + SYS_TIMERFD_CREATE = 5280 + SYS_TIMERFD_GETTIME = 5281 + SYS_TIMERFD_SETTIME = 5282 + SYS_SIGNALFD4 = 5283 + SYS_EVENTFD2 = 5284 + SYS_EPOLL_CREATE1 = 5285 + SYS_DUP3 = 5286 + SYS_PIPE2 = 5287 + SYS_INOTIFY_INIT1 = 5288 + SYS_PREADV = 5289 + SYS_PWRITEV = 5290 + SYS_RT_TGSIGQUEUEINFO = 5291 + SYS_PERF_EVENT_OPEN = 5292 + SYS_ACCEPT4 = 5293 + SYS_RECVMMSG = 5294 + SYS_FANOTIFY_INIT = 5295 + SYS_FANOTIFY_MARK = 5296 + SYS_PRLIMIT64 = 5297 + SYS_NAME_TO_HANDLE_AT = 5298 + SYS_OPEN_BY_HANDLE_AT = 5299 + SYS_CLOCK_ADJTIME = 5300 + SYS_SYNCFS = 5301 + SYS_SENDMMSG = 5302 + SYS_SETNS = 5303 + SYS_PROCESS_VM_READV = 5304 + SYS_PROCESS_VM_WRITEV = 5305 + SYS_KCMP = 5306 + SYS_FINIT_MODULE = 5307 + SYS_GETDENTS64 = 5308 + SYS_SCHED_SETATTR = 5309 + SYS_SCHED_GETATTR = 5310 + SYS_RENAMEAT2 = 5311 + SYS_SECCOMP = 5312 + SYS_GETRANDOM = 5313 + SYS_MEMFD_CREATE = 5314 + SYS_BPF = 5315 + SYS_EXECVEAT = 5316 + SYS_USERFAULTFD = 5317 + SYS_MEMBARRIER = 5318 +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go new file mode 100644 index 0000000000000000000000000000000000000000..e1b08f00d3b000f3651362d8eee74ec5738acc8a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go @@ -0,0 +1,360 @@ +// mksysnum_linux.pl /usr/include/asm/unistd.h +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build ppc64,linux + +package unix + +const ( + SYS_RESTART_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAITPID = 7 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECVE = 11 + SYS_CHDIR = 12 + SYS_TIME = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LCHOWN = 16 + SYS_BREAK = 17 + SYS_OLDSTAT = 18 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_MOUNT = 21 + SYS_UMOUNT = 22 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_STIME = 25 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_OLDFSTAT = 28 + SYS_PAUSE = 29 + SYS_UTIME = 30 + SYS_STTY = 31 + SYS_GTTY = 32 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_FTIME = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_RENAME = 38 + SYS_MKDIR = 39 + SYS_RMDIR = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_PROF = 44 + SYS_BRK = 45 + SYS_SETGID = 46 + SYS_GETGID = 47 + SYS_SIGNAL = 48 + SYS_GETEUID = 49 + SYS_GETEGID = 50 + SYS_ACCT = 51 + SYS_UMOUNT2 = 52 + SYS_LOCK = 53 + SYS_IOCTL = 54 + SYS_FCNTL = 55 + SYS_MPX = 56 + SYS_SETPGID = 57 + SYS_ULIMIT = 58 + SYS_OLDOLDUNAME = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_USTAT = 62 + SYS_DUP2 = 63 + SYS_GETPPID = 64 + SYS_GETPGRP = 65 + SYS_SETSID = 66 + SYS_SIGACTION = 67 + SYS_SGETMASK = 68 + SYS_SSETMASK = 69 + SYS_SETREUID = 70 + SYS_SETREGID = 71 + SYS_SIGSUSPEND = 72 + SYS_SIGPENDING = 73 + SYS_SETHOSTNAME = 74 + SYS_SETRLIMIT = 75 + SYS_GETRLIMIT = 76 + SYS_GETRUSAGE = 77 + SYS_GETTIMEOFDAY = 78 + SYS_SETTIMEOFDAY = 79 + SYS_GETGROUPS = 80 + SYS_SETGROUPS = 81 + SYS_SELECT = 82 + SYS_SYMLINK = 83 + SYS_OLDLSTAT = 84 + SYS_READLINK = 85 + SYS_USELIB = 86 + SYS_SWAPON = 87 + SYS_REBOOT = 88 + SYS_READDIR = 89 + SYS_MMAP = 90 + SYS_MUNMAP = 91 + SYS_TRUNCATE = 92 + SYS_FTRUNCATE = 93 + SYS_FCHMOD = 94 + SYS_FCHOWN = 95 + SYS_GETPRIORITY = 96 + SYS_SETPRIORITY = 97 + SYS_PROFIL = 98 + SYS_STATFS = 99 + SYS_FSTATFS = 100 + SYS_IOPERM = 101 + SYS_SOCKETCALL = 102 + SYS_SYSLOG = 103 + SYS_SETITIMER = 104 + SYS_GETITIMER = 105 + SYS_STAT = 106 + SYS_LSTAT = 107 + SYS_FSTAT = 108 + SYS_OLDUNAME = 109 + SYS_IOPL = 110 + SYS_VHANGUP = 111 + SYS_IDLE = 112 + SYS_VM86 = 113 + SYS_WAIT4 = 114 + SYS_SWAPOFF = 115 + SYS_SYSINFO = 116 + SYS_IPC = 117 + SYS_FSYNC = 118 + SYS_SIGRETURN = 119 + SYS_CLONE = 120 + SYS_SETDOMAINNAME = 121 + SYS_UNAME = 122 + SYS_MODIFY_LDT = 123 + SYS_ADJTIMEX = 124 + SYS_MPROTECT = 125 + SYS_SIGPROCMASK = 126 + SYS_CREATE_MODULE = 127 + SYS_INIT_MODULE = 128 + SYS_DELETE_MODULE = 129 + SYS_GET_KERNEL_SYMS = 130 + SYS_QUOTACTL = 131 + SYS_GETPGID = 132 + SYS_FCHDIR = 133 + SYS_BDFLUSH = 134 + SYS_SYSFS = 135 + SYS_PERSONALITY = 136 + SYS_AFS_SYSCALL = 137 + SYS_SETFSUID = 138 + SYS_SETFSGID = 139 + SYS__LLSEEK = 140 + SYS_GETDENTS = 141 + SYS__NEWSELECT = 142 + SYS_FLOCK = 143 + SYS_MSYNC = 144 + SYS_READV = 145 + SYS_WRITEV = 146 + SYS_GETSID = 147 + SYS_FDATASYNC = 148 + SYS__SYSCTL = 149 + SYS_MLOCK = 150 + SYS_MUNLOCK = 151 + SYS_MLOCKALL = 152 + SYS_MUNLOCKALL = 153 + SYS_SCHED_SETPARAM = 154 + SYS_SCHED_GETPARAM = 155 + SYS_SCHED_SETSCHEDULER = 156 + SYS_SCHED_GETSCHEDULER = 157 + SYS_SCHED_YIELD = 158 + SYS_SCHED_GET_PRIORITY_MAX = 159 + SYS_SCHED_GET_PRIORITY_MIN = 160 + SYS_SCHED_RR_GET_INTERVAL = 161 + SYS_NANOSLEEP = 162 + SYS_MREMAP = 163 + SYS_SETRESUID = 164 + SYS_GETRESUID = 165 + SYS_QUERY_MODULE = 166 + SYS_POLL = 167 + SYS_NFSSERVCTL = 168 + SYS_SETRESGID = 169 + SYS_GETRESGID = 170 + SYS_PRCTL = 171 + SYS_RT_SIGRETURN = 172 + SYS_RT_SIGACTION = 173 + SYS_RT_SIGPROCMASK = 174 + SYS_RT_SIGPENDING = 175 + SYS_RT_SIGTIMEDWAIT = 176 + SYS_RT_SIGQUEUEINFO = 177 + SYS_RT_SIGSUSPEND = 178 + SYS_PREAD64 = 179 + SYS_PWRITE64 = 180 + SYS_CHOWN = 181 + SYS_GETCWD = 182 + SYS_CAPGET = 183 + SYS_CAPSET = 184 + SYS_SIGALTSTACK = 185 + SYS_SENDFILE = 186 + SYS_GETPMSG = 187 + SYS_PUTPMSG = 188 + SYS_VFORK = 189 + SYS_UGETRLIMIT = 190 + SYS_READAHEAD = 191 + SYS_PCICONFIG_READ = 198 + SYS_PCICONFIG_WRITE = 199 + SYS_PCICONFIG_IOBASE = 200 + SYS_MULTIPLEXER = 201 + SYS_GETDENTS64 = 202 + SYS_PIVOT_ROOT = 203 + SYS_MADVISE = 205 + SYS_MINCORE = 206 + SYS_GETTID = 207 + SYS_TKILL = 208 + SYS_SETXATTR = 209 + SYS_LSETXATTR = 210 + SYS_FSETXATTR = 211 + SYS_GETXATTR = 212 + SYS_LGETXATTR = 213 + SYS_FGETXATTR = 214 + SYS_LISTXATTR = 215 + SYS_LLISTXATTR = 216 + SYS_FLISTXATTR = 217 + SYS_REMOVEXATTR = 218 + SYS_LREMOVEXATTR = 219 + SYS_FREMOVEXATTR = 220 + SYS_FUTEX = 221 + SYS_SCHED_SETAFFINITY = 222 + SYS_SCHED_GETAFFINITY = 223 + SYS_TUXCALL = 225 + SYS_IO_SETUP = 227 + SYS_IO_DESTROY = 228 + SYS_IO_GETEVENTS = 229 + SYS_IO_SUBMIT = 230 + SYS_IO_CANCEL = 231 + SYS_SET_TID_ADDRESS = 232 + SYS_FADVISE64 = 233 + SYS_EXIT_GROUP = 234 + SYS_LOOKUP_DCOOKIE = 235 + SYS_EPOLL_CREATE = 236 + SYS_EPOLL_CTL = 237 + SYS_EPOLL_WAIT = 238 + SYS_REMAP_FILE_PAGES = 239 + SYS_TIMER_CREATE = 240 + SYS_TIMER_SETTIME = 241 + SYS_TIMER_GETTIME = 242 + SYS_TIMER_GETOVERRUN = 243 + SYS_TIMER_DELETE = 244 + SYS_CLOCK_SETTIME = 245 + SYS_CLOCK_GETTIME = 246 + SYS_CLOCK_GETRES = 247 + SYS_CLOCK_NANOSLEEP = 248 + SYS_SWAPCONTEXT = 249 + SYS_TGKILL = 250 + SYS_UTIMES = 251 + SYS_STATFS64 = 252 + SYS_FSTATFS64 = 253 + SYS_RTAS = 255 + SYS_SYS_DEBUG_SETCONTEXT = 256 + SYS_MIGRATE_PAGES = 258 + SYS_MBIND = 259 + SYS_GET_MEMPOLICY = 260 + SYS_SET_MEMPOLICY = 261 + SYS_MQ_OPEN = 262 + SYS_MQ_UNLINK = 263 + SYS_MQ_TIMEDSEND = 264 + SYS_MQ_TIMEDRECEIVE = 265 + SYS_MQ_NOTIFY = 266 + SYS_MQ_GETSETATTR = 267 + SYS_KEXEC_LOAD = 268 + SYS_ADD_KEY = 269 + SYS_REQUEST_KEY = 270 + SYS_KEYCTL = 271 + SYS_WAITID = 272 + SYS_IOPRIO_SET = 273 + SYS_IOPRIO_GET = 274 + SYS_INOTIFY_INIT = 275 + SYS_INOTIFY_ADD_WATCH = 276 + SYS_INOTIFY_RM_WATCH = 277 + SYS_SPU_RUN = 278 + SYS_SPU_CREATE = 279 + SYS_PSELECT6 = 280 + SYS_PPOLL = 281 + SYS_UNSHARE = 282 + SYS_SPLICE = 283 + SYS_TEE = 284 + SYS_VMSPLICE = 285 + SYS_OPENAT = 286 + SYS_MKDIRAT = 287 + SYS_MKNODAT = 288 + SYS_FCHOWNAT = 289 + SYS_FUTIMESAT = 290 + SYS_NEWFSTATAT = 291 + SYS_UNLINKAT = 292 + SYS_RENAMEAT = 293 + SYS_LINKAT = 294 + SYS_SYMLINKAT = 295 + SYS_READLINKAT = 296 + SYS_FCHMODAT = 297 + SYS_FACCESSAT = 298 + SYS_GET_ROBUST_LIST = 299 + SYS_SET_ROBUST_LIST = 300 + SYS_MOVE_PAGES = 301 + SYS_GETCPU = 302 + SYS_EPOLL_PWAIT = 303 + SYS_UTIMENSAT = 304 + SYS_SIGNALFD = 305 + SYS_TIMERFD_CREATE = 306 + SYS_EVENTFD = 307 + SYS_SYNC_FILE_RANGE2 = 308 + SYS_FALLOCATE = 309 + SYS_SUBPAGE_PROT = 310 + SYS_TIMERFD_SETTIME = 311 + SYS_TIMERFD_GETTIME = 312 + SYS_SIGNALFD4 = 313 + SYS_EVENTFD2 = 314 + SYS_EPOLL_CREATE1 = 315 + SYS_DUP3 = 316 + SYS_PIPE2 = 317 + SYS_INOTIFY_INIT1 = 318 + SYS_PERF_EVENT_OPEN = 319 + SYS_PREADV = 320 + SYS_PWRITEV = 321 + SYS_RT_TGSIGQUEUEINFO = 322 + SYS_FANOTIFY_INIT = 323 + SYS_FANOTIFY_MARK = 324 + SYS_PRLIMIT64 = 325 + SYS_SOCKET = 326 + SYS_BIND = 327 + SYS_CONNECT = 328 + SYS_LISTEN = 329 + SYS_ACCEPT = 330 + SYS_GETSOCKNAME = 331 + SYS_GETPEERNAME = 332 + SYS_SOCKETPAIR = 333 + SYS_SEND = 334 + SYS_SENDTO = 335 + SYS_RECV = 336 + SYS_RECVFROM = 337 + SYS_SHUTDOWN = 338 + SYS_SETSOCKOPT = 339 + SYS_GETSOCKOPT = 340 + SYS_SENDMSG = 341 + SYS_RECVMSG = 342 + SYS_RECVMMSG = 343 + SYS_ACCEPT4 = 344 + SYS_NAME_TO_HANDLE_AT = 345 + SYS_OPEN_BY_HANDLE_AT = 346 + SYS_CLOCK_ADJTIME = 347 + SYS_SYNCFS = 348 + SYS_SENDMMSG = 349 + SYS_SETNS = 350 + SYS_PROCESS_VM_READV = 351 + SYS_PROCESS_VM_WRITEV = 352 + SYS_FINIT_MODULE = 353 + SYS_KCMP = 354 + SYS_SCHED_SETATTR = 355 + SYS_SCHED_GETATTR = 356 + SYS_RENAMEAT2 = 357 + SYS_SECCOMP = 358 + SYS_GETRANDOM = 359 + SYS_MEMFD_CREATE = 360 + SYS_BPF = 361 +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go new file mode 100644 index 0000000000000000000000000000000000000000..45e63f51a4323c189e88713df9fa09c14e710a1a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go @@ -0,0 +1,353 @@ +// mksysnum_linux.pl /usr/include/powerpc64le-linux-gnu/asm/unistd.h +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build ppc64le,linux + +package unix + +const ( + SYS_RESTART_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAITPID = 7 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECVE = 11 + SYS_CHDIR = 12 + SYS_TIME = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LCHOWN = 16 + SYS_BREAK = 17 + SYS_OLDSTAT = 18 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_MOUNT = 21 + SYS_UMOUNT = 22 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_STIME = 25 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_OLDFSTAT = 28 + SYS_PAUSE = 29 + SYS_UTIME = 30 + SYS_STTY = 31 + SYS_GTTY = 32 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_FTIME = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_RENAME = 38 + SYS_MKDIR = 39 + SYS_RMDIR = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_PROF = 44 + SYS_BRK = 45 + SYS_SETGID = 46 + SYS_GETGID = 47 + SYS_SIGNAL = 48 + SYS_GETEUID = 49 + SYS_GETEGID = 50 + SYS_ACCT = 51 + SYS_UMOUNT2 = 52 + SYS_LOCK = 53 + SYS_IOCTL = 54 + SYS_FCNTL = 55 + SYS_MPX = 56 + SYS_SETPGID = 57 + SYS_ULIMIT = 58 + SYS_OLDOLDUNAME = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_USTAT = 62 + SYS_DUP2 = 63 + SYS_GETPPID = 64 + SYS_GETPGRP = 65 + SYS_SETSID = 66 + SYS_SIGACTION = 67 + SYS_SGETMASK = 68 + SYS_SSETMASK = 69 + SYS_SETREUID = 70 + SYS_SETREGID = 71 + SYS_SIGSUSPEND = 72 + SYS_SIGPENDING = 73 + SYS_SETHOSTNAME = 74 + SYS_SETRLIMIT = 75 + SYS_GETRLIMIT = 76 + SYS_GETRUSAGE = 77 + SYS_GETTIMEOFDAY = 78 + SYS_SETTIMEOFDAY = 79 + SYS_GETGROUPS = 80 + SYS_SETGROUPS = 81 + SYS_SELECT = 82 + SYS_SYMLINK = 83 + SYS_OLDLSTAT = 84 + SYS_READLINK = 85 + SYS_USELIB = 86 + SYS_SWAPON = 87 + SYS_REBOOT = 88 + SYS_READDIR = 89 + SYS_MMAP = 90 + SYS_MUNMAP = 91 + SYS_TRUNCATE = 92 + SYS_FTRUNCATE = 93 + SYS_FCHMOD = 94 + SYS_FCHOWN = 95 + SYS_GETPRIORITY = 96 + SYS_SETPRIORITY = 97 + SYS_PROFIL = 98 + SYS_STATFS = 99 + SYS_FSTATFS = 100 + SYS_IOPERM = 101 + SYS_SOCKETCALL = 102 + SYS_SYSLOG = 103 + SYS_SETITIMER = 104 + SYS_GETITIMER = 105 + SYS_STAT = 106 + SYS_LSTAT = 107 + SYS_FSTAT = 108 + SYS_OLDUNAME = 109 + SYS_IOPL = 110 + SYS_VHANGUP = 111 + SYS_IDLE = 112 + SYS_VM86 = 113 + SYS_WAIT4 = 114 + SYS_SWAPOFF = 115 + SYS_SYSINFO = 116 + SYS_IPC = 117 + SYS_FSYNC = 118 + SYS_SIGRETURN = 119 + SYS_CLONE = 120 + SYS_SETDOMAINNAME = 121 + SYS_UNAME = 122 + SYS_MODIFY_LDT = 123 + SYS_ADJTIMEX = 124 + SYS_MPROTECT = 125 + SYS_SIGPROCMASK = 126 + SYS_CREATE_MODULE = 127 + SYS_INIT_MODULE = 128 + SYS_DELETE_MODULE = 129 + SYS_GET_KERNEL_SYMS = 130 + SYS_QUOTACTL = 131 + SYS_GETPGID = 132 + SYS_FCHDIR = 133 + SYS_BDFLUSH = 134 + SYS_SYSFS = 135 + SYS_PERSONALITY = 136 + SYS_AFS_SYSCALL = 137 + SYS_SETFSUID = 138 + SYS_SETFSGID = 139 + SYS__LLSEEK = 140 + SYS_GETDENTS = 141 + SYS__NEWSELECT = 142 + SYS_FLOCK = 143 + SYS_MSYNC = 144 + SYS_READV = 145 + SYS_WRITEV = 146 + SYS_GETSID = 147 + SYS_FDATASYNC = 148 + SYS__SYSCTL = 149 + SYS_MLOCK = 150 + SYS_MUNLOCK = 151 + SYS_MLOCKALL = 152 + SYS_MUNLOCKALL = 153 + SYS_SCHED_SETPARAM = 154 + SYS_SCHED_GETPARAM = 155 + SYS_SCHED_SETSCHEDULER = 156 + SYS_SCHED_GETSCHEDULER = 157 + SYS_SCHED_YIELD = 158 + SYS_SCHED_GET_PRIORITY_MAX = 159 + SYS_SCHED_GET_PRIORITY_MIN = 160 + SYS_SCHED_RR_GET_INTERVAL = 161 + SYS_NANOSLEEP = 162 + SYS_MREMAP = 163 + SYS_SETRESUID = 164 + SYS_GETRESUID = 165 + SYS_QUERY_MODULE = 166 + SYS_POLL = 167 + SYS_NFSSERVCTL = 168 + SYS_SETRESGID = 169 + SYS_GETRESGID = 170 + SYS_PRCTL = 171 + SYS_RT_SIGRETURN = 172 + SYS_RT_SIGACTION = 173 + SYS_RT_SIGPROCMASK = 174 + SYS_RT_SIGPENDING = 175 + SYS_RT_SIGTIMEDWAIT = 176 + SYS_RT_SIGQUEUEINFO = 177 + SYS_RT_SIGSUSPEND = 178 + SYS_PREAD64 = 179 + SYS_PWRITE64 = 180 + SYS_CHOWN = 181 + SYS_GETCWD = 182 + SYS_CAPGET = 183 + SYS_CAPSET = 184 + SYS_SIGALTSTACK = 185 + SYS_SENDFILE = 186 + SYS_GETPMSG = 187 + SYS_PUTPMSG = 188 + SYS_VFORK = 189 + SYS_UGETRLIMIT = 190 + SYS_READAHEAD = 191 + SYS_PCICONFIG_READ = 198 + SYS_PCICONFIG_WRITE = 199 + SYS_PCICONFIG_IOBASE = 200 + SYS_MULTIPLEXER = 201 + SYS_GETDENTS64 = 202 + SYS_PIVOT_ROOT = 203 + SYS_MADVISE = 205 + SYS_MINCORE = 206 + SYS_GETTID = 207 + SYS_TKILL = 208 + SYS_SETXATTR = 209 + SYS_LSETXATTR = 210 + SYS_FSETXATTR = 211 + SYS_GETXATTR = 212 + SYS_LGETXATTR = 213 + SYS_FGETXATTR = 214 + SYS_LISTXATTR = 215 + SYS_LLISTXATTR = 216 + SYS_FLISTXATTR = 217 + SYS_REMOVEXATTR = 218 + SYS_LREMOVEXATTR = 219 + SYS_FREMOVEXATTR = 220 + SYS_FUTEX = 221 + SYS_SCHED_SETAFFINITY = 222 + SYS_SCHED_GETAFFINITY = 223 + SYS_TUXCALL = 225 + SYS_IO_SETUP = 227 + SYS_IO_DESTROY = 228 + SYS_IO_GETEVENTS = 229 + SYS_IO_SUBMIT = 230 + SYS_IO_CANCEL = 231 + SYS_SET_TID_ADDRESS = 232 + SYS_FADVISE64 = 233 + SYS_EXIT_GROUP = 234 + SYS_LOOKUP_DCOOKIE = 235 + SYS_EPOLL_CREATE = 236 + SYS_EPOLL_CTL = 237 + SYS_EPOLL_WAIT = 238 + SYS_REMAP_FILE_PAGES = 239 + SYS_TIMER_CREATE = 240 + SYS_TIMER_SETTIME = 241 + SYS_TIMER_GETTIME = 242 + SYS_TIMER_GETOVERRUN = 243 + SYS_TIMER_DELETE = 244 + SYS_CLOCK_SETTIME = 245 + SYS_CLOCK_GETTIME = 246 + SYS_CLOCK_GETRES = 247 + SYS_CLOCK_NANOSLEEP = 248 + SYS_SWAPCONTEXT = 249 + SYS_TGKILL = 250 + SYS_UTIMES = 251 + SYS_STATFS64 = 252 + SYS_FSTATFS64 = 253 + SYS_RTAS = 255 + SYS_SYS_DEBUG_SETCONTEXT = 256 + SYS_MIGRATE_PAGES = 258 + SYS_MBIND = 259 + SYS_GET_MEMPOLICY = 260 + SYS_SET_MEMPOLICY = 261 + SYS_MQ_OPEN = 262 + SYS_MQ_UNLINK = 263 + SYS_MQ_TIMEDSEND = 264 + SYS_MQ_TIMEDRECEIVE = 265 + SYS_MQ_NOTIFY = 266 + SYS_MQ_GETSETATTR = 267 + SYS_KEXEC_LOAD = 268 + SYS_ADD_KEY = 269 + SYS_REQUEST_KEY = 270 + SYS_KEYCTL = 271 + SYS_WAITID = 272 + SYS_IOPRIO_SET = 273 + SYS_IOPRIO_GET = 274 + SYS_INOTIFY_INIT = 275 + SYS_INOTIFY_ADD_WATCH = 276 + SYS_INOTIFY_RM_WATCH = 277 + SYS_SPU_RUN = 278 + SYS_SPU_CREATE = 279 + SYS_PSELECT6 = 280 + SYS_PPOLL = 281 + SYS_UNSHARE = 282 + SYS_SPLICE = 283 + SYS_TEE = 284 + SYS_VMSPLICE = 285 + SYS_OPENAT = 286 + SYS_MKDIRAT = 287 + SYS_MKNODAT = 288 + SYS_FCHOWNAT = 289 + SYS_FUTIMESAT = 290 + SYS_NEWFSTATAT = 291 + SYS_UNLINKAT = 292 + SYS_RENAMEAT = 293 + SYS_LINKAT = 294 + SYS_SYMLINKAT = 295 + SYS_READLINKAT = 296 + SYS_FCHMODAT = 297 + SYS_FACCESSAT = 298 + SYS_GET_ROBUST_LIST = 299 + SYS_SET_ROBUST_LIST = 300 + SYS_MOVE_PAGES = 301 + SYS_GETCPU = 302 + SYS_EPOLL_PWAIT = 303 + SYS_UTIMENSAT = 304 + SYS_SIGNALFD = 305 + SYS_TIMERFD_CREATE = 306 + SYS_EVENTFD = 307 + SYS_SYNC_FILE_RANGE2 = 308 + SYS_FALLOCATE = 309 + SYS_SUBPAGE_PROT = 310 + SYS_TIMERFD_SETTIME = 311 + SYS_TIMERFD_GETTIME = 312 + SYS_SIGNALFD4 = 313 + SYS_EVENTFD2 = 314 + SYS_EPOLL_CREATE1 = 315 + SYS_DUP3 = 316 + SYS_PIPE2 = 317 + SYS_INOTIFY_INIT1 = 318 + SYS_PERF_EVENT_OPEN = 319 + SYS_PREADV = 320 + SYS_PWRITEV = 321 + SYS_RT_TGSIGQUEUEINFO = 322 + SYS_FANOTIFY_INIT = 323 + SYS_FANOTIFY_MARK = 324 + SYS_PRLIMIT64 = 325 + SYS_SOCKET = 326 + SYS_BIND = 327 + SYS_CONNECT = 328 + SYS_LISTEN = 329 + SYS_ACCEPT = 330 + SYS_GETSOCKNAME = 331 + SYS_GETPEERNAME = 332 + SYS_SOCKETPAIR = 333 + SYS_SEND = 334 + SYS_SENDTO = 335 + SYS_RECV = 336 + SYS_RECVFROM = 337 + SYS_SHUTDOWN = 338 + SYS_SETSOCKOPT = 339 + SYS_GETSOCKOPT = 340 + SYS_SENDMSG = 341 + SYS_RECVMSG = 342 + SYS_RECVMMSG = 343 + SYS_ACCEPT4 = 344 + SYS_NAME_TO_HANDLE_AT = 345 + SYS_OPEN_BY_HANDLE_AT = 346 + SYS_CLOCK_ADJTIME = 347 + SYS_SYNCFS = 348 + SYS_SENDMMSG = 349 + SYS_SETNS = 350 + SYS_PROCESS_VM_READV = 351 + SYS_PROCESS_VM_WRITEV = 352 + SYS_FINIT_MODULE = 353 + SYS_KCMP = 354 +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go new file mode 100644 index 0000000000000000000000000000000000000000..42d4f5cda8e309c4579454734757c1045b1233c2 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go @@ -0,0 +1,328 @@ +// mksysnum_linux.pl /usr/include/asm/unistd.h +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build s390x,linux + +package unix + +const ( + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_RESTART_SYSCALL = 7 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECVE = 11 + SYS_CHDIR = 12 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_MOUNT = 21 + SYS_UMOUNT = 22 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_PAUSE = 29 + SYS_UTIME = 30 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_RENAME = 38 + SYS_MKDIR = 39 + SYS_RMDIR = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_BRK = 45 + SYS_SIGNAL = 48 + SYS_ACCT = 51 + SYS_UMOUNT2 = 52 + SYS_IOCTL = 54 + SYS_FCNTL = 55 + SYS_SETPGID = 57 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_USTAT = 62 + SYS_DUP2 = 63 + SYS_GETPPID = 64 + SYS_GETPGRP = 65 + SYS_SETSID = 66 + SYS_SIGACTION = 67 + SYS_SIGSUSPEND = 72 + SYS_SIGPENDING = 73 + SYS_SETHOSTNAME = 74 + SYS_SETRLIMIT = 75 + SYS_GETRUSAGE = 77 + SYS_GETTIMEOFDAY = 78 + SYS_SETTIMEOFDAY = 79 + SYS_SYMLINK = 83 + SYS_READLINK = 85 + SYS_USELIB = 86 + SYS_SWAPON = 87 + SYS_REBOOT = 88 + SYS_READDIR = 89 + SYS_MMAP = 90 + SYS_MUNMAP = 91 + SYS_TRUNCATE = 92 + SYS_FTRUNCATE = 93 + SYS_FCHMOD = 94 + SYS_GETPRIORITY = 96 + SYS_SETPRIORITY = 97 + SYS_STATFS = 99 + SYS_FSTATFS = 100 + SYS_SOCKETCALL = 102 + SYS_SYSLOG = 103 + SYS_SETITIMER = 104 + SYS_GETITIMER = 105 + SYS_STAT = 106 + SYS_LSTAT = 107 + SYS_FSTAT = 108 + SYS_LOOKUP_DCOOKIE = 110 + SYS_VHANGUP = 111 + SYS_IDLE = 112 + SYS_WAIT4 = 114 + SYS_SWAPOFF = 115 + SYS_SYSINFO = 116 + SYS_IPC = 117 + SYS_FSYNC = 118 + SYS_SIGRETURN = 119 + SYS_CLONE = 120 + SYS_SETDOMAINNAME = 121 + SYS_UNAME = 122 + SYS_ADJTIMEX = 124 + SYS_MPROTECT = 125 + SYS_SIGPROCMASK = 126 + SYS_CREATE_MODULE = 127 + SYS_INIT_MODULE = 128 + SYS_DELETE_MODULE = 129 + SYS_GET_KERNEL_SYMS = 130 + SYS_QUOTACTL = 131 + SYS_GETPGID = 132 + SYS_FCHDIR = 133 + SYS_BDFLUSH = 134 + SYS_SYSFS = 135 + SYS_PERSONALITY = 136 + SYS_AFS_SYSCALL = 137 + SYS_GETDENTS = 141 + SYS_FLOCK = 143 + SYS_MSYNC = 144 + SYS_READV = 145 + SYS_WRITEV = 146 + SYS_GETSID = 147 + SYS_FDATASYNC = 148 + SYS__SYSCTL = 149 + SYS_MLOCK = 150 + SYS_MUNLOCK = 151 + SYS_MLOCKALL = 152 + SYS_MUNLOCKALL = 153 + SYS_SCHED_SETPARAM = 154 + SYS_SCHED_GETPARAM = 155 + SYS_SCHED_SETSCHEDULER = 156 + SYS_SCHED_GETSCHEDULER = 157 + SYS_SCHED_YIELD = 158 + SYS_SCHED_GET_PRIORITY_MAX = 159 + SYS_SCHED_GET_PRIORITY_MIN = 160 + SYS_SCHED_RR_GET_INTERVAL = 161 + SYS_NANOSLEEP = 162 + SYS_MREMAP = 163 + SYS_QUERY_MODULE = 167 + SYS_POLL = 168 + SYS_NFSSERVCTL = 169 + SYS_PRCTL = 172 + SYS_RT_SIGRETURN = 173 + SYS_RT_SIGACTION = 174 + SYS_RT_SIGPROCMASK = 175 + SYS_RT_SIGPENDING = 176 + SYS_RT_SIGTIMEDWAIT = 177 + SYS_RT_SIGQUEUEINFO = 178 + SYS_RT_SIGSUSPEND = 179 + SYS_PREAD64 = 180 + SYS_PWRITE64 = 181 + SYS_GETCWD = 183 + SYS_CAPGET = 184 + SYS_CAPSET = 185 + SYS_SIGALTSTACK = 186 + SYS_SENDFILE = 187 + SYS_GETPMSG = 188 + SYS_PUTPMSG = 189 + SYS_VFORK = 190 + SYS_PIVOT_ROOT = 217 + SYS_MINCORE = 218 + SYS_MADVISE = 219 + SYS_GETDENTS64 = 220 + SYS_READAHEAD = 222 + SYS_SETXATTR = 224 + SYS_LSETXATTR = 225 + SYS_FSETXATTR = 226 + SYS_GETXATTR = 227 + SYS_LGETXATTR = 228 + SYS_FGETXATTR = 229 + SYS_LISTXATTR = 230 + SYS_LLISTXATTR = 231 + SYS_FLISTXATTR = 232 + SYS_REMOVEXATTR = 233 + SYS_LREMOVEXATTR = 234 + SYS_FREMOVEXATTR = 235 + SYS_GETTID = 236 + SYS_TKILL = 237 + SYS_FUTEX = 238 + SYS_SCHED_SETAFFINITY = 239 + SYS_SCHED_GETAFFINITY = 240 + SYS_TGKILL = 241 + SYS_IO_SETUP = 243 + SYS_IO_DESTROY = 244 + SYS_IO_GETEVENTS = 245 + SYS_IO_SUBMIT = 246 + SYS_IO_CANCEL = 247 + SYS_EXIT_GROUP = 248 + SYS_EPOLL_CREATE = 249 + SYS_EPOLL_CTL = 250 + SYS_EPOLL_WAIT = 251 + SYS_SET_TID_ADDRESS = 252 + SYS_FADVISE64 = 253 + SYS_TIMER_CREATE = 254 + SYS_TIMER_SETTIME = 255 + SYS_TIMER_GETTIME = 256 + SYS_TIMER_GETOVERRUN = 257 + SYS_TIMER_DELETE = 258 + SYS_CLOCK_SETTIME = 259 + SYS_CLOCK_GETTIME = 260 + SYS_CLOCK_GETRES = 261 + SYS_CLOCK_NANOSLEEP = 262 + SYS_STATFS64 = 265 + SYS_FSTATFS64 = 266 + SYS_REMAP_FILE_PAGES = 267 + SYS_MBIND = 268 + SYS_GET_MEMPOLICY = 269 + SYS_SET_MEMPOLICY = 270 + SYS_MQ_OPEN = 271 + SYS_MQ_UNLINK = 272 + SYS_MQ_TIMEDSEND = 273 + SYS_MQ_TIMEDRECEIVE = 274 + SYS_MQ_NOTIFY = 275 + SYS_MQ_GETSETATTR = 276 + SYS_KEXEC_LOAD = 277 + SYS_ADD_KEY = 278 + SYS_REQUEST_KEY = 279 + SYS_KEYCTL = 280 + SYS_WAITID = 281 + SYS_IOPRIO_SET = 282 + SYS_IOPRIO_GET = 283 + SYS_INOTIFY_INIT = 284 + SYS_INOTIFY_ADD_WATCH = 285 + SYS_INOTIFY_RM_WATCH = 286 + SYS_MIGRATE_PAGES = 287 + SYS_OPENAT = 288 + SYS_MKDIRAT = 289 + SYS_MKNODAT = 290 + SYS_FCHOWNAT = 291 + SYS_FUTIMESAT = 292 + SYS_UNLINKAT = 294 + SYS_RENAMEAT = 295 + SYS_LINKAT = 296 + SYS_SYMLINKAT = 297 + SYS_READLINKAT = 298 + SYS_FCHMODAT = 299 + SYS_FACCESSAT = 300 + SYS_PSELECT6 = 301 + SYS_PPOLL = 302 + SYS_UNSHARE = 303 + SYS_SET_ROBUST_LIST = 304 + SYS_GET_ROBUST_LIST = 305 + SYS_SPLICE = 306 + SYS_SYNC_FILE_RANGE = 307 + SYS_TEE = 308 + SYS_VMSPLICE = 309 + SYS_MOVE_PAGES = 310 + SYS_GETCPU = 311 + SYS_EPOLL_PWAIT = 312 + SYS_UTIMES = 313 + SYS_FALLOCATE = 314 + SYS_UTIMENSAT = 315 + SYS_SIGNALFD = 316 + SYS_TIMERFD = 317 + SYS_EVENTFD = 318 + SYS_TIMERFD_CREATE = 319 + SYS_TIMERFD_SETTIME = 320 + SYS_TIMERFD_GETTIME = 321 + SYS_SIGNALFD4 = 322 + SYS_EVENTFD2 = 323 + SYS_INOTIFY_INIT1 = 324 + SYS_PIPE2 = 325 + SYS_DUP3 = 326 + SYS_EPOLL_CREATE1 = 327 + SYS_PREADV = 328 + SYS_PWRITEV = 329 + SYS_RT_TGSIGQUEUEINFO = 330 + SYS_PERF_EVENT_OPEN = 331 + SYS_FANOTIFY_INIT = 332 + SYS_FANOTIFY_MARK = 333 + SYS_PRLIMIT64 = 334 + SYS_NAME_TO_HANDLE_AT = 335 + SYS_OPEN_BY_HANDLE_AT = 336 + SYS_CLOCK_ADJTIME = 337 + SYS_SYNCFS = 338 + SYS_SETNS = 339 + SYS_PROCESS_VM_READV = 340 + SYS_PROCESS_VM_WRITEV = 341 + SYS_S390_RUNTIME_INSTR = 342 + SYS_KCMP = 343 + SYS_FINIT_MODULE = 344 + SYS_SCHED_SETATTR = 345 + SYS_SCHED_GETATTR = 346 + SYS_RENAMEAT2 = 347 + SYS_SECCOMP = 348 + SYS_GETRANDOM = 349 + SYS_MEMFD_CREATE = 350 + SYS_BPF = 351 + SYS_S390_PCI_MMIO_WRITE = 352 + SYS_S390_PCI_MMIO_READ = 353 + SYS_EXECVEAT = 354 + SYS_USERFAULTFD = 355 + SYS_MEMBARRIER = 356 + SYS_RECVMMSG = 357 + SYS_SENDMMSG = 358 + SYS_SOCKET = 359 + SYS_SOCKETPAIR = 360 + SYS_BIND = 361 + SYS_CONNECT = 362 + SYS_LISTEN = 363 + SYS_ACCEPT4 = 364 + SYS_GETSOCKOPT = 365 + SYS_SETSOCKOPT = 366 + SYS_GETSOCKNAME = 367 + SYS_GETPEERNAME = 368 + SYS_SENDTO = 369 + SYS_SENDMSG = 370 + SYS_RECVFROM = 371 + SYS_RECVMSG = 372 + SYS_SHUTDOWN = 373 + SYS_MLOCK2 = 374 + SYS_SELECT = 142 + SYS_GETRLIMIT = 191 + SYS_LCHOWN = 198 + SYS_GETUID = 199 + SYS_GETGID = 200 + SYS_GETEUID = 201 + SYS_GETEGID = 202 + SYS_SETREUID = 203 + SYS_SETREGID = 204 + SYS_GETGROUPS = 205 + SYS_SETGROUPS = 206 + SYS_FCHOWN = 207 + SYS_SETRESUID = 208 + SYS_GETRESUID = 209 + SYS_SETRESGID = 210 + SYS_GETRESGID = 211 + SYS_CHOWN = 212 + SYS_SETUID = 213 + SYS_SETGID = 214 + SYS_SETFSUID = 215 + SYS_SETFSGID = 216 + SYS_NEWFSTATAT = 293 +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go new file mode 100644 index 0000000000000000000000000000000000000000..f60d8f988230b34128c371d25f6985664208f664 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go @@ -0,0 +1,273 @@ +// mksysnum_netbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build 386,netbsd + +package unix + +const ( + SYS_EXIT = 1 // { void|sys||exit(int rval); } + SYS_FORK = 2 // { int|sys||fork(void); } + SYS_READ = 3 // { ssize_t|sys||read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t|sys||write(int fd, const void *buf, size_t nbyte); } + SYS_OPEN = 5 // { int|sys||open(const char *path, int flags, ... mode_t mode); } + SYS_CLOSE = 6 // { int|sys||close(int fd); } + SYS_LINK = 9 // { int|sys||link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int|sys||unlink(const char *path); } + SYS_CHDIR = 12 // { int|sys||chdir(const char *path); } + SYS_FCHDIR = 13 // { int|sys||fchdir(int fd); } + SYS_CHMOD = 15 // { int|sys||chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int|sys||chown(const char *path, uid_t uid, gid_t gid); } + SYS_BREAK = 17 // { int|sys||obreak(char *nsize); } + SYS_GETPID = 20 // { pid_t|sys||getpid_with_ppid(void); } + SYS_UNMOUNT = 22 // { int|sys||unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int|sys||setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t|sys||getuid_with_euid(void); } + SYS_GETEUID = 25 // { uid_t|sys||geteuid(void); } + SYS_PTRACE = 26 // { int|sys||ptrace(int req, pid_t pid, void *addr, int data); } + SYS_RECVMSG = 27 // { ssize_t|sys||recvmsg(int s, struct msghdr *msg, int flags); } + SYS_SENDMSG = 28 // { ssize_t|sys||sendmsg(int s, const struct msghdr *msg, int flags); } + SYS_RECVFROM = 29 // { ssize_t|sys||recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlenaddr); } + SYS_ACCEPT = 30 // { int|sys||accept(int s, struct sockaddr *name, socklen_t *anamelen); } + SYS_GETPEERNAME = 31 // { int|sys||getpeername(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_GETSOCKNAME = 32 // { int|sys||getsockname(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_ACCESS = 33 // { int|sys||access(const char *path, int flags); } + SYS_CHFLAGS = 34 // { int|sys||chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int|sys||fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { void|sys||sync(void); } + SYS_KILL = 37 // { int|sys||kill(pid_t pid, int signum); } + SYS_GETPPID = 39 // { pid_t|sys||getppid(void); } + SYS_DUP = 41 // { int|sys||dup(int fd); } + SYS_PIPE = 42 // { int|sys||pipe(void); } + SYS_GETEGID = 43 // { gid_t|sys||getegid(void); } + SYS_PROFIL = 44 // { int|sys||profil(char *samples, size_t size, u_long offset, u_int scale); } + SYS_KTRACE = 45 // { int|sys||ktrace(const char *fname, int ops, int facs, pid_t pid); } + SYS_GETGID = 47 // { gid_t|sys||getgid_with_egid(void); } + SYS___GETLOGIN = 49 // { int|sys||__getlogin(char *namebuf, size_t namelen); } + SYS___SETLOGIN = 50 // { int|sys||__setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int|sys||acct(const char *path); } + SYS_IOCTL = 54 // { int|sys||ioctl(int fd, u_long com, ... void *data); } + SYS_REVOKE = 56 // { int|sys||revoke(const char *path); } + SYS_SYMLINK = 57 // { int|sys||symlink(const char *path, const char *link); } + SYS_READLINK = 58 // { ssize_t|sys||readlink(const char *path, char *buf, size_t count); } + SYS_EXECVE = 59 // { int|sys||execve(const char *path, char * const *argp, char * const *envp); } + SYS_UMASK = 60 // { mode_t|sys||umask(mode_t newmask); } + SYS_CHROOT = 61 // { int|sys||chroot(const char *path); } + SYS_VFORK = 66 // { int|sys||vfork(void); } + SYS_SBRK = 69 // { int|sys||sbrk(intptr_t incr); } + SYS_SSTK = 70 // { int|sys||sstk(int incr); } + SYS_VADVISE = 72 // { int|sys||ovadvise(int anom); } + SYS_MUNMAP = 73 // { int|sys||munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int|sys||mprotect(void *addr, size_t len, int prot); } + SYS_MADVISE = 75 // { int|sys||madvise(void *addr, size_t len, int behav); } + SYS_MINCORE = 78 // { int|sys||mincore(void *addr, size_t len, char *vec); } + SYS_GETGROUPS = 79 // { int|sys||getgroups(int gidsetsize, gid_t *gidset); } + SYS_SETGROUPS = 80 // { int|sys||setgroups(int gidsetsize, const gid_t *gidset); } + SYS_GETPGRP = 81 // { int|sys||getpgrp(void); } + SYS_SETPGID = 82 // { int|sys||setpgid(pid_t pid, pid_t pgid); } + SYS_DUP2 = 90 // { int|sys||dup2(int from, int to); } + SYS_FCNTL = 92 // { int|sys||fcntl(int fd, int cmd, ... void *arg); } + SYS_FSYNC = 95 // { int|sys||fsync(int fd); } + SYS_SETPRIORITY = 96 // { int|sys||setpriority(int which, id_t who, int prio); } + SYS_CONNECT = 98 // { int|sys||connect(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_GETPRIORITY = 100 // { int|sys||getpriority(int which, id_t who); } + SYS_BIND = 104 // { int|sys||bind(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_SETSOCKOPT = 105 // { int|sys||setsockopt(int s, int level, int name, const void *val, socklen_t valsize); } + SYS_LISTEN = 106 // { int|sys||listen(int s, int backlog); } + SYS_GETSOCKOPT = 118 // { int|sys||getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); } + SYS_READV = 120 // { ssize_t|sys||readv(int fd, const struct iovec *iovp, int iovcnt); } + SYS_WRITEV = 121 // { ssize_t|sys||writev(int fd, const struct iovec *iovp, int iovcnt); } + SYS_FCHOWN = 123 // { int|sys||fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int|sys||fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int|sys||setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int|sys||setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int|sys||rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int|sys||flock(int fd, int how); } + SYS_MKFIFO = 132 // { int|sys||mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t|sys||sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); } + SYS_SHUTDOWN = 134 // { int|sys||shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int|sys||socketpair(int domain, int type, int protocol, int *rsv); } + SYS_MKDIR = 136 // { int|sys||mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int|sys||rmdir(const char *path); } + SYS_SETSID = 147 // { int|sys||setsid(void); } + SYS_SYSARCH = 165 // { int|sys||sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t|sys||pread(int fd, void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_PWRITE = 174 // { ssize_t|sys||pwrite(int fd, const void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_NTP_ADJTIME = 176 // { int|sys||ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int|sys||setgid(gid_t gid); } + SYS_SETEGID = 182 // { int|sys||setegid(gid_t egid); } + SYS_SETEUID = 183 // { int|sys||seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long|sys||pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long|sys||fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int|sys||getrlimit(int which, struct rlimit *rlp); } + SYS_SETRLIMIT = 195 // { int|sys||setrlimit(int which, const struct rlimit *rlp); } + SYS_MMAP = 197 // { void *|sys||mmap(void *addr, size_t len, int prot, int flags, int fd, long PAD, off_t pos); } + SYS_LSEEK = 199 // { off_t|sys||lseek(int fd, int PAD, off_t offset, int whence); } + SYS_TRUNCATE = 200 // { int|sys||truncate(const char *path, int PAD, off_t length); } + SYS_FTRUNCATE = 201 // { int|sys||ftruncate(int fd, int PAD, off_t length); } + SYS___SYSCTL = 202 // { int|sys||__sysctl(const int *name, u_int namelen, void *old, size_t *oldlenp, const void *new, size_t newlen); } + SYS_MLOCK = 203 // { int|sys||mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int|sys||munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int|sys||undelete(const char *path); } + SYS_GETPGID = 207 // { pid_t|sys||getpgid(pid_t pid); } + SYS_REBOOT = 208 // { int|sys||reboot(int opt, char *bootstr); } + SYS_POLL = 209 // { int|sys||poll(struct pollfd *fds, u_int nfds, int timeout); } + SYS_SEMGET = 221 // { int|sys||semget(key_t key, int nsems, int semflg); } + SYS_SEMOP = 222 // { int|sys||semop(int semid, struct sembuf *sops, size_t nsops); } + SYS_SEMCONFIG = 223 // { int|sys||semconfig(int flag); } + SYS_MSGGET = 225 // { int|sys||msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int|sys||msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } + SYS_MSGRCV = 227 // { ssize_t|sys||msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_SHMAT = 228 // { void *|sys||shmat(int shmid, const void *shmaddr, int shmflg); } + SYS_SHMDT = 230 // { int|sys||shmdt(const void *shmaddr); } + SYS_SHMGET = 231 // { int|sys||shmget(key_t key, size_t size, int shmflg); } + SYS_TIMER_CREATE = 235 // { int|sys||timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); } + SYS_TIMER_DELETE = 236 // { int|sys||timer_delete(timer_t timerid); } + SYS_TIMER_GETOVERRUN = 239 // { int|sys||timer_getoverrun(timer_t timerid); } + SYS_FDATASYNC = 241 // { int|sys||fdatasync(int fd); } + SYS_MLOCKALL = 242 // { int|sys||mlockall(int flags); } + SYS_MUNLOCKALL = 243 // { int|sys||munlockall(void); } + SYS_SIGQUEUEINFO = 245 // { int|sys||sigqueueinfo(pid_t pid, const siginfo_t *info); } + SYS_MODCTL = 246 // { int|sys||modctl(int cmd, void *arg); } + SYS___POSIX_RENAME = 270 // { int|sys||__posix_rename(const char *from, const char *to); } + SYS_SWAPCTL = 271 // { int|sys||swapctl(int cmd, void *arg, int misc); } + SYS_MINHERIT = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); } + SYS_LCHMOD = 274 // { int|sys||lchmod(const char *path, mode_t mode); } + SYS_LCHOWN = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); } + SYS___POSIX_CHOWN = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); } + SYS___POSIX_FCHOWN = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); } + SYS___POSIX_LCHOWN = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 286 // { pid_t|sys||getsid(pid_t pid); } + SYS___CLONE = 287 // { pid_t|sys||__clone(int flags, void *stack); } + SYS_FKTRACE = 288 // { int|sys||fktrace(int fd, int ops, int facs, pid_t pid); } + SYS_PREADV = 289 // { ssize_t|sys||preadv(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS_PWRITEV = 290 // { ssize_t|sys||pwritev(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS___GETCWD = 296 // { int|sys||__getcwd(char *bufp, size_t length); } + SYS_FCHROOT = 297 // { int|sys||fchroot(int fd); } + SYS_LCHFLAGS = 304 // { int|sys||lchflags(const char *path, u_long flags); } + SYS_ISSETUGID = 305 // { int|sys||issetugid(void); } + SYS_UTRACE = 306 // { int|sys||utrace(const char *label, void *addr, size_t len); } + SYS_GETCONTEXT = 307 // { int|sys||getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 308 // { int|sys||setcontext(const struct __ucontext *ucp); } + SYS__LWP_CREATE = 309 // { int|sys||_lwp_create(const struct __ucontext *ucp, u_long flags, lwpid_t *new_lwp); } + SYS__LWP_EXIT = 310 // { int|sys||_lwp_exit(void); } + SYS__LWP_SELF = 311 // { lwpid_t|sys||_lwp_self(void); } + SYS__LWP_WAIT = 312 // { int|sys||_lwp_wait(lwpid_t wait_for, lwpid_t *departed); } + SYS__LWP_SUSPEND = 313 // { int|sys||_lwp_suspend(lwpid_t target); } + SYS__LWP_CONTINUE = 314 // { int|sys||_lwp_continue(lwpid_t target); } + SYS__LWP_WAKEUP = 315 // { int|sys||_lwp_wakeup(lwpid_t target); } + SYS__LWP_GETPRIVATE = 316 // { void *|sys||_lwp_getprivate(void); } + SYS__LWP_SETPRIVATE = 317 // { void|sys||_lwp_setprivate(void *ptr); } + SYS__LWP_KILL = 318 // { int|sys||_lwp_kill(lwpid_t target, int signo); } + SYS__LWP_DETACH = 319 // { int|sys||_lwp_detach(lwpid_t target); } + SYS__LWP_UNPARK = 321 // { int|sys||_lwp_unpark(lwpid_t target, const void *hint); } + SYS__LWP_UNPARK_ALL = 322 // { ssize_t|sys||_lwp_unpark_all(const lwpid_t *targets, size_t ntargets, const void *hint); } + SYS__LWP_SETNAME = 323 // { int|sys||_lwp_setname(lwpid_t target, const char *name); } + SYS__LWP_GETNAME = 324 // { int|sys||_lwp_getname(lwpid_t target, char *name, size_t len); } + SYS__LWP_CTL = 325 // { int|sys||_lwp_ctl(int features, struct lwpctl **address); } + SYS___SIGACTION_SIGTRAMP = 340 // { int|sys||__sigaction_sigtramp(int signum, const struct sigaction *nsa, struct sigaction *osa, const void *tramp, int vers); } + SYS_PMC_GET_INFO = 341 // { int|sys||pmc_get_info(int ctr, int op, void *args); } + SYS_PMC_CONTROL = 342 // { int|sys||pmc_control(int ctr, int op, void *args); } + SYS_RASCTL = 343 // { int|sys||rasctl(void *addr, size_t len, int op); } + SYS_KQUEUE = 344 // { int|sys||kqueue(void); } + SYS__SCHED_SETPARAM = 346 // { int|sys||_sched_setparam(pid_t pid, lwpid_t lid, int policy, const struct sched_param *params); } + SYS__SCHED_GETPARAM = 347 // { int|sys||_sched_getparam(pid_t pid, lwpid_t lid, int *policy, struct sched_param *params); } + SYS__SCHED_SETAFFINITY = 348 // { int|sys||_sched_setaffinity(pid_t pid, lwpid_t lid, size_t size, const cpuset_t *cpuset); } + SYS__SCHED_GETAFFINITY = 349 // { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, size_t size, cpuset_t *cpuset); } + SYS_SCHED_YIELD = 350 // { int|sys||sched_yield(void); } + SYS_FSYNC_RANGE = 354 // { int|sys||fsync_range(int fd, int flags, off_t start, off_t length); } + SYS_UUIDGEN = 355 // { int|sys||uuidgen(struct uuid *store, int count); } + SYS_GETVFSSTAT = 356 // { int|sys||getvfsstat(struct statvfs *buf, size_t bufsize, int flags); } + SYS_STATVFS1 = 357 // { int|sys||statvfs1(const char *path, struct statvfs *buf, int flags); } + SYS_FSTATVFS1 = 358 // { int|sys||fstatvfs1(int fd, struct statvfs *buf, int flags); } + SYS_EXTATTRCTL = 360 // { int|sys||extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FILE = 361 // { int|sys||extattr_set_file(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 362 // { ssize_t|sys||extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FILE = 363 // { int|sys||extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FD = 364 // { int|sys||extattr_set_fd(int fd, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FD = 365 // { ssize_t|sys||extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FD = 366 // { int|sys||extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_LINK = 367 // { int|sys||extattr_set_link(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 368 // { ssize_t|sys||extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 369 // { int|sys||extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_LIST_FD = 370 // { ssize_t|sys||extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 371 // { ssize_t|sys||extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 372 // { ssize_t|sys||extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_SETXATTR = 375 // { int|sys||setxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_LSETXATTR = 376 // { int|sys||lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_FSETXATTR = 377 // { int|sys||fsetxattr(int fd, const char *name, const void *value, size_t size, int flags); } + SYS_GETXATTR = 378 // { int|sys||getxattr(const char *path, const char *name, void *value, size_t size); } + SYS_LGETXATTR = 379 // { int|sys||lgetxattr(const char *path, const char *name, void *value, size_t size); } + SYS_FGETXATTR = 380 // { int|sys||fgetxattr(int fd, const char *name, void *value, size_t size); } + SYS_LISTXATTR = 381 // { int|sys||listxattr(const char *path, char *list, size_t size); } + SYS_LLISTXATTR = 382 // { int|sys||llistxattr(const char *path, char *list, size_t size); } + SYS_FLISTXATTR = 383 // { int|sys||flistxattr(int fd, char *list, size_t size); } + SYS_REMOVEXATTR = 384 // { int|sys||removexattr(const char *path, const char *name); } + SYS_LREMOVEXATTR = 385 // { int|sys||lremovexattr(const char *path, const char *name); } + SYS_FREMOVEXATTR = 386 // { int|sys||fremovexattr(int fd, const char *name); } + SYS_GETDENTS = 390 // { int|sys|30|getdents(int fd, char *buf, size_t count); } + SYS_SOCKET = 394 // { int|sys|30|socket(int domain, int type, int protocol); } + SYS_GETFH = 395 // { int|sys|30|getfh(const char *fname, void *fhp, size_t *fh_size); } + SYS_MOUNT = 410 // { int|sys|50|mount(const char *type, const char *path, int flags, void *data, size_t data_len); } + SYS_MREMAP = 411 // { void *|sys||mremap(void *old_address, size_t old_size, void *new_address, size_t new_size, int flags); } + SYS_PSET_CREATE = 412 // { int|sys||pset_create(psetid_t *psid); } + SYS_PSET_DESTROY = 413 // { int|sys||pset_destroy(psetid_t psid); } + SYS_PSET_ASSIGN = 414 // { int|sys||pset_assign(psetid_t psid, cpuid_t cpuid, psetid_t *opsid); } + SYS__PSET_BIND = 415 // { int|sys||_pset_bind(idtype_t idtype, id_t first_id, id_t second_id, psetid_t psid, psetid_t *opsid); } + SYS_POSIX_FADVISE = 416 // { int|sys|50|posix_fadvise(int fd, int PAD, off_t offset, off_t len, int advice); } + SYS_SELECT = 417 // { int|sys|50|select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } + SYS_GETTIMEOFDAY = 418 // { int|sys|50|gettimeofday(struct timeval *tp, void *tzp); } + SYS_SETTIMEOFDAY = 419 // { int|sys|50|settimeofday(const struct timeval *tv, const void *tzp); } + SYS_UTIMES = 420 // { int|sys|50|utimes(const char *path, const struct timeval *tptr); } + SYS_ADJTIME = 421 // { int|sys|50|adjtime(const struct timeval *delta, struct timeval *olddelta); } + SYS_FUTIMES = 423 // { int|sys|50|futimes(int fd, const struct timeval *tptr); } + SYS_LUTIMES = 424 // { int|sys|50|lutimes(const char *path, const struct timeval *tptr); } + SYS_SETITIMER = 425 // { int|sys|50|setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); } + SYS_GETITIMER = 426 // { int|sys|50|getitimer(int which, struct itimerval *itv); } + SYS_CLOCK_GETTIME = 427 // { int|sys|50|clock_gettime(clockid_t clock_id, struct timespec *tp); } + SYS_CLOCK_SETTIME = 428 // { int|sys|50|clock_settime(clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_GETRES = 429 // { int|sys|50|clock_getres(clockid_t clock_id, struct timespec *tp); } + SYS_NANOSLEEP = 430 // { int|sys|50|nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } + SYS___SIGTIMEDWAIT = 431 // { int|sys|50|__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec *timeout); } + SYS__LWP_PARK = 434 // { int|sys|50|_lwp_park(const struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); } + SYS_KEVENT = 435 // { int|sys|50|kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec *timeout); } + SYS_PSELECT = 436 // { int|sys|50|pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); } + SYS_POLLTS = 437 // { int|sys|50|pollts(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); } + SYS_STAT = 439 // { int|sys|50|stat(const char *path, struct stat *ub); } + SYS_FSTAT = 440 // { int|sys|50|fstat(int fd, struct stat *sb); } + SYS_LSTAT = 441 // { int|sys|50|lstat(const char *path, struct stat *ub); } + SYS___SEMCTL = 442 // { int|sys|50|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); } + SYS_SHMCTL = 443 // { int|sys|50|shmctl(int shmid, int cmd, struct shmid_ds *buf); } + SYS_MSGCTL = 444 // { int|sys|50|msgctl(int msqid, int cmd, struct msqid_ds *buf); } + SYS_GETRUSAGE = 445 // { int|sys|50|getrusage(int who, struct rusage *rusage); } + SYS_TIMER_SETTIME = 446 // { int|sys|50|timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); } + SYS_TIMER_GETTIME = 447 // { int|sys|50|timer_gettime(timer_t timerid, struct itimerspec *value); } + SYS_NTP_GETTIME = 448 // { int|sys|50|ntp_gettime(struct ntptimeval *ntvp); } + SYS_WAIT4 = 449 // { int|sys|50|wait4(pid_t pid, int *status, int options, struct rusage *rusage); } + SYS_MKNOD = 450 // { int|sys|50|mknod(const char *path, mode_t mode, dev_t dev); } + SYS_FHSTAT = 451 // { int|sys|50|fhstat(const void *fhp, size_t fh_size, struct stat *sb); } + SYS_PIPE2 = 453 // { int|sys||pipe2(int *fildes, int flags); } + SYS_DUP3 = 454 // { int|sys||dup3(int from, int to, int flags); } + SYS_KQUEUE1 = 455 // { int|sys||kqueue1(int flags); } + SYS_PACCEPT = 456 // { int|sys||paccept(int s, struct sockaddr *name, socklen_t *anamelen, const sigset_t *mask, int flags); } + SYS_LINKAT = 457 // { int|sys||linkat(int fd1, const char *name1, int fd2, const char *name2, int flags); } + SYS_RENAMEAT = 458 // { int|sys||renameat(int fromfd, const char *from, int tofd, const char *to); } + SYS_MKFIFOAT = 459 // { int|sys||mkfifoat(int fd, const char *path, mode_t mode); } + SYS_MKNODAT = 460 // { int|sys||mknodat(int fd, const char *path, mode_t mode, uint32_t dev); } + SYS_MKDIRAT = 461 // { int|sys||mkdirat(int fd, const char *path, mode_t mode); } + SYS_FACCESSAT = 462 // { int|sys||faccessat(int fd, const char *path, int amode, int flag); } + SYS_FCHMODAT = 463 // { int|sys||fchmodat(int fd, const char *path, mode_t mode, int flag); } + SYS_FCHOWNAT = 464 // { int|sys||fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); } + SYS_FEXECVE = 465 // { int|sys||fexecve(int fd, char * const *argp, char * const *envp); } + SYS_FSTATAT = 466 // { int|sys||fstatat(int fd, const char *path, struct stat *buf, int flag); } + SYS_UTIMENSAT = 467 // { int|sys||utimensat(int fd, const char *path, const struct timespec *tptr, int flag); } + SYS_OPENAT = 468 // { int|sys||openat(int fd, const char *path, int oflags, ... mode_t mode); } + SYS_READLINKAT = 469 // { int|sys||readlinkat(int fd, const char *path, char *buf, size_t bufsize); } + SYS_SYMLINKAT = 470 // { int|sys||symlinkat(const char *path1, int fd, const char *path2); } + SYS_UNLINKAT = 471 // { int|sys||unlinkat(int fd, const char *path, int flag); } + SYS_FUTIMENS = 472 // { int|sys||futimens(int fd, const struct timespec *tptr); } + SYS___QUOTACTL = 473 // { int|sys||__quotactl(const char *path, struct quotactl_args *args); } + SYS_POSIX_SPAWN = 474 // { int|sys||posix_spawn(pid_t *pid, const char *path, const struct posix_spawn_file_actions *file_actions, const struct posix_spawnattr *attrp, char *const *argv, char *const *envp); } + SYS_RECVMMSG = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); } + SYS_SENDMMSG = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); } +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..48a91d46464d5a68937875a24bec4ae9693eaf56 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go @@ -0,0 +1,273 @@ +// mksysnum_netbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build amd64,netbsd + +package unix + +const ( + SYS_EXIT = 1 // { void|sys||exit(int rval); } + SYS_FORK = 2 // { int|sys||fork(void); } + SYS_READ = 3 // { ssize_t|sys||read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t|sys||write(int fd, const void *buf, size_t nbyte); } + SYS_OPEN = 5 // { int|sys||open(const char *path, int flags, ... mode_t mode); } + SYS_CLOSE = 6 // { int|sys||close(int fd); } + SYS_LINK = 9 // { int|sys||link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int|sys||unlink(const char *path); } + SYS_CHDIR = 12 // { int|sys||chdir(const char *path); } + SYS_FCHDIR = 13 // { int|sys||fchdir(int fd); } + SYS_CHMOD = 15 // { int|sys||chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int|sys||chown(const char *path, uid_t uid, gid_t gid); } + SYS_BREAK = 17 // { int|sys||obreak(char *nsize); } + SYS_GETPID = 20 // { pid_t|sys||getpid_with_ppid(void); } + SYS_UNMOUNT = 22 // { int|sys||unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int|sys||setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t|sys||getuid_with_euid(void); } + SYS_GETEUID = 25 // { uid_t|sys||geteuid(void); } + SYS_PTRACE = 26 // { int|sys||ptrace(int req, pid_t pid, void *addr, int data); } + SYS_RECVMSG = 27 // { ssize_t|sys||recvmsg(int s, struct msghdr *msg, int flags); } + SYS_SENDMSG = 28 // { ssize_t|sys||sendmsg(int s, const struct msghdr *msg, int flags); } + SYS_RECVFROM = 29 // { ssize_t|sys||recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlenaddr); } + SYS_ACCEPT = 30 // { int|sys||accept(int s, struct sockaddr *name, socklen_t *anamelen); } + SYS_GETPEERNAME = 31 // { int|sys||getpeername(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_GETSOCKNAME = 32 // { int|sys||getsockname(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_ACCESS = 33 // { int|sys||access(const char *path, int flags); } + SYS_CHFLAGS = 34 // { int|sys||chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int|sys||fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { void|sys||sync(void); } + SYS_KILL = 37 // { int|sys||kill(pid_t pid, int signum); } + SYS_GETPPID = 39 // { pid_t|sys||getppid(void); } + SYS_DUP = 41 // { int|sys||dup(int fd); } + SYS_PIPE = 42 // { int|sys||pipe(void); } + SYS_GETEGID = 43 // { gid_t|sys||getegid(void); } + SYS_PROFIL = 44 // { int|sys||profil(char *samples, size_t size, u_long offset, u_int scale); } + SYS_KTRACE = 45 // { int|sys||ktrace(const char *fname, int ops, int facs, pid_t pid); } + SYS_GETGID = 47 // { gid_t|sys||getgid_with_egid(void); } + SYS___GETLOGIN = 49 // { int|sys||__getlogin(char *namebuf, size_t namelen); } + SYS___SETLOGIN = 50 // { int|sys||__setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int|sys||acct(const char *path); } + SYS_IOCTL = 54 // { int|sys||ioctl(int fd, u_long com, ... void *data); } + SYS_REVOKE = 56 // { int|sys||revoke(const char *path); } + SYS_SYMLINK = 57 // { int|sys||symlink(const char *path, const char *link); } + SYS_READLINK = 58 // { ssize_t|sys||readlink(const char *path, char *buf, size_t count); } + SYS_EXECVE = 59 // { int|sys||execve(const char *path, char * const *argp, char * const *envp); } + SYS_UMASK = 60 // { mode_t|sys||umask(mode_t newmask); } + SYS_CHROOT = 61 // { int|sys||chroot(const char *path); } + SYS_VFORK = 66 // { int|sys||vfork(void); } + SYS_SBRK = 69 // { int|sys||sbrk(intptr_t incr); } + SYS_SSTK = 70 // { int|sys||sstk(int incr); } + SYS_VADVISE = 72 // { int|sys||ovadvise(int anom); } + SYS_MUNMAP = 73 // { int|sys||munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int|sys||mprotect(void *addr, size_t len, int prot); } + SYS_MADVISE = 75 // { int|sys||madvise(void *addr, size_t len, int behav); } + SYS_MINCORE = 78 // { int|sys||mincore(void *addr, size_t len, char *vec); } + SYS_GETGROUPS = 79 // { int|sys||getgroups(int gidsetsize, gid_t *gidset); } + SYS_SETGROUPS = 80 // { int|sys||setgroups(int gidsetsize, const gid_t *gidset); } + SYS_GETPGRP = 81 // { int|sys||getpgrp(void); } + SYS_SETPGID = 82 // { int|sys||setpgid(pid_t pid, pid_t pgid); } + SYS_DUP2 = 90 // { int|sys||dup2(int from, int to); } + SYS_FCNTL = 92 // { int|sys||fcntl(int fd, int cmd, ... void *arg); } + SYS_FSYNC = 95 // { int|sys||fsync(int fd); } + SYS_SETPRIORITY = 96 // { int|sys||setpriority(int which, id_t who, int prio); } + SYS_CONNECT = 98 // { int|sys||connect(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_GETPRIORITY = 100 // { int|sys||getpriority(int which, id_t who); } + SYS_BIND = 104 // { int|sys||bind(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_SETSOCKOPT = 105 // { int|sys||setsockopt(int s, int level, int name, const void *val, socklen_t valsize); } + SYS_LISTEN = 106 // { int|sys||listen(int s, int backlog); } + SYS_GETSOCKOPT = 118 // { int|sys||getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); } + SYS_READV = 120 // { ssize_t|sys||readv(int fd, const struct iovec *iovp, int iovcnt); } + SYS_WRITEV = 121 // { ssize_t|sys||writev(int fd, const struct iovec *iovp, int iovcnt); } + SYS_FCHOWN = 123 // { int|sys||fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int|sys||fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int|sys||setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int|sys||setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int|sys||rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int|sys||flock(int fd, int how); } + SYS_MKFIFO = 132 // { int|sys||mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t|sys||sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); } + SYS_SHUTDOWN = 134 // { int|sys||shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int|sys||socketpair(int domain, int type, int protocol, int *rsv); } + SYS_MKDIR = 136 // { int|sys||mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int|sys||rmdir(const char *path); } + SYS_SETSID = 147 // { int|sys||setsid(void); } + SYS_SYSARCH = 165 // { int|sys||sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t|sys||pread(int fd, void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_PWRITE = 174 // { ssize_t|sys||pwrite(int fd, const void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_NTP_ADJTIME = 176 // { int|sys||ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int|sys||setgid(gid_t gid); } + SYS_SETEGID = 182 // { int|sys||setegid(gid_t egid); } + SYS_SETEUID = 183 // { int|sys||seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long|sys||pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long|sys||fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int|sys||getrlimit(int which, struct rlimit *rlp); } + SYS_SETRLIMIT = 195 // { int|sys||setrlimit(int which, const struct rlimit *rlp); } + SYS_MMAP = 197 // { void *|sys||mmap(void *addr, size_t len, int prot, int flags, int fd, long PAD, off_t pos); } + SYS_LSEEK = 199 // { off_t|sys||lseek(int fd, int PAD, off_t offset, int whence); } + SYS_TRUNCATE = 200 // { int|sys||truncate(const char *path, int PAD, off_t length); } + SYS_FTRUNCATE = 201 // { int|sys||ftruncate(int fd, int PAD, off_t length); } + SYS___SYSCTL = 202 // { int|sys||__sysctl(const int *name, u_int namelen, void *old, size_t *oldlenp, const void *new, size_t newlen); } + SYS_MLOCK = 203 // { int|sys||mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int|sys||munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int|sys||undelete(const char *path); } + SYS_GETPGID = 207 // { pid_t|sys||getpgid(pid_t pid); } + SYS_REBOOT = 208 // { int|sys||reboot(int opt, char *bootstr); } + SYS_POLL = 209 // { int|sys||poll(struct pollfd *fds, u_int nfds, int timeout); } + SYS_SEMGET = 221 // { int|sys||semget(key_t key, int nsems, int semflg); } + SYS_SEMOP = 222 // { int|sys||semop(int semid, struct sembuf *sops, size_t nsops); } + SYS_SEMCONFIG = 223 // { int|sys||semconfig(int flag); } + SYS_MSGGET = 225 // { int|sys||msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int|sys||msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } + SYS_MSGRCV = 227 // { ssize_t|sys||msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_SHMAT = 228 // { void *|sys||shmat(int shmid, const void *shmaddr, int shmflg); } + SYS_SHMDT = 230 // { int|sys||shmdt(const void *shmaddr); } + SYS_SHMGET = 231 // { int|sys||shmget(key_t key, size_t size, int shmflg); } + SYS_TIMER_CREATE = 235 // { int|sys||timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); } + SYS_TIMER_DELETE = 236 // { int|sys||timer_delete(timer_t timerid); } + SYS_TIMER_GETOVERRUN = 239 // { int|sys||timer_getoverrun(timer_t timerid); } + SYS_FDATASYNC = 241 // { int|sys||fdatasync(int fd); } + SYS_MLOCKALL = 242 // { int|sys||mlockall(int flags); } + SYS_MUNLOCKALL = 243 // { int|sys||munlockall(void); } + SYS_SIGQUEUEINFO = 245 // { int|sys||sigqueueinfo(pid_t pid, const siginfo_t *info); } + SYS_MODCTL = 246 // { int|sys||modctl(int cmd, void *arg); } + SYS___POSIX_RENAME = 270 // { int|sys||__posix_rename(const char *from, const char *to); } + SYS_SWAPCTL = 271 // { int|sys||swapctl(int cmd, void *arg, int misc); } + SYS_MINHERIT = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); } + SYS_LCHMOD = 274 // { int|sys||lchmod(const char *path, mode_t mode); } + SYS_LCHOWN = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); } + SYS___POSIX_CHOWN = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); } + SYS___POSIX_FCHOWN = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); } + SYS___POSIX_LCHOWN = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 286 // { pid_t|sys||getsid(pid_t pid); } + SYS___CLONE = 287 // { pid_t|sys||__clone(int flags, void *stack); } + SYS_FKTRACE = 288 // { int|sys||fktrace(int fd, int ops, int facs, pid_t pid); } + SYS_PREADV = 289 // { ssize_t|sys||preadv(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS_PWRITEV = 290 // { ssize_t|sys||pwritev(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS___GETCWD = 296 // { int|sys||__getcwd(char *bufp, size_t length); } + SYS_FCHROOT = 297 // { int|sys||fchroot(int fd); } + SYS_LCHFLAGS = 304 // { int|sys||lchflags(const char *path, u_long flags); } + SYS_ISSETUGID = 305 // { int|sys||issetugid(void); } + SYS_UTRACE = 306 // { int|sys||utrace(const char *label, void *addr, size_t len); } + SYS_GETCONTEXT = 307 // { int|sys||getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 308 // { int|sys||setcontext(const struct __ucontext *ucp); } + SYS__LWP_CREATE = 309 // { int|sys||_lwp_create(const struct __ucontext *ucp, u_long flags, lwpid_t *new_lwp); } + SYS__LWP_EXIT = 310 // { int|sys||_lwp_exit(void); } + SYS__LWP_SELF = 311 // { lwpid_t|sys||_lwp_self(void); } + SYS__LWP_WAIT = 312 // { int|sys||_lwp_wait(lwpid_t wait_for, lwpid_t *departed); } + SYS__LWP_SUSPEND = 313 // { int|sys||_lwp_suspend(lwpid_t target); } + SYS__LWP_CONTINUE = 314 // { int|sys||_lwp_continue(lwpid_t target); } + SYS__LWP_WAKEUP = 315 // { int|sys||_lwp_wakeup(lwpid_t target); } + SYS__LWP_GETPRIVATE = 316 // { void *|sys||_lwp_getprivate(void); } + SYS__LWP_SETPRIVATE = 317 // { void|sys||_lwp_setprivate(void *ptr); } + SYS__LWP_KILL = 318 // { int|sys||_lwp_kill(lwpid_t target, int signo); } + SYS__LWP_DETACH = 319 // { int|sys||_lwp_detach(lwpid_t target); } + SYS__LWP_UNPARK = 321 // { int|sys||_lwp_unpark(lwpid_t target, const void *hint); } + SYS__LWP_UNPARK_ALL = 322 // { ssize_t|sys||_lwp_unpark_all(const lwpid_t *targets, size_t ntargets, const void *hint); } + SYS__LWP_SETNAME = 323 // { int|sys||_lwp_setname(lwpid_t target, const char *name); } + SYS__LWP_GETNAME = 324 // { int|sys||_lwp_getname(lwpid_t target, char *name, size_t len); } + SYS__LWP_CTL = 325 // { int|sys||_lwp_ctl(int features, struct lwpctl **address); } + SYS___SIGACTION_SIGTRAMP = 340 // { int|sys||__sigaction_sigtramp(int signum, const struct sigaction *nsa, struct sigaction *osa, const void *tramp, int vers); } + SYS_PMC_GET_INFO = 341 // { int|sys||pmc_get_info(int ctr, int op, void *args); } + SYS_PMC_CONTROL = 342 // { int|sys||pmc_control(int ctr, int op, void *args); } + SYS_RASCTL = 343 // { int|sys||rasctl(void *addr, size_t len, int op); } + SYS_KQUEUE = 344 // { int|sys||kqueue(void); } + SYS__SCHED_SETPARAM = 346 // { int|sys||_sched_setparam(pid_t pid, lwpid_t lid, int policy, const struct sched_param *params); } + SYS__SCHED_GETPARAM = 347 // { int|sys||_sched_getparam(pid_t pid, lwpid_t lid, int *policy, struct sched_param *params); } + SYS__SCHED_SETAFFINITY = 348 // { int|sys||_sched_setaffinity(pid_t pid, lwpid_t lid, size_t size, const cpuset_t *cpuset); } + SYS__SCHED_GETAFFINITY = 349 // { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, size_t size, cpuset_t *cpuset); } + SYS_SCHED_YIELD = 350 // { int|sys||sched_yield(void); } + SYS_FSYNC_RANGE = 354 // { int|sys||fsync_range(int fd, int flags, off_t start, off_t length); } + SYS_UUIDGEN = 355 // { int|sys||uuidgen(struct uuid *store, int count); } + SYS_GETVFSSTAT = 356 // { int|sys||getvfsstat(struct statvfs *buf, size_t bufsize, int flags); } + SYS_STATVFS1 = 357 // { int|sys||statvfs1(const char *path, struct statvfs *buf, int flags); } + SYS_FSTATVFS1 = 358 // { int|sys||fstatvfs1(int fd, struct statvfs *buf, int flags); } + SYS_EXTATTRCTL = 360 // { int|sys||extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FILE = 361 // { int|sys||extattr_set_file(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 362 // { ssize_t|sys||extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FILE = 363 // { int|sys||extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FD = 364 // { int|sys||extattr_set_fd(int fd, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FD = 365 // { ssize_t|sys||extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FD = 366 // { int|sys||extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_LINK = 367 // { int|sys||extattr_set_link(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 368 // { ssize_t|sys||extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 369 // { int|sys||extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_LIST_FD = 370 // { ssize_t|sys||extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 371 // { ssize_t|sys||extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 372 // { ssize_t|sys||extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_SETXATTR = 375 // { int|sys||setxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_LSETXATTR = 376 // { int|sys||lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_FSETXATTR = 377 // { int|sys||fsetxattr(int fd, const char *name, const void *value, size_t size, int flags); } + SYS_GETXATTR = 378 // { int|sys||getxattr(const char *path, const char *name, void *value, size_t size); } + SYS_LGETXATTR = 379 // { int|sys||lgetxattr(const char *path, const char *name, void *value, size_t size); } + SYS_FGETXATTR = 380 // { int|sys||fgetxattr(int fd, const char *name, void *value, size_t size); } + SYS_LISTXATTR = 381 // { int|sys||listxattr(const char *path, char *list, size_t size); } + SYS_LLISTXATTR = 382 // { int|sys||llistxattr(const char *path, char *list, size_t size); } + SYS_FLISTXATTR = 383 // { int|sys||flistxattr(int fd, char *list, size_t size); } + SYS_REMOVEXATTR = 384 // { int|sys||removexattr(const char *path, const char *name); } + SYS_LREMOVEXATTR = 385 // { int|sys||lremovexattr(const char *path, const char *name); } + SYS_FREMOVEXATTR = 386 // { int|sys||fremovexattr(int fd, const char *name); } + SYS_GETDENTS = 390 // { int|sys|30|getdents(int fd, char *buf, size_t count); } + SYS_SOCKET = 394 // { int|sys|30|socket(int domain, int type, int protocol); } + SYS_GETFH = 395 // { int|sys|30|getfh(const char *fname, void *fhp, size_t *fh_size); } + SYS_MOUNT = 410 // { int|sys|50|mount(const char *type, const char *path, int flags, void *data, size_t data_len); } + SYS_MREMAP = 411 // { void *|sys||mremap(void *old_address, size_t old_size, void *new_address, size_t new_size, int flags); } + SYS_PSET_CREATE = 412 // { int|sys||pset_create(psetid_t *psid); } + SYS_PSET_DESTROY = 413 // { int|sys||pset_destroy(psetid_t psid); } + SYS_PSET_ASSIGN = 414 // { int|sys||pset_assign(psetid_t psid, cpuid_t cpuid, psetid_t *opsid); } + SYS__PSET_BIND = 415 // { int|sys||_pset_bind(idtype_t idtype, id_t first_id, id_t second_id, psetid_t psid, psetid_t *opsid); } + SYS_POSIX_FADVISE = 416 // { int|sys|50|posix_fadvise(int fd, int PAD, off_t offset, off_t len, int advice); } + SYS_SELECT = 417 // { int|sys|50|select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } + SYS_GETTIMEOFDAY = 418 // { int|sys|50|gettimeofday(struct timeval *tp, void *tzp); } + SYS_SETTIMEOFDAY = 419 // { int|sys|50|settimeofday(const struct timeval *tv, const void *tzp); } + SYS_UTIMES = 420 // { int|sys|50|utimes(const char *path, const struct timeval *tptr); } + SYS_ADJTIME = 421 // { int|sys|50|adjtime(const struct timeval *delta, struct timeval *olddelta); } + SYS_FUTIMES = 423 // { int|sys|50|futimes(int fd, const struct timeval *tptr); } + SYS_LUTIMES = 424 // { int|sys|50|lutimes(const char *path, const struct timeval *tptr); } + SYS_SETITIMER = 425 // { int|sys|50|setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); } + SYS_GETITIMER = 426 // { int|sys|50|getitimer(int which, struct itimerval *itv); } + SYS_CLOCK_GETTIME = 427 // { int|sys|50|clock_gettime(clockid_t clock_id, struct timespec *tp); } + SYS_CLOCK_SETTIME = 428 // { int|sys|50|clock_settime(clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_GETRES = 429 // { int|sys|50|clock_getres(clockid_t clock_id, struct timespec *tp); } + SYS_NANOSLEEP = 430 // { int|sys|50|nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } + SYS___SIGTIMEDWAIT = 431 // { int|sys|50|__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec *timeout); } + SYS__LWP_PARK = 434 // { int|sys|50|_lwp_park(const struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); } + SYS_KEVENT = 435 // { int|sys|50|kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec *timeout); } + SYS_PSELECT = 436 // { int|sys|50|pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); } + SYS_POLLTS = 437 // { int|sys|50|pollts(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); } + SYS_STAT = 439 // { int|sys|50|stat(const char *path, struct stat *ub); } + SYS_FSTAT = 440 // { int|sys|50|fstat(int fd, struct stat *sb); } + SYS_LSTAT = 441 // { int|sys|50|lstat(const char *path, struct stat *ub); } + SYS___SEMCTL = 442 // { int|sys|50|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); } + SYS_SHMCTL = 443 // { int|sys|50|shmctl(int shmid, int cmd, struct shmid_ds *buf); } + SYS_MSGCTL = 444 // { int|sys|50|msgctl(int msqid, int cmd, struct msqid_ds *buf); } + SYS_GETRUSAGE = 445 // { int|sys|50|getrusage(int who, struct rusage *rusage); } + SYS_TIMER_SETTIME = 446 // { int|sys|50|timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); } + SYS_TIMER_GETTIME = 447 // { int|sys|50|timer_gettime(timer_t timerid, struct itimerspec *value); } + SYS_NTP_GETTIME = 448 // { int|sys|50|ntp_gettime(struct ntptimeval *ntvp); } + SYS_WAIT4 = 449 // { int|sys|50|wait4(pid_t pid, int *status, int options, struct rusage *rusage); } + SYS_MKNOD = 450 // { int|sys|50|mknod(const char *path, mode_t mode, dev_t dev); } + SYS_FHSTAT = 451 // { int|sys|50|fhstat(const void *fhp, size_t fh_size, struct stat *sb); } + SYS_PIPE2 = 453 // { int|sys||pipe2(int *fildes, int flags); } + SYS_DUP3 = 454 // { int|sys||dup3(int from, int to, int flags); } + SYS_KQUEUE1 = 455 // { int|sys||kqueue1(int flags); } + SYS_PACCEPT = 456 // { int|sys||paccept(int s, struct sockaddr *name, socklen_t *anamelen, const sigset_t *mask, int flags); } + SYS_LINKAT = 457 // { int|sys||linkat(int fd1, const char *name1, int fd2, const char *name2, int flags); } + SYS_RENAMEAT = 458 // { int|sys||renameat(int fromfd, const char *from, int tofd, const char *to); } + SYS_MKFIFOAT = 459 // { int|sys||mkfifoat(int fd, const char *path, mode_t mode); } + SYS_MKNODAT = 460 // { int|sys||mknodat(int fd, const char *path, mode_t mode, uint32_t dev); } + SYS_MKDIRAT = 461 // { int|sys||mkdirat(int fd, const char *path, mode_t mode); } + SYS_FACCESSAT = 462 // { int|sys||faccessat(int fd, const char *path, int amode, int flag); } + SYS_FCHMODAT = 463 // { int|sys||fchmodat(int fd, const char *path, mode_t mode, int flag); } + SYS_FCHOWNAT = 464 // { int|sys||fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); } + SYS_FEXECVE = 465 // { int|sys||fexecve(int fd, char * const *argp, char * const *envp); } + SYS_FSTATAT = 466 // { int|sys||fstatat(int fd, const char *path, struct stat *buf, int flag); } + SYS_UTIMENSAT = 467 // { int|sys||utimensat(int fd, const char *path, const struct timespec *tptr, int flag); } + SYS_OPENAT = 468 // { int|sys||openat(int fd, const char *path, int oflags, ... mode_t mode); } + SYS_READLINKAT = 469 // { int|sys||readlinkat(int fd, const char *path, char *buf, size_t bufsize); } + SYS_SYMLINKAT = 470 // { int|sys||symlinkat(const char *path1, int fd, const char *path2); } + SYS_UNLINKAT = 471 // { int|sys||unlinkat(int fd, const char *path, int flag); } + SYS_FUTIMENS = 472 // { int|sys||futimens(int fd, const struct timespec *tptr); } + SYS___QUOTACTL = 473 // { int|sys||__quotactl(const char *path, struct quotactl_args *args); } + SYS_POSIX_SPAWN = 474 // { int|sys||posix_spawn(pid_t *pid, const char *path, const struct posix_spawn_file_actions *file_actions, const struct posix_spawnattr *attrp, char *const *argv, char *const *envp); } + SYS_RECVMMSG = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); } + SYS_SENDMMSG = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); } +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go new file mode 100644 index 0000000000000000000000000000000000000000..612ba662cb26a32b443adf27962ce848296f860f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go @@ -0,0 +1,273 @@ +// mksysnum_netbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build arm,netbsd + +package unix + +const ( + SYS_EXIT = 1 // { void|sys||exit(int rval); } + SYS_FORK = 2 // { int|sys||fork(void); } + SYS_READ = 3 // { ssize_t|sys||read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t|sys||write(int fd, const void *buf, size_t nbyte); } + SYS_OPEN = 5 // { int|sys||open(const char *path, int flags, ... mode_t mode); } + SYS_CLOSE = 6 // { int|sys||close(int fd); } + SYS_LINK = 9 // { int|sys||link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int|sys||unlink(const char *path); } + SYS_CHDIR = 12 // { int|sys||chdir(const char *path); } + SYS_FCHDIR = 13 // { int|sys||fchdir(int fd); } + SYS_CHMOD = 15 // { int|sys||chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int|sys||chown(const char *path, uid_t uid, gid_t gid); } + SYS_BREAK = 17 // { int|sys||obreak(char *nsize); } + SYS_GETPID = 20 // { pid_t|sys||getpid_with_ppid(void); } + SYS_UNMOUNT = 22 // { int|sys||unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int|sys||setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t|sys||getuid_with_euid(void); } + SYS_GETEUID = 25 // { uid_t|sys||geteuid(void); } + SYS_PTRACE = 26 // { int|sys||ptrace(int req, pid_t pid, void *addr, int data); } + SYS_RECVMSG = 27 // { ssize_t|sys||recvmsg(int s, struct msghdr *msg, int flags); } + SYS_SENDMSG = 28 // { ssize_t|sys||sendmsg(int s, const struct msghdr *msg, int flags); } + SYS_RECVFROM = 29 // { ssize_t|sys||recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlenaddr); } + SYS_ACCEPT = 30 // { int|sys||accept(int s, struct sockaddr *name, socklen_t *anamelen); } + SYS_GETPEERNAME = 31 // { int|sys||getpeername(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_GETSOCKNAME = 32 // { int|sys||getsockname(int fdes, struct sockaddr *asa, socklen_t *alen); } + SYS_ACCESS = 33 // { int|sys||access(const char *path, int flags); } + SYS_CHFLAGS = 34 // { int|sys||chflags(const char *path, u_long flags); } + SYS_FCHFLAGS = 35 // { int|sys||fchflags(int fd, u_long flags); } + SYS_SYNC = 36 // { void|sys||sync(void); } + SYS_KILL = 37 // { int|sys||kill(pid_t pid, int signum); } + SYS_GETPPID = 39 // { pid_t|sys||getppid(void); } + SYS_DUP = 41 // { int|sys||dup(int fd); } + SYS_PIPE = 42 // { int|sys||pipe(void); } + SYS_GETEGID = 43 // { gid_t|sys||getegid(void); } + SYS_PROFIL = 44 // { int|sys||profil(char *samples, size_t size, u_long offset, u_int scale); } + SYS_KTRACE = 45 // { int|sys||ktrace(const char *fname, int ops, int facs, pid_t pid); } + SYS_GETGID = 47 // { gid_t|sys||getgid_with_egid(void); } + SYS___GETLOGIN = 49 // { int|sys||__getlogin(char *namebuf, size_t namelen); } + SYS___SETLOGIN = 50 // { int|sys||__setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int|sys||acct(const char *path); } + SYS_IOCTL = 54 // { int|sys||ioctl(int fd, u_long com, ... void *data); } + SYS_REVOKE = 56 // { int|sys||revoke(const char *path); } + SYS_SYMLINK = 57 // { int|sys||symlink(const char *path, const char *link); } + SYS_READLINK = 58 // { ssize_t|sys||readlink(const char *path, char *buf, size_t count); } + SYS_EXECVE = 59 // { int|sys||execve(const char *path, char * const *argp, char * const *envp); } + SYS_UMASK = 60 // { mode_t|sys||umask(mode_t newmask); } + SYS_CHROOT = 61 // { int|sys||chroot(const char *path); } + SYS_VFORK = 66 // { int|sys||vfork(void); } + SYS_SBRK = 69 // { int|sys||sbrk(intptr_t incr); } + SYS_SSTK = 70 // { int|sys||sstk(int incr); } + SYS_VADVISE = 72 // { int|sys||ovadvise(int anom); } + SYS_MUNMAP = 73 // { int|sys||munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int|sys||mprotect(void *addr, size_t len, int prot); } + SYS_MADVISE = 75 // { int|sys||madvise(void *addr, size_t len, int behav); } + SYS_MINCORE = 78 // { int|sys||mincore(void *addr, size_t len, char *vec); } + SYS_GETGROUPS = 79 // { int|sys||getgroups(int gidsetsize, gid_t *gidset); } + SYS_SETGROUPS = 80 // { int|sys||setgroups(int gidsetsize, const gid_t *gidset); } + SYS_GETPGRP = 81 // { int|sys||getpgrp(void); } + SYS_SETPGID = 82 // { int|sys||setpgid(pid_t pid, pid_t pgid); } + SYS_DUP2 = 90 // { int|sys||dup2(int from, int to); } + SYS_FCNTL = 92 // { int|sys||fcntl(int fd, int cmd, ... void *arg); } + SYS_FSYNC = 95 // { int|sys||fsync(int fd); } + SYS_SETPRIORITY = 96 // { int|sys||setpriority(int which, id_t who, int prio); } + SYS_CONNECT = 98 // { int|sys||connect(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_GETPRIORITY = 100 // { int|sys||getpriority(int which, id_t who); } + SYS_BIND = 104 // { int|sys||bind(int s, const struct sockaddr *name, socklen_t namelen); } + SYS_SETSOCKOPT = 105 // { int|sys||setsockopt(int s, int level, int name, const void *val, socklen_t valsize); } + SYS_LISTEN = 106 // { int|sys||listen(int s, int backlog); } + SYS_GETSOCKOPT = 118 // { int|sys||getsockopt(int s, int level, int name, void *val, socklen_t *avalsize); } + SYS_READV = 120 // { ssize_t|sys||readv(int fd, const struct iovec *iovp, int iovcnt); } + SYS_WRITEV = 121 // { ssize_t|sys||writev(int fd, const struct iovec *iovp, int iovcnt); } + SYS_FCHOWN = 123 // { int|sys||fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int|sys||fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int|sys||setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int|sys||setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int|sys||rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int|sys||flock(int fd, int how); } + SYS_MKFIFO = 132 // { int|sys||mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t|sys||sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen); } + SYS_SHUTDOWN = 134 // { int|sys||shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int|sys||socketpair(int domain, int type, int protocol, int *rsv); } + SYS_MKDIR = 136 // { int|sys||mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int|sys||rmdir(const char *path); } + SYS_SETSID = 147 // { int|sys||setsid(void); } + SYS_SYSARCH = 165 // { int|sys||sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t|sys||pread(int fd, void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_PWRITE = 174 // { ssize_t|sys||pwrite(int fd, const void *buf, size_t nbyte, int PAD, off_t offset); } + SYS_NTP_ADJTIME = 176 // { int|sys||ntp_adjtime(struct timex *tp); } + SYS_SETGID = 181 // { int|sys||setgid(gid_t gid); } + SYS_SETEGID = 182 // { int|sys||setegid(gid_t egid); } + SYS_SETEUID = 183 // { int|sys||seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long|sys||pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long|sys||fpathconf(int fd, int name); } + SYS_GETRLIMIT = 194 // { int|sys||getrlimit(int which, struct rlimit *rlp); } + SYS_SETRLIMIT = 195 // { int|sys||setrlimit(int which, const struct rlimit *rlp); } + SYS_MMAP = 197 // { void *|sys||mmap(void *addr, size_t len, int prot, int flags, int fd, long PAD, off_t pos); } + SYS_LSEEK = 199 // { off_t|sys||lseek(int fd, int PAD, off_t offset, int whence); } + SYS_TRUNCATE = 200 // { int|sys||truncate(const char *path, int PAD, off_t length); } + SYS_FTRUNCATE = 201 // { int|sys||ftruncate(int fd, int PAD, off_t length); } + SYS___SYSCTL = 202 // { int|sys||__sysctl(const int *name, u_int namelen, void *old, size_t *oldlenp, const void *new, size_t newlen); } + SYS_MLOCK = 203 // { int|sys||mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int|sys||munlock(const void *addr, size_t len); } + SYS_UNDELETE = 205 // { int|sys||undelete(const char *path); } + SYS_GETPGID = 207 // { pid_t|sys||getpgid(pid_t pid); } + SYS_REBOOT = 208 // { int|sys||reboot(int opt, char *bootstr); } + SYS_POLL = 209 // { int|sys||poll(struct pollfd *fds, u_int nfds, int timeout); } + SYS_SEMGET = 221 // { int|sys||semget(key_t key, int nsems, int semflg); } + SYS_SEMOP = 222 // { int|sys||semop(int semid, struct sembuf *sops, size_t nsops); } + SYS_SEMCONFIG = 223 // { int|sys||semconfig(int flag); } + SYS_MSGGET = 225 // { int|sys||msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int|sys||msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); } + SYS_MSGRCV = 227 // { ssize_t|sys||msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); } + SYS_SHMAT = 228 // { void *|sys||shmat(int shmid, const void *shmaddr, int shmflg); } + SYS_SHMDT = 230 // { int|sys||shmdt(const void *shmaddr); } + SYS_SHMGET = 231 // { int|sys||shmget(key_t key, size_t size, int shmflg); } + SYS_TIMER_CREATE = 235 // { int|sys||timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid); } + SYS_TIMER_DELETE = 236 // { int|sys||timer_delete(timer_t timerid); } + SYS_TIMER_GETOVERRUN = 239 // { int|sys||timer_getoverrun(timer_t timerid); } + SYS_FDATASYNC = 241 // { int|sys||fdatasync(int fd); } + SYS_MLOCKALL = 242 // { int|sys||mlockall(int flags); } + SYS_MUNLOCKALL = 243 // { int|sys||munlockall(void); } + SYS_SIGQUEUEINFO = 245 // { int|sys||sigqueueinfo(pid_t pid, const siginfo_t *info); } + SYS_MODCTL = 246 // { int|sys||modctl(int cmd, void *arg); } + SYS___POSIX_RENAME = 270 // { int|sys||__posix_rename(const char *from, const char *to); } + SYS_SWAPCTL = 271 // { int|sys||swapctl(int cmd, void *arg, int misc); } + SYS_MINHERIT = 273 // { int|sys||minherit(void *addr, size_t len, int inherit); } + SYS_LCHMOD = 274 // { int|sys||lchmod(const char *path, mode_t mode); } + SYS_LCHOWN = 275 // { int|sys||lchown(const char *path, uid_t uid, gid_t gid); } + SYS___POSIX_CHOWN = 283 // { int|sys||__posix_chown(const char *path, uid_t uid, gid_t gid); } + SYS___POSIX_FCHOWN = 284 // { int|sys||__posix_fchown(int fd, uid_t uid, gid_t gid); } + SYS___POSIX_LCHOWN = 285 // { int|sys||__posix_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 286 // { pid_t|sys||getsid(pid_t pid); } + SYS___CLONE = 287 // { pid_t|sys||__clone(int flags, void *stack); } + SYS_FKTRACE = 288 // { int|sys||fktrace(int fd, int ops, int facs, pid_t pid); } + SYS_PREADV = 289 // { ssize_t|sys||preadv(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS_PWRITEV = 290 // { ssize_t|sys||pwritev(int fd, const struct iovec *iovp, int iovcnt, int PAD, off_t offset); } + SYS___GETCWD = 296 // { int|sys||__getcwd(char *bufp, size_t length); } + SYS_FCHROOT = 297 // { int|sys||fchroot(int fd); } + SYS_LCHFLAGS = 304 // { int|sys||lchflags(const char *path, u_long flags); } + SYS_ISSETUGID = 305 // { int|sys||issetugid(void); } + SYS_UTRACE = 306 // { int|sys||utrace(const char *label, void *addr, size_t len); } + SYS_GETCONTEXT = 307 // { int|sys||getcontext(struct __ucontext *ucp); } + SYS_SETCONTEXT = 308 // { int|sys||setcontext(const struct __ucontext *ucp); } + SYS__LWP_CREATE = 309 // { int|sys||_lwp_create(const struct __ucontext *ucp, u_long flags, lwpid_t *new_lwp); } + SYS__LWP_EXIT = 310 // { int|sys||_lwp_exit(void); } + SYS__LWP_SELF = 311 // { lwpid_t|sys||_lwp_self(void); } + SYS__LWP_WAIT = 312 // { int|sys||_lwp_wait(lwpid_t wait_for, lwpid_t *departed); } + SYS__LWP_SUSPEND = 313 // { int|sys||_lwp_suspend(lwpid_t target); } + SYS__LWP_CONTINUE = 314 // { int|sys||_lwp_continue(lwpid_t target); } + SYS__LWP_WAKEUP = 315 // { int|sys||_lwp_wakeup(lwpid_t target); } + SYS__LWP_GETPRIVATE = 316 // { void *|sys||_lwp_getprivate(void); } + SYS__LWP_SETPRIVATE = 317 // { void|sys||_lwp_setprivate(void *ptr); } + SYS__LWP_KILL = 318 // { int|sys||_lwp_kill(lwpid_t target, int signo); } + SYS__LWP_DETACH = 319 // { int|sys||_lwp_detach(lwpid_t target); } + SYS__LWP_UNPARK = 321 // { int|sys||_lwp_unpark(lwpid_t target, const void *hint); } + SYS__LWP_UNPARK_ALL = 322 // { ssize_t|sys||_lwp_unpark_all(const lwpid_t *targets, size_t ntargets, const void *hint); } + SYS__LWP_SETNAME = 323 // { int|sys||_lwp_setname(lwpid_t target, const char *name); } + SYS__LWP_GETNAME = 324 // { int|sys||_lwp_getname(lwpid_t target, char *name, size_t len); } + SYS__LWP_CTL = 325 // { int|sys||_lwp_ctl(int features, struct lwpctl **address); } + SYS___SIGACTION_SIGTRAMP = 340 // { int|sys||__sigaction_sigtramp(int signum, const struct sigaction *nsa, struct sigaction *osa, const void *tramp, int vers); } + SYS_PMC_GET_INFO = 341 // { int|sys||pmc_get_info(int ctr, int op, void *args); } + SYS_PMC_CONTROL = 342 // { int|sys||pmc_control(int ctr, int op, void *args); } + SYS_RASCTL = 343 // { int|sys||rasctl(void *addr, size_t len, int op); } + SYS_KQUEUE = 344 // { int|sys||kqueue(void); } + SYS__SCHED_SETPARAM = 346 // { int|sys||_sched_setparam(pid_t pid, lwpid_t lid, int policy, const struct sched_param *params); } + SYS__SCHED_GETPARAM = 347 // { int|sys||_sched_getparam(pid_t pid, lwpid_t lid, int *policy, struct sched_param *params); } + SYS__SCHED_SETAFFINITY = 348 // { int|sys||_sched_setaffinity(pid_t pid, lwpid_t lid, size_t size, const cpuset_t *cpuset); } + SYS__SCHED_GETAFFINITY = 349 // { int|sys||_sched_getaffinity(pid_t pid, lwpid_t lid, size_t size, cpuset_t *cpuset); } + SYS_SCHED_YIELD = 350 // { int|sys||sched_yield(void); } + SYS_FSYNC_RANGE = 354 // { int|sys||fsync_range(int fd, int flags, off_t start, off_t length); } + SYS_UUIDGEN = 355 // { int|sys||uuidgen(struct uuid *store, int count); } + SYS_GETVFSSTAT = 356 // { int|sys||getvfsstat(struct statvfs *buf, size_t bufsize, int flags); } + SYS_STATVFS1 = 357 // { int|sys||statvfs1(const char *path, struct statvfs *buf, int flags); } + SYS_FSTATVFS1 = 358 // { int|sys||fstatvfs1(int fd, struct statvfs *buf, int flags); } + SYS_EXTATTRCTL = 360 // { int|sys||extattrctl(const char *path, int cmd, const char *filename, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FILE = 361 // { int|sys||extattr_set_file(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FILE = 362 // { ssize_t|sys||extattr_get_file(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FILE = 363 // { int|sys||extattr_delete_file(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_FD = 364 // { int|sys||extattr_set_fd(int fd, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_FD = 365 // { ssize_t|sys||extattr_get_fd(int fd, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_FD = 366 // { int|sys||extattr_delete_fd(int fd, int attrnamespace, const char *attrname); } + SYS_EXTATTR_SET_LINK = 367 // { int|sys||extattr_set_link(const char *path, int attrnamespace, const char *attrname, const void *data, size_t nbytes); } + SYS_EXTATTR_GET_LINK = 368 // { ssize_t|sys||extattr_get_link(const char *path, int attrnamespace, const char *attrname, void *data, size_t nbytes); } + SYS_EXTATTR_DELETE_LINK = 369 // { int|sys||extattr_delete_link(const char *path, int attrnamespace, const char *attrname); } + SYS_EXTATTR_LIST_FD = 370 // { ssize_t|sys||extattr_list_fd(int fd, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_FILE = 371 // { ssize_t|sys||extattr_list_file(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_EXTATTR_LIST_LINK = 372 // { ssize_t|sys||extattr_list_link(const char *path, int attrnamespace, void *data, size_t nbytes); } + SYS_SETXATTR = 375 // { int|sys||setxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_LSETXATTR = 376 // { int|sys||lsetxattr(const char *path, const char *name, const void *value, size_t size, int flags); } + SYS_FSETXATTR = 377 // { int|sys||fsetxattr(int fd, const char *name, const void *value, size_t size, int flags); } + SYS_GETXATTR = 378 // { int|sys||getxattr(const char *path, const char *name, void *value, size_t size); } + SYS_LGETXATTR = 379 // { int|sys||lgetxattr(const char *path, const char *name, void *value, size_t size); } + SYS_FGETXATTR = 380 // { int|sys||fgetxattr(int fd, const char *name, void *value, size_t size); } + SYS_LISTXATTR = 381 // { int|sys||listxattr(const char *path, char *list, size_t size); } + SYS_LLISTXATTR = 382 // { int|sys||llistxattr(const char *path, char *list, size_t size); } + SYS_FLISTXATTR = 383 // { int|sys||flistxattr(int fd, char *list, size_t size); } + SYS_REMOVEXATTR = 384 // { int|sys||removexattr(const char *path, const char *name); } + SYS_LREMOVEXATTR = 385 // { int|sys||lremovexattr(const char *path, const char *name); } + SYS_FREMOVEXATTR = 386 // { int|sys||fremovexattr(int fd, const char *name); } + SYS_GETDENTS = 390 // { int|sys|30|getdents(int fd, char *buf, size_t count); } + SYS_SOCKET = 394 // { int|sys|30|socket(int domain, int type, int protocol); } + SYS_GETFH = 395 // { int|sys|30|getfh(const char *fname, void *fhp, size_t *fh_size); } + SYS_MOUNT = 410 // { int|sys|50|mount(const char *type, const char *path, int flags, void *data, size_t data_len); } + SYS_MREMAP = 411 // { void *|sys||mremap(void *old_address, size_t old_size, void *new_address, size_t new_size, int flags); } + SYS_PSET_CREATE = 412 // { int|sys||pset_create(psetid_t *psid); } + SYS_PSET_DESTROY = 413 // { int|sys||pset_destroy(psetid_t psid); } + SYS_PSET_ASSIGN = 414 // { int|sys||pset_assign(psetid_t psid, cpuid_t cpuid, psetid_t *opsid); } + SYS__PSET_BIND = 415 // { int|sys||_pset_bind(idtype_t idtype, id_t first_id, id_t second_id, psetid_t psid, psetid_t *opsid); } + SYS_POSIX_FADVISE = 416 // { int|sys|50|posix_fadvise(int fd, int PAD, off_t offset, off_t len, int advice); } + SYS_SELECT = 417 // { int|sys|50|select(int nd, fd_set *in, fd_set *ou, fd_set *ex, struct timeval *tv); } + SYS_GETTIMEOFDAY = 418 // { int|sys|50|gettimeofday(struct timeval *tp, void *tzp); } + SYS_SETTIMEOFDAY = 419 // { int|sys|50|settimeofday(const struct timeval *tv, const void *tzp); } + SYS_UTIMES = 420 // { int|sys|50|utimes(const char *path, const struct timeval *tptr); } + SYS_ADJTIME = 421 // { int|sys|50|adjtime(const struct timeval *delta, struct timeval *olddelta); } + SYS_FUTIMES = 423 // { int|sys|50|futimes(int fd, const struct timeval *tptr); } + SYS_LUTIMES = 424 // { int|sys|50|lutimes(const char *path, const struct timeval *tptr); } + SYS_SETITIMER = 425 // { int|sys|50|setitimer(int which, const struct itimerval *itv, struct itimerval *oitv); } + SYS_GETITIMER = 426 // { int|sys|50|getitimer(int which, struct itimerval *itv); } + SYS_CLOCK_GETTIME = 427 // { int|sys|50|clock_gettime(clockid_t clock_id, struct timespec *tp); } + SYS_CLOCK_SETTIME = 428 // { int|sys|50|clock_settime(clockid_t clock_id, const struct timespec *tp); } + SYS_CLOCK_GETRES = 429 // { int|sys|50|clock_getres(clockid_t clock_id, struct timespec *tp); } + SYS_NANOSLEEP = 430 // { int|sys|50|nanosleep(const struct timespec *rqtp, struct timespec *rmtp); } + SYS___SIGTIMEDWAIT = 431 // { int|sys|50|__sigtimedwait(const sigset_t *set, siginfo_t *info, struct timespec *timeout); } + SYS__LWP_PARK = 434 // { int|sys|50|_lwp_park(const struct timespec *ts, lwpid_t unpark, const void *hint, const void *unparkhint); } + SYS_KEVENT = 435 // { int|sys|50|kevent(int fd, const struct kevent *changelist, size_t nchanges, struct kevent *eventlist, size_t nevents, const struct timespec *timeout); } + SYS_PSELECT = 436 // { int|sys|50|pselect(int nd, fd_set *in, fd_set *ou, fd_set *ex, const struct timespec *ts, const sigset_t *mask); } + SYS_POLLTS = 437 // { int|sys|50|pollts(struct pollfd *fds, u_int nfds, const struct timespec *ts, const sigset_t *mask); } + SYS_STAT = 439 // { int|sys|50|stat(const char *path, struct stat *ub); } + SYS_FSTAT = 440 // { int|sys|50|fstat(int fd, struct stat *sb); } + SYS_LSTAT = 441 // { int|sys|50|lstat(const char *path, struct stat *ub); } + SYS___SEMCTL = 442 // { int|sys|50|__semctl(int semid, int semnum, int cmd, ... union __semun *arg); } + SYS_SHMCTL = 443 // { int|sys|50|shmctl(int shmid, int cmd, struct shmid_ds *buf); } + SYS_MSGCTL = 444 // { int|sys|50|msgctl(int msqid, int cmd, struct msqid_ds *buf); } + SYS_GETRUSAGE = 445 // { int|sys|50|getrusage(int who, struct rusage *rusage); } + SYS_TIMER_SETTIME = 446 // { int|sys|50|timer_settime(timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue); } + SYS_TIMER_GETTIME = 447 // { int|sys|50|timer_gettime(timer_t timerid, struct itimerspec *value); } + SYS_NTP_GETTIME = 448 // { int|sys|50|ntp_gettime(struct ntptimeval *ntvp); } + SYS_WAIT4 = 449 // { int|sys|50|wait4(pid_t pid, int *status, int options, struct rusage *rusage); } + SYS_MKNOD = 450 // { int|sys|50|mknod(const char *path, mode_t mode, dev_t dev); } + SYS_FHSTAT = 451 // { int|sys|50|fhstat(const void *fhp, size_t fh_size, struct stat *sb); } + SYS_PIPE2 = 453 // { int|sys||pipe2(int *fildes, int flags); } + SYS_DUP3 = 454 // { int|sys||dup3(int from, int to, int flags); } + SYS_KQUEUE1 = 455 // { int|sys||kqueue1(int flags); } + SYS_PACCEPT = 456 // { int|sys||paccept(int s, struct sockaddr *name, socklen_t *anamelen, const sigset_t *mask, int flags); } + SYS_LINKAT = 457 // { int|sys||linkat(int fd1, const char *name1, int fd2, const char *name2, int flags); } + SYS_RENAMEAT = 458 // { int|sys||renameat(int fromfd, const char *from, int tofd, const char *to); } + SYS_MKFIFOAT = 459 // { int|sys||mkfifoat(int fd, const char *path, mode_t mode); } + SYS_MKNODAT = 460 // { int|sys||mknodat(int fd, const char *path, mode_t mode, uint32_t dev); } + SYS_MKDIRAT = 461 // { int|sys||mkdirat(int fd, const char *path, mode_t mode); } + SYS_FACCESSAT = 462 // { int|sys||faccessat(int fd, const char *path, int amode, int flag); } + SYS_FCHMODAT = 463 // { int|sys||fchmodat(int fd, const char *path, mode_t mode, int flag); } + SYS_FCHOWNAT = 464 // { int|sys||fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag); } + SYS_FEXECVE = 465 // { int|sys||fexecve(int fd, char * const *argp, char * const *envp); } + SYS_FSTATAT = 466 // { int|sys||fstatat(int fd, const char *path, struct stat *buf, int flag); } + SYS_UTIMENSAT = 467 // { int|sys||utimensat(int fd, const char *path, const struct timespec *tptr, int flag); } + SYS_OPENAT = 468 // { int|sys||openat(int fd, const char *path, int oflags, ... mode_t mode); } + SYS_READLINKAT = 469 // { int|sys||readlinkat(int fd, const char *path, char *buf, size_t bufsize); } + SYS_SYMLINKAT = 470 // { int|sys||symlinkat(const char *path1, int fd, const char *path2); } + SYS_UNLINKAT = 471 // { int|sys||unlinkat(int fd, const char *path, int flag); } + SYS_FUTIMENS = 472 // { int|sys||futimens(int fd, const struct timespec *tptr); } + SYS___QUOTACTL = 473 // { int|sys||__quotactl(const char *path, struct quotactl_args *args); } + SYS_POSIX_SPAWN = 474 // { int|sys||posix_spawn(pid_t *pid, const char *path, const struct posix_spawn_file_actions *file_actions, const struct posix_spawnattr *attrp, char *const *argv, char *const *envp); } + SYS_RECVMMSG = 475 // { int|sys||recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct timespec *timeout); } + SYS_SENDMMSG = 476 // { int|sys||sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags); } +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go new file mode 100644 index 0000000000000000000000000000000000000000..3e8ce2a1ddffd213a530aaf4dfe256cf8bbd9f9c --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go @@ -0,0 +1,207 @@ +// mksysnum_openbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build 386,openbsd + +package unix + +const ( + SYS_EXIT = 1 // { void sys_exit(int rval); } + SYS_FORK = 2 // { int sys_fork(void); } + SYS_READ = 3 // { ssize_t sys_read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t sys_write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int sys_open(const char *path, \ + SYS_CLOSE = 6 // { int sys_close(int fd); } + SYS___TFORK = 8 // { int sys___tfork(const struct __tfork *param, \ + SYS_LINK = 9 // { int sys_link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int sys_unlink(const char *path); } + SYS_WAIT4 = 11 // { pid_t sys_wait4(pid_t pid, int *status, \ + SYS_CHDIR = 12 // { int sys_chdir(const char *path); } + SYS_FCHDIR = 13 // { int sys_fchdir(int fd); } + SYS_MKNOD = 14 // { int sys_mknod(const char *path, mode_t mode, \ + SYS_CHMOD = 15 // { int sys_chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int sys_chown(const char *path, uid_t uid, \ + SYS_OBREAK = 17 // { int sys_obreak(char *nsize); } break + SYS_GETDTABLECOUNT = 18 // { int sys_getdtablecount(void); } + SYS_GETRUSAGE = 19 // { int sys_getrusage(int who, \ + SYS_GETPID = 20 // { pid_t sys_getpid(void); } + SYS_MOUNT = 21 // { int sys_mount(const char *type, const char *path, \ + SYS_UNMOUNT = 22 // { int sys_unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int sys_setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t sys_getuid(void); } + SYS_GETEUID = 25 // { uid_t sys_geteuid(void); } + SYS_PTRACE = 26 // { int sys_ptrace(int req, pid_t pid, caddr_t addr, \ + SYS_RECVMSG = 27 // { ssize_t sys_recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { ssize_t sys_sendmsg(int s, \ + SYS_RECVFROM = 29 // { ssize_t sys_recvfrom(int s, void *buf, size_t len, \ + SYS_ACCEPT = 30 // { int sys_accept(int s, struct sockaddr *name, \ + SYS_GETPEERNAME = 31 // { int sys_getpeername(int fdes, struct sockaddr *asa, \ + SYS_GETSOCKNAME = 32 // { int sys_getsockname(int fdes, struct sockaddr *asa, \ + SYS_ACCESS = 33 // { int sys_access(const char *path, int flags); } + SYS_CHFLAGS = 34 // { int sys_chflags(const char *path, u_int flags); } + SYS_FCHFLAGS = 35 // { int sys_fchflags(int fd, u_int flags); } + SYS_SYNC = 36 // { void sys_sync(void); } + SYS_KILL = 37 // { int sys_kill(int pid, int signum); } + SYS_STAT = 38 // { int sys_stat(const char *path, struct stat *ub); } + SYS_GETPPID = 39 // { pid_t sys_getppid(void); } + SYS_LSTAT = 40 // { int sys_lstat(const char *path, struct stat *ub); } + SYS_DUP = 41 // { int sys_dup(int fd); } + SYS_FSTATAT = 42 // { int sys_fstatat(int fd, const char *path, \ + SYS_GETEGID = 43 // { gid_t sys_getegid(void); } + SYS_PROFIL = 44 // { int sys_profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int sys_ktrace(const char *fname, int ops, \ + SYS_SIGACTION = 46 // { int sys_sigaction(int signum, \ + SYS_GETGID = 47 // { gid_t sys_getgid(void); } + SYS_SIGPROCMASK = 48 // { int sys_sigprocmask(int how, sigset_t mask); } + SYS_GETLOGIN = 49 // { int sys_getlogin(char *namebuf, u_int namelen); } + SYS_SETLOGIN = 50 // { int sys_setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int sys_acct(const char *path); } + SYS_SIGPENDING = 52 // { int sys_sigpending(void); } + SYS_FSTAT = 53 // { int sys_fstat(int fd, struct stat *sb); } + SYS_IOCTL = 54 // { int sys_ioctl(int fd, \ + SYS_REBOOT = 55 // { int sys_reboot(int opt); } + SYS_REVOKE = 56 // { int sys_revoke(const char *path); } + SYS_SYMLINK = 57 // { int sys_symlink(const char *path, \ + SYS_READLINK = 58 // { int sys_readlink(const char *path, char *buf, \ + SYS_EXECVE = 59 // { int sys_execve(const char *path, \ + SYS_UMASK = 60 // { mode_t sys_umask(mode_t newmask); } + SYS_CHROOT = 61 // { int sys_chroot(const char *path); } + SYS_GETFSSTAT = 62 // { int sys_getfsstat(struct statfs *buf, size_t bufsize, \ + SYS_STATFS = 63 // { int sys_statfs(const char *path, \ + SYS_FSTATFS = 64 // { int sys_fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 65 // { int sys_fhstatfs(const fhandle_t *fhp, \ + SYS_VFORK = 66 // { int sys_vfork(void); } + SYS_GETTIMEOFDAY = 67 // { int sys_gettimeofday(struct timeval *tp, \ + SYS_SETTIMEOFDAY = 68 // { int sys_settimeofday(const struct timeval *tv, \ + SYS_SETITIMER = 69 // { int sys_setitimer(int which, \ + SYS_GETITIMER = 70 // { int sys_getitimer(int which, \ + SYS_SELECT = 71 // { int sys_select(int nd, fd_set *in, fd_set *ou, \ + SYS_KEVENT = 72 // { int sys_kevent(int fd, \ + SYS_MUNMAP = 73 // { int sys_munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int sys_mprotect(void *addr, size_t len, \ + SYS_MADVISE = 75 // { int sys_madvise(void *addr, size_t len, \ + SYS_UTIMES = 76 // { int sys_utimes(const char *path, \ + SYS_FUTIMES = 77 // { int sys_futimes(int fd, \ + SYS_MINCORE = 78 // { int sys_mincore(void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int sys_getgroups(int gidsetsize, \ + SYS_SETGROUPS = 80 // { int sys_setgroups(int gidsetsize, \ + SYS_GETPGRP = 81 // { int sys_getpgrp(void); } + SYS_SETPGID = 82 // { int sys_setpgid(pid_t pid, int pgid); } + SYS_UTIMENSAT = 84 // { int sys_utimensat(int fd, const char *path, \ + SYS_FUTIMENS = 85 // { int sys_futimens(int fd, \ + SYS_CLOCK_GETTIME = 87 // { int sys_clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 88 // { int sys_clock_settime(clockid_t clock_id, \ + SYS_CLOCK_GETRES = 89 // { int sys_clock_getres(clockid_t clock_id, \ + SYS_DUP2 = 90 // { int sys_dup2(int from, int to); } + SYS_NANOSLEEP = 91 // { int sys_nanosleep(const struct timespec *rqtp, \ + SYS_FCNTL = 92 // { int sys_fcntl(int fd, int cmd, ... void *arg); } + SYS___THRSLEEP = 94 // { int sys___thrsleep(const volatile void *ident, \ + SYS_FSYNC = 95 // { int sys_fsync(int fd); } + SYS_SETPRIORITY = 96 // { int sys_setpriority(int which, id_t who, int prio); } + SYS_SOCKET = 97 // { int sys_socket(int domain, int type, int protocol); } + SYS_CONNECT = 98 // { int sys_connect(int s, const struct sockaddr *name, \ + SYS_GETDENTS = 99 // { int sys_getdents(int fd, void *buf, size_t buflen); } + SYS_GETPRIORITY = 100 // { int sys_getpriority(int which, id_t who); } + SYS_SIGRETURN = 103 // { int sys_sigreturn(struct sigcontext *sigcntxp); } + SYS_BIND = 104 // { int sys_bind(int s, const struct sockaddr *name, \ + SYS_SETSOCKOPT = 105 // { int sys_setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int sys_listen(int s, int backlog); } + SYS_PPOLL = 109 // { int sys_ppoll(struct pollfd *fds, \ + SYS_PSELECT = 110 // { int sys_pselect(int nd, fd_set *in, fd_set *ou, \ + SYS_SIGSUSPEND = 111 // { int sys_sigsuspend(int mask); } + SYS_GETSOCKOPT = 118 // { int sys_getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { ssize_t sys_readv(int fd, \ + SYS_WRITEV = 121 // { ssize_t sys_writev(int fd, \ + SYS_FCHOWN = 123 // { int sys_fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int sys_fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int sys_setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int sys_setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int sys_rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int sys_flock(int fd, int how); } + SYS_MKFIFO = 132 // { int sys_mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t sys_sendto(int s, const void *buf, \ + SYS_SHUTDOWN = 134 // { int sys_shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int sys_socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int sys_mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int sys_rmdir(const char *path); } + SYS_ADJTIME = 140 // { int sys_adjtime(const struct timeval *delta, \ + SYS_SETSID = 147 // { int sys_setsid(void); } + SYS_QUOTACTL = 148 // { int sys_quotactl(const char *path, int cmd, \ + SYS_NFSSVC = 155 // { int sys_nfssvc(int flag, void *argp); } + SYS_GETFH = 161 // { int sys_getfh(const char *fname, fhandle_t *fhp); } + SYS_SYSARCH = 165 // { int sys_sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t sys_pread(int fd, void *buf, \ + SYS_PWRITE = 174 // { ssize_t sys_pwrite(int fd, const void *buf, \ + SYS_SETGID = 181 // { int sys_setgid(gid_t gid); } + SYS_SETEGID = 182 // { int sys_setegid(gid_t egid); } + SYS_SETEUID = 183 // { int sys_seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long sys_pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long sys_fpathconf(int fd, int name); } + SYS_SWAPCTL = 193 // { int sys_swapctl(int cmd, const void *arg, int misc); } + SYS_GETRLIMIT = 194 // { int sys_getrlimit(int which, \ + SYS_SETRLIMIT = 195 // { int sys_setrlimit(int which, \ + SYS_MMAP = 197 // { void *sys_mmap(void *addr, size_t len, int prot, \ + SYS_LSEEK = 199 // { off_t sys_lseek(int fd, int pad, off_t offset, \ + SYS_TRUNCATE = 200 // { int sys_truncate(const char *path, int pad, \ + SYS_FTRUNCATE = 201 // { int sys_ftruncate(int fd, int pad, off_t length); } + SYS___SYSCTL = 202 // { int sys___sysctl(const int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int sys_mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int sys_munlock(const void *addr, size_t len); } + SYS_GETPGID = 207 // { pid_t sys_getpgid(pid_t pid); } + SYS_UTRACE = 209 // { int sys_utrace(const char *label, const void *addr, \ + SYS_SEMGET = 221 // { int sys_semget(key_t key, int nsems, int semflg); } + SYS_MSGGET = 225 // { int sys_msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int sys_msgsnd(int msqid, const void *msgp, size_t msgsz, \ + SYS_MSGRCV = 227 // { int sys_msgrcv(int msqid, void *msgp, size_t msgsz, \ + SYS_SHMAT = 228 // { void *sys_shmat(int shmid, const void *shmaddr, \ + SYS_SHMDT = 230 // { int sys_shmdt(const void *shmaddr); } + SYS_MINHERIT = 250 // { int sys_minherit(void *addr, size_t len, \ + SYS_POLL = 252 // { int sys_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int sys_issetugid(void); } + SYS_LCHOWN = 254 // { int sys_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 255 // { pid_t sys_getsid(pid_t pid); } + SYS_MSYNC = 256 // { int sys_msync(void *addr, size_t len, int flags); } + SYS_PIPE = 263 // { int sys_pipe(int *fdp); } + SYS_FHOPEN = 264 // { int sys_fhopen(const fhandle_t *fhp, int flags); } + SYS_PREADV = 267 // { ssize_t sys_preadv(int fd, \ + SYS_PWRITEV = 268 // { ssize_t sys_pwritev(int fd, \ + SYS_KQUEUE = 269 // { int sys_kqueue(void); } + SYS_MLOCKALL = 271 // { int sys_mlockall(int flags); } + SYS_MUNLOCKALL = 272 // { int sys_munlockall(void); } + SYS_GETRESUID = 281 // { int sys_getresuid(uid_t *ruid, uid_t *euid, \ + SYS_SETRESUID = 282 // { int sys_setresuid(uid_t ruid, uid_t euid, \ + SYS_GETRESGID = 283 // { int sys_getresgid(gid_t *rgid, gid_t *egid, \ + SYS_SETRESGID = 284 // { int sys_setresgid(gid_t rgid, gid_t egid, \ + SYS_MQUERY = 286 // { void *sys_mquery(void *addr, size_t len, int prot, \ + SYS_CLOSEFROM = 287 // { int sys_closefrom(int fd); } + SYS_SIGALTSTACK = 288 // { int sys_sigaltstack(const struct sigaltstack *nss, \ + SYS_SHMGET = 289 // { int sys_shmget(key_t key, size_t size, int shmflg); } + SYS_SEMOP = 290 // { int sys_semop(int semid, struct sembuf *sops, \ + SYS_FHSTAT = 294 // { int sys_fhstat(const fhandle_t *fhp, \ + SYS___SEMCTL = 295 // { int sys___semctl(int semid, int semnum, int cmd, \ + SYS_SHMCTL = 296 // { int sys_shmctl(int shmid, int cmd, \ + SYS_MSGCTL = 297 // { int sys_msgctl(int msqid, int cmd, \ + SYS_SCHED_YIELD = 298 // { int sys_sched_yield(void); } + SYS_GETTHRID = 299 // { pid_t sys_getthrid(void); } + SYS___THRWAKEUP = 301 // { int sys___thrwakeup(const volatile void *ident, \ + SYS___THREXIT = 302 // { void sys___threxit(pid_t *notdead); } + SYS___THRSIGDIVERT = 303 // { int sys___thrsigdivert(sigset_t sigmask, \ + SYS___GETCWD = 304 // { int sys___getcwd(char *buf, size_t len); } + SYS_ADJFREQ = 305 // { int sys_adjfreq(const int64_t *freq, \ + SYS_SETRTABLE = 310 // { int sys_setrtable(int rtableid); } + SYS_GETRTABLE = 311 // { int sys_getrtable(void); } + SYS_FACCESSAT = 313 // { int sys_faccessat(int fd, const char *path, \ + SYS_FCHMODAT = 314 // { int sys_fchmodat(int fd, const char *path, \ + SYS_FCHOWNAT = 315 // { int sys_fchownat(int fd, const char *path, \ + SYS_LINKAT = 317 // { int sys_linkat(int fd1, const char *path1, int fd2, \ + SYS_MKDIRAT = 318 // { int sys_mkdirat(int fd, const char *path, \ + SYS_MKFIFOAT = 319 // { int sys_mkfifoat(int fd, const char *path, \ + SYS_MKNODAT = 320 // { int sys_mknodat(int fd, const char *path, \ + SYS_OPENAT = 321 // { int sys_openat(int fd, const char *path, int flags, \ + SYS_READLINKAT = 322 // { ssize_t sys_readlinkat(int fd, const char *path, \ + SYS_RENAMEAT = 323 // { int sys_renameat(int fromfd, const char *from, \ + SYS_SYMLINKAT = 324 // { int sys_symlinkat(const char *path, int fd, \ + SYS_UNLINKAT = 325 // { int sys_unlinkat(int fd, const char *path, \ + SYS___SET_TCB = 329 // { void sys___set_tcb(void *tcb); } + SYS___GET_TCB = 330 // { void *sys___get_tcb(void); } +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..bd28146ddd5ee83d33f653954012d602e4c2ab92 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go @@ -0,0 +1,207 @@ +// mksysnum_openbsd.pl +// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT + +// +build amd64,openbsd + +package unix + +const ( + SYS_EXIT = 1 // { void sys_exit(int rval); } + SYS_FORK = 2 // { int sys_fork(void); } + SYS_READ = 3 // { ssize_t sys_read(int fd, void *buf, size_t nbyte); } + SYS_WRITE = 4 // { ssize_t sys_write(int fd, const void *buf, \ + SYS_OPEN = 5 // { int sys_open(const char *path, \ + SYS_CLOSE = 6 // { int sys_close(int fd); } + SYS___TFORK = 8 // { int sys___tfork(const struct __tfork *param, \ + SYS_LINK = 9 // { int sys_link(const char *path, const char *link); } + SYS_UNLINK = 10 // { int sys_unlink(const char *path); } + SYS_WAIT4 = 11 // { pid_t sys_wait4(pid_t pid, int *status, \ + SYS_CHDIR = 12 // { int sys_chdir(const char *path); } + SYS_FCHDIR = 13 // { int sys_fchdir(int fd); } + SYS_MKNOD = 14 // { int sys_mknod(const char *path, mode_t mode, \ + SYS_CHMOD = 15 // { int sys_chmod(const char *path, mode_t mode); } + SYS_CHOWN = 16 // { int sys_chown(const char *path, uid_t uid, \ + SYS_OBREAK = 17 // { int sys_obreak(char *nsize); } break + SYS_GETDTABLECOUNT = 18 // { int sys_getdtablecount(void); } + SYS_GETRUSAGE = 19 // { int sys_getrusage(int who, \ + SYS_GETPID = 20 // { pid_t sys_getpid(void); } + SYS_MOUNT = 21 // { int sys_mount(const char *type, const char *path, \ + SYS_UNMOUNT = 22 // { int sys_unmount(const char *path, int flags); } + SYS_SETUID = 23 // { int sys_setuid(uid_t uid); } + SYS_GETUID = 24 // { uid_t sys_getuid(void); } + SYS_GETEUID = 25 // { uid_t sys_geteuid(void); } + SYS_PTRACE = 26 // { int sys_ptrace(int req, pid_t pid, caddr_t addr, \ + SYS_RECVMSG = 27 // { ssize_t sys_recvmsg(int s, struct msghdr *msg, \ + SYS_SENDMSG = 28 // { ssize_t sys_sendmsg(int s, \ + SYS_RECVFROM = 29 // { ssize_t sys_recvfrom(int s, void *buf, size_t len, \ + SYS_ACCEPT = 30 // { int sys_accept(int s, struct sockaddr *name, \ + SYS_GETPEERNAME = 31 // { int sys_getpeername(int fdes, struct sockaddr *asa, \ + SYS_GETSOCKNAME = 32 // { int sys_getsockname(int fdes, struct sockaddr *asa, \ + SYS_ACCESS = 33 // { int sys_access(const char *path, int flags); } + SYS_CHFLAGS = 34 // { int sys_chflags(const char *path, u_int flags); } + SYS_FCHFLAGS = 35 // { int sys_fchflags(int fd, u_int flags); } + SYS_SYNC = 36 // { void sys_sync(void); } + SYS_KILL = 37 // { int sys_kill(int pid, int signum); } + SYS_STAT = 38 // { int sys_stat(const char *path, struct stat *ub); } + SYS_GETPPID = 39 // { pid_t sys_getppid(void); } + SYS_LSTAT = 40 // { int sys_lstat(const char *path, struct stat *ub); } + SYS_DUP = 41 // { int sys_dup(int fd); } + SYS_FSTATAT = 42 // { int sys_fstatat(int fd, const char *path, \ + SYS_GETEGID = 43 // { gid_t sys_getegid(void); } + SYS_PROFIL = 44 // { int sys_profil(caddr_t samples, size_t size, \ + SYS_KTRACE = 45 // { int sys_ktrace(const char *fname, int ops, \ + SYS_SIGACTION = 46 // { int sys_sigaction(int signum, \ + SYS_GETGID = 47 // { gid_t sys_getgid(void); } + SYS_SIGPROCMASK = 48 // { int sys_sigprocmask(int how, sigset_t mask); } + SYS_GETLOGIN = 49 // { int sys_getlogin(char *namebuf, u_int namelen); } + SYS_SETLOGIN = 50 // { int sys_setlogin(const char *namebuf); } + SYS_ACCT = 51 // { int sys_acct(const char *path); } + SYS_SIGPENDING = 52 // { int sys_sigpending(void); } + SYS_FSTAT = 53 // { int sys_fstat(int fd, struct stat *sb); } + SYS_IOCTL = 54 // { int sys_ioctl(int fd, \ + SYS_REBOOT = 55 // { int sys_reboot(int opt); } + SYS_REVOKE = 56 // { int sys_revoke(const char *path); } + SYS_SYMLINK = 57 // { int sys_symlink(const char *path, \ + SYS_READLINK = 58 // { int sys_readlink(const char *path, char *buf, \ + SYS_EXECVE = 59 // { int sys_execve(const char *path, \ + SYS_UMASK = 60 // { mode_t sys_umask(mode_t newmask); } + SYS_CHROOT = 61 // { int sys_chroot(const char *path); } + SYS_GETFSSTAT = 62 // { int sys_getfsstat(struct statfs *buf, size_t bufsize, \ + SYS_STATFS = 63 // { int sys_statfs(const char *path, \ + SYS_FSTATFS = 64 // { int sys_fstatfs(int fd, struct statfs *buf); } + SYS_FHSTATFS = 65 // { int sys_fhstatfs(const fhandle_t *fhp, \ + SYS_VFORK = 66 // { int sys_vfork(void); } + SYS_GETTIMEOFDAY = 67 // { int sys_gettimeofday(struct timeval *tp, \ + SYS_SETTIMEOFDAY = 68 // { int sys_settimeofday(const struct timeval *tv, \ + SYS_SETITIMER = 69 // { int sys_setitimer(int which, \ + SYS_GETITIMER = 70 // { int sys_getitimer(int which, \ + SYS_SELECT = 71 // { int sys_select(int nd, fd_set *in, fd_set *ou, \ + SYS_KEVENT = 72 // { int sys_kevent(int fd, \ + SYS_MUNMAP = 73 // { int sys_munmap(void *addr, size_t len); } + SYS_MPROTECT = 74 // { int sys_mprotect(void *addr, size_t len, \ + SYS_MADVISE = 75 // { int sys_madvise(void *addr, size_t len, \ + SYS_UTIMES = 76 // { int sys_utimes(const char *path, \ + SYS_FUTIMES = 77 // { int sys_futimes(int fd, \ + SYS_MINCORE = 78 // { int sys_mincore(void *addr, size_t len, \ + SYS_GETGROUPS = 79 // { int sys_getgroups(int gidsetsize, \ + SYS_SETGROUPS = 80 // { int sys_setgroups(int gidsetsize, \ + SYS_GETPGRP = 81 // { int sys_getpgrp(void); } + SYS_SETPGID = 82 // { int sys_setpgid(pid_t pid, int pgid); } + SYS_UTIMENSAT = 84 // { int sys_utimensat(int fd, const char *path, \ + SYS_FUTIMENS = 85 // { int sys_futimens(int fd, \ + SYS_CLOCK_GETTIME = 87 // { int sys_clock_gettime(clockid_t clock_id, \ + SYS_CLOCK_SETTIME = 88 // { int sys_clock_settime(clockid_t clock_id, \ + SYS_CLOCK_GETRES = 89 // { int sys_clock_getres(clockid_t clock_id, \ + SYS_DUP2 = 90 // { int sys_dup2(int from, int to); } + SYS_NANOSLEEP = 91 // { int sys_nanosleep(const struct timespec *rqtp, \ + SYS_FCNTL = 92 // { int sys_fcntl(int fd, int cmd, ... void *arg); } + SYS___THRSLEEP = 94 // { int sys___thrsleep(const volatile void *ident, \ + SYS_FSYNC = 95 // { int sys_fsync(int fd); } + SYS_SETPRIORITY = 96 // { int sys_setpriority(int which, id_t who, int prio); } + SYS_SOCKET = 97 // { int sys_socket(int domain, int type, int protocol); } + SYS_CONNECT = 98 // { int sys_connect(int s, const struct sockaddr *name, \ + SYS_GETDENTS = 99 // { int sys_getdents(int fd, void *buf, size_t buflen); } + SYS_GETPRIORITY = 100 // { int sys_getpriority(int which, id_t who); } + SYS_SIGRETURN = 103 // { int sys_sigreturn(struct sigcontext *sigcntxp); } + SYS_BIND = 104 // { int sys_bind(int s, const struct sockaddr *name, \ + SYS_SETSOCKOPT = 105 // { int sys_setsockopt(int s, int level, int name, \ + SYS_LISTEN = 106 // { int sys_listen(int s, int backlog); } + SYS_PPOLL = 109 // { int sys_ppoll(struct pollfd *fds, \ + SYS_PSELECT = 110 // { int sys_pselect(int nd, fd_set *in, fd_set *ou, \ + SYS_SIGSUSPEND = 111 // { int sys_sigsuspend(int mask); } + SYS_GETSOCKOPT = 118 // { int sys_getsockopt(int s, int level, int name, \ + SYS_READV = 120 // { ssize_t sys_readv(int fd, \ + SYS_WRITEV = 121 // { ssize_t sys_writev(int fd, \ + SYS_FCHOWN = 123 // { int sys_fchown(int fd, uid_t uid, gid_t gid); } + SYS_FCHMOD = 124 // { int sys_fchmod(int fd, mode_t mode); } + SYS_SETREUID = 126 // { int sys_setreuid(uid_t ruid, uid_t euid); } + SYS_SETREGID = 127 // { int sys_setregid(gid_t rgid, gid_t egid); } + SYS_RENAME = 128 // { int sys_rename(const char *from, const char *to); } + SYS_FLOCK = 131 // { int sys_flock(int fd, int how); } + SYS_MKFIFO = 132 // { int sys_mkfifo(const char *path, mode_t mode); } + SYS_SENDTO = 133 // { ssize_t sys_sendto(int s, const void *buf, \ + SYS_SHUTDOWN = 134 // { int sys_shutdown(int s, int how); } + SYS_SOCKETPAIR = 135 // { int sys_socketpair(int domain, int type, \ + SYS_MKDIR = 136 // { int sys_mkdir(const char *path, mode_t mode); } + SYS_RMDIR = 137 // { int sys_rmdir(const char *path); } + SYS_ADJTIME = 140 // { int sys_adjtime(const struct timeval *delta, \ + SYS_SETSID = 147 // { int sys_setsid(void); } + SYS_QUOTACTL = 148 // { int sys_quotactl(const char *path, int cmd, \ + SYS_NFSSVC = 155 // { int sys_nfssvc(int flag, void *argp); } + SYS_GETFH = 161 // { int sys_getfh(const char *fname, fhandle_t *fhp); } + SYS_SYSARCH = 165 // { int sys_sysarch(int op, void *parms); } + SYS_PREAD = 173 // { ssize_t sys_pread(int fd, void *buf, \ + SYS_PWRITE = 174 // { ssize_t sys_pwrite(int fd, const void *buf, \ + SYS_SETGID = 181 // { int sys_setgid(gid_t gid); } + SYS_SETEGID = 182 // { int sys_setegid(gid_t egid); } + SYS_SETEUID = 183 // { int sys_seteuid(uid_t euid); } + SYS_PATHCONF = 191 // { long sys_pathconf(const char *path, int name); } + SYS_FPATHCONF = 192 // { long sys_fpathconf(int fd, int name); } + SYS_SWAPCTL = 193 // { int sys_swapctl(int cmd, const void *arg, int misc); } + SYS_GETRLIMIT = 194 // { int sys_getrlimit(int which, \ + SYS_SETRLIMIT = 195 // { int sys_setrlimit(int which, \ + SYS_MMAP = 197 // { void *sys_mmap(void *addr, size_t len, int prot, \ + SYS_LSEEK = 199 // { off_t sys_lseek(int fd, int pad, off_t offset, \ + SYS_TRUNCATE = 200 // { int sys_truncate(const char *path, int pad, \ + SYS_FTRUNCATE = 201 // { int sys_ftruncate(int fd, int pad, off_t length); } + SYS___SYSCTL = 202 // { int sys___sysctl(const int *name, u_int namelen, \ + SYS_MLOCK = 203 // { int sys_mlock(const void *addr, size_t len); } + SYS_MUNLOCK = 204 // { int sys_munlock(const void *addr, size_t len); } + SYS_GETPGID = 207 // { pid_t sys_getpgid(pid_t pid); } + SYS_UTRACE = 209 // { int sys_utrace(const char *label, const void *addr, \ + SYS_SEMGET = 221 // { int sys_semget(key_t key, int nsems, int semflg); } + SYS_MSGGET = 225 // { int sys_msgget(key_t key, int msgflg); } + SYS_MSGSND = 226 // { int sys_msgsnd(int msqid, const void *msgp, size_t msgsz, \ + SYS_MSGRCV = 227 // { int sys_msgrcv(int msqid, void *msgp, size_t msgsz, \ + SYS_SHMAT = 228 // { void *sys_shmat(int shmid, const void *shmaddr, \ + SYS_SHMDT = 230 // { int sys_shmdt(const void *shmaddr); } + SYS_MINHERIT = 250 // { int sys_minherit(void *addr, size_t len, \ + SYS_POLL = 252 // { int sys_poll(struct pollfd *fds, \ + SYS_ISSETUGID = 253 // { int sys_issetugid(void); } + SYS_LCHOWN = 254 // { int sys_lchown(const char *path, uid_t uid, gid_t gid); } + SYS_GETSID = 255 // { pid_t sys_getsid(pid_t pid); } + SYS_MSYNC = 256 // { int sys_msync(void *addr, size_t len, int flags); } + SYS_PIPE = 263 // { int sys_pipe(int *fdp); } + SYS_FHOPEN = 264 // { int sys_fhopen(const fhandle_t *fhp, int flags); } + SYS_PREADV = 267 // { ssize_t sys_preadv(int fd, \ + SYS_PWRITEV = 268 // { ssize_t sys_pwritev(int fd, \ + SYS_KQUEUE = 269 // { int sys_kqueue(void); } + SYS_MLOCKALL = 271 // { int sys_mlockall(int flags); } + SYS_MUNLOCKALL = 272 // { int sys_munlockall(void); } + SYS_GETRESUID = 281 // { int sys_getresuid(uid_t *ruid, uid_t *euid, \ + SYS_SETRESUID = 282 // { int sys_setresuid(uid_t ruid, uid_t euid, \ + SYS_GETRESGID = 283 // { int sys_getresgid(gid_t *rgid, gid_t *egid, \ + SYS_SETRESGID = 284 // { int sys_setresgid(gid_t rgid, gid_t egid, \ + SYS_MQUERY = 286 // { void *sys_mquery(void *addr, size_t len, int prot, \ + SYS_CLOSEFROM = 287 // { int sys_closefrom(int fd); } + SYS_SIGALTSTACK = 288 // { int sys_sigaltstack(const struct sigaltstack *nss, \ + SYS_SHMGET = 289 // { int sys_shmget(key_t key, size_t size, int shmflg); } + SYS_SEMOP = 290 // { int sys_semop(int semid, struct sembuf *sops, \ + SYS_FHSTAT = 294 // { int sys_fhstat(const fhandle_t *fhp, \ + SYS___SEMCTL = 295 // { int sys___semctl(int semid, int semnum, int cmd, \ + SYS_SHMCTL = 296 // { int sys_shmctl(int shmid, int cmd, \ + SYS_MSGCTL = 297 // { int sys_msgctl(int msqid, int cmd, \ + SYS_SCHED_YIELD = 298 // { int sys_sched_yield(void); } + SYS_GETTHRID = 299 // { pid_t sys_getthrid(void); } + SYS___THRWAKEUP = 301 // { int sys___thrwakeup(const volatile void *ident, \ + SYS___THREXIT = 302 // { void sys___threxit(pid_t *notdead); } + SYS___THRSIGDIVERT = 303 // { int sys___thrsigdivert(sigset_t sigmask, \ + SYS___GETCWD = 304 // { int sys___getcwd(char *buf, size_t len); } + SYS_ADJFREQ = 305 // { int sys_adjfreq(const int64_t *freq, \ + SYS_SETRTABLE = 310 // { int sys_setrtable(int rtableid); } + SYS_GETRTABLE = 311 // { int sys_getrtable(void); } + SYS_FACCESSAT = 313 // { int sys_faccessat(int fd, const char *path, \ + SYS_FCHMODAT = 314 // { int sys_fchmodat(int fd, const char *path, \ + SYS_FCHOWNAT = 315 // { int sys_fchownat(int fd, const char *path, \ + SYS_LINKAT = 317 // { int sys_linkat(int fd1, const char *path1, int fd2, \ + SYS_MKDIRAT = 318 // { int sys_mkdirat(int fd, const char *path, \ + SYS_MKFIFOAT = 319 // { int sys_mkfifoat(int fd, const char *path, \ + SYS_MKNODAT = 320 // { int sys_mknodat(int fd, const char *path, \ + SYS_OPENAT = 321 // { int sys_openat(int fd, const char *path, int flags, \ + SYS_READLINKAT = 322 // { ssize_t sys_readlinkat(int fd, const char *path, \ + SYS_RENAMEAT = 323 // { int sys_renameat(int fromfd, const char *from, \ + SYS_SYMLINKAT = 324 // { int sys_symlinkat(const char *path, int fd, \ + SYS_UNLINKAT = 325 // { int sys_unlinkat(int fd, const char *path, \ + SYS___SET_TCB = 329 // { void sys___set_tcb(void *tcb); } + SYS___GET_TCB = 330 // { void *sys___get_tcb(void); } +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_solaris_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_solaris_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..c708659859020fdd5907c5a4b7ffc5febd8abd44 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/zsysnum_solaris_amd64.go @@ -0,0 +1,13 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build amd64,solaris + +package unix + +// TODO(aram): remove these before Go 1.3. +const ( + SYS_EXECVE = 59 + SYS_FCNTL = 62 +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go new file mode 100644 index 0000000000000000000000000000000000000000..2de1d44e281dd1b8b3822d6c7eac070d0e3e01fc --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_darwin_386.go @@ -0,0 +1,447 @@ +// +build 386,darwin +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_darwin.go + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timeval32 struct{} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev int32 + Mode uint16 + Nlink uint16 + Ino uint64 + Uid uint32 + Gid uint32 + Rdev int32 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Qspare [2]int64 +} + +type Statfs_t struct { + Bsize uint32 + Iosize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Owner uint32 + Type uint32 + Flags uint32 + Fssubtype uint32 + Fstypename [16]int8 + Mntonname [1024]int8 + Mntfromname [1024]int8 + Reserved [8]uint32 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Fstore_t struct { + Flags uint32 + Posmode int32 + Offset int64 + Length int64 + Bytesalloc int64 +} + +type Radvisory_t struct { + Offset int64 + Count int32 +} + +type Fbootstraptransfer_t struct { + Offset int64 + Length uint32 + Buffer *byte +} + +type Log2phys_t struct { + Flags uint32 + Contigbytes int64 + Devoffset int64 +} + +type Fsid struct { + Val [2]int32 +} + +type Dirent struct { + Ino uint64 + Seekoff uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [1024]int8 + Pad_cgo_0 [3]byte +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int32 + Udata *byte +} + +type FdSet struct { + Bits [32]int32 +} + +const ( + SizeofIfMsghdr = 0x70 + SizeofIfData = 0x60 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfmaMsghdr2 = 0x14 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Typelen uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Recvquota uint8 + Xmitquota uint8 + Unused1 uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Recvtiming uint32 + Xmittiming uint32 + Lastchange Timeval + Unused2 uint32 + Hwassist uint32 + Reserved1 uint32 + Reserved2 uint32 +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte +} + +type IfmaMsghdr2 struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Refcount int32 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire int32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Filler [4]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..044657878c854f5c98d12b6e88364370667f8a7d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go @@ -0,0 +1,462 @@ +// +build amd64,darwin +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_darwin.go + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int32 + Pad_cgo_0 [4]byte +} + +type Timeval32 struct { + Sec int32 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev int32 + Mode uint16 + Nlink uint16 + Ino uint64 + Uid uint32 + Gid uint32 + Rdev int32 + Pad_cgo_0 [4]byte + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Qspare [2]int64 +} + +type Statfs_t struct { + Bsize uint32 + Iosize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Owner uint32 + Type uint32 + Flags uint32 + Fssubtype uint32 + Fstypename [16]int8 + Mntonname [1024]int8 + Mntfromname [1024]int8 + Reserved [8]uint32 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Fstore_t struct { + Flags uint32 + Posmode int32 + Offset int64 + Length int64 + Bytesalloc int64 +} + +type Radvisory_t struct { + Offset int64 + Count int32 + Pad_cgo_0 [4]byte +} + +type Fbootstraptransfer_t struct { + Offset int64 + Length uint64 + Buffer *byte +} + +type Log2phys_t struct { + Flags uint32 + Pad_cgo_0 [8]byte + Pad_cgo_1 [8]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Dirent struct { + Ino uint64 + Seekoff uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [1024]int8 + Pad_cgo_0 [3]byte +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [32]int32 +} + +const ( + SizeofIfMsghdr = 0x70 + SizeofIfData = 0x60 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfmaMsghdr2 = 0x14 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Typelen uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Recvquota uint8 + Xmitquota uint8 + Unused1 uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Recvtiming uint32 + Xmittiming uint32 + Lastchange Timeval32 + Unused2 uint32 + Hwassist uint32 + Reserved1 uint32 + Reserved2 uint32 +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte +} + +type IfmaMsghdr2 struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Refcount int32 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire int32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Filler [4]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Pad_cgo_0 [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval32 + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type Termios struct { + Iflag uint64 + Oflag uint64 + Cflag uint64 + Lflag uint64 + Cc [20]uint8 + Pad_cgo_0 [4]byte + Ispeed uint64 + Ospeed uint64 +} + +const ( + AT_FDCWD = -0x2 + AT_SYMLINK_NOFOLLOW = 0x20 +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go new file mode 100644 index 0000000000000000000000000000000000000000..66df363ce5be96d32a84be7b75178a6ebf33748c --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go @@ -0,0 +1,449 @@ +// NOTE: cgo can't generate struct Stat_t and struct Statfs_t yet +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_darwin.go + +// +build arm,darwin + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timeval32 [0]byte + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev int32 + Mode uint16 + Nlink uint16 + Ino uint64 + Uid uint32 + Gid uint32 + Rdev int32 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Qspare [2]int64 +} + +type Statfs_t struct { + Bsize uint32 + Iosize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Owner uint32 + Type uint32 + Flags uint32 + Fssubtype uint32 + Fstypename [16]int8 + Mntonname [1024]int8 + Mntfromname [1024]int8 + Reserved [8]uint32 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Fstore_t struct { + Flags uint32 + Posmode int32 + Offset int64 + Length int64 + Bytesalloc int64 +} + +type Radvisory_t struct { + Offset int64 + Count int32 +} + +type Fbootstraptransfer_t struct { + Offset int64 + Length uint32 + Buffer *byte +} + +type Log2phys_t struct { + Flags uint32 + Contigbytes int64 + Devoffset int64 +} + +type Fsid struct { + Val [2]int32 +} + +type Dirent struct { + Ino uint64 + Seekoff uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [1024]int8 + Pad_cgo_0 [3]byte +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int32 + Udata *byte +} + +type FdSet struct { + Bits [32]int32 +} + +const ( + SizeofIfMsghdr = 0x70 + SizeofIfData = 0x60 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfmaMsghdr2 = 0x14 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Typelen uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Recvquota uint8 + Xmitquota uint8 + Unused1 uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Recvtiming uint32 + Xmittiming uint32 + Lastchange Timeval + Unused2 uint32 + Hwassist uint32 + Reserved1 uint32 + Reserved2 uint32 +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte +} + +type IfmaMsghdr2 struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Refcount int32 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire int32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Filler [4]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go new file mode 100644 index 0000000000000000000000000000000000000000..85d56eabd3fa4c1167ea86afdad3d125d90876db --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go @@ -0,0 +1,457 @@ +// +build arm64,darwin +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_darwin.go + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int32 + Pad_cgo_0 [4]byte +} + +type Timeval32 struct { + Sec int32 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev int32 + Mode uint16 + Nlink uint16 + Ino uint64 + Uid uint32 + Gid uint32 + Rdev int32 + Pad_cgo_0 [4]byte + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize int32 + Flags uint32 + Gen uint32 + Lspare int32 + Qspare [2]int64 +} + +type Statfs_t struct { + Bsize uint32 + Iosize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Owner uint32 + Type uint32 + Flags uint32 + Fssubtype uint32 + Fstypename [16]int8 + Mntonname [1024]int8 + Mntfromname [1024]int8 + Reserved [8]uint32 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Fstore_t struct { + Flags uint32 + Posmode int32 + Offset int64 + Length int64 + Bytesalloc int64 +} + +type Radvisory_t struct { + Offset int64 + Count int32 + Pad_cgo_0 [4]byte +} + +type Fbootstraptransfer_t struct { + Offset int64 + Length uint64 + Buffer *byte +} + +type Log2phys_t struct { + Flags uint32 + Pad_cgo_0 [8]byte + Pad_cgo_1 [8]byte +} + +type Fsid struct { + Val [2]int32 +} + +type Dirent struct { + Ino uint64 + Seekoff uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [1024]int8 + Pad_cgo_0 [3]byte +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex uint32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [32]int32 +} + +const ( + SizeofIfMsghdr = 0x70 + SizeofIfData = 0x60 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfmaMsghdr2 = 0x14 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Typelen uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Recvquota uint8 + Xmitquota uint8 + Unused1 uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Recvtiming uint32 + Xmittiming uint32 + Lastchange Timeval32 + Unused2 uint32 + Hwassist uint32 + Reserved1 uint32 + Reserved2 uint32 +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte +} + +type IfmaMsghdr2 struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Refcount int32 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire int32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Filler [4]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Pad_cgo_0 [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval32 + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type Termios struct { + Iflag uint64 + Oflag uint64 + Cflag uint64 + Lflag uint64 + Cc [20]uint8 + Pad_cgo_0 [4]byte + Ispeed uint64 + Ospeed uint64 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..8a6f4e1ce3f00768a936d568dd32bd9cf42e5c00 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go @@ -0,0 +1,443 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_dragonfly.go + +// +build amd64,dragonfly + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur int64 + Max int64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Ino uint64 + Nlink uint32 + Dev uint32 + Mode uint16 + Padding1 uint16 + Uid uint32 + Gid uint32 + Rdev uint32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Lspare int32 + Qspare1 int64 + Qspare2 int64 +} + +type Statfs_t struct { + Spare2 int64 + Bsize int64 + Iosize int64 + Blocks int64 + Bfree int64 + Bavail int64 + Files int64 + Ffree int64 + Fsid Fsid + Owner uint32 + Type int32 + Flags int32 + Pad_cgo_0 [4]byte + Syncwrites int64 + Asyncwrites int64 + Fstypename [16]int8 + Mntonname [80]int8 + Syncreads int64 + Asyncreads int64 + Spares1 int16 + Mntfromname [80]int8 + Spares2 int16 + Pad_cgo_1 [4]byte + Spare [2]int64 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Namlen uint16 + Type uint8 + Unused1 uint8 + Unused2 uint32 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 + Rcf uint16 + Route [16]uint16 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x36 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [16]uint64 +} + +const ( + SizeofIfMsghdr = 0xb0 + SizeofIfData = 0xa0 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x98 + SizeofRtMetrics = 0x70 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Recvquota uint8 + Xmitquota uint8 + Pad_cgo_0 [2]byte + Mtu uint64 + Metric uint64 + Link_state uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Hwassist uint64 + Unused uint64 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint64 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Pksent uint64 + Expire uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Recvpipe uint64 + Hopcount uint64 + Mssopt uint16 + Pad uint16 + Pad_cgo_0 [4]byte + Msl uint64 + Iwmaxsegs uint64 + Iwcapsegs uint64 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Pad_cgo_0 [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [6]byte +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go new file mode 100644 index 0000000000000000000000000000000000000000..8cf30947b412c6debd938fa6cf1bd8334af7454f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go @@ -0,0 +1,502 @@ +// +build 386,freebsd +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_freebsd.go + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur int64 + Max int64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Dev uint32 + Ino uint32 + Mode uint16 + Nlink uint16 + Uid uint32 + Gid uint32 + Rdev uint32 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Lspare int32 + Birthtimespec Timespec + Pad_cgo_0 [8]byte +} + +type Statfs_t struct { + Version uint32 + Type uint32 + Flags uint64 + Bsize uint64 + Iosize uint64 + Blocks uint64 + Bfree uint64 + Bavail int64 + Files uint64 + Ffree int64 + Syncwrites uint64 + Asyncwrites uint64 + Syncreads uint64 + Asyncreads uint64 + Spare [10]uint64 + Namemax uint32 + Owner uint32 + Fsid Fsid + Charspare [80]int8 + Fstypename [16]int8 + Mntfromname [88]int8 + Mntonname [88]int8 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 + Sysid int32 +} + +type Dirent struct { + Fileno uint32 + Reclen uint16 + Type uint8 + Namlen uint8 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [46]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x36 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int32 + Udata *byte +} + +type FdSet struct { + X__fds_bits [32]uint32 +} + +const ( + sizeofIfMsghdr = 0x64 + SizeofIfMsghdr = 0x60 + sizeofIfData = 0x54 + SizeofIfData = 0x50 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type ifMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data ifData +} + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type ifData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Vhid uint8 + Baudrate_pf uint8 + Datalen uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Hwassist uint64 + Epoch int32 + Lastchange Timeval +} + +type IfData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Spare_char1 uint8 + Spare_char2 uint8 + Datalen uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Hwassist uint32 + Epoch int32 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Fmask int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Weight uint32 + Filler [3]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfZbuf = 0xc + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 + SizeofBpfZbufHeader = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfZbuf struct { + Bufa *byte + Bufb *byte + Buflen uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfZbufHeader struct { + Kernel_gen uint32 + Kernel_len uint32 + User_gen uint32 + X_bzh_pad [5]uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..e5feb207be60b399e534dd9c18e5b24ce2c088de --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go @@ -0,0 +1,505 @@ +// +build amd64,freebsd +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_freebsd.go + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur int64 + Max int64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Dev uint32 + Ino uint32 + Mode uint16 + Nlink uint16 + Uid uint32 + Gid uint32 + Rdev uint32 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Lspare int32 + Birthtimespec Timespec +} + +type Statfs_t struct { + Version uint32 + Type uint32 + Flags uint64 + Bsize uint64 + Iosize uint64 + Blocks uint64 + Bfree uint64 + Bavail int64 + Files uint64 + Ffree int64 + Syncwrites uint64 + Asyncwrites uint64 + Syncreads uint64 + Asyncreads uint64 + Spare [10]uint64 + Namemax uint32 + Owner uint32 + Fsid Fsid + Charspare [80]int8 + Fstypename [16]int8 + Mntfromname [88]int8 + Mntonname [88]int8 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 + Sysid int32 + Pad_cgo_0 [4]byte +} + +type Dirent struct { + Fileno uint32 + Reclen uint16 + Type uint8 + Namlen uint8 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [46]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x36 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + X__fds_bits [16]uint64 +} + +const ( + sizeofIfMsghdr = 0xa8 + SizeofIfMsghdr = 0xa8 + sizeofIfData = 0x98 + SizeofIfData = 0x98 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x98 + SizeofRtMetrics = 0x70 +) + +type ifMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data ifData +} + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type ifData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Vhid uint8 + Baudrate_pf uint8 + Datalen uint8 + Mtu uint64 + Metric uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Hwassist uint64 + Epoch int64 + Lastchange Timeval +} + +type IfData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Spare_char1 uint8 + Spare_char2 uint8 + Datalen uint8 + Mtu uint64 + Metric uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Hwassist uint64 + Epoch int64 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Fmask int32 + Inits uint64 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Hopcount uint64 + Expire uint64 + Recvpipe uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Pksent uint64 + Weight uint64 + Filler [3]uint64 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfZbuf = 0x18 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x20 + SizeofBpfZbufHeader = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfZbuf struct { + Bufa *byte + Bufb *byte + Buflen uint64 +} + +type BpfProgram struct { + Len uint32 + Pad_cgo_0 [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [6]byte +} + +type BpfZbufHeader struct { + Kernel_gen uint32 + Kernel_len uint32 + User_gen uint32 + X_bzh_pad [5]uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go new file mode 100644 index 0000000000000000000000000000000000000000..5472b54284ba587bb28359256415ae4fdcc95847 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go @@ -0,0 +1,497 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -fsigned-char types_freebsd.go + +// +build arm,freebsd + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int32 + Pad_cgo_0 [4]byte +} + +type Timeval struct { + Sec int64 + Usec int32 + Pad_cgo_0 [4]byte +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur int64 + Max int64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Dev uint32 + Ino uint32 + Mode uint16 + Nlink uint16 + Uid uint32 + Gid uint32 + Rdev uint32 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Lspare int32 + Birthtimespec Timespec +} + +type Statfs_t struct { + Version uint32 + Type uint32 + Flags uint64 + Bsize uint64 + Iosize uint64 + Blocks uint64 + Bfree uint64 + Bavail int64 + Files uint64 + Ffree int64 + Syncwrites uint64 + Asyncwrites uint64 + Syncreads uint64 + Asyncreads uint64 + Spare [10]uint64 + Namemax uint32 + Owner uint32 + Fsid Fsid + Charspare [80]int8 + Fstypename [16]int8 + Mntfromname [88]int8 + Mntonname [88]int8 +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 + Sysid int32 + Pad_cgo_0 [4]byte +} + +type Dirent struct { + Fileno uint32 + Reclen uint16 + Type uint8 + Namlen uint8 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [46]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x36 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int32 + Udata *byte +} + +type FdSet struct { + X__fds_bits [32]uint32 +} + +const ( + sizeofIfMsghdr = 0x70 + SizeofIfMsghdr = 0x70 + sizeofIfData = 0x60 + SizeofIfData = 0x60 + SizeofIfaMsghdr = 0x14 + SizeofIfmaMsghdr = 0x10 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x5c + SizeofRtMetrics = 0x38 +) + +type ifMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data ifData +} + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type ifData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Vhid uint8 + Baudrate_pf uint8 + Datalen uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Hwassist uint64 + Epoch int64 + Lastchange Timeval +} + +type IfData struct { + Type uint8 + Physical uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Spare_char1 uint8 + Spare_char2 uint8 + Datalen uint8 + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Hwassist uint32 + Pad_cgo_0 [4]byte + Epoch int64 + Lastchange Timeval +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Metric int32 +} + +type IfmaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Fmask int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 + Weight uint32 + Filler [3]uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfZbuf = 0xc + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x20 + SizeofBpfZbufHeader = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfZbuf struct { + Bufa *byte + Bufb *byte + Buflen uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp Timeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [6]byte +} + +type BpfZbufHeader struct { + Kernel_gen uint32 + Kernel_len uint32 + User_gen uint32 + X_bzh_pad [5]uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed uint32 + Ospeed uint32 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_386.go new file mode 100644 index 0000000000000000000000000000000000000000..b684543d609407bd4643618c24250233371acb62 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -0,0 +1,623 @@ +// +build 386,linux +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_linux.go + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timex struct { + Modes uint32 + Offset int32 + Freq int32 + Maxerror int32 + Esterror int32 + Status int32 + Constant int32 + Precision int32 + Tolerance int32 + Time Timeval + Tick int32 + Ppsfreq int32 + Jitter int32 + Shift int32 + Stabil int32 + Jitcnt int32 + Calcnt int32 + Errcnt int32 + Stbcnt int32 + Tai int32 + Pad_cgo_0 [44]byte +} + +type Time_t int32 + +type Tms struct { + Utime int32 + Stime int32 + Cutime int32 + Cstime int32 +} + +type Utimbuf struct { + Actime int32 + Modtime int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + X__pad1 uint16 + Pad_cgo_0 [2]byte + X__st_ino uint32 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + X__pad2 uint16 + Pad_cgo_1 [2]byte + Size int64 + Blksize int32 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Ino uint64 +} + +type Statfs_t struct { + Type int32 + Bsize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int32 + Frsize int32 + Flags int32 + Spare [4]int32 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + Pad_cgo_0 [1]byte +} + +type Fsid struct { + X__val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + Start int64 + Len int64 + Pid int32 +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 + X__cmsg_data [0]uint8 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + Pad_cgo_0 [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_MAX = 0x1d + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + X__ifi_pad uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x8 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + Pad_cgo_0 [2]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 + Name [0]int8 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Ebx int32 + Ecx int32 + Edx int32 + Esi int32 + Edi int32 + Ebp int32 + Eax int32 + Xds int32 + Xes int32 + Xfs int32 + Xgs int32 + Orig_eax int32 + Eip int32 + Xcs int32 + Eflags int32 + Esp int32 + Xss int32 +} + +type FdSet struct { + Bits [32]int32 +} + +type Sysinfo_t struct { + Uptime int32 + Loads [3]uint32 + Totalram uint32 + Freeram uint32 + Sharedram uint32 + Bufferram uint32 + Totalswap uint32 + Freeswap uint32 + Procs uint16 + Pad uint16 + Totalhigh uint32 + Freehigh uint32 + Unit uint32 + X_f [8]int8 +} + +type Utsname struct { + Sysname [65]int8 + Nodename [65]int8 + Release [65]int8 + Version [65]int8 + Machine [65]int8 + Domainname [65]int8 +} + +type Ustat_t struct { + Tfree int32 + Tinode uint32 + Fname [6]int8 + Fpack [6]int8 +} + +type EpollEvent struct { + Events uint32 + Fd int32 + Pad int32 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x200 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..4633818053943d173cacf38af1dbd067883a5ff9 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -0,0 +1,641 @@ +// +build amd64,linux +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_linux.go + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + Pad_cgo_0 [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + Pad_cgo_1 [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + Pad_cgo_2 [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + Pad_cgo_3 [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint32 + Uid uint32 + Gid uint32 + X__pad0 int32 + Rdev uint64 + Size int64 + Blksize int64 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + X__unused [3]int64 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int64 + Frsize int64 + Flags int64 + Spare [4]int64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + Pad_cgo_0 [5]byte +} + +type Fsid struct { + X__val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + Pad_cgo_0 [4]byte + Start int64 + Len int64 + Pid int32 + Pad_cgo_1 [4]byte +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 + X__cmsg_data [0]uint8 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + Pad_cgo_0 [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_MAX = 0x1d + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + X__ifi_pad uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 + Name [0]int8 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + R15 uint64 + R14 uint64 + R13 uint64 + R12 uint64 + Rbp uint64 + Rbx uint64 + R11 uint64 + R10 uint64 + R9 uint64 + R8 uint64 + Rax uint64 + Rcx uint64 + Rdx uint64 + Rsi uint64 + Rdi uint64 + Orig_rax uint64 + Rip uint64 + Cs uint64 + Eflags uint64 + Rsp uint64 + Ss uint64 + Fs_base uint64 + Gs_base uint64 + Ds uint64 + Es uint64 + Fs uint64 + Gs uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + Pad_cgo_0 [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + X_f [0]int8 + Pad_cgo_1 [4]byte +} + +type Utsname struct { + Sysname [65]int8 + Nodename [65]int8 + Release [65]int8 + Version [65]int8 + Machine [65]int8 + Domainname [65]int8 +} + +type Ustat_t struct { + Tfree int32 + Pad_cgo_0 [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + Pad_cgo_1 [4]byte +} + +type EpollEvent struct { + Events uint32 + Fd int32 + Pad int32 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x200 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go new file mode 100644 index 0000000000000000000000000000000000000000..42d9ae475470862242a8c5b35495ecc78a865d38 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -0,0 +1,603 @@ +// +build arm,linux +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_linux.go + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int32 + Nsec int32 +} + +type Timeval struct { + Sec int32 + Usec int32 +} + +type Timex struct { + Modes uint32 + Offset int32 + Freq int32 + Maxerror int32 + Esterror int32 + Status int32 + Constant int32 + Precision int32 + Tolerance int32 + Time Timeval + Tick int32 + Ppsfreq int32 + Jitter int32 + Shift int32 + Stabil int32 + Jitcnt int32 + Calcnt int32 + Errcnt int32 + Stbcnt int32 + Tai int32 + Pad_cgo_0 [44]byte +} + +type Time_t int32 + +type Tms struct { + Utime int32 + Stime int32 + Cutime int32 + Cstime int32 +} + +type Utimbuf struct { + Actime int32 + Modtime int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + X__pad1 uint16 + Pad_cgo_0 [2]byte + X__st_ino uint32 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + X__pad2 uint16 + Pad_cgo_1 [6]byte + Size int64 + Blksize int32 + Pad_cgo_2 [4]byte + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Ino uint64 +} + +type Statfs_t struct { + Type int32 + Bsize int32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int32 + Frsize int32 + Flags int32 + Spare [4]int32 + Pad_cgo_0 [4]byte +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]uint8 + Pad_cgo_0 [5]byte +} + +type Fsid struct { + X__val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + Pad_cgo_0 [4]byte + Start int64 + Len int64 + Pid int32 + Pad_cgo_1 [4]byte +} + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddr struct { + Family uint16 + Data [14]uint8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]uint8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 + X__cmsg_data [0]uint8 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + Pad_cgo_0 [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_MAX = 0x1d + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + X__ifi_pad uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x8 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + Pad_cgo_0 [2]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 + Name [0]uint8 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Uregs [18]uint32 +} + +type FdSet struct { + Bits [32]int32 +} + +type Sysinfo_t struct { + Uptime int32 + Loads [3]uint32 + Totalram uint32 + Freeram uint32 + Sharedram uint32 + Bufferram uint32 + Totalswap uint32 + Freeswap uint32 + Procs uint16 + Pad uint16 + Totalhigh uint32 + Freehigh uint32 + Unit uint32 + X_f [8]uint8 +} + +type Utsname struct { + Sysname [65]uint8 + Nodename [65]uint8 + Release [65]uint8 + Version [65]uint8 + Machine [65]uint8 + Domainname [65]uint8 +} + +type Ustat_t struct { + Tfree int32 + Tinode uint32 + Fname [6]uint8 + Fpack [6]uint8 +} + +type EpollEvent struct { + Events uint32 + PadFd int32 + Fd int32 + Pad int32 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x200 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go new file mode 100644 index 0000000000000000000000000000000000000000..b30d47241b6c95263d19ac30c71b858f5bc3b9ed --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -0,0 +1,620 @@ +// +build arm64,linux +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -fsigned-char types_linux.go + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + Pad_cgo_0 [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + Pad_cgo_1 [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + Pad_cgo_2 [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + Pad_cgo_3 [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + X__pad1 uint64 + Size int64 + Blksize int32 + X__pad2 int32 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + X__glibc_reserved [2]int32 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int64 + Frsize int64 + Flags int64 + Spare [4]int64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + Pad_cgo_0 [5]byte +} + +type Fsid struct { + X__val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + Pad_cgo_0 [4]byte + Start int64 + Len int64 + Pid int32 + Pad_cgo_1 [4]byte +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 + X__cmsg_data [0]uint8 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + Pad_cgo_0 [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_MAX = 0x22 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + X__ifi_pad uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 + Name [0]int8 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [31]uint64 + Sp uint64 + Pc uint64 + Pstate uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + Pad_cgo_0 [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + X_f [0]int8 + Pad_cgo_1 [4]byte +} + +type Utsname struct { + Sysname [65]int8 + Nodename [65]int8 + Release [65]int8 + Version [65]int8 + Machine [65]int8 + Domainname [65]int8 +} + +type Ustat_t struct { + Tfree int32 + Pad_cgo_0 [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + Pad_cgo_1 [4]byte +} + +type EpollEvent struct { + Events uint32 + PadFd int32 + Fd int32 + Pad int32 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x200 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go new file mode 100644 index 0000000000000000000000000000000000000000..c247b31a27de80c6f8aa9b99fd8032c81cd4eb6b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -0,0 +1,623 @@ +// +build mips64,linux +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_linux.go + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + Pad_cgo_0 [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + Pad_cgo_1 [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + Pad_cgo_2 [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + Pad_cgo_3 [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint32 + Pad1 [3]int32 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint32 + Pad2 [3]uint32 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize uint32 + Pad4 uint32 + Blocks int64 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Frsize int64 + Blocks uint64 + Bfree uint64 + Files uint64 + Ffree uint64 + Bavail uint64 + Fsid Fsid + Namelen int64 + Flags int64 + Spare [5]int64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + Pad_cgo_0 [5]byte +} + +type Fsid struct { + X__val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + Pad_cgo_0 [4]byte + Start int64 + Len int64 + Pid int32 + Pad_cgo_1 [4]byte +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + Pad_cgo_0 [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_MAX = 0x27 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + X__ifi_pad uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [102]uint64 + U_tsize uint64 + U_dsize uint64 + U_ssize uint64 + Start_code uint64 + Start_data uint64 + Start_stack uint64 + Signal int64 + U_ar0 uint64 + Magic uint64 + U_comm [32]int8 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + Pad_cgo_0 [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + X_f [0]int8 + Pad_cgo_1 [4]byte +} + +type Utsname struct { + Sysname [65]int8 + Nodename [65]int8 + Release [65]int8 + Version [65]int8 + Machine [65]int8 + Domainname [65]int8 +} + +type Ustat_t struct { + Tfree int32 + Pad_cgo_0 [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + Pad_cgo_1 [4]byte +} + +type EpollEvent struct { + Events uint32 + Fd int32 + Pad int32 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x200 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [32]uint8 + Pad_cgo_0 [3]byte +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go new file mode 100644 index 0000000000000000000000000000000000000000..9f6ae97624650dfc023efa22bd76040bf5916b73 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -0,0 +1,623 @@ +// +build mips64le,linux +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_linux.go + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + Pad_cgo_0 [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + Pad_cgo_1 [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + Pad_cgo_2 [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + Pad_cgo_3 [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint32 + Pad1 [3]int32 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint32 + Pad2 [3]uint32 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize uint32 + Pad4 uint32 + Blocks int64 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Frsize int64 + Blocks uint64 + Bfree uint64 + Files uint64 + Ffree uint64 + Bavail uint64 + Fsid Fsid + Namelen int64 + Flags int64 + Spare [5]int64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + Pad_cgo_0 [5]byte +} + +type Fsid struct { + X__val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + Pad_cgo_0 [4]byte + Start int64 + Len int64 + Pid int32 + Pad_cgo_1 [4]byte +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + Pad_cgo_0 [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_MAX = 0x27 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + X__ifi_pad uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Regs [102]uint64 + U_tsize uint64 + U_dsize uint64 + U_ssize uint64 + Start_code uint64 + Start_data uint64 + Start_stack uint64 + Signal int64 + U_ar0 uint64 + Magic uint64 + U_comm [32]int8 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + Pad_cgo_0 [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + X_f [0]int8 + Pad_cgo_1 [4]byte +} + +type Utsname struct { + Sysname [65]int8 + Nodename [65]int8 + Release [65]int8 + Version [65]int8 + Machine [65]int8 + Domainname [65]int8 +} + +type Ustat_t struct { + Tfree int32 + Pad_cgo_0 [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + Pad_cgo_1 [4]byte +} + +type EpollEvent struct { + Events uint32 + Fd int32 + Pad int32 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x200 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [32]uint8 + Pad_cgo_0 [3]byte +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go new file mode 100644 index 0000000000000000000000000000000000000000..0f94f79afe405f25a424c1957457e6c6433d05b4 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -0,0 +1,630 @@ +// +build ppc64,linux +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_linux.go + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + Pad_cgo_0 [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + Pad_cgo_1 [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + Pad_cgo_2 [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + Pad_cgo_3 [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint32 + Uid uint32 + Gid uint32 + X__pad2 int32 + Rdev uint64 + Size int64 + Blksize int64 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + X__glibc_reserved4 uint64 + X__glibc_reserved5 uint64 + X__glibc_reserved6 uint64 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int64 + Frsize int64 + Flags int64 + Spare [4]int64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]uint8 + Pad_cgo_0 [5]byte +} + +type Fsid struct { + X__val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + Pad_cgo_0 [4]byte + Start int64 + Len int64 + Pid int32 + Pad_cgo_1 [4]byte +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddr struct { + Family uint16 + Data [14]uint8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]uint8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 + X__cmsg_data [0]uint8 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + Pad_cgo_0 [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_MAX = 0x23 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + X__ifi_pad uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 + Name [0]uint8 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Gpr [32]uint64 + Nip uint64 + Msr uint64 + Orig_gpr3 uint64 + Ctr uint64 + Link uint64 + Xer uint64 + Ccr uint64 + Softe uint64 + Trap uint64 + Dar uint64 + Dsisr uint64 + Result uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + Pad_cgo_0 [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + X_f [0]uint8 + Pad_cgo_1 [4]byte +} + +type Utsname struct { + Sysname [65]uint8 + Nodename [65]uint8 + Release [65]uint8 + Version [65]uint8 + Machine [65]uint8 + Domainname [65]uint8 +} + +type Ustat_t struct { + Tfree int32 + Pad_cgo_0 [4]byte + Tinode uint64 + Fname [6]uint8 + Fpack [6]uint8 + Pad_cgo_1 [4]byte +} + +type EpollEvent struct { + Events uint32 + X_padFd int32 + Fd int32 + Pad int32 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x200 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [19]uint8 + Line uint8 + Ispeed uint32 + Ospeed uint32 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go new file mode 100644 index 0000000000000000000000000000000000000000..9c21ecf3070d72ecb437148caf06608845fd62a5 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -0,0 +1,630 @@ +// +build ppc64le,linux +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_linux.go + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + Pad_cgo_0 [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + Pad_cgo_1 [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + Pad_cgo_2 [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + Pad_cgo_3 [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint32 + Uid uint32 + Gid uint32 + X__pad2 int32 + Rdev uint64 + Size int64 + Blksize int64 + Blocks int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + X__glibc_reserved4 uint64 + X__glibc_reserved5 uint64 + X__glibc_reserved6 uint64 +} + +type Statfs_t struct { + Type int64 + Bsize int64 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen int64 + Frsize int64 + Flags int64 + Spare [4]int64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]uint8 + Pad_cgo_0 [5]byte +} + +type Fsid struct { + X__val [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + Pad_cgo_0 [4]byte + Start int64 + Len int64 + Pid int32 + Pad_cgo_1 [4]byte +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x4 + FADV_NOREUSE = 0x5 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddr struct { + Family uint16 + Data [14]uint8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]uint8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + Pad_cgo_1 [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 + X__cmsg_data [0]uint8 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + Pad_cgo_0 [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_MAX = 0x22 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + X__ifi_pad uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + Pad_cgo_0 [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 + Name [0]uint8 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Gpr [32]uint64 + Nip uint64 + Msr uint64 + Orig_gpr3 uint64 + Ctr uint64 + Link uint64 + Xer uint64 + Ccr uint64 + Softe uint64 + Trap uint64 + Dar uint64 + Dsisr uint64 + Result uint64 +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + Pad_cgo_0 [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + X_f [0]uint8 + Pad_cgo_1 [4]byte +} + +type Utsname struct { + Sysname [65]uint8 + Nodename [65]uint8 + Release [65]uint8 + Version [65]uint8 + Machine [65]uint8 + Domainname [65]uint8 +} + +type Ustat_t struct { + Tfree int32 + Pad_cgo_0 [4]byte + Tinode uint64 + Fname [6]uint8 + Fpack [6]uint8 + Pad_cgo_1 [4]byte +} + +type EpollEvent struct { + Events uint32 + X_padFd int32 + Fd int32 + Pad int32 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x200 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [19]uint8 + Line uint8 + Ispeed uint32 + Ospeed uint32 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go new file mode 100644 index 0000000000000000000000000000000000000000..2f808ec1b9d341756f78f9ffee3f82891116a94b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -0,0 +1,645 @@ +// +build s390x,linux +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs -- -fsigned-char types_linux.go + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x1000 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timex struct { + Modes uint32 + _ [4]byte + Offset int64 + Freq int64 + Maxerror int64 + Esterror int64 + Status int32 + _ [4]byte + Constant int64 + Precision int64 + Tolerance int64 + Time Timeval + Tick int64 + Ppsfreq int64 + Jitter int64 + Shift int32 + _ [4]byte + Stabil int64 + Jitcnt int64 + Calcnt int64 + Errcnt int64 + Stbcnt int64 + Tai int32 + _ [44]byte +} + +type Time_t int64 + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Ino uint64 + Nlink uint64 + Mode uint32 + Uid uint32 + Gid uint32 + _ int32 + Rdev uint64 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize int64 + Blocks int64 + _ [3]int64 +} + +type Statfs_t struct { + Type uint32 + Bsize uint32 + Blocks uint64 + Bfree uint64 + Bavail uint64 + Files uint64 + Ffree uint64 + Fsid Fsid + Namelen uint32 + Frsize uint32 + Flags uint32 + Spare [4]uint32 + _ [4]byte +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Type uint8 + Name [256]int8 + _ [5]byte +} + +type Fsid struct { + _ [2]int32 +} + +type Flock_t struct { + Type int16 + Whence int16 + _ [4]byte + Start int64 + Len int64 + Pid int32 + _ [4]byte +} + +const ( + FADV_NORMAL = 0x0 + FADV_RANDOM = 0x1 + FADV_SEQUENTIAL = 0x2 + FADV_WILLNEED = 0x3 + FADV_DONTNEED = 0x6 + FADV_NOREUSE = 0x7 +) + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]uint8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrLinklayer struct { + Family uint16 + Protocol uint16 + Ifindex int32 + Hatype uint16 + Pkttype uint8 + Halen uint8 + Addr [8]uint8 +} + +type RawSockaddrNetlink struct { + Family uint16 + Pad uint16 + Pid uint32 + Groups uint32 +} + +type RawSockaddrHCI struct { + Family uint16 + Dev uint16 + Channel uint16 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [96]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPMreqn struct { + Multiaddr [4]byte /* in_addr */ + Address [4]byte /* in_addr */ + Ifindex int32 +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + _ [4]byte + Iov *Iovec + Iovlen uint64 + Control *byte + Controllen uint64 + Flags int32 + _ [4]byte +} + +type Cmsghdr struct { + Len uint64 + Level int32 + Type int32 +} + +type Inet4Pktinfo struct { + Ifindex int32 + Spec_dst [4]byte /* in_addr */ + Addr [4]byte /* in_addr */ +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Data [8]uint32 +} + +type Ucred struct { + Pid int32 + Uid uint32 + Gid uint32 +} + +type TCPInfo struct { + State uint8 + Ca_state uint8 + Retransmits uint8 + Probes uint8 + Backoff uint8 + Options uint8 + _ [2]byte + Rto uint32 + Ato uint32 + Snd_mss uint32 + Rcv_mss uint32 + Unacked uint32 + Sacked uint32 + Lost uint32 + Retrans uint32 + Fackets uint32 + Last_data_sent uint32 + Last_ack_sent uint32 + Last_data_recv uint32 + Last_ack_recv uint32 + Pmtu uint32 + Rcv_ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Snd_ssthresh uint32 + Snd_cwnd uint32 + Advmss uint32 + Reordering uint32 + Rcv_rtt uint32 + Rcv_space uint32 + Total_retrans uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x70 + SizeofSockaddrUnix = 0x6e + SizeofSockaddrLinklayer = 0x14 + SizeofSockaddrNetlink = 0xc + SizeofSockaddrHCI = 0x6 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPMreqn = 0xc + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x38 + SizeofCmsghdr = 0x10 + SizeofInet4Pktinfo = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 + SizeofUcred = 0xc + SizeofTCPInfo = 0x68 +) + +const ( + IFA_UNSPEC = 0x0 + IFA_ADDRESS = 0x1 + IFA_LOCAL = 0x2 + IFA_LABEL = 0x3 + IFA_BROADCAST = 0x4 + IFA_ANYCAST = 0x5 + IFA_CACHEINFO = 0x6 + IFA_MULTICAST = 0x7 + IFLA_UNSPEC = 0x0 + IFLA_ADDRESS = 0x1 + IFLA_BROADCAST = 0x2 + IFLA_IFNAME = 0x3 + IFLA_MTU = 0x4 + IFLA_LINK = 0x5 + IFLA_QDISC = 0x6 + IFLA_STATS = 0x7 + IFLA_COST = 0x8 + IFLA_PRIORITY = 0x9 + IFLA_MASTER = 0xa + IFLA_WIRELESS = 0xb + IFLA_PROTINFO = 0xc + IFLA_TXQLEN = 0xd + IFLA_MAP = 0xe + IFLA_WEIGHT = 0xf + IFLA_OPERSTATE = 0x10 + IFLA_LINKMODE = 0x11 + IFLA_LINKINFO = 0x12 + IFLA_NET_NS_PID = 0x13 + IFLA_IFALIAS = 0x14 + IFLA_MAX = 0x27 + RT_SCOPE_UNIVERSE = 0x0 + RT_SCOPE_SITE = 0xc8 + RT_SCOPE_LINK = 0xfd + RT_SCOPE_HOST = 0xfe + RT_SCOPE_NOWHERE = 0xff + RT_TABLE_UNSPEC = 0x0 + RT_TABLE_COMPAT = 0xfc + RT_TABLE_DEFAULT = 0xfd + RT_TABLE_MAIN = 0xfe + RT_TABLE_LOCAL = 0xff + RT_TABLE_MAX = 0xffffffff + RTA_UNSPEC = 0x0 + RTA_DST = 0x1 + RTA_SRC = 0x2 + RTA_IIF = 0x3 + RTA_OIF = 0x4 + RTA_GATEWAY = 0x5 + RTA_PRIORITY = 0x6 + RTA_PREFSRC = 0x7 + RTA_METRICS = 0x8 + RTA_MULTIPATH = 0x9 + RTA_FLOW = 0xb + RTA_CACHEINFO = 0xc + RTA_TABLE = 0xf + RTN_UNSPEC = 0x0 + RTN_UNICAST = 0x1 + RTN_LOCAL = 0x2 + RTN_BROADCAST = 0x3 + RTN_ANYCAST = 0x4 + RTN_MULTICAST = 0x5 + RTN_BLACKHOLE = 0x6 + RTN_UNREACHABLE = 0x7 + RTN_PROHIBIT = 0x8 + RTN_THROW = 0x9 + RTN_NAT = 0xa + RTN_XRESOLVE = 0xb + RTNLGRP_NONE = 0x0 + RTNLGRP_LINK = 0x1 + RTNLGRP_NOTIFY = 0x2 + RTNLGRP_NEIGH = 0x3 + RTNLGRP_TC = 0x4 + RTNLGRP_IPV4_IFADDR = 0x5 + RTNLGRP_IPV4_MROUTE = 0x6 + RTNLGRP_IPV4_ROUTE = 0x7 + RTNLGRP_IPV4_RULE = 0x8 + RTNLGRP_IPV6_IFADDR = 0x9 + RTNLGRP_IPV6_MROUTE = 0xa + RTNLGRP_IPV6_ROUTE = 0xb + RTNLGRP_IPV6_IFINFO = 0xc + RTNLGRP_IPV6_PREFIX = 0x12 + RTNLGRP_IPV6_RULE = 0x13 + RTNLGRP_ND_USEROPT = 0x14 + SizeofNlMsghdr = 0x10 + SizeofNlMsgerr = 0x14 + SizeofRtGenmsg = 0x1 + SizeofNlAttr = 0x4 + SizeofRtAttr = 0x4 + SizeofIfInfomsg = 0x10 + SizeofIfAddrmsg = 0x8 + SizeofRtMsg = 0xc + SizeofRtNexthop = 0x8 +) + +type NlMsghdr struct { + Len uint32 + Type uint16 + Flags uint16 + Seq uint32 + Pid uint32 +} + +type NlMsgerr struct { + Error int32 + Msg NlMsghdr +} + +type RtGenmsg struct { + Family uint8 +} + +type NlAttr struct { + Len uint16 + Type uint16 +} + +type RtAttr struct { + Len uint16 + Type uint16 +} + +type IfInfomsg struct { + Family uint8 + _ uint8 + Type uint16 + Index int32 + Flags uint32 + Change uint32 +} + +type IfAddrmsg struct { + Family uint8 + Prefixlen uint8 + Flags uint8 + Scope uint8 + Index uint32 +} + +type RtMsg struct { + Family uint8 + Dst_len uint8 + Src_len uint8 + Tos uint8 + Table uint8 + Protocol uint8 + Scope uint8 + Type uint8 + Flags uint32 +} + +type RtNexthop struct { + Len uint16 + Flags uint8 + Hops uint8 + Ifindex int32 +} + +const ( + SizeofSockFilter = 0x8 + SizeofSockFprog = 0x10 +) + +type SockFilter struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type SockFprog struct { + Len uint16 + _ [6]byte + Filter *SockFilter +} + +type InotifyEvent struct { + Wd int32 + Mask uint32 + Cookie uint32 + Len uint32 +} + +const SizeofInotifyEvent = 0x10 + +type PtraceRegs struct { + Psw PtracePsw + Gprs [16]uint64 + Acrs [16]uint32 + Orig_gpr2 uint64 + Fp_regs PtraceFpregs + Per_info PtracePer + Ieee_instruction_pointer uint64 +} + +type PtracePsw struct { + Mask uint64 + Addr uint64 +} + +type PtraceFpregs struct { + Fpc uint32 + _ [4]byte + Fprs [16]float64 +} + +type PtracePer struct { + _ [0]uint64 + _ [24]byte + _ [8]byte + Starting_addr uint64 + Ending_addr uint64 + Perc_atmid uint16 + _ [6]byte + Address uint64 + Access_id uint8 + _ [7]byte +} + +type FdSet struct { + Bits [16]int64 +} + +type Sysinfo_t struct { + Uptime int64 + Loads [3]uint64 + Totalram uint64 + Freeram uint64 + Sharedram uint64 + Bufferram uint64 + Totalswap uint64 + Freeswap uint64 + Procs uint16 + Pad uint16 + _ [4]byte + Totalhigh uint64 + Freehigh uint64 + Unit uint32 + _ [0]int8 + _ [4]byte +} + +type Utsname struct { + Sysname [65]int8 + Nodename [65]int8 + Release [65]int8 + Version [65]int8 + Machine [65]int8 + Domainname [65]int8 +} + +type Ustat_t struct { + Tfree int32 + _ [4]byte + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + _ [4]byte +} + +type EpollEvent struct { + Events uint32 + _ int32 + Fd int32 + Pad int32 +} + +const ( + AT_FDCWD = -0x64 + AT_REMOVEDIR = 0x200 + AT_SYMLINK_FOLLOW = 0x400 + AT_SYMLINK_NOFOLLOW = 0x100 +) + +type PollFd struct { + Fd int32 + Events int16 + Revents int16 +} + +const ( + POLLIN = 0x1 + POLLPRI = 0x2 + POLLOUT = 0x4 + POLLRDHUP = 0x2000 + POLLERR = 0x8 + POLLHUP = 0x10 + POLLNVAL = 0x20 +) + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Line uint8 + Cc [19]uint8 + Ispeed uint32 + Ospeed uint32 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go new file mode 100644 index 0000000000000000000000000000000000000000..caf755fb86c0f77884b3c3bda684c3bd7e13b7ef --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go @@ -0,0 +1,396 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_netbsd.go + +// +build 386,netbsd + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int32 +} + +type Timeval struct { + Sec int64 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Mode uint32 + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Spare [2]uint32 +} + +type Statfs_t [0]byte + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [512]int8 + Pad_cgo_0 [3]byte +} + +type Fsid struct { + X__fsid_val [2]int32 +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter uint32 + Flags uint32 + Fflags uint32 + Data int64 + Udata int32 +} + +type FdSet struct { + Bits [8]uint32 +} + +const ( + SizeofIfMsghdr = 0x98 + SizeofIfData = 0x84 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x78 + SizeofRtMetrics = 0x50 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData + Pad_cgo_1 [4]byte +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Pad_cgo_0 [1]byte + Link_state int32 + Mtu uint64 + Metric uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Lastchange Timespec +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Metric int32 + Index uint16 + Pad_cgo_0 [6]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits int32 + Pad_cgo_1 [4]byte + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Hopcount uint64 + Recvpipe uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Expire int64 + Pksent int64 +} + +type Mclpool [0]byte + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x80 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint64 + Drop uint64 + Capt uint64 + Padding [13]uint64 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfTimeval struct { + Sec int32 + Usec int32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +type Sysctlnode struct { + Flags uint32 + Num int32 + Name [32]int8 + Ver uint32 + X__rsvd uint32 + Un [16]byte + X_sysctl_size [8]byte + X_sysctl_func [8]byte + X_sysctl_parent [8]byte + X_sysctl_desc [8]byte +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..91b4a5305a4d094c052ee3c35a74feed1b3d0fdc --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go @@ -0,0 +1,403 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_netbsd.go + +// +build amd64,netbsd + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int32 + Pad_cgo_0 [4]byte +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Mode uint32 + Pad_cgo_0 [4]byte + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Pad_cgo_1 [4]byte + Rdev uint64 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Spare [2]uint32 + Pad_cgo_2 [4]byte +} + +type Statfs_t [0]byte + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [512]int8 + Pad_cgo_0 [3]byte +} + +type Fsid struct { + X__fsid_val [2]int32 +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter uint32 + Flags uint32 + Fflags uint32 + Pad_cgo_0 [4]byte + Data int64 + Udata int64 +} + +type FdSet struct { + Bits [8]uint32 +} + +const ( + SizeofIfMsghdr = 0x98 + SizeofIfData = 0x88 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x78 + SizeofRtMetrics = 0x50 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Pad_cgo_0 [1]byte + Link_state int32 + Mtu uint64 + Metric uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Lastchange Timespec +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Metric int32 + Index uint16 + Pad_cgo_0 [6]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits int32 + Pad_cgo_1 [4]byte + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Hopcount uint64 + Recvpipe uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Expire int64 + Pksent int64 +} + +type Mclpool [0]byte + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x80 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x20 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint64 + Drop uint64 + Capt uint64 + Padding [13]uint64 +} + +type BpfProgram struct { + Len uint32 + Pad_cgo_0 [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [6]byte +} + +type BpfTimeval struct { + Sec int64 + Usec int64 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +type Sysctlnode struct { + Flags uint32 + Num int32 + Name [32]int8 + Ver uint32 + X__rsvd uint32 + Un [16]byte + X_sysctl_size [8]byte + X_sysctl_func [8]byte + X_sysctl_parent [8]byte + X_sysctl_desc [8]byte +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go new file mode 100644 index 0000000000000000000000000000000000000000..c0758f9d3f709fa641ecbfac8a70ac3ff0a0ddba --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go @@ -0,0 +1,401 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_netbsd.go + +// +build arm,netbsd + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int32 + Pad_cgo_0 [4]byte +} + +type Timeval struct { + Sec int64 + Usec int32 + Pad_cgo_0 [4]byte +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +type Stat_t struct { + Dev uint64 + Mode uint32 + Pad_cgo_0 [4]byte + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Pad_cgo_1 [4]byte + Rdev uint64 + Atimespec Timespec + Mtimespec Timespec + Ctimespec Timespec + Birthtimespec Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Spare [2]uint32 + Pad_cgo_2 [4]byte +} + +type Statfs_t [0]byte + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Reclen uint16 + Namlen uint16 + Type uint8 + Name [512]int8 + Pad_cgo_0 [3]byte +} + +type Fsid struct { + X__fsid_val [2]int32 +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [12]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen int32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x14 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter uint32 + Flags uint32 + Fflags uint32 + Data int64 + Udata int32 + Pad_cgo_0 [4]byte +} + +type FdSet struct { + Bits [8]uint32 +} + +const ( + SizeofIfMsghdr = 0x98 + SizeofIfData = 0x88 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x18 + SizeofRtMsghdr = 0x78 + SizeofRtMetrics = 0x50 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Pad_cgo_0 [1]byte + Link_state int32 + Mtu uint64 + Metric uint64 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Lastchange Timespec +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Metric int32 + Index uint16 + Pad_cgo_0 [6]byte +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Name [16]int8 + What uint16 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits int32 + Pad_cgo_1 [4]byte + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint64 + Mtu uint64 + Hopcount uint64 + Recvpipe uint64 + Sendpipe uint64 + Ssthresh uint64 + Rtt uint64 + Rttvar uint64 + Expire int64 + Pksent int64 +} + +type Mclpool [0]byte + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x80 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint64 + Drop uint64 + Capt uint64 + Padding [13]uint64 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfTimeval struct { + Sec int32 + Usec int32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} + +type Sysctlnode struct { + Flags uint32 + Num int32 + Name [32]int8 + Ver uint32 + X__rsvd uint32 + Un [16]byte + X_sysctl_size [8]byte + X_sysctl_func [8]byte + X_sysctl_parent [8]byte + X_sysctl_desc [8]byte +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go new file mode 100644 index 0000000000000000000000000000000000000000..860a4697961fa02d84c63d2ac443c0d20f341de5 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go @@ -0,0 +1,441 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_openbsd.go + +// +build 386,openbsd + +package unix + +const ( + sizeofPtr = 0x4 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x4 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int32 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int32 +} + +type Timeval struct { + Sec int64 + Usec int32 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int32 + Ixrss int32 + Idrss int32 + Isrss int32 + Minflt int32 + Majflt int32 + Nswap int32 + Inblock int32 + Oublock int32 + Msgsnd int32 + Msgrcv int32 + Nsignals int32 + Nvcsw int32 + Nivcsw int32 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Mode uint32 + Dev int32 + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev int32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + X__st_birthtim Timespec +} + +type Statfs_t struct { + F_flags uint32 + F_bsize uint32 + F_iosize uint32 + F_blocks uint64 + F_bfree uint64 + F_bavail int64 + F_files uint64 + F_ffree uint64 + F_favail int64 + F_syncwrites uint64 + F_syncreads uint64 + F_asyncwrites uint64 + F_asyncreads uint64 + F_fsid Fsid + F_namemax uint32 + F_owner uint32 + F_ctime uint64 + F_fstypename [16]int8 + F_mntonname [90]int8 + F_mntfromname [90]int8 + F_mntfromspec [90]int8 + Pad_cgo_0 [2]byte + Mount_info [160]byte +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Off int64 + Reclen uint16 + Type uint8 + Namlen uint8 + X__d_padding [4]uint8 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [24]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint32 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Iov *Iovec + Iovlen uint32 + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x20 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x1c + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint32 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [32]uint32 +} + +const ( + SizeofIfMsghdr = 0xec + SizeofIfData = 0xd4 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x1a + SizeofRtMsghdr = 0x60 + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Xflags int32 + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Mtu uint32 + Metric uint32 + Pad uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Capabilities uint32 + Lastchange Timeval + Mclpool [7]Mclpool +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Metric int32 +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + What uint16 + Name [16]int8 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Priority uint8 + Mpls uint8 + Addrs int32 + Flags int32 + Fmask int32 + Pid int32 + Seq int32 + Errno int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Pksent uint64 + Expire int64 + Locks uint32 + Mtu uint32 + Refcnt uint32 + Hopcount uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pad uint32 +} + +type Mclpool struct { + Grown int32 + Alive uint16 + Hwm uint16 + Cwm uint16 + Lwm uint16 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x8 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfTimeval struct { + Sec uint32 + Usec uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..23c52727f7dff4e638aa65d13680a422f11135ba --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go @@ -0,0 +1,448 @@ +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_openbsd.go + +// +build amd64,openbsd + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Mode uint32 + Dev int32 + Ino uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev int32 + Atim Timespec + Mtim Timespec + Ctim Timespec + Size int64 + Blocks int64 + Blksize uint32 + Flags uint32 + Gen uint32 + Pad_cgo_0 [4]byte + X__st_birthtim Timespec +} + +type Statfs_t struct { + F_flags uint32 + F_bsize uint32 + F_iosize uint32 + Pad_cgo_0 [4]byte + F_blocks uint64 + F_bfree uint64 + F_bavail int64 + F_files uint64 + F_ffree uint64 + F_favail int64 + F_syncwrites uint64 + F_syncreads uint64 + F_asyncwrites uint64 + F_asyncreads uint64 + F_fsid Fsid + F_namemax uint32 + F_owner uint32 + F_ctime uint64 + F_fstypename [16]int8 + F_mntonname [90]int8 + F_mntfromname [90]int8 + F_mntfromspec [90]int8 + Pad_cgo_1 [2]byte + Mount_info [160]byte +} + +type Flock_t struct { + Start int64 + Len int64 + Pid int32 + Type int16 + Whence int16 +} + +type Dirent struct { + Fileno uint64 + Off int64 + Reclen uint16 + Type uint8 + Namlen uint8 + X__d_padding [4]uint8 + Name [256]int8 +} + +type Fsid struct { + Val [2]int32 +} + +type RawSockaddrInet4 struct { + Len uint8 + Family uint8 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Len uint8 + Family uint8 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 +} + +type RawSockaddrUnix struct { + Len uint8 + Family uint8 + Path [104]int8 +} + +type RawSockaddrDatalink struct { + Len uint8 + Family uint8 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [24]int8 +} + +type RawSockaddr struct { + Len uint8 + Family uint8 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [92]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *byte + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen uint32 + Pad_cgo_1 [4]byte + Control *byte + Controllen uint32 + Flags int32 +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + Filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x1c + SizeofSockaddrAny = 0x6c + SizeofSockaddrUnix = 0x6a + SizeofSockaddrDatalink = 0x20 + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x20 + SizeofICMPv6Filter = 0x20 +) + +const ( + PTRACE_TRACEME = 0x0 + PTRACE_CONT = 0x7 + PTRACE_KILL = 0x8 +) + +type Kevent_t struct { + Ident uint64 + Filter int16 + Flags uint16 + Fflags uint32 + Data int64 + Udata *byte +} + +type FdSet struct { + Bits [32]uint32 +} + +const ( + SizeofIfMsghdr = 0xf8 + SizeofIfData = 0xe0 + SizeofIfaMsghdr = 0x18 + SizeofIfAnnounceMsghdr = 0x1a + SizeofRtMsghdr = 0x60 + SizeofRtMetrics = 0x38 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Xflags int32 + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Link_state uint8 + Mtu uint32 + Metric uint32 + Pad uint32 + Baudrate uint64 + Ipackets uint64 + Ierrors uint64 + Opackets uint64 + Oerrors uint64 + Collisions uint64 + Ibytes uint64 + Obytes uint64 + Imcasts uint64 + Omcasts uint64 + Iqdrops uint64 + Noproto uint64 + Capabilities uint32 + Pad_cgo_0 [4]byte + Lastchange Timeval + Mclpool [7]Mclpool + Pad_cgo_1 [4]byte +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Pad1 uint8 + Pad2 uint8 + Addrs int32 + Flags int32 + Metric int32 +} + +type IfAnnounceMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + What uint16 + Name [16]int8 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Hdrlen uint16 + Index uint16 + Tableid uint16 + Priority uint8 + Mpls uint8 + Addrs int32 + Flags int32 + Fmask int32 + Pid int32 + Seq int32 + Errno int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Pksent uint64 + Expire int64 + Locks uint32 + Mtu uint32 + Refcnt uint32 + Hopcount uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pad uint32 +} + +type Mclpool struct { + Grown int32 + Alive uint16 + Hwm uint16 + Cwm uint16 + Lwm uint16 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x8 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint32 + Drop uint32 +} + +type BpfProgram struct { + Len uint32 + Pad_cgo_0 [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +type BpfTimeval struct { + Sec uint32 + Usec uint32 +} + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [20]uint8 + Ispeed int32 + Ospeed int32 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go new file mode 100644 index 0000000000000000000000000000000000000000..b3b928a51e60148e9fb2e4af289502bc0c5c932b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go @@ -0,0 +1,422 @@ +// +build amd64,solaris +// Created by cgo -godefs - DO NOT EDIT +// cgo -godefs types_solaris.go + +package unix + +const ( + sizeofPtr = 0x8 + sizeofShort = 0x2 + sizeofInt = 0x4 + sizeofLong = 0x8 + sizeofLongLong = 0x8 + PathMax = 0x400 +) + +type ( + _C_short int16 + _C_int int32 + _C_long int64 + _C_long_long int64 +) + +type Timespec struct { + Sec int64 + Nsec int64 +} + +type Timeval struct { + Sec int64 + Usec int64 +} + +type Timeval32 struct { + Sec int32 + Usec int32 +} + +type Tms struct { + Utime int64 + Stime int64 + Cutime int64 + Cstime int64 +} + +type Utimbuf struct { + Actime int64 + Modtime int64 +} + +type Rusage struct { + Utime Timeval + Stime Timeval + Maxrss int64 + Ixrss int64 + Idrss int64 + Isrss int64 + Minflt int64 + Majflt int64 + Nswap int64 + Inblock int64 + Oublock int64 + Msgsnd int64 + Msgrcv int64 + Nsignals int64 + Nvcsw int64 + Nivcsw int64 +} + +type Rlimit struct { + Cur uint64 + Max uint64 +} + +type _Gid_t uint32 + +const ( + S_IFMT = 0xf000 + S_IFIFO = 0x1000 + S_IFCHR = 0x2000 + S_IFDIR = 0x4000 + S_IFBLK = 0x6000 + S_IFREG = 0x8000 + S_IFLNK = 0xa000 + S_IFSOCK = 0xc000 + S_ISUID = 0x800 + S_ISGID = 0x400 + S_ISVTX = 0x200 + S_IRUSR = 0x100 + S_IWUSR = 0x80 + S_IXUSR = 0x40 +) + +type Stat_t struct { + Dev uint64 + Ino uint64 + Mode uint32 + Nlink uint32 + Uid uint32 + Gid uint32 + Rdev uint64 + Size int64 + Atim Timespec + Mtim Timespec + Ctim Timespec + Blksize int32 + Pad_cgo_0 [4]byte + Blocks int64 + Fstype [16]int8 +} + +type Flock_t struct { + Type int16 + Whence int16 + Pad_cgo_0 [4]byte + Start int64 + Len int64 + Sysid int32 + Pid int32 + Pad [4]int64 +} + +type Dirent struct { + Ino uint64 + Off int64 + Reclen uint16 + Name [1]int8 + Pad_cgo_0 [5]byte +} + +type RawSockaddrInet4 struct { + Family uint16 + Port uint16 + Addr [4]byte /* in_addr */ + Zero [8]int8 +} + +type RawSockaddrInet6 struct { + Family uint16 + Port uint16 + Flowinfo uint32 + Addr [16]byte /* in6_addr */ + Scope_id uint32 + X__sin6_src_id uint32 +} + +type RawSockaddrUnix struct { + Family uint16 + Path [108]int8 +} + +type RawSockaddrDatalink struct { + Family uint16 + Index uint16 + Type uint8 + Nlen uint8 + Alen uint8 + Slen uint8 + Data [244]int8 +} + +type RawSockaddr struct { + Family uint16 + Data [14]int8 +} + +type RawSockaddrAny struct { + Addr RawSockaddr + Pad [236]int8 +} + +type _Socklen uint32 + +type Linger struct { + Onoff int32 + Linger int32 +} + +type Iovec struct { + Base *int8 + Len uint64 +} + +type IPMreq struct { + Multiaddr [4]byte /* in_addr */ + Interface [4]byte /* in_addr */ +} + +type IPv6Mreq struct { + Multiaddr [16]byte /* in6_addr */ + Interface uint32 +} + +type Msghdr struct { + Name *byte + Namelen uint32 + Pad_cgo_0 [4]byte + Iov *Iovec + Iovlen int32 + Pad_cgo_1 [4]byte + Accrights *int8 + Accrightslen int32 + Pad_cgo_2 [4]byte +} + +type Cmsghdr struct { + Len uint32 + Level int32 + Type int32 +} + +type Inet6Pktinfo struct { + Addr [16]byte /* in6_addr */ + Ifindex uint32 +} + +type IPv6MTUInfo struct { + Addr RawSockaddrInet6 + Mtu uint32 +} + +type ICMPv6Filter struct { + X__icmp6_filt [8]uint32 +} + +const ( + SizeofSockaddrInet4 = 0x10 + SizeofSockaddrInet6 = 0x20 + SizeofSockaddrAny = 0xfc + SizeofSockaddrUnix = 0x6e + SizeofSockaddrDatalink = 0xfc + SizeofLinger = 0x8 + SizeofIPMreq = 0x8 + SizeofIPv6Mreq = 0x14 + SizeofMsghdr = 0x30 + SizeofCmsghdr = 0xc + SizeofInet6Pktinfo = 0x14 + SizeofIPv6MTUInfo = 0x24 + SizeofICMPv6Filter = 0x20 +) + +type FdSet struct { + Bits [1024]int64 +} + +type Utsname struct { + Sysname [257]int8 + Nodename [257]int8 + Release [257]int8 + Version [257]int8 + Machine [257]int8 +} + +type Ustat_t struct { + Tfree int64 + Tinode uint64 + Fname [6]int8 + Fpack [6]int8 + Pad_cgo_0 [4]byte +} + +const ( + AT_FDCWD = 0xffd19553 + AT_SYMLINK_NOFOLLOW = 0x1000 + AT_SYMLINK_FOLLOW = 0x2000 + AT_REMOVEDIR = 0x1 + AT_EACCESS = 0x4 +) + +const ( + SizeofIfMsghdr = 0x54 + SizeofIfData = 0x44 + SizeofIfaMsghdr = 0x14 + SizeofRtMsghdr = 0x4c + SizeofRtMetrics = 0x28 +) + +type IfMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Data IfData +} + +type IfData struct { + Type uint8 + Addrlen uint8 + Hdrlen uint8 + Pad_cgo_0 [1]byte + Mtu uint32 + Metric uint32 + Baudrate uint32 + Ipackets uint32 + Ierrors uint32 + Opackets uint32 + Oerrors uint32 + Collisions uint32 + Ibytes uint32 + Obytes uint32 + Imcasts uint32 + Omcasts uint32 + Iqdrops uint32 + Noproto uint32 + Lastchange Timeval32 +} + +type IfaMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Addrs int32 + Flags int32 + Index uint16 + Pad_cgo_0 [2]byte + Metric int32 +} + +type RtMsghdr struct { + Msglen uint16 + Version uint8 + Type uint8 + Index uint16 + Pad_cgo_0 [2]byte + Flags int32 + Addrs int32 + Pid int32 + Seq int32 + Errno int32 + Use int32 + Inits uint32 + Rmx RtMetrics +} + +type RtMetrics struct { + Locks uint32 + Mtu uint32 + Hopcount uint32 + Expire uint32 + Recvpipe uint32 + Sendpipe uint32 + Ssthresh uint32 + Rtt uint32 + Rttvar uint32 + Pksent uint32 +} + +const ( + SizeofBpfVersion = 0x4 + SizeofBpfStat = 0x80 + SizeofBpfProgram = 0x10 + SizeofBpfInsn = 0x8 + SizeofBpfHdr = 0x14 +) + +type BpfVersion struct { + Major uint16 + Minor uint16 +} + +type BpfStat struct { + Recv uint64 + Drop uint64 + Capt uint64 + Padding [13]uint64 +} + +type BpfProgram struct { + Len uint32 + Pad_cgo_0 [4]byte + Insns *BpfInsn +} + +type BpfInsn struct { + Code uint16 + Jt uint8 + Jf uint8 + K uint32 +} + +type BpfTimeval struct { + Sec int32 + Usec int32 +} + +type BpfHdr struct { + Tstamp BpfTimeval + Caplen uint32 + Datalen uint32 + Hdrlen uint16 + Pad_cgo_0 [2]byte +} + +const _SC_PAGESIZE = 0xb + +type Termios struct { + Iflag uint32 + Oflag uint32 + Cflag uint32 + Lflag uint32 + Cc [19]uint8 + Pad_cgo_0 [1]byte +} + +type Termio struct { + Iflag uint16 + Oflag uint16 + Cflag uint16 + Lflag uint16 + Line int8 + Cc [8]uint8 + Pad_cgo_0 [1]byte +} + +type Winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/BUILD.bazel b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/BUILD.bazel new file mode 100644 index 0000000000000000000000000000000000000000..698c326c566996bb08220b265982fdfaf53b161f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/BUILD.bazel @@ -0,0 +1,36 @@ +package(default_visibility = ["//visibility:private"]) + +load("@bazel_gazelle//:def.bzl", "gazelle") +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +gazelle( + name = "gazelle", + command = "fix", + prefix = "gopkg.in/resty.v1", +) + +go_library( + name = "go_default_library", + srcs = glob( + ["*.go"], + exclude = ["*_test.go"], + ), + importpath = "gopkg.in/resty.v1", + visibility = ["//visibility:public"], + deps = ["@org_golang_x_net//publicsuffix:go_default_library"], +) + +go_test( + name = "go_default_test", + srcs = + glob( + ["*_test.go"], + exclude = ["example_test.go"], + ), + data = glob([".testdata/*"]), + embed = [":go_default_library"], + importpath = "gopkg.in/resty.v1", + deps = [ + "@org_golang_x_net//proxy:go_default_library", + ], +) diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/LICENSE b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..6ae89ae636365a967706e55c88b9eb68b89d10e0 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-2018 Jeevanandam M., https://myjeeva.com <jeeva@myjeeva.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/README.md b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e2cac557eadfb197709d7e89a0f06c96b8da9b5f --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/README.md @@ -0,0 +1,736 @@ +<p align="center"> +<h1 align="center">Resty</h1> +<p align="center">Simple HTTP and REST client library for Go (inspired by Ruby rest-client)</p> +<p align="center"><a href="#features">Features</a> section describes in detail about Resty capabilities</p> +</p> +<p align="center"> +<p align="center"><a href="https://travis-ci.org/go-resty/resty"><img src="https://travis-ci.org/go-resty/resty.svg?branch=master" alt="Build Status"></a> <a href="https://codecov.io/gh/go-resty/resty/branch/master"><img src="https://codecov.io/gh/go-resty/resty/branch/master/graph/badge.svg" alt="Code Coverage"></a> <a href="https://goreportcard.com/report/go-resty/resty"><img src="https://goreportcard.com/badge/go-resty/resty" alt="Go Report Card"></a> <a href="https://github.com/go-resty/resty/releases/latest"><img src="https://img.shields.io/badge/version-1.10.3-blue.svg" alt="Release Version"></a> <a href="https://godoc.org/gopkg.in/resty.v1"><img src="https://godoc.org/gopkg.in/resty.v1?status.svg" alt="GoDoc"></a> <a href="LICENSE"><img src="https://img.shields.io/github/license/go-resty/resty.svg" alt="License"></a></p> +</p> + +## News + + * [Collecting Inputs for Resty v2.0.0](https://github.com/go-resty/resty/issues/166) + * v1.10.3 [released](https://github.com/go-resty/resty/releases/latest) and tagged on Dec 04, 2018. + * v1.10.0 [released](https://github.com/go-resty/resty/releases/tag/v1.10.0) and tagged on Oct 22, 2018. + * v1.0 released - Resty's first version was released on Sep 15, 2015 then it grew gradually as a very handy and helpful library. Its been a two years; `v1.0` was released on Sep 25, 2017. I'm very thankful to Resty users and its [contributors](https://github.com/go-resty/resty/graphs/contributors). + +## Features + + * GET, POST, PUT, DELETE, HEAD, PATCH, OPTIONS, etc. + * Simple and chainable methods for settings and request + * Request Body can be `string`, `[]byte`, `struct`, `map`, `slice` and `io.Reader` too + * Auto detects `Content-Type` + * Buffer less processing for `io.Reader` + * [Response](https://godoc.org/gopkg.in/resty.v1#Response) object gives you more possibility + * Access as `[]byte` array - `response.Body()` OR Access as `string` - `response.String()` + * Know your `response.Time()` and when we `response.ReceivedAt()` + * Automatic marshal and unmarshal for `JSON` and `XML` content type + * Default is `JSON`, if you supply `struct/map` without header `Content-Type` + * For auto-unmarshal, refer to - + - Success scenario [Request.SetResult()](https://godoc.org/gopkg.in/resty.v1#Request.SetResult) and [Response.Result()](https://godoc.org/gopkg.in/resty.v1#Response.Result). + - Error scenario [Request.SetError()](https://godoc.org/gopkg.in/resty.v1#Request.SetError) and [Response.Error()](https://godoc.org/gopkg.in/resty.v1#Response.Error). + - Supports [RFC7807](https://tools.ietf.org/html/rfc7807) - `application/problem+json` & `application/problem+xml` + * Easy to upload one or more file(s) via `multipart/form-data` + * Auto detects file content type + * Request URL [Path Params (aka URI Params)](https://godoc.org/gopkg.in/resty.v1#Request.SetPathParams) + * Backoff Retry Mechanism with retry condition function [reference](retry_test.go) + * resty client HTTP & REST [Request](https://godoc.org/gopkg.in/resty.v1#Client.OnBeforeRequest) and [Response](https://godoc.org/gopkg.in/resty.v1#Client.OnAfterResponse) middlewares + * `Request.SetContext` supported `go1.7` and above + * Authorization option of `BasicAuth` and `Bearer` token + * Set request `ContentLength` value for all request or particular request + * Choose between HTTP and REST mode. Default is `REST` + * `HTTP` - default up to 10 redirects and no automatic response unmarshal + * `REST` - defaults to no redirects and automatic response marshal/unmarshal for `JSON` & `XML` + * Custom [Root Certificates](https://godoc.org/gopkg.in/resty.v1#Client.SetRootCertificate) and Client [Certificates](https://godoc.org/gopkg.in/resty.v1#Client.SetCertificates) + * Download/Save HTTP response directly into File, like `curl -o` flag. See [SetOutputDirectory](https://godoc.org/gopkg.in/resty.v1#Client.SetOutputDirectory) & [SetOutput](https://godoc.org/gopkg.in/resty.v1#Request.SetOutput). + * Cookies for your request and CookieJar support + * SRV Record based request instead of Host URL + * Client settings like `Timeout`, `RedirectPolicy`, `Proxy`, `TLSClientConfig`, `Transport`, etc. + * Optionally allows GET request with payload, see [SetAllowGetMethodPayload](https://godoc.org/gopkg.in/resty.v1#Client.SetAllowGetMethodPayload) + * Supports registering external JSON library into resty, see [how to use](https://github.com/go-resty/resty/issues/76#issuecomment-314015250) + * Exposes Response reader without reading response (no auto-unmarshaling) if need be, see [how to use](https://github.com/go-resty/resty/issues/87#issuecomment-322100604) + * Option to specify expected `Content-Type` when response `Content-Type` header missing. Refer to [#92](https://github.com/go-resty/resty/issues/92) + * Resty design + * Have client level settings & options and also override at Request level if you want to + * Request and Response middlewares + * Create Multiple clients if you want to `resty.New()` + * Supports `http.RoundTripper` implementation, see [SetTransport](https://godoc.org/gopkg.in/resty.v1#Client.SetTransport) + * goroutine concurrent safe + * REST and HTTP modes + * Debug mode - clean and informative logging presentation + * Gzip - Go does it automatically also resty has fallback handling too + * Works fine with `HTTP/2` and `HTTP/1.1` + * [Bazel support](#bazel-support) + * Easily mock resty for testing, [for e.g.](#mocking-http-requests-using-httpmock-library) + * Well tested client library + +Resty works with `go1.3` and above. + +### Included Batteries + + * Redirect Policies - see [how to use](#redirect-policy) + * NoRedirectPolicy + * FlexibleRedirectPolicy + * DomainCheckRedirectPolicy + * etc. [more info](redirect.go) + * Retry Mechanism [how to use](#retries) + * Backoff Retry + * Conditional Retry + * SRV Record based request instead of Host URL [how to use](resty_test.go#L1412) + * etc (upcoming - throw your idea's [here](https://github.com/go-resty/resty/issues)). + +## Installation + +#### Stable Version - Production Ready + +Please refer section [Versioning](#versioning) for detailed info. + +##### go.mod + +```bash +require gopkg.in/resty.v1 v1.10.3 +``` + +##### go get +```bash +go get -u gopkg.in/resty.v1 +``` + +#### Heads up for upcoming Resty v2 + +Resty v2 release will be moving away from `gopkg.in` proxy versioning. It will completely follow and adpating Go Mod versioning recommendation. For e.g.: module definition would be `module github.com/go-resty/resty/v2`. + + +## It might be beneficial for your project :smile: + +Resty author also published following projects for Go Community. + + * [aah framework](https://aahframework.org) - A secure, flexible, rapid Go web framework. + * [THUMBAI](https://thumbai.app), [Source Code](https://github.com/thumbai/thumbai) - Go Mod Repository, Go Vanity Service and Simple Proxy Server. + * [go-model](https://github.com/jeevatkm/go-model) - Robust & Easy to use model mapper and utility methods for Go `struct`. + +## Usage + +The following samples will assist you to become as comfortable as possible with resty library. Resty comes with ready to use DefaultClient. + +Import resty into your code and refer it as `resty`. + +```go +import "gopkg.in/resty.v1" +``` + +#### Simple GET + +```go +// GET request +resp, err := resty.R().Get("http://httpbin.org/get") + +// explore response object +fmt.Printf("\nError: %v", err) +fmt.Printf("\nResponse Status Code: %v", resp.StatusCode()) +fmt.Printf("\nResponse Status: %v", resp.Status()) +fmt.Printf("\nResponse Time: %v", resp.Time()) +fmt.Printf("\nResponse Received At: %v", resp.ReceivedAt()) +fmt.Printf("\nResponse Body: %v", resp) // or resp.String() or string(resp.Body()) +// more... + +/* Output +Error: <nil> +Response Status Code: 200 +Response Status: 200 OK +Response Time: 160.1151ms +Response Received At: 2018-10-16 16:28:34.8595663 -0700 PDT m=+0.166119401 +Response Body: { + "args": {}, + "headers": { + "Accept-Encoding": "gzip", + "Connection": "close", + "Host": "httpbin.org", + "User-Agent": "go-resty/1.10.0 (https://github.com/go-resty/resty)" + }, + "origin": "0.0.0.0", + "url": "http://httpbin.org/get" +} +*/ +``` + +#### Enhanced GET + +```go +resp, err := resty.R(). + SetQueryParams(map[string]string{ + "page_no": "1", + "limit": "20", + "sort":"name", + "order": "asc", + "random":strconv.FormatInt(time.Now().Unix(), 10), + }). + SetHeader("Accept", "application/json"). + SetAuthToken("BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F"). + Get("/search_result") + + +// Sample of using Request.SetQueryString method +resp, err := resty.R(). + SetQueryString("productId=232&template=fresh-sample&cat=resty&source=google&kw=buy a lot more"). + SetHeader("Accept", "application/json"). + SetAuthToken("BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F"). + Get("/show_product") +``` + +#### Various POST method combinations + +```go +// POST JSON string +// No need to set content type, if you have client level setting +resp, err := resty.R(). + SetHeader("Content-Type", "application/json"). + SetBody(`{"username":"testuser", "password":"testpass"}`). + SetResult(&AuthSuccess{}). // or SetResult(AuthSuccess{}). + Post("https://myapp.com/login") + +// POST []byte array +// No need to set content type, if you have client level setting +resp, err := resty.R(). + SetHeader("Content-Type", "application/json"). + SetBody([]byte(`{"username":"testuser", "password":"testpass"}`)). + SetResult(&AuthSuccess{}). // or SetResult(AuthSuccess{}). + Post("https://myapp.com/login") + +// POST Struct, default is JSON content type. No need to set one +resp, err := resty.R(). + SetBody(User{Username: "testuser", Password: "testpass"}). + SetResult(&AuthSuccess{}). // or SetResult(AuthSuccess{}). + SetError(&AuthError{}). // or SetError(AuthError{}). + Post("https://myapp.com/login") + +// POST Map, default is JSON content type. No need to set one +resp, err := resty.R(). + SetBody(map[string]interface{}{"username": "testuser", "password": "testpass"}). + SetResult(&AuthSuccess{}). // or SetResult(AuthSuccess{}). + SetError(&AuthError{}). // or SetError(AuthError{}). + Post("https://myapp.com/login") + +// POST of raw bytes for file upload. For example: upload file to Dropbox +fileBytes, _ := ioutil.ReadFile("/Users/jeeva/mydocument.pdf") + +// See we are not setting content-type header, since go-resty automatically detects Content-Type for you +resp, err := resty.R(). + SetBody(fileBytes). + SetContentLength(true). // Dropbox expects this value + SetAuthToken("<your-auth-token>"). + SetError(&DropboxError{}). // or SetError(DropboxError{}). + Post("https://content.dropboxapi.com/1/files_put/auto/resty/mydocument.pdf") // for upload Dropbox supports PUT too + +// Note: resty detects Content-Type for request body/payload if content type header is not set. +// * For struct and map data type defaults to 'application/json' +// * Fallback is plain text content type +``` + +#### Sample PUT + +You can use various combinations of `PUT` method call like demonstrated for `POST`. + +```go +// Note: This is one sample of PUT method usage, refer POST for more combination + +// Request goes as JSON content type +// No need to set auth token, error, if you have client level settings +resp, err := resty.R(). + SetBody(Article{ + Title: "go-resty", + Content: "This is my article content, oh ya!", + Author: "Jeevanandam M", + Tags: []string{"article", "sample", "resty"}, + }). + SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD"). + SetError(&Error{}). // or SetError(Error{}). + Put("https://myapp.com/article/1234") +``` + +#### Sample PATCH + +You can use various combinations of `PATCH` method call like demonstrated for `POST`. + +```go +// Note: This is one sample of PUT method usage, refer POST for more combination + +// Request goes as JSON content type +// No need to set auth token, error, if you have client level settings +resp, err := resty.R(). + SetBody(Article{ + Tags: []string{"new tag1", "new tag2"}, + }). + SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD"). + SetError(&Error{}). // or SetError(Error{}). + Patch("https://myapp.com/articles/1234") +``` + +#### Sample DELETE, HEAD, OPTIONS + +```go +// DELETE a article +// No need to set auth token, error, if you have client level settings +resp, err := resty.R(). + SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD"). + SetError(&Error{}). // or SetError(Error{}). + Delete("https://myapp.com/articles/1234") + +// DELETE a articles with payload/body as a JSON string +// No need to set auth token, error, if you have client level settings +resp, err := resty.R(). + SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD"). + SetError(&Error{}). // or SetError(Error{}). + SetHeader("Content-Type", "application/json"). + SetBody(`{article_ids: [1002, 1006, 1007, 87683, 45432] }`). + Delete("https://myapp.com/articles") + +// HEAD of resource +// No need to set auth token, if you have client level settings +resp, err := resty.R(). + SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD"). + Head("https://myapp.com/videos/hi-res-video") + +// OPTIONS of resource +// No need to set auth token, if you have client level settings +resp, err := resty.R(). + SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD"). + Options("https://myapp.com/servers/nyc-dc-01") +``` + +### Multipart File(s) upload + +#### Using io.Reader + +```go +profileImgBytes, _ := ioutil.ReadFile("/Users/jeeva/test-img.png") +notesBytes, _ := ioutil.ReadFile("/Users/jeeva/text-file.txt") + +resp, err := resty.R(). + SetFileReader("profile_img", "test-img.png", bytes.NewReader(profileImgBytes)). + SetFileReader("notes", "text-file.txt", bytes.NewReader(notesBytes)). + SetFormData(map[string]string{ + "first_name": "Jeevanandam", + "last_name": "M", + }). + Post("http://myapp.com/upload") +``` + +#### Using File directly from Path + +```go +// Single file scenario +resp, err := resty.R(). + SetFile("profile_img", "/Users/jeeva/test-img.png"). + Post("http://myapp.com/upload") + +// Multiple files scenario +resp, err := resty.R(). + SetFiles(map[string]string{ + "profile_img": "/Users/jeeva/test-img.png", + "notes": "/Users/jeeva/text-file.txt", + }). + Post("http://myapp.com/upload") + +// Multipart of form fields and files +resp, err := resty.R(). + SetFiles(map[string]string{ + "profile_img": "/Users/jeeva/test-img.png", + "notes": "/Users/jeeva/text-file.txt", + }). + SetFormData(map[string]string{ + "first_name": "Jeevanandam", + "last_name": "M", + "zip_code": "00001", + "city": "my city", + "access_token": "C6A79608-782F-4ED0-A11D-BD82FAD829CD", + }). + Post("http://myapp.com/profile") +``` + +#### Sample Form submission + +```go +// just mentioning about POST as an example with simple flow +// User Login +resp, err := resty.R(). + SetFormData(map[string]string{ + "username": "jeeva", + "password": "mypass", + }). + Post("http://myapp.com/login") + +// Followed by profile update +resp, err := resty.R(). + SetFormData(map[string]string{ + "first_name": "Jeevanandam", + "last_name": "M", + "zip_code": "00001", + "city": "new city update", + }). + Post("http://myapp.com/profile") + +// Multi value form data +criteria := url.Values{ + "search_criteria": []string{"book", "glass", "pencil"}, +} +resp, err := resty.R(). + SetMultiValueFormData(criteria). + Post("http://myapp.com/search") +``` + +#### Save HTTP Response into File + +```go +// Setting output directory path, If directory not exists then resty creates one! +// This is optional one, if you're planning using absoule path in +// `Request.SetOutput` and can used together. +resty.SetOutputDirectory("/Users/jeeva/Downloads") + +// HTTP response gets saved into file, similar to curl -o flag +_, err := resty.R(). + SetOutput("plugin/ReplyWithHeader-v5.1-beta.zip"). + Get("http://bit.ly/1LouEKr") + +// OR using absolute path +// Note: output directory path is not used for absoulte path +_, err := resty.R(). + SetOutput("/MyDownloads/plugin/ReplyWithHeader-v5.1-beta.zip"). + Get("http://bit.ly/1LouEKr") +``` + +#### Request URL Path Params + +Resty provides easy to use dynamic request URL path params. Params can be set at client and request level. Client level params value can be overridden at request level. + +```go +resty.R().SetPathParams(map[string]string{ + "userId": "sample@sample.com", + "subAccountId": "100002", +}). +Get("/v1/users/{userId}/{subAccountId}/details") + +// Result: +// Composed URL - /v1/users/sample@sample.com/100002/details +``` + +#### Request and Response Middleware + +Resty provides middleware ability to manipulate for Request and Response. It is more flexible than callback approach. + +```go +// Registering Request Middleware +resty.OnBeforeRequest(func(c *resty.Client, req *resty.Request) error { + // Now you have access to Client and current Request object + // manipulate it as per your need + + return nil // if its success otherwise return error + }) + +// Registering Response Middleware +resty.OnAfterResponse(func(c *resty.Client, resp *resty.Response) error { + // Now you have access to Client and current Response object + // manipulate it as per your need + + return nil // if its success otherwise return error + }) +``` + +#### Redirect Policy + +Resty provides few ready to use redirect policy(s) also it supports multiple policies together. + +```go +// Assign Client Redirect Policy. Create one as per you need +resty.SetRedirectPolicy(resty.FlexibleRedirectPolicy(15)) + +// Wanna multiple policies such as redirect count, domain name check, etc +resty.SetRedirectPolicy(resty.FlexibleRedirectPolicy(20), + resty.DomainCheckRedirectPolicy("host1.com", "host2.org", "host3.net")) +``` + +##### Custom Redirect Policy + +Implement [RedirectPolicy](redirect.go#L20) interface and register it with resty client. Have a look [redirect.go](redirect.go) for more information. + +```go +// Using raw func into resty.SetRedirectPolicy +resty.SetRedirectPolicy(resty.RedirectPolicyFunc(func(req *http.Request, via []*http.Request) error { + // Implement your logic here + + // return nil for continue redirect otherwise return error to stop/prevent redirect + return nil +})) + +//--------------------------------------------------- + +// Using struct create more flexible redirect policy +type CustomRedirectPolicy struct { + // variables goes here +} + +func (c *CustomRedirectPolicy) Apply(req *http.Request, via []*http.Request) error { + // Implement your logic here + + // return nil for continue redirect otherwise return error to stop/prevent redirect + return nil +} + +// Registering in resty +resty.SetRedirectPolicy(CustomRedirectPolicy{/* initialize variables */}) +``` + +#### Custom Root Certificates and Client Certificates + +```go +// Custom Root certificates, just supply .pem file. +// you can add one or more root certificates, its get appended +resty.SetRootCertificate("/path/to/root/pemFile1.pem") +resty.SetRootCertificate("/path/to/root/pemFile2.pem") +// ... and so on! + +// Adding Client Certificates, you add one or more certificates +// Sample for creating certificate object +// Parsing public/private key pair from a pair of files. The files must contain PEM encoded data. +cert1, err := tls.LoadX509KeyPair("certs/client.pem", "certs/client.key") +if err != nil { + log.Fatalf("ERROR client certificate: %s", err) +} +// ... + +// You add one or more certificates +resty.SetCertificates(cert1, cert2, cert3) +``` + +#### Proxy Settings - Client as well as at Request Level + +Default `Go` supports Proxy via environment variable `HTTP_PROXY`. Resty provides support via `SetProxy` & `RemoveProxy`. +Choose as per your need. + +**Client Level Proxy** settings applied to all the request + +```go +// Setting a Proxy URL and Port +resty.SetProxy("http://proxyserver:8888") + +// Want to remove proxy setting +resty.RemoveProxy() +``` + +#### Retries + +Resty uses [backoff](http://www.awsarchitectureblog.com/2015/03/backoff.html) +to increase retry intervals after each attempt. + +Usage example: + +```go +// Retries are configured per client +resty. + // Set retry count to non zero to enable retries + SetRetryCount(3). + // You can override initial retry wait time. + // Default is 100 milliseconds. + SetRetryWaitTime(5 * time.Second). + // MaxWaitTime can be overridden as well. + // Default is 2 seconds. + SetRetryMaxWaitTime(20 * time.Second) +``` + +Above setup will result in resty retrying requests returned non nil error up to +3 times with delay increased after each attempt. + +You can optionally provide client with custom retry conditions: + +```go +resty.AddRetryCondition( + // Condition function will be provided with *resty.Response as a + // parameter. It is expected to return (bool, error) pair. Resty will retry + // in case condition returns true or non nil error. + func(r *resty.Response) (bool, error) { + return r.StatusCode() == http.StatusTooManyRequests, nil + }, +) +``` + +Above example will make resty retry requests ended with `429 Too Many Requests` +status code. + +Multiple retry conditions can be added. + +It is also possible to use `resty.Backoff(...)` to get arbitrary retry scenarios +implemented. [Reference](retry_test.go). + +#### Choose REST or HTTP mode + +```go +// REST mode. This is Default. +resty.SetRESTMode() + +// HTTP mode +resty.SetHTTPMode() +``` + +#### Allow GET request with Payload + +```go +// Allow GET request with Payload. This is disabled by default. +resty.SetAllowGetMethodPayload(true) +``` + +#### Wanna Multiple Clients + +```go +// Here you go! +// Client 1 +client1 := resty.New() +client1.R().Get("http://httpbin.org") +// ... + +// Client 2 +client2 := resty.New() +client2.R().Head("http://httpbin.org") +// ... + +// Bend it as per your need!!! +``` + +#### Remaining Client Settings & its Options + +```go +// Unique settings at Client level +//-------------------------------- +// Enable debug mode +resty.SetDebug(true) + +// Using you custom log writer +logFile, _ := os.OpenFile("/Users/jeeva/go-resty.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) +resty.SetLogger(logFile) + +// Assign Client TLSClientConfig +// One can set custom root-certificate. Refer: http://golang.org/pkg/crypto/tls/#example_Dial +resty.SetTLSClientConfig(&tls.Config{ RootCAs: roots }) + +// or One can disable security check (https) +resty.SetTLSClientConfig(&tls.Config{ InsecureSkipVerify: true }) + +// Set client timeout as per your need +resty.SetTimeout(1 * time.Minute) + + +// You can override all below settings and options at request level if you want to +//-------------------------------------------------------------------------------- +// Host URL for all request. So you can use relative URL in the request +resty.SetHostURL("http://httpbin.org") + +// Headers for all request +resty.SetHeader("Accept", "application/json") +resty.SetHeaders(map[string]string{ + "Content-Type": "application/json", + "User-Agent": "My custom User Agent String", + }) + +// Cookies for all request +resty.SetCookie(&http.Cookie{ + Name:"go-resty", + Value:"This is cookie value", + Path: "/", + Domain: "sample.com", + MaxAge: 36000, + HttpOnly: true, + Secure: false, + }) +resty.SetCookies(cookies) + +// URL query parameters for all request +resty.SetQueryParam("user_id", "00001") +resty.SetQueryParams(map[string]string{ // sample of those who use this manner + "api_key": "api-key-here", + "api_secert": "api-secert", + }) +resty.R().SetQueryString("productId=232&template=fresh-sample&cat=resty&source=google&kw=buy a lot more") + +// Form data for all request. Typically used with POST and PUT +resty.SetFormData(map[string]string{ + "access_token": "BC594900-518B-4F7E-AC75-BD37F019E08F", + }) + +// Basic Auth for all request +resty.SetBasicAuth("myuser", "mypass") + +// Bearer Auth Token for all request +resty.SetAuthToken("BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F") + +// Enabling Content length value for all request +resty.SetContentLength(true) + +// Registering global Error object structure for JSON/XML request +resty.SetError(&Error{}) // or resty.SetError(Error{}) +``` + +#### Unix Socket + +```go +unixSocket := "/var/run/my_socket.sock" + +// Create a Go's http.Transport so we can set it in resty. +transport := http.Transport{ + Dial: func(_, _ string) (net.Conn, error) { + return net.Dial("unix", unixSocket) + }, +} + +// Set the previous transport that we created, set the scheme of the communication to the +// socket and set the unixSocket as the HostURL. +r := resty.New().SetTransport(&transport).SetScheme("http").SetHostURL(unixSocket) + +// No need to write the host's URL on the request, just the path. +r.R().Get("/index.html") +``` + +#### Bazel support + +Resty can be built, tested and depended upon via [Bazel](https://bazel.build). +For example, to run all tests: + +```shell +bazel test :go_default_test +``` + +#### Mocking http requests using [httpmock](https://github.com/jarcoal/httpmock) library + +In order to mock the http requests when testing your application you +could use the `httpmock` library. + +When using the default resty client, you should pass the client to the library as follow: + +```go +httpmock.ActivateNonDefault(resty.DefaultClient.GetClient()) +``` + +More detailed example of mocking resty http requests using ginko could be found [here](https://github.com/jarcoal/httpmock#ginkgo--resty-example). + +## Versioning + +resty releases versions according to [Semantic Versioning](http://semver.org) + + * `gopkg.in/resty.vX` points to appropriate tagged versions; `X` denotes version series number and it's a stable release for production use. For e.g. `gopkg.in/resty.v0`. + * Development takes place at the master branch. Although the code in master should always compile and test successfully, it might break API's. I aim to maintain backwards compatibility, but sometimes API's and behavior might be changed to fix a bug. + +## Contribution + +I would welcome your contribution! If you find any improvement or issue you want to fix, feel free to send a pull request, I like pull requests that include test cases for fix/enhancement. I have done my best to bring pretty good code coverage. Feel free to write tests. + +BTW, I'd like to know what you think about `Resty`. Kindly open an issue or send me an email; it'd mean a lot to me. + +## Creator + +[Jeevanandam M.](https://github.com/jeevatkm) (jeeva@myjeeva.com) + +## Contributors + +Have a look on [Contributors](https://github.com/go-resty/resty/graphs/contributors) page. + +## License + +Resty released under MIT license, refer [LICENSE](LICENSE) file. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/WORKSPACE b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/WORKSPACE new file mode 100644 index 0000000000000000000000000000000000000000..5459d63218fb78ec6a6d03699677eff1001a9540 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/WORKSPACE @@ -0,0 +1,27 @@ +workspace(name = "resty") + +git_repository( + name = "io_bazel_rules_go", + remote = "https://github.com/bazelbuild/rules_go.git", + tag = "0.13.0", +) + +git_repository( + name = "bazel_gazelle", + remote = "https://github.com/bazelbuild/bazel-gazelle.git", + tag = "0.13.0", +) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_rules_dependencies", + "go_register_toolchains", +) + +go_rules_dependencies() + +go_register_toolchains() + +load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies") + +gazelle_dependencies() diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/client.go b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/client.go new file mode 100644 index 0000000000000000000000000000000000000000..24a9917b1368f0803b6cafdef832e8f7aa47dad2 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/client.go @@ -0,0 +1,922 @@ +// Copyright (c) 2015-2018 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// resty source code and usage is governed by a MIT style +// license that can be found in the LICENSE file. + +package resty + +import ( + "bytes" + "compress/gzip" + "crypto/tls" + "crypto/x509" + "errors" + "fmt" + "io" + "io/ioutil" + "log" + "net/http" + "net/url" + "reflect" + "regexp" + "strings" + "sync" + "time" +) + +const ( + // MethodGet HTTP method + MethodGet = "GET" + + // MethodPost HTTP method + MethodPost = "POST" + + // MethodPut HTTP method + MethodPut = "PUT" + + // MethodDelete HTTP method + MethodDelete = "DELETE" + + // MethodPatch HTTP method + MethodPatch = "PATCH" + + // MethodHead HTTP method + MethodHead = "HEAD" + + // MethodOptions HTTP method + MethodOptions = "OPTIONS" +) + +var ( + hdrUserAgentKey = http.CanonicalHeaderKey("User-Agent") + hdrAcceptKey = http.CanonicalHeaderKey("Accept") + hdrContentTypeKey = http.CanonicalHeaderKey("Content-Type") + hdrContentLengthKey = http.CanonicalHeaderKey("Content-Length") + hdrContentEncodingKey = http.CanonicalHeaderKey("Content-Encoding") + hdrAuthorizationKey = http.CanonicalHeaderKey("Authorization") + + plainTextType = "text/plain; charset=utf-8" + jsonContentType = "application/json; charset=utf-8" + formContentType = "application/x-www-form-urlencoded" + + jsonCheck = regexp.MustCompile(`(?i:(application|text)/(json|.*\+json)(;|$))`) + xmlCheck = regexp.MustCompile(`(?i:(application|text)/(xml|.*\+xml)(;|$))`) + + hdrUserAgentValue = "go-resty/%s (https://github.com/go-resty/resty)" + bufPool = &sync.Pool{New: func() interface{} { return &bytes.Buffer{} }} +) + +// Client type is used for HTTP/RESTful global values +// for all request raised from the client +type Client struct { + HostURL string + QueryParam url.Values + FormData url.Values + Header http.Header + UserInfo *User + Token string + Cookies []*http.Cookie + Error reflect.Type + Debug bool + DisableWarn bool + AllowGetMethodPayload bool + Log *log.Logger + RetryCount int + RetryWaitTime time.Duration + RetryMaxWaitTime time.Duration + RetryConditions []RetryConditionFunc + JSONMarshal func(v interface{}) ([]byte, error) + JSONUnmarshal func(data []byte, v interface{}) error + + jsonEscapeHTML bool + httpClient *http.Client + setContentLength bool + isHTTPMode bool + outputDirectory string + scheme string + proxyURL *url.URL + closeConnection bool + notParseResponse bool + debugBodySizeLimit int64 + logPrefix string + pathParams map[string]string + beforeRequest []func(*Client, *Request) error + udBeforeRequest []func(*Client, *Request) error + preReqHook func(*Client, *Request) error + afterResponse []func(*Client, *Response) error + requestLog func(*RequestLog) error + responseLog func(*ResponseLog) error +} + +// User type is to hold an username and password information +type User struct { + Username, Password string +} + +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +// Client methods +//___________________________________ + +// SetHostURL method is to set Host URL in the client instance. It will be used with request +// raised from this client with relative URL +// // Setting HTTP address +// resty.SetHostURL("http://myjeeva.com") +// +// // Setting HTTPS address +// resty.SetHostURL("https://myjeeva.com") +// +func (c *Client) SetHostURL(url string) *Client { + c.HostURL = strings.TrimRight(url, "/") + return c +} + +// SetHeader method sets a single header field and its value in the client instance. +// These headers will be applied to all requests raised from this client instance. +// Also it can be overridden at request level header options, see `resty.R().SetHeader` +// or `resty.R().SetHeaders`. +// +// Example: To set `Content-Type` and `Accept` as `application/json` +// +// resty. +// SetHeader("Content-Type", "application/json"). +// SetHeader("Accept", "application/json") +// +func (c *Client) SetHeader(header, value string) *Client { + c.Header.Set(header, value) + return c +} + +// SetHeaders method sets multiple headers field and its values at one go in the client instance. +// These headers will be applied to all requests raised from this client instance. Also it can be +// overridden at request level headers options, see `resty.R().SetHeaders` or `resty.R().SetHeader`. +// +// Example: To set `Content-Type` and `Accept` as `application/json` +// +// resty.SetHeaders(map[string]string{ +// "Content-Type": "application/json", +// "Accept": "application/json", +// }) +// +func (c *Client) SetHeaders(headers map[string]string) *Client { + for h, v := range headers { + c.Header.Set(h, v) + } + + return c +} + +// SetCookieJar method sets custom http.CookieJar in the resty client. Its way to override default. +// Example: sometimes we don't want to save cookies in api contacting, we can remove the default +// CookieJar in resty client. +// +// resty.SetCookieJar(nil) +// +func (c *Client) SetCookieJar(jar http.CookieJar) *Client { + c.httpClient.Jar = jar + return c +} + +// SetCookie method appends a single cookie in the client instance. +// These cookies will be added to all the request raised from this client instance. +// resty.SetCookie(&http.Cookie{ +// Name:"go-resty", +// Value:"This is cookie value", +// Path: "/", +// Domain: "sample.com", +// MaxAge: 36000, +// HttpOnly: true, +// Secure: false, +// }) +// +func (c *Client) SetCookie(hc *http.Cookie) *Client { + c.Cookies = append(c.Cookies, hc) + return c +} + +// SetCookies method sets an array of cookies in the client instance. +// These cookies will be added to all the request raised from this client instance. +// cookies := make([]*http.Cookie, 0) +// +// cookies = append(cookies, &http.Cookie{ +// Name:"go-resty-1", +// Value:"This is cookie 1 value", +// Path: "/", +// Domain: "sample.com", +// MaxAge: 36000, +// HttpOnly: true, +// Secure: false, +// }) +// +// cookies = append(cookies, &http.Cookie{ +// Name:"go-resty-2", +// Value:"This is cookie 2 value", +// Path: "/", +// Domain: "sample.com", +// MaxAge: 36000, +// HttpOnly: true, +// Secure: false, +// }) +// +// // Setting a cookies into resty +// resty.SetCookies(cookies) +// +func (c *Client) SetCookies(cs []*http.Cookie) *Client { + c.Cookies = append(c.Cookies, cs...) + return c +} + +// SetQueryParam method sets single parameter and its value in the client instance. +// It will be formed as query string for the request. For example: `search=kitchen%20papers&size=large` +// in the URL after `?` mark. These query params will be added to all the request raised from +// this client instance. Also it can be overridden at request level Query Param options, +// see `resty.R().SetQueryParam` or `resty.R().SetQueryParams`. +// resty. +// SetQueryParam("search", "kitchen papers"). +// SetQueryParam("size", "large") +// +func (c *Client) SetQueryParam(param, value string) *Client { + c.QueryParam.Set(param, value) + return c +} + +// SetQueryParams method sets multiple parameters and their values at one go in the client instance. +// It will be formed as query string for the request. For example: `search=kitchen%20papers&size=large` +// in the URL after `?` mark. These query params will be added to all the request raised from this +// client instance. Also it can be overridden at request level Query Param options, +// see `resty.R().SetQueryParams` or `resty.R().SetQueryParam`. +// resty.SetQueryParams(map[string]string{ +// "search": "kitchen papers", +// "size": "large", +// }) +// +func (c *Client) SetQueryParams(params map[string]string) *Client { + for p, v := range params { + c.SetQueryParam(p, v) + } + + return c +} + +// SetFormData method sets Form parameters and their values in the client instance. +// It's applicable only HTTP method `POST` and `PUT` and requets content type would be set as +// `application/x-www-form-urlencoded`. These form data will be added to all the request raised from +// this client instance. Also it can be overridden at request level form data, see `resty.R().SetFormData`. +// resty.SetFormData(map[string]string{ +// "access_token": "BC594900-518B-4F7E-AC75-BD37F019E08F", +// "user_id": "3455454545", +// }) +// +func (c *Client) SetFormData(data map[string]string) *Client { + for k, v := range data { + c.FormData.Set(k, v) + } + + return c +} + +// SetBasicAuth method sets the basic authentication header in the HTTP request. Example: +// Authorization: Basic <base64-encoded-value> +// +// Example: To set the header for username "go-resty" and password "welcome" +// resty.SetBasicAuth("go-resty", "welcome") +// +// This basic auth information gets added to all the request rasied from this client instance. +// Also it can be overridden or set one at the request level is supported, see `resty.R().SetBasicAuth`. +// +func (c *Client) SetBasicAuth(username, password string) *Client { + c.UserInfo = &User{Username: username, Password: password} + return c +} + +// SetAuthToken method sets bearer auth token header in the HTTP request. Example: +// Authorization: Bearer <auth-token-value-comes-here> +// +// Example: To set auth token BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F +// +// resty.SetAuthToken("BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F") +// +// This bearer auth token gets added to all the request rasied from this client instance. +// Also it can be overridden or set one at the request level is supported, see `resty.R().SetAuthToken`. +// +func (c *Client) SetAuthToken(token string) *Client { + c.Token = token + return c +} + +// R method creates a request instance, its used for Get, Post, Put, Delete, Patch, Head and Options. +func (c *Client) R() *Request { + r := &Request{ + QueryParam: url.Values{}, + FormData: url.Values{}, + Header: http.Header{}, + + client: c, + multipartFiles: []*File{}, + multipartFields: []*multipartField{}, + pathParams: map[string]string{}, + jsonEscapeHTML: true, + } + + return r +} + +// NewRequest is an alias for R(). Creates a request instance, its used for +// Get, Post, Put, Delete, Patch, Head and Options. +func (c *Client) NewRequest() *Request { + return c.R() +} + +// OnBeforeRequest method appends request middleware into the before request chain. +// Its gets applied after default `go-resty` request middlewares and before request +// been sent from `go-resty` to host server. +// resty.OnBeforeRequest(func(c *resty.Client, r *resty.Request) error { +// // Now you have access to Client and Request instance +// // manipulate it as per your need +// +// return nil // if its success otherwise return error +// }) +// +func (c *Client) OnBeforeRequest(m func(*Client, *Request) error) *Client { + c.udBeforeRequest = append(c.udBeforeRequest, m) + return c +} + +// OnAfterResponse method appends response middleware into the after response chain. +// Once we receive response from host server, default `go-resty` response middleware +// gets applied and then user assigened response middlewares applied. +// resty.OnAfterResponse(func(c *resty.Client, r *resty.Response) error { +// // Now you have access to Client and Response instance +// // manipulate it as per your need +// +// return nil // if its success otherwise return error +// }) +// +func (c *Client) OnAfterResponse(m func(*Client, *Response) error) *Client { + c.afterResponse = append(c.afterResponse, m) + return c +} + +// SetPreRequestHook method sets the given pre-request function into resty client. +// It is called right before the request is fired. +// +// Note: Only one pre-request hook can be registered. Use `resty.OnBeforeRequest` for mutilple. +func (c *Client) SetPreRequestHook(h func(*Client, *Request) error) *Client { + if c.preReqHook != nil { + c.Log.Printf("Overwriting an existing pre-request hook: %s", functionName(h)) + } + c.preReqHook = h + return c +} + +// SetDebug method enables the debug mode on `go-resty` client. Client logs details of every request and response. +// For `Request` it logs information such as HTTP verb, Relative URL path, Host, Headers, Body if it has one. +// For `Response` it logs information such as Status, Response Time, Headers, Body if it has one. +// resty.SetDebug(true) +// +func (c *Client) SetDebug(d bool) *Client { + c.Debug = d + return c +} + +// SetDebugBodyLimit sets the maximum size for which the response body will be logged in debug mode. +// resty.SetDebugBodyLimit(1000000) +// +func (c *Client) SetDebugBodyLimit(sl int64) *Client { + c.debugBodySizeLimit = sl + return c +} + +// OnRequestLog method used to set request log callback into resty. Registered callback gets +// called before the resty actually logs the information. +func (c *Client) OnRequestLog(rl func(*RequestLog) error) *Client { + if c.requestLog != nil { + c.Log.Printf("Overwriting an existing on-request-log callback from=%s to=%s", functionName(c.requestLog), functionName(rl)) + } + c.requestLog = rl + return c +} + +// OnResponseLog method used to set response log callback into resty. Registered callback gets +// called before the resty actually logs the information. +func (c *Client) OnResponseLog(rl func(*ResponseLog) error) *Client { + if c.responseLog != nil { + c.Log.Printf("Overwriting an existing on-response-log callback from=%s to=%s", functionName(c.responseLog), functionName(rl)) + } + c.responseLog = rl + return c +} + +// SetDisableWarn method disables the warning message on `go-resty` client. +// For example: go-resty warns the user when BasicAuth used on HTTP mode. +// resty.SetDisableWarn(true) +// +func (c *Client) SetDisableWarn(d bool) *Client { + c.DisableWarn = d + return c +} + +// SetAllowGetMethodPayload method allows the GET method with payload on `go-resty` client. +// For example: go-resty allows the user sends request with a payload on HTTP GET method. +// resty.SetAllowGetMethodPayload(true) +// +func (c *Client) SetAllowGetMethodPayload(a bool) *Client { + c.AllowGetMethodPayload = a + return c +} + +// SetLogger method sets given writer for logging go-resty request and response details. +// Default is os.Stderr +// file, _ := os.OpenFile("/Users/jeeva/go-resty.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) +// +// resty.SetLogger(file) +// +func (c *Client) SetLogger(w io.Writer) *Client { + c.Log = getLogger(w) + return c +} + +// SetContentLength method enables the HTTP header `Content-Length` value for every request. +// By default go-resty won't set `Content-Length`. +// resty.SetContentLength(true) +// +// Also you have an option to enable for particular request. See `resty.R().SetContentLength` +// +func (c *Client) SetContentLength(l bool) *Client { + c.setContentLength = l + return c +} + +// SetTimeout method sets timeout for request raised from client. +// resty.SetTimeout(time.Duration(1 * time.Minute)) +// +func (c *Client) SetTimeout(timeout time.Duration) *Client { + c.httpClient.Timeout = timeout + return c +} + +// SetError method is to register the global or client common `Error` object into go-resty. +// It is used for automatic unmarshalling if response status code is greater than 399 and +// content type either JSON or XML. Can be pointer or non-pointer. +// resty.SetError(&Error{}) +// // OR +// resty.SetError(Error{}) +// +func (c *Client) SetError(err interface{}) *Client { + c.Error = typeOf(err) + return c +} + +// SetRedirectPolicy method sets the client redirect poilicy. go-resty provides ready to use +// redirect policies. Wanna create one for yourself refer `redirect.go`. +// +// resty.SetRedirectPolicy(FlexibleRedirectPolicy(20)) +// +// // Need multiple redirect policies together +// resty.SetRedirectPolicy(FlexibleRedirectPolicy(20), DomainCheckRedirectPolicy("host1.com", "host2.net")) +// +func (c *Client) SetRedirectPolicy(policies ...interface{}) *Client { + for _, p := range policies { + if _, ok := p.(RedirectPolicy); !ok { + c.Log.Printf("ERORR: %v does not implement resty.RedirectPolicy (missing Apply method)", + functionName(p)) + } + } + + c.httpClient.CheckRedirect = func(req *http.Request, via []*http.Request) error { + for _, p := range policies { + if err := p.(RedirectPolicy).Apply(req, via); err != nil { + return err + } + } + return nil // looks good, go ahead + } + + return c +} + +// SetRetryCount method enables retry on `go-resty` client and allows you +// to set no. of retry count. Resty uses a Backoff mechanism. +func (c *Client) SetRetryCount(count int) *Client { + c.RetryCount = count + return c +} + +// SetRetryWaitTime method sets default wait time to sleep before retrying +// request. +// Default is 100 milliseconds. +func (c *Client) SetRetryWaitTime(waitTime time.Duration) *Client { + c.RetryWaitTime = waitTime + return c +} + +// SetRetryMaxWaitTime method sets max wait time to sleep before retrying +// request. +// Default is 2 seconds. +func (c *Client) SetRetryMaxWaitTime(maxWaitTime time.Duration) *Client { + c.RetryMaxWaitTime = maxWaitTime + return c +} + +// AddRetryCondition method adds a retry condition function to array of functions +// that are checked to determine if the request is retried. The request will +// retry if any of the functions return true and error is nil. +func (c *Client) AddRetryCondition(condition RetryConditionFunc) *Client { + c.RetryConditions = append(c.RetryConditions, condition) + return c +} + +// SetHTTPMode method sets go-resty mode to 'http' +func (c *Client) SetHTTPMode() *Client { + return c.SetMode("http") +} + +// SetRESTMode method sets go-resty mode to 'rest' +func (c *Client) SetRESTMode() *Client { + return c.SetMode("rest") +} + +// SetMode method sets go-resty client mode to given value such as 'http' & 'rest'. +// 'rest': +// - No Redirect +// - Automatic response unmarshal if it is JSON or XML +// 'http': +// - Up to 10 Redirects +// - No automatic unmarshall. Response will be treated as `response.String()` +// +// If you want more redirects, use FlexibleRedirectPolicy +// resty.SetRedirectPolicy(FlexibleRedirectPolicy(20)) +// +func (c *Client) SetMode(mode string) *Client { + // HTTP + if mode == "http" { + c.isHTTPMode = true + c.SetRedirectPolicy(FlexibleRedirectPolicy(10)) + c.afterResponse = []func(*Client, *Response) error{ + responseLogger, + saveResponseIntoFile, + } + return c + } + + // RESTful + c.isHTTPMode = false + c.SetRedirectPolicy(NoRedirectPolicy()) + c.afterResponse = []func(*Client, *Response) error{ + responseLogger, + parseResponseBody, + saveResponseIntoFile, + } + return c +} + +// Mode method returns the current client mode. Typically its a "http" or "rest". +// Default is "rest" +func (c *Client) Mode() string { + if c.isHTTPMode { + return "http" + } + return "rest" +} + +// SetTLSClientConfig method sets TLSClientConfig for underling client Transport. +// +// Example: +// // One can set custom root-certificate. Refer: http://golang.org/pkg/crypto/tls/#example_Dial +// resty.SetTLSClientConfig(&tls.Config{ RootCAs: roots }) +// +// // or One can disable security check (https) +// resty.SetTLSClientConfig(&tls.Config{ InsecureSkipVerify: true }) +// Note: This method overwrites existing `TLSClientConfig`. +// +func (c *Client) SetTLSClientConfig(config *tls.Config) *Client { + transport, err := c.getTransport() + if err != nil { + c.Log.Printf("ERROR %v", err) + return c + } + transport.TLSClientConfig = config + return c +} + +// SetProxy method sets the Proxy URL and Port for resty client. +// resty.SetProxy("http://proxyserver:8888") +// +// Alternatives: At request level proxy, see `Request.SetProxy`. OR Without this `SetProxy` method, +// you can also set Proxy via environment variable. By default `Go` uses setting from `HTTP_PROXY`. +// +func (c *Client) SetProxy(proxyURL string) *Client { + transport, err := c.getTransport() + if err != nil { + c.Log.Printf("ERROR %v", err) + return c + } + + if pURL, err := url.Parse(proxyURL); err == nil { + c.proxyURL = pURL + transport.Proxy = http.ProxyURL(c.proxyURL) + } else { + c.Log.Printf("ERROR %v", err) + c.RemoveProxy() + } + return c +} + +// RemoveProxy method removes the proxy configuration from resty client +// resty.RemoveProxy() +// +func (c *Client) RemoveProxy() *Client { + transport, err := c.getTransport() + if err != nil { + c.Log.Printf("ERROR %v", err) + return c + } + c.proxyURL = nil + transport.Proxy = nil + return c +} + +// SetCertificates method helps to set client certificates into resty conveniently. +// +func (c *Client) SetCertificates(certs ...tls.Certificate) *Client { + config, err := c.getTLSConfig() + if err != nil { + c.Log.Printf("ERROR %v", err) + return c + } + config.Certificates = append(config.Certificates, certs...) + return c +} + +// SetRootCertificate method helps to add one or more root certificates into resty client +// resty.SetRootCertificate("/path/to/root/pemFile.pem") +// +func (c *Client) SetRootCertificate(pemFilePath string) *Client { + rootPemData, err := ioutil.ReadFile(pemFilePath) + if err != nil { + c.Log.Printf("ERROR %v", err) + return c + } + + config, err := c.getTLSConfig() + if err != nil { + c.Log.Printf("ERROR %v", err) + return c + } + if config.RootCAs == nil { + config.RootCAs = x509.NewCertPool() + } + + config.RootCAs.AppendCertsFromPEM(rootPemData) + + return c +} + +// SetOutputDirectory method sets output directory for saving HTTP response into file. +// If the output directory not exists then resty creates one. This setting is optional one, +// if you're planning using absoule path in `Request.SetOutput` and can used together. +// resty.SetOutputDirectory("/save/http/response/here") +// +func (c *Client) SetOutputDirectory(dirPath string) *Client { + c.outputDirectory = dirPath + return c +} + +// SetTransport method sets custom `*http.Transport` or any `http.RoundTripper` +// compatible interface implementation in the resty client. +// +// NOTE: +// +// - If transport is not type of `*http.Transport` then you may not be able to +// take advantage of some of the `resty` client settings. +// +// - It overwrites the resty client transport instance and it's configurations. +// +// transport := &http.Transport{ +// // somthing like Proxying to httptest.Server, etc... +// Proxy: func(req *http.Request) (*url.URL, error) { +// return url.Parse(server.URL) +// }, +// } +// +// resty.SetTransport(transport) +// +func (c *Client) SetTransport(transport http.RoundTripper) *Client { + if transport != nil { + c.httpClient.Transport = transport + } + return c +} + +// SetScheme method sets custom scheme in the resty client. It's way to override default. +// resty.SetScheme("http") +// +func (c *Client) SetScheme(scheme string) *Client { + if !IsStringEmpty(scheme) { + c.scheme = scheme + } + + return c +} + +// SetCloseConnection method sets variable `Close` in http request struct with the given +// value. More info: https://golang.org/src/net/http/request.go +func (c *Client) SetCloseConnection(close bool) *Client { + c.closeConnection = close + return c +} + +// SetDoNotParseResponse method instructs `Resty` not to parse the response body automatically. +// Resty exposes the raw response body as `io.ReadCloser`. Also do not forget to close the body, +// otherwise you might get into connection leaks, no connection reuse. +// +// Please Note: Response middlewares are not applicable, if you use this option. Basically you have +// taken over the control of response parsing from `Resty`. +func (c *Client) SetDoNotParseResponse(parse bool) *Client { + c.notParseResponse = parse + return c +} + +// SetLogPrefix method sets the Resty logger prefix value. +func (c *Client) SetLogPrefix(prefix string) *Client { + c.logPrefix = prefix + c.Log.SetPrefix(prefix) + return c +} + +// SetPathParams method sets multiple URL path key-value pairs at one go in the +// resty client instance. +// resty.SetPathParams(map[string]string{ +// "userId": "sample@sample.com", +// "subAccountId": "100002", +// }) +// +// Result: +// URL - /v1/users/{userId}/{subAccountId}/details +// Composed URL - /v1/users/sample@sample.com/100002/details +// It replace the value of the key while composing request URL. Also it can be +// overridden at request level Path Params options, see `Request.SetPathParams`. +func (c *Client) SetPathParams(params map[string]string) *Client { + for p, v := range params { + c.pathParams[p] = v + } + return c +} + +// SetJSONEscapeHTML method is to enable/disable the HTML escape on JSON marshal. +// +// NOTE: This option only applicable to standard JSON Marshaller. +func (c *Client) SetJSONEscapeHTML(b bool) *Client { + c.jsonEscapeHTML = b + return c +} + +// IsProxySet method returns the true if proxy is set on client otherwise false. +func (c *Client) IsProxySet() bool { + return c.proxyURL != nil +} + +// GetClient method returns the current http.Client used by the resty client. +func (c *Client) GetClient() *http.Client { + return c.httpClient +} + +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +// Client Unexported methods +//___________________________________ + +// executes the given `Request` object and returns response +func (c *Client) execute(req *Request) (*Response, error) { + defer releaseBuffer(req.bodyBuf) + // Apply Request middleware + var err error + + // user defined on before request methods + // to modify the *resty.Request object + for _, f := range c.udBeforeRequest { + if err = f(c, req); err != nil { + return nil, err + } + } + + // resty middlewares + for _, f := range c.beforeRequest { + if err = f(c, req); err != nil { + return nil, err + } + } + + // call pre-request if defined + if c.preReqHook != nil { + if err = c.preReqHook(c, req); err != nil { + return nil, err + } + } + + if hostHeader := req.Header.Get("Host"); hostHeader != "" { + req.RawRequest.Host = hostHeader + } + + req.Time = time.Now() + resp, err := c.httpClient.Do(req.RawRequest) + + response := &Response{ + Request: req, + RawResponse: resp, + receivedAt: time.Now(), + } + + if err != nil || req.notParseResponse || c.notParseResponse { + return response, err + } + + if !req.isSaveResponse { + defer closeq(resp.Body) + body := resp.Body + + // GitHub #142 & #187 + if strings.EqualFold(resp.Header.Get(hdrContentEncodingKey), "gzip") && resp.ContentLength != 0 { + if _, ok := body.(*gzip.Reader); !ok { + body, err = gzip.NewReader(body) + if err != nil { + return response, err + } + defer closeq(body) + } + } + + if response.body, err = ioutil.ReadAll(body); err != nil { + return response, err + } + + response.size = int64(len(response.body)) + } + + // Apply Response middleware + for _, f := range c.afterResponse { + if err = f(c, response); err != nil { + break + } + } + + return response, err +} + +// enables a log prefix +func (c *Client) enableLogPrefix() { + c.Log.SetFlags(log.LstdFlags) + c.Log.SetPrefix(c.logPrefix) +} + +// disables a log prefix +func (c *Client) disableLogPrefix() { + c.Log.SetFlags(0) + c.Log.SetPrefix("") +} + +// getting TLS client config if not exists then create one +func (c *Client) getTLSConfig() (*tls.Config, error) { + transport, err := c.getTransport() + if err != nil { + return nil, err + } + if transport.TLSClientConfig == nil { + transport.TLSClientConfig = &tls.Config{} + } + return transport.TLSClientConfig, nil +} + +// returns `*http.Transport` currently in use or error +// in case currently used `transport` is not an `*http.Transport` +func (c *Client) getTransport() (*http.Transport, error) { + if c.httpClient.Transport == nil { + c.SetTransport(new(http.Transport)) + } + + if transport, ok := c.httpClient.Transport.(*http.Transport); ok { + return transport, nil + } + return nil, errors.New("current transport is not an *http.Transport instance") +} + +// +// File +// + +// File represent file information for multipart request +type File struct { + Name string + ParamName string + io.Reader +} + +// String returns string value of current file details +func (f *File) String() string { + return fmt.Sprintf("ParamName: %v; FileName: %v", f.ParamName, f.Name) +} + +// multipartField represent custom data part for multipart request +type multipartField struct { + Param string + FileName string + ContentType string + io.Reader +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/default.go b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/default.go new file mode 100644 index 0000000000000000000000000000000000000000..4fc7b2dc4fc6d26c9bb943c40cc62abec21f5b46 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/default.go @@ -0,0 +1,328 @@ +// Copyright (c) 2015-2018 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// resty source code and usage is governed by a MIT style +// license that can be found in the LICENSE file. + +package resty + +import ( + "crypto/tls" + "encoding/json" + "io" + "math" + "net/http" + "net/http/cookiejar" + "net/url" + "os" + "time" + + "golang.org/x/net/publicsuffix" +) + +// DefaultClient of resty +var DefaultClient *Client + +// New method creates a new go-resty client. +func New() *Client { + cookieJar, _ := cookiejar.New(&cookiejar.Options{PublicSuffixList: publicsuffix.List}) + return createClient(&http.Client{Jar: cookieJar}) +} + +// NewWithClient method create a new go-resty client with given `http.Client`. +func NewWithClient(hc *http.Client) *Client { + return createClient(hc) +} + +// R creates a new resty request object, it is used form a HTTP/RESTful request +// such as GET, POST, PUT, DELETE, HEAD, PATCH and OPTIONS. +func R() *Request { + return DefaultClient.R() +} + +// NewRequest is an alias for R(). Creates a new resty request object, it is used form a HTTP/RESTful request +// such as GET, POST, PUT, DELETE, HEAD, PATCH and OPTIONS. +func NewRequest() *Request { + return R() +} + +// SetHostURL sets Host URL. See `Client.SetHostURL for more information. +func SetHostURL(url string) *Client { + return DefaultClient.SetHostURL(url) +} + +// SetHeader sets single header. See `Client.SetHeader` for more information. +func SetHeader(header, value string) *Client { + return DefaultClient.SetHeader(header, value) +} + +// SetHeaders sets multiple headers. See `Client.SetHeaders` for more information. +func SetHeaders(headers map[string]string) *Client { + return DefaultClient.SetHeaders(headers) +} + +// SetCookieJar sets custom http.CookieJar. See `Client.SetCookieJar` for more information. +func SetCookieJar(jar http.CookieJar) *Client { + return DefaultClient.SetCookieJar(jar) +} + +// SetCookie sets single cookie object. See `Client.SetCookie` for more information. +func SetCookie(hc *http.Cookie) *Client { + return DefaultClient.SetCookie(hc) +} + +// SetCookies sets multiple cookie object. See `Client.SetCookies` for more information. +func SetCookies(cs []*http.Cookie) *Client { + return DefaultClient.SetCookies(cs) +} + +// SetQueryParam method sets single parameter and its value. See `Client.SetQueryParam` for more information. +func SetQueryParam(param, value string) *Client { + return DefaultClient.SetQueryParam(param, value) +} + +// SetQueryParams method sets multiple parameters and its value. See `Client.SetQueryParams` for more information. +func SetQueryParams(params map[string]string) *Client { + return DefaultClient.SetQueryParams(params) +} + +// SetFormData method sets Form parameters and its values. See `Client.SetFormData` for more information. +func SetFormData(data map[string]string) *Client { + return DefaultClient.SetFormData(data) +} + +// SetBasicAuth method sets the basic authentication header. See `Client.SetBasicAuth` for more information. +func SetBasicAuth(username, password string) *Client { + return DefaultClient.SetBasicAuth(username, password) +} + +// SetAuthToken method sets bearer auth token header. See `Client.SetAuthToken` for more information. +func SetAuthToken(token string) *Client { + return DefaultClient.SetAuthToken(token) +} + +// OnBeforeRequest method sets request middleware. See `Client.OnBeforeRequest` for more information. +func OnBeforeRequest(m func(*Client, *Request) error) *Client { + return DefaultClient.OnBeforeRequest(m) +} + +// OnAfterResponse method sets response middleware. See `Client.OnAfterResponse` for more information. +func OnAfterResponse(m func(*Client, *Response) error) *Client { + return DefaultClient.OnAfterResponse(m) +} + +// SetPreRequestHook method sets the pre-request hook. See `Client.SetPreRequestHook` for more information. +func SetPreRequestHook(h func(*Client, *Request) error) *Client { + return DefaultClient.SetPreRequestHook(h) +} + +// SetDebug method enables the debug mode. See `Client.SetDebug` for more information. +func SetDebug(d bool) *Client { + return DefaultClient.SetDebug(d) +} + +// SetDebugBodyLimit method sets the response body limit for debug mode. See `Client.SetDebugBodyLimit` for more information. +func SetDebugBodyLimit(sl int64) *Client { + return DefaultClient.SetDebugBodyLimit(sl) +} + +// SetAllowGetMethodPayload method allows the GET method with payload. See `Client.SetAllowGetMethodPayload` for more information. +func SetAllowGetMethodPayload(a bool) *Client { + return DefaultClient.SetAllowGetMethodPayload(a) +} + +// SetRetryCount method sets the retry count. See `Client.SetRetryCount` for more information. +func SetRetryCount(count int) *Client { + return DefaultClient.SetRetryCount(count) +} + +// SetRetryWaitTime method sets the retry wait time. See `Client.SetRetryWaitTime` for more information. +func SetRetryWaitTime(waitTime time.Duration) *Client { + return DefaultClient.SetRetryWaitTime(waitTime) +} + +// SetRetryMaxWaitTime method sets the retry max wait time. See `Client.SetRetryMaxWaitTime` for more information. +func SetRetryMaxWaitTime(maxWaitTime time.Duration) *Client { + return DefaultClient.SetRetryMaxWaitTime(maxWaitTime) +} + +// AddRetryCondition method appends check function for retry. See `Client.AddRetryCondition` for more information. +func AddRetryCondition(condition RetryConditionFunc) *Client { + return DefaultClient.AddRetryCondition(condition) +} + +// SetDisableWarn method disables warning comes from `go-resty` client. See `Client.SetDisableWarn` for more information. +func SetDisableWarn(d bool) *Client { + return DefaultClient.SetDisableWarn(d) +} + +// SetLogger method sets given writer for logging. See `Client.SetLogger` for more information. +func SetLogger(w io.Writer) *Client { + return DefaultClient.SetLogger(w) +} + +// SetContentLength method enables `Content-Length` value. See `Client.SetContentLength` for more information. +func SetContentLength(l bool) *Client { + return DefaultClient.SetContentLength(l) +} + +// SetError method is to register the global or client common `Error` object. See `Client.SetError` for more information. +func SetError(err interface{}) *Client { + return DefaultClient.SetError(err) +} + +// SetRedirectPolicy method sets the client redirect poilicy. See `Client.SetRedirectPolicy` for more information. +func SetRedirectPolicy(policies ...interface{}) *Client { + return DefaultClient.SetRedirectPolicy(policies...) +} + +// SetHTTPMode method sets go-resty mode into HTTP. See `Client.SetMode` for more information. +func SetHTTPMode() *Client { + return DefaultClient.SetHTTPMode() +} + +// SetRESTMode method sets go-resty mode into RESTful. See `Client.SetMode` for more information. +func SetRESTMode() *Client { + return DefaultClient.SetRESTMode() +} + +// Mode method returns the current client mode. See `Client.Mode` for more information. +func Mode() string { + return DefaultClient.Mode() +} + +// SetTLSClientConfig method sets TLSClientConfig for underling client Transport. See `Client.SetTLSClientConfig` for more information. +func SetTLSClientConfig(config *tls.Config) *Client { + return DefaultClient.SetTLSClientConfig(config) +} + +// SetTimeout method sets timeout for request. See `Client.SetTimeout` for more information. +func SetTimeout(timeout time.Duration) *Client { + return DefaultClient.SetTimeout(timeout) +} + +// SetProxy method sets Proxy for request. See `Client.SetProxy` for more information. +func SetProxy(proxyURL string) *Client { + return DefaultClient.SetProxy(proxyURL) +} + +// RemoveProxy method removes the proxy configuration. See `Client.RemoveProxy` for more information. +func RemoveProxy() *Client { + return DefaultClient.RemoveProxy() +} + +// SetCertificates method helps to set client certificates into resty conveniently. +// See `Client.SetCertificates` for more information and example. +func SetCertificates(certs ...tls.Certificate) *Client { + return DefaultClient.SetCertificates(certs...) +} + +// SetRootCertificate method helps to add one or more root certificates into resty client. +// See `Client.SetRootCertificate` for more information. +func SetRootCertificate(pemFilePath string) *Client { + return DefaultClient.SetRootCertificate(pemFilePath) +} + +// SetOutputDirectory method sets output directory. See `Client.SetOutputDirectory` for more information. +func SetOutputDirectory(dirPath string) *Client { + return DefaultClient.SetOutputDirectory(dirPath) +} + +// SetTransport method sets custom `*http.Transport` or any `http.RoundTripper` +// compatible interface implementation in the resty client. +// See `Client.SetTransport` for more information. +func SetTransport(transport http.RoundTripper) *Client { + return DefaultClient.SetTransport(transport) +} + +// SetScheme method sets custom scheme in the resty client. +// See `Client.SetScheme` for more information. +func SetScheme(scheme string) *Client { + return DefaultClient.SetScheme(scheme) +} + +// SetCloseConnection method sets close connection value in the resty client. +// See `Client.SetCloseConnection` for more information. +func SetCloseConnection(close bool) *Client { + return DefaultClient.SetCloseConnection(close) +} + +// SetDoNotParseResponse method instructs `Resty` not to parse the response body automatically. +// See `Client.SetDoNotParseResponse` for more information. +func SetDoNotParseResponse(parse bool) *Client { + return DefaultClient.SetDoNotParseResponse(parse) +} + +// SetPathParams method sets the Request path parameter key-value pairs. See +// `Client.SetPathParams` for more information. +func SetPathParams(params map[string]string) *Client { + return DefaultClient.SetPathParams(params) +} + +// IsProxySet method returns the true if proxy is set on client otherwise false. +// See `Client.IsProxySet` for more information. +func IsProxySet() bool { + return DefaultClient.IsProxySet() +} + +// GetClient method returns the current `http.Client` used by the default resty client. +func GetClient() *http.Client { + return DefaultClient.httpClient +} + +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +// Unexported methods +//___________________________________ + +func createClient(hc *http.Client) *Client { + c := &Client{ + HostURL: "", + QueryParam: url.Values{}, + FormData: url.Values{}, + Header: http.Header{}, + UserInfo: nil, + Token: "", + Cookies: make([]*http.Cookie, 0), + Debug: false, + Log: getLogger(os.Stderr), + RetryCount: 0, + RetryWaitTime: defaultWaitTime, + RetryMaxWaitTime: defaultMaxWaitTime, + JSONMarshal: json.Marshal, + JSONUnmarshal: json.Unmarshal, + jsonEscapeHTML: true, + httpClient: hc, + debugBodySizeLimit: math.MaxInt32, + pathParams: make(map[string]string), + } + + // Log Prefix + c.SetLogPrefix("RESTY ") + + // Default redirect policy + c.SetRedirectPolicy(NoRedirectPolicy()) + + // default before request middlewares + c.beforeRequest = []func(*Client, *Request) error{ + parseRequestURL, + parseRequestHeader, + parseRequestBody, + createHTTPRequest, + addCredentials, + requestLogger, + } + + // user defined request middlewares + c.udBeforeRequest = []func(*Client, *Request) error{} + + // default after response middlewares + c.afterResponse = []func(*Client, *Response) error{ + responseLogger, + parseResponseBody, + saveResponseIntoFile, + } + + return c +} + +func init() { + DefaultClient = New() +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/go.mod b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/go.mod new file mode 100644 index 0000000000000000000000000000000000000000..b5c893f1c201e6ab9bcb5adc28b722762dcff2bb --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/go.mod @@ -0,0 +1,5 @@ +module gopkg.in/resty.v1 + +go 1.15 + +require golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1 diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/middleware.go b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/middleware.go new file mode 100644 index 0000000000000000000000000000000000000000..619d35e0bc484def0de86d28a5f0ac0854d504ce --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/middleware.go @@ -0,0 +1,469 @@ +// Copyright (c) 2015-2018 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// resty source code and usage is governed by a MIT style +// license that can be found in the LICENSE file. + +package resty + +import ( + "bytes" + "encoding/xml" + "errors" + "fmt" + "io" + "mime/multipart" + "net/http" + "net/url" + "os" + "path/filepath" + "reflect" + "strings" + "time" +) + +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +// Request Middleware(s) +//___________________________________ + +func parseRequestURL(c *Client, r *Request) error { + // GitHub #103 Path Params + if len(r.pathParams) > 0 { + for p, v := range r.pathParams { + r.URL = strings.Replace(r.URL, "{"+p+"}", url.PathEscape(v), -1) + } + } + if len(c.pathParams) > 0 { + for p, v := range c.pathParams { + r.URL = strings.Replace(r.URL, "{"+p+"}", url.PathEscape(v), -1) + } + } + + // Parsing request URL + reqURL, err := url.Parse(r.URL) + if err != nil { + return err + } + + // If Request.URL is relative path then added c.HostURL into + // the request URL otherwise Request.URL will be used as-is + if !reqURL.IsAbs() { + r.URL = reqURL.String() + if len(r.URL) > 0 && r.URL[0] != '/' { + r.URL = "/" + r.URL + } + + reqURL, err = url.Parse(c.HostURL + r.URL) + if err != nil { + return err + } + } + + // Adding Query Param + query := make(url.Values) + for k, v := range c.QueryParam { + for _, iv := range v { + query.Add(k, iv) + } + } + + for k, v := range r.QueryParam { + // remove query param from client level by key + // since overrides happens for that key in the request + query.Del(k) + + for _, iv := range v { + query.Add(k, iv) + } + } + + // GitHub #123 Preserve query string order partially. + // Since not feasible in `SetQuery*` resty methods, because + // standard package `url.Encode(...)` sorts the query params + // alphabetically + if len(query) > 0 { + if IsStringEmpty(reqURL.RawQuery) { + reqURL.RawQuery = query.Encode() + } else { + reqURL.RawQuery = reqURL.RawQuery + "&" + query.Encode() + } + } + + r.URL = reqURL.String() + + return nil +} + +func parseRequestHeader(c *Client, r *Request) error { + hdr := make(http.Header) + for k := range c.Header { + hdr[k] = append(hdr[k], c.Header[k]...) + } + + for k := range r.Header { + hdr.Del(k) + hdr[k] = append(hdr[k], r.Header[k]...) + } + + if IsStringEmpty(hdr.Get(hdrUserAgentKey)) { + hdr.Set(hdrUserAgentKey, fmt.Sprintf(hdrUserAgentValue, Version)) + } + + ct := hdr.Get(hdrContentTypeKey) + if IsStringEmpty(hdr.Get(hdrAcceptKey)) && !IsStringEmpty(ct) && + (IsJSONType(ct) || IsXMLType(ct)) { + hdr.Set(hdrAcceptKey, hdr.Get(hdrContentTypeKey)) + } + + r.Header = hdr + + return nil +} + +func parseRequestBody(c *Client, r *Request) (err error) { + if isPayloadSupported(r.Method, c.AllowGetMethodPayload) { + // Handling Multipart + if r.isMultiPart && !(r.Method == MethodPatch) { + if err = handleMultipart(c, r); err != nil { + return + } + + goto CL + } + + // Handling Form Data + if len(c.FormData) > 0 || len(r.FormData) > 0 { + handleFormData(c, r) + + goto CL + } + + // Handling Request body + if r.Body != nil { + handleContentType(c, r) + + if err = handleRequestBody(c, r); err != nil { + return + } + } + } + +CL: + // by default resty won't set content length, you can if you want to :) + if (c.setContentLength || r.setContentLength) && r.bodyBuf != nil { + r.Header.Set(hdrContentLengthKey, fmt.Sprintf("%d", r.bodyBuf.Len())) + } + + return +} + +func createHTTPRequest(c *Client, r *Request) (err error) { + if r.bodyBuf == nil { + if reader, ok := r.Body.(io.Reader); ok { + r.RawRequest, err = http.NewRequest(r.Method, r.URL, reader) + } else { + r.RawRequest, err = http.NewRequest(r.Method, r.URL, nil) + } + } else { + r.RawRequest, err = http.NewRequest(r.Method, r.URL, r.bodyBuf) + } + + if err != nil { + return + } + + // Assign close connection option + r.RawRequest.Close = c.closeConnection + + // Add headers into http request + r.RawRequest.Header = r.Header + + // Add cookies into http request + for _, cookie := range c.Cookies { + r.RawRequest.AddCookie(cookie) + } + + // it's for non-http scheme option + if r.RawRequest.URL != nil && r.RawRequest.URL.Scheme == "" { + r.RawRequest.URL.Scheme = c.scheme + r.RawRequest.URL.Host = r.URL + } + + // Use context if it was specified + r.addContextIfAvailable() + + return +} + +func addCredentials(c *Client, r *Request) error { + var isBasicAuth bool + // Basic Auth + if r.UserInfo != nil { // takes precedence + r.RawRequest.SetBasicAuth(r.UserInfo.Username, r.UserInfo.Password) + isBasicAuth = true + } else if c.UserInfo != nil { + r.RawRequest.SetBasicAuth(c.UserInfo.Username, c.UserInfo.Password) + isBasicAuth = true + } + + if !c.DisableWarn { + if isBasicAuth && !strings.HasPrefix(r.URL, "https") { + c.Log.Println("WARNING - Using Basic Auth in HTTP mode is not secure.") + } + } + + // Token Auth + if !IsStringEmpty(r.Token) { // takes precedence + r.RawRequest.Header.Set(hdrAuthorizationKey, "Bearer "+r.Token) + } else if !IsStringEmpty(c.Token) { + r.RawRequest.Header.Set(hdrAuthorizationKey, "Bearer "+c.Token) + } + + return nil +} + +func requestLogger(c *Client, r *Request) error { + if c.Debug { + rr := r.RawRequest + rl := &RequestLog{Header: copyHeaders(rr.Header), Body: r.fmtBodyString()} + if c.requestLog != nil { + if err := c.requestLog(rl); err != nil { + return err + } + } + + reqLog := "\n---------------------- REQUEST LOG -----------------------\n" + + fmt.Sprintf("%s %s %s\n", r.Method, rr.URL.RequestURI(), rr.Proto) + + fmt.Sprintf("HOST : %s\n", rr.URL.Host) + + fmt.Sprintf("HEADERS:\n") + + composeHeaders(rl.Header) + "\n" + + fmt.Sprintf("BODY :\n%v\n", rl.Body) + + "----------------------------------------------------------\n" + + c.Log.Print(reqLog) + } + + return nil +} + +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +// Response Middleware(s) +//___________________________________ + +func responseLogger(c *Client, res *Response) error { + if c.Debug { + rl := &ResponseLog{Header: copyHeaders(res.Header()), Body: res.fmtBodyString(c.debugBodySizeLimit)} + if c.responseLog != nil { + if err := c.responseLog(rl); err != nil { + return err + } + } + + resLog := "\n---------------------- RESPONSE LOG -----------------------\n" + + fmt.Sprintf("STATUS : %s\n", res.Status()) + + fmt.Sprintf("RECEIVED AT : %v\n", res.ReceivedAt().Format(time.RFC3339Nano)) + + fmt.Sprintf("RESPONSE TIME : %v\n", res.Time()) + + "HEADERS:\n" + + composeHeaders(rl.Header) + "\n" + if res.Request.isSaveResponse { + resLog += fmt.Sprintf("BODY :\n***** RESPONSE WRITTEN INTO FILE *****\n") + } else { + resLog += fmt.Sprintf("BODY :\n%v\n", rl.Body) + } + resLog += "----------------------------------------------------------\n" + + c.Log.Print(resLog) + } + + return nil +} + +func parseResponseBody(c *Client, res *Response) (err error) { + if res.StatusCode() == http.StatusNoContent { + return + } + // Handles only JSON or XML content type + ct := firstNonEmpty(res.Header().Get(hdrContentTypeKey), res.Request.fallbackContentType) + if IsJSONType(ct) || IsXMLType(ct) { + // HTTP status code > 199 and < 300, considered as Result + if res.IsSuccess() { + if res.Request.Result != nil { + err = Unmarshalc(c, ct, res.body, res.Request.Result) + return + } + } + + // HTTP status code > 399, considered as Error + if res.IsError() { + // global error interface + if res.Request.Error == nil && c.Error != nil { + res.Request.Error = reflect.New(c.Error).Interface() + } + + if res.Request.Error != nil { + err = Unmarshalc(c, ct, res.body, res.Request.Error) + } + } + } + + return +} + +func handleMultipart(c *Client, r *Request) (err error) { + r.bodyBuf = acquireBuffer() + w := multipart.NewWriter(r.bodyBuf) + + for k, v := range c.FormData { + for _, iv := range v { + if err = w.WriteField(k, iv); err != nil { + return err + } + } + } + + for k, v := range r.FormData { + for _, iv := range v { + if strings.HasPrefix(k, "@") { // file + err = addFile(w, k[1:], iv) + if err != nil { + return + } + } else { // form value + if err = w.WriteField(k, iv); err != nil { + return err + } + } + } + } + + // #21 - adding io.Reader support + if len(r.multipartFiles) > 0 { + for _, f := range r.multipartFiles { + err = addFileReader(w, f) + if err != nil { + return + } + } + } + + // GitHub #130 adding multipart field support with content type + if len(r.multipartFields) > 0 { + for _, mf := range r.multipartFields { + if err = addMultipartFormField(w, mf); err != nil { + return + } + } + } + + r.Header.Set(hdrContentTypeKey, w.FormDataContentType()) + err = w.Close() + + return +} + +func handleFormData(c *Client, r *Request) { + formData := url.Values{} + + for k, v := range c.FormData { + for _, iv := range v { + formData.Add(k, iv) + } + } + + for k, v := range r.FormData { + // remove form data field from client level by key + // since overrides happens for that key in the request + formData.Del(k) + + for _, iv := range v { + formData.Add(k, iv) + } + } + + r.bodyBuf = bytes.NewBuffer([]byte(formData.Encode())) + r.Header.Set(hdrContentTypeKey, formContentType) + r.isFormData = true +} + +func handleContentType(c *Client, r *Request) { + contentType := r.Header.Get(hdrContentTypeKey) + if IsStringEmpty(contentType) { + contentType = DetectContentType(r.Body) + r.Header.Set(hdrContentTypeKey, contentType) + } +} + +func handleRequestBody(c *Client, r *Request) (err error) { + var bodyBytes []byte + contentType := r.Header.Get(hdrContentTypeKey) + kind := kindOf(r.Body) + r.bodyBuf = nil + + if reader, ok := r.Body.(io.Reader); ok { + if c.setContentLength || r.setContentLength { // keep backward compability + r.bodyBuf = acquireBuffer() + _, err = r.bodyBuf.ReadFrom(reader) + r.Body = nil + } else { + // Otherwise buffer less processing for `io.Reader`, sounds good. + return + } + } else if b, ok := r.Body.([]byte); ok { + bodyBytes = b + } else if s, ok := r.Body.(string); ok { + bodyBytes = []byte(s) + } else if IsJSONType(contentType) && + (kind == reflect.Struct || kind == reflect.Map || kind == reflect.Slice) { + bodyBytes, err = jsonMarshal(c, r, r.Body) + } else if IsXMLType(contentType) && (kind == reflect.Struct) { + bodyBytes, err = xml.Marshal(r.Body) + } + + if bodyBytes == nil && r.bodyBuf == nil { + err = errors.New("unsupported 'Body' type/value") + } + + // if any errors during body bytes handling, return it + if err != nil { + return + } + + // []byte into Buffer + if bodyBytes != nil && r.bodyBuf == nil { + r.bodyBuf = acquireBuffer() + _, _ = r.bodyBuf.Write(bodyBytes) + } + + return +} + +func saveResponseIntoFile(c *Client, res *Response) error { + if res.Request.isSaveResponse { + file := "" + + if len(c.outputDirectory) > 0 && !filepath.IsAbs(res.Request.outputFile) { + file += c.outputDirectory + string(filepath.Separator) + } + + file = filepath.Clean(file + res.Request.outputFile) + if err := createDirectory(filepath.Dir(file)); err != nil { + return err + } + + outFile, err := os.Create(file) + if err != nil { + return err + } + defer closeq(outFile) + + // io.Copy reads maximum 32kb size, it is perfect for large file download too + defer closeq(res.RawResponse.Body) + + written, err := io.Copy(outFile, res.RawResponse.Body) + if err != nil { + return err + } + + res.size = written + } + + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/redirect.go b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/redirect.go new file mode 100644 index 0000000000000000000000000000000000000000..ac362cc444ee1cc11991ed69081d7d6786523066 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/redirect.go @@ -0,0 +1,99 @@ +// Copyright (c) 2015-2018 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// resty source code and usage is governed by a MIT style +// license that can be found in the LICENSE file. + +package resty + +import ( + "errors" + "fmt" + "net" + "net/http" + "strings" +) + +type ( + // RedirectPolicy to regulate the redirects in the resty client. + // Objects implementing the RedirectPolicy interface can be registered as + // + // Apply function should return nil to continue the redirect jounery, otherwise + // return error to stop the redirect. + RedirectPolicy interface { + Apply(req *http.Request, via []*http.Request) error + } + + // The RedirectPolicyFunc type is an adapter to allow the use of ordinary functions as RedirectPolicy. + // If f is a function with the appropriate signature, RedirectPolicyFunc(f) is a RedirectPolicy object that calls f. + RedirectPolicyFunc func(*http.Request, []*http.Request) error +) + +// Apply calls f(req, via). +func (f RedirectPolicyFunc) Apply(req *http.Request, via []*http.Request) error { + return f(req, via) +} + +// NoRedirectPolicy is used to disable redirects in the HTTP client +// resty.SetRedirectPolicy(NoRedirectPolicy()) +func NoRedirectPolicy() RedirectPolicy { + return RedirectPolicyFunc(func(req *http.Request, via []*http.Request) error { + return errors.New("auto redirect is disabled") + }) +} + +// FlexibleRedirectPolicy is convenient method to create No of redirect policy for HTTP client. +// resty.SetRedirectPolicy(FlexibleRedirectPolicy(20)) +func FlexibleRedirectPolicy(noOfRedirect int) RedirectPolicy { + return RedirectPolicyFunc(func(req *http.Request, via []*http.Request) error { + if len(via) >= noOfRedirect { + return fmt.Errorf("stopped after %d redirects", noOfRedirect) + } + + checkHostAndAddHeaders(req, via[0]) + + return nil + }) +} + +// DomainCheckRedirectPolicy is convenient method to define domain name redirect rule in resty client. +// Redirect is allowed for only mentioned host in the policy. +// resty.SetRedirectPolicy(DomainCheckRedirectPolicy("host1.com", "host2.org", "host3.net")) +func DomainCheckRedirectPolicy(hostnames ...string) RedirectPolicy { + hosts := make(map[string]bool) + for _, h := range hostnames { + hosts[strings.ToLower(h)] = true + } + + fn := RedirectPolicyFunc(func(req *http.Request, via []*http.Request) error { + if ok := hosts[getHostname(req.URL.Host)]; !ok { + return errors.New("redirect is not allowed as per DomainCheckRedirectPolicy") + } + + return nil + }) + + return fn +} + +func getHostname(host string) (hostname string) { + if strings.Index(host, ":") > 0 { + host, _, _ = net.SplitHostPort(host) + } + hostname = strings.ToLower(host) + return +} + +// By default Golang will not redirect request headers +// after go throughing various discussion comments from thread +// https://github.com/golang/go/issues/4800 +// go-resty will add all the headers during a redirect for the same host +func checkHostAndAddHeaders(cur *http.Request, pre *http.Request) { + curHostname := getHostname(cur.URL.Host) + preHostname := getHostname(pre.URL.Host) + if strings.EqualFold(curHostname, preHostname) { + for key, val := range pre.Header { + cur.Header[key] = val + } + } else { // only library User-Agent header is added + cur.Header.Set(hdrUserAgentKey, fmt.Sprintf(hdrUserAgentValue, Version)) + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/request.go b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/request.go new file mode 100644 index 0000000000000000000000000000000000000000..3e070438926fbe0965fe7cc9f1c36042661a0033 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/request.go @@ -0,0 +1,568 @@ +// Copyright (c) 2015-2018 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// resty source code and usage is governed by a MIT style +// license that can be found in the LICENSE file. + +package resty + +import ( + "encoding/base64" + "encoding/json" + "encoding/xml" + "fmt" + "io" + "net" + "net/url" + "reflect" + "strings" +) + +// SRVRecord holds the data to query the SRV record for the following service +type SRVRecord struct { + Service string + Domain string +} + +// SetHeader method is to set a single header field and its value in the current request. +// Example: To set `Content-Type` and `Accept` as `application/json`. +// resty.R(). +// SetHeader("Content-Type", "application/json"). +// SetHeader("Accept", "application/json") +// +// Also you can override header value, which was set at client instance level. +// +func (r *Request) SetHeader(header, value string) *Request { + r.Header.Set(header, value) + return r +} + +// SetHeaders method sets multiple headers field and its values at one go in the current request. +// Example: To set `Content-Type` and `Accept` as `application/json` +// +// resty.R(). +// SetHeaders(map[string]string{ +// "Content-Type": "application/json", +// "Accept": "application/json", +// }) +// Also you can override header value, which was set at client instance level. +// +func (r *Request) SetHeaders(headers map[string]string) *Request { + for h, v := range headers { + r.SetHeader(h, v) + } + + return r +} + +// SetQueryParam method sets single parameter and its value in the current request. +// It will be formed as query string for the request. +// Example: `search=kitchen%20papers&size=large` in the URL after `?` mark. +// resty.R(). +// SetQueryParam("search", "kitchen papers"). +// SetQueryParam("size", "large") +// Also you can override query params value, which was set at client instance level +// +func (r *Request) SetQueryParam(param, value string) *Request { + r.QueryParam.Set(param, value) + return r +} + +// SetQueryParams method sets multiple parameters and its values at one go in the current request. +// It will be formed as query string for the request. +// Example: `search=kitchen%20papers&size=large` in the URL after `?` mark. +// resty.R(). +// SetQueryParams(map[string]string{ +// "search": "kitchen papers", +// "size": "large", +// }) +// Also you can override query params value, which was set at client instance level +// +func (r *Request) SetQueryParams(params map[string]string) *Request { + for p, v := range params { + r.SetQueryParam(p, v) + } + + return r +} + +// SetMultiValueQueryParams method appends multiple parameters with multi-value +// at one go in the current request. It will be formed as query string for the request. +// Example: `status=pending&status=approved&status=open` in the URL after `?` mark. +// resty.R(). +// SetMultiValueQueryParams(url.Values{ +// "status": []string{"pending", "approved", "open"}, +// }) +// Also you can override query params value, which was set at client instance level +// +func (r *Request) SetMultiValueQueryParams(params url.Values) *Request { + for p, v := range params { + for _, pv := range v { + r.QueryParam.Add(p, pv) + } + } + + return r +} + +// SetQueryString method provides ability to use string as an input to set URL query string for the request. +// +// Using String as an input +// resty.R(). +// SetQueryString("productId=232&template=fresh-sample&cat=resty&source=google&kw=buy a lot more") +// +func (r *Request) SetQueryString(query string) *Request { + params, err := url.ParseQuery(strings.TrimSpace(query)) + if err == nil { + for p, v := range params { + for _, pv := range v { + r.QueryParam.Add(p, pv) + } + } + } else { + r.client.Log.Printf("ERROR %v", err) + } + return r +} + +// SetFormData method sets Form parameters and their values in the current request. +// It's applicable only HTTP method `POST` and `PUT` and requests content type would be set as +// `application/x-www-form-urlencoded`. +// resty.R(). +// SetFormData(map[string]string{ +// "access_token": "BC594900-518B-4F7E-AC75-BD37F019E08F", +// "user_id": "3455454545", +// }) +// Also you can override form data value, which was set at client instance level +// +func (r *Request) SetFormData(data map[string]string) *Request { + for k, v := range data { + r.FormData.Set(k, v) + } + + return r +} + +// SetMultiValueFormData method appends multiple form parameters with multi-value +// at one go in the current request. +// resty.R(). +// SetMultiValueFormData(url.Values{ +// "search_criteria": []string{"book", "glass", "pencil"}, +// }) +// Also you can override form data value, which was set at client instance level +// +func (r *Request) SetMultiValueFormData(params url.Values) *Request { + for k, v := range params { + for _, kv := range v { + r.FormData.Add(k, kv) + } + } + + return r +} + +// SetBody method sets the request body for the request. It supports various realtime needs as easy. +// We can say its quite handy or powerful. Supported request body data types is `string`, +// `[]byte`, `struct`, `map`, `slice` and `io.Reader`. Body value can be pointer or non-pointer. +// Automatic marshalling for JSON and XML content type, if it is `struct`, `map`, or `slice`. +// +// Note: `io.Reader` is processed as bufferless mode while sending request. +// +// Example: +// +// Struct as a body input, based on content type, it will be marshalled. +// resty.R(). +// SetBody(User{ +// Username: "jeeva@myjeeva.com", +// Password: "", +// }) +// +// Map as a body input, based on content type, it will be marshalled. +// resty.R(). +// SetBody(map[string]interface{}{ +// "username": "jeeva@myjeeva.com", +// "password": "", +// "address": &Address{ +// Address1: "1111 This is my street", +// Address2: "Apt 201", +// City: "My City", +// State: "My State", +// ZipCode: 00000, +// }, +// }) +// +// String as a body input. Suitable for any need as a string input. +// resty.R(). +// SetBody(`{ +// "username": "jeeva@getrightcare.com", +// "password": "admin" +// }`) +// +// []byte as a body input. Suitable for raw request such as file upload, serialize & deserialize, etc. +// resty.R(). +// SetBody([]byte("This is my raw request, sent as-is")) +// +func (r *Request) SetBody(body interface{}) *Request { + r.Body = body + return r +} + +// SetResult method is to register the response `Result` object for automatic unmarshalling in the RESTful mode +// if response status code is between 200 and 299 and content type either JSON or XML. +// +// Note: Result object can be pointer or non-pointer. +// resty.R().SetResult(&AuthToken{}) +// // OR +// resty.R().SetResult(AuthToken{}) +// +// Accessing a result value +// response.Result().(*AuthToken) +// +func (r *Request) SetResult(res interface{}) *Request { + r.Result = getPointer(res) + return r +} + +// SetError method is to register the request `Error` object for automatic unmarshalling in the RESTful mode +// if response status code is greater than 399 and content type either JSON or XML. +// +// Note: Error object can be pointer or non-pointer. +// resty.R().SetError(&AuthError{}) +// // OR +// resty.R().SetError(AuthError{}) +// +// Accessing a error value +// response.Error().(*AuthError) +// +func (r *Request) SetError(err interface{}) *Request { + r.Error = getPointer(err) + return r +} + +// SetFile method is to set single file field name and its path for multipart upload. +// resty.R(). +// SetFile("my_file", "/Users/jeeva/Gas Bill - Sep.pdf") +// +func (r *Request) SetFile(param, filePath string) *Request { + r.isMultiPart = true + r.FormData.Set("@"+param, filePath) + + return r +} + +// SetFiles method is to set multiple file field name and its path for multipart upload. +// resty.R(). +// SetFiles(map[string]string{ +// "my_file1": "/Users/jeeva/Gas Bill - Sep.pdf", +// "my_file2": "/Users/jeeva/Electricity Bill - Sep.pdf", +// "my_file3": "/Users/jeeva/Water Bill - Sep.pdf", +// }) +// +func (r *Request) SetFiles(files map[string]string) *Request { + r.isMultiPart = true + + for f, fp := range files { + r.FormData.Set("@"+f, fp) + } + + return r +} + +// SetFileReader method is to set single file using io.Reader for multipart upload. +// resty.R(). +// SetFileReader("profile_img", "my-profile-img.png", bytes.NewReader(profileImgBytes)). +// SetFileReader("notes", "user-notes.txt", bytes.NewReader(notesBytes)) +// +func (r *Request) SetFileReader(param, fileName string, reader io.Reader) *Request { + r.isMultiPart = true + + r.multipartFiles = append(r.multipartFiles, &File{ + Name: fileName, + ParamName: param, + Reader: reader, + }) + + return r +} + +// SetMultipartField method is to set custom data using io.Reader for multipart upload. +func (r *Request) SetMultipartField(param, fileName, contentType string, reader io.Reader) *Request { + r.isMultiPart = true + + r.multipartFields = append(r.multipartFields, &multipartField{ + Param: param, + FileName: fileName, + ContentType: contentType, + Reader: reader, + }) + + return r +} + +// SetContentLength method sets the HTTP header `Content-Length` value for current request. +// By default go-resty won't set `Content-Length`. Also you have an option to enable for every +// request. See `resty.SetContentLength` +// resty.R().SetContentLength(true) +// +func (r *Request) SetContentLength(l bool) *Request { + r.setContentLength = true + + return r +} + +// SetBasicAuth method sets the basic authentication header in the current HTTP request. +// For Header example: +// Authorization: Basic <base64-encoded-value> +// +// To set the header for username "go-resty" and password "welcome" +// resty.R().SetBasicAuth("go-resty", "welcome") +// +// This method overrides the credentials set by method `resty.SetBasicAuth`. +// +func (r *Request) SetBasicAuth(username, password string) *Request { + r.UserInfo = &User{Username: username, Password: password} + return r +} + +// SetAuthToken method sets bearer auth token header in the current HTTP request. Header example: +// Authorization: Bearer <auth-token-value-comes-here> +// +// Example: To set auth token BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F +// +// resty.R().SetAuthToken("BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F") +// +// This method overrides the Auth token set by method `resty.SetAuthToken`. +// +func (r *Request) SetAuthToken(token string) *Request { + r.Token = token + return r +} + +// SetOutput method sets the output file for current HTTP request. Current HTTP response will be +// saved into given file. It is similar to `curl -o` flag. Absolute path or relative path can be used. +// If is it relative path then output file goes under the output directory, as mentioned +// in the `Client.SetOutputDirectory`. +// resty.R(). +// SetOutput("/Users/jeeva/Downloads/ReplyWithHeader-v5.1-beta.zip"). +// Get("http://bit.ly/1LouEKr") +// +// Note: In this scenario `Response.Body` might be nil. +func (r *Request) SetOutput(file string) *Request { + r.outputFile = file + r.isSaveResponse = true + return r +} + +// SetSRV method sets the details to query the service SRV record and execute the +// request. +// resty.R(). +// SetSRV(SRVRecord{"web", "testservice.com"}). +// Get("/get") +func (r *Request) SetSRV(srv *SRVRecord) *Request { + r.SRV = srv + return r +} + +// SetDoNotParseResponse method instructs `Resty` not to parse the response body automatically. +// Resty exposes the raw response body as `io.ReadCloser`. Also do not forget to close the body, +// otherwise you might get into connection leaks, no connection reuse. +// +// Please Note: Response middlewares are not applicable, if you use this option. Basically you have +// taken over the control of response parsing from `Resty`. +func (r *Request) SetDoNotParseResponse(parse bool) *Request { + r.notParseResponse = parse + return r +} + +// SetPathParams method sets multiple URL path key-value pairs at one go in the +// resty current request instance. +// resty.R().SetPathParams(map[string]string{ +// "userId": "sample@sample.com", +// "subAccountId": "100002", +// }) +// +// Result: +// URL - /v1/users/{userId}/{subAccountId}/details +// Composed URL - /v1/users/sample@sample.com/100002/details +// It replace the value of the key while composing request URL. Also you can +// override Path Params value, which was set at client instance level. +func (r *Request) SetPathParams(params map[string]string) *Request { + for p, v := range params { + r.pathParams[p] = v + } + return r +} + +// ExpectContentType method allows to provide fallback `Content-Type` for automatic unmarshalling +// when `Content-Type` response header is unavailable. +func (r *Request) ExpectContentType(contentType string) *Request { + r.fallbackContentType = contentType + return r +} + +// SetJSONEscapeHTML method is to enable/disable the HTML escape on JSON marshal. +// +// NOTE: This option only applicable to standard JSON Marshaller. +func (r *Request) SetJSONEscapeHTML(b bool) *Request { + r.jsonEscapeHTML = b + return r +} + +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +// HTTP verb method starts here +//___________________________________ + +// Get method does GET HTTP request. It's defined in section 4.3.1 of RFC7231. +func (r *Request) Get(url string) (*Response, error) { + return r.Execute(MethodGet, url) +} + +// Head method does HEAD HTTP request. It's defined in section 4.3.2 of RFC7231. +func (r *Request) Head(url string) (*Response, error) { + return r.Execute(MethodHead, url) +} + +// Post method does POST HTTP request. It's defined in section 4.3.3 of RFC7231. +func (r *Request) Post(url string) (*Response, error) { + return r.Execute(MethodPost, url) +} + +// Put method does PUT HTTP request. It's defined in section 4.3.4 of RFC7231. +func (r *Request) Put(url string) (*Response, error) { + return r.Execute(MethodPut, url) +} + +// Delete method does DELETE HTTP request. It's defined in section 4.3.5 of RFC7231. +func (r *Request) Delete(url string) (*Response, error) { + return r.Execute(MethodDelete, url) +} + +// Options method does OPTIONS HTTP request. It's defined in section 4.3.7 of RFC7231. +func (r *Request) Options(url string) (*Response, error) { + return r.Execute(MethodOptions, url) +} + +// Patch method does PATCH HTTP request. It's defined in section 2 of RFC5789. +func (r *Request) Patch(url string) (*Response, error) { + return r.Execute(MethodPatch, url) +} + +// Execute method performs the HTTP request with given HTTP method and URL +// for current `Request`. +// resp, err := resty.R().Execute(resty.GET, "http://httpbin.org/get") +// +func (r *Request) Execute(method, url string) (*Response, error) { + var addrs []*net.SRV + var err error + + if r.isMultiPart && !(method == MethodPost || method == MethodPut) { + return nil, fmt.Errorf("multipart content is not allowed in HTTP verb [%v]", method) + } + + if r.SRV != nil { + _, addrs, err = net.LookupSRV(r.SRV.Service, "tcp", r.SRV.Domain) + if err != nil { + return nil, err + } + } + + r.Method = method + r.URL = r.selectAddr(addrs, url, 0) + + if r.client.RetryCount == 0 { + return r.client.execute(r) + } + + var resp *Response + attempt := 0 + _ = Backoff( + func() (*Response, error) { + attempt++ + + r.URL = r.selectAddr(addrs, url, attempt) + + resp, err = r.client.execute(r) + if err != nil { + r.client.Log.Printf("ERROR %v, Attempt %v", err, attempt) + if r.isContextCancelledIfAvailable() { + // stop Backoff from retrying request if request has been + // canceled by context + return resp, nil + } + } + + return resp, err + }, + Retries(r.client.RetryCount), + WaitTime(r.client.RetryWaitTime), + MaxWaitTime(r.client.RetryMaxWaitTime), + RetryConditions(r.client.RetryConditions), + ) + + return resp, err +} + +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +// Request Unexported methods +//___________________________________ + +func (r *Request) fmtBodyString() (body string) { + body = "***** NO CONTENT *****" + if isPayloadSupported(r.Method, r.client.AllowGetMethodPayload) { + if _, ok := r.Body.(io.Reader); ok { + body = "***** BODY IS io.Reader *****" + return + } + + // multipart or form-data + if r.isMultiPart || r.isFormData { + body = r.bodyBuf.String() + return + } + + // request body data + if r.Body == nil { + return + } + var prtBodyBytes []byte + var err error + + contentType := r.Header.Get(hdrContentTypeKey) + kind := kindOf(r.Body) + if canJSONMarshal(contentType, kind) { + prtBodyBytes, err = json.MarshalIndent(&r.Body, "", " ") + } else if IsXMLType(contentType) && (kind == reflect.Struct) { + prtBodyBytes, err = xml.MarshalIndent(&r.Body, "", " ") + } else if b, ok := r.Body.(string); ok { + if IsJSONType(contentType) { + bodyBytes := []byte(b) + out := acquireBuffer() + defer releaseBuffer(out) + if err = json.Indent(out, bodyBytes, "", " "); err == nil { + prtBodyBytes = out.Bytes() + } + } else { + body = b + return + } + } else if b, ok := r.Body.([]byte); ok { + body = base64.StdEncoding.EncodeToString(b) + } + + if prtBodyBytes != nil && err == nil { + body = string(prtBodyBytes) + } + } + + return +} + +func (r *Request) selectAddr(addrs []*net.SRV, path string, attempt int) string { + if addrs == nil { + return path + } + + idx := attempt % len(addrs) + domain := strings.TrimRight(addrs[idx].Target, ".") + path = strings.TrimLeft(path, "/") + + return fmt.Sprintf("%s://%s:%d/%s", r.client.scheme, domain, addrs[idx].Port, path) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/request16.go b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/request16.go new file mode 100644 index 0000000000000000000000000000000000000000..999ba80ae90e0272f143b19771262b4bd70dce77 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/request16.go @@ -0,0 +1,63 @@ +// +build !go1.7 + +// Copyright (c) 2015-2018 Jeevanandam M (jeeva@myjeeva.com) +// 2016 Andrew Grigorev (https://github.com/ei-grad) +// All rights reserved. +// resty source code and usage is governed by a MIT style +// license that can be found in the LICENSE file. + +package resty + +import ( + "bytes" + "encoding/json" + "net/http" + "net/url" + "time" +) + +// Request type is used to compose and send individual request from client +// go-resty is provide option override client level settings such as +// Auth Token, Basic Auth credentials, Header, Query Param, Form Data, Error object +// and also you can add more options for that particular request +type Request struct { + URL string + Method string + Token string + QueryParam url.Values + FormData url.Values + Header http.Header + Time time.Time + Body interface{} + Result interface{} + Error interface{} + RawRequest *http.Request + SRV *SRVRecord + UserInfo *User + + isMultiPart bool + isFormData bool + setContentLength bool + isSaveResponse bool + notParseResponse bool + jsonEscapeHTML bool + outputFile string + fallbackContentType string + pathParams map[string]string + client *Client + bodyBuf *bytes.Buffer + multipartFiles []*File + multipartFields []*multipartField +} + +func (r *Request) addContextIfAvailable() { + // nothing to do for golang<1.7 +} + +func (r *Request) isContextCancelledIfAvailable() bool { + // just always return false golang<1.7 + return false +} + +// for !go1.7 +var noescapeJSONMarshal = json.Marshal diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/request17.go b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/request17.go new file mode 100644 index 0000000000000000000000000000000000000000..c81cae7155bc93772db80e820034ec682528db21 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/request17.go @@ -0,0 +1,87 @@ +// +build go1.7 go1.8 + +// Copyright (c) 2015-2018 Jeevanandam M (jeeva@myjeeva.com) +// 2016 Andrew Grigorev (https://github.com/ei-grad) +// All rights reserved. +// resty source code and usage is governed by a MIT style +// license that can be found in the LICENSE file. + +package resty + +import ( + "bytes" + "context" + "encoding/json" + "net/http" + "net/url" + "time" +) + +// Request type is used to compose and send individual request from client +// go-resty is provide option override client level settings such as +// Auth Token, Basic Auth credentials, Header, Query Param, Form Data, Error object +// and also you can add more options for that particular request +type Request struct { + URL string + Method string + Token string + QueryParam url.Values + FormData url.Values + Header http.Header + Time time.Time + Body interface{} + Result interface{} + Error interface{} + RawRequest *http.Request + SRV *SRVRecord + UserInfo *User + + isMultiPart bool + isFormData bool + setContentLength bool + isSaveResponse bool + notParseResponse bool + jsonEscapeHTML bool + outputFile string + fallbackContentType string + ctx context.Context + pathParams map[string]string + client *Client + bodyBuf *bytes.Buffer + multipartFiles []*File + multipartFields []*multipartField +} + +// SetContext method sets the context.Context for current Request. It allows +// to interrupt the request execution if ctx.Done() channel is closed. +// See https://blog.golang.org/context article and the "context" package +// documentation. +func (r *Request) SetContext(ctx context.Context) *Request { + r.ctx = ctx + return r +} + +func (r *Request) addContextIfAvailable() { + if r.ctx != nil { + r.RawRequest = r.RawRequest.WithContext(r.ctx) + } +} + +func (r *Request) isContextCancelledIfAvailable() bool { + if r.ctx != nil { + if r.ctx.Err() != nil { + return true + } + } + return false +} + +// for go1.7+ +var noescapeJSONMarshal = func(v interface{}) ([]byte, error) { + buf := acquireBuffer() + defer releaseBuffer(buf) + encoder := json.NewEncoder(buf) + encoder.SetEscapeHTML(false) + err := encoder.Encode(v) + return buf.Bytes(), err +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/response.go b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/response.go new file mode 100644 index 0000000000000000000000000000000000000000..f54e90557b0007887571f0f05afaf42ac6e77e61 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/response.go @@ -0,0 +1,150 @@ +// Copyright (c) 2015-2018 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// resty source code and usage is governed by a MIT style +// license that can be found in the LICENSE file. + +package resty + +import ( + "encoding/json" + "fmt" + "io" + "net/http" + "strings" + "time" +) + +// Response is an object represents executed request and its values. +type Response struct { + Request *Request + RawResponse *http.Response + + body []byte + size int64 + receivedAt time.Time +} + +// Body method returns HTTP response as []byte array for the executed request. +// Note: `Response.Body` might be nil, if `Request.SetOutput` is used. +func (r *Response) Body() []byte { + if r.RawResponse == nil { + return []byte{} + } + return r.body +} + +// Status method returns the HTTP status string for the executed request. +// Example: 200 OK +func (r *Response) Status() string { + if r.RawResponse == nil { + return "" + } + + return r.RawResponse.Status +} + +// StatusCode method returns the HTTP status code for the executed request. +// Example: 200 +func (r *Response) StatusCode() int { + if r.RawResponse == nil { + return 0 + } + + return r.RawResponse.StatusCode +} + +// Result method returns the response value as an object if it has one +func (r *Response) Result() interface{} { + return r.Request.Result +} + +// Error method returns the error object if it has one +func (r *Response) Error() interface{} { + return r.Request.Error +} + +// Header method returns the response headers +func (r *Response) Header() http.Header { + if r.RawResponse == nil { + return http.Header{} + } + + return r.RawResponse.Header +} + +// Cookies method to access all the response cookies +func (r *Response) Cookies() []*http.Cookie { + if r.RawResponse == nil { + return make([]*http.Cookie, 0) + } + + return r.RawResponse.Cookies() +} + +// String method returns the body of the server response as String. +func (r *Response) String() string { + if r.body == nil { + return "" + } + + return strings.TrimSpace(string(r.body)) +} + +// Time method returns the time of HTTP response time that from request we sent and received a request. +// See `response.ReceivedAt` to know when client recevied response and see `response.Request.Time` to know +// when client sent a request. +func (r *Response) Time() time.Duration { + return r.receivedAt.Sub(r.Request.Time) +} + +// ReceivedAt method returns when response got recevied from server for the request. +func (r *Response) ReceivedAt() time.Time { + return r.receivedAt +} + +// Size method returns the HTTP response size in bytes. Ya, you can relay on HTTP `Content-Length` header, +// however it won't be good for chucked transfer/compressed response. Since Resty calculates response size +// at the client end. You will get actual size of the http response. +func (r *Response) Size() int64 { + return r.size +} + +// RawBody method exposes the HTTP raw response body. Use this method in-conjunction with `SetDoNotParseResponse` +// option otherwise you get an error as `read err: http: read on closed response body`. +// +// Do not forget to close the body, otherwise you might get into connection leaks, no connection reuse. +// Basically you have taken over the control of response parsing from `Resty`. +func (r *Response) RawBody() io.ReadCloser { + if r.RawResponse == nil { + return nil + } + return r.RawResponse.Body +} + +// IsSuccess method returns true if HTTP status code >= 200 and <= 299 otherwise false. +func (r *Response) IsSuccess() bool { + return r.StatusCode() > 199 && r.StatusCode() < 300 +} + +// IsError method returns true if HTTP status code >= 400 otherwise false. +func (r *Response) IsError() bool { + return r.StatusCode() > 399 +} + +func (r *Response) fmtBodyString(sl int64) string { + if r.body != nil { + if int64(len(r.body)) > sl { + return fmt.Sprintf("***** RESPONSE TOO LARGE (size - %d) *****", len(r.body)) + } + ct := r.Header().Get(hdrContentTypeKey) + if IsJSONType(ct) { + out := acquireBuffer() + defer releaseBuffer(out) + if err := json.Indent(out, r.body, "", " "); err == nil { + return out.String() + } + } + return r.String() + } + + return "***** NO CONTENT *****" +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/resty.go b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/resty.go new file mode 100644 index 0000000000000000000000000000000000000000..b9f9f03ea8b55a2eff5f70211ac66146f10c9911 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/resty.go @@ -0,0 +1,9 @@ +// Copyright (c) 2015-2018 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// resty source code and usage is governed by a MIT style +// license that can be found in the LICENSE file. + +// Package resty provides simple HTTP and REST client for Go inspired by Ruby rest-client. +package resty + +// Version # of resty +const Version = "1.10.3" diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/retry.go b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/retry.go new file mode 100644 index 0000000000000000000000000000000000000000..3fe7e40582ce7cf5f09d9abc93211b9553404003 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/retry.go @@ -0,0 +1,118 @@ +// Copyright (c) 2015-2018 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// resty source code and usage is governed by a MIT style +// license that can be found in the LICENSE file. + +package resty + +import ( + "math" + "math/rand" + "time" +) + +const ( + defaultMaxRetries = 3 + defaultWaitTime = time.Duration(100) * time.Millisecond + defaultMaxWaitTime = time.Duration(2000) * time.Millisecond +) + +type ( + // Option is to create convenient retry options like wait time, max retries, etc. + Option func(*Options) + + // RetryConditionFunc type is for retry condition function + RetryConditionFunc func(*Response) (bool, error) + + // Options to hold go-resty retry values + Options struct { + maxRetries int + waitTime time.Duration + maxWaitTime time.Duration + retryConditions []RetryConditionFunc + } +) + +// Retries sets the max number of retries +func Retries(value int) Option { + return func(o *Options) { + o.maxRetries = value + } +} + +// WaitTime sets the default wait time to sleep between requests +func WaitTime(value time.Duration) Option { + return func(o *Options) { + o.waitTime = value + } +} + +// MaxWaitTime sets the max wait time to sleep between requests +func MaxWaitTime(value time.Duration) Option { + return func(o *Options) { + o.maxWaitTime = value + } +} + +// RetryConditions sets the conditions that will be checked for retry. +func RetryConditions(conditions []RetryConditionFunc) Option { + return func(o *Options) { + o.retryConditions = conditions + } +} + +// Backoff retries with increasing timeout duration up until X amount of retries +// (Default is 3 attempts, Override with option Retries(n)) +func Backoff(operation func() (*Response, error), options ...Option) error { + // Defaults + opts := Options{ + maxRetries: defaultMaxRetries, + waitTime: defaultWaitTime, + maxWaitTime: defaultMaxWaitTime, + retryConditions: []RetryConditionFunc{}, + } + + for _, o := range options { + o(&opts) + } + + var ( + resp *Response + err error + ) + base := float64(opts.waitTime) // Time to wait between each attempt + capLevel := float64(opts.maxWaitTime) // Maximum amount of wait time for the retry + for attempt := 0; attempt < opts.maxRetries; attempt++ { + resp, err = operation() + + var needsRetry bool + var conditionErr error + for _, condition := range opts.retryConditions { + needsRetry, conditionErr = condition(resp) + if needsRetry || conditionErr != nil { + break + } + } + + // If the operation returned no error, there was no condition satisfied and + // there was no error caused by the conditional functions. + if err == nil && !needsRetry && conditionErr == nil { + return nil + } + // Adding capped exponential backup with jitter + // See the following article... + // http://www.awsarchitectureblog.com/2015/03/backoff.html + temp := math.Min(capLevel, base*math.Exp2(float64(attempt))) + ri := int(temp / 2) + if ri <= 0 { + ri = 1<<31 - 1 // max int for arch 386 + } + sleepDuration := time.Duration(math.Abs(float64(ri + rand.Intn(ri)))) + + if sleepDuration < opts.waitTime { + sleepDuration = opts.waitTime + } + time.Sleep(sleepDuration) + } + + return err +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/util.go b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/util.go new file mode 100644 index 0000000000000000000000000000000000000000..8b1de68d8b20028d77f1f093f7dae910f3fdb7fb --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/resty.v1/util.go @@ -0,0 +1,281 @@ +// Copyright (c) 2015-2018 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// resty source code and usage is governed by a MIT style +// license that can be found in the LICENSE file. + +package resty + +import ( + "bytes" + "encoding/json" + "encoding/xml" + "fmt" + "io" + "log" + "mime/multipart" + "net/http" + "net/textproto" + "os" + "path/filepath" + "reflect" + "runtime" + "sort" + "strings" +) + +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +// Package Helper methods +//___________________________________ + +// IsStringEmpty method tells whether given string is empty or not +func IsStringEmpty(str string) bool { + return len(strings.TrimSpace(str)) == 0 +} + +// DetectContentType method is used to figure out `Request.Body` content type for request header +func DetectContentType(body interface{}) string { + contentType := plainTextType + kind := kindOf(body) + switch kind { + case reflect.Struct, reflect.Map: + contentType = jsonContentType + case reflect.String: + contentType = plainTextType + default: + if b, ok := body.([]byte); ok { + contentType = http.DetectContentType(b) + } else if kind == reflect.Slice { + contentType = jsonContentType + } + } + + return contentType +} + +// IsJSONType method is to check JSON content type or not +func IsJSONType(ct string) bool { + return jsonCheck.MatchString(ct) +} + +// IsXMLType method is to check XML content type or not +func IsXMLType(ct string) bool { + return xmlCheck.MatchString(ct) +} + +// Unmarshal content into object from JSON or XML +// Deprecated: kept for backward compatibility +func Unmarshal(ct string, b []byte, d interface{}) (err error) { + if IsJSONType(ct) { + err = json.Unmarshal(b, d) + } else if IsXMLType(ct) { + err = xml.Unmarshal(b, d) + } + + return +} + +// Unmarshalc content into object from JSON or XML +func Unmarshalc(c *Client, ct string, b []byte, d interface{}) (err error) { + if IsJSONType(ct) { + err = c.JSONUnmarshal(b, d) + } else if IsXMLType(ct) { + err = xml.Unmarshal(b, d) + } + + return +} + +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +// RequestLog and ResponseLog type +//___________________________________ + +// RequestLog struct is used to collected information from resty request +// instance for debug logging. It sent to request log callback before resty +// actually logs the information. +type RequestLog struct { + Header http.Header + Body string +} + +// ResponseLog struct is used to collected information from resty response +// instance for debug logging. It sent to response log callback before resty +// actually logs the information. +type ResponseLog struct { + Header http.Header + Body string +} + +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +// Package Unexported methods +//___________________________________ + +// way to disable the HTML escape as opt-in +func jsonMarshal(c *Client, r *Request, d interface{}) ([]byte, error) { + if !r.jsonEscapeHTML { + return noescapeJSONMarshal(d) + } else if !c.jsonEscapeHTML { + return noescapeJSONMarshal(d) + } + return c.JSONMarshal(d) +} + +func firstNonEmpty(v ...string) string { + for _, s := range v { + if !IsStringEmpty(s) { + return s + } + } + return "" +} + +func getLogger(w io.Writer) *log.Logger { + return log.New(w, "RESTY ", log.LstdFlags) +} + +var quoteEscaper = strings.NewReplacer("\\", "\\\\", `"`, "\\\"") + +func escapeQuotes(s string) string { + return quoteEscaper.Replace(s) +} + +func createMultipartHeader(param, fileName, contentType string) textproto.MIMEHeader { + hdr := make(textproto.MIMEHeader) + hdr.Set("Content-Disposition", fmt.Sprintf(`form-data; name="%s"; filename="%s"`, + escapeQuotes(param), escapeQuotes(fileName))) + hdr.Set("Content-Type", contentType) + return hdr +} + +func addMultipartFormField(w *multipart.Writer, mf *multipartField) error { + partWriter, err := w.CreatePart(createMultipartHeader(mf.Param, mf.FileName, mf.ContentType)) + if err != nil { + return err + } + + _, err = io.Copy(partWriter, mf.Reader) + return err +} + +func writeMultipartFormFile(w *multipart.Writer, fieldName, fileName string, r io.Reader) error { + // Auto detect actual multipart content type + cbuf := make([]byte, 512) + size, err := r.Read(cbuf) + if err != nil { + return err + } + + partWriter, err := w.CreatePart(createMultipartHeader(fieldName, fileName, http.DetectContentType(cbuf))) + if err != nil { + return err + } + + if _, err = partWriter.Write(cbuf[:size]); err != nil { + return err + } + + _, err = io.Copy(partWriter, r) + return err +} + +func addFile(w *multipart.Writer, fieldName, path string) error { + file, err := os.Open(path) + if err != nil { + return err + } + defer closeq(file) + return writeMultipartFormFile(w, fieldName, filepath.Base(path), file) +} + +func addFileReader(w *multipart.Writer, f *File) error { + return writeMultipartFormFile(w, f.ParamName, f.Name, f.Reader) +} + +func getPointer(v interface{}) interface{} { + vv := valueOf(v) + if vv.Kind() == reflect.Ptr { + return v + } + return reflect.New(vv.Type()).Interface() +} + +func isPayloadSupported(m string, allowMethodGet bool) bool { + return !(m == MethodHead || m == MethodOptions || (m == MethodGet && !allowMethodGet)) +} + +func typeOf(i interface{}) reflect.Type { + return indirect(valueOf(i)).Type() +} + +func valueOf(i interface{}) reflect.Value { + return reflect.ValueOf(i) +} + +func indirect(v reflect.Value) reflect.Value { + return reflect.Indirect(v) +} + +func kindOf(v interface{}) reflect.Kind { + return typeOf(v).Kind() +} + +func createDirectory(dir string) (err error) { + if _, err = os.Stat(dir); err != nil { + if os.IsNotExist(err) { + if err = os.MkdirAll(dir, 0755); err != nil { + return + } + } + } + return +} + +func canJSONMarshal(contentType string, kind reflect.Kind) bool { + return IsJSONType(contentType) && (kind == reflect.Struct || kind == reflect.Map || kind == reflect.Slice) +} + +func functionName(i interface{}) string { + return runtime.FuncForPC(reflect.ValueOf(i).Pointer()).Name() +} + +func acquireBuffer() *bytes.Buffer { + return bufPool.Get().(*bytes.Buffer) +} + +func releaseBuffer(buf *bytes.Buffer) { + if buf != nil { + buf.Reset() + bufPool.Put(buf) + } +} + +func closeq(v interface{}) { + if c, ok := v.(io.Closer); ok { + sliently(c.Close()) + } +} + +func sliently(_ ...interface{}) {} + +func composeHeaders(hdrs http.Header) string { + var str []string + for _, k := range sortHeaderKeys(hdrs) { + str = append(str, fmt.Sprintf("%25s: %s", k, strings.Join(hdrs[k], ", "))) + } + return strings.Join(str, "\n") +} + +func sortHeaderKeys(hdrs http.Header) []string { + var keys []string + for key := range hdrs { + keys = append(keys, key) + } + sort.Strings(keys) + return keys +} + +func copyHeaders(hdrs http.Header) http.Header { + nh := http.Header{} + for k, v := range hdrs { + nh[k] = v + } + return nh +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/LICENSE b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..a68e67f01b0cbbebb44224df30471217ee6ecdd1 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/LICENSE @@ -0,0 +1,188 @@ + +Copyright (c) 2011-2014 - Canonical Inc. + +This software is licensed under the LGPLv3, included below. + +As a special exception to the GNU Lesser General Public License version 3 +("LGPL3"), the copyright holders of this Library give you permission to +convey to a third party a Combined Work that links statically or dynamically +to this Library without providing any Minimal Corresponding Source or +Minimal Application Code as set out in 4d or providing the installation +information set out in section 4e, provided that you comply with the other +provisions of LGPL3 and provided that you meet, for the Application the +terms and conditions of the license(s) which apply to the Application. + +Except as stated in this special exception, the provisions of LGPL3 will +continue to comply in full to this Library. If you modify this Library, you +may apply this exception to your version of this Library, but you are not +obliged to do so. If you do not wish to do so, delete this exception +statement from your version. This exception does not (and cannot) modify any +license terms which apply to the Application, with which you must still +comply. + + + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/LICENSE.libyaml b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/LICENSE.libyaml new file mode 100644 index 0000000000000000000000000000000000000000..8da58fbf6f84a9280f8351ed3c8bfb47c9d787c2 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/LICENSE.libyaml @@ -0,0 +1,31 @@ +The following files were ported to Go from C files of libyaml, and thus +are still covered by their original copyright and license: + + apic.go + emitterc.go + parserc.go + readerc.go + scannerc.go + writerc.go + yamlh.go + yamlprivateh.go + +Copyright (c) 2006 Kirill Simonov + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/README.md b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/README.md new file mode 100644 index 0000000000000000000000000000000000000000..d6c919e6073d0e2c298f9791a961703533738a68 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/README.md @@ -0,0 +1,128 @@ +# YAML support for the Go language + +Introduction +------------ + +The yaml package enables Go programs to comfortably encode and decode YAML +values. It was developed within [Canonical](https://www.canonical.com) as +part of the [juju](https://juju.ubuntu.com) project, and is based on a +pure Go port of the well-known [libyaml](http://pyyaml.org/wiki/LibYAML) +C library to parse and generate YAML data quickly and reliably. + +Compatibility +------------- + +The yaml package supports most of YAML 1.1 and 1.2, including support for +anchors, tags, map merging, etc. Multi-document unmarshalling is not yet +implemented, and base-60 floats from YAML 1.1 are purposefully not +supported since they're a poor design and are gone in YAML 1.2. + +Installation and usage +---------------------- + +The import path for the package is *gopkg.in/yaml.v2*. + +To install it, run: + + go get gopkg.in/yaml.v2 + +API documentation +----------------- + +If opened in a browser, the import path itself leads to the API documentation: + + * [https://gopkg.in/yaml.v2](https://gopkg.in/yaml.v2) + +API stability +------------- + +The package API for yaml v2 will remain stable as described in [gopkg.in](https://gopkg.in). + + +License +------- + +The yaml package is licensed under the LGPL with an exception that allows it to be linked statically. Please see the LICENSE file for details. + + +Example +------- + +```Go +package main + +import ( + "fmt" + "log" + + "gopkg.in/yaml.v2" +) + +var data = ` +a: Easy! +b: + c: 2 + d: [3, 4] +` + +type T struct { + A string + B struct{C int; D []int ",flow"} +} + +func main() { + t := T{} + + err := yaml.Unmarshal([]byte(data), &t) + if err != nil { + log.Fatalf("error: %v", err) + } + fmt.Printf("--- t:\n%v\n\n", t) + + d, err := yaml.Marshal(&t) + if err != nil { + log.Fatalf("error: %v", err) + } + fmt.Printf("--- t dump:\n%s\n\n", string(d)) + + m := make(map[interface{}]interface{}) + + err = yaml.Unmarshal([]byte(data), &m) + if err != nil { + log.Fatalf("error: %v", err) + } + fmt.Printf("--- m:\n%v\n\n", m) + + d, err = yaml.Marshal(&m) + if err != nil { + log.Fatalf("error: %v", err) + } + fmt.Printf("--- m dump:\n%s\n\n", string(d)) +} +``` + +This example will generate the following output: + +``` +--- t: +{Easy! {2 [3 4]}} + +--- t dump: +a: Easy! +b: + c: 2 + d: [3, 4] + + +--- m: +map[a:Easy! b:map[c:2 d:[3 4]]] + +--- m dump: +a: Easy! +b: + c: 2 + d: + - 3 + - 4 +``` + diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/apic.go b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/apic.go new file mode 100644 index 0000000000000000000000000000000000000000..95ec014e8ccfdc818c02cde00ecb617519d910d1 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/apic.go @@ -0,0 +1,742 @@ +package yaml + +import ( + "io" + "os" +) + +func yaml_insert_token(parser *yaml_parser_t, pos int, token *yaml_token_t) { + //fmt.Println("yaml_insert_token", "pos:", pos, "typ:", token.typ, "head:", parser.tokens_head, "len:", len(parser.tokens)) + + // Check if we can move the queue at the beginning of the buffer. + if parser.tokens_head > 0 && len(parser.tokens) == cap(parser.tokens) { + if parser.tokens_head != len(parser.tokens) { + copy(parser.tokens, parser.tokens[parser.tokens_head:]) + } + parser.tokens = parser.tokens[:len(parser.tokens)-parser.tokens_head] + parser.tokens_head = 0 + } + parser.tokens = append(parser.tokens, *token) + if pos < 0 { + return + } + copy(parser.tokens[parser.tokens_head+pos+1:], parser.tokens[parser.tokens_head+pos:]) + parser.tokens[parser.tokens_head+pos] = *token +} + +// Create a new parser object. +func yaml_parser_initialize(parser *yaml_parser_t) bool { + *parser = yaml_parser_t{ + raw_buffer: make([]byte, 0, input_raw_buffer_size), + buffer: make([]byte, 0, input_buffer_size), + } + return true +} + +// Destroy a parser object. +func yaml_parser_delete(parser *yaml_parser_t) { + *parser = yaml_parser_t{} +} + +// String read handler. +func yaml_string_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) { + if parser.input_pos == len(parser.input) { + return 0, io.EOF + } + n = copy(buffer, parser.input[parser.input_pos:]) + parser.input_pos += n + return n, nil +} + +// File read handler. +func yaml_file_read_handler(parser *yaml_parser_t, buffer []byte) (n int, err error) { + return parser.input_file.Read(buffer) +} + +// Set a string input. +func yaml_parser_set_input_string(parser *yaml_parser_t, input []byte) { + if parser.read_handler != nil { + panic("must set the input source only once") + } + parser.read_handler = yaml_string_read_handler + parser.input = input + parser.input_pos = 0 +} + +// Set a file input. +func yaml_parser_set_input_file(parser *yaml_parser_t, file *os.File) { + if parser.read_handler != nil { + panic("must set the input source only once") + } + parser.read_handler = yaml_file_read_handler + parser.input_file = file +} + +// Set the source encoding. +func yaml_parser_set_encoding(parser *yaml_parser_t, encoding yaml_encoding_t) { + if parser.encoding != yaml_ANY_ENCODING { + panic("must set the encoding only once") + } + parser.encoding = encoding +} + +// Create a new emitter object. +func yaml_emitter_initialize(emitter *yaml_emitter_t) bool { + *emitter = yaml_emitter_t{ + buffer: make([]byte, output_buffer_size), + raw_buffer: make([]byte, 0, output_raw_buffer_size), + states: make([]yaml_emitter_state_t, 0, initial_stack_size), + events: make([]yaml_event_t, 0, initial_queue_size), + } + return true +} + +// Destroy an emitter object. +func yaml_emitter_delete(emitter *yaml_emitter_t) { + *emitter = yaml_emitter_t{} +} + +// String write handler. +func yaml_string_write_handler(emitter *yaml_emitter_t, buffer []byte) error { + *emitter.output_buffer = append(*emitter.output_buffer, buffer...) + return nil +} + +// File write handler. +func yaml_file_write_handler(emitter *yaml_emitter_t, buffer []byte) error { + _, err := emitter.output_file.Write(buffer) + return err +} + +// Set a string output. +func yaml_emitter_set_output_string(emitter *yaml_emitter_t, output_buffer *[]byte) { + if emitter.write_handler != nil { + panic("must set the output target only once") + } + emitter.write_handler = yaml_string_write_handler + emitter.output_buffer = output_buffer +} + +// Set a file output. +func yaml_emitter_set_output_file(emitter *yaml_emitter_t, file io.Writer) { + if emitter.write_handler != nil { + panic("must set the output target only once") + } + emitter.write_handler = yaml_file_write_handler + emitter.output_file = file +} + +// Set the output encoding. +func yaml_emitter_set_encoding(emitter *yaml_emitter_t, encoding yaml_encoding_t) { + if emitter.encoding != yaml_ANY_ENCODING { + panic("must set the output encoding only once") + } + emitter.encoding = encoding +} + +// Set the canonical output style. +func yaml_emitter_set_canonical(emitter *yaml_emitter_t, canonical bool) { + emitter.canonical = canonical +} + +//// Set the indentation increment. +func yaml_emitter_set_indent(emitter *yaml_emitter_t, indent int) { + if indent < 2 || indent > 9 { + indent = 2 + } + emitter.best_indent = indent +} + +// Set the preferred line width. +func yaml_emitter_set_width(emitter *yaml_emitter_t, width int) { + if width < 0 { + width = -1 + } + emitter.best_width = width +} + +// Set if unescaped non-ASCII characters are allowed. +func yaml_emitter_set_unicode(emitter *yaml_emitter_t, unicode bool) { + emitter.unicode = unicode +} + +// Set the preferred line break character. +func yaml_emitter_set_break(emitter *yaml_emitter_t, line_break yaml_break_t) { + emitter.line_break = line_break +} + +///* +// * Destroy a token object. +// */ +// +//YAML_DECLARE(void) +//yaml_token_delete(yaml_token_t *token) +//{ +// assert(token); // Non-NULL token object expected. +// +// switch (token.type) +// { +// case YAML_TAG_DIRECTIVE_TOKEN: +// yaml_free(token.data.tag_directive.handle); +// yaml_free(token.data.tag_directive.prefix); +// break; +// +// case YAML_ALIAS_TOKEN: +// yaml_free(token.data.alias.value); +// break; +// +// case YAML_ANCHOR_TOKEN: +// yaml_free(token.data.anchor.value); +// break; +// +// case YAML_TAG_TOKEN: +// yaml_free(token.data.tag.handle); +// yaml_free(token.data.tag.suffix); +// break; +// +// case YAML_SCALAR_TOKEN: +// yaml_free(token.data.scalar.value); +// break; +// +// default: +// break; +// } +// +// memset(token, 0, sizeof(yaml_token_t)); +//} +// +///* +// * Check if a string is a valid UTF-8 sequence. +// * +// * Check 'reader.c' for more details on UTF-8 encoding. +// */ +// +//static int +//yaml_check_utf8(yaml_char_t *start, size_t length) +//{ +// yaml_char_t *end = start+length; +// yaml_char_t *pointer = start; +// +// while (pointer < end) { +// unsigned char octet; +// unsigned int width; +// unsigned int value; +// size_t k; +// +// octet = pointer[0]; +// width = (octet & 0x80) == 0x00 ? 1 : +// (octet & 0xE0) == 0xC0 ? 2 : +// (octet & 0xF0) == 0xE0 ? 3 : +// (octet & 0xF8) == 0xF0 ? 4 : 0; +// value = (octet & 0x80) == 0x00 ? octet & 0x7F : +// (octet & 0xE0) == 0xC0 ? octet & 0x1F : +// (octet & 0xF0) == 0xE0 ? octet & 0x0F : +// (octet & 0xF8) == 0xF0 ? octet & 0x07 : 0; +// if (!width) return 0; +// if (pointer+width > end) return 0; +// for (k = 1; k < width; k ++) { +// octet = pointer[k]; +// if ((octet & 0xC0) != 0x80) return 0; +// value = (value << 6) + (octet & 0x3F); +// } +// if (!((width == 1) || +// (width == 2 && value >= 0x80) || +// (width == 3 && value >= 0x800) || +// (width == 4 && value >= 0x10000))) return 0; +// +// pointer += width; +// } +// +// return 1; +//} +// + +// Create STREAM-START. +func yaml_stream_start_event_initialize(event *yaml_event_t, encoding yaml_encoding_t) bool { + *event = yaml_event_t{ + typ: yaml_STREAM_START_EVENT, + encoding: encoding, + } + return true +} + +// Create STREAM-END. +func yaml_stream_end_event_initialize(event *yaml_event_t) bool { + *event = yaml_event_t{ + typ: yaml_STREAM_END_EVENT, + } + return true +} + +// Create DOCUMENT-START. +func yaml_document_start_event_initialize(event *yaml_event_t, version_directive *yaml_version_directive_t, + tag_directives []yaml_tag_directive_t, implicit bool) bool { + *event = yaml_event_t{ + typ: yaml_DOCUMENT_START_EVENT, + version_directive: version_directive, + tag_directives: tag_directives, + implicit: implicit, + } + return true +} + +// Create DOCUMENT-END. +func yaml_document_end_event_initialize(event *yaml_event_t, implicit bool) bool { + *event = yaml_event_t{ + typ: yaml_DOCUMENT_END_EVENT, + implicit: implicit, + } + return true +} + +///* +// * Create ALIAS. +// */ +// +//YAML_DECLARE(int) +//yaml_alias_event_initialize(event *yaml_event_t, anchor *yaml_char_t) +//{ +// mark yaml_mark_t = { 0, 0, 0 } +// anchor_copy *yaml_char_t = NULL +// +// assert(event) // Non-NULL event object is expected. +// assert(anchor) // Non-NULL anchor is expected. +// +// if (!yaml_check_utf8(anchor, strlen((char *)anchor))) return 0 +// +// anchor_copy = yaml_strdup(anchor) +// if (!anchor_copy) +// return 0 +// +// ALIAS_EVENT_INIT(*event, anchor_copy, mark, mark) +// +// return 1 +//} + +// Create SCALAR. +func yaml_scalar_event_initialize(event *yaml_event_t, anchor, tag, value []byte, plain_implicit, quoted_implicit bool, style yaml_scalar_style_t) bool { + *event = yaml_event_t{ + typ: yaml_SCALAR_EVENT, + anchor: anchor, + tag: tag, + value: value, + implicit: plain_implicit, + quoted_implicit: quoted_implicit, + style: yaml_style_t(style), + } + return true +} + +// Create SEQUENCE-START. +func yaml_sequence_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_sequence_style_t) bool { + *event = yaml_event_t{ + typ: yaml_SEQUENCE_START_EVENT, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(style), + } + return true +} + +// Create SEQUENCE-END. +func yaml_sequence_end_event_initialize(event *yaml_event_t) bool { + *event = yaml_event_t{ + typ: yaml_SEQUENCE_END_EVENT, + } + return true +} + +// Create MAPPING-START. +func yaml_mapping_start_event_initialize(event *yaml_event_t, anchor, tag []byte, implicit bool, style yaml_mapping_style_t) bool { + *event = yaml_event_t{ + typ: yaml_MAPPING_START_EVENT, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(style), + } + return true +} + +// Create MAPPING-END. +func yaml_mapping_end_event_initialize(event *yaml_event_t) bool { + *event = yaml_event_t{ + typ: yaml_MAPPING_END_EVENT, + } + return true +} + +// Destroy an event object. +func yaml_event_delete(event *yaml_event_t) { + *event = yaml_event_t{} +} + +///* +// * Create a document object. +// */ +// +//YAML_DECLARE(int) +//yaml_document_initialize(document *yaml_document_t, +// version_directive *yaml_version_directive_t, +// tag_directives_start *yaml_tag_directive_t, +// tag_directives_end *yaml_tag_directive_t, +// start_implicit int, end_implicit int) +//{ +// struct { +// error yaml_error_type_t +// } context +// struct { +// start *yaml_node_t +// end *yaml_node_t +// top *yaml_node_t +// } nodes = { NULL, NULL, NULL } +// version_directive_copy *yaml_version_directive_t = NULL +// struct { +// start *yaml_tag_directive_t +// end *yaml_tag_directive_t +// top *yaml_tag_directive_t +// } tag_directives_copy = { NULL, NULL, NULL } +// value yaml_tag_directive_t = { NULL, NULL } +// mark yaml_mark_t = { 0, 0, 0 } +// +// assert(document) // Non-NULL document object is expected. +// assert((tag_directives_start && tag_directives_end) || +// (tag_directives_start == tag_directives_end)) +// // Valid tag directives are expected. +// +// if (!STACK_INIT(&context, nodes, INITIAL_STACK_SIZE)) goto error +// +// if (version_directive) { +// version_directive_copy = yaml_malloc(sizeof(yaml_version_directive_t)) +// if (!version_directive_copy) goto error +// version_directive_copy.major = version_directive.major +// version_directive_copy.minor = version_directive.minor +// } +// +// if (tag_directives_start != tag_directives_end) { +// tag_directive *yaml_tag_directive_t +// if (!STACK_INIT(&context, tag_directives_copy, INITIAL_STACK_SIZE)) +// goto error +// for (tag_directive = tag_directives_start +// tag_directive != tag_directives_end; tag_directive ++) { +// assert(tag_directive.handle) +// assert(tag_directive.prefix) +// if (!yaml_check_utf8(tag_directive.handle, +// strlen((char *)tag_directive.handle))) +// goto error +// if (!yaml_check_utf8(tag_directive.prefix, +// strlen((char *)tag_directive.prefix))) +// goto error +// value.handle = yaml_strdup(tag_directive.handle) +// value.prefix = yaml_strdup(tag_directive.prefix) +// if (!value.handle || !value.prefix) goto error +// if (!PUSH(&context, tag_directives_copy, value)) +// goto error +// value.handle = NULL +// value.prefix = NULL +// } +// } +// +// DOCUMENT_INIT(*document, nodes.start, nodes.end, version_directive_copy, +// tag_directives_copy.start, tag_directives_copy.top, +// start_implicit, end_implicit, mark, mark) +// +// return 1 +// +//error: +// STACK_DEL(&context, nodes) +// yaml_free(version_directive_copy) +// while (!STACK_EMPTY(&context, tag_directives_copy)) { +// value yaml_tag_directive_t = POP(&context, tag_directives_copy) +// yaml_free(value.handle) +// yaml_free(value.prefix) +// } +// STACK_DEL(&context, tag_directives_copy) +// yaml_free(value.handle) +// yaml_free(value.prefix) +// +// return 0 +//} +// +///* +// * Destroy a document object. +// */ +// +//YAML_DECLARE(void) +//yaml_document_delete(document *yaml_document_t) +//{ +// struct { +// error yaml_error_type_t +// } context +// tag_directive *yaml_tag_directive_t +// +// context.error = YAML_NO_ERROR // Eliminate a compliler warning. +// +// assert(document) // Non-NULL document object is expected. +// +// while (!STACK_EMPTY(&context, document.nodes)) { +// node yaml_node_t = POP(&context, document.nodes) +// yaml_free(node.tag) +// switch (node.type) { +// case YAML_SCALAR_NODE: +// yaml_free(node.data.scalar.value) +// break +// case YAML_SEQUENCE_NODE: +// STACK_DEL(&context, node.data.sequence.items) +// break +// case YAML_MAPPING_NODE: +// STACK_DEL(&context, node.data.mapping.pairs) +// break +// default: +// assert(0) // Should not happen. +// } +// } +// STACK_DEL(&context, document.nodes) +// +// yaml_free(document.version_directive) +// for (tag_directive = document.tag_directives.start +// tag_directive != document.tag_directives.end +// tag_directive++) { +// yaml_free(tag_directive.handle) +// yaml_free(tag_directive.prefix) +// } +// yaml_free(document.tag_directives.start) +// +// memset(document, 0, sizeof(yaml_document_t)) +//} +// +///** +// * Get a document node. +// */ +// +//YAML_DECLARE(yaml_node_t *) +//yaml_document_get_node(document *yaml_document_t, index int) +//{ +// assert(document) // Non-NULL document object is expected. +// +// if (index > 0 && document.nodes.start + index <= document.nodes.top) { +// return document.nodes.start + index - 1 +// } +// return NULL +//} +// +///** +// * Get the root object. +// */ +// +//YAML_DECLARE(yaml_node_t *) +//yaml_document_get_root_node(document *yaml_document_t) +//{ +// assert(document) // Non-NULL document object is expected. +// +// if (document.nodes.top != document.nodes.start) { +// return document.nodes.start +// } +// return NULL +//} +// +///* +// * Add a scalar node to a document. +// */ +// +//YAML_DECLARE(int) +//yaml_document_add_scalar(document *yaml_document_t, +// tag *yaml_char_t, value *yaml_char_t, length int, +// style yaml_scalar_style_t) +//{ +// struct { +// error yaml_error_type_t +// } context +// mark yaml_mark_t = { 0, 0, 0 } +// tag_copy *yaml_char_t = NULL +// value_copy *yaml_char_t = NULL +// node yaml_node_t +// +// assert(document) // Non-NULL document object is expected. +// assert(value) // Non-NULL value is expected. +// +// if (!tag) { +// tag = (yaml_char_t *)YAML_DEFAULT_SCALAR_TAG +// } +// +// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error +// tag_copy = yaml_strdup(tag) +// if (!tag_copy) goto error +// +// if (length < 0) { +// length = strlen((char *)value) +// } +// +// if (!yaml_check_utf8(value, length)) goto error +// value_copy = yaml_malloc(length+1) +// if (!value_copy) goto error +// memcpy(value_copy, value, length) +// value_copy[length] = '\0' +// +// SCALAR_NODE_INIT(node, tag_copy, value_copy, length, style, mark, mark) +// if (!PUSH(&context, document.nodes, node)) goto error +// +// return document.nodes.top - document.nodes.start +// +//error: +// yaml_free(tag_copy) +// yaml_free(value_copy) +// +// return 0 +//} +// +///* +// * Add a sequence node to a document. +// */ +// +//YAML_DECLARE(int) +//yaml_document_add_sequence(document *yaml_document_t, +// tag *yaml_char_t, style yaml_sequence_style_t) +//{ +// struct { +// error yaml_error_type_t +// } context +// mark yaml_mark_t = { 0, 0, 0 } +// tag_copy *yaml_char_t = NULL +// struct { +// start *yaml_node_item_t +// end *yaml_node_item_t +// top *yaml_node_item_t +// } items = { NULL, NULL, NULL } +// node yaml_node_t +// +// assert(document) // Non-NULL document object is expected. +// +// if (!tag) { +// tag = (yaml_char_t *)YAML_DEFAULT_SEQUENCE_TAG +// } +// +// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error +// tag_copy = yaml_strdup(tag) +// if (!tag_copy) goto error +// +// if (!STACK_INIT(&context, items, INITIAL_STACK_SIZE)) goto error +// +// SEQUENCE_NODE_INIT(node, tag_copy, items.start, items.end, +// style, mark, mark) +// if (!PUSH(&context, document.nodes, node)) goto error +// +// return document.nodes.top - document.nodes.start +// +//error: +// STACK_DEL(&context, items) +// yaml_free(tag_copy) +// +// return 0 +//} +// +///* +// * Add a mapping node to a document. +// */ +// +//YAML_DECLARE(int) +//yaml_document_add_mapping(document *yaml_document_t, +// tag *yaml_char_t, style yaml_mapping_style_t) +//{ +// struct { +// error yaml_error_type_t +// } context +// mark yaml_mark_t = { 0, 0, 0 } +// tag_copy *yaml_char_t = NULL +// struct { +// start *yaml_node_pair_t +// end *yaml_node_pair_t +// top *yaml_node_pair_t +// } pairs = { NULL, NULL, NULL } +// node yaml_node_t +// +// assert(document) // Non-NULL document object is expected. +// +// if (!tag) { +// tag = (yaml_char_t *)YAML_DEFAULT_MAPPING_TAG +// } +// +// if (!yaml_check_utf8(tag, strlen((char *)tag))) goto error +// tag_copy = yaml_strdup(tag) +// if (!tag_copy) goto error +// +// if (!STACK_INIT(&context, pairs, INITIAL_STACK_SIZE)) goto error +// +// MAPPING_NODE_INIT(node, tag_copy, pairs.start, pairs.end, +// style, mark, mark) +// if (!PUSH(&context, document.nodes, node)) goto error +// +// return document.nodes.top - document.nodes.start +// +//error: +// STACK_DEL(&context, pairs) +// yaml_free(tag_copy) +// +// return 0 +//} +// +///* +// * Append an item to a sequence node. +// */ +// +//YAML_DECLARE(int) +//yaml_document_append_sequence_item(document *yaml_document_t, +// sequence int, item int) +//{ +// struct { +// error yaml_error_type_t +// } context +// +// assert(document) // Non-NULL document is required. +// assert(sequence > 0 +// && document.nodes.start + sequence <= document.nodes.top) +// // Valid sequence id is required. +// assert(document.nodes.start[sequence-1].type == YAML_SEQUENCE_NODE) +// // A sequence node is required. +// assert(item > 0 && document.nodes.start + item <= document.nodes.top) +// // Valid item id is required. +// +// if (!PUSH(&context, +// document.nodes.start[sequence-1].data.sequence.items, item)) +// return 0 +// +// return 1 +//} +// +///* +// * Append a pair of a key and a value to a mapping node. +// */ +// +//YAML_DECLARE(int) +//yaml_document_append_mapping_pair(document *yaml_document_t, +// mapping int, key int, value int) +//{ +// struct { +// error yaml_error_type_t +// } context +// +// pair yaml_node_pair_t +// +// assert(document) // Non-NULL document is required. +// assert(mapping > 0 +// && document.nodes.start + mapping <= document.nodes.top) +// // Valid mapping id is required. +// assert(document.nodes.start[mapping-1].type == YAML_MAPPING_NODE) +// // A mapping node is required. +// assert(key > 0 && document.nodes.start + key <= document.nodes.top) +// // Valid key id is required. +// assert(value > 0 && document.nodes.start + value <= document.nodes.top) +// // Valid value id is required. +// +// pair.key = key +// pair.value = value +// +// if (!PUSH(&context, +// document.nodes.start[mapping-1].data.mapping.pairs, pair)) +// return 0 +// +// return 1 +//} +// +// diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/decode.go b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/decode.go new file mode 100644 index 0000000000000000000000000000000000000000..085cddc44beb962ede8bcf965cd99ab3110916cd --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/decode.go @@ -0,0 +1,683 @@ +package yaml + +import ( + "encoding" + "encoding/base64" + "fmt" + "math" + "reflect" + "strconv" + "time" +) + +const ( + documentNode = 1 << iota + mappingNode + sequenceNode + scalarNode + aliasNode +) + +type node struct { + kind int + line, column int + tag string + value string + implicit bool + children []*node + anchors map[string]*node +} + +// ---------------------------------------------------------------------------- +// Parser, produces a node tree out of a libyaml event stream. + +type parser struct { + parser yaml_parser_t + event yaml_event_t + doc *node +} + +func newParser(b []byte) *parser { + p := parser{} + if !yaml_parser_initialize(&p.parser) { + panic("failed to initialize YAML emitter") + } + + if len(b) == 0 { + b = []byte{'\n'} + } + + yaml_parser_set_input_string(&p.parser, b) + + p.skip() + if p.event.typ != yaml_STREAM_START_EVENT { + panic("expected stream start event, got " + strconv.Itoa(int(p.event.typ))) + } + p.skip() + return &p +} + +func (p *parser) destroy() { + if p.event.typ != yaml_NO_EVENT { + yaml_event_delete(&p.event) + } + yaml_parser_delete(&p.parser) +} + +func (p *parser) skip() { + if p.event.typ != yaml_NO_EVENT { + if p.event.typ == yaml_STREAM_END_EVENT { + failf("attempted to go past the end of stream; corrupted value?") + } + yaml_event_delete(&p.event) + } + if !yaml_parser_parse(&p.parser, &p.event) { + p.fail() + } +} + +func (p *parser) fail() { + var where string + var line int + if p.parser.problem_mark.line != 0 { + line = p.parser.problem_mark.line + } else if p.parser.context_mark.line != 0 { + line = p.parser.context_mark.line + } + if line != 0 { + where = "line " + strconv.Itoa(line) + ": " + } + var msg string + if len(p.parser.problem) > 0 { + msg = p.parser.problem + } else { + msg = "unknown problem parsing YAML content" + } + failf("%s%s", where, msg) +} + +func (p *parser) anchor(n *node, anchor []byte) { + if anchor != nil { + p.doc.anchors[string(anchor)] = n + } +} + +func (p *parser) parse() *node { + switch p.event.typ { + case yaml_SCALAR_EVENT: + return p.scalar() + case yaml_ALIAS_EVENT: + return p.alias() + case yaml_MAPPING_START_EVENT: + return p.mapping() + case yaml_SEQUENCE_START_EVENT: + return p.sequence() + case yaml_DOCUMENT_START_EVENT: + return p.document() + case yaml_STREAM_END_EVENT: + // Happens when attempting to decode an empty buffer. + return nil + default: + panic("attempted to parse unknown event: " + strconv.Itoa(int(p.event.typ))) + } + panic("unreachable") +} + +func (p *parser) node(kind int) *node { + return &node{ + kind: kind, + line: p.event.start_mark.line, + column: p.event.start_mark.column, + } +} + +func (p *parser) document() *node { + n := p.node(documentNode) + n.anchors = make(map[string]*node) + p.doc = n + p.skip() + n.children = append(n.children, p.parse()) + if p.event.typ != yaml_DOCUMENT_END_EVENT { + panic("expected end of document event but got " + strconv.Itoa(int(p.event.typ))) + } + p.skip() + return n +} + +func (p *parser) alias() *node { + n := p.node(aliasNode) + n.value = string(p.event.anchor) + p.skip() + return n +} + +func (p *parser) scalar() *node { + n := p.node(scalarNode) + n.value = string(p.event.value) + n.tag = string(p.event.tag) + n.implicit = p.event.implicit + p.anchor(n, p.event.anchor) + p.skip() + return n +} + +func (p *parser) sequence() *node { + n := p.node(sequenceNode) + p.anchor(n, p.event.anchor) + p.skip() + for p.event.typ != yaml_SEQUENCE_END_EVENT { + n.children = append(n.children, p.parse()) + } + p.skip() + return n +} + +func (p *parser) mapping() *node { + n := p.node(mappingNode) + p.anchor(n, p.event.anchor) + p.skip() + for p.event.typ != yaml_MAPPING_END_EVENT { + n.children = append(n.children, p.parse(), p.parse()) + } + p.skip() + return n +} + +// ---------------------------------------------------------------------------- +// Decoder, unmarshals a node into a provided value. + +type decoder struct { + doc *node + aliases map[string]bool + mapType reflect.Type + terrors []string +} + +var ( + mapItemType = reflect.TypeOf(MapItem{}) + durationType = reflect.TypeOf(time.Duration(0)) + defaultMapType = reflect.TypeOf(map[interface{}]interface{}{}) + ifaceType = defaultMapType.Elem() +) + +func newDecoder() *decoder { + d := &decoder{mapType: defaultMapType} + d.aliases = make(map[string]bool) + return d +} + +func (d *decoder) terror(n *node, tag string, out reflect.Value) { + if n.tag != "" { + tag = n.tag + } + value := n.value + if tag != yaml_SEQ_TAG && tag != yaml_MAP_TAG { + if len(value) > 10 { + value = " `" + value[:7] + "...`" + } else { + value = " `" + value + "`" + } + } + d.terrors = append(d.terrors, fmt.Sprintf("line %d: cannot unmarshal %s%s into %s", n.line+1, shortTag(tag), value, out.Type())) +} + +func (d *decoder) callUnmarshaler(n *node, u Unmarshaler) (good bool) { + terrlen := len(d.terrors) + err := u.UnmarshalYAML(func(v interface{}) (err error) { + defer handleErr(&err) + d.unmarshal(n, reflect.ValueOf(v)) + if len(d.terrors) > terrlen { + issues := d.terrors[terrlen:] + d.terrors = d.terrors[:terrlen] + return &TypeError{issues} + } + return nil + }) + if e, ok := err.(*TypeError); ok { + d.terrors = append(d.terrors, e.Errors...) + return false + } + if err != nil { + fail(err) + } + return true +} + +// d.prepare initializes and dereferences pointers and calls UnmarshalYAML +// if a value is found to implement it. +// It returns the initialized and dereferenced out value, whether +// unmarshalling was already done by UnmarshalYAML, and if so whether +// its types unmarshalled appropriately. +// +// If n holds a null value, prepare returns before doing anything. +func (d *decoder) prepare(n *node, out reflect.Value) (newout reflect.Value, unmarshaled, good bool) { + if n.tag == yaml_NULL_TAG || n.kind == scalarNode && n.tag == "" && (n.value == "null" || n.value == "") { + return out, false, false + } + again := true + for again { + again = false + if out.Kind() == reflect.Ptr { + if out.IsNil() { + out.Set(reflect.New(out.Type().Elem())) + } + out = out.Elem() + again = true + } + if out.CanAddr() { + if u, ok := out.Addr().Interface().(Unmarshaler); ok { + good = d.callUnmarshaler(n, u) + return out, true, good + } + } + } + return out, false, false +} + +func (d *decoder) unmarshal(n *node, out reflect.Value) (good bool) { + switch n.kind { + case documentNode: + return d.document(n, out) + case aliasNode: + return d.alias(n, out) + } + out, unmarshaled, good := d.prepare(n, out) + if unmarshaled { + return good + } + switch n.kind { + case scalarNode: + good = d.scalar(n, out) + case mappingNode: + good = d.mapping(n, out) + case sequenceNode: + good = d.sequence(n, out) + default: + panic("internal error: unknown node kind: " + strconv.Itoa(n.kind)) + } + return good +} + +func (d *decoder) document(n *node, out reflect.Value) (good bool) { + if len(n.children) == 1 { + d.doc = n + d.unmarshal(n.children[0], out) + return true + } + return false +} + +func (d *decoder) alias(n *node, out reflect.Value) (good bool) { + an, ok := d.doc.anchors[n.value] + if !ok { + failf("unknown anchor '%s' referenced", n.value) + } + if d.aliases[n.value] { + failf("anchor '%s' value contains itself", n.value) + } + d.aliases[n.value] = true + good = d.unmarshal(an, out) + delete(d.aliases, n.value) + return good +} + +var zeroValue reflect.Value + +func resetMap(out reflect.Value) { + for _, k := range out.MapKeys() { + out.SetMapIndex(k, zeroValue) + } +} + +func (d *decoder) scalar(n *node, out reflect.Value) (good bool) { + var tag string + var resolved interface{} + if n.tag == "" && !n.implicit { + tag = yaml_STR_TAG + resolved = n.value + } else { + tag, resolved = resolve(n.tag, n.value) + if tag == yaml_BINARY_TAG { + data, err := base64.StdEncoding.DecodeString(resolved.(string)) + if err != nil { + failf("!!binary value contains invalid base64 data") + } + resolved = string(data) + } + } + if resolved == nil { + if out.Kind() == reflect.Map && !out.CanAddr() { + resetMap(out) + } else { + out.Set(reflect.Zero(out.Type())) + } + return true + } + if s, ok := resolved.(string); ok && out.CanAddr() { + if u, ok := out.Addr().Interface().(encoding.TextUnmarshaler); ok { + err := u.UnmarshalText([]byte(s)) + if err != nil { + fail(err) + } + return true + } + } + switch out.Kind() { + case reflect.String: + if tag == yaml_BINARY_TAG { + out.SetString(resolved.(string)) + good = true + } else if resolved != nil { + out.SetString(n.value) + good = true + } + case reflect.Interface: + if resolved == nil { + out.Set(reflect.Zero(out.Type())) + } else { + out.Set(reflect.ValueOf(resolved)) + } + good = true + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + switch resolved := resolved.(type) { + case int: + if !out.OverflowInt(int64(resolved)) { + out.SetInt(int64(resolved)) + good = true + } + case int64: + if !out.OverflowInt(resolved) { + out.SetInt(resolved) + good = true + } + case uint64: + if resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) { + out.SetInt(int64(resolved)) + good = true + } + case float64: + if resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) { + out.SetInt(int64(resolved)) + good = true + } + case string: + if out.Type() == durationType { + d, err := time.ParseDuration(resolved) + if err == nil { + out.SetInt(int64(d)) + good = true + } + } + } + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + switch resolved := resolved.(type) { + case int: + if resolved >= 0 && !out.OverflowUint(uint64(resolved)) { + out.SetUint(uint64(resolved)) + good = true + } + case int64: + if resolved >= 0 && !out.OverflowUint(uint64(resolved)) { + out.SetUint(uint64(resolved)) + good = true + } + case uint64: + if !out.OverflowUint(uint64(resolved)) { + out.SetUint(uint64(resolved)) + good = true + } + case float64: + if resolved <= math.MaxUint64 && !out.OverflowUint(uint64(resolved)) { + out.SetUint(uint64(resolved)) + good = true + } + } + case reflect.Bool: + switch resolved := resolved.(type) { + case bool: + out.SetBool(resolved) + good = true + } + case reflect.Float32, reflect.Float64: + switch resolved := resolved.(type) { + case int: + out.SetFloat(float64(resolved)) + good = true + case int64: + out.SetFloat(float64(resolved)) + good = true + case uint64: + out.SetFloat(float64(resolved)) + good = true + case float64: + out.SetFloat(resolved) + good = true + } + case reflect.Ptr: + if out.Type().Elem() == reflect.TypeOf(resolved) { + // TODO DOes this make sense? When is out a Ptr except when decoding a nil value? + elem := reflect.New(out.Type().Elem()) + elem.Elem().Set(reflect.ValueOf(resolved)) + out.Set(elem) + good = true + } + } + if !good { + d.terror(n, tag, out) + } + return good +} + +func settableValueOf(i interface{}) reflect.Value { + v := reflect.ValueOf(i) + sv := reflect.New(v.Type()).Elem() + sv.Set(v) + return sv +} + +func (d *decoder) sequence(n *node, out reflect.Value) (good bool) { + l := len(n.children) + + var iface reflect.Value + switch out.Kind() { + case reflect.Slice: + out.Set(reflect.MakeSlice(out.Type(), l, l)) + case reflect.Interface: + // No type hints. Will have to use a generic sequence. + iface = out + out = settableValueOf(make([]interface{}, l)) + default: + d.terror(n, yaml_SEQ_TAG, out) + return false + } + et := out.Type().Elem() + + j := 0 + for i := 0; i < l; i++ { + e := reflect.New(et).Elem() + if ok := d.unmarshal(n.children[i], e); ok { + out.Index(j).Set(e) + j++ + } + } + out.Set(out.Slice(0, j)) + if iface.IsValid() { + iface.Set(out) + } + return true +} + +func (d *decoder) mapping(n *node, out reflect.Value) (good bool) { + switch out.Kind() { + case reflect.Struct: + return d.mappingStruct(n, out) + case reflect.Slice: + return d.mappingSlice(n, out) + case reflect.Map: + // okay + case reflect.Interface: + if d.mapType.Kind() == reflect.Map { + iface := out + out = reflect.MakeMap(d.mapType) + iface.Set(out) + } else { + slicev := reflect.New(d.mapType).Elem() + if !d.mappingSlice(n, slicev) { + return false + } + out.Set(slicev) + return true + } + default: + d.terror(n, yaml_MAP_TAG, out) + return false + } + outt := out.Type() + kt := outt.Key() + et := outt.Elem() + + mapType := d.mapType + if outt.Key() == ifaceType && outt.Elem() == ifaceType { + d.mapType = outt + } + + if out.IsNil() { + out.Set(reflect.MakeMap(outt)) + } + l := len(n.children) + for i := 0; i < l; i += 2 { + if isMerge(n.children[i]) { + d.merge(n.children[i+1], out) + continue + } + k := reflect.New(kt).Elem() + if d.unmarshal(n.children[i], k) { + kkind := k.Kind() + if kkind == reflect.Interface { + kkind = k.Elem().Kind() + } + if kkind == reflect.Map || kkind == reflect.Slice { + failf("invalid map key: %#v", k.Interface()) + } + e := reflect.New(et).Elem() + if d.unmarshal(n.children[i+1], e) { + out.SetMapIndex(k, e) + } + } + } + d.mapType = mapType + return true +} + +func (d *decoder) mappingSlice(n *node, out reflect.Value) (good bool) { + outt := out.Type() + if outt.Elem() != mapItemType { + d.terror(n, yaml_MAP_TAG, out) + return false + } + + mapType := d.mapType + d.mapType = outt + + var slice []MapItem + var l = len(n.children) + for i := 0; i < l; i += 2 { + if isMerge(n.children[i]) { + d.merge(n.children[i+1], out) + continue + } + item := MapItem{} + k := reflect.ValueOf(&item.Key).Elem() + if d.unmarshal(n.children[i], k) { + v := reflect.ValueOf(&item.Value).Elem() + if d.unmarshal(n.children[i+1], v) { + slice = append(slice, item) + } + } + } + out.Set(reflect.ValueOf(slice)) + d.mapType = mapType + return true +} + +func (d *decoder) mappingStruct(n *node, out reflect.Value) (good bool) { + sinfo, err := getStructInfo(out.Type()) + if err != nil { + panic(err) + } + name := settableValueOf("") + l := len(n.children) + + var inlineMap reflect.Value + var elemType reflect.Type + if sinfo.InlineMap != -1 { + inlineMap = out.Field(sinfo.InlineMap) + inlineMap.Set(reflect.New(inlineMap.Type()).Elem()) + elemType = inlineMap.Type().Elem() + } + + for i := 0; i < l; i += 2 { + ni := n.children[i] + if isMerge(ni) { + d.merge(n.children[i+1], out) + continue + } + if !d.unmarshal(ni, name) { + continue + } + if info, ok := sinfo.FieldsMap[name.String()]; ok { + var field reflect.Value + if info.Inline == nil { + field = out.Field(info.Num) + } else { + field = out.FieldByIndex(info.Inline) + } + d.unmarshal(n.children[i+1], field) + } else if sinfo.InlineMap != -1 { + if inlineMap.IsNil() { + inlineMap.Set(reflect.MakeMap(inlineMap.Type())) + } + value := reflect.New(elemType).Elem() + d.unmarshal(n.children[i+1], value) + inlineMap.SetMapIndex(name, value) + } + } + return true +} + +func failWantMap() { + failf("map merge requires map or sequence of maps as the value") +} + +func (d *decoder) merge(n *node, out reflect.Value) { + switch n.kind { + case mappingNode: + d.unmarshal(n, out) + case aliasNode: + an, ok := d.doc.anchors[n.value] + if ok && an.kind != mappingNode { + failWantMap() + } + d.unmarshal(n, out) + case sequenceNode: + // Step backwards as earlier nodes take precedence. + for i := len(n.children) - 1; i >= 0; i-- { + ni := n.children[i] + if ni.kind == aliasNode { + an, ok := d.doc.anchors[ni.value] + if ok && an.kind != mappingNode { + failWantMap() + } + } else if ni.kind != mappingNode { + failWantMap() + } + d.unmarshal(ni, out) + } + default: + failWantMap() + } +} + +func isMerge(n *node) bool { + return n.kind == scalarNode && n.value == "<<" && (n.implicit == true || n.tag == yaml_MERGE_TAG) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/emitterc.go b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/emitterc.go new file mode 100644 index 0000000000000000000000000000000000000000..2befd553ed0263a2bb85819e344e244014dfadc9 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/emitterc.go @@ -0,0 +1,1685 @@ +package yaml + +import ( + "bytes" +) + +// Flush the buffer if needed. +func flush(emitter *yaml_emitter_t) bool { + if emitter.buffer_pos+5 >= len(emitter.buffer) { + return yaml_emitter_flush(emitter) + } + return true +} + +// Put a character to the output buffer. +func put(emitter *yaml_emitter_t, value byte) bool { + if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { + return false + } + emitter.buffer[emitter.buffer_pos] = value + emitter.buffer_pos++ + emitter.column++ + return true +} + +// Put a line break to the output buffer. +func put_break(emitter *yaml_emitter_t) bool { + if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { + return false + } + switch emitter.line_break { + case yaml_CR_BREAK: + emitter.buffer[emitter.buffer_pos] = '\r' + emitter.buffer_pos += 1 + case yaml_LN_BREAK: + emitter.buffer[emitter.buffer_pos] = '\n' + emitter.buffer_pos += 1 + case yaml_CRLN_BREAK: + emitter.buffer[emitter.buffer_pos+0] = '\r' + emitter.buffer[emitter.buffer_pos+1] = '\n' + emitter.buffer_pos += 2 + default: + panic("unknown line break setting") + } + emitter.column = 0 + emitter.line++ + return true +} + +// Copy a character from a string into buffer. +func write(emitter *yaml_emitter_t, s []byte, i *int) bool { + if emitter.buffer_pos+5 >= len(emitter.buffer) && !yaml_emitter_flush(emitter) { + return false + } + p := emitter.buffer_pos + w := width(s[*i]) + switch w { + case 4: + emitter.buffer[p+3] = s[*i+3] + fallthrough + case 3: + emitter.buffer[p+2] = s[*i+2] + fallthrough + case 2: + emitter.buffer[p+1] = s[*i+1] + fallthrough + case 1: + emitter.buffer[p+0] = s[*i+0] + default: + panic("unknown character width") + } + emitter.column++ + emitter.buffer_pos += w + *i += w + return true +} + +// Write a whole string into buffer. +func write_all(emitter *yaml_emitter_t, s []byte) bool { + for i := 0; i < len(s); { + if !write(emitter, s, &i) { + return false + } + } + return true +} + +// Copy a line break character from a string into buffer. +func write_break(emitter *yaml_emitter_t, s []byte, i *int) bool { + if s[*i] == '\n' { + if !put_break(emitter) { + return false + } + *i++ + } else { + if !write(emitter, s, i) { + return false + } + emitter.column = 0 + emitter.line++ + } + return true +} + +// Set an emitter error and return false. +func yaml_emitter_set_emitter_error(emitter *yaml_emitter_t, problem string) bool { + emitter.error = yaml_EMITTER_ERROR + emitter.problem = problem + return false +} + +// Emit an event. +func yaml_emitter_emit(emitter *yaml_emitter_t, event *yaml_event_t) bool { + emitter.events = append(emitter.events, *event) + for !yaml_emitter_need_more_events(emitter) { + event := &emitter.events[emitter.events_head] + if !yaml_emitter_analyze_event(emitter, event) { + return false + } + if !yaml_emitter_state_machine(emitter, event) { + return false + } + yaml_event_delete(event) + emitter.events_head++ + } + return true +} + +// Check if we need to accumulate more events before emitting. +// +// We accumulate extra +// - 1 event for DOCUMENT-START +// - 2 events for SEQUENCE-START +// - 3 events for MAPPING-START +// +func yaml_emitter_need_more_events(emitter *yaml_emitter_t) bool { + if emitter.events_head == len(emitter.events) { + return true + } + var accumulate int + switch emitter.events[emitter.events_head].typ { + case yaml_DOCUMENT_START_EVENT: + accumulate = 1 + break + case yaml_SEQUENCE_START_EVENT: + accumulate = 2 + break + case yaml_MAPPING_START_EVENT: + accumulate = 3 + break + default: + return false + } + if len(emitter.events)-emitter.events_head > accumulate { + return false + } + var level int + for i := emitter.events_head; i < len(emitter.events); i++ { + switch emitter.events[i].typ { + case yaml_STREAM_START_EVENT, yaml_DOCUMENT_START_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT: + level++ + case yaml_STREAM_END_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_END_EVENT, yaml_MAPPING_END_EVENT: + level-- + } + if level == 0 { + return false + } + } + return true +} + +// Append a directive to the directives stack. +func yaml_emitter_append_tag_directive(emitter *yaml_emitter_t, value *yaml_tag_directive_t, allow_duplicates bool) bool { + for i := 0; i < len(emitter.tag_directives); i++ { + if bytes.Equal(value.handle, emitter.tag_directives[i].handle) { + if allow_duplicates { + return true + } + return yaml_emitter_set_emitter_error(emitter, "duplicate %TAG directive") + } + } + + // [Go] Do we actually need to copy this given garbage collection + // and the lack of deallocating destructors? + tag_copy := yaml_tag_directive_t{ + handle: make([]byte, len(value.handle)), + prefix: make([]byte, len(value.prefix)), + } + copy(tag_copy.handle, value.handle) + copy(tag_copy.prefix, value.prefix) + emitter.tag_directives = append(emitter.tag_directives, tag_copy) + return true +} + +// Increase the indentation level. +func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool) bool { + emitter.indents = append(emitter.indents, emitter.indent) + if emitter.indent < 0 { + if flow { + emitter.indent = emitter.best_indent + } else { + emitter.indent = 0 + } + } else if !indentless { + emitter.indent += emitter.best_indent + } + return true +} + +// State dispatcher. +func yaml_emitter_state_machine(emitter *yaml_emitter_t, event *yaml_event_t) bool { + switch emitter.state { + default: + case yaml_EMIT_STREAM_START_STATE: + return yaml_emitter_emit_stream_start(emitter, event) + + case yaml_EMIT_FIRST_DOCUMENT_START_STATE: + return yaml_emitter_emit_document_start(emitter, event, true) + + case yaml_EMIT_DOCUMENT_START_STATE: + return yaml_emitter_emit_document_start(emitter, event, false) + + case yaml_EMIT_DOCUMENT_CONTENT_STATE: + return yaml_emitter_emit_document_content(emitter, event) + + case yaml_EMIT_DOCUMENT_END_STATE: + return yaml_emitter_emit_document_end(emitter, event) + + case yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE: + return yaml_emitter_emit_flow_sequence_item(emitter, event, true) + + case yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE: + return yaml_emitter_emit_flow_sequence_item(emitter, event, false) + + case yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE: + return yaml_emitter_emit_flow_mapping_key(emitter, event, true) + + case yaml_EMIT_FLOW_MAPPING_KEY_STATE: + return yaml_emitter_emit_flow_mapping_key(emitter, event, false) + + case yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE: + return yaml_emitter_emit_flow_mapping_value(emitter, event, true) + + case yaml_EMIT_FLOW_MAPPING_VALUE_STATE: + return yaml_emitter_emit_flow_mapping_value(emitter, event, false) + + case yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE: + return yaml_emitter_emit_block_sequence_item(emitter, event, true) + + case yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE: + return yaml_emitter_emit_block_sequence_item(emitter, event, false) + + case yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE: + return yaml_emitter_emit_block_mapping_key(emitter, event, true) + + case yaml_EMIT_BLOCK_MAPPING_KEY_STATE: + return yaml_emitter_emit_block_mapping_key(emitter, event, false) + + case yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE: + return yaml_emitter_emit_block_mapping_value(emitter, event, true) + + case yaml_EMIT_BLOCK_MAPPING_VALUE_STATE: + return yaml_emitter_emit_block_mapping_value(emitter, event, false) + + case yaml_EMIT_END_STATE: + return yaml_emitter_set_emitter_error(emitter, "expected nothing after STREAM-END") + } + panic("invalid emitter state") +} + +// Expect STREAM-START. +func yaml_emitter_emit_stream_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if event.typ != yaml_STREAM_START_EVENT { + return yaml_emitter_set_emitter_error(emitter, "expected STREAM-START") + } + if emitter.encoding == yaml_ANY_ENCODING { + emitter.encoding = event.encoding + if emitter.encoding == yaml_ANY_ENCODING { + emitter.encoding = yaml_UTF8_ENCODING + } + } + if emitter.best_indent < 2 || emitter.best_indent > 9 { + emitter.best_indent = 2 + } + if emitter.best_width >= 0 && emitter.best_width <= emitter.best_indent*2 { + emitter.best_width = 80 + } + if emitter.best_width < 0 { + emitter.best_width = 1<<31 - 1 + } + if emitter.line_break == yaml_ANY_BREAK { + emitter.line_break = yaml_LN_BREAK + } + + emitter.indent = -1 + emitter.line = 0 + emitter.column = 0 + emitter.whitespace = true + emitter.indention = true + + if emitter.encoding != yaml_UTF8_ENCODING { + if !yaml_emitter_write_bom(emitter) { + return false + } + } + emitter.state = yaml_EMIT_FIRST_DOCUMENT_START_STATE + return true +} + +// Expect DOCUMENT-START or STREAM-END. +func yaml_emitter_emit_document_start(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { + + if event.typ == yaml_DOCUMENT_START_EVENT { + + if event.version_directive != nil { + if !yaml_emitter_analyze_version_directive(emitter, event.version_directive) { + return false + } + } + + for i := 0; i < len(event.tag_directives); i++ { + tag_directive := &event.tag_directives[i] + if !yaml_emitter_analyze_tag_directive(emitter, tag_directive) { + return false + } + if !yaml_emitter_append_tag_directive(emitter, tag_directive, false) { + return false + } + } + + for i := 0; i < len(default_tag_directives); i++ { + tag_directive := &default_tag_directives[i] + if !yaml_emitter_append_tag_directive(emitter, tag_directive, true) { + return false + } + } + + implicit := event.implicit + if !first || emitter.canonical { + implicit = false + } + + if emitter.open_ended && (event.version_directive != nil || len(event.tag_directives) > 0) { + if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + + if event.version_directive != nil { + implicit = false + if !yaml_emitter_write_indicator(emitter, []byte("%YAML"), true, false, false) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte("1.1"), true, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + + if len(event.tag_directives) > 0 { + implicit = false + for i := 0; i < len(event.tag_directives); i++ { + tag_directive := &event.tag_directives[i] + if !yaml_emitter_write_indicator(emitter, []byte("%TAG"), true, false, false) { + return false + } + if !yaml_emitter_write_tag_handle(emitter, tag_directive.handle) { + return false + } + if !yaml_emitter_write_tag_content(emitter, tag_directive.prefix, true) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + } + + if yaml_emitter_check_empty_document(emitter) { + implicit = false + } + if !implicit { + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte("---"), true, false, false) { + return false + } + if emitter.canonical { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + } + + emitter.state = yaml_EMIT_DOCUMENT_CONTENT_STATE + return true + } + + if event.typ == yaml_STREAM_END_EVENT { + if emitter.open_ended { + if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_flush(emitter) { + return false + } + emitter.state = yaml_EMIT_END_STATE + return true + } + + return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-START or STREAM-END") +} + +// Expect the root node. +func yaml_emitter_emit_document_content(emitter *yaml_emitter_t, event *yaml_event_t) bool { + emitter.states = append(emitter.states, yaml_EMIT_DOCUMENT_END_STATE) + return yaml_emitter_emit_node(emitter, event, true, false, false, false) +} + +// Expect DOCUMENT-END. +func yaml_emitter_emit_document_end(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if event.typ != yaml_DOCUMENT_END_EVENT { + return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-END") + } + if !yaml_emitter_write_indent(emitter) { + return false + } + if !event.implicit { + // [Go] Allocate the slice elsewhere. + if !yaml_emitter_write_indicator(emitter, []byte("..."), true, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_flush(emitter) { + return false + } + emitter.state = yaml_EMIT_DOCUMENT_START_STATE + emitter.tag_directives = emitter.tag_directives[:0] + return true +} + +// Expect a flow item node. +func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { + if first { + if !yaml_emitter_write_indicator(emitter, []byte{'['}, true, true, false) { + return false + } + if !yaml_emitter_increase_indent(emitter, true, false) { + return false + } + emitter.flow_level++ + } + + if event.typ == yaml_SEQUENCE_END_EVENT { + emitter.flow_level-- + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + if emitter.canonical && !first { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{']'}, false, false, false) { + return false + } + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + + return true + } + + if !first { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + + if emitter.canonical || emitter.column > emitter.best_width { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE) + return yaml_emitter_emit_node(emitter, event, false, true, false, false) +} + +// Expect a flow key node. +func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { + if first { + if !yaml_emitter_write_indicator(emitter, []byte{'{'}, true, true, false) { + return false + } + if !yaml_emitter_increase_indent(emitter, true, false) { + return false + } + emitter.flow_level++ + } + + if event.typ == yaml_MAPPING_END_EVENT { + emitter.flow_level-- + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + if emitter.canonical && !first { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{'}'}, false, false, false) { + return false + } + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true + } + + if !first { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + if emitter.canonical || emitter.column > emitter.best_width { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + + if !emitter.canonical && yaml_emitter_check_simple_key(emitter) { + emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, true) + } + if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, false) { + return false + } + emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_VALUE_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, false) +} + +// Expect a flow value node. +func yaml_emitter_emit_flow_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool { + if simple { + if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) { + return false + } + } else { + if emitter.canonical || emitter.column > emitter.best_width { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, false) { + return false + } + } + emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_KEY_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, false) +} + +// Expect a block item node. +func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { + if first { + if !yaml_emitter_increase_indent(emitter, false, emitter.mapping_context && !emitter.indention) { + return false + } + } + if event.typ == yaml_SEQUENCE_END_EVENT { + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true + } + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte{'-'}, true, false, true) { + return false + } + emitter.states = append(emitter.states, yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE) + return yaml_emitter_emit_node(emitter, event, false, true, false, false) +} + +// Expect a block key node. +func yaml_emitter_emit_block_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { + if first { + if !yaml_emitter_increase_indent(emitter, false, false) { + return false + } + } + if event.typ == yaml_MAPPING_END_EVENT { + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true + } + if !yaml_emitter_write_indent(emitter) { + return false + } + if yaml_emitter_check_simple_key(emitter) { + emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, true) + } + if !yaml_emitter_write_indicator(emitter, []byte{'?'}, true, false, true) { + return false + } + emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_VALUE_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, false) +} + +// Expect a block value node. +func yaml_emitter_emit_block_mapping_value(emitter *yaml_emitter_t, event *yaml_event_t, simple bool) bool { + if simple { + if !yaml_emitter_write_indicator(emitter, []byte{':'}, false, false, false) { + return false + } + } else { + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte{':'}, true, false, true) { + return false + } + } + emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_KEY_STATE) + return yaml_emitter_emit_node(emitter, event, false, false, true, false) +} + +// Expect a node. +func yaml_emitter_emit_node(emitter *yaml_emitter_t, event *yaml_event_t, + root bool, sequence bool, mapping bool, simple_key bool) bool { + + emitter.root_context = root + emitter.sequence_context = sequence + emitter.mapping_context = mapping + emitter.simple_key_context = simple_key + + switch event.typ { + case yaml_ALIAS_EVENT: + return yaml_emitter_emit_alias(emitter, event) + case yaml_SCALAR_EVENT: + return yaml_emitter_emit_scalar(emitter, event) + case yaml_SEQUENCE_START_EVENT: + return yaml_emitter_emit_sequence_start(emitter, event) + case yaml_MAPPING_START_EVENT: + return yaml_emitter_emit_mapping_start(emitter, event) + default: + return yaml_emitter_set_emitter_error(emitter, + "expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS") + } + return false +} + +// Expect ALIAS. +func yaml_emitter_emit_alias(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if !yaml_emitter_process_anchor(emitter) { + return false + } + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true +} + +// Expect SCALAR. +func yaml_emitter_emit_scalar(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if !yaml_emitter_select_scalar_style(emitter, event) { + return false + } + if !yaml_emitter_process_anchor(emitter) { + return false + } + if !yaml_emitter_process_tag(emitter) { + return false + } + if !yaml_emitter_increase_indent(emitter, true, false) { + return false + } + if !yaml_emitter_process_scalar(emitter) { + return false + } + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + emitter.state = emitter.states[len(emitter.states)-1] + emitter.states = emitter.states[:len(emitter.states)-1] + return true +} + +// Expect SEQUENCE-START. +func yaml_emitter_emit_sequence_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if !yaml_emitter_process_anchor(emitter) { + return false + } + if !yaml_emitter_process_tag(emitter) { + return false + } + if emitter.flow_level > 0 || emitter.canonical || event.sequence_style() == yaml_FLOW_SEQUENCE_STYLE || + yaml_emitter_check_empty_sequence(emitter) { + emitter.state = yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE + } else { + emitter.state = yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE + } + return true +} + +// Expect MAPPING-START. +func yaml_emitter_emit_mapping_start(emitter *yaml_emitter_t, event *yaml_event_t) bool { + if !yaml_emitter_process_anchor(emitter) { + return false + } + if !yaml_emitter_process_tag(emitter) { + return false + } + if emitter.flow_level > 0 || emitter.canonical || event.mapping_style() == yaml_FLOW_MAPPING_STYLE || + yaml_emitter_check_empty_mapping(emitter) { + emitter.state = yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE + } else { + emitter.state = yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE + } + return true +} + +// Check if the document content is an empty scalar. +func yaml_emitter_check_empty_document(emitter *yaml_emitter_t) bool { + return false // [Go] Huh? +} + +// Check if the next events represent an empty sequence. +func yaml_emitter_check_empty_sequence(emitter *yaml_emitter_t) bool { + if len(emitter.events)-emitter.events_head < 2 { + return false + } + return emitter.events[emitter.events_head].typ == yaml_SEQUENCE_START_EVENT && + emitter.events[emitter.events_head+1].typ == yaml_SEQUENCE_END_EVENT +} + +// Check if the next events represent an empty mapping. +func yaml_emitter_check_empty_mapping(emitter *yaml_emitter_t) bool { + if len(emitter.events)-emitter.events_head < 2 { + return false + } + return emitter.events[emitter.events_head].typ == yaml_MAPPING_START_EVENT && + emitter.events[emitter.events_head+1].typ == yaml_MAPPING_END_EVENT +} + +// Check if the next node can be expressed as a simple key. +func yaml_emitter_check_simple_key(emitter *yaml_emitter_t) bool { + length := 0 + switch emitter.events[emitter.events_head].typ { + case yaml_ALIAS_EVENT: + length += len(emitter.anchor_data.anchor) + case yaml_SCALAR_EVENT: + if emitter.scalar_data.multiline { + return false + } + length += len(emitter.anchor_data.anchor) + + len(emitter.tag_data.handle) + + len(emitter.tag_data.suffix) + + len(emitter.scalar_data.value) + case yaml_SEQUENCE_START_EVENT: + if !yaml_emitter_check_empty_sequence(emitter) { + return false + } + length += len(emitter.anchor_data.anchor) + + len(emitter.tag_data.handle) + + len(emitter.tag_data.suffix) + case yaml_MAPPING_START_EVENT: + if !yaml_emitter_check_empty_mapping(emitter) { + return false + } + length += len(emitter.anchor_data.anchor) + + len(emitter.tag_data.handle) + + len(emitter.tag_data.suffix) + default: + return false + } + return length <= 128 +} + +// Determine an acceptable scalar style. +func yaml_emitter_select_scalar_style(emitter *yaml_emitter_t, event *yaml_event_t) bool { + + no_tag := len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 + if no_tag && !event.implicit && !event.quoted_implicit { + return yaml_emitter_set_emitter_error(emitter, "neither tag nor implicit flags are specified") + } + + style := event.scalar_style() + if style == yaml_ANY_SCALAR_STYLE { + style = yaml_PLAIN_SCALAR_STYLE + } + if emitter.canonical { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + if emitter.simple_key_context && emitter.scalar_data.multiline { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + + if style == yaml_PLAIN_SCALAR_STYLE { + if emitter.flow_level > 0 && !emitter.scalar_data.flow_plain_allowed || + emitter.flow_level == 0 && !emitter.scalar_data.block_plain_allowed { + style = yaml_SINGLE_QUOTED_SCALAR_STYLE + } + if len(emitter.scalar_data.value) == 0 && (emitter.flow_level > 0 || emitter.simple_key_context) { + style = yaml_SINGLE_QUOTED_SCALAR_STYLE + } + if no_tag && !event.implicit { + style = yaml_SINGLE_QUOTED_SCALAR_STYLE + } + } + if style == yaml_SINGLE_QUOTED_SCALAR_STYLE { + if !emitter.scalar_data.single_quoted_allowed { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + } + if style == yaml_LITERAL_SCALAR_STYLE || style == yaml_FOLDED_SCALAR_STYLE { + if !emitter.scalar_data.block_allowed || emitter.flow_level > 0 || emitter.simple_key_context { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + } + + if no_tag && !event.quoted_implicit && style != yaml_PLAIN_SCALAR_STYLE { + emitter.tag_data.handle = []byte{'!'} + } + emitter.scalar_data.style = style + return true +} + +// Write an achor. +func yaml_emitter_process_anchor(emitter *yaml_emitter_t) bool { + if emitter.anchor_data.anchor == nil { + return true + } + c := []byte{'&'} + if emitter.anchor_data.alias { + c[0] = '*' + } + if !yaml_emitter_write_indicator(emitter, c, true, false, false) { + return false + } + return yaml_emitter_write_anchor(emitter, emitter.anchor_data.anchor) +} + +// Write a tag. +func yaml_emitter_process_tag(emitter *yaml_emitter_t) bool { + if len(emitter.tag_data.handle) == 0 && len(emitter.tag_data.suffix) == 0 { + return true + } + if len(emitter.tag_data.handle) > 0 { + if !yaml_emitter_write_tag_handle(emitter, emitter.tag_data.handle) { + return false + } + if len(emitter.tag_data.suffix) > 0 { + if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) { + return false + } + } + } else { + // [Go] Allocate these slices elsewhere. + if !yaml_emitter_write_indicator(emitter, []byte("!<"), true, false, false) { + return false + } + if !yaml_emitter_write_tag_content(emitter, emitter.tag_data.suffix, false) { + return false + } + if !yaml_emitter_write_indicator(emitter, []byte{'>'}, false, false, false) { + return false + } + } + return true +} + +// Write a scalar. +func yaml_emitter_process_scalar(emitter *yaml_emitter_t) bool { + switch emitter.scalar_data.style { + case yaml_PLAIN_SCALAR_STYLE: + return yaml_emitter_write_plain_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) + + case yaml_SINGLE_QUOTED_SCALAR_STYLE: + return yaml_emitter_write_single_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) + + case yaml_DOUBLE_QUOTED_SCALAR_STYLE: + return yaml_emitter_write_double_quoted_scalar(emitter, emitter.scalar_data.value, !emitter.simple_key_context) + + case yaml_LITERAL_SCALAR_STYLE: + return yaml_emitter_write_literal_scalar(emitter, emitter.scalar_data.value) + + case yaml_FOLDED_SCALAR_STYLE: + return yaml_emitter_write_folded_scalar(emitter, emitter.scalar_data.value) + } + panic("unknown scalar style") +} + +// Check if a %YAML directive is valid. +func yaml_emitter_analyze_version_directive(emitter *yaml_emitter_t, version_directive *yaml_version_directive_t) bool { + if version_directive.major != 1 || version_directive.minor != 1 { + return yaml_emitter_set_emitter_error(emitter, "incompatible %YAML directive") + } + return true +} + +// Check if a %TAG directive is valid. +func yaml_emitter_analyze_tag_directive(emitter *yaml_emitter_t, tag_directive *yaml_tag_directive_t) bool { + handle := tag_directive.handle + prefix := tag_directive.prefix + if len(handle) == 0 { + return yaml_emitter_set_emitter_error(emitter, "tag handle must not be empty") + } + if handle[0] != '!' { + return yaml_emitter_set_emitter_error(emitter, "tag handle must start with '!'") + } + if handle[len(handle)-1] != '!' { + return yaml_emitter_set_emitter_error(emitter, "tag handle must end with '!'") + } + for i := 1; i < len(handle)-1; i += width(handle[i]) { + if !is_alpha(handle, i) { + return yaml_emitter_set_emitter_error(emitter, "tag handle must contain alphanumerical characters only") + } + } + if len(prefix) == 0 { + return yaml_emitter_set_emitter_error(emitter, "tag prefix must not be empty") + } + return true +} + +// Check if an anchor is valid. +func yaml_emitter_analyze_anchor(emitter *yaml_emitter_t, anchor []byte, alias bool) bool { + if len(anchor) == 0 { + problem := "anchor value must not be empty" + if alias { + problem = "alias value must not be empty" + } + return yaml_emitter_set_emitter_error(emitter, problem) + } + for i := 0; i < len(anchor); i += width(anchor[i]) { + if !is_alpha(anchor, i) { + problem := "anchor value must contain alphanumerical characters only" + if alias { + problem = "alias value must contain alphanumerical characters only" + } + return yaml_emitter_set_emitter_error(emitter, problem) + } + } + emitter.anchor_data.anchor = anchor + emitter.anchor_data.alias = alias + return true +} + +// Check if a tag is valid. +func yaml_emitter_analyze_tag(emitter *yaml_emitter_t, tag []byte) bool { + if len(tag) == 0 { + return yaml_emitter_set_emitter_error(emitter, "tag value must not be empty") + } + for i := 0; i < len(emitter.tag_directives); i++ { + tag_directive := &emitter.tag_directives[i] + if bytes.HasPrefix(tag, tag_directive.prefix) { + emitter.tag_data.handle = tag_directive.handle + emitter.tag_data.suffix = tag[len(tag_directive.prefix):] + return true + } + } + emitter.tag_data.suffix = tag + return true +} + +// Check if a scalar is valid. +func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool { + var ( + block_indicators = false + flow_indicators = false + line_breaks = false + special_characters = false + + leading_space = false + leading_break = false + trailing_space = false + trailing_break = false + break_space = false + space_break = false + + preceeded_by_whitespace = false + followed_by_whitespace = false + previous_space = false + previous_break = false + ) + + emitter.scalar_data.value = value + + if len(value) == 0 { + emitter.scalar_data.multiline = false + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = true + emitter.scalar_data.single_quoted_allowed = true + emitter.scalar_data.block_allowed = false + return true + } + + if len(value) >= 3 && ((value[0] == '-' && value[1] == '-' && value[2] == '-') || (value[0] == '.' && value[1] == '.' && value[2] == '.')) { + block_indicators = true + flow_indicators = true + } + + preceeded_by_whitespace = true + for i, w := 0, 0; i < len(value); i += w { + w = width(value[i]) + followed_by_whitespace = i+w >= len(value) || is_blank(value, i+w) + + if i == 0 { + switch value[i] { + case '#', ',', '[', ']', '{', '}', '&', '*', '!', '|', '>', '\'', '"', '%', '@', '`': + flow_indicators = true + block_indicators = true + case '?', ':': + flow_indicators = true + if followed_by_whitespace { + block_indicators = true + } + case '-': + if followed_by_whitespace { + flow_indicators = true + block_indicators = true + } + } + } else { + switch value[i] { + case ',', '?', '[', ']', '{', '}': + flow_indicators = true + case ':': + flow_indicators = true + if followed_by_whitespace { + block_indicators = true + } + case '#': + if preceeded_by_whitespace { + flow_indicators = true + block_indicators = true + } + } + } + + if !is_printable(value, i) || !is_ascii(value, i) && !emitter.unicode { + special_characters = true + } + if is_space(value, i) { + if i == 0 { + leading_space = true + } + if i+width(value[i]) == len(value) { + trailing_space = true + } + if previous_break { + break_space = true + } + previous_space = true + previous_break = false + } else if is_break(value, i) { + line_breaks = true + if i == 0 { + leading_break = true + } + if i+width(value[i]) == len(value) { + trailing_break = true + } + if previous_space { + space_break = true + } + previous_space = false + previous_break = true + } else { + previous_space = false + previous_break = false + } + + // [Go]: Why 'z'? Couldn't be the end of the string as that's the loop condition. + preceeded_by_whitespace = is_blankz(value, i) + } + + emitter.scalar_data.multiline = line_breaks + emitter.scalar_data.flow_plain_allowed = true + emitter.scalar_data.block_plain_allowed = true + emitter.scalar_data.single_quoted_allowed = true + emitter.scalar_data.block_allowed = true + + if leading_space || leading_break || trailing_space || trailing_break { + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = false + } + if trailing_space { + emitter.scalar_data.block_allowed = false + } + if break_space { + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = false + emitter.scalar_data.single_quoted_allowed = false + } + if space_break || special_characters { + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = false + emitter.scalar_data.single_quoted_allowed = false + emitter.scalar_data.block_allowed = false + } + if line_breaks { + emitter.scalar_data.flow_plain_allowed = false + emitter.scalar_data.block_plain_allowed = false + } + if flow_indicators { + emitter.scalar_data.flow_plain_allowed = false + } + if block_indicators { + emitter.scalar_data.block_plain_allowed = false + } + return true +} + +// Check if the event data is valid. +func yaml_emitter_analyze_event(emitter *yaml_emitter_t, event *yaml_event_t) bool { + + emitter.anchor_data.anchor = nil + emitter.tag_data.handle = nil + emitter.tag_data.suffix = nil + emitter.scalar_data.value = nil + + switch event.typ { + case yaml_ALIAS_EVENT: + if !yaml_emitter_analyze_anchor(emitter, event.anchor, true) { + return false + } + + case yaml_SCALAR_EVENT: + if len(event.anchor) > 0 { + if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { + return false + } + } + if len(event.tag) > 0 && (emitter.canonical || (!event.implicit && !event.quoted_implicit)) { + if !yaml_emitter_analyze_tag(emitter, event.tag) { + return false + } + } + if !yaml_emitter_analyze_scalar(emitter, event.value) { + return false + } + + case yaml_SEQUENCE_START_EVENT: + if len(event.anchor) > 0 { + if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { + return false + } + } + if len(event.tag) > 0 && (emitter.canonical || !event.implicit) { + if !yaml_emitter_analyze_tag(emitter, event.tag) { + return false + } + } + + case yaml_MAPPING_START_EVENT: + if len(event.anchor) > 0 { + if !yaml_emitter_analyze_anchor(emitter, event.anchor, false) { + return false + } + } + if len(event.tag) > 0 && (emitter.canonical || !event.implicit) { + if !yaml_emitter_analyze_tag(emitter, event.tag) { + return false + } + } + } + return true +} + +// Write the BOM character. +func yaml_emitter_write_bom(emitter *yaml_emitter_t) bool { + if !flush(emitter) { + return false + } + pos := emitter.buffer_pos + emitter.buffer[pos+0] = '\xEF' + emitter.buffer[pos+1] = '\xBB' + emitter.buffer[pos+2] = '\xBF' + emitter.buffer_pos += 3 + return true +} + +func yaml_emitter_write_indent(emitter *yaml_emitter_t) bool { + indent := emitter.indent + if indent < 0 { + indent = 0 + } + if !emitter.indention || emitter.column > indent || (emitter.column == indent && !emitter.whitespace) { + if !put_break(emitter) { + return false + } + } + for emitter.column < indent { + if !put(emitter, ' ') { + return false + } + } + emitter.whitespace = true + emitter.indention = true + return true +} + +func yaml_emitter_write_indicator(emitter *yaml_emitter_t, indicator []byte, need_whitespace, is_whitespace, is_indention bool) bool { + if need_whitespace && !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + if !write_all(emitter, indicator) { + return false + } + emitter.whitespace = is_whitespace + emitter.indention = (emitter.indention && is_indention) + emitter.open_ended = false + return true +} + +func yaml_emitter_write_anchor(emitter *yaml_emitter_t, value []byte) bool { + if !write_all(emitter, value) { + return false + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_tag_handle(emitter *yaml_emitter_t, value []byte) bool { + if !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + if !write_all(emitter, value) { + return false + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_tag_content(emitter *yaml_emitter_t, value []byte, need_whitespace bool) bool { + if need_whitespace && !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + for i := 0; i < len(value); { + var must_write bool + switch value[i] { + case ';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '_', '.', '~', '*', '\'', '(', ')', '[', ']': + must_write = true + default: + must_write = is_alpha(value, i) + } + if must_write { + if !write(emitter, value, &i) { + return false + } + } else { + w := width(value[i]) + for k := 0; k < w; k++ { + octet := value[i] + i++ + if !put(emitter, '%') { + return false + } + + c := octet >> 4 + if c < 10 { + c += '0' + } else { + c += 'A' - 10 + } + if !put(emitter, c) { + return false + } + + c = octet & 0x0f + if c < 10 { + c += '0' + } else { + c += 'A' - 10 + } + if !put(emitter, c) { + return false + } + } + } + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_plain_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { + if !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + + spaces := false + breaks := false + for i := 0; i < len(value); { + if is_space(value, i) { + if allow_breaks && !spaces && emitter.column > emitter.best_width && !is_space(value, i+1) { + if !yaml_emitter_write_indent(emitter) { + return false + } + i += width(value[i]) + } else { + if !write(emitter, value, &i) { + return false + } + } + spaces = true + } else if is_break(value, i) { + if !breaks && value[i] == '\n' { + if !put_break(emitter) { + return false + } + } + if !write_break(emitter, value, &i) { + return false + } + emitter.indention = true + breaks = true + } else { + if breaks { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !write(emitter, value, &i) { + return false + } + emitter.indention = false + spaces = false + breaks = false + } + } + + emitter.whitespace = false + emitter.indention = false + if emitter.root_context { + emitter.open_ended = true + } + + return true +} + +func yaml_emitter_write_single_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { + + if !yaml_emitter_write_indicator(emitter, []byte{'\''}, true, false, false) { + return false + } + + spaces := false + breaks := false + for i := 0; i < len(value); { + if is_space(value, i) { + if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 && !is_space(value, i+1) { + if !yaml_emitter_write_indent(emitter) { + return false + } + i += width(value[i]) + } else { + if !write(emitter, value, &i) { + return false + } + } + spaces = true + } else if is_break(value, i) { + if !breaks && value[i] == '\n' { + if !put_break(emitter) { + return false + } + } + if !write_break(emitter, value, &i) { + return false + } + emitter.indention = true + breaks = true + } else { + if breaks { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if value[i] == '\'' { + if !put(emitter, '\'') { + return false + } + } + if !write(emitter, value, &i) { + return false + } + emitter.indention = false + spaces = false + breaks = false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{'\''}, false, false, false) { + return false + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_double_quoted_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { + spaces := false + if !yaml_emitter_write_indicator(emitter, []byte{'"'}, true, false, false) { + return false + } + + for i := 0; i < len(value); { + if !is_printable(value, i) || (!emitter.unicode && !is_ascii(value, i)) || + is_bom(value, i) || is_break(value, i) || + value[i] == '"' || value[i] == '\\' { + + octet := value[i] + + var w int + var v rune + switch { + case octet&0x80 == 0x00: + w, v = 1, rune(octet&0x7F) + case octet&0xE0 == 0xC0: + w, v = 2, rune(octet&0x1F) + case octet&0xF0 == 0xE0: + w, v = 3, rune(octet&0x0F) + case octet&0xF8 == 0xF0: + w, v = 4, rune(octet&0x07) + } + for k := 1; k < w; k++ { + octet = value[i+k] + v = (v << 6) + (rune(octet) & 0x3F) + } + i += w + + if !put(emitter, '\\') { + return false + } + + var ok bool + switch v { + case 0x00: + ok = put(emitter, '0') + case 0x07: + ok = put(emitter, 'a') + case 0x08: + ok = put(emitter, 'b') + case 0x09: + ok = put(emitter, 't') + case 0x0A: + ok = put(emitter, 'n') + case 0x0b: + ok = put(emitter, 'v') + case 0x0c: + ok = put(emitter, 'f') + case 0x0d: + ok = put(emitter, 'r') + case 0x1b: + ok = put(emitter, 'e') + case 0x22: + ok = put(emitter, '"') + case 0x5c: + ok = put(emitter, '\\') + case 0x85: + ok = put(emitter, 'N') + case 0xA0: + ok = put(emitter, '_') + case 0x2028: + ok = put(emitter, 'L') + case 0x2029: + ok = put(emitter, 'P') + default: + if v <= 0xFF { + ok = put(emitter, 'x') + w = 2 + } else if v <= 0xFFFF { + ok = put(emitter, 'u') + w = 4 + } else { + ok = put(emitter, 'U') + w = 8 + } + for k := (w - 1) * 4; ok && k >= 0; k -= 4 { + digit := byte((v >> uint(k)) & 0x0F) + if digit < 10 { + ok = put(emitter, digit+'0') + } else { + ok = put(emitter, digit+'A'-10) + } + } + } + if !ok { + return false + } + spaces = false + } else if is_space(value, i) { + if allow_breaks && !spaces && emitter.column > emitter.best_width && i > 0 && i < len(value)-1 { + if !yaml_emitter_write_indent(emitter) { + return false + } + if is_space(value, i+1) { + if !put(emitter, '\\') { + return false + } + } + i += width(value[i]) + } else if !write(emitter, value, &i) { + return false + } + spaces = true + } else { + if !write(emitter, value, &i) { + return false + } + spaces = false + } + } + if !yaml_emitter_write_indicator(emitter, []byte{'"'}, false, false, false) { + return false + } + emitter.whitespace = false + emitter.indention = false + return true +} + +func yaml_emitter_write_block_scalar_hints(emitter *yaml_emitter_t, value []byte) bool { + if is_space(value, 0) || is_break(value, 0) { + indent_hint := []byte{'0' + byte(emitter.best_indent)} + if !yaml_emitter_write_indicator(emitter, indent_hint, false, false, false) { + return false + } + } + + emitter.open_ended = false + + var chomp_hint [1]byte + if len(value) == 0 { + chomp_hint[0] = '-' + } else { + i := len(value) - 1 + for value[i]&0xC0 == 0x80 { + i-- + } + if !is_break(value, i) { + chomp_hint[0] = '-' + } else if i == 0 { + chomp_hint[0] = '+' + emitter.open_ended = true + } else { + i-- + for value[i]&0xC0 == 0x80 { + i-- + } + if is_break(value, i) { + chomp_hint[0] = '+' + emitter.open_ended = true + } + } + } + if chomp_hint[0] != 0 { + if !yaml_emitter_write_indicator(emitter, chomp_hint[:], false, false, false) { + return false + } + } + return true +} + +func yaml_emitter_write_literal_scalar(emitter *yaml_emitter_t, value []byte) bool { + if !yaml_emitter_write_indicator(emitter, []byte{'|'}, true, false, false) { + return false + } + if !yaml_emitter_write_block_scalar_hints(emitter, value) { + return false + } + if !put_break(emitter) { + return false + } + emitter.indention = true + emitter.whitespace = true + breaks := true + for i := 0; i < len(value); { + if is_break(value, i) { + if !write_break(emitter, value, &i) { + return false + } + emitter.indention = true + breaks = true + } else { + if breaks { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if !write(emitter, value, &i) { + return false + } + emitter.indention = false + breaks = false + } + } + + return true +} + +func yaml_emitter_write_folded_scalar(emitter *yaml_emitter_t, value []byte) bool { + if !yaml_emitter_write_indicator(emitter, []byte{'>'}, true, false, false) { + return false + } + if !yaml_emitter_write_block_scalar_hints(emitter, value) { + return false + } + + if !put_break(emitter) { + return false + } + emitter.indention = true + emitter.whitespace = true + + breaks := true + leading_spaces := true + for i := 0; i < len(value); { + if is_break(value, i) { + if !breaks && !leading_spaces && value[i] == '\n' { + k := 0 + for is_break(value, k) { + k += width(value[k]) + } + if !is_blankz(value, k) { + if !put_break(emitter) { + return false + } + } + } + if !write_break(emitter, value, &i) { + return false + } + emitter.indention = true + breaks = true + } else { + if breaks { + if !yaml_emitter_write_indent(emitter) { + return false + } + leading_spaces = is_blank(value, i) + } + if !breaks && is_space(value, i) && !is_space(value, i+1) && emitter.column > emitter.best_width { + if !yaml_emitter_write_indent(emitter) { + return false + } + i += width(value[i]) + } else { + if !write(emitter, value, &i) { + return false + } + } + emitter.indention = false + breaks = false + } + } + return true +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/encode.go b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/encode.go new file mode 100644 index 0000000000000000000000000000000000000000..84f84995517b6bced35582e4890988cab474e934 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/encode.go @@ -0,0 +1,306 @@ +package yaml + +import ( + "encoding" + "fmt" + "reflect" + "regexp" + "sort" + "strconv" + "strings" + "time" +) + +type encoder struct { + emitter yaml_emitter_t + event yaml_event_t + out []byte + flow bool +} + +func newEncoder() (e *encoder) { + e = &encoder{} + e.must(yaml_emitter_initialize(&e.emitter)) + yaml_emitter_set_output_string(&e.emitter, &e.out) + yaml_emitter_set_unicode(&e.emitter, true) + e.must(yaml_stream_start_event_initialize(&e.event, yaml_UTF8_ENCODING)) + e.emit() + e.must(yaml_document_start_event_initialize(&e.event, nil, nil, true)) + e.emit() + return e +} + +func (e *encoder) finish() { + e.must(yaml_document_end_event_initialize(&e.event, true)) + e.emit() + e.emitter.open_ended = false + e.must(yaml_stream_end_event_initialize(&e.event)) + e.emit() +} + +func (e *encoder) destroy() { + yaml_emitter_delete(&e.emitter) +} + +func (e *encoder) emit() { + // This will internally delete the e.event value. + if !yaml_emitter_emit(&e.emitter, &e.event) && e.event.typ != yaml_DOCUMENT_END_EVENT && e.event.typ != yaml_STREAM_END_EVENT { + e.must(false) + } +} + +func (e *encoder) must(ok bool) { + if !ok { + msg := e.emitter.problem + if msg == "" { + msg = "unknown problem generating YAML content" + } + failf("%s", msg) + } +} + +func (e *encoder) marshal(tag string, in reflect.Value) { + if !in.IsValid() { + e.nilv() + return + } + iface := in.Interface() + if m, ok := iface.(Marshaler); ok { + v, err := m.MarshalYAML() + if err != nil { + fail(err) + } + if v == nil { + e.nilv() + return + } + in = reflect.ValueOf(v) + } else if m, ok := iface.(encoding.TextMarshaler); ok { + text, err := m.MarshalText() + if err != nil { + fail(err) + } + in = reflect.ValueOf(string(text)) + } + switch in.Kind() { + case reflect.Interface: + if in.IsNil() { + e.nilv() + } else { + e.marshal(tag, in.Elem()) + } + case reflect.Map: + e.mapv(tag, in) + case reflect.Ptr: + if in.IsNil() { + e.nilv() + } else { + e.marshal(tag, in.Elem()) + } + case reflect.Struct: + e.structv(tag, in) + case reflect.Slice: + if in.Type().Elem() == mapItemType { + e.itemsv(tag, in) + } else { + e.slicev(tag, in) + } + case reflect.String: + e.stringv(tag, in) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + if in.Type() == durationType { + e.stringv(tag, reflect.ValueOf(iface.(time.Duration).String())) + } else { + e.intv(tag, in) + } + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + e.uintv(tag, in) + case reflect.Float32, reflect.Float64: + e.floatv(tag, in) + case reflect.Bool: + e.boolv(tag, in) + default: + panic("cannot marshal type: " + in.Type().String()) + } +} + +func (e *encoder) mapv(tag string, in reflect.Value) { + e.mappingv(tag, func() { + keys := keyList(in.MapKeys()) + sort.Sort(keys) + for _, k := range keys { + e.marshal("", k) + e.marshal("", in.MapIndex(k)) + } + }) +} + +func (e *encoder) itemsv(tag string, in reflect.Value) { + e.mappingv(tag, func() { + slice := in.Convert(reflect.TypeOf([]MapItem{})).Interface().([]MapItem) + for _, item := range slice { + e.marshal("", reflect.ValueOf(item.Key)) + e.marshal("", reflect.ValueOf(item.Value)) + } + }) +} + +func (e *encoder) structv(tag string, in reflect.Value) { + sinfo, err := getStructInfo(in.Type()) + if err != nil { + panic(err) + } + e.mappingv(tag, func() { + for _, info := range sinfo.FieldsList { + var value reflect.Value + if info.Inline == nil { + value = in.Field(info.Num) + } else { + value = in.FieldByIndex(info.Inline) + } + if info.OmitEmpty && isZero(value) { + continue + } + e.marshal("", reflect.ValueOf(info.Key)) + e.flow = info.Flow + e.marshal("", value) + } + if sinfo.InlineMap >= 0 { + m := in.Field(sinfo.InlineMap) + if m.Len() > 0 { + e.flow = false + keys := keyList(m.MapKeys()) + sort.Sort(keys) + for _, k := range keys { + if _, found := sinfo.FieldsMap[k.String()]; found { + panic(fmt.Sprintf("Can't have key %q in inlined map; conflicts with struct field", k.String())) + } + e.marshal("", k) + e.flow = false + e.marshal("", m.MapIndex(k)) + } + } + } + }) +} + +func (e *encoder) mappingv(tag string, f func()) { + implicit := tag == "" + style := yaml_BLOCK_MAPPING_STYLE + if e.flow { + e.flow = false + style = yaml_FLOW_MAPPING_STYLE + } + e.must(yaml_mapping_start_event_initialize(&e.event, nil, []byte(tag), implicit, style)) + e.emit() + f() + e.must(yaml_mapping_end_event_initialize(&e.event)) + e.emit() +} + +func (e *encoder) slicev(tag string, in reflect.Value) { + implicit := tag == "" + style := yaml_BLOCK_SEQUENCE_STYLE + if e.flow { + e.flow = false + style = yaml_FLOW_SEQUENCE_STYLE + } + e.must(yaml_sequence_start_event_initialize(&e.event, nil, []byte(tag), implicit, style)) + e.emit() + n := in.Len() + for i := 0; i < n; i++ { + e.marshal("", in.Index(i)) + } + e.must(yaml_sequence_end_event_initialize(&e.event)) + e.emit() +} + +// isBase60 returns whether s is in base 60 notation as defined in YAML 1.1. +// +// The base 60 float notation in YAML 1.1 is a terrible idea and is unsupported +// in YAML 1.2 and by this package, but these should be marshalled quoted for +// the time being for compatibility with other parsers. +func isBase60Float(s string) (result bool) { + // Fast path. + if s == "" { + return false + } + c := s[0] + if !(c == '+' || c == '-' || c >= '0' && c <= '9') || strings.IndexByte(s, ':') < 0 { + return false + } + // Do the full match. + return base60float.MatchString(s) +} + +// From http://yaml.org/type/float.html, except the regular expression there +// is bogus. In practice parsers do not enforce the "\.[0-9_]*" suffix. +var base60float = regexp.MustCompile(`^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+(?:\.[0-9_]*)?$`) + +func (e *encoder) stringv(tag string, in reflect.Value) { + var style yaml_scalar_style_t + s := in.String() + rtag, rs := resolve("", s) + if rtag == yaml_BINARY_TAG { + if tag == "" || tag == yaml_STR_TAG { + tag = rtag + s = rs.(string) + } else if tag == yaml_BINARY_TAG { + failf("explicitly tagged !!binary data must be base64-encoded") + } else { + failf("cannot marshal invalid UTF-8 data as %s", shortTag(tag)) + } + } + if tag == "" && (rtag != yaml_STR_TAG || isBase60Float(s)) { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } else if strings.Contains(s, "\n") { + style = yaml_LITERAL_SCALAR_STYLE + } else { + style = yaml_PLAIN_SCALAR_STYLE + } + e.emitScalar(s, "", tag, style) +} + +func (e *encoder) boolv(tag string, in reflect.Value) { + var s string + if in.Bool() { + s = "true" + } else { + s = "false" + } + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) +} + +func (e *encoder) intv(tag string, in reflect.Value) { + s := strconv.FormatInt(in.Int(), 10) + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) +} + +func (e *encoder) uintv(tag string, in reflect.Value) { + s := strconv.FormatUint(in.Uint(), 10) + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) +} + +func (e *encoder) floatv(tag string, in reflect.Value) { + // FIXME: Handle 64 bits here. + s := strconv.FormatFloat(float64(in.Float()), 'g', -1, 32) + switch s { + case "+Inf": + s = ".inf" + case "-Inf": + s = "-.inf" + case "NaN": + s = ".nan" + } + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) +} + +func (e *encoder) nilv() { + e.emitScalar("null", "", "", yaml_PLAIN_SCALAR_STYLE) +} + +func (e *encoder) emitScalar(value, anchor, tag string, style yaml_scalar_style_t) { + implicit := tag == "" + e.must(yaml_scalar_event_initialize(&e.event, []byte(anchor), []byte(tag), []byte(value), implicit, implicit, style)) + e.emit() +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/parserc.go b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/parserc.go new file mode 100644 index 0000000000000000000000000000000000000000..0a7037ad1b2a6c352b7250278daf2feb9bb23a42 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/parserc.go @@ -0,0 +1,1096 @@ +package yaml + +import ( + "bytes" +) + +// The parser implements the following grammar: +// +// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END +// implicit_document ::= block_node DOCUMENT-END* +// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +// block_node_or_indentless_sequence ::= +// ALIAS +// | properties (block_content | indentless_block_sequence)? +// | block_content +// | indentless_block_sequence +// block_node ::= ALIAS +// | properties block_content? +// | block_content +// flow_node ::= ALIAS +// | properties flow_content? +// | flow_content +// properties ::= TAG ANCHOR? | ANCHOR TAG? +// block_content ::= block_collection | flow_collection | SCALAR +// flow_content ::= flow_collection | SCALAR +// block_collection ::= block_sequence | block_mapping +// flow_collection ::= flow_sequence | flow_mapping +// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END +// indentless_sequence ::= (BLOCK-ENTRY block_node?)+ +// block_mapping ::= BLOCK-MAPPING_START +// ((KEY block_node_or_indentless_sequence?)? +// (VALUE block_node_or_indentless_sequence?)?)* +// BLOCK-END +// flow_sequence ::= FLOW-SEQUENCE-START +// (flow_sequence_entry FLOW-ENTRY)* +// flow_sequence_entry? +// FLOW-SEQUENCE-END +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// flow_mapping ::= FLOW-MAPPING-START +// (flow_mapping_entry FLOW-ENTRY)* +// flow_mapping_entry? +// FLOW-MAPPING-END +// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? + +// Peek the next token in the token queue. +func peek_token(parser *yaml_parser_t) *yaml_token_t { + if parser.token_available || yaml_parser_fetch_more_tokens(parser) { + return &parser.tokens[parser.tokens_head] + } + return nil +} + +// Remove the next token from the queue (must be called after peek_token). +func skip_token(parser *yaml_parser_t) { + parser.token_available = false + parser.tokens_parsed++ + parser.stream_end_produced = parser.tokens[parser.tokens_head].typ == yaml_STREAM_END_TOKEN + parser.tokens_head++ +} + +// Get the next event. +func yaml_parser_parse(parser *yaml_parser_t, event *yaml_event_t) bool { + // Erase the event object. + *event = yaml_event_t{} + + // No events after the end of the stream or error. + if parser.stream_end_produced || parser.error != yaml_NO_ERROR || parser.state == yaml_PARSE_END_STATE { + return true + } + + // Generate the next event. + return yaml_parser_state_machine(parser, event) +} + +// Set parser error. +func yaml_parser_set_parser_error(parser *yaml_parser_t, problem string, problem_mark yaml_mark_t) bool { + parser.error = yaml_PARSER_ERROR + parser.problem = problem + parser.problem_mark = problem_mark + return false +} + +func yaml_parser_set_parser_error_context(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string, problem_mark yaml_mark_t) bool { + parser.error = yaml_PARSER_ERROR + parser.context = context + parser.context_mark = context_mark + parser.problem = problem + parser.problem_mark = problem_mark + return false +} + +// State dispatcher. +func yaml_parser_state_machine(parser *yaml_parser_t, event *yaml_event_t) bool { + //trace("yaml_parser_state_machine", "state:", parser.state.String()) + + switch parser.state { + case yaml_PARSE_STREAM_START_STATE: + return yaml_parser_parse_stream_start(parser, event) + + case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE: + return yaml_parser_parse_document_start(parser, event, true) + + case yaml_PARSE_DOCUMENT_START_STATE: + return yaml_parser_parse_document_start(parser, event, false) + + case yaml_PARSE_DOCUMENT_CONTENT_STATE: + return yaml_parser_parse_document_content(parser, event) + + case yaml_PARSE_DOCUMENT_END_STATE: + return yaml_parser_parse_document_end(parser, event) + + case yaml_PARSE_BLOCK_NODE_STATE: + return yaml_parser_parse_node(parser, event, true, false) + + case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE: + return yaml_parser_parse_node(parser, event, true, true) + + case yaml_PARSE_FLOW_NODE_STATE: + return yaml_parser_parse_node(parser, event, false, false) + + case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE: + return yaml_parser_parse_block_sequence_entry(parser, event, true) + + case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE: + return yaml_parser_parse_block_sequence_entry(parser, event, false) + + case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE: + return yaml_parser_parse_indentless_sequence_entry(parser, event) + + case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE: + return yaml_parser_parse_block_mapping_key(parser, event, true) + + case yaml_PARSE_BLOCK_MAPPING_KEY_STATE: + return yaml_parser_parse_block_mapping_key(parser, event, false) + + case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE: + return yaml_parser_parse_block_mapping_value(parser, event) + + case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE: + return yaml_parser_parse_flow_sequence_entry(parser, event, true) + + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE: + return yaml_parser_parse_flow_sequence_entry(parser, event, false) + + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE: + return yaml_parser_parse_flow_sequence_entry_mapping_key(parser, event) + + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE: + return yaml_parser_parse_flow_sequence_entry_mapping_value(parser, event) + + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE: + return yaml_parser_parse_flow_sequence_entry_mapping_end(parser, event) + + case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE: + return yaml_parser_parse_flow_mapping_key(parser, event, true) + + case yaml_PARSE_FLOW_MAPPING_KEY_STATE: + return yaml_parser_parse_flow_mapping_key(parser, event, false) + + case yaml_PARSE_FLOW_MAPPING_VALUE_STATE: + return yaml_parser_parse_flow_mapping_value(parser, event, false) + + case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE: + return yaml_parser_parse_flow_mapping_value(parser, event, true) + + default: + panic("invalid parser state") + } + return false +} + +// Parse the production: +// stream ::= STREAM-START implicit_document? explicit_document* STREAM-END +// ************ +func yaml_parser_parse_stream_start(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_STREAM_START_TOKEN { + return yaml_parser_set_parser_error(parser, "did not find expected <stream-start>", token.start_mark) + } + parser.state = yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE + *event = yaml_event_t{ + typ: yaml_STREAM_START_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + encoding: token.encoding, + } + skip_token(parser) + return true +} + +// Parse the productions: +// implicit_document ::= block_node DOCUMENT-END* +// * +// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +// ************************* +func yaml_parser_parse_document_start(parser *yaml_parser_t, event *yaml_event_t, implicit bool) bool { + + token := peek_token(parser) + if token == nil { + return false + } + + // Parse extra document end indicators. + if !implicit { + for token.typ == yaml_DOCUMENT_END_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } + } + + if implicit && token.typ != yaml_VERSION_DIRECTIVE_TOKEN && + token.typ != yaml_TAG_DIRECTIVE_TOKEN && + token.typ != yaml_DOCUMENT_START_TOKEN && + token.typ != yaml_STREAM_END_TOKEN { + // Parse an implicit document. + if !yaml_parser_process_directives(parser, nil, nil) { + return false + } + parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE) + parser.state = yaml_PARSE_BLOCK_NODE_STATE + + *event = yaml_event_t{ + typ: yaml_DOCUMENT_START_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + + } else if token.typ != yaml_STREAM_END_TOKEN { + // Parse an explicit document. + var version_directive *yaml_version_directive_t + var tag_directives []yaml_tag_directive_t + start_mark := token.start_mark + if !yaml_parser_process_directives(parser, &version_directive, &tag_directives) { + return false + } + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_DOCUMENT_START_TOKEN { + yaml_parser_set_parser_error(parser, + "did not find expected <document start>", token.start_mark) + return false + } + parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE) + parser.state = yaml_PARSE_DOCUMENT_CONTENT_STATE + end_mark := token.end_mark + + *event = yaml_event_t{ + typ: yaml_DOCUMENT_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + version_directive: version_directive, + tag_directives: tag_directives, + implicit: false, + } + skip_token(parser) + + } else { + // Parse the stream end. + parser.state = yaml_PARSE_END_STATE + *event = yaml_event_t{ + typ: yaml_STREAM_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + skip_token(parser) + } + + return true +} + +// Parse the productions: +// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +// *********** +// +func yaml_parser_parse_document_content(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_VERSION_DIRECTIVE_TOKEN || + token.typ == yaml_TAG_DIRECTIVE_TOKEN || + token.typ == yaml_DOCUMENT_START_TOKEN || + token.typ == yaml_DOCUMENT_END_TOKEN || + token.typ == yaml_STREAM_END_TOKEN { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + return yaml_parser_process_empty_scalar(parser, event, + token.start_mark) + } + return yaml_parser_parse_node(parser, event, true, false) +} + +// Parse the productions: +// implicit_document ::= block_node DOCUMENT-END* +// ************* +// explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* +// +func yaml_parser_parse_document_end(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + + start_mark := token.start_mark + end_mark := token.start_mark + + implicit := true + if token.typ == yaml_DOCUMENT_END_TOKEN { + end_mark = token.end_mark + skip_token(parser) + implicit = false + } + + parser.tag_directives = parser.tag_directives[:0] + + parser.state = yaml_PARSE_DOCUMENT_START_STATE + *event = yaml_event_t{ + typ: yaml_DOCUMENT_END_EVENT, + start_mark: start_mark, + end_mark: end_mark, + implicit: implicit, + } + return true +} + +// Parse the productions: +// block_node_or_indentless_sequence ::= +// ALIAS +// ***** +// | properties (block_content | indentless_block_sequence)? +// ********** * +// | block_content | indentless_block_sequence +// * +// block_node ::= ALIAS +// ***** +// | properties block_content? +// ********** * +// | block_content +// * +// flow_node ::= ALIAS +// ***** +// | properties flow_content? +// ********** * +// | flow_content +// * +// properties ::= TAG ANCHOR? | ANCHOR TAG? +// ************************* +// block_content ::= block_collection | flow_collection | SCALAR +// ****** +// flow_content ::= flow_collection | SCALAR +// ****** +func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, indentless_sequence bool) bool { + //defer trace("yaml_parser_parse_node", "block:", block, "indentless_sequence:", indentless_sequence)() + + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ == yaml_ALIAS_TOKEN { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + *event = yaml_event_t{ + typ: yaml_ALIAS_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + anchor: token.value, + } + skip_token(parser) + return true + } + + start_mark := token.start_mark + end_mark := token.start_mark + + var tag_token bool + var tag_handle, tag_suffix, anchor []byte + var tag_mark yaml_mark_t + if token.typ == yaml_ANCHOR_TOKEN { + anchor = token.value + start_mark = token.start_mark + end_mark = token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_TAG_TOKEN { + tag_token = true + tag_handle = token.value + tag_suffix = token.suffix + tag_mark = token.start_mark + end_mark = token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } + } else if token.typ == yaml_TAG_TOKEN { + tag_token = true + tag_handle = token.value + tag_suffix = token.suffix + start_mark = token.start_mark + tag_mark = token.start_mark + end_mark = token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_ANCHOR_TOKEN { + anchor = token.value + end_mark = token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } + } + + var tag []byte + if tag_token { + if len(tag_handle) == 0 { + tag = tag_suffix + tag_suffix = nil + } else { + for i := range parser.tag_directives { + if bytes.Equal(parser.tag_directives[i].handle, tag_handle) { + tag = append([]byte(nil), parser.tag_directives[i].prefix...) + tag = append(tag, tag_suffix...) + break + } + } + if len(tag) == 0 { + yaml_parser_set_parser_error_context(parser, + "while parsing a node", start_mark, + "found undefined tag handle", tag_mark) + return false + } + } + } + + implicit := len(tag) == 0 + if indentless_sequence && token.typ == yaml_BLOCK_ENTRY_TOKEN { + end_mark = token.end_mark + parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE + *event = yaml_event_t{ + typ: yaml_SEQUENCE_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE), + } + return true + } + if token.typ == yaml_SCALAR_TOKEN { + var plain_implicit, quoted_implicit bool + end_mark = token.end_mark + if (len(tag) == 0 && token.style == yaml_PLAIN_SCALAR_STYLE) || (len(tag) == 1 && tag[0] == '!') { + plain_implicit = true + } else if len(tag) == 0 { + quoted_implicit = true + } + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + + *event = yaml_event_t{ + typ: yaml_SCALAR_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + value: token.value, + implicit: plain_implicit, + quoted_implicit: quoted_implicit, + style: yaml_style_t(token.style), + } + skip_token(parser) + return true + } + if token.typ == yaml_FLOW_SEQUENCE_START_TOKEN { + // [Go] Some of the events below can be merged as they differ only on style. + end_mark = token.end_mark + parser.state = yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE + *event = yaml_event_t{ + typ: yaml_SEQUENCE_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_FLOW_SEQUENCE_STYLE), + } + return true + } + if token.typ == yaml_FLOW_MAPPING_START_TOKEN { + end_mark = token.end_mark + parser.state = yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE + *event = yaml_event_t{ + typ: yaml_MAPPING_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_FLOW_MAPPING_STYLE), + } + return true + } + if block && token.typ == yaml_BLOCK_SEQUENCE_START_TOKEN { + end_mark = token.end_mark + parser.state = yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE + *event = yaml_event_t{ + typ: yaml_SEQUENCE_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE), + } + return true + } + if block && token.typ == yaml_BLOCK_MAPPING_START_TOKEN { + end_mark = token.end_mark + parser.state = yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE + *event = yaml_event_t{ + typ: yaml_MAPPING_START_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + style: yaml_style_t(yaml_BLOCK_MAPPING_STYLE), + } + return true + } + if len(anchor) > 0 || len(tag) > 0 { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + + *event = yaml_event_t{ + typ: yaml_SCALAR_EVENT, + start_mark: start_mark, + end_mark: end_mark, + anchor: anchor, + tag: tag, + implicit: implicit, + quoted_implicit: false, + style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE), + } + return true + } + + context := "while parsing a flow node" + if block { + context = "while parsing a block node" + } + yaml_parser_set_parser_error_context(parser, context, start_mark, + "did not find expected node content", token.start_mark) + return false +} + +// Parse the productions: +// block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END +// ******************** *********** * ********* +// +func yaml_parser_parse_block_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { + if first { + token := peek_token(parser) + parser.marks = append(parser.marks, token.start_mark) + skip_token(parser) + } + + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ == yaml_BLOCK_ENTRY_TOKEN { + mark := token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_BLOCK_ENTRY_TOKEN && token.typ != yaml_BLOCK_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE) + return yaml_parser_parse_node(parser, event, true, false) + } else { + parser.state = yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) + } + } + if token.typ == yaml_BLOCK_END_TOKEN { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + + *event = yaml_event_t{ + typ: yaml_SEQUENCE_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + + skip_token(parser) + return true + } + + context_mark := parser.marks[len(parser.marks)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + return yaml_parser_set_parser_error_context(parser, + "while parsing a block collection", context_mark, + "did not find expected '-' indicator", token.start_mark) +} + +// Parse the productions: +// indentless_sequence ::= (BLOCK-ENTRY block_node?)+ +// *********** * +func yaml_parser_parse_indentless_sequence_entry(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ == yaml_BLOCK_ENTRY_TOKEN { + mark := token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_BLOCK_ENTRY_TOKEN && + token.typ != yaml_KEY_TOKEN && + token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_BLOCK_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE) + return yaml_parser_parse_node(parser, event, true, false) + } + parser.state = yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) + } + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + + *event = yaml_event_t{ + typ: yaml_SEQUENCE_END_EVENT, + start_mark: token.start_mark, + end_mark: token.start_mark, // [Go] Shouldn't this be token.end_mark? + } + return true +} + +// Parse the productions: +// block_mapping ::= BLOCK-MAPPING_START +// ******************* +// ((KEY block_node_or_indentless_sequence?)? +// *** * +// (VALUE block_node_or_indentless_sequence?)?)* +// +// BLOCK-END +// ********* +// +func yaml_parser_parse_block_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { + if first { + token := peek_token(parser) + parser.marks = append(parser.marks, token.start_mark) + skip_token(parser) + } + + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ == yaml_KEY_TOKEN { + mark := token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_KEY_TOKEN && + token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_BLOCK_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_VALUE_STATE) + return yaml_parser_parse_node(parser, event, true, true) + } else { + parser.state = yaml_PARSE_BLOCK_MAPPING_VALUE_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) + } + } else if token.typ == yaml_BLOCK_END_TOKEN { + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + *event = yaml_event_t{ + typ: yaml_MAPPING_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + skip_token(parser) + return true + } + + context_mark := parser.marks[len(parser.marks)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + return yaml_parser_set_parser_error_context(parser, + "while parsing a block mapping", context_mark, + "did not find expected key", token.start_mark) +} + +// Parse the productions: +// block_mapping ::= BLOCK-MAPPING_START +// +// ((KEY block_node_or_indentless_sequence?)? +// +// (VALUE block_node_or_indentless_sequence?)?)* +// ***** * +// BLOCK-END +// +// +func yaml_parser_parse_block_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_VALUE_TOKEN { + mark := token.end_mark + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_KEY_TOKEN && + token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_BLOCK_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_BLOCK_MAPPING_KEY_STATE) + return yaml_parser_parse_node(parser, event, true, true) + } + parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) + } + parser.state = yaml_PARSE_BLOCK_MAPPING_KEY_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) +} + +// Parse the productions: +// flow_sequence ::= FLOW-SEQUENCE-START +// ******************* +// (flow_sequence_entry FLOW-ENTRY)* +// * ********** +// flow_sequence_entry? +// * +// FLOW-SEQUENCE-END +// ***************** +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// * +// +func yaml_parser_parse_flow_sequence_entry(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { + if first { + token := peek_token(parser) + parser.marks = append(parser.marks, token.start_mark) + skip_token(parser) + } + token := peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { + if !first { + if token.typ == yaml_FLOW_ENTRY_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } else { + context_mark := parser.marks[len(parser.marks)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + return yaml_parser_set_parser_error_context(parser, + "while parsing a flow sequence", context_mark, + "did not find expected ',' or ']'", token.start_mark) + } + } + + if token.typ == yaml_KEY_TOKEN { + parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE + *event = yaml_event_t{ + typ: yaml_MAPPING_START_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + implicit: true, + style: yaml_style_t(yaml_FLOW_MAPPING_STYLE), + } + skip_token(parser) + return true + } else if token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + } + + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + + *event = yaml_event_t{ + typ: yaml_SEQUENCE_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + + skip_token(parser) + return true +} + +// +// Parse the productions: +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// *** * +// +func yaml_parser_parse_flow_sequence_entry_mapping_key(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_FLOW_ENTRY_TOKEN && + token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + mark := token.end_mark + skip_token(parser) + parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE + return yaml_parser_process_empty_scalar(parser, event, mark) +} + +// Parse the productions: +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// ***** * +// +func yaml_parser_parse_flow_sequence_entry_mapping_value(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + if token.typ == yaml_VALUE_TOKEN { + skip_token(parser) + token := peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_SEQUENCE_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + } + parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) +} + +// Parse the productions: +// flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// * +// +func yaml_parser_parse_flow_sequence_entry_mapping_end(parser *yaml_parser_t, event *yaml_event_t) bool { + token := peek_token(parser) + if token == nil { + return false + } + parser.state = yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE + *event = yaml_event_t{ + typ: yaml_MAPPING_END_EVENT, + start_mark: token.start_mark, + end_mark: token.start_mark, // [Go] Shouldn't this be end_mark? + } + return true +} + +// Parse the productions: +// flow_mapping ::= FLOW-MAPPING-START +// ****************** +// (flow_mapping_entry FLOW-ENTRY)* +// * ********** +// flow_mapping_entry? +// ****************** +// FLOW-MAPPING-END +// **************** +// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// * *** * +// +func yaml_parser_parse_flow_mapping_key(parser *yaml_parser_t, event *yaml_event_t, first bool) bool { + if first { + token := peek_token(parser) + parser.marks = append(parser.marks, token.start_mark) + skip_token(parser) + } + + token := peek_token(parser) + if token == nil { + return false + } + + if token.typ != yaml_FLOW_MAPPING_END_TOKEN { + if !first { + if token.typ == yaml_FLOW_ENTRY_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } else { + context_mark := parser.marks[len(parser.marks)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + return yaml_parser_set_parser_error_context(parser, + "while parsing a flow mapping", context_mark, + "did not find expected ',' or '}'", token.start_mark) + } + } + + if token.typ == yaml_KEY_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_VALUE_TOKEN && + token.typ != yaml_FLOW_ENTRY_TOKEN && + token.typ != yaml_FLOW_MAPPING_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_VALUE_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } else { + parser.state = yaml_PARSE_FLOW_MAPPING_VALUE_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) + } + } else if token.typ != yaml_FLOW_MAPPING_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + } + + parser.state = parser.states[len(parser.states)-1] + parser.states = parser.states[:len(parser.states)-1] + parser.marks = parser.marks[:len(parser.marks)-1] + *event = yaml_event_t{ + typ: yaml_MAPPING_END_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + } + skip_token(parser) + return true +} + +// Parse the productions: +// flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? +// * ***** * +// +func yaml_parser_parse_flow_mapping_value(parser *yaml_parser_t, event *yaml_event_t, empty bool) bool { + token := peek_token(parser) + if token == nil { + return false + } + if empty { + parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) + } + if token.typ == yaml_VALUE_TOKEN { + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + if token.typ != yaml_FLOW_ENTRY_TOKEN && token.typ != yaml_FLOW_MAPPING_END_TOKEN { + parser.states = append(parser.states, yaml_PARSE_FLOW_MAPPING_KEY_STATE) + return yaml_parser_parse_node(parser, event, false, false) + } + } + parser.state = yaml_PARSE_FLOW_MAPPING_KEY_STATE + return yaml_parser_process_empty_scalar(parser, event, token.start_mark) +} + +// Generate an empty scalar event. +func yaml_parser_process_empty_scalar(parser *yaml_parser_t, event *yaml_event_t, mark yaml_mark_t) bool { + *event = yaml_event_t{ + typ: yaml_SCALAR_EVENT, + start_mark: mark, + end_mark: mark, + value: nil, // Empty + implicit: true, + style: yaml_style_t(yaml_PLAIN_SCALAR_STYLE), + } + return true +} + +var default_tag_directives = []yaml_tag_directive_t{ + {[]byte("!"), []byte("!")}, + {[]byte("!!"), []byte("tag:yaml.org,2002:")}, +} + +// Parse directives. +func yaml_parser_process_directives(parser *yaml_parser_t, + version_directive_ref **yaml_version_directive_t, + tag_directives_ref *[]yaml_tag_directive_t) bool { + + var version_directive *yaml_version_directive_t + var tag_directives []yaml_tag_directive_t + + token := peek_token(parser) + if token == nil { + return false + } + + for token.typ == yaml_VERSION_DIRECTIVE_TOKEN || token.typ == yaml_TAG_DIRECTIVE_TOKEN { + if token.typ == yaml_VERSION_DIRECTIVE_TOKEN { + if version_directive != nil { + yaml_parser_set_parser_error(parser, + "found duplicate %YAML directive", token.start_mark) + return false + } + if token.major != 1 || token.minor != 1 { + yaml_parser_set_parser_error(parser, + "found incompatible YAML document", token.start_mark) + return false + } + version_directive = &yaml_version_directive_t{ + major: token.major, + minor: token.minor, + } + } else if token.typ == yaml_TAG_DIRECTIVE_TOKEN { + value := yaml_tag_directive_t{ + handle: token.value, + prefix: token.prefix, + } + if !yaml_parser_append_tag_directive(parser, value, false, token.start_mark) { + return false + } + tag_directives = append(tag_directives, value) + } + + skip_token(parser) + token = peek_token(parser) + if token == nil { + return false + } + } + + for i := range default_tag_directives { + if !yaml_parser_append_tag_directive(parser, default_tag_directives[i], true, token.start_mark) { + return false + } + } + + if version_directive_ref != nil { + *version_directive_ref = version_directive + } + if tag_directives_ref != nil { + *tag_directives_ref = tag_directives + } + return true +} + +// Append a tag directive to the directives stack. +func yaml_parser_append_tag_directive(parser *yaml_parser_t, value yaml_tag_directive_t, allow_duplicates bool, mark yaml_mark_t) bool { + for i := range parser.tag_directives { + if bytes.Equal(value.handle, parser.tag_directives[i].handle) { + if allow_duplicates { + return true + } + return yaml_parser_set_parser_error(parser, "found duplicate %TAG directive", mark) + } + } + + // [Go] I suspect the copy is unnecessary. This was likely done + // because there was no way to track ownership of the data. + value_copy := yaml_tag_directive_t{ + handle: make([]byte, len(value.handle)), + prefix: make([]byte, len(value.prefix)), + } + copy(value_copy.handle, value.handle) + copy(value_copy.prefix, value.prefix) + parser.tag_directives = append(parser.tag_directives, value_copy) + return true +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/readerc.go b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/readerc.go new file mode 100644 index 0000000000000000000000000000000000000000..d5fb09727720a206d1fed349eb1b6882c659cac2 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/readerc.go @@ -0,0 +1,391 @@ +package yaml + +import ( + "io" +) + +// Set the reader error and return 0. +func yaml_parser_set_reader_error(parser *yaml_parser_t, problem string, offset int, value int) bool { + parser.error = yaml_READER_ERROR + parser.problem = problem + parser.problem_offset = offset + parser.problem_value = value + return false +} + +// Byte order marks. +const ( + bom_UTF8 = "\xef\xbb\xbf" + bom_UTF16LE = "\xff\xfe" + bom_UTF16BE = "\xfe\xff" +) + +// Determine the input stream encoding by checking the BOM symbol. If no BOM is +// found, the UTF-8 encoding is assumed. Return 1 on success, 0 on failure. +func yaml_parser_determine_encoding(parser *yaml_parser_t) bool { + // Ensure that we had enough bytes in the raw buffer. + for !parser.eof && len(parser.raw_buffer)-parser.raw_buffer_pos < 3 { + if !yaml_parser_update_raw_buffer(parser) { + return false + } + } + + // Determine the encoding. + buf := parser.raw_buffer + pos := parser.raw_buffer_pos + avail := len(buf) - pos + if avail >= 2 && buf[pos] == bom_UTF16LE[0] && buf[pos+1] == bom_UTF16LE[1] { + parser.encoding = yaml_UTF16LE_ENCODING + parser.raw_buffer_pos += 2 + parser.offset += 2 + } else if avail >= 2 && buf[pos] == bom_UTF16BE[0] && buf[pos+1] == bom_UTF16BE[1] { + parser.encoding = yaml_UTF16BE_ENCODING + parser.raw_buffer_pos += 2 + parser.offset += 2 + } else if avail >= 3 && buf[pos] == bom_UTF8[0] && buf[pos+1] == bom_UTF8[1] && buf[pos+2] == bom_UTF8[2] { + parser.encoding = yaml_UTF8_ENCODING + parser.raw_buffer_pos += 3 + parser.offset += 3 + } else { + parser.encoding = yaml_UTF8_ENCODING + } + return true +} + +// Update the raw buffer. +func yaml_parser_update_raw_buffer(parser *yaml_parser_t) bool { + size_read := 0 + + // Return if the raw buffer is full. + if parser.raw_buffer_pos == 0 && len(parser.raw_buffer) == cap(parser.raw_buffer) { + return true + } + + // Return on EOF. + if parser.eof { + return true + } + + // Move the remaining bytes in the raw buffer to the beginning. + if parser.raw_buffer_pos > 0 && parser.raw_buffer_pos < len(parser.raw_buffer) { + copy(parser.raw_buffer, parser.raw_buffer[parser.raw_buffer_pos:]) + } + parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)-parser.raw_buffer_pos] + parser.raw_buffer_pos = 0 + + // Call the read handler to fill the buffer. + size_read, err := parser.read_handler(parser, parser.raw_buffer[len(parser.raw_buffer):cap(parser.raw_buffer)]) + parser.raw_buffer = parser.raw_buffer[:len(parser.raw_buffer)+size_read] + if err == io.EOF { + parser.eof = true + } else if err != nil { + return yaml_parser_set_reader_error(parser, "input error: "+err.Error(), parser.offset, -1) + } + return true +} + +// Ensure that the buffer contains at least `length` characters. +// Return true on success, false on failure. +// +// The length is supposed to be significantly less that the buffer size. +func yaml_parser_update_buffer(parser *yaml_parser_t, length int) bool { + if parser.read_handler == nil { + panic("read handler must be set") + } + + // If the EOF flag is set and the raw buffer is empty, do nothing. + if parser.eof && parser.raw_buffer_pos == len(parser.raw_buffer) { + return true + } + + // Return if the buffer contains enough characters. + if parser.unread >= length { + return true + } + + // Determine the input encoding if it is not known yet. + if parser.encoding == yaml_ANY_ENCODING { + if !yaml_parser_determine_encoding(parser) { + return false + } + } + + // Move the unread characters to the beginning of the buffer. + buffer_len := len(parser.buffer) + if parser.buffer_pos > 0 && parser.buffer_pos < buffer_len { + copy(parser.buffer, parser.buffer[parser.buffer_pos:]) + buffer_len -= parser.buffer_pos + parser.buffer_pos = 0 + } else if parser.buffer_pos == buffer_len { + buffer_len = 0 + parser.buffer_pos = 0 + } + + // Open the whole buffer for writing, and cut it before returning. + parser.buffer = parser.buffer[:cap(parser.buffer)] + + // Fill the buffer until it has enough characters. + first := true + for parser.unread < length { + + // Fill the raw buffer if necessary. + if !first || parser.raw_buffer_pos == len(parser.raw_buffer) { + if !yaml_parser_update_raw_buffer(parser) { + parser.buffer = parser.buffer[:buffer_len] + return false + } + } + first = false + + // Decode the raw buffer. + inner: + for parser.raw_buffer_pos != len(parser.raw_buffer) { + var value rune + var width int + + raw_unread := len(parser.raw_buffer) - parser.raw_buffer_pos + + // Decode the next character. + switch parser.encoding { + case yaml_UTF8_ENCODING: + // Decode a UTF-8 character. Check RFC 3629 + // (http://www.ietf.org/rfc/rfc3629.txt) for more details. + // + // The following table (taken from the RFC) is used for + // decoding. + // + // Char. number range | UTF-8 octet sequence + // (hexadecimal) | (binary) + // --------------------+------------------------------------ + // 0000 0000-0000 007F | 0xxxxxxx + // 0000 0080-0000 07FF | 110xxxxx 10xxxxxx + // 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx + // 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + // + // Additionally, the characters in the range 0xD800-0xDFFF + // are prohibited as they are reserved for use with UTF-16 + // surrogate pairs. + + // Determine the length of the UTF-8 sequence. + octet := parser.raw_buffer[parser.raw_buffer_pos] + switch { + case octet&0x80 == 0x00: + width = 1 + case octet&0xE0 == 0xC0: + width = 2 + case octet&0xF0 == 0xE0: + width = 3 + case octet&0xF8 == 0xF0: + width = 4 + default: + // The leading octet is invalid. + return yaml_parser_set_reader_error(parser, + "invalid leading UTF-8 octet", + parser.offset, int(octet)) + } + + // Check if the raw buffer contains an incomplete character. + if width > raw_unread { + if parser.eof { + return yaml_parser_set_reader_error(parser, + "incomplete UTF-8 octet sequence", + parser.offset, -1) + } + break inner + } + + // Decode the leading octet. + switch { + case octet&0x80 == 0x00: + value = rune(octet & 0x7F) + case octet&0xE0 == 0xC0: + value = rune(octet & 0x1F) + case octet&0xF0 == 0xE0: + value = rune(octet & 0x0F) + case octet&0xF8 == 0xF0: + value = rune(octet & 0x07) + default: + value = 0 + } + + // Check and decode the trailing octets. + for k := 1; k < width; k++ { + octet = parser.raw_buffer[parser.raw_buffer_pos+k] + + // Check if the octet is valid. + if (octet & 0xC0) != 0x80 { + return yaml_parser_set_reader_error(parser, + "invalid trailing UTF-8 octet", + parser.offset+k, int(octet)) + } + + // Decode the octet. + value = (value << 6) + rune(octet&0x3F) + } + + // Check the length of the sequence against the value. + switch { + case width == 1: + case width == 2 && value >= 0x80: + case width == 3 && value >= 0x800: + case width == 4 && value >= 0x10000: + default: + return yaml_parser_set_reader_error(parser, + "invalid length of a UTF-8 sequence", + parser.offset, -1) + } + + // Check the range of the value. + if value >= 0xD800 && value <= 0xDFFF || value > 0x10FFFF { + return yaml_parser_set_reader_error(parser, + "invalid Unicode character", + parser.offset, int(value)) + } + + case yaml_UTF16LE_ENCODING, yaml_UTF16BE_ENCODING: + var low, high int + if parser.encoding == yaml_UTF16LE_ENCODING { + low, high = 0, 1 + } else { + high, low = 1, 0 + } + + // The UTF-16 encoding is not as simple as one might + // naively think. Check RFC 2781 + // (http://www.ietf.org/rfc/rfc2781.txt). + // + // Normally, two subsequent bytes describe a Unicode + // character. However a special technique (called a + // surrogate pair) is used for specifying character + // values larger than 0xFFFF. + // + // A surrogate pair consists of two pseudo-characters: + // high surrogate area (0xD800-0xDBFF) + // low surrogate area (0xDC00-0xDFFF) + // + // The following formulas are used for decoding + // and encoding characters using surrogate pairs: + // + // U = U' + 0x10000 (0x01 00 00 <= U <= 0x10 FF FF) + // U' = yyyyyyyyyyxxxxxxxxxx (0 <= U' <= 0x0F FF FF) + // W1 = 110110yyyyyyyyyy + // W2 = 110111xxxxxxxxxx + // + // where U is the character value, W1 is the high surrogate + // area, W2 is the low surrogate area. + + // Check for incomplete UTF-16 character. + if raw_unread < 2 { + if parser.eof { + return yaml_parser_set_reader_error(parser, + "incomplete UTF-16 character", + parser.offset, -1) + } + break inner + } + + // Get the character. + value = rune(parser.raw_buffer[parser.raw_buffer_pos+low]) + + (rune(parser.raw_buffer[parser.raw_buffer_pos+high]) << 8) + + // Check for unexpected low surrogate area. + if value&0xFC00 == 0xDC00 { + return yaml_parser_set_reader_error(parser, + "unexpected low surrogate area", + parser.offset, int(value)) + } + + // Check for a high surrogate area. + if value&0xFC00 == 0xD800 { + width = 4 + + // Check for incomplete surrogate pair. + if raw_unread < 4 { + if parser.eof { + return yaml_parser_set_reader_error(parser, + "incomplete UTF-16 surrogate pair", + parser.offset, -1) + } + break inner + } + + // Get the next character. + value2 := rune(parser.raw_buffer[parser.raw_buffer_pos+low+2]) + + (rune(parser.raw_buffer[parser.raw_buffer_pos+high+2]) << 8) + + // Check for a low surrogate area. + if value2&0xFC00 != 0xDC00 { + return yaml_parser_set_reader_error(parser, + "expected low surrogate area", + parser.offset+2, int(value2)) + } + + // Generate the value of the surrogate pair. + value = 0x10000 + ((value & 0x3FF) << 10) + (value2 & 0x3FF) + } else { + width = 2 + } + + default: + panic("impossible") + } + + // Check if the character is in the allowed range: + // #x9 | #xA | #xD | [#x20-#x7E] (8 bit) + // | #x85 | [#xA0-#xD7FF] | [#xE000-#xFFFD] (16 bit) + // | [#x10000-#x10FFFF] (32 bit) + switch { + case value == 0x09: + case value == 0x0A: + case value == 0x0D: + case value >= 0x20 && value <= 0x7E: + case value == 0x85: + case value >= 0xA0 && value <= 0xD7FF: + case value >= 0xE000 && value <= 0xFFFD: + case value >= 0x10000 && value <= 0x10FFFF: + default: + return yaml_parser_set_reader_error(parser, + "control characters are not allowed", + parser.offset, int(value)) + } + + // Move the raw pointers. + parser.raw_buffer_pos += width + parser.offset += width + + // Finally put the character into the buffer. + if value <= 0x7F { + // 0000 0000-0000 007F . 0xxxxxxx + parser.buffer[buffer_len+0] = byte(value) + } else if value <= 0x7FF { + // 0000 0080-0000 07FF . 110xxxxx 10xxxxxx + parser.buffer[buffer_len+0] = byte(0xC0 + (value >> 6)) + parser.buffer[buffer_len+1] = byte(0x80 + (value & 0x3F)) + } else if value <= 0xFFFF { + // 0000 0800-0000 FFFF . 1110xxxx 10xxxxxx 10xxxxxx + parser.buffer[buffer_len+0] = byte(0xE0 + (value >> 12)) + parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 6) & 0x3F)) + parser.buffer[buffer_len+2] = byte(0x80 + (value & 0x3F)) + } else { + // 0001 0000-0010 FFFF . 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + parser.buffer[buffer_len+0] = byte(0xF0 + (value >> 18)) + parser.buffer[buffer_len+1] = byte(0x80 + ((value >> 12) & 0x3F)) + parser.buffer[buffer_len+2] = byte(0x80 + ((value >> 6) & 0x3F)) + parser.buffer[buffer_len+3] = byte(0x80 + (value & 0x3F)) + } + buffer_len += width + + parser.unread++ + } + + // On EOF, put NUL into the buffer and return. + if parser.eof { + parser.buffer[buffer_len] = 0 + buffer_len++ + parser.unread++ + break + } + } + parser.buffer = parser.buffer[:buffer_len] + return true +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/resolve.go b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/resolve.go new file mode 100644 index 0000000000000000000000000000000000000000..93a86327434b94e457b3871f7dc6ab6bccdb4630 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/resolve.go @@ -0,0 +1,203 @@ +package yaml + +import ( + "encoding/base64" + "math" + "strconv" + "strings" + "unicode/utf8" +) + +type resolveMapItem struct { + value interface{} + tag string +} + +var resolveTable = make([]byte, 256) +var resolveMap = make(map[string]resolveMapItem) + +func init() { + t := resolveTable + t[int('+')] = 'S' // Sign + t[int('-')] = 'S' + for _, c := range "0123456789" { + t[int(c)] = 'D' // Digit + } + for _, c := range "yYnNtTfFoO~" { + t[int(c)] = 'M' // In map + } + t[int('.')] = '.' // Float (potentially in map) + + var resolveMapList = []struct { + v interface{} + tag string + l []string + }{ + {true, yaml_BOOL_TAG, []string{"y", "Y", "yes", "Yes", "YES"}}, + {true, yaml_BOOL_TAG, []string{"true", "True", "TRUE"}}, + {true, yaml_BOOL_TAG, []string{"on", "On", "ON"}}, + {false, yaml_BOOL_TAG, []string{"n", "N", "no", "No", "NO"}}, + {false, yaml_BOOL_TAG, []string{"false", "False", "FALSE"}}, + {false, yaml_BOOL_TAG, []string{"off", "Off", "OFF"}}, + {nil, yaml_NULL_TAG, []string{"", "~", "null", "Null", "NULL"}}, + {math.NaN(), yaml_FLOAT_TAG, []string{".nan", ".NaN", ".NAN"}}, + {math.Inf(+1), yaml_FLOAT_TAG, []string{".inf", ".Inf", ".INF"}}, + {math.Inf(+1), yaml_FLOAT_TAG, []string{"+.inf", "+.Inf", "+.INF"}}, + {math.Inf(-1), yaml_FLOAT_TAG, []string{"-.inf", "-.Inf", "-.INF"}}, + {"<<", yaml_MERGE_TAG, []string{"<<"}}, + } + + m := resolveMap + for _, item := range resolveMapList { + for _, s := range item.l { + m[s] = resolveMapItem{item.v, item.tag} + } + } +} + +const longTagPrefix = "tag:yaml.org,2002:" + +func shortTag(tag string) string { + // TODO This can easily be made faster and produce less garbage. + if strings.HasPrefix(tag, longTagPrefix) { + return "!!" + tag[len(longTagPrefix):] + } + return tag +} + +func longTag(tag string) string { + if strings.HasPrefix(tag, "!!") { + return longTagPrefix + tag[2:] + } + return tag +} + +func resolvableTag(tag string) bool { + switch tag { + case "", yaml_STR_TAG, yaml_BOOL_TAG, yaml_INT_TAG, yaml_FLOAT_TAG, yaml_NULL_TAG: + return true + } + return false +} + +func resolve(tag string, in string) (rtag string, out interface{}) { + if !resolvableTag(tag) { + return tag, in + } + + defer func() { + switch tag { + case "", rtag, yaml_STR_TAG, yaml_BINARY_TAG: + return + } + failf("cannot decode %s `%s` as a %s", shortTag(rtag), in, shortTag(tag)) + }() + + // Any data is accepted as a !!str or !!binary. + // Otherwise, the prefix is enough of a hint about what it might be. + hint := byte('N') + if in != "" { + hint = resolveTable[in[0]] + } + if hint != 0 && tag != yaml_STR_TAG && tag != yaml_BINARY_TAG { + // Handle things we can lookup in a map. + if item, ok := resolveMap[in]; ok { + return item.tag, item.value + } + + // Base 60 floats are a bad idea, were dropped in YAML 1.2, and + // are purposefully unsupported here. They're still quoted on + // the way out for compatibility with other parser, though. + + switch hint { + case 'M': + // We've already checked the map above. + + case '.': + // Not in the map, so maybe a normal float. + floatv, err := strconv.ParseFloat(in, 64) + if err == nil { + return yaml_FLOAT_TAG, floatv + } + + case 'D', 'S': + // Int, float, or timestamp. + plain := strings.Replace(in, "_", "", -1) + intv, err := strconv.ParseInt(plain, 0, 64) + if err == nil { + if intv == int64(int(intv)) { + return yaml_INT_TAG, int(intv) + } else { + return yaml_INT_TAG, intv + } + } + uintv, err := strconv.ParseUint(plain, 0, 64) + if err == nil { + return yaml_INT_TAG, uintv + } + floatv, err := strconv.ParseFloat(plain, 64) + if err == nil { + return yaml_FLOAT_TAG, floatv + } + if strings.HasPrefix(plain, "0b") { + intv, err := strconv.ParseInt(plain[2:], 2, 64) + if err == nil { + if intv == int64(int(intv)) { + return yaml_INT_TAG, int(intv) + } else { + return yaml_INT_TAG, intv + } + } + uintv, err := strconv.ParseUint(plain[2:], 2, 64) + if err == nil { + return yaml_INT_TAG, uintv + } + } else if strings.HasPrefix(plain, "-0b") { + intv, err := strconv.ParseInt(plain[3:], 2, 64) + if err == nil { + if intv == int64(int(intv)) { + return yaml_INT_TAG, -int(intv) + } else { + return yaml_INT_TAG, -intv + } + } + } + // XXX Handle timestamps here. + + default: + panic("resolveTable item not yet handled: " + string(rune(hint)) + " (with " + in + ")") + } + } + if tag == yaml_BINARY_TAG { + return yaml_BINARY_TAG, in + } + if utf8.ValidString(in) { + return yaml_STR_TAG, in + } + return yaml_BINARY_TAG, encodeBase64(in) +} + +// encodeBase64 encodes s as base64 that is broken up into multiple lines +// as appropriate for the resulting length. +func encodeBase64(s string) string { + const lineLen = 70 + encLen := base64.StdEncoding.EncodedLen(len(s)) + lines := encLen/lineLen + 1 + buf := make([]byte, encLen*2+lines) + in := buf[0:encLen] + out := buf[encLen:] + base64.StdEncoding.Encode(in, []byte(s)) + k := 0 + for i := 0; i < len(in); i += lineLen { + j := i + lineLen + if j > len(in) { + j = len(in) + } + k += copy(out[k:], in[i:j]) + if lines > 1 { + out[k] = '\n' + k++ + } + } + return string(out[:k]) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/scannerc.go b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/scannerc.go new file mode 100644 index 0000000000000000000000000000000000000000..fe93b190c2ac7d7ca23c8ccabea37709f28c1272 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/scannerc.go @@ -0,0 +1,2710 @@ +package yaml + +import ( + "bytes" + "fmt" +) + +// Introduction +// ************ +// +// The following notes assume that you are familiar with the YAML specification +// (http://yaml.org/spec/cvs/current.html). We mostly follow it, although in +// some cases we are less restrictive that it requires. +// +// The process of transforming a YAML stream into a sequence of events is +// divided on two steps: Scanning and Parsing. +// +// The Scanner transforms the input stream into a sequence of tokens, while the +// parser transform the sequence of tokens produced by the Scanner into a +// sequence of parsing events. +// +// The Scanner is rather clever and complicated. The Parser, on the contrary, +// is a straightforward implementation of a recursive-descendant parser (or, +// LL(1) parser, as it is usually called). +// +// Actually there are two issues of Scanning that might be called "clever", the +// rest is quite straightforward. The issues are "block collection start" and +// "simple keys". Both issues are explained below in details. +// +// Here the Scanning step is explained and implemented. We start with the list +// of all the tokens produced by the Scanner together with short descriptions. +// +// Now, tokens: +// +// STREAM-START(encoding) # The stream start. +// STREAM-END # The stream end. +// VERSION-DIRECTIVE(major,minor) # The '%YAML' directive. +// TAG-DIRECTIVE(handle,prefix) # The '%TAG' directive. +// DOCUMENT-START # '---' +// DOCUMENT-END # '...' +// BLOCK-SEQUENCE-START # Indentation increase denoting a block +// BLOCK-MAPPING-START # sequence or a block mapping. +// BLOCK-END # Indentation decrease. +// FLOW-SEQUENCE-START # '[' +// FLOW-SEQUENCE-END # ']' +// BLOCK-SEQUENCE-START # '{' +// BLOCK-SEQUENCE-END # '}' +// BLOCK-ENTRY # '-' +// FLOW-ENTRY # ',' +// KEY # '?' or nothing (simple keys). +// VALUE # ':' +// ALIAS(anchor) # '*anchor' +// ANCHOR(anchor) # '&anchor' +// TAG(handle,suffix) # '!handle!suffix' +// SCALAR(value,style) # A scalar. +// +// The following two tokens are "virtual" tokens denoting the beginning and the +// end of the stream: +// +// STREAM-START(encoding) +// STREAM-END +// +// We pass the information about the input stream encoding with the +// STREAM-START token. +// +// The next two tokens are responsible for tags: +// +// VERSION-DIRECTIVE(major,minor) +// TAG-DIRECTIVE(handle,prefix) +// +// Example: +// +// %YAML 1.1 +// %TAG ! !foo +// %TAG !yaml! tag:yaml.org,2002: +// --- +// +// The correspoding sequence of tokens: +// +// STREAM-START(utf-8) +// VERSION-DIRECTIVE(1,1) +// TAG-DIRECTIVE("!","!foo") +// TAG-DIRECTIVE("!yaml","tag:yaml.org,2002:") +// DOCUMENT-START +// STREAM-END +// +// Note that the VERSION-DIRECTIVE and TAG-DIRECTIVE tokens occupy a whole +// line. +// +// The document start and end indicators are represented by: +// +// DOCUMENT-START +// DOCUMENT-END +// +// Note that if a YAML stream contains an implicit document (without '---' +// and '...' indicators), no DOCUMENT-START and DOCUMENT-END tokens will be +// produced. +// +// In the following examples, we present whole documents together with the +// produced tokens. +// +// 1. An implicit document: +// +// 'a scalar' +// +// Tokens: +// +// STREAM-START(utf-8) +// SCALAR("a scalar",single-quoted) +// STREAM-END +// +// 2. An explicit document: +// +// --- +// 'a scalar' +// ... +// +// Tokens: +// +// STREAM-START(utf-8) +// DOCUMENT-START +// SCALAR("a scalar",single-quoted) +// DOCUMENT-END +// STREAM-END +// +// 3. Several documents in a stream: +// +// 'a scalar' +// --- +// 'another scalar' +// --- +// 'yet another scalar' +// +// Tokens: +// +// STREAM-START(utf-8) +// SCALAR("a scalar",single-quoted) +// DOCUMENT-START +// SCALAR("another scalar",single-quoted) +// DOCUMENT-START +// SCALAR("yet another scalar",single-quoted) +// STREAM-END +// +// We have already introduced the SCALAR token above. The following tokens are +// used to describe aliases, anchors, tag, and scalars: +// +// ALIAS(anchor) +// ANCHOR(anchor) +// TAG(handle,suffix) +// SCALAR(value,style) +// +// The following series of examples illustrate the usage of these tokens: +// +// 1. A recursive sequence: +// +// &A [ *A ] +// +// Tokens: +// +// STREAM-START(utf-8) +// ANCHOR("A") +// FLOW-SEQUENCE-START +// ALIAS("A") +// FLOW-SEQUENCE-END +// STREAM-END +// +// 2. A tagged scalar: +// +// !!float "3.14" # A good approximation. +// +// Tokens: +// +// STREAM-START(utf-8) +// TAG("!!","float") +// SCALAR("3.14",double-quoted) +// STREAM-END +// +// 3. Various scalar styles: +// +// --- # Implicit empty plain scalars do not produce tokens. +// --- a plain scalar +// --- 'a single-quoted scalar' +// --- "a double-quoted scalar" +// --- |- +// a literal scalar +// --- >- +// a folded +// scalar +// +// Tokens: +// +// STREAM-START(utf-8) +// DOCUMENT-START +// DOCUMENT-START +// SCALAR("a plain scalar",plain) +// DOCUMENT-START +// SCALAR("a single-quoted scalar",single-quoted) +// DOCUMENT-START +// SCALAR("a double-quoted scalar",double-quoted) +// DOCUMENT-START +// SCALAR("a literal scalar",literal) +// DOCUMENT-START +// SCALAR("a folded scalar",folded) +// STREAM-END +// +// Now it's time to review collection-related tokens. We will start with +// flow collections: +// +// FLOW-SEQUENCE-START +// FLOW-SEQUENCE-END +// FLOW-MAPPING-START +// FLOW-MAPPING-END +// FLOW-ENTRY +// KEY +// VALUE +// +// The tokens FLOW-SEQUENCE-START, FLOW-SEQUENCE-END, FLOW-MAPPING-START, and +// FLOW-MAPPING-END represent the indicators '[', ']', '{', and '}' +// correspondingly. FLOW-ENTRY represent the ',' indicator. Finally the +// indicators '?' and ':', which are used for denoting mapping keys and values, +// are represented by the KEY and VALUE tokens. +// +// The following examples show flow collections: +// +// 1. A flow sequence: +// +// [item 1, item 2, item 3] +// +// Tokens: +// +// STREAM-START(utf-8) +// FLOW-SEQUENCE-START +// SCALAR("item 1",plain) +// FLOW-ENTRY +// SCALAR("item 2",plain) +// FLOW-ENTRY +// SCALAR("item 3",plain) +// FLOW-SEQUENCE-END +// STREAM-END +// +// 2. A flow mapping: +// +// { +// a simple key: a value, # Note that the KEY token is produced. +// ? a complex key: another value, +// } +// +// Tokens: +// +// STREAM-START(utf-8) +// FLOW-MAPPING-START +// KEY +// SCALAR("a simple key",plain) +// VALUE +// SCALAR("a value",plain) +// FLOW-ENTRY +// KEY +// SCALAR("a complex key",plain) +// VALUE +// SCALAR("another value",plain) +// FLOW-ENTRY +// FLOW-MAPPING-END +// STREAM-END +// +// A simple key is a key which is not denoted by the '?' indicator. Note that +// the Scanner still produce the KEY token whenever it encounters a simple key. +// +// For scanning block collections, the following tokens are used (note that we +// repeat KEY and VALUE here): +// +// BLOCK-SEQUENCE-START +// BLOCK-MAPPING-START +// BLOCK-END +// BLOCK-ENTRY +// KEY +// VALUE +// +// The tokens BLOCK-SEQUENCE-START and BLOCK-MAPPING-START denote indentation +// increase that precedes a block collection (cf. the INDENT token in Python). +// The token BLOCK-END denote indentation decrease that ends a block collection +// (cf. the DEDENT token in Python). However YAML has some syntax pecularities +// that makes detections of these tokens more complex. +// +// The tokens BLOCK-ENTRY, KEY, and VALUE are used to represent the indicators +// '-', '?', and ':' correspondingly. +// +// The following examples show how the tokens BLOCK-SEQUENCE-START, +// BLOCK-MAPPING-START, and BLOCK-END are emitted by the Scanner: +// +// 1. Block sequences: +// +// - item 1 +// - item 2 +// - +// - item 3.1 +// - item 3.2 +// - +// key 1: value 1 +// key 2: value 2 +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-ENTRY +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 3.1",plain) +// BLOCK-ENTRY +// SCALAR("item 3.2",plain) +// BLOCK-END +// BLOCK-ENTRY +// BLOCK-MAPPING-START +// KEY +// SCALAR("key 1",plain) +// VALUE +// SCALAR("value 1",plain) +// KEY +// SCALAR("key 2",plain) +// VALUE +// SCALAR("value 2",plain) +// BLOCK-END +// BLOCK-END +// STREAM-END +// +// 2. Block mappings: +// +// a simple key: a value # The KEY token is produced here. +// ? a complex key +// : another value +// a mapping: +// key 1: value 1 +// key 2: value 2 +// a sequence: +// - item 1 +// - item 2 +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-MAPPING-START +// KEY +// SCALAR("a simple key",plain) +// VALUE +// SCALAR("a value",plain) +// KEY +// SCALAR("a complex key",plain) +// VALUE +// SCALAR("another value",plain) +// KEY +// SCALAR("a mapping",plain) +// BLOCK-MAPPING-START +// KEY +// SCALAR("key 1",plain) +// VALUE +// SCALAR("value 1",plain) +// KEY +// SCALAR("key 2",plain) +// VALUE +// SCALAR("value 2",plain) +// BLOCK-END +// KEY +// SCALAR("a sequence",plain) +// VALUE +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-END +// BLOCK-END +// STREAM-END +// +// YAML does not always require to start a new block collection from a new +// line. If the current line contains only '-', '?', and ':' indicators, a new +// block collection may start at the current line. The following examples +// illustrate this case: +// +// 1. Collections in a sequence: +// +// - - item 1 +// - item 2 +// - key 1: value 1 +// key 2: value 2 +// - ? complex key +// : complex value +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-END +// BLOCK-ENTRY +// BLOCK-MAPPING-START +// KEY +// SCALAR("key 1",plain) +// VALUE +// SCALAR("value 1",plain) +// KEY +// SCALAR("key 2",plain) +// VALUE +// SCALAR("value 2",plain) +// BLOCK-END +// BLOCK-ENTRY +// BLOCK-MAPPING-START +// KEY +// SCALAR("complex key") +// VALUE +// SCALAR("complex value") +// BLOCK-END +// BLOCK-END +// STREAM-END +// +// 2. Collections in a mapping: +// +// ? a sequence +// : - item 1 +// - item 2 +// ? a mapping +// : key 1: value 1 +// key 2: value 2 +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-MAPPING-START +// KEY +// SCALAR("a sequence",plain) +// VALUE +// BLOCK-SEQUENCE-START +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-END +// KEY +// SCALAR("a mapping",plain) +// VALUE +// BLOCK-MAPPING-START +// KEY +// SCALAR("key 1",plain) +// VALUE +// SCALAR("value 1",plain) +// KEY +// SCALAR("key 2",plain) +// VALUE +// SCALAR("value 2",plain) +// BLOCK-END +// BLOCK-END +// STREAM-END +// +// YAML also permits non-indented sequences if they are included into a block +// mapping. In this case, the token BLOCK-SEQUENCE-START is not produced: +// +// key: +// - item 1 # BLOCK-SEQUENCE-START is NOT produced here. +// - item 2 +// +// Tokens: +// +// STREAM-START(utf-8) +// BLOCK-MAPPING-START +// KEY +// SCALAR("key",plain) +// VALUE +// BLOCK-ENTRY +// SCALAR("item 1",plain) +// BLOCK-ENTRY +// SCALAR("item 2",plain) +// BLOCK-END +// + +// Ensure that the buffer contains the required number of characters. +// Return true on success, false on failure (reader error or memory error). +func cache(parser *yaml_parser_t, length int) bool { + // [Go] This was inlined: !cache(A, B) -> unread < B && !update(A, B) + return parser.unread >= length || yaml_parser_update_buffer(parser, length) +} + +// Advance the buffer pointer. +func skip(parser *yaml_parser_t) { + parser.mark.index++ + parser.mark.column++ + parser.unread-- + parser.buffer_pos += width(parser.buffer[parser.buffer_pos]) +} + +func skip_line(parser *yaml_parser_t) { + if is_crlf(parser.buffer, parser.buffer_pos) { + parser.mark.index += 2 + parser.mark.column = 0 + parser.mark.line++ + parser.unread -= 2 + parser.buffer_pos += 2 + } else if is_break(parser.buffer, parser.buffer_pos) { + parser.mark.index++ + parser.mark.column = 0 + parser.mark.line++ + parser.unread-- + parser.buffer_pos += width(parser.buffer[parser.buffer_pos]) + } +} + +// Copy a character to a string buffer and advance pointers. +func read(parser *yaml_parser_t, s []byte) []byte { + w := width(parser.buffer[parser.buffer_pos]) + if w == 0 { + panic("invalid character sequence") + } + if len(s) == 0 { + s = make([]byte, 0, 32) + } + if w == 1 && len(s)+w <= cap(s) { + s = s[:len(s)+1] + s[len(s)-1] = parser.buffer[parser.buffer_pos] + parser.buffer_pos++ + } else { + s = append(s, parser.buffer[parser.buffer_pos:parser.buffer_pos+w]...) + parser.buffer_pos += w + } + parser.mark.index++ + parser.mark.column++ + parser.unread-- + return s +} + +// Copy a line break character to a string buffer and advance pointers. +func read_line(parser *yaml_parser_t, s []byte) []byte { + buf := parser.buffer + pos := parser.buffer_pos + switch { + case buf[pos] == '\r' && buf[pos+1] == '\n': + // CR LF . LF + s = append(s, '\n') + parser.buffer_pos += 2 + parser.mark.index++ + parser.unread-- + case buf[pos] == '\r' || buf[pos] == '\n': + // CR|LF . LF + s = append(s, '\n') + parser.buffer_pos += 1 + case buf[pos] == '\xC2' && buf[pos+1] == '\x85': + // NEL . LF + s = append(s, '\n') + parser.buffer_pos += 2 + case buf[pos] == '\xE2' && buf[pos+1] == '\x80' && (buf[pos+2] == '\xA8' || buf[pos+2] == '\xA9'): + // LS|PS . LS|PS + s = append(s, buf[parser.buffer_pos:pos+3]...) + parser.buffer_pos += 3 + default: + return s + } + parser.mark.index++ + parser.mark.column = 0 + parser.mark.line++ + parser.unread-- + return s +} + +// Get the next token. +func yaml_parser_scan(parser *yaml_parser_t, token *yaml_token_t) bool { + // Erase the token object. + *token = yaml_token_t{} // [Go] Is this necessary? + + // No tokens after STREAM-END or error. + if parser.stream_end_produced || parser.error != yaml_NO_ERROR { + return true + } + + // Ensure that the tokens queue contains enough tokens. + if !parser.token_available { + if !yaml_parser_fetch_more_tokens(parser) { + return false + } + } + + // Fetch the next token from the queue. + *token = parser.tokens[parser.tokens_head] + parser.tokens_head++ + parser.tokens_parsed++ + parser.token_available = false + + if token.typ == yaml_STREAM_END_TOKEN { + parser.stream_end_produced = true + } + return true +} + +// Set the scanner error and return false. +func yaml_parser_set_scanner_error(parser *yaml_parser_t, context string, context_mark yaml_mark_t, problem string) bool { + parser.error = yaml_SCANNER_ERROR + parser.context = context + parser.context_mark = context_mark + parser.problem = problem + parser.problem_mark = parser.mark + return false +} + +func yaml_parser_set_scanner_tag_error(parser *yaml_parser_t, directive bool, context_mark yaml_mark_t, problem string) bool { + context := "while parsing a tag" + if directive { + context = "while parsing a %TAG directive" + } + return yaml_parser_set_scanner_error(parser, context, context_mark, "did not find URI escaped octet") +} + +func trace(args ...interface{}) func() { + pargs := append([]interface{}{"+++"}, args...) + fmt.Println(pargs...) + pargs = append([]interface{}{"---"}, args...) + return func() { fmt.Println(pargs...) } +} + +// Ensure that the tokens queue contains at least one token which can be +// returned to the Parser. +func yaml_parser_fetch_more_tokens(parser *yaml_parser_t) bool { + // While we need more tokens to fetch, do it. + for { + // Check if we really need to fetch more tokens. + need_more_tokens := false + + if parser.tokens_head == len(parser.tokens) { + // Queue is empty. + need_more_tokens = true + } else { + // Check if any potential simple key may occupy the head position. + if !yaml_parser_stale_simple_keys(parser) { + return false + } + + for i := range parser.simple_keys { + simple_key := &parser.simple_keys[i] + if simple_key.possible && simple_key.token_number == parser.tokens_parsed { + need_more_tokens = true + break + } + } + } + + // We are finished. + if !need_more_tokens { + break + } + // Fetch the next token. + if !yaml_parser_fetch_next_token(parser) { + return false + } + } + + parser.token_available = true + return true +} + +// The dispatcher for token fetchers. +func yaml_parser_fetch_next_token(parser *yaml_parser_t) bool { + // Ensure that the buffer is initialized. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + // Check if we just started scanning. Fetch STREAM-START then. + if !parser.stream_start_produced { + return yaml_parser_fetch_stream_start(parser) + } + + // Eat whitespaces and comments until we reach the next token. + if !yaml_parser_scan_to_next_token(parser) { + return false + } + + // Remove obsolete potential simple keys. + if !yaml_parser_stale_simple_keys(parser) { + return false + } + + // Check the indentation level against the current column. + if !yaml_parser_unroll_indent(parser, parser.mark.column) { + return false + } + + // Ensure that the buffer contains at least 4 characters. 4 is the length + // of the longest indicators ('--- ' and '... '). + if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { + return false + } + + // Is it the end of the stream? + if is_z(parser.buffer, parser.buffer_pos) { + return yaml_parser_fetch_stream_end(parser) + } + + // Is it a directive? + if parser.mark.column == 0 && parser.buffer[parser.buffer_pos] == '%' { + return yaml_parser_fetch_directive(parser) + } + + buf := parser.buffer + pos := parser.buffer_pos + + // Is it the document start indicator? + if parser.mark.column == 0 && buf[pos] == '-' && buf[pos+1] == '-' && buf[pos+2] == '-' && is_blankz(buf, pos+3) { + return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_START_TOKEN) + } + + // Is it the document end indicator? + if parser.mark.column == 0 && buf[pos] == '.' && buf[pos+1] == '.' && buf[pos+2] == '.' && is_blankz(buf, pos+3) { + return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_END_TOKEN) + } + + // Is it the flow sequence start indicator? + if buf[pos] == '[' { + return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_SEQUENCE_START_TOKEN) + } + + // Is it the flow mapping start indicator? + if parser.buffer[parser.buffer_pos] == '{' { + return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_MAPPING_START_TOKEN) + } + + // Is it the flow sequence end indicator? + if parser.buffer[parser.buffer_pos] == ']' { + return yaml_parser_fetch_flow_collection_end(parser, + yaml_FLOW_SEQUENCE_END_TOKEN) + } + + // Is it the flow mapping end indicator? + if parser.buffer[parser.buffer_pos] == '}' { + return yaml_parser_fetch_flow_collection_end(parser, + yaml_FLOW_MAPPING_END_TOKEN) + } + + // Is it the flow entry indicator? + if parser.buffer[parser.buffer_pos] == ',' { + return yaml_parser_fetch_flow_entry(parser) + } + + // Is it the block entry indicator? + if parser.buffer[parser.buffer_pos] == '-' && is_blankz(parser.buffer, parser.buffer_pos+1) { + return yaml_parser_fetch_block_entry(parser) + } + + // Is it the key indicator? + if parser.buffer[parser.buffer_pos] == '?' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) { + return yaml_parser_fetch_key(parser) + } + + // Is it the value indicator? + if parser.buffer[parser.buffer_pos] == ':' && (parser.flow_level > 0 || is_blankz(parser.buffer, parser.buffer_pos+1)) { + return yaml_parser_fetch_value(parser) + } + + // Is it an alias? + if parser.buffer[parser.buffer_pos] == '*' { + return yaml_parser_fetch_anchor(parser, yaml_ALIAS_TOKEN) + } + + // Is it an anchor? + if parser.buffer[parser.buffer_pos] == '&' { + return yaml_parser_fetch_anchor(parser, yaml_ANCHOR_TOKEN) + } + + // Is it a tag? + if parser.buffer[parser.buffer_pos] == '!' { + return yaml_parser_fetch_tag(parser) + } + + // Is it a literal scalar? + if parser.buffer[parser.buffer_pos] == '|' && parser.flow_level == 0 { + return yaml_parser_fetch_block_scalar(parser, true) + } + + // Is it a folded scalar? + if parser.buffer[parser.buffer_pos] == '>' && parser.flow_level == 0 { + return yaml_parser_fetch_block_scalar(parser, false) + } + + // Is it a single-quoted scalar? + if parser.buffer[parser.buffer_pos] == '\'' { + return yaml_parser_fetch_flow_scalar(parser, true) + } + + // Is it a double-quoted scalar? + if parser.buffer[parser.buffer_pos] == '"' { + return yaml_parser_fetch_flow_scalar(parser, false) + } + + // Is it a plain scalar? + // + // A plain scalar may start with any non-blank characters except + // + // '-', '?', ':', ',', '[', ']', '{', '}', + // '#', '&', '*', '!', '|', '>', '\'', '\"', + // '%', '@', '`'. + // + // In the block context (and, for the '-' indicator, in the flow context + // too), it may also start with the characters + // + // '-', '?', ':' + // + // if it is followed by a non-space character. + // + // The last rule is more restrictive than the specification requires. + // [Go] Make this logic more reasonable. + //switch parser.buffer[parser.buffer_pos] { + //case '-', '?', ':', ',', '?', '-', ',', ':', ']', '[', '}', '{', '&', '#', '!', '*', '>', '|', '"', '\'', '@', '%', '-', '`': + //} + if !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '-' || + parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':' || + parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '[' || + parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' || + parser.buffer[parser.buffer_pos] == '}' || parser.buffer[parser.buffer_pos] == '#' || + parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '*' || + parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '|' || + parser.buffer[parser.buffer_pos] == '>' || parser.buffer[parser.buffer_pos] == '\'' || + parser.buffer[parser.buffer_pos] == '"' || parser.buffer[parser.buffer_pos] == '%' || + parser.buffer[parser.buffer_pos] == '@' || parser.buffer[parser.buffer_pos] == '`') || + (parser.buffer[parser.buffer_pos] == '-' && !is_blank(parser.buffer, parser.buffer_pos+1)) || + (parser.flow_level == 0 && + (parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':') && + !is_blankz(parser.buffer, parser.buffer_pos+1)) { + return yaml_parser_fetch_plain_scalar(parser) + } + + // If we don't determine the token type so far, it is an error. + return yaml_parser_set_scanner_error(parser, + "while scanning for the next token", parser.mark, + "found character that cannot start any token") +} + +// Check the list of potential simple keys and remove the positions that +// cannot contain simple keys anymore. +func yaml_parser_stale_simple_keys(parser *yaml_parser_t) bool { + // Check for a potential simple key for each flow level. + for i := range parser.simple_keys { + simple_key := &parser.simple_keys[i] + + // The specification requires that a simple key + // + // - is limited to a single line, + // - is shorter than 1024 characters. + if simple_key.possible && (simple_key.mark.line < parser.mark.line || simple_key.mark.index+1024 < parser.mark.index) { + + // Check if the potential simple key to be removed is required. + if simple_key.required { + return yaml_parser_set_scanner_error(parser, + "while scanning a simple key", simple_key.mark, + "could not find expected ':'") + } + simple_key.possible = false + } + } + return true +} + +// Check if a simple key may start at the current position and add it if +// needed. +func yaml_parser_save_simple_key(parser *yaml_parser_t) bool { + // A simple key is required at the current position if the scanner is in + // the block context and the current column coincides with the indentation + // level. + + required := parser.flow_level == 0 && parser.indent == parser.mark.column + + // A simple key is required only when it is the first token in the current + // line. Therefore it is always allowed. But we add a check anyway. + if required && !parser.simple_key_allowed { + panic("should not happen") + } + + // + // If the current position may start a simple key, save it. + // + if parser.simple_key_allowed { + simple_key := yaml_simple_key_t{ + possible: true, + required: required, + token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head), + } + simple_key.mark = parser.mark + + if !yaml_parser_remove_simple_key(parser) { + return false + } + parser.simple_keys[len(parser.simple_keys)-1] = simple_key + } + return true +} + +// Remove a potential simple key at the current flow level. +func yaml_parser_remove_simple_key(parser *yaml_parser_t) bool { + i := len(parser.simple_keys) - 1 + if parser.simple_keys[i].possible { + // If the key is required, it is an error. + if parser.simple_keys[i].required { + return yaml_parser_set_scanner_error(parser, + "while scanning a simple key", parser.simple_keys[i].mark, + "could not find expected ':'") + } + } + // Remove the key from the stack. + parser.simple_keys[i].possible = false + return true +} + +// Increase the flow level and resize the simple key list if needed. +func yaml_parser_increase_flow_level(parser *yaml_parser_t) bool { + // Reset the simple key on the next level. + parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{}) + + // Increase the flow level. + parser.flow_level++ + return true +} + +// Decrease the flow level. +func yaml_parser_decrease_flow_level(parser *yaml_parser_t) bool { + if parser.flow_level > 0 { + parser.flow_level-- + parser.simple_keys = parser.simple_keys[:len(parser.simple_keys)-1] + } + return true +} + +// Push the current indentation level to the stack and set the new level +// the current column is greater than the indentation level. In this case, +// append or insert the specified token into the token queue. +func yaml_parser_roll_indent(parser *yaml_parser_t, column, number int, typ yaml_token_type_t, mark yaml_mark_t) bool { + // In the flow context, do nothing. + if parser.flow_level > 0 { + return true + } + + if parser.indent < column { + // Push the current indentation level to the stack and set the new + // indentation level. + parser.indents = append(parser.indents, parser.indent) + parser.indent = column + + // Create a token and insert it into the queue. + token := yaml_token_t{ + typ: typ, + start_mark: mark, + end_mark: mark, + } + if number > -1 { + number -= parser.tokens_parsed + } + yaml_insert_token(parser, number, &token) + } + return true +} + +// Pop indentation levels from the indents stack until the current level +// becomes less or equal to the column. For each intendation level, append +// the BLOCK-END token. +func yaml_parser_unroll_indent(parser *yaml_parser_t, column int) bool { + // In the flow context, do nothing. + if parser.flow_level > 0 { + return true + } + + // Loop through the intendation levels in the stack. + for parser.indent > column { + // Create a token and append it to the queue. + token := yaml_token_t{ + typ: yaml_BLOCK_END_TOKEN, + start_mark: parser.mark, + end_mark: parser.mark, + } + yaml_insert_token(parser, -1, &token) + + // Pop the indentation level. + parser.indent = parser.indents[len(parser.indents)-1] + parser.indents = parser.indents[:len(parser.indents)-1] + } + return true +} + +// Initialize the scanner and produce the STREAM-START token. +func yaml_parser_fetch_stream_start(parser *yaml_parser_t) bool { + + // Set the initial indentation. + parser.indent = -1 + + // Initialize the simple key stack. + parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{}) + + // A simple key is allowed at the beginning of the stream. + parser.simple_key_allowed = true + + // We have started. + parser.stream_start_produced = true + + // Create the STREAM-START token and append it to the queue. + token := yaml_token_t{ + typ: yaml_STREAM_START_TOKEN, + start_mark: parser.mark, + end_mark: parser.mark, + encoding: parser.encoding, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the STREAM-END token and shut down the scanner. +func yaml_parser_fetch_stream_end(parser *yaml_parser_t) bool { + + // Force new line. + if parser.mark.column != 0 { + parser.mark.column = 0 + parser.mark.line++ + } + + // Reset the indentation level. + if !yaml_parser_unroll_indent(parser, -1) { + return false + } + + // Reset simple keys. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + parser.simple_key_allowed = false + + // Create the STREAM-END token and append it to the queue. + token := yaml_token_t{ + typ: yaml_STREAM_END_TOKEN, + start_mark: parser.mark, + end_mark: parser.mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce a VERSION-DIRECTIVE or TAG-DIRECTIVE token. +func yaml_parser_fetch_directive(parser *yaml_parser_t) bool { + // Reset the indentation level. + if !yaml_parser_unroll_indent(parser, -1) { + return false + } + + // Reset simple keys. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + parser.simple_key_allowed = false + + // Create the YAML-DIRECTIVE or TAG-DIRECTIVE token. + token := yaml_token_t{} + if !yaml_parser_scan_directive(parser, &token) { + return false + } + // Append the token to the queue. + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the DOCUMENT-START or DOCUMENT-END token. +func yaml_parser_fetch_document_indicator(parser *yaml_parser_t, typ yaml_token_type_t) bool { + // Reset the indentation level. + if !yaml_parser_unroll_indent(parser, -1) { + return false + } + + // Reset simple keys. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + parser.simple_key_allowed = false + + // Consume the token. + start_mark := parser.mark + + skip(parser) + skip(parser) + skip(parser) + + end_mark := parser.mark + + // Create the DOCUMENT-START or DOCUMENT-END token. + token := yaml_token_t{ + typ: typ, + start_mark: start_mark, + end_mark: end_mark, + } + // Append the token to the queue. + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the FLOW-SEQUENCE-START or FLOW-MAPPING-START token. +func yaml_parser_fetch_flow_collection_start(parser *yaml_parser_t, typ yaml_token_type_t) bool { + // The indicators '[' and '{' may start a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // Increase the flow level. + if !yaml_parser_increase_flow_level(parser) { + return false + } + + // A simple key may follow the indicators '[' and '{'. + parser.simple_key_allowed = true + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the FLOW-SEQUENCE-START of FLOW-MAPPING-START token. + token := yaml_token_t{ + typ: typ, + start_mark: start_mark, + end_mark: end_mark, + } + // Append the token to the queue. + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the FLOW-SEQUENCE-END or FLOW-MAPPING-END token. +func yaml_parser_fetch_flow_collection_end(parser *yaml_parser_t, typ yaml_token_type_t) bool { + // Reset any potential simple key on the current flow level. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // Decrease the flow level. + if !yaml_parser_decrease_flow_level(parser) { + return false + } + + // No simple keys after the indicators ']' and '}'. + parser.simple_key_allowed = false + + // Consume the token. + + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the FLOW-SEQUENCE-END of FLOW-MAPPING-END token. + token := yaml_token_t{ + typ: typ, + start_mark: start_mark, + end_mark: end_mark, + } + // Append the token to the queue. + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the FLOW-ENTRY token. +func yaml_parser_fetch_flow_entry(parser *yaml_parser_t) bool { + // Reset any potential simple keys on the current flow level. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // Simple keys are allowed after ','. + parser.simple_key_allowed = true + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the FLOW-ENTRY token and append it to the queue. + token := yaml_token_t{ + typ: yaml_FLOW_ENTRY_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the BLOCK-ENTRY token. +func yaml_parser_fetch_block_entry(parser *yaml_parser_t) bool { + // Check if the scanner is in the block context. + if parser.flow_level == 0 { + // Check if we are allowed to start a new entry. + if !parser.simple_key_allowed { + return yaml_parser_set_scanner_error(parser, "", parser.mark, + "block sequence entries are not allowed in this context") + } + // Add the BLOCK-SEQUENCE-START token if needed. + if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_SEQUENCE_START_TOKEN, parser.mark) { + return false + } + } else { + // It is an error for the '-' indicator to occur in the flow context, + // but we let the Parser detect and report about it because the Parser + // is able to point to the context. + } + + // Reset any potential simple keys on the current flow level. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // Simple keys are allowed after '-'. + parser.simple_key_allowed = true + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the BLOCK-ENTRY token and append it to the queue. + token := yaml_token_t{ + typ: yaml_BLOCK_ENTRY_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the KEY token. +func yaml_parser_fetch_key(parser *yaml_parser_t) bool { + + // In the block context, additional checks are required. + if parser.flow_level == 0 { + // Check if we are allowed to start a new key (not nessesary simple). + if !parser.simple_key_allowed { + return yaml_parser_set_scanner_error(parser, "", parser.mark, + "mapping keys are not allowed in this context") + } + // Add the BLOCK-MAPPING-START token if needed. + if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) { + return false + } + } + + // Reset any potential simple keys on the current flow level. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // Simple keys are allowed after '?' in the block context. + parser.simple_key_allowed = parser.flow_level == 0 + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the KEY token and append it to the queue. + token := yaml_token_t{ + typ: yaml_KEY_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the VALUE token. +func yaml_parser_fetch_value(parser *yaml_parser_t) bool { + + simple_key := &parser.simple_keys[len(parser.simple_keys)-1] + + // Have we found a simple key? + if simple_key.possible { + // Create the KEY token and insert it into the queue. + token := yaml_token_t{ + typ: yaml_KEY_TOKEN, + start_mark: simple_key.mark, + end_mark: simple_key.mark, + } + yaml_insert_token(parser, simple_key.token_number-parser.tokens_parsed, &token) + + // In the block context, we may need to add the BLOCK-MAPPING-START token. + if !yaml_parser_roll_indent(parser, simple_key.mark.column, + simple_key.token_number, + yaml_BLOCK_MAPPING_START_TOKEN, simple_key.mark) { + return false + } + + // Remove the simple key. + simple_key.possible = false + + // A simple key cannot follow another simple key. + parser.simple_key_allowed = false + + } else { + // The ':' indicator follows a complex key. + + // In the block context, extra checks are required. + if parser.flow_level == 0 { + + // Check if we are allowed to start a complex value. + if !parser.simple_key_allowed { + return yaml_parser_set_scanner_error(parser, "", parser.mark, + "mapping values are not allowed in this context") + } + + // Add the BLOCK-MAPPING-START token if needed. + if !yaml_parser_roll_indent(parser, parser.mark.column, -1, yaml_BLOCK_MAPPING_START_TOKEN, parser.mark) { + return false + } + } + + // Simple keys after ':' are allowed in the block context. + parser.simple_key_allowed = parser.flow_level == 0 + } + + // Consume the token. + start_mark := parser.mark + skip(parser) + end_mark := parser.mark + + // Create the VALUE token and append it to the queue. + token := yaml_token_t{ + typ: yaml_VALUE_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the ALIAS or ANCHOR token. +func yaml_parser_fetch_anchor(parser *yaml_parser_t, typ yaml_token_type_t) bool { + // An anchor or an alias could be a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // A simple key cannot follow an anchor or an alias. + parser.simple_key_allowed = false + + // Create the ALIAS or ANCHOR token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_anchor(parser, &token, typ) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the TAG token. +func yaml_parser_fetch_tag(parser *yaml_parser_t) bool { + // A tag could be a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // A simple key cannot follow a tag. + parser.simple_key_allowed = false + + // Create the TAG token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_tag(parser, &token) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the SCALAR(...,literal) or SCALAR(...,folded) tokens. +func yaml_parser_fetch_block_scalar(parser *yaml_parser_t, literal bool) bool { + // Remove any potential simple keys. + if !yaml_parser_remove_simple_key(parser) { + return false + } + + // A simple key may follow a block scalar. + parser.simple_key_allowed = true + + // Create the SCALAR token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_block_scalar(parser, &token, literal) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the SCALAR(...,single-quoted) or SCALAR(...,double-quoted) tokens. +func yaml_parser_fetch_flow_scalar(parser *yaml_parser_t, single bool) bool { + // A plain scalar could be a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // A simple key cannot follow a flow scalar. + parser.simple_key_allowed = false + + // Create the SCALAR token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_flow_scalar(parser, &token, single) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Produce the SCALAR(...,plain) token. +func yaml_parser_fetch_plain_scalar(parser *yaml_parser_t) bool { + // A plain scalar could be a simple key. + if !yaml_parser_save_simple_key(parser) { + return false + } + + // A simple key cannot follow a flow scalar. + parser.simple_key_allowed = false + + // Create the SCALAR token and append it to the queue. + var token yaml_token_t + if !yaml_parser_scan_plain_scalar(parser, &token) { + return false + } + yaml_insert_token(parser, -1, &token) + return true +} + +// Eat whitespaces and comments until the next token is found. +func yaml_parser_scan_to_next_token(parser *yaml_parser_t) bool { + + // Until the next token is not found. + for { + // Allow the BOM mark to start a line. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if parser.mark.column == 0 && is_bom(parser.buffer, parser.buffer_pos) { + skip(parser) + } + + // Eat whitespaces. + // Tabs are allowed: + // - in the flow context + // - in the block context, but not at the beginning of the line or + // after '-', '?', or ':' (complex value). + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for parser.buffer[parser.buffer_pos] == ' ' || ((parser.flow_level > 0 || !parser.simple_key_allowed) && parser.buffer[parser.buffer_pos] == '\t') { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Eat a comment until a line break. + if parser.buffer[parser.buffer_pos] == '#' { + for !is_breakz(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + } + + // If it is a line break, eat it. + if is_break(parser.buffer, parser.buffer_pos) { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + skip_line(parser) + + // In the block context, a new line may start a simple key. + if parser.flow_level == 0 { + parser.simple_key_allowed = true + } + } else { + break // We have found a token. + } + } + + return true +} + +// Scan a YAML-DIRECTIVE or TAG-DIRECTIVE token. +// +// Scope: +// %YAML 1.1 # a comment \n +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +// %TAG !yaml! tag:yaml.org,2002: \n +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +// +func yaml_parser_scan_directive(parser *yaml_parser_t, token *yaml_token_t) bool { + // Eat '%'. + start_mark := parser.mark + skip(parser) + + // Scan the directive name. + var name []byte + if !yaml_parser_scan_directive_name(parser, start_mark, &name) { + return false + } + + // Is it a YAML directive? + if bytes.Equal(name, []byte("YAML")) { + // Scan the VERSION directive value. + var major, minor int8 + if !yaml_parser_scan_version_directive_value(parser, start_mark, &major, &minor) { + return false + } + end_mark := parser.mark + + // Create a VERSION-DIRECTIVE token. + *token = yaml_token_t{ + typ: yaml_VERSION_DIRECTIVE_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + major: major, + minor: minor, + } + + // Is it a TAG directive? + } else if bytes.Equal(name, []byte("TAG")) { + // Scan the TAG directive value. + var handle, prefix []byte + if !yaml_parser_scan_tag_directive_value(parser, start_mark, &handle, &prefix) { + return false + } + end_mark := parser.mark + + // Create a TAG-DIRECTIVE token. + *token = yaml_token_t{ + typ: yaml_TAG_DIRECTIVE_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: handle, + prefix: prefix, + } + + // Unknown directive. + } else { + yaml_parser_set_scanner_error(parser, "while scanning a directive", + start_mark, "found uknown directive name") + return false + } + + // Eat the rest of the line including any comments. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + if parser.buffer[parser.buffer_pos] == '#' { + for !is_breakz(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + } + + // Check if we are at the end of the line. + if !is_breakz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a directive", + start_mark, "did not find expected comment or line break") + return false + } + + // Eat a line break. + if is_break(parser.buffer, parser.buffer_pos) { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + skip_line(parser) + } + + return true +} + +// Scan the directive name. +// +// Scope: +// %YAML 1.1 # a comment \n +// ^^^^ +// %TAG !yaml! tag:yaml.org,2002: \n +// ^^^ +// +func yaml_parser_scan_directive_name(parser *yaml_parser_t, start_mark yaml_mark_t, name *[]byte) bool { + // Consume the directive name. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + var s []byte + for is_alpha(parser.buffer, parser.buffer_pos) { + s = read(parser, s) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check if the name is empty. + if len(s) == 0 { + yaml_parser_set_scanner_error(parser, "while scanning a directive", + start_mark, "could not find expected directive name") + return false + } + + // Check for an blank character after the name. + if !is_blankz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a directive", + start_mark, "found unexpected non-alphabetical character") + return false + } + *name = s + return true +} + +// Scan the value of VERSION-DIRECTIVE. +// +// Scope: +// %YAML 1.1 # a comment \n +// ^^^^^^ +func yaml_parser_scan_version_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, major, minor *int8) bool { + // Eat whitespaces. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Consume the major version number. + if !yaml_parser_scan_version_directive_number(parser, start_mark, major) { + return false + } + + // Eat '.'. + if parser.buffer[parser.buffer_pos] != '.' { + return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", + start_mark, "did not find expected digit or '.' character") + } + + skip(parser) + + // Consume the minor version number. + if !yaml_parser_scan_version_directive_number(parser, start_mark, minor) { + return false + } + return true +} + +const max_number_length = 2 + +// Scan the version number of VERSION-DIRECTIVE. +// +// Scope: +// %YAML 1.1 # a comment \n +// ^ +// %YAML 1.1 # a comment \n +// ^ +func yaml_parser_scan_version_directive_number(parser *yaml_parser_t, start_mark yaml_mark_t, number *int8) bool { + + // Repeat while the next character is digit. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + var value, length int8 + for is_digit(parser.buffer, parser.buffer_pos) { + // Check if the number is too long. + length++ + if length > max_number_length { + return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", + start_mark, "found extremely long version number") + } + value = value*10 + int8(as_digit(parser.buffer, parser.buffer_pos)) + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check if the number was present. + if length == 0 { + return yaml_parser_set_scanner_error(parser, "while scanning a %YAML directive", + start_mark, "did not find expected version number") + } + *number = value + return true +} + +// Scan the value of a TAG-DIRECTIVE token. +// +// Scope: +// %TAG !yaml! tag:yaml.org,2002: \n +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +// +func yaml_parser_scan_tag_directive_value(parser *yaml_parser_t, start_mark yaml_mark_t, handle, prefix *[]byte) bool { + var handle_value, prefix_value []byte + + // Eat whitespaces. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Scan a handle. + if !yaml_parser_scan_tag_handle(parser, true, start_mark, &handle_value) { + return false + } + + // Expect a whitespace. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if !is_blank(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive", + start_mark, "did not find expected whitespace") + return false + } + + // Eat whitespaces. + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Scan a prefix. + if !yaml_parser_scan_tag_uri(parser, true, nil, start_mark, &prefix_value) { + return false + } + + // Expect a whitespace or line break. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if !is_blankz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a %TAG directive", + start_mark, "did not find expected whitespace or line break") + return false + } + + *handle = handle_value + *prefix = prefix_value + return true +} + +func yaml_parser_scan_anchor(parser *yaml_parser_t, token *yaml_token_t, typ yaml_token_type_t) bool { + var s []byte + + // Eat the indicator character. + start_mark := parser.mark + skip(parser) + + // Consume the value. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for is_alpha(parser.buffer, parser.buffer_pos) { + s = read(parser, s) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + end_mark := parser.mark + + /* + * Check if length of the anchor is greater than 0 and it is followed by + * a whitespace character or one of the indicators: + * + * '?', ':', ',', ']', '}', '%', '@', '`'. + */ + + if len(s) == 0 || + !(is_blankz(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == '?' || + parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == ',' || + parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '}' || + parser.buffer[parser.buffer_pos] == '%' || parser.buffer[parser.buffer_pos] == '@' || + parser.buffer[parser.buffer_pos] == '`') { + context := "while scanning an alias" + if typ == yaml_ANCHOR_TOKEN { + context = "while scanning an anchor" + } + yaml_parser_set_scanner_error(parser, context, start_mark, + "did not find expected alphabetic or numeric character") + return false + } + + // Create a token. + *token = yaml_token_t{ + typ: typ, + start_mark: start_mark, + end_mark: end_mark, + value: s, + } + + return true +} + +/* + * Scan a TAG token. + */ + +func yaml_parser_scan_tag(parser *yaml_parser_t, token *yaml_token_t) bool { + var handle, suffix []byte + + start_mark := parser.mark + + // Check if the tag is in the canonical form. + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + + if parser.buffer[parser.buffer_pos+1] == '<' { + // Keep the handle as '' + + // Eat '!<' + skip(parser) + skip(parser) + + // Consume the tag value. + if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) { + return false + } + + // Check for '>' and eat it. + if parser.buffer[parser.buffer_pos] != '>' { + yaml_parser_set_scanner_error(parser, "while scanning a tag", + start_mark, "did not find the expected '>'") + return false + } + + skip(parser) + } else { + // The tag has either the '!suffix' or the '!handle!suffix' form. + + // First, try to scan a handle. + if !yaml_parser_scan_tag_handle(parser, false, start_mark, &handle) { + return false + } + + // Check if it is, indeed, handle. + if handle[0] == '!' && len(handle) > 1 && handle[len(handle)-1] == '!' { + // Scan the suffix now. + if !yaml_parser_scan_tag_uri(parser, false, nil, start_mark, &suffix) { + return false + } + } else { + // It wasn't a handle after all. Scan the rest of the tag. + if !yaml_parser_scan_tag_uri(parser, false, handle, start_mark, &suffix) { + return false + } + + // Set the handle to '!'. + handle = []byte{'!'} + + // A special case: the '!' tag. Set the handle to '' and the + // suffix to '!'. + if len(suffix) == 0 { + handle, suffix = suffix, handle + } + } + } + + // Check the character which ends the tag. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if !is_blankz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a tag", + start_mark, "did not find expected whitespace or line break") + return false + } + + end_mark := parser.mark + + // Create a token. + *token = yaml_token_t{ + typ: yaml_TAG_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: handle, + suffix: suffix, + } + return true +} + +// Scan a tag handle. +func yaml_parser_scan_tag_handle(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, handle *[]byte) bool { + // Check the initial '!' character. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if parser.buffer[parser.buffer_pos] != '!' { + yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "did not find expected '!'") + return false + } + + var s []byte + + // Copy the '!' character. + s = read(parser, s) + + // Copy all subsequent alphabetical and numerical characters. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + for is_alpha(parser.buffer, parser.buffer_pos) { + s = read(parser, s) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check if the trailing character is '!' and copy it. + if parser.buffer[parser.buffer_pos] == '!' { + s = read(parser, s) + } else { + // It's either the '!' tag or not really a tag handle. If it's a %TAG + // directive, it's an error. If it's a tag token, it must be a part of URI. + if directive && !(s[0] == '!' && s[1] == 0) { + yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "did not find expected '!'") + return false + } + } + + *handle = s + return true +} + +// Scan a tag. +func yaml_parser_scan_tag_uri(parser *yaml_parser_t, directive bool, head []byte, start_mark yaml_mark_t, uri *[]byte) bool { + //size_t length = head ? strlen((char *)head) : 0 + var s []byte + + // Copy the head if needed. + // + // Note that we don't copy the leading '!' character. + if len(head) > 1 { + s = append(s, head[1:]...) + } + + // Scan the tag. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + // The set of characters that may appear in URI is as follows: + // + // '0'-'9', 'A'-'Z', 'a'-'z', '_', '-', ';', '/', '?', ':', '@', '&', + // '=', '+', '$', ',', '.', '!', '~', '*', '\'', '(', ')', '[', ']', + // '%'. + // [Go] Convert this into more reasonable logic. + for is_alpha(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == ';' || + parser.buffer[parser.buffer_pos] == '/' || parser.buffer[parser.buffer_pos] == '?' || + parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == '@' || + parser.buffer[parser.buffer_pos] == '&' || parser.buffer[parser.buffer_pos] == '=' || + parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '$' || + parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == '.' || + parser.buffer[parser.buffer_pos] == '!' || parser.buffer[parser.buffer_pos] == '~' || + parser.buffer[parser.buffer_pos] == '*' || parser.buffer[parser.buffer_pos] == '\'' || + parser.buffer[parser.buffer_pos] == '(' || parser.buffer[parser.buffer_pos] == ')' || + parser.buffer[parser.buffer_pos] == '[' || parser.buffer[parser.buffer_pos] == ']' || + parser.buffer[parser.buffer_pos] == '%' { + // Check if it is a URI-escape sequence. + if parser.buffer[parser.buffer_pos] == '%' { + if !yaml_parser_scan_uri_escapes(parser, directive, start_mark, &s) { + return false + } + } else { + s = read(parser, s) + } + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check if the tag is non-empty. + if len(s) == 0 { + yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "did not find expected tag URI") + return false + } + *uri = s + return true +} + +// Decode an URI-escape sequence corresponding to a single UTF-8 character. +func yaml_parser_scan_uri_escapes(parser *yaml_parser_t, directive bool, start_mark yaml_mark_t, s *[]byte) bool { + + // Decode the required number of characters. + w := 1024 + for w > 0 { + // Check for a URI-escaped octet. + if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) { + return false + } + + if !(parser.buffer[parser.buffer_pos] == '%' && + is_hex(parser.buffer, parser.buffer_pos+1) && + is_hex(parser.buffer, parser.buffer_pos+2)) { + return yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "did not find URI escaped octet") + } + + // Get the octet. + octet := byte((as_hex(parser.buffer, parser.buffer_pos+1) << 4) + as_hex(parser.buffer, parser.buffer_pos+2)) + + // If it is the leading octet, determine the length of the UTF-8 sequence. + if w == 1024 { + w = width(octet) + if w == 0 { + return yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "found an incorrect leading UTF-8 octet") + } + } else { + // Check if the trailing octet is correct. + if octet&0xC0 != 0x80 { + return yaml_parser_set_scanner_tag_error(parser, directive, + start_mark, "found an incorrect trailing UTF-8 octet") + } + } + + // Copy the octet and move the pointers. + *s = append(*s, octet) + skip(parser) + skip(parser) + skip(parser) + w-- + } + return true +} + +// Scan a block scalar. +func yaml_parser_scan_block_scalar(parser *yaml_parser_t, token *yaml_token_t, literal bool) bool { + // Eat the indicator '|' or '>'. + start_mark := parser.mark + skip(parser) + + // Scan the additional block scalar indicators. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + // Check for a chomping indicator. + var chomping, increment int + if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' { + // Set the chomping method and eat the indicator. + if parser.buffer[parser.buffer_pos] == '+' { + chomping = +1 + } else { + chomping = -1 + } + skip(parser) + + // Check for an indentation indicator. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if is_digit(parser.buffer, parser.buffer_pos) { + // Check that the intendation is greater than 0. + if parser.buffer[parser.buffer_pos] == '0' { + yaml_parser_set_scanner_error(parser, "while scanning a block scalar", + start_mark, "found an intendation indicator equal to 0") + return false + } + + // Get the intendation level and eat the indicator. + increment = as_digit(parser.buffer, parser.buffer_pos) + skip(parser) + } + + } else if is_digit(parser.buffer, parser.buffer_pos) { + // Do the same as above, but in the opposite order. + + if parser.buffer[parser.buffer_pos] == '0' { + yaml_parser_set_scanner_error(parser, "while scanning a block scalar", + start_mark, "found an intendation indicator equal to 0") + return false + } + increment = as_digit(parser.buffer, parser.buffer_pos) + skip(parser) + + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if parser.buffer[parser.buffer_pos] == '+' || parser.buffer[parser.buffer_pos] == '-' { + if parser.buffer[parser.buffer_pos] == '+' { + chomping = +1 + } else { + chomping = -1 + } + skip(parser) + } + } + + // Eat whitespaces and comments to the end of the line. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + for is_blank(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + if parser.buffer[parser.buffer_pos] == '#' { + for !is_breakz(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + } + + // Check if we are at the end of the line. + if !is_breakz(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a block scalar", + start_mark, "did not find expected comment or line break") + return false + } + + // Eat a line break. + if is_break(parser.buffer, parser.buffer_pos) { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + skip_line(parser) + } + + end_mark := parser.mark + + // Set the intendation level if it was specified. + var indent int + if increment > 0 { + if parser.indent >= 0 { + indent = parser.indent + increment + } else { + indent = increment + } + } + + // Scan the leading line breaks and determine the indentation level if needed. + var s, leading_break, trailing_breaks []byte + if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) { + return false + } + + // Scan the block scalar content. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + var leading_blank, trailing_blank bool + for parser.mark.column == indent && !is_z(parser.buffer, parser.buffer_pos) { + // We are at the beginning of a non-empty line. + + // Is it a trailing whitespace? + trailing_blank = is_blank(parser.buffer, parser.buffer_pos) + + // Check if we need to fold the leading line break. + if !literal && !leading_blank && !trailing_blank && len(leading_break) > 0 && leading_break[0] == '\n' { + // Do we need to join the lines by space? + if len(trailing_breaks) == 0 { + s = append(s, ' ') + } + } else { + s = append(s, leading_break...) + } + leading_break = leading_break[:0] + + // Append the remaining line breaks. + s = append(s, trailing_breaks...) + trailing_breaks = trailing_breaks[:0] + + // Is it a leading whitespace? + leading_blank = is_blank(parser.buffer, parser.buffer_pos) + + // Consume the current line. + for !is_breakz(parser.buffer, parser.buffer_pos) { + s = read(parser, s) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Consume the line break. + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + + leading_break = read_line(parser, leading_break) + + // Eat the following intendation spaces and line breaks. + if !yaml_parser_scan_block_scalar_breaks(parser, &indent, &trailing_breaks, start_mark, &end_mark) { + return false + } + } + + // Chomp the tail. + if chomping != -1 { + s = append(s, leading_break...) + } + if chomping == 1 { + s = append(s, trailing_breaks...) + } + + // Create a token. + *token = yaml_token_t{ + typ: yaml_SCALAR_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: s, + style: yaml_LITERAL_SCALAR_STYLE, + } + if !literal { + token.style = yaml_FOLDED_SCALAR_STYLE + } + return true +} + +// Scan intendation spaces and line breaks for a block scalar. Determine the +// intendation level if needed. +func yaml_parser_scan_block_scalar_breaks(parser *yaml_parser_t, indent *int, breaks *[]byte, start_mark yaml_mark_t, end_mark *yaml_mark_t) bool { + *end_mark = parser.mark + + // Eat the intendation spaces and line breaks. + max_indent := 0 + for { + // Eat the intendation spaces. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + for (*indent == 0 || parser.mark.column < *indent) && is_space(parser.buffer, parser.buffer_pos) { + skip(parser) + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + if parser.mark.column > max_indent { + max_indent = parser.mark.column + } + + // Check for a tab character messing the intendation. + if (*indent == 0 || parser.mark.column < *indent) && is_tab(parser.buffer, parser.buffer_pos) { + return yaml_parser_set_scanner_error(parser, "while scanning a block scalar", + start_mark, "found a tab character where an intendation space is expected") + } + + // Have we found a non-empty line? + if !is_break(parser.buffer, parser.buffer_pos) { + break + } + + // Consume the line break. + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + // [Go] Should really be returning breaks instead. + *breaks = read_line(parser, *breaks) + *end_mark = parser.mark + } + + // Determine the indentation level if needed. + if *indent == 0 { + *indent = max_indent + if *indent < parser.indent+1 { + *indent = parser.indent + 1 + } + if *indent < 1 { + *indent = 1 + } + } + return true +} + +// Scan a quoted scalar. +func yaml_parser_scan_flow_scalar(parser *yaml_parser_t, token *yaml_token_t, single bool) bool { + // Eat the left quote. + start_mark := parser.mark + skip(parser) + + // Consume the content of the quoted scalar. + var s, leading_break, trailing_breaks, whitespaces []byte + for { + // Check that there are no document indicators at the beginning of the line. + if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { + return false + } + + if parser.mark.column == 0 && + ((parser.buffer[parser.buffer_pos+0] == '-' && + parser.buffer[parser.buffer_pos+1] == '-' && + parser.buffer[parser.buffer_pos+2] == '-') || + (parser.buffer[parser.buffer_pos+0] == '.' && + parser.buffer[parser.buffer_pos+1] == '.' && + parser.buffer[parser.buffer_pos+2] == '.')) && + is_blankz(parser.buffer, parser.buffer_pos+3) { + yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar", + start_mark, "found unexpected document indicator") + return false + } + + // Check for EOF. + if is_z(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a quoted scalar", + start_mark, "found unexpected end of stream") + return false + } + + // Consume non-blank characters. + leading_blanks := false + for !is_blankz(parser.buffer, parser.buffer_pos) { + if single && parser.buffer[parser.buffer_pos] == '\'' && parser.buffer[parser.buffer_pos+1] == '\'' { + // Is is an escaped single quote. + s = append(s, '\'') + skip(parser) + skip(parser) + + } else if single && parser.buffer[parser.buffer_pos] == '\'' { + // It is a right single quote. + break + } else if !single && parser.buffer[parser.buffer_pos] == '"' { + // It is a right double quote. + break + + } else if !single && parser.buffer[parser.buffer_pos] == '\\' && is_break(parser.buffer, parser.buffer_pos+1) { + // It is an escaped line break. + if parser.unread < 3 && !yaml_parser_update_buffer(parser, 3) { + return false + } + skip(parser) + skip_line(parser) + leading_blanks = true + break + + } else if !single && parser.buffer[parser.buffer_pos] == '\\' { + // It is an escape sequence. + code_length := 0 + + // Check the escape character. + switch parser.buffer[parser.buffer_pos+1] { + case '0': + s = append(s, 0) + case 'a': + s = append(s, '\x07') + case 'b': + s = append(s, '\x08') + case 't', '\t': + s = append(s, '\x09') + case 'n': + s = append(s, '\x0A') + case 'v': + s = append(s, '\x0B') + case 'f': + s = append(s, '\x0C') + case 'r': + s = append(s, '\x0D') + case 'e': + s = append(s, '\x1B') + case ' ': + s = append(s, '\x20') + case '"': + s = append(s, '"') + case '\'': + s = append(s, '\'') + case '\\': + s = append(s, '\\') + case 'N': // NEL (#x85) + s = append(s, '\xC2') + s = append(s, '\x85') + case '_': // #xA0 + s = append(s, '\xC2') + s = append(s, '\xA0') + case 'L': // LS (#x2028) + s = append(s, '\xE2') + s = append(s, '\x80') + s = append(s, '\xA8') + case 'P': // PS (#x2029) + s = append(s, '\xE2') + s = append(s, '\x80') + s = append(s, '\xA9') + case 'x': + code_length = 2 + case 'u': + code_length = 4 + case 'U': + code_length = 8 + default: + yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", + start_mark, "found unknown escape character") + return false + } + + skip(parser) + skip(parser) + + // Consume an arbitrary escape code. + if code_length > 0 { + var value int + + // Scan the character value. + if parser.unread < code_length && !yaml_parser_update_buffer(parser, code_length) { + return false + } + for k := 0; k < code_length; k++ { + if !is_hex(parser.buffer, parser.buffer_pos+k) { + yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", + start_mark, "did not find expected hexdecimal number") + return false + } + value = (value << 4) + as_hex(parser.buffer, parser.buffer_pos+k) + } + + // Check the value and write the character. + if (value >= 0xD800 && value <= 0xDFFF) || value > 0x10FFFF { + yaml_parser_set_scanner_error(parser, "while parsing a quoted scalar", + start_mark, "found invalid Unicode character escape code") + return false + } + if value <= 0x7F { + s = append(s, byte(value)) + } else if value <= 0x7FF { + s = append(s, byte(0xC0+(value>>6))) + s = append(s, byte(0x80+(value&0x3F))) + } else if value <= 0xFFFF { + s = append(s, byte(0xE0+(value>>12))) + s = append(s, byte(0x80+((value>>6)&0x3F))) + s = append(s, byte(0x80+(value&0x3F))) + } else { + s = append(s, byte(0xF0+(value>>18))) + s = append(s, byte(0x80+((value>>12)&0x3F))) + s = append(s, byte(0x80+((value>>6)&0x3F))) + s = append(s, byte(0x80+(value&0x3F))) + } + + // Advance the pointer. + for k := 0; k < code_length; k++ { + skip(parser) + } + } + } else { + // It is a non-escaped non-blank character. + s = read(parser, s) + } + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + } + + // Check if we are at the end of the scalar. + if single { + if parser.buffer[parser.buffer_pos] == '\'' { + break + } + } else { + if parser.buffer[parser.buffer_pos] == '"' { + break + } + } + + // Consume blank characters. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) { + if is_blank(parser.buffer, parser.buffer_pos) { + // Consume a space or a tab character. + if !leading_blanks { + whitespaces = read(parser, whitespaces) + } else { + skip(parser) + } + } else { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + + // Check if it is a first line break. + if !leading_blanks { + whitespaces = whitespaces[:0] + leading_break = read_line(parser, leading_break) + leading_blanks = true + } else { + trailing_breaks = read_line(parser, trailing_breaks) + } + } + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Join the whitespaces or fold line breaks. + if leading_blanks { + // Do we need to fold line breaks? + if len(leading_break) > 0 && leading_break[0] == '\n' { + if len(trailing_breaks) == 0 { + s = append(s, ' ') + } else { + s = append(s, trailing_breaks...) + } + } else { + s = append(s, leading_break...) + s = append(s, trailing_breaks...) + } + trailing_breaks = trailing_breaks[:0] + leading_break = leading_break[:0] + } else { + s = append(s, whitespaces...) + whitespaces = whitespaces[:0] + } + } + + // Eat the right quote. + skip(parser) + end_mark := parser.mark + + // Create a token. + *token = yaml_token_t{ + typ: yaml_SCALAR_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: s, + style: yaml_SINGLE_QUOTED_SCALAR_STYLE, + } + if !single { + token.style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + return true +} + +// Scan a plain scalar. +func yaml_parser_scan_plain_scalar(parser *yaml_parser_t, token *yaml_token_t) bool { + + var s, leading_break, trailing_breaks, whitespaces []byte + var leading_blanks bool + var indent = parser.indent + 1 + + start_mark := parser.mark + end_mark := parser.mark + + // Consume the content of the plain scalar. + for { + // Check for a document indicator. + if parser.unread < 4 && !yaml_parser_update_buffer(parser, 4) { + return false + } + if parser.mark.column == 0 && + ((parser.buffer[parser.buffer_pos+0] == '-' && + parser.buffer[parser.buffer_pos+1] == '-' && + parser.buffer[parser.buffer_pos+2] == '-') || + (parser.buffer[parser.buffer_pos+0] == '.' && + parser.buffer[parser.buffer_pos+1] == '.' && + parser.buffer[parser.buffer_pos+2] == '.')) && + is_blankz(parser.buffer, parser.buffer_pos+3) { + break + } + + // Check for a comment. + if parser.buffer[parser.buffer_pos] == '#' { + break + } + + // Consume non-blank characters. + for !is_blankz(parser.buffer, parser.buffer_pos) { + + // Check for 'x:x' in the flow context. TODO: Fix the test "spec-08-13". + if parser.flow_level > 0 && + parser.buffer[parser.buffer_pos] == ':' && + !is_blankz(parser.buffer, parser.buffer_pos+1) { + yaml_parser_set_scanner_error(parser, "while scanning a plain scalar", + start_mark, "found unexpected ':'") + return false + } + + // Check for indicators that may end a plain scalar. + if (parser.buffer[parser.buffer_pos] == ':' && is_blankz(parser.buffer, parser.buffer_pos+1)) || + (parser.flow_level > 0 && + (parser.buffer[parser.buffer_pos] == ',' || parser.buffer[parser.buffer_pos] == ':' || + parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == '[' || + parser.buffer[parser.buffer_pos] == ']' || parser.buffer[parser.buffer_pos] == '{' || + parser.buffer[parser.buffer_pos] == '}')) { + break + } + + // Check if we need to join whitespaces and breaks. + if leading_blanks || len(whitespaces) > 0 { + if leading_blanks { + // Do we need to fold line breaks? + if leading_break[0] == '\n' { + if len(trailing_breaks) == 0 { + s = append(s, ' ') + } else { + s = append(s, trailing_breaks...) + } + } else { + s = append(s, leading_break...) + s = append(s, trailing_breaks...) + } + trailing_breaks = trailing_breaks[:0] + leading_break = leading_break[:0] + leading_blanks = false + } else { + s = append(s, whitespaces...) + whitespaces = whitespaces[:0] + } + } + + // Copy the character. + s = read(parser, s) + + end_mark = parser.mark + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + } + + // Is it the end? + if !(is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos)) { + break + } + + // Consume blank characters. + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + + for is_blank(parser.buffer, parser.buffer_pos) || is_break(parser.buffer, parser.buffer_pos) { + if is_blank(parser.buffer, parser.buffer_pos) { + + // Check for tab character that abuse intendation. + if leading_blanks && parser.mark.column < indent && is_tab(parser.buffer, parser.buffer_pos) { + yaml_parser_set_scanner_error(parser, "while scanning a plain scalar", + start_mark, "found a tab character that violate intendation") + return false + } + + // Consume a space or a tab character. + if !leading_blanks { + whitespaces = read(parser, whitespaces) + } else { + skip(parser) + } + } else { + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + + // Check if it is a first line break. + if !leading_blanks { + whitespaces = whitespaces[:0] + leading_break = read_line(parser, leading_break) + leading_blanks = true + } else { + trailing_breaks = read_line(parser, trailing_breaks) + } + } + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + } + + // Check intendation level. + if parser.flow_level == 0 && parser.mark.column < indent { + break + } + } + + // Create a token. + *token = yaml_token_t{ + typ: yaml_SCALAR_TOKEN, + start_mark: start_mark, + end_mark: end_mark, + value: s, + style: yaml_PLAIN_SCALAR_STYLE, + } + + // Note that we change the 'simple_key_allowed' flag. + if leading_blanks { + parser.simple_key_allowed = true + } + return true +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/sorter.go b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/sorter.go new file mode 100644 index 0000000000000000000000000000000000000000..5958822f9c6bbf74a52caf43925cb65adfe1a6e8 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/sorter.go @@ -0,0 +1,104 @@ +package yaml + +import ( + "reflect" + "unicode" +) + +type keyList []reflect.Value + +func (l keyList) Len() int { return len(l) } +func (l keyList) Swap(i, j int) { l[i], l[j] = l[j], l[i] } +func (l keyList) Less(i, j int) bool { + a := l[i] + b := l[j] + ak := a.Kind() + bk := b.Kind() + for (ak == reflect.Interface || ak == reflect.Ptr) && !a.IsNil() { + a = a.Elem() + ak = a.Kind() + } + for (bk == reflect.Interface || bk == reflect.Ptr) && !b.IsNil() { + b = b.Elem() + bk = b.Kind() + } + af, aok := keyFloat(a) + bf, bok := keyFloat(b) + if aok && bok { + if af != bf { + return af < bf + } + if ak != bk { + return ak < bk + } + return numLess(a, b) + } + if ak != reflect.String || bk != reflect.String { + return ak < bk + } + ar, br := []rune(a.String()), []rune(b.String()) + for i := 0; i < len(ar) && i < len(br); i++ { + if ar[i] == br[i] { + continue + } + al := unicode.IsLetter(ar[i]) + bl := unicode.IsLetter(br[i]) + if al && bl { + return ar[i] < br[i] + } + if al || bl { + return bl + } + var ai, bi int + var an, bn int64 + for ai = i; ai < len(ar) && unicode.IsDigit(ar[ai]); ai++ { + an = an*10 + int64(ar[ai]-'0') + } + for bi = i; bi < len(br) && unicode.IsDigit(br[bi]); bi++ { + bn = bn*10 + int64(br[bi]-'0') + } + if an != bn { + return an < bn + } + if ai != bi { + return ai < bi + } + return ar[i] < br[i] + } + return len(ar) < len(br) +} + +// keyFloat returns a float value for v if it is a number/bool +// and whether it is a number/bool or not. +func keyFloat(v reflect.Value) (f float64, ok bool) { + switch v.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return float64(v.Int()), true + case reflect.Float32, reflect.Float64: + return v.Float(), true + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return float64(v.Uint()), true + case reflect.Bool: + if v.Bool() { + return 1, true + } + return 0, true + } + return 0, false +} + +// numLess returns whether a < b. +// a and b must necessarily have the same kind. +func numLess(a, b reflect.Value) bool { + switch a.Kind() { + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return a.Int() < b.Int() + case reflect.Float32, reflect.Float64: + return a.Float() < b.Float() + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return a.Uint() < b.Uint() + case reflect.Bool: + return !a.Bool() && b.Bool() + } + panic("not a number") +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/writerc.go b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/writerc.go new file mode 100644 index 0000000000000000000000000000000000000000..190362f25dfb9f6a6b56cf0ba873277e80e69ed9 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/writerc.go @@ -0,0 +1,89 @@ +package yaml + +// Set the writer error and return false. +func yaml_emitter_set_writer_error(emitter *yaml_emitter_t, problem string) bool { + emitter.error = yaml_WRITER_ERROR + emitter.problem = problem + return false +} + +// Flush the output buffer. +func yaml_emitter_flush(emitter *yaml_emitter_t) bool { + if emitter.write_handler == nil { + panic("write handler not set") + } + + // Check if the buffer is empty. + if emitter.buffer_pos == 0 { + return true + } + + // If the output encoding is UTF-8, we don't need to recode the buffer. + if emitter.encoding == yaml_UTF8_ENCODING { + if err := emitter.write_handler(emitter, emitter.buffer[:emitter.buffer_pos]); err != nil { + return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error()) + } + emitter.buffer_pos = 0 + return true + } + + // Recode the buffer into the raw buffer. + var low, high int + if emitter.encoding == yaml_UTF16LE_ENCODING { + low, high = 0, 1 + } else { + high, low = 1, 0 + } + + pos := 0 + for pos < emitter.buffer_pos { + // See the "reader.c" code for more details on UTF-8 encoding. Note + // that we assume that the buffer contains a valid UTF-8 sequence. + + // Read the next UTF-8 character. + octet := emitter.buffer[pos] + + var w int + var value rune + switch { + case octet&0x80 == 0x00: + w, value = 1, rune(octet&0x7F) + case octet&0xE0 == 0xC0: + w, value = 2, rune(octet&0x1F) + case octet&0xF0 == 0xE0: + w, value = 3, rune(octet&0x0F) + case octet&0xF8 == 0xF0: + w, value = 4, rune(octet&0x07) + } + for k := 1; k < w; k++ { + octet = emitter.buffer[pos+k] + value = (value << 6) + (rune(octet) & 0x3F) + } + pos += w + + // Write the character. + if value < 0x10000 { + var b [2]byte + b[high] = byte(value >> 8) + b[low] = byte(value & 0xFF) + emitter.raw_buffer = append(emitter.raw_buffer, b[0], b[1]) + } else { + // Write the character using a surrogate pair (check "reader.c"). + var b [4]byte + value -= 0x10000 + b[high] = byte(0xD8 + (value >> 18)) + b[low] = byte((value >> 10) & 0xFF) + b[high+2] = byte(0xDC + ((value >> 8) & 0xFF)) + b[low+2] = byte(value & 0xFF) + emitter.raw_buffer = append(emitter.raw_buffer, b[0], b[1], b[2], b[3]) + } + } + + // Write the raw buffer. + if err := emitter.write_handler(emitter, emitter.raw_buffer); err != nil { + return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error()) + } + emitter.buffer_pos = 0 + emitter.raw_buffer = emitter.raw_buffer[:0] + return true +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/yaml.go b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/yaml.go new file mode 100644 index 0000000000000000000000000000000000000000..d133edf9d34b77de0120401487f69ef514e5fcaf --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/yaml.go @@ -0,0 +1,346 @@ +// Package yaml implements YAML support for the Go language. +// +// Source code and other details for the project are available at GitHub: +// +// https://github.com/go-yaml/yaml +// +package yaml + +import ( + "errors" + "fmt" + "reflect" + "strings" + "sync" +) + +// MapSlice encodes and decodes as a YAML map. +// The order of keys is preserved when encoding and decoding. +type MapSlice []MapItem + +// MapItem is an item in a MapSlice. +type MapItem struct { + Key, Value interface{} +} + +// The Unmarshaler interface may be implemented by types to customize their +// behavior when being unmarshaled from a YAML document. The UnmarshalYAML +// method receives a function that may be called to unmarshal the original +// YAML value into a field or variable. It is safe to call the unmarshal +// function parameter more than once if necessary. +type Unmarshaler interface { + UnmarshalYAML(unmarshal func(interface{}) error) error +} + +// The Marshaler interface may be implemented by types to customize their +// behavior when being marshaled into a YAML document. The returned value +// is marshaled in place of the original value implementing Marshaler. +// +// If an error is returned by MarshalYAML, the marshaling procedure stops +// and returns with the provided error. +type Marshaler interface { + MarshalYAML() (interface{}, error) +} + +// Unmarshal decodes the first document found within the in byte slice +// and assigns decoded values into the out value. +// +// Maps and pointers (to a struct, string, int, etc) are accepted as out +// values. If an internal pointer within a struct is not initialized, +// the yaml package will initialize it if necessary for unmarshalling +// the provided data. The out parameter must not be nil. +// +// The type of the decoded values should be compatible with the respective +// values in out. If one or more values cannot be decoded due to a type +// mismatches, decoding continues partially until the end of the YAML +// content, and a *yaml.TypeError is returned with details for all +// missed values. +// +// Struct fields are only unmarshalled if they are exported (have an +// upper case first letter), and are unmarshalled using the field name +// lowercased as the default key. Custom keys may be defined via the +// "yaml" name in the field tag: the content preceding the first comma +// is used as the key, and the following comma-separated options are +// used to tweak the marshalling process (see Marshal). +// Conflicting names result in a runtime error. +// +// For example: +// +// type T struct { +// F int `yaml:"a,omitempty"` +// B int +// } +// var t T +// yaml.Unmarshal([]byte("a: 1\nb: 2"), &t) +// +// See the documentation of Marshal for the format of tags and a list of +// supported tag options. +// +func Unmarshal(in []byte, out interface{}) (err error) { + defer handleErr(&err) + d := newDecoder() + p := newParser(in) + defer p.destroy() + node := p.parse() + if node != nil { + v := reflect.ValueOf(out) + if v.Kind() == reflect.Ptr && !v.IsNil() { + v = v.Elem() + } + d.unmarshal(node, v) + } + if len(d.terrors) > 0 { + return &TypeError{d.terrors} + } + return nil +} + +// Marshal serializes the value provided into a YAML document. The structure +// of the generated document will reflect the structure of the value itself. +// Maps and pointers (to struct, string, int, etc) are accepted as the in value. +// +// Struct fields are only unmarshalled if they are exported (have an upper case +// first letter), and are unmarshalled using the field name lowercased as the +// default key. Custom keys may be defined via the "yaml" name in the field +// tag: the content preceding the first comma is used as the key, and the +// following comma-separated options are used to tweak the marshalling process. +// Conflicting names result in a runtime error. +// +// The field tag format accepted is: +// +// `(...) yaml:"[<key>][,<flag1>[,<flag2>]]" (...)` +// +// The following flags are currently supported: +// +// omitempty Only include the field if it's not set to the zero +// value for the type or to empty slices or maps. +// Does not apply to zero valued structs. +// +// flow Marshal using a flow style (useful for structs, +// sequences and maps). +// +// inline Inline the field, which must be a struct or a map, +// causing all of its fields or keys to be processed as if +// they were part of the outer struct. For maps, keys must +// not conflict with the yaml keys of other struct fields. +// +// In addition, if the key is "-", the field is ignored. +// +// For example: +// +// type T struct { +// F int "a,omitempty" +// B int +// } +// yaml.Marshal(&T{B: 2}) // Returns "b: 2\n" +// yaml.Marshal(&T{F: 1}} // Returns "a: 1\nb: 0\n" +// +func Marshal(in interface{}) (out []byte, err error) { + defer handleErr(&err) + e := newEncoder() + defer e.destroy() + e.marshal("", reflect.ValueOf(in)) + e.finish() + out = e.out + return +} + +func handleErr(err *error) { + if v := recover(); v != nil { + if e, ok := v.(yamlError); ok { + *err = e.err + } else { + panic(v) + } + } +} + +type yamlError struct { + err error +} + +func fail(err error) { + panic(yamlError{err}) +} + +func failf(format string, args ...interface{}) { + panic(yamlError{fmt.Errorf("yaml: "+format, args...)}) +} + +// A TypeError is returned by Unmarshal when one or more fields in +// the YAML document cannot be properly decoded into the requested +// types. When this error is returned, the value is still +// unmarshaled partially. +type TypeError struct { + Errors []string +} + +func (e *TypeError) Error() string { + return fmt.Sprintf("yaml: unmarshal errors:\n %s", strings.Join(e.Errors, "\n ")) +} + +// -------------------------------------------------------------------------- +// Maintain a mapping of keys to structure field indexes + +// The code in this section was copied from mgo/bson. + +// structInfo holds details for the serialization of fields of +// a given struct. +type structInfo struct { + FieldsMap map[string]fieldInfo + FieldsList []fieldInfo + + // InlineMap is the number of the field in the struct that + // contains an ,inline map, or -1 if there's none. + InlineMap int +} + +type fieldInfo struct { + Key string + Num int + OmitEmpty bool + Flow bool + + // Inline holds the field index if the field is part of an inlined struct. + Inline []int +} + +var structMap = make(map[reflect.Type]*structInfo) +var fieldMapMutex sync.RWMutex + +func getStructInfo(st reflect.Type) (*structInfo, error) { + fieldMapMutex.RLock() + sinfo, found := structMap[st] + fieldMapMutex.RUnlock() + if found { + return sinfo, nil + } + + n := st.NumField() + fieldsMap := make(map[string]fieldInfo) + fieldsList := make([]fieldInfo, 0, n) + inlineMap := -1 + for i := 0; i != n; i++ { + field := st.Field(i) + if field.PkgPath != "" { + continue // Private field + } + + info := fieldInfo{Num: i} + + tag := field.Tag.Get("yaml") + if tag == "" && strings.Index(string(field.Tag), ":") < 0 { + tag = string(field.Tag) + } + if tag == "-" { + continue + } + + inline := false + fields := strings.Split(tag, ",") + if len(fields) > 1 { + for _, flag := range fields[1:] { + switch flag { + case "omitempty": + info.OmitEmpty = true + case "flow": + info.Flow = true + case "inline": + inline = true + default: + return nil, errors.New(fmt.Sprintf("Unsupported flag %q in tag %q of type %s", flag, tag, st)) + } + } + tag = fields[0] + } + + if inline { + switch field.Type.Kind() { + case reflect.Map: + if inlineMap >= 0 { + return nil, errors.New("Multiple ,inline maps in struct " + st.String()) + } + if field.Type.Key() != reflect.TypeOf("") { + return nil, errors.New("Option ,inline needs a map with string keys in struct " + st.String()) + } + inlineMap = info.Num + case reflect.Struct: + sinfo, err := getStructInfo(field.Type) + if err != nil { + return nil, err + } + for _, finfo := range sinfo.FieldsList { + if _, found := fieldsMap[finfo.Key]; found { + msg := "Duplicated key '" + finfo.Key + "' in struct " + st.String() + return nil, errors.New(msg) + } + if finfo.Inline == nil { + finfo.Inline = []int{i, finfo.Num} + } else { + finfo.Inline = append([]int{i}, finfo.Inline...) + } + fieldsMap[finfo.Key] = finfo + fieldsList = append(fieldsList, finfo) + } + default: + //return nil, errors.New("Option ,inline needs a struct value or map field") + return nil, errors.New("Option ,inline needs a struct value field") + } + continue + } + + if tag != "" { + info.Key = tag + } else { + info.Key = strings.ToLower(field.Name) + } + + if _, found = fieldsMap[info.Key]; found { + msg := "Duplicated key '" + info.Key + "' in struct " + st.String() + return nil, errors.New(msg) + } + + fieldsList = append(fieldsList, info) + fieldsMap[info.Key] = info + } + + sinfo = &structInfo{fieldsMap, fieldsList, inlineMap} + + fieldMapMutex.Lock() + structMap[st] = sinfo + fieldMapMutex.Unlock() + return sinfo, nil +} + +func isZero(v reflect.Value) bool { + switch v.Kind() { + case reflect.String: + return len(v.String()) == 0 + case reflect.Interface, reflect.Ptr: + return v.IsNil() + case reflect.Slice: + return v.Len() == 0 + case reflect.Map: + return v.Len() == 0 + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Bool: + return !v.Bool() + case reflect.Struct: + vt := v.Type() + for i := v.NumField() - 1; i >= 0; i-- { + if vt.Field(i).PkgPath != "" { + continue // Private field + } + if !isZero(v.Field(i)) { + return false + } + } + return true + } + return false +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/yamlh.go b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/yamlh.go new file mode 100644 index 0000000000000000000000000000000000000000..d60a6b6b0035bec3773f023680b38cd3dbec93d0 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/yamlh.go @@ -0,0 +1,716 @@ +package yaml + +import ( + "io" +) + +// The version directive data. +type yaml_version_directive_t struct { + major int8 // The major version number. + minor int8 // The minor version number. +} + +// The tag directive data. +type yaml_tag_directive_t struct { + handle []byte // The tag handle. + prefix []byte // The tag prefix. +} + +type yaml_encoding_t int + +// The stream encoding. +const ( + // Let the parser choose the encoding. + yaml_ANY_ENCODING yaml_encoding_t = iota + + yaml_UTF8_ENCODING // The default UTF-8 encoding. + yaml_UTF16LE_ENCODING // The UTF-16-LE encoding with BOM. + yaml_UTF16BE_ENCODING // The UTF-16-BE encoding with BOM. +) + +type yaml_break_t int + +// Line break types. +const ( + // Let the parser choose the break type. + yaml_ANY_BREAK yaml_break_t = iota + + yaml_CR_BREAK // Use CR for line breaks (Mac style). + yaml_LN_BREAK // Use LN for line breaks (Unix style). + yaml_CRLN_BREAK // Use CR LN for line breaks (DOS style). +) + +type yaml_error_type_t int + +// Many bad things could happen with the parser and emitter. +const ( + // No error is produced. + yaml_NO_ERROR yaml_error_type_t = iota + + yaml_MEMORY_ERROR // Cannot allocate or reallocate a block of memory. + yaml_READER_ERROR // Cannot read or decode the input stream. + yaml_SCANNER_ERROR // Cannot scan the input stream. + yaml_PARSER_ERROR // Cannot parse the input stream. + yaml_COMPOSER_ERROR // Cannot compose a YAML document. + yaml_WRITER_ERROR // Cannot write to the output stream. + yaml_EMITTER_ERROR // Cannot emit a YAML stream. +) + +// The pointer position. +type yaml_mark_t struct { + index int // The position index. + line int // The position line. + column int // The position column. +} + +// Node Styles + +type yaml_style_t int8 + +type yaml_scalar_style_t yaml_style_t + +// Scalar styles. +const ( + // Let the emitter choose the style. + yaml_ANY_SCALAR_STYLE yaml_scalar_style_t = iota + + yaml_PLAIN_SCALAR_STYLE // The plain scalar style. + yaml_SINGLE_QUOTED_SCALAR_STYLE // The single-quoted scalar style. + yaml_DOUBLE_QUOTED_SCALAR_STYLE // The double-quoted scalar style. + yaml_LITERAL_SCALAR_STYLE // The literal scalar style. + yaml_FOLDED_SCALAR_STYLE // The folded scalar style. +) + +type yaml_sequence_style_t yaml_style_t + +// Sequence styles. +const ( + // Let the emitter choose the style. + yaml_ANY_SEQUENCE_STYLE yaml_sequence_style_t = iota + + yaml_BLOCK_SEQUENCE_STYLE // The block sequence style. + yaml_FLOW_SEQUENCE_STYLE // The flow sequence style. +) + +type yaml_mapping_style_t yaml_style_t + +// Mapping styles. +const ( + // Let the emitter choose the style. + yaml_ANY_MAPPING_STYLE yaml_mapping_style_t = iota + + yaml_BLOCK_MAPPING_STYLE // The block mapping style. + yaml_FLOW_MAPPING_STYLE // The flow mapping style. +) + +// Tokens + +type yaml_token_type_t int + +// Token types. +const ( + // An empty token. + yaml_NO_TOKEN yaml_token_type_t = iota + + yaml_STREAM_START_TOKEN // A STREAM-START token. + yaml_STREAM_END_TOKEN // A STREAM-END token. + + yaml_VERSION_DIRECTIVE_TOKEN // A VERSION-DIRECTIVE token. + yaml_TAG_DIRECTIVE_TOKEN // A TAG-DIRECTIVE token. + yaml_DOCUMENT_START_TOKEN // A DOCUMENT-START token. + yaml_DOCUMENT_END_TOKEN // A DOCUMENT-END token. + + yaml_BLOCK_SEQUENCE_START_TOKEN // A BLOCK-SEQUENCE-START token. + yaml_BLOCK_MAPPING_START_TOKEN // A BLOCK-SEQUENCE-END token. + yaml_BLOCK_END_TOKEN // A BLOCK-END token. + + yaml_FLOW_SEQUENCE_START_TOKEN // A FLOW-SEQUENCE-START token. + yaml_FLOW_SEQUENCE_END_TOKEN // A FLOW-SEQUENCE-END token. + yaml_FLOW_MAPPING_START_TOKEN // A FLOW-MAPPING-START token. + yaml_FLOW_MAPPING_END_TOKEN // A FLOW-MAPPING-END token. + + yaml_BLOCK_ENTRY_TOKEN // A BLOCK-ENTRY token. + yaml_FLOW_ENTRY_TOKEN // A FLOW-ENTRY token. + yaml_KEY_TOKEN // A KEY token. + yaml_VALUE_TOKEN // A VALUE token. + + yaml_ALIAS_TOKEN // An ALIAS token. + yaml_ANCHOR_TOKEN // An ANCHOR token. + yaml_TAG_TOKEN // A TAG token. + yaml_SCALAR_TOKEN // A SCALAR token. +) + +func (tt yaml_token_type_t) String() string { + switch tt { + case yaml_NO_TOKEN: + return "yaml_NO_TOKEN" + case yaml_STREAM_START_TOKEN: + return "yaml_STREAM_START_TOKEN" + case yaml_STREAM_END_TOKEN: + return "yaml_STREAM_END_TOKEN" + case yaml_VERSION_DIRECTIVE_TOKEN: + return "yaml_VERSION_DIRECTIVE_TOKEN" + case yaml_TAG_DIRECTIVE_TOKEN: + return "yaml_TAG_DIRECTIVE_TOKEN" + case yaml_DOCUMENT_START_TOKEN: + return "yaml_DOCUMENT_START_TOKEN" + case yaml_DOCUMENT_END_TOKEN: + return "yaml_DOCUMENT_END_TOKEN" + case yaml_BLOCK_SEQUENCE_START_TOKEN: + return "yaml_BLOCK_SEQUENCE_START_TOKEN" + case yaml_BLOCK_MAPPING_START_TOKEN: + return "yaml_BLOCK_MAPPING_START_TOKEN" + case yaml_BLOCK_END_TOKEN: + return "yaml_BLOCK_END_TOKEN" + case yaml_FLOW_SEQUENCE_START_TOKEN: + return "yaml_FLOW_SEQUENCE_START_TOKEN" + case yaml_FLOW_SEQUENCE_END_TOKEN: + return "yaml_FLOW_SEQUENCE_END_TOKEN" + case yaml_FLOW_MAPPING_START_TOKEN: + return "yaml_FLOW_MAPPING_START_TOKEN" + case yaml_FLOW_MAPPING_END_TOKEN: + return "yaml_FLOW_MAPPING_END_TOKEN" + case yaml_BLOCK_ENTRY_TOKEN: + return "yaml_BLOCK_ENTRY_TOKEN" + case yaml_FLOW_ENTRY_TOKEN: + return "yaml_FLOW_ENTRY_TOKEN" + case yaml_KEY_TOKEN: + return "yaml_KEY_TOKEN" + case yaml_VALUE_TOKEN: + return "yaml_VALUE_TOKEN" + case yaml_ALIAS_TOKEN: + return "yaml_ALIAS_TOKEN" + case yaml_ANCHOR_TOKEN: + return "yaml_ANCHOR_TOKEN" + case yaml_TAG_TOKEN: + return "yaml_TAG_TOKEN" + case yaml_SCALAR_TOKEN: + return "yaml_SCALAR_TOKEN" + } + return "<unknown token>" +} + +// The token structure. +type yaml_token_t struct { + // The token type. + typ yaml_token_type_t + + // The start/end of the token. + start_mark, end_mark yaml_mark_t + + // The stream encoding (for yaml_STREAM_START_TOKEN). + encoding yaml_encoding_t + + // The alias/anchor/scalar value or tag/tag directive handle + // (for yaml_ALIAS_TOKEN, yaml_ANCHOR_TOKEN, yaml_SCALAR_TOKEN, yaml_TAG_TOKEN, yaml_TAG_DIRECTIVE_TOKEN). + value []byte + + // The tag suffix (for yaml_TAG_TOKEN). + suffix []byte + + // The tag directive prefix (for yaml_TAG_DIRECTIVE_TOKEN). + prefix []byte + + // The scalar style (for yaml_SCALAR_TOKEN). + style yaml_scalar_style_t + + // The version directive major/minor (for yaml_VERSION_DIRECTIVE_TOKEN). + major, minor int8 +} + +// Events + +type yaml_event_type_t int8 + +// Event types. +const ( + // An empty event. + yaml_NO_EVENT yaml_event_type_t = iota + + yaml_STREAM_START_EVENT // A STREAM-START event. + yaml_STREAM_END_EVENT // A STREAM-END event. + yaml_DOCUMENT_START_EVENT // A DOCUMENT-START event. + yaml_DOCUMENT_END_EVENT // A DOCUMENT-END event. + yaml_ALIAS_EVENT // An ALIAS event. + yaml_SCALAR_EVENT // A SCALAR event. + yaml_SEQUENCE_START_EVENT // A SEQUENCE-START event. + yaml_SEQUENCE_END_EVENT // A SEQUENCE-END event. + yaml_MAPPING_START_EVENT // A MAPPING-START event. + yaml_MAPPING_END_EVENT // A MAPPING-END event. +) + +// The event structure. +type yaml_event_t struct { + + // The event type. + typ yaml_event_type_t + + // The start and end of the event. + start_mark, end_mark yaml_mark_t + + // The document encoding (for yaml_STREAM_START_EVENT). + encoding yaml_encoding_t + + // The version directive (for yaml_DOCUMENT_START_EVENT). + version_directive *yaml_version_directive_t + + // The list of tag directives (for yaml_DOCUMENT_START_EVENT). + tag_directives []yaml_tag_directive_t + + // The anchor (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_ALIAS_EVENT). + anchor []byte + + // The tag (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT). + tag []byte + + // The scalar value (for yaml_SCALAR_EVENT). + value []byte + + // Is the document start/end indicator implicit, or the tag optional? + // (for yaml_DOCUMENT_START_EVENT, yaml_DOCUMENT_END_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_SCALAR_EVENT). + implicit bool + + // Is the tag optional for any non-plain style? (for yaml_SCALAR_EVENT). + quoted_implicit bool + + // The style (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT). + style yaml_style_t +} + +func (e *yaml_event_t) scalar_style() yaml_scalar_style_t { return yaml_scalar_style_t(e.style) } +func (e *yaml_event_t) sequence_style() yaml_sequence_style_t { return yaml_sequence_style_t(e.style) } +func (e *yaml_event_t) mapping_style() yaml_mapping_style_t { return yaml_mapping_style_t(e.style) } + +// Nodes + +const ( + yaml_NULL_TAG = "tag:yaml.org,2002:null" // The tag !!null with the only possible value: null. + yaml_BOOL_TAG = "tag:yaml.org,2002:bool" // The tag !!bool with the values: true and false. + yaml_STR_TAG = "tag:yaml.org,2002:str" // The tag !!str for string values. + yaml_INT_TAG = "tag:yaml.org,2002:int" // The tag !!int for integer values. + yaml_FLOAT_TAG = "tag:yaml.org,2002:float" // The tag !!float for float values. + yaml_TIMESTAMP_TAG = "tag:yaml.org,2002:timestamp" // The tag !!timestamp for date and time values. + + yaml_SEQ_TAG = "tag:yaml.org,2002:seq" // The tag !!seq is used to denote sequences. + yaml_MAP_TAG = "tag:yaml.org,2002:map" // The tag !!map is used to denote mapping. + + // Not in original libyaml. + yaml_BINARY_TAG = "tag:yaml.org,2002:binary" + yaml_MERGE_TAG = "tag:yaml.org,2002:merge" + + yaml_DEFAULT_SCALAR_TAG = yaml_STR_TAG // The default scalar tag is !!str. + yaml_DEFAULT_SEQUENCE_TAG = yaml_SEQ_TAG // The default sequence tag is !!seq. + yaml_DEFAULT_MAPPING_TAG = yaml_MAP_TAG // The default mapping tag is !!map. +) + +type yaml_node_type_t int + +// Node types. +const ( + // An empty node. + yaml_NO_NODE yaml_node_type_t = iota + + yaml_SCALAR_NODE // A scalar node. + yaml_SEQUENCE_NODE // A sequence node. + yaml_MAPPING_NODE // A mapping node. +) + +// An element of a sequence node. +type yaml_node_item_t int + +// An element of a mapping node. +type yaml_node_pair_t struct { + key int // The key of the element. + value int // The value of the element. +} + +// The node structure. +type yaml_node_t struct { + typ yaml_node_type_t // The node type. + tag []byte // The node tag. + + // The node data. + + // The scalar parameters (for yaml_SCALAR_NODE). + scalar struct { + value []byte // The scalar value. + length int // The length of the scalar value. + style yaml_scalar_style_t // The scalar style. + } + + // The sequence parameters (for YAML_SEQUENCE_NODE). + sequence struct { + items_data []yaml_node_item_t // The stack of sequence items. + style yaml_sequence_style_t // The sequence style. + } + + // The mapping parameters (for yaml_MAPPING_NODE). + mapping struct { + pairs_data []yaml_node_pair_t // The stack of mapping pairs (key, value). + pairs_start *yaml_node_pair_t // The beginning of the stack. + pairs_end *yaml_node_pair_t // The end of the stack. + pairs_top *yaml_node_pair_t // The top of the stack. + style yaml_mapping_style_t // The mapping style. + } + + start_mark yaml_mark_t // The beginning of the node. + end_mark yaml_mark_t // The end of the node. + +} + +// The document structure. +type yaml_document_t struct { + + // The document nodes. + nodes []yaml_node_t + + // The version directive. + version_directive *yaml_version_directive_t + + // The list of tag directives. + tag_directives_data []yaml_tag_directive_t + tag_directives_start int // The beginning of the tag directives list. + tag_directives_end int // The end of the tag directives list. + + start_implicit int // Is the document start indicator implicit? + end_implicit int // Is the document end indicator implicit? + + // The start/end of the document. + start_mark, end_mark yaml_mark_t +} + +// The prototype of a read handler. +// +// The read handler is called when the parser needs to read more bytes from the +// source. The handler should write not more than size bytes to the buffer. +// The number of written bytes should be set to the size_read variable. +// +// [in,out] data A pointer to an application data specified by +// yaml_parser_set_input(). +// [out] buffer The buffer to write the data from the source. +// [in] size The size of the buffer. +// [out] size_read The actual number of bytes read from the source. +// +// On success, the handler should return 1. If the handler failed, +// the returned value should be 0. On EOF, the handler should set the +// size_read to 0 and return 1. +type yaml_read_handler_t func(parser *yaml_parser_t, buffer []byte) (n int, err error) + +// This structure holds information about a potential simple key. +type yaml_simple_key_t struct { + possible bool // Is a simple key possible? + required bool // Is a simple key required? + token_number int // The number of the token. + mark yaml_mark_t // The position mark. +} + +// The states of the parser. +type yaml_parser_state_t int + +const ( + yaml_PARSE_STREAM_START_STATE yaml_parser_state_t = iota + + yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE // Expect the beginning of an implicit document. + yaml_PARSE_DOCUMENT_START_STATE // Expect DOCUMENT-START. + yaml_PARSE_DOCUMENT_CONTENT_STATE // Expect the content of a document. + yaml_PARSE_DOCUMENT_END_STATE // Expect DOCUMENT-END. + yaml_PARSE_BLOCK_NODE_STATE // Expect a block node. + yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE // Expect a block node or indentless sequence. + yaml_PARSE_FLOW_NODE_STATE // Expect a flow node. + yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a block sequence. + yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE // Expect an entry of a block sequence. + yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE // Expect an entry of an indentless sequence. + yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping. + yaml_PARSE_BLOCK_MAPPING_KEY_STATE // Expect a block mapping key. + yaml_PARSE_BLOCK_MAPPING_VALUE_STATE // Expect a block mapping value. + yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE // Expect the first entry of a flow sequence. + yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE // Expect an entry of a flow sequence. + yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE // Expect a key of an ordered mapping. + yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE // Expect a value of an ordered mapping. + yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE // Expect the and of an ordered mapping entry. + yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping. + yaml_PARSE_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping. + yaml_PARSE_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping. + yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE // Expect an empty value of a flow mapping. + yaml_PARSE_END_STATE // Expect nothing. +) + +func (ps yaml_parser_state_t) String() string { + switch ps { + case yaml_PARSE_STREAM_START_STATE: + return "yaml_PARSE_STREAM_START_STATE" + case yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE: + return "yaml_PARSE_IMPLICIT_DOCUMENT_START_STATE" + case yaml_PARSE_DOCUMENT_START_STATE: + return "yaml_PARSE_DOCUMENT_START_STATE" + case yaml_PARSE_DOCUMENT_CONTENT_STATE: + return "yaml_PARSE_DOCUMENT_CONTENT_STATE" + case yaml_PARSE_DOCUMENT_END_STATE: + return "yaml_PARSE_DOCUMENT_END_STATE" + case yaml_PARSE_BLOCK_NODE_STATE: + return "yaml_PARSE_BLOCK_NODE_STATE" + case yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE: + return "yaml_PARSE_BLOCK_NODE_OR_INDENTLESS_SEQUENCE_STATE" + case yaml_PARSE_FLOW_NODE_STATE: + return "yaml_PARSE_FLOW_NODE_STATE" + case yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE: + return "yaml_PARSE_BLOCK_SEQUENCE_FIRST_ENTRY_STATE" + case yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE: + return "yaml_PARSE_BLOCK_SEQUENCE_ENTRY_STATE" + case yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE: + return "yaml_PARSE_INDENTLESS_SEQUENCE_ENTRY_STATE" + case yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE: + return "yaml_PARSE_BLOCK_MAPPING_FIRST_KEY_STATE" + case yaml_PARSE_BLOCK_MAPPING_KEY_STATE: + return "yaml_PARSE_BLOCK_MAPPING_KEY_STATE" + case yaml_PARSE_BLOCK_MAPPING_VALUE_STATE: + return "yaml_PARSE_BLOCK_MAPPING_VALUE_STATE" + case yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_FIRST_ENTRY_STATE" + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_STATE" + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_KEY_STATE" + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_VALUE_STATE" + case yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE: + return "yaml_PARSE_FLOW_SEQUENCE_ENTRY_MAPPING_END_STATE" + case yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE: + return "yaml_PARSE_FLOW_MAPPING_FIRST_KEY_STATE" + case yaml_PARSE_FLOW_MAPPING_KEY_STATE: + return "yaml_PARSE_FLOW_MAPPING_KEY_STATE" + case yaml_PARSE_FLOW_MAPPING_VALUE_STATE: + return "yaml_PARSE_FLOW_MAPPING_VALUE_STATE" + case yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE: + return "yaml_PARSE_FLOW_MAPPING_EMPTY_VALUE_STATE" + case yaml_PARSE_END_STATE: + return "yaml_PARSE_END_STATE" + } + return "<unknown parser state>" +} + +// This structure holds aliases data. +type yaml_alias_data_t struct { + anchor []byte // The anchor. + index int // The node id. + mark yaml_mark_t // The anchor mark. +} + +// The parser structure. +// +// All members are internal. Manage the structure using the +// yaml_parser_ family of functions. +type yaml_parser_t struct { + + // Error handling + + error yaml_error_type_t // Error type. + + problem string // Error description. + + // The byte about which the problem occured. + problem_offset int + problem_value int + problem_mark yaml_mark_t + + // The error context. + context string + context_mark yaml_mark_t + + // Reader stuff + + read_handler yaml_read_handler_t // Read handler. + + input_file io.Reader // File input data. + input []byte // String input data. + input_pos int + + eof bool // EOF flag + + buffer []byte // The working buffer. + buffer_pos int // The current position of the buffer. + + unread int // The number of unread characters in the buffer. + + raw_buffer []byte // The raw buffer. + raw_buffer_pos int // The current position of the buffer. + + encoding yaml_encoding_t // The input encoding. + + offset int // The offset of the current position (in bytes). + mark yaml_mark_t // The mark of the current position. + + // Scanner stuff + + stream_start_produced bool // Have we started to scan the input stream? + stream_end_produced bool // Have we reached the end of the input stream? + + flow_level int // The number of unclosed '[' and '{' indicators. + + tokens []yaml_token_t // The tokens queue. + tokens_head int // The head of the tokens queue. + tokens_parsed int // The number of tokens fetched from the queue. + token_available bool // Does the tokens queue contain a token ready for dequeueing. + + indent int // The current indentation level. + indents []int // The indentation levels stack. + + simple_key_allowed bool // May a simple key occur at the current position? + simple_keys []yaml_simple_key_t // The stack of simple keys. + + // Parser stuff + + state yaml_parser_state_t // The current parser state. + states []yaml_parser_state_t // The parser states stack. + marks []yaml_mark_t // The stack of marks. + tag_directives []yaml_tag_directive_t // The list of TAG directives. + + // Dumper stuff + + aliases []yaml_alias_data_t // The alias data. + + document *yaml_document_t // The currently parsed document. +} + +// Emitter Definitions + +// The prototype of a write handler. +// +// The write handler is called when the emitter needs to flush the accumulated +// characters to the output. The handler should write @a size bytes of the +// @a buffer to the output. +// +// @param[in,out] data A pointer to an application data specified by +// yaml_emitter_set_output(). +// @param[in] buffer The buffer with bytes to be written. +// @param[in] size The size of the buffer. +// +// @returns On success, the handler should return @c 1. If the handler failed, +// the returned value should be @c 0. +// +type yaml_write_handler_t func(emitter *yaml_emitter_t, buffer []byte) error + +type yaml_emitter_state_t int + +// The emitter states. +const ( + // Expect STREAM-START. + yaml_EMIT_STREAM_START_STATE yaml_emitter_state_t = iota + + yaml_EMIT_FIRST_DOCUMENT_START_STATE // Expect the first DOCUMENT-START or STREAM-END. + yaml_EMIT_DOCUMENT_START_STATE // Expect DOCUMENT-START or STREAM-END. + yaml_EMIT_DOCUMENT_CONTENT_STATE // Expect the content of a document. + yaml_EMIT_DOCUMENT_END_STATE // Expect DOCUMENT-END. + yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a flow sequence. + yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE // Expect an item of a flow sequence. + yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping. + yaml_EMIT_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping. + yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a flow mapping. + yaml_EMIT_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping. + yaml_EMIT_BLOCK_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a block sequence. + yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE // Expect an item of a block sequence. + yaml_EMIT_BLOCK_MAPPING_FIRST_KEY_STATE // Expect the first key of a block mapping. + yaml_EMIT_BLOCK_MAPPING_KEY_STATE // Expect the key of a block mapping. + yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a block mapping. + yaml_EMIT_BLOCK_MAPPING_VALUE_STATE // Expect a value of a block mapping. + yaml_EMIT_END_STATE // Expect nothing. +) + +// The emitter structure. +// +// All members are internal. Manage the structure using the @c yaml_emitter_ +// family of functions. +type yaml_emitter_t struct { + + // Error handling + + error yaml_error_type_t // Error type. + problem string // Error description. + + // Writer stuff + + write_handler yaml_write_handler_t // Write handler. + + output_buffer *[]byte // String output data. + output_file io.Writer // File output data. + + buffer []byte // The working buffer. + buffer_pos int // The current position of the buffer. + + raw_buffer []byte // The raw buffer. + raw_buffer_pos int // The current position of the buffer. + + encoding yaml_encoding_t // The stream encoding. + + // Emitter stuff + + canonical bool // If the output is in the canonical style? + best_indent int // The number of indentation spaces. + best_width int // The preferred width of the output lines. + unicode bool // Allow unescaped non-ASCII characters? + line_break yaml_break_t // The preferred line break. + + state yaml_emitter_state_t // The current emitter state. + states []yaml_emitter_state_t // The stack of states. + + events []yaml_event_t // The event queue. + events_head int // The head of the event queue. + + indents []int // The stack of indentation levels. + + tag_directives []yaml_tag_directive_t // The list of tag directives. + + indent int // The current indentation level. + + flow_level int // The current flow level. + + root_context bool // Is it the document root context? + sequence_context bool // Is it a sequence context? + mapping_context bool // Is it a mapping context? + simple_key_context bool // Is it a simple mapping key context? + + line int // The current line. + column int // The current column. + whitespace bool // If the last character was a whitespace? + indention bool // If the last character was an indentation character (' ', '-', '?', ':')? + open_ended bool // If an explicit document end is required? + + // Anchor analysis. + anchor_data struct { + anchor []byte // The anchor value. + alias bool // Is it an alias? + } + + // Tag analysis. + tag_data struct { + handle []byte // The tag handle. + suffix []byte // The tag suffix. + } + + // Scalar analysis. + scalar_data struct { + value []byte // The scalar value. + multiline bool // Does the scalar contain line breaks? + flow_plain_allowed bool // Can the scalar be expessed in the flow plain style? + block_plain_allowed bool // Can the scalar be expressed in the block plain style? + single_quoted_allowed bool // Can the scalar be expressed in the single quoted style? + block_allowed bool // Can the scalar be expressed in the literal or folded styles? + style yaml_scalar_style_t // The output style. + } + + // Dumper stuff + + opened bool // If the stream was already opened? + closed bool // If the stream was already closed? + + // The information associated with the document nodes. + anchors *struct { + references int // The number of references. + anchor int // The anchor id. + serialized bool // If the node has been emitted? + } + + last_anchor_id int // The last assigned anchor id. + + document *yaml_document_t // The currently emitted document. +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/yamlprivateh.go b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/yamlprivateh.go new file mode 100644 index 0000000000000000000000000000000000000000..8110ce3c37a6b4e152aee0fb65e36b99f55be6b6 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/gopkg.in/yaml.v2/yamlprivateh.go @@ -0,0 +1,173 @@ +package yaml + +const ( + // The size of the input raw buffer. + input_raw_buffer_size = 512 + + // The size of the input buffer. + // It should be possible to decode the whole raw buffer. + input_buffer_size = input_raw_buffer_size * 3 + + // The size of the output buffer. + output_buffer_size = 128 + + // The size of the output raw buffer. + // It should be possible to encode the whole output buffer. + output_raw_buffer_size = (output_buffer_size*2 + 2) + + // The size of other stacks and queues. + initial_stack_size = 16 + initial_queue_size = 16 + initial_string_size = 16 +) + +// Check if the character at the specified position is an alphabetical +// character, a digit, '_', or '-'. +func is_alpha(b []byte, i int) bool { + return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'Z' || b[i] >= 'a' && b[i] <= 'z' || b[i] == '_' || b[i] == '-' +} + +// Check if the character at the specified position is a digit. +func is_digit(b []byte, i int) bool { + return b[i] >= '0' && b[i] <= '9' +} + +// Get the value of a digit. +func as_digit(b []byte, i int) int { + return int(b[i]) - '0' +} + +// Check if the character at the specified position is a hex-digit. +func is_hex(b []byte, i int) bool { + return b[i] >= '0' && b[i] <= '9' || b[i] >= 'A' && b[i] <= 'F' || b[i] >= 'a' && b[i] <= 'f' +} + +// Get the value of a hex-digit. +func as_hex(b []byte, i int) int { + bi := b[i] + if bi >= 'A' && bi <= 'F' { + return int(bi) - 'A' + 10 + } + if bi >= 'a' && bi <= 'f' { + return int(bi) - 'a' + 10 + } + return int(bi) - '0' +} + +// Check if the character is ASCII. +func is_ascii(b []byte, i int) bool { + return b[i] <= 0x7F +} + +// Check if the character at the start of the buffer can be printed unescaped. +func is_printable(b []byte, i int) bool { + return ((b[i] == 0x0A) || // . == #x0A + (b[i] >= 0x20 && b[i] <= 0x7E) || // #x20 <= . <= #x7E + (b[i] == 0xC2 && b[i+1] >= 0xA0) || // #0xA0 <= . <= #xD7FF + (b[i] > 0xC2 && b[i] < 0xED) || + (b[i] == 0xED && b[i+1] < 0xA0) || + (b[i] == 0xEE) || + (b[i] == 0xEF && // #xE000 <= . <= #xFFFD + !(b[i+1] == 0xBB && b[i+2] == 0xBF) && // && . != #xFEFF + !(b[i+1] == 0xBF && (b[i+2] == 0xBE || b[i+2] == 0xBF)))) +} + +// Check if the character at the specified position is NUL. +func is_z(b []byte, i int) bool { + return b[i] == 0x00 +} + +// Check if the beginning of the buffer is a BOM. +func is_bom(b []byte, i int) bool { + return b[0] == 0xEF && b[1] == 0xBB && b[2] == 0xBF +} + +// Check if the character at the specified position is space. +func is_space(b []byte, i int) bool { + return b[i] == ' ' +} + +// Check if the character at the specified position is tab. +func is_tab(b []byte, i int) bool { + return b[i] == '\t' +} + +// Check if the character at the specified position is blank (space or tab). +func is_blank(b []byte, i int) bool { + //return is_space(b, i) || is_tab(b, i) + return b[i] == ' ' || b[i] == '\t' +} + +// Check if the character at the specified position is a line break. +func is_break(b []byte, i int) bool { + return (b[i] == '\r' || // CR (#xD) + b[i] == '\n' || // LF (#xA) + b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9) // PS (#x2029) +} + +func is_crlf(b []byte, i int) bool { + return b[i] == '\r' && b[i+1] == '\n' +} + +// Check if the character is a line break or NUL. +func is_breakz(b []byte, i int) bool { + //return is_break(b, i) || is_z(b, i) + return ( // is_break: + b[i] == '\r' || // CR (#xD) + b[i] == '\n' || // LF (#xA) + b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) + // is_z: + b[i] == 0) +} + +// Check if the character is a line break, space, or NUL. +func is_spacez(b []byte, i int) bool { + //return is_space(b, i) || is_breakz(b, i) + return ( // is_space: + b[i] == ' ' || + // is_breakz: + b[i] == '\r' || // CR (#xD) + b[i] == '\n' || // LF (#xA) + b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) + b[i] == 0) +} + +// Check if the character is a line break, space, tab, or NUL. +func is_blankz(b []byte, i int) bool { + //return is_blank(b, i) || is_breakz(b, i) + return ( // is_blank: + b[i] == ' ' || b[i] == '\t' || + // is_breakz: + b[i] == '\r' || // CR (#xD) + b[i] == '\n' || // LF (#xA) + b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) + b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA9 || // PS (#x2029) + b[i] == 0) +} + +// Determine the width of the character. +func width(b byte) int { + // Don't replace these by a switch without first + // confirming that it is being inlined. + if b&0x80 == 0x00 { + return 1 + } + if b&0xE0 == 0xC0 { + return 2 + } + if b&0xF0 == 0xE0 { + return 3 + } + if b&0xF8 == 0xF0 { + return 4 + } + return 0 + +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/backplane.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/backplane.go new file mode 100644 index 0000000000000000000000000000000000000000..fefe5bac7dddab158e5f77be9c02336d2e3ce3b0 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/backplane.go @@ -0,0 +1,52 @@ +package bootos + +import ( + "bufio" + "strings" + + "idcos.io/cloudboot/hardware/collector" +) + +// Backplane 采集并返回背板信息。 +func (c *bootosC) Backplane() (*collector.Backplane, error) { + output, err := c.ExecByShell("racadm", "swinventory") // TODO 仅适用于Dell,暂时不知道通用的采集方法。 + if err != nil { + return nil, err + } + + var blocks []string + all := strings.Split(string(output), "\n\n") + for i := range all { + if strings.Contains(all[i], "ComponentType = FIRMWAR") && + strings.Contains(all[i], "ElementName = Backplane") && + strings.Contains(all[i], "Current Version =") { + blocks = append(blocks, all[i]) + } + } + + if len(blocks) <= 0 { + return nil, nil + } + var bp collector.Backplane + for i := range blocks { + var item collector.BackplaneItem + scanner := bufio.NewScanner(strings.NewReader(blocks[i])) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if strings.HasPrefix(line, "ElementName =") { + item.Name = c.extractValue(line, eqSeprator) + } + if strings.HasPrefix(line, "Current Version =") { + item.FirmwareVersion = c.extractValue(line, eqSeprator) + } + } + if err := scanner.Err(); err != nil { + if log := c.GetLog(); log != nil { + log.Error(err) + } + return nil, err + } + bp.Items = append(bp.Items, item) + } + return &bp, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/base.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/base.go new file mode 100644 index 0000000000000000000000000000000000000000..14735ef57bda60ef7f7bcff018f3ef328e12d655 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/base.go @@ -0,0 +1,128 @@ +package bootos + +import ( + "bytes" + "strings" + + "idcos.io/cloudboot/hardware/collector" +) + +// BASE 采集并返回当前设备的基本信息 +func (c *bootosC) BASE() (isVM bool, sn, vendor, model, arch string, err error) { + // 不再支持VM了 + //isVM, err = c.isVM() + //if err != nil { + // return isVM, sn, vendor, model, arch, err + //} + + sn, err = c.sn(isVM) + if err != nil { + return isVM, sn, vendor, model, arch, err + } + + vendor, _ = c.manufacturer() + model, _ = c.productName() + arch, _ = c.arch() + + return isVM, sn, vendor, model, arch, nil +} + +func (c *bootosC) sn(isVM bool) (string, error) { + if isVM { + output, err := c.Base.ExecByShell("sed", "q", "/sys/class/net/*/address") + if err != nil { + return "", err + } + return strings.TrimSpace(string(output)), nil + } + + output, err := c.Base.ExecByShell("dmidecode", "-s", "system-serial-number", "2>/dev/null", "|", "awk", `'/^[^#]/ { print $1 }'`) + if err != nil { + return "", err + } + return strings.TrimSpace(string(output)), nil +} + +func (c *bootosC) isVM() (bool, error) { + output, err := c.Base.ExecByShell("dmidecode") + if err != nil { + return false, err + } + return bytes.Contains(output, []byte("VMware")) || + bytes.Contains(output, []byte("VirtualBox")) || + bytes.Contains(output, []byte("KVM")) || + bytes.Contains(output, []byte("Xen")) || + bytes.Contains(output, []byte("Parallels")), nil +} + +// productName 返回设备的产品名称 +func (c *bootosC) productName() (string, error) { + // dmidecode -s system-product-name | awk '/^[^#]/' + output, err := c.Base.ExecByShell("dmidecode", "-s", "system-product-name", "|", "awk", `'/^[^#]/'`) + if err != nil { + return "", err + } + return strings.TrimSpace(string(output)), nil +} + +// arch 采集CPU硬件架构 +func (c *bootosC) arch() (string, error) { + output, err := c.Base.ExecByShell("uname -m") + if err != nil { + return "", err + } + return strings.TrimSpace(string(output)), nil +} + +// manufacturer 返回设备厂商名称 +func (c *bootosC) manufacturer() (string, error) { + // dmidecode -s system-manufacturer | awk '/^[^#]/ { print $1 }' + output, err := c.Base.ExecByShell("dmidecode", "-s", "system-manufacturer") + if err != nil { + return "", err + } + + name := strings.TrimSpace(string(output)) + nameLower := strings.ToLower(name) + + if nameLower == "" { + return "", nil + } else if strings.Contains(nameLower, "dell") { + return collector.Dell, nil + + } else if strings.Contains(nameLower, "super") && strings.Contains(nameLower, "micro") { + return collector.Supermicro, nil + + } else if strings.Contains(nameLower, "great") && strings.Contains(nameLower, "wall") { + return collector.Greatwall, nil + + } else if strings.Contains(nameLower, "h3c") { + return collector.H3C, nil + + } else if strings.Contains(nameLower, "lenovo") { + return collector.Lenovo, nil + + } else if strings.Contains(nameLower, "huawei") { + return collector.Huawei, nil + + } else if strings.Contains(nameLower, "xfusion") { + return collector.XFusion, nil + + } else if strings.Contains(nameLower, "inspur") { + return collector.Inspur, nil + + } else if strings.Contains(nameLower, "sugon") { + return collector.Sugon, nil + + } else if strings.Contains(nameLower, "unis") { + return collector.UNIS, nil + + } else if strings.Contains(nameLower, "suma") { + return collector.Suma, nil + + } else if strings.Contains(nameLower, "hp") || strings.Contains(nameLower, "hpe") { + return collector.HP, nil + } else { + return strings.Fields(name)[0], nil + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/bios.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/bios.go new file mode 100644 index 0000000000000000000000000000000000000000..10d10ec1c0ce944bb64c1533b4bf676af609a393 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/bios.go @@ -0,0 +1,29 @@ +package bootos + +import ( + "bufio" + "bytes" + "strings" + + "idcos.io/cloudboot/hardware/collector" +) + +// BIOS 采集并返回当前设备的BIOS信息。 +func (c *bootosC) BIOS() (*collector.BIOS, error) { + output, err := c.Base.ExecByShell("dmidecode", "-t", "bios") + if err != nil { + return nil, err + } + + var bios collector.BIOS + scanner := bufio.NewScanner(bytes.NewReader(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if strings.HasPrefix(line, "Vendor:") { + bios.Vendor = c.extractValue(line, colonSeparator) + } else if strings.HasPrefix(line, "Version:") { + bios.Version = c.extractValue(line, colonSeparator) + } + } + return &bios, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/collector.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/collector.go new file mode 100644 index 0000000000000000000000000000000000000000..619e7af14c0320432a529e5c8d13b9d6ee1464bc --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/collector.go @@ -0,0 +1,38 @@ +package bootos + +import ( + "strings" + + "idcos.io/cloudboot/hardware" + "idcos.io/cloudboot/hardware/collector" +) + +const ( + // collectorName 采集器名称 + collectorName = collector.DefaultCollector +) + +func init() { + // 注册默认的采集器实现 + collector.Register(collectorName, new(bootosC)) +} + +// bootosC BOOTOS中运行的采集器实现 +type bootosC struct { + hardware.Base +} + +const ( + // colonSeparator 分隔符 + colonSeparator = ":" + // eqSeprator 等号分隔符 + eqSeprator = "=" +) + +// extractValue 截取kv对中v的内容。假设,kv内容为"name : voidint",那么将返回"voidint"。 +func (c *bootosC) extractValue(kv, sep string) (value string) { + if !strings.Contains(kv, sep) { + return kv + } + return strings.TrimSpace(strings.SplitN(kv, sep, 2)[1]) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/cpu.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/cpu.go new file mode 100644 index 0000000000000000000000000000000000000000..8ae8d965dfd61b979ef33b4d6c7285574110716b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/cpu.go @@ -0,0 +1,107 @@ +package bootos + +import ( + "bufio" + "bytes" + "strconv" + "strings" + + "idcos.io/cloudboot/hardware/collector" +) + +// CPU 采集并返回当前设备的CPU信息 +func (c *bootosC) CPU() (*collector.CPU, error) { + var cpu collector.CPU + var err error + + cpu.Physicals, err = c.physicalCPUs() + if err != nil { + return nil, err + } + cpu.TotalPhysicals = len(cpu.Physicals) + for i := range cpu.Physicals { + cpu.TotalCores += cpu.Physicals[i].Cores + } + cpu.TotalLogicals, err = c.countLogicalCPUs() + if err != nil { + return nil, err + } + cpu.Threads, err = c.cpuThreads() + if err != nil { + return nil, err + } + return &cpu, nil +} + +// physicalCPUs 返回物理CPU列表 +func (c *bootosC) physicalCPUs() (items []collector.PhysicalCPU, err error) { + output, err := c.ExecByShell("dmidecode", "-t", "processor") + if err != nil { + if log := c.Base.GetLog(); log != nil { + log.Error(err) + } + return nil, err + } + + procs := bytes.Split(output, []byte{'\n', '\n'}) + for i := range procs { + if !bytes.Contains(procs[i], []byte("Processor Information")) { + continue + } + cpu, err := c.parsePhysicalCPU(procs[i]) + if err != nil { + return nil, err + } + if cpu == nil { + continue + } + items = append(items, *cpu) + } + return items, nil +} + +// parsePhysicalCPU 返回单个物理CPU及其对应的physical id +func (c *bootosC) parsePhysicalCPU(out []byte) (pcpu *collector.PhysicalCPU, err error) { + var cpu collector.PhysicalCPU + scanner := bufio.NewScanner(bytes.NewReader(out)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if !strings.Contains(line, ":") { + continue + } + + if strings.HasPrefix(line, "Core Count") { + cpu.Cores, _ = strconv.Atoi(c.extractValue(line, colonSeparator)) + + } else if strings.HasPrefix(line, "Version") { + cpu.ModelName = c.extractValue(line, colonSeparator) + + } else if strings.HasPrefix(line, "Max Speed") { + cpu.ClockSpeed = c.extractValue(line, colonSeparator) + } + } + if cpu.ModelName == "" { + return nil, scanner.Err() + } + return &cpu, scanner.Err() +} + +// countLogicalCPUs 返回逻辑CPU个数 +func (c *bootosC) countLogicalCPUs() (int, error) { + // cat /proc/cpuinfo| grep "processor"| wc -l + output, err := c.Base.ExecByShell("cat", "/proc/cpuinfo", "|", "grep", `"processor"`, "|", "wc", "-l") + if err != nil { + return 0, err + } + return strconv.Atoi(strings.TrimSpace(string(output))) +} + +// cpuThreads 返回CPU超线程数 +func (c *bootosC) cpuThreads() (int, error) { + // lscpu | grep "Thread(s) per core:" + output, err := c.Base.ExecByShell("lscpu", "|", "grep", `"Thread(s) per core:"`) + if err != nil { + return 0, err + } + return strconv.Atoi(strings.TrimSpace(strings.TrimPrefix(string(output), "Thread(s) per core:"))) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/disk.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/disk.go new file mode 100644 index 0000000000000000000000000000000000000000..0ebfe1f5c36c16fb6c9ad8faa5edff349a5b6731 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/disk.go @@ -0,0 +1,53 @@ +package bootos + +import ( + "regexp" + "strconv" + "strings" + + "idcos.io/cloudboot/hardware/collector" + "idcos.io/cloudboot/utils/bytes" +) + +// Disk 采集并返回当前设备的逻辑磁盘信息 +func (c *bootosC) Disk() (*collector.Disk, error) { + var disk collector.Disk + output, err := c.Base.ExecByShell("fdisk", "-l") + if err != nil { + return nil, err + } + disk.Items = c.parseDiskItems(output) + disk.TotalSize, disk.TotalSizeGB = c.calcDiskTotalSize(disk.Items) + return &disk, nil +} + +var diskReg = regexp.MustCompile(`Disk\s+(.*):(.*)(\d+)\s+bytes`) + +func (c *bootosC) parseDiskItems(output []byte) (items []collector.DiskItem) { + lines := diskReg.FindAllString(string(output), -1) + for i := range lines { + pair := strings.SplitN(lines[i], colonSeparator, -1) + items = append(items, collector.DiskItem{ + Name: strings.TrimSpace(strings.TrimPrefix(pair[0], "Disk")), // /dev/sda + Size: strings.TrimSpace(pair[1]), // 599.6 GB, 599550590976 bytes + }) + } + return items +} + +// calcDiskTotalSize 计算逻辑磁盘总容量。 +// bsize 单位为Byte的容量值。 +// gbsize 单位为GB的容量值。 +func (c *bootosC) calcDiskTotalSize(items []collector.DiskItem) (bsize int64, gbsize int) { + for i := range items { + begin := strings.Index(items[i].Size, ",") + end := strings.Index(items[i].Size, "bytes") + if begin < 0 || begin >= end { + continue + } + ssize := strings.TrimSpace(items[i].Size[begin+1 : end]) + size, _ := strconv.ParseInt(ssize, 10, 64) + bsize += size + } + return bsize, bytes.Byte2GBRounding(bytes.Byte(bsize)) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/disk_slot.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/disk_slot.go new file mode 100644 index 0000000000000000000000000000000000000000..6911a4a5e55c03ec742bd492e505a54ebfb8f88b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/disk_slot.go @@ -0,0 +1,41 @@ +package bootos + +import ( + "idcos.io/cloudboot/hardware/collector" + "idcos.io/cloudboot/hardware/raid" +) + +// DiskSlot 采集并返回当前设备的磁盘槽位(物理驱动器)信息 +func (c *bootosC) DiskSlot() (*collector.DiskSlot, error) { + name, err := raid.Whoami() + if err != nil { + if log := c.Base.GetLog(); log != nil { + log.Error(err) + } + return nil, err + } + worker := raid.SelectWorker(name) + if worker == nil { + if log := c.Base.GetLog(); log != nil { + log.Errorf("Can't find the RAID worker by name: %s", name) + } + return nil, nil + } + + ctrls, err := worker.Controllers() + if err != nil { + return nil, err + } + + var items []raid.PhysicalDrive + for i := range ctrls { + drives, err := worker.PhysicalDrives(ctrls[i].ID) + if err != nil { + return nil, err + } + items = append(items, drives...) + } + return &collector.DiskSlot{ + Items: items, + }, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/extra.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/extra.go new file mode 100644 index 0000000000000000000000000000000000000000..b732f5eaa50caefdbf956c49629d59b2bd1f4723 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/extra.go @@ -0,0 +1,53 @@ +package bootos + +import ( + "encoding/json" + "os/exec" + + "idcos.io/cloudboot/hardware/collector" + "idcos.io/cloudboot/utils/sh" +) + +// Extra 执行采集脚本并返回采集到的信息。 +func (c *bootosC) Extra(scripts [][]byte) *collector.Extra { + store := make(map[string]interface{}) + for i := range scripts { + entries, _ := c.execScript(scripts[i]) + for k := range entries { + store[k] = entries[k] + } + } + e := collector.Extra(store) + return &e +} + +// execScript 将脚本内容写入临时文件,并赋予该临时文件执行权限,再执行。 +// 读取脚本执行的JSON输出并反序列化成map,若脚本的标准输出非JSON格式,或者是非kv结构,则返回非nil的error。 +func (c *bootosC) execScript(script []byte) (entries map[string]interface{}, err error) { + filename, err := sh.GenTempScript(script) + if err != nil { + if log := c.Base.GetLog(); log != nil { + log.Error(err) + } + return nil, err + } + + if log := c.Base.GetLog(); log != nil { + log.Debugf("%s ==>\n%s\n", filename, script) + } + + // 不能调用某个具体程序(bash、python)去执行该脚本,因为目标脚本的编写语言并不确定。 + // 脚本的编写者应该在shebang中指定执行该脚本的程序,如'#! /usr/bin/env python'。 + cmd := exec.Command(filename) + output, err := cmd.Output() + if err != nil { + if log := c.Base.GetLog(); log != nil { + log.Errorf("Exec err: %s\noutput:\n%s", err, output) + } + return nil, err + } + if log := c.Base.GetLog(); log != nil { + log.Debugf("Exec output ==>\n%s", output) + } + return entries, json.Unmarshal(output, &entries) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/fan.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/fan.go new file mode 100644 index 0000000000000000000000000000000000000000..805e0a6b5531df9102682ad498e61b5704ff63ec --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/fan.go @@ -0,0 +1,37 @@ +package bootos + +import ( + "bufio" + "bytes" + "strings" + + "idcos.io/cloudboot/hardware/collector" +) + +// Fan 采集并返回当前设备的所有风扇信息。 +func (c *bootosC) Fan() (*collector.Fan, error) { + output, err := c.Base.ExecByShell("ipmitool", "sdr", "list", "|", "grep", "-i", `"Fan"`, "|", "grep", "-i", `"RPM"`) + if err != nil { + return nil, err + } + + var items []collector.FanItem + scanner := bufio.NewScanner(bytes.NewReader(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" { + continue + } + fields := strings.Split(line, "|") + if len(fields) < 2 { + continue + } + items = append(items, collector.FanItem{ + ID: strings.TrimSpace(fields[0]), + Speed: strings.TrimSpace(fields[1]), + }) + } + return &collector.Fan{ + Items: items, + }, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/hba.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/hba.go new file mode 100644 index 0000000000000000000000000000000000000000..724dc2090c6b9254bb0c74b6ab83a1285bfc4adf --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/hba.go @@ -0,0 +1,94 @@ +package bootos + +import ( + "io/ioutil" + "path/filepath" + "strings" + + "idcos.io/cloudboot/hardware/collector" +) + +// HBA 采集并返回当前设备的HBA卡信息。若当前设备不包含HBA卡,则返回值都为nil。 +func (c *bootosC) HBA() (*collector.HBA, error) { + if !c.hasHBA() { + return nil, nil + } + + hosts, err := c.hbaHosts() + if err != nil { + return nil, err + } + + hba := collector.HBA{ + Items: make([]collector.HBAItem, 0, len(hosts)), + } + for i := range hosts { + var item collector.HBAItem + item.Host = hosts[i] + item.FirmwareVersion, _ = c.hbaFwVersion(hosts[i]) + item.WWPNs, _ = c.hbaWWPNs(hosts[i]) + item.WWNNs, _ = c.hbaWWNNs(hosts[i]) + hba.Items = append(hba.Items, item) + } + return &hba, nil +} + +// hbaHosts 返回/sys/class/fc_host/目录下第一层的所有子目录名称 +func (c *bootosC) hbaHosts() (hosts []string, err error) { + flist, err := ioutil.ReadDir("/sys/class/fc_host/") + if err != nil { + if log := c.Base.GetLog(); log != nil { + log.Error(err) + } + return nil, err + } + for i := range flist { + hosts = append(hosts, flist[i].Name()) + } + return hosts, nil +} + +// hasHBA 检查当前设备是否含有HBA卡 +func (c *bootosC) hasHBA() bool { + output, _ := c.Base.ExecByShell("lspci", "|", "grep", `"Fibre Channel"`) + return strings.TrimSpace(string(output)) != "" +} + +// hbaFwVersion 采集指定HBA卡的固件版本号 +func (c *bootosC) hbaFwVersion(host string) (version string, err error) { + // /sys/class/scsi_host/$host/fw_version + b, err := ioutil.ReadFile(filepath.Join("/sys", "class", "scsi_host", host, "fw_version")) + if err != nil { + if log := c.Base.GetLog(); log != nil { + log.Error(err) + } + return "", err + } + return strings.TrimSpace(string(b)), nil +} + +func (c *bootosC) hbaWWPNs(host string) (wwpns []string, err error) { + b, err := ioutil.ReadFile(filepath.Join("/sys", "class", "fc_host", host, "port_name")) + if err != nil { + if log := c.Base.GetLog(); log != nil { + log.Error(err) + } + return nil, err + } + return []string{ + strings.TrimSpace(string(b)), // TODO 理论上一块HBA卡有多个wwpn,暂时不清楚此文件内容格式。 + }, nil +} + +func (c *bootosC) hbaWWNNs(host string) (wwnns []string, err error) { + b, err := ioutil.ReadFile(filepath.Join("/sys", "class", "scsi_host", host, "device", "fc_host", host, "node_name")) + if err != nil { + if log := c.Base.GetLog(); log != nil { + log.Error(err) + } + return nil, err + } + return []string{ + strings.TrimSpace(string(b)), // TODO 理论上一块HBA卡有一个或者多个wwnn,暂时不清楚此文件内容格式。 + }, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/idrac.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/idrac.go new file mode 100644 index 0000000000000000000000000000000000000000..af3e95c4391b2a8d4c85f9be4516666bf83795a6 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/idrac.go @@ -0,0 +1,39 @@ +package bootos + +import ( + "bufio" + "bytes" + "strings" + + "idcos.io/cloudboot/hardware/collector" +) + +// IDRAC 采集并返回Dell iDRAC信息。 +func (c *bootosC) IDRAC() (*collector.IDRAC, error) { + // iDRAC并非只适用于Dell,一些贴牌服务器同样有可能使用iDRAC。 + output, err := c.Base.ExecByShell("racadm", "getsysinfo", "-d") + if err != nil { + return nil, err + } + var idrac collector.IDRAC + scanner := bufio.NewScanner(bytes.NewReader(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" { + continue + } + if strings.HasPrefix(line, "RAC Date/Time") { + idrac.RACDateTime = c.extractValue(line, eqSeprator) + + } else if strings.HasPrefix(line, "Firmware Version") { + idrac.FirmwareVersion = c.extractValue(line, eqSeprator) + + } else if strings.HasPrefix(line, "Firmware Build") { + idrac.FirmwareBuild = c.extractValue(line, eqSeprator) + + } else if strings.HasPrefix(line, "Last Firmware Update") { + idrac.LastFirmwareUpdate = c.extractValue(line, eqSeprator) + } + } + return &idrac, scanner.Err() +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/ilo.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/ilo.go new file mode 100644 index 0000000000000000000000000000000000000000..7ddc2f19fad334300ce7e909bfb30dab0ad72924 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/ilo.go @@ -0,0 +1,71 @@ +package bootos + +import ( + "encoding/xml" + "io/ioutil" + "os" + "path/filepath" + + "idcos.io/cloudboot/hardware/collector" +) + +const ( + // iLOTool iLO配置管理工具 + iLOTool = "hponcfg" + + // getFirmwareVersion4iLO 请求查询iLO固件版本的XML + getFirmwareVersion4iLO = ` + <?xml version="1.0"?> + <RIBCL VERSION="2.0"> + <LOGIN USER_LOGIN="admin" PASSWORD="Cyclone@1234"> + <RIB_INFO MODE="read"> + <GET_FW_VERSION/> + </RIB_INFO> + </LOGIN> + </RIBCL> + ` +) + +var ( + iLOReqXML = filepath.Join(os.TempDir(), "ilo_req.xml") + iLORespXML = filepath.Join(os.TempDir(), "ilo_resp.xml") +) + +type fwVersionResp struct { + XMLName xml.Name `xml:"GET_FW_VERSION"` + Version string `xml:"FIRMWARE_VERSION,attr"` + Date string `xml:"FIRMWARE_DATE,attr"` +} + +// ILO 采集并返回HP iLO信息。 +func (c *bootosC) ILO() (ilo *collector.ILO, err error) { + if err = ioutil.WriteFile(iLOReqXML, []byte(getFirmwareVersion4iLO), 0644); err != nil { + if log := c.Base.GetLog(); log != nil { + log.Error(err) + } + return nil, err + } + + if _, err = c.Base.ExecByShell(iLOTool, "-f", iLOReqXML, "-l", iLORespXML); err != nil { + return nil, err + } + + bResp, err := ioutil.ReadFile(iLORespXML) + if err != nil { + if log := c.Base.GetLog(); log != nil { + log.Error(err) + } + return nil, err + } + var resp fwVersionResp + if err = xml.Unmarshal(bResp, &resp); err != nil { + if log := c.Base.GetLog(); log != nil { + log.Error(err) + } + return nil, err + } + return &collector.ILO{ + FirmwareDate: resp.Date, + FirmwareVersion: resp.Version, + }, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/lldp.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/lldp.go new file mode 100644 index 0000000000000000000000000000000000000000..38d2766400290e1d3e49605321bf3bd01cebc562 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/lldp.go @@ -0,0 +1,17 @@ +package bootos + +import ( + "encoding/json" + + "idcos.io/cloudboot/hardware/collector" +) + +// LLDP 采集并返回当前设备LLDP信息。 +func (c *bootosC) LLDP() (*collector.LLDP, error) { + output, err := c.Base.ExecByShell("lldpctl", "-f", "json") + if err != nil { + return nil, err + } + var lldp collector.LLDP + return &lldp, json.Unmarshal(output, &lldp) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/memory.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/memory.go new file mode 100644 index 0000000000000000000000000000000000000000..a99de931c2eb44c16ec0fe254ef253cc06d482da --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/memory.go @@ -0,0 +1,97 @@ +package bootos + +import ( + "bufio" + "bytes" + "strings" + + "idcos.io/cloudboot/hardware/collector" + mybytes "idcos.io/cloudboot/utils/bytes" +) + +// Memory 采集并返回当前设备内存信息 +func (c *bootosC) Memory() (*collector.Memory, error) { + var err error + var mem collector.Memory + // 采集所有内存条信息 + mem.Items, err = c.memoryDevices() + if err != nil { + return nil, err + } + mem.TotalSize, mem.TotalSizeMB, err = c.calcMemTotalSize(mem.Items) + if err != nil { + return nil, err + } + return &mem, nil +} + +// memoryDevices 采集已经插在插槽上的内存条信息列表 +func (c *bootosC) memoryDevices() (items []collector.MemoryDevice, err error) { + output, err := c.Base.ExecByShell("dmidecode", "-t", "memory") + if err != nil { + return nil, err + } + array := bytes.Split(output, []byte("Memory Device")) + for i := range array { + item := c.parseMemoryDevice(array[i]) + if item == nil { + continue + } + items = append(items, *item) + } + return items, nil +} + +func (c *bootosC) parseMemoryDevice(out []byte) *collector.MemoryDevice { + var memDev collector.MemoryDevice + scanner := bufio.NewScanner(bytes.NewReader(out)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if !strings.Contains(line, ":") { + continue + } + + if strings.HasPrefix(line, "Size:") { + if strings.Contains(line, "No Module Installed") { + return nil // 该插槽上未插内存条 + } + memDev.Size = c.extractValue(line, colonSeparator) + + } else if strings.HasPrefix(line, "Speed:") { + memDev.Speed = c.extractValue(line, colonSeparator) + + } else if strings.HasPrefix(line, "Locator:") { + memDev.Locator = c.extractValue(line, colonSeparator) + + } else if strings.HasPrefix(line, "Type:") { + memDev.Type = c.extractValue(line, colonSeparator) + } + } + if memDev.Locator == "" && memDev.Size == "" && memDev.Speed == "" && memDev.Type == "" { + return nil + } + return &memDev +} + +// calcDiskTotalSize 计算逻辑磁盘总容量。 +// bsize 单位为Byte的容量值。 +// mbsize 单位为MB的容量值。 +func (c *bootosC) calcMemTotalSize(items []collector.MemoryDevice) (bsize int64, mbsize int, err error) { + for i := range items { + fields := strings.Fields(items[i].Size) + if len(fields) != 2 { + continue + } + fields[0] = strings.TrimSpace(fields[0]) + fields[1] = strings.TrimSpace(fields[1]) + size, err := mybytes.Parse2Byte(fields[0], fields[1]) + if err != nil { + if log := c.Base.GetLog(); log != nil { + log.Errorf("Parse2Byte(%s, %s) error: %s", fields[0], fields[1], err.Error()) + } + return 0, 0, err + } + bsize += int64(size) + } + return bsize, mybytes.Byte2MBRounding(mybytes.Byte(bsize)), nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/motherboard.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/motherboard.go new file mode 100644 index 0000000000000000000000000000000000000000..c51aa7cd64d0aa742e617be66b2f10bb06e0651c --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/motherboard.go @@ -0,0 +1,60 @@ +package bootos + +import ( + "strings" + + "idcos.io/cloudboot/hardware/collector" +) + +// Motherboard 采集并返回当前设备的主板信息 +func (c *bootosC) Motherboard() (*collector.Motherboard, error) { + var err error + var board collector.Motherboard + + board.SerialNumber, err = c.boardSN() + if err != nil { + return nil, err + } + board.Manufacturer, err = c.boardManufacturer() + if err != nil { + return nil, err + } + board.ProductName, err = c.boardProductName() + if err != nil { + return nil, err + } + return &board, nil +} + +// boardSN 返回主板序列号 +func (c *bootosC) boardSN() (sn string, err error) { + output, err := c.Base.ExecByShell("dmidecode", "-s", "baseboard-serial-number") + if err != nil { + return "", err + } + return strings.TrimSpace(string(output)), nil +} + +// boardManufacturer 返回主板厂商名 +func (c *bootosC) boardManufacturer() (name string, err error) { + output, err := c.Base.ExecByShell("dmidecode", "-s", "baseboard-manufacturer") + name = strings.TrimSpace(string(output)) + if name != "" { + return name, err + } + // dmidecode | grep -A16 "System Information$" | grep "Vendor:" | sed -n '1p' + output, err = c.Base.ExecByShell("dmidecode", "|", "grep", "-A16", `"System Information$"`, "|", "grep", `"Vendor:"`, "|", "sed", "-n", `'1p'`) + return strings.TrimSpace(strings.TrimPrefix(strings.TrimSpace(string(output)), "Vendor:")), err +} + +// boardProductName 返回主板产品名 +func (c *bootosC) boardProductName() (name string, err error) { + output, err := c.Base.ExecByShell("dmidecode", "-s", "baseboard-product-name") + name = strings.TrimSpace(string(output)) + if name != "" { + return name, err + } + // dmidecode | grep -A16 "System Information$" | grep "Product Name:" | sed -n '1p' + output, err = c.Base.ExecByShell("dmidecode", "|", "grep", "-A16", `"System Information$"`, "|", "grep", `"Product Name:"`, "|", "sed", "-n", `'1p'`) + return strings.TrimSpace(strings.TrimPrefix(strings.TrimSpace(string(output)), "Product Name:")), err +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/nic.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/nic.go new file mode 100644 index 0000000000000000000000000000000000000000..d7cbc7371fd764079173a4fb17b8dec4bcca407d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/nic.go @@ -0,0 +1,199 @@ +package bootos + +import ( + "bufio" + "bytes" + "net" + "regexp" + "strings" + + "idcos.io/cloudboot/hardware/collector" +) + +// NIC 采集并返回当前设备的网卡信息 +func (c *bootosC) NIC() (*collector.NIC, error) { + items, err := c.nicItemsBase() + if err != nil { + return nil, err + } + pairs, err := c.busDesignationPairs() + if err != nil { + return nil, err + } + c.populateNICItems(&items, pairs) + return &collector.NIC{ + Items: items, + }, nil +} + +// nicItemsBase 返回包含基本信息(名称、mac、ip)的网卡列表 +func (c *bootosC) nicItemsBase() (items []collector.NICItem, err error) { + nics, err := net.Interfaces() + if err != nil { + if log := c.GetLog(); log != nil { + log.Error(err) + } + return nil, err + } + for i := range nics { + if strings.HasPrefix(strings.ToLower(nics[i].Name), "lo") || + strings.HasPrefix(strings.ToLower(nics[i].Name), "vnet") { + continue + } + ip, _ := c.findIPByNICName(nics[i].Name) + + items = append(items, collector.NICItem{ + Name: nics[i].Name, + Mac: nics[i].HardwareAddr.String(), + IP: ip, + }) + } + return items, nil +} + +var ipReg = regexp.MustCompile(`^(\d+.){3}\d+$`) + +func (c *bootosC) findIPByNICName(name string) (ip string, err error) { + // ip -4 -o address show + out, err := c.ExecByShell("ip", "-4", "-o", "address", "show") + if err != nil { + return "", err + } + scanner := bufio.NewScanner(bytes.NewReader(out)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if !strings.Contains(line, name) { + continue + } + fields := strings.Fields(line) + for i := range fields { + idx := strings.Index(fields[i], "/") + if idx < 0 { + continue + } + ip = fields[i][:idx] + if ipReg.MatchString(ip) { + return ip, nil + } + } + } + return "", nil +} + +func (c *bootosC) busDesignationPairs() (pairs map[string]string, err error) { + output, err := c.Base.ExecByShell("dmidecode", "-t", "slot") + if err != nil { + return nil, err + } + pairs = make(map[string]string) + blocks := bytes.Split(output, []byte{'\n', '\n'}) + for i := range blocks { + bus, designation := c.parseBusDesignation(blocks[i]) + if bus == "" || designation == "" { + continue + } + pairs[bus] = designation + } + return pairs, nil +} + +func (c *bootosC) parseBusDesignation(out []byte) (bus, designation string) { + scanner := bufio.NewScanner(bytes.NewReader(out)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if strings.HasPrefix(line, "Current Usage:") && c.extractValue(line, colonSeparator) != "In Use" { + return "", "" + } else if strings.HasPrefix(line, "Bus Address:") { + busRaw := c.extractValue(line, colonSeparator) + if strings.Contains(busRaw, ".") { + bus = strings.Split(busRaw, ".")[0] + } + } else if strings.HasPrefix(line, "Designation:") { + designation = c.extractValue(line, colonSeparator) + } + } + return bus, designation +} + +// populateNICItems 将列表中的网卡信息填充完整 +func (c *bootosC) populateNICItems(items *[]collector.NICItem, pairs map[string]string) { + for i := range *items { + _ = c.populateNICItem(&((*items)[i]), pairs) + } +} + +func (c *bootosC) populateNICItem(item *collector.NICItem, pairs map[string]string) (err error) { + defer c.populateNICStatusAndSpeed(item) + + output, err := c.Base.ExecByShell("ethtool", "-i", item.Name) + if err != nil { + return err + } + scanner := bufio.NewScanner(bytes.NewReader(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" { + continue + } + if strings.HasPrefix(line, "firmware-version:") { + item.FirmwareVersion = c.extractValue(line, colonSeparator) + } + if strings.HasPrefix(line, "bus-info:") { + item.Businfo = c.extractValue(line, colonSeparator) + } + } + + businfo := item.Businfo // 0000:02:00.0 + if !strings.Contains(businfo, ".") || !strings.Contains(businfo, ":") { + return nil + } + subBusDot := strings.Split(businfo, ".")[0] //0000:02:00 + if designation, ok := pairs[subBusDot]; ok { + item.Side = "outside" + item.Designation = designation + } else { + item.Side = "inside" + } + subBusColon := strings.Join(strings.Split(businfo, ":")[1:], ":") //02:00.0 + out, err := c.Base.ExecByShell("lspci", "|", "grep", subBusColon) + if err != nil { + return err + } + // 01:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5720 Gigabit Ethernet PCIe + if fields := strings.Fields(strings.TrimSpace(string(out))); len(fields) > 5 { // TODO 使用更加严谨的方式采集厂商和型号信息 + item.Company = strings.Join(fields[3:5], " ") + item.ModelName = strings.Join(fields[5:], " ") + } + return nil +} + +// populateNICStatusAndSpeed 填充网卡列表中的网卡速率信息 +func (c *bootosC) populateNICStatusAndSpeed(item *collector.NICItem) (err error) { + output, err := c.Base.ExecByShell("ethtool", item.Name) + if err != nil { + return err + } + if strings.Contains(string(output), "10000base") { + item.Speed = "10Gbit/s" + } else if strings.Contains(string(output), "1000base") { + item.Speed = "1Gbit/s" + } else if strings.Contains(string(output), "100base") { + item.Speed = "100Mbit/s" + } else if strings.Contains(string(output), "10base") { + item.Speed = "10Mbit/s" + } + + //获取网卡的连接状态信息 + scanner := bufio.NewScanner(bytes.NewReader(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" { + continue + } + + if strings.HasPrefix(line, "Link detected:") { + item.Link = c.extractValue(line, colonSeparator) + } + } + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/oob.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/oob.go new file mode 100644 index 0000000000000000000000000000000000000000..68799f426ace80488272cfc6516734d1611db48a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/oob.go @@ -0,0 +1,48 @@ +package bootos + +import ( + "strconv" + + "idcos.io/cloudboot/hardware/collector" + "idcos.io/cloudboot/hardware/oob" +) + +// OOB 采集并返回当前设备的OOB信息。 +func (c *bootosC) OOB() (*collector.OOB, error) { + worker := oob.SelectWorker(oob.DefaultWorker) + if worker == nil { + if log := c.Base.GetLog(); log != nil { + log.Errorf("Can't find the OOB worker by name: %s", oob.DefaultWorker) + } + return nil, nil + } + var oob collector.OOB + if bmc, _ := worker.BMC(); bmc != nil { + oob.Firmware = bmc.FirmwareReversion + } + + if network, _ := worker.Network(); network != nil { + oob.Network = &collector.OOBNetwork{ + IPSrc: network.IPSrc, + IP: network.IP, + Netmask: network.Netmask, + Gateway: network.Gateway, + } + } + + if users, _ := worker.Users(); len(users) > 0 { + oobusers := make([]collector.OOBUser, 0, len(users)) + for i := range users { + user := collector.OOBUser{ + ID: users[i].ID, + Name: users[i].Name, + } + if users[i].Access != nil { + user.PrivilegeLevel = strconv.Itoa(users[i].Access.PrivilegeLevel) + } + oobusers = append(oobusers, user) + } + oob.User = oobusers + } + return &oob, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/pci.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/pci.go new file mode 100644 index 0000000000000000000000000000000000000000..98c1b21913d21a2def7577edd0012290262dafb1 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/pci.go @@ -0,0 +1,55 @@ +package bootos + +import ( + "bufio" + "bytes" + "strings" + + "idcos.io/cloudboot/hardware/collector" +) + +// PCI 采集并返回当前设备的所有PCI插槽信息。 +func (c *bootosC) PCI() (*collector.PCI, error) { + output, err := c.Base.ExecByShell("dmidecode", "-t", "slot") + if err != nil { + return nil, err + } + + blocks := bytes.Split(output, []byte{'\n', '\n'}) + items := make([]collector.SlotItem, 0, len(blocks)-1) + for i := range blocks { + slot, err := c.parseSlotItem(blocks[i]) + if err != nil { + return nil, err + } + if slot == nil { + continue + } + items = append(items, *slot) + } + return &collector.PCI{ + TotalSlots: len(items), + Items: items, + }, nil +} + +func (c *bootosC) parseSlotItem(block []byte) (*collector.SlotItem, error) { + if !bytes.Contains(block, []byte("System Slot Information")) { + return nil, nil + } + var slot collector.SlotItem + scanner := bufio.NewScanner(bytes.NewReader(block)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if strings.HasPrefix(line, "Type:") { + slot.Type = c.extractValue(line, colonSeparator) + + } else if strings.HasPrefix(line, "Designation:") { + slot.Designation = c.extractValue(line, colonSeparator) + + } else if strings.HasPrefix(line, "Current Usage:") { + slot.CurrentUsage = c.extractValue(line, colonSeparator) + } + } + return &slot, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/power.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/power.go new file mode 100644 index 0000000000000000000000000000000000000000..3a923ff6b76cc03ef46a0eddc40e8895d4eb0271 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/power.go @@ -0,0 +1,9 @@ +package bootos + +import "idcos.io/cloudboot/hardware/collector" + +// Power 采集并返回当前设备的电源信息。 +func (c *bootosC) Power() (*collector.Power, error) { + // TODO 实现设备电源信息的采集 + return nil, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/raid.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/raid.go new file mode 100644 index 0000000000000000000000000000000000000000..373035d4e2b382538fc437c24710ddd2f5e00142 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/bootos/raid.go @@ -0,0 +1,31 @@ +package bootos + +import ( + "idcos.io/cloudboot/hardware/collector" + "idcos.io/cloudboot/hardware/raid" +) + +// RAID 采集并返回当前设备的RAID信息。 +func (c *bootosC) RAID() (*collector.RAID, error) { + name, err := raid.Whoami() + if err != nil { + if log := c.Base.GetLog(); log != nil { + log.Error(err) + } + return nil, err + } + worker := raid.SelectWorker(name) + if worker == nil { + if log := c.Base.GetLog(); log != nil { + log.Errorf("Can't find the RAID worker by name: %s", name) + } + return nil, nil + } + ctrls, err := worker.Controllers() + if err != nil { + return nil, err + } + return &collector.RAID{ + Items: ctrls, + }, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/collector.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/collector.go new file mode 100644 index 0000000000000000000000000000000000000000..094b1c49af25f2e837cfd8fea27b8559dd7672ec --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/collector.go @@ -0,0 +1,377 @@ +package collector + +import ( + "encoding/json" + "errors" + + "idcos.io/cloudboot/hardware/raid" + "idcos.io/cloudboot/logger" +) + +const ( + // HP 厂商-惠普 + HP = "HP" + // Dell 厂商-戴尔 + Dell = "Dell" + // Huawei 厂商-华为 + Huawei = "Huawei" + // xFusion 厂商-超聚变 + XFusion = "xFusion" + // Lenovo 厂商-联想 + Lenovo = "Lenovo" + // H3C 厂商-华三 + H3C = "H3C" + // Inspur 厂商-浪潮 + Inspur = "Inspur" + // Sugon 厂商-曙光 + Sugon = "Sugon" + // UNIS 厂商-紫光 + UNIS = "UNIS" + // suma 厂商-曙光 + Suma = "suma" + // Supermicro 厂商-超微 + Supermicro = "Supermicro" + // Greatwall 厂商-长城 + Greatwall = "Greatwall" + + // DefaultCollector 默认采集器名称 + DefaultCollector = "BOOTOS" +) + +var ( + // ErrUnregisteredCollector 未注册的采集器 + ErrUnregisteredCollector = errors.New("unregistered collector") +) + +// Collector 设备信息采集器 +type Collector interface { + // SetDebug 设置是否开启debug。若开启debug,会将关键日志信息写入console。 + SetDebug(debug bool) + // SetLog 更换日志实现。默认情况下内部无日志实现。 + SetLog(log logger.Logger) + // 采集并返回当前设备基本信息 + BASE() (isVM bool, sn, vendor, model, arch string, err error) + // CPU 采集并返回当前设备的CPU信息 + CPU() (*CPU, error) + // Memory 采集并返回当前设备内存信息 + Memory() (*Memory, error) + // Motherboard 采集并返回当前设备的主板信息 + Motherboard() (*Motherboard, error) + // Disk 采集并返回当前设备的逻辑磁盘信息 + Disk() (*Disk, error) + // DiskSlot 采集并返回当前设备的磁盘槽位(物理驱动器)信息 + DiskSlot() (*DiskSlot, error) + // NIC 采集并返回当前设备的网卡信息 + NIC() (*NIC, error) + // HBA 采集并返回当前设备的HBA卡信息。若当前设备不包含HBA卡,则返回值都为nil。 + HBA() (*HBA, error) + // OOB 采集并返回当前设备的OOB信息。 + OOB() (*OOB, error) + // BIOS 采集并返回当前设备的BIOS信息。 + BIOS() (*BIOS, error) + // RAID 采集并返回当前设备的RAID信息。 + RAID() (*RAID, error) + // PCI 采集并返回当前设备的所有PCI插槽信息。 + PCI() (*PCI, error) + // Fan 采集并返回当前设备的所有风扇信息。 + Fan() (*Fan, error) + // Power 采集并返回当前设备的电源信息。 + Power() (*Power, error) + // LLDP 采集并返回当前设备LLDP信息。 + LLDP() (*LLDP, error) + // IDRAC 采集并返回Dell iDRAC信息。 + IDRAC() (*IDRAC, error) + // ILO 采集并返回HP iLO信息。 + ILO() (*ILO, error) + // Backplane 采集并返回背板信息。 + Backplane() (*Backplane, error) + // Extra 执行采集脚本并返回采集到的信息。若执行采集脚本时发生错误,则丢弃该错误,继续执行后续脚本。 + // 采集脚本需满足以下条件: + // 1、脚本的开始位置通过shebang指定执行该脚本的程序,如'#! /usr/bin/env python'。 + // 2、脚本执行完毕后,需要将采集到的设备信息以JSON Object格式字符串写入stdout。 + // 3、多个脚本输出的JSON Object属性名不能重复,否则在合并多个JSON Object过程中可能导致数据丢失。 + Extra(scripts [][]byte) *Extra +} + +// Backplane 背板 +type Backplane struct { + Items []BackplaneItem `json:"items"` +} + +// BackplaneItem 背板条目 +type BackplaneItem struct { + Name string `json:"name"` // 背板名称 + FirmwareVersion string `json:"firmware_version"` // 背板固件版本号 +} + +// ILO HP iLO +type ILO struct { + FirmwareDate string `json:"firmware_date"` + FirmwareVersion string `json:"firmware_version"` +} + +// IDRAC Dell iDRAC +type IDRAC struct { + RACDateTime string `json:"rac_date_time"` + FirmwareVersion string `json:"firmware_version"` + FirmwareBuild string `json:"firmware_build"` + LastFirmwareUpdate string `json:"last_firmware_update"` +} + +// NIC 网卡 +type NIC struct { + Items []NICItem `json:"items"` +} + +// NICItem 网卡信息 +type NICItem struct { + Name string `json:"name"` // 网卡逻辑名称 + Mac string `json:"mac"` // mac地址 + IP string `json:"ip"` // BootOS BootOSIP + Businfo string `json:"businfo"` // 网口 + Designation string `json:"designation"` // 槽位 + Side string `json:"side"` // 内/外置 + Speed string `json:"speed"` // 速率 + Company string `json:"company"` // 厂商 + ModelName string `json:"model_name"` // 型号 + FirmwareVersion string `json:"firmware_version"` // 固件版本 + Link string `json:"link"` //网卡链接状态 +} + +// ToJSON 序列化为JSON +func (nic NIC) ToJSON() []byte { + b, _ := json.Marshal(nic) + return b +} + +// CPU CPU信息。 +// 总核数 = 物理CPU个数 X 每颗物理CPU的核数 +// 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 +type CPU struct { + TotalCores int `json:"total_cores"` // 物理CPU总核心数 + Threads int `json:"threads"` // 超线程数 + TotalLogicals int `json:"total_logicals"` // 逻辑CPU数量 + TotalPhysicals int `json:"total_physicals"` // 物理CPU数量 + Physicals []PhysicalCPU `json:"physicals"` // 物理CPU列表 +} + +// PhysicalCPU 物理CPU +type PhysicalCPU struct { + ModelName string `json:"model_name"` // 型号 + ClockSpeed string `json:"clock_speed"` // 主频 + Cores int `json:"cores"` // 单颗物理CPU的核心数 +} + +// ToJSON 序列化为JSON +func (cpu CPU) ToJSON() []byte { + b, _ := json.Marshal(cpu) + return b +} + +// Memory 内存 +type Memory struct { + TotalSizeMB int `json:"total_size_mb"` // 当前内存总容量,单位MB。 + TotalSize int64 `json:"total_size"` // 当前内存总容量,单位Byte。 + Items []MemoryDevice `json:"items"` // 物理内存条列表 +} + +// MemoryDevice 插在内存插槽上的内存条 +type MemoryDevice struct { + Locator string `json:"locator"` + Size string `json:"size"` // 容量,8192 MB + Type string `json:"type"` // 类型,如DDR3 + Speed string `json:"speed"` // 速率 +} + +// ToJSON 序列化为JSON +func (m Memory) ToJSON() []byte { + b, _ := json.Marshal(m) + return b +} + +// Disk 逻辑磁盘 +type Disk struct { + TotalSizeGB int `json:"total_size_gb"` // 取整后的磁盘总容量,单位GB。 + TotalSize int64 `json:"total_size"` // 磁盘总容量,单位Byte。 + Items []DiskItem `json:"items"` +} + +// DiskItem 逻辑磁盘条目 +type DiskItem struct { + Name string `json:"name"` // 名称,如'/dev/sda' + Size string `json:"size"` // 容量,如'599.6 GB, 599550590976 bytes' +} + +// ToJSON 序列化为JSON +func (d Disk) ToJSON() []byte { + b, _ := json.Marshal(d) + return b +} + +// DiskSlot 磁盘槽位(物理驱动器) +type DiskSlot struct { + Items []raid.PhysicalDrive `json:"items"` +} + +// ToJSON 序列化为JSON +func (d DiskSlot) ToJSON() []byte { + b, _ := json.Marshal(d) + return b +} + +// Motherboard 主板 +type Motherboard struct { + Manufacturer string `json:"manufacturer"` // 厂商名 + ProductName string `json:"product_name"` // 产品名 + SerialNumber string `json:"serial_number"` // 序列号 +} + +// ToJSON 序列化为JSON +func (board Motherboard) ToJSON() []byte { + b, _ := json.Marshal(board) + return b +} + +// RAID RAID +type RAID struct { + Items []raid.Controller `json:"items"` +} + +// RAIDArray RAID阵列 +type RAIDArray struct { + Level string `json:"level"` +} + +// ToJSON 序列化为JSON +func (raid RAID) ToJSON() []byte { + b, _ := json.Marshal(raid) + return b +} + +// OOB OOB +type OOB struct { + Network *OOBNetwork `json:"network,omitempty"` + User []OOBUser `json:"user,omitempty"` + Firmware string `json:"firmware,omitempty"` // 固件版本 +} + +// OOBNetwork 带外网络信息 +type OOBNetwork struct { + IPSrc string `json:"ip_src,omitempty"` // IP来源。可选值: static|dhcp + IP string `json:"ip,omitempty"` + Netmask string `json:"netmask,omitempty"` + Gateway string `json:"gateway,omitempty"` +} + +// OOBUser 带外用户信息 +type OOBUser struct { + ID int `json:"id"` + Name string `json:"name"` + Password string `json:"password"` //这个值采集不到 + PrivilegeLevel string `json:"privilege_level"` +} + +// ToJSON 序列化为JSON +func (oob OOB) ToJSON() []byte { + b, _ := json.Marshal(oob) + return b +} + +// BIOS BIOS +type BIOS struct { + Vendor string `json:"vendor,omitempty"` // 厂商 + Version string `json:"version,omitempty"` // 固件版本号 +} + +// ToJSON 序列化为JSON +func (bios BIOS) ToJSON() []byte { + b, _ := json.Marshal(bios) + return b +} + +// Power 电源 +type Power struct { + // TODO 定义字段 +} + +// ToJSON 序列化为JSON +func (p Power) ToJSON() []byte { + b, _ := json.Marshal(p) + return b +} + +// Fan 风扇 +type Fan struct { + Items []FanItem `json:"items,omitempty"` +} + +// FanItem 风扇 +type FanItem struct { + ID string `json:"id"` // 风扇传感器ID + Speed string `json:"speed"` // 转速 +} + +// ToJSON 序列化为JSON +func (fan Fan) ToJSON() []byte { + b, _ := json.Marshal(fan) + return b +} + +// PCI PCI +type PCI struct { + TotalSlots int `json:"total_slots"` + Items []SlotItem `json:"slots,omitempty"` +} + +// SlotItem PCI插槽 +type SlotItem struct { + Designation string `json:"designation"` // 槽位 + Type string `json:"type"` // 设备类型 + CurrentUsage string `json:"current_usage"` // 当前使用情况 +} + +// ToJSON 序列化为JSON +func (pci PCI) ToJSON() []byte { + b, _ := json.Marshal(pci) + return b +} + +// HBA HBA卡 +type HBA struct { + Items []HBAItem `json:"items,omitempty"` +} + +// HBAItem 单块HBA卡 +type HBAItem struct { + Host string `json:"host"` + WWPNs []string `json:"wwpns"` + WWNNs []string `json:"wwnns"` + FirmwareVersion string `json:"firmware_version"` +} + +// ToJSON 序列化为JSON +func (hba HBA) ToJSON() []byte { + b, _ := json.Marshal(hba) + return b +} + +// LLDP LLDP采集到的交换机信息 +type LLDP map[string]interface{} + +// ToJSON 序列化为JSON +func (lldp LLDP) ToJSON() []byte { + if lldp == nil { + return nil + } + b, _ := json.Marshal(lldp) + return b +} + +// Extra 自定义扩展属性 +type Extra map[string]interface{} + +// ToJSON 序列化为JSON +func (extra Extra) ToJSON() []byte { + b, _ := json.Marshal(extra) + return b +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/register.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/register.go new file mode 100644 index 0000000000000000000000000000000000000000..d9907f72ac0891440203f294650c26e42d771a6a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/collector/register.go @@ -0,0 +1,49 @@ +package collector + +import ( + "strings" + "sync" +) + +// pool 采集器池 +var pool = make(map[string]Collector) +var mux sync.Mutex + +// Register 注册RAID阵列卡硬件及其处理Collector实例 +func Register(name string, collector Collector) { + mux.Lock() + defer mux.Unlock() + if collector == nil { + panic("raid: Register Collector is nil") + } + name = strings.ToUpper(name) + if _, dup := pool[name]; dup { + panic("raid: Register called twice for Collector " + name) + } + pool[name] = collector +} + +// Registered 返回已注册的RAID硬件 +func Registered() (items []string) { + mux.Lock() + defer mux.Unlock() + + for key := range pool { + items = append(items, key) + } + return items +} + +// SelectCollector 根据RAID硬件名称获取相应的Collector +func SelectCollector(name string) Collector { + mux.Lock() + defer mux.Unlock() + + name = strings.ToUpper(name) + for key := range pool { + if key == name { + return pool[key] + } + } + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/hardware.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/hardware.go new file mode 100644 index 0000000000000000000000000000000000000000..30ac7f88f9cf76f79842bd948103c63481bb82f2 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/hardware.go @@ -0,0 +1,276 @@ +package hardware + +import ( + "bytes" + "errors" + "fmt" + "io/ioutil" + "os" + "os/exec" + "path/filepath" + "strings" + "time" + + "idcos.io/cloudboot/logger" +) + +// Base 硬件基础结构体 +type Base struct { + log logger.Logger + debug bool +} + +// SetDebug 设置是否开启debug。若开启debug,会将关键日志信息写入console。 +func (base *Base) SetDebug(debug bool) { + base.debug = debug +} + +// SetLog 更换日志实现。默认情况下内部无日志实现。 +func (base *Base) SetLog(log logger.Logger) { + base.log = log +} + +// GetLog 返回日志 +func (base *Base) GetLog() logger.Logger { + return base.log +} + +// Sleep 休眠2s +func (base *Base) Sleep() { + time.Sleep(2 * time.Second) +} + +// Exec 本地命令执行并返回stdout内容 +func (base *Base) Exec(cmd string, args ...string) (output []byte, err error) { + if base.log != nil { + base.log.Debugf("==> %s %s", cmd, strings.Join(args, " ")) + if base.debug { + fmt.Printf("==> %s %s\n", cmd, strings.Join(args, " ")) + } + } + + outputInfo := exec.Command(cmd, args...) + output, err = outputInfo.CombinedOutput() //返回标准输出和标准错误 + if output != nil && base.log != nil { + base.log.Debugf("\n--------------------stdout/stderr begin--------------------\n%s\n--------------------stdout/stderr end--------------------", string(output)) + if base.debug { + fmt.Printf("--------------------stdout/stderr begin--------------------\n%s\n--------------------stdout/stderr end--------------------\n", string(output)) + } + } + + if err != nil && base.log != nil { + base.log.Debugf(err.Error()) + err = errors.New(string(output)) + } + + return output, err +} + +const ( + shell = "/bin/bash" +) + +// ExecByShell 通过本地shell运行命令 +func (base *Base) ExecByShell(cmd string, args ...string) (output []byte, err error) { + if base.log != nil { + base.log.Debugf("==> %s %s", cmd, strings.Join(args, " ")) + if base.debug { + fmt.Printf("==> %s %s\n", cmd, strings.Join(args, " ")) + } + } + + scriptFile, err := genTempScript([]byte(fmt.Sprintf("%s %s", cmd, strings.Join(args, " ")))) + if err != nil { + if base.log != nil { + base.log.Error(err) + } + return nil, err + } + defer os.Remove(scriptFile) + + outputInfo := exec.Command(shell, scriptFile) + output, err = outputInfo.CombinedOutput() //返回标准输出和标准错误 + if output != nil && base.log != nil { + base.log.Debugf("\n--------------------stdout/stderr begin--------------------\n%s\n--------------------stdout/stderr end--------------------", string(output)) + if base.debug { + fmt.Printf("--------------------stdout/stderr begin--------------------\n%s\n--------------------stdout/stderr end--------------------\n", string(output)) + } + } + + if err != nil && base.log != nil { + base.log.Debugf(err.Error()) + err = errors.New(string(output)) + } + + return output, err +} + +// genTempScript 在系统临时目录生成可执行脚本文件 +func genTempScript(content []byte) (scriptFile string, err error) { + scriptFile = filepath.Join(os.TempDir(), fmt.Sprintf("%d.sh", time.Now().UnixNano())) + if err = ioutil.WriteFile(scriptFile, content, 0744); err != nil { + return "", err + } + return scriptFile, nil +} + +// ExecWithPipe 完成带管道符的命令输出 比如命令[ls | grep Helloworld], +// 需要将exec.Command("ls")和exec.Command("grep", "Helloworld")的结果分别作为参数传入 +func (base *Base) ExecWithPipe(cmds ...*exec.Cmd) ([]byte, error) { + // At least one command + if len(cmds) < 1 { + return nil, nil + } + + var stdout bytes.Buffer + //var stderr bytes.Buffer + var err error + maxIndex := len(cmds) - 1 + cmds[maxIndex].Stdout = &stdout + cmds[maxIndex].Stderr = &stdout + + //for i, cmd := range cmds[:maxIndex] { + for i := 0; i < maxIndex; i++ { + cmds[i+1].Stdin, err = cmds[i].StdoutPipe() + if err != nil { + return nil, err + } + } + // Start each command + for _, cmd := range cmds { + err := cmd.Start() + if err != nil { + return stdout.Bytes(), err + } + } + // Wait for each command to complete + for _, cmd := range cmds { + err := cmd.Wait() + if err != nil { + return stdout.Bytes(), err + } + } + return stdout.Bytes(), nil +} + +// ExecWithStdinPipe 本地命令执行并读取stdin内容后返回stdout内容。 +func (base *Base) ExecWithStdinPipe(inputs []string, cmd string, args ...string) (output []byte, err error) { + if base.log != nil { + base.log.Debugf("==> %s %s", cmd, strings.Join(args, " ")) + if base.debug { + fmt.Printf("==> %s %s\n", cmd, strings.Join(args, " ")) + } + } + + command := exec.Command(cmd, args...) + stdin, err := command.StdinPipe() + if err != nil { + return nil, err + } + + go func() { + defer stdin.Close() + for i := range inputs { + fmt.Fprintln(stdin, inputs[i]) + if i < len(inputs)-1 { + time.Sleep(time.Second) + } + } + }() + + output, err = command.Output() + if output != nil && base.log != nil { + base.log.Debugf("\n--------------------stdout begin--------------------\n%s\n--------------------stdout end--------------------", string(output)) + if base.debug { + fmt.Printf("--------------------stdout begin--------------------\n%s\n--------------------stdout end--------------------\n", string(output)) + } + } + if err != nil && base.log != nil { + base.log.Errorf("\n--------------------stderr begin--------------------\n%s\n--------------------stderr end--------------------", err.Error()) + if base.debug { + fmt.Fprintf(os.Stderr, "--------------------stderr begin--------------------\n%s\n--------------------stderr end--------------------\n", err.Error()) + } + return nil, err + } + return output, err +} + +const ( + // MatchedYES 实际值与预期值相符 + MatchedYES = "yes" + // MatchedNO 实际值与预期值不符 + MatchedNO = "no" + // MatchedUnknown 实际值与预期值是否相符未知 + MatchedUnknown = "unknown" +) + +// CheckingItem 硬件配置实施后置检查结果 +type CheckingItem struct { + Title string `json:"title"` // 检查项名称 + Expected string `json:"expected"` // 预期值 + Actual string `json:"actual"` // 实际值 + Matched string `json:"matched"` // 是否匹配 + Error string `json:"error"` // 检查过程出错信息 +} + +// CheckingResult 硬件配置实施后置检查结果集合 +type CheckingResult struct { + RAIDItems []CheckingItem `json:"raid"` + OOBItems []CheckingItem `json:"oob"` + BIOSItems []CheckingItem `json:"bios"` + FWItems []CheckingItem `json:"firmware"` + //...继续扩展 +} + +// MatchFunc 对比预期值与实际值是否匹配的匹配器 +type MatchFunc func(expected, actual string) bool + +// EqualMatch 相等匹配器 +func EqualMatch(expected, actual string) bool { + return expected == actual +} + +// EqualIgnoreCaseMatch 大小写不敏感相等匹配器 +func EqualIgnoreCaseMatch(expected, actual string) bool { + return strings.ToLower(expected) == strings.ToLower(actual) +} + +// ContainsMatch 内容包含匹配器 +func ContainsMatch(expected, actual string) bool { + return strings.Contains(actual, expected) +} + +// CheckingHelper 硬件配置实施检查帮手。 +// 检查帮手默认使用相等匹配模式。 +type CheckingHelper struct { + item *CheckingItem + matcher MatchFunc +} + +// NewCheckingHelper 实例化检查帮手。默认使用相等匹配器。 +func NewCheckingHelper(title, expected, actual string) *CheckingHelper { + return &CheckingHelper{ + item: &CheckingItem{ + Title: title, + Expected: expected, + Actual: actual, + }, + matcher: EqualMatch, + } +} + +// Matcher 重置匹配器 +func (h *CheckingHelper) Matcher(matcher MatchFunc) *CheckingHelper { + h.matcher = matcher + return h +} + +// Do 执行检查并返回检查项结果。 +func (h *CheckingHelper) Do() *CheckingItem { + if h.matcher(h.item.Expected, h.item.Actual) { + h.item.Matched = MatchedYES + } else { + h.item.Matched = MatchedNO + } + return h.item +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/oob/ipmi/ipmi.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/oob/ipmi/ipmi.go new file mode 100644 index 0000000000000000000000000000000000000000..ec805ff8b055f5210708ab22c95953c0968aec95 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/oob/ipmi/ipmi.go @@ -0,0 +1,132 @@ +package ipmi + +import ( + "bufio" + "bytes" + "io" + "regexp" + "strconv" + "strings" + + "idcos.io/cloudboot/hardware/oob" +) + +// findUserByName 根据带外用户名查找带外用户。 +// 若指定名称的用户不存在,则返回nil。 +func (worker *worker) findUserByName(name string) (*oob.User, error) { + users, err := worker.Users() + if err != nil { + return nil, err + } + for i := range users { + if users[i].Name == name { + return &users[i], nil + } + } + return nil, nil +} + +// findUserIndexByName 返回指定用户名的用户在切片中的索引号 +func (worker *worker) findUserIndexByName(users []oob.User, name string) (index int) { + for i := range users { + if users[i].Name == name { + return i + } + } + return -1 +} + +const ( + defaultUserID = 2 +) + +// newUserID 返回新建用户的ID +func (worker *worker) newUserID() (id int, err error) { + users, err := worker.Users() + if err != nil { + return 0, err + } + if len(users) <= 0 { + return defaultUserID, nil + } + + for i := range users { + name := strings.TrimSpace(users[i].Name) + if name == "" || strings.Contains(name, "(Empty") { // 系统预置用户 + return users[i].ID, nil + } + } + return users[len(users)-1].ID + 1, nil +} + +// userAccess 返回通道下指定用户的Access信息 +func (worker *worker) userAccess(channel, userID int) (*oob.UserAccess, error) { + output, err := worker.Base.ExecByShell(tool, "channel", "getaccess", strconv.Itoa(channel), strconv.Itoa(userID)) + if err != nil { + return nil, err + } + var access oob.UserAccess + scanner := bufio.NewScanner(bytes.NewReader(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if strings.HasPrefix(line, "User Name") { + access.UserName = worker.extractValue(line, ":") + } else if strings.HasPrefix(line, "Access Available") { + access.AccessAvailable = worker.extractValue(line, ":") + } else if strings.HasPrefix(line, "Link Authentication") { + access.LinkAuthentication = worker.extractValue(line, ":") + } else if strings.HasPrefix(line, "IPMI Messaging") { + access.IPMIMessaging = worker.extractValue(line, ":") + } else if strings.HasPrefix(line, "Privilege Level") { + access.PrivilegeLevel = oob.IntUserLevel(worker.extractValue(line, ":")) + } + } + return &access, nil +} + +// extractValue 截取kv对中v的内容。假设,kv内容为"name : voidint",那么将返回"voidint"。 +func (worker *worker) extractValue(kv, sep string) (value string) { + if !strings.Contains(kv, sep) { + return kv + } + return strings.TrimSpace(strings.SplitN(kv, sep, 2)[1]) +} + +var ( + numReg = regexp.MustCompile("^\\d+$") +) + +// ParseUsers 返回stdout内容中的带外用户信息 +func ParseUsers(output []byte) (items []oob.User, err error) { + var started bool + rd := bufio.NewReader(bytes.NewBuffer(output)) + for { + line, err := rd.ReadString('\n') + if err == io.EOF { + break + } + if err != nil { + return nil, err + } + line = strings.TrimSpace(line) + if strings.HasPrefix(line, "ID") && strings.Contains(line, "Name") { + started = true + continue + } + if !started { + continue + } + + arr := strings.Fields(line) + if len(arr) < 6 || !numReg.MatchString(arr[0]) || arr[1] == "true" || arr[1] == "false" { + continue + } + + id, _ := strconv.Atoi(arr[0]) + items = append(items, oob.User{ + ID: id, + Name: arr[1], + }) + } + return items, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/oob/ipmi/oob.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/oob/ipmi/oob.go new file mode 100644 index 0000000000000000000000000000000000000000..e5603a759642f0b524d45089d86e18286bc1e2cf --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/oob/ipmi/oob.go @@ -0,0 +1,248 @@ +package ipmi + +import ( + "bufio" + "bytes" + "errors" + "fmt" + "strconv" + "strings" + "sync" + "time" + + "idcos.io/cloudboot/hardware" + "idcos.io/cloudboot/hardware/oob" + "idcos.io/cloudboot/logger" +) + +const ( + // name 处理器名称 + name = "IPMI" + // tool 硬件配置工具 + tool = "ipmitool" +) + +func init() { + oob.Register(name, new(worker)) +} + +type worker struct { + hardware.Base + mux sync.Mutex +} + +// SetDebug 设置是否开启debug。若开启debug,会将关键日志信息写入console。 +func (worker *worker) SetDebug(debug bool) { + worker.Base.SetDebug(debug) +} + +// SetLog 更换日志实现。默认情况下内部无日志实现。 +func (worker *worker) SetLog(log logger.Logger) { + worker.mux.Lock() + defer worker.mux.Unlock() + + worker.Base.SetLog(log) +} + +// SetDHCP 设置IP来源是DHCP +func (worker *worker) SetDHCP() error { + channel, err := worker.Channel() + if err != nil { + return err + } + _, err = worker.Base.ExecByShell(tool, "lan", "set", strconv.Itoa(channel), "ipsrc", "dhcp") + return err +} + +// SetStaticIP 设置IP来源是静态IP +func (worker *worker) SetStaticIP(ip, netmask, gateway string) error { + channel, err := worker.Channel() + if err != nil { + return err + } + ch := strconv.Itoa(channel) + if _, err := worker.Base.ExecByShell(tool, "lan", "set", ch, "ipsrc", "static"); err != nil { + return err + } + if _, err := worker.Base.ExecByShell(tool, "lan", "set", ch, "ipaddr", ip); err != nil { + return err + } + if _, err := worker.Base.ExecByShell(tool, "lan", "set", ch, "netmask", netmask); err != nil { + return err + } + if _, err := worker.Base.ExecByShell(tool, "lan", "set", ch, "defgw", "ipaddr", gateway); err != nil { + return err + } + return nil +} + +// GenerateUser 生成用户带外帐号 +func (worker *worker) GenerateUser(sett *oob.UserSettingItem) error { + var channel, userID int + user, err := worker.findUserByName(sett.Username) + if err != nil { + return err + } + if user == nil { // 目标用户不存在 + channel, err = worker.Channel() + if err != nil { + return err + } + + userID, err = worker.newUserID() + if err != nil { + return err + } + + // ipmitool user set name $userid "$_user" + if _, err = worker.Base.ExecByShell(tool, "user", "set", "name", strconv.Itoa(userID), fmt.Sprintf("%q", sett.Username)); err != nil { + return err + } + time.Sleep(500 * time.Millisecond) + + } else { // 目标用户已存在 + channel = user.Channel + userID = user.ID + } + + // ipmitool user set password $userid "$_pw" + if _, err = worker.Base.ExecByShell(tool, "user", "set", "password", strconv.Itoa(userID), fmt.Sprintf("%q", sett.Password)); err != nil { + return err + } + time.Sleep(500 * time.Millisecond) + + // ipmitool user enable $userid + if _, err = worker.Base.ExecByShell(tool, "user", "enable", strconv.Itoa(userID)); err != nil { + return err + } + time.Sleep(500 * time.Millisecond) + + // ipmitool user priv $userid $privilege_level $channel + var output []byte + if output, err = worker.Base.ExecByShell(tool, "user", "priv", strconv.Itoa(userID), strconv.Itoa(sett.PrivilegeLevel), strconv.Itoa(channel)); err != nil { + err = errors.New(string(output)) + return err + } + time.Sleep(500 * time.Millisecond) + + // ipmitool channel setaccess $channel $userid callin=on ipmi=on link=on privilege=$privilege_level + if _, err = worker.Base.ExecByShell(tool, "channel", "setaccess", strconv.Itoa(channel), strconv.Itoa(userID), "callin=on", "ipmi=on", "link=on", fmt.Sprintf("privilege=%d", sett.PrivilegeLevel)); err != nil { + // TODO 暂时性处理办法:去掉'link=on'后重试 + if _, err = worker.Base.ExecByShell(tool, "channel", "setaccess", strconv.Itoa(channel), strconv.Itoa(userID), "callin=on", "ipmi=on", fmt.Sprintf("privilege=%d", sett.PrivilegeLevel)); err != nil { + return err + } + return err + } + return nil +} + +// Users 返回OOB用户列表 +func (worker *worker) Users() ([]oob.User, error) { + channel, err := worker.Channel() + if err != nil { + return nil, err + } + + output, err := worker.Base.ExecByShell(tool, "user", "list", strconv.Itoa(channel)) + if err != nil { + return nil, err + } + + users, err := ParseUsers(output) + if err != nil { + return nil, err + } + + for i := range users { + users[i].Channel = channel + users[i].Access, _ = worker.userAccess(channel, users[i].ID) + if users[i].Access != nil { + users[i].Name = users[i].Access.UserName // 解析ipmitool user list $channel的输出可能无法得到正确的用户名 + } + } + return users, nil +} + +// BMCColdReset (冷)重启BMC +func (worker *worker) BMCColdReset() error { + _, _ = worker.Base.ExecByShell(tool, "mc", "reset", "cold") + return nil // 假设每次执行'ipmitool mc reset cold'都能达到预期效果,丢弃error。 +} + +// channel 返回channel。 +func (worker *worker) Channel() (int, error) { + // 试错法查找channel + for i := 0; i <= 10; i++ { + out, _ := worker.Base.ExecByShell(tool, "lan", "print", strconv.Itoa(i)) + if len(out) > 0 && !strings.Contains(string(out), "Invalid channel") { // 通过exit code判断并不能保证一定准确 + return i, nil + } + } + return 0, oob.ErrChannelNotFound +} + +// BMC 返回OOB的BMC信息 +func (worker *worker) BMC() (*oob.BMC, error) { + output, err := worker.Base.ExecByShell(tool, "mc", "info") + if err != nil { + return nil, err + } + + var bmc oob.BMC + scanner := bufio.NewScanner(bytes.NewReader(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if strings.HasPrefix(line, "Firmware Revision") { + bmc.FirmwareReversion = worker.extractValue(line, ":") + } else if strings.HasPrefix(line, "IPMI Version") { + bmc.IPMIVersion = worker.extractValue(line, ":") + } else if strings.HasPrefix(line, "Vendor ID") { + bmc.ManufacturerID = worker.extractValue(line, ":") + } else if strings.HasPrefix(line, "Vendor Name") { + bmc.ManufacturerName = worker.extractValue(line, ":") + } + } + return &bmc, nil +} + +// Network 返回OOB网络信息 +func (worker *worker) Network() (*oob.Network, error) { + channel, err := worker.Channel() + if err != nil { + return nil, err + } + + output, _ := worker.Base.ExecByShell(tool, "lan", "print", strconv.Itoa(channel)) // 舍弃error。因为部分机型下执行该命令,即使命令输出正确,exit code也会是一个非0值。 + + var network oob.Network + scanner := bufio.NewScanner(bytes.NewReader(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if strings.HasPrefix(line, "IP Address Source") { + network.IPSrc = worker.extractValue(line, ":") + } else if strings.HasPrefix(line, "IP Address") { + network.IP = worker.extractValue(line, ":") + } else if strings.HasPrefix(line, "Subnet Mask") { + network.Netmask = worker.extractValue(line, ":") + } else if strings.HasPrefix(line, "MAC Address") { + network.Mac = worker.extractValue(line, ":") + } else if strings.HasPrefix(line, "Default Gateway IP") { + network.Gateway = worker.extractValue(line, ":") + } + } + return &network, nil +} + +// PostCheck OOB配置实施后置检查 +func (worker *worker) PostCheck(sett *oob.Setting) (items []hardware.CheckingItem) { + if sett == nil { + return nil + } + if sett.Network != nil { + items = append(items, worker.checkNetwork(sett.Network)...) + } + if sett.User != nil { + items = append(items, worker.checkUser(sett.User)...) + } + return items +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/oob/ipmi/post_check.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/oob/ipmi/post_check.go new file mode 100644 index 0000000000000000000000000000000000000000..8beca3b61dc7de6056ea6a35f684e0a4178e3d06 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/oob/ipmi/post_check.go @@ -0,0 +1,84 @@ +package ipmi + +import ( + "fmt" + "strings" + + "idcos.io/cloudboot/hardware" + "idcos.io/cloudboot/hardware/oob" +) + +// checkNetwork 检查实际的OOB网络是否与预期的配置相符 +func (w *worker) checkNetwork(sett *oob.NetworkSetting) (items []hardware.CheckingItem) { + if sett == nil || sett.IPSrc == "" { + return nil + } + network, err := w.Network() + if err != nil { + return []hardware.CheckingItem{ + { + Title: "Network", + Matched: hardware.MatchedUnknown, + Error: err.Error(), + }, + } + } + + items = append(items, + *hardware.NewCheckingHelper("BootOSIP Source", sett.IPSrc, strings.ToLower(network.IPSrc)).Matcher(hardware.ContainsMatch).Do(), + ) + + if sett.IPSrc == oob.Static { + items = append(items, + *hardware.NewCheckingHelper("BootOSIP", sett.StaticIP.IP, network.IP).Do(), + *hardware.NewCheckingHelper("Netmask", sett.StaticIP.Netmask, network.Netmask).Do(), + *hardware.NewCheckingHelper("Gateway", sett.StaticIP.Gateway, network.Gateway).Do(), + ) + } + return items +} + +// checkUser 检查实际的OOB用户是否与预期配置相符 +func (w *worker) checkUser(sett *oob.UserSetting) (items []hardware.CheckingItem) { + if sett == nil { + return nil + } + users, err := w.Users() + if err != nil { + return []hardware.CheckingItem{ + { + Title: "Users", + Matched: hardware.MatchedUnknown, + Error: err.Error(), + }, + } + } + + for _, settUser := range []oob.UserSettingItem(*sett) { + item := hardware.CheckingItem{ + Title: "Create User", + Expected: fmt.Sprintf("%s@%s", settUser.Username, oob.StringUserLevel(settUser.PrivilegeLevel)), + Matched: hardware.MatchedNO, + } + idx := w.findUserIndexByName(users, settUser.Username) + // 检查目标用户是否存在 + if idx < 0 { + item.Actual = "Missing" + items = append(items, item) + continue + } + // 检查目标用户权限级别 + if users[idx].Access == nil || users[idx].Access.PrivilegeLevel < 0 { + item.Actual = fmt.Sprintf("%s@unknown", settUser.Username) + items = append(items, item) + continue + } + + item.Actual = fmt.Sprintf("%s@%s", users[idx].Name, oob.StringUserLevel(users[idx].Access.PrivilegeLevel)) + if item.Actual == item.Expected { + item.Matched = hardware.MatchedYES + } + items = append(items, item) + } + return items +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/oob/oob.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/oob/oob.go new file mode 100644 index 0000000000000000000000000000000000000000..b7aad1104f76314f8d740be06ecdafa3fcfcd7f9 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/oob/oob.go @@ -0,0 +1,120 @@ +package oob + +import ( + "errors" + + "idcos.io/cloudboot/hardware" + "idcos.io/cloudboot/logger" +) + +const ( + // DefaultWorker 默认处理器名称 + DefaultWorker = "IPMI" +) + +const ( + // DHCP IP来源-DHCP + DHCP = "dhcp" + // Static IP来源-静态IP + Static = "static" +) + +var ( + // ErrChannelNotFound impi channel未发现 + ErrChannelNotFound = errors.New("channel not found") + // ErrUnknownHardware 未知的OOB硬件类型 + ErrUnknownHardware = errors.New("unknown OOB hardware") +) + +// Worker OOB处理器 +type Worker interface { + NetworkWorker + UserWorker + BMCWorker + + // SetDebug 设置是否开启debug。若开启debug,会将关键日志信息写入console。 + SetDebug(debug bool) + // SetLog 更换日志实现。默认情况下内部无日志实现。 + SetLog(log logger.Logger) + // Channel 返回impi channel + Channel() (int, error) + // PostCheck OOB配置实施后置检查 + PostCheck(sett *Setting) []hardware.CheckingItem +} + +// BMC OOB的BMC信息 +type BMC struct { + FirmwareReversion string + IPMIVersion string + ManufacturerID string + ManufacturerName string +} + +// Access OOB channel access +type Access struct { + Channel int + MaxUserIDs int + EnabledUserIDs int + Accesses []UserAccess +} + +// UserAccess OOB用户Access +type UserAccess struct { + UserID int + UserName string + FixedName string + AccessAvailable string + LinkAuthentication string + IPMIMessaging string + PrivilegeLevel int +} + +// Network OOB网络信息 +type Network struct { + IPSrc string // 可选值: static|dhcp + Mac string // IP对应Mac地址 + IP string // BootOSIP + Netmask string // 子网掩码 + Gateway string // 默认网关 +} + +// NetworkWorker OOB网络模块处理器 +type NetworkWorker interface { + // SetDHCP 设置IP来源是DHCP + SetDHCP() error + // SetStaticIP 设置IP来源是静态IP + SetStaticIP(ip, netmask, gateway string) error + // Network 返回OOB网络信息 + Network() (*Network, error) +} + +// User OOB用户信息 +type User struct { + Channel int + ID int + Name string + Access *UserAccess +} + +// UserWorker OOB用户模块处理器 +type UserWorker interface { + // GenerateUser 生成用户帐号。 + // 若用户(以用户名为准)未存在,则新增帐号。 + // 若用户已经存在则修改用户密码、权限级别等属性。 + GenerateUser(sett *UserSettingItem) error + // Users 返回OOB用户列表 + Users() ([]User, error) +} + +// BMCWorker BMC模块处理器 +type BMCWorker interface { + // BMC 返回OOB的BMC信息 + BMC() (*BMC, error) + // BMCColdReset (冷)重启BMC + BMCColdReset() error +} + +// Whoami 返回当前的BIOS固件对应的处理器名 +func Whoami() (worker string, err error) { + return DefaultWorker, nil // 暂时只有一个实现 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/oob/register.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/oob/register.go new file mode 100644 index 0000000000000000000000000000000000000000..2fc44af0861ae96257958f5ed8669e1d4e7468d3 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/oob/register.go @@ -0,0 +1,49 @@ +package oob + +import ( + "strings" + "sync" +) + +// workerPool 处理器池 +var workerPool = make(map[string]Worker) +var mux sync.Mutex + +// Register 注册oob及其处理worker实例 +func Register(name string, worker Worker) { + mux.Lock() + defer mux.Unlock() + if worker == nil { + panic("oob: Register worker is nil") + } + name = strings.ToUpper(name) + if _, dup := workerPool[name]; dup { + panic("oob: Register called twice for worker " + name) + } + workerPool[name] = worker +} + +// Registered 返回已注册的oob名称 +func Registered() (items []string) { + mux.Lock() + defer mux.Unlock() + + for key := range workerPool { + items = append(items, key) + } + return items +} + +// SelectWorker 根据oob名称获取相应的Worker +func SelectWorker(name string) Worker { + mux.Lock() + defer mux.Unlock() + + name = strings.ToUpper(name) + for key := range workerPool { + if key == name { + return workerPool[key] + } + } + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/oob/setting.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/oob/setting.go new file mode 100644 index 0000000000000000000000000000000000000000..c4e4ca4942f1509388aedb9f578392bdf86a56d0 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/oob/setting.go @@ -0,0 +1,88 @@ +package oob + +import "strings" + +const ( + // NoAccessLevel 带外用户权限级别-未知 + NoAccessLevel = 0 + // CallbackLevel 带外用户权限级别-callback + CallbackLevel = 1 + // UserLevel 带外用户权限级别-user + UserLevel = 2 + // OperatorLevel 带外用户权限级别-operator + OperatorLevel = 3 + // AdministratorLevel 带外用户权限级别-administrator + AdministratorLevel = 4 + // OEMProprietaryLevel 带外用户权限级别-OEM + OEMProprietaryLevel = 5 +) + +// StringUserLevel 返回用户级别的字符串标识符 +func StringUserLevel(l int) string { + switch l { + case NoAccessLevel: + return "NoAccessLevel" + case CallbackLevel: + return "CallbackLevel" + case UserLevel: + return "UserLevel" + case OperatorLevel: + return "OperatorLevel" + case AdministratorLevel: + return "AdministratorLevel" + case OEMProprietaryLevel: + return "OEMProprietaryLevel" + } + panic("unsupported level") +} + +// IntUserLevel 根据字符串返回整数类型的权限级别 +func IntUserLevel(s string) int { + s = strings.ToLower(s) + if strings.HasPrefix(s, "no access") { + return NoAccessLevel + } else if strings.HasPrefix(s, "callback") { + return CallbackLevel + } else if strings.HasPrefix(s, "user") { + return UserLevel + } else if strings.HasPrefix(s, "operator") { + return OperatorLevel + } else if strings.HasPrefix(s, "admin") { + return AdministratorLevel + } else if strings.HasPrefix(s, "oem") { + return OEMProprietaryLevel + } + return -1 +} + +// Setting OOB配置参数 +type Setting struct { + Network *NetworkSetting `json:"network"` + User *UserSetting `json:"user"` + BMC *BMCSetting `json:"bmc"` +} + +// NetworkSetting OOB配置参数-网络 +type NetworkSetting struct { + IPSrc string `json:"ip_src"` // IP来源。可选值: static|dhcp + StaticIP struct { + IP string `json:"ip,omitempty"` + Netmask string `json:"netmask,omitempty"` + Gateway string `json:"gateway,omitempty"` + } `json:"static_ip,omitempty"` +} + +// UserSetting OOB配置参数-用户 +type UserSetting []UserSettingItem + +// UserSettingItem 带外用户信息 +type UserSettingItem struct { + Username string `json:"username"` + Password string `json:"password"` + PrivilegeLevel int `json:"privilege_level"` +} + +// BMCSetting OOB配置参数-电源 +type BMCSetting struct { + ColdRest string `json:"cold_reset,omitempty"` // BMC冷启动。可选值: ON|OFF +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/adaptecsmartraid/adaptec_smartraid.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/adaptecsmartraid/adaptec_smartraid.go new file mode 100644 index 0000000000000000000000000000000000000000..9d3b6dd01899e1462a98836c619cc2c0e5a9ad72 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/adaptecsmartraid/adaptec_smartraid.go @@ -0,0 +1,428 @@ +package adaptecsmartraid + +import ( + "bufio" + "bytes" + "fmt" + "strings" + + "idcos.io/cloudboot/hardware" + "idcos.io/cloudboot/hardware/raid" + "idcos.io/cloudboot/utils/collection" +) + +const ( + // eqSeparator 等号分隔符 + eqSeparator = "=" + // colonSeparator 冒号分隔符 + colonSeparator = ":" + // commaSeparator 逗号分隔符 + commaSeparator = "," +) + +// extractValue 截取kv对中v的内容。假设,kv内容为"name : voidint",那么将返回"voidint"。 +func (worker *worker) extractValue(kv, sep string) (value string) { + if !strings.Contains(kv, sep) { + return kv + } + return strings.TrimSpace(strings.SplitN(kv, sep, 2)[1]) +} + +const ( + // RAID模式仅发送LD至OS + modeRAID = "3" + // Mixed模式发送PD\LD至OS + modeMIXED = "5" +) + +// switchControllerMode +func (worker *worker) switchControllerMode(ctrlID, modeSet string) (err error) { + _, err = worker.Base.ExecByShell(tool, "setcontrollermode", ctrlID, modeSet, "noprompt") + return nil //已设置为RAID模式时,command aborted. +} + +// validateLevel 校验RAID级别 +func (worker *worker) validateLevel(level raid.Level) error { + if level != raid.RAID0 && level != raid.RAID1 && level != raid.RAID10 && + level != raid.RAID5 && level != raid.RAID50 && level != raid.RAID6 && level != raid.RAID60 { + return raid.ErrUnsupportedLevel + } + return nil +} + + +// controllerIDs 返回当前设备所有RAID卡的ID列表 +func (worker *worker) controllerIDs() (items []string, err error) { + // arcconf list + output, err := worker.Base.ExecByShell(tool, "list") + if err != nil { + return nil, err + } + + scanner := bufio.NewScanner(bytes.NewBuffer(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" { + continue + } + if strings.Contains(line, "Controller") && strings.Contains(line, "Optimal") && strings.Contains(line, "Slot"){ + fields := strings.Fields(line) + // Controller 1: + if strings.Contains(fields[0], "Controller") { + ctlid := strings.TrimRight(fields[1], colonSeparator) + items = append(items, ctlid) + } + } + } + return items, scanner.Err() +} + +// findController 返回指定编号的Controller +func (worker *worker) findController(ctrlID string) (*raid.Controller, error) { + // arcconf getconfig 1 AD 获取整个适配器信息 + output, err := worker.Base.ExecByShell(tool, "getconfig", fmt.Sprintf("%s", ctrlID), "AD") + if err != nil { + return nil, err + } + + ctl := raid.Controller{ + ID: ctrlID, + } + scanner := bufio.NewScanner(bytes.NewBuffer(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" { + continue + } + if strings.HasPrefix(line, "Firmware") && strings.Contains(line, colonSeparator) { + ctl.FirmwareVersion = worker.extractValue(line, colonSeparator) + break + } + } + ctl.ModelName, _ = worker.findModelName(ctrlID) + return &ctl, scanner.Err() +} + +// findModelName 查询指定RAID卡控制器的型号 +func (worker *worker) findModelName(ctrlID string) (string, error) { + // arcconf getconfig 1 AD + output, err := worker.Base.ExecByShell(tool, "getconfig", fmt.Sprintf("%s", ctrlID), "AD") + if err != nil { + return "", err + } + scanner := bufio.NewScanner(bytes.NewBuffer(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" { + continue + } + if strings.HasPrefix(line, "Controller Model") && strings.Contains(line, colonSeparator) { + return worker.extractValue(line, colonSeparator), nil + } + } + return "", scanner.Err() +} + +// drivesEq 对比两个驱动器列表是否相等(顺序无关) +func (worker *worker) drivesEq(drives0, drives1 []string) bool { + if len(drives0) != len(drives1) { + return false + } + for i := range drives0 { + if !collection.InSlice(drives0[i], drives1) { + return false + } + } + return true +} + +// physicalDrive 物理驱动器 +type physicalDrive struct { + PhysicalID string // Channel Device + State string + SizeMB string // MB + Type string // SSD +} + +// findPhysicalDriveIDByIndex 通过切片索引查找物理驱动器ID +func findPhysicalDriveIDByIndex(items []physicalDrive, index int) (id string, err error) { + if index < 0 || index > len(items)-1 { + return "", raid.ErrInvalidDiskIdentity + } + return items[index].PhysicalID, nil +} + +// findPhysicalDriveIDsByIndexes 通过切片索引列表查找物理驱动器ID +func findPhysicalDriveIDsByIndexes(items []physicalDrive, indexes ...int) (ids []string, err error) { + if len(indexes) <= 0 { + for i := range items { + ids = append(ids, items[i].PhysicalID) + } + return ids, nil + } + ids = make([]string, 0, len(indexes)) + for i := range indexes { + id, err := findPhysicalDriveIDByIndex(items, indexes[i]) + if err != nil { + return nil, err + } + ids = append(ids, id) + } + return ids, nil +} + +// physicalDriveIDs 根据入参的物理驱动器,返回由物理驱动器ID(Enclosure:Bay)组成的字符串切片。 +func physicalDriveIDs(items []physicalDrive) (ids []string) { + ids = make([]string, 0, len(items)) + for i := range items { + ids = append(ids, items[i].PhysicalID) + } + return ids +} + +type pdScanFunc func(item *physicalDrive) bool + +// scanPDs 逐个扫描物理驱动器列表并返回满足所有过滤条件的物理驱动器 +//func scanPDs(pds []physicalDrive, filters ...pdScanFunc) (items []physicalDrive) { +// for i := range pds { +// var unmatched bool +// for j := range filters { +// if !filters[j](&pds[i]) { +// unmatched = true +// break +// } +// } +// if !unmatched { +// items = append(items, pds[i]) +// } +// } +// return items +//} + +// sparePDs 若当前物理驱动器是用于热备,则返回true,反之返回false。 +//func sparePDs(pd *physicalDrive) bool { +// return pd != nil && strings.Contains(pd.State, "GHS") +//} + +// parsePDs 解析内容中包含的物理驱动器列表 +func parsePDs(output []byte) (list []physicalDrive, err error) { + var started bool + var hd physicalDrive + scanner := bufio.NewScanner(bytes.NewBuffer(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if strings.Contains(line, "Physical") && strings.Contains(line, "ID") { + started = true + continue + } + if !started || line == "" { + continue + } + if strings.Contains(line, "Physical") && strings.Contains(line, "Enclosure") && strings.Contains(line, "Slot") { + fields := strings.Fields(line) + if len(fields) > 11 { + hd.PhysicalID = strings.ReplaceAll(fields[1], commaSeparator, " ") // 0,8 (Channel,Device) -> 0 8 + hd.State = fields[3] //Ready + hd.SizeMB = strings.TrimRight(fields[7], commaSeparator) // 1000MB + switch fields[10] { + case "Hard": + hd.Type = "Hard Drive" + case "Solid": + hd.Type = "Solid State Drive" + default: + hd.Type = "Unknown" + } + list = append(list, hd) + } + } + } + return +} + +// physicalDrives 返回指定controller下的物理驱动器列表 +func (worker *worker) physicalDrives(ctrlID string) (items []physicalDrive, err error) { + //arcconf list 1 + output, err := worker.Base.ExecByShell(tool, "list", fmt.Sprintf("%s", ctrlID)) + if err != nil { + return nil, err + } + return parsePDs(output) +} + +// logicalDrive 逻辑驱动器(阵列) +type logicalDrive struct { + ID string + Name string + Type string //RAID0 + State string + Size string + PhysicalDrives []physicalDrive // 逻辑驱动器底层所依赖的物理驱动器 +} + +type ldScanFunc func(item *logicalDrive) bool + +// scanLDs 逐个扫描逻辑驱动器列表并返回满足所有过滤条件的逻辑驱动器 +func scanLDs(lds []logicalDrive, filters ...ldScanFunc) (items []logicalDrive) { + for i := range lds { + var unmatched bool + for j := range filters { + if !filters[j](&lds[i]) { + unmatched = true + break + } + } + if !unmatched { + items = append(items, lds[i]) + } + } + return items +} + +// logicalDrives 返回指定controller下的LD列表 +func (worker *worker) logicalDrives(ctrlID string) (items []logicalDrive, err error) { + // arcconf getconfig 1 LD + output, err := worker.Base.ExecByShell(tool, "getconfig", ctrlID, "LD") + if err != nil { + return nil, err + } + var ld logicalDrive + scanner := bufio.NewScanner(bytes.NewBuffer(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" { + continue + } + if strings.Contains(line, "Logical Device number") { + if ld.ID != "" { + items = append(items, ld) + } + ld = logicalDrive{} + ld.ID = strings.TrimRight(line, "\n") + continue + } + if strings.Contains(line, "Disk Name") && strings.Contains(line, colonSeparator){ + ld.Name = worker.extractValue(line, eqSeparator) // 形如 /dev/sda + } else if strings.HasPrefix(line, "RAID level") && strings.Contains(line, colonSeparator){ + ld.Type = "RAID" + worker.extractValue(line, eqSeparator) // 形如 0、1、5、50 + } else if strings.Contains(line, "Status of Logical Device") && strings.Contains(line, colonSeparator){ + ld.State = worker.extractValue(line, eqSeparator) // 形如 Optimal + } else if strings.HasPrefix(line, "Size") && strings.Contains(line, colonSeparator){ + ld.Size = worker.extractValue(line, eqSeparator) // 形如 300 MB + } else if strings.Contains(line, "Enclosure") { + fields := strings.Fields(line) + pd := physicalDrive { + PhysicalID: "0 " + fields[1], + State: "Online", + SizeMB: strings.TrimRight(strings.TrimPrefix(fields[4], "("), ","), + Type: strings.TrimRight(fields[6], ","), + } + ld.PhysicalDrives = append(ld.PhysicalDrives, pd) + } + } + + return items, nil +} + +// checkArrays 检查实际的RAID阵列是否与预期配置一致 +func (worker *worker) checkArrays(ctrlID string, arraySetts []raid.ArraySetting) (items []hardware.CheckingItem) { + if ctrlID == "" || len(arraySetts) == 0 { + return nil + } + for i := range arraySetts { + if item := worker.checkArray(ctrlID, &arraySetts[i]); item != nil { + items = append(items, *item) + } + } + return items +} + +// checkArray 检查指定的单个RAID阵列配置与实际是否一致 +func (worker *worker) checkArray(ctrlID string, sett *raid.ArraySetting) *hardware.CheckingItem { + if sett == nil || (sett.Drives == "" && sett.Level == "") { + return nil + } + item := hardware.CheckingItem{ + Title: fmt.Sprintf("[Controller%s] 创建阵列", ctrlID), + Expected: fmt.Sprintf("%s@%s", strings.ToUpper(sett.Level), sett.Drives), + Matched: hardware.MatchedUnknown, + } + + level, err := raid.SelectLevel(sett.Level) + if err != nil { + item.Error = err.Error() + return &item + } + + // 获取该RAID卡下已有的阵列列表 + allLDs, err := worker.logicalDrives(ctrlID) + if err != nil { + item.Error = err.Error() + return &item + } + + // 过滤获得指定级别的阵列列表 + lds := scanLDs(allLDs, func(item *logicalDrive) bool { + return item != nil && strings.ToLower(item.Type) == strings.ToLower(string(level)) + }) + + if len(lds) <= 0 { + // 不存在与预期级别相同的阵列 + item.Matched = hardware.MatchedNO + item.Actual = fmt.Sprintf("缺失%s", strings.ToUpper(sett.Level)) + return &item + } + + // 预期的物理驱动器列表 + drives := strings.Split(sett.Drives, raid.Sep) + + var pds4ld []string + // 遍历该RAID级别的阵列,查找是否存在一个阵列所使用的物理驱动器与预期物理驱动器一致。 + for i := range lds { + // 当前阵列实际所使用的物理驱动器列表 + pdids := physicalDriveIDs(lds[i].PhysicalDrives) + pds4ld = append(pds4ld, strings.Join(pdids, raid.Sep)) + + // 比较实际使用的物理驱动器列表与预期物理驱动器列表是否一致 + if worker.drivesEq(pdids, drives) { + item.Actual = fmt.Sprintf("%s@%s", strings.ToUpper(sett.Level), sett.Drives) + item.Matched = hardware.MatchedYES + return &item + } + } + item.Actual = fmt.Sprintf("%s@%s", strings.ToUpper(sett.Level), strings.Join(pds4ld, "|")) + item.Matched = hardware.MatchedNO + return &item +} + +// checkGlobalHotSpares 检查单个RAID卡控制器的实际全局热备盘设置是否与预期配置一致 +//func (worker *worker) checkGlobalHotSpares(ctrlID string, sett *raid.ControllerSetting) *hardware.CheckingItem { +// if sett == nil || sett.Hotspares == "" { +// return nil +// } +// item := hardware.CheckingItem{ +// Title: fmt.Sprintf("[Controller%s] 设置全局热备盘", ctrlID), +// Expected: sett.Hotspares, +// Matched: hardware.MatchedUnknown, +// } +// +// pds, err := worker.physicalDrives(ctrlID) +// if err != nil { +// item.Error = err.Error() +// return &item +// } +// +// // 扫描查找所有已经分配作为热备的物理驱动器 +// sparePDs := scanPDs(pds, sparePDs) +// item.Actual = strings.Join(physicalDriveIDs(sparePDs), raid.Sep) +// +// // 预期的用于备份的物理驱动器列表 +// spares := strings.Split(sett.Hotspares, raid.Sep) +// +// // 对比实际与预期的热备盘列表是否一致 +// if worker.drivesEq(physicalDriveIDs(sparePDs), spares) { +// item.Matched = hardware.MatchedYES +// } else { +// item.Matched = hardware.MatchedNO +// } +// return &item +//} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/adaptecsmartraid/raid.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/adaptecsmartraid/raid.go new file mode 100644 index 0000000000000000000000000000000000000000..3f55a02276122e824164f73e90ee18ee7b1549ae --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/adaptecsmartraid/raid.go @@ -0,0 +1,271 @@ +package adaptecsmartraid + +import ( + "fmt" + "regexp" + "strconv" + "strings" + "sync" + + "idcos.io/cloudboot/hardware" + "idcos.io/cloudboot/hardware/raid" + "idcos.io/cloudboot/logger" +) + +const ( + // name RAID处理器名称 + name = raid.AdaptecSmartRAID + // tool 硬件配置工具 + tool = "/usr/sbin/arcconf" +) + +func init() { + raid.Register(name, new(worker)) +} + +type worker struct { + hardware.Base + mux sync.Mutex +} + +// SetDebug 设置是否开启debug。若开启debug,会将关键日志信息写入console。 +func (worker *worker) SetDebug(debug bool) { + worker.Base.SetDebug(debug) +} + +// SetLog 更换日志实现。默认情况下内部无日志实现。 +func (worker *worker) SetLog(log logger.Logger) { + worker.mux.Lock() + defer worker.mux.Unlock() + + worker.Base.SetLog(log) +} + +// Convert2ControllerID RAID卡控制器索引号转换成RAID卡控制器ID。 +// ctrlIndex RAID卡控制器索引号。0表示首块RAID卡,1表示第二块RAID卡,以此类推。 +// 如'HP SmartArray' RAID卡,若索引号为'0',那么可能转换获得的RAID卡控制器ID为'1',原因是这款RAID卡ID是从'1'开始的。 +// 如'LSI SAS3' RAID卡,若索引号为'0',那么可能转换获得的RAID卡控制器ID依然为'0',原因是这款RAID卡ID就是从'0'开始的。 +func (worker *worker) Convert2ControllerID(ctrlIndex uint) (ctrlID string, err error) { + ids, err := worker.controllerIDs() + if err != nil { + return "", err + } + if int(ctrlIndex) > len(ids)-1 { + return "", raid.ErrControllerNotFound + } + return ids[ctrlIndex], nil +} + +// Controllers 返回设备的RAID卡列表 +func (worker *worker) Controllers() (ctrls []raid.Controller, err error) { + ids, err := worker.controllerIDs() + if err != nil { + return nil, err + } + + for i := range ids { + ctrl, err := worker.findController(ids[i]) + if err != nil { + return nil, err + } + ctrls = append(ctrls, *ctrl) + } + return ctrls, nil +} + +// Clear 擦除raid +func (worker *worker) Clear(ctrlID string) (err error) { + // arcconf delete 1 logicaldrive all noprompt + _, err = worker.Base.ExecByShell(tool, "delete", ctrlID, "logicaldrive", "all", "noprompt") + worker.Base.Sleep() + return nil // 当不存在任何LD时,command aborted,属于err,故不作异常处理 +} + +// InitLogicalDrives 初始化指定RAID卡控制器下的逻辑驱动器(逻辑磁盘)。 +func (worker *worker) InitLogicalDrives(ctrlID string) error { + // archonf create时默认自动格式化drvie,此处仅设置启用write cache + // arcconf setcache 1 drivewritecachepolicy Configured 1 + // 将state=Configured的硬盘Enable Write Cache功能 + _, _ = worker.Base.ExecByShell(tool, "setcache", ctrlID, "drivewritecachepolicy", "Configured", "1") + worker.Base.Sleep() + return nil // when already set, command aborted,属于err,故不作异常处理 +} + +// PhysicalDrives 返回物理驱动器(物理磁盘)列表。 +func (worker *worker) PhysicalDrives(ctrlID string) (pds []raid.PhysicalDrive, err error) { + items, err := worker.physicalDrives(ctrlID) + if err != nil { + return nil, err + } + for i := range items { + pds = append(pds, raid.PhysicalDrive{ + ID: worker.extractValue(items[i].PhysicalID, commaSeparator), + Name: items[i].PhysicalID, + RawSize: items[i].SizeMB, + MediaType: items[i].Type, + ControllerID: ctrlID, + }) + } + return pds, nil +} + +// TranslateLegacyDisks 将目标RAID卡控制器下传统"1|2,3|4-6|7-|all"形式的硬盘标识符转换成实际的物理驱动器。 +func (worker *worker) TranslateLegacyDisks(ctrlID string, legacyDisks string) (drives []string, err error) { + pds, err := worker.physicalDrives(ctrlID) + if err != nil { + return nil, err + } + if regexp.MustCompile("^[[:digit:]]+$").MatchString(legacyDisks) { + diskNo, _ := strconv.Atoi(legacyDisks) + return findPhysicalDriveIDsByIndexes(pds, diskNo-1) + + } else if regexp.MustCompile("^[[:digit:],]+$").MatchString(legacyDisks) { + diskNos := strings.Split(legacyDisks, ",") + indexes := make([]int, 0, len(diskNos)) + + for _, fields := range diskNos { + diskNo, _ := strconv.Atoi(fields) + indexes = append(indexes, diskNo-1) + } + return findPhysicalDriveIDsByIndexes(pds, indexes...) + + } else if regexp.MustCompile("^[[:digit:]-]+[[:digit:]]$").MatchString(legacyDisks) { + arr := strings.Split(legacyDisks, "-") + if len(arr) != 2 { + return nil, raid.ErrInvalidDiskIdentity + } + begin, _ := strconv.Atoi(arr[0]) + end, _ := strconv.Atoi(arr[1]) + if begin >= end { + return nil, raid.ErrInvalidDiskIdentity + } + if begin > len(pds) || end > len(pds) { + return nil, raid.ErrInvalidDiskIdentity + } + var indexes []int + for diskNo := begin; diskNo <= end; diskNo++ { + indexes = append(indexes, diskNo-1) + } + return findPhysicalDriveIDsByIndexes(pds, indexes...) + + } else if regexp.MustCompile("^[[:digit:]]+-$").MatchString(legacyDisks) { + arr := strings.Split(legacyDisks, "-") + begin, _ := strconv.Atoi(arr[0]) + if begin > len(pds) { + return nil, raid.ErrInvalidDiskIdentity + } + var indexes []int + for diskNo := begin; diskNo <= len(pds); diskNo++ { + indexes = append(indexes, diskNo-1) + } + return findPhysicalDriveIDsByIndexes(pds, indexes...) + + } else if legacyDisks == "all" { + return findPhysicalDriveIDsByIndexes(pds) + } + return nil, raid.ErrInvalidDiskIdentity +} + +// CreateArray 用指定的物理磁盘和RAID级别创建阵列(逻辑磁盘) +func (worker *worker) CreateArray(ctrlID string, level raid.Level, drives []string) (err error) { + if err = worker.validateLevel(level); err != nil { + return err + } + + // 设置整个RAID卡控制器的模式(开启RAID模式) + // 当前已是RAID模式时,arcconf命令返回command aborted,属于err,故不作判断 + _ = worker.switchControllerMode(ctrlID, modeRAID) + + _, _ = worker.Base.ExecByShell(tool, "list", ctrlID) + + if level == raid.RAID0 { + // arcconf create 1 logicaldrive method default ldcache lon max raidlevel physical_id + _, err = worker.Base.ExecByShell(tool, "create", ctrlID, "logicaldrive", + "method", + "default", + "ldcache", + "lon", + "max", // size + "0", //raidlevel + fmt.Sprintf("%s", strings.Join(drives, " ")), + "noprompt", + ) + } else if level == raid.RAID1 { + _, err = worker.Base.ExecByShell(tool, "create", ctrlID, "logicaldrive", + "method", + "default", + "ldcache", + "lon", + "max", // size + "1", //raidlevel + fmt.Sprintf("%s", strings.Join(drives, " ")), + "noprompt", + ) + } else { + err = fmt.Errorf("RAID LEVEL %s Not Supported yet.", level) + } + worker.Base.Sleep() + _, _ = worker.Base.ExecByShell(tool, "list", ctrlID) + _, _ = worker.Base.ExecByShell(tool, "getconfig", ctrlID, "LD") + return err +} + +// SetGlobalHotspares 添加热备盘 +func (worker *worker) SetGlobalHotspares(ctrlID string, drives []string) (err error) { + // arcconf /cx[/ex]/sx add hotsparedrive [{dgs=<n|0,1,2...>}] [enclaffinity][nonrevertible] + for i := range drives { + if _, err = worker.Base.ExecByShell(tool, "setstate", ctrlID, "device", drives[i], "hsp", "sparetype", "2", "noprompt"); err != nil { + return err + } + } + worker.Base.Sleep() + return nil +} + +// SetJBODs 将指定RAID卡控制器设置为直通模式,或者将RAID卡控制器下部分物理驱动器设置为直通模式。 +// ctrlID 表示RAID卡控制器ID,通过Convert2ControllerID方法可获取到第N块RAID卡的控制器ID。 +// drives 物理驱动器列表。若物理驱动器列表为空,则意味着将指定的RAID卡下所有的物理驱动器都设置为直通模式。 +func (worker *worker) SetJBODs(ctrlID string, drives []string) (err error) { + defer worker.Base.Sleep() + + if len(drives) <= 0 { + // 为整个RAID卡控制器下的物理驱动器开启直通模式 + if err = worker.switchControllerMode(ctrlID, modeMIXED); err != nil { + return err + } + } + // 为指定RAID卡控制器下的部分物理驱动器开启直通模式 + // arcconf /cx[/ex]/sx set jbod + //for i := range drives { + // if _, err = worker.Base.ExecByShell(tool, worker.genPDIdentity(ctrlID, drives[i]), "set", "jbod"); err != nil { + // return err + // } + //} + return nil +} + +// PostCheck RAID配置实施后置检查 +func (worker *worker) PostCheck(sett *raid.Setting) (items []hardware.CheckingItem) { + for i := range sett.Controllers { + ctrlID, err := worker.Convert2ControllerID(sett.Controllers[i].Index) + if err != nil { + items = append(items, hardware.CheckingItem{ + Title: "获取RAID卡控制器ID", + Matched: hardware.MatchedUnknown, + Error: err.Error(), + }) + continue + } + items = append(items, worker.checkArrays(ctrlID, sett.Controllers[i].Arrays)...) + + //if item := worker.checkGlobalHotSpares(ctrlID, &sett.Controllers[i]); item != nil { + // items = append(items, *item) + //} + } + return items +} + +// 返回 worker 所使用的cmdline +func (worker *worker) GetCMDLine() string { + return tool +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/avagomegaraid/avago_megaraid.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/avagomegaraid/avago_megaraid.go new file mode 100644 index 0000000000000000000000000000000000000000..6318db498632ea86f06210ac5c6e5f6da2667b08 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/avagomegaraid/avago_megaraid.go @@ -0,0 +1,466 @@ +package avagomegaraid + +import ( + "bufio" + "bytes" + "encoding/json" + "fmt" + "regexp" + "strings" + + "github.com/tidwall/gjson" + "idcos.io/cloudboot/hardware" + "idcos.io/cloudboot/hardware/raid" + "idcos.io/cloudboot/utils/collection" +) + +const ( + // eqSeparator 等号分隔符 + eqSeparator = "=" + // colonSeparator 冒号分隔符 + colonSeparator = ":" +) + +// extractValue 截取kv对中v的内容。假设,kv内容为"name : voidint",那么将返回"voidint"。 +func (worker *worker) extractValue(kv, sep string) (value string) { + if !strings.Contains(kv, sep) { + return kv + } + return strings.TrimSpace(strings.SplitN(kv, sep, 2)[1]) +} + +// genPDIdentity 返回形如'/cx/ex/sx'或者'/cx/sx'的硬盘标识 +func (worker *worker) genPDIdentity(ctrlID, esid string) string { + if strings.Contains(esid, colonSeparator) { + fields := strings.SplitN(esid, colonSeparator, 2) + return fmt.Sprintf("/c%s/e%s/s%s", ctrlID, fields[0], fields[1]) + } + return fmt.Sprintf("/c%s/s%s", ctrlID, esid) +} + +const ( + // disableJBOD 关闭JBOD模式 + disableJBOD = "off" + // enableJBOD 开启JBOD模式 + enableJBOD = "on" +) + +// switchJBODMode 打开或者关闭目标RAID卡下物理硬盘的JBOD模式。 +// enable为true,开启JBOD模式。 +// enable为false,关闭JBOD模式。 +func (worker *worker) switchJBODMode(ctrlID string, enable bool) (err error) { + v := enableJBOD + if !enable { + v = disableJBOD + } + _, err = worker.ExecByShell(tool, fmt.Sprintf("/c%s", ctrlID), "set", fmt.Sprintf("jbod=%s", v), "force") + + return err +} + +// 校验是否支持 JBOD模式 +func (worker *worker) checkSupportJBOD(ctrlID string) (isSupport bool, err error) { + output, err := worker.ExecByShell(tool, fmt.Sprintf("/c%s", ctrlID), "show", "all", "|", "grep", "'Support JBOD ='") + if err != nil { + return false, err + } + + scanner := bufio.NewScanner(bytes.NewBuffer(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + + if strings.Contains(line, "=Yes") { + isSupport = true + } else { + isSupport = false + } + } + return isSupport, scanner.Err() +} + + +// validateLevel 校验RAID级别 +func (worker *worker) validateLevel(level raid.Level) error { + if level != raid.RAID0 && level != raid.RAID1 && level != raid.RAID10 && + level != raid.RAID5 && level != raid.RAID50 && level != raid.RAID6 && level != raid.RAID60 { + return raid.ErrUnsupportedLevel + } + return nil +} + +var numReg = regexp.MustCompile(`\d+`) + +// controllerIDs 返回当前设备所有RAID卡的ID列表 +func (worker *worker) controllerIDs() (items []string, err error) { + // storcli64 show + output, err := worker.ExecByShell(tool, "show") + if err != nil { + return nil, err + } + + var started bool + scanner := bufio.NewScanner(bytes.NewBuffer(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + + if strings.Contains(line, "Ctl") && strings.Contains(line, "Model") && strings.Contains(line, "Ports") { + started = true + continue + } + if !started || line == "" { + continue + } + + fields := strings.Fields(line) + if !numReg.MatchString(fields[0]) { + continue + } + items = append(items, fields[0]) + } + return items, scanner.Err() +} + +// findController 返回指定编号的Controller +func (worker *worker) findController(ctrlID string) (*raid.Controller, error) { + // storcli64 /c0 show + output, err := worker.Base.ExecByShell(tool, fmt.Sprintf("/c%s", ctrlID), "show") + if err != nil { + return nil, err + } + + ctl := raid.Controller{ + ID: ctrlID, + } + scanner := bufio.NewScanner(bytes.NewBuffer(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" { + continue + } + if strings.HasPrefix(line, "FW Version") && strings.Contains(line, eqSeparator) { + ctl.FirmwareVersion = worker.extractValue(line, eqSeparator) + break + } + } + ctl.ModelName, _ = worker.findModelName(ctrlID) + return &ctl, scanner.Err() +} + +// findModelName 查询指定RAID卡控制器的型号 +func (worker *worker) findModelName(ctrlID string) (string, error) { + // storcli64 show + output, err := worker.ExecByShell(tool, "show") + if err != nil { + return "", err + } + + var started bool + scanner := bufio.NewScanner(bytes.NewBuffer(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + + if strings.Contains(line, "Ctl") && strings.Contains(line, "Model") && strings.Contains(line, "Ports") { + started = true + continue + } + if !started || line == "" { + continue + } + + fields := strings.Fields(line) + if len(fields) < 2 || fields[0] != ctrlID { + continue + } + return fields[1], nil + } + return "", scanner.Err() +} + +// drivesEq 对比两个驱动器列表是否相等(顺序无关) +func (worker *worker) drivesEq(drives0, drives1 []string) bool { + if len(drives0) != len(drives1) { + return false + } + for i := range drives0 { + if !collection.InSlice(drives0[i], drives1) { + return false + } + } + return true +} + +// physicalDrive 物理驱动器 +type physicalDrive struct { + ESID string `json:"EID:Slt"` + State string `json:"State"` + Size string `json:"Size"` + Med string `json:"Med"` +} + +// findPhysicalDriveIDByIndex 通过切片索引查找物理驱动器ID +func findPhysicalDriveIDByIndex(items []physicalDrive, index int) (id string, err error) { + if index < 0 || index > len(items)-1 { + return "", raid.ErrInvalidDiskIdentity + } + return items[index].ESID, nil +} + +// findPhysicalDriveIDsByIndexes 通过切片索引列表查找物理驱动器ID +func findPhysicalDriveIDsByIndexes(items []physicalDrive, indexes ...int) (ids []string, err error) { + if len(indexes) <= 0 { + for i := range items { + ids = append(ids, items[i].ESID) + } + return ids, nil + } + ids = make([]string, 0, len(indexes)) + for i := range indexes { + id, err := findPhysicalDriveIDByIndex(items, indexes[i]) + if err != nil { + return nil, err + } + ids = append(ids, id) + } + return ids, nil +} + +// physicalDriveIDs 根据入参的物理驱动器,返回由物理驱动器ID(Enclosure:Bay)组成的字符串切片。 +func physicalDriveIDs(items []physicalDrive) (ids []string) { + ids = make([]string, 0, len(items)) + for i := range items { + ids = append(ids, items[i].ESID) + } + return ids +} + +type pdScanFunc func(item *physicalDrive) bool + +// scanPDs 逐个扫描物理驱动器列表并返回满足所有过滤条件的物理驱动器 +func scanPDs(pds []physicalDrive, filters ...pdScanFunc) (items []physicalDrive) { + for i := range pds { + var unmatched bool + for j := range filters { + if !filters[j](&pds[i]) { + unmatched = true + break + } + } + if !unmatched { + items = append(items, pds[i]) + } + } + return items +} + +// sparePDs 若当前物理驱动器是用于热备,则返回true,反之返回false。 +func sparePDs(pd *physicalDrive) bool { + return pd != nil && strings.Contains(pd.State, "GHS") +} + +// physicalDrives 返回指定controller下的物理驱动器列表 +func (worker *worker) physicalDrives(ctrlID string) (items []physicalDrive, err error) { + //storcli /c0/eall/sall show J + output, err := worker.ExecByShell(tool, fmt.Sprintf("/c%s/eall/sall", ctrlID), "show", "J") // TODO 不再JSON方式,因为会在EFI下失效。 + if err != nil { + return nil, err + } + var ctrls struct { + Ctrls []struct { + RespData struct { + Drives []physicalDrive `json:"Drive Information"` + } `json:"Response Data"` + } `json:"Controllers"` + } + if err = json.Unmarshal(output, &ctrls); err != nil { + if log := worker.GetLog(); log != nil { + log.Error(err) + } + return nil, err + } + if len(ctrls.Ctrls) <= 0 { + return nil, nil + } + return ctrls.Ctrls[0].RespData.Drives, nil +} + +// logicalDrive 逻辑驱动器(阵列) +type logicalDrive struct { + ID string // 形如'/c0/v0' + Name string + Type string // 形如'RAID1' + State string + Size string + PhysicalDrives []physicalDrive // 逻辑驱动器底层所依赖的物理驱动器 +} + +type ldScanFunc func(item *logicalDrive) bool + +// scanPDs 逐个扫描逻辑驱动器列表并返回满足所有过滤条件的逻辑驱动器 +func scanLDs(lds []logicalDrive, filters ...ldScanFunc) (items []logicalDrive) { + for i := range lds { + var unmatched bool + for j := range filters { + if !filters[j](&lds[i]) { + unmatched = true + break + } + } + if !unmatched { + items = append(items, lds[i]) + } + } + return items +} + +// physicalDrives 返回指定controller下的物理驱动器列表 +func (worker *worker) logicalDrives(ctrlID string) (items []logicalDrive, err error) { + // storcli64 /c0/vall show all J + output, err := worker.ExecByShell(tool, fmt.Sprintf("/c%s/vall", ctrlID), "show", "all", "J") // TODO 不再JSON方式,因为会在EFI下失效。 + if err != nil { + return nil, err + } + + // gjson语法: https://github.com/tidwall/gjson#path-syntax + // 示例: ./testdata/storcli64_c0_vall_show_all_j.json + gjson.GetBytes(output, `Controllers.0.Response Data`).ForEach(func(key, value gjson.Result) bool { + k := key.String() + prefix := fmt.Sprintf("/c%s/v", ctrlID) + vid := strings.TrimPrefix(k, prefix) + + if !strings.HasPrefix(k, prefix) { + return true + } + + if !value.IsArray() { + return true + } + + vPDs := gjson.GetBytes(output, fmt.Sprintf(`Controllers.0.Response Data.PDs for VD %s`, vid)).Array() + pds := make([]physicalDrive, 0, len(vPDs)) + for i := range vPDs { + pds = append(pds, physicalDrive{ + ESID: vPDs[i].Get("EID:Slt").String(), + State: vPDs[i].Get("State").String(), + Size: vPDs[i].Get("Size").String(), + Med: vPDs[i].Get("Med").String(), + }) + } + + vVD := value.Array()[0] + items = append(items, logicalDrive{ + ID: k, + Name: vVD.Get("Name").String(), + Type: vVD.Get("TYPE").String(), + State: vVD.Get("State").String(), + Size: vVD.Get("Size").String(), + PhysicalDrives: pds, + }) + return true + }) + + return items, nil +} + +// checkArrays 检查实际的RAID阵列是否与预期配置一致 +func (worker *worker) checkArrays(ctrlID string, arraySetts []raid.ArraySetting) (items []hardware.CheckingItem) { + if ctrlID == "" || len(arraySetts) == 0 { + return nil + } + for i := range arraySetts { + if item := worker.checkArray(ctrlID, &arraySetts[i]); item != nil { + items = append(items, *item) + } + } + return items +} + +// checkArray 检查指定的单个RAID阵列配置与实际是否一致 +func (worker *worker) checkArray(ctrlID string, sett *raid.ArraySetting) *hardware.CheckingItem { + if sett == nil || (sett.Drives == "" && sett.Level == "") { + return nil + } + item := hardware.CheckingItem{ + Title: fmt.Sprintf("[Controller%s] 创建阵列", ctrlID), + Expected: fmt.Sprintf("%s@%s", strings.ToUpper(sett.Level), sett.Drives), + Matched: hardware.MatchedUnknown, + } + + level, err := raid.SelectLevel(sett.Level) + if err != nil { + item.Error = err.Error() + return &item + } + + // 获取该RAID卡下已有的阵列列表 + allLDs, err := worker.logicalDrives(ctrlID) + if err != nil { + item.Error = err.Error() + return &item + } + + // 过滤获得指定级别的阵列列表 + lds := scanLDs(allLDs, func(item *logicalDrive) bool { + return item != nil && strings.ToLower(item.Type) == strings.ToLower(string(level)) + }) + + if len(lds) <= 0 { + // 不存在与预期级别相同的阵列 + item.Matched = hardware.MatchedNO + item.Actual = fmt.Sprintf("缺失%s", strings.ToUpper(sett.Level)) + return &item + } + + // 预期的物理驱动器列表 + drives := strings.Split(sett.Drives, raid.Sep) + + var pds4ld []string + // 遍历该RAID级别的阵列,查找是否存在一个阵列所使用的物理驱动器与预期物理驱动器一致。 + for i := range lds { + // 当前阵列实际所使用的物理驱动器列表 + pdids := physicalDriveIDs(lds[i].PhysicalDrives) + pds4ld = append(pds4ld, strings.Join(pdids, raid.Sep)) + + // 比较实际使用的物理驱动器列表与预期物理驱动器列表是否一致 + if worker.drivesEq(pdids, drives) { + item.Actual = fmt.Sprintf("%s@%s", strings.ToUpper(sett.Level), sett.Drives) + item.Matched = hardware.MatchedYES + return &item + } + } + item.Actual = fmt.Sprintf("%s@%s", strings.ToUpper(sett.Level), strings.Join(pds4ld, "|")) + item.Matched = hardware.MatchedNO + return &item +} + +// checkGlobalHotSpares 检查单个RAID卡控制器的实际全局热备盘设置是否与预期配置一致 +func (worker *worker) checkGlobalHotSpares(ctrlID string, sett *raid.ControllerSetting) *hardware.CheckingItem { + if sett == nil || sett.Hotspares == "" { + return nil + } + item := hardware.CheckingItem{ + Title: fmt.Sprintf("[Controller%s] 设置全局热备盘", ctrlID), + Expected: sett.Hotspares, + Matched: hardware.MatchedUnknown, + } + + pds, err := worker.physicalDrives(ctrlID) + if err != nil { + item.Error = err.Error() + return &item + } + + // 扫描查找所有已经分配作为热备的物理驱动器 + sparePDs := scanPDs(pds, sparePDs) + item.Actual = strings.Join(physicalDriveIDs(sparePDs), raid.Sep) + + // 预期的用于备份的物理驱动器列表 + spares := strings.Split(sett.Hotspares, raid.Sep) + + // 对比实际与预期的热备盘列表是否一致 + if worker.drivesEq(physicalDriveIDs(sparePDs), spares) { + item.Matched = hardware.MatchedYES + } else { + item.Matched = hardware.MatchedNO + } + return &item +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/avagomegaraid/raid.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/avagomegaraid/raid.go new file mode 100644 index 0000000000000000000000000000000000000000..1ef0a88f116c4bf35e0b4eb071c43a012aabd2ee --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/avagomegaraid/raid.go @@ -0,0 +1,287 @@ +package avagomegaraid + +import ( + "fmt" + "regexp" + "strconv" + "strings" + "sync" + + "idcos.io/cloudboot/hardware" + "idcos.io/cloudboot/hardware/raid" + "idcos.io/cloudboot/logger" +) + +const ( + // name RAID处理器名称 + name = raid.AvagoMegaRAID + // tool 硬件配置工具 + tool = "/opt/MegaRAID/storcli/storcli64" +) + +func init() { + raid.Register(name, new(worker)) +} + +type worker struct { + hardware.Base + mux sync.Mutex +} + +// SetDebug 设置是否开启debug。若开启debug,会将关键日志信息写入console。 +func (worker *worker) SetDebug(debug bool) { + worker.Base.SetDebug(debug) +} + +// SetLog 更换日志实现。默认情况下内部无日志实现。 +func (worker *worker) SetLog(log logger.Logger) { + worker.mux.Lock() + defer worker.mux.Unlock() + + worker.Base.SetLog(log) +} + +// Convert2ControllerID RAID卡控制器索引号转换成RAID卡控制器ID。 +// ctrlIndex RAID卡控制器索引号。0表示首块RAID卡,1表示第二块RAID卡,以此类推。 +// 如'HP SmartArray' RAID卡,若索引号为'0',那么可能转换获得的RAID卡控制器ID为'1',原因是这款RAID卡ID是从'1'开始的。 +// 如'LSI SAS3' RAID卡,若索引号为'0',那么可能转换获得的RAID卡控制器ID依然为'0',原因是这款RAID卡ID就是从'0'开始的。 +func (worker *worker) Convert2ControllerID(ctrlIndex uint) (ctrlID string, err error) { + ids, err := worker.controllerIDs() + if err != nil { + return "", err + } + if int(ctrlIndex) > len(ids)-1 { + return "", raid.ErrControllerNotFound + } + return ids[ctrlIndex], nil +} + +// Controllers 返回设备的RAID卡列表 +func (worker *worker) Controllers() (ctrls []raid.Controller, err error) { + ids, err := worker.controllerIDs() + if err != nil { + return nil, err + } + + for i := range ids { + ctrl, err := worker.findController(ids[i]) + if err != nil { + return nil, err + } + ctrls = append(ctrls, *ctrl) + } + return ctrls, nil +} + +// Clear 擦除raid +func (worker *worker) Clear(ctrlID string) (err error) { + // 获取该RAID卡下已有的阵列列表 + allLDs, err := worker.logicalDrives(ctrlID) + if err != nil { + return err + } + // MegaRAID 9560 不存在VD时执行del storcli会抛异常 + if len(allLDs) > 0 { + // storcli /cx/vx|vall del force + _, err = worker.ExecByShell(tool, fmt.Sprintf("/c%s/vall", ctrlID), "del", "force") + worker.Sleep() + return err + } else { + return nil + } +} + +// InitLogicalDrives 初始化指定RAID卡控制器下的逻辑驱动器(逻辑磁盘)。 +func (worker *worker) InitLogicalDrives(ctrlID string) error { + // storcli /cx/v(x|all) start init + _, err := worker.ExecByShell(tool, fmt.Sprintf("/c%s/vall", ctrlID), "start", "init") + worker.Sleep() + return err +} + +// PhysicalDrives 返回物理驱动器(物理磁盘)列表。 +func (worker *worker) PhysicalDrives(ctrlID string) (pds []raid.PhysicalDrive, err error) { + items, err := worker.physicalDrives(ctrlID) + if err != nil { + return nil, err + } + for i := range items { + pds = append(pds, raid.PhysicalDrive{ + ID: worker.extractValue(items[i].ESID, colonSeparator), + Name: items[i].ESID, + RawSize: items[i].Size, + MediaType: items[i].Med, + ControllerID: ctrlID, + }) + } + return pds, nil +} + +// TranslateLegacyDisks 将目标RAID卡控制器下传统"1|2,3|4-6|7-|all"形式的硬盘标识符转换成实际的物理驱动器。 +func (worker *worker) TranslateLegacyDisks(ctrlID string, legacyDisks string) (drives []string, err error) { + pds, err := worker.physicalDrives(ctrlID) + if err != nil { + return nil, err + } + if regexp.MustCompile("^[[:digit:]]+$").MatchString(legacyDisks) { + diskNo, _ := strconv.Atoi(legacyDisks) + return findPhysicalDriveIDsByIndexes(pds, diskNo-1) + + } else if regexp.MustCompile("^[[:digit:],]+$").MatchString(legacyDisks) { + diskNos := strings.Split(legacyDisks, ",") + indexes := make([]int, 0, len(diskNos)) + + for _, fields := range diskNos { + diskNo, _ := strconv.Atoi(fields) + indexes = append(indexes, diskNo-1) + } + return findPhysicalDriveIDsByIndexes(pds, indexes...) + + } else if regexp.MustCompile("^[[:digit:]-]+[[:digit:]]$").MatchString(legacyDisks) { + arr := strings.Split(legacyDisks, "-") + if len(arr) != 2 { + return nil, raid.ErrInvalidDiskIdentity + } + begin, _ := strconv.Atoi(arr[0]) + end, _ := strconv.Atoi(arr[1]) + if begin >= end { + return nil, raid.ErrInvalidDiskIdentity + } + if begin > len(pds) || end > len(pds) { + return nil, raid.ErrInvalidDiskIdentity + } + var indexes []int + for diskNo := begin; diskNo <= end; diskNo++ { + indexes = append(indexes, diskNo-1) + } + return findPhysicalDriveIDsByIndexes(pds, indexes...) + + } else if regexp.MustCompile("^[[:digit:]]+-$").MatchString(legacyDisks) { + arr := strings.Split(legacyDisks, "-") + begin, _ := strconv.Atoi(arr[0]) + if begin > len(pds) { + return nil, raid.ErrInvalidDiskIdentity + } + var indexes []int + for diskNo := begin; diskNo <= len(pds); diskNo++ { + indexes = append(indexes, diskNo-1) + } + return findPhysicalDriveIDsByIndexes(pds, indexes...) + + } else if legacyDisks == "all" { + return findPhysicalDriveIDsByIndexes(pds) + } + return nil, raid.ErrInvalidDiskIdentity +} + +// CreateArray 用指定的物理磁盘和RAID级别创建阵列(逻辑磁盘) +func (worker *worker) CreateArray(ctrlID string, level raid.Level, drives []string) (err error) { + if err = worker.validateLevel(level); err != nil { + return err + } + + isSupportJBOD, _ := worker.checkSupportJBOD(ctrlID) + if isSupportJBOD { + // 关闭整个RAID卡控制器的JBOD模式(开启RAID模式) + if err = worker.switchJBODMode(ctrlID, false); err != nil { + return err + } + } + + _, _ = worker.ExecByShell(tool, "/c0/eall/sall", "show", "all", "J") + + if level == raid.RAID10 { + // storcli64 /c0 add vd type=raid10 size=all drives=134:0,134:1 pdperarray=2 + _, err = worker.ExecByShell(tool, fmt.Sprintf("/c%s", ctrlID), "add", "vd", + fmt.Sprintf("type=%s", level), "size=all", + fmt.Sprintf("drives=%s", strings.Join(drives, ",")), + fmt.Sprintf("pdperarray=%d", 2), + "wb", //default + "direct", //default + "Strip=64", //default + ) + } else if level == raid.RAID50 { + _, err = worker.ExecByShell(tool, fmt.Sprintf("/c%s", ctrlID), "add", "vd", + fmt.Sprintf("type=%s", level), "size=all", + fmt.Sprintf("drives=%s", strings.Join(drives, ",")), + fmt.Sprintf("pdperarray=%d", len(drives)/2), + "wb", //default + "direct", //default + "Strip=64", //default + ) + } else { + // storcli64 /c0 add vd type=raid1 size=all drives=134:0,134:1 + _, err = worker.ExecByShell(tool, fmt.Sprintf("/c%s", ctrlID), "add", "vd", + fmt.Sprintf("type=%s", level), "size=all", + fmt.Sprintf("drives=%s", strings.Join(drives, ",")), + "wb", //default(部分RAID卡可能不支持该参数导致创建失败) + "direct", //default + "Strip=64", //default + ) + } + worker.Sleep() + + _, _ = worker.ExecByShell(tool, "/c0/eall/sall", "show", "all", "J") + _, _ = worker.ExecByShell(tool, "/c0/vall", "show", "all", "J") + return err +} + +// SetGlobalHotspares 添加热备盘 +func (worker *worker) SetGlobalHotspares(ctrlID string, drives []string) (err error) { + // storcli /cx[/ex]/sx add hotsparedrive [{dgs=<n|0,1,2...>}] [enclaffinity][nonrevertible] + for i := range drives { + if _, err = worker.ExecByShell(tool, worker.genPDIdentity(ctrlID, drives[i]), "add", "hotsparedrive"); err != nil { + return err + } + } + worker.Sleep() + return nil +} + +// SetJBODs 将指定RAID卡控制器设置为直通模式,或者将RAID卡控制器下部分物理驱动器设置为直通模式。 +// ctrlID 表示RAID卡控制器ID,通过Convert2ControllerID方法可获取到第N块RAID卡的控制器ID。 +// drives 物理驱动器列表。若物理驱动器列表为空,则意味着将指定的RAID卡下所有的物理驱动器都设置为直通模式。 +func (worker *worker) SetJBODs(ctrlID string, drives []string) (err error) { + defer worker.Sleep() + + if len(drives) <= 0 { + // 为整个RAID卡控制器下的物理驱动器开启直通模式 + if err = worker.switchJBODMode(ctrlID, true); err != nil { + return err + } + } + // 为指定RAID卡控制器下的部分物理驱动器开启直通模式 + // storcli /cx[/ex]/sx set jbod + for i := range drives { + if _, err = worker.ExecByShell(tool, worker.genPDIdentity(ctrlID, drives[i]), "set", "jbod"); err != nil { + return err + } + } + return nil +} + +// PostCheck RAID配置实施后置检查 +func (worker *worker) PostCheck(sett *raid.Setting) (items []hardware.CheckingItem) { + for i := range sett.Controllers { + ctrlID, err := worker.Convert2ControllerID(sett.Controllers[i].Index) + if err != nil { + items = append(items, hardware.CheckingItem{ + Title: "获取RAID卡控制器ID", + Matched: hardware.MatchedUnknown, + Error: err.Error(), + }) + continue + } + items = append(items, worker.checkArrays(ctrlID, sett.Controllers[i].Arrays)...) + + if item := worker.checkGlobalHotSpares(ctrlID, &sett.Controllers[i]); item != nil { + items = append(items, *item) + } + } + return items +} + +// 返回 worker 所使用的cmdline +func (worker *worker) GetCMDLine() string { + return tool +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/hpsmartarray/raid.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/hpsmartarray/raid.go new file mode 100644 index 0000000000000000000000000000000000000000..4a03e5b7a4cfc36af9d7a3fbae3a2fe6bb7ceeb3 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/hpsmartarray/raid.go @@ -0,0 +1,237 @@ +package hpsmartarray + +import ( + "fmt" + "regexp" + "strconv" + "strings" + "sync" + + "idcos.io/cloudboot/hardware" + "idcos.io/cloudboot/hardware/raid" + "idcos.io/cloudboot/logger" +) + +const ( + // name RAID处理器名称 + name = raid.HPSmartArray + // tool 硬件配置工具 + tool = "/usr/sbin/hpssacli" +) + +func init() { + raid.Register(name, new(worker)) +} + +type worker struct { + hardware.Base + mux sync.Mutex +} + +// SetDebug 设置是否开启debug。若开启debug,会将关键日志信息写入console。 +func (worker *worker) SetDebug(debug bool) { + worker.Base.SetDebug(debug) +} + +// SetLog 更换日志实现。默认情况下内部无日志实现。 +func (worker *worker) SetLog(log logger.Logger) { + worker.mux.Lock() + defer worker.mux.Unlock() + + worker.Base.SetLog(log) +} + +// Convert2ControllerID RAID卡控制器索引号转换成RAID卡控制器ID。 +// ctrlIndex RAID卡控制器索引号。0表示首块RAID卡,1表示第二块RAID卡,以此类推。 +// 如'HP SmartArray' RAID卡,若索引号为'0',那么可能转换获得的RAID卡控制器ID为'1',原因是这款RAID卡ID是从'1'开始的。 +// 如'LSI SAS3' RAID卡,若索引号为'0',那么可能转换获得的RAID卡控制器ID依然为'0',原因是这款RAID卡ID就是从'0'开始的。 +func (worker *worker) Convert2ControllerID(ctrlIndex uint) (ctrlID string, err error) { + ids, err := worker.controllerIDs() + if err != nil { + return "", err + } + if int(ctrlIndex) > len(ids)-1 { + return "", raid.ErrControllerNotFound + } + return ids[ctrlIndex], nil +} + +// Controllers 返回设备的RAID卡列表 +func (worker *worker) Controllers() (ctrls []raid.Controller, err error) { + ids, err := worker.controllerIDs() + if err != nil { + return nil, err + } + + ctrls = make([]raid.Controller, 0, len(ids)) + for i := range ids { + ctrl, err := worker.findController(ids[i]) + if err != nil { + return nil, err + } + ctrls = append(ctrls, *ctrl) + } + return ctrls, nil +} + +// Clear 擦除raid +func (worker *worker) Clear(ctrlID string) (err error) { + if !worker.logicalDrivesExist(ctrlID) { + if log := worker.Base.GetLog(); log != nil { + log.Warnf("Skip deleting target devices") + } + return nil + } + // hpssacli ctrl slot=%s delete forced override + _, err = worker.ExecByShell(tool, "ctrl", fmt.Sprintf("slot=%s", ctrlID), "delete", "forced", "override") + worker.Sleep() + return err +} + +// InitLogicalDrives 初始化指定RAID卡控制器下的逻辑驱动器(逻辑磁盘)。 +func (worker *worker) InitLogicalDrives(ctrlID string) error { + // dd if=/dev/urandom of=/dev/sda bs=512 count=2 + // _, err := worker.Base.ExecByShell("dd", "if=/dev/urandom", "of=/dev/sda", "bs=512", "count=2") + return raid.ErrInitLogicalDrivesNotSupport +} + +// PhysicalDrives 返回指定RAID卡控制器的物理驱动器(物理磁盘)列表。 +func (worker *worker) PhysicalDrives(ctrlID string) (pds []raid.PhysicalDrive, err error) { + items, err := worker.physicalDrives(ctrlID) + if err != nil { + return nil, err + } + + for i := range items { + pds = append(pds, raid.PhysicalDrive{ + ID: items[i].Bay, + Name: items[i].identity(), + RawSize: items[i].Size, + MediaType: items[i].InterfaceType, + ControllerID: ctrlID, + }) + } + return pds, nil +} + +// TranslateLegacyDisks 将目标RAID卡控制器下传统"1|2,3|4-6|7-|all"形式的硬盘标识符转换成实际的物理驱动器。 +func (worker *worker) TranslateLegacyDisks(ctrlID string, legacyDisks string) (drives []string, err error) { + pds, err := worker.physicalDrives(ctrlID) + if err != nil { + return nil, err + } + if regexp.MustCompile("^[[:digit:]]+$").MatchString(legacyDisks) { + diskNo, _ := strconv.Atoi(legacyDisks) + return findPhysicalDriveIDsByIndexes(pds, diskNo-1) + + } else if regexp.MustCompile("^[[:digit:],]+$").MatchString(legacyDisks) { + diskNos := strings.Split(legacyDisks, ",") + indexes := make([]int, 0, len(diskNos)) + + for _, fields := range diskNos { + diskNo, _ := strconv.Atoi(fields) + indexes = append(indexes, diskNo-1) + } + return findPhysicalDriveIDsByIndexes(pds, indexes...) + + } else if regexp.MustCompile("^[[:digit:]-]+[[:digit:]]$").MatchString(legacyDisks) { + arr := strings.Split(legacyDisks, "-") + if len(arr) != 2 { + return nil, raid.ErrInvalidDiskIdentity + } + begin, _ := strconv.Atoi(arr[0]) + end, _ := strconv.Atoi(arr[1]) + if begin >= end { + return nil, raid.ErrInvalidDiskIdentity + } + if begin > len(pds) || end > len(pds) { + return nil, raid.ErrInvalidDiskIdentity + } + var indexes []int + for diskNo := begin; diskNo <= end; diskNo++ { + indexes = append(indexes, diskNo-1) + } + return findPhysicalDriveIDsByIndexes(pds, indexes...) + + } else if regexp.MustCompile("^[[:digit:]]+-$").MatchString(legacyDisks) { + arr := strings.Split(legacyDisks, "-") + begin, _ := strconv.Atoi(arr[0]) + if begin > len(pds) { + return nil, raid.ErrInvalidDiskIdentity + } + var indexes []int + for diskNo := begin; diskNo <= len(pds); diskNo++ { + indexes = append(indexes, diskNo-1) + } + return findPhysicalDriveIDsByIndexes(pds, indexes...) + + } else if legacyDisks == "all" { + return findPhysicalDriveIDsByIndexes(pds) + } + return nil, raid.ErrInvalidDiskIdentity +} + +// CreateArray 用指定的物理磁盘和RAID级别创建阵列(逻辑磁盘) +func (worker *worker) CreateArray(ctrlID string, level raid.Level, drives []string) (err error) { + if err = worker.validateLevel(level); err != nil { + return err + } + // 将当前RAID卡设置为RAID模式 + _ = worker.setManagingMode(ctrlID, raidmode) + + worker.Sleep() + // hpssacli ctrl slot=%s create type=ld drives=%s raid=%s + _, err = worker.ExecByShell(tool, + "ctrl", + fmt.Sprintf("slot=%s", ctrlID), + "create", + "type=ld", + fmt.Sprintf("drives=%s", strings.Join(drives, ",")), + fmt.Sprintf("raid=%s", worker.strLevel(level)), + ) + worker.Sleep() + return err +} + +// SetGlobalHotspares 添加热备盘 +func (worker *worker) SetGlobalHotspares(ctrlID string, drives []string) (err error) { + defer worker.Sleep() + // hpssacli ctrl slot=%s array all add spares=%s + return worker.hotspare(fmt.Sprintf("ctrl slot=%s array all", ctrlID), drives) // 对指定slot下所有阵列做热备 +} + +// SetJBODs 将指定RAID卡控制器设置为直通模式,或者将RAID卡控制器下部分物理驱动器设置为直通模式。 +// ctrlID 表示RAID卡控制器ID,通过Convert2ControllerID方法可获取到第N块RAID卡的控制器ID。 +// drives 物理驱动器列表。HP SmartArray系列RAID卡暂不支持将部分物理驱动器设置为直通模式,因此该参数不会产生实际效果。 +func (worker *worker) SetJBODs(ctrlID string, drives []string) (err error) { + // hpssacli ctrl slot=x modify hbamode=on forced + _, err = worker.ExecByShell(tool, "ctrl", fmt.Sprintf("slot=%s", ctrlID), "modify", "hbamode=on", "forced") + worker.Sleep() + return err +} + +// PostCheck RAID配置实施后置检查 +func (worker *worker) PostCheck(sett *raid.Setting) (items []hardware.CheckingItem) { + for i := range sett.Controllers { + ctrlID, err := worker.Convert2ControllerID(sett.Controllers[i].Index) + if err != nil { + items = append(items, hardware.CheckingItem{ + Title: "Get controller ID", + Matched: hardware.MatchedUnknown, + Error: err.Error(), + }) + continue + } + items = append(items, worker.checkArrays(ctrlID, sett.Controllers[i].Arrays)...) + + if item := worker.checkGlobalHotSpares(ctrlID, &sett.Controllers[i]); item != nil { + items = append(items, *item) + } + } + return items +} + +// 返回 worker 所使用的cmdline +func (worker *worker) GetCMDLine() string { + return tool +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/hpsmartarray/smartarray.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/hpsmartarray/smartarray.go new file mode 100644 index 0000000000000000000000000000000000000000..1e7cc641abf19ccd7b2642c8a77c6ded24f56a8b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/hpsmartarray/smartarray.go @@ -0,0 +1,488 @@ +package hpsmartarray + +import ( + "bufio" + "bytes" + "fmt" + "regexp" + "strings" + + "idcos.io/cloudboot/hardware" + "idcos.io/cloudboot/hardware/raid" + "idcos.io/cloudboot/utils/collection" +) + +const ( + // eqSeparator 等号分隔符 + eqSeparator = "=" + // colonSeparator 冒号分隔符 + colonSeparator = ":" +) + +// extractValue 截取kv对中v的内容。假设,kv内容为"name : voidint",那么将返回"voidint"。 +func (worker *worker) extractValue(kv, sep string) (value string) { + if !strings.Contains(kv, sep) { + return kv + } + return strings.TrimSpace(strings.SplitN(kv, sep, 2)[1]) +} + +// validateLevel 校验RAID级别 +func (worker *worker) validateLevel(level raid.Level) error { + if level != raid.RAID0 && + level != raid.RAID1 && + level != raid.RAID10 && + level != raid.RAID5 && + level != raid.RAID50 && + level != raid.RAID6 && + level != raid.RAID60 { + return raid.ErrUnsupportedLevel + } + return nil +} + +// strLevel 返回字符串形式的RAID级别 +func (worker *worker) strLevel(level raid.Level) (l string) { + switch level { + case raid.RAID0: + return "0" + case raid.RAID1: + return "1" + case raid.RAID10: + return "1+0" + case raid.RAID5: + return "5" + case raid.RAID50: + return "50" + case raid.RAID6: + return "6" + case raid.RAID60: + return "60" + } + panic("unreachable") +} + +const ( + raidmode = "raidmode" + hbamode = "hbamode" +) + +func (worker *worker) setManagingMode(ctrlID string, mode string) (err error) { + if mode != raidmode && mode != hbamode { + return raid.ErrUnsupportedRAIDManagingMode + } + ctrl, err := worker.findController(ctrlID) + if err != nil { + return err + } + if (mode == raidmode && ctrl.Mode == "RAID") || (mode == hbamode && ctrl.Mode != "RAID") { + return nil + } + // hpssacli ctrl slot=%s modify raidmode=on forced + _, err = worker.ExecByShell(tool, "ctrl", fmt.Sprintf("slot=%s", ctrlID), "modify", fmt.Sprintf("%s=on", mode), "forced") + return err +} + +// hotspare 添加热备盘 +func (worker *worker) hotspare(target string, drives []string) (err error) { + // hpssacli ctrl slot=%s array all add spares=%s + _, err = worker.Base.ExecByShell(tool, target, "add", fmt.Sprintf("spares=%s", strings.Join(drives, ","))) + return err +} + +// controllerIDs 返回当前设备所有RAID卡的ID列表 +func (worker *worker) controllerIDs() (items []string, err error) { + // hpssacli ctrl all show + output, err := worker.Base.ExecByShell(tool, "ctrl", "all", "show") + if err != nil { + return nil, err + } + + scanner := bufio.NewScanner(bytes.NewBuffer(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + begin := strings.Index(line, "Slot") + end := strings.Index(line, "(") + if !(strings.HasPrefix(line, "Smart Array") && begin > 0 && end > 0 && begin < end) { + continue + } + items = append(items, strings.TrimSpace(line[begin+4:end])) + } + return items, scanner.Err() +} + +// findController 返回指定编号的Controller +func (worker *worker) findController(ctrlID string) (*raid.Controller, error) { + // hpssacli ctrl slot=1 show + output, err := worker.Base.ExecByShell(tool, "ctrl", fmt.Sprintf("slot=%s", ctrlID), "show") + if err != nil { + return nil, err + } + + ctrl := raid.Controller{ + ID: ctrlID, + } + + keyword := fmt.Sprintf("in Slot %s", ctrlID) + scanner := bufio.NewScanner(bytes.NewBuffer(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" { + continue + } + + if idx := strings.Index(line, keyword); idx > 0 { + ctrl.ModelName = fmt.Sprintf("HP %s", strings.TrimSpace(line[:idx])) + } + if strings.HasPrefix(line, "Firmware Version:") { + ctrl.FirmwareVersion = worker.extractValue(line, colonSeparator) + } + if strings.HasPrefix(line, "Controller Mode:") { + ctrl.Mode = worker.extractValue(line, colonSeparator) + } + } + return &ctrl, scanner.Err() +} + +var ( + arrLineReg = regexp.MustCompile(`^array [A-Z]$`) + unassignedLineReg = regexp.MustCompile(`^unassigned$`) +) + +type physicalDrive struct { + Array string // 所属的阵列 + Port string + Box string + Bay string + InterfaceType string + Size string + Spare bool // 是否是备份盘 +} + +func (pd *physicalDrive) identity() string { + return fmt.Sprintf("%s:%s:%s", pd.Port, pd.Box, pd.Bay) +} + +// findPhysicalDriveIDByIndex 通过切片索引查找物理驱动器ID +func findPhysicalDriveIDByIndex(items []physicalDrive, index int) (id string, err error) { + if index < 0 || index > len(items)-1 { + return "", raid.ErrInvalidDiskIdentity + } + return items[index].identity(), nil +} + +// findPhysicalDriveIDsByIndexes 通过切片索引列表查找物理驱动器ID +func findPhysicalDriveIDsByIndexes(items []physicalDrive, indexes ...int) (ids []string, err error) { + if len(indexes) <= 0 { + for i := range items { + ids = append(ids, items[i].identity()) + } + return ids, nil + } + ids = make([]string, 0, len(indexes)) + for i := range indexes { + id, err := findPhysicalDriveIDByIndex(items, indexes[i]) + if err != nil { + return nil, err + } + ids = append(ids, id) + } + return ids, nil +} + +func fromIdentity(id string) (port, box, bay string) { + if fields := strings.Split(id, ":"); len(fields) == 3 { + return fields[0], fields[1], fields[2] + } + return "", "", "" +} + +// physicalDrives 返回指定slot下的物理驱动器列表 +func (worker *worker) physicalDrives(ctrlID string) (items []physicalDrive, err error) { + // hpssacli ctrl slot=1 pd all show + output, err := worker.Base.ExecByShell(tool, "ctrl", fmt.Sprintf("slot=%s", ctrlID), "pd", "all", "show") + if err != nil { + return nil, err + } + + var started bool + var array string + + scanner := bufio.NewScanner(bytes.NewBuffer(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if !started && (arrLineReg.MatchString(line) || unassignedLineReg.MatchString(line)) { + started = true + } + if arrLineReg.MatchString(line) || unassignedLineReg.MatchString(line) { + array = line + } + + begin := strings.Index(line, "(") + end := strings.Index(line, ")") + if !(strings.HasPrefix(line, "physicaldrive") && begin > 0 && end > 0 && begin < end) { + continue + } + + arr := strings.Split(line[begin+1:end], ",") + if len(arr) < 3 { + continue + } + + id := strings.TrimSpace(strings.TrimPrefix(line[:begin], "physicaldrive")) + + var pd physicalDrive + pd.Array = array + pd.Port, pd.Box, pd.Bay = fromIdentity(id) + pd.InterfaceType, pd.Size = strings.TrimSpace(arr[1]), strings.TrimSpace(arr[2]) + pd.Spare = len(arr) >= 5 && strings.TrimSpace(arr[4]) == "spare" + + items = append(items, pd) + } + return items, scanner.Err() +} + +// physicalDriveIDs 根据入参的物理驱动器,返回由物理驱动器ID(port:box:bay)组成的字符串切片。 +func physicalDriveIDs(items []physicalDrive) (ids []string) { + ids = make([]string, 0, len(items)) + for i := range items { + ids = append(ids, items[i].identity()) + } + return ids +} + +type pdScanFunc func(item *physicalDrive) bool + +// scanPDFunc 逐个扫描物理驱动器列表并返回满足所有过滤条件的物理驱动器 +func scanPDFunc(pds []physicalDrive, filters ...pdScanFunc) (items []physicalDrive) { + for i := range pds { + var unmatched bool + for j := range filters { + if !filters[j](&pds[i]) { + unmatched = true + break + } + } + if !unmatched { + items = append(items, pds[i]) + } + } + return items +} + +// sparePDs 若当前物理驱动器是用于热备,则返回true,反之返回false。 +func sparePDs(pd *physicalDrive) bool { + return pd != nil && pd.Spare +} + +// notSparePDs 若当前物理驱动器是用于热备,则返回false,反之返回true。 +func notSparePDs(pd *physicalDrive) bool { + return pd != nil && !pd.Spare +} + +// arrayedPDs 若当前物理驱动器已经分配给某个阵列,则返回true,反之返回false。 +func arrayedPDs(pd *physicalDrive) bool { + return pd != nil && pd.Array != "" && pd.Array != "unassigned" +} + +// pdGroupByArray 将物理驱动器以阵列进行分组 +// func pdGroupByArray(items []physicalDrive) map[string][]physicalDrive { +// store := make(map[string][]physicalDrive) +// for i := range items { +// if _, exist := store[items[i].Array]; exist { +// store[items[i].Array] = append(store[items[i].Array], items[i]) +// } else { +// store[items[i].Array] = []physicalDrive{items[i]} +// } +// } +// return store +// } + +type logicalDrive struct { + Array string // 所属的阵列 + Title string + Size string + RAIDLevel string +} + +// logicalDrives 返回指定RAID卡控制器下的逻辑驱动器列表 +func (worker *worker) logicalDrives(ctrlID string) (items []logicalDrive, err error) { + // hpssacli ctrl slot=1 ld all show + output, err := worker.Base.ExecByShell(tool, "ctrl", fmt.Sprintf("slot=%s", ctrlID), "ld", "all", "show") + if err != nil { + return nil, nil // 若实际不存在逻辑驱动器,执行以上命令也会得到非0的退出码。 + } + + var started bool + var array string + + scanner := bufio.NewScanner(bytes.NewBuffer(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if !started && arrLineReg.MatchString(line) { + started = true + } + if arrLineReg.MatchString(line) { + array = line + } + begin := strings.Index(line, "(") + end := strings.Index(line, ")") + if !(strings.HasPrefix(line, "logicaldrive") && begin > 0 && end > 0 && begin < end) { + continue + } + arr := strings.Split(line[begin+1:end], ",") + if len(arr) < 2 { + continue + } + items = append(items, logicalDrive{ + Array: array, + Title: strings.TrimSpace(line[:begin-1]), + Size: strings.TrimSpace(arr[0]), + RAIDLevel: strings.TrimSpace(arr[1]), + }) + } + return items, scanner.Err() +} + +// logicalDrivesExist 阵列(逻辑磁盘)是否存在 +func (worker *worker) logicalDrivesExist(ctrlID string) bool { + lds, _ := worker.logicalDrives(ctrlID) + return len(lds) > 0 +} + +func (worker *worker) findArraysByLevel(ctrlID string, level raid.Level) (arrays []string, err error) { + lds, err := worker.logicalDrives(ctrlID) + if err != nil { + return nil, err + } + set := collection.NewSSet(1) + for i := range lds { + if lds[i].RAIDLevel == fmt.Sprintf("RAID %s", worker.strLevel(level)) { + set.Add(lds[i].Array) + } + } + return set.Elements(), nil +} + +// checkArrays 检查实际的RAID阵列是否与预期配置一致 +func (worker *worker) checkArrays(ctrlID string, arraySetts []raid.ArraySetting) (items []hardware.CheckingItem) { + if ctrlID == "" || len(arraySetts) == 0 { + return nil + } + for i := range arraySetts { + if item := worker.checkArray(ctrlID, &arraySetts[i]); item != nil { + items = append(items, *item) + } + } + return items +} + +// checkArray 检查指定的单个RAID阵列配置与实际是否一致 +func (worker *worker) checkArray(ctrlID string, sett *raid.ArraySetting) *hardware.CheckingItem { + if sett == nil { + return nil + } + item := hardware.CheckingItem{ + Title: fmt.Sprintf("[Controller%s] Create array", ctrlID), + Expected: fmt.Sprintf("%s@%s", strings.ToUpper(sett.Level), sett.Drives), + Matched: hardware.MatchedUnknown, + } + + allpds, err := worker.physicalDrives(ctrlID) + if err != nil { + item.Error = err.Error() + return &item + } + + level, err := raid.SelectLevel(sett.Level) + if err != nil { + item.Error = err.Error() + return &item + } + + arrays, err := worker.findArraysByLevel(ctrlID, level) + if err != nil { + item.Error = err.Error() + return &item + } + + drives := strings.Split(sett.Drives, raid.Sep) // 预期的物理驱动器列表 + + switch len(arrays) { + case 0: // 不存在与预期级别相同的阵列 + item.Matched = hardware.MatchedNO + item.Actual = "missing" + return &item + + case 1: // 存在一组与预期级别相同的阵列 + pds := scanPDFunc(allpds, + func(item *physicalDrive) bool { + return item != nil && item.Array == arrays[0] + }, + notSparePDs, + ) // 过滤获得指定阵列中实际的非热备物理驱动器列表 + + item.Actual = fmt.Sprintf("%s@%s", + strings.ToUpper(sett.Level), + strings.Join(physicalDriveIDs(pds), raid.Sep), + ) + + if len(pds) != len(drives) { + item.Matched = hardware.MatchedNO + return &item + } + + for i := range pds { + if !collection.InSlice(pds[i].identity(), drives) { + item.Matched = hardware.MatchedNO + return &item + } + } + item.Matched = hardware.MatchedYES + return &item + + default: // 存在多组与预期级别相同的阵列 + // TODO 待实现 + + return &item + } + +} + +// checkGlobalHotSpares 检查实际的全局热备盘设置是否与预期配置一致 +func (worker *worker) checkGlobalHotSpares(ctrlID string, sett *raid.ControllerSetting) *hardware.CheckingItem { + if ctrlID == "" || sett == nil || sett.Hotspares == "" { + return nil + } + item := hardware.CheckingItem{ + Title: fmt.Sprintf("[Controller%s] Set global hot spare(s)", ctrlID), + Expected: sett.Hotspares, + Matched: hardware.MatchedUnknown, + } + + pds, err := worker.physicalDrives(ctrlID) + if err != nil { + item.Error = err.Error() + return &item + } + + // 扫描查找所有已经分配作为热备的物理驱动器 + sparePDs := scanPDFunc(pds, sparePDs) + item.Actual = strings.Join(physicalDriveIDs(sparePDs), raid.Sep) + + spares := strings.Split(sett.Hotspares, raid.Sep) // 预期的用于备份的物理驱动器列表 + if len(sparePDs) != len(spares) { + item.Matched = hardware.MatchedNO + return &item + } + + for i := range sparePDs { + if !collection.InSlice(sparePDs[i].identity(), spares) { + item.Matched = hardware.MatchedNO + return &item + } + } + + item.Matched = hardware.MatchedYES + return &item +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/lsimegaraid/megaraid.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/lsimegaraid/megaraid.go new file mode 100644 index 0000000000000000000000000000000000000000..cc3a269d84b2494e9029bc53bb682fa487014576 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/lsimegaraid/megaraid.go @@ -0,0 +1,365 @@ +package lsimegaraid + +import ( + "bufio" + "bytes" + "fmt" + "strconv" + "strings" + + "idcos.io/cloudboot/hardware" + "idcos.io/cloudboot/hardware/raid" +) + +const ( + // colonSeparator 分隔符 + colonSeparator = ":" +) + +// extractValue 截取kv对中v的内容。假设,kv内容为"name : voidint",那么将返回"voidint"。 +func (worker *worker) extractValue(kv, sep string) (value string) { + if !strings.Contains(kv, sep) { + return kv + } + return strings.TrimSpace(strings.SplitN(kv, sep, 2)[1]) +} + +const ( + // disableJBOD 关闭JBOD模式 + disableJBOD = 0 + // enableJBOD 开启JBOD模式 + enableJBOD = 1 +) + +// switchJBODMode 打开或者关闭目标RAID卡下物理硬盘的JBOD模式。 +// enable为true,开启JBOD模式。 +// enable为false,关闭JBOD模式。 +func (worker *worker) switchJBODMode(ctrlID string, enable bool) (err error) { + v := enableJBOD + if !enable { + v = disableJBOD + } + // megacli -AdpSetProp -EnableJBOD -1 -a0 + _, err = worker.ExecByShell(tool, "-AdpSetProp", "-EnableJBOD", fmt.Sprintf("-%d", v), fmt.Sprintf("-a%s", ctrlID)) + return err +} + +// controllerIDs 返回当前设备所有RAID卡的ID列表 +func (worker *worker) controllerIDs() (items []string, err error) { + // megacli64 -AdpAllInfo -aAll | grep "Adapter" | grep "#" + output, err := worker.ExecByShell(tool, "-AdpAllInfo", "-aAll", "|", "grep", `"Adapter"`, "|", "grep", `"#"`) + if err != nil { + return nil, err + } + + scanner := bufio.NewScanner(bytes.NewBuffer(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if !strings.HasPrefix(line, "Adapter") { + continue + } + + fields := strings.SplitN(line, "#", 2) + if len(fields) <= 1 { + continue + } + items = append(items, fields[1]) + } + return items, scanner.Err() +} + +// findController 返回指定编号的Controller +func (worker *worker) findController(ctrlID string) (*raid.Controller, error) { + // megacli64 -AdpAllInfo -a0 + output, err := worker.ExecByShell(tool, "-AdpAllInfo", fmt.Sprintf("-a%s", ctrlID)) + if err != nil { + return nil, err + } + + ctl := raid.Controller{ + ID: ctrlID, + } + + scanner := bufio.NewScanner(bytes.NewBuffer(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" { + continue + } + if strings.HasPrefix(line, "Product Name") && strings.Contains(line, colonSeparator) { + ctl.ModelName = worker.extractValue(line, colonSeparator) + } + if strings.HasPrefix(line, "FW Version") { + ctl.FirmwareVersion = worker.extractValue(line, colonSeparator) + break + } + } + return &ctl, scanner.Err() +} + +// checkRAID 检查RAID参数 +func (worker *worker) checkRAID(level raid.Level, drives []string) (err error) { + if level != raid.RAID0 && level != raid.RAID1 && level != raid.RAID10 && + level != raid.RAID5 && level != raid.RAID50 && level != raid.RAID6 && level != raid.RAID60 { + return raid.ErrUnsupportedLevel + } + return nil +} + +type physicalDrive struct { + Enclosure int + Slot int + RawSize string // 包含单位 + PDType string +} + +func (pd physicalDrive) identity() string { + return fmt.Sprintf("%d:%d", pd.Enclosure, pd.Slot) +} + +// findPhysicalDriveIDByIndex 通过切片索引查找物理驱动器ID +func findPhysicalDriveIDByIndex(items []physicalDrive, index int) (id string, err error) { + if index < 0 || index > len(items)-1 { + return "", raid.ErrInvalidDiskIdentity + } + return items[index].identity(), nil +} + +// findPhysicalDriveIDsByIndexes 通过切片索引列表查找物理驱动器ID +func findPhysicalDriveIDsByIndexes(items []physicalDrive, indexes ...int) (ids []string, err error) { + if len(indexes) <= 0 { + for i := range items { + ids = append(ids, items[i].identity()) + } + return ids, nil + } + ids = make([]string, 0, len(indexes)) + for i := range indexes { + id, err := findPhysicalDriveIDByIndex(items, indexes[i]) + if err != nil { + return nil, err + } + ids = append(ids, id) + } + return ids, nil +} + +type pds []physicalDrive + +//以下三个函数为了实现磁盘容量的排序规则 +func (items pds) Len() int { + return len(items) +} + +func (items pds) Less(i, j int) bool { + if items[i].Enclosure < items[j].Enclosure { + return true + } else if items[i].Slot < items[j].Slot { + return true + } + return false +} + +func (items pds) Swap(i, j int) { + items[i], items[j] = items[j], items[i] +} + +func (worker *worker) physicalDrives(ctrlID string) (pds, error) { + output, err := worker.ExecByShell(tool, "-PDlist", fmt.Sprintf("-a%s", ctrlID), "-NoLog") + if err != nil { + return nil, err + } + return parsePDs(output) +} + +// parsePDs 解析内容中包含的物理驱动器列表 +func parsePDs(output []byte) (list pds, err error) { + arr := strings.Split(string(output), "\n\n\n") + for i := 0; i < len(arr)-1; i++ { + var hd physicalDrive + lines := strings.Split(arr[i], "\n") + for _, l := range lines { + if strings.Contains(l, "Enclosure Device") { + items := strings.Fields(l) + if hd.Enclosure, err = strconv.Atoi(strings.TrimSpace(items[len(items)-1])); err != nil { + hd.Enclosure = -1 + //return + } + } else if strings.Contains(l, "Slot Number:") { + items := strings.Fields(l) + if hd.Slot, err = strconv.Atoi(strings.TrimSpace(items[len(items)-1])); err != nil { + hd.Slot = -1 + //return + } + } else if strings.Contains(l, "Raw Size:") { + items := strings.Fields(l) + hd.RawSize = items[2] + " " + items[3] + } else if strings.Contains(l, "PD Type:") { + items := strings.Fields(l) + hd.PDType = strings.TrimSpace(items[len(items)-1]) + } + } + list = append(list, hd) + } + return +} + +// checkArrays 检查实际的RAID阵列是否与预期配置一致 +func (worker *worker) checkArrays(sett *raid.Setting) (items []hardware.CheckingItem) { + log := worker.GetLog() + if sett == nil || len(sett.Controllers) == 0 || len(sett.Controllers[0].Arrays) == 0 { + return nil + } + realRAID, _ := worker.getRealRAID() + if realRAID == nil { + items = append(items, hardware.CheckingItem{ + Title: "Check RAID", + Matched: hardware.MatchedUnknown, + Error: "Collect actual RAID info failed", + }) + return + } + if log != nil { + log.Debugf("actual RAID:%v", *realRAID) + } + for i := range sett.Controllers[0].Arrays { + if item := worker.checkArray(&sett.Controllers[0].Arrays[i], realRAID); item != nil { + items = append(items, *item) + } + } + // hotspare + if sett.Controllers[0].Hotspares != "" { + if item := worker.checkGlobalHotSpares(sett, realRAID); item != nil { + items = append(items, *item) + } + } + return items +} + +// checkArray 检查指定的单个RAID阵列配置与实际是否一致 +func (worker *worker) checkArray(sett *raid.ArraySetting, realRAID *raid.Setting) *hardware.CheckingItem { + if sett == nil { + return nil + } + //TODO 需要增加NonRAID的校验 + item := hardware.CheckingItem{ + Title: fmt.Sprintf("创建%s", strings.ToUpper(sett.Level)), + Expected: fmt.Sprintf("%s@%s", strings.ToUpper(sett.Level), sett.Drives), + Matched: hardware.MatchedUnknown, + } + + for _, i := range realRAID.Controllers[0].Arrays { + if strings.ToUpper(sett.Level) == i.Level { + item.Actual = fmt.Sprintf("%s@%s", strings.ToUpper(i.Level), i.Drives) + if sett.Drives == i.Drives { + item.Matched = hardware.MatchedYES + return &item + } else { + //可能存在多组相同级别的RAID,这里只是置可能值,还要继续寻找 + item.Matched = hardware.MatchedNO + } + } + } + + return &item +} + +// getRealRAID 通过megaclisas-status.py查询实际的阵列 +func (worker *worker) getRealRAID() (setting *raid.Setting, err error) { + out, err := worker.Exec("python", "/usr/local/bin/megaraid-status.py") //这个路径需要约定好 + if err != nil { + worker.GetLog().Error(err) + return nil, err + } + return parseMegacliStatus(out) +} + +func parseMegacliStatus(out []byte) (setting *raid.Setting, err error) { + setting = new(raid.Setting) + setting.Controllers = make([]raid.ControllerSetting, 1, 5) //TODO 暂时只支持单raid卡场景检查 + sections := strings.Split(string(out), "\n\n") + m := make(map[string]*raid.ArraySetting, 0) //临时检索容器 + if len(sections) >= 3 { + //第二自然段,第三行开始读取各RAID + lines := strings.Split(sections[1], "\n") + if len(lines) >= 2 { + for i := 2; i < len(lines); i++ { + fileds := strings.Split(lines[i], "|") + id := strings.TrimSpace(fileds[0]) + typ := strings.TrimSpace(fileds[1]) + raidItem := &raid.ArraySetting{ + Level: strings.Replace(typ, "-", "", -1), //RAID-1搞成RAID1 + } + m[id] = raidItem + } + } + //第三自然段开始解析具体的磁盘IDs + lines = strings.Split(sections[2], "\n") + if len(lines) >= 2 { + drives := make([]string, 0) + idPre := "" + for i := 2; i < len(lines); i++ { + fileds := strings.Split(lines[i], "|") + id := strings.TrimSpace(fileds[0])[0:4] //只取前4位,和第二段中解析出来的id值就一致了 + slotID := strings.TrimSpace(fileds[7]) + + if i != 2 && id != idPre { //这里就是想分组归类磁盘id + (m[idPre]).Drives = strings.Join(drives, ",") + drives = drives[:0] + } + drives = append(drives, slotID[1:len(slotID)-1]) //[32:1] => 32:1 + if i == len(lines)-1 { + (m[idPre]).Drives = strings.Join(drives, ",") + } + idPre = id + } + } + + //热备盘解析 + if len(sections) >= 4 { + lines = strings.Split(sections[3], "\n") + if len(lines) >= 2 { + drives := make([]string, 0) + for i := 2; i < len(lines); i++ { + fileds := strings.Split(lines[i], "|") + if len(fileds) > 8 { + status := strings.TrimSpace(fileds[4]) //Hotspare, Spun Up|Unconfigured(good), Spun down + if strings.Contains(status, "Hotspare") { + slotID := strings.TrimSpace(fileds[7]) + drives = append(drives, slotID[1:len(slotID)-1]) //[32:1] => 32:1 + } + } + } + setting.Controllers[0].Hotspares = strings.Join(drives, ",") + } + } + } + for _, v := range m { + setting.Controllers[0].Arrays = append(setting.Controllers[0].Arrays, *v) + } + return setting, nil +} + +// checkGlobalHotSpares 检查实际的全局热备盘设置是否与预期配置一致 +func (worker *worker) checkGlobalHotSpares(sett *raid.Setting, realRAID *raid.Setting) *hardware.CheckingItem { + if sett == nil || len(sett.Controllers) == 0 || sett.Controllers[0].Hotspares == "" { + return nil + } + item := hardware.CheckingItem{ + Title: "创建全局热备", + Expected: sett.Controllers[0].Hotspares, + Actual: realRAID.Controllers[0].Hotspares, + Matched: hardware.MatchedUnknown, + } + if realRAID.Controllers[0].Hotspares != strings.TrimSpace(sett.Controllers[0].Hotspares) { + item.Matched = hardware.MatchedNO + } else { + item.Matched = hardware.MatchedYES + } + return &item +} + +// 返回 worker 所使用的cmdline +func (worker *worker) GetCMDLine() string { + return tool +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/lsimegaraid/raid.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/lsimegaraid/raid.go new file mode 100644 index 0000000000000000000000000000000000000000..e5a143a7d70aaa29d8b2db5ef0fffdfde6398eb2 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/lsimegaraid/raid.go @@ -0,0 +1,249 @@ +package lsimegaraid + +import ( + "fmt" + "regexp" + "sort" + "strconv" + "strings" + "sync" + + "idcos.io/cloudboot/hardware" + "idcos.io/cloudboot/hardware/raid" + "idcos.io/cloudboot/logger" +) + +const ( + // name RAID处理器名称 + name = raid.LSIMegaRAID + // tool 硬件配置工具 + tool = "/opt/MegaRAID/MegaCli/MegaCli64" +) + +func init() { + raid.Register(name, new(worker)) +} + +type worker struct { + hardware.Base + mux sync.Mutex +} + +// SetDebug 设置是否开启debug。若开启debug,会将关键日志信息写入console。 +func (worker *worker) SetDebug(debug bool) { + worker.Base.SetDebug(debug) +} + +// SetLog 更换日志实现。默认情况下内部无日志实现。 +func (worker *worker) SetLog(log logger.Logger) { + worker.mux.Lock() + defer worker.mux.Unlock() + + worker.Base.SetLog(log) +} + +// GetLog 返回日志实例 +func (worker *worker) GetLog() logger.Logger { + worker.mux.Lock() + defer worker.mux.Unlock() + + return worker.Base.GetLog() +} + +// Convert2ControllerID RAID卡控制器索引号转换成RAID卡控制器ID。 +// ctrlIndex RAID卡控制器索引号。0表示首块RAID卡,1表示第二块RAID卡,以此类推。 +// 如'HP SmartArray' RAID卡,若索引号为'0',那么可能转换获得的RAID卡控制器ID为'1',原因是这款RAID卡ID是从'1'开始的。 +// 如'LSI SAS3' RAID卡,若索引号为'0',那么可能转换获得的RAID卡控制器ID依然为'0',原因是这款RAID卡ID就是从'0'开始的。 +func (worker *worker) Convert2ControllerID(ctrlIndex uint) (ctrlID string, err error) { + ids, err := worker.controllerIDs() + if err != nil { + return "", err + } + if int(ctrlIndex) > len(ids)-1 { + return "", raid.ErrControllerNotFound + } + return ids[ctrlIndex], nil +} + +// Controllers 返回设备的RAID卡列表 +func (worker *worker) Controllers() (ctrls []raid.Controller, err error) { + ids, err := worker.controllerIDs() + if err != nil { + return nil, err + } + + for i := range ids { + ctrl, err := worker.findController(ids[i]) + if err != nil { + return nil, err + } + ctrls = append(ctrls, *ctrl) + } + return ctrls, nil +} + +// Clear 擦除raid +func (worker *worker) Clear(ctrlID string) error { + //%s -CfgForeign -Clear -aALL -NoLog; %s -CfgClr -aALL -NoLog + _, err := worker.ExecByShell(tool, "-CfgForeign", "-Clear", fmt.Sprintf("-a%s", ctrlID), "-NoLog;") + if err != nil { + return err + } + worker.Sleep() + _, err = worker.ExecByShell(tool, "-CfgClr", fmt.Sprintf("-a%s", ctrlID), "-NoLog") + worker.Sleep() + return err +} + +// InitLogicalDrives 初始化指定RAID卡控制器下的逻辑驱动器(逻辑磁盘)。 +func (worker *worker) InitLogicalDrives(ctrlID string) error { + // MegaCli64 -LDInit -Start -LALL -aALL -NoLog + _, err := worker.ExecByShell(tool, "-LDInit", "-Start", "-LALL", fmt.Sprintf("-a%s", ctrlID), "-NoLog") + worker.Sleep() + return err +} + +// PhysicalDrives 返回物理驱动器(物理磁盘)列表。 +func (worker *worker) PhysicalDrives(ctrlID string) (pds []raid.PhysicalDrive, err error) { + items, err := worker.physicalDrives(ctrlID) + if err != nil { + return nil, err + } + // 排序 + sort.Sort(items) + pds = make([]raid.PhysicalDrive, 0, len(items)) + for i := range items { + pds = append(pds, raid.PhysicalDrive{ + ID: strconv.Itoa(items[i].Slot), + Name: items[i].identity(), + RawSize: items[i].RawSize, + MediaType: items[i].PDType, + ControllerID: ctrlID, + }) + } + return pds, nil +} + +// TranslateLegacyDisks 将目标RAID卡控制器下传统"1|2,3|4-6|7-|all"形式的硬盘标识符转换成实际的物理驱动器。 +func (worker *worker) TranslateLegacyDisks(ctrlID string, legacyDisks string) (drives []string, err error) { + pds, err := worker.physicalDrives(ctrlID) + if err != nil { + return nil, err + } + if regexp.MustCompile("^[[:digit:]]+$").MatchString(legacyDisks) { + diskNo, _ := strconv.Atoi(legacyDisks) + return findPhysicalDriveIDsByIndexes(pds, diskNo-1) + + } else if regexp.MustCompile("^[[:digit:],]+$").MatchString(legacyDisks) { + diskNos := strings.Split(legacyDisks, ",") + indexes := make([]int, 0, len(diskNos)) + + for _, fields := range diskNos { + diskNo, _ := strconv.Atoi(fields) + indexes = append(indexes, diskNo-1) + } + return findPhysicalDriveIDsByIndexes(pds, indexes...) + + } else if regexp.MustCompile("^[[:digit:]-]+[[:digit:]]$").MatchString(legacyDisks) { + arr := strings.Split(legacyDisks, "-") + if len(arr) != 2 { + return nil, raid.ErrInvalidDiskIdentity + } + begin, _ := strconv.Atoi(arr[0]) + end, _ := strconv.Atoi(arr[1]) + if begin >= end { + return nil, raid.ErrInvalidDiskIdentity + } + if begin > len(pds) || end > len(pds) { + return nil, raid.ErrInvalidDiskIdentity + } + var indexes []int + for diskNo := begin; diskNo <= end; diskNo++ { + indexes = append(indexes, diskNo-1) + } + return findPhysicalDriveIDsByIndexes(pds, indexes...) + + } else if regexp.MustCompile("^[[:digit:]]+-$").MatchString(legacyDisks) { + arr := strings.Split(legacyDisks, "-") + begin, _ := strconv.Atoi(arr[0]) + if begin > len(pds) { + return nil, raid.ErrInvalidDiskIdentity + } + var indexes []int + for diskNo := begin; diskNo <= len(pds); diskNo++ { + indexes = append(indexes, diskNo-1) + } + return findPhysicalDriveIDsByIndexes(pds, indexes...) + + } else if legacyDisks == "all" { + return findPhysicalDriveIDsByIndexes(pds) + } + return nil, raid.ErrInvalidDiskIdentity +} + +// CreateArray 用指定的物理磁盘和RAID级别创建阵列(逻辑磁盘) +func (worker *worker) CreateArray(ctrlID string, level raid.Level, drives []string) error { + // drives数据校验 + err := worker.checkRAID(level, drives) + if err != nil { + return err + } + + // 关闭整个RAID卡控制器的JBOD模式(开启RAID模式) + if err = worker.switchJBODMode(ctrlID, false); err != nil { + return err + } + worker.Sleep() + + var args []string + if level == raid.RAID10 { + // MegaCli64 -CfgSpanAdd -r10 Array0[32:0,N/A:1] Array1[32:2,N/A:3] -a0 -NoLog + args = append(args, "-CfgSpanAdd", "-r10") + for i := 0; i < len(drives); i += 2 { + args = append(args, fmt.Sprintf("Array%d[%s,%s]", i/2, drives[i], drives[i+1])) + } + } else if level == raid.RAID50 { + // MegaCli64 -CfgSpanAdd -r50 Array0[32:0,N/A:1] Array1[32:2,N/A:3] -a0 -NoLog + //为了方便实现,只分2组,而raid50理论上可以将参数分成多组 + args = append(args, "-CfgSpanAdd", "-r50") + args = append(args, fmt.Sprintf("Array%d[%s]", 0, strings.Join(drives[:(len(drives)/2)], ","))) + args = append(args, fmt.Sprintf("Array%d[%s]", 1, strings.Join(drives[(len(drives)/2):], ","))) + } else { + //%s -CfgLdAdd -r%s [%s] -a0 -NoLog + args = append(args, "-CfgLdAdd", fmt.Sprintf("-r%s [%s]", strings.TrimPrefix(string(level), "raid"), strings.Join(drives, ","))) + } + args = append(args, "-WB", "-Direct", "-strpsz64", fmt.Sprintf("-a%s", ctrlID), "-NoLog") + + _, err = worker.ExecByShell(tool, args...) + worker.Sleep() + return err +} + +// SetGlobalHotspares 添加热备盘 +func (worker *worker) SetGlobalHotspares(ctrlID string, drives []string) (err error) { + // -PDHSP -Set -PhysDrv [%s:%s] -a0 -NoLog + _, err = worker.ExecByShell(tool, "-PDHSP", "-Set", "-PhysDrv", fmt.Sprintf("[%s]", strings.Join(drives, ",")), "-a0", "-NoLog") + worker.Sleep() + return err +} + +// SetJBODs 将指定RAID卡控制器设置为直通模式,或者将RAID卡控制器下部分物理驱动器设置为直通模式。 +// ctrlID 表示RAID卡控制器ID,通过Convert2ControllerID方法可获取到第N块RAID卡的控制器ID。 +// drives 物理驱动器列表。若物理驱动器列表为空,则意味着将指定的RAID卡下所有的物理驱动器都设置为直通模式。 +func (worker *worker) SetJBODs(ctrlID string, drives []string) (err error) { + if len(drives) <= 0 { + // 为整个RAID卡控制器下的物理驱动器开启直通模式 + return worker.switchJBODMode(ctrlID, true) + } + // 为指定RAID卡控制器下的部分物理驱动器开启直通模式 + // megacli -PDMakeJBOD -PhysDrv[E0:S0,E1:S1,...] -a0 -NoLog + _, err = worker.ExecByShell(tool, "-PDMakeJBOD", fmt.Sprintf("-PhysDrv[%s]", strings.Join(drives, ",")), fmt.Sprintf("-a%s", ctrlID), "-NoLog") + worker.Sleep() + return err +} + +// PostCheck RAID配置实施后置检查 +func (worker *worker) PostCheck(sett *raid.Setting) (items []hardware.CheckingItem) { + items = append(items, worker.checkArrays(sett)...) + return items +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/lsisas2/lsisas2.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/lsisas2/lsisas2.go new file mode 100644 index 0000000000000000000000000000000000000000..f0533dac36ab7a029d0f1afd01367013d2cab507 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/lsisas2/lsisas2.go @@ -0,0 +1,494 @@ +package lsisas2 + +import ( + "bufio" + "bytes" + "fmt" + "regexp" + "strconv" + "strings" + + "idcos.io/cloudboot/hardware" + "idcos.io/cloudboot/hardware/raid" + "idcos.io/cloudboot/utils/collection" +) + +const ( + // colonSeparator 分隔符 + colonSeparator = ":" +) + +// extractValue 截取kv对中v的内容。假设,kv内容为"name : voidint",那么将返回"voidint"。 +func (worker *worker) extractValue(kv, sep string) (value string) { + if !strings.Contains(kv, sep) { + return kv + } + return strings.TrimSpace(strings.SplitN(kv, sep, 2)[1]) +} + +// hotspare 添加/删除热备盘 +func (worker *worker) hotspare(ctrlID, drive string, delete bool) error { + args := []string{ctrlID, "hotspare"} + if delete { + args = append(args, "delete") + } + args = append(args, drive) + _, err := worker.ExecWithStdinPipe([]string{"YES", "NO"}, tool, args...) + return err +} + +// controllerIDs 返回当前设备所有RAID卡的ID列表 +func (worker *worker) controllerIDs() (items []string, err error) { + // sas2ircu list + output, err := worker.ExecByShell(tool, "list") + if err != nil { + return nil, err + } + + var started bool + scanner := bufio.NewScanner(bytes.NewBuffer(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + + line = strings.TrimSpace(line) + if strings.HasPrefix(line, "---") { + started = true + continue + } + if !started || line == "" { + continue + } + + arr := strings.Fields(line) + if !numReg.MatchString(arr[0]) { + continue + } + items = append(items, arr[0]) + } + return items, scanner.Err() +} + +var ( + numReg = regexp.MustCompile(`^\d+$`) +) + +// findController 返回指定索引号的Controller +func (worker *worker) findController(ctrlID string) (*raid.Controller, error) { + output, err := worker.ExecByShell(tool, ctrlID, "display") + if err != nil { + return nil, err + } + + ctl := raid.Controller{ + ID: ctrlID, + } + + var started bool + scanner := bufio.NewScanner(bytes.NewBuffer(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" { + continue + } + if strings.HasPrefix(line, "Controller information") { + started = true + continue + } + if !started { + continue + } + + if strings.HasPrefix(line, "Controller type") && strings.Contains(line, ":") { + ctl.ModelName = worker.extractValue(line, colonSeparator) + } + if strings.HasPrefix(line, "Firmware version") && strings.Contains(line, ":") { + ctl.FirmwareVersion = worker.extractValue(line, colonSeparator) + } + if strings.HasPrefix(line, "IR Volume information") || strings.HasPrefix(line, "Physical device information") { + break + } + } + return &ctl, nil +} + +type physicalDrive struct { + Enclosure int // 硬盘盒ID + Slot int // 硬盘盒中的插槽ID + State string // 物理驱动器状态 + Size string // 包含单位 + DriveType string // 物理驱动器类型 +} + +func (hd physicalDrive) identity() string { + return fmt.Sprintf("%d:%d", hd.Enclosure, hd.Slot) +} + +// findPhysicalDriveIDByIndex 通过切片索引查找物理驱动器ID +func findPhysicalDriveIDByIndex(items []physicalDrive, index int) (id string, err error) { + if index < 0 || index > len(items)-1 { + return "", raid.ErrInvalidDiskIdentity + } + return items[index].identity(), nil +} + +// findPhysicalDriveIDsByIndexes 通过切片索引列表查找物理驱动器ID +func findPhysicalDriveIDsByIndexes(items []physicalDrive, indexes ...int) (ids []string, err error) { + if len(indexes) <= 0 { + for i := range items { + ids = append(ids, items[i].identity()) + } + return ids, nil + } + ids = make([]string, 0, len(indexes)) + for i := range indexes { + id, err := findPhysicalDriveIDByIndex(items, indexes[i]) + if err != nil { + return nil, err + } + ids = append(ids, id) + } + return ids, nil +} + +func (worker *worker) physicalDrives(ctrlID string) (pds []physicalDrive, err error) { + output, err := worker.ExecByShell(tool, ctrlID, "display") + if err != nil { + return nil, err + } + return worker.parsePDs(output) +} + +var ( + enclReg = regexp.MustCompile(`Enclosure #\s+:\s+(\d+)`) + slotReg = regexp.MustCompile(`Slot #\s+:\s+(\d+)`) + sizeReg = regexp.MustCompile(`Size.+:\s+(\d+)/(\d+)`) + driveTypeReg = regexp.MustCompile(`Drive Type\s+:\s+(\S+)`) + unitReg = regexp.MustCompile(`(in [a-zA-z]+)`) + stateReg = regexp.MustCompile(`State\s+:\s+(\S+\s+\S+)`) +) + +// parsePDs 解析内容中包含的物理驱动器列表 +func (worker *worker) parsePDs(output []byte) (items []physicalDrive, err error) { + arr := strings.Split(string(output), "Device is a") + for i := 1; i < len(arr); i++ { + var pd physicalDrive + if pair := strings.Split(stateReg.FindString(arr[i]), ":"); len(pair) == 2 { + pd.State = strings.TrimSpace(pair[1]) + if strings.Contains(pd.State, "Standby") { // 非硬盘设备 + continue + } + } + if pair := strings.Split(enclReg.FindString(arr[i]), ":"); len(pair) == 2 { + if pd.Enclosure, err = strconv.Atoi(strings.TrimSpace(pair[1])); err != nil { + return nil, err + } + } + if pair := strings.Split(slotReg.FindString(arr[i]), ":"); len(pair) == 2 { + if pd.Slot, err = strconv.Atoi(strings.TrimSpace(pair[1])); err != nil { + return nil, err + } + } + if pair := strings.Split(sizeReg.FindString(arr[i]), ":"); len(pair) == 2 { + if idx := strings.Index(pair[1], "/"); idx > 0 { + pd.Size = fmt.Sprintf("%s%s", + strings.TrimSpace(pair[1][:idx]), + strings.TrimPrefix(unitReg.FindString(pair[0]), "in"), + ) + } else { + pd.Size = strings.TrimSpace(pair[1]) + } + } + if pair := strings.Split(driveTypeReg.FindString(arr[i]), ":"); len(pair) == 2 { + pd.DriveType = strings.TrimSpace(pair[1]) + } + + items = append(items, pd) + } + return items, nil +} + +// physicalDriveIDs 根据入参的物理驱动器,返回由物理驱动器ID(Enclosure:Bay)组成的字符串切片。 +func physicalDriveIDs(items []physicalDrive) (ids []string) { + ids = make([]string, 0, len(items)) + for i := range items { + ids = append(ids, items[i].identity()) + } + return ids +} + +type pdScanFunc func(item *physicalDrive) bool + +// scanPDs 逐个扫描物理驱动器列表并返回满足所有过滤条件的物理驱动器 +func scanPDs(pds []physicalDrive, filters ...pdScanFunc) (items []physicalDrive) { + for i := range pds { + var unmatched bool + for j := range filters { + if !filters[j](&pds[i]) { + unmatched = true + break + } + } + if !unmatched { + items = append(items, pds[i]) + } + } + return items +} + +// sparePDs 若当前物理驱动器是用于热备,则返回true,反之返回false。 +func sparePDs(pd *physicalDrive) bool { + return pd != nil && strings.Contains(pd.State, "HotSpare") +} + +type volumeScanFunc func(item *volume) bool + +func scanVolumes(volumes []*volume, filters ...volumeScanFunc) (items []*volume) { + for i := range volumes { + var unmatched bool + for j := range filters { + if !filters[j](volumes[i]) { + unmatched = true + break + } + } + if !unmatched { + items = append(items, volumes[i]) + } + } + return items +} + +// findVolumesByLevel 查找指定RAID卡下指定级别的卷(RAID阵列/逻辑磁盘)列表。 +func (worker *worker) findVolumesByLevel(ctrlID string, level raid.Level) (items []*volume, err error) { + volumes, err := worker.volumes(ctrlID) + if err != nil { + return nil, err + } + for i := range volumes { + if volumes[i].RAIDLevel == strings.ToUpper(string(level)) { + items = append(items, volumes[i]) + } + } + return items, nil +} + +// volume 逻辑驱动器(卷/RAID阵列)。 +type volume struct { + VolumeID string + Status string + Size string + RAIDLevel string + Boot string + PhysicalDrives []string +} + +// volumes 返回指定controller索引下的逻辑驱动器列表 +func (worker *worker) volumes(ctrlID string) (items []*volume, err error) { + // sas3ircu 0 display + output, err := worker.Base.ExecByShell(tool, ctrlID, "display") + if err != nil { + return nil, nil + } + source := string(output) + begin := strings.Index(source, "IR Volume information") + end := strings.Index(source, "Physical device information") + if begin < 0 { + return nil, nil + } + return worker.parseVolumes(source[begin:end]) +} + +// parseVolumes 解析命令行输出中包含的卷信息 +func (worker *worker) parseVolumes(output string) (items []*volume, err error) { + blocks := strings.Split(output, "IR volume") + for i := range blocks { + if blocks[i] = strings.TrimSpace(blocks[i]); blocks[i] == "" { + continue + } + var item volume + + scanner := bufio.NewScanner(strings.NewReader(blocks[i])) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" { + continue + } + if strings.HasPrefix(line, "Volume ID") && strings.Contains(line, ":") { + item.VolumeID = worker.extractValue(line, colonSeparator) + + } else if strings.HasPrefix(line, "Status of volume") && strings.Contains(line, ":") { + item.Status = worker.extractValue(line, colonSeparator) + + } else if strings.HasPrefix(line, "RAID level") && strings.Contains(line, ":") { + item.RAIDLevel = worker.extractValue(line, colonSeparator) + + } else if strings.HasPrefix(line, "Size (in MB)") && strings.Contains(line, ":") { + item.Size = fmt.Sprintf("%s MB", worker.extractValue(line, colonSeparator)) + + } else if strings.HasPrefix(line, "Boot") && strings.Contains(line, ":") { + item.Boot = worker.extractValue(line, colonSeparator) + + } else if strings.Contains(line, "Enclosure#/Slot#") && strings.Contains(line, ":") { + item.PhysicalDrives = append(item.PhysicalDrives, worker.extractValue(line, colonSeparator)) + } + } + if item.VolumeID != "" { + items = append(items, &item) + } + if err = scanner.Err(); err != nil { + if log := worker.Base.GetLog(); log != nil { + log.Error(err) + } + return nil, err + } + } + return items, nil +} + +// checkGlobalHotSpares 检查单个RAID卡控制器的实际全局热备盘设置是否与预期配置一致 +func (worker *worker) checkGlobalHotSpares(ctrlID string, sett *raid.ControllerSetting) *hardware.CheckingItem { + if sett == nil || sett.Hotspares == "" { + return nil + } + item := hardware.CheckingItem{ + Title: fmt.Sprintf("[Controller%s] Set global hot spare(s)", ctrlID), + Expected: sett.Hotspares, + Matched: hardware.MatchedUnknown, + } + + pds, err := worker.physicalDrives(ctrlID) + if err != nil { + item.Error = err.Error() + return &item + } + + // 扫描查找所有已经分配作为热备的物理驱动器 + sparePDs := scanPDs(pds, sparePDs) + item.Actual = strings.Join(physicalDriveIDs(sparePDs), raid.Sep) + + spares := strings.Split(sett.Hotspares, raid.Sep) // 预期的用于备份的物理驱动器列表 + if len(sparePDs) != len(spares) { + item.Matched = hardware.MatchedNO + return &item + } + + for i := range sparePDs { + if !collection.InSlice(sparePDs[i].identity(), spares) { + item.Matched = hardware.MatchedNO + return &item + } + } + + item.Matched = hardware.MatchedYES + return &item +} + +// checkArrays 检查实际的RAID阵列是否与预期配置一致 +func (worker *worker) checkArrays(ctrlID string, arraySetts []raid.ArraySetting) (items []hardware.CheckingItem) { + if ctrlID == "" || len(arraySetts) == 0 { + return nil + } + for i := range arraySetts { + if item := worker.checkArray(ctrlID, &arraySetts[i]); item != nil { + items = append(items, *item) + } + } + return items +} + +// checkArray 检查指定的单个RAID阵列配置与实际是否一致 +func (worker *worker) checkArray(ctrlID string, sett *raid.ArraySetting) *hardware.CheckingItem { + if sett == nil { + return nil + } + item := hardware.CheckingItem{ + Title: fmt.Sprintf("[Controller%s] Create array", ctrlID), + Expected: fmt.Sprintf("%s@%s", strings.ToUpper(sett.Level), sett.Drives), + Matched: hardware.MatchedUnknown, + } + + level, err := raid.SelectLevel(sett.Level) + if err != nil { + item.Error = err.Error() + return &item + } + + arrays, err := worker.findVolumesByLevel(ctrlID, level) + if err != nil { + item.Error = err.Error() + return &item + } + + drives := strings.Split(sett.Drives, raid.Sep) // 预期的物理驱动器列表 + + switch len(arrays) { + case 0: + // 1、不存在与预期级别相同的阵列 + item.Matched = hardware.MatchedNO + item.Actual = fmt.Sprintf("missing %s", strings.ToUpper(sett.Level)) + return &item + + case 1: + // 2、存在一组与预期级别相同的阵列 + item.Actual = fmt.Sprintf("%s@%s", + strings.ToUpper(sett.Level), + strings.Join(arrays[0].PhysicalDrives, raid.Sep), + ) + + if len(arrays[0].PhysicalDrives) != len(drives) { + item.Matched = hardware.MatchedNO + return &item + } + + for _, pd := range arrays[0].PhysicalDrives { + if !collection.InSlice(pd, drives) { + item.Matched = hardware.MatchedNO + return &item + } + } + item.Matched = hardware.MatchedYES + return &item + } + + // 3、存在多组与预期级别相同的阵列(该RAID卡存在最多创建2组RAID阵列的限制) + item.Actual = fmt.Sprintf("%s@%s", + strings.ToUpper(sett.Level), + fmt.Sprintf("%s|%s", strings.Join(arrays[0].PhysicalDrives, raid.Sep), strings.Join(arrays[1].PhysicalDrives, raid.Sep)), + ) + + // 将首个预期的物理驱动器当作判断基准 + drive := drives[0] + + // 找出使用了当前物理驱动器的卷 + vs := scanVolumes(arrays, func(item *volume) bool { + return collection.InSlice(drive, item.PhysicalDrives) + }) + switch len(vs) { + case 0: // 未找到使用了当前物理驱动器的卷 + item.Matched = hardware.MatchedNO + return &item + + case 1: // 找到了使用当前物理驱动器的卷 + // 对比预期的物理驱动器数量与此卷所占用的物理驱动器的数量是否一致 + if len(vs[0].PhysicalDrives) != len(drives) { + item.Matched = hardware.MatchedNO + return &item + } + // 对比预期的物理驱动器列表与此卷所占用的物理驱动器是否完全一致 + for x := range drives { + if !collection.InSlice(drives[x], vs[0].PhysicalDrives) { + item.Matched = hardware.MatchedNO + return &item + } + } + item.Actual = fmt.Sprintf("%s@%s", + strings.ToUpper(sett.Level), + strings.Join(vs[0].PhysicalDrives, raid.Sep), + ) + item.Matched = hardware.MatchedYES + return &item + default: + // 理论上一块物理驱动器不可能存在于多个RAID阵列当中 + panic("unreachable") + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/lsisas2/raid.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/lsisas2/raid.go new file mode 100644 index 0000000000000000000000000000000000000000..37e3e70da18834dde7af34fe1b471cd10404d236 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/lsisas2/raid.go @@ -0,0 +1,224 @@ +package lsisas2 + +import ( + "regexp" + "strconv" + "strings" + "sync" + + "idcos.io/cloudboot/hardware" + "idcos.io/cloudboot/hardware/raid" + "idcos.io/cloudboot/logger" +) + +const ( + // name RAID处理器名称 + name = raid.LSISAS2 + // tool 硬件配置工具 + tool = "sas2ircu" +) + +func init() { + raid.Register(name, new(worker)) +} + +type worker struct { + hardware.Base + mux sync.Mutex +} + +// SetDebug 设置是否开启debug。若开启debug,会将关键日志信息写入console。 +func (worker *worker) SetDebug(debug bool) { + worker.Base.SetDebug(debug) +} + +// SetLog 更换日志实现。默认情况下内部无日志实现。 +func (worker *worker) SetLog(log logger.Logger) { + worker.mux.Lock() + defer worker.mux.Unlock() + + worker.Base.SetLog(log) +} + +// Convert2ControllerID RAID卡控制器索引号转换成RAID卡控制器ID。 +// ctrlIndex RAID卡控制器索引号。0表示首块RAID卡,1表示第二块RAID卡,以此类推。 +// 如'HP SmartArray' RAID卡,若索引号为'0',那么可能转换获得的RAID卡控制器ID为'1',原因是这款RAID卡ID是从'1'开始的。 +// 如'LSI SAS3' RAID卡,若索引号为'0',那么可能转换获得的RAID卡控制器ID依然为'0',原因是这款RAID卡ID就是从'0'开始的。 +func (worker *worker) Convert2ControllerID(ctrlIndex uint) (ctrlID string, err error) { + ids, err := worker.controllerIDs() + if err != nil { + return "", err + } + if int(ctrlIndex) > len(ids)-1 { + return "", raid.ErrControllerNotFound + } + return ids[ctrlIndex], nil +} + +// Controllers 返回设备的RAID卡控制器列表。 +func (worker *worker) Controllers() (ctrls []raid.Controller, err error) { + ids, err := worker.controllerIDs() + if err != nil { + return nil, err + } + ctrls = make([]raid.Controller, 0, len(ids)) + for i := range ids { + ctrl, err := worker.findController(ids[i]) + if err != nil { + return nil, err + } + ctrls = append(ctrls, *ctrl) + } + return ctrls, nil +} + +// PhysicalDrives 返回指定RAID卡控制器的物理驱动器(物理磁盘)列表。 +// ctrlID 表示RAID卡控制器ID,通过Convert2ControllerID方法可获取到第N块RAID卡的控制器ID。 +func (worker *worker) PhysicalDrives(ctrlID string) (pds []raid.PhysicalDrive, err error) { + items, err := worker.physicalDrives(ctrlID) + if err != nil { + return nil, err + } + pds = make([]raid.PhysicalDrive, 0, len(items)) + for i := range items { + pds = append(pds, raid.PhysicalDrive{ + ID: strconv.Itoa(items[i].Slot), + Name: items[i].identity(), + RawSize: items[i].Size, + MediaType: items[i].DriveType, + ControllerID: ctrlID, + }) + } + return pds, nil +} + +// Clear 擦除指定RAID卡控制器的配置。 +// ctrlID 表示RAID卡控制器ID,通过Convert2ControllerID方法可获取到第N块RAID卡的控制器ID。 +func (worker *worker) Clear(ctrlID string) (err error) { + _, err = worker.ExecByShell(tool, ctrlID, "delete", "noprompt") + worker.Sleep() + return err +} + +// InitLogicalDrives 初始化指定RAID卡控制器下的逻辑驱动器(逻辑磁盘)。 +func (worker *worker) InitLogicalDrives(ctrlID string) error { + return raid.ErrInitLogicalDrivesNotSupport +} + +// TranslateLegacyDisks 将目标RAID卡控制器下传统"1|2,3|4-6|7-|all"形式的硬盘标识符转换成实际的物理驱动器。 +func (worker *worker) TranslateLegacyDisks(ctrlID string, legacyDisks string) (drives []string, err error) { + pds, err := worker.physicalDrives(ctrlID) + if err != nil { + return nil, err + } + if regexp.MustCompile("^[[:digit:]]+$").MatchString(legacyDisks) { + diskNo, _ := strconv.Atoi(legacyDisks) + return findPhysicalDriveIDsByIndexes(pds, diskNo-1) + + } else if regexp.MustCompile("^[[:digit:],]+$").MatchString(legacyDisks) { + diskNos := strings.Split(legacyDisks, ",") + indexes := make([]int, 0, len(diskNos)) + + for _, fields := range diskNos { + diskNo, _ := strconv.Atoi(fields) + indexes = append(indexes, diskNo-1) + } + return findPhysicalDriveIDsByIndexes(pds, indexes...) + + } else if regexp.MustCompile("^[[:digit:]-]+[[:digit:]]$").MatchString(legacyDisks) { + arr := strings.Split(legacyDisks, "-") + if len(arr) != 2 { + return nil, raid.ErrInvalidDiskIdentity + } + begin, _ := strconv.Atoi(arr[0]) + end, _ := strconv.Atoi(arr[1]) + if begin >= end { + return nil, raid.ErrInvalidDiskIdentity + } + if begin > len(pds) || end > len(pds) { + return nil, raid.ErrInvalidDiskIdentity + } + var indexes []int + for diskNo := begin; diskNo <= end; diskNo++ { + indexes = append(indexes, diskNo-1) + } + return findPhysicalDriveIDsByIndexes(pds, indexes...) + + } else if regexp.MustCompile("^[[:digit:]]+-$").MatchString(legacyDisks) { + arr := strings.Split(legacyDisks, "-") + begin, _ := strconv.Atoi(arr[0]) + if begin > len(pds) { + return nil, raid.ErrInvalidDiskIdentity + } + var indexes []int + for diskNo := begin; diskNo <= len(pds); diskNo++ { + indexes = append(indexes, diskNo-1) + } + return findPhysicalDriveIDsByIndexes(pds, indexes...) + + } else if legacyDisks == "all" { + return findPhysicalDriveIDsByIndexes(pds) + } + return nil, raid.ErrInvalidDiskIdentity +} + +// CreateArray 在指定RAID卡控制器下的若干物理驱动器上创建指定级别的阵列(逻辑磁盘)。 +// ctrlID 表示RAID卡控制器ID,通过Convert2ControllerID方法可获取到第N块RAID卡的控制器ID。 +// level RAID级别,不同的RAID卡所支持的级别有所差异。 +// drives 物理驱动器列表。PhysicalDrives方法可获得的物理驱动器信息列表,其中'Name'属性即为某个物理驱动器标识。 +func (worker *worker) CreateArray(ctrlID string, level raid.Level, drives []string) (err error) { + if level != raid.RAID0 && level != raid.RAID1 && level != raid.RAID1E && level != raid.RAID10 { + return raid.ErrUnsupportedLevel + } + args := []string{ctrlID, "create", string(level), "max"} + args = append(args, drives...) + args = append(args, "noprompt") + _, err = worker.ExecByShell(tool, args...) + worker.Sleep() + return err +} + +// SetGlobalHotspares 将指定RAID卡下的物理驱动器设置为全局热备盘。 +// ctrlID 表示RAID卡控制器ID,通过Convert2ControllerID方法可获取到第N块RAID卡的控制器ID。 +func (worker *worker) SetGlobalHotspares(ctrlID string, drives []string) (err error) { + for i := range drives { + if err = worker.hotspare(ctrlID, drives[i], false); err != nil { + return err + } + } + worker.Sleep() + return nil +} + +// SetJBODs 将指定RAID卡控制器设置为直通模式,或者将RAID卡控制器下部分物理驱动器设置为直通模式。 +// ctrlID 表示RAID卡控制器ID,通过Convert2ControllerID方法可获取到第N块RAID卡的控制器ID。 +// drives 物理驱动器列表。该RAID卡不支持将部分物理驱动器设置为直通模式,因此该参数并不会有实际作用。 +func (worker *worker) SetJBODs(ctrlID string, drives []string) (err error) { + return raid.ErrJBODModeNotSupport +} + +// PostCheck RAID配置实施后置检查 +func (worker *worker) PostCheck(sett *raid.Setting) (items []hardware.CheckingItem) { + for i := range sett.Controllers { + ctrlID, err := worker.Convert2ControllerID(sett.Controllers[i].Index) + if err != nil { + items = append(items, hardware.CheckingItem{ + Title: "Get controller ID", + Matched: hardware.MatchedUnknown, + Error: err.Error(), + }) + continue + } + items = append(items, worker.checkArrays(ctrlID, sett.Controllers[i].Arrays)...) + + if item := worker.checkGlobalHotSpares(ctrlID, &sett.Controllers[i]); item != nil { + items = append(items, *item) + } + } + return items +} + +// 返回 worker 所使用的cmdline +func (worker *worker) GetCMDLine() string { + return tool +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/lsisas3/lsisas3.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/lsisas3/lsisas3.go new file mode 100644 index 0000000000000000000000000000000000000000..11820aa1fb00aa14fd86b8b38c3f6697f24d06e2 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/lsisas3/lsisas3.go @@ -0,0 +1,494 @@ +package lsisas3 + +import ( + "bufio" + "bytes" + "fmt" + "regexp" + "strconv" + "strings" + + "idcos.io/cloudboot/hardware" + "idcos.io/cloudboot/hardware/raid" + "idcos.io/cloudboot/utils/collection" +) + +const ( + // colonSeparator 分隔符 + colonSeparator = ":" +) + +// extractValue 截取kv对中v的内容。假设,kv内容为"name : voidint",那么将返回"voidint"。 +func (worker *worker) extractValue(kv, sep string) (value string) { + if !strings.Contains(kv, sep) { + return kv + } + return strings.TrimSpace(strings.SplitN(kv, sep, 2)[1]) +} + +// hotspare 添加/删除热备盘 +func (worker *worker) hotspare(ctrlID, drive string, delete bool) error { + args := []string{ctrlID, "hotspare"} + if delete { + args = append(args, "delete") + } + args = append(args, drive) + _, err := worker.Base.ExecWithStdinPipe([]string{"YES", "NO"}, tool, args...) + return err +} + +var ( + numReg = regexp.MustCompile(`^\d+$`) +) + +// controllerIDs 返回当前设备所有RAID卡的ID列表 +func (worker *worker) controllerIDs() (items []string, err error) { + // sas3ircu list + output, err := worker.ExecByShell(tool, "list") + if err != nil { + return nil, err + } + + var started bool + scanner := bufio.NewScanner(bytes.NewBuffer(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + + line = strings.TrimSpace(line) + if strings.HasPrefix(line, "---") { + started = true + continue + } + if !started || line == "" { + continue + } + + arr := strings.Fields(line) + if !numReg.MatchString(arr[0]) { + continue + } + items = append(items, arr[0]) + } + return items, scanner.Err() +} + +// findController 返回指定索引号的Controller +func (worker *worker) findController(ctrlID string) (*raid.Controller, error) { + output, err := worker.ExecByShell(tool, ctrlID, "display") + if err != nil { + return nil, err + } + + ctl := raid.Controller{ + ID: ctrlID, + } + + var started bool + scanner := bufio.NewScanner(bytes.NewBuffer(output)) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" { + continue + } + if strings.HasPrefix(line, "Controller information") { + started = true + continue + } + if !started { + continue + } + + if strings.HasPrefix(line, "Controller type") && strings.Contains(line, ":") { + ctl.ModelName = worker.extractValue(line, colonSeparator) + } + if strings.HasPrefix(line, "Firmware version") && strings.Contains(line, ":") { + ctl.FirmwareVersion = worker.extractValue(line, colonSeparator) + } + if strings.HasPrefix(line, "IR Volume information") || strings.HasPrefix(line, "Physical device information") { + break + } + } + return &ctl, nil +} + +type physicalDrive struct { + Enclosure int // 硬盘盒ID + Slot int // 硬盘盒中的插槽ID + State string // 物理驱动器状态 + Size string // 包含单位 + DriveType string // 物理驱动器类型 +} + +func (hd physicalDrive) identity() string { + return fmt.Sprintf("%d:%d", hd.Enclosure, hd.Slot) +} + +// findPhysicalDriveIDByIndex 通过切片索引查找物理驱动器ID +func findPhysicalDriveIDByIndex(items []physicalDrive, index int) (id string, err error) { + if index < 0 || index > len(items)-1 { + return "", raid.ErrInvalidDiskIdentity + } + return items[index].identity(), nil +} + +// findPhysicalDriveIDsByIndexes 通过切片索引列表查找物理驱动器ID +func findPhysicalDriveIDsByIndexes(items []physicalDrive, indexes ...int) (ids []string, err error) { + if len(indexes) <= 0 { + for i := range items { + ids = append(ids, items[i].identity()) + } + return ids, nil + } + ids = make([]string, 0, len(indexes)) + for i := range indexes { + id, err := findPhysicalDriveIDByIndex(items, indexes[i]) + if err != nil { + return nil, err + } + ids = append(ids, id) + } + return ids, nil +} + +func (worker *worker) physicalDrives(ctrlID string) (pds []physicalDrive, err error) { + output, err := worker.Exec(tool, ctrlID, "display") + if err != nil { + return nil, err + } + return worker.parsePDs(output) +} + +var ( + enclReg = regexp.MustCompile(`Enclosure #\s+:\s+(\d+)`) + slotReg = regexp.MustCompile(`Slot #\s+:\s+(\d+)`) + sizeReg = regexp.MustCompile(`Size.+:\s+(\d+)/(\d+)`) + driveTypeReg = regexp.MustCompile(`Drive Type\s+:\s+(\S+)`) + unitReg = regexp.MustCompile(`(in [a-zA-z]+)`) + stateReg = regexp.MustCompile(`State\s+:\s+(\S+\s+\S+)`) +) + +// parsePDs 解析内容中包含的物理驱动器列表 +func (worker *worker) parsePDs(output []byte) (items []physicalDrive, err error) { + arr := strings.Split(string(output), "Device is a") + for i := 1; i < len(arr); i++ { + var pd physicalDrive + if pair := strings.Split(stateReg.FindString(arr[i]), ":"); len(pair) == 2 { + pd.State = strings.TrimSpace(pair[1]) + if strings.Contains(pd.State, "Standby") { // 非硬盘设备 + continue + } + } + if pair := strings.Split(enclReg.FindString(arr[i]), ":"); len(pair) == 2 { + if pd.Enclosure, err = strconv.Atoi(strings.TrimSpace(pair[1])); err != nil { + return nil, err + } + } + if pair := strings.Split(slotReg.FindString(arr[i]), ":"); len(pair) == 2 { + if pd.Slot, err = strconv.Atoi(strings.TrimSpace(pair[1])); err != nil { + return nil, err + } + } + if pair := strings.Split(sizeReg.FindString(arr[i]), ":"); len(pair) == 2 { + if idx := strings.Index(pair[1], "/"); idx > 0 { + pd.Size = fmt.Sprintf("%s%s", + strings.TrimSpace(pair[1][:idx]), + strings.TrimPrefix(unitReg.FindString(pair[0]), "in"), + ) + } else { + pd.Size = strings.TrimSpace(pair[1]) + } + } + if pair := strings.Split(driveTypeReg.FindString(arr[i]), ":"); len(pair) == 2 { + pd.DriveType = strings.TrimSpace(pair[1]) + } + + items = append(items, pd) + } + return items, nil +} + +// physicalDriveIDs 根据入参的物理驱动器,返回由物理驱动器ID(Enclosure:Bay)组成的字符串切片。 +func physicalDriveIDs(items []physicalDrive) (ids []string) { + ids = make([]string, 0, len(items)) + for i := range items { + ids = append(ids, items[i].identity()) + } + return ids +} + +type pdScanFunc func(item *physicalDrive) bool + +// scanPDs 逐个扫描物理驱动器列表并返回满足所有过滤条件的物理驱动器 +func scanPDs(pds []physicalDrive, filters ...pdScanFunc) (items []physicalDrive) { + for i := range pds { + var unmatched bool + for j := range filters { + if !filters[j](&pds[i]) { + unmatched = true + break + } + } + if !unmatched { + items = append(items, pds[i]) + } + } + return items +} + +// sparePDs 若当前物理驱动器是用于热备,则返回true,反之返回false。 +func sparePDs(pd *physicalDrive) bool { + return pd != nil && strings.Contains(pd.State, "HotSpare") +} + +type volumeScanFunc func(item *volume) bool + +func scanVolumes(volumes []*volume, filters ...volumeScanFunc) (items []*volume) { + for i := range volumes { + var unmatched bool + for j := range filters { + if !filters[j](volumes[i]) { + unmatched = true + break + } + } + if !unmatched { + items = append(items, volumes[i]) + } + } + return items +} + +// findVolumesByLevel 查找指定RAID卡下指定级别的卷(RAID阵列/逻辑磁盘)列表。 +func (worker *worker) findVolumesByLevel(ctrlID string, level raid.Level) (items []*volume, err error) { + volumes, err := worker.volumes(ctrlID) + if err != nil { + return nil, err + } + for i := range volumes { + if volumes[i].RAIDLevel == strings.ToUpper(string(level)) { + items = append(items, volumes[i]) + } + } + return items, nil +} + +// volume 逻辑驱动器(卷/RAID阵列)。 +type volume struct { + VolumeID string + Status string + Size string + RAIDLevel string + Boot string + PhysicalDrives []string +} + +// volumes 返回指定controller索引下的逻辑驱动器列表 +func (worker *worker) volumes(ctrlID string) (items []*volume, err error) { + // sas3ircu 0 display + output, err := worker.Base.ExecByShell(tool, ctrlID, "display") + if err != nil { + return nil, nil + } + source := string(output) + begin := strings.Index(source, "IR Volume information") + end := strings.Index(source, "Physical device information") + if begin < 0 { + return nil, nil + } + return worker.parseVolumes(source[begin:end]) +} + +// parseVolumes 解析命令行输出中包含的卷信息 +func (worker *worker) parseVolumes(output string) (items []*volume, err error) { + blocks := strings.Split(output, "IR volume") + for i := range blocks { + if blocks[i] = strings.TrimSpace(blocks[i]); blocks[i] == "" { + continue + } + var item volume + + scanner := bufio.NewScanner(strings.NewReader(blocks[i])) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if line == "" { + continue + } + if strings.HasPrefix(line, "Volume ID") && strings.Contains(line, ":") { + item.VolumeID = worker.extractValue(line, colonSeparator) + + } else if strings.HasPrefix(line, "Status of volume") && strings.Contains(line, ":") { + item.Status = worker.extractValue(line, colonSeparator) + + } else if strings.HasPrefix(line, "RAID level") && strings.Contains(line, ":") { + item.RAIDLevel = worker.extractValue(line, colonSeparator) + + } else if strings.HasPrefix(line, "Size (in MB)") && strings.Contains(line, ":") { + item.Size = fmt.Sprintf("%s MB", worker.extractValue(line, colonSeparator)) + + } else if strings.HasPrefix(line, "Boot") && strings.Contains(line, ":") { + item.Boot = worker.extractValue(line, colonSeparator) + + } else if strings.Contains(line, "Enclosure#/Slot#") && strings.Contains(line, ":") { + item.PhysicalDrives = append(item.PhysicalDrives, worker.extractValue(line, colonSeparator)) + } + } + if item.VolumeID != "" { + items = append(items, &item) + } + if err = scanner.Err(); err != nil { + if log := worker.Base.GetLog(); log != nil { + log.Error(err) + } + return nil, err + } + } + return items, nil +} + +// checkGlobalHotSpares 检查单个RAID卡控制器的实际全局热备盘设置是否与预期配置一致 +func (worker *worker) checkGlobalHotSpares(ctrlID string, sett *raid.ControllerSetting) *hardware.CheckingItem { + if sett == nil || sett.Hotspares == "" { + return nil + } + item := hardware.CheckingItem{ + Title: fmt.Sprintf("[Controller%s] Set global hot spare(s)", ctrlID), + Expected: sett.Hotspares, + Matched: hardware.MatchedUnknown, + } + + pds, err := worker.physicalDrives(ctrlID) + if err != nil { + item.Error = err.Error() + return &item + } + + // 扫描查找所有已经分配作为热备的物理驱动器 + sparePDs := scanPDs(pds, sparePDs) + item.Actual = strings.Join(physicalDriveIDs(sparePDs), raid.Sep) + + spares := strings.Split(sett.Hotspares, raid.Sep) // 预期的用于备份的物理驱动器列表 + if len(sparePDs) != len(spares) { + item.Matched = hardware.MatchedNO + return &item + } + + for i := range sparePDs { + if !collection.InSlice(sparePDs[i].identity(), spares) { + item.Matched = hardware.MatchedNO + return &item + } + } + + item.Matched = hardware.MatchedYES + return &item +} + +// checkArrays 检查实际的RAID阵列是否与预期配置一致 +func (worker *worker) checkArrays(ctrlID string, arraySetts []raid.ArraySetting) (items []hardware.CheckingItem) { + if ctrlID == "" || len(arraySetts) == 0 { + return nil + } + for i := range arraySetts { + if item := worker.checkArray(ctrlID, &arraySetts[i]); item != nil { + items = append(items, *item) + } + } + return items +} + +// checkArray 检查指定的单个RAID阵列配置与实际是否一致 +func (worker *worker) checkArray(ctrlID string, sett *raid.ArraySetting) *hardware.CheckingItem { + if sett == nil { + return nil + } + item := hardware.CheckingItem{ + Title: fmt.Sprintf("[Controller%s] Create array", ctrlID), + Expected: fmt.Sprintf("%s@%s", strings.ToUpper(sett.Level), sett.Drives), + Matched: hardware.MatchedUnknown, + } + + level, err := raid.SelectLevel(sett.Level) + if err != nil { + item.Error = err.Error() + return &item + } + + arrays, err := worker.findVolumesByLevel(ctrlID, level) + if err != nil { + item.Error = err.Error() + return &item + } + + drives := strings.Split(sett.Drives, raid.Sep) // 预期的物理驱动器列表 + + switch len(arrays) { + case 0: + // 1、不存在与预期级别相同的阵列 + item.Matched = hardware.MatchedNO + item.Actual = fmt.Sprintf("missing %s", strings.ToUpper(sett.Level)) + return &item + + case 1: + // 2、存在一组与预期级别相同的阵列 + item.Actual = fmt.Sprintf("%s@%s", + strings.ToUpper(sett.Level), + strings.Join(arrays[0].PhysicalDrives, raid.Sep), + ) + + if len(arrays[0].PhysicalDrives) != len(drives) { + item.Matched = hardware.MatchedNO + return &item + } + + for _, pd := range arrays[0].PhysicalDrives { + if !collection.InSlice(pd, drives) { + item.Matched = hardware.MatchedNO + return &item + } + } + item.Matched = hardware.MatchedYES + return &item + } + + // 3、存在多组与预期级别相同的阵列(该RAID卡存在最多创建2组RAID阵列的限制) + item.Actual = fmt.Sprintf("%s@%s", + strings.ToUpper(sett.Level), + fmt.Sprintf("%s|%s", strings.Join(arrays[0].PhysicalDrives, raid.Sep), strings.Join(arrays[1].PhysicalDrives, raid.Sep)), + ) + + // 将首个预期的物理驱动器当作判断基准 + drive := drives[0] + + // 找出使用了当前物理驱动器的卷 + vs := scanVolumes(arrays, func(item *volume) bool { + return collection.InSlice(drive, item.PhysicalDrives) + }) + switch len(vs) { + case 0: // 未找到使用了当前物理驱动器的卷 + item.Matched = hardware.MatchedNO + return &item + + case 1: // 找到了使用当前物理驱动器的卷 + // 对比预期的物理驱动器数量与此卷所占用的物理驱动器的数量是否一致 + if len(vs[0].PhysicalDrives) != len(drives) { + item.Matched = hardware.MatchedNO + return &item + } + // 对比预期的物理驱动器列表与此卷所占用的物理驱动器是否完全一致 + for x := range drives { + if !collection.InSlice(drives[x], vs[0].PhysicalDrives) { + item.Matched = hardware.MatchedNO + return &item + } + } + item.Actual = fmt.Sprintf("%s@%s", + strings.ToUpper(sett.Level), + strings.Join(vs[0].PhysicalDrives, raid.Sep), + ) + item.Matched = hardware.MatchedYES + return &item + default: + // 理论上一块物理驱动器不可能存在于多个RAID阵列当中 + panic("unreachable") + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/lsisas3/raid.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/lsisas3/raid.go new file mode 100644 index 0000000000000000000000000000000000000000..8e4dd9e8eb3f9fa5a14196df211f883e6ece416d --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/lsisas3/raid.go @@ -0,0 +1,222 @@ +package lsisas3 + +import ( + "regexp" + "strconv" + "strings" + "sync" + + "idcos.io/cloudboot/hardware" + "idcos.io/cloudboot/hardware/raid" + "idcos.io/cloudboot/logger" +) + +const ( + // name RAID处理器名称 + name = raid.LSISAS3 + // tool 硬件配置工具 + tool = "sas3ircu" +) + +func init() { + raid.Register(name, new(worker)) +} + +type worker struct { + hardware.Base + mux sync.Mutex +} + +// SetDebug 设置是否开启debug。若开启debug,会将关键日志信息写入console。 +func (worker *worker) SetDebug(debug bool) { + worker.Base.SetDebug(debug) +} + +// SetLog 更换日志实现。默认情况下内部无日志实现。 +func (worker *worker) SetLog(log logger.Logger) { + worker.mux.Lock() + defer worker.mux.Unlock() + + worker.Base.SetLog(log) +} + +// Convert2ControllerID RAID卡控制器索引号转换成RAID卡控制器ID。 +// ctrlIndex RAID卡控制器索引号。0表示首块RAID卡,1表示第二块RAID卡,以此类推。 +// 如'HP SmartArray' RAID卡,若索引号为'0',那么可能转换获得的RAID卡控制器ID为'1',原因是这款RAID卡ID是从'1'开始的。 +// 如'LSI SAS3' RAID卡,若索引号为'0',那么可能转换获得的RAID卡控制器ID依然为'0',原因是这款RAID卡ID就是从'0'开始的。 +func (worker *worker) Convert2ControllerID(ctrlIndex uint) (ctrlID string, err error) { + ids, err := worker.controllerIDs() + if err != nil { + return "", err + } + if int(ctrlIndex) > len(ids)-1 { + return "", raid.ErrControllerNotFound + } + return ids[ctrlIndex], nil +} + +// Controllers 返回设备的RAID卡列表 +func (worker *worker) Controllers() (ctrls []raid.Controller, err error) { + ids, err := worker.controllerIDs() + if err != nil { + return nil, err + } + ctrls = make([]raid.Controller, 0, len(ids)) + for _, id := range ids { + ctrl, err := worker.findController(id) + if err != nil { + return nil, err + } + ctrls = append(ctrls, *ctrl) + } + return ctrls, nil +} + +// Clear 擦除raid +func (worker *worker) Clear(ctrlID string) (err error) { + _, err = worker.ExecByShell(tool, ctrlID, "delete", "noprompt") + worker.Sleep() + return err +} + +// InitLogicalDrives 初始化指定RAID卡控制器下的逻辑驱动器(逻辑磁盘)。 +func (worker *worker) InitLogicalDrives(ctrlID string) error { + // dd if=/dev/urandom of=/dev/sda bs=512 count=2 + // _, err := worker.Base.Exec("dd", "if", "/dev/urandom", "of", "/dev/sda", "bs", "512", "count", "2") + return raid.ErrInitLogicalDrivesNotSupport +} + +// PhysicalDrives 返回物理驱动器(物理磁盘)列表。 +func (worker *worker) PhysicalDrives(ctrlID string) (pds []raid.PhysicalDrive, err error) { + items, err := worker.physicalDrives(ctrlID) + if err != nil { + return nil, err + } + pds = make([]raid.PhysicalDrive, 0, len(items)) + for i := range items { + pds = append(pds, raid.PhysicalDrive{ + ID: strconv.Itoa(items[i].Slot), + Name: items[i].identity(), + RawSize: items[i].Size, + MediaType: items[i].DriveType, + }) + } + return pds, nil +} + +// TranslateLegacyDisks 将目标RAID卡控制器下传统"1|2,3|4-6|7-|all"形式的硬盘标识符转换成实际的物理驱动器。 +func (worker *worker) TranslateLegacyDisks(ctrlID string, legacyDisks string) (drives []string, err error) { + pds, err := worker.physicalDrives(ctrlID) + if err != nil { + return nil, err + } + if regexp.MustCompile("^[[:digit:]]+$").MatchString(legacyDisks) { + diskNo, _ := strconv.Atoi(legacyDisks) + return findPhysicalDriveIDsByIndexes(pds, diskNo-1) + + } else if regexp.MustCompile("^[[:digit:],]+$").MatchString(legacyDisks) { + diskNos := strings.Split(legacyDisks, ",") + indexes := make([]int, 0, len(diskNos)) + + for _, fields := range diskNos { + diskNo, _ := strconv.Atoi(fields) + indexes = append(indexes, diskNo-1) + } + return findPhysicalDriveIDsByIndexes(pds, indexes...) + + } else if regexp.MustCompile("^[[:digit:]-]+[[:digit:]]$").MatchString(legacyDisks) { + arr := strings.Split(legacyDisks, "-") + if len(arr) != 2 { + return nil, raid.ErrInvalidDiskIdentity + } + begin, _ := strconv.Atoi(arr[0]) + end, _ := strconv.Atoi(arr[1]) + if begin >= end { + return nil, raid.ErrInvalidDiskIdentity + } + if begin > len(pds) || end > len(pds) { + return nil, raid.ErrInvalidDiskIdentity + } + var indexes []int + for diskNo := begin; diskNo <= end; diskNo++ { + indexes = append(indexes, diskNo-1) + } + return findPhysicalDriveIDsByIndexes(pds, indexes...) + + } else if regexp.MustCompile("^[[:digit:]]+-$").MatchString(legacyDisks) { + arr := strings.Split(legacyDisks, "-") + begin, _ := strconv.Atoi(arr[0]) + if begin > len(pds) { + return nil, raid.ErrInvalidDiskIdentity + } + var indexes []int + for diskNo := begin; diskNo <= len(pds); diskNo++ { + indexes = append(indexes, diskNo-1) + } + return findPhysicalDriveIDsByIndexes(pds, indexes...) + + } else if legacyDisks == "all" { + return findPhysicalDriveIDsByIndexes(pds) + } + return nil, raid.ErrInvalidDiskIdentity +} + +// CreateArray 用指定的物理磁盘和RAID级别创建阵列(逻辑磁盘) +func (worker *worker) CreateArray(ctrlID string, level raid.Level, drives []string) (err error) { + if level != raid.RAID0 && level != raid.RAID1 && level != raid.RAID1E && level != raid.RAID10 { + return raid.ErrUnsupportedLevel + } + args := []string{ctrlID, "create", string(level), "max"} + args = append(args, drives...) + args = append(args, "noprompt") + _, err = worker.ExecByShell(tool, args...) + worker.Sleep() + return err +} + +// SetGlobalHotspares 添加热备盘 +func (worker *worker) SetGlobalHotspares(ctrlID string, drives []string) (err error) { + for i := range drives { + if err = worker.hotspare(ctrlID, drives[i], false); err != nil { + return err + } + } + worker.Sleep() + return nil +} + +// SetJBODs 将指定RAID卡控制器设置为直通模式,或者将RAID卡控制器下部分物理驱动器设置为直通模式。 +// ctrlID 表示RAID卡控制器ID,通过Convert2ControllerID方法可获取到第N块RAID卡的控制器ID。 +// drives 物理驱动器列表。该RAID卡不支持将部分物理驱动器设置为直通模式,因此该参数并不会有实际作用。 +func (worker *worker) SetJBODs(ctrlID string, drives []string) (err error) { + // 参考: http://support.huawei.com/enterprise/docinforeader!loadDocument1.action?contentId=DOC1000004345&partNo=10102#it_server_sas2308_200015_2 + _, err = worker.ExecByShell(tool, ctrlID, "delete", "noprompt") + worker.Sleep() + return err +} + +// PostCheck RAID配置实施后置检查 +func (worker *worker) PostCheck(sett *raid.Setting) (items []hardware.CheckingItem) { + for i := range sett.Controllers { + ctrlID, err := worker.Convert2ControllerID(sett.Controllers[i].Index) + if err != nil { + items = append(items, hardware.CheckingItem{ + Title: "Get controller ID", + Matched: hardware.MatchedUnknown, + Error: err.Error(), + }) + continue + } + items = append(items, worker.checkArrays(ctrlID, sett.Controllers[i].Arrays)...) + + if item := worker.checkGlobalHotSpares(ctrlID, &sett.Controllers[i]); item != nil { + items = append(items, *item) + } + } + return items +} + +// 返回 worker 所使用的cmdline +func (worker *worker) GetCMDLine() string { + return tool +} \ No newline at end of file diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/raid.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/raid.go new file mode 100644 index 0000000000000000000000000000000000000000..7338f1a7673dd6bd6dce35ced81d4f99133b796c --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/raid.go @@ -0,0 +1,228 @@ +package raid + +import ( + "bytes" + "errors" + "os/exec" + "strings" + + "idcos.io/cloudboot/hardware" + "idcos.io/cloudboot/logger" + "strconv" +) + +const ( + // AvagoMegaRAID RAID实现-Avago MegaRAID + AvagoMegaRAID = "AVAGO_MEGA_RAID" + // LSIMegaRAID RAID实现-LSI MegaRAID + LSIMegaRAID = "LSI_MEGA_RAID" + // HPSmartArray RAID实现-HP SmartArray + HPSmartArray = "HP_SMART_ARRAY" + // HPESmartArray RAID实现-HPE SmartArray + HPESmartArray = "HPE_SMART_ARRAY" + // LSISAS2 RAID实现-LSI SAS2 + LSISAS2 = "LSI_SAS2" + // LSISAS3 RAID实现-LSI SAS3 + LSISAS3 = "LSI_SAS3" + // AdaptecSmartRAID RAID实现-Adaptec Smart Storage + AdaptecSmartRAID = "ADAPTEC_SMART_RAID" + +) + +// Level RAID级别 +type Level string + +var ( + // RAID0 RAID级别-RAID0 + RAID0 Level = "raid0" + // RAID1 RAID级别-RAID1 + RAID1 Level = "raid1" + // RAID5 RAID级别-RAID5 + RAID5 Level = "raid5" + // RAID6 RAID级别-RAID6 + RAID6 Level = "raid6" + // RAID10 RAID级别-RAID10 + RAID10 Level = "raid10" + // RAID1E RAID级别-RAID1E + RAID1E Level = "raid1e" + // RAID50 RAID级别-RAID50 + RAID50 Level = "raid50" + // RAID60 RAID级别-RAID60 + RAID60 Level = "raid60" +) + +// MustSelectLevel 返回指定的RAID级别 +func MustSelectLevel(level string) Level { + l, err := SelectLevel(level) + if err != nil { + panic(err.Error()) + } + return l +} + +// SelectLevel 返回指定的RAID级别 +func SelectLevel(level string) (Level, error) { + switch strings.ToLower(level) { + case string(RAID0): + return RAID0, nil + case string(RAID1): + return RAID1, nil + case string(RAID10): + return RAID10, nil + case string(RAID1E): + return RAID1E, nil + case string(RAID5): + return RAID5, nil + case string(RAID50): + return RAID50, nil + case string(RAID6): + return RAID6, nil + case string(RAID60): + return RAID60, nil + } + return "", ErrRAIDLevel +} + +// Whoami 返回当前的RAID硬件对应的处理器名 +func Whoami() (worker string, err error) { + output, err := exec.Command("lspci").Output() + if err != nil { + return AvagoMegaRAID,nil + } + + if bytes.Contains(output, []byte("MegaRAID")) { + arch, _ := exec.Command("uname", "-m").Output() + if len(arch) > 0 && strings.Contains(string(arch), "aarch64") { + return AvagoMegaRAID, nil + } + return LSIMegaRAID, nil + + } else if bytes.Contains(output, []byte("Smart Array")) { + return HPSmartArray, nil + + } else if bytes.Contains(output, []byte("Adaptec Smart")) { + return AdaptecSmartRAID, nil + + } else if bytes.Contains(output, []byte("SAS2004")) || + bytes.Contains(output, []byte("SAS2008")) || + bytes.Contains(output, []byte("SAS2108")) || + bytes.Contains(output, []byte("SAS2208")) || + bytes.Contains(output, []byte("SAS2304")) || + bytes.Contains(output, []byte("SAS2308")) { + return LSISAS2, nil + + } else if bytes.Contains(output, []byte("SAS3004")) || bytes.Contains(output, []byte("SAS3008")) { + return LSISAS3, nil + + } + //给个默认值 + return AvagoMegaRAID,nil +} + +var ( + // ErrRAIDLevel 无效的RAID级别 + ErrRAIDLevel = errors.New("error RAID level") + // ErrUnknownHardware 未知的RAID硬件 + ErrUnknownHardware = errors.New("unknown RAID hardware") + // ErrControllerNotFound RAID controller未发现 + ErrControllerNotFound = errors.New("controller not found") + // ErrPhysicalDriveNotFound 指定的物理驱动器未发现 + ErrPhysicalDriveNotFound = errors.New("specified physical drive not found") + // ErrUnsupportedLevel 不支持的RAID级别 + ErrUnsupportedLevel = errors.New("unsupported RAID level") + // ErrInitLogicalDrivesNotSupport 暂不支持初始化逻辑磁盘 + ErrInitLogicalDrivesNotSupport = errors.New("initializing logical drives is not supported") + // ErrJBODModeNotSupport 不支持JBOD模式 + ErrJBODModeNotSupport = errors.New("JBOD mode is not supported") + // ErrUnsupportedRAIDManagingMode 暂不支持的RAID管理模式 + ErrUnsupportedRAIDManagingMode = errors.New("unsupported RAID managing mode") + // ErrInvalidDiskIdentity 无效的硬盘标识 + ErrInvalidDiskIdentity = errors.New("invalid disk identity") +) + +// PhysicalDrive 物理驱动器(物理磁盘) +type PhysicalDrive struct { + ID string `json:"id"` + Name string `json:"name"` // 唯一标识 + RawSize string `json:"raw_size"` + MediaType string `json:"media_type"` + ControllerID string `json:"controller_id"` // 所属的RAID卡控制器编号 +} + +// Controller RAID控制器,指代一块RAID卡硬件。 +type Controller struct { + ID string `json:"id"` // 唯一标识/编号 + ModelName string `json:"model_name"` // 型号 + FirmwareVersion string `json:"firmware_version"` // 固件版本 + Mode string `json:"mode"` // 当前所处模式RAID/JBOD(HBA) +} + +//实现按RawSize从小到大排序 +type PDSlice []struct{ + Index int + PhysicalDrive +} + +func (pds PDSlice) Len() int { + return len(pds) +} +func (pds PDSlice) Less(i, j int) bool { + fi, fj := 0.0, 0.0 + if strings.Contains(pds[i].RawSize, "TB") { + fi, _ = strconv.ParseFloat(strings.TrimSpace(strings.Replace(pds[i].RawSize, "TB", "", -1)), 64) + fi *= 1000 + } else { + fi, _ = strconv.ParseFloat(strings.TrimSpace(strings.Replace(pds[i].RawSize, "GB", "", -1)), 64) + } + if strings.Contains(pds[j].RawSize, "TB") { + fj, _ = strconv.ParseFloat(strings.TrimSpace(strings.Replace(pds[j].RawSize, "TB", "", -1)), 64) + fj *= 1000 + } else { + fj, _ = strconv.ParseFloat(strings.TrimSpace(strings.Replace(pds[j].RawSize, "GB", "", -1)), 64) + } + return fi < fj +} +func (pds PDSlice) Swap(i, j int) { + pds[i], pds[j] = pds[j], pds[i] +} + +// Worker RAID处理器接口 +type Worker interface { + // SetDebug 设置是否开启debug。若开启debug,会将关键日志信息写入console。 + SetDebug(debug bool) + // SetLog 更换日志实现。默认情况下内部无日志实现。 + SetLog(log logger.Logger) + // Convert2ControllerID RAID卡控制器索引号转换成RAID卡控制器ID。 + // ctrlIndex RAID卡控制器索引号。0表示首块RAID卡,1表示第二块RAID卡,以此类推。 + // 如'HP SmartArray' RAID卡,若索引号为'0',那么可能转换获得的RAID卡控制器ID为'1',原因是这款RAID卡ID是从'1'开始的。 + // 如'LSI SAS3' RAID卡,若索引号为'0',那么可能转换获得的RAID卡控制器ID依然为'0',原因是这款RAID卡ID就是从'0'开始的。 + Convert2ControllerID(ctrlIndex uint) (ctrlID string, err error) + // Controllers 返回设备的RAID卡控制器列表。 + Controllers() (ctrls []Controller, err error) + // PhysicalDrives 返回指定RAID卡控制器的物理驱动器(物理磁盘)列表。 + // ctrlID 表示RAID卡控制器ID,通过Convert2ControllerID方法可获取到第N块RAID卡的控制器ID。 + PhysicalDrives(ctrlID string) (pds []PhysicalDrive, err error) + // Clear 擦除指定RAID卡控制器的配置。 + // ctrlID 表示RAID卡控制器ID,通过Convert2ControllerID方法可获取到第N块RAID卡的控制器ID。 + Clear(ctrlID string) error + // InitLogicalDrives 初始化指定RAID卡控制器下的逻辑驱动器(逻辑磁盘)。 + InitLogicalDrives(ctrlID string) error + // TranslateLegacyDisks 将目标RAID卡控制器下传统"1|2,3|4-6|7-|all"形式的硬盘标识符转换成实际的物理驱动器。 + TranslateLegacyDisks(ctrlID string, legacyDisks string) (drives []string, err error) + // CreateArray 在指定RAID卡控制器下的若干物理驱动器上创建指定级别的阵列(逻辑磁盘)。 + // ctrlID 表示RAID卡控制器ID,通过Convert2ControllerID方法可获取到第N块RAID卡的控制器ID。 + // level RAID级别,不同的RAID卡所支持的级别有所差异。 + // drives 物理驱动器列表。PhysicalDrives方法可获得的物理驱动器信息列表,其中'Name'属性即为某个物理驱动器标识。 + CreateArray(ctrlID string, level Level, drives []string) error + // SetGlobalHotspares 将指定RAID卡下的物理驱动器设置为全局热备盘。 + // ctrlID 表示RAID卡控制器ID,通过Convert2ControllerID方法可获取到第N块RAID卡的控制器ID。 + SetGlobalHotspares(ctrlID string, drives []string) error + // SetJBODs 将指定RAID卡控制器设置为直通模式,或者将RAID卡控制器下部分物理驱动器设置为直通模式。 + // ctrlID 表示RAID卡控制器ID,通过Convert2ControllerID方法可获取到第N块RAID卡的控制器ID。 + // drives 物理驱动器列表。若物理驱动器列表为空,则意味着将指定的RAID卡下所有的物理驱动器都设置为直通模式。 + SetJBODs(ctrlID string, drives []string) error + // PostCheck RAID配置实施后置检查 + PostCheck(sett *Setting) []hardware.CheckingItem + // GetCMDLine 返回 worker 所使用的cmdline + GetCMDLine() string +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/register.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/register.go new file mode 100644 index 0000000000000000000000000000000000000000..efaa0f4b4a64b4efdfbe3fa6ce5cdfd98f251422 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/register.go @@ -0,0 +1,49 @@ +package raid + +import ( + "strings" + "sync" +) + +// workerPool 处理RAID工作的工人池 +var workerPool = make(map[string]Worker) +var mux sync.Mutex + +// Register 注册RAID阵列卡硬件及其处理worker实例 +func Register(name string, worker Worker) { + mux.Lock() + defer mux.Unlock() + if worker == nil { + panic("raid: Register worker is nil") + } + name = strings.ToUpper(name) + if _, dup := workerPool[name]; dup { + panic("raid: Register called twice for worker " + name) + } + workerPool[name] = worker +} + +// Registered 返回已注册的RAID硬件 +func Registered() (items []string) { + mux.Lock() + defer mux.Unlock() + + for key := range workerPool { + items = append(items, key) + } + return items +} + +// SelectWorker 根据RAID硬件名称获取相应的Worker +func SelectWorker(name string) Worker { + mux.Lock() + defer mux.Unlock() + + name = strings.ToUpper(name) + for key := range workerPool { + if key == name { + return workerPool[key] + } + } + return nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/setting.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/setting.go new file mode 100644 index 0000000000000000000000000000000000000000..69b49fe6f8b509054ce4a9bc48459acbc11e2210 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/cloudboot/hardware/raid/setting.go @@ -0,0 +1,30 @@ +package raid + +const ( + // Sep 驱动器分隔符 + Sep = "," + // 空格分隔符(AdaptecSamrtRAID) + SpaceSep = " " +) + +// Setting RAID配置参数 +type Setting struct { + Controllers []ControllerSetting `json:"controllers"` +} + +// ControllerSetting 单块RAID卡控制器配置 +type ControllerSetting struct { + Index uint `json:"index"` // RAID控制器索引号。注意,此'索引号'代表的是RAID卡的顺序号(多块RAID卡场景下),自'0'始。0表示首块RAID卡,以此类推。 + Clear string `json:"clear,omitempty"` // 是否擦除当前RAID卡的配置。可选值: ON|OFF + DiskInit string `json:"disk_init,omitempty"` // 是否初始化逻辑磁盘。可选值: ON|OFF + Hotspares string `json:"hotspares,omitempty"` // 全局热备盘物理驱动器。多个物理驱动用英文逗号分隔。 + JBODs string `json:"jbods,omitempty"` // 待设置为直通盘的物理驱动器。多个物理驱动用英文逗号分隔。 + Arrays []ArraySetting `json:"arrays"` // 独立冗余磁盘阵列 +} + +// ArraySetting 单组RAID配置参数 +type ArraySetting struct { + Level string `json:"level,omitempty"` // RAID级别 + Drives string `json:"drives,omitempty"` // 物理驱动器标识。多个物理驱动用英文逗号分隔。 + Hotspares string `json:"hotspares,omitempty"` // 局部热备盘物理驱动器(保留属性,暂未使用)。多个物理驱动用英文逗号分隔。 +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/uam-go/client.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/uam-go/client.go new file mode 100644 index 0000000000000000000000000000000000000000..34afa206e14aa1fb0d7fcdcdafda4dcf45d250f4 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/uam-go/client.go @@ -0,0 +1,71 @@ +package uam + +import "fmt" + +const ( + // Version 库版本号 + Version = "0.2.0" +) + +// Client UAM客户端 +type Client struct { + log Logger + conf *Config +} + +// NewClient 实例化 +func NewClient(rootEndpoint, token string, options ...SetOptionFunc) *Client { + c := Config{ + RootEndpoint: rootEndpoint, + Token: token, + } + for _, f := range options { + f(&c) + } + c.LoadDefault() + return &Client{ + log: defaultLog, + conf: &c, + } +} + +const ( + success = "success" +) + +const ( + tokenHeaderName = "access-token" + acceptHeaderName = "Accept" + contentTypeHeaderName = "Content-Type" + appIDParam = "appId" + tokenParam = "token" +) + +const ( + jsonMediaType = "application/json" +) + +func (cli *Client) acceptJSONHeader() (string, string) { + return acceptHeaderName, jsonMediaType +} + +func (cli *Client) contentTypeJSONHeader() (string, string) { + return contentTypeHeaderName, jsonMediaType +} + +func (cli *Client) tokenHeader() (string, string) { + return tokenHeaderName, fmt.Sprintf("Bearer %s", cli.conf.Token) +} + +// PageLimiter 分页限制 +type PageLimiter struct { + PageNo int64 + PageSize int64 +} + +func genDefaultPageLimiter() *PageLimiter { + return &PageLimiter{ + PageNo: 1, + PageSize: 10, + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/uam-go/config.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/uam-go/config.go new file mode 100644 index 0000000000000000000000000000000000000000..895518b12384d5c7b29c0abb8f9c2076d2be81ae --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/uam-go/config.go @@ -0,0 +1,46 @@ +package uam + +// Config 配置项 +type Config struct { + // RootEndpoint UAM系统的根URL路径(不以'/'结尾) + RootEndpoint string + // TenantID 租户ID + TenantID string + // Token UAM系统的access token + Token string + // Log 日志实现 + Log Logger +} + +const ( + // DefaultTenantID 默认租户名 + DefaultTenantID = "default" +) + +// LoadDefault 加载默认的配置项 +func (c *Config) LoadDefault() { + if c.TenantID == "" { + c.TenantID = DefaultTenantID + } + + if c.Log == nil { + c.Log = defaultLog + } +} + +// SetOptionFunc 函数式选项设置器 +type SetOptionFunc func(c *Config) + +// TenantOption 返回设置租户ID选项的函数 +func TenantOption(tenantID string) SetOptionFunc { + return func(c *Config) { + c.TenantID = tenantID + } +} + +// LogOption 返回设置日志选项的函数 +func LogOption(log Logger) SetOptionFunc { + return func(c *Config) { + c.Log = log + } +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/uam-go/error.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/uam-go/error.go new file mode 100644 index 0000000000000000000000000000000000000000..82aac8a40066cff2771fc0f5765ab3090531467b --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/uam-go/error.go @@ -0,0 +1,17 @@ +package uam + +import "fmt" + +func wrapErr(err error) error { + if err == nil { + return nil + } + return wrapErrString(err.Error()) +} + +func wrapErrString(err string) error { + if err == "" { + return nil + } + return fmt.Errorf("[UAM]%s", err) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/uam-go/log.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/uam-go/log.go new file mode 100644 index 0000000000000000000000000000000000000000..68b943d47ab4ee006dbe49b00da6400b0c3f030a --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/uam-go/log.go @@ -0,0 +1,78 @@ +package uam + +import "github.com/astaxie/beego/logs" + +// Logger 系统logger接口 +type Logger interface { + // Debug logs a debug message. If last parameter is a map[string]string, it's content + // is added as fields to the message. + Debug(v ...interface{}) + // Debug logs a debug message with format. If last parameter is a map[string]string, + // it's content is added as fields to the message. + Debugf(format string, v ...interface{}) + // Info logs a info message. If last parameter is a map[string]string, it's content + // is added as fields to the message. + Info(v ...interface{}) + // Info logs a info message with format. If last parameter is a map[string]string, + // it's content is added as fields to the message. + Infof(format string, v ...interface{}) + // Warn logs a warning message. If last parameter is a map[string]string, it's content + // is added as fields to the message. + Warn(v ...interface{}) + // Warn logs a warning message with format. If last parameter is a map[string]string, + // it's content is added as fields to the message. + Warnf(format string, v ...interface{}) + // Error logs an error message. If last parameter is a map[string]string, it's content + // is added as fields to the message. + Error(v ...interface{}) + // Error logs an error message with format. If last parameter is a map[string]string, + // it's content is added as fields to the message. + Errorf(format string, v ...interface{}) +} + +// defaultLog 默认日志(输出到控制台) +var defaultLog = newBeeLog() + +type beeLog struct { + l *logs.BeeLogger +} + +func newBeeLog() Logger { + l := logs.NewLogger(1000) + l.SetLogger(logs.AdapterConsole) + return &beeLog{ + l: l, + } +} + +func (log *beeLog) Debug(v ...interface{}) { + log.l.Debug("%v", v...) +} + +func (log *beeLog) Debugf(format string, v ...interface{}) { + log.l.Debug(format, v...) +} + +func (log *beeLog) Info(v ...interface{}) { + log.l.Info("%v", v...) +} + +func (log *beeLog) Infof(format string, v ...interface{}) { + log.l.Info(format, v...) +} + +func (log *beeLog) Warn(v ...interface{}) { + log.l.Warn("%v", v...) +} + +func (log *beeLog) Warnf(format string, v ...interface{}) { + log.l.Warn(format, v...) +} + +func (log *beeLog) Error(v ...interface{}) { + log.l.Error("%v", v...) +} + +func (log *beeLog) Errorf(format string, v ...interface{}) { + log.l.Error(format, v...) +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/uam-go/user.go b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/uam-go/user.go new file mode 100644 index 0000000000000000000000000000000000000000..5f66cd8ce471672aa7ae25a2754f4b0e95b04d7e --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/idcos.io/uam-go/user.go @@ -0,0 +1,278 @@ +package uam + +import ( + "errors" + "fmt" + "net/http" + "net/url" + + resty "gopkg.in/resty.v1" +) + +const ( + // UserStatusEnabled 用户帐号状态-可用(激活) + UserStatusEnabled = "ENABLED" + // UserStatusDisabled 用户帐号状态-禁用 + UserStatusDisabled = "DISABLED" +) + +// Tenant 租户 +type Tenant struct { + ID string `json:"tenantId"` + Name string `json:"tenantName"` +} + +// Department 部门 +type Department struct { + ID string `json:"deptId"` + Name string `json:"deptName"` +} + +// User 用户 +type User struct { + Tenant + Department + Token string `json:"token"` + ID string `json:"id"` + LoginID string `json:"loginId"` + Name string `json:"name"` + Email string `json:"email"` + IsActive string `json:"isActive"` + Status string `json:"status"` + Permissions map[string][]string `json:"permissions"` + Roles []string `json:"roleIds"` + Groups []string `json:"userGroups"` +} + +// PermissionCodes 返回指定'权限资源类型'的权限码 +func (u *User) PermissionCodes(category string) []string { + if len(u.Permissions) <= 0 { + return []string{} + } + codes, ok := u.Permissions[category] + if !ok { + return []string{} + } + return codes +} + +var ( + // ErrUnauthenticatedUser 未认证用户错误 + ErrUnauthenticatedUser = errors.New("[UAM]unauthenticated user") + + // ErrCallUAM 调用UAM发生非预期错误 + ErrCallUAM = errors.New("[UAM]call UAM error") +) + +// AuthUser 返回指定系统下指定Token的用户信息。若Token非法,则返回ErrUnauthorizedUser错误。 +func (cli *Client) AuthUser(appID string) (*User, error) { + url := fmt.Sprintf("%s/rbac/api/authInfo", cli.conf.RootEndpoint) + cli.log.Debugf("Fetch user ==> GET %s?appId=%s&token=***", url, appID) + + var respData struct { + Status string `json:"status"` + Message string `json:"message"` + Errors string `json:"errors"` + User User `json:"content"` + } + + resp, err := resty.New().NewRequest(). + SetHeader(cli.tokenHeader()). + SetHeader(cli.acceptJSONHeader()). + SetQueryParam(appIDParam, appID). + SetQueryParam(tokenParam, cli.conf.Token). + SetResult(&respData). + Get(url) + + if err != nil { + cli.log.Error(err) + return nil, wrapErr(err) + } + + if resp.StatusCode() == http.StatusBadRequest || resp.StatusCode() == http.StatusUnauthorized { + cli.log.Warnf("Fetch user ==> GET %s?appId=%s&token=***\nHTTP Status Code: %d\nResponse body: %s", url, appID, resp.StatusCode(), resp.Body()) + return nil, ErrUnauthenticatedUser + } + if resp.StatusCode() != http.StatusOK { + cli.log.Warnf("Fetch user ==> GET %s?appId=%s&token=***\nHTTP Status Code: %d\nResponse body: %s", url, appID, resp.StatusCode(), resp.Body()) + return nil, ErrCallUAM + } + + if respData.Status != success { + cli.log.Warnf("Fetch user ==> GET %s?appId=%s&token=***\nHTTP Status Code: %d\nResponse body: %s", url, appID, resp.StatusCode(), resp.Body()) + return nil, ErrUnauthenticatedUser // uam封装不友好,若token格式非法,如token=123,会响应200状态码。 + } + return &respData.User, nil +} + +// ChangeUserPassword 修改用户密码。 +// userID-用户ID,必选。 +// oldPwd-旧密码,必选。 +// newPwd-新密码,必选。 +func (cli *Client) ChangeUserPassword(userID, oldPwd, newPwd string) error { + url := fmt.Sprintf("%s/rbac/api/modifyPW", cli.conf.RootEndpoint) + cli.log.Debugf("Change user password ==> POST %s", url) + + var respData struct { + Status string `json:"status"` + Message string `json:"message"` + } + + resp, err := resty.New().NewRequest(). + SetHeader(cli.tokenHeader()). + SetHeader(cli.contentTypeJSONHeader()). + SetHeader(cli.acceptJSONHeader()). + SetBody(map[string]string{ + "userId": userID, + "oldPassword": oldPwd, + "newPassword": newPwd, + }). + SetResult(&respData). + Post(url) + + if err != nil { + cli.log.Error(err) + return wrapErr(err) + } + + if resp.StatusCode() == http.StatusUnauthorized { + cli.log.Warnf("Change user password ==> POST %s\nHTTP Status Code: %d\nResponse body: %s", url, resp.StatusCode(), resp.Body()) + return ErrUnauthenticatedUser + } + + if respData.Status != success { + cli.log.Warnf("Change user password ==> POST %s\nHTTP Status Code: %d\nResponse body: %s", url, resp.StatusCode(), resp.Body()) + return wrapErrString(respData.Message) + } + return nil +} + +// GetUsers 查询当前租户下满足过滤条件的用户列表。 +// deptID-部门ID,可选。 +// name-用户名,可选。 +// limit-分页限制,可选。默认pageNo为1,pageSize为10。 +func (cli *Client) GetUsers(deptID, name string, limit *PageLimiter) (pageNo, pageSize, totalPages, totalRecords int64, users []*User, err error) { + if limit == nil { + limit = genDefaultPageLimiter() + } + url := fmt.Sprintf("%s/rbac/api/pageList?tenantId=%s&deptId=%s&name=%s&pageNo=%d&pageSize=%d", + cli.conf.RootEndpoint, cli.conf.TenantID, deptID, url.QueryEscape(name), limit.PageNo, limit.PageSize) + + cli.log.Debugf("Fetch users ==> GET %s", url) + + var respData struct { + Status string `json:"status"` + Message string `json:"message"` + Content struct { + PageNo int64 `json:"pageNo"` + PageSize int64 `json:"pageSize"` + TotalPages int64 `json:"totalPage"` + TotalRecords int64 `json:"totalCount"` + Records []*User `json:"list"` + } `json:"content"` + } + + resp, err := resty.New().NewRequest(). + SetHeader(cli.tokenHeader()). + SetHeader(cli.acceptJSONHeader()). + SetResult(&respData). + Get(url) + + if err != nil { + cli.log.Error(err) + return pageNo, pageSize, totalPages, totalRecords, nil, wrapErr(err) + } + + if resp.StatusCode() == http.StatusUnauthorized { + cli.log.Warnf("Fetch users ==> GET %s\nHTTP Status Code: %d\nResponse body: %s", url, resp.StatusCode(), resp.Body()) + return pageNo, pageSize, totalPages, totalRecords, nil, ErrUnauthenticatedUser + } + + if respData.Status != success { + cli.log.Warnf("Fetch users ==> GET %s\nHTTP Status Code: %d\nResponse body: %s", url, resp.StatusCode(), resp.Body()) + return pageNo, pageSize, totalPages, totalRecords, nil, wrapErrString(respData.Message) + } + + return respData.Content.PageNo, + respData.Content.PageSize, + respData.Content.TotalPages, + respData.Content.TotalRecords, + respData.Content.Records, nil +} + +// ErrUserNotFound 用户不存在 +var ErrUserNotFound = errors.New("[UAM]user not found") + +// GetUserByID 返回指定ID的用户。 +// id-用户ID,必选。 +func (cli *Client) GetUserByID(id string) (use *User, err error) { + url := fmt.Sprintf("%s/rbac/api/account/id?id=%s", cli.conf.RootEndpoint, id) + + cli.log.Debugf("Fetch user ==> GET %s", url) + + var respData struct { + Status string `json:"status"` + Message string `json:"message"` + Content User `json:"content"` + } + + resp, err := resty.New().NewRequest(). + SetHeader(cli.tokenHeader()). + SetHeader(cli.acceptJSONHeader()). + SetResult(&respData). + Get(url) + + if err != nil { + cli.log.Error(err) + return nil, wrapErr(err) + } + + if resp.StatusCode() == http.StatusUnauthorized { + cli.log.Warnf("Fetch user ==> GET %s\nHTTP Status Code: %d\nResponse body: %s", url, resp.StatusCode(), resp.Body()) + return nil, ErrUnauthenticatedUser + } + + if respData.Status != success { + cli.log.Warnf("Fetch user ==> GET %s\nHTTP Status Code: %d\nResponse body: %s", url, resp.StatusCode(), resp.Body()) + return nil, ErrUserNotFound // UAM不能明确区分'用户不存在错误'与其他错误(如数据库错误) + } + + return &respData.Content, nil +} + +// GetUserByLoginID 返回当前租户下指定登录名的用户。 +// loginid-用户登录名,必选。 +func (cli *Client) GetUserByLoginID(loginID string) (use *User, err error) { + url := fmt.Sprintf("%s/rbac/api/account/getByAccountNo?tenantId=%s&accountNo=%s", cli.conf.RootEndpoint, cli.conf.TenantID, loginID) + + cli.log.Debugf("Fetch user ==> GET %s", url) + + var respData struct { + Status string `json:"status"` + Message string `json:"message"` + Content User `json:"content"` + } + + resp, err := resty.New().NewRequest(). + SetHeader(cli.tokenHeader()). + SetHeader(cli.acceptJSONHeader()). + SetResult(&respData). + Get(url) + + if err != nil { + cli.log.Error(err) + return nil, wrapErr(err) + } + + if resp.StatusCode() == http.StatusUnauthorized { + cli.log.Warnf("Fetch user ==> GET %s\nHTTP Status Code: %d\nResponse body: %s", url, resp.StatusCode(), resp.Body()) + return nil, ErrUnauthenticatedUser + } + + if respData.Status != success { + cli.log.Warnf("Fetch user ==> GET %s\nHTTP Status Code: %d\nResponse body: %s", url, resp.StatusCode(), resp.Body()) + return nil, ErrUserNotFound // UAM不能明确区分'用户不存在错误'与其他错误(如数据库错误) + } + + return &respData.Content, nil +} diff --git a/cyclone-server/src/idcos.io/cloudboot/vendor/vendor.json b/cyclone-server/src/idcos.io/cloudboot/vendor/vendor.json new file mode 100644 index 0000000000000000000000000000000000000000..8c0fd58b8be06ac6a839743cc5c4073aea61b5f1 --- /dev/null +++ b/cyclone-server/src/idcos.io/cloudboot/vendor/vendor.json @@ -0,0 +1,324 @@ +{ + "comment": "", + "ignore": "test", + "package": [ + { + "checksumSHA1": "1nYrwdzLSEa79ckiyLlLJzXy/qc=", + "path": "bou.ke/monkey", + "revision": "e8ac0cba3b42082cac2c6549eaa3c60f18373c76", + "revisionTime": "2018-09-14T09:56:44Z" + }, + { + "checksumSHA1": "pALQE1Z3IJ9rvvir/Zg1hOt8X0I=", + "path": "github.com/Unknwon/goconfig", + "revision": "5aa4f8cd5a472c2411c778b4680f59f2223f1966", + "revisionTime": "2016-08-28T12:49:05Z" + }, + { + "checksumSHA1": "dWgEPq8x7MKYs5/W94TLusoh1b8=", + "path": "github.com/astaxie/beego/httplib", + "revision": "053a075344c118a5cc41981b29ef612bb53d20ca", + "revisionTime": "2018-07-31T13:18:48Z" + }, + { + "checksumSHA1": "OksAzF6VvpfTlte99lpVNV+iSnY=", + "path": "github.com/astaxie/beego/logs", + "revision": "053a075344c118a5cc41981b29ef612bb53d20ca", + "revisionTime": "2018-07-31T13:18:48Z" + }, + { + "checksumSHA1": "ucu0eJ90b2Jlj+KPt0YJzGfwm7s=", + "path": "github.com/axgle/mahonia", + "revision": "c528b747d92d41ca581a7acf3e604c396fc7c034", + "revisionTime": "2015-10-19T00:40:08Z" + }, + { + "checksumSHA1": "C23LbWdLxzTaK30oTi3ZvYM2hdo=", + "path": "github.com/beego/i18n", + "revision": "e9308947f407a24aaa1e7dbe35a01931e99cb255", + "revisionTime": "2016-11-01T13:27:42Z" + }, + { + "checksumSHA1": "YODbzvhUr0Tzp2/MkXflXph2hdY=", + "path": "github.com/go-chi/chi", + "revision": "e83ac2304db3c50cf03d96a2fcd39009d458bc35", + "revisionTime": "2017-12-22T16:11:33Z" + }, + { + "checksumSHA1": "k9izYoyobR8Upb3Yjsw9htgE/Mk=", + "path": "github.com/go-sql-driver/mysql", + "revision": "99ff426eb706cffe92ff3d058e168b278cabf7c7", + "revisionTime": "2018-07-19T07:19:42Z" + }, + { + "checksumSHA1": "yIkYzW7bzAD81zHyuCNmEj4+oxQ=", + "path": "github.com/gopherjs/gopherjs/js", + "revision": "d547d1d9531ed93dbdebcbff7f83e7c876a1e0ee", + "revisionTime": "2018-11-03T18:53:06Z" + }, + { + "checksumSHA1": "j22mTM0X/UI4kbff6RaPeMNH4XY=", + "path": "github.com/jakecoffman/cron", + "revision": "57ac9950da80b6e2c12df9042429278cf8c729eb", + "revisionTime": "2016-09-12T16:42:50Z" + }, + { + "checksumSHA1": "DG8C+lToNJr0kFZQ5DYq6GDNKZI=", + "path": "github.com/jaypipes/pcidb", + "revision": "141a53e65d4ad43fdbd2760c714344da88f24adb", + "revisionTime": "2018-11-15T14:36:11Z" + }, + { + "checksumSHA1": "qUfWkFlJqc24xFWAsWxKkyyO+zw=", + "path": "github.com/jinzhu/gorm", + "revision": "742154be9a26e849f02d296073c077e0a7c23828", + "revisionTime": "2018-10-07T00:49:37Z" + }, + { + "checksumSHA1": "4eelJOSLZoDzLuaJvgilOBVNovU=", + "path": "github.com/jinzhu/inflection", + "revision": "04140366298a54a039076d798123ffa108fff46c", + "revisionTime": "2018-03-08T03:36:59Z" + }, + { + "checksumSHA1": "cIiyvAduLLFvu+tg1Qr5Jw3jeWo=", + "path": "github.com/jtolds/gls", + "revision": "b4936e06046bbecbb94cae9c18127ebe510a2cb9", + "revisionTime": "2018-11-10T20:28:10Z" + }, + { + "checksumSHA1": "a58zUNtDH/gEd6F6KI3FqT2iEo0=", + "path": "github.com/mitchellh/go-homedir", + "revision": "ae18d6b8b3205b561c79e8e5f69bff09736185f4", + "revisionTime": "2018-08-24T00:42:36Z" + }, + { + "checksumSHA1": "DTy0iJ2w5C+FDsN9EnzfhNmvS+o=", + "path": "github.com/pkg/errors", + "revision": "059132a15dd08d6704c67711dae0cf35ab991756", + "revisionTime": "2018-10-23T23:59:46Z" + }, + { + "checksumSHA1": "Tutue3nEgM/87jitUcYv6ODwyNE=", + "path": "github.com/satori/go.uuid", + "revision": "b2ce2384e17bbe0c6d34077efa39dbab3e09123b", + "revisionTime": "2018-10-28T12:50:25Z" + }, + { + "checksumSHA1": "IFtQxH02Qj36QooV+Z41enAh/hc=", + "path": "github.com/smartystreets/assertions", + "revision": "b2de0cb4f26d0705483a2f495d89896d0b808573", + "revisionTime": "2018-09-27T18:05:07Z" + }, + { + "checksumSHA1": "v6W3GIQMzr3QSXB2NtBa9X7SwiI=", + "path": "github.com/smartystreets/assertions/internal/go-render/render", + "revision": "b2de0cb4f26d0705483a2f495d89896d0b808573", + "revisionTime": "2018-09-27T18:05:07Z" + }, + { + "checksumSHA1": "r6FauVdOTFnwYQgrKGFuWUbIAJE=", + "path": "github.com/smartystreets/assertions/internal/oglematchers", + "revision": "b2de0cb4f26d0705483a2f495d89896d0b808573", + "revisionTime": "2018-09-27T18:05:07Z" + }, + { + "checksumSHA1": "G4VKPvxA20iNV+MkqD+8OsapXug=", + "path": "github.com/smartystreets/goconvey", + "revision": "044398e4856c3a83fb98f9de0a8ed1c6495e2843", + "revisionTime": "2018-11-08T00:35:08Z" + }, + { + "checksumSHA1": "c71WVAQlpp3r4I+BtTxRz1Cq1Lw=", + "path": "github.com/smartystreets/goconvey/convey", + "revision": "044398e4856c3a83fb98f9de0a8ed1c6495e2843", + "revisionTime": "2018-11-08T00:35:08Z" + }, + { + "checksumSHA1": "6Mgn4H/4vpqYGlaIKZ0UwOmJN0E=", + "path": "github.com/smartystreets/goconvey/convey/gotest", + "revision": "044398e4856c3a83fb98f9de0a8ed1c6495e2843", + "revisionTime": "2018-11-08T00:35:08Z" + }, + { + "checksumSHA1": "uTSA/KWQA01sKPYfmLyMPvXbYaA=", + "path": "github.com/smartystreets/goconvey/convey/reporting", + "revision": "044398e4856c3a83fb98f9de0a8ed1c6495e2843", + "revisionTime": "2018-11-08T00:35:08Z" + }, + { + "checksumSHA1": "DjCJPoeFDfYI7LsteLMhxwDEnoE=", + "path": "github.com/smartystreets/goconvey/web/server/api", + "revision": "044398e4856c3a83fb98f9de0a8ed1c6495e2843", + "revisionTime": "2018-11-08T00:35:08Z" + }, + { + "checksumSHA1": "+exNPDGt4XU8k4jj8h525PZtLxI=", + "path": "github.com/smartystreets/goconvey/web/server/contract", + "revision": "044398e4856c3a83fb98f9de0a8ed1c6495e2843", + "revisionTime": "2018-11-08T00:35:08Z" + }, + { + "checksumSHA1": "pWkPFCaZP+x5SZVw/QG/FKl94SA=", + "path": "github.com/smartystreets/goconvey/web/server/executor", + "revision": "044398e4856c3a83fb98f9de0a8ed1c6495e2843", + "revisionTime": "2018-11-08T00:35:08Z" + }, + { + "checksumSHA1": "yaYihYltKDF/h2vuiUx8KbnsWMU=", + "path": "github.com/smartystreets/goconvey/web/server/messaging", + "revision": "044398e4856c3a83fb98f9de0a8ed1c6495e2843", + "revisionTime": "2018-11-08T00:35:08Z" + }, + { + "checksumSHA1": "nHLYe9ZJC8XgiJ+uTZwmOQyw9iw=", + "path": "github.com/smartystreets/goconvey/web/server/parser", + "revision": "044398e4856c3a83fb98f9de0a8ed1c6495e2843", + "revisionTime": "2018-11-08T00:35:08Z" + }, + { + "checksumSHA1": "msXwJmK2tEpVWDyOETUCs3cHaho=", + "path": "github.com/smartystreets/goconvey/web/server/system", + "revision": "044398e4856c3a83fb98f9de0a8ed1c6495e2843", + "revisionTime": "2018-11-08T00:35:08Z" + }, + { + "checksumSHA1": "3GcDERpXpjAF3Y/tRRGnfZ0suOk=", + "path": "github.com/smartystreets/goconvey/web/server/watch", + "revision": "044398e4856c3a83fb98f9de0a8ed1c6495e2843", + "revisionTime": "2018-11-08T00:35:08Z" + }, + { + "checksumSHA1": "UpwKp6oFSNQbJTwaN3oRD/amXLI=", + "path": "github.com/tealeg/xlsx", + "revision": "dbf71b6a931e7096340690e009e40c914eb1fc3a", + "revisionTime": "2018-10-24T00:20:44Z" + }, + { + "checksumSHA1": "06sFvrxpzrN3gYqkmmZOKCSuax4=", + "path": "github.com/tidwall/gjson", + "revision": "f92dbfc6b20e4af58d3fd0a32ac0338277012ddb", + "revisionTime": "2018-07-30T21:44:31Z" + }, + { + "checksumSHA1": "Tk+aXpWRuTQhURlO79bd7YogcU0=", + "path": "github.com/tidwall/match", + "revision": "1731857f09b1f38450e2c12409748407822dc6be", + "revisionTime": "2017-10-02T07:59:45Z" + }, + { + "checksumSHA1": "KRlS8eQZGK1oYVCOkIvcMDXabxk=", + "path": "github.com/urfave/cli", + "revision": "b67dcf995b6a7b7f14fad5fcb7cc5441b05e814b", + "revisionTime": "2018-10-29T21:32:00Z" + }, + { + "checksumSHA1": "DcElCuQ/o6F6mjqvrBdaAsqOPGg=", + "path": "github.com/voidint/binding", + "revision": "b48bf9b3260fec1a4617968a06ec5c898efefe5e", + "revisionTime": "2018-02-22T13:39:13Z" + }, + { + "checksumSHA1": "MjYsJCueRqJwAEBh6ETQmdz61X8=", + "path": "github.com/voidint/page", + "revision": "0c16e912b0c52fed8d40b4cf7f0b0060737565f6", + "revisionTime": "2019-02-12T04:05:47Z" + }, + { + "checksumSHA1": "kFJZIGt0lpBufqlhuwRERsD1w6g=", + "path": "golang.org/x/crypto/ssh", + "revision": "e84da0312774c21d64ee2317962ef669b27ffb41", + "revisionTime": "2018-10-24T13:26:30Z" + }, + { + "checksumSHA1": "BGm8lKZmvJbf/YOJLeL1rw2WVjA=", + "path": "golang.org/x/crypto/ssh/terminal", + "revision": "e84da0312774c21d64ee2317962ef669b27ffb41", + "revisionTime": "2018-10-24T13:26:30Z" + }, + { + "checksumSHA1": "bhX9GCMtACwF4bEFcVFRoHLz7xQ=", + "path": "golang.org/x/net/publicsuffix", + "revision": "927f97764cc334a6575f4b7a1584a147864d5723", + "revisionTime": "2018-12-19T06:27:23Z" + }, + { + "checksumSHA1": "+ywZWOh4ZI2zDXWb6nIquOnKlIM=", + "path": "golang.org/x/sys/unix", + "revision": "7f918dd405547ecb864d14a8ecbbfe205b5f930f", + "revisionTime": "2016-06-02T08:11:10Z" + }, + { + "checksumSHA1": "yW5zoe29l2zcnmsB2wLWke35ETs=", + "path": "gopkg.in/resty.v1", + "revision": "a59932b061db030cf7edc11d970c8b6013d04a32", + "revisionTime": "2018-12-05T06:38:13Z" + }, + { + "checksumSHA1": "KgT+peLCcuh0/m2mpoOZXuxXmwc=", + "path": "gopkg.in/yaml.v2", + "revision": "" + }, + { + "checksumSHA1": "yWZJQTXhO8cxzXjCEasJ2xj1qG8=", + "path": "idcos.io/cloudboot/hardware", + "revision": "" + }, + { + "checksumSHA1": "mU0o1qAB7vLTOSrYeotkOWsdt2M=", + "path": "idcos.io/cloudboot/hardware/collector", + "revision": "" + }, + { + "checksumSHA1": "mM1aOxgOteg5KQLN0Cee+9w9OiQ=", + "path": "idcos.io/cloudboot/hardware/collector/bootos", + "revision": "" + }, + { + "checksumSHA1": "Z+fqcLMVaKY5qim2TbBKZwUw2LU=", + "path": "idcos.io/cloudboot/hardware/oob", + "revision": "" + }, + { + "checksumSHA1": "sgM6JdyB3RLjfRDpyfOZl5bLAs0=", + "path": "idcos.io/cloudboot/hardware/oob/ipmi", + "revision": "" + }, + { + "checksumSHA1": "6DEcQC0QSQ8DK04PienGMvd0rQA=", + "path": "idcos.io/cloudboot/hardware/raid", + "revision": "" + }, + { + "checksumSHA1": "wI9pTfC1iQCGuib1yk8NSAZNsRU=", + "path": "idcos.io/cloudboot/hardware/raid/avagomegaraid", + "revision": "" + }, + { + "checksumSHA1": "1nA3mlamVabT1eav5o0uBvvhSiM=", + "path": "idcos.io/cloudboot/hardware/raid/hpsmartarray", + "revision": "" + }, + { + "checksumSHA1": "99EeXxj/Mu+CdogMu9Ri4xwBC8Y=", + "path": "idcos.io/cloudboot/hardware/raid/lsimegaraid", + "revision": "" + }, + { + "checksumSHA1": "iXQZaQD2s43ARhMiz3/wjjF+V6E=", + "path": "idcos.io/cloudboot/hardware/raid/lsisas2", + "revision": "" + }, + { + "checksumSHA1": "Da9wFB+KwnzXkxUXi22Jasid7GI=", + "path": "idcos.io/cloudboot/hardware/raid/lsisas3", + "revision": "" + }, + { + "checksumSHA1": "atqKL81+g3V6dP55D6jWknTBEgQ=", + "path": "idcos.io/uam-go", + "revision": "" + } + ], + "rootPath": "idcos.io/cloudboot" +} diff --git a/cyclone-web/.editorconfig b/cyclone-web/.editorconfig new file mode 100644 index 0000000000000000000000000000000000000000..4476275cccde032b802793a76e04a6d480972edc --- /dev/null +++ b/cyclone-web/.editorconfig @@ -0,0 +1,23 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true + +[*.{js,jsx,html}] +indent_size = 2 + +[*.{css,sass,scss,less,styl}] +charset = utf-8 +indent_size = 2 + +[*.{diff,md}] +trim_trailing_whitespace = false diff --git a/cyclone-web/.env b/cyclone-web/.env new file mode 100644 index 0000000000000000000000000000000000000000..ff198422c2e413be6d185043e4cd5fc0ca5cc5ac --- /dev/null +++ b/cyclone-web/.env @@ -0,0 +1,5 @@ +DBHOST=192.168.1.2 +DBPORT=3306 +DBUSER=admin +DBPWD= +DB= \ No newline at end of file diff --git a/cyclone-web/.eslintignore b/cyclone-web/.eslintignore new file mode 100644 index 0000000000000000000000000000000000000000..b66de14d278f6db350989dc16ad5b2c485266f78 --- /dev/null +++ b/cyclone-web/.eslintignore @@ -0,0 +1,2 @@ +/app/assets/* +get-component.js \ No newline at end of file diff --git a/cyclone-web/.eslintrc.js b/cyclone-web/.eslintrc.js new file mode 100644 index 0000000000000000000000000000000000000000..9a4eb14f014be5ec7cdc392296a968281638c8ff --- /dev/null +++ b/cyclone-web/.eslintrc.js @@ -0,0 +1,33 @@ +module.exports = { + "env": { + "browser": true + }, + "extends": "eslint:recommended", + "parserOptions": { + "ecmaFeatures": { + "jsx": true + }, + "ecmaVersion": 2018 + }, + "plugins": [ + "react" + ], + "rules": { + "indent": [ + "error", + "tab" + ], + "linebreak-style": [ + "error", + "unix" + ], + "quotes": [ + "error", + "single" + ], + "semi": [ + "error", + "never" + ] + } +}; \ No newline at end of file diff --git a/cyclone-web/.gitignore b/cyclone-web/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..db47604359340569567acbf7c503fce38f015086 --- /dev/null +++ b/cyclone-web/.gitignore @@ -0,0 +1,20 @@ +# Don't check auto-generated stuff into git +coverage +stats.json +proxy.json + +# Cruft +.DS_Store +npm-debug.log +.idea +.proxy +build +build.tar +build.zip +dist +temp +.proxy +yarn-error.log +*.less.d.ts +package-lock.json +node_modules \ No newline at end of file diff --git a/cyclone-web/.gitlab-ci.yml b/cyclone-web/.gitlab-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..3c5fe677278bb0037719ca688d3bb285b04767a5 --- /dev/null +++ b/cyclone-web/.gitlab-ci.yml @@ -0,0 +1,3 @@ +before_script: + - npm build + diff --git a/cyclone-web/README.md b/cyclone-web/README.md new file mode 100644 index 0000000000000000000000000000000000000000..f066e510643d197cb66aec6c04a9e0f7befd85e1 --- /dev/null +++ b/cyclone-web/README.md @@ -0,0 +1,150 @@ + +## 安装 + +```sh + $ git clone <git@..repo_name> + $ cd repo_name + $ yarn +``` + +## 开发 + +第一次运行需要配置 `proxy.json`,可以直接通过命令生成 + +```sh + $ npm run proxy +``` + +proxy.json 样例,endpoint 代表需要代理的 path + +```json +{ + "default": { + "api": "http://127.0.0.1:8080", + "endpoints": [ + "/api/*" + ] + } +} +``` + + +运行 + +``` + $ npm run start +``` + +打开 http://localhost:3000 即可运行 + +## 编译发布 + +```sh + // 生成 build.tar + $ sh ./package.sh + + // 生产机器上获取 build.tar 然后解压放到 www 目录 + $ curl -o build.tar http://127.0.0.1:8000/build.tar + $ tar xopf build.tar +``` + +编译过后的文件放置在 build 目录,为了测试编译后的结果(考虑到 proxy 的问题,否则直接启动一个静态文件服务器就能测试),可单独启动一个 node-server 来运行,也可以配置 Nginx ,将 api 访问转发给后端测试服务器。 + +一个 简单的 conf 为 + +``` + $ vim /usr/local/etc/nginx/servers/your-project-nginx-conf.conf +``` + +输入 +your-project-nginx-conf.conf +```conf +server { + set $api_server http://127.0.0.1:8080; + set $build_path /Users/admin/www/idcos/react-boilerplate-master/build; + listen 80; + server_name localhost; + + #charset koi8-r; + + #access_log logs/host.access.log main; + + location = / { + root html; + index index.html index.htm; + } + + location / { + + root $build_path; #config html dir + + if ( $content_type = "application/json" ) { + proxy_pass $api_server; + } + + if ( $uri ~ /login.html ) { + proxy_pass $api_server; + } + + if ( $uri ~ /api ) { + proxy_pass $api_server; + } + + if ( $uri ~ /static ) { + proxy_pass $api_server; + } + + index index.html index.htm; + client_max_body_size 1000m; + } + + #error_page 404 /404.html; + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root html; + } + + # proxy the PHP scripts to Apache listening on 127.0.0.1:80 + # + #location ~ \.php$ { + # proxy_pass http://127.0.0.1; + #} + + # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + # + #location ~ \.php$ { + # root html; + # fastcgi_pass 127.0.0.1:9000; + # fastcgi_index index.php; + # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; + # include fastcgi_params; + #} + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} +} +``` + +然后修改 root 为项目 build 目录地址。 + +执行 + +```sh + $ sudo nginx -s stop && sudo nginx +``` + +这时候可直接访问: http://localhost + + + + + + + diff --git a/cyclone-web/app/.htaccess b/cyclone-web/app/.htaccess new file mode 100644 index 0000000000000000000000000000000000000000..5204b4b3a3629a8cb69efbaeffa0f4d4eb007ad4 --- /dev/null +++ b/cyclone-web/app/.htaccess @@ -0,0 +1,44 @@ +<ifModule mod_rewrite.c> + + + ####################################################################### + # GENERAL # + ####################################################################### + + # Make apache follow sym links to files + Options +FollowSymLinks + # If somebody opens a folder, hide all files from the resulting folder list + IndexIgnore */* + + + ####################################################################### + # REWRITING # + ####################################################################### + + # Enable rewriting + RewriteEngine On + + # If its not HTTPS + RewriteCond %{HTTPS} off + + # Comment out the RewriteCond above, and uncomment the RewriteCond below if you're using a load balancer (e.g. CloudFlare) for SSL + # RewriteCond %{HTTP:X-Forwarded-Proto} !https + + # Redirect to the same URL with https://, ignoring all further rules if this one is in effect + RewriteRule ^(.*) https://%{HTTP_HOST}/$1 [R,L] + + # If we get to here, it means we are on https:// + + # If the file with the specified name in the browser doesn't exist + RewriteCond %{REQUEST_FILENAME} !-f + + # and the directory with the specified name in the browser doesn't exist + RewriteCond %{REQUEST_FILENAME} !-d + + # and we are not opening the root already (otherwise we get a redirect loop) + RewriteCond %{REQUEST_FILENAME} !\/$ + + # Rewrite all requests to the root + RewriteRule ^(.*) / + +</ifModule> diff --git a/cyclone-web/app/.nginx.conf b/cyclone-web/app/.nginx.conf new file mode 100644 index 0000000000000000000000000000000000000000..cf6b6ca6c65b7638110ffd805963c4e7e0fe768e --- /dev/null +++ b/cyclone-web/app/.nginx.conf @@ -0,0 +1,66 @@ +## +# Put this file in /etc/nginx/conf.d folder and make sure +# you have line 'include /etc/nginx/conf.d/*.conf;' +# in your main nginx configuration file +## + +## +# Redirect to the same URL with https:// +## + +server { + + listen 80; + +# Type your domain name below + server_name example.com; + + return 301 https://$server_name$request_uri; + +} + +## +# HTTPS configurations +## + +server { + + listen 443; + +# Type your domain name below + server_name example.com; + + ssl on; + ssl_certificate /path/to/certificate.crt; + ssl_certificate_key /path/to/server.key; + +# Use only TSL protocols for more secure + ssl_protocols TLSv1 TLSv1.1 TLSv1.2; + +# Always serve index.html for any request + location / { + # Set path + root /var/www/; + try_files $uri /index.html; + } + +## +# If you want to use Node/Rails/etc. API server +# on the same port (443) config Nginx as a reverse proxy. +# For security reasons use a firewall like ufw in Ubuntu +# and deny port 3000/tcp. +## + +# location /api/ { +# +# proxy_pass http://localhost:3000; +# proxy_http_version 1.1; +# proxy_set_header X-Forwarded-Proto https; +# proxy_set_header Upgrade $http_upgrade; +# proxy_set_header Connection 'upgrade'; +# proxy_set_header Host $host; +# proxy_cache_bypass $http_upgrade; +# +# } + +} diff --git a/cyclone-web/app/app.js b/cyclone-web/app/app.js new file mode 100644 index 0000000000000000000000000000000000000000..36cec0d0776901f9da19ca7c0f6f5b759c7be535 --- /dev/null +++ b/cyclone-web/app/app.js @@ -0,0 +1,67 @@ +/** + * app.js + */ +import React from 'react'; +import ReactDOM from 'react-dom'; +import { Provider } from 'react-redux'; +import { Router, hashHistory } from 'react-router'; +import { syncHistoryWithStore } from 'react-router-redux'; +import configureStore from './store'; +import { translationMessages } from 'i18n'; +import 'common/modal-draggable'; +import 'utils/uuid'; + +import 'containers/app/styles/index.less'; + +import 'antd/lib/style/v2-compatible-reset.less'; + +import zhCN from 'antd/lib/locale-provider/zh_CN'; + + +const initialState = {}; +const store = configureStore(initialState, hashHistory); + +if (window.devToolsExtension) { + window.devToolsExtension.updateStore(store); +} + +import { selectLocationState } from 'containers/app/selectors'; +const history = syncHistoryWithStore(hashHistory, store, { + selectLocationState: selectLocationState() +}); + +import App from 'containers/app'; +import LanguageProvider from 'containers/common/language-provider'; +import { LocaleProvider } from 'antd'; + +import createRoutes from './routes'; +import SwalNotification from 'components/notification/SwalNotification'; + +window.swal = SwalNotification; +const rootRoute = { + component: App, + childRoutes: createRoutes(store) +}; + +const render = () => { + ReactDOM.render( + <Provider store={store}> + <LocaleProvider locale={zhCN} messages={translationMessages}> + <Router history={history} routes={rootRoute} /> + </LocaleProvider> + </Provider>, + document.getElementById('AppRoot') + ); + + setTimeout(() => { + if (window.isIE9) { + clearInterval(window.loadingInterval); + } + const $loading = document.getElementById('InitLoading'); + if ($loading) { + $loading.style.display = 'none'; + } + }, 10); +}; + +render(); diff --git a/cyclone-web/app/assets/files/device_migration_import.xlsx b/cyclone-web/app/assets/files/device_migration_import.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..81d3daf98b23dd2e5294b600a6ffaeab8b026888 Binary files /dev/null and b/cyclone-web/app/assets/files/device_migration_import.xlsx differ diff --git a/cyclone-web/app/assets/files/device_store_import.xlsx b/cyclone-web/app/assets/files/device_store_import.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..57e2f3a69ad7411252f35cab5b15261dc5ef64c4 Binary files /dev/null and b/cyclone-web/app/assets/files/device_store_import.xlsx differ diff --git a/cyclone-web/app/assets/files/devices.xlsx b/cyclone-web/app/assets/files/devices.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a5eefdc96feaa03c8743fc55b9f2fc7a9f1fb696 Binary files /dev/null and b/cyclone-web/app/assets/files/devices.xlsx differ diff --git a/cyclone-web/app/assets/files/existing_devices.xlsx b/cyclone-web/app/assets/files/existing_devices.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..7b931b0c698baec778307807542e37ae12783fe9 Binary files /dev/null and b/cyclone-web/app/assets/files/existing_devices.xlsx differ diff --git a/cyclone-web/app/assets/files/idcs.xlsx b/cyclone-web/app/assets/files/idcs.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..aff32fa94b58950f02cb16706f51c53d855119f1 Binary files /dev/null and b/cyclone-web/app/assets/files/idcs.xlsx differ diff --git a/cyclone-web/app/assets/files/network-areas.xlsx b/cyclone-web/app/assets/files/network-areas.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6eb48c9fbf7dd0bca24bef0a76c19e18b394e3a4 Binary files /dev/null and b/cyclone-web/app/assets/files/network-areas.xlsx differ diff --git a/cyclone-web/app/assets/files/network_device_import.xlsx b/cyclone-web/app/assets/files/network_device_import.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..17e7623e96d68d9096297f1af76be2e4bcc60b4a Binary files /dev/null and b/cyclone-web/app/assets/files/network_device_import.xlsx differ diff --git a/cyclone-web/app/assets/files/network_segment_import.xlsx b/cyclone-web/app/assets/files/network_segment_import.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..3ab17fd76fa8f29dba374cfb809142e3ab9da3db Binary files /dev/null and b/cyclone-web/app/assets/files/network_segment_import.xlsx differ diff --git a/cyclone-web/app/assets/files/server-cabinets.xlsx b/cyclone-web/app/assets/files/server-cabinets.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..eab011cceff053c44526ce0b0e4f95a690bbe879 Binary files /dev/null and b/cyclone-web/app/assets/files/server-cabinets.xlsx differ diff --git a/cyclone-web/app/assets/files/server-rooms.xlsx b/cyclone-web/app/assets/files/server-rooms.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ee8474cf6a6ee70494104d9396f62523dd5e069d Binary files /dev/null and b/cyclone-web/app/assets/files/server-rooms.xlsx differ diff --git a/cyclone-web/app/assets/files/server-usites-port.xlsx b/cyclone-web/app/assets/files/server-usites-port.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..73f604ff93d39d9f0073fd826c5cf31ffb2d304b Binary files /dev/null and b/cyclone-web/app/assets/files/server-usites-port.xlsx differ diff --git a/cyclone-web/app/assets/files/server-usites.xlsx b/cyclone-web/app/assets/files/server-usites.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..97d6304b793977e1b610f398f31ca68afae14bd7 Binary files /dev/null and b/cyclone-web/app/assets/files/server-usites.xlsx differ diff --git a/cyclone-web/app/assets/files/special_device_import.xlsx b/cyclone-web/app/assets/files/special_device_import.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..66a72a5e6463408ee8e6baa84f46e14bd9ce91aa Binary files /dev/null and b/cyclone-web/app/assets/files/special_device_import.xlsx differ diff --git a/cyclone-web/app/assets/files/store_room_import.xlsx b/cyclone-web/app/assets/files/store_room_import.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..666f0a6ab7e76495987294ff978d8a4e83edd039 Binary files /dev/null and b/cyclone-web/app/assets/files/store_room_import.xlsx differ diff --git a/cyclone-web/app/assets/homepage/all_device.png b/cyclone-web/app/assets/homepage/all_device.png new file mode 100644 index 0000000000000000000000000000000000000000..59c1e2e18111ba4ce12f19010f1728949fbf6621 Binary files /dev/null and b/cyclone-web/app/assets/homepage/all_device.png differ diff --git a/cyclone-web/app/assets/homepage/install.png b/cyclone-web/app/assets/homepage/install.png new file mode 100644 index 0000000000000000000000000000000000000000..8b9146e9e1083d79b47a65a926eb60f5616e08e8 Binary files /dev/null and b/cyclone-web/app/assets/homepage/install.png differ diff --git a/cyclone-web/app/assets/homepage/install_fail.png b/cyclone-web/app/assets/homepage/install_fail.png new file mode 100644 index 0000000000000000000000000000000000000000..be2c42b0433bc04566896d21134ab735b29d5edb Binary files /dev/null and b/cyclone-web/app/assets/homepage/install_fail.png differ diff --git a/cyclone-web/app/assets/homepage/install_success.png b/cyclone-web/app/assets/homepage/install_success.png new file mode 100644 index 0000000000000000000000000000000000000000..a2fd3370a3d35e0547629d9b229a5e819b6490b0 Binary files /dev/null and b/cyclone-web/app/assets/homepage/install_success.png differ diff --git a/cyclone-web/app/assets/icon/about_icon.png b/cyclone-web/app/assets/icon/about_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1945eb0900fb5406b30b539bd1c976e73fe4ce3f Binary files /dev/null and b/cyclone-web/app/assets/icon/about_icon.png differ diff --git a/cyclone-web/app/assets/icon/guandian.png b/cyclone-web/app/assets/icon/guandian.png new file mode 100644 index 0000000000000000000000000000000000000000..bcbc812e2d20a1b4a1f38640f4346f8889fde8f5 Binary files /dev/null and b/cyclone-web/app/assets/icon/guandian.png differ diff --git a/cyclone-web/app/assets/icon/icon_avatar.png b/cyclone-web/app/assets/icon/icon_avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..9194bc420cd68758a3709558767db48b058162e6 Binary files /dev/null and b/cyclone-web/app/assets/icon/icon_avatar.png differ diff --git a/cyclone-web/app/assets/icon/move.png b/cyclone-web/app/assets/icon/move.png new file mode 100644 index 0000000000000000000000000000000000000000..77366456d55da47fcbb4e109750f58a0d460544d Binary files /dev/null and b/cyclone-web/app/assets/icon/move.png differ diff --git a/cyclone-web/app/assets/icon/offline.png b/cyclone-web/app/assets/icon/offline.png new file mode 100644 index 0000000000000000000000000000000000000000..f68bf019a139d652599715cc008ae22251ffc2d4 Binary files /dev/null and b/cyclone-web/app/assets/icon/offline.png differ diff --git a/cyclone-web/app/assets/icon/reinstall.png b/cyclone-web/app/assets/icon/reinstall.png new file mode 100644 index 0000000000000000000000000000000000000000..653d3581075c8de662c4534a7dc05a46a3a9935c Binary files /dev/null and b/cyclone-web/app/assets/icon/reinstall.png differ diff --git a/cyclone-web/app/assets/icon/tree-btn-left.png b/cyclone-web/app/assets/icon/tree-btn-left.png new file mode 100644 index 0000000000000000000000000000000000000000..53df511a1fb55322294b14e8335606908080d3d6 Binary files /dev/null and b/cyclone-web/app/assets/icon/tree-btn-left.png differ diff --git a/cyclone-web/app/assets/icon/tree-btn-right.png b/cyclone-web/app/assets/icon/tree-btn-right.png new file mode 100644 index 0000000000000000000000000000000000000000..a158eec019967b4a53811f3c9d97354ef5547dd7 Binary files /dev/null and b/cyclone-web/app/assets/icon/tree-btn-right.png differ diff --git a/cyclone-web/app/assets/icon/tuiyi.png b/cyclone-web/app/assets/icon/tuiyi.png new file mode 100644 index 0000000000000000000000000000000000000000..1a9de55f8b90b24f669dade5a0b4317123c54672 Binary files /dev/null and b/cyclone-web/app/assets/icon/tuiyi.png differ diff --git a/cyclone-web/app/assets/img/init-loading-1.png b/cyclone-web/app/assets/img/init-loading-1.png new file mode 100644 index 0000000000000000000000000000000000000000..61815d444181ad7b1d47578889bacaa57ba75d30 Binary files /dev/null and b/cyclone-web/app/assets/img/init-loading-1.png differ diff --git a/cyclone-web/app/assets/img/init-loading-2.png b/cyclone-web/app/assets/img/init-loading-2.png new file mode 100644 index 0000000000000000000000000000000000000000..faaf873a8b9e9dba8d3334daa11d008a68c3c11a Binary files /dev/null and b/cyclone-web/app/assets/img/init-loading-2.png differ diff --git a/cyclone-web/app/assets/logo/logo-cyclone.png b/cyclone-web/app/assets/logo/logo-cyclone.png new file mode 100644 index 0000000000000000000000000000000000000000..bf10064004d2ccb233d7fbec161b7d77de4e4d9d Binary files /dev/null and b/cyclone-web/app/assets/logo/logo-cyclone.png differ diff --git a/cyclone-web/app/assets/logo/logo-max.png b/cyclone-web/app/assets/logo/logo-max.png new file mode 100644 index 0000000000000000000000000000000000000000..bf10064004d2ccb233d7fbec161b7d77de4e4d9d Binary files /dev/null and b/cyclone-web/app/assets/logo/logo-max.png differ diff --git a/cyclone-web/app/assets/logo/logo-min.png b/cyclone-web/app/assets/logo/logo-min.png new file mode 100644 index 0000000000000000000000000000000000000000..bd8140acee6389fb9a8366c453c615ea05279bc2 Binary files /dev/null and b/cyclone-web/app/assets/logo/logo-min.png differ diff --git a/cyclone-web/app/common/assert.js b/cyclone-web/app/common/assert.js new file mode 100644 index 0000000000000000000000000000000000000000..65ba28cfb5c4d4484e4b83e4826581e64b984b4e --- /dev/null +++ b/cyclone-web/app/common/assert.js @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2016 + * + * File: assert.js + * Author: Timothy Yeh + * Created: 2016-10-03 + * + * 断言函数 + */ + +export default function assert(condition, message) { + if (!condition) { + message = message || 'Assertion failed'; + if (typeof Error !== 'undefined') { + throw new Error(message); + } + throw message; // Fallback + } +} diff --git a/cyclone-web/app/common/base64.js b/cyclone-web/app/common/base64.js new file mode 100644 index 0000000000000000000000000000000000000000..6df0ba1447f03d849bcbfcadbd07dab6b366d3cc --- /dev/null +++ b/cyclone-web/app/common/base64.js @@ -0,0 +1,345 @@ +/** + * base64加密算法 + * Created by TY on 16/11/8. + */ +const base64EncodeChars = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; +const base64DecodeChars = new Array( + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 62, + -1, + -1, + -1, + 63, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + -1, + -1, + -1, + -1, + -1, + -1, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + -1, + -1, + -1, + -1, + -1 +); + +function base64encode(str) { + let out, i; + let c1, c2, c3; + const len = str.length; + i = 0; + out = ''; + while (i < len) { + c1 = str.charCodeAt(i++) & 0xff; + if (i == len) { + out += base64EncodeChars.charAt(c1 >> 2); + out += base64EncodeChars.charAt((c1 & 0x3) << 4); + out += '=='; + break; + } + c2 = str.charCodeAt(i++); + if (i == len) { + out += base64EncodeChars.charAt(c1 >> 2); + out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xf0) >> 4)); + out += base64EncodeChars.charAt((c2 & 0xf) << 2); + out += '='; + break; + } + c3 = str.charCodeAt(i++); + out += base64EncodeChars.charAt(c1 >> 2); + out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xf0) >> 4)); + out += base64EncodeChars.charAt(((c2 & 0xf) << 2) | ((c3 & 0xc0) >> 6)); + out += base64EncodeChars.charAt(c3 & 0x3f); + } + return out; +} + +function base64decode(str) { + let c1, c2, c3, c4; + let i, out; + const len = str.length; + i = 0; + out = ''; + while (i < len) { + + /* c1 */ + do { + c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff]; + } while (i < len && c1 == -1); + if (c1 == -1) { + break; + } + + /* c2 */ + do { + c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff]; + } while (i < len && c2 == -1); + if (c2 == -1) { + break; + } + out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4)); + + /* c3 */ + do { + c3 = str.charCodeAt(i++) & 0xff; + if (c3 == 61) { + return out; + } + c3 = base64DecodeChars[c3]; + } while (i < len && c3 == -1); + if (c3 == -1) { + break; + } + out += String.fromCharCode(((c2 & 0xf) << 4) | ((c3 & 0x3c) >> 2)); + + /* c4 */ + do { + c4 = str.charCodeAt(i++) & 0xff; + if (c4 == 61) { + return out; + } + c4 = base64DecodeChars[c4]; + } while (i < len && c4 == -1); + if (c4 == -1) { + break; + } + out += String.fromCharCode(((c3 & 0x03) << 6) | c4); + } + return out; +} + +function utf16to8(str) { + let out, i, c; + out = ''; + const len = str.length; + for (i = 0; i < len; i++) { + c = str.charCodeAt(i); + if (c >= 0x0001 && c <= 0x007f) { + out += str.charAt(i); + } else if (c > 0x07ff) { + out += String.fromCharCode(0xe0 | ((c >> 12) & 0x0f)); + out += String.fromCharCode(0x80 | ((c >> 6) & 0x3f)); + out += String.fromCharCode(0x80 | ((c >> 0) & 0x3f)); + } else { + out += String.fromCharCode(0xc0 | ((c >> 6) & 0x1f)); + out += String.fromCharCode(0x80 | ((c >> 0) & 0x3f)); + } + } + return out; +} + +function utf8to16(str) { + let out, i, c; + let char2, char3; + out = ''; + const len = str.length; + i = 0; + while (i < len) { + c = str.charCodeAt(i++); + switch (c >> 4) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + // 0xxxxxxx + out += str.charAt(i - 1); + break; + case 12: + case 13: + // 110x xxxx  10xx xxxx + char2 = str.charCodeAt(i++); + out += String.fromCharCode(((c & 0x1f) << 6) | (char2 & 0x3f)); + break; + case 14: + // 1110 xxxx 10xx xxxx 10xx xxxx + char2 = str.charCodeAt(i++); + char3 = str.charCodeAt(i++); + out += String.fromCharCode( + ((c & 0x0f) << 12) | ((char2 & 0x3f) << 6) | ((char3 & 0x3f) << 0) + ); + break; + default: + out += str.charAt(i - 1); + } + } + return out; +} + +/** + * 加密 + * @param code + */ +export function base64encodeFunc(code) { + if (code) { + const enCode = base64encode(utf16to8(code + '')); + return enCode; + } else { + return ''; + } +} + +/** + * 解密 + * @param code + */ +export function base64decodeFunc(code) { + if (code) { + return utf8to16(base64decode(code)); + } else { + return ''; + } +} + +/** + * encode + * @param accout + * @param pass + * @param salt + */ + +// export function encodeAccoutAndPassword(accout, pass, salt) { +// return base64encode(utf16to8(accout+"|*"+salt+"*|"+pass)); +// } +// export function encodeAccoutAndPassword(accout, pass, salt) { +// const enAccout = base64encode(utf16to8(accout)); +// const enPass = base64encode(utf16to8(pass)); +// const enSalt = base64encode(utf16to8("|*"+salt+"*|")); +// return base64encode(utf16to8(enAccout+enSalt+enPass)); +// } + +export function encodeAccoutAndPassword(params, salt) { + let codeStr = ''; + if (params) { + codeStr = params.join('|*' + salt + '*|'); + } + + return base64encode(utf16to8(codeStr)); +} + +/** + * decode + * @param code + */ +export function decodeAccoutAndPassword(code, salt) { + if (code && salt) { + const deOldCode = utf8to16(base64decode(code)); + const codes = deOldCode.split('|*' + salt + '*|'); + return codes; + } +} diff --git a/cyclone-web/app/common/enums.js b/cyclone-web/app/common/enums.js new file mode 100644 index 0000000000000000000000000000000000000000..3bb7c168342cf94e61b84d16c12dbdc59c13925f --- /dev/null +++ b/cyclone-web/app/common/enums.js @@ -0,0 +1,405 @@ +export const IDC_USAGE = { + 'production': '生产', + 'disaster_recovery': '容灾', + 'pre_production': '准生产', + 'testing': '测试' +}; +export const IDC_STATUS = { + 'under_construction': '建设中', + 'accepted': '已验收', + 'production': '已投产', + 'abolished': '已裁撤' +}; +export const IDC_STATUS_COLOR = { + 'under_construction': [ '#3A9EEF', '建设中' ], + 'accepted': [ '#8BD46D', '已验收' ], + 'production': [ '#594DCF', '已投产' ], + 'abolished': [ '#F39821', '已裁撤' ] +}; +export const NET_STATUS = { + 'nonproduction': '未投产', + 'production': '已投产', + 'offline': '已下线(回收)' +}; +export const NET_STATUS_COLOR = { + 'nonproduction': [ '#F39821', '未投产' ], + 'production': [ '#8BD46D', '已投产' ], + 'offline': [ '#929EA6', '已下线(回收)' ] +}; +export const CAB_TYPE = { + 'server': '通用服务器', + 'kvm_server': '虚拟化服务器', + 'network_device': '网络设备', + 'reserved': '预留' +}; +export const YES_NO = { + 'yes': '是', + 'no': '否', + 'disabled': '不可用' +}; + +export const OOB_STATUS = { + unknown: '未知', + 'yes': '正常', + 'no': '异常' +}; +export const OOB_ACCESSIBLE = { + unknown: '未知', + yes: '正常', + no: '异常' +}; + +export const OOB_STATUS_COLOR = { + 'no': [ '#F39821', '异常' ], + 'yes': [ '#8BD46D', '正常' ], + 'unknown': [ '#929EA6', '未知' ], + '': [ '#929EA6', '未知' ] +}; + +export const POWER_STATUS = { + 'power_on': '开电', + 'power_off': '关电' +}; +export const CAB_STATUS = { + 'under_construction': '建设中', + 'not_enabled': '未启用', + 'enabled': '已启用', + 'offline': '已下线', + 'locked': '已锁定' +}; +export const CAB_STATUS_COLOR = { + 'under_construction': [ '#3A9EEF', '建设中' ], + 'not_enabled': [ '#F39821', '未启用' ], + 'enabled': [ '#8BD46D', '已启用' ], + 'offline': [ '#929EA6', '已下线' ], + 'locked': [ '#5c0011', '已锁定'] +}; +export const USITE_STATUS = { + 'free': '空闲', + 'pre_occupied': '预占用', + 'used': '已使用', + 'disabled': '不可用' +}; +export const USITE_PORT_RATE = { + 'GE': 'GE', + '10GE': '10GE', + '25GE': '25GE', + '40GE': '40GE' +}; +export const USITE_STATUS_COLOR = { + 'free': [ '#8BD46D', '空闲' ], + 'pre_occupied': [ '#3A9EEF', '预占用' ], + 'used': [ '#594DCF', '已使用' ], + 'disabled': [ '#929EA6', '不可用' ] +}; +export const IP_NETWORK_CATEGORY = { + 'ilo': '服务器ILO', + 'tgw_intranet': '服务器TGW内网', + 'tgw_extranet': '服务器TGW外网', + 'intranet': '服务器普通内网', + 'extranet': '服务器普通外网', + 'v_intranet': '服务器虚拟化内网', + 'v_extranet': '服务器虚拟化外网' +}; +export const IP_VERSION = { + 'ipv4': 'IPv4', + 'ipv6': 'IPv6' +}; +export const OPERATION_STATUS = { + 'run_with_alarm': '运营中(需告警)', + 'run_without_alarm': '运营中(无需告警)', + 'reinstalling': '重装中', + 'in_store': '库房中', + 'moving': '搬迁中', + 'pre_retire': '待退役', + 'retiring': '退役中', + 'retired': '已退役', + 'pre_deploy': '待部署', + 'on_shelve': '已上架', + 'recycling': '回收中', + 'maintaining': '维护中', + 'pre_move': '待搬迁' +}; +export const OPERATION_STATUS_COLOR = { + 'run_with_alarm': [ '#F39821', '运营中(需告警)' ], + 'run_without_alarm': [ '#3A9EEF', '运营中(无需告警)' ], + 'reinstalling': [ '#ff3700', '重装中' ], + 'moving': [ '#FC5CAD', '搬迁中' ], + 'in_store': [ '#FC5CAD50', '库房中' ], + 'pre_retire': [ '#BB67D4', '待退役' ], + 'retiring': [ '#BB67D4', '退役中' ], + 'retired': [ '#929EA6', '已退役' ], + 'pre_deploy': [ '#594DCF', '待部署' ], + 'on_shelve': [ '#8BD46D', '已上架' ], + 'recycling': [ '#7D89E6', '回收中' ], + 'maintaining': [ '#F39821', '维护中' ], + 'pre_move': [ '#594DCF70', '待搬迁' ] +}; +export const NETWORK_DEVICE_TYPE = { + 'switch': '交换机' +}; +export const NETWORK_DEVICE_STATUS = { + '运营中': '运营中', + '待启用': '待启用', +}; +export const NETWORK_IPS_CATEGORY = { + 'pxe': 'PXEIP', + 'business': '业务IP' +}; +export const NETWORK_IPS_SCOPE = { + "intranet": '内网', + "extranet": '外网' +}; + +export const INSTALL_TYPE = { + 'pxe': 'pxe安装', + 'image': '镜像安装' +}; +export const BOOT_MODE = { + uefi: 'UEFI', + legacy_bios: 'BIOS' +}; +export const OS_LIFECYCLE = { + "testing":"Testing", + "active_default":"Active(Default)", + "active":"Active", + "containment":"Containment", + "end_of_life":"EOL" +}; +export const DEVICE_INSTALL_STATUS = { + 'pre_install': '等待部署', + 'installing': '正在部署', + 'failure': '部署失败', + 'success': '部署成功' +}; +export const DEVICE_INSTALL_STATUS_COLOR = { + success: [ '#6bc646', '部署成功' ], + failure: [ '#ff3700', '部署失败' ], + pre_install: [ '#00c3ff', '等待部署' ], + installing: [ '#8E44AD', '正在部署' ] +}; +export const PRIVILEGE_LEVEL = { + '0': '0(noaccess)', + '1': '1(callback)', + '2': '2(user)', + '3': '3(operator)', + '4': '4(administrator)', + '5': '5(oem)' +}; + +export const NICSIDE = { + 'inside': '内置', + 'outside': '外置' +}; +export const RUNNING_STTAUS = { + 'running': '正在巡检', + 'done': '巡检完成' +}; +export const INSPECTION_RESULT = { + nominal: '正常', + critical: '异常', + unknown: '未知', + warning: '警告' +}; +export const INSPECTION_RESULT_COLOR = { + nominal: [ '#6bc646', '正常' ], + critical: [ '#ff3700', '异常' ], + unknown: [ '#c4cdd7', '未知' ], + warning: [ '#ff9e0c', '警告' ] +}; + +export const APPROVAL_STATUS_COLOR = { + completed: [ '#6bc646', '已完成' ], + revoked: [ '#c4cdd7', '已撤销' ], + approval: [ '#ff9e0c', '进行中' ], + failure: [ '#ff3700', '失败' ] +}; + +export const APPROVAL_STATUS = { + completed: '已完成', + revoked: '已撤销', + approval: '进行中', + failure: '失败' +}; + +export const APPROVAL_TYPE = { + cabinet_power_off: '机架关电', + cabinet_offline: '机架下线', + device_os_reinstallation: '物理机操作系统重装', + device_migration: '物理机搬迁', + device_retirement: '物理机退役(报废)', + idc_abolish: '数据中心裁撤', + server_room_abolish: '机房裁撤', + network_area_offline: '网络区域下线', + ip_unassign: 'IP回收', + device_restart: '物理机重启', + device_power_off: '物理机关电', + device_recycle_pre_retire: '回收退役', + device_recycle_pre_move: '回收搬迁', + device_recycle_reinstall: '回收重装' +}; +export const APPROVAL_ACTION = { + agree: '通过', + reject: '不通过' +}; +export const TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss'; + +export const DEPLOY_STATUS = { + 'pre_deploy': '等待部署', + 'pre_online': '等待上线', + 'online': '已上线', + 'offline': '已下线' +}; + +export const PAGE_TYPE = { + edit: '编辑配置', + create: '新增配置', + detail: '查看配置' +}; +export const API_STATUS = { + 'success': '成功', + 'failure': '失败' +}; +export const API_STATUS_COLOR = { + success: [ '#6bc646', '成功' ], + failure: [ '#ff3700', '失败' ] +}; + +export const ORDER_STATUS = { + purchasing: '采购中', + partly_arrived: '部分到货', + all_arrived: '全部到货', + canceled: '已取消', + finished: '已完成' +}; +export const BUILTIN = { + yes: '是', + no: '否' +}; +export const ARCH = { + x86_64: 'x86_64', + aarch64: 'aarch64', + ppc64: 'ppc64' +}; +export const TASK_STATUS = { + running: '运行中', + paused: '已暂停', + stoped: '已结束', + deleted: '已删除' +}; + +export const TASK_STATUS_COLOR = { + stoped: [ '#6bc646', '已结束' ], + deleted: [ '#ff3700', '已删除' ], + paused: [ '#ff9e0c', '已暂停' ], + running: [ '#00c3ff', '运行中' ] +}; +export const TASK_CATEGORY = { + inspection: '硬件巡检任务', + installation_timeout: '装机超时检查任务', + release_ip: '释放IP任务', + auto_deploy: '自动部署任务', + mailsend: '定时邮件任务', + update_device_lifecycle: '更新设备维保状态', + xmdb_rabbitmq: 'xmdb信息同步' +}; + +export const TASK_RATE = { + immediately: '立刻', + fixed_rate: '定时' +}; + +export const DEVICE_SETTING_RULE_CATEGORY = { + os: '操作系统', + raid: '阵列结构', + network: '网络配置' +}; + +export const DEVICE_MAINTENANCE_SERVICE_STATUS = { + under_warranty: '在保', + out_of_warranty: '过保', + inactive: '未激活' +}; + +export const formItemLayout = { + labelCol: { + xs: { span: 24 }, + sm: { span: 5 } + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 18 } + } +}; +export const formItemLayout_page = { + labelCol: { + xs: { span: 24 }, + sm: { span: 2 } + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 22 } + } +}; +export const tailFormItemLayout = { + wrapperCol: { + xs: { + span: 24, + offset: 0 + }, + sm: { + span: 10, + offset: 13 + } + } +}; +export const tableFormItemLayout = { + labelCol: { + xs: { span: 24 }, + sm: { span: 1 } + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 23 } + } +}; +export const tailFormItemLayout_page = { + wrapperCol: { + xs: { + span: 24, + offset: 0 + }, + sm: { + span: 10, + offset: 2 + } + } +}; + +export function getSearchList(data) { + return Object.keys(data).map(key => { + return { + value: key, label: data[key] + }; + }); +} + + +export function getEnumLabel(enums = {}, key) { + return enums[key] || key; +} + +export function getEnumOptions(enums) { + const keys = Object.keys(enums); + const options = keys.map(key => { + return { + label: enums[key], + value: key + }; + }); + options.unshift({ + label: '全部', + value: '' + }); + return options; +} diff --git a/cyclone-web/app/common/getHashParams.js b/cyclone-web/app/common/getHashParams.js new file mode 100644 index 0000000000000000000000000000000000000000..c13e57ceb6e219e00a2e5e9b4ebcb583126880f8 --- /dev/null +++ b/cyclone-web/app/common/getHashParams.js @@ -0,0 +1,59 @@ +/** + * [description] + * @return {[type]} [description] + */ +export default function getHashParams() { + const params = location.hash.split('?')[1] || ''; + return JSON.parse( + `{"${decodeURI(params) + .replace(/"/g, '\\"') + .replace(/&/g, '","') + .replace(/=/g, '":"')}"}` + ); +} + +export function parseQuery(param) { + const lookup = {}; + + const parts = param.split('&'); + for (let i = 0; i < parts.length; i++) { + const t = parts[i].split('='); + + //Fix booleans + if (t[1] === 'true') { + lookup[decodeURIComponent(t[0])] = true; + } else if (t[1] === 'false') { + lookup[decodeURIComponent(t[0])] = false; + } else if (t[1] == parseFloat(t[1])) { + //Fix numbers + lookup[decodeURIComponent(t[0])] = parseFloat(t[1]); + } else if (t[1].indexOf('|') !== -1) { + //Fix arrays (has a pipe | in the string). + lookup[decodeURIComponent(t[0])] = decodeURIComponent(t[1]).split('|'); + } else { + //Everything else (Assume it's a string). + lookup[decodeURIComponent(t[0])] = decodeURIComponent(t[1]); //Decode that ugly URI stuff. + } + } + + return lookup; +} + +export function encodeURI(queryData) { + const query = []; + Object.keys(queryData).forEach(key => { + const t = []; + t.push(encodeURIComponent(key)); + t.push(encodeURIComponent(queryData[key])); + query.push(t.join('=')); + }); + + return query.join('&'); +} + +export function combineURI(router, queryData) { + const uri = []; + uri.push(router); + uri.push(encodeURI(queryData)); + return uri.join('?'); +} diff --git a/cyclone-web/app/common/getObjectValue.js b/cyclone-web/app/common/getObjectValue.js new file mode 100644 index 0000000000000000000000000000000000000000..23b067d4aec721ed0d39b49db08c6b373d0cf4fe --- /dev/null +++ b/cyclone-web/app/common/getObjectValue.js @@ -0,0 +1,32 @@ +/** + * [description] + * @return {[type]} [description] + */ +export function getObjectValue(obj, array) { + if (obj == null) { + return undefined; + } + let len; + if (array == undefined) { + len = 0; + } else { + len = array.length; + } + let res = obj; + for (let i = 0; i < len; i++) { + res = res[array[i]]; + if (res == null) { + return undefined; + } + } + return res; +} + +export function getArrayLength(obj, array) { + var arr = getObjectValue(obj, array); + if (arr == undefined) { + return 0; + } else { + return arr.length; + } +} diff --git a/cyclone-web/app/common/load-route-error.js b/cyclone-web/app/common/load-route-error.js new file mode 100644 index 0000000000000000000000000000000000000000..89aa2d833438f02dce330857a13a6b4b96a032ef --- /dev/null +++ b/cyclone-web/app/common/load-route-error.js @@ -0,0 +1,8 @@ +/** + * load route error handler + */ +const errorLoading = (err) => { + console.error('Dynamic page loading failed', err); // eslint-disable-line no-console +}; + +export default errorLoading; diff --git a/cyclone-web/app/common/modal-draggable.js b/cyclone-web/app/common/modal-draggable.js new file mode 100644 index 0000000000000000000000000000000000000000..25a19a6f59bc4338a7c37bf65690bea700c7b813 --- /dev/null +++ b/cyclone-web/app/common/modal-draggable.js @@ -0,0 +1,19 @@ +(function($) { + $('body').on('mousedown', '.ant-modal .ant-modal-header', function(ev) { + ev.preventDefault(); + const $modalHeader = $(this); + const el = $modalHeader.parent().parent(); + + const offset = el.offset(); + const dx = ev.pageX - offset.left; + const dy = ev.pageY - offset.top; + + $(document).on('mousemove.drag', e => { + el.offset({ top: e.pageY - dy, left: e.pageX - dx }); + }); + }); + + $('body').on('mouseup', '.ant-modal .ant-modal-header', () => { + $(document).off('mousemove.drag'); + }); +})(jQuery); diff --git a/cyclone-web/app/common/object-path.js b/cyclone-web/app/common/object-path.js new file mode 100644 index 0000000000000000000000000000000000000000..6c948970dd4345d164aebb96ce622c170fb3b99f --- /dev/null +++ b/cyclone-web/app/common/object-path.js @@ -0,0 +1,50 @@ +import objectPath from 'object-path'; + +/** + * [flatten description] + * @param {[type]} toFlatten [description] + * @param {[type]} prefix [description] + * @return {[type]} [description] + */ +function flatten(toFlatten, prefix) { + const result = {}; + let key; + const traveseObject = function(theObject, path) { + if (!(typeof theObject === 'string') && theObject instanceof Array) { + for (let i = 0; i < theObject.length; i++) { + // var key = path + "[" + i + "]"; + key = `${path}.${i}`; + if (typeof theObject[i] === 'string') { + result[key] = theObject[i]; + } else { + traveseObject(theObject[i], key); + } + } + } else { + if (path.length > 0) { + path = path + '.'; + } + for (const prop in theObject) { + if ( + theObject[prop] instanceof Object || + (theObject[prop] instanceof Array && + !( + typeof theObject[prop] === 'string' || + theObject[prop] instanceof String + )) + ) { + traveseObject(theObject[prop], path + prop); + } else { + key = path + prop; + result[key] = theObject[prop]; + } + } + } + }; + traveseObject(toFlatten, prefix); + return result; +} +export default { + ...objectPath, + flatten +}; diff --git a/cyclone-web/app/common/pureRender.js b/cyclone-web/app/common/pureRender.js new file mode 100644 index 0000000000000000000000000000000000000000..73630c41fea29dcd2dafa2f3ee31b1b4522993fa --- /dev/null +++ b/cyclone-web/app/common/pureRender.js @@ -0,0 +1,60 @@ +/** + * 处理 shouldComponentUpdate 的判断逻辑。 + * + * Created by zhangrong on 16/9/8. + */ + +import { is } from 'immutable'; + +function shouldComponentUpdate(nextProps, nextState) { + if (nextProps == null) { + nextProps = {}; + } + + if (nextState == null) { + nextState = {}; + } + + const thisProps = this.props || {}; + const thisState = this.state || {}; + + if ( + Object.keys(thisProps).length !== Object.keys(nextProps).length || + Object.keys(thisState).length !== Object.keys(nextState).length + ) { + return true; + } + + let index = 0; + + const propsKeys = Object.keys(nextProps); + + for (; index < propsKeys.length; index++) { + const key = propsKeys[index]; + if ( + thisProps[key] !== nextProps[key] && + !is(thisProps[key], nextProps[key]) + ) { + return true; + } + } + + const stateKeys = Object.keys(nextState); + + for (index = 0; index < stateKeys.length; index++) { + const key = stateKeys[index]; + if ( + thisState[key] !== nextState[key] && + !is(thisState[key], nextState[key]) + ) { + return true; + } + } + + return false; +} + +export default function(component) { + component.prototype.shouldComponentUpdate = shouldComponentUpdate; + return component; +} diff --git a/cyclone-web/app/common/resolve.js b/cyclone-web/app/common/resolve.js new file mode 100644 index 0000000000000000000000000000000000000000..f895e55106ae95591804abb9a777b00a34805b74 --- /dev/null +++ b/cyclone-web/app/common/resolve.js @@ -0,0 +1,12 @@ +export function resolve(path, obj, key, value) { + let recursivePath = ''; + return path.split('.').reduce((prev, curr) => { + if (value) { + recursivePath += curr + '.'; + if (recursivePath.substr(0, recursivePath.length - 1) === path) { + prev[curr][key] = value; + } + } + return prev ? prev[curr] : undefined; + }, obj || {}); +} diff --git a/cyclone-web/app/common/timeUtil.js b/cyclone-web/app/common/timeUtil.js new file mode 100644 index 0000000000000000000000000000000000000000..70023d44d37d4a567807889466ee18248c752f41 --- /dev/null +++ b/cyclone-web/app/common/timeUtil.js @@ -0,0 +1,22 @@ +/** + * [toLocal description] + * @param {[type]} timestamp [description] + * @return {[type]} [description] + */ +import moment from 'moment'; +export function dataTimeForm(data) { + if (data) { + let mData = moment(data); + return mData.format('YYYY-MM-DD HH:mm:ss'); + } +} +export function dataTimeTitle(data) { + if (data) { + let mData = moment(data); + return mData.format('YYYY-MM-DD-HH-mm-ss'); + } +} +export function locale(timestamp) { + const d = new Date(timestamp); + return d.toLocaleDateString() + ' ' + d.toLocaleTimeString(); +} diff --git a/cyclone-web/app/common/util.js b/cyclone-web/app/common/util.js new file mode 100644 index 0000000000000000000000000000000000000000..fbbc2ce2735cf25ab8106ca8a5ca0512f7c8da38 --- /dev/null +++ b/cyclone-web/app/common/util.js @@ -0,0 +1,246 @@ +/* + * Copyright (C) 2016 + * + * File: util.js + * Author: Timothy Yeh + * Created: 2016-10-03 + */ +import { notification } from 'antd'; +import { post } from 'common/xFetch2'; + +export function getUriParam(paramName) { + let url = window.location.href; + if (url.indexOf('?') != -1) { + url = url.substr(url.indexOf('?') + 1); + if (url.substr(url.length - 2) === '#/') { + url = url.substr(0, url.length - 2); + } + const paramList = url.split('&'); + for (const param of paramList) { + const paramMap = param.split('='); + if (paramMap[0] === paramName) { + return paramMap[1]; + } + } + } + return null; +} + +/** + * Array2Tree + * 转换扁平的Array为有层次关系的Tree + * + * @name Array2Tree + * @function + * @param array 扁平的数组 + * @param parent 父ID + * @param tree 最终的树结构 + * @returns {array} + */ +export function array2Tree(array, parent, tree) { + tree = typeof tree !== 'undefined' ? tree : []; + parent = typeof parent !== 'undefined' ? parent : { id: '0' }; + + const children = array.filter(child => { + return child.parentId === parent.id; + }); + + if (children.length) { + if (parent.id === '0') { + tree = children; + } else { + parent.children = children; + } + + children.forEach(child => { + const a = array2Tree(array, child); + }); + } + + return tree; +} + +/** + * 判断某项是否存在数组内 + * + * @param array 数组 + * @param val 要检查的项(只支持基本) + * @returns {boolean} + */ +export function arrayFind(array, val) { + if ( + array === undefined || + array === null || + val === undefined || + val === null || + !(array instanceof Array) + ) { + return false; + } + for (let i = 0; i < array.length; i++) { + if (array[i] === val) { + return true; + } + } + return false; +} + +/** + * 判断2个数组的差集 + * + * @param array1 array1 数组 + * @returns [] + */ + +export function diff(array1, array2) { + if ( + array1 === undefined || + array1 === null || + array2 === undefined || + array2 === null || + !(array1 instanceof Array) || + !(array2 instanceof Array) + ) { + return []; + } + return array1.concat(array2).filter(function(arg) { + return !(array1.indexOf(arg) >= 0 && array2.indexOf(arg) >= 0); + }); +} + +/** + * lookup 获取数组的值 + * + * @name lookup + * @function + * @param list + * @param key + * @param value + * @param returned 返回的值字段 + * @param single 是否取只返回一条数据 + * @returns {object} + */ +export function lookup(list, key, value, returned = null, single = false) { + if (value === undefined) { + return; + } + + const result = list.filter(item => { + return item[key] === String(value); + }); + + if (!result.length) { + return; + } + + if (single) { + const data = result[0]; + + // 获取指定值 + if (returned) { + return data[returned]; + } + + return data; + } + + return result; +} + +/** + * getRandomInt + * + * @name getRandomInt + * @function + * @param min + * @param max + * @returns {number} + */ +export function getRandomInt(min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +/** + * numberFormat + * + * @name numberFormat + * @function + * @param number + * @param sep + * @returns {number} + */ +export function numberFormat(number, sep = ',') { + const dot = String(number).split('.')[1] || ''; + return number + .toFixed(dot.length || 2) + .replace(/(\d)(?=(\d{3})+\.)/g, '$1' + sep); +} + +export function sumBy(data, key) { + return data.reduce((a, b) => { + return a[key] + b[key]; + }); +} + +export function groupBy(data, fields, key, totalBy) { + return data.reduce((objects, item) => { + if (!(item[key] in objects)) { + const obj = {}; + fields.forEach(k => { + obj[k] = item[k]; + }); + obj[totalBy] = 1; + objects[item[key]] = obj; + } else { + fields.forEach(k => { + objects[item[key]][k] += item[k]; + }); + objects[item[key]][totalBy] += 1; + } + return objects; + }, {}); +} + + +/** + * 校验同级目录下不能有相同的名称 + * @param data + * @param values + */ +export const checkSameName = (data, values) => { + if (data.children.length > 0) { + data.children.forEach(tree => { + if (values.pid === tree.pid && values.name === tree.name) { + notification.error({ + message: '同级目录下不能存在同名目录' + }); + values.flag = true; + } + checkSameName(tree, values); + }); + } + return values.flag; +}; + +/** + * 删除数组中指定的项 + * @param array + * @param item + */ +export const remove = (array, item) => { + for (let i = 0; i < array.length; i++) { + if (typeof item === 'string') { + if (array[i] === item) { + array.splice(i, 1); + } + } else { + if (array[i].id === item.id) { + array.splice(i, 1); + } + } + + } + return array; +}; + + diff --git a/cyclone-web/app/common/utils.jsx b/cyclone-web/app/common/utils.jsx new file mode 100644 index 0000000000000000000000000000000000000000..07ea711e316ff73d9461b08a406e483a3300749c --- /dev/null +++ b/cyclone-web/app/common/utils.jsx @@ -0,0 +1,139 @@ +import React from 'react'; +import { Tooltip, Icon, Row, Col, Breadcrumb, Checkbox, Popover, Button } from 'antd'; +import { Link } from 'react-router'; +const CheckboxGroup = Checkbox.Group; +import { arrayFind } from './util'; + +/** + * + * @param label + * @param title + * @returns {XML} + */ +export const tpsLabel = (label, title) => { + if (title) { + return ( + <span> + {label} + <Tooltip title={title}> + <Icon type='question-circle-o' /> + </Tooltip> + </span> + ); + } + return <span>{label}</span>; +}; + +/** + * + * @param fields + * @param span + */ +export const renderFormDetail = (fields, span = 8) => { + return fields.map(node => { + return ( + <Col span={span}> + <span className='panel-label'> + {node.label}: + </span> + <span className='panel-value'> + {node.value} + </span> + </Col> + ); + }); +}; + +/** + * + * @param title + * @param link + * @returns {XML} + */ +export const getBreadcrumb = (title, link) => { + return ( + <Breadcrumb> + <Breadcrumb.Item> + {link ? + <Link to={link}><Icon type='left' />返回</Link> : + <a onClick={() => history.back()}><Icon type='left' />返回</a> + } + </Breadcrumb.Item> + <Breadcrumb.Item>{title}</Breadcrumb.Item> + </Breadcrumb> + ); +}; + +/** + * + * @param title + * @returns {XML} + */ +export const geTabsTitle = (title) => { + return ( + <Breadcrumb> + <Breadcrumb.Item><h3>{title}</h3></Breadcrumb.Item> + </Breadcrumb> + ); +}; + +/** + * 显示字段 + * @param self + * @returns {XML} + */ +export const renderDisplayMore = (self, plainOptions = []) => { + const onChange = checkedList => { + self.setState({ + checkedList, + indeterminate: + !!checkedList.length && checkedList.length < plainOptions.length, + checkAll: checkedList.length === plainOptions.length + }); + }; + const onCheckAllChange = e => { + self.setState({ + checkedList: e.target.checked ? plainOptions : [], + indeterminate: false, + checkAll: e.target.checked + }); + }; + return ( + <Popover + placement='bottom' + content={ + <div> + <div style={{ borderBottom: '1px solid #E9E9E9' }}> + <Checkbox + indeterminate={self.state.indeterminate} + onChange={onCheckAllChange} + checked={self.state.checkAll} + > + 全选 + </Checkbox> + </div> + <CheckboxGroup value={self.state.checkedList} onChange={onChange}> + {plainOptions.map(data => { + return ( + <Row key={data.name} > + <Col span={24}> + <Checkbox value={data}>{data.name}</Checkbox> + </Col> + </Row> + ); + })} + </CheckboxGroup> + </div> + } + trigger='click' + > + <Button> + 显示字段<Icon type='down' /> + </Button> + </Popover> + ); +}; + +export const getPermissonBtn = (permissions = [], btn) => { + return arrayFind(permissions, btn); +}; diff --git a/cyclone-web/app/common/uuid.js b/cyclone-web/app/common/uuid.js new file mode 100644 index 0000000000000000000000000000000000000000..12d3c4e5300257d73c1bccba5a1983c332617bc4 --- /dev/null +++ b/cyclone-web/app/common/uuid.js @@ -0,0 +1,14 @@ +/** + * Created by zhangrong on 16/3/5. + */ + +// A more compact, but less performant, RFC4122v4 solution: +function uuid() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { + const r = Math.random() * 16 | 0; + const v = c === 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); +} + +export default uuid; diff --git a/cyclone-web/app/common/xFetch.js b/cyclone-web/app/common/xFetch.js new file mode 100644 index 0000000000000000000000000000000000000000..69a4b29932679d7faecf7250da51184881f72ef5 --- /dev/null +++ b/cyclone-web/app/common/xFetch.js @@ -0,0 +1,81 @@ +import 'fetch-detector'; +import 'fetch-ie8'; +import { base64decodeFunc } from './base64'; +import * as auth from 'services/auth'; +import { notification } from 'antd'; + +const errorMessages = res => `${res.status} ${res.statusText}`; + + +function check401(res) { + if (res.status === 401) { + notification.error({ message: '登录过期,请重新登录' }); + auth.ssoLogin(); + return Promise.reject(errorMessages(res)); + } + return res; +} + +function check404(res) { + if (res.status === 404) { + return Promise.reject(errorMessages(res)); + } + return res; +} + +function check500(res) { + if (res.status === 500) { + return Promise.reject(errorMessages(res)); + } + return res; +} + +function jsonParse(res) { + return res.json().then(jsonResult => ({ ...res, jsonResult })); +} + +function errorMessageParse(jsonResult) { + let { status, message, content, metadata, Status } = jsonResult; + if (status !== 'success') { + return Promise.reject(jsonResult); + } + return jsonResult; +} + +function xFetch(url, options) { + const opts = { isEncode: true, ...options, credentials: 'include' }; + const locale = base64decodeFunc(localStorage.LOCALE); + let token = localStorage.osinstallAuthAccessToken + ? localStorage.osinstallAuthAccessToken + : ''; + opts.headers = { + ...opts.headers, + 'Authorization': `${token}`, + locale + }; + + if (opts.isEncode) { + url = encodeURI(url); + } + return ( + fetch(url, opts) + .then(check401) + //.then(check404) + // .then(check500) + .then(jsonParse) + .then(res => { + if ( + res.jsonResult && + res.jsonResult.statusCode && + res.jsonResult.statusCode.startsWith('700') + ) { + //检测登录超时的情况,如超时清除缓存和跳转页面 + delete localStorage.osinstallAuthAccessToken; + auth.ssoLogin(); + } + return res.jsonResult; + }) + ); +} + +export default xFetch; diff --git a/cyclone-web/app/common/xFetch2.js b/cyclone-web/app/common/xFetch2.js new file mode 100644 index 0000000000000000000000000000000000000000..85deecae641453262abf588a8a7b754f55abeaf2 --- /dev/null +++ b/cyclone-web/app/common/xFetch2.js @@ -0,0 +1,85 @@ +/** + * Created by zhangrong on 16/8/30. + */ + +import xFetch from './xFetch'; +import assert from './assert'; + +export function get(url, options) { + return xFetch(url, options); +} + +export function getWithArgs(url, args, options) { + args = args || {}; + + for (const attr in args) { + if (args[attr] === undefined || args[attr] === null) { + delete args[attr]; + } + } + + let keys = Object.keys(args); + keys = keys + .map(key => { + return `${key}=${args[key]}`; + }) + .join('&'); + url = url + '?' + keys; + return get(url, options); +} + +export function post(url, data, options) { + const opts = { + ...options, + method: 'POST', + cache: 'no-cache', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json' + }, + body: JSON.stringify(data) + }; + return xFetch(url, opts); +} +export function postFile(url, data, options) { + const opts = { + ...options, + method: 'POST', + cache: 'no-cache', + headers: { + Accept: '*/*', + 'Content-Type': + 'multipart/form-data;boundary=----WebKitFormBoundaryiqw6SEM6EXa7FlBk', + authorization: 'authorization-text' + }, + body: JSON.stringify(data) + }; + return xFetch(url, opts); +} + +export function del(url, data, options) { + const opts = { + ...options, + method: 'DELETE', + cache: 'no-cache', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(data) + }; + return xFetch(url, opts); +} + +export function put(url, data, options) { + const opts = { + ...options, + method: 'PUT', + cache: 'no-cache', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json' + }, + body: JSON.stringify(data) + }; + return xFetch(url, opts); +} diff --git a/cyclone-web/app/components/Exception/demo/403.md b/cyclone-web/app/components/Exception/demo/403.md new file mode 100644 index 0000000000000000000000000000000000000000..85f0ad07284a998f5018b5b3df51842f8f347994 --- /dev/null +++ b/cyclone-web/app/components/Exception/demo/403.md @@ -0,0 +1,21 @@ +--- +order: 2 +title: 403 +--- + +403 页面,配合自定义操作。 + +````jsx +import Exception from 'ant-design-pro/lib/Exception'; +import { Button } from 'antd'; + +const actions = ( + <div> + <Button type="primary">回到首页</Button> + <Button>查看详情</Button> + </div> +); +ReactDOM.render( + <Exception type="403" actions={actions} /> +, mountNode); +```` diff --git a/cyclone-web/app/components/Exception/demo/404.md b/cyclone-web/app/components/Exception/demo/404.md new file mode 100644 index 0000000000000000000000000000000000000000..6ff2de78d75d19b0fe63f918cd81023c28821a72 --- /dev/null +++ b/cyclone-web/app/components/Exception/demo/404.md @@ -0,0 +1,14 @@ +--- +order: 0 +title: 404 +--- + +404 页面。 + +````jsx +import Exception from 'ant-design-pro/lib/Exception'; + +ReactDOM.render( + <Exception type="404" /> +, mountNode); +```` diff --git a/cyclone-web/app/components/Exception/demo/500.md b/cyclone-web/app/components/Exception/demo/500.md new file mode 100644 index 0000000000000000000000000000000000000000..0ed9cedb5adc3a8a70ee1e77890c3e2bd599efa3 --- /dev/null +++ b/cyclone-web/app/components/Exception/demo/500.md @@ -0,0 +1,14 @@ +--- +order: 1 +title: 500 +--- + +500 页面。 + +````jsx +import Exception from 'ant-design-pro/lib/Exception'; + +ReactDOM.render( + <Exception type="500" /> +, mountNode); +```` diff --git a/cyclone-web/app/components/Exception/index.js b/cyclone-web/app/components/Exception/index.js new file mode 100644 index 0000000000000000000000000000000000000000..8936dd27814a2b5e94a592dfdc952d29e5f9dcc6 --- /dev/null +++ b/cyclone-web/app/components/Exception/index.js @@ -0,0 +1,31 @@ +import React, { createElement } from 'react'; +import classNames from 'classnames'; +import { Button } from 'antd'; +import config from './typeConfig'; +import styles from './index.less'; +import { Link } from 'react-router'; + +export default ({ className, linkElement = 'a', type, title, desc, img, actions, ...rest }) => { + const pageType = type in config ? type : '404'; + const clsString = classNames(styles.exception, className); + return ( + <div className={clsString} {...rest}> + <div className={styles.imgBlock}> + <div + className={styles.imgEle} + style={{ backgroundImage: `url(${img || config[pageType].img})` }} + /> + </div> + <div className={styles.content}> + <h1>{title || config[pageType].title}</h1> + <div className={styles.desc}>{desc || config[pageType].desc}</div> + <div className={styles.actions}> + { + actions || + <Link to='/'><Button type='primary'>返回首页</Button></Link> + } + </div> + </div> + </div> + ); +}; diff --git a/cyclone-web/app/components/Exception/index.less b/cyclone-web/app/components/Exception/index.less new file mode 100644 index 0000000000000000000000000000000000000000..394af178fea778d6eb5222561b1109df37cd7898 --- /dev/null +++ b/cyclone-web/app/components/Exception/index.less @@ -0,0 +1,88 @@ +@import "~antd/lib/style/themes/default.less"; + +.exception { + display: flex; + align-items: center; + height: 100%; + + .imgBlock { + flex: 0 0 62.5%; + width: 62.5%; + padding-right: 152px; + zoom: 1; + &:before, + &:after { + content: " "; + display: table; + } + &:after { + clear: both; + visibility: hidden; + font-size: 0; + height: 0; + } + } + + .imgEle { + height: 360px; + width: 100%; + max-width: 430px; + float: right; + background-repeat: no-repeat; + background-position: 50% 50%; + background-size: contain; + } + + .content { + flex: auto; + + h1 { + color: #434e59; + font-size: 72px; + font-weight: 600; + line-height: 72px; + margin-bottom: 24px; + } + + .desc { + color: @text-color-secondary; + font-size: 20px; + line-height: 28px; + margin-bottom: 16px; + } + + .actions { + button:not(:last-child) { + margin-right: 8px; + } + } + } +} + +@media screen and (max-width: @screen-xl) { + .exception { + .imgBlock { + padding-right: 88px; + } + } +} + +@media screen and (max-width: @screen-sm) { + .exception { + display: block; + text-align: center; + .imgBlock { + padding-right: 0; + margin: 0 auto 24px; + } + } +} + +@media screen and (max-width: @screen-xs) { + .exception { + .imgBlock { + margin-bottom: -24px; + overflow: hidden; + } + } +} diff --git a/cyclone-web/app/components/Exception/index.md b/cyclone-web/app/components/Exception/index.md new file mode 100644 index 0000000000000000000000000000000000000000..844146e0a095358974577a10506c3e66b5aca0dc --- /dev/null +++ b/cyclone-web/app/components/Exception/index.md @@ -0,0 +1,21 @@ +--- +title: + en-US: Exception + zh-CN: Exception +subtitle: 异常 +cols: 1 +order: 5 +--- + +异常页用于对页面特定的异常状态进行反馈。通常,它包含对错误状态的阐述,并向用户提供建议或操作,避免用户感到迷失和困惑。 + +## API + +| 参数 | 说明 | 类型 | 默认值 | +|-------------|------------------------------------------|-------------|-------| +| type | 页面类型,若配置,则自带对应类型默认的 `title`,`desc`,`img`,此默认设置可以被 `title`,`desc`,`img` 覆盖 | Enum {'403', '404', '500'} | - | +| title | 标题 | ReactNode | - | +| desc | 补充描述 | ReactNode | - | +| img | 背景图片地址 | string | - | +| actions | 建议操作,配置此属性时默认的『返回首页』按钮不生效 | ReactNode | - | +| linkElement | 定义链接的元素,默认为 `a` | string\|ReactElement | - | diff --git a/cyclone-web/app/components/Exception/typeConfig.js b/cyclone-web/app/components/Exception/typeConfig.js new file mode 100644 index 0000000000000000000000000000000000000000..206f84e6edafda46ad4da601d4c2552e93dfce54 --- /dev/null +++ b/cyclone-web/app/components/Exception/typeConfig.js @@ -0,0 +1,19 @@ +const config = { + 401: { + img: 'https://gw.alipayobjects.com/zos/rmsportal/wZcnGqRDyhPOEYFcZDnb.svg', + title: '401', + desc: '抱歉,你无权访问该页面,请先登录' + }, + 404: { + img: 'https://gw.alipayobjects.com/zos/rmsportal/KpnpchXsobRgLElEozzI.svg', + title: '404', + desc: '抱歉,你访问的页面不存在' + }, + 500: { + img: 'https://gw.alipayobjects.com/zos/rmsportal/RVRUAYdCGeYNBWoKiIwB.svg', + title: '500', + desc: '抱歉,服务器出错了' + } +}; + +export default config; diff --git a/cyclone-web/app/components/FullScreenContainer/index.js b/cyclone-web/app/components/FullScreenContainer/index.js new file mode 100644 index 0000000000000000000000000000000000000000..796728fb63d30a1306608b5a0beda09d2a4fae69 --- /dev/null +++ b/cyclone-web/app/components/FullScreenContainer/index.js @@ -0,0 +1,82 @@ +/** + * 方便的将 Component 丢到全屏范围 + * + * Created by zhangrong on 17/4/25. + */ + +import React, { Component } from 'react'; +import ReactDOM from 'react-dom'; + +import uuid from 'common/uuid'; + +class FullScreenContainer extends Component { + constructor(props) { + super(props); + this.state = { + divId: uuid() + }; + } + componentDidMount() { + this.renderComponent(this); + } + componentDidUpdate() { + this.renderComponent(this); + } + componentWillUnmount() { + const _container = this._container; + ReactDOM.unmountComponentAtNode(_container); + document.body.removeChild(_container); + } + renderComponent = (instance, componentArg, ready) => { + if (!instance._container) { + instance._container = this.getContainer(instance); + } + let component; + if (instance.getComponent) { + component = instance.getComponent(componentArg); + } else { + component = this.getComponent(instance, componentArg); + } + ReactDOM.unstable_renderSubtreeIntoContainer( + instance, + component, + instance._container, + function callback() { + instance._component = this; + if (ready) { + ready.call(this); + } + } + ); + }; + + getContainer = instance => { + if (instance.props.getContainer) { + return instance.props.getContainer(); + } + + const container = document.createElement('div'); + container.setAttribute('id', this.state.divId); + container.style.position = 'absolute'; + container.style.zIndex = 999; + container.style.top = '0'; + container.style.bottom = '0'; + container.style.left = '0'; + container.style.right = '0'; + container.style.width = '100%'; + container.style.height = '100%'; + + document.body.appendChild(container); + return container; + }; + + getComponent = (instance, extra) => { + return <div>{React.Children.only(this.props.children)}</div>; + }; + + render() { + return null; + } +} + +export default FullScreenContainer; diff --git a/cyclone-web/app/components/TableControlCell/index.jsx b/cyclone-web/app/components/TableControlCell/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..1a1a12b73b3c2aed2596a5af55da761114f7d726 --- /dev/null +++ b/cyclone-web/app/components/TableControlCell/index.jsx @@ -0,0 +1,122 @@ +import React from 'react'; +import { Icon, Button, Tooltip, Menu, Dropdown } from 'antd'; +import { Link } from 'react-router'; + +// eg +// const commands = [ +// { +// name: "编辑", +// command: "edit", +// disabled: hasPermisson +// }, +// { +// name: "重启", +// command: "restart", +// disabled: hasPermisson +// } +// ]; + +// return ( +// <TableControlCell +// commands={commands} +// record={record} +// execCommand={command => { +// this.execAction(command, [record]); +// }} +// /> +// ); + +export default function Commands(props) { + const commands = props.commands; + const record = props.record; + const limit = 3; + const $commands = commands.slice(0, limit).map(renderCommand); + let $more = null; + if (commands.length > limit) { + $commands.pop(); + $more = renderMore(commands.slice(limit - 1, commands.length)); + } + $commands.push($more); + return <div className='table-controls'>{$commands}</div>; + + /** + * [renderMore description] + * @param {[type]} keys [description] + * @return {[type]} [description] + */ + function renderMore(commands) { + const $menu = ( + <Menu> + {commands.map(command => { + return ( + <Menu.Item key={`command-menu-${command.name}`}> + {renderCommand(command)} + </Menu.Item> + ); + })} + </Menu> + ); + + return ( + <Dropdown overlay={$menu} key='drodown'> + <a className='ant-dropdown-link' href='javascript: void(0);'> + 更多 <Icon type='down' /> + </a> + </Dropdown> + ); + } + + /** + * [renderCommand description] + * @param {[type]} key [description] + * @return {[type]} [description] + */ + function renderCommand(command) { + // disabled + if (command.disabled) { + return Disabled(command); + } + if (command.shouldDisabled && command.shouldDisabled(record)) { + return Disabled(command); + } + // custom render + if (command.render) { + return command.render(props); + } + // default render + return Default(command); + } + + /** + * [Default description] + * @param {[type]} command [description] + */ + function Default(command) { + return ( + <a + key={command.name} + href='javascript:void(0)' + style={{ color: command.type === 'danger' && '#ff3700' }} + onClick={ev => { + props.execCommand(command.command || command.name, record); + ev.preventDefault(); + }} + > + {command.name} + </a> + ); + } + + /** + * [Disabled description] + * @param {[type]} command [description] + * @param {[type]} message [description] + */ + function Disabled(command) { + return ( + <Tooltip key={command.name} title={command.message || command.name}> + <span className='disabled' style={{ cursor: 'not-allowed' }}>{command.name}</span> + </Tooltip> + ); + } +} diff --git a/cyclone-web/app/components/crontab/index.jsx b/cyclone-web/app/components/crontab/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..4020048222dc7ad4b454baa7215ae3ebb65e14c8 --- /dev/null +++ b/cyclone-web/app/components/crontab/index.jsx @@ -0,0 +1,763 @@ +import React from 'react'; +import { Tabs, Popover, Form, Radio, Icon, Input, Select, Button, Checkbox } from 'antd'; +const TabPane = Tabs.TabPane; +import { post, put, get } from 'common/xFetch2'; +const FormItem = Form.Item; +const RadioGroup = Radio.Group; +const Option = Select.Option; +import styles from './styles.less'; +const tableFormItemLayout = { + labelCol: { + xs: { span: 3 } + }, + wrapperCol: { + xs: { span: 19 } + } +}; +const radioStyle = { + display: 'block', + height: '36px' +}; + +/** + * + * <Crontab + form={this.props.form} + initialValue={{crontab:string,crontabUi:JSONstring}} + handleClick={(values)=>this.setState({crontabUi: values})} + /> + * + */ + +export default class Crontab extends React.Component { + constructor(props) { + super(props); + this.state = { + crontabExpression: '0 1/5 * * * ?', + 'type': 'define', // define:指定,custom:自定义,下面信息金在define时存在 + 'minute': { + 'type': 'loop', // loop: 循环,define:定义 + 'data': { + 'from': '1', // 仅在type为loop时存在 + 'to': '5', // 仅在type为loop时存在 + 'index': [] // 仅在type为define时使用,为勾选的所有的数据 + } + }, + 'hour': { + 'type': 'loop', + 'data': { + 'index': [] // 仅在type为define时使用,为勾选的所有的数据 + } + }, + 'day': { + 'type': 'loop', + 'data': { + 'index': [] // 仅在type为define时使用,为勾选的所有的数据 + } + }, + 'month': { + 'type': 'loop', + 'data': { + 'index': [] // 仅在type为define时使用,为勾选的所有的数据 + } + }, + 'weekly': { + 'type': 'unused', //unused表示不使用星期 + 'data': { + 'index': [] // 仅在type为define时使用,为勾选的所有的数据 + } + } + }; + this.props.handleClick(this.state); + } + componentDidMount() { + if (this.props.initialValue && this.props.initialValue.crontabUi && typeof this.props.initialValue.crontabUi !== 'string') { + const data = JSON.parse(this.props.initialValue.crontabUi); + if (typeof data === String) { + return; + } + this.state = data; + } + } + + onMinTypeChange = e => { + const minute = this.state.minute; + + //这一块处理自动生成表达式 + const minuteData = { + minute: { + ...minute, + type: e.target.value + } + }; + const data = { + ...this.state, + ...minuteData + }; + + this.setState({ + ...data + }); + this.getCrontab(data); + + }; + onHourTypeChange = e => { + const hour = this.state.hour; + + //这一块处理自动生成表达式 + const hourData = { + hour: { + ...hour, + type: e.target.value + } + }; + const data = { + ...this.state, + ...hourData + }; + + this.setState({ + ...data + }); + this.getCrontab(data); + + } + onDayTypeChange = e => { + const day = this.state.day; + + //校验 + const weekly = this.state.weekly; + let weeklyData = { weekly: { ...weekly } }; + if (e.target.value !== 'unused') { + weeklyData = { + weekly: { + ...weekly, + type: 'unused' + } + }; + } else { + let type = 'loop'; + if (weekly.data.length !== 0) { + type = 'define'; + } + weeklyData = { + weekly: { + ...weekly, + type: type + } + }; + } + + //这一块处理自动生成表达式 + const dayData = { + day: { + ...day, + type: e.target.value + } + }; + const data = { + ...this.state, + ...dayData, + ...weeklyData + }; + + this.setState({ + ...data + }); + this.getCrontab(data); + + } + onMonthTypeChange = e => { + const month = this.state.month; + + //这一块处理自动生成表达式 + const monthData = { + month: { + ...month, + type: e.target.value + } + }; + const data = { + ...this.state, + ...monthData + }; + + this.setState({ + ...data + }); + this.getCrontab(data); + + } + onWeeklyTypeChange = e => { + const weekly = this.state.weekly; + //这一块处理自动生成表达式 + const weeklyData = { + weekly: { + ...weekly, + type: e.target.value + } + }; + //校验 + const day = this.state.day; + let dayData = { day: { ...day } }; + if (e.target.value !== 'unused') { + dayData = { + day: { + ...day, + type: 'unused' + } + }; + } else { + let type = 'loop'; + if (day.data.length !== 0) { + type = 'define'; + } + dayData = { + day: { + ...day, + type: type + } + }; + } + + const data = { + ...this.state, + ...weeklyData, + ...dayData + }; + + this.setState({ + ...data + }); + this.getCrontab(data); + + } + onMinDataFromChange = e => { + const minute = this.state.minute; + if (e.target.value < 0) { + e.target.value = 0; + } + if (e.target.value > 59) { + e.target.value = 59; + } + const minuteData = { + minute: { + ...minute, + data: { + ...minute.data, + from: e.target.value + } + } + }; + const data = { + ...this.state, + ...minuteData + }; + + this.setState({ + ...data + }); + this.getCrontab(data); + + } + onMinDataToChange = e => { + const minute = this.state.minute; + if (e.target.value < 1) { + e.target.value = 1; + } + if (e.target.value > 59) { + e.target.value = 59; + } + + const minuteData = { + minute: { + ...minute, + data: { + ...minute.data, + to: e.target.value + } + } + }; + const data = { + ...this.state, + ...minuteData + }; + this.setState({ + ...data + }); + this.getCrontab(data); + + }; + handleMinIndexChange = value => { + const minute = this.state.minute; + //这一块处理自动生成表达式 + const minuteData = { + minute: { + ...minute, + data: { + ...minute.data, + index: value + } + } + }; + const data = { + ...this.state, + ...minuteData + }; + + this.setState({ + ...data + }); + this.getCrontab(data); + + + } + handleHourIndexChange = value => { + const hour = this.state.hour; + + const hourData = { + hour: { + ...hour, + data: { + index: value + } + } + }; + const data = { + ...this.state, + ...hourData + }; + + this.setState({ + ...data + }); + this.getCrontab(data); + + } + handleDayIndexChange = value => { + const day = this.state.day; + + const dayData = { + day: { + ...day, + data: { + index: value + } + } + }; + const data = { + ...this.state, + ...dayData + }; + + this.setState({ + ...data + }); + this.getCrontab(data); + + } + handleMonthIndexChange = value => { + const month = this.state.month; + + const monthData = { + month: { + ...month, + data: { + index: value + } + } + }; + const data = { + ...this.state, + ...monthData + }; + + this.setState({ + ...data + }); + this.getCrontab(data); + + } + handleWeeklyIndexChange = value => { + const weekly = this.state.weekly; + + const weeklyData = { + weekly: { + ...weekly, + data: { + index: value + } + } + }; + const data = { + ...this.state, + ...weeklyData + }; + + this.setState({ + ...data + }); + this.getCrontab(data); + + } + + + minContent = (minute) => { + const children = []; + for (let i = 0; i <= 59; i++) { + children.push(<Option key={i}>{i}</Option>); + } + return ( + <div> + <RadioGroup defaultValue={minute.type} onChange={this.onMinTypeChange}> + <Radio style={radioStyle} value='loop'>循环&nbsp;&nbsp; + 从第&nbsp; + <Input + onChange={this.onMinDataFromChange} + defaultValue={minute.data.from} + size='middle' + min='0' + max='59' + type='number' + style={{ width: 50 }} + disabled={minute.type !== 'loop'} + /> + &nbsp;分钟开始,每隔&nbsp; + <Input + onChange={this.onMinDataToChange} + defaultValue={minute.data.to} + type='number' + min='1' + max='59' + size='middle' + style={{ width: 50 }} + disabled={minute.type !== 'loop'} + /> + &nbsp;分钟执行 + </Radio> + <Radio style={radioStyle} value='define'>指定&nbsp;&nbsp; + <Select + mode='multiple' + style={{ width: 280 }} + placeholder='' + defaultValue={minute.data.index} + onChange={this.handleMinIndexChange} + disabled={minute.type !== 'define'} + > + {children} + </Select> + </Radio> + </RadioGroup> + </div> + ); + } + hourContent = (hour) => { + const children = []; + for (let i = 0; i <= 23; i++) { + children.push(<Option key={i}>{i}</Option>); + } + return ( + <div> + <RadioGroup defaultValue={hour.type} onChange={this.onHourTypeChange}> + <Radio style={radioStyle} value='loop'>每小时&nbsp;&nbsp; + </Radio> + <Radio style={radioStyle} value='define'>指定&nbsp;&nbsp; + <Select + mode='multiple' + style={{ width: 280 }} + placeholder='' + defaultValue={hour.data.index} + onChange={this.handleHourIndexChange} + disabled={hour.type !== 'define'} + > + {children} + </Select> + </Radio> + </RadioGroup> + </div> + ); + } + dayContent = (day) => { + const children = []; + for (let i = 1; i <= 31; i++) { + children.push(<Option key={i}>{i}</Option>); + } + return ( + <div> + <RadioGroup defaultValue={day.type} value={day.type} onChange={this.onDayTypeChange}> + <Radio style={radioStyle} value='unused'>不使用天&nbsp;&nbsp; + </Radio> + <Radio style={radioStyle} value='loop'>每天&nbsp;&nbsp; + </Radio> + <Radio style={radioStyle} value='define' >指定&nbsp;&nbsp; + <Select + mode='multiple' + style={{ width: 280 }} + placeholder='' + defaultValue={day.data.index} + onChange={this.handleDayIndexChange} + disabled={day.type !== 'define'} + > + {children} + </Select> + </Radio> + </RadioGroup> + </div> + ); + } + monthContent = (month) => { + const children = []; + for (let i = 1; i <= 12; i++) { + children.push(<Option key={i}>{i}</Option>); + } + return ( + <div> + <RadioGroup defaultValue={month.type} onChange={this.onMonthTypeChange}> + <Radio style={radioStyle} value='loop'>每月&nbsp;&nbsp; + </Radio> + <Radio style={radioStyle} value='define'>指定&nbsp;&nbsp; + <Select + mode='multiple' + style={{ width: 280 }} + placeholder='' + defaultValue={month.data.index} + onChange={this.handleMonthIndexChange} + disabled={month.type !== 'define'} + > + {children} + </Select> + </Radio> + </RadioGroup> + </div> + ); + } + weeklyContent= (weekly) => { + const children = []; + for (let i = 1; i <= 7; i++) { + children.push(<Option key={i}>星期{i}</Option>); + } + return ( + <div> + <RadioGroup defaultValue={weekly.type} value={weekly.type} onChange={this.onWeeklyTypeChange}> + <Radio style={radioStyle} value='unused'>不使用星期&nbsp;&nbsp; + </Radio> + <Radio style={radioStyle} value='loop'>每星期&nbsp;&nbsp; + </Radio> + <Radio style={radioStyle} value='define'>指定&nbsp;&nbsp; + <Select + mode='multiple' + style={{ width: 280 }} + placeholder='' + defaultValue={weekly.data.index} + onChange={this.handleWeeklyIndexChange} + disabled={weekly.type !== 'define'} + > + <Option key='1'>星期一</Option> + <Option key='2'>星期二</Option> + <Option key='3'>星期三</Option> + <Option key='4'>星期四</Option> + <Option key='5'>星期五</Option> + <Option key='6'>星期六</Option> + <Option key='7'>星期日</Option> + </Select> + </Radio> + </RadioGroup> + + </div> + ); + } + + getCrontab = (data) => { + const { setFieldsValue } = this.props.form; + if (data.type === 'define') { + let crontabArr = []; + crontabArr[0] = 0; + //分 + if (data.minute.type === 'loop') { + crontabArr[1] = `${data.minute.data.from}/${data.minute.data.to}`; + } else { + crontabArr[1] = data.minute.data.index.join(','); + } + + //小时 + if (data.hour.type === 'loop') { + crontabArr[2] = '*'; + } else { + crontabArr[2] = data.hour.data.index.join(','); + } + + //天 + if (data.day.type === 'loop') { + crontabArr[3] = '*'; + } else if (data.day.type === 'define') { + crontabArr[3] = data.day.data.index.join(','); + } else { + crontabArr[3] = '?'; + } + + //月 + if (data.month.type === 'loop') { + crontabArr[4] = '*'; + } else { + crontabArr[4] = data.month.data.index.join(','); + } + + //周 + if (data.weekly.type === 'loop') { + crontabArr[5] = '*'; + } else if (data.weekly.type === 'define') { + crontabArr[5] = data.weekly.data.index.join(','); + } else { + crontabArr[5] = '?'; + } + + this.setState({ + crontabExpression: crontabArr.join(' ') + }); + + setFieldsValue({ + crontabUi: { ...data, crontabExpression: crontabArr.join(' ') }, + cron: crontabArr.join(' ') + }); + + this.props.handleClick({ ...data, crontabExpression: crontabArr.join(' ') }); + } + }; + render() { + const data = this.props.initialValue || {}; + //const crontabUi = data.crontabUi ? JSON.parse(data.crontabUi) : this.state; + const crontabUi = this.state; + const text = <span>Cron表达式的格式:秒 分 时 日 月 周 年(可选)</span>; + const content = ( + <div> + <table> + <tr> + <th>字段名</th> + <th>允许的值</th> + <th>允许的特殊字符</th> + </tr> + <tr> + <td>Seconds (秒)</td> + <td>0-59</td> + <td>, - * /</td> + </tr> + <tr> + <td>Minutes (分)</td> + <td>0-59</td> + <td>, - * /</td> + </tr> + <tr> + <td>Hours (小时)</td> + <td>0-23</td> + <td>, - * /</td> + </tr> + <tr> + <td>Day-of-Month (日)</td> + <td>1-31</td> + <td>, - * ? / L W C</td> + </tr> + <tr> + <td>Month (月)</td> + <td>1-12 or JAN-DEC</td> + <td>, - * /</td> + </tr> + <tr> + <td>Day-of-Week (周)</td> + <td>1-7 or SUN-SAT </td> + <td>, - * ? / L C #</td> + </tr> + <tr> + <td>Year (年,可选字段)</td> + <td> empty, 1970-2099 </td> + <td>, - * / </td> + </tr> + </table> + <hr /> + <p> “?”字符:表示不确定的值</p> + <p> “,”字符:指定数个值</p> + <p> “-”字符:指定一个值的范围</p> + <p>“/”字符:指定一个值的增加幅度。n/m表示从n开始,每次增加m</p> + <p>“L”字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X</p> + <p> “W”字符:指定离给定日期最近的工作日(周一到周五)</p> + <p>“#”字符:表示该月第几个周X。6#3表示该月第3个周五</p> + </div> + ); + const { getFieldDecorator, getFieldValue } = this.props.form; + + + const type = getFieldValue('type'); + return ( + <div> + <FormItem {...tableFormItemLayout} label=''> + {getFieldDecorator('type', { + initialValue: crontabUi.type || 'define' + })( + <RadioGroup> + <Radio value='define'>设定</Radio> + <Radio value='custom'>自定义</Radio> + </RadioGroup> + )} + </FormItem> + {type === 'define' ? ( + + <FormItem {...tableFormItemLayout} label=''> + {getFieldDecorator('crontabUi', { + })( + <div className={styles.cardContainer}> + <Tabs type='card'> + <TabPane tab='分钟' key='minute'> + {this.minContent(crontabUi.minute)} + </TabPane> + <TabPane tab='小时' key='hour'> + {this.hourContent(crontabUi.hour)} + </TabPane> + <TabPane tab='天' key='day'> + {this.dayContent(crontabUi.day)} + </TabPane> + <TabPane tab='月' key='month'> + {this.monthContent(crontabUi.month)} + </TabPane> + <TabPane tab='星期' key='weekly'> + {this.weeklyContent(crontabUi.weekly)} + </TabPane> + </Tabs> + <div style={{ marginTop: 10 }}> + <Input disabled={true} style={{ float: 'left', width: 400 }} defaultValue={data.crontab} value={this.state.crontabExpression} /> + </div> + </div> + )} + </FormItem> + ) : ( + <FormItem + {...tableFormItemLayout} + label='' + extra='例&quot;0 0 12 ? * WED&quot;表示在每星期三下午12:00执行' + > + {getFieldDecorator('cron', {})( + <div style={{ position: 'relative' }}> + <Input placeholder='请输入 crontab 表达式' defaultValue={data.crontab} /> + <Popover + placement='right' + title={text} + content={content} + trigger='click' + > + <Icon + type='info-circle-o' + style={{ + fontSize: 16, + color: '#f6ae68', + position: 'absolute', + right: -22, + top: 10 + }} + /> + </Popover> + </div> + )} + </FormItem> + )} + </div> + ); + } +} diff --git a/cyclone-web/app/components/crontab/styles.less b/cyclone-web/app/components/crontab/styles.less new file mode 100644 index 0000000000000000000000000000000000000000..5f9520c3951c315f50f389e39da28347ce0f0bce --- /dev/null +++ b/cyclone-web/app/components/crontab/styles.less @@ -0,0 +1,28 @@ +.cardContainer { + width: 400px; + :global { + .ant-tabs-card { + .ant-tabs-bar { + border-color: #fff; + .ant-tabs-tab-active { + border-bottom-color: #fff; + z-index: 1; + position: relative; + } + } + .ant-tabs-content { + margin-top: -8px; + .ant-tabs-tabpane { + background: #fff; + padding: 16px; + border: 1px solid #d9d9d9; + border-radius: 4px; + border-top-left-radius: 0; + position: relative; + top: -1px; + z-index: 0; + } + } + } + } +} diff --git a/cyclone-web/app/components/execute-result-modal/index.jsx b/cyclone-web/app/components/execute-result-modal/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..138940804fed9eb38e94e827d14c87878c5d268e --- /dev/null +++ b/cyclone-web/app/components/execute-result-modal/index.jsx @@ -0,0 +1,60 @@ +import React from 'react'; +import Patrol from './patrol'; +import Normal from './normal'; +import Popup from '../popup'; +const TYPES = { + normal: Normal, + patrol: Patrol +}; + +export class ExecuteResult extends React.Component { + constructor(props) { + super(props); + this.threadHandle = null; + this.state = { + logInfo: '' + }; + } + componentDidMount() { + if (this.props.getData) { + this.initThread(); + } + } + + initThread = () => { + const { record } = this.props; + const getLog = () => { + this.props.getData(record, this); + }; + setTimeout(getLog, 100); //componentDidMount函数给编辑器立即复制,样式会乱 + this.threadHandle = setInterval(getLog, 5000); + }; + + componentWillUnmount() { + clearInterval(this.threadHandle); + } + + render() { + const { type, data } = this.props; + const Co = TYPES[type] || TYPES.normal; + return ( + <div className='execute-result'> + <Co data={data || this.state.logInfo} /> + </div> + ); + } +} +export default function open(props) { + Popup.open({ + title: `${props.title || '执行结果详情'} `, + maskClosable: false, + width: 800, + onCancel: () => { + Popup.close(); + if (props.getData) { + props.reload(); + } + }, + content: <ExecuteResult {...props} /> + }); +} diff --git a/cyclone-web/app/components/execute-result-modal/normal.jsx b/cyclone-web/app/components/execute-result-modal/normal.jsx new file mode 100644 index 0000000000000000000000000000000000000000..27d5e5f9f749fa53ad4682163a7f571a760ae9af --- /dev/null +++ b/cyclone-web/app/components/execute-result-modal/normal.jsx @@ -0,0 +1,44 @@ +import React from 'react'; +export default class Normal extends React.Component { + constructor(props) { + super(props); + this.state = { + myCodeMirror: null + }; + this.myRef = React.createRef(); + } + + componentDidMount() { + const myCodeMirror = CodeMirror(this.myRef.current, { + value: this.props.data, + mode: 'shell', + theme: 'erlang-dark', + readOnly: true, + styleActiveLine: true, + lineNumbers: true, + highlightSelectionMatches: true + }); + this.setState({ + myCodeMirror + }); + } + UNSAFE_componentWillReceiveProps(nextPorps) { + const myCodeMirror = this.state.myCodeMirror; + if (myCodeMirror) { + myCodeMirror.setValue(nextPorps.data); + } + } + componentWillUnmount() { + this.setState({ + myCodeMirror: null + }); + } + + render() { + return ( + <div className=''> + <div ref={this.myRef} /> + </div> + ); + } +} diff --git a/cyclone-web/app/components/execute-result-modal/patrol.jsx b/cyclone-web/app/components/execute-result-modal/patrol.jsx new file mode 100644 index 0000000000000000000000000000000000000000..a778c3e45b74de515c470387b4432edbc8c099d0 --- /dev/null +++ b/cyclone-web/app/components/execute-result-modal/patrol.jsx @@ -0,0 +1,6 @@ +import React from 'react'; +export default class Patrol extends React.Component { + render() { + return <pre>Patrol: {this.props.data}</pre>; + } +} diff --git a/cyclone-web/app/components/idcos-form/FormGenerator/DynamicForm.jsx b/cyclone-web/app/components/idcos-form/FormGenerator/DynamicForm.jsx new file mode 100644 index 0000000000000000000000000000000000000000..9d28f0931c4da4397a9b1af49c1c4e563b81ffa4 --- /dev/null +++ b/cyclone-web/app/components/idcos-form/FormGenerator/DynamicForm.jsx @@ -0,0 +1,215 @@ +import React from 'react'; +import { Form, Button } from 'antd'; +import FormElements from './FormElements'; +import objectPath from './objectPath'; + +/** + * [Custom] + */ +class DynamicForm extends React.Component { + render() { + const path = this.props.schema.name || 'root'; + return ( + <Form horizontal={true}> + <FormElements.Object + {...this.props.schema} + path={path} + key={path} + initialValue={this.props.initialValue} + form={this.props.form} + updateProps={this.props.updateProps} + dependsCallAction={this.dependsCallAction} + onFieldChange={this.props.onFieldChange} + /> + {this.renderSubmitButton()} + </Form> + ); + } + + renderSubmitButton = () => { + return ( + <Form.Item wrapperCol={{ span: 18, offset: 4 }} className={this.props.showSubmit ? '' : 'hide'}> + <Button + id={`${this.props.schema.id}-submit`} + type='primary' + onClick={this.handleSubmit} + style={{ float: 'right' }} + > + 确定 + </Button> + <Button + id={`${this.props.schema.id}-prepare`} + type='primary' + onClick={this.handlePrepare} + style={{ float: 'right' }} + className={this.props.showPrepare ? '' : 'hide'} + > + 预览 + </Button> + <Button + id={`${this.props.schema.id}-test`} + type='primary' + onClick={this.handleTest} + style={{ float: 'right', marginRight: 8 }} + className={this.props.showTest ? '' : 'hide'} + > + 测试 + </Button> + <Button + id={`${this.props.schema.id}-reset`} + type='ghost' + onClick={this.handleReset} + style={{ float: 'right', marginRight: 8 }} + className={this.props.hideReset ? 'hide' : ''} + > + 重置 + </Button> + <Button + id={`${this.props.schema.id}-cancel`} + type='default' + onClick={this.handleCancel} + style={{ float: 'right', marginRight: 8 }} + className={this.props.showCancel ? '' : 'hide'} + > + 取消 + </Button> + </Form.Item> + ); + } + + resetFields = (names) => { + this.props.form.resetFields(names); + } + + onFieldChange = (ev) => { + this.props.onFieldChange(ev); + } + + handleReset= (e) => { + e.preventDefault(); + this.props.form.resetFields(); + } + handleCancel = (e) => { + e.preventDefault(); + this.props.onCancel(); + }; + + handleSubmit = (e) => { + e.preventDefault(); + this.props.form.validateFields((errors, values) => { + if (!!errors) { + console.log('Errors in form!!!'); + return; + } + this.props.onSubmit(this.revealValueObject(values[this.props.schema.name])); + }); + } + handleTest= (e) => { + e.preventDefault(); + this.props.form.validateFields((errors, values) => { + if (!!errors) { + console.log('Errors in form!!!'); + return; + } + this.props.onTest(this.revealValueObject(values[this.props.schema.name])); + }); + } + handlePrepare = (e) => { + e.preventDefault(); + this.props.form.validateFields((errors, values) => { + if (!!errors) { + console.log('Errors in form!!!'); + return; + } + this.props.onPrepare(this.revealValueObject(values[this.props.schema.name])); + }); + }; + + + lookupDependent = (id, dependsOn) => { + return Object.keys(dependsOn).reduce((result, key) => { + const source = dependsOn[key]; + if (source) { + const target = source.dependents.find((depentent) => { + return depentent === id; + }); + + if (target && result.indexOf(key) === -1) { + result.push(key); + } + } + + return result; + }, []); + } + + triggerDepends = (props, triggersFor) => { + // 当前的值改变需要触发引用了该值的事件 + // 支持多依赖全部满足条件时触发事件 + const { dependsOn, form } = props; + + // 满足条件的值 + triggersFor.map((target) => { + if (!dependsOn[target]) { + console.error('dependsOn not found!', target); + return; + } + const { dependents, action } = dependsOn[target]; + const existsValues = dependents.map((dependent) => { + return form.getFieldValue(`${props.path}.${dependent}`); + }); + // 如果值有undefined,说明依赖源的值不完整 + if (existsValues.indexOf(undefined) !== -1) { + console.log('dependsOn condition not match', target, existsValues); + return; + } + // call for dependsOn action + if (action) { + action.call(this, props, target, existsValues); + } + }); + } + + dependsCallAction = (props, elementId) => { + return (e) => { + setTimeout(() => { + // if (e.args.length !== 1) { + // console.error('onFieldChange value error:', e.args); + // return; + // } + + const triggersFor = this.lookupDependent(elementId, props.dependsOn); + this.triggerDepends(props, triggersFor); + }, 200); + + return props.onFieldChange(e); + }; + } + + revealValueObject = (obj) => { + const ret = {}; + const keys = Object.keys(obj); + keys.forEach((key) => { + if (key.indexOf('__internal__') === -1) { + objectPath.set(ret, key, obj[key]); + } + }); + + return ret; + } + // userExists(rule, value, callback) { + // if (!value) { + // callback(); + // } else { + // setTimeout(() => { + // if (value === 'JasonWood') { + // callback([new Error('抱歉,该用户名已被占用。')]); + // } else { + // callback(); + // } + // }, 800); + // } + // } +} + +export default DynamicForm; diff --git a/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Array.jsx b/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Array.jsx new file mode 100644 index 0000000000000000000000000000000000000000..a51ecf4bc464f9eecc99c3fc2f6dee97a53f0e80 --- /dev/null +++ b/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Array.jsx @@ -0,0 +1,172 @@ +// { +// name: 'keyArr', +// type: 'Array', +// itemSchema: { +// type: 'object', +// elements: [{ +// name: 'inputText', +// type: 'TextInput' +// }, { +// name: 'inputText', +// type: 'TextArea' +// }] +// } +// } + +import React from 'react'; +import { Form, Button, Icon } from 'antd'; +import FormElements from './index'; +import PropTypes from 'prop-types'; +const T = PropTypes; +class ArrayType extends React.Component { + + static propTypes = { + path: T.string.isRequired + }; + static defaultProps = { + initialValue: [], + displayName: 'DynamicForm.Array' + }; + + + state = { + ...this.getInitialState() + }; + + getInitialState() { + return this.getStateFromProps(this.props); + } + getStateFromProps(props) { + const { itemSchema } = props; + const newItemSchema = { ...itemSchema }; + const initialValue = this.props.initialValue; + const items = []; + for (let i = 0, l = initialValue.length; i < l; i++) { + items.push(newItemSchema); + } + // 如果initialValue为空,就push一个,不然界面都看不到+号 + if (initialValue.length === 0) { + items.push(newItemSchema); + } + return { + items + }; + } + componentWillReceiveProps(nextProps) { + this.setState(this.getStateFromProps(nextProps)); + } + + render() { + const { getFieldProps, getFieldValue } = this.props.form; + const key = this.getKey(); + + const arrayField = getFieldProps(key, { + initialValue: this.getStateFromProps(this.props).items + }); + // title + let $title = null; + if (this.props.label) { + $title = <h3>{this.props.label}</h3>; + } + return ( + <div className='df-array'> + {$title} + {this.renderElements(getFieldValue(key))} + </div> + ); + } + + getKey = () => { + return '__internal__.' + this.props.path + '__arr'; + } + + renderElements = (items) => { + const props = this.props; + const parentPath = props.path; + const initialValue = props.initialValue; + return items.map((it, index) => { + const Element = FormElements[it.type]; + if (Element) { + const path = `${parentPath}.${index}`; + return ( + <ArrayItem + addItem={this.onAddItem} + removeItem={this.onRemoveItem} + item={it} + itemLength={items.length} + key={path} + > + <Element + {...it} + path={path} + name={index + ''} + initialValue={initialValue[index]} + key={path} + form={props.form} + updateProps={props.updateProps} + onFieldChange={props.onFieldChange} + dependsCallAction={props.dependsCallAction} + /> + </ArrayItem> + ); + } + return ''; + }); + } + + onAddItem = () => { + const { getFieldValue, setFieldsValue } = this.props.form; + const key = this.getKey(); + + const items = getFieldValue(key); + items.push({ ...this.props.itemSchema }); + + const obj = {}; + obj[key] = items; + setFieldsValue(obj); + } + + onRemoveItem = (item) => { + const { getFieldValue, setFieldsValue } = this.props.form; + const key = this.getKey(); + + let items = getFieldValue(key); + items = items.filter(it => { + return it !== item; + }); + + const obj = {}; + obj[key] = items; + setFieldsValue(obj); + } +} + +class ArrayItem extends React.Component { + render() { + return ( + <div className='df-array-item ant-row'> + {this.props.children} + <span className='df-array-item-ctrl'> + <Button type='ghost' shape='circle' onClick={this.onClickAdd}> + <Icon type='plus' /> + </Button> + {this.props.itemLength > 1 ? ( + <Button type='ghost' shape='circle' onClick={this.onClickMinus}> + <Icon type='minus' /> + </Button> + ) : ( + '' + )} + </span> + </div> + ); + } + onClickAdd = () => { + this.props.addItem(); + } + onClickMinus = () => { + this.props.removeItem(this.props.item); + } +} + +export default ArrayType; diff --git a/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Checkboxes.jsx b/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Checkboxes.jsx new file mode 100644 index 0000000000000000000000000000000000000000..1d0454176f091a63c20dae356c58f5c4bb29ce0c --- /dev/null +++ b/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Checkboxes.jsx @@ -0,0 +1,85 @@ +import React from 'react'; +import { + Form, + Checkbox, + Tooltip, + Icon +} from 'antd'; +const FormItem = Form.Item; +import T from 'prop-types'; +class Checkboxes extends React.Component { + static propTypes = { + label: T.string, + labelColSpan: T.number, + wrapperColSpan: T.number, + help: T.string, + tip: T.string, + value: T.string, + form: T.object.isRequired, + path: T.string.isRequired, + initialValue: T.object, + disabled: T.bool, + hidden: T.bool, + required: T.bool, + readonly: T.bool + }; + static defaultProps = { + label: '多选', + labelColSpan: 4, + wrapperColSpan: 18, + initialValue: {}, + disabled: false, + readonly: false, + required: false, + hidden: false + }; + + render() { + const props = this.props; + const itemProps = { + label: props.label, + labelCol: { span: props.labelColSpan }, + wrapperCol: { span: props.wrapperColSpan } + }; + if (props.help) { + itemProps.help = props.help; + } + if (props.tip) { + itemProps.label = ( + <span> + {props.label} + <Tooltip title={props.tip}> + <Icon type='question-circle-o' /> + </Tooltip> + </span> + ); + } + return <FormItem {...itemProps}>{this.renderCheckboxes()}</FormItem>; + } + + renderCheckboxes = () => { + const props = this.props; + const { getFieldProps } = this.props.form; + return props.checkboxes.map(ck => { + const fieldProps = getFieldProps(`${props.path}.${ck.name}`, { + valuePropName: 'checked', + rules: ck.rules, + initialValue: props.initialValue[ck.name], + disabled: this.props.disabled, + onChange() { + props.onFieldChange({ + path: `${props.path}.${ck.name}`, + args: arguments + }); + } + }); + return ( + <Checkbox disabled={this.props.disabled} {...fieldProps} className='ant-checkbox-vertical' key={ck.id}> + {ck.label} + </Checkbox> + ); + }); + } +} + +export default Checkboxes; diff --git a/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/DatePicker.jsx b/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/DatePicker.jsx new file mode 100644 index 0000000000000000000000000000000000000000..ccb67301317e0929f364dd2004a7a64f56af8dd3 --- /dev/null +++ b/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/DatePicker.jsx @@ -0,0 +1,88 @@ +import React from 'react'; +import { + Form, + Tooltip, + Icon, + DatePicker +} from 'antd'; +const FormItem = Form.Item; +import T from 'prop-types'; +class FormDatePicker extends React.Component { + static propTypes = { + label: T.string, + labelColSpan: T.number, + wrapperColSpan: T.number, + help: T.string, + tip: T.string, + value: T.string, + required: T.bool, + disabled: T.bool, + readonly: T.bool, + hidden: T.bool, + placeholder: T.string, + form: T.object.isRequired, + name: T.string.isRequired, + rules: T.array, + path: T.string.isRequired, + inputType: T.string + }; + static defaultProps = { + label: '日期', + labelColSpan: 4, + wrapperColSpan: 18, + disabled: false, + readonly: false, + required: false, + hidden: false, + placeholder: '请选择时间' + }; + render() { + const props = this.props; + const { getFieldDecorator } = this.props.form; + // const fieldProps = getFieldProps(props.path, { + // rules: props.rules, + // initialValue: props.initialValue + // }); + + const itemProps = { + label: props.label, + labelCol: { span: props.labelColSpan }, + wrapperCol: { span: props.wrapperColSpan }, + className: props.hidden ? 'hide' : '' + }; + + if (props.help) { + itemProps.help = props.help; + } + + if (props.tip) { + itemProps.label = ( + <span> + {props.label} + <Tooltip title={props.tip}> + <Icon type='question-circle-o' /> + </Tooltip> + </span> + ); + } + const spreadProps = {}; + return ( + <FormItem {...itemProps}> + {getFieldDecorator(props.path, { + rules: props.rules, + initialValue: props.initialValue, + disabled: this.props.disabled, + ...spreadProps + })( + <DatePicker + showTime={this.props.showTime} + format={this.props.format || 'YYYY-MM-DD HH:mm:ss'} + placeholder={props.placeholder} + /> + )} + </FormItem> + ); + } +} + +export default FormDatePicker; diff --git a/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Number.jsx b/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Number.jsx new file mode 100644 index 0000000000000000000000000000000000000000..c93dc532a3c9253bd68b4a282c7febe7e8830b63 --- /dev/null +++ b/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Number.jsx @@ -0,0 +1,79 @@ +import React from 'react'; +import { + Form, + InputNumber, + Tooltip, + Icon +} from 'antd'; +const FormItem = Form.Item; +import T from 'prop-types'; +class Number extends React.Component { + static propTypes ={ + label: T.string, + labelColSpan: T.number, + wrapperColSpan: T.number, + help: T.string, + tip: T.string, + value: T.string, + required: T.bool, + disabled: T.bool, + readonly: T.bool, + placeholder: T.string, + form: T.object.isRequired, + name: T.string.isRequired, + rules: T.array, + path: T.string.isRequired + }; + static defaultProps = { + label: '输入框', + labelColSpan: 4, + wrapperColSpan: 18, + disabled: false, + readonly: false, + required: false, + placeholder: '请输入...' + }; + render() { + const props = this.props; + const { getFieldProps } = this.props.form; + const fieldProps = getFieldProps(props.path, { + rules: props.rules, + onChange: this.onChange, + initialValue: props.initialValue, + min: props.min, + max: props.max + }); + const itemProps = { + label: props.label, + labelCol: { span: props.labelColSpan }, + wrapperCol: { span: props.wrapperColSpan } + }; + if (props.help) { + itemProps.help = props.help; + } + if (props.tip) { + itemProps.label = ( + <span> + {props.label} + <Tooltip title={props.tip}> + <Icon type='question-circle-o' /> + </Tooltip> + </span> + ); + } + return ( + <FormItem {...itemProps}> + <InputNumber + {...fieldProps} + disabled={this.props.disabled} + placeholder={props.placeholder} + /> + </FormItem> + ); + } + onChange() { + console.log('onChange'); + } +} + +export default Number; diff --git a/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Object.jsx b/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Object.jsx new file mode 100644 index 0000000000000000000000000000000000000000..bc4811f6562c614596f2df983645ec03c1e4b6fc --- /dev/null +++ b/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Object.jsx @@ -0,0 +1,62 @@ +import React from 'react'; +import FormElements from './index'; + +function ObjectType(props) { + let $title = null; + if (props.label) { + $title = <h3>{props.label}</h3>; + } + return ( + <div className='df-object'> + {$title} + {renderElements()} + </div> + ); + + function renderElements() { + const elements = props.elements; + const parentPath = props.path; + const initialValue = props.initialValue || {}; + return elements.map(option => { + const Element = FormElements[option.type]; + let path = `${parentPath}.${option.name}`; + let elementInitialValue = initialValue[option.name]; + switch (option.type) { + case 'Checkboxes': + // checkbox is special + path = parentPath; + elementInitialValue = initialValue; + break; + case 'Array': + // Array的表单特殊处理,需要传递这些参数 + // updateProps的更新是整个Schema,不管是否嵌套 + option.updateProps = props.updateProps; + option.dependsCallAction = props.dependsCallAction; + break; + default: + break; + } + if (Element) { + return ( + <Element + {...option} + path={path} + initialValue={elementInitialValue} + key={path} + form={props.form} + onFieldChange={ + props.dependsOn + ? props.dependsCallAction(props, option.id) + : props.onFieldChange + } + /> + ); + } + return null; + }); + } +} + +ObjectType.displayName = 'DynamicForm.Object'; + +export default ObjectType; diff --git a/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Radios.jsx b/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Radios.jsx new file mode 100644 index 0000000000000000000000000000000000000000..7c3f8822b9ed95e304a604c4d0f589742f146268 --- /dev/null +++ b/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Radios.jsx @@ -0,0 +1,87 @@ +import React from 'react'; +import { + Form, + Radio, + Tooltip, + Icon +} from 'antd'; +const FormItem = Form.Item; +const RadioGroup = Radio.Group; +import T from 'prop-types'; + +class Radios extends React.Component { + static propTypes= { + label: T.string, + labelColSpan: T.number, + wrapperColSpan: T.number, + help: T.string, + tip: T.string, + value: T.string, + rules: T.array, + radios: T.array, + disabled: T.bool, + readonly: T.bool, + hidden: T.bool, + required: T.bool, + form: T.object.isRequired, + path: T.string.isRequired + }; + static defaultProps = { + label: '单选', + labelColSpan: 4, + wrapperColSpan: 18, + disabled: false, + readonly: false, + required: false, + hidden: false, + }; + render() { + const props = this.props; + const itemProps = { + label: props.label, + labelCol: { span: props.labelColSpan }, + wrapperCol: { span: props.wrapperColSpan } + }; + if (props.help) { + itemProps.help = props.help; + } + if (props.tip) { + itemProps.label = ( + <span> + {props.label} + <Tooltip title={props.tip}> + <Icon type='question-circle-o' /> + </Tooltip> + </span> + ); + } + return <FormItem {...itemProps}>{this.renderRadios()}</FormItem>; + } + + renderRadios() { + const props = this.props; + const { getFieldProps } = this.props.form; + const fieldProps = getFieldProps(props.path, { + rules: props.rules, + initialValue: props.initialValue, + disabled: this.props.disabled, + }); + if (props.defaultValue) { + fieldProps.defaultValue = props.defaultValue; + } + + return ( + <RadioGroup {...fieldProps}> + {props.radios.map(r => { + return ( + <Radio disabled={this.props.disabled} value={r.value} key={r.value + r.label + props.id}> + {r.label} + </Radio> + ); + })} + </RadioGroup> + ); + } +} + +export default Radios; diff --git a/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Select.jsx b/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Select.jsx new file mode 100644 index 0000000000000000000000000000000000000000..b02bf20aa40478dd2839b6c05dbdbd0b580fd09d --- /dev/null +++ b/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Select.jsx @@ -0,0 +1,245 @@ +import React from 'react'; +import { + Cascader, + TreeSelect, + Form, + Input, + Select, + Button, + Checkbox, + Radio, + Tooltip, + Icon +} from 'antd'; +import fetch from 'common/xFetch'; +const FormItem = Form.Item; +const TreeNode = TreeSelect.TreeNode; +const Option = Select.Option; +import T from 'prop-types'; + +class MSelect extends React.Component { + state = { + options: this.props.options || [] + }; + static propTypes= { + label: T.string, + labelColSpan: T.number, + wrapperColSpan: T.number, + help: T.string, + tip: T.string, + value: T.string, + rules: T.array, + hidden: T.bool, + form: T.object.isRequired, + path: T.string.isRequired, + dataSource: T.string, + cascader: T.bool, + tree: T.bool, + multiple: T.bool, + mode: T.string + }; + static defaultProps = { + label: '下拉选择', + labelColSpan: 4, + wrapperColSpan: 18, + placeholder: '请选择', + hidden: false, + cascader: false, + multiple: false + }; + componentWillReceiveProps(nextProps) { + const dataSource = nextProps.dataSource; + + if (dataSource) { + if (dataSource !== this.props.dataSource) { + this.loadAsyncOptions(dataSource); + } + } else { + this.setState({ + options: nextProps.options || this.state.options + }); + } + } + componentDidMount() { + if (this.props.dataSource) { + this.loadAsyncOptions(this.props.dataSource); + } + } + loadAsyncOptions(dataSource) { + const f = a => a; + const transform = this.props.transform || f; + fetch(dataSource).then( + result => { + const data = transform(result); + this.setState({ + options: data.options || this.state.options + }); + }, + err => { + console.log('err', err); + } + ); + } + render() { + const props = this.props; + + const itemProps = { + label: props.label, + className: props.hidden ? 'hide' : '', + labelCol: { span: props.labelColSpan }, + wrapperCol: { span: props.wrapperColSpan } + }; + + if (props.help) { + itemProps.help = props.help; + } + + if (props.tip) { + itemProps.label = ( + <span> + {props.label} + <Tooltip title={props.tip}> + <Icon type='question-circle-o' /> + </Tooltip> + </span> + ); + } + + return <FormItem {...itemProps}>{this.renderSelect()}</FormItem>; + } + + renderSelect() { + const props = this.props; + const { getFieldProps } = this.props.form; + + const fieldProps = getFieldProps(props.path, { + rules: props.rules, + initialValue: props.initialValue, + value: null, + onChange() { + props.onFieldChange({ + path: props.path, + args: arguments + }); + } + }); + + if (props.cascader) { + return ( + <Cascader + {...fieldProps} + placeholder={props.placeholder} + style={{ width: '100%' }} + options={this.state.options} + disabled={props.disabled} + /> + ); + } + + if (props.tree) { + return this.renderTree(fieldProps); + } + if(props.tag){ + return ( + <Select + {...fieldProps} + multiple={props.multiple} + placeholder={props.placeholder} + disabled={props.disabled} + showSearch={true} + mode={props.mode || null} + optionFilterProp='children' + style={{ width: '100%' }} + > + {this.state.options.map(r => { + return ( + <Option value={r} key={r}> + {r} + </Option> + ); + })} + </Select> + ); + } + + return ( + <Select + {...fieldProps} + multiple={props.multiple} + placeholder={props.placeholder} + disabled={props.disabled} + showSearch={true} + mode={props.mode || null} + optionFilterProp='children' + filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0} + style={{ width: '100%' }} + > + {this.state.options.map(r => { + return ( + <Option value={r.value} key={r.value + r.label + props.id}> + {r.label} + </Option> + ); + })} + </Select> + ); + } + + renderTree(fieldProps) { + const props = this.props; + const tree = this.state.options; + return ( + <TreeSelect + {...fieldProps} + placeholder={props.placeholder} + style={{ width: '100%' }} + disabled={props.disabled} + allowClear={props.allowClear} + treeData={this.renderTreeData(tree)} + treeDefaultExpandAll + > + {this.renderTreeNodes(tree)} + </TreeSelect> + ); + } + + renderTreeData(data) { + if (!(data instanceof Array)) { + data = [data]; + } + + // label: 'Node1', + // value: '0-0', + // key: '0-0', + const loop = el => { + el.label = el.name; + el.value = el.id; + el.key = el.id; + if (el.children) { + el.children.forEach(loop); + } + }; + data.forEach(loop); + return data; + } + + renderTreeNodes(data) { + if (!(data instanceof Array)) { + data = [data]; + } + return data.map(item => { + const $title = <span> {item.name} </span>; + + if (item.children && item.children.length > 0) { + return ( + <TreeNode key={item.id} value={item.id} title={$title}> + {this.renderTreeNodes(item.children)} + </TreeNode> + ); + } + return <TreeNode key={item.id} value={item.id} title={$title} />; + }); + } +} + +export default MSelect; diff --git a/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Slider.jsx b/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Slider.jsx new file mode 100644 index 0000000000000000000000000000000000000000..9aaea76b20271cad2fc374b5a470a33a89e4de32 --- /dev/null +++ b/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Slider.jsx @@ -0,0 +1,102 @@ +import React from 'react'; +import { Col, Form, Slider, InputNumber, Tooltip, Icon } from 'antd'; +const FormItem = Form.Item; +import T from 'prop-types'; + +class MSlider extends React.Component { + static propTypes = { + label: T.string, + labelColSpan: T.number, + wrapperColSpan: T.number, + help: T.string, + tip: T.string, + value: T.number, + initialValue: T.number, + min: T.number, + max: T.number, + step: T.number, + marks: T.object, + syncInputNumber: T.bool, + dots: T.bool, + form: T.object.isRequired, + path: T.string.isRequired + }; + static defaultProps = { + label: '选择', + labelColSpan: 4, + wrapperColSpan: 18, + min: 0, + max: 100, + step: 1, + dots: false, + syncInputNumber: false + }; + + + render() { + const props = this.props; + const { getFieldProps } = this.props.form; + const fieldProps = getFieldProps(props.path, { + initialValue: props.initialValue, + rules: props.rules, + onChange: this.onChange + }); + const itemProps = { + label: props.label, + labelCol: { span: props.labelColSpan }, + wrapperCol: { span: props.wrapperColSpan } + }; + if (props.help) { + itemProps.help = props.help; + } + if (props.tip) { + itemProps.label = ( + <span> + {props.label} + <Tooltip title={props.tip}> + <Icon type='question-circle-o' /> + </Tooltip> + </span> + ); + } + + console.log('slider:', props, this.props.value); + + return ( + <FormItem {...itemProps}> + <Col span={props.syncInputNumber ? 20 : 24}> + <Slider + {...fieldProps} + disabled={this.props.disabled} + min={props.min} + max={props.max} + step={props.step} + marks={props.marks} + dots={props.dots} + /> + </Col> + {props.syncInputNumber ? ( + <Col span={4}> + <InputNumber + min={props.min} + max={props.max} + step={props.step ? props.step : 1} + value={this.props.value} + onChange={this.onChange} + /> + </Col> + ) : ( + '' + )} + </FormItem> + ); + } + + onChange = (value) => { + this.setState({ + value + }); + } +} + +export default MSlider; diff --git a/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Switch.jsx b/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Switch.jsx new file mode 100644 index 0000000000000000000000000000000000000000..f8e4827fde9d3d27d154f91d855495298b4e357a --- /dev/null +++ b/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Switch.jsx @@ -0,0 +1,73 @@ +import React from 'react'; +import { Form, Switch, Tooltip, Icon } from 'antd'; +const FormItem = Form.Item; +import T from 'prop-types'; + +class MSwitch extends React.Component { + static propTypes= { + label: T.string, + labelColSpan: T.number, + wrapperColSpan: T.number, + help: T.string, + tip: T.string, + value: T.bool, + initialValue: T.bool, + checkedChildren: T.string, + unCheckedChildren: T.string, + size: T.string, + form: T.object.isRequired, + path: T.string.isRequired + }; + static defaultProps = { + label: '选择', + labelColSpan: 4, + wrapperColSpan: 18, + initialValue: false + }; + render() { + const props = this.props; + const { getFieldProps } = this.props.form; + const fieldProps = getFieldProps(props.path, { + initialValue: props.initialValue, + rules: props.rules, + onChange() { + props.onFieldChange({ + path: `${props.path}.${props.name}`, + args: arguments + }); + } + }); + const itemProps = { + label: props.label, + labelCol: { span: props.labelColSpan }, + wrapperCol: { span: props.wrapperColSpan } + }; + if (props.help) { + itemProps.help = props.help; + } + if (props.tip) { + itemProps.label = ( + <span> + {props.label} + <Tooltip title={props.tip}> + <Icon type='question-circle-o' /> + </Tooltip> + </span> + ); + } + return ( + <FormItem {...itemProps}> + <Switch + {...fieldProps} + size={props.size} + defaultChecked={props.initialValue} + checkedChildren={props.checkedChildren} + unCheckedChildren={props.unCheckedChildren} + disabled={this.props.disabled} + /> + </FormItem> + ); + } +} + +export default MSwitch; diff --git a/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/TextInput.jsx b/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/TextInput.jsx new file mode 100644 index 0000000000000000000000000000000000000000..1972a5dffcdae0d51b0a916ba2f1a4787264a892 --- /dev/null +++ b/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/TextInput.jsx @@ -0,0 +1,100 @@ +import React from 'react'; +import { + Form, + Input, + Select, + Button, + Checkbox, + Radio, + Tooltip, + Icon +} from 'antd'; +const FormItem = Form.Item; +import T from 'prop-types'; + +class TextInput extends React.Component { + static propTypes = { + label: T.string, + labelColSpan: T.number, + wrapperColSpan: T.number, + help: T.string, + tip: T.string, + value: T.string, + required: T.bool, + disabled: T.bool, + readonly: T.bool, + hidden: T.bool, + placeholder: T.string, + form: T.object.isRequired, + name: T.string.isRequired, + rules: T.array, + path: T.string.isRequired, + inputType: T.string + }; + static defaultProps = { + label: '输入框', + labelColSpan: 4, + wrapperColSpan: 18, + disabled: false, + readonly: false, + required: false, + hidden: false, + placeholder: '请输入...' + }; + + render() { + const props = this.props; + const { getFieldProps,getFieldValue } = this.props.form; + const fieldProps = getFieldProps(props.path, { + rules: props.rules, + onChange: this.onChange, + initialValue: props.initialValue + }); + const itemProps = { + label: props.label, + labelCol: { span: props.labelColSpan }, + wrapperCol: { span: props.wrapperColSpan }, + className: props.hidden ? 'hide' : '' + }; + if (props.help) { + itemProps.help = props.help; + } + if (props.tip) { + itemProps.label = ( + <span> + {props.label} + <Tooltip title={props.tip}> + <Icon type='question-circle-o' /> + </Tooltip> + </span> + ); + } + const spreadProps = {}; + if (props.inputType) { + spreadProps.type = props.inputType; + } + return ( + <FormItem {...itemProps}> + <Input + {...props} + {...fieldProps} + {...spreadProps} + onBlur={()=>{ + if(typeof props.onBlur === 'function'){ + props.onBlur(getFieldValue(props.path),this.props.form) + } + } + } + disabled={this.props.disabled} + placeholder={props.placeholder} + /> + </FormItem> + ); + } + + onChange() { + // console.log('onChange'); + } +} + +export default TextInput; diff --git a/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Textarea.jsx b/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Textarea.jsx new file mode 100644 index 0000000000000000000000000000000000000000..7057daec3e0684801e50e87c2446009f88d0499c --- /dev/null +++ b/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/Textarea.jsx @@ -0,0 +1,90 @@ +import React from 'react'; +import { + Form, + Input, + Select, + Button, + Checkbox, + Radio, + Tooltip, + Icon +} from 'antd'; +const FormItem = Form.Item; +import T from 'prop-types'; +const { TextArea } = Input; + +class Textarea extends React.Component { + static propTypes={ + label: T.string, + labelColSpan: T.number, + wrapperColSpan: T.number, + help: T.string, + tip: T.string, + hidden: T.bool, + value: T.string, + required: T.bool, + disabled: T.bool, + readonly: T.bool, + placeholder: T.string, + form: T.object.isRequired, + name: T.string.isRequired, + row: T.number, + rules: T.array, + path: T.string.isRequired + }; + static defaultProps = { + label: '文本框', + labelColSpan: 4, + wrapperColSpan: 18, + disabled: false, + readonly: false, + required: false, + hidden: false, + placeholder: '请输入...', + rows: 3 + } + + render() { + const props = this.props; + const { getFieldProps, getFieldError, isFieldValidating } = this.props.form; + const fieldProps = getFieldProps(props.path, { + rules: props.rules, + onChange: this.onChange, + initialValue: props.initialValue + }); + const itemProps = { + label: props.label, + labelCol: { span: props.labelColSpan }, + wrapperCol: { span: props.wrapperColSpan }, + className: props.hidden ? 'hide' : '' + }; + if (props.help) { + itemProps.help = props.help; + } + if (props.tip) { + itemProps.label = ( + <span> + {props.label} + <Tooltip title={props.tip}> + <Icon type='question-circle-o' /> + </Tooltip> + </span> + ); + } + return ( + <FormItem {...itemProps}> + <TextArea + {...fieldProps} + rows='3' + disabled={this.props.disabled} + placeholder={props.placeholder} + /> + </FormItem> + ); + } + onChange() { + // console.log('onChange'); + } +} + +export default Textarea; diff --git a/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/index.js b/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/index.js new file mode 100644 index 0000000000000000000000000000000000000000..7a4dcb239fba0ca076dc053da813c3b81797efce --- /dev/null +++ b/cyclone-web/app/components/idcos-form/FormGenerator/FormElements/index.js @@ -0,0 +1,24 @@ +import Obj from './Object'; +import Arr from './Array'; +import Checkboxes from './Checkboxes'; +import Radios from './Radios'; +import Select from './Select'; +import Textarea from './Textarea'; +import TextInput from './TextInput'; +import Number from './Number'; +import Switch from './Switch'; +import Slider from './Slider'; +import DatePicker from './DatePicker'; +export default { + Object: Obj, + Array: Arr, + Checkboxes, + Radios, + Select, + TextInput, + Textarea, + Number, + Switch, + Slider, + DatePicker +}; diff --git a/cyclone-web/app/components/idcos-form/FormGenerator/index.jsx b/cyclone-web/app/components/idcos-form/FormGenerator/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..ba2d1ba846570370ec4a2ea8db3e8cd7d760c1ee --- /dev/null +++ b/cyclone-web/app/components/idcos-form/FormGenerator/index.jsx @@ -0,0 +1,115 @@ +import React from 'react'; +import { Form } from 'antd'; +import DynamicForm from './DynamicForm'; +import { resolve } from 'common/resolve'; +import styles from './styles.less'; + +const createForm = Form.create; +import T from 'prop-types'; +const F = function () {}; +class FormGenerator extends React.Component { + state = { + CustomForm: createForm()(DynamicForm) + }; + static propTypes = { + schema: T.shape({ + name: T.string.isRequired, + id: T.string.isRequired, + description: T.string, + elements: T.array, + onSubmit: T.func, + onFieldChange: T.func, + dependsOn: T.shape({ + dependents: T.array, + triggered: T.object, + action: T.func + }) + }), + showSubmit: T.bool, + showTest: T.bool, + showCancel: T.bool, + showPrepare: T.bool, + hideReset: T.bool, + initialValue: T.object + }; + static defaultProps = { + schema: { + elements: [] + }, + initialValue: {}, + showSubmit: true, + onSubmit: F, + onFieldChange: F + }; + render() { + const CustomForm = this.state.CustomForm; + return ( + <div className={styles.formGenerator}> + <div className='dynamic-form'> + <CustomForm + ref='customForm' + {...this.props} + onSubmit={this.onSubmit} + onCancel={this.onCancel} + onTest={this.onTest} + onPrepare={this.onPrepare} + updateProps={this.updateProps} + onFieldChange={this.props.onFieldChange} + /> + </div> + </div> + ); + } + + /** + * [resetFields description] + * @return {[type]} [description] + */ + resetFields = (names) => { + this.refs.customForm.resetFields(names); + }; + + onCancel = (values) => { + this.props.onCancel(values); + }; + onTest = (values) => { + this.props.onTest(values); + }; + onPrepare = (values) => { + this.props.onPrepare(values); + }; + + /** + * @param {[type]} props [description] + * @param {[type]} fields [description] + * @return {[type]} [description] + */ + onFieldChange = (props, fields) => { + this.props.onFieldChange(props, fields); + } + + /** + * [onSubmit description] + * @param {[type]} values [description] + * @return {[type]} [description] + */ + onSubmit =(values) => { + this.props.onSubmit(values); + } + + /** + * updateProps + * + * @name updateProps + * @function + * @param key + * @param obj + * @returns {undefined} + */ + updateProps = (path, key, value) => { + const schema = resolve(path, this.props, key, value); + this.setState({ schema }); + } +} + +export default FormGenerator; diff --git a/cyclone-web/app/components/idcos-form/FormGenerator/objectPath.js b/cyclone-web/app/components/idcos-form/FormGenerator/objectPath.js new file mode 100644 index 0000000000000000000000000000000000000000..47fedfddc255c5fbb930e86e98760ac4c1c1be04 --- /dev/null +++ b/cyclone-web/app/components/idcos-form/FormGenerator/objectPath.js @@ -0,0 +1,42 @@ +import objectPath from 'object-path'; + +/** + * [flatten description] + * @param {[type]} toFlatten [description] + * @param {[type]} prefix [description] + * @return {[type]} [description] + */ +function flatten(toFlatten, prefix) { + const result = {}; + let key; + const traveseObject = function (theObject, path) { + if (!(typeof theObject === 'string') && theObject instanceof Array) { + for (let i = 0; i < theObject.length; i++) { + // var key = path + "[" + i + "]"; + key = `${path}.${i}`; + if (typeof theObject[i] === 'string') { + result[key] = theObject[i]; + } else { + traveseObject(theObject[i], key); + } + } + } else { + if (path.length > 0) { + path = path + '.'; + } + for (const prop in theObject) { + if (theObject[prop] instanceof Object || (theObject[prop] instanceof Array && !(typeof theObject[prop] === 'string' || theObject[prop] instanceof String))) { + traveseObject(theObject[prop], path + prop); + } else { + key = path + prop; + result[key] = theObject[prop]; + } + } + } + }; + traveseObject(toFlatten, prefix); + return result; +} +export default { ...objectPath, + flatten +}; diff --git a/cyclone-web/app/components/idcos-form/FormGenerator/styles.less b/cyclone-web/app/components/idcos-form/FormGenerator/styles.less new file mode 100644 index 0000000000000000000000000000000000000000..16a4573a5b9cb4b2624ea4559699d7248630b3f0 --- /dev/null +++ b/cyclone-web/app/components/idcos-form/FormGenerator/styles.less @@ -0,0 +1,10 @@ +.formGenerator { /* stylelint-disable */ + :global { + .ant-input-number { + width: 100%!important; + } + .hide{ + display: none; + } + } +} diff --git a/cyclone-web/app/components/idcos-form/advance-form.jsx b/cyclone-web/app/components/idcos-form/advance-form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..07a72b62fb89f7995b06f92b4b1f885be648b05e --- /dev/null +++ b/cyclone-web/app/components/idcos-form/advance-form.jsx @@ -0,0 +1,276 @@ +import React from 'react'; +import FormGenerator from './FormGenerator'; +import { notification } from 'antd'; +import { post, put, del } from './common/xFetch2'; +const nil = () => {}; +export default class CustomForm extends React.Component { + + constructor(props) { + super(props); + if (this.props.schema) { + this.props.schema.forceUpdate = this.forceUpdate.bind(this); + } + this.state = { + loading: false, + schema: this.props.schema, + message: this.props.message + }; + } + + componentWillReceiveProps(nextProps) { + if (nextProps.schema) { + if (this.state.schema !== nextProps.schema) { + nextProps.schema.forceUpdate = this.forceUpdate.bind(this); + this.setState({ + schema: nextProps.schema + }); + } + } + } + handleTest = values => { + + if (this.state.testLoading) { + return; + } + + this.setState({ + testLoading: true + }); + + let api = this.props.testApi; + let method = post; + + values = values || {}; + Object.keys(values).forEach(k => { + const v = values[k]; + if (v && v.toDate) { + values[k] = v.format('YY-MM-DD hh:mm:ss'); + } + }); + + const onError = ret => { + this.setState({ + testLoading: false + }); + notification.error({ + message: ret.message + }); + }; + + const data = { + ...values, + ...this.props.extraData + }; + method(api, data).then(ret => { + if (ret.status === 'success') { + this.setState({ + testLoading: false + }); + notification.success({ + message: '执行成功' + }); + } else { + onError(ret); + } + }, onError + ); + } + handleSubmit = values => { + if (this.props.beforeSubmit) { + const flag = this.props.beforeSubmit(values); + if (flag) { + return; + } + } + if (this.state.loading) { + return; + } + + this.setState({ + loading: true, + message: this.props.loadingMessage || this.props.message + }); + + + let api = this.props.api; + + let method = post; + if (this.props.method === 'put') { + method = put; + } else if (this.props.method === 'delete') { + method = del; + } + + values = values || {}; + Object.keys(values).forEach(k => { + const v = values[k]; + if (v && v.toDate) { + values[k] = v.format('YY-MM-DD hh:mm:ss'); + } + //去除空格 + if (this.props.trim) { + if (typeof v === 'string') { + values[k] = v.trim(); + } else if (typeof v === 'object' && Array.isArray(v)) { + values[k] = v.map(it => it.trim()); + } + } + }); + + + + if (this.props.getApi) { + api = this.props.getApi({ + ...values, + ...this.props.extraData + }); + } + + const onError = ret => { + this.setState({ + loading: false, + message: this.props.errorMessage || this.props.message + }); + + if (this.props.beforeError) { + this.props.beforeError(ret); + } else { + notification.error({ + message: ret.message + }); + } + //返回失败时不关闭弹窗,保留数据 + //this.props.onError(ret); + }; + + let data = null; + //处理数组格式的数据 + if (this.props.isArray) { + data = this.props.dataArray; + } else if (this.props.nullData) { + //处理{} + data = {}; + } else { + //其他 + data = { + ...values, + ...this.props.extraData + }; + } + method(api, data).then(ret => { + if (ret.status === 'success') { + if (this.props.itemResult && ret.item.success === false) { + return onError(ret); + } + this.setState({ + loading: false, + message: this.props.successMessage || this.props.message + }); + + // 是否要拦截成功的处理逻辑 + let isProcessSuccess = true; + if (this.props.beforeSuccess) { + isProcessSuccess = this.props.beforeSuccess(ret); + } + + if (isProcessSuccess) { + notification.success({ + message: '执行成功' + }); + this.props.onSuccess(ret); + } + } else { + onError(ret); + } + }, onError + ); + }; + + render() { + const props = this.props; + let $content = null; + //返回失败时不关闭弹窗,保留数据 + if (props.type === 'form') { + $content = this.renderForm(); + } + + if (props.type === 'confirm') { + $content = this.renderConfirm(); + } + + return <div className='custom-form'>{$content}</div>; + } + + renderForm = () => { + const props = this.props; + const initialValue = props.initialValue; + const schema = props.schema; + //提示语补充 + if (schema.elements && schema.elements.length > 0) { + schema.elements.map(ele => { + if (ele.rules && ele.rules.length > 0) { + ele.rules.map(rule => { + if (rule.required && !rule.message) { + rule.message = `${ele.label}不能为空`; + } + }); + } + }); + } + + return ( + <div className='form'> + <div className='info'>{props.message}</div> + <FormGenerator + schema={schema} + initialValue={initialValue} + onSubmit={this.handleSubmit} + onTest={this.handleTest} + showTest={this.props.showTest} + /> + </div> + ); + }; + + + renderConfirm = () => { + const props = this.props; + return ( + <div className='ant-confirm ant-confirm-confirm'> + <div className='ant-modal-body' style={{ padding: 12 }}> + <div className='ant-confirm-body-wrapper'> + <div className='ant-confirm-body'> + <i className='anticon anticon-question-circle' /> + <span className='ant-confirm-title'> + {this.state.message} + </span> + <div className='ant-confirm-content'> + {props.extraMessage}</div> + </div> + <div className='ant-confirm-btns'> + <button type='button' className='ant-btn' disabled={this.state.loading} onClick={ev => { + this.props.onCancel(); + }} + ><span>取 消</span></button> + <button type='button' className='ant-btn ant-btn-primary' + disabled={this.state.loading} onClick={ev => { + this.handleSubmit(); + }} + ><span>确 定</span></button> + </div> + </div> + </div> + </div> + ); + }; +} + +CustomForm.defaultProps = { + reload: nil, + handleSubmit: nil, + successMessage: '执行成功', + triggerClassName: '', + type: 'form', + extraData: {}, + dataArray: [] +}; diff --git a/cyclone-web/app/components/idcos-form/detail-form.jsx b/cyclone-web/app/components/idcos-form/detail-form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..626f7c6757ac31622f09c8a21c30a4943cc2bfef --- /dev/null +++ b/cyclone-web/app/components/idcos-form/detail-form.jsx @@ -0,0 +1,65 @@ +import React from 'react'; +import FormGenerator from './FormGenerator'; +import { post, put, del, get } from './common/xFetch2'; +export default class CustomForm extends React.Component { + + componentDidMount() { + if (this.props.getDetail) { + const self = this; + async function getDetail() { + try { + const ret = await get(`${self.props.detailAPI}`); + if (ret.status === 'success') { + const data = ret.item; + if (self.props.jsonParse && data[self.props.jsonParse]) { + const jsonParseData = JSON.parse(data[self.props.jsonParse]); + self.props.parseData.map(key => { + data[key] = jsonParseData[key]; + }); + } + self.setState({ + initialValue: data + }); + } + } catch (err) { + console.log(err); + } + } + getDetail(); + } + } + constructor(props) { + super(props); + this.state = { + initialValue: {} + }; + } + + + render() { + let $content = this.renderForm(); + return ( + <div className='custom-form'> + {$content} + </div> + ); + } + + renderForm = () => { + const props = this.props; + const initialValue = props.initialValue || this.state.initialValue; + return ( + <div className='form'> + <FormGenerator + schema={props.schema} + initialValue={initialValue} + showSubmit={false} + /> + </div> + ); + } + +} +CustomForm.defaultProps = { + type: 'form' +}; diff --git a/cyclone-web/app/components/layout/page-layout-tabs.jsx b/cyclone-web/app/components/layout/page-layout-tabs.jsx new file mode 100644 index 0000000000000000000000000000000000000000..c313d5d590228fe526a81cf424128338b33cea1a --- /dev/null +++ b/cyclone-web/app/components/layout/page-layout-tabs.jsx @@ -0,0 +1,23 @@ +import React from 'react'; +import { Row, Col } from 'antd'; + +export default class Layout extends React.Component { + render() { + return ( + <div className='approot-inner'> + <div className='approot-inner-content'> + <div className='page-body' style={{ paddingTop: 0 }}> + <div className='page-tabs-unBordered'> + <div className='page-unBorderedTitle'>{this.props.title}</div> + <Row style={{ height: '100%' }}> + <Col style={{ height: '100%' }}> + {this.props.children} + </Col> + </Row> + </div> + </div> + </div> + </div> + ); + } +} diff --git a/cyclone-web/app/components/layout/page-layout.jsx b/cyclone-web/app/components/layout/page-layout.jsx new file mode 100644 index 0000000000000000000000000000000000000000..5ca8b13763223221511bf0fe2a4dc7c39e7159a9 --- /dev/null +++ b/cyclone-web/app/components/layout/page-layout.jsx @@ -0,0 +1,18 @@ +import React from 'react'; + +export default class Layout extends React.Component { + render() { + return ( + <div className='approot-inner'> + <div className='approot-inner-content'> + <div className={'page-node-report page'}> + {this.props.title && <div className='page-header'>{this.props.title}</div>} + <div className='page-body'> + {this.props.children} + </div> + </div> + </div> + </div> + ); + } +} diff --git a/cyclone-web/app/components/menu/menu-util-head.jsx b/cyclone-web/app/components/menu/menu-util-head.jsx new file mode 100644 index 0000000000000000000000000000000000000000..32b3db64515dc45598ec3d82357b0664748b15ca --- /dev/null +++ b/cyclone-web/app/components/menu/menu-util-head.jsx @@ -0,0 +1,77 @@ +/** + * Created by souakiragen on 2017/6/5. + */ +import React, { Component } from 'react'; +import { Menu, Icon, Dropdown } from 'antd'; +import { getPermissonBtn } from 'common/utils'; + +export default class PermissionMenus extends Component { + + render() { + const menu = ( + <Menu> + <Menu.Item> + <a + onClick={() => { + this.props.showAbout(); + }} + > + 关于 + </a> + </Menu.Item> + <Menu.Item> + <a + onClick={() => { + this.props.changePwd(); + }} + > + 修改密码 + </a> + </Menu.Item> + <Menu.Item> + <a + style={{ borderTop: '1px solid #e2e7ec' }} + onClick={() => { + this.props.logout(); + }} + > + 退出登录 + </a> + </Menu.Item> + </Menu> + ); + const userData = this.props.userData; + return ( + <div> + <div className='app-header-btn' onClick={this.props.handlerCollapse}> + <div className='btn-circle'> + <i className={'conf icon-Group1'} /> + </div> + </div> + <div className='app-header-left'> + <div className='app-header-logo'> + <img className='logo' src={this.props.logoUrl} /> + </div> + </div> + <div className='app-header-login'> + <span + className='app-theme' + style={{ marginRight: '10px' }} + onClick={this.props.changeTheme} + > + <i + className={'conf icon-painter-palette'} + style={{ marginRight: 8 }} + /> + </span> + <Dropdown overlay={menu} style={{ float: 'right' }}> + <a className='ant-dropdown-link'> + {userData.name} <Icon type='down' /> + <img src='assets/icon/icon_avatar.png' alt='' width='32' style={{ marginLeft: 8 }}/> + </a> + </Dropdown> + </div> + </div> + ); + } +} diff --git a/cyclone-web/app/components/menu/menu-util-main-collapsed.jsx b/cyclone-web/app/components/menu/menu-util-main-collapsed.jsx new file mode 100644 index 0000000000000000000000000000000000000000..4c7f1ecc2cfcc735f49ac689d9d6dce3d36fc31e --- /dev/null +++ b/cyclone-web/app/components/menu/menu-util-main-collapsed.jsx @@ -0,0 +1,79 @@ +/** + * Created by souakiragen on 2017/6/5. + */ +import React, { Component } from 'react'; +import { arrayFind } from '../../common/util'; +import { IndexLink, hashHistory } from 'react-router'; +import { Menu, Icon, notification, Dropdown, Tooltip } from 'antd'; +const SubMenu = Menu.SubMenu; + +export default class PermissionMenus extends Component { + render() { + const renderIcon = item => { + if (item.transform) { + return item.transform(item.icon); + } else { + return <Icon type={item.icon} />; + } + }; + + const renderTitle = item => { + if (item.titleFormat) { + return item.titleFormat(); + } else { + return ( + <Tooltip placement='rightTop' title={item.description}> + <a className='ant-menu-item'>{item.icon}</a> + </Tooltip> + ); + } + }; + const renderMenuItem = item => { + if (item.children) { + return ( + <SubMenu key={item.key} title={renderTitle(item)}> + {item.children.map(child => { + return renderMenuItem(child); + })} + </SubMenu> + ); + } else if (item.icon) { + return ( + <Menu.Item key={item.key} disabled={item.disabled}> + <Tooltip placement='rightTop' title={item.description}> + <IndexLink to={item.link}> + <span>{item.icon}</span> + </IndexLink> + </Tooltip> + </Menu.Item> + ); + } + }; + + const permissions = this.props.permissions; + const filterMenuItems = (items = []) => { + const results = items.filter(item => { + return ( + item.withPermission || arrayFind(permissions, item.permissionKey) + ); + }); + for (const result of results) { + if (result.children) { + result.children = filterMenuItems(result.children); + } + } + return results; + }; + const menuItems = filterMenuItems(this.props.menuItems); + + if (this.props.menuPreRender) { + this.props.menuPreRender(menuItems); + } + + const menus = menuItems.map(item => { + return renderMenuItem(item); + }); + + return <Menu {...this.props}>{menus}</Menu>; + } +} diff --git a/cyclone-web/app/components/menu/menu-util-main.jsx b/cyclone-web/app/components/menu/menu-util-main.jsx new file mode 100644 index 0000000000000000000000000000000000000000..70da064c755b9b41fb0d1f26e1d6b8fff23c8655 --- /dev/null +++ b/cyclone-web/app/components/menu/menu-util-main.jsx @@ -0,0 +1,93 @@ +/** + * Created by souakiragen on 2017/6/5. + */ +import React, { Component } from 'react'; +import { arrayFind } from '../../common/util'; +import { IndexLink, hashHistory } from 'react-router'; +import { Menu, Icon, notification, Dropdown, Tooltip } from 'antd'; +const SubMenu = Menu.SubMenu; + +export default class PermissionMenus extends Component { + render() { + const renderIcon = item => { + if (item.transform) { + return item.transform(item.icon); + } else { + return <Icon type={item.icon} />; + } + }; + + + const renderTitle = item => { + if (item.titleFormat) { + return item.titleFormat(); + } else { + return ( + <span> + {item.icon} <span>{item.description}</span> + </span> + ); + } + }; + const renderMenuItem = item => { + if (item.children) { + return ( + <SubMenu key={item.key} title={renderTitle(item)}> + {item.children.map(child => { + return renderMenuItem(child); + })} + </SubMenu> + ); + } else if (item.icon) { + return ( + <Menu.Item key={item.key} disabled={item.disabled}> + <IndexLink to={item.link}> + {item.icon} <span>{item.description}</span> + </IndexLink> + </Menu.Item> + ); + + } else if (item.linkGo) { + return ( + <Menu.Item key={item.key} disabled={item.disabled}> + <a href={item.linkGo} target='blank'> + {item.iconGo} <span>{item.description}</span> + </a> + </Menu.Item> + ); + } else { + return ( + <Menu.Item key={item.key} disabled={item.disabled}> + <IndexLink to={item.link}>{item.description}</IndexLink> + </Menu.Item> + ); + } + }; + + const permissions = this.props.permissions; + const filterMenuItems = (items = []) => { + const results = items.filter(item => { + return ( + item.withPermission || arrayFind(permissions, item.permissionKey) + ); + }); + for (const result of results) { + if (result.children) { + result.children = filterMenuItems(result.children); + } + } + return results; + }; + const menuItems = filterMenuItems(this.props.menuItems); + + if (this.props.menuPreRender) { + this.props.menuPreRender(menuItems); + } + + const menus = menuItems.map(item => { + return renderMenuItem(item); + }); + + return <Menu {...this.props}>{menus}</Menu>; + } +} diff --git a/cyclone-web/app/components/menu/menu-util.jsx b/cyclone-web/app/components/menu/menu-util.jsx new file mode 100644 index 0000000000000000000000000000000000000000..3053f47b970defa1a54e384485d98e203327cf39 --- /dev/null +++ b/cyclone-web/app/components/menu/menu-util.jsx @@ -0,0 +1,92 @@ +/** + * Created by souakiragen on 2017/6/5. + */ +import React, { Component } from 'react'; +import { arrayFind } from '../../common/util'; +import { IndexLink } from 'react-router'; +import { Menu, Icon } from 'antd'; +const SubMenu = Menu.SubMenu; +export default class PermissionMenus extends Component { + render() { + const renderIcon = item => { + if (item.transform) { + return item.transform(item.icon); + } else { + return <Icon type={item.icon} />; + } + }; + const renderTitle = item => { + if (item.titleFormat) { + return item.titleFormat(); + } else { + return item.title; + } + }; + const renderMenuItem = item => { + if (item.children) { + return ( + <SubMenu key={item.key} title={renderTitle(item)}> + {item.children.map(child => { + return renderMenuItem(child); + })} + </SubMenu> + ); + } else if (item.icon) { + return ( + <Menu.Item key={item.key} disabled={item.disabled}> + <IndexLink to={item.link}> + {item.icon} {item.description} + </IndexLink> + </Menu.Item> + ); + } else { + return ( + <Menu.Item key={item.key} disabled={item.disabled}> + <IndexLink to={item.link}> + {item.description} + </IndexLink> + </Menu.Item> + ); + } + }; + const permissions = this.props.permissions; + const filterMenuItems = (items = []) => { + const results = items.filter(item => { + return item.withPermission || arrayFind(permissions, item.permissionKey); + }); + for (const result of results) { + if (result.children) { + result.children = filterMenuItems(result.children); + } + } + return results; + }; + const menuItems = filterMenuItems(this.props.menuItems); + + if (this.props.menuPreRender) { + this.props.menuPreRender(menuItems); + } + + const menus = menuItems.map(item => { + return renderMenuItem(item); + }); + const preMenus = []; + const laterMenus = React.Children.map(this.props.children, child => { + if ( + child.props.later && + (child.props.later === true || child.props.later === 'true') + ) { + return child; + } else { + preMenus.push(child); + } + }); + return ( + <Menu {...this.props}> + {preMenus} + {menus} + {laterMenus} + </Menu> + ); + } +} diff --git a/cyclone-web/app/components/notification/SwalNotification.js b/cyclone-web/app/components/notification/SwalNotification.js new file mode 100644 index 0000000000000000000000000000000000000000..dc0fda85f1a7d5da71158a238fa131de8283db69 --- /dev/null +++ b/cyclone-web/app/components/notification/SwalNotification.js @@ -0,0 +1,16 @@ +/** + * 简单封装下,然后在 index 中注册为 swal,和 ember 用法类似。 + * + * Created by cxc on 17/6/7. + */ +import { notification } from 'antd'; +export default function(type, message = '', description = '', duration) { + if (duration !== null) { + duration = duration ? duration : 2; + } + notification[type]({ + duration, + message, + description + }); +} diff --git a/cyclone-web/app/components/popup/draw.jsx b/cyclone-web/app/components/popup/draw.jsx new file mode 100644 index 0000000000000000000000000000000000000000..e167d5bebf63df76f359f2eccf0cfa50fa2b0c44 --- /dev/null +++ b/cyclone-web/app/components/popup/draw.jsx @@ -0,0 +1,40 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import { Drawer, LocaleProvider } from 'antd'; +import { translationMessages } from 'i18n'; +import zh_CN from 'antd/lib/locale-provider/zh_CN'; + +const div = document.createElement('div'); +document.body.appendChild(div); +div.id = 'Drawer'; +export function open(config) { + const locale = config.locale || 'zh_CN'; + ReactDOM.render( + <LocaleProvider + locale={zh_CN} + > + <Drawer + visible={true} + placement={config.placement || 'right'} + destroyOnClose={true} + title={config.title} + width={config.width || '1280'} + height={config.height} + wrapClassName={config.wrapClassName} + onClose={config.onCancel || null} + > + {config.content} + </Drawer> + </LocaleProvider>, + div + ); +} + +export function close() { + const unmountResult = ReactDOM.unmountComponentAtNode(div); +} + +export default { + open, + close +}; diff --git a/cyclone-web/app/components/popup/index.jsx b/cyclone-web/app/components/popup/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..0abcf132a69320210a124a107f402bdfcd474038 --- /dev/null +++ b/cyclone-web/app/components/popup/index.jsx @@ -0,0 +1,47 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import { Modal, LocaleProvider } from 'antd'; +import { translationMessages } from 'i18n'; +import zh_CN from 'antd/lib/locale-provider/zh_CN'; + +const div = document.createElement('div'); +document.body.appendChild(div); +div.id = 'modal1'; +export function open(config) { + const El = config.content; + const locale = config.locale || 'zh'; + ReactDOM.render( + <LocaleProvider + locale={zh_CN} + > + <Modal + visible={true} + title={config.title} + footer={config.footer || false} + onOk={config.onOk || null} + width={config.width} + height={config.height} + maskClosable={config.maskClosable || false} + keyboard={config.keyboard} + wrapClassName={config.wrapClassName} + onCancel={config.onCancel || null} + > + {config.content} + </Modal> + </LocaleProvider>, + div + ); +} + +export function close() { + const unmountResult = ReactDOM.unmountComponentAtNode(div); + // if (unmountResult && div.parentNode) { + // div.parentNode.removeChild(div); + // } + // props.onCancel.apply(props, arguments); +} + +export default { + open, + close +}; diff --git a/cyclone-web/app/components/popup/modal.jsx b/cyclone-web/app/components/popup/modal.jsx new file mode 100644 index 0000000000000000000000000000000000000000..c014f480c33b9afacd5babe63a6e4a2808ffccfd --- /dev/null +++ b/cyclone-web/app/components/popup/modal.jsx @@ -0,0 +1,47 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import { Modal } from 'antd'; +import { translationMessages } from 'i18n'; +import { IntlProvider } from 'react-intl'; +const div = document.createElement('div'); +div.id = 'modal2'; +document.body.appendChild(div); +export function open(config) { + const El = config.content; + const locale = config.locale || 'zh'; + ReactDOM.render( + <IntlProvider + locale={locale} + key={locale} + messages={translationMessages[locale]} + > + <Modal + visible={true} + title={config.title} + footer={config.footer || false} + onOk={config.onOk || null} + width={config.width} + height={config.height} + maskClosable={config.maskClosable} + wrapClassName={config.wrapClassName} + onCancel={config.onCancel || null} + > + {config.content} + </Modal> + </IntlProvider>, + div + ); +} + +export function close() { + const unmountResult = ReactDOM.unmountComponentAtNode(div); + // if (unmountResult && div.parentNode) { + // div.parentNode.removeChild(div); + // } + // props.onCancel.apply(props, arguments); +} + +export default { + open, + close +}; diff --git a/cyclone-web/app/components/search-form/demo/index.jsx b/cyclone-web/app/components/search-form/demo/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..4e6cfca3f965696312a3f7e8257609df315507ab --- /dev/null +++ b/cyclone-web/app/components/search-form/demo/index.jsx @@ -0,0 +1,191 @@ +import React from 'react'; +import SearchForm from '../index'; +function getWithArgs(a, b) { + console.log(); +} +const mockData = { + "id": '0', + "name": "全部", + "capacity": 99999, + "children": [ + { + "id": '1', + "name": "中国", + "capacity": 1000, + "used": 0, + "free": 1000, + "children": [ + { + "id": '3', + "name": "浙江", + "capacity": 500, + "used": 0, + "free": 500, + "children": [ + { + "id": '4', + "name": "杭州", + "capacity": 100, + "used": 0, + "free": 100, + "children": [ ] + } + ] + } + ] + }, + { + "id": '2', + "name": "美国", + "capacity": 1000, + "used": 0, + "free": 1000, + "children": [ + { + "id": '51', + "name": "杭州", + "capacity": 100, + "used": 0, + "free": 100, + "children": [ + { + "id": '11', + "name": "中国", + "capacity": 1000, + "used": 0, + "free": 1000, + "children": [ + { + "id": '31', + "name": "浙江", + "capacity": 500, + "used": 0, + "free": 500, + "children": [ + { + "id": '41', + "name": "杭州", + "capacity": 100, + "used": 0, + "free": 100, + "children": [ ] + } + ] + } + ] + }, + { + "id": '21', + "name": "美国", + "capacity": 1000, + "used": 0, + "free": 1000, + "children": [ + { + "id": '52', + "name": "杭州", + "capacity": 100, + "used": 0, + "free": 100, + "children": [ ] + } + ] + } + ] + } + ] + } + ] +}; +export default class Container extends React.Component { + state = { + searchKeys: [ + { label: '单选', key: 'radio' }, + { label: '多选', key: 'checkbox' }, + { label: '输入框', key: 'input' }, + { label: '时间选择器', key: 'rangePicker' }, + { label: '数字输入框', key: 'number' }, + { label: '树', key: 'tree' }, + { label: '级联选择同步', key: 'cascader_ysnc' }, + { label: '级联选择异步', key: 'cascader_aysnc' }, + { label: '区块', key: 'section' } + ], + searchValues: { + 'radio': { type: 'radio', list: [{ label: 'A1', value: 'a1' }, { label: 'A2', value: 'a2' }] }, + 'checkbox': { type: 'checkbox', list: [{ label: 'B1', value: 'b1' }, { label: 'B2', value: 'b2' }] }, + 'input': { type: 'input', placeholder: '请输入,按回车键确定' }, + 'rangePicker': { type: 'rangePicker', placeholder: [ '开始时间', '结束时间' ] }, + 'number': { type: 'number', placeholder: '请输入,按回车键确定' }, + 'tree': { type: 'tree', data: mockData }, + 'cascader_ysnc': { type: 'cascader_ysnc', list: [{ label: 'A1', value: 'a1', children: [{ name: 'children1', id: 1 }, { name: 'children2', id: 2 }] }, { label: 'A2', value: 'a2', children: [{ name: 'children3', id: 3 }, { name: 'children4', id: 4 }] }] }, + 'cascader_aysnc': { + grade: 2, + type: 'cascader_aysnc', + list: [{ value: 1, label: "test" }], + getSecondList: (id) => this.getSecondList(id), + secondList: [], + getThirdList: (id) => this.getThirdList(id), + thirdList: [], + getFourthList: (id) => this.getFourthList(id), + fourthList: [] + }, + 'section': { type: 'section' } + } + }; + + + async getSecondList(id) { + const res = await getWithArgs('/api/cloudboot/v1/server-rooms', { page: 1, page_size: 100, idc_id: id }); + if (res.status !== 'success') { + return; + } + const { searchValues } = this.state; + searchValues.cascader_aysnc.secondList = res.content.records.map(it => { + return { + label: it.name, + value: it.id + }; + }); + this.setState({ searchValues }); + } + + async getThirdList(id) { + const res = await getWithArgs('/api/cloudboot/v1/server-cabinets', { page: 1, page_size: 100, server_room_id: id }); + if (res.status !== 'success') { + return; + } + const { searchValues } = this.state; + searchValues.cascader_aysnc.thirdList = res.content.records.map(it => { + return { + label: it.number, + value: it.id + }; + }); + this.setState({ searchValues }); + } + + async getFourthList(id) { + const res = await getWithArgs('/api/cloudboot/v1/server-usites', { page: 1, page_size: 100, server_cabinet_id: id }); + if (res.status !== 'success') { + return; + } + const { searchValues } = this.state; + searchValues.cascader_aysnc.fourthList = res.content.records.map(it => { + return { + label: it.number, + value: it.id + }; + }); + this.setState({ searchValues }); + } + + onSearch = (data) => { + console.log(data); + }; + + render() { + return ( + <SearchForm onSearch={this.onSearch} searchKeys={this.state.searchKeys} searchValues={this.state.searchValues}/> + ); + } +} diff --git a/cyclone-web/app/components/search-form/index.jsx b/cyclone-web/app/components/search-form/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..2088fdc1e1526754bed93b0b25bde0a19f526312 --- /dev/null +++ b/cyclone-web/app/components/search-form/index.jsx @@ -0,0 +1,737 @@ +import React from 'react'; +import { Input, DatePicker, Calendar, Icon, Radio, Row, Col, Checkbox, Button, Select } from 'antd'; +const CheckboxGroup = Checkbox.Group; +const RadioGroup = Radio.Group; +const { RangePicker } = DatePicker; +import SearchTree from './tree'; +import styles from './search.less'; +import Item from 'antd/lib/list/Item'; + +/** + * 数据模型 + * 搜索项searchKeys[],{label:'',key:''} + * 搜索值searchValues{},{key:{}} + * 初始值/快速搜索:[{ + key: 'usage', + keyLabel: '用途', + value: 'production', + valueLabel: '生产' + }] + */ + +export default class Container extends React.Component { + constructor(props) { + super(props); + this.myRef = React.createRef(); + this.state = { + historyList: [], + showHistoryPanel: false, + KeyDisplay: 'none', + valueDisplay: 'none', + left: 0, + checkboxValue: [], + searchKey: '', + inputValue: '', + section1: '', + searchInputValue: '', + searchAreaValue: '', + searchList: [ + // { key: 'radio', KeyLabel: '单选', valueLabel:'A1', value: 'a1' } + ], + searchKeys: props.searchKeys, + searchValues: props.searchValues, + cascader_children: [], + cascader_label: [], + cascader_value: [], + cascader_label_aysnc: [], + cascader_value_aysnc: [] + }; + } + + + componentDidMount() { + document.body.addEventListener('click', this.handleDocumentClick); + //设置初始值 + const { initialSearchList } = this.props; + if (initialSearchList) { + this.onSubmitFromHistory(initialSearchList); + } + } + + componentWillUnmount() { + document.body.removeEventListener('click', this.handleDocumentClick); + } + + hidePanel = () => { + this.setState({ + KeyDisplay: 'none', + valueDisplay: 'none', + showHistoryPanel: false + }); + }; + + + //提交数据 + submit = (e, type) => { + this.hidePanel(); + if (type === 'input' && e.target.value) { + return this.props.onSearch({ + keyword: e.target.value + }); + } + const historyList = this.state.historyList; + const data = {}; + const searchList_copy = JSON.parse(JSON.stringify(this.state.searchList)); + historyList.push(searchList_copy); + this.setState({ + historyList + }); + searchList_copy.forEach(item => { + data[item.key] = item.value; + }); + this.props.onSearch(data); + }; + + //快速搜索策略,添加搜索项,已存在则替换 + onSubmitFromQuikSearch = (data) => { + let { searchList } = this.state; + const list = JSON.parse(JSON.stringify(searchList)); + list.push(data); + for (let i = 0; i < searchList.length; i ++) { + if (searchList[i].key === data.key) { + list.splice(i, 1); + } + } + this.onSubmitFromHistory(list); + } + + onSubmitFromHistory = (list) => { + this.hidePanel(); + const data = {}; + let { searchKeys, searchList } = this.state; + const copy_searchList = JSON.parse(JSON.stringify(searchList)); + const copy_searchKeys = JSON.parse(JSON.stringify(searchKeys)); + + //并集, 当前的searchList + 当前的searchKeys = 总的searchKeys + const copy_searchList_to_searchKeys = copy_searchList.map(item => { + return { + label: item.keyLabel, key: item.key + }; + }); + const union = [ ...copy_searchKeys, ...copy_searchList_to_searchKeys ]; + //差集 总的searchKeys - list = searchKeys + const difference = union.filter(item => !list.some(i => i.key === item.key)); + this.setState({ + searchList: list, + searchKeys: difference + }); + list.forEach(item => { + data[item.key] = item.value; + }); + this.props.onSearch(data); + }; + + //点击输入框 + dropDown = (e) => { + //KeyMenu位置重置 + this.setState({ + left: 0 + }); + const { searchList } = this.state; + if (searchList.length === 0) { + this.setState({ + valueDisplay: 'none', + KeyDisplay: 'block' + }); + } else { + if (!searchList[searchList.length - 1].value) { + //没有选择值时,显示值选框 + this.setState({ + KeyDisplay: 'none', + valueDisplay: 'block' + }); + } else { + this.setState({ + valueDisplay: 'none', + KeyDisplay: 'block' + }); + } + } + }; + + //搜索框中输入搜索Key + searchKey = (e) => { + this.setState({ + inputValue: e.target.value + }); + }; + + + //删除某一项 + remove = (e, index, item) => { + let { searchList, searchKeys } = this.state; + searchList.splice(index, 1); //显示列表去掉一项 + searchKeys.splice(index, 0, { label: item.keyLabel, key: item.key }); //搜索项增加一项 + this.setState({ + searchKey: '', + searchList, + searchKeys, + cascader_children: [] + }); + this.myRef.current.focus(); + }; + + //清空全部 + clear = () => { + let { searchList, searchKeys } = this.state; + searchList.forEach(item => { + searchKeys.push({ label: item.keyLabel, key: item.key }); + }); + this.setState({ + searchKeys: searchKeys, + searchList: [], + searchKey: '', + inputValue: '', + cascader_children: [] + }); + this.myRef.current.focus(); + }; + + //点击搜索项 + onSearchKeyChange = (e) => { + const value = e.target.value; + let { searchKeys, searchList } = this.state; + searchKeys.forEach((item, index) => { + if (item.key === value) { + searchKeys.splice(index, 1); + searchList.push({ keyLabel: item.label, key: item.key }); + } + }); + this.setState({ + searchKey: value, + KeyDisplay: 'none', + valueDisplay: 'block', + showHistoryPanel: false, + inputValue: '', + searchInputValue: '', + searchAreaValue: '', + searchList, + searchKeys + }); + }; + + //复选框点击确定按钮触发,先存值 + checkboxChange = (value) => { + this.setState({ + checkboxValue: value + }); + }; + + //Section + saveSectionValue = (e) => { + this.setState({ + section1: e.target.value + }); + }; + + //点击搜索值 + onSearchValueChange = (e, type, options) => { + let value; + let label; + switch (type) { + case 'radio': + const v = JSON.parse(e.target.value); + value = v.value; + label = v.label; + + break; + case 'checkbox': + const v2 = this.state.checkboxValue.map(data => JSON.parse(data)); + value = v2.map(data => data.value); + label = v2.map(data => data.label).join(','); + break; + case 'input': + value = label = e.target.value; + break; + case 'textArea': + value = label = this.state.searchAreaValue; + break; + case 'number': + value = label = e.target.value; + break; + case 'rangePicker': + const t0 = e[0].format(options.format || 'YYYY-MM-DD HH:mm:ss'); + const t1 = e[1].format(options.format || 'YYYY-MM-DD HH:mm:ss'); + value = [ t0, t1 ]; + label = t0 + ' ~ ' + t1; + break; + case 'datePicker': + value = label = e.format(options.format || 'YYYY-MM-DD HH:mm:ss'); + break; + case 'calendar': + value = label = e.format(options.format || 'YYYY-MM-DD'); + break; + case 'tree': + value = e.id; + label = e.name; + break; + case 'cascader_ysnc': + const v3 = JSON.parse(e.target.value); + value = [ this.state.cascader_value, v3.id ]; + label = this.state.cascader_label + ' / ' + v3.name; + break; + case 'cascader_aysnc': + const v4 = JSON.parse(e.target.value); + value = [ ...this.state.cascader_value_aysnc, v4.value ]; + label = [ ...this.state.cascader_label_aysnc, v4.label ].join(' / '); + break; + case 'section': + const v5 = e.target.value; + value = [ this.state.section1, v5 ]; + label = [ this.state.section1, v5 ].join(' - '); + break; + default: + value = ''; + label = ''; + } + + let { searchKey, searchList } = this.state; + searchList.forEach(item => { + if (item.key === searchKey) { + item.value = value; + item.valueLabel = label; + } + }); + + this.setState({ + searchList, + valueDisplay: 'none', + KeyDisplay: 'block' //用户操作方便性来讲,选完一个值后显示key框比较方便 + }); + this.myRef.current.focus(); + }; + + //修改值,目前只有输入框的值才有回显 + modifyValue = (item) => { + let width = this.ulContainer.clientWidth - this.inputContainer.clientWidth - this[`inputLi${item.key}`].offsetLeft; + this.setState({ + valueDisplay: 'block', + KeyDisplay: 'none', + searchKey: item.key, + searchInputValue: item.value, + searchAreaValue: Item.value, + left: -width //重定位 + }); + } + + //打开历史记录面板 + openHistoryPanel = () => { + this.setState({ + showHistoryPanel: !this.state.showHistoryPanel, + valueDisplay: 'none', + KeyDisplay: 'none' + }); + }; + //关闭历史记录面板 + closeHistoryPanel = () => { + this.setState({ + showHistoryPanel: false + }); + }; + + //清除历史记录 + clearHistory = () => { + this.setState({ + historyList: [] + }); + }; + + onSearchInputChange = (e) => { + //输入框的值需要可控制清除 + this.setState({ + searchInputValue: e.target.value + }); + }; + onSearchAreaChange = (e) => { + this.setState({ + searchAreaValue: e.target.value + }); + }; + + showChildren = (e) => { + const v = JSON.parse(e.target.value); + let { searchKey, searchList } = this.state; + searchList.forEach(item => { + if (item.key === searchKey) { + item.value = [v.value]; //值为数组形式 + item.valueLabel = v.label; + } + }); + //保存值,选二级时需要用到 + this.setState({ + cascader_children: v.children, + cascader_label: v.label, + cascader_value: v.value + }); + //只想选一级 + this.myRef.current.focus(); + }; + + showSecond = (e, cb) => { + const v = JSON.parse(e.target.value); + let { searchKey, searchList } = this.state; + searchList.forEach(item => { + if (item.key === searchKey) { + item.value = [v.value]; //值为数组形式 + item.valueLabel = [v.label]; + } + }); + cb(v.value); + this.setState({ + cascader_label_aysnc: [v.label], + cascader_value_aysnc: [v.value] + }); + this.myRef.current.focus(); + }; + + showThird = (e, grade, type, cb) => { + //只有两级 + if (grade === 2) { + this.onSearchValueChange(e, type); + } else { + //第三级 + const v = JSON.parse(e.target.value); + let { searchKey, searchList } = this.state; + searchList.forEach(item => { + if (item.key === searchKey) { + item.value[1] = v.value; //值为数组形式 + item.valueLabel[1] = v.label; + this.setState({ + cascader_label_aysnc: item.valueLabel, + cascader_value_aysnc: item.value + }); + } + }); + cb(v.value); + this.myRef.current.focus(); + } + }; + showFourth = (e, grade, type, cb) => { + //只有3级 + if (grade === 3) { + this.onSearchValueChange(e, type); + } else { + //第四级 + const v = JSON.parse(e.target.value); + let { searchKey, searchList } = this.state; + searchList.forEach(item => { + if (item.key === searchKey) { + item.value[2] = v.value; //值为数组形式 + item.valueLabel[2] = v.label; + this.setState({ + cascader_label_aysnc: item.valueLabel, + cascader_value_aysnc: item.value + }); + } + }); + cb(v.value); + this.myRef.current.focus(); + } + }; + + + handleDocumentClick = (e) => { + if (this.dropDownKeyMenu && this.dropDownKeyMenu.contains(e.target)) { + return; + } + if (this.dropDownValueMenu && this.dropDownValueMenu.contains(e.target)) { + return; + } + if (this.dropDownHistoryMenu && this.dropDownHistoryMenu.contains(e.target)) { + return; + } + //antd calendar 绝对定位在dom外面 + const calendarEle = document.getElementsByClassName('ant-calendar-picker-container')[0]; + if (calendarEle && calendarEle.contains(e.target)) { + return; + } + this.hidePanel(); + } + + render() { + const searchValues = this.state.searchValues[this.state.searchKey] || {}; + return ( + <div id='idcosSearch' className={styles['idcos-search-container']}> + <div className={styles['filtered-search-box']}> + <div className='filtered-search-history-dropdown-wrapper' ref={node => this.dropDownHistoryMenu = node} > + <button onClick={this.openHistoryPanel} className='filtered-search-history-dropdown-toggle-button' type='button'> + <Icon type='clock-circle' theme='outlined' /> + </button> + { + this.state.showHistoryPanel && + <div className='dropdown-menu filtered-search-history-dropdown' > + <div className='dropdown-title'> + <span>最近搜索项</span> + <Icon onClick={this.closeHistoryPanel} className='dropdown-menu-close' type='close' theme='outlined' /> + </div> + <div className='dropdown-content'> + <div> + <ul className='filtered-search-history-dropdown-content'> + { + this.state.historyList.length > 0 ? this.state.historyList.map(arr => + <li onClick={() => this.onSubmitFromHistory(arr)}> + { + arr.length > 0 ? arr.map(item => + <span className='filtered-search-history-dropdown-token'> + <span className='name'>{item.keyLabel}:</span> + <span className='value'>{item.valueLabel}</span> + </span>) : <span>无搜索条件</span> + } + </li> + ) : <li className='history-none'>您没有最近搜索项</li> + } + { + this.state.historyList.length > 0 && + <li className='history-clear' onClick={this.clearHistory}>清除搜索记录</li> + } + </ul> + </div> + </div> + </div> + } + </div> + <div className={styles['filtered-search-box-input-container']}> + <div className={styles['scroll-container']}> + <ul className={styles['tokens-container']} ref={node => this.ulContainer = node}> + { + this.state.searchList.map((item, index) => <li key={item.key} ref={node => this[`inputLi${item.key}`] = node} className={styles['filtered-search-token']}> + <div className={styles['selectable']}> + <div onClick={() => this.modifyValue(item)} > + {item.keyLabel}: + + {item.valueLabel} + </div> + <div className={styles['remove-token']} onClick={(e) => this.remove(e, index, item)}> + <Icon type='close' /> + </div> + </div> + </li>) + } + <li className={styles['input-token']} ref={node => this.inputContainer = node}> + <Input ref={this.myRef} onChange={this.props.onChange} enterButton={true} onPressEnter={(e) => this.submit(e, 'input')} onClick={this.dropDown} autoComplete='off' autoFocus={true} className={styles['form-control']} placeholder={this.props.placeholder || '请选择...'} /> + <div ref={node => this.dropDownKeyMenu = node} style={{ display: this.state.KeyDisplay }} className='dropdown-menu dropdown-key-menu'> + <RadioGroup style={{ width: '100%' }} value={this.state.searchKey} onChange={this.onSearchKeyChange}> + <Row> + <Col className='search-btn' onClick={this.submit}> + <Icon type='search' style={{ marginRight: 8 }} /> + 按回车键或点击搜索 + </Col> + { + this.state.searchKeys.length > 0 && + (this.state.inputValue ? this.state.searchKeys.filter(data => data.label.indexOf(this.state.inputValue) !== -1) : this.state.searchKeys).map(item => <Col span={24}><Radio value={item.key}>{item.label}</Radio></Col>) + } + </Row> + </RadioGroup> + </div> + <div ref={node => this.dropDownValueMenu = node} style={{ left: this.state.left, display: this.state.valueDisplay }} className='dropdown-menu'> + { + searchValues.type === 'cascader_aysnc' && + <Row> + <Col span={24 / searchValues.grade} className='idcos_search_cascader'> + <RadioGroup style={{ width: '100%' }} onChange={(e) => this.showSecond(e, searchValues.getSecondList)}> + <Row> + {searchValues.list.map(item => <Col title={item.label} className={styles['col']} span={24}><Radio value={JSON.stringify(item)}>{item.label}</Radio></Col>)} + </Row> + </RadioGroup> + </Col> + <Col span={24 / searchValues.grade}> + <RadioGroup style={{ width: '100%' }} onChange={(e) => this.showThird(e, searchValues.grade, searchValues.type, searchValues.getThirdList)}> + <Row> + {(searchValues.secondList || []).map(item => <Col className={styles['col']} span={24}><Radio value={JSON.stringify(item)}>{item.label}</Radio></Col>)} + </Row> + </RadioGroup> + </Col> + { + searchValues.thirdList && + <Col span={24 / searchValues.grade}> + <RadioGroup style={{ width: '100%' }} onChange={(e) => this.showFourth(e, searchValues.grade, searchValues.type, searchValues.getFourthList)}> + <Row> + {(searchValues.thirdList || []).map(item => <Col className={styles['col']} span={24}><Radio value={JSON.stringify(item)}>{item.label}</Radio></Col>)} + </Row> + </RadioGroup> + </Col> + } + { + searchValues.fourthList && + <Col span={24 / searchValues.grade}> + <RadioGroup style={{ width: '100%' }} onChange={(e) => this.onSearchValueChange(e, searchValues.type)}> + <Row> + {(searchValues.fourthList || []).map(item => <Col className={styles['col']} span={24}><Radio value={JSON.stringify(item)}>{item.label}</Radio></Col>)} + </Row> + </RadioGroup> + </Col> + } + </Row> + } + { + searchValues.type === 'radio' && + <RadioGroup style={{ width: '100%' }} onChange={(e) => this.onSearchValueChange(e, searchValues.type)}> + <Row> + {searchValues.list.map(item => <Col className={styles['col']} span={24}><Radio value={item.label ? JSON.stringify(item) : JSON.stringify({ label: item, value: item })}>{item.label ? item.label : item}</Radio></Col>)} + </Row> + </RadioGroup> + } + { + searchValues.type === 'checkbox' && + <div> + <CheckboxGroup key={this.state.searchKey} style={{ width: '100%' }} onChange={this.checkboxChange}> + <Row> + {searchValues.list.map(item => <Col className={styles['col']} span={24}><Checkbox value={item.label ? JSON.stringify(item) : JSON.stringify({ label: item, value: item })}>{item.label ? item.label : item}</Checkbox></Col>)} + </Row> + </CheckboxGroup> + <div className='checkbox-confirm' onClick={(e) => this.onSearchValueChange(e, searchValues.type)}>点击确认</div> + </div> + } + { + searchValues.type === 'input' && + <Row> + <Col> + <Input autoFocus={true} value={this.state.searchInputValue} onChange={this.onSearchInputChange} placeholder={searchValues.placeholder || '请输入,按回车键确定'} onPressEnter={(e) => this.onSearchValueChange(e, searchValues.type)} /> + </Col> + </Row> + } + { + searchValues.type === 'textArea' && + <Row> + <Col> + <Input.TextArea rows={3} autoFocus={true} placeholder={searchValues.placeholder} onChange={this.onSearchAreaChange} value={this.state.searchAreaValue} /> + <Button size='small' style={{ float: 'right', marginTop: 8 }} type='primary' onClick={(e) => this.onSearchValueChange(e, searchValues.type)}>确认</Button> + </Col> + </Row> + } + { + searchValues.type === 'rangePicker' && + <Row> + <Col> + <RangePicker + showTime={searchValues.showTime !== 'true'} + style={{ width: '100%' }} + format={searchValues.format || 'YYYY-MM-DD HH:mm:ss'} + placeholder={searchValues.placeholder || [ '开始时间', '结束时间' ]} + onOk={(e) => this.onSearchValueChange(e, searchValues.type, searchValues)} + /> + </Col> + </Row> + } + { + searchValues.type === 'datePicker' && + <Row> + <Col> + <DatePicker + showToday={false} + showTime={searchValues.showTime !== 'true'} + style={{ width: '100%' }} + format={searchValues.format || 'YYYY-MM-DD HH:mm:ss'} + placeholder={searchValues.placeholder || ['选择时间']} + onOk={(e) => this.onSearchValueChange(e, searchValues.type, searchValues)} + /> + </Col> + </Row> + } + { + searchValues.type === 'calendar' && + <Row> + <Col> + + <Calendar fullscreen={false} onSelect={(e) => this.onSearchValueChange(e, searchValues.type, searchValues)} /> + + </Col> + </Row> + } + { + searchValues.type === 'number' && + <Row> + <Col> + <Input type='number' autoFocus={true} placeholder={searchValues.placeholder || '请输入,按回车键确定'} onPressEnter={(e) => this.onSearchValueChange(e, searchValues.type)} /> + </Col> + </Row> + } + { + searchValues.type === 'tree' && + <Row> + <Col> + <SearchTree + onSelect={(e) => this.onSearchValueChange(e, searchValues.type)} + treeData={searchValues.data} + /> + </Col> + </Row> + } + { + searchValues.type === 'cascader_ysnc' && + <Row> + <Col span='12' className='idcos_search_cascader'> + <RadioGroup style={{ width: '100%' }} onChange={(e) => this.showChildren(e)}> + <Row> + {searchValues.list.map(item => <Col title={item.label} className={styles['col']} span={24}><Radio value={JSON.stringify(item)}>{item.label}</Radio></Col>)} + </Row> + </RadioGroup> + </Col> + <Col span='12'> + <RadioGroup style={{ width: '100%' }} onChange={(e) => this.onSearchValueChange(e, searchValues.type)}> + <Row> + {(this.state.cascader_children || []).map(item => <Col className={styles['col']} span={24}><Radio value={JSON.stringify(item)}>{item.name}</Radio></Col>)} + </Row> + </RadioGroup> + </Col> + </Row> + } + { + searchValues.type === 'section' && + <Row> + <Col span='10'> + <Input autoFocus={true} type='number' max={searchValues.max} min={searchValues.min || 0} step={searchValues.step || 0.01} onBlur={this.saveSectionValue} /> + </Col> + <Col span='4' className='section-middle-line'> + - + </Col> + <Col span='10'> + <Input type='number' max={searchValues.max} min={searchValues.min || 0} step={searchValues.step || 0.01} onPressEnter={(e) => this.onSearchValueChange(e, searchValues.type)} /> + </Col> + </Row> + } + </div> + + </li> + + </ul> + </div> + </div> + + { + this.props.quikSearch && + <div className={styles['quik-search']}> + <div className={styles['quik-search-tags']}> + { + this.props.quikSearch.map(q => <div onClick={() => this.onSubmitFromQuikSearch(q)}>{q.valueLabel}</div>) + } + </div> + {/* <Select className={styles['quik-search-select']} mode='multiple' onChange={this.onSubmitFromHistory} defaultValue={[ 1, 12 ]}> + <Option key={1} value={1}>{1}</Option> + <Option key={12} value={12}>{12}</Option> + <Option key={13} value={13}>{14}</Option> + </Select> */} + </div> + } + { + this.state.searchList.length > 0 && + <button className={styles['clear-search']} type='button' onClick={this.clear}> + <Icon type='close' /> + </button> + } + </div> + </div> + ); + } +} + diff --git a/cyclone-web/app/components/search-form/search.less b/cyclone-web/app/components/search-form/search.less new file mode 100644 index 0000000000000000000000000000000000000000..ae87c2a0062724af9abb9a9cdcd242ec1a896430 --- /dev/null +++ b/cyclone-web/app/components/search-form/search.less @@ -0,0 +1,435 @@ +@idcos-search-backgound-color: #f1f4f5; +@idcos-search-radius: 8px; +.filtered-search-box { + position: relative; + flex: 1; + display: -webkit-flex; + display: flex; + width: 100%; + min-width: 0; + //border: 1px solid #e5e5e5; + border-radius: @idcos-search-radius; + background-color: @idcos-search-backgound-color; + margin-bottom: 8px; + &:focus{ + border: 1px solid#73afea; + } + .clear-search { + width: 35px; + background-color: @idcos-search-backgound-color; + border: 0; + outline: none; + z-index: 1; + right: 10px; + color: #4c5a71; + border-top-right-radius: @idcos-search-radius; + border-bottom-right-radius: @idcos-search-radius; + } + .filtered-search-box-input-container { + flex: 1; + position: relative; + min-width: 0; + height:32px; + .scroll-container { + display: -webkit-flex; + display: flex; + overflow-x: hidden; + white-space: nowrap; + width: 100%; + &:hover{ + overflow-x: auto; + } + .tokens-container { + display: -webkit-flex; + display: flex; + flex: 1; + -webkit-flex: 1; + padding-left: 12px; + position: relative; + margin-bottom: 0; + overflow: hidden; + li:nth-of-type(10n + 1) > .selectable{ + color: #fdfdfd; + background: #f36f63; + .remove-token { + color: #f36f63; + } + } + li:nth-of-type(10n + 2) > .selectable{ + color: #fdfdfd; + background: #3a9eef; + .remove-token { + color:#3a9eef; + } + } + li:nth-of-type(10n + 3) > .selectable{ + color: #fdfdfd; + background: #20c2d7; + .remove-token { + color: #20c2d7; + } + } + li:nth-of-type(10n + 4) > .selectable{ + color: #fdfdfd; + background: #594dcf; + .remove-token { + color: #594dcf; + } + } + li:nth-of-type(10n + 5) > .selectable{ + color: #fdfdfd; + background: #f39821; + .remove-token { + color: #f39821; + } + } + li:nth-of-type(10n + 6) > .selectable{ + color: #fdfdfd; + background: #fc5cad; + .remove-token { + color: #fc5cad; + } + } + li:nth-of-type(10n + 7) > .selectable{ + color: #fdfdfd; + background: #8BD46D; + .remove-token { + color: #8BD46D; + } + } + li:nth-of-type(10n + 8) > .selectable{ + color: #fdfdfd; + background: #7d89e6; + .remove-token { + color: #7d89e6; + } + } + li:nth-of-type(10n + 9) > .selectable{ + color: #fdfdfd; + background: #eec249; + .remove-token { + color: #eec249; + } + } + li:nth-of-type(10n + 10) > .selectable{ + color: #fdfdfd; + background: #bb67d4; + .remove-token { + color: #bb67d4; + } + } + .input-token{ + flex: 1; + -webkit-flex: 1; + max-width: inherit; + padding: 0; + background-color: inherit; + color: inherit; + // overflow-y: hidden; 加了这行不能修改了 + .form-control{ + position: relative; + min-width: 200px; + padding-right: 25px; + padding-left: 0; + height: 31px; + line-height: inherit; + border-color: transparent; + display: block; + width: 100%; + font-size: 14px; + color: #2e2e2e; + background-color: transparent; + background-clip: padding-box; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + &:hover,&:focus{ + outline: none; + border-color: transparent; + box-shadow: none; + } + + + } + } + .filtered-search-token, .filtered-search-term { + display: -webkit-flex; + display: flex; + flex-shrink: 0; + margin-top: 5px; + margin-bottom: 5px; + .selectable{ + display: -webkit-flex; + display: flex; + border-radius: 4px; + height:24px; + line-height: 24px; + padding: 0 8px; + background: #c4cdd7; + margin-right:8px; + color:#4c5a71; + //&:hover{ + // .name{ + // background-color: #ebebeb; + // } + // .value-container{ + // box-shadow: inset 0 0 0 100px rgba(0,0,0,0.09); + // } + //} + .remove-token { + display: inline-block; + margin-left: 4px; + // background-color: #fdfdfd; + color: #fdfdfd!important; + border-radius: 50%; + height:16px; + width:16px; + //color:#4c5a71; + position: relative; + top: 4px; + i{ + position: absolute; + font-size: 8px; + top:2px; + left:2px; + } + } + .name { + //background-color: #f8f8f8; + //color: rgba(0,0,0,0.55); + //border-radius: 2px 0 0 2px; + //margin-right: 1px; + //text-transform: capitalize; + display: inline-block; + //padding: 2px 7px; + } + .value-container { + //background-color: #f0f0f0; + //color: rgba(0, 0, 0, 0.85); + //border-radius: 0 2px 2px 0; + //margin-right: 5px; + //padding-right: 8px; + .value { + display: inline-block; + //padding: 2px 0 2px 7px ; + } + + } + } + } + } + } + } +} +.idcos-search-container{ + position: relative; +} +.quik-search{ + border-left: 1px solid #D8D8D8; + padding-left: 8px; + display: flex; + .quik-search-select{ + :global{ + .ant-select-selection{ + margin-top: 6px; + } + } + } + .quik-search-tags { + display: flex; + align-items: center; + div{ + border-radius: 4px; + height: 24px; + line-height: 24px; + padding: 0 8px; + background:transparent; + margin-right: 8px; + color: #f39821; + border-width: 1px; + border-style: solid; + border-color: #f39821; + cursor: pointer; + } + div:nth-of-type(10n + 1){ + color: #8BD46D; + border-color: #8BD46D; + } + div:nth-of-type(10n + 2){ + color: #594dcf; + border-color: #594dcf; + } + div:nth-of-type(10n + 3){ + color: #3a9eef; + border-color: #3a9eef; + } + div:nth-of-type(10n + 4){ + color: #f39821; + border-color: #f39821; + } + div:nth-of-type(10n + 5){ + color: #fc5cad; + border-color: #fc5cad; + } + } +} + +:global{ + .section-middle-line{ + text-align: center; + line-height: 30px; + } + .dropdown-menu{ + opacity: 1; + visibility: visible; + transform: translateY(0); + width:300px; + border: 1px solid #e5e5e5; + border-radius: 2px; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); + position: relative; + padding:8px; + top:4px; + max-height: 312px; + background: #fff; + overflow: auto; + z-index: 1000; + margin-bottom: 10px; + .idcos_search_cascader{ + border-right: 1px solid #e5e5e5; + } + .checkbox-confirm{ + height: 36px; + line-height:36px; + padding-left: 16px; + border-top: 1px solid rgba(0, 0, 0, 0.1); + cursor: pointer; + &:hover{ + background: #e6f7ff; + } + } + .ant-col-24{ + height: 36px; + line-height:36px; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + .ant-checkbox-wrapper, .ant-radio-wrapper{ + width:100%; + line-height:36px; + padding:0; + padding-left: 8px; + &:hover{ + background: #e6f7ff; + } + } + } + .search-btn{ + cursor: pointer; + text-overflow: ellipsis; + line-height: 36px; + &:hover{ + background: #e6f7ff; + } + } + .dropdown-title { + position: relative; + padding: 4px 25px 10px; + font-weight: 600; + line-height: 1; + text-align: center; + text-overflow: ellipsis; + white-space: nowrap; + border-bottom: 1px solid rgba(0, 0, 0, 0.1); + overflow: hidden; + margin-bottom: 8px; + color:#212529; + } + .dropdown-menu-close { + right: 0; + width: 20px; + height: 20px; + top: 4px; + position: absolute; + padding: 0; + color: #bfbfbf; + font-size: 14px; + } + } + .dropdown-key-menu{ + width:240px; + .ant-radio-wrapper{ + width:100%; + line-height:36px; + padding-left: 14px; + .ant-radio{ + display: none; + } + &:hover{ + background: #f0f0f0; + } + } + } + .filtered-search-history-dropdown-wrapper { + position: static; + display: flex; + flex-direction: column; + + .filtered-search-history-dropdown{ + width: 400px; + position: absolute; + top: 36px; + } + .filtered-search-history-dropdown-content{ + .history-clear{ + border-top: 1px solid rgba(0, 0, 0, 0.1); + } + .history-none{ + text-align: center; + color:#707070; + } + li{ + background: transparent; + border: 0; + border-radius: 0; + box-shadow: none; + display: block; + font-weight: 400; + position: relative; + padding: 8px 16px; + color: #2e2e2e; + line-height: normal; + overflow: hidden; + text-align: left; + width: 100%; + cursor: pointer; + white-space: nowrap; + text-overflow: ellipsis; + &:hover{ + background: #f0f0f0; + } + .filtered-search-history-dropdown-token:not(:last-child){ + margin-right: 8px; + } + .value{ + font-weight: 600; + } + } + } + .filtered-search-history-dropdown-toggle-button { + flex: 1; + width: auto; + border-top-left-radius: @idcos-search-radius; + border-bottom-left-radius: @idcos-search-radius; + border: 0; + border-right: 1px solid #D8D8D8; + color: #707070; + transition: color 0.1s linear; + padding:0 16px; + background: @idcos-search-backgound-color; + &:hover,&:focus{ + outline: none; + box-shadow: none; + } + } + } +} + diff --git a/cyclone-web/app/components/search-form/tree.jsx b/cyclone-web/app/components/search-form/tree.jsx new file mode 100644 index 0000000000000000000000000000000000000000..e2ef4868fa2d55c6e804429ac14d0e8e549ea034 --- /dev/null +++ b/cyclone-web/app/components/search-form/tree.jsx @@ -0,0 +1,45 @@ +import React from 'react'; +import { Tree } from 'antd'; +const TreeNode = Tree.TreeNode; + +export default class searchTree extends React.Component { + + onSelect = (selectedKeys, e) => { + const data = e.selectedNodes[0].props.data; + this.props.onSelect({ id: data.id, name: data.name }); + }; + + render() { + const treeData = this.props.treeData; + const nodes = [treeData]; + if (nodes.length === 0) { + return ( + <div style={{ color: '#999' }}> + 暂无数据 + </div> + ); + } + return ( + <Tree + onSelect={this.onSelect} + defaultExpandAll={true} + defaultExpandParent={true} + > + {this.renderTreeNodes(nodes)} + </Tree> + ); + } + + renderTreeNodes = data => { + return data.map(item => { + if (item.children && item.children.length > 0) { + return ( + <TreeNode data={item} key={item.id} title={item.name} onClick={(item) => this.onSelect(item)}> + {this.renderTreeNodes(item.children)} + </TreeNode> + ); + } + return <TreeNode data={item} key={item.id} title={item.name} onClick={(item) => this.onSelect(item)}/>; + }); + }; +} diff --git a/cyclone-web/app/components/upload/index.jsx b/cyclone-web/app/components/upload/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..aadf51e3a72969888289b383821d6263ff16dac3 --- /dev/null +++ b/cyclone-web/app/components/upload/index.jsx @@ -0,0 +1,175 @@ +import React from 'react'; +import { Upload, Table, Button, Icon, Row, Col, notification, Alert } from 'antd'; +import { post } from 'common/xFetch2'; + +/** + * 适用于分三步导入的导入组件需求 + * importApi + * uploadApi + * previewApi + * getColumns() + */ + +export default class FileUpload extends React.Component { + state = { + fileList: [], + tableList: [], + fileName: '', + disableUpload: false, + errorMessage: null, + importMessage: null + }; + + //最终提交 + handleUpload = () => { + if (this.props.importApi) { + console.log(this.props.importApi); + console.log(this.state.fileName); + post(this.props.importApi, { file_name: this.state.fileName }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + this.props.onSuccess(); + notification.success({ message: res.message }); + }); + } else { + this.props.onSuccess(this.state.tableList); + } + + }; + + componentWillUnmount() { + this.setState({ + fileList: [], + tableList: [], + fileName: '', + disableUpload: false, + errorMessage: null, + importMessage: null + }); + } + + render() { + const props = { + name: 'files[]', + accept: '.xlsx', + action: this.props.uploadApi, + headers: { + Authorization: localStorage.osinstallAuthAccessToken + }, + onChange: (info) => { + //清空 + this.setState({ + errorMessage: null, + importMessage: null + }); + + let fileList = info.fileList; + //只上传一个文件 + fileList = fileList.slice(-1); + fileList = fileList.filter((file) => { + if (file.response) { + if (file.response.status === 'error') { + return notification.error({ message: file.response.message }); + } + //保存文件名称 + const fileName = file.response.content.result; + this.setState({ fileName }); + + //预览 + post(this.props.previewApi, { file_name: fileName, limit: 1000, offset: 0 }).then(res => { + + if (res.status === 'success') { + //没有导入数据的时候会返回null + this.setState({ disableUpload: false, tableList: res.content.content || [] }); + + //导入的数据有误 + if (res.content.status === 'failure') { + this.setState({ disableUpload: true, errorMessage: res.content.message }); + } else { + this.setState({ disableUpload: false }); + //导入结果显示 + if (res.content.import_result) { + const importResult = res.content.import_result; + //暂时方案 + if (typeof importResult !== 'object') { + return; + } + const importMessage = `可操作:${importResult.limit},导入:${importResult.import_num},新增:${importResult.import_num},现存:${importResult.total_now}`; + this.setState({ importMessage: importMessage }); + } + } + } else { + //无法导入 + this.setState({ errorMessage: res.message, disableUpload: true }); + } + + }); + //过滤显示上传成功的文件 + return file.response.status === 'success'; + } + return true; + }); + this.setState({ fileList }); + } + }; + + const { errorMessage, importMessage, tableList } = this.state; + let expandedRowKeys = []; + if (tableList.length > 0) { + tableList.map((item, index) => { + if (item.content) { + expandedRowKeys.push(index); + } + }); + } + + return ( + <div className='upload-form'> + <Row> + <Col span={2}> + 文件上传: + </Col> + <Col span={22}> + <Upload {...props} fileList={this.state.fileList}> + <Button> + <Icon type='upload' /> 选择文件 + </Button> + </Upload> + </Col> + </Row> + + <div style={{ marginBottom: 8 }}> + { + errorMessage && <Alert message={errorMessage} type='error' showIcon={true} closable={true}/> + } + { + importMessage && <Alert message={importMessage} type='success' showIcon={true} closable={true}/> + } + </div> + <Row> + <Col span={24} className='no-wordbreak'> + <Table + dataSource={this.state.tableList} + columns={this.props.getColumns()} + pagination={{ showTotal: () => `共 ${this.state.tableList.length} 条` }} + more={(record) => record.Content} + expandedRowKeys={expandedRowKeys} + expandedRowRender={record => <p style={{ margin: 0, color: '#ff3700' }} dangerouslySetInnerHTML={{ __html: record.content }} > + </p>} + /> + </Col> + </Row> + <Row> + <Col span={24}> + <div className='pull-right'> + <Button onClick={() => this.props.onCancel()} style={{ marginRight: 8 }}>取消</Button> + <Button type='primary' onClick={() => this.handleUpload()} disabled={this.state.tableList.length === 0 || this.state.disableUpload}>确定</Button> + </div> + </Col> + </Row> + </div> + ); + } + +} diff --git a/cyclone-web/app/containers/app/changePassword.jsx b/cyclone-web/app/containers/app/changePassword.jsx new file mode 100644 index 0000000000000000000000000000000000000000..ebef436b533ff3ca65a6be53953885770b502302 --- /dev/null +++ b/cyclone-web/app/containers/app/changePassword.jsx @@ -0,0 +1,102 @@ +import React from 'react'; +import Popup from 'components/popup'; +import FormGenerator from 'components/idcos-form/FormGenerator'; + +import { put } from 'common/xFetch2'; +import { notification } from 'antd'; + +export default function action(options) { + let newPassword; + + const onSubmit = (values) => { + + put('/api/cloudboot/v1/users/password', values).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + Popup.close(); + options.reload(); + }); + }; + const formSchema = { + name: 'form', + id: 'form', + elements: [ + { + id: 'old_password', + name: 'old_password', + label: '旧密码', + type: 'TextInput', + inputType: 'password', + rules: [{ + required: true, + message: '请输入旧密码' + }] + }, + { + id: 'new_password', + name: 'new_password', + label: '新密码', + type: 'TextInput', + inputType: 'password', + placeholder: '必须包含大小写字母,数字和特殊字符', + rules: [{ + required: true, + message: '请输入新密码' + }, { + validator: (rule, value, callback) => { + newPassword = value; + if (value) { + if (!(/[a-z]+/.test(value) && /[A-Z]+/.test(value) && /[\d]/.test(value) && /[~!@#\$%\^&\*\(\)_\-\+=\|\\\{\}\[\]\"';:\/\?\.>,<]/.test(value))) { + callback('必须包含大小写字母,数字和特殊字符'); + } + } + callback(); + } + }] + }, { + id: '', + name: '', + label: '确认新密码', + type: 'TextInput', + inputType: 'password', + rules: [{ + required: true, + message: '请确认新密码' + }, { + validator: (rule, value, callback) => { + if (value !== newPassword) { + callback([ + new Error( + '两次输入不一致' + ) + ]); + } + callback(); + } + }] + }] + }; + + Popup.open({ + title: '修改密码', + width: 700, + onCancel: () => { + Popup.close(); + }, + content: ( + <div> + <FormGenerator + schema={formSchema} + showCancel={true} + hideReset={true} + onSubmit={(values) => onSubmit(values)} + onCancel={() => { + Popup.close(); + }} + /> + </div> + ) + }); +} diff --git a/cyclone-web/app/containers/app/index.jsx b/cyclone-web/app/containers/app/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..a43c366b82374a49da343d74e3ba4a7cedce9bb8 --- /dev/null +++ b/cyclone-web/app/containers/app/index.jsx @@ -0,0 +1,628 @@ +/** + * App Component + */ +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { Icon, Spin } from 'antd'; +import pureRender from 'common/pureRender'; +import PermissionMenusHead from 'components/menu/menu-util-head'; +import classnames from 'classnames'; +import PermissionMenusMain from 'components/menu/menu-util-main'; +import PermissionMenusMainCollapsed from 'components/menu/menu-util-main-collapsed'; +import { post } from 'common/xFetch2'; +import Popup from 'components/popup'; +import changePassword from './changePassword'; + +/** + * [createClass description] + * @param {[type]} { render( [description] + * @return {[type]} [description] + */ + +class App extends Component { + constructor(props) { + super(props); + this.state = { + ifDefaultTheme: true, + collapsed: false, + openKeys: [], + lastMenu: '', + logoUrl: '/assets/logo/logo-cyclone.png', + menuKeyMap: { + 'database/idc': 'database/idc', + 'database/room': 'database/room', + 'database/network': 'database/network', + 'database/cabinet': 'database/cabinet', + 'database/usite': 'database/usite', + 'database/store-room': 'database/store-room', + 'network/cidr': 'network/cidr', + 'network/ips': 'network/ips', + 'network/device': 'network/device', + 'device/list': 'device/list', + 'device/detail': 'device/list', + 'device/oob': 'device/oob', + 'device/special': 'device/special', + 'device/pre_deploy': 'device/pre_deploy', + 'device/setting': 'device/setting', + 'device/setting_rule': 'device/setting_rule', + 'device/entry': 'device/pre_deploy', + 'device/inspection/list': 'device/inspection/list', + 'device/inspection/detail': 'device/inspection/list', + 'template/system': 'template/system', + 'template/hardware/list': 'template/hardware/list', + 'template/hardware/create': 'template/hardware/list', + 'template/hardware/detail': 'template/hardware/list', + 'template/hardware/edit': 'template/hardware/list', + 'audit/log': 'audit/log', + 'audit/api': 'audit/api', + 'approval': 'approval', + 'order/list': 'order/list', + 'order/deviceCategory': 'order/deviceCategory', + 'task/list': 'task/list' + } + }; + } + + componentDidMount() { + this.checkLogin(); + this.getUserData(); + this.props.dispatch({ + type: 'global/idc/getSearchList' + }); + this.props.dispatch({ + type: 'global/room/getSearchList' + }); + this.props.dispatch({ + type: 'global/cabinet/getSearchList' + }); + this.props.dispatch({ + type: 'global/networkArea/getSearchList' + }); + } + + changePwd = () => { + changePassword({ + reload: this.logout + }); + }; + + showAbout = () => { + Popup.open({ + title: '版本信息', + width: 416, + onCancel: () => { + Popup.close(); + }, + content: ( + <div className='ant-confirm-body-wrapper'> + <div className='ant-confirm-body' style={{ paddingBottom: 26 }}> + <img src='assets/icon/about_icon.png' alt='' width='40' style={{ marginRight: 16, float: 'left' }}/> + <span className='ant-confirm-title'>当前版本号 V1.5.5</span> + {/*<div className='ant-confirm-content'>*/} + {/*<p>请尽快升级</p>*/} + {/*</div>*/} + </div> + </div> + ) + }); + }; + + logout = () => { + this.props.dispatch({ + type: 'global/logout' + }); + }; + + checkLogin = () => { + this.props.dispatch({ + type: 'global/checkLogin' + }); + }; + + getUserData = () => { + this.props.dispatch({ + type: 'global/getUserData' + }); + }; + + // 展开或收起菜单 + handlerCollapse = () => { + this.setState({ + collapsed: !this.state.collapsed + }); + }; + + changeTheme = () => { + this.setState({ + ifDefaultTheme: !this.state.ifDefaultTheme + }); + }; + + handlerOpenChange = openKeys => { + if (openKeys.length > 0) { + this.setState({ + openKeys: new Array(openKeys[openKeys.length - 1]) + }); + } else { + this.setState({ + openKeys: [] + }); + } + }; + + getOpenKeys = () => { + return this.state.openKeys; + }; + getIconStation(key) { + const openKey = this.getOpenKeys(); + const collapsed = this.state.collapsed; + if (openKey[0] === key && collapsed === true) { + return true; + } else { + return false; + } + } + getCurrentMenu = () => { + let path = window.location.hash.match(/#\/(.+)/), + ret = '/'; + path = path ? path[1] : ''; + + if (path == '') { + return ret; + } + + if (path == 'login') { + return path; + } + const menuKeyMap = this.state.menuKeyMap; + Object.keys(menuKeyMap).forEach(k => { + const v = k; + if (path.indexOf(v) == 0) { + ret = menuKeyMap[k]; + } + }); + return ret; + }; + render() { + const current = this.getCurrentMenu(); + const { userData, login } = this.props.data; + const permissions = userData ? userData.permissions : []; + const menuItems = [ + { + key: '/', + permissionKey: 'menu_home', + link: '/', + icon: <Icon type='home' />, + description: '概览' + }, + { + key: 'database', + permissionKey: 'menu_idc_management', + icon: + this.getIconStation('database') === true ? ( + <Icon type='down' /> + ) : ( + <Icon type='database' /> + ), + description: '数据中心', + children: [ + { + key: 'database/idc', + permissionKey: 'menu_idc', + link: '/database/idc', + description: '数据中心管理', + icon: ( + <Icon type='global' theme='outlined' /> + ) + }, + { + key: 'database/room', + permissionKey: 'menu_server_room', + link: '/database/room', + description: '机房信息管理', + icon: ( + <Icon type='bank' theme='outlined' />) + }, + { + key: 'database/network', + permissionKey: 'menu_network_area', + link: 'database/network', + description: '网络区域管理', + icon: ( + <Icon type='wifi' theme='outlined' />) + }, + { + key: 'database/cabinet', + permissionKey: 'menu_server_cabinet', + link: 'database/cabinet', + description: '机架信息管理', + icon: ( + <Icon type='cluster' theme='outlined' />) + }, + { + key: 'database/usite', + permissionKey: 'menu_server_usite', + link: 'database/usite', + description: '机位信息管理', + icon: ( + <Icon type='gold' theme='outlined' />) + }, + { + key: 'database/store-room', + permissionKey: 'menu_store_room', + link: 'database/store-room', + description: '库房信息管理', + icon: ( + <Icon type='shop' theme='outlined' />) + } + ] + }, + { + key: 'network', + permissionKey: 'menu_network_management', + icon: + this.getIconStation('network') === true ? ( + <Icon type='down' /> + ) : ( + <Icon type='share-alt' /> + ), + description: '网络管理', + children: [ + { + key: 'network/device', + permissionKey: 'menu_network_device', + link: '/network/device', + description: '网络设备管理', + icon: ( + <Icon type='laptop' theme='outlined' /> + ) + }, + { + key: 'network/cidr', + permissionKey: 'menu_ip_network', + link: '/network/cidr', + description: 'IP网段管理', + icon: ( + <Icon type='build' theme='outlined' /> + ) + }, + { + key: 'network/ips', + permissionKey: 'menu_ip', + link: '/network/ips', + description: 'IP分配管理', + icon: ( + <Icon type='gateway' theme='outlined' /> + ) + } + ] + }, + { + key: 'device', + permissionKey: 'menu_physical_machine_management', + icon: + this.getIconStation('device') === true ? ( + <Icon type='down' /> + ) : ( + <Icon type='desktop' /> + ), + description: '物理机管理', + children: [ + { + key: 'device/list', + permissionKey: 'menu_physical_machine', + link: '/device/list', + description: '物理机列表', + icon: ( + <Icon type='project' theme='outlined' /> + ) + }, + { + key: 'device/oob', + permissionKey: 'menu_oob_info', + link: '/device/oob', + description: '带外管理', + icon: ( + <Icon type='wifi' /> + ) + }, + { + key: 'device/special', + permissionKey: 'menu_special_device', + link: '/device/special', + description: '特殊设备', + icon: ( + <Icon type='block' /> + ) + }, + { + key: 'device/pre_deploy', + permissionKey: 'menu_predeploy_physical_machine', + link: '/device/pre_deploy', + description: '待部署物理机', + icon: ( + <Icon type='exception' theme='outlined'/> + ) + }, + { + key: 'device/setting', + permissionKey: 'menu_device_setting', + link: '/device/setting', + description: '部署列表', + icon: ( + <Icon type='cluster' theme='outlined' /> + ) + }, + { + key: 'device/setting_rule', + permissionKey: 'menu_device_setting_rule', + link: '/device/setting_rule', + description: '部署参数规则', + icon: ( + <Icon type='cluster' theme='outlined' /> + ) + }, + { + key: 'device/inspection/list', + permissionKey: 'menu_inspection', + link: '/device/inspection/list', + description: '硬件巡检', + icon: <Icon type='tool' /> + } + ] + }, + { + key: 'order', + permissionKey: 'menu_order_management', + icon: + this.getIconStation('order') === true ? ( + <Icon type='down' /> + ) : ( + <Icon type='profile' /> + ), + description: '订单管理', + children: [ + { + key: 'order/list', + permissionKey: 'menu_order', + link: '/order/list', + description: '订单列表', + icon: ( + <Icon type='project' theme='outlined' /> + ) + }, + { + key: 'order/deviceCategory', + permissionKey: 'menu_device_category', + link: '/order/deviceCategory', + description: '设备类型', + icon: ( + <Icon type='crown' /> + ) + } + ] + }, + { + key: 'template', + permissionKey: 'menu_template_management', + icon: this.getIconStation('template') === true ? <Icon type='down' /> : <Icon type='medicine-box' theme='outlined' />, + description: '配置管理', + children: [ + { + key: 'template/system', + permissionKey: 'menu_system_template', + link: '/template/system', + description: '装机配置', + icon: ( + <Icon type='code' theme='outlined' /> + ) + }, + { + key: 'template/hardware/list', + permissionKey: 'menu_hardware_template', + link: '/template/hardware/list', + description: '硬件配置', + icon: <Icon type='setting' /> + } + ] + }, + { + key: 'approval', + permissionKey: 'menu_approval', + link: 'approval', + icon: <Icon type='safety-certificate' />, + description: '审批管理' + }, + { key: 'task/list', + permissionKey: 'menu_task_management', + link: 'task/list', + icon: <Icon type='schedule' />, + description: '任务管理' + }, + { + key: 'audit', + permissionKey: 'menu_audit', + icon: this.getIconStation('template') === true ? <Icon type='down' /> : <Icon type='audit' />, + description: '操作审计', + children: [ + { + key: 'audit/log', + permissionKey: 'menu_audit_log', + link: '/audit/log', + description: '操作记录', + icon: ( + <Icon type='file-text' /> + ) + }, + { + key: 'audit/api', + permissionKey: 'menu_audit_api', + link: '/audit/api', + description: '接口调用记录', + icon: ( + <Icon type='file-sync' /> + ) + } + ] + }, + { + key: 'user', + linkGo: `${userData.uam_portal_url}`, + permissionKey: 'menu_user_management', + iconGo: <Icon type='user' theme='outlined' />, + description: '用户管理' + } + ]; + const style = { + width: this.state.collapsed ? '50px' : '200px', + minWidth: this.state.collapsed ? '50px' : '200px' + }; + const openKey = this.getOpenKeys(); + const menuPreRender = (filterMenuItems = []) => { + if (filterMenuItems && filterMenuItems.length > 0) { + let path = window.location.hash.match(/#\/(.+)\??/); + path = path ? path[1] : ''; + if ( + menuItems.some(item => item.link === '/' + path) && + !filterMenuItems.some(item => item.link === '/' + path) + ) { + window.location.href = '/#' + filterMenuItems[0].link; + } + } + }; + return ( + <div + className={classnames({ + approot: true, + themeDefault: this.state.ifDefaultTheme, + themeDark: !this.state.ifDefaultTheme + })} + > + { + login === false && ( + <div + style={{ + textAlign: 'center', + position: 'fixed', + background: '#fff', + top: 0, + bottom: 0, + left: 0, + right: 0, + zIndex: 9999 + }} + > + <Spin size='large' tip='还没有登录' style={{ fontSize: 20, height: '100%', transform: 'translateY(50%)' }} /> + </div> + ) + } + <div> + <div className='app-header'> + <PermissionMenusHead + logoUrl={this.state.logoUrl} + mode='inline' + theme='dark' + userData={this.props.data.userData} + dispatch={this.props.dispatch} + logout={this.logout} + changePwd={this.changePwd} + showAbout={this.showAbout} + handlerCollapse={this.handlerCollapse} + changeTheme={this.changeTheme} + /> + </div> + <div className='app-container'> + <div + className={classnames({ + 'app-body-nav': true, + 'app-body-nav-collapsed': this.state.collapsed, + 'app-body-nav-uncollapsed': !this.state.collapsed + })} + style={style} + > + {!this.state.collapsed && ( + <PermissionMenusMain + theme='dark' + menuItems={menuItems} + permissions={permissions} + dispatch={this.props.dispatch} + mode='inline' + onOpenChange={this.handlerOpenChange} + openKeys={openKey} + selectedKeys={[current]} + menuPreRender={menuPreRender} + /> + )} + {this.state.collapsed && ( + <PermissionMenusMainCollapsed + theme='dark' + userData={this.props.data.userData} + menuItems={menuItems} + permissions={permissions} + dispatch={this.props.dispatch} + mode='inline' + selectedKeys={[current]} + menuPreRender={menuPreRender} + onOpenChange={this.handlerOpenChange} + openKeys={openKey} + /> + )} + <div + className='app-body-nav-btn' + onClick={this.handlerCollapse} + > + {!this.state.collapsed && ( + <div className='app-body-nav-uncollapsed'> + <img src='/assets/logo/logo-max.png' alt='' height='30' /> + </div> + )} + {this.state.collapsed && ( + <div className='app-body-nav-collapsed'> + <img width='20' src='/assets/logo/logo-min.png' alt='' /> + </div> + )} + </div> + </div> + <div className='app-body-main app-body__project'> + <div className='app-body-content'> {React.Children.map(this.props.children, + (child) => React.cloneElement(child, { permissions }))} + </div> + </div> + </div> + </div> + </div> + ); + } +} + +/** + * transform store data to App props + * @param {[type]} state [description] + * @return {[type]} [description] + */ +function mapStateToProps(store) { + return { + data: store.get('global').toJS() + }; +} + +/** + * add dispatch to + * @param {[type]} dispatch [description] + * @return {[type]} [description] + */ +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +/** + * create redux container + * @type {[type]} + */ + +export default connect( + mapStateToProps, + mapDispatchToProps +)(pureRender(App)); diff --git a/cyclone-web/app/containers/app/reducer.js b/cyclone-web/app/containers/app/reducer.js new file mode 100644 index 0000000000000000000000000000000000000000..8020234c83eef934c7a481329ef302c9c7e3d10d --- /dev/null +++ b/cyclone-web/app/containers/app/reducer.js @@ -0,0 +1,56 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createRegularReducer } from 'utils/regular-reducer'; + +const initialState = fromJS({ + loading: false, + userData: {}, + login: false, + dict: {}, + userList: { + data: [], + loading: true + }, + idc: { + loading: true, + data: [] + }, + room: { + loading: true, + data: [] + }, + cabinet: { + loading: true, + data: [] + }, + usite: { + loading: true, + data: [] + }, + networkArea: { + loading: true, + data: [] + } +}); + +const reducer = handleActions( + { + 'global/set-user': (state, action) => { + return state.set('userData', fromJS(action.payload)).set('loading', false); + }, + 'global/login/first': (state, action) => { + return state.set('login', action.payload); + }, + ...createRegularReducer('global/userList', 'userList'), + ...createRegularReducer('global/idc', 'idc'), + ...createRegularReducer('global/room', 'room'), + ...createRegularReducer('global/cabinet', 'cabinet'), + ...createRegularReducer('global/usite', 'usite'), + ...createRegularReducer('global/networkArea', 'networkArea') + }, + initialState +); + +reducer.NAME = 'global'; + +export default reducer; diff --git a/cyclone-web/app/containers/app/sagas.js b/cyclone-web/app/containers/app/sagas.js new file mode 100644 index 0000000000000000000000000000000000000000..070457aa42d20366b1ba3ddfc696aec18351d85e --- /dev/null +++ b/cyclone-web/app/containers/app/sagas.js @@ -0,0 +1,112 @@ +import { call, put, select } from 'redux-saga/effects'; +import { takeEvery } from 'redux-saga'; +import { post, getWithArgs } from 'common/xFetch2'; +import { createTableSaga } from 'utils/table-saga'; +import * as auth from 'services/auth'; +import { notification } from 'antd'; + + +function* getUserData() { + try { + const req = yield call(auth.getMenuPermissions); + const userData = req.content; + yield put({ + type: 'global/set-user', + payload: userData || {} + }); + + yield put({ + type: 'global/userList/get', + payload: userData.department ? userData.department.id : '' + }); + + } catch (error) { + console.log(error); + } +} + +function* checkLogin() { + try { + const token = localStorage['osinstallAuthAccessToken']; + const hash = window.location.hash; + if (!token && hash.indexOf('/authenticated') === -1) { + yield put({ + type: 'global/login/first', + payload: false + }); + auth.ssoLogin(); + } else { + yield put({ + type: 'global/login/first', + payload: true + }); + } + } catch (error) { + console.log(error); + } +} + +function* onLogout() { + auth.logout(); +} + +function* getUserList(action) { + try { + yield put({ + type: 'global/userList/load' + }); + + const res = yield call(getWithArgs, `/api/cloudboot/v1/users`, { page: 1, page_size: 100, department_id: action.payload }); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + yield put({ + type: 'global/userList/load/success', + payload: res.content.records + }); + } catch (error) { + console.log(error); + } +} + +import { createSearchListSaga } from 'utils/search-list-Saga'; +const idcSaga = createSearchListSaga({ + actionNamePrefix: 'global/idc', + datasource: '/api/cloudboot/v1/idcs' +}); +const cabinetSaga = createSearchListSaga({ + actionNamePrefix: 'global/cabinet', + datasource: '/api/cloudboot/v1/server-cabinets' +}); +const roomSaga = createSearchListSaga({ + actionNamePrefix: 'global/room', + datasource: '/api/cloudboot/v1/server-rooms' +}); +const networkSaga = createSearchListSaga({ + actionNamePrefix: 'global/networkArea', + datasource: '/api/cloudboot/v1/network-areas' +}); +const usiteSaga = createSearchListSaga({ + actionNamePrefix: 'global/networkArea', + datasource: '/api/cloudboot/v1/server-usites' +}); +/** + * Individual exports for testing + * @yield {[type]} [description] + */ +function* defaultSaga() { + const watchers = yield [ + takeEvery('global/checkLogin', checkLogin), + takeEvery('global/getUserData', getUserData), + takeEvery('global/logout', onLogout), + takeEvery('global/userList/get', getUserList), + idcSaga, + roomSaga, + networkSaga, + usiteSaga, + cabinetSaga + ]; + return; +} + +export default defaultSaga; diff --git a/cyclone-web/app/containers/app/selectors.js b/cyclone-web/app/containers/app/selectors.js new file mode 100644 index 0000000000000000000000000000000000000000..218a454fcfe04dcb84671a82eed54710e84c6ebb --- /dev/null +++ b/cyclone-web/app/containers/app/selectors.js @@ -0,0 +1,19 @@ +/** + * The global state selectors + */ + +const selectLocationState = () => { + let prevRoutingState; + let prevRoutingStateJS; + return (state) => { + const routingState = state.get('route'); // or state.route + if (!routingState.equals(prevRoutingState)) { + prevRoutingState = routingState; + prevRoutingStateJS = routingState.toJS(); + } + return prevRoutingStateJS; + }; +}; +export { + selectLocationState +}; diff --git a/cyclone-web/app/containers/app/styles/boot.less b/cyclone-web/app/containers/app/styles/boot.less new file mode 100644 index 0000000000000000000000000000000000000000..d8b9caf91e7e7c5e02e80739f6ca6c8c5457124f --- /dev/null +++ b/cyclone-web/app/containers/app/styles/boot.less @@ -0,0 +1,535 @@ + .ant-tabs-extra-content{ + float: left!important; + margin-right: 80px; + } + .ant-breadcrumb{ + font-size: 14px; + span{ + line-height: 40px; + } + } + .ant-form-item-label{ + text-overflow: ellipsis; + } + .detail-title { + border-bottom: 1px solid #d9d9d9; + line-height: 36px; + } + .detail-title-drawer{ + font-size: 15px; + text-indent: 10px; + } + .ant-table-title, .ant-table-footer{ + font-weight: 500; + } + .upload-form{ + .ant-row{ + margin-bottom: 8px; + } + .ant-col-3{ + text-align: right; + margin-right: 6px; + color: #0b1c2e; + font-size: 14px; + line-height: 32px; + } + .ant-col-2{ + color: #0b1c2e; + font-size: 14px; + line-height: 32px; + } + } + .detail-body{ + margin-top: 16px; + } + + .detail-info-24 { + .panel-label,.ant-form-item-label { + width: 20%!important; + } + .panel-value{ + width:80%!important; + } + } + .api-result{ + max-height: 250px; + overflow:auto; + background: #f3f3f3; + padding:16px; + border-radius: 4px; + margin-top: 8px; + margin-bottom: 8px; + } + + .detail-info { + padding: 16px; + color: @PanelNormalFont; + font-size: 14px; + margin-bottom: 16px; + div[class^='ant-col-'] { + line-height: 32px; + } + .united-form{ + .panel-label,.ant-form-item-label{ + width: 13%; + } + .ant-form-item-control-wrapper{ + width: 80%; + } + .ant-col-5{ + .ant-form-item-control-wrapper{ + width: 100%; + } + } + } + .panel-label,.ant-form-item-label { + color: #4c5a71; + width: 40%; + display: inline-block; + text-align: right; + float: left; + } + .panel-value{ + width:60%; + float:left; + color:#010f24; + } + .ant-form-item-control-wrapper{ + float: left; + width: 60%; + } + .ant-form-item{ + margin-bottom: 8px; + } + } + .configure-panel{ + border:1px solid #d9d9d9; + border-radius: 4px; + padding:16px; + margin: 16px 0; + } + .configure-card{ + background: #e5eefb; + border:1px solid #d9d9d9; + border-radius: 2px; + width: ~'calc(100% - 40px)'; + margin-bottom:8px; + position: relative; + margin-left: 40px; + .configure-content{ + height:100%; + .ant-form-item{ + margin-bottom:4px; + } + div[class^='ant-col-'] { + padding:12px 8px; + } + } + + } + .colFixed{ + position: absolute; + right:0; + text-align: right; + } + .configure-index{ + background: #79b4fe; + border-radius: 50%; + width:30px; + height:30px; + position: absolute; + left:-40px; + top:50%; + margin-top: -15px; + line-height: 30px; + text-align: center; + color:#fff; + cursor: move; + } + span.spanCircle { + display: inline-block; + width: 40px; + height: 16px; + line-height: 16px; + border-radius: 8px; + vertical-align: text-bottom; + text-align: center; + margin-left: 5px; + + &.fill { + background: @blue; + color: #fff; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + } + &.hollow { + background: #fff; + color: @blue; + border: 1px solid @blue; + } + &.red { + background: #ff3700; + color: #fff; + width: 26px; + } + } + .editable-cell { + position: relative; + } + + .editable-cell-value-wrap { + padding: 5px 12px; + cursor: pointer; + } + + .editable-row:hover .editable-cell-value-wrap { + border: 1px solid #d9d9d9; + border-radius: 4px; + padding: 4px 11px; + } + .ant-menu-item{ + margin:0!important; + } + .ant-tabs-vertical.ant-tabs-left>.ant-tabs-content{ + padding-left: 16px; + } + .disk-panel{ + border:1px solid #d9d9d9; + border-radius: 4px; + margin-bottom: 8px; + .disk:not(:last-child){ + border-bottom: 1px solid #D0D0D0; + padding-bottom: 8px; + } + .disk-header{ + min-height:50px; + padding:4px 8px; + } + .disk-table-header{ + background: #e5eefb; + color: #0b1c2e; + padding:0 8px; + } + .disk-table-body{ + padding:0 8px; + .ant-col-5{ + min-height:42px; + } + } + .ant-row{ + z-index: 1000; + } + + } + .col-right{ + text-align: right; + } + .hover-edit{ + position: relative; + display: inline-block; + padding:0 16px; + height:32px; + line-height: 32px; + width:100%; + &:hover:after{ + content:''; + position: absolute; + right:0; + top:0; + width:100%; + height:100%; + border:1px solid #d9d9d9; + border-radius: 4px; + } + } + .minus-icon,.plus-icon{ + position: absolute; + top:8px; + } + .minus-icon{ + right:4px; + } + .plus-icon{ + right:24px; + } + .col-label{ + font-weight: 500; + text-align: right; + padding-right: 8px; + } + .license-detail{ + line-height: 30px; + border: 1px solid #d9d9d9; + padding: 16px; + border-radius: 4px; + } + .buttons-margin{ + margin-bottom: 8px; + } + .black-white .ant-table-title{ + border:1px solid #d9d9d9; + border-bottom: 0; + padding-left: 16px; + } + + + .ant-input-disabled,.ant-select-disabled,.ant-input-number-disabled, .ant-radio-disabled+span{ + color:rgba(0,0,0,.65); + .ant-select-selection__choice__content{ + color:rgba(0,0,0,.65); + } + } + + .middle-card{ + .ant-card-body{ + height: 340px; + } + } + .home-card{ + background: #fff; + border-radius: 4px; + border: 1px solid #e2e7ec; + box-shadow: 1px 1px 6px rgba(1,5,36,0.2); + text-align: center; + padding:24px 0; + margin-bottom: 8px; + img{ + width:50px; + height:50px; + margin-right: 16px; + margin-left: -50px; + } + .card-right{ + position: absolute; + top: 24px; + left: 50%; + color: #4c5a71; + } + .text_single{ + top:50%; + margin-top: -16px; + font-weight: 500; + font-size: 16px; + } + } + .approval_title{ + position: relative; + line-height: 36px; + padding-left: 16px!important; + &:after{ + content: ''; + width: 3px; + height: 20px; + background: #0072ff; + position: absolute; + left: 4px; + top: 8px; + } + } + .approval-card{ + box-shadow: none; + padding: 18px 0; + .text_single{ + font-size: 14px; + } + img{ + width:40px; + height:40px; + } + } + .approval_list{ + .ant-col-5 { + width: 20%; + } + } + + .home-page{ + + em{ + font-weight: bold; + font-size: 20px; + font-style: normal; + color:#010f24; + } + height:~'calc(100vh - 82px)'; + overflow-y: auto; + margin:16px; + .ant-card-bordered{ + border-radius: 4px; + border: 1px solid #e2e7ec; + } + .margin-bottom{ + margin-bottom: 8px + } + .ant-table-title{ + padding-top: 0; + } + } + .hardware-card{ + .ant-card{ + float: left; + margin-right: 16px; + margin-Bottom: 16px; + .ant-card-actions{ + li > span{ + width: 100%; + height: 100%; + button{ + border: 0; + width: 100%; + height: 100%; + } + button:disabled{ + cursor: not-allowed; + } + } + } + } + .ant-card:after{ + content:''; + position: absolute; + width:100%; + height:6px; + background: #53a2ff; + top:0; + left:0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + } + .ant-card-body{ + font-size: 14px; + padding:16px 24px; + a{ + color:#4c5a71; + } + p{ + line-height: 26px; + } + } + } + .ant-btn+.ant-btn-group, .ant-btn-group+.ant-btn, .ant-btn-group+.ant-btn-group, .ant-btn-group .ant-btn+.ant-btn, .ant-btn-group .ant-btn+span, .ant-btn-group>span+span, .ant-btn-group span+.ant-btn{ + margin-top: 1px; + } + .no-wordbreak .ant-table-tbody>tr>td, .ant-table-thead>tr>th{ + word-break: keep-all; + } + .yes_no_status{ + display: inline-block; + //width: 32px; + height:20px; + padding: 0 8px; + line-height: 20px; + color:#fff; + text-align: center; + border-radius: 4px; + } + .yes_status{ + background-color: #8BD46D; + } + .no_status{ + background-color: #929EA6; + } + .pine-pos{ + width:60%; + float: left; + position: relative; + .pine-center{ + position: absolute; + left: ~'calc(50% - 25px)'; + top:~'calc(50% - 25px)'; + width:50px; + height:50px; + text-align: center; + } + } + .pine-text{ + width:40%; + float: left; + padding-top: 90px; + p{ + line-height: 32px; + span{ + color:#a5afbc; + } + } + } + + .app-body-nav-collapsed { + .ant-menu-submenu-arrow{ + display: none; + } + .ant-menu-submenu-title, .ant-menu-item{ + text-overflow: clip!important; + } + + } + .ant-popover-inner-content{ + padding:8px!important; + } + .log_compare_table{ + table{ + width: 100%; + th{ + height: 50px; + background: #e5eefb; + color: #0b1c2e; + padding: 0 8px; + border-right: 1px solid #e2e7ec; + } + tr.diff_tr{ + background: #ffebe5; + border:1px solid #eca593; + } + td{ + padding: 14px 8px; + } + } + } + .tab_status{ + display: inline-block; + width: 12px; + height:12px; + border-radius: 50%; + margin-right: 8px; + background: #3A9EEF; + } + .tab_status_purple{ + background: #594DCF; + } + .tab_status_red{ + background: #ff3700; + } + .tab_status_green{ + background: #6bc646; + } + .drawer-button{ + border-top: 1px solid #d9d9d9; + padding: 8px 0; + text-align: right; + } + + .ant-timeline-item-content p { + line-height: 24px; + } + .approval_yellow{ + color: #ff9e0c; + margin-left: 16px; + } + .ant-menu-inline .ant-menu-item, .ant-menu-inline .ant-menu-submenu-title, .ant-menu-vertical-left .ant-menu-item, .ant-menu-vertical-left .ant-menu-submenu-title, .ant-menu-vertical-right .ant-menu-item, .ant-menu-vertical-right .ant-menu-submenu-title, .ant-menu-vertical .ant-menu-item, .ant-menu-vertical .ant-menu-submenu-title{ + margin-top:0; + margin-bottom:0; + } + .move-table-seleted{ + line-height: 24px; + height: 24px; + } + .table-noWrap{ + div:nth-child(1){ + color: #4e546688; + } + div{ + white-space: nowrap; + } + } + diff --git a/cyclone-web/app/containers/app/styles/card.less b/cyclone-web/app/containers/app/styles/card.less new file mode 100644 index 0000000000000000000000000000000000000000..36a7cbc84f30c77e52d15e0be8f2f8ce1891636e --- /dev/null +++ b/cyclone-web/app/containers/app/styles/card.less @@ -0,0 +1,57 @@ +.ant-card-actions { + border-top: 1px solid #e8e8e8; + background: #fafafa; + zoom: 1; + list-style: none; + margin: 0; + padding: 0; +} +.ant-card-actions:before, +.ant-card-actions:after { + content: ""; + display: table; +} +.ant-card-actions:after { + clear: both; +} +//.ant-card-extra{ +// margin-right: -8px; +//} +.ant-card-head{ + padding:0 16px; +} +.ant-card-actions > li { + float: left; + text-align: center; + margin: 8px 0; + color: rgba(0, 0, 0, 0.45); +} +.ant-card-actions > li > span { + display: inline-block; + font-size: 14px; + cursor: pointer; + line-height: 22px; + min-width: 32px; + position: relative; +} +.ant-card-actions > li > span:hover { + color: #1890ff; + -webkit-transition: color .3s; + transition: color .3s; +} +.ant-card-actions > li > span > .anticon { + font-size: 16px; + line-height: 22px; +} +.ant-card-actions > li > span a { + color: rgba(0, 0, 0, 0.45); + line-height: 22px; + display: inline-block; + width: 100%; +} +.ant-card-actions > li > span a:hover { + color: #1890ff; +} +.ant-card-actions > li:not(:last-child) { + border-right: 1px solid #e8e8e8; +} diff --git a/cyclone-web/app/containers/app/styles/codeMirror.less b/cyclone-web/app/containers/app/styles/codeMirror.less new file mode 100644 index 0000000000000000000000000000000000000000..109b95084dcb70ae5fbe9ee6dc560729550b325b --- /dev/null +++ b/cyclone-web/app/containers/app/styles/codeMirror.less @@ -0,0 +1,22 @@ +.CodeMirror{ + height:500px; +} +.CodeMirror-merge, +.CodeMirror-merge .CodeMirror { + height: 500px; +} +.CodeMirror-code{ + line-height: 20px; +} +.CodeMirror-fullscreen { + position: fixed; + top: 0; left: 0; right: 0; bottom: 0; + height: auto; + z-index: 10000; +} +.CodeMirror-fullscreen-button { + position: fixed; + top: 40px; + right: 40px; + z-index: 10001; +} diff --git a/cyclone-web/app/containers/app/styles/collapse.less b/cyclone-web/app/containers/app/styles/collapse.less new file mode 100644 index 0000000000000000000000000000000000000000..1e21f478473d97cbb351b2eae8a0e447ad067013 --- /dev/null +++ b/cyclone-web/app/containers/app/styles/collapse.less @@ -0,0 +1,3 @@ +.ant-collapse-borderless > .ant-collapse-item > .ant-collapse-header:hover { + background-color: @TableBodyHover; +} diff --git a/cyclone-web/app/containers/app/styles/conf-header.less b/cyclone-web/app/containers/app/styles/conf-header.less new file mode 100644 index 0000000000000000000000000000000000000000..3b6ad53531b90077e8ef8fb06b9c759bc43c7456 --- /dev/null +++ b/cyclone-web/app/containers/app/styles/conf-header.less @@ -0,0 +1,90 @@ +.app-header { + height: @HeaderH; + line-height: @HeaderH; + padding: 0; + overflow: hidden; + // background-color: @HeaderBackground; + top: 0; + left: 0; + right: 0; + z-index: 999; + //box-shadow: 1px 0.1px 10px 1px @HeaderShadowBottom; + position: relative; + .app-header-btn { + width: 50px; + height: 100%; + box-sizing: border-box; + position: absolute; + left: 0px; + // color: #f7fbff; + cursor: pointer; + padding-top: 2px; + .btn-circle { + width: 46px; + height: 46px; + margin: 0 auto; + padding-left: 11px; + box-sizing: border-box; + position: relative; + cursor: pointer; + &:hover { + background-color: rgba(255, 255, 255, 0.3); + border-radius: 100%; + } + .icon-group1 { + position: absolute; + top: -2px; + left: 0; + :before { + font-size: 20px !important; + } + } + } + } + .app-theme { + width: 46px; + height: 46px; + box-sizing: border-box; + position: relative; + cursor: pointer; + display: inline-block; + margin-top: 2px; + position: relative; + vertical-align: top; + &:hover { + background-color: rgba(255, 255, 255, 0.3); + } + .icon-painter-palette { + // color: #f7fbff; + position: absolute; + top: -2px; + left: 0; + left: 11px; + } + } + .app-header-left { + width: 200px; + // background-color: @HeaderBackground; + // box-shadow: 0.4px 0px 20px 1px @HeaderShadowLeft; + height: 100%; + .app-header-logo { + display: inline-block; + .logo { + vertical-align: top; + height: 38px; + margin-left: 60px; + margin-top: 6px; + //width: 120px; + } + } + } + .app-header-login { + position: absolute; + top: 0; + right: 32px; + font-size: 14px; + a { + color: #ebf1fa; + } + } +} diff --git a/cyclone-web/app/containers/app/styles/conf-nav.less b/cyclone-web/app/containers/app/styles/conf-nav.less new file mode 100644 index 0000000000000000000000000000000000000000..c3a9b875cde92fe32adf96e4b6982b02e1273123 --- /dev/null +++ b/cyclone-web/app/containers/app/styles/conf-nav.less @@ -0,0 +1,167 @@ +.app-body-nav { + // flex: 0 0 @NavbarWidth; + height: ~"calc(100vh - 50px)"; + // background: @NavbarBackground; + position: relative; + transition: all 0.1s cubic-bezier(0.645, 0.045, 0.355, 1); + overflow-y: hidden; + &::-webkit-scrollbar { + display: none !important; + } + &::-moz-scrollbar { + display: none !important; + } + &::-o-scrollbar { + display: none !important; + } + .ant-menu-dark { + height: ~"calc(100vh - 50px)"; + overflow-y: auto; + &::-webkit-scrollbar { + display: none !important; + } + &::-moz-scrollbar { + display: none !important; + } + &::-o-scrollbar { + display: none !important; + } + } + + .ant-menu-inline .ant-menu-item { + height: 38px; + line-height: 38px; + } + :root .ant-menu-submenu-inline > .ant-menu-submenu-title:after { + font-size: 14px; + } + .ant-menu.ant-menu-dark .ant-menu-item-selected { + background-color: @NavSelected; + } + .menu-show-hide-btn{ + height: 38px; + position: absolute; + bottom: 0; + width: 100%; + cursor: pointer; + z-index: 1; + text-align: center; + margin: 0 auto; + padding-top: 9px; + } + .app-body-nav-btn{ + border-top: 1px solid #30589e; + height: 38px; + position: absolute; + bottom: 0; + width: 100%; + cursor: pointer; + box-shadow: 0px 0px 0px 1px rgba(25,50,92,1); + z-index: 1; + // background-color: @NavbarBackground; + .app-body-nav-uncollapsed { + height: 18px; + text-align: center; + margin: 0 auto; + padding-top: 9px; + color:#fff; + } + .app-body-nav-collapsed { + width: 22px; + height: 15px; + text-align: center; + margin: 0 auto; + color:#fff; + font-size: 12px; + padding-top: 8px; + } + } + .ant-menu-inline-collapsed .ant-menu-submenu-title .iconfont + span { + max-width: 0; + display: inline-block; + opacity: 0; + } + .ant-menu-inline-collapsed > .ant-menu-item .iconfont + span { + max-width: 0; + display: inline-block; + opacity: 0; + } + // tooltip 样式 在外面找 + .ant-menu-inline-collapsed-tooltip .ant-tooltip-inner { + background-color: @NavbarHoverBackground !important; + } + .ant-menu-inline-collapsed-tooltip .ant-tooltip-inner a { + color: #f7fbff; + } + .ant-menu-submenu-open .ant-menu-sub .ant-menu-item { + background: @NavbarHoverBackground; + } + // .ant-menu-submenu-open .ant-menu-sub .ant-menu-item a { + // color: @NavFont; + // } + .ant-menu-sub.ant-menu-inline .ant-menu-item-selected { + background: @NavSelected !important; + } + .ant-menu-dark { + // background: @NavbarBackground; + height: ~"calc(100% - 50px)"; + .ant-menu-item a { + // color: @NavFont !important; + } + .ant-menu-item { + // color: @NavFont; + font-size: @NavFontSize; + } + .ant-menu-submenu-title { + // color: @NavFont; + font-size: @NavFontSize; + } + .ant-menu-submenu-inline .ant-menu-inline { + .ant-menu-item a { + color: @NavFontSub !important; + font-size: @NavFontSize; + } + } + .ant-menu-sub.ant-menu-inline > .ant-menu-item { + // background: @NavbarSubBackground; + } + .ant-menu-item .anticon + span, + .ant-menu-item .gongdan + span, + .ant-menu-submenu-title .anticon + span { + font-weight: 700; + } + } +} +.app-body-nav-uncollapsed { + .ant-menu-inline.ant-menu-dark > .ant-menu-item { + padding-left: 20px !important; + } + .ant-menu-submenu-inline > .ant-menu-inline > .ant-menu-item { + padding-left: 40px !important; + } + .ant-menu-inline .ant-menu-submenu-title { + padding-left: 20px !important; + } +} +.app-body-nav-collapsed { + .ant-menu-inline.ant-menu-dark > .ant-menu-item { + padding-left: 18px !important; + } + .ant-menu-inline .ant-menu-submenu-title { + // padding-left: 18px !important; + padding-left: 0 !important; + a { + display: block; + padding-left: 18px; + // color: @NavFont; + } + &:after { + content: ""; + } + } + .ant-menu-submenu-inline .ant-menu-sub { + .ant-menu-item { + padding-left: 18px !important; + } + } +} diff --git a/cyclone-web/app/containers/app/styles/dropDown.less b/cyclone-web/app/containers/app/styles/dropDown.less new file mode 100644 index 0000000000000000000000000000000000000000..7314111349f9a34867a9d7d9e455f7f13326a56a --- /dev/null +++ b/cyclone-web/app/containers/app/styles/dropDown.less @@ -0,0 +1,23 @@ +.ant-select-dropdown-menu { + font-size: @baseFontSize; + color: @DropDownFont; + .ant-select-dropdown-menu-item:hover { + background-color: @DropDownHover; + } + .ant-select-dropdown-menu-item-selected { + background-color: @SelectedBg; + font-weight: 600; + color: @DropDownSelectedFont; + } + .ant-dropdown-menu-item { + span.disabled { + color: #c1c1c1; + cursor: no-drop; + } + } +} +.ant-dropdown { + .ant-dropdown-menu-item { + font-size: @baseFontSize; + } +} diff --git a/cyclone-web/app/containers/app/styles/form.less b/cyclone-web/app/containers/app/styles/form.less new file mode 100644 index 0000000000000000000000000000000000000000..03ae79e27ed786cfe9c3be9a0bda98b02d8f6457 --- /dev/null +++ b/cyclone-web/app/containers/app/styles/form.less @@ -0,0 +1,15 @@ +.ant-form { + color: @FormFont; + font-size: @baseFontSize; + + .ant-input { + } +} +.ant-form-item-label label { + color: #4c5a71; + font-size: @baseFontSize; +} +.ant-form-item{ + margin-bottom: 16px; +} + diff --git a/cyclone-web/app/containers/app/styles/idcos-btn.less b/cyclone-web/app/containers/app/styles/idcos-btn.less new file mode 100644 index 0000000000000000000000000000000000000000..cf22bfeac6439dc86916a8031f6355b53d60cb0a --- /dev/null +++ b/cyclone-web/app/containers/app/styles/idcos-btn.less @@ -0,0 +1,96 @@ +.ant-btn-primary { + background-color: @BtnColor; + color: #fff !important; + &:hover { + background-color: @BtnHover; + } +} +.ant-radio-wrapper { + font-size: 14px; +} +.ant-btn-hover() { + color: @BtnColor; +} +.ant-btn { + color: @BtnNormalColor; + font-size: @baseFontSize; + display: inline-block; + margin-bottom: 0; + font-weight: 400 !important; + &:hover:not(.ant-btn-primary) { + .ant-btn-hover; + } + &:focus { + .ant-btn-hover; + } +} +.ant-btn-danger { + color: #ff3700!important; +} +.ant-btn-danger:hover, +.ant-btn-danger:focus, +.ant-btn-danger:active +{ + color: #fff!important; + background-color: #f23400; + border-color: #f23400; +} + +.ant-btn-primary.disabled, +.ant-btn-primary[disabled], +.ant-btn-primary.disabled:hover, +.ant-btn-primary[disabled]:hover, +.ant-btn-primary.disabled:focus, +.ant-btn-primary[disabled]:focus, +.ant-btn-primary.disabled:active, +.ant-btn-primary[disabled]:active, +.ant-btn-primary.disabled.active, +.ant-btn-primary[disabled].active { + color: @BtnDisabledFont !important; + background-color: @BtnDisabledBg; + border-color: @BtnDisabledBorder; +} + +.ant-btn.disabled, +.ant-btn[disabled], +.ant-btn.disabled:hover, +.ant-btn[disabled]:hover, +.ant-btn.disabled:focus, +.ant-btn[disabled]:focus, +.ant-btn.disabled:active, +.ant-btn[disabled]:active, +.ant-btn.disabled.active, +.ant-btn[disabled].active { + color: @BtnDisabledFont !important; + background-color: @BtnDisabledBg; + border-color: @BtnDisabledBorder; +} + +.ant-checkbox.ant-checkbox-disabled { + .ant-checkbox-inner { + color: @BtnDisabledFont !important; + background-color: @BtnDisabledBg; + border-color: @BtnDisabledBorder; + position: relative; + } +} +.ant-checkbox-checked .ant-checkbox-inner:after{ + position: absolute; + -webkit-transform: rotate(45deg) scale(1); + -ms-transform: rotate(45deg) scale(1); + transform: rotate(45deg) scale(1); + //left: 4.57142857px; + //top: 1.14285714px; + //display: table; + //width: 5.71428571px; + //height: 9.14285714px; + //border: 2px solid #fff; + //border-top: 0; + //border-left: 0; + //content: " "; + //-webkit-transition: all .1s cubic-bezier(.71, -.46, .88, .6); + //transition: all .1s cubic-bezier(.71, -.46, .88, .6); +} +.operate_btns{ + margin-bottom: 8px; +} diff --git a/cyclone-web/app/containers/app/styles/idcos-layout.less b/cyclone-web/app/containers/app/styles/idcos-layout.less new file mode 100644 index 0000000000000000000000000000000000000000..45e503d02b3ce21baa745ae7bd00b3a3c4f74b0e --- /dev/null +++ b/cyclone-web/app/containers/app/styles/idcos-layout.less @@ -0,0 +1,91 @@ +html, +body { + -webkit-font-smoothing: antialiased; + overflow: hidden; + color: @SubTitle !important; +} +h1, +h2 { + color: @Title !important; +} + +.approot { + height: 100%; + overflow: auto; + background-color: #d8d8d8; + font-size: 14px; + .app-container { + height: ~"calc(100% - 50px)"; + overflow-y: hidden; + display:-webkit-box;display:-webkit-flex;display:-ms-flexbox; + display: flex; + // position: relative; + box-sizing: border-box; + .app-body-main { + height: 100%; + box-sizing: border-box; + overflow-y: hidden; + background-color: @ContainerBg; + -ms-flex:1 1 auto; + flex:1 1 auto; + .app-body-content { + //position: relative; + + // 详情页 + .approot-innder-detail { + padding: 16px 16px 48px; + overflow-y: auto; + box-sizing: border-box; + height: ~"calc(100vh - 50px)"; + -ms-flex:1 1 auto; + flex:1 1 auto; + } + + //主页面 + // 没有数的情况下 + .approot-inner { + padding: 16px; + // height: 100%; + overflow-y: hidden; + box-sizing: border-box; + .approot-inner-content { + overflow-y: auto; + background-color: @bg; + border-radius: 4px; + height: ~"calc(100vh - 82px)"; + overflow-x: hidden; + padding: 16px; + box-sizing: border-box; + .page { + background: @white; + overflow-y: auto; + font-size: @baseFontSize; + overflow-x: hidden; + height:100%; + .page-header { + color: @Title; + box-sizing: border-box; + //border-bottom: solid 1px #dfdfdf; + font-size: 18px; + //padding-bottom: 8px; + font-weight: 700; + } + .page-body { + padding-top: 10px; + //overflow-x: hidden; + box-sizing: border-box; + } + } + } + } + // 有树的情况下 + .approot-hasTree-inner { + // + position: relative; + display:-webkit-box;display:-webkit-flex;display:-ms-flexbox; + display: flex; + } + } + } + } +} diff --git a/cyclone-web/app/containers/app/styles/idcos-table.less b/cyclone-web/app/containers/app/styles/idcos-table.less new file mode 100644 index 0000000000000000000000000000000000000000..a9d713fb584d02a575b991e8a819e094c53c23ea --- /dev/null +++ b/cyclone-web/app/containers/app/styles/idcos-table.less @@ -0,0 +1,189 @@ +// 表格调整 + +// 表格默认用 middle +@bgHeader: #e5eefb; +@fontSize: 14px; +.ant-table-body{ + //overflow-x: auto; + table-layout: fixed; +} +.ant-checkbox-checked .ant-checkbox-inner, +.ant-checkbox-indeterminate .ant-checkbox-inner { + background-color: @blueDark; + border-color: @blueDark; +} +.table-controls { + > * { + padding: 0 7px; + border-right: solid 1px #ccc; + &:last-child { + border-right: none; + } + } + + .disabled { + color: #c1c1c1; + cursor: no-drop; + } +} + +.table-controls-test { + > * { + width: 45px; + display: inline-block; + box-sizing: border-box; + padding: 0 3px !important; + text-align: center; + } +} +.ant-table-thead > tr > th, +.ant-table-tbody > tr > td { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + cursor: pointer; + max-width: 100px; + padding: 14px 8px; + box-sizing: border-box; + border-right: 1px solid @TableBorder; +} +.ant-table-thead > tr > th:nth-child(1), +.ant-table-tbody > tr > td:nth-child(1) { + padding: 6px 8px; + box-sizing: border-box; + border-left: 1px solid @TableBorder; +} +.ant-table-tbody > tr:nth-child(1) > td { + border-top: none; +} + +.ant-table-thead > tr > th { + // border-bottom: none; + word-wrap: break-word; +} +.ant-table-tbody { + /* 表格的间隔颜色 */ + tr:nth-of-type(even) { + background-color: @TableBodyEven; + } + /* 当前划过的表格的行的颜色 */ + tr:hover { + background: @TableBodyHover; + } +} +.ant-table { + font-size: 13px; + color: #4e5466; + .ant-table-thead > tr > th.ant-table-selection-column, + .ant-table-tbody > tr > td.ant-table-selection-column { + text-align: center; + min-width: 35px !important; + width: 35px !important; + } + table { + border-radius: 4px 4px 0 0; + // border-collapse: collapse; + } + table.ant-table-fixed { + width: 100% !important; + .ant-table-thead { + tr > th { + border-bottom: none; + } + } + } + + .ant-table-header { + background-color: @TableHeadBg; + } + .ant-table-thead > tr > th { + background: @TableHeadBg; + color: @Title; + white-space: nowrap; + box-sizing: border-box; + } +} + +// 页码 + +.ant-pagination { + float: right; + margin-top: 16px; + color: @PaginationFont; + font-size: @baseFontSize; + margin-bottom: 0px; + .ant-select-selection-selected-value { + color: @PaginationFont; + font-size: @baseFontSize; + } +} +.ant-pagination-item-active { + background-color: @BtnColor; + border-color: @BtnColor; + color: #fff; +} + +//分页的样式重写 +.ant-pagination-prev a, +.ant-pagination-next a { + border: 1px solid @PaginationBorder; + font-size: @baseFontSize; + border-radius: 4px; + outline: 0; + display: block; + &:after { + zoom: 1; + display: block; + height: 26px; + line-height: 26px; + font-family: "anticon"; + text-align: center; + font-weight: 500; + font-size: 12px; + } +} +.ant-pagination-simple .ant-pagination-next a, +.ant-pagination-simple .ant-pagination-prev a { + border: 0; + height: 24px; + line-height: 24px; + margin: 0; + font-size: 18px; +} +.a() { + height: 18px; + line-height: 18px; + margin: 0; + font-size: 18px; + outline: 0; + display: block; + -webkit-transition: all 0.3s; + transition: all 0.3s; +} +.ant-pagination-item-active { + a{ + color:#fff!important; + &:active,&:focus,&:hover,&:visited{ + color:#fff!important; + } + } +} + + +.a-after() { + display: block; + font-size: @baseFontSize; + zoom: 1; + height: 18px; + line-height: 18px; + font-family: "anticon"; + text-align: center; + font-weight: 500; +} +.ant-pagination-options-size-changer.ant-select{ + margin-right: 0; +} +.ant-pagination-options-quick-jumper{ + margin-left: 8px; +} + diff --git a/cyclone-web/app/containers/app/styles/idcos-tree.less b/cyclone-web/app/containers/app/styles/idcos-tree.less new file mode 100644 index 0000000000000000000000000000000000000000..a53a56216db46edb1a17e496deb2cf0c84e5d1d8 --- /dev/null +++ b/cyclone-web/app/containers/app/styles/idcos-tree.less @@ -0,0 +1,102 @@ +.app-tree { + height: ~"calc(100vh - 50px)"; + overflow-y: hidden; + background-color: @bg; + padding: 8px; + box-sizing: border-box; + // position: relative; + transition: all 0.1s cubic-bezier(0.645, 0.045, 0.355, 1); + .tree-btn { + position: absolute; + top: 340px; + width: 20px; + transition: all 0.1s cubic-bezier(0.645, 0.045, 0.355, 1); + z-index: 100; + cursor: pointer; + .img { + width: 100%; + height: auto; + } + } +} + +.ant-tree { + font-size: 14px; + color: @SubTitle; + li { + .ant-tree-node-content-wrapper { + color: @SubTitle !important; + &:hover { + background-color: @TreeSelected !important; + } + } + .ant-tree-node-selected { + background-color: @TreeSelected !important; + } + } +} +.ant-tree > li:first-child { + padding-top: 0 !important; +} +.node-tree { + overflow-x: hidden; + .node-tree__header { + color: @Title; + padding-bottom: 10px; + border-bottom: 1px solid #e2e7ec; + /* margin-bottom: 5px; */ + padding-top: 3px; + } + .node-tree__body { + height: ~"calc(100vh - 90px)"; + overflow-y: auto; + overflow-x: hidden; + min-height: ~"calc(100% - 90px)"; + .tree-menu > div { + padding-left: 6px; + padding-bottom: 8px; + padding-right: 6px; + padding-top: 6px; + } + .tree-menu .ant-tree li .ant-tree-node-content-wrapper { + width: ~"calc(100% - 30px)"; + position: relative; + .tree-node-controls { + display: none; + .anticon { + font-size: 12px; + } + } + &:hover, + &.ant-tree-node-selected { + .tree-node-controls { + display: inline-block; + } + } + } + } +} + +.ant-tree-title > span { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 80%; + display: inline-block; +} + +.app-tree-right { + height: ~"calc(100vh - 50px)"; + padding: 16px; + box-sizing: border-box; + overflow-y: hidden; + -ms-flex:1 1 auto; + flex:1 1 auto; + .app-tree-right-body { + background-color: @bg; + height: 100%; + overflow-y: auto; + padding: 16px; + border-radius: 4px; + } +} diff --git a/cyclone-web/app/containers/app/styles/index.less b/cyclone-web/app/containers/app/styles/index.less new file mode 100644 index 0000000000000000000000000000000000000000..3d53fb007ff2e95de691045d034e002c7849e8c1 --- /dev/null +++ b/cyclone-web/app/containers/app/styles/index.less @@ -0,0 +1,254 @@ +:global { + /** + * layout + */ + @import "variable"; // 变量 + + @import "theme"; // 皮肤样式 + @import "idcos-layout"; // 基础样式 + @import "conf-header"; //header + @import "conf-nav"; // 左侧导航 + + @import "idcos-table"; // 表格样式 + @import "panel"; // panel 面板 + @import "tabs"; //tabs + + @import "idcos-tree"; // 树 + @import "idcos-btn"; //按钮 + @import "link"; // 连接 + @import "dropDown"; // 下拉 + @import "tabPane"; + @import "codeMirror"; + @import "form"; + @import "card"; + @import "modal"; + @import "collapse"; + @import "status"; + @import "input"; + @import 'boot'; + + // *::-webkit-scrollbar { // display: none; // } // *::-moz-scrollbar { // display: none; // } // *::-ms-scrollbar { // display: none; // } // *::-o-scrollbar { // display: none; // } html, + body { + -webkit-font-smoothing: antialiased; + } + + .idcos-devider { + margin : 8px 0; + width : 100%; + height : 1px; + background: #e2e7ec; + } + + .flexBox { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + } + + .flexBox1 { + display : -webkit-box; + display : -webkit-flex; + display : -ms-flexbox; + display : flex; + -ms-flex: 1 1 auto; + flex : 1 1 auto; + } + + .hide { + display: none; + } + + .pull-right { + float : right; + display: inline-flex; + } + + .anticon { + cursor : pointer; + font-size: 14px; + } + + .anticon-question-circle-o { + margin-left: 4px; + } + + .clearfix { + zoom: 0; + + :after { + display: block; + width : 0; + content: 0; + height : 0; + clear : both; + } + } + + .ant-advanced-search-form { + margin-bottom : 10px; + background : @SearchBg; + padding : 16px; + padding-bottom: 8px; + border-radius : 4px; + border : 1px solid @SraechBorder; + + .ant-form-item { + margin-bottom: 8px !important; + } + } + + .ant-confirm-body .ant-confirm-content { + word-break: break-all; + } + + .ant-checkbox-indeterminate { + .ant-checkbox-inner { + background: transparent; + border : 1px solid #d8d8d8; + } + } + + .module-content { + .ant-pagination-options-size-changer { + width: auto !important; + } + } + + .field-params { + .anticon { + cursor: pointer; + } + + .ant-table-thead>tr>th { + padding : 4px 6px; + text-align: center !important; + } + + .ant-table-tbody>tr>td { + padding: 0 6px; + } + + .ant-form-item-control { + text-align: center; + top : -3px; + } + + td { + height: 45px; + + .ant-row { + position: relative; + top : -8px; + } + } + } + + .ant-tabs { + overflow: inherit; + } + + .ant-collapse-borderless>.ant-collapse-item>.ant-collapse-content { + overflow: scroll; + } + + .ant-advanced-search-form>.ant-row>.ant-col-6 { + //padding-left : 10px !important; + //padding-right: 10px !important; + } + + .instructionList { + height : 500px; + overflow-y : auto; + border : 1px solid #dedede; + border-right: 0; + margin-left : 8px; + + li { + height : 38px; + line-height : 38px; + border-bottom: 1px solid #dedede; + padding : 0 10px; + white-space : nowrap; + text-overflow: ellipsis; + overflow : hidden; + cursor : pointer; + } + } + + .active { + background: #ecf6fd; + } + + #div .ant-table-tbody>tr>td { + height : 50px !important; + word-break : keep-all; + white-space : nowrap; + overflow : hidden; + -ms-text-overflow: ellipsis; + text-overflow : ellipsis; + //overflow-x : auto; + } + + #div .ant-table-tbody>tr { + height: 50px !important; + } + + #div table { + table-layout: fixed; + overflow-x : auto; + } + + .leftMode { + margin-top: -16px; + + .app-tree-right { + padding: 0 !important; + } + + .app-tree-right-body { + padding-top : 0 !important; + padding-right: 0 !important; + } + + .app-tree { + border : 1px solid rgb(226, 231, 236); + border-radius: 4px; + //padding :0!important; + } + + .ant-tabs-content { + padding : 0 !important; + border-left : 0 !important; + margin-right: 0 !important; + + .ant-tabs-tabpane { + padding-right: 0 !important; + } + } + + .ant-tabs-bar { + padding-right: 0 !important; + padding-top : 16px; + margin-bottom: 0; + padding-left : 0; + height : ~"calc(100vh - 82px)"; + } + } + + .panel_collapse { + position : absolute; + bottom : 0; + left : 50%; + margin-left: -5px; + } + + .ant-badge-not-a-wrapper .ant-scroll-number { + height: 8px; + width : 8px; + } + + .ant-table-selection-column .ant-checkbox-wrapper { + padding: 8px; + } +} \ No newline at end of file diff --git a/cyclone-web/app/containers/app/styles/input.less b/cyclone-web/app/containers/app/styles/input.less new file mode 100644 index 0000000000000000000000000000000000000000..8bf62883a9b6f3ebefdab2d3d5c97cabc228ea23 --- /dev/null +++ b/cyclone-web/app/containers/app/styles/input.less @@ -0,0 +1,6 @@ +.ant-input { + font-size: 14px; +} +.ant-advanced-search-form .ant-input { + height: 32px; +} diff --git a/cyclone-web/app/containers/app/styles/link.less b/cyclone-web/app/containers/app/styles/link.less new file mode 100644 index 0000000000000000000000000000000000000000..fbedb22c00d403d016f2840a0111da5511fe1aa7 --- /dev/null +++ b/cyclone-web/app/containers/app/styles/link.less @@ -0,0 +1,3 @@ +a { + color: @Link; +} diff --git a/cyclone-web/app/containers/app/styles/modal.less b/cyclone-web/app/containers/app/styles/modal.less new file mode 100644 index 0000000000000000000000000000000000000000..bae19b76b8c62defcb199bac615b900a8981773a --- /dev/null +++ b/cyclone-web/app/containers/app/styles/modal.less @@ -0,0 +1,9 @@ +.ant-modal { + .ant-modal-content { + background-color: @white; + } +} +.ant-modal-wrap { +} +.ant-modal-mask { +} diff --git a/cyclone-web/app/containers/app/styles/panel.less b/cyclone-web/app/containers/app/styles/panel.less new file mode 100644 index 0000000000000000000000000000000000000000..eea4ec74b5392c8cdf03281de9d0bf4bd00bd8ce --- /dev/null +++ b/cyclone-web/app/containers/app/styles/panel.less @@ -0,0 +1,135 @@ +.panelBack-b { + padding: 8px; + font-size: 14px; + color: @BreadcrumbFontBack; + padding-top: 0px; + a { + font-size: 14px; + cursor: pointer; + color: @BreadcrumbFontBack !important; + &:hover { + color: @blueDark !important; + } + } + .panel-nb-title { + color: @BreadcrumbFontTitle; + } +} +.panel { + background-color: @PanelBg; + margin-bottom: 8px; + border: solid 1px @PanelBorder; + border-radius: @PanelBorderRadius; + position: relative; + .panel-label-row { + display: inline-block; + font-size: 14px; + color: @PanelTitleFont; + } + .panel-label { + //width: 80px; + display: inline-block; + font-size: 14px; + color: @PanelTitleFont; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + float: left; + } + .panelBack-container { + .panelBack { + padding:16px 16px 6px 16px; + font-size: 18px; + border-radius: @PanelBorderRadius; + color: @PanelTitleFont; + border-bottom: 1px solid @PanelBorder; + font-weight: 500; + .panelBack-icon { + margin-right: 10px; + a { + cursor: pointer; + color: @PanelNormalFont !important; + font-size: 16px; + &:hover { + color: @blueDark !important; + } + } + } + .panelBack-title { + a { + color: @PanelTitleFont !important; + cursor: pointer; + font-size: 18px; + &:hover { + color: @blueDark !important; + } + } + } + } + .panelStep { + width: 80%; + margin-left: auto; + margin-right: auto; + padding: 32px; + padding-top: 24px; + } + } + + .panel-title { + padding:16px 20px 6px 20px; + font-size: 16px; + border-radius: @PanelBorderRadius; + color: @PanelTitleFont; + border-bottom: 1px solid @PanelBorder; + .more{ + float: right; + text-align: right; + margin-left: auto; + font-size: 14px; + } + .panelBack-icon { + margin-right: 10px; + a { + cursor: pointer; + color: @PanelNormalFont !important; + font-size: 16px; + &:hover { + color: @blueDark !important; + } + } + } + } + .panel-body { + padding: 16px; + background: white; + overflow-y: auto; + color: @PanelNormalFont; + font-size: 14px; + div[class^='ant-col-'] { + line-height: 24px; + } + .group { + padding: 10px 0; + border-bottom: solid 1px @PanelBorder; + margin: 20px 0; + } + .panel-label { + font-size: 14px; + color: @PanelTitleFont; + } + } + .panel-footer { + padding: 0 16px 8px 16px; + text-align: right; + } + .inlineRow { + display: inline-block !important; + vertical-align: bottom; + margin-left: 3%; + width:80%; + .ant-input { + width: 60%; + } + } +} + diff --git a/cyclone-web/app/containers/app/styles/status.less b/cyclone-web/app/containers/app/styles/status.less new file mode 100644 index 0000000000000000000000000000000000000000..16f7d4d2895775f2d7b89b05858e463e3b2128e2 --- /dev/null +++ b/cyclone-web/app/containers/app/styles/status.less @@ -0,0 +1,24 @@ +// 绿色 +.status_success { + background-color: #6bc646; +} + +// 红色 +.status_fail { + background-color: #ff3700; +} + +// 橘色 +.status_overtime { + background-color: #ff6f00; +} + +// 浅蓝 +.status_running { + background-color: #00c3ff; +} + +// 黄色 +.status_await { + background-color: #ff9e0c; +} diff --git a/cyclone-web/app/containers/app/styles/step.less b/cyclone-web/app/containers/app/styles/step.less new file mode 100644 index 0000000000000000000000000000000000000000..03a86137a38b2c261e4c0808bfe22130e71797cb --- /dev/null +++ b/cyclone-web/app/containers/app/styles/step.less @@ -0,0 +1,21 @@ +.stepsContent { + margin-top: 16px; + border: 1px dashed #e9e9e9; + border-radius: 6px; + padding: 20px 0 0 0; + max-height: 300px; + overflow-y: auto; +} +.stepsAction { + margin-top: 24px; +} + +.ant-steps .ant-steps-item.ant-steps-status-process .ant-steps-head-inner { + border-color: @blueDark; + background-color: @blueDark; +} + +.ant-steps-head-inner { + border-color: @blueDark; + background-color: @blueDark; +} diff --git a/cyclone-web/app/containers/app/styles/tabPane.less b/cyclone-web/app/containers/app/styles/tabPane.less new file mode 100644 index 0000000000000000000000000000000000000000..a3cd156cbd2bcc8ce18253f933b3b8aa88387c56 --- /dev/null +++ b/cyclone-web/app/containers/app/styles/tabPane.less @@ -0,0 +1,14 @@ +.ant-tabs-nav-container { + font-size: @baseFontSize; + .ant-tabs-nav { + .ant-tabs-ink-bar { + background-color: @TabPaneSelected; + } + .ant-tabs-tab-active { + color: @TabPaneSelected; + } + } + .ant-tabs-tab { + color: @TabPaneFont; + } +} diff --git a/cyclone-web/app/containers/app/styles/tabs.less b/cyclone-web/app/containers/app/styles/tabs.less new file mode 100644 index 0000000000000000000000000000000000000000..193c8cd6c6dc354d9ec1e4125a75fe64a05c4ba1 --- /dev/null +++ b/cyclone-web/app/containers/app/styles/tabs.less @@ -0,0 +1,99 @@ +.page-tabs { + color: @TabFont; + font-size: @baseFontSize; + .page-tabs-inner { + h3 { + color: @Title; + box-sizing: border-box; + font-size: 18px; + padding-bottom: 8px; + font-weight: 700; + padding-left: 16px; + } + border-bottom: 1px solid @TabBorder; + } + + &-form { + @bg: #fbfdff; + background: @bg; + border-bottom: 1px solid #a0afbe; + padding-top: 15px; + margin-bottom: -10px; + .ant-form { + background: @bg; + margin-bottom: 0; + padding: 0 10px; + } + } + .ant-tabs-nav { + font-size: 14px !important; + } + .ant-tabs { + overflow: inherit; + height:100%; + // margin-bottom: -1px; //在页面百分比缩小时保持当前状态 + color: @SubTitle; + // 上下位置调整 + .ant-tabs-bar { + margin-bottom: 0; + margin-top: 10px; + // 去掉下面的border + border-bottom-width: 0; + .ant-tabs-tab { + border-radius: 5px 5px 0 0; + background-color: @TabUnSelected; //在页面百分比缩小时背静颜色不覆盖线条 + border-bottom: 1px solid @TabBorder; + margin-right: 4px; + // 当前tab + &.ant-tabs-tab-active { + border-bottom: 1px solid #fff; + box-shadow: inset 0 -5px rgba(255, 255, 255, 1); //在页面百分比缩小时保持当前状态 + } + } + } + + span.spanCircle { + display: inline-block; + width: 31px; + height: 16px; + line-height: 16px; + border-radius: 8px; + vertical-align: text-bottom; + text-align: center; + margin-left: 5px; + border: 1px solid @TabBorder; + &.fill { + background: @blue; + color: #fff; + } + &.hollow { + background: #fff; + color: @blue; + border: 1px solid @blue; + } + } + } +} + +.page-tabs-unBordered { + color: @TabFont; + font-size: @baseFontSize; + position: relative; + height:100%; + .page-unBorderedTitle { + color: #0b1c2e; + box-sizing: border-box; + font-size: 18px; + font-weight: 700; + position: absolute; + top: 4px; + left: 0; + } + .ant-tabs-bar { + padding-left: 25%; + } +} + +.ant-tabs-vertical.ant-tabs-left>.ant-tabs-bar{ + padding-left: 0; +} diff --git a/cyclone-web/app/containers/app/styles/theme.less b/cyclone-web/app/containers/app/styles/theme.less new file mode 100644 index 0000000000000000000000000000000000000000..1dee3a1d0825c4b4fd67eb75b3a304999af31cee --- /dev/null +++ b/cyclone-web/app/containers/app/styles/theme.less @@ -0,0 +1,140 @@ +// 把颜色有关的样式提取出来 +@darkFont: #dcdfee; +.themeDefault { + .app-header { + background-color: @HeaderBackground; + //box-shadow: 1px 0.1px 10px 1px @HeaderShadowBottom; + .app-header-left { + background-color: @HeaderBackground; + } + .app-theme { + .icon-painter-palette { + color: #ebf1fa; + } + } + .app-header-btn { + color: #ebf1fa; + } + .anticon-user { + color: #ebf1fa; + } + } + .menu-show-hide-btn{ + box-shadow: -1px 0px 1px 1px rgba(144, 146, 156, 0.4); + background-color: @NavbarBackground; + } + .app-body-nav { + background: @NavbarBackground; + .app-body-nav-btn { + border-top: 1px solid #30589e; + box-shadow: 0px 0px 0px 1px rgba(25,50,92,1); + background-color: @NavbarBackground; + } + .ant-menu-dark { + background: @NavbarBackground; + } + .ant-menu-sub.ant-menu-inline > .ant-menu-item { + background: @NavbarSubBackground; + span{ + font-weight: normal!important; + } + } + + // color + .ant-menu-submenu-open .ant-menu-sub .ant-menu-item a { + color: @NavFont; + } + .ant-menu-dark { + // background: @NavbarBackground; + height: ~"calc(100% - 50px)"; + .ant-menu-item a { + color: @NavFont !important; + } + .ant-menu-item { + color: @NavFont; + } + .ant-menu-submenu-title { + color: @NavFont; + } + .ant-menu-submenu-inline .ant-menu-inline { + .ant-menu-item a { + color: @NavFontSub !important; + } + } + } + .ant-menu-inline .ant-menu-submenu-title { + a { + color: @NavFont; + } + } + } +} + +.themeDark { + .app-header { + background-color: #2f2f4b; + box-shadow: 1px 0.1px 10px 1px rgba(144, 146, 156, 0.4); + .app-header-left { + background-color: #2f2f4b; + } + .app-theme { + .icon-painter-palette { + color: @darkFont; + } + } + .app-header-btn { + color: @darkFont; + } + .anticon-user { + color: @darkFont; + } + } + .menu-show-hide-btn{ + box-shadow: -1px 0px 1px 1px rgba(144, 146, 156, 0.4); + background-color: #232639; + } + .app-body-nav { + background: #232639; + .app-body-nav-btn { + border-top: 1px solid #40486B; + box-shadow: 0px 0px 0px 1px #10131F; + background-color: #232639; + } + .ant-menu-dark { + background: #232639; + } + .ant-menu-sub.ant-menu-inline > .ant-menu-item { + background: #444B6D; + span{ + font-weight: normal!important; + } + } + + .ant-menu-submenu-open .ant-menu-sub .ant-menu-item a { + color: @darkFont; + } + .ant-menu-dark { + // background: @NavbarBackground; + height: ~"calc(100% - 50px)"; + .ant-menu-item a { + color: @darkFont !important; + } + .ant-menu-item { + color: @darkFont; + } + .ant-menu-submenu-title { + color: @darkFont; + } + .ant-menu-submenu-inline .ant-menu-inline { + .ant-menu-item a { + color: @NavFontSub !important; + } + } + } + .ant-menu-inline .ant-menu-submenu-title { + a { + color: @darkFont; + } + } + } +} diff --git a/cyclone-web/app/containers/app/styles/variable.less b/cyclone-web/app/containers/app/styles/variable.less new file mode 100644 index 0000000000000000000000000000000000000000..a77baec54fb066ec84341e40d1ce3a51ab90dae9 --- /dev/null +++ b/cyclone-web/app/containers/app/styles/variable.less @@ -0,0 +1,204 @@ +// +// Variables +// -------------------------------------------------- + +// Global values +// -------------------------------------------------- + +// Accent colors +// ------------------------- +@purple: #07195B; + +@purpleLight: #89a7f9; + +@blueLight: #e5eefb; + +@blueLightDouble: #e2e7ec; + +@blue: #108ee9; + +@blueDark: #0072ff; + +@blueShadow: #f2f3f3; + +@purpleDark: #24457e; + +@blackLight: #031f48; + +@gray: #4c5a71; + +@whiteDark: #c4dffa; + +@white: #fdfdfd; + +// 说明颜色 +@blueLightLight: #ebf1fa; + +// ------------------------- + +// Typography +// ------------------------- +@fontFamily: "Helvetica Neue", Helvetica, Arial, sans-serif; +@sansFontFamily: Georgia, "Times New Roman", Times, serif; +@monoFontFamily: Monaco, Menlo, Consolas, "Courier New", monospace; +@baseFontSize: 14px; +@baseFontFamily: @sansFontFamily; +@baseLineHeight: 20px; + +// Header +// ------------------------- +@HeaderBackground: @purple; +@HeaderSearchBackground: @purpleLight; +@HeaderH: 50px; +@HeaderShadowLeft: fadeout(@blueShadow, 80%); +@HeaderShadowBottom: fadeout(@blue, 40%); +@HeaderFont: @whiteDark; +@HeaderFontSzie: @baseFontSize*1.2; + +// Navbar +// ------------------------- +@NavbarCollapseWidth: 50px; + +@NavbarWidth: 200px; + +@NavbarBackground: @purpleDark; + +@NavbarSubBackground: @blackLight; + +@NavbarHoverBackground: @gray; + +@NavFontSize: @baseFontSize; + +@NavFont: #f7fbff; +@NavBorder: #5179ca; + +@NavSelected: @blueDark; + +@NavFontSub: #d7e5fd; + +// Container +// ------------------------- + +@bg: @white; +@ContainerBg: @blueLightLight; + +//标题颜色 +//@Title: #010f24; +@Title: #0b1c2e; + +// 正文颜色-普通内文字颜色 +@SubTitle: #4c5a71; + +// 辅助色 比正文颜色弱一个层次的颜色 +@SubTitleSub: #a5afbc; + +// 辅助色---版主信息/说明性文字/表单描边 +@HelpExplain: #c4cdd7; + +// 导航栏文字颜色 +@NavText: #c6d9ec; + +// 分割线/表格描边 +@TableBorder: #e2e7ec; + +// 失效背景色 +@Disable: #f7f7f7; + +// 表格hover 下拉框 hover +@TableHover: #eef7fe; + +// dropdown selectBg +@SelectedBg: #f7f7f7; + +// 辅助色 + +@SelectedSubBg: #fafcfe; + +// btnhover + +@BtnHover: #49a9ee; + +// Btn +// ------------------------- + +@BtnColor: @blueDark; +@BtnNormalColor: @SubTitle; + +@BtnDisabledBorder: @TableBorder; +@BtnDisabledFont: @HelpExplain; +@BtnDisabledBg: #ededed; + +// Table +// ------------------------- + +@TableHeadBg: @blueLight; +@TableHeadFont: @Title; + +@TableBodyEven: @SelectedSubBg; +@TableBodyHover: @TableHover; + +@PaginationFont: @SubTitle; +@PaginationBorder: @TableBorder; + +// Link +// ------------------------- +@Link: @blueDark; + +// DropDown +// ------------------------- +@DropDownFont: @SubTitle; +@DropDownHover: @TableHover; +@DropDownSelectedFont: @Title; +@DropDownSelectedBg: @SelectedBg; + +// Tree +// ------------------------- +@TreeSelected: fadeout(#e3eefc, 50%); + +@TreeHover: @TableHover; + +// TabPane +// ------------------------- +@TabPaneFont: @SubTitle; +@TabPaneSelected: @blueDark; + +// panel +// ------------------------- +@PanelBorder: @TableBorder; +@PanelBorderRadius: 4px; +@PanelBg: @bg; + +@PanelNormalFont: @SubTitle; + +@PanelTitleFont: @Title; + +// 面包屑 +@BreadcrumbFontTitle: @SubTitle; +@BreadcrumbFontBack: #8c95a2; + +// panel +// ------------------------- + +// Search +// ------------------------- + +@SearchBg: @SelectedSubBg; +@SraechBorder: @TableBorder; + +// Tabs +// ------------------------- +@TabBorder: @TableBorder; +@TabCircle: @white; +@TabFont: @SubTitle; + +@TabUnSelected: @SelectedSubBg; + +// Card +// ------------------------- + +@CardTitleFont: @Title; + +// Card +// ------------------------- + +@FormFont: @SubTitle; diff --git a/cyclone-web/app/containers/approval/actions/detail.jsx b/cyclone-web/app/containers/approval/actions/detail.jsx new file mode 100644 index 0000000000000000000000000000000000000000..d4646e890686dbee776836f78a76dfb7b4fb1ce4 --- /dev/null +++ b/cyclone-web/app/containers/approval/actions/detail.jsx @@ -0,0 +1,16 @@ +import React from 'react'; +import Popup from 'components/popup/draw'; +import Form from './form'; + +export default function action(options) { + Popup.open({ + title: options.record.title || '审批详情', + onCancel: () => { + Popup.close(); + }, + content: ( + <Form onCancel={() => Popup.close()} reload={options.reload} userInfo={options.userInfo} initialValue={options.record} approval_id={options.approval_id}> + </Form> + ) + }); +} diff --git a/cyclone-web/app/containers/approval/actions/form.jsx b/cyclone-web/app/containers/approval/actions/form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..ad0f4b1ca46a614e19f76d52bcf51319986e924f --- /dev/null +++ b/cyclone-web/app/containers/approval/actions/form.jsx @@ -0,0 +1,251 @@ +import React from 'react'; +import { renderFormDetail } from 'common/utils'; +import { APPROVAL_STATUS, APPROVAL_TYPE, APPROVAL_ACTION } from 'common/enums'; +import { get, put, del } from 'common/xFetch2'; +import { Form, Input, notification, Timeline, Icon, Button } from 'antd'; +const { TextArea } = Input; +const FormItem = Form.Item; +import InfoTable from './info_table'; +import { getPermissonBtn } from 'common/utils'; + +class MyForm extends React.Component { + constructor(props) { + super(props); + this.state = { + data: {} + }; + } + + getData = () => { + get(`/api/cloudboot/v1/approvals/${this.props.approval_id}`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + this.setState({ data: res.content || {} }); + }); + }; + + componentDidMount() { + this.getData(); + } + + revoke = () => { + del(`/api/cloudboot/v1/approvals/${this.props.approval_id}`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + this.getData(); + this.props.reload(); + // this.props.onCancel(); + }); + }; + + approval = (action, step) => { + this.props.form.validateFields((err, values) => { + const data = { + approval_id: this.props.approval_id, + approval_step_id: values.approval_step_id, + remark: values.remark, + action: action + }; + put(`/api/cloudboot/v1/approvals/${this.props.approval_id}/step/${values.approval_step_id}`, data).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + this.getData(); + this.props.reload(); + // this.props.onCancel(); + }); + }); + }; + + render() { + const { getFieldDecorator } = this.props.form; + + const data = this.state.data; + + let ifFinished = false; + let ifApproval = false; + let ifRevoke = false; + let ifApply = false; + let currentStep = 0; + + let step0 = {}; + let step1 = {}; + + if (data.steps) { + + step0 = data.steps[0]; + + //有实施的步骤 + if (data.steps.length > 1) { + step1 = data.steps[1]; + ifApply = true; + } + + //判断审批的最后一个步骤是否完成 + if (data.steps[data.steps.length - 1 ].end_time) { + ifFinished = true; + } + + //是否可以撤销审批(还未开始审批的单且是本人) + if (!step0.end_time && data.initiator && data.initiator.id === this.props.userInfo.id) { + ifRevoke = true; + } + + //判断当前步骤 + if (!step0.end_time) { + currentStep = 0; + //审批人与登录用户相同则可以审批 + if (step0.approver && step0.approver.id === this.props.userInfo.id) { + ifApproval = true; + } + } + if (data.steps.length > 1 && step0.end_time && !step1.end_time) { + currentStep = 1; + //实施人与登录用户相同则可以审批 + if (step1.approver && step1.approver.id === this.props.userInfo.id) { + ifApproval = true; + } + } + } + + return ( + <div> + <h3 className='detail-title detail-title-drawer'>申请信息</h3> + <div className='detail-info detail-info-24'> + {renderFormDetail([ + { + label: '申请类型', + value: APPROVAL_TYPE[data.type] + }, + { + label: '审批状态', + value: APPROVAL_STATUS[data.status] && APPROVAL_STATUS[data.status] + }, + { + label: '备注', + value: data.remark + } + ], 12)} + <InfoTable type={data.type} data={JSON.parse(data.front_data || '[]')}/> + </div> + <h3 className='detail-title detail-title-drawer'>审批历史</h3> + <div className='detail-info detail-info-24'> + <Timeline> + <Timeline.Item color='blue'> + <p>申请</p> + <p> + <span><Icon type='user' />{data.initiator && data.initiator.name}</span> + <span style={{ marginLeft: 8 }}><Icon type='clock-circle' />{data.start_time}</span> + </p> + </Timeline.Item> + + <Timeline.Item color='blue'> + <p>审批 + {!step0.end_time ? <span className='approval_yellow'>待审批</span> : + <span className='approval_yellow' style={{ color: step0.action === 'agree' ? '#6bc646' : '#ff3700' }}>{APPROVAL_ACTION[step0.action]}</span> + } + </p> + <p> + <span><Icon type='user' />{step0.approver && step0.approver.name}</span> + { + step0.end_time && + <span style={{ marginLeft: 8 }}><Icon type='clock-circle' />{step0.end_time}</span> + } + </p> + <p>{step0.remark}</p> + { + ifApproval && data.status !== 'revoked' && currentStep === 0 && + <Form> + <FormItem > + {getFieldDecorator(`remark`, { + })( + <TextArea rows={4} placeholder='备注'/> + )} + </FormItem> + <FormItem> + {getFieldDecorator(`approval_step_id`, { + initialValue: step0.id + })( + <Input hidden={true}/> + )} + </FormItem> + </Form> + } + </Timeline.Item> + { + ifApply && + <Timeline.Item color='blue'> + <p>实施 + {!step1.end_time ? <span className='approval_yellow'>待实施</span> : + <span className='approval_yellow' style={{ color: step1.action === 'agree' ? '#6bc646' : '#ff3700' }}>{APPROVAL_ACTION[step1.action]}</span> + } + </p> + <p> + <span><Icon type='user' />{step1.approver && step1.approver.name}</span> + { + step1.end_time && + <span style={{ marginLeft: 8 }}><Icon type='clock-circle' />{step1.end_time}</span> + } + </p> + <p>{step1.remark}</p> + { + ifApproval && data.status !== 'revoked' && data.is_rejected !== 'yes' && currentStep === 1 && + <Form> + <FormItem > + {getFieldDecorator(`remark`, { + })( + <TextArea rows={4} placeholder='备注'/> + )} + </FormItem> + <FormItem> + {getFieldDecorator(`approval_step_id`, { + initialValue: step1.id + })( + <Input hidden={true}/> + )} + </FormItem> + </Form> + } + </Timeline.Item> + } + { + ifFinished && <Timeline.Item color='blue'> + <p>{APPROVAL_STATUS[data.status] && APPROVAL_STATUS[data.status]}</p> + </Timeline.Item> + } + { + data.status === 'revoked' && + <Timeline.Item color='red'> + <p>{APPROVAL_STATUS[data.status] && APPROVAL_STATUS[data.status]}</p> + <p><Icon type='clock-circle' />{data.end_time}</p> + </Timeline.Item> + } + </Timeline> + </div> + { + data.status !== 'revoked' && + <div className='drawer-button'> + {ifApproval && data.is_rejected !== 'yes' && <Button + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_approval_agree')} + onClick={() => this.approval('agree', currentStep)} type='primary' style={{ marginRight: 8 }} + >通过</Button>} + {ifApproval && data.is_rejected !== 'yes' && <Button + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_approval_disagree')} + onClick={() => this.approval('reject', currentStep)} style={{ marginRight: 8 }} + >不通过</Button>} + {ifRevoke && <Button + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_approval_revoke')} + onClick={this.revoke} + >撤销</Button>} + </div> + } + </div> + ); + } +} + +export default Form.create()(MyForm); diff --git a/cyclone-web/app/containers/approval/actions/index.js b/cyclone-web/app/containers/approval/actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..0250e318c673a43bc80fbd6c1a1b434a079fd0f9 --- /dev/null +++ b/cyclone-web/app/containers/approval/actions/index.js @@ -0,0 +1,5 @@ +import _detail from './detail'; + +export default { + _detail +}; diff --git a/cyclone-web/app/containers/approval/actions/info_table.jsx b/cyclone-web/app/containers/approval/actions/info_table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..68f979c756ba72c3029b50f1c0e1197cbe8a940e --- /dev/null +++ b/cyclone-web/app/containers/approval/actions/info_table.jsx @@ -0,0 +1,161 @@ +import React from 'react'; +import { + Table, + Tooltip, + Col +} from 'antd'; +import { getCabColumns } from "../apply_pages/pages/columns/getCabColumns"; +import { getIdcColumns } from "../apply_pages/pages/columns/getIdcColumns"; +import { getRoomColumns } from "../apply_pages/pages/columns/getRoomColumns"; +import { getNetworkColumns } from "../apply_pages/pages/columns/getNetworkColumns"; +import { getIpColumns } from "../apply_pages/pages/columns/getIpColumns"; +import { getColumns } from 'containers/device/common/colums'; +import { YES_NO } from 'common/enums'; + + +export default class MyTable extends React.Component { + + getMoveColumns = () => { + return [ + { + title: '固资编号', + dataIndex: 'fixed_asset_number', + render: (text) => <Tooltip placement="top" title={text}>{text}</Tooltip> + }, { + title: '序列号', + dataIndex: 'sn', + render: (text) => <Tooltip placement="top" title={text}>{text}</Tooltip> + }, { + title: '设备型号', + dataIndex: 'model' + }, { + title: '数据中心', + dataIndex: 'idc', + render: (t, record) => { + return <div className='table-noWrap'> + <div>原:{record.old_idc}</div> + <div>目标:{t}</div> + </div>; + } + }, { + title: '机房', + dataIndex: 'server_room_name', + render: (t, record) => { + return <div className='table-noWrap'> + <div>原:{!record.in_store && record.old_server_room}</div> + <div>目标:{t}</div> + </div>; + } + }, { + title: '机架', + dataIndex: 'server_cabinet_number', + render: (t, record) => { + return <div className='table-noWrap'> + <div>原:{!record.in_store && record.old_server_cabinet}</div> + <div>目标:{t}</div> + </div>; + } + }, { + title: '机位', + dataIndex: 'server_usite_number', + render: (t, record) => { + return <div className='table-noWrap'> + <div>原:{!record.in_store && record.old_server_usite}</div> + <div>目标:{t}</div> + </div>; + } + }, + { + title: '虚拟库房', + dataIndex: 'store_room_name', + render: (t, record) => { + return <div className='table-noWrap'> + <div>原:{record.in_store && record.old_server_room}</div> + <div>目标:{t}</div> + </div>; + } + }, { + title: '虚拟货架', + dataIndex: 'virtual_cabinet_number', + render: (t, record) => { + return <div className='table-noWrap'> + <div>原:{record.in_store && record.old_server_cabinet}</div> + <div>目标:{t}</div> + </div>; + } + }]; + }; + getReinstallColumns = () => { + return [ + { + title: '固资编号', + dataIndex: 'fixed_asset_number' + }, { + title: '序列号', + dataIndex: 'sn' + }, { + title: '操作系统', + dataIndex: 'os_template_name' + }, { + title: 'RAID类型', + dataIndex: 'hardware_template_name' + }, { + title: '是否分配外网IP', + dataIndex: 'need_extranet_ip', + render: (text) => <span className={`yes_no_status ${text === 'yes' ? 'yes_status' : 'no_status'}`}>{YES_NO[text]}</span> + }, { + title: '设备型号', + dataIndex: 'model' + }, { + title: '机位编号', + dataIndex: 'server_usite_number' + }]; + }; + + render() { + if (!Array.isArray(this.props.data)) { + return <Col span={24} />; + } + const type = this.props.type; + let title = ''; + let columns = []; + if (type === 'cabinet_power_off' || type === 'cabinet_offline') { + columns = getCabColumns(); + title = '选择的机架'; + } else if (type === 'device_migration') { + columns = this.getMoveColumns(); + title = '物理机搬迁信息'; + } else if (type === 'device_os_reinstallation' || type == 'device_recycle_reinstall') { + columns = this.getReinstallColumns(); + title = '物理机重装信息'; + } else if (type === 'idc_abolish') { + columns = getIdcColumns(); + title = '选择的数据中心'; + } else if (type === 'server_room_abolish') { + columns = getRoomColumns(); + title = '选择的机房'; + } else if (type === 'network_area_offline') { + columns = getNetworkColumns(); + title = '选择的网络区域'; + } else if (type === 'ip_unassign') { + columns = getIpColumns(); + title = '选择的IP'; + } else { + columns = getColumns(null, false); + title = '选择的设备'; + } + return ( + <div> + <Col span={24}> + {title}: + </Col> + <Table + rowKey={'id'} + columns={columns} + pagination={false} + dataSource={this.props.data} + /> + </div> + ); + } +} diff --git a/cyclone-web/app/containers/approval/apply_pages/add-device.jsx b/cyclone-web/app/containers/approval/apply_pages/add-device.jsx new file mode 100644 index 0000000000000000000000000000000000000000..23be7a488cb519705bb5e18c8aecff15579e389a --- /dev/null +++ b/cyclone-web/app/containers/approval/apply_pages/add-device.jsx @@ -0,0 +1,23 @@ +import React from 'react'; +import Popup from 'components/popup'; +import DeviceTable from 'containers/device/common/device'; + +export default function action(options) { + const onSuccess = () => { + Popup.close(); + }; + Popup.open({ + title: '选择设备', + width: 1000, + onCancel: () => { + Popup.close(); + }, + content: ( + <DeviceTable + {...options} + handleSubmit={(tableData) => options.handleDeviceSubmit(tableData, onSuccess)} + /> + ) + }); + +} diff --git a/cyclone-web/app/containers/approval/apply_pages/device_table.jsx b/cyclone-web/app/containers/approval/apply_pages/device_table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..65b31cf2297fcad2752050167fb7d21bc1a15080 --- /dev/null +++ b/cyclone-web/app/containers/approval/apply_pages/device_table.jsx @@ -0,0 +1,61 @@ +import React from 'react'; +import { Table } from 'antd'; +import { getColumns } from 'containers/device/common/colums'; + +export default class DeviceTable extends React.Component { + constructor(props) { + super(props); + this.state = { + dataSource: props.dataSource || [] + }; + } + + componentWillReceiveProps(props) { + if (props.dataSource.length > 0) { + this.setState({ + dataSource: props.dataSource + }); + } + } + + getLocalColumns = () => { + let columns = []; + const baseColumns = getColumns(); + const operateColumns = [ + { + title: '操作', + dataIndex: 'operation', + render: (text, record) => { + return ( + this.state.dataSource.length >= 1 + ? + <a href='javascript:;' onClick={() => this.handleDelete(record.id)} style={{ color: 'rgb(255, 55, 0)' }}>删除</a> + : null + ); + } + } + ]; + columns = [ ...baseColumns, ...operateColumns ]; + return columns; + }; + + handleDelete = (id) => { + const dataSource = [...this.state.dataSource]; + const newDataSource = dataSource.filter(item => item.id !== id); + this.setState({ dataSource: newDataSource }); + this.props.setFormValue(newDataSource); + }; + + + render() { + const { dataSource } = this.state; + return ( + <Table + bordered={true} + dataSource={dataSource} + columns={this.getLocalColumns()} + pagination={false} + /> + ); + } +} diff --git a/cyclone-web/app/containers/approval/apply_pages/move/device_edit.jsx b/cyclone-web/app/containers/approval/apply_pages/move/device_edit.jsx new file mode 100644 index 0000000000000000000000000000000000000000..7944b3ec84abe21fdecd11a9429d749ac1cb1ed3 --- /dev/null +++ b/cyclone-web/app/containers/approval/apply_pages/move/device_edit.jsx @@ -0,0 +1,491 @@ +import React from 'react'; +import { Table, Tooltip, notification, Badge, Alert, Select, Popconfirm } from 'antd'; +import { OPERATION_STATUS_COLOR } from "common/enums"; +import { getWithArgs } from 'common/xFetch2'; + +export default class DeviceTable extends React.Component { + + constructor(props) { + super(props); + this.state = { + dataSource: props.dataSource || [], + cabinet: [], + usite: [], + idcs: [], + rooms: [], + virtualCabinets: [], + dst_server_cabinet: {}, + dst_server_room: {}, + dst_server_usite: {}, + dst_virtual_cabinets: {}, + store_rooms: [] + + }; + } + + componentWillReceiveProps(props) { + if (props.dataSource.length > 0) { + this.setState({ + dataSource: props.dataSource + }); + } + } + + componentDidMount() { + getWithArgs('/api/cloudboot/v1/idcs', { page: 1, page_size: 100 }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + this.setState({ + idcs: res.content.records + }); + }); + + + } + + //清空机房信息 + clearRoom = (record) => { + delete record.dst_server_room_id; + delete record.dst_server_room_name; + this.setState({ + [`${record.sn}-rooms`]: [], + [`${record.sn}-dst_server_room`]: {} + }); + }; + //清空机架信息 + clearCabinet = (record) => { + delete record.dst_cabinet_id; + delete record.dst_cabinet_number; + this.setState({ + [`${record.sn}-cabinet`]: [], + [`${record.sn}-dst_server_cabinet`]: {} + }); + }; + //清空机位信息 + clearUsite = (record) => { + delete record.dst_usite_id; + delete record.dst_usite_number; + this.setState({ + [`${record.sn}-usite`]: [], + [`${record.sn}-dst_server_usite`]: {} + }); + }; + + //选择库房获取虚机货架 + getVirtualCabinets = (v, record, page) => { + record.dst_store_room_id = v.key; + record.dst_store_room_name = v.label; + this.setState({ + [`${record.sn}-dst_store_room`]: { + key: v.key, + label: v.label + } + }); + this.getVirtualCabinetsPage(v, record, page); + }; + getVirtualCabinetsPage = (v, record, page) => { + getWithArgs('/api/cloudboot/v1/virtual-cabinets', { page: page, page_size: 100, store_room_id: v.key }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + this.setState((preState) => { + return { + [`${record.sn}-virtualCabinets`]: [ ...preState.virtualCabinets, ...res.content.records ] + }; + }, () => { + if (res.content.total_pages > page) { + this.getVirtualCabinetsPage(v, record, page + 1); + } + }); + }); + }; + + //选择数据中心获取机房列表 + getRooms = (v, record, page) => { + record.dst_idc_id = v.key; + record.dst_idc_name = v.label; + this.setState({ + [`${record.sn}-dst_idc`]: { + key: v.key, + label: v.label + } + }); + this.clearRoom(record); + this.clearCabinet(record); + this.clearUsite(record); + this.props.setFormValue(this.state.dataSource); + this.getRoomPage(v, record, page); + this.getStoreRoomPage(v, record, page); + + + }; + + getRoomPage = (v, record, page) => { + getWithArgs('/api/cloudboot/v1/server-rooms', { page: page, page_size: 100, idc_id: v.key }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + this.setState((preState) => { + return { + [`${record.sn}-rooms`]: [ ...preState.rooms, ...res.content.records ] + }; + }, () => { + if (res.content.total_pages > page) { + this.getRoomPage(v, record, page + 1); + } + }); + }); + }; + + + getStoreRoomPage = (v, record, page) => { + getWithArgs('/api/cloudboot/v1/store-rooms', { page: page, page_size: 100, idc_id: v.key }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + this.setState((preState) => { + return { + [`${record.sn}-store_rooms`]: [ ...preState.store_rooms, ...res.content.records ] + }; + }, () => { + if (res.content.total_pages > page) { + this.getStoreRoomPage(v, record, page + 1); + } + }); + }); + }; + + + //选择机房获取机架列表 + getCabinet = (v, record, page) => { + record.dst_server_room_id = v.key; + record.dst_server_room_name = v.label; + this.setState({ + [`${record.sn}-dst_server_room`]: { + key: v.key, + label: v.label + } + }); + this.clearCabinet(record); + this.clearUsite(record); + this.props.setFormValue(this.state.dataSource); + this.getCabinetPage(v, record, page); + }; + getCabinetPage = (v, record, page) => { + getWithArgs('/api/cloudboot/v1/server-cabinets', { page: page, page_size: 1000, server_room_id: v.key }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + this.setState((preState) => { + return { + [`${record.sn}-cabinet`]: [ ...preState.cabinet, ...res.content.records ] + }; + }, () => { + if (res.content.total_pages > page) { + this.getCabinetPage(v, record, page + 1); + } + }); + }); + }; + + //选择机架获取机位列表 + getUsite = (v, record, page) => { + record.dst_cabinet_id = v.key; + record.dst_cabinet_number = v.label; + this.setState({ + [`${record.sn}-dst_server_cabinet`]: { + key: v.key, + label: v.label + } + }); + this.clearUsite(record); + this.props.setFormValue(this.state.dataSource); + this.getUsitePage(v, record, page); + }; + getUsitePage = (v, record, page) => { + getWithArgs('/api/cloudboot/v1/server-usites', { page: page, page_size: 100, server_cabinet_id: v.key, status: 'free,pre_occupied' }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + this.setState((preState) => { + return { + [`${record.sn}-usite`]: [ ...preState.usite, ...res.content.records ] + }; + }, () => { + if (res.content.total_pages > page) { + this.getUsitePage(v, record, page + 1); + } + }); + }); + }; + + setUsite = (v, record) => { + record.dst_usite_id = v.key; + record.dst_usite_number = v.label; + this.setState({ + [`${record.sn}-dst_server_usite`]: { + key: v.key, + label: v.label + } + }); + this.props.setFormValue(this.state.dataSource); + }; + + setVirtualCabinets = (v, record) => { + record.dst_virtual_cabinet_id = v.key; + record.dst_virtual_cabinet_number = v.label; + this.setState({ + [`${record.sn}-dst_virtual_cabinets`]: { + key: v.key, + label: v.label + } + }); + this.props.setFormValue(this.state.dataSource); + }; + + + getColums = () => { + return [ + { + title: '固资编号', + dataIndex: 'fixed_asset_number', + render: (text) => <Tooltip placement="top" title={text}>{text}</Tooltip> + }, { + title: '序列号', + dataIndex: 'sn', + render: (text) => <Tooltip placement="top" title={text}>{text}</Tooltip> + }, + { + title: '设备类型', + dataIndex: 'category', + //render: (t) => { + // if (t === 'SpecialDev') { + // return '特殊设备'; + // } + // return t; + //} + }, + { + title: '运营状态', + dataIndex: 'operation_status', + render: type => { + const color = OPERATION_STATUS_COLOR[type] ? OPERATION_STATUS_COLOR[type][0] : 'transparent'; + const word = OPERATION_STATUS_COLOR[type] ? OPERATION_STATUS_COLOR[type][1] : ''; + return ( + <div> + <Badge + dot={true} + style={{ + background: color + }} + />{' '} + &nbsp;&nbsp; {word} + </div> + ); + } + }, + { + title: '原数据中心', + dataIndex: 'idc', + render: (t) => t ? t.name : '' + }, + { + title: '原机房', + dataIndex: 'server_room', + render: (t) => t ? t.name : '' + }, + { + title: '原机架/虚拟货架', + dataIndex: 'server_cabinet', + render: (t) => t ? t.number : '' + }, + { + title: '原机位', + dataIndex: 'server_usite', + render: (t) => t ? t.number : '' + }, + { + title: '目标数据中心', + dataIndex: 'idc', + width: 150, + render: (text, record) => { + return ( + <div> + {/* <div className='move-table-seleted'> {record.dst_idc_name}</div> */} + <Select + style={{ minWidth: 100 }} + size='small' + value={this.state[`${record.sn}-dst_idc`] || { key: record.dst_idc_id, label: record.dst_idc_name }} + showSearch={true} + filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0} + labelInValue={true} + onChange={(value) => this.getRooms(value, record, 1)} + > + { + (this.state.idcs || []).map((os, index) => <Option title={os.name} value={os.id} key={os.id}>{os.name}</Option>) + } + </Select> + </div> + + ); + } + }, { + title: '目标机房', + dataIndex: 'server_room', + width: 150, + required: true, + render: (text, record) => { + return ( + <div> + {/* <div className='move-table-seleted'>{record.dst_server_room_name}</div> */} + <Select + style={{ minWidth: 100 }} + size='small' + value={this.state[`${record.sn}-dst_server_room`] || { key: record.dst_server_room_id, label: record.dst_server_room_name }} + showSearch={true} + filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0} + labelInValue={true} onChange={(value) => this.getCabinet(value, record, 1)} + > + { + (this.state[`${record.sn}-rooms`] || []).map((os, index) => <Option title={os.name} value={os.id} key={os.id}>{os.name}</Option>) + } + </Select> + </div> + ); + } + }, { + title: '目标机架', + dataIndex: 'server_cabinet', + width: 150, + required: true, + render: (text, record) => { + return ( + <div> + {/* <div className='move-table-seleted'>{record.dst_cabinet_number}</div> */} + <Select + style={{ minWidth: 100 }} + size='small' + value={this.state[`${record.sn}-dst_server_cabinet`] || { key: record.dst_cabinet_id, label: record.dst_cabinet_number }} + showSearch={true} + filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0} + labelInValue={true} onChange={(value) => this.getUsite(value, record, 1)} + > + { + (this.state[`${record.sn}-cabinet`] || []).map((os, index) => <Option title={os.number} value={os.id} key={os.id}>{os.number}</Option>) + } + </Select> + </div> + + ); + } + }, { + title: '目标机位', + dataIndex: 'server_usite', + width: 150, + render: (text, record) => { + return ( + <div> + {/* <div className='move-table-seleted'>{record.dst_usite_number}</div> */} + <Select + style={{ minWidth: 100 }} + size='small' + value={this.state[`${record.sn}-dst_server_usite`] || { key: record.dst_usite_id, label: record.dst_usite_number }} + showSearch={true} + filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0} + labelInValue={true} onChange={(value) => this.setUsite(value, record)} + > + { + (this.state[`${record.sn}-usite`] || []).map((os, index) => <Option title={os.number} value={os.id} key={os.id}>{os.number}</Option>) + } + </Select> + </div> + + ); + } + }, { + title: '目标库房', + dataIndex: 'dst_store_room', + width: 150, + render: (text, record) => { + return ( + <div> + {/* <div className='move-table-seleted'>{record.dst_store_room_name}</div> */} + <Select + style={{ minWidth: 100 }} + value={this.state[`${record.sn}-dst_store_room`] || { key: record.dst_store_room_id, label: record.dst_store_room_name }} + size='small' + showSearch={true} + filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0} + labelInValue={true} onChange={(value) => this.getVirtualCabinets(value, record, 1)} + > + { + (this.state[`${record.sn}-store_rooms`] || []).map((os, index) => <Option title={os.name} value={os.id} key={os.id}>{os.name}</Option>) + } + </Select> + </div> + ); + } + }, { + title: '目标虚拟货架', + dataIndex: 'dst_virtual_cabinet', + width: 150, + render: (text, record) => { + return ( + <div> + {/* <div className='move-table-seleted'>{record.dst_virtual_cabinet_number}</div> */} + <Select + style={{ minWidth: 100 }} + size='small' + value={this.state[`${record.sn}-dst_virtual_cabinets`] || { key: record.dst_virtual_cabinet_id, label: record.dst_virtual_cabinet_number }} + showSearch={true} + filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0} + labelInValue={true} onChange={(value) => this.setVirtualCabinets(value, record)} + > + { + (this.state[`${record.sn}-virtualCabinets`] || []).map((os, index) => <Option value={os.id} title={os.number} key={os.id}>{os.number}</Option>) + } + </Select> + </div> + ); + } + }, { + title: '操作', + dataIndex: 'operation', + render: (text, record) => { + return ( + this.state.dataSource.length >= 1 + ? ( + <Popconfirm title='确定删除吗?' onConfirm={() => this.handleDelete(record.id)}> + <a href='javascript:;' style={{ color: 'rgb(255, 55, 0)' }}>删除</a> + </Popconfirm> + ) : null + ); + } + }]; + }; + + handleDelete = (id) => { + const dataSource = [...this.state.dataSource]; + const newDataSource = dataSource.filter(item => item.id !== id); + this.setState({ dataSource: newDataSource }); + this.props.setFormValue(newDataSource); + }; + + render() { + const dataSource = this.state.dataSource; + return ( + <div> + <Alert closable={true} style={{ marginBottom: 8 }} message='机房和库房二选一,搬迁到机房或库房' type='info' showIcon={true} /> + <Table + bordered={true} + dataSource={dataSource} + columns={this.getColums()} + pagination={false} + /> + + </div> + + ); + } +} diff --git a/cyclone-web/app/containers/approval/apply_pages/move/get-component.js b/cyclone-web/app/containers/approval/apply_pages/move/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..e10f2340244db4344f7f976fc3fa4f2ec143b66c --- /dev/null +++ b/cyclone-web/app/containers/approval/apply_pages/move/get-component.js @@ -0,0 +1,21 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading} = options; + return function(nextState, cb) { + doGet() + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/approval/apply_pages/move/import.jsx b/cyclone-web/app/containers/approval/apply_pages/move/import.jsx new file mode 100644 index 0000000000000000000000000000000000000000..50ee5034a05b6df0109943d5118cc97b750d33d3 --- /dev/null +++ b/cyclone-web/app/containers/approval/apply_pages/move/import.jsx @@ -0,0 +1,61 @@ +import React from 'react'; +import Popup from 'components/popup'; +import FileUpload from 'components/upload'; + +export default function action(options) { + const getColumns = () => { + return [ + { + title: '序列号SN', + dataIndex: 'sn' + }, + { + title: '目标IDC名称', + dataIndex: 'dst_idc_name' + }, + { + title: '目标机房管理单元', + dataIndex: 'dst_server_room_name' + }, + { + title: '目标机架编号', + dataIndex: 'dst_cabinet_number' + }, + { + title: '目标机位编号', + dataIndex: 'dst_usite_number' + }, + { + title: '目标库房管理单元', + dataIndex: 'dst_store_room_name' + }, + { + title: '目标虚拟货架编号', + dataIndex: 'dst_virtual_cabinet_number' + } + ]; + }; + + Popup.open({ + title: '导入数据', + width: 1500, + onCancel: () => { + Popup.close(); + }, + content: ( + <FileUpload + // importApi='/api/cloudboot/v1/approvals/devices/migrations/imports' + uploadApi='/api/cloudboot/v1/approvals/devices/migrations/upload' + previewApi='/api/cloudboot/v1/approvals/devices/migrations/imports/previews' + getColumns={getColumns} + onSuccess={(data) => { + Popup.close(); + options.reload(data); + }} + onCancel={() => { + Popup.close(); + }} + /> + ) + }); +} diff --git a/cyclone-web/app/containers/approval/apply_pages/move/index.jsx b/cyclone-web/app/containers/approval/apply_pages/move/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..263b5cae4584a694050f8811b38add5cf8cc9f40 --- /dev/null +++ b/cyclone-web/app/containers/approval/apply_pages/move/index.jsx @@ -0,0 +1,266 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import Layout from 'components/layout/page-layout'; +import { notification, Input, Button, Form, Select } from 'antd'; +import { getBreadcrumb } from 'common/utils'; +import { hashHistory } from 'react-router'; +import { formItemLayout_page, tailFormItemLayout_page } from 'common/enums'; +import addDevice from '../add-device'; +import DeviceTable from './device_edit'; +import { post } from 'common/xFetch2'; +const { TextArea } = Input; +import { getPermissonBtn } from 'common/utils'; +import action from './import'; + +class Container extends React.Component { + + state = { + dataSource: [], + loading: false + }; + + //下载导入模板 + downloadImportTemplate = () => { + window.open('assets/files/device_migration_import.xlsx'); + }; + importData = () => { + action({ + reload: (data) => { + this.setFormValue(data); + } + }); + }; + + + handleSubmit = (e) => { + e.preventDefault(); + this.props.form.validateFields((err, values) => { + let isErr = false; + values.data.forEach(data => { + if (!data.dst_idc_id) { + isErr = true; + return; + } + + if (!data.dst_server_room_id && !data.dst_cabinet_id && !data.dst_usite_id) { + if (!data.dst_store_room_id || !data.dst_virtual_cabinet_id) { + isErr = true; + return; + } + } + + if (!data.dst_store_room_id && !data.dst_virtual_cabinet_id) { + if (!data.dst_server_room_id || !data.dst_cabinet_id || !data.dst_usite_id) { + isErr = true; + return; + } + } + + isErr = false; + }); + + if (err || isErr) { + return notification.error({ message: '还有未填写完整的项' }); + } + + values.approvers = [ values.approvers0, values.approvers1 ]; + delete values.approvers0; + delete values.approvers1; + post('/api/cloudboot/v1/approvals/devices/migrations', values).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + //操作成功置灰保存按钮,防止多次点击提交 + this.setState({ loading: true }); + hashHistory.push('/approval'); + }); + + }); + }; + + + setFormValue = (data) => { + this.setState({ dataSource: data }); + const { setFieldsValue } = this.props.form; + setFieldsValue({ data: data.map(it => { + return { + "sn": it.sn, + "dst_server_room_id": it.dst_server_room_id, + "dst_cabinet_id": it.dst_cabinet_id, + "dst_usite_id": it.dst_usite_id, + "dst_idc_id": it.dst_idc_id, + "dst_store_room_id": it.dst_store_room_id, + "dst_virtual_cabinet_id": it.dst_virtual_cabinet_id + }; + }) }); + console.log(data); + setFieldsValue({ front_data: JSON.stringify(data.map(i => { + return { + fixed_asset_number: i.fixed_asset_number, + sn: i.sn, + model: i.model, + old_idc: i.idc ? i.idc.name : '', + old_server_room: i.server_room ? i.server_room.name : '', + old_server_usite: i.server_usite ? i.server_usite.number : '', + old_server_cabinet: i.server_cabinet ? i.server_cabinet.number : '', + old_store_room: i.store_room ? i.store_room.name : '', + old_virtual_cabinets: i.virtual_cabinets ? i.virtual_cabinets.number : '', + idc: i.dst_idc_name, + server_room_name: i.dst_server_room_name, + server_cabinet_number: i.dst_cabinet_number, + server_usite_number: i.dst_usite_number, + store_room_name: i.dst_store_room_name, + virtual_cabinet_number: i.dst_virtual_cabinet_number, + in_store: i.operation_status == 'in_store' + }; + })) }); + }; + render() { + const { getFieldDecorator } = this.props.form; + return ( + <Layout> + <div style={{ marginTop: -10 }}> + {getBreadcrumb('物理机搬迁')} + </div> + <div> + <div className='operate_btns'> + <Button icon='plus' style={{ marginRight: 8 }} onClick={() => addDevice({ + // getServerRoom: true, + limit: 50, + query: { + operation_status: 'on_shelve,pre_deploy,in_store,pre_move' + }, + handleDeviceSubmit: (tableData, onSuccess) => { + const selectedRows = tableData.selectedRows || []; + this.setFormValue(selectedRows); + onSuccess(); + } + })} type='primary' + > + 添加设备 + </Button> + <Button.Group> + <Button + onClick={() => this.downloadImportTemplate()} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_approval_physical_machine_move_download')} + > + 下载导入模板 + </Button> + <Button + onClick={this.importData} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_approval_physical_machine_move_import')} + > + 导入 + </Button> + </Button.Group> + </div> + <Form> + <Form.Item + label='已选设备' + {...formItemLayout_page} + > + {getFieldDecorator('data', { + rules: [{ + required: true, + message: '请选择设备' + }] + })( + <DeviceTable + dataSource={this.state.dataSource} + setFormValue={this.setFormValue} + form={this.props.form} + /> + )} + </Form.Item> + {/*<Form.Item*/} + {/*label='申请标题'*/} + {/*{...formItemLayout_page}*/} + {/*>*/} + {/*{getFieldDecorator('title', {*/} + {/*})(*/} + {/*<Input style={{ width: 400 }}/>*/} + {/*)}*/} + {/*</Form.Item>*/} + <Form.Item + label='备注' + {...formItemLayout_page} + > + {getFieldDecorator('remark', { + })( + <TextArea rows={4} style={{ width: 400 }}/> + )} + </Form.Item> + <Form.Item > + {getFieldDecorator('front_data', { + })( + <Input hidden={true}/> + )} + </Form.Item> + <Form.Item + label='审批人' + {...formItemLayout_page} + > + {getFieldDecorator('approvers0', { + rules: [{ + required: true, + message: '请选择审批人' + }] + })( + <Select style={{ width: 400 }}> + { + (this.props.userList.data || []).map(it => <Option disabled={it.id === this.props.userInfo.id} value={it.id}>{it.name}</Option>) + } + </Select> + )} + </Form.Item> + <Form.Item + label='实施人' + {...formItemLayout_page} + > + {getFieldDecorator('approvers1', { + rules: [{ + required: true, + message: '请选择实施人' + }] + })( + <Select style={{ width: 400 }}> + { + (this.props.userList.data || []).map(it => <Option value={it.id}>{it.name}</Option>) + } + </Select> + )} + </Form.Item> + </Form> + <Form.Item {...tailFormItemLayout_page}> + <Button + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_approval_physical_machine_move')} + loading={this.state.loading} onClick={this.handleSubmit} type='primary' style={{ marginRight: 8 }} + > + 提交 + </Button> + <Button onClick={() => hashHistory.push('/approval')}> + 取消 + </Button> + </Form.Item> + </div> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + userInfo: state.getIn([ 'global', 'userData' ]).toJS(), + userList: state.getIn([ 'global', 'userList' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + + +export default connect(mapStateToProps, mapDispatchToProps)(Form.create()(Container)); diff --git a/cyclone-web/app/containers/approval/apply_pages/pages/add-data.jsx b/cyclone-web/app/containers/approval/apply_pages/pages/add-data.jsx new file mode 100644 index 0000000000000000000000000000000000000000..d6122acf06365a25f5f6471431ffe317ce41f6bb --- /dev/null +++ b/cyclone-web/app/containers/approval/apply_pages/pages/add-data.jsx @@ -0,0 +1,23 @@ +import React from 'react'; +import Popup from 'components/popup'; +import ModalTable from './modal-table'; + +export default function action(options) { + const onSuccess = () => { + Popup.close(); + }; + Popup.open({ + title: `选择${options.category}`, + width: 1000, + onCancel: () => { + Popup.close(); + }, + content: ( + <ModalTable + {...options} + handleSubmit={(tableData) => options.handleDeviceSubmit(tableData, onSuccess)} + /> + ) + }); + +} diff --git a/cyclone-web/app/containers/approval/apply_pages/pages/columns/getCabColumns.jsx b/cyclone-web/app/containers/approval/apply_pages/pages/columns/getCabColumns.jsx new file mode 100644 index 0000000000000000000000000000000000000000..15128a8d7b344cdf0ce98d1e21cbe3c3885c94af --- /dev/null +++ b/cyclone-web/app/containers/approval/apply_pages/pages/columns/getCabColumns.jsx @@ -0,0 +1,73 @@ +import { CAB_STATUS_COLOR, CAB_TYPE, YES_NO } from "common/enums"; +import { Badge } from 'antd'; + +export const getCabColumns = () => { + return [ + { + title: '数据中心', + dataIndex: 'idc', + render: (text) => <span>{text.name}</span> + }, + { + title: '机房管理单元', + dataIndex: 'server_room', + render: (text) => <span>{text.name}</span> + }, + { + title: '网络区域', + dataIndex: 'network_area', + render: (text, record) => <span>{text.name}</span> + }, + { + title: '机架编号', + dataIndex: 'number' + }, + { + title: '机架状态', + dataIndex: 'status', + width: 100, + render: type => { + const color = CAB_STATUS_COLOR[type] ? CAB_STATUS_COLOR[type][0] : 'transparent'; + const word = CAB_STATUS_COLOR[type] ? CAB_STATUS_COLOR[type][1] : ''; + return ( + <div> + <Badge + dot={true} + style={{ + background: color + }} + />{' '} + &nbsp;&nbsp; {word} + </div> + ); + } + }, + { + title: '类型', + dataIndex: 'type', + render: (text) => <span>{CAB_TYPE[text]}</span> + }, + { + title: '是否启用', + dataIndex: 'is_enabled', + render: (text) => <span className={`yes_no_status ${text === 'yes' ? 'yes_status' : 'no_status'}`}>{YES_NO[text]}</span> + }, + { + title: '是否开电', + dataIndex: 'is_powered', + render: (text) => <span className={`yes_no_status ${text === 'yes' ? 'yes_status' : 'no_status'}`}>{YES_NO[text]}</span> + }, + { + title: '峰值功率/W', + dataIndex: 'max_power' + }, + { + title: '机架高度/U', + dataIndex: 'height' + }, + { + title: '机位总数', + dataIndex: 'usite_count' + } + ]; +}; diff --git a/cyclone-web/app/containers/approval/apply_pages/pages/columns/getIdcColumns.jsx b/cyclone-web/app/containers/approval/apply_pages/pages/columns/getIdcColumns.jsx new file mode 100644 index 0000000000000000000000000000000000000000..23922ac6423f17fb018423e66d83e720742338ea --- /dev/null +++ b/cyclone-web/app/containers/approval/apply_pages/pages/columns/getIdcColumns.jsx @@ -0,0 +1,48 @@ +import { IDC_USAGE, IDC_STATUS_COLOR } from "common/enums"; +import { Badge } from 'antd'; + +export const getIdcColumns = () => { + return [ + { + title: '数据中心', + dataIndex: 'name' + }, + { + title: '用途', + dataIndex: 'usage', + render: (text) => <span>{IDC_USAGE[text]}</span> + }, + { + title: '一级机房', + dataIndex: 'first_server_room', + render: (text) => <span>{(text || []).map(item => item.name).join(',')}</span> + }, + { + title: '供应商', + dataIndex: 'vendor' + }, + { + title: '状态', + dataIndex: 'status', + render: type => { + const color = IDC_STATUS_COLOR[type] ? IDC_STATUS_COLOR[type][0] : 'transparent'; + const word = IDC_STATUS_COLOR[type] ? IDC_STATUS_COLOR[type][1] : ''; + return ( + <div> + <Badge + dot={true} + style={{ + background: color + }} + />{' '} + &nbsp;&nbsp; {word} + </div> + ); + } + }, + { + title: '更新时间', + dataIndex: 'updated_at' + } + ]; +}; diff --git a/cyclone-web/app/containers/approval/apply_pages/pages/columns/getIpColumns.jsx b/cyclone-web/app/containers/approval/apply_pages/pages/columns/getIpColumns.jsx new file mode 100644 index 0000000000000000000000000000000000000000..6966ca11a8382cccc8b2380dc2fb18a0a7ead298 --- /dev/null +++ b/cyclone-web/app/containers/approval/apply_pages/pages/columns/getIpColumns.jsx @@ -0,0 +1,46 @@ +import { NETWORK_IPS_SCOPE, YES_NO } from "common/enums"; + +export const getIpColumns = () => { + return [ + { + title: 'IP地址', + dataIndex: 'ip' + }, + { + title: 'IP类别', + dataIndex: 'ip_network', + render: (text) => { + const scope = text.category.indexOf('intranet') > -1 ? 'intranet' : 'extranet'; + return <span>{NETWORK_IPS_SCOPE[scope]}</span>; + } + }, + { + title: '网段名称', + dataIndex: 'ip_network', + render: (text, record) => <span>{text.cidr}</span> + }, + { + title: '网段网关', + dataIndex: 'gateway', + render: (text, record) => <span>{record.ip_network.gateway}</span> + }, + { + title: '是否被使用', + dataIndex: 'is_used', + render: (text) => <span className={`yes_no_status ${text === 'yes' ? 'yes_status' : 'no_status'}`}>{YES_NO[text]}</span> + }, + { + title: 'IP作用范围', + dataIndex: 'scope', + render: (text) => <span>{NETWORK_IPS_SCOPE[text]}</span> + }, + { + title: '关联设备', + dataIndex: 'sn' + }, + { + title: '更新时间', + dataIndex: 'updated_at' + } + ]; +}; diff --git a/cyclone-web/app/containers/approval/apply_pages/pages/columns/getNetworkColumns.jsx b/cyclone-web/app/containers/approval/apply_pages/pages/columns/getNetworkColumns.jsx new file mode 100644 index 0000000000000000000000000000000000000000..7de9fc94732bd7b8db9ea9b83ae117b46142b474 --- /dev/null +++ b/cyclone-web/app/containers/approval/apply_pages/pages/columns/getNetworkColumns.jsx @@ -0,0 +1,40 @@ +import { NET_STATUS_COLOR } from "common/enums"; +import { Badge } from 'antd'; + +export const getNetworkColumns = () => { + return [ + { + title: '网络区域名称', + dataIndex: 'name' + }, + { + title: '机房管理单元', + dataIndex: 'server_room', + render: (t) => t.name + }, + { + title: '关联物理区域', + dataIndex: 'physical_area', + render: (text) => <span>{(text || []).map(it => it.name).join(',')}</span> + }, + { + title: '状态', + dataIndex: 'status', + render: type => { + const color = NET_STATUS_COLOR[type] ? NET_STATUS_COLOR[type][0] : 'transparent'; + const word = NET_STATUS_COLOR[type] ? NET_STATUS_COLOR[type][1] : ''; + return ( + <div> + <Badge + dot={true} + style={{ + background: color + }} + />{' '} + &nbsp;&nbsp; {word} + </div> + ); + } + } + ]; +}; diff --git a/cyclone-web/app/containers/approval/apply_pages/pages/columns/getRoomColumns.jsx b/cyclone-web/app/containers/approval/apply_pages/pages/columns/getRoomColumns.jsx new file mode 100644 index 0000000000000000000000000000000000000000..b7a02bd6cccdc4ff55ddee41d7bf30edf361d60d --- /dev/null +++ b/cyclone-web/app/containers/approval/apply_pages/pages/columns/getRoomColumns.jsx @@ -0,0 +1,69 @@ +import { IDC_STATUS_COLOR } from "common/enums"; +import { Badge } from 'antd'; + +export const getRoomColumns = () => { + return [ + { + title: '机房管理单元', + dataIndex: 'name' + }, + { + title: '数据中心', + dataIndex: 'idc', + render: (text, record) => <span>{text.name}</span> + }, + { + title: '所属一级机房', + dataIndex: 'first_server_room', + render: (text, record) => <span>{text.name}</span> + }, + { + title: '状态', + dataIndex: 'status', + width: 90, + render: type => { + const color = IDC_STATUS_COLOR[type] ? IDC_STATUS_COLOR[type][0] : 'transparent'; + const word = IDC_STATUS_COLOR[type] ? IDC_STATUS_COLOR[type][1] : ''; + return ( + <div> + <Badge + dot={true} + style={{ + background: color + }} + />{' '} + &nbsp;&nbsp; {word} + </div> + ); + } + }, + { + title: '城市', + dataIndex: 'city' + }, + { + title: '地址', + dataIndex: 'address' + }, + { + title: '机架数', + dataIndex: 'cabinet_count' + }, + { + title: '机房负责人', + dataIndex: 'server_room_manager' + }, + { + title: '供应商负责人', + dataIndex: 'vendor_manager' + }, + { + title: '网络资产负责人', + dataIndex: 'network_asset_manager' + }, + { + title: '7*24小时保障电话', + dataIndex: 'support_phone_number' + } + ]; +}; diff --git a/cyclone-web/app/containers/approval/apply_pages/pages/config.js b/cyclone-web/app/containers/approval/apply_pages/pages/config.js new file mode 100644 index 0000000000000000000000000000000000000000..6b82bcdd7d0ff99d9b30fdc8ea5359950e91ca30 --- /dev/null +++ b/cyclone-web/app/containers/approval/apply_pages/pages/config.js @@ -0,0 +1,124 @@ +import { getIdcColumns } from './columns/getIdcColumns'; +import { getRoomColumns } from './columns/getRoomColumns'; +import { getNetworkColumns } from './columns/getNetworkColumns'; +import { getCabColumns } from './columns/getCabColumns'; +import { getIpColumns } from './columns/getIpColumns'; +import { getColumns } from 'containers/device/common/colums'; + + +export const TYPE = { + cabinet_power_off: { + name: '机架关电', + category: '机架', + tableDataUrl: '/api/cloudboot/v1/server-cabinets', + tableColumn: getCabColumns, + tableQuery: { is_powered: 'yes' }, + searchKey: [{ key: 'idc_id', label: '数据中心', type: 'select', async: 'idc' }, + { key: 'server_room_name', label: '机房' }, + { key: 'number', label: '机架编号' }, + { key: 'network_area_name', label: '网络区域' }], + modalKey: 'ids', + submitUrl: '/api/cloudboot/v1/approvals/server-cabinets/poweroffs' + }, + cabinet_offline: { + name: '机架下线', + category: '机架', + searchKey: [{ key: 'number', label: '机架编号' }, { key: 'idc_id', label: '数据中心', type: 'select', async: 'idc' }, + { key: 'server_room_name', label: '机房' }, + { key: 'network_area_name', label: '网络区域' }], + tableDataUrl: '/api/cloudboot/v1/server-cabinets', + tableColumn: getCabColumns, + tableQuery: { is_powered: 'no' }, + modalKey: 'ids', + submitUrl: '/api/cloudboot/v1/approvals/server-cabinets/offlines' + }, + // device_os_reinstallation: '物理机操作系统重装', + // device_migration: '物理机搬迁', + // device_retirement: '物理机退役(报废)', + // device_recycle_reinstall: '回收重装', + idc_abolish: { + name: '数据中心裁撤', + category: '数据中心', + searchKey: [{ key: 'name', label: '名称' }], + tableDataUrl: '/api/cloudboot/v1/idcs', + tableColumn: getIdcColumns, + tableQuery: { status: 'under_construction,accepted,production' }, + submitUrl: '/api/cloudboot/v1/approvals/idc/abolish', + modalKey: 'ids' + }, + server_room_abolish: { + name: '机房裁撤', + category: '机房', + searchKey: [{ key: 'name', label: '名称' }], + tableDataUrl: '/api/cloudboot/v1/server-rooms', + tableColumn: getRoomColumns, + tableQuery: {}, + submitUrl: '/api/cloudboot/v1/approvals/server-room/abolish', + modalKey: 'ids' + }, + network_area_offline: { + name: '网络区域下线', + category: '网络区域', + searchKey: [{ key: 'name', label: '名称' }], + tableDataUrl: '/api/cloudboot/v1/network-areas', + tableColumn: getNetworkColumns, + tableQuery: {}, + submitUrl: '/api/cloudboot/v1/approvals/network-area/offline', + modalKey: 'ids' + }, + ip_unassign: { + name: 'IP回收', + category: 'IP', + searchKey: [{ key: 'ip', label: 'IP' }, { key: 'fixed_asset_number', label: '固资编号' }], + tableDataUrl: '/api/cloudboot/v1/ips', + tableColumn: getIpColumns, + tableQuery: { category: 'business', is_used: 'disabled,yes' }, + submitUrl: '/api/cloudboot/v1/approvals/ip/unassign', + modalKey: 'ids' + }, + device_power_off: { + name: '物理机关电', + category: '物理机', + searchKey: [{ key: 'sn', label: '序列号' }, { key: 'fixed_asset_number', label: '固资编号' }, { key: 'intranet_ip', label: '内网IP' }], + tableDataUrl: '/api/cloudboot/v1/devices', + tableColumn: getColumns, + tableQuery: {}, + submitUrl: '/api/cloudboot/v1/approvals/device/poweroff', + modalKey: 'sns' + }, + device_restart: { + name: '物理机重启', + category: '物理机', + searchKey: [{ key: 'sn', label: '序列号' }, { key: 'fixed_asset_number', label: '固资编号' }, { key: 'intranet_ip', label: '内网IP' }], + tableDataUrl: '/api/cloudboot/v1/devices', + tableColumn: getColumns, + tableQuery: {}, + submitUrl: '/api/cloudboot/v1/approvals/device/restart', + modalKey: 'sns' + }, + device_recycle_pre_retire: { + name: '回收待退役', + category: '物理机', + limit: 50, + searchKey: [{ key: 'sn', label: '序列号' }, { key: 'fixed_asset_number', label: '固资编号' }, { key: 'intranet_ip', label: '内网IP' }], + tableDataUrl: '/api/cloudboot/v1/devices', + tableColumn: getColumns, + tableQuery: { operation_status: 'recycling' }, + submitUrl: '/api/cloudboot/v1/approvals/devices/recycle', + submitData: { approval_type: 'device_recycle_pre_retire' }, + modalKey: 'sns' + }, + device_recycle_pre_move: { + name: '回收待搬迁', + category: '物理机', + limit: 50, + searchKey: [{ key: 'sn', label: '序列号' }, { key: 'fixed_asset_number', label: '固资编号' }, { key: 'intranet_ip', label: '内网IP' }], + tableDataUrl: '/api/cloudboot/v1/devices', + tableColumn: getColumns, + tableQuery: { operation_status: 'recycling' }, + submitUrl: '/api/cloudboot/v1/approvals/devices/recycle', + submitData: { approval_type: 'device_recycle_pre_move' }, + modalKey: 'sns' + } +}; + diff --git a/cyclone-web/app/containers/approval/apply_pages/pages/form_table.jsx b/cyclone-web/app/containers/approval/apply_pages/pages/form_table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..0d27c654d1a83d0a274612e7cc139919c220dade --- /dev/null +++ b/cyclone-web/app/containers/approval/apply_pages/pages/form_table.jsx @@ -0,0 +1,59 @@ +import React from 'react'; +import { Table } from 'antd'; + +export default class DeviceTable extends React.Component { + constructor(props) { + super(props); + this.state = { + dataSource: props.dataSource || [] + }; + } + + componentWillReceiveProps(props) { + if (props.dataSource.length > 0) { + this.setState({ + dataSource: props.dataSource + }); + } + } + + handleDelete = (id) => { + const dataSource = [...this.state.dataSource]; + const newDataSource = dataSource.filter(item => item.id !== id); + this.setState({ dataSource: newDataSource }); + this.props.setFormValue(newDataSource); + }; + + getLocalColumns = () => { + let columns = []; + const baseColumns = this.props.tableColumn(); + const operateColumns = [ + { + title: '操作', + dataIndex: 'operation', + render: (text, record) => { + return ( + this.state.dataSource.length >= 1 + ? + <a href='javascript:;' onClick={() => this.handleDelete(record.id)} style={{ color: 'rgb(255, 55, 0)' }}>删除</a> + : null + ); + } + } + ]; + columns = [ ...baseColumns, ...operateColumns ]; + return columns; + }; + + render() { + const { dataSource } = this.state; + return ( + <Table + bordered={true} + dataSource={dataSource} + columns={this.getLocalColumns()} + pagination={false} + /> + ); + } +} diff --git a/cyclone-web/app/containers/approval/apply_pages/pages/get-component.js b/cyclone-web/app/containers/approval/apply_pages/pages/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..e10f2340244db4344f7f976fc3fa4f2ec143b66c --- /dev/null +++ b/cyclone-web/app/containers/approval/apply_pages/pages/get-component.js @@ -0,0 +1,21 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading} = options; + return function(nextState, cb) { + doGet() + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/approval/apply_pages/pages/index.jsx b/cyclone-web/app/containers/approval/apply_pages/pages/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..03d8ea98ecb24ffefc058406bd5d6eecbc76177c --- /dev/null +++ b/cyclone-web/app/containers/approval/apply_pages/pages/index.jsx @@ -0,0 +1,191 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import Layout from 'components/layout/page-layout'; +import { Input, notification, Button, Form, Select } from 'antd'; +import { getBreadcrumb } from 'common/utils'; +import { hashHistory } from 'react-router'; +import { formItemLayout_page, tailFormItemLayout_page } from 'common/enums'; +import addData from './add-data'; +import FormTable from './form_table'; +import { post } from 'common/xFetch2'; +const { TextArea } = Input; +// import { getPermissonBtn } from 'common/utils'; +import { TYPE } from './config'; + +class Container extends React.Component { + + state = { + dataSource: [], + loading: false, + name: TYPE[this.props.params.type].name, + category: TYPE[this.props.params.type].category, + tableDataUrl: TYPE[this.props.params.type].tableDataUrl, + tableColumn: TYPE[this.props.params.type].tableColumn, + tableQuery: TYPE[this.props.params.type].tableQuery, + submitUrl: TYPE[this.props.params.type].submitUrl, + searchKey: TYPE[this.props.params.type].searchKey, + submitData: TYPE[this.props.params.type].submitData, + limit: TYPE[this.props.params.type].limit, + modalKey: TYPE[this.props.params.type].modalKey + }; + + handleSubmit = (e) => { + e.preventDefault(); + this.props.form.validateFields((err, values) => { + if (err) { + notification.error({ message: '还有未填写完整的项' }); + return; + } + values.approvers = [values.approvers]; + if (this.state.submitData) { + values = { ...this.state.submitData, ...values }; + } + post(this.state.submitUrl, values).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + //操作成功置灰保存按钮,防止多次点击提交 + this.setState({ loading: true }); + hashHistory.push('/approval'); + }); + }); + }; + + setFormValue = (data) => { + this.setState({ dataSource: data }); + const { setFieldsValue } = this.props.form; + if (this.state.modalKey == 'sns') { + setFieldsValue({ sns: data.map(it => it.sn) }); + } else if (this.state.modalKey == 'ids') { + setFieldsValue({ ids: data.map(it => it.id) }); + } + setFieldsValue({ front_data: JSON.stringify(data) }); + }; + + addDataSource = () => { + addData({ + tableQuery: this.state.tableQuery, + category: this.state.category, + tableColumn: this.state.tableColumn, + tableDataUrl: this.state.tableDataUrl, + searchKey: this.state.searchKey, + idc: this.props.idc, + room: this.props.room, + networkArea: this.props.networkArea, + limit: this.state.limit || 10, + handleDeviceSubmit: (tableData, onSuccess) => { + const selectedRows = tableData.selectedRows || []; + this.setFormValue(selectedRows); + onSuccess(); + } + }); + }; + render() { + const { getFieldDecorator } = this.props.form; + + return ( + <Layout> + <div style={{ marginTop: -10 }}> + {getBreadcrumb(this.state.name)} + </div> + <div> + <div className='operate_btns'> + <Button icon='plus' onClick={this.addDataSource} type='primary'> + 添加{this.state.category} + </Button> + </div> + <Form> + <Form.Item + label={`已选${this.state.category}`} + {...formItemLayout_page} + > + {getFieldDecorator(`${this.state.modalKey}`, { + rules: [{ + required: true, + message: `请选择${this.state.category}` + }] + })( + <FormTable + tableColumn={this.state.tableColumn} + dataSource={this.state.dataSource} + setFormValue={this.setFormValue} + form={this.props.form} + /> + )} + </Form.Item> + {/*<Form.Item*/} + {/*label='申请标题'*/} + {/*{...formItemLayout_page}*/} + {/*>*/} + {/*{getFieldDecorator('title', {*/} + {/*})(*/} + {/*<Input style={{ width: 400 }}/>*/} + {/*)}*/} + {/*</Form.Item>*/} + <Form.Item + label='备注' + {...formItemLayout_page} + > + {getFieldDecorator('remark', { + })( + <TextArea rows={4} style={{ width: 400 }}/> + )} + {getFieldDecorator('front_data', { + })( + <Input hidden={true}/> + )} + </Form.Item> + + <Form.Item + label='审批人' + {...formItemLayout_page} + > + {getFieldDecorator('approvers', { + rules: [{ + required: true, + message: '请选择审批人' + }] + })( + <Select style={{ width: 400 }}> + { + (this.props.userList.data || []).map(it => <Option disabled={it.id === this.props.userInfo.id} value={it.id}>{it.name}</Option>) + } + </Select> + )} + </Form.Item> + </Form> + <Form.Item {...tailFormItemLayout_page}> + <Button + loading={this.state.loading} onClick={this.handleSubmit} type='primary' style={{ marginRight: 8 }} + > + 提交 + </Button> + <Button onClick={() => hashHistory.push('/approval')}> + 取消 + </Button> + </Form.Item> + </div> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + userInfo: state.getIn([ 'global', 'userData' ]).toJS(), + userList: state.getIn([ 'global', 'userList' ]).toJS(), + idc: state.getIn([ 'global', 'idc' ]).toJS(), + room: state.getIn([ 'global', 'room' ]).toJS(), + networkArea: state.getIn([ 'global', 'networkArea' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + + +export default connect(mapStateToProps, mapDispatchToProps)(Form.create()(Container)); diff --git a/cyclone-web/app/containers/approval/apply_pages/pages/modal-table/async-actions/index.js b/cyclone-web/app/containers/approval/apply_pages/pages/modal-table/async-actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..dd17f9256beb26bf39187a738b16f1d2ec4e92e6 --- /dev/null +++ b/cyclone-web/app/containers/approval/apply_pages/pages/modal-table/async-actions/index.js @@ -0,0 +1,11 @@ +import { post, get, getWithArgs } from 'common/xFetch2'; + +import { createTableAsyncAction } from 'utils/table-async-action'; + +export default { + ...createTableAsyncAction({ + actionNamePrefix: 'approval-page/table-data', + tableDataPath: ['tableData'] + // datasource: '/api/cloudboot/v1/idcs' + }) +}; diff --git a/cyclone-web/app/containers/approval/apply_pages/pages/modal-table/index.jsx b/cyclone-web/app/containers/approval/apply_pages/pages/modal-table/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..8d0340c1abf91c829f2ec1a1ba601fcb83de24c2 --- /dev/null +++ b/cyclone-web/app/containers/approval/apply_pages/pages/modal-table/index.jsx @@ -0,0 +1,240 @@ +import React from 'react'; +import { + Alert, + Table, + Pagination, + Button, + Input, + Select, + notification +} from 'antd'; +import { createTableStore } from 'utils/table-reducer'; +import handleAction from './sync-actions/index'; +import asyncActions from './async-actions/index'; +import M from 'immutable'; +const { Option } = Select; + + +export default class MyTable extends React.Component { + componentDidMount() { + this.dispatch({ + type: 'approval-page/table-data/search', + payload: this.props.tableQuery + }); + } + + constructor(props) { + super(props); + this.state = { + data: M.fromJS({ + tableData: createTableStore() + }) + }; + } + getState = () => { + return this.state.data; + }; + + dispatch = action => { + if (asyncActions[action.type]) { + asyncActions[action.type]( + this.state.data, + action, + this.dispatch, + this.getState, + this.props.tableDataUrl + ); + return; + } + + const data = handleAction(this.state.data, action); + this.setState({ + data + }); + }; + render() { + return ( + <div className='host'> + <div className='panel'> + <div className='panel-body'>{this.renderBody()}</div> + { + !this.props.hideButton && + <div className=' panel-footer'> + <Button type='primary' onClick={this.handleSubmit}> + 确定 + </Button> + </div> + } + + </div> + </div> + ); + } + + + onSearch = (value, tableQuery, key) => { + if (this.props.query) { + return this.dispatch({ + type: 'approval-page/table-data/search', + payload: { + ...tableQuery, + [key]: value, + ...this.props.query + } + }); + } + this.dispatch({ + type: 'approval-page/table-data/search', + payload: { + ...tableQuery, + [key]: value + } + }); + }; + + + renderBody() { + const tableData = this.state.data.get('tableData').toJS(); + const tableQuery = tableData.query; + const { list, pagination, loading, selectedRowKeys, selectedRows } = tableData; + const rowSelection = { + type: this.props.checkType, + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.dispatch({ + type: 'approval-page/table-data/set/selectedRows', + payload: { + selectedRowKeys, + selectedRows + } + }); + if (this.props.form) { + const { setFieldsValue } = this.props.form; + setFieldsValue({ ids: selectedRowKeys }); + } + } + }; + + return ( + <div className='node-body'> + <div> + <Alert + message={this.props.checkType === 'radio' ? `选择的${this.props.category}: ${selectedRows[0] ? selectedRows[0][this.props.searchKey] : ''}` : `已选择: ${selectedRowKeys.length} 项`} + type='info' + showIcon={true} + style={{ + marginBottom: 8, + overflow: 'hidden', + wordBreak: 'break-all' + }} + /> + </div> + <div + className='search-form' + style={{ textAlign: 'right', marginBottom: 8 }} + > + { + this.props.searchKey.map((item, index) => { + if (item.type === 'select') { + return <span style={{ marginRight: index === this.props.searchKey.length - 1 ? 0 : 8 }}> + <Select + mode='multiple' + style={{ width: 200 }} + placeholder={item.label} + onChange={value => { + this.onSearch(value, tableQuery, item.key); + }} + > + { + item.async ? (this.props[item.async].data || []).map(it => <Option value={it.value} key={it.value}>{it.label}</Option>) : + item.children.map(it => <Option value={it.value} key={it.value}>{it.label}</Option> + ) + } + </Select> + </span>; + } + return <span style={{ marginRight: index === this.props.searchKey.length - 1 ? 0 : 8 }}> + <Input.Search + placeholder={item.label} + style={{ width: 200 }} + onChange={e => { + this.onSearch(e.target.value, tableQuery, item.key); + }} + /> + </span>; + }) + } + {/*<span>*/} + {/*<Input.Search*/} + {/*placeholder={`搜索${this.props.category}...`}*/} + {/*style={{ width: 200 }}*/} + {/*onChange={ev => {*/} + {/*if (this.props.query) {*/} + {/*return this.dispatch({*/} + {/*type: 'approval-page/table-data/search',*/} + {/*payload: {*/} + {/*[this.props.searchKey]: ev.target.value,*/} + {/*...this.props.query*/} + {/*}*/} + {/*});*/} + {/*}*/} + {/*this.dispatch({*/} + {/*type: 'approval-page/table-data/search',*/} + {/*payload: {*/} + {/*[this.props.searchKey]: ev.target.value*/} + {/*}*/} + {/*});*/} + {/*}}*/} + {/*/>*/} + {/*</span>*/} + </div> + + <Table + rowKey={'id'} + rowSelection={rowSelection} + columns={this.props.tableColumn()} + pagination={false} + dataSource={list} + loading={loading} + /> + <Pagination + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + showTotal={(total) => `共 ${total} 条`} + onShowSizeChange={(page, pageSize) => { + this.dispatch({ + type: 'approval-page/table-data/change-page-size', + payload: { + page, + pageSize + } + }); + }} + onChange={page => { + this.dispatch({ + type: 'approval-page/table-data/change-page', + payload: { + page + } + }); + }} + /> + </div> + ); + } + + handleSubmit = ev => { + const tableData = this.state.data.get('tableData').toJS(); + const { selectedRows } = tableData; + if (selectedRows.length < 1) { + return notification.error({ message: `请选择${this.props.category}` }); + } + let limit = this.props.limit || Infinity; + if (selectedRows.length > limit) { + return notification.error({ message: `选择的${this.props.category}数不能超过${limit}` }); + } + this.props.handleSubmit(tableData); + }; +} diff --git a/cyclone-web/app/containers/approval/apply_pages/pages/modal-table/sync-actions/index.js b/cyclone-web/app/containers/approval/apply_pages/pages/modal-table/sync-actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..02ce9801c8db337adce4da09cb52c074f78b380b --- /dev/null +++ b/cyclone-web/app/containers/approval/apply_pages/pages/modal-table/sync-actions/index.js @@ -0,0 +1,23 @@ +import { createTableReducer } from 'utils/table-reducer'; + +const reducers = { + ...createTableReducer('approval-page/table-data', ['tableData']) +}; + +const handleAction = (state, action) => { + + // action is an array + if (action instanceof Array) { + return action.reduce((state, action) => { + return handleAction(state, action); + }, state); + } + + const type = action.type; + if (!reducers[type]) { + return state; + } + return reducers[type](state, action); +}; + +export default handleAction; diff --git a/cyclone-web/app/containers/approval/apply_pages/reInstall/device_edit.jsx b/cyclone-web/app/containers/approval/apply_pages/reInstall/device_edit.jsx new file mode 100644 index 0000000000000000000000000000000000000000..2e3dd84fdf488677e2f022e7fe704da9dc2c9333 --- /dev/null +++ b/cyclone-web/app/containers/approval/apply_pages/reInstall/device_edit.jsx @@ -0,0 +1,399 @@ +import React from 'react'; +import { Table, Input, Button, Popconfirm, Form, Modal } from 'antd'; +const FormItem = Form.Item; +import actions from 'containers/device/entry/actions'; +const EditableContext = React.createContext(); +import { notification, Switch } from 'antd'; +import { post } from 'common/xFetch2'; +const confirm = Modal.confirm; +import { hashHistory } from 'react-router'; +import { YES_NO } from "common/enums"; +//废弃 +const EditableRow = ({ form, index, ...props }) => ( + <EditableContext.Provider value={form}> + <tr {...props} /> + </EditableContext.Provider> +); + +const EditableFormRow = Form.create()(EditableRow); + +class EditableCell extends React.Component { + state = { + editing: false + }; + + componentDidMount() { + if (this.props.editable) { + document.addEventListener('click', this.handleClickOutside, true); + } + } + + componentWillUnmount() { + if (this.props.editable) { + document.removeEventListener('click', this.handleClickOutside, true); + } + } + + toggleEdit = () => { + const editing = !this.state.editing; + this.setState({ editing: true }, () => { + if (editing && this.input) { + this.input.focus(); + } + }); + }; + + handleClickOutside = (e) => { + const { editing } = this.state; + if (editing && this.cell !== e.target && !this.cell.contains(e.target)) { + this.save(); + } + }; + + save = () => { + const { record, handleSave } = this.props; + this.form.validateFields((error, values) => { + if (error) { + return; + } + this.toggleEdit(); + handleSave({ ...record, ...values }); + }); + }; + + + render() { + const { editing } = this.state; + const { + editable, + dataIndex, + title, + record, + required, + placeholder, + ...restProps + } = this.props; + return ( + <td ref={node => (this.cell = node)} {...restProps}> + {editable ? ( + <EditableContext.Consumer> + {(form) => { + this.form = form; + return ( + editing ? ( + <FormItem style={{ margin: 0 }}> + {form.getFieldDecorator(dataIndex, { + rules: [{ + required: required, + message: `${title} 不能为空` + }], + initialValue: record[dataIndex] + })( + <Input + placeholder={placeholder} + ref={node => (this.input = node)} + onPressEnter={this.save} + /> + )} + </FormItem> + ) : ( + <div + className='editable-cell-value-wrap' + style={{ paddingRight: 24 }} + onClick={this.toggleEdit} + > + {restProps.children} + </div> + ) + ); + }} + </EditableContext.Consumer> + ) : restProps.children} + </td> + ); + } +} + +export default class EditableTable extends React.Component { + constructor(props) { + super(props); + this.columns = [ + { + title: '固资编号', + dataIndex: 'fixed_asset_number' + }, { + title: '序列号', + dataIndex: 'sn' + }, { + title: '操作系统', + dataIndex: 'os_template_name', + required: true, + render: (text, record) => { + if (text) { + return ( + <div style={{ position: 'relative' }}> + <span className='hover-edit' onClick={() => this.execAction('addSystem', record)}>{text}</span> + </div> + ); + } + return ( + <Button icon='plus' onClick={() => this.execAction('addSystem', record)}>添加操作系统</Button> + ); + } + }, { + title: 'RAID类型', + dataIndex: 'hardware_template_name', + required: true, + render: (text, record) => { + if (text) { + return <span className='hover-edit' onClick={() => this.execAction('addHardware', record)}>{text}</span>; + } + return ( + <Button icon='plus' onClick={() => this.execAction('addHardware', record)}>添加RAID类型</Button> + ); + } + }, { + title: '是否分配外网IPv4', + dataIndex: 'need_extranet_ip', + editable: false, + required: true, + type: 'select', + render: (text, record) => { + return <Switch checkedChildren='是' unCheckedChildren='否' checked={text === 'yes'} onChange={(value) => this.onCheckChange(value, record)}/>; + } + }, { + title: '是否分配内网IPv6', + dataIndex: 'need_intranet_ipv6', + editable: false, + required: true, + type: 'select', + render: (text, record) => { + return <Switch checkedChildren='是' unCheckedChildren='否' checked={text === 'yes'} onChange={(value) => this.onCheckChange(value, record)}/>; + } + }, { + title: '是否分配外网IPv6', + dataIndex: 'need_extranet_ipv6', + editable: false, + required: true, + type: 'select', + render: (text, record) => { + return <Switch checkedChildren='是' unCheckedChildren='否' checked={text === 'yes'} onChange={(value) => this.onCheckChange(value, record)}/>; + } + }, { + title: '设备型号', + dataIndex: 'model' + }, { + title: '机位编号', + dataIndex: 'server_usite', + render: (text) => <span>{text.number}</span> + }, { + title: '操作', + dataIndex: 'operation', + render: (text, record) => { + return ( + this.state.dataSource.length >= 1 + ? ( + <Popconfirm title='确定删除吗?' onConfirm={() => this.handleDelete(record.sn)}> + <a href='javascript:;' style={{ color: 'rgb(255, 55, 0)' }}>删除</a> + </Popconfirm> + ) : null + ); + } + }]; + this.state = { + dataSource: props.dataSource || [], + selectedRowKeys: [], + selectedRows: [], + loading: false //保存按钮是否激活 + }; + } + + componentWillReceiveProps(props) { + if (props.dataSource.length > 0) { + this.setState({ + dataSource: props.dataSource + }); + } + } + + onCheckChange = (v, record) => { + record.need_extranet_ip = v ? 'yes' : 'no'; + const { dataSource } = this.state; + dataSource.map(data => { + if (data.id === record.id) { + data.need_extranet_ip = v ? 'yes' : 'no'; + } + }); + this.setState({ dataSource }); + this.props.setFormValue(dataSource); + }; + + handleDelete = (sn) => { + const dataSource = [...this.state.dataSource]; + const newDataSource = dataSource.filter(item => item.sn !== sn); + this.setState({ dataSource: newDataSource }); + this.props.setFormValue(newDataSource); + }; + + execAction = (name, record, selectedRows) => { + if (name === 'bunchEdit') { + if (selectedRows.length < 1) { + return notification.error({ message: '请至少选择一台设备' }); + } + //清空数据 + this.dispatch({ + type: 'bunchEdit/data/clear' + }); + } + + if (actions[name]) { + actions[name]({ + record, + selectedRows, + dispatch: this.dispatch, + handleBunchEdit: (onSuccess) => { + const { sysData, hardwareData, ip } = this.props; + const { selectedRows, dataSource } = this.state; + //修改硬件配置 + if (hardwareData.id) { + selectedRows.map(data => { + data.hardware_template_name = hardwareData.name; + }); + } + //修改系统配置 + if (sysData.id) { + selectedRows.map(data => { + data.install_type = sysData.install_type; + data.os_template_name = sysData.name; + }); + } + //修改IP + if (ip) { + selectedRows.map(data => { + data.need_extranet_ip = ip; + }); + } + //修改dataSource + let newDataSource = []; + if (dataSource.length === selectedRows.length) { + newDataSource = selectedRows; + } else { + const copyData = [...dataSource]; + newDataSource = [ ...copyData, ...selectedRows ]; + newDataSource.splice(-1, selectedRows.length); + } + this.setState({ + dataSource: newDataSource, + selectedRowKeys: [], + selectedRows: [] + }); + onSuccess(); + }, + handleHardwareSubmit: (hardwareData, onSuccess) => { + const allDevices = this.state.dataSource; + allDevices.map(data => { + if (data.id === record.id) { + data.hardware_template_name = hardwareData.name; + } + }); + this.setState({ dataSource: allDevices }); + this.props.setFormValue(allDevices); + onSuccess(); + }, + handleSysTemplateSubmit: (sysData, onSuccess) => { + const allDevices = this.state.dataSource; + allDevices.map(data => { + if (data.id === record.id) { + data.install_type = sysData.install_type; + data.os_template_name = sysData.name; + } + }); + this.setState({ dataSource: allDevices }); + this.props.setFormValue(allDevices); + onSuccess(); + } + }); + } + }; + + handleSave = (row) => { + const newData = [...this.state.dataSource]; + const index = newData.findIndex(item => row.sn === item.sn); + const item = newData[index]; + newData.splice(index, 1, { + ...item, + ...row + }); + this.setState({ dataSource: newData }); + this.props.setFormValue(newData); + }; + + reload = () => { + this.setState({ + dataSource: [], + selectedRowKeys: [], + selectedRows: [], + loading: false + }); + }; + + + getRowSelection = () => { + const selectedRowKeys = this.state.selectedRowKeys; + return { + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.setState({ + selectedRowKeys, + selectedRows + }); + } + }; + }; + render() { + const { dataSource, loading } = this.state; + const components = { + body: { + row: EditableFormRow, + cell: EditableCell + } + }; + const columns = this.columns.map((col) => { + if (!col.editable) { + return col; + } + return { + ...col, + onCell: record => ({ + record, + editable: col.editable, + dataIndex: col.dataIndex, + title: col.title, + type: col.type, + placeholder: col.placeholder, + options: col.options, + required: col.required, + addonBefore: col.addonBefore, + handleSave: this.handleSave + }) + }; + }); + return ( + <div> + <Button icon='edit' type='primary' onClick={() => this.execAction('bunchEdit', {}, this.state.selectedRows)} style={{ marginRight: 8 }}> + 批量编辑 + </Button> + <Table + components={components} + rowClassName={() => 'editable-row'} + bordered={true} + dataSource={dataSource} + columns={columns} + pagination={false} + rowSelection={this.getRowSelection()} + /> + </div> + ); + } +} + diff --git a/cyclone-web/app/containers/approval/apply_pages/reInstall/form.jsx b/cyclone-web/app/containers/approval/apply_pages/reInstall/form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..7f10f09699058cf79c84ae028478fac7ec2d6431 --- /dev/null +++ b/cyclone-web/app/containers/approval/apply_pages/reInstall/form.jsx @@ -0,0 +1,161 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import { notification, Input, Button, Form, Select } from 'antd'; +import { hashHistory } from 'react-router'; +import { formItemLayout_page, tailFormItemLayout_page } from 'common/enums'; +import { post } from 'common/xFetch2'; +const { TextArea } = Input; +import { getPermissonBtn } from 'common/utils'; + +class Container extends React.Component { + + state = { + loading: false, + type: this.props.type //type传的是recycle + }; + + handleSubmit = (e) => { + e.preventDefault(); + this.setFormValue(this.props.dataSource); + + this.props.form.validateFields((err, values) => { + + let isErr = false; + values.settings.forEach(data => { + if (!data.os_template_name) { + isErr = true; + return; + } + if (!data.hardware_template_name) { + isErr = true; + return; + } + isErr = false; + }); + + if (err || isErr) { + return notification.error({ message: '还有未填写完整的项' }); + } + + values.approvers = [values.approvers0]; + delete values.approvers0; + let postUrl = '/api/cloudboot/v1/approvals/devices/os-reinstallations'; + if (this.props.type === 'recycle') { + values = { approval_type: 'device_recycle_reinstall', ...values }; + postUrl = '/api/cloudboot/v1/approvals/devices/recycle'; + } + post(postUrl, values).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + //操作成功置灰保存按钮,防止多次点击提交 + this.setState({ loading: true }); + hashHistory.push('/approval'); + }); + }); + }; + + setFormValue = (data) => { + const { setFieldsValue } = this.props.form; + setFieldsValue({ settings: data.map(it => { + return { + "sn": it.sn, + install_type: it.install_type, + hardware_template_name: it.hardware_template_name, + os_template_name: it.os_template_name, + need_extranet_ip: it.need_extranet_ip || 'no', + need_intranet_ipv6: it.need_intranet_ipv6 || 'no', + need_extranet_ipv6: it.need_extranet_ipv6 || 'no' + }; + }) }); + setFieldsValue({ front_data: JSON.stringify(data.map(i => { + return { + fixed_asset_number: i.fixed_asset_number, + sn: i.sn, + hardware_template_name: i.hardware_template_name, + os_template_name: i.os_template_name, + need_extranet_ip: i.need_extranet_ip || 'no', + need_intranet_ipv6: i.need_intranet_ipv6 || 'no', + need_extranet_ipv6: i.need_extranet_ipv6 || 'no', + model: i.model, + server_usite_number: i.server_usite.number + }; + })) }); + }; + + render() { + const { getFieldDecorator } = this.props.form; + + return ( + <div> + <Form> + <Form.Item > + {getFieldDecorator('front_data', { + })( + <Input hidden={true}/> + )} + </Form.Item> + <Form.Item > + {getFieldDecorator('settings', { + })( + <Input hidden={true}/> + )} + </Form.Item> + <Form.Item + label='备注' + {...formItemLayout_page} + > + {getFieldDecorator('remark', { + })( + <TextArea rows={4} style={{ width: 400 }}/> + )} + </Form.Item> + <Form.Item + label='审批人' + {...formItemLayout_page} + > + {getFieldDecorator('approvers0', { + rules: [{ + required: true, + message: '请选择审批人' + }] + })( + <Select style={{ width: 400 }}> + { + (this.props.userList.data || []).map(it => <Option disabled={it.id === this.props.userInfo.id} value={it.id}>{it.name}</Option>) + } + </Select> + )} + </Form.Item> + </Form> + <Form.Item {...tailFormItemLayout_page}> + <Button + loading={this.state.loading} onClick={this.handleSubmit} type='primary' style={{ marginRight: 8 }} + > + 提交 + </Button> + <Button onClick={() => hashHistory.push('/approval')}> + 取消 + </Button> + </Form.Item> + </div> + ); + } +} + +function mapStateToProps(state) { + return { + userInfo: state.getIn([ 'global', 'userData' ]).toJS(), + userList: state.getIn([ 'global', 'userList' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + + +export default connect(mapStateToProps, mapDispatchToProps)(Form.create()(Container)); diff --git a/cyclone-web/app/containers/approval/apply_pages/reInstall/get-component.js b/cyclone-web/app/containers/approval/apply_pages/reInstall/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..07a607c9f57b7b447696dfec5cc21930515cb153 --- /dev/null +++ b/cyclone-web/app/containers/approval/apply_pages/reInstall/get-component.js @@ -0,0 +1,22 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading} = options; + return function(nextState, cb) { + doGet() + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} +//废弃 diff --git a/cyclone-web/app/containers/approval/apply_pages/reInstall/index.jsx b/cyclone-web/app/containers/approval/apply_pages/reInstall/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..d4740d786393056541689beb6f4be383eafee37b --- /dev/null +++ b/cyclone-web/app/containers/approval/apply_pages/reInstall/index.jsx @@ -0,0 +1,205 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import Layout from 'components/layout/page-layout'; +import { notification, Input, Button, Form, Select } from 'antd'; +import { getBreadcrumb } from 'common/utils'; +import { hashHistory } from 'react-router'; +import { formItemLayout_page, tailFormItemLayout_page } from 'common/enums'; +import addDevice from '../add-device'; +import DeviceTable from './device_edit'; +import { post } from 'common/xFetch2'; +const { TextArea } = Input; +import { getPermissonBtn } from 'common/utils'; + +class Container extends React.Component { + + state = { + dataSource: [], + loading: false + }; + + handleSubmit = (e) => { + e.preventDefault(); + this.props.form.validateFields((err, values) => { + + let isErr = false; + values.settings.forEach(data => { + if (!data.os_template_name) { + isErr = true; + return; + } + if (!data.hardware_template_name) { + isErr = true; + return; + } + isErr = false; + }); + + if (err || isErr) { + return notification.error({ message: '还有未填写完整的项' }); + } + + values.approvers = [values.approvers0]; + delete values.approvers0; + post('/api/cloudboot/v1/approvals/devices/os-reinstallations', values).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + //操作成功置灰保存按钮,防止多次点击提交 + this.setState({ loading: true }); + hashHistory.push('/approval'); + }); + }); + }; + + setFormValue = (data) => { + this.setState({ dataSource: data }); + const { setFieldsValue } = this.props.form; + setFieldsValue({ settings: data.map(it => { + return { + "sn": it.sn, + install_type: it.install_type, + hardware_template_name: it.hardware_template_name, + os_template_name: it.os_template_name, + need_extranet_ip: it.need_extranet_ip || 'no' + }; + }) }); + setFieldsValue({ front_data: JSON.stringify(data.map(i => { + return { + fixed_asset_number: i.fixed_asset_number, + sn: i.sn, + hardware_template_name: i.hardware_template_name, + os_template_name: i.os_template_name, + need_extranet_ip: i.need_extranet_ip || 'no', + model: i.model, + server_usite_number: i.server_usite.number + }; + })) }); + }; + + render() { + const { getFieldDecorator } = this.props.form; + + return ( + <Layout> + <div style={{ marginTop: -10 }}> + {getBreadcrumb('物理机重装')} + </div> + <div> + <div className='operate_btns'> + <Button icon='plus' onClick={() => addDevice({ + getServerRoom: true, + query: { + operation_status: 'run_with_alarm,run_without_alarm,on_shelve' + }, + limit: 10, + handleDeviceSubmit: (tableData, onSuccess) => { + const selectedRows = tableData.selectedRows || []; + this.setFormValue(selectedRows); + onSuccess(); + } + })} type='primary' + > + 添加设备 + </Button> + </div> + <Form> + <Form.Item + label='已选设备' + {...formItemLayout_page} + > + {getFieldDecorator('settings', { + rules: [{ + required: true, + message: '请选择设备' + }] + })( + <DeviceTable + dataSource={this.state.dataSource} + setFormValue={this.setFormValue} + form={this.props.form} + ip={this.props.ip} + hardwareData={this.props.hardwareData} + sysData={this.props.sysData} + /> + )} + </Form.Item> + {/*<Form.Item*/} + {/*label='申请标题'*/} + {/*{...formItemLayout_page}*/} + {/*>*/} + {/*{getFieldDecorator('title', {*/} + {/*})(*/} + {/*<Input style={{ width: 400 }}/>*/} + {/*)}*/} + {/*</Form.Item>*/} + <Form.Item + label='备注' + {...formItemLayout_page} + > + {getFieldDecorator('remark', { + })( + <TextArea rows={4} style={{ width: 400 }}/> + )} + </Form.Item> + <Form.Item > + {getFieldDecorator('front_data', { + })( + <Input hidden={true}/> + )} + </Form.Item> + <Form.Item + label='审批人' + {...formItemLayout_page} + > + {getFieldDecorator('approvers0', { + rules: [{ + required: true, + message: '请选择审批人' + }] + })( + <Select style={{ width: 400 }}> + { + (this.props.userList.data || []).map(it => <Option disabled={it.id === this.props.userInfo.id} value={it.id}>{it.name}</Option>) + } + </Select> + )} + </Form.Item> + </Form> + <Form.Item {...tailFormItemLayout_page}> + <Button + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_approval_physical_machine_reInstall')} + loading={this.state.loading} onClick={this.handleSubmit} type='primary' style={{ marginRight: 8 }} + > + 提交 + </Button> + <Button onClick={() => hashHistory.push('/approval')}> + 取消 + </Button> + </Form.Item> + </div> + </Layout> + ); + } +} + +////废弃 +function mapStateToProps(state) { + return { + userInfo: state.getIn([ 'global', 'userData' ]).toJS(), + userList: state.getIn([ 'global', 'userList' ]).toJS(), + hardwareData: state.getIn([ 'device-entry', 'hardwareData' ]).toJS(), + ip: state.getIn([ 'device-entry', 'ip' ]), + sysData: state.getIn([ 'device-entry', 'sysData' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + + +export default connect(mapStateToProps, mapDispatchToProps)(Form.create()(Container)); diff --git a/cyclone-web/app/containers/approval/apply_pages/retirement/get-component.js b/cyclone-web/app/containers/approval/apply_pages/retirement/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..e10f2340244db4344f7f976fc3fa4f2ec143b66c --- /dev/null +++ b/cyclone-web/app/containers/approval/apply_pages/retirement/get-component.js @@ -0,0 +1,21 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading} = options; + return function(nextState, cb) { + doGet() + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/approval/apply_pages/retirement/index.jsx b/cyclone-web/app/containers/approval/apply_pages/retirement/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..667ebd98ff4aad58e94fdcc0326a276546ba257d --- /dev/null +++ b/cyclone-web/app/containers/approval/apply_pages/retirement/index.jsx @@ -0,0 +1,181 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import Layout from 'components/layout/page-layout'; +import { Input, notification, Button, Form, Select } from 'antd'; +import { getBreadcrumb } from 'common/utils'; +import { hashHistory } from 'react-router'; +import { formItemLayout_page, tailFormItemLayout_page } from 'common/enums'; +import addDevice from '../add-device'; +import DeviceTable from '../device_table'; +import { post } from 'common/xFetch2'; +const { TextArea } = Input; +import { getPermissonBtn } from 'common/utils'; + +class Container extends React.Component { + + state = { + dataSource: [], + loading: false + }; + + handleSubmit = (e) => { + e.preventDefault(); + this.props.form.validateFields((err, values) => { + if (err) { + notification.error({ message: '还有未填写完整的项' }); + } + values.approvers = [ values.approvers0, values.approvers1 ]; + delete values.approvers0; + delete values.approvers1; + post('/api/cloudboot/v1/approvals/devices/retirements', values).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + //操作成功置灰保存按钮,防止多次点击提交 + this.setState({ loading: true }); + hashHistory.push('/approval'); + }); + }); + }; + + setFormValue = (data) => { + this.setState({ dataSource: data }); + const { setFieldsValue } = this.props.form; + setFieldsValue({ sns: data.map(it => it.sn) }); + setFieldsValue({ front_data: JSON.stringify(data) }); + }; + render() { + const { getFieldDecorator } = this.props.form; + + return ( + <Layout> + <div style={{ marginTop: -10 }}> + {getBreadcrumb('物理机退役')} + </div> + <div> + <div className='operate_btns'> + <Button icon='plus' onClick={() => addDevice({ + query: { + operation_status: 'pre_retire' + }, + limit: 50, + handleDeviceSubmit: (tableData, onSuccess) => { + const selectedRows = tableData.selectedRows || []; + this.setFormValue(selectedRows); + onSuccess(); + } + })} type='primary' + > + 添加设备 + </Button> + </div> + <Form> + <Form.Item + label='已选设备' + {...formItemLayout_page} + > + {getFieldDecorator('sns', { + rules: [{ + required: true, + message: '请选择设备' + }] + })( + <DeviceTable + dataSource={this.state.dataSource} + setFormValue={this.setFormValue} + form={this.props.form} + /> + )} + </Form.Item> + {/*<Form.Item*/} + {/*label='申请标题'*/} + {/*{...formItemLayout_page}*/} + {/*>*/} + {/*{getFieldDecorator('title', {*/} + {/*})(*/} + {/*<Input style={{ width: 400 }}/>*/} + {/*)}*/} + {/*</Form.Item>*/} + <Form.Item + label='备注' + {...formItemLayout_page} + > + {getFieldDecorator('remark', { + })( + <TextArea rows={4} style={{ width: 400 }}/> + )} + </Form.Item> + <Form.Item > + {getFieldDecorator('front_data', { + })( + <Input hidden={true}/> + )} + </Form.Item> + <Form.Item + label='审批人' + {...formItemLayout_page} + > + {getFieldDecorator('approvers0', { + rules: [{ + required: true, + message: '请选择审批人' + }] + })( + <Select style={{ width: 400 }}> + { + (this.props.userList.data || []).map(it => <Option disabled={it.id === this.props.userInfo.id} value={it.id}>{it.name}</Option>) + } + </Select> + )} + </Form.Item> + <Form.Item + label='实施人' + {...formItemLayout_page} + > + {getFieldDecorator('approvers1', { + rules: [{ + required: true, + message: '请选择实施人' + }] + })( + <Select style={{ width: 400 }}> + { + (this.props.userList.data || []).map(it => <Option value={it.id}>{it.name}</Option>) + } + </Select> + )} + </Form.Item> + </Form> + <Form.Item {...tailFormItemLayout_page}> + <Button + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_approval_physical_machine_retirement')} + loading={this.state.loading} onClick={this.handleSubmit} type='primary' style={{ marginRight: 8 }} + > + 提交 + </Button> + <Button onClick={() => hashHistory.push('/approval')}> + 取消 + </Button> + </Form.Item> + </div> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + userInfo: state.getIn([ 'global', 'userData' ]).toJS(), + userList: state.getIn([ 'global', 'userList' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + + +export default connect(mapStateToProps, mapDispatchToProps)(Form.create()(Container)); diff --git a/cyclone-web/app/containers/approval/components/search-form.jsx b/cyclone-web/app/containers/approval/components/search-form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..9d33475a6c5a8edab6cd17e3a2143ee365193add --- /dev/null +++ b/cyclone-web/app/containers/approval/components/search-form.jsx @@ -0,0 +1,54 @@ +import React from 'react'; +import SearchForm from 'components/search-form'; +import { APPROVAL_STATUS, APPROVAL_TYPE, getSearchList } from 'common/enums'; + +export default class Search extends React.Component { + state = { + pedingSearchKeys: [{ key: 'type', label: '审批类型' }], + searchKeys: [ + { key: 'type', label: '审批类型' }, + { key: 'status', label: '审批状态' } + ], + searchValues: { + 'type': { type: 'radio', list: getSearchList(APPROVAL_TYPE) }, + 'status': { type: 'radio', list: getSearchList(APPROVAL_STATUS) } + } + }; + + onSearch = (values) => { + this.props.dispatch({ + type: `approval/${this.props.type}-table-data/search`, + payload: { + ...values + } + }); + }; + + // getInitialValue = () => { + // const data = this.props.initialValue; + // const list = []; + // if (data && JSON.stringify(data) == '{}') { + // return; + // } + // for (let item in data) { + // list.push({ + // key: item, keyLabel: '', valueLabel: '', value: data[item] + // }); + // } + // return list; + // } + + render() { + let searchKeys = []; + if (this.props.type == 'pending') { + searchKeys = this.state.pedingSearchKeys; + } else { + searchKeys = this.state.searchKeys; + } + return ( + <SearchForm onSearch={this.onSearch} searchKeys={searchKeys} searchValues={this.state.searchValues}/> + ); + } +} + + diff --git a/cyclone-web/app/containers/approval/components/table.jsx b/cyclone-web/app/containers/approval/components/table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..402532b8cf281ce75bfd2cdfd9394f0ca1f5af73 --- /dev/null +++ b/cyclone-web/app/containers/approval/components/table.jsx @@ -0,0 +1,119 @@ +import React from 'react'; +import { + Table, + Pagination, + Badge +} from 'antd'; +import actions from '../actions'; +import { APPROVAL_TYPE, APPROVAL_STATUS_COLOR } from 'common/enums'; + +class MyTable extends React.Component { + + //操作入口 + execAction = (name, record) => { + if (actions[name]) { + actions[name]({ + record, + approval_id: record.id, + userInfo: this.props.userInfo, + reload: () => { + this.props.reload(); + } + }); + } + }; + + changePage = page => { + this.props.dispatch({ + type: `approval/${this.props.type}-table-data/change-page`, + payload: { + page + } + }); + }; + + changePageSize = (page, pageSize) => { + this.props.dispatch({ + type: `approval/${this.props.type}-table-data/change-page-size`, + payload: { + page, + pageSize + } + }); + }; + + + getColumns = () => { + return [ + { + title: '审批标题', + dataIndex: 'title', + render: (text, record) => <a onClick={() => this.execAction('_detail', record)}>{text}</a> + }, + { + title: '审批类型', + dataIndex: 'type', + render: (t) => APPROVAL_TYPE[t] + }, + { + title: '发起时间', + dataIndex: 'start_time' + }, + { + title: '完成时间', + dataIndex: 'end_time' + }, + { + title: '状态', + dataIndex: 'status', + render: (type, record) => { + const color = APPROVAL_STATUS_COLOR[type] ? APPROVAL_STATUS_COLOR[type][0] : 'transparent'; + const word = APPROVAL_STATUS_COLOR[type] ? APPROVAL_STATUS_COLOR[type][1] : ''; + return ( + <div> + <Badge + dot={true} + style={{ + background: color + }} + />{' '} + &nbsp;&nbsp; {word} + {/*{record.is_rejected === 'yes' ? <span style={{ color: '#ff3700' }}>(审批被拒)</span> : ''}*/} + </div> + ); + } + } + ]; + }; + + + render() { + const { tableData } = this.props; + const { loading, pagination } = tableData; + return ( + <div> + <Table + rowKey={'id'} + columns={this.getColumns()} + pagination={false} + dataSource={tableData.list} + loading={loading} + /> + <div> + <Pagination + showQuickJumper={true} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={this.changePageSize} + onChange={this.changePage} + showTotal={(total) => `共 ${total} 条`} + /> + </div> + </div> + ); + } +} + +export default MyTable; diff --git a/cyclone-web/app/containers/approval/get-component.js b/cyclone-web/app/containers/approval/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..dd444e4300d477025585ed0a8e56ff9ba1b92a5a --- /dev/null +++ b/cyclone-web/app/containers/approval/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('approval', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/approval/index.jsx b/cyclone-web/app/containers/approval/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..7a110ccc7776be58820148b07ec6064634b2ced3 --- /dev/null +++ b/cyclone-web/app/containers/approval/index.jsx @@ -0,0 +1,122 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import Layout from 'components/layout/page-layout-tabs'; +import { Tabs, Row, Col } from 'antd'; +const TabPane = Tabs.TabPane; +import { Link } from 'react-router'; +import SearchForm from './components/search-form'; +import Table from './components/table'; +import { getPermissonBtn } from 'common/utils'; + +class Container extends React.Component { + + componentDidMount() { + // this.reload(); + } + + reload = () => { + this.props.dispatch({ + type: 'approval/pending-table-data/get' + }); + this.props.dispatch({ + type: 'approval/approved-table-data/get' + }); + this.props.dispatch({ + type: 'approval/initiated-table-data/get' + }); + }; + + getContent = (data, type) => { + return <div> + <SearchForm type={type} dispatch={this.props.dispatch} initialValue={data.query}/> + <Table + dispatch={this.props.dispatch} + tableData={data} + type={type} + reload={this.reload} + userInfo={this.props.userInfo} + /> + </div>; + }; + renderTab = (key) => { + this.props.dispatch({ + type: `approval/${key}-table-data/get` + }); + }; + + render() { + const { approval_list, pendingTableData, approvedTableData, initiatedTableData } = this.props.data; + return ( + <Layout title='审批管理'> + <Tabs defaultActiveKey='apply' type='card' onTabClick={(key) => this.renderTab(key)}> + <TabPane tab={<span><span className='tab_status tab_status_purple' />发起审批</span>} key='apply'> + <div className='approval_list'> + {approval_list.map(item => { + return ( + <Row gutter={8}> + <h3 className='approval_title'>{item.title}</h3> + { + item.list.map(it => { + if (getPermissonBtn(this.props.userInfo.permissions, it.permissionKey)) { + return <Col span='5'> + <Link to={it.link}> + <div className='home-card approval-card'> + <img src={it.logo} alt='' /> + <span className='card-right text_single'> + {it.name} + </span> + </div> + </Link> + </Col>; + } else { + return <Col span='5' title='无权限'> + <div className='home-card approval-card'> + <img src={it.logo} alt='' /> + <span className='card-right text_single'> + {it.name} + </span> + </div> + </Col>; + } + }) + } + </Row> + ); + })} + </div> + </TabPane> + <TabPane tab={<span><span className='tab_status tab_status_red' />待我审批</span>} key='pending'> + { + this.getContent(pendingTableData, 'pending') + } + </TabPane> + <TabPane tab={<span><span className='tab_status tab_status_green' />我已审批</span>} key='approved'> + { + this.getContent(approvedTableData, 'approved') + } + </TabPane> + <TabPane tab={<span><span className='tab_status tab_status_blue' />我发起的</span>} key='initiated'> + { + this.getContent(initiatedTableData, 'initiated') + } + </TabPane> + </Tabs> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + data: state.get('approval').toJS(), + userInfo: state.getIn([ 'global', 'userData' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/approval/reducers/index.js b/cyclone-web/app/containers/approval/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..ec959ca841c5eec8b033546ca2efd66cb49f139a --- /dev/null +++ b/cyclone-web/app/containers/approval/reducers/index.js @@ -0,0 +1,136 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createRegularReducer } from 'utils/regular-reducer'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; + +const initialState = fromJS({ + loading: true, + pendingTableData: createTableStore(), + approvedTableData: createTableStore(), + initiatedTableData: createTableStore(), + approval_list: [ + { + title: '数据中心', + list: [ + { + name: '数据中心裁撤', + logo: 'assets/icon/reinstall.png', + link: 'approval/pages/idc_abolish', + permissionKey: 'button_approval_idc_abolish' + }, + { + name: '机房裁撤', + logo: 'assets/icon/reinstall.png', + link: 'approval/pages/server_room_abolish', + permissionKey: 'button_approval_server_room_abolish' + + }, + { + name: '机架关电', + logo: 'assets/icon/guandian.png', + link: 'approval/pages/cabinet_power_off', + permissionKey: 'button_approval_cabinet_powerOff' + + }, + { + name: '机架下线', + logo: 'assets/icon/offline.png', + link: 'approval/pages/cabinet_offline', + permissionKey: 'button_approval_cabinet_offline' + + }, + { + name: '网络区域下线', + logo: 'assets/icon/reinstall.png', + link: 'approval/pages/network_area_offline', + permissionKey: 'button_approval_network_area_offline' + + } + ] + }, + { + title: '物理机', + list: [ + { + name: '物理机搬迁', + logo: 'assets/icon/move.png', + link: 'approval/move', + permissionKey: 'button_approval_physical_machine_move' + + }, + { + name: '物理机退役', + logo: 'assets/icon/tuiyi.png', + link: 'approval/retire', + permissionKey: 'button_approval_physical_machine_retirement' + + }, + { + name: '物理机重装', + logo: 'assets/icon/reinstall.png', + link: 'device/entry?from=approval&type=reinstall', + permissionKey: 'button_approval_physical_machine_reInstall' + + }, + { + name: '物理机关电', + logo: 'assets/icon/reinstall.png', + link: 'approval/pages/device_power_off', + permissionKey: 'button_approval_physical_machine_power_off' + + }, + { + name: '物理机重启', + logo: 'assets/icon/reinstall.png', + link: 'approval/pages/device_restart', + permissionKey: 'button_approval_physical_machine_restart' + + }, + { + name: '回收待退役', + logo: 'assets/icon/reinstall.png', + link: 'approval/pages/device_recycle_pre_retire', + permissionKey: 'button_approval_physical_machine_recycle_retire' + + }, + { + name: '回收待搬迁', + logo: 'assets/icon/reinstall.png', + link: 'approval/pages/device_recycle_pre_move', + permissionKey: 'button_approval_physical_machine_recycle_move' + + }, + { + name: '回收重装', + logo: 'assets/icon/reinstall.png', + link: 'device/entry?from=approval&type=recycle', + permissionKey: 'button_approval_physical_machine_recycle_reInstall' + + } + ] + }, + { + title: '网络管理', + list: [ + { + name: 'IP回收', + logo: 'assets/icon/reinstall.png', + link: 'approval/pages/ip_unassign', + permissionKey: 'button_ip_unassign' + + } + ] + } + ] +}); + +const reducer = handleActions( + { + ...createTableReducer('approval/pending-table-data', 'pendingTableData'), + ...createTableReducer('approval/approved-table-data', 'approvedTableData'), + ...createTableReducer('approval/initiated-table-data', 'initiatedTableData') + }, + initialState, +); + +export default reducer; diff --git a/cyclone-web/app/containers/approval/sagas/index.js b/cyclone-web/app/containers/approval/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..80238ba41fa63979e4625137441c1c922dc74105 --- /dev/null +++ b/cyclone-web/app/containers/approval/sagas/index.js @@ -0,0 +1,42 @@ +import { get, getWithArgs } from 'common/xFetch2'; +import { takeEvery } from 'redux-saga'; +import { call, put } from 'redux-saga/effects'; +import { notification } from 'antd'; + +let created = false; +function* empty() { + console.log(); +} + +function* defaultSaga() { + yield; +} + + +import { createTableSaga } from 'utils/table-saga'; + +const pendingTableSaga = createTableSaga({ + actionNamePrefix: 'approval/pending-table-data', + tableDataPath: [ 'approval', 'pendingTableData' ], + datasource: '/api/cloudboot/v1/users/pending/approvals' +}); + +const approvedTableSaga = createTableSaga({ + actionNamePrefix: 'approval/approved-table-data', + tableDataPath: [ 'approval', 'approvedTableData' ], + datasource: '/api/cloudboot/v1/users/approved/approvals' +}); + +const initiatedTableSaga = createTableSaga({ + actionNamePrefix: 'approval/initiated-table-data', + tableDataPath: [ 'approval', 'initiatedTableData' ], + datasource: '/api/cloudboot/v1/users/initiated/approvals' +}); + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [ defaultSaga, pendingTableSaga, approvedTableSaga, initiatedTableSaga ]; +} diff --git a/cyclone-web/app/containers/audit/api/actions/detail.jsx b/cyclone-web/app/containers/audit/api/actions/detail.jsx new file mode 100644 index 0000000000000000000000000000000000000000..4631d995b68d71886f286487acbec7188dd7f492 --- /dev/null +++ b/cyclone-web/app/containers/audit/api/actions/detail.jsx @@ -0,0 +1,17 @@ +import React from 'react'; +import Popup from 'components/popup/draw'; +import Form from './form'; + +export default function action(options) { + + Popup.open({ + title: '操作详情', + onCancel: () => { + Popup.close(); + }, + content: ( + <Form initialValue={options.initialValue}> + </Form> + ) + }); +} diff --git a/cyclone-web/app/containers/audit/api/actions/form.jsx b/cyclone-web/app/containers/audit/api/actions/form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..6270c86f7486dd33fc686fbc328d465d0104b166 --- /dev/null +++ b/cyclone-web/app/containers/audit/api/actions/form.jsx @@ -0,0 +1,77 @@ +import React from 'react'; +import { renderFormDetail } from 'common/utils'; +import JSONPretty from 'react-json-pretty'; +import moment from 'moment'; +import { TIME_FORMAT } from 'common/enums'; + +class MyForm extends React.Component { + constructor(props) { + super(props); + } + + + render() { + const data = this.props.initialValue; + + return ( + <div> + <h3 className='detail-title detail-title-drawer'>基本信息</h3> + <div className='detail-info detail-info-24'> + {renderFormDetail([ + { + label: '接口地址', + value: data.api + }, + { + label: '接口描述', + value: data.description + }, + { + label: '请求方式', + value: data.method + }, + { + label: '操作者', + value: data.operator + }, + { + label: '操作时间', + value: moment(data.created_at).format(TIME_FORMAT) + }, + { + label: '耗时(s)', + value: data.time + } + ], 24)} + </div> + <h3 className='detail-title detail-title-drawer'>请求参数</h3> + <div className='api-result'> + <pre> + { data.req_body && <JSONPretty json={JSON.parse(data.req_body)}></JSONPretty> } + </pre> + </div> + + <h3 className='detail-title detail-title-drawer'>结果详情</h3> + <div className='detail-info detail-info-24'> + {renderFormDetail([ + { + label: '状态', + value: data.status + }, + { + label: '消息', + value: data.msg + } + ], 24)} + </div> + <div className='api-result'> + <pre> + <JSONPretty json={JSON.parse(data.result)}></JSONPretty> + </pre> + </div> + </div> + ); + } +} + +export default MyForm; diff --git a/cyclone-web/app/containers/audit/api/actions/index.js b/cyclone-web/app/containers/audit/api/actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..0250e318c673a43bc80fbd6c1a1b434a079fd0f9 --- /dev/null +++ b/cyclone-web/app/containers/audit/api/actions/index.js @@ -0,0 +1,5 @@ +import _detail from './detail'; + +export default { + _detail +}; diff --git a/cyclone-web/app/containers/audit/api/components/search-form.jsx b/cyclone-web/app/containers/audit/api/components/search-form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..09849556cbee300569c86739083f14797545c8e4 --- /dev/null +++ b/cyclone-web/app/containers/audit/api/components/search-form.jsx @@ -0,0 +1,53 @@ +import React from 'react'; +import SearchForm from 'components/search-form'; +import { API_STATUS, getSearchList } from 'common/enums'; + +export default class Search extends React.Component { + state = { + searchKeys: [ + { key: 'api', label: '接口地址' }, + { key: 'description', label: '接口描述' }, + { key: 'method', label: '请求方法' }, + { key: 'operator', label: '操作者' }, + { key: 'status', label: '执行状态' }, + { key: 'created_at', label: '操作时间' }, + { key: 'time', label: '耗时(s)' } + ], + searchValues: { + 'api': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'description': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'method': { type: 'radio', list: [ 'POST', 'PUT', 'DELETE' ] }, + 'operator': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'status': { type: 'radio', list: getSearchList(API_STATUS) }, + 'created_at': { type: 'rangePicker' }, + 'time': { type: 'section' } + } + }; + + onSearch = (values) => { + if (values.created_at) { + values.create_at_start = values.created_at[0]; + values.create_at_end = values.created_at[1]; + } + if (values.time) { + values.cost1 = values.time[0]; + values.cost2 = values.time[1]; + } + delete values.created_at; + delete values.time; + this.props.dispatch({ + type: 'audit-api/table-data/search', + payload: { + ...values + } + }); + }; + + render() { + return ( + <SearchForm onSearch={this.onSearch} searchKeys={this.state.searchKeys} searchValues={this.state.searchValues}/> + ); + } +} + + diff --git a/cyclone-web/app/containers/audit/api/components/table.jsx b/cyclone-web/app/containers/audit/api/components/table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..ca311d5ac24db22ea6887438f2c1f6e895c9ed32 --- /dev/null +++ b/cyclone-web/app/containers/audit/api/components/table.jsx @@ -0,0 +1,184 @@ +import React from 'react'; +import { + Table, + Tooltip, + Pagination, + Badge +} from 'antd'; +import actions from '../actions'; +import TableControlCell from 'components/TableControlCell'; +import { API_STATUS_COLOR } from 'common/enums'; +import moment from 'moment'; +import { TIME_FORMAT } from 'common/enums'; + +class MyTable extends React.Component { + + reload = () => { + this.props.dispatch({ + type: 'audit-api/table-data/reload' + }); + this.props.dispatch({ + type: 'audit-api/table-data/set/selectedRows', + payload: { + selectedRows: [], + selectedRowKeys: [] + } + }); + }; + + + //操作入口 + execAction = (name, records) => { + if (actions[name]) { + actions[name]({ + records, + initialValue: records, + type: name, + reload: () => { + this.reload(); + } + }); + } + }; + + + getRowSelection = () => { + const selectedRowKeys = this.props.tableData.selectedRowKeys; + return { + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.props.dispatch({ + type: 'audit-api/table-data/set/selectedRows', + payload: { + selectedRowKeys, + selectedRows + } + }); + } + }; + }; + + changePage = page => { + this.props.dispatch({ + type: `audit-api/table-data/change-page`, + payload: { + page + } + }); + }; + + changePageSize = (page, pageSize) => { + this.props.dispatch({ + type: `audit-api/table-data/change-page-size`, + payload: { + page, + pageSize + } + }); + }; + + + getColumns = () => { + return [ + { + title: '接口地址', + dataIndex: 'api', + render: (text) => <Tooltip placement="top" title={text}>{text}</Tooltip> + }, + { + title: '接口描述', + dataIndex: 'description' + }, + { + title: '请求方法', + dataIndex: 'method' + }, + { + title: '操作者', + dataIndex: 'operator' + }, + { + title: '操作时间', + dataIndex: 'created_at', + render: (t) => <span>{moment(t).format(TIME_FORMAT)}</span> + }, + { + title: '耗时(s)', + dataIndex: 'time' + }, + { + title: '执行状态', + dataIndex: 'status', + render: type => { + const color = API_STATUS_COLOR[type] ? API_STATUS_COLOR[type][0] : 'transparent'; + const word = API_STATUS_COLOR[type] ? API_STATUS_COLOR[type][1] : ''; + return ( + <div> + <Badge + dot={true} + style={{ + background: color + }} + />{' '} + &nbsp;&nbsp; {word} + </div> + ); + } + }, + { + title: '操作', + dataIndex: 'operate', + width: 70, + render: (text, record) => { + const commands = [ + { + name: '详情', + command: '_detail' + } + ]; + return ( + <TableControlCell + commands={commands} + record={record} + execCommand={command => { + this.execAction(command, record); + }} + /> + ); + } + } + ]; + }; + + + render() { + const { tableData } = this.props; + const { loading, pagination } = tableData; + return ( + <div> + <Table + rowKey={'id'} + columns={this.getColumns()} + pagination={false} + dataSource={tableData.list} + // rowSelection={this.getRowSelection()} + loading={loading} + /> + <div> + <Pagination + showTotal={(total) => `共 ${total} 条`} + showQuickJumper={true} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={this.changePageSize} + onChange={this.changePage} + /> + </div> + </div> + ); + } +} + +export default MyTable; diff --git a/cyclone-web/app/containers/audit/api/get-component.js b/cyclone-web/app/containers/audit/api/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..452ddc5e78aa81e415e8f07374d2ef461689d408 --- /dev/null +++ b/cyclone-web/app/containers/audit/api/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('audit-api', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/audit/api/index.jsx b/cyclone-web/app/containers/audit/api/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..05fec44f16ba48c590c5e077909416d92b39ec10 --- /dev/null +++ b/cyclone-web/app/containers/audit/api/index.jsx @@ -0,0 +1,48 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import SearchForm from './components/search-form'; +import Table from './components/table'; +import Layout from 'components/layout/page-layout'; + +class Container extends React.Component { + componentDidMount() { + this.props.dispatch({ + type: 'audit-api/table-data/get' + }); + } + + componentWillUnmount() { + this.props.dispatch({ + type: 'audit-api/table-data/reset' + }); + } + + render() { + const { tableData } = this.props.data; + return ( + <Layout title='接口调用记录'> + <SearchForm dispatch={this.props.dispatch} /> + <Table + dispatch={this.props.dispatch} + tableData={tableData} + userInfo={this.props.userInfo} + /> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + data: state.get('audit-api').toJS(), + userInfo: state.getIn([ 'global', 'userData' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/audit/api/reducers/index.js b/cyclone-web/app/containers/audit/api/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..262ba7a082f5cb578a91d2f40448f6c712c18c21 --- /dev/null +++ b/cyclone-web/app/containers/audit/api/reducers/index.js @@ -0,0 +1,16 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; + +const initialState = fromJS({ + tableData: createTableStore() +}); + +const reducer = handleActions( + { + ...createTableReducer('audit-api/table-data', 'tableData') + }, + initialState, +); + +export default reducer; diff --git a/cyclone-web/app/containers/audit/api/sagas/index.js b/cyclone-web/app/containers/audit/api/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..7c550c3890291dbffc34f19d1ea17307aa9a82f6 --- /dev/null +++ b/cyclone-web/app/containers/audit/api/sagas/index.js @@ -0,0 +1,21 @@ + +let created = false; +function* empty() { + console.log(); +} + +import { createTableSaga } from 'utils/table-saga'; + +const jobTableSaga = createTableSaga({ + actionNamePrefix: 'audit-api/table-data', + tableDataPath: [ 'audit-api', 'tableData' ], + datasource: '/api/cloudboot/v1/api/log' +}); + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [jobTableSaga]; +} diff --git a/cyclone-web/app/containers/audit/log/actions/compare.jsx b/cyclone-web/app/containers/audit/log/actions/compare.jsx new file mode 100644 index 0000000000000000000000000000000000000000..612e75d05a8ffb4ad9029ffb0eb31daa076cd904 --- /dev/null +++ b/cyclone-web/app/containers/audit/log/actions/compare.jsx @@ -0,0 +1,59 @@ +import React from 'react'; +import Popup from 'components/popup/draw'; + +export default function action(options) { + + const _old = options.records.source; + const _new = options.records.destination; + let column = []; + + if (_old !== 'null') { + const oldJson = JSON.parse(_old); + Object.keys(oldJson).forEach((key, index) => { + if (!column[index]) { + column[index] = {}; + } + column[index].key = key; + column[index].old_value = oldJson[key]; + }); + } + if (_new !== 'null') { + const newJson = JSON.parse(_new); + Object.keys(newJson).forEach((key, index) => { + if (!column[index]) { + column[index] = {}; + } + column[index].key = key; + column[index].new_value = newJson[key]; + }); + } + + Popup.open({ + title: '对比详情', + onCancel: () => { + Popup.close(); + }, + content: ( + <div className='log_compare_table'> + <table> + <thead> + <tr> + <th>key</th> + <th>原值</th> + <th>现值</th> + </tr> + </thead> + <tbody> + { + column.map(it => <tr className={it.old_value !== it.new_value ? 'diff_tr' : ''}> + <td>{it.key}</td> + <td>{it.old_value}</td> + <td>{it.new_value}</td> + </tr>) + } + </tbody> + </table> + </div> + ) + }); +} diff --git a/cyclone-web/app/containers/audit/log/actions/index.js b/cyclone-web/app/containers/audit/log/actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..82f157be74519db3dc6b136c2e5db53e21cbee42 --- /dev/null +++ b/cyclone-web/app/containers/audit/log/actions/index.js @@ -0,0 +1,5 @@ +import _compare from './compare'; + +export default { + _compare +}; diff --git a/cyclone-web/app/containers/audit/log/components/search-form.jsx b/cyclone-web/app/containers/audit/log/components/search-form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..36538271d03f396018306b5df6ee7f66d374654f --- /dev/null +++ b/cyclone-web/app/containers/audit/log/components/search-form.jsx @@ -0,0 +1,34 @@ +import React from 'react'; +import SearchForm from 'components/search-form'; + +export default class Search extends React.Component { + state = { + searchKeys: [ + { key: 'http_method', label: '请求方式' }, + { key: 'url', label: '路由' }, + { key: 'category_name', label: '操作类型' } + ], + searchValues: { + 'http_method': { type: 'radio', list: [ 'GET', 'PUT', 'POST', 'DELETE' ] }, + 'url': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'category_name': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' } + } + }; + + onSearch = (values) => { + this.props.dispatch({ + type: 'audit-log/table-data/search', + payload: { + ...values + } + }); + }; + + render() { + return ( + <SearchForm onSearch={this.onSearch} searchKeys={this.state.searchKeys} searchValues={this.state.searchValues}/> + ); + } +} + + diff --git a/cyclone-web/app/containers/audit/log/components/table.jsx b/cyclone-web/app/containers/audit/log/components/table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..8e20f1b06d765749a8d9d72b31cbe2252d7bf03c --- /dev/null +++ b/cyclone-web/app/containers/audit/log/components/table.jsx @@ -0,0 +1,158 @@ +import React from 'react'; +import { + Table, + Pagination +} from 'antd'; +import actions from '../actions'; +import TableControlCell from 'components/TableControlCell'; +import moment from 'moment'; +import { TIME_FORMAT } from 'common/enums'; + + +class MyTable extends React.Component { + + reload = () => { + this.props.dispatch({ + type: 'audit-log/table-data/reload' + }); + this.props.dispatch({ + type: 'audit-log/table-data/set/selectedRows', + payload: { + selectedRows: [], + selectedRowKeys: [] + } + }); + }; + + + //操作入口 + execAction = (name, records) => { + if (actions[name]) { + actions[name]({ + records, + initialValue: records, + type: name, + reload: () => { + this.reload(); + } + }); + } + }; + + + getRowSelection = () => { + const selectedRowKeys = this.props.tableData.selectedRowKeys; + return { + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.props.dispatch({ + type: 'audit-log/table-data/set/selectedRows', + payload: { + selectedRowKeys, + selectedRows + } + }); + } + }; + }; + + changePage = page => { + this.props.dispatch({ + type: `audit-log/table-data/change-page`, + payload: { + page + } + }); + }; + + changePageSize = (page, pageSize) => { + this.props.dispatch({ + type: `audit-log/table-data/change-page-size`, + payload: { + page, + pageSize + } + }); + }; + + + getColumns = () => { + return [ + { + title: '操作时间', + dataIndex: 'created_at', + render: (t) => <span>{moment(t).format(TIME_FORMAT)}</span> + }, + { + title: '操作人', + dataIndex: 'operator' + }, + { + title: '操作类型', + dataIndex: 'category_name' + }, + { + title: '路由', + dataIndex: 'url' + }, + { + title: '请求方式', + dataIndex: 'http_method' + }, + { + title: '操作', + dataIndex: 'operate', + width: 70, + render: (text, record) => { + const commands = [ + { + name: '详情', + command: '_compare' + } + ]; + return ( + <TableControlCell + commands={commands} + record={record} + execCommand={command => { + this.execAction(command, record); + }} + /> + ); + } + } + ]; + }; + + + render() { + const { tableData } = this.props; + const { loading, pagination } = tableData; + return ( + <div> + <Table + rowKey={'id'} + columns={this.getColumns()} + pagination={false} + dataSource={tableData.list} + // rowSelection={this.getRowSelection()} + loading={loading} + /> + <div> + <Pagination + showQuickJumper={true} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={this.changePageSize} + onChange={this.changePage} + showTotal={(total) => `共 ${total} 条`} + /> + </div> + </div> + ); + } +} + +export default MyTable; diff --git a/cyclone-web/app/containers/audit/log/get-component.js b/cyclone-web/app/containers/audit/log/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..773e0b663b91d94ce5cdd2336a405b248c4148c6 --- /dev/null +++ b/cyclone-web/app/containers/audit/log/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('audit-log', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/audit/log/index.jsx b/cyclone-web/app/containers/audit/log/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..935f14141d78cf3e74a10d734588c2060b4fe72e --- /dev/null +++ b/cyclone-web/app/containers/audit/log/index.jsx @@ -0,0 +1,48 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import SearchForm from './components/search-form'; +import Table from './components/table'; +import Layout from 'components/layout/page-layout'; + +class Container extends React.Component { + componentDidMount() { + this.props.dispatch({ + type: 'audit-log/table-data/get' + }); + } + + componentWillUnmount() { + this.props.dispatch({ + type: 'audit-log/table-data/reset' + }); + } + + render() { + const { tableData } = this.props.data; + return ( + <Layout title='操作记录'> + <SearchForm dispatch={this.props.dispatch} /> + <Table + dispatch={this.props.dispatch} + tableData={tableData} + userInfo={this.props.userInfo} + /> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + data: state.get('audit-log').toJS(), + userInfo: state.getIn([ 'global', 'userData' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/audit/log/reducers/index.js b/cyclone-web/app/containers/audit/log/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..0f4e40432a653dde4358cc5d9f9d129c6ab934a3 --- /dev/null +++ b/cyclone-web/app/containers/audit/log/reducers/index.js @@ -0,0 +1,16 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; + +const initialState = fromJS({ + tableData: createTableStore() +}); + +const reducer = handleActions( + { + ...createTableReducer('audit-log/table-data', 'tableData') + }, + initialState, +); + +export default reducer; diff --git a/cyclone-web/app/containers/audit/log/sagas/index.js b/cyclone-web/app/containers/audit/log/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..2cd90f4dd19924cfa3044220b3c810b6d51eda70 --- /dev/null +++ b/cyclone-web/app/containers/audit/log/sagas/index.js @@ -0,0 +1,21 @@ + +let created = false; +function* empty() { + console.log(); +} + +import { createTableSaga } from 'utils/table-saga'; + +const jobTableSaga = createTableSaga({ + actionNamePrefix: 'audit-log/table-data', + tableDataPath: [ 'audit-log', 'tableData' ], + datasource: '/api/cloudboot/v1/operate/log' +}); + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [jobTableSaga]; +} diff --git a/cyclone-web/app/containers/common/authenticated/get-component.js b/cyclone-web/app/containers/common/authenticated/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..62680d18d62616b44cf110184e6800fad7f27a0e --- /dev/null +++ b/cyclone-web/app/containers/common/authenticated/get-component.js @@ -0,0 +1,20 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet() { + try { + const component = await import('./'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(errorLoading, injectReducer, injectSagas) { + return function(nextState, cb) { + doGet() + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/common/authenticated/index.jsx b/cyclone-web/app/containers/common/authenticated/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..69dcc544b7d11898a9a19976ecf3041ee6407030 --- /dev/null +++ b/cyclone-web/app/containers/common/authenticated/index.jsx @@ -0,0 +1,67 @@ +/* + * Authenticated + * UAM登录成功后,默认跳转到/authenticated + */ + +import React, { Component } from 'react'; +import { + decodeAccoutAndPassword, + encodeAccoutAndPassword, + base64decodeFunc, + base64encodeFunc +} from 'common/base64'; +import { connect } from 'react-redux'; + +import { parseQuery } from 'common/getHashParams'; + +export class Authenticated extends Component { + componentWillMount() { + const hash = window.location.hash; + const index = hash.indexOf('?'); + const query = hash.substring(index + 1); + const params = parseQuery(query); + + const token = params.token; + const loginHash = params.loginHash; + + localStorage.osinstallAuthAccessToken = token; + document.cookie = 'access-token=' + token; + + if (loginHash) { + if (loginHash.indexOf('&locale=') !== -1) { + localStorage.LOCALE = base64encodeFunc( + loginHash.slice(loginHash.indexOf('&locale=')).slice(8) + ); + } + } + + if ( + loginHash && + loginHash !== '#/' && + loginHash.indexOf('&locale=') === -1 + ) { + window.location.hash = '/' + loginHash; + } else if (loginHash && loginHash !== '#/') { + window.location.hash = + '/' + loginHash.slice(0, loginHash.indexOf('&locale=')); + } else { + window.location.hash = '/'; + } + } + + render() { + return <div />; + } +} + +function mapStateToProps(state) { + return {}; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Authenticated); diff --git a/cyclone-web/app/containers/common/develop/get-component.js b/cyclone-web/app/containers/common/develop/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..1ed3bfe39966f5c6dbae28ae812961a5f0389bc9 --- /dev/null +++ b/cyclone-web/app/containers/common/develop/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('develop', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/common/develop/index.jsx b/cyclone-web/app/containers/common/develop/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..3f551e1ea58c5eeb0677bb285b2ed4bfab99609a --- /dev/null +++ b/cyclone-web/app/containers/common/develop/index.jsx @@ -0,0 +1,207 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import Layout from 'components/layout/page-layout'; +// import SearchForm from 'components/search-form'; +import { getWithArgs } from 'common/xFetch2'; +const mockData = { + "id": '0', + "name": "全部", + "capacity": 99999, + "children": [ + { + "id": '1', + "name": "中国", + "capacity": 1000, + "used": 0, + "free": 1000, + "children": [ + { + "id": '3', + "name": "浙江", + "capacity": 500, + "used": 0, + "free": 500, + "children": [ + { + "id": '4', + "name": "杭州", + "capacity": 100, + "used": 0, + "free": 100, + "children": [ ] + } + ] + } + ] + }, + { + "id": '2', + "name": "美国", + "capacity": 1000, + "used": 0, + "free": 1000, + "children": [ + { + "id": '51', + "name": "杭州", + "capacity": 100, + "used": 0, + "free": 100, + "children": [ + { + "id": '11', + "name": "中国", + "capacity": 1000, + "used": 0, + "free": 1000, + "children": [ + { + "id": '31', + "name": "浙江", + "capacity": 500, + "used": 0, + "free": 500, + "children": [ + { + "id": '41', + "name": "杭州", + "capacity": 100, + "used": 0, + "free": 100, + "children": [ ] + } + ] + } + ] + }, + { + "id": '21', + "name": "美国", + "capacity": 1000, + "used": 0, + "free": 1000, + "children": [ + { + "id": '52', + "name": "杭州", + "capacity": 100, + "used": 0, + "free": 100, + "children": [ ] + } + ] + } + ] + } + ] + } + ] +}; +class Container extends React.Component { + state = { + searchKeys: [ + { label: '单选', key: 'radio' }, + { label: '多选', key: 'checkbox' }, + { label: '输入框', key: 'input' }, + { label: '时间选择器', key: 'rangePicker' }, + { label: '数字输入框', key: 'number' }, + { label: '树', key: 'tree' }, + { label: '级联选择同步', key: 'cascader_ysnc' }, + { label: '级联选择异步', key: 'cascader_aysnc' } + ], + searchValues: { + 'radio': { type: 'radio', list: [{ label: 'A1', value: 'a1' }, { label: 'A2', value: 'a2' }] }, + 'checkbox': { type: 'checkbox', list: [{ label: 'B1', value: 'b1' }, { label: 'B2', value: 'b2' }] }, + 'input': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔'}, + 'rangePicker': { type: 'rangePicker', placeholder: [ '开始时间', '结束时间' ] }, + 'number': { type: 'number', placeholder: '请输入,按回车键确定' }, + 'tree': { type: 'tree', data: mockData }, + 'cascader_ysnc': { type: 'cascader_ysnc', list: [{ label: 'A1', value: 'a1', children: [{ name: 'children1', id: 1 }, { name: 'children2', id: 2 }] }, { label: 'A2', value: 'a2', children: [{ name: 'children3', id: 3 }, { name: 'children4', id: 4 }] }] }, + 'cascader_aysnc': { + grade: 4, + type: 'cascader_aysnc', + list: [{ value: 1, label: "test" }], + getSecondList: (id) => this.getSecondList(id), + secondList: [], + getThirdList: (id) => this.getThirdList(id), + thirdList: [], + getFourthList: (id) => this.getFourthList(id), + fourthList: [] + } + } + }; + + + async getSecondList(id) { + const res = await getWithArgs('/api/cloudboot/v1/server-rooms', { page: 1, page_size: 100, idc_id: id }); + if (res.status !== 'success') { + return; + } + const { searchValues } = this.state; + searchValues.cascader_aysnc.secondList = res.content.records.map(it => { + return { + label: it.name, + value: it.id + }; + }); + this.setState({ searchValues }); + } + + async getThirdList(id) { + const res = await getWithArgs('/api/cloudboot/v1/server-cabinets', { page: 1, page_size: 100, server_room_id: id }); + if (res.status !== 'success') { + return; + } + const { searchValues } = this.state; + searchValues.cascader_aysnc.thirdList = res.content.records.map(it => { + return { + label: it.number, + value: it.id + }; + }); + this.setState({ searchValues }); + } + + async getFourthList(id) { + const res = await getWithArgs('/api/cloudboot/v1/server-usites', { page: 1, page_size: 100, server_cabinet_id: id }); + if (res.status !== 'success') { + return; + } + const { searchValues } = this.state; + searchValues.cascader_aysnc.fourthList = res.content.records.map(it => { + return { + label: it.number, + value: it.id + }; + }); + this.setState({ searchValues }); + } + + onSearch = (data) => { + console.log(data); + }; + + render() { + const initialSearchList = [{ key: 'radio', keyLabel: '单选', valueLabel: 'A1', value: 'a1' }]; + return ( + <Layout> + {/*<SearchForm initialSearchList={initialSearchList} initialSearch={false} onSearch={this.onSearch} searchKeys={this.state.searchKeys} searchValues={this.state.searchValues}/>*/} + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + data: state.get('develop').toJS(), + userInfo: state.getIn([ 'global', 'userData' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/common/develop/reducers/index.js b/cyclone-web/app/containers/common/develop/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..ec711ef518fdd376bfb853f6230a3d54f8b5fd5b --- /dev/null +++ b/cyclone-web/app/containers/common/develop/reducers/index.js @@ -0,0 +1,14 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; + + +const initialState = fromJS({ + loading: true +}); + +const reducer = handleActions( + {}, + initialState, +); + +export default reducer; diff --git a/cyclone-web/app/containers/common/develop/sagas/index.js b/cyclone-web/app/containers/common/develop/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..0287325b748eb79a7ce32c2f8f263f38fab0b48b --- /dev/null +++ b/cyclone-web/app/containers/common/develop/sagas/index.js @@ -0,0 +1,18 @@ + +let created = false; +function* empty() { + console.log(); +} + +function* defaultSaga() { + console.log(); +} + + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [defaultSaga]; +} diff --git a/cyclone-web/app/containers/common/err404/get-component.js b/cyclone-web/app/containers/common/err404/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..62680d18d62616b44cf110184e6800fad7f27a0e --- /dev/null +++ b/cyclone-web/app/containers/common/err404/get-component.js @@ -0,0 +1,20 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet() { + try { + const component = await import('./'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(errorLoading, injectReducer, injectSagas) { + return function(nextState, cb) { + doGet() + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/common/err404/index.jsx b/cyclone-web/app/containers/common/err404/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..6ae7d889390558b99b5ffb4ea53ed15aea4712d5 --- /dev/null +++ b/cyclone-web/app/containers/common/err404/index.jsx @@ -0,0 +1,19 @@ +/** + * NotFoundPage + * + * This is the page we show when the user visits a url that doesn't have a route + */ + +import React from 'react'; +import Exception from 'components/Exception'; +import Layout from 'components/layout/page-layout'; + +export function NotFound(props) { + return ( + <Layout> + <Exception type='404'/> + </Layout> + ); +} + +export default NotFound; diff --git a/cyclone-web/app/containers/common/language-provider/actions.js b/cyclone-web/app/containers/common/language-provider/actions.js new file mode 100644 index 0000000000000000000000000000000000000000..487dfc4d29468cc210b85ae156274f26ed23c99d --- /dev/null +++ b/cyclone-web/app/containers/common/language-provider/actions.js @@ -0,0 +1,14 @@ +/* + * + * LanguageProvider actions + * + */ + +import { CHANGE_LOCALE } from './constants'; + +export function changeLocale(languageLocale) { + return { + type: CHANGE_LOCALE, + locale: languageLocale + }; +} diff --git a/cyclone-web/app/containers/common/language-provider/constants.js b/cyclone-web/app/containers/common/language-provider/constants.js new file mode 100644 index 0000000000000000000000000000000000000000..696f33edc5ccaa232fb6035125a90658ec7d6319 --- /dev/null +++ b/cyclone-web/app/containers/common/language-provider/constants.js @@ -0,0 +1,8 @@ +/* + * + * LanguageProvider constants + * + */ + +export const CHANGE_LOCALE = 'app/LanguageToggle/CHANGE_LOCALE'; +export const DEFAULT_LOCALE = 'zh'; diff --git a/cyclone-web/app/containers/common/language-provider/index.jsx b/cyclone-web/app/containers/common/language-provider/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..a025eb96fdb7ec0e8ca6c434cb32c6e129c09deb --- /dev/null +++ b/cyclone-web/app/containers/common/language-provider/index.jsx @@ -0,0 +1,42 @@ +/* + * + * LanguageProvider + * + * this component connects the redux state language locale to the + * IntlProvider component and i18n messages (loaded from `app/translations`) + */ + +import React from 'react'; +import { connect } from 'react-redux'; +import { createSelector } from 'reselect'; +import { IntlProvider } from 'react-intl'; + +import { makeSelectLocale } from './selectors'; +import PropTypes from 'prop-types'; + +export class LanguageProvider extends React.PureComponent { + // eslint-disable-line react/prefer-stateless-function + render() { + return ( + <IntlProvider + locale={this.props.locale} + key={this.props.locale} + messages={this.props.messages[this.props.locale]} + > + {React.Children.only(this.props.children)} + </IntlProvider> + ); + } +} + +LanguageProvider.propTypes = { + locale: PropTypes.string, + messages: PropTypes.object, + children: PropTypes.element.isRequired +}; + +const mapStateToProps = createSelector(makeSelectLocale(), locale => ({ + locale +})); + +export default connect(mapStateToProps)(LanguageProvider); diff --git a/cyclone-web/app/containers/common/language-provider/reducer.js b/cyclone-web/app/containers/common/language-provider/reducer.js new file mode 100644 index 0000000000000000000000000000000000000000..d2efa8eab0710ba64d8b6eab5ab4eac4bb3955b3 --- /dev/null +++ b/cyclone-web/app/containers/common/language-provider/reducer.js @@ -0,0 +1,26 @@ +/* + * + * LanguageProvider reducer + * + */ + +import { fromJS } from 'immutable'; + +import { CHANGE_LOCALE, DEFAULT_LOCALE } from './constants'; + +const initialState = fromJS({ + locale: DEFAULT_LOCALE +}); + +function languageProviderReducer(state = initialState, action) { + switch (action.type) { + case CHANGE_LOCALE: + return state.set('locale', action.locale); + default: + return state; + } +} + +languageProviderReducer.NAME = 'language'; + +export default languageProviderReducer; diff --git a/cyclone-web/app/containers/common/language-provider/selectors.js b/cyclone-web/app/containers/common/language-provider/selectors.js new file mode 100644 index 0000000000000000000000000000000000000000..74a9e6d15e38040cf211786c3c7d3e30cc6afb78 --- /dev/null +++ b/cyclone-web/app/containers/common/language-provider/selectors.js @@ -0,0 +1,15 @@ +import { createSelector } from 'reselect'; + +/** + * Direct selector to the languageToggle state domain + */ +const selectLanguage = state => state.get('language'); + +/** + * Select the language locale + */ + +const makeSelectLocale = () => + createSelector(selectLanguage, languageState => languageState.get('locale')); + +export { selectLanguage, makeSelectLocale }; diff --git a/cyclone-web/app/containers/database/cabinet/actions/change-status.jsx b/cyclone-web/app/containers/database/cabinet/actions/change-status.jsx new file mode 100644 index 0000000000000000000000000000000000000000..4527f7dc6eb43d5c61771714efad348d103db78c --- /dev/null +++ b/cyclone-web/app/containers/database/cabinet/actions/change-status.jsx @@ -0,0 +1,34 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { put } from 'common/xFetch2'; + +export default function action(options) { + const records = options.records; + const status = options.type; + const ids = records.map(item => item.id); + const typeMap = { + 'enabled': '启用', + 'offline': '下线', + 'locked': '锁定' + }; + const onSubmit = () => { + put('/api/cloudboot/v1/server-cabinets/status', { status: status, ids: ids }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + options.reload(); + }); + }; + + confirm({ + title: `确定要${typeMap[status]}吗?`, + content: `已选择的数据${records.length}条`, + okText: '确定', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/database/cabinet/actions/change-type.jsx b/cyclone-web/app/containers/database/cabinet/actions/change-type.jsx new file mode 100644 index 0000000000000000000000000000000000000000..aa19abede362fd2cf969973596a8dada75153496 --- /dev/null +++ b/cyclone-web/app/containers/database/cabinet/actions/change-type.jsx @@ -0,0 +1,64 @@ +import React from 'react'; +import Popup from 'components/popup'; +import { put } from 'common/xFetch2'; +import { notification } from 'antd'; +import FormGenerator from 'components/idcos-form/FormGenerator'; +import { CAB_TYPE, getSearchList } from 'common/enums'; + +export default function action(options) { + const record = options.records; + const ids = record.map(item => item.id); + + const formSchema = { + name: 'form', + id: 'form', + elements: [ + { + id: 'type', + name: 'type', + label: '类型', + type: 'Select', + options: getSearchList(CAB_TYPE), + rules: [ + { + required: true, + message: '请选择机架类型' + } + ] + } + ] + }; + + const onSubmit = (values) => { + + put('/api/cloudboot/v1/server-cabinets/type', { type: values.type, ids: ids }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + Popup.close(); + options.reload(); + }); + }; + + Popup.open({ + title: '更新机架类型', + onCancel: () => { + Popup.close(); + }, + content: ( + <div> + <FormGenerator + initialValue={record} + schema={formSchema} + showCancel={true} + hideReset={true} + onSubmit={(values) => onSubmit(values)} + onCancel={() => { + Popup.close(); + }} + /> + </div> + ) + }); +} diff --git a/cyclone-web/app/containers/database/cabinet/actions/create-update.jsx b/cyclone-web/app/containers/database/cabinet/actions/create-update.jsx new file mode 100644 index 0000000000000000000000000000000000000000..5ad601ee0020bcf37a9a88be6c40d9d169b88c9b --- /dev/null +++ b/cyclone-web/app/containers/database/cabinet/actions/create-update.jsx @@ -0,0 +1,59 @@ +import React from 'react'; +import Popup from 'components/popup'; +import { post, put } from 'common/xFetch2'; +import { notification } from 'antd'; +import FormGenerator from 'components/idcos-form/FormGenerator'; +import { formSchema } from '../../common/cabinet/formSchema'; + +export default function action(options) { + const record = options.records; + const type = options.type; + if (type === '_update') { + record.network_area_id = record.network_area.id; + } + const typeMap = { + _create: '新增机架信息', + _update: '编辑机架信息' + }; + + const onSubmit = (values) => { + + let method = post; + let url = '/api/cloudboot/v1/server-cabinets'; + if (type === '_update') { + method = put; + url = `/api/cloudboot/v1/server-cabinets/${record.id}`; + } + + method(url, values).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + Popup.close(); + options.reload(); + }); + }; + + Popup.open({ + title: `${typeMap[type]}`, + width: 700, + onCancel: () => { + Popup.close(); + }, + content: ( + <div> + <FormGenerator + initialValue={record} + schema={formSchema(false, options)} + showCancel={true} + hideReset={true} + onSubmit={(values) => onSubmit(values)} + onCancel={() => { + Popup.close(); + }} + /> + </div> + ) + }); +} diff --git a/cyclone-web/app/containers/database/cabinet/actions/delete.jsx b/cyclone-web/app/containers/database/cabinet/actions/delete.jsx new file mode 100644 index 0000000000000000000000000000000000000000..891a8a3fc1c2ffcf9a0fe00409d881ea7da3c691 --- /dev/null +++ b/cyclone-web/app/containers/database/cabinet/actions/delete.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { del } from 'common/xFetch2'; + +export default function action(options) { + const records = options.records; + const onSubmit = () => { + del(`/api/cloudboot/v1/server-cabinets/${records.id}`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + }); + }; + confirm({ + title: `确定要删除吗?`, + content: `机架编号:${records.number}`, + okText: '确定', + okType: 'danger', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/database/cabinet/actions/import.jsx b/cyclone-web/app/containers/database/cabinet/actions/import.jsx new file mode 100644 index 0000000000000000000000000000000000000000..3a0e235abea17ea437421232f19f51b149743547 --- /dev/null +++ b/cyclone-web/app/containers/database/cabinet/actions/import.jsx @@ -0,0 +1,72 @@ +import React from 'react'; +import Popup from 'components/popup'; +import FileUpload from 'components/upload'; + +export default function action(options) { + const getColumns = () => { + return [ + { + title: '机架编号', + dataIndex: 'number' + }, + { + title: '网络区域', + dataIndex: 'network_area' + }, + { + title: '机房管理单元', + dataIndex: 'server_room' + }, + { + title: '类型', + dataIndex: 'type' + }, + { + title: '峰值功率', + dataIndex: 'max_power' + }, + { + title: '网络速率', + dataIndex: 'network_rate' + }, + { + title: '电流', + dataIndex: 'current' + }, + { + title: '可用功率', + dataIndex: 'available_power' + }, + { + title: '机架高度', + dataIndex: 'height' + }, + { + title: '备注', + dataIndex: 'remark' + } + ]; + }; + Popup.open({ + title: '导入数据', + width: 1500, + onCancel: () => { + Popup.close(); + }, + content: ( + <FileUpload + importApi='/api/cloudboot/v1/server-cabinets/imports' + uploadApi='/api/cloudboot/v1/server-cabinets/upload' + previewApi='/api/cloudboot/v1/server-cabinets/imports/previews' + getColumns={getColumns} + onSuccess={() => { + Popup.close(); + options.reload(); + }} + onCancel={() => { + Popup.close(); + }} + /> + ) + }); +} diff --git a/cyclone-web/app/containers/database/cabinet/actions/index.js b/cyclone-web/app/containers/database/cabinet/actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..461243d5f64093697a95403bfb18bd953d2135e8 --- /dev/null +++ b/cyclone-web/app/containers/database/cabinet/actions/index.js @@ -0,0 +1,29 @@ +import _update from './create-update'; +import _create from './create-update'; +import _delete from './delete'; +import _import from './import'; +import detail from '../../common/cabinet/detail'; +import network_detail from '../../common/network/detail'; +import offline from './change-status'; +import enabled from './change-status'; +import locked from './change-status'; +import powerOn from './powerOn'; +import powerOff from './powerOff'; +import changeType from './change-type'; +import remark from './remark'; + +export default { + detail, + _update, + _delete, + _create, + _import, + enabled, + offline, + locked, + powerOn, + powerOff, + network_detail, + changeType, + remark +}; diff --git a/cyclone-web/app/containers/database/cabinet/actions/powerOff.jsx b/cyclone-web/app/containers/database/cabinet/actions/powerOff.jsx new file mode 100644 index 0000000000000000000000000000000000000000..ef7beb82b3665e289f5b9eb1b65f7aec5b93c393 --- /dev/null +++ b/cyclone-web/app/containers/database/cabinet/actions/powerOff.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { del } from 'common/xFetch2'; + +export default function action(options) { + const record = options.records; + const onSubmit = () => { + del(`/api/cloudboot/v1/server-cabinets/${record.id}/power`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + options.reload(); + }); + }; + + confirm({ + title: `确定要关电吗?`, + content: `机架编号:${record.number}`, + okText: '确定', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/database/cabinet/actions/powerOn.jsx b/cyclone-web/app/containers/database/cabinet/actions/powerOn.jsx new file mode 100644 index 0000000000000000000000000000000000000000..7be4a1892179d358a9d716851980ae3c349166b0 --- /dev/null +++ b/cyclone-web/app/containers/database/cabinet/actions/powerOn.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { post } from 'common/xFetch2'; + +export default function action(options) { + const ids = options.records.map(item => item.id); + const onSubmit = () => { + post('/api/cloudboot/v1/server-cabinets/power', { ids: ids }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + options.reload(); + }); + }; + + confirm({ + title: `确定要开电吗?`, + content: `选择的机架个数:${ids.length}`, + okText: '确定', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/database/cabinet/actions/remark.jsx b/cyclone-web/app/containers/database/cabinet/actions/remark.jsx new file mode 100644 index 0000000000000000000000000000000000000000..488e0c84cd77502f8dff2aae89dfe514ab6638af --- /dev/null +++ b/cyclone-web/app/containers/database/cabinet/actions/remark.jsx @@ -0,0 +1,62 @@ +import React from 'react'; +import Popup from 'components/popup'; +import { put } from 'common/xFetch2'; +import { notification } from 'antd'; +import FormGenerator from 'components/idcos-form/FormGenerator'; + +export default function action(options) { + const record = options.records; + const ids = record.map(item => item.id); + + const formSchema = { + name: 'form', + id: 'form', + elements: [ + { + id: 'remark', + name: 'remark', + label: '备注', + type: 'Textarea', + rules: [ + { + required: true, + message: '请输入备注内容' + } + ] + } + ] + }; + + const onSubmit = (values) => { + + put('/api/cloudboot/v1/server-cabinets/remark', { remark: values.remark, ids: ids }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + Popup.close(); + options.reload(); + }); + }; + + Popup.open({ + title: '更新备注信息', + onCancel: () => { + Popup.close(); + }, + content: ( + <div> + <FormGenerator + initialValue={record} + schema={formSchema} + showCancel={true} + hideReset={true} + onSubmit={(values) => onSubmit(values)} + onCancel={() => { + Popup.close(); + }} + /> + </div> + ) + }); +} diff --git a/cyclone-web/app/containers/database/cabinet/components/search-form.jsx b/cyclone-web/app/containers/database/cabinet/components/search-form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..36e0e0a2a775dbeda0f052b2482689ab65fed0e6 --- /dev/null +++ b/cyclone-web/app/containers/database/cabinet/components/search-form.jsx @@ -0,0 +1,92 @@ +import React from 'react'; +import SearchForm from 'components/search-form'; +import { CAB_TYPE, CAB_STATUS, YES_NO, getSearchList } from 'common/enums'; +import { get } from 'common/xFetch2'; +import { notification } from 'antd'; + +export default class Search extends React.Component { + state = { + searchKeys: [ + { key: 'number', label: '机架编号' }, + { key: 'server_room_name', label: '机房管理单元' }, + { key: 'idc_id', label: '数据中心' }, + { key: 'network_area_name', label: '网络区域' }, + { key: 'type', label: '类型' }, + { key: 'status', label: '机架状态' }, + { key: 'is_enabled', label: '是否启用' }, + { key: 'is_powered', label: '是否开电' } + ], + searchValues: { + 'number': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'server_room_name': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'idc_id': { type: 'checkbox', list: [] }, + 'network_area_name': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'type': { type: 'checkbox', list: getSearchList(CAB_TYPE) }, + 'status': { type: 'checkbox', list: getSearchList(CAB_STATUS) }, + 'is_enabled': { type: 'checkbox', list: getSearchList(YES_NO) }, + 'is_powered': { type: 'checkbox', list: getSearchList(YES_NO) } + } + }; + + getListId = (name) => { + const searchValues = this.state.searchValues; + get(`/api/cloudboot/v1/idcs`, { page: 1, page_size: 100 }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + const list = res.content.records || []; + if (list.length > 0) { + searchValues[name].list = list.map(it => { + return { + label: it.name, + value: it.id + }; + }); + } + }); + }; + + componentDidMount() { + this.getListId('idc_id'); + } + + UNSAFE_componentWillReceiveProps(props) { + const { network, room, idc } = props; + const searchValues = this.state.searchValues; + // if (!network.loading && network.loading !== this.props.network.loading) { + // searchValues['network_area_id'].list = network.data.map(it => { + // return { + // label: it.name, + // value: it.id + // }; + // }); + // this.setState({ searchValues }); + // } + // if (!room.loading && room.loading !== this.props.room.loading) { + // searchValues['server_room_id'].list = room.data; + // this.setState({ searchValues }); + // } + // if (!idc.loading && idc.loading !== this.props.idc.loading) { + // searchValues['idc_id'].list = idc.data; + // this.setState({ searchValues }); + // } + } + + + onSearch = (values) => { + this.props.dispatch({ + type: 'database-cabinet/table-data/search', + payload: { + ...values + } + }); + }; + + render() { + return ( + <SearchForm onSearch={this.onSearch} searchKeys={this.state.searchKeys} searchValues={this.state.searchValues}/> + ); + } +} + + diff --git a/cyclone-web/app/containers/database/cabinet/components/table.jsx b/cyclone-web/app/containers/database/cabinet/components/table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..75f48b22d8e6ce824d1a517dec0a2e1c54939a87 --- /dev/null +++ b/cyclone-web/app/containers/database/cabinet/components/table.jsx @@ -0,0 +1,361 @@ +import React from 'react'; +import { + Table, + Button, + Pagination, + notification, + Menu, + Badge, + Tooltip, + Icon +} from 'antd'; +const ButtonGroup = Button.Group; + +import actions from '../actions'; +import { CAB_STATUS_COLOR, CAB_TYPE, YES_NO } from "common/enums"; +import TableControlCell from 'components/TableControlCell'; +import { renderDisplayMore } from 'common/utils'; +import { getPermissonBtn } from 'common/utils'; + + +const plainOptions = [ + { value: 'enable_time', name: '启用时间' }, + { value: 'power_on_time', name: '开电时间' }, + { value: 'power_off_time', name: '关电时间' }, + { value: 'idc.name', name: '数据中心' }, + { value: 'height', name: '机架高度' }, + { value: 'usite_count', name: '机位总数' }, +]; + +class MyTable extends React.Component { + state = { + checkedList: [], + indeterminate: false, + checkAll: false + }; + reload = () => { + this.props.dispatch({ + type: 'database-cabinet/table-data/reload' + }); + this.props.dispatch({ + type: 'database-cabinet/table-data/set/selectedRows', + payload: { + selectedRows: [], + selectedRowKeys: [] + } + }); + }; + + //批量操作入口 + batchExecAction = (name) => { + const { tableData } = this.props; + const selectedRows = tableData.selectedRows || []; + if (selectedRows.length < 1) { + return notification.error({ message: '请至少选择一条数据' }); + } + this.execAction(name, selectedRows); + }; + + //单个操作入口 + oneExecAction = (name) => { + const { tableData } = this.props; + const selectedRows = tableData.selectedRows || []; + if (selectedRows.length !== 1) { + return notification.error({ message: '请选择一条数据' }); + } + this.execAction(name, selectedRows[0]); + }; + + //操作入口 + execAction = (name, records) => { + if (actions[name]) { + actions[name]({ + records, + initialValue: records, + type: name, + network: this.props.network, + reload: () => { + this.reload(); + } + }); + } + }; + + //下载导入模板 + downloadImportTemplate = () => { + window.open('assets/files/server-cabinets.xlsx'); + }; + + + getRowSelection = () => { + const selectedRowKeys = this.props.tableData.selectedRowKeys; + return { + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.props.dispatch({ + type: 'database-cabinet/table-data/set/selectedRows', + payload: { + selectedRowKeys, + selectedRows + } + }); + } + }; + }; + + changePage = page => { + this.props.dispatch({ + type: `database-cabinet/table-data/change-page`, + payload: { + page + } + }); + }; + + changePageSize = (page, pageSize) => { + this.props.dispatch({ + type: `database-cabinet/table-data/change-page-size`, + payload: { + page, + pageSize + } + }); + }; + + + getColumns = () => { + const columns = [ + { + title: '机架编号', + dataIndex: 'number', + width:80, + render: (text, record) => <a onClick={() => this.execAction('detail', record)}>{text}</a> + }, + { + title: '网络区域', + dataIndex: 'network_area', + render: (text, record) => <a onClick={() => this.execAction('network_detail', { id: text.id })}>{text.name}</a> + }, + { + title: '机房管理单元', + dataIndex: 'server_room', + render: (text) => <Tooltip placement="top" title={text.name}>{text.name}</Tooltip> + }, + //{ + // title: '数据中心', + // dataIndex: 'idc', + // render: (text) => <span>{text.name}</span> + //}, + { + title: '机架状态', + dataIndex: 'status', + width: 80, + render: type => { + const color = CAB_STATUS_COLOR[type] ? CAB_STATUS_COLOR[type][0] : 'transparent'; + const word = CAB_STATUS_COLOR[type] ? CAB_STATUS_COLOR[type][1] : ''; + return ( + <div> + <Badge + dot={true} + style={{ + background: color + }} + />{' '} + &nbsp;&nbsp; {word} + </div> + ); + } + }, + { + title: '类型', + dataIndex: 'type', + render: (text) => <span>{CAB_TYPE[text]}</span> + }, + { + title: '是否启用', + dataIndex: 'is_enabled', + render: (text) => <span className={`yes_no_status ${text === 'yes' ? 'yes_status' : 'no_status'}`}>{YES_NO[text]}</span> + }, + { + title: '是否开电', + dataIndex: 'is_powered', + render: (text) => <span className={`yes_no_status ${text === 'yes' ? 'yes_status' : 'no_status'}`}>{YES_NO[text]}</span> + }, + { + title: '峰值功率/W', + dataIndex: 'max_power' + }, + { + title: '电流/A', + dataIndex: 'current' + }, + { + title: '网络速率/G', + dataIndex: 'network_rate' + }, + //{ + // title: '机架高度/U', + // dataIndex: 'height' + //}, + //{ + // title: '机位总数', + // dataIndex: 'usite_count' + //}, + { + title: '更新时间', + dataIndex: 'updated_at', + width: 150 + }, + { + title: '备注', + dataIndex: 'remark' + }, + { + title: '操作', + dataIndex: 'operate', + width: 100, + render: (text, record) => { + const commands = [ + { + name: '编辑', + command: '_update', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_server_cabinet_update') + }, + { + name: '删除', + command: '_delete', + type: 'danger', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_server_cabinet_delete') + } + ]; + return ( + <TableControlCell + commands={commands} + record={record} + execCommand={command => { + this.execAction(command, record); + }} + /> + ); + } + } + ]; + if (this.state.checkedList.length > 0) { + this.state.checkedList.forEach(data => { + columns.push({ + title: data.name, + dataIndex: data.value + }); + }); + } + return columns; + }; + + + render() { + const { tableData } = this.props; + const { loading, pagination, selectedRows } = tableData; + const menu = ( + <Menu onClick={(e) => this.batchExecAction(e.key)}> + {/*<Menu.Item key='online'>验收</Menu.Item>*/} + {/*<Menu.Item key='offline'>改造</Menu.Item>*/} + {/*<Menu.Item key='applyUsers'>拆分</Menu.Item>*/} + {/*<Menu.Item key='setBlack'>合并</Menu.Item>*/} + <Menu.Item key='offline' disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_server_cabinet_offline')}>下线</Menu.Item> + </Menu> + ); + return ( + <div> + <div className='operate_btns'> + <Button + onClick={() => this.execAction('_create')} + type='primary' + style={{ marginRight: 8 }} + icon='plus' + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_server_cabinet_create')} + > + 新增 + </Button> + <Button.Group style={{ marginRight: 8 }}> + <Button + onClick={() => this.batchExecAction('enabled')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_server_cabinet_enabled')} + > + 启用 + </Button> + <Button + onClick={() => this.batchExecAction('powerOn')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_server_cabinet_powerOn')} + > + 开电 + </Button> + <Tooltip placement="top" title='机架置为[已锁定]并将关联的[空闲][预占用]机位置为[不可用]'> + <Button + onClick={() => this.batchExecAction('locked')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_server_cabinet_locked')} + > + 锁定<Icon type='question-circle-o' /> + </Button> + </Tooltip> + <Button + onClick={() => this.batchExecAction('remark')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_server_cabinet_remark')} + > + 备注 + </Button> + <Button + style={{ marginRight: 8 }} + onClick={() => this.batchExecAction('changeType')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_server_cabinet_type')} + > + 更新机架类型 + </Button> + </Button.Group> + <span> + 已选 { selectedRows.length } 项 + </span> + <span className='pull-right'> + <ButtonGroup style={{ marginRight: 8 }}> + <Button + onClick={() => this.downloadImportTemplate()} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_server_cabinet_download')} + > + 下载导入模板 + </Button> + <Button + onClick={() => this.execAction('_import')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_server_cabinet_import')} + > + 导入 + </Button> + </ButtonGroup> + {renderDisplayMore(this, plainOptions)} + </span> + </div> + <div className='clearfix' /> + <Table + rowKey={'id'} + columns={this.getColumns()} + pagination={false} + dataSource={tableData.list} + rowSelection={this.getRowSelection()} + loading={loading} + /> + <div> + <Pagination + showTotal={(total) => `共 ${total} 条`} + showQuickJumper={true} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={this.changePageSize} + onChange={this.changePage} + /> + </div> + </div> + ); + } +} + +export default MyTable; diff --git a/cyclone-web/app/containers/database/cabinet/get-component.js b/cyclone-web/app/containers/database/cabinet/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..c246fb5135ccc97f5d73ff464db4a4651ffced89 --- /dev/null +++ b/cyclone-web/app/containers/database/cabinet/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('database-cabinet', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/database/cabinet/index.jsx b/cyclone-web/app/containers/database/cabinet/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..a953cbd25ae35a6aa37b2fd852d604684c978fa1 --- /dev/null +++ b/cyclone-web/app/containers/database/cabinet/index.jsx @@ -0,0 +1,60 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import SearchForm from './components/search-form'; +import Table from './components/table'; +import Layout from 'components/layout/page-layout'; + +class Container extends React.Component { + componentDidMount() { + this.props.dispatch({ + type: 'database-cabinet/table-data/get' + }); + // 获取网络区域信息 + this.props.dispatch({ + type: 'database-cabinet/network/get' + }); + } + + componentWillUnmount() { + this.props.dispatch({ + type: 'database-cabinet/table-data/reset' + }); + } + + render() { + const { tableData, network } = this.props.data; + return ( + <Layout title='机架信息管理'> + <SearchForm room={this.props.room} + dispatch={this.props.dispatch} + network={network} + idc={this.props.idc} + + /> + <Table + dispatch={this.props.dispatch} + tableData={tableData} + userInfo={this.props.userInfo} + network={network} + /> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + data: state.get('database-cabinet').toJS(), + room: state.getIn([ 'global', 'room' ]).toJS(), + idc: state.getIn([ 'global', 'idc' ]).toJS(), + userInfo: state.getIn([ 'global', 'userData' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/database/cabinet/reducers/index.js b/cyclone-web/app/containers/database/cabinet/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..bf668df2d2d71092a7429187cd31ac5cf68cf4d3 --- /dev/null +++ b/cyclone-web/app/containers/database/cabinet/reducers/index.js @@ -0,0 +1,22 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; +import { createRegularReducer } from 'utils/regular-reducer'; + +const initialState = fromJS({ + tableData: createTableStore(), + network: { + loading: true, + data: [] + } +}); + +const reducer = handleActions( + { + ...createTableReducer('database-cabinet/table-data', 'tableData'), + ...createRegularReducer('database-cabinet/network', 'network') + }, + initialState, +); + +export default reducer; diff --git a/cyclone-web/app/containers/database/cabinet/sagas/index.js b/cyclone-web/app/containers/database/cabinet/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..64f8e3fdae32c5355c3901c796ac3edf3f104039 --- /dev/null +++ b/cyclone-web/app/containers/database/cabinet/sagas/index.js @@ -0,0 +1,27 @@ +import { getWithArgs } from 'common/xFetch2'; + +let created = false; +function* empty() { + yield; +} + +import { createTableListSaga } from 'utils/tableList-saga'; +const listSaga = createTableListSaga({ + actionNamePrefix: 'database-cabinet/network', + datasource: '/api/cloudboot/v1/network-areas' +}); + +import { createTableSaga } from 'utils/table-saga'; +const jobTableSaga = createTableSaga({ + actionNamePrefix: 'database-cabinet/table-data', + tableDataPath: [ 'database-cabinet', 'tableData' ], + datasource: '/api/cloudboot/v1/server-cabinets' +}); + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [ jobTableSaga, listSaga ]; +} diff --git a/cyclone-web/app/containers/database/common/cabinet/detail.jsx b/cyclone-web/app/containers/database/common/cabinet/detail.jsx new file mode 100644 index 0000000000000000000000000000000000000000..1df1e4d6b59be1e0289f4ce340546bf5acecb2b9 --- /dev/null +++ b/cyclone-web/app/containers/database/common/cabinet/detail.jsx @@ -0,0 +1,48 @@ +import React from 'react'; +import Popup from 'components/popup/draw'; +import FormGenerator from 'components/idcos-form/FormGenerator'; +import { get } from 'common/xFetch2'; +import { formSchema } from './formSchema'; +import { notification } from 'antd'; + +export default async function action(options) { + const record = options.records; + const res = await get(`/api/cloudboot/v1/server-cabinets/${record.id}`); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + let initialValue = { ...res.content }; + + //增加属性 + initialValue.network_area_id = res.content.network_area.id; + initialValue.idc_name = res.content.idc.name; + + //查看详情的网络信息不加载网络列表(模拟) + initialValue.network_area.server_room = res.content.server_room; + const network = { + loading: false, + data: [initialValue.network_area] + }; + + + Popup.open({ + title: '机架详情', + onCancel: () => { + Popup.close(); + }, + content: ( + <div> + <FormGenerator + initialValue={initialValue} + schema={formSchema(true, { network })} + showCancel={false} + hideReset={true} + showSubmit={false} + onCancel={() => { + Popup.close(); + }} + /> + </div> + ) + }); +} diff --git a/cyclone-web/app/containers/database/common/cabinet/formSchema.jsx b/cyclone-web/app/containers/database/common/cabinet/formSchema.jsx new file mode 100644 index 0000000000000000000000000000000000000000..ecff835840f2c66c86c0f4025841638a0bac1f9b --- /dev/null +++ b/cyclone-web/app/containers/database/common/cabinet/formSchema.jsx @@ -0,0 +1,200 @@ +import React from 'react'; +import { CAB_TYPE, CAB_STATUS, YES_NO, getSearchList } from 'common/enums'; + +export const formSchema = (disabled, options) => { + let elements = [ + { + id: 'network_area_id', + name: 'network_area_id', + label: '网络区域', + type: 'Select', + disabled: disabled, + options: !options.network.loading ? options.network.data.map(it => { + return { + label: it.name + '(机房:' + it.server_room.name + ')', value: it.id + }; + }) : [], + rules: [ + { + required: true, + message: '请选择机房' + } + ] + }, + { + id: 'number', + name: 'number', + label: '机架编号', + type: 'TextInput', + disabled: disabled, + rules: [ + { + required: true, + message: '请填写机架编号' + } + ] + }, + { + id: 'height', + name: 'height', + label: '机架高度', + type: 'Number', + disabled: disabled, + rules: [ + { + required: true, + message: '请填写机架高度' + } + ] + }, + { + id: 'type', + name: 'type', + label: '类型', + type: 'Select', + disabled: disabled, + options: getSearchList(CAB_TYPE), + rules: [ + { + required: true, + message: '请选择机房' + } + ] + }, + { + id: 'network_rate', + name: 'network_rate', + label: '网络速率', + type: 'TextInput', + disabled: disabled, + rules: [ + { + required: true, + message: '请填写网络速率' + } + ] + }, + { + id: 'current', + name: 'current', + label: '电流', + type: 'TextInput', + disabled: disabled, + rules: [ + { + required: true, + message: '请填写电流' + } + ] + }, + { + id: 'available_power', + name: 'available_power', + label: '可用功率', + type: 'TextInput', + disabled: disabled, + rules: [ + { + required: true, + message: '请填写可用功率' + } + ] + }, + { + id: 'max_power', + name: 'max_power', + label: '峰值功率', + type: 'TextInput', + disabled: disabled, + rules: [ + { + required: true, + message: '请填写峰值功率' + } + ] + }, + { + id: 'remark', + name: 'remark', + label: '备注', + type: 'Textarea', + disabled: disabled + } + ]; + //查看详情多加几个字段显示 + if (disabled) { + elements.unshift({ + id: 'idc_name', + name: 'idc_name', + label: '数据中心', + type: 'TextInput', + disabled: disabled + }); + elements.push( + { + id: 'status', + name: 'status', + label: '机架状态', + type: 'Select', + disabled: disabled, + options: getSearchList(CAB_STATUS) + }, + { + id: 'is_enabled', + name: 'is_enabled', + label: '是否启用', + type: 'Select', + disabled: disabled, + options: getSearchList(YES_NO) + }, + { + id: 'enable_time', + name: 'enable_time', + label: '启用时间', + type: 'TextInput', + disabled: disabled + }, + { + id: 'is_powered', + name: 'is_powered', + label: '是否开电', + type: 'Select', + disabled: disabled, + options: getSearchList(YES_NO) + }, + { + id: 'power_on_time', + name: 'power_on_time', + label: '开电时间', + type: 'TextInput', + disabled: disabled + }, + { + id: 'power_off_time', + name: 'power_off_time', + label: '关电时间', + type: 'TextInput', + disabled: disabled + }, + { + id: 'created_at', + name: 'created_at', + label: '创建时间', + type: 'TextInput', + disabled: disabled + }, + { + id: 'updated_at', + name: 'updated_at', + label: '更新时间', + type: 'TextInput', + disabled: disabled + } + ); + } + return { + name: 'form', + id: 'form', + elements: elements + }; +}; diff --git a/cyclone-web/app/containers/database/common/idc/detail.jsx b/cyclone-web/app/containers/database/common/idc/detail.jsx new file mode 100644 index 0000000000000000000000000000000000000000..8d22e63460a8e5e8c3b11bbbd30aed33530645ef --- /dev/null +++ b/cyclone-web/app/containers/database/common/idc/detail.jsx @@ -0,0 +1,37 @@ +import React from 'react'; +import Popup from 'components/popup/draw'; +import FormGenerator from 'components/idcos-form/FormGenerator'; +import { get } from 'common/xFetch2'; +import { formSchema } from './formSchema'; +import { notification } from 'antd'; + +export default async function action(options) { + const record = options.records; + const res = await get(`/api/cloudboot/v1/idcs/${record.id}`); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + let initialValue = { ...res.content }; + initialValue.first_server_room = (res.content.first_server_room || []).map(it => it && it.name); + + Popup.open({ + title: '数据中心详情', + onCancel: () => { + Popup.close(); + }, + content: ( + <div> + <FormGenerator + initialValue={initialValue} + schema={formSchema(true)} + showCancel={false} + hideReset={true} + showSubmit={false} + onCancel={() => { + Popup.close(); + }} + /> + </div> + ) + }); +} diff --git a/cyclone-web/app/containers/database/common/idc/formSchema.jsx b/cyclone-web/app/containers/database/common/idc/formSchema.jsx new file mode 100644 index 0000000000000000000000000000000000000000..b08b3cb4e8ca8a5b6b741cbed80c95280f195516 --- /dev/null +++ b/cyclone-web/app/containers/database/common/idc/formSchema.jsx @@ -0,0 +1,93 @@ +import React from 'react'; +import { IDC_USAGE, IDC_STATUS, getSearchList } from 'common/enums'; + +export const formSchema = (disabled) => { + let elements = [ + { + id: 'name', + name: 'name', + label: '数据中心', + type: 'TextInput', + disabled: disabled, + rules: [ + { + required: true, + message: '请填写数据中心名称' + } + ] + }, + { + id: 'usage', + name: 'usage', + label: '用途', + type: 'Select', + disabled: disabled, + options: getSearchList(IDC_USAGE), + rules: [ + { + required: true, + message: '请选择用途' + } + ] + }, + { + id: 'first_server_room', + name: 'first_server_room', + label: '一级机房', + type: 'Select', + mode: 'tags', + disabled: disabled, + rules: [ + { + required: true, + message: '请填写一级机房' + } + ] + }, + { + id: 'vendor', + name: 'vendor', + label: '供应商', + type: 'TextInput', + disabled: disabled, + rules: [ + { + required: true, + message: '请填写供应商' + } + ] + } + ]; + //查看详情多加几个字段显示 + if (disabled) { + elements.push( + { + id: 'status', + name: 'status', + label: '状态', + type: 'Select', + disabled: disabled, + options: getSearchList(IDC_STATUS) + }, + { + id: 'created_at', + name: 'created_at', + label: '创建时间', + type: 'TextInput', + disabled: disabled + }, + { + id: 'updated_at', + name: 'updated_at', + label: '更新时间', + type: 'TextInput', + disabled: disabled + } + ); + } + return { + name: 'form', + id: 'form', + elements: elements + }; +}; diff --git a/cyclone-web/app/containers/database/common/network/detail.jsx b/cyclone-web/app/containers/database/common/network/detail.jsx new file mode 100644 index 0000000000000000000000000000000000000000..d00e6239485e70e71706f93ac8de718930dafea4 --- /dev/null +++ b/cyclone-web/app/containers/database/common/network/detail.jsx @@ -0,0 +1,47 @@ +import React from 'react'; +import Popup from 'components/popup/draw'; +import FormGenerator from 'components/idcos-form/FormGenerator'; +import { get } from 'common/xFetch2'; +import { formSchema } from './formSchema'; +import { notification } from 'antd'; + +export default async function action(options) { + const record = options.records; + const res = await get(`/api/cloudboot/v1/network-areas/${record.id}`); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + let initialValue = { ...res.content }; + + //增加和修改属性 + initialValue.server_room_id = res.content.server_room.id; + initialValue.physical_area = res.content.physical_area.map(it => it && it.name); + initialValue.idc_name = res.content.idc.name; + + //查看详情的机房信息不加载机房列表(模拟) + const room = { + loading: false, + data: [initialValue.server_room] + }; + + Popup.open({ + title: '网络区域详情', + onCancel: () => { + Popup.close(); + }, + content: ( + <div> + <FormGenerator + initialValue={initialValue} + schema={formSchema(true, { room })} + showCancel={false} + hideReset={true} + showSubmit={false} + onCancel={() => { + Popup.close(); + }} + /> + </div> + ) + }); +} diff --git a/cyclone-web/app/containers/database/common/network/formSchema.jsx b/cyclone-web/app/containers/database/common/network/formSchema.jsx new file mode 100644 index 0000000000000000000000000000000000000000..cccbc71d748b3c1c43b8b509bd6dbfb5641eba32 --- /dev/null +++ b/cyclone-web/app/containers/database/common/network/formSchema.jsx @@ -0,0 +1,97 @@ +import React from 'react'; +import { NET_STATUS, getSearchList } from 'common/enums'; + +export const formSchema = (disabled, options) => { + let elements = [ + { + id: 'name', + name: 'name', + label: '网络区域名称', + type: 'TextInput', + disabled: disabled, + rules: [ + { + required: true, + message: '请填写网络区域名称' + } + ] + }, + { + id: 'server_room_id', + name: 'server_room_id', + label: '机房管理单元', + type: 'Select', + disabled: disabled, + rules: [ + { + required: true, + message: '请选择机房管理单元' + } + ], + options: !options.room.loading ? (options.room.data || []).map(it => { + return { + label: it.name, value: it.id, key: it.id + }; + }) : [] + }, + { + id: 'physical_area', + name: 'physical_area', + label: '关联物理区域', + type: 'Select', + disabled: disabled, + rules: [ + { + required: true, + message: '请填写关联物理区域' + } + ], + mode: 'tags' + }, + { + id: 'status', + name: 'status', + label: '状态', + type: 'Select', + disabled: disabled, + options: getSearchList(NET_STATUS), + rules: [ + { + required: true, + message: '请选择状态' + } + ] + } + ]; + //查看详情多加几个字段显示 + if (disabled) { + elements.unshift({ + id: 'idc_name', + name: 'idc_name', + label: '数据中心', + type: 'TextInput', + disabled: disabled + }); + elements.push( + { + id: 'created_at', + name: 'created_at', + label: '创建时间', + type: 'TextInput', + disabled: disabled + }, + { + id: 'updated_at', + name: 'updated_at', + label: '更新时间', + type: 'TextInput', + disabled: disabled + } + ); + } + return { + name: 'form', + id: 'form', + elements: elements + }; +}; diff --git a/cyclone-web/app/containers/database/common/room/detail.jsx b/cyclone-web/app/containers/database/common/room/detail.jsx new file mode 100644 index 0000000000000000000000000000000000000000..8650bea23e972bf1c7bd20f89fd26caf4648abff --- /dev/null +++ b/cyclone-web/app/containers/database/common/room/detail.jsx @@ -0,0 +1,24 @@ +import React from 'react'; +import Popup from 'components/popup/draw'; +import MyForm from "./form"; +import { post, put } from 'common/xFetch2'; + +export default function action(options) { + Popup.open({ + title: '机房详情', + onCancel: () => { + Popup.close(); + }, + content: ( + <MyForm + idc={options.idc} + type={options.type} + id={options.records.id} + showSubmit={false} + onCancel={() => { + Popup.close(); + }} + /> + ) + }); +} diff --git a/cyclone-web/app/containers/database/common/room/form.jsx b/cyclone-web/app/containers/database/common/room/form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..880c0b64152d01fc6462add4d1ed8b97ad84d753 --- /dev/null +++ b/cyclone-web/app/containers/database/common/room/form.jsx @@ -0,0 +1,230 @@ +import React from 'react'; +import { get } from 'common/xFetch2'; +import { + Form, + Button, + notification, + Input, + Select +} from 'antd'; +const FormItem = Form.Item; +import { formItemLayout, tailFormItemLayout } from 'common/enums'; +const Option = Select.Option; + +class MyForm extends React.Component { + constructor(props) { + super(props); + this.state = { + initialValue: {} + }; + } + + componentDidMount() { + const { type, id } = this.props; + if (type.indexOf('detail') !== -1 || type === '_update') { + get(`/api/cloudboot/v1/server-rooms/${id}`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + const idc = res.content.idc || {}; + this.setState({ + initialValue: { + ...res.content, + idc_name: idc.name, + idc_data: JSON.stringify({ first_server_room: idc.first_server_room, id: idc.id }), + first_server_room: res.content.first_server_room.id + } + }); + }); + } + } + + handleSubmit = ev => { + ev && ev.preventDefault(); + ev && ev.stopPropagation(); + this.props.form.validateFields({ force: true }, (error, values) => { + if (error) { + notification.warning({ + message: '还有未填写完整的选项' + }); + return; + } + this.props.onSubmit(values); + }); + }; + + getRoom = (v) => { + //清空已选一级机房的值 + const { setFieldsValue } = this.props.form; + if (v) { + setFieldsValue({ first_server_room: null }); + } + }; + + render() { + const { idc, showSubmit, type } = this.props; + const { initialValue } = this.state; + const { getFieldDecorator, getFieldValue } = this.props.form; + const idc_data = JSON.parse(getFieldValue('idc_data') || initialValue.idc_data || '{}'); + + return ( + <div> + <Form onSubmit={this.handleSubmit}> + + { + type === 'room_detail' ? + <FormItem {...formItemLayout} label='数据中心' > + {getFieldDecorator('idc_name', { + initialValue: initialValue.idc_name, + rules: [ + { + required: true, + message: '请选择数据中心' + } + ] + })( + <Input disabled={!showSubmit}/> + )} + </FormItem> : + <FormItem {...formItemLayout} label='数据中心' > + {getFieldDecorator('idc_data', { + initialValue: initialValue.idc_data, + rules: [ + { + required: true, + message: '请选择数据中心' + } + ] + })( + <Select disabled={!showSubmit} onChange={(v) => this.getRoom(v)}> + { + !idc.loading && + idc.data.map((os, index) => <Option value={JSON.stringify({ first_server_room: os.first_server_room, id: os.id })} key={os.id}>{os.name}</Option>) + } + </Select> + )} + </FormItem> + } + + + + <FormItem {...formItemLayout} label='所属一级机房' > + {getFieldDecorator('first_server_room', { + initialValue: initialValue.first_server_room, + rules: [ + { + required: true, + message: '请选择所属一级机房' + } + ] + })( + <Select disabled={!showSubmit} > + { + (idc_data.first_server_room || []).map(item => <Option value={item.id} key={item.id}>{item.name}</Option>) + } + </Select> + )} + </FormItem> + <FormItem {...formItemLayout} label='机房管理单元' > + {getFieldDecorator('name', { + initialValue: initialValue.name, + rules: [ + { + required: true, + message: '请输入机房管理单元' + } + ] + })( + <Input disabled={!showSubmit} /> + )} + </FormItem> + <FormItem {...formItemLayout} label='城市' > + {getFieldDecorator('city', { + initialValue: initialValue.city, + rules: [ + { + required: true, + message: '请输入城市' + } + ] + })( + <Input disabled={!showSubmit} /> + )} + </FormItem> + <FormItem {...formItemLayout} label='地址' > + {getFieldDecorator('address', { + initialValue: initialValue.address, + rules: [ + { + required: true, + message: '请输入地址' + } + ] + })(<Input disabled={!showSubmit} />)} + </FormItem> + <FormItem {...formItemLayout} label='机房负责人' > + {getFieldDecorator('server_room_manager', { + initialValue: initialValue.server_room_manager, + rules: [ + { + required: true, + message: '请输入机房负责人' + } + ] + })(<Input disabled={!showSubmit} />)} + </FormItem> + <FormItem {...formItemLayout} label='供应商负责人' > + {getFieldDecorator('vendor_manager', { + initialValue: initialValue.vendor_manager, + rules: [ + { + required: true, + message: '请输入供应商负责人' + } + ] + })(<Input disabled={!showSubmit} />)} + </FormItem> + <FormItem {...formItemLayout} label='网络资产负责人' > + {getFieldDecorator('network_asset_manager', { + initialValue: initialValue.network_asset_manager, + rules: [ + { + required: true, + message: '请输入网络资产负责人' + } + ] + })(<Input disabled={!showSubmit} />)} + </FormItem> + <FormItem {...formItemLayout} label='7*24小时保障电话' > + {getFieldDecorator('support_phone_number', { + initialValue: initialValue.support_phone_number, + rules: [ + { + required: true, + message: '请输入7*24小时保障电话' + } + ] + })(<Input disabled={!showSubmit} />)} + </FormItem> + <FormItem {...tailFormItemLayout}> + <div className='pull-right'> + <Button onClick={() => this.props.onCancel()}>取消</Button> + { + showSubmit && + <Button + style={{ marginLeft: 8 }} + type='primary' + htmlType='submit' + > + 提交 + </Button> + } + </div> + </FormItem> + </Form> + </div> + ); + } +} + +export default Form.create()(MyForm); diff --git a/cyclone-web/app/containers/database/common/usite/detail.jsx b/cyclone-web/app/containers/database/common/usite/detail.jsx new file mode 100644 index 0000000000000000000000000000000000000000..fe2cd881ed7f90523529b8137b2bb2886369e1d6 --- /dev/null +++ b/cyclone-web/app/containers/database/common/usite/detail.jsx @@ -0,0 +1,25 @@ +import React from 'react'; +import Popup from 'components/popup/draw'; +import MyForm from "./form"; +import { post, put } from 'common/xFetch2'; + +export default function action(options) { + Popup.open({ + title: '机位详情', + onCancel: () => { + Popup.close(); + }, + content: ( + <MyForm + type={options.type} + room={options.room} + cabinet={options.cabinet} + id={options.records.id} + showSubmit={false} + onCancel={() => { + Popup.close(); + }} + /> + ) + }); +} diff --git a/cyclone-web/app/containers/database/common/usite/form.jsx b/cyclone-web/app/containers/database/common/usite/form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..be55f22f32a2288c310fae3b420d63f040f8ecbf --- /dev/null +++ b/cyclone-web/app/containers/database/common/usite/form.jsx @@ -0,0 +1,360 @@ +import React from 'react'; +import { get, getWithArgs } from 'common/xFetch2'; +import { + Form, + Button, + notification, + Input, + InputNumber, + Select +} from 'antd'; +const FormItem = Form.Item; +import { formItemLayout, tailFormItemLayout } from 'common/enums'; +import { getSearchList, USITE_STATUS } from "common/enums"; +const Option = Select.Option; +import Port from './port'; + + +class MyForm extends React.Component { + constructor(props) { + super(props); + this.state = { + initialValue: {}, + cabinet: [], + network_devices: [], + physicalAreas: [] + }; + } + + componentDidMount() { + + const { type, id } = this.props; + if (type === 'detail' || type === '_update') { + get(`/api/cloudboot/v1/server-usites/${id}`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + const content = res.content || {}; + // 编辑时需要根据机架拉取对应网络区域的所有枚举值 + getWithArgs('/api/cloudboot/v1/server-cabinets', { page: 1, page_size: 1000, server_room_id: content.server_room.id , server_cabinet_id: content.server_cabinet.id }).then(res => { + console.log(res) + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + res.content.records.map((it) => { + get(`/api/cloudboot/v1/physical-areas?network_area_id=${it.network_area.id}`).then(res => { + this.setState({ + physicalAreas: res.content.list || [] + }); + }); + }); + }); + + this.setState({ + initialValue: { + ...content, + server_cabinet_id: content.server_cabinet.id, + server_room_id: content.server_room.id, + //查看回显字段 + idc_name: content.idc.name + }, + //机架库 + cabinet: [content.server_cabinet] + }); + + + + + }); + } + if (type === '_update' || type === '_create') { + //不指定机架ID + getWithArgs(`/api/cloudboot/v1/network/devices`, { page: 1, + page_size: 10000 + // server_cabinet_id: this.props.server_cabinet_id + }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + this.setState({ + network_devices: res.content.records + }); + }); + } + + } + + getNetworkAreaId = (v, options) => { + const id = options.props.neworkAreaId; + get(`/api/cloudboot/v1/physical-areas?network_area_id=${id}`).then(res => { + this.setState({ + physicalAreas: res.content.list || [] + }); + }); + } + + getParamValue = (values, label) => { + const allKeys = Object.keys(values); + const target_keys = allKeys.filter( + key => key.indexOf(label) >= 0 + ); + let target = []; + target_keys.map(key => { + const id = key.replace(`${label}-name-`, ''); + if (values[`${label}-name-${id}`] || values[`${label}-port-${id}`]) { + target.push({ + name: values[`${label}-name-${id}`], + port: values[`${label}-port-${id}`] + }); + } + }); + return target; + }; + + handleSubmit = ev => { + ev && ev.preventDefault(); + ev && ev.stopPropagation(); + this.props.form.validateFields((error, values) => { + + values.extranet_switches = this.getParamValue(values, 'extranet_switches'); + values.oobnet_switches = this.getParamValue(values, 'oobnet_switches'); + values.intranet_switches = this.getParamValue(values, 'intranet_switches'); + + const allKeys = Object.keys(values); + const delete_keys = allKeys.filter( + key => key.indexOf('-name-') >= 0 || key.indexOf('-port-') >= 0 + ); + delete_keys.forEach(key => { + delete values[key]; + }); + if (error) { + notification.warning({ + message: '还有未填写完整的选项' + }); + return; + } + this.props.onSubmit(values); + }); + }; + + getCabinet = (v) => { + getWithArgs('/api/cloudboot/v1/server-cabinets', { page: 1, page_size: 1000, server_room_id: v }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + this.setState({ + cabinet: res.content.records + }); + + //清空已选机架的值 + const { setFieldsValue, getFieldValue } = this.props.form; + const cabinet = getFieldValue('server_cabinet_id'); + if (cabinet) { + setFieldsValue({ server_cabinet_id: null }); + } + }); + }; + + render() { + const { room, showSubmit } = this.props; + const { initialValue, network_devices } = this.state; + const { getFieldDecorator } = this.props.form; + + return ( + <div> + <Form onSubmit={this.handleSubmit}> + <FormItem {...formItemLayout} label='机位编号' > + {getFieldDecorator('number', { + initialValue: initialValue.number, + rules: [ + { + required: true, + message: '请填写机位编号' + } + ] + })(<Input disabled={!showSubmit}/>)} + </FormItem> + { + !showSubmit && + <FormItem {...formItemLayout} label='数据中心' > + {getFieldDecorator('idc_name', { + initialValue: initialValue.idc_name + })(<Input disabled={!showSubmit}/>)} + </FormItem> + } + <FormItem {...formItemLayout} label='机房管理单元' > + {getFieldDecorator('server_room_id', { + initialValue: initialValue.server_room_id, + rules: [ + { + required: true, + message: '请选择所属机房' + } + ] + })(<Select disabled={!showSubmit} onChange={(value) => this.getCabinet(value)}> + { + !room.loading && + room.data.map((os, index) => <Option value={os.id} key={os.id}>{os.name}</Option>) + } + </Select>)} + </FormItem> + <FormItem {...formItemLayout} label='机架编号' > + {getFieldDecorator('server_cabinet_id', { + initialValue: initialValue.server_cabinet_id, + rules: [ + { + required: true, + message: '请选择所属机架' + } + ] + })(<Select disabled={!showSubmit} onChange={this.getNetworkAreaId} showSearch={true} + filterOption={(input, option) => + option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0 + } + > + { + this.state.cabinet.map((os, index) => <Option neworkAreaId={os.network_area ? os.network_area.id : null} value={os.id} key={os.id}>{os.number}</Option>) + } + </Select>)} + </FormItem> + <FormItem {...formItemLayout} label='外网交换机_端口'> + {getFieldDecorator('extranet_switches', { + initialValue: initialValue.extranet_switches + })( + <Port network_devices={network_devices} label='外网交换机' required={false} name='extranet_switches' data={initialValue.extranet_switches} form={this.props.form} disabled={!showSubmit}/> + )} + </FormItem> + <FormItem {...formItemLayout} label={<span className='ant-form-item-required'>内网交换机_端口</span>}> + {getFieldDecorator('intranet_switches', { + initialValue: initialValue.intranet_switches + })( + <Port network_devices={network_devices} label='内网交换机' required={true} name='intranet_switches' data={initialValue.intranet_switches} form={this.props.form} disabled={!showSubmit}/> + )} + </FormItem> + <FormItem {...formItemLayout} label={<span className='ant-form-item-required'>管理交换机_端口</span>}> + {getFieldDecorator('oobnet_switches', { + initialValue: initialValue.oobnet_switches + })( + <Port network_devices={network_devices} label='管理交换机' required={true} name='oobnet_switches' data={initialValue.oobnet_switches} form={this.props.form} disabled={!showSubmit}/> + )} + </FormItem> + <FormItem {...formItemLayout} label='内外网端口速率' > + {getFieldDecorator('la_wa_port_rate', { + initialValue: initialValue.la_wa_port_rate, + rules: [ + { + required: true, + message: '请填写端口速率' + } + ] + })( + <Select> + <Option value='GE'>{'GE'}</Option> + <Option value='10GE'>{'10GE'}</Option> + <Option value='25GE'>{'25GE'}</Option> + <Option value='40GE'>{'40GE'}</Option> + </Select> + )} + </FormItem> + <FormItem {...formItemLayout} label='起始U数' > + {getFieldDecorator('beginning', { + initialValue: initialValue.beginning, + rules: [ + { + required: true, + message: '请填写起始U数' + } + ] + })(<InputNumber disabled={!showSubmit} style={{ width: '100%' }}/>)} + </FormItem> + <FormItem {...formItemLayout} label='机位高度' > + {getFieldDecorator('height', { + initialValue: initialValue.height, + rules: [ + { + required: true, + message: '请输入机位高度' + } + ] + })( + <InputNumber disabled={!showSubmit} min={1} precision={0} style={{ width: '100%' }}/> + )} + </FormItem> + <FormItem {...formItemLayout} label='物理区域' > + {getFieldDecorator('physical_area', { + initialValue: initialValue.physical_area, + rules: [ + { + required: true, + message: '请输入物理区域' + } + ] + })(<Select disabled={!showSubmit}> + { + (this.state.physicalAreas || []).map(it => <Option value={it.name}>{it.name}</Option>) + } + </Select>)} + </FormItem> + { + !showSubmit && + <FormItem {...formItemLayout} label='机位状态' > + {getFieldDecorator('status', { + initialValue: initialValue.status + })(<Select disabled={!showSubmit}> + { + getSearchList(USITE_STATUS).map((it) => <Option value={it.value} key={it.value}>{it.label}</Option>) + } + </Select>)} + </FormItem> + } + { + !showSubmit && + <FormItem {...formItemLayout} label='创建时间' > + {getFieldDecorator('created_at', { + initialValue: initialValue.created_at + })(<Input disabled={!showSubmit}/>)} + </FormItem> + } + { + !showSubmit && + <FormItem {...formItemLayout} label='创建用户' > + {getFieldDecorator('creator', { + initialValue: initialValue.creator + })(<Input disabled={!showSubmit}/>)} + </FormItem> + } + { + !showSubmit && + <FormItem {...formItemLayout} label='更新时间' > + {getFieldDecorator('updated_at', { + initialValue: initialValue.updated_at + })(<Input disabled={!showSubmit}/>)} + </FormItem> + } + <FormItem {...formItemLayout} label='备注' > + {getFieldDecorator('remark', { + initialValue: initialValue.remark + })(<Input.TextArea disabled={!showSubmit} />)} + </FormItem> + <FormItem {...tailFormItemLayout}> + <div className='pull-right'> + <Button onClick={() => this.props.onCancel()}>取消</Button> + { + showSubmit && + <Button + style={{ marginLeft: 8 }} + type='primary' + htmlType='submit' + > + 提交 + </Button> + } + </div> + </FormItem> + </Form> + </div> + ); + } +} + +export default Form.create()(MyForm); diff --git a/cyclone-web/app/containers/database/common/usite/port.jsx b/cyclone-web/app/containers/database/common/usite/port.jsx new file mode 100644 index 0000000000000000000000000000000000000000..7d8679ff1c9f2a7772354e9d05232fa95d4adac0 --- /dev/null +++ b/cyclone-web/app/containers/database/common/usite/port.jsx @@ -0,0 +1,108 @@ +import React from 'react'; +import { Select, Col, Form, Input, Icon } from 'antd'; +const FormItem = Form.Item; +import { formItemLayout } from 'common/enums'; +const Option = Select.Option; + +export default class Ports extends React.Component { + constructor(props) { + super(props); + this.state = { + data: [{ name: '', port: '' }] + }; + } + + + UNSAFE_componentWillReceiveProps(props) { + const { data } = props; + if (data && data.length > 0) { + this.setState({ + data: data + }); + } + } + $delete = (index) => { + const { data } = this.state; + data.splice(index, 1); + this.setState({ data }); + }; + add = () => { + const { data } = this.state; + data.push({ + name: '', + port: '' + }); + this.setState({ data }); + }; + render() { + const { disabled, form, name, label } = this.props; + const { getFieldDecorator } = form; + const { data } = this.state; + return ( + <div> + { + data.length === 0 && + <Icon type='plus-circle' style={{ color: 'rgb(139, 212, 109)', marginRight: 8 }} onClick={() => this.add()}/> + } + { + data.length > 0 && data.map((item, index) => { + return ( + <div> + <Col span={12}> + <FormItem > + {getFieldDecorator(`${name}-name-${index}`, { + initialValue: item.name, + rules: [ + { + required: this.props.required, + message: `请选择${label}名称` + } + ] + })( + <Select disabled={disabled} allowClear={true} showSearch={true} + filterOption={(input, option) => + option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0 + } + > + { + (this.props.network_devices || []).map(it => <Option value={it.name}>{it.name}</Option>) + } + </Select> + )} + </FormItem> + </Col> + <Col span={2}> + <span style={{ display: 'inline-block', width: '100%', textAlign: 'center' }}>_</span> + </Col> + <Col span={7}> + <FormItem > + {getFieldDecorator(`${name}-port-${index}`, { + initialValue: item.port, + rules: [ + { + required: this.props.required, + message: `请输入${label}端口` + } + ] + })( + <Input disabled={disabled} /> + )} + </FormItem> + </Col> + <Col span={1}/> + <Col span={2}> + { + !disabled && <div> + <Icon type='plus-circle' style={{ color: 'rgb(139, 212, 109)', marginRight: 8 }} onClick={() => this.add()}/> + {(index > 0 || !this.props.required) && <Icon type='minus-circle' style={{ color: 'rgb(255, 55, 0)' }} onClick={() => this.$delete(index)}/>} + </div> + } + </Col> + </div> + ); + }) + } + </div> + ); + } +} diff --git a/cyclone-web/app/containers/database/idc/actions/change-status.jsx b/cyclone-web/app/containers/database/idc/actions/change-status.jsx new file mode 100644 index 0000000000000000000000000000000000000000..39f26b3b7e5e3d9bd3fd7711be4aca1bfbd340bf --- /dev/null +++ b/cyclone-web/app/containers/database/idc/actions/change-status.jsx @@ -0,0 +1,34 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { put } from 'common/xFetch2'; + +export default function action(options) { + const records = options.records; + const status = options.type; + const ids = records.map(item => item.id); + const typeMap = { + 'accepted': '验收', + 'production': '投产', + 'abolished': '裁撤' + }; + const onSubmit = () => { + put('/api/cloudboot/v1/idcs/status', { status: status, ids: ids }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + options.reload(); + }); + }; + + confirm({ + title: `确定要${typeMap[status]}吗?`, + content: `已选择的数据${records.length}条`, + okText: '确定', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/database/idc/actions/create-update.jsx b/cyclone-web/app/containers/database/idc/actions/create-update.jsx new file mode 100644 index 0000000000000000000000000000000000000000..176e673609376c2342d6b3e30f14ab6edbeb2020 --- /dev/null +++ b/cyclone-web/app/containers/database/idc/actions/create-update.jsx @@ -0,0 +1,65 @@ +import React from 'react'; +import Popup from 'components/popup'; +import FormGenerator from 'components/idcos-form/FormGenerator'; +import { post, put } from 'common/xFetch2'; +import { notification } from 'antd'; +import { formSchema } from '../../common/idc/formSchema'; + + +export default function action(options) { + const record = options.records; + + const type = options.type; + const typeMap = { + _create: '新增数据中心', + _update: '编辑数据中心' + }; + + let initialValue = { ...record }; + + if (type === '_update') { + //一级机房数据回显 + initialValue.first_server_room = (record.first_server_room || []).map(it => it.name); + } + + const onSubmit = (values) => { + + let method = post; + let url = '/api/cloudboot/v1/idcs'; + if (type === '_update') { + method = put; + url = `/api/cloudboot/v1/idcs/${record.id}`; + } + + method(url, values).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + Popup.close(); + options.reload(); + }); + }; + + Popup.open({ + title: `${typeMap[type]}`, + width: 600, + onCancel: () => { + Popup.close(); + }, + content: ( + <div> + <FormGenerator + initialValue={initialValue} + schema={formSchema(false)} + showCancel={true} + hideReset={true} + onSubmit={(values) => onSubmit(values)} + onCancel={() => { + Popup.close(); + }} + /> + </div> + ) + }); +} diff --git a/cyclone-web/app/containers/database/idc/actions/delete.jsx b/cyclone-web/app/containers/database/idc/actions/delete.jsx new file mode 100644 index 0000000000000000000000000000000000000000..88854bacf34f1340ac99d530520103887773968e --- /dev/null +++ b/cyclone-web/app/containers/database/idc/actions/delete.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { del } from 'common/xFetch2'; + +export default function action(options) { + const records = options.records; + const onSubmit = () => { + del(`/api/cloudboot/v1/idcs/${records.id}`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + }); + }; + confirm({ + title: `确定要删除吗?`, + content: `数据中心名称:${records.name}`, + okText: '确定', + okType: 'danger', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/database/idc/actions/import.jsx b/cyclone-web/app/containers/database/idc/actions/import.jsx new file mode 100644 index 0000000000000000000000000000000000000000..ca161252067b33fbe2541e33786eeb7701740655 --- /dev/null +++ b/cyclone-web/app/containers/database/idc/actions/import.jsx @@ -0,0 +1,52 @@ +import React from 'react'; +import Popup from 'components/popup'; +import FileUpload from 'components/upload'; + +export default function action(options) { + const getColumns = () => { + return [ + { + title: '数据中心', + dataIndex: 'name' + }, + { + title: '用途', + dataIndex: 'usage' + }, + { + title: '一级机房', + dataIndex: 'first_server_room' + }, + { + title: '供应商', + dataIndex: 'vendor' + }, + { + title: '状态', + dataIndex: 'status' + } + ]; + }; + Popup.open({ + title: '导入数据', + width: 1500, + onCancel: () => { + Popup.close(); + }, + content: ( + <FileUpload + importApi='/api/cloudboot/v1/idcs/imports' + uploadApi='/api/cloudboot/v1/idcs/upload' + previewApi='/api/cloudboot/v1/idcs/imports/previews' + getColumns={getColumns} + onSuccess={() => { + Popup.close(); + options.reload(); + }} + onCancel={() => { + Popup.close(); + }} + /> + ) + }); +} diff --git a/cyclone-web/app/containers/database/idc/actions/index.js b/cyclone-web/app/containers/database/idc/actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..0c54b64ec4972d7adcd19bbddb160a8ca33a954f --- /dev/null +++ b/cyclone-web/app/containers/database/idc/actions/index.js @@ -0,0 +1,19 @@ +import _update from './create-update'; +import _create from './create-update'; +import _delete from './delete'; +import _import from './import'; +import detail from '../../common/idc/detail'; +import accepted from './change-status'; +import production from './change-status'; +import abolished from './change-status'; + +export default { + detail, + _update, + _delete, + _create, + _import, + accepted, + production, + abolished +}; diff --git a/cyclone-web/app/containers/database/idc/components/search-form.jsx b/cyclone-web/app/containers/database/idc/components/search-form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..52c7dc7d534ac1f31fd3a86dd4a520f37a7b0b19 --- /dev/null +++ b/cyclone-web/app/containers/database/idc/components/search-form.jsx @@ -0,0 +1,39 @@ +import React from 'react'; +import SearchForm from 'components/search-form'; +import { IDC_USAGE, IDC_STATUS, getSearchList } from 'common/enums'; + +export default class Search extends React.Component { + state = { + searchKeys: [ + { key: 'name', label: '数据中心' }, + { key: 'usage', label: '用途' }, + { key: 'first_server_room', label: '一级机房' }, + { key: 'vendor', label: '供应商' }, + { key: 'status', label: '状态' } + ], + searchValues: { + 'name': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'usage': { type: 'checkbox', list: getSearchList(IDC_USAGE) }, + 'first_server_room': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'vendor': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'status': { type: 'checkbox', list: getSearchList(IDC_STATUS) } + } + }; + + onSearch = (values) => { + this.props.dispatch({ + type: 'database-idc/table-data/search', + payload: { + ...values + } + }); + }; + + render() { + return ( + <SearchForm onSearch={this.onSearch} searchKeys={this.state.searchKeys} searchValues={this.state.searchValues}/> + ); + } +} + + diff --git a/cyclone-web/app/containers/database/idc/components/table.jsx b/cyclone-web/app/containers/database/idc/components/table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..e72bfe791ee0503b0eef087d9eaf6c32460bb54b --- /dev/null +++ b/cyclone-web/app/containers/database/idc/components/table.jsx @@ -0,0 +1,252 @@ +import React from 'react'; +import { get } from 'common/xFetch2'; +import { + Table, + Button, + Pagination, + notification, + Badge +} from 'antd'; +const ButtonGroup = Button.Group; +import actions from '../actions'; +import TableControlCell from 'components/TableControlCell'; +import { IDC_USAGE, IDC_STATUS_COLOR } from "common/enums"; +import { getPermissonBtn } from 'common/utils'; + +class MyTable extends React.Component { + + reload = () => { + this.props.dispatch({ + type: 'database-idc/table-data/reload' + }); + this.props.dispatch({ + type: 'database-idc/table-data/set/selectedRows', + payload: { + selectedRows: [], + selectedRowKeys: [] + } + }); + }; + + //批量操作入口 + batchExecAction = (name) => { + const { tableData } = this.props; + const selectedRows = tableData.selectedRows || []; + if (selectedRows.length < 1) { + return notification.error({ message: '请至少选择一条数据' }); + } + this.execAction(name, selectedRows); + }; + + //操作入口 + execAction = (name, records) => { + if (actions[name]) { + actions[name]({ + records, + initialValue: records, + type: name, + reload: () => { + this.reload(); + } + }); + } + }; + + //下载导入模板 + downloadImportTemplate = () => { + window.open('assets/files/idcs.xlsx'); + }; + + + getRowSelection = () => { + const selectedRowKeys = this.props.tableData.selectedRowKeys; + return { + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.props.dispatch({ + type: 'database-idc/table-data/set/selectedRows', + payload: { + selectedRowKeys, + selectedRows + } + }); + } + }; + }; + + changePage = page => { + this.props.dispatch({ + type: `database-idc/table-data/change-page`, + payload: { + page + } + }); + }; + + changePageSize = (page, pageSize) => { + this.props.dispatch({ + type: `database-idc/table-data/change-page-size`, + payload: { + page, + pageSize + } + }); + }; + + + getColumns = () => { + return [ + { + title: '数据中心', + dataIndex: 'name', + render: (text, record) => <a onClick={() => this.execAction('detail', record)}>{text}</a> + }, + { + title: '用途', + dataIndex: 'usage', + render: (text) => <span>{IDC_USAGE[text]}</span> + }, + { + title: '一级机房', + dataIndex: 'first_server_room', + render: (text) => <span>{(text || []).map(item => item.name).join(',')}</span> + }, + { + title: '供应商', + dataIndex: 'vendor' + }, + { + title: '状态', + dataIndex: 'status', + render: type => { + const color = IDC_STATUS_COLOR[type] ? IDC_STATUS_COLOR[type][0] : 'transparent'; + const word = IDC_STATUS_COLOR[type] ? IDC_STATUS_COLOR[type][1] : ''; + return ( + <div> + <Badge + dot={true} + style={{ + background: color + }} + />{' '} + &nbsp;&nbsp; {word} + </div> + ); + } + }, + { + title: '更新时间', + dataIndex: 'updated_at' + }, + { + title: '操作', + dataIndex: 'operate', + render: (text, record) => { + const commands = [ + { + name: '编辑', + command: '_update', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_idc_update') + }, + { + name: '删除', + command: '_delete', + type: 'danger', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_idc_delete') + } + ]; + return ( + <TableControlCell + commands={commands} + record={record} + execCommand={command => { + this.execAction(command, record); + }} + /> + ); + } + } + ]; + }; + + + render() { + const { tableData } = this.props; + const { loading, pagination, selectedRows } = tableData; + return ( + <div> + <div className='operate_btns'> + <Button + onClick={() => this.execAction('_create')} + type='primary' + style={{ marginRight: 8 }} + icon='plus' + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_idc_create')} + > + 新增 + </Button> + <Button.Group style={{ marginRight: 8 }}> + <Button + onClick={() => this.batchExecAction('accepted')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_idc_accepted')} + > + 验收 + </Button> + <Button + onClick={() => this.batchExecAction('production')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_idc_production')} + > + 投产 + </Button> + {/*<Button*/} + {/*onClick={() => this.batchExecAction('abolished')}*/} + {/*disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_idc_abolished')}*/} + {/*>*/} + {/*裁撤*/} + {/*</Button>*/} + </Button.Group> + <span> + 已选 { selectedRows.length } 项 + </span> + {/*<span className='pull-right'>*/} + {/*<ButtonGroup style={{ marginRight: 8 }}>*/} + {/*<Button*/} + {/*onClick={() => this.downloadImportTemplate()}*/} + {/*>*/} + {/*下载导入模板*/} + {/*</Button>*/} + {/*<Button*/} + {/*onClick={() => this.execAction('_import')}*/} + {/*>*/} + {/*导入*/} + {/*</Button>*/} + {/*</ButtonGroup>*/} + {/*</span>*/} + </div> + <div className='clearfix' /> + <Table + rowKey={'id'} + columns={this.getColumns()} + pagination={false} + dataSource={tableData.list} + rowSelection={this.getRowSelection()} + loading={loading} + /> + <div> + <Pagination + showTotal={(total) => `共 ${total} 条`} + showQuickJumper={true} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={this.changePageSize} + onChange={this.changePage} + /> + </div> + </div> + ); + } +} + +export default MyTable; diff --git a/cyclone-web/app/containers/database/idc/get-component.js b/cyclone-web/app/containers/database/idc/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..06ccc4f8c70f9a6b793f7f496ab49d6773b00e7b --- /dev/null +++ b/cyclone-web/app/containers/database/idc/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('database-idc', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/database/idc/index.jsx b/cyclone-web/app/containers/database/idc/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..ba6b0eacb59bbe742d5ab37f580534423b848df3 --- /dev/null +++ b/cyclone-web/app/containers/database/idc/index.jsx @@ -0,0 +1,48 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import SearchForm from './components/search-form'; +import Table from './components/table'; +import Layout from 'components/layout/page-layout'; + +class Container extends React.Component { + componentDidMount() { + this.props.dispatch({ + type: 'database-idc/table-data/get' + }); + } + + componentWillUnmount() { + this.props.dispatch({ + type: 'database-idc/table-data/reset' + }); + } + + render() { + const { tableData } = this.props.data; + return ( + <Layout title='数据中心管理'> + <SearchForm dispatch={this.props.dispatch}/> + <Table + dispatch={this.props.dispatch} + tableData={tableData} + userInfo={this.props.userInfo} + /> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + data: state.get('database-idc').toJS(), + userInfo: state.getIn([ 'global', 'userData' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/database/idc/reducers/index.js b/cyclone-web/app/containers/database/idc/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..da1b46d11958f266bd6db765304f784151015fd2 --- /dev/null +++ b/cyclone-web/app/containers/database/idc/reducers/index.js @@ -0,0 +1,16 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; + +const initialState = fromJS({ + tableData: createTableStore() +}); + +const reducer = handleActions( + { + ...createTableReducer('database-idc/table-data', 'tableData') + }, + initialState, +); + +export default reducer; diff --git a/cyclone-web/app/containers/database/idc/sagas/index.js b/cyclone-web/app/containers/database/idc/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..34c91528c779b09125c4c63c6639d9f2d74c3ed0 --- /dev/null +++ b/cyclone-web/app/containers/database/idc/sagas/index.js @@ -0,0 +1,22 @@ +import { get } from 'common/xFetch2'; + +let created = false; +function* empty() { + console.log(); +} + +import { createTableSaga } from 'utils/table-saga'; + +const jobTableSaga = createTableSaga({ + actionNamePrefix: 'database-idc/table-data', + tableDataPath: [ 'database-idc', 'tableData' ], + datasource: '/api/cloudboot/v1/idcs' +}); + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [jobTableSaga]; +} diff --git a/cyclone-web/app/containers/database/network/actions/change-status.jsx b/cyclone-web/app/containers/database/network/actions/change-status.jsx new file mode 100644 index 0000000000000000000000000000000000000000..ee67cf0d367ee37dc86e121dc783b14c81081710 --- /dev/null +++ b/cyclone-web/app/containers/database/network/actions/change-status.jsx @@ -0,0 +1,33 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { put } from 'common/xFetch2'; + +export default function action(options) { + const records = options.records; + const status = options.type; + const ids = records.map(item => item.id); + const typeMap = { + 'production': '投产', + 'offline': '下线' + }; + const onSubmit = () => { + put('/api/cloudboot/v1/network-areas/status', { status: status, ids: ids }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + options.reload(); + }); + }; + + confirm({ + title: `确定要${typeMap[status]}吗?`, + content: `已选择的数据${records.length}条`, + okText: '确定', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/database/network/actions/create-update.jsx b/cyclone-web/app/containers/database/network/actions/create-update.jsx new file mode 100644 index 0000000000000000000000000000000000000000..976b8704e911878873eb4c61b084764cbb1da138 --- /dev/null +++ b/cyclone-web/app/containers/database/network/actions/create-update.jsx @@ -0,0 +1,65 @@ +import React from 'react'; +import Popup from 'components/popup'; +import FormGenerator from 'components/idcos-form/FormGenerator'; +import { post, put } from 'common/xFetch2'; +import { notification } from 'antd'; +import { formSchema } from '../../common/network/formSchema'; + + +export default function action(options) { + const record = options.records; + const type = options.type; + + let initialValue = { ...record }; + + if (type === '_update') { + initialValue.server_room_id = record.server_room.id; + initialValue.physical_area = record.physical_area.map(it => it && it.name); + initialValue.idc_name = record.idc.name; + } + const typeMap = { + _create: '新增网络区域', + _update: '编辑网络区域' + }; + + const onSubmit = (values) => { + + let method = post; + let url = '/api/cloudboot/v1/network-areas'; + if (type === '_update') { + method = put; + url = `/api/cloudboot/v1/network-areas/${record.id}`; + } + + method(url, values).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + Popup.close(); + options.reload(); + }); + }; + + Popup.open({ + title: `${typeMap[type]}`, + width: 700, + onCancel: () => { + Popup.close(); + }, + content: ( + <div> + <FormGenerator + initialValue={initialValue} + schema={formSchema(false, options)} + showCancel={true} + hideReset={true} + onSubmit={(values) => onSubmit(values)} + onCancel={() => { + Popup.close(); + }} + /> + </div> + ) + }); +} diff --git a/cyclone-web/app/containers/database/network/actions/delete.jsx b/cyclone-web/app/containers/database/network/actions/delete.jsx new file mode 100644 index 0000000000000000000000000000000000000000..def1e9965c2dffdbd07795c0c1912e578ad71412 --- /dev/null +++ b/cyclone-web/app/containers/database/network/actions/delete.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { del } from 'common/xFetch2'; + +export default function action(options) { + const records = options.records; + const onSubmit = () => { + del(`/api/cloudboot/v1/network-areas/${records.id}`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + }); + }; + confirm({ + title: `确定要删除吗?`, + content: `数据中心名称:${records.name}`, + okText: '确定', + okType: 'danger', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/database/network/actions/import.jsx b/cyclone-web/app/containers/database/network/actions/import.jsx new file mode 100644 index 0000000000000000000000000000000000000000..5d2c80bd4ef9da5bb1ac20f95e2d4ab0e1ee270e --- /dev/null +++ b/cyclone-web/app/containers/database/network/actions/import.jsx @@ -0,0 +1,50 @@ +import React from 'react'; +import Popup from 'components/popup'; +import FileUpload from 'components/upload'; +import { NET_STATUS } from "common/enums"; + +export default function action(options) { + const getColumns = () => { + return [ + { + title: '网络区域名称', + dataIndex: 'name' + }, + { + title: '机房管理单元', + dataIndex: 'server_room_name' + }, + { + title: '关联物理区域', + dataIndex: 'physical_area' + }, + { + title: '状态', + dataIndex: 'status', + render: (text) => <span>{NET_STATUS[text]}</span> + } + ]; + }; + Popup.open({ + title: '导入数据', + width: 1500, + onCancel: () => { + Popup.close(); + }, + content: ( + <FileUpload + importApi='/api/cloudboot/v1/network-areas/imports' + uploadApi='/api/cloudboot/v1/network-areas/upload' + previewApi='/api/cloudboot/v1/network-areas/imports/previews' + getColumns={getColumns} + onSuccess={() => { + Popup.close(); + options.reload(); + }} + onCancel={() => { + Popup.close(); + }} + /> + ) + }); +} diff --git a/cyclone-web/app/containers/database/network/actions/index.js b/cyclone-web/app/containers/database/network/actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..efed87e10614f02e13bcf34b90d1cbe39edf7003 --- /dev/null +++ b/cyclone-web/app/containers/database/network/actions/index.js @@ -0,0 +1,19 @@ +import _update from './create-update'; +import _create from './create-update'; +import _delete from './delete'; +import _import from './import'; +import detail from '../../common/network/detail'; +import room_detail from '../../common/room/detail'; +import production from './change-status'; +import offline from './change-status'; + +export default { + detail, + room_detail, + _update, + _delete, + _create, + _import, + production, + offline +}; diff --git a/cyclone-web/app/containers/database/network/components/search-form.jsx b/cyclone-web/app/containers/database/network/components/search-form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..daa2e5fbfe4fd4c82311a5b3ef8279bea6e4d6a1 --- /dev/null +++ b/cyclone-web/app/containers/database/network/components/search-form.jsx @@ -0,0 +1,37 @@ +import React from 'react'; +import SearchForm from 'components/search-form'; +import { NET_STATUS, getSearchList } from 'common/enums'; + +export default class Search extends React.Component { + state = { + searchKeys: [ + { key: 'server_room_name', label: '机房管理单元' }, + { key: 'name', label: '网络区域名称' }, + { key: 'physical_area', label: '关联物理区域' }, + { key: 'status', label: '状态' } + ], + searchValues: { + 'server_room_name': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'name': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'physical_area': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'status': { type: 'checkbox', list: getSearchList(NET_STATUS) } + } + }; + + onSearch = (values) => { + this.props.dispatch({ + type: 'database-network/table-data/search', + payload: { + ...values + } + }); + }; + + render() { + return ( + <SearchForm onSearch={this.onSearch} searchKeys={this.state.searchKeys} searchValues={this.state.searchValues}/> + ); + } +} + + diff --git a/cyclone-web/app/containers/database/network/components/table.jsx b/cyclone-web/app/containers/database/network/components/table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..7057d50800d544c081380e7b84321e701a01011e --- /dev/null +++ b/cyclone-web/app/containers/database/network/components/table.jsx @@ -0,0 +1,241 @@ +import React from 'react'; +import { get } from 'common/xFetch2'; +import { + Table, + Button, + Pagination, + notification, + Badge +} from 'antd'; +const ButtonGroup = Button.Group; +import actions from '../actions'; +import TableControlCell from 'components/TableControlCell'; +import { NET_STATUS_COLOR } from "common/enums"; +import { getPermissonBtn } from 'common/utils'; + +class MyTable extends React.Component { + + reload = () => { + this.props.dispatch({ + type: 'database-network/table-data/reload' + }); + this.props.dispatch({ + type: 'database-network/table-data/set/selectedRows', + payload: { + selectedRows: [], + selectedRowKeys: [] + } + }); + }; + + //批量操作入口 + batchExecAction = (name) => { + const { tableData } = this.props; + const selectedRows = tableData.selectedRows || []; + if (selectedRows.length < 1) { + return notification.error({ message: '请至少选择一条数据' }); + } + this.execAction(name, selectedRows); + }; + + //操作入口 + execAction = (name, records) => { + if (actions[name]) { + actions[name]({ + records, + initialValue: records, + type: name, + room: this.props.room, + reload: () => { + this.reload(); + } + }); + } + }; + + //下载导入模板 + downloadImportTemplate = () => { + window.open('assets/files/network-areas.xlsx'); + }; + + + getRowSelection = () => { + const selectedRowKeys = this.props.tableData.selectedRowKeys; + return { + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.props.dispatch({ + type: 'database-network/table-data/set/selectedRows', + payload: { + selectedRowKeys, + selectedRows + } + }); + } + }; + }; + + changePage = page => { + this.props.dispatch({ + type: `database-network/table-data/change-page`, + payload: { + page + } + }); + }; + + changePageSize = (page, pageSize) => { + this.props.dispatch({ + type: `database-network/table-data/change-page-size`, + payload: { + page, + pageSize + } + }); + }; + + + getColumns = () => { + return [ + { + title: '网络区域名称', + dataIndex: 'name', + render: (text, record) => <a onClick={() => this.execAction('detail', record)}>{text}</a> + }, + { + title: '机房管理单元', + dataIndex: 'server_room', + render: (text, record) => <a onClick={() => this.execAction('room_detail', { id: text.id })}>{text.name}</a> + }, + { + title: '关联物理区域', + dataIndex: 'physical_area', + render: (text) => <span>{(text || []).map(it => it.name).join(',')}</span> + }, + { + title: '状态', + dataIndex: 'status', + render: type => { + const color = NET_STATUS_COLOR[type] ? NET_STATUS_COLOR[type][0] : 'transparent'; + const word = NET_STATUS_COLOR[type] ? NET_STATUS_COLOR[type][1] : ''; + return ( + <div> + <Badge + dot={true} + style={{ + background: color + }} + />{' '} + &nbsp;&nbsp; {word} + </div> + ); + } + }, + { + title: '操作', + dataIndex: 'operate', + render: (text, record) => { + const commands = [ + { + name: '编辑', + command: '_update', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_network_area_update') + }, + { + name: '删除', + command: '_delete', + type: 'danger', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_network_area_delete') + } + ]; + return ( + <TableControlCell + commands={commands} + record={record} + execCommand={command => { + this.execAction(command, record); + }} + /> + ); + } + } + ]; + }; + + + render() { + const { tableData } = this.props; + const { loading, pagination, selectedRows } = tableData; + return ( + <div> + <div className='operate_btns'> + <Button + onClick={() => this.execAction('_create')} + type='primary' + style={{ marginRight: 8 }} + icon='plus' + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_network_area_create')} + > + 新增 + </Button> + <Button.Group style={{ marginRight: 8 }}> + <Button + onClick={() => this.batchExecAction('production')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_network_area_production')} + > + 投产 + </Button> + {/*<Button*/} + {/*onClick={() => this.batchExecAction('offline')}*/} + {/*disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_network_area_offline')}*/} + {/*>*/} + {/*下线*/} + {/*</Button>*/} + </Button.Group> + <span> + 已选 { selectedRows.length } 项 + </span> + <span className='pull-right'> + <ButtonGroup style={{ marginRight: 8 }}> + <Button + onClick={() => this.downloadImportTemplate()} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_network_area_download')} + > + 下载导入模板 + </Button> + <Button + onClick={() => this.execAction('_import')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_network_area_import')} + > + 导入 + </Button> + </ButtonGroup> + </span> + </div> + <div className='clearfix' /> + <Table + rowKey={'id'} + columns={this.getColumns()} + pagination={false} + dataSource={tableData.list} + rowSelection={this.getRowSelection()} + loading={loading} + /> + <div> + <Pagination + showQuickJumper={true} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={this.changePageSize} + onChange={this.changePage} + showTotal={(total) => `共 ${total} 条`} + /> + </div> + </div> + ); + } +} + +export default MyTable; diff --git a/cyclone-web/app/containers/database/network/get-component.js b/cyclone-web/app/containers/database/network/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..f5a13e5430d38a26509ba5a0350b3b7517d5c4b6 --- /dev/null +++ b/cyclone-web/app/containers/database/network/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('database-network', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/database/network/index.jsx b/cyclone-web/app/containers/database/network/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..c9baf13e80dadbd8eea72c195af41cac53ae36e3 --- /dev/null +++ b/cyclone-web/app/containers/database/network/index.jsx @@ -0,0 +1,53 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import SearchForm from './components/search-form'; +import Table from './components/table'; +import Layout from 'components/layout/page-layout'; + +class Container extends React.Component { + componentDidMount() { + this.props.dispatch({ + type: 'database-network/table-data/get' + }); + //查询机房信息 + this.props.dispatch({ + type: 'database-network/room/get' + }); + } + + componentWillUnmount() { + this.props.dispatch({ + type: 'database-network/table-data/reset' + }); + } + + render() { + const { tableData, room } = this.props.data; + return ( + <Layout title='网络区域管理'> + <SearchForm dispatch={this.props.dispatch} room={room} /> + <Table + dispatch={this.props.dispatch} + tableData={tableData} + userInfo={this.props.userInfo} + room={room} + /> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + data: state.get('database-network').toJS(), + userInfo: state.getIn([ 'global', 'userData' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/database/network/reducers/index.js b/cyclone-web/app/containers/database/network/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..a1f7ae435fa1d1e1b04b3bbb3f0771ab7f3bfa77 --- /dev/null +++ b/cyclone-web/app/containers/database/network/reducers/index.js @@ -0,0 +1,22 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; +import { createRegularReducer } from 'utils/regular-reducer'; + +const initialState = fromJS({ + tableData: createTableStore(), + room: { + loading: true, + data: [] + } +}); + +const reducer = handleActions( + { + ...createTableReducer('database-network/table-data', 'tableData'), + ...createRegularReducer('database-network/room', 'room') + }, + initialState, +); + +export default reducer; diff --git a/cyclone-web/app/containers/database/network/sagas/index.js b/cyclone-web/app/containers/database/network/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..fbdabafe2ba1d307d0ed6062371605084655f0d0 --- /dev/null +++ b/cyclone-web/app/containers/database/network/sagas/index.js @@ -0,0 +1,26 @@ +import { getWithArgs } from 'common/xFetch2'; + +let created = false; +function* empty() { + yield; +} + +import { createTableListSaga } from 'utils/tableList-saga'; +const listSaga = createTableListSaga({ + actionNamePrefix: 'database-network/room', + datasource: '/api/cloudboot/v1/server-rooms' +}); +import { createTableSaga } from 'utils/table-saga'; +const jobTableSaga = createTableSaga({ + actionNamePrefix: 'database-network/table-data', + tableDataPath: [ 'database-network', 'tableData' ], + datasource: '/api/cloudboot/v1/network-areas' +}); + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [ jobTableSaga, listSaga ]; +} diff --git a/cyclone-web/app/containers/database/room/actions/change-status.jsx b/cyclone-web/app/containers/database/room/actions/change-status.jsx new file mode 100644 index 0000000000000000000000000000000000000000..9ccfe2a57e123ac08ab5ab73ca59d04628074235 --- /dev/null +++ b/cyclone-web/app/containers/database/room/actions/change-status.jsx @@ -0,0 +1,34 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { put } from 'common/xFetch2'; + +export default function action(options) { + const records = options.records; + const status = options.type; + const ids = records.map(item => item.id); + const typeMap = { + 'accepted': '验收', + 'production': '投产', + 'abolished': '裁撤' + }; + const onSubmit = () => { + put('/api/cloudboot/v1/server-rooms/status', { status: status, ids: ids }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + options.reload(); + }); + }; + + confirm({ + title: `确定要${typeMap[status]}吗?`, + content: `已选择的数据${records.length}条`, + okText: '确定', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/database/room/actions/create-update.jsx b/cyclone-web/app/containers/database/room/actions/create-update.jsx new file mode 100644 index 0000000000000000000000000000000000000000..c52313cffc76909684a7f4e060570affdf3acf08 --- /dev/null +++ b/cyclone-web/app/containers/database/room/actions/create-update.jsx @@ -0,0 +1,57 @@ +import React from 'react'; +import Popup from 'components/popup'; +import { post, put } from 'common/xFetch2'; +import { notification } from 'antd'; +import MyForm from '../../common/room/form'; + + +export default function action(options) { + const record = options.records || {}; + const type = options.type; + const typeMap = { + _create: '新增机房信息', + _update: '编辑机房信息' + }; + + const onSubmit = (values) => { + + let method = post; + let url = '/api/cloudboot/v1/server-rooms'; + if (type === '_update') { + method = put; + url = `/api/cloudboot/v1/server-rooms/${record.id}`; + } + values.idc_id = JSON.parse(values.idc_data || '{}').id; + delete values.idc_data; + method(url, values).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + Popup.close(); + options.reload(); + }); + }; + + Popup.open({ + title: `${typeMap[type]}`, + width: 700, + onCancel: () => { + Popup.close(); + }, + content: ( + <div> + <MyForm + id={record.id} + idc={options.idc} + type={type} + showSubmit={true} + onSubmit={(values) => onSubmit(values)} + onCancel={() => { + Popup.close(); + }} + /> + </div> + ) + }); +} diff --git a/cyclone-web/app/containers/database/room/actions/delete.jsx b/cyclone-web/app/containers/database/room/actions/delete.jsx new file mode 100644 index 0000000000000000000000000000000000000000..b5f0e64d3e28075997eeb0e521a5b85f46504f4e --- /dev/null +++ b/cyclone-web/app/containers/database/room/actions/delete.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { del } from 'common/xFetch2'; + +export default function action(options) { + const records = options.records; + const onSubmit = () => { + del(`/api/cloudboot/v1/server-rooms/${records.id}`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + }); + }; + confirm({ + title: `确定要删除吗?`, + content: `机房管理单元:${records.name}`, + okText: '确定', + okType: 'danger', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/database/room/actions/import.jsx b/cyclone-web/app/containers/database/room/actions/import.jsx new file mode 100644 index 0000000000000000000000000000000000000000..80eb6c6e5a412a1b76b4c914aabec8eb39748a85 --- /dev/null +++ b/cyclone-web/app/containers/database/room/actions/import.jsx @@ -0,0 +1,68 @@ +import React from 'react'; +import Popup from 'components/popup'; +import FileUpload from 'components/upload'; + +export default function action(options) { + const getColumns = () => { + return [ + { + title: '机房管理单元', + dataIndex: 'name' + }, + { + title: '数据中心', + dataIndex: 'idc_name' + }, + { + title: '所属一级机房', + dataIndex: 'first_server_room_name' + }, + { + title: '城市', + dataIndex: 'city' + }, + { + title: '机房地址', + dataIndex: 'address' + }, + { + title: '机房负责人', + dataIndex: 'server_room_manager' + }, + { + title: '供应商负责人', + dataIndex: 'vendor_manager' + }, + { + title: '网络资产负责人', + dataIndex: 'network_asset_manager' + }, + { + title: '7*24小时保障电话', + dataIndex: 'support_phone_number' + } + ]; + }; + Popup.open({ + title: '导入数据', + width: 1500, + onCancel: () => { + Popup.close(); + }, + content: ( + <FileUpload + importApi='/api/cloudboot/v1/server-rooms/imports' + uploadApi='/api/cloudboot/v1/server-rooms/upload' + previewApi='/api/cloudboot/v1/server-rooms/imports/previews' + getColumns={getColumns} + onSuccess={() => { + Popup.close(); + options.reload(); + }} + onCancel={() => { + Popup.close(); + }} + /> + ) + }); +} diff --git a/cyclone-web/app/containers/database/room/actions/index.js b/cyclone-web/app/containers/database/room/actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..8a33d5f25df602c05f8437837c0e4e98109ff159 --- /dev/null +++ b/cyclone-web/app/containers/database/room/actions/index.js @@ -0,0 +1,21 @@ +import _update from './create-update'; +import _create from './create-update'; +import _delete from './delete'; +import _import from './import'; +import detail from '../../common/room/detail'; +import idc_detail from '../../common/idc/detail'; +import accepted from './change-status'; +import production from './change-status'; +import abolished from './change-status'; + +export default { + detail, + idc_detail, + _update, + _delete, + _create, + _import, + accepted, + production, + abolished +}; diff --git a/cyclone-web/app/containers/database/room/components/search-form.jsx b/cyclone-web/app/containers/database/room/components/search-form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..d775c6db798dd0320f4ad3a182f0abd9ca955f03 --- /dev/null +++ b/cyclone-web/app/containers/database/room/components/search-form.jsx @@ -0,0 +1,65 @@ +import React from 'react'; +import SearchForm from 'components/search-form'; +import { IDC_STATUS, getSearchList } from 'common/enums'; + +export default class Search extends React.Component { + state = { + searchKeys: [ + { key: 'idc_id/first_server_room', label: '数据中心 / 所属一级机房' }, + { key: 'name', label: '机房管理单元' }, + { key: 'city', label: '城市' }, + { key: 'address', label: '机房地址' }, + { key: 'server_room_manager', label: '机房负责人' }, + { key: 'vendor_manager', label: '供应商负责人' }, + { key: 'network_asset_manager', label: '网络资产负责人' }, + { key: 'support_phone_number', label: '7*24小时保障电话' }, + { key: 'status', label: '状态' } + ], + searchValues: { + 'idc_id/first_server_room': { type: 'cascader_ysnc', list: [] }, + 'name': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'city': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'address': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'server_room_manager': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'vendor_manager': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'network_asset_manager': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'support_phone_number': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'status': { type: 'checkbox', list: getSearchList(IDC_STATUS) } + } + }; + + UNSAFE_componentWillReceiveProps(props) { + const { idc } = props; + const searchValues = this.state.searchValues; + if (!idc.loading && idc.loading !== this.props.idc.loading) { + searchValues['idc_id/first_server_room'].list = (idc.data || []).map(it => { + return { + label: it.name, value: it.id, children: it.first_server_room + }; + }); + this.setState({ searchValues }); + } + } + + onSearch = (values) => { + if (values['idc_id/first_server_room']) { + values['idc_id'] = values['idc_id/first_server_room'][0]; + values['first_server_room'] = values['idc_id/first_server_room'][1]; + } + delete values['idc_id/first_server_room']; + this.props.dispatch({ + type: 'database-room/table-data/search', + payload: { + ...values + } + }); + }; + + render() { + return ( + <SearchForm onSearch={this.onSearch} searchKeys={this.state.searchKeys} searchValues={this.state.searchValues}/> + ); + } +} + + diff --git a/cyclone-web/app/containers/database/room/components/table.jsx b/cyclone-web/app/containers/database/room/components/table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..3fd97026f247fb654a46b22772977ab8566a7d94 --- /dev/null +++ b/cyclone-web/app/containers/database/room/components/table.jsx @@ -0,0 +1,309 @@ +import React from 'react'; +import { get } from 'common/xFetch2'; +import { + Table, + Button, + Pagination, + notification, + Badge +} from 'antd'; +const ButtonGroup = Button.Group; +import TableControlCell from 'components/TableControlCell'; +import actions from '../actions'; +import { IDC_STATUS_COLOR } from "common/enums"; +import { renderDisplayMore } from 'common/utils'; +const plainOptions = [ + { value: 'vendor_manager', name: '供应商负责人' }, + { value: 'network_asset_manager', name: '网络资产负责人' }, + { value: 'support_phone_number', name: '7*24小时保障电话' } +]; +import { getPermissonBtn } from 'common/utils'; + +class MyTable extends React.Component { + + state = { + checkedList: [], + indeterminate: false, + checkAll: false + }; + + reload = () => { + this.props.dispatch({ + type: 'database-room/table-data/reload' + }); + this.props.dispatch({ + type: 'database-room/table-data/set/selectedRows', + payload: { + selectedRows: [], + selectedRowKeys: [] + } + }); + }; + + //批量操作入口 + batchExecAction = (name) => { + const { tableData } = this.props; + const selectedRows = tableData.selectedRows || []; + if (selectedRows.length <= 0) { + return notification.error({ message: '请至少选择一条数据' }); + } + this.execAction(name, selectedRows); + }; + + //单个操作入口 + oneExecAction = (name) => { + const { tableData } = this.props; + const selectedRows = tableData.selectedRows || []; + if (selectedRows.length !== 1) { + return notification.error({ message: '请选择一条数据' }); + } + this.execAction(name, selectedRows[0]); + }; + + //操作入口 + execAction = (name, records) => { + if (actions[name]) { + actions[name]({ + records, + initialValue: records, + type: name, + idc: this.props.idc, + reload: () => { + this.reload(); + } + }); + } + }; + + //下载导入模板 + downloadImportTemplate = () => { + window.open('assets/files/server-rooms.xlsx'); + }; + + + getRowSelection = () => { + const selectedRowKeys = this.props.tableData.selectedRowKeys; + return { + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.props.dispatch({ + type: 'database-room/table-data/set/selectedRows', + payload: { + selectedRowKeys, + selectedRows + } + }); + } + }; + }; + + changePage = page => { + this.props.dispatch({ + type: `database-room/table-data/change-page`, + payload: { + page + } + }); + }; + + changePageSize = (page, pageSize) => { + this.props.dispatch({ + type: `database-room/table-data/change-page-size`, + payload: { + page, + pageSize + } + }); + }; + + + getColumns = () => { + const columns = [ + { + title: '机房管理单元', + dataIndex: 'name', + render: (text, record) => <a onClick={() => this.execAction('detail', record)}>{text}</a> + }, + { + title: '数据中心', + dataIndex: 'idc', + render: (text, record) => <a onClick={() => this.execAction('idc_detail', { id: text.id })}>{text.name}</a> + }, + { + title: '所属一级机房', + dataIndex: 'first_server_room', + render: (text, record) => <span>{text.name}</span> + }, + { + title: '状态', + dataIndex: 'status', + width: 90, + render: type => { + const color = IDC_STATUS_COLOR[type] ? IDC_STATUS_COLOR[type][0] : 'transparent'; + const word = IDC_STATUS_COLOR[type] ? IDC_STATUS_COLOR[type][1] : ''; + return ( + <div> + <Badge + dot={true} + style={{ + background: color + }} + />{' '} + &nbsp;&nbsp; {word} + </div> + ); + } + }, + { + title: '城市', + dataIndex: 'city' + }, + { + title: '地址', + dataIndex: 'address' + }, + { + title: '机架数', + dataIndex: 'cabinet_count' + }, + { + title: '机房负责人', + dataIndex: 'server_room_manager' + }, + { + title: '供应商负责人', + dataIndex: 'vendor_manager' + }, + { + title: '网络资产负责人', + dataIndex: 'network_asset_manager' + }, + { + title: '7*24小时保障电话', + dataIndex: 'support_phone_number' + }, + { + title: '操作', + dataIndex: 'operate', + width: 100, + render: (text, record) => { + const commands = [ + { + name: '编辑', + command: '_update', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_server_room_update') + }, + { + name: '删除', + command: '_delete', + type: 'danger', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_server_room_delete') + } + ]; + return ( + <TableControlCell + commands={commands} + record={record} + execCommand={command => { + this.execAction(command, record); + }} + /> + ); + } + } + ]; + // if (this.state.checkedList.length > 0) { + // this.state.checkedList.forEach(data => { + // columns.push({ + // title: data.name, + // dataIndex: data.value + // }); + // }); + // } + return columns; + }; + + + render() { + const { tableData } = this.props; + const { loading, pagination, selectedRows } = tableData; + return ( + <div> + <div className='operate_btns'> + <Button + onClick={() => this.execAction('_create')} + type='primary' + style={{ marginRight: 8 }} + icon='plus' + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_server_room_create')} + > + 新增 + </Button> + <Button.Group style={{ marginRight: 8 }}> + <Button + onClick={() => this.batchExecAction('accepted')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_server_room_accepted')} + > + 验收 + </Button> + <Button + onClick={() => this.batchExecAction('production')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_server_room_production')} + > + 投产 + </Button> + {/*<Button*/} + {/*onClick={() => this.batchExecAction('abolished')}*/} + {/*disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_server_room_abolished')}*/} + {/*>*/} + {/*裁撤*/} + {/*</Button>*/} + </Button.Group> + <span> + 已选 { selectedRows.length } 项 + </span> + <span className='pull-right'> + <ButtonGroup style={{ marginRight: 8 }}> + <Button + onClick={() => this.downloadImportTemplate()} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_server_room_download')} + > + 下载导入模板 + </Button> + <Button + onClick={() => this.execAction('_import')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_server_room_import')} + > + 导入 + </Button> + </ButtonGroup> + {/*{renderDisplayMore(this, plainOptions)}*/} + </span> + </div> + <div className='clearfix' /> + <Table + rowKey={'id'} + columns={this.getColumns()} + pagination={false} + dataSource={tableData.list} + rowSelection={this.getRowSelection()} + loading={loading} + /> + <div> + <Pagination + showTotal={(total) => `共 ${total} 条`} + showQuickJumper={true} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={this.changePageSize} + onChange={this.changePage} + /> + </div> + </div> + ); + } +} + +export default MyTable; diff --git a/cyclone-web/app/containers/database/room/get-component.js b/cyclone-web/app/containers/database/room/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..e635d49ae4c7502a2942dd941593e2765a72da7d --- /dev/null +++ b/cyclone-web/app/containers/database/room/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('database-room', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/database/room/index.jsx b/cyclone-web/app/containers/database/room/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..d1068b98a9d8fe0b027be7dfc106de7a0df4edb7 --- /dev/null +++ b/cyclone-web/app/containers/database/room/index.jsx @@ -0,0 +1,53 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import SearchForm from './components/search-form'; +import Table from './components/table'; +import Layout from 'components/layout/page-layout'; + +class Container extends React.Component { + componentDidMount() { + this.props.dispatch({ + type: 'database-room/table-data/get' + }); + //获取数据中心数据 + this.props.dispatch({ + type: 'database-room/idc/get' + }); + } + + componentWillUnmount() { + this.props.dispatch({ + type: 'database-room/table-data/reset' + }); + } + + render() { + const { tableData, idc } = this.props.data; + return ( + <Layout title='机房信息管理'> + <SearchForm idc={idc} dispatch={this.props.dispatch}/> + <Table + dispatch={this.props.dispatch} + tableData={tableData} + userInfo={this.props.userInfo} + idc={idc} + /> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + data: state.get('database-room').toJS(), + userInfo: state.getIn([ 'global', 'userData' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/database/room/reducers/index.js b/cyclone-web/app/containers/database/room/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..15e087667adcf4eab0300d7b53d33de6d7bcbfe2 --- /dev/null +++ b/cyclone-web/app/containers/database/room/reducers/index.js @@ -0,0 +1,22 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; +import { createRegularReducer } from 'utils/regular-reducer'; + +const initialState = fromJS({ + tableData: createTableStore(), + idc: { + loading: true, + data: [] + } +}); + +const reducer = handleActions( + { + ...createTableReducer('database-room/table-data', 'tableData'), + ...createRegularReducer('database-room/idc', 'idc') + }, + initialState, +); + +export default reducer; diff --git a/cyclone-web/app/containers/database/room/sagas/index.js b/cyclone-web/app/containers/database/room/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..e3dbe2baf3cbfdbc6e32d40470b5446f933e3497 --- /dev/null +++ b/cyclone-web/app/containers/database/room/sagas/index.js @@ -0,0 +1,27 @@ +import { getWithArgs } from 'common/xFetch2'; + +let created = false; +function* empty() { + console.log(); +} + +import { createTableListSaga } from 'utils/tableList-saga'; +const listSaga = createTableListSaga({ + actionNamePrefix: 'database-room/idc', + datasource: '/api/cloudboot/v1/idcs' +}); + +import { createTableSaga } from 'utils/table-saga'; +const jobTableSaga = createTableSaga({ + actionNamePrefix: 'database-room/table-data', + tableDataPath: [ 'database-room', 'tableData' ], + datasource: '/api/cloudboot/v1/server-rooms' +}); + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [ jobTableSaga, listSaga ]; +} diff --git a/cyclone-web/app/containers/database/store-room-detail/actions/create.jsx b/cyclone-web/app/containers/database/store-room-detail/actions/create.jsx new file mode 100644 index 0000000000000000000000000000000000000000..f7cb276481afad1795f5b504d81d4f5d10c66c14 --- /dev/null +++ b/cyclone-web/app/containers/database/store-room-detail/actions/create.jsx @@ -0,0 +1,67 @@ +import React from 'react'; +import Popup from 'components/popup'; +import { post } from 'common/xFetch2'; +import { notification } from 'antd'; +import FormGenerator from 'components/idcos-form/FormGenerator'; + +const formSchema = (disabled) => { + let elements = [ + { + id: 'number', + name: 'number', + label: '货架编号', + type: 'TextInput', + disabled: disabled, + rules: [ + { + required: true, + message: '请填写货架编号' + } + ] + }, + { + id: 'remark', + name: 'remark', + label: '备注', + type: 'Textarea', + disabled: disabled + } + ]; + return { + name: 'form', + id: 'form', + elements: elements + }; +}; +export default function action(options) { + const onSubmit = (values) => { + values.store_room_id = Number(options.id); + post('/api/cloudboot/v1/virtual-cabinet', values).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + Popup.close(); + options.reload(); + }); + }; + + Popup.open({ + title: `新增虚拟货架`, + width: 600, + onCancel: () => { + Popup.close(); + }, + content: ( + <FormGenerator + schema={formSchema(false)} + showCancel={true} + hideReset={true} + onSubmit={(values) => onSubmit(values)} + onCancel={() => { + Popup.close(); + }} + /> + ) + }); +} diff --git a/cyclone-web/app/containers/database/store-room-detail/actions/delete.jsx b/cyclone-web/app/containers/database/store-room-detail/actions/delete.jsx new file mode 100644 index 0000000000000000000000000000000000000000..a70825dd69ac272111862f6febe866fe60b1e653 --- /dev/null +++ b/cyclone-web/app/containers/database/store-room-detail/actions/delete.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { del } from 'common/xFetch2'; + +export default function action(options) { + const records = options.records; + const onSubmit = () => { + del(`/api/cloudboot/v1/virtual-cabinet/${records.id}`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + }); + }; + confirm({ + title: `确定要删除吗?`, + content: `虚拟货架编号:${records.number}`, + okText: '确定', + okType: 'danger', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/database/store-room-detail/actions/index.js b/cyclone-web/app/containers/database/store-room-detail/actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..39d825a4173773a19e5f10b8a0bb49e2fc4d55f1 --- /dev/null +++ b/cyclone-web/app/containers/database/store-room-detail/actions/index.js @@ -0,0 +1,8 @@ +import _create from './create'; +import _delete from './delete'; + + +export default { + _delete, + _create +}; diff --git a/cyclone-web/app/containers/database/store-room-detail/components/form-detail.jsx b/cyclone-web/app/containers/database/store-room-detail/components/form-detail.jsx new file mode 100644 index 0000000000000000000000000000000000000000..11666106e1f70926f00d07be2429b190cf1df6f3 --- /dev/null +++ b/cyclone-web/app/containers/database/store-room-detail/components/form-detail.jsx @@ -0,0 +1,52 @@ +import React from 'react'; +import { + Row +} from 'antd'; +import { renderFormDetail } from 'common/utils'; + +export default class Detail extends React.Component { + constructor(props) { + super(props); + } + render() { + const { loading, data } = this.props.detailInfo; + return ( + loading ? <div>加载中...</div> : + <Row> + {renderFormDetail([ + { + label: '库房名称', + value: data.name + }, + { + label: '数据中心', + value: data.idc.name + }, + { + label: '一级机房', + value: data.first_server_room.name + }, + { + label: '城市', + value: data.city + }, + { + label: '地址', + value: data.address + }, + { + label: '库房负责人', + value: data.store_room_manager + }, + { + label: '供应商负责人', + value: data.vendor_manager + } + ])} + </Row> + + ); + } + + +} diff --git a/cyclone-web/app/containers/database/store-room-detail/components/table.jsx b/cyclone-web/app/containers/database/store-room-detail/components/table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..b3a8412c9dbacea064352dc41befd5eeb8b2ef8d --- /dev/null +++ b/cyclone-web/app/containers/database/store-room-detail/components/table.jsx @@ -0,0 +1,175 @@ +import React from 'react'; +import { + Table, + Button, + Pagination, + Badge +} from 'antd'; +import actions from '../actions'; +import TableControlCell from 'components/TableControlCell'; +import { CAB_STATUS_COLOR } from "common/enums"; +import { getPermissonBtn } from 'common/utils'; + +class MyTable extends React.Component { + + //操作入口 + execAction = (name, records) => { + if (actions[name]) { + actions[name]({ + records, + id: this.props.id, + reload: () => { + this.props.reload(); + } + }); + } + }; + + + getRowSelection = () => { + const selectedRowKeys = this.props.tableData.selectedRowKeys; + return { + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.props.dispatch({ + type: 'database-store-detail/table-data/set/selectedRows', + payload: { + selectedRowKeys, + selectedRows + } + }); + } + }; + }; + + changePage = page => { + this.props.dispatch({ + type: `database-store-detail/table-data/change-page`, + payload: { + page + } + }); + }; + + changePageSize = (page, pageSize) => { + this.props.dispatch({ + type: `database-store-detail/table-data/change-page-size`, + payload: { + page, + pageSize + } + }); + }; + + + getColumns = () => { + return [ + { + title: '货架编号', + dataIndex: 'number' + }, + { + title: '创建者', + dataIndex: 'creator' + }, + { + title: '创建时间', + dataIndex: 'created_at' + }, + { + title: '修改时间', + dataIndex: 'updated_at' + }, + { + title: '备注', + dataIndex: 'remark' + }, + { + title: '状态', + dataIndex: 'status', + width: 100, + render: type => { + const color = CAB_STATUS_COLOR[type] ? CAB_STATUS_COLOR[type][0] : 'transparent'; + const word = CAB_STATUS_COLOR[type] ? CAB_STATUS_COLOR[type][1] : ''; + return ( + <div> + <Badge + dot={true} + style={{ + background: color + }} + />{' '} + &nbsp;&nbsp; {word} + </div> + ); + } + }, + { + title: '操作', + dataIndex: 'operate', + render: (text, record) => { + const commands = [ + { + name: '删除', + command: '_delete', + type: 'danger', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_virtual_cabinet_delete') + } + ]; + return ( + <TableControlCell + commands={commands} + record={record} + execCommand={command => { + this.execAction(command, record); + }} + /> + ); + } + } + ]; + }; + + + render() { + const { tableData } = this.props; + const { loading, pagination } = tableData; + return ( + <div> + <div className='operate_btns'> + <Button + onClick={() => this.execAction('_create')} + type='primary' + style={{ marginTop: 8 }} + icon='plus' + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_virtual_cabinet_create')} + > + 新增 + </Button> + </div> + <Table + rowKey={'id'} + columns={this.getColumns()} + pagination={false} + dataSource={tableData.list} + // rowSelection={this.getRowSelection()} + loading={loading} + /> + <div> + <Pagination + showTotal={(total) => `共 ${total} 条`} + showQuickJumper={true} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={this.changePageSize} + onChange={this.changePage} + /> + </div> + </div> + ); + } +} + +export default MyTable; diff --git a/cyclone-web/app/containers/database/store-room-detail/get-component.js b/cyclone-web/app/containers/database/store-room-detail/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..28d948b0b89f9e0748721ac3b618befd98747921 --- /dev/null +++ b/cyclone-web/app/containers/database/store-room-detail/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('database-store-detail', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/database/store-room-detail/index.jsx b/cyclone-web/app/containers/database/store-room-detail/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..355381389659d0631e0c6d1f8a5199617d7e7dca --- /dev/null +++ b/cyclone-web/app/containers/database/store-room-detail/index.jsx @@ -0,0 +1,65 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import Layout from 'components/layout/page-layout'; +import { getBreadcrumb } from 'common/utils'; +import Detail from './components/form-detail'; +import Table from './components/table'; +import { getPermissonBtn } from 'common/utils'; + +class Container extends React.Component { + state = { + id: this.props.params.id + }; + + componentDidMount() { + this.reload(); + this.props.dispatch({ + type: 'database-store-detail/detail-info/get', + payload: this.state.id + }); + } + + //获取虚拟货架列表 + reload = () => { + this.props.dispatch({ + type: 'database-store-detail/table-data/search', + payload: { store_room_id: this.state.id } + }); + }; + + render() { + const { detailInfo, tableData } = this.props.data; + + return ( + <Layout> + {getBreadcrumb(this.state.id, '/database/store-room')} + <h3 className='detail-title'>基本信息</h3> + <div className='detail-info'> + <Detail detailInfo={detailInfo}/> + </div> + <h3 className='detail-title'>虚拟货架</h3> + <Table + dispatch={this.props.dispatch} + tableData={tableData} + userInfo={this.props.userInfo} + reload={this.reload} + id={this.state.id} + /> + </Layout> + ); + } +} +function mapStateToProps(state) { + return { + data: state.get('database-store-detail').toJS(), + userInfo: state.getIn([ 'global', 'userData' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/database/store-room-detail/reducers/index.js b/cyclone-web/app/containers/database/store-room-detail/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..4823c20861fa2192a0330a6c2d10cca1eb318770 --- /dev/null +++ b/cyclone-web/app/containers/database/store-room-detail/reducers/index.js @@ -0,0 +1,24 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createRegularReducer } from 'utils/regular-reducer'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; + + +const initialState = fromJS({ + detailInfo: { + loading: true, + data: {} + }, + tableData: createTableStore() +}); + +const reducer = handleActions( + { + ...createRegularReducer('database-store-detail/detail-info', 'detailInfo'), + ...createTableReducer('database-store-detail/table-data', 'tableData') + }, + initialState +); + + +export default reducer; diff --git a/cyclone-web/app/containers/database/store-room-detail/sagas/index.js b/cyclone-web/app/containers/database/store-room-detail/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..d43fc4528c6131d2db80a41243e00e0bfeffeef5 --- /dev/null +++ b/cyclone-web/app/containers/database/store-room-detail/sagas/index.js @@ -0,0 +1,50 @@ +import { get, getWithArgs } from 'common/xFetch2'; +import { takeEvery } from 'redux-saga'; +import { call, put } from 'redux-saga/effects'; +import { notification } from 'antd'; + +let created = false; +function* empty() { + return; +} + +function* defaultSaga() { + const watchers = yield [ + takeEvery('database-store-detail/detail-info/get', getDetailInfo) + ]; +} + +function* getDetailInfo(action) { + try { + yield put({ + type: 'database-store-detail/detail-info/load' + }); + + const res = yield call(get, `/api/cloudboot/v1/store-room/${action.payload}`); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + yield put({ + type: 'database-store-detail/detail-info/load/success', + payload: res.content + }); + + } catch (error) { + console.log(error); + } +} +import { createTableSaga } from 'utils/table-saga'; + +const jobTableSaga = createTableSaga({ + actionNamePrefix: 'database-store-detail/table-data', + tableDataPath: [ 'database-store-detail', 'tableData' ], + datasource: '/api/cloudboot/v1/virtual-cabinets' +}); + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [ defaultSaga, jobTableSaga ]; +} diff --git a/cyclone-web/app/containers/database/store-room/actions/create-update.jsx b/cyclone-web/app/containers/database/store-room/actions/create-update.jsx new file mode 100644 index 0000000000000000000000000000000000000000..e220f3c18aefbf1a5b5f608318737d706629d487 --- /dev/null +++ b/cyclone-web/app/containers/database/store-room/actions/create-update.jsx @@ -0,0 +1,57 @@ +import React from 'react'; +import Popup from 'components/popup'; +import { post, put } from 'common/xFetch2'; +import { notification } from 'antd'; +import MyForm from './form'; + + +export default function action(options) { + const record = options.records || {}; + const type = options.type; + const typeMap = { + _create: '新增库房单元', + _update: '编辑库房单元' + }; + + const onSubmit = (values) => { + + let method = post; + let url = '/api/cloudboot/v1/store-room'; + if (type === '_update') { + method = put; + values.id = record.id; + } + values.idc_id = JSON.parse(values.idc_data || '{}').id; + delete values.idc_data; + method(url, values).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + Popup.close(); + options.reload(); + }); + }; + + Popup.open({ + title: `${typeMap[type]}`, + width: 700, + onCancel: () => { + Popup.close(); + }, + content: ( + <div> + <MyForm + id={record.id} + idc={options.idc} + type={type} + showSubmit={true} + onSubmit={(values) => onSubmit(values)} + onCancel={() => { + Popup.close(); + }} + /> + </div> + ) + }); +} diff --git a/cyclone-web/app/containers/database/store-room/actions/delete.jsx b/cyclone-web/app/containers/database/store-room/actions/delete.jsx new file mode 100644 index 0000000000000000000000000000000000000000..d3aad2af7ae67fb31ab4fbd1bb5f7bdd85338699 --- /dev/null +++ b/cyclone-web/app/containers/database/store-room/actions/delete.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { del } from 'common/xFetch2'; + +export default function action(options) { + const records = options.records; + const onSubmit = () => { + del(`/api/cloudboot/v1/store-room/${records.id}`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + }); + }; + confirm({ + title: `确定要删除吗?`, + content: `库房单元名称:${records.name}`, + okText: '确定', + okType: 'danger', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/database/store-room/actions/form.jsx b/cyclone-web/app/containers/database/store-room/actions/form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..962f2688b15ef1c542ea8afe28f26cbef652f970 --- /dev/null +++ b/cyclone-web/app/containers/database/store-room/actions/form.jsx @@ -0,0 +1,208 @@ +import React from 'react'; +import { get } from 'common/xFetch2'; +import { + Form, + Button, + notification, + Input, + Select +} from 'antd'; +const FormItem = Form.Item; +import { formItemLayout, tailFormItemLayout } from 'common/enums'; +const Option = Select.Option; + +class MyForm extends React.Component { + constructor(props) { + super(props); + this.state = { + initialValue: {} + }; + } + + componentDidMount() { + const { type, id } = this.props; + if (type.indexOf('detail') !== -1 || type === '_update') { + get(`/api/cloudboot/v1/store-room/${id}`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + const idc = res.content.idc || {}; + this.setState({ + initialValue: { + ...res.content, + idc_name: idc.name, + idc_data: JSON.stringify({ first_server_room: idc.first_server_room, id: idc.id }), + first_server_room: res.content.first_server_room.name + } + }); + }); + } + } + + handleSubmit = ev => { + ev && ev.preventDefault(); + ev && ev.stopPropagation(); + this.props.form.validateFields({ force: true }, (error, values) => { + if (error) { + notification.warning({ + message: '还有未填写完整的选项' + }); + return; + } + this.props.onSubmit(values); + }); + }; + + getRoom = (v) => { + //清空已选一级机房的值 + const { setFieldsValue } = this.props.form; + if (v) { + setFieldsValue({ first_server_room: null }); + } + }; + + render() { + const { idc, showSubmit, type } = this.props; + const { initialValue } = this.state; + const { getFieldDecorator, getFieldValue } = this.props.form; + const idc_data = JSON.parse(getFieldValue('idc_data') || initialValue.idc_data || '{}'); + + return ( + <div> + <Form onSubmit={this.handleSubmit}> + + { + type.indexOf('detail') !== -1 ? + <FormItem {...formItemLayout} label='数据中心' > + {getFieldDecorator('idc_name', { + initialValue: initialValue.idc_name, + rules: [ + { + required: true, + message: '请选择数据中心' + } + ] + })( + <Input disabled={!showSubmit} /> + )} + </FormItem> : + <FormItem {...formItemLayout} label='数据中心' > + {getFieldDecorator('idc_data', { + initialValue: initialValue.idc_data, + rules: [ + { + required: true, + message: '请选择数据中心' + } + ] + })( + <Select disabled={!showSubmit} onChange={(v) => this.getRoom(v)}> + { + !idc.loading && + idc.data.map((os, index) => <Option value={JSON.stringify({ first_server_room: os.first_server_room, id: os.id })} key={os.id}>{os.name}</Option>) + } + </Select> + )} + </FormItem> + } + + + + <FormItem {...formItemLayout} label='所属一级机房' > + {getFieldDecorator('first_server_room', { + initialValue: initialValue.first_server_room, + rules: [ + { + required: true, + message: '请选择所属一级机房' + } + ] + })( + <Select disabled={!showSubmit} > + { + (idc_data.first_server_room || []).map(item => <Option value={item.name} key={item.id}>{item.name}</Option>) + } + </Select> + )} + </FormItem> + <FormItem {...formItemLayout} label='库房管理单元' > + {getFieldDecorator('name', { + initialValue: initialValue.name, + rules: [ + { + required: true, + message: '请输入库房管理单元' + } + ] + })( + <Input disabled={!showSubmit} /> + )} + </FormItem> + <FormItem {...formItemLayout} label='城市' > + {getFieldDecorator('city', { + initialValue: initialValue.city, + rules: [ + { + required: true, + message: '请输入城市' + } + ] + })( + <Input disabled={!showSubmit} /> + )} + </FormItem> + <FormItem {...formItemLayout} label='地址' > + {getFieldDecorator('address', { + initialValue: initialValue.address, + rules: [ + { + required: true, + message: '请输入地址' + } + ] + })(<Input disabled={!showSubmit} />)} + </FormItem> + <FormItem {...formItemLayout} label='库房负责人' > + {getFieldDecorator('store_room_manager', { + initialValue: initialValue.store_room_manager, + rules: [ + { + required: true, + message: '请输入库房负责人' + } + ] + })(<Input disabled={!showSubmit} />)} + </FormItem> + <FormItem {...formItemLayout} label='供应商负责人' > + {getFieldDecorator('vendor_manager', { + initialValue: initialValue.vendor_manager, + rules: [ + { + required: true, + message: '请输入供应商负责人' + } + ] + })(<Input disabled={!showSubmit} />)} + </FormItem> + <FormItem {...tailFormItemLayout}> + <div className='pull-right'> + <Button onClick={() => this.props.onCancel()}>取消</Button> + { + showSubmit && + <Button + style={{ marginLeft: 8 }} + type='primary' + htmlType='submit' + > + 提交 + </Button> + } + </div> + </FormItem> + </Form> + </div> + ); + } +} + +export default Form.create()(MyForm); diff --git a/cyclone-web/app/containers/database/store-room/actions/import.jsx b/cyclone-web/app/containers/database/store-room/actions/import.jsx new file mode 100644 index 0000000000000000000000000000000000000000..426ff2110ed6b33a3b494ccddacc28c552b1a9a8 --- /dev/null +++ b/cyclone-web/app/containers/database/store-room/actions/import.jsx @@ -0,0 +1,56 @@ +import React from 'react'; +import Popup from 'components/popup'; +import FileUpload from 'components/upload'; + +export default function action(options) { + const getColumns = () => { + return [ + { + title: '数据中心', + dataIndex: 'idc_name' + }, + { + title: '一级机房名称', + dataIndex: 'first_server_room' + }, + { + title: '库房名称', + dataIndex: 'name' + }, + { + title: '城市', + dataIndex: 'city' + }, + { + title: '地址', + dataIndex: 'address' + }, + { + title: '库房负责人', + dataIndex: 'store_room_manager' + } + ]; + }; + Popup.open({ + title: '导入数据', + width: 1500, + onCancel: () => { + Popup.close(); + }, + content: ( + <FileUpload + importApi='/api/cloudboot/v1/store-room/imports' + uploadApi='/api/cloudboot/v1/store-room/upload' + previewApi='/api/cloudboot/v1/store-room/imports/previews' + getColumns={getColumns} + onSuccess={() => { + Popup.close(); + options.reload(); + }} + onCancel={() => { + Popup.close(); + }} + /> + ) + }); +} diff --git a/cyclone-web/app/containers/database/store-room/actions/index.js b/cyclone-web/app/containers/database/store-room/actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..7578c9ffcb5520a0c10f6f73a240807193d2c8ba --- /dev/null +++ b/cyclone-web/app/containers/database/store-room/actions/index.js @@ -0,0 +1,14 @@ +import _update from './create-update'; +import _create from './create-update'; +import _import from './import'; +import _delete from './delete'; +import idc_detail from '../../common/idc/detail'; + + +export default { + _update, + _delete, + _import, + _create, + idc_detail +}; diff --git a/cyclone-web/app/containers/database/store-room/components/search-form.jsx b/cyclone-web/app/containers/database/store-room/components/search-form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..c342f081b3158f177e90b72f990cb00919acde56 --- /dev/null +++ b/cyclone-web/app/containers/database/store-room/components/search-form.jsx @@ -0,0 +1,37 @@ +import React from 'react'; +import SearchForm from 'components/search-form'; +import { IDC_STATUS, getSearchList } from 'common/enums'; + +export default class Search extends React.Component { + state = { + searchKeys: [ + { key: 'name', label: '库房管理单元' }, + { key: 'store_room_manager', label: '库房负责人' }, + { key: 'vendor_manager', label: '供应商负责人' } + // { key: 'status', label: '状态' } + ], + searchValues: { + 'name': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'store_room_manager': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'vendor_manager': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' } + // 'status': { type: 'checkbox', list: getSearchList(IDC_STATUS) } + } + }; + + onSearch = (values) => { + this.props.dispatch({ + type: 'database-store/table-data/search', + payload: { + ...values + } + }); + }; + + render() { + return ( + <SearchForm onSearch={this.onSearch} searchKeys={this.state.searchKeys} searchValues={this.state.searchValues}/> + ); + } +} + + diff --git a/cyclone-web/app/containers/database/store-room/components/table.jsx b/cyclone-web/app/containers/database/store-room/components/table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..f6b3f912234d49c7fde6c568c14069295e7d732b --- /dev/null +++ b/cyclone-web/app/containers/database/store-room/components/table.jsx @@ -0,0 +1,249 @@ +import React from 'react'; +import { get } from 'common/xFetch2'; +import { + Table, + Button, + Pagination, + notification, + Badge +} from 'antd'; +import actions from '../actions'; +import TableControlCell from 'components/TableControlCell'; +import { IDC_USAGE, IDC_STATUS_COLOR } from "common/enums"; +import { getPermissonBtn } from 'common/utils'; +import { Link } from 'react-router'; +const ButtonGroup = Button.Group; + + +class MyTable extends React.Component { + + //下载导入模板 + downloadImportTemplate = () => { + window.open('assets/files/store_room_import.xlsx'); + }; + + + reload = () => { + this.props.dispatch({ + type: 'database-store/table-data/reload' + }); + this.props.dispatch({ + type: 'database-store/table-data/set/selectedRows', + payload: { + selectedRows: [], + selectedRowKeys: [] + } + }); + }; + + //批量操作入口 + batchExecAction = (name) => { + const { tableData } = this.props; + const selectedRows = tableData.selectedRows || []; + if (selectedRows.length < 1) { + return notification.error({ message: '请至少选择一条数据' }); + } + this.execAction(name, selectedRows); + }; + + //操作入口 + execAction = (name, records) => { + if (actions[name]) { + actions[name]({ + records, + initialValue: records, + idc: this.props.idc, + type: name, + reload: () => { + this.reload(); + } + }); + } + }; + + + + getRowSelection = () => { + const selectedRowKeys = this.props.tableData.selectedRowKeys; + return { + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.props.dispatch({ + type: 'database-store/table-data/set/selectedRows', + payload: { + selectedRowKeys, + selectedRows + } + }); + } + }; + }; + + changePage = page => { + this.props.dispatch({ + type: `database-store/table-data/change-page`, + payload: { + page + } + }); + }; + + changePageSize = (page, pageSize) => { + this.props.dispatch({ + type: `database-store/table-data/change-page-size`, + payload: { + page, + pageSize + } + }); + }; + + + getColumns = () => { + + return [ + { + title: '库房管理单元', + dataIndex: 'name', + render: (text, record) => <Link to={`/database/store-room/${record.id}`}>{text}</Link> + }, + { + title: '数据中心', + dataIndex: 'idc', + render: (text, record) => <a onClick={() => this.execAction('idc_detail', { id: text.id })}>{text.name}</a> + }, + { + title: '一级机房', + dataIndex: 'first_server_room', + render: (text) => <span>{text ? text.name : ''}</span> + }, + // { + // title: '状态', + // dataIndex: 'status', + // render: type => { + // const color = IDC_STATUS_COLOR[type] ? IDC_STATUS_COLOR[type][0] : 'transparent'; + // const word = IDC_STATUS_COLOR[type] ? IDC_STATUS_COLOR[type][1] : ''; + // return ( + // <div> + // <Badge + // dot={true} + // style={{ + // background: color + // }} + // />{' '} + // &nbsp;&nbsp; {word} + // </div> + // ); + // } + // }, + { + title: '城市', + dataIndex: 'city' + }, + { + title: '地址', + dataIndex: 'address' + }, + { + title: '虚拟货架数', + dataIndex: 'cabinet_count', + render: (text, record) => <Link to={`/database/store-room/${record.id}`}>{text}</Link> + }, + { + title: '库房负责人', + dataIndex: 'store_room_manager' + }, + { + title: '供应商负责人', + dataIndex: 'vendor_manager' + }, + { + title: '操作', + dataIndex: 'operate', + render: (text, record) => { + const commands = [ + { + name: '编辑', + command: '_update', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_store_room_update') + }, + { + name: '删除', + command: '_delete', + type: 'danger', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_store_room_delete') + } + ]; + return ( + <TableControlCell + commands={commands} + record={record} + execCommand={command => { + this.execAction(command, record); + }} + /> + ); + } + } + ]; + }; + + + render() { + const { tableData } = this.props; + const { loading, pagination } = tableData; + return ( + <div> + <div className='operate_btns'> + <Button + onClick={() => this.execAction('_create')} + type='primary' + style={{ marginRight: 8 }} + icon='plus' + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_store_room_create')} + > + 新增 + </Button> + <span className='pull-right'> + <ButtonGroup style={{ marginRight: 8 }}> + <Button + onClick={() => this.downloadImportTemplate()} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_server_cabinet_download')} + > + 下载导入模板 + </Button> + <Button + onClick={() => this.execAction('_import')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_store_room_import')} + > + 导入 + </Button> + </ButtonGroup> + </span> + </div> + <Table + rowKey={'id'} + columns={this.getColumns()} + pagination={false} + dataSource={tableData.list} + rowSelection={this.getRowSelection()} + loading={loading} + /> + <div> + <Pagination + showTotal={(total) => `共 ${total} 条`} + showQuickJumper={true} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={this.changePageSize} + onChange={this.changePage} + /> + </div> + </div> + ); + } +} + +export default MyTable; diff --git a/cyclone-web/app/containers/database/store-room/get-component.js b/cyclone-web/app/containers/database/store-room/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..e4321f7e46846a2d74ec57d524db937d115ee256 --- /dev/null +++ b/cyclone-web/app/containers/database/store-room/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('database-store', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/database/store-room/index.jsx b/cyclone-web/app/containers/database/store-room/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..2d9b6d9a0d6ccf82580c1fb7262f683d582d0fb1 --- /dev/null +++ b/cyclone-web/app/containers/database/store-room/index.jsx @@ -0,0 +1,53 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import SearchForm from './components/search-form'; +import Table from './components/table'; +import Layout from 'components/layout/page-layout'; + +class Container extends React.Component { + componentDidMount() { + this.props.dispatch({ + type: 'database-store/table-data/get' + }); + //获取数据中心数据 + this.props.dispatch({ + type: 'database-store/idc/get' + }); + } + + componentWillUnmount() { + this.props.dispatch({ + type: 'database-store/table-data/reset' + }); + } + + render() { + const { tableData, idc } = this.props.data; + return ( + <Layout title='库房信息管理'> + <SearchForm dispatch={this.props.dispatch}/> + <Table + dispatch={this.props.dispatch} + tableData={tableData} + userInfo={this.props.userInfo} + idc={idc} + /> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + data: state.get('database-store').toJS(), + userInfo: state.getIn([ 'global', 'userData' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/database/store-room/reducers/index.js b/cyclone-web/app/containers/database/store-room/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..3cae91a1471a4d257f415ce68f9d208576089c13 --- /dev/null +++ b/cyclone-web/app/containers/database/store-room/reducers/index.js @@ -0,0 +1,22 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; +import { createRegularReducer } from 'utils/regular-reducer'; + +const initialState = fromJS({ + tableData: createTableStore(), + idc: { + loading: true, + data: [] + } +}); + +const reducer = handleActions( + { + ...createTableReducer('database-store/table-data', 'tableData'), + ...createRegularReducer('database-store/idc', 'idc') + }, + initialState, +); + +export default reducer; diff --git a/cyclone-web/app/containers/database/store-room/sagas/index.js b/cyclone-web/app/containers/database/store-room/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..960d2db94434dc117b23d48007d6067ed8c5ddf2 --- /dev/null +++ b/cyclone-web/app/containers/database/store-room/sagas/index.js @@ -0,0 +1,28 @@ +import { getWithArgs } from 'common/xFetch2'; + + +let created = false; +function* empty() { + yield; +} + +import { createTableListSaga } from 'utils/tableList-saga'; +const listSaga = createTableListSaga({ + actionNamePrefix: 'database-store/idc', + datasource: '/api/cloudboot/v1/idcs' +}); + +import { createTableSaga } from 'utils/table-saga'; +const jobTableSaga = createTableSaga({ + actionNamePrefix: 'database-store/table-data', + tableDataPath: [ 'database-store', 'tableData' ], + datasource: '/api/cloudboot/v1/store-rooms' +}); + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [ jobTableSaga, listSaga ]; +} diff --git a/cyclone-web/app/containers/database/usite/actions/change-status.jsx b/cyclone-web/app/containers/database/usite/actions/change-status.jsx new file mode 100644 index 0000000000000000000000000000000000000000..3fedaa10144736cf152c406c0366982c9f8093ba --- /dev/null +++ b/cyclone-web/app/containers/database/usite/actions/change-status.jsx @@ -0,0 +1,64 @@ +import React from 'react'; +import Popup from 'components/popup'; +import { put } from 'common/xFetch2'; +import { notification } from 'antd'; +import FormGenerator from 'components/idcos-form/FormGenerator'; +import { USITE_STATUS, getSearchList } from 'common/enums'; + +export default function action(options) { + const record = options.records; + const ids = record.map(item => item.id); + + const formSchema = { + name: 'form', + id: 'form', + elements: [ + { + id: 'status', + name: 'status', + label: '状态', + type: 'Select', + options: getSearchList(USITE_STATUS), + rules: [ + { + required: true, + message: '请选择机位状态' + } + ] + } + ] + }; + + const onSubmit = (values) => { + + put('/api/cloudboot/v1/server-usites/status', { status: values.status, ids: ids }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + Popup.close(); + options.reload(); + }); + }; + + Popup.open({ + title: '更新机位状态', + onCancel: () => { + Popup.close(); + }, + content: ( + <div> + <FormGenerator + initialValue={record} + schema={formSchema} + showCancel={true} + hideReset={true} + onSubmit={(values) => onSubmit(values)} + onCancel={() => { + Popup.close(); + }} + /> + </div> + ) + }); +} diff --git a/cyclone-web/app/containers/database/usite/actions/create-update.jsx b/cyclone-web/app/containers/database/usite/actions/create-update.jsx new file mode 100644 index 0000000000000000000000000000000000000000..b1d125d3f7d8e121b890582c8e503a535f0d4266 --- /dev/null +++ b/cyclone-web/app/containers/database/usite/actions/create-update.jsx @@ -0,0 +1,58 @@ +import React from 'react'; +import Popup from 'components/popup'; +import { post, put } from 'common/xFetch2'; +import { notification } from 'antd'; +import MyForm from '../../common/usite/form'; + +export default function action(options) { + const record = options.records || {}; + const type = options.type; + const typeMap = { + _create: '新增机位信息', + _update: '编辑机位信息' + }; + + const onSubmit = (values) => { + + let method = post; + let url = '/api/cloudboot/v1/server-usites'; + if (type === '_update') { + method = put; + url = `/api/cloudboot/v1/server-usites/${record.id}`; + } + + method(url, values).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + Popup.close(); + options.reload(); + }); + }; + + Popup.open({ + title: `${typeMap[type]}`, + width: 700, + onCancel: () => { + Popup.close(); + }, + content: ( + <div> + <MyForm + type={options.type} + dispatch={options.dispatch} + room={options.room} + cabinet={options.cabinet} + server_cabinet_id={(record.server_cabinet || {}).id} + id={record.id} + showSubmit={true} + onSubmit={(values) => onSubmit(values)} + onCancel={() => { + Popup.close(); + }} + /> + </div> + ) + }); +} diff --git a/cyclone-web/app/containers/database/usite/actions/delete-port.jsx b/cyclone-web/app/containers/database/usite/actions/delete-port.jsx new file mode 100644 index 0000000000000000000000000000000000000000..9c570b20c4bc950ed1d30ee7ea56bd3730ec8daa --- /dev/null +++ b/cyclone-web/app/containers/database/usite/actions/delete-port.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { del } from 'common/xFetch2'; + +export default function action(options) { + const records = options.records; + const onSubmit = () => { + del(`/api/cloudboot/v1/server-usites/${records.id}/ports`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + }); + }; + confirm({ + title: `确定要删除机位端口号吗?`, + content: `机位编号:${records.number}`, + okText: '确定', + okType: 'danger', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/database/usite/actions/delete.jsx b/cyclone-web/app/containers/database/usite/actions/delete.jsx new file mode 100644 index 0000000000000000000000000000000000000000..86b6532e2d669d4c741399558a2159db23742716 --- /dev/null +++ b/cyclone-web/app/containers/database/usite/actions/delete.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { del } from 'common/xFetch2'; + +export default function action(options) { + const records = options.records; + const onSubmit = () => { + del(`/api/cloudboot/v1/server-usites/${records.id}`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + }); + }; + confirm({ + title: `确定要删除吗?`, + content: `机位编号:${records.number}`, + okText: '确定', + okType: 'danger', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/database/usite/actions/import-port.jsx b/cyclone-web/app/containers/database/usite/actions/import-port.jsx new file mode 100644 index 0000000000000000000000000000000000000000..8266c3301671ec98a7fc310112a3708f1c5bcbdb --- /dev/null +++ b/cyclone-web/app/containers/database/usite/actions/import-port.jsx @@ -0,0 +1,60 @@ +import React from 'react'; +import Popup from 'components/popup'; +import FileUpload from 'components/upload'; + +export default function action(options) { + const getColumns = () => { + return [ + { + title: '机房管理单元', + dataIndex: 'server_room_name' + }, + { + title: '机架编号', + dataIndex: 'server_cabinet_number' + }, + { + title: '机位编号', + dataIndex: 'number' + }, + { + title: '管理网交换机设备名称-端口', + dataIndex: 'oobnet_switch_name_port' + }, + { + title: '内网交换机设备名称-端口', + dataIndex: 'intranet_switch_name_port' + }, + { + title: '外网交换机设备名称-端口', + dataIndex: 'extranet_switch_name_port' + }, + { + title: '内外网端口速率', + dataIndex: 'la_wa_port_rate' + } + ]; + }; + Popup.open({ + title: '机位关联端口导入', + width: 1000, + onCancel: () => { + Popup.close(); + }, + content: ( + <FileUpload + importApi='/api/cloudboot/v1/server-usites/ports/imports' + uploadApi='/api/cloudboot/v1/server-usites/ports/upload' + previewApi='/api/cloudboot/v1/server-usites/ports/imports/previews' + getColumns={getColumns} + onSuccess={() => { + Popup.close(); + options.reload(); + }} + onCancel={() => { + Popup.close(); + }} + /> + ) + }); +} diff --git a/cyclone-web/app/containers/database/usite/actions/import.jsx b/cyclone-web/app/containers/database/usite/actions/import.jsx new file mode 100644 index 0000000000000000000000000000000000000000..6d3adb6dc728634dd7bc71dcfe35a4034147c527 --- /dev/null +++ b/cyclone-web/app/containers/database/usite/actions/import.jsx @@ -0,0 +1,65 @@ +import React from 'react'; +import Popup from 'components/popup'; +import FileUpload from 'components/upload'; + +export default function action(options) { + const getColumns = () => { + return [ + { + title: '机房管理单元', + dataIndex: 'server_room_name' + }, + { + title: '机架编号', + dataIndex: 'server_cabinet_number' + }, + { + title: '机位编号', + dataIndex: 'number' + }, + { + title: '机位高度', + dataIndex: 'height' + }, + { + title: '起始U数', + dataIndex: 'beginning' + }, + { + title: '物理区域', + dataIndex: 'physical_area' + }, + { + title: '状态', + dataIndex: 'status' + }, + { + title: '备注', + dataIndex: 'remark' + } + ]; + }; + + Popup.open({ + title: '机位导入', + width: 1000, + onCancel: () => { + Popup.close(); + }, + content: ( + <FileUpload + importApi='/api/cloudboot/v1/server-usites/imports' + uploadApi='/api/cloudboot/v1/server-usites/upload' + previewApi='/api/cloudboot/v1/server-usites/imports/previews' + getColumns={getColumns} + onSuccess={() => { + Popup.close(); + options.reload(); + }} + onCancel={() => { + Popup.close(); + }} + /> + ) + }); +} diff --git a/cyclone-web/app/containers/database/usite/actions/index.js b/cyclone-web/app/containers/database/usite/actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..228ca8ac221fe5bfce2695d344d3b9d35f889bba --- /dev/null +++ b/cyclone-web/app/containers/database/usite/actions/index.js @@ -0,0 +1,24 @@ +import _update from './create-update'; +import _create from './create-update'; +import _delete from './delete'; +import deletePort from './delete-port'; +import _import from './import'; +import _importPort from './import-port'; +import detail from '../../common/usite/detail'; +import cabinet_detail from '../../common/cabinet/detail'; +import changeStatus from './change-status'; +import remark from './remark'; + + +export default { + detail, + cabinet_detail, + _update, + _delete, + _create, + _import, + _importPort, + deletePort, + changeStatus, + remark +}; diff --git a/cyclone-web/app/containers/database/usite/actions/remark.jsx b/cyclone-web/app/containers/database/usite/actions/remark.jsx new file mode 100644 index 0000000000000000000000000000000000000000..0242d1bd7dbb4d63e72e507500a95eb279168c40 --- /dev/null +++ b/cyclone-web/app/containers/database/usite/actions/remark.jsx @@ -0,0 +1,62 @@ +import React from 'react'; +import Popup from 'components/popup'; +import { put } from 'common/xFetch2'; +import { notification } from 'antd'; +import FormGenerator from 'components/idcos-form/FormGenerator'; + +export default function action(options) { + const record = options.records; + const ids = record.map(item => item.id); + + const formSchema = { + name: 'form', + id: 'form', + elements: [ + { + id: 'remark', + name: 'remark', + label: '备注', + type: 'Textarea', + rules: [ + { + required: true, + message: '请输入备注内容' + } + ] + } + ] + }; + + const onSubmit = (values) => { + + put('/api/cloudboot/v1/server-usites/remark', { remark: values.remark, ids: ids }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + Popup.close(); + options.reload(); + }); + }; + + Popup.open({ + title: '更新备注信息', + onCancel: () => { + Popup.close(); + }, + content: ( + <div> + <FormGenerator + initialValue={record} + schema={formSchema} + showCancel={true} + hideReset={true} + onSubmit={(values) => onSubmit(values)} + onCancel={() => { + Popup.close(); + }} + /> + </div> + ) + }); +} diff --git a/cyclone-web/app/containers/database/usite/components/search-form.jsx b/cyclone-web/app/containers/database/usite/components/search-form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..0a97b07270674c2bcd82e2cfb5ade7b9d6be07fc --- /dev/null +++ b/cyclone-web/app/containers/database/usite/components/search-form.jsx @@ -0,0 +1,113 @@ +import React from 'react'; +import SearchForm from 'components/search-form'; +import { USITE_STATUS, USITE_PORT_RATE, getSearchList } from 'common/enums'; +import { get } from 'common/xFetch2'; +import { notification } from 'antd'; + +export default class Search extends React.Component { + state = { + searchKeys: [ + { key: 'usite_number', label: '机位编号' }, + { key: 'idc_id', label: '数据中心' }, + { key: 'server_room_name', label: '机房管理单元' }, + { key: 'cabinet_number', label: '机架编号' }, + { key: 'height', label: '机位高度' }, + { key: 'status', label: '机位状态' }, + { key: 'physical_area', label: '物理区域' }, + { key: 'la_wa_port_rate', label: '内外网端口速率' }, + ], + searchValues: { + 'usite_number': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'idc_id': { type: 'checkbox', list: [] }, + 'server_room_name': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'cabinet_number': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'height': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'status': { type: 'checkbox', list: getSearchList(USITE_STATUS) }, + 'physical_area': { type: 'checkbox', list: [] }, + 'la_wa_port_rate': { type: 'checkbox', list: getSearchList(USITE_PORT_RATE) }, + } + }; + + + getList = (name) => { + const searchValues = this.state.searchValues; + get(`/api/cloudboot/v1/devices/query-params/${name}`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + const list = res.content.list || []; + if (list.length > 0) { + searchValues[name].list = list.map(it => { + if (it.name) { + return { + label: it.name, + value: it.name + }; + } else { + return { + label: 'blank', + value: 'blank' + }; + } + }); + } + }); + }; + + getListId = (name) => { + const searchValues = this.state.searchValues; + get(`/api/cloudboot/v1/idcs`, { page: 1, page_size: 100 }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + const list = res.content.records || []; + if (list.length > 0) { + searchValues[name].list = list.map(it => { + return { + label: it.name, + value: it.id + }; + }); + } + }); + }; + + componentDidMount() { + this.getList('physical_area'); + this.getListId('idc_id'); + } + + UNSAFE_componentWillReceiveProps(props) { + const { room, idc } = props; + const searchValues = this.state.searchValues; + // if (!room.loading && room.loading !== this.props.room.loading) { + // searchValues['server_room_id'].list = (room.data || []).map(it => { + // return { + // label: it.name, value: it.id + // }; + // }); + // this.setState({ searchValues }); + // } + // if (!idc.loading && idc.loading !== this.props.idc.loading) { + // searchValues['idc_id'].list = idc.data; + // this.setState({ searchValues }); + // } + } + + onSearch = (values) => { + this.props.dispatch({ + type: 'database-usite/table-data/search', + payload: { + ...values + } + }); + }; + + render() { + return ( + <SearchForm onSearch={this.onSearch} searchKeys={this.state.searchKeys} searchValues={this.state.searchValues}/> + ); + } +} + + diff --git a/cyclone-web/app/containers/database/usite/components/table.jsx b/cyclone-web/app/containers/database/usite/components/table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..2f5f50059385eebc03239e311d86a13613938d1f --- /dev/null +++ b/cyclone-web/app/containers/database/usite/components/table.jsx @@ -0,0 +1,326 @@ +import React from 'react'; +import { + Table, + Button, + Pagination, + notification, + Dropdown, + Menu, + Icon, + Badge, + Tooltip +} from 'antd'; +import actions from '../actions'; +import { USITE_STATUS_COLOR } from "common/enums"; +import TableControlCell from 'components/TableControlCell'; +import { getPermissonBtn } from 'common/utils'; +import { renderDisplayMore } from 'common/utils'; + +const plainOptions = [ + { value: 'idc.name', name: '数据中心' }, + { value: 'beginning', name: '起始U数' }, + { value: 'creator', name: '创建用户' }, + { value: 'created_at', name: '创建时间' }, +]; + +class MyTable extends React.Component { + state = { + checkedList: [], + indeterminate: false, + checkAll: false + }; + reload = () => { + this.props.dispatch({ + type: 'database-usite/table-data/reload' + }); + this.props.dispatch({ + type: 'database-usite/table-data/set/selectedRows', + payload: { + selectedRows: [], + selectedRowKeys: [] + } + }); + }; + + //批量操作入口 + batchExecAction = (name) => { + const { tableData } = this.props; + const selectedRows = tableData.selectedRows || []; + if (selectedRows.length <= 0) { + return notification.error({ message: '请至少选择一条数据' }); + } + this.execAction(name, selectedRows); + }; + + //单个操作入口 + oneExecAction = (name) => { + const { tableData } = this.props; + const selectedRows = tableData.selectedRows || []; + if (selectedRows.length !== 1) { + return notification.error({ message: '请选择一条数据' }); + } + this.execAction(name, selectedRows[0]); + }; + + //操作入口 + execAction = (name, records) => { + if (actions[name]) { + actions[name]({ + records, + initialValue: records, + type: name, + room: this.props.room, + reload: () => { + this.reload(); + } + }); + } + }; + + //下载导入模板 + downloadImportTemplate = (key) => { + if (key === 'usite') { + window.open(`assets/files/server-usites.xlsx`); + } else if (key === 'usite_port') { + window.open(`assets/files/server-usites-port.xlsx`); + } + }; + + getRowSelection = () => { + const selectedRowKeys = this.props.tableData.selectedRowKeys; + return { + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.props.dispatch({ + type: 'database-usite/table-data/set/selectedRows', + payload: { + selectedRowKeys, + selectedRows + } + }); + } + }; + }; + + changePage = page => { + this.props.dispatch({ + type: `database-usite/table-data/change-page`, + payload: { + page + } + }); + }; + + changePageSize = (page, pageSize) => { + this.props.dispatch({ + type: `database-usite/table-data/change-page-size`, + payload: { + page, + pageSize + } + }); + }; + + + getColumns = () => { + const columns = [ + { + title: '机位编号', + dataIndex: 'number', + width:80, + render: (text, record) => <a onClick={() => this.execAction('detail', record)}>{text}</a> + }, + { + title: '机架编号', + dataIndex: 'server_cabinet', + width:80, + render: (text, record) => <a onClick={() => this.execAction('cabinet_detail', { id: text.id })}>{text.number}</a> + }, + { + title: '机房管理单元', + dataIndex: 'server_room', + render: (text) => <Tooltip placement="top" title={text.name}>{text.name}</Tooltip> + }, + //{ + // title: '数据中心', + // dataIndex: 'idc', + // render: (text, record) => <span>{text.name}</span> + //}, + { + title: '物理区域', + dataIndex: 'physical_area' + }, + { + title: '内外网端口速率', + dataIndex: 'la_wa_port_rate', + width:120, + }, + { + title: '机位高度', + dataIndex: 'height', + width:80, + }, + { + title: '机位状态', + dataIndex: 'status', + width:80, + render: type => { + const color = USITE_STATUS_COLOR[type] ? USITE_STATUS_COLOR[type][0] : 'transparent'; + const word = USITE_STATUS_COLOR[type] ? USITE_STATUS_COLOR[type][1] : ''; + return ( + <div> + <Badge + dot={true} + style={{ + background: color + }} + />{' '} + &nbsp;&nbsp; {word} + </div> + ); + } + }, + { + title: '更新时间', + dataIndex: 'updated_at', + width: 150 + }, + { + title: '备注', + dataIndex: 'remark' + }, + { + title: '操作', + dataIndex: 'operate', + width: 180, + render: (text, record) => { + const commands = [ + { + name: '编辑', + command: '_update', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_server_usite_update') + }, + { + name: '删除', + command: '_delete', + type: 'danger', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_server_usite_delete') + }, + { + name: '端口删除', + command: 'deletePort', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_server_usite_delete_port') + } + ]; + return ( + <TableControlCell + commands={commands} + record={record} + execCommand={command => { + this.execAction(command, record); + }} + /> + ); + } + } + ]; + if (this.state.checkedList.length > 0) { + this.state.checkedList.forEach(data => { + columns.push({ + title: data.name, + dataIndex: data.value + }); + }); + } + return columns; + }; + + + render() { + const { tableData } = this.props; + const { loading, pagination, selectedRows } = tableData; + const menu_excel = ( + <Menu onClick={(e) => this.downloadImportTemplate(e.key)}> + <Menu.Item disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_server_usite_download')} + key='usite' + >机位模板</Menu.Item> + <Menu.Item disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_server_usite_download_port')} + key='usite_port' + >机位关联端口模板</Menu.Item> + </Menu> + ); + const menu = ( + <Menu onClick={(e) => this.execAction(e.key)}> + <Menu.Item disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_server_usite_import')} + key='_import' + >机位导入</Menu.Item> + <Menu.Item disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_server_usite_import_port')} + key='_importPort' + >机位关联端口导入</Menu.Item> + </Menu> + ); + return ( + <div> + <div className='operate_btns'> + <Button + onClick={() => this.execAction('_create')} + type='primary' + style={{ marginRight: 8 }} + icon='plus' + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_server_usite_create')} + > + 新增 + </Button> + <Button + onClick={() => this.batchExecAction('remark')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_server_usite_remark')} + > + 备注 + </Button> + <Button + style={{ marginRight: 8 }} + onClick={() => this.batchExecAction('changeStatus')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_server_usite_status')} + > + 更新机位状态 + </Button> + <span> + 已选 { selectedRows.length } 项 + </span> + <span className='pull-right'> + <Dropdown overlay={menu_excel}> + <Button style={{ borderBottomRightRadius: 0, borderTopRightRadius: 0 }}>下载导入模板<Icon type='down' /></Button> + </Dropdown> + <Dropdown overlay={menu}> + <Button style={{ borderBottomLeftRadius: 0, borderTopLeftRadius: 0, marginLeft: -1 }}>导入 <Icon type='down' /></Button> + </Dropdown> + </span> + <span className='pull-right'>{renderDisplayMore(this, plainOptions)}</span> + </div> + <div className='clearfix' /> + <Table + rowKey={'id'} + columns={this.getColumns()} + pagination={false} + dataSource={tableData.list} + rowSelection={this.getRowSelection()} + loading={loading} + /> + <div> + <Pagination + showTotal={(total) => `共 ${total} 条`} + showQuickJumper={true} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={this.changePageSize} + onChange={this.changePage} + /> + </div> + </div> + ); + } +} + +export default MyTable; diff --git a/cyclone-web/app/containers/database/usite/get-component.js b/cyclone-web/app/containers/database/usite/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..127968df7fb11051ce25de147ff341f95d78009f --- /dev/null +++ b/cyclone-web/app/containers/database/usite/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('database-usite', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/database/usite/index.jsx b/cyclone-web/app/containers/database/usite/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..2b430f462ac5ea07c756aa69e27890c1ebf2d8a1 --- /dev/null +++ b/cyclone-web/app/containers/database/usite/index.jsx @@ -0,0 +1,58 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import SearchForm from './components/search-form'; +import Table from './components/table'; +import Layout from 'components/layout/page-layout'; + +class Container extends React.Component { + componentDidMount() { + this.props.dispatch({ + type: 'database-usite/table-data/get' + }); + //获取机房数据 + this.props.dispatch({ + type: 'database-usite/room/get' + }); + } + + componentWillUnmount() { + this.props.dispatch({ + type: 'database-usite/table-data/reset' + }); + } + + render() { + const { tableData, room } = this.props.data; + return ( + <Layout title='机位信息管理'> + <SearchForm + dispatch={this.props.dispatch} + room={room} + idc={this.props.idc} + /> + <Table + dispatch={this.props.dispatch} + tableData={tableData} + userInfo={this.props.userInfo} + room={room} + /> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + data: state.get('database-usite').toJS(), + userInfo: state.getIn([ 'global', 'userData' ]).toJS(), + idc: state.getIn([ 'global', 'idc' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/database/usite/reducers/index.js b/cyclone-web/app/containers/database/usite/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..3a73ab2edc6203eeaa3ffe58cd2c8ac0bffd2af3 --- /dev/null +++ b/cyclone-web/app/containers/database/usite/reducers/index.js @@ -0,0 +1,27 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; +import { createRegularReducer } from 'utils/regular-reducer'; + +const initialState = fromJS({ + tableData: createTableStore(), + cabinet: { + loading: true, + data: [] + }, + room: { + loading: true, + data: [] + } +}); + +const reducer = handleActions( + { + ...createTableReducer('database-usite/table-data', 'tableData'), + ...createRegularReducer('database-usite/cabinet', 'cabinet'), + ...createRegularReducer('database-usite/room', 'room') + }, + initialState, +); + +export default reducer; diff --git a/cyclone-web/app/containers/database/usite/sagas/index.js b/cyclone-web/app/containers/database/usite/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..d8f1e0c0e38aa21fc31b0208317cde01d6d01618 --- /dev/null +++ b/cyclone-web/app/containers/database/usite/sagas/index.js @@ -0,0 +1,50 @@ +import { getWithArgs } from 'common/xFetch2'; +import { takeEvery } from 'redux-saga'; +import { call, put } from 'redux-saga/effects'; +import { notification } from 'antd'; + +let created = false; +function* empty() { + console.log(); +} + +function* defaultSaga() { + const watchers = yield [ + takeEvery('database-usite/room/get', getRoom) + ]; +} + +function* getRoom(action) { + try { + yield put({ + type: 'database-usite/room/load' + }); + + const res = yield call(getWithArgs, `/api/cloudboot/v1/server-rooms`, { page: 1, page_size: 100 }); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + yield put({ + type: 'database-usite/room/load/success', + payload: res.content.records + }); + } catch (error) { + console.log(error); + } +} + +import { createTableSaga } from 'utils/table-saga'; + +const jobTableSaga = createTableSaga({ + actionNamePrefix: 'database-usite/table-data', + tableDataPath: [ 'database-usite', 'tableData' ], + datasource: '/api/cloudboot/v1/server-usites' +}); + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [ jobTableSaga, defaultSaga ]; +} diff --git a/cyclone-web/app/containers/device/common/colums.jsx b/cyclone-web/app/containers/device/common/colums.jsx new file mode 100644 index 0000000000000000000000000000000000000000..48aed5625655de451e0e68fd1b3baeef7a78bc69 --- /dev/null +++ b/cyclone-web/app/containers/device/common/colums.jsx @@ -0,0 +1,210 @@ +import React from 'react'; +import { Link } from 'react-router'; +import { OPERATION_STATUS_COLOR, OOB_ACCESSIBLE, POWER_STATUS, OOB_STATUS_COLOR } from "common/enums"; +import { Badge, Icon ,Tooltip} from 'antd'; + +import idcAction from 'containers/database/common/idc/detail'; +import roomAction from 'containers/database/common/room/detail'; +import cabinetAction from 'containers/database/common/cabinet/detail'; +import usiteAction from 'containers/database/common/usite/detail'; +import oobAction from './oob'; + +export const plainOptions = [ + { value: 'arch', name: '硬件架构' }, + { value: 'tor', name: 'TOR' }, + { + value: 'idc', name: '数据中心', render: (text, record, snLink) => { + if (snLink) { + return <a onClick={() => idcAction({ records: { id: text.id }, type: 'idc_detail' })}>{text.name}</a>; + } + return <span>{text.name}</span>; + } + }, + { + value: 'store_room', + name: '库房管理单元', + render: (text) => { + return <Tooltip placement="top" title={text.name}>{text.name}</Tooltip>; + } + }, + { + value: 'virtual_cabinets', + name: '货架', + render: (text) => { + return <Tooltip placement="top" title={text.name}>{text.number}</Tooltip>; + } + }, + { value: 'model', name: '设备型号' }, + { value: 'vendor', name: '厂商' }, + { + value: 'power_status', name: '电源状态', render: (text, record, snLink, self) => { + return <div> + <span className={`yes_no_status ${text === 'power_on' ? 'yes_status' : 'no_status'}`}>{POWER_STATUS[text] || '无'}</span> + &nbsp;&nbsp;&nbsp; + { + snLink && <a> + <Icon + onClick={() => { + self.changePowerStatus(record); + }} + type='reload' + > + </Icon> + </a> + } + </div>; + } + } +]; + +export const getColumns = (self, snLink) => { + + const columns = [ + { + title: '固资编号', + dataIndex: 'fixed_asset_number', + render: (text) => <Tooltip placement="top" title={text}>{text}</Tooltip> + }, + { + title: '序列号', + dataIndex: 'sn', + render: (text, record) => { + if (snLink) { + return <Tooltip placement="top" title={text}> + <Link to={`/device/detail/${text}`}>{text}</Link> + </Tooltip> + } + return (text) => <Tooltip placement="top" title={text}>{text}</Tooltip>; + } + }, + { + title: '机房管理单元', + dataIndex: 'server_room', + render: (text) => { + if (snLink) { + return <Tooltip placement="top" title={text.name}> + <a onClick={() => roomAction({ records: { id: text.id }, type: 'room_detail' })}> + {text.name} + </a> + </Tooltip>; + } + return <Tooltip placement="top" title={text.name}>{text.name}</Tooltip>; + } + }, + { + title: '机架编号', + dataIndex: 'server_cabinet', + render: (text) => { + if (text && text !== 'null') { + if (snLink) { + return <a onClick={() => cabinetAction({ records: { id: text.id }, type: 'cabinet_detail' })}>{text.number}</a>; + } + return <span>{text.number}</span>; + } + } + }, + { + title: '机位编号', + dataIndex: 'server_usite', + render: (text) => { + if (text && text !== 'null') { + if (snLink) { + return <a onClick={() => usiteAction({ records: { id: text.id }, type: 'detail', room: { loading: false, data: [text] } })}>{text.number}</a>; + } + return <span>{text.number}</span>; + } + } + }, + { + title: '物理区域', + dataIndex: 'physical_area', + //render: (t, record) => record.server_usite ? record.server_usite.physical_area : '' + render: (text,record) => <Tooltip placement="top" title={record.server_usite ? record.server_usite.physical_area : ''}> + {record.server_usite ? record.server_usite.physical_area : ''} + </Tooltip> + }, + { + title: '内网 IP', + dataIndex: 'intranet_ip' + }, + { + title: '外网 IP', + dataIndex: 'extranet_ip' + }, + { + title: '系统', + dataIndex: 'os' + }, + { + title: '带外', + dataIndex: 'oob', + render: (text, record) => <a href='javascript:;' onClick={() => oobAction(record.sn)}>查看</a> + }, + { + title: '带外状态', + dataIndex: 'oob_accessible', + render: type => { + const color = OOB_STATUS_COLOR[type] ? OOB_STATUS_COLOR[type][0] : 'transparent'; + const word = OOB_STATUS_COLOR[type] ? OOB_STATUS_COLOR[type][1] : ''; + return ( + <div> + <Badge + dot={true} + style={{ + background: color + }} + />{' '} + &nbsp;&nbsp; {word} + </div> + ); + } + }, + { + title: '用途', + dataIndex: 'usage' + }, + { + title: '设备类型', + dataIndex: 'category', + //render: (t) => { + // if (t === 'SpecialDev') { + // return '特殊设备'; + // } + // return t; + //} + }, + { + title: '运营状态', + dataIndex: 'operation_status', + render: type => { + const color = OPERATION_STATUS_COLOR[type] ? OPERATION_STATUS_COLOR[type][0] : 'transparent'; + const word = OPERATION_STATUS_COLOR[type] ? OPERATION_STATUS_COLOR[type][1] : ''; + return ( + <div> + <Badge + dot={true} + style={{ + background: color + }} + />{' '} + &nbsp;&nbsp; {word} + </div> + ); + } + } + ]; + if (self && self.state.checkedList.length > 0) { + self.state.checkedList.forEach(data => { + const content = { + title: data.name, + dataIndex: data.value + }; + if (data.render) { + content.render = (text, record) => data.render(text, record, snLink, self); + } + columns.push(content); + }); + } + return columns; +}; + diff --git a/cyclone-web/app/containers/device/common/detail/async-actions/index.js b/cyclone-web/app/containers/device/common/detail/async-actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..f54b6e8fde3dc94cad628f98695f86fd92535e9e --- /dev/null +++ b/cyclone-web/app/containers/device/common/detail/async-actions/index.js @@ -0,0 +1,27 @@ +import { post, get, getWithArgs } from 'common/xFetch2'; +import { createTableAsyncAction } from 'utils/table-async-action'; +import { notification } from 'antd'; + +async function getDetailInfo(state, action, dispatch) { + try { + dispatch({ + type: 'device/detail/load' + }); + + const res = await get(`/api/cloudboot/v1/devices/${action.payload}/combined`); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + dispatch({ + type: 'device/detail/load/success', + payload: res.content + }); + + } catch (error) { + console.log(error); + } +} + +export default { + 'device/detail/get': getDetailInfo +}; diff --git a/cyclone-web/app/containers/device/common/detail/index.jsx b/cyclone-web/app/containers/device/common/detail/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..96a0fc10c09f5ab35e5b55f043a20388077f8c25 --- /dev/null +++ b/cyclone-web/app/containers/device/common/detail/index.jsx @@ -0,0 +1,161 @@ +import React from 'react'; +import { + Row +} from 'antd'; +import handleAction from './sync-actions/index'; +import asyncActions from './async-actions/index'; +import M from 'immutable'; +import { renderFormDetail } from 'common/utils'; +import { OPERATION_STATUS, BUILTIN, DEVICE_MAINTENANCE_SERVICE_STATUS } from 'common/enums'; + + +export default class OperationTarget extends React.Component { + componentDidMount() { + if (!this.props.data) { + this.dispatch({ + type: 'device/detail/get', + payload: this.props.sn + }); + } + } + + constructor(props) { + super(props); + this.state = { + data: M.fromJS({ + detailInfo: { + loading: true, + data: { + device_page_resp: { + + }, + //device_lifecycle_detail_page: { +// + //} + } + } + }) + }; + } + + getState = () => { + return this.state.data; + }; + dispatch = action => { + if (asyncActions[action.type]) { + asyncActions[action.type]( + this.state.data, + action, + this.dispatch, + this.getState + ); + return; + } + + const data = handleAction(this.state.data, action); + this.setState({ + data + }); + }; + render() { + let data = {}; + //let lifecycleData = {}; + //console.log("show props", this.props); + if (this.props.data) { + data = this.props.data.device_page_resp; + //lifecycleData = this.props.data.device_lifecycle_detail_page; + } else { + const detailInfo = this.state.data.toJS().detailInfo; + data = detailInfo.data.device_page_resp; + //lifecycleData = detailInfo.data.device_lifecycle_detail_page; + } + return ( + <Row> + {renderFormDetail([ + { + label: '固资编号', + value: data.fixed_asset_number + }, + { + label: '序列号', + value: data.sn + }, + { + label: '设备型号', + value: data.model + }, + { + label: '设备类型', + value: data.category + }, + { + label: '厂商', + value: data.vendor + }, + { + label: '用途', + value: data.usage + }, + { + label: '运营状态', + value: OPERATION_STATUS[data.operation_status] + }, + { + label: '数据中心', + value: data.idc && data.idc.name + }, + { + label: '机房管理单元', + value: data.server_room && data.server_room.name + }, + { + label: '机架编号', + value: data.server_cabinet && data.server_cabinet.number + }, + { + label: '机位编号', + value: data.server_usite && data.server_usite.number + }, + { + label: '库房管理单元', + value: data.store_room && data.store_room.name + }, + { + label: '虚拟货架', + value: data.virtual_cabinets && data.virtual_cabinets.number + }, + { + label: 'RAID结构', + value: data.raid_remark + }, + { + label: '硬件备注', + value: data.hardware_remark + }, + { + label: '订单编号', + value: data.order_number + }, + { + label: '上架时间', + value: data.onshelve_at + }, + { + label: '启用时间', + value: data.started_at + }, + { + label: '创建时间', + value: data.created_at + }, + { + label: '更新时间', + value: data.updated_at + } + ])} + </Row> + ); + } + + +} diff --git a/cyclone-web/app/containers/device/common/detail/sync-actions/index.js b/cyclone-web/app/containers/device/common/detail/sync-actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..83cbc9d19c9c6f6bde3b33faaf31be05786d25c2 --- /dev/null +++ b/cyclone-web/app/containers/device/common/detail/sync-actions/index.js @@ -0,0 +1,23 @@ +import { createRegularReducer } from 'utils/regular-reducer'; + +const reducers = { + ...createRegularReducer('device/detail', 'detailInfo') +}; + +const handleAction = (state, action) => { + + // action is an array + if (action instanceof Array) { + return action.reduce((state, action) => { + return handleAction(state, action); + }, state); + } + + const type = action.type; + if (!reducers[type]) { + return state; + } + return reducers[type](state, action); +}; + +export default handleAction; diff --git a/cyclone-web/app/containers/device/common/device/async-actions/index.js b/cyclone-web/app/containers/device/common/device/async-actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..25f9f2ad63937e4e1367c1b29fae6ee5ba822eb4 --- /dev/null +++ b/cyclone-web/app/containers/device/common/device/async-actions/index.js @@ -0,0 +1,11 @@ +import { post, get, getWithArgs } from 'common/xFetch2'; + +import { createTableAsyncAction } from 'utils/table-async-action'; + +export default { + ...createTableAsyncAction({ + actionNamePrefix: 'device/table-data', + tableDataPath: ['tableData'], + datasource: '/api/cloudboot/v1/devices' + }) +}; diff --git a/cyclone-web/app/containers/device/common/device/index.jsx b/cyclone-web/app/containers/device/common/device/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..c7706b2f0b0f8ce70e2ec0831fb9a16dc45a75d8 --- /dev/null +++ b/cyclone-web/app/containers/device/common/device/index.jsx @@ -0,0 +1,229 @@ +import React from 'react'; +import { + Alert, + Table, + Pagination, + Button, + Input, + notification +} from 'antd'; +import { createTableStore } from 'utils/table-reducer'; +import handleAction from './sync-actions/index'; +import asyncActions from './async-actions/index'; +import M from 'immutable'; +import { getColumns } from "containers/device/common/colums"; +import { getWithArgs } from 'common/xFetch2'; + +export default class MyTable extends React.Component { + componentDidMount() { + this.dispatch({ + type: 'device/table-data/search', + payload: this.props.query + }); + } + + constructor(props) { + super(props); + this.state = { + checkedList: [], + data: M.fromJS({ + tableData: createTableStore() + }) + }; + } + getState = () => { + return this.state.data; + }; + + dispatch = action => { + if (asyncActions[action.type]) { + asyncActions[action.type]( + this.state.data, + action, + this.dispatch, + this.getState + ); + return; + } + + const data = handleAction(this.state.data, action); + this.setState({ + data + }); + }; + render() { + return ( + <div className='host'> + <div className='panel'> + <div className='panel-body'>{this.renderBody()}</div> + { + !this.props.hideButton && + <div className=' panel-footer'> + <Button type='primary' onClick={this.handleSubmit}> + 确定 + </Button> + </div> + } + + </div> + </div> + ); + } + + onSearch = (value, tableQuery, key) => { + if (this.props.query) { + return this.dispatch({ + type: 'device/table-data/search', + payload: { + ...tableQuery, + [key]: value, + ...this.props.query + } + }); + } + this.dispatch({ + type: 'device/table-data/search', + payload: { + ...tableQuery, + [key]: value + } + }); + }; + + + renderBody() { + const tableData = this.state.data.get('tableData').toJS(); + const tableQuery = tableData.query; + const { list, pagination, loading, selectedRowKeys, selectedRows } = tableData; + const rowSelection = { + type: this.props.checkType, + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.dispatch({ + type: 'device/table-data/set/selectedRows', + payload: { + selectedRowKeys, + selectedRows + } + }); + if (this.props.form) { + const { setFieldsValue } = this.props.form; + setFieldsValue({ sn: selectedRows }); + } + } + }; + + return ( + <div className='node-body'> + <div> + <Alert + message={this.props.checkType === 'radio' ? `选择的设备: ${selectedRows[0] ? selectedRows[0].sn : ''}` : `已选择: ${selectedRowKeys.length} 项`} + type='info' + showIcon={true} + style={{ + marginBottom: 8, + overflow: 'hidden', + wordBreak: 'break-all' + }} + /> + </div> + <div + className='search-form' + style={{ textAlign: 'right', marginBottom: 8 }} + > + <span style={{ marginRight: 8 }}> + <Input.Search + placeholder='序列号' + style={{ width: 200 }} + onChange={e => { + this.onSearch(e.target.value, tableQuery, 'sn'); + }} + /> + </span> + <span style={{ marginRight: 8 }}> + <Input.Search + placeholder='固资编号' + style={{ width: 200 }} + onChange={e => { + this.onSearch(e.target.value, tableQuery, 'fixed_asset_number'); + }} + /> + </span> + <span> + <Input.Search + placeholder='内网IP' + style={{ width: 200 }} + onChange={e => { + this.onSearch(e.target.value, tableQuery, 'intranet_ip'); + }} + /> + </span> + </div> + + <Table + rowKey={'id'} + rowSelection={rowSelection} + columns={getColumns(this, [])} //兼容物理设备列表 + pagination={false} + dataSource={list} + loading={loading} + /> + <Pagination + showTotal={(total) => `共 ${total} 条`} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={(page, pageSize) => { + this.dispatch({ + type: 'device/table-data/change-page-size', + payload: { + page, + pageSize + } + }); + }} + onChange={page => { + this.dispatch({ + type: 'device/table-data/change-page', + payload: { + page + } + }); + }} + /> + </div> + ); + } + + + handleSubmit = async (ev) => { + const tableData = this.state.data.get('tableData').toJS(); + const { selectedRows } = tableData; + if (selectedRows.length < 1) { + return notification.error({ message: '请选择设备' }); + } + let limit = this.props.limit || Infinity; + if (selectedRows.length > limit) { + return notification.error({ message: `选择的设备数不能超过${limit}` }); + } + // if (this.props.getServerRoom) { + // try { + // await Promise.all(selectedRows.map((it, i) => new Promise((resolve, reject) => { + // getWithArgs('/api/cloudboot/v1/server-rooms', { page: 1, page_size: 100, idc_id: it.idc.id }).then(res => { + // if (res.status !== 'success') { + // notification.error({ message: res.message }); + // reject(); + // } + // + // it.rooms = res.content.records || []; + // resolve(); + // }); + // }))); + // } catch (err) { + // notification(err); + // } + // } + this.props.handleSubmit(tableData); + }; +} diff --git a/cyclone-web/app/containers/device/common/device/sync-actions/index.js b/cyclone-web/app/containers/device/common/device/sync-actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..5f582d20f376078af651b8cdab75780e8e30efd2 --- /dev/null +++ b/cyclone-web/app/containers/device/common/device/sync-actions/index.js @@ -0,0 +1,23 @@ +import { createTableReducer } from 'utils/table-reducer'; + +const reducers = { + ...createTableReducer('device/table-data', ['tableData']) +}; + +const handleAction = (state, action) => { + + // action is an array + if (action instanceof Array) { + return action.reduce((state, action) => { + return handleAction(state, action); + }, state); + } + + const type = action.type; + if (!reducers[type]) { + return state; + } + return reducers[type](state, action); +}; + +export default handleAction; diff --git a/cyclone-web/app/containers/device/common/oob.jsx b/cyclone-web/app/containers/device/common/oob.jsx new file mode 100644 index 0000000000000000000000000000000000000000..0db1593569953ad3efdebe083dcb5a9230605763 --- /dev/null +++ b/cyclone-web/app/containers/device/common/oob.jsx @@ -0,0 +1,30 @@ +import { Modal, notification } from 'antd'; +import { get } from 'common/xFetch2'; +import copy from 'copy-to-clipboard'; + +export default async function info(sn) { + const res = await get(`/api/cloudboot/v1/devices/${sn}/oob-user`); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + Modal.info({ + title: '带外信息', + okText: '知道了', + content: ( + <div> + <p>带外IP: <a href={`http://${res.content.ip}`} target='_blank'>{res.content.ip}</a></p> + <p>带外用户: <span style={{ color: '#010f24' }}>{res.content.username}</span></p> + <p>带外密码: <span style={{ color: '#010f24', marginRight: 8 }}>{res.content.password}</span> + <a onClick={() => { + if (copy(res.content.password)) { + notification.success({ message: '复制成功' }); + } else { + notification.error({ message: '复制失败' }); + } + }} + >复制密码</a> + </p> + </div> + ) + }); +} diff --git a/cyclone-web/app/containers/device/detail/get-component.js b/cyclone-web/app/containers/device/detail/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..1fd044fd4396624757911e97c03f306269711a20 --- /dev/null +++ b/cyclone-web/app/containers/device/detail/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('device-detail', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/device/detail/index.jsx b/cyclone-web/app/containers/device/detail/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..877afdec3cc3f0841141d80277d8a4aa50285e65 --- /dev/null +++ b/cyclone-web/app/containers/device/detail/index.jsx @@ -0,0 +1,1200 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import Layout from 'components/layout/page-layout'; +import { Tabs, Icon, Row, Col, Table, Button, Form, Input, Select, notification, DatePicker, Tooltip } from 'antd'; +import { renderFormDetail, getBreadcrumb } from 'common/utils'; +const TabPane = Tabs.TabPane; +const FormItem = Form.Item; +const Option = Select.Option; +import { PRIVILEGE_LEVEL, TIME_FORMAT, NICSIDE, OPERATION_STATUS, getSearchList, YES_NO, DEVICE_MAINTENANCE_SERVICE_STATUS } from 'common/enums'; +import Detail from '../common/detail'; +import { put, getWithArgs } from 'common/xFetch2'; +import moment from 'moment'; +import { getPermissonBtn } from 'common/utils'; + +class Container extends React.Component { + state = { + sn: this.props.params.sn, + isEdit: false, + isOobEdit: false, + isOSSystemInfoEdit: false, + showPwd: false, + room: [], + cabinet: [], + usite: [], + store_rooms: [], + virtualCabinets: [] + }; + + componentDidMount() { + this.reload(); + this.props.dispatch({ + type: 'device-detail/idc/get' + }); + } + + //编辑时候给机房、机架和机位赋下拉框的值 + UNSAFE_componentWillReceiveProps(props) { + const { detailInfo } = props.data; + if (!detailInfo.loading && detailInfo.loading !== this.props.data.detailInfo.loading) { + const device_page_resp = detailInfo.data.device_page_resp; + const idc_id = device_page_resp.idc.id; + if (idc_id) { + this.getRoom(idc_id, 1, false); + const store_room_id = device_page_resp.store_room ? device_page_resp.store_room.id : null; + if (store_room_id) { + this.getVirtualCabinets(store_room_id, 1, false); + } + const server_room_id = device_page_resp.server_room ? device_page_resp.server_room.id : null; + if (server_room_id) { + this.getCabinet(server_room_id, 1, false); + const server_cabinet_id = device_page_resp.server_cabinet ? device_page_resp.server_cabinet.id : null; + if (server_cabinet_id) { + this.getUsite(server_cabinet_id, 1, false); + } + } + } + } + } + + reload = () => { + this.props.dispatch({ + type: 'device-detail/detail-info/get', + payload: this.state.sn + }); + }; + + //保存修改信息 + handleSubmit = () => { + const { data } = this.props.data.detailInfo; + this.props.form.validateFields((err, values) => { + if (err) { + return notification.error({ message: '还有未填项' }); + } + delete values.created_at; + delete values.updated_at; + delete values.oob_password; + delete values.oob_user; + const postValues = { + ...values, + id: data.device_page_resp.id, + 'started_at': values['started_at'] ? values['started_at'].format(TIME_FORMAT) : '', + 'onshelve_at': values['onshelve_at'] ? values['onshelve_at'].format(TIME_FORMAT) : '' + }; + put(`/api/cloudboot/v1/device`, postValues).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + this.setState({ isEdit: false }); + this.reload(); + }); + }); + }; + reloadOob = () => { + const { data } = this.props.data.detailInfo; + const { setFieldsValue } = this.props.form; + setFieldsValue({ oob_user: data.device_page_resp.oob_user, oob_password: data.device_page_resp.oob_password }); + }; + //保存带外信息 + handleOobSubmit = () => { + this.props.form.validateFields((err, values) => { + const postValues = { + sn: this.state.sn, + oob_user_name: values.oob_user, + oob_password_old: values.oob_password + }; + put(`/api/cloudboot/v1/devices/${this.state.sn}/oob/password`, postValues).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + this.setState({ isOobEdit: false }); + this.reload(); + }); + }); + }; + + reloadOS = () => { + const { data } = this.props.data.detailInfo; + const { setFieldsValue } = this.props.form; + setFieldsValue({ os: data.os}); + }; + //保存带外信息 + handleOSSystemInfoSubmit = () => { + this.props.form.validateFields((err, values) => { + const postValues = { + sn: this.state.sn, + os: values.os, + }; + put(`/api/cloudboot/v1/devices/settings`, postValues).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + this.setState({ isOSSystemInfoEdit: false }); + this.reload(); + }); + }); + }; + + clearStoreRoom = () => { + const { setFieldsValue, getFieldValue } = this.props.form; + const room = getFieldValue('store_room_id'); + if (room) { + setFieldsValue({ store_room_id: null }); + } + this.setState({ + store_rooms: [] + }); + }; + + clearVirtualCabinet = () => { + const { setFieldsValue, getFieldValue } = this.props.form; + const room = getFieldValue('virtual_cabinet_id'); + if (room) { + setFieldsValue({ virtual_cabinet_id: null }); + } + this.setState({ + virtualCabinets: [] + }); + }; + + + clearRoom = () => { + const { setFieldsValue, getFieldValue } = this.props.form; + const room = getFieldValue('server_room_id'); + if (room) { + setFieldsValue({ server_room_id: null }); + } + this.setState({ + room: [] + }); + }; + clearCabinet = () => { + const { setFieldsValue, getFieldValue } = this.props.form; + const cabinet = getFieldValue('server_cabinet_id'); + if (cabinet) { + setFieldsValue({ server_cabinet_id: null }); + } + this.setState({ + cabinet: [] + }); + }; + clearUsite = () => { + const { setFieldsValue, getFieldValue } = this.props.form; + const usite = getFieldValue('server_usite_id'); + if (usite) { + setFieldsValue({ server_usite_id: null }); + } + this.setState({ + usite: [] + }); + }; + + //选择idc获取机房列表 + getRoom = (v, page, clear) => { + this.getRoomPage(v, page); + this.getStoreRoomPage(v, page); + if (clear) { + this.clearRoom(); + this.clearCabinet(); + this.clearUsite(); + this.clearStoreRoom(); + this.clearVirtualCabinet(); + } + }; + + getStoreRoomPage = (v, page) => { + getWithArgs('/api/cloudboot/v1/store-rooms', { page: page, page_size: 100, idc_id: v }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + this.setState((preState) => { + return { + store_rooms: [ ...preState.store_rooms, ...res.content.records ] + }; + }, () => { + if (res.content.total_pages > page) { + this.getStoreRoomPage(v, page + 1); + } + }); + }); + }; + + getRoomPage = (v, page) => { + getWithArgs('/api/cloudboot/v1/server-rooms', { page: page, page_size: 100, idc_id: v }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + this.setState((preState) => { + return { + room: [ ...preState.room, ...res.content.records ] + }; + }, () => { + if (res.content.total_pages > page) { + this.getRoomPage(v, page + 1); + } + }); + }); + }; + + //选择机房获取机架列表 + getCabinet = (v, page, clear) => { + this.getCabinetPage(v, page); + if (clear) { + this.clearCabinet(); + this.clearUsite(); + } + }; + + getCabinetPage = (v, page) => { + getWithArgs('/api/cloudboot/v1/server-cabinets', { page: page, page_size: 1000, server_room_id: v }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + this.setState((preState) => { + return { + cabinet: [ ...preState.cabinet, ...res.content.records ] + }; + }, () => { + if (res.content.total_pages > page) { + this.getCabinetPage(v, page + 1); + } + }); + }); + }; + + //选择库房获取虚机货架 + getVirtualCabinets = (v, page, clear) => { + this.getVirtualCabinetsPage(v, page); + if (clear) { + this.clearVirtualCabinet(); + } + }; + getVirtualCabinetsPage = (v, page) => { + getWithArgs('/api/cloudboot/v1/virtual-cabinets', { page: page, page_size: 100, store_room_id: v }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + this.setState((preState) => { + return { + virtualCabinets: [ ...preState.virtualCabinets, ...res.content.records ] + }; + }, () => { + if (res.content.total_pages > page) { + this.getVirtualCabinetsPage(v, page + 1); + } + }); + }); + }; + + + //选择机架获取机位列表 + getUsite = (v, page, clear) => { + this.getUsitePage(v, page); + if (clear) { + this.clearUsite(); + } + }; + + getUsitePage = (v, page) => { + getWithArgs('/api/cloudboot/v1/server-usites', { page: page, page_size: 100, server_cabinet_id: v, status: 'free' }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + this.setState((preState) => { + return { + usite: [ ...preState.usite, ...res.content.records ] + }; + }, () => { + if (res.content.total_pages > page) { + this.getUsitePage(v, page + 1); + } + }); + }); + }; + + render() { + const { detailInfo, idc } = this.props.data; + //console.log("show detailInfo 2:",detailInfo); + const { data } = detailInfo; + const { device_page_resp, cpu, memory, nic, oob, pci, hba, disk_slot, raid, motherboard, device_lifecycle_detail_page } = data; + const { isEdit, isOobEdit, isOSSystemInfoEdit, showPwd } = this.state; + const { getFieldDecorator } = this.props.form; + const isSpecial = device_page_resp.usage === '特殊设备'; + + return ( + <Layout> + <Tabs type='card' tabBarExtraContent={getBreadcrumb(this.state.sn)}> + <TabPane tab='基本信息' key='info'> + <div className='pull-right'> + {isEdit ? + <div> + <Button onClick={() => this.setState({ isEdit: false })} style={{ marginRight: 8 }}>取消</Button> + <Button onClick={() => this.handleSubmit()} type='primary' >保存</Button> + </div> : + <Button disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_physical_machine_update')} + onClick={() => this.setState({ isEdit: true })} + ><Icon type='edit' theme='outlined' />修改设备信息</Button> + } + </div> + <h3 className='detail-title'>设备信息</h3> + <div className='detail-info'> + {isEdit ? + <div> + <Form> + <Row gutter={24}> + <Col span={8}> + <FormItem label={'固资编号'}> + {getFieldDecorator('fixed_asset_number', { + initialValue: device_page_resp.fixed_asset_number, + rules: [ + { + required: true, + message: '请填写固资编号' + } + ] + })( + <Input /> + )} + </FormItem> + </Col> + <Col span={8}> + <FormItem label={'序列号'}> + {getFieldDecorator('sn', { + initialValue: device_page_resp.sn, + rules: [ + { + required: true, + message: '请填写序列号' + } + ] + })( + <Input /> + )} + </FormItem> + </Col> + <Col span={8}> + <FormItem label={'设备型号'}> + {getFieldDecorator('model', { + initialValue: device_page_resp.model, + rules: [ + { + required: true, + message: '请填写设备型号' + } + ] + })( + <Input /> + )} + </FormItem> + </Col> + <Col span={8}> + <FormItem label={'设备类型'}> + {getFieldDecorator('category', { + initialValue: device_page_resp.category, + rules: [ + { + required: true, + message: '请填写设备类型' + } + ] + })( + <Input disabled={isSpecial} /> + )} + </FormItem> + </Col> + <Col span={8}> + <FormItem label={'厂商'}> + {getFieldDecorator('vendor', { + initialValue: device_page_resp.vendor, + rules: [ + { + required: true, + message: '请填写厂商' + } + ] + })( + <Input /> + )} + </FormItem> + </Col> + <Col span={8}> + <FormItem label={'用途'}> + {getFieldDecorator('usage', { + initialValue: device_page_resp.usage, + rules: [ + { + required: true, + message: '请填写用途' + } + ] + })( + <Input disabled={isSpecial}/> + )} + </FormItem> + </Col> + <Col span={8}> + <FormItem label={'运营状态'}> + {getFieldDecorator('operation_status', { + initialValue: device_page_resp.operation_status, + rules: [ + { + required: true, + message: '请选择运营状态' + } + ] + })( + <Select> + { + getSearchList(OPERATION_STATUS).map((it) => <Option value={it.value} key={it.value}>{it.label}</Option>) + } + </Select> + )} + </FormItem> + </Col> + <Col span={8}> + <FormItem label='数据中心' > + {getFieldDecorator('idc_id', { + initialValue: device_page_resp.idc.id || null, + rules: [ + { + required: true, + message: '请选择数据中心' + } + ] + })( + <Select + showSearch={true} + filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0} + onChange={(value) => this.getRoom(value, 1, true)} + > + { + !idc.loading && + idc.data.map((os, index) => <Option value={os.id} key={os.id}>{os.name}</Option>) + } + </Select> + )} + </FormItem> + </Col> + <Col span={8}> + <FormItem label={'机房管理单元'}> + {getFieldDecorator('server_room_id', { + initialValue: device_page_resp.server_room.id || null + // rules: [ + // { + // required: true, + // message: '请选择机房管理单元' + // } + // ] + })( + (<Select + showSearch={true} + filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0} + onChange={(value) => this.getCabinet(value, 1, true)} + > + { + this.state.room.map((os, index) => <Option value={os.id} key={os.id}>{os.name}</Option>) + } + </Select>) + )} + </FormItem> + </Col> + <Col span={8}> + <FormItem label='机架编号' > + {getFieldDecorator('server_cabinet_id', { + initialValue: device_page_resp.server_cabinet.id || null + // rules: [ + // { + // required: true, + // message: '请选择机架编号' + // } + // ] + })(<Select + showSearch={true} + filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0} + onChange={(value) => this.getUsite(value, 1, true)} + > + { + this.state.cabinet.map((os, index) => <Option value={os.id} key={os.id}>{os.number}</Option>) + } + </Select>)} + </FormItem> + </Col> + <Col span={8}> + <FormItem label='机位编号' > + {getFieldDecorator('server_usite_id', { + initialValue: device_page_resp.server_usite ? device_page_resp.server_usite.id : null + // rules: [ + // { + // required: true, + // message: '请选择机位编号' + // } + // ] + })(<Select + showSearch={true} + filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0} + > + { + this.state.usite.map((os, index) => <Option value={os.id} key={os.id}>{os.number}</Option>) + } + </Select>)} + </FormItem> + </Col> + <Col span={8}> + <FormItem label='库房管理单元' > + {getFieldDecorator('store_room_id', { + initialValue: device_page_resp.store_room ? device_page_resp.store_room.id : null + // rules: [ + // { + // required: true, + // message: '请选择机位编号' + // } + // ] + })(<Select + onChange={(value) => this.getVirtualCabinets(value, 1, true)} + showSearch={true} + filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0} + > + { + (this.state.store_rooms || []).map((os, index) => <Option value={os.id} key={os.id}>{os.name}</Option>) + } + </Select>)} + </FormItem> + </Col> + <Col span={8}> + <FormItem label='虚拟货架' > + {getFieldDecorator('virtual_cabinet_id', { + initialValue: device_page_resp.virtual_cabinets ? device_page_resp.virtual_cabinets.id : null + // rules: [ + // { + // required: true, + // message: '请选择机位编号' + // } + // ] + })(<Select + showSearch={true} + filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0} + > + { + (this.state.virtualCabinets || []).map((os, index) => <Option value={os.id} key={os.id}>{os.number}</Option>) + } + </Select>)} + </FormItem> + </Col> + <Col span={8}> + <FormItem label={'代理节点'}> + {getFieldDecorator('origin_node', { + initialValue: device_page_resp.origin_node + })( + <Input disabled={true} /> + )} + </FormItem> + </Col> + <Col span={8}> + <FormItem label={'代理节点IP'}> + {getFieldDecorator('origin_node_ip', { + initialValue: device_page_resp.origin_node_ip + })( + <Input disabled={true} /> + )} + </FormItem> + </Col> + <Col span={8}> + <FormItem label={'启用时间'}> + {getFieldDecorator('started_at', { + initialValue: device_page_resp.started_at ? moment(device_page_resp.started_at) : null + })( + <DatePicker showTime={true} format={TIME_FORMAT} style={{ width: '100%' }} /> + )} + </FormItem> + </Col> + <Col span={8}> + <FormItem label={'上架时间'}> + {getFieldDecorator('onshelve_at', { + initialValue: device_page_resp.onshelve_at ? moment(device_page_resp.onshelve_at) : null + })( + <DatePicker showTime={true} format={TIME_FORMAT} style={{ width: '100%' }} /> + )} + </FormItem> + </Col> + <Col span={8}> + <FormItem label={'创建时间'}> + {getFieldDecorator('created_at', { + initialValue: device_page_resp.created_at + })( + <Input disabled={true} /> + )} + </FormItem> + </Col> + <Col span={8}> + <FormItem label={'更新时间'}> + {getFieldDecorator('updated_at', { + initialValue: device_page_resp.updated_at + })( + <Input disabled={true} /> + )} + </FormItem> + </Col> + <Col span={8}> + <FormItem label={'RAID结构'}> + {getFieldDecorator('raid_remark', { + initialValue: device_page_resp.raid_remark + })( + <Input/> + )} + </FormItem> + </Col> + <Col span={8}> + <FormItem label={'硬件说明'}> + {getFieldDecorator('hardware_remark', { + initialValue: device_page_resp.hardware_remark + })( + <Input.TextArea /> + )} + </FormItem> + </Col> + </Row> + </Form> + </div> : + <Row> + <Detail sn={this.state.sn} data={detailInfo.data} /> + </Row> + } + </div> + <h3 className='detail-title'>维保信息</h3> + <div className='detail-info'> + <Row> + {renderFormDetail([ + { + label: '资产归属', + value: device_lifecycle_detail_page.asset_belongs + }, + { + label: '负责人', + value: device_lifecycle_detail_page.owner + }, + { + label: '是否租赁', + value: YES_NO[device_lifecycle_detail_page.is_rental] + }, + { + label: '维保服务供应商', + value: device_lifecycle_detail_page.maintenance_service_provider + }, + { + label: '维保服务起始日期', + value: device_lifecycle_detail_page.maintenance_service_date_begin + }, + { + label: '维保服务截止日期', + value: device_lifecycle_detail_page.maintenance_service_date_end + }, + { + label: '维保服务状态', + value: DEVICE_MAINTENANCE_SERVICE_STATUS[device_lifecycle_detail_page.maintenance_service_status] + }, + { + label: '退役日期', + value: device_lifecycle_detail_page.device_retired_date + }, + ])} + </Row> + <Row> + <Col span={8}> + <FormItem label={'维保服务内容'}> + {getFieldDecorator('maintenance_service', { + initialValue: device_lifecycle_detail_page.maintenance_service + })( + <Input.TextArea disabled={true} autoSize={ true } /> + )} + </FormItem> + </Col> + <Col span={8}> + <FormItem label={'物流服务内容'}> + {getFieldDecorator('logistics_service', { + initialValue: device_lifecycle_detail_page.logistics_service + })( + <Input.TextArea disabled={true} autoSize={ true } /> + )} + </FormItem> + </Col> + </Row> + </div> + <div className='pull-right'> + {isOobEdit ? + <div> + <Button onClick={() => { + this.setState({ isOobEdit: false }); + this.reloadOob(); + }} style={{ marginRight: 8 }} + >取消</Button> + <Button onClick={() => this.handleOobSubmit()} type='primary' >保存</Button> + </div> : + <Button disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_physical_machine_update_oob')} + onClick={() => this.setState({ isOobEdit: true })} + ><Icon type='edit' theme='outlined' />修改带外信息</Button> + } + </div> + <h3 className='detail-title'>带外信息</h3> + <div className='detail-info'> + <Row> + <Col span={8}> + <FormItem label={'带外用户名'}> + {getFieldDecorator('oob_user', { + initialValue: device_page_resp.oob_user + })( + <Input disabled={!isOobEdit} /> + )} + </FormItem> + </Col> + <Col span={8}> + <FormItem label={isOobEdit ? '带外密码(旧)' : '带外密码'}> + {getFieldDecorator('oob_password', { + initialValue: device_page_resp.oob_password + })( + <Input disabled={!isOobEdit} type={showPwd ? 'text' : 'password'} addonAfter={<Icon type='eye' onClick={() => this.setState({ showPwd: !this.state.showPwd })} />} /> + )} + </FormItem> + </Col> + { + isOobEdit && + <Col span={8}> + <FormItem label={'带外密码(新)'}> + <span>新密码默认随机生成</span> + </FormItem> + </Col> + } + + </Row> + </div> + <div className='pull-right'> + {isOSSystemInfoEdit ? + <div> + <Button onClick={() => { + this.setState({ isOSSystemInfoEdit: false }); + this.reloadOS(); + }} style={{ marginRight: 8 }} + >取消</Button> + <Button onClick={() => this.handleOSSystemInfoSubmit()} type='primary' >保存</Button> + </div> : + <Button disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_physical_machine_update_oob')} + onClick={() => this.setState({ isOSSystemInfoEdit: true })} + ><Icon type='edit' theme='outlined' />修改系统信息</Button> + } + </div> + <h3 className='detail-title'>系统信息</h3> + <div className='detail-info'> + <Row> + {renderFormDetail([ + { + label: '内网 IP', + value: device_page_resp.intranet_ip + }, + { + label: '外网 IP', + value: device_page_resp.extranet_ip + } + ])} + </Row> + <Row> + {renderFormDetail([ + { + label: '内网 IPv6', + value: device_page_resp.intranet_ipv6 + }, + { + label: '外网 IPv6', + value: device_page_resp.extranet_ipv6 + } + //{ + // label: '操作系统', + // value: data.os + //} + ])} + </Row> + <Row> + <Col span={8}> + <FormItem label={isOSSystemInfoEdit ? '操作系统(旧)' : '操作系统'}> + {getFieldDecorator('os', { + initialValue: data.os + })( + <Input disabled={!isOSSystemInfoEdit}/> + )} + </FormItem> + </Col> + { + isOSSystemInfoEdit && + <Col span={8}> + <FormItem label={'操作系统(新)'}> + <span>根据新操作系统名称关联PXE装机配置模板(不存在则新增)</span> + </FormItem> + </Col> + } + </Row> + </div> + </TabPane> + <TabPane tab='CPU' key='cpu'> + <Table columns={this.getCpuColumns()} dataSource={cpu.physicals} pagination={false} footer={() => `总计核数: ${cpu.total_cores}`} /> + </TabPane> + <TabPane tab='内存' key='memory'> + <Table columns={this.getMemoryColumns()} dataSource={memory.items} pagination={false} footer={() => `总计容量: ${memory.total_size_mb} MB`} /> + </TabPane> + <TabPane tab='存储' key='disk'> + {raid.items && raid.items.length > 0 ? + <Table defaultExpandAllRows={true} columns={this.getRaidColumns()} title={() => `RAID卡`} expandedRowRender={this.expandedRowRender} dataSource={raid.items} pagination={false} /> + : + <Table title={() => `磁盘`} columns={this.getDiskColumns()} dataSource={disk_slot.items} pagination={false} /> + } + </TabPane> + <TabPane tab='网卡' key='nic'> + <Table columns={this.getNicColumns()} dataSource={nic.items} pagination={false} /> + </TabPane> + <TabPane tab='主板' key='motherboard'> + <Table columns={this.getMotherboardColumns()} dataSource={[motherboard]} pagination={false} /> + </TabPane> + <TabPane tab='带外' key='oob'> + <Table columns={this.getOobNetworkColumns()} dataSource={oob.network ? [oob.network] : []} pagination={false} title={() => '网络'} /> + <Table columns={this.getOobUserColumns()} dataSource={oob.user || []} pagination={false} title={() => '用户'} /> + <div className='ant-table-title'> + 固件版本 + </div> + <div>{oob.firmware}</div> + </TabPane> + <TabPane tab='PCI' key='pci'> + <Table columns={this.getPciColumns()} dataSource={pci.slots} pagination={false} footer={() => `插槽总数: ${pci.total_slots} 个`} /> + </TabPane> + <TabPane tab='HBA' key='hba'> + <Table columns={this.getHbaColumns()} dataSource={hba.items} pagination={false} /> + </TabPane> + <TabPane tab='生命周期记录' key='lifecycle_log'> + <Table columns={this.getLifecycleLogColumns()} dataSource={device_lifecycle_detail_page.lifecycle_log} pagination={false} /> + </TabPane> + </Tabs> + </Layout> + ); + } + + getCpuColumns = () => { + return [ + { + title: 'CPU型号', + dataIndex: 'model_name', + key: 'model_name', + width: '50%' + }, + { + title: 'CPU核数', + dataIndex: 'cores', + key: 'cores', + width: '50%' + } + ]; + }; + getDiskColumns = () => { + return [ + { + title: '物理驱动器', + dataIndex: 'name', + key: 'name', + width: '30%' + }, + { + title: '容量', + dataIndex: 'raw_size', + key: 'raw_size', + width: '30%' + }, + { + title: '类型', + dataIndex: 'media_type', + key: 'media_type', + width: '40%' + } + ]; + }; + getRaidColumns = () => { + return [ + { + title: 'ID', + dataIndex: 'id', + key: 'id', + width: '30%' + }, + { + title: '型号', + dataIndex: 'model_name', + key: 'model_name', + width: '30%' + }, + { + title: '固件版本', + dataIndex: 'firmware_version', + key: 'firmware_version', + width: '40%' + } + ]; + }; + getMemoryColumns = () => { + return [ + { + title: '内存卡', + dataIndex: 'locator', + key: 'locator', + width: '25%' + }, + { + title: '容量', + dataIndex: 'size', + key: 'size', + width: '25%' + }, + { + title: '速率', + dataIndex: 'speed', + key: 'speed', + width: '25%' + }, + { + title: '类型', + dataIndex: 'type', + key: 'type', + width: '25%' + } + ]; + }; + getLifecycleLogColumns = () => { + return [ + { + title: '操作类型', + dataIndex: 'operation_type', + key: 'operation_type', + width: '10%' + }, + { + title: '操作内容', + dataIndex: 'operation_detail', + key: 'operation_detail', + width: '60%', + render: (text) => <Tooltip placement="leftTop" title={text}>{text}</Tooltip> + }, + { + title: '操作用户', + dataIndex: 'operation_user', + key: 'operation_user', + width: '10%' + }, + { + title: '操作时间', + dataIndex: 'operation_time', + key: 'operation_time', + width: '20%' + } + ]; + }; + getNicColumns = () => { + return [ + { + title: '名称', + dataIndex: 'name', + key: 'name' + }, + { + title: 'Mac', + dataIndex: 'mac', + key: 'mac' + }, + { + title: 'BootOS IP', + dataIndex: 'ip', + key: 'ip' + }, + { + title: '设备总线', + dataIndex: 'businfo', + key: 'businfo' + }, + { + title: '槽位', + dataIndex: 'designation', + key: 'designation' + }, + { + title: '内/外置', + dataIndex: 'side', + key: 'side', + render: (text) => { + return NICSIDE[text]; + } + }, + { + title: '速率', + dataIndex: 'speed', + key: 'speed' + }, + { + title: '厂商', + dataIndex: 'company', + key: 'company' + }, + { + title: '型号', + dataIndex: 'model_name', + key: 'model_name' + }, + { + title: '固件版本', + dataIndex: 'firmware_version', + key: 'firmware_version' + } + ]; + }; + getPciColumns = () => { + return [ + { + title: '槽位', + dataIndex: 'designation', + key: 'designation', + width: '30%' + }, + { + title: '设备类型', + dataIndex: 'type', + key: 'type', + width: '30%' + }, + { + title: '当前使用情况', + dataIndex: 'current_usage', + key: 'current_usage', + width: '40%' + } + ]; + }; + getHbaColumns = () => { + return [ + { + title: '主机', + dataIndex: 'host', + key: 'host', + width: '30%' + }, + { + title: 'WWPN', + dataIndex: 'wwpns', + key: 'wwpns', + width: '30%' + }, + { + title: 'WWNN', + dataIndex: 'wwnns', + key: 'wwnns', + width: '40%' + } + ]; + }; + getOobNetworkColumns = () => { + return [ + { + title: 'IP 来源', + dataIndex: 'ip_src', + key: 'ip_src', + width: '25%' + }, + { + title: 'IP', + dataIndex: 'ip', + key: 'ip', + width: '25%' + }, + { + title: '掩码', + dataIndex: 'netmask', + key: 'netmask', + width: '25%' + }, + { + title: '网关', + dataIndex: 'gateway', + key: 'gateway', + width: '25%' + } + ]; + }; + getOobUserColumns = () => { + return [ + { + title: 'ID', + dataIndex: 'id', + key: 'id', + width: '30%' + }, + { + title: '用户名', + dataIndex: 'name', + key: 'name', + width: '30%' + }, + { + title: '权限级别', + dataIndex: 'privilege_level', + key: 'privilege_level', + width: '40%', + render: (text) => { + return PRIVILEGE_LEVEL[text]; + } + } + ]; + }; + getMotherboardColumns = () => { + return [ + { + title: '厂商', + dataIndex: 'manufacturer', + key: 'manufacturer', + width: '30%' + }, + { + title: '产品型号', + dataIndex: 'product_name', + key: 'product_name', + width: '30%' + }, + { + title: '序列号', + dataIndex: 'serial_number', + key: 'serial_number', + width: '40%' + } + ]; + }; + //Raid卡内置网卡的表格渲染 + expandedRowRender = (record) => { + const { detailInfo } = this.props.data; + const { disk_slot } = detailInfo.data; + const diskList = []; + if (disk_slot.items) { + disk_slot.items.forEach(data => { + if (data.controller_id === record.id) { + diskList.push(data); + } + }); + } + return <Table title={() => `磁盘`} columns={this.getDiskColumns()} dataSource={diskList} pagination={false} />; + }; +} +function mapStateToProps(state) { + return { + data: state.get('device-detail').toJS(), + userInfo: state.getIn([ 'global', 'userData' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Form.create()(Container)); diff --git a/cyclone-web/app/containers/device/detail/reducers/index.js b/cyclone-web/app/containers/device/detail/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..aa773ba8637d5a6193ce9c71851e2740b97e5629 --- /dev/null +++ b/cyclone-web/app/containers/device/detail/reducers/index.js @@ -0,0 +1,63 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createRegularReducer } from 'utils/regular-reducer'; + +const initialState = fromJS({ + detailInfo: { + loading: true, + data: { + device_page_resp: { + + }, + device_lifecycle_detail_page: { + + }, + cpu: { + physicals: [] + }, + disk: { + + }, + disk_slot: { + items: [] + }, + memory: { + items: [] + }, + nic: { + items: [] + }, + oob: { + network: [], + user: [{}] + }, + pci: { + slots: [] + }, + hba: { + item: [] + }, + raid: { + items: [] + }, + motherboard: { + + } + } + }, + idc: { + data: [], + loading: true + } +}); + +const reducer = handleActions( + { + ...createRegularReducer('device-detail/detail-info', 'detailInfo'), + ...createRegularReducer('device-detail/idc', 'idc') + }, + initialState, +); + + +export default reducer; diff --git a/cyclone-web/app/containers/device/detail/sagas/index.js b/cyclone-web/app/containers/device/detail/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..a8b2b634d3fddc86515e9c09e2ab0cc219849816 --- /dev/null +++ b/cyclone-web/app/containers/device/detail/sagas/index.js @@ -0,0 +1,52 @@ +import { get, getWithArgs } from 'common/xFetch2'; +import { takeEvery } from 'redux-saga'; +import { call, put } from 'redux-saga/effects'; +import { notification } from 'antd'; + +let created = false; +function* empty() { + return; +} + +function* defaultSaga() { + const watchers = yield [ + takeEvery('device-detail/detail-info/get', getDetailInfo) + ]; +} + + + +import { createTableListSaga } from 'utils/tableList-saga'; +const idcSaga = createTableListSaga({ + actionNamePrefix: 'device-detail/idc', + datasource: '/api/cloudboot/v1/idcs' +}); + + +function* getDetailInfo(action) { + try { + yield put({ + type: 'device-detail/detail-info/load' + }); + + const res = yield call(get, `/api/cloudboot/v1/devices/${action.payload}/combined`); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + yield put({ + type: 'device-detail/detail-info/load/success', + payload: res.content + }); + + } catch (error) { + console.log(error); + } +} + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [ defaultSaga, idcSaga ]; +} diff --git a/cyclone-web/app/containers/device/entry/actions/add-device.jsx b/cyclone-web/app/containers/device/entry/actions/add-device.jsx new file mode 100644 index 0000000000000000000000000000000000000000..51bf08dd1bd8164c02b5a3cf22c870b32a372655 --- /dev/null +++ b/cyclone-web/app/containers/device/entry/actions/add-device.jsx @@ -0,0 +1,26 @@ +import React from 'react'; +import Popup from 'components/popup'; +import DeviceTable from 'containers/device/common/device'; + +export default function action(options) { + let query = { operation_status: 'run_with_alarm,run_without_alarm,on_shelve' }; + const onSuccess = () => { + Popup.close(); + }; + Popup.open({ + title: '选择设备', + width: 1000, + onCancel: () => { + Popup.close(); + }, + content: ( + <DeviceTable + getServerRoom={true} + limit={50} + query={query} + handleSubmit={(tableData) => options.handleDeviceSubmit(tableData, onSuccess)} + /> + ) + }); + +} diff --git a/cyclone-web/app/containers/device/entry/actions/add-hardware.jsx b/cyclone-web/app/containers/device/entry/actions/add-hardware.jsx new file mode 100644 index 0000000000000000000000000000000000000000..3ac7a218fc23d60efdd32395de238dc79d8e6080 --- /dev/null +++ b/cyclone-web/app/containers/device/entry/actions/add-hardware.jsx @@ -0,0 +1,23 @@ +import React from 'react'; +import Popup from 'components/popup'; +import HardwareTable from './hardware'; + +export default function action(options) { + const onSuccess = () => { + Popup.close(); + }; + Popup.open({ + title: 'RAID类型', + width: 1000, + onCancel: () => { + Popup.close(); + }, + content: ( + <HardwareTable + {...options} + handleSubmit={(tableData) => options.handleHardwareSubmit(tableData, onSuccess)} + /> + ) + }); + +} diff --git a/cyclone-web/app/containers/device/entry/actions/add-recycling-device.jsx b/cyclone-web/app/containers/device/entry/actions/add-recycling-device.jsx new file mode 100644 index 0000000000000000000000000000000000000000..dc0ac6479756f12951e8105dd92d5c8916c06ace --- /dev/null +++ b/cyclone-web/app/containers/device/entry/actions/add-recycling-device.jsx @@ -0,0 +1,26 @@ +import React from 'react'; +import Popup from 'components/popup'; +import DeviceTable from 'containers/device/common/device'; + +export default function action(options) { + let query = { operation_status: 'recycling' }; + const onSuccess = () => { + Popup.close(); + }; + Popup.open({ + title: '选择设备', + width: 1000, + onCancel: () => { + Popup.close(); + }, + content: ( + <DeviceTable + getServerRoom={true} + limit={50} + query={query} + handleSubmit={(tableData) => options.handleDeviceSubmit(tableData, onSuccess)} + /> + ) + }); + +} diff --git a/cyclone-web/app/containers/device/entry/actions/add-system.jsx b/cyclone-web/app/containers/device/entry/actions/add-system.jsx new file mode 100644 index 0000000000000000000000000000000000000000..753e7d3d0c2ca97e2041b05f0850fe26bd921404 --- /dev/null +++ b/cyclone-web/app/containers/device/entry/actions/add-system.jsx @@ -0,0 +1,23 @@ +import React from 'react'; +import Popup from 'components/popup'; +import SystemTable from './system'; + +export default function action(options) { + const onSuccess = () => { + Popup.close(); + }; + Popup.open({ + title: '操作系统', + width: 1000, + onCancel: () => { + Popup.close(); + }, + content: ( + <SystemTable + {...options} + handleSubmit={(tableData) => options.handleSysTemplateSubmit(tableData, onSuccess)} + /> + ) + }); + +} diff --git a/cyclone-web/app/containers/device/entry/actions/bunch-edit.jsx b/cyclone-web/app/containers/device/entry/actions/bunch-edit.jsx new file mode 100644 index 0000000000000000000000000000000000000000..e48d4a1c554eab691622647c0ac2f08821ca5f95 --- /dev/null +++ b/cyclone-web/app/containers/device/entry/actions/bunch-edit.jsx @@ -0,0 +1,102 @@ +import React from 'react'; +import Popup from 'components/popup'; +import HardwareTable from './hardware'; +import SystemTable from './system'; +import { Tabs, Radio, Alert, Button } from 'antd'; +const TabPane = Tabs.TabPane; + +export default function action(options) { + + const onSuccess = () => { + Popup.close(); + }; + + const ipChange = (e) => { + options.dispatch({ + type: 'bunchEdit/ip/data', + payload: e.target.value + }); + }; + const inipv6Change = (e) => { + options.dispatch({ + type: 'bunchEdit/inipv6/data', + payload: e.target.value + }); + }; + const exipv6Change = (e) => { + options.dispatch({ + type: 'bunchEdit/exipv6/data', + payload: e.target.value + }); + }; + Popup.open({ + title: '批量编辑', + width: 1000, + onCancel: () => { + Popup.close(); + }, + content: ( + <div> + <div> + <Alert + message={`选择的设备: ${options.selectedRows.map(data => data.sn).join(',')}`} + type='info' + showIcon={true} + style={{ + marginBottom: 10, + overflow: 'hidden', + wordBreak: 'break-all' + }} + /> + </div> + <Tabs> + <TabPane tab='操作系统' key='system'> + <SystemTable + {...options} + bunchEdit={true} + /> + </TabPane> + <TabPane tab='RAID类型' key='hardware'> + <HardwareTable + {...options} + bunchEdit={true} + /> + </TabPane> + <TabPane tab='是否分配外网IPv4' key='ip'> + <div style={{ padding: 20 }}> + 是否分配外网IP: &nbsp;&nbsp; + <Radio.Group onChange={(e) => ipChange(e)}> + <Radio value='yes'>是</Radio> + <Radio value='no'>否</Radio> + </Radio.Group> + </div> + </TabPane> + <TabPane tab='是否分配内网IPv6' key='inipv6'> + <div style={{ padding: 20 }}> + 是否分配内网IPv6: &nbsp;&nbsp; + <Radio.Group onChange={(e) => inipv6Change(e)}> + <Radio value='yes'>是</Radio> + <Radio value='no'>否</Radio> + </Radio.Group> + </div> + </TabPane> + <TabPane tab='是否分配外网IPv6' key='exipv6'> + <div style={{ padding: 20 }}> + 是否分配外网IPv6: &nbsp;&nbsp; + <Radio.Group onChange={(e) => exipv6Change(e)}> + <Radio value='yes'>是</Radio> + <Radio value='no'>否</Radio> + </Radio.Group> + </div> + </TabPane> + </Tabs> + <div className='panel-footer col-right'> + <Button type='primary' onClick={() => options.handleBunchEdit(onSuccess)}> + 确定 + </Button> + </div> + </div> + ) + }); + +} diff --git a/cyclone-web/app/containers/device/entry/actions/hardware/async-actions/index.js b/cyclone-web/app/containers/device/entry/actions/hardware/async-actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..47e56b826ac7edea17481d106a99662dd0db315f --- /dev/null +++ b/cyclone-web/app/containers/device/entry/actions/hardware/async-actions/index.js @@ -0,0 +1,11 @@ +import { post, get, getWithArgs } from 'common/xFetch2'; + +import { createTableAsyncAction } from 'utils/table-async-action'; + +export default { + ...createTableAsyncAction({ + actionNamePrefix: 'hardware/table-data', + tableDataPath: ['tableData'], + datasource: '/api/cloudboot/v1/hardware-templates' + }) +}; diff --git a/cyclone-web/app/containers/device/entry/actions/hardware/index.jsx b/cyclone-web/app/containers/device/entry/actions/hardware/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..b7442edc2ecc4e2834e34c3b6e1f687a95f89ff9 --- /dev/null +++ b/cyclone-web/app/containers/device/entry/actions/hardware/index.jsx @@ -0,0 +1,182 @@ +import React from 'react'; +import { + Select, + Table, + Pagination, + Button, + notification +} from 'antd'; +import { createTableStore } from 'utils/table-reducer'; +import handleAction from './sync-actions/index'; +import asyncActions from './async-actions/index'; +import M from 'immutable'; +const Option = Select.Option; + +export default class OperationTarget extends React.Component { + componentDidMount() { + this.dispatch({ + type: 'hardware/table-data/get' + }); + const { record } = this.props; + if (record.hardware_tpl_id && record.hardware_tpl_id !== 0) { + this.dispatch({ + type: 'hardware/table-data/set/selectedRows', + payload: { + selectedRowKeys: [record.hardware_tpl_id], + selectedRows: [{ id: record.hardware_tpl_id, name: record.hardware_tpl_name }] + } + }); + } + } + + constructor(props) { + super(props); + this.state = { + data: M.fromJS({ + tableData: createTableStore() + }) + }; + } + getState = () => { + return this.state.data; + }; + getColumns = () => { + return [ + { + title: '名称', + dataIndex: 'name', + width: 200 + } + // { + // title: '厂商', + // dataIndex: 'vendor', + // width: 200 + // }, + // { + // title: '产品型号', + // dataIndex: 'model_name', + // width: 200 + // }, + // { + // title: '配置内容', + // dataIndex: 'data_config', + // width: 200, + // render: (text, record) => { + // const data = record.data || []; + // return <span>{[...new Set(data.map(d => d.category))].join(' | ')}</span>; + // } + // } + ]; + }; + + + dispatch = action => { + if (asyncActions[action.type]) { + asyncActions[action.type]( + this.state.data, + action, + this.dispatch, + this.getState + ); + return; + } + + const data = handleAction(this.state.data, action); + this.setState({ + data + }); + }; + render() { + return ( + <div className='host'> + <div className='panel'> + <div className='panel-body'>{this.renderBody()}</div> + { !this.props.bunchEdit && <div className=' panel-footer'> + <Button type='primary' onClick={this.handleSubmit}> + 确定 + </Button> + </div>} + </div> + </div> + ); + } + + + renderBody() { + const tableData = this.state.data.get('tableData').toJS(); + const { list, pagination, loading, selectedRowKeys, selectedRows } = tableData; + const rowSelection = { + type: 'radio', + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.dispatch({ + type: 'hardware/table-data/set/selectedRows', + payload: { + selectedRowKeys, + selectedRows + } + }); + if (this.props.bunchEdit) { + this.props.dispatch({ + type: 'bunchEdit/hardware/data', + payload: selectedRows[0] + }); + } + } + }; + + return ( + <div className='node-body'> + <Table + rowKey={'id'} + rowSelection={rowSelection} + scroll={{ y: 200 }} + columns={this.getColumns()} + pagination={false} + dataSource={list} + loading={loading} + /> + <Pagination + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + showTotal={(total) => `共 ${total} 条`} + onShowSizeChange={(page, pageSize) => { + this.dispatch({ + type: 'hardware/table-data/change-page-size', + payload: { + page, + pageSize + } + }); + }} + onChange={page => { + this.dispatch({ + type: 'hardware/table-data/change-page', + payload: { + page + } + }); + }} + /> + </div> + ); + } + + handleSubmit = ev => { + const tableData = this.state.data.get('tableData').toJS(); + const { selectedRows } = tableData; + //单次编辑时选择硬件配置 + if (!this.props.bunchEdit && selectedRows.length < 1) { + return notification.error({ message: '请选择RAID类型' }); + } + if (this.props.bunchEdit && selectedRows.length > 0) { + this.props.dispatch({ + type: 'bunchEdit/hardware/data', + payload: selectedRows[0] + }); + } + this.props.handleSubmit(selectedRows[0]); + }; +} diff --git a/cyclone-web/app/containers/device/entry/actions/hardware/sync-actions/index.js b/cyclone-web/app/containers/device/entry/actions/hardware/sync-actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..d137ef5ab87e27a7ca6b119ce742722334f0557f --- /dev/null +++ b/cyclone-web/app/containers/device/entry/actions/hardware/sync-actions/index.js @@ -0,0 +1,23 @@ +import { createTableReducer } from 'utils/table-reducer'; + +const reducers = { + ...createTableReducer('hardware/table-data', ['tableData']) +}; + +const handleAction = (state, action) => { + + // action is an array + if (action instanceof Array) { + return action.reduce((state, action) => { + return handleAction(state, action); + }, state); + } + + const type = action.type; + if (!reducers[type]) { + return state; + } + return reducers[type](state, action); +}; + +export default handleAction; diff --git a/cyclone-web/app/containers/device/entry/actions/index.js b/cyclone-web/app/containers/device/entry/actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..0ae0a39ec1efc66753bee760da37cb4629143c49 --- /dev/null +++ b/cyclone-web/app/containers/device/entry/actions/index.js @@ -0,0 +1,13 @@ +import addDevice from './add-device'; +import addHardware from './add-hardware'; +import addSystem from './add-system'; +import bunchEdit from './bunch-edit'; +import addRecyclingDevice from './add-recycling-device'; + +export default { + addDevice, + addRecyclingDevice, + addHardware, + addSystem, + bunchEdit +}; diff --git a/cyclone-web/app/containers/device/entry/actions/system/async-actions/index.js b/cyclone-web/app/containers/device/entry/actions/system/async-actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..6e1472c53c50dfdeb095cdeab11d2d148599915f --- /dev/null +++ b/cyclone-web/app/containers/device/entry/actions/system/async-actions/index.js @@ -0,0 +1,17 @@ +import { post, get, getWithArgs } from 'common/xFetch2'; + +import { createTableAsyncAction } from 'utils/table-async-action'; + +export default { + ...createTableAsyncAction({ + actionNamePrefix: 'system/table-data', + tableDataPath: ['tableData'], + noMoreQuery: true, + datasource: '/api/cloudboot/v1/os-templates', + getExtraQuery: () => { + return { + os_lifecycle: 'active_default,active' + }; + } + }) +}; diff --git a/cyclone-web/app/containers/device/entry/actions/system/index.jsx b/cyclone-web/app/containers/device/entry/actions/system/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..c73f2a4bc485b464bd29fb0d9cebbb3718cd2ef5 --- /dev/null +++ b/cyclone-web/app/containers/device/entry/actions/system/index.jsx @@ -0,0 +1,186 @@ +import React from 'react'; +import { + Table, + Button, + notification, + Tabs, + Tooltip +} from 'antd'; +import { createTableStore } from 'utils/table-reducer'; +import handleAction from './sync-actions/index'; +import asyncActions from './async-actions/index'; +import M from 'immutable'; +import { BOOT_MODE, INSTALL_TYPE, OS_LIFECYCLE } from "common/enums"; +import Layout from 'components/layout/page-layout-tabs'; + +const TabPane = Tabs.TabPane; + +function listFilter(target, key) { + const result = [] + target.map(item =>{ + if (item["install_type"] == key) { + result.push(item) + }; + }); + return result +}; + +export default class OperationTarget extends React.Component { + componentDidMount() { + this.dispatch({ + type: 'system/table-data/get' + }); + } + + constructor(props) { + super(props); + this.state = { + data: M.fromJS({ + tableData: createTableStore() + }) + }; + } + getState = () => { + return this.state.data; + }; + getColumns = () => { + return [ + { + title: '名称', + dataIndex: 'name', + width: 300 + }, + { + title: '操作系统', + dataIndex: 'family', + width: 100 + }, + { + title: '安装方式', + dataIndex: 'install_type', + width: 100, + render: (text) => <span>{INSTALL_TYPE[text]}</span> + }, + { + title: '启动方式', + dataIndex: 'boot_mode', + width: 100, + render: (text) => <span>{BOOT_MODE[text]}</span> + }, + { + title: '架构', + dataIndex: 'arch', + width: 100 + }, + { + title: '生命周期', + dataIndex: 'os_lifecycle', + width: 100, + render: (text) => <Tooltip placement="top" title='默认仅提供Active版本'><span>{OS_LIFECYCLE[text]}</span></Tooltip> + }, + ]; + }; + + + dispatch = action => { + if (asyncActions[action.type]) { + asyncActions[action.type]( + this.state.data, + action, + this.dispatch, + this.getState + ); + return; + } + + const data = handleAction(this.state.data, action); + this.setState({ + data + }); + }; + + // 改变标签时通过传参过滤得到对应安装方式的数据 + onTabChange = (key) => { + const installType = key + this.setState({installType}) + } + + render() { + return ( + <div className='host'> + <div className='panel'> + <div className='panel-body'> + <Layout title='安装方式'> + <Tabs onChange={this.onTabChange} > + <TabPane tab={<span>镜像</span>} key='image'>{this.renderBody()}</TabPane> + <TabPane tab={<span>PXE</span>} key='pxe'>{this.renderBody()}</TabPane> + </Tabs> + </Layout> + </div> + { !this.props.bunchEdit && <div className=' panel-footer'> + <Button type='primary' onClick={this.handleSubmit}> + 确定 + </Button> + </div>} + </div> + </div> + ); + } + + renderBody() { + const tableData = this.state.data.get('tableData').toJS(); + const { list, loading, selectedRowKeys, selectedRows } = tableData; + var filteredList = [] + + // 默认展示镜像安装方式的数据 + if (this.state.installType) { + filteredList = listFilter(list,this.state.installType) + } else { + filteredList = listFilter(list,'image') + } + + const rowSelection = { + type: 'radio', + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.dispatch({ + type: 'system/table-data/set/selectedRows', + payload: { + selectedRowKeys, + selectedRows + } + }); + if (this.props.bunchEdit) { + this.props.dispatch({ + type: 'bunchEdit/system/data', + payload: selectedRows[0] + }); + } + } + }; + + + return ( + <div className='node-body'> + <Table + rowKey={'id'} + rowSelection={rowSelection} + scroll={{ y: 200 }} + columns={this.getColumns()} + pagination={false} + dataSource={filteredList} + loading={loading} + /> + </div> + ); + } + + handleSubmit = () => { + const tableData = this.state.data.get('tableData').toJS(); + const { selectedRows } = tableData; + if (selectedRows.length < 1) { + return notification.error({ message: '请选择操作系统' }); + } + this.props.handleSubmit(selectedRows[0]); + }; +} diff --git a/cyclone-web/app/containers/device/entry/actions/system/sync-actions/index.js b/cyclone-web/app/containers/device/entry/actions/system/sync-actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..16430b7407a8755d7f5ac2cf505233dfa2c317c8 --- /dev/null +++ b/cyclone-web/app/containers/device/entry/actions/system/sync-actions/index.js @@ -0,0 +1,23 @@ +import { createTableReducer } from 'utils/table-reducer'; + +const reducers = { + ...createTableReducer('system/table-data', ['tableData']) +}; + +const handleAction = (state, action) => { + + // action is an array + if (action instanceof Array) { + return action.reduce((state, action) => { + return handleAction(state, action); + }, state); + } + + const type = action.type; + if (!reducers[type]) { + return state; + } + return reducers[type](state, action); +}; + +export default handleAction; diff --git a/cyclone-web/app/containers/device/entry/components/table.jsx b/cyclone-web/app/containers/device/entry/components/table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..1ca8f6b40e5fc438e7fc0bfda634d9e4f741e277 --- /dev/null +++ b/cyclone-web/app/containers/device/entry/components/table.jsx @@ -0,0 +1,573 @@ +import React from 'react'; +import { Table, Input, Button, Popconfirm, Form, Modal, Badge } from 'antd'; +const FormItem = Form.Item; +import actions from '../actions'; +const EditableContext = React.createContext(); +import { notification, Switch } from 'antd'; +import { post } from 'common/xFetch2'; +const confirm = Modal.confirm; +import { hashHistory } from 'react-router'; +import { YES_NO, OPERATION_STATUS_COLOR } from "common/enums"; +import ApprovalForm from 'containers/approval/apply_pages/reInstall/form'; + +const EditableRow = ({ form, index, ...props }) => ( + <EditableContext.Provider value={form}> + <tr {...props} /> + </EditableContext.Provider> +); + +const EditableFormRow = Form.create()(EditableRow); + +class EditableCell extends React.Component { + state = { + editing: false + }; + + componentDidMount() { + if (this.props.editable) { + document.addEventListener('click', this.handleClickOutside, true); + } + } + + componentWillUnmount() { + if (this.props.editable) { + document.removeEventListener('click', this.handleClickOutside, true); + } + } + + toggleEdit = () => { + const editing = !this.state.editing; + this.setState({ editing: true }, () => { + if (editing && this.input) { + this.input.focus(); + } + }); + }; + + handleClickOutside = (e) => { + const { editing } = this.state; + if (editing && this.cell !== e.target && !this.cell.contains(e.target)) { + this.save(); + } + }; + + save = () => { + const { record, handleSave } = this.props; + this.form.validateFields((error, values) => { + if (error) { + return; + } + this.toggleEdit(); + handleSave({ ...record, ...values }); + }); + }; + + + render() { + const { editing } = this.state; + const { + editable, + dataIndex, + title, + record, + required, + placeholder, + ...restProps + } = this.props; + return ( + <td ref={node => (this.cell = node)} {...restProps}> + {editable ? ( + <EditableContext.Consumer> + {(form) => { + this.form = form; + return ( + editing ? ( + <FormItem style={{ margin: 0 }}> + {form.getFieldDecorator(dataIndex, { + rules: [{ + required: required, + message: `${title} 不能为空` + }], + initialValue: record[dataIndex] + })( + <Input + placeholder={placeholder} + ref={node => (this.input = node)} + onPressEnter={this.save} + /> + )} + </FormItem> + ) : ( + <div + className='editable-cell-value-wrap' + style={{ paddingRight: 24 }} + onClick={this.toggleEdit} + > + {restProps.children} + </div> + ) + ); + }} + </EditableContext.Consumer> + ) : restProps.children} + </td> + ); + } +} + +export default class EditableTable extends React.Component { + constructor(props) { + super(props); + this.columns = [{ + title: '固资编号', + dataIndex: 'fixed_asset_number', + width: 150, + }, { + title: '序列号', + dataIndex: 'sn', + width: 150, + }, { + title: '操作系统', + dataIndex: 'os_template_name', + width: 200, + required: true, + render: (text, record) => { + if (text) { + return ( + <div style={{ position: 'relative' }}> + <span className='hover-edit' onClick={() => this.execAction('addSystem', record)}>{text}</span> + </div> + ); + } + return ( + <Button icon='plus' onClick={() => this.execAction('addSystem', record)}>操作系统</Button> + ); + } + }, { + title: 'RAID类型', + dataIndex: 'hardware_template_name', + required: true, + width: 200, + render: (text, record) => { + if (text) { + return <span className='hover-edit' onClick={() => this.execAction('addHardware', record)}>{text}</span>; + } + return ( + <Button icon='plus' onClick={() => this.execAction('addHardware', record)}>RAID类型</Button> + ); + } + }, { + title: '分配外网IPv4', + dataIndex: 'need_extranet_ip', + editable: false, + required: true, + width: 10, + type: 'select', + render: (text, record) => { + return <Switch checkedChildren='是' unCheckedChildren='否' checked={text === 'yes'} onChange={(value) => this.onCheckNeedExIPChange(value, record)} />; + } + }, + { + title: '分配内网IPv6', + dataIndex: 'need_intranet_ipv6', + width: 10, + editable: false, + required: true, + type: 'select', + render: (text, record) => { + return <Switch checkedChildren='是' unCheckedChildren='否' checked={text === 'yes'} onChange={(value) => this.onCheckNeedInIPv6Change(value, record)} />; + } + }, + { + title: '分配外网IPv6', + dataIndex: 'need_extranet_ipv6', + editable: false, + required: true, + width: 10, + type: 'select', + render: (text, record) => { + return <Switch checkedChildren='是' unCheckedChildren='否' checked={text === 'yes'} onChange={(value) => this.onCheckNeedExIPv6Change(value, record)} />; + } + }, + { + title: '设备类型', + dataIndex: 'category', + width: 10, + }, + { + title: '用途', + dataIndex: 'usage', + width: 10, + }, { + title: '机架编号', + dataIndex: 'server_cabinet', + width: 10, + render: (text) => <span>{text ? text.number : ''}</span> + }, { + title: '机位编号', + dataIndex: 'server_usite', + width: 10, + render: (text) => <span>{text ? text.number : ''}</span> + }, + { + title: '物理区域', + dataIndex: 'physical_area', + width: 180, + render: (t, record) => record.server_usite ? record.server_usite.physical_area : '' + }, + { + title: '运营状态', + dataIndex: 'operation_status', + width: 10, + render: type => { + const color = OPERATION_STATUS_COLOR[type] ? OPERATION_STATUS_COLOR[type][0] : 'transparent'; + const word = OPERATION_STATUS_COLOR[type] ? OPERATION_STATUS_COLOR[type][1] : ''; + return ( + <div> + <Badge + dot={true} + style={{ + background: color + }} + />{' '} + {word} + </div> + ); + } + }, + { + title: '操作', + dataIndex: 'operation', + render: (text, record) => { + return ( + this.state.dataSource.length >= 1 + ? ( + <Popconfirm title='确定删除吗?' onConfirm={() => this.handleDelete(record.sn)}> + <a href='javascript:;' style={{ color: 'rgb(255, 55, 0)' }}>删除</a> + </Popconfirm> + ) : null + ); + } + }]; + + this.state = { + dataSource: props.dataSource || [], + selectedRowKeys: [], + selectedRows: [], + loading: false //保存按钮是否激活 + }; + } + + onCheckNeedExIPChange = (v, record) => { + record.need_extranet_ip = v ? 'yes' : 'no'; + const { dataSource } = this.state; + dataSource.map(data => { + if (data.id === record.id) { + data.need_extranet_ip = v ? 'yes' : 'no'; + } + }); + this.setState({ dataSource }); + }; + + onCheckNeedInIPv6Change = (v, record) => { + record.need_intranet_ipv6 = v ? 'yes' : 'no'; + const { dataSource } = this.state; + dataSource.map(data => { + if (data.id === record.id) { + data.need_intranet_ipv6 = v ? 'yes' : 'no'; + } + }); + this.setState({ dataSource }); + }; + + onCheckNeedExIPv6Change = (v, record) => { + record.need_extranet_ipv6 = v ? 'yes' : 'no'; + const { dataSource } = this.state; + dataSource.map(data => { + if (data.id === record.id) { + data.need_extranet_ipv6 = v ? 'yes' : 'no'; + } + }); + this.setState({ dataSource }); + }; + + handleDelete = (sn) => { + const dataSource = [...this.state.dataSource]; + this.setState({ dataSource: dataSource.filter(item => item.sn !== sn) }); + }; + + execAction = (name, record, selectedRows) => { + if (name === 'bunchEdit') { + if (selectedRows.length < 1) { + return notification.error({ message: '请至少选择一台设备' }); + } + //清空数据 + this.props.dispatch({ + type: 'bunchEdit/data/clear' + }); + } + + if (actions[name]) { + actions[name]({ + record, + selectedRows, + dispatch: this.props.dispatch, + type: this.props.type, + handleBunchEdit: (onSuccess) => { + const { sysData, hardwareData, ip, inipv6, exipv6 } = this.props; + const { selectedRows, dataSource } = this.state; + //修改硬件配置 + if (hardwareData.id) { + selectedRows.map(data => { + data.hardware_template_name = hardwareData.name; + }); + } + //修改系统配置 + if (sysData.id) { + selectedRows.map(data => { + data.install_type = sysData.install_type; + data.os_template_name = sysData.name; + }); + } + //修改IP + if (ip) { + selectedRows.map(data => { + data.need_extranet_ip = ip; + }); + } + if (inipv6) { + selectedRows.map(data => { + data.need_intranet_ipv6 = inipv6; + }); + } + if (exipv6) { + selectedRows.map(data => { + data.need_extranet_ipv6 = exipv6; + }); + } + //修改dataSource + let newDataSource = []; + if (dataSource.length === selectedRows.length) { + newDataSource = selectedRows; + } else { + const copyData = [...dataSource]; + newDataSource = [ ...copyData, ...selectedRows ]; + newDataSource.splice(-1, selectedRows.length); + } + this.setState({ + dataSource: newDataSource, + selectedRowKeys: [], + selectedRows: [] + }); + onSuccess(); + }, + handleDeviceSubmit: (tableData, onSuccess) => { + const selectedRows = tableData.selectedRows || []; + selectedRows.map(item => { + item.server_room_name = item.server_room.name; + item.need_extranet_ip = 'no'; //给一个默认值 + item.need_intranet_ipv6 = 'no'; //给一个默认值 + item.need_extranet_ipv6 = 'no'; //给一个默认值 + }); + this.setState({ dataSource: selectedRows }); + onSuccess(); + }, + handleHardwareSubmit: (hardwareData, onSuccess) => { + const allDevices = this.state.dataSource; + allDevices.map(data => { + if (data.id === record.id) { + data.hardware_template_name = hardwareData.name; + } + }); + this.setState({ dataSource: allDevices }); + onSuccess(); + }, + handleSysTemplateSubmit: (sysData, onSuccess) => { + const allDevices = this.state.dataSource; + allDevices.map(data => { + if (data.id === record.id) { + data.install_type = sysData.install_type; + data.os_template_name = sysData.name; + } + }); + this.setState({ dataSource: allDevices }); + onSuccess(); + } + }); + } + }; + + getRowSelection = () => { + const selectedRowKeys = this.state.selectedRowKeys; + return { + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.setState({ + selectedRowKeys, + selectedRows + }); + } + }; + }; + + handleSave = (row) => { + const newData = [...this.state.dataSource]; + const index = newData.findIndex(item => row.sn === item.sn); + const item = newData[index]; + newData.splice(index, 1, { + ...item, + ...row + }); + this.setState({ dataSource: newData }); + }; + + handleSubmit = () => { + const newData = [...this.state.dataSource]; + let isReady = false; + const postData = newData.map(data => { + if (!data.os_template_name) { + isReady = false; + return notification.error({ message: `${data.sn} 请选择操作系统` }); + } + if (!data.hardware_template_name) { + isReady = false; + return notification.error({ message: `${data.sn} 请选择RAID类型` }); + } + isReady = true; + return { + sn: data.sn, + install_type: data.install_type, + hardware_template_name: data.hardware_template_name, + os_template_name: data.os_template_name, + need_extranet_ip: data.need_extranet_ip, + need_intranet_ipv6: data.need_intranet_ipv6, + need_extranet_ipv6: data.need_extranet_ipv6, + }; + }); + if (isReady) { + post('/api/cloudboot/v1/devices/settings', postData).then(res => { + this.setState({ loading: true }); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + //操作成功置灰保存按钮,防止多次点击提交 + //this.setState({ loading: true }); + hashHistory.push('/device/setting'); + // confirm({ + // title: '操作成功,是否跳转到装机列表页面', + // content: '', + // okText: '是', + // cancelText: '继续操作', + // onOk: () => { + // hashHistory.push('/device/setting'); + // }, + // onCancel: () => { + // this.reload(); + // } + // }); + }); + } + }; + + reload = () => { + this.setState({ + dataSource: [], + selectedRowKeys: [], + selectedRows: [], + loading: false + }); + }; + + + render() { + const { dataSource, loading } = this.state; + const components = { + body: { + row: EditableFormRow, + cell: EditableCell + } + }; + const columns = this.columns.map((col) => { + if (!col.editable) { + return col; + } + return { + ...col, + onCell: record => ({ + record, + editable: col.editable, + dataIndex: col.dataIndex, + title: col.title, + type: col.type, + placeholder: col.placeholder, + options: col.options, + required: col.required, + addonBefore: col.addonBefore, + handleSave: this.handleSave + }) + }; + }); + return ( + <div> + <div className='operate_btns'> + { + this.props.from === 'approval' && this.props.type === 'reinstall' && + <Button icon='plus' onClick={() => this.execAction('addDevice')} type='primary' style={{ marginRight: 8 }}> + 选择设备 + </Button> + } + { + this.props.from === 'approval' && this.props.type === 'recycle' && + <Button icon='plus' onClick={() => this.execAction('addRecyclingDevice')} type='primary' style={{ marginRight: 8 }}> + 选择设备[回收中] + </Button> + } + + {/*<Button icon='plus' onClick={() => addDevice or addRecyclingDevice({*/} + {/*getServerRoom: true,*/} + {/*query: {*/} + {/*operation_status: 'run_with_alarm,run_without_alarm,on_shelve' or 'recycling' */} + {/*},*/} + {/*limit: 10,*/} + {/*handleDeviceSubmit: (tableData, onSuccess) => {*/} + {/*const selectedRows = tableData.selectedRows || [];*/} + {/*this.setFormValue(selectedRows);*/} + {/*onSuccess();*/} + {/*}*/} + {/*})} type='primary'*/} + {/*>*/} + {/*添加设备*/} + {/*</Button>*/} + + <Button icon='edit' type='primary' onClick={() => this.execAction('bunchEdit', {}, this.state.selectedRows)} style={{ marginRight: 8 }}> + 批量编辑 + </Button> + </div> + <Table + components={components} + rowClassName={() => 'editable-row'} + bordered={true} + dataSource={dataSource} + columns={columns} + pagination={false} + rowSelection={this.getRowSelection()} + /> + { + this.props.from === 'origin' && + <div className='pull-right' style={{ marginTop: 16 }}> + <Button onClick={() => hashHistory.push('/device/list')} style={{ marginRight: 8 }}> + 取消 + </Button> + <Button onClick={this.handleSubmit} type='primary' disabled={loading}> + 保存 + </Button> + </div> + } + { + this.props.from === 'approval' && <ApprovalForm type={this.props.type} dataSource={this.state.dataSource} /> + } + </div> + ); + } +} + diff --git a/cyclone-web/app/containers/device/entry/get-component.js b/cyclone-web/app/containers/device/entry/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..77c015e63a6af69c7aff4a523e7fd0b5ca8d6e91 --- /dev/null +++ b/cyclone-web/app/containers/device/entry/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('device-entry', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/device/entry/index.jsx b/cyclone-web/app/containers/device/entry/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..f66ca04142936a37ce29d12eac63b36abf1cd722 --- /dev/null +++ b/cyclone-web/app/containers/device/entry/index.jsx @@ -0,0 +1,71 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import Table from './components/table'; +import Layout from 'components/layout/page-layout'; +import { getBreadcrumb } from 'common/utils'; + +class Container extends React.Component { + + //type: 'recycle' 回收重装 + //form: "approval" 审批管理 + constructor(props) { + super(props); + this.state = { + from: 'origin', + ...props.location.query + }; + } + + componentDidMount() { + console.log(this.state); + } + + + + render() { + const dataSource = this.props.location.state || []; + if (dataSource.length > 0) { + dataSource.map(item => { + item.server_room_name = item.server_room.name; + item.need_extranet_ip = 'no'; //给一个默认值 + item.need_intranet_ipv6 = 'no'; //给一个默认值 + item.need_extranet_ipv6 = 'no'; //给一个默认值 + }); + } + let name = '上架部署'; + if (this.state.from === 'approval') { + if (this.state.type === 'recycle') { + name = '回收重装'; + } else { + name = '物理机重装'; + } + } + return ( + <Layout> + <div style={{ marginTop: -10 }}> + {getBreadcrumb(name)} + </div> + <Table from={this.state.from} type={this.state.type} dataSource={dataSource} ip={this.props.ip} inipv6={this.props.inipv6} exipv6={this.props.exipv6} hardwareData={this.props.hardwareData} sysData={this.props.sysData} dispatch={this.props.dispatch} userInfo={this.props.userInfo} /> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + userInfo: state.getIn([ 'global', 'userData' ]).toJS(), + hardwareData: state.getIn([ 'device-entry', 'hardwareData' ]).toJS(), + ip: state.getIn([ 'device-entry', 'ip' ]), + inipv6: state.getIn([ 'device-entry', 'inipv6' ]), + exipv6: state.getIn([ 'device-entry', 'exipv6' ]), + sysData: state.getIn([ 'device-entry', 'sysData' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/device/entry/reducers/index.js b/cyclone-web/app/containers/device/entry/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..2c5bc89ce51018a37ab4f983db4fec16c5afcbcc --- /dev/null +++ b/cyclone-web/app/containers/device/entry/reducers/index.js @@ -0,0 +1,40 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; + +const initialState = fromJS({ + loading: true, + hardwareData: {}, + sysData: {}, + ip: 'no', + inipv6: 'no', + exipv6: 'no' +}); + +const reducer = handleActions( + { + 'bunchEdit/hardware/data': (state, action) => { + return state.set('hardwareData', fromJS(action.payload)); + }, + 'bunchEdit/system/data': (state, action) => { + return state.set('sysData', fromJS(action.payload)); + }, + 'bunchEdit/ip/data': (state, action) => { + console.log(action.payload) + return state.set('ip', action.payload); + }, + 'bunchEdit/inipv6/data': (state, action) => { + console.log(action.payload) + return state.set('inipv6', action.payload); + }, + 'bunchEdit/exipv6/data': (state, action) => { + console.log(action.payload) + return state.set('exipv6', action.payload); + }, + 'bunchEdit/data/clear': (state) => { + return state.set('sysData', fromJS({})).set('hardwareData', fromJS({})); + } + }, + initialState, +); + +export default reducer; diff --git a/cyclone-web/app/containers/device/entry/sagas/index.js b/cyclone-web/app/containers/device/entry/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..860cb5889ee8d5014b99b21737141d34aa3851cc --- /dev/null +++ b/cyclone-web/app/containers/device/entry/sagas/index.js @@ -0,0 +1,16 @@ +let created = false; +function* empty() { + console.log(); +} + +function* defaultSaga() { + console.log(); +} + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [defaultSaga]; +} diff --git a/cyclone-web/app/containers/device/inspection/detail/get-component.js b/cyclone-web/app/containers/device/inspection/detail/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..8f1b5d558842146d2da67fc0b6b80b69f0f7cb69 --- /dev/null +++ b/cyclone-web/app/containers/device/inspection/detail/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('device-inspection-detail', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/device/inspection/detail/index.jsx b/cyclone-web/app/containers/device/inspection/detail/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..f2cb0039f81d2a85fe3d121ee2703a9a289f7f0a --- /dev/null +++ b/cyclone-web/app/containers/device/inspection/detail/index.jsx @@ -0,0 +1,297 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import Layout from 'components/layout/page-layout'; +import { Tabs, Table, Form, Select, Tooltip} from 'antd'; +import { renderFormDetail, getBreadcrumb, geTabsTitle } from 'common/utils'; +const TabPane = Tabs.TabPane; +const Option = Select.Option; +import { put } from 'common/xFetch2'; +import { PRIVILEGE_LEVEL, IP_REGEXP, NICSIDE } from 'common/enums'; +import Detail from 'containers/device/common/detail'; +import { INSPECTION_RESULT } from 'common/enums'; +import { hashHistory } from 'react-router'; + + +class Container extends React.Component { + state = { + sn: this.props.params.sn, + startTime: '' + }; + + componentDidMount() { + this.reload(); + } + + reload = () => { + this.props.dispatch({ + type: 'inspection-detail/detail-info/get', + payload: { sn: this.state.sn } + }); + this.props.dispatch({ + type: 'inspection-detail/start-time/get', + payload: this.state.sn + }); + }; + + getResult = (v) => { + this.props.dispatch({ + type: 'inspection-detail/detail-info/get', + payload: { + sn: this.state.sn, + start_time: v + } + }); + this.setState({ startTime: v }); + }; + + getColumns = (type) => { + if (type == "sensor") { + return [ + { + title: '传感器', + dataIndex: 'name', + key: 'name', + width: '20%' + }, + { + title: '类型', + dataIndex: 'type', + key: 'type', + width: '20%' + }, + { + title: '状态', + dataIndex: 'state', + key: 'state', + width: '20%', + render: (text, record) => { + if (text === 'Critical') { + return <span style={{ color: '#ff3700' }}>{text}</span>; + } + return text; + } + }, + { + title: '读数', + dataIndex: 'reading', + key: 'reading', + width: '20%', + render: (text, record) => { + return <span>{text} {record.units}</span>; + } + }, + { + title: '事件', + dataIndex: 'event', + key: 'event', + width: '20%', + render: (text) => <Tooltip placement="top" title={text}>{text}</Tooltip> + } + ]; + } else if (type == "sel"){ + return [ + { + title: '日期', + dataIndex: 'date', + key: 'date', + width: '10%', + }, + { + title: '时间', + dataIndex: 'time', + key: 'time', + width: '10%' + }, + { + title: '类型', + dataIndex: 'type', + key: 'type', + width: '20%' + }, + { + title: '描述', + dataIndex: 'name', + key: 'name', + width: '20%' + }, + { + title: '事件', + dataIndex: 'event', + key: 'event', + width: '20%', + render: (text) => <Tooltip placement="top" title={text}>{text}</Tooltip> + }, + { + title: '状态', + dataIndex: 'state', + key: 'state', + width: '20%', + render: (text, record) => { + if (text === 'Critical') { + return <span style={{ color: '#ff3700' }}>{text}</span>; + } + return text; + } + } + ]; + } + + }; + + renderContent = (loading, dataSource) => { + const { startTime } = this.props; + return ( + <div> + <div className='buttons-margin'> + 巡检时间: + <Select style={{ width: 200 }} onChange={this.getResult} value={this.state.startTime || startTime.data[0]} > + { + startTime.data.map(item => <Option value={item} key={item}>{item}</Option>) + } + </Select> + </div> + <Table columns={this.getColumns("sensor")} loading={loading} dataSource={dataSource} pagination={{ showSizeChanger: true, showQuickJumper: true }} /> + </div> + ); + }; + + renderSelContent = (loading, dataSource) => { + const { startTime } = this.props; + return ( + <div> + <div className='buttons-margin'> + 巡检时间: + <Select style={{ width: 200 }} onChange={this.getResult} value={this.state.startTime || startTime.data[0]} > + { + startTime.data.map(item => <Option value={item} key={item}>{item}</Option>) + } + </Select> + </div> + <Table columns={this.getColumns("sel")} loading={loading} dataSource={dataSource} pagination={{ showSizeChanger: true, showQuickJumper: true }} /> + </div> + ); + }; + + renderTab = (num, title) => { + if (num > 0) { + return <span>{title}<span className='spanCircle fill red'>{num}</span></span>; + } + return title; + }; + onTabChange = (key) => { + const currentQuery = this.props.location.query; + currentQuery.type = key; + hashHistory.push(this.props.location); + }; + render() { + const { detailInfo } = this.props; + const { loading } = detailInfo; + const temperature = [], voltage = [], fan = [], Memory = [], power_supply = [], others = [], sel = []; + let temperature_error = 0, voltage_error = 0, fan_error = 0, Memory_error = 0, power_supply_error = 0, others_error = 0, sel_error = 0; + const inspectData = detailInfo.data.result || []; + const ipmiSelData = detailInfo.data.selresult || []; + inspectData.forEach(item => { + if (item.type === 'Temperature') { + temperature.push(item); + if (item.state === 'Critical') { + temperature_error ++; + } + } else if (item.type === 'Fan') { + fan.push(item); + if (item.state === 'Critical') { + fan_error ++; + } + } else if (item.type === 'Cooling Device') { + fan.push(item); + if (item.state === 'Critical') { + fan_error ++; + } + } else if (item.type === 'Power Supply') { + power_supply.push(item); + if (item.state === 'Critical') { + power_supply_error ++; + } + } else if (item.type === 'Memory') { + Memory.push(item); + if (item.state === 'Critical') { + Memory_error ++; + } + } else if (item.type === 'Voltage') { + voltage.push(item); + if (item.state === 'Critical') { + voltage_error ++; + } + } else if (item.type === 'Voltage') { + voltage.push(item); + if (item.state === 'Critical') { + voltage_error ++; + } + } else { + others.push(item); + if (item.state === 'Critical') { + others_error ++; + } + } + }); + + ipmiSelData.forEach(item => { + sel.push(item); + if (item.state === 'Critical') { + sel_error ++; + } + }); + + const { query } = this.props.location; + const defaultKey = query.type ? query.type : 'temperature'; + return ( + <Layout> + {getBreadcrumb(this.state.sn, '/device/inspection/list')} + <div className='detail-body' style={{ marginTop: 0 }}> + <h3 className='detail-title'>设备信息</h3> + <div className='detail-info'> + <Detail sn={this.state.sn} /> + </div> + <Tabs type='card' onChange={this.onTabChange} activeKey={defaultKey} defaultActiveKey={defaultKey} tabBarExtraContent={geTabsTitle('巡检详情[No Nominal]')}> + <TabPane tab={this.renderTab(temperature_error, '温度')} key='temperature'> + {this.renderContent(loading, temperature)} + </TabPane> + <TabPane tab={this.renderTab(voltage_error, '电压')} key='voltage'> + {this.renderContent(loading, voltage)} + </TabPane> + <TabPane tab={this.renderTab(fan_error, '风扇')} key='fan'> + {this.renderContent(loading, fan)} + </TabPane> + <TabPane tab={this.renderTab(Memory_error, '内存')} key='memory'> + {this.renderContent(loading, Memory)} + </TabPane> + <TabPane tab={this.renderTab(power_supply_error, '电源')} key='power_supply'> + {this.renderContent(loading, power_supply)} + </TabPane> + <TabPane tab={this.renderTab(sel_error, '事件')} key='sel'> + {this.renderSelContent(loading, sel)} + </TabPane> + <TabPane tab={this.renderTab(others_error, '其它')} key='others'> + {this.renderContent(loading, others)} + </TabPane> + </Tabs> + </div> + </Layout> + ); + } +} +function mapStateToProps(state) { + return { + detailInfo: state.get('device-inspection-detail').toJS().detailInfo, + //deviceInfo: state.get('device-inspection-detail').toJS().deviceInfo, + startTime: state.get('device-inspection-detail').toJS().startTime, + userInfo: state.getIn([ 'global', 'userData' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Form.create()(Container)); diff --git a/cyclone-web/app/containers/device/inspection/detail/reducers/index.js b/cyclone-web/app/containers/device/inspection/detail/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..0778f277a6fc13d1d1270349df5ec265212dd00f --- /dev/null +++ b/cyclone-web/app/containers/device/inspection/detail/reducers/index.js @@ -0,0 +1,25 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createRegularReducer } from 'utils/regular-reducer'; + +const initialState = fromJS({ + detailInfo: { + loading: false, + data: [] + }, + startTime: { + loading: false, + data: [] + } +}); + +const reducer = handleActions( + { + ...createRegularReducer('inspection-detail/detail-info', 'detailInfo'), + ...createRegularReducer('inspection-detail/start-time', 'startTime') + }, + initialState, +); + + +export default reducer; diff --git a/cyclone-web/app/containers/device/inspection/detail/sagas/index.js b/cyclone-web/app/containers/device/inspection/detail/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..608b2ea0b14d3a3c163ec44419fd60321092f428 --- /dev/null +++ b/cyclone-web/app/containers/device/inspection/detail/sagas/index.js @@ -0,0 +1,68 @@ +import { get, post, getWithArgs } from 'common/xFetch2'; +import { takeEvery } from 'redux-saga'; +import { call, put } from 'redux-saga/effects'; +import { notification } from 'antd'; + +let created = false; +function* empty() { + return; +} + + +function* defaultSaga() { + const watchers = yield [ + takeEvery('inspection-detail/detail-info/get', getDetailInfo), + takeEvery('inspection-detail/start-time/get', getStartTime) + ]; +} +function* getStartTime(action) { + try { + yield put({ + type: 'inspection-detail/start-time/load' + }); + + const res = yield call(get, `/api/cloudboot/v1/devices/${action.payload}/inspections/start-times`); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + yield put({ + type: 'inspection-detail/start-time/load/success', + payload: res.content.start_time || [] + }); + + } catch (error) { + console.log(error); + } +} + + +function* getDetailInfo(action) { + try { + yield put({ + type: 'inspection-detail/detail-info/load' + }); + + const res = yield call(getWithArgs, `/api/cloudboot/v1/devices/${action.payload.sn}/inspections`, { start_time: action.payload.start_time }); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + console.log("see api return",res) + yield put({ + type: 'inspection-detail/detail-info/load/success', + //payload: res.content.result || [], + payload: res.content || [], + }); + + } catch (error) { + console.log(error); + } +} + + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [defaultSaga]; +} diff --git a/cyclone-web/app/containers/device/inspection/list/actions/add-task.jsx b/cyclone-web/app/containers/device/inspection/list/actions/add-task.jsx new file mode 100644 index 0000000000000000000000000000000000000000..6ac0cce9ccad29f393f1693b39e1eecd4ac09d21 --- /dev/null +++ b/cyclone-web/app/containers/device/inspection/list/actions/add-task.jsx @@ -0,0 +1,29 @@ +import React from 'react'; +import Popup from 'components/popup'; +import Task from './components/task'; +import { post } from 'common/xFetch2'; + +export default function action(options) { + + Popup.open({ + title: '新建巡检任务', + width: 1000, + onCancel: () => { + Popup.close(); + }, + + content: ( + <Task + onCancel={() => { + Popup.close(); + }} + onSuccess={() => { + Popup.close(); + options.reload(); + }} + /> + + ) + }); + +} diff --git a/cyclone-web/app/containers/device/inspection/list/actions/components/task.jsx b/cyclone-web/app/containers/device/inspection/list/actions/components/task.jsx new file mode 100644 index 0000000000000000000000000000000000000000..4925a75f3331350608e0a109ede07ba7ed3b2883 --- /dev/null +++ b/cyclone-web/app/containers/device/inspection/list/actions/components/task.jsx @@ -0,0 +1,128 @@ +import React from 'react'; +import { Form, Input, Radio, Button, notification } from 'antd'; +const FormItem = Form.Item; +const RadioGroup = Radio.Group; +import DeviceTable from 'containers/device/common/device'; +import { post } from 'common/xFetch2'; +import Crontab from 'components/crontab'; +export const formItemLayout = { + labelCol: { + xs: { span: 24 }, + sm: { span: 3 } + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 20 } + } +}; +export const tailFormItemLayout = { + wrapperCol: { + xs: { + span: 24, + offset: 0 + }, + sm: { + span: 11, + offset: 12 + } + } +}; +class RegistrationForm extends React.Component { + state = { + crontabUi: {} + }; + + handleSubmit = (e) => { + e.preventDefault(); + this.props.form.validateFields((err, values) => { + + //指定类型 + if (values.type === 'define') { + values.cron = this.state.crontabUi.crontabExpression; + values.cron_render = JSON.stringify(this.state.crontabUi); + } + + if (err) { + return notification.error({ message: '还有未填写的项' }); + } + + const selectedRows = values.sn || []; + const sns = selectedRows.map(s => s.sn); + post('/api/cloudboot/v1/jobs/inspections', { sn: sns, rate: values.rate, cron: values.cron, cron_render: values.cron_render }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + this.props.onSuccess(); + }); + }); + }; + + render() { + const { getFieldDecorator, getFieldValue } = this.props.form; + const rate = getFieldValue('rate'); + return ( + <Form onSubmit={this.handleSubmit}> + <FormItem + {...formItemLayout} + label='任务类型' + > + {getFieldDecorator('rate', { + initialValue: 'immediately', + rules: [{ + required: true, + message: '请选择任务执行类型' + }] + })( + <RadioGroup> + <Radio value='immediately'>立即执行</Radio> + <Radio value='fixed_rate'>定时执行</Radio> + </RadioGroup> + )} + </FormItem> + { + rate === 'fixed_rate' && + <FormItem + {...formItemLayout} + label={<span className='ant-form-item-required'>cron表达式</span>} + > + <Crontab + form={this.props.form} + handleClick={(values) => this.setState({ crontabUi: values })} + /> + </FormItem> + } + <FormItem + {...formItemLayout} + label='未指定则全量' + > + {getFieldDecorator('sn', { + rules: [{ + required: false, message: '请选择设备列表' + }] + })( + <DeviceTable hideButton={true} form={this.props.form} /> + )} + </FormItem> + <FormItem + {...tailFormItemLayout} + > + <div className='pull-right'> + <Button onClick={() => this.props.onCancel()}>取消</Button> + <Button + style={{ marginLeft: 8 }} + type='primary' + htmlType='submit' + > + 确定 + </Button> + </div> + </FormItem> + </Form> + ); + } +} + +const WrappedRegistrationForm = Form.create()(RegistrationForm); + +export default WrappedRegistrationForm; diff --git a/cyclone-web/app/containers/device/inspection/list/actions/index.js b/cyclone-web/app/containers/device/inspection/list/actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..2a2ee04e59f0dd72c1fc387c2a3cbb7ea6c2bfb7 --- /dev/null +++ b/cyclone-web/app/containers/device/inspection/list/actions/index.js @@ -0,0 +1,5 @@ +import addTask from './add-task'; + +export default { + addTask +}; diff --git a/cyclone-web/app/containers/device/inspection/list/components/search-form.jsx b/cyclone-web/app/containers/device/inspection/list/components/search-form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..8bb67dbd90201efb62e7ee664cf36293dfd4ecfd --- /dev/null +++ b/cyclone-web/app/containers/device/inspection/list/components/search-form.jsx @@ -0,0 +1,46 @@ +import React from 'react'; +import SearchForm from 'components/search-form'; +import { getSearchList, RUNNING_STTAUS, INSPECTION_RESULT } from "common/enums"; + +export default class Search extends React.Component { + state = { + searchKeys: [ + { key: 'sn', label: '序列号' }, + { key: 'fixed_asset_number', label: '固资编号' }, + { key: 'intranet_ip', label: '内网IP' }, + { key: 'running_status', label: '运行状态' }, + { key: 'health_status', label: '健康状况' }, + { key: 'createTime', label: '巡检时间' } + ], + searchValues: { + 'fixed_asset_number': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'sn': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'intranet_ip': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'running_status': { type: 'radio', list: getSearchList(RUNNING_STTAUS) }, + 'health_status': { type: 'radio', list: getSearchList(INSPECTION_RESULT) }, + 'createTime': { type: 'rangePicker' } + } + }; + + onSearch = (values) => { + if (values.createTime) { + values.start_time = values.createTime[0]; + values.end_time = values.createTime[1]; + } + delete values.createTime; + this.props.dispatch({ + type: 'device-inspection-list/table-data/search', + payload: { + ...values + } + }); + }; + + render() { + return ( + <SearchForm onSearch={this.onSearch} searchKeys={this.state.searchKeys} searchValues={this.state.searchValues}/> + ); + } +} + + diff --git a/cyclone-web/app/containers/device/inspection/list/components/table.jsx b/cyclone-web/app/containers/device/inspection/list/components/table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..252b89fe0ab4238cc054663f5d7b518bd9a0963d --- /dev/null +++ b/cyclone-web/app/containers/device/inspection/list/components/table.jsx @@ -0,0 +1,288 @@ +import React from 'react'; +import { get } from 'common/xFetch2'; +import { + Table, + Tooltip, + Button, + Pagination, + Badge, + notification +} from 'antd'; +import { Link } from 'react-router'; +import actions from '../actions'; +import { INSPECTION_RESULT_COLOR, RUNNING_STTAUS } from 'common/enums'; +import { post } from 'common/xFetch2'; +import { getPermissonBtn } from 'common/utils'; + +class MyTable extends React.Component { + + reload = () => { + this.props.dispatch({ + type: 'device-inspection-list/table-data/reload' + }); + this.props.dispatch({ + type: 'device-inspection-list/table-data/reset' + }); + }; + + execAction = (name, record) => { + if (actions[name]) { + actions[name]({ + record, + reload: () => { + this.reload(); + } + }); + } + }; + renderStatus = (record, key) => { + let type = ''; + record.result.map(data => { + if (data.type === key) { + type = data.status; + } + }); + const color = INSPECTION_RESULT_COLOR[type] ? INSPECTION_RESULT_COLOR[type][0] : 'transparent'; + const word = INSPECTION_RESULT_COLOR[type] ? INSPECTION_RESULT_COLOR[type][1] : type; + return ( + <div> + <Badge + dot={true} + style={{ + background: color + }} + />{' '} + &nbsp;&nbsp; + <Link to={`/device/inspection/detail/${record.sn}?type=${key}`}>{word}</Link> + </div> + ); + }; + + getColumns = () => { + return [ + { + title: '固资编号', + dataIndex: 'fixed_asset_number', + width: 100, + render: (text) => { + return <Tooltip placement="top" title={text}>{text}</Tooltip> + } + }, + { + title: '序列号', + dataIndex: 'sn', + width: 100, + render: (text, record) => { + return <Tooltip placement="top" title={text}> + <Link to={`/device/detail/${text}`}>{text}</Link> + </Tooltip> + } + }, + { + title: '内网IP', + dataIndex: 'intranet_ip', + width: 100, + render: (text) => { + return <Tooltip placement="top" title={text}>{text}</Tooltip> + } + }, + { + title: '巡检开始时间', + dataIndex: 'start_time', + width: 100, + render: (text) => <Tooltip placement="top" title={text}>{text}</Tooltip> + }, + { + title: '巡检结束时间', + dataIndex: 'end_time', + width: 100, + render: (text) => <Tooltip placement="top" title={text}>{text}</Tooltip> + }, + { + title: '温度', + dataIndex: 'temperature', + width: 100, + render: (text, record) => this.renderStatus(record, 'temperature') + }, + { + title: '电压', + dataIndex: 'voltage', + width: 100, + render: (text, record) => this.renderStatus(record, 'voltage') + }, + { + title: '风扇', + dataIndex: 'fan', + width: 100, + render: (text, record) => this.renderStatus(record, 'fan') + }, + { + title: '内存', + dataIndex: 'memory', + width: 100, + render: (text, record) => this.renderStatus(record, 'memory') + }, + { + title: '电源', + dataIndex: 'power_supply', + width: 100, + render: (text, record) => this.renderStatus(record, 'power_supply') + }, + { + title: '运行状态', + dataIndex: 'running_status', + width: 100, + render: (text, record) => { + return (<span>{RUNNING_STTAUS[text]}</span>); + } + }, + { + title: '健康状况', + dataIndex: 'health_status', + width: 100, + render: (type, record) => { + const color = INSPECTION_RESULT_COLOR[type] ? INSPECTION_RESULT_COLOR[type][0] : 'transparent'; + const word = INSPECTION_RESULT_COLOR[type] ? INSPECTION_RESULT_COLOR[type][1] : type; + return ( + <div> + <Badge + dot={true} + style={{ + background: color + }} + />{' '} + &nbsp;&nbsp; {word} + </div> + ); + } + }, + { + title: '错误信息', + dataIndex: 'error', + width: 100, + render: (text) => <Tooltip placement="top" title={text}>{text}</Tooltip> + }, + { + title: '操作', + dataIndex: 'operate', + width: 100, + render: (text, record) => { + return <Link to={`/device/inspection/detail/${record.sn}`}>详情</Link>; + } + } + ]; + }; + + + changePage = page => { + this.props.dispatch({ + type: `device-inspection-list/table-data/change-page`, + payload: { + page + } + }); + }; + + changePageSize = (page, pageSize) => { + this.props.dispatch({ + type: `device-inspection-list/table-data/change-page-size`, + payload: { + page, + pageSize + } + }); + }; + + getRowSelection = () => { + const selectedRowKeys = this.props.tableData.selectedRowKeys; + return { + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.props.dispatch({ + type: 'device-inspection-list/table-data/set/selectedRows', + payload: { + selectedRowKeys, + selectedRows + } + }); + } + }; + }; + + inspect = (type) => { + const { tableData } = this.props; + const selectedRows = tableData.selectedRows || []; + let sns = selectedRows.map(s => s.sn); + if (type === 'all') { + sns = []; + } else if (selectedRows.length <= 0) { + return notification.error({ message: '请选择设备' }); + } + + post('/api/cloudboot/v1/jobs/inspections', { sn: sns, rate: 'immediately' }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + this.reload(); + }); + }; + + render() { + const { tableData } = this.props; + const { loading, pagination } = tableData; + return ( + <div> + <div className='operate_btns'> + <Button + onClick={() => this.execAction('addTask')} + icon='plus' + type='primary' + style={{ marginRight: 8 }} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_inspection_addTask')} + > + 新建巡检任务 + </Button> + <Button.Group> + <Button + onClick={() => this.inspect()} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_inspection_inspect')} + > + 重新巡检 + </Button> + <Button + onClick={() => this.inspect('all')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_inspection_inspect_all')} + > + 巡检全部 + </Button> + </Button.Group> + </div> + <div className='clearfix' /> + <Table + rowKey={'id'} + columns={this.getColumns()} + dataSource={tableData.list} + loading={loading} + pagination={false} + defaultPageSize={3} + rowSelection={this.getRowSelection()} + /> + <div> + <Pagination + showTotal={(total) => `共 ${total} 条`} + showQuickJumper={true} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={this.changePageSize} + onChange={this.changePage} + /> + </div> + </div> + ); + } +} + +export default MyTable; diff --git a/cyclone-web/app/containers/device/inspection/list/get-component.js b/cyclone-web/app/containers/device/inspection/list/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..fe022aab862a21611274c08773a467ed53b12b10 --- /dev/null +++ b/cyclone-web/app/containers/device/inspection/list/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('device-inspection-list', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/device/inspection/list/index.jsx b/cyclone-web/app/containers/device/inspection/list/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..61014f90d8f400c53c1aa305ccd1ab2902ebf562 --- /dev/null +++ b/cyclone-web/app/containers/device/inspection/list/index.jsx @@ -0,0 +1,49 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import SearchForm from './components/search-form'; +import Table from './components/table'; +import Layout from 'components/layout/page-layout'; + +class Container extends React.Component { + componentDidMount() { + this.props.dispatch({ + type: 'device-inspection-list/table-data/get' + }); + } + componentWillUnmount() { + this.props.dispatch({ + type: 'device-inspection-list/table-data/reset' + }); + } + + render() { + const { tableData } = this.props.data; + return ( + <Layout title='硬件巡检'> + <SearchForm + dispatch={this.props.dispatch} + /> + <Table + dispatch={this.props.dispatch} + tableData={tableData} + userInfo={this.props.userInfo} + /> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + data: state.get('device-inspection-list').toJS(), + userInfo: state.getIn([ 'global', 'userData' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/device/inspection/list/reducers/index.js b/cyclone-web/app/containers/device/inspection/list/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..caa2479cc1378bab5deb2204589cbd0b72285a44 --- /dev/null +++ b/cyclone-web/app/containers/device/inspection/list/reducers/index.js @@ -0,0 +1,17 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; + +const initialState = fromJS({ + loading: true, + tableData: createTableStore() +}); + +const reducer = handleActions( + { + ...createTableReducer('device-inspection-list/table-data', 'tableData') + }, + initialState, +); + +export default reducer; diff --git a/cyclone-web/app/containers/device/inspection/list/sagas/index.js b/cyclone-web/app/containers/device/inspection/list/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..f17c901ce409262389a37e44ba1c3d4a67f213d7 --- /dev/null +++ b/cyclone-web/app/containers/device/inspection/list/sagas/index.js @@ -0,0 +1,23 @@ +import { get, post } from 'common/xFetch2'; + +let created = false; +function* empty() { + console.log(); +} + +import { createTableSaga } from 'utils/table-saga'; + +const jobTableSaga = createTableSaga({ + actionNamePrefix: 'device-inspection-list/table-data', + tableDataPath: [ 'device-inspection-list', 'tableData' ], + datasource: '/api/cloudboot/v1/devices/inspections' +}); + + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [jobTableSaga]; +} diff --git a/cyclone-web/app/containers/device/list/actions/delete.jsx b/cyclone-web/app/containers/device/list/actions/delete.jsx new file mode 100644 index 0000000000000000000000000000000000000000..58e4a8fe2b083f275fddafa4f05d6141042a617e --- /dev/null +++ b/cyclone-web/app/containers/device/list/actions/delete.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { del } from 'common/xFetch2'; + +export default function action(options) { + const ids = options.records.map(it => it.id); + const onSubmit = () => { + del(`/api/cloudboot/v1/devices`, { ids: ids }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + }); + }; + confirm({ + title: `确定要删除吗?`, + content: `已选择的设备:${ids.length}台`, + okText: '确定', + okType: 'danger', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/device/list/actions/device_store_import.jsx b/cyclone-web/app/containers/device/list/actions/device_store_import.jsx new file mode 100644 index 0000000000000000000000000000000000000000..eeadab7ad9cef57b97bbba0fffb39d8a846e96c8 --- /dev/null +++ b/cyclone-web/app/containers/device/list/actions/device_store_import.jsx @@ -0,0 +1,118 @@ +import React from 'react'; +import Popup from 'components/popup'; +import FileUpload from 'components/upload'; + +export default function action(options) { + const getColumns = () => { + return [ + { + title: '序列号', + dataIndex: 'sn' + }, + { + title: '厂商', + dataIndex: 'vendor' + }, + { + title: '设备型号', + dataIndex: 'model' + }, + { + title: '用途', + dataIndex: 'usage' + }, + { + title: '设备类型', + dataIndex: 'category' + }, + { + title: '库房管理单元', + dataIndex: 'store_room_name' + }, + { + title: '虚拟货架编号', + dataIndex: 'virtual_cabinet_number' + }, + { + title: '硬件备注', + dataIndex: 'hardware_remark' + }, + { + title: 'RAID结构', + dataIndex: 'raid_remark' + }, + { + title: '带外', + dataIndex: 'oob_init' + }, + { + title: '关联订单号', + dataIndex: 'order_number' + }, + { + title: '负责人', + dataIndex: 'owner' + }, + { + title: '是否租赁', + dataIndex: 'is_rental' + }, + { + title: '资产归属', + dataIndex: 'asset_belongs' + }, + { + title: '维保服务起始日期', + dataIndex: 'maintenance_service_date_begin' + }, + { + title: '保修期(月数)', + dataIndex: 'maintenance_months' + }, + { + title: '维保服务供应商', + dataIndex: 'maintenance_service_provider' + }, + { + title: '维保服务内容', + dataIndex: 'maintenance_service' + }, + { + title: '物流服务内容', + dataIndex: 'logistics_service' + }, + { + title: '启用时间', + dataIndex: 'started_at' + }, + { + title: '上架时间', + dataIndex: 'onshelve_at' + }, + ]; + }; + + + Popup.open({ + title: '导入到库房', + width: 2000, + onCancel: () => { + Popup.close(); + }, + content: ( + <FileUpload + importApi='/api/cloudboot/v1/devices/store/imports' + uploadApi='/api/cloudboot/v1/devices/store/upload' + previewApi='/api/cloudboot/v1/devices/store/imports/previews' + getColumns={getColumns} + onSuccess={() => { + Popup.close(); + options.reload(); + }} + onCancel={() => { + Popup.close(); + }} + /> + ) + }); +} diff --git a/cyclone-web/app/containers/device/list/actions/editHardwareRemark.jsx b/cyclone-web/app/containers/device/list/actions/editHardwareRemark.jsx new file mode 100644 index 0000000000000000000000000000000000000000..4329e9456c97324fef9e09fe1418b28fe60006e5 --- /dev/null +++ b/cyclone-web/app/containers/device/list/actions/editHardwareRemark.jsx @@ -0,0 +1,86 @@ +import React from 'react'; +import { Input, Button, Form, notification } from 'antd'; +import { put } from 'common/xFetch2'; +const FormItem = Form.Item; +import { formItemLayout, tailFormItemLayout } from 'common/enums'; +import Popup from 'components/popup'; + + +export default function action(options) { + + const onSubmit = (values) => { + const data = options.records.map(it => { + return { + "fixed_asset_number": it.fixed_asset_number, + "sn": it.sn, + "hardware_remark": values.hardware_remark + }; + }); + put('/api/cloudboot/v1/devices', { devices: data }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + Popup.close(); + }); + }; + + Popup.open({ + title: `批量修改硬件备注`, + width: 600, + onCancel: () => { + Popup.close(); + }, + content: ( + <WrapperForm + initialValue={options.record} + username={options.username} + onSubmit={onSubmit} + onCancel={() => { + Popup.close(); + }} + /> + ) + }); +} + +class MyForm extends React.Component { + handleSubmit = ev => { + ev && ev.preventDefault(); + ev && ev.stopPropagation(); + this.props.form.validateFields({ force: true }, (error, values) => { + if (error) { + notification.warning({ + message: '还有未填写完整的选项' + }); + return; + } + this.props.onSubmit(values); + }); + }; + render() { + const { getFieldDecorator } = this.props.form; + return <Form onSubmit={this.handleSubmit}> + <FormItem {...formItemLayout} label='硬件备注' > + {getFieldDecorator('hardware_remark', { + })( + <Input.TextArea/> + )} + </FormItem> + <FormItem {...tailFormItemLayout}> + <div className='pull-right'> + <Button onClick={() => this.props.onCancel()}>取消</Button> + <Button + style={{ marginLeft: 8 }} + type='primary' + htmlType='submit' + > + 确认 + </Button> + </div> + </FormItem> + </Form>; + } +} +const WrapperForm = Form.create()(MyForm); diff --git a/cyclone-web/app/containers/device/list/actions/editStatus.jsx b/cyclone-web/app/containers/device/list/actions/editStatus.jsx new file mode 100644 index 0000000000000000000000000000000000000000..ba6616df83e6c1461c0292ecc4fcf067e72fae47 --- /dev/null +++ b/cyclone-web/app/containers/device/list/actions/editStatus.jsx @@ -0,0 +1,91 @@ +import React from 'react'; +import { Input, Select, Button, Form, notification } from 'antd'; +import { post, put } from 'common/xFetch2'; +const FormItem = Form.Item; +import { formItemLayout, tailFormItemLayout } from 'common/enums'; +import Popup from 'components/popup'; +const { Option } = Select; +import { OPERATION_STATUS, getSearchList } from 'common/enums'; + +export default function action(options) { + + const onSubmit = (values) => { + const data = options.records.map(it => { + return { + "fixed_asset_number": it.fixed_asset_number, + "operation_status": values.operation_status, + "sn": it.sn + }; + }); + put('/api/cloudboot/v1/devices', { devices: data }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + Popup.close(); + }); + }; + + Popup.open({ + title: `批量修改状态`, + width: 600, + onCancel: () => { + Popup.close(); + }, + content: ( + <WrapperForm + initialValue={options.record} + username={options.username} + onSubmit={onSubmit} + onCancel={() => { + Popup.close(); + }} + /> + ) + }); +} + +class MyForm extends React.Component { + handleSubmit = ev => { + ev && ev.preventDefault(); + ev && ev.stopPropagation(); + this.props.form.validateFields({ force: true }, (error, values) => { + if (error) { + notification.warning({ + message: '还有未填写完整的选项' + }); + return; + } + this.props.onSubmit(values); + }); + }; + render() { + const { getFieldDecorator } = this.props.form; + return <Form onSubmit={this.handleSubmit}> + <FormItem {...formItemLayout} label='运营状态' > + {getFieldDecorator('operation_status', { + })( + <Select> + { + getSearchList(OPERATION_STATUS).map(it => <Option value={it.value}>{it.label}</Option>) + } + </Select> + )} + </FormItem> + <FormItem {...tailFormItemLayout}> + <div className='pull-right'> + <Button onClick={() => this.props.onCancel()}>取消</Button> + <Button + style={{ marginLeft: 8 }} + type='primary' + htmlType='submit' + > + 确认 + </Button> + </div> + </FormItem> + </Form>; + } +} +const WrapperForm = Form.create()(MyForm); diff --git a/cyclone-web/app/containers/device/list/actions/editUsage.jsx b/cyclone-web/app/containers/device/list/actions/editUsage.jsx new file mode 100644 index 0000000000000000000000000000000000000000..a614bdf3c27a524942280c60887301be3bf12e02 --- /dev/null +++ b/cyclone-web/app/containers/device/list/actions/editUsage.jsx @@ -0,0 +1,87 @@ +import React from 'react'; +import { Input, Select, Button, Form, notification } from 'antd'; +import { post, put } from 'common/xFetch2'; +const FormItem = Form.Item; +import { formItemLayout, tailFormItemLayout } from 'common/enums'; +import Popup from 'components/popup'; +const { Option } = Select; +import { OPERATION_STATUS, getSearchList } from 'common/enums'; + +export default function action(options) { + + const onSubmit = (values) => { + const data = options.records.map(it => { + return { + "fixed_asset_number": it.fixed_asset_number, + "sn": it.sn, + "usage": values.usage + }; + }); + put('/api/cloudboot/v1/devices', { devices: data }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + Popup.close(); + }); + }; + + Popup.open({ + title: `批量修改用途`, + width: 600, + onCancel: () => { + Popup.close(); + }, + content: ( + <WrapperForm + initialValue={options.record} + username={options.username} + onSubmit={onSubmit} + onCancel={() => { + Popup.close(); + }} + /> + ) + }); +} + +class MyForm extends React.Component { + handleSubmit = ev => { + ev && ev.preventDefault(); + ev && ev.stopPropagation(); + this.props.form.validateFields({ force: true }, (error, values) => { + if (error) { + notification.warning({ + message: '还有未填写完整的选项' + }); + return; + } + this.props.onSubmit(values); + }); + }; + render() { + const { getFieldDecorator } = this.props.form; + return <Form onSubmit={this.handleSubmit}> + <FormItem {...formItemLayout} label='用途' > + {getFieldDecorator('usage', { + })( + <Input.TextArea/> + )} + </FormItem> + <FormItem {...tailFormItemLayout}> + <div className='pull-right'> + <Button onClick={() => this.props.onCancel()}>取消</Button> + <Button + style={{ marginLeft: 8 }} + type='primary' + htmlType='submit' + > + 确认 + </Button> + </div> + </FormItem> + </Form>; + } +} +const WrapperForm = Form.create()(MyForm); diff --git a/cyclone-web/app/containers/device/list/actions/import.jsx b/cyclone-web/app/containers/device/list/actions/import.jsx new file mode 100644 index 0000000000000000000000000000000000000000..df6e2b6c53c52f9096dedbce51e97eeb1d0de60b --- /dev/null +++ b/cyclone-web/app/containers/device/list/actions/import.jsx @@ -0,0 +1,110 @@ +import React from 'react'; +import Popup from 'components/popup'; +import FileUpload from 'components/upload'; + +export default function action(options) { + const getColumns = () => { + return [ + { + title: '固资编号', + dataIndex: 'fixed_asset_number' + }, + { + title: '序列号', + dataIndex: 'sn' + }, + { + title: '设备型号', + dataIndex: 'model' + }, + { + title: 'CPU架构', + dataIndex: 'arch' + }, + { + title: '用途', + dataIndex: 'usage' + }, + { + title: '设备类型', + dataIndex: 'category' + }, + { + title: '机房管理单元', + dataIndex: 'server_room_name' + }, + { + title: '机架编号', + dataIndex: 'server_cabinet_number' + }, + { + title: '机位编号', + dataIndex: 'server_usite_number' + }, + { + title: '硬件备注', + dataIndex: 'hardware_remark' + }, + { + title: 'RAID结构', + dataIndex: 'raid_remark' + }, + { + title: '厂商', + dataIndex: 'vendor' + }, + { + title: '启用时间', + dataIndex: 'started_at' + }, + { + title: '上架时间', + dataIndex: 'onshelve_at' + }, + { + title: '带外', + dataIndex: 'oob_init' + }, + { + title: '内网IP', + dataIndex: 'intranet_ip' + }, + { + title: '外网IP', + dataIndex: 'extranet_ip' + }, + { + title: '操作系统', + dataIndex: 'os' + }, + { + title: '运营状态', + dataIndex: 'operation_status' + } + ]; + }; + + + Popup.open({ + title: '导入到机房', + width: 1500, + onCancel: () => { + Popup.close(); + }, + content: ( + <FileUpload + importApi='/api/cloudboot/v1/devices/stock/imports' + uploadApi='/api/cloudboot/v1/devices/stock/upload' + previewApi='/api/cloudboot/v1/devices/stock/imports/previews' + getColumns={getColumns} + onSuccess={() => { + Popup.close(); + options.reload(); + }} + onCancel={() => { + Popup.close(); + }} + /> + ) + }); +} diff --git a/cyclone-web/app/containers/device/list/actions/index.js b/cyclone-web/app/containers/device/list/actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..a81e33406df07f8c068e2161b68ffa14125111be --- /dev/null +++ b/cyclone-web/app/containers/device/list/actions/index.js @@ -0,0 +1,26 @@ +import _delete from './delete'; +import powerOn from '../../oob/actions/change-status'; +import networkBoot from '../../oob/actions/change-status'; +import reAccess from '../../oob/actions/change-status'; +import powerOff from '../../oob/actions/change-status'; +import _import from './import'; +import pre_import from './pre_import'; +import _importStoreRoom from './device_store_import'; +import editStatus from './editStatus'; +import editUsage from './editUsage'; +import editHardwareRemark from './editHardwareRemark'; + + +export default { + powerOn, + networkBoot, + reAccess, + powerOff, + _delete, + _import, + pre_import, + _importStoreRoom, + editStatus, + editUsage, + editHardwareRemark +}; diff --git a/cyclone-web/app/containers/device/list/actions/pre_import.jsx b/cyclone-web/app/containers/device/list/actions/pre_import.jsx new file mode 100644 index 0000000000000000000000000000000000000000..d97d4429a39a09f50c9cf09b1c8dcbb43c904ff2 --- /dev/null +++ b/cyclone-web/app/containers/device/list/actions/pre_import.jsx @@ -0,0 +1,92 @@ +import React from 'react'; +import Popup from 'components/popup'; +import FileUpload from 'components/upload'; + +export default function action(options) { + const getColumns = () => { + return [ + { + title: '固资编号', + dataIndex: 'fixed_asset_number' + }, + { + title: '序列号', + dataIndex: 'sn' + }, + { + title: '设备型号', + dataIndex: 'model' + }, + { + title: '用途', + dataIndex: 'usage' + }, + { + title: '设备类型', + dataIndex: 'category' + }, + { + title: '机房管理单元', + dataIndex: 'server_room_name' + }, + { + title: '机架编号', + dataIndex: 'server_cabinet_number' + }, + { + title: '机位编号', + dataIndex: 'server_usite_number' + }, + { + title: '硬件备注', + dataIndex: 'hardware_remark' + }, + { + title: 'RAID结构', + dataIndex: 'raid_remark' + }, + { + title: '厂商', + dataIndex: 'vendor' + }, + { + title: '启用时间', + dataIndex: 'started_at' + }, + { + title: '上架时间', + dataIndex: 'onshelve_at' + }, + { + title: '带外', + dataIndex: 'oob_init' + }, + { + title: '订单号', + dataIndex: 'order_number' + } + ]; + }; + Popup.open({ + title: '导入数据', + width: 1500, + onCancel: () => { + Popup.close(); + }, + content: ( + <FileUpload + importApi='/api/cloudboot/v1/devices/imports' + uploadApi='/api/cloudboot/v1/devices/upload' + previewApi='/api/cloudboot/v1/devices/imports/previews' + getColumns={getColumns} + onSuccess={() => { + Popup.close(); + options.reload(); + }} + onCancel={() => { + Popup.close(); + }} + /> + ) + }); +} diff --git a/cyclone-web/app/containers/device/list/components/search-form.jsx b/cyclone-web/app/containers/device/list/components/search-form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..2fbca818dfbdcf73a81f3d7ded757acf9d6323a2 --- /dev/null +++ b/cyclone-web/app/containers/device/list/components/search-form.jsx @@ -0,0 +1,131 @@ +import React from 'react'; +import SearchForm from 'components/search-form'; +import { OPERATION_STATUS, OOB_ACCESSIBLE, getSearchList } from 'common/enums'; +import { get } from 'common/xFetch2'; +import { notification } from 'antd'; + +export default class Search extends React.Component { + + + state = { + searchKeys: [ + { key: 'sn', label: '序列号' }, + { key: 'category', label: '设备类型列表' },//枚举 + { key: 'category_pre_deploy', label: '待部署设备类型' },//枚举 + { key: 'fixed_asset_number', label: '固资编号' }, + { key: 'model', label: '设备型号' }, //枚举 + { key: 'operation_status', label: '运营状态' }, + { key: 'usage', label: '用途' }, //枚举 + { key: 'vendor', label: '厂商' }, //枚举 + { key: 'ip', label: 'IP' }, + { key: 'intranet_ip', label: '内网IP' }, + { key: 'extranet_ip', label: '外网IP' }, + { key: 'idc_id', label: '数据中心' }, //枚举 + { key: 'server_room_name', label: '机房管理单元' }, //枚举 + { key: 'physical_area', label: '物理区域' }, //枚举 + { key: 'server_cabinet_number', label: '机架编号' }, + { key: 'server_usite_number', label: '机位编号' }, + { key: 'oob_accessible', label: '带外状态' } + ], + searchValues: { + 'sn': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'category': { type: 'checkbox', list: [] }, + 'category_pre_deploy': { type: 'checkbox', list: [] }, + 'fixed_asset_number': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'model': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'operation_status': { type: 'radio', list: getSearchList(OPERATION_STATUS) }, + 'usage': { type: 'checkbox', list: [] }, + 'vendor': { type: 'checkbox', list: [] }, + 'ip': { type: 'input', placeholder: '模糊匹配内外网以及带外IP,支持英文逗号,空格,换行分隔' }, + 'intranet_ip': { type: 'input', placeholder: '精确匹配内网IP,支持英文逗号,空格,换行分隔' }, + 'extranet_ip': { type: 'input', placeholder: '精确匹配外网IP,支持英文逗号,空格,换行分隔' }, + 'idc_id': { type: 'checkbox', list: [] }, + 'server_room_name': { type: 'input' }, + 'physical_area': { type: 'checkbox', list: [] }, + 'server_cabinet_number': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'server_usite_number': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'oob_accessible': { type: 'checkbox', list: getSearchList(OOB_ACCESSIBLE) } + + } + }; + + getList = (name) => { + const searchValues = this.state.searchValues; + get(`/api/cloudboot/v1/devices/query-params/${name}`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + const list = res.content.list || []; + if (list.length > 0 && searchValues[name]) { + searchValues[name].list = list.map(it => { + if (it.name) { + return { + label: it.name, + value: it.name + }; + } else { + return { + label: 'blank', + value: 'blank' + }; + } + }); + } + }); + }; + + getListId = (urlParams, name) => { + const searchValues = this.state.searchValues; + get(`/api/cloudboot/v1/devices/query-params/${urlParams}`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + const list = res.content.list || []; + if (list.length > 0 && searchValues[name]) { + searchValues[name].list = list.map(it => { + if (it.name) { + return { + label: it.name, + value: it.name + }; + } else { + return { + label: 'blank', + value: 'blank' + }; + } + }); + } + }); + }; + + componentDidMount() { + this.getList('vendor'); + this.getList('physical_area'); + this.getList('usage'); + this.getList('category'); + this.getList('category_pre_deploy'); + this.getListId('idc', 'idc_id'); + this.getListId('server_room', 'server_room_id'); + } + + // UNSAFE_componentWillReceiveProps(props) { + // const { idc, room } = props; + // const searchValues = this.state.searchValues; + // if (!idc.loading && idc.loading !== this.props.idc.loading) { + // searchValues['idc_id'].list = idc.data; + // } + // if (!room.loading && room.loading !== this.props.room.loading) { + // searchValues['server_room_id'].list = room.data; + // } + // this.setState({ searchValues }); + // } + + render() { + return ( + <SearchForm onSearch={this.props.onSearch} searchKeys={this.state.searchKeys} searchValues={this.state.searchValues} /> + ); + } +} + + diff --git a/cyclone-web/app/containers/device/list/components/table.jsx b/cyclone-web/app/containers/device/list/components/table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..048d064dd460d8242447afe1c80421779eac5714 --- /dev/null +++ b/cyclone-web/app/containers/device/list/components/table.jsx @@ -0,0 +1,256 @@ +import React from 'react'; +import { + Table, + Button, + Pagination, + Dropdown, + Menu, + Icon, + notification +} from 'antd'; +const ButtonGroup = Button.Group; +import { hashHistory } from 'react-router'; +import actions from '../actions'; +import { getColumns, plainOptions } from "containers/device/common/colums"; +import { getPermissonBtn } from 'common/utils'; +import { renderDisplayMore } from 'common/utils'; + +class MyTable extends React.Component { + state = { + checkedList: [], + indeterminate: true, + checkAll: false + }; + + reload = () => { + this.props.dispatch({ + type: 'device-list/table-data/reload' + }); + this.props.dispatch({ + type: 'device-list/table-data/set/selectedRows', + payload: { + selectedRows: [], + selectedRowKeys: [] + } + }); + }; + 批量操作入口 + batchExecAction = (name) => { + let flag = false; + const { tableData } = this.props; + const selectedRows = tableData.selectedRows || []; + if (name == 'reAccess') { + this.execAction(name, selectedRows); + return; + } + if (selectedRows.length < 1) { + return notification.error({ message: '请至少选择一条数据' }); + } + if (name === 'networkBoot') { + selectedRows.forEach(tr => { + if (tr.operation_status === 'on_shelve') { + notification.error({ message: `物理机【${tr.sn}】已上架, 不支持从网卡启动` }); + flag = true; + } + }); + if (flag) { + return; + } + } + this.execAction(name, selectedRows); + }; + + //获取带外状态 + changePowerStatus = (record) => { + this.props.dispatch({ + type: 'device-list/table-data/power-status/change', + payload: record + }); + }; + + + //操作入口 + execAction = (name, records) => { + if (actions[name]) { + console.log(name); + actions[name]({ + records, + initialValue: records, + type: name, + room: this.props.room, + reload: () => { + this.reload(); + } + }); + } + }; + + + osInstall = () => { + const { selectedRows } = this.props.tableData; + if (selectedRows.length < 1) { + return notification.error({ message: '请至少选择一台设备' }); + } + hashHistory.push({ pathname: '/device/entry', state: selectedRows }); + }; + + + //下载导入模板 + downloadImportTemplate = (key) => { + if (key === 'device') { + window.open('assets/files/existing_devices.xlsx'); + + } else if (key === 'store_room') { + window.open('assets/files/device_store_import.xlsx'); + } + }; + + + getRowSelection = () => { + const selectedRowKeys = this.props.tableData.selectedRowKeys; + return { + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.props.dispatch({ + type: 'device-list/table-data/set/selectedRows', + payload: { + selectedRowKeys, + selectedRows + } + }); + } + }; + }; + + changePage = page => { + this.props.dispatch({ + type: `device-list/table-data/change-page`, + payload: { + page + } + }); + }; + + changePageSize = (page, pageSize) => { + this.props.dispatch({ + type: `device-list/table-data/change-page-size`, + payload: { + page, + pageSize + } + }); + }; + + exportTemp = () => { + const query = this.props.tableData.query; + let keys = Object.keys(query); + const { tableData } = this.props; + const selectedRowKeys = tableData.selectedRowKeys || []; + keys = keys + .map(key => { + return `${key}=${query[key]}`; + }) + .join('&'); + window.open(`/api/cloudboot/v1/devices/export?${keys}&id=${selectedRowKeys}`); + }; + + render() { + const { tableData } = this.props; + const { loading, pagination, selectedRows } = tableData; + const menu_excel = ( + <Menu onClick={(e) => this.downloadImportTemplate(e.key)}> + <Menu.Item disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_physical_machine_download')} + key='device' + >存量设备导入模板</Menu.Item> + <Menu.Item disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_physical_machine_download')} + key='store_room' + >设备导入到库房模板</Menu.Item> + </Menu> + ); + const menu = ( + <Menu onClick={(e) => this.execAction(e.key)}> + + <Menu.Item disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_physical_machine_import')} + key='_importStoreRoom' + >设备导入到库房</Menu.Item> + <Menu.Item disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_physical_machine_import')} + key='_import' + >存量设备导入</Menu.Item> + </Menu> + ); + return ( + <div> + <div className='operate_btns'> + <ButtonGroup> + <Button + onClick={() => this.batchExecAction('editStatus')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_physical_machine_update_status')} + > + 批量修改状态 + </Button> + <Button + onClick={() => this.batchExecAction('editUsage')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_physical_machine_update_usage')} + > + 批量修改用途 + </Button> + <Button + onClick={() => this.batchExecAction('editHardwareRemark')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_physical_machine_update_usage')} + > + 批量修改硬件备注 + </Button> + </ButtonGroup> + <span className='pull-right'> + <ButtonGroup style={{ marginRight: 8, marginBottom: 8 }} > + <Dropdown overlay={menu_excel}> + <Button style={{ borderBottomRightRadius: 0, borderTopRightRadius: 0 }}>下载导入模板<Icon type='down' /></Button> + </Dropdown> + <Dropdown overlay={menu}> + <Button style={{ borderBottomLeftRadius: 0, borderTopLeftRadius: 0, marginLeft: -1 }}>导入 <Icon type='down' /></Button> + </Dropdown> + <Button + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_physical_machine_export')} + onClick={this.exportTemp} + > + 导出 + </Button> + </ButtonGroup> + <Button + style={{ marginRight: 8 }} + onClick={() => { + this.reload(); + }} + icon='reload' + > + </Button> + {renderDisplayMore(this, plainOptions)} + </span> + </div> + <div className='clearfix' /> + <Table + rowKey={'id'} + columns={getColumns(this, true)} + pagination={false} + dataSource={tableData.list} + rowSelection={this.getRowSelection()} + loading={loading} + /> + <div> + <Pagination + showTotal={(total) => `共 ${total} 条`} + showQuickJumper={true} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={this.changePageSize} + onChange={this.changePage} + /> + </div> + </div> + ); + } +} + +export default MyTable; diff --git a/cyclone-web/app/containers/device/list/get-component.js b/cyclone-web/app/containers/device/list/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..3f283f86e3a8ab599a7373f577730686380823b7 --- /dev/null +++ b/cyclone-web/app/containers/device/list/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('device-list', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/device/list/index.jsx b/cyclone-web/app/containers/device/list/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..a2915ffa68faa79440e6f3033e44c7dceaf3d92e --- /dev/null +++ b/cyclone-web/app/containers/device/list/index.jsx @@ -0,0 +1,71 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import SearchForm from './components/search-form'; +import Table from './components/table'; +import Layout from 'components/layout/page-layout'; + +class Container extends React.Component { + componentDidMount() { + this.props.dispatch({ + type: 'device-list/table-data/get' + }); + // this.props.dispatch({ + // type: 'device-list/idc/get' + // }); + // this.props.dispatch({ + // type: 'device-list/room/get' + // }); + // this.props.dispatch({ + // type: 'device-list/networkArea/get' + // }); + } + + componentWillUnmount() { + this.props.dispatch({ + type: 'device-list/table-data/reset' + }); + } + + onSearch = (values) => { + this.props.dispatch({ + type: 'device-list/table-data/search', + payload: { + ...values + } + }); + }; + + render() { + const { tableData } = this.props.data; + return ( + <Layout title='物理机列表'> + <SearchForm networkArea={this.props.networkArea} room={this.props.room} idc={this.props.idc} dispatch={this.props.dispatch} onSearch={this.onSearch}/> + <Table + dispatch={this.props.dispatch} + tableData={tableData} + userInfo={this.props.userInfo} + liableUser={this.props.dict.liableUser} + /> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + data: state.get('device-list').toJS(), + userInfo: state.getIn([ 'global', 'userData' ]).toJS(), + dict: state.getIn([ 'global', 'dict' ]).toJS(), + room: state.getIn([ 'global', 'room' ]).toJS(), + networkArea: state.getIn([ 'global', 'networkArea' ]).toJS(), + idc: state.getIn([ 'global', 'idc' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/device/list/reducers/index.js b/cyclone-web/app/containers/device/list/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..b44453bcfe29148f465d0f8c7bf6215327ebb831 --- /dev/null +++ b/cyclone-web/app/containers/device/list/reducers/index.js @@ -0,0 +1,43 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; +import { createRegularReducer } from 'utils/regular-reducer'; + +const initialState = fromJS({ + tableData: createTableStore(), + // idc: { + // loading: true, + // data: [] + // }, + // room: { + // loading: true, + // data: [] + // }, + // networkArea: { + // loading: true, + // data: [] + // } +}); + +const reducer = handleActions( + { + ...createTableReducer('device-list/table-data', 'tableData'), + // ...createRegularReducer('device-list/idc', 'idc'), + // ...createRegularReducer('device-list/room', 'room'), + // ...createRegularReducer('device-list/networkArea', 'networkArea'), + 'device-list/table-data/power-status/load/success': (state, action) => { + return state.updateIn([ 'tableData', 'list' ], list => { + let newList = list.toJS(); + newList.forEach(it => { + if (it.sn === action.payload.sn && it.power_status !== action.payload.power_status) { + it.power_status = action.payload.power_status; + } + }); + return fromJS(newList); + }); + } + }, + initialState, +); + +export default reducer; diff --git a/cyclone-web/app/containers/device/list/sagas/index.js b/cyclone-web/app/containers/device/list/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..1c75c9b376da2a01c6ca22f286b482a67657e81e --- /dev/null +++ b/cyclone-web/app/containers/device/list/sagas/index.js @@ -0,0 +1,65 @@ +import { get } from 'common/xFetch2'; +import { takeEvery } from 'redux-saga'; +import { call, put } from 'redux-saga/effects'; +import { notification } from 'antd'; + +let created = false; +function* empty() { + console.log(); +} + +function* defaultSaga() { + const watchers = yield [ + takeEvery('device-list/table-data/power-status/change', getPowerStatus) + + ]; +} + +function* getPowerStatus(action) { + try { + yield put({ + type: 'device-list/table-data/power-status/load' + }); + const res = yield call(get, `/api/cloudboot/v1/devices/${action.payload.sn}/power/status`); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + yield put({ + type: 'device-list/table-data/power-status/load/success', + payload: { + sn: action.payload.sn, + ...res.content + } + }); + } catch (error) { + console.log(error); + } +} +import { createTableSaga } from 'utils/table-saga'; +const jobTableSaga = createTableSaga({ + actionNamePrefix: 'device-list/table-data', + tableDataPath: [ 'device-list', 'tableData' ], + datasource: '/api/cloudboot/v1/devices' +}); + +// import { createTableListSaga } from 'utils/tableList-saga'; +// const idcSaga = createTableListSaga({ +// actionNamePrefix: 'device-list/idc', +// datasource: '/api/cloudboot/v1/idcs' +// }); +// const roomSaga = createTableListSaga({ +// actionNamePrefix: 'device-list/room', +// datasource: '/api/cloudboot/v1/server-rooms' +// }); +// const networkSaga = createTableListSaga({ +// actionNamePrefix: 'device-list/networkArea', +// datasource: '/api/cloudboot/v1/network-areas' +// }); + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [ jobTableSaga, defaultSaga ]; +} diff --git a/cyclone-web/app/containers/device/oob/actions/change-status.jsx b/cyclone-web/app/containers/device/oob/actions/change-status.jsx new file mode 100644 index 0000000000000000000000000000000000000000..bf94e0375c26e4eed3f42afbd707dee9110b2416 --- /dev/null +++ b/cyclone-web/app/containers/device/oob/actions/change-status.jsx @@ -0,0 +1,37 @@ +import React from 'react'; +import { post, del, put } from 'common/xFetch2'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; + +export default function action(options) { + + const typeMap = { + powerOn: { title: '开电', api: '/api/cloudboot/v1/devices/power', method: post }, + powerOff: { title: '关电', api: '/api/cloudboot/v1/devices/power', method: del }, + reBoot: { title: '重启', api: '/api/cloudboot/v1/devices/power/restart', method: put }, + networkBoot: { title: '从网卡启动', api: '/api/cloudboot/v1/devices/power/pxe/restart', method: put }, + reAccess: { title: '重新纳管带外', api: '/api/cloudboot/v1/devices/oob/re-access', method: put } + }; + + const sns = options.records.map(it => it.sn); + + const onSubmit = () => { + typeMap[options.type].method(typeMap[options.type].api, { sns: sns }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + options.reload(); + }); + }; + + confirm({ + title: typeMap[options.type].title, + content: `已选择设备:${sns.length == 0 ? '全部设备' : sns.length + '台'}`, + okText: '确定', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/device/oob/actions/index.js b/cyclone-web/app/containers/device/oob/actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..aa97fe4bbd851f243b34709848b193c53b5b7a13 --- /dev/null +++ b/cyclone-web/app/containers/device/oob/actions/index.js @@ -0,0 +1,11 @@ +import update from './update'; +import reAccess from './change-status'; +import networkBoot from './change-status'; +import powerOn from './change-status'; + +export default { + reAccess, + networkBoot, + powerOn, + update +}; diff --git a/cyclone-web/app/containers/device/oob/actions/update.jsx b/cyclone-web/app/containers/device/oob/actions/update.jsx new file mode 100644 index 0000000000000000000000000000000000000000..bd12692ee052ffde31e19c5e0ec07ed05e03e25c --- /dev/null +++ b/cyclone-web/app/containers/device/oob/actions/update.jsx @@ -0,0 +1,116 @@ +import React from 'react'; +import { Input, Button, Form, notification } from 'antd'; +import { put } from 'common/xFetch2'; +const FormItem = Form.Item; +import { formItemLayout, tailFormItemLayout } from 'common/enums'; +import Popup from 'components/popup'; + +export default function action(options) { + + const onSubmit = (values) => { + put(`/api/cloudboot/v1/devices/${options.records.sn}/oob/password`, values).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + Popup.close(); + }); + }; + + Popup.open({ + title: `修改带外信息`, + width: 600, + onCancel: () => { + Popup.close(); + }, + content: ( + <WrapperForm + {...options} + onSubmit={onSubmit} + onCancel={() => { + Popup.close(); + }} + /> + ) + }); +} + +class MyForm extends React.Component { + handleSubmit = ev => { + ev && ev.preventDefault(); + ev && ev.stopPropagation(); + this.props.form.validateFields({ force: true }, (error, values) => { + const postValues = { + + }; + if (error) { + notification.warning({ + message: '还有未填写完整的选项' + }); + return; + } + this.props.onSubmit(values); + }); + }; + + render() { + const { getFieldDecorator } = this.props.form; + const { initialValue } = this.props; + + return <Form onSubmit={this.handleSubmit}> + <FormItem {...formItemLayout} label='序列号' > + {getFieldDecorator('sn', { + initialValue: initialValue.sn + })( + <Input disabled={true} /> + )} + </FormItem> + <FormItem {...formItemLayout} label='带外IP' > + {getFieldDecorator('oob_ip', { + initialValue: initialValue.oob_ip + })( + <Input disabled={true} /> + )} + </FormItem> + <FormItem {...formItemLayout} label='带外用户名' > + {getFieldDecorator('oob_user_name', { + initialValue: initialValue.oob_user + })( + <Input/> + )} + </FormItem> + <FormItem {...formItemLayout} label='带外旧密码' > + {getFieldDecorator('oob_password_old', { + initialValue: initialValue.oob_password + })( + <Input/> + )} + </FormItem> + <FormItem {...formItemLayout} label='带外新密码' > + {getFieldDecorator('oob_password_new', { + rules: [ + { + required: true + } + ] + })( + <Input /> + )} + </FormItem> + <FormItem {...tailFormItemLayout}> + <div className='pull-right'> + <Button onClick={() => this.props.onCancel()}>取消</Button> + <Button + style={{ marginLeft: 8 }} + type='primary' + htmlType='submit' + > + 确认 + </Button> + </div> + </FormItem> + </Form>; + } +} +const WrapperForm = Form.create()(MyForm); diff --git a/cyclone-web/app/containers/device/oob/components/search-form.jsx b/cyclone-web/app/containers/device/oob/components/search-form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..262732a5be799459291a7e3ee76df883f54f0ebd --- /dev/null +++ b/cyclone-web/app/containers/device/oob/components/search-form.jsx @@ -0,0 +1,30 @@ +import React from 'react'; +import SearchForm from 'components/search-form'; +import { OOB_ACCESSIBLE, getSearchList } from 'common/enums'; + +export default class Search extends React.Component { + state = { + searchKeys: [ + { key: 'fixed_asset_number', label: '固资编号' }, + { key: 'sn', label: '序列号' }, + { key: 'ip', label: 'IP' }, + { key: 'intranet_ip', label: '内网IP' }, + { key: 'oob_accessible', label: '带外状态' } + ], + searchValues: { + 'fixed_asset_number': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'sn': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'ip': { type: 'input', placeholder: '模糊查询所有IP,支持英文逗号,空格,换行分隔' }, + 'intranet_ip': { type: 'input', placeholder: '精确查询内网IP,支持英文逗号,空格,换行分隔' }, + 'oob_accessible': { type: 'checkbox', list: getSearchList(OOB_ACCESSIBLE) } + } + }; + + render() { + return ( + <SearchForm onSearch={this.props.onSearch} searchKeys={this.state.searchKeys} searchValues={this.state.searchValues} /> + ); + } +} + + diff --git a/cyclone-web/app/containers/device/oob/components/table.jsx b/cyclone-web/app/containers/device/oob/components/table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..0062891079c25ce07b11602f71399050a37360ae --- /dev/null +++ b/cyclone-web/app/containers/device/oob/components/table.jsx @@ -0,0 +1,286 @@ +import React from 'react'; +import { + Table, + Pagination, + Button, + Icon, + notification, + Badge, + Divider, + Tooltip, +} from 'antd'; +import actions from '../actions'; +import { getPermissonBtn } from 'common/utils'; +import { Link } from 'react-router'; +import copy from 'copy-to-clipboard'; +import { OOB_ACCESSIBLE, OOB_STATUS_COLOR } from "common/enums"; +import { get } from 'https'; + + +class MyTable extends React.Component { + state = { + checkedList: [], + indeterminate: true, + checkAll: false + }; + + reload = () => { + this.props.dispatch({ + type: 'device-oob/table-data/reload' + }); + this.props.dispatch({ + type: 'device-oob/table-data/set/selectedRows', + payload: { + selectedRows: [], + selectedRowKeys: [] + } + }); + }; + getOobUser = (record) => { + get(`/api/cloudboot/v1/devices/${record.sn}/oob-user`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message || '获取失败' }); + } + notification.success({ message: '操作成功' }); + }); + } + + exportOob = () => { + const query = this.props.tableData.query; + let keys = Object.keys(query); + const { tableData } = this.props; + const selectedRowKeys = tableData.selectedRowKeys || []; + keys = keys + .map(key => { + return `${key}=${query[key]}`; + }) + .join('&'); + window.open(`/api/cloudboot/v1/devices/oob/export?${keys}&id=${selectedRowKeys}`); + }; + + //批量操作入口 + batchExecAction = (name) => { + let flag = false; + const { tableData } = this.props; + const selectedRows = tableData.selectedRows || []; + if (name == 'reAccess') { + this.execAction(name, selectedRows); + return; + } + if (selectedRows.length < 1) { + return notification.error({ message: '请至少选择一条数据' }); + } + if (name === 'networkBoot') { + selectedRows.forEach(tr => { + if (tr.operation_status !== 'pre_deploy') { + notification.error({ message: `物理机【${tr.sn}】运营状态非【待部署】, 不支持从网卡启动` }); + flag = true; + } + }); + if (flag) { + return; + } + } + this.execAction(name, selectedRows); + }; + + + //操作入口 + execAction = (name, records) => { + if (actions[name]) { + actions[name]({ + records, + type: name, + initialValue: records, + reload: () => { + this.reload(); + } + }); + } + }; + + changePage = page => { + this.props.dispatch({ + type: `device-oob/table-data/change-page`, + payload: { + page + } + }); + }; + + changePageSize = (page, pageSize) => { + this.props.dispatch({ + type: `device-oob/table-data/change-page-size`, + payload: { + page, + pageSize + } + }); + }; + + copyPsd = (t) => { + if (copy(t)) { + notification.success({ message: '复制成功' }); + } else { + notification.error({ message: '复制失败' }); + } + } + + getColumns = () => { + + const columns = [ + { + title: '固资编号', + dataIndex: 'fixed_asset_number' + }, + { + title: '序列号', + dataIndex: 'sn', + render: (text) => { + return <Link to={`/device/detail/${text}`}>{text}</Link>; + } + }, + { + title: '内网 IP', + dataIndex: 'intranet_ip' + }, + { + title: '带外IP', + dataIndex: 'oob_ip', + render: (t) => { + return <a href={`http://${t}`} target='_blank'>{t}</a>; + } + }, + { + title: '带外用户名', + dataIndex: 'oob_user' + }, + { + title: '带外密码', + dataIndex: 'oob_password', + render: (t) => { + if (t) { + return <span>{t} &nbsp;<Icon onClick={() => this.copyPsd(t)} style={{ float: 'right' }} type='copy'/></span>; + + } + } + }, + { + title: '带外状态', + dataIndex: 'oob_accessible', + render: type => { + const color = OOB_STATUS_COLOR[type] ? OOB_STATUS_COLOR[type][0] : 'transparent'; + const word = OOB_STATUS_COLOR[type] ? OOB_STATUS_COLOR[type][1] : ''; + return ( + <div> + <Badge + dot={true} + style={{ + background: color + }} + />{' '} + &nbsp;&nbsp; {word} + </div> + ); + } + }, + { + title: '操作', + dataIndex: 'operate', + render: (text, record) => { + return ( + <div> + <a disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_physical_machine_update_oob')} href='javascript:;' onClick={() => this.execAction('update', record)}>修改</a> + <Divider type='vertical'/> + <a href='javascript:;' onClick={() => this.getOobUser(record)}>刷新</a> + </div> + ); + } + } + ]; + return columns; + }; + + getRowSelection = () => { + const selectedRowKeys = this.props.tableData.selectedRowKeys; + return { + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.props.dispatch({ + type: 'device-oob/table-data/set/selectedRows', + payload: { + selectedRowKeys, + selectedRows + } + }); + } + }; + }; + + render() { + const { tableData } = this.props; + const { loading, pagination, selectedRows } = tableData; + return ( + <div> + <div className='operate_btns'> + <Button.Group style={{ marginRight: 8 }}> + <Button + type='primary' + onClick={() => this.batchExecAction('powerOn')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_physical_machine_powerOn')} + > + 开电 + </Button> + <Tooltip placement="top" title='重启[待部署]物理机并从网卡启动进入PXE'> + <Button + onClick={() => this.batchExecAction('networkBoot')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_physical_machine_networkBoot')} + > + 从网卡启动<Icon type='question-circle-o' /> + </Button> + </Tooltip> + <Button + onClick={() => this.batchExecAction('reAccess')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_oob_re_access')} + > + 重新纳管带外 + </Button> + </Button.Group> + <span> + 已选 {selectedRows.length} 项 + </span> + <Button + onClick={this.exportOob} + style={{ float: 'right', marginBottom: 8 }} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_physical_oob_export')} + > + 导出 + </Button> + </div> + <div className='clearfix' /> + <Table + rowKey={'id'} + columns={this.getColumns()} + pagination={false} + dataSource={tableData.list} + rowSelection={this.getRowSelection()} + loading={loading} + /> + <div> + <Pagination + showTotal={(total) => `共 ${total} 条`} + showQuickJumper={true} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={this.changePageSize} + onChange={this.changePage} + /> + </div> + </div> + ); + } +} + +export default MyTable; diff --git a/cyclone-web/app/containers/device/oob/get-component.js b/cyclone-web/app/containers/device/oob/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..cd5a5ee48eef457147a23619a56f5343048c8bd7 --- /dev/null +++ b/cyclone-web/app/containers/device/oob/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('device-oob', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/device/oob/index.jsx b/cyclone-web/app/containers/device/oob/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..17b714191d020582fd0d5f7f335794ce46e0c140 --- /dev/null +++ b/cyclone-web/app/containers/device/oob/index.jsx @@ -0,0 +1,64 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import SearchForm from './components/search-form'; +import Table from './components/table'; +import Layout from 'components/layout/page-layout'; + +class Container extends React.Component { + componentDidMount() { + this.props.dispatch({ + type: 'device-oob/table-data/get' + }); + } + + componentWillUnmount() { + this.props.dispatch({ + type: 'device-oob/table-data/reset' + }); + } + + onSearch = (values) => { + this.props.dispatch({ + type: 'device-oob/table-data/search', + payload: { + ...values + } + }); + this.props.dispatch({ + type: 'device-oob/table-data/set/selectedRows', + payload: { + selectedRows: [], + selectedRowKeys: [] + } + }); + }; + + render() { + const { tableData } = this.props.data; + return ( + <Layout title='带外管理'> + <SearchForm dispatch={this.props.dispatch} onSearch={this.onSearch}/> + <Table + dispatch={this.props.dispatch} + tableData={tableData} + userInfo={this.props.userInfo} + /> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + data: state.get('device-oob').toJS(), + userInfo: state.getIn([ 'global', 'userData' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/device/oob/reducers/index.js b/cyclone-web/app/containers/device/oob/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..7db3f11fc930c3cb231f2af73344a65880694eb7 --- /dev/null +++ b/cyclone-web/app/containers/device/oob/reducers/index.js @@ -0,0 +1,16 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; + +const initialState = fromJS({ + tableData: createTableStore() +}); + +const reducer = handleActions( + { + ...createTableReducer('device-oob/table-data', 'tableData') + }, + initialState, +); + +export default reducer; diff --git a/cyclone-web/app/containers/device/oob/sagas/index.js b/cyclone-web/app/containers/device/oob/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..3e902247ad6c7651cca37144fab857c63a35a16b --- /dev/null +++ b/cyclone-web/app/containers/device/oob/sagas/index.js @@ -0,0 +1,21 @@ +import { get } from 'common/xFetch2'; + + +let created = false; +function* empty() { + console.log(); +} + +import { createTableSaga } from 'utils/table-saga'; +const jobTableSaga = createTableSaga({ + actionNamePrefix: 'device-oob/table-data', + tableDataPath: [ 'device-oob', 'tableData' ], + datasource: '/api/cloudboot/v1/devices' +}); +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [jobTableSaga]; +} diff --git a/cyclone-web/app/containers/device/pre_deploy/components/search-form.jsx b/cyclone-web/app/containers/device/pre_deploy/components/search-form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..d2ce9d5339e08e2d307ed2098c4107f76380904d --- /dev/null +++ b/cyclone-web/app/containers/device/pre_deploy/components/search-form.jsx @@ -0,0 +1,42 @@ +import React from 'react'; +import SearchForm from 'components/search-form'; + +//已废弃 +export default class Search extends React.Component { + state = { + searchKeys: [ + { key: 'sn', label: '序列号' }, + { key: 'category', label: '设备类型' }, + { key: 'fixed_asset_number', label: '固资编号' }, + { key: 'model', label: '设备型号' }, + { key: 'usage', label: '用途' }, + { key: 'vendor', label: '厂商' } + ], + searchValues: { + 'sn': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'category': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'fixed_asset_number': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'model': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'usage': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'vendor': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' } + } + }; + + + onSearch = (values) => { + this.props.dispatch({ + type: 'device-pre_deploy/table-data/search', + payload: { + ...values + } + }); + }; + + render() { + return ( + <SearchForm onSearch={this.onSearch} searchKeys={this.state.searchKeys} searchValues={this.state.searchValues}/> + ); + } +} + + diff --git a/cyclone-web/app/containers/device/pre_deploy/components/table.jsx b/cyclone-web/app/containers/device/pre_deploy/components/table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..b3f9d0c52e6accfba6bad94981fc267b6bbd17fe --- /dev/null +++ b/cyclone-web/app/containers/device/pre_deploy/components/table.jsx @@ -0,0 +1,232 @@ +import React from 'react'; +import { + Table, + Button, + Pagination, + notification, +} from 'antd'; +const ButtonGroup = Button.Group; +import { hashHistory } from 'react-router'; +import actions from '../../list/actions'; +import { getColumns, plainOptions } from "containers/device/common/colums"; +import { getPermissonBtn } from 'common/utils'; +import { renderDisplayMore } from 'common/utils'; + +class MyTable extends React.Component { + state = { + checkedList: [], + indeterminate: true, + checkAll: false + }; + + reload = () => { + this.props.dispatch({ + type: 'device-pre_deploy/table-data/reload' + }); + this.props.dispatch({ + type: 'device-pre_deploy/table-data/set/selectedRows', + payload: { + selectedRows: [], + selectedRowKeys: [] + } + }); + }; + //批量操作入口 + batchExecAction = (name) => { + const { tableData } = this.props; + const selectedRows = tableData.selectedRows || []; + if (selectedRows.length < 1) { + return notification.error({ message: '请至少选择一条数据' }); + } + this.execAction(name, selectedRows); + }; + + //获取带外状态 + changePowerStatus = (record) => { + this.props.dispatch({ + type: 'device-pre_deploy/table-data/power-status/change', + payload: record + }); + }; + + + //操作入口 + execAction = (name, records) => { + if (actions[name]) { + actions[name]({ + records, + initialValue: records, + type: name, + room: this.props.room, + reload: () => { + this.reload(); + } + }); + } + }; + + oobAction = (name, ifSelected) => { + let flag = false; + const { tableData } = this.props; + const records = tableData.selectedRows; + if (!ifSelected && records.length < 1) { + return notification.error({ message: '请至少选择一台设备' }); + } + if (actions[name]) { + actions[name]({ + records, + userInfo: this.props.userInfo, + type: name, + reload: () => { + this.reload(); + this.props.dispatch({ + type: 'device-setting/table-data/set/selectedRows', + payload: { + selectedRows: [], + selectedRowKeys: [] + } + }); + } + }); + } + }; + + osInstall = () => { + const { selectedRows } = this.props.tableData; + if (selectedRows.length < 1) { + return notification.error({ message: '请至少选择一台设备' }); + } + hashHistory.push({ pathname: '/device/entry', state: selectedRows }); + }; + + + //下载导入模板 + downloadImportTemplate = () => { + window.open('assets/files/devices.xlsx'); + }; + + + getRowSelection = () => { + const selectedRowKeys = this.props.tableData.selectedRowKeys; + return { + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.props.dispatch({ + type: 'device-pre_deploy/table-data/set/selectedRows', + payload: { + selectedRowKeys, + selectedRows + } + }); + } + }; + }; + + changePage = page => { + this.props.dispatch({ + type: `device-pre_deploy/table-data/change-page`, + payload: { + page + } + }); + }; + + changePageSize = (page, pageSize) => { + this.props.dispatch({ + type: `device-pre_deploy/table-data/change-page-size`, + payload: { + page, + pageSize + } + }); + }; + + render() { + const { tableData } = this.props; + const { loading, pagination, selectedRows } = tableData; + + return ( + <div> + <div className='operate_btns'> + <Button + onClick={() => this.osInstall()} + type='primary' + style={{ marginRight: 8 }} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_predeploy_physical_machine_osInstall')} + > + 申请上架部署 + </Button> + <span> + 已选 { selectedRows.length } 项 + </span> + <span className='pull-right'> + <ButtonGroup style={{ marginRight: 8 }}> + <Button + onClick={() => this.downloadImportTemplate()} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_predeploy_physical_machine_download')} + > + 下载导入模板 + </Button> + <Button + onClick={() => this.execAction('pre_import')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_predeploy_physical_machine_import')} + > + 导入 + </Button> + </ButtonGroup> + <Button + onClick={() => this.oobAction('reAccess')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_oob_re_access')} + style={{ marginRight: 8 }} + > + 纳管带外 + </Button> + <Button + onClick={() => { + this.reload(); + }} + icon='reload' + style={{ marginRight: 8 }} + > + </Button> + + {renderDisplayMore(this, plainOptions)} + + <Button + onClick={() => this.batchExecAction('_delete')} + type='danger' + style={{ marginLeft: 8 }} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_predeploy_physical_machine_delete')} + > + 删除 + </Button> + + </span> + </div> + <div className='clearfix' /> + <Table + rowKey={'id'} + columns={getColumns(this, true)} + pagination={false} + dataSource={tableData.list} + rowSelection={this.getRowSelection()} + loading={loading} + /> + <div> + <Pagination + showTotal={(total) => `共 ${total} 条`} + showQuickJumper={true} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={this.changePageSize} + onChange={this.changePage} + /> + </div> + </div> + ); + } +} + +export default MyTable; diff --git a/cyclone-web/app/containers/device/pre_deploy/get-component.js b/cyclone-web/app/containers/device/pre_deploy/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..76bb527408c713819265fc8f405d1d9f1ea1cd93 --- /dev/null +++ b/cyclone-web/app/containers/device/pre_deploy/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('device-pre_deploy', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/device/pre_deploy/index.jsx b/cyclone-web/app/containers/device/pre_deploy/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..3ac180dcf22be042755c883256267b16a9f37b20 --- /dev/null +++ b/cyclone-web/app/containers/device/pre_deploy/index.jsx @@ -0,0 +1,62 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import SearchForm from 'containers/device/list/components/search-form'; +import Table from './components/table'; +import Layout from 'components/layout/page-layout'; + +class Container extends React.Component { + componentDidMount() { + this.props.dispatch({ + type: 'device-pre_deploy/table-data/get' + }); + } + + componentWillUnmount() { + this.props.dispatch({ + type: 'device-pre_deploy/table-data/reset' + }); + } + + onSearch = (values) => { + this.props.dispatch({ + type: 'device-pre_deploy/table-data/search', + payload: { + ...values + } + }); + }; + + render() { + const { tableData } = this.props.data; + return ( + <Layout title='待部署列表'> + <SearchForm networkArea={this.props.networkArea} room={this.props.room} idc={this.props.idc} dispatch={this.props.dispatch} onSearch={this.onSearch}/> + <Table + dispatch={this.props.dispatch} + tableData={tableData} + userInfo={this.props.userInfo} + liableUser={this.props.dict.liableUser} + /> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + data: state.get('device-pre_deploy').toJS(), + userInfo: state.getIn([ 'global', 'userData' ]).toJS(), + dict: state.getIn([ 'global', 'dict' ]).toJS(), + room: state.getIn([ 'global', 'room' ]).toJS(), + networkArea: state.getIn([ 'global', 'networkArea' ]).toJS(), + idc: state.getIn([ 'global', 'idc' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/device/pre_deploy/reducers/index.js b/cyclone-web/app/containers/device/pre_deploy/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..f22cf444b162de574e31808fe56c2dd7147fad4f --- /dev/null +++ b/cyclone-web/app/containers/device/pre_deploy/reducers/index.js @@ -0,0 +1,27 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; + +const initialState = fromJS({ + tableData: createTableStore() +}); + +const reducer = handleActions( + { + ...createTableReducer('device-pre_deploy/table-data', 'tableData'), + 'device-pre_deploy/table-data/power-status/load/success': (state, action) => { + return state.updateIn([ 'tableData', 'list' ], list => { + let newList = list.toJS(); + newList.forEach(it => { + if (it.sn === action.payload.sn && it.power_status !== action.payload.power_status) { + it.power_status = action.payload.power_status; + } + }); + return fromJS(newList); + }); + } + }, + initialState, +); + +export default reducer; diff --git a/cyclone-web/app/containers/device/pre_deploy/sagas/index.js b/cyclone-web/app/containers/device/pre_deploy/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..6b00dc5be69fd2d99b658d3dd5c195e593891066 --- /dev/null +++ b/cyclone-web/app/containers/device/pre_deploy/sagas/index.js @@ -0,0 +1,59 @@ +import { get } from 'common/xFetch2'; +import { takeEvery } from 'redux-saga'; +import { call, put } from 'redux-saga/effects'; +import { notification } from 'antd'; + +let created = false; +function* empty() { + console.log(); +} + +function* defaultSaga() { + const watchers = yield [ + takeEvery('device-pre_deploy/table-data/power-status/change', getPowerStatus) + ]; +} + + +import { createTableSaga } from 'utils/table-saga'; + +const jobTableSaga = createTableSaga({ + actionNamePrefix: 'device-pre_deploy/table-data', + tableDataPath: [ 'device-pre_deploy', 'tableData' ], + datasource: '/api/cloudboot/v1/devices', + getExtraQuery: () => { + return { + operation_status: 'pre_deploy', + pre_deployed: true + }; + } +}); + +function* getPowerStatus(action) { + try { + yield put({ + type: 'device-pre_deploy/table-data/power-status/load' + }); + const res = yield call(get, `/api/cloudboot/v1/devices/${action.payload.sn}/power/status`); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + yield put({ + type: 'device-pre_deploy/table-data/power-status/load/success', + payload: { + sn: action.payload.sn, + ...res.content + } + }); + } catch (error) { + console.log(error); + } +} + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [ jobTableSaga, defaultSaga ]; +} diff --git a/cyclone-web/app/containers/device/setting/actions/index.js b/cyclone-web/app/containers/device/setting/actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..7dc9adf6ad7c2cf2709b06a45c048e3634a8770f --- /dev/null +++ b/cyclone-web/app/containers/device/setting/actions/index.js @@ -0,0 +1,20 @@ +import reInstall from './operates'; +import cancelInstall from './operates'; +import finshInstall from './operates'; +import deleteDevice from './operates'; +import limitersToken from './limitersToken'; +import reAccess from './oob-control'; +import networkBoot from './oob-control'; +import powerOff from './oob-control'; + + +export default { + reInstall, + cancelInstall, + finshInstall, + deleteDevice, + limitersToken, + reAccess, + networkBoot, + powerOff +}; diff --git a/cyclone-web/app/containers/device/setting/actions/limitersToken.jsx b/cyclone-web/app/containers/device/setting/actions/limitersToken.jsx new file mode 100644 index 0000000000000000000000000000000000000000..29d8429da3bfe9f60ddad70ad97bb3006e9a06f5 --- /dev/null +++ b/cyclone-web/app/containers/device/setting/actions/limitersToken.jsx @@ -0,0 +1,29 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { del } from 'common/xFetch2'; + +export default function action(options) { + const records = options.records; + const onSubmit = () => { + const sns = records.map(it => { return { sn: it.sn }; }); + del('/api/cloudboot/v1/devices/limiters/tokens', { tokens: sns }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + options.reload(); + }); + }; + + confirm({ + title: `确定要一键释放令牌吗?`, + content: `已选择的设备数量:${records.length}台`, + okText: '确定', + okType: `primary`, + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/device/setting/actions/oob-control.jsx b/cyclone-web/app/containers/device/setting/actions/oob-control.jsx new file mode 100644 index 0000000000000000000000000000000000000000..7f0fada2669e4322d8a261b1ee24de6863c2b34e --- /dev/null +++ b/cyclone-web/app/containers/device/setting/actions/oob-control.jsx @@ -0,0 +1,36 @@ +import { post, del, put } from 'common/xFetch2'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; + +export default function action(options) { + + const typeMap = { + powerOn: { title: '开电', api: '/api/cloudboot/v1/devices/power', method: post }, + powerOff: { title: '关电', api: '/api/cloudboot/v1/devices/power', method: del }, + reBoot: { title: '重启', api: '/api/cloudboot/v1/devices/power/restart', method: put }, + networkBoot: { title: '从网卡启动', api: '/api/cloudboot/v1/devices/power/pxe/restart', method: put }, + reAccess: { title: '重新纳管带外', api: '/api/cloudboot/v1/devices/oob/re-access', method: put } + }; + + const sns = options.records.map(it => it.sn); + + const onSubmit = () => { + typeMap[options.type].method(typeMap[options.type].api, { sns: sns }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + options.reload(); + }); + }; + + confirm({ + title: typeMap[options.type].title, + content: `已选择设备:${sns.length == 0 ? '全部设备' : sns.length + '台'}`, + okText: '确定', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/device/setting/actions/operates.jsx b/cyclone-web/app/containers/device/setting/actions/operates.jsx new file mode 100644 index 0000000000000000000000000000000000000000..4d5c73b3791d1844371a39a5f6a5c9a12bdb8329 --- /dev/null +++ b/cyclone-web/app/containers/device/setting/actions/operates.jsx @@ -0,0 +1,35 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { put, del } from 'common/xFetch2'; + +export default function action(options) { + const records = options.records; + const typeMap = { + reInstall: { title: '重新部署', method: put, api: '/api/cloudboot/v1/devices/installations/reinstalls', okType: 'primary', content: '' }, + cancelInstall: { title: '取消部署', method: put, api: '/api/cloudboot/v1/devices/installations/cancels', okType: 'primary', content: '' }, + finshInstall: { title: '完成部署', method: put, api: '/api/cloudboot/v1/devices/installations/setinstallsok', okType: 'primary', content: '' }, + deleteDevice: { title: '删除', method: del, api: '/api/cloudboot/v1/devices/settings', okType: 'danger', content: ',将删除设备的全部装机参数' } + }; + const onSubmit = () => { + const sns = records.map(it => it.sn); + typeMap[options.type].method(typeMap[options.type].api, { sns: sns }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + options.reload(); + }); + }; + + confirm({ + title: `确定要${typeMap[options.type].title}吗?`, + content: `已选择的设备:${records.length}台${typeMap[options.type].content}`, + okText: '确定', + okType: `${typeMap[options.type].okType}`, + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/device/setting/components/search-form.jsx b/cyclone-web/app/containers/device/setting/components/search-form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..7a84473d66750fcdd3d5f9ed5ad11c82c276c569 --- /dev/null +++ b/cyclone-web/app/containers/device/setting/components/search-form.jsx @@ -0,0 +1,60 @@ +import React from 'react'; +import SearchForm from 'components/search-form'; +import { DEVICE_INSTALL_STATUS, getSearchList } from "common/enums"; + +export default class Search extends React.Component { + state = { + searchKeys: [ + { key: 'sn', label: '序列号' }, + { key: 'fixed_asset_number', label: '固资编号' }, + { key: 'category', label: '设备类型' }, + { key: 'intranet_ip', label: '内网IP' }, + { key: 'extranet_ip', label: '外网IP' }, + { key: 'server_room_name', label: '机房管理单元' }, + { key: 'server_cabinet_number', label: '机架编号' } + // { key: 'status', label: '部署状态' } + ], + searchValues: { + 'sn': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'fixed_asset_number': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'category': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'intranet_ip': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'extranet_ip': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'server_room_name': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'server_cabinet_number': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' } + // 'status': { type: 'radio', list: getSearchList(DEVICE_INSTALL_STATUS) } + } + }; + // + // UNSAFE_componentWillReceiveProps(props) { + // const { room, cabinet } = props; + // const searchValues = this.state.searchValues; + // if (!room.loading && room.loading !== this.props.room.loading) { + // searchValues['server_room_id'].list = room.data; + // this.setState({ searchValues }); + // } + // if (!cabinet.loading && cabinet.loading !== this.props.cabinet.loading) { + // searchValues['server_cabinet_id'].list = cabinet.data; + // this.setState({ searchValues }); + // } + // + // } + + + onSearch = (values) => { + this.props.dispatch({ + type: 'device-setting/table-data/search', + payload: { + ...values + } + }); + }; + + render() { + return ( + <SearchForm onSearch={this.onSearch} searchKeys={this.state.searchKeys} searchValues={this.state.searchValues}/> + ); + } +} + + diff --git a/cyclone-web/app/containers/device/setting/components/table.jsx b/cyclone-web/app/containers/device/setting/components/table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..0896ddc489231654735e069723e992f6baaabf5c --- /dev/null +++ b/cyclone-web/app/containers/device/setting/components/table.jsx @@ -0,0 +1,409 @@ +import React from 'react'; +import { get, del } from 'common/xFetch2'; +import { INSTALL_TYPE } from "common/enums"; +import { + Table, + Tooltip, + Button, + Icon, + Pagination, + notification, + Badge, + Progress +} from 'antd'; +import { Link } from 'react-router'; +import actions from '../actions'; +import { DEVICE_INSTALL_STATUS_COLOR, DEVICE_INSTALL_TYPE } from 'common/enums'; +import showExecuteResult from 'components/execute-result-modal'; +import { getPermissonBtn } from 'common/utils'; +import oobAction from '../../common/oob'; +import { renderDisplayMore } from 'common/utils'; + +const plainOptions = [ + { value: 'dhcp_token', name: 'DHCP_TOKEN' , render: (text) => { return <Tooltip placement="top" title={text}>{text}</Tooltip>}}, + { value: 'tor', name: 'TOR' , render: (text) => { return <Tooltip placement="top" title={text}>{text}</Tooltip>}}, + { value: 'install_type', name: '安装类型' , render: (text) => { return <span>{INSTALL_TYPE[text]}</span>}}, +]; + +class MyTable extends React.Component { + state = { + checkedList: [], + indeterminate: true, + checkAll: false + }; + + reload = () => { + this.props.dispatch({ + type: 'device-setting/table-data/reload' + }); + this.props.dispatch({ + type: 'device-setting/statistics/get' + }); + }; + + execAction = (name, ifSelected) => { + let flag = false; + const { tableData } = this.props; + const records = tableData.selectedRows; + if (!ifSelected && records.length < 1) { + return notification.error({ message: '请至少选择一台设备' }); + } + if (name === 'reInstall') { + records.forEach(tr => { + if (tr.status === 'success') { + flag = true; + notification.error({ message: `设备【${tr.sn}】已部署成功,重新部署需走审批流程` }); + } + }); + if (flag) { + return; + } + } + if (actions[name]) { + actions[name]({ + records, + userInfo: this.props.userInfo, + type: name, + reload: () => { + this.reload(); + this.props.dispatch({ + type: 'device-setting/table-data/set/selectedRows', + payload: { + selectedRows: [], + selectedRowKeys: [] + } + }); + this.props.loadNum(); + } + }); + } + }; + + getLog = (record, self) => { + let logInfo = ''; + get(`/api/cloudboot/v1/devices/${record.id}/installations/logs`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + const data = res.content.logs || []; + const logoData = []; + if (data.length > 0) { + data.forEach(item => { + logoData.push(item.updated_at + ': ' + '【' + item.title + '】 ' + item.content); + }); + logInfo = logoData.join('\n'); + self.setState({ logInfo: logInfo }); + } + }); + }; + + release = (record) => { + del(`/api/cloudboot/v1/devices/${record.sn}/limiters/tokens`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + }); + }; + + getColumns = (self) => { + const { status } = this.props; + + let columns = [ + { + title: '固资编号', + dataIndex: 'device', + render: (text) => <span>{text.fixed_asset_number}</span> + }, + { + title: '序列号', + dataIndex: 'sn', + render: (text, record) => { + return <Link to={`/device/detail/${text}`}>{text}</Link>; + } + }, + { + title: '设备类型', + dataIndex: 'device', + render: (text) => <span>{text.Category}</span> + }, + { + title: '机房管理单元', + dataIndex: 'server_room', + render: (text) => <Tooltip placement="top" title={text.name}>{text.name}</Tooltip> + }, + { + title: '机架编号', + dataIndex: 'server_cabinet', + render: (text) => <span>{text.number}</span> + }, + { + title: '机位编号', + dataIndex: 'server_usite', + render: (text) => <span>{text.number}</span> + }, + { + title: '物理区域', + dataIndex: 'paysical_area', + render: (text,record) => <Tooltip placement="top" title={record.server_usite ? record.server_usite.physical_area : ''}> + {record.server_usite ? record.server_usite.physical_area : ''} + </Tooltip> + }, + { + title: '内网IP', + dataIndex: 'intranet_ip' + }, + { + title: '外网IP', + dataIndex: 'extranet_ip' + }, + { + title: 'RAID类型', + dataIndex: 'hardware_template', + render: (text) => <Tooltip placement="top" title={text.name}>{text.name}</Tooltip> + }, + { + title: '操作系统', + dataIndex: 'image_template', + render: (text, record) => <span>{text.id !== 0 ? text.name : record.system_template.name}</span> + }, + { + title: '部署状态', + dataIndex: 'status', + width: 100, + render: type => { + const color = DEVICE_INSTALL_STATUS_COLOR[type] ? DEVICE_INSTALL_STATUS_COLOR[type][0] : 'white'; + const word = DEVICE_INSTALL_STATUS_COLOR[type] ? DEVICE_INSTALL_STATUS_COLOR[type][1] : ''; + return ( + <div> + <Badge + dot={true} + style={{ + background: color + }} + />{' '} + &nbsp;&nbsp; {word} + </div> + ); + } + }, + { + title: '部署进度', + dataIndex: 'install_progress', + width: 100, + render: (text, record) => <Progress percent={(text * 100).toFixed(0)} size='small' status='active' /> + }, + { + title: '部署日志', + dataIndex: 'log', + width: 50, + render: (text, record) => <a onClick={ev => { + showExecuteResult({ + record: record, + getData: this.getLog, + title: '查看部署日志', + reload: this.reload + }); + }} + >查看</a> + }, + { + title: '带外', + dataIndex: 'oob', + render: (text, record) => <a href='javascript:;' onClick={() => oobAction(record.sn)}>查看</a> + }, + ]; + //if (status === 'failure') { + // columns.push({ + // title: '操作', + // dataIndex: 'operate', + // width: 100, + // render: (text, record) => <a disabled={!record.dhcp_token} onClick={() => this.release(record)}>释放</a> + // }); + //} + if (self && self.state.checkedList.length > 0) { + self.state.checkedList.forEach(data => { + const content = { + title: data.name, + dataIndex: data.value + }; + if (data.render) { + content.render = (text, record) => data.render(text, record, self); + } + columns.push(content); + }); + } + return columns; + }; + + + changePage = page => { + this.props.dispatch({ + type: `device-setting/table-data/change-page`, + payload: { + page + } + }); + }; + + changePageSize = (page, pageSize) => { + this.props.dispatch({ + type: `device-setting/table-data/change-page-size`, + payload: { + page, + pageSize + } + }); + }; + + getRowSelection = () => { + const selectedRowKeys = this.props.tableData.selectedRowKeys; + return { + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.props.dispatch({ + type: 'device-setting/table-data/set/selectedRows', + payload: { + selectedRowKeys, + selectedRows + } + }); + } + }; + }; + + render() { + const { tableData, status } = this.props; + const { loading, pagination } = tableData; + return ( + <div> + <div className='operate_btns'> + { + (status === 'failure') && + <Button + onClick={() => this.execAction('reInstall')} + type='primary' + style={{ marginRight: 8 }} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_device_setting_reInstall')} + > + 重新部署 + </Button> + } + { + (status === 'pre_install' || status === 'installing') && + <Button + onClick={() => this.execAction('cancelInstall')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_device_setting_cancelInstall')} + style={{ marginRight: 8 }} + > + 取消部署 + </Button> + } + <span className='pull-right'> + <Button + onClick={() => { + this.reload(); + }} + icon='reload' + style={{ marginBottom: 8 , marginRight: 8 }} + > + </Button> + { + (status === 'failure') && + <Button + onClick={() => this.execAction('reAccess')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_oob_re_access')} + > + 重新纳管带外 + </Button> + } + { + (status === 'failure') && + <Tooltip placement="top" title='重启[待部署]物理机并从网卡启动进入PXE'> + <Button + onClick={() => this.execAction('networkBoot')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_physical_machine_networkBoot')} + > + 从网卡启动<Icon type='question-circle-o' /> + </Button> + </Tooltip> + } + { + (status === 'failure') && + <Tooltip placement="top" title='仅设置部署状态为成功,注意确认系统部署情况'> + <Button + onClick={() => this.execAction('finshInstall')} + style={{ marginRight: 8 }} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_device_setting_reInstall')} + > + 完成部署 + </Button> + </Tooltip> + } + { + (status === 'failure') && + <Tooltip placement="top" title='释放部署队列令牌 DHCP_TOKEN'> + <Button + onClick={() => this.execAction('limitersToken')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_device_setting_delete')} + style={{ marginRight: 8 }} + > + 一键释放 + </Button> + </Tooltip> + } + {renderDisplayMore(this, plainOptions)} + { + (status === 'failure') && + <Button + style={{ marginLeft: 16 }} + type='danger' + onClick={() => this.execAction('powerOff')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_physical_machine_powerOff')} + > + 关电 + </Button> + } + { + (status === 'failure') && + <Tooltip placement="top" title='删除部署记录并回收IP,注意操作风险'> + <Button + style={{ marginRight: 8, marginLeft: 16}} + type='danger' + onClick={() => this.execAction('deleteDevice')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_device_setting_delete')} + > + 删除 + </Button> + </Tooltip> + } + </span> + </div> + <div className='clearfix' /> + <Table + rowKey={'id'} + columns={this.getColumns(this)} + dataSource={tableData.list} + loading={loading} + pagination={false} + defaultPageSize={3} + rowSelection={this.getRowSelection()} + /> + <div> + <Pagination + showTotal={(total) => `共 ${total} 条`} + showQuickJumper={true} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={this.changePageSize} + onChange={this.changePage} + /> + </div> + </div> + ); + } +} + +export default MyTable; diff --git a/cyclone-web/app/containers/device/setting/get-component.js b/cyclone-web/app/containers/device/setting/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..ce3e0aeaff5e18b3129ff39955981e61656e4e9d --- /dev/null +++ b/cyclone-web/app/containers/device/setting/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('device-setting', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/device/setting/index.jsx b/cyclone-web/app/containers/device/setting/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..3234ffaf836cac62db97095bdf0f2a35f7dfaa60 --- /dev/null +++ b/cyclone-web/app/containers/device/setting/index.jsx @@ -0,0 +1,119 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import SearchForm from './components/search-form'; +import Table from './components/table'; +import Layout from 'components/layout/page-layout-tabs'; +import { Tabs } from 'antd'; +const TabPane = Tabs.TabPane; +import { hashHistory } from 'react-router'; + + +class Container extends React.Component { + + componentDidMount() { + const type = this.props.location.query.type; + //存type,否则关闭查看日志模态框刷新时找不到type + this.props.dispatch({ + type: 'device-setting/type/get', + payload: type === 'all' ? null : type + }); + this.props.dispatch({ + type: 'device-setting/table-data/get', + payload: type === 'all' ? null : type + }); + this.loadNum(); + } + + + componentWillUnmount() { + this.props.dispatch({ + type: 'device-setting/table-data/reset' + }); + } + + loadNum = () => { + //获取数目 + this.props.dispatch({ + type: 'device-setting/statistics/get' + }); + }; + renderContent = (status) => { + //console.log(this.props) + const { tableData } = this.props.data; + return ( + <div> + <SearchForm + dispatch={this.props.dispatch} + room={this.props.room} + cabinet={this.props.cabinet} + /> + <Table + status={status} + loadNum={this.loadNum} + dispatch={this.props.dispatch} + tableData={tableData} + userInfo={this.props.userInfo} + /> + </div> + ); + }; + getContent = (key) => { + //存type + this.props.dispatch({ + type: 'device-setting/type/get', + payload: key === 'all' ? null : key + }); + const currentQuery = this.props.location.query; + currentQuery.type = key; + hashHistory.push(this.props.location); + this.props.dispatch({ + type: 'device-setting/table-data/search', + payload: { + status: key === 'all' ? null : key + } + }); + this.loadNum(); + }; + + renderTab = (num, title) => { + if (num > 0) { + return <span>{title}<span className='spanCircle fill'>{num}</span></span>; + } + return title; + }; + + render() { + const { statistics } = this.props.data; + const statusNum = statistics.data || {}; + const { query } = this.props.location; + const defaultKey = query.type ? query.type : 'all'; + return ( + <Layout title='部署列表'> + <Tabs onChange={this.getContent} activeKey={defaultKey} defaultActiveKey={defaultKey} type='card'> + <TabPane tab='全部' key='all'>{this.renderContent('all')}</TabPane> + <TabPane tab={this.renderTab(statusNum.preinstall_count, '等待部署')} key='pre_install'>{this.renderContent('pre_install')}</TabPane> + <TabPane tab={this.renderTab(statusNum.installing_count, '正在部署')} key='installing'>{this.renderContent('installing')}</TabPane> + <TabPane tab={this.renderTab(statusNum.success_count, '部署成功')} key='success'>{this.renderContent('success')}</TabPane> + <TabPane tab={this.renderTab(statusNum.failure_count, '部署失败')} key='failure'>{this.renderContent('failure')}</TabPane> + </Tabs> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + data: state.get('device-setting').toJS(), + userInfo: state.getIn([ 'global', 'userData' ]).toJS(), + room: state.getIn([ 'global', 'room' ]).toJS(), + cabinet: state.getIn([ 'global', 'cabinet' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/device/setting/reducers/index.js b/cyclone-web/app/containers/device/setting/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..e1b5d70f540d1f40eceb8ec2657a6215c60bf2be --- /dev/null +++ b/cyclone-web/app/containers/device/setting/reducers/index.js @@ -0,0 +1,26 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; +import { createRegularReducer } from "utils/regular-reducer"; + +const initialState = fromJS({ + tableData: createTableStore(), + statistics: { + loading: true, + data: {} + }, + type: '' +}); + +const reducer = handleActions( + { + ...createTableReducer('device-setting/table-data', 'tableData'), + ...createRegularReducer('device-setting/statistics', 'statistics'), + 'device-setting/type/get': (state, action) => { + return state.set('type', action.payload); + } + }, + initialState, +); + +export default reducer; diff --git a/cyclone-web/app/containers/device/setting/sagas/index.js b/cyclone-web/app/containers/device/setting/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..0924cc49021a208ff6f3ed5e514b23260b67f96a --- /dev/null +++ b/cyclone-web/app/containers/device/setting/sagas/index.js @@ -0,0 +1,56 @@ +import { get } from 'common/xFetch2'; +import { takeEvery } from 'redux-saga'; +import { call, put } from 'redux-saga/effects'; +import { notification } from 'antd'; + + +let created = false; +function* empty() { + return; +} + +function* defaultSaga() { + const watchers = yield [ + takeEvery('device-setting/statistics/get', getStatistics) + ]; +} + +import { createTableSaga } from 'utils/table-saga'; + +const tableSaga = createTableSaga({ + actionNamePrefix: 'device-setting/table-data', + tableDataPath: [ 'device-setting', 'tableData' ], + datasource: '/api/cloudboot/v1/devices/settings', + getExtraQuery: (state, action) => { + const type1 = action && action.payload; + const type = state.getIn([ 'device-setting', 'type' ]) || type1; + return { + status: type + }; + } +}); + +function* getStatistics() { + try { + yield put({ + type: 'device-setting/failure/load' + }); + const res = yield call(get, `/api/cloudboot/v1/devices/installations/statistics`); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + yield put({ + type: 'device-setting/statistics/load/success', + payload: res.content + }); + } catch (error) { + console.log(error); + } +} +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [ tableSaga, defaultSaga ]; +} diff --git a/cyclone-web/app/containers/device/setting_rule/actions/create-update.jsx b/cyclone-web/app/containers/device/setting_rule/actions/create-update.jsx new file mode 100644 index 0000000000000000000000000000000000000000..8242715854413064685817f115ccda587dc34122 --- /dev/null +++ b/cyclone-web/app/containers/device/setting_rule/actions/create-update.jsx @@ -0,0 +1,119 @@ +import React from 'react'; +import { Input, Select, Button, Form, notification } from 'antd'; +import { post, put } from 'common/xFetch2'; +const FormItem = Form.Item; +import { formItemLayout, tailFormItemLayout } from 'common/enums'; +import Popup from 'components/popup'; +const { Option } = Select; + +export default function action(options) { + const type = options.type; + const typeMap = { + _create: { name: '新增参数规则', method: post, url: '/api/cloudboot/v1/device-setting-rules' }, + _update: { name: '修改参数规则', method: put, url: `/api/cloudboot/v1/device-setting-rules` } + }; + const onSubmit = (values) => { + if (type == '_update') { + values.id = options.records.id; + } + typeMap[type].method(typeMap[type].url, values).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + Popup.close(); + }); + }; + + Popup.open({ + title: `${typeMap[type].name}`, + width: 600, + onCancel: () => { + Popup.close(); + }, + content: ( + <WrapperForm + initialValue={options.records} + onSubmit={onSubmit} + onCancel={() => { + Popup.close(); + }} + /> + ) + }); +} + +class MyForm extends React.Component { + handleSubmit = ev => { + ev && ev.preventDefault(); + ev && ev.stopPropagation(); + this.props.form.validateFields({ force: true }, (error, values) => { + if (error) { + notification.warning({ + message: '还有未填写完整的选项' + }); + return; + } + this.props.onSubmit(values); + }); + }; + render() { + const { getFieldDecorator } = this.props.form; + const initialValue = this.props.initialValue; + return <Form onSubmit={this.handleSubmit}> + <FormItem {...formItemLayout} label='规则前件' > + {getFieldDecorator('condition', { + initialValue: initialValue.condition, + rules: [ + { + required: true, + message: '请输入参数规则前件' + } + ] + })( + <Input.TextArea rows={3}/> + )} + </FormItem> + <FormItem {...formItemLayout} label='规则推论' > + {getFieldDecorator('action', { + initialValue: initialValue.action, + rules: [ + { + required: true, + message: '请输入规则推论' + } + ] + })( + <Input /> + )} + </FormItem> + <FormItem {...formItemLayout} label='规则类别' > + {getFieldDecorator('rule_category', { + initialValue: initialValue.rule_category, + rules: [ + { + required: true, + message: '请输入规则类别' + } + ] + })( + <Input /> + )} + </FormItem> + <FormItem {...tailFormItemLayout}> + <div className='pull-right'> + <Button onClick={() => this.props.onCancel()}>取消</Button> + <Button + style={{ marginLeft: 8 }} + type='primary' + htmlType='submit' + > + 确认 + </Button> + </div> + </FormItem> + </Form>; + } +} +const WrapperForm = Form.create()(MyForm); diff --git a/cyclone-web/app/containers/device/setting_rule/actions/delete.jsx b/cyclone-web/app/containers/device/setting_rule/actions/delete.jsx new file mode 100644 index 0000000000000000000000000000000000000000..7722002af1cd79c74005c9f500b3dbed44d3e35d --- /dev/null +++ b/cyclone-web/app/containers/device/setting_rule/actions/delete.jsx @@ -0,0 +1,26 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { del } from 'common/xFetch2'; + +export default function action(options) { + const onSubmit = () => { + del(`/api/cloudboot/v1/device-setting-rules`, { ids: options.records.map(it => it.id) }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + }); + }; + confirm({ + title: `确定要删除吗?`, + content: `共:${options.records.length} 条`, + okText: '确定', + okType: 'danger', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/device/setting_rule/actions/index.js b/cyclone-web/app/containers/device/setting_rule/actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..af24443d1b1db50d3b3e8c9d48f25400ba266246 --- /dev/null +++ b/cyclone-web/app/containers/device/setting_rule/actions/index.js @@ -0,0 +1,9 @@ +import _delete from './delete'; +import _create from './create-update'; +import _update from './create-update'; + +export default { + _delete, + _create, + _update +}; diff --git a/cyclone-web/app/containers/device/setting_rule/components/search-form.jsx b/cyclone-web/app/containers/device/setting_rule/components/search-form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..ec7566c839acfbb650c74f34bbbbc64ff162eaa7 --- /dev/null +++ b/cyclone-web/app/containers/device/setting_rule/components/search-form.jsx @@ -0,0 +1,31 @@ +import React from 'react'; +import SearchForm from 'components/search-form'; +import { DEVICE_SETTING_RULE_CATEGORY, getSearchList } from "common/enums"; + +export default class Search extends React.Component { + state = { + searchKeys: [ + { key: 'rule_category', label: '规则类别' }, + ], + searchValues: { + 'rule_category': { type: 'checkbox', list: getSearchList(DEVICE_SETTING_RULE_CATEGORY) }, + } + }; + + onSearch = (values) => { + this.props.dispatch({ + type: 'device-setting-rules/table-data/search', + payload: { + ...values + } + }); + }; + + render() { + return ( + <SearchForm onSearch={this.onSearch} searchKeys={this.state.searchKeys} searchValues={this.state.searchValues}/> + ); + } +} + + diff --git a/cyclone-web/app/containers/device/setting_rule/components/table.jsx b/cyclone-web/app/containers/device/setting_rule/components/table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..04c559d1b10633ed244a1932dcd2056a2b8d4966 --- /dev/null +++ b/cyclone-web/app/containers/device/setting_rule/components/table.jsx @@ -0,0 +1,233 @@ +import React from 'react'; +import { + Table, + Tooltip, + Button, + Pagination, + notification, + Modal +} from 'antd'; +import actions from '../actions'; +import TableControlCell from 'components/TableControlCell'; +import { getPermissonBtn } from 'common/utils'; + +class MyTable extends React.Component { + state = { visible: false }; + reload = () => { + this.props.dispatch({ + type: 'device-setting-rules/table-data/reload' + }); + this.props.dispatch({ + type: 'device-setting-rules/table-data/set/selectedRows', + payload: { + selectedRows: [], + selectedRowKeys: [] + } + }); + }; + + //批量操作入口 + batchExecAction = (name) => { + const { tableData } = this.props; + const selectedRows = tableData.selectedRows || []; + if (selectedRows.length < 1) { + return notification.error({ message: '请至少选择一条数据' }); + } + this.execAction(name, selectedRows); + }; + + //操作入口 + execAction = (name, records) => { + if (actions[name]) { + actions[name]({ + records, + initialValue: records, + type: name, + reload: () => { + this.reload(); + } + }); + } + }; + + getColumns = () => { + + let columns = [ + { + title: '规则前件', + dataIndex: 'condition', + width: 800, + render: (text) => { + return <Tooltip placement="top" title={text}>{text}</Tooltip> + } + }, + { + title: '规则推论', + dataIndex: 'action', + }, + { + title: '规则类别', + dataIndex: 'rule_category', + }, + { + title: '操作', + dataIndex: 'operate', + render: (text, record) => { + const commands = [ + { + name: '修改', + command: '_update', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_device_setting_rule_update') + } + ]; + return ( + <TableControlCell + commands={commands} + record={record} + execCommand={command => { + this.execAction(command, record); + }} + /> + ); + } + }, + ]; + + return columns; + }; + + changePage = page => { + this.props.dispatch({ + type: `device-setting-rules/table-data/change-page`, + payload: { + page + } + }); + }; + + changePageSize = (page, pageSize) => { + this.props.dispatch({ + type: `device-setting-rules/table-data/change-page-size`, + payload: { + page, + pageSize + } + }); + }; + + getRowSelection = () => { + const selectedRowKeys = this.props.tableData.selectedRowKeys; + return { + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.props.dispatch({ + type: 'device-setting-rules/table-data/set/selectedRows', + payload: { + selectedRowKeys, + selectedRows + } + }); + } + }; + }; + + + showModal = () => { + this.setState({ + visible: true, + }); + }; + + handleOk = e => { + //console.log(e); + this.setState({ + visible: false, + }); + }; + + handleCancel = e => { + //console.log(e); + this.setState({ + visible: false, + }); + }; + + + render() { + const { tableData } = this.props; + const { loading, pagination } = tableData; + + return ( + <div> + <div className='operate_btns'> + <Button + onClick={() => this.execAction('_create', {})} + type='primary' + icon='plus' + style={{ marginRight: 8 }} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_device_setting_rule_create')} + > + 新增 + </Button> + <Button onClick={this.showModal}> + 说明 + </Button> + <span className='pull-right'> + <Button + type='danger' + onClick={() => this.batchExecAction('_delete')} + style={{ marginRight: 8 }} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_device_setting_rule_delete')} + > + 删除 + </Button> + <Button + onClick={() => { + this.reload(); + }} + icon='reload' + style={{ marginBottom: 8 }} + > + </Button> + </span> + </div> + <div className='clearfix' /> + <Modal + title="规则说明" + visible={this.state.visible} + onOk={this.handleOk} + onCancel={this.handleCancel} + footer={null} + width={800} > + <p>1.元规则:获取设备属性[category-设备类型|vendor-厂商(小写英文)|physical_area-物理区域|is_fiti_eco_product-是否金融信创生态产品]值+逻辑判断操作符[equal|contains|in]进行推导</p> + <p>2.多个元规则通过逻辑操作符[and|or]进行组合,优先级:or 大于 and</p> + <p>3.相同类型[os|raid|network]的规则按排列先后顺序匹配推导</p> + <p>4.当所有类型[os|raid|network]的规则都推导成功时返回完整的装机参数进入部署</p> + </Modal> + <Table + rowKey={'id'} + columns={this.getColumns()} + dataSource={tableData.list} + loading={loading} + pagination={false} + defaultPageSize={3} + rowSelection={this.getRowSelection()} + /> + <div> + <Pagination + showTotal={(total) => `共 ${total} 条`} + showQuickJumper={true} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={this.changePageSize} + onChange={this.changePage} + /> + </div> + </div> + ); + } +} + +export default MyTable; diff --git a/cyclone-web/app/containers/device/setting_rule/get-component.js b/cyclone-web/app/containers/device/setting_rule/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..e0e4c0614a5aeffb1982590441faae18f46b7f97 --- /dev/null +++ b/cyclone-web/app/containers/device/setting_rule/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('device-setting-rules', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/device/setting_rule/index.jsx b/cyclone-web/app/containers/device/setting_rule/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..4d5e86737ca6d45eeb42e146b2df916e6eab78bc --- /dev/null +++ b/cyclone-web/app/containers/device/setting_rule/index.jsx @@ -0,0 +1,94 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import SearchForm from './components/search-form'; +import Table from './components/table'; +import Layout from 'components/layout/page-layout-tabs'; +import { Tabs } from 'antd'; +const TabPane = Tabs.TabPane; +import { hashHistory } from 'react-router'; + + +class Container extends React.Component { + + componentDidMount() { + const type = this.props.location.query.type; + //存type + this.props.dispatch({ + type: 'device-setting-rules/type/get', + payload: type === 'all' ? null : type + }); + this.props.dispatch({ + type: 'device-setting-rules/table-data/get', + payload: type === 'all' ? null : type + }); + } + + componentWillUnmount() { + this.props.dispatch({ + type: 'device-setting-rules/table-data/reset' + }); + } + + renderContent = (rule_category) => { + const { tableData } = this.props.data; + return ( + <div> + <SearchForm + dispatch={this.props.dispatch} + /> + <Table + rule_category={rule_category} + dispatch={this.props.dispatch} + tableData={tableData} + userInfo={this.props.userInfo} + /> + </div> + ); + }; + getContent = (key) => { + //存type + this.props.dispatch({ + type: 'device-setting-rules/type/get', + payload: key === 'all' ? null : key + }); + const currentQuery = this.props.location.query; + currentQuery.type = key; + hashHistory.push(this.props.location); + this.props.dispatch({ + type: 'device-setting-rules/table-data/search', + payload: { + rule_category: key === 'all' ? null : key + } + }); + }; + + render() { + const { query } = this.props.location; + const defaultKey = query.type ? query.type : 'all'; + return ( + <Layout title='规则列表'> + <Tabs onChange={this.getContent} activeKey={defaultKey} defaultActiveKey={defaultKey} type='card'> + <TabPane tab='全部' key='all'>{this.renderContent('all')}</TabPane> + <TabPane tab='操作系统' key='os'>{this.renderContent('os')}</TabPane> + <TabPane tab='阵列结构' key='raid'>{this.renderContent('raid')}</TabPane> + <TabPane tab='网络配置' key='network'>{this.renderContent('network')}</TabPane> + </Tabs> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + data: state.get('device-setting-rules').toJS(), + userInfo: state.getIn([ 'global', 'userData' ]).toJS(), + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/device/setting_rule/reducers/index.js b/cyclone-web/app/containers/device/setting_rule/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..e91c1dd0462d211d9a7e753544e1369895f5763a --- /dev/null +++ b/cyclone-web/app/containers/device/setting_rule/reducers/index.js @@ -0,0 +1,24 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; + +const initialState = fromJS({ + tableData: createTableStore(), + statistics: { + loading: true, + data: {} + }, + type: '' +}); + +const reducer = handleActions( + { + ...createTableReducer('device-setting-rules/table-data', 'tableData'), + 'device-setting-rules/type/get': (state, action) => { + return state.set('type', action.payload); + } + }, + initialState, +); + +export default reducer; diff --git a/cyclone-web/app/containers/device/setting_rule/sagas/index.js b/cyclone-web/app/containers/device/setting_rule/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..6f6d153cde4094e4fd9c3449cd8c290c7551ce0c --- /dev/null +++ b/cyclone-web/app/containers/device/setting_rule/sagas/index.js @@ -0,0 +1,32 @@ +import { get } from 'common/xFetch2'; +import { takeEvery } from 'redux-saga'; +import { call, put } from 'redux-saga/effects'; +import { notification } from 'antd'; + + +let created = false; +function* empty() { + yield; +} + +import { createTableSaga } from 'utils/table-saga'; +const tableSaga = createTableSaga({ + actionNamePrefix: 'device-setting-rules/table-data', + tableDataPath: [ 'device-setting-rules', 'tableData' ], + datasource: '/api/cloudboot/v1/device-setting-rules', + getExtraQuery: (state, action) => { + const type1 = action && action.payload; + const type = state.getIn([ 'device-setting-rules', 'type' ]) || type1; + return { + rule_category: type + }; + } +}); + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [ tableSaga ]; +} diff --git a/cyclone-web/app/containers/device/special/actions/create.jsx b/cyclone-web/app/containers/device/special/actions/create.jsx new file mode 100644 index 0000000000000000000000000000000000000000..0a216e0ec634f07907c1c8ad7204f3461c8713d5 --- /dev/null +++ b/cyclone-web/app/containers/device/special/actions/create.jsx @@ -0,0 +1,45 @@ +import React from 'react'; +import { notification } from 'antd'; +import { post } from 'common/xFetch2'; +import Popup from 'components/popup'; +import MyForm from './form'; + +export default function action(options) { + + const onSubmit = (values) => { + values.need_extranet_ip = values.need_extranet_ip ? 'yes' : 'no'; + values.need_intranet_ip = values.need_intranet_ip ? 'yes' : 'no'; + + if (values.maintenance_service_date_begin) { + values.maintenance_service_date_begin = moment(values.maintenance_service_date_begin).format('YYYY-MM-DD'); + } + + post('/api/cloudboot/v1/special-device', values).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + Popup.close(); + }); + }; + + Popup.open({ + title: `新增特殊设备`, + width: 700, + onCancel: () => { + Popup.close(); + }, + content: ( + <MyForm + {...options} + //initialValue={options.records} + username={options.username} + onSubmit={onSubmit} + onCancel={() => { + Popup.close(); + }} + /> + ) + }); +} \ No newline at end of file diff --git a/cyclone-web/app/containers/device/special/actions/delete.jsx b/cyclone-web/app/containers/device/special/actions/delete.jsx new file mode 100644 index 0000000000000000000000000000000000000000..2554655991973df4a76cf53c95089cf838024293 --- /dev/null +++ b/cyclone-web/app/containers/device/special/actions/delete.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { del } from 'common/xFetch2'; + +export default function action(options) { + const ids = options.records.map(it => it.id); + const onSubmit = () => { + del(`/api/cloudboot/v1/devices`, { "ids": ids }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + }); + }; + confirm({ + title: `确定要删除吗?`, + content: `共选择${ids.length}条数据`, + okText: '确定', + okType: 'danger', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/device/special/actions/form.jsx b/cyclone-web/app/containers/device/special/actions/form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..e207fa98fa703cce5b5f21aea1685d241d27a1cb --- /dev/null +++ b/cyclone-web/app/containers/device/special/actions/form.jsx @@ -0,0 +1,334 @@ +import React from 'react'; +import { Input, Checkbox, Select, Button, Form, notification, DatePicker, InputNumber } from 'antd'; +const FormItem = Form.Item; +import { formItemLayout, tailFormItemLayout } from 'common/enums'; +const { Option } = Select; +import { getWithArgs } from 'common/xFetch2'; +import moment from 'moment'; + + +class MyForm extends React.Component { + constructor(props) { + super(props); + this.state = { + cabinet: [], + usite: [], + initialValue: { + 'maintenance_service_date_begin': moment().add(45, 'days'), + 'maintenance_months': 60, + }, + }; + } + //state = { + // cabinet: [], + // usite: [], + // initialValue: { + // 'maintenance_service_date_begin': moment().add(45, 'days'), + // 'maintenance_months': 60 + // } + //}; + + handleSubmit = ev => { + ev && ev.preventDefault(); + ev && ev.stopPropagation(); + this.props.form.validateFields({ force: true }, (error, values) => { + if (error) { + notification.warning({ + message: '还有未填写完整的选项' + }); + return; + } + this.props.onSubmit(values); + }); + }; + + clearCabinet = () => { + const { setFieldsValue, getFieldValue } = this.props.form; + const cabinet = getFieldValue('server_cabinet_number'); + if (cabinet) { + setFieldsValue({ server_cabinet_number: null }); + } + this.setState({ + cabinet: [] + }); + }; + clearUsite = () => { + const { setFieldsValue, getFieldValue } = this.props.form; + const usite = getFieldValue('server_usite_number'); + if (usite) { + setFieldsValue({ server_usite_number: null }); + } + this.setState({ + usite: [] + }); + }; + //选择机房获取机架列表 + getCabinet = (v, page, clear) => { + this.getCabinetPage(v, page); + if (clear) { + this.clearCabinet(); + this.clearUsite(); + } + }; + + getCabinetPage = (v, page) => { + getWithArgs('/api/cloudboot/v1/server-cabinets', { page: page, page_size: 1000, server_room_id: v }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + this.setState((preState) => { + return { + cabinet: [ ...preState.cabinet, ...res.content.records ] + }; + }, () => { + if (res.content.total_pages > page) { + this.getCabinetPage(v, page + 1); + } + }); + }); + }; + + //选择机架获取机位列表 + getUsite = (v, page, clear) => { + this.getUsitePage(v, page); + if (clear) { + this.clearUsite(); + } + }; + + getUsitePage = (v, page) => { + getWithArgs('/api/cloudboot/v1/server-usites', { page: page, page_size: 100, server_cabinet_id: v, status: 'free,pre_occupied' }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + this.setState((preState) => { + return { + usite: [ ...preState.usite, ...res.content.records ] + }; + }, () => { + if (res.content.total_pages > page) { + this.getUsitePage(v, page + 1); + } + }); + }); + }; + + + + render() { + const { getFieldDecorator } = this.props.form; + const { room } = this.props; + const { initialValue } = this.state; + console.log(initialValue); + + return <Form onSubmit={this.handleSubmit}> + <FormItem {...formItemLayout} label='序列号' > + {getFieldDecorator('sn', { + rules: [ + { + required: true + } + ] + + })( + <Input /> + )} + </FormItem> + <FormItem {...formItemLayout} label='型号' > + {getFieldDecorator('model', { + rules: [ + { + required: true + } + ] + })( + <Input /> + )} + </FormItem> + <FormItem {...formItemLayout} label='厂商' > + {getFieldDecorator('vendor', { + rules: [ + { + required: true + } + ] + })( + <Input /> + )} + </FormItem> + <FormItem {...formItemLayout} label='硬件描述' > + {getFieldDecorator('hardware_remark', { + rules: [ + { + required: true + } + ] + })( + <Input /> + )} + </FormItem> + <FormItem {...formItemLayout} label='设备类型' > + {getFieldDecorator('category', { + rules: [ + { + required: true, + } + ] + })( + <Select> + <Option value='堡垒机'>{'堡垒机'}</Option> + <Option value='加密机'>{'加密机'}</Option> + <Option value='前置机'>{'前置机'}</Option> + <Option value='SSL服务器'>{'SSL服务器'}</Option> + <Option value='签名服务器'>{'签名服务器'}</Option> + <Option value='X86服务器'>{'X86服务器'}</Option> + <Option value='GPU服务器'>{'GPU服务器'}</Option> + <Option value='授时服务器'>{'授时服务器'}</Option> + <Option value='其他'>{'其他'}</Option> + </Select> + )} + </FormItem> + <FormItem {...formItemLayout} label='负责人' > + {getFieldDecorator('owner', { + rules: [ + { + required: true, + message: '请输入设备负责人企业微信号,多个负责人使用逗号分隔', + } + ] + })( + <Input placeholder='请输入设备负责人企业微信号,多个负责人使用逗号分隔'/> + )} + </FormItem> + <FormItem {...formItemLayout} label='维保服务起始日期' > + {getFieldDecorator('maintenance_service_date_begin', { + initialValue: initialValue.maintenance_service_date_begin, + rules: [ + { + required: false, + message: '默认' + } + ] + })(<DatePicker style={{ width: '100%' }} />)} + </FormItem> + <FormItem {...formItemLayout} label='保修期(月数)' > + {getFieldDecorator('maintenance_months', { + initialValue: initialValue.maintenance_months, + rules: [ + { + required: true, + message: '保修期(月数)' + } + ] + })(<InputNumber style={{ width: '100%' }} />)} + </FormItem> + <FormItem {...formItemLayout} label='订单编号' > + {getFieldDecorator('order_number', { + rules: [ + { + required: false + } + ] + })( + <Input /> + )} + </FormItem> + <FormItem {...formItemLayout} label='操作系统名称' > + {getFieldDecorator('os_release_name', { + rules: [ + { + required: true, + message: '请输入操作系统名称,如:openEuler 20.03 (LTS)', + } + ] + })( + <Input placeholder='请输入操作系统名称,如:openEuler 20.03 (LTS)'/> + )} + </FormItem> + <FormItem {...formItemLayout} label='是否分配内网IP' > + {getFieldDecorator('need_intranet_ip', { + + })( + <Checkbox /> + )} + </FormItem> + <FormItem {...formItemLayout} label='是否分配外网IP' > + {getFieldDecorator('need_extranet_ip', { + + })( + <Checkbox /> + )} + </FormItem> + <FormItem {...formItemLayout} label='机房名称' > + {getFieldDecorator('server_room_id', { + rules: [ + { + required: true + } + ] + })( + <Select + showSearch={true} + filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0} + onChange={(value) => this.getCabinet(value, 1, true)} + > + { + !room.loading && room.data.map((os, index) => <Option value={os.value} key={os.value}>{os.label}</Option>) + } + </Select> + )} + </FormItem> + <FormItem {...formItemLayout} label='机架编号' > + {getFieldDecorator('server_cabinet_id', { + rules: [ + { + required: true + } + ] + })( + <Select + showSearch={true} + filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0} + onChange={(value) => this.getUsite(value, 1, true)} + > + { + this.state.cabinet.map((os, index) => <Option value={os.id} key={os.id}>{os.number}</Option>) + } + </Select> + )} + </FormItem> + <FormItem {...formItemLayout} label='机位编号' > + {getFieldDecorator('server_usite_id', { + rules: [ + { + required: true + } + ] + })( + <Select + showSearch={true} + filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0} + > + { + this.state.usite.map((os, index) => <Option value={os.id} key={os.id}>{os.number}</Option>) + } + </Select> + )} + </FormItem> + <FormItem {...tailFormItemLayout}> + <div className='pull-right'> + <Button onClick={() => this.props.onCancel()}>取消</Button> + <Button + style={{ marginLeft: 8 }} + type='primary' + htmlType='submit' + > + 确认 + </Button> + </div> + </FormItem> + </Form>; + } +} +export default Form.create()(MyForm); + diff --git a/cyclone-web/app/containers/device/special/actions/import.jsx b/cyclone-web/app/containers/device/special/actions/import.jsx new file mode 100644 index 0000000000000000000000000000000000000000..2a898f3b8326fd6fc1943e20c1bf64652836f314 --- /dev/null +++ b/cyclone-web/app/containers/device/special/actions/import.jsx @@ -0,0 +1,94 @@ +import React from 'react'; +import Popup from 'components/popup'; +import FileUpload from 'components/upload'; + +export default function action(options) { + const getColumns = () => { + return [ + { + title: '序列号SN', + dataIndex: 'sn' + }, + { + title: '厂商', + dataIndex: 'vendor' + }, + { + title: '型号', + dataIndex: 'model' + }, + { + title: '设备类型', + dataIndex: 'category' + }, + { + title: '负责人', + dataIndex: 'owner' + }, + { + title: '维保服务起始日期', + dataIndex: 'maintenance_service_date_begin' + }, + { + title: '保修期(月数)', + dataIndex: 'maintenance_months' + }, + { + title: '机房管理单元名称', + dataIndex: 'server_room_name' + }, + { + title: '机架编号', + dataIndex: 'server_cabinet_number' + }, + { + title: '机位编号', + dataIndex: 'server_usite_number' + }, + { + title: '硬件说明', + dataIndex: 'hardware_remark' + }, + { + title: '操作系统名称', + dataIndex: 'os_release_name' + }, + { + title: '是否分配内网IPv4', + dataIndex: 'need_intranet_ip' + }, + { + title: '是否分配外网IPv4', + dataIndex: 'need_extranet_ip' + }, + { + title: '关联订单编号', + dataIndex: 'order_number' + } + ]; + }; + + + Popup.open({ + title: '导入数据', + width: 1500, + onCancel: () => { + Popup.close(); + }, + content: ( + <FileUpload + importApi='/api/cloudboot/v1/special-devices/imports' + uploadApi='/api/cloudboot/v1/special-devices/upload' + previewApi='/api/cloudboot/v1/special-devices/imports/previews' + getColumns={getColumns} + onSuccess={() => { + Popup.close(); + options.reload(); + }} + onCancel={() => { + Popup.close(); + }} + /> + ) + }); +} diff --git a/cyclone-web/app/containers/device/special/actions/index.js b/cyclone-web/app/containers/device/special/actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..d56b10558ffad9c9357c10a30357e06126cfebf6 --- /dev/null +++ b/cyclone-web/app/containers/device/special/actions/index.js @@ -0,0 +1,10 @@ +import _import from './import'; +import create from './create'; +import _delete from './delete'; + + +export default { + _import, + _delete, + create +}; diff --git a/cyclone-web/app/containers/device/special/components/search-form.jsx b/cyclone-web/app/containers/device/special/components/search-form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..f8f3eeb52885944f5e2e8f58de3a83a5ce75662b --- /dev/null +++ b/cyclone-web/app/containers/device/special/components/search-form.jsx @@ -0,0 +1,77 @@ +import React from 'react'; +import SearchForm from 'components/search-form'; +import { OPERATION_STATUS, getSearchList } from 'common/enums'; +import { get } from 'common/xFetch2'; +import { notification } from 'antd'; + +export default class Search extends React.Component { + + state = { + searchKeys: [ + { key: 'sn', label: '序列号' }, + { key: 'ip', label: 'IP' }, + { key: 'model', label: '设备型号' }, //枚举 + { key: 'vendor', label: '厂商' }, //枚举 + { key: 'server_room_name', label: '机房管理单元' }, + { key: 'server_cabinet_number', label: '机架编号' }, + { key: 'server_usite_number', label: '机位编号' }, + { key: 'hardware_remark', label: '硬件说明' } + ], + searchValues: { + 'sn': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'ip': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'model': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'vendor': { type: 'checkbox', list: [] }, + 'server_room_name': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'server_usite_number': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'server_cabinet_number': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'hardware_remark': { type: 'input', placeholder: '查询条件支持模糊查询' } + } + }; + + getList = (name) => { + const searchValues = this.state.searchValues; + get(`/api/cloudboot/v1/devices/query-params/${name}`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + const list = res.content.list || []; + if (list.length > 0) { + searchValues[name].list = list.map(it => { + if (it.name) { + return { + label: it.name, + value: it.name + }; + } else { + return { + label: 'blank', + value: 'blank' + }; + } + }); + } + }); + }; + + componentDidMount() { + this.getList('vendor'); + } + + onSearch = (values) => { + this.props.dispatch({ + type: `device-special/table-data/search`, + payload: { + ...values + } + }); + }; + + render() { + return ( + <SearchForm onSearch={this.onSearch} searchKeys={this.state.searchKeys} searchValues={this.state.searchValues} /> + ); + } +} + + diff --git a/cyclone-web/app/containers/device/special/components/table.jsx b/cyclone-web/app/containers/device/special/components/table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..e3edcee12b01137925a3d60e671de4e068d3e846 --- /dev/null +++ b/cyclone-web/app/containers/device/special/components/table.jsx @@ -0,0 +1,257 @@ +import React from 'react'; +import { + Table, + Button, + Badge, + Pagination, + notification, + Tooltip +} from 'antd'; +const ButtonGroup = Button.Group; +import { Link } from 'react-router'; +import actions from '../actions'; +import { plainOptions } from "containers/device/common/colums"; +import { getPermissonBtn } from 'common/utils'; +import { renderDisplayMore } from 'common/utils'; +import { OPERATION_STATUS_COLOR } from "common/enums"; + + +class MyTable extends React.Component { + state = { + checkedList: [], + indeterminate: true, + checkAll: false + }; + + reload = () => { + this.props.dispatch({ + type: 'device-special/table-data/reload' + }); + this.props.dispatch({ + type: 'device-special/table-data/set/selectedRows', + payload: { + selectedRows: [], + selectedRowKeys: [] + } + }); + }; + + //获取带外状态 + changePowerStatus = (record) => { + this.props.dispatch({ + type: 'device-special/table-data/power-status/change', + payload: record + }); + }; + + //操作入口 + execAction = (name, records) => { + if (actions[name]) { + actions[name]({ + records, + initialValue: records, + type: name, + room: this.props.room, + reload: () => { + this.reload(); + } + }); + } + }; + + //批量操作入口 + batchExecAction = (name) => { + const { tableData } = this.props; + const selectedRows = tableData.selectedRows || []; + if (selectedRows.length < 1) { + return notification.error({ message: '请至少选择一条数据' }); + } + this.execAction(name, selectedRows); + }; + + + //下载导入模板 + downloadImportTemplate = () => { + window.open('assets/files/special_device_import.xlsx'); + }; + + + getRowSelection = () => { + const selectedRowKeys = this.props.tableData.selectedRowKeys; + return { + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.props.dispatch({ + type: 'device-special/table-data/set/selectedRows', + payload: { + selectedRowKeys, + selectedRows + } + }); + } + }; + }; + + changePage = page => { + this.props.dispatch({ + type: `device-special/table-data/change-page`, + payload: { + page + } + }); + }; + + changePageSize = (page, pageSize) => { + this.props.dispatch({ + type: `device-special/table-data/change-page-size`, + payload: { + page, + pageSize + } + }); + }; + getColumns = () => { + return [ + { + title: '固资编号', + dataIndex: 'fixed_asset_number', + render: (text) => <Tooltip placement="top" title={text}>{text}</Tooltip> + }, + { + title: '序列号SN', + dataIndex: 'sn', + render: (text, record) => <Link to={`/device/detail/${text}`}>{text}</Link> + }, + { + title: '厂商', + dataIndex: 'vendor' + }, + { + title: '型号', + dataIndex: 'model' + }, + { + title: '用途', + dataIndex: 'usage' + }, + { + title: '设备类型', + dataIndex: 'category' + }, + { + title: '机房管理单元名称', + dataIndex: 'server_room_name', + render: (t, record) => record.server_room ? record.server_room.name : '' + }, + { + title: '机架编号', + dataIndex: 'server_cabinet_number', + render: (t, record) => record.server_cabinet ? record.server_cabinet.number : '' + }, + { + title: '机位编号', + dataIndex: 'server_usite_number', + render: (t, record) => record.server_usite ? record.server_usite.number : '' + }, + { + title: '硬件说明', + dataIndex: 'hardware_remark' + }, + { + title: '内网IP', + dataIndex: 'intranet_ip' + }, + { + title: '外网IP', + dataIndex: 'extranet_ip' + }, + { + title: '运营状态', + dataIndex: 'operation_status', + render: type => { + const color = OPERATION_STATUS_COLOR[type] ? OPERATION_STATUS_COLOR[type][0] : 'transparent'; + const word = OPERATION_STATUS_COLOR[type] ? OPERATION_STATUS_COLOR[type][1] : ''; + return ( + <div> + <Badge + dot={true} + style={{ + background: color + }} + />{' '} + &nbsp;&nbsp; {word} + </div> + ); + } + } + ]; + }; + + + render() { + const { tableData } = this.props; + const { loading, pagination } = tableData; + + return ( + <div> + <div className='operate_btns'> + <Button + type='primary' + style={{ marginRight: 8 }} + onClick={() => this.execAction('create')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_special_device_create')} + > + 新增 + </Button> + <Button + type='danger' + style={{ marginRight: 8 }} + onClick={() => this.batchExecAction('_delete')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_special_device_delete')} + > + 删除 + </Button> + <span className='pull-right'> + <ButtonGroup style={{ marginRight: 8 }}> + <Button + onClick={() => this.downloadImportTemplate()} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_special_device_import_download')} + > + 下载导入模板 + </Button> + <Button + onClick={() => this.execAction('_import')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_special_device_import')} + > + 导入 + </Button> + </ButtonGroup> + </span> + </div> + <div className='clearfix' /> + <Table + rowKey={'id'} + columns={this.getColumns()} + pagination={false} + dataSource={tableData.list} + rowSelection={this.getRowSelection()} + loading={loading} + /> + <div> + <Pagination + showTotal={(total) => `共 ${total} 条`} + showQuickJumper={true} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={this.changePageSize} + onChange={this.changePage} + /> + </div> + </div> + ); + } +} + +export default MyTable; diff --git a/cyclone-web/app/containers/device/special/get-component.js b/cyclone-web/app/containers/device/special/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..8c2da31e1904a5e5ec89e14bbf560ffb31a80e10 --- /dev/null +++ b/cyclone-web/app/containers/device/special/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('device-special', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/device/special/index.jsx b/cyclone-web/app/containers/device/special/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..57fe0441f7d4ff3c36df99603fd4cf30529fecd1 --- /dev/null +++ b/cyclone-web/app/containers/device/special/index.jsx @@ -0,0 +1,75 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import SearchForm from './components/search-form'; +import Table from './components/table'; +import Layout from 'components/layout/page-layout'; + +class Container extends React.Component { + componentDidMount() { + this.props.dispatch({ + type: 'device-special/table-data/get' + }); + // this.props.dispatch({ + // type: 'device-special/idc/get' + // }); + // this.props.dispatch({ + // type: 'device-special/room/get' + // }); + // this.props.dispatch({ + // type: 'device-special/networkArea/get' + // }); + } + + componentWillUnmount() { + this.props.dispatch({ + type: 'device-special/table-data/reset' + }); + } + + // onSearch = (values) => { + // this.props.dispatch({ + // type: 'device-special/table-data/search', + // payload: { + // ...values + // } + // }); + // }; + + render() { + const { tableData } = this.props.data; + return ( + <Layout title='特殊设备'> + <SearchForm + dispatch={this.props.dispatch} + /> + <Table + dispatch={this.props.dispatch} + tableData={tableData} + userInfo={this.props.userInfo} + liableUser={this.props.dict.liableUser} + room={this.props.room} + + /> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + data: state.get('device-special').toJS(), + userInfo: state.getIn(['global', 'userData']).toJS(), + dict: state.getIn(['global', 'dict']).toJS(), + room: state.getIn(['global', 'room']).toJS(), + networkArea: state.getIn(['global', 'networkArea']).toJS(), + idc: state.getIn(['global', 'idc']).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/device/special/reducers/index.js b/cyclone-web/app/containers/device/special/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..f286ecc8e6080304dd5cd3f074f4df21780033c2 --- /dev/null +++ b/cyclone-web/app/containers/device/special/reducers/index.js @@ -0,0 +1,28 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; +import { createRegularReducer } from 'utils/regular-reducer'; + +const initialState = fromJS({ + tableData: createTableStore() +}); + +const reducer = handleActions( + { + ...createTableReducer('device-special/table-data', 'tableData'), + 'device-special/table-data/power-status/load/success': (state, action) => { + return state.updateIn([ 'tableData', 'list' ], list => { + let newList = list.toJS(); + newList.forEach(it => { + if (it.sn === action.payload.sn && it.power_status !== action.payload.power_status) { + it.power_status = action.payload.power_status; + } + }); + return fromJS(newList); + }); + } + }, + initialState, +); + +export default reducer; diff --git a/cyclone-web/app/containers/device/special/sagas/index.js b/cyclone-web/app/containers/device/special/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..ee31fb40ba7c7678b4e94e19079cdf4a4cdfa59b --- /dev/null +++ b/cyclone-web/app/containers/device/special/sagas/index.js @@ -0,0 +1,55 @@ +import { get } from 'common/xFetch2'; +import { takeEvery } from 'redux-saga'; +import { call, put } from 'redux-saga/effects'; +import { notification } from 'antd'; +import { createTableSaga } from 'utils/table-saga'; + + +let created = false; +function* empty() { + console.log(); +} + +function* defaultSaga() { + const watchers = yield [ + takeEvery('device-special/table-data/power-status/change', getPowerStatus) + ]; +} +function* getPowerStatus(action) { + try { + yield put({ + type: 'device-special/table-data/power-status/load' + }); + const res = yield call(get, `/api/cloudboot/v1/devices/${action.payload.sn}/power/status`); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + yield put({ + type: 'device-special/table-data/power-status/load/success', + payload: { + sn: action.payload.sn, + ...res.content + } + }); + } catch (error) { + console.log(error); + } +} + +const jobTableSaga = createTableSaga({ + actionNamePrefix: 'device-special/table-data', + tableDataPath: [ 'device-special', 'tableData' ], + datasource: '/api/cloudboot/v1/devices', + getExtraQuery: () => { + return { + usage: 'SpecialDev' + }; + } +}); +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [ jobTableSaga, defaultSaga ]; +} diff --git a/cyclone-web/app/containers/homepage/components/line.jsx b/cyclone-web/app/containers/homepage/components/line.jsx new file mode 100644 index 0000000000000000000000000000000000000000..f8fe3f1d612196efd8adfed2167cd33fed45c179 --- /dev/null +++ b/cyclone-web/app/containers/homepage/components/line.jsx @@ -0,0 +1,135 @@ +import React from 'react'; +import echarts from 'echarts'; + +export default class TablePanel extends React.Component { + constructor(props) { + super(props); + this.resultReport = null; + } + + componentDidUpdate() { + this.renderChart(); + } + renderChart = () => { + this.resultReport = echarts.init($('#resultReport')[0]); + $(window).resize(() => { + const resultReportParent = $('#resultReport'); + this.resultReport.resize( + resultReportParent.height(), + resultReportParent.width() + ); + }); + this.resultReport.showLoading(); + const { inspections } = this.props; + if (!inspections.loading) { + this.resultReport.hideLoading(); + this.resultReport.setOption(this.setReportOption(inspections.data)); + } + }; + setReportOption = data => { + const option = { + color: [ 'rgba(139,212,109,1)', 'rgba(255,208,77,1)', 'rgba(243,111,99,0.9)' ], + tooltip: { + trigger: 'axis', + axisPointer: { + type: 'cross', + label: { + backgroundColor: '#6a7985' + } + } + }, + legend: { + data: [ '正常', '警告', '异常' ], + right: '3%', + top: '2%' + }, + grid: { + left: '3%', + right: '3%', + bottom: '3%', + containLabel: true + }, + xAxis: { + type: 'category', + boundaryGap: false, + data: data.map(item => item.date) + }, + yAxis: [ + { + type: 'value' + } + ], + series: [ + { + name: '正常', + type: 'line', + areaStyle: { + color: { + type: 'linear', + x: 0, + y: 0, + x2: 0, + y2: 1, + colorStops: [{ + offset: 0, color: 'rgba(139,212,109,0.1)' // 0% 处的颜色 + }, { + offset: 1, color: 'rgba(139,212,109,0)' // 100% 处的颜色 + }], + globalCoord: false // 缺省为 false + } + }, + data: data.map(it => it.nominal_count) + }, + { + name: '警告', + type: 'line', + areaStyle: { + color: { + type: 'linear', + x: 0, + y: 0, + x2: 0, + y2: 1, + colorStops: [{ + offset: 0, color: 'rgba(255,208,77,0.1)' // 0% 处的颜色 + }, { + offset: 1, color: 'rgba(255,208,77,0)' // 100% 处的颜色 + }], + globalCoord: false // 缺省为 false + } + }, + data: data.map(it => it.warning_count) + }, + { + name: '异常', + type: 'line', + areaStyle: { + color: { + type: 'linear', + x: 0, + y: 0, + x2: 0, + y2: 1, + colorStops: [{ + offset: 0, color: 'rgba(243,111,99,0.1)' // 0% 处的颜色 + }, { + offset: 1, color: 'rgba(243,111,99,0)' // 100% 处的颜色 + }], + globalCoord: false // 缺省为 false + } + }, + data: data.map(it => it.critical_count) + } + ] + }; + return option; + }; + render() { + return ( + <div className='chartWrapper'> + <div id='resultReport' style={{ height: 350 }} /> + </div> + ); + } +} + diff --git a/cyclone-web/app/containers/homepage/components/pie.jsx b/cyclone-web/app/containers/homepage/components/pie.jsx new file mode 100644 index 0000000000000000000000000000000000000000..33296eff000d9c9669c40038d19a8c3a32e2bab8 --- /dev/null +++ b/cyclone-web/app/containers/homepage/components/pie.jsx @@ -0,0 +1,78 @@ +import React from 'react'; +import echarts from 'echarts'; + +export default class TablePanel extends React.Component { + constructor(props) { + super(props); + this.resultReport = null; + } + + componentDidMount() { + this.renderChart(); + } + renderChart = () => { + this.resultReport = echarts.init($(`#${this.props.id}`)[0]); + $(window).resize(() => { + const resultReportParent = $(`#${this.props.id}`); + this.resultReport.resize( + resultReportParent.height(), + resultReportParent.width() + ); + }); + // this.resultReport.showLoading(); + // const { inspections } = this.props; + // if (!inspections.loading) { + // this.resultReport.hideLoading(); + // this.resultReport.setOption(this.setReportOption(inspections.data)); + // } + this.resultReport.setOption(this.setReportOption()); + }; + setReportOption = data => { + const option = { + color: [ '#4d9cff', '#a5afbc52' ], + tooltip: { + trigger: 'item', + formatter: "{a} <br/>{b}: {c} ({d}%)" + }, + legend: { + show: false, + x: 'right' + }, + series: [ + { + name: this.props.name, + type: 'pie', + radius: [ '48%', '70%' ], + avoidLabelOverlap: false, + label: { + normal: { + show: false, + position: 'center' + }, + emphasis: { + show: false + } + }, + labelLine: { + normal: { + show: false + } + }, + data: [ + { value: 335, name: '已用容量' }, + { value: 210, name: '未用容量' } + ] + } + ] + }; + return option; + }; + render() { + return ( + <div className='chartWrapper'> + <div id={this.props.id} style={{ height: 300 }} /> + </div> + ); + } +} + diff --git a/cyclone-web/app/containers/homepage/get-component.js b/cyclone-web/app/containers/homepage/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..f08414a84862e7fe1bc4a75c48a7642c9355b28a --- /dev/null +++ b/cyclone-web/app/containers/homepage/get-component.js @@ -0,0 +1,30 @@ +/** + * get component + */ +const errorLoading = err => { + console.error('Dynamic page loading failed', err); // eslint-disable-line no-console +}; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('containers/homepage/sagas/index.js'); + const reducer = await import('containers/homepage/reducers/index.js'); + injectReducer('homepage', reducer.default); + injectSagas(saga.default()); + const component = await import('containers/homepage'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/homepage/index.jsx b/cyclone-web/app/containers/homepage/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..7e45fb6730cf85770bc828b04d4c261a74fcc76d --- /dev/null +++ b/cyclone-web/app/containers/homepage/index.jsx @@ -0,0 +1,170 @@ +import React, { Component } from 'react'; +import { connect } from 'react-redux'; +import { Col, Row, Card, Radio } from 'antd'; +import Line from './components/line'; +import Pine from './components/pie'; +const RadioButton = Radio.Button; +const RadioGroup = Radio.Group; +import { Link } from 'react-router'; +import { arrayFind } from 'common/util'; + +class Container extends Component { + constructor(props) { + super(props); + } + componentDidMount() { + this.props.dispatch({ + type: 'homepage/devices/get' + }); + this.props.dispatch({ + type: 'homepage/inspections/get', + payload: { + period: 'latest_week' + } + }); + } + + + onChange = (e) => { + this.props.dispatch({ + type: 'homepage/inspections/get', + payload: { + period: e.target.value + } + }); + }; + + render() { + const { devices, inspections } = this.props.data; + const { permissions } = this.props.userInfo; + let ifPermise; + if (permissions) { + ifPermise = arrayFind(permissions, 'menu_device_setting'); + } + return ( + <div className='home-page'> + <div className='home-main'> + <Row gutter={16} className='margin-bottom'> + <Col span='6'> + <Link to={arrayFind(permissions, 'menu_physical_machine') ? '/device/list' : ''}> + <div className='home-card'> + <img src='assets/homepage/all_device.png' alt='' /> + <span className='card-right'> + <em>{devices.data.total_devices}</em> 台<br />物理机 + </span> + </div> + </Link> + </Col> + <Col span='6'> + <Link to={ifPermise ? '/device/setting?type=installing' : ''}> + <div className='home-card'> + <img src='assets/homepage/install.png' alt='' /> + <span className='card-right'> + <em>{devices.data.installing_count}</em> 台<br />正在部署 + </span> + </div> + </Link> + </Col> + <Col span='6'> + <Link to={ifPermise ? '/device/setting?type=success' : ''}> + <div className='home-card'> + <img src='assets/homepage/install_success.png' alt='' /> + <span className='card-right'> + <em>{devices.data.success_count}</em> 台<br />部署成功 + </span> + </div> + </Link> + </Col> + <Col span='6'> + <Link to={ifPermise ? '/device/setting?type=failure' : ''}> + <div className='home-card'> + <img src='assets/homepage/install_fail.png' alt='' /> + <span className='card-right'> + <em>{devices.data.failure_count}</em> 台<br />部署失败 + </span> + </div> + </Link> + </Col> + </Row> + {/*<Row gutter={16} className='margin-bottom middle-card'>*/} + {/*<Col span='8'>*/} + {/*<Card title='机房容量统计'>*/} + {/*<div className='pine-pos'>*/} + {/*<Pine inspections={inspections} name='机房容量统计' id='roomChart'/>*/} + {/*<div className='pine-center'>*/} + {/*<p><em>-</em>台</p>*/} + {/*<p>可分配</p>*/} + {/*</div>*/} + {/*</div>*/} + {/*<div className='pine-text'>*/} + {/*<p><span>可用率:</span>:__%</p>*/} + {/*<p><span>总量:</span>:__</p>*/} + {/*<p><span>可用:</span>:__</p>*/} + {/*</div>*/} + {/*</Card>*/} + {/*</Col>*/} + {/*<Col span='8'>*/} + {/*<Card title='机架容量统计'>*/} + {/*<div className='pine-pos'>*/} + {/*<Pine inspections={inspections} name='机架容量统计' id='cabinetChart'/>*/} + {/*<div className='pine-center'>*/} + {/*<p><em>-</em>U</p>*/} + {/*<p>可用</p>*/} + {/*</div>*/} + {/*</div>*/} + {/*<div className='pine-text'>*/} + {/*<p><span>可用率:</span>:__%</p>*/} + {/*<p><span>总量:</span>:__</p>*/} + {/*<p><span>可用:</span>:__</p>*/} + {/*</div>*/} + {/*</Card>*/} + {/*</Col>*/} + {/*<Col span='8'>*/} + {/*<Card title='IP 容量统计'>*/} + {/*<div className='pine-pos'>*/} + {/*<Pine inspections={inspections} name='IP 容量统计' id='ipChart'/>*/} + {/*<div className='pine-center'>*/} + {/*<p><em>-</em>个</p>*/} + {/*<p>可用</p>*/} + {/*</div>*/} + {/*</div>*/} + {/*<div className='pine-text'>*/} + {/*<p><span>可用率:</span>:__%</p>*/} + {/*<p><span>总量:</span>:__</p>*/} + {/*<p><span>可用:</span>:__</p>*/} + {/*</div>*/} + {/*</Card>*/} + {/*</Col>*/} + {/*</Row>*/} + <Row> + <Card + title='近期巡检结果统计' + > + <RadioGroup onChange={this.onChange} defaultValue='latest_week'> + <RadioButton value='latest_week'>近一周</RadioButton> + <RadioButton value='latest_month'>近一月</RadioButton> + </RadioGroup> + <Line inspections={inspections} /> + </Card> + </Row> + </div> + </div> + ); + } +} + +function mapStateToProps(state) { + return { + userInfo: state.getIn([ 'global', 'userData' ]).toJS(), + data: state.get('homepage').toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/homepage/reducers/index.js b/cyclone-web/app/containers/homepage/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..97f2a5f0012b0f31dfe3f48e2b94278777125a4b --- /dev/null +++ b/cyclone-web/app/containers/homepage/reducers/index.js @@ -0,0 +1,25 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createRegularReducer } from 'utils/regular-reducer'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; + +const initialState = fromJS({ + devices: { + data: {}, + loading: true + }, + inspections: { + data: [], + loading: true + } +}); + +const reducer = handleActions( + { + ...createRegularReducer('homepage/inspections', 'inspections'), + ...createRegularReducer('homepage/devices', 'devices') + }, + initialState +); + +export default reducer; diff --git a/cyclone-web/app/containers/homepage/sagas/index.js b/cyclone-web/app/containers/homepage/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..bcfa951dfe586f88012e9a767868767efe965061 --- /dev/null +++ b/cyclone-web/app/containers/homepage/sagas/index.js @@ -0,0 +1,66 @@ +import { get, post, getWithArgs } from 'common/xFetch2'; +import { takeEvery } from 'redux-saga'; +import { call, put } from 'redux-saga/effects'; +import { notification } from 'antd'; +import { createTableSaga } from 'utils/table-saga'; + +let created = false; +function* empty() { + return; +} + +function* defaultSaga() { + const watchers = yield [ + takeEvery('homepage/devices/get', getDevices), + takeEvery('homepage/inspections/get', getInspections) + ]; +} + + +function* getInspections(action) { + try { + yield put({ + type: 'homepage/inspections/load' + }); + const res = yield call(getWithArgs, `/api/cloudboot/v1/devices/inspections/statistics`, { ...action.payload }); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + yield put({ + type: 'homepage/inspections/load/success', + payload: res.content.statistics + }); + } catch (error) { + console.log(error); + } +} + +function* getDevices(action) { + try { + yield put({ + type: 'homepage/devices/load' + }); + const res = yield call(get, '/api/cloudboot/v1/devices/installations/statistics'); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + yield put({ + type: 'homepage/devices/load/success', + payload: res.content + }); + } catch (error) { + console.log(error); + } +} + +/** + * Individual exports for testing + * @yield {[type]} [description] + */ +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [defaultSaga]; +} diff --git a/cyclone-web/app/containers/network/cidr/actions/batch-delete.jsx b/cyclone-web/app/containers/network/cidr/actions/batch-delete.jsx new file mode 100644 index 0000000000000000000000000000000000000000..f1fdc89ddc53f816810dc258d4552f4ecf7266e1 --- /dev/null +++ b/cyclone-web/app/containers/network/cidr/actions/batch-delete.jsx @@ -0,0 +1,25 @@ +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { del } from 'common/xFetch2'; + +export default function action(options) { + const onSubmit = () => { + del(`/api/cloudboot/v1/ip-networks`, { ids: options.records.map(it => it.id) }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + }); + }; + confirm({ + title: `确定要删除吗?`, + content: `共:${options.records.length} 条`, + okText: '确定', + okType: 'danger', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/network/cidr/actions/create-update.jsx b/cyclone-web/app/containers/network/cidr/actions/create-update.jsx new file mode 100644 index 0000000000000000000000000000000000000000..7af5fceb8daae966a5e4753649b87135c5e43664 --- /dev/null +++ b/cyclone-web/app/containers/network/cidr/actions/create-update.jsx @@ -0,0 +1,67 @@ +import React from 'react'; +import Popup from 'components/popup'; +import FormGenerator from 'components/idcos-form/FormGenerator'; +import { post, put } from 'common/xFetch2'; +import { notification } from 'antd'; +import { formSchema } from './formSchema'; + + +export default function action(options) { + const record = options.records; + const type = options.type; + + let initialValue = { ...record }; + + if (type === '_update') { + initialValue.server_room_id = record.server_room.id; + initialValue.idc_name = record.idc.name; + //switchs回显 + initialValue.switchs = (record.switchs || []).map(it => it.fixed_asset_number); + } + + const typeMap = { + _create: '新增IP网段', + _update: '编辑IP网段' + }; + + const onSubmit = (values) => { + + let method = post; + let url = '/api/cloudboot/v1/ip-networks'; + if (type === '_update') { + method = put; + url = `/api/cloudboot/v1/ip-networks/${record.id}`; + } + + method(url, values).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + Popup.close(); + options.reload(); + }); + }; + + Popup.open({ + title: `${typeMap[type]}`, + width: 700, + onCancel: () => { + Popup.close(); + }, + content: ( + <div> + <FormGenerator + initialValue={initialValue} + schema={formSchema(false, options, type)} + showCancel={true} + hideReset={true} + onSubmit={(values) => onSubmit(values)} + onCancel={() => { + Popup.close(); + }} + /> + </div> + ) + }); +} diff --git a/cyclone-web/app/containers/network/cidr/actions/delete.jsx b/cyclone-web/app/containers/network/cidr/actions/delete.jsx new file mode 100644 index 0000000000000000000000000000000000000000..a4f38de797fcfa2c412881036abc781d11934733 --- /dev/null +++ b/cyclone-web/app/containers/network/cidr/actions/delete.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { del } from 'common/xFetch2'; + +export default function action(options) { + const records = options.records; + const onSubmit = () => { + del(`/api/cloudboot/v1/ip-networks/${records.id}`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + }); + }; + confirm({ + title: `确定要删除吗?`, + content: `网段名称:${records.cidr}`, + okText: '确定', + okType: 'danger', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/network/cidr/actions/detail.jsx b/cyclone-web/app/containers/network/cidr/actions/detail.jsx new file mode 100644 index 0000000000000000000000000000000000000000..d89c19c9bc22e5e192ed5478c76bad09226c7fd5 --- /dev/null +++ b/cyclone-web/app/containers/network/cidr/actions/detail.jsx @@ -0,0 +1,54 @@ +import React from 'react'; +import Popup from 'components/popup/draw'; +import FormGenerator from 'components/idcos-form/FormGenerator'; +import { get } from 'common/xFetch2'; +import { formSchema } from './formSchema'; +import { notification } from 'antd'; + +export default async function action(options) { + const record = options.records; + const res = await get(`/api/cloudboot/v1/ip-networks/${record.id}`); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + let initialValue = { ...res.content }; + + //增加和修改属性 + initialValue.server_room_id = res.content.server_room.id; + initialValue.idc_name = res.content.idc.name; + + //查看详情的机房信息不加载机房列表(模拟) + const room = { + loading: false, + data: [initialValue.server_room] + }; + //覆盖交换机不加载设备列表 + const device = { + loading: false, + data: initialValue.switchs + }; + + //switchs回显 + initialValue.switchs = (res.content.switchs || []).map(it => it.fixed_asset_number); + + Popup.open({ + title: 'IP网段详情', + onCancel: () => { + Popup.close(); + }, + content: ( + <div> + <FormGenerator + initialValue={initialValue} + schema={formSchema(true, { room: room, device: device })} + showCancel={false} + hideReset={true} + showSubmit={false} + onCancel={() => { + Popup.close(); + }} + /> + </div> + ) + }); +} diff --git a/cyclone-web/app/containers/network/cidr/actions/formSchema.jsx b/cyclone-web/app/containers/network/cidr/actions/formSchema.jsx new file mode 100644 index 0000000000000000000000000000000000000000..0726747d557bf072aaa98f477de03ceda5348c35 --- /dev/null +++ b/cyclone-web/app/containers/network/cidr/actions/formSchema.jsx @@ -0,0 +1,183 @@ +import React from 'react'; +import { NET_STATUS, getSearchList } from 'common/enums'; +import { IP_NETWORK_CATEGORY, IP_VERSION } from "../../../../common/enums"; + +export const formSchema = (disabled, options, type) => { + let elements = [ + { + id: 'cidr', + name: 'cidr', + label: '网段名称', + type: 'TextInput', + disabled: disabled || type === '_update', + rules: [ + { + required: true, + message: '请填写网段名称' + } + ] + }, + { + id: 'server_room_id', + name: 'server_room_id', + label: '机房管理单元', + type: 'Select', + disabled: disabled || type === '_update', + rules: [ + { + required: true, + message: '请选择机房管理单元' + } + ], + options: !options.room.loading ? (options.room.data || []).map(it => { + return { + label: it.name, value: it.id, key: it.id + }; + }) : [] + }, + { + id: 'category', + name: 'category', + label: '网段类别', + type: 'Select', + disabled: disabled || type === '_update', + rules: [ + { + required: true, + message: '请选择网段类别' + } + ], + options: getSearchList(IP_NETWORK_CATEGORY) + }, + { + id: 'netmask', + name: 'netmask', + label: '掩码', + type: 'TextInput', + disabled: disabled || type === '_update', + rules: [ + { + required: true, + message: '请输入掩码' + } + ] + }, + { + id: 'gateway', + name: 'gateway', + label: '网关', + type: 'TextInput', + disabled: disabled || type === '_update', + rules: [ + { + required: true, + message: '请输入网关' + } + ] + }, + { + id: 'ip_pool', + name: 'ip_pool', + label: 'IP资源池', + type: 'TextInput', + disabled: disabled || type === '_update', + placeholder: '用,分隔', + rules: [ + { + required: true, + message: '请输入IP资源池' + } + ] + }, + { + id: 'pxe_pool', + name: 'pxe_pool', + label: 'PXE资源池', + type: 'TextInput', + placeholder: '用,分隔', + disabled: disabled || type === '_update', + rules: [ + { + message: '请输入PXE资源池' + } + ] + }, + { + id: 'switchs', + name: 'switchs', + label: '覆盖交换机', + type: 'Select', + mode: 'multiple', + disabled: disabled, + rules: [ + { + required: true, + message: '请输入覆盖交换机' + } + ], + options: !options.device.loading ? (options.device.data || []).map(it => { + return { + label: it.name + '(' + it.fixed_asset_number + ')', value: it.fixed_asset_number + }; + }) : [] + }, + { + id: 'vlan', + name: 'vlan', + label: 'VLAN', + type: 'TextInput', + disabled: disabled || type === '_update', + rules: [ + { + required: true, + message: '请输入VLAN' + } + ] + }, + { + id: 'version', + name: 'version', + label: 'IP版本', + type: 'Radios', + disabled: disabled || type === '_update', + rules: [ + { + required: true, + message: '请选择IP版本' + } + ], + radios: getSearchList(IP_VERSION) + } + ]; + //查看详情多加几个字段显示 + if (disabled) { + elements.unshift({ + id: 'idc_name', + name: 'idc_name', + label: '数据中心', + type: 'TextInput', + disabled: disabled + }); + elements.push( + { + id: 'created_at', + name: 'created_at', + label: '创建时间', + type: 'TextInput', + disabled: disabled + }, + { + id: 'updated_at', + name: 'updated_at', + label: '更新时间', + type: 'TextInput', + disabled: disabled + } + ); + } + return { + name: 'form', + id: 'form', + elements: elements + }; +}; diff --git a/cyclone-web/app/containers/network/cidr/actions/import.jsx b/cyclone-web/app/containers/network/cidr/actions/import.jsx new file mode 100644 index 0000000000000000000000000000000000000000..8f18d563dea6a21a1d3756ce2efa099e633ece66 --- /dev/null +++ b/cyclone-web/app/containers/network/cidr/actions/import.jsx @@ -0,0 +1,76 @@ +import React from 'react'; +import Popup from 'components/popup'; +import FileUpload from 'components/upload'; +import { IP_NETWORK_CATEGORY } from 'common/enums'; + +export default function action(options) { + const getColumns = () => { + return [ + { + title: '机房管理单元名称', + dataIndex: 'server_room_name' + }, + { + title: '网段名', + dataIndex: 'cidr' + }, + { + title: '类型', + dataIndex: 'category', + render: (text) => <span>{IP_NETWORK_CATEGORY[text]}</span> + }, + { + title: '掩码', + dataIndex: 'netmask' + }, + { + title: '网关', + dataIndex: 'gateway' + }, + { + title: 'IP池', + dataIndex: 'ip_pool' + }, + { + title: 'PXE-IP池', + dataIndex: 'pxe_pool' + }, + { + title: '覆盖交换机', + dataIndex: 'switchs' + }, + { + title: 'VLAN', + dataIndex: 'vlan' + }, + { + title: 'IP版本', + dataIndex: 'version' + }, + ]; + }; + + + Popup.open({ + title: '导入数据', + width: 1500, + onCancel: () => { + Popup.close(); + }, + content: ( + <FileUpload + importApi='/api/cloudboot/v1/ip-networks/imports' + uploadApi='/api/cloudboot/v1/ip-networks/upload' + previewApi='/api/cloudboot/v1/ip-networks/imports/previews' + getColumns={getColumns} + onSuccess={() => { + Popup.close(); + options.reload(); + }} + onCancel={() => { + Popup.close(); + }} + /> + ) + }); +} diff --git a/cyclone-web/app/containers/network/cidr/actions/index.js b/cyclone-web/app/containers/network/cidr/actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..edc2b6150178367777245ac7743c1d1673240273 --- /dev/null +++ b/cyclone-web/app/containers/network/cidr/actions/index.js @@ -0,0 +1,15 @@ +import _update from './create-update'; +import _create from './create-update'; +import _delete from './delete'; +import _batchdelete from './batch-delete'; +import detail from './detail'; +import _import from './import'; + +export default { + detail, + _update, + _delete, + _batchdelete, + _create, + _import, +}; diff --git a/cyclone-web/app/containers/network/cidr/components/search-form.jsx b/cyclone-web/app/containers/network/cidr/components/search-form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..1b6d318ea4b10773b81a478a0e30f956dc5e8dbc --- /dev/null +++ b/cyclone-web/app/containers/network/cidr/components/search-form.jsx @@ -0,0 +1,97 @@ +import React from 'react'; +import SearchForm from 'components/search-form'; +import { get } from 'common/xFetch2'; +import { notification } from 'antd'; +import { IP_NETWORK_CATEGORY, IP_NETWORK_STATUS,getSearchList } from 'common/enums'; + +export default class Search extends React.Component { + state = { + searchKeys: [ + { key: 'server_room_name', label: '机房管理单元' }, + { key: 'cidr', label: '网段名称' }, + { key: 'category', label: '网段类别' }, + { key: 'switches', label: '覆盖交换机固资编号' }, + { key: 'network_area_name', label: '网络区域' } + ], + searchValues: { + 'server_room_name': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'cidr': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'category': { type: 'checkbox', list: getSearchList(IP_NETWORK_CATEGORY) }, + 'switches': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'network_area_name': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' } + } + }; + + getList = (name) => { + const searchValues = this.state.searchValues; + get(`/api/cloudboot/v1/devices/query-params/${name}`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + const list = res.content.list || []; + if (list.length > 0) { + searchValues[name].list = list.map(it => { + if (it.id) { + return { + label: it.name, + value: it.id + }; + } else if (it.name) { + return { + label: it.name, + value: it.name + }; + } else { + return { + label: 'blank', + value: 'blank' + }; + } + }); + } + }); + }; + + //componentDidMount() { + // this.getList('switches'); + //} + + + UNSAFE_componentWillReceiveProps(props) { + const { room, networkArea } = props; + const searchValues = this.state.searchValues; + // if (!room.loading && room.loading !== this.props.room.loading) { + // searchValues['server_room_id'].list = (room.data || []).map(it => { + // return { + // label: it.name, value: it.id + // }; + // }); + // this.setState({ searchValues }); + // } + // if (!networkArea.loading && networkArea.loading !== this.props.networkArea.loading) { + // searchValues['network_area_id'].list = (networkArea.data || []).map(it => { + // return { + // label: it.name, value: it.id + // }; + // }); + // this.setState({ searchValues }); + // } + } + + onSearch = (values) => { + this.props.dispatch({ + type: 'network-cidr/table-data/search', + payload: { + ...values + } + }); + }; + + render() { + return ( + <SearchForm onSearch={this.onSearch} searchKeys={this.state.searchKeys} searchValues={this.state.searchValues} /> + ); + } +} + + diff --git a/cyclone-web/app/containers/network/cidr/components/table.jsx b/cyclone-web/app/containers/network/cidr/components/table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..e0a4a26e749850eb284a8ac734cbc11b0f59f405 --- /dev/null +++ b/cyclone-web/app/containers/network/cidr/components/table.jsx @@ -0,0 +1,257 @@ +import React from 'react'; +import { + Table, + Tooltip, + Icon, + Button, + Pagination, + notification, + Typography +} from 'antd'; +import actions from '../actions'; +import TableControlCell from 'components/TableControlCell'; +import { IP_NETWORK_CATEGORY, IP_VERSION } from 'common/enums'; +import { getPermissonBtn } from 'common/utils'; + + +class MyTable extends React.Component { + + reload = () => { + this.props.dispatch({ + type: 'network-cidr/table-data/reload' + }); + this.props.dispatch({ + type: 'network-cidr/table-data/set/selectedRows', + payload: { + selectedRows: [], + selectedRowKeys: [] + } + }); + }; + + //批量操作入口 + batchExecAction = (name) => { + const { tableData } = this.props; + const selectedRows = tableData.selectedRows || []; + if (selectedRows.length < 1) { + return notification.error({ message: '请至少选择一条数据' }); + } + this.execAction(name, selectedRows); + }; + + //操作入口 + execAction = (name, records) => { + if (actions[name]) { + actions[name]({ + records, + initialValue: records, + type: name, + room: this.props.room, + device: this.props.device, + reload: () => { + this.reload(); + } + }); + } + }; + + + getRowSelection = () => { + const selectedRowKeys = this.props.tableData.selectedRowKeys; + return { + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.props.dispatch({ + type: 'network-cidr/table-data/set/selectedRows', + payload: { + selectedRowKeys, + selectedRows + } + }); + } + }; + }; + + changePage = page => { + this.props.dispatch({ + type: `network-cidr/table-data/change-page`, + payload: { + page + } + }); + }; + + changePageSize = (page, pageSize) => { + this.props.dispatch({ + type: `network-cidr/table-data/change-page-size`, + payload: { + page, + pageSize + } + }); + }; + + + getColumns = () => { + return [ + { + title: '网段名称', + dataIndex: 'cidr', + render: (text, record) => <a onClick={() => this.execAction('detail', record)}>{text}</a> + }, + { + title: '网段掩码', + dataIndex: 'netmask' + }, + { + title: '网段网关', + dataIndex: 'gateway' + }, + { + title: 'IP资源池', + dataIndex: 'ip_pool', + render: (text) => <Tooltip placement="top" title={text}>{text}</Tooltip> + }, + { + title: 'PXE资源池', + dataIndex: 'pxe_pool', + render: (text) => <Tooltip placement="top" title={text}>{text}</Tooltip> + }, + { + title: '机房管理单元', + dataIndex: 'server_room', + render: (text, record) => <Tooltip placement="top" title={text.name}> + <a onClick={() => this.execAction('room_detail', { id: text.id })}> + {text.name} + </a> + </Tooltip> + }, + { + title: '网络区域', + dataIndex: 'network_area' + }, + { + title: '网段类别', + dataIndex: 'category', + render: (text) => <span>{IP_NETWORK_CATEGORY[text]}</span> + }, + { + title: '覆盖交换机', + dataIndex: 'switchs', + render: (text) => <Tooltip placement="top" title={(text || []).map(it => it.name + '(' + it.fixed_asset_number + ')').join('+')}> + {(text || []).map(it => it.fixed_asset_number).join('+')} + </Tooltip> + }, + { + title: 'VLAN', + dataIndex: 'vlan' + }, + { + title: 'IP版本', + dataIndex: 'version', + render: (text) => <span>{IP_VERSION[text]}</span> + }, + { + title: '操作', + dataIndex: 'operate', + width: 100, + render: (text, record) => { + const commands = [ + { + name: '编辑', + command: '_update', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_ip_network_update') + }, + { + name: '删除', + command: '_delete', + type: 'danger', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_ip_network_delete') + } + ]; + return ( + <TableControlCell + commands={commands} + record={record} + execCommand={command => { + this.execAction(command, record); + }} + /> + ); + } + } + ]; + }; + + //下载导入模板 + downloadImportTemplate = () => { + window.open('assets/files/network_segment_import.xlsx'); + }; + + render() { + const { tableData } = this.props; + const { loading, pagination } = tableData; + return ( + <div> + <div className='operate_btns'> + <Button + onClick={() => this.execAction('_create')} + type='primary' + style={{ marginRight: 8 }} + icon='plus' + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_ip_network_create')} + > + 新增 + </Button> + <span className='pull-right'> + <Button.Group style={{ marginRight: 8 }}> + <Button + onClick={() => this.downloadImportTemplate()} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_physical_machine_download')} + > + 下载导入模板 + </Button> + <Button + onClick={() => this.execAction('_import')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_physical_machine_import')} + > + 导入 + </Button> + <Button + onClick={() => this.batchExecAction('_batchdelete')} + type='danger' + style={{ marginLeft: 8 }} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_ip_network_delete')} + > + 删除 + </Button> + </Button.Group> + </span> + </div> + <div className='clearfix' /> + <Table + rowKey={'id'} + columns={this.getColumns()} + pagination={false} + dataSource={tableData.list} + rowSelection={this.getRowSelection()} + loading={loading} + /> + <div> + <Pagination + showTotal={(total) => `共 ${total} 条`} + showQuickJumper={true} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={this.changePageSize} + onChange={this.changePage} + /> + </div> + </div> + ); + } +} + +export default MyTable; diff --git a/cyclone-web/app/containers/network/cidr/get-component.js b/cyclone-web/app/containers/network/cidr/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..9ce75310fdf5a143f8490e50ca3cfab3daa11187 --- /dev/null +++ b/cyclone-web/app/containers/network/cidr/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('network-cidr', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/network/cidr/index.jsx b/cyclone-web/app/containers/network/cidr/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..ab728959e94925c878ee87918db3062d323fb9d9 --- /dev/null +++ b/cyclone-web/app/containers/network/cidr/index.jsx @@ -0,0 +1,62 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import SearchForm from './components/search-form'; +import Table from './components/table'; +import Layout from 'components/layout/page-layout'; + +class Container extends React.Component { + componentDidMount() { + this.props.dispatch({ + type: 'network-cidr/table-data/get' + }); + //查询机房信息 + this.props.dispatch({ + type: 'network-cidr/room/get' + }); + //查询网络区域 + this.props.dispatch({ + type: 'network-cidr/networkArea/get' + }); + //查询网络设备信息 + this.props.dispatch({ + type: 'network-cidr/device/get' + }); + } + + componentWillUnmount() { + this.props.dispatch({ + type: 'network-cidr/table-data/reset' + }); + } + + render() { + const { tableData, room, device, networkArea } = this.props.data; + return ( + <Layout title='IP网段管理'> + <SearchForm dispatch={this.props.dispatch} room={room} networkArea={networkArea} /> + <Table + dispatch={this.props.dispatch} + tableData={tableData} + userInfo={this.props.userInfo} + room={room} + device={device} + /> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + data: state.get('network-cidr').toJS(), + userInfo: state.getIn([ 'global', 'userData' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/network/cidr/reducers/index.js b/cyclone-web/app/containers/network/cidr/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..dee06f8f1c00b87dbd7ac496dd989f5404cd4e40 --- /dev/null +++ b/cyclone-web/app/containers/network/cidr/reducers/index.js @@ -0,0 +1,33 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; +import { createRegularReducer } from 'utils/regular-reducer'; + +const initialState = fromJS({ + tableData: createTableStore(), + room: { + loading: true, + data: [] + }, + networkArea: { + loading: true, + data: [] + }, + device: { + loading: true, + data: [] + } +}); + +const reducer = handleActions( + { + ...createTableReducer('network-cidr/table-data', 'tableData'), + ...createRegularReducer('network-cidr/room', 'room'), + ...createRegularReducer('network-cidr/networkArea', 'networkArea'), + ...createRegularReducer('network-cidr/device', 'device') + + }, + initialState, +); + +export default reducer; diff --git a/cyclone-web/app/containers/network/cidr/sagas/index.js b/cyclone-web/app/containers/network/cidr/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..7cceac4339ff5492515aab03ea618e3a66e8c77f --- /dev/null +++ b/cyclone-web/app/containers/network/cidr/sagas/index.js @@ -0,0 +1,35 @@ +import { getWithArgs } from 'common/xFetch2'; + +let created = false; +function* empty() { + yield; +} + +import { createTableListSaga } from 'utils/tableList-saga'; +const roomSaga = createTableListSaga({ + actionNamePrefix: 'network-cidr/room', + datasource: '/api/cloudboot/v1/server-rooms' +}); +const networkSaga = createTableListSaga({ + actionNamePrefix: 'network-cidr/networkArea', + datasource: '/api/cloudboot/v1/network-areas' +}); +const deviceSaga = createTableListSaga({ + actionNamePrefix: 'network-cidr/device', + datasource: '/api/cloudboot/v1/network/devices', + pageSize: 10000 +}); +import { createTableSaga } from 'utils/table-saga'; +const jobTableSaga = createTableSaga({ + actionNamePrefix: 'network-cidr/table-data', + tableDataPath: [ 'network-cidr', 'tableData' ], + datasource: '/api/cloudboot/v1/ip-networks' +}); + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [ jobTableSaga, roomSaga, networkSaga, deviceSaga ]; +} diff --git a/cyclone-web/app/containers/network/device/actions/batch-delete.jsx b/cyclone-web/app/containers/network/device/actions/batch-delete.jsx new file mode 100644 index 0000000000000000000000000000000000000000..56451ca9a29a7a3ab7eedaa432c109832f054ce1 --- /dev/null +++ b/cyclone-web/app/containers/network/device/actions/batch-delete.jsx @@ -0,0 +1,25 @@ +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { del } from 'common/xFetch2'; + +export default function action(options) { + const onSubmit = () => { + del(`/api/cloudboot/v1/network/devices`, { ids: options.records.map(it => it.id) }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + }); + }; + confirm({ + title: `确定要删除吗?`, + content: `共:${options.records.length} 条`, + okText: '确定', + okType: 'danger', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/network/device/actions/create-update.jsx b/cyclone-web/app/containers/network/device/actions/create-update.jsx new file mode 100644 index 0000000000000000000000000000000000000000..ab8ae2d2c17046709287033643eca5b0badc0816 --- /dev/null +++ b/cyclone-web/app/containers/network/device/actions/create-update.jsx @@ -0,0 +1,55 @@ +import React from 'react'; +import Popup from 'components/popup'; +import { post, put } from 'common/xFetch2'; +import { notification } from 'antd'; +import MyForm from './form'; + +export default function action(options) { + const record = options.records || {}; + const type = options.type; + const typeMap = { + _create: '新增网络设备信息', + _update: '编辑网络设备信息' + }; + + const onSubmit = (values) => { + + //若id=0,则新增。若id>0,则修改。 + // if (type === '_create') { + // values.id = 0; + // } else { + // values.id = record.id; + // } + + post('/api/cloudboot/v1/network/devices', values).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + Popup.close(); + options.reload(); + }); + }; + + Popup.open({ + title: `${typeMap[type]}`, + width: 700, + onCancel: () => { + Popup.close(); + }, + content: ( + <div> + <MyForm + type={options.type} + dispatch={options.dispatch} + idc={options.idc} + showSubmit={true} + onSubmit={(values) => onSubmit(values)} + onCancel={() => { + Popup.close(); + }} + /> + </div> + ) + }); +} diff --git a/cyclone-web/app/containers/network/device/actions/delete.jsx b/cyclone-web/app/containers/network/device/actions/delete.jsx new file mode 100644 index 0000000000000000000000000000000000000000..820c0d627a049147856584e2e322c4928f4dc742 --- /dev/null +++ b/cyclone-web/app/containers/network/device/actions/delete.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { del } from 'common/xFetch2'; + +export default function action(options) { + const records = options.records; + const onSubmit = () => { + del(`/api/cloudboot/v1/network/devices/${records.id}`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + }); + }; + confirm({ + title: `确定要删除吗?`, + content: `序列号:${records.sn}`, + okText: '确定', + okType: 'danger', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/network/device/actions/detail.jsx b/cyclone-web/app/containers/network/device/actions/detail.jsx new file mode 100644 index 0000000000000000000000000000000000000000..426a7331c9fde39d4b4bfc0facf61ca61201ce9b --- /dev/null +++ b/cyclone-web/app/containers/network/device/actions/detail.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import Popup from 'components/popup/draw'; +import MyForm from './form'; + +export default async function action(options) { + + Popup.open({ + title: '网络设备详情', + onCancel: () => { + Popup.close(); + }, + content: ( + <div> + <MyForm + type={options.type} + room={options.room} + cabinet={options.cabinet} + id={options.records.id} + showSubmit={false} + onCancel={() => { + Popup.close(); + }} + /> + </div> + ) + }); +} diff --git a/cyclone-web/app/containers/network/device/actions/form.jsx b/cyclone-web/app/containers/network/device/actions/form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..9e27cdf447fc03e82ebc4224044ca342e55014cb --- /dev/null +++ b/cyclone-web/app/containers/network/device/actions/form.jsx @@ -0,0 +1,334 @@ +import React from 'react'; +import { getWithArgs } from 'common/xFetch2'; +import { + Form, + Button, + notification, + Input, + Select +} from 'antd'; +const FormItem = Form.Item; +import { formItemLayout, tailFormItemLayout } from 'common/enums'; +import { getSearchList, NETWORK_DEVICE_TYPE, NETWORK_DEVICE_STATUS} from "common/enums"; +const Option = Select.Option; +import { get } from 'common/xFetch2'; + +class MyForm extends React.Component { + constructor(props) { + super(props); + this.state = { + initialValue: {}, + cabinet: [], + room: [] + }; + } + + handleSubmit = ev => { + ev && ev.preventDefault(); + ev && ev.stopPropagation(); + this.props.form.validateFields((error, values) => { + if (error) { + notification.warning({ + message: '还有未填写完整的选项' + }); + return; + } + this.props.onSubmit(values); + }); + }; + + componentDidMount() { + const { type, id } = this.props; + if (type === '_detail' || type === '_update') { + get(`/api/cloudboot/v1/network/devices/${id}`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + const content = res.content || {}; + this.setState({ + initialValue: { + ...content, + idc_name: content.idc.name, + server_cabinet_id: content.server_cabinet.id, + server_room_id: content.server_room.id + }, + //机架库机房库 + cabinet: [content.server_cabinet], + room: [content.server_room] + }); + }); + } + } + + + //选择数据中心,获取机房列表 + getRoom = (v) => { + getWithArgs('/api/cloudboot/v1/server-rooms', { page: 1, page_size: 100, idc_id: v }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + this.setState({ + room: res.content.records + }); + + //清空已选机房的值 + const { setFieldsValue, getFieldValue } = this.props.form; + const room = getFieldValue('server_room_id'); + if (room) { + setFieldsValue({ server_room_id: null }); + } + //清空已选机架的值 + const cabinet = getFieldValue('server_cabinet_id'); + if (cabinet) { + setFieldsValue({ server_cabinet_id: null }); + } + }); + }; + + //选择机房获取机架列表 + getCabinet = (v) => { + getWithArgs('/api/cloudboot/v1/server-cabinets', { page: 1, page_size: 1000, server_room_id: v }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + this.setState({ + cabinet: res.content.records + }); + + //清空已选机架的值 + const { setFieldsValue, getFieldValue } = this.props.form; + const cabinet = getFieldValue('server_cabinet_id'); + if (cabinet) { + setFieldsValue({ server_cabinet_id: null }); + } + }); + }; + + render() { + const { idc, showSubmit } = this.props; + const { initialValue } = this.state; + const { getFieldDecorator } = this.props.form; + + return ( + <div> + <Form onSubmit={this.handleSubmit}> + { + showSubmit ? + <FormItem {...formItemLayout} label='数据中心' > + {getFieldDecorator('idc_id', { + initialValue: initialValue.idc_id, + rules: [ + { + required: true, + message: '请选择数据中心' + } + ] + })(<Select disabled={!showSubmit} onChange={(value) => this.getRoom(value)}> + { + !idc.loading && + idc.data.map((os, index) => <Option value={os.id} key={os.id}>{os.name}</Option>) + } + </Select>)} + </FormItem> : + <FormItem {...formItemLayout} label='数据中心' > + {getFieldDecorator('idc_name', { + initialValue: initialValue.idc_name, + rules: [ + { + required: true, + message: '请选择数据中心' + } + ] + })(<Input disabled={!showSubmit}/>)} + </FormItem> + } + <FormItem {...formItemLayout} label='机房管理单元' > + {getFieldDecorator('server_room_id', { + initialValue: initialValue.server_room_id, + rules: [ + { + required: true, + message: '请选择所属机房' + } + ] + })(<Select disabled={!showSubmit} onChange={(value) => this.getCabinet(value)}> + { + this.state.room.map((os, index) => <Option value={os.id} key={os.id}>{os.name}</Option>) + } + </Select>)} + </FormItem> + <FormItem {...formItemLayout} label='机架编号' > + {getFieldDecorator('server_cabinet_id', { + initialValue: initialValue.server_cabinet_id, + rules: [ + { + required: true, + message: '请选择所属机架' + } + ] + })(<Select disabled={!showSubmit}> + { + this.state.cabinet.map((os, index) => <Option value={os.id} key={os.id}>{os.number}</Option>) + } + </Select>)} + </FormItem> + <FormItem {...formItemLayout} label='固资编号' > + {getFieldDecorator('fixed_asset_number', { + initialValue: initialValue.fixed_asset_number, + rules: [ + { + required: true, + message: '请填写固资编号' + } + ] + })(<Input disabled={!showSubmit} />)} + </FormItem> + <FormItem {...formItemLayout} label='序列号' > + {getFieldDecorator('sn', { + initialValue: initialValue.sn, + rules: [ + { + required: true, + message: '请输入序列号' + } + ] + })( + <Input disabled={!showSubmit} /> + )} + </FormItem> + <FormItem {...formItemLayout} label='名称' > + {getFieldDecorator('name', { + initialValue: initialValue.name, + rules: [ + { + required: true, + message: '请输入名称' + } + ] + })(<Input disabled={!showSubmit} />)} + </FormItem> + <FormItem {...formItemLayout} label='产品型号' > + {getFieldDecorator('model', { + initialValue: initialValue.model, + rules: [ + { + required: true, + message: '请输入产品型号' + } + ] + })(<Input disabled={!showSubmit} />)} + </FormItem> + <FormItem {...formItemLayout} label='厂商' > + {getFieldDecorator('vendor', { + initialValue: initialValue.vendor, + rules: [ + { + required: true, + message: '请输入厂商' + } + ] + })(<Input disabled={!showSubmit} />)} + </FormItem> + <FormItem {...formItemLayout} label='TOR' > + {getFieldDecorator('tor', { + initialValue: initialValue.tor, + rules: [ + { + required: true, + message: '请输入TOR' + } + ] + })(<Input disabled={!showSubmit} />)} + </FormItem> + <FormItem {...formItemLayout} label='操作系统' > + {getFieldDecorator('os', { + initialValue: initialValue.os, + rules: [ + { + required: true, + message: '请输入操作系统' + } + ] + })(<Input disabled={!showSubmit} />)} + </FormItem> + <FormItem {...formItemLayout} label='类型' > + {getFieldDecorator('type', { + initialValue: initialValue.type, + rules: [ + { + required: true, + message: '请选择类型' + } + ] + })(<Select disabled={!showSubmit}> + { + getSearchList(NETWORK_DEVICE_TYPE).map((it) => <Option value={it.value} key={it.value}>{it.label}</Option>) + } + </Select>)} + </FormItem> + <FormItem {...formItemLayout} label='用途' > + {getFieldDecorator('usage', { + initialValue: initialValue.usage, + rules: [ + { + required: true, + message: '请输入用途' + } + ] + })(<Input disabled={!showSubmit} />)} + </FormItem> + <FormItem {...formItemLayout} label='状态' > + {getFieldDecorator('status', { + initialValue: initialValue.status, + rules: [ + { + required: true, + message: '请输入状态' + } + ] + })( + <Select disabled={!showSubmit}> + { + getSearchList(NETWORK_DEVICE_STATUS).map((it) => <Option value={it.value} key={it.value}>{it.label}</Option>) + } + </Select> + )} + </FormItem> + { + !showSubmit && + <FormItem {...formItemLayout} label='创建时间' > + {getFieldDecorator('created_at', { + initialValue: initialValue.created_at + })(<Input disabled={!showSubmit} />)} + </FormItem> + } + { + !showSubmit && + <FormItem {...formItemLayout} label='更新时间' > + {getFieldDecorator('updated_at', { + initialValue: initialValue.updated_at + })(<Input disabled={!showSubmit}/>)} + </FormItem> + } + <FormItem {...tailFormItemLayout}> + <div className='pull-right'> + <Button onClick={() => this.props.onCancel()}>取消</Button> + { + showSubmit && + <Button + style={{ marginLeft: 8 }} + type='primary' + htmlType='submit' + > + 提交 + </Button> + } + </div> + </FormItem> + </Form> + </div> + ); + } +} + +export default Form.create()(MyForm); diff --git a/cyclone-web/app/containers/network/device/actions/import.jsx b/cyclone-web/app/containers/network/device/actions/import.jsx new file mode 100644 index 0000000000000000000000000000000000000000..235655a3a94fa402693a84019c2f6df6d924e72c --- /dev/null +++ b/cyclone-web/app/containers/network/device/actions/import.jsx @@ -0,0 +1,83 @@ +import React from 'react'; +import Popup from 'components/popup'; +import FileUpload from 'components/upload'; + +export default function action(options) { + const getColumns = () => { + return [ + { + title: '数据中心', + dataIndex: 'idc_name' + }, + { + title: '机房管理单元', + dataIndex: 'server_room_name' + }, + { + title: '机架编号', + dataIndex: 'server_cabinet_number' + }, + { + title: '固资编号', + dataIndex: 'fixed_asset_number' + }, + { + title: '序列号SN', + dataIndex: 'sn' + }, + { + title: '设备名称', + dataIndex: 'name' + }, + { + title: '型号', + dataIndex: 'model' + }, + { + title: '厂商', + dataIndex: 'vendor' + }, + { + title: '操作系统', + dataIndex: 'os' + }, + { + title: '类型', + dataIndex: 'type' + }, + { + title: 'TOR', + dataIndex: 'tor' + }, + { + title: '用途', + dataIndex: 'usage' + } + + ]; + }; + + + Popup.open({ + title: '导入数据', + width: 1500, + onCancel: () => { + Popup.close(); + }, + content: ( + <FileUpload + importApi='/api/cloudboot/v1/network/devices/imports' + uploadApi='/api/cloudboot/v1/network/devices/upload' + previewApi='/api/cloudboot/v1/network/devices/imports/previews' + getColumns={getColumns} + onSuccess={() => { + Popup.close(); + options.reload(); + }} + onCancel={() => { + Popup.close(); + }} + /> + ) + }); +} diff --git a/cyclone-web/app/containers/network/device/actions/index.js b/cyclone-web/app/containers/network/device/actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..837a3840e861d13e7a655539b8e109ed07fb082a --- /dev/null +++ b/cyclone-web/app/containers/network/device/actions/index.js @@ -0,0 +1,14 @@ +import _delete from './delete'; +import _batchdelete from './batch-delete'; +import _create from './create-update'; +import _detail from './detail'; +import _import from './import'; + + +export default { + _delete, + _batchdelete, + _create, + _detail, + _import, +}; diff --git a/cyclone-web/app/containers/network/device/components/search-form.jsx b/cyclone-web/app/containers/network/device/components/search-form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..c0119ead59a9d835c70e6ae1bed7fd0a0eabae4b --- /dev/null +++ b/cyclone-web/app/containers/network/device/components/search-form.jsx @@ -0,0 +1,69 @@ +import React from 'react'; +import SearchForm from 'components/search-form'; + + +export default class Search extends React.Component { + state = { + searchKeys: [ + { key: 'fixed_asset_number', label: '固资编号' }, + { key: 'sn', label: '序列号' }, + { key: 'name', label: '名称' }, + { key: 'idc_id', label: '数据中心' }, + { key: 'server_cabinet_number', label: '机架编号' }, + { key: 'server_room_name', label: '机房管理单元' }, + { key: 'tor', label: 'TOR' }, + { key: 'model', label: '产品型号' }, + { key: 'vendor', label: '厂商' }, + { key: 'os', label: '操作系统' }, + { key: 'usage', label: '用途' }, + { key: 'status', label: '状态' } + ], + searchValues: { + 'fixed_asset_number': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'sn': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'name': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'idc_id': { type: 'checkbox', list: [] }, + 'server_cabinet_number': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'server_room_name': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'tor': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'model': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'vendor': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'os': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'usage': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'status': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' } + } + }; + + UNSAFE_componentWillReceiveProps(props) { + const { idc, room } = props; + const searchValues = this.state.searchValues; + if (!idc.loading && idc.loading !== this.props.idc.loading) { + searchValues['idc_id'].list = (idc.data || []).map(it => { + return { + label: it.name, value: it.id + }; + }); + this.setState({ searchValues }); + } + } + + onSearch = (values) => { + if (values.tor && values.tor.indexOf('+') != -1) { + values.tor = encodeURIComponent(values.tor); + } + this.props.dispatch({ + type: 'network-device/table-data/search', + payload: { + ...values + } + }); + }; + + render() { + return ( + <SearchForm onSearch={this.onSearch} searchKeys={this.state.searchKeys} searchValues={this.state.searchValues}/> + ); + } +} + + diff --git a/cyclone-web/app/containers/network/device/components/table.jsx b/cyclone-web/app/containers/network/device/components/table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..e4a8c5cb0f421c0ce8af2b0da6dbeb534e20ba5a --- /dev/null +++ b/cyclone-web/app/containers/network/device/components/table.jsx @@ -0,0 +1,258 @@ +import React from 'react'; +import { + Table, + Tooltip, + Icon, + Pagination, + Button, + Form, +} from 'antd'; +import actions from '../actions'; +import TableControlCell from 'components/TableControlCell'; +import { renderDisplayMore } from 'common/utils'; +import { getPermissonBtn } from 'common/utils'; + + +const FormItem = Form.Item; + +const plainOptions = [ + { value: 'idc.name', name: '数据中心' }, + { value: 'os', name: '操作系统' }, + { value: 'vendor', name: '厂商' }, + { value: 'model', name: '型号' }, + { value: 'type', name: '类型' }, +]; + +class MyTable extends React.Component { + state = { + checkedList: [], + indeterminate: false, + checkAll: false + }; + reload = () => { + this.props.dispatch({ + type: 'network-device/table-data/reload' + }); + this.props.dispatch({ + type: 'network-device/table-data/set/selectedRows', + payload: { + selectedRows: [], + selectedRowKeys: [] + } + }); + }; + + //批量操作入口 + batchExecAction = (name) => { + const { tableData } = this.props; + const selectedRows = tableData.selectedRows || []; + if (selectedRows.length < 1) { + return notification.error({ message: '请至少选择一条数据' }); + } + this.execAction(name, selectedRows); + }; + + //操作入口 + execAction = (name, records) => { + if (actions[name]) { + actions[name]({ + records, + initialValue: records, + idc: this.props.idc, + type: name, + reload: () => { + this.reload(); + } + }); + } + }; + + getRowSelection = () => { + const selectedRowKeys = this.props.tableData.selectedRowKeys; + return { + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.props.dispatch({ + type: 'network-device/table-data/set/selectedRows', + payload: { + selectedRowKeys, + selectedRows + } + }); + } + }; + }; + + changePage = page => { + this.props.dispatch({ + type: `network-device/table-data/change-page`, + payload: { + page + } + }); + }; + + changePageSize = (page, pageSize) => { + this.props.dispatch({ + type: `network-device/table-data/change-page-size`, + payload: { + page, + pageSize + } + }); + }; + + getColumns = () => { + const columns = [ + { + title: '固资编号', + dataIndex: 'fixed_asset_number' + }, + { + title: '序列号', + dataIndex: 'sn', + render: (text, record) => <a onClick={() => this.execAction('_detail', record)}>{text}</a> + }, + { + title: '名称', + dataIndex: 'name', + render: (name) => <Tooltip placement="topLeft" title={name}>{name}</Tooltip> + }, + { + title: '机房管理单元', + dataIndex: 'server_room', + render: (text, record) => <Tooltip placement="top" title={text.name}> + <a onClick={() => this.execAction('room_detail', { id: text.id })}> + {text.name} + </a> + </Tooltip> + }, + { + title: '机架编号', + dataIndex: 'server_cabinet', + render: (text, record) => <a onClick={() => this.execAction('cabinet_detail', { id: text.id })}>{text.number}</a> + }, + { + title: '用途', + dataIndex: 'usage' + }, + { + title: '状态', + dataIndex: 'status' + }, + { + title: 'TOR', + dataIndex: 'tor', + render: (text) => <Tooltip placement="top" title={text}>{text}</Tooltip> + }, + { + title: '操作', + dataIndex: 'operate', + width: 80, + render: (text, record) => { + const commands = [ + { + name: '删除', + command: '_delete', + type: 'danger', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_network_device_delete') + } + ]; + return ( + <TableControlCell + commands={commands} + record={record} + execCommand={command => { + this.execAction(command, record); + }} + /> + ); + } + } + ]; + if (this.state.checkedList.length > 0) { + this.state.checkedList.forEach(data => { + columns.push({ + title: data.name, + dataIndex: data.value + }); + }); + } + return columns; + }; + + //下载导入模板 + downloadImportTemplate = () => { + window.open('assets/files/network_device_import.xlsx'); + }; + + render() { + const { tableData } = this.props; + const { loading, pagination } = tableData; + + return ( + <div> + <div className='operate_btns'> + <Button + onClick={() => this.execAction('_create')} + type='primary' + icon='plus' + style={{ marginRight: 8 }} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_network_device_create')} + > + 新增 + </Button> + <span className='pull-right'> + <Button.Group style={{ marginRight: 8 }}> + <Button + onClick={() => this.downloadImportTemplate()} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_physical_machine_download')} + > + 下载导入模板 + </Button> + <Button + onClick={() => this.execAction('_import')} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_physical_machine_import')} + > + 导入 + </Button> + <Button + onClick={() => this.batchExecAction('_batchdelete')} + type='danger' + style={{ marginLeft: 8 }} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_network_device_delete')} + > + 删除 + </Button> + </Button.Group> + {renderDisplayMore(this, plainOptions)} + </span> + </div> + + <div className='clearfix' /> + <Table + rowKey={'id'} + columns={this.getColumns()} + pagination={false} + dataSource={tableData.list} + rowSelection={this.getRowSelection()} + loading={loading} + /> + <div> + <Pagination + showTotal={(total) => `共 ${total} 条`} + showQuickJumper={true} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={this.changePageSize} + onChange={this.changePage} + /> + </div> + </div> + ); + } +} + +export default MyTable; diff --git a/cyclone-web/app/containers/network/device/get-component.js b/cyclone-web/app/containers/network/device/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..92375ccd3eb3853f03f57eefeb7fd7e82b75fc0f --- /dev/null +++ b/cyclone-web/app/containers/network/device/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('network-device', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/network/device/index.jsx b/cyclone-web/app/containers/network/device/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..a6e54f0495db5db615deef5c20e416522c8af44c --- /dev/null +++ b/cyclone-web/app/containers/network/device/index.jsx @@ -0,0 +1,55 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import SearchForm from './components/search-form'; +import Table from './components/table'; +import Layout from 'components/layout/page-layout'; + +class Container extends React.Component { + componentDidMount() { + this.props.dispatch({ + type: 'network-device/table-data/get' + }); + this.props.dispatch({ + type: 'network-device/idc/get' + }); + this.props.dispatch({ + type: 'network-device/room/get' + }); + } + + componentWillUnmount() { + this.props.dispatch({ + type: 'network-device/table-data/reset' + }); + } + + render() { + const { tableData, idc, room } = this.props.data; + return ( + <Layout title='网络设备管理'> + <SearchForm dispatch={this.props.dispatch} idc={idc} room={room}/> + <Table + dispatch={this.props.dispatch} + tableData={tableData} + userInfo={this.props.userInfo} + idc={idc} + /> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + data: state.get('network-device').toJS(), + userInfo: state.getIn([ 'global', 'userData' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/network/device/reducers/index.js b/cyclone-web/app/containers/network/device/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..06198c32890784e9e2426c0259e43dcaa465644f --- /dev/null +++ b/cyclone-web/app/containers/network/device/reducers/index.js @@ -0,0 +1,27 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; +import { createRegularReducer } from 'utils/regular-reducer'; + +const initialState = fromJS({ + tableData: createTableStore(), + idc: { + loading: true, + data: [] + }, + room: { + loading: true, + data: [] + } +}); + +const reducer = handleActions( + { + ...createTableReducer('network-device/table-data', 'tableData'), + ...createRegularReducer('network-device/idc', 'idc'), + ...createRegularReducer('network-device/room', 'room') + }, + initialState, +); + +export default reducer; diff --git a/cyclone-web/app/containers/network/device/sagas/index.js b/cyclone-web/app/containers/network/device/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..3be24b7b816941326eccdf2672b03f9008f721a7 --- /dev/null +++ b/cyclone-web/app/containers/network/device/sagas/index.js @@ -0,0 +1,31 @@ +import { getWithArgs } from 'common/xFetch2'; + +let created = false; +function* empty() { + yield; +} +import { createTableListSaga } from 'utils/tableList-saga'; +const idcSaga = createTableListSaga({ + actionNamePrefix: 'network-device/idc', + datasource: '/api/cloudboot/v1/idcs' +}); +const roomSaga = createTableListSaga({ + actionNamePrefix: 'network-device/room', + datasource: '/api/cloudboot/v1/server-rooms' +}); + + +import { createTableSaga } from 'utils/table-saga'; +const jobTableSaga = createTableSaga({ + actionNamePrefix: 'network-device/table-data', + tableDataPath: [ 'network-device', 'tableData' ], + datasource: '/api/cloudboot/v1/network/devices' +}); + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [ jobTableSaga, idcSaga, roomSaga ]; +} diff --git a/cyclone-web/app/containers/network/ips/actions/assign.jsx b/cyclone-web/app/containers/network/ips/actions/assign.jsx new file mode 100644 index 0000000000000000000000000000000000000000..d1a1270fc20ed553c2ca564baad088cc43863f8e --- /dev/null +++ b/cyclone-web/app/containers/network/ips/actions/assign.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import Popup from 'components/popup'; +import Task from './components/index'; + +export default function action(options) { + + Popup.open({ + title: '分配IP', + width: 1000, + onCancel: () => { + Popup.close(); + }, + content: ( + <Task + id={options.initialValue[0].id} + initialValue={options.initialValue[0]} + onCancel={() => { + Popup.close(); + }} + onSuccess={() => { + Popup.close(); + options.reload(); + }} + /> + ) + }); +} diff --git a/cyclone-web/app/containers/network/ips/actions/assignipv4.jsx b/cyclone-web/app/containers/network/ips/actions/assignipv4.jsx new file mode 100644 index 0000000000000000000000000000000000000000..d2c5c6038f59c6bbeaec7e01edbe53b2944e6359 --- /dev/null +++ b/cyclone-web/app/containers/network/ips/actions/assignipv4.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import Popup from 'components/popup'; +import Task from './components/assign-ipv4'; + +export default function action(options) { + + Popup.open({ + title: '为选定设备分配一个IPv4地址', + width: 1000, + onCancel: () => { + Popup.close(); + }, + content: ( + <Task + //id={options.initialValue[0].id} + //initialValue={options.initialValue[0]} + onCancel={() => { + Popup.close(); + }} + onSuccess={() => { + Popup.close(); + options.reload(); + }} + /> + ) + }); +} diff --git a/cyclone-web/app/containers/network/ips/actions/assignipv6.jsx b/cyclone-web/app/containers/network/ips/actions/assignipv6.jsx new file mode 100644 index 0000000000000000000000000000000000000000..0e51979d0e334aa16aca4b6b1d69c5b600c6e41b --- /dev/null +++ b/cyclone-web/app/containers/network/ips/actions/assignipv6.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import Popup from 'components/popup'; +import Task from './components/assign-ipv6'; + +export default function action(options) { + + Popup.open({ + title: '为选定设备分配一个IPv6地址', + width: 1000, + onCancel: () => { + Popup.close(); + }, + content: ( + <Task + //id={options.initialValue[0].id} + //initialValue={options.initialValue[0]} + onCancel={() => { + Popup.close(); + }} + onSuccess={() => { + Popup.close(); + options.reload(); + }} + /> + ) + }); +} diff --git a/cyclone-web/app/containers/network/ips/actions/components/assign-ipv4.jsx b/cyclone-web/app/containers/network/ips/actions/components/assign-ipv4.jsx new file mode 100644 index 0000000000000000000000000000000000000000..9cacd2bbd76eaeacea940e28db3a32210020fa51 --- /dev/null +++ b/cyclone-web/app/containers/network/ips/actions/components/assign-ipv4.jsx @@ -0,0 +1,102 @@ +import React from 'react'; +import { Form, Radio, Button, notification } from 'antd'; +const FormItem = Form.Item; +const RadioGroup = Radio.Group; +import DeviceTable from 'containers/device/common/device'; +import { put } from 'common/xFetch2'; +import { NETWORK_IPS_SCOPE, getSearchList } from "common/enums"; + +export const formItemLayout = { + labelCol: { + xs: { span: 24 }, + sm: { span: 3 } + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 20 } + } +}; +export const tailFormItemLayout = { + wrapperCol: { + xs: { + span: 24, + offset: 0 + }, + sm: { + span: 11, + offset: 12 + } + } +}; +class AssignIPv4Form extends React.Component { + handleSubmit = (e) => { + e.preventDefault(); + this.props.form.validateFields((err, values) => { + if (err) { + return notification.error({ message: '还有未填写的项' }); + } + const sn = values.sn ? values.sn[0].sn : ''; + put('/api/cloudboot/v1/ips/assignsv4', { sn: sn, scope: values.scope }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + this.props.onSuccess(); + }); + }); + }; + + render() { + const { getFieldDecorator } = this.props.form; + //const ip_network = this.props.initialValue.ip_network || {}; + //const scope = ip_network.category.indexOf('intranet') > -1 ? 'intranet' : 'extranet'; + return ( + <Form onSubmit={this.handleSubmit}> + <FormItem + {...formItemLayout} + label='IP作用范围' + > + {getFieldDecorator('scope', { + rules: [{ + required: true, message: '请选择内外网' + }] + })( + <RadioGroup> + {getSearchList(NETWORK_IPS_SCOPE).map(it => <Radio value={it.value}>{it.label}</Radio>)} + </RadioGroup> + )} + </FormItem> + <FormItem + {...formItemLayout} + label='关联设备' + > + {getFieldDecorator('sn', { + rules: [{ + required: true, message: '请选择关联设备' + }] + })( + <DeviceTable checkType='radio' hideButton={true} form={this.props.form} /> + )} + </FormItem> + <FormItem + {...tailFormItemLayout} + > + <div className='pull-right'> + <Button onClick={() => this.props.onCancel()}>取消</Button> + <Button + style={{ marginLeft: 8 }} + type='primary' + htmlType='submit' + > + 确定 + </Button> + </div> + </FormItem> + </Form> + ); + } +} + +const WrappedAssignIPv4Form = Form.create()(AssignIPv4Form); + +export default WrappedAssignIPv4Form; diff --git a/cyclone-web/app/containers/network/ips/actions/components/assign-ipv6.jsx b/cyclone-web/app/containers/network/ips/actions/components/assign-ipv6.jsx new file mode 100644 index 0000000000000000000000000000000000000000..30367bb07d0d6884185e8c8c9ee03ebb10937ace --- /dev/null +++ b/cyclone-web/app/containers/network/ips/actions/components/assign-ipv6.jsx @@ -0,0 +1,102 @@ +import React from 'react'; +import { Form, Radio, Button, notification } from 'antd'; +const FormItem = Form.Item; +const RadioGroup = Radio.Group; +import DeviceTable from 'containers/device/common/device'; +import { put } from 'common/xFetch2'; +import { NETWORK_IPS_SCOPE, getSearchList } from "common/enums"; + +export const formItemLayout = { + labelCol: { + xs: { span: 24 }, + sm: { span: 3 } + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 20 } + } +}; +export const tailFormItemLayout = { + wrapperCol: { + xs: { + span: 24, + offset: 0 + }, + sm: { + span: 11, + offset: 12 + } + } +}; +class AssignIPv6Form extends React.Component { + handleSubmit = (e) => { + e.preventDefault(); + this.props.form.validateFields((err, values) => { + if (err) { + return notification.error({ message: '还有未填写的项' }); + } + const sn = values.sn ? values.sn[0].sn : ''; + put('/api/cloudboot/v1/ips/assignsv6', { sn: sn, scope: values.scope }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + this.props.onSuccess(); + }); + }); + }; + + render() { + const { getFieldDecorator } = this.props.form; + //const ip_network = this.props.initialValue.ip_network || {}; + //const scope = ip_network.category.indexOf('intranet') > -1 ? 'intranet' : 'extranet'; + return ( + <Form onSubmit={this.handleSubmit}> + <FormItem + {...formItemLayout} + label='IP作用范围' + > + {getFieldDecorator('scope', { + rules: [{ + required: true, message: '请选择内外网' + }] + })( + <RadioGroup> + {getSearchList(NETWORK_IPS_SCOPE).map(it => <Radio value={it.value}>{it.label}</Radio>)} + </RadioGroup> + )} + </FormItem> + <FormItem + {...formItemLayout} + label='关联设备' + > + {getFieldDecorator('sn', { + rules: [{ + required: true, message: '请选择关联设备' + }] + })( + <DeviceTable checkType='radio' hideButton={true} form={this.props.form} /> + )} + </FormItem> + <FormItem + {...tailFormItemLayout} + > + <div className='pull-right'> + <Button onClick={() => this.props.onCancel()}>取消</Button> + <Button + style={{ marginLeft: 8 }} + type='primary' + htmlType='submit' + > + 确定 + </Button> + </div> + </FormItem> + </Form> + ); + } +} + +const WrappedAssignIPv6Form = Form.create()(AssignIPv6Form); + +export default WrappedAssignIPv6Form; diff --git a/cyclone-web/app/containers/network/ips/actions/components/index.jsx b/cyclone-web/app/containers/network/ips/actions/components/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..d8d9d49b3a10e35f51145e858fce953640f3f4ea --- /dev/null +++ b/cyclone-web/app/containers/network/ips/actions/components/index.jsx @@ -0,0 +1,100 @@ +import React from 'react'; +import { Form, Radio, Button, notification } from 'antd'; +const FormItem = Form.Item; +const RadioGroup = Radio.Group; +import DeviceTable from 'containers/device/common/device'; +import { put } from 'common/xFetch2'; +import { NETWORK_IPS_SCOPE, getSearchList } from "common/enums"; + +export const formItemLayout = { + labelCol: { + xs: { span: 24 }, + sm: { span: 3 } + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 20 } + } +}; +export const tailFormItemLayout = { + wrapperCol: { + xs: { + span: 24, + offset: 0 + }, + sm: { + span: 11, + offset: 12 + } + } +}; +class RegistrationForm extends React.Component { + handleSubmit = (e) => { + e.preventDefault(); + this.props.form.validateFields((err, values) => { + if (err) { + return notification.error({ message: '还有未填写的项' }); + } + const sn = values.sn ? values.sn[0].sn : ''; + put('/api/cloudboot/v1/ips/assigns', { sn: sn, scope: values.scope, id: this.props.id }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + this.props.onSuccess(); + }); + }); + }; + + render() { + const { getFieldDecorator } = this.props.form; + const ip_network = this.props.initialValue.ip_network || {}; + const scope = ip_network.category.indexOf('intranet') > -1 ? 'intranet' : 'extranet'; + return ( + <Form onSubmit={this.handleSubmit}> + <FormItem + {...formItemLayout} + label='IP作用范围' + > + {getFieldDecorator('scope', { + initialValue: scope + })( + <RadioGroup disabled={true}> + {getSearchList(NETWORK_IPS_SCOPE).map(it => <Radio value={it.value}>{it.label}</Radio>)} + </RadioGroup> + )} + </FormItem> + <FormItem + {...formItemLayout} + label='关联设备' + > + {getFieldDecorator('sn', { + rules: [{ + required: true, message: '请选择关联设备' + }] + })( + <DeviceTable checkType='radio' hideButton={true} form={this.props.form} /> + )} + </FormItem> + <FormItem + {...tailFormItemLayout} + > + <div className='pull-right'> + <Button onClick={() => this.props.onCancel()}>取消</Button> + <Button + style={{ marginLeft: 8 }} + type='primary' + htmlType='submit' + > + 确定 + </Button> + </div> + </FormItem> + </Form> + ); + } +} + +const WrappedRegistrationForm = Form.create()(RegistrationForm); + +export default WrappedRegistrationForm; diff --git a/cyclone-web/app/containers/network/ips/actions/disabled.jsx b/cyclone-web/app/containers/network/ips/actions/disabled.jsx new file mode 100644 index 0000000000000000000000000000000000000000..83eafaafc2ac37bea2bd0ebe35e0a788f2da65bc --- /dev/null +++ b/cyclone-web/app/containers/network/ips/actions/disabled.jsx @@ -0,0 +1,34 @@ +import React from 'react'; +import { Modal, Input, notification } from 'antd'; +const confirm = Modal.confirm; +import { put } from 'common/xFetch2'; + +export default function action(options) { + let fixed_asset_number = options.records.fixed_asset_number; + const setValue = (e) => { + fixed_asset_number = e.target.value; + }; + const onSubmit = () => { + const ids = options.records.map(it => it.id); + put(`/api/cloudboot/v1/ips/status/disable`, { ids: ids, remark: fixed_asset_number }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + options.reload(); + }); + }; + confirm({ + title: `确定要禁用吗?`, + content: <div> + <p> 已选择的IP数:{options.records.length}</p> + <p style={{ display: 'flex', marginTop: 12, alignItems: 'baseline' }}>备注:<Input style={{ width: '80%' }} defalutValue={options.records.fixed_asset_number} onBlur={setValue}/></p> + </div>, + okText: '确定', + okType: 'danger', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/network/ips/actions/index.js b/cyclone-web/app/containers/network/ips/actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..f98aa8040ae6bb77509b23b7c70f2fc76e8d2720 --- /dev/null +++ b/cyclone-web/app/containers/network/ips/actions/index.js @@ -0,0 +1,14 @@ +import cidr_detail from '../../cidr/actions/detail'; +import assign from './assign'; +import assignipv4 from './assignipv4'; +import assignipv6 from './assignipv6'; +import _disabled from './disabled'; + + +export default { + cidr_detail, + assign, + assignipv4, + assignipv6, + _disabled +}; diff --git a/cyclone-web/app/containers/network/ips/components/search-form.jsx b/cyclone-web/app/containers/network/ips/components/search-form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..5972017937244266b73c5173aaba07871261982a --- /dev/null +++ b/cyclone-web/app/containers/network/ips/components/search-form.jsx @@ -0,0 +1,43 @@ +import React from 'react'; +import SearchForm from 'components/search-form'; +import { YES_NO, NETWORK_IPS_SCOPE, IP_NETWORK_CATEGORY, getSearchList } from 'common/enums'; + +export default class Search extends React.Component { + state = { + searchKeys: [ + { key: 'ip', label: 'IP地址' }, + { key: 'cidr', label: '网段名称' }, + { key: 'sn', label: '序列号' }, + { key: 'fixed_asset_number', label: '固资编号' }, + { key: 'is_used', label: '是否被使用' }, + { key: 'scope', label: 'IP作用范围' }, + { key: 'ipnetwork_category', label: '类别' } + ], + searchValues: { + 'ip': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'cidr': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'sn': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'fixed_asset_number': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'is_used': { type: 'checkbox', list: getSearchList(YES_NO) }, + 'scope': { type: 'checkbox', list: getSearchList(NETWORK_IPS_SCOPE) }, + 'ipnetwork_category': { type: 'checkbox', list: getSearchList(IP_NETWORK_CATEGORY) } + } + }; + + onSearch = (values) => { + this.props.dispatch({ + type: 'network-ips/table-data/search', + payload: { + ...values + } + }); + }; + + render() { + return ( + <SearchForm onSearch={this.onSearch} searchKeys={this.state.searchKeys} searchValues={this.state.searchValues}/> + ); + } +} + + diff --git a/cyclone-web/app/containers/network/ips/components/table.jsx b/cyclone-web/app/containers/network/ips/components/table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..9d1ef3a6428bfff36a0ce9aa0447cce25279e215 --- /dev/null +++ b/cyclone-web/app/containers/network/ips/components/table.jsx @@ -0,0 +1,268 @@ +import React from 'react'; +import { + Table, + Button, + notification, + Pagination, + Tooltip, + Icon +} from 'antd'; +import { YES_NO, IP_NETWORK_CATEGORY, NETWORK_IPS_CATEGORY, NETWORK_IPS_SCOPE, IP_VERSION } from 'common/enums'; +import actions from '../actions'; +import { Link } from 'react-router'; +import TableControlCell from 'components/TableControlCell'; +import { getPermissonBtn } from 'common/utils'; + +class MyTable extends React.Component { + + reload = () => { + this.props.dispatch({ + type: 'network-ips/table-data/reload' + }); + this.props.dispatch({ + type: 'network-ips/table-data/set/selectedRows', + payload: { + selectedRows: [], + selectedRowKeys: [] + } + }); + }; + + //批量操作入口 + batchExecAction = (name) => { + const { tableData } = this.props; + const selectedRows = tableData.selectedRows || []; + if (selectedRows.length < 1) { + return notification.error({ message: '请至少选择一条数据' }); + } + this.execAction(name, selectedRows); + }; + + //操作入口 + execAction = (name, records) => { + if (actions[name]) { + actions[name]({ + records, + initialValue: records, + type: name, + room: this.props.room, + reload: () => { + this.reload(); + } + }); + } + }; + + exportIP = () => { + const query = this.props.tableData.query; + let keys = Object.keys(query); + const { tableData } = this.props; + const selectedRowKeys = tableData.selectedRowKeys || []; + keys = keys + .map(key => { + return `${key}=${query[key]}`; + }) + .join('&'); + window.open(`/api/cloudboot/v1/ips/export?${keys}&id=${selectedRowKeys}`); + }; + + getRowSelection = () => { + const selectedRowKeys = this.props.tableData.selectedRowKeys; + return { + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.props.dispatch({ + type: 'network-ips/table-data/set/selectedRows', + payload: { + selectedRowKeys, + selectedRows + } + }); + } + }; + }; + + changePage = page => { + this.props.dispatch({ + type: `network-ips/table-data/change-page`, + payload: { + page + } + }); + }; + + changePageSize = (page, pageSize) => { + this.props.dispatch({ + type: `network-ips/table-data/change-page-size`, + payload: { + page, + pageSize + } + }); + }; + + + getColumns = () => { + return [ + { + title: 'IP地址', + dataIndex: 'ip' + }, + { + title: '网段名称', + dataIndex: 'ip_network', + render: (text, record) => <a onClick={() => this.execAction('cidr_detail', { id: record.ip_network.id })}>{text.cidr}</a> + }, + { + title: '网段网关', + dataIndex: 'gateway', + render: (text, record) => <span>{record.ip_network.gateway}</span> + }, + { + title: '网段掩码', + dataIndex: 'netmask', + render: (text, record) => <span>{record.ip_network.netmask}</span> + }, + { + title: '网段类别', + dataIndex: 'ip_network', + render: (text, record) => { + return <span>{IP_NETWORK_CATEGORY[record.ip_network.category]}</span>; + } + }, + { + title: 'IP版本', + dataIndex: 'ip_network', + render: (text, record) => { + return <span>{IP_VERSION[record.ip_network.version]}</span>; + } + }, + { + title: '是否被使用', + dataIndex: 'is_used', + render: (text) => <span className={`yes_no_status ${text === 'yes' ? 'yes_status' : 'no_status'}`}>{YES_NO[text]}</span> + }, + { + title: 'IP作用范围', + dataIndex: 'scope', + render: (text) => <span>{NETWORK_IPS_SCOPE[text]}</span> + }, + { + title: 'IP用途', + dataIndex: 'category', + render: (text) => <span>{NETWORK_IPS_CATEGORY[text]}</span> + }, + { + title: '关联设备序列号', + dataIndex: 'sn', + render: (text, record) => <Link to={`/device/detail/${text}`}>{text}</Link> + }, + { + title: '固资编号', + dataIndex: 'fixed_asset_number' + }, + { + title: '更新时间', + dataIndex: 'updated_at' + }, + { + title: '操作', + dataIndex: 'operate', + width: 150, + render: (text, record) => { + const commands = [ + { + name: '分配IP', + command: 'assign', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_ip_assign') || (record.is_used === 'yes' || record.is_used === 'disabled') + }, + { + name: '禁用', + command: '_disabled', + type: 'danger', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_ip_unassign') || (record.is_used === 'yes' || record.is_used === 'disabled') + } + ]; + return ( + <TableControlCell + commands={commands} + record={record} + execCommand={command => { + this.execAction(command, [record]); + }} + /> + ); + } + } + ]; + }; + + + render() { + const { tableData } = this.props; + const { loading, pagination } = tableData; + return ( + <div> + <span className='pull-right'> + <Button + onClick={this.exportIP} + style={{ float: 'right', marginRight: 30 }} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_network_device_create')} + > + 导出 + </Button> + <Button + onClick={() => this.batchExecAction('_disabled')} + type='danger' + style={{ marginBottom: 8 }} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_network_device_create')} + > + 批量禁用 + </Button> + </span> + <Tooltip placement="top" title='为选中的设备自动分配一个内网或外网IP'> + <Button + onClick={() => this.execAction('assignipv4')} + type='primary' + style={{ marginBottom: 8 }} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_network_device_create')} + > + 分配IPv4<Icon type='question-circle-o' /> + </Button> + </Tooltip> + <Tooltip placement="top" title='为选中的设备自动分配一个内网或外网IP'> + <Button + onClick={() => this.execAction('assignipv6')} + type='primary' + style={{ marginLeft: 18 }} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_network_device_create')} + > + 分配IPv6<Icon type='question-circle-o' /> + </Button> + </Tooltip> + <Table + rowKey={'id'} + columns={this.getColumns()} + pagination={false} + dataSource={tableData.list} + rowSelection={this.getRowSelection()} + loading={loading} + /> + <div> + <Pagination + showQuickJumper={true} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={this.changePageSize} + onChange={this.changePage} + showTotal={(total) => `共 ${total} 条`} + /> + </div> + </div> + ); + } +} + +export default MyTable; diff --git a/cyclone-web/app/containers/network/ips/get-component.js b/cyclone-web/app/containers/network/ips/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..39c81f1a945e1e560458645952f2296299fb814a --- /dev/null +++ b/cyclone-web/app/containers/network/ips/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('network-ips', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/network/ips/index.jsx b/cyclone-web/app/containers/network/ips/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..68623eff8a86dd3d463a082f4b6ecddcf3853d05 --- /dev/null +++ b/cyclone-web/app/containers/network/ips/index.jsx @@ -0,0 +1,52 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import SearchForm from './components/search-form'; +import Table from './components/table'; +import Layout from 'components/layout/page-layout'; +// import { toJS } from 'utils/to-js'; +import withImmutablePropsToJS from 'with-immutable-props-to-js'; + +class Container extends React.Component { + componentDidMount() { + this.props.dispatch({ + type: 'network-ips/table-data/get' + }); + } + + componentWillUnmount() { + this.props.dispatch({ + type: 'network-ips/table-data/reset' + }); + } + + render() { + const { tableData } = this.props.data; + return ( + <Layout title='IP分配管理'> + <SearchForm dispatch={this.props.dispatch}/> + <Table + dispatch={this.props.dispatch} + tableData={tableData} + userInfo={this.props.userInfo} + /> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + data: state.get('network-ips'), + userInfo: state.getIn([ 'global', 'userData' ]) + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + + + +export default connect(mapStateToProps, mapDispatchToProps)(withImmutablePropsToJS(Container)); diff --git a/cyclone-web/app/containers/network/ips/reducers/index.js b/cyclone-web/app/containers/network/ips/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..ef6b316e215397975497f4e83bf05cf26b226056 --- /dev/null +++ b/cyclone-web/app/containers/network/ips/reducers/index.js @@ -0,0 +1,16 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; + +const initialState = fromJS({ + tableData: createTableStore() +}); + +const reducer = handleActions( + { + ...createTableReducer('network-ips/table-data', 'tableData') + }, + initialState, +); + +export default reducer; diff --git a/cyclone-web/app/containers/network/ips/sagas/index.js b/cyclone-web/app/containers/network/ips/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..89163c8f9ba060f8f3d8fcb32f71ce88e1b1f281 --- /dev/null +++ b/cyclone-web/app/containers/network/ips/sagas/index.js @@ -0,0 +1,25 @@ +let created = false; +function* empty() { + yield; +} + +import { createTableSaga } from 'utils/table-saga'; + +const jobTableSaga = createTableSaga({ + actionNamePrefix: 'network-ips/table-data', + tableDataPath: [ 'network-ips', 'tableData' ], + datasource: '/api/cloudboot/v1/ips', + getExtraQuery: () => { + return { + category: 'business' + }; + } +}); + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [jobTableSaga]; +} diff --git a/cyclone-web/app/containers/order/deviceCategory/actions/create-update.jsx b/cyclone-web/app/containers/order/deviceCategory/actions/create-update.jsx new file mode 100644 index 0000000000000000000000000000000000000000..949b6e43622e95cee573ad10e7984f77905ffa23 --- /dev/null +++ b/cyclone-web/app/containers/order/deviceCategory/actions/create-update.jsx @@ -0,0 +1,175 @@ +import React from 'react'; +import { Input, Icon, Tooltip, Button, Form, notification, InputNumber, Radio } from 'antd'; +import { post, put } from 'common/xFetch2'; +const FormItem = Form.Item; +import { formItemLayout, tailFormItemLayout, getSearchList, BUILTIN } from 'common/enums'; +import Popup from 'components/popup'; +const RadioGroup = Radio.Group; + +export default function action(options) { + const type = options.type; + const typeMap = { + _create: { name: '新增设备类型', method: post, url: '/api/cloudboot/v1/device-category' }, + _update: { name: '修改设备类型', method: put, url: `/api/cloudboot/v1/device-category` } + }; + const onSubmit = (values) => { + if (type == '_update') { + values.id = options.records.id; + } + typeMap[type].method(typeMap[type].url, values).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + Popup.close(); + }); + }; + + Popup.open({ + title: `${typeMap[type].name}`, + width: 600, + onCancel: () => { + Popup.close(); + }, + content: ( + <WrapperForm + initialValue={options.records} + onSubmit={onSubmit} + onCancel={() => { + Popup.close(); + }} + /> + ) + }); +} + +class MyForm extends React.Component { + handleSubmit = ev => { + ev && ev.preventDefault(); + ev && ev.stopPropagation(); + this.props.form.validateFields({ force: true }, (error, values) => { + if (error) { + notification.warning({ + message: '还有未填写完整的选项' + }); + return; + } + this.props.onSubmit(values); + }); + }; + render() { + const { getFieldDecorator } = this.props.form; + const initialValue = this.props.initialValue; + return <Form onSubmit={this.handleSubmit}> + <FormItem {...formItemLayout} label='设备类型' help='相同硬件配置,设备类型唯一'> + {getFieldDecorator('category', { + initialValue: initialValue.category, + rules: [ + { + required: true, + message: '请输入设备类型' + } + ] + })( + <Input /> + )} + </FormItem> + <FormItem {...formItemLayout} label='硬件配置' > + {getFieldDecorator('hardware', { + initialValue: initialValue.hardware, + rules: [ + { + required: true, + message: '请输入硬件配置' + } + ] + })( + <Input /> + )} + </FormItem> + <FormItem {...formItemLayout} label='处理器生产商' help='如:Intel(R) Corporation\HiSilicon'> + {getFieldDecorator('central_processor_manufacture', { + initialValue: initialValue.central_processor_manufacture, + rules: [ + { + required: true, + message: '请输入处理器生产商' + } + ] + })( + <Input /> + )} + </FormItem> + <FormItem {...formItemLayout} label='处理器架构' help='如: x86_64\aarch64'> + {getFieldDecorator('central_processor_arch', { + initialValue: initialValue.central_processor_arch, + rules: [ + { + required: true, + message: '请输入处理器架构' + } + ] + })( + <Input /> + )} + </FormItem> + <FormItem {...formItemLayout} label='功率' > + {getFieldDecorator('power', { + initialValue: initialValue.power, + rules: [ + { + required: true, + message: '请输入功率' + } + ] + })( + <Input /> + )} + </FormItem> + <FormItem {...formItemLayout} label='设备U数' > + {getFieldDecorator('unit', { + initialValue: initialValue.unit, + rules: [ + { + required: true, + message: '请输入设备U数' + } + ] + })(<InputNumber style={{ width: '100%' }} />)} + </FormItem> + <FormItem {...formItemLayout} label='是否金融信创生态产品'> + {getFieldDecorator('is_fiti_eco_product', { + initialValue: initialValue.is_fiti_eco_product, + rules: [{ + required: true, message: '请选择是否金融信创生态产品' + }] + })( + <RadioGroup> + {getSearchList(BUILTIN).map(it => <Radio value={it.value}>{it.label}</Radio>)} + </RadioGroup> + )} + </FormItem> + <FormItem {...formItemLayout} label='备注' > + {getFieldDecorator('remark', { + initialValue: initialValue.remark + })( + <Input.TextArea /> + )} + </FormItem> + <FormItem {...tailFormItemLayout}> + <div className='pull-right'> + <Button onClick={() => this.props.onCancel()}>取消</Button> + <Button + style={{ marginLeft: 8 }} + type='primary' + htmlType='submit' + > + 确认 + </Button> + </div> + </FormItem> + </Form>; + } +} +const WrapperForm = Form.create()(MyForm); diff --git a/cyclone-web/app/containers/order/deviceCategory/actions/delete.jsx b/cyclone-web/app/containers/order/deviceCategory/actions/delete.jsx new file mode 100644 index 0000000000000000000000000000000000000000..9112336cc8d1a1ac46bdcfbab58c82faaf80c09c --- /dev/null +++ b/cyclone-web/app/containers/order/deviceCategory/actions/delete.jsx @@ -0,0 +1,26 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { del } from 'common/xFetch2'; + +export default function action(options) { + const onSubmit = () => { + del(`/api/cloudboot/v1/device-categories`, { ids: options.records.map(it => it.id) }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + }); + }; + confirm({ + title: `确定要删除吗?`, + content: `共:${options.records.length} 条`, + okText: '确定', + okType: 'danger', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/order/deviceCategory/actions/index.js b/cyclone-web/app/containers/order/deviceCategory/actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..f8c790031ee8e0ea4407ea487e53a6f3e1d7d3fa --- /dev/null +++ b/cyclone-web/app/containers/order/deviceCategory/actions/index.js @@ -0,0 +1,10 @@ +import _delete from './delete'; +import _create from './create-update'; +import _update from './create-update'; + + +export default { + _delete, + _create, + _update +}; diff --git a/cyclone-web/app/containers/order/deviceCategory/components/search-form.jsx b/cyclone-web/app/containers/order/deviceCategory/components/search-form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..8ea0fb74821303ca34b508e6f1ab030d45a80078 --- /dev/null +++ b/cyclone-web/app/containers/order/deviceCategory/components/search-form.jsx @@ -0,0 +1,34 @@ +import React from 'react'; +import SearchForm from 'components/search-form'; + +export default class Search extends React.Component { + state = { + searchKeys: [ + { key: 'category', label: '设备类型' }, + { key: 'hardware', label: '硬件配置' }, + { key: 'remark', label: '备注' } + ], + searchValues: { + 'category': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'hardware': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'remark': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' } + } + }; + + onSearch = (values) => { + this.props.dispatch({ + type: 'order-deviceCategory/table-data/search', + payload: { + ...values + } + }); + }; + + render() { + return ( + <SearchForm onSearch={this.onSearch} searchKeys={this.state.searchKeys} searchValues={this.state.searchValues}/> + ); + } +} + + diff --git a/cyclone-web/app/containers/order/deviceCategory/components/table.jsx b/cyclone-web/app/containers/order/deviceCategory/components/table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..bf1a73cde57d55f8537527f91c1f53ed5dfeb368 --- /dev/null +++ b/cyclone-web/app/containers/order/deviceCategory/components/table.jsx @@ -0,0 +1,201 @@ +import React from 'react'; +import { + Table, + Tooltip, + Pagination, + Button, + notification +} from 'antd'; +import actions from '../actions'; +import TableControlCell from 'components/TableControlCell'; +import { getPermissonBtn } from 'common/utils'; +import { BUILTIN } from 'common/enums'; + +class MyTable extends React.Component { + + reload = () => { + this.props.dispatch({ + type: 'order-deviceCategory/table-data/reload' + }); + this.props.dispatch({ + type: 'order-deviceCategory/table-data/set/selectedRows', + payload: { + selectedRows: [], + selectedRowKeys: [] + } + }); + }; + + //批量操作入口 + batchExecAction = (name) => { + const { tableData } = this.props; + const selectedRows = tableData.selectedRows || []; + if (selectedRows.length < 1) { + return notification.error({ message: '请至少选择一条数据' }); + } + this.execAction(name, selectedRows); + }; + + //操作入口 + execAction = (name, records) => { + if (actions[name]) { + actions[name]({ + records, + initialValue: records, + type: name, + reload: () => { + this.reload(); + } + }); + } + }; + + + getRowSelection = () => { + const selectedRowKeys = this.props.tableData.selectedRowKeys; + return { + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.props.dispatch({ + type: 'order-deviceCategory/table-data/set/selectedRows', + payload: { + selectedRowKeys, + selectedRows + } + }); + } + }; + }; + + changePage = page => { + this.props.dispatch({ + type: `order-deviceCategory/table-data/change-page`, + payload: { + page + } + }); + }; + + changePageSize = (page, pageSize) => { + this.props.dispatch({ + type: `order-deviceCategory/table-data/change-page-size`, + payload: { + page, + pageSize + } + }); + }; + + getColumns = () => { + return [ + { + title: '设备类型', + dataIndex: 'category' + }, + { + title: '硬件配置', + dataIndex: 'hardware', + render: (text) => <Tooltip placement="top" title={text}>{text}</Tooltip> + }, + { + title: '处理器生产商', + dataIndex: 'central_processor_manufacture' + }, + { + title: '处理器架构', + dataIndex: 'central_processor_arch' + }, + { + title: '功率/W', + dataIndex: 'power' + }, + { + title: '设备高度/U', + dataIndex: 'unit' + }, + { + title: '是否金融信创生态产品', + dataIndex: 'is_fiti_eco_product', + render: (text) => <span className={`yes_no_status ${text === 'yes' ? 'yes_status' : 'no_status'}`}>{BUILTIN[text]}</span> + }, + { + title: '备注', + dataIndex: 'remark' + }, + { + title: '操作', + dataIndex: 'operate', + render: (text, record) => { + const commands = [ + { + name: '修改', + command: '_update', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_device_category_update') + } + ]; + return ( + <TableControlCell + commands={commands} + record={record} + execCommand={command => { + this.execAction(command, record); + }} + /> + ); + } + } + ]; + }; + + + render() { + const { tableData } = this.props; + const { loading, pagination } = tableData; + return ( + <div> + <div className='operate_btns'> + <Button + onClick={() => this.execAction('_create', {})} + type='primary' + icon='plus' + style={{ marginRight: 8 }} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_device_category_create')} + > + 新增 + </Button> + <Button + type='danger' + onClick={() => this.batchExecAction('_delete')} + style={{ marginRight: 8 }} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_device_category_delete')} + > + 删除 + </Button> + </div> + <div className='clearfix' /> + <Table + rowKey={'id'} + columns={this.getColumns()} + pagination={false} + dataSource={tableData.list} + rowSelection={this.getRowSelection()} + loading={loading} + /> + <div> + <Pagination + showTotal={(total) => `共 ${total} 条`} + showQuickJumper={true} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={this.changePageSize} + onChange={this.changePage} + /> + </div> + </div> + ); + } +} + +export default MyTable; diff --git a/cyclone-web/app/containers/order/deviceCategory/get-component.js b/cyclone-web/app/containers/order/deviceCategory/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..3d38fbd7b8addfea41f44dcb46296e7c48830b83 --- /dev/null +++ b/cyclone-web/app/containers/order/deviceCategory/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('order-deviceCategory', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/order/deviceCategory/index.jsx b/cyclone-web/app/containers/order/deviceCategory/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..d6b4a67bf0acdba6b9af5129ec8f3fc852496db6 --- /dev/null +++ b/cyclone-web/app/containers/order/deviceCategory/index.jsx @@ -0,0 +1,52 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import SearchForm from './components/search-form'; +import Table from './components/table'; +import Layout from 'components/layout/page-layout'; + +class Container extends React.Component { + componentDidMount() { + this.props.dispatch({ + type: 'order-deviceCategory/table-data/get' + }); + } + + componentWillUnmount() { + this.props.dispatch({ + type: 'order-deviceCategory/table-data/reset' + }); + } + + render() { + const { tableData, physicalArea, deviceCategory } = this.props.data; + return ( + <Layout title='设备类型'> + <SearchForm dispatch={this.props.dispatch}/> + <Table + dispatch={this.props.dispatch} + tableData={tableData} + userInfo={this.props.userInfo} + idc={this.props.idc} + room={this.props.room} + physicalArea={physicalArea} + deviceCategory={deviceCategory} + /> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + data: state.get('order-deviceCategory').toJS(), + userInfo: state.getIn([ 'global', 'userData' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/order/deviceCategory/reducers/index.js b/cyclone-web/app/containers/order/deviceCategory/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..3060bcc7ae0fb8628eaebfa8d49b8e41ba3ab83f --- /dev/null +++ b/cyclone-web/app/containers/order/deviceCategory/reducers/index.js @@ -0,0 +1,16 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; + +const initialState = fromJS({ + tableData: createTableStore() +}); + +const reducer = handleActions( + { + ...createTableReducer('order-deviceCategory/table-data', 'tableData') + }, + initialState, +); + +export default reducer; diff --git a/cyclone-web/app/containers/order/deviceCategory/sagas/index.js b/cyclone-web/app/containers/order/deviceCategory/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..340fd10dbbd3246a5210202481187146fe90c9d4 --- /dev/null +++ b/cyclone-web/app/containers/order/deviceCategory/sagas/index.js @@ -0,0 +1,24 @@ +import { get, getWithArgs } from 'common/xFetch2'; +import { createTableListSaga } from 'utils/tableList-saga'; + +let created = false; +function* empty() { + yield; +} + + +import { createTableSaga } from 'utils/table-saga'; +const jobTableSaga = createTableSaga({ + actionNamePrefix: 'order-deviceCategory/table-data', + tableDataPath: [ 'order-deviceCategory', 'tableData' ], + datasource: '/api/cloudboot/v1/device-categories' +}); + + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [jobTableSaga]; +} diff --git a/cyclone-web/app/containers/order/list/actions/cancel.jsx b/cyclone-web/app/containers/order/list/actions/cancel.jsx new file mode 100644 index 0000000000000000000000000000000000000000..1df96608c921a9bf457510dce9e244b08b163a75 --- /dev/null +++ b/cyclone-web/app/containers/order/list/actions/cancel.jsx @@ -0,0 +1,25 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { put } from 'common/xFetch2'; + +export default function action(options) { + const onSubmit = () => { + put(`/api/cloudboot/v1/order/status`, { "id": options.records.id, "status": "canceled" }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + }); + }; + confirm({ + title: `确定要取消订单吗?`, + content: `订单号:${options.records.number}`, + okText: '确定', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/order/list/actions/confirm.jsx b/cyclone-web/app/containers/order/list/actions/confirm.jsx new file mode 100644 index 0000000000000000000000000000000000000000..9456b288a0ea6223640e92560469d1e4a936bc87 --- /dev/null +++ b/cyclone-web/app/containers/order/list/actions/confirm.jsx @@ -0,0 +1,25 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { put } from 'common/xFetch2'; + +export default function action(options) { + const onSubmit = () => { + put(`/api/cloudboot/v1/order/status`, { "id": options.records.id, "status": "finished" }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + }); + }; + confirm({ + title: `确定订单已完成?`, + content: `订单号:${options.records.number}`, + okText: '确定', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/order/list/actions/create-update.jsx b/cyclone-web/app/containers/order/list/actions/create-update.jsx new file mode 100644 index 0000000000000000000000000000000000000000..1ff7c1042cc57d8ab571614c1f3236029af9a9cf --- /dev/null +++ b/cyclone-web/app/containers/order/list/actions/create-update.jsx @@ -0,0 +1,70 @@ +import React from 'react'; +import Popup from 'components/popup'; +import { post, put } from 'common/xFetch2'; +import { notification } from 'antd'; +import MyForm from './form'; +import moment from 'moment'; + +export default function action(options) { + const record = options.records || {}; + const type = options.type; + const typeMap = { + _create: { name: '新增订单', method: post }, + _update: { name: '编辑订单', method: put } + }; + const onSubmit = (values) => { + //修改。 + if (type === '_update') { + values.id = record.id; + } + if (values.pre_occupied_usites.length < values.amount) { + return notification.error({ message: '机房可用机位数' + values.pre_occupied_usites.length + '小于订单总数' + values.amount }); + } + if (values.pre_occupied_usites) { + values.pre_occupied_usites = JSON.stringify(values.pre_occupied_usites); + } + if (values.expected_arrival_date) { + values.expected_arrival_date = moment(values.expected_arrival_date).format('YYYY-MM-DD'); + } + if (values.maintenance_service_date_begin) { + values.maintenance_service_date_begin = moment(values.maintenance_service_date_begin).format('YYYY-MM-DD'); + } + if (values.maintenance_service_date_end) { + values.maintenance_service_date_end = moment(values.maintenance_service_date_end).format('YYYY-MM-DD'); + } + + typeMap[type].method('/api/cloudboot/v1/order', values).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + Popup.close(); + options.reload(); + }); + }; + + Popup.open({ + title: `${typeMap[type].name}`, + width: 700, + onCancel: () => { + Popup.close(); + }, + content: ( + <div> + <MyForm + id={record.id} + type={options.type} + dispatch={options.dispatch} + idc={options.idc} + physicalArea={options.physicalArea} + deviceCategory={options.deviceCategory} + showSubmit={true} + onSubmit={(values) => onSubmit(values)} + onCancel={() => { + Popup.close(); + }} + /> + </div> + ) + }); +} diff --git a/cyclone-web/app/containers/order/list/actions/delete.jsx b/cyclone-web/app/containers/order/list/actions/delete.jsx new file mode 100644 index 0000000000000000000000000000000000000000..52eb3ab024e9ae7d97df9ac3572a359569cd6ab2 --- /dev/null +++ b/cyclone-web/app/containers/order/list/actions/delete.jsx @@ -0,0 +1,26 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { del } from 'common/xFetch2'; + +export default function action(options) { + const onSubmit = () => { + del(`/api/cloudboot/v1/orders`, { ids: options.records.map(it => it.id) }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + }); + }; + confirm({ + title: `确定要删除吗?`, + content: `共:${options.records.length} 条`, + okText: '确定', + okType: 'danger', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/order/list/actions/detail.jsx b/cyclone-web/app/containers/order/list/actions/detail.jsx new file mode 100644 index 0000000000000000000000000000000000000000..f44c7f31e2fc4799583b788df625e19964f5b4bd --- /dev/null +++ b/cyclone-web/app/containers/order/list/actions/detail.jsx @@ -0,0 +1,27 @@ +import React from 'react'; +import Popup from 'components/popup/draw'; +import MyForm from './form'; + +export default async function action(options) { + + Popup.open({ + title: '订单详情', + onCancel: () => { + Popup.close(); + }, + content: ( + <div> + <MyForm + type={options.type} + id={options.records.id} + physicalArea={options.physicalArea} + deviceCategory={options.deviceCategory} + showSubmit={false} + onCancel={() => { + Popup.close(); + }} + /> + </div> + ) + }); +} diff --git a/cyclone-web/app/containers/order/list/actions/form.jsx b/cyclone-web/app/containers/order/list/actions/form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..1d58a1aaa696d04b8571f31de0d1b3043380f4ff --- /dev/null +++ b/cyclone-web/app/containers/order/list/actions/form.jsx @@ -0,0 +1,403 @@ +import React from 'react'; +import { getWithArgs } from 'common/xFetch2'; +import { + Form, + Button, + notification, + Input, + Select, + DatePicker, + TreeSelect, + InputNumber, + Radio +} from 'antd'; +const FormItem = Form.Item; +const RadioGroup = Radio.Group; +import { formItemLayout, tailFormItemLayout, getSearchList, BUILTIN } from 'common/enums'; +const Option = Select.Option; +import { get } from 'common/xFetch2'; +import renderTreeData from 'utils/get-tree-select-data'; +const { SHOW_CHILD } = TreeSelect; +import moment from 'moment'; + +class MyForm extends React.Component { + constructor(props) { + super(props); + this.state = { + idc_id: 0, + physical_area: '', + initialValue: { + 'expected_arrival_date': moment().add(45, 'days'), + 'maintenance_service_date_begin': moment().add(45, 'days'), + 'maintenance_service_date_end': moment().add(5, 'years'), + }, + room: [], + treeData: [] + }; + } + + handleSubmit = ev => { + ev && ev.preventDefault(); + ev && ev.stopPropagation(); + this.props.form.validateFields((error, values) => { + if (error) { + notification.warning({ + message: '还有未填写完整的选项' + }); + return; + } + this.props.onSubmit(values); + }); + }; + + componentDidMount() { + const { type, id } = this.props; + if (type === '_detail' || type === '_update') { + get(`/api/cloudboot/v1/order/${id}`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + const content = res.content || {}; + if (content.expected_arrival_date) { + content.expected_arrival_date = moment(content.expected_arrival_date); + } + if (content.maintenance_service_date_begin) { + content.maintenance_service_date_begin = moment(content.maintenance_service_date_begin); + } + if (content.maintenance_service_date_end) { + content.maintenance_service_date_end = moment(content.maintenance_service_date_end); + } + this.setState({ + initialValue: { + ...content, + idc_name: content.idc.name, + server_room_id: content.server_room.id, + idc_id: content.idc.id + }, + //机房库 + room: [content.server_room] + }); + }); + } + } + + + //选择数据中心,获取机房列表 + getRoom = (v) => { + this.setState({ + idc_id: v + }); + getWithArgs('/api/cloudboot/v1/server-rooms', { page: 1, page_size: 100, idc_id: v }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + this.setState({ + room: res.content.records + }); + + //清空已选机房的值 + const { setFieldsValue, getFieldValue } = this.props.form; + const room = getFieldValue('server_room_id'); + if (room) { + setFieldsValue({ server_room_id: null }); + } + //清空已选机架的值 + const cabinet = getFieldValue('server_cabinet_id'); + if (cabinet) { + setFieldsValue({ server_cabinet_id: null }); + } + }); + }; + + + //选择机房获取树 + getCabinet = (v) => { + const { getFieldValue } = this.props.form; + const server_room_id = getFieldValue('server_room_id'); + + getWithArgs('/api/cloudboot/v1/server-usites/tree', { physical_area: v, idc_id: this.state.idc_id, usite_status: 'free', server_room_id: server_room_id }).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + this.setState({ + treeData: renderTreeData(res.content.roots) + }); + }); + }; + + render() { + const { idc, showSubmit, physicalArea, deviceCategory } = this.props; + const { initialValue, treeData } = this.state; + const { getFieldDecorator } = this.props.form; + const tProps = { + treeData, + labelInValue: true, + treeCheckable: true, + showCheckedStrategy: SHOW_CHILD, + searchPlaceholder: '请选择机位', + style: { + width: '100%' + } + }; + return ( + <div> + <Form onSubmit={this.handleSubmit}> + { + showSubmit ? + <FormItem {...formItemLayout} label='数据中心' > + {getFieldDecorator('idc_id', { + initialValue: initialValue.idc_id, + rules: [ + { + required: true, + message: '请选择数据中心' + } + ] + })(<Select disabled={!showSubmit} onChange={(value) => this.getRoom(value)}> + { + !idc.loading && + idc.data.map((os, index) => <Option value={os.value} key={os.value}>{os.label}</Option>) + } + </Select>)} + </FormItem> : + <FormItem {...formItemLayout} label='数据中心' > + {getFieldDecorator('idc_name', { + initialValue: initialValue.idc_name, + rules: [ + { + required: true, + message: '请选择数据中心' + } + ] + })(<Input disabled={!showSubmit} />)} + </FormItem> + } + <FormItem {...formItemLayout} label='机房管理单元' > + {getFieldDecorator('server_room_id', { + initialValue: initialValue.server_room_id, + rules: [ + { + required: true, + message: '请选择所属机房' + } + ] + })(<Select disabled={!showSubmit}> + { + this.state.room.map((os, index) => <Option value={os.id} key={os.id}>{os.name}</Option>) + } + </Select>)} + </FormItem> + <FormItem {...formItemLayout} label='物理区域' > + {getFieldDecorator('physical_area', { + initialValue: initialValue.physical_area, + rules: [ + { + required: true, + message: '请选择物理区域' + } + ] + })(<Select disabled={!showSubmit} onChange={(value) => this.getCabinet(value)}> + { + !physicalArea.loading && + physicalArea.data.map((os, index) => <Option value={os.name} key={os.name}>{os.name}</Option>) + } + </Select>)} + </FormItem> + { + showSubmit ? <FormItem {...formItemLayout} label='可用机位' > + {getFieldDecorator('pre_occupied_usites', { + initialValue: initialValue.pre_occupied_usites, + rules: [ + { + required: true, + message: '请选择可用机位' + } + ] + })(<TreeSelect disabled={!showSubmit} {...tProps} />)} + </FormItem> : <FormItem {...formItemLayout} label='可用机位' > + {getFieldDecorator('pre_occupied_usites', { + initialValue: initialValue.pre_occupied_usites, + rules: [ + { + required: true, + message: '请选择可用机位' + } + ] + })(<Input.TextArea disabled={!showSubmit} />)} + </FormItem> + } + + <FormItem {...formItemLayout} label='用途' > + {getFieldDecorator('usage', { + initialValue: initialValue.usage, + rules: [ + { + required: true, + message: '请输入用途' + } + ] + })(<Input disabled={!showSubmit} />)} + </FormItem> + <FormItem {...formItemLayout} label='设备类型' > + {getFieldDecorator('category', { + initialValue: initialValue.category, + rules: [ + { + required: true, + message: '请选择设备类型' + } + ] + })( + <Select disabled={!showSubmit}> + { + !deviceCategory.loading && + deviceCategory.data.map((os, index) => <Option value={os.category} key={os.category}>{os.category}</Option>) + } + </Select> + )} + </FormItem> + <FormItem {...formItemLayout} label='数量' > + {getFieldDecorator('amount', { + initialValue: initialValue.amount, + rules: [ + { + required: true, + message: '请输入名称' + } + ] + })(<InputNumber style={{ width: '100%' }} disabled={!showSubmit} />)} + </FormItem> + <FormItem {...formItemLayout} label='预计到货时间' > + {getFieldDecorator('expected_arrival_date', { + initialValue: initialValue.expected_arrival_date, + rules: [ + { + required: true, + message: '请输入预计到货时间' + } + ] + })(<DatePicker style={{ width: '100%' }} disabled={!showSubmit} />)} + </FormItem> + <FormItem {...formItemLayout} label='资产归属' > + {getFieldDecorator('asset_belongs', { + initialValue: initialValue.asset_belongs, + rules: [ + { + required: true, + message: '请输入资产归属方' + } + ] + })(<Input disabled={!showSubmit} placeholder='请输入资产归属方'/>)} + </FormItem> + <FormItem {...formItemLayout} label='负责人' > + {getFieldDecorator('owner', { + initialValue: initialValue.owner, + rules: [ + { + required: true, + message: '请输入设备负责人企业微信号,多个负责人使用逗号分隔', + } + ] + })(<Input disabled={!showSubmit} placeholder='请输入设备负责人企业微信号,多个负责人使用逗号分隔' />)} + </FormItem> + <FormItem + {...formItemLayout} + label='是否租赁' + > + {getFieldDecorator('is_rental', { + initialValue: initialValue.is_rental, + rules: [{ + required: true, message: '请选择是否租赁' + }] + })( + <RadioGroup> + {getSearchList(BUILTIN).map(it => <Radio value={it.value}>{it.label}</Radio>)} + </RadioGroup> + )} + </FormItem> + <FormItem {...formItemLayout} label='维保服务供应商' > + {getFieldDecorator('maintenance_service_provider', { + initialValue: initialValue.maintenance_service_provider, + rules: [ + { + required: true, + message: '请输入维保服务供应商' + } + ] + })(<Input disabled={!showSubmit} />)} + </FormItem> + <FormItem {...formItemLayout} label='维保服务内容' > + {getFieldDecorator('maintenance_service', { + initialValue: initialValue.maintenance_service + })(<Input.TextArea disabled={!showSubmit} autoSize={{ minRows: 2}} />)} + </FormItem> + <FormItem {...formItemLayout} label='物流服务内容' > + {getFieldDecorator('logistics_service', { + initialValue: initialValue.logistics_service + })(<Input.TextArea disabled={!showSubmit} autoSize={{ minRows: 2}} />)} + </FormItem> + <FormItem {...formItemLayout} label='维保服务起始日期' > + {getFieldDecorator('maintenance_service_date_begin', { + initialValue: initialValue.maintenance_service_date_begin, + rules: [ + { + required: true, + message: '请输入预计到货时间' + } + ] + })(<DatePicker style={{ width: '100%' }} disabled={!showSubmit} />)} + </FormItem> + <FormItem {...formItemLayout} label='维保服务截止日期' > + {getFieldDecorator('maintenance_service_date_end', { + initialValue: initialValue.maintenance_service_date_end, + rules: [ + { + required: true, + message: '请输入预计到货时间' + } + ] + })(<DatePicker style={{ width: '100%' }} disabled={!showSubmit} />)} + </FormItem> + <FormItem {...formItemLayout} label='备注' > + {getFieldDecorator('remark', { + initialValue: initialValue.remark + })(<Input disabled={!showSubmit} />)} + </FormItem> + { + !showSubmit && + <FormItem {...formItemLayout} label='创建时间' > + {getFieldDecorator('created_at', { + initialValue: initialValue.created_at + })(<Input disabled={!showSubmit} />)} + </FormItem> + } + { + !showSubmit && + <FormItem {...formItemLayout} label='更新时间' > + {getFieldDecorator('updated_at', { + initialValue: initialValue.updated_at + })(<Input disabled={!showSubmit} />)} + </FormItem> + } + <FormItem {...tailFormItemLayout}> + <div className='pull-right'> + <Button onClick={() => this.props.onCancel()}>取消</Button> + { + showSubmit && + <Button + style={{ marginLeft: 8 }} + type='primary' + htmlType='submit' + > + 提交 + </Button> + } + </div> + </FormItem> + </Form> + </div> + ); + } +} + +export default Form.create()(MyForm); diff --git a/cyclone-web/app/containers/order/list/actions/index.js b/cyclone-web/app/containers/order/list/actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..72abae6bf2d33458d3806faab9837aa6e6c0e2be --- /dev/null +++ b/cyclone-web/app/containers/order/list/actions/index.js @@ -0,0 +1,19 @@ +import _delete from './delete'; +import _create from './create-update'; +import _update from './create-update'; +import _detail from './detail'; +import _cancel from './cancel'; +import _confirm from './confirm'; +import idc_detail from 'containers/database/common/idc/detail'; +import room_detail from 'containers/database/common/room/detail'; + +export default { + _delete, + _create, + _update, + _detail, + idc_detail, + room_detail, + _cancel, + _confirm +}; diff --git a/cyclone-web/app/containers/order/list/components/search-form.jsx b/cyclone-web/app/containers/order/list/components/search-form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..615239755f1b4775f6bc8014b467375dbeca59d9 --- /dev/null +++ b/cyclone-web/app/containers/order/list/components/search-form.jsx @@ -0,0 +1,68 @@ +import React from 'react'; +import SearchForm from 'components/search-form'; +import { ORDER_STATUS, getSearchList } from 'common/enums'; +import { get } from 'common/xFetch2'; +import { notification } from 'antd'; + +export default class Search extends React.Component { + state = { + searchKeys: [ + { key: 'number', label: '订单编号' }, + { key: 'status', label: '状态' }, + { key: 'usage', label: '用途' }, + { key: 'physical_area', label: '物理区域' } + ], + searchValues: { + 'number': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'status': { type: 'checkbox', list: getSearchList(ORDER_STATUS) }, + 'usage': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'physical_area': { type: 'checkbox', list: [] } + } + }; + + getList = (name) => { + const searchValues = this.state.searchValues; + get(`/api/cloudboot/v1/devices/query-params/${name}`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + const list = res.content.list || []; + if (list.length > 0) { + searchValues[name].list = list.map(it => { + if (it.name) { + return { + label: it.name, + value: it.name + }; + } else { + return { + label: 'blank', + value: 'blank' + }; + } + }); + } + }); + }; + + componentDidMount() { + this.getList('physical_area'); + } + + onSearch = (values) => { + this.props.dispatch({ + type: 'order-list/table-data/search', + payload: { + ...values + } + }); + }; + + render() { + return ( + <SearchForm onSearch={this.onSearch} searchKeys={this.state.searchKeys} searchValues={this.state.searchValues}/> + ); + } +} + + diff --git a/cyclone-web/app/containers/order/list/components/table.jsx b/cyclone-web/app/containers/order/list/components/table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..abc3cc1016e0eb542e8de70018327f142ac48f2a --- /dev/null +++ b/cyclone-web/app/containers/order/list/components/table.jsx @@ -0,0 +1,258 @@ +import React from 'react'; +import { + Table, + Tooltip, + Pagination, + Button, + notification +} from 'antd'; +import actions from '../actions'; +import TableControlCell from 'components/TableControlCell'; +import { NETWORK_DEVICE_TYPE, ORDER_STATUS } from 'common/enums'; +import { getPermissonBtn } from 'common/utils'; +import { post } from 'common/xFetch2'; + +class MyTable extends React.Component { + + reload = () => { + this.props.dispatch({ + type: 'order-list/table-data/reload' + }); + this.props.dispatch({ + type: 'order-list/table-data/set/selectedRows', + payload: { + selectedRows: [], + selectedRowKeys: [] + } + }); + }; + + //批量操作入口 + batchExecAction = (name) => { + const { tableData } = this.props; + const selectedRows = tableData.selectedRows || []; + const selectedRowKeys = tableData.selectedRowKeys || []; + if (name === '_export') { + const query = this.props.tableData.query; + let keys = Object.keys(query); + keys = keys + .map(key => { + return `${key}=${query[key]}`; + }) + .join('&'); + window.open(`/api/cloudboot/v1/orders/export?${keys}&id=${selectedRowKeys}`); + return; + } + if (selectedRows.length < 1) { + return notification.error({ message: '请至少选择一条数据' }); + } + this.execAction(name, selectedRows); + }; + + //操作入口 + execAction = (name, records) => { + if (actions[name]) { + actions[name]({ + records, + initialValue: records, + idc: this.props.idc, + physicalArea: this.props.physicalArea, + deviceCategory: this.props.deviceCategory, + type: name, + reload: () => { + this.reload(); + } + }); + } + }; + + + getRowSelection = () => { + const selectedRowKeys = this.props.tableData.selectedRowKeys; + return { + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.props.dispatch({ + type: 'order-list/table-data/set/selectedRows', + payload: { + selectedRowKeys, + selectedRows + } + }); + } + }; + }; + + changePage = page => { + this.props.dispatch({ + type: `order-list/table-data/change-page`, + payload: { + page + } + }); + }; + + changePageSize = (page, pageSize) => { + this.props.dispatch({ + type: `order-list/table-data/change-page-size`, + payload: { + page, + pageSize + } + }); + }; + + getColumns = () => { + return [ + { + title: '订单号', + dataIndex: 'number', + //render: (text, record) => <a onClick={() => this.execAction('_detail', { id: record.id })}>{text}</a> + render: (text, record) => <Tooltip placement="top" title={text}> + <a onClick={() => this.execAction('_detail', { id: record.id })}>{text}</a> + </Tooltip> + }, + { + title: '日期', + dataIndex: 'created_at' + }, + { + title: '数据中心', + dataIndex: 'idc', + render: (text, record) => <a onClick={() => this.execAction('idc_detail', { id: text.id })}>{text.name}</a> + }, + { + title: '机房管理单元', + dataIndex: 'server_room', + //render: (text, record) => <a onClick={() => this.execAction('room_detail', { id: text.id })}>{text.name}</a> + render: (text, record) => <Tooltip placement="top" title={text.name}> + <a onClick={() => this.execAction('room_detail', { id: text.id })}> + {text.name} + </a> + </Tooltip> + }, + { + title: '物理区域', + dataIndex: 'physical_area', + render: (text) => <Tooltip placement="top" title={text}>{text}</Tooltip> + }, + { + title: '设备类型', + dataIndex: 'category' + }, + { + title: '数量', + dataIndex: 'amount' + }, + { + title: '剩余到货数', + dataIndex: 'left_amount' + }, + { + title: '预计到货时间', + dataIndex: 'expected_arrival_date' + }, + { + title: '备注', + dataIndex: 'remark' + }, + { + title: '状态', + dataIndex: 'status', + render: (T) => ORDER_STATUS[T] + }, + { + title: '操作', + dataIndex: 'operate', + render: (text, record) => { + const commands = [ + // { + // name: '修改', + // command: '_update', + // disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_network_device_delete') + // }, + { + name: '取消', + command: '_cancel', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_order_cancel') || (record.status === 'canceled' || record.status === 'finished') + }, + { + name: '确认', + command: '_confirm', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_order_confirm') || (record.status === 'canceled' || record.status === 'finished') + } + ]; + return ( + <TableControlCell + commands={commands} + record={record} + execCommand={command => { + this.execAction(command, record); + }} + /> + ); + } + } + ]; + }; + + + render() { + const { tableData } = this.props; + const { loading, pagination, selectedRowKeys } = tableData; + return ( + <div> + <div className='operate_btns'> + <Button + onClick={() => this.execAction('_create')} + type='primary' + icon='plus' + style={{ marginRight: 8 }} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_order_create')} + > + 新增 + </Button> + <Button + type='danger' + onClick={() => this.batchExecAction('_delete')} + style={{ marginRight: 8 }} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_order_delete')} + > + 删除 + </Button> + <Button + onClick={() => this.batchExecAction('_export')} + style={{ marginRight: 8 }} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_order_export')} + > + 导出 + </Button> + </div> + + <div className='clearfix' /> + <Table + rowKey={'id'} + columns={this.getColumns()} + pagination={false} + dataSource={tableData.list} + rowSelection={this.getRowSelection()} + loading={loading} + /> + <div> + <Pagination + showTotal={(total) => `共 ${total} 条`} + showQuickJumper={true} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={this.changePageSize} + onChange={this.changePage} + /> + </div> + </div> + ); + } +} + +export default MyTable; diff --git a/cyclone-web/app/containers/order/list/get-component.js b/cyclone-web/app/containers/order/list/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..a47c0e6bd060a1cbfce71228414939ff54b9723b --- /dev/null +++ b/cyclone-web/app/containers/order/list/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('order-list', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/order/list/index.jsx b/cyclone-web/app/containers/order/list/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..6a90568401b91357e2420c03af2c7b3443a11cde --- /dev/null +++ b/cyclone-web/app/containers/order/list/index.jsx @@ -0,0 +1,61 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import SearchForm from './components/search-form'; +import Table from './components/table'; +import Layout from 'components/layout/page-layout'; + +class Container extends React.Component { + componentDidMount() { + this.props.dispatch({ + type: 'order-list/table-data/get' + }); + this.props.dispatch({ + type: 'order-list/physical-area/get' + }); + this.props.dispatch({ + type: 'order-list/device-categories/get' + }); + } + + componentWillUnmount() { + this.props.dispatch({ + type: 'order-list/table-data/reset' + }); + } + + render() { + const { tableData, physicalArea, deviceCategory } = this.props.data; + return ( + <Layout title='订单管理'> + <SearchForm dispatch={this.props.dispatch}/> + <Table + dispatch={this.props.dispatch} + tableData={tableData} + userInfo={this.props.userInfo} + idc={this.props.idc} + room={this.props.room} + physicalArea={physicalArea} + deviceCategory={deviceCategory} + /> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + data: state.get('order-list').toJS(), + userInfo: state.getIn([ 'global', 'userData' ]).toJS(), + dict: state.getIn([ 'global', 'dict' ]).toJS(), + room: state.getIn([ 'global', 'room' ]).toJS(), + idc: state.getIn([ 'global', 'idc' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/order/list/reducers/index.js b/cyclone-web/app/containers/order/list/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..780e065eefbf5177c3fd0c4534599a2911c12825 --- /dev/null +++ b/cyclone-web/app/containers/order/list/reducers/index.js @@ -0,0 +1,27 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; +import { createRegularReducer } from 'utils/regular-reducer'; + +const initialState = fromJS({ + tableData: createTableStore(), + physicalArea: { + data: [], + loading: false + }, + deviceCategory: { + data: [], + loading: false + } +}); + +const reducer = handleActions( + { + ...createTableReducer('order-list/table-data', 'tableData'), + ...createRegularReducer('order-list/physical-area', 'physicalArea'), + ...createRegularReducer('order-list/device-categories', 'deviceCategory') + }, + initialState, +); + +export default reducer; diff --git a/cyclone-web/app/containers/order/list/sagas/index.js b/cyclone-web/app/containers/order/list/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..ba4ac03925dde97c99383557c46ebdb0b76b15f6 --- /dev/null +++ b/cyclone-web/app/containers/order/list/sagas/index.js @@ -0,0 +1,55 @@ +import { get, getWithArgs } from 'common/xFetch2'; +import { takeEvery } from 'redux-saga'; +import { call, put } from 'redux-saga/effects'; +import { notification } from 'antd'; +import { createTableListSaga } from 'utils/tableList-saga'; + +let created = false; +function* empty() { + yield; +} + +function* defaultSaga() { + const watchers = yield [ + takeEvery('order-list/physical-area/get', getPhysicalArea) + ]; +} + + +import { createTableSaga } from 'utils/table-saga'; +const jobTableSaga = createTableSaga({ + actionNamePrefix: 'order-list/table-data', + tableDataPath: ['order-list', 'tableData'], + datasource: '/api/cloudboot/v1/orders' +}); + +const deviceSaga = createTableListSaga({ + actionNamePrefix: 'order-list/device-categories', + datasource: '/api/cloudboot/v1/device-categories' +}); + +function* getPhysicalArea() { + try { + yield put({ + type: 'order-list/physical-area/load' + }); + const res = yield call(get, `/api/cloudboot/v1/devices/query-params/physical_area`); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + yield put({ + type: 'order-list/physical-area/load/success', + payload: res.content.list + }); + } catch (error) { + console.log(error); + } +} + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [defaultSaga, jobTableSaga, deviceSaga]; +} diff --git a/cyclone-web/app/containers/task/detail/get-component.js b/cyclone-web/app/containers/task/detail/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..89445d599e67b838ba8de982add6fec6e1f7c93a --- /dev/null +++ b/cyclone-web/app/containers/task/detail/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('task-detail', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/task/detail/index.jsx b/cyclone-web/app/containers/task/detail/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..482ca9690ce6a446545bf7606b9947ded0ef9a4d --- /dev/null +++ b/cyclone-web/app/containers/task/detail/index.jsx @@ -0,0 +1,223 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import Layout from 'components/layout/page-layout'; +import { Row, Popover, Icon, Col, Table, Badge, Form } from 'antd'; +import { renderFormDetail, getBreadcrumb } from 'common/utils'; +import { TASK_CATEGORY, BUILTIN, TASK_STATUS, TASK_RATE, ARCH, OPERATION_STATUS_COLOR } from 'common/enums'; +import { getColumns } from 'containers/device/common/colums'; +import { hashHistory } from 'react-router'; +import Crontab from 'components/crontab'; + +class Container extends React.Component { + state = { + id: this.props.params.id + }; + + componentDidMount() { + this.reload(); + } + + reload = () => { + this.props.dispatch({ + type: 'task-detail/detail-info/get', + payload: { id: this.state.id } + }); + }; + + + getColumns = () => { + return [ + { + title: '序列号', + dataIndex: 'sn' + }, + { + title: '机房管理单元', + dataIndex: 'server_room', + render: (text) => { + + return <span>{text.name}</span>; + } + }, + { + title: '机架编号', + dataIndex: 'server_cabinet', + render: (text) => { + if (text && text !== 'null') { + + return <span>{text.number}</span>; + } + } + }, + { + title: '机位编号', + dataIndex: 'server_usite', + render: (text) => { + if (text && text !== 'null') { + return <span>{text.number}</span>; + } + } + }, + { + title: '内网 IP', + dataIndex: 'intranet_ip' + }, + { + title: '外网 IP', + dataIndex: 'extranet_ip' + }, + { + title: '系统', + dataIndex: 'os' + }, + { + title: '用途', + dataIndex: 'usage' + }, + { + title: '设备类型', + dataIndex: 'category' + }, + { + title: '运营状态', + dataIndex: 'operation_status', + render: type => { + const color = OPERATION_STATUS_COLOR[type] ? OPERATION_STATUS_COLOR[type][0] : 'transparent'; + const word = OPERATION_STATUS_COLOR[type] ? OPERATION_STATUS_COLOR[type][1] : ''; + return ( + <div> + <Badge + dot={true} + style={{ + background: color + }} + />{' '} + &nbsp;&nbsp; {word} + </div> + ); + } + } + ]; + }; + render() { + const { detailInfo, device } = this.props.data; + const data = detailInfo.data || {}; + return ( + <Layout> + <div className='page-header page-header-50'> + {getBreadcrumb(this.state.id, 'task/list')} + </div> + <div className='page-body'> + <div className='detail-body' style={{ marginTop: 0 }}> + <h3 className='detail-title'> + 基本信息 + </h3> + <div className='detail-info'> + <Row> + {renderFormDetail([ + { + label: '任务ID', + value: data.id + }, + { + label: '标题', + value: data.title + }, + { + label: '类别', + value: TASK_CATEGORY[data.category] + }, + { + label: '内置', + value: BUILTIN[data.builtin] + }, + { + label: '状态', + value: TASK_STATUS[data.status] + }, + { + label: '执行频率', + value: TASK_RATE[data.rate] + }, + { + label: '创建人', + value: data.creator ? data.creator.name : '' + }, + { + label: '创建时间', + value: data.created_at + }, + { + label: '修改时间', + value: data.updated_at + } + ])} + </Row> + { + data.rate === 'fixed_rate' && <Row> + <Col span={8}> + <span className='panel-label'>cron表达式:</span> + <span className='panel-value'>{data.cron} + { + data.cron_render && + <Popover + placement='right' + title={'查看Crontab表达式详情'} + content={ + <Crontab + initialValue={{ crontab: data.cron, crontabUi: data.cron_render }} + form={this.props.form} + handleClick={() => console.log()} + /> + } + trigger='click' + > + <Icon + type='info-circle-o' + style={{ + fontSize: 16, + color: '#f6ae68', + marginLeft: 8 + }} + /> + </Popover> + } + </span> + </Col> + </Row> + } + </div> + { + data.category === 'inspection' && <div> + <h3 className='detail-title' style={{ marginBottom: 8 }}> + 已选设备 + </h3> + <Table + rowKey={'id'} + columns={this.getColumns()} + pagination={{ showQuickJumper: true, showSizeChanger: true }} + dataSource={device.data} + loading={device.loading} + /> + </div> + } + </div> + </div> + </Layout> + ); + } +} +function mapStateToProps(state) { + return { + data: state.get('task-detail').toJS(), + userInfo: state.getIn([ 'global', 'userData' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Form.create()(Container)); diff --git a/cyclone-web/app/containers/task/detail/reducers/index.js b/cyclone-web/app/containers/task/detail/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..09a8b60a3d06834e1b8349102c6ecb2c37f0049c --- /dev/null +++ b/cyclone-web/app/containers/task/detail/reducers/index.js @@ -0,0 +1,25 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createRegularReducer } from 'utils/regular-reducer'; + +const initialState = fromJS({ + detailInfo: { + loading: false, + data: {} + }, + device: { + loading: false, + data: [] + } +}); + +const reducer = handleActions( + { + ...createRegularReducer('task-detail/detail-info', 'detailInfo'), + ...createRegularReducer('task-detail/devices', 'device') + }, + initialState +); + + +export default reducer; diff --git a/cyclone-web/app/containers/task/detail/sagas/index.js b/cyclone-web/app/containers/task/detail/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..85394eee0f371d169e794030e0fc4ddb473db9aa --- /dev/null +++ b/cyclone-web/app/containers/task/detail/sagas/index.js @@ -0,0 +1,78 @@ +import { get, post, getWithArgs } from 'common/xFetch2'; +import { takeEvery } from 'redux-saga'; +import { call, put } from 'redux-saga/effects'; +import { notification } from 'antd'; + +let created = false; +function* empty() { + yield; +} + + +function* defaultSaga() { + const watchers = yield [ + takeEvery('task-detail/detail-info/get', getDetailInfo) + ]; +} + + +function* getSettings(sns) { + try { + yield put({ + type: 'task-detail/devices/load' + }); + + const res = yield call(getWithArgs, `/api/cloudboot/v1/devices`, { page: 1, page_size: 100, sn: sns }); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + yield put({ + type: 'task-detail/devices/load/success', + payload: res.content.records + }); + } catch (error) { + console.log(error); + } +} + + +function* getDetailInfo(action) { + try { + yield put({ + type: 'task-detail/detail-info/load' + }); + + const res = yield call(get, `/api/cloudboot/v1/jobs/${action.payload.id}`); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + yield put({ + type: 'task-detail/detail-info/load/success', + payload: res.content + }); + + if (res.content.category === 'inspection' && JSON.stringify(res.content.target) !== '{}') { + console.log(res.content.target); + const obj = res.content.target; + let sns = []; + Object.keys(obj).forEach(key => { + obj[key].forEach(sn => { + sns.push(sn); + }); + }); + + yield call(getSettings, sns); + } + } catch (error) { + console.log(error); + } +} + + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [defaultSaga]; +} diff --git a/cyclone-web/app/containers/task/list/actions/action.jsx b/cyclone-web/app/containers/task/list/actions/action.jsx new file mode 100644 index 0000000000000000000000000000000000000000..cfef535af787ded829017bfe35bfc8c822c407d4 --- /dev/null +++ b/cyclone-web/app/containers/task/list/actions/action.jsx @@ -0,0 +1,34 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { put, del } from 'common/xFetch2'; + +export default function action(options) { + const job_id = options.record.id; + const type = options.type; + const typeMap = { + '_pause': { api: `/api/cloudboot/v1/jobs/${job_id}/pausing`, title: '暂停', method: put, okType: 'primary' }, + '_continue': { api: `/api/cloudboot/v1/jobs/${job_id}/unpausing`, title: '继续', method: put, okType: 'primary' }, + '_delete': { api: `/api/cloudboot/v1/jobs/${job_id}`, title: '继续', method: del, okType: 'danger' } + }; + const onSubmit = () => { + typeMap[type].method(typeMap[type].api).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: '操作成功' }); + options.reload(); + }); + }; + + confirm({ + title: `确定要${typeMap[type].title}该任务吗?`, + content: `任务标题:${options.record.title}`, + okText: '确定', + okType: typeMap[type].okType, + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/task/list/actions/index.js b/cyclone-web/app/containers/task/list/actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..99a08875d735048cd2ab2ead2465939a5931a320 --- /dev/null +++ b/cyclone-web/app/containers/task/list/actions/index.js @@ -0,0 +1,9 @@ +import _delete from './action'; +import _continue from './action'; +import _pause from './action'; + +export default { + _delete, + _continue, + _pause +}; diff --git a/cyclone-web/app/containers/task/list/components/search-form.jsx b/cyclone-web/app/containers/task/list/components/search-form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..2890ea43258df0b2b378c49e38ab81819a3214af --- /dev/null +++ b/cyclone-web/app/containers/task/list/components/search-form.jsx @@ -0,0 +1,39 @@ +import React from 'react'; +import SearchForm from 'components/search-form'; +import { getSearchList, BUILTIN, TASK_CATEGORY, TASK_RATE, TASK_STATUS } from 'common/enums'; + +export default class Search extends React.Component { + state = { + searchKeys: [ + { key: 'title', label: '标题' }, + { key: 'builtin', label: '是否内置' }, + { key: 'category', label: '类别' }, + { key: 'rate', label: '执行频率' }, + { key: 'status', label: '状态' } + ], + searchValues: { + 'title': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + 'builtin': { type: 'radio', list: getSearchList(BUILTIN) }, + 'category': { type: 'radio', list: getSearchList(TASK_CATEGORY) }, + 'rate': { type: 'radio', list: getSearchList(TASK_RATE) }, + 'status': { type: 'radio', list: getSearchList(TASK_STATUS) } + } + }; + + onSearch = (values) => { + this.props.dispatch({ + type: 'task-list/table-data/search', + payload: { + ...values + } + }); + }; + + render() { + return ( + <SearchForm onSearch={this.onSearch} searchKeys={this.state.searchKeys} searchValues={this.state.searchValues}/> + ); + } +} + + diff --git a/cyclone-web/app/containers/task/list/components/table.jsx b/cyclone-web/app/containers/task/list/components/table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..74ce3f9df335601feacd906f7cb0ec9119076360 --- /dev/null +++ b/cyclone-web/app/containers/task/list/components/table.jsx @@ -0,0 +1,190 @@ +import React from 'react'; +import { get } from 'common/xFetch2'; +import { + Table, + Pagination, + Badge +} from 'antd'; +import TableControlCell from 'components/TableControlCell'; +import actions from '../actions'; +import { TASK_STATUS_COLOR, TASK_RATE, TASK_CATEGORY, BUILTIN } from 'common/enums'; +import { Link } from 'react-router'; +import { getPermissonBtn } from 'common/utils'; + +class MyTable extends React.Component { + + reload = () => { + this.props.dispatch({ + type: 'task-list/table-data/reload' + }); + }; + + execAction = (name, record) => { + if (actions[name]) { + actions[name]({ + record, + type: name, + reload: () => { + this.reload(); + } + }); + } + }; + + + getColumns = () => { + return [ + { + title: '标题', + dataIndex: 'title', + render: (t, record) => <Link to={`task/detail/${record.id}`}>{t}</Link> + }, + { + title: '是否内置', + dataIndex: 'builtin', + render: (text) => <span className={`yes_no_status ${text === 'yes' ? 'yes_status' : 'no_status'}`}>{BUILTIN[text]}</span> + }, + { + title: '类别', + dataIndex: 'category', + render: (t) => <span>{TASK_CATEGORY[t]}</span> + }, + { + title: '执行频率', + dataIndex: 'rate', + render: (t) => <span>{TASK_RATE[t]}</span> + }, + { + title: '状态', + dataIndex: 'status', + render: (type, record) => { + const color = TASK_STATUS_COLOR[type] ? TASK_STATUS_COLOR[type][0] : 'transparent'; + const word = TASK_STATUS_COLOR[type] ? TASK_STATUS_COLOR[type][1] : type; + return ( + <div> + <Badge + dot={true} + style={{ + background: color + }} + />{' '} + &nbsp;&nbsp; {word} + </div> + ); + } + }, + { + title: '创建人', + dataIndex: 'creator', + render: (t) => <span>{t.name}</span> + }, + { + title: '创建时间', + dataIndex: 'created_at' + }, + { + title: '修改时间', + dataIndex: 'updated_at' + }, + { + title: '操作', + dataIndex: 'manufacturer', + render: (text, record) => { + let commands = [ + { + name: '暂停', + command: '_pause', + disabled: record.rate === 'immediately' || record.status === 'paused' || !getPermissonBtn(this.props.userInfo.permissions, 'button_task_pause') + }, + { + name: '继续', + command: '_continue', + disabled: record.status !== 'paused' || !getPermissonBtn(this.props.userInfo.permissions, 'button_task_continue') + }, + { + name: '删除', + command: '_delete', + type: 'danger', + disabled: record.builtin === 'yes' || !getPermissonBtn(this.props.userInfo.permissions, 'button_task_delete') + } + ]; + return ( + <TableControlCell + commands={commands} + record={record} + execCommand={command => { + this.execAction(command, record); + }} + /> + ); + } + } + ]; + }; + + + changePage = page => { + this.props.dispatch({ + type: `task-list/table-data/change-page`, + payload: { + page + } + }); + }; + + changePageSize = (page, pageSize) => { + this.props.dispatch({ + type: `task-list/table-data/change-page-size`, + payload: { + page, + pageSize + } + }); + }; + + getRowSelection = () => { + const selectedRowKeys = this.props.tableData.selectedRowKeys; + return { + selectedRowKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.props.dispatch({ + type: 'task-list/table-data/set/selectedRows', + payload: { + selectedRowKeys, + selectedRows + } + }); + } + }; + }; + + + render() { + const { tableData } = this.props; + const { loading, pagination } = tableData; + return ( + <div> + <Table + rowKey={'id'} + columns={this.getColumns()} + dataSource={tableData.list} + loading={loading} + pagination={false} + /> + <div> + <Pagination + showQuickJumper={true} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={this.changePageSize} + onChange={this.changePage} + /> + </div> + </div> + ); + } +} + +export default MyTable; diff --git a/cyclone-web/app/containers/task/list/get-component.js b/cyclone-web/app/containers/task/list/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..6f5d5cb93c02eee11a9d15b9c629aa4adcbfe950 --- /dev/null +++ b/cyclone-web/app/containers/task/list/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('task-list', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/task/list/index.jsx b/cyclone-web/app/containers/task/list/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..9d1c0a93edc0e0d8c7d01598b9b1bf22128c06ce --- /dev/null +++ b/cyclone-web/app/containers/task/list/index.jsx @@ -0,0 +1,49 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import SearchForm from './components/search-form'; +import Table from './components/table'; +import Layout from 'components/layout/page-layout'; + +class Container extends React.Component { + componentDidMount() { + this.props.dispatch({ + type: 'task-list/table-data/get' + }); + } + componentWillUnmount() { + this.props.dispatch({ + type: 'task-list/table-data/reset' + }); + } + + render() { + const { tableData } = this.props.data; + return ( + <Layout title='任务管理'> + <SearchForm + dispatch={this.props.dispatch} + /> + <Table + dispatch={this.props.dispatch} + tableData={tableData} + userInfo={this.props.userInfo} + /> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + data: state.get('task-list').toJS(), + userInfo: state.getIn([ 'global', 'userData' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/task/list/reducers/index.js b/cyclone-web/app/containers/task/list/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..d76ce844476760b8d52a5b436b7c535205e605f6 --- /dev/null +++ b/cyclone-web/app/containers/task/list/reducers/index.js @@ -0,0 +1,17 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; + +const initialState = fromJS({ + loading: true, + tableData: createTableStore() +}); + +const reducer = handleActions( + { + ...createTableReducer('task-list/table-data', 'tableData') + }, + initialState, +); + +export default reducer; diff --git a/cyclone-web/app/containers/task/list/sagas/index.js b/cyclone-web/app/containers/task/list/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..9515a9799c65c982e515a6b991f346bbe42ab902 --- /dev/null +++ b/cyclone-web/app/containers/task/list/sagas/index.js @@ -0,0 +1,28 @@ +import { get, post } from 'common/xFetch2'; + +let created = false; +function* empty() { + yield; +} + +import { createTableSaga } from 'utils/table-saga'; + +const jobTableSaga = createTableSaga({ + actionNamePrefix: 'task-list/table-data', + tableDataPath: [ 'task-list', 'tableData' ], + datasource: '/api/cloudboot/v1/jobs', + getExtraQuery: () => { + return { + rate: 'fixed_rate' + }; + } +}); + + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [jobTableSaga]; +} diff --git a/cyclone-web/app/containers/template/hardware/create/component/box.jsx b/cyclone-web/app/containers/template/hardware/create/component/box.jsx new file mode 100644 index 0000000000000000000000000000000000000000..98d10b6e7b2428379a19e3c83e7dc2132ccef053 --- /dev/null +++ b/cyclone-web/app/containers/template/hardware/create/component/box.jsx @@ -0,0 +1,152 @@ +import * as React from 'react'; +import { DragDropContext } from 'react-dnd'; +import HTML5Backend from 'react-dnd-html5-backend'; +import Card from './card'; +const update = require('immutability-helper'); +import { Popover, Button, Radio } from 'antd'; +const RadioGroup = Radio.Group; +import { category, getTempData, getFormData } from './data'; + +@DragDropContext(HTML5Backend) +export default class Container extends React.Component { + constructor(props) { + super(props); + this.moveCard = this.moveCard.bind(this); + this.state = { + value: '', + cards: this.getCardsDone().cards || [] + }; + this.uuid = this.getCardsDone().uuid || 0; + } + + //cards赋值 + getCardsDone = () => { + const cards = this.props.cards || []; + const copyCards = []; + if (cards.length > 0) { + cards.map((card, index) => { + copyCards[index] = getTempData()[card.category]; + if (card.category === 'raid') { + if (card.metadata.controller_index === '0') { + copyCards[index] = getTempData()['raid0']; + } else if (card.metadata.controller_index === '1') { + copyCards[index] = getTempData()['raid1']; + } else if (card.metadata.controller_index === '2') { + copyCards[index] = getTempData()['raid2']; + } else if (card.metadata.controller_index === '3') { + copyCards[index] = getTempData()['raid3']; + } + } + copyCards[index].initialValue = card; + copyCards[index].uuid = index; + }); + this.props.getOrder(copyCards); + } + return { + cards: copyCards, + uuid: cards.length + }; + }; + + onCategoryChange = (e) => { + const value = e.target.value; + const { cards } = this.state; + const pushData = getTempData()[value]; + this.uuid++; + pushData.uuid = this.uuid; + cards.push(pushData); + this.setState({ + value, + cards + }); + this.props.getOrder(cards); + // this.setState({ value: '' }); + }; + + + deleteConfig = (index) => { + const { cards } = this.state; + cards.splice(index, 1); + this.setState({ cards }); + this.props.getOrder(cards); + }; + + copyConfig = (data) => { + // 复制的时候给数据的initialValue赋值表单的值 + const initialValue = getFormData([data], this.props.form.getFieldsValue()); + data.initialValue = initialValue[0]; + const { cards } = this.state; + const copyData = JSON.parse(JSON.stringify(data)); + this.uuid++; + copyData.uuid = this.uuid; + cards.push(copyData); + this.setState({ cards }); + this.props.getOrder(cards); + }; + + handleClick = () => { + this.setState({ value: '' }); + }; + render = () => { + const { cards } = this.state; + const radioStyle = { + display: 'block', + height: '30px', + lineHeight: '30px' + }; + + const content = ( + <RadioGroup onChange={this.onCategoryChange} value={this.state.value}> + { + category.map(data => { + return ( + <Radio style={radioStyle} value={data.value}> + {data.category} + </Radio> + ); + }) + } + </RadioGroup> + ); + + return ( + <div> + {cards.map((card, i) => ( + <Card + key={i} + index={i} + data={card} + moveCard={this.moveCard} + deleteConfig={this.deleteConfig} + copyConfig={this.copyConfig} + form={this.props.form} + dictionaries={this.props.dictionaries} + firmwares={this.props.firmwares} + disabled={this.props.disabled} + /> + ))} + { + !this.props.disabled && + <div className='addConfigBtn'> + <Popover placement='bottom' content={content} trigger='click'> + <Button icon='plus' type='primary' onClick={this.handleClick}>添加配置项</Button> + </Popover> + </div> + } + </div> + ); + }; + + moveCard = (dragIndex, hoverIndex) => { + const { cards } = this.state; + const dragCard = cards[dragIndex]; + this.setState( + update(this.state, { + cards: { + $splice: [[ dragIndex, 1 ], [ hoverIndex, 0, dragCard ]] + } + }), + ); + this.props.getOrder(this.state.cards); + } +} diff --git a/cyclone-web/app/containers/template/hardware/create/component/card.jsx b/cyclone-web/app/containers/template/hardware/create/component/card.jsx new file mode 100644 index 0000000000000000000000000000000000000000..bd03f168cbfbdd530222325613c215640e951cc2 --- /dev/null +++ b/cyclone-web/app/containers/template/hardware/create/component/card.jsx @@ -0,0 +1,131 @@ +import * as React from 'react'; +import { findDOMNode } from 'react-dom'; +import { + DragSource, + DropTarget, + ConnectDropTarget, + ConnectDragSource, + DropTargetMonitor, + DropTargetConnector, + DragSourceConnector, + DragSourceMonitor +} from 'react-dnd'; +import { XYCoord } from 'dnd-core'; +import Template from './template'; + + +const cardSource = { + beginDrag(props) { + return { + data: props.data, + index: props.index + }; + } +}; + +const cardTarget = { + hover(props, monitor, component) { + if (!component) { + return null; + } + const dragIndex = monitor.getItem().index; + const hoverIndex = props.index; + const dragData = props.data; + + // Don't replace items with themselves + if (dragIndex === hoverIndex) { + return; + } + + // Determine rectangle on screen + const hoverBoundingRect = (findDOMNode(component)).getBoundingClientRect(); + + // Get vertical middle + const hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2; + + // Determine mouse position + const clientOffset = monitor.getClientOffset(); + + // Get pixels to the top + const hoverClientY = (clientOffset).y - hoverBoundingRect.top; + + // Only perform the move when the mouse has crossed half of the items height + // When dragging downwards, only move when the cursor is below 50% + // When dragging upwards, only move when the cursor is above 50% + // Dragging downwards + if (dragIndex < hoverIndex && hoverClientY < hoverMiddleY) { + return; + } + + // Dragging upwards + if (dragIndex > hoverIndex && hoverClientY > hoverMiddleY) { + return; + } + + // Time to actually perform the action + props.moveCard(dragIndex, hoverIndex, dragData); + + // Note: we're mutating the monitor item here! + // Generally it's better to avoid mutations, + // but it's good here for the sake of performance + // to avoid expensive index searches. + monitor.getItem().index = hoverIndex; + } +}; + + + +@DropTarget('card', cardTarget, (connect) => ({ + connectDropTarget: connect.dropTarget() +})) +@DragSource( + 'card', + cardSource, + (connect, monitor) => ({ + connectDragSource: connect.dragSource(), + isDragging: monitor.isDragging() + }), +) + +class Card extends React.Component { + render() { + const { + isDragging, + connectDragSource, + connectDropTarget, + disabled + } = this.props; + + const opacity = isDragging ? 0.5 : 1; + + if (disabled) { + return ( + <div style={{ opacity }} className='configure-card'> + <span className='configure-index'>{this.props.index + 1}</span> + <div className='configure-content'> + <Template {...this.props} /> + </div> + <div className='clearfix' /> + </div> + ); + } + return ( + connectDragSource && + connectDropTarget && + <div style={{ opacity }} className='configure-card'> + {connectDragSource( + connectDropTarget( + <span className='configure-index' title='拖动图标可进行排序操作'>{this.props.index + 1}</span> + ), + )} + <div className='configure-content'> + <Template {...this.props} /> + </div> + <div className='clearfix' /> + </div> + + ); + } +} + +export default Card; diff --git a/cyclone-web/app/containers/template/hardware/create/component/data.js b/cyclone-web/app/containers/template/hardware/create/component/data.js new file mode 100644 index 0000000000000000000000000000000000000000..3373052b90d6be4fa96dfcaec2040d294acb6209 --- /dev/null +++ b/cyclone-web/app/containers/template/hardware/create/component/data.js @@ -0,0 +1,658 @@ + +export const category = + [ + { category: 'RAID卡1', value: 'raid0' }, + { category: 'RAID卡2', value: 'raid1' }, + { category: 'RAID卡3', value: 'raid2' }, + { category: 'RAID卡4', value: 'raid3' } + // { "category": "OOB", "value": "oob" }, + // { "category": "BIOS", "value": "bios" }, + // { "category": "FIRMWARE", "value": "firmware" }, + // { "category": "REBOOT", "value": "reboot" } + ]; +export const getTempData = () => { + const raidAction = [ + { value: 'create_array', name: "阵列组" }, + { value: 'set_jbod', name: "直通磁盘列表" }, + { value: 'clear_settings', name: "擦除RAID配置" }, + { value: 'init_disk', name: "初始化逻辑磁盘" }, + { value: 'set_global_hotspare', name: "全局热备磁盘列表" } + ]; + const RAIDList = + { + create_array: { + action: "create_array", + ci: "create_array", + name: "阵列组", + required: true, + type: "list", + children: [ + { + ci: "level", + name: "RAID级别", + required: true, + type: "select", + options: [{ id: "raid0", name: "raid0" }, { id: "raid1", "name": "raid1" }, { + id: "raid5", + "name": "raid5" + }, { id: "raid10", "name": "raid10" }, { id: "raid50", "name": "raid50" }] + }, + { ci: "drives", name: "磁盘列表", required: true, type: "input" } + ] + }, + set_jbod: { + action: "set_jbod", + ci: "drives", + name: "直通磁盘列表", + desc: "直通磁盘名称列表,以逗号分隔", + required: false, + type: "input" + }, + clear_settings: + { + action: "clear_settings", + ci: "clear", + name: "擦除RAID配置", + desc: "是否先擦除raid配置", + required: true, + type: "radio" + }, + init_disk: { + action: "init_disk", + ci: "init", + name: "初始化逻辑磁盘", + desc: "是否初始化逻辑磁盘", + required: true, + type: "radio" + }, + set_global_hotspare: { + action: "set_global_hotspare", + ci: "drives", + name: "全局热备磁盘列表", + desc: "全局热备磁盘id列表,以逗号分隔", + required: true, + type: "input" + } + }; + return { + raid0: { + category: 'raid', + block: 'RAID卡1', + controller_index: '0', + action: raidAction, + metaData: RAIDList, + initialValue: { + category: 'raid', + action: 'create_array', + metadata: { + controller_index: '0', + level: 'raid0', + drives: '' + } + } + }, + raid1: { + category: 'raid', + block: 'RAID卡2', + controller_index: '1', + action: raidAction, + metaData: RAIDList, + initialValue: { + category: 'raid', + action: 'create_array', + metadata: { + controller_index: '1', + level: 'raid0', + drives: '' + } + } + }, + raid2: { + category: 'raid', + block: 'RAID卡3', + controller_index: '2', + action: raidAction, + metaData: RAIDList, + initialValue: { + category: 'raid', + action: 'create_array', + metadata: { + controller_index: '2', + level: 'raid0', + drives: '' + } + } + }, + raid3: { + category: 'raid', + block: 'RAID卡4', + action: raidAction, + controller_index: '3', + metaData: RAIDList, + initialValue: { + category: 'raid', + action: 'create_array', + metadata: { + controller_index: '3', + level: 'raid0', + drives: '' + } + } + }, + oob: { + category: 'oob', + block: '配置项', + action: [ + { name: '网络', value: "set_ip" }, + { name: '用户', value: "add_user" }, + { name: '冷重启', value: "reset_bmc" } + ], + metaData: { + set_ip: { + action: "set_ip", ci: "set_ip", name: "网络", required: true, type: "list", + children: [ + { ci: "ip_src", name: "IP源", required: true, type: "select", options: [{ id: "dhcp", name: "dhcp" }, { id: "static", name: "静态" }] }, + { ci: "ip", name: "管理IP", required: true, type: "input", value: "<{manage_ip}>" }, + { ci: "netmask", name: "管理IP掩码", required: true, type: "input", value: "<{manage_netmask}>" }, + { ci: "gateway", name: "管理IP网关", required: true, type: "input", value: "<{manage_gateway}>" } + ] + }, + add_user: { + action: "add_user", ci: "add_user", name: "用户", required: true, type: "list", + children: [ + { ci: "username", name: "用户名", required: true, type: "input" }, + { ci: "password", name: "用户密码", required: true, type: "input" , inputType: 'password' }, + { ci: "privilege_level", name: "用户权限级别", required: true, type: "select", options: [{ id: "1", name: "1(callback level)" }, { id: "2", name: "2(user level)" }, { id: "3", name: "3(operator level)" }, { id: "4", name: "4(admin level)" }, { id: "5", name: "5(OEM proprietary level)" }] } + ] + }, + reset_bmc: { action: "reset_bmc", ci: "reset", name: "冷重启", desc: "冷重启", required: true, type: "radio" } + }, + initialValue: { + category: 'oob', + action: 'set_ip', + metadata: { + gateway: '<{manage_gateway}>', + ip_src: 'static', + ip: '<{manage_ip}>', + netmask: '<{manage_netmask}>' + } + } + }, + bios: { + category: 'bios', + block: { + type: 'select', + name: 'Custom', + defaultValue: 'Custom', + options: [ + { name: 'Custom', value: 'custom' }, + { name: 'Dell', value: 'Dell' }, + { name: 'HP', value: 'HP' }, + { name: 'H3C', value: 'H3C' } + ] + }, + action: [{ name: '', value: '' }], + metaData: { + 'custom': [ + + ], + "Dell": [ + { + "ci": "ProcVirtualization", + "name": "虚拟化", + "desc": "是否开启虚拟化", + "type": "radio" + }, + { + "ci": "ProcCores", + "name": "每个处理器核心数", + "desc": "每个处理器的核心数量", + "type": "select", + "options": [ + { "id": "1", "name": "1" }, + { "id": "ALL", "name": "全部" } + ] + }, + { + "ci": "ProcX2Apic", + "name": "CPU中断增强", + "type": "radio" + }, + { + "ci": "AcPwrRcvry", + "name": "交流电源恢复(AcPwrRcvry)", + "type": "select", + "options": [ + { "id": "last", "name": "上一次(last)" }, + { "id": "on", "name": "开启(on)" }, + { "id": "off", "name": "关闭(off)" } + ] + }, + { + "ci": "PowerSaver", + "name": "省电模式(PowerSaver)", + "type": "radio" + }, + { + "ci": "SysProfile", + "name": "系统配置文件设置(SysProfile)", + "type": "select", + "options": [ + { "id": "custom", "name": "自定义(custom)" }, + { "id": "PerfOptimized", "name": "最大性能(PerfOptimized)" } + ] + }, + { + "ci": "ProcCStates", + "name": "处理器在C电源状态下运行(ProcCStates)", + "type": "radio" + }, + { + "ci": "ProcPwrPerf", + "name": "处理器电源性能(ProcPwrPerf)", + "type": "select", + "options": [ + { "id": "sysdbpm", "name": "基于系统的电源管理(sysdbpm)" }, + { "id": "osdbpm", "name": "基于OS的电源管理(osdbpm)" }, + { "id": "maxperf", "name": "最大性能的电源管理(maxperf)" }, + { "id": "hwpdbpm", "name": "基于硬件的电源管理(hwpdbpm)" } + ] + }, + { + "ci": "EnergyPerformanceBias", + "name": "电源性能管理(EnergyPerformanceBias)", + "type": "select", + "options": [ + { "id": "maxpower", "name": "最大功率(maxpower)" }, + { "id": "balancedperformance", "name": "性能平衡(balancedperformance)" }, + { "id": "balancedefficiency", "name": "功耗平衡(balancedefficiency)" }, + { "id": "lowpower", "name": "低功耗(lowpower)" } + ] + }, + { + "ci": "SerialComm", + "name": "串行通信(SerialComm)", + "type": "select", + "options": [ + { "id": "onnoconredir", "name": "开启所有串口通信(onnoconredir)" }, + { "id": "onconredirauto", "name": "自识别串口通信(onconredirauto)" }, + { "id": "onconredircom1", "name": "开启com1端口(onconredircom1)" }, + { "id": "onconredircom2", "name": "开启com2端口(onconredircom2)" }, + { "id": "off", "name": "关闭(off)" } + ] + }, + { + "ci": "WriteCache", + "name": "磁盘写缓存(WriteCache)", + "type": "radio" + } + ], + "HP": [ + { + "ci": "CPU_Virtualization", + "name": "CPU虚拟化(CPU_Virtualization)", + "type": "radio" + }, + { + "ci": "Intel_VT-d2", + "name": "I/O虚拟化(Intel_VT-d2)", + "type": "radio" + }, + { + "ci": "Intel_Hyperthreading", + "name": "超线程(Intel_Hyperthreading)", + "type": "radio" + }, + { + "ci": "BIOS_Console", + "name": "BIOS控制台(BIOS_Console)", + "type": "select", + "options": [ + { "id": "Disabled", "name": "关闭(Disabled)" }, + { "id": "Auto", "name": "自适应(Auto)" } + ] + }, + { + "ci": "HP_Power_Regulator", + "name": "HP 功率调节器(HP_Power_Regulator)", + "type": "select", + "options": [ + { "id": "HP_Static_High_Performance_Mode", "name": "HP 静态高性能模式(HP_Static_High_Performance_Mode)" } + ] + }, + { + "ci": "Redundant_Power_Supply_Mode", + "name": "冗余电源模式(Redundant_Power_Supply_Mode)", + "type": "select", + "options": [ + { "id": "High_Efficiency_Even_Standby", "name": "高效模式(偶数电源待机)(High_Efficiency_Even_Standby)" }, + { "id": "Balanced_Mode", "name": "平衡模式(Balanced_Mode)" } + ] + }, + { + "ci": "HW_Prefetch", + "name": "硬件预取(HW_Prefetch)", + "type": "radio" + }, + { + "ci": "Adjacent_Sector_Prefetch", + "name": "相邻扇区预取(Adjacent_Sector_Prefetch)", + "type": "radio" + }, + { + "ci": "Intel_Processor_Core_Disable", + "name": "禁用增强的处理器内核(Intel_Processor_Core_Disable)", + "type": "select", + "options": [ + { "id": "All_Cores_Enabled", "name": "开启所有处理器(All_Cores_Enabled)" } + ] + }, + { + "ci": "Intel_Processor_Turbo_Mode", + "name": "Intel 睿频加速模式(Intel_Processor_Turbo_Mode)", + "type": "radio" + }, + { + "ci": "HP_Power_Profile", + "name": "HP 电源配置文件(HP_Power_Profile)", + "type": "select", + "options": [ + { "id": "Maximum_Performance", "name": "最高性能(Maximum_Performance)" } + ] + }, + { + "ci": "Intel_Minimum_Processor_Idle_Power_State", + "name": "最低处理器空闲电源状态(Intel_Minimum_Processor_Idle_Power_State)", + "type": "select", + "options": [ + { "id": "No_C-States", "name": "无C 状态(No_C-States)" } + ] + }, + { + "ci": "Intel_Turbo_Boost_Optimization", + "name": "Intel 睿频加速优化(Intel_Turbo_Boost_Optimization)", + "type": "select", + "options": [ + { "id": "Optimized_for_Performance", "name": "为性能优za化(Optimized_for_Performance)" } + ] + } + ], + "H3C": [ + { + "ci": "CPU_Virtualization", + "name": "CPU虚拟化(CPU_Virtualization)", + "type": "radio" + }, + { + "ci": "Intel_VT-d2", + "name": "I/O虚拟化(Intel_VT-d2)", + "type": "radio" + }, + { + "ci": "Intel_Hyperthreading", + "name": "超线程(Intel_Hyperthreading)", + "type": "radio" + }, + { + "ci": "BIOS_Console", + "name": "BIOS控制台(BIOS_Console)", + "type": "select", + "options": [ + { "id": "Disabled", "name": "关闭(Disabled)" }, + { "id": "Auto", "name": "自适应(Auto)" } + ] + }, + { + "ci": "HP_Power_Regulator", + "name": "HP 功率调节器(HP_Power_Regulator)", + "type": "select", + "options": [ + { "id": "HP_Static_High_Performance_Mode", "name": "HP 静态高性能模式(HP_Static_High_Performance_Mode)" } + ] + }, + { + "ci": "Redundant_Power_Supply_Mode", + "name": "冗余电源模式(Redundant_Power_Supply_Mode)", + "type": "select", + "options": [ + { "id": "High_Efficiency_Even_Standby", "name": "高效模式(偶数电源待机)(High_Efficiency_Even_Standby)" }, + { "id": "Balanced_Mode", "name": "平衡模式(Balanced_Mode)" } + ] + }, + { + "ci": "HW_Prefetch", + "name": "硬件预取(HW_Prefetch)", + "type": "radio" + }, + { + "ci": "Adjacent_Sector_Prefetch", + "name": "相邻扇区预取(Adjacent_Sector_Prefetch)", + "type": "radio" + }, + { + "ci": "Intel_Processor_Core_Disable", + "name": "禁用增强的处理器内核(Intel_Processor_Core_Disable)", + "type": "select", + "options": [ + { "id": "All_Cores_Enabled", "name": "开启所有处理器(All_Cores_Enabled)" } + ] + }, + { + "ci": "Intel_Processor_Turbo_Mode", + "name": "Intel 睿频加速模式(Intel_Processor_Turbo_Mode)", + "type": "radio" + }, + { + "ci": "HP_Power_Profile", + "name": "HP 电源配置文件(HP_Power_Profile)", + "type": "select", + "options": [ + { "id": "Maximum_Performance", "name": "最高性能(Maximum_Performance)" } + ] + }, + { + "ci": "Intel_Minimum_Processor_Idle_Power_State", + "name": "最低处理器空闲电源状态(Intel_Minimum_Processor_Idle_Power_State)", + "type": "select", + "options": [ + { "id": "No_C-States", "name": "无C 状态(No_C-States)" } + ] + }, + { + "ci": "Intel_Turbo_Boost_Optimization", + "name": "Intel 睿频加速优化(Intel_Turbo_Boost_Optimization)", + "type": "select", + "options": [ + { "id": "Optimized_for_Performance", "name": "为性能优化(Optimized_for_Performance)" } + ] + } + ] + + }, + initialValue: { + category: 'bios', + action: 'set_bios', + metadata: { + manufacturer: 'custom', + custom: 'YES/NO', //老系统字段 + key: '', + value: '' + } + } + }, + firmware: { + category: 'firmware', + block: '', + action: [{ name: '', value: '' }], + metaData: {}, + initialValue: { + category: 'firmware', + action: 'update_package', + metadata: { + file: '', + category: '', + category_desc: '', + expected: '' + } + } + }, + reboot: { + category: 'reboot', + block: 'reboot', + action: [{ name: '', value: '' }], + metaData: {}, + initialValue: { + + } + } + }; +}; + +export const getFormData = (cards, values) => { + const data = []; + cards.map((card, index) => { + switch (card.category) { + case 'raid': + const action = values[`raid-action-${card.uuid}`]; + switch (action) { + case 'create_array': + data[index] = { + category: 'raid', + action: action, + metadata: { + controller_index: card.controller_index, + level: values[`raid-create_array-level-${card.uuid}`], + drives: values[`raid-create_array-drives-${card.uuid}`] + } + }; + break; + case 'set_jbod': + data[index] = { + category: 'raid', + action: action, + metadata: { + controller_index: card.controller_index, + drives: values[`raid-set_jbod-drives-${card.uuid}`] + } + }; + break; + case 'clear_settings': + data[index] = { + category: 'raid', + action: action, + metadata: { + controller_index: card.controller_index, + clear: values[`raid-clear_settings-clear-${card.uuid}`] ? 'ON' : 'OFF' + } + }; + break; + case 'init_disk': + data[index] = { + category: 'raid', + action: action, + metadata: { + controller_index: card.controller_index, + init: values[`raid-init_disk-init-${card.uuid}`] ? 'ON' : 'OFF' + } + }; + break; + case 'set_global_hotspare': + data[index] = { + category: 'raid', + action: action, + metadata: { + controller_index: card.controller_index, + drives: values[`raid-set_global_hotspare-drives-${card.uuid}`] + } + }; + break; + default: + } + break; + case 'oob': + const action_oob = values[`oob-action-${card.uuid}`]; + switch (action_oob) { + case 'set_ip': + data[index] = { + category: 'oob', + action: action_oob, + metadata: { + gateway: values[`oob-set_ip-gateway-${card.uuid}`], + ip_src: values[`oob-set_ip-ip_src-${card.uuid}`], + ip: values[`oob-set_ip-ip-${card.uuid}`], + netmask: values[`oob-set_ip-netmask-${card.uuid}`] + } + }; + break; + case 'add_user': + data[index] = { + category: 'oob', + action: action_oob, + metadata: { + privilege_level: values[`oob-add_user-privilege_level-${card.uuid}`], + username: values[`oob-add_user-username-${card.uuid}`], + password: values[`oob-add_user-password-${card.uuid}`] + } + }; + break; + case 'reset_bmc': + data[index] = { + category: 'oob', + action: action_oob, + metadata: { + category: 'cold', + reset: values[`oob-reset_bmc-reset-${card.uuid}`] ? 'ON' : 'OFF' + } + }; + break; + default: + } + break; + case 'bios': + let key = ''; + const custom = values[`bios-custom-${card.uuid}`]; + if (custom === 'custom') { + key = values[`bios-value-${card.uuid}`]; + } else if (custom === 'Dell') { + key = values[`bios-value-${card.uuid}`] ? 'enable' : 'disable'; + } else { + key = values[`bios-value-${card.uuid}`] ? 'Enabled' : 'Disabled'; + } + data[index] = { + category: 'bios', + action: 'set_bios', + metadata: { + manufacturer: custom, + key: values[`bios-key-${card.uuid}`], + value: key + } + }; + break; + case 'firmware': + const category = JSON.parse(values[`firmware-category-${card.uuid}`] || '{}'); + data[index] = { + category: 'firmware', + action: 'update_package', + metadata: { + file: values[`firmware-file-${card.uuid}`], + category: category.name, + category_desc: category.value, + expected: values[`firmware-expected-${card.uuid}`] + } + }; + break; + case 'reboot': + data[index] = { + category: 'reboot', + action: 'reboot', + metadata: { + } + }; + break; + default: + } + }); + return data; +}; + + diff --git a/cyclone-web/app/containers/template/hardware/create/component/template/index.jsx b/cyclone-web/app/containers/template/hardware/create/component/template/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..9030902b5a4feb34260544831d7de884f9ef9bed --- /dev/null +++ b/cyclone-web/app/containers/template/hardware/create/component/template/index.jsx @@ -0,0 +1,303 @@ +import React from 'react'; +import { Input, Switch, Select, Col, Button, Form } from 'antd'; +const Option = Select.Option; + +const FormItem = Form.Item; +const formItemLayout = { + labelCol: { + xs: { span: 24 }, + sm: { span: 8 } + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 } + } +}; +class Template extends React.Component { + + + render() { + const { getFieldDecorator, getFieldValue } = this.props.form; + const { data, index, disabled } = this.props; + const actions = data.action || []; + const metaData = data.metaData || {}; + + let custom = 'custom'; + let bios_key = {}; + let action = ''; + + //raid,oob action选项联动 + if (data.category === 'raid' || data.category === 'oob') { + action = getFieldValue(`${data.category}-action-${data.uuid}`) || data.initialValue.action; + } + + //bios,key选项联动 + if (data.category === 'bios') { + custom = getFieldValue(`${data.category}-custom-${data.uuid}`) || data.initialValue.metadata.manufacturer || 'custom'; + const key = getFieldValue(`${data.category}-key-${data.uuid}`); + if (custom && custom !== 'custom') { + metaData[custom].map(mapKey => { + if (mapKey.ci === key) { + bios_key = mapKey; + } + }); + } + } + + return ( + <div> + <div className='configure-content'> + <Col span='2'>{data.category.toLocaleUpperCase()}</Col> + + {/*firmware类型时第二列不显示固定文字*/} + { + data.category !== 'firmware' && + <Col span='3'> + {typeof data.block === 'string' ? data.block : + <FormItem> + {getFieldDecorator(`${data.category}-custom-${data.uuid}`, { + initialValue: data.initialValue.metadata.manufacturer || 'custom' + })( + <Select disabled={disabled} style={{ width: '100%' }}> + {data.block.options.map((item, index) => <Option key={index} value={item.value}>{item.name}</Option>)} + </Select> + )} + </FormItem> + } + </Col> + } + + {/*bios类型*/} + { + data.category === 'bios' && (custom === 'custom' ? + (<div><Col span='8'> + <FormItem label='参数名' {...formItemLayout}> + {getFieldDecorator(`${data.category}-key-${data.uuid}`, { + initialValue: data.initialValue.metadata.key, + rules: [{ + required: true, + message: 'key不能为空' + }] + })( + <Input disabled={disabled} /> + )} + </FormItem> + </Col> + <Col span='8'> + <FormItem label='参数值' {...formItemLayout}> + {getFieldDecorator(`${data.category}-value-${data.uuid}`, { + initialValue: data.initialValue.metadata.value, + rules: [{ + required: true, + message: 'value不能为空' + }] + })( + <Input disabled={disabled} /> + )} + </FormItem> + </Col> + </div> + ) : ( + <div><Col span='8'> + <FormItem label='参数名' {...formItemLayout}> + {getFieldDecorator(`${data.category}-key-${data.uuid}`, { + initialValue: data.initialValue.metadata.key, + rules: [{ + required: true, + message: 'key不能为空' + }] + })( + <Select disabled={disabled} style={{ width: '100%' }}> + {(metaData[custom] || []).map((item, index) => <Option key={index} value={item.ci}>{item.name}</Option>)} + </Select> + )} + </FormItem> + </Col> + <Col span='8'> + { + bios_key.type === 'radio' && + <FormItem label='参数值' {...formItemLayout}> + {getFieldDecorator(`${data.category}-value-${data.uuid}`, { + initialValue: data.initialValue.metadata.value === 'enable' || data.initialValue.metadata.value === 'Enabled', + valuePropName: 'checked', + rules: [{ + required: true, + message: 'value不能为空' + }] + })( + <Switch disabled={disabled} checkedChildren={custom === 'Dell' ? 'enable' : 'Enabled'} unCheckedChildren={custom === 'Dell' ? 'disable' : 'Disabled'} /> + )} + </FormItem> + } + { + bios_key.type === 'select' && + <FormItem label='参数值' {...formItemLayout}> + {getFieldDecorator(`${data.category}-value-${data.uuid}`, { + initialValue: data.initialValue.metadata.value, + rules: [{ + required: true, + message: 'value不能为空' + }] + })( + <Select disabled={disabled} style={{ width: '100%' }}> + {(bios_key.options || []).map((item, index) => <Option key={index} value={item.id}>{item.name}</Option>)} + </Select> + )} + </FormItem> + } + </Col> + </div> + )) + } + + {/*firmware类型*/} + { data.category === 'firmware' && + (<div> + <Col span='6'> + <FormItem label='待固件升级包' {...formItemLayout}> + {getFieldDecorator(`${data.category}-file-${data.uuid}`, { + initialValue: data.initialValue.metadata.file, + rules: [{ + required: true, + message: '待固件升级包不能为空' + }] + })( + <Select disabled={disabled} style={{ width: '100%' }} placeholder={'请选择'} > + {(this.props.firmwares || []).map((item, index) => <Option key={index} value={item}>{item}</Option>)} + </Select> + )} + </FormItem> + </Col> + <Col span='6'> + <FormItem label='固件类型' {...formItemLayout}> + {getFieldDecorator(`${data.category}-category-${data.uuid}`, { + initialValue: data.initialValue.metadata.category ? JSON.stringify({ name: data.initialValue.metadata.category, value: data.initialValue.metadata.category_desc }) : '', + rules: [{ + required: true, + message: '固件类型不能为空' + }] + })( + <Select disabled={disabled} style={{ width: '100%' }} placeholder={'请选择'} > + {(this.props.dictionaries || []).map((item, index) => <Option key={index} value={JSON.stringify({ name: item.name, value: item.value })}>{item.name}</Option>)} + </Select> + )} + </FormItem> + </Col> + <Col span='6'> + <FormItem label='固件版本' {...formItemLayout}> + {getFieldDecorator(`${data.category}-expected-${data.uuid}`, { + initialValue: data.initialValue.metadata.expected, + rules: [{ + required: true, + message: '固件版本不能为空' + }] + })( + <Input disabled={disabled} /> + )} + </FormItem> + </Col> + </div> + ) + } + + {/*raid 和 oob 类型显示actions列表*/} + { (data.category === 'raid' || data.category === 'oob') && + <Col span='6'> + <FormItem> + {getFieldDecorator(`${data.category}-action-${data.uuid}`, { + initialValue: data.initialValue.action, + rules: [{ + required: true, + message: ' ' + }] + })( + <Select disabled={disabled} style={{ width: '100%' }} placeholder={'请选择'} > + {actions.map((item, index) => <Option key={index} value={item.value}>{item.name}</Option>)} + </Select> + )} + </FormItem> + </Col> + } + + {/*raid 和 oob 类型显示*/} + { + (data.category === 'raid' || data.category === 'oob') && metaData[action] && metaData[action].type === 'list' && + <Col span='10'> + { metaData[action].children.map((item, index) => { + if (item.type === 'select') { + return <FormItem key={index} label={item.name} {...formItemLayout}> + {getFieldDecorator(`${data.category}-${metaData[action].action}-${item.ci}-${data.uuid}`, { + initialValue: data.initialValue.metadata[item.ci], + rules: [{ + required: item.required, + message: `${item.name}不能为空` + }] + })( + <Select style={{ width: '100%' }} placeholder={item.desc} disabled={disabled} > + {item.options.map((option, index) => + <Option key={index} value={option.id}>{option.name}</Option> + ) + } + </Select> + )} + </FormItem>; + } else if (item.type === 'input') { + return <FormItem label={item.name} {...formItemLayout}> + {getFieldDecorator(`${data.category}-${metaData[action].action}-${item.ci}-${data.uuid}`, { + initialValue: data.initialValue.metadata[item.ci], + rules: [{ + required: item.required, + message: `${item.name}不能为空` + }] + })( + <Input type={item.inputType} placeholder={item.desc} disabled={disabled} /> + )} + </FormItem>; + } + + }) + } + </Col> + } + + { + (data.category === 'raid' || data.category === 'oob') && metaData[action] && metaData[action].type === 'input' && + <Col span='10' > + <FormItem label={metaData[action].name} {...formItemLayout}> + {getFieldDecorator(`${data.category}-${metaData[action].action}-${metaData[action].ci}-${data.uuid}`, { + initialValue: data.initialValue.metadata[metaData[action].ci], + rules: [{ + required: metaData[action].required, + message: `${metaData[action].name}不能为空` + }] + })( + <Input placeholder={metaData[action].desc} disabled={disabled} /> + )} + </FormItem> + </Col> + } + { + (data.category === 'raid' || data.category === 'oob') && metaData[action] && metaData[action].type === 'radio' && + <Col span='10' > + <FormItem label={metaData[action].name} {...formItemLayout}> + {getFieldDecorator(`${data.category}-${metaData[action].action}-${metaData[action].ci}-${data.uuid}`, + { valuePropName: 'checked', + initialValue: data.initialValue.metadata[metaData[action].ci] === 'ON' + })( + <Switch checkedChildren='ON' unCheckedChildren='OFF' disabled={disabled} /> + )} + </FormItem> + </Col> + } + + <Col span='3' className='colFixed'> + {!disabled && <Button icon='copy' type='primary' size='small' style={{ marginRight: 8 }} onClick={() => this.props.copyConfig(data)} />} + {!disabled && <Button icon='delete' type='danger' size='small' onClick={() => this.props.deleteConfig(index)} />} + </Col> + </div> + </div> + ); + } +} + +export default Template; diff --git a/cyclone-web/app/containers/template/hardware/create/get-component.js b/cyclone-web/app/containers/template/hardware/create/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..ce3d886267ca8386fc10d03769becb9f78864bfc --- /dev/null +++ b/cyclone-web/app/containers/template/hardware/create/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('hardware-template-create', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/template/hardware/create/index.jsx b/cyclone-web/app/containers/template/hardware/create/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..32ae10c13ac16d84336fd90bab7cd69255bef4c6 --- /dev/null +++ b/cyclone-web/app/containers/template/hardware/create/index.jsx @@ -0,0 +1,203 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import Layout from 'components/layout/page-layout'; +import { Row, Col, Button, Form, Input, Select, notification, Spin, Alert } from 'antd'; +import { renderFormDetail, getBreadcrumb } from 'common/utils'; +import { PAGE_TYPE } from 'common/enums'; +const FormItem = Form.Item; +const Option = Select.Option; +import { post, put } from 'common/xFetch2'; +import Box from './component/box'; +import { hashHistory } from 'react-router'; +import { getFormData } from './component/data'; + +class Container extends React.Component { + + constructor(props) { + super(props); + this.state = { + cards: null + }; + } + + componentDidMount() { + const { id } = this.props.params; + //获取详情 + if (id === 'new') { + this.props.dispatch({ + type: 'hardware/template/create' + }); + } else { + this.props.dispatch({ + type: 'hardware/template/get', + payload: id + }); + } + + // //获取待固件升级包 + // this.props.dispatch({ + // type: 'hardware/firmwares/get' + // }); + // //获取待固件类型 + // this.props.dispatch({ + // type: 'hardware/dictionaries/get' + // }); + } + + componentWillUnmount() { + this.props.dispatch({ + type: 'hardware/template/clear' + }); + } + + reload = () => { + hashHistory.push('template/hardware/list'); + }; + + //保存 + handleSubmit = () => { + this.props.form.validateFields((err, values) => { + if (err) { + return notification.error({ message: '还有信息未填写完整' }); + } + const data = getFormData(this.state.cards, values); + const postData = { + vendor: values.vendor, + model_name: values.model_name, + name: values.name, + data: data + }; + //新增 编辑 + const { params, location } = this.props; + if (location.pathname.split('/')[3] === 'create') { + post('/api/cloudboot/v1/hardware-templates', postData).then(res => { + if (res.status === 'success') { + notification.success({ message: '新增成功' }); + this.reload(); + } else { + notification.error({ message: res.message }); + } + }); + } else { + put(`/api/cloudboot/v1/hardware-templates/${params.id}`, postData).then(res => { + if (res.status === 'success') { + notification.success({ message: '更新成功' }); + this.reload(); + } else { + notification.error({ message: res.message }); + } + }); + } + + }); + }; + + getOrder = (cards) => { + this.setState({ cards }); + }; + + render() { + const { template, firmwares, dictionaries, location } = this.props; + const { data, loading } = template; + const { getFieldDecorator } = this.props.form; + const pageType = location.pathname.split('/')[3]; + return ( + <Layout> + {getBreadcrumb(PAGE_TYPE[pageType])} + <div className='detail-body'> + <div className='detail-info'> + <Row> + <Form> + <Row gutter={24}> + <Col span={8}> + <FormItem label={'名称'}> + {getFieldDecorator('name', { + initialValue: data.name, + rules: [{ + required: true, + message: '名称不能为空' + }] + })( + <Input disabled={pageType === 'detail'} /> + )} + </FormItem> + </Col> + {/*<Col span={8}>*/} + {/*<FormItem label={'厂商'}>*/} + {/*{getFieldDecorator('vendor', {*/} + {/*initialValue: data.vendor,*/} + {/*rules: [{*/} + {/*required: true,*/} + {/*message: '厂商不能为空'*/} + {/*}]*/} + {/*})(*/} + {/*<Input disabled={pageType === 'detail'} />*/} + {/*)}*/} + {/*</FormItem>*/} + {/*</Col>*/} + {/*<Col span={8}>*/} + {/*<FormItem label={'产品型号'}>*/} + {/*{getFieldDecorator('model_name', {*/} + {/*initialValue: data.model_name,*/} + {/*rules: [{*/} + {/*required: true,*/} + {/*message: '产品型号不能为空'*/} + {/*}]*/} + {/*})(*/} + {/*<Input disabled={pageType === 'detail'} />*/} + {/*)}*/} + {/*</FormItem>*/} + {/*</Col>*/} + </Row> + </Form> + </Row> + </div> + <h3 style={{ marginBottom: 4 }}>配置项</h3> + { + pageType !== 'detail' && + <Alert + message='拖动序号图标可进行排序' + type='info' + showIcon={true} + closable={true} + /> + } + <div className='configure-panel' style={{ marginTop: 8 }}> + { + !loading ? + <Box + form={this.props.form} + getOrder={this.getOrder} + firmwares={firmwares.data} + dictionaries={dictionaries.data} + cards={data.data} + disabled={pageType === 'detail'} + /> : + <Spin /> + } + </div> + <div className='pull-right'> + <Button onClick={this.reload}>取消</Button> + { pageType !== 'detail' && <Button style={{ marginLeft: 8 }} type='primary' onClick={this.handleSubmit}>保存</Button> } + </div> + </div> + </Layout> + ); + } +} +function mapStateToProps(state) { + return { + firmwares: state.get('hardware-template-create').toJS().firmwares, + dictionaries: state.get('hardware-template-create').toJS().dictionaries, + template: state.get('hardware-template-create').toJS().template, + userInfo: state.getIn([ 'global', 'userData' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Form.create()(Container)); diff --git a/cyclone-web/app/containers/template/hardware/create/reducers/index.js b/cyclone-web/app/containers/template/hardware/create/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..2be1efbdc508814f38d4ebd80c333f13ec10aa81 --- /dev/null +++ b/cyclone-web/app/containers/template/hardware/create/reducers/index.js @@ -0,0 +1,41 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; +import { createRegularReducer } from 'utils/regular-reducer'; + +const initialState = fromJS({ + firmwares: { + loading: true, + data: [] + }, + dictionaries: { + loading: true, + data: [] + }, + template: { + loading: true, + data: { + data: [] + } + } +}); + +const reducer = handleActions( + { + ...createRegularReducer('hardware/firmwares', 'firmwares'), + ...createRegularReducer('hardware/dictionaries', 'dictionaries'), + ...createRegularReducer('hardware/template', 'template'), + 'hardware/template/clear': (state, action) => { + return state.setIn([ 'template', 'data' ], fromJS({ data: [] })) + .setIn([ 'template', 'loading' ], true); + }, + 'hardware/template/create': (state, action) => { + return state.setIn([ 'template', 'data' ], fromJS({ data: [] })) + .setIn([ 'template', 'loading' ], false); + } + }, + initialState, +); + + +export default reducer; diff --git a/cyclone-web/app/containers/template/hardware/create/sagas/index.js b/cyclone-web/app/containers/template/hardware/create/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..432bc3b296730a8ddcb38b38efab457974e2e0d0 --- /dev/null +++ b/cyclone-web/app/containers/template/hardware/create/sagas/index.js @@ -0,0 +1,82 @@ +import { get, post } from 'common/xFetch2'; +import { takeEvery } from 'redux-saga'; +import { call, put } from 'redux-saga/effects'; +import { notification } from 'antd'; + +let created = false; +function* empty() { + return; +} + +function* defaultSaga() { + const watchers = yield [ + takeEvery('hardware/firmwares/get', getFirmwares), + takeEvery('hardware/dictionaries/get', getDictionaries), + takeEvery('hardware/template/get', getTemplate) + ]; +} +function* getTemplate(action) { + try { + yield put({ + type: 'hardware/template/load' + }); + + const res = yield call(get, `/api/cloudboot/v1/hardware-templates/${action.payload}`); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + yield put({ + type: 'hardware/template/load/success', + payload: res.content + }); + + } catch (error) { + console.log(error); + } +} +function* getFirmwares(action) { + try { + yield put({ + type: 'hardware/firmwares/load' + }); + + const res = yield call(get, `/api/cloudboot/v1/devices/firmwares/updates/packages`); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + yield put({ + type: 'hardware/firmwares/load/success', + payload: res.content.packages + }); + + } catch (error) { + console.log(error); + } +} +function* getDictionaries(action) { + try { + yield put({ + type: 'hardware/dictionaries/load' + }); + + const res = yield call(get, `/api/cloudboot/v1/dictionaries?type=firmware`); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + yield put({ + type: 'hardware/dictionaries/load/success', + payload: res.content.items + }); + + } catch (error) { + console.log(error); + } +} + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [defaultSaga]; +} diff --git a/cyclone-web/app/containers/template/hardware/list/actions/delete-template.jsx b/cyclone-web/app/containers/template/hardware/list/actions/delete-template.jsx new file mode 100644 index 0000000000000000000000000000000000000000..f3d8a4689de10a08987d4e1c08ac78151ba4b328 --- /dev/null +++ b/cyclone-web/app/containers/template/hardware/list/actions/delete-template.jsx @@ -0,0 +1,28 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { post, del } from 'common/xFetch2'; + +export default function action(options) { + const record = options.record; + const onSubmit = () => { + del(`/api/cloudboot/v1/hardware-templates/${record.id}`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + options.reload(); + }); + }; + + confirm({ + title: `确定要删除硬件配置吗?`, + content: `名称:${record.name} `, + okText: '确定', + okType: 'danger', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/template/hardware/list/actions/index.js b/cyclone-web/app/containers/template/hardware/list/actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..7f3c7e58ea38f6a77c921a92eb44889dc34c1ffc --- /dev/null +++ b/cyclone-web/app/containers/template/hardware/list/actions/index.js @@ -0,0 +1,5 @@ +import deleteTemplate from './delete-template'; + +export default { + deleteTemplate +}; diff --git a/cyclone-web/app/containers/template/hardware/list/components/card.jsx b/cyclone-web/app/containers/template/hardware/list/components/card.jsx new file mode 100644 index 0000000000000000000000000000000000000000..b86142825913cf0e1a403d3ba5105c3df0a87dd6 --- /dev/null +++ b/cyclone-web/app/containers/template/hardware/list/components/card.jsx @@ -0,0 +1,56 @@ +import React from 'react'; +import { get } from 'common/xFetch2'; +import { Card, Icon, Skeleton } from 'antd'; +import { Link } from 'react-router'; +import { getPermissonBtn } from 'common/utils'; + +class MyCard extends React.Component { + + render() { + const { dataSource, loading } = this.props; + return ( + <div className='hardware-card'> + { + dataSource.map(data => { + return ( + <Card + key={data.id} + loading={loading} + extra={(data.builtin === 'yes' || !getPermissonBtn(this.props.userInfo.permissions, 'button_hardware_template_delete')) ? null : <Icon type='close' onClick={() => this.props.execAction('deleteTemplate', data)} />} + title={data.name} + style={{ width: 300 }} + actions={data.builtin === 'yes' ? + [ + <button disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_hardware_template_create')} + onClick={() => this.props.execAction('copyTemplate', data)} + ><Icon type='copy' />克隆</button> + ] : + [ + <button disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_hardware_template_create')} + onClick={() => this.props.execAction('copyTemplate', data)} + ><Icon type='copy' theme='outlined' />克隆</button>, + <button disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_hardware_template_update')} + onClick={() => this.props.execAction('editTemplate', data)} + ><Icon type='edit' />编辑</button> + ] + } + > + {/*<Skeleton loading={loading} active={true} paragraph={true}>*/} + <Link to={`/template/hardware/detail/${data.id}`}> + {/*<p>厂商:{data.vendor}</p>*/} + {/*<p>型号:{data.model_name}</p>*/} + {/*<p>配置内容:{[...new Set((data.data || []).map(d => d.category))].join(' | ')}</p>*/} + <p>创建时间:{data.created_at}</p> + <p>修改时间:{data.updated_at}</p> + </Link> + {/*</Skeleton>*/} + </Card> + ); + }) + } + </div> + ); + } +} + +export default MyCard; diff --git a/cyclone-web/app/containers/template/hardware/list/components/list.jsx b/cyclone-web/app/containers/template/hardware/list/components/list.jsx new file mode 100644 index 0000000000000000000000000000000000000000..4fc668115083993315900b1cebd5e85df02a52a0 --- /dev/null +++ b/cyclone-web/app/containers/template/hardware/list/components/list.jsx @@ -0,0 +1,123 @@ +import React from 'react'; +import { get } from 'common/xFetch2'; +import { + Button, + Pagination +} from 'antd'; +import actions from '../actions'; +import MyTable from './table'; +import MyCard from './card'; +import { hashHistory } from 'react-router'; +import { getPermissonBtn } from 'common/utils'; + +class myList extends React.Component { + + state = { + showCard: true + }; + + reload = () => { + this.props.dispatch({ + type: 'template-hardware-list/table-data/reload' + }); + }; + + execAction = (name, record) => { + if (name === 'copyTemplate') { + hashHistory.push(`/template/hardware/create/${record.id}`); + } else if (name === 'editTemplate') { + hashHistory.push(`/template/hardware/edit/${record.id}`); + } + if (actions[name]) { + actions[name]({ + record, + reload: () => { + this.reload(); + } + }); + } + }; + + changePage = page => { + this.props.dispatch({ + type: `template-hardware-list/table-data/change-page`, + payload: { + page + } + }); + }; + + changePageSize = (page, pageSize) => { + this.props.dispatch({ + type: `template-hardware-list/table-data/change-page-size`, + payload: { + page, + pageSize + } + }); + }; + + render() { + const { tableData } = this.props; + const { loading, pagination } = tableData; + return ( + <div> + <div className='operate_btns'> + <Button + onClick={() => hashHistory.push('template/hardware/create/new')} + icon='plus' + type='primary' + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_hardware_template_create')} + > + 新增配置 + </Button> + <span className='pull-right'> + <Button + onClick={() => this.setState({ showCard: true })} + icon='appstore' + style={{ marginRight: 8, color: this.state.showCard && '#0072ff' }} + > + </Button> + <Button + onClick={() => this.setState({ showCard: false })} + icon='bars' + style={{ color: !this.state.showCard && '#0072ff' }} + > + </Button> + </span> + </div> + <div className='clearfix' /> + { + this.state.showCard ? + <MyCard + dataSource={tableData.list} + loading={loading} + execAction={this.execAction} + userInfo={this.props.userInfo} + /> : + <MyTable + dataSource={tableData.list} + loading={loading} + execAction={this.execAction} + userInfo={this.props.userInfo} + /> + } + <div> + <div className='clearfix' /> + <Pagination + showQuickJumper={true} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={this.changePageSize} + onChange={this.changePage} + showTotal={(total) => `共 ${total} 条`} + /> + </div> + </div> + ); + } +} + +export default myList; diff --git a/cyclone-web/app/containers/template/hardware/list/components/search-form.jsx b/cyclone-web/app/containers/template/hardware/list/components/search-form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..126140d5824783baec8d2a50b8e2db25c158a076 --- /dev/null +++ b/cyclone-web/app/containers/template/hardware/list/components/search-form.jsx @@ -0,0 +1,39 @@ +import React from 'react'; +import SearchForm from 'components/search-form'; + +export default class Search extends React.Component { + state = { + searchKeys: [ + { key: 'name', label: '名称' }, + // { key: 'vendor', label: '厂商' }, + // { key: 'model_name', label: '型号' }, + { key: 'builtin', label: '配置类型' } + ], + searchValues: { + 'name': { type: 'input', placeholder: '查询条件支持英文逗号,空格,换行分隔' }, + // 'vendor': { type: 'input' }, + // 'model_name': { type: 'input' }, + 'builtin': { type: 'radio', list: [ + { value: 'Yes', label: '内置' }, + { value: 'No', label: '自定义' } + ] } + } + }; + + onSearch = (values) => { + this.props.dispatch({ + type: 'template-hardware-list/table-data/search', + payload: { + ...values + } + }); + }; + + render() { + return ( + <SearchForm onSearch={this.onSearch} searchKeys={this.state.searchKeys} searchValues={this.state.searchValues}/> + ); + } +} + + diff --git a/cyclone-web/app/containers/template/hardware/list/components/table.jsx b/cyclone-web/app/containers/template/hardware/list/components/table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..808a2843234a17a99f880822b86fb0362e831085 --- /dev/null +++ b/cyclone-web/app/containers/template/hardware/list/components/table.jsx @@ -0,0 +1,103 @@ +import React from 'react'; +import { get } from 'common/xFetch2'; +import { + Table +} from 'antd'; +import { Link } from 'react-router'; +import TableControlCell from 'components/TableControlCell'; +import { getPermissonBtn } from 'common/utils'; + +class MyTable extends React.Component { + + getColumns = () => { + return [ + { + title: '名称', + dataIndex: 'name', + render: (text, record) => { + return <Link to={`/template/hardware/detail/${record.id}`}>{text}</Link>; + } + }, + // { + // title: '厂商', + // dataIndex: 'vendor', + // width: 200 + // }, + // { + // title: '产品型号', + // dataIndex: 'model_name', + // width: 200 + // }, + // { + // title: '配置内容', + // dataIndex: 'data_config', + // width: 200, + // render: (text, record) => { + // const data = record.data || []; + // return <span>{[...new Set(data.map(d => d.category))].join(' | ')}</span>; + // } + // }, + { + title: '创建时间', + dataIndex: 'created_at' + }, + { + title: '修改时间', + dataIndex: 'updated_at' + }, + { + title: '操作', + dataIndex: 'operation', + render: (text, record) => { + let commands = [ + { + name: '克隆', + command: 'copyTemplate', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_hardware_template_create') + }, + { + name: '修改', + command: 'editTemplate', + disabled: record.builtin === 'yes' || !getPermissonBtn(this.props.userInfo.permissions, 'button_hardware_template_update') + , + message: '系统内置' + }, + { + name: '删除', + command: 'deleteTemplate', + type: 'danger', + disabled: record.builtin === 'yes' || !getPermissonBtn(this.props.userInfo.permissions, 'button_hardware_template_delete'), + message: '系统内置' + } + ]; + return ( + <TableControlCell + commands={commands} + record={record} + execCommand={command => { + this.props.execAction(command, record); + }} + /> + ); + } + } + ]; + }; + + render() { + const { dataSource, loading } = this.props; + return ( + <div> + <Table + rowKey={'id'} + columns={this.getColumns()} + dataSource={dataSource} + loading={loading} + pagination={false} + /> + </div> + ); + } +} + +export default MyTable; diff --git a/cyclone-web/app/containers/template/hardware/list/get-component.js b/cyclone-web/app/containers/template/hardware/list/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..d9787110a218bced9e9b8711987cd1fba143d4c8 --- /dev/null +++ b/cyclone-web/app/containers/template/hardware/list/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('template-hardware-list', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/template/hardware/list/index.jsx b/cyclone-web/app/containers/template/hardware/list/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..d3caab7795d1b2f9e9763712decbf7e035330d94 --- /dev/null +++ b/cyclone-web/app/containers/template/hardware/list/index.jsx @@ -0,0 +1,50 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import SearchForm from './components/search-form'; +import List from './components/list'; +import Layout from 'components/layout/page-layout'; + +class Container extends React.Component { + componentDidMount() { + this.props.dispatch({ + type: 'template-hardware-list/table-data/get' + }); + } + + componentWillUnmount() { + this.props.dispatch({ + type: 'template-hardware-list/table-data/reset' + }); + } + + render() { + const { tableData } = this.props.data; + return ( + <Layout title='硬件配置'> + <SearchForm + dispatch={this.props.dispatch} + /> + <List + dispatch={this.props.dispatch} + tableData={tableData} + userInfo={this.props.userInfo} + /> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + data: state.get('template-hardware-list').toJS(), + userInfo: state.getIn([ 'global', 'userData' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/template/hardware/list/reducers/index.js b/cyclone-web/app/containers/template/hardware/list/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..aa9645bd5ad57ce87c8055196bf37412bb6b85e7 --- /dev/null +++ b/cyclone-web/app/containers/template/hardware/list/reducers/index.js @@ -0,0 +1,17 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; + +const initialState = fromJS({ + loading: true, + tableData: createTableStore() +}); + +const reducer = handleActions( + { + ...createTableReducer('template-hardware-list/table-data', 'tableData') + }, + initialState, +); + +export default reducer; diff --git a/cyclone-web/app/containers/template/hardware/list/sagas/index.js b/cyclone-web/app/containers/template/hardware/list/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..bc78192788a53570af6f99cbfaef12dd37173c41 --- /dev/null +++ b/cyclone-web/app/containers/template/hardware/list/sagas/index.js @@ -0,0 +1,23 @@ +import { get, post } from 'common/xFetch2'; + +let created = false; +function* empty() { + console.log(); +} + +import { createTableSaga } from 'utils/table-saga'; + +const tableSaga = createTableSaga({ + actionNamePrefix: 'template-hardware-list/table-data', + tableDataPath: [ 'template-hardware-list', 'tableData' ], + datasource: '/api/cloudboot/v1/hardware-templates' +}); + + +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [tableSaga]; +} diff --git a/cyclone-web/app/containers/template/system/actions/index.js b/cyclone-web/app/containers/template/system/actions/index.js new file mode 100644 index 0000000000000000000000000000000000000000..144aee208cbb90563a0fc5e70b5933c4e359e20a --- /dev/null +++ b/cyclone-web/app/containers/template/system/actions/index.js @@ -0,0 +1,24 @@ +import addSystem from './system/system'; +import editSystem from './system/system'; +import copySystem from './system/system'; +import deleteSystem from './system/delete-system'; +import systemDetail from './system/system-detail'; + +import addMirror from './mirror/mirror'; +import editMirror from './mirror/mirror'; +import copyMirror from './mirror/mirror'; +import deleteMirror from './mirror/delete-mirror'; +import mirrorDetail from './mirror/mirror-detail'; + +export default { + addSystem, + editSystem, + copySystem, + deleteSystem, + systemDetail, + addMirror, + editMirror, + copyMirror, + deleteMirror, + mirrorDetail +}; diff --git a/cyclone-web/app/containers/template/system/actions/mirror/delete-mirror.jsx b/cyclone-web/app/containers/template/system/actions/mirror/delete-mirror.jsx new file mode 100644 index 0000000000000000000000000000000000000000..335bc1be0c22441ec19885c102c17946fac0b2d4 --- /dev/null +++ b/cyclone-web/app/containers/template/system/actions/mirror/delete-mirror.jsx @@ -0,0 +1,29 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { del } from 'common/xFetch2'; + +export default function action(options) { + const record = options.record; + + const onSubmit = () => { + del(`/api/cloudboot/v1/image-templates/${record.id}`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + options.reload(); + }); + }; + + confirm({ + title: `确定要删除镜像配置吗?`, + content: `名称:${record.name} `, + okText: '确定', + okType: 'danger', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/template/system/actions/mirror/disks.jsx b/cyclone-web/app/containers/template/system/actions/mirror/disks.jsx new file mode 100644 index 0000000000000000000000000000000000000000..6fe6b76d12cb29f099376e49371775b2f9521e06 --- /dev/null +++ b/cyclone-web/app/containers/template/system/actions/mirror/disks.jsx @@ -0,0 +1,167 @@ +import React from 'react'; +import { Button, Col, Row, Form, Input, Select, Icon } from 'antd'; +const FormItem = Form.Item; +import { formItemLayout, tailFormItemLayout, tableFormItemLayout } from 'common/enums'; +const Option = Select.Option; + +export default class Disks extends React.Component { + constructor(props) { + super(props); + this.state = { + disks: [], + loading: true + }; + } + componentDidMount() { + const { disks } = this.props; + if (disks && disks.length > 0) { + this.setState({ + disks: disks, + loading: false + }); + } + } + addDisks = () => { + this.setState({ + disks: this.props.initDisks, + loading: false + }); + const { setFieldsValue } = this.props.form; + setFieldsValue({ disks: this.props.initDisks }); + }; + deleteDisk = (index) => { + const { disks } = this.state; + disks.splice(index, 1); + this.setState({ disks }); + }; + copyDisk = (data) => { + const { disks } = this.state; + const copyData = JSON.parse(JSON.stringify(data)); + disks.push(copyData); + this.setState({ disks }); + }; + copyDiskPart = (data, index) => { + const { disks } = this.state; + const copyData = JSON.parse(JSON.stringify(data)); + disks[index].partitions.push(copyData); + this.setState({ disks }); + }; + deleteDiskPart = (part_index, index) => { + const { disks } = this.state; + disks[index].partitions.splice(part_index, 1); + this.setState({ disks }); + }; + render() { + const { disabled, form } = this.props; + const { disks, loading } = this.state; + const { getFieldDecorator } = form; + return ( + <div> + { + !disks || (disks || []).length === 0 && + <Button icon='plus' onClick={() => this.addDisks()}>添加</Button> + } + { + !loading && (disks || []).map((item, index) => { + return ( + <div className='disk-panel'> + <div className='disk'> + <Row className='disk-header'> + <Col span='20' > + <FormItem {...formItemLayout} label='磁盘名称'> + {getFieldDecorator(`diskParams-diskName-${index}`, { + initialValue: item.name, + rules: [{ + required: true, + message: ' ' + }] + })(<Input placeholder='请填写磁盘名称' disabled={disabled} />)} + </FormItem> + </Col> + <Col span='4' className='col-right'> + {!disabled && + <Icon type='copy' theme='outlined' style={{ marginRight: 8, color: '#108ee9' }} onClick={() => this.copyDisk(item)} /> + } + {!disabled && index !== 0 && + <Icon type='close' theme='outlined' style={{ color: '#ff3700' }} onClick={() => this.deleteDisk(index)} />} + </Col> + </Row> + <Row className='disk-table-header'> + <Col span='5'>名称</Col> + <Col span='5'>大小</Col> + <Col span='5'>文件系统类型</Col> + <Col span='5'>挂载点</Col> + <Col span='4' /> + </Row> + { + (item.partitions || []).map((part, part_index) => { + return ( + <Row className='disk-table-body'> + <Col span='5'> + <FormItem {...tableFormItemLayout}> + {getFieldDecorator(`diskParams-name-${index}-${part_index}`, { + initialValue: part.name, + rules: [{ + required: true, + message: ' ' + }] + })(<Input placeholder='请填写名称' disabled={disabled} />)} + </FormItem> + </Col> + <Col span='5'> + <FormItem {...tableFormItemLayout}> + {getFieldDecorator(`diskParams-size-${index}-${part_index}`, { + initialValue: part.size, + rules: [{ + required: true, + message: ' ' + }] + })(<Input placeholder='请填写大小' disabled={disabled} />)} + </FormItem> + </Col> + <Col span='5'> + <FormItem {...tableFormItemLayout}> + {getFieldDecorator(`diskParams-fstype-${index}-${part_index}`, { + initialValue: part.fstype, + rules: [{ + required: true, + message: ' ' + }] + })(<Select placeholder='请选择文件系统类型' disabled={disabled}> + <Option value='ext3'>ext3</Option> + <Option value='ext4'>ext4</Option> + <Option value='xfs'>xfs</Option> + <Option value='swap'>swap</Option> + <Option value='ntfs'>ntfs</Option> + <Option value='vfat'>vfat</Option> + </Select>)} + </FormItem> + </Col> + <Col span='5'> + <FormItem {...tableFormItemLayout}> + {getFieldDecorator(`diskParams-mountpoint-${index}-${part_index}`, { + initialValue: part.mountpoint, + rules: [{ + required: true, + message: ' ' + }] + })(<Input placeholder='请填写挂载点' disabled={disabled} />)} + </FormItem> + </Col> + <Col span='4' className='col-right'> + {!disabled && <Button size='small' icon='copy' style={{ marginRight: 8, color: '#108ee9' }} onClick={() => this.copyDiskPart(part, index)} />} + {!disabled && <Button type='danger' disabled={part_index === 0} size='small' icon='delete' onClick={() => this.deleteDiskPart(part_index, index)} />} + </Col> + </Row> + ); + }) + } + </div> + </div> + ); + }) + } + </div> + ); + } +} diff --git a/cyclone-web/app/containers/template/system/actions/mirror/form.jsx b/cyclone-web/app/containers/template/system/actions/mirror/form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..56e8948a8967cd7315f5e6c663f328a20bfe53ad --- /dev/null +++ b/cyclone-web/app/containers/template/system/actions/mirror/form.jsx @@ -0,0 +1,302 @@ +import React from 'react'; +import { post, get, getWithArgs, put } from 'common/xFetch2'; +import { + Form, + Button, + notification, + Input, + Radio, + Select +} from 'antd'; +const FormItem = Form.Item; +import { formItemLayout, tailFormItemLayout } from 'common/enums'; +import Disk from './disks'; +const Option = Select.Option; + + +class MyForm extends React.Component { + constructor(props) { + super(props); + this.pre_editor = null; + this.post_editor = null; + this.state = { + initialValue: {}, + disks: [] + }; + } + componentWillUnmount() { + this.pre_editor = null; + this.post_editor = null; + } + + componentDidMount() { + this.initEditorValue(); + } + + + initEditorValue = () => { + const options = { + lineNumbers: true, + mode: 'shell', + readOnly: false, + autoMatchParens: true, + wordWrap: 'break-word', + textWrapping: true, + styleActiveLine: true, + scrollbarStyle: 'native', + addModeClass: true, + showCursorWhenSelecting: true + }; + if ($('#preScript')[0]) { + let editor = CodeMirror.fromTextArea($('#preScript')[0], options); + if (this.props.type !== 'addMirror') { + editor.setValue(this.props.initialValue.pre_script); + } + editor.setSize('auto', 250); + this.pre_editor = editor; + } + if ($('#postScript')[0]) { + let editor = CodeMirror.fromTextArea($('#postScript')[0], options); + editor.setSize('auto', 250); + if (this.props.type !== 'addMirror') { + editor.setValue(this.props.initialValue.post_script); + } + this.post_editor = editor; + } + }; + + handleSubmit = ev => { + ev && ev.preventDefault(); + ev && ev.stopPropagation(); + + const { setFieldsValue } = this.props.form; + const pre_value = this.pre_editor.getValue(); + const post_value = this.post_editor.getValue(); + setFieldsValue({ pre_script: pre_value, post_script: post_value }); + + this.props.form.validateFields({ force: true }, (error, values) => { + + const diskKeys = Object.keys(values); + const fieldParamsKeys = diskKeys.filter( + key => key.indexOf('diskParams-diskName') >= 0 + ); + const disks = fieldParamsKeys.map(key => { + const id = key.replace('diskParams-diskName-', ''); + const sizeParamsKeys = diskKeys.filter( + key => key.indexOf(`diskParams-size-${id}`) >= 0 + ); + + const partitions = sizeParamsKeys.map(sizeKey => { + const partId = sizeKey.replace(`diskParams-size-${id}-`, ''); + return { + size: values[`diskParams-size-${id}-${partId}`], + fstype: values[`diskParams-fstype-${id}-${partId}`], + mountpoint: values[`diskParams-mountpoint-${id}-${partId}`], + name: values[`diskParams-name-${id}-${partId}`] + }; + }); + return { + name: values[`diskParams-diskName-${id}`], + partitions: partitions + }; + }); + + const data = { + family: values.family, + boot_mode: values.boot_mode, + arch: values.arch, + os_lifecycle: values.os_lifecycle, + name: values.name, + url: values.url, + username: values.username, + password: values.password, + disks: disks, + pre_script: values.pre_script, + post_script: values.post_script + }; + + if (error) { + notification.warning({ + message: '还有未填写完整的选项' + }); + return; + } + this.props.onSubmit(data); + }); + }; + + render() { + const { osFamily, showSubmit, initialValue } = this.props; + const { getFieldDecorator } = this.props.form; + + return ( + <div> + <Form onSubmit={this.handleSubmit}> + <FormItem {...formItemLayout} label='操作系统' hasFeedback={true}> + {getFieldDecorator('family', { + initialValue: initialValue.family, + rules: [ + { + required: true, + message: '请选择操作系统' + } + ] + })(<Select disabled={!showSubmit}> + { + !osFamily.loading && + osFamily.data.map((os, index) => <Option value={os.name} key={os.name}>{os.name}</Option>) + } + </Select>)} + </FormItem> + + <FormItem {...formItemLayout} label='名称' hasFeedback={true}> + {getFieldDecorator('name', { + initialValue: initialValue.name, + rules: [ + { + required: true, + message: '请输入名称' + } + ] + })( + <Input disabled={!showSubmit} /> + )} + </FormItem> + <FormItem {...formItemLayout} label='启动模式'> + {getFieldDecorator('boot_mode', { + initialValue: initialValue.boot_mode, + rules: [ + { + required: true, + message: '请选择启动模式' + } + ] + })( + <Radio.Group disabled={!showSubmit}> + <Radio value='legacy_bios'>BIOS</Radio> + <Radio value='uefi'>UEFI</Radio> + </Radio.Group> + )} + </FormItem> + <FormItem {...formItemLayout} label='架构'> + {getFieldDecorator('arch', { + initialValue: initialValue.arch, + rules: [ + { + required: true, + message: '请选择架构' + } + ] + })( + <Radio.Group disabled={!showSubmit}> + <Radio value='x86_64'>x86_64</Radio> + <Radio value='aarch64'>aarch64</Radio> + </Radio.Group> + )} + </FormItem> + <FormItem {...formItemLayout} label='生命周期'> + {getFieldDecorator('os_lifecycle', { + initialValue: initialValue.os_lifecycle, + rules: [ + { + required: true, + message: '请选择生命周期' + } + ] + })( + <Radio.Group disabled={!showSubmit}> + <Radio value='testing'>Testing</Radio> + <Radio value='active_default'>Active(Default)</Radio> + <Radio value='active'>Active</Radio> + <Radio value='containment'>Containment</Radio> + <Radio value='end_of_life'>EOL</Radio> + </Radio.Group> + )} + </FormItem> + <FormItem {...formItemLayout} label='镜像下载地址' hasFeedback={true}> + {getFieldDecorator('url', { + initialValue: initialValue.url, + rules: [ + { + required: true, + message: '请输入镜像下载地址' + } + ] + })( + <Input disabled={!showSubmit} /> + )} + </FormItem> + <FormItem {...formItemLayout} label='用户名' hasFeedback={true}> + {getFieldDecorator('username', { + initialValue: initialValue.username + })(<Input disabled={!showSubmit} />)} + </FormItem> + <FormItem {...formItemLayout} label='密码' hasFeedback={true}> + {getFieldDecorator('password', { + initialValue: initialValue.password + })(<Input disabled={!showSubmit} type='password' />)} + </FormItem> + <FormItem {...formItemLayout} label='分区方案'> + {getFieldDecorator('disks', { + initialValue: initialValue.disks, + rules: [ + { + required: true, + message: '分区方案不能为空' + } + ] + })( + <Disk initDisks={this.props.initDisks} disabled={!showSubmit} disks={initialValue.disks} form={this.props.form} /> + )} + </FormItem> + + <FormItem {...formItemLayout} label='前置脚本'> + {getFieldDecorator('pre_script', { + initialValue: initialValue.pre_script + })( + <div style={{ border: '1px solid #d9d9d9', marginBottom: '1px' }}> + <textarea + disabled={!showSubmit} + id={'preScript'} + style={{ width: '100%', marginTop: '1px', marginBottom: '1px' }} + /> + </div> + )} + </FormItem> + + <FormItem {...formItemLayout} label='后置脚本'> + {getFieldDecorator('post_script', { + initialValue: initialValue.post_script + })( + <div style={{ border: '1px solid #d9d9d9', marginBottom: '1px' }}> + <textarea + disabled={!showSubmit} + id={'postScript'} + style={{ width: '100%', marginTop: '1px', marginBottom: '1px' }} + /> + </div> + )} + </FormItem> + + <FormItem {...tailFormItemLayout}> + <div className='pull-right'> + <Button onClick={() => this.props.onCancel()}>取消</Button> + { + showSubmit && + <Button + style={{ marginLeft: 8 }} + type='primary' + htmlType='submit' + > + 提交 + </Button> + } + </div> + </FormItem> + </Form> + </div> + ); + } +} + +export default Form.create()(MyForm); diff --git a/cyclone-web/app/containers/template/system/actions/mirror/mirror-detail.jsx b/cyclone-web/app/containers/template/system/actions/mirror/mirror-detail.jsx new file mode 100644 index 0000000000000000000000000000000000000000..3fc76a2b139b9444fc030658e73e521c0a608d95 --- /dev/null +++ b/cyclone-web/app/containers/template/system/actions/mirror/mirror-detail.jsx @@ -0,0 +1,34 @@ +import React from 'react'; +import Popup from 'components/popup/draw'; +import { get } from 'common/xFetch2'; +import MyForm from './form'; +import { notification } from 'antd'; + +export default async function action(options) { + //使用接口方便其他入口使用 + const res = await get(`/api/cloudboot/v1/image-templates/${options.record.id}`); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + const initialValue = res.content; + + Popup.open({ + title: '查看镜像配置详情', + onCancel: () => { + Popup.close(); + }, + content: ( + <div> + <MyForm + initialValue={initialValue} + {...options} + id={options.record.id} + showSubmit={false} + onCancel={() => { + Popup.close(); + }} + /> + </div> + ) + }); +} diff --git a/cyclone-web/app/containers/template/system/actions/mirror/mirror.jsx b/cyclone-web/app/containers/template/system/actions/mirror/mirror.jsx new file mode 100644 index 0000000000000000000000000000000000000000..7669dcfc8c1a1617e03c0561f6ba96ea0331ad8a --- /dev/null +++ b/cyclone-web/app/containers/template/system/actions/mirror/mirror.jsx @@ -0,0 +1,62 @@ +import React from 'react'; +import Popup from 'components/popup'; +import { post, put } from 'common/xFetch2'; +import { notification } from 'antd'; +import MyForm from './form'; +const initDisks = [ + { "name": "/dev/sda", + "partitions": [{ "name": "/dev/sda1", "size": "256", "fstype": "ext4", "mountpoint": "/boot" }, + { "name": "/dev/sda2", "size": "51200", "fstype": "ext4", "mountpoint": "/" }, + { "name": "/dev/sda3", "size": "2048", "fstype": "swap", "mountpoint": "swap" }, + { "name": "/dev/sda4", "size": "free", "fstype": "ext4", "mountpoint": "/home" }] }, + { "name": "/dev/sdb", + "partitions": [{ "name": "/dev/sdb1", "size": "free", "fstype": "ext4", "mountpoint": "/disk1" }] } +]; + +export default function action(options) { + const record = options.record; + const typeMap = { + addMirror: { title: '新增镜像配置', api: '/api/cloudboot/v1/image-templates', method: post }, + editMirror: { title: '编辑镜像配置', api: `/api/cloudboot/v1/image-templates/${record.id}`, method: put }, + copyMirror: { title: '新增镜像配置', api: '/api/cloudboot/v1/image-templates', method: post } + }; + let initialValue = options.record; + + if (options.type === 'addMirror') { + initialValue.disks = initDisks; + } + + const onSubmit = (values) => { + typeMap[options.type].method(typeMap[options.type].api, values).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + Popup.close(); + options.reload(); + }); + }; + + Popup.open({ + title: `${typeMap[options.type].title}`, + width: 800, + onCancel: () => { + Popup.close(); + }, + content: ( + <div> + <MyForm + {...options} + initialValue={initialValue} + id={options.record.id} + showSubmit={true} + initDisks={initDisks} + onSubmit={(values) => onSubmit(values)} + onCancel={() => { + Popup.close(); + }} + /> + </div> + ) + }); +} diff --git a/cyclone-web/app/containers/template/system/actions/system/delete-system.jsx b/cyclone-web/app/containers/template/system/actions/system/delete-system.jsx new file mode 100644 index 0000000000000000000000000000000000000000..b2848173b8999039b501a6da0d44ad4b0a63edf9 --- /dev/null +++ b/cyclone-web/app/containers/template/system/actions/system/delete-system.jsx @@ -0,0 +1,29 @@ +import React from 'react'; +import { Modal, notification } from 'antd'; +const confirm = Modal.confirm; +import { del } from 'common/xFetch2'; + +export default function action(options) { + const record = options.record; + + const onSubmit = () => { + del(`/api/cloudboot/v1/system-templates/${record.id}`).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + options.reload(); + }); + }; + + confirm({ + title: `确定要删除PXE配置吗?`, + content: `名称:${record.name} `, + okText: '确定', + okType: 'danger', + cancelText: '取消', + onOk() { + onSubmit(); + } + }); +} diff --git a/cyclone-web/app/containers/template/system/actions/system/form.jsx b/cyclone-web/app/containers/template/system/actions/system/form.jsx new file mode 100644 index 0000000000000000000000000000000000000000..0f9b677bb62d005d7e3b953c39c45b65eb6f2ab4 --- /dev/null +++ b/cyclone-web/app/containers/template/system/actions/system/form.jsx @@ -0,0 +1,260 @@ +import React from 'react'; +import { post, get, getWithArgs, put } from 'common/xFetch2'; +import { + Form, + Button, + notification, + Input, + Radio, + Select +} from 'antd'; +const FormItem = Form.Item; +import { formItemLayout, tailFormItemLayout } from 'common/enums'; +const Option = Select.Option; + +class MyForm extends React.Component { + constructor(props) { + super(props); + this.pxe_editor = null; + this.sys_editor = null; + this.state = { + initialValue: {} + }; + } + + componentDidMount() { + this.initEditorValue(); + } + + componentWillUnmount() { + this.pxe_editor = null; + this.sys_editor = null; + } + + initEditorValue = () => { + const options = { + lineNumbers: true, + mode: 'shell', + lineWrapping: false, + readOnly: false, + autoMatchParents: true, + wordWrap: 'break-word', + textWrapping: true, + styleActiveLine: true, + addModeClass: true, + showCursorWhenSelecting: true + }; + if ($('#pxeScript')[0]) { + let editor = CodeMirror.fromTextArea($('#pxeScript')[0], { ...options, autofocus: true }); + if (this.props.type !== 'addSystem') { + editor.setValue(this.props.initialValue.pxe); + } + editor.setSize('auto', 250); + this.pxe_editor = editor; + } + if ($('#sysScript')[0]) { + let editor = CodeMirror.fromTextArea($('#sysScript')[0], options); + if (this.props.type !== 'addSystem') { + editor.setValue(this.props.initialValue.content); + } + editor.setSize('auto', 250); + this.sys_editor = editor; + } + }; + + + handleSubmit = ev => { + ev && ev.preventDefault(); + ev && ev.stopPropagation(); + const { setFieldsValue } = this.props.form; + const pxe_value = this.pxe_editor.getValue(); + const sys_value = this.sys_editor.getValue(); + setFieldsValue({ pxe: pxe_value, content: sys_value }); + this.props.form.validateFields({ force: true }, (error, values) => { + if (error) { + notification.warning({ + message: '还有未填写完整的选项' + }); + return; + } + this.props.onSubmit(values); + }); + }; + + render() { + const { osFamily, showSubmit, initialValue } = this.props; + const { getFieldDecorator } = this.props.form; + + return ( + <div> + <Form onSubmit={this.handleSubmit}> + <FormItem {...formItemLayout} label='操作系统' hasFeedback={true}> + {getFieldDecorator('family', { + initialValue: initialValue.family, + rules: [ + { + required: true, + message: '请选择操作系统' + } + ] + })(<Select disabled={!showSubmit}> + { + !osFamily.loading && + osFamily.data.map((os, index) => <Option value={os.name} key={os.name}>{os.name}</Option>) + } + </Select>)} + </FormItem> + + <FormItem {...formItemLayout} label='名称' hasFeedback={true}> + {getFieldDecorator('name', { + initialValue: initialValue.name, + rules: [ + { + required: true, + message: '请输入名称' + } + ] + })( + <Input disabled={!showSubmit} /> + )} + </FormItem> + <FormItem {...formItemLayout} label='启动模式'> + {getFieldDecorator('boot_mode', { + initialValue: initialValue.boot_mode, + rules: [ + { + required: true, + message: '请选择启动模式' + } + ] + })( + <Radio.Group disabled={!showSubmit}> + <Radio value='legacy_bios'>BIOS</Radio> + <Radio value='uefi'>UEFI</Radio> + </Radio.Group> + )} + </FormItem> + <FormItem {...formItemLayout} label='架构'> + {getFieldDecorator('arch', { + initialValue: initialValue.arch, + rules: [ + { + required: true, + message: '请选择架构' + } + ] + })( + <Radio.Group disabled={!showSubmit}> + <Radio value='x86_64'>x86_64</Radio> + <Radio value='aarch64'>aarch64</Radio> + </Radio.Group> + )} + </FormItem> + <FormItem {...formItemLayout} label='生命周期'> + {getFieldDecorator('os_lifecycle', { + initialValue: initialValue.os_lifecycle, + rules: [ + { + required: true, + message: '请选择生命周期' + } + ] + })( + <Radio.Group disabled={!showSubmit}> + <Radio value='testing'>Testing</Radio> + <Radio value='active_default'>Active(Default)</Radio> + <Radio value='active'>Active</Radio> + <Radio value='containment'>Containment</Radio> + <Radio value='end_of_life'>EOL</Radio> + </Radio.Group> + )} + </FormItem> + <FormItem {...formItemLayout} label='用户名'> + {getFieldDecorator('username', { + initialValue: initialValue.username + })(<Input disabled={!showSubmit} />)} + </FormItem> + <FormItem {...formItemLayout} label='密码'> + {getFieldDecorator('password', { + initialValue: initialValue.password + })(<Input disabled={!showSubmit} type='password' />)} + </FormItem> + + <FormItem {...formItemLayout} label='PXE模板内容'> + {getFieldDecorator('pxe', { + initialValue: initialValue.pxe, + rules: [ + { + required: true, + message: '请填写PXE模板内容' + } + ] + })( + <div style={{ border: '1px solid #d9d9d9', marginBottom: '1px' }}> + <textarea + disabled={!showSubmit} + id='pxeScript' + style={{ width: '100%', marginTop: '1px', marginBottom: '1px' }} + /> + </div> + )} + </FormItem> + + <FormItem {...formItemLayout} label='系统模板内容'> + {getFieldDecorator('content', { + initialValue: initialValue.content, + rules: [ + { + required: true, + message: '请填写系统模板内容' + } + ] + })( + <div style={{ border: '1px solid #d9d9d9', marginBottom: '1px' }}> + <textarea + disabled={!showSubmit} + id='sysScript' + style={{ width: '100%', marginTop: '1px', marginBottom: '1px' }} + /> + </div> + )} + </FormItem> + { + !showSubmit && + <FormItem {...formItemLayout} label='创建时间'> + {getFieldDecorator('created_at', { + initialValue: initialValue.created_at + })(<Input disabled={!showSubmit} />)} + </FormItem> + } + { + !showSubmit && + <FormItem {...formItemLayout} label='修改时间'> + {getFieldDecorator('updated_at', { + initialValue: initialValue.updated_at + })(<Input disabled={!showSubmit} />)} + </FormItem> + } + + <FormItem {...tailFormItemLayout}> + <div className='pull-right'> + <Button onClick={() => this.props.onCancel()}>取消</Button> + { + showSubmit && + <Button + style={{ marginLeft: 8 }} + type='primary' + htmlType='submit' + > + 提交 + </Button> + } + </div> + </FormItem> + </Form> + </div> + ); + } +} + +export default Form.create()(MyForm); diff --git a/cyclone-web/app/containers/template/system/actions/system/system-detail.jsx b/cyclone-web/app/containers/template/system/actions/system/system-detail.jsx new file mode 100644 index 0000000000000000000000000000000000000000..18bf8e5575fa1de62b58bc79ff10f85b73b84657 --- /dev/null +++ b/cyclone-web/app/containers/template/system/actions/system/system-detail.jsx @@ -0,0 +1,35 @@ +import React from 'react'; +import Popup from 'components/popup/draw'; +import { get } from 'common/xFetch2'; +import MyForm from './form'; +import { notification } from 'antd'; + +export default async function action(options) { + + //使用接口方便入口使用 + const res = await get(`/api/cloudboot/v1/system-templates/${options.record.id}`); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + const initialValue = res.content; + + Popup.open({ + title: '查看PXE配置详情', + onCancel: () => { + Popup.close(); + }, + content: ( + <div> + <MyForm + {...options} + initialValue={initialValue} + id={options.record.id} + showSubmit={false} + onCancel={() => { + Popup.close(); + }} + /> + </div> + ) + }); +} diff --git a/cyclone-web/app/containers/template/system/actions/system/system.jsx b/cyclone-web/app/containers/template/system/actions/system/system.jsx new file mode 100644 index 0000000000000000000000000000000000000000..370185a1bfebf227609db63df65e6fe739a2d250 --- /dev/null +++ b/cyclone-web/app/containers/template/system/actions/system/system.jsx @@ -0,0 +1,48 @@ +import React from 'react'; +import Popup from 'components/popup'; +import { post, put } from 'common/xFetch2'; +import { notification } from 'antd'; +import MyForm from './form'; + + +export default function action(options) { + const record = options.record; + const typeMap = { + addSystem: { title: '新增PXE配置', api: '/api/cloudboot/v1/system-templates', method: post }, + editSystem: { title: '编辑PXE配置', api: `/api/cloudboot/v1/system-templates/${record.id}`, method: put }, + copySystem: { title: '新增PXE配置', api: '/api/cloudboot/v1/system-templates', method: post } + }; + + const onSubmit = (values) => { + typeMap[options.type].method(typeMap[options.type].api, values).then(res => { + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + notification.success({ message: res.message }); + Popup.close(); + options.reload(); + }); + }; + + Popup.open({ + title: `${typeMap[options.type].title}`, + width: 800, + onCancel: () => { + Popup.close(); + }, + content: ( + <div> + <MyForm + {...options} + initialValue={options.record} + id={options.record.id} + showSubmit={true} + onSubmit={(values) => onSubmit(values)} + onCancel={() => { + Popup.close(); + }} + /> + </div> + ) + }); +} diff --git a/cyclone-web/app/containers/template/system/components/mirror-table.jsx b/cyclone-web/app/containers/template/system/components/mirror-table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..6615cea291618ea7a9f5322be8460f5b91f911be --- /dev/null +++ b/cyclone-web/app/containers/template/system/components/mirror-table.jsx @@ -0,0 +1,207 @@ +import React from 'react'; +import { get } from 'common/xFetch2'; +import { + Table, + Button, + Pagination, + Tabs +} from 'antd'; +import actions from '../actions'; +import TableControlCell from 'components/TableControlCell'; +const TabPane = Tabs.TabPane; +import { BOOT_MODE, OS_LIFECYCLE } from 'common/enums'; +import { getPermissonBtn } from 'common/utils'; + +class MyTable extends React.Component { + + componentDidMount() { + this.reload(); + } + reload = () => { + //获取镜像模板列表 + this.props.dispatch({ + type: 'template-system/mirrorInstallTpl-table/get' + }); + }; + + execAction = (name, record) => { + if (actions[name]) { + actions[name]({ + record, + userInfo: this.props.userInfo, + osFamily: this.props.osFamily, + type: name, + reload: () => { + this.reload(); + } + }); + } + }; + + getColumns = () => { + return [ + { + title: '名称', + dataIndex: 'name', + width: 200, + render: (text, record) => { + return <a onClick={() => this.execAction('mirrorDetail', record)}>{text}</a>; + } + }, + { + title: '启动模式', + dataIndex: 'boot_mode', + width: 50, + render: (text, record) => { + return BOOT_MODE[text]; + } + }, + { + title: '创建时间', + dataIndex: 'created_at', + width: 50 + }, + { + title: '修改时间', + dataIndex: 'updated_at', + width: 50 + }, + { + title: '架构', + dataIndex: 'arch', + width: 50 + }, + { + title: '生命周期', + dataIndex: 'os_lifecycle', + width: 50, + render: (text, record) => { + return OS_LIFECYCLE[text]; + } + }, + { + title: '操作', + dataIndex: 'SystemName', + width: 100, + render: (text, record) => { + let commands = [ + { + name: '克隆', + command: 'copyMirror', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_mirror_template_create') + }, + { + name: '修改', + command: 'editMirror', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_mirror_template_update') + }, + { + name: '删除', + command: 'deleteMirror', + type: 'danger', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_mirror_template_delete') + } + ]; + return ( + <TableControlCell + commands={commands} + record={record} + execCommand={command => { + this.execAction(command, record); + }} + /> + ); + } + } + ]; + }; + + + changePage = page => { + this.props.dispatch({ + type: `template-system/mirrorInstallTpl-table/change-page`, + payload: { + page + } + }); + }; + + changePageSize = (page, pageSize) => { + this.props.dispatch({ + type: `template-system/mirrorInstallTpl-table/change-page-size`, + payload: { + page, + pageSize + } + }); + }; + + + getContent = () => { + const { tableData } = this.props; + const { loading } = tableData; + return ( + <Table + rowKey={'id'} + //scroll={{ y: 'calc(100vh - 320px)' }} + columns={this.getColumns()} + dataSource={tableData.list} + loading={loading} + pagination={false} + /> + ); + }; + onOsChange = (key) => { + this.props.dispatch({ + type: 'template-system/mirrorInstallTpl-table/search', + payload: { + family: key === 'all' ? null : key + } + }); + }; + render() { + const { tableData, osFamily } = this.props; + const { pagination } = tableData; + return ( + <div> + <div className='operate_btns'> + <Button + onClick={() => this.execAction('addMirror', {})} + type='primary' + icon='plus' + style={{ marginRight: 8 }} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_mirror_template_create')} + > + 新增配置 + </Button> + </div> + <div className='clearfix' /> + <Tabs + defaultActiveKey='0' + tabPosition='left' + onChange={this.onOsChange} + > + <TabPane tab={'全部'} key={'all'}>{this.getContent()}</TabPane> + { + !osFamily.loading && + osFamily.data.map((os, index) => <TabPane tab={os.name} key={os.name}>{this.getContent()}</TabPane>) + } + </Tabs> + <div> + <Pagination + showQuickJumper={true} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={this.changePageSize} + onChange={this.changePage} + showTotal={(total) => `共 ${total} 条`} + /> + </div> + </div> + ); + } +} + +export default MyTable; diff --git a/cyclone-web/app/containers/template/system/components/sys-table.jsx b/cyclone-web/app/containers/template/system/components/sys-table.jsx new file mode 100644 index 0000000000000000000000000000000000000000..75a6ff52d5249b0cfb843e4bcb2d90f001d68b25 --- /dev/null +++ b/cyclone-web/app/containers/template/system/components/sys-table.jsx @@ -0,0 +1,244 @@ +import React from 'react'; +import { get } from 'common/xFetch2'; +import { + Table, + Button, + Pagination, + Tabs, + Modal +} from 'antd'; +import actions from '../actions'; +import TableControlCell from 'components/TableControlCell'; +const TabPane = Tabs.TabPane; +import { BOOT_MODE, OS_LIFECYCLE } from 'common/enums'; +import { getPermissonBtn } from 'common/utils'; + +class MyTable extends React.Component { + state = { visible: false }; + componentDidMount() { + this.reload(); + } + reload = () => { + //获取系统模板列表 + this.props.dispatch({ + type: 'template-system/systemConfig-table/get' + }); + }; + + execAction = (name, record) => { + if (actions[name]) { + actions[name]({ + record, + type: name, + osFamily: this.props.osFamily, + reload: () => { + this.reload(); + } + }); + } + }; + + showModal = () => { + this.setState({ + visible: true, + }); + }; + + handleOk = e => { + //console.log(e); + this.setState({ + visible: false, + }); + }; + + handleCancel = e => { + //console.log(e); + this.setState({ + visible: false, + }); + }; + + getColumns = () => { + return [ + { + title: '名称', + dataIndex: 'name', + width: 200, + render: (text, record) => { + return <a onClick={() => this.execAction('systemDetail', record)}>{text}</a>; + } + }, + { + title: '启动模式', + dataIndex: 'boot_mode', + width: 50, + render: (text, record) => { + return BOOT_MODE[text]; + } + }, + { + title: '创建时间', + dataIndex: 'created_at', + width: 50 + }, + { + title: '修改时间', + dataIndex: 'updated_at', + width: 50 + }, + { + title: '架构', + dataIndex: 'arch', + width: 50 + }, + { + title: '生命周期', + dataIndex: 'os_lifecycle', + width: 50, + render: (text, record) => { + return OS_LIFECYCLE[text]; + } + }, + { + title: '操作', + dataIndex: 'SystemName', + width: 100, + render: (text, record) => { + let commands = [ + { + name: '克隆', + command: 'copySystem', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_system_template_create') + }, + { + name: '修改', + command: 'editSystem', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_system_template_update') + }, + { + name: '删除', + command: 'deleteSystem', + type: 'danger', + disabled: !getPermissonBtn(this.props.userInfo.permissions, 'button_system_template_delete') + } + ]; + return ( + <TableControlCell + commands={commands} + record={record} + execCommand={command => { + this.execAction(command, record); + }} + /> + ); + } + } + ]; + }; + + onOsChange = (key) => { + this.props.dispatch({ + type: 'template-system/systemConfig-table/search', + payload: { + family: key === 'all' ? null : key + } + }); + }; + + changePage = page => { + this.props.dispatch({ + type: `template-system/systemConfig-table/change-page`, + payload: { + page + } + }); + }; + + changePageSize = (page, pageSize) => { + this.props.dispatch({ + type: `template-system/systemConfig-table/change-page-size`, + payload: { + page, + pageSize + } + }); + }; + + + getContent = () => { + const { tableData } = this.props; + const { loading } = tableData; + return ( + <Table + rowKey={'id'} + //scroll={{ y: 'calc(100vh - 320px)' }} + columns={this.getColumns()} + dataSource={tableData.list} + loading={loading} + pagination={false} + /> + ); + }; + render() { + const { tableData, osFamily } = this.props; + const { pagination } = tableData; + return ( + <div> + <div className='operate_btns'> + <Button + onClick={() => this.execAction('addSystem', {})} + type='primary' + icon='plus' + style={{ marginRight: 8 }} + disabled={!getPermissonBtn(this.props.userInfo.permissions, 'button_system_template_create')} + > + 新增配置 + </Button> + <Button onClick={this.showModal}> + 说明 + </Button> + </div> + <div className='clearfix' /> + <Modal + title="装机配置说明" + visible={this.state.visible} + onOk={this.handleOk} + onCancel={this.handleCancel} + footer={null} + width={800} > + <p>1.x86_64架构CPU支持与厂商组合请求适用的bootos名称:bootos_x86_64_[cpuvendor]</p> + <p>2.当前支持的x86_64架构与厂商组合:bootos_x86_64_[intel|hygon] </p> + <p>3.不在支持列表的CPU厂商默认请求适用的bootos名称:bootos_x86_64</p> + <p>4.arm64架构CPU默认请求适用的bootos名称:bootos_arm64</p> + <p>5.不在支持列表的CPU架构默认请求适用的bootos名称:bootos_default</p> + <p>6.windows server模板默认请求适用的bootos名称:winpe2012_x86_64</p> + </Modal> + <Tabs + defaultActiveKey='0' + tabPosition='left' + onChange={this.onOsChange} + > + <TabPane tab={'全部'} key={'all'}>{this.getContent()}</TabPane> + { + !osFamily.loading && + osFamily.data.map((os, index) => <TabPane tab={os.name} key={os.name}>{this.getContent()}</TabPane>) + } + </Tabs> + <div> + <Pagination + showTotal={(total) => `共 ${total} 条`} + showQuickJumper={true} + showSizeChanger={true} + current={pagination.page} + pageSize={pagination.pageSize} + total={pagination.total} + onShowSizeChange={this.changePageSize} + onChange={this.changePage} + /> + </div> + </div> + ); + } +} + +export default MyTable; diff --git a/cyclone-web/app/containers/template/system/get-component.js b/cyclone-web/app/containers/template/system/get-component.js new file mode 100644 index 0000000000000000000000000000000000000000..dbe26cb471537de268e5c317681c661922c7081c --- /dev/null +++ b/cyclone-web/app/containers/template/system/get-component.js @@ -0,0 +1,25 @@ +import errorLoading from 'common/load-route-error'; + +async function doGet(injectReducer, injectSagas) { + try { + const saga = await import('./sagas/index.js'); + const reducer = await import('./reducers/index.js'); + injectReducer('template-system', reducer.default); + injectSagas(saga.default()); + const component = await import('./index.jsx'); + return component; + } catch (err) { + throw err; + } +} + +export default function create(options) { + const { errorLoading, injectReducer, injectSagas } = options; + return function(nextState, cb) { + doGet(injectReducer, injectSagas) + .then(component => { + cb(null, component.default); + }) + .catch(errorLoading); + }; +} diff --git a/cyclone-web/app/containers/template/system/index.jsx b/cyclone-web/app/containers/template/system/index.jsx new file mode 100644 index 0000000000000000000000000000000000000000..bdd379d4c1f396d93cfc31ecd7a35be1a30df794 --- /dev/null +++ b/cyclone-web/app/containers/template/system/index.jsx @@ -0,0 +1,83 @@ +import React from 'react'; +import { connect } from 'react-redux'; +import MirrorTable from './components/mirror-table'; +import SysTable from './components/sys-table'; +import Layout from 'components/layout/page-layout-tabs'; +import { Tabs } from 'antd'; +const TabPane = Tabs.TabPane; +import { hashHistory } from 'react-router'; + + +class Container extends React.Component { + componentDidMount() { + //获取操作系统族数据 + this.props.dispatch({ + type: 'template-system/osFamily/get' + }); + } + + renderSystemContent = () => { + const { systemConfig, osFamily } = this.props.data; + return ( + <div> + <SysTable + dispatch={this.props.dispatch} + tableData={systemConfig} + userInfo={this.props.userInfo} + osFamily={osFamily} + /> + </div> + ); + }; + renderMirrorContent = () => { + const { mirrorInstallTpl, osFamily } = this.props.data; + return ( + <div> + <MirrorTable + dispatch={this.props.dispatch} + tableData={mirrorInstallTpl} + userInfo={this.props.userInfo} + osFamily={osFamily} + /> + </div> + ); + }; + + onTabChange = (key) => { + const currentQuery = this.props.location.query; + currentQuery.type = key; + hashHistory.push(this.props.location); + }; + + render() { + const { query } = this.props.location; + const defaultKey = query.type ? query.type : 'systemConfig'; + return ( + <Layout title='装机配置'> + <Tabs onChange={this.onTabChange} activeKey={defaultKey} defaultActiveKey={defaultKey} type='card'> + <TabPane tab='PXE配置' key='systemConfig'> + {this.renderSystemContent()} + </TabPane> + <TabPane tab='镜像配置' key='mirrorInstallTpl'> + {this.renderMirrorContent()} + </TabPane> + </Tabs> + </Layout> + ); + } +} + +function mapStateToProps(state) { + return { + data: state.get('template-system').toJS(), + userInfo: state.getIn([ 'global', 'userData' ]).toJS() + }; +} + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/cyclone-web/app/containers/template/system/reducers/index.js b/cyclone-web/app/containers/template/system/reducers/index.js new file mode 100644 index 0000000000000000000000000000000000000000..b03a2c416f2161036328dbe28e3704b6036d195d --- /dev/null +++ b/cyclone-web/app/containers/template/system/reducers/index.js @@ -0,0 +1,30 @@ +import { handleActions } from 'redux-actions'; +import { fromJS } from 'immutable'; +import { createTableStore, createTableReducer } from 'utils/table-reducer'; +import { createRegularReducer } from 'utils/regular-reducer'; + +const initialState = fromJS({ + loading: true, + systemConfig: createTableStore(), + mirrorInstallTpl: createTableStore(), + network: createTableStore(), + oobNetwork: createTableStore(), + osFamily: { + data: [], + loading: true + } +}); + +const reducer = handleActions( + { + ...createTableReducer('template-system/systemConfig-table', 'systemConfig'), + ...createTableReducer('template-system/mirrorInstallTpl-table', 'mirrorInstallTpl'), + ...createTableReducer('template-system/oobNetwork-table', 'oobNetwork'), + ...createTableReducer('template-system/network-table', 'network'), + ...createRegularReducer('template-system/osFamily', 'osFamily') + + }, + initialState, +); + +export default reducer; diff --git a/cyclone-web/app/containers/template/system/sagas/index.js b/cyclone-web/app/containers/template/system/sagas/index.js new file mode 100644 index 0000000000000000000000000000000000000000..b776537d7f7651e053b5a6588558d710ceacd9e1 --- /dev/null +++ b/cyclone-web/app/containers/template/system/sagas/index.js @@ -0,0 +1,63 @@ +import { get, post } from 'common/xFetch2'; +import { takeEvery } from 'redux-saga'; +import { call, put } from 'redux-saga/effects'; +import { notification } from 'antd'; + + +let created = false; +function* empty() { + return; +} + +function* defaultSaga() { + const watchers = yield [ + takeEvery('template-system/osFamily/get', getOsFamily) + ]; +} + +import { createTableSaga } from 'utils/table-saga'; + +const sysTableSaga = createTableSaga({ + actionNamePrefix: 'template-system/systemConfig-table', + tableDataPath: [ 'template-system', 'systemConfig' ], + datasource: '/api/cloudboot/v1/system-templates' +}); +const mirrorTableSaga = createTableSaga({ + actionNamePrefix: 'template-system/mirrorInstallTpl-table', + tableDataPath: [ 'template-system', 'mirrorInstallTpl' ], + datasource: '/api/cloudboot/v1/image-templates' +}); +const networkTableSaga = createTableSaga({ + actionNamePrefix: 'template-system/network-table', + tableDataPath: [ 'template-system', 'network' ], + datasource: '/api/cloudboot/v1/ip-networks' +}); +const oobNetworkTableSaga = createTableSaga({ + actionNamePrefix: 'template-system/oobNetwork-table', + tableDataPath: [ 'template-system', 'oobNetwork' ], + datasource: '/api/cloudboot/v1/oob-ip-networks' +}); +function* getOsFamily(action) { + try { + yield put({ + type: 'template-system/osFamily/load' + }); + const res = yield call(get, `/api/cloudboot/v1/dictionaries?type=os_family`); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + yield put({ + type: 'template-system/osFamily/load/success', + payload: res.content.items || [] + }); + } catch (error) { + console.log(error); + } +} +export default function create() { + if (created) { + return [empty]; + } + created = true; + return [ sysTableSaga, mirrorTableSaga, networkTableSaga, oobNetworkTableSaga, defaultSaga ]; +} diff --git a/cyclone-web/app/i18n/index.js b/cyclone-web/app/i18n/index.js new file mode 100644 index 0000000000000000000000000000000000000000..c025b560d6ca8266819403b17cd9376dad2eef47 --- /dev/null +++ b/cyclone-web/app/i18n/index.js @@ -0,0 +1,55 @@ +/** + * i18n.js + * + * This will setup the i18n language files and locale data for your app. + * + */ +import { addLocaleData } from 'react-intl'; +import enLocaleData from 'react-intl/locale-data/en'; +import zhLocaleData from 'react-intl/locale-data/zh'; +import objectPath from 'common/object-path'; +import IntlMessageFormat from 'intl-messageformat'; + +const translationsReq = require.context('./translations', true, /\.js$/); + +function parseTranslation() { + const ret = {}; + translationsReq.keys().forEach((key) => { + const trans = translationsReq(key).default; + const matches = key.match(/\.\/(.*)\.js/); + if (matches) { + ret[matches[1]] = trans; + } + }); + + const flattened = objectPath.flatten(ret, ''); + const translations = {}; + + Object.keys(flattened).forEach((key) => { + const parts = key.split('.'); + const language = parts.pop(); + if (!translations[language]) { + translations[language] = {}; + } + translations[language][parts.join('.')] = flattened[key]; + }); + + return translations; +} + +addLocaleData(enLocaleData); +addLocaleData(zhLocaleData); + +export const appLocales = [ + 'en', + 'zh' +]; + +export const translationMessages = parseTranslation(); + +export const formatMessage = (config) => { + const locale = config.locale || 'zh'; + const localedMessage = translationMessages[locale]; + const formatter = new IntlMessageFormat(localedMessage[config.id], locale); + return formatter.format(config.data); +}; diff --git a/cyclone-web/app/i18n/translations/common.js b/cyclone-web/app/i18n/translations/common.js new file mode 100644 index 0000000000000000000000000000000000000000..9a956798618ff08b210cc9256ad735cfc1562f99 --- /dev/null +++ b/cyclone-web/app/i18n/translations/common.js @@ -0,0 +1,50 @@ +export default { + name: { + zh: '名称', + en: 'Name' + }, + code: { + zh: '编码', + en: 'Code' + }, + value: { + zh: '值', + en: 'Value' + }, + attribute: { + en: 'Attribute', + zh: '属性' + }, + remarks: { + en: 'remarks', + zh: '备注' + }, + user: { + en: 'User', + zh: '用户' + }, + 'user-group': { + en: 'User Group', + zh: '用户组' + }, + submitting: { + en: 'Submitting', + zh: '提交中' + }, + submit: { + en: 'Submit', + zh: '提交' + }, + 'loading-error': { + en: 'Loading error', + zh: '加载错误' + }, + 'submit.success': { + en: 'Submit successful', + zh: '提交成功' + }, + 'submit.failed': { + en: 'Submission failed', + zh: '提交失败' + } +}; diff --git a/cyclone-web/app/i18n/translations/dcosapp.js b/cyclone-web/app/i18n/translations/dcosapp.js new file mode 100644 index 0000000000000000000000000000000000000000..f9e2cc3be485e0565567a1d3bc25058bfd376917 --- /dev/null +++ b/cyclone-web/app/i18n/translations/dcosapp.js @@ -0,0 +1,175 @@ +export default { + // dcos.common.name + 'common.name': { + zh: '名称', + en: 'Name' + }, + + /** + * page application center + */ + 'app-detail.base-info': { + zh: '基本信息', + en: 'Information' + }, + 'app-list.new-app-button': { + zh: '新建应用', + en: 'New App' + }, + 'application-name': { + zh: '应用名称', + en: 'Application name' + }, + 'application-code': { + zh: '应用编码', + en: 'Application code' + }, + tenent: { + zh: '租户', + en: 'Tenent' + }, + environment: { + zh: '所属环境', + en: 'Environment' + }, + owner: { + zh: '负 责 人', + en: 'Owner' + }, + 'application-type': { + zh: '应用类型', + en: 'Application Type' + }, + 'high-avaliability-level': { + zh: '高可用等级', + en: 'High availability level' + }, + 'application-status': { + zh: '应用状态', + en: 'Application status' + }, + + /** + * page app detail preview + */ + 'deployment-instance': { + zh: '部署实例', + en: 'Deployment Instance' + }, + 'network-service': { + en: 'Network Service', + zh: '网络服务' + }, + 'data-center': { + en: 'Data center', + zh: '数据中心' + }, + 'deployment-unit-type': { + en: 'Deployment Unit Type', + zh: '部署单元类型' + }, + 'compute-resource-pool': { + en: 'Compute Resource Pool', + zh: '计算资源池' + }, + 'compute-specs': { + en: 'Compute Specs', + zh: '计算规格' + }, + 'os-image': { + en: 'OS Image', + zh: '操作系统镜像' + }, + 'number-of-deployed-instances': { + en: 'Number of deployed instances', + zh: '部署实例数量' + }, + 'select-deployment-unit': { + en: 'Select deployment unit from the left', + zh: '请选择左侧部署单元' + }, + 'protection-level': { + en: 'Level of protection', + zh: '等级保护等级' + }, + 'continuity-level': { + en: 'Continuity Level', + zh: '连续性等级' + }, + 'network-resource': { + en: 'Network Resources', + zh: '网络资源' + }, + 'storage-resource': { + en: 'Storage Resources', + zh: '存储资源' + }, + 'platform-package': { + en: 'Platform Package', + zh: '平台软件包' + }, + 'application-package': { + zh: '应用软件包', + en: 'Application Package' + }, + 'logical-unit-type': { + zh: '逻辑单元类型', + en: 'Logical Unit Type' + }, + 'basic-info': { + en: 'Info', //"Basic Information", + zh: '基本信息' + }, + 'deployment-arch': { + en: 'Deployment', //"Deployment Architecture", + zh: '部署架构' + }, + 'logical-arch': { + en: 'Logical', //"Logical Architecture", + zh: '逻辑架构' + }, + 'data-list': { + en: 'Data List', + zh: '数据列表' + }, + 'application-preview': { + en: 'Application Preview', + zh: '应用预览' + }, + logical: { + en: 'Logic', + zh: '逻辑' + }, + deployment: { + en: 'Deployment', + zh: '部署' + }, + network: { + en: 'Network', + zh: '网络' + }, + 'application-center': { + en: 'Application Center', + zh: '应用中心' + }, + 'resource-approval': { + en: 'Approval', + zh: '资源审批' + }, + preconfig: { + en: 'Preconfig', + zh: '预配置' + }, + implementation: { + en: 'Implementation', + zh: '实施' + }, + preview: { + en: 'Preview', + zh: '预览' + }, + 'modify-application-title': { + en: 'Modify basic information of application', + zh: '修改应用基本信息' + } +}; diff --git a/cyclone-web/app/i18n/translations/service-index/todo.js b/cyclone-web/app/i18n/translations/service-index/todo.js new file mode 100644 index 0000000000000000000000000000000000000000..bb7ad1e77f93b3301d8006690f7749efd0967fe6 --- /dev/null +++ b/cyclone-web/app/i18n/translations/service-index/todo.js @@ -0,0 +1,12 @@ +export default { + // dcos.common.name + name: { + zh: '名称', + en: 'Name' + }, + // dcos.app-detail.base-info + application: { + zh: '基本信息', + en: 'Information' + } +}; diff --git a/cyclone-web/app/index.html b/cyclone-web/app/index.html new file mode 100644 index 0000000000000000000000000000000000000000..1a3b5607991c258466de518b73fefa026527204f --- /dev/null +++ b/cyclone-web/app/index.html @@ -0,0 +1,387 @@ +<!DOCTYPE html> +<html lang="en"> + +<head> + <!-- The first thing in any HTML file should be the charset --> + <meta charset="utf-8"> + <!-- Make the page mobile compatible --> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> + <!-- Allow installing the app to the homescreen --> + <!--<link rel="manifest" href="manifest.json">--> + <meta name="mobile-web-app-capable" content="yes"> + <meta name="description" content=""> + <link rel="shortcut icon" href="assets/icon/about_icon.png" type="image/x-icon" /> + <link rel="stylesheet" href="vendor/antd/antd.min.css"> + <link rel="stylesheet" type="text/css" href="vendor/iconfont/iconfont.css"> + <link rel="stylesheet" type="text/css" href="vendor/fonts_tab/iconfont.css"> + <link rel="stylesheet" type="text/css" href="vendor/fonts-boot/iconfont.css"> + <link rel="stylesheet" href="vendor/codeMirror/codemirror.css"> + <link rel="stylesheet" href="vendor/codeMirror/merge.css"> + <link rel="stylesheet" href="vendor/codeMirror/erlang-dark.css"> + <link rel="stylesheet" href="vendor/animate/animate.css"> + + <!-- Polyfills --> + <script src="vendor/polyfill/Intl.min.js"></script> + <title>CyclOne</title> + <script> + /*! + * Bowser - a browser detector + * https://github.com/ded/bowser + * MIT License | (c) Dustin Diaz 2015 + */ + ! function (e, t) { + typeof module != "undefined" && module.exports ? module.exports = t() : typeof define == "function" && define.amd ? + define(t) : this[e] = t() + }("bowser", function () { + function t(t) { + function n(e) { + var n = t.match(e); + return n && n.length > 1 && n[1] || "" + } + + function r(e) { + var n = t.match(e); + return n && n.length > 1 && n[2] || "" + } + var i = n(/(ipod|iphone|ipad)/i).toLowerCase(), + s = /like android/i.test(t), + o = !s && /android/i.test(t), + u = /CrOS/.test(t), + a = n(/edge\/(\d+(\.\d+)?)/i), + f = n(/version\/(\d+(\.\d+)?)/i), + l = /tablet/i.test(t), + c = !l && /[^-]mobi/i.test(t), + h; + /opera|opr/i.test(t) ? h = { + name: "Opera", + opera: e, + version: f || n(/(?:opera|opr)[\s\/](\d+(\.\d+)?)/i) + } : /yabrowser/i.test(t) ? h = { + name: "Yandex Browser", + yandexbrowser: e, + version: f || n(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i) + } : /windows phone/i.test(t) ? (h = { + name: "Windows Phone", + windowsphone: e + }, a ? (h.msedge = e, h.version = a) : (h.msie = e, h.version = n(/iemobile\/(\d+(\.\d+)?)/i))) : + /msie|trident/i.test(t) ? h = { + name: "Internet Explorer", + msie: e, + version: n(/(?:msie |rv:)(\d+(\.\d+)?)/i) + } : u ? h = { + name: "Chrome", + chromeBook: e, + chrome: e, + version: n(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i) + } : /chrome.+? edge/i.test(t) ? h = { + name: "Microsoft Edge", + msedge: e, + version: a + } : /chrome|crios|crmo/i.test(t) ? h = { + name: "Chrome", + chrome: e, + version: n(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i) + } : i ? (h = { + name: i == "iphone" ? "iPhone" : i == "ipad" ? "iPad" : "iPod" + }, f && (h.version = f)) : /sailfish/i.test(t) ? h = { + name: "Sailfish", + sailfish: e, + version: n(/sailfish\s?browser\/(\d+(\.\d+)?)/i) + } : /seamonkey\//i.test(t) ? h = { + name: "SeaMonkey", + seamonkey: e, + version: n(/seamonkey\/(\d+(\.\d+)?)/i) + } : /firefox|iceweasel/i.test(t) ? (h = { + name: "Firefox", + firefox: e, + version: n(/(?:firefox|iceweasel)[ \/](\d+(\.\d+)?)/i) + }, /\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(t) && (h.firefoxos = e)) : /silk/i.test(t) ? h = { + name: "Amazon Silk", + silk: e, + version: n(/silk\/(\d+(\.\d+)?)/i) + } : o ? h = { + name: "Android", + version: f + } : /phantom/i.test(t) ? h = { + name: "PhantomJS", + phantom: e, + version: n(/phantomjs\/(\d+(\.\d+)?)/i) + } : /blackberry|\bbb\d+/i.test(t) || /rim\stablet/i.test(t) ? h = { + name: "BlackBerry", + blackberry: e, + version: f || n(/blackberry[\d]+\/(\d+(\.\d+)?)/i) + } : /(web|hpw)os/i.test(t) ? (h = { + name: "WebOS", + webos: e, + version: f || n(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i) + }, /touchpad\//i.test(t) && (h.touchpad = e)) : /bada/i.test(t) ? h = { + name: "Bada", + bada: e, + version: n(/dolfin\/(\d+(\.\d+)?)/i) + } : /tizen/i.test(t) ? h = { + name: "Tizen", + tizen: e, + version: n(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i) || f + } : /safari/i.test(t) ? h = { + name: "Safari", + safari: e, + version: f + } : h = { + name: n(/^(.*)\/(.*) /), + version: r(/^(.*)\/(.*) /) + }, !h.msedge && /(apple)?webkit/i.test(t) ? (h.name = h.name || "Webkit", h.webkit = e, !h.version && f && + (h.version = f)) : !h.opera && /gecko\//i.test(t) && (h.name = h.name || "Gecko", h.gecko = e, h.version = + h.version || n(/gecko\/(\d+(\.\d+)?)/i)), !h.msedge && (o || h.silk) ? h.android = e : i && (h[i] = e, h.ios = + e); + var p = ""; + h.windowsphone ? p = n(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i) : i ? (p = n( + /os (\d+([_\s]\d+)*) like mac os x/i), p = p.replace(/[_\s]/g, ".")) : o ? p = n( + /android[ \/-](\d+(\.\d+)*)/i) : h.webos ? p = n(/(?:web|hpw)os\/(\d+(\.\d+)*)/i) : h.blackberry ? p = n( + /rim\stablet\sos\s(\d+(\.\d+)*)/i) : h.bada ? p = n(/bada\/(\d+(\.\d+)*)/i) : h.tizen && (p = n( + /tizen[\/\s](\d+(\.\d+)*)/i)), p && (h.osversion = p); + var d = p.split(".")[0]; + if (l || i == "ipad" || o && (d == 3 || d == 4 && !c) || h.silk) h.tablet = e; + else if (c || i == "iphone" || i == "ipod" || o || h.blackberry || h.webos || h.bada) h.mobile = e; + return h.msedge || h.msie && h.version >= 10 || h.yandexbrowser && h.version >= 15 || h.chrome && h.version >= + 20 || h.firefox && h.version >= 20 || h.safari && h.version >= 6 || h.opera && h.version >= 10 || h.ios && + h.osversion && h.osversion.split(".")[0] >= 6 || h.blackberry && h.version >= 10.1 ? h.a = e : h.msie && h.version < + 10 || h.chrome && h.version < 20 || h.firefox && h.version < 20 || h.safari && h.version < 6 || h.opera && + h.version < 10 || h.ios && h.osversion && h.osversion.split(".")[0] < 6 ? h.c = e : h.x = e, h + } + var e = !0, + n = t(typeof navigator != "undefined" ? navigator.userAgent : ""); + return n.test = function (e) { + for (var t = 0; t < e.length; ++t) { + var r = e[t]; + if (typeof r == "string" && r in n) return !0 + } + return !1 + }, n._detect = t, n + }) + + </script> +</head> + +<body> + <style> + .ant-tooltip .ant-tooltip-inner { + background-color: rgba(75, 134, 230, 0.75) !important; + } + + .ant-tooltip .ant-tooltip-arrow { + border-right-color: rgba(75, 134, 230, 0.75) !important; + } + + .ant-tooltip .ant-tooltip-inner a { + color: #fff; + } + + .init-loading { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: white; + } + + .init-loading.hide { + display: none; + } + + .init-loading .loading-area { + text-align: center; + width: 100px; + margin: auto; + margin-top: 40vh; + position: relative; + } + + .init-loading .loading-cloud { + width: 92px; + height: 65px; + } + + .init-loading .loading-gear-big { + position: absolute; + top: 31px; + left: 24px; + width: 27px; + height: 27px; + -ms-transform: rotate(0deg); + } + + .init-loading .loading-gear-small { + position: absolute; + top: 20px; + left: 51px; + height: 20px; + width: 20px; + -ms-transform: rotate(0deg); + animation-direction: reverse; + -o-animation-direction: reverse; + -ms-animation-direction: reverse; + -webkit-animation-direction: reverse; + -moz-animation-direction: reverse; + } + + .init-loading .loading-rotate { + animation-name: rotateAnim; + -o-animation-name: rotateAnim; + -ms-animation-name: rotateAnim; + -webkit-animation-name: rotateAnim; + -moz-animation-name: rotateAnim; + animation-duration: 1.4s; + -o-animation-duration: 1.4s; + -ms-animation-duration: 1.4s; + -webkit-animation-duration: 1.4s; + -moz-animation-duration: 1.4s; + animation-iteration-count: infinite; + -o-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-timing-function: linear; + -o-animation-timing-function: linear; + -ms-animation-timing-function: linear; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + } + + @keyframes rotateAnim { + from { + transform: rotate(360deg); + } + to { + transform: rotate(0deg); + } + } + + @-o-keyframes rotateAnim { + from { + -o-transform: rotate(360deg); + } + to { + -o-transform: rotate(0deg); + } + } + + @-ms-keyframes rotateAnim { + from { + -ms-transform: rotate(360deg); + } + to { + -ms-transform: rotate(0deg); + } + } + + @-webkit-keyframes rotateAnim { + from { + -webkit-transform: rotate(360deg); + } + to { + -webkit-transform: rotate(0deg); + } + } + + @-moz-keyframes rotateAnim { + from { + -moz-transform: rotate(360deg); + } + to { + -moz-transform: rotate(0deg); + } + } + + </style> + <div class="init-loading" id="InitLoading"> + <div class="loading-area"> + <img class="loading-cloud" src="/assets/img/init-loading-1.png" alt=""> + <img class="loading-gear-big loading-rotate" src="/assets/img/init-loading-2.png" alt=""> + <img class="loading-gear-small loading-rotate" src="/assets/img/init-loading-2.png" alt=""> + </div> + </div> + <!--[if IE 9]><script type="text/javascript"> +window['isIE9'] = true; + +(function() { + var gear1 = document.getElementsByClassName('loading-gear-big')[0]; + var gear2 = document.getElementsByClassName('loading-gear-small')[0]; + window.loadingInterval = rotate(gear1, gear2); + + function rotate(gear1, gear2) { + setRotate(gear1, 0); + setRotate(gear2, 0); + return setInterval(function() { + setRotate(gear1, getRotate(gear1) - 8); + setRotate(gear2, getRotate(gear2) + 8); + }, 30); + } + + function getRotate(gear) { + var transform = gear.style.transform || gear.style.msTransform; + var ret = 0; + if (transform && transform !== '') { + ret = transform.match(/-?\d+/)[0] - 0; + } + if (Math.abs(ret) >= 360) { + ret = 0; + } + return ret; + } + + function setRotate(gear, deg) { + var transform = 'rotate(' + deg + 'deg)'; + gear.style.transform = transform; + gear.style.msTransform = transform; + } +})(); + +</script><![endif]--> + <!-- The app hooks into this div --> + <div class="browser-upgrade-tips" id="BrowserUpgradeTips" style="position:fixed; z-index: 10000; top:0;left:0;right:0;bottom: 0;overflow:hidden; background: white; display: none;"> + <div class="" style="width: 600px; margin:100px auto;"> + <div class="error-spacer"></div> + <div role="main" class="main"> + + <h1>Sorry!</h1> + + <h2>You are using an outdated browser.</h2> + <hr> + + <p>To display the app correctly and protect your information</p> + <p>Please use one of these up-to-date, free and excellent browsers</p> + <p>Latest + <b>Chrome</b>、 + <b>Firefox</b>、 + <b>Safari</b>、 + <b>IE>11</b> + </p> + </div> + </div> + </div> + <!-- browser detect logic --> + <script> + if (bowser.msie && bowser.version < 9) { + document.getElementById("BrowserUpgradeTips").style.display = "block"; + } + + </script> + <section id="AppRoot" style="height: 100%"></section> + <script src="/vendor/moment/moment.js"></script> + <script src="/vendor/react/vendors.js"></script> + <script src="/vendor/antd/antd.min.js"></script> + <script src="/vendor/clipboard/clipboard.min.js"></script> + <script src="/vendor/jquery/jquery-3.2.1.min.js"></script> + <script src="vendor/codeMirror/codemirror.js"></script> + <script src="vendor/codeMirror/diff_match_patch.js"></script> + <script src="vendor/codeMirror/merge.js"></script> + <script src="vendor/codeMirror/css.js"></script> + <script src="vendor/codeMirror/shell.js"></script> + <script src="vendor/echarts/echarts.common.min.js"></script> + + <!-- A lot of magic happens in this file. HtmlWebpackPlugin automatically includes all assets (e.g. bundle.js, main.css) with the correct HTML tags, which is why they are missing in this HTML file. Don't add any assets here! (Check out webpackconfig.js if you want to know more) --> +</body> + +</html> diff --git a/cyclone-web/app/reducers.js b/cyclone-web/app/reducers.js new file mode 100644 index 0000000000000000000000000000000000000000..b3185d24136e9d4b3607783c0d8eae03a7c17e8d --- /dev/null +++ b/cyclone-web/app/reducers.js @@ -0,0 +1,51 @@ +/** + * Combine all reducers in this file and export the combined reducers. + * If we were to do this in store.js, reducers wouldn't be hot reloadable. + */ + +import { fromJS } from 'immutable'; +import { combineReducers } from 'redux-immutable'; +import { LOCATION_CHANGE } from 'react-router-redux'; +import globalReducer from 'containers/app/reducer'; +import languageReducer from 'containers/common/language-provider/reducer'; + +/* + * routeReducer + * + * The reducer merges route location changes into our immutable state. + * The change is necessitated by moving to react-router-redux@4 + * + */ + +// Initial routing state +const routeInitialState = fromJS({ + locationBeforeTransitions: null +}); + +/** + * Merge route into the global application state + */ +function routeReducer(state = routeInitialState, action) { + switch (action.type) { + + /* istanbul ignore next */ + case LOCATION_CHANGE: + return state.merge({ + locationBeforeTransitions: action.payload + }); + default: + return state; + } +} + +/** + * Creates the main reducer with the asynchronously loaded ones + */ +export default function createReducer(asyncReducers) { + return combineReducers({ + route: routeReducer, + global: globalReducer, + language: languageReducer, + ...asyncReducers + }); +} diff --git a/cyclone-web/app/routes.js b/cyclone-web/app/routes.js new file mode 100644 index 0000000000000000000000000000000000000000..cb0101c0b26a2459c8330f0543eaedde76c6ea38 --- /dev/null +++ b/cyclone-web/app/routes.js @@ -0,0 +1,265 @@ +// These are the pages you can go to. +// They are all wrapped in the App component, which should contain the navbar etc +// See http://blog.mxstbr.com/2016/01/react-apps-with-pages for more information +// about the code splitting business + +import Err404 from "containers/common/err404/get-component"; +import Authenticated from "containers/common/authenticated/get-component"; +import Homepage from "containers/homepage/get-component"; +import Develop from "containers/common/develop/get-component"; + +import DatabaseIdc from 'containers/database/idc/get-component'; +import DatabaseRoom from 'containers/database/room/get-component'; +import DatabaseNetwork from 'containers/database/network/get-component'; +import DatabaseCabinet from 'containers/database/cabinet/get-component'; +import DatabaseUsite from 'containers/database/usite/get-component'; +import DatabaseStoreRoom from 'containers/database/store-room/get-component'; +import DatabaseStoreRoomDetail from 'containers/database/store-room-detail/get-component'; + +import NetworkCidr from 'containers/network/cidr/get-component'; +import NetworkIps from 'containers/network/ips/get-component'; +import NetworkDevice from 'containers/network/device/get-component'; + +import DeviceList from 'containers/device/list/get-component'; +import DeviceOob from 'containers/device/oob/get-component'; +import DeviceSpecial from 'containers/device/special/get-component'; +import DevicePreDeploy from 'containers/device/pre_deploy/get-component'; +import DeviceSetting from 'containers/device/setting/get-component'; +import DeviceSettingRule from 'containers/device/setting_rule/get-component'; +import DeviceEntry from 'containers/device/entry/get-component'; +import DeviceDetail from 'containers/device/detail/get-component'; +import DeviceInspectionList from 'containers/device/inspection/list/get-component'; +import DeviceInspectionDetail from 'containers/device/inspection/detail/get-component'; + +import TemplateHardwareList from 'containers/template/hardware/list/get-component'; +import TemplateHardwareCreate from 'containers/template/hardware/create/get-component'; +import TemplateSystem from 'containers/template/system/get-component'; + +import AuditLog from 'containers/audit/log/get-component'; +import AuditApi from 'containers/audit/api/get-component'; + +import Approval from 'containers/approval/get-component'; +import ApprovalRetirement from 'containers/approval/apply_pages/retirement/get-component'; +import ApprovalMove from 'containers/approval/apply_pages/move/get-component'; +import ApprovalReInstall from 'containers/approval/apply_pages/reInstall/get-component'; +import ApprovalPages from 'containers/approval/apply_pages/pages/get-component'; + +import OrderList from 'containers/order/list/get-component'; +import OrderDeviceCategory from 'containers/order/deviceCategory/get-component'; + +import TaskList from 'containers/task/list/get-component'; +import TaskDetail from 'containers/task/detail/get-component'; + +import errorLoading from 'common/load-route-error'; +import { getAsyncInjectors } from './utils/asyncInjectors'; + +export default function createRoutes(store) { + const { injectReducer, injectSagas } = getAsyncInjectors(store); + const options = { + injectReducer, + injectSagas, + errorLoading + }; + return [ + { + path: '/', + name: '门户', + getComponent: Homepage(options) + }, + { + path: "/test", + name: "测试", + getComponent: Develop(options) + }, + { + path: "/authenticated", + name: "权限", + getComponent: Authenticated() + }, + { + path: "database/idc", + name: "数据中心消息管理", + getComponent: DatabaseIdc(options) + }, + { + path: "database/room", + name: "机房信息管理", + getComponent: DatabaseRoom(options) + }, + { + path: "database/network", + name: "网络区域信息管理", + getComponent: DatabaseNetwork(options) + }, + { + path: "database/cabinet", + name: "机架信息管理", + getComponent: DatabaseCabinet(options) + }, + { + path: "database/usite", + name: "机位信息管理", + getComponent: DatabaseUsite(options) + }, + { + path: "database/store-room", + name: "库房信息管理", + getComponent: DatabaseStoreRoom(options) + }, + { + path: "database/store-room/:id", + name: "库房管理详情", + getComponent: DatabaseStoreRoomDetail(options) + }, + { + path: "network/cidr", + name: "IP网段管理", + getComponent: NetworkCidr(options) + }, + { + path: "network/ips", + name: "IP分配管理", + getComponent: NetworkIps(options) + }, + { + path: "network/device", + name: "网络设备", + getComponent: NetworkDevice(options) + }, + { + path: "device/list", + name: "物理机列表", + getComponent: DeviceList(options) + }, + { + path: "device/oob", + name: "带外", + getComponent: DeviceOob(options) + }, + { + path: "device/special", + name: "特殊设备", + getComponent: DeviceSpecial(options) + }, + { + path: "device/pre_deploy", + name: "待部署列表", + getComponent: DevicePreDeploy(options) + }, + { + path: "device/detail/:sn", + name: "设备详情", + getComponent: DeviceDetail(options) + }, + { + path: "device/setting", + name: "装机列表", + getComponent: DeviceSetting(options) + }, + { + path: "device/setting_rule", + name: "部署参数规则", + getComponent: DeviceSettingRule(options) + }, + { + path: "device/entry", + name: "上架部署", + getComponent: DeviceEntry(options) + }, + { + path: "device/inspection/list", + name: "硬件巡检", + getComponent: DeviceInspectionList(options) + }, + { + path: "device/inspection/detail/:sn", + name: "硬件巡检详情", + getComponent: DeviceInspectionDetail(options) + }, + { + path: "template/hardware/list", + name: "硬件模板", + getComponent: TemplateHardwareList(options) + }, + { + path: "template/hardware/create/:id", + name: "新建硬件配置模板", + getComponent: TemplateHardwareCreate(options) + }, + { + path: "template/hardware/edit/:id", + name: "编辑硬件配置模板", + getComponent: TemplateHardwareCreate(options) + }, + { + path: "template/hardware/detail/:id", + name: "查看硬件配置模板", + getComponent: TemplateHardwareCreate(options) + }, + { + path: "template/system", + name: "系统模板", + getComponent: TemplateSystem(options) + }, + { + path: "audit/log", + name: "操作记录", + getComponent: AuditLog(options) + }, + { + path: "audit/api", + name: "接口调用记录", + getComponent: AuditApi(options) + }, + { + path: "approval", + name: "审批", + getComponent: Approval(options) + }, + { + path: "approval/pages/:type", + name: "审批单", + getComponent: ApprovalPages(options) + }, + { + path: "approval/retire", + name: "物理机退役", + getComponent: ApprovalRetirement(options) + }, + { + path: "approval/move", + name: "物理机搬迁", + getComponent: ApprovalMove(options) + }, + { + path: "approval/reinstall", + name: "物理机重装", + getComponent: ApprovalReInstall(options) + }, + { + path: "order/list", + name: "订单列表", + getComponent: OrderList(options) + }, + { + path: "order/deviceCategory", + name: "设备类型", + getComponent: OrderDeviceCategory(options) + }, + { + path: "task/list", + name: "任务列表", + getComponent: TaskList(options) + }, + { + path: "task/detail/:id", + name: "任务管理详情", + getComponent: TaskDetail(options) + }, + { + path: "*", + name: "notfound", + getComponent: Err404(options) + } + ]; +} diff --git a/cyclone-web/app/services/auth.js b/cyclone-web/app/services/auth.js new file mode 100644 index 0000000000000000000000000000000000000000..0986fc8a1d768bb39ba857f91da54ca23938a9e4 --- /dev/null +++ b/cyclone-web/app/services/auth.js @@ -0,0 +1,66 @@ +import { get, post } from 'common/xFetch2'; +import cookie from 'js-cookie'; +import { notification } from 'antd'; + +/** + * [getRedirectUrl description] + * @return {[type]} [description] + */ +function getRedirectUrl(ssoUrl, customer) { + const host = window.location.host; + let loginHash = window.location.hash; + loginHash = loginHash.replace('#/', ''); + const pathname = window.location.pathname; + const protocol = window.location.protocol; + + const router = '/authenticated'; + const callbackUrl = encodeURIComponent( + protocol + '//' + host + pathname + '#' + router + '?loginHash=' + loginHash + ); + return ssoUrl + '?authCallbackUrl=' + callbackUrl + '&customer=' + customer; +} + +/** + * ssoLogin + */ +export function ssoLogin() { + getSsoWebUrl().then(res => { + const ssoUrl = res.content.url; + const customer = res.content.customer; + const url = getRedirectUrl(ssoUrl, customer); + window.location.href = url; + }); +} + +/** + * [logout description] + * @return {[type]} [description] + */ +export async function logout() { + try { + cookie.remove('access-token', ''); + document.cookie = + 'access-token=' + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT;'; + delete localStorage.osinstallAuthAccessToken; + ssoLogin(); + } catch (error) { + notification.error({ + message: error.message + }); + } +} + +/** + * 通过接口获取sso + * @returns {*} + */ +export function getSsoWebUrl() { + return get('/api/cloudboot/v1/system/login/settings'); +} + +/** + * 获取菜单权限 + */ +export function getMenuPermissions() { + return get('/api/cloudboot/v1/users/info'); +} diff --git a/cyclone-web/app/store.js b/cyclone-web/app/store.js new file mode 100644 index 0000000000000000000000000000000000000000..7752942ed6314b9d229caba2b3cb9ba156731019 --- /dev/null +++ b/cyclone-web/app/store.js @@ -0,0 +1,65 @@ +/** + * Create the store with asynchronously loaded reducers + */ + +import { createStore, applyMiddleware, compose } from 'redux'; +import { fromJS } from 'immutable'; +import { routerMiddleware } from 'react-router-redux'; +import createSagaMiddleware from 'redux-saga'; +import createReducer from './reducers'; +import thunkMiddleware from 'redux-thunk'; + +const sagaMiddleware = createSagaMiddleware(); +const devtools = window.devToolsExtension || (() => noop => noop); + +// const reducerReq = require.context('./containers', true, /reducer\.js$/); +// const sagasReq = require.context('./containers', true, /sagas\.js$/); + +import globalSaga from 'containers/app/sagas'; + +export default function configureStore(initialState = {}, history) { + // Create the store with two middlewares + // 1. sagaMiddleware: Makes redux-sagas work + // 2. routerMiddleware: Syncs the location/URL path to the state + const middlewares = [ + thunkMiddleware, + sagaMiddleware, + routerMiddleware(history) + ]; + + const enhancers = [ + applyMiddleware(...middlewares), + devtools() + ]; + + const store = createStore( + createReducer(), + fromJS(initialState), + compose(...enhancers) + ); + + // Extensions + store.runSaga = sagaMiddleware.run; + store.asyncReducers = {}; // Async reducer registry + + store.runSaga(globalSaga); + // // dynamic require reducers and sagas + // sagasReq.keys().forEach((key) => { + // const sagas = sagasReq(key).default; + // sagas.map(store.runSaga); + // }); + + // reducerReq.keys().forEach((key) => { + // const reducer = reducerReq(key).default; + // const matches = key.match(/\.\/(.*)+\//); + // if (matches) { + // store.asyncReducers[reducer.NAME || matches[1]] = reducer; + // } else { + // store.asyncReducers[reducer.NAME] = reducer; + // } + // }); + const nextReducers = createReducer(store.asyncReducers); + store.replaceReducer(nextReducers); + + return store; +} diff --git a/cyclone-web/app/tests/store.test.js b/cyclone-web/app/tests/store.test.js new file mode 100644 index 0000000000000000000000000000000000000000..6bbce4c69cb53265f190f7c77f04bd70c61d9649 --- /dev/null +++ b/cyclone-web/app/tests/store.test.js @@ -0,0 +1,26 @@ +/** + * Test store addons + */ + +import expect from 'expect'; +import configureStore from '../store'; +import { browserHistory } from 'react-router'; + +describe('configureStore', () => { + let store, before; + before(() => { + store = configureStore({}, browserHistory); + }); + + describe('asyncReducers', () => { + it('should contain an object for async reducers', () => { + expect(typeof store.asyncReducers).toEqual('object'); + }); + }); + + describe('runSaga', () => { + it('should contain a hook for `sagaMiddleware.run`', () => { + expect(typeof store.runSaga).toEqual('function'); + }); + }); +}); diff --git a/cyclone-web/app/utils/asyncInjectors.js b/cyclone-web/app/utils/asyncInjectors.js new file mode 100644 index 0000000000000000000000000000000000000000..dfb647855555273b75c6ffb3a22ff8ad7d2db0c1 --- /dev/null +++ b/cyclone-web/app/utils/asyncInjectors.js @@ -0,0 +1,80 @@ +import { conformsTo, isEmpty, isFunction, isObject, isString } from 'lodash'; +import invariant from 'invariant'; +import warning from 'warning'; +import createReducer from '../reducers'; + +/** + * Validate the shape of redux store + */ +export function checkStore(store) { + const shape = { + dispatch: isFunction, + subscribe: isFunction, + getState: isFunction, + replaceReducer: isFunction, + runSaga: isFunction, + asyncReducers: isObject + }; + invariant( + conformsTo(store, shape), + '(app/utils...) asyncInjectors: Expected a valid redux store' + ); +} + +/** + * Inject an asynchronously loaded reducer + */ +export function injectAsyncReducer(store, isValid) { + return function injectReducer(name, asyncReducer) { + if (!isValid) { + checkStore(store); + } + + invariant( + isString(name) && !isEmpty(name) && isFunction(asyncReducer), + '(app/utils...) injectAsyncReducer: Expected `asyncReducer` to be a reducer function' + ); + + if (Reflect.has(store.asyncReducers, name)) { + return; + } + + store.asyncReducers[name] = asyncReducer; // eslint-disable-line no-param-reassign + store.replaceReducer(createReducer(store.asyncReducers)); + }; +} + +/** + * Inject an asynchronously loaded saga + */ +export function injectAsyncSagas(store, isValid) { + return function injectSagas(sagas) { + if (!isValid) { + checkStore(store); + } + + invariant( + Array.isArray(sagas), + '(app/utils...) injectAsyncSagas: Expected `sagas` to be an array of generator functions' + ); + + warning( + !isEmpty(sagas), + '(app/utils...) injectAsyncSagas: Received an empty `sagas` array' + ); + + sagas.map(store.runSaga); + }; +} + +/** + * Helper for creating injectors + */ +export function getAsyncInjectors(store) { + checkStore(store); + + return { + injectReducer: injectAsyncReducer(store, true), + injectSagas: injectAsyncSagas(store, true) + }; +} diff --git a/cyclone-web/app/utils/get-options.js b/cyclone-web/app/utils/get-options.js new file mode 100644 index 0000000000000000000000000000000000000000..917142efaf4fc1eb481d7dab9275ead16b5e115f --- /dev/null +++ b/cyclone-web/app/utils/get-options.js @@ -0,0 +1,14 @@ +export default ( + data = [], + keyMap = { + valueKey: 'id', + labelKey: 'name' + } +) => { + return data.map(it => { + return { + label: it[keyMap.labelKey], + value: it[keyMap.valueKey] + }; + }); +}; diff --git a/cyclone-web/app/utils/get-search-tree-data.js b/cyclone-web/app/utils/get-search-tree-data.js new file mode 100644 index 0000000000000000000000000000000000000000..3125426c17af6ea0cf8f98a8117fc039dbeee451 --- /dev/null +++ b/cyclone-web/app/utils/get-search-tree-data.js @@ -0,0 +1,115 @@ +import React from 'react'; + +/** + * return treeData + */ +const isLeaf = (node) => { + //return node.leaf || !node.children; + return node.children.length === 0; +}; + +const searchAllNodes = (nodes, search) => { + const expandedKeys = []; + const walk = (nodes = []) => { + let find = false; + if (nodes.length === 0) { + return find; + } + nodes.forEach(node => { + // reset + node.find = false; + if (node.children && node.children.length > 0) { + node.open = walk(node.children); + if (node.open) { + find = true; + expandedKeys.push(node.id); + } + } + if (node.name.indexOf(search) >= 0) { + find = true; + node.find = true; + } + }); + return find; + }; + + walk(nodes); + return { + expandedKeys, + nodes + }; +}; + + +const searchLeafOnly = (nodes, search) => { + const ret = []; + const walk = (nodes = []) => { + if (nodes.length === 0) { + return; + } + nodes.forEach(node => { + if (node.children && node.children.length > 0) { + walk(node.children); + } + if (isLeaf(node)) { + if (node.name.indexOf(search) >= 0) { + ret.push(node); + } + } + }); + }; + + walk(nodes); + return ret; +}; + +const getSearchTreeData = (nodes = [], search = '', options = {}) => { + const { + searchDirectory = false + // labelField = "name" + } = options; + + if (!search || search.trim() === '') { + if (!searchDirectory) { + return nodes; + } else { + return { + nodes, + expandedKeys: [] + }; + } + } + + search = search.trim(); + + if (!searchDirectory) { + return searchLeafOnly(nodes, search); + } + + return searchAllNodes(nodes, search); +}; + +export const getSearchLabel = (text, searchValue) => { + searchValue = searchValue.trim(); + const index = text.indexOf(searchValue); + if (searchValue === '' || index < 0) { + return text; + } + const pre = text.substring(0, index); + const after = text.substring(index + searchValue.length); + return ( + <span> + {pre} + <b style={{ + color: '#000000', + background: '#fbdd17', + display: 'inline-block', + padding: '0 5px' + }} + > {searchValue} </b> + {after} + </span> + ); +}; + +export default getSearchTreeData; diff --git a/cyclone-web/app/utils/get-tree-select-data.js b/cyclone-web/app/utils/get-tree-select-data.js new file mode 100644 index 0000000000000000000000000000000000000000..2000e4c401e61659fa64b79373c64516cf9f97af --- /dev/null +++ b/cyclone-web/app/utils/get-tree-select-data.js @@ -0,0 +1,29 @@ + +//机架和机位树结构数据转换 +export default function renderTreeData(data, code) { + if (!data) { + return null; + } + if (!(data instanceof Array)) { + data = [data]; + } + // title: 'Node1', + // value: '0-0', + // key: '0-0', + const loop = (el) => { + el.title = `${el.cabinet_number} 可用机位数: ${el.available_usites_count}`; + el.value = el.cabinet_number; + el.key = el.cabinet_number; + if (el.leaves) { + el.leaves.forEach(t => { + t.title = t.usite_number; + t.value = t.usite_id; + t.key = t.usite_id; + }); + el.children = el.leaves; + } + }; + data.forEach(loop); + console.log(data); + return data; +} diff --git a/cyclone-web/app/utils/handle-state-action.js b/cyclone-web/app/utils/handle-state-action.js new file mode 100644 index 0000000000000000000000000000000000000000..a3fd7aa7beb8e638bb6d4545d4d18af3afa01484 --- /dev/null +++ b/cyclone-web/app/utils/handle-state-action.js @@ -0,0 +1,22 @@ +/** + * create state action handler + */ +export default function createStateActonHandler(reducers) { + const handleAction = (state, action) => { + + // action is an array + if (action instanceof Array) { + return action.reduce((state, action) => { + return handleAction(state, action); + }, state); + } + + const type = action.type; + if (!reducers[type]) { + return state; + } + return reducers[type](state, action); + }; + + return handleAction; +} diff --git a/cyclone-web/app/utils/regular-reducer.js b/cyclone-web/app/utils/regular-reducer.js new file mode 100644 index 0000000000000000000000000000000000000000..35851d280038c99ae75533b44aebeee5fe256b12 --- /dev/null +++ b/cyclone-web/app/utils/regular-reducer.js @@ -0,0 +1,22 @@ +import { fromJS } from 'immutable'; + +/** + * + * @param prefixName + * @param keyPath + * @returns {{}} + * + */ +export function createRegularReducer(prefixName, keyPath = []) { + if (typeof keyPath === 'string') { + keyPath = [keyPath]; + } + return { + [`${prefixName}/load`]: (state, action) => { + return state.setIn([ ...keyPath, 'loading' ], true); + }, + [`${prefixName}/load/success`]: (state, action) => { + return state.setIn([ ...keyPath, 'loading' ], false).setIn([ ...keyPath, 'data' ], fromJS(action.payload)); + } + }; +} diff --git a/cyclone-web/app/utils/request.js b/cyclone-web/app/utils/request.js new file mode 100644 index 0000000000000000000000000000000000000000..958fb3fcf2608269413b034267a423931d071e52 --- /dev/null +++ b/cyclone-web/app/utils/request.js @@ -0,0 +1,45 @@ +import 'whatwg-fetch'; + +/** + * Parses the JSON returned by a network request + * + * @param {object} response A response from a network request + * + * @return {object} The parsed JSON from the request + */ +function parseJSON(response) { + return response.json(); +} + +/** + * Checks if a network request came back fine, and throws an error if not + * + * @param {object} response A response from a network request + * + * @return {object|undefined} Returns either the response, or throws an error + */ +function checkStatus(response) { + if (response.status >= 200 && response.status < 300) { + return response; + } + + const error = new Error(response.statusText); + error.response = response; + throw error; +} + +/** + * Requests a URL, returning a promise + * + * @param {string} url The URL we want to request + * @param {object} [options] The options we want to pass to "fetch" + * + * @return {object} An object containing either "data" or "err" + */ +export default function request(url, options) { + return fetch(url, options) + .then(checkStatus) + .then(parseJSON) + .then(data => ({ data })) + .catch(err => ({ err })); +} diff --git a/cyclone-web/app/utils/resolve.js b/cyclone-web/app/utils/resolve.js new file mode 100644 index 0000000000000000000000000000000000000000..f895e55106ae95591804abb9a777b00a34805b74 --- /dev/null +++ b/cyclone-web/app/utils/resolve.js @@ -0,0 +1,12 @@ +export function resolve(path, obj, key, value) { + let recursivePath = ''; + return path.split('.').reduce((prev, curr) => { + if (value) { + recursivePath += curr + '.'; + if (recursivePath.substr(0, recursivePath.length - 1) === path) { + prev[curr][key] = value; + } + } + return prev ? prev[curr] : undefined; + }, obj || {}); +} diff --git a/cyclone-web/app/utils/search-list-Saga.js b/cyclone-web/app/utils/search-list-Saga.js new file mode 100644 index 0000000000000000000000000000000000000000..48f743ad7998a43c765b59b050373f96365d94f4 --- /dev/null +++ b/cyclone-web/app/utils/search-list-Saga.js @@ -0,0 +1,38 @@ +import { notification } from 'antd'; +import { call, put } from 'redux-saga/effects'; +import { takeEvery } from 'redux-saga'; +import { getWithArgs } from 'common/xFetch2'; + +export function createSearchListSaga(options = {}) { + const { + actionNamePrefix = 'list', + datasource + } = options; + return takeEvery(`${actionNamePrefix}/getSearchList`, getSearchList) + ; + function* getSearchList(action) { + try { + yield put({ + type: `${actionNamePrefix}/load` + }); + + const res = yield call(getWithArgs, datasource, { page: 1, page_size: 100 }); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + + const list = (res.content.records || []).map(it => { + return { + label: it.name, value: it.id + }; + }); + + yield put({ + type: `${actionNamePrefix}/load/success`, + payload: list + }); + } catch (error) { + console.log(error); + } + } +} diff --git a/cyclone-web/app/utils/table-async-action.js b/cyclone-web/app/utils/table-async-action.js new file mode 100644 index 0000000000000000000000000000000000000000..a02cc551e7861e94863eacd2991015898961d2ac --- /dev/null +++ b/cyclone-web/app/utils/table-async-action.js @@ -0,0 +1,173 @@ +import { notification } from 'antd'; +import { post, get, getWithArgs } from 'common/xFetch2'; +import { fromJS } from 'immutable'; + +const pause = time => { + return new Promise(resolve => { + setTimeout(ev => { + resolve(); + }, time); + }); +}; + +export function createTableAsyncAction(options) { + const { + actionNamePrefix = 'table', + tableDataPath = ['tableData'], // ["project", "tableData"] + datasource, + noMoreQuery, + getDatasource, + pageParameter, + fetchMethod = getWithArgs, + getExtraQuery = (state, action) => { + return {}; + } // 在查询 table 数据的时候需要获取额外的数据 + } = options; + + /** + * 加载 Table 数据 + */ + async function getTableData(state, action, dispatch, select, url) { + try { + dispatch({ + type: `${actionNamePrefix}/load` + }); + + state = select(); + const extraQuery = getExtraQuery(state, action); + const pagination = state.getIn([ ...tableDataPath, 'pagination' ]).toJS(); + let query = state.getIn([ ...tableDataPath, 'query' ]); + let sorter = state.getIn([ ...tableDataPath, 'sorter' ]); + + if (query) { + query = query.toJS(); + } else { + query = {}; + } + + // 获取数据方法 + // 接口可能不支持传入limit, page 等额外属性,因此需要加个判断,虽然丑了点 + const fetch = options.fetchMethod || getWithArgs; + + let realDatasource = datasource || url; + if (typeof getDatasource === 'function') { + realDatasource = getDatasource(state, action); + } + //boot新的接口分页参数传page,page_size,旧的接口传Limit,Offset,Offset从0开始 + let pageSizeKey = 'page_size'; + let pageKey = 'page'; + let page = pagination.page; + if (pageParameter) { + pageKey = pageParameter.page; + pageSizeKey = pageParameter.pageSize; + page = page - 1; + } + + const ret = await fetch( + realDatasource, + noMoreQuery + ? { ...extraQuery, ...query } + : { + ...query, + ...extraQuery, + ...sorter, + [pageKey]: page, + [pageSizeKey]: pagination.pageSize + } + ); + const content = ret.content || ret.Content; + dispatch({ + type: `${actionNamePrefix}/load/success`, + payload: { + content: content.records || content.list, + pagination: { + pageSize: content.page_size || pagination.pageSize, + page: content.page || pagination.page, + total: content.total_records || content.recordCount + } + } + }); + + if (action.payload && action.payload.cb) { + action.payload.cb(ret); + } + } catch (err) { + notification.error({ + message: err.message + }); + console.log(err); + } + } + + /** + * 搜索 + */ + async function searchTable(state, action, dispatch, select, url) { + try { + dispatch([ + { + type: `${actionNamePrefix}/set-query`, + payload: action.payload + }, + { + type: `${actionNamePrefix}/set-page`, + payload: { + page: 1 + } + } + ]); + await pause(100); + await getTableData(state, action, dispatch, select, url); + } catch (err) { + notification.error({ + message: err.message + }); + console.log(err); + } + } + + /** + * 操作定义分页 + */ + async function changePage(state, action, dispatch, select, url) { + try { + dispatch({ + type: `${actionNamePrefix}/set-page`, + payload: action.payload + }); + await pause(100); + await getTableData(state, action, dispatch, select, url); + } catch (err) { + notification.error({ + message: err.message + }); + console.log(err); + } + } + + /** + * 操作定义分页大小 + */ + async function changePageSize(state, action, dispatch, select, url) { + try { + dispatch({ + type: `${actionNamePrefix}/set-page-size`, + payload: action.payload + }); + await pause(100); + await getTableData(state, action, dispatch, select, url); + } catch (err) { + notification.error({ + message: err.message + }); + console.log(err); + } + } + + return { + [`${actionNamePrefix}/change-page-size`]: changePageSize, + [`${actionNamePrefix}/change-page`]: changePage, + [`${actionNamePrefix}/search`]: searchTable, + [`${actionNamePrefix}/get`]: getTableData + }; +} diff --git a/cyclone-web/app/utils/table-reducer.js b/cyclone-web/app/utils/table-reducer.js new file mode 100644 index 0000000000000000000000000000000000000000..af9251b0992c19e557c24545d7c6b7c78f359b73 --- /dev/null +++ b/cyclone-web/app/utils/table-reducer.js @@ -0,0 +1,127 @@ +import { fromJS } from 'immutable'; + +/** + * [create create table reducer] + * @param {[type]} path [description] + * @return {[type]} [description] + */ + +export function createTableStore() { + return { + loading: false, + list: [], + pagination: { + page: 1, + pageSize: 10 + }, + query: {}, + sorter: {}, + expand: false, + selectedRowKeys: [], + selectedRows: [] + }; +} + +function updateCache(arr = [], tableDataCache) { + if (!(arr instanceof Array)) { + return; + } + arr.forEach(it => { + tableDataCache[(it.id === 'undefined' ? it.ID : it.id)] = it; + }); + return tableDataCache; +} + +function populateCache(ids = [], tableDataCache) { + return ids.map(id => { + if (tableDataCache[id]) { + return tableDataCache[id]; + } + }); +} + +/** + * [create description] + * @param {[type]} path [description] + * @return {[type]} [description] + */ +export function createTableReducer(actionNamePrefix, keyPath = []) { + if (typeof keyPath === 'string') { + keyPath = [keyPath]; + } + + return { + [actionNamePrefix + '/load']: (state, action) => { + return state.setIn([ ...keyPath, 'loading' ], true); + }, + [actionNamePrefix + '/load/fail']: (state, action) => { + return state.setIn([ ...keyPath, 'loading' ], false); + }, + [`${actionNamePrefix}/reset`]: (state, action) => { + return state.updateIn(keyPath, tableState => { + return fromJS(createTableStore()); + }); + }, + [`${actionNamePrefix}/toggle/expand`]: (state, action) => { + return state.updateIn(keyPath, tableState => { + return tableState.set('expand', !tableState.get('expand')); + }); + }, + [`${actionNamePrefix}/load/success`]: (state, action) => { + const payload = action.payload; + const cache = state.getIn([ ...keyPath, 'dataCache' ]) || {}; + updateCache(payload.content || [], cache); + return state.updateIn(keyPath, tableState => { + return tableState + .set('list', fromJS(payload.content)) + .set('dataCache', cache) + .update('pagination', pagi => { + const plainP = pagi.toJS(); + const pagiRemote = { + ...payload.pagination + }; + delete pagiRemote.content; + + return fromJS({ + ...plainP, + ...pagiRemote + }); + }) + .set('loading', false); + }); + }, + [`${actionNamePrefix}/set/selectedRows`]: (state, action) => { + const cache = state.getIn([ ...keyPath, 'dataCache' ]) || {}; + return state.updateIn(keyPath, tableState => { + return ( + tableState + // .set("selectedRows", fromJS(action.payload.selectedRows)) + .set( + 'selectedRows', + fromJS(populateCache(action.payload.selectedRowKeys, cache)) + ) + .set('selectedRowKeys', fromJS(action.payload.selectedRowKeys)) + ); + }); + }, + [`${actionNamePrefix}/set-page-size`]: (state, action) => { + return state.updateIn(keyPath, tableState => { + return tableState + .setIn([ 'pagination', 'pageSize' ], action.payload.pageSize) + .setIn([ 'pagination', 'page' ], 1); + }); + }, + [`${actionNamePrefix}/set-page`]: (state, action) => { + return state.setIn( + [ ...keyPath, 'pagination', 'page' ], + action.payload.page + ); + }, + [`${actionNamePrefix}/set-query`]: (state, action) => { + return state.setIn([ ...keyPath, 'query' ], fromJS(action.payload)); + }, + [`${actionNamePrefix}/set-sorter`]: (state, action) => { + return state.setIn([ ...keyPath, 'sorter' ], fromJS(action.payload)); + } + }; +} diff --git a/cyclone-web/app/utils/table-saga.js b/cyclone-web/app/utils/table-saga.js new file mode 100644 index 0000000000000000000000000000000000000000..f30a1ba9a1fb47ec900502802ed84115d97ec816 --- /dev/null +++ b/cyclone-web/app/utils/table-saga.js @@ -0,0 +1,198 @@ +import { take, call, put, select, fork, cancel } from 'redux-saga/effects'; +import { takeEvery } from 'redux-saga'; +import { get, getWithArgs, post } from 'common/xFetch2'; + +import { Modal, notification } from 'antd'; + +export function createTableSaga(options = {}) { + const { + actionNamePrefix = 'table', + tableDataPath = ['tableData'], // ["project", "tableData"] + datasource, + fetchMethod = getWithArgs, + noMoreQuery, + pageParameter, + defaultPageSize, + getDatasource, + getExtraQuery = (state, action) => { + return {}; + } // 在查询 table 数据的时候需要获取额外的数据 + } = options; + return function* defaultSaga() { + const watchers = yield [ + takeEvery(`${actionNamePrefix}/change-page-size`, changePageSize), + takeEvery(`${actionNamePrefix}/change-page`, changePage), + takeEvery(`${actionNamePrefix}/search`, search), + takeEvery(`${actionNamePrefix}/clearSearch`, clearSearch), + takeEvery(`${actionNamePrefix}/reload`, getTableData), + takeEvery(`${actionNamePrefix}/sort`, sort), + takeEvery(`${actionNamePrefix}/get`, getTableData) + ]; + }; + + function* getTableData(action) { + try { + const state = yield select(); + + yield put({ + type: `${actionNamePrefix}/load` + }); + + const pagination = state.getIn([ ...tableDataPath, 'pagination' ]).toJS(); + + const extraQuery = getExtraQuery(state, action); + let query = state.getIn([ ...tableDataPath, 'query' ]); + let sorter = state.getIn([ ...tableDataPath, 'sorter' ]); + let schema = state.getIn([ ...tableDataPath, 'schema' ]) || {}; + schema = schema.toJS ? schema.toJS() : schema; + + if (query) { + query = query.toJS(); + } else { + query = {}; + } + + if (sorter) { + sorter = sorter.toJS(); + if (sorter.field) { + sorter = { + sortField: window.encodeURIComponent(sorter.field), + sortOrder: sorter.order + }; + } else { + sorter = {}; + } + } else { + sorter = {}; + } + + let realDatasource = schema.datasource || datasource; + if (typeof getDatasource === 'function') { + realDatasource = getDatasource(state, action); + } + const fetch = options.fetchMethod || getWithArgs; + + //boot新的接口分页参数传page,page_size,旧的接口传Limit,Offset,Offset从0开始 + let pageSizeKey = 'page_size'; + let pageKey = 'page'; + let page = pagination.page; + if (pageParameter) { + pageKey = pageParameter.page; + pageSizeKey = pageParameter.pageSize; + page = page - 1; + } + let pageSize = pagination.pageSize; + if (defaultPageSize) { + pageSize = defaultPageSize.pageSize; + } + // 接口可能不支持传入limit, page 等额外属性,因此需要加个判断,虽然丑了点 + const ret = yield call( + fetch, + realDatasource, + noMoreQuery + ? { ...extraQuery } + : { + ...query, + ...extraQuery, + ...sorter, + [pageKey]: page, + [pageSizeKey]: pageSize + } + ); + if (ret.status !== 'success') { + yield put({ + type: `${actionNamePrefix}/load/fail` + }); + return notification.error({ message: ret.message }); + } + + const content = ret.content || ret.Content; + + yield put({ + type: `${actionNamePrefix}/load/success`, + payload: { + content: content.records || content.list || content.items, + pagination: { + pageSize: content.page_size || pagination.pageSize, + page: content.page || pagination.page, + total: content.total_records || content.recordCount + } + } + }); + if (action && action.payload && action.payload.cb) { + action.payload.cb(ret); + } + } catch (error) { + yield put({ + type: `${actionNamePrefix}/load/fail` + }); + console.log(error); + } + } + function* changePageSize(action) { + yield put({ + type: `${actionNamePrefix}/set-page-size`, + payload: action.payload + }); + + yield call(getTableData); + } + + function* changePage(action) { + yield put({ + type: `${actionNamePrefix}/set-page`, + payload: action.payload + }); + + yield call(getTableData); + } + + function* search(action) { + yield [ + put({ + type: `${actionNamePrefix}/set-query`, + payload: action.payload + }), + put({ + type: `${actionNamePrefix}/set-page`, + payload: { + page: 1 + } + }) + ]; + + yield call(getTableData); + } + + // 清楚搜索框字符,不reload + function* clearSearch(action) { + yield [ + put({ + type: `${actionNamePrefix}/set-query`, + payload: action.payload + }), + put({ + type: `${actionNamePrefix}/set-page`, + payload: { + page: 1 + } + }) + ]; + } + + function* sort(action) { + yield [ + put({ + type: `${actionNamePrefix}/set-sorter`, + payload: action.payload + }), + put({ + type: `${actionNamePrefix}/set-page`, + payload: { + page: 1 + } + }) + ]; + yield call(getTableData); + } +} diff --git a/cyclone-web/app/utils/tableList-saga.js b/cyclone-web/app/utils/tableList-saga.js new file mode 100644 index 0000000000000000000000000000000000000000..1727a350775f015c1209b1bc17829b859c29e479 --- /dev/null +++ b/cyclone-web/app/utils/tableList-saga.js @@ -0,0 +1,36 @@ +import { notification } from 'antd'; +import { call, put } from 'redux-saga/effects'; +import { takeEvery } from 'redux-saga'; +import { getWithArgs } from 'common/xFetch2'; + +export function createTableListSaga(options = {}) { + const { + actionNamePrefix = 'list', + datasource, + pageSize = '100' + } = options; + return function* defaultSaga() { + const watches = yield [ + takeEvery(`${actionNamePrefix}/get`, getList) + ]; + }; + + function* getList(action) { + try { + yield put({ + type: `${actionNamePrefix}/load` + }); + + const res = yield call(getWithArgs, datasource, { page: 1, page_size: pageSize }); + if (res.status !== 'success') { + return notification.error({ message: res.message }); + } + yield put({ + type: `${actionNamePrefix}/load/success`, + payload: res.content.records + }); + } catch (error) { + console.log(error); + } + } +} diff --git a/cyclone-web/app/utils/to-js.js b/cyclone-web/app/utils/to-js.js new file mode 100644 index 0000000000000000000000000000000000000000..6a99c996aaaaf490f3c57a19bcc6b4574b8f1e3e --- /dev/null +++ b/cyclone-web/app/utils/to-js.js @@ -0,0 +1,21 @@ +import React from 'react'; +import { Iterable } from 'immutable'; + +export const toJS = WrappedComponent => wrappedComponentProps => { + const KEY = 0; + const VALUE = 1; + + const propsJS = Object.entries(wrappedComponentProps).reduce( + (newProps, wrappedComponentProp) => { + newProps[wrappedComponentProp[KEY]] = Iterable.isIterable( + wrappedComponentProp[VALUE] + ) + ? wrappedComponentProp[VALUE].toJS() + : wrappedComponentProp[VALUE]; + return newProps; + }, + {} + ); + + return <WrappedComponent {...propsJS} />; +}; diff --git a/cyclone-web/app/utils/userUtil.js b/cyclone-web/app/utils/userUtil.js new file mode 100644 index 0000000000000000000000000000000000000000..d67b587632c509d3486a79ceaeba233244607ddd --- /dev/null +++ b/cyclone-web/app/utils/userUtil.js @@ -0,0 +1,17 @@ +/** + * 获取当前用户信息。 + * + * Created by zhangrong on 16/12/25. + */ +import { base64decodeFunc } from 'common/base64'; + +export default function getCurrentUser() { + const accout = base64decodeFunc(localStorage.OMC_ACCOUT); + const name = base64decodeFunc(localStorage.CONT_NAME); + const id = base64decodeFunc(localStorage.CONF_ID); + + return { + accout, name, id + }; +} + diff --git a/cyclone-web/app/utils/uuid.js b/cyclone-web/app/utils/uuid.js new file mode 100644 index 0000000000000000000000000000000000000000..25d22b5c6df40b9afbf1a6a6ed7ef9c30cdd304b --- /dev/null +++ b/cyclone-web/app/utils/uuid.js @@ -0,0 +1,12 @@ +function generateUUID() { + var d = new Date().getTime(); + var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = (d + Math.random() * 16) % 16 | 0; + d = Math.floor(d / 16); + return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16); + }); + return uuid; +} + +window.uuid = generateUUID; +export default generateUUID; diff --git a/cyclone-web/app/vendor.js b/cyclone-web/app/vendor.js new file mode 100644 index 0000000000000000000000000000000000000000..9379c10ab032983af69666475ffcb81159963ac1 --- /dev/null +++ b/cyclone-web/app/vendor.js @@ -0,0 +1,43 @@ +import 'babel-polyfill'; +import * as React from 'react'; +import * as ReactDOM from 'react-dom'; +import * as ReactRedux from 'react-redux'; +import * as ReactRouter from 'react-router'; +import * as Immutable from 'immutable'; +import * as ReactRouterRedux from 'react-router-redux'; +import * as ReduxSaga from 'redux-saga'; +import * as ReduxThunk from 'redux-thunk'; +import * as Redux from 'redux'; +import * as JsCookie from 'js-cookie'; +import * as ObjectPath from 'object-path'; +import * as lodash from 'lodash'; +import * as ReduxActions from 'redux-actions'; +import * as ReactIntl from 'react-intl'; +import * as Reselect from 'reselect'; +import * as RcQueueAnim from 'rc-queue-anim'; +import * as echarts from 'echarts'; +import * as rcAnimate from 'rc-animate'; +const libs = { + React, + ReactDOM, + ReactRedux, + ReactRouter, + Immutable, + ReactRouterRedux, + ReduxSaga, + ReduxThunk, + Redux, + JsCookie, + ObjectPath, + lodash, + ReduxActions, + ReactIntl, + Reselect, + RcQueueAnim, + echarts, + rcAnimate +}; + +Object.keys(libs).forEach(key => { + window[key] = libs[key]; +}); diff --git a/cyclone-web/docs/README.md b/cyclone-web/docs/README.md new file mode 100644 index 0000000000000000000000000000000000000000..bca063d699c38cc1336e0b27836685ab11dd3160 --- /dev/null +++ b/cyclone-web/docs/README.md @@ -0,0 +1,128 @@ +# Documentation + +## Table of Contents + +- [General](general) + - [**CLI Commands**](general/commands.md) + - [Tool Configuration](general/files.md) + - [Server Configurations](general/server-configs.md) + - [Deployment](general/deployment.md) *(currently Heroku specific)* + - [FAQ](general/faq.md) + - [Gotchas](general/gotchas.md) + - [Remove](general/remove.md) +- [Testing](testing) + - [Unit Testing](testing/unit-testing.md) + - [Component Testing](testing/component-testing.md) + - [Remote Testing](testing/remote-testing.md) +- [CSS](css) + - [PostCSS](css/postcss.md) + - [CSS Modules](css/css-modules.md) + - [sanitize.css](css/sanitize.md) +- [JS](js) + - [Redux](js/redux.md) + - [ImmutableJS](js/immutablejs.md) + - [reselect](js/reselect.md) + - [redux-saga](js/redux-saga.md) + - [i18n](js/i18n.md) + - [routing](js/routing.md) + +## Overview + +### Quickstart + +1. First, let's kick the tyres by launching the sample _Repospective_ app + bundled with this project to demo some of its best features: + + ```Shell + npm run setup && npm start + ``` + +1. Open [localhost:3000](http://localhost:3000) to see it in action. + + - Add a Github username to see Redux and Redux Sagas in action: effortless + async state updates and side effects are now yours :) + - Edit the file at `./app/containers/HomePage/index.js` so that the text of + the `<Button>` component reads "Features!!!"... Hot Module Reloading gives + you a feedback loop with your UI so smooth it's almost conversational! + - Click your (newly emphatic) Features button to see React Router in action... + Now you can share a direct link to that content privately over your LAN or + globally addressable to any device, anywhere. Not bad for a locally-running + Single Page App. + +1. Time to build your own app: run + + ```shell + npm run clean + ``` + + ...and use the built-in generators to start your first feature. + +### Development + +Run `npm start` to see your app at `localhost:3000` + +### Building & Deploying + +1. Run `npm run build`, which will compile all the necessary files to the +`build` folder. + +2. Upload the contents of the `build` folder to your web server's root folder. + +### Structure + +The [`app/`](../../../tree/master/app) directory contains your entire application code, including CSS, +JavaScript, HTML and tests. + +The rest of the folders and files only exist to make your life easier, and +should not need to be touched. + +*(If they do have to be changed, please [submit an issue](https://github.com/mxstbr/react-boilerplate/issues)!)* + +### CSS + +Each component `import`s its styling dependencies from a co-located `styles.css` +module. + +A production build transpiles these modules into page-specific CSS files (based +on which components are actually used), while any shared styles are automatically +extracted into a "common" stylesheet. + +This means the leanest, fastest payload for your users. + +See the [CSS documentation](./css/README.md) for more information about PostCSS +and CSS modules. + +### JS + +We bundle all your clientside scripts and chunk them into several files using +code splitting where possible. We then automatically optimize your code when +building for production so you don't have to worry about that. + +See the [JS documentation](./js/README.md) for more information about the +JavaScript side of things. + +### SEO + +We use [react-helmet](https://github.com/nfl/react-helmet) for managing document head tags. Examples on how to +write head tags can be found [here](https://github.com/nfl/react-helmet#examples). + +### Testing + +For a thorough explanation of the testing procedure, see the +[testing documentation](./testing/README.md)! + +#### Performance testing + +With the production server running (i.e. while `npm run start:production` is running in +another tab), enter `npm run pagespeed` to run Google PageSpeed Insights and +get a performance check right in your terminal! + +#### Browser testing + +`npm run start:tunnel` makes your locally-running app globally available on the web +via a temporary URL: great for testing on different devices, client demos, etc! + +#### Unit testing + +Unit tests live in `test/` directories right next to the components being tested +and are run with `npm run test`. diff --git a/cyclone-web/docs/css/README.md b/cyclone-web/docs/css/README.md new file mode 100644 index 0000000000000000000000000000000000000000..10a0767fca4cd59ffed799bdced65b3b49a18fe6 --- /dev/null +++ b/cyclone-web/docs/css/README.md @@ -0,0 +1,15 @@ +# CSS + +This boilerplate uses PostCSS as a CSS preprocessor with a few utility plugins +to make it "batteries included". + +CSS Modules lets us embrace component encapsulation while sanitize.css gives us +data-driven cross-browser normalisation. + +Learn more: + +- [PostCSS](postcss.md) +- [CSS Modules](css-modules.md) +- [sanitize.css](sanitize.md) +- [stylelint.css](stylelint.md) +- [Using Sass](sass.md) diff --git a/cyclone-web/docs/css/css-modules.md b/cyclone-web/docs/css/css-modules.md new file mode 100644 index 0000000000000000000000000000000000000000..20df41da21f9dd5631b53b550ad2b71c23bc732e --- /dev/null +++ b/cyclone-web/docs/css/css-modules.md @@ -0,0 +1,146 @@ +# CSS Modules + +With CSS Modules, all class names are locally scoped by default. This means +no more bugs from classname clashes. Being able to compose primitives to build +up behaviour also lets us bring programming best practice to CSS: DRY, reusable, +modular code FTW! + +For a detailed explanation see the +[official documentation](https://github.com/css-modules/css-modules). + +## Usage + +Write your CSS normally in the `styles.css` file in the component folder. + +```css +/* styles.css */ + +.saveBtn { + composes: btn from '../components/btn'; // Yay for composition! + + background-color: green; + color: white; +} +``` + +Then `import` the CSS file in your component JavaScript file, and reference the +class name in the `className` prop. + +```javascript +// index.js + +import styles from './styles.css'; + +// ...inside the render()... + +return ( + <button className={ styles.saveBtn }> + Save! + </button> +); +``` + +## Integrating Global CSS + +Because class names in CSS Modules are locally scoped by default, there is some +additional setup and consideration that must be taken to work correctly with +traditional global CSS. + +Let's use [Bootstrap](http://getbootstrap.com/) as an example. First of all, +because we are in the React environment, it is widely recommended to not use +the Javascript code that is packaged with Bootstrap, but rather to re-write that +code in a React-friendly way. Thankfully +[react-bootstrap](https://react-bootstrap.github.io/) exists which provides +components built using the native Bootstrap CSS classes. But because these +components are built using the native global CSS, even with react-bootstrap +there is the need to deal with global CSS. As an additional constraint for +this example, let's use npm and webpack to manage our dependencies so that +there is no need to manually add any script tags to `index.html`. + +### Preparation +Edit `package.json` and make the following modifications +``` + "dllPlugin": { + ... + "exclude": [ + "bootstrap-css-only", + ... + ], + ... + }, + "dependencies": { + ... + "bootstrap-css-only": "3.3.6", + "react-bootstrap": "0.30.0", + ... + }, +``` +The `exclude` configuration change is necessary to ensure that the dllPlugin build +process does not attempt to parse the global CSS. If you do not do this +there will be an error during the build process and you will not be able to +run the application. + +Now edit `internals/config.js` and make the following modifications +```javascript +const ReactBoilerplate = { + /* ... */ + dllPlugin: { + defaults: { + /* ... */ + exclude: [ + 'bootstrap-css-only', + /* ... */ + ], + + /* ... */ +}; +``` + +And finally edit `app/app.js`, and add the following after the line `import 'sanitize.css/sanitize.css';` +```javascript +import 'bootstrap-css-only/css/bootstrap.min.css'; +``` + +### Usage + +There are multiple approaches you can use to apply and override the global CSS. + +You can apply the global styles directly. +```javascript +<div className="container-fluid"></div> +``` + +You can apply global styles implicitly via `react-bootstrap`. +```javascript +<Grid fluid></div> +``` + +You can override global styles in your CSS module. +```css +:global .container-fluid { + margin-left: 20px; +} +``` + +Or you can add overrides via another local scope and +[classnames](https://github.com/JedWatson/classnames). +```css +.localContainer { + margin-left: 20px; +} +``` +```javascript +import styles from './styles.css'; +import classNames from 'classnames'; +<div className={ classNames('container-fluid', styles.localContainer) }></div> +``` + +Doing the same via `react-bootstrap`. +```javascript +import styles from './styles.css'; +<Grid fluid className={ styles.localContainer }></Grid> +``` + +--- + +_Don't like this feature? [Click here](remove.md)_ diff --git a/cyclone-web/docs/css/postcss.md b/cyclone-web/docs/css/postcss.md new file mode 100644 index 0000000000000000000000000000000000000000..9804338d543f1edab2010763ab3777bd363925f6 --- /dev/null +++ b/cyclone-web/docs/css/postcss.md @@ -0,0 +1,42 @@ +# PostCSS + +PostCSS is a modular CSS preprocessor based on JavaScript. It comes pre- +configured with the plugins listed below. + +See the [official documentation](https://github.com/postcss/postcss) for more +information! + +## Plugins + +This boilerplate bundles a few of the most useful PostCSS plugins by default: + +- [`postcss-focus`](https://github.com/postcss/postcss-focus): Adds a `:focus` + selector to every `:hover` selector for keyboard accessibility. +- [`autoprefixer`](https://github.com/postcss/autoprefixer): Prefixes your CSS + automatically for the last two versions of all major browsers and IE10+. +- [`cssnext`](https://github.com/moox/postcss-cssnext): Use tomorrow's CSS + features today. Transpiles CSS4 features down to CSS3. +- [`cssnano`](https://github.com/ben-eb/cssnano): Optimizes your CSS file. For a + full list of optimizations check [the official website](http://cssnano.co/optimisations/). + +For more awesome features that the PostCSS ecosystem offers, check out the +comprehensive, fully-searchable catalog of available plugins at [postcss.parts](http://postcss.parts). + +## Adding a new PostCSS plugin + +1. Add the plugin to your project (e.g. `npm install --save-dev postcss-super-plugin`). +2. Modify `internals/webpack/webpack.dev.babel.js`: + - Add `const postcssSuperPlugin = require('postcss-super-plugin');` + to `// PostCSS plugins` section. + - Find `postcss: () => [/* ... current set of plugins ... */]` and add + the new plugin to the list: `postcssPlugins: [/* ... */, postcssSuperPlugin()]`. +3. Restart the server (`CTRL+C`, `npm start`) for the new plugin to become available + (webpack does not pick config changes while running). + +Before installing a new plugin, make sure that you are not trying to add a feature +that is already available. It is likely that what you are looking for +[is supported by `cssnext`](http://cssnext.io/features/), which is a part of the boilerplate. + +--- + +_Don't like this feature? [Click here](remove.md)_ diff --git a/cyclone-web/docs/css/remove.md b/cyclone-web/docs/css/remove.md new file mode 100644 index 0000000000000000000000000000000000000000..040934bb8a48b895eb16ace6cf1a2cdc7c0f504a --- /dev/null +++ b/cyclone-web/docs/css/remove.md @@ -0,0 +1,23 @@ +## Removing CSS modules + +To remove this feature from your setup, stop importing `.css` files in your +components and delete the `modules` option from the `css-loader` declaration in +[`webpack.prod.babel.js`](/internals/webpack/webpack.prod.babel.js) and +[`webpack.base.babel.js`](/internals/webpack/webpack.base.babel.js)! + +## Removing PostCSS + +To remove PostCSS, delete the `postcssPlugins` option and remove all occurences +of the `postcss-loader` from + +- [`webpack.dev.babel.js`](/internals/webpack/webpack.dev.babel.js) +- [`webpack.prod.babel.js`](/internals/webpack/webpack.prod.babel.js) +- [`webpack.base.babel.js`](/internals/webpack/webpack.base.babel.js) + +When that is done - and you've verified that everything is still working - remove +all related dependencies from [`package.json`](/package.json)! + +## Removing `sanitize.css` + +Delete [lines 44 and 45 in `app.js`](../../app/app.js#L44-L45) and remove it +from the `dependencies` in [`package.json`](../../package.json)! diff --git a/cyclone-web/docs/css/sanitize.md b/cyclone-web/docs/css/sanitize.md new file mode 100644 index 0000000000000000000000000000000000000000..747ba2c8f925e0a91a3d120dfc1730fed461aa26 --- /dev/null +++ b/cyclone-web/docs/css/sanitize.md @@ -0,0 +1,17 @@ +# `sanitize.css` + +Sanitize.css makes browsers render elements more in +line with developer expectations (e.g. having the box model set to a cascading +`box-sizing: border-box`) and preferences (its defaults can be individually +overridden). + +It was selected over older projects like `normalize.css` and `reset.css` due +to its greater flexibility and better alignment with CSSNext features like CSS +variables. + +See the [official documentation](https://github.com/10up/sanitize.css) for more +information. + +--- + +_Don't like this feature? [Click here](remove.md)_ diff --git a/cyclone-web/docs/css/sass.md b/cyclone-web/docs/css/sass.md new file mode 100644 index 0000000000000000000000000000000000000000..1d047d81162948393eec9f01079506c292a3c319 --- /dev/null +++ b/cyclone-web/docs/css/sass.md @@ -0,0 +1,44 @@ +# Can I use Sass with this boilerplate? + +Yes, although we advise against it and **do not support this**. We selected +PostCSS over Sass because its approach is more powerful: instead of trying to +give a styling language programmatic abilities, it pulls logic and configuration +out into JS where we believe those features belong. + +As an alternative, consider installing a PostCSS plugin called [`PreCSS`](https://github.com/jonathantneal/precss): +it lets you use familiar syntax - $variables, nesting, mixins, etc. - but retain +the advantages (speed, memory efficiency, extensibility, etc) of PostCSS. + +If you _really_ still want (or need) to use Sass then... + +1. Change `internals/webpack/webpack.base.babel.js` so that line 22 reads + ```JavaScript + test: /\.s?css$/, + ``` + + This means that both `.scss` and `.css` will be picked up by the compiler + +1. Update each of + + - `internals/webpack/webpack.dev.babel.js` + - `internals/webpack/webpack.prod.babel.js` + + changing the config option for `cssLoaders` to + + ```JavaScript + cssLoaders: 'style-loader!css-loader?modules&importLoaders=1&sourceMap!postcss-loader!sass-loader', + ``` + + - `internals/webpack/webpack.test.babel.js` + + ```diff + loaders: [ + { test: /\.json$/, loader: 'json-loader' }, + { test: /\.css$/, loader: 'null-loader' }, ++ { test: /\.scss$/, loader: ['style-loader', 'css-loader', 'sass-loader'] }, + ... + ``` + + Then run `npm i -D sass-loader node-sass` + +...and you should be good to go! diff --git a/cyclone-web/docs/css/stylelint.md b/cyclone-web/docs/css/stylelint.md new file mode 100644 index 0000000000000000000000000000000000000000..4fb47536e3b81852d9f8abcf11cc197b73cf8369 --- /dev/null +++ b/cyclone-web/docs/css/stylelint.md @@ -0,0 +1,9 @@ +# stylelint + +stylelint catches bugs and helps keep you and your team on consistent with the +standards and conventions you define. + +We've pre-configured it to extend [stylelint-config-standard](https://github.com/stylelint/stylelint-config-standard) +but you can (and should!) adapt it to your house style. + +See the [official documentation](http://stylelint.io/) for more information! diff --git a/cyclone-web/docs/dcosapp.js b/cyclone-web/docs/dcosapp.js new file mode 100644 index 0000000000000000000000000000000000000000..c2162702961516da22d73a17f6e8e00be296bc9a --- /dev/null +++ b/cyclone-web/docs/dcosapp.js @@ -0,0 +1,202 @@ +[{ + attributes: { + 0 ipAddress: "IP地址", + 0 macAddress: "mac地址", + 0 networkId: "网络ID", + appInfoId: null, + ciId: null, + id: null + }, + ci: "AppDevNicVO.json", + name: "应用部署实例网卡" +}, { + attributes: { + 0 hostName: "主机名", + appInfoId: null, + ciId: null, + id: null + }, + ci: "AppDevVO.json", + name: "应用部署实例" +}, { + attributes: { + 0 ipAddress: "服务IP(VIP)", + appInfoId: null, + ciId: null, + id: null + }, + ci: "AppDpUnitLbVO.json", + name: "应用部署单元负载均衡配置" +}, { + attributes: { + 0 addressType: "服务地址类型", + appInfoId: null, + ciId: null, + id: null + }, + ci: "AppDpUnitNetServiceVO.json", + name: "应用部署单元网络服务" +}, { + attributes: { + 0 rel_DcosAppLogicUnit_Id: "应用逻辑单元", + 1 name: "名称", + 10 devNum: "部署实例数量", + 2 rel_DcosIdc_Id: "数据中心", + 3 rel_DcosAppDpUnitType_Id: "部署单元类型", + 4 rel_DcosComputeResPools_Id: "计算资源池", + 5 rel_DcosComputeSysImgs_Id: "计算资源系统镜像", + 6 rel_DcosComputeFlavors_Id: "计算规格", + 7 rel_DcosNetArea_Id: "网络分区", + 8 rel_DcosNetSecureArea_Id: "安全分区", + appInfoId: null, + ciId: null, + id: null, + rel_DcosAppDpUnitType_Name: null, + rel_DcosAppLogicUnit_Name: null, + rel_DcosComputeFlavors_Name: null, + rel_DcosComputeResPools_Name: null, + rel_DcosComputeSysImgs_Name: null, + rel_DcosIdc_Name: null, + rel_DcosNetArea_Name: null, + rel_DcosNetSecureArea_Name: null + }, + ci: "AppDpUnitVO.json", + name: "应用部署单元" +}, { + attributes: { + 0 ownerId: "应用负责人ID", + 0 rel_DcosAppInfoStatus_Id: "应用状态", + 1 name: "应用名称", + 10 remark: "备注", + 2 code: "应用编码", + 3 rel_DcosTenant_Id: "租户", + 4 rel_DcosEnvironment_Id: "环境", + 5 rel_DcosAppInfoType_Id: "应用类型", + 6 rel_DcosHaLevel_Id: "高可用等级", + 7 rel_DcosContinuityLevel_Id: "连续性等级", + 8 rel_DcosProtectLevel_Id: "等级保护等级", + 9 ownerName: "应用负责人", + appInfoId: null, + ciId: null, + id: null, + rel_DcosAppInfoStatus_Name: null, + rel_DcosAppInfoType_Name: null, + rel_DcosContinuityLevel_Name: null, + rel_DcosEnvironment_Name: null, + rel_DcosHaLevel_Name: null, + rel_DcosProtectLevel_Name: null, + rel_DcosTenant_Name: null + }, + ci: "AppInfoVO.json", + name: "应用信息" +}, { + attributes: { + 0 rel_DcosAppInfo_Id: "应用信息", + 1 name: "名称", + 2 code: "编码", + 3 rel_DcosAppLogicUnitType_Id: "应用逻辑单元类型", + appInfoId: null, + ciId: null, + id: null, + rel_DcosAppInfo_Name: null, + rel_DcosAppLogicUnitType_Name: null + }, + ci: "AppLogicUnitVO.json", + name: "应用逻辑单元" +}, { + attributes: { + 0 rel_DcosAppService_Id: "应用服务", + 1 rel_DcosLbModel_Id: "负载均衡模式", + 2 rel_DcosLbAlgorithm_Id: "负载均衡算法", + 3 rel_DcosLbSessionPersistenceType_Id: "会话保持类型", + 4 sessionPersistenceTime: "会话保持时间", + 5 rel_DcosLbHealthCheckModel_Id: "康检查模式", + 6 monitorCheckUrl: "健康检查地址", + 7 rel_DcosLbRecordSourceIp_Id: "是否记录源IP", + 8 rel_DcosLbSslOffload_Id: "否需网络执行ssl卸载", + appInfoId: null, + ciId: null, + id: null, + rel_DcosAppService_Name: null, + rel_DcosLbAlgorithm_Name: null, + rel_DcosLbHealthCheckModel_Name: null, + rel_DcosLbModel_Name: null, + rel_DcosLbRecordSourceIp_Name: null, + rel_DcosLbSessionPersistenceType_Name: null, + rel_DcosLbSslOffload_Name: null + }, + ci: "AppServiceLbVO.json", + name: "应用服务负载均衡配置" +}, { + attributes: { + 0 rel_DcosAppLogicUnit_Id: "应用逻辑单元", + 1 name: "服务名称", + 2 domainName: "服务域名", + 3 port: "服务端口", + 4 rel_DcosAppServiceModel_Id: "服务模式", + 5 rel_DcosAppServiceProtocolType_Id: "协议类型", + 6 rel_DcosIsPersistentConnection_Id: "长短连接", + 7 timeOut: "长连接超时时间(h)", + 8 rel_DcosDomainIsGSLB_Id: "域名是否全局负载", + 9 rel_DcosAppServiceUseLB_Id: "是否使用负载均衡", + appInfoId: null, + ciId: null, + id: null, + rel_DcosAppLogicUnit_Name: null, + rel_DcosAppServiceModel_Name: null, + rel_DcosAppServiceProtocolType_Name: null, + rel_DcosAppServiceUseLB_Name: null, + rel_DcosDomainIsGSLB_Name: null, + rel_DcosIsPersistentConnection_Name: null + }, + ci: "AppServiceVO.json", + name: "应用服务" +}, { + attributes: { + 0 rel_DcosAppLogicUnit_Id: "应用逻辑单元", + 1 rel_DcosAppStorageType_Id: "存储类型", + 2 mountPoint: "挂载点", + 3 size: "容量", + 4 rel_DcosAppStorageLevel_Id: "存储规格", + 5 rel_DcosAppStorageFileSystemType_Id: "文件系统类型 ", + 6 deviceName: "设备名", + 7 ownerUser: "属主", + 8 ownerGroup: "属组", + 9 remark: "备注", + appInfoId: null, + ciId: null, + id: null, + rel_DcosAppLogicUnit_Name: null, + rel_DcosAppStorageFileSystemType_Name: null, + rel_DcosAppStorageLevel_Name: null, + rel_DcosAppStorageType_Name: null + }, + ci: "AppStorageVO.json", + name: "应用存储卷" +}, { + attributes: { + 0 rel_DcosAppLogicUnit_Id: "应用逻辑单元", + 1 gid: "GID", + 2 name: "用户组名称", + appInfoId: null, + ciId: null, + id: null, + rel_DcosAppLogicUnit_Name: null + }, + ci: "AppSysUserGroupVO.json", + name: "操作系统用户组" +}, { + attributes: { + 0 rel_DcosAppLogicUnit_Id: "应用逻辑单元", + 1 gid: "GID", + 2 uid: "UID", + 3 name: "用户名", + 4 home: "Home目录", + appInfoId: null, + ciId: null, + id: null, + rel_DcosAppLogicUnit_Name: null + }, + ci: "AppSysUserVO.json", + name: "操作系统用户" +}] \ No newline at end of file diff --git a/cyclone-web/docs/fe.md b/cyclone-web/docs/fe.md new file mode 100644 index 0000000000000000000000000000000000000000..ef4e3fdc18f2c57e707b73e3f209ff85e5a80612 --- /dev/null +++ b/cyclone-web/docs/fe.md @@ -0,0 +1,61 @@ +## 目前项目中前端开发常有的一些问题 + + +### 关于数据流转 + +目前看到代码仓库里边的数据流转应该是有三种模式: + +1. 通过 redux-thunk dispatch 函数类型的 action +2. 通过 redux-saga 通过 generate 来 compose action +3. 通过 componentDidMount hook 加载数据放在 state 中 + +第一点想说的大家如果对 1, 2 两种模式比较熟悉,尽量有这两种方案,优先使用 saga 方案,saga 带来能够在复杂场景中展现极大的灵活性 + +但是如果不是很理解1,2 两种方案,那请用第三种,不理解的情况下写出来的 redux + saga 会显得极其凌乱,很难维护,目前其实我也不了解大家的理解情况,有需要可以专门一起来分享一下,集中提问,集中回答 + + +第二,如果用 state 来存储页面状态和数据的,一定注意以下这点: + +// 错误的写法 +```js + this.setState({ + pageNo: pageNo + }) + + getDataService(this.state.pageNo).then(ret=>{...}) +``` + +// 正确的写法 + +```js + this.setState({pageNo}, () => { + // set state 成功过后的回调内请求数据 + getDataService(this.state.pageNo).then(ret=>{...}) + }) +``` + + +### 关于 table + +table 渲染的大家都能理解,问题出在大家对 分页和搜索的数据交互上: + +1. 分页数据和搜索 query 数据一定要存在 store 或者 state 中 +2. 在获取数据的时候直接从 store 或者 state 中拿到分页数据和搜索 query 去获取数据 +3. 搜索或者排序的时候要重置 page 为 1. 不然会出现明显的数据交互 bug + +另外在 table 的 action 上,目前的方案有: + +1. 可通过 components/TableControlCell 来进行渲染,当多余 三个以上的操作是可以 dropdown more +2. 每个 action 的触发的方案有几种: + - 通过 Popup 弹出一个脱离当前 ReactRoot 的模态框 + - 每个 action 直接 render Modal + - 建议用 Popup,这种模式可复用性更高 +3. table action 触发修改完成过后要记得 reload table,不然数据不对 + + +### 关于 表单 + +- 简单的表单都可以通过 components/FormGenerator 来实现配置化动态生成 +- 用 FormGenerator 的优势是可以做依赖管理,具体可以参考应用详情的各个表单 +- 如果有弹出模态框,要求用户输入一些表单项,然后保存的这种类型,可以不用重复开发,可以利用 FormGenerator/advance-form 来实现 + diff --git a/cyclone-web/docs/general/README.md b/cyclone-web/docs/general/README.md new file mode 100644 index 0000000000000000000000000000000000000000..2d3dfae68e64b5cec28e22b06b950de623ac7d17 --- /dev/null +++ b/cyclone-web/docs/general/README.md @@ -0,0 +1,125 @@ +# Introduction + +The JavaScript ecosystem evolves at incredible speed: staying current can feel +overwhelming. So, instead of you having to stay on top of every new tool, +feature and technique to hit the headlines, this project aims to lighten the +load by providing a curated baseline of the most valuable ones. + +Using React Boilerplate, you get to start your app with our community's current +ideas on what represents optimal developer experience, best practice, most +efficient tooling and cleanest project structure. + +- [**CLI Commands**](commands.md) +- [Tool Configuration](files.md) +- [Server Configurations](server-configs.md) +- [Deployment](deployment.md) *(currently Heroku specific)* +- [FAQ](faq.md) +- [Gotchas](gotchas.md) + +# Feature overview + +## Quick scaffolding + +Automate the creation of components, containers, routes, selectors and sagas - +and their tests - right from the CLI! + +Run `npm run generate` in your terminal and choose one of the parts you want +to generate. They'll automatically be imported in the correct places and have +everything set up correctly. + +> We use [plop] to generate new components, you can find all the logic and +templates for the generation in `internals/generators`. + +[plop]: https://github.com/amwmedia/plop + +## Instant feedback + +Enjoy the best DX and code your app at the speed of thought! Your saved changes +to the CSS and JS are reflected instantaneously without refreshing the page. +Preserve application state even when you update something in the underlying code! + +## Predictable state management + +We use Redux to manage our applications state. We have also added optional +support for the [Chrome Redux DevTools Extension] – if you have it installed, +you can see, play back and change your action history! + +[Chrome Redux DevTools Extension]: https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd + +## Next generation JavaScript + +Use ESNext template strings, object destructuring, arrow functions, JSX syntax +and more, today. This is possible thanks to Babel with the `latest`, `stage-0` +and `react` presets! + +## Next generation CSS + +Write composable CSS that's co-located with your components using [CSS modules] +for complete modularity. Unique generated class names keep the specificity low +while eliminating style clashes. Ship only the styles that are used on the +visible page for the best performance. + +[CSS modules]: ../css/css-modules.md + +## Industry-standard routing + +It's natural to want to add pages (e.g. `/about`) to your application, and +routing makes this possible. Thanks to [react-router] with [react-router-redux], +that's as easy as pie and the url is auto-synced to your application state! + +[react-router]: https://github.com/reactjs/react-router +[react-router-redux]: https://github.com/reactjs/react-router-redux + +# Optional extras + +_Don't like any of these features? [Click here](remove.md)_ + +## Offline-first + +The next frontier in performant web apps: availability without a network +connection from the instant your users load the app. This is done with a +ServiceWorker and a fallback to AppCache, so this feature even works on older +browsers! + +> All your files are included automatically. No manual intervention needed +thanks to Webpack's [`offline-plugin`](https://github.com/NekR/offline-plugin) + +### Add To Homescreen + +After repeat visits to your site, users will get a prompt to add your application +to their homescreen. Combined with offline caching, this means your web app can +be used exactly like a native application (without the limitations of an app store). + +The name and icon to be displayed are set in the `app/manifest.json` file. +Change them to your project name and icon, and try it! + +## Performant Web Font Loading + +If you simply use web fonts in your project, the page will stay blank until +these fonts are downloaded. That means a lot of waiting time in which users +could already read the content. + +[FontFaceObserver](https://github.com/bramstein/fontfaceobserver) adds a class +to the `body` when the fonts have loaded. (see [`app.js`](../../app/app.js#L26-L36) +and [`App/styles.css`](../../app/containers/App/styles.css)) + +### Adding a new font + +1. Either add the `@font-face` declaration to `App/styles.css` or add a `<link>` +tag to the [`index.html`](../../app/index.html). (Don't forget to remove the `<link>` +for Open Sans from the [`index.html`](../../app/index.html)!) + +2. In `App/styles.css`, specify your initial `font-family` in the `body` tag +with only web-save fonts. In the `body.jsFontLoaded` tag, specify your +`font-family` stack with your web font. + +3. In `app.js` add a `<fontName>Observer` for your font. + +## Image optimization + +Images often represent the majority of bytes downloaded on a web page, so image +optimization can often be a notable performance improvement. Thanks to Webpack's +[`image-loader`](https://github.com/tcoopman/image-webpack-loader), every PNG, JPEG, GIF and SVG images +is optimized. + +See [`image-loader`](https://github.com/tcoopman/image-webpack-loader) to customize optimizations options. diff --git a/cyclone-web/docs/general/commands.md b/cyclone-web/docs/general/commands.md new file mode 100644 index 0000000000000000000000000000000000000000..67eb9d6517e64059932468d60f7f20857cb22eb3 --- /dev/null +++ b/cyclone-web/docs/general/commands.md @@ -0,0 +1,190 @@ +# Command Line Commands + +## Initialization + +```Shell +npm run setup +``` + +Initializes a new project with this boilerplate. Deletes the `react-boilerplate` +git history, installs the dependencies and initializes a new repository. + +> Note: This command is self-destructive, once you've run it the init script is +gone forever. This is for your own safety, so you can't delete your project's +history irreversibly by accident. + +## Development + +```Shell +npm run start +``` + +Starts the development server running on `http://localhost:3000` + +## Cleaning + +```Shell +npm run clean +``` + +Deletes the example app, replacing it with the smallest amount of boilerplate +code necessary to start writing your app! + +> Note: This command is self-destructive, once you've run it you cannot run it +again. This is for your own safety, so you can't delete portions of your project +irreversibly by accident. + +## Generators + +```Shell +npm run generate +``` + +Allows you to auto-generate boilerplate code for common parts of your +application, specifically `component`s, `container`s, and `route`s. You can +also run `npm run generate <part>` to skip the first selection. (e.g. `npm run +generate container`) + +## Server + +### Development + +```Shell +npm start +``` + +Starts the development server and makes your application accessible at +`localhost:3000`. Tunnels that server with `ngrok`, which means the website +accessible anywhere! Changes in the application code will be hot-reloaded. + +### Production + +```Shell +npm run start:prod +``` + +Starts the production server, configured for optimal performance: assets are +minified and served gzipped. + +### Port + +To change the port the app is accessible at pass the `--port` option to the command +with `--`. E.g. to make the app visible at `localhost:5000`, run the following: +`npm start -- --port 5000` + +## Building + +```Shell +npm run build +``` + +Preps your app for deployment. Optimizes and minifies all files, piping them to +a folder called `build`. Upload the contents of `build` to your web server to +see your work live! + +## Testing + +See the [testing documentation](../testing/README.md) for detailed information +about our testing setup! + +## Unit testing + +```Shell +npm run test +``` + +Tests your application with the unit tests specified in the `*test.js` files +throughout the application. +All the `test` commands allow an optional `-- --grep string` argument to filter +the tests ran by Karma. Useful if you need to run a specific test only. + +```Shell +# Run only the Button component tests +npm run test:watch -- --grep Button +``` + +### Browsers + +To choose the browser to run your unit tests in (Chrome by default), run one of +the following commands: + +#### Firefox + +```Shell +npm run test:firefox +``` + +#### Safari + +```Shell +npm run test:safari +``` + +#### Internet Explorer + +*Windows only!* + +```Shell +npm run test:ie +``` + +### Watching + +```Shell +npm run test:watch +``` + +Watches changes to your application and reruns tests whenever a file changes. + +### Remote testing + +```Shell +npm run start:tunnel +``` +Starts the development server and tunnels it with `ngrok`, making the website +available on the entire world. Useful for testing on different devices in different locations! + +### Performance testing + +```Shell +npm run pagespeed +``` + +With the remote server running (i.e. while `npm run start:prod` is running in +another terminal session), enter this command to run Google PageSpeed Insights +and get a performance check right in your terminal! + +### Dependency size test + +```Shell +npm run analyze +``` + +This command will generate a `stats.json` file from your production build, which +you can upload to the [webpack analyzer](https://webpack.github.io/analyse/). This +analyzer will visualize your dependencies and chunks with detailed statistics +about the bundle size. + +## Linting + +```Shell +npm run lint +``` + +Lints your JavaScript and CSS. + +### JavaScript + +```Shell +npm run lint:js +``` + +Only lints your JavaScript. + +### CSS + +```Shell +npm run lint:css +``` + +Only lints your CSS. diff --git a/cyclone-web/docs/general/deployment.md b/cyclone-web/docs/general/deployment.md new file mode 100644 index 0000000000000000000000000000000000000000..2751640ab9c5dc93caa46293a76907b0b3a3ea98 --- /dev/null +++ b/cyclone-web/docs/general/deployment.md @@ -0,0 +1,19 @@ +# Deployment + +## Heroku + +### Easy 5-Step Deployment Process + +*Step 1:* Create a Procfile with the following line: `web: npm run start:prod`. We are doing this because heroku runs `npm run start` by default, so we need this setting to override the default run command. + +*Step 2:* Install heroku's buildpack on your heroku app by running the following command: `heroku buildpacks:set https://github.com/heroku/heroku-buildpack-nodejs#v90 -a [your app name]`. Make sure to replace `#v90` with whatever the latest buildpack is which you can [find here](https://github.com/heroku/heroku-buildpack-nodejs/releases). + +*Step 3:* Add this line to your Package.json file in the scripts area: `"postinstall": "npm run build:clean",`. This is because Heroku runs this as part of their build process (more of which you can [read about here](https://devcenter.heroku.com/articles/nodejs-support#build-behavior)). + +*Step 4:* Run `heroku config:set NPM_CONFIG_PRODUCTION=false` so that Heroku can compile the NPM Modules included in your devDependencies (since many of these packages are required for the build process). + +*Step 5:* Follow the standard Heroku deploy process at this point: + +1. `git add .` +2. `git commit -m 'Made some epic changes as per usual'` +3. `git push heroku master` diff --git a/cyclone-web/docs/general/faq.md b/cyclone-web/docs/general/faq.md new file mode 100644 index 0000000000000000000000000000000000000000..0ee85a981541c5efcf1664ac5c91d5cff2ac102f --- /dev/null +++ b/cyclone-web/docs/general/faq.md @@ -0,0 +1,202 @@ +# Frequently Asked Questions + +## Where are Babel, ESLint and stylelint configured? + +In package.json + +## Where are the files coming from when I run `npm start`? + +In development Webpack compiles your application runs it in-memory. Only when +you run `npm run build` will it write to disk and preserve your bundled +application across computer restarts. + +## How do I fix `Error: listen EADDRINUSE 127.0.0.1:3000`? + +This simply means that there's another process already listening on port 3000. +The fix is to kill the process and rerun `npm start`. + +### OS X / Linux: + +1. Find the process id (PID): + ```Shell + ps aux | grep node + ``` + > This will return the PID as the value following your username: + > ```Shell + > janedoe 29811 49.1 2.1 3394936 356956 s004 S+ 4:45pm 2:40.07 node server + > ``` + +1. Then run + ```Shell + kill -9 YOUR_PID + ``` + > e.g. given the output from the example above, `YOUR_PID` is `29811`, hence + that would mean you would run `kill -9 29811` + +### Windows + +1. Find the process id (PID): + ```Shell + netstat -a -o -n + ``` + + > This will return a list of running processes and the ports they're + listening on: + > ``` + > Proto Local Address Foreign Address State PID + > TCP 0.0.0.0:25 0.0.0.0:0 Listening 4196 + > ... + > TCP 0.0.0.0:3000 0.0.0.0:0 Listening 28344 + ``` + +1. Then run + ```Shell + taskkill /F /PID YOUR_PID + ``` + > e.g. given the output from the example above, `YOUR_PID` is `28344`, hence + that would mean you would run `taskkill /F /PID 28344` + +## Local webfonts not working for development + +In development mode CSS sourcemaps require that styling is loaded by blob://, +resulting in browsers resolving font files relative to the main document. + +A way to use local webfonts in development mode is to add an absolute +output.publicPath in webpack.dev.babel.js, with protocol. + +```javascript +// webpack.dev.babel.js + +output: { + publicPath: 'http://127.0.0.1:3000/', + /* … */ +}, +``` + +## Non-route containers + +> Note: Container will always be nested somewhere below a route. Even if there's dozens of components +in between, somewhere up the tree will be route. (maybe only "/", but still a route) + +### Where do I put the reducer? + +While you can include the reducer statically in `reducers.js`, we don't recommend this as you lose +the benefits of code splitting. Instead, add it as a _composed reducer_. This means that you +pass actions onward to a second reducer from a lower-level route reducer like so: + + +```JS +// Main route reducer + +function myReducerOfRoute(state, action) { + switch (action.type) { + case SOME_OTHER_ACTION: + return someOtherReducer(state, action); + } +} +``` + +That way, you still get the code splitting at route level, but avoid having a static `combineReducers` +call that includes all of them by default. + +*See [this and the following lesson](https://egghead.io/lessons/javascript-redux-reducer-composition-with-arrays?course=getting-started-with-redux) of the egghead.io Redux course for more information about reducer composition!* + +### How do I run the saga? + +Since a container will always be within a route, one we can simply add it to the exported array in +`index.js` of the route container somewhere up the tree: + +```JS +index.js + +import { someOtherSagaFromNestedContainer } from './containers/SomeNestedContainer/sagas'; + +function* someSaga() { /* … */ } + +export default [ + someSaga, + someOtherSagaFromNestedContainer, +]; +``` + +Or, if you have multiple sagas in the nested container: + + +```JS +index.js + +import nestedContaiindex.js from './containers/SomeNestedContainer/sagas'; + +function* someSaga() { /* … */ } + +export default [ + someSaga, + ...nestedContainerSagas, +]; +``` + +## Using this boilerplate with WebStorm + +WebStorm is a powerful IDE, and why not also use it as debugger tool? Here is the steps + +1. [Install JetBrain Chrome Extension](https://chrome.google.com/webstore/detail/jetbrains-ide-support/hmhgeddbohgjknpmjagkdomcpobmllji) +2. [Setting up the PORT](https://www.jetbrains.com/help/webstorm/2016.1/using-jetbrains-chrome-extension.html) +3. Change WebPack devtool config to `source-map` [(This line)](https://github.com/mxstbr/react-boilerplate/blob/56eb5a0ec4aa691169ef427f3a0122fde5a5aa24/internals/webpack/webpack.dev.babel.js#L65) +4. Run web server (`npm run start`) +5. Create Run Configuration (Run > Edit Configurations) +6. Add new `JavaScript Debug` +7. Setting up URL +8. Start Debug (Click the green bug button) +9. Edit Run Configuration Again +10. Mapping Url as below picture + * Map your `root` directory with `webpack://.` (please note the last dot) + * Map your `build` directory with your root path (e.g. `http://localhost:3000`) +11. Hit OK and restart debugging session + +![How to debug using WebStorm](webstorm-debug.png) + +### Troubleshooting + +1. You miss the last `.` (dot) in `webpack://.` +2. The port debugger is listening tool and the JetBrain extension is mismatch. + +### Enable ESLint + +ESLint help making all developer follow the same coding format. Please also setting up in your IDE, otherwise, you will fail ESLint test. +1. Go to WebStorm Preference +2. Search for `ESLint` +3. Click `Enable` + +![Setting up ESLint](webstorm-eslint.png) + +## Use CI with bitbucket pipelines + +Your project is on bitbucket? Take advantage of the pipelines feature (Continuous Integration) by creating a 'bitbucket-pipelines.yml' file at the root of the project and use the following code to automatically test your app at each commit: + +```YAML +image: gwhansscheuren/bitbucket-pipelines-node-chrome-firefox + +pipelines: + default: + - step: + script: + - node --version + - npm --version + - npm install + - npm test +``` + +## I'm using Node v0.12 and the server doesn't work? + +We settled on supporting the last three major Node.js versions for the boilerplate – at the moment +of this writing those are v4, v5 and v6. We **highly recommend upgrading to a newer Node.js version**! + +If you _have_ to use Node.js 0.12, you can hack around the server not running by using `babel-cli` to +run the server: `npm install babel-cli`, and then replace all instances of `node server` in the `"scripts"` +in the `package.json` with `babel server`! + +## Have another question? + +Submit an [issue](https://github.com/mxstbr/react-boilerplate/issues), +hop onto the [Gitter channel](https://gitter.im/mxstbr/react-boilerplate) +or contact Max direct on [twitter](https://twitter.com/mxstbr)! diff --git a/cyclone-web/docs/general/files.md b/cyclone-web/docs/general/files.md new file mode 100644 index 0000000000000000000000000000000000000000..3b874d4a66410d0014198f6b859a8dc8d696acee --- /dev/null +++ b/cyclone-web/docs/general/files.md @@ -0,0 +1,34 @@ +# Configuration: A Glossary + +A guide to the configuration files for this project: where they live and what +they do. + +## The root folder + +* `.editorconfig`: Sets the default configuration for certain files across editors. (e.g. indentation) + +* `.gitattributes`: Normalizes how `git`, the version control system this boilerplate uses, handles certain files. + +* `.gitignore`: Tells `git` to ignore certain files and folders which don't need to be version controlled, like the build folder. + +* `.travis.yml` and `appveyor.yml`: Continuous Integration configuration<br/> + This boilerplate uses [Travis CI](https://travis-ci.com) for Linux environments + and [AppVeyor](https://www.appveyor.com/) for Windows platforms, but feel free + to swap either out for your own choice of CI. + +* `package.json`: Our `npm` configuration file has three functions: + + 1. It's where Babel, ESLint and stylelint are configured + 1. It's the API for the project: a consistent interface for all its controls + 1. It lists the project's package dependencies + + Baking the config in is a slightly unusual set-up, but it allows us to keep + the project root as uncluttered and grokkable-at-a-glance as possible. + +## The `./internals` folder + +This is where the bulk of the tooling configuration lives, broken out into +recognisable units of work. + +Feel free to change anything you like but don't be afraid to [ask upfront](https://gitter.im/mxstbr/react-boilerplate) +whether you should: build systems are easy to break! diff --git a/cyclone-web/docs/general/gotchas.md b/cyclone-web/docs/general/gotchas.md new file mode 100644 index 0000000000000000000000000000000000000000..4a8bc643f592e46415867546a3a52ecaa26a0163 --- /dev/null +++ b/cyclone-web/docs/general/gotchas.md @@ -0,0 +1,23 @@ +# Gotchas + +These are some things to be aware of when using this boilerplate. + +## Special images in HTML files + +If you specify your images in the `.html` files using the `<img>` tag, everything +will work fine. The problem comes up if you try to include images using anything +except that tag, like meta tags: + +```HTML +<meta property="og:image" content="img/yourimg.png" /> +``` + +The webpack `html-loader` does not recognise this as an image file and will not +transfer the image to the build folder. To get webpack to transfer them, you +have to import them with the file loader in your JavaScript somewhere, e.g.: + +```JavaScript +import 'file?name=[name].[ext]!../img/yourimg.png'; +``` + +Then webpack will correctly transfer the image to the build folder. diff --git a/cyclone-web/docs/general/remove.md b/cyclone-web/docs/general/remove.md new file mode 100644 index 0000000000000000000000000000000000000000..1ce14322e9c7663b5c8be4f461e38123336b6d08 --- /dev/null +++ b/cyclone-web/docs/general/remove.md @@ -0,0 +1,49 @@ +### Removing offline access + +**Careful** about removing this, as there is no real downside to having your +application available when the users network connection isn't perfect. + +To remove offline capability, delete the `offline-plugin` from the +[`package.json`](../../package.json), remove the import of the plugin in +[`app.js`](../../app/app.js) and remove the plugin from the +[`webpack.prod.babel.js`](../../internals/webpack/webpack.prod.babel.js). + +### Removing add to homescreen functionality + +Delete [`manifest.json`](../../app/manifest.json) and remove the +`<link rel="manifest" href="manifest.json">` tag from the +[`index.html`](../../app/index.html). + +### Removing performant web font loading + +**Careful** about removing this, as perceived performance might be highly impacted. + +To remove `FontFaceObserver`, don't import it in [`app.js`](../../app/app.js) and +remove it from the [`package.json`](../../package.json). + +### Removing image optimization + +To remove image optimization, delete the `image-webpack-loader` from the +[`package.json`](../../package.json), and remove the `image-loader` from [`webpack.base.babel.js`](../../internals/webpack/webpack.base.babel.js): +``` +… +{ + test: /\.(jpg|png|gif)$/, + loaders: [ + 'file-loader', + 'image-webpack?{progressive:true, optimizationLevel: 7, interlaced: false, pngquant:{quality: "65-90", speed: 4}}', + ], +} +… +``` + +Then replace it with classic `file-loader`: + +``` +… +{ + test: /\.(jpg|png|gif)$/, + loader: 'file-loader', +} +… +``` diff --git a/cyclone-web/docs/general/server-configs.md b/cyclone-web/docs/general/server-configs.md new file mode 100644 index 0000000000000000000000000000000000000000..bede372735d9f8b6c42ada69f0b2a95d9283c1da --- /dev/null +++ b/cyclone-web/docs/general/server-configs.md @@ -0,0 +1,18 @@ +# Server Configurations + +## Apache + +This boilerplate includes a `.htaccess` file that does two things: + +1. Redirect all traffic to HTTPS because ServiceWorker only works for encrypted + traffic. +1. Rewrite all pages (e.g. `yourdomain.com/subpage`) to `yourdomain.com/index.html` + to let `react-router` take care of presenting the correct page. + +> Note: For performance reasons you should probably adapt it to run as a static + `.conf` file (typically under `/etc/apache2/sites-enabled` or similar) so that + your server doesn't have to apply its rules dynamically per request) + +## Nginx + +Also it includes a `.nginx.conf` file that does the same on Nginx server. diff --git a/cyclone-web/docs/general/webstorm-debug.png b/cyclone-web/docs/general/webstorm-debug.png new file mode 100644 index 0000000000000000000000000000000000000000..468079ad77982c90c55ac90f0906ed0c101bd86a Binary files /dev/null and b/cyclone-web/docs/general/webstorm-debug.png differ diff --git a/cyclone-web/docs/general/webstorm-eslint.png b/cyclone-web/docs/general/webstorm-eslint.png new file mode 100644 index 0000000000000000000000000000000000000000..075f8edcaa64dde392dffed7918db374cea98721 Binary files /dev/null and b/cyclone-web/docs/general/webstorm-eslint.png differ diff --git a/cyclone-web/docs/js/README.md b/cyclone-web/docs/js/README.md new file mode 100644 index 0000000000000000000000000000000000000000..74d903b47bc31d2e87d82387cb3fbc20aab9013f --- /dev/null +++ b/cyclone-web/docs/js/README.md @@ -0,0 +1,37 @@ +# JavaScript + +## State management + +This boilerplate manages application state using [Redux](redux.md), makes it +immutable with [`ImmutableJS`](immutablejs.md) and keeps access performant +via [`reselect`](reselect.md). + +For managing asynchronous flows (e.g. logging in) we use [`redux-saga`](redux-saga.md). + +For routing, we use [`react-router` in combination with `react-router-redux`](routing.md). + +We include a generator for components, containers, sagas, routes and selectors. +Run `npm run generate` to choose from the available generators, and automatically +add new parts of your application! + +> Note: If you want to skip the generator selection process, + `npm run generate <generator>` also works. (e.g. `npm run generate route`) + +### Learn more + +- [Redux](redux.md) +- [ImmutableJS](immutablejs.md) +- [reselect](reselect.md) +- [redux-saga](redux-saga.md) +- [react-intl](i18n.md) +- [routing](routing.md) + +## Architecture: `components` and `containers` + +We adopted a split between stateless, reusable components called (wait for it...) +`components` and stateful parent components called `containers`. + +### Learn more + +See [this article](https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0) +by Dan Abramov for a great introduction to this approach. diff --git a/cyclone-web/docs/js/i18n.md b/cyclone-web/docs/js/i18n.md new file mode 100644 index 0000000000000000000000000000000000000000..7f2841c98393fbac6efac586a07405a4deb148ae --- /dev/null +++ b/cyclone-web/docs/js/i18n.md @@ -0,0 +1,105 @@ +# `i18n` + +`react-intl` is a library to manage internationalization and pluralization support +for your react application. This involves multi-language support for both the static text but also things like variable numbers, words or names that change with application state. `react-intl` provides an incredible amount of mature facility to preform these very tasks. + +The complete `react-intl` docs can be found here: + +https://github.com/yahoo/react-intl/wiki + +## Usage + +Below we see a `messages.js` file for the `Footer` component example. A `messages.js` file should be included in any simple or container component that wants to use internationalization. You can add this support when you scaffold your component using this boilerplates scaffolding `plop` system. + +All default English text for the component is contained here (e.g. `This project is licensed under the MIT license.`), and is tagged with an ID (e.g. `boilerplate.components.Footer.license.message`) in addition to it's object definition id (e.g. `licenseMessage`). + +This is set in `react-intl`'s `defineMessages` function which is then exported for use in the component. You can read more about `defineMessages` here: + +https://github.com/yahoo/react-intl/wiki/API#definemessages + +```js +/* + * Footer Messages + * + * This contains all the text for the Footer component. + */ +import { defineMessages } from 'react-intl'; + +export default defineMessages({ + licenseMessage: { + id: 'boilerplate.components.Footer.license.message', + defaultMessage: 'This project is licensed under the MIT license.', + }, + authorMessage: { + id: 'boilerplate.components.Footer.author.message', + defaultMessage: ` + Made with love by {author}. + `, + }, +}); +``` + +Below is the example `Footer` component. Here we see the component including the `messages.js` file, which contains all the default component text, organized with ids (and optionally descriptions). We are also importing the `FormattedMessage` component, which will display a given message from the `messages.js` file in the selected language. + +You will also notice a more complex use of `FormattedMessage` for the author message where alternate or variable values (i.e. `author: <A href="https://twitter.com/mxstbr">Max Stoiber</A>,`) are being injected, in this case it's a react component. + +```js +import React from 'react'; + +import messages from './messages'; +import A from 'components/A'; +import styles from './styles.css'; +import { FormattedMessage } from 'react-intl'; + +function Footer() { + return ( + <footer className={styles.footer}> + <section> + <p> + <FormattedMessage {...messages.licenseMessage} /> + </p> + </section> + <section> + <p> + <FormattedMessage + {...messages.authorMessage} + values={{ + author: <A href="https://twitter.com/mxstbr">Max Stoiber</A>, + }} + /> + </p> + </section> + </footer> + ); +} + +export default Footer; +``` + +## Extracting i18n JSON files + +You can extract all i18n language within each component by running the following command: + +``` + npm run extract-intl +``` + +This will extract all language into i18n JSON files in `app/translations`. + +## Adding A Language + +You can add a language by running the generate command: + +``` + npm run generate language +``` + +Then enter the two character i18n standard language specifier (e.g. "fr", "de", "es" - without quotes). This will add in the necessary JSON language file and import statements for the language. Note, it is up to you to fill in the translations for the language. + +## Removing i18n and react-intl + +You can remove `react-intl` modules by first removing the `IntlProvider` object from the `app/app.js` file and by either removing or not selecting the i18n text option during component scaffolding. + +The packages associated with `react-intl` are: + - react-intl + - babel-plugin-react-intl diff --git a/cyclone-web/docs/js/immutablejs.md b/cyclone-web/docs/js/immutablejs.md new file mode 100644 index 0000000000000000000000000000000000000000..2dfebe27fa7ca8a0b1dc6b2da941add99a6aa3bc --- /dev/null +++ b/cyclone-web/docs/js/immutablejs.md @@ -0,0 +1,76 @@ +# ImmutableJS + +Immutable data structures can be deeply compared in no time. This allows us to +efficiently determine if our components need to rerender since we know if the +`props` changed or not! + +Check out the [official documentation](https://facebook.github.io/immutable-js/) +for a good explanation of the more intricate benefits it has. + +## Usage + +In our reducers, we make the initial state an immutable data structure with the +`fromJS` function. We pass it an object or an array, and it takes care of +converting it to a compatible one. (Note: the conversion is performed deeply so +that even arbitrarily nested arrays/objects are immutable stuctures too!) + +```JS +import { fromJS } from 'immutable'; + +const initialState = fromJS({ + myData: 'Hello World!', +}); +``` + +To react to an incoming actions our reducers can use the `.set` and the `.setIn` +functions. + +```JS +import { SOME_ACTION } from './actions'; + +// […] + +function myReducer(state = initialState, action) { + switch (action.type) { + case SOME_ACTION: + return state.set('myData', action.payload); + default: + return state; + } +} +``` + +We use [`reselect`](./reselect.md) to efficiently cache our computed application +state. Since that state is now immutable, we need to use the `.get` and `.getIn` +functions to select the part we want. + +```JS +const myDataSelector = (state) => state.get('myData'); + +export default myDataSelector; +``` + +To learn more, check out [`reselect.md`](reselect.md)! + +## Advanced Usage + +ImmutableJS provide many immutable structures like `Map`, `Set` and `List`. But the downside to using ImmutableJS data structures is that they are not normal JavaScript data structures. + +That means you must use getters to access properties : for instance you'll do `map.get("property")` instead of `map.property`, and `array.get(0)` instead of `array[0]`. It's not natural and your code becoming bigger, you finish by not knowing anymore if you are working with a JavaScript object or an Immutable one. While it's possible to be clear where you are using immutable objects, you still pass them through the system into places where it's not clear. This makes reasoning about functions harder. + +The `Record` structure tries to get rid of this drawback. `Record` is like a `Map` whose shape is fixed : you can't later add a new property after the record is created. The benefit of `Record` is that you can now, along with others .get, .set and .merge methods, use the dot notation to access properties, which is a good point to write simpler code. + +The creation of a record is less simple. You got to first create the `Record` shape. With the example above, to create your initial state, you'll write : + +```JS +//the shape +const StateRecord = Record({ + myData: 'Hello World!', +}); + +const initialState = new StateRecord({}); // initialState is now a new StateRecord instance + // initialized with myData set by default as 'Hello World!' +``` + +Now, if you want to access `myData`, you can just write `state.myData` in your reducer code. + diff --git a/cyclone-web/docs/js/redux-saga.md b/cyclone-web/docs/js/redux-saga.md new file mode 100644 index 0000000000000000000000000000000000000000..119ee1ef046c001e1b0068a7232e5c3ce25c8d68 --- /dev/null +++ b/cyclone-web/docs/js/redux-saga.md @@ -0,0 +1,77 @@ +# `redux-saga` + +`redux-saga` is a library to manage side effects in your application. It works +beautifully for data fetching, concurrent computations and a lot more. +[Sebastien Lorber](https://twitter.com/sebastienlorber) put it best: + +> Imagine there is widget1 and widget2. When some button on widget1 is clicked, + then it should have an effect on widget2. Instead of coupling the 2 widgets + together (ie widget1 dispatch an action that targets widget2), widget1 only + dispatch that its button was clicked. Then the saga listen for this button + click and then update widget2 by dispatching a new event that widget2 is aware of. +> +> This adds a level of indirection that is unnecessary for simple apps, but make + it more easy to scale complex applications. You can now publish widget1 and + widget2 to different npm repositories so that they never have to know about + each others, without having them to share a global registry of actions. The 2 + widgets are now bounded contexts that can live separately. They do not need + each others to be consistent and can be reused in other apps as well. **The saga + is the coupling point between the two widgets that coordinate them in a + meaningful way for your business.** + +_Note: It is well worth reading the [source](https://stackoverflow.com/questions/34570758/why-do-we-need-middleware-for-async-flow-in-redux/34623840#34623840) +of this quote in its entirety!_ + +To learn more about this amazing way to handle concurrent flows, start with the +[official documentation](https://github.com/yelouafi/redux-saga) and explore +some examples! (read [this comparison](https://stackoverflow.com/questions/34930735/pros-cons-of-using-redux-saga-with-es6-generators-vs-redux-thunk-with-es7-async/34933395) if you're used to `redux-thunk`) + +## Usage + +Sagas are associated with a container, just like actions, constants, selectors +and reducers. If your container already has a `index.js` file, simply add your +saga to that. If your container does not yet have a `index.js` file, add one with +this boilerplate structure: + +```JS +import { take, call, put, select } from 'redux-saga/effects'; + +// Your sagas for this container +export default [ + sagaName, +]; + +// Individual exports for testing +export function* sagaName() { + +} +``` + +Then, in your `routes.js`, add injection for the newly added saga: + +```JS +getComponent(nextState, cb) { + const importModules = Promise.all([ + System.import('containers/YourComponent/reducer'), + System.import('containers/YourComponent/sagas'), + System.import('containers/YourComponent'), + ]); + + const renderRoute = loadModule(cb); + + importModules.then(([reducer, sagas, component]) => { + injectReducer('home', reducer.default); + injectSagas(sagas.default); // Inject the saga + + renderRoute(component); + }); + + importModules.catch(errorLoading); +}, +``` + +Now add as many sagas to your `index.js` file as you want! + +--- + +_Don't like this feature? [Click here](remove.md)_ diff --git a/cyclone-web/docs/js/redux.md b/cyclone-web/docs/js/redux.md new file mode 100644 index 0000000000000000000000000000000000000000..6111068f8538f52d0c34ea958c5b44c226748d42 --- /dev/null +++ b/cyclone-web/docs/js/redux.md @@ -0,0 +1,41 @@ +# Redux + +If you haven't worked with Redux, it's highly recommended (possibly indispensable!) +to read through the (amazing) [official documentation](http://redux.js.org) +and/or watch this [free video tutorial series](https://egghead.io/series/getting-started-with-redux). + +## Usage + +See above! As minimal as Redux is, the challenge it addresses - app state +management - is a complex topic that is too involved to properly discuss here. + +## Removing redux + +There are a few reasons why we chose to bundle redux with React Boilerplate, the +biggest being that it is widely regarded as the current best Flux implementation +in terms of architecture, support and documentation. + +You may feel differently! This is completely OK :) + +Below are a few reasons you might want to remove it: + +### I'm just getting started and Flux is hard + +You're under no obligation to use Redux or any other Flux library! The complexity +of your application will determine the point at which you need to introduce it. + +Here are a couple of great resources for taking a minimal approach: + +- [Misconceptions of Tooling in JavaScript](http://javascriptplayground.com/blog/2016/02/the-react-webpack-tooling-problem) +- [Learn Raw React — no JSX, no Flux, no ES6, no Webpack…](http://jamesknelson.com/learn-raw-react-no-jsx-flux-es6-webpack/) + +### It's overkill for my project! + +See above. + +### I prefer `(Alt|MobX|SomethingElse)`! + +React Boilerplate is a baseline for _your_ app: go for it! + +If you feel that we should take a closer look at supporting your preference +out of the box, please let us know. diff --git a/cyclone-web/docs/js/remove.md b/cyclone-web/docs/js/remove.md new file mode 100644 index 0000000000000000000000000000000000000000..328cc5fbf25ac02adef64b9533680c8790cc7dbe --- /dev/null +++ b/cyclone-web/docs/js/remove.md @@ -0,0 +1,24 @@ +## Removing `redux-saga` + +**We don't recommend removing `redux-saga`**, as we strongly feel that it's the +way to go for most redux based applications. + +If you really want to get rid of it, delete the `sagas/` folder, remove the +`import` and the `sagaMiddleware` from the `store.js` and finally remove it from +the `package.json`. Then you should be good to go with whatever side-effect +management library you want to use! + +## Removing `reselect` + +To remove `reselect`, delete the `app/selectors` folder, remove it from your +dependencies in `package.json` and then write your `mapStateToProps` functions +like you normally would! + +You'll also need to hook up the history directly to the store. Change the const +`history` in `app/app.js` to the following: + +```js +const history = syncHistoryWithStore(browserHistory, store, { + selectLocationState: (state) => state.get('route').toJS(), +}); +``` diff --git a/cyclone-web/docs/js/reselect.md b/cyclone-web/docs/js/reselect.md new file mode 100644 index 0000000000000000000000000000000000000000..db7f70591dfc059793a3ad61a80a84573f1fddbd --- /dev/null +++ b/cyclone-web/docs/js/reselect.md @@ -0,0 +1,78 @@ +# `reselect` + +reselect memoizes ("caches") previous state trees and calculations based on said +tree. This means repeated changes and calculations are fast and efficient, +providing us with a performance boost over standard `mapStateToProps` +implementations. + +The [official documentation](https://github.com/reactjs/reselect) +offers a good starting point! + +## Usage + +There are two different kinds of selectors, simple and complex ones. + +### Simple selectors + +Simple selectors are just that: they take the application state and select a +part of it. + +```javascript +const mySelector = (state) => state.get('someState'); + +export { + mySelector, +}; +``` + +### Complex selectors + +If we need to, we can combine simple selectors to build more complex ones which +get nested state parts with reselect's `createSelector` function. We import other +selectors and pass them to the `createSelector` call: + +```javascript +import { createSelector } from 'reselect'; +import mySelector from 'mySelector'; + +const myComplexSelector = createSelector( + mySelector, + (myState) => myState.get('someNestedState') +); + +export { + myComplexSelector, +}; +``` + +These selectors can then either be used directly in our containers as +`mapStateToProps` functions or be nested with `createSelector` once again: + +```javascript +export default connect(createSelector( + myComplexSelector, + (myNestedState) => ({ data: myNestedState }) +))(SomeComponent); +``` + +### Adding a new selector + +If you have a `selectors.js` file next to the reducer which's part of the state +you want to select, add your selector to said file. If you don't have one yet, +add a new one into your container folder and fill it with this boilerplate code: + +```JS +import { createSelector } from 'reselect'; + +const selectMyState = () => createSelector( + +); + +export { + selectMyState, +}; +``` + +--- + +_Don't like this feature? [Click here](remove.md)_ diff --git a/cyclone-web/docs/js/routing.md b/cyclone-web/docs/js/routing.md new file mode 100644 index 0000000000000000000000000000000000000000..8cacfa28379a65a3696eba2e473a6a9c2768ae9b --- /dev/null +++ b/cyclone-web/docs/js/routing.md @@ -0,0 +1,164 @@ +# Routing via `react-router` and `react-router-redux` + +`react-router` is the de-facto standard routing solution for react applications. +The thing is that with redux and a single state tree, the URL is part of that +state. `react-router-redux` takes care of synchronizing the location of our +application with the application state. + +(See the [`react-router-redux` documentation](https://github.com/reactjs/react-router-redux) +for more information) + +## Usage + +To add a new route, use the generator with `npm run generate route`. + +This is what a standard (generated) route looks like for a container: + +```JS +{ + path: '/', + name: 'home', + getComponent(nextState, cb) { + const importModules = Promise.all([ + System.import('containers/HomePage') + ]); + + const renderRoute = loadModule(cb); + + importModules.then(([component]) => { + renderRoute(component); + }); + + importModules.catch(errorLoading); + }, +} +``` + +To go to a new page use the `push` function by `react-router-redux`: + +```JS +import { push } from 'react-router-redux'; + +dispatch(push('/some/page')); +``` + +## Child Routes +`npm run generate route` does not currently support automatically generating child routes if you need them, but they can be easily created manually. + +For example, if you have a route called `about` at `/about` and want to make a child route called `team` at `/about/our-team` you can just add that child page to the parent page's `childRoutes` array like so: + +```JS +/* your app's other routes would already be in this array */ +{ + path: '/about', + name: 'about', + getComponent(nextState, cb) { + const importModules = Promise.all([ + System.import('containers/AboutPage'), + ]); + + const renderRoute = loadModule(cb); + + importModules.then(([component]) => { + renderRoute(component); + }); + + importModules.catch(errorLoading); + }, + childRoutes: [ + { + path: '/about/our-team', + name: 'team', + getComponent(nextState, cb) { + const importModules = Promise.all([ + System.import('containers/TeamPage'), + ]); + + const renderRoute = loadModule(cb); + + importModules.then(([component]) => { + renderRoute(component); + }); + + importModules.catch(errorLoading); + }, + }, + ] +} +``` + +## Dynamic routes + +To go to a dynamic route such as 'post/:slug' eg 'post/cool-new-post', firstly add the route to your `routes.js`, as per documentation: + +```JS +path: '/posts/:slug', +name: 'post', +getComponent(nextState, cb) { + const importModules = Promise.all([ + System.import('containers/Post/reducer'), + System.import('containers/Post/sagas'), + System.import('containers/Post'), + ]); + + const renderRoute = loadModule(cb); + + importModules.then(([reducer, sagas, component]) => { + injectReducer('post', reducer.default); + injectSagas(sagas.default); + renderRoute(component); + }); + + importModules.catch(errorLoading); +}, +``` + +###Container: + +```JSX +<Link to={`/posts/${post.slug}`} key={post._id}> +``` + +Clickable link with payload (you could use push if needed). + +###Action: + +```JS +export function getPost(slug) { + return { + type: LOAD_POST, + slug, + }; +} + +export function postLoaded(post) { + return { + type: LOAD_POST_SUCCESS, + podcast, + }; +} +``` + +###Saga: + +```JS +const { slug } = yield take(LOAD_POST); +yield call(getXhrPodcast, slug); + +export function* getXhrPodcast(slug) { + const requestURL = `http://your.api.com/api/posts/${slug}`; + const post = yield call(request, requestURL); + if (!post.err) { + yield put(postLoaded(post)); + } else { + yield put(postLoadingError(post.err)); + } +} +``` + +Wait (`take`) for the LOAD_POST constant, which contains the slug payload from the `getPost()` function in actions.js. + +When the action is fired then dispatch the `getXhrPodcast()` function to get the response from your api. On success dispatch the `postLoaded()` action (`yield put`) which sends back the response and can be added into the reducer state. + + +You can read more on [`react-router`'s documentation](https://github.com/reactjs/react-router/blob/master/docs/API.md#props-3). diff --git a/cyclone-web/docs/ngrok.md b/cyclone-web/docs/ngrok.md new file mode 100644 index 0000000000000000000000000000000000000000..b4e3963cfcd7d8d2c430e63d4829b9426aeb1455 --- /dev/null +++ b/cyclone-web/docs/ngrok.md @@ -0,0 +1,28 @@ +## 远程联调工具 ngrok + +**场景**:现在开发团队经常处于异地的情况,这个时候相互联调挺麻烦的,通过 ngrok 可以快速解决这个问题! + +**原来的解决方案:** +1. 在杭州启动一个测试服务,然后直接连接杭州的 +2. 更新代码,自己本地下载代码部署开发 + +`缺点:如果遇到联调开发,前后端都在不断的调试修改代码的时候,上面的方案会极大浪费时间` + +**Ngrok**: + +1. https://ngrok.com/: 可以将 NAT 后面的本机 localhost 服务暴露给外部访问 +2. 例子:后端开发本机启动 java 在 8080 端口, 在命令行运行 ngrok 8080 + +``` +Session Status online +Version 2.1.18 +Region United States (us) +Web Interface http://127.0.0.1:4040 +Forwarding http://6f324930.ngrok.io -> localhost:8080 +Forwarding https://6f324930.ngrok.io -> localhost:8080 + +Connections ttl opn rt1 rt5 p50 p90 + 0 0 0.00 0.00 0.00 0.00 +``` + +3. 外部通过访问 http://6f324930.ngrok.io 就能直接链接开发机 diff --git a/cyclone-web/docs/testing/README.md b/cyclone-web/docs/testing/README.md new file mode 100644 index 0000000000000000000000000000000000000000..21905c49e77706bf76377efd0efb7949d3247943 --- /dev/null +++ b/cyclone-web/docs/testing/README.md @@ -0,0 +1,28 @@ +# Testing + +- [Unit Testing](unit-testing.md) +- [Component Testing](component-testing.md) +- [Remote Testing](remote-testing.md) + +Testing your application is a vital part of serious development. There are a few +things you should test. If you've never done this before start with [unit testing](unit-testing.md). +Move on to [component testing](component-testing.md) when you feel like you +understand that! + +We also support [remote testing](remote-testing.md) your local application, +which is quite awesome, so definitely check that out! + +## Usage with this boilerplate + +To test your application started with this boilerplate do the following: + +1. Sprinkle `.test.js` files directly next to the parts of your application you + want to test. (Or in `test/` subdirectories, it doesn't really matter as long + as they are directly next to those parts and end in `.test.js`) + +1. Write your unit and component tests in those files. + +1. Run `npm run test` in your terminal and see all the tests pass! (hopefully) + +There are a few more commands related to testing, checkout the [commands documentation](../general/commands.md#testing) +for the full list! diff --git a/cyclone-web/docs/testing/component-testing.md b/cyclone-web/docs/testing/component-testing.md new file mode 100644 index 0000000000000000000000000000000000000000..9bceb33704f72e9d44a29eb59912964b9b52d263 --- /dev/null +++ b/cyclone-web/docs/testing/component-testing.md @@ -0,0 +1,160 @@ +# Component testing + +[Unit testing your Redux actions and reducers](unit-testing.md) is nice, but you +can do even more to make sure nothing breaks your application. Since React is +the _view_ layer of your app, let's see how to test Components too! + +<!-- TOC depthFrom:2 depthTo:6 withLinks:1 updateOnSave:1 orderedList:0 --> + +- [Shallow rendering](#shallow-rendering) +- [Enzyme](#enzyme) + +<!-- /TOC --> + +## Shallow rendering + +React provides us with a nice add-on called the Shallow Renderer. This renderer +will render a React component **one level deep**. Lets take a look at what that +means with a simple `<Button>` component... + +This component renders a `<button>` element containing a checkmark icon and some +text: + +```javascript +// Button.react.js + +import CheckmarkIcon from './CheckmarkIcon.react'; + +function Button(props) { + return ( + <button className="btn" onClick={props.onClick}> + <CheckmarkIcon /> + { React.Children.only(props.children) } + </button> + ); +} + +export default Button; +``` + +_Note: This is a [state**less** ("dumb") component](../js/README.md#architecture-components-and-containers)_ + +It might be used in another component like this: + +```javascript +// HomePage.react.js + +import Button from './Button.react'; + +class HomePage extends React.Component { + render() { + return( + <Button onClick={this.doSomething}>Click me!</Button> + ); + } +} +``` + +_Note: This is a [state**ful** ("smart") component](../js/README.md#architecture-components-and-containers)!_ + +When rendered normally with the standard `ReactDOM.render` function, this will +be the HTML output +(*Comments added in parallel to compare structures in HTML from JSX source*): + +```html +<button> <!-- <Button> --> + <i class="fa fa-checkmark"></i> <!-- <CheckmarkIcon /> --> + Click Me! <!-- { props.children } --> +</button> <!-- </Button> --> +``` + +Conversely, when rendered with the shallow renderer, we'll get a String +containing this "HTML": + +```html +<button> <!-- <Button> --> + <CheckmarkIcon /> <!-- NOT RENDERED! --> + Click Me! <!-- { props.children } --> +</button> <!-- </Button> --> +``` + +If we test our `Button` with the normal renderer and there's a problem +with the `CheckmarkIcon` then the test for the `Button` will fail as well... +but finding the culprit will be hard. Using the _shallow_ renderer, we isolate +the problem's cause since we don't render any other components other than the +one we're testing! + +The problem with the shallow renderer is that all assertions have to be done +manually, and you cannot do anything that needs the DOM. + +Thankfully, [AirBnB](https://twitter.com/AirbnbEng) has open sourced their +wrapper around the React shallow renderer and jsdom, called `enzyme`. `enzyme` +is a testing utility that gives us a nice assertion/traversal/manipulation API. + +## Enzyme + +Lets test our `<Button>` component! We're going to assess three things: First, +that it renders a HTML `<button>` tag, second that it renders its children we +pass it and third that handles clicks! + +This is our Mocha setup: + +```javascript +describe('<Button />', () => { + it('renders a <button>', () => {}); + + it('renders its children', () => {}); + + it('handles clicks', () => {}); +}); +``` + +Lets start with testing that it renders a `<button>`. To do that we first +`shallow` render it, and then `expect` that a `<button>` node exists. + +```javascript +it('renders a <button>', () => { + const renderedComponent = shallow( + <Button></Button> + ); + expect( + renderedComponent.find("button").node + ).toExist(); +}); +``` + +Nice! If somebody breaks our button component by having it render an `<a>` tag +or something else we'll immediately know! Let's do something a bit more advanced +now, and check that our `<Button>` renders its children. + +We render our button component with some text, and then verify that our text +exists: + +```javascript +it('renders its children', () => { + const text = "Click me!"; + const renderedComponent = shallow( + <Button>{ text }</Button> + ); + expect( + renderedComponent.contains(text) + ).toEqual(true); +}); +``` + +Great! Onwards to our last and most advanced test: checking that our `<Button>` handles clicks correctly. We'll use a Spy for that. A Spy is a +function that knows if, and how often, it has been called. We create the Spy +(thoughtfully provided by `expect`), pass _it_ as the `onClick` handler to our +component, simulate a click on the rendered `<button>` element and, lastly, +see that our Spy was called: + +```javascript +it('handles clicks', () => { + const onClickSpy = expect.createSpy(); + const renderedComponent = shallow(<Button onClick={onClickSpy} />); + renderedComponent.find('button').simulate('click'); + expect(onClickSpy).toHaveBeenCalled(); +}); +``` + +And that's how you unit test your components and make sure they work correctly! diff --git a/cyclone-web/docs/testing/remote-testing.md b/cyclone-web/docs/testing/remote-testing.md new file mode 100644 index 0000000000000000000000000000000000000000..d24406afad3dbef700dbe8b2072e14e6a1a25dcb --- /dev/null +++ b/cyclone-web/docs/testing/remote-testing.md @@ -0,0 +1,12 @@ +# Remote testing + +```Shell +npm run start:tunnel +``` + +This command will start a server and tunnel it with `ngrok`. You'll get a URL +that looks a bit like this: `http://abcdef.ngrok.com` + +This URL will show the version of your application that's in the `build` folder, +and it's accessible from the entire world! This is great for testing on different +devices and from different locations! diff --git a/cyclone-web/docs/testing/unit-testing.md b/cyclone-web/docs/testing/unit-testing.md new file mode 100644 index 0000000000000000000000000000000000000000..5d4379de31492f3fd3bcb69e1c44c4830a250a1e --- /dev/null +++ b/cyclone-web/docs/testing/unit-testing.md @@ -0,0 +1,395 @@ +# Unit testing + +Unit testing is the practice of testing the smallest possible *units* of our +code, functions. We run our tests and automatically verify that our functions +do the thing we expect them to do. We assert that, given a set of inputs, our +functions return the proper values and handle problems. + +This boilerplate uses the [Mocha](https://github.com/mochajs/mocha) test +framework to run the tests and [expect](http://github.com/mjackson/expect) for +assertions. These libraries make writing tests as easy as speaking - you +`describe` a unit of your code and `expect` `it` to do the correct thing. + +<!-- TOC depthFrom:2 depthTo:4 withLinks:1 updateOnSave:1 orderedList:0 --> + +- [Basics](#basics) + - [Mocha](#mocha) + - [expect](#expect) +- [Testing Redux Applications](#testing-redux-applications) + - [Reducers](#reducers) + - [rewire](#rewire) + - [Actions](#actions) + +<!-- /TOC --> + +We use this glob pattern to find unit tests `app/**/*.test.js` - this tells +mocha to run all files that end with `.test.js` anywhere within the `app` +folder. Use this to your advantage, and put unit tests next to the files you +want to test so relevant files stay together! + +Imagine a navigation bar, this is what its folder might look like: + +``` +NavBar # Wrapping folder +├── NavBar.css # Styles +├── NavBar.react.js # Actual component +├── NavBar.actions.js # Actions +├── NavBar.constants.js # Constants +├── NavBar.index.js # Reducer +└── test # Folder of tests + ├── NavBar.actions.test.js # Actions tests + └── NavBar.reducer.test.js # Reducer tests +``` + +## Basics + +For the sake of this guide, lets pretend we're testing this function. It's +situated in the `add.js` file: + +```javascript +// add.js + +export function add(x, y) { + return x + y; +} +``` + +> Note: The `export` here is ES6 syntax, and you will need an ES6 transpiler + (e.g. babel.js) to run this JavaScript. + +> The `export` exports our function as a module, which we can `import` and use + in other files. Continue below to see what that looks like. + +### Mocha + +Mocha is our unit testing framework. Its API, which we write tests with, is +speech like and easy to use. + +> Note: This is the [official documentation](http://mochajs.org) of Mocha. + +We're going to add a second file called `add.test.js` with our unit tests +inside. Running said unit tests requires us to enter `mocha add.test.js` into +the command line. + +First, we `import` the function in our `add.test.js` file: + +```javascript +// add.test.js + +import { add } from './add.js'; +``` + +Second, we `describe` our function: + +```javascript +describe('add()', () => { + +}); +``` + +> Note: `(arg1, arg2) => { }` is ES6 notation for anonymous functions, i.e. is +the same thing as `function(arg1, arg2) { }` + +Third, we tell Mocha what `it` (our function) should do: + +```javascript +describe('add()', () => { + it('adds two numbers', () => { + + }); + + it('doesnt add the third number', () => { + + }); +}); +``` + +That's the entire Mocha part! Onwards to the actual tests. + +### expect + +Using expect, we `expect` our little function to return the same thing every +time given the same input. + +> Note: This is the [official documentation](https://github.com/mjackson/expect) for expect. + +First, we have to import `expect` at the top of our file, before the tests: + +```javascript +import expect from 'expect'; + +describe('add()', () => { + // [...] +}); +``` + +We're going to test that our little function correctly adds two numbers first. +We are going to take some chosen inputs, and `expect` the result `toEqual` the +corresponding output: + +```javascript +// [...] +it('adds two numbers', () => { + expect(add(2, 3)).toEqual(5); +}); +// [...] +``` + +Lets add the second test, which determines that our function doesn't add the +third number if one is present: + +```javascript +// [...] +it('doesnt add the third number', () => { + expect(add(2, 3, 5)).toEqual(add(2, 3)); +}); +// [...] +``` + +> Note: Notice that we call `add` in `toEqual`. I won't tell you why, but just + think about what would happen if we rewrote the expect as `expect(add(2, 3, 5)).toEqual(5)` + and somebody broke something in the add function. What would this test + actually... test? + +Should our function work, Mocha will show this output when running the tests: + +``` +add() + ✓ adds two numbers + ✓ doesnt add the third number +``` + +Lets say an unnamed colleague of ours breaks our function: + +```javascript +// add.js + +export function add(x, y) { + return x * y; +} +``` + +Oh no, now our function doesn't add the numbers anymore, it multiplies them! +Imagine the consequences to our code that uses the function! + +Thankfully, we have unit tests in place. Because we run the unit tests before we +deploy our application, we see this output: + +``` +add() + 1) adds two numbers + ✓ doesnt add the third number + + 1) add adds two numbers: + Error: Expected 6 to equal 5 +``` + +This tells us that something is broken in the add function before any users get +the code! Congratulations, you just saved time and money! + +## Testing Redux Applications + +This boilerplate uses Redux, partially because it turns our data flow into +testable (pure) functions. Let's go back to our `NavBar` component from above, +and see what testing the actions and the reducer of it would look like. + +This is what our `NavBar` actions look like: + +```javascript +// NavBar.actions.js + +import { TOGGLE_NAV } from './NavBar.constants.js'; + +export function toggleNav() { + return { type: TOGGLE_NAV }; +} +``` + +with this reducer: + +```javascript +index.js + +index.jsOGGLE_NAV } from './NavBar.constants.js'; + +const initialState = { + open: false +}; + +function NavBarReducer(state = initialState, action) { + switch (action.type) { + case TOGGLE_NAV: + return Object.assign({}, state, { + open: !state.open + }); + default: + return state; + } +} + +export default NavBarReducer; +``` + +Lets test the reducer first! + +### Reducers + +First, we have to import `expect`, the reducer and the constant. + +```javascript +// NavBar.reducer.test.js + +import expect from 'expect'; +import NavBarReducer from '../NavBar.reducer'; +import { TOGGLE_NAV } from '../NavBar.constants'; +``` + +Then we `describe` the reducer, and add two tests: we check that it returns the +initial state and that it handles the `toggleNav` action. + +```javascript +describe('NavBarReducer', () => { + it('returns the initial state', () => { + + }); + + it('handles the toggleNav action', () => { + + }); +}); +``` + +Lets write the tests themselves! Since the reducer is just a function, we can +call it like any other function and `expect` the output to equal something. + +To test that it returns the initial state, we call it with a state of `undefined` +(the first argument), and an empty action (second argument). The reducer should +return the initial state of the `NavBar`, which is + +```javascript +{ + open: false +} +``` + +Lets put that into practice: + +```javascript +describe('NavBarReducer', () => { + it('returns the initial state', () => { + expect(NavBarReducer(undefined, {})).toEqual({ + open: false + }); + }); + + it('handles the toggleNav action', () => { + + }); +}); +``` + +This works, but we have one problem: We also test the initial state itself. When +somebody changes the initial state, this test will fail, even though the reducer +correctly returns the initial state. + +To fix that, we have to `import` the initial state from the reducer file and +check that the reducer returns that. This has one problem: Our initial state +isn't `export`ed. + +Now, you might be thinking "Ha! easy: simply add an `export` before the +`const initialState` in the reducer and boom!"... But in fact we _don't_ want +to do that because it's an internal (or "private") property of that module +alone and shouldn't really be accessible from the outside at all. + +This is where the `rewire` module comes in handy. + +#### rewire + +Rewire allows us to access properties we normally couldn't via special +`__get__` and `__set__` methods it injects into modules. + +Start by `import`ing rewire **at the top** of your test file: + +```javascript +// `NavBar.reducer.test.js` + +import expect from 'expect'; +import rewire from 'rewire'; +import NavBarReducer from '../NavBar.reducer'; +import { TOGGLE_NAV } from '../NavBar.constants'; + +const initialState = NavBarReducer.__get__('initialState'); +``` + +> Note: You might be wondering why we still `import` the `NavBarReducer` above. + The `NavBarReducer` imported with `rewire` isn't the _actual_ reducer, it's a + `rewire`d version. + +Now we can really see whether the `NavBarReducer` returns the initial state if +no action is passed! + +```javascript +it('returns the initial state', () => { + expect(NavBarReducer(undefined, {})).toEqual(initialState); +}); +``` + +w00t, we fixed the test! + +> For more information on Rewire, see the [official documentation](https://github.com/jhnns/rewire) + +Lets see how we can test actions next. + +### Actions + +We have one action `toggleNav` that changes the `NavBar` open state. + +A Redux action is a pure function, so testing it isn't more difficult than +testing our `add` function from the first part of this guide! + +The first step is to import the action to be tested, the constant it should +return and `expect`: + +```javascript +// NavBar.actions.test.js + +import { toggleNav } from '../NavBar.actions'; +import { TOGGLE_NAV } from '../NavBar.constants'; +import expect from 'expect'; +``` + +Then we `describe` the actions: + +```javascript +describe('NavBar actions', () => { + describe('toggleNav', () => { + it('should return the correct constant', () => { + + }); + }); +}); +``` + +> Note: `describe`s can be nested, which gives us nice output, as we'll see later. + +And the last step is to add the assertion: + +```javascript +it('should return the correct constant', () => { + expect(toggleNav()).toEqual({ + type: TOGGLE_NAV + }); +}); +``` + +If our `toggleNav` action works correctly, this is the output Mocha will show us: + +``` +NavBar actions + toggleNav + ✓ should return the correct constant +``` + +And that's it, we now know when somebody breaks the `toggleNav` action! + +*Continue to learn how to test your application with [Component Testing](component-testing.md)!* diff --git a/cyclone-web/hf-pub.sh b/cyclone-web/hf-pub.sh new file mode 100644 index 0000000000000000000000000000000000000000..c6bcab712c37a0810a051a94b7d54478e6236b4b --- /dev/null +++ b/cyclone-web/hf-pub.sh @@ -0,0 +1,85 @@ +#!/bin/bash +#set -x +#****************************************************************************** +# @file : hf-pub.sh +# @author : wangyubin +# @date : 2016-04-21 13:42:34 +# +# @brief : publish script for hf env +# history : init +#****************************************************************************** + +# git tag +TAG=`date "+%Y%m%d%H%M%S"` +TAG_CONTENT="" +TAG_FILE="" +PKG_NAME=master +PKG_SERVER=dcospkg.stable.idcos.net + + +function usage() { + echo "hf-pub.sh -c TAG_CONTENT OR -F TAG_FILE" + # echo " -p PKG_NAME -s <PKG_SERVER>" + # echo " -c TAG_CONTENT OR -F TAG_FILE" + # echo " -p PKG_NAME: 包名称 **必选参数**" + # echo " -s PKG_SERVER: 打包服务器地址 可选参数, 默认 55.3.15.142" + echo " -c TAG_CONTENT: tag 内容 指定 -c 后不能指定 -F" + echo " -F TAG_FILE: tag 内容描述文件 指定 -F 后不能指定 -c" + echo "" + echo "" +} + +while getopts "c:p:s:F:" arg +do + case $arg in + p) + PKG_NAME=$OPTARG + ;; + s) + PKG_SERVER=$OPTARG + ;; + c) + TAG_CONTENT=$OPTARG + ;; + F) + TAG_FILE=$OPTARG + ;; + ?) + echo "unkonw argument" + usage + exit 1 + ;; + esac +done + +if [ "$TAG_CONTENT" == "" -a "$TAG_FILE" == "" ]; then + echo "必须指定 -c 或者 -F 参数" + usage + exit 1 +fi + +if [ "$TAG_CONTENT" != "" -a "$TAG_FILE" != "" ]; then + echo "-c 或者 -F 参数 只能指定一个" + usage + exit 1 +fi + +if [ "$TAG_CONTENT" != "" ]; then + git tag -m $TAG_CONTENT $TAG +else + git tag -F $TAG_FILE $TAG +fi + +if [ $? -ne 0 ]; then + exit 1 +fi + +git tag -l -n20 $TAG + +# git push --tag + +echo "5秒后开始打包 ..." +sleep 5 + +sh pkg.sh $PKG_NAME $TAG $PKG_SERVER + diff --git a/cyclone-web/internals/config.js b/cyclone-web/internals/config.js new file mode 100644 index 0000000000000000000000000000000000000000..32b6781c73e2b38e5c895b8ef1939f904a4e7e78 --- /dev/null +++ b/cyclone-web/internals/config.js @@ -0,0 +1,56 @@ +const resolve = require('path').resolve; +const pullAll = require('lodash/pullAll'); +const uniq = require('lodash/uniq'); + +const ReactBoilerplate = { + // This refers to the react-boilerplate version this project is based on. + version: '3.2.1', + + /** + * The DLL Plugin provides a dramatic speed increase to webpack build and hot module reloading + * by caching the module metadata for all of our npm dependencies. We enable it by default + * in development. + * + * + * To disable the DLL Plugin, set this value to false. + */ + dllPlugin: { + defaults: { + /** + * we need to exclude dependencies which are not intended for the browser + * by listing them here. + */ + exclude: [ + 'chalk', + 'compression', + 'cross-env', + 'express', + 'ip', + 'minimist', + 'sanitize.css', + ], + + /** + * Specify any additional dependencies here. We include core-js and lodash + * since a lot of our dependencies depend on them and they get picked up by webpack. + */ + include: ['core-js', 'eventsource-polyfill', 'babel-polyfill', 'lodash'], + + // The path where the DLL manifest and bundle will get built + path: resolve('../node_modules/react-boilerplate-dlls'), + }, + + entry(pkg) { + const dependencyNames = Object.keys(pkg.dependencies); + const exclude = pkg.dllPlugin.exclude || ReactBoilerplate.dllPlugin.defaults.exclude; + const include = pkg.dllPlugin.include || ReactBoilerplate.dllPlugin.defaults.include; + const includeDependencies = uniq(dependencyNames.concat(include)); + + return { + reactBoilerplateDeps: pullAll(includeDependencies, exclude), + }; + }, + }, +}; + +module.exports = ReactBoilerplate; diff --git a/cyclone-web/internals/generators/component/es6.js.hbs b/cyclone-web/internals/generators/component/es6.js.hbs new file mode 100644 index 0000000000000000000000000000000000000000..b8358dccac3896d0daca54467e8b38cc362ee7ac --- /dev/null +++ b/cyclone-web/internals/generators/component/es6.js.hbs @@ -0,0 +1,33 @@ +/** +* +* {{ properCase name }} +* +*/ + +import React from 'react'; + +{{#if wantMessages}} +import { FormattedMessage } from 'react-intl'; +import messages from './messages'; +{{/if}} +{{#if wantLESS}} +import styles from './styles.less'; +{{/if}} + +class {{ properCase name }} extends React.Component { // eslint-disable-line react/prefer-stateless-function + render() { + return ( + {{#if wantLESS}} + <div className={{curly true}}styles.{{ camelCase name }}{{curly}}> + {{else}} + <div> + {{/if}} + {{#if wantMessages}} + <FormattedMessage {...messages.header} /> + {{/if}} + </div> + ); + } +} + +export default {{ properCase name }}; diff --git a/cyclone-web/internals/generators/component/index.js b/cyclone-web/internals/generators/component/index.js new file mode 100644 index 0000000000000000000000000000000000000000..36204b09d6dfcc255736a1e5b8bf030cf04e5e36 --- /dev/null +++ b/cyclone-web/internals/generators/component/index.js @@ -0,0 +1,90 @@ +/** + * Component Generator + */ + +const componentExists = require('../utils/componentExists'); +const containerList = require('../utils/containerList'); + +module.exports = { + description: 'Add an unconnected component', + prompts: [{ + type: 'confirm', + name: 'wantInContainer', + default: false, + message: 'Does it in container?', + }, { + type: 'list', + name: 'containerName', + message: 'Select a container', + choices: () => containerList(), + }, { + type: 'list', + name: 'type', + message: 'Select the type of component', + default: 'Stateless Function', + choices: () => ['ES6 Class', 'Stateless Function'], + }, { + type: 'input', + name: 'name', + message: 'What should it be called?', + default: 'Button', + validate: (value) => { + if ((/.+/).test(value)) { + return componentExists(value) ? 'A component or container with this name already exists' : true; + } + + return 'The name is required'; + }, + }, { + type: 'confirm', + name: 'wantLESS', + default: true, + message: 'Does it have styling?', + }, { + type: 'confirm', + name: 'wantMessages', + default: true, + message: 'Do you want i18n messages (i.e. will this component use text)?', + }], + actions: (data) => { + let name = 'app'; + if (data.wantInContainer) { + name = `app/containers/${data.containerName}`; + } + + // Generate index.js and index.test.js + const actions = [{ + type: 'add', + path: `../../${name}/components/{{properCase name}}/index.jsx`, + templateFile: data.type === 'ES6 Class' ? './component/es6.js.hbs' : './component/stateless.js.hbs', + abortOnFail: true, + }, { + type: 'add', + path: `../../${name}/components/{{properCase name}}/tests/index.test.js`, + templateFile: './component/test.js.hbs', + abortOnFail: true, + }]; + + // If they want a LESS file, add styles.less + if (data.wantLESS) { + actions.push({ + type: 'add', + path: `../../${name}/components/{{properCase name}}/styles.less`, + templateFile: './component/styles.less.hbs', + abortOnFail: true, + }); + } + + // If they want a i18n messages file + if (data.wantMessages) { + actions.push({ + type: 'add', + path: `../../${name}/components/{{properCase name}}/messages.js`, + templateFile: './component/messages.js.hbs', + abortOnFail: true, + }); + } + + return actions; + }, +}; diff --git a/cyclone-web/internals/generators/component/messages.js.hbs b/cyclone-web/internals/generators/component/messages.js.hbs new file mode 100644 index 0000000000000000000000000000000000000000..ef317e90bf60d38374b29ba4c9437a89a313936a --- /dev/null +++ b/cyclone-web/internals/generators/component/messages.js.hbs @@ -0,0 +1,13 @@ +/* + * {{ properCase name }} Messages + * + * This contains all the text for the {{ properCase name }} component. + */ +import { defineMessages } from 'react-intl'; + +export default defineMessages({ + header: { + id: 'app.components.{{ properCase name }}.header', + defaultMessage: 'This is the {{ properCase name}} component !', + }, +}); diff --git a/cyclone-web/internals/generators/component/stateless.js.hbs b/cyclone-web/internals/generators/component/stateless.js.hbs new file mode 100644 index 0000000000000000000000000000000000000000..9e2023ad8ef9a3e4561ff0d71360c6562eaa6051 --- /dev/null +++ b/cyclone-web/internals/generators/component/stateless.js.hbs @@ -0,0 +1,32 @@ +/** +* +* {{ properCase name }} +* +*/ + +import React from 'react'; + +{{#if wantMessages}} +import { FormattedMessage } from 'react-intl'; +import messages from './messages'; +{{/if}} + +{{#if wantLESS}} +import styles from './styles.less'; +{{/if}} + +function {{ properCase name }}() { + return ( + {{#if wantLESS}} + <div className={{curly true}}styles.{{ camelCase name }}{{curly}}> + {{else}} + <div> + {{/if}} + {{#if wantMessages}} + <FormattedMessage {...messages.header} /> + {{/if}} + </div> + ); +} + +export default {{ properCase name }}; diff --git a/cyclone-web/internals/generators/component/styles.less.hbs b/cyclone-web/internals/generators/component/styles.less.hbs new file mode 100644 index 0000000000000000000000000000000000000000..1dc727bb5542528cff751b06bfcf86702a7e390b --- /dev/null +++ b/cyclone-web/internals/generators/component/styles.less.hbs @@ -0,0 +1,3 @@ +.{{ camelCase name }} { /* stylelint-disable */ + +} diff --git a/cyclone-web/internals/generators/component/test.js.hbs b/cyclone-web/internals/generators/component/test.js.hbs new file mode 100644 index 0000000000000000000000000000000000000000..19f00f0e0c14cc49ed67c3a6e9c7349d4a2b4b77 --- /dev/null +++ b/cyclone-web/internals/generators/component/test.js.hbs @@ -0,0 +1,11 @@ +// import {{ properCase name }} from '../index'; + +import expect from 'expect'; +// import { shallow } from 'enzyme'; +// import React from 'react'; + +describe('<{{ properCase name }} />', () => { + it('Expect to have unit tests specified', () => { + expect(true).toEqual(false); + }); +}); diff --git a/cyclone-web/internals/generators/container/actions.js.hbs b/cyclone-web/internals/generators/container/actions.js.hbs new file mode 100644 index 0000000000000000000000000000000000000000..8b9d68b81eee4b521252199fc911847cbd8affdc --- /dev/null +++ b/cyclone-web/internals/generators/container/actions.js.hbs @@ -0,0 +1,15 @@ +/* + * + * {{ properCase name }} actions + * + */ + +import { + DEFAULT_ACTION, +} from './constants'; + +export function defaultAction() { + return { + type: DEFAULT_ACTION, + }; +} diff --git a/cyclone-web/internals/generators/container/actions.test.js.hbs b/cyclone-web/internals/generators/container/actions.test.js.hbs new file mode 100644 index 0000000000000000000000000000000000000000..8e79eb606cb759a1fb718354497dfd973bdd7a18 --- /dev/null +++ b/cyclone-web/internals/generators/container/actions.test.js.hbs @@ -0,0 +1,18 @@ +import expect from 'expect'; +import { + defaultAction, +} from '../actions'; +import { + DEFAULT_ACTION, +} from '../constants'; + +describe('{{ properCase name }} actions', () => { + describe('Default Action', () => { + it('has a type of DEFAULT_ACTION', () => { + const expected = { + type: DEFAULT_ACTION, + }; + expect(defaultAction()).toEqual(expected); + }); + }); +}); diff --git a/cyclone-web/internals/generators/container/constants.js.hbs b/cyclone-web/internals/generators/container/constants.js.hbs new file mode 100644 index 0000000000000000000000000000000000000000..0a37bd1abcd235baab2ebe2e7de6bfd54efe0396 --- /dev/null +++ b/cyclone-web/internals/generators/container/constants.js.hbs @@ -0,0 +1,7 @@ +/* + * + * {{ properCase name }} constants + * + */ + +export const DEFAULT_ACTION = 'app/{{ properCase name }}/DEFAULT_ACTION'; diff --git a/cyclone-web/internals/generators/container/index.js b/cyclone-web/internals/generators/container/index.js new file mode 100644 index 0000000000000000000000000000000000000000..b48024b2ac31c8aabe96ec2fbb95f391d67dbe13 --- /dev/null +++ b/cyclone-web/internals/generators/container/index.js @@ -0,0 +1,153 @@ +/** + * Container Generator + */ + +const componentExists = require('../utils/componentExists'); + +module.exports = { + description: 'Add a container component', + prompts: [{ + type: 'input', + name: 'name', + message: 'What should it be called?', + default: 'Form', + validate: (value) => { + if ((/.+/).test(value)) { + return componentExists(value) ? 'A component or container with this name already exists' : true; + } + + return 'The name is required'; + }, + }, { + type: 'confirm', + name: 'wantHeaders', + default: false, + message: 'Do you want headers?', + }, { + type: 'confirm', + name: 'wantLESS', + default: false, + message: 'Does it have styling?', + }, { + type: 'confirm', + name: 'wantActionsAndReducer', + default: true, + message: 'Do you want an actions/constants/selectors/reducer tupel for this container?', + }, { + type: 'confirm', + name: 'wantSagas', + default: true, + message: 'Do you want sagas for asynchronous flows? (e.g. fetching data)', + }, { + type: 'confirm', + name: 'wantMessages', + default: true, + message: 'Do you want i18n messages (i.e. will this component use text)?', + }], + actions: (data) => { + // Generate attr-form.jsx and index.test.js + const actions = [{ + type: 'add', + path: '../../app/containers/{{properCase name}}/attr-form.jsx', + templateFile: './container/attr-form.jsx.hbs', + abortOnFail: true, + }, { + type: 'add', + path: '../../app/containers/{{properCase name}}/tests/index.test.js', + templateFile: './container/test.js.hbs', + abortOnFail: true, + }]; + + // If they want a LESS file, add styles.less + if (data.wantLESS) { + actions.push({ + type: 'add', + path: '../../app/containers/{{properCase name}}/styles.less', + templateFile: './container/styles.less.hbs', + abortOnFail: true, + }); + } + + // If component wants messages + if (data.wantMessages) { + actions.push({ + type: 'add', + path: '../../app/containers/{{properCase name}}/messages.js', + templateFile: './container/messages.js.hbs', + abortOnFail: true, + }); + } + + // If they want actions and a reducer, generate actions.js, constants.js, + // index.js and the corresponding tests for actions and the reducer + if (data.wantActionsAndReducer) { + // Actions + actions.push({ + type: 'add', + path: '../../app/containers/{{properCase name}}/actions.js', + templateFile: './container/actions.js.hbs', + abortOnFail: true, + }); + actions.push({ + type: 'add', + path: '../../app/containers/{{properCase name}}/tests/actions.test.js', + templateFile: './container/actions.test.js.hbs', + abortOnFail: true, + }); + + // Constants + actions.push({ + type: 'add', + path: '../../app/containers/{{properCase name}}/constants.js', + templateFile: './container/constants.js.hbs', + abortOnFail: true, + }); + + // Selectors + actions.push({ + type: 'add', + path: '../../app/containers/{{properCase name}}/selectors.js', + templateFile: './container/selectors.js.hbs', + abortOnFail: true, + }); + actions.push({ + type: 'add', + path: '../../app/containers/{{properCase name}}/tests/selectors.test.js', + templateFile: './container/selectors.test.js.hbs', + abortOnFail: true, + }); + + // Reducer + actions.push({ + type: 'add', + path: '../../app/containers/{{properCase name}}/index.js', + templateFile: './container/index.js.hbs', + abortOnFail: true, + }); + actions.push({ + type: 'add', + path: '../../app/containers/{{properCase name}}/tests/reducer.test.js', + templateFile: './container/reducer.test.js.hbs', + abortOnFail: true, + }); + } + + // Sagas + if (data.wantSagas) { + actions.push({ + type: 'add', + path: '../../app/containers/{{properCase name}}/index.js', + templateFile: './container/index.js.hbs', + abortOnFail: true, + }); + actions.push({ + type: 'add', + path: '../../app/containers/{{properCase name}}/tests/sagas.test.js', + templateFile: './container/sagas.test.js.hbs', + abortOnFail: true, + }); + } + + return actions; + }, +}; diff --git a/cyclone-web/internals/generators/container/index.jsx.hbs b/cyclone-web/internals/generators/container/index.jsx.hbs new file mode 100644 index 0000000000000000000000000000000000000000..7f640c3f9a1ec65df976aed56b17ca3fdb7fc3d0 --- /dev/null +++ b/cyclone-web/internals/generators/container/index.jsx.hbs @@ -0,0 +1,64 @@ +/* + * + * {{properCase name }} + * + */ + +import React, {Component, PropTypes} from 'react'; +import { connect } from 'react-redux'; +{{#if wantHeaders}} +import Helmet from 'react-helmet'; +{{/if}} +{{#if wantActionsAndReducer}} +import select{{properCase name}} from './selectors'; +{{/if}} +{{#if wantMessages}} +import { FormattedMessage } from 'react-intl'; +import messages from './messages'; +{{/if}} +{{#if wantLESS}} +import styles from './styles.less'; +{{/if}} + +export class {{ properCase name }} extends React.Component { // eslint-disable-line react/prefer-stateless-function + componentDidMount() { + } + + render() { + return ( + {{#if wantCSS}} + <div className={{curly true}}styles.{{ camelCase name }}{{curly}}> + {{else}} + <div> + {{/if}} + {{#if wantHeaders}} + <Helmet + title="{{properCase name}}" + meta={{curly true}}[ + {{curly true}} name: 'description', content: 'Description of {{properCase name}}' {{curly}}, + ]{{curly}} + /> + {{/if}} + {{#if wantMessages}} + <FormattedMessage {...messages.header} /> + {{/if}} + </div> + ); + } +} + +{{#if wantActionsAndReducer}} +const mapStateToProps = select{{properCase name}}(); +{{/if}} + +function mapDispatchToProps(dispatch) { + return { + dispatch, + }; +} + +{{#if wantActionsAndReducer}} +export default connect(mapStateToProps, mapDispatchToProps)({{ properCase name }}); +{{else}} +export default connect(null, mapDispatchToProps)({{ properCase name }}); +{{/if}} diff --git a/cyclone-web/internals/generators/container/messages.js.hbs b/cyclone-web/internals/generators/container/messages.js.hbs new file mode 100644 index 0000000000000000000000000000000000000000..32dc1aa3dae1615682668353ad7ab30e2344b616 --- /dev/null +++ b/cyclone-web/internals/generators/container/messages.js.hbs @@ -0,0 +1,13 @@ +/* + * {{properCase name }} Messages + * + * This contains all the text for the {{properCase name }} component. + */ +import { defineMessages } from 'react-intl'; + +export default defineMessages({ + header: { + id: 'app.containers.{{properCase name }}.header', + defaultMessage: 'This is {{properCase name}} container !', + }, +}); diff --git a/cyclone-web/internals/generators/container/reducer.js.hbs b/cyclone-web/internals/generators/container/reducer.js.hbs new file mode 100644 index 0000000000000000000000000000000000000000..fcf9371e4ffc16161f40ff76d4b1be020b5617f6 --- /dev/null +++ b/cyclone-web/internals/generators/container/reducer.js.hbs @@ -0,0 +1,23 @@ +/* + * + * {{ properCase name }} reducer + * + */ + +import { fromJS } from 'immutable'; +import { + DEFAULT_ACTION, +} from './constants'; + +const initialState = fromJS({}); + +function {{ camelCase name }}Reducer(state = initialState, action) { + switch (action.type) { + case DEFAULT_ACTION: + return state; + default: + return state; + } +} + +export default {{ camelCase name }}Reducer; diff --git a/cyclone-web/internals/generators/container/reducer.test.js.hbs b/cyclone-web/internals/generators/container/reducer.test.js.hbs new file mode 100644 index 0000000000000000000000000000000000000000..e43fae829ff9366719fcc580af685050199e6264 --- /dev/null +++ b/cyclone-web/internals/generators/container/reducer.test.js.hbs @@ -0,0 +1,9 @@ +import expect from 'expect'; +import {{ camelCase name }}Reducer from '../reducer'; +import { fromJS } from 'immutable'; + +describe('{{ camelCase name }}Reducer', () => { + it('returns the initial state', () => { + expect({{ camelCase name }}Reducer(undefined, {})).toEqual(fromJS({})); + }); +}); diff --git a/cyclone-web/internals/generators/container/sagas.js.hbs b/cyclone-web/internals/generators/container/sagas.js.hbs new file mode 100644 index 0000000000000000000000000000000000000000..4401e77cdf93e11f8017851b1b55dc57fe93c148 --- /dev/null +++ b/cyclone-web/internals/generators/container/sagas.js.hbs @@ -0,0 +1,11 @@ +// import { take, call, put, select } from 'redux-saga/effects'; + +// Individual exports for testing +export function* defaultSaga() { + return; +} + +// All sagas to be loaded +export default [ + defaultSaga, +]; diff --git a/cyclone-web/internals/generators/container/sagas.test.js.hbs b/cyclone-web/internals/generators/container/sagas.test.js.hbs new file mode 100644 index 0000000000000000000000000000000000000000..ec8febea351aa8b7c231d8a8cc1486796ea1fec7 --- /dev/null +++ b/cyclone-web/internals/generators/container/sagas.test.js.hbs @@ -0,0 +1,15 @@ +/** + * Test sagas + */ + +import expect from 'expect'; +// import { take, call, put, select } from 'redux-saga/effects'; +// import { defaultSaga } from '../sagas'; + +// const generator = defaultSaga(); + +describe('defaultSaga Saga', () => { + it('Expect to have unit tests specified', () => { + expect(true).toEqual(false); + }); +}); diff --git a/cyclone-web/internals/generators/container/selectors.js.hbs b/cyclone-web/internals/generators/container/selectors.js.hbs new file mode 100644 index 0000000000000000000000000000000000000000..6bcca8bf996b5dae1d3a794779fc12ec2e91cd67 --- /dev/null +++ b/cyclone-web/internals/generators/container/selectors.js.hbs @@ -0,0 +1,25 @@ +import { createSelector } from 'reselect'; + +/** + * Direct selector to the {{ camelCase name }} state domain + */ +const select{{ properCase name }}Domain = () => (state) => state.get('{{ camelCase name }}'); + +/** + * Other specific selectors + */ + + +/** + * Default selector used by {{ properCase name }} + */ + +const select{{ properCase name }} = () => createSelector( + select{{ properCase name }}Domain(), + (substate) => substate.toJS() +); + +export default select{{ properCase name }}; +export { + select{{ properCase name }}Domain, +}; diff --git a/cyclone-web/internals/generators/container/selectors.test.js.hbs b/cyclone-web/internals/generators/container/selectors.test.js.hbs new file mode 100644 index 0000000000000000000000000000000000000000..f53bf6520e44054fd884d3435250a09ef6c4295f --- /dev/null +++ b/cyclone-web/internals/generators/container/selectors.test.js.hbs @@ -0,0 +1,11 @@ +// import { select{{ properCase name }}Domain } from '../selectors'; +// import { fromJS } from 'immutable'; +import expect from 'expect'; + +// const selector = select{{ properCase name}}Domain(); + +describe('select{{ properCase name }}Domain', () => { + it('Expect to have unit tests specified', () => { + expect('Test case').toEqual(false); + }); +}); diff --git a/cyclone-web/internals/generators/container/styles.less.hbs b/cyclone-web/internals/generators/container/styles.less.hbs new file mode 100644 index 0000000000000000000000000000000000000000..1dc727bb5542528cff751b06bfcf86702a7e390b --- /dev/null +++ b/cyclone-web/internals/generators/container/styles.less.hbs @@ -0,0 +1,3 @@ +.{{ camelCase name }} { /* stylelint-disable */ + +} diff --git a/cyclone-web/internals/generators/container/test.js.hbs b/cyclone-web/internals/generators/container/test.js.hbs new file mode 100644 index 0000000000000000000000000000000000000000..19f00f0e0c14cc49ed67c3a6e9c7349d4a2b4b77 --- /dev/null +++ b/cyclone-web/internals/generators/container/test.js.hbs @@ -0,0 +1,11 @@ +// import {{ properCase name }} from '../index'; + +import expect from 'expect'; +// import { shallow } from 'enzyme'; +// import React from 'react'; + +describe('<{{ properCase name }} />', () => { + it('Expect to have unit tests specified', () => { + expect(true).toEqual(false); + }); +}); diff --git a/cyclone-web/internals/generators/index.js b/cyclone-web/internals/generators/index.js new file mode 100644 index 0000000000000000000000000000000000000000..4bc7392ce4387bd3da0ca28e81a8d053dbbdab24 --- /dev/null +++ b/cyclone-web/internals/generators/index.js @@ -0,0 +1,27 @@ +/** + * generator/index.js + * + * Exports the generators so plop knows them + */ + +const fs = require('fs'); +const componentGenerator = require('./component/index.js'); +const containerGenerator = require('./container/index.js'); +const routeGenerator = require('./route/index.js'); +const languageGenerator = require('./language/index.js'); + +module.exports = (plop) => { + plop.setGenerator('component', componentGenerator); + plop.setGenerator('container', containerGenerator); + plop.setGenerator('route', routeGenerator); + plop.setGenerator('language', languageGenerator); + plop.addHelper('directory', (comp) => { + try { + fs.accessSync(`app/containers/${comp}`, fs.F_OK); + return `containers/${comp}`; + } catch (e) { + return `components/${comp}`; + } + }); + plop.addHelper('curly', (object, open) => (open ? '{' : '}')); +}; diff --git a/cyclone-web/internals/generators/language/add-locale-data.hbs b/cyclone-web/internals/generators/language/add-locale-data.hbs new file mode 100644 index 0000000000000000000000000000000000000000..80727c73cdd7e884f8ab96f5ae91def9fbe3a9e5 --- /dev/null +++ b/cyclone-web/internals/generators/language/add-locale-data.hbs @@ -0,0 +1 @@ +$1addLocaleData({{language}}LocaleData); diff --git a/cyclone-web/internals/generators/language/app-locale.hbs b/cyclone-web/internals/generators/language/app-locale.hbs new file mode 100644 index 0000000000000000000000000000000000000000..9e99e845f87fdae441e04e5b73e5cce4862dc149 --- /dev/null +++ b/cyclone-web/internals/generators/language/app-locale.hbs @@ -0,0 +1,2 @@ +$1 + '{{language}}', diff --git a/cyclone-web/internals/generators/language/format-translation-messages.hbs b/cyclone-web/internals/generators/language/format-translation-messages.hbs new file mode 100644 index 0000000000000000000000000000000000000000..74c78b46322929505f404b430a996f85c7c6ce3f --- /dev/null +++ b/cyclone-web/internals/generators/language/format-translation-messages.hbs @@ -0,0 +1 @@ +$1 {{language}}: formatTranslationMessages({{language}}TranslationMessages), diff --git a/cyclone-web/internals/generators/language/index.js b/cyclone-web/internals/generators/language/index.js new file mode 100644 index 0000000000000000000000000000000000000000..6922062342259ca865acf290c2c3883c43d2ed44 --- /dev/null +++ b/cyclone-web/internals/generators/language/index.js @@ -0,0 +1,80 @@ +/** + * Language Generator + */ +const exec = require('child_process').exec; + +module.exports = { + description: 'Add a language', + prompts: [{ + type: 'input', + name: 'language', + message: 'What is the language you want to add i18n support for (e.g. "fr", "de")?', + default: 'fr', + validate: (value) => { + if ((/.+/).test(value) && value.length === 2) { + return true; + } + + return '2 character language specifier is required'; + }, + }], + + actions: () => { + const actions = []; + actions.push({ + type: 'modify', + path: '../../app/i18n.js', + pattern: /('react-intl\/locale-data\/[a-z]+';\n)(?!.*'react-intl\/locale-data\/[a-z]+';)/g, + templateFile: './language/intl-locale-data.hbs', + }); + actions.push({ + type: 'modify', + path: '../../app/i18n.js', + pattern: /([\n\s'[a-z]+',)(?!.*[\n\s'[a-z]+',)/g, + templateFile: './language/app-locale.hbs', + }); + actions.push({ + type: 'modify', + path: '../../app/i18n.js', + pattern: /(from\s'.\/translations\/[a-z]+.json';\n)(?!.*from\s'.\/translations\/[a-z]+.json';)/g, + templateFile: './language/translation-messages.hbs', + }); + actions.push({ + type: 'modify', + path: '../../app/i18n.js', + pattern: /(addLocaleData\([a-z]+LocaleData\);\n)(?!.*addLocaleData\([a-z]+LocaleData\);)/g, + templateFile: './language/add-locale-data.hbs', + }); + actions.push({ + type: 'modify', + path: '../../app/i18n.js', + pattern: /([a-z]+:\sformatTranslationMessages\([a-z]+TranslationMessages\),\n)(?!.*[a-z]+:\sformatTranslationMessages\([a-z]+TranslationMessages\),)/g, + templateFile: './language/format-translation-messages.hbs', + }); + actions.push({ + type: 'add', + path: '../../app/translations/{{language}}.json', + templateFile: './language/translations-json.hbs', + abortOnFail: true, + }); + actions.push({ + type: 'modify', + path: '../../app/app.js', + pattern: /(System\.import\('intl\/locale-data\/jsonp\/[a-z]+\.js'\),\n)(?!.*System\.import\('intl\/locale-data\/jsonp\/[a-z]+\.js'\),)/g, + templateFile: './language/polyfill-intl-locale.hbs', + }); + actions.push( + () => { + const cmd = 'npm run extract-intl'; + exec(cmd, (err, result, stderr) => { + if (err || stderr) { + throw err || stderr; + } + process.stdout.write(result); + }); + } + ); + + return actions; + }, +}; diff --git a/cyclone-web/internals/generators/language/intl-locale-data.hbs b/cyclone-web/internals/generators/language/intl-locale-data.hbs new file mode 100644 index 0000000000000000000000000000000000000000..b790a1333ff35d00e4140acb75251eccea6fe5e8 --- /dev/null +++ b/cyclone-web/internals/generators/language/intl-locale-data.hbs @@ -0,0 +1 @@ +$1import {{language}}LocaleData from 'react-intl/locale-data/{{language}}'; diff --git a/cyclone-web/internals/generators/language/polyfill-intl-locale.hbs b/cyclone-web/internals/generators/language/polyfill-intl-locale.hbs new file mode 100644 index 0000000000000000000000000000000000000000..ea1586e7ed3e59d7a4d4b2b1da43c17e178a45ef --- /dev/null +++ b/cyclone-web/internals/generators/language/polyfill-intl-locale.hbs @@ -0,0 +1 @@ +$1 System.import('intl/locale-data/jsonp/{{language}}.js'), diff --git a/cyclone-web/internals/generators/language/translation-messages.hbs b/cyclone-web/internals/generators/language/translation-messages.hbs new file mode 100644 index 0000000000000000000000000000000000000000..0682d22ed08dda5ce62086ab0dc254342d9f7f37 --- /dev/null +++ b/cyclone-web/internals/generators/language/translation-messages.hbs @@ -0,0 +1 @@ +$1import {{language}}TranslationMessages from './translations/{{language}}.json'; diff --git a/cyclone-web/internals/generators/language/translations-json.hbs b/cyclone-web/internals/generators/language/translations-json.hbs new file mode 100644 index 0000000000000000000000000000000000000000..fe51488c7066f6687ef680d6bfaa4f7768ef205c --- /dev/null +++ b/cyclone-web/internals/generators/language/translations-json.hbs @@ -0,0 +1 @@ +[] diff --git a/cyclone-web/internals/generators/route/index.js b/cyclone-web/internals/generators/route/index.js new file mode 100644 index 0000000000000000000000000000000000000000..8df9c6c297101e4a50d19be5ff72e66ecb38592f --- /dev/null +++ b/cyclone-web/internals/generators/route/index.js @@ -0,0 +1,80 @@ +/** + * Route Generator + */ +const fs = require('fs'); +const componentExists = require('../utils/componentExists'); + +function reducerExists(comp) { + try { + fs.accessSync(`app/containers/${comp}/reducer.js`, fs.F_OK); + return true; + } catch (e) { + return false; + } +} + +function sagasExists(comp) { + try { + fs.accessSync(`app/containers/${comp}/sagas.js`, fs.F_OK); + return true; + } catch (e) { + return false; + } +} + +function trimTemplateFile(template) { + // Loads the template file and trims the whitespace and then returns the content as a string. + return fs.readFileSync(`internals/generators/route/${template}`, 'utf8').replace(/\s*$/, ''); +} + +module.exports = { + description: 'Add a route', + prompts: [{ + type: 'input', + name: 'component', + message: 'Which component should the route show?', + validate: (value) => { + if ((/.+/).test(value)) { + return componentExists(value) ? true : `"${value}" doesn't exist.`; + } + + return 'The path is required'; + }, + }, { + type: 'input', + name: 'path', + message: 'Enter the path of the route.', + default: '/about', + validate: (value) => { + if ((/.+/).test(value)) { + return true; + } + + return 'path is required'; + }, + }], + + // Add the route to the routes.js file above the error route + // TODO smarter route adding + actions: (data) => { + const actions = []; + if (reducerExists(data.component)) { + data.useSagas = sagasExists(data.component); // eslint-disable-line no-param-reassign + actions.push({ + type: 'modify', + path: '../../app/routes.js', + pattern: /(\s{\n\s{0,}path: '\*',)/g, + template: trimTemplateFile('routeWithReducer.hbs'), + }); + } else { + actions.push({ + type: 'modify', + path: '../../app/routes.js', + pattern: /(\s{\n\s{0,}path: '\*',)/g, + template: trimTemplateFile('route.hbs'), + }); + } + + return actions; + }, +}; diff --git a/cyclone-web/internals/generators/route/route.hbs b/cyclone-web/internals/generators/route/route.hbs new file mode 100644 index 0000000000000000000000000000000000000000..162d992f409f6b99f996951ff7ad30b2999a0157 --- /dev/null +++ b/cyclone-web/internals/generators/route/route.hbs @@ -0,0 +1,9 @@ + { + path: '{{ path }}', + name: '{{ camelCase component }}', + getComponent(location, cb) { + System.import('{{{directory (properCase component)}}}') + .then(loadModule(cb)) + .catch(errorLoading); + }, + },$1 diff --git a/cyclone-web/internals/generators/route/routeWithReducer.hbs b/cyclone-web/internals/generators/route/routeWithReducer.hbs new file mode 100644 index 0000000000000000000000000000000000000000..fedf109ac8506ecf6cdba4cc579c865482987a27 --- /dev/null +++ b/cyclone-web/internals/generators/route/routeWithReducer.hbs @@ -0,0 +1,25 @@ + { + path: '{{ path }}', + name: '{{ camelCase component }}', + getComponent(nextState, cb) { + const importModules = Promise.all([ + System.import('containers/{{ properCase component }}/reducer'), + {{#if useSagas}} + System.import('containers/{{ properCase component }}/sagas'), + {{/if}} + System.import('containers/{{ properCase component }}'), + ]); + + const renderRoute = loadModule(cb); + + importModules.then(([reducer,{{#if useSagas}} sagas,{{/if}} component]) => { + injectReducer('{{ camelCase component }}', reducer.default); + {{#if useSagas}} + injectSagas(sagas.default); + {{/if}} + renderRoute(component); + }); + + importModules.catch(errorLoading); + }, + },$1 diff --git a/cyclone-web/internals/generators/utils/componentExists.js b/cyclone-web/internals/generators/utils/componentExists.js new file mode 100644 index 0000000000000000000000000000000000000000..a5beb09811eb351913fb404bf245e1aa9bb88273 --- /dev/null +++ b/cyclone-web/internals/generators/utils/componentExists.js @@ -0,0 +1,16 @@ +/** + * componentExists + * + * Check whether the given component exist in either the components or containers directory + */ + +const fs = require('fs'); +const pageComponents = fs.readdirSync('app/components'); +const pageContainers = fs.readdirSync('app/containers'); +const components = pageComponents.concat(pageContainers); + +function componentExists(comp) { + return components.indexOf(comp) >= 0; +} + +module.exports = componentExists; diff --git a/cyclone-web/internals/generators/utils/containerList.js b/cyclone-web/internals/generators/utils/containerList.js new file mode 100644 index 0000000000000000000000000000000000000000..64b23f206ff68425abe6e71ddc2d138cdcde4e47 --- /dev/null +++ b/cyclone-web/internals/generators/utils/containerList.js @@ -0,0 +1,15 @@ +const fs = require('fs'); +const pageContainers = fs.readdirSync('app/containers'); + +/** + * 获取Container列表 + * + * @name ContainerList + * @function + * @returns {Array} + */ +function containerList() { + return pageContainers; +} + +module.exports = containerList; diff --git a/cyclone-web/internals/nginx.conf b/cyclone-web/internals/nginx.conf new file mode 100644 index 0000000000000000000000000000000000000000..2dc9c9b6309172acd01f477d5b03f226342cd592 --- /dev/null +++ b/cyclone-web/internals/nginx.conf @@ -0,0 +1,152 @@ + +#user nobody; +worker_processes 1; + +#error_log logs/error.log; +#error_log logs/error.log notice; +#error_log logs/error.log info; + +#pid logs/nginx.pid; + + +events { + worker_connections 1024; +} + + +http { + include mime.types; + default_type application/octet-stream; + + #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + # '$status $body_bytes_sent "$http_referer" ' + # '"$http_user_agent" "$http_x_forwarded_for"'; + + #access_log logs/access.log main; + + sendfile on; + #tcp_nopush on; + + #keepalive_timeout 0; + keepalive_timeout 65; + + #gzip on; + + server { + listen 80; + server_name localhost; + + #charset koi8-r; + + #access_log logs/host.access.log main; + + location / { + + root /Users/yanlv/work/idcos/cloud-mix-web/build ;#config html dir + + if ( $content_type = "application/json" ) { + proxy_pass http://localhost:8080 ; + } + + if ( $uri ~ /login.html ) { + proxy_pass http://localhost:8080 ; + } + + if ( $uri ~ /res ) { + proxy_pass http://localhost:8080 ; + } + + if ( $uri ~ /user ) { + proxy_pass http://localhost:8080 ; + } + + if ( $uri ~ /api ) { + proxy_pass http://localhost:8080 ; + } + + if ( $uri ~ /auth ) { + proxy_pass http://localhost:8080 ; + } + + if ( $uri ~ /report ) { + proxy_pass http://localhost:8080 ; + } + + if ( $uri ~ /static ) { + proxy_pass http://localhost:8080 ; + } + + index index.html index.htm; + client_max_body_size 1000m; + } + + #error_page 404 /404.html; + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root html; + } + + # proxy the PHP scripts to Apache listening on 127.0.0.1:80 + # + #location ~ \.php$ { + # proxy_pass http://127.0.0.1; + #} + + # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + # + #location ~ \.php$ { + # root html; + # fastcgi_pass 127.0.0.1:9000; + # fastcgi_index index.php; + # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; + # include fastcgi_params; + #} + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} + } + + + # another virtual host using mix of IP-, name-, and port-based configuration + # + #server { + # listen 8000; + # listen somename:8080; + # server_name somename alias another.alias; + + # location / { + # root html; + # index index.html index.htm; + # } + #} + + + # HTTPS server + # + #server { + # listen 443 ssl; + # server_name localhost; + + # ssl_certificate cert.pem; + # ssl_certificate_key cert.key; + + # ssl_session_cache shared:SSL:1m; + # ssl_session_timeout 5m; + + # ssl_ciphers HIGH:!aNULL:!MD5; + # ssl_prefer_server_ciphers on; + + # location / { + # root html; + # index index.html index.htm; + # } + #} + include servers/*; +} diff --git a/cyclone-web/internals/scripts/analyze.js b/cyclone-web/internals/scripts/analyze.js new file mode 100644 index 0000000000000000000000000000000000000000..4e2db7cfd582c39ea9d89bed9ab21d369e15f9fb --- /dev/null +++ b/cyclone-web/internals/scripts/analyze.js @@ -0,0 +1,23 @@ +#!/usr/bin/env node + +var shelljs = require('shelljs'); +var animateProgress = require('./helpers/progress'); +var chalk = require('chalk'); +var addCheckMark = require('./helpers/checkmark'); + +var progress = animateProgress('Generating stats'); + +// Generate stats.json file with webpack +shelljs.exec( + 'webpack --config internals/webpack/webpack.dev.babel.js --profile --json > stats.json', + addCheckMark.bind(null, callback) // Output a checkmark on completion +); + +// Called after webpack has finished generating the stats.json file +function callback() { + clearInterval(progress); + process.stdout.write( + '\n\nOpen ' + chalk.magenta('http://webpack.github.io/analyse/') + ' in your browser and upload the stats.json file!' + + chalk.blue('\n(Tip: ' + chalk.italic('CMD + double-click') + ' the link!)\n\n') + ); +} diff --git a/cyclone-web/internals/scripts/clean.js b/cyclone-web/internals/scripts/clean.js new file mode 100644 index 0000000000000000000000000000000000000000..86fbddbf927efc1a398e55962abcd2199c95c71e --- /dev/null +++ b/cyclone-web/internals/scripts/clean.js @@ -0,0 +1,96 @@ +require('shelljs/global'); + +/** + * Adds mark check symbol + */ +function addCheckMark(callback) { + process.stdout.write(' ✓'); + callback(); +} + +if (!which('git')) { + echo('Sorry, this script requires git'); + exit(1); +} + +if (!test('-e', 'internals/templates')) { + echo('The example is deleted already.'); + exit(1); +} + +process.stdout.write('Cleanup started...'); + +// Cleanup components folder +rm('-rf', 'app/components/*'); + +// Cleanup containers folder +rm('-rf', 'app/containers/*'); +mkdir('-p', 'app/containers/App'); +mkdir('-p', 'app/containers/NotFoundPage'); +mkdir('-p', 'app/containers/HomePage'); +cp('internals/templates/appContainer.js', 'app/containers/App/index.js'); +cp('internals/templates/notFoundPage/notFoundPage.js', 'app/containers/NotFoundPage/index.js'); +cp('internals/templates/notFoundPage/messages.js', 'app/containers/NotFoundPage/messages.js'); +cp('internals/templates/homePage/homePage.js', 'app/containers/HomePage/index.js'); +cp('internals/templates/homePage/messages.js', 'app/containers/HomePage/messages.js'); + +// Handle Translations +mkdir('-p', 'app/translations'); +cp('internals/templates/translations/en.json', + 'app/translations/en.json'); + +// move i18n file +cp('internals/templates/i18n.js', + 'app/i18n.js'); + +// Copy LanguageProvider +mkdir('-p', 'app/containers/LanguageProvider'); +mkdir('-p', 'app/containers/LanguageProvider/tests'); +cp('internals/templates/languageProvider/actions.js', + 'app/containers/LanguageProvider/actions.js'); +cp('internals/templates/languageProvider/constants.js', + 'app/containers/LanguageProvider/constants.js'); +cp('internals/templates/languageProvider/languageProvider.js', + 'app/containers/LanguageProvider/index.js'); +cp('internals/templates/languageProvider/index.js', + 'app/containers/LanguageProvider/index.js'); +cp('internals/templates/languageProvider/selectors.js', + 'app/containers/LanguageProvider/selectors.js'); +cp('internals/templates/styles.css', 'app/containers/App/styles.css'); + +// Copy selectors +mkdir('app/containers/App/tests'); +cp('internals/templates/selectors.js', + 'app/containers/App/selectors.js'); +cp('internals/templates/selectors.test.js', + 'app/containers/App/tests/selectors.test.js'); + +// Utils +rm('-rf', 'app/utils'); +mkdir('app/utils'); +mkdir('app/utils/tests'); +cp('internals/templates/asyncInjectors.js', + 'app/utils/asyncInjectors.js'); +cp('internals/templates/asyncInjectors.test.js', + 'app/utils/tests/asyncInjectors.test.js'); + +// Replace the files in the root app/ folder +cp('internals/templates/app.js', 'app/app.js'); +cp('internals/templates/index.html', 'app/index.html'); +cp('internals/templates/reducers.js', 'app/reducers.js'); +cp('internals/templates/routes.js', 'app/routes.js'); +cp('internals/templates/store.js', 'app/store.js'); +cp('internals/templates/store.test.js', 'app/tests/store.test.js'); + +// Remove the templates folder +rm('-rf', 'internals/templates'); + +process.stdout.write(' ✓'); + +// Commit the changes +if (exec('git add . --all && git commit -qm "Remove default example"').code !== 0) { + echo('\nError: Git commit failed'); + exit(1); +} + +echo('\nCleanup done. Happy Coding!!!'); diff --git a/cyclone-web/internals/scripts/dependencies.js b/cyclone-web/internals/scripts/dependencies.js new file mode 100644 index 0000000000000000000000000000000000000000..21d1dab63c679ac572628addfbac6954e8f9ee96 --- /dev/null +++ b/cyclone-web/internals/scripts/dependencies.js @@ -0,0 +1,49 @@ +/*eslint-disable*/ + +// No need to build the DLL in production +if (process.env.NODE_ENV === 'production') { + process.exit(0) +} + +require('shelljs/global') + +const path = require('path') +const fs = require('fs') +const exists = fs.existsSync +const writeFile = fs.writeFileSync + +const defaults = require('lodash/defaultsDeep') +const pkg = require(path.join(process.cwd(), 'package.json')) +const config = require('../config') +const dllConfig = defaults(pkg.dllPlugin, config.dllPlugin.defaults) +const outputPath = path.join(process.cwd(), dllConfig.path) +const dllManifestPath = path.join(outputPath, 'package.json') + +/** + * I use node_modules/react-boilerplate-dlls by default just because + * it isn't going to be version controlled and babel wont try to parse it. + */ +mkdir('-p', outputPath) + +echo('Building the Webpack DLL...') + +/** + * Create a manifest so npm install doesn't warn us + */ +if (!exists(dllManifestPath)) { + writeFile( + dllManifestPath, + JSON.stringify(defaults({ + name: 'react-boilerplate-dlls', + private: true, + author: pkg.author, + repository: pkg.repository, + version: pkg.version + }), null, 2), + + 'utf8' + ) +} + +// the BUILDING_DLL env var is set to avoid confusing the development environment +exec('cross-env BUILDING_DLL=true webpack --display-chunks --color --config internals/webpack/webpack.dll.babel.js') diff --git a/cyclone-web/internals/scripts/extract-intl.js b/cyclone-web/internals/scripts/extract-intl.js new file mode 100644 index 0000000000000000000000000000000000000000..901aac3a642d7bb1299077369a8b3f33f584695e --- /dev/null +++ b/cyclone-web/internals/scripts/extract-intl.js @@ -0,0 +1,153 @@ +/* eslint-disable */ +/** + * This script will extract the internationalization messages from all components + and package them in the translation json files in the translations file. + */ +const fs = require('fs'); +const nodeGlob = require('glob'); +const transform = require('babel-core').transform; + +const animateProgress = require('./helpers/progress'); +const addCheckmark = require('./helpers/checkmark'); + +const pkg = require('../../package.json'); +const i18n = require('../../app/i18n'); + +require('shelljs/global'); + +// Glob to match all js files except test files +const FILES_TO_PARSE = 'app/**/!(*.test).js'; +const locales = i18n.appLocales; + +const newLine = () => process.stdout.write('\n'); + +// Progress Logger +let progress; +const task = (message) => { + progress = animateProgress(message); + process.stdout.write(message); + + return (error) => { + if (error) { + process.stderr.write(error); + } + clearTimeout(progress); + return addCheckmark(() => newLine()); + } +} + +// Wrap async functions below into a promise +const glob = (pattern) => new Promise((resolve, reject) => { + nodeGlob(pattern, (error, value) => (error ? reject(error) : resolve(value))); +}); + +const readFile = (fileName) => new Promise((resolve, reject) => { + fs.readFile(fileName, (error, value) => (error ? reject(error) : resolve(value))); +}); + +const writeFile = (fileName, data) => new Promise((resolve, reject) => { + fs.writeFile(fileName, data, (error, value) => (error ? reject(error) : resolve(value))); +}); + +// Store existing translations into memory +const oldLocaleMappings = []; +const localeMappings = []; +// Loop to run once per locale +for (const locale of locales) { + oldLocaleMappings[locale] = {}; + localeMappings[locale] = {}; + // File to store translation messages into + const translationFileName = `app/translations/${locale}.json`; + try { + // Parse the old translation message JSON files + const messages = JSON.parse(fs.readFileSync(translationFileName)); + for (const message of messages) { + oldLocaleMappings[locale][message.id] = message; + } + } catch (error) { + if (error.code !== 'ENOENT') { + process.stderr.write( + `There was an error loading this translation file: ${translationFileName} + \n${error}` + ); + } + } +} + +const extractFromFile = async (fileName) => { + try { + const code = await readFile(fileName); + // Use babel plugin to extract instances where react-intl is used + const { metadata: result } = await transform(code, { + presets: pkg.babel.presets, + plugins: [ + ['react-intl'], + ], + }); + for (const message of result['react-intl'].messages) { + for (const locale of locales) { + const oldLocaleMapping = oldLocaleMappings[locale][message.id]; + // Merge old translations into the babel extracted instances where react-intl is used + localeMappings[locale][message.id] = { + id: message.id, + description: message.description, + defaultMessage: message.defaultMessage, + message: (oldLocaleMapping && oldLocaleMapping.message) + ? oldLocaleMapping.message + : '', + }; + } + } + } catch (error) { + process.stderr.write(`Error transforming file: ${fileName}\n${error}`); + } +}; + +(async function main() { + const memoryTaskDone = task('Storing language files in memory'); + const files = await glob(FILES_TO_PARSE); + memoryTaskDone() + + const extractTaskDone = task('Run extraction on all files'); + // Run extraction on all files that match the glob on line 16 + await Promise.all(files.map((fileName) => extractFromFile(fileName))); + extractTaskDone() + + // Make the directory if it doesn't exist, especially for first run + mkdir('-p', 'app/translations'); + for (const locale of locales) { + const translationFileName = `app/translations/${locale}.json`; + + try { + const localeTaskDone = task( + `Writing translation messages for ${locale} to: ${translationFileName}` + ); + + // Sort the translation JSON file so that git diffing is easier + // Otherwise the translation messages will jump around every time we extract + let messages = Object.values(localeMappings[locale]).sort((a, b) => { + a = a.id.toUpperCase(); + b = b.id.toUpperCase(); + return do { + if (a < b) -1; + else if (a > b) 1; + else 0; + }; + }); + + // Write to file the JSON representation of the translation messages + const prettified = `${JSON.stringify(messages, null, 2)}\n`; + + await writeFile(translationFileName, prettified); + + localeTaskDone(); + } catch (error) { + localeTaskDone( + `There was an error saving this translation file: ${translationFileName} + \n${error}` + ); + } + } + + process.exit() +}()); diff --git a/cyclone-web/internals/scripts/helpers/checkmark.js b/cyclone-web/internals/scripts/helpers/checkmark.js new file mode 100644 index 0000000000000000000000000000000000000000..865fb906a06eab303d8f27608c2f391b06feb256 --- /dev/null +++ b/cyclone-web/internals/scripts/helpers/checkmark.js @@ -0,0 +1,11 @@ +var chalk = require('chalk'); + +/** + * Adds mark check symbol + */ +function addCheckMark(callback) { + process.stdout.write(chalk.green(' ✓')); + callback(); +} + +module.exports = addCheckMark; diff --git a/cyclone-web/internals/scripts/helpers/progress.js b/cyclone-web/internals/scripts/helpers/progress.js new file mode 100644 index 0000000000000000000000000000000000000000..f647072490bdcf0e64a6be6df42c086e9cf72c90 --- /dev/null +++ b/cyclone-web/internals/scripts/helpers/progress.js @@ -0,0 +1,23 @@ +var readline = require('readline'); + +/** + * Adds an animated progress indicator + * + * @param {string} message The message to write next to the indicator + * @param {number} amountOfDots The amount of dots you want to animate + */ +function animateProgress(message, amountOfDots) { + if (typeof amountOfDots !== 'number') { + amountOfDots = 3; + } + + var i = 0; + return setInterval(function () { + readline.cursorTo(process.stdout, 0); + i = (i + 1) % (amountOfDots + 1); + var dots = new Array(i + 1).join('.'); + process.stdout.write(message + dots); + }, 500); +} + +module.exports = animateProgress; diff --git a/cyclone-web/internals/scripts/npmcheckversion.js b/cyclone-web/internals/scripts/npmcheckversion.js new file mode 100644 index 0000000000000000000000000000000000000000..24baa42613c5ed602bf3480d12bc5ba71cc0690c --- /dev/null +++ b/cyclone-web/internals/scripts/npmcheckversion.js @@ -0,0 +1,9 @@ +/* eslint-disable */ +var exec = require('child_process').exec; +exec('npm -v', function (err, stdout, stderr) { + if (err) throw err; + if (parseFloat(stdout) < 3) { + throw new Error('[ERROR: React Boilerplate] You need npm version @>=3'); + process.exit(1); + } +}); diff --git a/cyclone-web/internals/scripts/pagespeed.js b/cyclone-web/internals/scripts/pagespeed.js new file mode 100644 index 0000000000000000000000000000000000000000..29e8263d8120c804e0c4ac46f599c80b17ce9409 --- /dev/null +++ b/cyclone-web/internals/scripts/pagespeed.js @@ -0,0 +1,35 @@ +#!/usr/bin/env node + +process.stdin.resume(); +process.stdin.setEncoding("utf8"); + +var ngrok = require("ngrok"); +var psi = require("psi"); +var chalk = require("chalk"); + +log("\nStarting ngrok tunnel"); + +startTunnel(runPsi); + +function runPsi(url) { + log("\nStarting PageSpeed Insights"); + psi.output(url).then(function(err) { + process.exit(0); + }); +} + +function startTunnel(cb) { + ngrok.connect(3000, function(err, url) { + if (err) { + log(chalk.red("\nERROR\n" + err)); + process.exit(0); + } + + log("\nServing tunnel from: " + chalk.magenta(url)); + cb(url); + }); +} + +function log(string) { + process.stdout.write(string); +} diff --git a/cyclone-web/internals/scripts/proxy.js b/cyclone-web/internals/scripts/proxy.js new file mode 100644 index 0000000000000000000000000000000000000000..bfc5dc6fcbea227e1ca68b0d84359c16fba2153f --- /dev/null +++ b/cyclone-web/internals/scripts/proxy.js @@ -0,0 +1,39 @@ +import fs from 'fs'; + +process.stdout.write('generate proxy.config'); + +// 文件是否存在 +// 写入文件 + +const writeFile = (fileName, data) => new Promise((resolve, reject) => { + fs.writeFile(fileName, data, (error, value) => (error ? reject(error) : resolve(value))); +}); + +(async function main() { + var proxyConfigFile = 'proxy.json'; + if (fs.existsSync(proxyConfigFile)) { + console.log('文件已经存在'); + return; + } + + var data = { + "default": { + "_api": "http://127.0.0.1:8080", + "api": "http://127.0.0.1:8080", + "endpoints": [ + "/res/*", + "/api/*", + "/user/*", + "/auth", + "/auth/*", + "/login.html", + "/static/*", + "/report/*" + ] + } + }; + + await writeFile(proxyConfigFile, `${JSON.stringify(data, null, 2)}\n`); + + console.log('创建proxy.json成功'); +}()); diff --git a/cyclone-web/internals/scripts/setup.js b/cyclone-web/internals/scripts/setup.js new file mode 100644 index 0000000000000000000000000000000000000000..77f5239343f4c24d0e33043b29285639a2b5c35f --- /dev/null +++ b/cyclone-web/internals/scripts/setup.js @@ -0,0 +1,73 @@ +#!/usr/bin/env node + +var shell = require('shelljs'); +var exec = require('child_process').exec; +var path = require('path'); +var fs = require('fs'); +var animateProgress = require('./helpers/progress'); +var addCheckMark = require('./helpers/checkmark'); +var readline = require('readline'); + +process.stdin.resume(); +process.stdin.setEncoding('utf8'); + +process.stdout.write('\n'); +var interval = animateProgress('Cleaning old repository'); +process.stdout.write('Cleaning old repository'); + +cleanRepo(function () { + clearInterval(interval); + process.stdout.write('\nInstalling dependencies... (This might take a while)'); + setTimeout(function () { + readline.cursorTo(process.stdout, 0); + interval = animateProgress('Installing dependencies'); + }, 500); + + process.stdout.write('Installing dependencies'); + installDeps(function (error) { + clearInterval(interval); + if (error) { + process.stdout.write(error); + } + + deleteFileInCurrentDir('setup.js', function () { + process.stdout.write('\n'); + interval = animateProgress('Initialising new repository'); + process.stdout.write('Initialising new repository'); + initGit(function () { + clearInterval(interval); + process.stdout.write('\nDone!'); + process.exit(0); + }); + }); + }); +}); + +/** + * Deletes the .git folder in dir + */ +function cleanRepo(callback) { + shell.rm('-rf', '.git/'); + addCheckMark(callback); +} + +/** + * Initializes git again + */ +function initGit(callback) { + exec('git init && git add . && git commit -m "Initial commit"', addCheckMark.bind(null, callback)); +} + +/** + * Deletes a file in the current directory + */ +function deleteFileInCurrentDir(file, callback) { + fs.unlink(path.join(__dirname, file), callback); +} + +/** + * Installs dependencies + */ +function installDeps(callback) { + exec('npm install', addCheckMark.bind(null, callback)); +} diff --git a/cyclone-web/internals/templates/app.js b/cyclone-web/internals/templates/app.js new file mode 100644 index 0000000000000000000000000000000000000000..74c2f0fdecc0a08f119850711c800e999f9c1ee0 --- /dev/null +++ b/cyclone-web/internals/templates/app.js @@ -0,0 +1,104 @@ +/** + * app.js + * + * This is the entry file for the application, only setup and boilerplate + * code. + */ +import 'babel-polyfill'; + +/* eslint-disable import/no-unresolved */ +// Load the manifest.json file and the .htaccess file +import '!file?name=[name].[ext]!./manifest.json'; +import 'file?name=[name].[ext]!./.htaccess'; +/* eslint-enable import/no-unresolved */ + +// Import all the third party stuff +import React from 'react'; +import ReactDOM from 'react-dom'; +import { Provider } from 'react-redux'; +import { applyRouterMiddleware, Router, browserHistory } from 'react-router'; +import { syncHistoryWithStore } from 'react-router-redux'; +import { useScroll } from 'react-router-scroll'; +import LanguageProvider from 'containers/LanguageProvider'; +import configureStore from './store'; + +// Import i18n messages +import { translationMessages } from './i18n'; + +// Import the CSS reset, which HtmlWebpackPlugin transfers to the build folder +import 'sanitize.css/sanitize.css'; + +// Create redux store with history +// this uses the singleton browserHistory provided by react-router +// Optionally, this could be changed to leverage a created history +// e.g. `const browserHistory = useRouterHistory(createBrowserHistory)();` +const initialState = {}; +const store = configureStore(initialState, browserHistory); + +// Sync history and store, as the react-router-redux reducer +// is under the non-default key ("routing"), selectLocationState +// must be provided for resolving how to retrieve the "route" in the state +import { selectLocationState } from 'containers/App/selectors'; +const history = syncHistoryWithStore(browserHistory, store, { + selectLocationState: selectLocationState(), +}); + +// Set up the router, wrapping all Routes in the App component +import App from 'containers/App'; +import createRoutes from './routes'; +const rootRoute = { + component: App, + childRoutes: createRoutes(store), +}; + + +const render = (translatedMessages) => { + ReactDOM.render( + <Provider store={store}> + <LanguageProvider messages={translatedMessages}> + <Router + history={history} + routes={rootRoute} + render={ + // Scroll to top when going to a new page, imitating default browser + // behaviour + applyRouterMiddleware(useScroll()) + } + /> + </LanguageProvider> + </Provider>, + document.getElementById('app') + ); +}; + + +// Hot reloadable translation json files +if (module.hot) { + // modules.hot.accept does not accept dynamic dependencies, + // have to be constants at compile-time + module.hot.accept('./i18n', () => { + render(translationMessages); + }); +} + +// Chunked polyfill for browsers without Intl support +if (!window.Intl) { + (new Promise((resolve) => { + resolve(System.import('intl')); + })) + .then(() => Promise.all([ + System.import('intl/locale-data/jsonp/de.js'), + ])) + .then(() => render(translationMessages)) + .catch((err) => { + throw err; + }); +} else { + render(translationMessages); +} + +// Install ServiceWorker and AppCache in the end since +// it's not most important operation and if main code fails, +// we do not want it installed +import { install } from 'offline-plugin/runtime'; +install(); diff --git a/cyclone-web/internals/templates/appContainer.js b/cyclone-web/internals/templates/appContainer.js new file mode 100644 index 0000000000000000000000000000000000000000..d82f7e5b3c7832fd286a69cb5d1137ebbbfcc0fe --- /dev/null +++ b/cyclone-web/internals/templates/appContainer.js @@ -0,0 +1,32 @@ +/** + * + * App.react.js + * + * This component is the skeleton around the actual pages, and should only + * contain code that should be seen on all pages. (e.g. navigation bar) + * + * NOTE: while this component should technically be a stateless functional + * component (SFC), hot reloading does not currently support SFCs. If hot + * reloading is not a necessity for you then you can refactor it and remove + * the linting exception. + */ + +import React from 'react'; +import PropTypes from 'prop-types'; +import styles from './styles.css'; + +export default class App extends React.Component { + // eslint-disable-line react/prefer-stateless-function + + static propTypes = { + children: PropTypes.node + }; + + render() { + return ( + <div className={styles.container}> + {React.Children.toArray(this.props.children)} + </div> + ); + } +} diff --git a/cyclone-web/internals/templates/asyncInjectors.js b/cyclone-web/internals/templates/asyncInjectors.js new file mode 100644 index 0000000000000000000000000000000000000000..ca2fe2f8ce6485ef6c0c00c3622705c3f7ac27b2 --- /dev/null +++ b/cyclone-web/internals/templates/asyncInjectors.js @@ -0,0 +1,74 @@ +import { conformsTo, isEmpty, isFunction, isObject, isString } from 'lodash'; +import invariant from 'invariant'; +import warning from 'warning'; +import createReducer from 'reducers'; + +/** + * Validate the shape of redux store + */ +export function checkStore(store) { + const shape = { + dispatch: isFunction, + subscribe: isFunction, + getState: isFunction, + replaceReducer: isFunction, + runSaga: isFunction, + asyncReducers: isObject, + }; + invariant( + conformsTo(store, shape), + '(app/utils...) asyncInjectors: Expected a valid redux store' + ); +} + +/** + * Inject an asynchronously loaded reducer + */ +export function injectAsyncReducer(store, isValid) { + return function injectReducer(name, asyncReducer) { + if (!isValid) checkStore(store); + + invariant( + isString(name) && !isEmpty(name) && isFunction(asyncReducer), + '(app/utils...) injectAsyncReducer: Expected `asyncReducer` to be a reducer function' + ); + + if (Reflect.has(store.asyncReducers, name)) return; + + store.asyncReducers[name] = asyncReducer; // eslint-disable-line no-param-reassign + store.replaceReducer(createReducer(store.asyncReducers)); + }; +} + +/** + * Inject an asynchronously loaded saga + */ +export function injectAsyncSagas(store, isValid) { + return function injectSagas(sagas) { + if (!isValid) checkStore(store); + + invariant( + Array.isArray(sagas), + '(app/utils...) injectAsyncSagas: Expected `sagas` to be an array of generator functions' + ); + + warning( + !isEmpty(sagas), + '(app/utils...) injectAsyncSagas: Received an empty `sagas` array' + ); + + sagas.map(store.runSaga); + }; +} + +/** + * Helper for creating injectors + */ +export function getAsyncInjectors(store) { + checkStore(store); + + return { + injectReducer: injectAsyncReducer(store, true), + injectSagas: injectAsyncSagas(store, true), + }; +} diff --git a/cyclone-web/internals/templates/asyncInjectors.test.js b/cyclone-web/internals/templates/asyncInjectors.test.js new file mode 100644 index 0000000000000000000000000000000000000000..bbb83c43dcb3c943a98b6a748f43dfb1d2a479cc --- /dev/null +++ b/cyclone-web/internals/templates/asyncInjectors.test.js @@ -0,0 +1,164 @@ +/** + * Test async injectors + */ + +import expect from 'expect'; +import configureStore from 'store.js'; +import { memoryHistory } from 'react-router'; +import { put } from 'redux-saga/effects'; +import { fromJS } from 'immutable'; + +import { + injectAsyncReducer, + injectAsyncSagas, + getAsyncInjectors, +} from 'utils/asyncInjectors'; + +// Fixtures + +const initialState = fromJS({ reduced: 'soon' }); + +const reducer = (state = initialState, action) => { + switch (action.type) { + case 'TEST': + return state.set('reduced', action.payload); + default: + return state; + } +}; + +function* testSaga() { + yield put({ type: 'TEST', payload: 'yup' }); +} + +const sagas = [ + testSaga, +]; + +describe('asyncInjectors', () => { + let store; + + describe('getAsyncInjectors', () => { + before(() => { + store = configureStore({}, memoryHistory); + }); + + it('given a store, should return all async injectors', () => { + const { injectReducer, injectSagas } = getAsyncInjectors(store); + + injectReducer('test', reducer); + injectSagas(sagas); + + const actual = store.getState().get('test'); + const expected = initialState.merge({ reduced: 'yup' }); + + expect(actual.toJS()).toEqual(expected.toJS()); + }); + + it('should throw if passed invalid store shape', () => { + let result = false; + + Reflect.deleteProperty(store, 'dispatch'); + + try { + getAsyncInjectors(store); + } catch (err) { + result = err.name === 'Invariant Violation'; + } + + expect(result).toEqual(true); + }); + }); + + describe('helpers', () => { + before(() => { + store = configureStore({}, memoryHistory); + }); + + describe('injectAsyncReducer', () => { + it('given a store, it should provide a function to inject a reducer', () => { + const injectReducer = injectAsyncReducer(store); + + injectReducer('test', reducer); + + const actual = store.getState().get('test'); + const expected = initialState; + + expect(actual.toJS()).toEqual(expected.toJS()); + }); + + it('should throw if passed invalid name', () => { + let result = false; + + const injectReducer = injectAsyncReducer(store); + + try { + injectReducer('', reducer); + } catch (err) { + result = err.name === 'Invariant Violation'; + } + + try { + injectReducer(999, reducer); + } catch (err) { + result = err.name === 'Invariant Violation'; + } + + expect(result).toEqual(true); + }); + + it('should throw if passed invalid reducer', () => { + let result = false; + + const injectReducer = injectAsyncReducer(store); + + try { + injectReducer('bad', 'nope'); + } catch (err) { + result = err.name === 'Invariant Violation'; + } + + try { + injectReducer('coolio', 12345); + } catch (err) { + result = err.name === 'Invariant Violation'; + } + + expect(result).toEqual(true); + }); + }); + + describe('injectAsyncSagas', () => { + it('given a store, it should provide a function to inject a saga', () => { + const injectSagas = injectAsyncSagas(store); + + injectSagas(sagas); + + const actual = store.getState().get('test'); + const expected = initialState.merge({ reduced: 'yup' }); + + expect(actual.toJS()).toEqual(expected.toJS()); + }); + + it('should throw if passed invalid saga', () => { + let result = false; + + const injectSagas = injectAsyncSagas(store); + + try { + injectSagas({ testSaga }); + } catch (err) { + result = err.name === 'Invariant Violation'; + } + + try { + injectSagas(testSaga); + } catch (err) { + result = err.name === 'Invariant Violation'; + } + + expect(result).toEqual(true); + }); + }); + }); +}); diff --git a/cyclone-web/internals/templates/homePage/homePage.js b/cyclone-web/internals/templates/homePage/homePage.js new file mode 100644 index 0000000000000000000000000000000000000000..4c330327ec5751cde20bc552d0ec5fb1ae91383b --- /dev/null +++ b/cyclone-web/internals/templates/homePage/homePage.js @@ -0,0 +1,25 @@ +/* + * HomePage + * + * This is the first thing users see of our App, at the '/' route + * + * NOTE: while this component should technically be a stateless functional + * component (SFC), hot reloading does not currently support SFCs. If hot + * reloading is not a necessity for you then you can refactor it and remove + * the linting exception. + */ + +import React from 'react'; +import { FormattedMessage } from 'react-intl'; +import messages from './messages'; + +export default class HomePage extends React.Component { // eslint-disable-line react/prefer-stateless-function + + render() { + return ( + <h1> + <FormattedMessage {...messages.header} /> + </h1> + ); + } +} diff --git a/cyclone-web/internals/templates/homePage/messages.js b/cyclone-web/internals/templates/homePage/messages.js new file mode 100644 index 0000000000000000000000000000000000000000..7c86832845ca0a553e580188c3b4cfa9ea2f415b --- /dev/null +++ b/cyclone-web/internals/templates/homePage/messages.js @@ -0,0 +1,13 @@ +/* + * HomePage Messages + * + * This contains all the text for the HomePage component. + */ +import { defineMessages } from 'react-intl'; + +export default defineMessages({ + header: { + id: 'app.components.HomePage.header', + defaultMessage: 'This is HomePage components !', + }, +}); diff --git a/cyclone-web/internals/templates/i18n.js b/cyclone-web/internals/templates/i18n.js new file mode 100644 index 0000000000000000000000000000000000000000..561e80ac26e2b356f498f69bc94485bb3a24c39d --- /dev/null +++ b/cyclone-web/internals/templates/i18n.js @@ -0,0 +1,30 @@ +/** + * i18n.js + * + * This will setup the i18n language files and locale data for your app. + * + */ +import { addLocaleData } from 'react-intl'; + +import enLocaleData from 'react-intl/locale-data/en'; + +export const appLocales = [ + 'en', +]; + +import enTranslationMessages from './translations/en.json'; + +addLocaleData(enLocaleData); + +const formatTranslationMessages = (messages) => { + const formattedMessages = {}; + for (const message of messages) { + formattedMessages[message.id] = message.message || message.defaultMessage; + } + + return formattedMessages; +}; + +export const translationMessages = { + en: formatTranslationMessages(enTranslationMessages), +}; diff --git a/cyclone-web/internals/templates/index.html b/cyclone-web/internals/templates/index.html new file mode 100644 index 0000000000000000000000000000000000000000..47601e1f24932678977d9076f41ebdf438e2b2ad --- /dev/null +++ b/cyclone-web/internals/templates/index.html @@ -0,0 +1,18 @@ +<!doctype html> +<html lang="en"> +<head> + <!-- The first thing in any HTML file should be the charset --> + <meta charset="utf-8"> + <!-- Make the page mobile compatible --> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <!-- Allow installing the app to the homescreen --> + <link rel="manifest" href="manifest.json"> + <meta name="mobile-web-app-capable" content="yes"> + <title>React.js Boilerplate</title> +</head> +<body> +<!-- The app hooks into this div --> +<div id="app"></div> +<!-- A lot of magic happens in this file. HtmlWebpackPlugin automatically includes all assets (e.g. bundle.js, main.css) with the correct HTML tags, which is why they are missing in this HTML file. Don't add any assets here! (Check out webpackconfig.js if you want to know more) --> +</body> +</html> diff --git a/cyclone-web/internals/templates/languageProvider/actions.js b/cyclone-web/internals/templates/languageProvider/actions.js new file mode 100644 index 0000000000000000000000000000000000000000..779eed0a126a34541ef94417ad10010f346605a4 --- /dev/null +++ b/cyclone-web/internals/templates/languageProvider/actions.js @@ -0,0 +1,16 @@ +/* + * + * LanguageProvider actions + * + */ + +import { + CHANGE_LOCALE, +} from './constants'; + +export function changeLocale(languageLocale) { + return { + type: CHANGE_LOCALE, + locale: languageLocale, + }; +} diff --git a/cyclone-web/internals/templates/languageProvider/constants.js b/cyclone-web/internals/templates/languageProvider/constants.js new file mode 100644 index 0000000000000000000000000000000000000000..7d2f42564e5045e0c715110f9b8ccd47abf1b983 --- /dev/null +++ b/cyclone-web/internals/templates/languageProvider/constants.js @@ -0,0 +1,7 @@ +/* + * + * LanguageProvider constants + * + */ + +export const CHANGE_LOCALE = 'app/LanguageToggle/CHANGE_LOCALE'; diff --git a/cyclone-web/internals/templates/languageProvider/languageProvider.js b/cyclone-web/internals/templates/languageProvider/languageProvider.js new file mode 100644 index 0000000000000000000000000000000000000000..5ed8b305f7825ab72f69db1d98f5ffb0e0416921 --- /dev/null +++ b/cyclone-web/internals/templates/languageProvider/languageProvider.js @@ -0,0 +1,47 @@ +/* + * + * LanguageProvider + * + * this component connects the redux state language locale to the + * IntlProvider component and i18n messages (loaded from `app/translations`) + */ + +import React from 'react'; +import { connect } from 'react-redux'; +import { createSelector } from 'reselect'; +import { IntlProvider } from 'react-intl'; +import { selectLocale } from './selectors'; +import PropTypes from 'prop-types'; + +export class LanguageProvider extends React.Component { + // eslint-disable-line react/prefer-stateless-function + render() { + return ( + <IntlProvider + locale={this.props.locale} + messages={this.props.messages[this.props.locale]} + > + {React.Children.only(this.props.children)} + </IntlProvider> + ); + } +} + +LanguageProvider.propTypes = { + locale: PropTypes.string, + messages: PropTypes.object, + children: PropTypes.element.isRequired +}; + +const mapStateToProps = createSelector(selectLocale(), locale => ({ locale })); + +function mapDispatchToProps(dispatch) { + return { + dispatch + }; +} + +export default connect( + mapStateToProps, + mapDispatchToProps +)(LanguageProvider); diff --git a/cyclone-web/internals/templates/languageProvider/reducer.js b/cyclone-web/internals/templates/languageProvider/reducer.js new file mode 100644 index 0000000000000000000000000000000000000000..2908bcc26cd627b0a01c74c5ea57c850f3c9bd86 --- /dev/null +++ b/cyclone-web/internals/templates/languageProvider/reducer.js @@ -0,0 +1,26 @@ +/* + * + * LanguageProvider reducer + * + */ + +import { fromJS } from 'immutable'; +import { + CHANGE_LOCALE, +} from './constants'; + +const initialState = fromJS({ + locale: 'en', +}); + +function languageProviderReducer(state = initialState, action) { + switch (action.type) { + case CHANGE_LOCALE: + return state + .set('locale', action.locale); + default: + return state; + } +} + +export default languageProviderReducer; diff --git a/cyclone-web/internals/templates/languageProvider/selectors.js b/cyclone-web/internals/templates/languageProvider/selectors.js new file mode 100644 index 0000000000000000000000000000000000000000..c43816f5ff0d65bfd662f09ad7ac14ff45b26cb9 --- /dev/null +++ b/cyclone-web/internals/templates/languageProvider/selectors.js @@ -0,0 +1,20 @@ +import { createSelector } from 'reselect'; + +/** + * Direct selector to the languageToggle state domain + */ +const selectLanguage = () => (state) => state.get('language'); + +/** + * Select the language locale + */ + +const selectLocale = () => createSelector( + selectLanguage(), + (languageState) => languageState.get('locale') +); + +export { + selectLanguage, + selectLocale, +}; diff --git a/cyclone-web/internals/templates/notFoundPage/messages.js b/cyclone-web/internals/templates/notFoundPage/messages.js new file mode 100644 index 0000000000000000000000000000000000000000..dec057aaa18168112fe79da55683faf30bdc3058 --- /dev/null +++ b/cyclone-web/internals/templates/notFoundPage/messages.js @@ -0,0 +1,13 @@ +/* + * NotFoundPage Messages + * + * This contains all the text for the NotFoundPage component. + */ +import { defineMessages } from 'react-intl'; + +export default defineMessages({ + header: { + id: 'app.components.NotFoundPage.header', + defaultMessage: 'This is NotFoundPage component !', + }, +}); diff --git a/cyclone-web/internals/templates/notFoundPage/notFoundPage.js b/cyclone-web/internals/templates/notFoundPage/notFoundPage.js new file mode 100644 index 0000000000000000000000000000000000000000..f5305d94b0c86c09169ce722ea8dcec51ce4c01a --- /dev/null +++ b/cyclone-web/internals/templates/notFoundPage/notFoundPage.js @@ -0,0 +1,25 @@ +/** + * NotFoundPage + * + * This is the page we show when the user visits a url that doesn't have a route + * + * NOTE: while this component should technically be a stateless functional + * component (SFC), hot reloading does not currently support SFCs. If hot + * reloading is not a necessity for you then you can refactor it and remove + * the linting exception. + */ + +import React from 'react'; +import { FormattedMessage } from 'react-intl'; +import messages from './messages'; + +export default class NotFound extends React.Component { // eslint-disable-line react/prefer-stateless-function + + render() { + return ( + <h1> + <FormattedMessage {...messages.header} /> + </h1> + ); + } +} diff --git a/cyclone-web/internals/templates/reducers.js b/cyclone-web/internals/templates/reducers.js new file mode 100644 index 0000000000000000000000000000000000000000..a86c2a96ca9606a8c6e0f50190634a25ce0de4d6 --- /dev/null +++ b/cyclone-web/internals/templates/reducers.js @@ -0,0 +1,48 @@ +/** + * Combine all reducers in this file and export the combined reducers. + * If we were to do this in store.js, reducers wouldn't be hot reloadable. + */ + +import { combineReducers } from 'redux-immutable'; +import { fromJS } from 'immutable'; +import { LOCATION_CHANGE } from 'react-router-redux'; +import languageProviderReducer from 'containers/LanguageProvider/reducer'; + +/* + * routeReducer + * + * The reducer merges route location changes into our immutable state. + * The change is necessitated by moving to react-router-redux@4 + * + */ + +// Initial routing state +const routeInitialState = fromJS({ + locationBeforeTransitions: null, +}); + +/** + * Merge route into the global application state + */ +function routeReducer(state = routeInitialState, action) { + switch (action.type) { + /* istanbul ignore next */ + case LOCATION_CHANGE: + return state.merge({ + locationBeforeTransitions: action.payload, + }); + default: + return state; + } +} + +/** + * Creates the main reducer with the asynchronously loaded ones + */ +export default function createReducer(asyncReducers) { + return combineReducers({ + route: routeReducer, + language: languageProviderReducer, + ...asyncReducers, + }); +} diff --git a/cyclone-web/internals/templates/routes.js b/cyclone-web/internals/templates/routes.js new file mode 100644 index 0000000000000000000000000000000000000000..41fc13edfe2d7377248a542d4cbbd3562c3a7466 --- /dev/null +++ b/cyclone-web/internals/templates/routes.js @@ -0,0 +1,46 @@ +// These are the pages you can go to. +// They are all wrapped in the App component, which should contain the navbar etc +// See http://blog.mxstbr.com/2016/01/react-apps-with-pages for more information +// about the code splitting business +import { getAsyncInjectors } from 'utils/asyncInjectors'; + +const errorLoading = (err) => { + console.error('Dynamic page loading failed', err); // eslint-disable-line no-console +}; + +const loadModule = (cb) => (componentModule) => { + cb(null, componentModule.default); +}; + +export default function createRoutes(store) { + // Create reusable async injectors using getAsyncInjectors factory + const { injectReducer, injectSagas } = getAsyncInjectors(store); // eslint-disable-line no-unused-vars + + return [ + { + path: '/', + name: 'home', + getComponent(nextState, cb) { + const importModules = Promise.all([ + System.import('containers/HomePage'), + ]); + + const renderRoute = loadModule(cb); + + importModules.then(([component]) => { + renderRoute(component); + }); + + importModules.catch(errorLoading); + }, + }, { + path: '*', + name: 'notfound', + getComponent(nextState, cb) { + System.import('containers/NotFoundPage') + .then(loadModule(cb)) + .catch(errorLoading); + }, + }, + ]; +} diff --git a/cyclone-web/internals/templates/selectors.js b/cyclone-web/internals/templates/selectors.js new file mode 100644 index 0000000000000000000000000000000000000000..369372fbf22f8f317343997b2b498bcf6beb0c94 --- /dev/null +++ b/cyclone-web/internals/templates/selectors.js @@ -0,0 +1,20 @@ +// selectLocationState expects a plain JS object for the routing state +const selectLocationState = () => { + let prevRoutingState; + let prevRoutingStateJS; + + return (state) => { + const routingState = state.get('route'); // or state.route + + if (!routingState.equals(prevRoutingState)) { + prevRoutingState = routingState; + prevRoutingStateJS = routingState.toJS(); + } + + return prevRoutingStateJS; + }; +}; + +export { + selectLocationState, +}; diff --git a/cyclone-web/internals/templates/selectors.test.js b/cyclone-web/internals/templates/selectors.test.js new file mode 100644 index 0000000000000000000000000000000000000000..cb0e798e47b4b38206c4f8d8738782e71c73d6e4 --- /dev/null +++ b/cyclone-web/internals/templates/selectors.test.js @@ -0,0 +1,16 @@ +import { fromJS } from 'immutable'; +import expect from 'expect'; + +import { selectLocationState } from 'containers/App/selectors'; + +describe('selectLocationState', () => { + it('should select the route as a plain JS object', () => { + const route = fromJS({ + locationBeforeTransitions: null, + }); + const mockedState = fromJS({ + route, + }); + expect(selectLocationState()(mockedState)).toEqual(route.toJS()); + }); +}); diff --git a/cyclone-web/internals/templates/store.js b/cyclone-web/internals/templates/store.js new file mode 100644 index 0000000000000000000000000000000000000000..d7a1056e1e65766ad94e384aaa287a33b72b43f4 --- /dev/null +++ b/cyclone-web/internals/templates/store.js @@ -0,0 +1,51 @@ +/** + * Create the store with asynchronously loaded reducers + */ + +import { createStore, applyMiddleware, compose } from 'redux'; +import { fromJS } from 'immutable'; +import { routerMiddleware } from 'react-router-redux'; +import createSagaMiddleware from 'redux-saga'; +import createReducer from './reducers'; + +const sagaMiddleware = createSagaMiddleware(); +const devtools = window.devToolsExtension || (() => (noop) => noop); + +export default function configureStore(initialState = {}, history) { + // Create the store with two middlewares + // 1. sagaMiddleware: Makes redux-sagas work + // 2. routerMiddleware: Syncs the location/URL path to the state + const middlewares = [ + sagaMiddleware, + routerMiddleware(history), + ]; + + const enhancers = [ + applyMiddleware(...middlewares), + devtools(), + ]; + + const store = createStore( + createReducer(), + fromJS(initialState), + compose(...enhancers) + ); + + // Create hook for async sagas + store.runSaga = sagaMiddleware.run; + + // Make reducers hot reloadable, see http://mxs.is/googmo + /* istanbul ignore next */ + if (module.hot) { + System.import('./reducers').then((reducerModule) => { + const createReducers = reducerModule.default; + const nextReducers = createReducers(store.asyncReducers); + + store.replaceReducer(nextReducers); + }); + } + + // Initialize it with no other reducers + store.asyncReducers = {}; + return store; +} diff --git a/cyclone-web/internals/templates/store.test.js b/cyclone-web/internals/templates/store.test.js new file mode 100644 index 0000000000000000000000000000000000000000..b21e6d57e1722e4ff4c2ed0ed2d707e72b1e459c --- /dev/null +++ b/cyclone-web/internals/templates/store.test.js @@ -0,0 +1,27 @@ +/** + * Test store addons + */ + +import expect from 'expect'; +import configureStore from '../store'; // eslint-disable-line +import { browserHistory } from 'react-router'; + +describe('configureStore', () => { + let store; + + before(() => { + store = configureStore({}, browserHistory); + }); + + describe('asyncReducers', () => { + it('should contain an object for async reducers', () => { + expect(typeof store.asyncReducers).toEqual('object'); + }); + }); + + describe('runSaga', () => { + it('should contain a hook for `sagaMiddleware.run`', () => { + expect(typeof store.runSaga).toEqual('function'); + }); + }); +}); diff --git a/cyclone-web/internals/templates/styles.css b/cyclone-web/internals/templates/styles.css new file mode 100644 index 0000000000000000000000000000000000000000..e73a29ebf80a61a65df6deba811044f04d3fa4f8 --- /dev/null +++ b/cyclone-web/internals/templates/styles.css @@ -0,0 +1,9 @@ +/** + * styles.css + * + * App container styles + */ + +.container { + display: block; +} diff --git a/cyclone-web/internals/templates/translations/en.json b/cyclone-web/internals/templates/translations/en.json new file mode 100644 index 0000000000000000000000000000000000000000..fe51488c7066f6687ef680d6bfaa4f7768ef205c --- /dev/null +++ b/cyclone-web/internals/templates/translations/en.json @@ -0,0 +1 @@ +[] diff --git a/cyclone-web/internals/testing/karma.conf.js b/cyclone-web/internals/testing/karma.conf.js new file mode 100644 index 0000000000000000000000000000000000000000..2407e744b40ffa5d043d6fea8628e8323d32c22e --- /dev/null +++ b/cyclone-web/internals/testing/karma.conf.js @@ -0,0 +1,61 @@ +const webpackConfig = require('../webpack/webpack.test.babel'); +const argv = require('minimist')(process.argv.slice(2)); +const path = require('path'); + +module.exports = (config) => { + config.set({ + frameworks: ['mocha'], + reporters: ['coverage', 'mocha'], + browsers: process.env.TRAVIS // eslint-disable-line no-nested-ternary + ? ['ChromeTravis'] + : process.env.APPVEYOR + ? ['IE'] : ['Chrome'], + + autoWatch: false, + singleRun: true, + + client: { + mocha: { + grep: argv.grep, + }, + }, + + files: [ + { + pattern: './test-bundler.js', + watched: false, + served: true, + included: true, + }, + ], + + preprocessors: { + ['./test-bundler.js']: ['webpack', 'sourcemap'], // eslint-disable-line no-useless-computed-key + }, + + webpack: webpackConfig, + + // make Webpack bundle generation quiet + webpackMiddleware: { + noInfo: true, + stats: 'errors-only', + }, + + customLaunchers: { + ChromeTravis: { + base: 'Chrome', + flags: ['--no-sandbox'], + }, + }, + + coverageReporter: { + dir: path.join(process.cwd(), 'coverage'), + reporters: [ + { type: 'lcov', subdir: 'lcov' }, + { type: 'html', subdir: 'html' }, + { type: 'text-summary' }, + ], + }, + + }); +}; diff --git a/cyclone-web/internals/testing/test-bundler.js b/cyclone-web/internals/testing/test-bundler.js new file mode 100644 index 0000000000000000000000000000000000000000..ef8bb109e93514824e5700445f91ed3474a5ac96 --- /dev/null +++ b/cyclone-web/internals/testing/test-bundler.js @@ -0,0 +1,13 @@ +// needed for regenerator-runtime +// (ES7 generator support is required by redux-saga) +import 'babel-polyfill'; + +// If we need to use Chai, we'll have already chaiEnzyme loaded +import chai from 'chai'; +import chaiEnzyme from 'chai-enzyme'; +chai.use(chaiEnzyme()); + +// Include all .js files under `app`, except app.js, reducers.js, and routes.js. +// This is for code coverage +const context = require.context('../../app', true, /^^((?!(app|reducers|routes)).)*\.js$/); +context.keys().forEach(context); diff --git a/cyclone-web/internals/webpack/webpack.base.babel.js b/cyclone-web/internals/webpack/webpack.base.babel.js new file mode 100644 index 0000000000000000000000000000000000000000..6f5419b388c5de6e089cbfa947a99c67b195e6ed --- /dev/null +++ b/cyclone-web/internals/webpack/webpack.base.babel.js @@ -0,0 +1,259 @@ +/** + * COMMON WEBPACK CONFIGURATION + */ + +const path = require('path'); +const webpack = require('webpack'); + +// PostCSS plugins +const cssnext = require('postcss-cssnext'); +const postcssFocus = require('postcss-focus'); +const postcssReporter = require('postcss-reporter'); +const ProgressBarPlugin = require('progress-bar-webpack-plugin'); +const CopyWebpackPlugin = require('copy-webpack-plugin'); + +const HappyPack = require('happypack'); +const os = require('os'); +// const happyThreadPool = HappyPack.ThreadPool({ size: 2 }); +const happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length }); + +module.exports = options => ({ + entry: options.entry, + output: Object.assign( + { + // Compile into js/build.js + path: path.resolve(process.cwd(), 'build'), + publicPath: '/' + }, + options.output + ), // Merge with env dependent settings + module: { + rules: [ + { + test: /\.(js|jsx)$/, + exclude: /node_modules/, + // use: 'happypack/loader?id=js', + use: [ + { + loader: 'babel-loader', + options: { + presets: ['es2015-ie', 'stage-0', 'react'], + plugins: ['transform-decorators-legacy', 'react-hot-loader/babel'] + } + } + ] + // use: [ + // { + // loader: "babel-loader", + // options: { + // presets: [ + // [ + // "es2015", + // { + // modules: false + // } + // ], + // "react", + // "stage-0" + // ], + // plugins: ["react-hot-loader/babel"] + // } + // } + // ] + }, + { + test: /\.css$/, + use: options.cssLoaders + }, + { + test: /\.less$/, + use: 'happypack/loader?id=less' + // use: [ + // "style-loader", + // { + // loader: "css-loader", + // query: { + // importLoader: 1, + // localIdentName: "[path]___[name]__[local]___[hash:base64:5]", + // modules: true + // } + // }, + // "postcss-loader", + // "less-loader" + // ] + }, + { + test: /\.(jpg|png|gif|jpeg)$/, + use: 'happypack/loader?id=pic' + // loaders: [ + // "file-loader?limit=5000&hash=sha512&digest=hex&size=16&name=[name].[ext]?[hash]" + // ] + }, + { + test: /\.html$/, + use: ['html-loader'] + } + ] + }, + plugins: options.plugins.concat([ + new HappyPack({ + id: 'js', + verbose: true, + threadPool: happyThreadPool, + loaders: [ + { + path: 'babel-loader', + query: { + presets: [ + [ + 'es2015', + { + modules: false + } + ], + 'react', + 'stage-0' + ], + plugins: ['react-hot-loader/babel'] + } + } + ] + }), + new HappyPack({ + id: 'less', + verbose: true, + threadPool: happyThreadPool, + loaders: [ + 'style-loader', + { + loader: 'css-loader', + query: { + importLoader: 1, + localIdentName: '[path]___[name]__[local]___[hash:base64:5]', + modules: true + } + }, + 'postcss-loader', + 'less-loader' + ] + }), + new HappyPack({ + id: 'pic', + verbose: true, + threadPool: happyThreadPool, + loaders: [ + 'file-loader?limit=5000&hash=sha512&digest=hex&size=16&name=[name].[ext]?[hash]' + ] + }), + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: JSON.stringify(process.env.NODE_ENV) + } + }), + new ProgressBarPlugin(), + new CopyWebpackPlugin([ + { + from: path.resolve(process.cwd(), 'vendor'), + to: 'vendor' + }, + { + from: path.resolve(process.cwd(), 'app/assets'), + to: 'assets' + } + ]) + ]), + resolve: { + modules: [ 'app', 'node_modules' ], + aliasFields: ['main'], + descriptionFiles: ['package.json'], + mainFields: [ 'main', 'browser', 'module' ], + extensions: [ '.js', '.jsx' ] + }, + externals: { + antd: 'antd', + react: 'React', + 'react-dom': 'ReactDOM', + 'react-redux': 'ReactRedux', + 'react-router': 'ReactRouter', + immutable: 'Immutable', + 'react-router-redux': 'ReactRouterRedux', + 'redux-saga': 'ReduxSaga', + 'redux-thunk': 'ReduxThunk', + redux: 'Redux', + 'js-cookie': 'JsCookie', + 'object-path': 'ObjectPath', + lodash: 'lodash', + 'redux-actions': 'ReduxActions', + moment: 'moment', + 'react-intl': 'ReactIntl', + reselect: 'Reselect', + 'rc-queue-anim': 'RcQueueAnim', + echarts: 'echarts', + 'rc-animate': 'rcAnimate' + }, + devtool: options.devtool, + target: 'web', + stats: { + // Add asset Information + assets: true, + // Sort assets by a field + assetsSort: 'field', + // Add information about cached (not built) modules + cached: true, + // Show cached assets (setting this to `false` only shows emitted files) + cachedAssets: true, + // Add children information + children: true, + // Add chunk information (setting this to `false` allows for a less verbose output) + chunks: true, + // Add built modules information to chunk information + chunkModules: true, + // Add the origins of chunks and chunk merging info + chunkOrigins: true, + // Sort the chunks by a field + chunksSort: 'field', + // Context directory for request shortening + // context: "../src/", + // `webpack --colors` equivalent + colors: true, + // Display the distance from the entry point for each module + depth: false, + // Display the entry points with the corresponding bundles + entrypoints: false, + // Add errors + errors: true, + // Add details to errors (like resolving log) + errorDetails: true, + // Exclude modules which match one of the given strings or regular expressions + exclude: [], + // Add the hash of the compilation + hash: true, + // Set the maximum number of modules to be shown + maxModules: 10000, + // Add built modules information + modules: true, + // Sort the modules by a field + modulesSort: 'field', + // Show performance hint when file size exceeds `performance.maxAssetSize` + performance: true, + // Show the exports of the modules + providedExports: false, + // Add public path information + publicPath: true, + // Add information about the reasons why modules are included + reasons: true, + // Add the source code of modules + source: true, + // Add timing information + timings: true, + // Show which exports of a module are used + usedExports: false, + // Add webpack version information + version: true, + // Add warnings + warnings: true + // Filter warnings to be shown (since webpack 2.4.0), + // can be a String, Regexp, a function getting the warning and returning a boolean + // or an Array of a combination of the above. First match wins. + } +}); diff --git a/cyclone-web/internals/webpack/webpack.dev.babel.js b/cyclone-web/internals/webpack/webpack.dev.babel.js new file mode 100644 index 0000000000000000000000000000000000000000..66eb0478403bb423f88eb841eade6416bf5bb0e6 --- /dev/null +++ b/cyclone-web/internals/webpack/webpack.dev.babel.js @@ -0,0 +1,149 @@ +/** + * DEVELOPMENT WEBPACK CONFIGURATION + */ + +const path = require('path'); +const fs = require('fs'); +const webpack = require('webpack'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const logger = require('../../server/logger'); +const cheerio = require('cheerio'); +const pkg = require(path.resolve(process.cwd(), 'package.json')); +const dllPlugin = pkg.dllPlugin; + + +// var DashboardPlugin = require('webpack-dashboard/plugin'); + +const plugins = [ + // new DashboardPlugin({ port: 3001 }), + new webpack.HotModuleReplacementPlugin(), // Tell webpack we want hot reloading + new webpack.NoEmitOnErrorsPlugin(), + new HtmlWebpackPlugin({ + template: 'app/index.html', + inject: true, // Inject all files that are generated by webpack, e.g. bundle.js + // templateContent: templateContent(), // eslint-disable-line no-use-before-define + }) +]; + +module.exports = require('./webpack.base.babel')({ + // Add hot reloading in development + entry: [ + 'eventsource-polyfill', // Necessary for hot reloading with IE + 'webpack-hot-middleware/client?reload=true', + path.join(process.cwd(), 'app/app.js'), // Start with js/app.js + ], + + // Don't use hashes in dev mode for better performance + output: { + filename: '[name].js', + chunkFilename: '[name].chunk.js', + }, + + // Add development plugins + plugins: plugins, // eslint-disable-line no-use-before-define + + // Load the CSS in a style tag in development + cssLoaders: [ + 'style-loader', + 'css-loader', + 'postcss-loader' + ], + + // Tell babel that we want to hot-reload + babelQuery: { + presets: ['react-hmre'], + }, + + // Emit a source map for easier debugging + devtool: '#inline-source-map', +}); + +/** + * Select which plugins to use to optimize the bundle's handling of + * third party dependencies. + * + * If there is a dllPlugin key on the project's package.json, the + * Webpack DLL Plugin will be used. Otherwise the CommonsChunkPlugin + * will be used. + * + */ +function dependencyHandlers() { + // Don't do anything during the DLL Build step + if (process.env.BUILDING_DLL) { return []; } + + // If the package.json does not have a dllPlugin property, use the CommonsChunkPlugin + if (!dllPlugin) { + return [ + new webpack.optimize.CommonsChunkPlugin({ + name: 'vendor', + children: true, + minChunks: 2, + async: true, + }), + ]; + } + + const dllPath = path.resolve(process.cwd(), dllPlugin.path || 'node_modules/react-boilerplate-dlls'); + + /** + * If DLLs aren't explicitly defined, we assume all production dependencies listed in package.json + * Reminder: You need to exclude any server side dependencies by listing them in dllConfig.exclude + * + * @see https://github.com/mxstbr/react-boilerplate/tree/master/docs/general/webpack.md + */ + if (!dllPlugin.dlls) { + const manifestPath = path.resolve(dllPath, 'reactBoilerplateDeps.json'); + + if (!fs.existsSync(manifestPath)) { + logger.error('The DLL manifest is missing. Please run `npm run build:dll`'); + process.exit(0); + } + + return [ + new webpack.DllReferencePlugin({ + context: process.cwd(), + manifest: require(manifestPath), // eslint-disable-line global-require + }), + ]; + } + + // If DLLs are explicitly defined, we automatically create a DLLReferencePlugin for each of them. + const dllManifests = Object.keys(dllPlugin.dlls).map((name) => path.join(dllPath, `/${name}.json`)); + + return dllManifests.map((manifestPath) => { + if (!fs.existsSync(path)) { + if (!fs.existsSync(manifestPath)) { + logger.error(`The following Webpack DLL manifest is missing: ${path.basename(manifestPath)}`); + logger.error(`Expected to find it in ${dllPath}`); + logger.error('Please run: npm run build:dll'); + + process.exit(0); + } + } + + return new webpack.DllReferencePlugin({ + context: process.cwd(), + manifest: require(manifestPath), // eslint-disable-line global-require + }); + }); +} + +/** + * We dynamically generate the HTML content in development so that the different + * DLL Javascript files are loaded in script tags and available to our application. + */ +function templateContent() { + const html = fs.readFileSync( + path.resolve(process.cwd(), 'app/index.html') + ).toString(); + + if (!dllPlugin) { return html; } + + const doc = cheerio(html); + const body = doc.find('body'); + const dllNames = !dllPlugin.dlls ? ['reactBoilerplateDeps'] : Object.keys(dllPlugin.dlls); + + dllNames.forEach((dllName) => body.append(`<script data-dll='true' src='/${dllName}.dll.js'></script>`)); + + return doc.toString(); +} diff --git a/cyclone-web/internals/webpack/webpack.dll.babel.js b/cyclone-web/internals/webpack/webpack.dll.babel.js new file mode 100644 index 0000000000000000000000000000000000000000..bd53475f944a41cdb1c056a885f257a610898d66 --- /dev/null +++ b/cyclone-web/internals/webpack/webpack.dll.babel.js @@ -0,0 +1,34 @@ +/** + * WEBPACK DLL GENERATOR + * + * This profile is used to cache webpack's module + * contexts for external library and framework type + * dependencies which will usually not change often enough + * to warrant building them from scratch every time we use + * the webpack process. + */ + +const { join } = require('path'); +const defaults = require('lodash/defaultsDeep'); +const webpack = require('webpack'); +const pkg = require(join(process.cwd(), 'package.json')); +const dllPlugin = require('../config').dllPlugin; + +if (!pkg.dllPlugin) { process.exit(0); } + +const dllConfig = defaults(pkg.dllPlugin, dllPlugin.defaults); +const outputPath = join(process.cwd(), dllConfig.path); + +module.exports = require('./webpack.base.babel')({ + context: process.cwd(), + entry: dllConfig.dlls ? dllConfig.dlls : dllPlugin.entry(pkg), + devtool: 'eval', + output: { + filename: '[name].dll.js', + path: outputPath, + library: '[name]', + }, + plugins: [ + new webpack.DllPlugin({ name: '[name]', path: join(outputPath, '[name].json') }), // eslint-disable-line no-new + ], +}); diff --git a/cyclone-web/internals/webpack/webpack.prod.babel.js b/cyclone-web/internals/webpack/webpack.prod.babel.js new file mode 100644 index 0000000000000000000000000000000000000000..2c4b756dd05d83679bf68d11c9c12cc7fede183e --- /dev/null +++ b/cyclone-web/internals/webpack/webpack.prod.babel.js @@ -0,0 +1,70 @@ +// Important modules this config uses +const path = require('path'); +const webpack = require('webpack'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const ExtractTextPlugin = require('extract-text-webpack-plugin'); +const pkg = require(path.resolve(process.cwd(), 'package.json')); + +module.exports = require('./webpack.base.babel')({ + // In production, we skip all hot-reloading stuff + entry: { + main: path.join(process.cwd(), 'app/app.js'), + }, + + // Utilize long-term caching by adding content hashes (not compilation hashes) to compiled assets + output: { + filename: 'js/[name].[chunkhash].js', + chunkFilename: 'js/[name].[chunkhash].chunk.js', + }, + + // add babelQuery + // babelQuery: pkg.babel, + + // We use ExtractTextPlugin so we get a separate CSS file instead + // of the CSS being in the JS and injected as a style tag + cssLoaders: 'style-loader!css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]!postcss-loader', + + // @todo: + // ExtracTextPlugin 会导致 css import 报错 + // 可能的原因是 node 版本不兼容 + // ExtractTextPlugin.extract({ + // fallbackLoader: 'style-loader', + // loader: 'css-loader?modules&-autoprefixer&importLoaders=1!postcss-loader', + // }), + + plugins: [ + // OccurrenceOrderPlugin is needed for long-term caching to work properly. + // See http://mxs.is/googmv + // new webpack.optimize.OccurrenceOrderPlugin(true), + + // @todo: + // 该插件导致部分模块缺失 + // Merge all duplicate modules + // new webpack.optimize.DedupePlugin(), + + // Minify and optimize the JavaScript + new webpack.optimize.UglifyJsPlugin({ + compress: { + warnings: false, // ...but do not show warnings in the console (there is a lot of them) + }, + }), + + // Minify and optimize the index.html + new HtmlWebpackPlugin({ + template: 'app/index.html', + // minify: { + // removeComments: true, + // collapseWhitespace: true, + // removeRedundantAttributes: true, + // useShortDoctype: true, + // removeEmptyAttributes: true, + // removeStyleLinkTypeAttributes: true, + // keepClosingSlash: true, + // minifyJS: true, + // minifyCSS: true, + // minifyURLs: true, + // }, + inject: true + }) + ] +}); diff --git a/cyclone-web/internals/webpack/webpack.test.babel.js b/cyclone-web/internals/webpack/webpack.test.babel.js new file mode 100644 index 0000000000000000000000000000000000000000..9c30df7040a14f8378677125a61315f5bd108940 --- /dev/null +++ b/cyclone-web/internals/webpack/webpack.test.babel.js @@ -0,0 +1,84 @@ +/** + * TEST WEBPACK CONFIGURATION + */ + +const webpack = require('webpack'); +const modules = [ + 'app', + 'node_modules', +]; + +module.exports = { + devtool: 'inline-source-map', + module: { + // Some libraries don't like being run through babel. + // If they gripe, put them here. + noParse: [ + /node_modules(\\|\/)sinon/, + /node_modules(\\|\/)acorn/, + ], + loaders: [ + { test: /\.json$/, loader: 'json-loader' }, + { test: /\.css$/, loader: 'null-loader' }, + + // sinon.js--aliased for enzyme--expects/requires global vars. + // imports-loader allows for global vars to be injected into the module. + // See https://github.com/webpack/webpack/issues/304 + { test: /sinon(\\|\/)pkg(\\|\/)sinon\.js/, + loader: 'imports?define=>false,require=>false', + }, + { test: /\.js$/, + loader: 'babel', + exclude: [/node_modules/], + }, + { test: /\.jpe?g$|\.gif$|\.png$|\.svg$/i, + loader: 'null-loader', + }, + ], + }, + + plugins: [ + + // Always expose NODE_ENV to webpack, in order to use `process.env.NODE_ENV` + // inside your code for any environment checks; UglifyJS will automatically + // drop any unreachable code. + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: JSON.stringify(process.env.NODE_ENV), + }, + })], + + // Some node_modules pull in Node-specific dependencies. + // Since we're running in a browser we have to stub them out. See: + // https://webpack.github.io/docs/configuration.html#node + // https://github.com/webpack/node-libs-browser/tree/master/mock + // https://github.com/webpack/jade-loader/issues/8#issuecomment-55568520 + node: { + fs: 'empty', + child_process: 'empty', + net: 'empty', + tls: 'empty', + }, + + // required for enzyme to work properly + externals: { + jsdom: 'window', + 'react/addons': true, + 'react/lib/ExecutionEnvironment': true, + 'react/lib/ReactContext': 'window', + }, + resolve: { + modulesDirectories: modules, + modules, + extensions: [ + '', + '.js', + '.jsx', + '.react.js', + ], + alias: { + // required for enzyme to work properly + sinon: 'sinon/pkg/sinon', + }, + }, +}; diff --git a/cyclone-web/internals/webpack/webpack.vendor.babel.js b/cyclone-web/internals/webpack/webpack.vendor.babel.js new file mode 100644 index 0000000000000000000000000000000000000000..d279cfb97aabe680f6a0aabe678b0ddf8051f33a --- /dev/null +++ b/cyclone-web/internals/webpack/webpack.vendor.babel.js @@ -0,0 +1,59 @@ +/** + * WEBPACK DLL GENERATOR + * + * This profile is used to cache webpack's module + * contexts for external library and framework type + * dependencies which will usually not change often enough + * to warrant building them from scratch every time we use + * the webpack process. + */ + +const webpack = require('webpack'); +const ProgressBarPlugin = require('progress-bar-webpack-plugin'); + +const path = require('path'); + +module.exports = { + entry: path.resolve(process.cwd(), 'app/vendor.js'), + output: { + filename: 'vendors.js', + path: path.resolve(process.cwd(), 'vendor/react/'), + library: '[name]', + libraryTarget: 'window' + }, + module: { + rules: [ + { + test: /\.(js|jsx)$/, + use: [ + { + loader: 'babel-loader', + options: { + presets: ['es2015', 'es2015-ie', 'react', 'stage-0'] + } + } + ] + } + ] + }, + plugins: [ + new webpack.DefinePlugin({ + 'process.env': { + NODE_ENV: JSON.stringify(process.env.NODE_ENV) + } + }), + new webpack.optimize.UglifyJsPlugin({ + compress: { + warnings: true + } + }), + new ProgressBarPlugin() + ], + resolve: { + modules: ['app', 'node_modules'], + aliasFields: ['main'], + descriptionFiles: ['package.json'], + mainFields: ['main', 'browser', 'module'], + extensions: ['.js', '.jsx'] + } +}; diff --git a/cyclone-web/nginx.conf b/cyclone-web/nginx.conf new file mode 100644 index 0000000000000000000000000000000000000000..2dc9c9b6309172acd01f477d5b03f226342cd592 --- /dev/null +++ b/cyclone-web/nginx.conf @@ -0,0 +1,152 @@ + +#user nobody; +worker_processes 1; + +#error_log logs/error.log; +#error_log logs/error.log notice; +#error_log logs/error.log info; + +#pid logs/nginx.pid; + + +events { + worker_connections 1024; +} + + +http { + include mime.types; + default_type application/octet-stream; + + #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + # '$status $body_bytes_sent "$http_referer" ' + # '"$http_user_agent" "$http_x_forwarded_for"'; + + #access_log logs/access.log main; + + sendfile on; + #tcp_nopush on; + + #keepalive_timeout 0; + keepalive_timeout 65; + + #gzip on; + + server { + listen 80; + server_name localhost; + + #charset koi8-r; + + #access_log logs/host.access.log main; + + location / { + + root /Users/yanlv/work/idcos/cloud-mix-web/build ;#config html dir + + if ( $content_type = "application/json" ) { + proxy_pass http://localhost:8080 ; + } + + if ( $uri ~ /login.html ) { + proxy_pass http://localhost:8080 ; + } + + if ( $uri ~ /res ) { + proxy_pass http://localhost:8080 ; + } + + if ( $uri ~ /user ) { + proxy_pass http://localhost:8080 ; + } + + if ( $uri ~ /api ) { + proxy_pass http://localhost:8080 ; + } + + if ( $uri ~ /auth ) { + proxy_pass http://localhost:8080 ; + } + + if ( $uri ~ /report ) { + proxy_pass http://localhost:8080 ; + } + + if ( $uri ~ /static ) { + proxy_pass http://localhost:8080 ; + } + + index index.html index.htm; + client_max_body_size 1000m; + } + + #error_page 404 /404.html; + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root html; + } + + # proxy the PHP scripts to Apache listening on 127.0.0.1:80 + # + #location ~ \.php$ { + # proxy_pass http://127.0.0.1; + #} + + # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + # + #location ~ \.php$ { + # root html; + # fastcgi_pass 127.0.0.1:9000; + # fastcgi_index index.php; + # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; + # include fastcgi_params; + #} + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} + } + + + # another virtual host using mix of IP-, name-, and port-based configuration + # + #server { + # listen 8000; + # listen somename:8080; + # server_name somename alias another.alias; + + # location / { + # root html; + # index index.html index.htm; + # } + #} + + + # HTTPS server + # + #server { + # listen 443 ssl; + # server_name localhost; + + # ssl_certificate cert.pem; + # ssl_certificate_key cert.key; + + # ssl_session_cache shared:SSL:1m; + # ssl_session_timeout 5m; + + # ssl_ciphers HIGH:!aNULL:!MD5; + # ssl_prefer_server_ciphers on; + + # location / { + # root html; + # index index.html index.htm; + # } + #} + include servers/*; +} diff --git a/cyclone-web/package.json b/cyclone-web/package.json new file mode 100644 index 0000000000000000000000000000000000000000..4c0039e26b22b2b16fffb4ae020cd937cf1357b7 --- /dev/null +++ b/cyclone-web/package.json @@ -0,0 +1,200 @@ +{ + "name": "react-boilerplate", + "version": "1.5.2", + "description": "A highly scalable, offline-first foundation with the best DX and a focus on performance and best practices", + "repository": { + "type": "git", + "url": "git://github.com/mxstbr/react-boilerplate.git" + }, + "engines": { + "npm": ">=3" + }, + "author": "Max Stoiber", + "license": "MIT", + "scripts": { + "preinstall": "npm run npmcheckversion", + "postinstall": "", + "analyze:clean": "rimraf stats.json", + "preanalyze": "npm run analyze:clean", + "analyze": "node ./internals/scripts/analyze.js", + "npmcheckversion": "node ./internals/scripts/npmcheckversion.js", + "prebuild": "npm run build:clean", + "build": "cross-env NODE_ENV=production webpack --config internals/webpack/webpack.prod.babel.js --color", + "build:dev": "npm run build:clean && NODE_ENV=development webpack --config internals/webpack/webpack.dev.babel.js --color", + "build:prod": "cross-env NODE_ENV=production webpack --config internals/webpack/webpack.prod.babel.js --color -p", + "build:clean": "rimraf ./build", + "build:dll": "node ./internals/scripts/dependencies.js", + "build:vendor": "NODE_ENV=production webpack --config internals/webpack/webpack.vendor.babel.js --color -p", + "start": "cross-env NODE_ENV=development MOCK=true node server", + "start:production": "npm run build && npm run start:prod", + "start:prod": "cross-env NODE_ENV=production node server", + "create:proxyfile": "babel-node --presets latest,stage-0 -- ./internals/scripts/proxy.js", + "generate": "plop --plopfile internals/generators/index.js", + "lint": "npm run lint:js && npm run lint:css", + "fix": "eslint --ext .jsx,.js ./app --fix", + "lint:js": "eslint --ext .jsx ./app", + "lint:eslint": "eslint --ext .jsx ./app", + "lint:css": "stylelint ./app/**/*.less", + "lint:fix": "eslint --ext .jsx ./app --fix && stylelint ./app/**/*.less --fix" + }, + "stylelint": { + "extends": "stylelint-config-standard", + "rules": { + "color-hex-case": "upper", + "string-quotes": "single", + "font-family-name-quotes": "always-where-recommended", + "selector-pseudo-class-no-unknown": [ + true, + { + "ignorePseudoClasses": [ + "global" + ] + } + ], + "property-no-unknown": [ + true, + { + "ignoreProperties": [ + "composes" + ] + } + ], + "indentation": 2 + } + }, + "dllPlugin": { + "path": "node_modules/react-boilerplate-dlls", + "exclude": [ + "chalk", + "compression", + "cross-env", + "express", + "ip", + "minimist", + "sanitize.css" + ], + "include": [ + "core-js", + "lodash", + "eventsource-polyfill" + ] + }, + "dependencies": { + "antd": "^3.26.18", + "babel": "^6.23.0", + "babel-cli": "^6.26.0", + "babel-plugin-transform-proto-to-assign": "^6.26.0", + "babel-polyfill": "6.13.0", + "babel-preset-env": "^1.6.0", + "babel-preset-es2015-ie": "^6.7.0", + "cheerio": "0.22", + "compression": "1.6.2", + "echarts": "^3.5.4", + "express": "4.14.0", + "fetch-detector": "^1.0.0", + "fetch-ie8": "^1.5.0", + "g2": "^2.0.4", + "happypack": "^4.0.1", + "html-webpack-plugin": "^2.28.0", + "http-proxy-middleware": "^0.17.2", + "immutable": "3.8.1", + "intl-messageformat": "^1.3.0", + "invariant": "2.2.1", + "ip": "1.1.3", + "js-cookie": "^2.1.3", + "js-md5": "^0.6.0", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "morgan": "^1.9.1", + "npm": "^6.14.6", + "object-path": "^0.11.8", + "prop-types": "^15.6.2", + "rc-animate": "^2.4.4", + "rc-queue-anim": "^1.6.5", + "react": "^16.4.2", + "react-dnd-html5-backend": "^5.0.1", + "react-dom": "^16.4.2", + "react-helmet": "3.1.0", + "react-hot-loader": "^3.0.0", + "react-intl": "^2.2.3", + "react-redux": "^5.0.7", + "react-router": "3.2.1", + "react-router-redux": "4.0.8", + "react-router-scroll": "0.3.2", + "redux": "3.6.0", + "redux-actions": "^0.12.0", + "redux-immutable": "3.0.8", + "redux-saga": "0.11.1", + "redux-thunk": "^2.1.0", + "reselect": "2.5.4", + "rimraf": "^2.6.1", + "sortablejs": "*", + "webpack": "^2.4.1", + "webpack-dev-server": "^3.1.11", + "webpack-hot-middleware": "^2.21.0", + "with-immutable-props-to-js": "^1.1.0", + "xml2js": "^0.4.19" + }, + "devDependencies": { + "babel-core": "^6.24.1", + "babel-eslint": "^6.1.2", + "babel-loader": "^6.4.1", + "babel-plugin-import": "^1.0.1", + "babel-plugin-istanbul": "2.0.1", + "babel-plugin-react-intl": "2.2.0", + "babel-plugin-react-transform": "2.0.2", + "babel-plugin-transform-decorators-legacy": "^1.3.5", + "babel-plugin-transform-react-constant-elements": "6.9.1", + "babel-plugin-transform-react-inline-elements": "6.8.0", + "babel-plugin-transform-react-remove-prop-types": "0.2.9", + "babel-preset-latest": "6.14.0", + "babel-preset-react": "6.11.1", + "babel-preset-react-hmre": "1.1.1", + "babel-preset-stage-0": "6.5.0", + "body-parser": "^1.15.2", + "cheerio": "0.22", + "copy-to-clipboard": "^3.0.8", + "copy-webpack-plugin": "^3.0.1", + "cross-env": "^2.0.1", + "css-loader": "0.25.0", + "dnd-core": "^6.0.0", + "eslint": "^3.5.0", + "eslint-import-resolver-webpack": "0.6.0", + "eslint-plugin-import": "^1.16.0", + "eslint-plugin-jsx-a11y": "2.2.2", + "eslint-plugin-prettier": "2.2.0", + "eslint-plugin-react": "^6.10.3", + "eslint-plugin-redux-saga": "0.4.0", + "eventsource-polyfill": "^0.9.6", + "exports-loader": "0.6.3", + "extract-text-webpack-plugin": "2.0.0-beta.4", + "file-loader": "0.9.0", + "glob": "^7.1.1", + "html-loader": "0.4.4", + "image-webpack-loader": "2.0.0", + "immutability-helper": "^2.8.1", + "imports-loader": "0.6.5", + "json-loader": "0.5.4", + "less": "^2.7.1", + "less-loader": "^2.2.3", + "lint-staged": "3.0.2", + "null-loader": "0.1.1", + "postcss-cssnext": "2.8.0", + "postcss-focus": "1.0.0", + "postcss-loader": "0.13.0", + "postcss-reporter": "1.4.1", + "pre-commit": "*", + "progress-bar-webpack-plugin": "^1.9.0", + "react-dnd": "^5.0.0", + "react-json-pretty": "^1.7.9", + "style-loader": "0.13.1", + "stylelint": "7.2.0", + "stylelint-config-standard": "13.0.0", + "text-encoding": "^0.6.4", + "url-loader": "0.5.7", + "webpack-dev-middleware": "1.8.0" + }, + "pre-commit": [ + "lint:eslint" + ] +} diff --git a/cyclone-web/pkg.sh b/cyclone-web/pkg.sh new file mode 100644 index 0000000000000000000000000000000000000000..bea394706875dde072aa810567b757c12f63a2c9 --- /dev/null +++ b/cyclone-web/pkg.sh @@ -0,0 +1,46 @@ +#!/bin/sh +# 文件打包脚本 +# date:2013/2/27 + + +echo '************************************************************************************************' +echo '* 这个是包管理脚本,主要当前项目打包 *' +echo '* 参数1(必选):包名称,一般是仓库名+分支名(master分支后缀) 例如:pkg-manager-develop,pkg-manager *' +echo '* 参数2(必选):包版本,一般是{number}.{number}.{number}的命名方式,例如 1.0.0,2.0.0 *' +echo '* 参数3(可选):打包服务其地址,比如 dcospkg.stable.idcos.net, 默认是 dcospkg.stable.idcos.net *' +echo '************************************************************************************************' + +PKG_SERVER="dcospkg.stable.idcos.net" + +if [ $# -lt 2 ];then + echo "??????????????????请输入包名称和包版本号????????????????????" + exit +fi + +git_branch=`echo $1 | sed -E 's/(^[^/]+)?\///g'` + +if [ $git_branch == "master" ];then + BRANCH="" +else + BRANCH="-"$git_branch +fi + +echo $BRANCH + +cd pkgcmd + +if [ $# -eq 2 ];then + + echo "ant -f build.xml -Dbranch=$BRANCH -Dpackage.version=$2 -Dpackage.server=$PKG_SERVER" + ant -f build.xml -Dbranch=$BRANCH -Dpackage.version=$2 -Dpackage.server=$PKG_SERVER + +elif [ $# -eq 3 ];then + + echo "ant -f build.xml -Dbranch=$BRANCH -Dpackage.version=$2 -Dpackage.server=$3" + ant -f build.xml -Dbranch=$BRANCH -Dpackage.version=$2 -Dpackage.server=$3 + +else + echo "??????????????????请输入包名称和包版本号????????????????????" +fi + + diff --git a/cyclone-web/pkgcmd/assembly/conf/nginx.conf b/cyclone-web/pkgcmd/assembly/conf/nginx.conf new file mode 100644 index 0000000000000000000000000000000000000000..99860953a02737ba0406ad7a1a74bb2a2062e026 --- /dev/null +++ b/cyclone-web/pkgcmd/assembly/conf/nginx.conf @@ -0,0 +1,56 @@ +server { + set $api_server http://127.0.0.1:8080; + set $root /usr/yunji/cloudres-web/www; + + listen 80; + server_name res.gf.com.cn; + + #charset koi8-r; + #access_log /var/log/nginx/log/host.access.log main; + + location / { + root $root; + index index.html index.htm; + } + location ~ /dcos { proxy_pass $api_server; } + + location ~ /sys { + proxy_pass $api_server; + } + + location ~/auth { + proxy_pass $api_server; + } + + location ~ /api { + proxy_pass $api_server; + } + + #error_page 404 /404.html; + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } + # proxy the PHP scripts to Apache listening on 127.0.0.1:80 + # + #location ~ \.php$ { + # proxy_pass http://127.0.0.1; + #} + + # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + # + #location ~ \.php$ { + # root html; + # fastcgi_pass 127.0.0.1:9000; + # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} +} \ No newline at end of file diff --git a/cyclone-web/pkgcmd/assembly/postinstall.sh b/cyclone-web/pkgcmd/assembly/postinstall.sh new file mode 100644 index 0000000000000000000000000000000000000000..e8c8124a6f5447dcc8a1226b7d50b5d7ea0fb59c --- /dev/null +++ b/cyclone-web/pkgcmd/assembly/postinstall.sh @@ -0,0 +1,5 @@ +#if [ `readlink -f /etc/nginx/conf.d/default.conf` != "@APP_DIR@/conf/nginx.conf" ]; then +# mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak +# ln -s @APP_DIR@/conf/nginx.conf /etc/nginx/conf.d/default.conf +#fi +#(service nginx status || service nginx start) >/dev/null 2>&1 ||: diff --git a/cyclone-web/pkgcmd/assembly/postuninstall.sh b/cyclone-web/pkgcmd/assembly/postuninstall.sh new file mode 100644 index 0000000000000000000000000000000000000000..dd63077a0802923682ddb9e1d38f416ea32e19d3 --- /dev/null +++ b/cyclone-web/pkgcmd/assembly/postuninstall.sh @@ -0,0 +1,3 @@ +# if [ "$1" -ge "1" ]; then +# pwd +# fi diff --git a/cyclone-web/pkgcmd/assembly/preuninstall.sh b/cyclone-web/pkgcmd/assembly/preuninstall.sh new file mode 100644 index 0000000000000000000000000000000000000000..8600299f56b14ba551122ab5c2ccfbf51ad3bedf --- /dev/null +++ b/cyclone-web/pkgcmd/assembly/preuninstall.sh @@ -0,0 +1,5 @@ +# if [ "$1" = "0" ]; then +# #service nginx stop >/dev/null 2>&1 ||: +# unlink /etc/nginx/conf.d/default.conf +# rm -rf @APP_DIR@ 2>/dev/null +# fi diff --git a/cyclone-web/pkgcmd/build.xml b/cyclone-web/pkgcmd/build.xml new file mode 100644 index 0000000000000000000000000000000000000000..a9402ee35ddfcf1220d1a8727aa6b83c2ed1ae20 --- /dev/null +++ b/cyclone-web/pkgcmd/build.xml @@ -0,0 +1,198 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project name="update pkg version" default="create-version" basedir=".."> + + <!-- 基本信息 --> + <property name="package.name.prefix" value="cloud-davinci-web" /> + <property name="package.description" value="自动化管理平台UI" /> + <property name="api.service.url" value="http://localhost:8080" /> + + + <property name="package.user" value="root" /> + <property name="package.userGroup" value="root" /> + + <property name="package.type" value="RPM" /> + <property name="package.application" value="APP" /> + <property name="package.release" value="1" /> + <property name="package.platCode" value="x86_64" /> + <property name="package.osName" value="CentOS" /> + <property name="package.osVersion" value="7.1" /> + <property name="install.dir" value="/usr/yunji" /> + <property name="package.service.url" value="http://${package.server}:8080/pkg/packFile/createVersion" /> + + <!-- 有依赖顺序,这里只能放在后面 --> + <property name="package.name" value="${package.name.prefix}${branch}" /> + <property name="app.dir" value="${install.dir}/${package.name}" /> + + + + <echo message ="package.name = ${package.name}" /> + <echo message ="package.description = ${package.description}" /> + <echo message ="package.type = ${package.type}" /> + <echo message ="package.application = ${package.application}" /> + <echo message ="package.release = ${package.release}" /> + <echo message ="package.platCode = ${package.platCode}" /> + <echo message ="package.osName = ${package.osName}" /> + <echo message ="package.osVersion = ${package.osVersion}" /> + <echo message ="install.dir = ${install.dir}" /> + <echo message ="app.dir = ${app.dir}" /> + <echo message ="package.service.url = ${package.service.url}" /> + <echo message ="package.user = ${package.user}" /> + <echo message ="package.userGroup = ${package.userGroup}" /> + <echo message ="api.service.url = ${api.service.url}" /> + + + <!-- 可变参数 --> + <property environment="env"/> + <property name="bin.dir" value="${basedir}/bin" /> + <property name="assembly.dir" value="${basedir}/pkgcmd/assembly" /> + <property name="temp.dir" value="${basedir}/temp" /> + <property name="current.dir" value="${basedir}/pkgcmd" /> + + + <condition property="osfamily-unix"> + <os family="unix" /> + </condition> + <condition property="osfamily-windows"> + <os family="windows" /> + </condition> + + <!-- 初始化环境目录 --> + <target name="enviroment-prepare"> + + <echo message="初始打包目录:${temp.dir}/{bin,idcos,www,conf,doc}" /> + + <mkdir dir="${temp.dir}" /> + <mkdir dir="${temp.dir}/bin" /> + <mkdir dir="${temp.dir}/idcos" /> + <mkdir dir="${temp.dir}/www" /> + <mkdir dir="${temp.dir}/conf" /> + <mkdir dir="${temp.dir}/doc" /> + </target> + + <!-- 环境编译 --> + <target name="complie" depends="enviroment-prepare"> + <echo message="开始调用${current.dir}/complie.sh 脚本进行编译" /> + <exec executable="sh" failonerror="true"> + <arg value="${current.dir}/complie.sh" /> + </exec> + </target> + + <!-- copy文件 --> + <target name="copy-package-resource" depends="enviroment-prepare"> + + <echo message="开始拷贝资源和配置文件到打包目录:${temp.dir}" /> + + <copy todir="${temp.dir}"> + <fileset dir="${assembly.dir}"> + <include name="*.sh" /> + </fileset> + </copy> + + <copy todir="${temp.dir}/conf"> + <fileset dir="${assembly.dir}/conf"> + <include name="*" /> + </fileset> + </copy> + + + </target> + + + <!-- shell脚本替换 --> + <target name="shell-script-replace" depends="copy-package-resource"> + <echo message="对打包目录中的sh脚本内容进行批量替换:${temp.dir}/*.sh" /> + + <!--替换sh脚本 --> + <replace dir="${temp.dir}" token="@APP_DIR@" value="${app.dir}" includes="*.sh" encoding="UTF-8"/> + <replace dir="${temp.dir}" token="@PACKAGE_NAME@" value="${package.name}" includes="*.sh" encoding="UTF-8"/> + <replace dir="${temp.dir}" token="@APP_NAME@" value="${package.name.prefix}" includes="*.sh" encoding="UTF-8"/> + + <!-- 替换conf配置文件 --> + <replace dir="${temp.dir}/conf" token="@APP_DIR@" value="${app.dir}" includes="*" encoding="UTF-8"/> + <replace dir="${temp.dir}/conf" token="@APP_NAME@" value="${package.name.prefix}" includes="*" encoding="UTF-8"/> + <replace dir="${temp.dir}/conf" token="@PACKAGE_NAME@" value="${package.name}" includes="*" encoding="UTF-8"/> + <replace dir="${temp.dir}/conf" token="@API_SERVICE_URL@" value="${api.service.url}" includes="*" encoding="UTF-8"/> + + <move todir="${temp.dir}/idcos"> + <fileset dir="${temp.dir}"> + <include name="*.sh"/> + </fileset> + </move> + + </target> + + + <!-- 软件打包 --> + <target name="package-zip" depends="enviroment-prepare,shell-script-replace"> + + <echo message="开始打包目录中的文件进行打包:${current.dir}/package.sh 目标文件:${package.name}.zip" /> + + <exec executable="sh" failonerror="true"> + <arg value="${current.dir}/package.sh" /> + <arg value="${package.name}.zip" /> + </exec> + + </target> + + + <!-- 上传软件仓库 --> + <target name="upload-package" depends="complie,copy-package-resource,shell-script-replace,package-zip"> + <echo message="开始上传软件包:${package.name}.zip" /> + + <echo message="curl -v -F file=@${temp.dir}/${package.name}.zip -F name=${package.name} -F version=${package.version} -F description=${package.description} -F type=${package.type} -F application=${package.application} -F release=${package.release} -F installDir=${install.dir} -F platCode=${package.platCode} -F osName=${package.osName} -F osVersion=${package.osVersion} ${package.service.url} -F user=${package.user} -F userGroup=${package.userGroup}" /> + + <exec executable="curl" failonerror="true" outputproperty="upload-package.result"> + <arg value="-F" /> + <arg value="file=@${temp.dir}/${package.name}.zip" /> + <arg value="-F" /> + <arg value="name=${package.name}" /> + <arg value="-F" /> + <arg value="version=${package.version}" /> + <arg value="-F" /> + <arg value="description=${package.description}" /> + <arg value="-F" /> + <arg value="type=${package.type}" /> + <arg value="-F" /> + <arg value="application=${package.application}" /> + <arg value="-F" /> + <arg value="release=${package.release}" /> + <arg value="-F" /> + <arg value="installDir=${install.dir}" /> + <arg value="-F" /> + <arg value="platCode=${package.platCode}" /> + <arg value="-F" /> + <arg value="osName=${package.osName}" /> + <arg value="-F" /> + <arg value="osVersion=${package.osVersion}" /> + <arg value="-F" /> + <arg value="user=${package.user}" /> + <arg value="-F" /> + <arg value="userGroup=${package.userGroup}" /> + <arg value="${package.service.url}" /> + </exec> + + <fail message="软件包上传失败! ${upload-package.result}"> + <condition> + <not> + <contains substring="&quot;status&quot;:&quot;success&quot;" string="${upload-package.result}"> + </contains> + </not> + </condition> + </fail> + + </target> + + + + <target name="clean"> + <echo message="开始清除构建过程中产生的数据" /> + <delete dir="${temp.dir}"/> + </target> + + + <!-- 创建版本 --> + <target name="create-version" depends="clean,upload-package"> + </target> + + +</project> diff --git a/cyclone-web/pkgcmd/complie.sh b/cyclone-web/pkgcmd/complie.sh new file mode 100644 index 0000000000000000000000000000000000000000..b4b8f2dec5db54349bb2ccf083aac3b3e2600ade --- /dev/null +++ b/cyclone-web/pkgcmd/complie.sh @@ -0,0 +1,8 @@ +CURRENT_DIR=`pwd` +echo "npm run build 开始编译" +npm run build + +echo "执行编译脚本,当前工作目录:$CURRENT_DIR" +cp -r build/* temp/www + + diff --git a/cyclone-web/pkgcmd/package.sh b/cyclone-web/pkgcmd/package.sh new file mode 100644 index 0000000000000000000000000000000000000000..5f3febee35c3d3208bcd89c31b67d03a98f25e42 --- /dev/null +++ b/cyclone-web/pkgcmd/package.sh @@ -0,0 +1,5 @@ + +CURRENT_DIR=`pwd` +echo "执行打包脚本,当前工作目录:$CURRENT_DIR" +cd $CURRENT_DIR/temp +zip -r -q $1 * \ No newline at end of file diff --git a/cyclone-web/server/.env b/cyclone-web/server/.env new file mode 100644 index 0000000000000000000000000000000000000000..ff198422c2e413be6d185043e4cd5fc0ca5cc5ac --- /dev/null +++ b/cyclone-web/server/.env @@ -0,0 +1,5 @@ +DBHOST=192.168.1.2 +DBPORT=3306 +DBUSER=admin +DBPWD= +DB= \ No newline at end of file diff --git a/cyclone-web/server/index.js b/cyclone-web/server/index.js new file mode 100644 index 0000000000000000000000000000000000000000..974eb7d1d55070b244978510b6f1cf6bbffcb857 --- /dev/null +++ b/cyclone-web/server/index.js @@ -0,0 +1,80 @@ +/* eslint consistent-return:0 */ +const express = require('express'); +const logger = require('./logger'); +const argv = require('minimist')(process.argv.slice(2)); +const resolve = require('path').resolve; +const app = express(); +const bodyParser = require('body-parser'); +// require('dotenv').config(); + +const FrontendServer = function(app) { + const frontend = require('./middlewares/frontendMiddleware'); + const proxy = require('./middlewares/proxyMiddleware'); + // If you need a backend, e.g. an API, add your custom backend-specific middleware here + // app.use('/api', myApi); + + // Proxy back-end API + proxy(app, { + config: resolve(process.cwd(), 'proxy.json') + }); + + // In production we need to pass these values in instead of relying on webpack + frontend(app, { + outputPath: resolve(process.cwd(), 'build'), + publicPath: '/' + }); +}; + +const MockServer = function(app) { + const globSync = require('glob').sync; + const mocks = globSync('./mocks/**/*.js', { + cwd: __dirname + }).map(require); + const morgan = require('morgan'); + + app.use(morgan('dev')); + mocks.forEach(route => { + route(app); + }); +}; + +const Run = function() { + const isDev = process.env.NODE_ENV !== 'production'; + const ngrok = + (isDev && process.env.ENABLE_TUNNEL) || argv.tunnel + ? require('ngrok') + : false; + // get the intended port number, use port 3000 if not provided + const port = argv.port || process.env.PORT || 3000; + + if (process.env.MOCK === 'true') { + MockServer(app); + } + + FrontendServer(app); + + // Start your app. + app.listen(port, err => { + if (err) { + return logger.error(err.message); + } + + // Connect to ngrok in dev mode + if (ngrok) { + ngrok.connect( + port, + (innerErr, url) => { + if (innerErr) { + return logger.error(innerErr); + } + + logger.appStarted(port, url); + } + ); + } else { + logger.appStarted(port); + } + }); +}; + +Run(); diff --git a/cyclone-web/server/logger.js b/cyclone-web/server/logger.js new file mode 100644 index 0000000000000000000000000000000000000000..9e7c30a3f6288108a54fb8abbef36ab8d1b6a35d --- /dev/null +++ b/cyclone-web/server/logger.js @@ -0,0 +1,47 @@ +/* eslint-disable no-console */ + +const chalk = require('chalk'); +const ip = require('ip'); + +const divider = chalk.gray('\n-----------------------------------'); + +/** + * Logger middleware, you can customize it to make messages more personal + */ +const logger = { + + // Called whenever there's an error on the server we want to print + error: (err) => { + console.error(chalk.red(err)); + }, + + proxyReversed: (api, endpoints) => { + console.log(` +Proxy to ${chalk.bold(`${api}`)} ${chalk.green('✓')}${divider}`); + + endpoints.forEach((endpoint) => { + console.log(`${chalk.magenta(`${endpoint}`)}`); + }); + console.log(chalk.gray('-----------------------------------\n')); + }, + + // Called when express.js app starts on given port w/o errors + appStarted: (port, tunnelStarted) => { + console.log(`Server started ${chalk.green('✓')}`); + + // If the tunnel started, log that and the URL it's available at + if (tunnelStarted) { + console.log(`Tunnel initialised ${chalk.green('✓')}`); + } + + console.log(` +${chalk.bold('Access URLs:')}${divider} +Localhost: ${chalk.magenta(`http://localhost:${port}`)} + LAN: ${chalk.magenta(`http://${ip.address()}:${port}`) + +(tunnelStarted ? `\n Proxy: ${chalk.magenta(tunnelStarted)}` : '')}${divider} +${chalk.blue(`Press ${chalk.italic('CTRL-C')} to stop`)} + `); + }, +}; + +module.exports = logger; diff --git a/cyclone-web/server/middlewares/frontendMiddleware.js b/cyclone-web/server/middlewares/frontendMiddleware.js new file mode 100644 index 0000000000000000000000000000000000000000..9331e12508c9e6d73a403e730734119934f439cf --- /dev/null +++ b/cyclone-web/server/middlewares/frontendMiddleware.js @@ -0,0 +1,73 @@ +/* eslint-disable global-require */ +const express = require('express'); +const path = require('path'); +const compression = require('compression'); +const pkg = require(path.resolve(process.cwd(), 'package.json')); + +// Dev middleware +const addDevMiddlewares = (app, webpackConfig) => { + const webpack = require('webpack'); + const webpackDevMiddleware = require('webpack-dev-middleware'); + const webpackHotMiddleware = require('webpack-hot-middleware'); + const compiler = webpack(webpackConfig); + const middleware = webpackDevMiddleware(compiler, { + noInfo: true, + publicPath: webpackConfig.output.publicPath, + silent: true, + stats: 'errors-only', + }); + + app.use(middleware); + app.use(webpackHotMiddleware(compiler)); + + // Since webpackDevMiddleware uses memory-fs internally to store build + // artifacts, we use it instead + const fs = middleware.fileSystem; + + if (pkg.dllPlugin) { + app.get(/\.dll\.js$/, (req, res) => { + const filename = req.path.replace(/^\//, ''); + res.sendFile(path.join(process.cwd(), pkg.dllPlugin.path, filename)); + }); + } + + app.get('*', (req, res) => { + fs.readFile(path.join(compiler.outputPath, 'index.html'), (err, file) => { + if (err) { + res.sendStatus(404); + } else { + res.send(file.toString()); + } + }); + }); +}; + +// Production middlewares +const addProdMiddlewares = (app, options) => { + const publicPath = options.publicPath || '/'; + const outputPath = options.outputPath || path.resolve(process.cwd(), 'build'); + + // compression middleware compresses your server responses which makes them + // smaller (applies also to assets). You can read more about that technique + // and other good practices on official Express.js docs http://mxs.is/googmy + app.use(compression()); + app.use(publicPath, express.static(outputPath)); + + app.get('*', (req, res) => res.sendFile(path.resolve(outputPath, 'index.html'))); +}; + +/** + * Front-end middleware + */ +module.exports = (app, options) => { + const isProd = process.env.NODE_ENV === 'production'; + + if (isProd) { + addProdMiddlewares(app, options); + } else { + const webpackConfig = require('../../internals/webpack/webpack.dev.babel'); + addDevMiddlewares(app, webpackConfig); + } + + return app; +}; diff --git a/cyclone-web/server/middlewares/proxyMiddleware.js b/cyclone-web/server/middlewares/proxyMiddleware.js new file mode 100644 index 0000000000000000000000000000000000000000..a43f30997aa9d8d6a0bc7906674bbda653f735dd --- /dev/null +++ b/cyclone-web/server/middlewares/proxyMiddleware.js @@ -0,0 +1,81 @@ +/* eslint-disable global-require */ +const proxy = require('http-proxy-middleware'); +const logger = require('../logger'); +const resolve = require('path').resolve; +const fs = require("fs"); +const chalk = require('chalk'); +const https = require('https'); + +// Proxy middleware +const addProxyMiddlewares = (app, options) => { + + let customConfig = {}, config; + + const customProxyPath = resolve(process.cwd(), '.proxy'); + + if (fs.existsSync(customProxyPath)) { + try { + customConfig = JSON.parse(fs.readFileSync(customProxyPath, 'utf-8')); + } catch (error) { + logger.error("parse ./.proxy: " + error.message); + customConfig = {}; + } + } + + try { + services = require(resolve(process.cwd(), 'proxy.json')); + } catch (error) { + logger.error("parse ./proxy.json: " + error.message); + services = {}; + } + + try { + + const servicesKeys = Object.keys(services); + const customKeys = Object.keys(customConfig); + + for (var attr in customConfig) { + services[attr] = customConfig[attr]; + } + + const finalKeys = customKeys.concat(servicesKeys); + console.log("proxy config:"); + console.log(JSON.stringify(services, 0, 4)); + + finalKeys.forEach((key) => { + const service = services[key]; + const api = service.api; + const loglevel = service.logLevel || 'info'; + const Proxy = proxy({ + target: api, + logLevel: loglevel, + changeOrigin: true + //secure: false + // agent: new https.Agent({ + // rejectUnauthorized: true, + // strictSSL: false + // }) + }); + + service.endpoints.forEach((endpoint) => { + app.all(endpoint, function(req, res, next) { + console.log(`${chalk.bold("->")}: ${chalk.bold(req.url)} to ${chalk.gray(api)}`); + return Proxy(req, res, next); + }); + }); + + // log + logger.proxyReversed(api, service.endpoints); + }); + } catch (error) { + logger.error("proxy config error: " + error.message); + } +}; + +/** + * Proxy middleware + */ +module.exports = (app, options) => { + addProxyMiddlewares(app, options); + return app; +}; diff --git a/cyclone-web/server/mocks/zone.js b/cyclone-web/server/mocks/zone.js new file mode 100644 index 0000000000000000000000000000000000000000..ba1ce5f8dfdd8fda543be9bdcbc1912ff5123060 --- /dev/null +++ b/cyclone-web/server/mocks/zone.js @@ -0,0 +1,62 @@ +/*jshint node:true*/ + +module.exports = function(app) { + var express = require('express'); + var excerptsRouter = express.Router(); + + var data = [ + {id: 1, name: 'zone-1'}, + {id: 2, name: 'zone-2'}, + {id: 3, name: 'zone-3'}, + ]; + + excerptsRouter.get('/', function(req, res) { + res.send(data); + }); + + excerptsRouter.post('/web', function(req, res) { + // var resp = JSON.stringify(body); + // res.status(201).end(resp); + }); + + excerptsRouter.get('/:id', function(req, res) { + // var excerpt = null; + // excerpts.forEach(function(item){ + // if (item.id === parseInt(req.params.id)) { + // excerpt = item; + // } + // }); + + // if (excerpt) { + // res.send(excerpt); + // } else { + // res.status(204).end({ + // message: "record not found" + // }); + // } + }); + + excerptsRouter.put('/:id', function(req, res) { + // res.send({ + // 'excerpts': { + // id: req.params.id + // } + // }); + }); + + excerptsRouter.delete('/:id', function(req, res) { + // res.status(204).end(); + }); + + // The POST and PUT call will not contain a request body + // because the body-parser is not included by default. + // To use req.body, run: + + // npm install --save-dev body-parser + + // After installing, you need to `use` the body-parser for + // this mock uncommenting the following line: + // + app.use('/api/zone', require('body-parser').json()); + app.use('/api/zone', excerptsRouter); +}; diff --git a/cyclone-web/vendor/animate/animate.css b/cyclone-web/vendor/animate/animate.css new file mode 100644 index 0000000000000000000000000000000000000000..5f1bedbfa4716cf9b24f0615c58601d0401f05d3 --- /dev/null +++ b/cyclone-web/vendor/animate/animate.css @@ -0,0 +1,21 @@ +@keyframes sideMenuSlideIn { + from { + transform: translate3d(-100%, 0, 0); + opacity: .6; + } + + to { + transform: translate3d(0, 0, 0); + opacity: 1; + } +} + +@keyframes slideOutLeft { + from { + transform: translate3d(0, 0, 0); + } + + to { + transform: translate3d(-100%, 0, 0); + } +} \ No newline at end of file diff --git a/cyclone-web/vendor/antd/antd.css b/cyclone-web/vendor/antd/antd.css new file mode 100644 index 0000000000000000000000000000000000000000..e18f2b51d6cdc9643b851b8e68e89a259deb092b --- /dev/null +++ b/cyclone-web/vendor/antd/antd.css @@ -0,0 +1,21028 @@ +/*! + * + * antd v3.9.3 + * + * Copyright 2015-present, Alipay, Inc. + * All rights reserved. + * + */ +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +/* stylelint-disable at-rule-no-unknown */ +@font-face { + font-family: "Chinese Quote"; + src: local("PingFang SC"), local("SimSun"); + unicode-range: U+2018, U+2019, U+201c, U+201d; +} +html, +body { + width: 100%; + height: 100%; +} +input::-ms-clear, +input::-ms-reveal { + display: none; +} +*, +*::before, +*::after { + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-family: sans-serif; + line-height: 1.15; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + -ms-overflow-style: scrollbar; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +@-ms-viewport { + width: device-width; +} +article, +aside, +dialog, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section { + display: block; +} +body { + margin: 0; + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + background-color: #fff; +} +[tabindex="-1"]:focus { + outline: none !important; +} +hr { + -webkit-box-sizing: content-box; + box-sizing: content-box; + height: 0; + overflow: visible; +} +h1, +h2, +h3, +h4, +h5, +h6 { + margin-top: 0; + margin-bottom: .5em; + color: rgba(0, 0, 0, 0.85); + font-weight: 500; +} +p { + margin-top: 0; + margin-bottom: 1em; +} +abbr[title], +abbr[data-original-title] { + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0; +} +address { + margin-bottom: 1em; + font-style: normal; + line-height: inherit; +} +input[type="text"], +input[type="password"], +input[type="number"], +textarea { + -webkit-appearance: none; +} +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1em; +} +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} +dt { + font-weight: 500; +} +dd { + margin-bottom: .5em; + margin-left: 0; +} +blockquote { + margin: 0 0 1em; +} +dfn { + font-style: italic; +} +b, +strong { + font-weight: bolder; +} +small { + font-size: 80%; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sub { + bottom: -0.25em; +} +sup { + top: -0.5em; +} +a { + color: #1890ff; + background-color: transparent; + text-decoration: none; + outline: none; + cursor: pointer; + -webkit-transition: color .3s; + transition: color .3s; + -webkit-text-decoration-skip: objects; +} +a:focus { + text-decoration: underline; + -webkit-text-decoration-skip: ink; + text-decoration-skip: ink; +} +a:hover { + color: #40a9ff; +} +a:active { + color: #096dd9; +} +a:active, +a:hover { + outline: 0; + text-decoration: none; +} +a[disabled] { + color: rgba(0, 0, 0, 0.25); + cursor: not-allowed; + pointer-events: none; +} +pre, +code, +kbd, +samp { + font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; + font-size: 1em; +} +pre { + margin-top: 0; + margin-bottom: 1em; + overflow: auto; +} +figure { + margin: 0 0 1em; +} +img { + vertical-align: middle; + border-style: none; +} +svg:not(:root) { + overflow: hidden; +} +a, +area, +button, +[role="button"], +input:not([type=range]), +label, +select, +summary, +textarea { + -ms-touch-action: manipulation; + touch-action: manipulation; +} +table { + border-collapse: collapse; +} +caption { + padding-top: .75em; + padding-bottom: .3em; + color: rgba(0, 0, 0, 0.45); + text-align: left; + caption-side: bottom; +} +th { + text-align: inherit; +} +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; + color: inherit; +} +button, +input { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html [type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + padding: 0; + border-style: none; +} +input[type="radio"], +input[type="checkbox"] { + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="date"], +input[type="time"], +input[type="datetime-local"], +input[type="month"] { + -webkit-appearance: listbox; +} +textarea { + overflow: auto; + resize: vertical; +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: .5em; + font-size: 1.5em; + line-height: inherit; + color: inherit; + white-space: normal; +} +progress { + vertical-align: baseline; +} +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} +[type="search"] { + outline-offset: -2px; + -webkit-appearance: none; +} +[type="search"]::-webkit-search-cancel-button, +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; +} +output { + display: inline-block; +} +summary { + display: list-item; +} +template { + display: none; +} +[hidden] { + display: none !important; +} +mark { + padding: .2em; + background-color: #feffe6; +} +::-moz-selection { + background: #1890ff; + color: #fff; +} +::selection { + background: #1890ff; + color: #fff; +} +.clearfix { + zoom: 1; +} +.clearfix:before, +.clearfix:after { + content: ""; + display: table; +} +.clearfix:after { + clear: both; +} +.anticon { + display: inline-block; + font-style: normal; + vertical-align: -0.125em; + text-align: center; + text-transform: none; + line-height: 0; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.anticon > * { + line-height: 1; +} +.anticon svg { + display: inline-block; +} +.anticon:before { + display: none; +} +.anticon .anticon-icon { + display: block; +} +.anticon-spin:before { + display: inline-block; + -webkit-animation: loadingCircle 1s infinite linear; + animation: loadingCircle 1s infinite linear; +} +.anticon-spin { + display: inline-block; + -webkit-animation: loadingCircle 1s infinite linear; + animation: loadingCircle 1s infinite linear; +} +.fade-enter, +.fade-appear { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.fade-leave { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.fade-enter.fade-enter-active, +.fade-appear.fade-appear-active { + -webkit-animation-name: antFadeIn; + animation-name: antFadeIn; + -webkit-animation-play-state: running; + animation-play-state: running; +} +.fade-leave.fade-leave-active { + -webkit-animation-name: antFadeOut; + animation-name: antFadeOut; + -webkit-animation-play-state: running; + animation-play-state: running; + pointer-events: none; +} +.fade-enter, +.fade-appear { + opacity: 0; + -webkit-animation-timing-function: linear; + animation-timing-function: linear; +} +.fade-leave { + -webkit-animation-timing-function: linear; + animation-timing-function: linear; +} +@-webkit-keyframes antFadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@keyframes antFadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@-webkit-keyframes antFadeOut { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} +@keyframes antFadeOut { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} +.move-up-enter, +.move-up-appear { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.move-up-leave { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.move-up-enter.move-up-enter-active, +.move-up-appear.move-up-appear-active { + -webkit-animation-name: antMoveUpIn; + animation-name: antMoveUpIn; + -webkit-animation-play-state: running; + animation-play-state: running; +} +.move-up-leave.move-up-leave-active { + -webkit-animation-name: antMoveUpOut; + animation-name: antMoveUpOut; + -webkit-animation-play-state: running; + animation-play-state: running; + pointer-events: none; +} +.move-up-enter, +.move-up-appear { + opacity: 0; + -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.move-up-leave { + -webkit-animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34); + animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34); +} +.move-down-enter, +.move-down-appear { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.move-down-leave { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.move-down-enter.move-down-enter-active, +.move-down-appear.move-down-appear-active { + -webkit-animation-name: antMoveDownIn; + animation-name: antMoveDownIn; + -webkit-animation-play-state: running; + animation-play-state: running; +} +.move-down-leave.move-down-leave-active { + -webkit-animation-name: antMoveDownOut; + animation-name: antMoveDownOut; + -webkit-animation-play-state: running; + animation-play-state: running; + pointer-events: none; +} +.move-down-enter, +.move-down-appear { + opacity: 0; + -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.move-down-leave { + -webkit-animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34); + animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34); +} +.move-left-enter, +.move-left-appear { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.move-left-leave { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.move-left-enter.move-left-enter-active, +.move-left-appear.move-left-appear-active { + -webkit-animation-name: antMoveLeftIn; + animation-name: antMoveLeftIn; + -webkit-animation-play-state: running; + animation-play-state: running; +} +.move-left-leave.move-left-leave-active { + -webkit-animation-name: antMoveLeftOut; + animation-name: antMoveLeftOut; + -webkit-animation-play-state: running; + animation-play-state: running; + pointer-events: none; +} +.move-left-enter, +.move-left-appear { + opacity: 0; + -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.move-left-leave { + -webkit-animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34); + animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34); +} +.move-right-enter, +.move-right-appear { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.move-right-leave { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.move-right-enter.move-right-enter-active, +.move-right-appear.move-right-appear-active { + -webkit-animation-name: antMoveRightIn; + animation-name: antMoveRightIn; + -webkit-animation-play-state: running; + animation-play-state: running; +} +.move-right-leave.move-right-leave-active { + -webkit-animation-name: antMoveRightOut; + animation-name: antMoveRightOut; + -webkit-animation-play-state: running; + animation-play-state: running; + pointer-events: none; +} +.move-right-enter, +.move-right-appear { + opacity: 0; + -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.move-right-leave { + -webkit-animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34); + animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34); +} +@-webkit-keyframes antMoveDownIn { + 0% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateY(100%); + transform: translateY(100%); + opacity: 0; + } + 100% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateY(0%); + transform: translateY(0%); + opacity: 1; + } +} +@keyframes antMoveDownIn { + 0% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateY(100%); + transform: translateY(100%); + opacity: 0; + } + 100% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateY(0%); + transform: translateY(0%); + opacity: 1; + } +} +@-webkit-keyframes antMoveDownOut { + 0% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateY(0%); + transform: translateY(0%); + opacity: 1; + } + 100% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateY(100%); + transform: translateY(100%); + opacity: 0; + } +} +@keyframes antMoveDownOut { + 0% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateY(0%); + transform: translateY(0%); + opacity: 1; + } + 100% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateY(100%); + transform: translateY(100%); + opacity: 0; + } +} +@-webkit-keyframes antMoveLeftIn { + 0% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + opacity: 0; + } + 100% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0%); + transform: translateX(0%); + opacity: 1; + } +} +@keyframes antMoveLeftIn { + 0% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + opacity: 0; + } + 100% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0%); + transform: translateX(0%); + opacity: 1; + } +} +@-webkit-keyframes antMoveLeftOut { + 0% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0%); + transform: translateX(0%); + opacity: 1; + } + 100% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + opacity: 0; + } +} +@keyframes antMoveLeftOut { + 0% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0%); + transform: translateX(0%); + opacity: 1; + } + 100% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + opacity: 0; + } +} +@-webkit-keyframes antMoveRightIn { + 0% { + opacity: 0; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(100%); + transform: translateX(100%); + } + 100% { + opacity: 1; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0%); + transform: translateX(0%); + } +} +@keyframes antMoveRightIn { + 0% { + opacity: 0; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(100%); + transform: translateX(100%); + } + 100% { + opacity: 1; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0%); + transform: translateX(0%); + } +} +@-webkit-keyframes antMoveRightOut { + 0% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0%); + transform: translateX(0%); + opacity: 1; + } + 100% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(100%); + transform: translateX(100%); + opacity: 0; + } +} +@keyframes antMoveRightOut { + 0% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(0%); + transform: translateX(0%); + opacity: 1; + } + 100% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateX(100%); + transform: translateX(100%); + opacity: 0; + } +} +@-webkit-keyframes antMoveUpIn { + 0% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateY(-100%); + transform: translateY(-100%); + opacity: 0; + } + 100% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateY(0%); + transform: translateY(0%); + opacity: 1; + } +} +@keyframes antMoveUpIn { + 0% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateY(-100%); + transform: translateY(-100%); + opacity: 0; + } + 100% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateY(0%); + transform: translateY(0%); + opacity: 1; + } +} +@-webkit-keyframes antMoveUpOut { + 0% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateY(0%); + transform: translateY(0%); + opacity: 1; + } + 100% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateY(-100%); + transform: translateY(-100%); + opacity: 0; + } +} +@keyframes antMoveUpOut { + 0% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateY(0%); + transform: translateY(0%); + opacity: 1; + } + 100% { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + -webkit-transform: translateY(-100%); + transform: translateY(-100%); + opacity: 0; + } +} +@-webkit-keyframes loadingCircle { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@keyframes loadingCircle { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +[ant-click-animating], +[ant-click-animating-without-extra-node] { + position: relative; +} +[ant-click-animating-without-extra-node]:after, +.ant-click-animating-node { + content: ''; + position: absolute; + top: -1px; + left: -1px; + bottom: -1px; + right: -1px; + border-radius: inherit; + border: 0 solid #1890ff; + opacity: 0.2; + -webkit-animation: fadeEffect 2s cubic-bezier(0.08, 0.82, 0.17, 1), waveEffect 0.4s cubic-bezier(0.08, 0.82, 0.17, 1); + animation: fadeEffect 2s cubic-bezier(0.08, 0.82, 0.17, 1), waveEffect 0.4s cubic-bezier(0.08, 0.82, 0.17, 1); + -webkit-animation-fill-mode: forwards; + animation-fill-mode: forwards; + display: block; + pointer-events: none; +} +@-webkit-keyframes waveEffect { + 100% { + top: -6px; + left: -6px; + bottom: -6px; + right: -6px; + border-width: 6px; + } +} +@keyframes waveEffect { + 100% { + top: -6px; + left: -6px; + bottom: -6px; + right: -6px; + border-width: 6px; + } +} +@-webkit-keyframes fadeEffect { + 100% { + opacity: 0; + } +} +@keyframes fadeEffect { + 100% { + opacity: 0; + } +} +.slide-up-enter, +.slide-up-appear { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.slide-up-leave { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.slide-up-enter.slide-up-enter-active, +.slide-up-appear.slide-up-appear-active { + -webkit-animation-name: antSlideUpIn; + animation-name: antSlideUpIn; + -webkit-animation-play-state: running; + animation-play-state: running; +} +.slide-up-leave.slide-up-leave-active { + -webkit-animation-name: antSlideUpOut; + animation-name: antSlideUpOut; + -webkit-animation-play-state: running; + animation-play-state: running; + pointer-events: none; +} +.slide-up-enter, +.slide-up-appear { + opacity: 0; + -webkit-animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); + animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); +} +.slide-up-leave { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); +} +.slide-down-enter, +.slide-down-appear { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.slide-down-leave { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.slide-down-enter.slide-down-enter-active, +.slide-down-appear.slide-down-appear-active { + -webkit-animation-name: antSlideDownIn; + animation-name: antSlideDownIn; + -webkit-animation-play-state: running; + animation-play-state: running; +} +.slide-down-leave.slide-down-leave-active { + -webkit-animation-name: antSlideDownOut; + animation-name: antSlideDownOut; + -webkit-animation-play-state: running; + animation-play-state: running; + pointer-events: none; +} +.slide-down-enter, +.slide-down-appear { + opacity: 0; + -webkit-animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); + animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); +} +.slide-down-leave { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); +} +.slide-left-enter, +.slide-left-appear { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.slide-left-leave { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.slide-left-enter.slide-left-enter-active, +.slide-left-appear.slide-left-appear-active { + -webkit-animation-name: antSlideLeftIn; + animation-name: antSlideLeftIn; + -webkit-animation-play-state: running; + animation-play-state: running; +} +.slide-left-leave.slide-left-leave-active { + -webkit-animation-name: antSlideLeftOut; + animation-name: antSlideLeftOut; + -webkit-animation-play-state: running; + animation-play-state: running; + pointer-events: none; +} +.slide-left-enter, +.slide-left-appear { + opacity: 0; + -webkit-animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); + animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); +} +.slide-left-leave { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); +} +.slide-right-enter, +.slide-right-appear { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.slide-right-leave { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.slide-right-enter.slide-right-enter-active, +.slide-right-appear.slide-right-appear-active { + -webkit-animation-name: antSlideRightIn; + animation-name: antSlideRightIn; + -webkit-animation-play-state: running; + animation-play-state: running; +} +.slide-right-leave.slide-right-leave-active { + -webkit-animation-name: antSlideRightOut; + animation-name: antSlideRightOut; + -webkit-animation-play-state: running; + animation-play-state: running; + pointer-events: none; +} +.slide-right-enter, +.slide-right-appear { + opacity: 0; + -webkit-animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); + animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1); +} +.slide-right-leave { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); + animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); +} +@-webkit-keyframes antSlideUpIn { + 0% { + opacity: 0; + -webkit-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: scaleY(0.8); + transform: scaleY(0.8); + } + 100% { + opacity: 1; + -webkit-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: scaleY(1); + transform: scaleY(1); + } +} +@keyframes antSlideUpIn { + 0% { + opacity: 0; + -webkit-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: scaleY(0.8); + transform: scaleY(0.8); + } + 100% { + opacity: 1; + -webkit-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: scaleY(1); + transform: scaleY(1); + } +} +@-webkit-keyframes antSlideUpOut { + 0% { + opacity: 1; + -webkit-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: scaleY(1); + transform: scaleY(1); + } + 100% { + opacity: 0; + -webkit-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: scaleY(0.8); + transform: scaleY(0.8); + } +} +@keyframes antSlideUpOut { + 0% { + opacity: 1; + -webkit-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: scaleY(1); + transform: scaleY(1); + } + 100% { + opacity: 0; + -webkit-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: scaleY(0.8); + transform: scaleY(0.8); + } +} +@-webkit-keyframes antSlideDownIn { + 0% { + opacity: 0; + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; + -webkit-transform: scaleY(0.8); + transform: scaleY(0.8); + } + 100% { + opacity: 1; + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; + -webkit-transform: scaleY(1); + transform: scaleY(1); + } +} +@keyframes antSlideDownIn { + 0% { + opacity: 0; + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; + -webkit-transform: scaleY(0.8); + transform: scaleY(0.8); + } + 100% { + opacity: 1; + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; + -webkit-transform: scaleY(1); + transform: scaleY(1); + } +} +@-webkit-keyframes antSlideDownOut { + 0% { + opacity: 1; + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; + -webkit-transform: scaleY(1); + transform: scaleY(1); + } + 100% { + opacity: 0; + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; + -webkit-transform: scaleY(0.8); + transform: scaleY(0.8); + } +} +@keyframes antSlideDownOut { + 0% { + opacity: 1; + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; + -webkit-transform: scaleY(1); + transform: scaleY(1); + } + 100% { + opacity: 0; + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; + -webkit-transform: scaleY(0.8); + transform: scaleY(0.8); + } +} +@-webkit-keyframes antSlideLeftIn { + 0% { + opacity: 0; + -webkit-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: scaleX(0.8); + transform: scaleX(0.8); + } + 100% { + opacity: 1; + -webkit-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: scaleX(1); + transform: scaleX(1); + } +} +@keyframes antSlideLeftIn { + 0% { + opacity: 0; + -webkit-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: scaleX(0.8); + transform: scaleX(0.8); + } + 100% { + opacity: 1; + -webkit-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: scaleX(1); + transform: scaleX(1); + } +} +@-webkit-keyframes antSlideLeftOut { + 0% { + opacity: 1; + -webkit-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: scaleX(1); + transform: scaleX(1); + } + 100% { + opacity: 0; + -webkit-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: scaleX(0.8); + transform: scaleX(0.8); + } +} +@keyframes antSlideLeftOut { + 0% { + opacity: 1; + -webkit-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: scaleX(1); + transform: scaleX(1); + } + 100% { + opacity: 0; + -webkit-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: scaleX(0.8); + transform: scaleX(0.8); + } +} +@-webkit-keyframes antSlideRightIn { + 0% { + opacity: 0; + -webkit-transform-origin: 100% 0%; + transform-origin: 100% 0%; + -webkit-transform: scaleX(0.8); + transform: scaleX(0.8); + } + 100% { + opacity: 1; + -webkit-transform-origin: 100% 0%; + transform-origin: 100% 0%; + -webkit-transform: scaleX(1); + transform: scaleX(1); + } +} +@keyframes antSlideRightIn { + 0% { + opacity: 0; + -webkit-transform-origin: 100% 0%; + transform-origin: 100% 0%; + -webkit-transform: scaleX(0.8); + transform: scaleX(0.8); + } + 100% { + opacity: 1; + -webkit-transform-origin: 100% 0%; + transform-origin: 100% 0%; + -webkit-transform: scaleX(1); + transform: scaleX(1); + } +} +@-webkit-keyframes antSlideRightOut { + 0% { + opacity: 1; + -webkit-transform-origin: 100% 0%; + transform-origin: 100% 0%; + -webkit-transform: scaleX(1); + transform: scaleX(1); + } + 100% { + opacity: 0; + -webkit-transform-origin: 100% 0%; + transform-origin: 100% 0%; + -webkit-transform: scaleX(0.8); + transform: scaleX(0.8); + } +} +@keyframes antSlideRightOut { + 0% { + opacity: 1; + -webkit-transform-origin: 100% 0%; + transform-origin: 100% 0%; + -webkit-transform: scaleX(1); + transform: scaleX(1); + } + 100% { + opacity: 0; + -webkit-transform-origin: 100% 0%; + transform-origin: 100% 0%; + -webkit-transform: scaleX(0.8); + transform: scaleX(0.8); + } +} +.swing-enter, +.swing-appear { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.swing-enter.swing-enter-active, +.swing-appear.swing-appear-active { + -webkit-animation-name: antSwingIn; + animation-name: antSwingIn; + -webkit-animation-play-state: running; + animation-play-state: running; +} +@-webkit-keyframes antSwingIn { + 0%, + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + 20% { + -webkit-transform: translateX(-10px); + transform: translateX(-10px); + } + 40% { + -webkit-transform: translateX(10px); + transform: translateX(10px); + } + 60% { + -webkit-transform: translateX(-5px); + transform: translateX(-5px); + } + 80% { + -webkit-transform: translateX(5px); + transform: translateX(5px); + } +} +@keyframes antSwingIn { + 0%, + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + 20% { + -webkit-transform: translateX(-10px); + transform: translateX(-10px); + } + 40% { + -webkit-transform: translateX(10px); + transform: translateX(10px); + } + 60% { + -webkit-transform: translateX(-5px); + transform: translateX(-5px); + } + 80% { + -webkit-transform: translateX(5px); + transform: translateX(5px); + } +} +.zoom-enter, +.zoom-appear { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.zoom-leave { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.zoom-enter.zoom-enter-active, +.zoom-appear.zoom-appear-active { + -webkit-animation-name: antZoomIn; + animation-name: antZoomIn; + -webkit-animation-play-state: running; + animation-play-state: running; +} +.zoom-leave.zoom-leave-active { + -webkit-animation-name: antZoomOut; + animation-name: antZoomOut; + -webkit-animation-play-state: running; + animation-play-state: running; + pointer-events: none; +} +.zoom-enter, +.zoom-appear { + -webkit-transform: scale(0); + -ms-transform: scale(0); + transform: scale(0); + -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.zoom-leave { + -webkit-animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); + animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); +} +.zoom-big-enter, +.zoom-big-appear { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.zoom-big-leave { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.zoom-big-enter.zoom-big-enter-active, +.zoom-big-appear.zoom-big-appear-active { + -webkit-animation-name: antZoomBigIn; + animation-name: antZoomBigIn; + -webkit-animation-play-state: running; + animation-play-state: running; +} +.zoom-big-leave.zoom-big-leave-active { + -webkit-animation-name: antZoomBigOut; + animation-name: antZoomBigOut; + -webkit-animation-play-state: running; + animation-play-state: running; + pointer-events: none; +} +.zoom-big-enter, +.zoom-big-appear { + -webkit-transform: scale(0); + -ms-transform: scale(0); + transform: scale(0); + -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.zoom-big-leave { + -webkit-animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); + animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); +} +.zoom-big-fast-enter, +.zoom-big-fast-appear { + -webkit-animation-duration: 0.1s; + animation-duration: 0.1s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.zoom-big-fast-leave { + -webkit-animation-duration: 0.1s; + animation-duration: 0.1s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.zoom-big-fast-enter.zoom-big-fast-enter-active, +.zoom-big-fast-appear.zoom-big-fast-appear-active { + -webkit-animation-name: antZoomBigIn; + animation-name: antZoomBigIn; + -webkit-animation-play-state: running; + animation-play-state: running; +} +.zoom-big-fast-leave.zoom-big-fast-leave-active { + -webkit-animation-name: antZoomBigOut; + animation-name: antZoomBigOut; + -webkit-animation-play-state: running; + animation-play-state: running; + pointer-events: none; +} +.zoom-big-fast-enter, +.zoom-big-fast-appear { + -webkit-transform: scale(0); + -ms-transform: scale(0); + transform: scale(0); + -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.zoom-big-fast-leave { + -webkit-animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); + animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); +} +.zoom-up-enter, +.zoom-up-appear { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.zoom-up-leave { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.zoom-up-enter.zoom-up-enter-active, +.zoom-up-appear.zoom-up-appear-active { + -webkit-animation-name: antZoomUpIn; + animation-name: antZoomUpIn; + -webkit-animation-play-state: running; + animation-play-state: running; +} +.zoom-up-leave.zoom-up-leave-active { + -webkit-animation-name: antZoomUpOut; + animation-name: antZoomUpOut; + -webkit-animation-play-state: running; + animation-play-state: running; + pointer-events: none; +} +.zoom-up-enter, +.zoom-up-appear { + -webkit-transform: scale(0); + -ms-transform: scale(0); + transform: scale(0); + -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.zoom-up-leave { + -webkit-animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); + animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); +} +.zoom-down-enter, +.zoom-down-appear { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.zoom-down-leave { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.zoom-down-enter.zoom-down-enter-active, +.zoom-down-appear.zoom-down-appear-active { + -webkit-animation-name: antZoomDownIn; + animation-name: antZoomDownIn; + -webkit-animation-play-state: running; + animation-play-state: running; +} +.zoom-down-leave.zoom-down-leave-active { + -webkit-animation-name: antZoomDownOut; + animation-name: antZoomDownOut; + -webkit-animation-play-state: running; + animation-play-state: running; + pointer-events: none; +} +.zoom-down-enter, +.zoom-down-appear { + -webkit-transform: scale(0); + -ms-transform: scale(0); + transform: scale(0); + -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.zoom-down-leave { + -webkit-animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); + animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); +} +.zoom-left-enter, +.zoom-left-appear { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.zoom-left-leave { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.zoom-left-enter.zoom-left-enter-active, +.zoom-left-appear.zoom-left-appear-active { + -webkit-animation-name: antZoomLeftIn; + animation-name: antZoomLeftIn; + -webkit-animation-play-state: running; + animation-play-state: running; +} +.zoom-left-leave.zoom-left-leave-active { + -webkit-animation-name: antZoomLeftOut; + animation-name: antZoomLeftOut; + -webkit-animation-play-state: running; + animation-play-state: running; + pointer-events: none; +} +.zoom-left-enter, +.zoom-left-appear { + -webkit-transform: scale(0); + -ms-transform: scale(0); + transform: scale(0); + -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.zoom-left-leave { + -webkit-animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); + animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); +} +.zoom-right-enter, +.zoom-right-appear { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.zoom-right-leave { + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.zoom-right-enter.zoom-right-enter-active, +.zoom-right-appear.zoom-right-appear-active { + -webkit-animation-name: antZoomRightIn; + animation-name: antZoomRightIn; + -webkit-animation-play-state: running; + animation-play-state: running; +} +.zoom-right-leave.zoom-right-leave-active { + -webkit-animation-name: antZoomRightOut; + animation-name: antZoomRightOut; + -webkit-animation-play-state: running; + animation-play-state: running; + pointer-events: none; +} +.zoom-right-enter, +.zoom-right-appear { + -webkit-transform: scale(0); + -ms-transform: scale(0); + transform: scale(0); + -webkit-animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); + animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1); +} +.zoom-right-leave { + -webkit-animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); + animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86); +} +@-webkit-keyframes antZoomIn { + 0% { + opacity: 0; + -webkit-transform: scale(0.2); + transform: scale(0.2); + } + 100% { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } +} +@keyframes antZoomIn { + 0% { + opacity: 0; + -webkit-transform: scale(0.2); + transform: scale(0.2); + } + 100% { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } +} +@-webkit-keyframes antZoomOut { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -webkit-transform: scale(0.2); + transform: scale(0.2); + } +} +@keyframes antZoomOut { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -webkit-transform: scale(0.2); + transform: scale(0.2); + } +} +@-webkit-keyframes antZoomBigIn { + 0% { + opacity: 0; + -webkit-transform: scale(0.8); + transform: scale(0.8); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } +} +@keyframes antZoomBigIn { + 0% { + opacity: 0; + -webkit-transform: scale(0.8); + transform: scale(0.8); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } +} +@-webkit-keyframes antZoomBigOut { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -webkit-transform: scale(0.8); + transform: scale(0.8); + } +} +@keyframes antZoomBigOut { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -webkit-transform: scale(0.8); + transform: scale(0.8); + } +} +@-webkit-keyframes antZoomUpIn { + 0% { + opacity: 0; + -webkit-transform-origin: 50% 0%; + transform-origin: 50% 0%; + -webkit-transform: scale(0.8); + transform: scale(0.8); + } + 100% { + -webkit-transform-origin: 50% 0%; + transform-origin: 50% 0%; + -webkit-transform: scale(1); + transform: scale(1); + } +} +@keyframes antZoomUpIn { + 0% { + opacity: 0; + -webkit-transform-origin: 50% 0%; + transform-origin: 50% 0%; + -webkit-transform: scale(0.8); + transform: scale(0.8); + } + 100% { + -webkit-transform-origin: 50% 0%; + transform-origin: 50% 0%; + -webkit-transform: scale(1); + transform: scale(1); + } +} +@-webkit-keyframes antZoomUpOut { + 0% { + -webkit-transform-origin: 50% 0%; + transform-origin: 50% 0%; + -webkit-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -webkit-transform-origin: 50% 0%; + transform-origin: 50% 0%; + -webkit-transform: scale(0.8); + transform: scale(0.8); + } +} +@keyframes antZoomUpOut { + 0% { + -webkit-transform-origin: 50% 0%; + transform-origin: 50% 0%; + -webkit-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -webkit-transform-origin: 50% 0%; + transform-origin: 50% 0%; + -webkit-transform: scale(0.8); + transform: scale(0.8); + } +} +@-webkit-keyframes antZoomLeftIn { + 0% { + opacity: 0; + -webkit-transform-origin: 0% 50%; + transform-origin: 0% 50%; + -webkit-transform: scale(0.8); + transform: scale(0.8); + } + 100% { + -webkit-transform-origin: 0% 50%; + transform-origin: 0% 50%; + -webkit-transform: scale(1); + transform: scale(1); + } +} +@keyframes antZoomLeftIn { + 0% { + opacity: 0; + -webkit-transform-origin: 0% 50%; + transform-origin: 0% 50%; + -webkit-transform: scale(0.8); + transform: scale(0.8); + } + 100% { + -webkit-transform-origin: 0% 50%; + transform-origin: 0% 50%; + -webkit-transform: scale(1); + transform: scale(1); + } +} +@-webkit-keyframes antZoomLeftOut { + 0% { + -webkit-transform-origin: 0% 50%; + transform-origin: 0% 50%; + -webkit-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -webkit-transform-origin: 0% 50%; + transform-origin: 0% 50%; + -webkit-transform: scale(0.8); + transform: scale(0.8); + } +} +@keyframes antZoomLeftOut { + 0% { + -webkit-transform-origin: 0% 50%; + transform-origin: 0% 50%; + -webkit-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -webkit-transform-origin: 0% 50%; + transform-origin: 0% 50%; + -webkit-transform: scale(0.8); + transform: scale(0.8); + } +} +@-webkit-keyframes antZoomRightIn { + 0% { + opacity: 0; + -webkit-transform-origin: 100% 50%; + transform-origin: 100% 50%; + -webkit-transform: scale(0.8); + transform: scale(0.8); + } + 100% { + -webkit-transform-origin: 100% 50%; + transform-origin: 100% 50%; + -webkit-transform: scale(1); + transform: scale(1); + } +} +@keyframes antZoomRightIn { + 0% { + opacity: 0; + -webkit-transform-origin: 100% 50%; + transform-origin: 100% 50%; + -webkit-transform: scale(0.8); + transform: scale(0.8); + } + 100% { + -webkit-transform-origin: 100% 50%; + transform-origin: 100% 50%; + -webkit-transform: scale(1); + transform: scale(1); + } +} +@-webkit-keyframes antZoomRightOut { + 0% { + -webkit-transform-origin: 100% 50%; + transform-origin: 100% 50%; + -webkit-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -webkit-transform-origin: 100% 50%; + transform-origin: 100% 50%; + -webkit-transform: scale(0.8); + transform: scale(0.8); + } +} +@keyframes antZoomRightOut { + 0% { + -webkit-transform-origin: 100% 50%; + transform-origin: 100% 50%; + -webkit-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -webkit-transform-origin: 100% 50%; + transform-origin: 100% 50%; + -webkit-transform: scale(0.8); + transform: scale(0.8); + } +} +@-webkit-keyframes antZoomDownIn { + 0% { + opacity: 0; + -webkit-transform-origin: 50% 100%; + transform-origin: 50% 100%; + -webkit-transform: scale(0.8); + transform: scale(0.8); + } + 100% { + -webkit-transform-origin: 50% 100%; + transform-origin: 50% 100%; + -webkit-transform: scale(1); + transform: scale(1); + } +} +@keyframes antZoomDownIn { + 0% { + opacity: 0; + -webkit-transform-origin: 50% 100%; + transform-origin: 50% 100%; + -webkit-transform: scale(0.8); + transform: scale(0.8); + } + 100% { + -webkit-transform-origin: 50% 100%; + transform-origin: 50% 100%; + -webkit-transform: scale(1); + transform: scale(1); + } +} +@-webkit-keyframes antZoomDownOut { + 0% { + -webkit-transform-origin: 50% 100%; + transform-origin: 50% 100%; + -webkit-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -webkit-transform-origin: 50% 100%; + transform-origin: 50% 100%; + -webkit-transform: scale(0.8); + transform: scale(0.8); + } +} +@keyframes antZoomDownOut { + 0% { + -webkit-transform-origin: 50% 100%; + transform-origin: 50% 100%; + -webkit-transform: scale(1); + transform: scale(1); + } + 100% { + opacity: 0; + -webkit-transform-origin: 50% 100%; + transform-origin: 50% 100%; + -webkit-transform: scale(0.8); + transform: scale(0.8); + } +} +.ant-motion-collapse { + overflow: hidden; +} +.ant-motion-collapse-active { + -webkit-transition: height 0.15s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.15s cubic-bezier(0.645, 0.045, 0.355, 1) !important; + transition: height 0.15s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.15s cubic-bezier(0.645, 0.045, 0.355, 1) !important; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-affix { + position: fixed; + z-index: 10; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-alert { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + position: relative; + padding: 8px 15px 8px 37px; + border-radius: 4px; +} +.ant-alert.ant-alert-no-icon { + padding: 8px 15px; +} +.ant-alert-icon { + top: 11.5px; + left: 16px; + position: absolute; +} +.ant-alert-description { + font-size: 14px; + line-height: 22px; + display: none; +} +.ant-alert-success { + border: 1px solid #b7eb8f; + background-color: #f6ffed; +} +.ant-alert-success .ant-alert-icon { + color: #52c41a; +} +.ant-alert-info { + border: 1px solid #91d5ff; + background-color: #e6f7ff; +} +.ant-alert-info .ant-alert-icon { + color: #1890ff; +} +.ant-alert-warning { + border: 1px solid #ffe58f; + background-color: #fffbe6; +} +.ant-alert-warning .ant-alert-icon { + color: #faad14; +} +.ant-alert-error { + border: 1px solid #ffa39e; + background-color: #fff1f0; +} +.ant-alert-error .ant-alert-icon { + color: #f5222d; +} +.ant-alert-close-icon { + font-size: 12px; + position: absolute; + right: 16px; + top: 8px; + line-height: 22px; + overflow: hidden; + cursor: pointer; +} +.ant-alert-close-icon .anticon-close { + color: rgba(0, 0, 0, 0.45); + -webkit-transition: color .3s; + transition: color .3s; +} +.ant-alert-close-icon .anticon-close:hover { + color: #404040; +} +.ant-alert-close-text { + position: absolute; + right: 16px; +} +.ant-alert-with-description { + padding: 15px 15px 15px 64px; + position: relative; + border-radius: 4px; + color: rgba(0, 0, 0, 0.65); + line-height: 1.5; +} +.ant-alert-with-description.ant-alert-no-icon { + padding: 15px; +} +.ant-alert-with-description .ant-alert-icon { + position: absolute; + top: 16px; + left: 24px; + font-size: 24px; +} +.ant-alert-with-description .ant-alert-close-icon { + position: absolute; + top: 16px; + right: 16px; + cursor: pointer; + font-size: 14px; +} +.ant-alert-with-description .ant-alert-message { + font-size: 16px; + color: rgba(0, 0, 0, 0.85); + display: block; + margin-bottom: 4px; +} +.ant-alert-with-description .ant-alert-description { + display: block; +} +.ant-alert.ant-alert-close { + height: 0 !important; + margin: 0; + padding-top: 0; + padding-bottom: 0; + -webkit-transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); + transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); + -webkit-transform-origin: 50% 0; + -ms-transform-origin: 50% 0; + transform-origin: 50% 0; +} +.ant-alert-slide-up-leave { + -webkit-animation: antAlertSlideUpOut 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); + animation: antAlertSlideUpOut 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} +.ant-alert-banner { + border-radius: 0; + border: 0; + margin-bottom: 0; +} +@-webkit-keyframes antAlertSlideUpIn { + 0% { + opacity: 0; + -webkit-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: scaleY(0); + transform: scaleY(0); + } + 100% { + opacity: 1; + -webkit-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: scaleY(1); + transform: scaleY(1); + } +} +@keyframes antAlertSlideUpIn { + 0% { + opacity: 0; + -webkit-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: scaleY(0); + transform: scaleY(0); + } + 100% { + opacity: 1; + -webkit-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: scaleY(1); + transform: scaleY(1); + } +} +@-webkit-keyframes antAlertSlideUpOut { + 0% { + opacity: 1; + -webkit-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: scaleY(1); + transform: scaleY(1); + } + 100% { + opacity: 0; + -webkit-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: scaleY(0); + transform: scaleY(0); + } +} +@keyframes antAlertSlideUpOut { + 0% { + opacity: 1; + -webkit-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: scaleY(1); + transform: scaleY(1); + } + 100% { + opacity: 0; + -webkit-transform-origin: 0% 0%; + transform-origin: 0% 0%; + -webkit-transform: scaleY(0); + transform: scaleY(0); + } +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-anchor { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + position: relative; + padding-left: 2px; +} +.ant-anchor-wrapper { + background-color: #fff; + overflow: auto; + padding-left: 4px; + margin-left: -4px; +} +.ant-anchor-ink { + position: absolute; + height: 100%; + left: 0; + top: 0; +} +.ant-anchor-ink:before { + content: ' '; + position: relative; + width: 2px; + height: 100%; + display: block; + background-color: #e8e8e8; + margin: 0 auto; +} +.ant-anchor-ink-ball { + display: none; + position: absolute; + width: 8px; + height: 8px; + border-radius: 8px; + border: 2px solid #1890ff; + background-color: #fff; + left: 50%; + -webkit-transition: top 0.3s ease-in-out; + transition: top 0.3s ease-in-out; + -webkit-transform: translateX(-50%); + -ms-transform: translateX(-50%); + transform: translateX(-50%); +} +.ant-anchor-ink-ball.visible { + display: inline-block; +} +.ant-anchor.fixed .ant-anchor-ink .ant-anchor-ink-ball { + display: none; +} +.ant-anchor-link { + padding: 8px 0 8px 16px; + line-height: 1; +} +.ant-anchor-link-title { + display: block; + position: relative; + -webkit-transition: all .3s; + transition: all .3s; + color: rgba(0, 0, 0, 0.65); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + margin-bottom: 8px; +} +.ant-anchor-link-title:only-child { + margin-bottom: 0; +} +.ant-anchor-link-active > .ant-anchor-link-title { + color: #1890ff; +} +.ant-anchor-link .ant-anchor-link { + padding-top: 6px; + padding-bottom: 6px; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-select-auto-complete { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; +} +.ant-select-auto-complete.ant-select .ant-select-selection { + border: 0; + -webkit-box-shadow: none; + box-shadow: none; +} +.ant-select-auto-complete.ant-select .ant-select-selection__rendered { + margin-left: 0; + margin-right: 0; + height: 100%; + line-height: 32px; +} +.ant-select-auto-complete.ant-select .ant-select-selection__placeholder { + margin-left: 12px; + margin-right: 12px; +} +.ant-select-auto-complete.ant-select .ant-select-selection--single { + height: auto; +} +.ant-select-auto-complete.ant-select .ant-select-search--inline { + position: static; + float: left; +} +.ant-select-auto-complete.ant-select-allow-clear .ant-select-selection:hover .ant-select-selection__rendered { + margin-right: 0 !important; +} +.ant-select-auto-complete.ant-select .ant-input { + background: transparent; + border-width: 1px; + line-height: 1.5; + height: 32px; +} +.ant-select-auto-complete.ant-select .ant-input:focus, +.ant-select-auto-complete.ant-select .ant-input:hover { + border-color: #40a9ff; + border-right-width: 1px !important; +} +.ant-select-auto-complete.ant-select-lg .ant-select-selection__rendered { + line-height: 40px; +} +.ant-select-auto-complete.ant-select-lg .ant-input { + padding-top: 6px; + padding-bottom: 6px; + height: 40px; +} +.ant-select-auto-complete.ant-select-sm .ant-select-selection__rendered { + line-height: 24px; +} +.ant-select-auto-complete.ant-select-sm .ant-input { + padding-top: 1px; + padding-bottom: 1px; + height: 24px; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-select { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + display: inline-block; + position: relative; + outline: 0; +} +.ant-select ul, +.ant-select ol { + margin: 0; + padding: 0; + list-style: none; +} +.ant-select > ul > li > a { + padding: 0; + background-color: #fff; +} +.ant-select-arrow { + display: inline-block; + font-style: normal; + vertical-align: -0.125em; + text-align: center; + text-transform: none; + line-height: 0; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + position: absolute; + top: 50%; + right: 11px; + line-height: 1; + margin-top: -6px; + -webkit-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; + color: rgba(0, 0, 0, 0.25); + font-size: 12px; +} +.ant-select-arrow > * { + line-height: 1; +} +.ant-select-arrow svg { + display: inline-block; +} +.ant-select-arrow:before { + display: none; +} +.ant-select-arrow .ant-select-arrow-icon { + display: block; +} +.ant-select-arrow .ant-select-arrow-icon svg { + -webkit-transition: -webkit-transform .3s; + transition: -webkit-transform .3s; + transition: transform .3s; + transition: transform .3s, -webkit-transform .3s; +} +.ant-select-selection { + outline: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-box-sizing: border-box; + box-sizing: border-box; + display: block; + background-color: #fff; + border-radius: 4px; + border: 1px solid #d9d9d9; + border-top-width: 1.02px; + -webkit-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); +} +.ant-select-selection:hover { + border-color: #40a9ff; + border-right-width: 1px !important; +} +.ant-select-focused .ant-select-selection, +.ant-select-selection:focus, +.ant-select-selection:active { + border-color: #40a9ff; + outline: 0; + -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-select-selection__clear { + display: inline-block; + font-style: normal; + vertical-align: baseline; + text-align: center; + text-transform: none; + text-rendering: auto; + opacity: 0; + position: absolute; + right: 11px; + z-index: 1; + background: #fff; + top: 50%; + font-size: 12px; + color: rgba(0, 0, 0, 0.25); + width: 12px; + height: 12px; + margin-top: -6px; + line-height: 12px; + cursor: pointer; + -webkit-transition: color 0.3s ease, opacity 0.15s ease; + transition: color 0.3s ease, opacity 0.15s ease; +} +.ant-select-selection__clear:before { + display: block; +} +.ant-select-selection__clear:hover { + color: rgba(0, 0, 0, 0.45); +} +.ant-select-selection:hover .ant-select-selection__clear { + opacity: 1; +} +.ant-select-selection-selected-value { + float: left; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: 100%; + padding-right: 20px; +} +.ant-select-no-arrow .ant-select-selection-selected-value { + padding-right: 0; +} +.ant-select-disabled { + color: rgba(0, 0, 0, 0.25); +} +.ant-select-disabled .ant-select-selection { + background: #f5f5f5; + cursor: not-allowed; +} +.ant-select-disabled .ant-select-selection:hover, +.ant-select-disabled .ant-select-selection:focus, +.ant-select-disabled .ant-select-selection:active { + border-color: #d9d9d9; + -webkit-box-shadow: none; + box-shadow: none; +} +.ant-select-disabled .ant-select-selection__clear { + display: none; + visibility: hidden; + pointer-events: none; +} +.ant-select-disabled .ant-select-selection--multiple .ant-select-selection__choice { + background: #f5f5f5; + color: #aaa; + padding-right: 10px; +} +.ant-select-disabled .ant-select-selection--multiple .ant-select-selection__choice__remove { + display: none; +} +.ant-select-selection--single { + height: 32px; + position: relative; + cursor: pointer; +} +.ant-select-selection__rendered { + display: block; + margin-left: 11px; + margin-right: 11px; + position: relative; + line-height: 30px; +} +.ant-select-selection__rendered:after { + content: '.'; + visibility: hidden; + pointer-events: none; + display: inline-block; + width: 0; +} +.ant-select-lg { + font-size: 16px; +} +.ant-select-lg .ant-select-selection--single { + height: 40px; +} +.ant-select-lg .ant-select-selection__rendered { + line-height: 38px; +} +.ant-select-lg .ant-select-selection--multiple { + min-height: 40px; +} +.ant-select-lg .ant-select-selection--multiple .ant-select-selection__rendered li { + height: 32px; + line-height: 32px; +} +.ant-select-lg .ant-select-selection--multiple .ant-select-selection__clear { + top: 20px; +} +.ant-select-sm .ant-select-selection--single { + height: 24px; +} +.ant-select-sm .ant-select-selection__rendered { + line-height: 22px; + margin: 0 7px; +} +.ant-select-sm .ant-select-selection--multiple { + min-height: 24px; +} +.ant-select-sm .ant-select-selection--multiple .ant-select-selection__rendered li { + height: 16px; + line-height: 14px; +} +.ant-select-sm .ant-select-selection--multiple .ant-select-selection__clear { + top: 12px; +} +.ant-select-sm .ant-select-selection__clear, +.ant-select-sm .ant-select-arrow { + right: 8px; +} +.ant-select-disabled .ant-select-selection__choice__remove { + color: rgba(0, 0, 0, 0.25); + cursor: default; +} +.ant-select-disabled .ant-select-selection__choice__remove:hover { + color: rgba(0, 0, 0, 0.25); +} +.ant-select-search__field__wrap { + display: inline-block; + position: relative; +} +.ant-select-selection__placeholder, +.ant-select-search__field__placeholder { + position: absolute; + top: 50%; + left: 0; + right: 9px; + color: #bfbfbf; + line-height: 20px; + height: 20px; + max-width: 100%; + margin-top: -10px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + text-align: left; +} +.ant-select-search__field__placeholder { + left: 12px; +} +.ant-select-search__field__mirror { + position: absolute; + top: 0; + left: 0; + white-space: pre; + pointer-events: none; + opacity: 0; +} +.ant-select-search--inline { + position: absolute; + height: 100%; + width: 100%; +} +.ant-select-search--inline .ant-select-search__field__wrap { + width: 100%; + height: 100%; +} +.ant-select-search--inline .ant-select-search__field { + border-width: 0; + font-size: 100%; + height: 100%; + width: 100%; + background: transparent; + outline: 0; + border-radius: 4px; + line-height: 1; +} +.ant-select-search--inline > i { + float: right; +} +.ant-select-selection--multiple { + min-height: 32px; + cursor: text; + padding-bottom: 3px; + zoom: 1; +} +.ant-select-selection--multiple:before, +.ant-select-selection--multiple:after { + content: ""; + display: table; +} +.ant-select-selection--multiple:after { + clear: both; +} +.ant-select-selection--multiple .ant-select-search--inline { + float: left; + position: static; + width: auto; + padding: 0; + max-width: 100%; +} +.ant-select-selection--multiple .ant-select-search--inline .ant-select-search__field { + max-width: 100%; + width: 0.75em; +} +.ant-select-selection--multiple .ant-select-selection__rendered { + margin-left: 5px; + margin-bottom: -3px; + height: auto; +} +.ant-select-selection--multiple .ant-select-selection__placeholder { + margin-left: 6px; +} +.ant-select-selection--multiple > ul > li, +.ant-select-selection--multiple .ant-select-selection__rendered > ul > li { + margin-top: 3px; + height: 24px; + line-height: 22px; +} +.ant-select-selection--multiple .ant-select-selection__choice { + color: rgba(0, 0, 0, 0.65); + background-color: #fafafa; + border: 1px solid #e8e8e8; + border-radius: 2px; + cursor: default; + float: left; + margin-right: 4px; + max-width: 99%; + position: relative; + overflow: hidden; + -webkit-transition: padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + padding: 0 20px 0 10px; +} +.ant-select-selection--multiple .ant-select-selection__choice__disabled { + padding: 0 10px; +} +.ant-select-selection--multiple .ant-select-selection__choice__content { + display: inline-block; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 100%; + -webkit-transition: margin 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: margin 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); +} +.ant-select-selection--multiple .ant-select-selection__choice__remove { + font-style: normal; + vertical-align: -0.125em; + text-align: center; + text-transform: none; + line-height: 0; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + color: rgba(0, 0, 0, 0.45); + line-height: inherit; + cursor: pointer; + font-weight: bold; + -webkit-transition: all .3s; + transition: all .3s; + display: inline-block; + font-size: 12px; + font-size: 10px \9; + -webkit-transform: scale(0.83333333) rotate(0deg); + -ms-transform: scale(0.83333333) rotate(0deg); + transform: scale(0.83333333) rotate(0deg); + position: absolute; + right: 4px; +} +.ant-select-selection--multiple .ant-select-selection__choice__remove > * { + line-height: 1; +} +.ant-select-selection--multiple .ant-select-selection__choice__remove svg { + display: inline-block; +} +.ant-select-selection--multiple .ant-select-selection__choice__remove:before { + display: none; +} +.ant-select-selection--multiple .ant-select-selection__choice__remove .ant-select-selection--multiple .ant-select-selection__choice__remove-icon { + display: block; +} +:root .ant-select-selection--multiple .ant-select-selection__choice__remove { + font-size: 12px; +} +.ant-select-selection--multiple .ant-select-selection__choice__remove:hover { + color: #404040; +} +.ant-select-selection--multiple .ant-select-selection__clear { + top: 16px; +} +.ant-select-allow-clear .ant-select-selection--single .ant-select-selection-selected-value { + padding-right: 16px; +} +.ant-select-allow-clear .ant-select-selection--multiple .ant-select-selection__rendered { + margin-right: 20px; +} +.ant-select-open .ant-select-arrow-icon svg { + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.ant-select-open .ant-select-selection { + border-color: #40a9ff; + outline: 0; + -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-select-combobox .ant-select-arrow { + display: none; +} +.ant-select-combobox .ant-select-search--inline { + height: 100%; + width: 100%; + float: none; +} +.ant-select-combobox .ant-select-search__field__wrap { + width: 100%; + height: 100%; +} +.ant-select-combobox .ant-select-search__field { + width: 100%; + height: 100%; + position: relative; + z-index: 1; + -webkit-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), height 0s; + transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), height 0s; + -webkit-box-shadow: none; + box-shadow: none; +} +.ant-select-combobox.ant-select-allow-clear .ant-select-selection:hover .ant-select-selection__rendered { + margin-right: 20px; +} +.ant-select-dropdown { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + margin: 0; + padding: 0; + list-style: none; + font-variant: initial; + background-color: #fff; + -webkit-box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + border-radius: 4px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + z-index: 1050; + left: -9999px; + top: -9999px; + position: absolute; + outline: none; + font-size: 14px; +} +.ant-select-dropdown.slide-up-enter.slide-up-enter-active.ant-select-dropdown-placement-bottomLeft, +.ant-select-dropdown.slide-up-appear.slide-up-appear-active.ant-select-dropdown-placement-bottomLeft { + -webkit-animation-name: antSlideUpIn; + animation-name: antSlideUpIn; +} +.ant-select-dropdown.slide-up-enter.slide-up-enter-active.ant-select-dropdown-placement-topLeft, +.ant-select-dropdown.slide-up-appear.slide-up-appear-active.ant-select-dropdown-placement-topLeft { + -webkit-animation-name: antSlideDownIn; + animation-name: antSlideDownIn; +} +.ant-select-dropdown.slide-up-leave.slide-up-leave-active.ant-select-dropdown-placement-bottomLeft { + -webkit-animation-name: antSlideUpOut; + animation-name: antSlideUpOut; +} +.ant-select-dropdown.slide-up-leave.slide-up-leave-active.ant-select-dropdown-placement-topLeft { + -webkit-animation-name: antSlideDownOut; + animation-name: antSlideDownOut; +} +.ant-select-dropdown-hidden { + display: none; +} +.ant-select-dropdown-menu { + outline: none; + margin-bottom: 0; + padding-left: 0; + list-style: none; + max-height: 250px; + overflow: auto; +} +.ant-select-dropdown-menu-item-group-list { + margin: 0; + padding: 0; +} +.ant-select-dropdown-menu-item-group-list > .ant-select-dropdown-menu-item { + padding-left: 20px; +} +.ant-select-dropdown-menu-item-group-title { + color: rgba(0, 0, 0, 0.45); + padding: 0 12px; + height: 32px; + line-height: 32px; + font-size: 12px; +} +.ant-select-dropdown-menu-item-group-list .ant-select-dropdown-menu-item:first-child:not(:last-child), +.ant-select-dropdown-menu-item-group:not(:last-child) .ant-select-dropdown-menu-item-group-list .ant-select-dropdown-menu-item:last-child { + border-radius: 0; +} +.ant-select-dropdown-menu-item { + position: relative; + display: block; + padding: 5px 12px; + line-height: 22px; + font-weight: normal; + color: rgba(0, 0, 0, 0.65); + white-space: nowrap; + cursor: pointer; + overflow: hidden; + text-overflow: ellipsis; + -webkit-transition: background 0.3s ease; + transition: background 0.3s ease; +} +.ant-select-dropdown-menu-item:hover { + background-color: #e6f7ff; +} +.ant-select-dropdown-menu-item:first-child { + border-radius: 4px 4px 0 0; +} +.ant-select-dropdown-menu-item:last-child { + border-radius: 0 0 4px 4px; +} +.ant-select-dropdown-menu-item-disabled { + color: rgba(0, 0, 0, 0.25); + cursor: not-allowed; +} +.ant-select-dropdown-menu-item-disabled:hover { + color: rgba(0, 0, 0, 0.25); + background-color: #fff; + cursor: not-allowed; +} +.ant-select-dropdown-menu-item-selected, +.ant-select-dropdown-menu-item-selected:hover { + background-color: #fafafa; + font-weight: 600; + color: rgba(0, 0, 0, 0.65); +} +.ant-select-dropdown-menu-item-active { + background-color: #e6f7ff; +} +.ant-select-dropdown-menu-item-divider { + height: 1px; + margin: 1px 0; + overflow: hidden; + background-color: #e8e8e8; + line-height: 0; +} +.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item .ant-select-selected-icon { + color: transparent; + display: inline-block; + font-size: 12px; + font-size: 10px \9; + -webkit-transform: scale(0.83333333) rotate(0deg); + -ms-transform: scale(0.83333333) rotate(0deg); + transform: scale(0.83333333) rotate(0deg); + -webkit-transition: all 0.2s ease; + transition: all 0.2s ease; + position: absolute; + top: 50%; + -webkit-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); + right: 12px; + font-weight: bold; + text-shadow: 0 0.1px 0, 0.1px 0 0, 0 -0.1px 0, -0.1px 0; +} +:root .ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item .ant-select-selected-icon { + font-size: 12px; +} +.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item:hover .ant-select-selected-icon { + color: #ddd; +} +.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item-disabled .ant-select-selected-icon { + display: none; +} +.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item-selected .ant-select-selected-icon, +.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item-selected:hover .ant-select-selected-icon { + color: #1890ff; + display: inline-block; +} +.ant-select-dropdown-container-open .ant-select-dropdown, +.ant-select-dropdown-open .ant-select-dropdown { + display: block; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-input { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-variant: tabular-nums; + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + position: relative; + display: inline-block; + padding: 4px 11px; + width: 100%; + height: 32px; + font-size: 14px; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + background-image: none; + border: 1px solid #d9d9d9; + border-radius: 4px; + -webkit-transition: all .3s; + transition: all .3s; +} +.ant-input::-moz-placeholder { + color: #bfbfbf; + opacity: 1; +} +.ant-input:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-input::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-input:hover { + border-color: #40a9ff; + border-right-width: 1px !important; +} +.ant-input:focus { + border-color: #40a9ff; + outline: 0; + -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-input-disabled { + background-color: #f5f5f5; + opacity: 1; + cursor: not-allowed; + color: rgba(0, 0, 0, 0.25); +} +.ant-input-disabled:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +textarea.ant-input { + max-width: 100%; + height: auto; + vertical-align: bottom; + -webkit-transition: all .3s, height 0s; + transition: all .3s, height 0s; + min-height: 32px; +} +.ant-input-lg { + padding: 6px 11px; + height: 40px; + font-size: 16px; +} +.ant-input-sm { + padding: 1px 7px; + height: 24px; +} +.ant-input-group { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + position: relative; + display: table; + border-collapse: separate; + border-spacing: 0; + width: 100%; +} +.ant-input-group[class*="col-"] { + float: none; + padding-left: 0; + padding-right: 0; +} +.ant-input-group > [class*="col-"] { + padding-right: 8px; +} +.ant-input-group > [class*="col-"]:last-child { + padding-right: 0; +} +.ant-input-group-addon, +.ant-input-group-wrap, +.ant-input-group > .ant-input { + display: table-cell; +} +.ant-input-group-addon:not(:first-child):not(:last-child), +.ant-input-group-wrap:not(:first-child):not(:last-child), +.ant-input-group > .ant-input:not(:first-child):not(:last-child) { + border-radius: 0; +} +.ant-input-group-addon, +.ant-input-group-wrap { + width: 1px; + white-space: nowrap; + vertical-align: middle; +} +.ant-input-group-wrap > * { + display: block !important; +} +.ant-input-group .ant-input { + float: left; + width: 100%; + margin-bottom: 0; +} +.ant-input-group .ant-input:focus { + z-index: 1; + border-right-width: 1px; +} +.ant-input-group .ant-input:hover { + z-index: 1; + border-right-width: 1px; +} +.ant-input-group-addon { + padding: 0 11px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: rgba(0, 0, 0, 0.65); + text-align: center; + background-color: #fafafa; + border: 1px solid #d9d9d9; + border-radius: 4px; + position: relative; + -webkit-transition: all .3s; + transition: all .3s; +} +.ant-input-group-addon .ant-select { + margin: -5px -11px; +} +.ant-input-group-addon .ant-select .ant-select-selection { + background-color: inherit; + margin: -1px; + border: 1px solid transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.ant-input-group-addon .ant-select-open .ant-select-selection, +.ant-input-group-addon .ant-select-focused .ant-select-selection { + color: #1890ff; +} +.ant-input-group-addon > i:only-child:after { + position: absolute; + content: ''; + top: 0; + left: 0; + right: 0; + bottom: 0; +} +.ant-input-group > .ant-input:first-child, +.ant-input-group-addon:first-child { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.ant-input-group > .ant-input:first-child .ant-select .ant-select-selection, +.ant-input-group-addon:first-child .ant-select .ant-select-selection { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.ant-input-group > .ant-input-affix-wrapper:not(:first-child) .ant-input { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.ant-input-group > .ant-input-affix-wrapper:not(:last-child) .ant-input { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.ant-input-group-addon:first-child { + border-right: 0; +} +.ant-input-group-addon:last-child { + border-left: 0; +} +.ant-input-group > .ant-input:last-child, +.ant-input-group-addon:last-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.ant-input-group > .ant-input:last-child .ant-select .ant-select-selection, +.ant-input-group-addon:last-child .ant-select .ant-select-selection { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.ant-input-group-lg .ant-input, +.ant-input-group-lg > .ant-input-group-addon { + padding: 6px 11px; + height: 40px; + font-size: 16px; +} +.ant-input-group-sm .ant-input, +.ant-input-group-sm > .ant-input-group-addon { + padding: 1px 7px; + height: 24px; +} +.ant-input-group-lg .ant-select-selection--single { + height: 40px; +} +.ant-input-group-sm .ant-select-selection--single { + height: 24px; +} +.ant-input-group .ant-input-affix-wrapper { + display: table-cell; + width: 100%; + float: left; +} +.ant-input-group.ant-input-group-compact { + display: block; + zoom: 1; +} +.ant-input-group.ant-input-group-compact:before, +.ant-input-group.ant-input-group-compact:after { + content: ""; + display: table; +} +.ant-input-group.ant-input-group-compact:after { + clear: both; +} +.ant-input-group.ant-input-group-compact > * { + border-radius: 0; + border-right-width: 0; + vertical-align: top; + float: none; + display: inline-block; +} +.ant-input-group.ant-input-group-compact > span:not(:last-child) > .ant-input { + border-right-width: 0; +} +.ant-input-group.ant-input-group-compact .ant-input { + float: none; +} +.ant-input-group.ant-input-group-compact > .ant-select > .ant-select-selection, +.ant-input-group.ant-input-group-compact > .ant-calendar-picker .ant-input, +.ant-input-group.ant-input-group-compact > .ant-select-auto-complete .ant-input, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker .ant-input, +.ant-input-group.ant-input-group-compact > .ant-mention-wrapper .ant-mention-editor, +.ant-input-group.ant-input-group-compact > .ant-time-picker .ant-time-picker-input { + border-radius: 0; + border-right-width: 0; +} +.ant-input-group.ant-input-group-compact > *:first-child, +.ant-input-group.ant-input-group-compact > .ant-select:first-child > .ant-select-selection, +.ant-input-group.ant-input-group-compact > .ant-calendar-picker:first-child .ant-input, +.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:first-child .ant-input, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker:first-child .ant-input, +.ant-input-group.ant-input-group-compact > .ant-mention-wrapper:first-child .ant-mention-editor, +.ant-input-group.ant-input-group-compact > .ant-time-picker:first-child .ant-time-picker-input { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.ant-input-group.ant-input-group-compact > *:last-child, +.ant-input-group.ant-input-group-compact > .ant-select:last-child > .ant-select-selection, +.ant-input-group.ant-input-group-compact > .ant-calendar-picker:last-child .ant-input, +.ant-input-group.ant-input-group-compact > .ant-select-auto-complete:last-child .ant-input, +.ant-input-group.ant-input-group-compact > .ant-cascader-picker:last-child .ant-input, +.ant-input-group.ant-input-group-compact > .ant-mention-wrapper:last-child .ant-mention-editor, +.ant-input-group.ant-input-group-compact > .ant-time-picker:last-child .ant-time-picker-input { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + border-right-width: 1px; +} +.ant-input-group-wrapper { + display: inline-block; + vertical-align: top; + width: 100%; +} +.ant-input-affix-wrapper { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + position: relative; + display: inline-block; + width: 100%; +} +.ant-input-affix-wrapper:hover .ant-input:not(.ant-input-disabled) { + border-color: #40a9ff; + border-right-width: 1px !important; +} +.ant-input-affix-wrapper .ant-input { + position: static; +} +.ant-input-affix-wrapper .ant-input-prefix, +.ant-input-affix-wrapper .ant-input-suffix { + position: absolute; + top: 50%; + -webkit-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); + line-height: 0; + color: rgba(0, 0, 0, 0.65); +} +.ant-input-affix-wrapper .ant-input-prefix :not(.anticon), +.ant-input-affix-wrapper .ant-input-suffix :not(.anticon) { + line-height: 1.5; +} +.ant-input-affix-wrapper .ant-input-prefix { + left: 12px; +} +.ant-input-affix-wrapper .ant-input-suffix { + right: 12px; +} +.ant-input-affix-wrapper .ant-input:not(:first-child) { + padding-left: 30px; +} +.ant-input-affix-wrapper .ant-input:not(:last-child) { + padding-right: 30px; +} +.ant-input-affix-wrapper .ant-input { + min-height: 100%; +} +.ant-input-search-icon { + color: rgba(0, 0, 0, 0.45); + cursor: pointer; + -webkit-transition: all .3s; + transition: all .3s; +} +.ant-input-search-icon:hover { + color: #333; +} +.ant-input-search:not(.ant-input-search-small) > .ant-input-suffix { + right: 12px; +} +.ant-input-search > .ant-input-suffix > .ant-input-search-button { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.ant-input-search > .ant-input-suffix > .ant-input-search-button > .anticon-search { + font-size: 16px; +} +.ant-input-search.ant-input-search-enter-button > .ant-input { + padding-right: 46px; +} +.ant-input-search.ant-input-search-enter-button > .ant-input-suffix { + right: 0; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-btn { + line-height: 1.5; + display: inline-block; + font-weight: 400; + text-align: center; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 0 15px; + font-size: 14px; + border-radius: 4px; + height: 32px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + position: relative; + -webkit-box-shadow: 0 2px 0 rgba(0, 0, 0, 0.015); + box-shadow: 0 2px 0 rgba(0, 0, 0, 0.015); + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + border-color: #d9d9d9; +} +.ant-btn > .anticon { + line-height: 1; +} +.ant-btn, +.ant-btn:active, +.ant-btn:focus { + outline: 0; +} +.ant-btn:not([disabled]):hover { + text-decoration: none; +} +.ant-btn:not([disabled]):active { + outline: 0; + -webkit-transition: none; + transition: none; + -webkit-box-shadow: none; + box-shadow: none; +} +.ant-btn.disabled, +.ant-btn[disabled] { + cursor: not-allowed; +} +.ant-btn.disabled > *, +.ant-btn[disabled] > * { + pointer-events: none; +} +.ant-btn-lg { + padding: 0 15px; + font-size: 16px; + border-radius: 4px; + height: 40px; +} +.ant-btn-sm { + padding: 0 7px; + font-size: 14px; + border-radius: 4px; + height: 24px; +} +.ant-btn > a:only-child { + color: currentColor; +} +.ant-btn > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn:hover, +.ant-btn:focus { + color: #40a9ff; + background-color: #fff; + border-color: #40a9ff; +} +.ant-btn:hover > a:only-child, +.ant-btn:focus > a:only-child { + color: currentColor; +} +.ant-btn:hover > a:only-child:after, +.ant-btn:focus > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn:active, +.ant-btn.active { + color: #096dd9; + background-color: #fff; + border-color: #096dd9; +} +.ant-btn:active > a:only-child, +.ant-btn.active > a:only-child { + color: currentColor; +} +.ant-btn:active > a:only-child:after, +.ant-btn.active > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn.disabled, +.ant-btn[disabled], +.ant-btn.disabled:hover, +.ant-btn[disabled]:hover, +.ant-btn.disabled:focus, +.ant-btn[disabled]:focus, +.ant-btn.disabled:active, +.ant-btn[disabled]:active, +.ant-btn.disabled.active, +.ant-btn[disabled].active { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; + text-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} +.ant-btn.disabled > a:only-child, +.ant-btn[disabled] > a:only-child, +.ant-btn.disabled:hover > a:only-child, +.ant-btn[disabled]:hover > a:only-child, +.ant-btn.disabled:focus > a:only-child, +.ant-btn[disabled]:focus > a:only-child, +.ant-btn.disabled:active > a:only-child, +.ant-btn[disabled]:active > a:only-child, +.ant-btn.disabled.active > a:only-child, +.ant-btn[disabled].active > a:only-child { + color: currentColor; +} +.ant-btn.disabled > a:only-child:after, +.ant-btn[disabled] > a:only-child:after, +.ant-btn.disabled:hover > a:only-child:after, +.ant-btn[disabled]:hover > a:only-child:after, +.ant-btn.disabled:focus > a:only-child:after, +.ant-btn[disabled]:focus > a:only-child:after, +.ant-btn.disabled:active > a:only-child:after, +.ant-btn[disabled]:active > a:only-child:after, +.ant-btn.disabled.active > a:only-child:after, +.ant-btn[disabled].active > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn:hover, +.ant-btn:focus, +.ant-btn:active, +.ant-btn.active { + background: #fff; + text-decoration: none; +} +.ant-btn > i, +.ant-btn > span { + pointer-events: none; +} +.ant-btn-primary { + color: #fff; + background-color: #1890ff; + border-color: #1890ff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12); + -webkit-box-shadow: 0 2px 0 rgba(0, 0, 0, 0.035); + box-shadow: 0 2px 0 rgba(0, 0, 0, 0.035); +} +.ant-btn-primary > a:only-child { + color: currentColor; +} +.ant-btn-primary > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn-primary:hover, +.ant-btn-primary:focus { + color: #fff; + background-color: #40a9ff; + border-color: #40a9ff; +} +.ant-btn-primary:hover > a:only-child, +.ant-btn-primary:focus > a:only-child { + color: currentColor; +} +.ant-btn-primary:hover > a:only-child:after, +.ant-btn-primary:focus > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn-primary:active, +.ant-btn-primary.active { + color: #fff; + background-color: #096dd9; + border-color: #096dd9; +} +.ant-btn-primary:active > a:only-child, +.ant-btn-primary.active > a:only-child { + color: currentColor; +} +.ant-btn-primary:active > a:only-child:after, +.ant-btn-primary.active > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn-primary.disabled, +.ant-btn-primary[disabled], +.ant-btn-primary.disabled:hover, +.ant-btn-primary[disabled]:hover, +.ant-btn-primary.disabled:focus, +.ant-btn-primary[disabled]:focus, +.ant-btn-primary.disabled:active, +.ant-btn-primary[disabled]:active, +.ant-btn-primary.disabled.active, +.ant-btn-primary[disabled].active { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; + text-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} +.ant-btn-primary.disabled > a:only-child, +.ant-btn-primary[disabled] > a:only-child, +.ant-btn-primary.disabled:hover > a:only-child, +.ant-btn-primary[disabled]:hover > a:only-child, +.ant-btn-primary.disabled:focus > a:only-child, +.ant-btn-primary[disabled]:focus > a:only-child, +.ant-btn-primary.disabled:active > a:only-child, +.ant-btn-primary[disabled]:active > a:only-child, +.ant-btn-primary.disabled.active > a:only-child, +.ant-btn-primary[disabled].active > a:only-child { + color: currentColor; +} +.ant-btn-primary.disabled > a:only-child:after, +.ant-btn-primary[disabled] > a:only-child:after, +.ant-btn-primary.disabled:hover > a:only-child:after, +.ant-btn-primary[disabled]:hover > a:only-child:after, +.ant-btn-primary.disabled:focus > a:only-child:after, +.ant-btn-primary[disabled]:focus > a:only-child:after, +.ant-btn-primary.disabled:active > a:only-child:after, +.ant-btn-primary[disabled]:active > a:only-child:after, +.ant-btn-primary.disabled.active > a:only-child:after, +.ant-btn-primary[disabled].active > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child) { + border-right-color: #40a9ff; + border-left-color: #40a9ff; +} +.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child):disabled { + border-color: #d9d9d9; +} +.ant-btn-group .ant-btn-primary:first-child:not(:last-child) { + border-right-color: #40a9ff; +} +.ant-btn-group .ant-btn-primary:first-child:not(:last-child)[disabled] { + border-right-color: #d9d9d9; +} +.ant-btn-group .ant-btn-primary:last-child:not(:first-child), +.ant-btn-group .ant-btn-primary + .ant-btn-primary { + border-left-color: #40a9ff; +} +.ant-btn-group .ant-btn-primary:last-child:not(:first-child)[disabled], +.ant-btn-group .ant-btn-primary + .ant-btn-primary[disabled] { + border-left-color: #d9d9d9; +} +.ant-btn-ghost { + color: rgba(0, 0, 0, 0.65); + background-color: transparent; + border-color: #d9d9d9; +} +.ant-btn-ghost > a:only-child { + color: currentColor; +} +.ant-btn-ghost > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn-ghost:hover, +.ant-btn-ghost:focus { + color: #40a9ff; + background-color: transparent; + border-color: #40a9ff; +} +.ant-btn-ghost:hover > a:only-child, +.ant-btn-ghost:focus > a:only-child { + color: currentColor; +} +.ant-btn-ghost:hover > a:only-child:after, +.ant-btn-ghost:focus > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn-ghost:active, +.ant-btn-ghost.active { + color: #096dd9; + background-color: transparent; + border-color: #096dd9; +} +.ant-btn-ghost:active > a:only-child, +.ant-btn-ghost.active > a:only-child { + color: currentColor; +} +.ant-btn-ghost:active > a:only-child:after, +.ant-btn-ghost.active > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn-ghost.disabled, +.ant-btn-ghost[disabled], +.ant-btn-ghost.disabled:hover, +.ant-btn-ghost[disabled]:hover, +.ant-btn-ghost.disabled:focus, +.ant-btn-ghost[disabled]:focus, +.ant-btn-ghost.disabled:active, +.ant-btn-ghost[disabled]:active, +.ant-btn-ghost.disabled.active, +.ant-btn-ghost[disabled].active { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; + text-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} +.ant-btn-ghost.disabled > a:only-child, +.ant-btn-ghost[disabled] > a:only-child, +.ant-btn-ghost.disabled:hover > a:only-child, +.ant-btn-ghost[disabled]:hover > a:only-child, +.ant-btn-ghost.disabled:focus > a:only-child, +.ant-btn-ghost[disabled]:focus > a:only-child, +.ant-btn-ghost.disabled:active > a:only-child, +.ant-btn-ghost[disabled]:active > a:only-child, +.ant-btn-ghost.disabled.active > a:only-child, +.ant-btn-ghost[disabled].active > a:only-child { + color: currentColor; +} +.ant-btn-ghost.disabled > a:only-child:after, +.ant-btn-ghost[disabled] > a:only-child:after, +.ant-btn-ghost.disabled:hover > a:only-child:after, +.ant-btn-ghost[disabled]:hover > a:only-child:after, +.ant-btn-ghost.disabled:focus > a:only-child:after, +.ant-btn-ghost[disabled]:focus > a:only-child:after, +.ant-btn-ghost.disabled:active > a:only-child:after, +.ant-btn-ghost[disabled]:active > a:only-child:after, +.ant-btn-ghost.disabled.active > a:only-child:after, +.ant-btn-ghost[disabled].active > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn-dashed { + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + border-color: #d9d9d9; + border-style: dashed; +} +.ant-btn-dashed > a:only-child { + color: currentColor; +} +.ant-btn-dashed > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn-dashed:hover, +.ant-btn-dashed:focus { + color: #40a9ff; + background-color: #fff; + border-color: #40a9ff; +} +.ant-btn-dashed:hover > a:only-child, +.ant-btn-dashed:focus > a:only-child { + color: currentColor; +} +.ant-btn-dashed:hover > a:only-child:after, +.ant-btn-dashed:focus > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn-dashed:active, +.ant-btn-dashed.active { + color: #096dd9; + background-color: #fff; + border-color: #096dd9; +} +.ant-btn-dashed:active > a:only-child, +.ant-btn-dashed.active > a:only-child { + color: currentColor; +} +.ant-btn-dashed:active > a:only-child:after, +.ant-btn-dashed.active > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn-dashed.disabled, +.ant-btn-dashed[disabled], +.ant-btn-dashed.disabled:hover, +.ant-btn-dashed[disabled]:hover, +.ant-btn-dashed.disabled:focus, +.ant-btn-dashed[disabled]:focus, +.ant-btn-dashed.disabled:active, +.ant-btn-dashed[disabled]:active, +.ant-btn-dashed.disabled.active, +.ant-btn-dashed[disabled].active { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; + text-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} +.ant-btn-dashed.disabled > a:only-child, +.ant-btn-dashed[disabled] > a:only-child, +.ant-btn-dashed.disabled:hover > a:only-child, +.ant-btn-dashed[disabled]:hover > a:only-child, +.ant-btn-dashed.disabled:focus > a:only-child, +.ant-btn-dashed[disabled]:focus > a:only-child, +.ant-btn-dashed.disabled:active > a:only-child, +.ant-btn-dashed[disabled]:active > a:only-child, +.ant-btn-dashed.disabled.active > a:only-child, +.ant-btn-dashed[disabled].active > a:only-child { + color: currentColor; +} +.ant-btn-dashed.disabled > a:only-child:after, +.ant-btn-dashed[disabled] > a:only-child:after, +.ant-btn-dashed.disabled:hover > a:only-child:after, +.ant-btn-dashed[disabled]:hover > a:only-child:after, +.ant-btn-dashed.disabled:focus > a:only-child:after, +.ant-btn-dashed[disabled]:focus > a:only-child:after, +.ant-btn-dashed.disabled:active > a:only-child:after, +.ant-btn-dashed[disabled]:active > a:only-child:after, +.ant-btn-dashed.disabled.active > a:only-child:after, +.ant-btn-dashed[disabled].active > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn-danger { + color: #f5222d; + background-color: #f5f5f5; + border-color: #d9d9d9; +} +.ant-btn-danger > a:only-child { + color: currentColor; +} +.ant-btn-danger > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn-danger:hover { + color: #fff; + background-color: #ff4d4f; + border-color: #ff4d4f; +} +.ant-btn-danger:hover > a:only-child { + color: currentColor; +} +.ant-btn-danger:hover > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn-danger:focus { + color: #ff4d4f; + background-color: #fff; + border-color: #ff4d4f; +} +.ant-btn-danger:focus > a:only-child { + color: currentColor; +} +.ant-btn-danger:focus > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn-danger:active, +.ant-btn-danger.active { + color: #fff; + background-color: #cf1322; + border-color: #cf1322; +} +.ant-btn-danger:active > a:only-child, +.ant-btn-danger.active > a:only-child { + color: currentColor; +} +.ant-btn-danger:active > a:only-child:after, +.ant-btn-danger.active > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn-danger.disabled, +.ant-btn-danger[disabled], +.ant-btn-danger.disabled:hover, +.ant-btn-danger[disabled]:hover, +.ant-btn-danger.disabled:focus, +.ant-btn-danger[disabled]:focus, +.ant-btn-danger.disabled:active, +.ant-btn-danger[disabled]:active, +.ant-btn-danger.disabled.active, +.ant-btn-danger[disabled].active { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; + text-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} +.ant-btn-danger.disabled > a:only-child, +.ant-btn-danger[disabled] > a:only-child, +.ant-btn-danger.disabled:hover > a:only-child, +.ant-btn-danger[disabled]:hover > a:only-child, +.ant-btn-danger.disabled:focus > a:only-child, +.ant-btn-danger[disabled]:focus > a:only-child, +.ant-btn-danger.disabled:active > a:only-child, +.ant-btn-danger[disabled]:active > a:only-child, +.ant-btn-danger.disabled.active > a:only-child, +.ant-btn-danger[disabled].active > a:only-child { + color: currentColor; +} +.ant-btn-danger.disabled > a:only-child:after, +.ant-btn-danger[disabled] > a:only-child:after, +.ant-btn-danger.disabled:hover > a:only-child:after, +.ant-btn-danger[disabled]:hover > a:only-child:after, +.ant-btn-danger.disabled:focus > a:only-child:after, +.ant-btn-danger[disabled]:focus > a:only-child:after, +.ant-btn-danger.disabled:active > a:only-child:after, +.ant-btn-danger[disabled]:active > a:only-child:after, +.ant-btn-danger.disabled.active > a:only-child:after, +.ant-btn-danger[disabled].active > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn-circle, +.ant-btn-circle-outline { + width: 32px; + padding: 0; + font-size: 16px; + border-radius: 50%; + height: 32px; +} +.ant-btn-circle.ant-btn-lg, +.ant-btn-circle-outline.ant-btn-lg { + width: 40px; + padding: 0; + font-size: 18px; + border-radius: 50%; + height: 40px; +} +.ant-btn-circle.ant-btn-sm, +.ant-btn-circle-outline.ant-btn-sm { + width: 24px; + padding: 0; + font-size: 14px; + border-radius: 50%; + height: 24px; +} +.ant-btn:before { + position: absolute; + top: -1px; + left: -1px; + bottom: -1px; + right: -1px; + background: #fff; + opacity: 0.35; + content: ''; + border-radius: inherit; + z-index: 1; + -webkit-transition: opacity .2s; + transition: opacity .2s; + pointer-events: none; + display: none; +} +.ant-btn .anticon { + -webkit-transition: margin-left 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: margin-left 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); +} +.ant-btn.ant-btn-loading:before { + display: block; +} +.ant-btn.ant-btn-loading:not(.ant-btn-circle):not(.ant-btn-circle-outline):not(.ant-btn-icon-only) { + padding-left: 29px; + pointer-events: none; + position: relative; +} +.ant-btn.ant-btn-loading:not(.ant-btn-circle):not(.ant-btn-circle-outline):not(.ant-btn-icon-only) .anticon { + margin-left: -14px; +} +.ant-btn-sm.ant-btn-loading:not(.ant-btn-circle):not(.ant-btn-circle-outline):not(.ant-btn-icon-only) { + padding-left: 24px; +} +.ant-btn-sm.ant-btn-loading:not(.ant-btn-circle):not(.ant-btn-circle-outline):not(.ant-btn-icon-only) .anticon { + margin-left: -17px; +} +.ant-btn-group { + position: relative; + display: inline-block; +} +.ant-btn-group > .ant-btn, +.ant-btn-group > span > .ant-btn { + position: relative; + line-height: 30px; +} +.ant-btn-group > .ant-btn:hover, +.ant-btn-group > span > .ant-btn:hover, +.ant-btn-group > .ant-btn:focus, +.ant-btn-group > span > .ant-btn:focus, +.ant-btn-group > .ant-btn:active, +.ant-btn-group > span > .ant-btn:active, +.ant-btn-group > .ant-btn.active, +.ant-btn-group > span > .ant-btn.active { + z-index: 2; +} +.ant-btn-group > .ant-btn:disabled, +.ant-btn-group > span > .ant-btn:disabled { + z-index: 0; +} +.ant-btn-group-lg > .ant-btn, +.ant-btn-group-lg > span > .ant-btn { + padding: 0 15px; + font-size: 16px; + border-radius: 0; + height: 40px; + line-height: 38px; +} +.ant-btn-group-sm > .ant-btn, +.ant-btn-group-sm > span > .ant-btn { + padding: 0 7px; + font-size: 14px; + border-radius: 0; + height: 24px; + line-height: 22px; +} +.ant-btn-group-sm > .ant-btn > .anticon, +.ant-btn-group-sm > span > .ant-btn > .anticon { + font-size: 14px; +} +.ant-btn-group .ant-btn + .ant-btn, +.ant-btn + .ant-btn-group, +.ant-btn-group span + .ant-btn, +.ant-btn-group .ant-btn + span, +.ant-btn-group > span + span, +.ant-btn-group + .ant-btn, +.ant-btn-group + .ant-btn-group { + margin-left: -1px; +} +.ant-btn-group .ant-btn-primary + .ant-btn:not(.ant-btn-primary):not([disabled]) { + border-left-color: transparent; +} +.ant-btn-group .ant-btn { + border-radius: 0; +} +.ant-btn-group > .ant-btn:first-child, +.ant-btn-group > span:first-child > .ant-btn { + margin-left: 0; +} +.ant-btn-group > .ant-btn:only-child { + border-radius: 4px; +} +.ant-btn-group > span:only-child > .ant-btn { + border-radius: 4px; +} +.ant-btn-group > .ant-btn:first-child:not(:last-child), +.ant-btn-group > span:first-child:not(:last-child) > .ant-btn { + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.ant-btn-group > .ant-btn:last-child:not(:first-child), +.ant-btn-group > span:last-child:not(:first-child) > .ant-btn { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; +} +.ant-btn-group-sm > .ant-btn:only-child { + border-radius: 4px; +} +.ant-btn-group-sm > span:only-child > .ant-btn { + border-radius: 4px; +} +.ant-btn-group-sm > .ant-btn:first-child:not(:last-child), +.ant-btn-group-sm > span:first-child:not(:last-child) > .ant-btn { + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.ant-btn-group-sm > .ant-btn:last-child:not(:first-child), +.ant-btn-group-sm > span:last-child:not(:first-child) > .ant-btn { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; +} +.ant-btn-group > .ant-btn-group { + float: left; +} +.ant-btn-group > .ant-btn-group:not(:first-child):not(:last-child) > .ant-btn { + border-radius: 0; +} +.ant-btn-group > .ant-btn-group:first-child:not(:last-child) > .ant-btn:last-child { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + padding-right: 8px; +} +.ant-btn-group > .ant-btn-group:last-child:not(:first-child) > .ant-btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; + padding-left: 8px; +} +.ant-btn:not(.ant-btn-circle):not(.ant-btn-circle-outline).ant-btn-icon-only { + padding-left: 8px; + padding-right: 8px; +} +.ant-btn:focus > span, +.ant-btn:active > span { + position: relative; +} +.ant-btn > .anticon + span, +.ant-btn > span + .anticon { + margin-left: 8px; +} +.ant-btn-background-ghost { + background: transparent !important; + border-color: #fff; + color: #fff; +} +.ant-btn-background-ghost.ant-btn-primary { + color: #1890ff; + background-color: transparent; + border-color: #1890ff; + text-shadow: none; +} +.ant-btn-background-ghost.ant-btn-primary > a:only-child { + color: currentColor; +} +.ant-btn-background-ghost.ant-btn-primary > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn-background-ghost.ant-btn-primary:hover, +.ant-btn-background-ghost.ant-btn-primary:focus { + color: #40a9ff; + background-color: transparent; + border-color: #40a9ff; +} +.ant-btn-background-ghost.ant-btn-primary:hover > a:only-child, +.ant-btn-background-ghost.ant-btn-primary:focus > a:only-child { + color: currentColor; +} +.ant-btn-background-ghost.ant-btn-primary:hover > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary:focus > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn-background-ghost.ant-btn-primary:active, +.ant-btn-background-ghost.ant-btn-primary.active { + color: #096dd9; + background-color: transparent; + border-color: #096dd9; +} +.ant-btn-background-ghost.ant-btn-primary:active > a:only-child, +.ant-btn-background-ghost.ant-btn-primary.active > a:only-child { + color: currentColor; +} +.ant-btn-background-ghost.ant-btn-primary:active > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary.active > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn-background-ghost.ant-btn-primary.disabled, +.ant-btn-background-ghost.ant-btn-primary[disabled], +.ant-btn-background-ghost.ant-btn-primary.disabled:hover, +.ant-btn-background-ghost.ant-btn-primary[disabled]:hover, +.ant-btn-background-ghost.ant-btn-primary.disabled:focus, +.ant-btn-background-ghost.ant-btn-primary[disabled]:focus, +.ant-btn-background-ghost.ant-btn-primary.disabled:active, +.ant-btn-background-ghost.ant-btn-primary[disabled]:active, +.ant-btn-background-ghost.ant-btn-primary.disabled.active, +.ant-btn-background-ghost.ant-btn-primary[disabled].active { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; + text-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} +.ant-btn-background-ghost.ant-btn-primary.disabled > a:only-child, +.ant-btn-background-ghost.ant-btn-primary[disabled] > a:only-child, +.ant-btn-background-ghost.ant-btn-primary.disabled:hover > a:only-child, +.ant-btn-background-ghost.ant-btn-primary[disabled]:hover > a:only-child, +.ant-btn-background-ghost.ant-btn-primary.disabled:focus > a:only-child, +.ant-btn-background-ghost.ant-btn-primary[disabled]:focus > a:only-child, +.ant-btn-background-ghost.ant-btn-primary.disabled:active > a:only-child, +.ant-btn-background-ghost.ant-btn-primary[disabled]:active > a:only-child, +.ant-btn-background-ghost.ant-btn-primary.disabled.active > a:only-child, +.ant-btn-background-ghost.ant-btn-primary[disabled].active > a:only-child { + color: currentColor; +} +.ant-btn-background-ghost.ant-btn-primary.disabled > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary[disabled] > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary.disabled:hover > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary[disabled]:hover > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary.disabled:focus > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary[disabled]:focus > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary.disabled:active > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary[disabled]:active > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary.disabled.active > a:only-child:after, +.ant-btn-background-ghost.ant-btn-primary[disabled].active > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn-background-ghost.ant-btn-danger { + color: #f5222d; + background-color: transparent; + border-color: #f5222d; + text-shadow: none; +} +.ant-btn-background-ghost.ant-btn-danger > a:only-child { + color: currentColor; +} +.ant-btn-background-ghost.ant-btn-danger > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn-background-ghost.ant-btn-danger:hover, +.ant-btn-background-ghost.ant-btn-danger:focus { + color: #ff4d4f; + background-color: transparent; + border-color: #ff4d4f; +} +.ant-btn-background-ghost.ant-btn-danger:hover > a:only-child, +.ant-btn-background-ghost.ant-btn-danger:focus > a:only-child { + color: currentColor; +} +.ant-btn-background-ghost.ant-btn-danger:hover > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger:focus > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn-background-ghost.ant-btn-danger:active, +.ant-btn-background-ghost.ant-btn-danger.active { + color: #cf1322; + background-color: transparent; + border-color: #cf1322; +} +.ant-btn-background-ghost.ant-btn-danger:active > a:only-child, +.ant-btn-background-ghost.ant-btn-danger.active > a:only-child { + color: currentColor; +} +.ant-btn-background-ghost.ant-btn-danger:active > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger.active > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn-background-ghost.ant-btn-danger.disabled, +.ant-btn-background-ghost.ant-btn-danger[disabled], +.ant-btn-background-ghost.ant-btn-danger.disabled:hover, +.ant-btn-background-ghost.ant-btn-danger[disabled]:hover, +.ant-btn-background-ghost.ant-btn-danger.disabled:focus, +.ant-btn-background-ghost.ant-btn-danger[disabled]:focus, +.ant-btn-background-ghost.ant-btn-danger.disabled:active, +.ant-btn-background-ghost.ant-btn-danger[disabled]:active, +.ant-btn-background-ghost.ant-btn-danger.disabled.active, +.ant-btn-background-ghost.ant-btn-danger[disabled].active { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; + text-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} +.ant-btn-background-ghost.ant-btn-danger.disabled > a:only-child, +.ant-btn-background-ghost.ant-btn-danger[disabled] > a:only-child, +.ant-btn-background-ghost.ant-btn-danger.disabled:hover > a:only-child, +.ant-btn-background-ghost.ant-btn-danger[disabled]:hover > a:only-child, +.ant-btn-background-ghost.ant-btn-danger.disabled:focus > a:only-child, +.ant-btn-background-ghost.ant-btn-danger[disabled]:focus > a:only-child, +.ant-btn-background-ghost.ant-btn-danger.disabled:active > a:only-child, +.ant-btn-background-ghost.ant-btn-danger[disabled]:active > a:only-child, +.ant-btn-background-ghost.ant-btn-danger.disabled.active > a:only-child, +.ant-btn-background-ghost.ant-btn-danger[disabled].active > a:only-child { + color: currentColor; +} +.ant-btn-background-ghost.ant-btn-danger.disabled > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger[disabled] > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger.disabled:hover > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger[disabled]:hover > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger.disabled:focus > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger[disabled]:focus > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger.disabled:active > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger[disabled]:active > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger.disabled.active > a:only-child:after, +.ant-btn-background-ghost.ant-btn-danger[disabled].active > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-btn-two-chinese-chars:first-letter { + letter-spacing: .34em; +} +.ant-btn-two-chinese-chars > * { + letter-spacing: .34em; + margin-right: -0.34em; +} +.ant-btn-block { + width: 100%; +} +.christmas.ant-btn-primary:before { + content: ''; + display: block; + position: absolute; + top: -6px; + left: 0; + right: 0; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE0AAAAXCAYAAABOHMIhAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABiZJREFUeNrsWMtPlFcUvzPMwIDysLyRR4uATDHWCiVgSmRlios2DeiiXUFs0nRBd6arxqQhJDapkYXhP4BqDKTQhZaFNQSCaBEVJjwdHsNr5DUMDDPDzPT3u7nTDEgRKrKgc5KT+z3uufec33de99P4fD4RpL2RNgjB3kn35MkTeRERESFiYmLkGBoaKnQ6nWSNRvPPZFxr+vv7k6KioiIdDsfa8vLyQkFBgcP3Bnel3MDAQArWI0eFhISE87nb7bZ7PJ4VvLYuLi5O5+fnu9+kMNfq6+tLjIyMzMY6KeBEbK/XarXReI3lPDZMWcc4v7GxYV1dXR3Jy8ub2E5HPvJ6vRSSDH0ku1wuAfsEZOV1IEFHoeNFdHS0yMrK2knR0Lm5uR+hxLdQMjbwHTZbB41h8RGwCdc9MzMzneHh4bGJiYlf4SN8ijkfwqiIncCAAR7Iz2GPSShudjqdfeCeqampvwBQfFxc3JdYqwTv8gB8/F48A8BgKecE14V+L7ju2tpae05OzkuCCZvkPOj8mizmC6vVKtmPu+bx48cC3qI1mUyFUOyywWD4SHlELBaLJmCHNcwAghuAOujtuF4FqHO4nsX4EsAS3I4TJ04ME1h8PDE9PS09TYZoY2Pj1729vd6lpSVfkDYTPG0UkfNDRUWFgQ5Gb2Mh0N29e9eG/GQfHh4W8/PzwUy/ObQ/gMfVVlZW1iAiZdQxp3nv3LljRoL/5erVq1UIxzSiiVD9X4EDYATynCwAzGO858hCQRoaGmJFZNJz8YIcBc4BF966dau6sLAwBxVSJCUlCSThQwuU3W6XkYUok1Vzm5znQx5bbm9v77p+/frPeNSNRzZ/ISBwrG4ZR48eLamtrf2+uLjYSEG9Xi/wTISFhQlWGXohyzO/CJlVl23KQRLbABoaHx+/Z1lUZ/Hq1SsJFj3JT3hmHx8fnydPTEzMj46OziHPW2w22wxeD4Kfgadh/4YEzU8Az4DhffAn5eXlX1y6dKkEoCTspAQ9Mjs7+0BBo8Fms1lkZGTsOo0QLLRNkvnR+fEJzIMHD0xtbW39CL8JTFtSbAOvBIyLHIGVm9VzE2gKuDAMSSpcT6KXyT137lx2cnLyMXhcGDb3wq3XuWF3d/fCzZs3P0c4v5eSknJQbYLo7Ox0gC2lpaVZ3Be67Th/dnZWoAJKsJC3XA8fPhxoamp6hMb+BaaMgWcUMGtszZjiFDNmvcDI91pzG0iY4ARwkwrxkcHBwUdgNrRMbnrqoRbkVzDcvn3bl5qaWsmcgFH4G8XdEGUWFhak51AuISFBnkoCTyFbyWKxCJwIxlC0fq2rq7tcVFRkRKskjh8/Lr0+kBjCCDV/knfdv3//WX19/R8IRRNemxlu4AXwKqM+EJwdj1HbPYSwh3sCPAJDABm2LLchCjS+5/kirKGhwWk0GrMuXrxYQuX9hm/XXTMXMY+srKwI5ApZrbYmZh7deEJhAUKjLe/pLTzSsCuHrK+1tbUJVe3P6upq87Vr174rKysrYHVj/uW+OH3IfEuw4F3ee/fuPQfAvwOs5yyE4CnlFOu7BWrTCWlreO6FACpBZGwUw4BvkANLobReHb3kGZYGsGzTq/zlO8AT1ru6uoZbWlqeA6gINJAfnz59OlVLoX8Jtebm5raampqfcMvQYgTknz9//sKVK1c+y83NTdIEuCnaKMuNGzd+6+np6cCtSTkAw9D9X8Dyh+dbgaaAC1XAnUlPTy+qqqq6cPbs2UzkmWjNljiDJzpwHFnCkW2yo6NjCKW8H54wjlezKvRT09LSTsJrz5w6dSoN+Yp51ADAPUj8VoDbDq9pxrwuJcNIYQllJTIi/xopBw/VA7DJp0+f9hA78CgL5F5C8J2CpoCj8sfA6WCe/FPRhsRlZmbGIs8Y4FFO5CJgtrSsvrRVGW1V93b1myoGnKAKEcHgnwsWpg1lNI0fphwrmdqbckeU18WrnlOjqp5/j7W3BWvfQVPKa5SBkcrYCNVB65TRTlWZ1lXiXVU5xbtlDb2SPaLWYwrgHIcqPg6Vc7fbX69Yoyqfa7/AeiegbWOEVhmsVcWDwPn224iDJgla8Hd38Hd3ELQgaIeI/hZgAIPEp0vmQJdoAAAAAElFTkSuQmCC) no-repeat 50% 0; + background-size: 64px; + opacity: 1; +} +.christmas.ant-btn-primary.ant-btn-lg:before { + background-size: 72px; +} +.christmas.ant-btn-primary.ant-btn-sm:before { + background-size: 56px; +} +a.ant-btn { + line-height: 30px; +} +a.ant-btn-lg { + line-height: 38px; +} +a.ant-btn-sm { + line-height: 22px; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-avatar { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + display: inline-block; + text-align: center; + background: #ccc; + color: #fff; + white-space: nowrap; + position: relative; + overflow: hidden; + vertical-align: middle; + width: 32px; + height: 32px; + line-height: 32px; + border-radius: 50%; +} +.ant-avatar-image { + background: transparent; +} +.ant-avatar > * { + line-height: 32px; +} +.ant-avatar.ant-avatar-icon { + font-size: 18px; +} +.ant-avatar-lg { + width: 40px; + height: 40px; + line-height: 40px; + border-radius: 50%; +} +.ant-avatar-lg > * { + line-height: 40px; +} +.ant-avatar-lg.ant-avatar-icon { + font-size: 24px; +} +.ant-avatar-sm { + width: 24px; + height: 24px; + line-height: 24px; + border-radius: 50%; +} +.ant-avatar-sm > * { + line-height: 24px; +} +.ant-avatar-sm.ant-avatar-icon { + font-size: 14px; +} +.ant-avatar-square { + border-radius: 4px; +} +.ant-avatar > img { + width: 100%; + height: 100%; + display: block; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-back-top { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + z-index: 10; + position: fixed; + right: 100px; + bottom: 50px; + height: 40px; + width: 40px; + cursor: pointer; +} +.ant-back-top-content { + height: 40px; + width: 40px; + border-radius: 20px; + background-color: rgba(0, 0, 0, 0.45); + color: #fff; + text-align: center; + -webkit-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + overflow: hidden; +} +.ant-back-top-content:hover { + background-color: rgba(0, 0, 0, 0.65); + -webkit-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); +} +.ant-back-top-icon { + margin: 12px auto; + width: 14px; + height: 16px; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAoCAYAAACWwljjAAAABGdBTUEAALGPC/xhBQAAAbtJREFUWAntmMtKw0AUhhMvS5cuxILgQlRUpIggIoKIIoigG1eC+AA+jo+i6FIXBfeuXIgoeKVeitVWJX5HWhhDksnUpp3FDPyZk3Nm5nycmZKkXhAEOXSA3lG7muTeRzmfy6HneUvIhnYkQK+Q9NhAA0Opg0vBEhjBKHiyb8iGMyQMOYuK41BcBSypAL+MYXSKjtFAW7EAGEO3qN4uMQbbAkXiSfRQJ1H6a+yhlkKRcAoVFYiweYNjtCVQJJpBz2GCiPt7fBOZQpFgDpUikse5HgnkM4Fi4QX0Fpc5wf9EbLqpUCy4jMoJSXWhFwbMNgWKhVbRhy5jirhs9fy/oFhgHVVTJEs7RLZ8sSEoJm6iz7SZDMbJ+/OKERQTttCXQRLToRUmrKWCYuA2+jbN0MB4OQobYShfdTCgn/sL1K36M7TLrN3n+758aPy2rrpR6+/od5E8tf/A1uLS9aId5T7J3CNYihkQ4D9PiMdMC7mp4rjB9kjFjZp8BlnVHJBuO1yFXIV0FdDF3RlyFdJVQBdv5AxVdIsq8apiZ2PyYO1EVykesGfZEESsCkweyR8MUW+V8uJ1gkYipmpdP1pm2aJVPEGzAAAAAElFTkSuQmCC) 100%/100% no-repeat; +} +@media screen and (max-width: 768px) { + .ant-back-top { + right: 60px; + } +} +@media screen and (max-width: 480px) { + .ant-back-top { + right: 20px; + } +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-badge { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + position: relative; + display: inline-block; + line-height: 1; + color: unset; +} +.ant-badge-count { + top: -10px; + height: 20px; + border-radius: 10px; + min-width: 20px; + background: #f5222d; + color: #fff; + line-height: 20px; + text-align: center; + padding: 0 6px; + font-size: 12px; + font-weight: normal; + white-space: nowrap; + -webkit-box-shadow: 0 0 0 1px #fff; + box-shadow: 0 0 0 1px #fff; +} +.ant-badge-count a, +.ant-badge-count a:hover { + color: #fff; +} +.ant-badge-multiple-words { + padding: 0 8px; +} +.ant-badge-dot { + top: -3px; + height: 6px; + width: 6px; + border-radius: 100%; + background: #f5222d; + z-index: 10; + -webkit-box-shadow: 0 0 0 1px #fff; + box-shadow: 0 0 0 1px #fff; +} +.ant-badge-count, +.ant-badge-dot { + position: absolute; + right: 0; + -webkit-transform: translateX(50%); + -ms-transform: translateX(50%); + transform: translateX(50%); + -webkit-transform-origin: 100%; + -ms-transform-origin: 100%; + transform-origin: 100%; +} +.ant-badge-status { + line-height: inherit; + vertical-align: baseline; +} +.ant-badge-status-dot { + width: 6px; + height: 6px; + display: inline-block; + border-radius: 50%; + vertical-align: middle; + position: relative; + top: -1px; +} +.ant-badge-status-success { + background-color: #52c41a; +} +.ant-badge-status-processing { + background-color: #1890ff; + position: relative; +} +.ant-badge-status-processing:after { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border-radius: 50%; + border: 1px solid #1890ff; + content: ''; + -webkit-animation: antStatusProcessing 1.2s infinite ease-in-out; + animation: antStatusProcessing 1.2s infinite ease-in-out; +} +.ant-badge-status-default { + background-color: #d9d9d9; +} +.ant-badge-status-error { + background-color: #f5222d; +} +.ant-badge-status-warning { + background-color: #faad14; +} +.ant-badge-status-text { + color: rgba(0, 0, 0, 0.65); + font-size: 14px; + margin-left: 8px; +} +.ant-badge-zoom-appear, +.ant-badge-zoom-enter { + -webkit-animation: antZoomBadgeIn 0.3s cubic-bezier(0.12, 0.4, 0.29, 1.46); + animation: antZoomBadgeIn 0.3s cubic-bezier(0.12, 0.4, 0.29, 1.46); + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} +.ant-badge-zoom-leave { + -webkit-animation: antZoomBadgeOut 0.3s cubic-bezier(0.71, -0.46, 0.88, 0.6); + animation: antZoomBadgeOut 0.3s cubic-bezier(0.71, -0.46, 0.88, 0.6); + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} +.ant-badge-not-a-wrapper .ant-scroll-number { + top: auto; + display: block; + position: relative; +} +.ant-badge-not-a-wrapper .ant-badge-count { + -webkit-transform: none; + -ms-transform: none; + transform: none; +} +@-webkit-keyframes antStatusProcessing { + 0% { + -webkit-transform: scale(0.8); + transform: scale(0.8); + opacity: 0.5; + } + 100% { + -webkit-transform: scale(2.4); + transform: scale(2.4); + opacity: 0; + } +} +@keyframes antStatusProcessing { + 0% { + -webkit-transform: scale(0.8); + transform: scale(0.8); + opacity: 0.5; + } + 100% { + -webkit-transform: scale(2.4); + transform: scale(2.4); + opacity: 0; + } +} +.ant-scroll-number { + overflow: hidden; +} +.ant-scroll-number-only { + display: inline-block; + -webkit-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + height: 20px; +} +.ant-scroll-number-only > p { + height: 20px; + margin: 0; +} +@-webkit-keyframes antZoomBadgeIn { + 0% { + opacity: 0; + -webkit-transform: scale(0) translateX(50%); + transform: scale(0) translateX(50%); + } + 100% { + -webkit-transform: scale(1) translateX(50%); + transform: scale(1) translateX(50%); + } +} +@keyframes antZoomBadgeIn { + 0% { + opacity: 0; + -webkit-transform: scale(0) translateX(50%); + transform: scale(0) translateX(50%); + } + 100% { + -webkit-transform: scale(1) translateX(50%); + transform: scale(1) translateX(50%); + } +} +@-webkit-keyframes antZoomBadgeOut { + 0% { + -webkit-transform: scale(1) translateX(50%); + transform: scale(1) translateX(50%); + } + 100% { + opacity: 0; + -webkit-transform: scale(0) translateX(50%); + transform: scale(0) translateX(50%); + } +} +@keyframes antZoomBadgeOut { + 0% { + -webkit-transform: scale(1) translateX(50%); + transform: scale(1) translateX(50%); + } + 100% { + opacity: 0; + -webkit-transform: scale(0) translateX(50%); + transform: scale(0) translateX(50%); + } +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-breadcrumb { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + color: rgba(0, 0, 0, 0.45); + font-size: 14px; +} +.ant-breadcrumb .anticon { + font-size: 14px; +} +.ant-breadcrumb a { + color: rgba(0, 0, 0, 0.45); + -webkit-transition: color .3s; + transition: color .3s; +} +.ant-breadcrumb a:hover { + color: #40a9ff; +} +.ant-breadcrumb > span:last-child { + color: rgba(0, 0, 0, 0.65); +} +.ant-breadcrumb > span:last-child .ant-breadcrumb-separator { + display: none; +} +.ant-breadcrumb-separator { + margin: 0 8px; + color: rgba(0, 0, 0, 0.45); +} +.ant-breadcrumb-link > .anticon + span { + margin-left: 4px; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-fullcalendar { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + outline: none; + border-top: 1px solid #d9d9d9; +} +.ant-fullcalendar-month-select { + margin-left: 5px; +} +.ant-fullcalendar-header { + padding: 11px 16px 11px 0; + text-align: right; +} +.ant-fullcalendar-header .ant-select-dropdown { + text-align: left; +} +.ant-fullcalendar-header .ant-radio-group { + margin-left: 8px; + text-align: left; +} +.ant-fullcalendar-header label.ant-radio-button { + height: 22px; + line-height: 20px; + padding: 0 10px; +} +.ant-fullcalendar-date-panel { + position: relative; + outline: none; +} +.ant-fullcalendar-calendar-body { + padding: 8px 12px; +} +.ant-fullcalendar table { + border-collapse: collapse; + max-width: 100%; + background-color: transparent; + width: 100%; + height: 256px; +} +.ant-fullcalendar table, +.ant-fullcalendar th, +.ant-fullcalendar td { + border: 0; +} +.ant-fullcalendar td { + position: relative; +} +.ant-fullcalendar-calendar-table { + border-spacing: 0; + margin-bottom: 0; +} +.ant-fullcalendar-column-header { + line-height: 18px; + padding: 0; + width: 33px; + text-align: center; +} +.ant-fullcalendar-column-header .ant-fullcalendar-column-header-inner { + display: block; + font-weight: normal; +} +.ant-fullcalendar-week-number-header .ant-fullcalendar-column-header-inner { + display: none; +} +.ant-fullcalendar-month, +.ant-fullcalendar-date { + text-align: center; + -webkit-transition: all .3s; + transition: all .3s; +} +.ant-fullcalendar-value { + display: block; + margin: 0 auto; + color: rgba(0, 0, 0, 0.65); + border-radius: 2px; + width: 24px; + height: 24px; + padding: 0; + background: transparent; + line-height: 24px; + -webkit-transition: all .3s; + transition: all .3s; +} +.ant-fullcalendar-value:hover { + background: #e6f7ff; + cursor: pointer; +} +.ant-fullcalendar-value:active { + background: #1890ff; + color: #fff; +} +.ant-fullcalendar-month-panel-cell .ant-fullcalendar-value { + width: 48px; +} +.ant-fullcalendar-today .ant-fullcalendar-value, +.ant-fullcalendar-month-panel-current-cell .ant-fullcalendar-value { + -webkit-box-shadow: 0 0 0 1px #1890ff inset; + box-shadow: 0 0 0 1px #1890ff inset; +} +.ant-fullcalendar-selected-day .ant-fullcalendar-value, +.ant-fullcalendar-month-panel-selected-cell .ant-fullcalendar-value { + background: #1890ff; + color: #fff; +} +.ant-fullcalendar-disabled-cell-first-of-row .ant-fullcalendar-value { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.ant-fullcalendar-disabled-cell-last-of-row .ant-fullcalendar-value { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.ant-fullcalendar-last-month-cell .ant-fullcalendar-value, +.ant-fullcalendar-next-month-btn-day .ant-fullcalendar-value { + color: rgba(0, 0, 0, 0.25); +} +.ant-fullcalendar-month-panel-table { + table-layout: fixed; + width: 100%; + border-collapse: separate; +} +.ant-fullcalendar-content { + position: absolute; + width: 100%; + left: 0; + bottom: -9px; +} +.ant-fullcalendar-fullscreen { + border-top: 0; +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-table { + table-layout: fixed; +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-header .ant-radio-group { + margin-left: 16px; +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-header label.ant-radio-button { + height: 32px; + line-height: 30px; +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-month, +.ant-fullcalendar-fullscreen .ant-fullcalendar-date { + text-align: left; + margin: 0 4px; + display: block; + color: rgba(0, 0, 0, 0.65); + height: 116px; + padding: 4px 8px; + border-top: 2px solid #e8e8e8; + -webkit-transition: background .3s; + transition: background .3s; +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-month:hover, +.ant-fullcalendar-fullscreen .ant-fullcalendar-date:hover { + background: #e6f7ff; + cursor: pointer; +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-month:active, +.ant-fullcalendar-fullscreen .ant-fullcalendar-date:active { + background: #bae7ff; +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-column-header { + text-align: right; + padding-right: 12px; + padding-bottom: 5px; +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-value { + text-align: right; + background: transparent; + width: auto; +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-today .ant-fullcalendar-value { + color: rgba(0, 0, 0, 0.65); +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-current-cell .ant-fullcalendar-month, +.ant-fullcalendar-fullscreen .ant-fullcalendar-today .ant-fullcalendar-date { + border-top-color: #1890ff; + background: transparent; +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-current-cell .ant-fullcalendar-value, +.ant-fullcalendar-fullscreen .ant-fullcalendar-today .ant-fullcalendar-value { + -webkit-box-shadow: none; + box-shadow: none; +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-selected-cell .ant-fullcalendar-month, +.ant-fullcalendar-fullscreen .ant-fullcalendar-selected-day .ant-fullcalendar-date { + background: #e6f7ff; +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-selected-cell .ant-fullcalendar-value, +.ant-fullcalendar-fullscreen .ant-fullcalendar-selected-day .ant-fullcalendar-value { + color: #1890ff; +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-last-month-cell .ant-fullcalendar-date, +.ant-fullcalendar-fullscreen .ant-fullcalendar-next-month-btn-day .ant-fullcalendar-date { + color: rgba(0, 0, 0, 0.25); +} +.ant-fullcalendar-fullscreen .ant-fullcalendar-content { + height: 88px; + overflow-y: auto; + position: static; + width: auto; + left: auto; + bottom: auto; +} +.ant-fullcalendar-disabled-cell .ant-fullcalendar-date, +.ant-fullcalendar-disabled-cell .ant-fullcalendar-date:hover { + cursor: not-allowed; +} +.ant-fullcalendar-disabled-cell:not(.ant-fullcalendar-today) .ant-fullcalendar-date, +.ant-fullcalendar-disabled-cell:not(.ant-fullcalendar-today) .ant-fullcalendar-date:hover { + background: transparent; +} +.ant-fullcalendar-disabled-cell .ant-fullcalendar-value { + color: rgba(0, 0, 0, 0.25); + border-radius: 0; + width: auto; + cursor: not-allowed; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-radio-group { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + display: inline-block; + line-height: unset; +} +.ant-radio-wrapper { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + display: inline-block; + position: relative; + white-space: nowrap; + margin-right: 8px; + cursor: pointer; +} +.ant-radio { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + white-space: nowrap; + outline: none; + display: inline-block; + position: relative; + line-height: 1; + vertical-align: sub; + cursor: pointer; +} +.ant-radio-wrapper:hover .ant-radio .ant-radio-inner, +.ant-radio:hover .ant-radio-inner, +.ant-radio-focused .ant-radio-inner { + border-color: #1890ff; +} +.ant-radio-checked:after { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border-radius: 50%; + border: 1px solid #1890ff; + content: ''; + -webkit-animation: antRadioEffect 0.36s ease-in-out; + animation: antRadioEffect 0.36s ease-in-out; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + visibility: hidden; +} +.ant-radio:hover:after, +.ant-radio-wrapper:hover .ant-radio:after { + visibility: visible; +} +.ant-radio-inner { + position: relative; + top: 0; + left: 0; + display: block; + width: 16px; + height: 16px; + border-width: 1px; + border-style: solid; + border-radius: 100px; + border-color: #d9d9d9; + background-color: #fff; + -webkit-transition: all 0.3s; + transition: all 0.3s; +} +.ant-radio-inner:after { + position: absolute; + width: 8px; + height: 8px; + left: 3px; + top: 3px; + border-radius: 8px; + display: table; + border-top: 0; + border-left: 0; + content: ' '; + background-color: #1890ff; + opacity: 0; + -webkit-transform: scale(0); + -ms-transform: scale(0); + transform: scale(0); + -webkit-transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); + transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); +} +.ant-radio-input { + position: absolute; + left: 0; + z-index: 1; + cursor: pointer; + opacity: 0; + top: 0; + bottom: 0; + right: 0; +} +.ant-radio-checked .ant-radio-inner { + border-color: #1890ff; +} +.ant-radio-checked .ant-radio-inner:after { + -webkit-transform: scale(0.875); + -ms-transform: scale(0.875); + transform: scale(0.875); + opacity: 1; + -webkit-transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); + transition: all 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); +} +.ant-radio-disabled .ant-radio-inner { + border-color: #d9d9d9 !important; + background-color: #f5f5f5; +} +.ant-radio-disabled .ant-radio-inner:after { + background-color: #ccc; +} +.ant-radio-disabled .ant-radio-input { + cursor: not-allowed; +} +.ant-radio-disabled + span { + color: rgba(0, 0, 0, 0.25); + cursor: not-allowed; +} +span.ant-radio + * { + padding-left: 8px; + padding-right: 8px; +} +.ant-radio-button-wrapper { + margin: 0; + height: 32px; + line-height: 30px; + color: rgba(0, 0, 0, 0.65); + display: inline-block; + -webkit-transition: all 0.3s ease; + transition: all 0.3s ease; + cursor: pointer; + border: 1px solid #d9d9d9; + border-left: 0; + border-top-width: 1.02px; + background: #fff; + padding: 0 15px; + position: relative; +} +.ant-radio-button-wrapper a { + color: rgba(0, 0, 0, 0.65); +} +.ant-radio-button-wrapper > .ant-radio-button { + margin-left: 0; + display: block; + width: 0; + height: 0; +} +.ant-radio-group-large .ant-radio-button-wrapper { + height: 40px; + line-height: 38px; + font-size: 16px; +} +.ant-radio-group-small .ant-radio-button-wrapper { + height: 24px; + line-height: 22px; + padding: 0 7px; +} +.ant-radio-button-wrapper:not(:first-child)::before { + content: ""; + display: block; + top: 0; + left: -1px; + width: 1px; + height: 100%; + position: absolute; + background-color: #d9d9d9; +} +.ant-radio-button-wrapper:first-child { + border-radius: 4px 0 0 4px; + border-left: 1px solid #d9d9d9; +} +.ant-radio-button-wrapper:last-child { + border-radius: 0 4px 4px 0; +} +.ant-radio-button-wrapper:first-child:last-child { + border-radius: 4px; +} +.ant-radio-button-wrapper:hover, +.ant-radio-button-wrapper-focused { + color: #1890ff; + position: relative; +} +.ant-radio-button-wrapper .ant-radio-inner, +.ant-radio-button-wrapper input[type="checkbox"], +.ant-radio-button-wrapper input[type="radio"] { + opacity: 0; + width: 0; + height: 0; +} +.ant-radio-button-wrapper-checked { + background: #fff; + border-color: #1890ff; + color: #1890ff; + -webkit-box-shadow: -1px 0 0 0 #1890ff; + box-shadow: -1px 0 0 0 #1890ff; + z-index: 1; +} +.ant-radio-button-wrapper-checked::before { + background-color: #1890ff !important; + opacity: 0.1; +} +.ant-radio-button-wrapper-checked:first-child { + border-color: #1890ff; + -webkit-box-shadow: none !important; + box-shadow: none !important; +} +.ant-radio-button-wrapper-checked:hover { + border-color: #40a9ff; + -webkit-box-shadow: -1px 0 0 0 #40a9ff; + box-shadow: -1px 0 0 0 #40a9ff; + color: #40a9ff; +} +.ant-radio-button-wrapper-checked:active { + border-color: #096dd9; + -webkit-box-shadow: -1px 0 0 0 #096dd9; + box-shadow: -1px 0 0 0 #096dd9; + color: #096dd9; +} +.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled) { + background: #1890ff; + border-color: #1890ff; + color: #fff; +} +.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover { + border-color: #40a9ff; + background: #40a9ff; + color: #fff; +} +.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active { + border-color: #096dd9; + background: #096dd9; + color: #fff; +} +.ant-radio-button-wrapper-disabled { + border-color: #d9d9d9; + background-color: #f5f5f5; + cursor: not-allowed; + color: rgba(0, 0, 0, 0.25); +} +.ant-radio-button-wrapper-disabled:first-child, +.ant-radio-button-wrapper-disabled:hover { + border-color: #d9d9d9; + background-color: #f5f5f5; + color: rgba(0, 0, 0, 0.25); +} +.ant-radio-button-wrapper-disabled:first-child { + border-left-color: #d9d9d9; +} +.ant-radio-button-wrapper-disabled.ant-radio-button-wrapper-checked { + color: #fff; + background-color: #e6e6e6; + border-color: #d9d9d9; + -webkit-box-shadow: none; + box-shadow: none; +} +@-webkit-keyframes antRadioEffect { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 0.5; + } + 100% { + -webkit-transform: scale(1.6); + transform: scale(1.6); + opacity: 0; + } +} +@keyframes antRadioEffect { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 0.5; + } + 100% { + -webkit-transform: scale(1.6); + transform: scale(1.6); + opacity: 0; + } +} +@supports (-moz-appearance:meterbar) and (background-blend-mode:difference,normal) { + .ant-radio { + vertical-align: text-bottom; + } +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-card { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + background: #fff; + border-radius: 2px; + position: relative; + -webkit-transition: all .3s; + transition: all .3s; +} +.ant-card-hoverable { + cursor: pointer; +} +.ant-card-hoverable:hover { + -webkit-box-shadow: 0 2px 8px rgba(0, 0, 0, 0.09); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.09); + border-color: rgba(0, 0, 0, 0.09); +} +.ant-card-bordered { + border: 1px solid #e8e8e8; +} +.ant-card-head { + background: transparent; + border-bottom: 1px solid #e8e8e8; + padding: 0 24px; + border-radius: 2px 2px 0 0; + zoom: 1; + margin-bottom: -1px; + min-height: 48px; + font-size: 16px; + color: rgba(0, 0, 0, 0.85); + font-weight: 500; +} +.ant-card-head:before, +.ant-card-head:after { + content: ""; + display: table; +} +.ant-card-head:after { + clear: both; +} +.ant-card-head-wrapper { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; +} +.ant-card-head-title { + padding: 16px 0; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; +} +.ant-card-head .ant-tabs { + margin-bottom: -17px; + clear: both; + font-size: 14px; + color: rgba(0, 0, 0, 0.65); + font-weight: normal; +} +.ant-card-head .ant-tabs-bar { + border-bottom: 1px solid #e8e8e8; +} +.ant-card-extra { + float: right; + padding: 17.5px 0; + font-size: 14px; + color: rgba(0, 0, 0, 0.65); + font-weight: normal; + text-align: right; + margin-left: auto; +} +.ant-card-body { + padding: 24px; + zoom: 1; +} +.ant-card-body:before, +.ant-card-body:after { + content: ""; + display: table; +} +.ant-card-body:after { + clear: both; +} +.ant-card-contain-grid:not(.ant-card-loading) .ant-card-body { + margin: -1px 0 0 -1px; + padding: 0; +} +.ant-card-grid { + border-radius: 0; + border: 0; + -webkit-box-shadow: 1px 0 0 0 #e8e8e8, 0 1px 0 0 #e8e8e8, 1px 1px 0 0 #e8e8e8, 1px 0 0 0 #e8e8e8 inset, 0 1px 0 0 #e8e8e8 inset; + box-shadow: 1px 0 0 0 #e8e8e8, 0 1px 0 0 #e8e8e8, 1px 1px 0 0 #e8e8e8, 1px 0 0 0 #e8e8e8 inset, 0 1px 0 0 #e8e8e8 inset; + width: 33.33%; + float: left; + padding: 24px; + -webkit-transition: all .3s; + transition: all .3s; +} +.ant-card-grid:hover { + position: relative; + z-index: 1; + -webkit-box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} +.ant-card-contain-tabs > .ant-card-head .ant-card-head-title { + padding-bottom: 0; + min-height: 32px; +} +.ant-card-contain-tabs .ant-card-extra { + padding-bottom: 0; +} +.ant-card-cover > * { + width: 100%; + display: block; +} +.ant-card-cover img { + border-radius: 2px 2px 0 0; +} +.ant-card-actions { + border-top: 1px solid #e8e8e8; + background: #fafafa; + zoom: 1; + list-style: none; + margin: 0; + padding: 0; +} +.ant-card-actions:before, +.ant-card-actions:after { + content: ""; + display: table; +} +.ant-card-actions:after { + clear: both; +} +.ant-card-actions > li { + float: left; + text-align: center; + margin: 12px 0; + color: rgba(0, 0, 0, 0.45); +} +.ant-card-actions > li > span { + display: inline-block; + font-size: 14px; + cursor: pointer; + line-height: 22px; + min-width: 32px; + position: relative; +} +.ant-card-actions > li > span:hover { + color: #1890ff; + -webkit-transition: color .3s; + transition: color .3s; +} +.ant-card-actions > li > span > .anticon { + font-size: 16px; + line-height: 22px; +} +.ant-card-actions > li > span a { + color: rgba(0, 0, 0, 0.45); + line-height: 22px; + display: inline-block; + width: 100%; +} +.ant-card-actions > li > span a:hover { + color: #1890ff; +} +.ant-card-actions > li:not(:last-child) { + border-right: 1px solid #e8e8e8; +} +.ant-card-wider-padding .ant-card-head { + padding: 0 32px; +} +.ant-card-wider-padding .ant-card-body { + padding: 24px 32px; +} +.ant-card-padding-transition .ant-card-head, +.ant-card-padding-transition .ant-card-body { + -webkit-transition: padding .3s; + transition: padding .3s; +} +.ant-card-type-inner .ant-card-head { + padding: 0 24px; + background: #fafafa; +} +.ant-card-type-inner .ant-card-head-title { + padding: 12px 0; + font-size: 14px; +} +.ant-card-type-inner .ant-card-body { + padding: 16px 24px; +} +.ant-card-type-inner .ant-card-extra { + padding: 13.5px 0; +} +.ant-card-meta { + margin: -4px 0; + zoom: 1; +} +.ant-card-meta:before, +.ant-card-meta:after { + content: ""; + display: table; +} +.ant-card-meta:after { + clear: both; +} +.ant-card-meta-avatar { + padding-right: 16px; + float: left; +} +.ant-card-meta-detail { + overflow: hidden; +} +.ant-card-meta-detail > div:not(:last-child) { + margin-bottom: 8px; +} +.ant-card-meta-title { + font-size: 16px; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + color: rgba(0, 0, 0, 0.85); + font-weight: 500; +} +.ant-card-meta-description { + color: rgba(0, 0, 0, 0.45); +} +.ant-card-loading .ant-card-body { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.ant-card-loading-content p { + margin: 0; +} +.ant-card-loading-block { + height: 14px; + margin: 4px 0; + border-radius: 2px; + background: -webkit-gradient(linear, left top, right top, from(rgba(207, 216, 220, 0.2)), color-stop(rgba(207, 216, 220, 0.4)), to(rgba(207, 216, 220, 0.2))); + background: -webkit-linear-gradient(left, rgba(207, 216, 220, 0.2), rgba(207, 216, 220, 0.4), rgba(207, 216, 220, 0.2)); + background: linear-gradient(90deg, rgba(207, 216, 220, 0.2), rgba(207, 216, 220, 0.4), rgba(207, 216, 220, 0.2)); + -webkit-animation: card-loading 1.4s ease infinite; + animation: card-loading 1.4s ease infinite; + background-size: 600% 600%; +} +@-webkit-keyframes card-loading { + 0%, + 100% { + background-position: 0 50%; + } + 50% { + background-position: 100% 50%; + } +} +@keyframes card-loading { + 0%, + 100% { + background-position: 0 50%; + } + 50% { + background-position: 100% 50%; + } +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-nav-container { + height: 40px; +} +.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-ink-bar { + visibility: hidden; +} +.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab { + margin: 0; + border: 1px solid #e8e8e8; + border-bottom: 0; + border-radius: 4px 4px 0 0; + background: #fafafa; + margin-right: 2px; + padding: 0 16px; + -webkit-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + line-height: 38px; +} +.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab-active { + background: #fff; + border-color: #e8e8e8; + color: #1890ff; + padding-bottom: 1px; +} +.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab-inactive { + padding: 0; +} +.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-nav-wrap { + margin-bottom: 0; +} +.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab .ant-tabs-close-x { + color: rgba(0, 0, 0, 0.45); + -webkit-transition: all .3s; + transition: all .3s; + font-size: 12px; + margin-left: 3px; + margin-right: -5px; + overflow: hidden; + vertical-align: middle; + width: 16px; + height: 16px; + height: 14px; +} +.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab .ant-tabs-close-x:hover { + color: rgba(0, 0, 0, 0.85); +} +.ant-tabs.ant-tabs-card .ant-tabs-content > .ant-tabs-tabpane, +.ant-tabs.ant-tabs-editable-card .ant-tabs-content > .ant-tabs-tabpane { + -webkit-transition: none !important; + transition: none !important; +} +.ant-tabs.ant-tabs-card .ant-tabs-content > .ant-tabs-tabpane-inactive, +.ant-tabs.ant-tabs-editable-card .ant-tabs-content > .ant-tabs-tabpane-inactive { + overflow: hidden; +} +.ant-tabs.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab:hover .anticon-close { + opacity: 1; +} +.ant-tabs-extra-content { + line-height: 40px; +} +.ant-tabs-extra-content .ant-tabs-new-tab { + position: relative; + width: 20px; + height: 20px; + line-height: 20px; + text-align: center; + cursor: pointer; + border-radius: 2px; + border: 1px solid #e8e8e8; + font-size: 12px; + color: rgba(0, 0, 0, 0.65); + -webkit-transition: all .3s; + transition: all .3s; +} +.ant-tabs-extra-content .ant-tabs-new-tab:hover { + color: #1890ff; + border-color: #1890ff; +} +.ant-tabs-extra-content .ant-tabs-new-tab svg { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; +} +.ant-tabs-vertical.ant-tabs-card > .ant-tabs-bar .ant-tabs-nav-container { + height: auto; +} +.ant-tabs-vertical.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab { + border-bottom: 1px solid #e8e8e8; + margin-bottom: 8px; +} +.ant-tabs-vertical.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab-active { + padding-bottom: 4px; +} +.ant-tabs-vertical.ant-tabs-card > .ant-tabs-bar .ant-tabs-tab:last-child { + margin-bottom: 8px; +} +.ant-tabs-vertical.ant-tabs-card > .ant-tabs-bar .ant-tabs-new-tab { + width: 90%; +} +.ant-tabs-vertical.ant-tabs-card.ant-tabs-left > .ant-tabs-bar .ant-tabs-nav-wrap { + margin-right: 0; +} +.ant-tabs-vertical.ant-tabs-card.ant-tabs-left > .ant-tabs-bar .ant-tabs-tab { + border-right: 0; + border-radius: 4px 0 0 4px; + margin-right: 1px; +} +.ant-tabs-vertical.ant-tabs-card.ant-tabs-left > .ant-tabs-bar .ant-tabs-tab-active { + margin-right: -1px; + padding-right: 18px; +} +.ant-tabs-vertical.ant-tabs-card.ant-tabs-right > .ant-tabs-bar .ant-tabs-nav-wrap { + margin-left: 0; +} +.ant-tabs-vertical.ant-tabs-card.ant-tabs-right > .ant-tabs-bar .ant-tabs-tab { + border-left: 0; + border-radius: 0 4px 4px 0; + margin-left: 1px; +} +.ant-tabs-vertical.ant-tabs-card.ant-tabs-right > .ant-tabs-bar .ant-tabs-tab-active { + margin-left: -1px; + padding-left: 18px; +} +.ant-tabs.ant-tabs-card.ant-tabs-bottom > .ant-tabs-bar .ant-tabs-tab { + border-bottom: 1px solid #e8e8e8; + border-top: 0; + border-radius: 0 0 4px 4px; +} +.ant-tabs.ant-tabs-card.ant-tabs-bottom > .ant-tabs-bar .ant-tabs-tab-active { + color: #1890ff; + padding-bottom: 0; + padding-top: 1px; +} +.ant-tabs { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + position: relative; + overflow: hidden; + zoom: 1; +} +.ant-tabs:before, +.ant-tabs:after { + content: ""; + display: table; +} +.ant-tabs:after { + clear: both; +} +.ant-tabs-ink-bar { + z-index: 1; + position: absolute; + left: 0; + bottom: 1px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + height: 2px; + background-color: #1890ff; + -webkit-transform-origin: 0 0; + -ms-transform-origin: 0 0; + transform-origin: 0 0; +} +.ant-tabs-bar { + border-bottom: 1px solid #e8e8e8; + margin: 0 0 16px 0; + outline: none; + -webkit-transition: padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); +} +.ant-tabs-nav-container { + overflow: hidden; + font-size: 14px; + line-height: 1.5; + -webkit-box-sizing: border-box; + box-sizing: border-box; + position: relative; + white-space: nowrap; + margin-bottom: -1px; + -webkit-transition: padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + zoom: 1; +} +.ant-tabs-nav-container:before, +.ant-tabs-nav-container:after { + content: ""; + display: table; +} +.ant-tabs-nav-container:after { + clear: both; +} +.ant-tabs-nav-container-scrolling { + padding-left: 32px; + padding-right: 32px; +} +.ant-tabs-bottom .ant-tabs-bar { + border-bottom: none; + border-top: 1px solid #e8e8e8; +} +.ant-tabs-bottom .ant-tabs-ink-bar { + bottom: auto; + top: 1px; +} +.ant-tabs-bottom .ant-tabs-nav-container { + margin-bottom: 0; + margin-top: -1px; +} +.ant-tabs-tab-prev, +.ant-tabs-tab-next { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + z-index: 2; + width: 0; + height: 100%; + cursor: pointer; + border: 0; + background-color: transparent; + position: absolute; + text-align: center; + color: rgba(0, 0, 0, 0.45); + -webkit-transition: width 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: width 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + opacity: 0; + pointer-events: none; +} +.ant-tabs-tab-prev.ant-tabs-tab-arrow-show, +.ant-tabs-tab-next.ant-tabs-tab-arrow-show { + opacity: 1; + width: 32px; + height: 100%; + pointer-events: auto; +} +.ant-tabs-tab-prev:hover, +.ant-tabs-tab-next:hover { + color: rgba(0, 0, 0, 0.65); +} +.ant-tabs-tab-prev-icon, +.ant-tabs-tab-next-icon { + font-style: normal; + font-weight: bold; + font-variant: normal; + line-height: inherit; + vertical-align: baseline; + position: absolute; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + text-align: center; + text-transform: none; +} +.ant-tabs-tab-prev-icon-target, +.ant-tabs-tab-next-icon-target { + display: block; + display: inline-block; + font-size: 12px; + font-size: 10px \9; + -webkit-transform: scale(0.83333333) rotate(0deg); + -ms-transform: scale(0.83333333) rotate(0deg); + transform: scale(0.83333333) rotate(0deg); +} +:root .ant-tabs-tab-prev-icon-target, +:root .ant-tabs-tab-next-icon-target { + font-size: 12px; +} +.ant-tabs-tab-btn-disabled { + cursor: not-allowed; +} +.ant-tabs-tab-btn-disabled, +.ant-tabs-tab-btn-disabled:hover { + color: rgba(0, 0, 0, 0.25); +} +.ant-tabs-tab-next { + right: 2px; +} +.ant-tabs-tab-prev { + left: 0; +} +:root .ant-tabs-tab-prev { + -webkit-filter: none; + filter: none; +} +.ant-tabs-nav-wrap { + overflow: hidden; + margin-bottom: -1px; +} +.ant-tabs-nav-scroll { + overflow: hidden; + white-space: nowrap; +} +.ant-tabs-nav { + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding-left: 0; + -webkit-transition: -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + position: relative; + margin: 0; + list-style: none; + display: inline-block; +} +.ant-tabs-nav:before, +.ant-tabs-nav:after { + display: table; + content: " "; +} +.ant-tabs-nav:after { + clear: both; +} +.ant-tabs-nav .ant-tabs-tab-disabled { + pointer-events: none; + cursor: default; + color: rgba(0, 0, 0, 0.25); +} +.ant-tabs-nav .ant-tabs-tab { + display: inline-block; + height: 100%; + margin: 0 32px 0 0; + padding: 12px 16px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + position: relative; + -webkit-transition: color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + cursor: pointer; + text-decoration: none; +} +.ant-tabs-nav .ant-tabs-tab:last-child { + margin-right: 0; +} +.ant-tabs-nav .ant-tabs-tab:hover { + color: #40a9ff; +} +.ant-tabs-nav .ant-tabs-tab:active { + color: #096dd9; +} +.ant-tabs-nav .ant-tabs-tab .anticon { + margin-right: 8px; +} +.ant-tabs-nav .ant-tabs-tab-active { + color: #1890ff; + font-weight: 500; +} +.ant-tabs-large > .ant-tabs-bar .ant-tabs-nav-container { + font-size: 16px; +} +.ant-tabs-large > .ant-tabs-bar .ant-tabs-tab { + padding: 16px; +} +.ant-tabs-small > .ant-tabs-bar .ant-tabs-nav-container { + font-size: 14px; +} +.ant-tabs-small > .ant-tabs-bar .ant-tabs-tab { + padding: 8px 16px; +} +.ant-tabs:not(.ant-tabs-vertical) > .ant-tabs-content { + width: 100%; +} +.ant-tabs:not(.ant-tabs-vertical) > .ant-tabs-content > .ant-tabs-tabpane { + -webkit-flex-shrink: 0; + -ms-flex-negative: 0; + flex-shrink: 0; + width: 100%; + -webkit-transition: opacity .45s; + transition: opacity .45s; + opacity: 1; +} +.ant-tabs:not(.ant-tabs-vertical) > .ant-tabs-content > .ant-tabs-tabpane-inactive { + opacity: 0; + height: 0; + padding: 0 !important; + pointer-events: none; +} +.ant-tabs:not(.ant-tabs-vertical) > .ant-tabs-content > .ant-tabs-tabpane-inactive input { + visibility: hidden; +} +.ant-tabs:not(.ant-tabs-vertical) > .ant-tabs-content-animated { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; + will-change: margin-left; + -webkit-transition: margin-left 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: margin-left 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); +} +.ant-tabs-vertical > .ant-tabs-bar { + border-bottom: 0; + height: 100%; +} +.ant-tabs-vertical > .ant-tabs-bar-tab-prev, +.ant-tabs-vertical > .ant-tabs-bar-tab-next { + width: 32px; + height: 0; + -webkit-transition: height 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: height 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); +} +.ant-tabs-vertical > .ant-tabs-bar-tab-prev.ant-tabs-tab-arrow-show, +.ant-tabs-vertical > .ant-tabs-bar-tab-next.ant-tabs-tab-arrow-show { + width: 100%; + height: 32px; +} +.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-tab { + float: none; + margin: 0 0 16px 0; + padding: 8px 24px; + display: block; +} +.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-tab:last-child { + margin-bottom: 0; +} +.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-extra-content { + text-align: center; +} +.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-nav-scroll { + width: auto; +} +.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-nav-container, +.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-nav-wrap { + height: 100%; +} +.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-nav-container { + margin-bottom: 0; +} +.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-nav-container.ant-tabs-nav-container-scrolling { + padding: 32px 0; +} +.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-nav-wrap { + margin-bottom: 0; +} +.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-nav { + width: 100%; +} +.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-ink-bar { + width: 2px; + left: auto; + height: auto; + top: 0; +} +.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-tab-next { + width: 100%; + bottom: 0; + height: 32px; +} +.ant-tabs-vertical > .ant-tabs-bar .ant-tabs-tab-prev { + top: 0; + width: 100%; + height: 32px; +} +.ant-tabs-vertical > .ant-tabs-content { + overflow: hidden; + width: auto; + margin-top: 0 !important; +} +.ant-tabs-vertical.ant-tabs-left > .ant-tabs-bar { + float: left; + border-right: 1px solid #e8e8e8; + margin-right: -1px; + margin-bottom: 0; +} +.ant-tabs-vertical.ant-tabs-left > .ant-tabs-bar .ant-tabs-tab { + text-align: right; +} +.ant-tabs-vertical.ant-tabs-left > .ant-tabs-bar .ant-tabs-nav-container { + margin-right: -1px; +} +.ant-tabs-vertical.ant-tabs-left > .ant-tabs-bar .ant-tabs-nav-wrap { + margin-right: -1px; +} +.ant-tabs-vertical.ant-tabs-left > .ant-tabs-bar .ant-tabs-ink-bar { + right: 1px; +} +.ant-tabs-vertical.ant-tabs-left > .ant-tabs-content { + padding-left: 24px; + border-left: 1px solid #e8e8e8; +} +.ant-tabs-vertical.ant-tabs-right > .ant-tabs-bar { + float: right; + border-left: 1px solid #e8e8e8; + margin-left: -1px; + margin-bottom: 0; +} +.ant-tabs-vertical.ant-tabs-right > .ant-tabs-bar .ant-tabs-nav-container { + margin-left: -1px; +} +.ant-tabs-vertical.ant-tabs-right > .ant-tabs-bar .ant-tabs-nav-wrap { + margin-left: -1px; +} +.ant-tabs-vertical.ant-tabs-right > .ant-tabs-bar .ant-tabs-ink-bar { + left: 1px; +} +.ant-tabs-vertical.ant-tabs-right > .ant-tabs-content { + padding-right: 24px; + border-right: 1px solid #e8e8e8; +} +.ant-tabs-bottom > .ant-tabs-bar { + margin-bottom: 0; + margin-top: 16px; +} +.ant-tabs-top .ant-tabs-ink-bar-animated, +.ant-tabs-bottom .ant-tabs-ink-bar-animated { + -webkit-transition: width 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: width 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), width 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), width 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); +} +.ant-tabs-left .ant-tabs-ink-bar-animated, +.ant-tabs-right .ant-tabs-ink-bar-animated { + -webkit-transition: height 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: height 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), height 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), height 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); +} +.no-flex > .ant-tabs-content-animated, +.ant-tabs-no-animation > .ant-tabs-content-animated, +.ant-tabs-vertical > .ant-tabs-content-animated { + -webkit-transform: none !important; + -ms-transform: none !important; + transform: none !important; + margin-left: 0 !important; +} +.no-flex > .ant-tabs-content > .ant-tabs-tabpane-inactive, +.ant-tabs-no-animation > .ant-tabs-content > .ant-tabs-tabpane-inactive, +.ant-tabs-vertical > .ant-tabs-content > .ant-tabs-tabpane-inactive { + display: none; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-carousel { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; +} +.ant-carousel .slick-slider { + position: relative; + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + -webkit-touch-callout: none; + -ms-touch-action: pan-y; + touch-action: pan-y; + -webkit-tap-highlight-color: transparent; +} +.ant-carousel .slick-list { + position: relative; + overflow: hidden; + display: block; + margin: 0; + padding: 0; +} +.ant-carousel .slick-list:focus { + outline: none; +} +.ant-carousel .slick-list.dragging { + cursor: pointer; +} +.ant-carousel .slick-slider .slick-track, +.ant-carousel .slick-slider .slick-list { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} +.ant-carousel .slick-track { + position: relative; + left: 0; + top: 0; + display: block; +} +.ant-carousel .slick-track:before, +.ant-carousel .slick-track:after { + content: ""; + display: table; +} +.ant-carousel .slick-track:after { + clear: both; +} +.slick-loading .ant-carousel .slick-track { + visibility: hidden; +} +.ant-carousel .slick-slide { + float: left; + height: 100%; + min-height: 1px; + display: none; +} +[dir="rtl"] .ant-carousel .slick-slide { + float: right; +} +.ant-carousel .slick-slide img { + display: block; +} +.ant-carousel .slick-slide.slick-loading img { + display: none; +} +.ant-carousel .slick-slide.dragging img { + pointer-events: none; +} +.ant-carousel .slick-initialized .slick-slide { + display: block; +} +.ant-carousel .slick-loading .slick-slide { + visibility: hidden; +} +.ant-carousel .slick-vertical .slick-slide { + display: block; + height: auto; + border: 1px solid transparent; +} +.ant-carousel .slick-arrow.slick-hidden { + display: none; +} +.ant-carousel .slick-prev, +.ant-carousel .slick-next { + position: absolute; + display: block; + height: 20px; + width: 20px; + line-height: 0; + font-size: 0; + cursor: pointer; + background: transparent; + color: transparent; + top: 50%; + margin-top: -10px; + padding: 0; + border: 0; + outline: none; +} +.ant-carousel .slick-prev:hover, +.ant-carousel .slick-next:hover, +.ant-carousel .slick-prev:focus, +.ant-carousel .slick-next:focus { + outline: none; + background: transparent; + color: transparent; +} +.ant-carousel .slick-prev:hover:before, +.ant-carousel .slick-next:hover:before, +.ant-carousel .slick-prev:focus:before, +.ant-carousel .slick-next:focus:before { + opacity: 1; +} +.ant-carousel .slick-prev.slick-disabled:before, +.ant-carousel .slick-next.slick-disabled:before { + opacity: 0.25; +} +.ant-carousel .slick-prev { + left: -25px; +} +.ant-carousel .slick-prev:before { + content: "\2190"; +} +.ant-carousel .slick-next { + right: -25px; +} +.ant-carousel .slick-next:before { + content: "\2192"; +} +.ant-carousel .slick-dots { + position: absolute; + bottom: 12px; + list-style: none; + display: block; + text-align: center; + margin: 0; + padding: 0; + width: 100%; + height: 3px; +} +.ant-carousel .slick-dots li { + position: relative; + display: inline-block; + vertical-align: top; + text-align: center; + margin: 0 2px; + padding: 0; +} +.ant-carousel .slick-dots li button { + border: 0; + cursor: pointer; + background: #fff; + opacity: 0.3; + display: block; + width: 16px; + height: 3px; + border-radius: 1px; + outline: none; + font-size: 0; + color: transparent; + -webkit-transition: all .5s; + transition: all .5s; + padding: 0; +} +.ant-carousel .slick-dots li button:hover, +.ant-carousel .slick-dots li button:focus { + opacity: 0.75; +} +.ant-carousel .slick-dots li.slick-active button { + background: #fff; + opacity: 1; + width: 24px; +} +.ant-carousel .slick-dots li.slick-active button:hover, +.ant-carousel .slick-dots li.slick-active button:focus { + opacity: 1; +} +.ant-carousel-vertical .slick-dots { + width: 3px; + bottom: auto; + right: 12px; + top: 50%; + -webkit-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); + height: auto; +} +.ant-carousel-vertical .slick-dots li { + margin: 0 2px; + vertical-align: baseline; +} +.ant-carousel-vertical .slick-dots li button { + width: 3px; + height: 16px; +} +.ant-carousel-vertical .slick-dots li.slick-active button { + width: 3px; + height: 24px; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-cascader { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; +} +.ant-cascader-input.ant-input { + background-color: transparent !important; + cursor: pointer; + width: 100%; + position: static; +} +.ant-cascader-picker-show-search .ant-cascader-input.ant-input { + position: relative; +} +.ant-cascader-picker { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + position: relative; + display: inline-block; + cursor: pointer; + background-color: #fff; + border-radius: 4px; + outline: 0; + -webkit-transition: color .3s; + transition: color .3s; +} +.ant-cascader-picker-with-value .ant-cascader-picker-label { + color: transparent; +} +.ant-cascader-picker-disabled { + cursor: not-allowed; + background: #f5f5f5; + color: rgba(0, 0, 0, 0.25); +} +.ant-cascader-picker-disabled .ant-cascader-input { + cursor: not-allowed; +} +.ant-cascader-picker:focus .ant-cascader-input { + border-color: #40a9ff; + outline: 0; + -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-cascader-picker-show-search.ant-cascader-picker-focused { + color: rgba(0, 0, 0, 0.25); +} +.ant-cascader-picker-label { + position: absolute; + left: 0; + height: 20px; + line-height: 20px; + top: 50%; + margin-top: -10px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + width: 100%; + padding: 0 12px; +} +.ant-cascader-picker-clear { + opacity: 0; + position: absolute; + right: 12px; + z-index: 2; + background: #fff; + top: 50%; + font-size: 12px; + color: rgba(0, 0, 0, 0.25); + width: 12px; + height: 12px; + margin-top: -6px; + line-height: 12px; + cursor: pointer; + -webkit-transition: color 0.3s ease, opacity 0.15s ease; + transition: color 0.3s ease, opacity 0.15s ease; +} +.ant-cascader-picker-clear:hover { + color: rgba(0, 0, 0, 0.45); +} +.ant-cascader-picker:hover .ant-cascader-picker-clear { + opacity: 1; +} +.ant-cascader-picker-arrow { + position: absolute; + z-index: 1; + top: 50%; + right: 12px; + width: 12px; + height: 12px; + font-size: 12px; + margin-top: -6px; + line-height: 12px; + color: rgba(0, 0, 0, 0.25); + -webkit-transition: -webkit-transform .2s; + transition: -webkit-transform .2s; + transition: transform .2s; + transition: transform .2s, -webkit-transform .2s; +} +.ant-cascader-picker-arrow.ant-cascader-picker-arrow-expand { + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.ant-cascader-picker-small .ant-cascader-picker-clear, +.ant-cascader-picker-small .ant-cascader-picker-arrow { + right: 8px; +} +.ant-cascader-menus { + font-size: 14px; + background: #fff; + position: absolute; + z-index: 1050; + border-radius: 4px; + -webkit-box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + white-space: nowrap; +} +.ant-cascader-menus ul, +.ant-cascader-menus ol { + list-style: none; + margin: 0; + padding: 0; +} +.ant-cascader-menus-empty, +.ant-cascader-menus-hidden { + display: none; +} +.ant-cascader-menus.slide-up-enter.slide-up-enter-active.ant-cascader-menus-placement-bottomLeft, +.ant-cascader-menus.slide-up-appear.slide-up-appear-active.ant-cascader-menus-placement-bottomLeft { + -webkit-animation-name: antSlideUpIn; + animation-name: antSlideUpIn; +} +.ant-cascader-menus.slide-up-enter.slide-up-enter-active.ant-cascader-menus-placement-topLeft, +.ant-cascader-menus.slide-up-appear.slide-up-appear-active.ant-cascader-menus-placement-topLeft { + -webkit-animation-name: antSlideDownIn; + animation-name: antSlideDownIn; +} +.ant-cascader-menus.slide-up-leave.slide-up-leave-active.ant-cascader-menus-placement-bottomLeft { + -webkit-animation-name: antSlideUpOut; + animation-name: antSlideUpOut; +} +.ant-cascader-menus.slide-up-leave.slide-up-leave-active.ant-cascader-menus-placement-topLeft { + -webkit-animation-name: antSlideDownOut; + animation-name: antSlideDownOut; +} +.ant-cascader-menu { + display: inline-block; + vertical-align: top; + min-width: 111px; + height: 180px; + list-style: none; + margin: 0; + padding: 0; + border-right: 1px solid #e8e8e8; + overflow: auto; + -ms-overflow-style: -ms-autohiding-scrollbar; +} +.ant-cascader-menu:first-child { + border-radius: 4px 0 0 4px; +} +.ant-cascader-menu:last-child { + border-right-color: transparent; + margin-right: -1px; + border-radius: 0 4px 4px 0; +} +.ant-cascader-menu:only-child { + border-radius: 4px; +} +.ant-cascader-menu-item { + padding: 5px 12px; + line-height: 22px; + cursor: pointer; + white-space: nowrap; + -webkit-transition: all 0.3s; + transition: all 0.3s; +} +.ant-cascader-menu-item:hover { + background: #e6f7ff; +} +.ant-cascader-menu-item-disabled { + cursor: not-allowed; + color: rgba(0, 0, 0, 0.25); +} +.ant-cascader-menu-item-disabled:hover { + background: transparent; +} +.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled), +.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled):hover { + background: #f5f5f5; + font-weight: 600; +} +.ant-cascader-menu-item-expand { + position: relative; + padding-right: 24px; +} +.ant-cascader-menu-item-expand .ant-cascader-menu-item-expand-icon, +.ant-cascader-menu-item-expand .ant-cascader-menu-item-loading-icon { + display: inline-block; + font-size: 12px; + font-size: 10px \9; + -webkit-transform: scale(0.83333333) rotate(0deg); + -ms-transform: scale(0.83333333) rotate(0deg); + transform: scale(0.83333333) rotate(0deg); + color: rgba(0, 0, 0, 0.45); + position: absolute; + right: 12px; +} +:root .ant-cascader-menu-item-expand .ant-cascader-menu-item-expand-icon, +:root .ant-cascader-menu-item-expand .ant-cascader-menu-item-loading-icon { + font-size: 12px; +} +.ant-cascader-menu-item .ant-cascader-menu-item-keyword { + color: #f5222d; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +@-webkit-keyframes antCheckboxEffect { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 0.5; + } + 100% { + -webkit-transform: scale(1.6); + transform: scale(1.6); + opacity: 0; + } +} +@keyframes antCheckboxEffect { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 0.5; + } + 100% { + -webkit-transform: scale(1.6); + transform: scale(1.6); + opacity: 0; + } +} +.ant-checkbox { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + white-space: nowrap; + cursor: pointer; + outline: none; + display: inline-block; + line-height: 1; + position: relative; + vertical-align: middle; + top: -0.09em; +} +.ant-checkbox-wrapper:hover .ant-checkbox-inner, +.ant-checkbox:hover .ant-checkbox-inner, +.ant-checkbox-input:focus + .ant-checkbox-inner { + border-color: #1890ff; +} +.ant-checkbox-checked:after { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border-radius: 2px; + border: 1px solid #1890ff; + content: ''; + -webkit-animation: antCheckboxEffect 0.36s ease-in-out; + animation: antCheckboxEffect 0.36s ease-in-out; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + visibility: hidden; +} +.ant-checkbox:hover:after, +.ant-checkbox-wrapper:hover .ant-checkbox:after { + visibility: visible; +} +.ant-checkbox-inner { + position: relative; + top: 0; + left: 0; + display: block; + width: 16px; + height: 16px; + border: 1px solid #d9d9d9; + border-radius: 2px; + background-color: #fff; + -webkit-transition: all .3s; + transition: all .3s; +} +.ant-checkbox-inner:after { + -webkit-transform: rotate(45deg) scale(0); + -ms-transform: rotate(45deg) scale(0); + transform: rotate(45deg) scale(0); + position: absolute; + left: 4.57142857px; + top: 1.14285714px; + display: table; + width: 5.71428571px; + height: 9.14285714px; + border: 2px solid #fff; + border-top: 0; + border-left: 0; + content: ' '; + -webkit-transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s; + transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s; + opacity: 0; +} +.ant-checkbox-input { + position: absolute; + left: 0; + z-index: 1; + cursor: pointer; + opacity: 0; + top: 0; + bottom: 0; + right: 0; + width: 100%; + height: 100%; +} +.ant-checkbox-indeterminate .ant-checkbox-inner:after { + content: ' '; + -webkit-transform: translate(-50%, -50%) scale(1); + -ms-transform: translate(-50%, -50%) scale(1); + transform: translate(-50%, -50%) scale(1); + border: 0; + left: 50%; + top: 50%; + width: 8px; + height: 8px; + background-color: #1890ff; + opacity: 1; +} +.ant-checkbox-indeterminate.ant-checkbox-disabled .ant-checkbox-inner:after { + border-color: rgba(0, 0, 0, 0.25); +} +.ant-checkbox-checked .ant-checkbox-inner:after { + -webkit-transform: rotate(45deg) scale(1); + -ms-transform: rotate(45deg) scale(1); + transform: rotate(45deg) scale(1); + position: absolute; + display: table; + border: 2px solid #fff; + border-top: 0; + border-left: 0; + content: ' '; + -webkit-transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s; + transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s; + opacity: 1; +} +.ant-checkbox-checked .ant-checkbox-inner { + background-color: #1890ff; + border-color: #1890ff; +} +.ant-checkbox-disabled { + cursor: not-allowed; +} +.ant-checkbox-disabled.ant-checkbox-checked .ant-checkbox-inner:after { + -webkit-animation-name: none; + animation-name: none; + border-color: rgba(0, 0, 0, 0.25); +} +.ant-checkbox-disabled .ant-checkbox-input { + cursor: not-allowed; +} +.ant-checkbox-disabled .ant-checkbox-inner { + border-color: #d9d9d9 !important; + background-color: #f5f5f5; +} +.ant-checkbox-disabled .ant-checkbox-inner:after { + -webkit-animation-name: none; + animation-name: none; + border-color: #f5f5f5; +} +.ant-checkbox-disabled + span { + color: rgba(0, 0, 0, 0.25); + cursor: not-allowed; +} +.ant-checkbox-wrapper { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + line-height: unset; + cursor: pointer; + display: inline-block; +} +.ant-checkbox-wrapper + .ant-checkbox-wrapper { + margin-left: 8px; +} +.ant-checkbox-wrapper + span, +.ant-checkbox + span { + padding-left: 8px; + padding-right: 8px; +} +.ant-checkbox-group { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + display: inline-block; +} +.ant-checkbox-group-item { + display: inline-block; + margin-right: 8px; +} +.ant-checkbox-group-item:last-child { + margin-right: 0; +} +.ant-checkbox-group-item + .ant-checkbox-group-item { + margin-left: 0; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-row { + position: relative; + margin-left: 0; + margin-right: 0; + height: auto; + zoom: 1; + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.ant-row:before, +.ant-row:after { + content: ""; + display: table; +} +.ant-row:after { + clear: both; +} +.ant-row-flex { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-flow: row wrap; + -ms-flex-flow: row wrap; + flex-flow: row wrap; +} +.ant-row-flex:before, +.ant-row-flex:after { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; +} +.ant-row-flex-start { + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; +} +.ant-row-flex-center { + -webkit-box-pack: center; + -webkit-justify-content: center; + -ms-flex-pack: center; + justify-content: center; +} +.ant-row-flex-end { + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; +} +.ant-row-flex-space-between { + -webkit-box-pack: justify; + -webkit-justify-content: space-between; + -ms-flex-pack: justify; + justify-content: space-between; +} +.ant-row-flex-space-around { + -webkit-justify-content: space-around; + -ms-flex-pack: distribute; + justify-content: space-around; +} +.ant-row-flex-top { + -webkit-box-align: start; + -webkit-align-items: flex-start; + -ms-flex-align: start; + align-items: flex-start; +} +.ant-row-flex-middle { + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; +} +.ant-row-flex-bottom { + -webkit-box-align: end; + -webkit-align-items: flex-end; + -ms-flex-align: end; + align-items: flex-end; +} +.ant-col { + position: relative; + display: block; +} +.ant-col-1, .ant-col-xs-1, .ant-col-sm-1, .ant-col-md-1, .ant-col-lg-1, .ant-col-2, .ant-col-xs-2, .ant-col-sm-2, .ant-col-md-2, .ant-col-lg-2, .ant-col-3, .ant-col-xs-3, .ant-col-sm-3, .ant-col-md-3, .ant-col-lg-3, .ant-col-4, .ant-col-xs-4, .ant-col-sm-4, .ant-col-md-4, .ant-col-lg-4, .ant-col-5, .ant-col-xs-5, .ant-col-sm-5, .ant-col-md-5, .ant-col-lg-5, .ant-col-6, .ant-col-xs-6, .ant-col-sm-6, .ant-col-md-6, .ant-col-lg-6, .ant-col-7, .ant-col-xs-7, .ant-col-sm-7, .ant-col-md-7, .ant-col-lg-7, .ant-col-8, .ant-col-xs-8, .ant-col-sm-8, .ant-col-md-8, .ant-col-lg-8, .ant-col-9, .ant-col-xs-9, .ant-col-sm-9, .ant-col-md-9, .ant-col-lg-9, .ant-col-10, .ant-col-xs-10, .ant-col-sm-10, .ant-col-md-10, .ant-col-lg-10, .ant-col-11, .ant-col-xs-11, .ant-col-sm-11, .ant-col-md-11, .ant-col-lg-11, .ant-col-12, .ant-col-xs-12, .ant-col-sm-12, .ant-col-md-12, .ant-col-lg-12, .ant-col-13, .ant-col-xs-13, .ant-col-sm-13, .ant-col-md-13, .ant-col-lg-13, .ant-col-14, .ant-col-xs-14, .ant-col-sm-14, .ant-col-md-14, .ant-col-lg-14, .ant-col-15, .ant-col-xs-15, .ant-col-sm-15, .ant-col-md-15, .ant-col-lg-15, .ant-col-16, .ant-col-xs-16, .ant-col-sm-16, .ant-col-md-16, .ant-col-lg-16, .ant-col-17, .ant-col-xs-17, .ant-col-sm-17, .ant-col-md-17, .ant-col-lg-17, .ant-col-18, .ant-col-xs-18, .ant-col-sm-18, .ant-col-md-18, .ant-col-lg-18, .ant-col-19, .ant-col-xs-19, .ant-col-sm-19, .ant-col-md-19, .ant-col-lg-19, .ant-col-20, .ant-col-xs-20, .ant-col-sm-20, .ant-col-md-20, .ant-col-lg-20, .ant-col-21, .ant-col-xs-21, .ant-col-sm-21, .ant-col-md-21, .ant-col-lg-21, .ant-col-22, .ant-col-xs-22, .ant-col-sm-22, .ant-col-md-22, .ant-col-lg-22, .ant-col-23, .ant-col-xs-23, .ant-col-sm-23, .ant-col-md-23, .ant-col-lg-23, .ant-col-24, .ant-col-xs-24, .ant-col-sm-24, .ant-col-md-24, .ant-col-lg-24 { + position: relative; + min-height: 1px; + padding-left: 0; + padding-right: 0; +} +.ant-col-1, .ant-col-2, .ant-col-3, .ant-col-4, .ant-col-5, .ant-col-6, .ant-col-7, .ant-col-8, .ant-col-9, .ant-col-10, .ant-col-11, .ant-col-12, .ant-col-13, .ant-col-14, .ant-col-15, .ant-col-16, .ant-col-17, .ant-col-18, .ant-col-19, .ant-col-20, .ant-col-21, .ant-col-22, .ant-col-23, .ant-col-24 { + float: left; + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; +} +.ant-col-24 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 100%; +} +.ant-col-push-24 { + left: 100%; +} +.ant-col-pull-24 { + right: 100%; +} +.ant-col-offset-24 { + margin-left: 100%; +} +.ant-col-order-24 { + -webkit-box-ordinal-group: 25; + -webkit-order: 24; + -ms-flex-order: 24; + order: 24; +} +.ant-col-23 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 95.83333333%; +} +.ant-col-push-23 { + left: 95.83333333%; +} +.ant-col-pull-23 { + right: 95.83333333%; +} +.ant-col-offset-23 { + margin-left: 95.83333333%; +} +.ant-col-order-23 { + -webkit-box-ordinal-group: 24; + -webkit-order: 23; + -ms-flex-order: 23; + order: 23; +} +.ant-col-22 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 91.66666667%; +} +.ant-col-push-22 { + left: 91.66666667%; +} +.ant-col-pull-22 { + right: 91.66666667%; +} +.ant-col-offset-22 { + margin-left: 91.66666667%; +} +.ant-col-order-22 { + -webkit-box-ordinal-group: 23; + -webkit-order: 22; + -ms-flex-order: 22; + order: 22; +} +.ant-col-21 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 87.5%; +} +.ant-col-push-21 { + left: 87.5%; +} +.ant-col-pull-21 { + right: 87.5%; +} +.ant-col-offset-21 { + margin-left: 87.5%; +} +.ant-col-order-21 { + -webkit-box-ordinal-group: 22; + -webkit-order: 21; + -ms-flex-order: 21; + order: 21; +} +.ant-col-20 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 83.33333333%; +} +.ant-col-push-20 { + left: 83.33333333%; +} +.ant-col-pull-20 { + right: 83.33333333%; +} +.ant-col-offset-20 { + margin-left: 83.33333333%; +} +.ant-col-order-20 { + -webkit-box-ordinal-group: 21; + -webkit-order: 20; + -ms-flex-order: 20; + order: 20; +} +.ant-col-19 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 79.16666667%; +} +.ant-col-push-19 { + left: 79.16666667%; +} +.ant-col-pull-19 { + right: 79.16666667%; +} +.ant-col-offset-19 { + margin-left: 79.16666667%; +} +.ant-col-order-19 { + -webkit-box-ordinal-group: 20; + -webkit-order: 19; + -ms-flex-order: 19; + order: 19; +} +.ant-col-18 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 75%; +} +.ant-col-push-18 { + left: 75%; +} +.ant-col-pull-18 { + right: 75%; +} +.ant-col-offset-18 { + margin-left: 75%; +} +.ant-col-order-18 { + -webkit-box-ordinal-group: 19; + -webkit-order: 18; + -ms-flex-order: 18; + order: 18; +} +.ant-col-17 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 70.83333333%; +} +.ant-col-push-17 { + left: 70.83333333%; +} +.ant-col-pull-17 { + right: 70.83333333%; +} +.ant-col-offset-17 { + margin-left: 70.83333333%; +} +.ant-col-order-17 { + -webkit-box-ordinal-group: 18; + -webkit-order: 17; + -ms-flex-order: 17; + order: 17; +} +.ant-col-16 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 66.66666667%; +} +.ant-col-push-16 { + left: 66.66666667%; +} +.ant-col-pull-16 { + right: 66.66666667%; +} +.ant-col-offset-16 { + margin-left: 66.66666667%; +} +.ant-col-order-16 { + -webkit-box-ordinal-group: 17; + -webkit-order: 16; + -ms-flex-order: 16; + order: 16; +} +.ant-col-15 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 62.5%; +} +.ant-col-push-15 { + left: 62.5%; +} +.ant-col-pull-15 { + right: 62.5%; +} +.ant-col-offset-15 { + margin-left: 62.5%; +} +.ant-col-order-15 { + -webkit-box-ordinal-group: 16; + -webkit-order: 15; + -ms-flex-order: 15; + order: 15; +} +.ant-col-14 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 58.33333333%; +} +.ant-col-push-14 { + left: 58.33333333%; +} +.ant-col-pull-14 { + right: 58.33333333%; +} +.ant-col-offset-14 { + margin-left: 58.33333333%; +} +.ant-col-order-14 { + -webkit-box-ordinal-group: 15; + -webkit-order: 14; + -ms-flex-order: 14; + order: 14; +} +.ant-col-13 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 54.16666667%; +} +.ant-col-push-13 { + left: 54.16666667%; +} +.ant-col-pull-13 { + right: 54.16666667%; +} +.ant-col-offset-13 { + margin-left: 54.16666667%; +} +.ant-col-order-13 { + -webkit-box-ordinal-group: 14; + -webkit-order: 13; + -ms-flex-order: 13; + order: 13; +} +.ant-col-12 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 50%; +} +.ant-col-push-12 { + left: 50%; +} +.ant-col-pull-12 { + right: 50%; +} +.ant-col-offset-12 { + margin-left: 50%; +} +.ant-col-order-12 { + -webkit-box-ordinal-group: 13; + -webkit-order: 12; + -ms-flex-order: 12; + order: 12; +} +.ant-col-11 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 45.83333333%; +} +.ant-col-push-11 { + left: 45.83333333%; +} +.ant-col-pull-11 { + right: 45.83333333%; +} +.ant-col-offset-11 { + margin-left: 45.83333333%; +} +.ant-col-order-11 { + -webkit-box-ordinal-group: 12; + -webkit-order: 11; + -ms-flex-order: 11; + order: 11; +} +.ant-col-10 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 41.66666667%; +} +.ant-col-push-10 { + left: 41.66666667%; +} +.ant-col-pull-10 { + right: 41.66666667%; +} +.ant-col-offset-10 { + margin-left: 41.66666667%; +} +.ant-col-order-10 { + -webkit-box-ordinal-group: 11; + -webkit-order: 10; + -ms-flex-order: 10; + order: 10; +} +.ant-col-9 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 37.5%; +} +.ant-col-push-9 { + left: 37.5%; +} +.ant-col-pull-9 { + right: 37.5%; +} +.ant-col-offset-9 { + margin-left: 37.5%; +} +.ant-col-order-9 { + -webkit-box-ordinal-group: 10; + -webkit-order: 9; + -ms-flex-order: 9; + order: 9; +} +.ant-col-8 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 33.33333333%; +} +.ant-col-push-8 { + left: 33.33333333%; +} +.ant-col-pull-8 { + right: 33.33333333%; +} +.ant-col-offset-8 { + margin-left: 33.33333333%; +} +.ant-col-order-8 { + -webkit-box-ordinal-group: 9; + -webkit-order: 8; + -ms-flex-order: 8; + order: 8; +} +.ant-col-7 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 29.16666667%; +} +.ant-col-push-7 { + left: 29.16666667%; +} +.ant-col-pull-7 { + right: 29.16666667%; +} +.ant-col-offset-7 { + margin-left: 29.16666667%; +} +.ant-col-order-7 { + -webkit-box-ordinal-group: 8; + -webkit-order: 7; + -ms-flex-order: 7; + order: 7; +} +.ant-col-6 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 25%; +} +.ant-col-push-6 { + left: 25%; +} +.ant-col-pull-6 { + right: 25%; +} +.ant-col-offset-6 { + margin-left: 25%; +} +.ant-col-order-6 { + -webkit-box-ordinal-group: 7; + -webkit-order: 6; + -ms-flex-order: 6; + order: 6; +} +.ant-col-5 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 20.83333333%; +} +.ant-col-push-5 { + left: 20.83333333%; +} +.ant-col-pull-5 { + right: 20.83333333%; +} +.ant-col-offset-5 { + margin-left: 20.83333333%; +} +.ant-col-order-5 { + -webkit-box-ordinal-group: 6; + -webkit-order: 5; + -ms-flex-order: 5; + order: 5; +} +.ant-col-4 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 16.66666667%; +} +.ant-col-push-4 { + left: 16.66666667%; +} +.ant-col-pull-4 { + right: 16.66666667%; +} +.ant-col-offset-4 { + margin-left: 16.66666667%; +} +.ant-col-order-4 { + -webkit-box-ordinal-group: 5; + -webkit-order: 4; + -ms-flex-order: 4; + order: 4; +} +.ant-col-3 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 12.5%; +} +.ant-col-push-3 { + left: 12.5%; +} +.ant-col-pull-3 { + right: 12.5%; +} +.ant-col-offset-3 { + margin-left: 12.5%; +} +.ant-col-order-3 { + -webkit-box-ordinal-group: 4; + -webkit-order: 3; + -ms-flex-order: 3; + order: 3; +} +.ant-col-2 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 8.33333333%; +} +.ant-col-push-2 { + left: 8.33333333%; +} +.ant-col-pull-2 { + right: 8.33333333%; +} +.ant-col-offset-2 { + margin-left: 8.33333333%; +} +.ant-col-order-2 { + -webkit-box-ordinal-group: 3; + -webkit-order: 2; + -ms-flex-order: 2; + order: 2; +} +.ant-col-1 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 4.16666667%; +} +.ant-col-push-1 { + left: 4.16666667%; +} +.ant-col-pull-1 { + right: 4.16666667%; +} +.ant-col-offset-1 { + margin-left: 4.16666667%; +} +.ant-col-order-1 { + -webkit-box-ordinal-group: 2; + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; +} +.ant-col-0 { + display: none; +} +.ant-col-push-0 { + left: auto; +} +.ant-col-pull-0 { + right: auto; +} +.ant-col-push-0 { + left: auto; +} +.ant-col-pull-0 { + right: auto; +} +.ant-col-offset-0 { + margin-left: 0; +} +.ant-col-order-0 { + -webkit-box-ordinal-group: 1; + -webkit-order: 0; + -ms-flex-order: 0; + order: 0; +} +.ant-col-xs-1, .ant-col-xs-2, .ant-col-xs-3, .ant-col-xs-4, .ant-col-xs-5, .ant-col-xs-6, .ant-col-xs-7, .ant-col-xs-8, .ant-col-xs-9, .ant-col-xs-10, .ant-col-xs-11, .ant-col-xs-12, .ant-col-xs-13, .ant-col-xs-14, .ant-col-xs-15, .ant-col-xs-16, .ant-col-xs-17, .ant-col-xs-18, .ant-col-xs-19, .ant-col-xs-20, .ant-col-xs-21, .ant-col-xs-22, .ant-col-xs-23, .ant-col-xs-24 { + float: left; + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; +} +.ant-col-xs-24 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 100%; +} +.ant-col-xs-push-24 { + left: 100%; +} +.ant-col-xs-pull-24 { + right: 100%; +} +.ant-col-xs-offset-24 { + margin-left: 100%; +} +.ant-col-xs-order-24 { + -webkit-box-ordinal-group: 25; + -webkit-order: 24; + -ms-flex-order: 24; + order: 24; +} +.ant-col-xs-23 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 95.83333333%; +} +.ant-col-xs-push-23 { + left: 95.83333333%; +} +.ant-col-xs-pull-23 { + right: 95.83333333%; +} +.ant-col-xs-offset-23 { + margin-left: 95.83333333%; +} +.ant-col-xs-order-23 { + -webkit-box-ordinal-group: 24; + -webkit-order: 23; + -ms-flex-order: 23; + order: 23; +} +.ant-col-xs-22 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 91.66666667%; +} +.ant-col-xs-push-22 { + left: 91.66666667%; +} +.ant-col-xs-pull-22 { + right: 91.66666667%; +} +.ant-col-xs-offset-22 { + margin-left: 91.66666667%; +} +.ant-col-xs-order-22 { + -webkit-box-ordinal-group: 23; + -webkit-order: 22; + -ms-flex-order: 22; + order: 22; +} +.ant-col-xs-21 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 87.5%; +} +.ant-col-xs-push-21 { + left: 87.5%; +} +.ant-col-xs-pull-21 { + right: 87.5%; +} +.ant-col-xs-offset-21 { + margin-left: 87.5%; +} +.ant-col-xs-order-21 { + -webkit-box-ordinal-group: 22; + -webkit-order: 21; + -ms-flex-order: 21; + order: 21; +} +.ant-col-xs-20 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 83.33333333%; +} +.ant-col-xs-push-20 { + left: 83.33333333%; +} +.ant-col-xs-pull-20 { + right: 83.33333333%; +} +.ant-col-xs-offset-20 { + margin-left: 83.33333333%; +} +.ant-col-xs-order-20 { + -webkit-box-ordinal-group: 21; + -webkit-order: 20; + -ms-flex-order: 20; + order: 20; +} +.ant-col-xs-19 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 79.16666667%; +} +.ant-col-xs-push-19 { + left: 79.16666667%; +} +.ant-col-xs-pull-19 { + right: 79.16666667%; +} +.ant-col-xs-offset-19 { + margin-left: 79.16666667%; +} +.ant-col-xs-order-19 { + -webkit-box-ordinal-group: 20; + -webkit-order: 19; + -ms-flex-order: 19; + order: 19; +} +.ant-col-xs-18 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 75%; +} +.ant-col-xs-push-18 { + left: 75%; +} +.ant-col-xs-pull-18 { + right: 75%; +} +.ant-col-xs-offset-18 { + margin-left: 75%; +} +.ant-col-xs-order-18 { + -webkit-box-ordinal-group: 19; + -webkit-order: 18; + -ms-flex-order: 18; + order: 18; +} +.ant-col-xs-17 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 70.83333333%; +} +.ant-col-xs-push-17 { + left: 70.83333333%; +} +.ant-col-xs-pull-17 { + right: 70.83333333%; +} +.ant-col-xs-offset-17 { + margin-left: 70.83333333%; +} +.ant-col-xs-order-17 { + -webkit-box-ordinal-group: 18; + -webkit-order: 17; + -ms-flex-order: 17; + order: 17; +} +.ant-col-xs-16 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 66.66666667%; +} +.ant-col-xs-push-16 { + left: 66.66666667%; +} +.ant-col-xs-pull-16 { + right: 66.66666667%; +} +.ant-col-xs-offset-16 { + margin-left: 66.66666667%; +} +.ant-col-xs-order-16 { + -webkit-box-ordinal-group: 17; + -webkit-order: 16; + -ms-flex-order: 16; + order: 16; +} +.ant-col-xs-15 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 62.5%; +} +.ant-col-xs-push-15 { + left: 62.5%; +} +.ant-col-xs-pull-15 { + right: 62.5%; +} +.ant-col-xs-offset-15 { + margin-left: 62.5%; +} +.ant-col-xs-order-15 { + -webkit-box-ordinal-group: 16; + -webkit-order: 15; + -ms-flex-order: 15; + order: 15; +} +.ant-col-xs-14 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 58.33333333%; +} +.ant-col-xs-push-14 { + left: 58.33333333%; +} +.ant-col-xs-pull-14 { + right: 58.33333333%; +} +.ant-col-xs-offset-14 { + margin-left: 58.33333333%; +} +.ant-col-xs-order-14 { + -webkit-box-ordinal-group: 15; + -webkit-order: 14; + -ms-flex-order: 14; + order: 14; +} +.ant-col-xs-13 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 54.16666667%; +} +.ant-col-xs-push-13 { + left: 54.16666667%; +} +.ant-col-xs-pull-13 { + right: 54.16666667%; +} +.ant-col-xs-offset-13 { + margin-left: 54.16666667%; +} +.ant-col-xs-order-13 { + -webkit-box-ordinal-group: 14; + -webkit-order: 13; + -ms-flex-order: 13; + order: 13; +} +.ant-col-xs-12 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 50%; +} +.ant-col-xs-push-12 { + left: 50%; +} +.ant-col-xs-pull-12 { + right: 50%; +} +.ant-col-xs-offset-12 { + margin-left: 50%; +} +.ant-col-xs-order-12 { + -webkit-box-ordinal-group: 13; + -webkit-order: 12; + -ms-flex-order: 12; + order: 12; +} +.ant-col-xs-11 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 45.83333333%; +} +.ant-col-xs-push-11 { + left: 45.83333333%; +} +.ant-col-xs-pull-11 { + right: 45.83333333%; +} +.ant-col-xs-offset-11 { + margin-left: 45.83333333%; +} +.ant-col-xs-order-11 { + -webkit-box-ordinal-group: 12; + -webkit-order: 11; + -ms-flex-order: 11; + order: 11; +} +.ant-col-xs-10 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 41.66666667%; +} +.ant-col-xs-push-10 { + left: 41.66666667%; +} +.ant-col-xs-pull-10 { + right: 41.66666667%; +} +.ant-col-xs-offset-10 { + margin-left: 41.66666667%; +} +.ant-col-xs-order-10 { + -webkit-box-ordinal-group: 11; + -webkit-order: 10; + -ms-flex-order: 10; + order: 10; +} +.ant-col-xs-9 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 37.5%; +} +.ant-col-xs-push-9 { + left: 37.5%; +} +.ant-col-xs-pull-9 { + right: 37.5%; +} +.ant-col-xs-offset-9 { + margin-left: 37.5%; +} +.ant-col-xs-order-9 { + -webkit-box-ordinal-group: 10; + -webkit-order: 9; + -ms-flex-order: 9; + order: 9; +} +.ant-col-xs-8 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 33.33333333%; +} +.ant-col-xs-push-8 { + left: 33.33333333%; +} +.ant-col-xs-pull-8 { + right: 33.33333333%; +} +.ant-col-xs-offset-8 { + margin-left: 33.33333333%; +} +.ant-col-xs-order-8 { + -webkit-box-ordinal-group: 9; + -webkit-order: 8; + -ms-flex-order: 8; + order: 8; +} +.ant-col-xs-7 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 29.16666667%; +} +.ant-col-xs-push-7 { + left: 29.16666667%; +} +.ant-col-xs-pull-7 { + right: 29.16666667%; +} +.ant-col-xs-offset-7 { + margin-left: 29.16666667%; +} +.ant-col-xs-order-7 { + -webkit-box-ordinal-group: 8; + -webkit-order: 7; + -ms-flex-order: 7; + order: 7; +} +.ant-col-xs-6 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 25%; +} +.ant-col-xs-push-6 { + left: 25%; +} +.ant-col-xs-pull-6 { + right: 25%; +} +.ant-col-xs-offset-6 { + margin-left: 25%; +} +.ant-col-xs-order-6 { + -webkit-box-ordinal-group: 7; + -webkit-order: 6; + -ms-flex-order: 6; + order: 6; +} +.ant-col-xs-5 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 20.83333333%; +} +.ant-col-xs-push-5 { + left: 20.83333333%; +} +.ant-col-xs-pull-5 { + right: 20.83333333%; +} +.ant-col-xs-offset-5 { + margin-left: 20.83333333%; +} +.ant-col-xs-order-5 { + -webkit-box-ordinal-group: 6; + -webkit-order: 5; + -ms-flex-order: 5; + order: 5; +} +.ant-col-xs-4 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 16.66666667%; +} +.ant-col-xs-push-4 { + left: 16.66666667%; +} +.ant-col-xs-pull-4 { + right: 16.66666667%; +} +.ant-col-xs-offset-4 { + margin-left: 16.66666667%; +} +.ant-col-xs-order-4 { + -webkit-box-ordinal-group: 5; + -webkit-order: 4; + -ms-flex-order: 4; + order: 4; +} +.ant-col-xs-3 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 12.5%; +} +.ant-col-xs-push-3 { + left: 12.5%; +} +.ant-col-xs-pull-3 { + right: 12.5%; +} +.ant-col-xs-offset-3 { + margin-left: 12.5%; +} +.ant-col-xs-order-3 { + -webkit-box-ordinal-group: 4; + -webkit-order: 3; + -ms-flex-order: 3; + order: 3; +} +.ant-col-xs-2 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 8.33333333%; +} +.ant-col-xs-push-2 { + left: 8.33333333%; +} +.ant-col-xs-pull-2 { + right: 8.33333333%; +} +.ant-col-xs-offset-2 { + margin-left: 8.33333333%; +} +.ant-col-xs-order-2 { + -webkit-box-ordinal-group: 3; + -webkit-order: 2; + -ms-flex-order: 2; + order: 2; +} +.ant-col-xs-1 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 4.16666667%; +} +.ant-col-xs-push-1 { + left: 4.16666667%; +} +.ant-col-xs-pull-1 { + right: 4.16666667%; +} +.ant-col-xs-offset-1 { + margin-left: 4.16666667%; +} +.ant-col-xs-order-1 { + -webkit-box-ordinal-group: 2; + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; +} +.ant-col-xs-0 { + display: none; +} +.ant-col-push-0 { + left: auto; +} +.ant-col-pull-0 { + right: auto; +} +.ant-col-xs-push-0 { + left: auto; +} +.ant-col-xs-pull-0 { + right: auto; +} +.ant-col-xs-offset-0 { + margin-left: 0; +} +.ant-col-xs-order-0 { + -webkit-box-ordinal-group: 1; + -webkit-order: 0; + -ms-flex-order: 0; + order: 0; +} +@media (min-width: 576px) { + .ant-col-sm-1, .ant-col-sm-2, .ant-col-sm-3, .ant-col-sm-4, .ant-col-sm-5, .ant-col-sm-6, .ant-col-sm-7, .ant-col-sm-8, .ant-col-sm-9, .ant-col-sm-10, .ant-col-sm-11, .ant-col-sm-12, .ant-col-sm-13, .ant-col-sm-14, .ant-col-sm-15, .ant-col-sm-16, .ant-col-sm-17, .ant-col-sm-18, .ant-col-sm-19, .ant-col-sm-20, .ant-col-sm-21, .ant-col-sm-22, .ant-col-sm-23, .ant-col-sm-24 { + float: left; + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + } + .ant-col-sm-24 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + } + .ant-col-sm-push-24 { + left: 100%; + } + .ant-col-sm-pull-24 { + right: 100%; + } + .ant-col-sm-offset-24 { + margin-left: 100%; + } + .ant-col-sm-order-24 { + -webkit-box-ordinal-group: 25; + -webkit-order: 24; + -ms-flex-order: 24; + order: 24; + } + .ant-col-sm-23 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 95.83333333%; + } + .ant-col-sm-push-23 { + left: 95.83333333%; + } + .ant-col-sm-pull-23 { + right: 95.83333333%; + } + .ant-col-sm-offset-23 { + margin-left: 95.83333333%; + } + .ant-col-sm-order-23 { + -webkit-box-ordinal-group: 24; + -webkit-order: 23; + -ms-flex-order: 23; + order: 23; + } + .ant-col-sm-22 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 91.66666667%; + } + .ant-col-sm-push-22 { + left: 91.66666667%; + } + .ant-col-sm-pull-22 { + right: 91.66666667%; + } + .ant-col-sm-offset-22 { + margin-left: 91.66666667%; + } + .ant-col-sm-order-22 { + -webkit-box-ordinal-group: 23; + -webkit-order: 22; + -ms-flex-order: 22; + order: 22; + } + .ant-col-sm-21 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 87.5%; + } + .ant-col-sm-push-21 { + left: 87.5%; + } + .ant-col-sm-pull-21 { + right: 87.5%; + } + .ant-col-sm-offset-21 { + margin-left: 87.5%; + } + .ant-col-sm-order-21 { + -webkit-box-ordinal-group: 22; + -webkit-order: 21; + -ms-flex-order: 21; + order: 21; + } + .ant-col-sm-20 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 83.33333333%; + } + .ant-col-sm-push-20 { + left: 83.33333333%; + } + .ant-col-sm-pull-20 { + right: 83.33333333%; + } + .ant-col-sm-offset-20 { + margin-left: 83.33333333%; + } + .ant-col-sm-order-20 { + -webkit-box-ordinal-group: 21; + -webkit-order: 20; + -ms-flex-order: 20; + order: 20; + } + .ant-col-sm-19 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 79.16666667%; + } + .ant-col-sm-push-19 { + left: 79.16666667%; + } + .ant-col-sm-pull-19 { + right: 79.16666667%; + } + .ant-col-sm-offset-19 { + margin-left: 79.16666667%; + } + .ant-col-sm-order-19 { + -webkit-box-ordinal-group: 20; + -webkit-order: 19; + -ms-flex-order: 19; + order: 19; + } + .ant-col-sm-18 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 75%; + } + .ant-col-sm-push-18 { + left: 75%; + } + .ant-col-sm-pull-18 { + right: 75%; + } + .ant-col-sm-offset-18 { + margin-left: 75%; + } + .ant-col-sm-order-18 { + -webkit-box-ordinal-group: 19; + -webkit-order: 18; + -ms-flex-order: 18; + order: 18; + } + .ant-col-sm-17 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 70.83333333%; + } + .ant-col-sm-push-17 { + left: 70.83333333%; + } + .ant-col-sm-pull-17 { + right: 70.83333333%; + } + .ant-col-sm-offset-17 { + margin-left: 70.83333333%; + } + .ant-col-sm-order-17 { + -webkit-box-ordinal-group: 18; + -webkit-order: 17; + -ms-flex-order: 17; + order: 17; + } + .ant-col-sm-16 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 66.66666667%; + } + .ant-col-sm-push-16 { + left: 66.66666667%; + } + .ant-col-sm-pull-16 { + right: 66.66666667%; + } + .ant-col-sm-offset-16 { + margin-left: 66.66666667%; + } + .ant-col-sm-order-16 { + -webkit-box-ordinal-group: 17; + -webkit-order: 16; + -ms-flex-order: 16; + order: 16; + } + .ant-col-sm-15 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 62.5%; + } + .ant-col-sm-push-15 { + left: 62.5%; + } + .ant-col-sm-pull-15 { + right: 62.5%; + } + .ant-col-sm-offset-15 { + margin-left: 62.5%; + } + .ant-col-sm-order-15 { + -webkit-box-ordinal-group: 16; + -webkit-order: 15; + -ms-flex-order: 15; + order: 15; + } + .ant-col-sm-14 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 58.33333333%; + } + .ant-col-sm-push-14 { + left: 58.33333333%; + } + .ant-col-sm-pull-14 { + right: 58.33333333%; + } + .ant-col-sm-offset-14 { + margin-left: 58.33333333%; + } + .ant-col-sm-order-14 { + -webkit-box-ordinal-group: 15; + -webkit-order: 14; + -ms-flex-order: 14; + order: 14; + } + .ant-col-sm-13 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 54.16666667%; + } + .ant-col-sm-push-13 { + left: 54.16666667%; + } + .ant-col-sm-pull-13 { + right: 54.16666667%; + } + .ant-col-sm-offset-13 { + margin-left: 54.16666667%; + } + .ant-col-sm-order-13 { + -webkit-box-ordinal-group: 14; + -webkit-order: 13; + -ms-flex-order: 13; + order: 13; + } + .ant-col-sm-12 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 50%; + } + .ant-col-sm-push-12 { + left: 50%; + } + .ant-col-sm-pull-12 { + right: 50%; + } + .ant-col-sm-offset-12 { + margin-left: 50%; + } + .ant-col-sm-order-12 { + -webkit-box-ordinal-group: 13; + -webkit-order: 12; + -ms-flex-order: 12; + order: 12; + } + .ant-col-sm-11 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 45.83333333%; + } + .ant-col-sm-push-11 { + left: 45.83333333%; + } + .ant-col-sm-pull-11 { + right: 45.83333333%; + } + .ant-col-sm-offset-11 { + margin-left: 45.83333333%; + } + .ant-col-sm-order-11 { + -webkit-box-ordinal-group: 12; + -webkit-order: 11; + -ms-flex-order: 11; + order: 11; + } + .ant-col-sm-10 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 41.66666667%; + } + .ant-col-sm-push-10 { + left: 41.66666667%; + } + .ant-col-sm-pull-10 { + right: 41.66666667%; + } + .ant-col-sm-offset-10 { + margin-left: 41.66666667%; + } + .ant-col-sm-order-10 { + -webkit-box-ordinal-group: 11; + -webkit-order: 10; + -ms-flex-order: 10; + order: 10; + } + .ant-col-sm-9 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 37.5%; + } + .ant-col-sm-push-9 { + left: 37.5%; + } + .ant-col-sm-pull-9 { + right: 37.5%; + } + .ant-col-sm-offset-9 { + margin-left: 37.5%; + } + .ant-col-sm-order-9 { + -webkit-box-ordinal-group: 10; + -webkit-order: 9; + -ms-flex-order: 9; + order: 9; + } + .ant-col-sm-8 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 33.33333333%; + } + .ant-col-sm-push-8 { + left: 33.33333333%; + } + .ant-col-sm-pull-8 { + right: 33.33333333%; + } + .ant-col-sm-offset-8 { + margin-left: 33.33333333%; + } + .ant-col-sm-order-8 { + -webkit-box-ordinal-group: 9; + -webkit-order: 8; + -ms-flex-order: 8; + order: 8; + } + .ant-col-sm-7 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 29.16666667%; + } + .ant-col-sm-push-7 { + left: 29.16666667%; + } + .ant-col-sm-pull-7 { + right: 29.16666667%; + } + .ant-col-sm-offset-7 { + margin-left: 29.16666667%; + } + .ant-col-sm-order-7 { + -webkit-box-ordinal-group: 8; + -webkit-order: 7; + -ms-flex-order: 7; + order: 7; + } + .ant-col-sm-6 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 25%; + } + .ant-col-sm-push-6 { + left: 25%; + } + .ant-col-sm-pull-6 { + right: 25%; + } + .ant-col-sm-offset-6 { + margin-left: 25%; + } + .ant-col-sm-order-6 { + -webkit-box-ordinal-group: 7; + -webkit-order: 6; + -ms-flex-order: 6; + order: 6; + } + .ant-col-sm-5 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 20.83333333%; + } + .ant-col-sm-push-5 { + left: 20.83333333%; + } + .ant-col-sm-pull-5 { + right: 20.83333333%; + } + .ant-col-sm-offset-5 { + margin-left: 20.83333333%; + } + .ant-col-sm-order-5 { + -webkit-box-ordinal-group: 6; + -webkit-order: 5; + -ms-flex-order: 5; + order: 5; + } + .ant-col-sm-4 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 16.66666667%; + } + .ant-col-sm-push-4 { + left: 16.66666667%; + } + .ant-col-sm-pull-4 { + right: 16.66666667%; + } + .ant-col-sm-offset-4 { + margin-left: 16.66666667%; + } + .ant-col-sm-order-4 { + -webkit-box-ordinal-group: 5; + -webkit-order: 4; + -ms-flex-order: 4; + order: 4; + } + .ant-col-sm-3 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 12.5%; + } + .ant-col-sm-push-3 { + left: 12.5%; + } + .ant-col-sm-pull-3 { + right: 12.5%; + } + .ant-col-sm-offset-3 { + margin-left: 12.5%; + } + .ant-col-sm-order-3 { + -webkit-box-ordinal-group: 4; + -webkit-order: 3; + -ms-flex-order: 3; + order: 3; + } + .ant-col-sm-2 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 8.33333333%; + } + .ant-col-sm-push-2 { + left: 8.33333333%; + } + .ant-col-sm-pull-2 { + right: 8.33333333%; + } + .ant-col-sm-offset-2 { + margin-left: 8.33333333%; + } + .ant-col-sm-order-2 { + -webkit-box-ordinal-group: 3; + -webkit-order: 2; + -ms-flex-order: 2; + order: 2; + } + .ant-col-sm-1 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 4.16666667%; + } + .ant-col-sm-push-1 { + left: 4.16666667%; + } + .ant-col-sm-pull-1 { + right: 4.16666667%; + } + .ant-col-sm-offset-1 { + margin-left: 4.16666667%; + } + .ant-col-sm-order-1 { + -webkit-box-ordinal-group: 2; + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; + } + .ant-col-sm-0 { + display: none; + } + .ant-col-push-0 { + left: auto; + } + .ant-col-pull-0 { + right: auto; + } + .ant-col-sm-push-0 { + left: auto; + } + .ant-col-sm-pull-0 { + right: auto; + } + .ant-col-sm-offset-0 { + margin-left: 0; + } + .ant-col-sm-order-0 { + -webkit-box-ordinal-group: 1; + -webkit-order: 0; + -ms-flex-order: 0; + order: 0; + } +} +@media (min-width: 768px) { + .ant-col-md-1, .ant-col-md-2, .ant-col-md-3, .ant-col-md-4, .ant-col-md-5, .ant-col-md-6, .ant-col-md-7, .ant-col-md-8, .ant-col-md-9, .ant-col-md-10, .ant-col-md-11, .ant-col-md-12, .ant-col-md-13, .ant-col-md-14, .ant-col-md-15, .ant-col-md-16, .ant-col-md-17, .ant-col-md-18, .ant-col-md-19, .ant-col-md-20, .ant-col-md-21, .ant-col-md-22, .ant-col-md-23, .ant-col-md-24 { + float: left; + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + } + .ant-col-md-24 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + } + .ant-col-md-push-24 { + left: 100%; + } + .ant-col-md-pull-24 { + right: 100%; + } + .ant-col-md-offset-24 { + margin-left: 100%; + } + .ant-col-md-order-24 { + -webkit-box-ordinal-group: 25; + -webkit-order: 24; + -ms-flex-order: 24; + order: 24; + } + .ant-col-md-23 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 95.83333333%; + } + .ant-col-md-push-23 { + left: 95.83333333%; + } + .ant-col-md-pull-23 { + right: 95.83333333%; + } + .ant-col-md-offset-23 { + margin-left: 95.83333333%; + } + .ant-col-md-order-23 { + -webkit-box-ordinal-group: 24; + -webkit-order: 23; + -ms-flex-order: 23; + order: 23; + } + .ant-col-md-22 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 91.66666667%; + } + .ant-col-md-push-22 { + left: 91.66666667%; + } + .ant-col-md-pull-22 { + right: 91.66666667%; + } + .ant-col-md-offset-22 { + margin-left: 91.66666667%; + } + .ant-col-md-order-22 { + -webkit-box-ordinal-group: 23; + -webkit-order: 22; + -ms-flex-order: 22; + order: 22; + } + .ant-col-md-21 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 87.5%; + } + .ant-col-md-push-21 { + left: 87.5%; + } + .ant-col-md-pull-21 { + right: 87.5%; + } + .ant-col-md-offset-21 { + margin-left: 87.5%; + } + .ant-col-md-order-21 { + -webkit-box-ordinal-group: 22; + -webkit-order: 21; + -ms-flex-order: 21; + order: 21; + } + .ant-col-md-20 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 83.33333333%; + } + .ant-col-md-push-20 { + left: 83.33333333%; + } + .ant-col-md-pull-20 { + right: 83.33333333%; + } + .ant-col-md-offset-20 { + margin-left: 83.33333333%; + } + .ant-col-md-order-20 { + -webkit-box-ordinal-group: 21; + -webkit-order: 20; + -ms-flex-order: 20; + order: 20; + } + .ant-col-md-19 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 79.16666667%; + } + .ant-col-md-push-19 { + left: 79.16666667%; + } + .ant-col-md-pull-19 { + right: 79.16666667%; + } + .ant-col-md-offset-19 { + margin-left: 79.16666667%; + } + .ant-col-md-order-19 { + -webkit-box-ordinal-group: 20; + -webkit-order: 19; + -ms-flex-order: 19; + order: 19; + } + .ant-col-md-18 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 75%; + } + .ant-col-md-push-18 { + left: 75%; + } + .ant-col-md-pull-18 { + right: 75%; + } + .ant-col-md-offset-18 { + margin-left: 75%; + } + .ant-col-md-order-18 { + -webkit-box-ordinal-group: 19; + -webkit-order: 18; + -ms-flex-order: 18; + order: 18; + } + .ant-col-md-17 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 70.83333333%; + } + .ant-col-md-push-17 { + left: 70.83333333%; + } + .ant-col-md-pull-17 { + right: 70.83333333%; + } + .ant-col-md-offset-17 { + margin-left: 70.83333333%; + } + .ant-col-md-order-17 { + -webkit-box-ordinal-group: 18; + -webkit-order: 17; + -ms-flex-order: 17; + order: 17; + } + .ant-col-md-16 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 66.66666667%; + } + .ant-col-md-push-16 { + left: 66.66666667%; + } + .ant-col-md-pull-16 { + right: 66.66666667%; + } + .ant-col-md-offset-16 { + margin-left: 66.66666667%; + } + .ant-col-md-order-16 { + -webkit-box-ordinal-group: 17; + -webkit-order: 16; + -ms-flex-order: 16; + order: 16; + } + .ant-col-md-15 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 62.5%; + } + .ant-col-md-push-15 { + left: 62.5%; + } + .ant-col-md-pull-15 { + right: 62.5%; + } + .ant-col-md-offset-15 { + margin-left: 62.5%; + } + .ant-col-md-order-15 { + -webkit-box-ordinal-group: 16; + -webkit-order: 15; + -ms-flex-order: 15; + order: 15; + } + .ant-col-md-14 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 58.33333333%; + } + .ant-col-md-push-14 { + left: 58.33333333%; + } + .ant-col-md-pull-14 { + right: 58.33333333%; + } + .ant-col-md-offset-14 { + margin-left: 58.33333333%; + } + .ant-col-md-order-14 { + -webkit-box-ordinal-group: 15; + -webkit-order: 14; + -ms-flex-order: 14; + order: 14; + } + .ant-col-md-13 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 54.16666667%; + } + .ant-col-md-push-13 { + left: 54.16666667%; + } + .ant-col-md-pull-13 { + right: 54.16666667%; + } + .ant-col-md-offset-13 { + margin-left: 54.16666667%; + } + .ant-col-md-order-13 { + -webkit-box-ordinal-group: 14; + -webkit-order: 13; + -ms-flex-order: 13; + order: 13; + } + .ant-col-md-12 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 50%; + } + .ant-col-md-push-12 { + left: 50%; + } + .ant-col-md-pull-12 { + right: 50%; + } + .ant-col-md-offset-12 { + margin-left: 50%; + } + .ant-col-md-order-12 { + -webkit-box-ordinal-group: 13; + -webkit-order: 12; + -ms-flex-order: 12; + order: 12; + } + .ant-col-md-11 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 45.83333333%; + } + .ant-col-md-push-11 { + left: 45.83333333%; + } + .ant-col-md-pull-11 { + right: 45.83333333%; + } + .ant-col-md-offset-11 { + margin-left: 45.83333333%; + } + .ant-col-md-order-11 { + -webkit-box-ordinal-group: 12; + -webkit-order: 11; + -ms-flex-order: 11; + order: 11; + } + .ant-col-md-10 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 41.66666667%; + } + .ant-col-md-push-10 { + left: 41.66666667%; + } + .ant-col-md-pull-10 { + right: 41.66666667%; + } + .ant-col-md-offset-10 { + margin-left: 41.66666667%; + } + .ant-col-md-order-10 { + -webkit-box-ordinal-group: 11; + -webkit-order: 10; + -ms-flex-order: 10; + order: 10; + } + .ant-col-md-9 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 37.5%; + } + .ant-col-md-push-9 { + left: 37.5%; + } + .ant-col-md-pull-9 { + right: 37.5%; + } + .ant-col-md-offset-9 { + margin-left: 37.5%; + } + .ant-col-md-order-9 { + -webkit-box-ordinal-group: 10; + -webkit-order: 9; + -ms-flex-order: 9; + order: 9; + } + .ant-col-md-8 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 33.33333333%; + } + .ant-col-md-push-8 { + left: 33.33333333%; + } + .ant-col-md-pull-8 { + right: 33.33333333%; + } + .ant-col-md-offset-8 { + margin-left: 33.33333333%; + } + .ant-col-md-order-8 { + -webkit-box-ordinal-group: 9; + -webkit-order: 8; + -ms-flex-order: 8; + order: 8; + } + .ant-col-md-7 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 29.16666667%; + } + .ant-col-md-push-7 { + left: 29.16666667%; + } + .ant-col-md-pull-7 { + right: 29.16666667%; + } + .ant-col-md-offset-7 { + margin-left: 29.16666667%; + } + .ant-col-md-order-7 { + -webkit-box-ordinal-group: 8; + -webkit-order: 7; + -ms-flex-order: 7; + order: 7; + } + .ant-col-md-6 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 25%; + } + .ant-col-md-push-6 { + left: 25%; + } + .ant-col-md-pull-6 { + right: 25%; + } + .ant-col-md-offset-6 { + margin-left: 25%; + } + .ant-col-md-order-6 { + -webkit-box-ordinal-group: 7; + -webkit-order: 6; + -ms-flex-order: 6; + order: 6; + } + .ant-col-md-5 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 20.83333333%; + } + .ant-col-md-push-5 { + left: 20.83333333%; + } + .ant-col-md-pull-5 { + right: 20.83333333%; + } + .ant-col-md-offset-5 { + margin-left: 20.83333333%; + } + .ant-col-md-order-5 { + -webkit-box-ordinal-group: 6; + -webkit-order: 5; + -ms-flex-order: 5; + order: 5; + } + .ant-col-md-4 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 16.66666667%; + } + .ant-col-md-push-4 { + left: 16.66666667%; + } + .ant-col-md-pull-4 { + right: 16.66666667%; + } + .ant-col-md-offset-4 { + margin-left: 16.66666667%; + } + .ant-col-md-order-4 { + -webkit-box-ordinal-group: 5; + -webkit-order: 4; + -ms-flex-order: 4; + order: 4; + } + .ant-col-md-3 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 12.5%; + } + .ant-col-md-push-3 { + left: 12.5%; + } + .ant-col-md-pull-3 { + right: 12.5%; + } + .ant-col-md-offset-3 { + margin-left: 12.5%; + } + .ant-col-md-order-3 { + -webkit-box-ordinal-group: 4; + -webkit-order: 3; + -ms-flex-order: 3; + order: 3; + } + .ant-col-md-2 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 8.33333333%; + } + .ant-col-md-push-2 { + left: 8.33333333%; + } + .ant-col-md-pull-2 { + right: 8.33333333%; + } + .ant-col-md-offset-2 { + margin-left: 8.33333333%; + } + .ant-col-md-order-2 { + -webkit-box-ordinal-group: 3; + -webkit-order: 2; + -ms-flex-order: 2; + order: 2; + } + .ant-col-md-1 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 4.16666667%; + } + .ant-col-md-push-1 { + left: 4.16666667%; + } + .ant-col-md-pull-1 { + right: 4.16666667%; + } + .ant-col-md-offset-1 { + margin-left: 4.16666667%; + } + .ant-col-md-order-1 { + -webkit-box-ordinal-group: 2; + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; + } + .ant-col-md-0 { + display: none; + } + .ant-col-push-0 { + left: auto; + } + .ant-col-pull-0 { + right: auto; + } + .ant-col-md-push-0 { + left: auto; + } + .ant-col-md-pull-0 { + right: auto; + } + .ant-col-md-offset-0 { + margin-left: 0; + } + .ant-col-md-order-0 { + -webkit-box-ordinal-group: 1; + -webkit-order: 0; + -ms-flex-order: 0; + order: 0; + } +} +@media (min-width: 992px) { + .ant-col-lg-1, .ant-col-lg-2, .ant-col-lg-3, .ant-col-lg-4, .ant-col-lg-5, .ant-col-lg-6, .ant-col-lg-7, .ant-col-lg-8, .ant-col-lg-9, .ant-col-lg-10, .ant-col-lg-11, .ant-col-lg-12, .ant-col-lg-13, .ant-col-lg-14, .ant-col-lg-15, .ant-col-lg-16, .ant-col-lg-17, .ant-col-lg-18, .ant-col-lg-19, .ant-col-lg-20, .ant-col-lg-21, .ant-col-lg-22, .ant-col-lg-23, .ant-col-lg-24 { + float: left; + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + } + .ant-col-lg-24 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + } + .ant-col-lg-push-24 { + left: 100%; + } + .ant-col-lg-pull-24 { + right: 100%; + } + .ant-col-lg-offset-24 { + margin-left: 100%; + } + .ant-col-lg-order-24 { + -webkit-box-ordinal-group: 25; + -webkit-order: 24; + -ms-flex-order: 24; + order: 24; + } + .ant-col-lg-23 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 95.83333333%; + } + .ant-col-lg-push-23 { + left: 95.83333333%; + } + .ant-col-lg-pull-23 { + right: 95.83333333%; + } + .ant-col-lg-offset-23 { + margin-left: 95.83333333%; + } + .ant-col-lg-order-23 { + -webkit-box-ordinal-group: 24; + -webkit-order: 23; + -ms-flex-order: 23; + order: 23; + } + .ant-col-lg-22 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 91.66666667%; + } + .ant-col-lg-push-22 { + left: 91.66666667%; + } + .ant-col-lg-pull-22 { + right: 91.66666667%; + } + .ant-col-lg-offset-22 { + margin-left: 91.66666667%; + } + .ant-col-lg-order-22 { + -webkit-box-ordinal-group: 23; + -webkit-order: 22; + -ms-flex-order: 22; + order: 22; + } + .ant-col-lg-21 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 87.5%; + } + .ant-col-lg-push-21 { + left: 87.5%; + } + .ant-col-lg-pull-21 { + right: 87.5%; + } + .ant-col-lg-offset-21 { + margin-left: 87.5%; + } + .ant-col-lg-order-21 { + -webkit-box-ordinal-group: 22; + -webkit-order: 21; + -ms-flex-order: 21; + order: 21; + } + .ant-col-lg-20 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 83.33333333%; + } + .ant-col-lg-push-20 { + left: 83.33333333%; + } + .ant-col-lg-pull-20 { + right: 83.33333333%; + } + .ant-col-lg-offset-20 { + margin-left: 83.33333333%; + } + .ant-col-lg-order-20 { + -webkit-box-ordinal-group: 21; + -webkit-order: 20; + -ms-flex-order: 20; + order: 20; + } + .ant-col-lg-19 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 79.16666667%; + } + .ant-col-lg-push-19 { + left: 79.16666667%; + } + .ant-col-lg-pull-19 { + right: 79.16666667%; + } + .ant-col-lg-offset-19 { + margin-left: 79.16666667%; + } + .ant-col-lg-order-19 { + -webkit-box-ordinal-group: 20; + -webkit-order: 19; + -ms-flex-order: 19; + order: 19; + } + .ant-col-lg-18 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 75%; + } + .ant-col-lg-push-18 { + left: 75%; + } + .ant-col-lg-pull-18 { + right: 75%; + } + .ant-col-lg-offset-18 { + margin-left: 75%; + } + .ant-col-lg-order-18 { + -webkit-box-ordinal-group: 19; + -webkit-order: 18; + -ms-flex-order: 18; + order: 18; + } + .ant-col-lg-17 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 70.83333333%; + } + .ant-col-lg-push-17 { + left: 70.83333333%; + } + .ant-col-lg-pull-17 { + right: 70.83333333%; + } + .ant-col-lg-offset-17 { + margin-left: 70.83333333%; + } + .ant-col-lg-order-17 { + -webkit-box-ordinal-group: 18; + -webkit-order: 17; + -ms-flex-order: 17; + order: 17; + } + .ant-col-lg-16 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 66.66666667%; + } + .ant-col-lg-push-16 { + left: 66.66666667%; + } + .ant-col-lg-pull-16 { + right: 66.66666667%; + } + .ant-col-lg-offset-16 { + margin-left: 66.66666667%; + } + .ant-col-lg-order-16 { + -webkit-box-ordinal-group: 17; + -webkit-order: 16; + -ms-flex-order: 16; + order: 16; + } + .ant-col-lg-15 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 62.5%; + } + .ant-col-lg-push-15 { + left: 62.5%; + } + .ant-col-lg-pull-15 { + right: 62.5%; + } + .ant-col-lg-offset-15 { + margin-left: 62.5%; + } + .ant-col-lg-order-15 { + -webkit-box-ordinal-group: 16; + -webkit-order: 15; + -ms-flex-order: 15; + order: 15; + } + .ant-col-lg-14 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 58.33333333%; + } + .ant-col-lg-push-14 { + left: 58.33333333%; + } + .ant-col-lg-pull-14 { + right: 58.33333333%; + } + .ant-col-lg-offset-14 { + margin-left: 58.33333333%; + } + .ant-col-lg-order-14 { + -webkit-box-ordinal-group: 15; + -webkit-order: 14; + -ms-flex-order: 14; + order: 14; + } + .ant-col-lg-13 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 54.16666667%; + } + .ant-col-lg-push-13 { + left: 54.16666667%; + } + .ant-col-lg-pull-13 { + right: 54.16666667%; + } + .ant-col-lg-offset-13 { + margin-left: 54.16666667%; + } + .ant-col-lg-order-13 { + -webkit-box-ordinal-group: 14; + -webkit-order: 13; + -ms-flex-order: 13; + order: 13; + } + .ant-col-lg-12 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 50%; + } + .ant-col-lg-push-12 { + left: 50%; + } + .ant-col-lg-pull-12 { + right: 50%; + } + .ant-col-lg-offset-12 { + margin-left: 50%; + } + .ant-col-lg-order-12 { + -webkit-box-ordinal-group: 13; + -webkit-order: 12; + -ms-flex-order: 12; + order: 12; + } + .ant-col-lg-11 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 45.83333333%; + } + .ant-col-lg-push-11 { + left: 45.83333333%; + } + .ant-col-lg-pull-11 { + right: 45.83333333%; + } + .ant-col-lg-offset-11 { + margin-left: 45.83333333%; + } + .ant-col-lg-order-11 { + -webkit-box-ordinal-group: 12; + -webkit-order: 11; + -ms-flex-order: 11; + order: 11; + } + .ant-col-lg-10 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 41.66666667%; + } + .ant-col-lg-push-10 { + left: 41.66666667%; + } + .ant-col-lg-pull-10 { + right: 41.66666667%; + } + .ant-col-lg-offset-10 { + margin-left: 41.66666667%; + } + .ant-col-lg-order-10 { + -webkit-box-ordinal-group: 11; + -webkit-order: 10; + -ms-flex-order: 10; + order: 10; + } + .ant-col-lg-9 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 37.5%; + } + .ant-col-lg-push-9 { + left: 37.5%; + } + .ant-col-lg-pull-9 { + right: 37.5%; + } + .ant-col-lg-offset-9 { + margin-left: 37.5%; + } + .ant-col-lg-order-9 { + -webkit-box-ordinal-group: 10; + -webkit-order: 9; + -ms-flex-order: 9; + order: 9; + } + .ant-col-lg-8 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 33.33333333%; + } + .ant-col-lg-push-8 { + left: 33.33333333%; + } + .ant-col-lg-pull-8 { + right: 33.33333333%; + } + .ant-col-lg-offset-8 { + margin-left: 33.33333333%; + } + .ant-col-lg-order-8 { + -webkit-box-ordinal-group: 9; + -webkit-order: 8; + -ms-flex-order: 8; + order: 8; + } + .ant-col-lg-7 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 29.16666667%; + } + .ant-col-lg-push-7 { + left: 29.16666667%; + } + .ant-col-lg-pull-7 { + right: 29.16666667%; + } + .ant-col-lg-offset-7 { + margin-left: 29.16666667%; + } + .ant-col-lg-order-7 { + -webkit-box-ordinal-group: 8; + -webkit-order: 7; + -ms-flex-order: 7; + order: 7; + } + .ant-col-lg-6 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 25%; + } + .ant-col-lg-push-6 { + left: 25%; + } + .ant-col-lg-pull-6 { + right: 25%; + } + .ant-col-lg-offset-6 { + margin-left: 25%; + } + .ant-col-lg-order-6 { + -webkit-box-ordinal-group: 7; + -webkit-order: 6; + -ms-flex-order: 6; + order: 6; + } + .ant-col-lg-5 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 20.83333333%; + } + .ant-col-lg-push-5 { + left: 20.83333333%; + } + .ant-col-lg-pull-5 { + right: 20.83333333%; + } + .ant-col-lg-offset-5 { + margin-left: 20.83333333%; + } + .ant-col-lg-order-5 { + -webkit-box-ordinal-group: 6; + -webkit-order: 5; + -ms-flex-order: 5; + order: 5; + } + .ant-col-lg-4 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 16.66666667%; + } + .ant-col-lg-push-4 { + left: 16.66666667%; + } + .ant-col-lg-pull-4 { + right: 16.66666667%; + } + .ant-col-lg-offset-4 { + margin-left: 16.66666667%; + } + .ant-col-lg-order-4 { + -webkit-box-ordinal-group: 5; + -webkit-order: 4; + -ms-flex-order: 4; + order: 4; + } + .ant-col-lg-3 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 12.5%; + } + .ant-col-lg-push-3 { + left: 12.5%; + } + .ant-col-lg-pull-3 { + right: 12.5%; + } + .ant-col-lg-offset-3 { + margin-left: 12.5%; + } + .ant-col-lg-order-3 { + -webkit-box-ordinal-group: 4; + -webkit-order: 3; + -ms-flex-order: 3; + order: 3; + } + .ant-col-lg-2 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 8.33333333%; + } + .ant-col-lg-push-2 { + left: 8.33333333%; + } + .ant-col-lg-pull-2 { + right: 8.33333333%; + } + .ant-col-lg-offset-2 { + margin-left: 8.33333333%; + } + .ant-col-lg-order-2 { + -webkit-box-ordinal-group: 3; + -webkit-order: 2; + -ms-flex-order: 2; + order: 2; + } + .ant-col-lg-1 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 4.16666667%; + } + .ant-col-lg-push-1 { + left: 4.16666667%; + } + .ant-col-lg-pull-1 { + right: 4.16666667%; + } + .ant-col-lg-offset-1 { + margin-left: 4.16666667%; + } + .ant-col-lg-order-1 { + -webkit-box-ordinal-group: 2; + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; + } + .ant-col-lg-0 { + display: none; + } + .ant-col-push-0 { + left: auto; + } + .ant-col-pull-0 { + right: auto; + } + .ant-col-lg-push-0 { + left: auto; + } + .ant-col-lg-pull-0 { + right: auto; + } + .ant-col-lg-offset-0 { + margin-left: 0; + } + .ant-col-lg-order-0 { + -webkit-box-ordinal-group: 1; + -webkit-order: 0; + -ms-flex-order: 0; + order: 0; + } +} +@media (min-width: 1200px) { + .ant-col-xl-1, .ant-col-xl-2, .ant-col-xl-3, .ant-col-xl-4, .ant-col-xl-5, .ant-col-xl-6, .ant-col-xl-7, .ant-col-xl-8, .ant-col-xl-9, .ant-col-xl-10, .ant-col-xl-11, .ant-col-xl-12, .ant-col-xl-13, .ant-col-xl-14, .ant-col-xl-15, .ant-col-xl-16, .ant-col-xl-17, .ant-col-xl-18, .ant-col-xl-19, .ant-col-xl-20, .ant-col-xl-21, .ant-col-xl-22, .ant-col-xl-23, .ant-col-xl-24 { + float: left; + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + } + .ant-col-xl-24 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + } + .ant-col-xl-push-24 { + left: 100%; + } + .ant-col-xl-pull-24 { + right: 100%; + } + .ant-col-xl-offset-24 { + margin-left: 100%; + } + .ant-col-xl-order-24 { + -webkit-box-ordinal-group: 25; + -webkit-order: 24; + -ms-flex-order: 24; + order: 24; + } + .ant-col-xl-23 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 95.83333333%; + } + .ant-col-xl-push-23 { + left: 95.83333333%; + } + .ant-col-xl-pull-23 { + right: 95.83333333%; + } + .ant-col-xl-offset-23 { + margin-left: 95.83333333%; + } + .ant-col-xl-order-23 { + -webkit-box-ordinal-group: 24; + -webkit-order: 23; + -ms-flex-order: 23; + order: 23; + } + .ant-col-xl-22 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 91.66666667%; + } + .ant-col-xl-push-22 { + left: 91.66666667%; + } + .ant-col-xl-pull-22 { + right: 91.66666667%; + } + .ant-col-xl-offset-22 { + margin-left: 91.66666667%; + } + .ant-col-xl-order-22 { + -webkit-box-ordinal-group: 23; + -webkit-order: 22; + -ms-flex-order: 22; + order: 22; + } + .ant-col-xl-21 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 87.5%; + } + .ant-col-xl-push-21 { + left: 87.5%; + } + .ant-col-xl-pull-21 { + right: 87.5%; + } + .ant-col-xl-offset-21 { + margin-left: 87.5%; + } + .ant-col-xl-order-21 { + -webkit-box-ordinal-group: 22; + -webkit-order: 21; + -ms-flex-order: 21; + order: 21; + } + .ant-col-xl-20 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 83.33333333%; + } + .ant-col-xl-push-20 { + left: 83.33333333%; + } + .ant-col-xl-pull-20 { + right: 83.33333333%; + } + .ant-col-xl-offset-20 { + margin-left: 83.33333333%; + } + .ant-col-xl-order-20 { + -webkit-box-ordinal-group: 21; + -webkit-order: 20; + -ms-flex-order: 20; + order: 20; + } + .ant-col-xl-19 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 79.16666667%; + } + .ant-col-xl-push-19 { + left: 79.16666667%; + } + .ant-col-xl-pull-19 { + right: 79.16666667%; + } + .ant-col-xl-offset-19 { + margin-left: 79.16666667%; + } + .ant-col-xl-order-19 { + -webkit-box-ordinal-group: 20; + -webkit-order: 19; + -ms-flex-order: 19; + order: 19; + } + .ant-col-xl-18 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 75%; + } + .ant-col-xl-push-18 { + left: 75%; + } + .ant-col-xl-pull-18 { + right: 75%; + } + .ant-col-xl-offset-18 { + margin-left: 75%; + } + .ant-col-xl-order-18 { + -webkit-box-ordinal-group: 19; + -webkit-order: 18; + -ms-flex-order: 18; + order: 18; + } + .ant-col-xl-17 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 70.83333333%; + } + .ant-col-xl-push-17 { + left: 70.83333333%; + } + .ant-col-xl-pull-17 { + right: 70.83333333%; + } + .ant-col-xl-offset-17 { + margin-left: 70.83333333%; + } + .ant-col-xl-order-17 { + -webkit-box-ordinal-group: 18; + -webkit-order: 17; + -ms-flex-order: 17; + order: 17; + } + .ant-col-xl-16 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 66.66666667%; + } + .ant-col-xl-push-16 { + left: 66.66666667%; + } + .ant-col-xl-pull-16 { + right: 66.66666667%; + } + .ant-col-xl-offset-16 { + margin-left: 66.66666667%; + } + .ant-col-xl-order-16 { + -webkit-box-ordinal-group: 17; + -webkit-order: 16; + -ms-flex-order: 16; + order: 16; + } + .ant-col-xl-15 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 62.5%; + } + .ant-col-xl-push-15 { + left: 62.5%; + } + .ant-col-xl-pull-15 { + right: 62.5%; + } + .ant-col-xl-offset-15 { + margin-left: 62.5%; + } + .ant-col-xl-order-15 { + -webkit-box-ordinal-group: 16; + -webkit-order: 15; + -ms-flex-order: 15; + order: 15; + } + .ant-col-xl-14 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 58.33333333%; + } + .ant-col-xl-push-14 { + left: 58.33333333%; + } + .ant-col-xl-pull-14 { + right: 58.33333333%; + } + .ant-col-xl-offset-14 { + margin-left: 58.33333333%; + } + .ant-col-xl-order-14 { + -webkit-box-ordinal-group: 15; + -webkit-order: 14; + -ms-flex-order: 14; + order: 14; + } + .ant-col-xl-13 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 54.16666667%; + } + .ant-col-xl-push-13 { + left: 54.16666667%; + } + .ant-col-xl-pull-13 { + right: 54.16666667%; + } + .ant-col-xl-offset-13 { + margin-left: 54.16666667%; + } + .ant-col-xl-order-13 { + -webkit-box-ordinal-group: 14; + -webkit-order: 13; + -ms-flex-order: 13; + order: 13; + } + .ant-col-xl-12 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 50%; + } + .ant-col-xl-push-12 { + left: 50%; + } + .ant-col-xl-pull-12 { + right: 50%; + } + .ant-col-xl-offset-12 { + margin-left: 50%; + } + .ant-col-xl-order-12 { + -webkit-box-ordinal-group: 13; + -webkit-order: 12; + -ms-flex-order: 12; + order: 12; + } + .ant-col-xl-11 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 45.83333333%; + } + .ant-col-xl-push-11 { + left: 45.83333333%; + } + .ant-col-xl-pull-11 { + right: 45.83333333%; + } + .ant-col-xl-offset-11 { + margin-left: 45.83333333%; + } + .ant-col-xl-order-11 { + -webkit-box-ordinal-group: 12; + -webkit-order: 11; + -ms-flex-order: 11; + order: 11; + } + .ant-col-xl-10 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 41.66666667%; + } + .ant-col-xl-push-10 { + left: 41.66666667%; + } + .ant-col-xl-pull-10 { + right: 41.66666667%; + } + .ant-col-xl-offset-10 { + margin-left: 41.66666667%; + } + .ant-col-xl-order-10 { + -webkit-box-ordinal-group: 11; + -webkit-order: 10; + -ms-flex-order: 10; + order: 10; + } + .ant-col-xl-9 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 37.5%; + } + .ant-col-xl-push-9 { + left: 37.5%; + } + .ant-col-xl-pull-9 { + right: 37.5%; + } + .ant-col-xl-offset-9 { + margin-left: 37.5%; + } + .ant-col-xl-order-9 { + -webkit-box-ordinal-group: 10; + -webkit-order: 9; + -ms-flex-order: 9; + order: 9; + } + .ant-col-xl-8 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 33.33333333%; + } + .ant-col-xl-push-8 { + left: 33.33333333%; + } + .ant-col-xl-pull-8 { + right: 33.33333333%; + } + .ant-col-xl-offset-8 { + margin-left: 33.33333333%; + } + .ant-col-xl-order-8 { + -webkit-box-ordinal-group: 9; + -webkit-order: 8; + -ms-flex-order: 8; + order: 8; + } + .ant-col-xl-7 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 29.16666667%; + } + .ant-col-xl-push-7 { + left: 29.16666667%; + } + .ant-col-xl-pull-7 { + right: 29.16666667%; + } + .ant-col-xl-offset-7 { + margin-left: 29.16666667%; + } + .ant-col-xl-order-7 { + -webkit-box-ordinal-group: 8; + -webkit-order: 7; + -ms-flex-order: 7; + order: 7; + } + .ant-col-xl-6 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 25%; + } + .ant-col-xl-push-6 { + left: 25%; + } + .ant-col-xl-pull-6 { + right: 25%; + } + .ant-col-xl-offset-6 { + margin-left: 25%; + } + .ant-col-xl-order-6 { + -webkit-box-ordinal-group: 7; + -webkit-order: 6; + -ms-flex-order: 6; + order: 6; + } + .ant-col-xl-5 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 20.83333333%; + } + .ant-col-xl-push-5 { + left: 20.83333333%; + } + .ant-col-xl-pull-5 { + right: 20.83333333%; + } + .ant-col-xl-offset-5 { + margin-left: 20.83333333%; + } + .ant-col-xl-order-5 { + -webkit-box-ordinal-group: 6; + -webkit-order: 5; + -ms-flex-order: 5; + order: 5; + } + .ant-col-xl-4 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 16.66666667%; + } + .ant-col-xl-push-4 { + left: 16.66666667%; + } + .ant-col-xl-pull-4 { + right: 16.66666667%; + } + .ant-col-xl-offset-4 { + margin-left: 16.66666667%; + } + .ant-col-xl-order-4 { + -webkit-box-ordinal-group: 5; + -webkit-order: 4; + -ms-flex-order: 4; + order: 4; + } + .ant-col-xl-3 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 12.5%; + } + .ant-col-xl-push-3 { + left: 12.5%; + } + .ant-col-xl-pull-3 { + right: 12.5%; + } + .ant-col-xl-offset-3 { + margin-left: 12.5%; + } + .ant-col-xl-order-3 { + -webkit-box-ordinal-group: 4; + -webkit-order: 3; + -ms-flex-order: 3; + order: 3; + } + .ant-col-xl-2 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 8.33333333%; + } + .ant-col-xl-push-2 { + left: 8.33333333%; + } + .ant-col-xl-pull-2 { + right: 8.33333333%; + } + .ant-col-xl-offset-2 { + margin-left: 8.33333333%; + } + .ant-col-xl-order-2 { + -webkit-box-ordinal-group: 3; + -webkit-order: 2; + -ms-flex-order: 2; + order: 2; + } + .ant-col-xl-1 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 4.16666667%; + } + .ant-col-xl-push-1 { + left: 4.16666667%; + } + .ant-col-xl-pull-1 { + right: 4.16666667%; + } + .ant-col-xl-offset-1 { + margin-left: 4.16666667%; + } + .ant-col-xl-order-1 { + -webkit-box-ordinal-group: 2; + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; + } + .ant-col-xl-0 { + display: none; + } + .ant-col-push-0 { + left: auto; + } + .ant-col-pull-0 { + right: auto; + } + .ant-col-xl-push-0 { + left: auto; + } + .ant-col-xl-pull-0 { + right: auto; + } + .ant-col-xl-offset-0 { + margin-left: 0; + } + .ant-col-xl-order-0 { + -webkit-box-ordinal-group: 1; + -webkit-order: 0; + -ms-flex-order: 0; + order: 0; + } +} +@media (min-width: 1600px) { + .ant-col-xxl-1, .ant-col-xxl-2, .ant-col-xxl-3, .ant-col-xxl-4, .ant-col-xxl-5, .ant-col-xxl-6, .ant-col-xxl-7, .ant-col-xxl-8, .ant-col-xxl-9, .ant-col-xxl-10, .ant-col-xxl-11, .ant-col-xxl-12, .ant-col-xxl-13, .ant-col-xxl-14, .ant-col-xxl-15, .ant-col-xxl-16, .ant-col-xxl-17, .ant-col-xxl-18, .ant-col-xxl-19, .ant-col-xxl-20, .ant-col-xxl-21, .ant-col-xxl-22, .ant-col-xxl-23, .ant-col-xxl-24 { + float: left; + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + } + .ant-col-xxl-24 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + } + .ant-col-xxl-push-24 { + left: 100%; + } + .ant-col-xxl-pull-24 { + right: 100%; + } + .ant-col-xxl-offset-24 { + margin-left: 100%; + } + .ant-col-xxl-order-24 { + -webkit-box-ordinal-group: 25; + -webkit-order: 24; + -ms-flex-order: 24; + order: 24; + } + .ant-col-xxl-23 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 95.83333333%; + } + .ant-col-xxl-push-23 { + left: 95.83333333%; + } + .ant-col-xxl-pull-23 { + right: 95.83333333%; + } + .ant-col-xxl-offset-23 { + margin-left: 95.83333333%; + } + .ant-col-xxl-order-23 { + -webkit-box-ordinal-group: 24; + -webkit-order: 23; + -ms-flex-order: 23; + order: 23; + } + .ant-col-xxl-22 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 91.66666667%; + } + .ant-col-xxl-push-22 { + left: 91.66666667%; + } + .ant-col-xxl-pull-22 { + right: 91.66666667%; + } + .ant-col-xxl-offset-22 { + margin-left: 91.66666667%; + } + .ant-col-xxl-order-22 { + -webkit-box-ordinal-group: 23; + -webkit-order: 22; + -ms-flex-order: 22; + order: 22; + } + .ant-col-xxl-21 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 87.5%; + } + .ant-col-xxl-push-21 { + left: 87.5%; + } + .ant-col-xxl-pull-21 { + right: 87.5%; + } + .ant-col-xxl-offset-21 { + margin-left: 87.5%; + } + .ant-col-xxl-order-21 { + -webkit-box-ordinal-group: 22; + -webkit-order: 21; + -ms-flex-order: 21; + order: 21; + } + .ant-col-xxl-20 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 83.33333333%; + } + .ant-col-xxl-push-20 { + left: 83.33333333%; + } + .ant-col-xxl-pull-20 { + right: 83.33333333%; + } + .ant-col-xxl-offset-20 { + margin-left: 83.33333333%; + } + .ant-col-xxl-order-20 { + -webkit-box-ordinal-group: 21; + -webkit-order: 20; + -ms-flex-order: 20; + order: 20; + } + .ant-col-xxl-19 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 79.16666667%; + } + .ant-col-xxl-push-19 { + left: 79.16666667%; + } + .ant-col-xxl-pull-19 { + right: 79.16666667%; + } + .ant-col-xxl-offset-19 { + margin-left: 79.16666667%; + } + .ant-col-xxl-order-19 { + -webkit-box-ordinal-group: 20; + -webkit-order: 19; + -ms-flex-order: 19; + order: 19; + } + .ant-col-xxl-18 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 75%; + } + .ant-col-xxl-push-18 { + left: 75%; + } + .ant-col-xxl-pull-18 { + right: 75%; + } + .ant-col-xxl-offset-18 { + margin-left: 75%; + } + .ant-col-xxl-order-18 { + -webkit-box-ordinal-group: 19; + -webkit-order: 18; + -ms-flex-order: 18; + order: 18; + } + .ant-col-xxl-17 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 70.83333333%; + } + .ant-col-xxl-push-17 { + left: 70.83333333%; + } + .ant-col-xxl-pull-17 { + right: 70.83333333%; + } + .ant-col-xxl-offset-17 { + margin-left: 70.83333333%; + } + .ant-col-xxl-order-17 { + -webkit-box-ordinal-group: 18; + -webkit-order: 17; + -ms-flex-order: 17; + order: 17; + } + .ant-col-xxl-16 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 66.66666667%; + } + .ant-col-xxl-push-16 { + left: 66.66666667%; + } + .ant-col-xxl-pull-16 { + right: 66.66666667%; + } + .ant-col-xxl-offset-16 { + margin-left: 66.66666667%; + } + .ant-col-xxl-order-16 { + -webkit-box-ordinal-group: 17; + -webkit-order: 16; + -ms-flex-order: 16; + order: 16; + } + .ant-col-xxl-15 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 62.5%; + } + .ant-col-xxl-push-15 { + left: 62.5%; + } + .ant-col-xxl-pull-15 { + right: 62.5%; + } + .ant-col-xxl-offset-15 { + margin-left: 62.5%; + } + .ant-col-xxl-order-15 { + -webkit-box-ordinal-group: 16; + -webkit-order: 15; + -ms-flex-order: 15; + order: 15; + } + .ant-col-xxl-14 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 58.33333333%; + } + .ant-col-xxl-push-14 { + left: 58.33333333%; + } + .ant-col-xxl-pull-14 { + right: 58.33333333%; + } + .ant-col-xxl-offset-14 { + margin-left: 58.33333333%; + } + .ant-col-xxl-order-14 { + -webkit-box-ordinal-group: 15; + -webkit-order: 14; + -ms-flex-order: 14; + order: 14; + } + .ant-col-xxl-13 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 54.16666667%; + } + .ant-col-xxl-push-13 { + left: 54.16666667%; + } + .ant-col-xxl-pull-13 { + right: 54.16666667%; + } + .ant-col-xxl-offset-13 { + margin-left: 54.16666667%; + } + .ant-col-xxl-order-13 { + -webkit-box-ordinal-group: 14; + -webkit-order: 13; + -ms-flex-order: 13; + order: 13; + } + .ant-col-xxl-12 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 50%; + } + .ant-col-xxl-push-12 { + left: 50%; + } + .ant-col-xxl-pull-12 { + right: 50%; + } + .ant-col-xxl-offset-12 { + margin-left: 50%; + } + .ant-col-xxl-order-12 { + -webkit-box-ordinal-group: 13; + -webkit-order: 12; + -ms-flex-order: 12; + order: 12; + } + .ant-col-xxl-11 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 45.83333333%; + } + .ant-col-xxl-push-11 { + left: 45.83333333%; + } + .ant-col-xxl-pull-11 { + right: 45.83333333%; + } + .ant-col-xxl-offset-11 { + margin-left: 45.83333333%; + } + .ant-col-xxl-order-11 { + -webkit-box-ordinal-group: 12; + -webkit-order: 11; + -ms-flex-order: 11; + order: 11; + } + .ant-col-xxl-10 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 41.66666667%; + } + .ant-col-xxl-push-10 { + left: 41.66666667%; + } + .ant-col-xxl-pull-10 { + right: 41.66666667%; + } + .ant-col-xxl-offset-10 { + margin-left: 41.66666667%; + } + .ant-col-xxl-order-10 { + -webkit-box-ordinal-group: 11; + -webkit-order: 10; + -ms-flex-order: 10; + order: 10; + } + .ant-col-xxl-9 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 37.5%; + } + .ant-col-xxl-push-9 { + left: 37.5%; + } + .ant-col-xxl-pull-9 { + right: 37.5%; + } + .ant-col-xxl-offset-9 { + margin-left: 37.5%; + } + .ant-col-xxl-order-9 { + -webkit-box-ordinal-group: 10; + -webkit-order: 9; + -ms-flex-order: 9; + order: 9; + } + .ant-col-xxl-8 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 33.33333333%; + } + .ant-col-xxl-push-8 { + left: 33.33333333%; + } + .ant-col-xxl-pull-8 { + right: 33.33333333%; + } + .ant-col-xxl-offset-8 { + margin-left: 33.33333333%; + } + .ant-col-xxl-order-8 { + -webkit-box-ordinal-group: 9; + -webkit-order: 8; + -ms-flex-order: 8; + order: 8; + } + .ant-col-xxl-7 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 29.16666667%; + } + .ant-col-xxl-push-7 { + left: 29.16666667%; + } + .ant-col-xxl-pull-7 { + right: 29.16666667%; + } + .ant-col-xxl-offset-7 { + margin-left: 29.16666667%; + } + .ant-col-xxl-order-7 { + -webkit-box-ordinal-group: 8; + -webkit-order: 7; + -ms-flex-order: 7; + order: 7; + } + .ant-col-xxl-6 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 25%; + } + .ant-col-xxl-push-6 { + left: 25%; + } + .ant-col-xxl-pull-6 { + right: 25%; + } + .ant-col-xxl-offset-6 { + margin-left: 25%; + } + .ant-col-xxl-order-6 { + -webkit-box-ordinal-group: 7; + -webkit-order: 6; + -ms-flex-order: 6; + order: 6; + } + .ant-col-xxl-5 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 20.83333333%; + } + .ant-col-xxl-push-5 { + left: 20.83333333%; + } + .ant-col-xxl-pull-5 { + right: 20.83333333%; + } + .ant-col-xxl-offset-5 { + margin-left: 20.83333333%; + } + .ant-col-xxl-order-5 { + -webkit-box-ordinal-group: 6; + -webkit-order: 5; + -ms-flex-order: 5; + order: 5; + } + .ant-col-xxl-4 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 16.66666667%; + } + .ant-col-xxl-push-4 { + left: 16.66666667%; + } + .ant-col-xxl-pull-4 { + right: 16.66666667%; + } + .ant-col-xxl-offset-4 { + margin-left: 16.66666667%; + } + .ant-col-xxl-order-4 { + -webkit-box-ordinal-group: 5; + -webkit-order: 4; + -ms-flex-order: 4; + order: 4; + } + .ant-col-xxl-3 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 12.5%; + } + .ant-col-xxl-push-3 { + left: 12.5%; + } + .ant-col-xxl-pull-3 { + right: 12.5%; + } + .ant-col-xxl-offset-3 { + margin-left: 12.5%; + } + .ant-col-xxl-order-3 { + -webkit-box-ordinal-group: 4; + -webkit-order: 3; + -ms-flex-order: 3; + order: 3; + } + .ant-col-xxl-2 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 8.33333333%; + } + .ant-col-xxl-push-2 { + left: 8.33333333%; + } + .ant-col-xxl-pull-2 { + right: 8.33333333%; + } + .ant-col-xxl-offset-2 { + margin-left: 8.33333333%; + } + .ant-col-xxl-order-2 { + -webkit-box-ordinal-group: 3; + -webkit-order: 2; + -ms-flex-order: 2; + order: 2; + } + .ant-col-xxl-1 { + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 4.16666667%; + } + .ant-col-xxl-push-1 { + left: 4.16666667%; + } + .ant-col-xxl-pull-1 { + right: 4.16666667%; + } + .ant-col-xxl-offset-1 { + margin-left: 4.16666667%; + } + .ant-col-xxl-order-1 { + -webkit-box-ordinal-group: 2; + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; + } + .ant-col-xxl-0 { + display: none; + } + .ant-col-push-0 { + left: auto; + } + .ant-col-pull-0 { + right: auto; + } + .ant-col-xxl-push-0 { + left: auto; + } + .ant-col-xxl-pull-0 { + right: auto; + } + .ant-col-xxl-offset-0 { + margin-left: 0; + } + .ant-col-xxl-order-0 { + -webkit-box-ordinal-group: 1; + -webkit-order: 0; + -ms-flex-order: 0; + order: 0; + } +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-collapse { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + background-color: #fafafa; + border-radius: 4px; + border: 1px solid #d9d9d9; + border-bottom: 0; +} +.ant-collapse > .ant-collapse-item { + border-bottom: 1px solid #d9d9d9; +} +.ant-collapse > .ant-collapse-item:last-child, +.ant-collapse > .ant-collapse-item:last-child > .ant-collapse-header { + border-radius: 0 0 4px 4px; +} +.ant-collapse > .ant-collapse-item > .ant-collapse-header { + line-height: 22px; + padding: 12px 0 12px 40px; + color: rgba(0, 0, 0, 0.85); + cursor: pointer; + position: relative; + -webkit-transition: all .3s; + transition: all .3s; +} +.ant-collapse > .ant-collapse-item > .ant-collapse-header .arrow { + font-style: normal; + vertical-align: -0.125em; + text-align: center; + text-transform: none; + line-height: 0; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + font-size: 12px; + position: absolute; + display: inline-block; + line-height: 46px; + vertical-align: top; + top: 50%; + -webkit-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); + left: 16px; +} +.ant-collapse > .ant-collapse-item > .ant-collapse-header .arrow > * { + line-height: 1; +} +.ant-collapse > .ant-collapse-item > .ant-collapse-header .arrow svg { + display: inline-block; +} +.ant-collapse > .ant-collapse-item > .ant-collapse-header .arrow:before { + display: none; +} +.ant-collapse > .ant-collapse-item > .ant-collapse-header .arrow .ant-collapse > .ant-collapse-item > .ant-collapse-header .arrow-icon { + display: block; +} +.ant-collapse > .ant-collapse-item > .ant-collapse-header .arrow svg { + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + -webkit-transition: -webkit-transform 0.24s; + transition: -webkit-transform 0.24s; + transition: transform 0.24s; + transition: transform 0.24s, -webkit-transform 0.24s; +} +.ant-collapse > .ant-collapse-item > .ant-collapse-header:focus { + outline: none; +} +.ant-collapse > .ant-collapse-item.ant-collapse-no-arrow > .ant-collapse-header { + padding-left: 12px; +} +.ant-collapse-anim-active { + -webkit-transition: height 0.2s cubic-bezier(0.215, 0.61, 0.355, 1); + transition: height 0.2s cubic-bezier(0.215, 0.61, 0.355, 1); +} +.ant-collapse-content { + overflow: hidden; + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + border-top: 1px solid #d9d9d9; +} +.ant-collapse-content > .ant-collapse-content-box { + padding: 16px; +} +.ant-collapse-content-inactive { + display: none; +} +.ant-collapse-item:last-child > .ant-collapse-content { + border-radius: 0 0 4px 4px; +} +.ant-collapse > .ant-collapse-item > .ant-collapse-header[aria-expanded="true"] .anticon-right svg { + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.ant-collapse-borderless { + background-color: #fff; + border: 0; +} +.ant-collapse-borderless > .ant-collapse-item { + border-bottom: 1px solid #d9d9d9; +} +.ant-collapse-borderless > .ant-collapse-item:last-child, +.ant-collapse-borderless > .ant-collapse-item:last-child .ant-collapse-header { + border-radius: 0; +} +.ant-collapse-borderless > .ant-collapse-item > .ant-collapse-content { + background-color: transparent; + border-top: 0; +} +.ant-collapse-borderless > .ant-collapse-item > .ant-collapse-content > .ant-collapse-content-box { + padding-top: 4px; +} +.ant-collapse .ant-collapse-item-disabled > .ant-collapse-header, +.ant-collapse .ant-collapse-item-disabled > .ant-collapse-header > .arrow { + cursor: not-allowed; + color: rgba(0, 0, 0, 0.25); +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-calendar-picker-container { + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + position: absolute; + z-index: 1050; +} +.ant-calendar-picker-container.slide-up-enter.slide-up-enter-active.ant-calendar-picker-container-placement-topLeft, +.ant-calendar-picker-container.slide-up-enter.slide-up-enter-active.ant-calendar-picker-container-placement-topRight, +.ant-calendar-picker-container.slide-up-appear.slide-up-appear-active.ant-calendar-picker-container-placement-topLeft, +.ant-calendar-picker-container.slide-up-appear.slide-up-appear-active.ant-calendar-picker-container-placement-topRight { + -webkit-animation-name: antSlideDownIn; + animation-name: antSlideDownIn; +} +.ant-calendar-picker-container.slide-up-enter.slide-up-enter-active.ant-calendar-picker-container-placement-bottomLeft, +.ant-calendar-picker-container.slide-up-enter.slide-up-enter-active.ant-calendar-picker-container-placement-bottomRight, +.ant-calendar-picker-container.slide-up-appear.slide-up-appear-active.ant-calendar-picker-container-placement-bottomLeft, +.ant-calendar-picker-container.slide-up-appear.slide-up-appear-active.ant-calendar-picker-container-placement-bottomRight { + -webkit-animation-name: antSlideUpIn; + animation-name: antSlideUpIn; +} +.ant-calendar-picker-container.slide-up-leave.slide-up-leave-active.ant-calendar-picker-container-placement-topLeft, +.ant-calendar-picker-container.slide-up-leave.slide-up-leave-active.ant-calendar-picker-container-placement-topRight { + -webkit-animation-name: antSlideDownOut; + animation-name: antSlideDownOut; +} +.ant-calendar-picker-container.slide-up-leave.slide-up-leave-active.ant-calendar-picker-container-placement-bottomLeft, +.ant-calendar-picker-container.slide-up-leave.slide-up-leave-active.ant-calendar-picker-container-placement-bottomRight { + -webkit-animation-name: antSlideUpOut; + animation-name: antSlideUpOut; +} +.ant-calendar-picker { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + position: relative; + display: inline-block; + outline: none; + -webkit-transition: opacity 0.3s; + transition: opacity 0.3s; +} +.ant-calendar-picker-input { + outline: none; +} +.ant-calendar-picker:hover .ant-calendar-picker-input:not(.ant-input-disabled) { + border-color: #1890ff; +} +.ant-calendar-picker:focus .ant-calendar-picker-input:not(.ant-input-disabled) { + border-color: #40a9ff; + outline: 0; + -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-calendar-picker-clear, +.ant-calendar-picker-icon { + position: absolute; + width: 14px; + height: 14px; + right: 12px; + top: 50%; + margin-top: -7px; + line-height: 14px; + font-size: 12px; + -webkit-transition: all .3s; + transition: all .3s; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.ant-calendar-picker-clear { + opacity: 0; + z-index: 1; + font-size: 14px; + color: rgba(0, 0, 0, 0.25); + background: #fff; + pointer-events: none; + cursor: pointer; +} +.ant-calendar-picker-clear:hover { + color: rgba(0, 0, 0, 0.45); +} +.ant-calendar-picker:hover .ant-calendar-picker-clear { + opacity: 1; + pointer-events: auto; +} +.ant-calendar-picker-icon { + font-family: "anticon"; + font-size: 14px; + color: rgba(0, 0, 0, 0.25); + display: inline-block; + line-height: 1; +} +.ant-calendar-picker-small .ant-calendar-picker-clear, +.ant-calendar-picker-small .ant-calendar-picker-icon { + right: 8px; +} +.ant-calendar { + position: relative; + outline: none; + width: 280px; + border: 1px solid #fff; + list-style: none; + font-size: 14px; + text-align: left; + background-color: #fff; + border-radius: 4px; + -webkit-box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + background-clip: padding-box; + line-height: 1.5; +} +.ant-calendar-input-wrap { + height: 34px; + padding: 6px 10px; + border-bottom: 1px solid #e8e8e8; +} +.ant-calendar-input { + border: 0; + width: 100%; + cursor: auto; + outline: 0; + height: 22px; + color: rgba(0, 0, 0, 0.65); + background: #fff; +} +.ant-calendar-input::-moz-placeholder { + color: #bfbfbf; + opacity: 1; +} +.ant-calendar-input:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-calendar-input::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-calendar-week-number { + width: 286px; +} +.ant-calendar-week-number-cell { + text-align: center; +} +.ant-calendar-header { + height: 40px; + line-height: 40px; + text-align: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + border-bottom: 1px solid #e8e8e8; +} +.ant-calendar-header a:hover { + color: #40a9ff; +} +.ant-calendar-header .ant-calendar-century-select, +.ant-calendar-header .ant-calendar-decade-select, +.ant-calendar-header .ant-calendar-year-select, +.ant-calendar-header .ant-calendar-month-select { + padding: 0 2px; + font-weight: 500; + display: inline-block; + color: rgba(0, 0, 0, 0.85); + line-height: 40px; +} +.ant-calendar-header .ant-calendar-century-select-arrow, +.ant-calendar-header .ant-calendar-decade-select-arrow, +.ant-calendar-header .ant-calendar-year-select-arrow, +.ant-calendar-header .ant-calendar-month-select-arrow { + display: none; +} +.ant-calendar-header .ant-calendar-prev-century-btn, +.ant-calendar-header .ant-calendar-next-century-btn, +.ant-calendar-header .ant-calendar-prev-decade-btn, +.ant-calendar-header .ant-calendar-next-decade-btn, +.ant-calendar-header .ant-calendar-prev-month-btn, +.ant-calendar-header .ant-calendar-next-month-btn, +.ant-calendar-header .ant-calendar-prev-year-btn, +.ant-calendar-header .ant-calendar-next-year-btn { + position: absolute; + top: 0; + color: rgba(0, 0, 0, 0.45); + font-family: Arial, "Hiragino Sans GB", "Microsoft Yahei", "Microsoft Sans Serif", sans-serif; + padding: 0 5px; + font-size: 16px; + display: inline-block; + line-height: 40px; +} +.ant-calendar-header .ant-calendar-prev-century-btn, +.ant-calendar-header .ant-calendar-prev-decade-btn, +.ant-calendar-header .ant-calendar-prev-year-btn { + left: 7px; +} +.ant-calendar-header .ant-calendar-prev-century-btn:after, +.ant-calendar-header .ant-calendar-prev-decade-btn:after, +.ant-calendar-header .ant-calendar-prev-year-btn:after { + content: '\AB'; +} +.ant-calendar-header .ant-calendar-next-century-btn, +.ant-calendar-header .ant-calendar-next-decade-btn, +.ant-calendar-header .ant-calendar-next-year-btn { + right: 7px; +} +.ant-calendar-header .ant-calendar-next-century-btn:after, +.ant-calendar-header .ant-calendar-next-decade-btn:after, +.ant-calendar-header .ant-calendar-next-year-btn:after { + content: '\BB'; +} +.ant-calendar-header .ant-calendar-prev-month-btn { + left: 29px; +} +.ant-calendar-header .ant-calendar-prev-month-btn:after { + content: '\2039'; +} +.ant-calendar-header .ant-calendar-next-month-btn { + right: 29px; +} +.ant-calendar-header .ant-calendar-next-month-btn:after { + content: '\203A'; +} +.ant-calendar-body { + padding: 8px 12px; +} +.ant-calendar table { + border-collapse: collapse; + max-width: 100%; + background-color: transparent; + width: 100%; +} +.ant-calendar table, +.ant-calendar th, +.ant-calendar td { + border: 0; + text-align: center; +} +.ant-calendar-calendar-table { + border-spacing: 0; + margin-bottom: 0; +} +.ant-calendar-column-header { + line-height: 18px; + width: 33px; + padding: 6px 0; + text-align: center; +} +.ant-calendar-column-header .ant-calendar-column-header-inner { + display: block; + font-weight: normal; +} +.ant-calendar-week-number-header .ant-calendar-column-header-inner { + display: none; +} +.ant-calendar-cell { + padding: 3px 0; + height: 30px; +} +.ant-calendar-date { + display: block; + margin: 0 auto; + color: rgba(0, 0, 0, 0.65); + border-radius: 2px; + width: 24px; + height: 24px; + line-height: 22px; + border: 1px solid transparent; + padding: 0; + background: transparent; + text-align: center; + -webkit-transition: background 0.3s ease; + transition: background 0.3s ease; +} +.ant-calendar-date-panel { + position: relative; +} +.ant-calendar-date:hover { + background: #e6f7ff; + cursor: pointer; +} +.ant-calendar-date:active { + color: #fff; + background: #40a9ff; +} +.ant-calendar-today .ant-calendar-date { + border-color: #1890ff; + font-weight: bold; + color: #1890ff; +} +.ant-calendar-last-month-cell .ant-calendar-date, +.ant-calendar-next-month-btn-day .ant-calendar-date { + color: rgba(0, 0, 0, 0.25); +} +.ant-calendar-selected-day .ant-calendar-date { + background: #d1e9ff; +} +.ant-calendar-selected-date .ant-calendar-date, +.ant-calendar-selected-start-date .ant-calendar-date, +.ant-calendar-selected-end-date .ant-calendar-date { + background: #1890ff; + color: #fff; + border: 1px solid transparent; +} +.ant-calendar-selected-date .ant-calendar-date:hover, +.ant-calendar-selected-start-date .ant-calendar-date:hover, +.ant-calendar-selected-end-date .ant-calendar-date:hover { + background: #1890ff; +} +.ant-calendar-disabled-cell .ant-calendar-date { + cursor: not-allowed; + color: #bcbcbc; + background: #f5f5f5; + border-radius: 0; + width: auto; + border: 1px solid transparent; +} +.ant-calendar-disabled-cell .ant-calendar-date:hover { + background: #f5f5f5; +} +.ant-calendar-disabled-cell.ant-calendar-today .ant-calendar-date { + position: relative; + margin-right: 5px; + padding-left: 5px; +} +.ant-calendar-disabled-cell.ant-calendar-today .ant-calendar-date:before { + content: " "; + position: absolute; + top: -1px; + left: 5px; + width: 24px; + height: 24px; + border: 1px solid #bcbcbc; + border-radius: 2px; +} +.ant-calendar-disabled-cell-first-of-row .ant-calendar-date { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.ant-calendar-disabled-cell-last-of-row .ant-calendar-date { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.ant-calendar-footer { + border-top: 1px solid #e8e8e8; + line-height: 38px; + padding: 0 12px; +} +.ant-calendar-footer:empty { + border-top: 0; +} +.ant-calendar-footer-btn { + text-align: center; + display: block; +} +.ant-calendar-footer-extra { + text-align: left; +} +.ant-calendar .ant-calendar-today-btn, +.ant-calendar .ant-calendar-clear-btn { + display: inline-block; + text-align: center; + margin: 0 0 0 8px; +} +.ant-calendar .ant-calendar-today-btn-disabled, +.ant-calendar .ant-calendar-clear-btn-disabled { + color: rgba(0, 0, 0, 0.25); + cursor: not-allowed; +} +.ant-calendar .ant-calendar-today-btn:only-child, +.ant-calendar .ant-calendar-clear-btn:only-child { + margin: 0; +} +.ant-calendar .ant-calendar-clear-btn { + display: none; + position: absolute; + right: 5px; + text-indent: -76px; + overflow: hidden; + width: 20px; + height: 20px; + text-align: center; + line-height: 20px; + top: 7px; + margin: 0; +} +.ant-calendar .ant-calendar-clear-btn:after { + font-size: 14px; + color: rgba(0, 0, 0, 0.25); + display: inline-block; + line-height: 1; + width: 20px; + text-indent: 43px; + -webkit-transition: color 0.3s ease; + transition: color 0.3s ease; +} +.ant-calendar .ant-calendar-clear-btn:hover:after { + color: rgba(0, 0, 0, 0.45); +} +.ant-calendar .ant-calendar-ok-btn { + display: inline-block; + font-weight: 400; + text-align: center; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 0 15px; + height: 32px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + position: relative; + -webkit-box-shadow: 0 2px 0 rgba(0, 0, 0, 0.015); + box-shadow: 0 2px 0 rgba(0, 0, 0, 0.015); + color: #fff; + background-color: #1890ff; + border-color: #1890ff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12); + -webkit-box-shadow: 0 2px 0 rgba(0, 0, 0, 0.035); + box-shadow: 0 2px 0 rgba(0, 0, 0, 0.035); + padding: 0 7px; + font-size: 14px; + border-radius: 4px; + height: 24px; + line-height: 22px; +} +.ant-calendar .ant-calendar-ok-btn > .anticon { + line-height: 1; +} +.ant-calendar .ant-calendar-ok-btn, +.ant-calendar .ant-calendar-ok-btn:active, +.ant-calendar .ant-calendar-ok-btn:focus { + outline: 0; +} +.ant-calendar .ant-calendar-ok-btn:not([disabled]):hover { + text-decoration: none; +} +.ant-calendar .ant-calendar-ok-btn:not([disabled]):active { + outline: 0; + -webkit-transition: none; + transition: none; + -webkit-box-shadow: none; + box-shadow: none; +} +.ant-calendar .ant-calendar-ok-btn.disabled, +.ant-calendar .ant-calendar-ok-btn[disabled] { + cursor: not-allowed; +} +.ant-calendar .ant-calendar-ok-btn.disabled > *, +.ant-calendar .ant-calendar-ok-btn[disabled] > * { + pointer-events: none; +} +.ant-calendar .ant-calendar-ok-btn-lg { + padding: 0 15px; + font-size: 16px; + border-radius: 4px; + height: 40px; +} +.ant-calendar .ant-calendar-ok-btn-sm { + padding: 0 7px; + font-size: 14px; + border-radius: 4px; + height: 24px; +} +.ant-calendar .ant-calendar-ok-btn > a:only-child { + color: currentColor; +} +.ant-calendar .ant-calendar-ok-btn > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-calendar .ant-calendar-ok-btn:hover, +.ant-calendar .ant-calendar-ok-btn:focus { + color: #fff; + background-color: #40a9ff; + border-color: #40a9ff; +} +.ant-calendar .ant-calendar-ok-btn:hover > a:only-child, +.ant-calendar .ant-calendar-ok-btn:focus > a:only-child { + color: currentColor; +} +.ant-calendar .ant-calendar-ok-btn:hover > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn:focus > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-calendar .ant-calendar-ok-btn:active, +.ant-calendar .ant-calendar-ok-btn.active { + color: #fff; + background-color: #096dd9; + border-color: #096dd9; +} +.ant-calendar .ant-calendar-ok-btn:active > a:only-child, +.ant-calendar .ant-calendar-ok-btn.active > a:only-child { + color: currentColor; +} +.ant-calendar .ant-calendar-ok-btn:active > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn.active > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-calendar .ant-calendar-ok-btn.disabled, +.ant-calendar .ant-calendar-ok-btn[disabled], +.ant-calendar .ant-calendar-ok-btn.disabled:hover, +.ant-calendar .ant-calendar-ok-btn[disabled]:hover, +.ant-calendar .ant-calendar-ok-btn.disabled:focus, +.ant-calendar .ant-calendar-ok-btn[disabled]:focus, +.ant-calendar .ant-calendar-ok-btn.disabled:active, +.ant-calendar .ant-calendar-ok-btn[disabled]:active, +.ant-calendar .ant-calendar-ok-btn.disabled.active, +.ant-calendar .ant-calendar-ok-btn[disabled].active { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; + text-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} +.ant-calendar .ant-calendar-ok-btn.disabled > a:only-child, +.ant-calendar .ant-calendar-ok-btn[disabled] > a:only-child, +.ant-calendar .ant-calendar-ok-btn.disabled:hover > a:only-child, +.ant-calendar .ant-calendar-ok-btn[disabled]:hover > a:only-child, +.ant-calendar .ant-calendar-ok-btn.disabled:focus > a:only-child, +.ant-calendar .ant-calendar-ok-btn[disabled]:focus > a:only-child, +.ant-calendar .ant-calendar-ok-btn.disabled:active > a:only-child, +.ant-calendar .ant-calendar-ok-btn[disabled]:active > a:only-child, +.ant-calendar .ant-calendar-ok-btn.disabled.active > a:only-child, +.ant-calendar .ant-calendar-ok-btn[disabled].active > a:only-child { + color: currentColor; +} +.ant-calendar .ant-calendar-ok-btn.disabled > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn[disabled] > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn.disabled:hover > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn[disabled]:hover > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn.disabled:focus > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn[disabled]:focus > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn.disabled:active > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn[disabled]:active > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn.disabled.active > a:only-child:after, +.ant-calendar .ant-calendar-ok-btn[disabled].active > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-calendar .ant-calendar-ok-btn-disabled { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; + cursor: not-allowed; +} +.ant-calendar .ant-calendar-ok-btn-disabled > a:only-child { + color: currentColor; +} +.ant-calendar .ant-calendar-ok-btn-disabled > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-calendar .ant-calendar-ok-btn-disabled:hover { + color: rgba(0, 0, 0, 0.25); + background-color: #f5f5f5; + border-color: #d9d9d9; +} +.ant-calendar .ant-calendar-ok-btn-disabled:hover > a:only-child { + color: currentColor; +} +.ant-calendar .ant-calendar-ok-btn-disabled:hover > a:only-child:after { + content: ''; + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + background: transparent; +} +.ant-calendar-range-picker-input { + background-color: transparent; + border: 0; + height: 99%; + outline: 0; + width: 44%; + text-align: center; +} +.ant-calendar-range-picker-input::-moz-placeholder { + color: #bfbfbf; + opacity: 1; +} +.ant-calendar-range-picker-input:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-calendar-range-picker-input::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-calendar-range-picker-input[disabled] { + cursor: not-allowed; +} +.ant-calendar-range-picker-separator { + color: rgba(0, 0, 0, 0.45); + width: 10px; + display: inline-block; + height: 100%; + vertical-align: top; +} +.ant-calendar-range { + width: 552px; + overflow: hidden; +} +.ant-calendar-range .ant-calendar-date-panel::after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} +.ant-calendar-range-part { + width: 50%; + position: relative; +} +.ant-calendar-range-left { + float: left; +} +.ant-calendar-range-left .ant-calendar-time-picker-inner { + border-right: 1px solid #e8e8e8; +} +.ant-calendar-range-right { + float: right; +} +.ant-calendar-range-right .ant-calendar-time-picker-inner { + border-left: 1px solid #e8e8e8; +} +.ant-calendar-range-middle { + position: absolute; + left: 50%; + width: 20px; + margin-left: -132px; + text-align: center; + height: 34px; + line-height: 34px; + color: rgba(0, 0, 0, 0.45); +} +.ant-calendar-range-right .ant-calendar-date-input-wrap { + margin-left: -118px; +} +.ant-calendar-range.ant-calendar-time .ant-calendar-range-middle { + margin-left: -12px; +} +.ant-calendar-range.ant-calendar-time .ant-calendar-range-right .ant-calendar-date-input-wrap { + margin-left: 0; +} +.ant-calendar-range .ant-calendar-input-wrap { + position: relative; + height: 34px; +} +.ant-calendar-range .ant-calendar-input, +.ant-calendar-range .ant-calendar-time-picker-input { + position: relative; + display: inline-block; + padding: 4px 11px; + width: 100%; + height: 32px; + font-size: 14px; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + background-image: none; + border: 1px solid #d9d9d9; + border-radius: 4px; + -webkit-transition: all .3s; + transition: all .3s; + height: 24px; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + padding-left: 0; + padding-right: 0; +} +.ant-calendar-range .ant-calendar-input::-moz-placeholder, +.ant-calendar-range .ant-calendar-time-picker-input::-moz-placeholder { + color: #bfbfbf; + opacity: 1; +} +.ant-calendar-range .ant-calendar-input:-ms-input-placeholder, +.ant-calendar-range .ant-calendar-time-picker-input:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-calendar-range .ant-calendar-input::-webkit-input-placeholder, +.ant-calendar-range .ant-calendar-time-picker-input::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-calendar-range .ant-calendar-input:hover, +.ant-calendar-range .ant-calendar-time-picker-input:hover { + border-color: #40a9ff; + border-right-width: 1px !important; +} +.ant-calendar-range .ant-calendar-input:focus, +.ant-calendar-range .ant-calendar-time-picker-input:focus { + border-color: #40a9ff; + outline: 0; + -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-calendar-range .ant-calendar-input-disabled, +.ant-calendar-range .ant-calendar-time-picker-input-disabled { + background-color: #f5f5f5; + opacity: 1; + cursor: not-allowed; + color: rgba(0, 0, 0, 0.25); +} +.ant-calendar-range .ant-calendar-input-disabled:hover, +.ant-calendar-range .ant-calendar-time-picker-input-disabled:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +textarea.ant-calendar-range .ant-calendar-input, +textarea.ant-calendar-range .ant-calendar-time-picker-input { + max-width: 100%; + height: auto; + vertical-align: bottom; + -webkit-transition: all .3s, height 0s; + transition: all .3s, height 0s; + min-height: 32px; +} +.ant-calendar-range .ant-calendar-input-lg, +.ant-calendar-range .ant-calendar-time-picker-input-lg { + padding: 6px 11px; + height: 40px; + font-size: 16px; +} +.ant-calendar-range .ant-calendar-input-sm, +.ant-calendar-range .ant-calendar-time-picker-input-sm { + padding: 1px 7px; + height: 24px; +} +.ant-calendar-range .ant-calendar-input:focus, +.ant-calendar-range .ant-calendar-time-picker-input:focus { + -webkit-box-shadow: none; + box-shadow: none; +} +.ant-calendar-range .ant-calendar-time-picker-icon { + display: none; +} +.ant-calendar-range.ant-calendar-week-number { + width: 574px; +} +.ant-calendar-range.ant-calendar-week-number .ant-calendar-range-part { + width: 286px; +} +.ant-calendar-range .ant-calendar-year-panel, +.ant-calendar-range .ant-calendar-month-panel, +.ant-calendar-range .ant-calendar-decade-panel { + top: 34px; +} +.ant-calendar-range .ant-calendar-month-panel .ant-calendar-year-panel { + top: 0; +} +.ant-calendar-range .ant-calendar-decade-panel-table, +.ant-calendar-range .ant-calendar-year-panel-table, +.ant-calendar-range .ant-calendar-month-panel-table { + height: 208px; +} +.ant-calendar-range .ant-calendar-in-range-cell { + border-radius: 0; + position: relative; +} +.ant-calendar-range .ant-calendar-in-range-cell > div { + position: relative; + z-index: 1; +} +.ant-calendar-range .ant-calendar-in-range-cell:before { + content: ''; + display: block; + background: #e6f7ff; + border-radius: 0; + border: 0; + position: absolute; + top: 4px; + bottom: 4px; + left: 0; + right: 0; +} +.ant-calendar-range .ant-calendar-footer-extra { + float: left; +} +div.ant-calendar-range-quick-selector { + text-align: left; +} +div.ant-calendar-range-quick-selector > a { + margin-right: 8px; +} +.ant-calendar-range .ant-calendar-header, +.ant-calendar-range .ant-calendar-month-panel-header, +.ant-calendar-range .ant-calendar-year-panel-header { + border-bottom: 0; +} +.ant-calendar-range .ant-calendar-body, +.ant-calendar-range .ant-calendar-month-panel-body, +.ant-calendar-range .ant-calendar-year-panel-body { + border-top: 1px solid #e8e8e8; +} +.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker { + height: 207px; + width: 100%; + top: 68px; + z-index: 2; +} +.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-panel { + height: 267px; + margin-top: -34px; +} +.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-inner { + padding-top: 40px; + height: 100%; + background: none; +} +.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-combobox { + display: inline-block; + height: 100%; + background-color: #fff; + border-top: 1px solid #e8e8e8; +} +.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-select { + height: 100%; +} +.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-select ul { + max-height: 100%; +} +.ant-calendar-range.ant-calendar-time .ant-calendar-footer .ant-calendar-time-picker-btn { + margin-right: 8px; +} +.ant-calendar-range.ant-calendar-time .ant-calendar-today-btn { + margin: 8px 12px; + height: 22px; + line-height: 22px; +} +.ant-calendar-range-with-ranges.ant-calendar-time .ant-calendar-time-picker { + height: 233px; +} +.ant-calendar-range.ant-calendar-show-time-picker .ant-calendar-body { + border-top-color: transparent; +} +.ant-calendar-time-picker { + position: absolute; + width: 100%; + top: 40px; + background-color: #fff; +} +.ant-calendar-time-picker-panel { + z-index: 1050; + position: absolute; + width: 100%; +} +.ant-calendar-time-picker-inner { + display: inline-block; + position: relative; + outline: none; + list-style: none; + font-size: 14px; + text-align: left; + background-color: #fff; + background-clip: padding-box; + line-height: 1.5; + overflow: hidden; + width: 100%; +} +.ant-calendar-time-picker-combobox { + width: 100%; +} +.ant-calendar-time-picker-column-1, +.ant-calendar-time-picker-column-1 .ant-calendar-time-picker-select { + width: 100%; +} +.ant-calendar-time-picker-column-2 .ant-calendar-time-picker-select { + width: 50%; +} +.ant-calendar-time-picker-column-3 .ant-calendar-time-picker-select { + width: 33.33%; +} +.ant-calendar-time-picker-column-4 .ant-calendar-time-picker-select { + width: 25%; +} +.ant-calendar-time-picker-input-wrap { + display: none; +} +.ant-calendar-time-picker-select { + float: left; + font-size: 14px; + border-right: 1px solid #e8e8e8; + -webkit-box-sizing: border-box; + box-sizing: border-box; + overflow: hidden; + position: relative; + height: 226px; +} +.ant-calendar-time-picker-select:hover { + overflow-y: auto; +} +.ant-calendar-time-picker-select:first-child { + border-left: 0; + margin-left: 0; +} +.ant-calendar-time-picker-select:last-child { + border-right: 0; +} +.ant-calendar-time-picker-select ul { + list-style: none; + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + width: 100%; + max-height: 206px; +} +.ant-calendar-time-picker-select li { + padding-left: 32px; + list-style: none; + -webkit-box-sizing: content-box; + box-sizing: content-box; + margin: 0; + width: 100%; + height: 24px; + line-height: 24px; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-transition: background 0.3s ease; + transition: background 0.3s ease; +} +.ant-calendar-time-picker-select li:last-child:after { + content: ''; + height: 202px; + display: block; +} +.ant-calendar-time-picker-select li:hover { + background: #e6f7ff; +} +li.ant-calendar-time-picker-select-option-selected { + background: #f5f5f5; + font-weight: bold; +} +li.ant-calendar-time-picker-select-option-disabled { + color: rgba(0, 0, 0, 0.25); +} +li.ant-calendar-time-picker-select-option-disabled:hover { + background: transparent; + cursor: not-allowed; +} +.ant-calendar-time .ant-calendar-day-select { + padding: 0 2px; + font-weight: 500; + display: inline-block; + color: rgba(0, 0, 0, 0.85); + line-height: 34px; +} +.ant-calendar-time .ant-calendar-footer { + position: relative; + height: auto; +} +.ant-calendar-time .ant-calendar-footer-btn { + text-align: right; +} +.ant-calendar-time .ant-calendar-footer .ant-calendar-today-btn { + float: left; + margin: 0; +} +.ant-calendar-time .ant-calendar-footer .ant-calendar-time-picker-btn { + display: inline-block; + margin-right: 8px; +} +.ant-calendar-time .ant-calendar-footer .ant-calendar-time-picker-btn-disabled { + color: rgba(0, 0, 0, 0.25); +} +.ant-calendar-month-panel { + position: absolute; + top: 1px; + right: 0; + bottom: 0; + left: 0; + z-index: 10; + border-radius: 4px; + background: #fff; + outline: none; +} +.ant-calendar-month-panel > div { + height: 100%; +} +.ant-calendar-month-panel-hidden { + display: none; +} +.ant-calendar-month-panel-header { + height: 40px; + line-height: 40px; + text-align: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + border-bottom: 1px solid #e8e8e8; +} +.ant-calendar-month-panel-header a:hover { + color: #40a9ff; +} +.ant-calendar-month-panel-header .ant-calendar-month-panel-century-select, +.ant-calendar-month-panel-header .ant-calendar-month-panel-decade-select, +.ant-calendar-month-panel-header .ant-calendar-month-panel-year-select, +.ant-calendar-month-panel-header .ant-calendar-month-panel-month-select { + padding: 0 2px; + font-weight: 500; + display: inline-block; + color: rgba(0, 0, 0, 0.85); + line-height: 40px; +} +.ant-calendar-month-panel-header .ant-calendar-month-panel-century-select-arrow, +.ant-calendar-month-panel-header .ant-calendar-month-panel-decade-select-arrow, +.ant-calendar-month-panel-header .ant-calendar-month-panel-year-select-arrow, +.ant-calendar-month-panel-header .ant-calendar-month-panel-month-select-arrow { + display: none; +} +.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-century-btn, +.ant-calendar-month-panel-header .ant-calendar-month-panel-next-century-btn, +.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-decade-btn, +.ant-calendar-month-panel-header .ant-calendar-month-panel-next-decade-btn, +.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-month-btn, +.ant-calendar-month-panel-header .ant-calendar-month-panel-next-month-btn, +.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-year-btn, +.ant-calendar-month-panel-header .ant-calendar-month-panel-next-year-btn { + position: absolute; + top: 0; + color: rgba(0, 0, 0, 0.45); + font-family: Arial, "Hiragino Sans GB", "Microsoft Yahei", "Microsoft Sans Serif", sans-serif; + padding: 0 5px; + font-size: 16px; + display: inline-block; + line-height: 40px; +} +.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-century-btn, +.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-decade-btn, +.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-year-btn { + left: 7px; +} +.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-century-btn:after, +.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-decade-btn:after, +.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-year-btn:after { + content: '\AB'; +} +.ant-calendar-month-panel-header .ant-calendar-month-panel-next-century-btn, +.ant-calendar-month-panel-header .ant-calendar-month-panel-next-decade-btn, +.ant-calendar-month-panel-header .ant-calendar-month-panel-next-year-btn { + right: 7px; +} +.ant-calendar-month-panel-header .ant-calendar-month-panel-next-century-btn:after, +.ant-calendar-month-panel-header .ant-calendar-month-panel-next-decade-btn:after, +.ant-calendar-month-panel-header .ant-calendar-month-panel-next-year-btn:after { + content: '\BB'; +} +.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-month-btn { + left: 29px; +} +.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-month-btn:after { + content: '\2039'; +} +.ant-calendar-month-panel-header .ant-calendar-month-panel-next-month-btn { + right: 29px; +} +.ant-calendar-month-panel-header .ant-calendar-month-panel-next-month-btn:after { + content: '\203A'; +} +.ant-calendar-month-panel-body { + height: calc(100% - 40px); +} +.ant-calendar-month-panel-table { + table-layout: fixed; + width: 100%; + height: 100%; + border-collapse: separate; +} +.ant-calendar-month-panel-selected-cell .ant-calendar-month-panel-month { + background: #1890ff; + color: #fff; +} +.ant-calendar-month-panel-selected-cell .ant-calendar-month-panel-month:hover { + background: #1890ff; + color: #fff; +} +.ant-calendar-month-panel-cell { + text-align: center; +} +.ant-calendar-month-panel-cell-disabled .ant-calendar-month-panel-month, +.ant-calendar-month-panel-cell-disabled .ant-calendar-month-panel-month:hover { + cursor: not-allowed; + color: #bcbcbc; + background: #f5f5f5; +} +.ant-calendar-month-panel-month { + display: inline-block; + margin: 0 auto; + color: rgba(0, 0, 0, 0.65); + background: transparent; + text-align: center; + height: 24px; + line-height: 24px; + padding: 0 8px; + border-radius: 2px; + -webkit-transition: background 0.3s ease; + transition: background 0.3s ease; +} +.ant-calendar-month-panel-month:hover { + background: #e6f7ff; + cursor: pointer; +} +.ant-calendar-year-panel { + position: absolute; + top: 1px; + right: 0; + bottom: 0; + left: 0; + z-index: 10; + border-radius: 4px; + background: #fff; + outline: none; +} +.ant-calendar-year-panel > div { + height: 100%; +} +.ant-calendar-year-panel-hidden { + display: none; +} +.ant-calendar-year-panel-header { + height: 40px; + line-height: 40px; + text-align: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + border-bottom: 1px solid #e8e8e8; +} +.ant-calendar-year-panel-header a:hover { + color: #40a9ff; +} +.ant-calendar-year-panel-header .ant-calendar-year-panel-century-select, +.ant-calendar-year-panel-header .ant-calendar-year-panel-decade-select, +.ant-calendar-year-panel-header .ant-calendar-year-panel-year-select, +.ant-calendar-year-panel-header .ant-calendar-year-panel-month-select { + padding: 0 2px; + font-weight: 500; + display: inline-block; + color: rgba(0, 0, 0, 0.85); + line-height: 40px; +} +.ant-calendar-year-panel-header .ant-calendar-year-panel-century-select-arrow, +.ant-calendar-year-panel-header .ant-calendar-year-panel-decade-select-arrow, +.ant-calendar-year-panel-header .ant-calendar-year-panel-year-select-arrow, +.ant-calendar-year-panel-header .ant-calendar-year-panel-month-select-arrow { + display: none; +} +.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-century-btn, +.ant-calendar-year-panel-header .ant-calendar-year-panel-next-century-btn, +.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-decade-btn, +.ant-calendar-year-panel-header .ant-calendar-year-panel-next-decade-btn, +.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-month-btn, +.ant-calendar-year-panel-header .ant-calendar-year-panel-next-month-btn, +.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-year-btn, +.ant-calendar-year-panel-header .ant-calendar-year-panel-next-year-btn { + position: absolute; + top: 0; + color: rgba(0, 0, 0, 0.45); + font-family: Arial, "Hiragino Sans GB", "Microsoft Yahei", "Microsoft Sans Serif", sans-serif; + padding: 0 5px; + font-size: 16px; + display: inline-block; + line-height: 40px; +} +.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-century-btn, +.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-decade-btn, +.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-year-btn { + left: 7px; +} +.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-century-btn:after, +.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-decade-btn:after, +.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-year-btn:after { + content: '\AB'; +} +.ant-calendar-year-panel-header .ant-calendar-year-panel-next-century-btn, +.ant-calendar-year-panel-header .ant-calendar-year-panel-next-decade-btn, +.ant-calendar-year-panel-header .ant-calendar-year-panel-next-year-btn { + right: 7px; +} +.ant-calendar-year-panel-header .ant-calendar-year-panel-next-century-btn:after, +.ant-calendar-year-panel-header .ant-calendar-year-panel-next-decade-btn:after, +.ant-calendar-year-panel-header .ant-calendar-year-panel-next-year-btn:after { + content: '\BB'; +} +.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-month-btn { + left: 29px; +} +.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-month-btn:after { + content: '\2039'; +} +.ant-calendar-year-panel-header .ant-calendar-year-panel-next-month-btn { + right: 29px; +} +.ant-calendar-year-panel-header .ant-calendar-year-panel-next-month-btn:after { + content: '\203A'; +} +.ant-calendar-year-panel-body { + height: calc(100% - 40px); +} +.ant-calendar-year-panel-table { + table-layout: fixed; + width: 100%; + height: 100%; + border-collapse: separate; +} +.ant-calendar-year-panel-cell { + text-align: center; +} +.ant-calendar-year-panel-year { + display: inline-block; + margin: 0 auto; + color: rgba(0, 0, 0, 0.65); + background: transparent; + text-align: center; + height: 24px; + line-height: 24px; + padding: 0 8px; + border-radius: 2px; + -webkit-transition: background 0.3s ease; + transition: background 0.3s ease; +} +.ant-calendar-year-panel-year:hover { + background: #e6f7ff; + cursor: pointer; +} +.ant-calendar-year-panel-selected-cell .ant-calendar-year-panel-year { + background: #1890ff; + color: #fff; +} +.ant-calendar-year-panel-selected-cell .ant-calendar-year-panel-year:hover { + background: #1890ff; + color: #fff; +} +.ant-calendar-year-panel-last-decade-cell .ant-calendar-year-panel-year, +.ant-calendar-year-panel-next-decade-cell .ant-calendar-year-panel-year { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + color: rgba(0, 0, 0, 0.25); +} +.ant-calendar-decade-panel { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 10; + background: #fff; + border-radius: 4px; + outline: none; +} +.ant-calendar-decade-panel-hidden { + display: none; +} +.ant-calendar-decade-panel-header { + height: 40px; + line-height: 40px; + text-align: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + border-bottom: 1px solid #e8e8e8; +} +.ant-calendar-decade-panel-header a:hover { + color: #40a9ff; +} +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-century-select, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-decade-select, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-year-select, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-month-select { + padding: 0 2px; + font-weight: 500; + display: inline-block; + color: rgba(0, 0, 0, 0.85); + line-height: 40px; +} +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-century-select-arrow, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-decade-select-arrow, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-year-select-arrow, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-month-select-arrow { + display: none; +} +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-century-btn, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-century-btn, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-decade-btn, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-decade-btn, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-month-btn, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-month-btn, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-year-btn, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-year-btn { + position: absolute; + top: 0; + color: rgba(0, 0, 0, 0.45); + font-family: Arial, "Hiragino Sans GB", "Microsoft Yahei", "Microsoft Sans Serif", sans-serif; + padding: 0 5px; + font-size: 16px; + display: inline-block; + line-height: 40px; +} +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-century-btn, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-decade-btn, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-year-btn { + left: 7px; +} +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-century-btn:after, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-decade-btn:after, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-year-btn:after { + content: '\AB'; +} +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-century-btn, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-decade-btn, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-year-btn { + right: 7px; +} +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-century-btn:after, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-decade-btn:after, +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-year-btn:after { + content: '\BB'; +} +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-month-btn { + left: 29px; +} +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-month-btn:after { + content: '\2039'; +} +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-month-btn { + right: 29px; +} +.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-month-btn:after { + content: '\203A'; +} +.ant-calendar-decade-panel-body { + height: calc(100% - 40px); +} +.ant-calendar-decade-panel-table { + table-layout: fixed; + width: 100%; + height: 100%; + border-collapse: separate; +} +.ant-calendar-decade-panel-cell { + text-align: center; + white-space: nowrap; +} +.ant-calendar-decade-panel-decade { + display: inline-block; + margin: 0 auto; + color: rgba(0, 0, 0, 0.65); + background: transparent; + text-align: center; + height: 24px; + line-height: 24px; + padding: 0 6px; + border-radius: 2px; + -webkit-transition: background 0.3s ease; + transition: background 0.3s ease; +} +.ant-calendar-decade-panel-decade:hover { + background: #e6f7ff; + cursor: pointer; +} +.ant-calendar-decade-panel-selected-cell .ant-calendar-decade-panel-decade { + background: #1890ff; + color: #fff; +} +.ant-calendar-decade-panel-selected-cell .ant-calendar-decade-panel-decade:hover { + background: #1890ff; + color: #fff; +} +.ant-calendar-decade-panel-last-century-cell .ant-calendar-decade-panel-decade, +.ant-calendar-decade-panel-next-century-cell .ant-calendar-decade-panel-decade { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + color: rgba(0, 0, 0, 0.25); +} +.ant-calendar-month .ant-calendar-month-header-wrap { + position: relative; + height: 288px; +} +.ant-calendar-month .ant-calendar-month-panel, +.ant-calendar-month .ant-calendar-year-panel { + top: 0; + height: 100%; +} +.ant-calendar-week-number-cell { + opacity: 0.5; +} +.ant-calendar-week-number .ant-calendar-body tr { + -webkit-transition: all .3s; + transition: all .3s; + cursor: pointer; +} +.ant-calendar-week-number .ant-calendar-body tr:hover { + background: #e6f7ff; +} +.ant-calendar-week-number .ant-calendar-body tr.ant-calendar-active-week { + background: #bae7ff; + font-weight: bold; +} +.ant-calendar-week-number .ant-calendar-body tr .ant-calendar-selected-day .ant-calendar-date, +.ant-calendar-week-number .ant-calendar-body tr .ant-calendar-selected-day:hover .ant-calendar-date { + background: transparent; + color: rgba(0, 0, 0, 0.65); +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-time-picker-panel { + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + z-index: 1050; + position: absolute; +} +.ant-time-picker-panel-inner { + position: relative; + outline: none; + list-style: none; + font-size: 14px; + text-align: left; + background-color: #fff; + border-radius: 4px; + -webkit-box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + background-clip: padding-box; + overflow: hidden; + left: -2px; +} +.ant-time-picker-panel-input { + margin: 0; + padding: 0; + border: 0; + max-width: 154px; + cursor: auto; + outline: 0; +} +.ant-time-picker-panel-input::-moz-placeholder { + color: #bfbfbf; + opacity: 1; +} +.ant-time-picker-panel-input:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-time-picker-panel-input::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-time-picker-panel-input-wrap { + -webkit-box-sizing: border-box; + box-sizing: border-box; + position: relative; + padding: 7px 2px 7px 12px; + border-bottom: 1px solid #e8e8e8; +} +.ant-time-picker-panel-input-invalid { + border-color: red; +} +.ant-time-picker-panel-clear-btn { + position: absolute; + right: 8px; + cursor: pointer; + overflow: hidden; + width: 20px; + height: 20px; + text-align: center; + line-height: 20px; + top: 7px; + margin: 0; +} +.ant-time-picker-panel-clear-btn-icon svg { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; + font-size: 14px; + color: rgba(0, 0, 0, 0.25); + display: inline-block; + -webkit-transition: color 0.3s ease; + transition: color 0.3s ease; +} +.ant-time-picker-panel-clear-btn-icon svg:hover { + color: rgba(0, 0, 0, 0.45); +} +.ant-time-picker-panel-narrow .ant-time-picker-panel-input-wrap { + max-width: 112px; +} +.ant-time-picker-panel-select { + float: left; + font-size: 14px; + border-left: 1px solid #e8e8e8; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 56px; + overflow: hidden; + position: relative; + max-height: 192px; +} +.ant-time-picker-panel-select:hover { + overflow-y: auto; +} +.ant-time-picker-panel-select:first-child { + border-left: 0; + margin-left: 0; +} +.ant-time-picker-panel-select:last-child { + border-right: 0; +} +.ant-time-picker-panel-select:only-child { + width: 100%; +} +.ant-time-picker-panel-select ul { + list-style: none; + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0 0 160px; + width: 100%; +} +.ant-time-picker-panel-select li { + list-style: none; + -webkit-box-sizing: content-box; + box-sizing: content-box; + margin: 0; + padding: 0 0 0 12px; + width: 100%; + height: 32px; + line-height: 32px; + text-align: left; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-transition: background 0.3s; + transition: background 0.3s; +} +.ant-time-picker-panel-select li:hover { + background: #e6f7ff; +} +li.ant-time-picker-panel-select-option-selected { + background: #f5f5f5; + font-weight: bold; +} +li.ant-time-picker-panel-select-option-selected:hover { + background: #f5f5f5; +} +li.ant-time-picker-panel-select-option-disabled { + color: rgba(0, 0, 0, 0.25); +} +li.ant-time-picker-panel-select-option-disabled:hover { + background: transparent; + cursor: not-allowed; +} +.ant-time-picker-panel-combobox { + zoom: 1; +} +.ant-time-picker-panel-combobox:before, +.ant-time-picker-panel-combobox:after { + content: ""; + display: table; +} +.ant-time-picker-panel-combobox:after { + clear: both; +} +.ant-time-picker-panel-addon { + padding: 8px; + border-top: 1px solid #e8e8e8; +} +.ant-time-picker-panel.slide-up-enter.slide-up-enter-active.ant-time-picker-panel-placement-topLeft, +.ant-time-picker-panel.slide-up-enter.slide-up-enter-active.ant-time-picker-panel-placement-topRight, +.ant-time-picker-panel.slide-up-appear.slide-up-appear-active.ant-time-picker-panel-placement-topLeft, +.ant-time-picker-panel.slide-up-appear.slide-up-appear-active.ant-time-picker-panel-placement-topRight { + -webkit-animation-name: antSlideDownIn; + animation-name: antSlideDownIn; +} +.ant-time-picker-panel.slide-up-enter.slide-up-enter-active.ant-time-picker-panel-placement-bottomLeft, +.ant-time-picker-panel.slide-up-enter.slide-up-enter-active.ant-time-picker-panel-placement-bottomRight, +.ant-time-picker-panel.slide-up-appear.slide-up-appear-active.ant-time-picker-panel-placement-bottomLeft, +.ant-time-picker-panel.slide-up-appear.slide-up-appear-active.ant-time-picker-panel-placement-bottomRight { + -webkit-animation-name: antSlideUpIn; + animation-name: antSlideUpIn; +} +.ant-time-picker-panel.slide-up-leave.slide-up-leave-active.ant-time-picker-panel-placement-topLeft, +.ant-time-picker-panel.slide-up-leave.slide-up-leave-active.ant-time-picker-panel-placement-topRight { + -webkit-animation-name: antSlideDownOut; + animation-name: antSlideDownOut; +} +.ant-time-picker-panel.slide-up-leave.slide-up-leave-active.ant-time-picker-panel-placement-bottomLeft, +.ant-time-picker-panel.slide-up-leave.slide-up-leave-active.ant-time-picker-panel-placement-bottomRight { + -webkit-animation-name: antSlideUpOut; + animation-name: antSlideUpOut; +} +.ant-time-picker { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + position: relative; + display: inline-block; + outline: none; + -webkit-transition: opacity .3s; + transition: opacity .3s; + width: 128px; +} +.ant-time-picker-input { + position: relative; + display: inline-block; + padding: 4px 11px; + width: 100%; + height: 32px; + font-size: 14px; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + background-image: none; + border: 1px solid #d9d9d9; + border-radius: 4px; + -webkit-transition: all .3s; + transition: all .3s; +} +.ant-time-picker-input::-moz-placeholder { + color: #bfbfbf; + opacity: 1; +} +.ant-time-picker-input:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-time-picker-input::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-time-picker-input:hover { + border-color: #40a9ff; + border-right-width: 1px !important; +} +.ant-time-picker-input:focus { + border-color: #40a9ff; + outline: 0; + -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-time-picker-input-disabled { + background-color: #f5f5f5; + opacity: 1; + cursor: not-allowed; + color: rgba(0, 0, 0, 0.25); +} +.ant-time-picker-input-disabled:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +textarea.ant-time-picker-input { + max-width: 100%; + height: auto; + vertical-align: bottom; + -webkit-transition: all .3s, height 0s; + transition: all .3s, height 0s; + min-height: 32px; +} +.ant-time-picker-input-lg { + padding: 6px 11px; + height: 40px; + font-size: 16px; +} +.ant-time-picker-input-sm { + padding: 1px 7px; + height: 24px; +} +.ant-time-picker-input[disabled] { + background-color: #f5f5f5; + opacity: 1; + cursor: not-allowed; + color: rgba(0, 0, 0, 0.25); +} +.ant-time-picker-input[disabled]:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +.ant-time-picker-open { + opacity: 0; +} +.ant-time-picker-icon { + position: absolute; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: all 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + width: 14px; + height: 14px; + line-height: 14px; + right: 11px; + color: rgba(0, 0, 0, 0.25); + top: 50%; + margin-top: -7px; +} +.ant-time-picker-icon .ant-time-picker-clock-icon { + color: rgba(0, 0, 0, 0.25); + display: block; + line-height: 1; +} +.ant-time-picker-large .ant-time-picker-input { + padding: 6px 11px; + height: 40px; + font-size: 16px; +} +.ant-time-picker-small .ant-time-picker-input { + padding: 1px 7px; + height: 24px; +} +.ant-time-picker-small .ant-time-picker-icon { + right: 7px; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-tag { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + display: inline-block; + line-height: 20px; + height: 22px; + padding: 0 7px; + border-radius: 4px; + border: 1px solid #d9d9d9; + background: #fafafa; + font-size: 12px; + -webkit-transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1); + transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1); + opacity: 1; + margin-right: 8px; + cursor: pointer; + white-space: nowrap; +} +.ant-tag:hover { + opacity: 0.85; +} +.ant-tag, +.ant-tag a, +.ant-tag a:hover { + color: rgba(0, 0, 0, 0.65); +} +.ant-tag > a:first-child:last-child { + display: inline-block; + margin: 0 -8px; + padding: 0 8px; +} +.ant-tag .anticon-close { + display: inline-block; + font-size: 12px; + font-size: 10px \9; + -webkit-transform: scale(0.83333333) rotate(0deg); + -ms-transform: scale(0.83333333) rotate(0deg); + transform: scale(0.83333333) rotate(0deg); + cursor: pointer; + margin-left: 3px; + -webkit-transition: all .3s; + transition: all .3s; + color: rgba(0, 0, 0, 0.45); + font-weight: bold; +} +:root .ant-tag .anticon-close { + font-size: 12px; +} +.ant-tag .anticon-close:hover { + color: rgba(0, 0, 0, 0.85); +} +.ant-tag-has-color { + border-color: transparent; +} +.ant-tag-has-color, +.ant-tag-has-color a, +.ant-tag-has-color a:hover, +.ant-tag-has-color .anticon-close, +.ant-tag-has-color .anticon-close:hover { + color: #fff; +} +.ant-tag-checkable { + background-color: transparent; + border-color: transparent; +} +.ant-tag-checkable:not(.ant-tag-checkable-checked):hover { + color: #1890ff; +} +.ant-tag-checkable:active, +.ant-tag-checkable-checked { + color: #fff; +} +.ant-tag-checkable-checked { + background-color: #1890ff; +} +.ant-tag-checkable:active { + background-color: #096dd9; +} +.ant-tag-close { + width: 0 !important; + padding: 0; + margin: 0; +} +.ant-tag-zoom-enter, +.ant-tag-zoom-appear { + -webkit-animation: antFadeIn 0.2s cubic-bezier(0.78, 0.14, 0.15, 0.86); + animation: antFadeIn 0.2s cubic-bezier(0.78, 0.14, 0.15, 0.86); + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} +.ant-tag-zoom-leave { + -webkit-animation: antZoomOut 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); + animation: antZoomOut 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} +.ant-tag-pink { + color: #eb2f96; + background: #fff0f6; + border-color: #ffadd2; +} +.ant-tag-pink-inverse { + background: #eb2f96; + border-color: #eb2f96; + color: #fff; +} +.ant-tag-magenta { + color: #eb2f96; + background: #fff0f6; + border-color: #ffadd2; +} +.ant-tag-magenta-inverse { + background: #eb2f96; + border-color: #eb2f96; + color: #fff; +} +.ant-tag-red { + color: #f5222d; + background: #fff1f0; + border-color: #ffa39e; +} +.ant-tag-red-inverse { + background: #f5222d; + border-color: #f5222d; + color: #fff; +} +.ant-tag-volcano { + color: #fa541c; + background: #fff2e8; + border-color: #ffbb96; +} +.ant-tag-volcano-inverse { + background: #fa541c; + border-color: #fa541c; + color: #fff; +} +.ant-tag-orange { + color: #fa8c16; + background: #fff7e6; + border-color: #ffd591; +} +.ant-tag-orange-inverse { + background: #fa8c16; + border-color: #fa8c16; + color: #fff; +} +.ant-tag-yellow { + color: #fadb14; + background: #feffe6; + border-color: #fffb8f; +} +.ant-tag-yellow-inverse { + background: #fadb14; + border-color: #fadb14; + color: #fff; +} +.ant-tag-gold { + color: #faad14; + background: #fffbe6; + border-color: #ffe58f; +} +.ant-tag-gold-inverse { + background: #faad14; + border-color: #faad14; + color: #fff; +} +.ant-tag-cyan { + color: #13c2c2; + background: #e6fffb; + border-color: #87e8de; +} +.ant-tag-cyan-inverse { + background: #13c2c2; + border-color: #13c2c2; + color: #fff; +} +.ant-tag-lime { + color: #a0d911; + background: #fcffe6; + border-color: #eaff8f; +} +.ant-tag-lime-inverse { + background: #a0d911; + border-color: #a0d911; + color: #fff; +} +.ant-tag-green { + color: #52c41a; + background: #f6ffed; + border-color: #b7eb8f; +} +.ant-tag-green-inverse { + background: #52c41a; + border-color: #52c41a; + color: #fff; +} +.ant-tag-blue { + color: #1890ff; + background: #e6f7ff; + border-color: #91d5ff; +} +.ant-tag-blue-inverse { + background: #1890ff; + border-color: #1890ff; + color: #fff; +} +.ant-tag-geekblue { + color: #2f54eb; + background: #f0f5ff; + border-color: #adc6ff; +} +.ant-tag-geekblue-inverse { + background: #2f54eb; + border-color: #2f54eb; + color: #fff; +} +.ant-tag-purple { + color: #722ed1; + background: #f9f0ff; + border-color: #d3adf7; +} +.ant-tag-purple-inverse { + background: #722ed1; + border-color: #722ed1; + color: #fff; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-divider { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + background: #e8e8e8; +} +.ant-divider, +.ant-divider-vertical { + margin: 0 8px; + display: inline-block; + height: 0.9em; + width: 1px; + vertical-align: middle; + position: relative; + top: -0.06em; +} +.ant-divider-horizontal { + display: block; + height: 1px; + width: 100%; + margin: 24px 0; + clear: both; +} +.ant-divider-horizontal.ant-divider-with-text, +.ant-divider-horizontal.ant-divider-with-text-left, +.ant-divider-horizontal.ant-divider-with-text-right { + display: table; + white-space: nowrap; + text-align: center; + background: transparent; + font-weight: 500; + color: rgba(0, 0, 0, 0.85); + font-size: 16px; + margin: 16px 0; +} +.ant-divider-horizontal.ant-divider-with-text:before, +.ant-divider-horizontal.ant-divider-with-text-left:before, +.ant-divider-horizontal.ant-divider-with-text-right:before, +.ant-divider-horizontal.ant-divider-with-text:after, +.ant-divider-horizontal.ant-divider-with-text-left:after, +.ant-divider-horizontal.ant-divider-with-text-right:after { + content: ''; + display: table-cell; + position: relative; + top: 50%; + width: 50%; + border-top: 1px solid #e8e8e8; + -webkit-transform: translateY(50%); + -ms-transform: translateY(50%); + transform: translateY(50%); +} +.ant-divider-horizontal.ant-divider-with-text-left .ant-divider-inner-text, +.ant-divider-horizontal.ant-divider-with-text-right .ant-divider-inner-text { + display: inline-block; + padding: 0 10px; +} +.ant-divider-horizontal.ant-divider-with-text-left:before { + top: 50%; + width: 5%; +} +.ant-divider-horizontal.ant-divider-with-text-left:after { + top: 50%; + width: 95%; +} +.ant-divider-horizontal.ant-divider-with-text-right:before { + top: 50%; + width: 95%; +} +.ant-divider-horizontal.ant-divider-with-text-right:after { + top: 50%; + width: 5%; +} +.ant-divider-inner-text { + display: inline-block; + padding: 0 24px; +} +.ant-divider-dashed { + background: none; + border-top: 1px dashed #e8e8e8; +} +.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed, +.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-dashed, +.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-dashed { + border-top: 0; +} +.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed:before, +.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-dashed:before, +.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-dashed:before, +.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed:after, +.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-dashed:after, +.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-dashed:after { + border-style: dashed none none; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-drawer { + position: fixed; + top: 0; + width: 0%; + height: 100%; + z-index: 1000; +} +.ant-drawer > * { + -webkit-transition: -webkit-transform 0.3s cubic-bezier(0.9, 0, 0.3, 0.7); + transition: -webkit-transform 0.3s cubic-bezier(0.9, 0, 0.3, 0.7); + transition: transform 0.3s cubic-bezier(0.9, 0, 0.3, 0.7); + transition: transform 0.3s cubic-bezier(0.9, 0, 0.3, 0.7), -webkit-transform 0.3s cubic-bezier(0.9, 0, 0.3, 0.7); +} +.ant-drawer-content-wrapper { + position: fixed; +} +.ant-drawer .ant-drawer-content { + width: 100%; + height: 100%; +} +.ant-drawer-left, +.ant-drawer-right { + width: 0%; + height: 100%; +} +.ant-drawer-left .ant-drawer-content-wrapper, +.ant-drawer-right .ant-drawer-content-wrapper { + height: 100%; +} +.ant-drawer-left.ant-drawer-open, +.ant-drawer-right.ant-drawer-open { + width: 100%; +} +.ant-drawer-left.ant-drawer-open .ant-drawer-content-wrapper { + -webkit-box-shadow: 2px 0 8px rgba(0, 0, 0, 0.15); + box-shadow: 2px 0 8px rgba(0, 0, 0, 0.15); +} +.ant-drawer-right .ant-drawer-content-wrapper { + right: 0; +} +.ant-drawer-right.ant-drawer-open .ant-drawer-content-wrapper { + -webkit-box-shadow: -2px 0 8px rgba(0, 0, 0, 0.15); + box-shadow: -2px 0 8px rgba(0, 0, 0, 0.15); +} +.ant-drawer-top, +.ant-drawer-bottom { + width: 100%; + height: 0%; +} +.ant-drawer-top .ant-drawer-content-wrapper, +.ant-drawer-bottom .ant-drawer-content-wrapper { + width: 100%; +} +.ant-drawer-top.ant-drawer-open, +.ant-drawer-bottom.ant-drawer-open { + height: 100%; +} +.ant-drawer-top.ant-drawer-open .ant-drawer-content-wrapper { + -webkit-box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} +.ant-drawer-bottom .ant-drawer-content-wrapper { + bottom: 0; +} +.ant-drawer-bottom.ant-drawer-open .ant-drawer-content-wrapper { + -webkit-box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.15); + box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.15); +} +.ant-drawer.ant-drawer-open .ant-drawer-mask { + opacity: 0.3; + height: 100%; + -webkit-animation: antdDrawerFadeIn 0.3s cubic-bezier(0.7, 0.3, 0.1, 1); + animation: antdDrawerFadeIn 0.3s cubic-bezier(0.7, 0.3, 0.1, 1); + -webkit-transition: none; + transition: none; +} +.ant-drawer-title { + margin: 0; + font-size: 16px; + line-height: 22px; + font-weight: 500; + color: rgba(0, 0, 0, 0.85); +} +.ant-drawer-content { + position: relative; + background-color: #fff; + border: 0; + background-clip: padding-box; + z-index: 1; +} +.ant-drawer-close { + cursor: pointer; + border: 0; + background: transparent; + position: absolute; + right: 0; + top: 0; + z-index: 10; + font-weight: 700; + line-height: 1; + text-decoration: none; + -webkit-transition: color 0.3s; + transition: color 0.3s; + color: rgba(0, 0, 0, 0.45); + outline: 0; + padding: 0; +} +.ant-drawer-close-x { + display: block; + font-style: normal; + text-align: center; + text-transform: none; + text-rendering: auto; + width: 56px; + height: 56px; + line-height: 56px; + font-size: 16px; +} +.ant-drawer-close:focus, +.ant-drawer-close:hover { + color: #444; + text-decoration: none; +} +.ant-drawer-header { + padding: 16px 24px; + border-radius: 4px 4px 0 0; + background: #fff; + color: rgba(0, 0, 0, 0.65); + border-bottom: 1px solid #e8e8e8; +} +.ant-drawer-body { + padding: 24px; + font-size: 14px; + line-height: 1.5; + word-wrap: break-word; +} +.ant-drawer-mask { + position: fixed; + width: 100%; + height: 0; + opacity: 0; + background-color: rgba(0, 0, 0, 0.65); + filter: alpha(opacity=50); + -webkit-transition: opacity 0.3s linear, height 0s ease 0.3s; + transition: opacity 0.3s linear, height 0s ease 0.3s; +} +.ant-drawer-open { + -webkit-transition: -webkit-transform 0.3s cubic-bezier(0.7, 0.3, 0.1, 1); + transition: -webkit-transform 0.3s cubic-bezier(0.7, 0.3, 0.1, 1); + transition: transform 0.3s cubic-bezier(0.7, 0.3, 0.1, 1); + transition: transform 0.3s cubic-bezier(0.7, 0.3, 0.1, 1), -webkit-transform 0.3s cubic-bezier(0.7, 0.3, 0.1, 1); +} +.ant-drawer-open-content { + -webkit-box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); +} +@-webkit-keyframes antdDrawerFadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 0.3; + } +} +@keyframes antdDrawerFadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 0.3; + } +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-dropdown { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + position: absolute; + left: -9999px; + top: -9999px; + z-index: 1050; + display: block; +} +.ant-dropdown-wrap { + position: relative; +} +.ant-dropdown-wrap .ant-btn > .anticon-down { + display: inline-block; + font-size: 12px; + font-size: 10px \9; + -webkit-transform: scale(0.83333333) rotate(0deg); + -ms-transform: scale(0.83333333) rotate(0deg); + transform: scale(0.83333333) rotate(0deg); +} +:root .ant-dropdown-wrap .ant-btn > .anticon-down { + font-size: 12px; +} +.ant-dropdown-wrap .anticon-down:before { + -webkit-transition: -webkit-transform .2s; + transition: -webkit-transform .2s; + transition: transform .2s; + transition: transform .2s, -webkit-transform .2s; +} +.ant-dropdown-wrap-open .anticon-down:before { + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.ant-dropdown-hidden, +.ant-dropdown-menu-hidden { + display: none; +} +.ant-dropdown-menu { + outline: none; + position: relative; + list-style-type: none; + padding: 4px 0; + margin: 0; + text-align: left; + background-color: #fff; + border-radius: 4px; + -webkit-box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + background-clip: padding-box; +} +.ant-dropdown-menu-item-group-title { + color: rgba(0, 0, 0, 0.45); + padding: 5px 12px; + -webkit-transition: all .3s; + transition: all .3s; +} +.ant-dropdown-menu-submenu-popup { + position: absolute; + z-index: 1050; +} +.ant-dropdown-menu-item, +.ant-dropdown-menu-submenu-title { + padding: 5px 12px; + margin: 0; + clear: both; + font-size: 14px; + font-weight: normal; + color: rgba(0, 0, 0, 0.65); + white-space: nowrap; + cursor: pointer; + -webkit-transition: all .3s; + transition: all .3s; + line-height: 22px; +} +.ant-dropdown-menu-item > .anticon:first-child, +.ant-dropdown-menu-submenu-title > .anticon:first-child { + min-width: 12px; + margin-right: 8px; +} +.ant-dropdown-menu-item > a, +.ant-dropdown-menu-submenu-title > a { + color: rgba(0, 0, 0, 0.65); + display: block; + padding: 5px 12px; + margin: -5px -12px; + -webkit-transition: all .3s; + transition: all .3s; +} +.ant-dropdown-menu-item > a:focus, +.ant-dropdown-menu-submenu-title > a:focus { + text-decoration: none; +} +.ant-dropdown-menu-item-selected, +.ant-dropdown-menu-submenu-title-selected, +.ant-dropdown-menu-item-selected > a, +.ant-dropdown-menu-submenu-title-selected > a { + color: #1890ff; + background-color: #e6f7ff; +} +.ant-dropdown-menu-item:hover, +.ant-dropdown-menu-submenu-title:hover { + background-color: #e6f7ff; +} +.ant-dropdown-menu-item-disabled, +.ant-dropdown-menu-submenu-title-disabled { + color: rgba(0, 0, 0, 0.25); + cursor: not-allowed; +} +.ant-dropdown-menu-item-disabled:hover, +.ant-dropdown-menu-submenu-title-disabled:hover { + color: rgba(0, 0, 0, 0.25); + background-color: #fff; + cursor: not-allowed; +} +.ant-dropdown-menu-item-divider, +.ant-dropdown-menu-submenu-title-divider { + height: 1px; + overflow: hidden; + background-color: #e8e8e8; + line-height: 0; + margin: 4px 0; +} +.ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow, +.ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow { + position: absolute; + right: 8px; +} +.ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow-icon, +.ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow-icon { + font-style: normal; + color: rgba(0, 0, 0, 0.45); + display: inline-block; + font-size: 12px; + font-size: 10px \9; + -webkit-transform: scale(0.83333333) rotate(0deg); + -ms-transform: scale(0.83333333) rotate(0deg); + transform: scale(0.83333333) rotate(0deg); +} +:root .ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow-icon, +:root .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow-icon { + font-size: 12px; +} +.ant-dropdown-menu-submenu-title { + padding-right: 26px; +} +.ant-dropdown-menu-submenu-vertical { + position: relative; +} +.ant-dropdown-menu-submenu-vertical > .ant-dropdown-menu { + top: 0; + left: 100%; + position: absolute; + min-width: 100%; + margin-left: 4px; + -webkit-transform-origin: 0 0; + -ms-transform-origin: 0 0; + transform-origin: 0 0; +} +.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title, +.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow-icon { + color: rgba(0, 0, 0, 0.25); +} +.ant-dropdown.slide-down-enter.slide-down-enter-active.ant-dropdown-placement-bottomLeft, +.ant-dropdown.slide-down-appear.slide-down-appear-active.ant-dropdown-placement-bottomLeft, +.ant-dropdown.slide-down-enter.slide-down-enter-active.ant-dropdown-placement-bottomCenter, +.ant-dropdown.slide-down-appear.slide-down-appear-active.ant-dropdown-placement-bottomCenter, +.ant-dropdown.slide-down-enter.slide-down-enter-active.ant-dropdown-placement-bottomRight, +.ant-dropdown.slide-down-appear.slide-down-appear-active.ant-dropdown-placement-bottomRight { + -webkit-animation-name: antSlideUpIn; + animation-name: antSlideUpIn; +} +.ant-dropdown.slide-up-enter.slide-up-enter-active.ant-dropdown-placement-topLeft, +.ant-dropdown.slide-up-appear.slide-up-appear-active.ant-dropdown-placement-topLeft, +.ant-dropdown.slide-up-enter.slide-up-enter-active.ant-dropdown-placement-topCenter, +.ant-dropdown.slide-up-appear.slide-up-appear-active.ant-dropdown-placement-topCenter, +.ant-dropdown.slide-up-enter.slide-up-enter-active.ant-dropdown-placement-topRight, +.ant-dropdown.slide-up-appear.slide-up-appear-active.ant-dropdown-placement-topRight { + -webkit-animation-name: antSlideDownIn; + animation-name: antSlideDownIn; +} +.ant-dropdown.slide-down-leave.slide-down-leave-active.ant-dropdown-placement-bottomLeft, +.ant-dropdown.slide-down-leave.slide-down-leave-active.ant-dropdown-placement-bottomCenter, +.ant-dropdown.slide-down-leave.slide-down-leave-active.ant-dropdown-placement-bottomRight { + -webkit-animation-name: antSlideUpOut; + animation-name: antSlideUpOut; +} +.ant-dropdown.slide-up-leave.slide-up-leave-active.ant-dropdown-placement-topLeft, +.ant-dropdown.slide-up-leave.slide-up-leave-active.ant-dropdown-placement-topCenter, +.ant-dropdown.slide-up-leave.slide-up-leave-active.ant-dropdown-placement-topRight { + -webkit-animation-name: antSlideDownOut; + animation-name: antSlideDownOut; +} +.ant-dropdown-trigger .anticon:not(.anticon-ellipsis), +.ant-dropdown-link .anticon:not(.anticon-ellipsis) { + display: inline-block; + font-size: 12px; + font-size: 10px \9; + -webkit-transform: scale(0.83333333) rotate(0deg); + -ms-transform: scale(0.83333333) rotate(0deg); + transform: scale(0.83333333) rotate(0deg); +} +:root .ant-dropdown-trigger .anticon:not(.anticon-ellipsis), +:root .ant-dropdown-link .anticon:not(.anticon-ellipsis) { + font-size: 12px; +} +.ant-dropdown-button { + white-space: nowrap; +} +.ant-dropdown-button.ant-btn-group > .ant-btn:last-child:not(:first-child) { + padding-left: 8px; + padding-right: 8px; +} +.ant-dropdown-button .anticon:not(.anticon-ellipsis) { + display: inline-block; + font-size: 12px; + font-size: 10px \9; + -webkit-transform: scale(0.83333333) rotate(0deg); + -ms-transform: scale(0.83333333) rotate(0deg); + transform: scale(0.83333333) rotate(0deg); +} +:root .ant-dropdown-button .anticon:not(.anticon-ellipsis) { + font-size: 12px; +} +.ant-dropdown-menu-dark, +.ant-dropdown-menu-dark .ant-dropdown-menu { + background: #001529; +} +.ant-dropdown-menu-dark .ant-dropdown-menu-item, +.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title, +.ant-dropdown-menu-dark .ant-dropdown-menu-item > a { + color: rgba(255, 255, 255, 0.65); +} +.ant-dropdown-menu-dark .ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow:after, +.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow:after, +.ant-dropdown-menu-dark .ant-dropdown-menu-item > a .ant-dropdown-menu-submenu-arrow:after { + color: rgba(255, 255, 255, 0.65); +} +.ant-dropdown-menu-dark .ant-dropdown-menu-item:hover, +.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title:hover, +.ant-dropdown-menu-dark .ant-dropdown-menu-item > a:hover { + color: #fff; + background: transparent; +} +.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected, +.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected:hover, +.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected > a { + background: #1890ff; + color: #fff; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-form { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; +} +.ant-form legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 16px; + line-height: inherit; + color: rgba(0, 0, 0, 0.45); + border: 0; + border-bottom: 1px solid #d9d9d9; +} +.ant-form label { + font-size: 14px; +} +.ant-form input[type="search"] { + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.ant-form input[type="radio"], +.ant-form input[type="checkbox"] { + line-height: normal; +} +.ant-form input[type="file"] { + display: block; +} +.ant-form input[type="range"] { + display: block; + width: 100%; +} +.ant-form select[multiple], +.ant-form select[size] { + height: auto; +} +.ant-form input[type="file"]:focus, +.ant-form input[type="radio"]:focus, +.ant-form input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.ant-form output { + display: block; + padding-top: 15px; + font-size: 14px; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); +} +.ant-form-item-required:before { + display: inline-block; + margin-right: 4px; + content: "*"; + font-family: SimSun; + line-height: 1; + font-size: 14px; + color: #f5222d; +} +.ant-form-hide-required-mark .ant-form-item-required:before { + display: none; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled { + cursor: not-allowed; +} +.ant-radio-inline.disabled, +.ant-radio-vertical.disabled, +.ant-checkbox-inline.disabled, +.ant-checkbox-vertical.disabled { + cursor: not-allowed; +} +.ant-radio.disabled label, +.ant-checkbox.disabled label { + cursor: not-allowed; +} +.ant-form-item { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + margin-bottom: 24px; + vertical-align: top; +} +.ant-form-item label { + position: relative; +} +.ant-form-item label > .anticon { + vertical-align: top; + font-size: 14px; +} +.ant-form-item-control > .ant-form-item:last-child, +.ant-form-item [class^="ant-col-"] > .ant-form-item:only-child { + margin-bottom: -24px; +} +.ant-form-item-control { + line-height: 39.9999px; + position: relative; + zoom: 1; +} +.ant-form-item-control:before, +.ant-form-item-control:after { + content: ""; + display: table; +} +.ant-form-item-control:after { + clear: both; +} +.ant-form-item-children { + position: relative; +} +.ant-form-item-with-help { + margin-bottom: 5px; +} +.ant-form-item-label { + text-align: right; + vertical-align: middle; + line-height: 39.9999px; + display: inline-block; + overflow: hidden; + white-space: nowrap; +} +.ant-form-item-label label { + color: rgba(0, 0, 0, 0.85); +} +.ant-form-item-label label:after { + content: ":"; + margin: 0 8px 0 2px; + position: relative; + top: -0.5px; +} +.ant-form-item .ant-switch { + margin: 2px 0 4px; +} +.ant-form-item-no-colon .ant-form-item-label label:after { + content: " "; +} +.ant-form-explain, +.ant-form-extra { + color: rgba(0, 0, 0, 0.45); + line-height: 1.5; + -webkit-transition: color 0.3s cubic-bezier(0.215, 0.61, 0.355, 1); + transition: color 0.3s cubic-bezier(0.215, 0.61, 0.355, 1); + margin-top: -2px; + clear: both; +} +.ant-form-extra { + padding-top: 4px; +} +.ant-form-text { + display: inline-block; + padding-right: 8px; +} +.ant-form-split { + display: block; + text-align: center; +} +form .has-feedback .ant-input { + padding-right: 24px; +} +form .has-feedback > .ant-select .ant-select-arrow, +form .has-feedback > .ant-select .ant-select-selection__clear, +form .has-feedback :not(.ant-input-group-addon) > .ant-select .ant-select-arrow, +form .has-feedback :not(.ant-input-group-addon) > .ant-select .ant-select-selection__clear { + right: 28px; +} +form .has-feedback > .ant-select .ant-select-selection-selected-value, +form .has-feedback :not(.ant-input-group-addon) > .ant-select .ant-select-selection-selected-value { + padding-right: 42px; +} +form .has-feedback .ant-cascader-picker-arrow { + margin-right: 17px; +} +form .has-feedback .ant-cascader-picker-clear { + right: 28px; +} +form .has-feedback .ant-input-search:not(.ant-input-search-enter-button) .ant-input-suffix { + right: 28px; +} +form .has-feedback .ant-calendar-picker-icon, +form .has-feedback .ant-time-picker-icon, +form .has-feedback .ant-calendar-picker-clear, +form .has-feedback .ant-time-picker-clear { + right: 28px; +} +form textarea.ant-input { + height: auto; +} +form .ant-upload { + background: transparent; +} +form input[type="radio"], +form input[type="checkbox"] { + width: 14px; + height: 14px; +} +form .ant-radio-inline, +form .ant-checkbox-inline { + display: inline-block; + vertical-align: middle; + font-weight: normal; + cursor: pointer; + margin-left: 8px; +} +form .ant-radio-inline:first-child, +form .ant-checkbox-inline:first-child { + margin-left: 0; +} +form .ant-checkbox-vertical, +form .ant-radio-vertical { + display: block; +} +form .ant-checkbox-vertical + .ant-checkbox-vertical, +form .ant-radio-vertical + .ant-radio-vertical { + margin-left: 0; +} +form .ant-input-number + .ant-form-text { + margin-left: 8px; +} +form .ant-input-number-handler-wrap { + z-index: 2; +} +form .ant-select, +form .ant-cascader-picker { + width: 100%; +} +form .ant-input-group .ant-select, +form .ant-input-group .ant-cascader-picker { + width: auto; +} +form :not(.ant-input-group-wrapper) > .ant-input-group, +form .ant-input-group-wrapper { + display: inline-block; + vertical-align: middle; + position: relative; + top: -1px; +} +.ant-input-group-wrap .ant-select-selection { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.ant-input-group-wrap .ant-select-selection:hover { + border-color: #d9d9d9; +} +.ant-input-group-wrap .ant-select-selection--single { + margin-left: -1px; + height: 40px; + background-color: #eee; +} +.ant-input-group-wrap .ant-select-selection--single .ant-select-selection__rendered { + padding-left: 8px; + padding-right: 25px; + line-height: 30px; +} +.ant-input-group-wrap .ant-select-open .ant-select-selection { + border-color: #d9d9d9; + -webkit-box-shadow: none; + box-shadow: none; +} +.ant-form-vertical .ant-form-item-label, +.ant-col-24.ant-form-item-label, +.ant-col-xl-24.ant-form-item-label { + padding: 0 0 8px; + margin: 0; + display: block; + text-align: left; + line-height: 1.5; +} +.ant-form-vertical .ant-form-item-label label:after, +.ant-col-24.ant-form-item-label label:after, +.ant-col-xl-24.ant-form-item-label label:after { + display: none; +} +.ant-form-vertical .ant-form-item { + padding-bottom: 8px; +} +.ant-form-vertical .ant-form-item-control { + line-height: 1.5; +} +.ant-form-vertical .ant-form-explain, +.ant-form-vertical .ant-form-extra { + margin-top: 2px; + margin-bottom: -4px; +} +@media (max-width: 575px) { + .ant-form-item-label, + .ant-form-item-control-wrapper { + display: block; + width: 100%; + } + .ant-form-item-label { + padding: 0 0 8px; + margin: 0; + display: block; + text-align: left; + line-height: 1.5; + } + .ant-form-item-label label:after { + display: none; + } + .ant-col-xs-24.ant-form-item-label { + padding: 0 0 8px; + margin: 0; + display: block; + text-align: left; + line-height: 1.5; + } + .ant-col-xs-24.ant-form-item-label label:after { + display: none; + } +} +@media (max-width: 767px) { + .ant-col-sm-24.ant-form-item-label { + padding: 0 0 8px; + margin: 0; + display: block; + text-align: left; + line-height: 1.5; + } + .ant-col-sm-24.ant-form-item-label label:after { + display: none; + } +} +@media (max-width: 991px) { + .ant-col-md-24.ant-form-item-label { + padding: 0 0 8px; + margin: 0; + display: block; + text-align: left; + line-height: 1.5; + } + .ant-col-md-24.ant-form-item-label label:after { + display: none; + } +} +@media (max-width: 1199px) { + .ant-col-lg-24.ant-form-item-label { + padding: 0 0 8px; + margin: 0; + display: block; + text-align: left; + line-height: 1.5; + } + .ant-col-lg-24.ant-form-item-label label:after { + display: none; + } +} +@media (max-width: 1599px) { + .ant-col-xl-24.ant-form-item-label { + padding: 0 0 8px; + margin: 0; + display: block; + text-align: left; + line-height: 1.5; + } + .ant-col-xl-24.ant-form-item-label label:after { + display: none; + } +} +.ant-form-inline .ant-form-item { + display: inline-block; + margin-right: 16px; + margin-bottom: 0; +} +.ant-form-inline .ant-form-item-with-help { + margin-bottom: 24px; +} +.ant-form-inline .ant-form-item > .ant-form-item-control-wrapper, +.ant-form-inline .ant-form-item > .ant-form-item-label { + display: inline-block; + vertical-align: middle; +} +.ant-form-inline .ant-form-text { + display: inline-block; +} +.ant-form-inline .has-feedback { + display: inline-block; +} +.ant-form-inline .ant-form-explain { + position: absolute; +} +.has-success.has-feedback .ant-form-item-children-icon, +.has-warning.has-feedback .ant-form-item-children-icon, +.has-error.has-feedback .ant-form-item-children-icon, +.is-validating.has-feedback .ant-form-item-children-icon { + position: absolute; + top: 50%; + right: 0; + visibility: visible; + pointer-events: none; + width: 32px; + height: 20px; + line-height: 20px; + margin-top: -10px; + text-align: center; + font-size: 14px; + -webkit-animation: zoomIn 0.3s cubic-bezier(0.12, 0.4, 0.29, 1.46); + animation: zoomIn 0.3s cubic-bezier(0.12, 0.4, 0.29, 1.46); + z-index: 1; +} +.has-success.has-feedback .ant-form-item-children-icon svg, +.has-warning.has-feedback .ant-form-item-children-icon svg, +.has-error.has-feedback .ant-form-item-children-icon svg, +.is-validating.has-feedback .ant-form-item-children-icon svg { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; +} +.has-success.has-feedback .ant-form-item-children-icon { + -webkit-animation-name: diffZoomIn1 !important; + animation-name: diffZoomIn1 !important; + color: #52c41a; +} +.has-warning .ant-form-explain, +.has-warning .ant-form-split { + color: #faad14; +} +.has-warning .ant-input, +.has-warning .ant-input:hover { + border-color: #faad14; +} +.has-warning .ant-input:focus { + border-color: #ffc53d; + outline: 0; + -webkit-box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); + box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); + border-right-width: 1px !important; +} +.has-warning .ant-input:not([disabled]):hover { + border-color: #faad14; +} +.has-warning .ant-calendar-picker-open .ant-calendar-picker-input { + border-color: #ffc53d; + outline: 0; + -webkit-box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); + box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); + border-right-width: 1px !important; +} +.has-warning .ant-input-prefix { + color: #faad14; +} +.has-warning .ant-input-group-addon { + color: #faad14; + border-color: #faad14; + background-color: #fff; +} +.has-warning .has-feedback { + color: #faad14; +} +.has-warning.has-feedback .ant-form-item-children-icon { + color: #faad14; + -webkit-animation-name: diffZoomIn3 !important; + animation-name: diffZoomIn3 !important; +} +.has-warning .ant-select-selection { + border-color: #faad14; +} +.has-warning .ant-select-open .ant-select-selection, +.has-warning .ant-select-focused .ant-select-selection { + border-color: #ffc53d; + outline: 0; + -webkit-box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); + box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); + border-right-width: 1px !important; +} +.has-warning .ant-calendar-picker-icon:after, +.has-warning .ant-time-picker-icon:after, +.has-warning .ant-picker-icon:after, +.has-warning .ant-select-arrow, +.has-warning .ant-cascader-picker-arrow { + color: #faad14; +} +.has-warning .ant-input-number, +.has-warning .ant-time-picker-input { + border-color: #faad14; +} +.has-warning .ant-input-number-focused, +.has-warning .ant-time-picker-input-focused, +.has-warning .ant-input-number:focus, +.has-warning .ant-time-picker-input:focus { + border-color: #ffc53d; + outline: 0; + -webkit-box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); + box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); + border-right-width: 1px !important; +} +.has-warning .ant-input-number:not([disabled]):hover, +.has-warning .ant-time-picker-input:not([disabled]):hover { + border-color: #faad14; +} +.has-warning .ant-cascader-picker:focus .ant-cascader-input { + border-color: #ffc53d; + outline: 0; + -webkit-box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); + box-shadow: 0 0 0 2px rgba(250, 173, 20, 0.2); + border-right-width: 1px !important; +} +.has-error .ant-form-explain, +.has-error .ant-form-split { + color: #f5222d; +} +.has-error .ant-input, +.has-error .ant-input:hover { + border-color: #f5222d; +} +.has-error .ant-input:focus { + border-color: #ff4d4f; + outline: 0; + -webkit-box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2); + box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2); + border-right-width: 1px !important; +} +.has-error .ant-input:not([disabled]):hover { + border-color: #f5222d; +} +.has-error .ant-calendar-picker-open .ant-calendar-picker-input { + border-color: #ff4d4f; + outline: 0; + -webkit-box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2); + box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2); + border-right-width: 1px !important; +} +.has-error .ant-input-prefix { + color: #f5222d; +} +.has-error .ant-input-group-addon { + color: #f5222d; + border-color: #f5222d; + background-color: #fff; +} +.has-error .has-feedback { + color: #f5222d; +} +.has-error.has-feedback .ant-form-item-children-icon { + color: #f5222d; + -webkit-animation-name: diffZoomIn2 !important; + animation-name: diffZoomIn2 !important; +} +.has-error .ant-select-selection { + border-color: #f5222d; +} +.has-error .ant-select-open .ant-select-selection, +.has-error .ant-select-focused .ant-select-selection { + border-color: #ff4d4f; + outline: 0; + -webkit-box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2); + box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2); + border-right-width: 1px !important; +} +.has-error .ant-select.ant-select-auto-complete .ant-input:focus { + border-color: #f5222d; +} +.has-error .ant-input-group-addon .ant-select-selection { + border-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.has-error .ant-calendar-picker-icon:after, +.has-error .ant-time-picker-icon:after, +.has-error .ant-picker-icon:after, +.has-error .ant-select-arrow, +.has-error .ant-cascader-picker-arrow { + color: #f5222d; +} +.has-error .ant-input-number, +.has-error .ant-time-picker-input { + border-color: #f5222d; +} +.has-error .ant-input-number-focused, +.has-error .ant-time-picker-input-focused, +.has-error .ant-input-number:focus, +.has-error .ant-time-picker-input:focus { + border-color: #ff4d4f; + outline: 0; + -webkit-box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2); + box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2); + border-right-width: 1px !important; +} +.has-error .ant-input-number:not([disabled]):hover, +.has-error .ant-time-picker-input:not([disabled]):hover { + border-color: #f5222d; +} +.has-error .ant-mention-wrapper .ant-mention-editor, +.has-error .ant-mention-wrapper .ant-mention-editor:not([disabled]):hover { + border-color: #f5222d; +} +.has-error .ant-mention-wrapper.ant-mention-active:not([disabled]) .ant-mention-editor, +.has-error .ant-mention-wrapper .ant-mention-editor:not([disabled]):focus { + border-color: #ff4d4f; + outline: 0; + -webkit-box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2); + box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2); + border-right-width: 1px !important; +} +.has-error .ant-cascader-picker:focus .ant-cascader-input { + border-color: #ff4d4f; + outline: 0; + -webkit-box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2); + box-shadow: 0 0 0 2px rgba(245, 34, 45, 0.2); + border-right-width: 1px !important; +} +.is-validating.has-feedback .ant-form-item-children-icon { + display: inline-block; + color: #1890ff; +} +.ant-advanced-search-form .ant-form-item { + margin-bottom: 24px; +} +.ant-advanced-search-form .ant-form-item-with-help { + margin-bottom: 5px; +} +.show-help-enter, +.show-help-appear { + -webkit-animation-duration: 0.3s; + animation-duration: 0.3s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.show-help-leave { + -webkit-animation-duration: 0.3s; + animation-duration: 0.3s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.show-help-enter.show-help-enter-active, +.show-help-appear.show-help-appear-active { + -webkit-animation-name: antShowHelpIn; + animation-name: antShowHelpIn; + -webkit-animation-play-state: running; + animation-play-state: running; +} +.show-help-leave.show-help-leave-active { + -webkit-animation-name: antShowHelpOut; + animation-name: antShowHelpOut; + -webkit-animation-play-state: running; + animation-play-state: running; + pointer-events: none; +} +.show-help-enter, +.show-help-appear { + opacity: 0; + -webkit-animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1); + animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1); +} +.show-help-leave { + -webkit-animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1); + animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1); +} +@-webkit-keyframes antShowHelpIn { + 0% { + opacity: 0; + -webkit-transform: translateY(-5px); + transform: translateY(-5px); + } + 100% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } +} +@keyframes antShowHelpIn { + 0% { + opacity: 0; + -webkit-transform: translateY(-5px); + transform: translateY(-5px); + } + 100% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } +} +@-webkit-keyframes antShowHelpOut { + to { + opacity: 0; + -webkit-transform: translateY(-5px); + transform: translateY(-5px); + } +} +@keyframes antShowHelpOut { + to { + opacity: 0; + -webkit-transform: translateY(-5px); + transform: translateY(-5px); + } +} +@-webkit-keyframes diffZoomIn1 { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } +} +@keyframes diffZoomIn1 { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } +} +@-webkit-keyframes diffZoomIn2 { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } +} +@keyframes diffZoomIn2 { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } +} +@-webkit-keyframes diffZoomIn3 { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } +} +@keyframes diffZoomIn3 { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-input-number { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-variant: tabular-nums; + -webkit-box-sizing: border-box; + box-sizing: border-box; + list-style: none; + position: relative; + padding: 4px 11px; + width: 100%; + height: 32px; + font-size: 14px; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + background-image: none; + -webkit-transition: all .3s; + transition: all .3s; + margin: 0; + padding: 0; + display: inline-block; + border: 1px solid #d9d9d9; + border-radius: 4px; + width: 90px; +} +.ant-input-number::-moz-placeholder { + color: #bfbfbf; + opacity: 1; +} +.ant-input-number:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-input-number::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-input-number:hover { + border-color: #40a9ff; + border-right-width: 1px !important; +} +.ant-input-number:focus { + border-color: #40a9ff; + outline: 0; + -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-input-number-disabled { + background-color: #f5f5f5; + opacity: 1; + cursor: not-allowed; + color: rgba(0, 0, 0, 0.25); +} +.ant-input-number-disabled:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +textarea.ant-input-number { + max-width: 100%; + height: auto; + vertical-align: bottom; + -webkit-transition: all .3s, height 0s; + transition: all .3s, height 0s; + min-height: 32px; +} +.ant-input-number-lg { + padding: 6px 11px; + height: 40px; + font-size: 16px; +} +.ant-input-number-sm { + padding: 1px 7px; + height: 24px; +} +.ant-input-number-handler { + text-align: center; + line-height: 0; + height: 50%; + overflow: hidden; + color: rgba(0, 0, 0, 0.45); + position: relative; + -webkit-transition: all 0.1s linear; + transition: all 0.1s linear; + display: block; + width: 100%; + font-weight: bold; +} +.ant-input-number-handler:active { + background: #f4f4f4; +} +.ant-input-number-handler:hover .ant-input-number-handler-up-inner, +.ant-input-number-handler:hover .ant-input-number-handler-down-inner { + color: #40a9ff; +} +.ant-input-number-handler-up-inner, +.ant-input-number-handler-down-inner { + font-style: normal; + vertical-align: -0.125em; + text-align: center; + text-transform: none; + line-height: 0; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + line-height: 12px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + position: absolute; + width: 12px; + height: 12px; + -webkit-transition: all 0.1s linear; + transition: all 0.1s linear; + display: inline-block; + font-size: 12px; + font-size: 7px \9; + -webkit-transform: scale(0.58333333) rotate(0deg); + -ms-transform: scale(0.58333333) rotate(0deg); + transform: scale(0.58333333) rotate(0deg); + right: 4px; + color: rgba(0, 0, 0, 0.45); +} +.ant-input-number-handler-up-inner > *, +.ant-input-number-handler-down-inner > * { + line-height: 1; +} +.ant-input-number-handler-up-inner svg, +.ant-input-number-handler-down-inner svg { + display: inline-block; +} +.ant-input-number-handler-up-inner:before, +.ant-input-number-handler-down-inner:before { + display: none; +} +.ant-input-number-handler-up-inner .ant-input-number-handler-up-inner-icon, +.ant-input-number-handler-up-inner .ant-input-number-handler-down-inner-icon, +.ant-input-number-handler-down-inner .ant-input-number-handler-up-inner-icon, +.ant-input-number-handler-down-inner .ant-input-number-handler-down-inner-icon { + display: block; +} +:root .ant-input-number-handler-up-inner, +:root .ant-input-number-handler-down-inner { + font-size: 12px; +} +.ant-input-number:hover { + border-color: #40a9ff; + border-right-width: 1px !important; +} +.ant-input-number-focused { + border-color: #40a9ff; + outline: 0; + -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-input-number-disabled { + background-color: #f5f5f5; + opacity: 1; + cursor: not-allowed; + color: rgba(0, 0, 0, 0.25); +} +.ant-input-number-disabled:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +.ant-input-number-disabled .ant-input-number-input { + cursor: not-allowed; +} +.ant-input-number-disabled .ant-input-number-handler-wrap { + display: none; +} +.ant-input-number-input { + width: 100%; + text-align: left; + outline: 0; + -moz-appearance: textfield; + height: 30px; + -webkit-transition: all 0.3s linear; + transition: all 0.3s linear; + background-color: transparent; + border: 0; + border-radius: 4px; + padding: 0 11px; +} +.ant-input-number-input::-moz-placeholder { + color: #bfbfbf; + opacity: 1; +} +.ant-input-number-input:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-input-number-input::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-input-number-lg { + padding: 0; + font-size: 16px; +} +.ant-input-number-lg input { + height: 38px; +} +.ant-input-number-sm { + padding: 0; +} +.ant-input-number-sm input { + height: 22px; + padding: 0 7px; +} +.ant-input-number-handler-wrap { + border-left: 1px solid #d9d9d9; + width: 22px; + height: 100%; + background: #fff; + position: absolute; + top: 0; + right: 0; + opacity: 0; + border-radius: 0 4px 4px 0; + -webkit-transition: opacity 0.24s linear 0.1s; + transition: opacity 0.24s linear 0.1s; +} +.ant-input-number-handler-wrap:hover .ant-input-number-handler { + height: 40%; +} +.ant-input-number:hover .ant-input-number-handler-wrap { + opacity: 1; +} +.ant-input-number-handler-up { + cursor: pointer; +} +.ant-input-number-handler-up-inner { + top: 50%; + margin-top: -5px; + text-align: center; +} +.ant-input-number-handler-up:hover { + height: 60% !important; +} +.ant-input-number-handler-down { + border-top: 1px solid #d9d9d9; + top: 0; + cursor: pointer; +} +.ant-input-number-handler-down-inner { + top: 50%; + margin-top: -6px; + text-align: center; +} +.ant-input-number-handler-down:hover { + height: 60% !important; +} +.ant-input-number-handler-up-disabled, +.ant-input-number-handler-down-disabled { + cursor: not-allowed; +} +.ant-input-number-handler-up-disabled:hover .ant-input-number-handler-up-inner, +.ant-input-number-handler-down-disabled:hover .ant-input-number-handler-down-inner { + color: rgba(0, 0, 0, 0.25); +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-layout { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-flex: 1; + -webkit-flex: auto; + -ms-flex: auto; + flex: auto; + background: #f0f2f5; + /* fix firefox can't set height smaller than content on flex item */ + min-height: 0; +} +.ant-layout, +.ant-layout * { + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.ant-layout.ant-layout-has-sider { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -webkit-flex-direction: row; + -ms-flex-direction: row; + flex-direction: row; +} +.ant-layout.ant-layout-has-sider > .ant-layout, +.ant-layout.ant-layout-has-sider > .ant-layout-content { + overflow-x: hidden; +} +.ant-layout-header, +.ant-layout-footer { + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; +} +.ant-layout-header { + background: #001529; + padding: 0 50px; + height: 64px; + line-height: 64px; +} +.ant-layout-footer { + background: #f0f2f5; + padding: 24px 50px; + color: rgba(0, 0, 0, 0.65); + font-size: 14px; +} +.ant-layout-content { + -webkit-box-flex: 1; + -webkit-flex: auto; + -ms-flex: auto; + flex: auto; + /* fix firefox can't set height smaller than content on flex item */ + min-height: 0; +} +.ant-layout-sider { + -webkit-transition: all .2s; + transition: all .2s; + position: relative; + background: #001529; + /* fix firefox can't set width smaller than content on flex item */ + min-width: 0; +} +.ant-layout-sider-children { + height: 100%; + padding-top: 0.1px; + margin-top: -0.1px; +} +.ant-layout-sider-has-trigger { + padding-bottom: 48px; +} +.ant-layout-sider-right { + -webkit-box-ordinal-group: 2; + -webkit-order: 1; + -ms-flex-order: 1; + order: 1; +} +.ant-layout-sider-trigger { + position: fixed; + text-align: center; + bottom: 0; + cursor: pointer; + height: 48px; + line-height: 48px; + color: #fff; + background: #002140; + z-index: 1; + -webkit-transition: all .2s; + transition: all .2s; +} +.ant-layout-sider-zero-width > * { + overflow: hidden; +} +.ant-layout-sider-zero-width-trigger { + position: absolute; + top: 64px; + right: -36px; + text-align: center; + width: 36px; + height: 42px; + line-height: 42px; + background: #001529; + color: #fff; + font-size: 18px; + border-radius: 0 4px 4px 0; + cursor: pointer; + -webkit-transition: background .3s ease; + transition: background .3s ease; +} +.ant-layout-sider-zero-width-trigger:hover { + background: #192c3e; +} +.ant-layout-sider-light { + background: #fff; +} +.ant-layout-sider-light .ant-layout-sider-trigger { + color: rgba(0, 0, 0, 0.65); + background: #fff; +} +.ant-layout-sider-light .ant-layout-sider-zero-width-trigger { + color: rgba(0, 0, 0, 0.65); + background: #fff; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-list { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + position: relative; +} +.ant-list * { + outline: none; +} +.ant-list-pagination { + margin-top: 24px; + text-align: right; +} +.ant-list-more { + margin-top: 12px; + text-align: center; +} +.ant-list-more button { + padding-left: 32px; + padding-right: 32px; +} +.ant-list-spin { + text-align: center; + min-height: 40px; +} +.ant-list-empty-text { + color: rgba(0, 0, 0, 0.45); + font-size: 14px; + padding: 16px; + text-align: center; +} +.ant-list-item { + -webkit-box-align: center; + -webkit-align-items: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + padding-top: 12px; + padding-bottom: 12px; +} +.ant-list-item-meta { + -webkit-box-align: start; + -webkit-align-items: flex-start; + -ms-flex-align: start; + align-items: flex-start; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + font-size: 0; +} +.ant-list-item-meta-avatar { + margin-right: 16px; +} +.ant-list-item-meta-content { + -webkit-box-flex: 1; + -webkit-flex: 1 0; + -ms-flex: 1 0; + flex: 1 0; +} +.ant-list-item-meta-title { + color: rgba(0, 0, 0, 0.65); + margin-bottom: 4px; + font-size: 14px; + line-height: 22px; +} +.ant-list-item-meta-title > a { + color: rgba(0, 0, 0, 0.65); + -webkit-transition: all .3s; + transition: all .3s; +} +.ant-list-item-meta-title > a:hover { + color: #1890ff; +} +.ant-list-item-meta-description { + color: rgba(0, 0, 0, 0.45); + font-size: 14px; + line-height: 22px; +} +.ant-list-item-content { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + -ms-flex-pack: end; + justify-content: flex-end; +} +.ant-list-item-content-single { + -webkit-box-pack: start; + -webkit-justify-content: flex-start; + -ms-flex-pack: start; + justify-content: flex-start; +} +.ant-list-item-action { + font-size: 0; + -webkit-box-flex: 0; + -webkit-flex: 0 0 auto; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + margin-left: 48px; + padding: 0; + list-style: none; +} +.ant-list-item-action > li { + display: inline-block; + color: rgba(0, 0, 0, 0.45); + cursor: pointer; + padding: 0 8px; + position: relative; + font-size: 14px; + line-height: 22px; + text-align: center; +} +.ant-list-item-action > li:first-child { + padding-left: 0; +} +.ant-list-item-action-split { + background-color: #e8e8e8; + margin-top: -7px; + position: absolute; + top: 50%; + right: 0; + width: 1px; + height: 14px; +} +.ant-list-item-main { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; +} +.ant-list-header, +.ant-list-footer { + padding-top: 12px; + padding-bottom: 12px; +} +.ant-list-empty { + color: rgba(0, 0, 0, 0.45); + padding: 16px 0; + font-size: 12px; + text-align: center; +} +.ant-list-split .ant-list-item { + border-bottom: 1px solid #e8e8e8; +} +.ant-list-split .ant-list-item:last-child { + border-bottom: none; +} +.ant-list-split .ant-list-header { + border-bottom: 1px solid #e8e8e8; +} +.ant-list-loading .ant-list-spin-nested-loading { + min-height: 32px; +} +.ant-list-something-after-last-item .ant-spin-container > .ant-list-item:last-child { + border-bottom: 1px solid #e8e8e8; +} +.ant-list-lg .ant-list-item { + padding-top: 16px; + padding-bottom: 16px; +} +.ant-list-sm .ant-list-item { + padding-top: 8px; + padding-bottom: 8px; +} +.ant-list-vertical .ant-list-item { + display: block; +} +.ant-list-vertical .ant-list-item-extra-wrap { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; +} +.ant-list-vertical .ant-list-item-main { + display: block; + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; +} +.ant-list-vertical .ant-list-item-extra { + margin-left: 58px; +} +.ant-list-vertical .ant-list-item-meta { + margin-bottom: 16px; +} +.ant-list-vertical .ant-list-item-meta-avatar { + display: none; +} +.ant-list-vertical .ant-list-item-meta-title { + color: rgba(0, 0, 0, 0.85); + margin-bottom: 12px; + font-size: 16px; + line-height: 24px; +} +.ant-list-vertical .ant-list-item-content { + display: block; + color: rgba(0, 0, 0, 0.65); + font-size: 14px; + margin-bottom: 16px; +} +.ant-list-vertical .ant-list-item-action { + margin-left: auto; +} +.ant-list-vertical .ant-list-item-action > li { + padding: 0 16px; +} +.ant-list-vertical .ant-list-item-action > li:first-child { + padding-left: 0; +} +.ant-list-grid .ant-list-item { + border-bottom: none; + padding-top: 0; + padding-bottom: 0; + margin-bottom: 16px; +} +.ant-list-grid .ant-list-item-content { + display: block; + max-width: 100%; +} +.ant-list-bordered { + border-radius: 4px; + border: 1px solid #d9d9d9; +} +.ant-list-bordered .ant-list-header { + padding-left: 24px; + padding-right: 24px; +} +.ant-list-bordered .ant-list-footer { + padding-left: 24px; + padding-right: 24px; +} +.ant-list-bordered .ant-list-item { + border-bottom: 1px solid #e8e8e8; + padding-left: 24px; + padding-right: 24px; +} +.ant-list-bordered .ant-list-pagination { + margin: 16px 24px; +} +.ant-list-bordered.ant-list-sm .ant-list-item { + padding-left: 16px; + padding-right: 16px; +} +.ant-list-bordered.ant-list-sm .ant-list-header, +.ant-list-bordered.ant-list-sm .ant-list-footer { + padding: 8px 16px; +} +.ant-list-bordered.ant-list-lg .ant-list-header, +.ant-list-bordered.ant-list-lg .ant-list-footer { + padding: 16px 24px; +} +@media screen and (max-width: 768px) { + .ant-list-item-action { + margin-left: 24px; + } + .ant-list-vertical .ant-list-item-extra { + margin-left: 24px; + } +} +@media screen and (max-width: 480px) { + .ant-list-item { + -webkit-flex-wrap: wrap; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + } + .ant-list-item-action { + margin-left: 12px; + } + .ant-list-vertical .ant-list-item-extra-wrap { + -webkit-flex-wrap: wrap-reverse; + -ms-flex-wrap: wrap-reverse; + flex-wrap: wrap-reverse; + } + .ant-list-vertical .ant-list-item-main { + min-width: 220px; + } + .ant-list-vertical .ant-list-item-extra { + margin-left: 0; + } +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-spin { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + color: #1890ff; + vertical-align: middle; + text-align: center; + opacity: 0; + position: absolute; + -webkit-transition: -webkit-transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); + transition: -webkit-transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); + transition: transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); + transition: transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86), -webkit-transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86); + display: none; +} +.ant-spin-spinning { + opacity: 1; + position: static; + display: inline-block; +} +.ant-spin-nested-loading { + position: relative; +} +.ant-spin-nested-loading > div > .ant-spin { + display: block; + position: absolute; + height: 100%; + max-height: 360px; + width: 100%; + z-index: 4; +} +.ant-spin-nested-loading > div > .ant-spin .ant-spin-dot { + position: absolute; + top: 50%; + left: 50%; + margin: -10px; +} +.ant-spin-nested-loading > div > .ant-spin .ant-spin-text { + position: absolute; + top: 50%; + width: 100%; + padding-top: 5px; + text-shadow: 0 1px 2px #fff; +} +.ant-spin-nested-loading > div > .ant-spin.ant-spin-show-text .ant-spin-dot { + margin-top: -20px; +} +.ant-spin-nested-loading > div > .ant-spin-sm .ant-spin-dot { + margin: -7px; +} +.ant-spin-nested-loading > div > .ant-spin-sm .ant-spin-text { + padding-top: 2px; +} +.ant-spin-nested-loading > div > .ant-spin-sm.ant-spin-show-text .ant-spin-dot { + margin-top: -17px; +} +.ant-spin-nested-loading > div > .ant-spin-lg .ant-spin-dot { + margin: -16px; +} +.ant-spin-nested-loading > div > .ant-spin-lg .ant-spin-text { + padding-top: 11px; +} +.ant-spin-nested-loading > div > .ant-spin-lg.ant-spin-show-text .ant-spin-dot { + margin-top: -26px; +} +.ant-spin-container { + position: relative; + -webkit-transition: opacity .3s; + transition: opacity .3s; + zoom: 1; +} +.ant-spin-container:before, +.ant-spin-container:after { + content: ""; + display: table; +} +.ant-spin-container:after { + clear: both; +} +.ant-spin-blur { + pointer-events: none; + user-select: none; + overflow: hidden; + opacity: 0.5; + -webkit-filter: blur(0.5px); + filter: blur(0.5px); + /* autoprefixer: off */ + filter: progid\:DXImageTransform\.Microsoft\.Blur(PixelRadius\=1, MakeShadow\=false); +} +.ant-spin-blur:after { + content: ''; + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + background: #fff; + opacity: 0.3; + -webkit-transition: all .3s; + transition: all .3s; + z-index: 10; +} +.ant-spin-tip { + color: rgba(0, 0, 0, 0.45); +} +.ant-spin-dot { + position: relative; + display: inline-block; + font-size: 20px; + width: 20px; + height: 20px; +} +.ant-spin-dot i { + width: 9px; + height: 9px; + border-radius: 100%; + background-color: #1890ff; + -webkit-transform: scale(0.75); + -ms-transform: scale(0.75); + transform: scale(0.75); + display: block; + position: absolute; + opacity: 0.3; + -webkit-animation: antSpinMove 1s infinite linear alternate; + animation: antSpinMove 1s infinite linear alternate; + -webkit-transform-origin: 50% 50%; + -ms-transform-origin: 50% 50%; + transform-origin: 50% 50%; +} +.ant-spin-dot i:nth-child(1) { + left: 0; + top: 0; +} +.ant-spin-dot i:nth-child(2) { + right: 0; + top: 0; + -webkit-animation-delay: 0.4s; + animation-delay: 0.4s; +} +.ant-spin-dot i:nth-child(3) { + right: 0; + bottom: 0; + -webkit-animation-delay: 0.8s; + animation-delay: 0.8s; +} +.ant-spin-dot i:nth-child(4) { + left: 0; + bottom: 0; + -webkit-animation-delay: 1.2s; + animation-delay: 1.2s; +} +.ant-spin-dot-spin { + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + -webkit-animation: antRotate 1.2s infinite linear; + animation: antRotate 1.2s infinite linear; +} +.ant-spin-sm .ant-spin-dot { + font-size: 14px; + width: 14px; + height: 14px; +} +.ant-spin-sm .ant-spin-dot i { + width: 6px; + height: 6px; +} +.ant-spin-lg .ant-spin-dot { + font-size: 32px; + width: 32px; + height: 32px; +} +.ant-spin-lg .ant-spin-dot i { + width: 14px; + height: 14px; +} +.ant-spin.ant-spin-show-text .ant-spin-text { + display: block; +} +@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) { + /* IE10+ */ + .ant-spin-blur { + background: #fff; + opacity: 0.5; + } +} +@-webkit-keyframes antSpinMove { + to { + opacity: 1; + } +} +@keyframes antSpinMove { + to { + opacity: 1; + } +} +@-webkit-keyframes antRotate { + to { + -webkit-transform: rotate(405deg); + transform: rotate(405deg); + } +} +@keyframes antRotate { + to { + -webkit-transform: rotate(405deg); + transform: rotate(405deg); + } +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-pagination { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; +} +.ant-pagination ul, +.ant-pagination ol { + margin: 0; + padding: 0; + list-style: none; +} +.ant-pagination:after { + content: " "; + display: block; + height: 0; + clear: both; + overflow: hidden; + visibility: hidden; +} +.ant-pagination-total-text { + display: inline-block; + vertical-align: middle; + height: 32px; + line-height: 30px; + margin-right: 8px; +} +.ant-pagination-item { + cursor: pointer; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + min-width: 32px; + height: 32px; + line-height: 30px; + text-align: center; + list-style: none; + display: inline-block; + vertical-align: middle; + border: 1px solid #d9d9d9; + background-color: #fff; + margin-right: 8px; + font-family: Arial; + outline: 0; +} +.ant-pagination-item a { + text-decoration: none; + color: rgba(0, 0, 0, 0.65); + -webkit-transition: none; + transition: none; + margin: 0 6px; +} +.ant-pagination-item:focus, +.ant-pagination-item:hover { + -webkit-transition: all .3s; + transition: all .3s; + border-color: #1890ff; +} +.ant-pagination-item:focus a, +.ant-pagination-item:hover a { + color: #1890ff; +} +.ant-pagination-item-active { + border-color: #1890ff; + font-weight: 500; +} +.ant-pagination-item-active a { + color: #1890ff; +} +.ant-pagination-item-active:focus, +.ant-pagination-item-active:hover { + border-color: #40a9ff; +} +.ant-pagination-item-active:focus a, +.ant-pagination-item-active:hover a { + color: #40a9ff; +} +.ant-pagination-jump-prev, +.ant-pagination-jump-next { + outline: 0; +} +.ant-pagination-jump-prev .ant-pagination-item-container, +.ant-pagination-jump-next .ant-pagination-item-container { + position: relative; +} +.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon, +.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon { + display: inline-block; + font-size: 12px; + font-size: 12px \9; + -webkit-transform: scale(1) rotate(0deg); + -ms-transform: scale(1) rotate(0deg); + transform: scale(1) rotate(0deg); + color: #1890ff; + letter-spacing: -1px; + opacity: 0; + -webkit-transition: all .2s; + transition: all .2s; +} +:root .ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon, +:root .ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon { + font-size: 12px; +} +.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon-svg, +.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon-svg { + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; +} +.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-ellipsis, +.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-ellipsis { + position: absolute; + display: block; + letter-spacing: 2px; + color: rgba(0, 0, 0, 0.25); + text-align: center; + opacity: 1; + -webkit-transition: all .2s; + transition: all .2s; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; +} +.ant-pagination-jump-prev:focus .ant-pagination-item-link-icon, +.ant-pagination-jump-next:focus .ant-pagination-item-link-icon, +.ant-pagination-jump-prev:hover .ant-pagination-item-link-icon, +.ant-pagination-jump-next:hover .ant-pagination-item-link-icon { + opacity: 1; +} +.ant-pagination-jump-prev:focus .ant-pagination-item-ellipsis, +.ant-pagination-jump-next:focus .ant-pagination-item-ellipsis, +.ant-pagination-jump-prev:hover .ant-pagination-item-ellipsis, +.ant-pagination-jump-next:hover .ant-pagination-item-ellipsis { + opacity: 0; +} +.ant-pagination-prev, +.ant-pagination-jump-prev, +.ant-pagination-jump-next { + margin-right: 8px; +} +.ant-pagination-prev, +.ant-pagination-next, +.ant-pagination-jump-prev, +.ant-pagination-jump-next { + font-family: Arial; + cursor: pointer; + color: rgba(0, 0, 0, 0.65); + border-radius: 4px; + list-style: none; + min-width: 32px; + height: 32px; + line-height: 32px; + text-align: center; + -webkit-transition: all .3s; + transition: all .3s; + display: inline-block; + vertical-align: middle; +} +.ant-pagination-prev, +.ant-pagination-next { + outline: 0; +} +.ant-pagination-prev a, +.ant-pagination-next a { + color: rgba(0, 0, 0, 0.65); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.ant-pagination-prev:hover a, +.ant-pagination-next:hover a { + border-color: #40a9ff; +} +.ant-pagination-prev .ant-pagination-item-link, +.ant-pagination-next .ant-pagination-item-link { + border: 1px solid #d9d9d9; + background-color: #fff; + border-radius: 4px; + outline: none; + display: block; + -webkit-transition: all .3s; + transition: all .3s; + font-size: 12px; + height: 100%; + text-align: center; +} +.ant-pagination-prev:focus .ant-pagination-item-link, +.ant-pagination-next:focus .ant-pagination-item-link, +.ant-pagination-prev:hover .ant-pagination-item-link, +.ant-pagination-next:hover .ant-pagination-item-link { + border-color: #1890ff; + color: #1890ff; +} +.ant-pagination-disabled, +.ant-pagination-disabled:hover, +.ant-pagination-disabled:focus { + cursor: not-allowed; +} +.ant-pagination-disabled a, +.ant-pagination-disabled:hover a, +.ant-pagination-disabled:focus a, +.ant-pagination-disabled .ant-pagination-item-link, +.ant-pagination-disabled:hover .ant-pagination-item-link, +.ant-pagination-disabled:focus .ant-pagination-item-link { + border-color: #d9d9d9; + color: rgba(0, 0, 0, 0.25); + cursor: not-allowed; +} +.ant-pagination-slash { + margin: 0 10px 0 5px; +} +.ant-pagination-options { + display: inline-block; + vertical-align: middle; + margin-left: 16px; +} +.ant-pagination-options-size-changer.ant-select { + display: inline-block; + margin-right: 8px; +} +.ant-pagination-options-quick-jumper { + display: inline-block; + vertical-align: top; + height: 32px; + line-height: 32px; +} +.ant-pagination-options-quick-jumper input { + position: relative; + display: inline-block; + padding: 4px 11px; + width: 100%; + height: 32px; + font-size: 14px; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + background-image: none; + border: 1px solid #d9d9d9; + border-radius: 4px; + -webkit-transition: all .3s; + transition: all .3s; + margin: 0 8px; + width: 50px; +} +.ant-pagination-options-quick-jumper input::-moz-placeholder { + color: #bfbfbf; + opacity: 1; +} +.ant-pagination-options-quick-jumper input:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-pagination-options-quick-jumper input::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-pagination-options-quick-jumper input:hover { + border-color: #40a9ff; + border-right-width: 1px !important; +} +.ant-pagination-options-quick-jumper input:focus { + border-color: #40a9ff; + outline: 0; + -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-pagination-options-quick-jumper input-disabled { + background-color: #f5f5f5; + opacity: 1; + cursor: not-allowed; + color: rgba(0, 0, 0, 0.25); +} +.ant-pagination-options-quick-jumper input-disabled:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +textarea.ant-pagination-options-quick-jumper input { + max-width: 100%; + height: auto; + vertical-align: bottom; + -webkit-transition: all .3s, height 0s; + transition: all .3s, height 0s; + min-height: 32px; +} +.ant-pagination-options-quick-jumper input-lg { + padding: 6px 11px; + height: 40px; + font-size: 16px; +} +.ant-pagination-options-quick-jumper input-sm { + padding: 1px 7px; + height: 24px; +} +.ant-pagination-simple .ant-pagination-prev, +.ant-pagination-simple .ant-pagination-next { + height: 24px; + line-height: 24px; + vertical-align: top; +} +.ant-pagination-simple .ant-pagination-prev .ant-pagination-item-link, +.ant-pagination-simple .ant-pagination-next .ant-pagination-item-link { + border: 0; + height: 24px; +} +.ant-pagination-simple .ant-pagination-prev .ant-pagination-item-link:after, +.ant-pagination-simple .ant-pagination-next .ant-pagination-item-link:after { + height: 24px; + line-height: 24px; +} +.ant-pagination-simple .ant-pagination-simple-pager { + display: inline-block; + margin-right: 8px; + height: 24px; +} +.ant-pagination-simple .ant-pagination-simple-pager input { + margin-right: 8px; + -webkit-box-sizing: border-box; + box-sizing: border-box; + background-color: #fff; + border-radius: 4px; + border: 1px solid #d9d9d9; + outline: none; + padding: 0 6px; + height: 100%; + text-align: center; + -webkit-transition: border-color 0.3s; + transition: border-color 0.3s; +} +.ant-pagination-simple .ant-pagination-simple-pager input:hover { + border-color: #1890ff; +} +.ant-pagination.mini .ant-pagination-total-text, +.ant-pagination.mini .ant-pagination-simple-pager { + height: 24px; + line-height: 24px; +} +.ant-pagination.mini .ant-pagination-item { + margin: 0; + min-width: 24px; + height: 24px; + line-height: 22px; +} +.ant-pagination.mini .ant-pagination-item:not(.ant-pagination-item-active) { + background: transparent; + border-color: transparent; +} +.ant-pagination.mini .ant-pagination-prev, +.ant-pagination.mini .ant-pagination-next { + margin: 0; + min-width: 24px; + height: 24px; + line-height: 24px; +} +.ant-pagination.mini .ant-pagination-prev .ant-pagination-item-link, +.ant-pagination.mini .ant-pagination-next .ant-pagination-item-link { + border-color: transparent; + background: transparent; +} +.ant-pagination.mini .ant-pagination-prev .ant-pagination-item-link:after, +.ant-pagination.mini .ant-pagination-next .ant-pagination-item-link:after { + height: 24px; + line-height: 24px; +} +.ant-pagination.mini .ant-pagination-jump-prev, +.ant-pagination.mini .ant-pagination-jump-next { + height: 24px; + line-height: 24px; + margin-right: 0; +} +.ant-pagination.mini .ant-pagination-options { + margin-left: 2px; +} +.ant-pagination.mini .ant-pagination-options-quick-jumper { + height: 24px; + line-height: 24px; +} +.ant-pagination.mini .ant-pagination-options-quick-jumper input { + padding: 1px 7px; + height: 24px; + width: 44px; +} +@media only screen and (max-width: 992px) { + .ant-pagination-item-after-jump-prev, + .ant-pagination-item-before-jump-next { + display: none; + } +} +@media only screen and (max-width: 576px) { + .ant-pagination-options { + display: none; + } +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-mention-wrapper { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + position: relative; + display: inline-block; + width: 100%; + vertical-align: middle; +} +.ant-mention-wrapper .ant-mention-editor { + position: relative; + display: inline-block; + padding: 4px 11px; + width: 100%; + height: 32px; + font-size: 14px; + color: rgba(0, 0, 0, 0.65); + background-color: #fff; + background-image: none; + border: 1px solid #d9d9d9; + border-radius: 4px; + -webkit-transition: all .3s; + transition: all .3s; + min-height: 32px; + height: auto; + line-height: 1.5; + padding: 0; + display: block; +} +.ant-mention-wrapper .ant-mention-editor::-moz-placeholder { + color: #bfbfbf; + opacity: 1; +} +.ant-mention-wrapper .ant-mention-editor:-ms-input-placeholder { + color: #bfbfbf; +} +.ant-mention-wrapper .ant-mention-editor::-webkit-input-placeholder { + color: #bfbfbf; +} +.ant-mention-wrapper .ant-mention-editor:hover { + border-color: #40a9ff; + border-right-width: 1px !important; +} +.ant-mention-wrapper .ant-mention-editor:focus { + border-color: #40a9ff; + outline: 0; + -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-mention-wrapper .ant-mention-editor-disabled { + background-color: #f5f5f5; + opacity: 1; + cursor: not-allowed; + color: rgba(0, 0, 0, 0.25); +} +.ant-mention-wrapper .ant-mention-editor-disabled:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +textarea.ant-mention-wrapper .ant-mention-editor { + max-width: 100%; + height: auto; + vertical-align: bottom; + -webkit-transition: all .3s, height 0s; + transition: all .3s, height 0s; + min-height: 32px; +} +.ant-mention-wrapper .ant-mention-editor-lg { + padding: 6px 11px; + height: 40px; + font-size: 16px; +} +.ant-mention-wrapper .ant-mention-editor-sm { + padding: 1px 7px; + height: 24px; +} +.ant-mention-wrapper .ant-mention-editor-wrapper { + overflow-y: auto; + height: auto; +} +.ant-mention-wrapper.ant-mention-active:not(.disabled) .ant-mention-editor { + border-color: #40a9ff; + outline: 0; + -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + border-right-width: 1px !important; +} +.ant-mention-wrapper.disabled .ant-mention-editor { + background-color: #f5f5f5; + opacity: 1; + cursor: not-allowed; + color: rgba(0, 0, 0, 0.25); +} +.ant-mention-wrapper.disabled .ant-mention-editor:hover { + border-color: #e6d8d8; + border-right-width: 1px !important; +} +.ant-mention-wrapper .public-DraftEditorPlaceholder-root { + position: absolute; + pointer-events: none; +} +.ant-mention-wrapper .public-DraftEditorPlaceholder-root .public-DraftEditorPlaceholder-inner { + color: #bfbfbf; + opacity: 1; + outline: none; + white-space: pre-wrap; + word-wrap: break-word; + height: auto; + padding: 5px 11px; +} +.ant-mention-wrapper .DraftEditor-editorContainer .public-DraftEditor-content { + height: auto; + padding: 5px 11px; +} +.ant-mention-dropdown { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + margin-top: 1.5em; + max-height: 250px; + min-width: 120px; + background-color: #fff; + -webkit-box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + border-radius: 4px; + z-index: 1050; + left: -9999px; + top: -9999px; + position: absolute; + outline: none; + overflow-x: hidden; + overflow-y: auto; +} +.ant-mention-dropdown-placement-top { + margin-top: -0.1em; +} +.ant-mention-dropdown-notfound.ant-mention-dropdown-item { + color: rgba(0, 0, 0, 0.25); +} +.ant-mention-dropdown-notfound.ant-mention-dropdown-item .anticon-loading { + color: #1890ff; + text-align: center; + display: block; +} +.ant-mention-dropdown-item { + position: relative; + display: block; + padding: 5px 12px; + line-height: 22px; + font-weight: normal; + color: rgba(0, 0, 0, 0.65); + white-space: nowrap; + cursor: pointer; + text-overflow: ellipsis; + overflow: hidden; + -webkit-transition: background 0.3s; + transition: background 0.3s; +} +.ant-mention-dropdown-item:hover { + background-color: #e6f7ff; +} +.ant-mention-dropdown-item.focus, +.ant-mention-dropdown-item-active { + background-color: #e6f7ff; +} +.ant-mention-dropdown-item-disabled { + color: rgba(0, 0, 0, 0.25); + cursor: not-allowed; +} +.ant-mention-dropdown-item-disabled:hover { + color: rgba(0, 0, 0, 0.25); + background-color: #fff; + cursor: not-allowed; +} +.ant-mention-dropdown-item-selected, +.ant-mention-dropdown-item-selected:hover { + background-color: #f5f5f5; + font-weight: bold; + color: rgba(0, 0, 0, 0.65); +} +.ant-mention-dropdown-item-divider { + height: 1px; + margin: 1px 0; + overflow: hidden; + background-color: #e8e8e8; + line-height: 0; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-menu { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + outline: none; + margin-bottom: 0; + padding-left: 0; + list-style: none; + -webkit-box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + color: rgba(0, 0, 0, 0.65); + background: #fff; + line-height: 0; + -webkit-transition: background .3s, width .2s; + transition: background .3s, width .2s; + zoom: 1; +} +.ant-menu:before, +.ant-menu:after { + content: ""; + display: table; +} +.ant-menu:after { + clear: both; +} +.ant-menu ul, +.ant-menu ol { + list-style: none; + margin: 0; + padding: 0; +} +.ant-menu-hidden { + display: none; +} +.ant-menu-item-group-title { + color: rgba(0, 0, 0, 0.45); + font-size: 14px; + line-height: 1.5; + padding: 8px 16px; + -webkit-transition: all .3s; + transition: all .3s; +} +.ant-menu-submenu, +.ant-menu-submenu-inline { + -webkit-transition: border-color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), padding 0.15s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: border-color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), padding 0.15s cubic-bezier(0.645, 0.045, 0.355, 1); +} +.ant-menu-item:active, +.ant-menu-submenu-title:active { + background: #e6f7ff; +} +.ant-menu-submenu .ant-menu-sub { + cursor: initial; + -webkit-transition: background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); +} +.ant-menu-item > a { + display: block; + color: rgba(0, 0, 0, 0.65); +} +.ant-menu-item > a:hover { + color: #1890ff; +} +.ant-menu-item > a:focus { + text-decoration: none; +} +.ant-menu-item > a:before { + position: absolute; + background-color: transparent; + top: 0; + left: 0; + bottom: 0; + right: 0; + content: ''; +} +.ant-menu-item-divider { + height: 1px; + overflow: hidden; + background-color: #e8e8e8; + line-height: 0; +} +.ant-menu-item:hover, +.ant-menu-item-active, +.ant-menu:not(.ant-menu-inline) .ant-menu-submenu-open, +.ant-menu-submenu-active, +.ant-menu-submenu-title:hover { + color: #1890ff; +} +.ant-menu-horizontal .ant-menu-item, +.ant-menu-horizontal .ant-menu-submenu { + margin-top: -1px; +} +.ant-menu-horizontal > .ant-menu-item:hover, +.ant-menu-horizontal > .ant-menu-item-active, +.ant-menu-horizontal > .ant-menu-submenu .ant-menu-submenu-title:hover { + background-color: transparent; +} +.ant-menu-item-selected { + color: #1890ff; +} +.ant-menu-item-selected > a, +.ant-menu-item-selected > a:hover { + color: #1890ff; +} +.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected { + background-color: #e6f7ff; +} +.ant-menu-inline, +.ant-menu-vertical, +.ant-menu-vertical-left { + border-right: 1px solid #e8e8e8; +} +.ant-menu-vertical-right { + border-left: 1px solid #e8e8e8; +} +.ant-menu-vertical.ant-menu-sub, +.ant-menu-vertical-left.ant-menu-sub, +.ant-menu-vertical-right.ant-menu-sub { + border-right: 0; + padding: 0; + -webkit-transform-origin: 0 0; + -ms-transform-origin: 0 0; + transform-origin: 0 0; +} +.ant-menu-vertical.ant-menu-sub .ant-menu-item, +.ant-menu-vertical-left.ant-menu-sub .ant-menu-item, +.ant-menu-vertical-right.ant-menu-sub .ant-menu-item { + border-right: 0; + margin-left: 0; + left: 0; +} +.ant-menu-vertical.ant-menu-sub .ant-menu-item:after, +.ant-menu-vertical-left.ant-menu-sub .ant-menu-item:after, +.ant-menu-vertical-right.ant-menu-sub .ant-menu-item:after { + border-right: 0; +} +.ant-menu-vertical.ant-menu-sub > .ant-menu-item, +.ant-menu-vertical-left.ant-menu-sub > .ant-menu-item, +.ant-menu-vertical-right.ant-menu-sub > .ant-menu-item, +.ant-menu-vertical.ant-menu-sub > .ant-menu-submenu, +.ant-menu-vertical-left.ant-menu-sub > .ant-menu-submenu, +.ant-menu-vertical-right.ant-menu-sub > .ant-menu-submenu { + -webkit-transform-origin: 0 0; + -ms-transform-origin: 0 0; + transform-origin: 0 0; +} +.ant-menu-horizontal.ant-menu-sub, +.ant-menu-vertical.ant-menu-sub, +.ant-menu-vertical-left.ant-menu-sub, +.ant-menu-vertical-right.ant-menu-sub { + min-width: 160px; +} +.ant-menu-item, +.ant-menu-submenu-title { + cursor: pointer; + margin: 0; + padding: 0 20px; + position: relative; + display: block; + white-space: nowrap; + -webkit-transition: color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), border-color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), padding 0.15s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), border-color 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), padding 0.15s cubic-bezier(0.645, 0.045, 0.355, 1); +} +.ant-menu-item .anticon, +.ant-menu-submenu-title .anticon { + min-width: 14px; + margin-right: 10px; + font-size: 14px; + -webkit-transition: font-size 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), margin 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: font-size 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), margin 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); +} +.ant-menu-item .anticon + span, +.ant-menu-submenu-title .anticon + span { + -webkit-transition: opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), width 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: opacity 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), width 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + opacity: 1; +} +.ant-menu > .ant-menu-item-divider { + height: 1px; + margin: 1px 0; + overflow: hidden; + padding: 0; + line-height: 0; + background-color: #e8e8e8; +} +.ant-menu-submenu-popup { + position: absolute; + border-radius: 4px; + z-index: 1050; +} +.ant-menu-submenu-popup .submenu-title-wrapper { + padding-right: 20px; +} +.ant-menu-submenu-popup:before { + position: absolute; + top: -7px; + left: 0; + right: 0; + bottom: 0; + content: ' '; + opacity: .0001; +} +.ant-menu-submenu > .ant-menu { + background-color: #fff; + border-radius: 4px; +} +.ant-menu-submenu > .ant-menu-submenu-title:after { + -webkit-transition: -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); +} +.ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow, +.ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow, +.ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow, +.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow { + -webkit-transition: -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + position: absolute; + top: 50%; + right: 16px; + width: 10px; +} +.ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow:before, +.ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow:before, +.ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow:before, +.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow:before, +.ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow:after, +.ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow:after, +.ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow:after, +.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow:after { + content: ''; + position: absolute; + vertical-align: baseline; + background: #fff; + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.65)), to(rgba(0, 0, 0, 0.65))); + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.65), rgba(0, 0, 0, 0.65)); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.65), rgba(0, 0, 0, 0.65)); + width: 6px; + height: 1.5px; + border-radius: 2px; + -webkit-transition: background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), top 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), top 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), top 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: background 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), top 0.3s cubic-bezier(0.645, 0.045, 0.355, 1), -webkit-transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); +} +.ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow:before, +.ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow:before, +.ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow:before, +.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow:before { + -webkit-transform: rotate(45deg) translateY(-2px); + -ms-transform: rotate(45deg) translateY(-2px); + transform: rotate(45deg) translateY(-2px); +} +.ant-menu-submenu-vertical > .ant-menu-submenu-title .ant-menu-submenu-arrow:after, +.ant-menu-submenu-vertical-left > .ant-menu-submenu-title .ant-menu-submenu-arrow:after, +.ant-menu-submenu-vertical-right > .ant-menu-submenu-title .ant-menu-submenu-arrow:after, +.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow:after { + -webkit-transform: rotate(-45deg) translateY(2px); + -ms-transform: rotate(-45deg) translateY(2px); + transform: rotate(-45deg) translateY(2px); +} +.ant-menu-submenu-vertical > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after, +.ant-menu-submenu-vertical-left > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after, +.ant-menu-submenu-vertical-right > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after, +.ant-menu-submenu-inline > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after, +.ant-menu-submenu-vertical > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before, +.ant-menu-submenu-vertical-left > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before, +.ant-menu-submenu-vertical-right > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before, +.ant-menu-submenu-inline > .ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before { + background: -webkit-gradient(linear, left top, right top, from(#1890ff), to(#1890ff)); + background: -webkit-linear-gradient(left, #1890ff, #1890ff); + background: linear-gradient(to right, #1890ff, #1890ff); +} +.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow:before { + -webkit-transform: rotate(-45deg) translateX(2px); + -ms-transform: rotate(-45deg) translateX(2px); + transform: rotate(-45deg) translateX(2px); +} +.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow:after { + -webkit-transform: rotate(45deg) translateX(-2px); + -ms-transform: rotate(45deg) translateX(-2px); + transform: rotate(45deg) translateX(-2px); +} +.ant-menu-submenu-open.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow { + -webkit-transform: translateY(-2px); + -ms-transform: translateY(-2px); + transform: translateY(-2px); +} +.ant-menu-submenu-open.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow:after { + -webkit-transform: rotate(-45deg) translateX(-2px); + -ms-transform: rotate(-45deg) translateX(-2px); + transform: rotate(-45deg) translateX(-2px); +} +.ant-menu-submenu-open.ant-menu-submenu-inline > .ant-menu-submenu-title .ant-menu-submenu-arrow:before { + -webkit-transform: rotate(45deg) translateX(2px); + -ms-transform: rotate(45deg) translateX(2px); + transform: rotate(45deg) translateX(2px); +} +.ant-menu-vertical .ant-menu-submenu-selected, +.ant-menu-vertical-left .ant-menu-submenu-selected, +.ant-menu-vertical-right .ant-menu-submenu-selected { + color: #1890ff; +} +.ant-menu-vertical .ant-menu-submenu-selected > a, +.ant-menu-vertical-left .ant-menu-submenu-selected > a, +.ant-menu-vertical-right .ant-menu-submenu-selected > a { + color: #1890ff; +} +.ant-menu-horizontal { + border: 0; + border-bottom: 1px solid #e8e8e8; + -webkit-box-shadow: none; + box-shadow: none; + line-height: 46px; + white-space: nowrap; +} +.ant-menu-horizontal > .ant-menu-item, +.ant-menu-horizontal > .ant-menu-submenu { + position: relative; + top: 1px; + display: inline-block; + vertical-align: bottom; + border-bottom: 2px solid transparent; +} +.ant-menu-horizontal > .ant-menu-item:hover, +.ant-menu-horizontal > .ant-menu-submenu:hover, +.ant-menu-horizontal > .ant-menu-item-active, +.ant-menu-horizontal > .ant-menu-submenu-active, +.ant-menu-horizontal > .ant-menu-item-open, +.ant-menu-horizontal > .ant-menu-submenu-open, +.ant-menu-horizontal > .ant-menu-item-selected, +.ant-menu-horizontal > .ant-menu-submenu-selected { + border-bottom: 2px solid #1890ff; + color: #1890ff; +} +.ant-menu-horizontal > .ant-menu-item > a { + display: block; + color: rgba(0, 0, 0, 0.65); +} +.ant-menu-horizontal > .ant-menu-item > a:hover { + color: #1890ff; +} +.ant-menu-horizontal > .ant-menu-item > a:before { + bottom: -2px; +} +.ant-menu-horizontal > .ant-menu-item-selected > a { + color: #1890ff; +} +.ant-menu-horizontal:after { + content: " "; + display: block; + height: 0; + clear: both; +} +.ant-menu-vertical .ant-menu-item, +.ant-menu-vertical-left .ant-menu-item, +.ant-menu-vertical-right .ant-menu-item, +.ant-menu-inline .ant-menu-item { + position: relative; +} +.ant-menu-vertical .ant-menu-item:after, +.ant-menu-vertical-left .ant-menu-item:after, +.ant-menu-vertical-right .ant-menu-item:after, +.ant-menu-inline .ant-menu-item:after { + content: ""; + position: absolute; + right: 0; + top: 0; + bottom: 0; + border-right: 3px solid #1890ff; + -webkit-transform: scaleY(0.0001); + -ms-transform: scaleY(0.0001); + transform: scaleY(0.0001); + opacity: 0; + -webkit-transition: opacity 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), -webkit-transform 0.15s cubic-bezier(0.215, 0.61, 0.355, 1); + transition: opacity 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), -webkit-transform 0.15s cubic-bezier(0.215, 0.61, 0.355, 1); + transition: transform 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), opacity 0.15s cubic-bezier(0.215, 0.61, 0.355, 1); + transition: transform 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), opacity 0.15s cubic-bezier(0.215, 0.61, 0.355, 1), -webkit-transform 0.15s cubic-bezier(0.215, 0.61, 0.355, 1); +} +.ant-menu-vertical .ant-menu-item, +.ant-menu-vertical-left .ant-menu-item, +.ant-menu-vertical-right .ant-menu-item, +.ant-menu-inline .ant-menu-item, +.ant-menu-vertical .ant-menu-submenu-title, +.ant-menu-vertical-left .ant-menu-submenu-title, +.ant-menu-vertical-right .ant-menu-submenu-title, +.ant-menu-inline .ant-menu-submenu-title { + padding: 0 16px; + font-size: 14px; + line-height: 40px; + height: 40px; + margin-top: 4px; + margin-bottom: 4px; + overflow: hidden; + text-overflow: ellipsis; +} +.ant-menu-vertical .ant-menu-submenu, +.ant-menu-vertical-left .ant-menu-submenu, +.ant-menu-vertical-right .ant-menu-submenu, +.ant-menu-inline .ant-menu-submenu { + padding-bottom: 0.01px; +} +.ant-menu-vertical .ant-menu-item:not(:last-child), +.ant-menu-vertical-left .ant-menu-item:not(:last-child), +.ant-menu-vertical-right .ant-menu-item:not(:last-child), +.ant-menu-inline .ant-menu-item:not(:last-child) { + margin-bottom: 8px; +} +.ant-menu-vertical > .ant-menu-item, +.ant-menu-vertical-left > .ant-menu-item, +.ant-menu-vertical-right > .ant-menu-item, +.ant-menu-inline > .ant-menu-item, +.ant-menu-vertical > .ant-menu-submenu > .ant-menu-submenu-title, +.ant-menu-vertical-left > .ant-menu-submenu > .ant-menu-submenu-title, +.ant-menu-vertical-right > .ant-menu-submenu > .ant-menu-submenu-title, +.ant-menu-inline > .ant-menu-submenu > .ant-menu-submenu-title { + line-height: 40px; + height: 40px; +} +.ant-menu-inline { + width: 100%; +} +.ant-menu-inline .ant-menu-selected:after, +.ant-menu-inline .ant-menu-item-selected:after { + -webkit-transition: opacity 0.15s cubic-bezier(0.645, 0.045, 0.355, 1), -webkit-transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: opacity 0.15s cubic-bezier(0.645, 0.045, 0.355, 1), -webkit-transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.15s cubic-bezier(0.645, 0.045, 0.355, 1); + transition: transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.15s cubic-bezier(0.645, 0.045, 0.355, 1), -webkit-transform 0.15s cubic-bezier(0.645, 0.045, 0.355, 1); + opacity: 1; + -webkit-transform: scaleY(1); + -ms-transform: scaleY(1); + transform: scaleY(1); +} +.ant-menu-inline .ant-menu-item, +.ant-menu-inline .ant-menu-submenu-title { + width: calc(100% + 1px); +} +.ant-menu-inline .ant-menu-submenu-title { + padding-right: 34px; +} +.ant-menu-inline-collapsed { + width: 80px; +} +.ant-menu-inline-collapsed > .ant-menu-item, +.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item, +.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-submenu > .ant-menu-submenu-title, +.ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title { + left: 0; + text-overflow: clip; + padding: 0 32px !important; +} +.ant-menu-inline-collapsed > .ant-menu-item .ant-menu-submenu-arrow, +.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item .ant-menu-submenu-arrow, +.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-submenu > .ant-menu-submenu-title .ant-menu-submenu-arrow, +.ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title .ant-menu-submenu-arrow { + display: none; +} +.ant-menu-inline-collapsed > .ant-menu-item .anticon, +.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item .anticon, +.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-submenu > .ant-menu-submenu-title .anticon, +.ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title .anticon { + font-size: 16px; + line-height: 40px; + margin: 0; +} +.ant-menu-inline-collapsed > .ant-menu-item .anticon + span, +.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item .anticon + span, +.ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-submenu > .ant-menu-submenu-title .anticon + span, +.ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title .anticon + span { + max-width: 0; + display: inline-block; + opacity: 0; +} +.ant-menu-inline-collapsed-tooltip { + pointer-events: none; +} +.ant-menu-inline-collapsed-tooltip .anticon { + display: none; +} +.ant-menu-inline-collapsed-tooltip a { + color: rgba(255, 255, 255, 0.85); +} +.ant-menu-inline-collapsed .ant-menu-item-group-title { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + padding-left: 4px; + padding-right: 4px; +} +.ant-menu-item-group-list { + margin: 0; + padding: 0; +} +.ant-menu-item-group-list .ant-menu-item, +.ant-menu-item-group-list .ant-menu-submenu-title { + padding: 0 16px 0 28px; +} +.ant-menu-root.ant-menu-vertical, +.ant-menu-root.ant-menu-vertical-left, +.ant-menu-root.ant-menu-vertical-right, +.ant-menu-root.ant-menu-inline { + -webkit-box-shadow: none; + box-shadow: none; +} +.ant-menu-sub.ant-menu-inline { + padding: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + border-radius: 0; +} +.ant-menu-sub.ant-menu-inline > .ant-menu-item, +.ant-menu-sub.ant-menu-inline > .ant-menu-submenu > .ant-menu-submenu-title { + line-height: 40px; + height: 40px; + list-style-type: disc; + list-style-position: inside; +} +.ant-menu-sub.ant-menu-inline .ant-menu-item-group-title { + padding-left: 32px; +} +.ant-menu-item-disabled, +.ant-menu-submenu-disabled { + color: rgba(0, 0, 0, 0.25) !important; + cursor: not-allowed; + background: none; + border-color: transparent !important; +} +.ant-menu-item-disabled > a, +.ant-menu-submenu-disabled > a { + color: rgba(0, 0, 0, 0.25) !important; + pointer-events: none; +} +.ant-menu-item-disabled > .ant-menu-submenu-title, +.ant-menu-submenu-disabled > .ant-menu-submenu-title { + color: rgba(0, 0, 0, 0.25) !important; + cursor: not-allowed; +} +.ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after, +.ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after { + background: rgba(0, 0, 0, 0.25) !important; +} +.ant-menu-dark, +.ant-menu-dark .ant-menu-sub { + color: rgba(255, 255, 255, 0.65); + background: #001529; +} +.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow, +.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow { + opacity: .45; + -webkit-transition: all .3s; + transition: all .3s; +} +.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:before { + background: #fff; +} +.ant-menu-dark.ant-menu-submenu-popup { + background: transparent; +} +.ant-menu-dark .ant-menu-inline.ant-menu-sub { + background: #000c17; + -webkit-box-shadow: 0 2px 8px rgba(0, 0, 0, 0.45) inset; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.45) inset; +} +.ant-menu-dark.ant-menu-horizontal { + border-bottom: 0; +} +.ant-menu-dark.ant-menu-horizontal > .ant-menu-item, +.ant-menu-dark.ant-menu-horizontal > .ant-menu-submenu { + border-color: #001529; + border-bottom: 0; + top: 0; + margin-top: 0; +} +.ant-menu-dark.ant-menu-horizontal > .ant-menu-item > a:before { + bottom: 0; +} +.ant-menu-dark .ant-menu-item, +.ant-menu-dark .ant-menu-item-group-title, +.ant-menu-dark .ant-menu-item > a { + color: rgba(255, 255, 255, 0.65); +} +.ant-menu-dark.ant-menu-inline, +.ant-menu-dark.ant-menu-vertical, +.ant-menu-dark.ant-menu-vertical-left, +.ant-menu-dark.ant-menu-vertical-right { + border-right: 0; +} +.ant-menu-dark.ant-menu-inline .ant-menu-item, +.ant-menu-dark.ant-menu-vertical .ant-menu-item, +.ant-menu-dark.ant-menu-vertical-left .ant-menu-item, +.ant-menu-dark.ant-menu-vertical-right .ant-menu-item { + border-right: 0; + margin-left: 0; + left: 0; +} +.ant-menu-dark.ant-menu-inline .ant-menu-item:after, +.ant-menu-dark.ant-menu-vertical .ant-menu-item:after, +.ant-menu-dark.ant-menu-vertical-left .ant-menu-item:after, +.ant-menu-dark.ant-menu-vertical-right .ant-menu-item:after { + border-right: 0; +} +.ant-menu-dark.ant-menu-inline .ant-menu-item, +.ant-menu-dark.ant-menu-inline .ant-menu-submenu-title { + width: 100%; +} +.ant-menu-dark .ant-menu-item:hover, +.ant-menu-dark .ant-menu-item-active, +.ant-menu-dark .ant-menu-submenu-active, +.ant-menu-dark .ant-menu-submenu-open, +.ant-menu-dark .ant-menu-submenu-selected, +.ant-menu-dark .ant-menu-submenu-title:hover { + background-color: transparent; + color: #fff; +} +.ant-menu-dark .ant-menu-item:hover > a, +.ant-menu-dark .ant-menu-item-active > a, +.ant-menu-dark .ant-menu-submenu-active > a, +.ant-menu-dark .ant-menu-submenu-open > a, +.ant-menu-dark .ant-menu-submenu-selected > a, +.ant-menu-dark .ant-menu-submenu-title:hover > a { + color: #fff; +} +.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow, +.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow, +.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow, +.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title > .ant-menu-submenu-arrow, +.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title > .ant-menu-submenu-arrow, +.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow, +.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow, +.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow, +.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow, +.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow, +.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow, +.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow { + opacity: 1; +} +.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-item:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-item-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-active > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-open > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-selected > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-title:hover > .ant-menu-submenu-title:hover > .ant-menu-submenu-arrow:before { + background: #fff; +} +.ant-menu-dark .ant-menu-item-selected { + border-right: 0; + color: #fff; +} +.ant-menu-dark .ant-menu-item-selected:after { + border-right: 0; +} +.ant-menu-dark .ant-menu-item-selected > a, +.ant-menu-dark .ant-menu-item-selected > a:hover { + color: #fff; +} +.ant-menu.ant-menu-dark .ant-menu-item-selected, +.ant-menu-submenu-popup.ant-menu-dark .ant-menu-item-selected { + background-color: #1890ff; +} +.ant-menu-dark .ant-menu-item-disabled, +.ant-menu-dark .ant-menu-submenu-disabled, +.ant-menu-dark .ant-menu-item-disabled > a, +.ant-menu-dark .ant-menu-submenu-disabled > a { + opacity: 0.8; + color: rgba(255, 255, 255, 0.35) !important; +} +.ant-menu-dark .ant-menu-item-disabled > .ant-menu-submenu-title, +.ant-menu-dark .ant-menu-submenu-disabled > .ant-menu-submenu-title { + color: rgba(255, 255, 255, 0.35) !important; +} +.ant-menu-dark .ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:before, +.ant-menu-dark .ant-menu-item-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after, +.ant-menu-dark .ant-menu-submenu-disabled > .ant-menu-submenu-title > .ant-menu-submenu-arrow:after { + background: rgba(255, 255, 255, 0.35) !important; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-tooltip { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + position: absolute; + z-index: 1060; + display: block; + visibility: visible; + max-width: 250px; +} +.ant-tooltip-hidden { + display: none; +} +.ant-tooltip-placement-top, +.ant-tooltip-placement-topLeft, +.ant-tooltip-placement-topRight { + padding-bottom: 8px; +} +.ant-tooltip-placement-right, +.ant-tooltip-placement-rightTop, +.ant-tooltip-placement-rightBottom { + padding-left: 8px; +} +.ant-tooltip-placement-bottom, +.ant-tooltip-placement-bottomLeft, +.ant-tooltip-placement-bottomRight { + padding-top: 8px; +} +.ant-tooltip-placement-left, +.ant-tooltip-placement-leftTop, +.ant-tooltip-placement-leftBottom { + padding-right: 8px; +} +.ant-tooltip-inner { + padding: 6px 8px; + color: #fff; + text-align: left; + text-decoration: none; + background-color: rgba(0, 0, 0, 0.75); + border-radius: 4px; + -webkit-box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + min-height: 32px; + word-wrap: break-word; +} +.ant-tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.ant-tooltip-placement-top .ant-tooltip-arrow, +.ant-tooltip-placement-topLeft .ant-tooltip-arrow, +.ant-tooltip-placement-topRight .ant-tooltip-arrow { + bottom: 3px; + border-width: 5px 5px 0; + border-top-color: rgba(0, 0, 0, 0.75); +} +.ant-tooltip-placement-top .ant-tooltip-arrow { + left: 50%; + margin-left: -5px; +} +.ant-tooltip-placement-topLeft .ant-tooltip-arrow { + left: 16px; +} +.ant-tooltip-placement-topRight .ant-tooltip-arrow { + right: 16px; +} +.ant-tooltip-placement-right .ant-tooltip-arrow, +.ant-tooltip-placement-rightTop .ant-tooltip-arrow, +.ant-tooltip-placement-rightBottom .ant-tooltip-arrow { + left: 3px; + border-width: 5px 5px 5px 0; + border-right-color: rgba(0, 0, 0, 0.75); +} +.ant-tooltip-placement-right .ant-tooltip-arrow { + top: 50%; + margin-top: -5px; +} +.ant-tooltip-placement-rightTop .ant-tooltip-arrow { + top: 8px; +} +.ant-tooltip-placement-rightBottom .ant-tooltip-arrow { + bottom: 8px; +} +.ant-tooltip-placement-left .ant-tooltip-arrow, +.ant-tooltip-placement-leftTop .ant-tooltip-arrow, +.ant-tooltip-placement-leftBottom .ant-tooltip-arrow { + right: 3px; + border-width: 5px 0 5px 5px; + border-left-color: rgba(0, 0, 0, 0.75); +} +.ant-tooltip-placement-left .ant-tooltip-arrow { + top: 50%; + margin-top: -5px; +} +.ant-tooltip-placement-leftTop .ant-tooltip-arrow { + top: 8px; +} +.ant-tooltip-placement-leftBottom .ant-tooltip-arrow { + bottom: 8px; +} +.ant-tooltip-placement-bottom .ant-tooltip-arrow, +.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow, +.ant-tooltip-placement-bottomRight .ant-tooltip-arrow { + top: 3px; + border-width: 0 5px 5px; + border-bottom-color: rgba(0, 0, 0, 0.75); +} +.ant-tooltip-placement-bottom .ant-tooltip-arrow { + left: 50%; + margin-left: -5px; +} +.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow { + left: 16px; +} +.ant-tooltip-placement-bottomRight .ant-tooltip-arrow { + right: 16px; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-message { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + position: fixed; + z-index: 1010; + width: 100%; + top: 16px; + left: 0; + pointer-events: none; +} +.ant-message-notice { + padding: 8px; + text-align: center; +} +.ant-message-notice:first-child { + margin-top: -8px; +} +.ant-message-notice-content { + padding: 10px 16px; + border-radius: 4px; + -webkit-box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + background: #fff; + display: inline-block; + pointer-events: all; +} +.ant-message-success .anticon { + color: #52c41a; +} +.ant-message-error .anticon { + color: #f5222d; +} +.ant-message-warning .anticon { + color: #faad14; +} +.ant-message-info .anticon, +.ant-message-loading .anticon { + color: #1890ff; +} +.ant-message .anticon { + margin-right: 8px; + font-size: 16px; + top: 1px; + position: relative; +} +.ant-message-notice.move-up-leave.move-up-leave-active { + -webkit-animation-name: MessageMoveOut; + animation-name: MessageMoveOut; + overflow: hidden; + -webkit-animation-duration: .3s; + animation-duration: .3s; +} +@-webkit-keyframes MessageMoveOut { + 0% { + opacity: 1; + max-height: 150px; + padding: 8px; + } + 100% { + opacity: 0; + max-height: 0; + padding: 0; + } +} +@keyframes MessageMoveOut { + 0% { + opacity: 1; + max-height: 150px; + padding: 8px; + } + 100% { + opacity: 0; + max-height: 0; + padding: 0; + } +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-modal { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + position: relative; + width: auto; + margin: 0 auto; + top: 100px; + padding-bottom: 24px; +} +.ant-modal-wrap { + position: fixed; + overflow: auto; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1000; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.ant-modal-title { + margin: 0; + font-size: 16px; + line-height: 22px; + font-weight: 500; + color: rgba(0, 0, 0, 0.85); +} +.ant-modal-content { + position: relative; + background-color: #fff; + border: 0; + border-radius: 4px; + background-clip: padding-box; + -webkit-box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); +} +.ant-modal-close { + cursor: pointer; + border: 0; + background: transparent; + position: absolute; + right: 0; + top: 0; + z-index: 10; + font-weight: 700; + line-height: 1; + text-decoration: none; + -webkit-transition: color .3s; + transition: color .3s; + color: rgba(0, 0, 0, 0.45); + outline: 0; + padding: 0; +} +.ant-modal-close-x { + display: block; + font-style: normal; + vertical-align: baseline; + text-align: center; + text-transform: none; + text-rendering: auto; + width: 56px; + height: 56px; + line-height: 56px; + font-size: 16px; +} +.ant-modal-close:focus, +.ant-modal-close:hover { + color: #444; + text-decoration: none; +} +.ant-modal-header { + padding: 16px 24px; + border-radius: 4px 4px 0 0; + background: #fff; + color: rgba(0, 0, 0, 0.65); + border-bottom: 1px solid #e8e8e8; +} +.ant-modal-body { + padding: 24px; + font-size: 14px; + line-height: 1.5; + word-wrap: break-word; +} +.ant-modal-footer { + border-top: 1px solid #e8e8e8; + padding: 10px 16px; + text-align: right; + border-radius: 0 0 4px 4px; +} +.ant-modal-footer button + button { + margin-left: 8px; + margin-bottom: 0; +} +.ant-modal.zoom-enter, +.ant-modal.zoom-appear { + -webkit-animation-duration: 0.3s; + animation-duration: 0.3s; + -webkit-transform: none; + -ms-transform: none; + transform: none; + opacity: 0; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.ant-modal-mask { + position: fixed; + top: 0; + right: 0; + left: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.65); + height: 100%; + z-index: 1000; + filter: alpha(opacity=50); +} +.ant-modal-mask-hidden { + display: none; +} +.ant-modal-open { + overflow: hidden; +} +.ant-modal-centered { + text-align: center; +} +.ant-modal-centered:before { + content: ''; + display: inline-block; + height: 100%; + vertical-align: middle; + width: 0; +} +.ant-modal-centered .ant-modal { + display: inline-block; + vertical-align: middle; + top: 0; + text-align: left; +} +@media (max-width: 767px) { + .ant-modal { + width: auto !important; + margin: 10px; + } + .ant-modal-centered .ant-modal { + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + } +} +.ant-confirm .ant-modal-header { + display: none; +} +.ant-confirm .ant-modal-close { + display: none; +} +.ant-confirm .ant-modal-body { + padding: 32px 32px 24px; +} +.ant-confirm-body-wrapper { + zoom: 1; +} +.ant-confirm-body-wrapper:before, +.ant-confirm-body-wrapper:after { + content: ""; + display: table; +} +.ant-confirm-body-wrapper:after { + clear: both; +} +.ant-confirm-body .ant-confirm-title { + color: rgba(0, 0, 0, 0.85); + font-weight: 500; + font-size: 16px; + line-height: 1.4; + display: block; + overflow: hidden; +} +.ant-confirm-body .ant-confirm-content { + margin-left: 38px; + font-size: 14px; + color: rgba(0, 0, 0, 0.65); + margin-top: 8px; +} +.ant-confirm-body > .anticon { + font-size: 22px; + margin-right: 16px; + float: left; +} +.ant-confirm .ant-confirm-btns { + margin-top: 24px; + float: right; +} +.ant-confirm .ant-confirm-btns button + button { + margin-left: 8px; + margin-bottom: 0; +} +.ant-confirm-error .ant-confirm-body > .anticon { + color: #f5222d; +} +.ant-confirm-warning .ant-confirm-body > .anticon, +.ant-confirm-confirm .ant-confirm-body > .anticon { + color: #faad14; +} +.ant-confirm-info .ant-confirm-body > .anticon { + color: #1890ff; +} +.ant-confirm-success .ant-confirm-body > .anticon { + color: #52c41a; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-notification { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + position: fixed; + z-index: 1010; + width: 384px; + max-width: calc(100vw - 32px); + margin-right: 24px; +} +.ant-notification-topLeft, +.ant-notification-bottomLeft { + margin-left: 24px; + margin-right: 0; +} +.ant-notification-topLeft .ant-notification-fade-enter.ant-notification-fade-enter-active, +.ant-notification-bottomLeft .ant-notification-fade-enter.ant-notification-fade-enter-active, +.ant-notification-topLeft .ant-notification-fade-appear.ant-notification-fade-appear-active, +.ant-notification-bottomLeft .ant-notification-fade-appear.ant-notification-fade-appear-active { + -webkit-animation-name: NotificationLeftFadeIn; + animation-name: NotificationLeftFadeIn; +} +.ant-notification-close-icon { + font-size: 14px; + cursor: pointer; +} +.ant-notification-notice { + padding: 16px 24px; + border-radius: 4px; + -webkit-box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + background: #fff; + line-height: 1.5; + position: relative; + margin-bottom: 16px; + overflow: hidden; +} +.ant-notification-notice-message { + font-size: 16px; + color: rgba(0, 0, 0, 0.85); + margin-bottom: 8px; + line-height: 24px; + display: inline-block; +} +.ant-notification-notice-message-single-line-auto-margin { + width: calc(384px - 24px * 2 - 24px - 48px - 100%); + background-color: transparent; + pointer-events: none; + display: block; + max-width: 4px; +} +.ant-notification-notice-message-single-line-auto-margin:before { + content: ''; + display: block; +} +.ant-notification-notice-description { + font-size: 14px; +} +.ant-notification-notice-closable .ant-notification-notice-message { + padding-right: 24px; +} +.ant-notification-notice-with-icon .ant-notification-notice-message { + font-size: 16px; + margin-left: 48px; + margin-bottom: 4px; +} +.ant-notification-notice-with-icon .ant-notification-notice-description { + margin-left: 48px; + font-size: 14px; +} +.ant-notification-notice-icon { + position: absolute; + font-size: 24px; + line-height: 24px; + margin-left: 4px; +} +.ant-notification-notice-icon-success { + color: #52c41a; +} +.ant-notification-notice-icon-info { + color: #1890ff; +} +.ant-notification-notice-icon-warning { + color: #faad14; +} +.ant-notification-notice-icon-error { + color: #f5222d; +} +.ant-notification-notice-close { + position: absolute; + right: 22px; + top: 16px; + color: rgba(0, 0, 0, 0.45); + outline: none; +} +a.ant-notification-notice-close:focus { + text-decoration: none; +} +.ant-notification-notice-close:hover { + color: rgba(0, 0, 0, 0.67); +} +.ant-notification-notice-btn { + float: right; + margin-top: 16px; +} +.ant-notification .notification-fade-effect { + -webkit-animation-duration: 0.24s; + animation-duration: 0.24s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1); + animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1); +} +.ant-notification-fade-enter, +.ant-notification-fade-appear { + opacity: 0; + -webkit-animation-duration: 0.24s; + animation-duration: 0.24s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1); + animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1); + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.ant-notification-fade-leave { + -webkit-animation-duration: 0.24s; + animation-duration: 0.24s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + -webkit-animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1); + animation-timing-function: cubic-bezier(0.645, 0.045, 0.355, 1); + -webkit-animation-duration: 0.2s; + animation-duration: 0.2s; + -webkit-animation-play-state: paused; + animation-play-state: paused; +} +.ant-notification-fade-enter.ant-notification-fade-enter-active, +.ant-notification-fade-appear.ant-notification-fade-appear-active { + -webkit-animation-name: NotificationFadeIn; + animation-name: NotificationFadeIn; + -webkit-animation-play-state: running; + animation-play-state: running; +} +.ant-notification-fade-leave.ant-notification-fade-leave-active { + -webkit-animation-name: NotificationFadeOut; + animation-name: NotificationFadeOut; + -webkit-animation-play-state: running; + animation-play-state: running; +} +@-webkit-keyframes NotificationFadeIn { + 0% { + opacity: 0; + left: 384px; + } + 100% { + left: 0; + opacity: 1; + } +} +@keyframes NotificationFadeIn { + 0% { + opacity: 0; + left: 384px; + } + 100% { + left: 0; + opacity: 1; + } +} +@-webkit-keyframes NotificationLeftFadeIn { + 0% { + opacity: 0; + right: 384px; + } + 100% { + right: 0; + opacity: 1; + } +} +@keyframes NotificationLeftFadeIn { + 0% { + opacity: 0; + right: 384px; + } + 100% { + right: 0; + opacity: 1; + } +} +@-webkit-keyframes NotificationFadeOut { + 0% { + opacity: 1; + margin-bottom: 16px; + padding-top: 16px 24px; + padding-bottom: 16px 24px; + max-height: 150px; + } + 100% { + opacity: 0; + margin-bottom: 0; + padding-top: 0; + padding-bottom: 0; + max-height: 0; + } +} +@keyframes NotificationFadeOut { + 0% { + opacity: 1; + margin-bottom: 16px; + padding-top: 16px 24px; + padding-bottom: 16px 24px; + max-height: 150px; + } + 100% { + opacity: 0; + margin-bottom: 0; + padding-top: 0; + padding-bottom: 0; + max-height: 0; + } +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-popover { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + position: absolute; + top: 0; + left: 0; + z-index: 1030; + cursor: auto; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + white-space: normal; + font-weight: normal; + text-align: left; +} +.ant-popover:after { + content: ""; + position: absolute; + background: rgba(255, 255, 255, 0.01); +} +.ant-popover-hidden { + display: none; +} +.ant-popover-placement-top, +.ant-popover-placement-topLeft, +.ant-popover-placement-topRight { + padding-bottom: 10px; +} +.ant-popover-placement-right, +.ant-popover-placement-rightTop, +.ant-popover-placement-rightBottom { + padding-left: 10px; +} +.ant-popover-placement-bottom, +.ant-popover-placement-bottomLeft, +.ant-popover-placement-bottomRight { + padding-top: 10px; +} +.ant-popover-placement-left, +.ant-popover-placement-leftTop, +.ant-popover-placement-leftBottom { + padding-right: 10px; +} +.ant-popover-inner { + background-color: #fff; + background-clip: padding-box; + border-radius: 4px; + -webkit-box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} +.ant-popover-title { + min-width: 177px; + margin: 0; + padding: 5px 16px 4px; + min-height: 32px; + border-bottom: 1px solid #e8e8e8; + color: rgba(0, 0, 0, 0.85); + font-weight: 500; +} +.ant-popover-inner-content { + padding: 12px 16px; + color: rgba(0, 0, 0, 0.65); +} +.ant-popover-message { + padding: 4px 0 12px; + font-size: 14px; + color: rgba(0, 0, 0, 0.65); + position: relative; +} +.ant-popover-message > .anticon { + position: absolute; + top: 8px; + color: #faad14; + font-size: 14px; +} +.ant-popover-message-title { + padding-left: 22px; +} +.ant-popover-buttons { + text-align: right; + margin-bottom: 4px; +} +.ant-popover-buttons button { + margin-left: 8px; +} +.ant-popover-arrow { + background: #fff; + width: 8.48528137px; + height: 8.48528137px; + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + position: absolute; + display: block; + border-color: transparent; + border-style: solid; +} +.ant-popover-placement-top > .ant-popover-content > .ant-popover-arrow, +.ant-popover-placement-topLeft > .ant-popover-content > .ant-popover-arrow, +.ant-popover-placement-topRight > .ant-popover-content > .ant-popover-arrow { + bottom: 5.5px; + -webkit-box-shadow: 3px 3px 7px rgba(0, 0, 0, 0.07); + box-shadow: 3px 3px 7px rgba(0, 0, 0, 0.07); +} +.ant-popover-placement-top > .ant-popover-content > .ant-popover-arrow { + left: 50%; + -webkit-transform: translateX(-50%) rotate(45deg); + -ms-transform: translateX(-50%) rotate(45deg); + transform: translateX(-50%) rotate(45deg); +} +.ant-popover-placement-topLeft > .ant-popover-content > .ant-popover-arrow { + left: 16px; +} +.ant-popover-placement-topRight > .ant-popover-content > .ant-popover-arrow { + right: 16px; +} +.ant-popover-placement-right > .ant-popover-content > .ant-popover-arrow, +.ant-popover-placement-rightTop > .ant-popover-content > .ant-popover-arrow, +.ant-popover-placement-rightBottom > .ant-popover-content > .ant-popover-arrow { + left: 6px; + -webkit-box-shadow: -3px 3px 7px rgba(0, 0, 0, 0.07); + box-shadow: -3px 3px 7px rgba(0, 0, 0, 0.07); +} +.ant-popover-placement-right > .ant-popover-content > .ant-popover-arrow { + top: 50%; + -webkit-transform: translateY(-50%) rotate(45deg); + -ms-transform: translateY(-50%) rotate(45deg); + transform: translateY(-50%) rotate(45deg); +} +.ant-popover-placement-rightTop > .ant-popover-content > .ant-popover-arrow { + top: 12px; +} +.ant-popover-placement-rightBottom > .ant-popover-content > .ant-popover-arrow { + bottom: 12px; +} +.ant-popover-placement-bottom > .ant-popover-content > .ant-popover-arrow, +.ant-popover-placement-bottomLeft > .ant-popover-content > .ant-popover-arrow, +.ant-popover-placement-bottomRight > .ant-popover-content > .ant-popover-arrow { + top: 6px; + -webkit-box-shadow: -2px -2px 5px rgba(0, 0, 0, 0.06); + box-shadow: -2px -2px 5px rgba(0, 0, 0, 0.06); +} +.ant-popover-placement-bottom > .ant-popover-content > .ant-popover-arrow { + left: 50%; + -webkit-transform: translateX(-50%) rotate(45deg); + -ms-transform: translateX(-50%) rotate(45deg); + transform: translateX(-50%) rotate(45deg); +} +.ant-popover-placement-bottomLeft > .ant-popover-content > .ant-popover-arrow { + left: 16px; +} +.ant-popover-placement-bottomRight > .ant-popover-content > .ant-popover-arrow { + right: 16px; +} +.ant-popover-placement-left > .ant-popover-content > .ant-popover-arrow, +.ant-popover-placement-leftTop > .ant-popover-content > .ant-popover-arrow, +.ant-popover-placement-leftBottom > .ant-popover-content > .ant-popover-arrow { + right: 6px; + -webkit-box-shadow: 3px -3px 7px rgba(0, 0, 0, 0.07); + box-shadow: 3px -3px 7px rgba(0, 0, 0, 0.07); +} +.ant-popover-placement-left > .ant-popover-content > .ant-popover-arrow { + top: 50%; + -webkit-transform: translateY(-50%) rotate(45deg); + -ms-transform: translateY(-50%) rotate(45deg); + transform: translateY(-50%) rotate(45deg); +} +.ant-popover-placement-leftTop > .ant-popover-content > .ant-popover-arrow { + top: 12px; +} +.ant-popover-placement-leftBottom > .ant-popover-content > .ant-popover-arrow { + bottom: 12px; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-progress { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + display: inline-block; +} +.ant-progress-line { + width: 100%; + font-size: 14px; + position: relative; +} +.ant-progress-small.ant-progress-line, +.ant-progress-small.ant-progress-line .ant-progress-text .anticon { + font-size: 12px; +} +.ant-progress-outer { + display: inline-block; + width: 100%; + margin-right: 0; + padding-right: 0; +} +.ant-progress-show-info .ant-progress-outer { + padding-right: calc(2em + 8px); + margin-right: calc(-2em - 8px); +} +.ant-progress-inner { + display: inline-block; + width: 100%; + background-color: #f5f5f5; + border-radius: 100px; + vertical-align: middle; + position: relative; +} +.ant-progress-circle-trail { + stroke: #f5f5f5; +} +.ant-progress-circle-path { + stroke: #1890ff; + -webkit-animation: ant-progress-appear 0.3s; + animation: ant-progress-appear 0.3s; +} +.ant-progress-success-bg, +.ant-progress-bg { + background-color: #1890ff; + -webkit-transition: all 0.4s cubic-bezier(0.08, 0.82, 0.17, 1) 0s; + transition: all 0.4s cubic-bezier(0.08, 0.82, 0.17, 1) 0s; + position: relative; +} +.ant-progress-success-bg { + background-color: #52c41a; + position: absolute; + top: 0; + left: 0; +} +.ant-progress-text { + word-break: normal; + width: 2em; + text-align: left; + font-size: 1em; + margin-left: 8px; + vertical-align: middle; + display: inline-block; + white-space: nowrap; + color: rgba(0, 0, 0, 0.45); + line-height: 1; +} +.ant-progress-text .anticon { + font-size: 14px; +} +.ant-progress-status-active .ant-progress-bg:before { + content: ""; + opacity: 0; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: #fff; + border-radius: 10px; + -webkit-animation: ant-progress-active 2.4s cubic-bezier(0.23, 1, 0.32, 1) infinite; + animation: ant-progress-active 2.4s cubic-bezier(0.23, 1, 0.32, 1) infinite; +} +.ant-progress-status-exception .ant-progress-bg { + background-color: #f5222d; +} +.ant-progress-status-exception .ant-progress-text { + color: #f5222d; +} +.ant-progress-status-exception .ant-progress-circle-path { + stroke: #f5222d; +} +.ant-progress-status-success .ant-progress-bg { + background-color: #52c41a; +} +.ant-progress-status-success .ant-progress-text { + color: #52c41a; +} +.ant-progress-status-success .ant-progress-circle-path { + stroke: #52c41a; +} +.ant-progress-circle .ant-progress-inner { + position: relative; + line-height: 1; + background-color: transparent; +} +.ant-progress-circle .ant-progress-text { + display: block; + position: absolute; + width: 100%; + text-align: center; + line-height: 1; + top: 50%; + -webkit-transform: translateY(-50%); + -ms-transform: translateY(-50%); + transform: translateY(-50%); + left: 0; + margin: 0; + color: rgba(0, 0, 0, 0.65); +} +.ant-progress-circle .ant-progress-text .anticon { + font-size: 1.16666667em; +} +.ant-progress-circle.ant-progress-status-exception .ant-progress-text { + color: #f5222d; +} +.ant-progress-circle.ant-progress-status-success .ant-progress-text { + color: #52c41a; +} +@-webkit-keyframes ant-progress-active { + 0% { + opacity: 0.1; + width: 0; + } + 20% { + opacity: 0.5; + width: 0; + } + 100% { + opacity: 0; + width: 100%; + } +} +@keyframes ant-progress-active { + 0% { + opacity: 0.1; + width: 0; + } + 20% { + opacity: 0.5; + width: 0; + } + 100% { + opacity: 0; + width: 100%; + } +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-rate { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + line-height: unset; + margin: 0; + padding: 0; + list-style: none; + font-size: 20px; + display: inline-block; + color: #fadb14; + outline: none; +} +.ant-rate-disabled .ant-rate-star { + cursor: default; +} +.ant-rate-disabled .ant-rate-star:hover { + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); +} +.ant-rate-star { + margin: 0; + padding: 0; + display: inline-block; + margin-right: 8px; + position: relative; + -webkit-transition: all .3s; + transition: all .3s; + color: inherit; + cursor: pointer; +} +.ant-rate-star:focus { + outline: 0; +} +.ant-rate-star-first, +.ant-rate-star-second { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-transition: all .3s; + transition: all .3s; + color: #e8e8e8; +} +.ant-rate-star-first .anticon, +.ant-rate-star-second .anticon { + vertical-align: middle; +} +.ant-rate-star:hover, +.ant-rate-star:focus { + -webkit-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); +} +.ant-rate-star-first { + position: absolute; + left: 0; + top: 0; + width: 50%; + height: 100%; + overflow: hidden; + opacity: 0; +} +.ant-rate-star-half .ant-rate-star-first, +.ant-rate-star-half .ant-rate-star-second { + opacity: 1; +} +.ant-rate-star-half .ant-rate-star-first, +.ant-rate-star-full .ant-rate-star-second { + color: inherit; +} +.ant-rate-text { + margin-left: 8px; + display: inline-block; + font-size: 14px; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-skeleton { + display: table; + width: 100%; +} +.ant-skeleton-header { + display: table-cell; + vertical-align: top; + padding-right: 16px; +} +.ant-skeleton-header .ant-skeleton-avatar { + display: inline-block; + vertical-align: top; + background: #f2f2f2; + width: 32px; + height: 32px; + line-height: 32px; +} +.ant-skeleton-header .ant-skeleton-avatar.ant-skeleton-avatar-circle { + border-radius: 50%; +} +.ant-skeleton-header .ant-skeleton-avatar-lg { + width: 40px; + height: 40px; + line-height: 40px; +} +.ant-skeleton-header .ant-skeleton-avatar-lg.ant-skeleton-avatar-circle { + border-radius: 50%; +} +.ant-skeleton-header .ant-skeleton-avatar-sm { + width: 24px; + height: 24px; + line-height: 24px; +} +.ant-skeleton-header .ant-skeleton-avatar-sm.ant-skeleton-avatar-circle { + border-radius: 50%; +} +.ant-skeleton-content { + display: table-cell; + vertical-align: top; + width: 100%; +} +.ant-skeleton-content .ant-skeleton-title { + margin-top: 16px; + height: 16px; + width: 100%; + background: #f2f2f2; +} +.ant-skeleton-content .ant-skeleton-title + .ant-skeleton-paragraph { + margin-top: 24px; +} +.ant-skeleton-content .ant-skeleton-paragraph > li { + height: 16px; + background: #f2f2f2; + list-style: none; + width: 100%; +} +.ant-skeleton-content .ant-skeleton-paragraph > li:last-child:not(:first-child):not(:nth-child(2)) { + width: 61%; +} +.ant-skeleton-content .ant-skeleton-paragraph > li + li { + margin-top: 16px; +} +.ant-skeleton-with-avatar .ant-skeleton-content .ant-skeleton-title { + margin-top: 12px; +} +.ant-skeleton-with-avatar .ant-skeleton-content .ant-skeleton-title + .ant-skeleton-paragraph { + margin-top: 28px; +} +.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-title, +.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-paragraph > li { + background: -webkit-gradient(linear, left top, right top, color-stop(25%, #f2f2f2), color-stop(37%, #e6e6e6), color-stop(63%, #f2f2f2)); + background: -webkit-linear-gradient(left, #f2f2f2 25%, #e6e6e6 37%, #f2f2f2 63%); + background: linear-gradient(90deg, #f2f2f2 25%, #e6e6e6 37%, #f2f2f2 63%); + -webkit-animation: ant-skeleton-loading 1.4s ease infinite; + animation: ant-skeleton-loading 1.4s ease infinite; + background-size: 400% 100%; +} +.ant-skeleton.ant-skeleton-active .ant-skeleton-avatar { + background: -webkit-gradient(linear, left top, right top, color-stop(25%, #f2f2f2), color-stop(37%, #e6e6e6), color-stop(63%, #f2f2f2)); + background: -webkit-linear-gradient(left, #f2f2f2 25%, #e6e6e6 37%, #f2f2f2 63%); + background: linear-gradient(90deg, #f2f2f2 25%, #e6e6e6 37%, #f2f2f2 63%); + -webkit-animation: ant-skeleton-loading 1.4s ease infinite; + animation: ant-skeleton-loading 1.4s ease infinite; + background-size: 400% 100%; +} +@-webkit-keyframes ant-skeleton-loading { + 0% { + background-position: 100% 50%; + } + 100% { + background-position: 0 50%; + } +} +@keyframes ant-skeleton-loading { + 0% { + background-position: 100% 50%; + } + 100% { + background-position: 0 50%; + } +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-slider { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + position: relative; + margin: 14px 6px 10px; + padding: 4px 0; + height: 12px; + cursor: pointer; +} +.ant-slider-vertical { + width: 12px; + height: 100%; + margin: 6px 10px; + padding: 0 4px; +} +.ant-slider-vertical .ant-slider-rail { + height: 100%; + width: 4px; +} +.ant-slider-vertical .ant-slider-track { + width: 4px; +} +.ant-slider-vertical .ant-slider-handle { + margin-left: -5px; + margin-bottom: -7px; +} +.ant-slider-vertical .ant-slider-mark { + top: 0; + left: 12px; + width: 18px; + height: 100%; +} +.ant-slider-vertical .ant-slider-mark-text { + left: 4px; + white-space: nowrap; +} +.ant-slider-vertical .ant-slider-step { + width: 4px; + height: 100%; +} +.ant-slider-vertical .ant-slider-dot { + top: auto; + left: 2px; + margin-bottom: -4px; +} +.ant-slider-with-marks { + margin-bottom: 28px; +} +.ant-slider-rail { + position: absolute; + width: 100%; + height: 4px; + border-radius: 2px; + background-color: #f5f5f5; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; +} +.ant-slider-track { + position: absolute; + height: 4px; + border-radius: 4px; + background-color: #91d5ff; + -webkit-transition: background-color 0.3s ease; + transition: background-color 0.3s ease; +} +.ant-slider-handle { + position: absolute; + margin-left: -7px; + margin-top: -5px; + width: 14px; + height: 14px; + cursor: pointer; + border-radius: 50%; + border: solid 2px #91d5ff; + background-color: #fff; + -webkit-transition: border-color 0.3s, -webkit-transform 0.3s cubic-bezier(0.18, 0.89, 0.32, 1.28); + transition: border-color 0.3s, -webkit-transform 0.3s cubic-bezier(0.18, 0.89, 0.32, 1.28); + transition: border-color 0.3s, transform 0.3s cubic-bezier(0.18, 0.89, 0.32, 1.28); + transition: border-color 0.3s, transform 0.3s cubic-bezier(0.18, 0.89, 0.32, 1.28), -webkit-transform 0.3s cubic-bezier(0.18, 0.89, 0.32, 1.28); +} +.ant-slider-handle:focus { + border-color: #46a6ff; + -webkit-box-shadow: 0 0 0 5px #8cc8ff; + box-shadow: 0 0 0 5px #8cc8ff; + outline: none; +} +.ant-slider-handle.ant-tooltip-open { + border-color: #1890ff; +} +.ant-slider:hover .ant-slider-rail { + background-color: #e1e1e1; +} +.ant-slider:hover .ant-slider-track { + background-color: #69c0ff; +} +.ant-slider:hover .ant-slider-handle:not(.ant-tooltip-open) { + border-color: #69c0ff; +} +.ant-slider-mark { + position: absolute; + top: 14px; + left: 0; + width: 100%; + font-size: 14px; +} +.ant-slider-mark-text { + position: absolute; + display: inline-block; + vertical-align: middle; + text-align: center; + cursor: pointer; + color: rgba(0, 0, 0, 0.45); +} +.ant-slider-mark-text-active { + color: rgba(0, 0, 0, 0.65); +} +.ant-slider-step { + position: absolute; + width: 100%; + height: 4px; + background: transparent; +} +.ant-slider-dot { + position: absolute; + top: -2px; + margin-left: -4px; + width: 8px; + height: 8px; + border: 2px solid #e8e8e8; + background-color: #fff; + cursor: pointer; + border-radius: 50%; + vertical-align: middle; +} +.ant-slider-dot:first-child { + margin-left: -4px; +} +.ant-slider-dot:last-child { + margin-left: -4px; +} +.ant-slider-dot-active { + border-color: #8cc8ff; +} +.ant-slider-disabled { + cursor: not-allowed; +} +.ant-slider-disabled .ant-slider-track { + background-color: rgba(0, 0, 0, 0.25) !important; +} +.ant-slider-disabled .ant-slider-handle, +.ant-slider-disabled .ant-slider-dot { + border-color: rgba(0, 0, 0, 0.25) !important; + background-color: #fff; + cursor: not-allowed; + -webkit-box-shadow: none; + box-shadow: none; +} +.ant-slider-disabled .ant-slider-mark-text, +.ant-slider-disabled .ant-slider-dot { + cursor: not-allowed !important; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-steps { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + font-size: 0; + width: 100%; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; +} +.ant-steps-item { + position: relative; + display: inline-block; + vertical-align: top; + -webkit-box-flex: 1; + -webkit-flex: 1; + -ms-flex: 1; + flex: 1; + overflow: hidden; +} +.ant-steps-item:last-child { + -webkit-box-flex: 0; + -webkit-flex: none; + -ms-flex: none; + flex: none; +} +.ant-steps-item:last-child .ant-steps-item-tail, +.ant-steps-item:last-child .ant-steps-item-title:after { + display: none; +} +.ant-steps-item-icon, +.ant-steps-item-content { + display: inline-block; + vertical-align: top; +} +.ant-steps-item-icon { + border: 1px solid rgba(0, 0, 0, 0.25); + width: 32px; + height: 32px; + line-height: 32px; + text-align: center; + border-radius: 32px; + font-size: 16px; + margin-right: 8px; + -webkit-transition: background-color 0.3s, border-color 0.3s; + transition: background-color 0.3s, border-color 0.3s; + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; +} +.ant-steps-item-icon > .ant-steps-icon { + line-height: 1; + top: -1px; + color: #1890ff; + position: relative; +} +.ant-steps-item-tail { + position: absolute; + left: 0; + width: 100%; + top: 12px; + padding: 0 10px; +} +.ant-steps-item-tail:after { + content: ''; + display: inline-block; + background: #e8e8e8; + height: 1px; + border-radius: 1px; + width: 100%; + -webkit-transition: background .3s; + transition: background .3s; +} +.ant-steps-item-title { + font-size: 16px; + color: rgba(0, 0, 0, 0.65); + display: inline-block; + padding-right: 16px; + position: relative; + line-height: 32px; +} +.ant-steps-item-title:after { + content: ''; + height: 1px; + width: 9999px; + background: #e8e8e8; + display: block; + position: absolute; + top: 16px; + left: 100%; +} +.ant-steps-item-description { + font-size: 14px; + color: rgba(0, 0, 0, 0.45); +} +.ant-steps-item-wait .ant-steps-item-icon { + border-color: rgba(0, 0, 0, 0.25); + background-color: #fff; +} +.ant-steps-item-wait .ant-steps-item-icon > .ant-steps-icon { + color: rgba(0, 0, 0, 0.25); +} +.ant-steps-item-wait .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot { + background: rgba(0, 0, 0, 0.25); +} +.ant-steps-item-wait > .ant-steps-item-content > .ant-steps-item-title { + color: rgba(0, 0, 0, 0.45); +} +.ant-steps-item-wait > .ant-steps-item-content > .ant-steps-item-title:after { + background-color: #e8e8e8; +} +.ant-steps-item-wait > .ant-steps-item-content > .ant-steps-item-description { + color: rgba(0, 0, 0, 0.45); +} +.ant-steps-item-wait > .ant-steps-item-tail:after { + background-color: #e8e8e8; +} +.ant-steps-item-process .ant-steps-item-icon { + border-color: #1890ff; + background-color: #fff; +} +.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon { + color: #1890ff; +} +.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot { + background: #1890ff; +} +.ant-steps-item-process > .ant-steps-item-content > .ant-steps-item-title { + color: rgba(0, 0, 0, 0.85); +} +.ant-steps-item-process > .ant-steps-item-content > .ant-steps-item-title:after { + background-color: #e8e8e8; +} +.ant-steps-item-process > .ant-steps-item-content > .ant-steps-item-description { + color: rgba(0, 0, 0, 0.65); +} +.ant-steps-item-process > .ant-steps-item-tail:after { + background-color: #e8e8e8; +} +.ant-steps-item-process .ant-steps-item-icon { + background: #1890ff; +} +.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon { + color: #fff; +} +.ant-steps-item-process .ant-steps-item-title { + font-weight: 500; +} +.ant-steps-item-finish .ant-steps-item-icon { + border-color: #1890ff; + background-color: #fff; +} +.ant-steps-item-finish .ant-steps-item-icon > .ant-steps-icon { + color: #1890ff; +} +.ant-steps-item-finish .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot { + background: #1890ff; +} +.ant-steps-item-finish > .ant-steps-item-content > .ant-steps-item-title { + color: rgba(0, 0, 0, 0.65); +} +.ant-steps-item-finish > .ant-steps-item-content > .ant-steps-item-title:after { + background-color: #1890ff; +} +.ant-steps-item-finish > .ant-steps-item-content > .ant-steps-item-description { + color: rgba(0, 0, 0, 0.45); +} +.ant-steps-item-finish > .ant-steps-item-tail:after { + background-color: #1890ff; +} +.ant-steps-item-error .ant-steps-item-icon { + border-color: #f5222d; + background-color: #fff; +} +.ant-steps-item-error .ant-steps-item-icon > .ant-steps-icon { + color: #f5222d; +} +.ant-steps-item-error .ant-steps-item-icon > .ant-steps-icon .ant-steps-icon-dot { + background: #f5222d; +} +.ant-steps-item-error > .ant-steps-item-content > .ant-steps-item-title { + color: #f5222d; +} +.ant-steps-item-error > .ant-steps-item-content > .ant-steps-item-title:after { + background-color: #e8e8e8; +} +.ant-steps-item-error > .ant-steps-item-content > .ant-steps-item-description { + color: #f5222d; +} +.ant-steps-item-error > .ant-steps-item-tail:after { + background-color: #e8e8e8; +} +.ant-steps-item.ant-steps-next-error .ant-steps-item-title:after { + background: #f5222d; +} +.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item { + margin-right: 16px; + white-space: nowrap; +} +.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child { + margin-right: 0; +} +.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child .ant-steps-item-title { + padding-right: 0; +} +.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item-tail { + display: none; +} +.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item-description { + max-width: 140px; + white-space: normal; +} +.ant-steps-item-custom .ant-steps-item-icon { + background: none; + border: 0; + width: auto; + height: auto; +} +.ant-steps-item-custom .ant-steps-item-icon > .ant-steps-icon { + font-size: 24px; + line-height: 32px; + top: 0; + left: 0.5px; + width: 32px; + height: 32px; +} +.ant-steps-item-custom.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon { + color: #1890ff; +} +.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item { + margin-right: 12px; +} +.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child { + margin-right: 0; +} +.ant-steps-small .ant-steps-item-icon { + width: 24px; + height: 24px; + line-height: 24px; + text-align: center; + border-radius: 24px; + font-size: 12px; +} +.ant-steps-small .ant-steps-item-title { + font-size: 14px; + line-height: 24px; + padding-right: 12px; +} +.ant-steps-small .ant-steps-item-title:after { + top: 12px; +} +.ant-steps-small .ant-steps-item-description { + font-size: 14px; + color: rgba(0, 0, 0, 0.45); +} +.ant-steps-small .ant-steps-item-tail { + top: 8px; + padding: 0 8px; +} +.ant-steps-small .ant-steps-item-custom .ant-steps-item-icon { + width: inherit; + height: inherit; + line-height: inherit; + border-radius: 0; + border: 0; + background: none; +} +.ant-steps-small .ant-steps-item-custom .ant-steps-item-icon > .ant-steps-icon { + font-size: 24px; + line-height: 24px; + -webkit-transform: none; + -ms-transform: none; + transform: none; +} +.ant-steps-vertical { + display: block; +} +.ant-steps-vertical .ant-steps-item { + display: block; + overflow: visible; +} +.ant-steps-vertical .ant-steps-item-icon { + float: left; + margin-right: 16px; +} +.ant-steps-vertical .ant-steps-item-content { + min-height: 48px; + overflow: hidden; + display: block; +} +.ant-steps-vertical .ant-steps-item-title { + line-height: 32px; +} +.ant-steps-vertical .ant-steps-item-description { + padding-bottom: 12px; +} +.ant-steps-vertical > .ant-steps-item > .ant-steps-item-tail { + position: absolute; + left: 16px; + top: 0; + height: 100%; + width: 1px; + padding: 38px 0 6px; +} +.ant-steps-vertical > .ant-steps-item > .ant-steps-item-tail:after { + height: 100%; + width: 1px; +} +.ant-steps-vertical > .ant-steps-item:not(:last-child) > .ant-steps-item-tail { + display: block; +} +.ant-steps-vertical > .ant-steps-item > .ant-steps-item-content > .ant-steps-item-title:after { + display: none; +} +.ant-steps-vertical.ant-steps-small .ant-steps-item-tail { + position: absolute; + left: 12px; + top: 0; + padding: 30px 0 6px; +} +.ant-steps-vertical.ant-steps-small .ant-steps-item-title { + line-height: 24px; +} +@media (max-width: 480px) { + .ant-steps-horizontal.ant-steps-label-horizontal { + display: block; + } + .ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item { + display: block; + overflow: visible; + } + .ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item-icon { + float: left; + margin-right: 16px; + } + .ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item-content { + min-height: 48px; + overflow: hidden; + display: block; + } + .ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item-title { + line-height: 32px; + } + .ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item-description { + padding-bottom: 12px; + } + .ant-steps-horizontal.ant-steps-label-horizontal > .ant-steps-item > .ant-steps-item-tail { + position: absolute; + left: 16px; + top: 0; + height: 100%; + width: 1px; + padding: 38px 0 6px; + } + .ant-steps-horizontal.ant-steps-label-horizontal > .ant-steps-item > .ant-steps-item-tail:after { + height: 100%; + width: 1px; + } + .ant-steps-horizontal.ant-steps-label-horizontal > .ant-steps-item:not(:last-child) > .ant-steps-item-tail { + display: block; + } + .ant-steps-horizontal.ant-steps-label-horizontal > .ant-steps-item > .ant-steps-item-content > .ant-steps-item-title:after { + display: none; + } + .ant-steps-horizontal.ant-steps-label-horizontal.ant-steps-small .ant-steps-item-tail { + position: absolute; + left: 12px; + top: 0; + padding: 30px 0 6px; + } + .ant-steps-horizontal.ant-steps-label-horizontal.ant-steps-small .ant-steps-item-title { + line-height: 24px; + } +} +.ant-steps-label-vertical .ant-steps-item { + overflow: visible; +} +.ant-steps-label-vertical .ant-steps-item-tail { + padding: 0 24px; + margin-left: 48px; +} +.ant-steps-label-vertical .ant-steps-item-content { + display: block; + text-align: center; + margin-top: 8px; + width: 104px; +} +.ant-steps-label-vertical .ant-steps-item-icon { + display: inline-block; + margin-left: 36px; +} +.ant-steps-label-vertical .ant-steps-item-title { + padding-right: 0; +} +.ant-steps-label-vertical .ant-steps-item-title:after { + display: none; +} +.ant-steps-dot .ant-steps-item-title { + line-height: 1.5; +} +.ant-steps-dot .ant-steps-item-tail { + width: 100%; + top: 2px; + margin: 0 0 0 70px; + padding: 0; +} +.ant-steps-dot .ant-steps-item-tail:after { + height: 3px; + width: calc(100% - 20px); + margin-left: 12px; +} +.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot { + left: 2px; +} +.ant-steps-dot .ant-steps-item-icon { + padding-right: 0; + width: 8px; + height: 8px; + line-height: 8px; + border: 0; + margin-left: 67px; + background: transparent; +} +.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot { + float: left; + width: 100%; + height: 100%; + border-radius: 100px; + position: relative; + -webkit-transition: all .3s; + transition: all .3s; + /* expand hover area */ +} +.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot:after { + content: ""; + background: rgba(0, 0, 0, 0.001); + width: 60px; + height: 32px; + position: absolute; + top: -12px; + left: -26px; +} +.ant-steps-dot .ant-steps-item-content { + width: 140px; +} +.ant-steps-dot .ant-steps-item-process .ant-steps-item-icon { + width: 10px; + height: 10px; + line-height: 10px; +} +.ant-steps-dot .ant-steps-item-process .ant-steps-item-icon .ant-steps-icon-dot { + top: -1px; +} +.ant-steps-vertical.ant-steps-dot .ant-steps-item-icon { + margin-left: 0; + margin-top: 8px; +} +.ant-steps-vertical.ant-steps-dot .ant-steps-item-tail { + margin: 0; + left: -9px; + top: 2px; + padding: 22px 0 4px; +} +.ant-steps-vertical.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot { + left: 0; +} +.ant-steps-vertical.ant-steps-dot .ant-steps-item-process .ant-steps-icon-dot { + left: -2px; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-switch { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + margin: 0; + padding: 0; + list-style: none; + position: relative; + display: inline-block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + height: 22px; + min-width: 44px; + line-height: 20px; + vertical-align: middle; + border-radius: 100px; + border: 1px solid transparent; + background-color: rgba(0, 0, 0, 0.25); + cursor: pointer; + -webkit-transition: all 0.36s; + transition: all 0.36s; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.ant-switch-inner { + color: #fff; + font-size: 12px; + margin-left: 24px; + margin-right: 6px; + display: block; +} +.ant-switch-loading-icon, +.ant-switch:after { + position: absolute; + width: 18px; + height: 18px; + left: 1px; + top: 1px; + border-radius: 18px; + background-color: #fff; + content: " "; + cursor: pointer; + -webkit-transition: all 0.36s cubic-bezier(0.78, 0.14, 0.15, 0.86); + transition: all 0.36s cubic-bezier(0.78, 0.14, 0.15, 0.86); +} +.ant-switch:after { + -webkit-box-shadow: 0 2px 4px 0 rgba(0, 35, 11, 0.2); + box-shadow: 0 2px 4px 0 rgba(0, 35, 11, 0.2); +} +.ant-switch:active:before, +.ant-switch:active:after { + width: 24px; +} +.ant-switch-loading-icon { + background: transparent; + z-index: 1; + display: none; + font-size: 12px; +} +.ant-switch-loading-icon svg { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + margin: auto; +} +.ant-switch-loading .ant-switch-loading-icon { + display: inline-block; + color: rgba(0, 0, 0, 0.65); +} +.ant-switch-checked.ant-switch-loading .ant-switch-loading-icon { + color: #1890ff; +} +.ant-switch:focus { + -webkit-box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + outline: 0; +} +.ant-switch:focus:hover { + -webkit-box-shadow: none; + box-shadow: none; +} +.ant-switch-small { + height: 16px; + min-width: 28px; + line-height: 14px; +} +.ant-switch-small .ant-switch-inner { + margin-left: 18px; + margin-right: 3px; + font-size: 12px; +} +.ant-switch-small:after { + width: 12px; + height: 12px; +} +.ant-switch-small:active:before, +.ant-switch-small:active:after { + width: 16px; +} +.ant-switch-small .ant-switch-loading-icon { + width: 12px; + height: 12px; +} +.ant-switch-small.ant-switch-checked .ant-switch-inner { + margin-left: 3px; + margin-right: 18px; +} +.ant-switch-small.ant-switch-checked .ant-switch-loading-icon { + left: 100%; + margin-left: -13px; +} +.ant-switch-small.ant-switch-loading .ant-switch-loading-icon { + -webkit-transform: scale(0.66667); + -ms-transform: scale(0.66667); + transform: scale(0.66667); + font-weight: bold; +} +.ant-switch-checked { + background-color: #1890ff; +} +.ant-switch-checked .ant-switch-inner { + margin-left: 6px; + margin-right: 24px; +} +.ant-switch-checked:after { + left: 100%; + -webkit-transform: translateX(-100%); + -ms-transform: translateX(-100%); + transform: translateX(-100%); + margin-left: -1px; +} +.ant-switch-checked .ant-switch-loading-icon { + left: 100%; + margin-left: -19px; +} +.ant-switch-loading, +.ant-switch-disabled { + pointer-events: none; + opacity: 0.4; +} +@-webkit-keyframes AntSwitchSmallLoadingCircle { + 0% { + -webkit-transform-origin: 50% 50%; + transform-origin: 50% 50%; + -webkit-transform: rotate(0deg) scale(0.66667); + transform: rotate(0deg) scale(0.66667); + } + 100% { + -webkit-transform-origin: 50% 50%; + transform-origin: 50% 50%; + -webkit-transform: rotate(360deg) scale(0.66667); + transform: rotate(360deg) scale(0.66667); + } +} +@keyframes AntSwitchSmallLoadingCircle { + 0% { + -webkit-transform-origin: 50% 50%; + transform-origin: 50% 50%; + -webkit-transform: rotate(0deg) scale(0.66667); + transform: rotate(0deg) scale(0.66667); + } + 100% { + -webkit-transform-origin: 50% 50%; + transform-origin: 50% 50%; + -webkit-transform: rotate(360deg) scale(0.66667); + transform: rotate(360deg) scale(0.66667); + } +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-table-wrapper { + zoom: 1; +} +.ant-table-wrapper:before, +.ant-table-wrapper:after { + content: ""; + display: table; +} +.ant-table-wrapper:after { + clear: both; +} +.ant-table { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + position: relative; + clear: both; +} +.ant-table-body { + -webkit-transition: opacity .3s; + transition: opacity .3s; +} +.ant-table-empty .ant-table-body { + overflow: auto !important; +} +.ant-table table { + width: 100%; + border-collapse: collapse; + text-align: left; + border-radius: 4px 4px 0 0; +} +.ant-table-thead > tr > th { + background: #fafafa; + -webkit-transition: background .3s ease; + transition: background .3s ease; + text-align: left; + color: rgba(0, 0, 0, 0.85); + font-weight: 500; + border-bottom: 1px solid #e8e8e8; +} +.ant-table-thead > tr > th[colspan] { + text-align: center; +} +.ant-table-thead > tr > th .anticon-filter, +.ant-table-thead > tr > th .ant-table-filter-icon { + position: relative; + margin-left: 8px; + font-size: 14px; + cursor: pointer; + color: rgba(0, 0, 0, 0.45); + -webkit-transition: all .3s; + transition: all .3s; + width: 14px; + font-weight: normal; + vertical-align: text-bottom; +} +.ant-table-thead > tr > th .anticon-filter:hover, +.ant-table-thead > tr > th .ant-table-filter-icon:hover { + color: rgba(0, 0, 0, 0.65); +} +.ant-table-thead > tr > th .ant-table-column-sorter + .anticon-filter { + margin-left: 4px; +} +.ant-table-thead > tr > th .ant-table-filter-selected.anticon-filter { + color: #1890ff; +} +.ant-table-thead > tr > th.ant-table-column-has-filters { + overflow: hidden; +} +.ant-table-thead > tr:first-child > th:first-child { + border-top-left-radius: 4px; +} +.ant-table-thead > tr:first-child > th:last-child { + border-top-right-radius: 4px; +} +.ant-table-thead > tr:not(:last-child) > th[colspan] { + border-bottom: 0; +} +.ant-table-tbody > tr > td { + border-bottom: 1px solid #e8e8e8; + -webkit-transition: all .3s, border 0s; + transition: all .3s, border 0s; +} +.ant-table-thead > tr, +.ant-table-tbody > tr { + -webkit-transition: all .3s, height 0s; + transition: all .3s, height 0s; +} +.ant-table-thead > tr.ant-table-row-hover > td, +.ant-table-tbody > tr.ant-table-row-hover > td, +.ant-table-thead > tr:hover > td, +.ant-table-tbody > tr:hover > td { + background: #e6f7ff; +} +.ant-table-thead > tr:hover { + background: none; +} +.ant-table-footer { + padding: 16px 16px; + background: #fafafa; + border-radius: 0 0 4px 4px; + position: relative; + border-top: 1px solid #e8e8e8; +} +.ant-table-footer:before { + content: ''; + height: 1px; + background: #fafafa; + position: absolute; + top: -1px; + width: 100%; + left: 0; +} +.ant-table.ant-table-bordered .ant-table-footer { + border: 1px solid #e8e8e8; +} +.ant-table-title { + padding: 16px 0; + position: relative; + top: 1px; + border-radius: 4px 4px 0 0; +} +.ant-table.ant-table-bordered .ant-table-title { + border: 1px solid #e8e8e8; + padding-left: 16px; + padding-right: 16px; +} +.ant-table-title + .ant-table-content { + position: relative; + border-radius: 4px 4px 0 0; + overflow: hidden; +} +.ant-table-bordered .ant-table-title + .ant-table-content, +.ant-table-bordered .ant-table-title + .ant-table-content table, +.ant-table-bordered .ant-table-title + .ant-table-content .ant-table-thead > tr:first-child > th { + border-radius: 0; +} +.ant-table-without-column-header .ant-table-title + .ant-table-content, +.ant-table-without-column-header table { + border-radius: 0; +} +.ant-table-tbody > tr.ant-table-row-selected td { + background: #fafafa; +} +.ant-table-thead > tr > th.ant-table-column-sort { + background: #f5f5f5; +} +.ant-table-thead > tr > th, +.ant-table-tbody > tr > td { + padding: 16px 16px; + word-break: break-word; + -ms-word-break: break-all; +} +.ant-table-thead > tr > th.ant-table-selection-column-custom { + padding-left: 16px; + padding-right: 0; +} +.ant-table-thead > tr > th.ant-table-selection-column, +.ant-table-tbody > tr > td.ant-table-selection-column { + text-align: center; + min-width: 62px; + width: 62px; +} +.ant-table-thead > tr > th.ant-table-selection-column .ant-radio-wrapper, +.ant-table-tbody > tr > td.ant-table-selection-column .ant-radio-wrapper { + margin-right: 0; +} +.ant-table-expand-icon-th, +.ant-table-row-expand-icon-cell { + text-align: center; + min-width: 50px; + width: 50px; +} +.ant-table-header { + background: #fafafa; + overflow: hidden; +} +.ant-table-header table { + border-radius: 4px 4px 0 0; +} +.ant-table-loading { + position: relative; +} +.ant-table-loading .ant-table-body { + background: #fff; + opacity: 0.5; +} +.ant-table-loading .ant-table-spin-holder { + height: 20px; + line-height: 20px; + left: 50%; + top: 50%; + margin-left: -30px; + position: absolute; +} +.ant-table-loading .ant-table-with-pagination { + margin-top: -20px; +} +.ant-table-loading .ant-table-without-pagination { + margin-top: 10px; +} +.ant-table-column-sorter { + position: relative; + margin-left: 8px; + display: inline-block; + vertical-align: text-bottom; + top: -1.5px; + width: 14px; + height: 14px; + text-align: center; + font-weight: normal; + color: rgba(0, 0, 0, 0.45); +} +.ant-table-column-sorter-up, +.ant-table-column-sorter-down { + display: block; + width: 14px; + height: 6px; + line-height: 6px; + cursor: pointer; + position: relative; +} +.ant-table-column-sorter-up:hover .anticon, +.ant-table-column-sorter-down:hover .anticon { + color: #69c0ff; +} +.ant-table-column-sorter-up.on .anticon-caret-up, +.ant-table-column-sorter-down.on .anticon-caret-up, +.ant-table-column-sorter-up.on .anticon-caret-down, +.ant-table-column-sorter-down.on .anticon-caret-down { + color: #1890ff; +} +.ant-table-column-sorter-up:after, +.ant-table-column-sorter-down:after { + position: absolute; + content: ''; + height: 30px; + width: 14px; + left: 0; +} +.ant-table-column-sorter-up:after { + bottom: 0; +} +.ant-table-column-sorter-down:after { + top: 0; +} +.ant-table-column-sorter .anticon-caret-up, +.ant-table-column-sorter .anticon-caret-down { + display: inline-block; + font-size: 12px; + font-size: 8px \9; + -webkit-transform: scale(0.66666667) rotate(0deg); + -ms-transform: scale(0.66666667) rotate(0deg); + transform: scale(0.66666667) rotate(0deg); + line-height: 4px; + height: 4px; + -webkit-transition: all .3s; + transition: all .3s; + position: relative; + display: block; +} +:root .ant-table-column-sorter .anticon-caret-up, +:root .ant-table-column-sorter .anticon-caret-down { + font-size: 12px; +} +.ant-table-column-sorter-down { + margin-top: 1.5px; +} +.ant-table-column-sorter .anticon-caret-up { + margin-top: 0.5px; +} +.ant-table-bordered .ant-table-header > table, +.ant-table-bordered .ant-table-body > table, +.ant-table-bordered .ant-table-fixed-left table, +.ant-table-bordered .ant-table-fixed-right table { + border: 1px solid #e8e8e8; + border-right: 0; + border-bottom: 0; +} +.ant-table-bordered.ant-table-empty .ant-table-placeholder { + border-left: 1px solid #e8e8e8; + border-right: 1px solid #e8e8e8; +} +.ant-table-bordered.ant-table-fixed-header .ant-table-header > table { + border-bottom: 0; +} +.ant-table-bordered.ant-table-fixed-header .ant-table-body > table { + border-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.ant-table-bordered.ant-table-fixed-header .ant-table-body-inner > table { + border-top: 0; +} +.ant-table-bordered.ant-table-fixed-header .ant-table-placeholder { + border: 0; +} +.ant-table-bordered .ant-table-thead > tr:not(:last-child) > th { + border-bottom: 1px solid #e8e8e8; +} +.ant-table-bordered .ant-table-thead > tr > th, +.ant-table-bordered .ant-table-tbody > tr > td { + border-right: 1px solid #e8e8e8; +} +.ant-table-placeholder { + position: relative; + padding: 16px 16px; + background: #fff; + border-bottom: 1px solid #e8e8e8; + text-align: center; + font-size: 14px; + color: rgba(0, 0, 0, 0.45); + z-index: 1; +} +.ant-table-placeholder .anticon { + margin-right: 4px; +} +.ant-table-pagination.ant-pagination { + margin: 16px 0; + float: right; +} +.ant-table-filter-dropdown { + min-width: 96px; + margin-left: -8px; + background: #fff; + border-radius: 4px; + -webkit-box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} +.ant-table-filter-dropdown .ant-dropdown-menu { + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + border-radius: 4px 4px 0 0; +} +.ant-table-filter-dropdown .ant-dropdown-menu-without-submenu { + max-height: 400px; + overflow-x: hidden; +} +.ant-table-filter-dropdown .ant-dropdown-menu-item > label + span { + padding-right: 0; +} +.ant-table-filter-dropdown .ant-dropdown-menu-sub { + border-radius: 4px; + -webkit-box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} +.ant-table-filter-dropdown .ant-dropdown-menu .ant-dropdown-submenu-contain-selected .ant-dropdown-menu-submenu-title:after { + color: #1890ff; + font-weight: bold; + text-shadow: 0 0 2px #bae7ff; +} +.ant-table-filter-dropdown .ant-dropdown-menu-item { + overflow: hidden; +} +.ant-table-filter-dropdown > .ant-dropdown-menu > .ant-dropdown-menu-item:last-child, +.ant-table-filter-dropdown > .ant-dropdown-menu > .ant-dropdown-menu-submenu:last-child .ant-dropdown-menu-submenu-title { + border-radius: 0; +} +.ant-table-filter-dropdown-btns { + overflow: hidden; + padding: 7px 8px; + border-top: 1px solid #e8e8e8; +} +.ant-table-filter-dropdown-link { + color: #1890ff; +} +.ant-table-filter-dropdown-link:hover { + color: #40a9ff; +} +.ant-table-filter-dropdown-link:active { + color: #096dd9; +} +.ant-table-filter-dropdown-link.confirm { + float: left; +} +.ant-table-filter-dropdown-link.clear { + float: right; +} +.ant-table-selection-select-all-custom { + margin-right: 4px !important; +} +.ant-table-selection .anticon-down { + color: rgba(0, 0, 0, 0.45); + -webkit-transition: all .3s; + transition: all .3s; +} +.ant-table-selection-menu { + min-width: 96px; + margin-top: 5px; + margin-left: -30px; + background: #fff; + border-radius: 4px; + -webkit-box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); +} +.ant-table-selection-menu .ant-action-down { + color: rgba(0, 0, 0, 0.45); +} +.ant-table-selection-down { + cursor: pointer; + padding: 0; + display: inline-block; + line-height: 1; +} +.ant-table-selection-down:hover .anticon-down { + color: #666; +} +.ant-table-row-expand-icon { + cursor: pointer; + display: inline-block; + width: 17px; + height: 17px; + text-align: center; + line-height: 14px; + border: 1px solid #e8e8e8; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background: #fff; +} +.ant-table-row-expanded:after { + content: '-'; +} +.ant-table-row-collapsed:after { + content: '+'; +} +.ant-table-row-spaced { + visibility: hidden; +} +.ant-table-row-spaced:after { + content: '.'; +} +.ant-table-row[class*="ant-table-row-level-0"] .ant-table-selection-column > span { + display: inline-block; +} +tr.ant-table-expanded-row, +tr.ant-table-expanded-row:hover { + background: #fbfbfb; +} +.ant-table .ant-table-row-indent + .ant-table-row-expand-icon { + margin-right: 8px; +} +.ant-table-scroll { + overflow: auto; + overflow-x: hidden; +} +.ant-table-scroll table { + width: auto; + min-width: 100%; +} +.ant-table-body-inner { + height: 100%; +} +.ant-table-fixed-header > .ant-table-content > .ant-table-scroll > .ant-table-body { + position: relative; + background: #fff; +} +.ant-table-fixed-header .ant-table-body-inner { + overflow: scroll; +} +.ant-table-fixed-header .ant-table-scroll .ant-table-header { + overflow: scroll; + padding-bottom: 20px; + margin-bottom: -20px; + opacity: 0.9999; +} +.ant-table-fixed-left, +.ant-table-fixed-right { + position: absolute; + top: 0; + overflow: hidden; + -webkit-transition: -webkit-box-shadow 0.3s ease; + transition: -webkit-box-shadow 0.3s ease; + transition: box-shadow 0.3s ease; + transition: box-shadow 0.3s ease, -webkit-box-shadow 0.3s ease; + border-radius: 0; +} +.ant-table-fixed-left table, +.ant-table-fixed-right table { + width: auto; + background: #fff; +} +.ant-table-fixed-header .ant-table-fixed-left .ant-table-body-outer .ant-table-fixed, +.ant-table-fixed-header .ant-table-fixed-right .ant-table-body-outer .ant-table-fixed { + border-radius: 0; +} +.ant-table-fixed-left { + left: 0; + -webkit-box-shadow: 6px 0 6px -4px rgba(0, 0, 0, 0.15); + box-shadow: 6px 0 6px -4px rgba(0, 0, 0, 0.15); +} +.ant-table-fixed-left .ant-table-header { + overflow-y: hidden; +} +.ant-table-fixed-left .ant-table-body-inner { + margin-right: -20px; + padding-right: 20px; +} +.ant-table-fixed-header .ant-table-fixed-left .ant-table-body-inner { + padding-right: 0; +} +.ant-table-fixed-left, +.ant-table-fixed-left table { + border-radius: 4px 0 0 0; +} +.ant-table-fixed-left .ant-table-thead > tr > th:last-child { + border-top-right-radius: 0; +} +.ant-table-fixed-right { + right: 0; + -webkit-box-shadow: -6px 0 6px -4px rgba(0, 0, 0, 0.15); + box-shadow: -6px 0 6px -4px rgba(0, 0, 0, 0.15); +} +.ant-table-fixed-right, +.ant-table-fixed-right table { + border-radius: 0 4px 0 0; +} +.ant-table-fixed-right .ant-table-expanded-row { + color: transparent; + pointer-events: none; +} +.ant-table-fixed-right .ant-table-thead > tr > th:first-child { + border-top-left-radius: 0; +} +.ant-table.ant-table-scroll-position-left .ant-table-fixed-left { + -webkit-box-shadow: none; + box-shadow: none; +} +.ant-table.ant-table-scroll-position-right .ant-table-fixed-right { + -webkit-box-shadow: none; + box-shadow: none; +} +.ant-table-middle > .ant-table-title, +.ant-table-middle > .ant-table-footer { + padding: 12px 8px; +} +.ant-table-middle > .ant-table-content > .ant-table-header > table > .ant-table-thead > tr > th, +.ant-table-middle > .ant-table-content > .ant-table-body > table > .ant-table-thead > tr > th, +.ant-table-middle > .ant-table-content > .ant-table-scroll > .ant-table-header > table > .ant-table-thead > tr > th, +.ant-table-middle > .ant-table-content > .ant-table-scroll > .ant-table-body > table > .ant-table-thead > tr > th, +.ant-table-middle > .ant-table-content > .ant-table-fixed-left > .ant-table-header > table > .ant-table-thead > tr > th, +.ant-table-middle > .ant-table-content > .ant-table-fixed-right > .ant-table-header > table > .ant-table-thead > tr > th, +.ant-table-middle > .ant-table-content > .ant-table-fixed-left > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-thead > tr > th, +.ant-table-middle > .ant-table-content > .ant-table-fixed-right > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-thead > tr > th, +.ant-table-middle > .ant-table-content > .ant-table-header > table > .ant-table-tbody > tr > td, +.ant-table-middle > .ant-table-content > .ant-table-body > table > .ant-table-tbody > tr > td, +.ant-table-middle > .ant-table-content > .ant-table-scroll > .ant-table-header > table > .ant-table-tbody > tr > td, +.ant-table-middle > .ant-table-content > .ant-table-scroll > .ant-table-body > table > .ant-table-tbody > tr > td, +.ant-table-middle > .ant-table-content > .ant-table-fixed-left > .ant-table-header > table > .ant-table-tbody > tr > td, +.ant-table-middle > .ant-table-content > .ant-table-fixed-right > .ant-table-header > table > .ant-table-tbody > tr > td, +.ant-table-middle > .ant-table-content > .ant-table-fixed-left > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-tbody > tr > td, +.ant-table-middle > .ant-table-content > .ant-table-fixed-right > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-tbody > tr > td { + padding: 12px 8px; +} +.ant-table-small { + border: 1px solid #e8e8e8; + border-radius: 4px; +} +.ant-table-small > .ant-table-title, +.ant-table-small > .ant-table-footer { + padding: 8px 8px; +} +.ant-table-small > .ant-table-title { + border-bottom: 1px solid #e8e8e8; + top: 0; +} +.ant-table-small > .ant-table-content > .ant-table-body { + margin: 0 8px; +} +.ant-table-small > .ant-table-content > .ant-table-header > table, +.ant-table-small > .ant-table-content > .ant-table-body > table, +.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-header > table, +.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-body > table, +.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-header > table, +.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-header > table, +.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-body-outer > .ant-table-body-inner > table, +.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-body-outer > .ant-table-body-inner > table { + border: 0; +} +.ant-table-small > .ant-table-content > .ant-table-header > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-body > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-header > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-body > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-header > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-header > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-header > table > .ant-table-tbody > tr > td, +.ant-table-small > .ant-table-content > .ant-table-body > table > .ant-table-tbody > tr > td, +.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-header > table > .ant-table-tbody > tr > td, +.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-body > table > .ant-table-tbody > tr > td, +.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-header > table > .ant-table-tbody > tr > td, +.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-header > table > .ant-table-tbody > tr > td, +.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-tbody > tr > td, +.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-tbody > tr > td { + padding: 8px 8px; +} +.ant-table-small > .ant-table-content > .ant-table-header > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-body > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-header > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-body > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-header > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-header > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-thead > tr > th, +.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-body-outer > .ant-table-body-inner > table > .ant-table-thead > tr > th { + background: #fff; + border-bottom: 1px solid #e8e8e8; +} +.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-header > table, +.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-body > table, +.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-header > table, +.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-header > table, +.ant-table-small > .ant-table-content > .ant-table-fixed-left > .ant-table-body-outer > .ant-table-body-inner > table, +.ant-table-small > .ant-table-content > .ant-table-fixed-right > .ant-table-body-outer > .ant-table-body-inner > table { + padding: 0; +} +.ant-table-small > .ant-table-content .ant-table-header { + background: #fff; +} +.ant-table-small > .ant-table-content .ant-table-placeholder, +.ant-table-small > .ant-table-content .ant-table-row:last-child td { + border-bottom: 0; +} +.ant-table-small.ant-table-bordered { + border-right: 0; +} +.ant-table-small.ant-table-bordered .ant-table-title { + border: 0; + border-bottom: 1px solid #e8e8e8; + border-right: 1px solid #e8e8e8; +} +.ant-table-small.ant-table-bordered .ant-table-content { + border-right: 1px solid #e8e8e8; +} +.ant-table-small.ant-table-bordered .ant-table-footer { + border: 0; + border-top: 1px solid #e8e8e8; + border-right: 1px solid #e8e8e8; +} +.ant-table-small.ant-table-bordered .ant-table-footer:before { + display: none; +} +.ant-table-small.ant-table-bordered .ant-table-placeholder { + border-left: 0; + border-bottom: 0; +} +.ant-table-small.ant-table-bordered .ant-table-thead > tr > th:last-child, +.ant-table-small.ant-table-bordered .ant-table-tbody > tr > td:last-child { + border-right: none; +} +.ant-table-small.ant-table-bordered .ant-table-fixed-left .ant-table-thead > tr > th:last-child, +.ant-table-small.ant-table-bordered .ant-table-fixed-left .ant-table-tbody > tr > td:last-child { + border-right: 1px solid #e8e8e8; +} +.ant-table-small.ant-table-bordered .ant-table-fixed-right { + border-right: 1px solid #e8e8e8; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-timeline { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + list-style: none; + margin: 0; + padding: 0; +} +.ant-timeline-item { + position: relative; + padding: 0 0 20px; + list-style: none; + margin: 0; + font-size: 14px; +} +.ant-timeline-item-tail { + position: absolute; + left: 4px; + top: 0.75em; + height: 100%; + border-left: 2px solid #e8e8e8; +} +.ant-timeline-item-pending .ant-timeline-item-head { + font-size: 12px; +} +.ant-timeline-item-pending .ant-timeline-item-tail { + display: none; +} +.ant-timeline-item-head { + position: absolute; + width: 10px; + height: 10px; + background-color: #fff; + border-radius: 100px; + border: 2px solid transparent; +} +.ant-timeline-item-head-blue { + border-color: #1890ff; + color: #1890ff; +} +.ant-timeline-item-head-red { + border-color: #f5222d; + color: #f5222d; +} +.ant-timeline-item-head-green { + border-color: #52c41a; + color: #52c41a; +} +.ant-timeline-item-head-custom { + position: absolute; + text-align: center; + line-height: 1; + margin-top: 0; + border: 0; + height: auto; + border-radius: 0; + padding: 3px 1px; + -webkit-transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + top: 5.5px; + left: 5px; + width: auto; +} +.ant-timeline-item-content { + margin: 0 0 0 18px; + position: relative; + top: -6px; +} +.ant-timeline-item-last .ant-timeline-item-tail { + display: none; +} +.ant-timeline-item-last .ant-timeline-item-content { + min-height: 48px; +} +.ant-timeline.ant-timeline-alternate .ant-timeline-item-tail, +.ant-timeline.ant-timeline-right .ant-timeline-item-tail, +.ant-timeline.ant-timeline-alternate .ant-timeline-item-head, +.ant-timeline.ant-timeline-right .ant-timeline-item-head, +.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom, +.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom { + left: 50%; +} +.ant-timeline.ant-timeline-alternate .ant-timeline-item-head, +.ant-timeline.ant-timeline-right .ant-timeline-item-head { + margin-left: -4px; +} +.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom, +.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom { + margin-left: 1px; +} +.ant-timeline.ant-timeline-alternate .ant-timeline-item-left .ant-timeline-item-content, +.ant-timeline.ant-timeline-right .ant-timeline-item-left .ant-timeline-item-content { + text-align: left; + left: 50%; + width: 50%; +} +.ant-timeline.ant-timeline-alternate .ant-timeline-item-right .ant-timeline-item-content, +.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content { + text-align: right; + right: 50%; + margin-right: 18px; + width: 50%; + left: -30px; +} +.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-tail, +.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head, +.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head-custom { + left: 100%; +} +.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content { + right: 0; + width: 100%; + left: -30px; +} +.ant-timeline.ant-timeline-pending .ant-timeline-item-last .ant-timeline-item-tail { + border-left: 2px dotted #e8e8e8; + display: block; +} +.ant-timeline.ant-timeline-reverse .ant-timeline-item-last .ant-timeline-item-tail { + display: none; +} +.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-tail { + border-left: 2px dotted #e8e8e8; + display: block; +} +.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-content { + min-height: 48px; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +@-webkit-keyframes antCheckboxEffect { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 0.5; + } + 100% { + -webkit-transform: scale(1.6); + transform: scale(1.6); + opacity: 0; + } +} +@keyframes antCheckboxEffect { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 0.5; + } + 100% { + -webkit-transform: scale(1.6); + transform: scale(1.6); + opacity: 0; + } +} +.ant-transfer { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + position: relative; +} +.ant-transfer-list { + border: 1px solid #d9d9d9; + display: inline-block; + border-radius: 4px; + vertical-align: middle; + position: relative; + width: 180px; + height: 200px; + padding-top: 34px; +} +.ant-transfer-list-with-footer { + padding-bottom: 34px; +} +.ant-transfer-list-search { + padding: 0 8px; +} +.ant-transfer-list-search-action { + color: rgba(0, 0, 0, 0.25); + position: absolute; + top: 4px; + right: 4px; + bottom: 4px; + width: 28px; + line-height: 32px; + text-align: center; +} +.ant-transfer-list-search-action .anticon { + -webkit-transition: all .3s; + transition: all .3s; + color: rgba(0, 0, 0, 0.25); +} +.ant-transfer-list-search-action .anticon:hover { + color: rgba(0, 0, 0, 0.45); +} +span.ant-transfer-list-search-action { + pointer-events: none; +} +.ant-transfer-list-header { + padding: 6px 12px; + border-radius: 4px 4px 0 0; + background: #fff; + color: rgba(0, 0, 0, 0.65); + border-bottom: 1px solid #e8e8e8; + overflow: hidden; + position: absolute; + top: 0; + left: 0; + width: 100%; +} +.ant-transfer-list-header-title { + position: absolute; + right: 12px; +} +.ant-transfer-list-body { + font-size: 14px; + position: relative; + height: 100%; +} +.ant-transfer-list-body-search-wrapper { + position: absolute; + top: 0; + left: 0; + padding: 4px; + width: 100%; +} +.ant-transfer-list-body-with-search { + padding-top: 40px; +} +.ant-transfer-list-content { + height: 100%; + overflow: auto; + list-style: none; + padding: 0; + margin: 0; +} +.ant-transfer-list-content > .LazyLoad { + -webkit-animation: transferHighlightIn 1s; + animation: transferHighlightIn 1s; +} +.ant-transfer-list-content-item { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + padding: 6px 12px; + min-height: 32px; + -webkit-transition: all .3s; + transition: all .3s; +} +.ant-transfer-list-content-item > span { + padding-right: 0; +} +.ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover { + cursor: pointer; + background-color: #e6f7ff; +} +.ant-transfer-list-content-item-disabled { + cursor: not-allowed; + color: rgba(0, 0, 0, 0.25); +} +.ant-transfer-list-body-not-found { + padding-top: 0; + color: rgba(0, 0, 0, 0.25); + text-align: center; + display: none; + position: absolute; + top: 50%; + width: 100%; + margin-top: -10px; +} +.ant-transfer-list-content:empty + .ant-transfer-list-body-not-found { + display: block; +} +.ant-transfer-list-footer { + border-top: 1px solid #e8e8e8; + border-radius: 0 0 4px 4px; + position: absolute; + bottom: 0; + left: 0; + width: 100%; +} +.ant-transfer-operation { + display: inline-block; + overflow: hidden; + margin: 0 8px; + vertical-align: middle; +} +.ant-transfer-operation .ant-btn { + display: block; +} +.ant-transfer-operation .ant-btn:first-child { + margin-bottom: 4px; +} +.ant-transfer-operation .ant-btn .anticon { + font-size: 12px; +} +@-webkit-keyframes transferHighlightIn { + 0% { + background: #bae7ff; + } + 100% { + background: transparent; + } +} +@keyframes transferHighlightIn { + 0% { + background: #bae7ff; + } + 100% { + background: transparent; + } +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +@-webkit-keyframes antCheckboxEffect { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 0.5; + } + 100% { + -webkit-transform: scale(1.6); + transform: scale(1.6); + opacity: 0; + } +} +@keyframes antCheckboxEffect { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 0.5; + } + 100% { + -webkit-transform: scale(1.6); + transform: scale(1.6); + opacity: 0; + } +} +.ant-select-tree-checkbox { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + white-space: nowrap; + cursor: pointer; + outline: none; + display: inline-block; + line-height: 1; + position: relative; + vertical-align: middle; + top: -0.09em; +} +.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox-inner, +.ant-select-tree-checkbox:hover .ant-select-tree-checkbox-inner, +.ant-select-tree-checkbox-input:focus + .ant-select-tree-checkbox-inner { + border-color: #1890ff; +} +.ant-select-tree-checkbox-checked:after { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border-radius: 2px; + border: 1px solid #1890ff; + content: ''; + -webkit-animation: antCheckboxEffect 0.36s ease-in-out; + animation: antCheckboxEffect 0.36s ease-in-out; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + visibility: hidden; +} +.ant-select-tree-checkbox:hover:after, +.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox:after { + visibility: visible; +} +.ant-select-tree-checkbox-inner { + position: relative; + top: 0; + left: 0; + display: block; + width: 16px; + height: 16px; + border: 1px solid #d9d9d9; + border-radius: 2px; + background-color: #fff; + -webkit-transition: all .3s; + transition: all .3s; +} +.ant-select-tree-checkbox-inner:after { + -webkit-transform: rotate(45deg) scale(0); + -ms-transform: rotate(45deg) scale(0); + transform: rotate(45deg) scale(0); + position: absolute; + left: 4.57142857px; + top: 1.14285714px; + display: table; + width: 5.71428571px; + height: 9.14285714px; + border: 2px solid #fff; + border-top: 0; + border-left: 0; + content: ' '; + -webkit-transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s; + transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s; + opacity: 0; +} +.ant-select-tree-checkbox-input { + position: absolute; + left: 0; + z-index: 1; + cursor: pointer; + opacity: 0; + top: 0; + bottom: 0; + right: 0; + width: 100%; + height: 100%; +} +.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner:after { + content: ' '; + -webkit-transform: translate(-50%, -50%) scale(1); + -ms-transform: translate(-50%, -50%) scale(1); + transform: translate(-50%, -50%) scale(1); + border: 0; + left: 50%; + top: 50%; + width: 8px; + height: 8px; + background-color: #1890ff; + opacity: 1; +} +.ant-select-tree-checkbox-indeterminate.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner:after { + border-color: rgba(0, 0, 0, 0.25); +} +.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner:after { + -webkit-transform: rotate(45deg) scale(1); + -ms-transform: rotate(45deg) scale(1); + transform: rotate(45deg) scale(1); + position: absolute; + display: table; + border: 2px solid #fff; + border-top: 0; + border-left: 0; + content: ' '; + -webkit-transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s; + transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s; + opacity: 1; +} +.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner { + background-color: #1890ff; + border-color: #1890ff; +} +.ant-select-tree-checkbox-disabled { + cursor: not-allowed; +} +.ant-select-tree-checkbox-disabled.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner:after { + -webkit-animation-name: none; + animation-name: none; + border-color: rgba(0, 0, 0, 0.25); +} +.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-input { + cursor: not-allowed; +} +.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner { + border-color: #d9d9d9 !important; + background-color: #f5f5f5; +} +.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner:after { + -webkit-animation-name: none; + animation-name: none; + border-color: #f5f5f5; +} +.ant-select-tree-checkbox-disabled + span { + color: rgba(0, 0, 0, 0.25); + cursor: not-allowed; +} +.ant-select-tree-checkbox-wrapper { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + line-height: unset; + cursor: pointer; + display: inline-block; +} +.ant-select-tree-checkbox-wrapper + .ant-select-tree-checkbox-wrapper { + margin-left: 8px; +} +.ant-select-tree-checkbox-wrapper + span, +.ant-select-tree-checkbox + span { + padding-left: 8px; + padding-right: 8px; +} +.ant-select-tree-checkbox-group { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + display: inline-block; +} +.ant-select-tree-checkbox-group-item { + display: inline-block; + margin-right: 8px; +} +.ant-select-tree-checkbox-group-item:last-child { + margin-right: 0; +} +.ant-select-tree-checkbox-group-item + .ant-select-tree-checkbox-group-item { + margin-left: 0; +} +.ant-select-tree { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: 0; + list-style: none; + margin: 0; + padding: 0 4px; + margin-top: -4px; +} +.ant-select-tree li { + padding: 0; + margin: 8px 0; + list-style: none; + white-space: nowrap; + outline: 0; +} +.ant-select-tree li.filter-node > span { + font-weight: 500; +} +.ant-select-tree li ul { + margin: 0; + padding: 0 0 0 18px; +} +.ant-select-tree li .ant-select-tree-node-content-wrapper { + display: inline-block; + padding: 3px 5px; + border-radius: 2px; + margin: 0; + cursor: pointer; + text-decoration: none; + color: rgba(0, 0, 0, 0.65); + -webkit-transition: all .3s; + transition: all .3s; + width: calc(100% - 24px); +} +.ant-select-tree li .ant-select-tree-node-content-wrapper:hover { + background-color: #e6f7ff; +} +.ant-select-tree li .ant-select-tree-node-content-wrapper.ant-select-tree-node-selected { + background-color: #bae7ff; +} +.ant-select-tree li span.ant-select-tree-checkbox { + margin: 0 4px 0 0; +} +.ant-select-tree li span.ant-select-tree-checkbox + .ant-select-tree-node-content-wrapper { + width: calc(100% - 46px); +} +.ant-select-tree li span.ant-select-tree-switcher, +.ant-select-tree li span.ant-select-tree-iconEle { + margin: 0; + width: 24px; + height: 24px; + line-height: 22px; + display: inline-block; + vertical-align: middle; + border: 0 none; + cursor: pointer; + outline: none; + text-align: center; +} +.ant-select-tree li span.ant-select-icon_loading .ant-select-switcher-loading-icon { + display: inline-block; + position: absolute; + left: 0; + color: #1890ff; + -webkit-transform: none; + -ms-transform: none; + transform: none; + font-size: 14px; +} +.ant-select-tree li span.ant-select-icon_loading .ant-select-switcher-loading-icon svg { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; +} +.ant-select-tree li span.ant-select-tree-switcher { + position: relative; +} +.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher-noop { + cursor: auto; +} +.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-tree-switcher-icon, +.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-select-switcher-icon { + font-size: 12px; + font-size: 7px \9; + -webkit-transform: scale(0.58333333) rotate(0deg); + -ms-transform: scale(0.58333333) rotate(0deg); + transform: scale(0.58333333) rotate(0deg); + display: inline-block; + font-weight: bold; +} +:root .ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-tree-switcher-icon, +:root .ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-select-switcher-icon { + font-size: 12px; +} +.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-tree-switcher-icon svg, +.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-select-switcher-icon svg { + -webkit-transition: -webkit-transform .3s; + transition: -webkit-transform .3s; + transition: transform .3s; + transition: transform .3s, -webkit-transform .3s; +} +.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-tree-switcher-icon, +.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-select-switcher-icon { + font-size: 12px; + font-size: 7px \9; + -webkit-transform: scale(0.58333333) rotate(0deg); + -ms-transform: scale(0.58333333) rotate(0deg); + transform: scale(0.58333333) rotate(0deg); + display: inline-block; + font-weight: bold; +} +:root .ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-tree-switcher-icon, +:root .ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-select-switcher-icon { + font-size: 12px; +} +.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-tree-switcher-icon svg, +.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-select-switcher-icon svg { + -webkit-transition: -webkit-transform .3s; + transition: -webkit-transform .3s; + transition: transform .3s; + transition: transform .3s, -webkit-transform .3s; +} +.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-select-switcher-icon svg { + -webkit-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); +} +.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-select-switcher-loading-icon, +.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-select-switcher-loading-icon { + display: inline-block; + position: absolute; + left: 0; + width: 24px; + height: 24px; + color: #1890ff; + -webkit-transform: none; + -ms-transform: none; + transform: none; + font-size: 14px; +} +.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-select-switcher-loading-icon svg, +.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-select-switcher-loading-icon svg { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; +} +.ant-select-tree .ant-select-tree-treenode-loading .ant-select-tree-iconEle { + display: none; +} +.ant-select-tree-child-tree { + display: none; +} +.ant-select-tree-child-tree-open { + display: block; +} +li.ant-select-tree-treenode-disabled > span:not(.ant-select-tree-switcher), +li.ant-select-tree-treenode-disabled > .ant-select-tree-node-content-wrapper, +li.ant-select-tree-treenode-disabled > .ant-select-tree-node-content-wrapper span { + color: rgba(0, 0, 0, 0.25); + cursor: not-allowed; +} +li.ant-select-tree-treenode-disabled > .ant-select-tree-node-content-wrapper:hover { + background: transparent; +} +.ant-select-tree-icon__open { + margin-right: 2px; + vertical-align: top; +} +.ant-select-tree-icon__close { + margin-right: 2px; + vertical-align: top; +} +.ant-select-tree-dropdown { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; +} +.ant-select-tree-dropdown .ant-select-dropdown-search { + display: block; + padding: 4px; +} +.ant-select-tree-dropdown .ant-select-dropdown-search .ant-select-search__field__wrap { + width: 100%; +} +.ant-select-tree-dropdown .ant-select-dropdown-search .ant-select-search__field { + padding: 4px 7px; + width: 100%; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border: 1px solid #d9d9d9; + border-radius: 4px; + outline: none; +} +.ant-select-tree-dropdown .ant-select-dropdown-search.ant-select-search--hide { + display: none; +} +.ant-select-tree-dropdown .ant-select-not-found { + cursor: not-allowed; + color: rgba(0, 0, 0, 0.25); + padding: 7px 16px; + display: block; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +@-webkit-keyframes antCheckboxEffect { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 0.5; + } + 100% { + -webkit-transform: scale(1.6); + transform: scale(1.6); + opacity: 0; + } +} +@keyframes antCheckboxEffect { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 0.5; + } + 100% { + -webkit-transform: scale(1.6); + transform: scale(1.6); + opacity: 0; + } +} +.ant-tree.ant-tree-directory { + position: relative; +} +.ant-tree.ant-tree-directory > li span.ant-tree-switcher, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li span.ant-tree-switcher { + position: relative; + z-index: 1; +} +.ant-tree.ant-tree-directory > li span.ant-tree-switcher.ant-tree-switcher-noop, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li span.ant-tree-switcher.ant-tree-switcher-noop { + pointer-events: none; +} +.ant-tree.ant-tree-directory > li span.ant-tree-checkbox, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li span.ant-tree-checkbox { + position: relative; + z-index: 1; +} +.ant-tree.ant-tree-directory > li span.ant-tree-node-content-wrapper, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li span.ant-tree-node-content-wrapper { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + border-radius: 0; +} +.ant-tree.ant-tree-directory > li span.ant-tree-node-content-wrapper:hover, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li span.ant-tree-node-content-wrapper:hover { + background: transparent; +} +.ant-tree.ant-tree-directory > li span.ant-tree-node-content-wrapper:hover:before, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li span.ant-tree-node-content-wrapper:hover:before { + background: #e6f7ff; +} +.ant-tree.ant-tree-directory > li span.ant-tree-node-content-wrapper.ant-tree-node-selected, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li span.ant-tree-node-content-wrapper.ant-tree-node-selected { + color: #fff; + background: transparent; +} +.ant-tree.ant-tree-directory > li span.ant-tree-node-content-wrapper:before, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li span.ant-tree-node-content-wrapper:before { + content: ''; + position: absolute; + left: 0; + right: 0; + height: 24px; + -webkit-transition: all .3s; + transition: all .3s; +} +.ant-tree.ant-tree-directory > li span.ant-tree-node-content-wrapper > span, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li span.ant-tree-node-content-wrapper > span { + position: relative; + z-index: 1; +} +.ant-tree.ant-tree-directory > li.ant-tree-treenode-selected > span.ant-tree-switcher, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li.ant-tree-treenode-selected > span.ant-tree-switcher { + color: #fff; +} +.ant-tree.ant-tree-directory > li.ant-tree-treenode-selected > span.ant-tree-checkbox .ant-tree-checkbox-inner, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li.ant-tree-treenode-selected > span.ant-tree-checkbox .ant-tree-checkbox-inner { + border-color: #1890ff; +} +.ant-tree.ant-tree-directory > li.ant-tree-treenode-selected > span.ant-tree-checkbox.ant-tree-checkbox-checked:after, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li.ant-tree-treenode-selected > span.ant-tree-checkbox.ant-tree-checkbox-checked:after { + border-color: #fff; +} +.ant-tree.ant-tree-directory > li.ant-tree-treenode-selected > span.ant-tree-checkbox.ant-tree-checkbox-checked .ant-tree-checkbox-inner, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li.ant-tree-treenode-selected > span.ant-tree-checkbox.ant-tree-checkbox-checked .ant-tree-checkbox-inner { + background: #fff; +} +.ant-tree.ant-tree-directory > li.ant-tree-treenode-selected > span.ant-tree-checkbox.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li.ant-tree-treenode-selected > span.ant-tree-checkbox.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after { + border-color: #1890ff; +} +.ant-tree.ant-tree-directory > li.ant-tree-treenode-selected > span.ant-tree-node-content-wrapper:before, +.ant-tree.ant-tree-directory .ant-tree-child-tree > li.ant-tree-treenode-selected > span.ant-tree-node-content-wrapper:before { + background: #1890ff; +} +.ant-tree-checkbox { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + white-space: nowrap; + cursor: pointer; + outline: none; + display: inline-block; + line-height: 1; + position: relative; + vertical-align: middle; + top: -0.09em; +} +.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox-inner, +.ant-tree-checkbox:hover .ant-tree-checkbox-inner, +.ant-tree-checkbox-input:focus + .ant-tree-checkbox-inner { + border-color: #1890ff; +} +.ant-tree-checkbox-checked:after { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border-radius: 2px; + border: 1px solid #1890ff; + content: ''; + -webkit-animation: antCheckboxEffect 0.36s ease-in-out; + animation: antCheckboxEffect 0.36s ease-in-out; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + visibility: hidden; +} +.ant-tree-checkbox:hover:after, +.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox:after { + visibility: visible; +} +.ant-tree-checkbox-inner { + position: relative; + top: 0; + left: 0; + display: block; + width: 16px; + height: 16px; + border: 1px solid #d9d9d9; + border-radius: 2px; + background-color: #fff; + -webkit-transition: all .3s; + transition: all .3s; +} +.ant-tree-checkbox-inner:after { + -webkit-transform: rotate(45deg) scale(0); + -ms-transform: rotate(45deg) scale(0); + transform: rotate(45deg) scale(0); + position: absolute; + left: 4.57142857px; + top: 1.14285714px; + display: table; + width: 5.71428571px; + height: 9.14285714px; + border: 2px solid #fff; + border-top: 0; + border-left: 0; + content: ' '; + -webkit-transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s; + transition: all 0.1s cubic-bezier(0.71, -0.46, 0.88, 0.6), opacity 0.1s; + opacity: 0; +} +.ant-tree-checkbox-input { + position: absolute; + left: 0; + z-index: 1; + cursor: pointer; + opacity: 0; + top: 0; + bottom: 0; + right: 0; + width: 100%; + height: 100%; +} +.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner:after { + content: ' '; + -webkit-transform: translate(-50%, -50%) scale(1); + -ms-transform: translate(-50%, -50%) scale(1); + transform: translate(-50%, -50%) scale(1); + border: 0; + left: 50%; + top: 50%; + width: 8px; + height: 8px; + background-color: #1890ff; + opacity: 1; +} +.ant-tree-checkbox-indeterminate.ant-tree-checkbox-disabled .ant-tree-checkbox-inner:after { + border-color: rgba(0, 0, 0, 0.25); +} +.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after { + -webkit-transform: rotate(45deg) scale(1); + -ms-transform: rotate(45deg) scale(1); + transform: rotate(45deg) scale(1); + position: absolute; + display: table; + border: 2px solid #fff; + border-top: 0; + border-left: 0; + content: ' '; + -webkit-transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s; + transition: all 0.2s cubic-bezier(0.12, 0.4, 0.29, 1.46) 0.1s; + opacity: 1; +} +.ant-tree-checkbox-checked .ant-tree-checkbox-inner { + background-color: #1890ff; + border-color: #1890ff; +} +.ant-tree-checkbox-disabled { + cursor: not-allowed; +} +.ant-tree-checkbox-disabled.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after { + -webkit-animation-name: none; + animation-name: none; + border-color: rgba(0, 0, 0, 0.25); +} +.ant-tree-checkbox-disabled .ant-tree-checkbox-input { + cursor: not-allowed; +} +.ant-tree-checkbox-disabled .ant-tree-checkbox-inner { + border-color: #d9d9d9 !important; + background-color: #f5f5f5; +} +.ant-tree-checkbox-disabled .ant-tree-checkbox-inner:after { + -webkit-animation-name: none; + animation-name: none; + border-color: #f5f5f5; +} +.ant-tree-checkbox-disabled + span { + color: rgba(0, 0, 0, 0.25); + cursor: not-allowed; +} +.ant-tree-checkbox-wrapper { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + line-height: unset; + cursor: pointer; + display: inline-block; +} +.ant-tree-checkbox-wrapper + .ant-tree-checkbox-wrapper { + margin-left: 8px; +} +.ant-tree-checkbox-wrapper + span, +.ant-tree-checkbox + span { + padding-left: 8px; + padding-right: 8px; +} +.ant-tree-checkbox-group { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + display: inline-block; +} +.ant-tree-checkbox-group-item { + display: inline-block; + margin-right: 8px; +} +.ant-tree-checkbox-group-item:last-child { + margin-right: 0; +} +.ant-tree-checkbox-group-item + .ant-tree-checkbox-group-item { + margin-left: 0; +} +.ant-tree { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + list-style: none; + margin: 0; + padding: 0; +} +.ant-tree ol, +.ant-tree ul { + list-style: none; + margin: 0; + padding: 0; +} +.ant-tree li { + padding: 4px 0; + margin: 0; + list-style: none; + white-space: nowrap; + outline: 0; +} +.ant-tree li span[draggable], +.ant-tree li span[draggable="true"] { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + border-top: 2px transparent solid; + border-bottom: 2px transparent solid; + /* Required to make elements draggable in old WebKit */ + -khtml-user-drag: element; + -webkit-user-drag: element; + line-height: 20px; +} +.ant-tree li.drag-over > span[draggable] { + background-color: #1890ff; + color: white; + opacity: 0.8; +} +.ant-tree li.drag-over-gap-top > span[draggable] { + border-top-color: #1890ff; +} +.ant-tree li.drag-over-gap-bottom > span[draggable] { + border-bottom-color: #1890ff; +} +.ant-tree li.filter-node > span { + color: #f5222d !important; + font-weight: 500 !important; +} +.ant-tree li.ant-tree-treenode-loading span.ant-tree-switcher.ant-tree-switcher_open .ant-tree-switcher-loading-icon, +.ant-tree li.ant-tree-treenode-loading span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-loading-icon { + display: inline-block; + position: absolute; + left: 0; + width: 24px; + height: 24px; + color: #1890ff; + -webkit-transform: none; + -ms-transform: none; + transform: none; + font-size: 14px; +} +.ant-tree li.ant-tree-treenode-loading span.ant-tree-switcher.ant-tree-switcher_open .ant-tree-switcher-loading-icon svg, +.ant-tree li.ant-tree-treenode-loading span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-loading-icon svg { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; +} +:root .ant-tree li.ant-tree-treenode-loading span.ant-tree-switcher.ant-tree-switcher_open:after, +:root .ant-tree li.ant-tree-treenode-loading span.ant-tree-switcher.ant-tree-switcher_close:after { + opacity: 0; +} +.ant-tree li ul { + margin: 0; + padding: 0 0 0 18px; +} +.ant-tree li .ant-tree-node-content-wrapper { + display: inline-block; + padding: 0 5px; + border-radius: 2px; + margin: 0; + cursor: pointer; + text-decoration: none; + vertical-align: top; + color: rgba(0, 0, 0, 0.65); + -webkit-transition: all .3s; + transition: all .3s; + height: 24px; + line-height: 24px; +} +.ant-tree li .ant-tree-node-content-wrapper:hover { + background-color: #e6f7ff; +} +.ant-tree li .ant-tree-node-content-wrapper.ant-tree-node-selected { + background-color: #bae7ff; +} +.ant-tree li span.ant-tree-checkbox { + margin: 4px 4px 0 2px; +} +.ant-tree li span.ant-tree-switcher, +.ant-tree li span.ant-tree-iconEle { + margin: 0; + width: 24px; + height: 24px; + line-height: 24px; + display: inline-block; + vertical-align: top; + border: 0 none; + cursor: pointer; + outline: none; + text-align: center; +} +.ant-tree li span.ant-tree-switcher { + position: relative; +} +.ant-tree li span.ant-tree-switcher.ant-tree-switcher-noop { + cursor: default; +} +.ant-tree li span.ant-tree-switcher.ant-tree-switcher_open .ant-tree-switcher-icon, +.ant-tree li span.ant-tree-switcher.ant-tree-switcher_open .ant-select-switcher-icon { + font-size: 12px; + font-size: 7px \9; + -webkit-transform: scale(0.58333333) rotate(0deg); + -ms-transform: scale(0.58333333) rotate(0deg); + transform: scale(0.58333333) rotate(0deg); + display: inline-block; + font-weight: bold; +} +:root .ant-tree li span.ant-tree-switcher.ant-tree-switcher_open .ant-tree-switcher-icon, +:root .ant-tree li span.ant-tree-switcher.ant-tree-switcher_open .ant-select-switcher-icon { + font-size: 12px; +} +.ant-tree li span.ant-tree-switcher.ant-tree-switcher_open .ant-tree-switcher-icon svg, +.ant-tree li span.ant-tree-switcher.ant-tree-switcher_open .ant-select-switcher-icon svg { + -webkit-transition: -webkit-transform .3s; + transition: -webkit-transform .3s; + transition: transform .3s; + transition: transform .3s, -webkit-transform .3s; +} +.ant-tree li span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-icon, +.ant-tree li span.ant-tree-switcher.ant-tree-switcher_close .ant-select-switcher-icon { + font-size: 12px; + font-size: 7px \9; + -webkit-transform: scale(0.58333333) rotate(0deg); + -ms-transform: scale(0.58333333) rotate(0deg); + transform: scale(0.58333333) rotate(0deg); + display: inline-block; + font-weight: bold; +} +:root .ant-tree li span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-icon, +:root .ant-tree li span.ant-tree-switcher.ant-tree-switcher_close .ant-select-switcher-icon { + font-size: 12px; +} +.ant-tree li span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-icon svg, +.ant-tree li span.ant-tree-switcher.ant-tree-switcher_close .ant-select-switcher-icon svg { + -webkit-transition: -webkit-transform .3s; + transition: -webkit-transform .3s; + transition: transform .3s; + transition: transform .3s, -webkit-transform .3s; +} +.ant-tree li span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-icon svg { + -webkit-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); +} +.ant-tree li:last-child > span.ant-tree-switcher:before, +.ant-tree li:last-child > span.ant-tree-iconEle:before { + display: none; +} +.ant-tree > li:first-child { + padding-top: 7px; +} +.ant-tree > li:last-child { + padding-bottom: 7px; +} +.ant-tree-child-tree { + display: none; +} +.ant-tree-child-tree-open { + display: block; +} +li.ant-tree-treenode-disabled > span:not(.ant-tree-switcher), +li.ant-tree-treenode-disabled > .ant-tree-node-content-wrapper, +li.ant-tree-treenode-disabled > .ant-tree-node-content-wrapper span { + color: rgba(0, 0, 0, 0.25); + cursor: not-allowed; +} +li.ant-tree-treenode-disabled > .ant-tree-node-content-wrapper:hover { + background: transparent; +} +.ant-tree-icon__open { + margin-right: 2px; + vertical-align: top; +} +.ant-tree-icon__close { + margin-right: 2px; + vertical-align: top; +} +.ant-tree.ant-tree-show-line li { + position: relative; +} +.ant-tree.ant-tree-show-line li span.ant-tree-switcher { + background: #fff; + color: rgba(0, 0, 0, 0.45); +} +.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher-noop .ant-tree-switcher-icon, +.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher-noop .ant-select-switcher-icon { + font-size: 12px; + font-size: 12px \9; + -webkit-transform: scale(1) rotate(0deg); + -ms-transform: scale(1) rotate(0deg); + transform: scale(1) rotate(0deg); + display: inline-block; + font-weight: normal; +} +:root .ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher-noop .ant-tree-switcher-icon, +:root .ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher-noop .ant-select-switcher-icon { + font-size: 12px; +} +.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher-noop .ant-tree-switcher-icon svg, +.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher-noop .ant-select-switcher-icon svg { + -webkit-transition: -webkit-transform .3s; + transition: -webkit-transform .3s; + transition: transform .3s; + transition: transform .3s, -webkit-transform .3s; +} +.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_open .ant-tree-switcher-icon, +.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_open .ant-select-switcher-icon { + font-size: 12px; + font-size: 12px \9; + -webkit-transform: scale(1) rotate(0deg); + -ms-transform: scale(1) rotate(0deg); + transform: scale(1) rotate(0deg); + display: inline-block; + font-weight: normal; +} +:root .ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_open .ant-tree-switcher-icon, +:root .ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_open .ant-select-switcher-icon { + font-size: 12px; +} +.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_open .ant-tree-switcher-icon svg, +.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_open .ant-select-switcher-icon svg { + -webkit-transition: -webkit-transform .3s; + transition: -webkit-transform .3s; + transition: transform .3s; + transition: transform .3s, -webkit-transform .3s; +} +.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-icon, +.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_close .ant-select-switcher-icon { + font-size: 12px; + font-size: 12px \9; + -webkit-transform: scale(1) rotate(0deg); + -ms-transform: scale(1) rotate(0deg); + transform: scale(1) rotate(0deg); + display: inline-block; + font-weight: normal; +} +:root .ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-icon, +:root .ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_close .ant-select-switcher-icon { + font-size: 12px; +} +.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-icon svg, +.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_close .ant-select-switcher-icon svg { + -webkit-transition: -webkit-transform .3s; + transition: -webkit-transform .3s; + transition: transform .3s; + transition: transform .3s, -webkit-transform .3s; +} +.ant-tree.ant-tree-show-line li:not(:last-child):before { + content: ' '; + width: 1px; + border-left: 1px solid #d9d9d9; + height: 100%; + position: absolute; + left: 12px; + margin: 22px 0; +} +.ant-tree.ant-tree-icon-hide .ant-tree-treenode-loading .ant-tree-iconEle { + display: none; +} +/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */ +/* stylelint-disable no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors */ +/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */ +.ant-upload { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + outline: 0; +} +.ant-upload p { + margin: 0; +} +.ant-upload-btn { + display: block; + width: 100%; + outline: none; +} +.ant-upload input[type="file"] { + cursor: pointer; +} +.ant-upload.ant-upload-select { + display: inline-block; +} +.ant-upload.ant-upload-select-picture-card { + border: 1px dashed #d9d9d9; + width: 104px; + height: 104px; + border-radius: 4px; + background-color: #fafafa; + text-align: center; + cursor: pointer; + -webkit-transition: border-color 0.3s ease; + transition: border-color 0.3s ease; + vertical-align: top; + margin-right: 8px; + margin-bottom: 8px; + display: table; +} +.ant-upload.ant-upload-select-picture-card > .ant-upload { + width: 100%; + height: 100%; + display: table-cell; + text-align: center; + vertical-align: middle; + padding: 8px; +} +.ant-upload.ant-upload-select-picture-card:hover { + border-color: #1890ff; +} +.ant-upload.ant-upload-drag { + border: 1px dashed #d9d9d9; + -webkit-transition: border-color 0.3s; + transition: border-color 0.3s; + cursor: pointer; + border-radius: 4px; + text-align: center; + width: 100%; + height: 100%; + position: relative; + background: #fafafa; +} +.ant-upload.ant-upload-drag .ant-upload { + padding: 16px 0; +} +.ant-upload.ant-upload-drag.ant-upload-drag-hover:not(.ant-upload-disabled) { + border: 2px dashed #40a9ff; +} +.ant-upload.ant-upload-drag.ant-upload-disabled { + cursor: not-allowed; +} +.ant-upload.ant-upload-drag .ant-upload-btn { + display: table; + height: 100%; +} +.ant-upload.ant-upload-drag .ant-upload-drag-container { + display: table-cell; + vertical-align: middle; +} +.ant-upload.ant-upload-drag:not(.ant-upload-disabled):hover { + border-color: #40a9ff; +} +.ant-upload.ant-upload-drag p.ant-upload-drag-icon { + margin-bottom: 20px; +} +.ant-upload.ant-upload-drag p.ant-upload-drag-icon .anticon { + font-size: 48px; + color: #40a9ff; +} +.ant-upload.ant-upload-drag p.ant-upload-text { + font-size: 16px; + margin: 0 0 4px; + color: rgba(0, 0, 0, 0.85); +} +.ant-upload.ant-upload-drag p.ant-upload-hint { + font-size: 14px; + color: rgba(0, 0, 0, 0.45); +} +.ant-upload.ant-upload-drag .anticon-plus { + font-size: 30px; + -webkit-transition: all .3s; + transition: all .3s; + color: rgba(0, 0, 0, 0.25); +} +.ant-upload.ant-upload-drag .anticon-plus:hover { + color: rgba(0, 0, 0, 0.45); +} +.ant-upload.ant-upload-drag:hover .anticon-plus { + color: rgba(0, 0, 0, 0.45); +} +.ant-upload-list { + font-family: "Chinese Quote", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + font-variant: tabular-nums; + line-height: 1.5; + color: rgba(0, 0, 0, 0.65); + -webkit-box-sizing: border-box; + box-sizing: border-box; + margin: 0; + padding: 0; + list-style: none; + zoom: 1; +} +.ant-upload-list:before, +.ant-upload-list:after { + content: ""; + display: table; +} +.ant-upload-list:after { + clear: both; +} +.ant-upload-list-item { + margin-top: 8px; + font-size: 14px; + position: relative; + height: 22px; +} +.ant-upload-list-item-name { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + padding-left: 22px; + width: 100%; + display: inline-block; +} +.ant-upload-list-item-info { + height: 100%; + padding: 0 12px 0 4px; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; +} +.ant-upload-list-item-info > span { + display: block; +} +.ant-upload-list-item-info .anticon-loading, +.ant-upload-list-item-info .anticon-paper-clip { + font-size: 14px; + color: rgba(0, 0, 0, 0.45); + position: absolute; + top: 5px; +} +.ant-upload-list-item .anticon-close { + display: inline-block; + font-size: 12px; + font-size: 10px \9; + -webkit-transform: scale(0.83333333) rotate(0deg); + -ms-transform: scale(0.83333333) rotate(0deg); + transform: scale(0.83333333) rotate(0deg); + -webkit-transition: all .3s; + transition: all .3s; + opacity: 0; + cursor: pointer; + position: absolute; + top: 6px; + right: 4px; + color: rgba(0, 0, 0, 0.45); + line-height: 0; +} +:root .ant-upload-list-item .anticon-close { + font-size: 12px; +} +.ant-upload-list-item .anticon-close:hover { + color: rgba(0, 0, 0, 0.65); +} +.ant-upload-list-item:hover .ant-upload-list-item-info { + background-color: #e6f7ff; +} +.ant-upload-list-item:hover .anticon-close { + opacity: 1; +} +.ant-upload-list-item-error, +.ant-upload-list-item-error .anticon-paper-clip, +.ant-upload-list-item-error .ant-upload-list-item-name { + color: #f5222d; +} +.ant-upload-list-item-error .anticon-close { + opacity: 1; + color: #f5222d !important; +} +.ant-upload-list-item-progress { + line-height: 0; + font-size: 14px; + position: absolute; + width: 100%; + bottom: -12px; + padding-left: 26px; +} +.ant-upload-list-picture .ant-upload-list-item, +.ant-upload-list-picture-card .ant-upload-list-item { + padding: 8px; + border-radius: 4px; + border: 1px solid #d9d9d9; + height: 66px; + position: relative; +} +.ant-upload-list-picture .ant-upload-list-item:hover, +.ant-upload-list-picture-card .ant-upload-list-item:hover { + background: transparent; +} +.ant-upload-list-picture .ant-upload-list-item-error, +.ant-upload-list-picture-card .ant-upload-list-item-error { + border-color: #f5222d; +} +.ant-upload-list-picture .ant-upload-list-item-info, +.ant-upload-list-picture-card .ant-upload-list-item-info { + padding: 0; +} +.ant-upload-list-picture .ant-upload-list-item:hover .ant-upload-list-item-info, +.ant-upload-list-picture-card .ant-upload-list-item:hover .ant-upload-list-item-info { + background: transparent; +} +.ant-upload-list-picture .ant-upload-list-item-uploading, +.ant-upload-list-picture-card .ant-upload-list-item-uploading { + border-style: dashed; +} +.ant-upload-list-picture .ant-upload-list-item-thumbnail, +.ant-upload-list-picture-card .ant-upload-list-item-thumbnail { + width: 48px; + height: 48px; + position: absolute; + top: 8px; + left: 8px; + text-align: center; +} +.ant-upload-list-picture .ant-upload-list-item-icon, +.ant-upload-list-picture-card .ant-upload-list-item-icon { + color: rgba(0, 0, 0, 0.25); + font-size: 36px; + position: absolute; + top: 50%; + left: 50%; + margin-top: -18px; + margin-left: -18px; +} +.ant-upload-list-picture .ant-upload-list-item-thumbnail img, +.ant-upload-list-picture-card .ant-upload-list-item-thumbnail img { + width: 48px; + height: 48px; + display: block; + overflow: hidden; +} +.ant-upload-list-picture .ant-upload-list-item-thumbnail.anticon:before, +.ant-upload-list-picture-card .ant-upload-list-item-thumbnail.anticon:before { + line-height: 48px; + font-size: 24px; + color: rgba(0, 0, 0, 0.45); +} +.ant-upload-list-picture .ant-upload-list-item-name, +.ant-upload-list-picture-card .ant-upload-list-item-name { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + margin: 0 0 0 8px; + line-height: 44px; + -webkit-transition: all .3s; + transition: all .3s; + padding-left: 48px; + padding-right: 8px; + max-width: 100%; + display: inline-block; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.ant-upload-list-picture .ant-upload-list-item-uploading .ant-upload-list-item-name, +.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-name { + line-height: 28px; +} +.ant-upload-list-picture .ant-upload-list-item-progress, +.ant-upload-list-picture-card .ant-upload-list-item-progress { + padding-left: 56px; + margin-top: 0; + bottom: 14px; + width: calc(100% - 24px); +} +.ant-upload-list-picture .anticon-close, +.ant-upload-list-picture-card .anticon-close { + position: absolute; + right: 8px; + top: 8px; + line-height: 1; + opacity: 1; +} +.ant-upload-list-picture-card { + float: left; +} +.ant-upload-list-picture-card.ant-upload-list:after { + display: none; +} +.ant-upload-list-picture-card .ant-upload-list-item { + float: left; + width: 104px; + height: 104px; + margin: 0 8px 8px 0; +} +.ant-upload-list-picture-card .ant-upload-list-item-info { + height: 100%; + position: relative; + overflow: hidden; +} +.ant-upload-list-picture-card .ant-upload-list-item-info:before { + content: ' '; + position: absolute; + z-index: 1; + background-color: rgba(0, 0, 0, 0.5); + -webkit-transition: all .3s; + transition: all .3s; + width: 100%; + height: 100%; + opacity: 0; +} +.ant-upload-list-picture-card .ant-upload-list-item:hover .ant-upload-list-item-info:before { + opacity: 1; +} +.ant-upload-list-picture-card .ant-upload-list-item-actions { + position: absolute; + left: 50%; + top: 50%; + -webkit-transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + z-index: 10; + white-space: nowrap; + opacity: 0; + -webkit-transition: all .3s; + transition: all .3s; +} +.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye-o, +.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete { + z-index: 10; + -webkit-transition: all .3s; + transition: all .3s; + cursor: pointer; + font-size: 16px; + width: 16px; + color: rgba(255, 255, 255, 0.85); + margin: 0 4px; +} +.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye-o:hover, +.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete:hover { + color: #fff; +} +.ant-upload-list-picture-card .ant-upload-list-item-info:hover + .ant-upload-list-item-actions, +.ant-upload-list-picture-card .ant-upload-list-item-actions:hover { + opacity: 1; +} +.ant-upload-list-picture-card .ant-upload-list-item-thumbnail, +.ant-upload-list-picture-card .ant-upload-list-item-thumbnail img { + display: block; + width: 100%; + height: 100%; + position: static; +} +.ant-upload-list-picture-card .ant-upload-list-item-name { + margin: 8px 0 0; + padding: 0; + text-align: center; + line-height: 1.5; + display: none; +} +.ant-upload-list-picture-card .anticon-picture + .ant-upload-list-item-name { + display: block; +} +.ant-upload-list-picture-card .ant-upload-list-item-uploading.ant-upload-list-item { + background-color: #fafafa; +} +.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info { + height: auto; +} +.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info:before, +.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info .anticon-eye-o, +.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info .anticon-delete { + display: none; +} +.ant-upload-list-picture-card .ant-upload-list-item-uploading-text { + margin-top: 18px; + color: rgba(0, 0, 0, 0.45); +} +.ant-upload-list-picture-card .ant-upload-list-item-progress { + padding-left: 0; + bottom: 32px; +} +.ant-upload-list .ant-upload-success-icon { + color: #52c41a; + font-weight: bold; +} +.ant-upload-list .ant-upload-animate-enter, +.ant-upload-list .ant-upload-animate-leave, +.ant-upload-list .ant-upload-animate-inline-enter, +.ant-upload-list .ant-upload-animate-inline-leave { + -webkit-animation-duration: .3s; + animation-duration: .3s; + -webkit-animation-fill-mode: cubic-bezier(0.78, 0.14, 0.15, 0.86); + animation-fill-mode: cubic-bezier(0.78, 0.14, 0.15, 0.86); +} +.ant-upload-list .ant-upload-animate-enter { + -webkit-animation-name: uploadAnimateIn; + animation-name: uploadAnimateIn; +} +.ant-upload-list .ant-upload-animate-leave { + -webkit-animation-name: uploadAnimateOut; + animation-name: uploadAnimateOut; +} +.ant-upload-list .ant-upload-animate-inline-enter { + -webkit-animation-name: uploadAnimateInlineIn; + animation-name: uploadAnimateInlineIn; +} +.ant-upload-list .ant-upload-animate-inline-leave { + -webkit-animation-name: uploadAnimateInlineOut; + animation-name: uploadAnimateInlineOut; +} +@-webkit-keyframes uploadAnimateIn { + from { + height: 0; + margin: 0; + opacity: 0; + padding: 0; + } +} +@keyframes uploadAnimateIn { + from { + height: 0; + margin: 0; + opacity: 0; + padding: 0; + } +} +@-webkit-keyframes uploadAnimateOut { + to { + height: 0; + margin: 0; + padding: 0; + opacity: 0; + } +} +@keyframes uploadAnimateOut { + to { + height: 0; + margin: 0; + padding: 0; + opacity: 0; + } +} +@-webkit-keyframes uploadAnimateInlineIn { + from { + width: 0; + height: 0; + margin: 0; + opacity: 0; + padding: 0; + } +} +@keyframes uploadAnimateInlineIn { + from { + width: 0; + height: 0; + margin: 0; + opacity: 0; + padding: 0; + } +} +@-webkit-keyframes uploadAnimateInlineOut { + to { + width: 0; + height: 0; + margin: 0; + padding: 0; + opacity: 0; + } +} +@keyframes uploadAnimateInlineOut { + to { + width: 0; + height: 0; + margin: 0; + padding: 0; + opacity: 0; + } +} + +/*# sourceMappingURL=antd.css.map*/ \ No newline at end of file diff --git a/cyclone-web/vendor/antd/antd.min.css b/cyclone-web/vendor/antd/antd.min.css new file mode 100644 index 0000000000000000000000000000000000000000..4431012748eb7c2d24ca8919e5d39229d5a18c0e --- /dev/null +++ b/cyclone-web/vendor/antd/antd.min.css @@ -0,0 +1,10 @@ +/*! + * + * antd v3.9.3 + * + * Copyright 2015-present, Alipay, Inc. + * All rights reserved. + * + */ +@font-face{font-family:Chinese Quote;src:local("PingFang SC"),local("SimSun");unicode-range:u+2018,u+2019,u+201c,u+201d}body,html{width:100%;height:100%}input::-ms-clear,input::-ms-reveal{display:none}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);background-color:#fff}[tabindex="-1"]:focus{outline:none!important}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5em;color:rgba(0,0,0,.85);font-weight:500}p{margin-top:0;margin-bottom:1em}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1em;font-style:normal;line-height:inherit}input[type=number],input[type=password],input[type=text],textarea{-webkit-appearance:none}dl,ol,ul{margin-top:0;margin-bottom:1em}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:500}dd{margin-bottom:.5em;margin-left:0}blockquote{margin:0 0 1em}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#1890ff;background-color:transparent;text-decoration:none;outline:none;cursor:pointer;-webkit-transition:color .3s;transition:color .3s;-webkit-text-decoration-skip:objects}a:focus{text-decoration:underline;-webkit-text-decoration-skip:ink;text-decoration-skip:ink}a:hover{color:#40a9ff}a:active{color:#096dd9}a:active,a:hover{outline:0;text-decoration:none}a[disabled]{color:rgba(0,0,0,.25);cursor:not-allowed;pointer-events:none}code,kbd,pre,samp{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1em;overflow:auto}figure{margin:0 0 1em}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}[role=button],a,area,button,input:not([type=range]),label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75em;padding-bottom:.3em;color:rgba(0,0,0,.45);text-align:left;caption-side:bottom}th{text-align:inherit}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit;color:inherit}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{padding:0;border-style:none}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5em;font-size:1.5em;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}mark{padding:.2em;background-color:#feffe6}::-moz-selection{background:#1890ff;color:#fff}::selection{background:#1890ff;color:#fff}.clearfix{zoom:1}.clearfix:after,.clearfix:before{content:"";display:table}.clearfix:after{clear:both}.anticon{display:inline-block;font-style:normal;vertical-align:-.125em;text-align:center;text-transform:none;line-height:0;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.anticon>*{line-height:1}.anticon svg{display:inline-block}.anticon:before{display:none}.anticon .anticon-icon{display:block}.anticon-spin,.anticon-spin:before{display:inline-block;-webkit-animation:loadingCircle 1s infinite linear;animation:loadingCircle 1s infinite linear}.fade-appear,.fade-enter,.fade-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.fade-appear.fade-appear-active,.fade-enter.fade-enter-active{-webkit-animation-name:antFadeIn;animation-name:antFadeIn;-webkit-animation-play-state:running;animation-play-state:running}.fade-leave.fade-leave-active{-webkit-animation-name:antFadeOut;animation-name:antFadeOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.fade-appear,.fade-enter{opacity:0}.fade-appear,.fade-enter,.fade-leave{-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes antFadeIn{0%{opacity:0}to{opacity:1}}@keyframes antFadeIn{0%{opacity:0}to{opacity:1}}@-webkit-keyframes antFadeOut{0%{opacity:1}to{opacity:0}}@keyframes antFadeOut{0%{opacity:1}to{opacity:0}}.move-up-appear,.move-up-enter,.move-up-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-up-appear.move-up-appear-active,.move-up-enter.move-up-enter-active{-webkit-animation-name:antMoveUpIn;animation-name:antMoveUpIn;-webkit-animation-play-state:running;animation-play-state:running}.move-up-leave.move-up-leave-active{-webkit-animation-name:antMoveUpOut;animation-name:antMoveUpOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.move-up-appear,.move-up-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.move-up-leave{-webkit-animation-timing-function:cubic-bezier(.6,.04,.98,.34);animation-timing-function:cubic-bezier(.6,.04,.98,.34)}.move-down-appear,.move-down-enter,.move-down-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-down-appear.move-down-appear-active,.move-down-enter.move-down-enter-active{-webkit-animation-name:antMoveDownIn;animation-name:antMoveDownIn;-webkit-animation-play-state:running;animation-play-state:running}.move-down-leave.move-down-leave-active{-webkit-animation-name:antMoveDownOut;animation-name:antMoveDownOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.move-down-appear,.move-down-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.move-down-leave{-webkit-animation-timing-function:cubic-bezier(.6,.04,.98,.34);animation-timing-function:cubic-bezier(.6,.04,.98,.34)}.move-left-appear,.move-left-enter,.move-left-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-left-appear.move-left-appear-active,.move-left-enter.move-left-enter-active{-webkit-animation-name:antMoveLeftIn;animation-name:antMoveLeftIn;-webkit-animation-play-state:running;animation-play-state:running}.move-left-leave.move-left-leave-active{-webkit-animation-name:antMoveLeftOut;animation-name:antMoveLeftOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.move-left-appear,.move-left-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.move-left-leave{-webkit-animation-timing-function:cubic-bezier(.6,.04,.98,.34);animation-timing-function:cubic-bezier(.6,.04,.98,.34)}.move-right-appear,.move-right-enter,.move-right-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-right-appear.move-right-appear-active,.move-right-enter.move-right-enter-active{-webkit-animation-name:antMoveRightIn;animation-name:antMoveRightIn;-webkit-animation-play-state:running;animation-play-state:running}.move-right-leave.move-right-leave-active{-webkit-animation-name:antMoveRightOut;animation-name:antMoveRightOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.move-right-appear,.move-right-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.move-right-leave{-webkit-animation-timing-function:cubic-bezier(.6,.04,.98,.34);animation-timing-function:cubic-bezier(.6,.04,.98,.34)}@-webkit-keyframes antMoveDownIn{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes antMoveDownIn{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@-webkit-keyframes antMoveDownOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}}@keyframes antMoveDownOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}}@-webkit-keyframes antMoveLeftIn{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}}@keyframes antMoveLeftIn{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}}@-webkit-keyframes antMoveLeftOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}@keyframes antMoveLeftOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}@-webkit-keyframes antMoveRightIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes antMoveRightIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes antMoveRightOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@keyframes antMoveRightOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@-webkit-keyframes antMoveUpIn{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(-100%);transform:translateY(-100%);opacity:0}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes antMoveUpIn{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(-100%);transform:translateY(-100%);opacity:0}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@-webkit-keyframes antMoveUpOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(-100%);transform:translateY(-100%);opacity:0}}@keyframes antMoveUpOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(-100%);transform:translateY(-100%);opacity:0}}@-webkit-keyframes loadingCircle{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes loadingCircle{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}[ant-click-animating-without-extra-node],[ant-click-animating]{position:relative}.ant-click-animating-node,[ant-click-animating-without-extra-node]:after{content:"";position:absolute;top:-1px;left:-1px;bottom:-1px;right:-1px;border-radius:inherit;border:0 solid #1890ff;opacity:.2;-webkit-animation:fadeEffect 2s cubic-bezier(.08,.82,.17,1),waveEffect .4s cubic-bezier(.08,.82,.17,1);animation:fadeEffect 2s cubic-bezier(.08,.82,.17,1),waveEffect .4s cubic-bezier(.08,.82,.17,1);-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;display:block;pointer-events:none}@-webkit-keyframes waveEffect{to{top:-6px;left:-6px;bottom:-6px;right:-6px;border-width:6px}}@keyframes waveEffect{to{top:-6px;left:-6px;bottom:-6px;right:-6px;border-width:6px}}@-webkit-keyframes fadeEffect{to{opacity:0}}@keyframes fadeEffect{to{opacity:0}}.slide-up-appear,.slide-up-enter,.slide-up-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-up-appear.slide-up-appear-active,.slide-up-enter.slide-up-enter-active{-webkit-animation-name:antSlideUpIn;animation-name:antSlideUpIn;-webkit-animation-play-state:running;animation-play-state:running}.slide-up-leave.slide-up-leave-active{-webkit-animation-name:antSlideUpOut;animation-name:antSlideUpOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.slide-up-appear,.slide-up-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1)}.slide-up-leave{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06)}.slide-down-appear,.slide-down-enter,.slide-down-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-down-appear.slide-down-appear-active,.slide-down-enter.slide-down-enter-active{-webkit-animation-name:antSlideDownIn;animation-name:antSlideDownIn;-webkit-animation-play-state:running;animation-play-state:running}.slide-down-leave.slide-down-leave-active{-webkit-animation-name:antSlideDownOut;animation-name:antSlideDownOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.slide-down-appear,.slide-down-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1)}.slide-down-leave{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06)}.slide-left-appear,.slide-left-enter,.slide-left-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-left-appear.slide-left-appear-active,.slide-left-enter.slide-left-enter-active{-webkit-animation-name:antSlideLeftIn;animation-name:antSlideLeftIn;-webkit-animation-play-state:running;animation-play-state:running}.slide-left-leave.slide-left-leave-active{-webkit-animation-name:antSlideLeftOut;animation-name:antSlideLeftOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.slide-left-appear,.slide-left-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1)}.slide-left-leave{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06)}.slide-right-appear,.slide-right-enter,.slide-right-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-right-appear.slide-right-appear-active,.slide-right-enter.slide-right-enter-active{-webkit-animation-name:antSlideRightIn;animation-name:antSlideRightIn;-webkit-animation-play-state:running;animation-play-state:running}.slide-right-leave.slide-right-leave-active{-webkit-animation-name:antSlideRightOut;animation-name:antSlideRightOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.slide-right-appear,.slide-right-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1)}.slide-right-leave{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06)}@-webkit-keyframes antSlideUpIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.8);transform:scaleY(.8)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(1);transform:scaleY(1)}}@keyframes antSlideUpIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.8);transform:scaleY(.8)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(1);transform:scaleY(1)}}@-webkit-keyframes antSlideUpOut{0%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(1);transform:scaleY(1)}to{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.8);transform:scaleY(.8)}}@keyframes antSlideUpOut{0%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(1);transform:scaleY(1)}to{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.8);transform:scaleY(.8)}}@-webkit-keyframes antSlideDownIn{0%{opacity:0;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(.8);transform:scaleY(.8)}to{opacity:1;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(1);transform:scaleY(1)}}@keyframes antSlideDownIn{0%{opacity:0;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(.8);transform:scaleY(.8)}to{opacity:1;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(1);transform:scaleY(1)}}@-webkit-keyframes antSlideDownOut{0%{opacity:1;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(1);transform:scaleY(1)}to{opacity:0;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(.8);transform:scaleY(.8)}}@keyframes antSlideDownOut{0%{opacity:1;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(1);transform:scaleY(1)}to{opacity:0;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(.8);transform:scaleY(.8)}}@-webkit-keyframes antSlideLeftIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes antSlideLeftIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(1);transform:scaleX(1)}}@-webkit-keyframes antSlideLeftOut{0%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(1);transform:scaleX(1)}to{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}}@keyframes antSlideLeftOut{0%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(1);transform:scaleX(1)}to{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}}@-webkit-keyframes antSlideRightIn{0%{opacity:0;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}to{opacity:1;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes antSlideRightIn{0%{opacity:0;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}to{opacity:1;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(1);transform:scaleX(1)}}@-webkit-keyframes antSlideRightOut{0%{opacity:1;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(1);transform:scaleX(1)}to{opacity:0;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}}@keyframes antSlideRightOut{0%{opacity:1;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(1);transform:scaleX(1)}to{opacity:0;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}}.swing-appear,.swing-enter{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.swing-appear.swing-appear-active,.swing-enter.swing-enter-active{-webkit-animation-name:antSwingIn;animation-name:antSwingIn;-webkit-animation-play-state:running;animation-play-state:running}@-webkit-keyframes antSwingIn{0%,to{-webkit-transform:translateX(0);transform:translateX(0)}20%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}40%{-webkit-transform:translateX(10px);transform:translateX(10px)}60%{-webkit-transform:translateX(-5px);transform:translateX(-5px)}80%{-webkit-transform:translateX(5px);transform:translateX(5px)}}@keyframes antSwingIn{0%,to{-webkit-transform:translateX(0);transform:translateX(0)}20%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}40%{-webkit-transform:translateX(10px);transform:translateX(10px)}60%{-webkit-transform:translateX(-5px);transform:translateX(-5px)}80%{-webkit-transform:translateX(5px);transform:translateX(5px)}}.zoom-appear,.zoom-enter,.zoom-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.zoom-appear.zoom-appear-active,.zoom-enter.zoom-enter-active{-webkit-animation-name:antZoomIn;animation-name:antZoomIn;-webkit-animation-play-state:running;animation-play-state:running}.zoom-leave.zoom-leave-active{-webkit-animation-name:antZoomOut;animation-name:antZoomOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.zoom-appear,.zoom-enter{-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.zoom-leave{-webkit-animation-timing-function:cubic-bezier(.78,.14,.15,.86);animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.zoom-big-appear,.zoom-big-enter,.zoom-big-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.zoom-big-appear.zoom-big-appear-active,.zoom-big-enter.zoom-big-enter-active{-webkit-animation-name:antZoomBigIn;animation-name:antZoomBigIn;-webkit-animation-play-state:running;animation-play-state:running}.zoom-big-leave.zoom-big-leave-active{-webkit-animation-name:antZoomBigOut;animation-name:antZoomBigOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.zoom-big-appear,.zoom-big-enter{-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.zoom-big-leave{-webkit-animation-timing-function:cubic-bezier(.78,.14,.15,.86);animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.zoom-big-fast-appear,.zoom-big-fast-enter,.zoom-big-fast-leave{-webkit-animation-duration:.1s;animation-duration:.1s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.zoom-big-fast-appear.zoom-big-fast-appear-active,.zoom-big-fast-enter.zoom-big-fast-enter-active{-webkit-animation-name:antZoomBigIn;animation-name:antZoomBigIn;-webkit-animation-play-state:running;animation-play-state:running}.zoom-big-fast-leave.zoom-big-fast-leave-active{-webkit-animation-name:antZoomBigOut;animation-name:antZoomBigOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.zoom-big-fast-appear,.zoom-big-fast-enter{-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.zoom-big-fast-leave{-webkit-animation-timing-function:cubic-bezier(.78,.14,.15,.86);animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.zoom-up-appear,.zoom-up-enter,.zoom-up-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.zoom-up-appear.zoom-up-appear-active,.zoom-up-enter.zoom-up-enter-active{-webkit-animation-name:antZoomUpIn;animation-name:antZoomUpIn;-webkit-animation-play-state:running;animation-play-state:running}.zoom-up-leave.zoom-up-leave-active{-webkit-animation-name:antZoomUpOut;animation-name:antZoomUpOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.zoom-up-appear,.zoom-up-enter{-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.zoom-up-leave{-webkit-animation-timing-function:cubic-bezier(.78,.14,.15,.86);animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.zoom-down-appear,.zoom-down-enter,.zoom-down-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.zoom-down-appear.zoom-down-appear-active,.zoom-down-enter.zoom-down-enter-active{-webkit-animation-name:antZoomDownIn;animation-name:antZoomDownIn;-webkit-animation-play-state:running;animation-play-state:running}.zoom-down-leave.zoom-down-leave-active{-webkit-animation-name:antZoomDownOut;animation-name:antZoomDownOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.zoom-down-appear,.zoom-down-enter{-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.zoom-down-leave{-webkit-animation-timing-function:cubic-bezier(.78,.14,.15,.86);animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.zoom-left-appear,.zoom-left-enter,.zoom-left-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.zoom-left-appear.zoom-left-appear-active,.zoom-left-enter.zoom-left-enter-active{-webkit-animation-name:antZoomLeftIn;animation-name:antZoomLeftIn;-webkit-animation-play-state:running;animation-play-state:running}.zoom-left-leave.zoom-left-leave-active{-webkit-animation-name:antZoomLeftOut;animation-name:antZoomLeftOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.zoom-left-appear,.zoom-left-enter{-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.zoom-left-leave{-webkit-animation-timing-function:cubic-bezier(.78,.14,.15,.86);animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.zoom-right-appear,.zoom-right-enter,.zoom-right-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.zoom-right-appear.zoom-right-appear-active,.zoom-right-enter.zoom-right-enter-active{-webkit-animation-name:antZoomRightIn;animation-name:antZoomRightIn;-webkit-animation-play-state:running;animation-play-state:running}.zoom-right-leave.zoom-right-leave-active{-webkit-animation-name:antZoomRightOut;animation-name:antZoomRightOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.zoom-right-appear,.zoom-right-enter{-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.zoom-right-leave{-webkit-animation-timing-function:cubic-bezier(.78,.14,.15,.86);animation-timing-function:cubic-bezier(.78,.14,.15,.86)}@-webkit-keyframes antZoomIn{0%{opacity:0;-webkit-transform:scale(.2);transform:scale(.2)}to{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes antZoomIn{0%{opacity:0;-webkit-transform:scale(.2);transform:scale(.2)}to{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes antZoomOut{0%{-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform:scale(.2);transform:scale(.2)}}@keyframes antZoomOut{0%{-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform:scale(.2);transform:scale(.2)}}@-webkit-keyframes antZoomBigIn{0%{opacity:0;-webkit-transform:scale(.8);transform:scale(.8)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes antZoomBigIn{0%{opacity:0;-webkit-transform:scale(.8);transform:scale(.8)}to{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes antZoomBigOut{0%{-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform:scale(.8);transform:scale(.8)}}@keyframes antZoomBigOut{0%{-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform:scale(.8);transform:scale(.8)}}@-webkit-keyframes antZoomUpIn{0%{opacity:0;-webkit-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:scale(.8);transform:scale(.8)}to{-webkit-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:scale(1);transform:scale(1)}}@keyframes antZoomUpIn{0%{opacity:0;-webkit-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:scale(.8);transform:scale(.8)}to{-webkit-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes antZoomUpOut{0%{-webkit-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:scale(.8);transform:scale(.8)}}@keyframes antZoomUpOut{0%{-webkit-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:scale(.8);transform:scale(.8)}}@-webkit-keyframes antZoomLeftIn{0%{opacity:0;-webkit-transform-origin:0 50%;transform-origin:0 50%;-webkit-transform:scale(.8);transform:scale(.8)}to{-webkit-transform-origin:0 50%;transform-origin:0 50%;-webkit-transform:scale(1);transform:scale(1)}}@keyframes antZoomLeftIn{0%{opacity:0;-webkit-transform-origin:0 50%;transform-origin:0 50%;-webkit-transform:scale(.8);transform:scale(.8)}to{-webkit-transform-origin:0 50%;transform-origin:0 50%;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes antZoomLeftOut{0%{-webkit-transform-origin:0 50%;transform-origin:0 50%;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform-origin:0 50%;transform-origin:0 50%;-webkit-transform:scale(.8);transform:scale(.8)}}@keyframes antZoomLeftOut{0%{-webkit-transform-origin:0 50%;transform-origin:0 50%;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform-origin:0 50%;transform-origin:0 50%;-webkit-transform:scale(.8);transform:scale(.8)}}@-webkit-keyframes antZoomRightIn{0%{opacity:0;-webkit-transform-origin:100% 50%;transform-origin:100% 50%;-webkit-transform:scale(.8);transform:scale(.8)}to{-webkit-transform-origin:100% 50%;transform-origin:100% 50%;-webkit-transform:scale(1);transform:scale(1)}}@keyframes antZoomRightIn{0%{opacity:0;-webkit-transform-origin:100% 50%;transform-origin:100% 50%;-webkit-transform:scale(.8);transform:scale(.8)}to{-webkit-transform-origin:100% 50%;transform-origin:100% 50%;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes antZoomRightOut{0%{-webkit-transform-origin:100% 50%;transform-origin:100% 50%;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform-origin:100% 50%;transform-origin:100% 50%;-webkit-transform:scale(.8);transform:scale(.8)}}@keyframes antZoomRightOut{0%{-webkit-transform-origin:100% 50%;transform-origin:100% 50%;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform-origin:100% 50%;transform-origin:100% 50%;-webkit-transform:scale(.8);transform:scale(.8)}}@-webkit-keyframes antZoomDownIn{0%{opacity:0;-webkit-transform-origin:50% 100%;transform-origin:50% 100%;-webkit-transform:scale(.8);transform:scale(.8)}to{-webkit-transform-origin:50% 100%;transform-origin:50% 100%;-webkit-transform:scale(1);transform:scale(1)}}@keyframes antZoomDownIn{0%{opacity:0;-webkit-transform-origin:50% 100%;transform-origin:50% 100%;-webkit-transform:scale(.8);transform:scale(.8)}to{-webkit-transform-origin:50% 100%;transform-origin:50% 100%;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes antZoomDownOut{0%{-webkit-transform-origin:50% 100%;transform-origin:50% 100%;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform-origin:50% 100%;transform-origin:50% 100%;-webkit-transform:scale(.8);transform:scale(.8)}}@keyframes antZoomDownOut{0%{-webkit-transform-origin:50% 100%;transform-origin:50% 100%;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform-origin:50% 100%;transform-origin:50% 100%;-webkit-transform:scale(.8);transform:scale(.8)}}.ant-motion-collapse{overflow:hidden}.ant-motion-collapse-active{-webkit-transition:height .15s cubic-bezier(.645,.045,.355,1),opacity .15s cubic-bezier(.645,.045,.355,1)!important;transition:height .15s cubic-bezier(.645,.045,.355,1),opacity .15s cubic-bezier(.645,.045,.355,1)!important}.ant-affix{position:fixed;z-index:10}.ant-alert{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;position:relative;padding:8px 15px 8px 37px;border-radius:4px}.ant-alert.ant-alert-no-icon{padding:8px 15px}.ant-alert-icon{top:11.5px;left:16px;position:absolute}.ant-alert-description{font-size:14px;line-height:22px;display:none}.ant-alert-success{border:1px solid #b7eb8f;background-color:#f6ffed}.ant-alert-success .ant-alert-icon{color:#52c41a}.ant-alert-info{border:1px solid #91d5ff;background-color:#e6f7ff}.ant-alert-info .ant-alert-icon{color:#1890ff}.ant-alert-warning{border:1px solid #ffe58f;background-color:#fffbe6}.ant-alert-warning .ant-alert-icon{color:#faad14}.ant-alert-error{border:1px solid #ffa39e;background-color:#fff1f0}.ant-alert-error .ant-alert-icon{color:#f5222d}.ant-alert-close-icon{font-size:12px;position:absolute;right:16px;top:8px;line-height:22px;overflow:hidden;cursor:pointer}.ant-alert-close-icon .anticon-close{color:rgba(0,0,0,.45);-webkit-transition:color .3s;transition:color .3s}.ant-alert-close-icon .anticon-close:hover{color:#404040}.ant-alert-close-text{position:absolute;right:16px}.ant-alert-with-description{padding:15px 15px 15px 64px;position:relative;border-radius:4px;color:rgba(0,0,0,.65);line-height:1.5}.ant-alert-with-description.ant-alert-no-icon{padding:15px}.ant-alert-with-description .ant-alert-icon{position:absolute;top:16px;left:24px;font-size:24px}.ant-alert-with-description .ant-alert-close-icon{position:absolute;top:16px;right:16px;cursor:pointer;font-size:14px}.ant-alert-with-description .ant-alert-message{font-size:16px;color:rgba(0,0,0,.85);display:block;margin-bottom:4px}.ant-alert-with-description .ant-alert-description{display:block}.ant-alert.ant-alert-close{height:0!important;margin:0;padding-top:0;padding-bottom:0;-webkit-transition:all .3s cubic-bezier(.78,.14,.15,.86);transition:all .3s cubic-bezier(.78,.14,.15,.86);-webkit-transform-origin:50% 0;-ms-transform-origin:50% 0;transform-origin:50% 0}.ant-alert-slide-up-leave{-webkit-animation:antAlertSlideUpOut .3s cubic-bezier(.78,.14,.15,.86);animation:antAlertSlideUpOut .3s cubic-bezier(.78,.14,.15,.86);-webkit-animation-fill-mode:both;animation-fill-mode:both}.ant-alert-banner{border-radius:0;border:0;margin-bottom:0}@-webkit-keyframes antAlertSlideUpIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(0);transform:scaleY(0)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(1);transform:scaleY(1)}}@keyframes antAlertSlideUpIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(0);transform:scaleY(0)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(1);transform:scaleY(1)}}@-webkit-keyframes antAlertSlideUpOut{0%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(1);transform:scaleY(1)}to{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(0);transform:scaleY(0)}}@keyframes antAlertSlideUpOut{0%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(1);transform:scaleY(1)}to{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(0);transform:scaleY(0)}}.ant-anchor{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;position:relative;padding-left:2px}.ant-anchor-wrapper{background-color:#fff;overflow:auto;padding-left:4px;margin-left:-4px}.ant-anchor-ink{position:absolute;height:100%;left:0;top:0}.ant-anchor-ink:before{content:" ";position:relative;width:2px;height:100%;display:block;background-color:#e8e8e8;margin:0 auto}.ant-anchor-ink-ball{display:none;position:absolute;width:8px;height:8px;border-radius:8px;border:2px solid #1890ff;background-color:#fff;left:50%;-webkit-transition:top .3s ease-in-out;transition:top .3s ease-in-out;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ant-anchor-ink-ball.visible{display:inline-block}.ant-anchor.fixed .ant-anchor-ink .ant-anchor-ink-ball{display:none}.ant-anchor-link{padding:8px 0 8px 16px;line-height:1}.ant-anchor-link-title{display:block;position:relative;-webkit-transition:all .3s;transition:all .3s;color:rgba(0,0,0,.65);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:8px}.ant-anchor-link-title:only-child{margin-bottom:0}.ant-anchor-link-active>.ant-anchor-link-title{color:#1890ff}.ant-anchor-link .ant-anchor-link{padding-top:6px;padding-bottom:6px}.ant-select-auto-complete{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none}.ant-select-auto-complete.ant-select .ant-select-selection{border:0;-webkit-box-shadow:none;box-shadow:none}.ant-select-auto-complete.ant-select .ant-select-selection__rendered{margin-left:0;margin-right:0;height:100%;line-height:32px}.ant-select-auto-complete.ant-select .ant-select-selection__placeholder{margin-left:12px;margin-right:12px}.ant-select-auto-complete.ant-select .ant-select-selection--single{height:auto}.ant-select-auto-complete.ant-select .ant-select-search--inline{position:static;float:left}.ant-select-auto-complete.ant-select-allow-clear .ant-select-selection:hover .ant-select-selection__rendered{margin-right:0!important}.ant-select-auto-complete.ant-select .ant-input{background:transparent;border-width:1px;line-height:1.5;height:32px}.ant-select-auto-complete.ant-select .ant-input:focus,.ant-select-auto-complete.ant-select .ant-input:hover{border-color:#40a9ff;border-right-width:1px!important}.ant-select-auto-complete.ant-select-lg .ant-select-selection__rendered{line-height:40px}.ant-select-auto-complete.ant-select-lg .ant-input{padding-top:6px;padding-bottom:6px;height:40px}.ant-select-auto-complete.ant-select-sm .ant-select-selection__rendered{line-height:24px}.ant-select-auto-complete.ant-select-sm .ant-input{padding-top:1px;padding-bottom:1px;height:24px}.ant-select{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;position:relative;outline:0}.ant-select,.ant-select ol,.ant-select ul{margin:0;padding:0;list-style:none}.ant-select>ul>li>a{padding:0;background-color:#fff}.ant-select-arrow{display:inline-block;font-style:normal;vertical-align:-.125em;text-align:center;text-transform:none;line-height:0;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;position:absolute;top:50%;right:11px;line-height:1;margin-top:-6px;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;color:rgba(0,0,0,.25);font-size:12px}.ant-select-arrow>*{line-height:1}.ant-select-arrow svg{display:inline-block}.ant-select-arrow:before{display:none}.ant-select-arrow .ant-select-arrow-icon{display:block}.ant-select-arrow .ant-select-arrow-icon svg{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.ant-select-selection{outline:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;background-color:#fff;border-radius:4px;border:1px solid #d9d9d9;border-top-width:1.02px;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1)}.ant-select-selection:hover{border-color:#40a9ff;border-right-width:1px!important}.ant-select-focused .ant-select-selection,.ant-select-selection:active,.ant-select-selection:focus{border-color:#40a9ff;outline:0;-webkit-box-shadow:0 0 0 2px rgba(24,144,255,.2);box-shadow:0 0 0 2px rgba(24,144,255,.2);border-right-width:1px!important}.ant-select-selection__clear{display:inline-block;font-style:normal;vertical-align:baseline;text-align:center;text-transform:none;text-rendering:auto;opacity:0;position:absolute;right:11px;z-index:1;background:#fff;top:50%;font-size:12px;color:rgba(0,0,0,.25);width:12px;height:12px;margin-top:-6px;line-height:12px;cursor:pointer;-webkit-transition:color .3s ease,opacity .15s ease;transition:color .3s ease,opacity .15s ease}.ant-select-selection__clear:before{display:block}.ant-select-selection__clear:hover{color:rgba(0,0,0,.45)}.ant-select-selection:hover .ant-select-selection__clear{opacity:1}.ant-select-selection-selected-value{float:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%;padding-right:20px}.ant-select-no-arrow .ant-select-selection-selected-value{padding-right:0}.ant-select-disabled{color:rgba(0,0,0,.25)}.ant-select-disabled .ant-select-selection{background:#f5f5f5;cursor:not-allowed}.ant-select-disabled .ant-select-selection:active,.ant-select-disabled .ant-select-selection:focus,.ant-select-disabled .ant-select-selection:hover{border-color:#d9d9d9;-webkit-box-shadow:none;box-shadow:none}.ant-select-disabled .ant-select-selection__clear{display:none;visibility:hidden;pointer-events:none}.ant-select-disabled .ant-select-selection--multiple .ant-select-selection__choice{background:#f5f5f5;color:#aaa;padding-right:10px}.ant-select-disabled .ant-select-selection--multiple .ant-select-selection__choice__remove{display:none}.ant-select-selection--single{height:32px;position:relative;cursor:pointer}.ant-select-selection__rendered{display:block;margin-left:11px;margin-right:11px;position:relative;line-height:30px}.ant-select-selection__rendered:after{content:".";visibility:hidden;pointer-events:none;display:inline-block;width:0}.ant-select-lg{font-size:16px}.ant-select-lg .ant-select-selection--single{height:40px}.ant-select-lg .ant-select-selection__rendered{line-height:38px}.ant-select-lg .ant-select-selection--multiple{min-height:40px}.ant-select-lg .ant-select-selection--multiple .ant-select-selection__rendered li{height:32px;line-height:32px}.ant-select-lg .ant-select-selection--multiple .ant-select-selection__clear{top:20px}.ant-select-sm .ant-select-selection--single{height:24px}.ant-select-sm .ant-select-selection__rendered{line-height:22px;margin:0 7px}.ant-select-sm .ant-select-selection--multiple{min-height:24px}.ant-select-sm .ant-select-selection--multiple .ant-select-selection__rendered li{height:16px;line-height:14px}.ant-select-sm .ant-select-selection--multiple .ant-select-selection__clear{top:12px}.ant-select-sm .ant-select-arrow,.ant-select-sm .ant-select-selection__clear{right:8px}.ant-select-disabled .ant-select-selection__choice__remove{color:rgba(0,0,0,.25);cursor:default}.ant-select-disabled .ant-select-selection__choice__remove:hover{color:rgba(0,0,0,.25)}.ant-select-search__field__wrap{display:inline-block;position:relative}.ant-select-search__field__placeholder,.ant-select-selection__placeholder{position:absolute;top:50%;left:0;right:9px;color:#bfbfbf;line-height:20px;height:20px;max-width:100%;margin-top:-10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}.ant-select-search__field__placeholder{left:12px}.ant-select-search__field__mirror{position:absolute;top:0;left:0;white-space:pre;pointer-events:none;opacity:0}.ant-select-search--inline{position:absolute;height:100%;width:100%}.ant-select-search--inline .ant-select-search__field__wrap{width:100%;height:100%}.ant-select-search--inline .ant-select-search__field{border-width:0;font-size:100%;height:100%;width:100%;background:transparent;outline:0;border-radius:4px;line-height:1}.ant-select-search--inline>i{float:right}.ant-select-selection--multiple{min-height:32px;cursor:text;padding-bottom:3px;zoom:1}.ant-select-selection--multiple:after,.ant-select-selection--multiple:before{content:"";display:table}.ant-select-selection--multiple:after{clear:both}.ant-select-selection--multiple .ant-select-search--inline{float:left;position:static;width:auto;padding:0;max-width:100%}.ant-select-selection--multiple .ant-select-search--inline .ant-select-search__field{max-width:100%;width:.75em}.ant-select-selection--multiple .ant-select-selection__rendered{margin-left:5px;margin-bottom:-3px;height:auto}.ant-select-selection--multiple .ant-select-selection__placeholder{margin-left:6px}.ant-select-selection--multiple .ant-select-selection__rendered>ul>li,.ant-select-selection--multiple>ul>li{margin-top:3px;height:24px;line-height:22px}.ant-select-selection--multiple .ant-select-selection__choice{color:rgba(0,0,0,.65);background-color:#fafafa;border:1px solid #e8e8e8;border-radius:2px;cursor:default;float:left;margin-right:4px;max-width:99%;position:relative;overflow:hidden;-webkit-transition:padding .3s cubic-bezier(.645,.045,.355,1);transition:padding .3s cubic-bezier(.645,.045,.355,1);padding:0 20px 0 10px}.ant-select-selection--multiple .ant-select-selection__choice__disabled{padding:0 10px}.ant-select-selection--multiple .ant-select-selection__choice__content{display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;-webkit-transition:margin .3s cubic-bezier(.645,.045,.355,1);transition:margin .3s cubic-bezier(.645,.045,.355,1)}.ant-select-selection--multiple .ant-select-selection__choice__remove{font-style:normal;vertical-align:-.125em;text-align:center;text-transform:none;line-height:0;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:rgba(0,0,0,.45);line-height:inherit;cursor:pointer;font-weight:700;-webkit-transition:all .3s;transition:all .3s;display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);-ms-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg);position:absolute;right:4px}.ant-select-selection--multiple .ant-select-selection__choice__remove>*{line-height:1}.ant-select-selection--multiple .ant-select-selection__choice__remove svg{display:inline-block}.ant-select-selection--multiple .ant-select-selection__choice__remove:before{display:none}.ant-select-selection--multiple .ant-select-selection__choice__remove .ant-select-selection--multiple .ant-select-selection__choice__remove-icon{display:block}:root .ant-select-selection--multiple .ant-select-selection__choice__remove{font-size:12px}.ant-select-selection--multiple .ant-select-selection__choice__remove:hover{color:#404040}.ant-select-selection--multiple .ant-select-selection__clear{top:16px}.ant-select-allow-clear .ant-select-selection--single .ant-select-selection-selected-value{padding-right:16px}.ant-select-allow-clear .ant-select-selection--multiple .ant-select-selection__rendered{margin-right:20px}.ant-select-open .ant-select-arrow-icon svg{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.ant-select-open .ant-select-selection{border-color:#40a9ff;outline:0;-webkit-box-shadow:0 0 0 2px rgba(24,144,255,.2);box-shadow:0 0 0 2px rgba(24,144,255,.2);border-right-width:1px!important}.ant-select-combobox .ant-select-arrow{display:none}.ant-select-combobox .ant-select-search--inline{height:100%;width:100%;float:none}.ant-select-combobox .ant-select-search__field__wrap{width:100%;height:100%}.ant-select-combobox .ant-select-search__field{width:100%;height:100%;position:relative;z-index:1;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1),height 0s;transition:all .3s cubic-bezier(.645,.045,.355,1),height 0s;-webkit-box-shadow:none;box-shadow:none}.ant-select-combobox.ant-select-allow-clear .ant-select-selection:hover .ant-select-selection__rendered{margin-right:20px}.ant-select-dropdown{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);margin:0;padding:0;list-style:none;font-variant:normal;background-color:#fff;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.15);box-shadow:0 2px 8px rgba(0,0,0,.15);border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box;z-index:1050;left:-9999px;top:-9999px;position:absolute;outline:none;font-size:14px}.ant-select-dropdown.slide-up-appear.slide-up-appear-active.ant-select-dropdown-placement-bottomLeft,.ant-select-dropdown.slide-up-enter.slide-up-enter-active.ant-select-dropdown-placement-bottomLeft{-webkit-animation-name:antSlideUpIn;animation-name:antSlideUpIn}.ant-select-dropdown.slide-up-appear.slide-up-appear-active.ant-select-dropdown-placement-topLeft,.ant-select-dropdown.slide-up-enter.slide-up-enter-active.ant-select-dropdown-placement-topLeft{-webkit-animation-name:antSlideDownIn;animation-name:antSlideDownIn}.ant-select-dropdown.slide-up-leave.slide-up-leave-active.ant-select-dropdown-placement-bottomLeft{-webkit-animation-name:antSlideUpOut;animation-name:antSlideUpOut}.ant-select-dropdown.slide-up-leave.slide-up-leave-active.ant-select-dropdown-placement-topLeft{-webkit-animation-name:antSlideDownOut;animation-name:antSlideDownOut}.ant-select-dropdown-hidden{display:none}.ant-select-dropdown-menu{outline:none;margin-bottom:0;padding-left:0;list-style:none;max-height:250px;overflow:auto}.ant-select-dropdown-menu-item-group-list{margin:0;padding:0}.ant-select-dropdown-menu-item-group-list>.ant-select-dropdown-menu-item{padding-left:20px}.ant-select-dropdown-menu-item-group-title{color:rgba(0,0,0,.45);padding:0 12px;height:32px;line-height:32px;font-size:12px}.ant-select-dropdown-menu-item-group-list .ant-select-dropdown-menu-item:first-child:not(:last-child),.ant-select-dropdown-menu-item-group:not(:last-child) .ant-select-dropdown-menu-item-group-list .ant-select-dropdown-menu-item:last-child{border-radius:0}.ant-select-dropdown-menu-item{position:relative;display:block;padding:5px 12px;line-height:22px;font-weight:400;color:rgba(0,0,0,.65);white-space:nowrap;cursor:pointer;overflow:hidden;text-overflow:ellipsis;-webkit-transition:background .3s ease;transition:background .3s ease}.ant-select-dropdown-menu-item:hover{background-color:#e6f7ff}.ant-select-dropdown-menu-item:first-child{border-radius:4px 4px 0 0}.ant-select-dropdown-menu-item:last-child{border-radius:0 0 4px 4px}.ant-select-dropdown-menu-item-disabled{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-select-dropdown-menu-item-disabled:hover{color:rgba(0,0,0,.25);background-color:#fff;cursor:not-allowed}.ant-select-dropdown-menu-item-selected,.ant-select-dropdown-menu-item-selected:hover{background-color:#fafafa;font-weight:600;color:rgba(0,0,0,.65)}.ant-select-dropdown-menu-item-active{background-color:#e6f7ff}.ant-select-dropdown-menu-item-divider{height:1px;margin:1px 0;overflow:hidden;background-color:#e8e8e8;line-height:0}.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item .ant-select-selected-icon{color:transparent;display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);-ms-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg);-webkit-transition:all .2s ease;transition:all .2s ease;position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);right:12px;font-weight:700;text-shadow:0 .1px 0,.1px 0 0,0 -.1px 0,-.1px 0}:root .ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item .ant-select-selected-icon{font-size:12px}.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item:hover .ant-select-selected-icon{color:#ddd}.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item-disabled .ant-select-selected-icon{display:none}.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item-selected .ant-select-selected-icon,.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item-selected:hover .ant-select-selected-icon{color:#1890ff;display:inline-block}.ant-select-dropdown-container-open .ant-select-dropdown,.ant-select-dropdown-open .ant-select-dropdown{display:block}.ant-input{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-variant:tabular-nums;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;position:relative;display:inline-block;padding:4px 11px;width:100%;height:32px;font-size:14px;line-height:1.5;color:rgba(0,0,0,.65);background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:4px;-webkit-transition:all .3s;transition:all .3s}.ant-input::-moz-placeholder{color:#bfbfbf;opacity:1}.ant-input:-ms-input-placeholder{color:#bfbfbf}.ant-input::-webkit-input-placeholder{color:#bfbfbf}.ant-input:focus,.ant-input:hover{border-color:#40a9ff;border-right-width:1px!important}.ant-input:focus{outline:0;-webkit-box-shadow:0 0 0 2px rgba(24,144,255,.2);box-shadow:0 0 0 2px rgba(24,144,255,.2)}.ant-input-disabled{background-color:#f5f5f5;opacity:1;cursor:not-allowed;color:rgba(0,0,0,.25)}.ant-input-disabled:hover{border-color:#e6d8d8;border-right-width:1px!important}textarea.ant-input{max-width:100%;height:auto;vertical-align:bottom;-webkit-transition:all .3s,height 0s;transition:all .3s,height 0s;min-height:32px}.ant-input-lg{padding:6px 11px;height:40px;font-size:16px}.ant-input-sm{padding:1px 7px;height:24px}.ant-input-group{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;position:relative;display:table;border-collapse:separate;border-spacing:0;width:100%}.ant-input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.ant-input-group>[class*=col-]{padding-right:8px}.ant-input-group>[class*=col-]:last-child{padding-right:0}.ant-input-group-addon,.ant-input-group-wrap,.ant-input-group>.ant-input{display:table-cell}.ant-input-group-addon:not(:first-child):not(:last-child),.ant-input-group-wrap:not(:first-child):not(:last-child),.ant-input-group>.ant-input:not(:first-child):not(:last-child){border-radius:0}.ant-input-group-addon,.ant-input-group-wrap{width:1px;white-space:nowrap;vertical-align:middle}.ant-input-group-wrap>*{display:block!important}.ant-input-group .ant-input{float:left;width:100%;margin-bottom:0}.ant-input-group .ant-input:focus,.ant-input-group .ant-input:hover{z-index:1;border-right-width:1px}.ant-input-group-addon{padding:0 11px;font-size:14px;font-weight:400;line-height:1;color:rgba(0,0,0,.65);text-align:center;background-color:#fafafa;border:1px solid #d9d9d9;border-radius:4px;position:relative;-webkit-transition:all .3s;transition:all .3s}.ant-input-group-addon .ant-select{margin:-5px -11px}.ant-input-group-addon .ant-select .ant-select-selection{background-color:inherit;margin:-1px;border:1px solid transparent;-webkit-box-shadow:none;box-shadow:none}.ant-input-group-addon .ant-select-focused .ant-select-selection,.ant-input-group-addon .ant-select-open .ant-select-selection{color:#1890ff}.ant-input-group-addon>i:only-child:after{position:absolute;content:"";top:0;left:0;right:0;bottom:0}.ant-input-group-addon:first-child,.ant-input-group-addon:first-child .ant-select .ant-select-selection,.ant-input-group>.ant-input:first-child,.ant-input-group>.ant-input:first-child .ant-select .ant-select-selection{border-bottom-right-radius:0;border-top-right-radius:0}.ant-input-group>.ant-input-affix-wrapper:not(:first-child) .ant-input{border-bottom-left-radius:0;border-top-left-radius:0}.ant-input-group>.ant-input-affix-wrapper:not(:last-child) .ant-input{border-bottom-right-radius:0;border-top-right-radius:0}.ant-input-group-addon:first-child{border-right:0}.ant-input-group-addon:last-child{border-left:0}.ant-input-group-addon:last-child,.ant-input-group-addon:last-child .ant-select .ant-select-selection,.ant-input-group>.ant-input:last-child,.ant-input-group>.ant-input:last-child .ant-select .ant-select-selection{border-bottom-left-radius:0;border-top-left-radius:0}.ant-input-group-lg .ant-input,.ant-input-group-lg>.ant-input-group-addon{padding:6px 11px;height:40px;font-size:16px}.ant-input-group-sm .ant-input,.ant-input-group-sm>.ant-input-group-addon{padding:1px 7px;height:24px}.ant-input-group-lg .ant-select-selection--single{height:40px}.ant-input-group-sm .ant-select-selection--single{height:24px}.ant-input-group .ant-input-affix-wrapper{display:table-cell;width:100%;float:left}.ant-input-group.ant-input-group-compact{display:block;zoom:1}.ant-input-group.ant-input-group-compact:after,.ant-input-group.ant-input-group-compact:before{content:"";display:table}.ant-input-group.ant-input-group-compact:after{clear:both}.ant-input-group.ant-input-group-compact>*{border-radius:0;border-right-width:0;vertical-align:top;float:none;display:inline-block}.ant-input-group.ant-input-group-compact>span:not(:last-child)>.ant-input{border-right-width:0}.ant-input-group.ant-input-group-compact .ant-input{float:none}.ant-input-group.ant-input-group-compact>.ant-calendar-picker .ant-input,.ant-input-group.ant-input-group-compact>.ant-cascader-picker .ant-input,.ant-input-group.ant-input-group-compact>.ant-mention-wrapper .ant-mention-editor,.ant-input-group.ant-input-group-compact>.ant-select-auto-complete .ant-input,.ant-input-group.ant-input-group-compact>.ant-select>.ant-select-selection,.ant-input-group.ant-input-group-compact>.ant-time-picker .ant-time-picker-input{border-radius:0;border-right-width:0}.ant-input-group.ant-input-group-compact>.ant-calendar-picker:first-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-cascader-picker:first-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-mention-wrapper:first-child .ant-mention-editor,.ant-input-group.ant-input-group-compact>.ant-select-auto-complete:first-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-select:first-child>.ant-select-selection,.ant-input-group.ant-input-group-compact>.ant-time-picker:first-child .ant-time-picker-input,.ant-input-group.ant-input-group-compact>:first-child{border-top-left-radius:4px;border-bottom-left-radius:4px}.ant-input-group.ant-input-group-compact>.ant-calendar-picker:last-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-cascader-picker:last-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-mention-wrapper:last-child .ant-mention-editor,.ant-input-group.ant-input-group-compact>.ant-select-auto-complete:last-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-select:last-child>.ant-select-selection,.ant-input-group.ant-input-group-compact>.ant-time-picker:last-child .ant-time-picker-input,.ant-input-group.ant-input-group-compact>:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px;border-right-width:1px}.ant-input-group-wrapper{display:inline-block;vertical-align:top;width:100%}.ant-input-affix-wrapper{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;position:relative;display:inline-block;width:100%}.ant-input-affix-wrapper:hover .ant-input:not(.ant-input-disabled){border-color:#40a9ff;border-right-width:1px!important}.ant-input-affix-wrapper .ant-input{position:static}.ant-input-affix-wrapper .ant-input-prefix,.ant-input-affix-wrapper .ant-input-suffix{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);line-height:0;color:rgba(0,0,0,.65)}.ant-input-affix-wrapper .ant-input-prefix :not(.anticon),.ant-input-affix-wrapper .ant-input-suffix :not(.anticon){line-height:1.5}.ant-input-affix-wrapper .ant-input-prefix{left:12px}.ant-input-affix-wrapper .ant-input-suffix{right:12px}.ant-input-affix-wrapper .ant-input:not(:first-child){padding-left:30px}.ant-input-affix-wrapper .ant-input:not(:last-child){padding-right:30px}.ant-input-affix-wrapper .ant-input{min-height:100%}.ant-input-search-icon{color:rgba(0,0,0,.45);cursor:pointer;-webkit-transition:all .3s;transition:all .3s}.ant-input-search-icon:hover{color:#333}.ant-input-search:not(.ant-input-search-small)>.ant-input-suffix{right:12px}.ant-input-search>.ant-input-suffix>.ant-input-search-button{border-top-left-radius:0;border-bottom-left-radius:0}.ant-input-search>.ant-input-suffix>.ant-input-search-button>.anticon-search{font-size:16px}.ant-input-search.ant-input-search-enter-button>.ant-input{padding-right:46px}.ant-input-search.ant-input-search-enter-button>.ant-input-suffix{right:0}.ant-btn{line-height:1.5;display:inline-block;font-weight:400;text-align:center;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:0 15px;font-size:14px;border-radius:4px;height:32px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);position:relative;-webkit-box-shadow:0 2px 0 rgba(0,0,0,.015);box-shadow:0 2px 0 rgba(0,0,0,.015);color:rgba(0,0,0,.65);background-color:#fff;border-color:#d9d9d9}.ant-btn>.anticon{line-height:1}.ant-btn,.ant-btn:active,.ant-btn:focus{outline:0}.ant-btn:not([disabled]):hover{text-decoration:none}.ant-btn:not([disabled]):active{outline:0;-webkit-transition:none;transition:none;-webkit-box-shadow:none;box-shadow:none}.ant-btn.disabled,.ant-btn[disabled]{cursor:not-allowed}.ant-btn.disabled>*,.ant-btn[disabled]>*{pointer-events:none}.ant-btn-lg{padding:0 15px;font-size:16px;border-radius:4px;height:40px}.ant-btn-sm{padding:0 7px;font-size:14px;border-radius:4px;height:24px}.ant-btn>a:only-child{color:currentColor}.ant-btn>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn:focus,.ant-btn:hover{color:#40a9ff;background-color:#fff;border-color:#40a9ff}.ant-btn:focus>a:only-child,.ant-btn:hover>a:only-child{color:currentColor}.ant-btn:focus>a:only-child:after,.ant-btn:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn.active,.ant-btn:active{color:#096dd9;background-color:#fff;border-color:#096dd9}.ant-btn.active>a:only-child,.ant-btn:active>a:only-child{color:currentColor}.ant-btn.active>a:only-child:after,.ant-btn:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn.disabled,.ant-btn.disabled.active,.ant-btn.disabled:active,.ant-btn.disabled:focus,.ant-btn.disabled:hover,.ant-btn[disabled],.ant-btn[disabled].active,.ant-btn[disabled]:active,.ant-btn[disabled]:focus,.ant-btn[disabled]:hover{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;text-shadow:none;-webkit-box-shadow:none;box-shadow:none}.ant-btn.disabled.active>a:only-child,.ant-btn.disabled:active>a:only-child,.ant-btn.disabled:focus>a:only-child,.ant-btn.disabled:hover>a:only-child,.ant-btn.disabled>a:only-child,.ant-btn[disabled].active>a:only-child,.ant-btn[disabled]:active>a:only-child,.ant-btn[disabled]:focus>a:only-child,.ant-btn[disabled]:hover>a:only-child,.ant-btn[disabled]>a:only-child{color:currentColor}.ant-btn.disabled.active>a:only-child:after,.ant-btn.disabled:active>a:only-child:after,.ant-btn.disabled:focus>a:only-child:after,.ant-btn.disabled:hover>a:only-child:after,.ant-btn.disabled>a:only-child:after,.ant-btn[disabled].active>a:only-child:after,.ant-btn[disabled]:active>a:only-child:after,.ant-btn[disabled]:focus>a:only-child:after,.ant-btn[disabled]:hover>a:only-child:after,.ant-btn[disabled]>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn.active,.ant-btn:active,.ant-btn:focus,.ant-btn:hover{background:#fff;text-decoration:none}.ant-btn>i,.ant-btn>span{pointer-events:none}.ant-btn-primary{color:#fff;background-color:#1890ff;border-color:#1890ff;text-shadow:0 -1px 0 rgba(0,0,0,.12);-webkit-box-shadow:0 2px 0 rgba(0,0,0,.035);box-shadow:0 2px 0 rgba(0,0,0,.035)}.ant-btn-primary>a:only-child{color:currentColor}.ant-btn-primary>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-primary:focus,.ant-btn-primary:hover{color:#fff;background-color:#40a9ff;border-color:#40a9ff}.ant-btn-primary:focus>a:only-child,.ant-btn-primary:hover>a:only-child{color:currentColor}.ant-btn-primary:focus>a:only-child:after,.ant-btn-primary:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-primary.active,.ant-btn-primary:active{color:#fff;background-color:#096dd9;border-color:#096dd9}.ant-btn-primary.active>a:only-child,.ant-btn-primary:active>a:only-child{color:currentColor}.ant-btn-primary.active>a:only-child:after,.ant-btn-primary:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-primary.disabled,.ant-btn-primary.disabled.active,.ant-btn-primary.disabled:active,.ant-btn-primary.disabled:focus,.ant-btn-primary.disabled:hover,.ant-btn-primary[disabled],.ant-btn-primary[disabled].active,.ant-btn-primary[disabled]:active,.ant-btn-primary[disabled]:focus,.ant-btn-primary[disabled]:hover{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;text-shadow:none;-webkit-box-shadow:none;box-shadow:none}.ant-btn-primary.disabled.active>a:only-child,.ant-btn-primary.disabled:active>a:only-child,.ant-btn-primary.disabled:focus>a:only-child,.ant-btn-primary.disabled:hover>a:only-child,.ant-btn-primary.disabled>a:only-child,.ant-btn-primary[disabled].active>a:only-child,.ant-btn-primary[disabled]:active>a:only-child,.ant-btn-primary[disabled]:focus>a:only-child,.ant-btn-primary[disabled]:hover>a:only-child,.ant-btn-primary[disabled]>a:only-child{color:currentColor}.ant-btn-primary.disabled.active>a:only-child:after,.ant-btn-primary.disabled:active>a:only-child:after,.ant-btn-primary.disabled:focus>a:only-child:after,.ant-btn-primary.disabled:hover>a:only-child:after,.ant-btn-primary.disabled>a:only-child:after,.ant-btn-primary[disabled].active>a:only-child:after,.ant-btn-primary[disabled]:active>a:only-child:after,.ant-btn-primary[disabled]:focus>a:only-child:after,.ant-btn-primary[disabled]:hover>a:only-child:after,.ant-btn-primary[disabled]>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child){border-right-color:#40a9ff;border-left-color:#40a9ff}.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child):disabled{border-color:#d9d9d9}.ant-btn-group .ant-btn-primary:first-child:not(:last-child){border-right-color:#40a9ff}.ant-btn-group .ant-btn-primary:first-child:not(:last-child)[disabled]{border-right-color:#d9d9d9}.ant-btn-group .ant-btn-primary+.ant-btn-primary,.ant-btn-group .ant-btn-primary:last-child:not(:first-child){border-left-color:#40a9ff}.ant-btn-group .ant-btn-primary+.ant-btn-primary[disabled],.ant-btn-group .ant-btn-primary:last-child:not(:first-child)[disabled]{border-left-color:#d9d9d9}.ant-btn-ghost{color:rgba(0,0,0,.65);background-color:transparent;border-color:#d9d9d9}.ant-btn-ghost>a:only-child{color:currentColor}.ant-btn-ghost>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-ghost:focus,.ant-btn-ghost:hover{color:#40a9ff;background-color:transparent;border-color:#40a9ff}.ant-btn-ghost:focus>a:only-child,.ant-btn-ghost:hover>a:only-child{color:currentColor}.ant-btn-ghost:focus>a:only-child:after,.ant-btn-ghost:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-ghost.active,.ant-btn-ghost:active{color:#096dd9;background-color:transparent;border-color:#096dd9}.ant-btn-ghost.active>a:only-child,.ant-btn-ghost:active>a:only-child{color:currentColor}.ant-btn-ghost.active>a:only-child:after,.ant-btn-ghost:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-ghost.disabled,.ant-btn-ghost.disabled.active,.ant-btn-ghost.disabled:active,.ant-btn-ghost.disabled:focus,.ant-btn-ghost.disabled:hover,.ant-btn-ghost[disabled],.ant-btn-ghost[disabled].active,.ant-btn-ghost[disabled]:active,.ant-btn-ghost[disabled]:focus,.ant-btn-ghost[disabled]:hover{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;text-shadow:none;-webkit-box-shadow:none;box-shadow:none}.ant-btn-ghost.disabled.active>a:only-child,.ant-btn-ghost.disabled:active>a:only-child,.ant-btn-ghost.disabled:focus>a:only-child,.ant-btn-ghost.disabled:hover>a:only-child,.ant-btn-ghost.disabled>a:only-child,.ant-btn-ghost[disabled].active>a:only-child,.ant-btn-ghost[disabled]:active>a:only-child,.ant-btn-ghost[disabled]:focus>a:only-child,.ant-btn-ghost[disabled]:hover>a:only-child,.ant-btn-ghost[disabled]>a:only-child{color:currentColor}.ant-btn-ghost.disabled.active>a:only-child:after,.ant-btn-ghost.disabled:active>a:only-child:after,.ant-btn-ghost.disabled:focus>a:only-child:after,.ant-btn-ghost.disabled:hover>a:only-child:after,.ant-btn-ghost.disabled>a:only-child:after,.ant-btn-ghost[disabled].active>a:only-child:after,.ant-btn-ghost[disabled]:active>a:only-child:after,.ant-btn-ghost[disabled]:focus>a:only-child:after,.ant-btn-ghost[disabled]:hover>a:only-child:after,.ant-btn-ghost[disabled]>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-dashed{color:rgba(0,0,0,.65);background-color:#fff;border-color:#d9d9d9;border-style:dashed}.ant-btn-dashed>a:only-child{color:currentColor}.ant-btn-dashed>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-dashed:focus,.ant-btn-dashed:hover{color:#40a9ff;background-color:#fff;border-color:#40a9ff}.ant-btn-dashed:focus>a:only-child,.ant-btn-dashed:hover>a:only-child{color:currentColor}.ant-btn-dashed:focus>a:only-child:after,.ant-btn-dashed:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-dashed.active,.ant-btn-dashed:active{color:#096dd9;background-color:#fff;border-color:#096dd9}.ant-btn-dashed.active>a:only-child,.ant-btn-dashed:active>a:only-child{color:currentColor}.ant-btn-dashed.active>a:only-child:after,.ant-btn-dashed:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-dashed.disabled,.ant-btn-dashed.disabled.active,.ant-btn-dashed.disabled:active,.ant-btn-dashed.disabled:focus,.ant-btn-dashed.disabled:hover,.ant-btn-dashed[disabled],.ant-btn-dashed[disabled].active,.ant-btn-dashed[disabled]:active,.ant-btn-dashed[disabled]:focus,.ant-btn-dashed[disabled]:hover{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;text-shadow:none;-webkit-box-shadow:none;box-shadow:none}.ant-btn-dashed.disabled.active>a:only-child,.ant-btn-dashed.disabled:active>a:only-child,.ant-btn-dashed.disabled:focus>a:only-child,.ant-btn-dashed.disabled:hover>a:only-child,.ant-btn-dashed.disabled>a:only-child,.ant-btn-dashed[disabled].active>a:only-child,.ant-btn-dashed[disabled]:active>a:only-child,.ant-btn-dashed[disabled]:focus>a:only-child,.ant-btn-dashed[disabled]:hover>a:only-child,.ant-btn-dashed[disabled]>a:only-child{color:currentColor}.ant-btn-dashed.disabled.active>a:only-child:after,.ant-btn-dashed.disabled:active>a:only-child:after,.ant-btn-dashed.disabled:focus>a:only-child:after,.ant-btn-dashed.disabled:hover>a:only-child:after,.ant-btn-dashed.disabled>a:only-child:after,.ant-btn-dashed[disabled].active>a:only-child:after,.ant-btn-dashed[disabled]:active>a:only-child:after,.ant-btn-dashed[disabled]:focus>a:only-child:after,.ant-btn-dashed[disabled]:hover>a:only-child:after,.ant-btn-dashed[disabled]>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-danger{color:#f5222d;background-color:#f5f5f5;border-color:#d9d9d9}.ant-btn-danger>a:only-child{color:currentColor}.ant-btn-danger>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-danger:hover{color:#fff;background-color:#ff4d4f;border-color:#ff4d4f}.ant-btn-danger:hover>a:only-child{color:currentColor}.ant-btn-danger:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-danger:focus{color:#ff4d4f;background-color:#fff;border-color:#ff4d4f}.ant-btn-danger:focus>a:only-child{color:currentColor}.ant-btn-danger:focus>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-danger.active,.ant-btn-danger:active{color:#fff;background-color:#cf1322;border-color:#cf1322}.ant-btn-danger.active>a:only-child,.ant-btn-danger:active>a:only-child{color:currentColor}.ant-btn-danger.active>a:only-child:after,.ant-btn-danger:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-danger.disabled,.ant-btn-danger.disabled.active,.ant-btn-danger.disabled:active,.ant-btn-danger.disabled:focus,.ant-btn-danger.disabled:hover,.ant-btn-danger[disabled],.ant-btn-danger[disabled].active,.ant-btn-danger[disabled]:active,.ant-btn-danger[disabled]:focus,.ant-btn-danger[disabled]:hover{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;text-shadow:none;-webkit-box-shadow:none;box-shadow:none}.ant-btn-danger.disabled.active>a:only-child,.ant-btn-danger.disabled:active>a:only-child,.ant-btn-danger.disabled:focus>a:only-child,.ant-btn-danger.disabled:hover>a:only-child,.ant-btn-danger.disabled>a:only-child,.ant-btn-danger[disabled].active>a:only-child,.ant-btn-danger[disabled]:active>a:only-child,.ant-btn-danger[disabled]:focus>a:only-child,.ant-btn-danger[disabled]:hover>a:only-child,.ant-btn-danger[disabled]>a:only-child{color:currentColor}.ant-btn-danger.disabled.active>a:only-child:after,.ant-btn-danger.disabled:active>a:only-child:after,.ant-btn-danger.disabled:focus>a:only-child:after,.ant-btn-danger.disabled:hover>a:only-child:after,.ant-btn-danger.disabled>a:only-child:after,.ant-btn-danger[disabled].active>a:only-child:after,.ant-btn-danger[disabled]:active>a:only-child:after,.ant-btn-danger[disabled]:focus>a:only-child:after,.ant-btn-danger[disabled]:hover>a:only-child:after,.ant-btn-danger[disabled]>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-circle,.ant-btn-circle-outline{width:32px;padding:0;font-size:16px;border-radius:50%;height:32px}.ant-btn-circle-outline.ant-btn-lg,.ant-btn-circle.ant-btn-lg{width:40px;padding:0;font-size:18px;border-radius:50%;height:40px}.ant-btn-circle-outline.ant-btn-sm,.ant-btn-circle.ant-btn-sm{width:24px;padding:0;font-size:14px;border-radius:50%;height:24px}.ant-btn:before{position:absolute;top:-1px;left:-1px;bottom:-1px;right:-1px;background:#fff;opacity:.35;content:"";border-radius:inherit;z-index:1;-webkit-transition:opacity .2s;transition:opacity .2s;pointer-events:none;display:none}.ant-btn .anticon{-webkit-transition:margin-left .3s cubic-bezier(.645,.045,.355,1);transition:margin-left .3s cubic-bezier(.645,.045,.355,1)}.ant-btn.ant-btn-loading:before{display:block}.ant-btn.ant-btn-loading:not(.ant-btn-circle):not(.ant-btn-circle-outline):not(.ant-btn-icon-only){padding-left:29px;pointer-events:none;position:relative}.ant-btn.ant-btn-loading:not(.ant-btn-circle):not(.ant-btn-circle-outline):not(.ant-btn-icon-only) .anticon{margin-left:-14px}.ant-btn-sm.ant-btn-loading:not(.ant-btn-circle):not(.ant-btn-circle-outline):not(.ant-btn-icon-only){padding-left:24px}.ant-btn-sm.ant-btn-loading:not(.ant-btn-circle):not(.ant-btn-circle-outline):not(.ant-btn-icon-only) .anticon{margin-left:-17px}.ant-btn-group{position:relative;display:inline-block}.ant-btn-group>.ant-btn,.ant-btn-group>span>.ant-btn{position:relative;line-height:30px}.ant-btn-group>.ant-btn.active,.ant-btn-group>.ant-btn:active,.ant-btn-group>.ant-btn:focus,.ant-btn-group>.ant-btn:hover,.ant-btn-group>span>.ant-btn.active,.ant-btn-group>span>.ant-btn:active,.ant-btn-group>span>.ant-btn:focus,.ant-btn-group>span>.ant-btn:hover{z-index:2}.ant-btn-group>.ant-btn:disabled,.ant-btn-group>span>.ant-btn:disabled{z-index:0}.ant-btn-group-lg>.ant-btn,.ant-btn-group-lg>span>.ant-btn{padding:0 15px;font-size:16px;border-radius:0;height:40px;line-height:38px}.ant-btn-group-sm>.ant-btn,.ant-btn-group-sm>span>.ant-btn{padding:0 7px;font-size:14px;border-radius:0;height:24px;line-height:22px}.ant-btn-group-sm>.ant-btn>.anticon,.ant-btn-group-sm>span>.ant-btn>.anticon{font-size:14px}.ant-btn+.ant-btn-group,.ant-btn-group+.ant-btn,.ant-btn-group+.ant-btn-group,.ant-btn-group .ant-btn+.ant-btn,.ant-btn-group .ant-btn+span,.ant-btn-group>span+span,.ant-btn-group span+.ant-btn{margin-left:-1px}.ant-btn-group .ant-btn-primary+.ant-btn:not(.ant-btn-primary):not([disabled]){border-left-color:transparent}.ant-btn-group .ant-btn{border-radius:0}.ant-btn-group>.ant-btn:first-child,.ant-btn-group>span:first-child>.ant-btn{margin-left:0}.ant-btn-group>.ant-btn:only-child,.ant-btn-group>span:only-child>.ant-btn{border-radius:4px}.ant-btn-group>.ant-btn:first-child:not(:last-child),.ant-btn-group>span:first-child:not(:last-child)>.ant-btn{border-bottom-left-radius:4px;border-top-left-radius:4px}.ant-btn-group>.ant-btn:last-child:not(:first-child),.ant-btn-group>span:last-child:not(:first-child)>.ant-btn{border-bottom-right-radius:4px;border-top-right-radius:4px}.ant-btn-group-sm>.ant-btn:only-child,.ant-btn-group-sm>span:only-child>.ant-btn{border-radius:4px}.ant-btn-group-sm>.ant-btn:first-child:not(:last-child),.ant-btn-group-sm>span:first-child:not(:last-child)>.ant-btn{border-bottom-left-radius:4px;border-top-left-radius:4px}.ant-btn-group-sm>.ant-btn:last-child:not(:first-child),.ant-btn-group-sm>span:last-child:not(:first-child)>.ant-btn{border-bottom-right-radius:4px;border-top-right-radius:4px}.ant-btn-group>.ant-btn-group{float:left}.ant-btn-group>.ant-btn-group:not(:first-child):not(:last-child)>.ant-btn{border-radius:0}.ant-btn-group>.ant-btn-group:first-child:not(:last-child)>.ant-btn:last-child{border-bottom-right-radius:0;border-top-right-radius:0;padding-right:8px}.ant-btn-group>.ant-btn-group:last-child:not(:first-child)>.ant-btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0;padding-left:8px}.ant-btn:not(.ant-btn-circle):not(.ant-btn-circle-outline).ant-btn-icon-only{padding-left:8px;padding-right:8px}.ant-btn:active>span,.ant-btn:focus>span{position:relative}.ant-btn>.anticon+span,.ant-btn>span+.anticon{margin-left:8px}.ant-btn-background-ghost{background:transparent!important;border-color:#fff;color:#fff}.ant-btn-background-ghost.ant-btn-primary{color:#1890ff;background-color:transparent;border-color:#1890ff;text-shadow:none}.ant-btn-background-ghost.ant-btn-primary>a:only-child{color:currentColor}.ant-btn-background-ghost.ant-btn-primary>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-background-ghost.ant-btn-primary:focus,.ant-btn-background-ghost.ant-btn-primary:hover{color:#40a9ff;background-color:transparent;border-color:#40a9ff}.ant-btn-background-ghost.ant-btn-primary:focus>a:only-child,.ant-btn-background-ghost.ant-btn-primary:hover>a:only-child{color:currentColor}.ant-btn-background-ghost.ant-btn-primary:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-background-ghost.ant-btn-primary.active,.ant-btn-background-ghost.ant-btn-primary:active{color:#096dd9;background-color:transparent;border-color:#096dd9}.ant-btn-background-ghost.ant-btn-primary.active>a:only-child,.ant-btn-background-ghost.ant-btn-primary:active>a:only-child{color:currentColor}.ant-btn-background-ghost.ant-btn-primary.active>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-background-ghost.ant-btn-primary.disabled,.ant-btn-background-ghost.ant-btn-primary.disabled.active,.ant-btn-background-ghost.ant-btn-primary.disabled:active,.ant-btn-background-ghost.ant-btn-primary.disabled:focus,.ant-btn-background-ghost.ant-btn-primary.disabled:hover,.ant-btn-background-ghost.ant-btn-primary[disabled],.ant-btn-background-ghost.ant-btn-primary[disabled].active,.ant-btn-background-ghost.ant-btn-primary[disabled]:active,.ant-btn-background-ghost.ant-btn-primary[disabled]:focus,.ant-btn-background-ghost.ant-btn-primary[disabled]:hover{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;text-shadow:none;-webkit-box-shadow:none;box-shadow:none}.ant-btn-background-ghost.ant-btn-primary.disabled.active>a:only-child,.ant-btn-background-ghost.ant-btn-primary.disabled:active>a:only-child,.ant-btn-background-ghost.ant-btn-primary.disabled:focus>a:only-child,.ant-btn-background-ghost.ant-btn-primary.disabled:hover>a:only-child,.ant-btn-background-ghost.ant-btn-primary.disabled>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled].active>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled]:active>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled]:focus>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled]:hover>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled]>a:only-child{color:currentColor}.ant-btn-background-ghost.ant-btn-primary.disabled.active>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary.disabled:active>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary.disabled:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary.disabled:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary.disabled>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled].active>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled]:active>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled]:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled]:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled]>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-background-ghost.ant-btn-danger{color:#f5222d;background-color:transparent;border-color:#f5222d;text-shadow:none}.ant-btn-background-ghost.ant-btn-danger>a:only-child{color:currentColor}.ant-btn-background-ghost.ant-btn-danger>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-background-ghost.ant-btn-danger:focus,.ant-btn-background-ghost.ant-btn-danger:hover{color:#ff4d4f;background-color:transparent;border-color:#ff4d4f}.ant-btn-background-ghost.ant-btn-danger:focus>a:only-child,.ant-btn-background-ghost.ant-btn-danger:hover>a:only-child{color:currentColor}.ant-btn-background-ghost.ant-btn-danger:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-background-ghost.ant-btn-danger.active,.ant-btn-background-ghost.ant-btn-danger:active{color:#cf1322;background-color:transparent;border-color:#cf1322}.ant-btn-background-ghost.ant-btn-danger.active>a:only-child,.ant-btn-background-ghost.ant-btn-danger:active>a:only-child{color:currentColor}.ant-btn-background-ghost.ant-btn-danger.active>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-background-ghost.ant-btn-danger.disabled,.ant-btn-background-ghost.ant-btn-danger.disabled.active,.ant-btn-background-ghost.ant-btn-danger.disabled:active,.ant-btn-background-ghost.ant-btn-danger.disabled:focus,.ant-btn-background-ghost.ant-btn-danger.disabled:hover,.ant-btn-background-ghost.ant-btn-danger[disabled],.ant-btn-background-ghost.ant-btn-danger[disabled].active,.ant-btn-background-ghost.ant-btn-danger[disabled]:active,.ant-btn-background-ghost.ant-btn-danger[disabled]:focus,.ant-btn-background-ghost.ant-btn-danger[disabled]:hover{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;text-shadow:none;-webkit-box-shadow:none;box-shadow:none}.ant-btn-background-ghost.ant-btn-danger.disabled.active>a:only-child,.ant-btn-background-ghost.ant-btn-danger.disabled:active>a:only-child,.ant-btn-background-ghost.ant-btn-danger.disabled:focus>a:only-child,.ant-btn-background-ghost.ant-btn-danger.disabled:hover>a:only-child,.ant-btn-background-ghost.ant-btn-danger.disabled>a:only-child,.ant-btn-background-ghost.ant-btn-danger[disabled].active>a:only-child,.ant-btn-background-ghost.ant-btn-danger[disabled]:active>a:only-child,.ant-btn-background-ghost.ant-btn-danger[disabled]:focus>a:only-child,.ant-btn-background-ghost.ant-btn-danger[disabled]:hover>a:only-child,.ant-btn-background-ghost.ant-btn-danger[disabled]>a:only-child{color:currentColor}.ant-btn-background-ghost.ant-btn-danger.disabled.active>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger.disabled:active>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger.disabled:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger.disabled:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger.disabled>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger[disabled].active>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger[disabled]:active>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger[disabled]:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger[disabled]:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-danger[disabled]>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-two-chinese-chars:first-letter{letter-spacing:.34em}.ant-btn-two-chinese-chars>*{letter-spacing:.34em;margin-right:-.34em}.ant-btn-block{width:100%}.christmas.ant-btn-primary:before{content:"";display:block;position:absolute;top:-6px;left:0;right:0;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE0AAAAXCAYAAABOHMIhAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABiZJREFUeNrsWMtPlFcUvzPMwIDysLyRR4uATDHWCiVgSmRlios2DeiiXUFs0nRBd6arxqQhJDapkYXhP4BqDKTQhZaFNQSCaBEVJjwdHsNr5DUMDDPDzPT3u7nTDEgRKrKgc5KT+z3uufec33de99P4fD4RpL2RNgjB3kn35MkTeRERESFiYmLkGBoaKnQ6nWSNRvPPZFxr+vv7k6KioiIdDsfa8vLyQkFBgcP3Bnel3MDAQArWI0eFhISE87nb7bZ7PJ4VvLYuLi5O5+fnu9+kMNfq6+tLjIyMzMY6KeBEbK/XarXReI3lPDZMWcc4v7GxYV1dXR3Jy8ub2E5HPvJ6vRSSDH0ku1wuAfsEZOV1IEFHoeNFdHS0yMrK2knR0Lm5uR+hxLdQMjbwHTZbB41h8RGwCdc9MzMzneHh4bGJiYlf4SN8ijkfwqiIncCAAR7Iz2GPSShudjqdfeCeqampvwBQfFxc3JdYqwTv8gB8/F48A8BgKecE14V+L7ju2tpae05OzkuCCZvkPOj8mizmC6vVKtmPu+bx48cC3qI1mUyFUOyywWD4SHlELBaLJmCHNcwAghuAOujtuF4FqHO4nsX4EsAS3I4TJ04ME1h8PDE9PS09TYZoY2Pj1729vd6lpSVfkDYTPG0UkfNDRUWFgQ5Gb2Mh0N29e9eG/GQfHh4W8/PzwUy/ObQ/gMfVVlZW1iAiZdQxp3nv3LljRoL/5erVq1UIxzSiiVD9X4EDYATynCwAzGO858hCQRoaGmJFZNJz8YIcBc4BF966dau6sLAwBxVSJCUlCSThQwuU3W6XkYUok1Vzm5znQx5bbm9v77p+/frPeNSNRzZ/ISBwrG4ZR48eLamtrf2+uLjYSEG9Xi/wTISFhQlWGXohyzO/CJlVl23KQRLbABoaHx+/Z1lUZ/Hq1SsJFj3JT3hmHx8fnydPTEzMj46OziHPW2w22wxeD4Kfgadh/4YEzU8Az4DhffAn5eXlX1y6dKkEoCTspAQ9Mjs7+0BBo8Fms1lkZGTsOo0QLLRNkvnR+fEJzIMHD0xtbW39CL8JTFtSbAOvBIyLHIGVm9VzE2gKuDAMSSpcT6KXyT137lx2cnLyMXhcGDb3wq3XuWF3d/fCzZs3P0c4v5eSknJQbYLo7Ox0gC2lpaVZ3Be67Th/dnZWoAJKsJC3XA8fPhxoamp6hMb+BaaMgWcUMGtszZjiFDNmvcDI91pzG0iY4ARwkwrxkcHBwUdgNrRMbnrqoRbkVzDcvn3bl5qaWsmcgFH4G8XdEGUWFhak51AuISFBnkoCTyFbyWKxCJwIxlC0fq2rq7tcVFRkRKskjh8/Lr0+kBjCCDV/knfdv3//WX19/R8IRRNemxlu4AXwKqM+EJwdj1HbPYSwh3sCPAJDABm2LLchCjS+5/kirKGhwWk0GrMuXrxYQuX9hm/XXTMXMY+srKwI5ApZrbYmZh7deEJhAUKjLe/pLTzSsCuHrK+1tbUJVe3P6upq87Vr174rKysrYHVj/uW+OH3IfEuw4F3ee/fuPQfAvwOs5yyE4CnlFOu7BWrTCWlreO6FACpBZGwUw4BvkANLobReHb3kGZYGsGzTq/zlO8AT1ru6uoZbWlqeA6gINJAfnz59OlVLoX8Jtebm5raampqfcMvQYgTknz9//sKVK1c+y83NTdIEuCnaKMuNGzd+6+np6cCtSTkAw9D9X8Dyh+dbgaaAC1XAnUlPTy+qqqq6cPbs2UzkmWjNljiDJzpwHFnCkW2yo6NjCKW8H54wjlezKvRT09LSTsJrz5w6dSoN+Yp51ADAPUj8VoDbDq9pxrwuJcNIYQllJTIi/xopBw/VA7DJp0+f9hA78CgL5F5C8J2CpoCj8sfA6WCe/FPRhsRlZmbGIs8Y4FFO5CJgtrSsvrRVGW1V93b1myoGnKAKEcHgnwsWpg1lNI0fphwrmdqbckeU18WrnlOjqp5/j7W3BWvfQVPKa5SBkcrYCNVB65TRTlWZ1lXiXVU5xbtlDb2SPaLWYwrgHIcqPg6Vc7fbX69Yoyqfa7/AeiegbWOEVhmsVcWDwPn224iDJgla8Hd38Hd3ELQgaIeI/hZgAIPEp0vmQJdoAAAAAElFTkSuQmCC) no-repeat 50% 0;background-size:64px;opacity:1}.christmas.ant-btn-primary.ant-btn-lg:before{background-size:72px}.christmas.ant-btn-primary.ant-btn-sm:before{background-size:56px}a.ant-btn{line-height:30px}a.ant-btn-lg{line-height:38px}a.ant-btn-sm{line-height:22px}.ant-avatar{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;display:inline-block;text-align:center;background:#ccc;color:#fff;white-space:nowrap;position:relative;overflow:hidden;vertical-align:middle;width:32px;height:32px;line-height:32px;border-radius:50%}.ant-avatar-image{background:transparent}.ant-avatar>*{line-height:32px}.ant-avatar.ant-avatar-icon{font-size:18px}.ant-avatar-lg{width:40px;height:40px;border-radius:50%}.ant-avatar-lg,.ant-avatar-lg>*{line-height:40px}.ant-avatar-lg.ant-avatar-icon{font-size:24px}.ant-avatar-sm{width:24px;height:24px;border-radius:50%}.ant-avatar-sm,.ant-avatar-sm>*{line-height:24px}.ant-avatar-sm.ant-avatar-icon{font-size:14px}.ant-avatar-square{border-radius:4px}.ant-avatar>img{width:100%;height:100%;display:block}.ant-back-top{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;z-index:10;position:fixed;right:100px;bottom:50px;height:40px;width:40px;cursor:pointer}.ant-back-top-content{height:40px;width:40px;border-radius:20px;background-color:rgba(0,0,0,.45);color:#fff;text-align:center;overflow:hidden}.ant-back-top-content,.ant-back-top-content:hover{-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1)}.ant-back-top-content:hover{background-color:rgba(0,0,0,.65)}.ant-back-top-icon{margin:12px auto;width:14px;height:16px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAoCAYAAACWwljjAAAABGdBTUEAALGPC/xhBQAAAbtJREFUWAntmMtKw0AUhhMvS5cuxILgQlRUpIggIoKIIoigG1eC+AA+jo+i6FIXBfeuXIgoeKVeitVWJX5HWhhDksnUpp3FDPyZk3Nm5nycmZKkXhAEOXSA3lG7muTeRzmfy6HneUvIhnYkQK+Q9NhAA0Opg0vBEhjBKHiyb8iGMyQMOYuK41BcBSypAL+MYXSKjtFAW7EAGEO3qN4uMQbbAkXiSfRQJ1H6a+yhlkKRcAoVFYiweYNjtCVQJJpBz2GCiPt7fBOZQpFgDpUikse5HgnkM4Fi4QX0Fpc5wf9EbLqpUCy4jMoJSXWhFwbMNgWKhVbRhy5jirhs9fy/oFhgHVVTJEs7RLZ8sSEoJm6iz7SZDMbJ+/OKERQTttCXQRLToRUmrKWCYuA2+jbN0MB4OQobYShfdTCgn/sL1K36M7TLrN3n+758aPy2rrpR6+/od5E8tf/A1uLS9aId5T7J3CNYihkQ4D9PiMdMC7mp4rjB9kjFjZp8BlnVHJBuO1yFXIV0FdDF3RlyFdJVQBdv5AxVdIsq8apiZ2PyYO1EVykesGfZEESsCkweyR8MUW+V8uJ1gkYipmpdP1pm2aJVPEGzAAAAAElFTkSuQmCC) 100%/100% no-repeat}@media screen and (max-width:768px){.ant-back-top{right:60px}}@media screen and (max-width:480px){.ant-back-top{right:20px}}.ant-badge{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;position:relative;display:inline-block;line-height:1;color:unset}.ant-badge-count{top:-10px;height:20px;border-radius:10px;min-width:20px;background:#f5222d;color:#fff;line-height:20px;text-align:center;padding:0 6px;font-size:12px;font-weight:400;white-space:nowrap;-webkit-box-shadow:0 0 0 1px #fff;box-shadow:0 0 0 1px #fff}.ant-badge-count a,.ant-badge-count a:hover{color:#fff}.ant-badge-multiple-words{padding:0 8px}.ant-badge-dot{top:-3px;height:6px;width:6px;border-radius:100%;background:#f5222d;z-index:10;-webkit-box-shadow:0 0 0 1px #fff;box-shadow:0 0 0 1px #fff}.ant-badge-count,.ant-badge-dot{position:absolute;right:0;-webkit-transform:translateX(50%);-ms-transform:translateX(50%);transform:translateX(50%);-webkit-transform-origin:100%;-ms-transform-origin:100%;transform-origin:100%}.ant-badge-status{line-height:inherit;vertical-align:baseline}.ant-badge-status-dot{width:6px;height:6px;display:inline-block;border-radius:50%;vertical-align:middle;position:relative;top:-1px}.ant-badge-status-success{background-color:#52c41a}.ant-badge-status-processing{background-color:#1890ff;position:relative}.ant-badge-status-processing:after{position:absolute;top:0;left:0;width:100%;height:100%;border-radius:50%;border:1px solid #1890ff;content:"";-webkit-animation:antStatusProcessing 1.2s infinite ease-in-out;animation:antStatusProcessing 1.2s infinite ease-in-out}.ant-badge-status-default{background-color:#d9d9d9}.ant-badge-status-error{background-color:#f5222d}.ant-badge-status-warning{background-color:#faad14}.ant-badge-status-text{color:rgba(0,0,0,.65);font-size:14px;margin-left:8px}.ant-badge-zoom-appear,.ant-badge-zoom-enter{-webkit-animation:antZoomBadgeIn .3s cubic-bezier(.12,.4,.29,1.46);animation:antZoomBadgeIn .3s cubic-bezier(.12,.4,.29,1.46);-webkit-animation-fill-mode:both;animation-fill-mode:both}.ant-badge-zoom-leave{-webkit-animation:antZoomBadgeOut .3s cubic-bezier(.71,-.46,.88,.6);animation:antZoomBadgeOut .3s cubic-bezier(.71,-.46,.88,.6);-webkit-animation-fill-mode:both;animation-fill-mode:both}.ant-badge-not-a-wrapper .ant-scroll-number{top:auto;display:block;position:relative}.ant-badge-not-a-wrapper .ant-badge-count{-webkit-transform:none;-ms-transform:none;transform:none}@-webkit-keyframes antStatusProcessing{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:.5}to{-webkit-transform:scale(2.4);transform:scale(2.4);opacity:0}}@keyframes antStatusProcessing{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:.5}to{-webkit-transform:scale(2.4);transform:scale(2.4);opacity:0}}.ant-scroll-number{overflow:hidden}.ant-scroll-number-only{display:inline-block;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);height:20px}.ant-scroll-number-only>p{height:20px;margin:0}@-webkit-keyframes antZoomBadgeIn{0%{opacity:0;-webkit-transform:scale(0) translateX(50%);transform:scale(0) translateX(50%)}to{-webkit-transform:scale(1) translateX(50%);transform:scale(1) translateX(50%)}}@keyframes antZoomBadgeIn{0%{opacity:0;-webkit-transform:scale(0) translateX(50%);transform:scale(0) translateX(50%)}to{-webkit-transform:scale(1) translateX(50%);transform:scale(1) translateX(50%)}}@-webkit-keyframes antZoomBadgeOut{0%{-webkit-transform:scale(1) translateX(50%);transform:scale(1) translateX(50%)}to{opacity:0;-webkit-transform:scale(0) translateX(50%);transform:scale(0) translateX(50%)}}@keyframes antZoomBadgeOut{0%{-webkit-transform:scale(1) translateX(50%);transform:scale(1) translateX(50%)}to{opacity:0;-webkit-transform:scale(0) translateX(50%);transform:scale(0) translateX(50%)}}.ant-breadcrumb{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;color:rgba(0,0,0,.45);font-size:14px}.ant-breadcrumb .anticon{font-size:14px}.ant-breadcrumb a{color:rgba(0,0,0,.45);-webkit-transition:color .3s;transition:color .3s}.ant-breadcrumb a:hover{color:#40a9ff}.ant-breadcrumb>span:last-child{color:rgba(0,0,0,.65)}.ant-breadcrumb>span:last-child .ant-breadcrumb-separator{display:none}.ant-breadcrumb-separator{margin:0 8px;color:rgba(0,0,0,.45)}.ant-breadcrumb-link>.anticon+span{margin-left:4px}.ant-fullcalendar{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;outline:none;border-top:1px solid #d9d9d9}.ant-fullcalendar-month-select{margin-left:5px}.ant-fullcalendar-header{padding:11px 16px 11px 0;text-align:right}.ant-fullcalendar-header .ant-select-dropdown{text-align:left}.ant-fullcalendar-header .ant-radio-group{margin-left:8px;text-align:left}.ant-fullcalendar-header label.ant-radio-button{height:22px;line-height:20px;padding:0 10px}.ant-fullcalendar-date-panel{position:relative;outline:none}.ant-fullcalendar-calendar-body{padding:8px 12px}.ant-fullcalendar table{border-collapse:collapse;max-width:100%;background-color:transparent;width:100%;height:256px}.ant-fullcalendar table,.ant-fullcalendar td,.ant-fullcalendar th{border:0}.ant-fullcalendar td{position:relative}.ant-fullcalendar-calendar-table{border-spacing:0;margin-bottom:0}.ant-fullcalendar-column-header{line-height:18px;padding:0;width:33px;text-align:center}.ant-fullcalendar-column-header .ant-fullcalendar-column-header-inner{display:block;font-weight:400}.ant-fullcalendar-week-number-header .ant-fullcalendar-column-header-inner{display:none}.ant-fullcalendar-date,.ant-fullcalendar-month{text-align:center;-webkit-transition:all .3s;transition:all .3s}.ant-fullcalendar-value{display:block;margin:0 auto;color:rgba(0,0,0,.65);border-radius:2px;width:24px;height:24px;padding:0;background:transparent;line-height:24px;-webkit-transition:all .3s;transition:all .3s}.ant-fullcalendar-value:hover{background:#e6f7ff;cursor:pointer}.ant-fullcalendar-value:active{background:#1890ff;color:#fff}.ant-fullcalendar-month-panel-cell .ant-fullcalendar-value{width:48px}.ant-fullcalendar-month-panel-current-cell .ant-fullcalendar-value,.ant-fullcalendar-today .ant-fullcalendar-value{-webkit-box-shadow:0 0 0 1px #1890ff inset;box-shadow:inset 0 0 0 1px #1890ff}.ant-fullcalendar-month-panel-selected-cell .ant-fullcalendar-value,.ant-fullcalendar-selected-day .ant-fullcalendar-value{background:#1890ff;color:#fff}.ant-fullcalendar-disabled-cell-first-of-row .ant-fullcalendar-value{border-top-left-radius:4px;border-bottom-left-radius:4px}.ant-fullcalendar-disabled-cell-last-of-row .ant-fullcalendar-value{border-top-right-radius:4px;border-bottom-right-radius:4px}.ant-fullcalendar-last-month-cell .ant-fullcalendar-value,.ant-fullcalendar-next-month-btn-day .ant-fullcalendar-value{color:rgba(0,0,0,.25)}.ant-fullcalendar-month-panel-table{table-layout:fixed;width:100%;border-collapse:separate}.ant-fullcalendar-content{position:absolute;width:100%;left:0;bottom:-9px}.ant-fullcalendar-fullscreen{border-top:0}.ant-fullcalendar-fullscreen .ant-fullcalendar-table{table-layout:fixed}.ant-fullcalendar-fullscreen .ant-fullcalendar-header .ant-radio-group{margin-left:16px}.ant-fullcalendar-fullscreen .ant-fullcalendar-header label.ant-radio-button{height:32px;line-height:30px}.ant-fullcalendar-fullscreen .ant-fullcalendar-date,.ant-fullcalendar-fullscreen .ant-fullcalendar-month{text-align:left;margin:0 4px;display:block;color:rgba(0,0,0,.65);height:116px;padding:4px 8px;border-top:2px solid #e8e8e8;-webkit-transition:background .3s;transition:background .3s}.ant-fullcalendar-fullscreen .ant-fullcalendar-date:hover,.ant-fullcalendar-fullscreen .ant-fullcalendar-month:hover{background:#e6f7ff;cursor:pointer}.ant-fullcalendar-fullscreen .ant-fullcalendar-date:active,.ant-fullcalendar-fullscreen .ant-fullcalendar-month:active{background:#bae7ff}.ant-fullcalendar-fullscreen .ant-fullcalendar-column-header{text-align:right;padding-right:12px;padding-bottom:5px}.ant-fullcalendar-fullscreen .ant-fullcalendar-value{text-align:right;background:transparent;width:auto}.ant-fullcalendar-fullscreen .ant-fullcalendar-today .ant-fullcalendar-value{color:rgba(0,0,0,.65)}.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-current-cell .ant-fullcalendar-month,.ant-fullcalendar-fullscreen .ant-fullcalendar-today .ant-fullcalendar-date{border-top-color:#1890ff;background:transparent}.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-current-cell .ant-fullcalendar-value,.ant-fullcalendar-fullscreen .ant-fullcalendar-today .ant-fullcalendar-value{-webkit-box-shadow:none;box-shadow:none}.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-selected-cell .ant-fullcalendar-month,.ant-fullcalendar-fullscreen .ant-fullcalendar-selected-day .ant-fullcalendar-date{background:#e6f7ff}.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-selected-cell .ant-fullcalendar-value,.ant-fullcalendar-fullscreen .ant-fullcalendar-selected-day .ant-fullcalendar-value{color:#1890ff}.ant-fullcalendar-fullscreen .ant-fullcalendar-last-month-cell .ant-fullcalendar-date,.ant-fullcalendar-fullscreen .ant-fullcalendar-next-month-btn-day .ant-fullcalendar-date{color:rgba(0,0,0,.25)}.ant-fullcalendar-fullscreen .ant-fullcalendar-content{height:88px;overflow-y:auto;position:static;width:auto;left:auto;bottom:auto}.ant-fullcalendar-disabled-cell .ant-fullcalendar-date,.ant-fullcalendar-disabled-cell .ant-fullcalendar-date:hover{cursor:not-allowed}.ant-fullcalendar-disabled-cell:not(.ant-fullcalendar-today) .ant-fullcalendar-date,.ant-fullcalendar-disabled-cell:not(.ant-fullcalendar-today) .ant-fullcalendar-date:hover{background:transparent}.ant-fullcalendar-disabled-cell .ant-fullcalendar-value{color:rgba(0,0,0,.25);border-radius:0;width:auto;cursor:not-allowed}.ant-radio-group{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;display:inline-block;line-height:unset}.ant-radio-wrapper{margin:0;margin-right:8px}.ant-radio,.ant-radio-wrapper{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;padding:0;list-style:none;display:inline-block;position:relative;white-space:nowrap;cursor:pointer}.ant-radio{margin:0;outline:none;line-height:1;vertical-align:sub}.ant-radio-focused .ant-radio-inner,.ant-radio-wrapper:hover .ant-radio .ant-radio-inner,.ant-radio:hover .ant-radio-inner{border-color:#1890ff}.ant-radio-checked:after{position:absolute;top:0;left:0;width:100%;height:100%;border-radius:50%;border:1px solid #1890ff;content:"";-webkit-animation:antRadioEffect .36s ease-in-out;animation:antRadioEffect .36s ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:hidden}.ant-radio-wrapper:hover .ant-radio:after,.ant-radio:hover:after{visibility:visible}.ant-radio-inner{position:relative;top:0;left:0;display:block;width:16px;height:16px;border-radius:100px;border:1px solid #d9d9d9;background-color:#fff;-webkit-transition:all .3s;transition:all .3s}.ant-radio-inner:after{position:absolute;width:8px;height:8px;left:3px;top:3px;border-radius:8px;display:table;border-top:0;border-left:0;content:" ";background-color:#1890ff;opacity:0;-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-transition:all .3s cubic-bezier(.78,.14,.15,.86);transition:all .3s cubic-bezier(.78,.14,.15,.86)}.ant-radio-input{position:absolute;left:0;z-index:1;cursor:pointer;opacity:0;top:0;bottom:0;right:0}.ant-radio-checked .ant-radio-inner{border-color:#1890ff}.ant-radio-checked .ant-radio-inner:after{-webkit-transform:scale(.875);-ms-transform:scale(.875);transform:scale(.875);opacity:1;-webkit-transition:all .3s cubic-bezier(.78,.14,.15,.86);transition:all .3s cubic-bezier(.78,.14,.15,.86)}.ant-radio-disabled .ant-radio-inner{border-color:#d9d9d9!important;background-color:#f5f5f5}.ant-radio-disabled .ant-radio-inner:after{background-color:#ccc}.ant-radio-disabled .ant-radio-input{cursor:not-allowed}.ant-radio-disabled+span{color:rgba(0,0,0,.25);cursor:not-allowed}span.ant-radio+*{padding-left:8px;padding-right:8px}.ant-radio-button-wrapper{margin:0;height:32px;line-height:30px;color:rgba(0,0,0,.65);display:inline-block;-webkit-transition:all .3s ease;transition:all .3s ease;cursor:pointer;border:1px solid #d9d9d9;border-left:0;border-top-width:1.02px;background:#fff;padding:0 15px;position:relative}.ant-radio-button-wrapper a{color:rgba(0,0,0,.65)}.ant-radio-button-wrapper>.ant-radio-button{margin-left:0;display:block;width:0;height:0}.ant-radio-group-large .ant-radio-button-wrapper{height:40px;line-height:38px;font-size:16px}.ant-radio-group-small .ant-radio-button-wrapper{height:24px;line-height:22px;padding:0 7px}.ant-radio-button-wrapper:not(:first-child):before{content:"";display:block;top:0;left:-1px;width:1px;height:100%;position:absolute;background-color:#d9d9d9}.ant-radio-button-wrapper:first-child{border-radius:4px 0 0 4px;border-left:1px solid #d9d9d9}.ant-radio-button-wrapper:last-child{border-radius:0 4px 4px 0}.ant-radio-button-wrapper:first-child:last-child{border-radius:4px}.ant-radio-button-wrapper-focused,.ant-radio-button-wrapper:hover{color:#1890ff;position:relative}.ant-radio-button-wrapper .ant-radio-inner,.ant-radio-button-wrapper input[type=checkbox],.ant-radio-button-wrapper input[type=radio]{opacity:0;width:0;height:0}.ant-radio-button-wrapper-checked{background:#fff;border-color:#1890ff;color:#1890ff;-webkit-box-shadow:-1px 0 0 0 #1890ff;box-shadow:-1px 0 0 0 #1890ff;z-index:1}.ant-radio-button-wrapper-checked:before{background-color:#1890ff!important;opacity:.1}.ant-radio-button-wrapper-checked:first-child{border-color:#1890ff;-webkit-box-shadow:none!important;box-shadow:none!important}.ant-radio-button-wrapper-checked:hover{border-color:#40a9ff;-webkit-box-shadow:-1px 0 0 0 #40a9ff;box-shadow:-1px 0 0 0 #40a9ff;color:#40a9ff}.ant-radio-button-wrapper-checked:active{border-color:#096dd9;-webkit-box-shadow:-1px 0 0 0 #096dd9;box-shadow:-1px 0 0 0 #096dd9;color:#096dd9}.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled){background:#1890ff;border-color:#1890ff;color:#fff}.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover{border-color:#40a9ff;background:#40a9ff;color:#fff}.ant-radio-group-solid .ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active{border-color:#096dd9;background:#096dd9;color:#fff}.ant-radio-button-wrapper-disabled{cursor:not-allowed}.ant-radio-button-wrapper-disabled,.ant-radio-button-wrapper-disabled:first-child,.ant-radio-button-wrapper-disabled:hover{border-color:#d9d9d9;background-color:#f5f5f5;color:rgba(0,0,0,.25)}.ant-radio-button-wrapper-disabled:first-child{border-left-color:#d9d9d9}.ant-radio-button-wrapper-disabled.ant-radio-button-wrapper-checked{color:#fff;background-color:#e6e6e6;border-color:#d9d9d9;-webkit-box-shadow:none;box-shadow:none}@-webkit-keyframes antRadioEffect{0%{-webkit-transform:scale(1);transform:scale(1);opacity:.5}to{-webkit-transform:scale(1.6);transform:scale(1.6);opacity:0}}@keyframes antRadioEffect{0%{-webkit-transform:scale(1);transform:scale(1);opacity:.5}to{-webkit-transform:scale(1.6);transform:scale(1.6);opacity:0}}@supports (-moz-appearance:meterbar) and (background-blend-mode:difference,normal){.ant-radio{vertical-align:text-bottom}}.ant-card{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;background:#fff;border-radius:2px;position:relative;-webkit-transition:all .3s;transition:all .3s}.ant-card-hoverable{cursor:pointer}.ant-card-hoverable:hover{-webkit-box-shadow:0 2px 8px rgba(0,0,0,.09);box-shadow:0 2px 8px rgba(0,0,0,.09);border-color:rgba(0,0,0,.09)}.ant-card-bordered{border:1px solid #e8e8e8}.ant-card-head{background:transparent;border-bottom:1px solid #e8e8e8;padding:0 24px;border-radius:2px 2px 0 0;zoom:1;margin-bottom:-1px;min-height:48px;font-size:16px;color:rgba(0,0,0,.85);font-weight:500}.ant-card-head:after,.ant-card-head:before{content:"";display:table}.ant-card-head:after{clear:both}.ant-card-head-title,.ant-card-head-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ant-card-head-title{padding:16px 0;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.ant-card-head .ant-tabs{margin-bottom:-17px;clear:both;font-size:14px;color:rgba(0,0,0,.65);font-weight:400}.ant-card-head .ant-tabs-bar{border-bottom:1px solid #e8e8e8}.ant-card-extra{float:right;padding:17.5px 0;font-size:14px;color:rgba(0,0,0,.65);font-weight:400;text-align:right;margin-left:auto}.ant-card-body{padding:24px;zoom:1}.ant-card-body:after,.ant-card-body:before{content:"";display:table}.ant-card-body:after{clear:both}.ant-card-contain-grid:not(.ant-card-loading) .ant-card-body{margin:-1px 0 0 -1px;padding:0}.ant-card-grid{border-radius:0;border:0;-webkit-box-shadow:1px 0 0 0 #e8e8e8,0 1px 0 0 #e8e8e8,1px 1px 0 0 #e8e8e8,1px 0 0 0 #e8e8e8 inset,0 1px 0 0 #e8e8e8 inset;box-shadow:1px 0 0 0 #e8e8e8,0 1px 0 0 #e8e8e8,1px 1px 0 0 #e8e8e8,inset 1px 0 0 0 #e8e8e8,inset 0 1px 0 0 #e8e8e8;width:33.33%;float:left;padding:24px;-webkit-transition:all .3s;transition:all .3s}.ant-card-grid:hover{position:relative;z-index:1;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.15);box-shadow:0 2px 8px rgba(0,0,0,.15)}.ant-card-contain-tabs>.ant-card-head .ant-card-head-title{padding-bottom:0;min-height:32px}.ant-card-contain-tabs .ant-card-extra{padding-bottom:0}.ant-card-cover>*{width:100%;display:block}.ant-card-cover img{border-radius:2px 2px 0 0}.ant-card-actions{border-top:1px solid #e8e8e8;background:#fafafa;zoom:1;list-style:none;margin:0;padding:0}.ant-card-actions:after,.ant-card-actions:before{content:"";display:table}.ant-card-actions:after{clear:both}.ant-card-actions>li{float:left;text-align:center;margin:12px 0;color:rgba(0,0,0,.45)}.ant-card-actions>li>span{display:inline-block;font-size:14px;cursor:pointer;line-height:22px;min-width:32px;position:relative}.ant-card-actions>li>span:hover{color:#1890ff;-webkit-transition:color .3s;transition:color .3s}.ant-card-actions>li>span>.anticon{font-size:16px;line-height:22px}.ant-card-actions>li>span a{color:rgba(0,0,0,.45);line-height:22px;display:inline-block;width:100%}.ant-card-actions>li>span a:hover{color:#1890ff}.ant-card-actions>li:not(:last-child){border-right:1px solid #e8e8e8}.ant-card-wider-padding .ant-card-head{padding:0 32px}.ant-card-wider-padding .ant-card-body{padding:24px 32px}.ant-card-padding-transition .ant-card-body,.ant-card-padding-transition .ant-card-head{-webkit-transition:padding .3s;transition:padding .3s}.ant-card-type-inner .ant-card-head{padding:0 24px;background:#fafafa}.ant-card-type-inner .ant-card-head-title{padding:12px 0;font-size:14px}.ant-card-type-inner .ant-card-body{padding:16px 24px}.ant-card-type-inner .ant-card-extra{padding:13.5px 0}.ant-card-meta{margin:-4px 0;zoom:1}.ant-card-meta:after,.ant-card-meta:before{content:"";display:table}.ant-card-meta:after{clear:both}.ant-card-meta-avatar{padding-right:16px;float:left}.ant-card-meta-detail{overflow:hidden}.ant-card-meta-detail>div:not(:last-child){margin-bottom:8px}.ant-card-meta-title{font-size:16px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;color:rgba(0,0,0,.85);font-weight:500}.ant-card-meta-description{color:rgba(0,0,0,.45)}.ant-card-loading .ant-card-body{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-card-loading-content p{margin:0}.ant-card-loading-block{height:14px;margin:4px 0;border-radius:2px;background:-webkit-gradient(linear,left top,right top,from(rgba(207,216,220,.2)),color-stop(rgba(207,216,220,.4)),to(rgba(207,216,220,.2)));background:-webkit-linear-gradient(left,rgba(207,216,220,.2),rgba(207,216,220,.4),rgba(207,216,220,.2));background:linear-gradient(90deg,rgba(207,216,220,.2),rgba(207,216,220,.4),rgba(207,216,220,.2));-webkit-animation:card-loading 1.4s ease infinite;animation:card-loading 1.4s ease infinite;background-size:600% 600%}@-webkit-keyframes card-loading{0%,to{background-position:0 50%}50%{background-position:100% 50%}}@keyframes card-loading{0%,to{background-position:0 50%}50%{background-position:100% 50%}}.ant-tabs.ant-tabs-card>.ant-tabs-bar .ant-tabs-nav-container{height:40px}.ant-tabs.ant-tabs-card>.ant-tabs-bar .ant-tabs-ink-bar{visibility:hidden}.ant-tabs.ant-tabs-card>.ant-tabs-bar .ant-tabs-tab{margin:0;border:1px solid #e8e8e8;border-bottom:0;border-radius:4px 4px 0 0;background:#fafafa;margin-right:2px;padding:0 16px;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);line-height:38px}.ant-tabs.ant-tabs-card>.ant-tabs-bar .ant-tabs-tab-active{background:#fff;border-color:#e8e8e8;color:#1890ff;padding-bottom:1px}.ant-tabs.ant-tabs-card>.ant-tabs-bar .ant-tabs-tab-inactive{padding:0}.ant-tabs.ant-tabs-card>.ant-tabs-bar .ant-tabs-nav-wrap{margin-bottom:0}.ant-tabs.ant-tabs-card>.ant-tabs-bar .ant-tabs-tab .ant-tabs-close-x{color:rgba(0,0,0,.45);-webkit-transition:all .3s;transition:all .3s;font-size:12px;margin-left:3px;margin-right:-5px;overflow:hidden;vertical-align:middle;width:16px;height:16px;height:14px}.ant-tabs.ant-tabs-card>.ant-tabs-bar .ant-tabs-tab .ant-tabs-close-x:hover{color:rgba(0,0,0,.85)}.ant-tabs.ant-tabs-card .ant-tabs-content>.ant-tabs-tabpane,.ant-tabs.ant-tabs-editable-card .ant-tabs-content>.ant-tabs-tabpane{-webkit-transition:none!important;transition:none!important}.ant-tabs.ant-tabs-card .ant-tabs-content>.ant-tabs-tabpane-inactive,.ant-tabs.ant-tabs-editable-card .ant-tabs-content>.ant-tabs-tabpane-inactive{overflow:hidden}.ant-tabs.ant-tabs-card>.ant-tabs-bar .ant-tabs-tab:hover .anticon-close{opacity:1}.ant-tabs-extra-content{line-height:40px}.ant-tabs-extra-content .ant-tabs-new-tab{position:relative;width:20px;height:20px;line-height:20px;text-align:center;cursor:pointer;border-radius:2px;border:1px solid #e8e8e8;font-size:12px;color:rgba(0,0,0,.65);-webkit-transition:all .3s;transition:all .3s}.ant-tabs-extra-content .ant-tabs-new-tab:hover{color:#1890ff;border-color:#1890ff}.ant-tabs-extra-content .ant-tabs-new-tab svg{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}.ant-tabs-vertical.ant-tabs-card>.ant-tabs-bar .ant-tabs-nav-container{height:auto}.ant-tabs-vertical.ant-tabs-card>.ant-tabs-bar .ant-tabs-tab{border-bottom:1px solid #e8e8e8;margin-bottom:8px}.ant-tabs-vertical.ant-tabs-card>.ant-tabs-bar .ant-tabs-tab-active{padding-bottom:4px}.ant-tabs-vertical.ant-tabs-card>.ant-tabs-bar .ant-tabs-tab:last-child{margin-bottom:8px}.ant-tabs-vertical.ant-tabs-card>.ant-tabs-bar .ant-tabs-new-tab{width:90%}.ant-tabs-vertical.ant-tabs-card.ant-tabs-left>.ant-tabs-bar .ant-tabs-nav-wrap{margin-right:0}.ant-tabs-vertical.ant-tabs-card.ant-tabs-left>.ant-tabs-bar .ant-tabs-tab{border-right:0;border-radius:4px 0 0 4px;margin-right:1px}.ant-tabs-vertical.ant-tabs-card.ant-tabs-left>.ant-tabs-bar .ant-tabs-tab-active{margin-right:-1px;padding-right:18px}.ant-tabs-vertical.ant-tabs-card.ant-tabs-right>.ant-tabs-bar .ant-tabs-nav-wrap{margin-left:0}.ant-tabs-vertical.ant-tabs-card.ant-tabs-right>.ant-tabs-bar .ant-tabs-tab{border-left:0;border-radius:0 4px 4px 0;margin-left:1px}.ant-tabs-vertical.ant-tabs-card.ant-tabs-right>.ant-tabs-bar .ant-tabs-tab-active{margin-left:-1px;padding-left:18px}.ant-tabs.ant-tabs-card.ant-tabs-bottom>.ant-tabs-bar .ant-tabs-tab{border-bottom:1px solid #e8e8e8;border-top:0;border-radius:0 0 4px 4px}.ant-tabs.ant-tabs-card.ant-tabs-bottom>.ant-tabs-bar .ant-tabs-tab-active{color:#1890ff;padding-bottom:0;padding-top:1px}.ant-tabs{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;position:relative;overflow:hidden;zoom:1}.ant-tabs:after,.ant-tabs:before{content:"";display:table}.ant-tabs:after{clear:both}.ant-tabs-ink-bar{z-index:1;position:absolute;left:0;bottom:1px;-webkit-box-sizing:border-box;box-sizing:border-box;height:2px;background-color:#1890ff;-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}.ant-tabs-bar{border-bottom:1px solid #e8e8e8;margin:0 0 16px;outline:none}.ant-tabs-bar,.ant-tabs-nav-container{-webkit-transition:padding .3s cubic-bezier(.645,.045,.355,1);transition:padding .3s cubic-bezier(.645,.045,.355,1)}.ant-tabs-nav-container{overflow:hidden;font-size:14px;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;white-space:nowrap;margin-bottom:-1px;zoom:1}.ant-tabs-nav-container:after,.ant-tabs-nav-container:before{content:"";display:table}.ant-tabs-nav-container:after{clear:both}.ant-tabs-nav-container-scrolling{padding-left:32px;padding-right:32px}.ant-tabs-bottom .ant-tabs-bar{border-bottom:none;border-top:1px solid #e8e8e8}.ant-tabs-bottom .ant-tabs-ink-bar{bottom:auto;top:1px}.ant-tabs-bottom .ant-tabs-nav-container{margin-bottom:0;margin-top:-1px}.ant-tabs-tab-next,.ant-tabs-tab-prev{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2;width:0;height:100%;cursor:pointer;border:0;background-color:transparent;position:absolute;text-align:center;color:rgba(0,0,0,.45);-webkit-transition:width .3s cubic-bezier(.645,.045,.355,1),opacity .3s cubic-bezier(.645,.045,.355,1),color .3s cubic-bezier(.645,.045,.355,1);transition:width .3s cubic-bezier(.645,.045,.355,1),opacity .3s cubic-bezier(.645,.045,.355,1),color .3s cubic-bezier(.645,.045,.355,1);opacity:0;pointer-events:none}.ant-tabs-tab-next.ant-tabs-tab-arrow-show,.ant-tabs-tab-prev.ant-tabs-tab-arrow-show{opacity:1;width:32px;height:100%;pointer-events:auto}.ant-tabs-tab-next:hover,.ant-tabs-tab-prev:hover{color:rgba(0,0,0,.65)}.ant-tabs-tab-next-icon,.ant-tabs-tab-prev-icon{font-style:normal;font-weight:700;font-variant:normal;line-height:inherit;vertical-align:baseline;position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);text-align:center;text-transform:none}.ant-tabs-tab-next-icon-target,.ant-tabs-tab-prev-icon-target{display:block;display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);-ms-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg)}:root .ant-tabs-tab-next-icon-target,:root .ant-tabs-tab-prev-icon-target{font-size:12px}.ant-tabs-tab-btn-disabled{cursor:not-allowed}.ant-tabs-tab-btn-disabled,.ant-tabs-tab-btn-disabled:hover{color:rgba(0,0,0,.25)}.ant-tabs-tab-next{right:2px}.ant-tabs-tab-prev{left:0}:root .ant-tabs-tab-prev{-webkit-filter:none;filter:none}.ant-tabs-nav-wrap{overflow:hidden;margin-bottom:-1px}.ant-tabs-nav-scroll{overflow:hidden;white-space:nowrap}.ant-tabs-nav{-webkit-box-sizing:border-box;box-sizing:border-box;padding-left:0;-webkit-transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);position:relative;margin:0;list-style:none;display:inline-block}.ant-tabs-nav:after,.ant-tabs-nav:before{display:table;content:" "}.ant-tabs-nav:after{clear:both}.ant-tabs-nav .ant-tabs-tab-disabled{pointer-events:none;cursor:default;color:rgba(0,0,0,.25)}.ant-tabs-nav .ant-tabs-tab{display:inline-block;height:100%;margin:0 32px 0 0;padding:12px 16px;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;-webkit-transition:color .3s cubic-bezier(.645,.045,.355,1);transition:color .3s cubic-bezier(.645,.045,.355,1);cursor:pointer;text-decoration:none}.ant-tabs-nav .ant-tabs-tab:last-child{margin-right:0}.ant-tabs-nav .ant-tabs-tab:hover{color:#40a9ff}.ant-tabs-nav .ant-tabs-tab:active{color:#096dd9}.ant-tabs-nav .ant-tabs-tab .anticon{margin-right:8px}.ant-tabs-nav .ant-tabs-tab-active{color:#1890ff;font-weight:500}.ant-tabs-large>.ant-tabs-bar .ant-tabs-nav-container{font-size:16px}.ant-tabs-large>.ant-tabs-bar .ant-tabs-tab{padding:16px}.ant-tabs-small>.ant-tabs-bar .ant-tabs-nav-container{font-size:14px}.ant-tabs-small>.ant-tabs-bar .ant-tabs-tab{padding:8px 16px}.ant-tabs:not(.ant-tabs-vertical)>.ant-tabs-content{width:100%}.ant-tabs:not(.ant-tabs-vertical)>.ant-tabs-content>.ant-tabs-tabpane{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:100%;-webkit-transition:opacity .45s;transition:opacity .45s;opacity:1}.ant-tabs:not(.ant-tabs-vertical)>.ant-tabs-content>.ant-tabs-tabpane-inactive{opacity:0;height:0;padding:0!important;pointer-events:none}.ant-tabs:not(.ant-tabs-vertical)>.ant-tabs-content>.ant-tabs-tabpane-inactive input{visibility:hidden}.ant-tabs:not(.ant-tabs-vertical)>.ant-tabs-content-animated{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;will-change:margin-left;-webkit-transition:margin-left .3s cubic-bezier(.645,.045,.355,1);transition:margin-left .3s cubic-bezier(.645,.045,.355,1)}.ant-tabs-vertical>.ant-tabs-bar{border-bottom:0;height:100%}.ant-tabs-vertical>.ant-tabs-bar-tab-next,.ant-tabs-vertical>.ant-tabs-bar-tab-prev{width:32px;height:0;-webkit-transition:height .3s cubic-bezier(.645,.045,.355,1),opacity .3s cubic-bezier(.645,.045,.355,1),color .3s cubic-bezier(.645,.045,.355,1);transition:height .3s cubic-bezier(.645,.045,.355,1),opacity .3s cubic-bezier(.645,.045,.355,1),color .3s cubic-bezier(.645,.045,.355,1)}.ant-tabs-vertical>.ant-tabs-bar-tab-next.ant-tabs-tab-arrow-show,.ant-tabs-vertical>.ant-tabs-bar-tab-prev.ant-tabs-tab-arrow-show{width:100%;height:32px}.ant-tabs-vertical>.ant-tabs-bar .ant-tabs-tab{float:none;margin:0 0 16px;padding:8px 24px;display:block}.ant-tabs-vertical>.ant-tabs-bar .ant-tabs-tab:last-child{margin-bottom:0}.ant-tabs-vertical>.ant-tabs-bar .ant-tabs-extra-content{text-align:center}.ant-tabs-vertical>.ant-tabs-bar .ant-tabs-nav-scroll{width:auto}.ant-tabs-vertical>.ant-tabs-bar .ant-tabs-nav-container,.ant-tabs-vertical>.ant-tabs-bar .ant-tabs-nav-wrap{height:100%}.ant-tabs-vertical>.ant-tabs-bar .ant-tabs-nav-container{margin-bottom:0}.ant-tabs-vertical>.ant-tabs-bar .ant-tabs-nav-container.ant-tabs-nav-container-scrolling{padding:32px 0}.ant-tabs-vertical>.ant-tabs-bar .ant-tabs-nav-wrap{margin-bottom:0}.ant-tabs-vertical>.ant-tabs-bar .ant-tabs-nav{width:100%}.ant-tabs-vertical>.ant-tabs-bar .ant-tabs-ink-bar{width:2px;left:auto;height:auto;top:0}.ant-tabs-vertical>.ant-tabs-bar .ant-tabs-tab-next{width:100%;bottom:0;height:32px}.ant-tabs-vertical>.ant-tabs-bar .ant-tabs-tab-prev{top:0;width:100%;height:32px}.ant-tabs-vertical>.ant-tabs-content{overflow:hidden;width:auto;margin-top:0!important}.ant-tabs-vertical.ant-tabs-left>.ant-tabs-bar{float:left;border-right:1px solid #e8e8e8;margin-right:-1px;margin-bottom:0}.ant-tabs-vertical.ant-tabs-left>.ant-tabs-bar .ant-tabs-tab{text-align:right}.ant-tabs-vertical.ant-tabs-left>.ant-tabs-bar .ant-tabs-nav-container,.ant-tabs-vertical.ant-tabs-left>.ant-tabs-bar .ant-tabs-nav-wrap{margin-right:-1px}.ant-tabs-vertical.ant-tabs-left>.ant-tabs-bar .ant-tabs-ink-bar{right:1px}.ant-tabs-vertical.ant-tabs-left>.ant-tabs-content{padding-left:24px;border-left:1px solid #e8e8e8}.ant-tabs-vertical.ant-tabs-right>.ant-tabs-bar{float:right;border-left:1px solid #e8e8e8;margin-left:-1px;margin-bottom:0}.ant-tabs-vertical.ant-tabs-right>.ant-tabs-bar .ant-tabs-nav-container,.ant-tabs-vertical.ant-tabs-right>.ant-tabs-bar .ant-tabs-nav-wrap{margin-left:-1px}.ant-tabs-vertical.ant-tabs-right>.ant-tabs-bar .ant-tabs-ink-bar{left:1px}.ant-tabs-vertical.ant-tabs-right>.ant-tabs-content{padding-right:24px;border-right:1px solid #e8e8e8}.ant-tabs-bottom>.ant-tabs-bar{margin-bottom:0;margin-top:16px}.ant-tabs-bottom .ant-tabs-ink-bar-animated,.ant-tabs-top .ant-tabs-ink-bar-animated{-webkit-transition:width .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:width .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),width .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),width .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1)}.ant-tabs-left .ant-tabs-ink-bar-animated,.ant-tabs-right .ant-tabs-ink-bar-animated{-webkit-transition:height .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:height .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),height .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),height .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1)}.ant-tabs-no-animation>.ant-tabs-content-animated,.ant-tabs-vertical>.ant-tabs-content-animated,.no-flex>.ant-tabs-content-animated{-webkit-transform:none!important;-ms-transform:none!important;transform:none!important;margin-left:0!important}.ant-tabs-no-animation>.ant-tabs-content>.ant-tabs-tabpane-inactive,.ant-tabs-vertical>.ant-tabs-content>.ant-tabs-tabpane-inactive,.no-flex>.ant-tabs-content>.ant-tabs-tabpane-inactive{display:none}.ant-carousel{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);margin:0;padding:0;list-style:none}.ant-carousel,.ant-carousel .slick-slider{-webkit-box-sizing:border-box;box-sizing:border-box}.ant-carousel .slick-slider{position:relative;display:block;-webkit-touch-callout:none;-ms-touch-action:pan-y;touch-action:pan-y;-webkit-tap-highlight-color:transparent}.ant-carousel .slick-list{position:relative;overflow:hidden;display:block;margin:0;padding:0}.ant-carousel .slick-list:focus{outline:none}.ant-carousel .slick-list.dragging{cursor:pointer}.ant-carousel .slick-slider .slick-list,.ant-carousel .slick-slider .slick-track{-webkit-transform:translateZ(0);transform:translateZ(0)}.ant-carousel .slick-track{position:relative;left:0;top:0;display:block}.ant-carousel .slick-track:after,.ant-carousel .slick-track:before{content:"";display:table}.ant-carousel .slick-track:after{clear:both}.slick-loading .ant-carousel .slick-track{visibility:hidden}.ant-carousel .slick-slide{float:left;height:100%;min-height:1px;display:none}[dir=rtl] .ant-carousel .slick-slide{float:right}.ant-carousel .slick-slide img{display:block}.ant-carousel .slick-slide.slick-loading img{display:none}.ant-carousel .slick-slide.dragging img{pointer-events:none}.ant-carousel .slick-initialized .slick-slide{display:block}.ant-carousel .slick-loading .slick-slide{visibility:hidden}.ant-carousel .slick-vertical .slick-slide{display:block;height:auto;border:1px solid transparent}.ant-carousel .slick-arrow.slick-hidden{display:none}.ant-carousel .slick-next,.ant-carousel .slick-prev{position:absolute;display:block;height:20px;width:20px;line-height:0;font-size:0;cursor:pointer;top:50%;margin-top:-10px;padding:0;border:0}.ant-carousel .slick-next,.ant-carousel .slick-next:focus,.ant-carousel .slick-next:hover,.ant-carousel .slick-prev,.ant-carousel .slick-prev:focus,.ant-carousel .slick-prev:hover{background:transparent;color:transparent;outline:none}.ant-carousel .slick-next:focus:before,.ant-carousel .slick-next:hover:before,.ant-carousel .slick-prev:focus:before,.ant-carousel .slick-prev:hover:before{opacity:1}.ant-carousel .slick-next.slick-disabled:before,.ant-carousel .slick-prev.slick-disabled:before{opacity:.25}.ant-carousel .slick-prev{left:-25px}.ant-carousel .slick-prev:before{content:"\2190"}.ant-carousel .slick-next{right:-25px}.ant-carousel .slick-next:before{content:"\2192"}.ant-carousel .slick-dots{position:absolute;bottom:12px;list-style:none;display:block;text-align:center;margin:0;padding:0;width:100%;height:3px}.ant-carousel .slick-dots li{position:relative;display:inline-block;vertical-align:top;text-align:center;margin:0 2px;padding:0}.ant-carousel .slick-dots li button{border:0;cursor:pointer;background:#fff;opacity:.3;display:block;width:16px;height:3px;border-radius:1px;outline:none;font-size:0;color:transparent;-webkit-transition:all .5s;transition:all .5s;padding:0}.ant-carousel .slick-dots li button:focus,.ant-carousel .slick-dots li button:hover{opacity:.75}.ant-carousel .slick-dots li.slick-active button{background:#fff;opacity:1;width:24px}.ant-carousel .slick-dots li.slick-active button:focus,.ant-carousel .slick-dots li.slick-active button:hover{opacity:1}.ant-carousel-vertical .slick-dots{width:3px;bottom:auto;right:12px;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);height:auto}.ant-carousel-vertical .slick-dots li{margin:0 2px;vertical-align:baseline}.ant-carousel-vertical .slick-dots li button{width:3px;height:16px}.ant-carousel-vertical .slick-dots li.slick-active button{width:3px;height:24px}.ant-cascader{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none}.ant-cascader-input.ant-input{background-color:transparent!important;cursor:pointer;width:100%;position:static}.ant-cascader-picker-show-search .ant-cascader-input.ant-input{position:relative}.ant-cascader-picker{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;position:relative;display:inline-block;cursor:pointer;background-color:#fff;border-radius:4px;outline:0;-webkit-transition:color .3s;transition:color .3s}.ant-cascader-picker-with-value .ant-cascader-picker-label{color:transparent}.ant-cascader-picker-disabled{cursor:not-allowed;background:#f5f5f5;color:rgba(0,0,0,.25)}.ant-cascader-picker-disabled .ant-cascader-input{cursor:not-allowed}.ant-cascader-picker:focus .ant-cascader-input{border-color:#40a9ff;outline:0;-webkit-box-shadow:0 0 0 2px rgba(24,144,255,.2);box-shadow:0 0 0 2px rgba(24,144,255,.2);border-right-width:1px!important}.ant-cascader-picker-show-search.ant-cascader-picker-focused{color:rgba(0,0,0,.25)}.ant-cascader-picker-label{position:absolute;left:0;height:20px;line-height:20px;top:50%;margin-top:-10px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;width:100%;padding:0 12px}.ant-cascader-picker-clear{opacity:0;position:absolute;right:12px;z-index:2;background:#fff;top:50%;font-size:12px;color:rgba(0,0,0,.25);width:12px;height:12px;margin-top:-6px;line-height:12px;cursor:pointer;-webkit-transition:color .3s ease,opacity .15s ease;transition:color .3s ease,opacity .15s ease}.ant-cascader-picker-clear:hover{color:rgba(0,0,0,.45)}.ant-cascader-picker:hover .ant-cascader-picker-clear{opacity:1}.ant-cascader-picker-arrow{position:absolute;z-index:1;top:50%;right:12px;width:12px;height:12px;font-size:12px;margin-top:-6px;line-height:12px;color:rgba(0,0,0,.25);-webkit-transition:-webkit-transform .2s;transition:-webkit-transform .2s;transition:transform .2s;transition:transform .2s,-webkit-transform .2s}.ant-cascader-picker-arrow.ant-cascader-picker-arrow-expand{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.ant-cascader-picker-small .ant-cascader-picker-arrow,.ant-cascader-picker-small .ant-cascader-picker-clear{right:8px}.ant-cascader-menus{font-size:14px;background:#fff;position:absolute;z-index:1050;border-radius:4px;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.15);box-shadow:0 2px 8px rgba(0,0,0,.15);white-space:nowrap}.ant-cascader-menus ol,.ant-cascader-menus ul{list-style:none;margin:0;padding:0}.ant-cascader-menus-empty,.ant-cascader-menus-hidden{display:none}.ant-cascader-menus.slide-up-appear.slide-up-appear-active.ant-cascader-menus-placement-bottomLeft,.ant-cascader-menus.slide-up-enter.slide-up-enter-active.ant-cascader-menus-placement-bottomLeft{-webkit-animation-name:antSlideUpIn;animation-name:antSlideUpIn}.ant-cascader-menus.slide-up-appear.slide-up-appear-active.ant-cascader-menus-placement-topLeft,.ant-cascader-menus.slide-up-enter.slide-up-enter-active.ant-cascader-menus-placement-topLeft{-webkit-animation-name:antSlideDownIn;animation-name:antSlideDownIn}.ant-cascader-menus.slide-up-leave.slide-up-leave-active.ant-cascader-menus-placement-bottomLeft{-webkit-animation-name:antSlideUpOut;animation-name:antSlideUpOut}.ant-cascader-menus.slide-up-leave.slide-up-leave-active.ant-cascader-menus-placement-topLeft{-webkit-animation-name:antSlideDownOut;animation-name:antSlideDownOut}.ant-cascader-menu{display:inline-block;vertical-align:top;min-width:111px;height:180px;list-style:none;margin:0;padding:0;border-right:1px solid #e8e8e8;overflow:auto;-ms-overflow-style:-ms-autohiding-scrollbar}.ant-cascader-menu:first-child{border-radius:4px 0 0 4px}.ant-cascader-menu:last-child{border-right-color:transparent;margin-right:-1px;border-radius:0 4px 4px 0}.ant-cascader-menu:only-child{border-radius:4px}.ant-cascader-menu-item{padding:5px 12px;line-height:22px;cursor:pointer;white-space:nowrap;-webkit-transition:all .3s;transition:all .3s}.ant-cascader-menu-item:hover{background:#e6f7ff}.ant-cascader-menu-item-disabled{cursor:not-allowed;color:rgba(0,0,0,.25)}.ant-cascader-menu-item-disabled:hover{background:transparent}.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled),.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled):hover{background:#f5f5f5;font-weight:600}.ant-cascader-menu-item-expand{position:relative;padding-right:24px}.ant-cascader-menu-item-expand .ant-cascader-menu-item-expand-icon,.ant-cascader-menu-item-expand .ant-cascader-menu-item-loading-icon{display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);-ms-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg);color:rgba(0,0,0,.45);position:absolute;right:12px}:root .ant-cascader-menu-item-expand .ant-cascader-menu-item-expand-icon,:root .ant-cascader-menu-item-expand .ant-cascader-menu-item-loading-icon{font-size:12px}.ant-cascader-menu-item .ant-cascader-menu-item-keyword{color:#f5222d}@-webkit-keyframes antCheckboxEffect{0%{-webkit-transform:scale(1);transform:scale(1);opacity:.5}to{-webkit-transform:scale(1.6);transform:scale(1.6);opacity:0}}@keyframes antCheckboxEffect{0%{-webkit-transform:scale(1);transform:scale(1);opacity:.5}to{-webkit-transform:scale(1.6);transform:scale(1.6);opacity:0}}.ant-checkbox{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;white-space:nowrap;cursor:pointer;outline:none;display:inline-block;line-height:1;position:relative;vertical-align:middle;top:-.09em}.ant-checkbox-input:focus+.ant-checkbox-inner,.ant-checkbox-wrapper:hover .ant-checkbox-inner,.ant-checkbox:hover .ant-checkbox-inner{border-color:#1890ff}.ant-checkbox-checked:after{position:absolute;top:0;left:0;width:100%;height:100%;border-radius:2px;border:1px solid #1890ff;content:"";-webkit-animation:antCheckboxEffect .36s ease-in-out;animation:antCheckboxEffect .36s ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:hidden}.ant-checkbox-wrapper:hover .ant-checkbox:after,.ant-checkbox:hover:after{visibility:visible}.ant-checkbox-inner{position:relative;top:0;left:0;display:block;width:16px;height:16px;border:1px solid #d9d9d9;border-radius:2px;background-color:#fff;-webkit-transition:all .3s;transition:all .3s}.ant-checkbox-inner:after{-webkit-transform:rotate(45deg) scale(0);-ms-transform:rotate(45deg) scale(0);transform:rotate(45deg) scale(0);position:absolute;left:4.57142857px;top:1.14285714px;display:table;width:5.71428571px;height:9.14285714px;border:2px solid #fff;border-top:0;border-left:0;content:" ";-webkit-transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;opacity:0}.ant-checkbox-input{position:absolute;left:0;z-index:1;cursor:pointer;opacity:0;top:0;bottom:0;right:0;width:100%;height:100%}.ant-checkbox-indeterminate .ant-checkbox-inner:after{content:" ";-webkit-transform:translate(-50%,-50%) scale(1);-ms-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);border:0;left:50%;top:50%;width:8px;height:8px;background-color:#1890ff;opacity:1}.ant-checkbox-indeterminate.ant-checkbox-disabled .ant-checkbox-inner:after{border-color:rgba(0,0,0,.25)}.ant-checkbox-checked .ant-checkbox-inner:after{-webkit-transform:rotate(45deg) scale(1);-ms-transform:rotate(45deg) scale(1);transform:rotate(45deg) scale(1);position:absolute;display:table;border:2px solid #fff;border-top:0;border-left:0;content:" ";-webkit-transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;opacity:1}.ant-checkbox-checked .ant-checkbox-inner{background-color:#1890ff;border-color:#1890ff}.ant-checkbox-disabled{cursor:not-allowed}.ant-checkbox-disabled.ant-checkbox-checked .ant-checkbox-inner:after{-webkit-animation-name:none;animation-name:none;border-color:rgba(0,0,0,.25)}.ant-checkbox-disabled .ant-checkbox-input{cursor:not-allowed}.ant-checkbox-disabled .ant-checkbox-inner{border-color:#d9d9d9!important;background-color:#f5f5f5}.ant-checkbox-disabled .ant-checkbox-inner:after{-webkit-animation-name:none;animation-name:none;border-color:#f5f5f5}.ant-checkbox-disabled+span{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-checkbox-wrapper{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;line-height:unset;cursor:pointer;display:inline-block}.ant-checkbox-wrapper+.ant-checkbox-wrapper{margin-left:8px}.ant-checkbox+span,.ant-checkbox-wrapper+span{padding-left:8px;padding-right:8px}.ant-checkbox-group{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;display:inline-block}.ant-checkbox-group-item{display:inline-block;margin-right:8px}.ant-checkbox-group-item:last-child{margin-right:0}.ant-checkbox-group-item+.ant-checkbox-group-item{margin-left:0}.ant-row{position:relative;margin-left:0;margin-right:0;height:auto;zoom:1;display:block;-webkit-box-sizing:border-box;box-sizing:border-box}.ant-row:after,.ant-row:before{content:"";display:table}.ant-row:after{clear:both}.ant-row-flex{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.ant-row-flex,.ant-row-flex:after,.ant-row-flex:before{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ant-row-flex-start{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.ant-row-flex-center{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.ant-row-flex-end{-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.ant-row-flex-space-between{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.ant-row-flex-space-around{-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}.ant-row-flex-top{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}.ant-row-flex-middle{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.ant-row-flex-bottom{-webkit-box-align:end;-webkit-align-items:flex-end;-ms-flex-align:end;align-items:flex-end}.ant-col{position:relative;display:block}.ant-col-1,.ant-col-2,.ant-col-3,.ant-col-4,.ant-col-5,.ant-col-6,.ant-col-7,.ant-col-8,.ant-col-9,.ant-col-10,.ant-col-11,.ant-col-12,.ant-col-13,.ant-col-14,.ant-col-15,.ant-col-16,.ant-col-17,.ant-col-18,.ant-col-19,.ant-col-20,.ant-col-21,.ant-col-22,.ant-col-23,.ant-col-24,.ant-col-lg-1,.ant-col-lg-2,.ant-col-lg-3,.ant-col-lg-4,.ant-col-lg-5,.ant-col-lg-6,.ant-col-lg-7,.ant-col-lg-8,.ant-col-lg-9,.ant-col-lg-10,.ant-col-lg-11,.ant-col-lg-12,.ant-col-lg-13,.ant-col-lg-14,.ant-col-lg-15,.ant-col-lg-16,.ant-col-lg-17,.ant-col-lg-18,.ant-col-lg-19,.ant-col-lg-20,.ant-col-lg-21,.ant-col-lg-22,.ant-col-lg-23,.ant-col-lg-24,.ant-col-md-1,.ant-col-md-2,.ant-col-md-3,.ant-col-md-4,.ant-col-md-5,.ant-col-md-6,.ant-col-md-7,.ant-col-md-8,.ant-col-md-9,.ant-col-md-10,.ant-col-md-11,.ant-col-md-12,.ant-col-md-13,.ant-col-md-14,.ant-col-md-15,.ant-col-md-16,.ant-col-md-17,.ant-col-md-18,.ant-col-md-19,.ant-col-md-20,.ant-col-md-21,.ant-col-md-22,.ant-col-md-23,.ant-col-md-24,.ant-col-sm-1,.ant-col-sm-2,.ant-col-sm-3,.ant-col-sm-4,.ant-col-sm-5,.ant-col-sm-6,.ant-col-sm-7,.ant-col-sm-8,.ant-col-sm-9,.ant-col-sm-10,.ant-col-sm-11,.ant-col-sm-12,.ant-col-sm-13,.ant-col-sm-14,.ant-col-sm-15,.ant-col-sm-16,.ant-col-sm-17,.ant-col-sm-18,.ant-col-sm-19,.ant-col-sm-20,.ant-col-sm-21,.ant-col-sm-22,.ant-col-sm-23,.ant-col-sm-24,.ant-col-xs-1,.ant-col-xs-2,.ant-col-xs-3,.ant-col-xs-4,.ant-col-xs-5,.ant-col-xs-6,.ant-col-xs-7,.ant-col-xs-8,.ant-col-xs-9,.ant-col-xs-10,.ant-col-xs-11,.ant-col-xs-12,.ant-col-xs-13,.ant-col-xs-14,.ant-col-xs-15,.ant-col-xs-16,.ant-col-xs-17,.ant-col-xs-18,.ant-col-xs-19,.ant-col-xs-20,.ant-col-xs-21,.ant-col-xs-22,.ant-col-xs-23,.ant-col-xs-24{position:relative;min-height:1px;padding-left:0;padding-right:0}.ant-col-1,.ant-col-2,.ant-col-3,.ant-col-4,.ant-col-5,.ant-col-6,.ant-col-7,.ant-col-8,.ant-col-9,.ant-col-10,.ant-col-11,.ant-col-12,.ant-col-13,.ant-col-14,.ant-col-15,.ant-col-16,.ant-col-17,.ant-col-18,.ant-col-19,.ant-col-20,.ant-col-21,.ant-col-22,.ant-col-23,.ant-col-24{float:left;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.ant-col-24{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.ant-col-push-24{left:100%}.ant-col-pull-24{right:100%}.ant-col-offset-24{margin-left:100%}.ant-col-order-24{-webkit-box-ordinal-group:25;-webkit-order:24;-ms-flex-order:24;order:24}.ant-col-23{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:95.83333333%}.ant-col-push-23{left:95.83333333%}.ant-col-pull-23{right:95.83333333%}.ant-col-offset-23{margin-left:95.83333333%}.ant-col-order-23{-webkit-box-ordinal-group:24;-webkit-order:23;-ms-flex-order:23;order:23}.ant-col-22{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:91.66666667%}.ant-col-push-22{left:91.66666667%}.ant-col-pull-22{right:91.66666667%}.ant-col-offset-22{margin-left:91.66666667%}.ant-col-order-22{-webkit-box-ordinal-group:23;-webkit-order:22;-ms-flex-order:22;order:22}.ant-col-21{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:87.5%}.ant-col-push-21{left:87.5%}.ant-col-pull-21{right:87.5%}.ant-col-offset-21{margin-left:87.5%}.ant-col-order-21{-webkit-box-ordinal-group:22;-webkit-order:21;-ms-flex-order:21;order:21}.ant-col-20{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:83.33333333%}.ant-col-push-20{left:83.33333333%}.ant-col-pull-20{right:83.33333333%}.ant-col-offset-20{margin-left:83.33333333%}.ant-col-order-20{-webkit-box-ordinal-group:21;-webkit-order:20;-ms-flex-order:20;order:20}.ant-col-19{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:79.16666667%}.ant-col-push-19{left:79.16666667%}.ant-col-pull-19{right:79.16666667%}.ant-col-offset-19{margin-left:79.16666667%}.ant-col-order-19{-webkit-box-ordinal-group:20;-webkit-order:19;-ms-flex-order:19;order:19}.ant-col-18{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:75%}.ant-col-push-18{left:75%}.ant-col-pull-18{right:75%}.ant-col-offset-18{margin-left:75%}.ant-col-order-18{-webkit-box-ordinal-group:19;-webkit-order:18;-ms-flex-order:18;order:18}.ant-col-17{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:70.83333333%}.ant-col-push-17{left:70.83333333%}.ant-col-pull-17{right:70.83333333%}.ant-col-offset-17{margin-left:70.83333333%}.ant-col-order-17{-webkit-box-ordinal-group:18;-webkit-order:17;-ms-flex-order:17;order:17}.ant-col-16{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:66.66666667%}.ant-col-push-16{left:66.66666667%}.ant-col-pull-16{right:66.66666667%}.ant-col-offset-16{margin-left:66.66666667%}.ant-col-order-16{-webkit-box-ordinal-group:17;-webkit-order:16;-ms-flex-order:16;order:16}.ant-col-15{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:62.5%}.ant-col-push-15{left:62.5%}.ant-col-pull-15{right:62.5%}.ant-col-offset-15{margin-left:62.5%}.ant-col-order-15{-webkit-box-ordinal-group:16;-webkit-order:15;-ms-flex-order:15;order:15}.ant-col-14{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:58.33333333%}.ant-col-push-14{left:58.33333333%}.ant-col-pull-14{right:58.33333333%}.ant-col-offset-14{margin-left:58.33333333%}.ant-col-order-14{-webkit-box-ordinal-group:15;-webkit-order:14;-ms-flex-order:14;order:14}.ant-col-13{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:54.16666667%}.ant-col-push-13{left:54.16666667%}.ant-col-pull-13{right:54.16666667%}.ant-col-offset-13{margin-left:54.16666667%}.ant-col-order-13{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.ant-col-12{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.ant-col-push-12{left:50%}.ant-col-pull-12{right:50%}.ant-col-offset-12{margin-left:50%}.ant-col-order-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.ant-col-11{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:45.83333333%}.ant-col-push-11{left:45.83333333%}.ant-col-pull-11{right:45.83333333%}.ant-col-offset-11{margin-left:45.83333333%}.ant-col-order-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.ant-col-10{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:41.66666667%}.ant-col-push-10{left:41.66666667%}.ant-col-pull-10{right:41.66666667%}.ant-col-offset-10{margin-left:41.66666667%}.ant-col-order-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.ant-col-9{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:37.5%}.ant-col-push-9{left:37.5%}.ant-col-pull-9{right:37.5%}.ant-col-offset-9{margin-left:37.5%}.ant-col-order-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.ant-col-8{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:33.33333333%}.ant-col-push-8{left:33.33333333%}.ant-col-pull-8{right:33.33333333%}.ant-col-offset-8{margin-left:33.33333333%}.ant-col-order-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.ant-col-7{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:29.16666667%}.ant-col-push-7{left:29.16666667%}.ant-col-pull-7{right:29.16666667%}.ant-col-offset-7{margin-left:29.16666667%}.ant-col-order-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.ant-col-6{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:25%}.ant-col-push-6{left:25%}.ant-col-pull-6{right:25%}.ant-col-offset-6{margin-left:25%}.ant-col-order-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.ant-col-5{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:20.83333333%}.ant-col-push-5{left:20.83333333%}.ant-col-pull-5{right:20.83333333%}.ant-col-offset-5{margin-left:20.83333333%}.ant-col-order-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.ant-col-4{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:16.66666667%}.ant-col-push-4{left:16.66666667%}.ant-col-pull-4{right:16.66666667%}.ant-col-offset-4{margin-left:16.66666667%}.ant-col-order-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.ant-col-3{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:12.5%}.ant-col-push-3{left:12.5%}.ant-col-pull-3{right:12.5%}.ant-col-offset-3{margin-left:12.5%}.ant-col-order-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.ant-col-2{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:8.33333333%}.ant-col-push-2{left:8.33333333%}.ant-col-pull-2{right:8.33333333%}.ant-col-offset-2{margin-left:8.33333333%}.ant-col-order-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.ant-col-1{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:4.16666667%}.ant-col-push-1{left:4.16666667%}.ant-col-pull-1{right:4.16666667%}.ant-col-offset-1{margin-left:4.16666667%}.ant-col-order-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.ant-col-0{display:none}.ant-col-offset-0{margin-left:0}.ant-col-order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.ant-col-xs-1,.ant-col-xs-2,.ant-col-xs-3,.ant-col-xs-4,.ant-col-xs-5,.ant-col-xs-6,.ant-col-xs-7,.ant-col-xs-8,.ant-col-xs-9,.ant-col-xs-10,.ant-col-xs-11,.ant-col-xs-12,.ant-col-xs-13,.ant-col-xs-14,.ant-col-xs-15,.ant-col-xs-16,.ant-col-xs-17,.ant-col-xs-18,.ant-col-xs-19,.ant-col-xs-20,.ant-col-xs-21,.ant-col-xs-22,.ant-col-xs-23,.ant-col-xs-24{float:left;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.ant-col-xs-24{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.ant-col-xs-push-24{left:100%}.ant-col-xs-pull-24{right:100%}.ant-col-xs-offset-24{margin-left:100%}.ant-col-xs-order-24{-webkit-box-ordinal-group:25;-webkit-order:24;-ms-flex-order:24;order:24}.ant-col-xs-23{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:95.83333333%}.ant-col-xs-push-23{left:95.83333333%}.ant-col-xs-pull-23{right:95.83333333%}.ant-col-xs-offset-23{margin-left:95.83333333%}.ant-col-xs-order-23{-webkit-box-ordinal-group:24;-webkit-order:23;-ms-flex-order:23;order:23}.ant-col-xs-22{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:91.66666667%}.ant-col-xs-push-22{left:91.66666667%}.ant-col-xs-pull-22{right:91.66666667%}.ant-col-xs-offset-22{margin-left:91.66666667%}.ant-col-xs-order-22{-webkit-box-ordinal-group:23;-webkit-order:22;-ms-flex-order:22;order:22}.ant-col-xs-21{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:87.5%}.ant-col-xs-push-21{left:87.5%}.ant-col-xs-pull-21{right:87.5%}.ant-col-xs-offset-21{margin-left:87.5%}.ant-col-xs-order-21{-webkit-box-ordinal-group:22;-webkit-order:21;-ms-flex-order:21;order:21}.ant-col-xs-20{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:83.33333333%}.ant-col-xs-push-20{left:83.33333333%}.ant-col-xs-pull-20{right:83.33333333%}.ant-col-xs-offset-20{margin-left:83.33333333%}.ant-col-xs-order-20{-webkit-box-ordinal-group:21;-webkit-order:20;-ms-flex-order:20;order:20}.ant-col-xs-19{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:79.16666667%}.ant-col-xs-push-19{left:79.16666667%}.ant-col-xs-pull-19{right:79.16666667%}.ant-col-xs-offset-19{margin-left:79.16666667%}.ant-col-xs-order-19{-webkit-box-ordinal-group:20;-webkit-order:19;-ms-flex-order:19;order:19}.ant-col-xs-18{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:75%}.ant-col-xs-push-18{left:75%}.ant-col-xs-pull-18{right:75%}.ant-col-xs-offset-18{margin-left:75%}.ant-col-xs-order-18{-webkit-box-ordinal-group:19;-webkit-order:18;-ms-flex-order:18;order:18}.ant-col-xs-17{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:70.83333333%}.ant-col-xs-push-17{left:70.83333333%}.ant-col-xs-pull-17{right:70.83333333%}.ant-col-xs-offset-17{margin-left:70.83333333%}.ant-col-xs-order-17{-webkit-box-ordinal-group:18;-webkit-order:17;-ms-flex-order:17;order:17}.ant-col-xs-16{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:66.66666667%}.ant-col-xs-push-16{left:66.66666667%}.ant-col-xs-pull-16{right:66.66666667%}.ant-col-xs-offset-16{margin-left:66.66666667%}.ant-col-xs-order-16{-webkit-box-ordinal-group:17;-webkit-order:16;-ms-flex-order:16;order:16}.ant-col-xs-15{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:62.5%}.ant-col-xs-push-15{left:62.5%}.ant-col-xs-pull-15{right:62.5%}.ant-col-xs-offset-15{margin-left:62.5%}.ant-col-xs-order-15{-webkit-box-ordinal-group:16;-webkit-order:15;-ms-flex-order:15;order:15}.ant-col-xs-14{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:58.33333333%}.ant-col-xs-push-14{left:58.33333333%}.ant-col-xs-pull-14{right:58.33333333%}.ant-col-xs-offset-14{margin-left:58.33333333%}.ant-col-xs-order-14{-webkit-box-ordinal-group:15;-webkit-order:14;-ms-flex-order:14;order:14}.ant-col-xs-13{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:54.16666667%}.ant-col-xs-push-13{left:54.16666667%}.ant-col-xs-pull-13{right:54.16666667%}.ant-col-xs-offset-13{margin-left:54.16666667%}.ant-col-xs-order-13{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.ant-col-xs-12{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.ant-col-xs-push-12{left:50%}.ant-col-xs-pull-12{right:50%}.ant-col-xs-offset-12{margin-left:50%}.ant-col-xs-order-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.ant-col-xs-11{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:45.83333333%}.ant-col-xs-push-11{left:45.83333333%}.ant-col-xs-pull-11{right:45.83333333%}.ant-col-xs-offset-11{margin-left:45.83333333%}.ant-col-xs-order-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.ant-col-xs-10{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:41.66666667%}.ant-col-xs-push-10{left:41.66666667%}.ant-col-xs-pull-10{right:41.66666667%}.ant-col-xs-offset-10{margin-left:41.66666667%}.ant-col-xs-order-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.ant-col-xs-9{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:37.5%}.ant-col-xs-push-9{left:37.5%}.ant-col-xs-pull-9{right:37.5%}.ant-col-xs-offset-9{margin-left:37.5%}.ant-col-xs-order-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.ant-col-xs-8{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:33.33333333%}.ant-col-xs-push-8{left:33.33333333%}.ant-col-xs-pull-8{right:33.33333333%}.ant-col-xs-offset-8{margin-left:33.33333333%}.ant-col-xs-order-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.ant-col-xs-7{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:29.16666667%}.ant-col-xs-push-7{left:29.16666667%}.ant-col-xs-pull-7{right:29.16666667%}.ant-col-xs-offset-7{margin-left:29.16666667%}.ant-col-xs-order-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.ant-col-xs-6{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:25%}.ant-col-xs-push-6{left:25%}.ant-col-xs-pull-6{right:25%}.ant-col-xs-offset-6{margin-left:25%}.ant-col-xs-order-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.ant-col-xs-5{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:20.83333333%}.ant-col-xs-push-5{left:20.83333333%}.ant-col-xs-pull-5{right:20.83333333%}.ant-col-xs-offset-5{margin-left:20.83333333%}.ant-col-xs-order-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.ant-col-xs-4{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:16.66666667%}.ant-col-xs-push-4{left:16.66666667%}.ant-col-xs-pull-4{right:16.66666667%}.ant-col-xs-offset-4{margin-left:16.66666667%}.ant-col-xs-order-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.ant-col-xs-3{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:12.5%}.ant-col-xs-push-3{left:12.5%}.ant-col-xs-pull-3{right:12.5%}.ant-col-xs-offset-3{margin-left:12.5%}.ant-col-xs-order-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.ant-col-xs-2{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:8.33333333%}.ant-col-xs-push-2{left:8.33333333%}.ant-col-xs-pull-2{right:8.33333333%}.ant-col-xs-offset-2{margin-left:8.33333333%}.ant-col-xs-order-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.ant-col-xs-1{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:4.16666667%}.ant-col-xs-push-1{left:4.16666667%}.ant-col-xs-pull-1{right:4.16666667%}.ant-col-xs-offset-1{margin-left:4.16666667%}.ant-col-xs-order-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.ant-col-xs-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-xs-push-0{left:auto}.ant-col-xs-pull-0{right:auto}.ant-col-xs-offset-0{margin-left:0}.ant-col-xs-order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}@media (min-width:576px){.ant-col-sm-1,.ant-col-sm-2,.ant-col-sm-3,.ant-col-sm-4,.ant-col-sm-5,.ant-col-sm-6,.ant-col-sm-7,.ant-col-sm-8,.ant-col-sm-9,.ant-col-sm-10,.ant-col-sm-11,.ant-col-sm-12,.ant-col-sm-13,.ant-col-sm-14,.ant-col-sm-15,.ant-col-sm-16,.ant-col-sm-17,.ant-col-sm-18,.ant-col-sm-19,.ant-col-sm-20,.ant-col-sm-21,.ant-col-sm-22,.ant-col-sm-23,.ant-col-sm-24{float:left;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.ant-col-sm-24{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.ant-col-sm-push-24{left:100%}.ant-col-sm-pull-24{right:100%}.ant-col-sm-offset-24{margin-left:100%}.ant-col-sm-order-24{-webkit-box-ordinal-group:25;-webkit-order:24;-ms-flex-order:24;order:24}.ant-col-sm-23{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:95.83333333%}.ant-col-sm-push-23{left:95.83333333%}.ant-col-sm-pull-23{right:95.83333333%}.ant-col-sm-offset-23{margin-left:95.83333333%}.ant-col-sm-order-23{-webkit-box-ordinal-group:24;-webkit-order:23;-ms-flex-order:23;order:23}.ant-col-sm-22{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:91.66666667%}.ant-col-sm-push-22{left:91.66666667%}.ant-col-sm-pull-22{right:91.66666667%}.ant-col-sm-offset-22{margin-left:91.66666667%}.ant-col-sm-order-22{-webkit-box-ordinal-group:23;-webkit-order:22;-ms-flex-order:22;order:22}.ant-col-sm-21{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:87.5%}.ant-col-sm-push-21{left:87.5%}.ant-col-sm-pull-21{right:87.5%}.ant-col-sm-offset-21{margin-left:87.5%}.ant-col-sm-order-21{-webkit-box-ordinal-group:22;-webkit-order:21;-ms-flex-order:21;order:21}.ant-col-sm-20{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:83.33333333%}.ant-col-sm-push-20{left:83.33333333%}.ant-col-sm-pull-20{right:83.33333333%}.ant-col-sm-offset-20{margin-left:83.33333333%}.ant-col-sm-order-20{-webkit-box-ordinal-group:21;-webkit-order:20;-ms-flex-order:20;order:20}.ant-col-sm-19{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:79.16666667%}.ant-col-sm-push-19{left:79.16666667%}.ant-col-sm-pull-19{right:79.16666667%}.ant-col-sm-offset-19{margin-left:79.16666667%}.ant-col-sm-order-19{-webkit-box-ordinal-group:20;-webkit-order:19;-ms-flex-order:19;order:19}.ant-col-sm-18{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:75%}.ant-col-sm-push-18{left:75%}.ant-col-sm-pull-18{right:75%}.ant-col-sm-offset-18{margin-left:75%}.ant-col-sm-order-18{-webkit-box-ordinal-group:19;-webkit-order:18;-ms-flex-order:18;order:18}.ant-col-sm-17{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:70.83333333%}.ant-col-sm-push-17{left:70.83333333%}.ant-col-sm-pull-17{right:70.83333333%}.ant-col-sm-offset-17{margin-left:70.83333333%}.ant-col-sm-order-17{-webkit-box-ordinal-group:18;-webkit-order:17;-ms-flex-order:17;order:17}.ant-col-sm-16{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:66.66666667%}.ant-col-sm-push-16{left:66.66666667%}.ant-col-sm-pull-16{right:66.66666667%}.ant-col-sm-offset-16{margin-left:66.66666667%}.ant-col-sm-order-16{-webkit-box-ordinal-group:17;-webkit-order:16;-ms-flex-order:16;order:16}.ant-col-sm-15{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:62.5%}.ant-col-sm-push-15{left:62.5%}.ant-col-sm-pull-15{right:62.5%}.ant-col-sm-offset-15{margin-left:62.5%}.ant-col-sm-order-15{-webkit-box-ordinal-group:16;-webkit-order:15;-ms-flex-order:15;order:15}.ant-col-sm-14{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:58.33333333%}.ant-col-sm-push-14{left:58.33333333%}.ant-col-sm-pull-14{right:58.33333333%}.ant-col-sm-offset-14{margin-left:58.33333333%}.ant-col-sm-order-14{-webkit-box-ordinal-group:15;-webkit-order:14;-ms-flex-order:14;order:14}.ant-col-sm-13{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:54.16666667%}.ant-col-sm-push-13{left:54.16666667%}.ant-col-sm-pull-13{right:54.16666667%}.ant-col-sm-offset-13{margin-left:54.16666667%}.ant-col-sm-order-13{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.ant-col-sm-12{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.ant-col-sm-push-12{left:50%}.ant-col-sm-pull-12{right:50%}.ant-col-sm-offset-12{margin-left:50%}.ant-col-sm-order-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.ant-col-sm-11{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:45.83333333%}.ant-col-sm-push-11{left:45.83333333%}.ant-col-sm-pull-11{right:45.83333333%}.ant-col-sm-offset-11{margin-left:45.83333333%}.ant-col-sm-order-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.ant-col-sm-10{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:41.66666667%}.ant-col-sm-push-10{left:41.66666667%}.ant-col-sm-pull-10{right:41.66666667%}.ant-col-sm-offset-10{margin-left:41.66666667%}.ant-col-sm-order-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.ant-col-sm-9{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:37.5%}.ant-col-sm-push-9{left:37.5%}.ant-col-sm-pull-9{right:37.5%}.ant-col-sm-offset-9{margin-left:37.5%}.ant-col-sm-order-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.ant-col-sm-8{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:33.33333333%}.ant-col-sm-push-8{left:33.33333333%}.ant-col-sm-pull-8{right:33.33333333%}.ant-col-sm-offset-8{margin-left:33.33333333%}.ant-col-sm-order-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.ant-col-sm-7{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:29.16666667%}.ant-col-sm-push-7{left:29.16666667%}.ant-col-sm-pull-7{right:29.16666667%}.ant-col-sm-offset-7{margin-left:29.16666667%}.ant-col-sm-order-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.ant-col-sm-6{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:25%}.ant-col-sm-push-6{left:25%}.ant-col-sm-pull-6{right:25%}.ant-col-sm-offset-6{margin-left:25%}.ant-col-sm-order-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.ant-col-sm-5{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:20.83333333%}.ant-col-sm-push-5{left:20.83333333%}.ant-col-sm-pull-5{right:20.83333333%}.ant-col-sm-offset-5{margin-left:20.83333333%}.ant-col-sm-order-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.ant-col-sm-4{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:16.66666667%}.ant-col-sm-push-4{left:16.66666667%}.ant-col-sm-pull-4{right:16.66666667%}.ant-col-sm-offset-4{margin-left:16.66666667%}.ant-col-sm-order-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.ant-col-sm-3{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:12.5%}.ant-col-sm-push-3{left:12.5%}.ant-col-sm-pull-3{right:12.5%}.ant-col-sm-offset-3{margin-left:12.5%}.ant-col-sm-order-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.ant-col-sm-2{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:8.33333333%}.ant-col-sm-push-2{left:8.33333333%}.ant-col-sm-pull-2{right:8.33333333%}.ant-col-sm-offset-2{margin-left:8.33333333%}.ant-col-sm-order-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.ant-col-sm-1{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:4.16666667%}.ant-col-sm-push-1{left:4.16666667%}.ant-col-sm-pull-1{right:4.16666667%}.ant-col-sm-offset-1{margin-left:4.16666667%}.ant-col-sm-order-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.ant-col-sm-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-sm-push-0{left:auto}.ant-col-sm-pull-0{right:auto}.ant-col-sm-offset-0{margin-left:0}.ant-col-sm-order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}}@media (min-width:768px){.ant-col-md-1,.ant-col-md-2,.ant-col-md-3,.ant-col-md-4,.ant-col-md-5,.ant-col-md-6,.ant-col-md-7,.ant-col-md-8,.ant-col-md-9,.ant-col-md-10,.ant-col-md-11,.ant-col-md-12,.ant-col-md-13,.ant-col-md-14,.ant-col-md-15,.ant-col-md-16,.ant-col-md-17,.ant-col-md-18,.ant-col-md-19,.ant-col-md-20,.ant-col-md-21,.ant-col-md-22,.ant-col-md-23,.ant-col-md-24{float:left;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.ant-col-md-24{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.ant-col-md-push-24{left:100%}.ant-col-md-pull-24{right:100%}.ant-col-md-offset-24{margin-left:100%}.ant-col-md-order-24{-webkit-box-ordinal-group:25;-webkit-order:24;-ms-flex-order:24;order:24}.ant-col-md-23{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:95.83333333%}.ant-col-md-push-23{left:95.83333333%}.ant-col-md-pull-23{right:95.83333333%}.ant-col-md-offset-23{margin-left:95.83333333%}.ant-col-md-order-23{-webkit-box-ordinal-group:24;-webkit-order:23;-ms-flex-order:23;order:23}.ant-col-md-22{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:91.66666667%}.ant-col-md-push-22{left:91.66666667%}.ant-col-md-pull-22{right:91.66666667%}.ant-col-md-offset-22{margin-left:91.66666667%}.ant-col-md-order-22{-webkit-box-ordinal-group:23;-webkit-order:22;-ms-flex-order:22;order:22}.ant-col-md-21{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:87.5%}.ant-col-md-push-21{left:87.5%}.ant-col-md-pull-21{right:87.5%}.ant-col-md-offset-21{margin-left:87.5%}.ant-col-md-order-21{-webkit-box-ordinal-group:22;-webkit-order:21;-ms-flex-order:21;order:21}.ant-col-md-20{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:83.33333333%}.ant-col-md-push-20{left:83.33333333%}.ant-col-md-pull-20{right:83.33333333%}.ant-col-md-offset-20{margin-left:83.33333333%}.ant-col-md-order-20{-webkit-box-ordinal-group:21;-webkit-order:20;-ms-flex-order:20;order:20}.ant-col-md-19{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:79.16666667%}.ant-col-md-push-19{left:79.16666667%}.ant-col-md-pull-19{right:79.16666667%}.ant-col-md-offset-19{margin-left:79.16666667%}.ant-col-md-order-19{-webkit-box-ordinal-group:20;-webkit-order:19;-ms-flex-order:19;order:19}.ant-col-md-18{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:75%}.ant-col-md-push-18{left:75%}.ant-col-md-pull-18{right:75%}.ant-col-md-offset-18{margin-left:75%}.ant-col-md-order-18{-webkit-box-ordinal-group:19;-webkit-order:18;-ms-flex-order:18;order:18}.ant-col-md-17{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:70.83333333%}.ant-col-md-push-17{left:70.83333333%}.ant-col-md-pull-17{right:70.83333333%}.ant-col-md-offset-17{margin-left:70.83333333%}.ant-col-md-order-17{-webkit-box-ordinal-group:18;-webkit-order:17;-ms-flex-order:17;order:17}.ant-col-md-16{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:66.66666667%}.ant-col-md-push-16{left:66.66666667%}.ant-col-md-pull-16{right:66.66666667%}.ant-col-md-offset-16{margin-left:66.66666667%}.ant-col-md-order-16{-webkit-box-ordinal-group:17;-webkit-order:16;-ms-flex-order:16;order:16}.ant-col-md-15{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:62.5%}.ant-col-md-push-15{left:62.5%}.ant-col-md-pull-15{right:62.5%}.ant-col-md-offset-15{margin-left:62.5%}.ant-col-md-order-15{-webkit-box-ordinal-group:16;-webkit-order:15;-ms-flex-order:15;order:15}.ant-col-md-14{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:58.33333333%}.ant-col-md-push-14{left:58.33333333%}.ant-col-md-pull-14{right:58.33333333%}.ant-col-md-offset-14{margin-left:58.33333333%}.ant-col-md-order-14{-webkit-box-ordinal-group:15;-webkit-order:14;-ms-flex-order:14;order:14}.ant-col-md-13{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:54.16666667%}.ant-col-md-push-13{left:54.16666667%}.ant-col-md-pull-13{right:54.16666667%}.ant-col-md-offset-13{margin-left:54.16666667%}.ant-col-md-order-13{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.ant-col-md-12{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.ant-col-md-push-12{left:50%}.ant-col-md-pull-12{right:50%}.ant-col-md-offset-12{margin-left:50%}.ant-col-md-order-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.ant-col-md-11{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:45.83333333%}.ant-col-md-push-11{left:45.83333333%}.ant-col-md-pull-11{right:45.83333333%}.ant-col-md-offset-11{margin-left:45.83333333%}.ant-col-md-order-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.ant-col-md-10{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:41.66666667%}.ant-col-md-push-10{left:41.66666667%}.ant-col-md-pull-10{right:41.66666667%}.ant-col-md-offset-10{margin-left:41.66666667%}.ant-col-md-order-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.ant-col-md-9{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:37.5%}.ant-col-md-push-9{left:37.5%}.ant-col-md-pull-9{right:37.5%}.ant-col-md-offset-9{margin-left:37.5%}.ant-col-md-order-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.ant-col-md-8{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:33.33333333%}.ant-col-md-push-8{left:33.33333333%}.ant-col-md-pull-8{right:33.33333333%}.ant-col-md-offset-8{margin-left:33.33333333%}.ant-col-md-order-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.ant-col-md-7{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:29.16666667%}.ant-col-md-push-7{left:29.16666667%}.ant-col-md-pull-7{right:29.16666667%}.ant-col-md-offset-7{margin-left:29.16666667%}.ant-col-md-order-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.ant-col-md-6{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:25%}.ant-col-md-push-6{left:25%}.ant-col-md-pull-6{right:25%}.ant-col-md-offset-6{margin-left:25%}.ant-col-md-order-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.ant-col-md-5{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:20.83333333%}.ant-col-md-push-5{left:20.83333333%}.ant-col-md-pull-5{right:20.83333333%}.ant-col-md-offset-5{margin-left:20.83333333%}.ant-col-md-order-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.ant-col-md-4{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:16.66666667%}.ant-col-md-push-4{left:16.66666667%}.ant-col-md-pull-4{right:16.66666667%}.ant-col-md-offset-4{margin-left:16.66666667%}.ant-col-md-order-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.ant-col-md-3{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:12.5%}.ant-col-md-push-3{left:12.5%}.ant-col-md-pull-3{right:12.5%}.ant-col-md-offset-3{margin-left:12.5%}.ant-col-md-order-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.ant-col-md-2{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:8.33333333%}.ant-col-md-push-2{left:8.33333333%}.ant-col-md-pull-2{right:8.33333333%}.ant-col-md-offset-2{margin-left:8.33333333%}.ant-col-md-order-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.ant-col-md-1{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:4.16666667%}.ant-col-md-push-1{left:4.16666667%}.ant-col-md-pull-1{right:4.16666667%}.ant-col-md-offset-1{margin-left:4.16666667%}.ant-col-md-order-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.ant-col-md-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-md-push-0{left:auto}.ant-col-md-pull-0{right:auto}.ant-col-md-offset-0{margin-left:0}.ant-col-md-order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}}@media (min-width:992px){.ant-col-lg-1,.ant-col-lg-2,.ant-col-lg-3,.ant-col-lg-4,.ant-col-lg-5,.ant-col-lg-6,.ant-col-lg-7,.ant-col-lg-8,.ant-col-lg-9,.ant-col-lg-10,.ant-col-lg-11,.ant-col-lg-12,.ant-col-lg-13,.ant-col-lg-14,.ant-col-lg-15,.ant-col-lg-16,.ant-col-lg-17,.ant-col-lg-18,.ant-col-lg-19,.ant-col-lg-20,.ant-col-lg-21,.ant-col-lg-22,.ant-col-lg-23,.ant-col-lg-24{float:left;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.ant-col-lg-24{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.ant-col-lg-push-24{left:100%}.ant-col-lg-pull-24{right:100%}.ant-col-lg-offset-24{margin-left:100%}.ant-col-lg-order-24{-webkit-box-ordinal-group:25;-webkit-order:24;-ms-flex-order:24;order:24}.ant-col-lg-23{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:95.83333333%}.ant-col-lg-push-23{left:95.83333333%}.ant-col-lg-pull-23{right:95.83333333%}.ant-col-lg-offset-23{margin-left:95.83333333%}.ant-col-lg-order-23{-webkit-box-ordinal-group:24;-webkit-order:23;-ms-flex-order:23;order:23}.ant-col-lg-22{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:91.66666667%}.ant-col-lg-push-22{left:91.66666667%}.ant-col-lg-pull-22{right:91.66666667%}.ant-col-lg-offset-22{margin-left:91.66666667%}.ant-col-lg-order-22{-webkit-box-ordinal-group:23;-webkit-order:22;-ms-flex-order:22;order:22}.ant-col-lg-21{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:87.5%}.ant-col-lg-push-21{left:87.5%}.ant-col-lg-pull-21{right:87.5%}.ant-col-lg-offset-21{margin-left:87.5%}.ant-col-lg-order-21{-webkit-box-ordinal-group:22;-webkit-order:21;-ms-flex-order:21;order:21}.ant-col-lg-20{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:83.33333333%}.ant-col-lg-push-20{left:83.33333333%}.ant-col-lg-pull-20{right:83.33333333%}.ant-col-lg-offset-20{margin-left:83.33333333%}.ant-col-lg-order-20{-webkit-box-ordinal-group:21;-webkit-order:20;-ms-flex-order:20;order:20}.ant-col-lg-19{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:79.16666667%}.ant-col-lg-push-19{left:79.16666667%}.ant-col-lg-pull-19{right:79.16666667%}.ant-col-lg-offset-19{margin-left:79.16666667%}.ant-col-lg-order-19{-webkit-box-ordinal-group:20;-webkit-order:19;-ms-flex-order:19;order:19}.ant-col-lg-18{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:75%}.ant-col-lg-push-18{left:75%}.ant-col-lg-pull-18{right:75%}.ant-col-lg-offset-18{margin-left:75%}.ant-col-lg-order-18{-webkit-box-ordinal-group:19;-webkit-order:18;-ms-flex-order:18;order:18}.ant-col-lg-17{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:70.83333333%}.ant-col-lg-push-17{left:70.83333333%}.ant-col-lg-pull-17{right:70.83333333%}.ant-col-lg-offset-17{margin-left:70.83333333%}.ant-col-lg-order-17{-webkit-box-ordinal-group:18;-webkit-order:17;-ms-flex-order:17;order:17}.ant-col-lg-16{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:66.66666667%}.ant-col-lg-push-16{left:66.66666667%}.ant-col-lg-pull-16{right:66.66666667%}.ant-col-lg-offset-16{margin-left:66.66666667%}.ant-col-lg-order-16{-webkit-box-ordinal-group:17;-webkit-order:16;-ms-flex-order:16;order:16}.ant-col-lg-15{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:62.5%}.ant-col-lg-push-15{left:62.5%}.ant-col-lg-pull-15{right:62.5%}.ant-col-lg-offset-15{margin-left:62.5%}.ant-col-lg-order-15{-webkit-box-ordinal-group:16;-webkit-order:15;-ms-flex-order:15;order:15}.ant-col-lg-14{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:58.33333333%}.ant-col-lg-push-14{left:58.33333333%}.ant-col-lg-pull-14{right:58.33333333%}.ant-col-lg-offset-14{margin-left:58.33333333%}.ant-col-lg-order-14{-webkit-box-ordinal-group:15;-webkit-order:14;-ms-flex-order:14;order:14}.ant-col-lg-13{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:54.16666667%}.ant-col-lg-push-13{left:54.16666667%}.ant-col-lg-pull-13{right:54.16666667%}.ant-col-lg-offset-13{margin-left:54.16666667%}.ant-col-lg-order-13{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.ant-col-lg-12{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.ant-col-lg-push-12{left:50%}.ant-col-lg-pull-12{right:50%}.ant-col-lg-offset-12{margin-left:50%}.ant-col-lg-order-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.ant-col-lg-11{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:45.83333333%}.ant-col-lg-push-11{left:45.83333333%}.ant-col-lg-pull-11{right:45.83333333%}.ant-col-lg-offset-11{margin-left:45.83333333%}.ant-col-lg-order-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.ant-col-lg-10{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:41.66666667%}.ant-col-lg-push-10{left:41.66666667%}.ant-col-lg-pull-10{right:41.66666667%}.ant-col-lg-offset-10{margin-left:41.66666667%}.ant-col-lg-order-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.ant-col-lg-9{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:37.5%}.ant-col-lg-push-9{left:37.5%}.ant-col-lg-pull-9{right:37.5%}.ant-col-lg-offset-9{margin-left:37.5%}.ant-col-lg-order-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.ant-col-lg-8{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:33.33333333%}.ant-col-lg-push-8{left:33.33333333%}.ant-col-lg-pull-8{right:33.33333333%}.ant-col-lg-offset-8{margin-left:33.33333333%}.ant-col-lg-order-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.ant-col-lg-7{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:29.16666667%}.ant-col-lg-push-7{left:29.16666667%}.ant-col-lg-pull-7{right:29.16666667%}.ant-col-lg-offset-7{margin-left:29.16666667%}.ant-col-lg-order-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.ant-col-lg-6{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:25%}.ant-col-lg-push-6{left:25%}.ant-col-lg-pull-6{right:25%}.ant-col-lg-offset-6{margin-left:25%}.ant-col-lg-order-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.ant-col-lg-5{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:20.83333333%}.ant-col-lg-push-5{left:20.83333333%}.ant-col-lg-pull-5{right:20.83333333%}.ant-col-lg-offset-5{margin-left:20.83333333%}.ant-col-lg-order-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.ant-col-lg-4{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:16.66666667%}.ant-col-lg-push-4{left:16.66666667%}.ant-col-lg-pull-4{right:16.66666667%}.ant-col-lg-offset-4{margin-left:16.66666667%}.ant-col-lg-order-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.ant-col-lg-3{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:12.5%}.ant-col-lg-push-3{left:12.5%}.ant-col-lg-pull-3{right:12.5%}.ant-col-lg-offset-3{margin-left:12.5%}.ant-col-lg-order-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.ant-col-lg-2{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:8.33333333%}.ant-col-lg-push-2{left:8.33333333%}.ant-col-lg-pull-2{right:8.33333333%}.ant-col-lg-offset-2{margin-left:8.33333333%}.ant-col-lg-order-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.ant-col-lg-1{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:4.16666667%}.ant-col-lg-push-1{left:4.16666667%}.ant-col-lg-pull-1{right:4.16666667%}.ant-col-lg-offset-1{margin-left:4.16666667%}.ant-col-lg-order-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.ant-col-lg-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-lg-push-0{left:auto}.ant-col-lg-pull-0{right:auto}.ant-col-lg-offset-0{margin-left:0}.ant-col-lg-order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}}@media (min-width:1200px){.ant-col-xl-1,.ant-col-xl-2,.ant-col-xl-3,.ant-col-xl-4,.ant-col-xl-5,.ant-col-xl-6,.ant-col-xl-7,.ant-col-xl-8,.ant-col-xl-9,.ant-col-xl-10,.ant-col-xl-11,.ant-col-xl-12,.ant-col-xl-13,.ant-col-xl-14,.ant-col-xl-15,.ant-col-xl-16,.ant-col-xl-17,.ant-col-xl-18,.ant-col-xl-19,.ant-col-xl-20,.ant-col-xl-21,.ant-col-xl-22,.ant-col-xl-23,.ant-col-xl-24{float:left;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.ant-col-xl-24{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.ant-col-xl-push-24{left:100%}.ant-col-xl-pull-24{right:100%}.ant-col-xl-offset-24{margin-left:100%}.ant-col-xl-order-24{-webkit-box-ordinal-group:25;-webkit-order:24;-ms-flex-order:24;order:24}.ant-col-xl-23{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:95.83333333%}.ant-col-xl-push-23{left:95.83333333%}.ant-col-xl-pull-23{right:95.83333333%}.ant-col-xl-offset-23{margin-left:95.83333333%}.ant-col-xl-order-23{-webkit-box-ordinal-group:24;-webkit-order:23;-ms-flex-order:23;order:23}.ant-col-xl-22{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:91.66666667%}.ant-col-xl-push-22{left:91.66666667%}.ant-col-xl-pull-22{right:91.66666667%}.ant-col-xl-offset-22{margin-left:91.66666667%}.ant-col-xl-order-22{-webkit-box-ordinal-group:23;-webkit-order:22;-ms-flex-order:22;order:22}.ant-col-xl-21{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:87.5%}.ant-col-xl-push-21{left:87.5%}.ant-col-xl-pull-21{right:87.5%}.ant-col-xl-offset-21{margin-left:87.5%}.ant-col-xl-order-21{-webkit-box-ordinal-group:22;-webkit-order:21;-ms-flex-order:21;order:21}.ant-col-xl-20{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:83.33333333%}.ant-col-xl-push-20{left:83.33333333%}.ant-col-xl-pull-20{right:83.33333333%}.ant-col-xl-offset-20{margin-left:83.33333333%}.ant-col-xl-order-20{-webkit-box-ordinal-group:21;-webkit-order:20;-ms-flex-order:20;order:20}.ant-col-xl-19{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:79.16666667%}.ant-col-xl-push-19{left:79.16666667%}.ant-col-xl-pull-19{right:79.16666667%}.ant-col-xl-offset-19{margin-left:79.16666667%}.ant-col-xl-order-19{-webkit-box-ordinal-group:20;-webkit-order:19;-ms-flex-order:19;order:19}.ant-col-xl-18{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:75%}.ant-col-xl-push-18{left:75%}.ant-col-xl-pull-18{right:75%}.ant-col-xl-offset-18{margin-left:75%}.ant-col-xl-order-18{-webkit-box-ordinal-group:19;-webkit-order:18;-ms-flex-order:18;order:18}.ant-col-xl-17{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:70.83333333%}.ant-col-xl-push-17{left:70.83333333%}.ant-col-xl-pull-17{right:70.83333333%}.ant-col-xl-offset-17{margin-left:70.83333333%}.ant-col-xl-order-17{-webkit-box-ordinal-group:18;-webkit-order:17;-ms-flex-order:17;order:17}.ant-col-xl-16{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:66.66666667%}.ant-col-xl-push-16{left:66.66666667%}.ant-col-xl-pull-16{right:66.66666667%}.ant-col-xl-offset-16{margin-left:66.66666667%}.ant-col-xl-order-16{-webkit-box-ordinal-group:17;-webkit-order:16;-ms-flex-order:16;order:16}.ant-col-xl-15{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:62.5%}.ant-col-xl-push-15{left:62.5%}.ant-col-xl-pull-15{right:62.5%}.ant-col-xl-offset-15{margin-left:62.5%}.ant-col-xl-order-15{-webkit-box-ordinal-group:16;-webkit-order:15;-ms-flex-order:15;order:15}.ant-col-xl-14{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:58.33333333%}.ant-col-xl-push-14{left:58.33333333%}.ant-col-xl-pull-14{right:58.33333333%}.ant-col-xl-offset-14{margin-left:58.33333333%}.ant-col-xl-order-14{-webkit-box-ordinal-group:15;-webkit-order:14;-ms-flex-order:14;order:14}.ant-col-xl-13{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:54.16666667%}.ant-col-xl-push-13{left:54.16666667%}.ant-col-xl-pull-13{right:54.16666667%}.ant-col-xl-offset-13{margin-left:54.16666667%}.ant-col-xl-order-13{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.ant-col-xl-12{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.ant-col-xl-push-12{left:50%}.ant-col-xl-pull-12{right:50%}.ant-col-xl-offset-12{margin-left:50%}.ant-col-xl-order-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.ant-col-xl-11{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:45.83333333%}.ant-col-xl-push-11{left:45.83333333%}.ant-col-xl-pull-11{right:45.83333333%}.ant-col-xl-offset-11{margin-left:45.83333333%}.ant-col-xl-order-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.ant-col-xl-10{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:41.66666667%}.ant-col-xl-push-10{left:41.66666667%}.ant-col-xl-pull-10{right:41.66666667%}.ant-col-xl-offset-10{margin-left:41.66666667%}.ant-col-xl-order-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.ant-col-xl-9{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:37.5%}.ant-col-xl-push-9{left:37.5%}.ant-col-xl-pull-9{right:37.5%}.ant-col-xl-offset-9{margin-left:37.5%}.ant-col-xl-order-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.ant-col-xl-8{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:33.33333333%}.ant-col-xl-push-8{left:33.33333333%}.ant-col-xl-pull-8{right:33.33333333%}.ant-col-xl-offset-8{margin-left:33.33333333%}.ant-col-xl-order-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.ant-col-xl-7{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:29.16666667%}.ant-col-xl-push-7{left:29.16666667%}.ant-col-xl-pull-7{right:29.16666667%}.ant-col-xl-offset-7{margin-left:29.16666667%}.ant-col-xl-order-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.ant-col-xl-6{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:25%}.ant-col-xl-push-6{left:25%}.ant-col-xl-pull-6{right:25%}.ant-col-xl-offset-6{margin-left:25%}.ant-col-xl-order-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.ant-col-xl-5{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:20.83333333%}.ant-col-xl-push-5{left:20.83333333%}.ant-col-xl-pull-5{right:20.83333333%}.ant-col-xl-offset-5{margin-left:20.83333333%}.ant-col-xl-order-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.ant-col-xl-4{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:16.66666667%}.ant-col-xl-push-4{left:16.66666667%}.ant-col-xl-pull-4{right:16.66666667%}.ant-col-xl-offset-4{margin-left:16.66666667%}.ant-col-xl-order-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.ant-col-xl-3{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:12.5%}.ant-col-xl-push-3{left:12.5%}.ant-col-xl-pull-3{right:12.5%}.ant-col-xl-offset-3{margin-left:12.5%}.ant-col-xl-order-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.ant-col-xl-2{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:8.33333333%}.ant-col-xl-push-2{left:8.33333333%}.ant-col-xl-pull-2{right:8.33333333%}.ant-col-xl-offset-2{margin-left:8.33333333%}.ant-col-xl-order-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.ant-col-xl-1{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:4.16666667%}.ant-col-xl-push-1{left:4.16666667%}.ant-col-xl-pull-1{right:4.16666667%}.ant-col-xl-offset-1{margin-left:4.16666667%}.ant-col-xl-order-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.ant-col-xl-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-xl-push-0{left:auto}.ant-col-xl-pull-0{right:auto}.ant-col-xl-offset-0{margin-left:0}.ant-col-xl-order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}}@media (min-width:1600px){.ant-col-xxl-1,.ant-col-xxl-2,.ant-col-xxl-3,.ant-col-xxl-4,.ant-col-xxl-5,.ant-col-xxl-6,.ant-col-xxl-7,.ant-col-xxl-8,.ant-col-xxl-9,.ant-col-xxl-10,.ant-col-xxl-11,.ant-col-xxl-12,.ant-col-xxl-13,.ant-col-xxl-14,.ant-col-xxl-15,.ant-col-xxl-16,.ant-col-xxl-17,.ant-col-xxl-18,.ant-col-xxl-19,.ant-col-xxl-20,.ant-col-xxl-21,.ant-col-xxl-22,.ant-col-xxl-23,.ant-col-xxl-24{float:left;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.ant-col-xxl-24{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.ant-col-xxl-push-24{left:100%}.ant-col-xxl-pull-24{right:100%}.ant-col-xxl-offset-24{margin-left:100%}.ant-col-xxl-order-24{-webkit-box-ordinal-group:25;-webkit-order:24;-ms-flex-order:24;order:24}.ant-col-xxl-23{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:95.83333333%}.ant-col-xxl-push-23{left:95.83333333%}.ant-col-xxl-pull-23{right:95.83333333%}.ant-col-xxl-offset-23{margin-left:95.83333333%}.ant-col-xxl-order-23{-webkit-box-ordinal-group:24;-webkit-order:23;-ms-flex-order:23;order:23}.ant-col-xxl-22{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:91.66666667%}.ant-col-xxl-push-22{left:91.66666667%}.ant-col-xxl-pull-22{right:91.66666667%}.ant-col-xxl-offset-22{margin-left:91.66666667%}.ant-col-xxl-order-22{-webkit-box-ordinal-group:23;-webkit-order:22;-ms-flex-order:22;order:22}.ant-col-xxl-21{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:87.5%}.ant-col-xxl-push-21{left:87.5%}.ant-col-xxl-pull-21{right:87.5%}.ant-col-xxl-offset-21{margin-left:87.5%}.ant-col-xxl-order-21{-webkit-box-ordinal-group:22;-webkit-order:21;-ms-flex-order:21;order:21}.ant-col-xxl-20{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:83.33333333%}.ant-col-xxl-push-20{left:83.33333333%}.ant-col-xxl-pull-20{right:83.33333333%}.ant-col-xxl-offset-20{margin-left:83.33333333%}.ant-col-xxl-order-20{-webkit-box-ordinal-group:21;-webkit-order:20;-ms-flex-order:20;order:20}.ant-col-xxl-19{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:79.16666667%}.ant-col-xxl-push-19{left:79.16666667%}.ant-col-xxl-pull-19{right:79.16666667%}.ant-col-xxl-offset-19{margin-left:79.16666667%}.ant-col-xxl-order-19{-webkit-box-ordinal-group:20;-webkit-order:19;-ms-flex-order:19;order:19}.ant-col-xxl-18{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:75%}.ant-col-xxl-push-18{left:75%}.ant-col-xxl-pull-18{right:75%}.ant-col-xxl-offset-18{margin-left:75%}.ant-col-xxl-order-18{-webkit-box-ordinal-group:19;-webkit-order:18;-ms-flex-order:18;order:18}.ant-col-xxl-17{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:70.83333333%}.ant-col-xxl-push-17{left:70.83333333%}.ant-col-xxl-pull-17{right:70.83333333%}.ant-col-xxl-offset-17{margin-left:70.83333333%}.ant-col-xxl-order-17{-webkit-box-ordinal-group:18;-webkit-order:17;-ms-flex-order:17;order:17}.ant-col-xxl-16{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:66.66666667%}.ant-col-xxl-push-16{left:66.66666667%}.ant-col-xxl-pull-16{right:66.66666667%}.ant-col-xxl-offset-16{margin-left:66.66666667%}.ant-col-xxl-order-16{-webkit-box-ordinal-group:17;-webkit-order:16;-ms-flex-order:16;order:16}.ant-col-xxl-15{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:62.5%}.ant-col-xxl-push-15{left:62.5%}.ant-col-xxl-pull-15{right:62.5%}.ant-col-xxl-offset-15{margin-left:62.5%}.ant-col-xxl-order-15{-webkit-box-ordinal-group:16;-webkit-order:15;-ms-flex-order:15;order:15}.ant-col-xxl-14{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:58.33333333%}.ant-col-xxl-push-14{left:58.33333333%}.ant-col-xxl-pull-14{right:58.33333333%}.ant-col-xxl-offset-14{margin-left:58.33333333%}.ant-col-xxl-order-14{-webkit-box-ordinal-group:15;-webkit-order:14;-ms-flex-order:14;order:14}.ant-col-xxl-13{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:54.16666667%}.ant-col-xxl-push-13{left:54.16666667%}.ant-col-xxl-pull-13{right:54.16666667%}.ant-col-xxl-offset-13{margin-left:54.16666667%}.ant-col-xxl-order-13{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.ant-col-xxl-12{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.ant-col-xxl-push-12{left:50%}.ant-col-xxl-pull-12{right:50%}.ant-col-xxl-offset-12{margin-left:50%}.ant-col-xxl-order-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.ant-col-xxl-11{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:45.83333333%}.ant-col-xxl-push-11{left:45.83333333%}.ant-col-xxl-pull-11{right:45.83333333%}.ant-col-xxl-offset-11{margin-left:45.83333333%}.ant-col-xxl-order-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.ant-col-xxl-10{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:41.66666667%}.ant-col-xxl-push-10{left:41.66666667%}.ant-col-xxl-pull-10{right:41.66666667%}.ant-col-xxl-offset-10{margin-left:41.66666667%}.ant-col-xxl-order-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.ant-col-xxl-9{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:37.5%}.ant-col-xxl-push-9{left:37.5%}.ant-col-xxl-pull-9{right:37.5%}.ant-col-xxl-offset-9{margin-left:37.5%}.ant-col-xxl-order-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.ant-col-xxl-8{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:33.33333333%}.ant-col-xxl-push-8{left:33.33333333%}.ant-col-xxl-pull-8{right:33.33333333%}.ant-col-xxl-offset-8{margin-left:33.33333333%}.ant-col-xxl-order-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.ant-col-xxl-7{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:29.16666667%}.ant-col-xxl-push-7{left:29.16666667%}.ant-col-xxl-pull-7{right:29.16666667%}.ant-col-xxl-offset-7{margin-left:29.16666667%}.ant-col-xxl-order-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.ant-col-xxl-6{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:25%}.ant-col-xxl-push-6{left:25%}.ant-col-xxl-pull-6{right:25%}.ant-col-xxl-offset-6{margin-left:25%}.ant-col-xxl-order-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.ant-col-xxl-5{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:20.83333333%}.ant-col-xxl-push-5{left:20.83333333%}.ant-col-xxl-pull-5{right:20.83333333%}.ant-col-xxl-offset-5{margin-left:20.83333333%}.ant-col-xxl-order-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.ant-col-xxl-4{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:16.66666667%}.ant-col-xxl-push-4{left:16.66666667%}.ant-col-xxl-pull-4{right:16.66666667%}.ant-col-xxl-offset-4{margin-left:16.66666667%}.ant-col-xxl-order-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.ant-col-xxl-3{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:12.5%}.ant-col-xxl-push-3{left:12.5%}.ant-col-xxl-pull-3{right:12.5%}.ant-col-xxl-offset-3{margin-left:12.5%}.ant-col-xxl-order-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.ant-col-xxl-2{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:8.33333333%}.ant-col-xxl-push-2{left:8.33333333%}.ant-col-xxl-pull-2{right:8.33333333%}.ant-col-xxl-offset-2{margin-left:8.33333333%}.ant-col-xxl-order-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.ant-col-xxl-1{display:block;-webkit-box-sizing:border-box;box-sizing:border-box;width:4.16666667%}.ant-col-xxl-push-1{left:4.16666667%}.ant-col-xxl-pull-1{right:4.16666667%}.ant-col-xxl-offset-1{margin-left:4.16666667%}.ant-col-xxl-order-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.ant-col-xxl-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-xxl-push-0{left:auto}.ant-col-xxl-pull-0{right:auto}.ant-col-xxl-offset-0{margin-left:0}.ant-col-xxl-order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}}.ant-collapse{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;background-color:#fafafa;border-radius:4px;border:1px solid #d9d9d9;border-bottom:0}.ant-collapse>.ant-collapse-item{border-bottom:1px solid #d9d9d9}.ant-collapse>.ant-collapse-item:last-child,.ant-collapse>.ant-collapse-item:last-child>.ant-collapse-header{border-radius:0 0 4px 4px}.ant-collapse>.ant-collapse-item>.ant-collapse-header{line-height:22px;padding:12px 0 12px 40px;color:rgba(0,0,0,.85);cursor:pointer;position:relative;-webkit-transition:all .3s;transition:all .3s}.ant-collapse>.ant-collapse-item>.ant-collapse-header .arrow{font-style:normal;vertical-align:-.125em;text-align:center;text-transform:none;line-height:0;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:12px;position:absolute;display:inline-block;line-height:46px;vertical-align:top;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);left:16px}.ant-collapse>.ant-collapse-item>.ant-collapse-header .arrow>*{line-height:1}.ant-collapse>.ant-collapse-item>.ant-collapse-header .arrow svg{display:inline-block}.ant-collapse>.ant-collapse-item>.ant-collapse-header .arrow:before{display:none}.ant-collapse>.ant-collapse-item>.ant-collapse-header .arrow .ant-collapse>.ant-collapse-item>.ant-collapse-header .arrow-icon{display:block}.ant-collapse>.ant-collapse-item>.ant-collapse-header .arrow svg{-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .24s;transition:-webkit-transform .24s;transition:transform .24s;transition:transform .24s,-webkit-transform .24s}.ant-collapse>.ant-collapse-item>.ant-collapse-header:focus{outline:none}.ant-collapse>.ant-collapse-item.ant-collapse-no-arrow>.ant-collapse-header{padding-left:12px}.ant-collapse-anim-active{-webkit-transition:height .2s cubic-bezier(.215,.61,.355,1);transition:height .2s cubic-bezier(.215,.61,.355,1)}.ant-collapse-content{overflow:hidden;color:rgba(0,0,0,.65);background-color:#fff;border-top:1px solid #d9d9d9}.ant-collapse-content>.ant-collapse-content-box{padding:16px}.ant-collapse-content-inactive{display:none}.ant-collapse-item:last-child>.ant-collapse-content{border-radius:0 0 4px 4px}.ant-collapse>.ant-collapse-item>.ant-collapse-header[aria-expanded=true] .anticon-right svg{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.ant-collapse-borderless{background-color:#fff;border:0}.ant-collapse-borderless>.ant-collapse-item{border-bottom:1px solid #d9d9d9}.ant-collapse-borderless>.ant-collapse-item:last-child,.ant-collapse-borderless>.ant-collapse-item:last-child .ant-collapse-header{border-radius:0}.ant-collapse-borderless>.ant-collapse-item>.ant-collapse-content{background-color:transparent;border-top:0}.ant-collapse-borderless>.ant-collapse-item>.ant-collapse-content>.ant-collapse-content-box{padding-top:4px}.ant-collapse .ant-collapse-item-disabled>.ant-collapse-header,.ant-collapse .ant-collapse-item-disabled>.ant-collapse-header>.arrow{cursor:not-allowed;color:rgba(0,0,0,.25)}.ant-calendar-picker-container{font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;position:absolute;z-index:1050}.ant-calendar-picker-container.slide-up-appear.slide-up-appear-active.ant-calendar-picker-container-placement-topLeft,.ant-calendar-picker-container.slide-up-appear.slide-up-appear-active.ant-calendar-picker-container-placement-topRight,.ant-calendar-picker-container.slide-up-enter.slide-up-enter-active.ant-calendar-picker-container-placement-topLeft,.ant-calendar-picker-container.slide-up-enter.slide-up-enter-active.ant-calendar-picker-container-placement-topRight{-webkit-animation-name:antSlideDownIn;animation-name:antSlideDownIn}.ant-calendar-picker-container.slide-up-appear.slide-up-appear-active.ant-calendar-picker-container-placement-bottomLeft,.ant-calendar-picker-container.slide-up-appear.slide-up-appear-active.ant-calendar-picker-container-placement-bottomRight,.ant-calendar-picker-container.slide-up-enter.slide-up-enter-active.ant-calendar-picker-container-placement-bottomLeft,.ant-calendar-picker-container.slide-up-enter.slide-up-enter-active.ant-calendar-picker-container-placement-bottomRight{-webkit-animation-name:antSlideUpIn;animation-name:antSlideUpIn}.ant-calendar-picker-container.slide-up-leave.slide-up-leave-active.ant-calendar-picker-container-placement-topLeft,.ant-calendar-picker-container.slide-up-leave.slide-up-leave-active.ant-calendar-picker-container-placement-topRight{-webkit-animation-name:antSlideDownOut;animation-name:antSlideDownOut}.ant-calendar-picker-container.slide-up-leave.slide-up-leave-active.ant-calendar-picker-container-placement-bottomLeft,.ant-calendar-picker-container.slide-up-leave.slide-up-leave-active.ant-calendar-picker-container-placement-bottomRight{-webkit-animation-name:antSlideUpOut;animation-name:antSlideUpOut}.ant-calendar-picker{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;position:relative;display:inline-block;outline:none;-webkit-transition:opacity .3s;transition:opacity .3s}.ant-calendar-picker-input{outline:none}.ant-calendar-picker:hover .ant-calendar-picker-input:not(.ant-input-disabled){border-color:#1890ff}.ant-calendar-picker:focus .ant-calendar-picker-input:not(.ant-input-disabled){border-color:#40a9ff;outline:0;-webkit-box-shadow:0 0 0 2px rgba(24,144,255,.2);box-shadow:0 0 0 2px rgba(24,144,255,.2);border-right-width:1px!important}.ant-calendar-picker-clear,.ant-calendar-picker-icon{position:absolute;width:14px;height:14px;right:12px;top:50%;margin-top:-7px;line-height:14px;font-size:12px;-webkit-transition:all .3s;transition:all .3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-calendar-picker-clear{opacity:0;z-index:1;font-size:14px;color:rgba(0,0,0,.25);background:#fff;pointer-events:none;cursor:pointer}.ant-calendar-picker-clear:hover{color:rgba(0,0,0,.45)}.ant-calendar-picker:hover .ant-calendar-picker-clear{opacity:1;pointer-events:auto}.ant-calendar-picker-icon{font-family:anticon;font-size:14px;color:rgba(0,0,0,.25);display:inline-block;line-height:1}.ant-calendar-picker-small .ant-calendar-picker-clear,.ant-calendar-picker-small .ant-calendar-picker-icon{right:8px}.ant-calendar{position:relative;outline:none;width:280px;border:1px solid #fff;list-style:none;font-size:14px;text-align:left;background-color:#fff;border-radius:4px;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.15);box-shadow:0 2px 8px rgba(0,0,0,.15);background-clip:padding-box;line-height:1.5}.ant-calendar-input-wrap{height:34px;padding:6px 10px;border-bottom:1px solid #e8e8e8}.ant-calendar-input{border:0;width:100%;cursor:auto;outline:0;height:22px;color:rgba(0,0,0,.65);background:#fff}.ant-calendar-input::-moz-placeholder{color:#bfbfbf;opacity:1}.ant-calendar-input:-ms-input-placeholder{color:#bfbfbf}.ant-calendar-input::-webkit-input-placeholder{color:#bfbfbf}.ant-calendar-week-number{width:286px}.ant-calendar-week-number-cell{text-align:center}.ant-calendar-header{height:40px;line-height:40px;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-bottom:1px solid #e8e8e8}.ant-calendar-header a:hover{color:#40a9ff}.ant-calendar-header .ant-calendar-century-select,.ant-calendar-header .ant-calendar-decade-select,.ant-calendar-header .ant-calendar-month-select,.ant-calendar-header .ant-calendar-year-select{padding:0 2px;font-weight:500;display:inline-block;color:rgba(0,0,0,.85);line-height:40px}.ant-calendar-header .ant-calendar-century-select-arrow,.ant-calendar-header .ant-calendar-decade-select-arrow,.ant-calendar-header .ant-calendar-month-select-arrow,.ant-calendar-header .ant-calendar-year-select-arrow{display:none}.ant-calendar-header .ant-calendar-next-century-btn,.ant-calendar-header .ant-calendar-next-decade-btn,.ant-calendar-header .ant-calendar-next-month-btn,.ant-calendar-header .ant-calendar-next-year-btn,.ant-calendar-header .ant-calendar-prev-century-btn,.ant-calendar-header .ant-calendar-prev-decade-btn,.ant-calendar-header .ant-calendar-prev-month-btn,.ant-calendar-header .ant-calendar-prev-year-btn{position:absolute;top:0;color:rgba(0,0,0,.45);font-family:Arial,Hiragino Sans GB,Microsoft Yahei,Microsoft Sans Serif,sans-serif;padding:0 5px;font-size:16px;display:inline-block;line-height:40px}.ant-calendar-header .ant-calendar-prev-century-btn,.ant-calendar-header .ant-calendar-prev-decade-btn,.ant-calendar-header .ant-calendar-prev-year-btn{left:7px}.ant-calendar-header .ant-calendar-prev-century-btn:after,.ant-calendar-header .ant-calendar-prev-decade-btn:after,.ant-calendar-header .ant-calendar-prev-year-btn:after{content:"\AB"}.ant-calendar-header .ant-calendar-next-century-btn,.ant-calendar-header .ant-calendar-next-decade-btn,.ant-calendar-header .ant-calendar-next-year-btn{right:7px}.ant-calendar-header .ant-calendar-next-century-btn:after,.ant-calendar-header .ant-calendar-next-decade-btn:after,.ant-calendar-header .ant-calendar-next-year-btn:after{content:"\BB"}.ant-calendar-header .ant-calendar-prev-month-btn{left:29px}.ant-calendar-header .ant-calendar-prev-month-btn:after{content:"\2039"}.ant-calendar-header .ant-calendar-next-month-btn{right:29px}.ant-calendar-header .ant-calendar-next-month-btn:after{content:"\203A"}.ant-calendar-body{padding:8px 12px}.ant-calendar table{border-collapse:collapse;max-width:100%;background-color:transparent;width:100%}.ant-calendar table,.ant-calendar td,.ant-calendar th{border:0;text-align:center}.ant-calendar-calendar-table{border-spacing:0;margin-bottom:0}.ant-calendar-column-header{line-height:18px;width:33px;padding:6px 0;text-align:center}.ant-calendar-column-header .ant-calendar-column-header-inner{display:block;font-weight:400}.ant-calendar-week-number-header .ant-calendar-column-header-inner{display:none}.ant-calendar-cell{padding:3px 0;height:30px}.ant-calendar-date{display:block;margin:0 auto;color:rgba(0,0,0,.65);border-radius:2px;width:24px;height:24px;line-height:22px;border:1px solid transparent;padding:0;background:transparent;text-align:center;-webkit-transition:background .3s ease;transition:background .3s ease}.ant-calendar-date-panel{position:relative}.ant-calendar-date:hover{background:#e6f7ff;cursor:pointer}.ant-calendar-date:active{color:#fff;background:#40a9ff}.ant-calendar-today .ant-calendar-date{border-color:#1890ff;font-weight:700;color:#1890ff}.ant-calendar-last-month-cell .ant-calendar-date,.ant-calendar-next-month-btn-day .ant-calendar-date{color:rgba(0,0,0,.25)}.ant-calendar-selected-day .ant-calendar-date{background:#d1e9ff}.ant-calendar-selected-date .ant-calendar-date,.ant-calendar-selected-end-date .ant-calendar-date,.ant-calendar-selected-start-date .ant-calendar-date{background:#1890ff;color:#fff;border:1px solid transparent}.ant-calendar-selected-date .ant-calendar-date:hover,.ant-calendar-selected-end-date .ant-calendar-date:hover,.ant-calendar-selected-start-date .ant-calendar-date:hover{background:#1890ff}.ant-calendar-disabled-cell .ant-calendar-date{cursor:not-allowed;color:#bcbcbc;background:#f5f5f5;border-radius:0;width:auto;border:1px solid transparent}.ant-calendar-disabled-cell .ant-calendar-date:hover{background:#f5f5f5}.ant-calendar-disabled-cell.ant-calendar-today .ant-calendar-date{position:relative;margin-right:5px;padding-left:5px}.ant-calendar-disabled-cell.ant-calendar-today .ant-calendar-date:before{content:" ";position:absolute;top:-1px;left:5px;width:24px;height:24px;border:1px solid #bcbcbc;border-radius:2px}.ant-calendar-disabled-cell-first-of-row .ant-calendar-date{border-top-left-radius:4px;border-bottom-left-radius:4px}.ant-calendar-disabled-cell-last-of-row .ant-calendar-date{border-top-right-radius:4px;border-bottom-right-radius:4px}.ant-calendar-footer{border-top:1px solid #e8e8e8;line-height:38px;padding:0 12px}.ant-calendar-footer:empty{border-top:0}.ant-calendar-footer-btn{text-align:center;display:block}.ant-calendar-footer-extra{text-align:left}.ant-calendar .ant-calendar-clear-btn,.ant-calendar .ant-calendar-today-btn{display:inline-block;text-align:center;margin:0 0 0 8px}.ant-calendar .ant-calendar-clear-btn-disabled,.ant-calendar .ant-calendar-today-btn-disabled{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-calendar .ant-calendar-clear-btn:only-child,.ant-calendar .ant-calendar-today-btn:only-child{margin:0}.ant-calendar .ant-calendar-clear-btn{display:none;position:absolute;right:5px;text-indent:-76px;overflow:hidden;width:20px;height:20px;text-align:center;line-height:20px;top:7px;margin:0}.ant-calendar .ant-calendar-clear-btn:after{font-size:14px;color:rgba(0,0,0,.25);display:inline-block;line-height:1;width:20px;text-indent:43px;-webkit-transition:color .3s ease;transition:color .3s ease}.ant-calendar .ant-calendar-clear-btn:hover:after{color:rgba(0,0,0,.45)}.ant-calendar .ant-calendar-ok-btn{display:inline-block;font-weight:400;text-align:center;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:0 15px;height:32px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);position:relative;-webkit-box-shadow:0 2px 0 rgba(0,0,0,.015);box-shadow:0 2px 0 rgba(0,0,0,.015);color:#fff;background-color:#1890ff;border-color:#1890ff;text-shadow:0 -1px 0 rgba(0,0,0,.12);-webkit-box-shadow:0 2px 0 rgba(0,0,0,.035);box-shadow:0 2px 0 rgba(0,0,0,.035);padding:0 7px;font-size:14px;border-radius:4px;height:24px;line-height:22px}.ant-calendar .ant-calendar-ok-btn>.anticon{line-height:1}.ant-calendar .ant-calendar-ok-btn,.ant-calendar .ant-calendar-ok-btn:active,.ant-calendar .ant-calendar-ok-btn:focus{outline:0}.ant-calendar .ant-calendar-ok-btn:not([disabled]):hover{text-decoration:none}.ant-calendar .ant-calendar-ok-btn:not([disabled]):active{outline:0;-webkit-transition:none;transition:none;-webkit-box-shadow:none;box-shadow:none}.ant-calendar .ant-calendar-ok-btn.disabled,.ant-calendar .ant-calendar-ok-btn[disabled]{cursor:not-allowed}.ant-calendar .ant-calendar-ok-btn.disabled>*,.ant-calendar .ant-calendar-ok-btn[disabled]>*{pointer-events:none}.ant-calendar .ant-calendar-ok-btn-lg{padding:0 15px;font-size:16px;border-radius:4px;height:40px}.ant-calendar .ant-calendar-ok-btn-sm{padding:0 7px;font-size:14px;border-radius:4px;height:24px}.ant-calendar .ant-calendar-ok-btn>a:only-child{color:currentColor}.ant-calendar .ant-calendar-ok-btn>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-calendar .ant-calendar-ok-btn:focus,.ant-calendar .ant-calendar-ok-btn:hover{color:#fff;background-color:#40a9ff;border-color:#40a9ff}.ant-calendar .ant-calendar-ok-btn:focus>a:only-child,.ant-calendar .ant-calendar-ok-btn:hover>a:only-child{color:currentColor}.ant-calendar .ant-calendar-ok-btn:focus>a:only-child:after,.ant-calendar .ant-calendar-ok-btn:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-calendar .ant-calendar-ok-btn.active,.ant-calendar .ant-calendar-ok-btn:active{color:#fff;background-color:#096dd9;border-color:#096dd9}.ant-calendar .ant-calendar-ok-btn.active>a:only-child,.ant-calendar .ant-calendar-ok-btn:active>a:only-child{color:currentColor}.ant-calendar .ant-calendar-ok-btn.active>a:only-child:after,.ant-calendar .ant-calendar-ok-btn:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-calendar .ant-calendar-ok-btn.disabled,.ant-calendar .ant-calendar-ok-btn.disabled.active,.ant-calendar .ant-calendar-ok-btn.disabled:active,.ant-calendar .ant-calendar-ok-btn.disabled:focus,.ant-calendar .ant-calendar-ok-btn.disabled:hover,.ant-calendar .ant-calendar-ok-btn[disabled],.ant-calendar .ant-calendar-ok-btn[disabled].active,.ant-calendar .ant-calendar-ok-btn[disabled]:active,.ant-calendar .ant-calendar-ok-btn[disabled]:focus,.ant-calendar .ant-calendar-ok-btn[disabled]:hover{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;text-shadow:none;-webkit-box-shadow:none;box-shadow:none}.ant-calendar .ant-calendar-ok-btn.disabled.active>a:only-child,.ant-calendar .ant-calendar-ok-btn.disabled:active>a:only-child,.ant-calendar .ant-calendar-ok-btn.disabled:focus>a:only-child,.ant-calendar .ant-calendar-ok-btn.disabled:hover>a:only-child,.ant-calendar .ant-calendar-ok-btn.disabled>a:only-child,.ant-calendar .ant-calendar-ok-btn[disabled].active>a:only-child,.ant-calendar .ant-calendar-ok-btn[disabled]:active>a:only-child,.ant-calendar .ant-calendar-ok-btn[disabled]:focus>a:only-child,.ant-calendar .ant-calendar-ok-btn[disabled]:hover>a:only-child,.ant-calendar .ant-calendar-ok-btn[disabled]>a:only-child{color:currentColor}.ant-calendar .ant-calendar-ok-btn.disabled.active>a:only-child:after,.ant-calendar .ant-calendar-ok-btn.disabled:active>a:only-child:after,.ant-calendar .ant-calendar-ok-btn.disabled:focus>a:only-child:after,.ant-calendar .ant-calendar-ok-btn.disabled:hover>a:only-child:after,.ant-calendar .ant-calendar-ok-btn.disabled>a:only-child:after,.ant-calendar .ant-calendar-ok-btn[disabled].active>a:only-child:after,.ant-calendar .ant-calendar-ok-btn[disabled]:active>a:only-child:after,.ant-calendar .ant-calendar-ok-btn[disabled]:focus>a:only-child:after,.ant-calendar .ant-calendar-ok-btn[disabled]:hover>a:only-child:after,.ant-calendar .ant-calendar-ok-btn[disabled]>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-calendar .ant-calendar-ok-btn-disabled{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9;cursor:not-allowed}.ant-calendar .ant-calendar-ok-btn-disabled>a:only-child{color:currentColor}.ant-calendar .ant-calendar-ok-btn-disabled>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-calendar .ant-calendar-ok-btn-disabled:hover{color:rgba(0,0,0,.25);background-color:#f5f5f5;border-color:#d9d9d9}.ant-calendar .ant-calendar-ok-btn-disabled:hover>a:only-child{color:currentColor}.ant-calendar .ant-calendar-ok-btn-disabled:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-calendar-range-picker-input{background-color:transparent;border:0;height:99%;outline:0;width:44%;text-align:center}.ant-calendar-range-picker-input::-moz-placeholder{color:#bfbfbf;opacity:1}.ant-calendar-range-picker-input:-ms-input-placeholder{color:#bfbfbf}.ant-calendar-range-picker-input::-webkit-input-placeholder{color:#bfbfbf}.ant-calendar-range-picker-input[disabled]{cursor:not-allowed}.ant-calendar-range-picker-separator{color:rgba(0,0,0,.45);width:10px;display:inline-block;height:100%;vertical-align:top}.ant-calendar-range{width:552px;overflow:hidden}.ant-calendar-range .ant-calendar-date-panel:after{content:".";display:block;height:0;clear:both;visibility:hidden}.ant-calendar-range-part{width:50%;position:relative}.ant-calendar-range-left{float:left}.ant-calendar-range-left .ant-calendar-time-picker-inner{border-right:1px solid #e8e8e8}.ant-calendar-range-right{float:right}.ant-calendar-range-right .ant-calendar-time-picker-inner{border-left:1px solid #e8e8e8}.ant-calendar-range-middle{position:absolute;left:50%;width:20px;margin-left:-132px;text-align:center;height:34px;line-height:34px;color:rgba(0,0,0,.45)}.ant-calendar-range-right .ant-calendar-date-input-wrap{margin-left:-118px}.ant-calendar-range.ant-calendar-time .ant-calendar-range-middle{margin-left:-12px}.ant-calendar-range.ant-calendar-time .ant-calendar-range-right .ant-calendar-date-input-wrap{margin-left:0}.ant-calendar-range .ant-calendar-input-wrap{position:relative;height:34px}.ant-calendar-range .ant-calendar-input,.ant-calendar-range .ant-calendar-time-picker-input{position:relative;display:inline-block;padding:4px 11px;width:100%;height:32px;font-size:14px;line-height:1.5;color:rgba(0,0,0,.65);background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:4px;-webkit-transition:all .3s;transition:all .3s;height:24px;border:0;-webkit-box-shadow:none;box-shadow:none;padding-left:0;padding-right:0}.ant-calendar-range .ant-calendar-input::-moz-placeholder,.ant-calendar-range .ant-calendar-time-picker-input::-moz-placeholder{color:#bfbfbf;opacity:1}.ant-calendar-range .ant-calendar-input:-ms-input-placeholder,.ant-calendar-range .ant-calendar-time-picker-input:-ms-input-placeholder{color:#bfbfbf}.ant-calendar-range .ant-calendar-input::-webkit-input-placeholder,.ant-calendar-range .ant-calendar-time-picker-input::-webkit-input-placeholder{color:#bfbfbf}.ant-calendar-range .ant-calendar-input:hover,.ant-calendar-range .ant-calendar-time-picker-input:hover{border-color:#40a9ff;border-right-width:1px!important}.ant-calendar-range .ant-calendar-input:focus,.ant-calendar-range .ant-calendar-time-picker-input:focus{border-color:#40a9ff;outline:0;-webkit-box-shadow:0 0 0 2px rgba(24,144,255,.2);box-shadow:0 0 0 2px rgba(24,144,255,.2);border-right-width:1px!important}.ant-calendar-range .ant-calendar-input-disabled,.ant-calendar-range .ant-calendar-time-picker-input-disabled{background-color:#f5f5f5;opacity:1;cursor:not-allowed;color:rgba(0,0,0,.25)}.ant-calendar-range .ant-calendar-input-disabled:hover,.ant-calendar-range .ant-calendar-time-picker-input-disabled:hover{border-color:#e6d8d8;border-right-width:1px!important}textarea.ant-calendar-range .ant-calendar-input,textarea.ant-calendar-range .ant-calendar-time-picker-input{max-width:100%;height:auto;vertical-align:bottom;-webkit-transition:all .3s,height 0s;transition:all .3s,height 0s;min-height:32px}.ant-calendar-range .ant-calendar-input-lg,.ant-calendar-range .ant-calendar-time-picker-input-lg{padding:6px 11px;height:40px;font-size:16px}.ant-calendar-range .ant-calendar-input-sm,.ant-calendar-range .ant-calendar-time-picker-input-sm{padding:1px 7px;height:24px}.ant-calendar-range .ant-calendar-input:focus,.ant-calendar-range .ant-calendar-time-picker-input:focus{-webkit-box-shadow:none;box-shadow:none}.ant-calendar-range .ant-calendar-time-picker-icon{display:none}.ant-calendar-range.ant-calendar-week-number{width:574px}.ant-calendar-range.ant-calendar-week-number .ant-calendar-range-part{width:286px}.ant-calendar-range .ant-calendar-decade-panel,.ant-calendar-range .ant-calendar-month-panel,.ant-calendar-range .ant-calendar-year-panel{top:34px}.ant-calendar-range .ant-calendar-month-panel .ant-calendar-year-panel{top:0}.ant-calendar-range .ant-calendar-decade-panel-table,.ant-calendar-range .ant-calendar-month-panel-table,.ant-calendar-range .ant-calendar-year-panel-table{height:208px}.ant-calendar-range .ant-calendar-in-range-cell{border-radius:0;position:relative}.ant-calendar-range .ant-calendar-in-range-cell>div{position:relative;z-index:1}.ant-calendar-range .ant-calendar-in-range-cell:before{content:"";display:block;background:#e6f7ff;border-radius:0;border:0;position:absolute;top:4px;bottom:4px;left:0;right:0}.ant-calendar-range .ant-calendar-footer-extra{float:left}div.ant-calendar-range-quick-selector{text-align:left}div.ant-calendar-range-quick-selector>a{margin-right:8px}.ant-calendar-range .ant-calendar-header,.ant-calendar-range .ant-calendar-month-panel-header,.ant-calendar-range .ant-calendar-year-panel-header{border-bottom:0}.ant-calendar-range .ant-calendar-body,.ant-calendar-range .ant-calendar-month-panel-body,.ant-calendar-range .ant-calendar-year-panel-body{border-top:1px solid #e8e8e8}.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker{height:207px;width:100%;top:68px;z-index:2}.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-panel{height:267px;margin-top:-34px}.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-inner{padding-top:40px;height:100%;background:none}.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-combobox{display:inline-block;height:100%;background-color:#fff;border-top:1px solid #e8e8e8}.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-select{height:100%}.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-select ul{max-height:100%}.ant-calendar-range.ant-calendar-time .ant-calendar-footer .ant-calendar-time-picker-btn{margin-right:8px}.ant-calendar-range.ant-calendar-time .ant-calendar-today-btn{margin:8px 12px;height:22px;line-height:22px}.ant-calendar-range-with-ranges.ant-calendar-time .ant-calendar-time-picker{height:233px}.ant-calendar-range.ant-calendar-show-time-picker .ant-calendar-body{border-top-color:transparent}.ant-calendar-time-picker{position:absolute;width:100%;top:40px;background-color:#fff}.ant-calendar-time-picker-panel{z-index:1050;position:absolute;width:100%}.ant-calendar-time-picker-inner{display:inline-block;position:relative;outline:none;list-style:none;font-size:14px;text-align:left;background-color:#fff;background-clip:padding-box;line-height:1.5;overflow:hidden;width:100%}.ant-calendar-time-picker-column-1,.ant-calendar-time-picker-column-1 .ant-calendar-time-picker-select,.ant-calendar-time-picker-combobox{width:100%}.ant-calendar-time-picker-column-2 .ant-calendar-time-picker-select{width:50%}.ant-calendar-time-picker-column-3 .ant-calendar-time-picker-select{width:33.33%}.ant-calendar-time-picker-column-4 .ant-calendar-time-picker-select{width:25%}.ant-calendar-time-picker-input-wrap{display:none}.ant-calendar-time-picker-select{float:left;font-size:14px;border-right:1px solid #e8e8e8;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;position:relative;height:226px}.ant-calendar-time-picker-select:hover{overflow-y:auto}.ant-calendar-time-picker-select:first-child{border-left:0;margin-left:0}.ant-calendar-time-picker-select:last-child{border-right:0}.ant-calendar-time-picker-select ul{list-style:none;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;width:100%;max-height:206px}.ant-calendar-time-picker-select li{padding-left:32px;list-style:none;-webkit-box-sizing:content-box;box-sizing:content-box;margin:0;width:100%;height:24px;line-height:24px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:background .3s ease;transition:background .3s ease}.ant-calendar-time-picker-select li:last-child:after{content:"";height:202px;display:block}.ant-calendar-time-picker-select li:hover{background:#e6f7ff}li.ant-calendar-time-picker-select-option-selected{background:#f5f5f5;font-weight:700}li.ant-calendar-time-picker-select-option-disabled{color:rgba(0,0,0,.25)}li.ant-calendar-time-picker-select-option-disabled:hover{background:transparent;cursor:not-allowed}.ant-calendar-time .ant-calendar-day-select{padding:0 2px;font-weight:500;display:inline-block;color:rgba(0,0,0,.85);line-height:34px}.ant-calendar-time .ant-calendar-footer{position:relative;height:auto}.ant-calendar-time .ant-calendar-footer-btn{text-align:right}.ant-calendar-time .ant-calendar-footer .ant-calendar-today-btn{float:left;margin:0}.ant-calendar-time .ant-calendar-footer .ant-calendar-time-picker-btn{display:inline-block;margin-right:8px}.ant-calendar-time .ant-calendar-footer .ant-calendar-time-picker-btn-disabled{color:rgba(0,0,0,.25)}.ant-calendar-month-panel{position:absolute;top:1px;right:0;bottom:0;left:0;z-index:10;border-radius:4px;background:#fff;outline:none}.ant-calendar-month-panel>div{height:100%}.ant-calendar-month-panel-hidden{display:none}.ant-calendar-month-panel-header{height:40px;line-height:40px;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-bottom:1px solid #e8e8e8}.ant-calendar-month-panel-header a:hover{color:#40a9ff}.ant-calendar-month-panel-header .ant-calendar-month-panel-century-select,.ant-calendar-month-panel-header .ant-calendar-month-panel-decade-select,.ant-calendar-month-panel-header .ant-calendar-month-panel-month-select,.ant-calendar-month-panel-header .ant-calendar-month-panel-year-select{padding:0 2px;font-weight:500;display:inline-block;color:rgba(0,0,0,.85);line-height:40px}.ant-calendar-month-panel-header .ant-calendar-month-panel-century-select-arrow,.ant-calendar-month-panel-header .ant-calendar-month-panel-decade-select-arrow,.ant-calendar-month-panel-header .ant-calendar-month-panel-month-select-arrow,.ant-calendar-month-panel-header .ant-calendar-month-panel-year-select-arrow{display:none}.ant-calendar-month-panel-header .ant-calendar-month-panel-next-century-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-next-decade-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-next-month-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-next-year-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-century-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-decade-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-month-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-year-btn{position:absolute;top:0;color:rgba(0,0,0,.45);font-family:Arial,Hiragino Sans GB,Microsoft Yahei,Microsoft Sans Serif,sans-serif;padding:0 5px;font-size:16px;display:inline-block;line-height:40px}.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-century-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-decade-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-year-btn{left:7px}.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-century-btn:after,.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-decade-btn:after,.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-year-btn:after{content:"\AB"}.ant-calendar-month-panel-header .ant-calendar-month-panel-next-century-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-next-decade-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-next-year-btn{right:7px}.ant-calendar-month-panel-header .ant-calendar-month-panel-next-century-btn:after,.ant-calendar-month-panel-header .ant-calendar-month-panel-next-decade-btn:after,.ant-calendar-month-panel-header .ant-calendar-month-panel-next-year-btn:after{content:"\BB"}.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-month-btn{left:29px}.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-month-btn:after{content:"\2039"}.ant-calendar-month-panel-header .ant-calendar-month-panel-next-month-btn{right:29px}.ant-calendar-month-panel-header .ant-calendar-month-panel-next-month-btn:after{content:"\203A"}.ant-calendar-month-panel-body{height:calc(100% - 40px)}.ant-calendar-month-panel-table{table-layout:fixed;width:100%;height:100%;border-collapse:separate}.ant-calendar-month-panel-selected-cell .ant-calendar-month-panel-month,.ant-calendar-month-panel-selected-cell .ant-calendar-month-panel-month:hover{background:#1890ff;color:#fff}.ant-calendar-month-panel-cell{text-align:center}.ant-calendar-month-panel-cell-disabled .ant-calendar-month-panel-month,.ant-calendar-month-panel-cell-disabled .ant-calendar-month-panel-month:hover{cursor:not-allowed;color:#bcbcbc;background:#f5f5f5}.ant-calendar-month-panel-month{display:inline-block;margin:0 auto;color:rgba(0,0,0,.65);background:transparent;text-align:center;height:24px;line-height:24px;padding:0 8px;border-radius:2px;-webkit-transition:background .3s ease;transition:background .3s ease}.ant-calendar-month-panel-month:hover{background:#e6f7ff;cursor:pointer}.ant-calendar-year-panel{position:absolute;top:1px;right:0;bottom:0;left:0;z-index:10;border-radius:4px;background:#fff;outline:none}.ant-calendar-year-panel>div{height:100%}.ant-calendar-year-panel-hidden{display:none}.ant-calendar-year-panel-header{height:40px;line-height:40px;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-bottom:1px solid #e8e8e8}.ant-calendar-year-panel-header a:hover{color:#40a9ff}.ant-calendar-year-panel-header .ant-calendar-year-panel-century-select,.ant-calendar-year-panel-header .ant-calendar-year-panel-decade-select,.ant-calendar-year-panel-header .ant-calendar-year-panel-month-select,.ant-calendar-year-panel-header .ant-calendar-year-panel-year-select{padding:0 2px;font-weight:500;display:inline-block;color:rgba(0,0,0,.85);line-height:40px}.ant-calendar-year-panel-header .ant-calendar-year-panel-century-select-arrow,.ant-calendar-year-panel-header .ant-calendar-year-panel-decade-select-arrow,.ant-calendar-year-panel-header .ant-calendar-year-panel-month-select-arrow,.ant-calendar-year-panel-header .ant-calendar-year-panel-year-select-arrow{display:none}.ant-calendar-year-panel-header .ant-calendar-year-panel-next-century-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-next-decade-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-next-month-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-next-year-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-century-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-decade-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-month-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-year-btn{position:absolute;top:0;color:rgba(0,0,0,.45);font-family:Arial,Hiragino Sans GB,Microsoft Yahei,Microsoft Sans Serif,sans-serif;padding:0 5px;font-size:16px;display:inline-block;line-height:40px}.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-century-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-decade-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-year-btn{left:7px}.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-century-btn:after,.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-decade-btn:after,.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-year-btn:after{content:"\AB"}.ant-calendar-year-panel-header .ant-calendar-year-panel-next-century-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-next-decade-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-next-year-btn{right:7px}.ant-calendar-year-panel-header .ant-calendar-year-panel-next-century-btn:after,.ant-calendar-year-panel-header .ant-calendar-year-panel-next-decade-btn:after,.ant-calendar-year-panel-header .ant-calendar-year-panel-next-year-btn:after{content:"\BB"}.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-month-btn{left:29px}.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-month-btn:after{content:"\2039"}.ant-calendar-year-panel-header .ant-calendar-year-panel-next-month-btn{right:29px}.ant-calendar-year-panel-header .ant-calendar-year-panel-next-month-btn:after{content:"\203A"}.ant-calendar-year-panel-body{height:calc(100% - 40px)}.ant-calendar-year-panel-table{table-layout:fixed;width:100%;height:100%;border-collapse:separate}.ant-calendar-year-panel-cell{text-align:center}.ant-calendar-year-panel-year{display:inline-block;margin:0 auto;color:rgba(0,0,0,.65);background:transparent;text-align:center;height:24px;line-height:24px;padding:0 8px;border-radius:2px;-webkit-transition:background .3s ease;transition:background .3s ease}.ant-calendar-year-panel-year:hover{background:#e6f7ff;cursor:pointer}.ant-calendar-year-panel-selected-cell .ant-calendar-year-panel-year,.ant-calendar-year-panel-selected-cell .ant-calendar-year-panel-year:hover{background:#1890ff;color:#fff}.ant-calendar-year-panel-last-decade-cell .ant-calendar-year-panel-year,.ant-calendar-year-panel-next-decade-cell .ant-calendar-year-panel-year{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:rgba(0,0,0,.25)}.ant-calendar-decade-panel{position:absolute;top:0;right:0;bottom:0;left:0;z-index:10;background:#fff;border-radius:4px;outline:none}.ant-calendar-decade-panel-hidden{display:none}.ant-calendar-decade-panel-header{height:40px;line-height:40px;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-bottom:1px solid #e8e8e8}.ant-calendar-decade-panel-header a:hover{color:#40a9ff}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-century-select,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-decade-select,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-month-select,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-year-select{padding:0 2px;font-weight:500;display:inline-block;color:rgba(0,0,0,.85);line-height:40px}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-century-select-arrow,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-decade-select-arrow,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-month-select-arrow,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-year-select-arrow{display:none}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-century-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-decade-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-month-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-year-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-century-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-decade-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-month-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-year-btn{position:absolute;top:0;color:rgba(0,0,0,.45);font-family:Arial,Hiragino Sans GB,Microsoft Yahei,Microsoft Sans Serif,sans-serif;padding:0 5px;font-size:16px;display:inline-block;line-height:40px}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-century-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-decade-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-year-btn{left:7px}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-century-btn:after,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-decade-btn:after,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-year-btn:after{content:"\AB"}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-century-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-decade-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-year-btn{right:7px}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-century-btn:after,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-decade-btn:after,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-year-btn:after{content:"\BB"}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-month-btn{left:29px}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-month-btn:after{content:"\2039"}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-month-btn{right:29px}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-month-btn:after{content:"\203A"}.ant-calendar-decade-panel-body{height:calc(100% - 40px)}.ant-calendar-decade-panel-table{table-layout:fixed;width:100%;height:100%;border-collapse:separate}.ant-calendar-decade-panel-cell{text-align:center;white-space:nowrap}.ant-calendar-decade-panel-decade{display:inline-block;margin:0 auto;color:rgba(0,0,0,.65);background:transparent;text-align:center;height:24px;line-height:24px;padding:0 6px;border-radius:2px;-webkit-transition:background .3s ease;transition:background .3s ease}.ant-calendar-decade-panel-decade:hover{background:#e6f7ff;cursor:pointer}.ant-calendar-decade-panel-selected-cell .ant-calendar-decade-panel-decade,.ant-calendar-decade-panel-selected-cell .ant-calendar-decade-panel-decade:hover{background:#1890ff;color:#fff}.ant-calendar-decade-panel-last-century-cell .ant-calendar-decade-panel-decade,.ant-calendar-decade-panel-next-century-cell .ant-calendar-decade-panel-decade{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:rgba(0,0,0,.25)}.ant-calendar-month .ant-calendar-month-header-wrap{position:relative;height:288px}.ant-calendar-month .ant-calendar-month-panel,.ant-calendar-month .ant-calendar-year-panel{top:0;height:100%}.ant-calendar-week-number-cell{opacity:.5}.ant-calendar-week-number .ant-calendar-body tr{-webkit-transition:all .3s;transition:all .3s;cursor:pointer}.ant-calendar-week-number .ant-calendar-body tr:hover{background:#e6f7ff}.ant-calendar-week-number .ant-calendar-body tr.ant-calendar-active-week{background:#bae7ff;font-weight:700}.ant-calendar-week-number .ant-calendar-body tr .ant-calendar-selected-day .ant-calendar-date,.ant-calendar-week-number .ant-calendar-body tr .ant-calendar-selected-day:hover .ant-calendar-date{background:transparent;color:rgba(0,0,0,.65)}.ant-time-picker-panel{font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;z-index:1050;position:absolute}.ant-time-picker-panel-inner{position:relative;outline:none;list-style:none;font-size:14px;text-align:left;background-color:#fff;border-radius:4px;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.15);box-shadow:0 2px 8px rgba(0,0,0,.15);background-clip:padding-box;overflow:hidden;left:-2px}.ant-time-picker-panel-input{margin:0;padding:0;border:0;max-width:154px;cursor:auto;outline:0}.ant-time-picker-panel-input::-moz-placeholder{color:#bfbfbf;opacity:1}.ant-time-picker-panel-input:-ms-input-placeholder{color:#bfbfbf}.ant-time-picker-panel-input::-webkit-input-placeholder{color:#bfbfbf}.ant-time-picker-panel-input-wrap{-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;padding:7px 2px 7px 12px;border-bottom:1px solid #e8e8e8}.ant-time-picker-panel-input-invalid{border-color:red}.ant-time-picker-panel-clear-btn{position:absolute;right:8px;cursor:pointer;overflow:hidden;width:20px;height:20px;text-align:center;line-height:20px;top:7px;margin:0}.ant-time-picker-panel-clear-btn-icon svg{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto;font-size:14px;color:rgba(0,0,0,.25);display:inline-block;-webkit-transition:color .3s ease;transition:color .3s ease}.ant-time-picker-panel-clear-btn-icon svg:hover{color:rgba(0,0,0,.45)}.ant-time-picker-panel-narrow .ant-time-picker-panel-input-wrap{max-width:112px}.ant-time-picker-panel-select{float:left;font-size:14px;border-left:1px solid #e8e8e8;-webkit-box-sizing:border-box;box-sizing:border-box;width:56px;overflow:hidden;position:relative;max-height:192px}.ant-time-picker-panel-select:hover{overflow-y:auto}.ant-time-picker-panel-select:first-child{border-left:0;margin-left:0}.ant-time-picker-panel-select:last-child{border-right:0}.ant-time-picker-panel-select:only-child{width:100%}.ant-time-picker-panel-select ul{list-style:none;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0 0 160px;width:100%}.ant-time-picker-panel-select li{list-style:none;-webkit-box-sizing:content-box;box-sizing:content-box;margin:0;padding:0 0 0 12px;width:100%;height:32px;line-height:32px;text-align:left;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:background .3s;transition:background .3s}.ant-time-picker-panel-select li:hover{background:#e6f7ff}li.ant-time-picker-panel-select-option-selected{background:#f5f5f5;font-weight:700}li.ant-time-picker-panel-select-option-selected:hover{background:#f5f5f5}li.ant-time-picker-panel-select-option-disabled{color:rgba(0,0,0,.25)}li.ant-time-picker-panel-select-option-disabled:hover{background:transparent;cursor:not-allowed}.ant-time-picker-panel-combobox{zoom:1}.ant-time-picker-panel-combobox:after,.ant-time-picker-panel-combobox:before{content:"";display:table}.ant-time-picker-panel-combobox:after{clear:both}.ant-time-picker-panel-addon{padding:8px;border-top:1px solid #e8e8e8}.ant-time-picker-panel.slide-up-appear.slide-up-appear-active.ant-time-picker-panel-placement-topLeft,.ant-time-picker-panel.slide-up-appear.slide-up-appear-active.ant-time-picker-panel-placement-topRight,.ant-time-picker-panel.slide-up-enter.slide-up-enter-active.ant-time-picker-panel-placement-topLeft,.ant-time-picker-panel.slide-up-enter.slide-up-enter-active.ant-time-picker-panel-placement-topRight{-webkit-animation-name:antSlideDownIn;animation-name:antSlideDownIn}.ant-time-picker-panel.slide-up-appear.slide-up-appear-active.ant-time-picker-panel-placement-bottomLeft,.ant-time-picker-panel.slide-up-appear.slide-up-appear-active.ant-time-picker-panel-placement-bottomRight,.ant-time-picker-panel.slide-up-enter.slide-up-enter-active.ant-time-picker-panel-placement-bottomLeft,.ant-time-picker-panel.slide-up-enter.slide-up-enter-active.ant-time-picker-panel-placement-bottomRight{-webkit-animation-name:antSlideUpIn;animation-name:antSlideUpIn}.ant-time-picker-panel.slide-up-leave.slide-up-leave-active.ant-time-picker-panel-placement-topLeft,.ant-time-picker-panel.slide-up-leave.slide-up-leave-active.ant-time-picker-panel-placement-topRight{-webkit-animation-name:antSlideDownOut;animation-name:antSlideDownOut}.ant-time-picker-panel.slide-up-leave.slide-up-leave-active.ant-time-picker-panel-placement-bottomLeft,.ant-time-picker-panel.slide-up-leave.slide-up-leave-active.ant-time-picker-panel-placement-bottomRight{-webkit-animation-name:antSlideUpOut;animation-name:antSlideUpOut}.ant-time-picker{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-variant:tabular-nums;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;outline:none;-webkit-transition:opacity .3s;transition:opacity .3s;width:128px}.ant-time-picker,.ant-time-picker-input{font-size:14px;line-height:1.5;color:rgba(0,0,0,.65);position:relative;display:inline-block}.ant-time-picker-input{padding:4px 11px;width:100%;height:32px;background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:4px;-webkit-transition:all .3s;transition:all .3s}.ant-time-picker-input::-moz-placeholder{color:#bfbfbf;opacity:1}.ant-time-picker-input:-ms-input-placeholder{color:#bfbfbf}.ant-time-picker-input::-webkit-input-placeholder{color:#bfbfbf}.ant-time-picker-input:focus,.ant-time-picker-input:hover{border-color:#40a9ff;border-right-width:1px!important}.ant-time-picker-input:focus{outline:0;-webkit-box-shadow:0 0 0 2px rgba(24,144,255,.2);box-shadow:0 0 0 2px rgba(24,144,255,.2)}.ant-time-picker-input-disabled{background-color:#f5f5f5;opacity:1;cursor:not-allowed;color:rgba(0,0,0,.25)}.ant-time-picker-input-disabled:hover{border-color:#e6d8d8;border-right-width:1px!important}textarea.ant-time-picker-input{max-width:100%;height:auto;vertical-align:bottom;-webkit-transition:all .3s,height 0s;transition:all .3s,height 0s;min-height:32px}.ant-time-picker-input-lg{padding:6px 11px;height:40px;font-size:16px}.ant-time-picker-input-sm{padding:1px 7px;height:24px}.ant-time-picker-input[disabled]{background-color:#f5f5f5;opacity:1;cursor:not-allowed;color:rgba(0,0,0,.25)}.ant-time-picker-input[disabled]:hover{border-color:#e6d8d8;border-right-width:1px!important}.ant-time-picker-open{opacity:0}.ant-time-picker-icon{position:absolute;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);width:14px;height:14px;line-height:14px;right:11px;color:rgba(0,0,0,.25);top:50%;margin-top:-7px}.ant-time-picker-icon .ant-time-picker-clock-icon{color:rgba(0,0,0,.25);display:block;line-height:1}.ant-time-picker-large .ant-time-picker-input{padding:6px 11px;height:40px;font-size:16px}.ant-time-picker-small .ant-time-picker-input{padding:1px 7px;height:24px}.ant-time-picker-small .ant-time-picker-icon{right:7px}.ant-tag{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;display:inline-block;line-height:20px;height:22px;padding:0 7px;border-radius:4px;border:1px solid #d9d9d9;background:#fafafa;font-size:12px;-webkit-transition:all .3s cubic-bezier(.215,.61,.355,1);transition:all .3s cubic-bezier(.215,.61,.355,1);opacity:1;margin-right:8px;cursor:pointer;white-space:nowrap}.ant-tag:hover{opacity:.85}.ant-tag,.ant-tag a,.ant-tag a:hover{color:rgba(0,0,0,.65)}.ant-tag>a:first-child:last-child{display:inline-block;margin:0 -8px;padding:0 8px}.ant-tag .anticon-close{display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);-ms-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg);cursor:pointer;margin-left:3px;-webkit-transition:all .3s;transition:all .3s;color:rgba(0,0,0,.45);font-weight:700}:root .ant-tag .anticon-close{font-size:12px}.ant-tag .anticon-close:hover{color:rgba(0,0,0,.85)}.ant-tag-has-color{border-color:transparent}.ant-tag-has-color,.ant-tag-has-color .anticon-close,.ant-tag-has-color .anticon-close:hover,.ant-tag-has-color a,.ant-tag-has-color a:hover{color:#fff}.ant-tag-checkable{background-color:transparent;border-color:transparent}.ant-tag-checkable:not(.ant-tag-checkable-checked):hover{color:#1890ff}.ant-tag-checkable-checked,.ant-tag-checkable:active{color:#fff}.ant-tag-checkable-checked{background-color:#1890ff}.ant-tag-checkable:active{background-color:#096dd9}.ant-tag-close{width:0!important;padding:0;margin:0}.ant-tag-zoom-appear,.ant-tag-zoom-enter{-webkit-animation:antFadeIn .2s cubic-bezier(.78,.14,.15,.86);animation:antFadeIn .2s cubic-bezier(.78,.14,.15,.86);-webkit-animation-fill-mode:both;animation-fill-mode:both}.ant-tag-zoom-leave{-webkit-animation:antZoomOut .3s cubic-bezier(.78,.14,.15,.86);animation:antZoomOut .3s cubic-bezier(.78,.14,.15,.86);-webkit-animation-fill-mode:both;animation-fill-mode:both}.ant-tag-pink{color:#eb2f96;background:#fff0f6;border-color:#ffadd2}.ant-tag-pink-inverse{background:#eb2f96;border-color:#eb2f96;color:#fff}.ant-tag-magenta{color:#eb2f96;background:#fff0f6;border-color:#ffadd2}.ant-tag-magenta-inverse{background:#eb2f96;border-color:#eb2f96;color:#fff}.ant-tag-red{color:#f5222d;background:#fff1f0;border-color:#ffa39e}.ant-tag-red-inverse{background:#f5222d;border-color:#f5222d;color:#fff}.ant-tag-volcano{color:#fa541c;background:#fff2e8;border-color:#ffbb96}.ant-tag-volcano-inverse{background:#fa541c;border-color:#fa541c;color:#fff}.ant-tag-orange{color:#fa8c16;background:#fff7e6;border-color:#ffd591}.ant-tag-orange-inverse{background:#fa8c16;border-color:#fa8c16;color:#fff}.ant-tag-yellow{color:#fadb14;background:#feffe6;border-color:#fffb8f}.ant-tag-yellow-inverse{background:#fadb14;border-color:#fadb14;color:#fff}.ant-tag-gold{color:#faad14;background:#fffbe6;border-color:#ffe58f}.ant-tag-gold-inverse{background:#faad14;border-color:#faad14;color:#fff}.ant-tag-cyan{color:#13c2c2;background:#e6fffb;border-color:#87e8de}.ant-tag-cyan-inverse{background:#13c2c2;border-color:#13c2c2;color:#fff}.ant-tag-lime{color:#a0d911;background:#fcffe6;border-color:#eaff8f}.ant-tag-lime-inverse{background:#a0d911;border-color:#a0d911;color:#fff}.ant-tag-green{color:#52c41a;background:#f6ffed;border-color:#b7eb8f}.ant-tag-green-inverse{background:#52c41a;border-color:#52c41a;color:#fff}.ant-tag-blue{color:#1890ff;background:#e6f7ff;border-color:#91d5ff}.ant-tag-blue-inverse{background:#1890ff;border-color:#1890ff;color:#fff}.ant-tag-geekblue{color:#2f54eb;background:#f0f5ff;border-color:#adc6ff}.ant-tag-geekblue-inverse{background:#2f54eb;border-color:#2f54eb;color:#fff}.ant-tag-purple{color:#722ed1;background:#f9f0ff;border-color:#d3adf7}.ant-tag-purple-inverse{background:#722ed1;border-color:#722ed1;color:#fff}.ant-divider{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;background:#e8e8e8}.ant-divider,.ant-divider-vertical{margin:0 8px;display:inline-block;height:.9em;width:1px;vertical-align:middle;position:relative;top:-.06em}.ant-divider-horizontal{display:block;height:1px;width:100%;margin:24px 0;clear:both}.ant-divider-horizontal.ant-divider-with-text,.ant-divider-horizontal.ant-divider-with-text-left,.ant-divider-horizontal.ant-divider-with-text-right{display:table;white-space:nowrap;text-align:center;background:transparent;font-weight:500;color:rgba(0,0,0,.85);font-size:16px;margin:16px 0}.ant-divider-horizontal.ant-divider-with-text-left:after,.ant-divider-horizontal.ant-divider-with-text-left:before,.ant-divider-horizontal.ant-divider-with-text-right:after,.ant-divider-horizontal.ant-divider-with-text-right:before,.ant-divider-horizontal.ant-divider-with-text:after,.ant-divider-horizontal.ant-divider-with-text:before{content:"";display:table-cell;position:relative;top:50%;width:50%;border-top:1px solid #e8e8e8;-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%)}.ant-divider-horizontal.ant-divider-with-text-left .ant-divider-inner-text,.ant-divider-horizontal.ant-divider-with-text-right .ant-divider-inner-text{display:inline-block;padding:0 10px}.ant-divider-horizontal.ant-divider-with-text-left:before{top:50%;width:5%}.ant-divider-horizontal.ant-divider-with-text-left:after,.ant-divider-horizontal.ant-divider-with-text-right:before{top:50%;width:95%}.ant-divider-horizontal.ant-divider-with-text-right:after{top:50%;width:5%}.ant-divider-inner-text{display:inline-block;padding:0 24px}.ant-divider-dashed{background:none;border-top:1px dashed #e8e8e8}.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-dashed,.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-dashed,.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed{border-top:0}.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-dashed:after,.ant-divider-horizontal.ant-divider-with-text-left.ant-divider-dashed:before,.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-dashed:after,.ant-divider-horizontal.ant-divider-with-text-right.ant-divider-dashed:before,.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed:after,.ant-divider-horizontal.ant-divider-with-text.ant-divider-dashed:before{border-style:dashed none none}.ant-drawer{position:fixed;top:0;width:0;height:100%;z-index:1000}.ant-drawer>*{-webkit-transition:-webkit-transform .3s cubic-bezier(.9,0,.3,.7);transition:-webkit-transform .3s cubic-bezier(.9,0,.3,.7);transition:transform .3s cubic-bezier(.9,0,.3,.7);transition:transform .3s cubic-bezier(.9,0,.3,.7),-webkit-transform .3s cubic-bezier(.9,0,.3,.7)}.ant-drawer-content-wrapper{position:fixed}.ant-drawer .ant-drawer-content{width:100%;height:100%}.ant-drawer-left,.ant-drawer-right{width:0;height:100%}.ant-drawer-left .ant-drawer-content-wrapper,.ant-drawer-right .ant-drawer-content-wrapper{height:100%}.ant-drawer-left.ant-drawer-open,.ant-drawer-right.ant-drawer-open{width:100%}.ant-drawer-left.ant-drawer-open .ant-drawer-content-wrapper{-webkit-box-shadow:2px 0 8px rgba(0,0,0,.15);box-shadow:2px 0 8px rgba(0,0,0,.15)}.ant-drawer-right .ant-drawer-content-wrapper{right:0}.ant-drawer-right.ant-drawer-open .ant-drawer-content-wrapper{-webkit-box-shadow:-2px 0 8px rgba(0,0,0,.15);box-shadow:-2px 0 8px rgba(0,0,0,.15)}.ant-drawer-bottom,.ant-drawer-top{width:100%;height:0}.ant-drawer-bottom .ant-drawer-content-wrapper,.ant-drawer-top .ant-drawer-content-wrapper{width:100%}.ant-drawer-bottom.ant-drawer-open,.ant-drawer-top.ant-drawer-open{height:100%}.ant-drawer-top.ant-drawer-open .ant-drawer-content-wrapper{-webkit-box-shadow:0 2px 8px rgba(0,0,0,.15);box-shadow:0 2px 8px rgba(0,0,0,.15)}.ant-drawer-bottom .ant-drawer-content-wrapper{bottom:0}.ant-drawer-bottom.ant-drawer-open .ant-drawer-content-wrapper{-webkit-box-shadow:0 -2px 8px rgba(0,0,0,.15);box-shadow:0 -2px 8px rgba(0,0,0,.15)}.ant-drawer.ant-drawer-open .ant-drawer-mask{opacity:.3;height:100%;-webkit-animation:antdDrawerFadeIn .3s cubic-bezier(.7,.3,.1,1);animation:antdDrawerFadeIn .3s cubic-bezier(.7,.3,.1,1);-webkit-transition:none;transition:none}.ant-drawer-title{margin:0;font-size:16px;line-height:22px;font-weight:500;color:rgba(0,0,0,.85)}.ant-drawer-content{position:relative;background-color:#fff;border:0;background-clip:padding-box;z-index:1}.ant-drawer-close{cursor:pointer;border:0;background:transparent;position:absolute;right:0;top:0;z-index:10;font-weight:700;line-height:1;text-decoration:none;-webkit-transition:color .3s;transition:color .3s;color:rgba(0,0,0,.45);outline:0;padding:0}.ant-drawer-close-x{display:block;font-style:normal;text-align:center;text-transform:none;text-rendering:auto;width:56px;height:56px;line-height:56px;font-size:16px}.ant-drawer-close:focus,.ant-drawer-close:hover{color:#444;text-decoration:none}.ant-drawer-header{padding:16px 24px;border-radius:4px 4px 0 0;background:#fff;color:rgba(0,0,0,.65);border-bottom:1px solid #e8e8e8}.ant-drawer-body{padding:24px;font-size:14px;line-height:1.5;word-wrap:break-word}.ant-drawer-mask{position:fixed;width:100%;height:0;opacity:0;background-color:rgba(0,0,0,.65);filter:alpha(opacity=50);-webkit-transition:opacity .3s linear,height 0s ease .3s;transition:opacity .3s linear,height 0s ease .3s}.ant-drawer-open{-webkit-transition:-webkit-transform .3s cubic-bezier(.7,.3,.1,1);transition:-webkit-transform .3s cubic-bezier(.7,.3,.1,1);transition:transform .3s cubic-bezier(.7,.3,.1,1);transition:transform .3s cubic-bezier(.7,.3,.1,1),-webkit-transform .3s cubic-bezier(.7,.3,.1,1)}.ant-drawer-open-content{-webkit-box-shadow:0 4px 12px rgba(0,0,0,.15);box-shadow:0 4px 12px rgba(0,0,0,.15)}@-webkit-keyframes antdDrawerFadeIn{0%{opacity:0}to{opacity:.3}}@keyframes antdDrawerFadeIn{0%{opacity:0}to{opacity:.3}}.ant-dropdown{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;position:absolute;left:-9999px;top:-9999px;z-index:1050;display:block}.ant-dropdown-wrap{position:relative}.ant-dropdown-wrap .ant-btn>.anticon-down{display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);-ms-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg)}:root .ant-dropdown-wrap .ant-btn>.anticon-down{font-size:12px}.ant-dropdown-wrap .anticon-down:before{-webkit-transition:-webkit-transform .2s;transition:-webkit-transform .2s;transition:transform .2s;transition:transform .2s,-webkit-transform .2s}.ant-dropdown-wrap-open .anticon-down:before{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.ant-dropdown-hidden,.ant-dropdown-menu-hidden{display:none}.ant-dropdown-menu{outline:none;position:relative;list-style-type:none;padding:4px 0;margin:0;text-align:left;background-color:#fff;border-radius:4px;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.15);box-shadow:0 2px 8px rgba(0,0,0,.15);background-clip:padding-box}.ant-dropdown-menu-item-group-title{color:rgba(0,0,0,.45);padding:5px 12px;-webkit-transition:all .3s;transition:all .3s}.ant-dropdown-menu-submenu-popup{position:absolute;z-index:1050}.ant-dropdown-menu-item,.ant-dropdown-menu-submenu-title{padding:5px 12px;margin:0;clear:both;font-size:14px;font-weight:400;color:rgba(0,0,0,.65);white-space:nowrap;cursor:pointer;-webkit-transition:all .3s;transition:all .3s;line-height:22px}.ant-dropdown-menu-item>.anticon:first-child,.ant-dropdown-menu-submenu-title>.anticon:first-child{min-width:12px;margin-right:8px}.ant-dropdown-menu-item>a,.ant-dropdown-menu-submenu-title>a{color:rgba(0,0,0,.65);display:block;padding:5px 12px;margin:-5px -12px;-webkit-transition:all .3s;transition:all .3s}.ant-dropdown-menu-item>a:focus,.ant-dropdown-menu-submenu-title>a:focus{text-decoration:none}.ant-dropdown-menu-item-selected,.ant-dropdown-menu-item-selected>a,.ant-dropdown-menu-submenu-title-selected,.ant-dropdown-menu-submenu-title-selected>a{color:#1890ff;background-color:#e6f7ff}.ant-dropdown-menu-item:hover,.ant-dropdown-menu-submenu-title:hover{background-color:#e6f7ff}.ant-dropdown-menu-item-disabled,.ant-dropdown-menu-submenu-title-disabled{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-dropdown-menu-item-disabled:hover,.ant-dropdown-menu-submenu-title-disabled:hover{color:rgba(0,0,0,.25);background-color:#fff;cursor:not-allowed}.ant-dropdown-menu-item-divider,.ant-dropdown-menu-submenu-title-divider{height:1px;overflow:hidden;background-color:#e8e8e8;line-height:0;margin:4px 0}.ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow,.ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow{position:absolute;right:8px}.ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow-icon,.ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow-icon{font-style:normal;color:rgba(0,0,0,.45);display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);-ms-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg)}:root .ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow-icon,:root .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow-icon{font-size:12px}.ant-dropdown-menu-submenu-title{padding-right:26px}.ant-dropdown-menu-submenu-vertical{position:relative}.ant-dropdown-menu-submenu-vertical>.ant-dropdown-menu{top:0;left:100%;position:absolute;min-width:100%;margin-left:4px;-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title,.ant-dropdown-menu-submenu.ant-dropdown-menu-submenu-disabled .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow-icon{color:rgba(0,0,0,.25)}.ant-dropdown.slide-down-appear.slide-down-appear-active.ant-dropdown-placement-bottomCenter,.ant-dropdown.slide-down-appear.slide-down-appear-active.ant-dropdown-placement-bottomLeft,.ant-dropdown.slide-down-appear.slide-down-appear-active.ant-dropdown-placement-bottomRight,.ant-dropdown.slide-down-enter.slide-down-enter-active.ant-dropdown-placement-bottomCenter,.ant-dropdown.slide-down-enter.slide-down-enter-active.ant-dropdown-placement-bottomLeft,.ant-dropdown.slide-down-enter.slide-down-enter-active.ant-dropdown-placement-bottomRight{-webkit-animation-name:antSlideUpIn;animation-name:antSlideUpIn}.ant-dropdown.slide-up-appear.slide-up-appear-active.ant-dropdown-placement-topCenter,.ant-dropdown.slide-up-appear.slide-up-appear-active.ant-dropdown-placement-topLeft,.ant-dropdown.slide-up-appear.slide-up-appear-active.ant-dropdown-placement-topRight,.ant-dropdown.slide-up-enter.slide-up-enter-active.ant-dropdown-placement-topCenter,.ant-dropdown.slide-up-enter.slide-up-enter-active.ant-dropdown-placement-topLeft,.ant-dropdown.slide-up-enter.slide-up-enter-active.ant-dropdown-placement-topRight{-webkit-animation-name:antSlideDownIn;animation-name:antSlideDownIn}.ant-dropdown.slide-down-leave.slide-down-leave-active.ant-dropdown-placement-bottomCenter,.ant-dropdown.slide-down-leave.slide-down-leave-active.ant-dropdown-placement-bottomLeft,.ant-dropdown.slide-down-leave.slide-down-leave-active.ant-dropdown-placement-bottomRight{-webkit-animation-name:antSlideUpOut;animation-name:antSlideUpOut}.ant-dropdown.slide-up-leave.slide-up-leave-active.ant-dropdown-placement-topCenter,.ant-dropdown.slide-up-leave.slide-up-leave-active.ant-dropdown-placement-topLeft,.ant-dropdown.slide-up-leave.slide-up-leave-active.ant-dropdown-placement-topRight{-webkit-animation-name:antSlideDownOut;animation-name:antSlideDownOut}.ant-dropdown-link .anticon:not(.anticon-ellipsis),.ant-dropdown-trigger .anticon:not(.anticon-ellipsis){display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);-ms-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg)}:root .ant-dropdown-link .anticon:not(.anticon-ellipsis),:root .ant-dropdown-trigger .anticon:not(.anticon-ellipsis){font-size:12px}.ant-dropdown-button{white-space:nowrap}.ant-dropdown-button.ant-btn-group>.ant-btn:last-child:not(:first-child){padding-left:8px;padding-right:8px}.ant-dropdown-button .anticon:not(.anticon-ellipsis){display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);-ms-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg)}:root .ant-dropdown-button .anticon:not(.anticon-ellipsis){font-size:12px}.ant-dropdown-menu-dark,.ant-dropdown-menu-dark .ant-dropdown-menu{background:#001529}.ant-dropdown-menu-dark .ant-dropdown-menu-item,.ant-dropdown-menu-dark .ant-dropdown-menu-item .ant-dropdown-menu-submenu-arrow:after,.ant-dropdown-menu-dark .ant-dropdown-menu-item>a,.ant-dropdown-menu-dark .ant-dropdown-menu-item>a .ant-dropdown-menu-submenu-arrow:after,.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title,.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title .ant-dropdown-menu-submenu-arrow:after{color:hsla(0,0%,100%,.65)}.ant-dropdown-menu-dark .ant-dropdown-menu-item:hover,.ant-dropdown-menu-dark .ant-dropdown-menu-item>a:hover,.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title:hover{color:#fff;background:transparent}.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected,.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected:hover,.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected>a{background:#1890ff;color:#fff}.ant-form{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none}.ant-form legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:16px;line-height:inherit;color:rgba(0,0,0,.45);border:0;border-bottom:1px solid #d9d9d9}.ant-form label{font-size:14px}.ant-form input[type=search]{-webkit-box-sizing:border-box;box-sizing:border-box}.ant-form input[type=checkbox],.ant-form input[type=radio]{line-height:normal}.ant-form input[type=file]{display:block}.ant-form input[type=range]{display:block;width:100%}.ant-form select[multiple],.ant-form select[size]{height:auto}.ant-form input[type=checkbox]:focus,.ant-form input[type=file]:focus,.ant-form input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.ant-form output{display:block;padding-top:15px;font-size:14px;line-height:1.5;color:rgba(0,0,0,.65)}.ant-form-item-required:before{display:inline-block;margin-right:4px;content:"*";font-family:SimSun;line-height:1;font-size:14px;color:#f5222d}.ant-form-hide-required-mark .ant-form-item-required:before{display:none}.ant-checkbox-inline.disabled,.ant-checkbox-vertical.disabled,.ant-checkbox.disabled label,.ant-radio-inline.disabled,.ant-radio-vertical.disabled,.ant-radio.disabled label,input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.ant-form-item{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;margin-bottom:24px;vertical-align:top}.ant-form-item label{position:relative}.ant-form-item label>.anticon{vertical-align:top;font-size:14px}.ant-form-item-control>.ant-form-item:last-child,.ant-form-item [class^=ant-col-]>.ant-form-item:only-child{margin-bottom:-24px}.ant-form-item-control{line-height:39.9999px;position:relative;zoom:1}.ant-form-item-control:after,.ant-form-item-control:before{content:"";display:table}.ant-form-item-control:after{clear:both}.ant-form-item-children{position:relative}.ant-form-item-with-help{margin-bottom:5px}.ant-form-item-label{text-align:right;vertical-align:middle;line-height:39.9999px;display:inline-block;overflow:hidden;white-space:nowrap}.ant-form-item-label label{color:rgba(0,0,0,.85)}.ant-form-item-label label:after{content:":";margin:0 8px 0 2px;position:relative;top:-.5px}.ant-form-item .ant-switch{margin:2px 0 4px}.ant-form-item-no-colon .ant-form-item-label label:after{content:" "}.ant-form-explain,.ant-form-extra{color:rgba(0,0,0,.45);line-height:1.5;-webkit-transition:color .3s cubic-bezier(.215,.61,.355,1);transition:color .3s cubic-bezier(.215,.61,.355,1);margin-top:-2px;clear:both}.ant-form-extra{padding-top:4px}.ant-form-text{display:inline-block;padding-right:8px}.ant-form-split{display:block;text-align:center}form .has-feedback .ant-input{padding-right:24px}form .has-feedback :not(.ant-input-group-addon)>.ant-select .ant-select-arrow,form .has-feedback :not(.ant-input-group-addon)>.ant-select .ant-select-selection__clear,form .has-feedback>.ant-select .ant-select-arrow,form .has-feedback>.ant-select .ant-select-selection__clear{right:28px}form .has-feedback :not(.ant-input-group-addon)>.ant-select .ant-select-selection-selected-value,form .has-feedback>.ant-select .ant-select-selection-selected-value{padding-right:42px}form .has-feedback .ant-cascader-picker-arrow{margin-right:17px}form .has-feedback .ant-calendar-picker-clear,form .has-feedback .ant-calendar-picker-icon,form .has-feedback .ant-cascader-picker-clear,form .has-feedback .ant-input-search:not(.ant-input-search-enter-button) .ant-input-suffix,form .has-feedback .ant-time-picker-clear,form .has-feedback .ant-time-picker-icon{right:28px}form textarea.ant-input{height:auto}form .ant-upload{background:transparent}form input[type=checkbox],form input[type=radio]{width:14px;height:14px}form .ant-checkbox-inline,form .ant-radio-inline{display:inline-block;vertical-align:middle;font-weight:400;cursor:pointer;margin-left:8px}form .ant-checkbox-inline:first-child,form .ant-radio-inline:first-child{margin-left:0}form .ant-checkbox-vertical,form .ant-radio-vertical{display:block}form .ant-checkbox-vertical+.ant-checkbox-vertical,form .ant-radio-vertical+.ant-radio-vertical{margin-left:0}form .ant-input-number+.ant-form-text{margin-left:8px}form .ant-input-number-handler-wrap{z-index:2}form .ant-cascader-picker,form .ant-select{width:100%}form .ant-input-group .ant-cascader-picker,form .ant-input-group .ant-select{width:auto}form .ant-input-group-wrapper,form :not(.ant-input-group-wrapper)>.ant-input-group{display:inline-block;vertical-align:middle;position:relative;top:-1px}.ant-input-group-wrap .ant-select-selection{border-bottom-left-radius:0;border-top-left-radius:0}.ant-input-group-wrap .ant-select-selection:hover{border-color:#d9d9d9}.ant-input-group-wrap .ant-select-selection--single{margin-left:-1px;height:40px;background-color:#eee}.ant-input-group-wrap .ant-select-selection--single .ant-select-selection__rendered{padding-left:8px;padding-right:25px;line-height:30px}.ant-input-group-wrap .ant-select-open .ant-select-selection{border-color:#d9d9d9;-webkit-box-shadow:none;box-shadow:none}.ant-col-24.ant-form-item-label,.ant-col-xl-24.ant-form-item-label,.ant-form-vertical .ant-form-item-label{padding:0 0 8px;margin:0;display:block;text-align:left;line-height:1.5}.ant-col-24.ant-form-item-label label:after,.ant-col-xl-24.ant-form-item-label label:after,.ant-form-vertical .ant-form-item-label label:after{display:none}.ant-form-vertical .ant-form-item{padding-bottom:8px}.ant-form-vertical .ant-form-item-control{line-height:1.5}.ant-form-vertical .ant-form-explain,.ant-form-vertical .ant-form-extra{margin-top:2px;margin-bottom:-4px}@media (max-width:575px){.ant-form-item-control-wrapper,.ant-form-item-label{display:block;width:100%}.ant-form-item-label{padding:0 0 8px;margin:0;display:block;text-align:left;line-height:1.5}.ant-form-item-label label:after{display:none}.ant-col-xs-24.ant-form-item-label{padding:0 0 8px;margin:0;display:block;text-align:left;line-height:1.5}.ant-col-xs-24.ant-form-item-label label:after{display:none}}@media (max-width:767px){.ant-col-sm-24.ant-form-item-label{padding:0 0 8px;margin:0;display:block;text-align:left;line-height:1.5}.ant-col-sm-24.ant-form-item-label label:after{display:none}}@media (max-width:991px){.ant-col-md-24.ant-form-item-label{padding:0 0 8px;margin:0;display:block;text-align:left;line-height:1.5}.ant-col-md-24.ant-form-item-label label:after{display:none}}@media (max-width:1199px){.ant-col-lg-24.ant-form-item-label{padding:0 0 8px;margin:0;display:block;text-align:left;line-height:1.5}.ant-col-lg-24.ant-form-item-label label:after{display:none}}@media (max-width:1599px){.ant-col-xl-24.ant-form-item-label{padding:0 0 8px;margin:0;display:block;text-align:left;line-height:1.5}.ant-col-xl-24.ant-form-item-label label:after{display:none}}.ant-form-inline .ant-form-item{display:inline-block;margin-right:16px;margin-bottom:0}.ant-form-inline .ant-form-item-with-help{margin-bottom:24px}.ant-form-inline .ant-form-item>.ant-form-item-control-wrapper,.ant-form-inline .ant-form-item>.ant-form-item-label{display:inline-block;vertical-align:middle}.ant-form-inline .ant-form-text,.ant-form-inline .has-feedback{display:inline-block}.ant-form-inline .ant-form-explain{position:absolute}.has-error.has-feedback .ant-form-item-children-icon,.has-success.has-feedback .ant-form-item-children-icon,.has-warning.has-feedback .ant-form-item-children-icon,.is-validating.has-feedback .ant-form-item-children-icon{position:absolute;top:50%;right:0;visibility:visible;pointer-events:none;width:32px;height:20px;line-height:20px;margin-top:-10px;text-align:center;font-size:14px;-webkit-animation:zoomIn .3s cubic-bezier(.12,.4,.29,1.46);animation:zoomIn .3s cubic-bezier(.12,.4,.29,1.46);z-index:1}.has-error.has-feedback .ant-form-item-children-icon svg,.has-success.has-feedback .ant-form-item-children-icon svg,.has-warning.has-feedback .ant-form-item-children-icon svg,.is-validating.has-feedback .ant-form-item-children-icon svg{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}.has-success.has-feedback .ant-form-item-children-icon{-webkit-animation-name:diffZoomIn1!important;animation-name:diffZoomIn1!important;color:#52c41a}.has-warning .ant-form-explain,.has-warning .ant-form-split{color:#faad14}.has-warning .ant-input,.has-warning .ant-input:hover{border-color:#faad14}.has-warning .ant-input:focus{border-color:#ffc53d;outline:0;-webkit-box-shadow:0 0 0 2px rgba(250,173,20,.2);box-shadow:0 0 0 2px rgba(250,173,20,.2);border-right-width:1px!important}.has-warning .ant-input:not([disabled]):hover{border-color:#faad14}.has-warning .ant-calendar-picker-open .ant-calendar-picker-input{border-color:#ffc53d;outline:0;-webkit-box-shadow:0 0 0 2px rgba(250,173,20,.2);box-shadow:0 0 0 2px rgba(250,173,20,.2);border-right-width:1px!important}.has-warning .ant-input-prefix{color:#faad14}.has-warning .ant-input-group-addon{color:#faad14;border-color:#faad14;background-color:#fff}.has-warning .has-feedback{color:#faad14}.has-warning.has-feedback .ant-form-item-children-icon{color:#faad14;-webkit-animation-name:diffZoomIn3!important;animation-name:diffZoomIn3!important}.has-warning .ant-select-selection{border-color:#faad14}.has-warning .ant-select-focused .ant-select-selection,.has-warning .ant-select-open .ant-select-selection{border-color:#ffc53d;outline:0;-webkit-box-shadow:0 0 0 2px rgba(250,173,20,.2);box-shadow:0 0 0 2px rgba(250,173,20,.2);border-right-width:1px!important}.has-warning .ant-calendar-picker-icon:after,.has-warning .ant-cascader-picker-arrow,.has-warning .ant-picker-icon:after,.has-warning .ant-select-arrow,.has-warning .ant-time-picker-icon:after{color:#faad14}.has-warning .ant-input-number,.has-warning .ant-time-picker-input{border-color:#faad14}.has-warning .ant-input-number-focused,.has-warning .ant-input-number:focus,.has-warning .ant-time-picker-input-focused,.has-warning .ant-time-picker-input:focus{border-color:#ffc53d;outline:0;-webkit-box-shadow:0 0 0 2px rgba(250,173,20,.2);box-shadow:0 0 0 2px rgba(250,173,20,.2);border-right-width:1px!important}.has-warning .ant-input-number:not([disabled]):hover,.has-warning .ant-time-picker-input:not([disabled]):hover{border-color:#faad14}.has-warning .ant-cascader-picker:focus .ant-cascader-input{border-color:#ffc53d;outline:0;-webkit-box-shadow:0 0 0 2px rgba(250,173,20,.2);box-shadow:0 0 0 2px rgba(250,173,20,.2);border-right-width:1px!important}.has-error .ant-form-explain,.has-error .ant-form-split{color:#f5222d}.has-error .ant-input,.has-error .ant-input:hover{border-color:#f5222d}.has-error .ant-input:focus{border-color:#ff4d4f;outline:0;-webkit-box-shadow:0 0 0 2px rgba(245,34,45,.2);box-shadow:0 0 0 2px rgba(245,34,45,.2);border-right-width:1px!important}.has-error .ant-input:not([disabled]):hover{border-color:#f5222d}.has-error .ant-calendar-picker-open .ant-calendar-picker-input{border-color:#ff4d4f;outline:0;-webkit-box-shadow:0 0 0 2px rgba(245,34,45,.2);box-shadow:0 0 0 2px rgba(245,34,45,.2);border-right-width:1px!important}.has-error .ant-input-prefix{color:#f5222d}.has-error .ant-input-group-addon{color:#f5222d;border-color:#f5222d;background-color:#fff}.has-error .has-feedback{color:#f5222d}.has-error.has-feedback .ant-form-item-children-icon{color:#f5222d;-webkit-animation-name:diffZoomIn2!important;animation-name:diffZoomIn2!important}.has-error .ant-select-selection{border-color:#f5222d}.has-error .ant-select-focused .ant-select-selection,.has-error .ant-select-open .ant-select-selection{border-color:#ff4d4f;outline:0;-webkit-box-shadow:0 0 0 2px rgba(245,34,45,.2);box-shadow:0 0 0 2px rgba(245,34,45,.2);border-right-width:1px!important}.has-error .ant-select.ant-select-auto-complete .ant-input:focus{border-color:#f5222d}.has-error .ant-input-group-addon .ant-select-selection{border-color:transparent;-webkit-box-shadow:none;box-shadow:none}.has-error .ant-calendar-picker-icon:after,.has-error .ant-cascader-picker-arrow,.has-error .ant-picker-icon:after,.has-error .ant-select-arrow,.has-error .ant-time-picker-icon:after{color:#f5222d}.has-error .ant-input-number,.has-error .ant-time-picker-input{border-color:#f5222d}.has-error .ant-input-number-focused,.has-error .ant-input-number:focus,.has-error .ant-time-picker-input-focused,.has-error .ant-time-picker-input:focus{border-color:#ff4d4f;outline:0;-webkit-box-shadow:0 0 0 2px rgba(245,34,45,.2);box-shadow:0 0 0 2px rgba(245,34,45,.2);border-right-width:1px!important}.has-error .ant-input-number:not([disabled]):hover,.has-error .ant-mention-wrapper .ant-mention-editor,.has-error .ant-mention-wrapper .ant-mention-editor:not([disabled]):hover,.has-error .ant-time-picker-input:not([disabled]):hover{border-color:#f5222d}.has-error .ant-cascader-picker:focus .ant-cascader-input,.has-error .ant-mention-wrapper.ant-mention-active:not([disabled]) .ant-mention-editor,.has-error .ant-mention-wrapper .ant-mention-editor:not([disabled]):focus{border-color:#ff4d4f;outline:0;-webkit-box-shadow:0 0 0 2px rgba(245,34,45,.2);box-shadow:0 0 0 2px rgba(245,34,45,.2);border-right-width:1px!important}.is-validating.has-feedback .ant-form-item-children-icon{display:inline-block;color:#1890ff}.ant-advanced-search-form .ant-form-item{margin-bottom:24px}.ant-advanced-search-form .ant-form-item-with-help{margin-bottom:5px}.show-help-appear,.show-help-enter,.show-help-leave{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.show-help-appear.show-help-appear-active,.show-help-enter.show-help-enter-active{-webkit-animation-name:antShowHelpIn;animation-name:antShowHelpIn;-webkit-animation-play-state:running;animation-play-state:running}.show-help-leave.show-help-leave-active{-webkit-animation-name:antShowHelpOut;animation-name:antShowHelpOut;-webkit-animation-play-state:running;animation-play-state:running;pointer-events:none}.show-help-appear,.show-help-enter{opacity:0}.show-help-appear,.show-help-enter,.show-help-leave{-webkit-animation-timing-function:cubic-bezier(.645,.045,.355,1);animation-timing-function:cubic-bezier(.645,.045,.355,1)}@-webkit-keyframes antShowHelpIn{0%{opacity:0;-webkit-transform:translateY(-5px);transform:translateY(-5px)}to{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes antShowHelpIn{0%{opacity:0;-webkit-transform:translateY(-5px);transform:translateY(-5px)}to{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes antShowHelpOut{to{opacity:0;-webkit-transform:translateY(-5px);transform:translateY(-5px)}}@keyframes antShowHelpOut{to{opacity:0;-webkit-transform:translateY(-5px);transform:translateY(-5px)}}@-webkit-keyframes diffZoomIn1{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes diffZoomIn1{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes diffZoomIn2{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes diffZoomIn2{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes diffZoomIn3{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes diffZoomIn3{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}.ant-input-number{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-variant:tabular-nums;-webkit-box-sizing:border-box;box-sizing:border-box;list-style:none;position:relative;padding:4px 11px;width:100%;height:32px;font-size:14px;line-height:1.5;color:rgba(0,0,0,.65);background-color:#fff;background-image:none;-webkit-transition:all .3s;transition:all .3s;margin:0;padding:0;display:inline-block;border:1px solid #d9d9d9;border-radius:4px;width:90px}.ant-input-number::-moz-placeholder{color:#bfbfbf;opacity:1}.ant-input-number:-ms-input-placeholder{color:#bfbfbf}.ant-input-number::-webkit-input-placeholder{color:#bfbfbf}.ant-input-number:focus{border-color:#40a9ff;outline:0;-webkit-box-shadow:0 0 0 2px rgba(24,144,255,.2);box-shadow:0 0 0 2px rgba(24,144,255,.2);border-right-width:1px!important}textarea.ant-input-number{max-width:100%;height:auto;vertical-align:bottom;-webkit-transition:all .3s,height 0s;transition:all .3s,height 0s;min-height:32px}.ant-input-number-lg{padding:6px 11px;height:40px}.ant-input-number-sm{padding:1px 7px;height:24px}.ant-input-number-handler{text-align:center;line-height:0;height:50%;overflow:hidden;color:rgba(0,0,0,.45);position:relative;-webkit-transition:all .1s linear;transition:all .1s linear;display:block;width:100%;font-weight:700}.ant-input-number-handler:active{background:#f4f4f4}.ant-input-number-handler:hover .ant-input-number-handler-down-inner,.ant-input-number-handler:hover .ant-input-number-handler-up-inner{color:#40a9ff}.ant-input-number-handler-down-inner,.ant-input-number-handler-up-inner{font-style:normal;vertical-align:-.125em;text-align:center;text-transform:none;line-height:0;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;line-height:12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:absolute;width:12px;height:12px;-webkit-transition:all .1s linear;transition:all .1s linear;display:inline-block;font-size:12px;font-size:7px\9;-webkit-transform:scale(.58333333) rotate(0deg);-ms-transform:scale(.58333333) rotate(0deg);transform:scale(.58333333) rotate(0deg);right:4px;color:rgba(0,0,0,.45)}.ant-input-number-handler-down-inner>*,.ant-input-number-handler-up-inner>*{line-height:1}.ant-input-number-handler-down-inner svg,.ant-input-number-handler-up-inner svg{display:inline-block}.ant-input-number-handler-down-inner:before,.ant-input-number-handler-up-inner:before{display:none}.ant-input-number-handler-down-inner .ant-input-number-handler-down-inner-icon,.ant-input-number-handler-down-inner .ant-input-number-handler-up-inner-icon,.ant-input-number-handler-up-inner .ant-input-number-handler-down-inner-icon,.ant-input-number-handler-up-inner .ant-input-number-handler-up-inner-icon{display:block}:root .ant-input-number-handler-down-inner,:root .ant-input-number-handler-up-inner{font-size:12px}.ant-input-number-focused,.ant-input-number:hover{border-color:#40a9ff;border-right-width:1px!important}.ant-input-number-focused{outline:0;-webkit-box-shadow:0 0 0 2px rgba(24,144,255,.2);box-shadow:0 0 0 2px rgba(24,144,255,.2)}.ant-input-number-disabled{background-color:#f5f5f5;opacity:1;cursor:not-allowed;color:rgba(0,0,0,.25)}.ant-input-number-disabled:hover{border-color:#e6d8d8;border-right-width:1px!important}.ant-input-number-disabled .ant-input-number-input{cursor:not-allowed}.ant-input-number-disabled .ant-input-number-handler-wrap{display:none}.ant-input-number-input{width:100%;text-align:left;outline:0;-moz-appearance:textfield;height:30px;-webkit-transition:all .3s linear;transition:all .3s linear;background-color:transparent;border:0;border-radius:4px;padding:0 11px}.ant-input-number-input::-moz-placeholder{color:#bfbfbf;opacity:1}.ant-input-number-input:-ms-input-placeholder{color:#bfbfbf}.ant-input-number-input::-webkit-input-placeholder{color:#bfbfbf}.ant-input-number-lg{padding:0;font-size:16px}.ant-input-number-lg input{height:38px}.ant-input-number-sm{padding:0}.ant-input-number-sm input{height:22px;padding:0 7px}.ant-input-number-handler-wrap{border-left:1px solid #d9d9d9;width:22px;height:100%;background:#fff;position:absolute;top:0;right:0;opacity:0;border-radius:0 4px 4px 0;-webkit-transition:opacity .24s linear .1s;transition:opacity .24s linear .1s}.ant-input-number-handler-wrap:hover .ant-input-number-handler{height:40%}.ant-input-number:hover .ant-input-number-handler-wrap{opacity:1}.ant-input-number-handler-up{cursor:pointer}.ant-input-number-handler-up-inner{top:50%;margin-top:-5px;text-align:center}.ant-input-number-handler-up:hover{height:60%!important}.ant-input-number-handler-down{border-top:1px solid #d9d9d9;top:0;cursor:pointer}.ant-input-number-handler-down-inner{top:50%;margin-top:-6px;text-align:center}.ant-input-number-handler-down:hover{height:60%!important}.ant-input-number-handler-down-disabled,.ant-input-number-handler-up-disabled{cursor:not-allowed}.ant-input-number-handler-down-disabled:hover .ant-input-number-handler-down-inner,.ant-input-number-handler-up-disabled:hover .ant-input-number-handler-up-inner{color:rgba(0,0,0,.25)}.ant-layout{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-webkit-flex:auto;-ms-flex:auto;flex:auto;background:#f0f2f5;min-height:0}.ant-layout,.ant-layout *{-webkit-box-sizing:border-box;box-sizing:border-box}.ant-layout.ant-layout-has-sider{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ant-layout.ant-layout-has-sider>.ant-layout,.ant-layout.ant-layout-has-sider>.ant-layout-content{overflow-x:hidden}.ant-layout-footer,.ant-layout-header{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.ant-layout-header{background:#001529;padding:0 50px;height:64px;line-height:64px}.ant-layout-footer{background:#f0f2f5;padding:24px 50px;color:rgba(0,0,0,.65);font-size:14px}.ant-layout-content{-webkit-box-flex:1;-webkit-flex:auto;-ms-flex:auto;flex:auto;min-height:0}.ant-layout-sider{-webkit-transition:all .2s;transition:all .2s;position:relative;background:#001529;min-width:0}.ant-layout-sider-children{height:100%;padding-top:.1px;margin-top:-.1px}.ant-layout-sider-has-trigger{padding-bottom:48px}.ant-layout-sider-right{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.ant-layout-sider-trigger{position:fixed;text-align:center;bottom:0;cursor:pointer;height:48px;line-height:48px;color:#fff;background:#002140;z-index:1;-webkit-transition:all .2s;transition:all .2s}.ant-layout-sider-zero-width>*{overflow:hidden}.ant-layout-sider-zero-width-trigger{position:absolute;top:64px;right:-36px;text-align:center;width:36px;height:42px;line-height:42px;background:#001529;color:#fff;font-size:18px;border-radius:0 4px 4px 0;cursor:pointer;-webkit-transition:background .3s ease;transition:background .3s ease}.ant-layout-sider-zero-width-trigger:hover{background:#192c3e}.ant-layout-sider-light{background:#fff}.ant-layout-sider-light .ant-layout-sider-trigger,.ant-layout-sider-light .ant-layout-sider-zero-width-trigger{color:rgba(0,0,0,.65);background:#fff}.ant-list{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;position:relative}.ant-list *{outline:none}.ant-list-pagination{margin-top:24px;text-align:right}.ant-list-more{margin-top:12px;text-align:center}.ant-list-more button{padding-left:32px;padding-right:32px}.ant-list-spin{text-align:center;min-height:40px}.ant-list-empty-text{color:rgba(0,0,0,.45);font-size:14px;padding:16px;text-align:center}.ant-list-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding-top:12px;padding-bottom:12px}.ant-list-item,.ant-list-item-meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ant-list-item-meta{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;font-size:0}.ant-list-item-meta-avatar{margin-right:16px}.ant-list-item-meta-content{-webkit-box-flex:1;-webkit-flex:1 0;-ms-flex:1 0;flex:1 0}.ant-list-item-meta-title{color:rgba(0,0,0,.65);margin-bottom:4px;font-size:14px;line-height:22px}.ant-list-item-meta-title>a{color:rgba(0,0,0,.65);-webkit-transition:all .3s;transition:all .3s}.ant-list-item-meta-title>a:hover{color:#1890ff}.ant-list-item-meta-description{color:rgba(0,0,0,.45);font-size:14px;line-height:22px}.ant-list-item-content{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.ant-list-item-content-single{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.ant-list-item-action{font-size:0;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;margin-left:48px;padding:0;list-style:none}.ant-list-item-action>li{display:inline-block;color:rgba(0,0,0,.45);cursor:pointer;padding:0 8px;position:relative;font-size:14px;line-height:22px;text-align:center}.ant-list-item-action>li:first-child{padding-left:0}.ant-list-item-action-split{background-color:#e8e8e8;margin-top:-7px;position:absolute;top:50%;right:0;width:1px;height:14px}.ant-list-item-main{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.ant-list-footer,.ant-list-header{padding-top:12px;padding-bottom:12px}.ant-list-empty{color:rgba(0,0,0,.45);padding:16px 0;font-size:12px;text-align:center}.ant-list-split .ant-list-item{border-bottom:1px solid #e8e8e8}.ant-list-split .ant-list-item:last-child{border-bottom:none}.ant-list-split .ant-list-header{border-bottom:1px solid #e8e8e8}.ant-list-loading .ant-list-spin-nested-loading{min-height:32px}.ant-list-something-after-last-item .ant-spin-container>.ant-list-item:last-child{border-bottom:1px solid #e8e8e8}.ant-list-lg .ant-list-item{padding-top:16px;padding-bottom:16px}.ant-list-sm .ant-list-item{padding-top:8px;padding-bottom:8px}.ant-list-vertical .ant-list-item{display:block}.ant-list-vertical .ant-list-item-extra-wrap{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ant-list-vertical .ant-list-item-main{display:block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.ant-list-vertical .ant-list-item-extra{margin-left:58px}.ant-list-vertical .ant-list-item-meta{margin-bottom:16px}.ant-list-vertical .ant-list-item-meta-avatar{display:none}.ant-list-vertical .ant-list-item-meta-title{color:rgba(0,0,0,.85);margin-bottom:12px;font-size:16px;line-height:24px}.ant-list-vertical .ant-list-item-content{display:block;color:rgba(0,0,0,.65);font-size:14px;margin-bottom:16px}.ant-list-vertical .ant-list-item-action{margin-left:auto}.ant-list-vertical .ant-list-item-action>li{padding:0 16px}.ant-list-vertical .ant-list-item-action>li:first-child{padding-left:0}.ant-list-grid .ant-list-item{border-bottom:none;padding-top:0;padding-bottom:0;margin-bottom:16px}.ant-list-grid .ant-list-item-content{display:block;max-width:100%}.ant-list-bordered{border-radius:4px;border:1px solid #d9d9d9}.ant-list-bordered .ant-list-footer,.ant-list-bordered .ant-list-header,.ant-list-bordered .ant-list-item{padding-left:24px;padding-right:24px}.ant-list-bordered .ant-list-item{border-bottom:1px solid #e8e8e8}.ant-list-bordered .ant-list-pagination{margin:16px 24px}.ant-list-bordered.ant-list-sm .ant-list-item{padding-left:16px;padding-right:16px}.ant-list-bordered.ant-list-sm .ant-list-footer,.ant-list-bordered.ant-list-sm .ant-list-header{padding:8px 16px}.ant-list-bordered.ant-list-lg .ant-list-footer,.ant-list-bordered.ant-list-lg .ant-list-header{padding:16px 24px}@media screen and (max-width:768px){.ant-list-item-action,.ant-list-vertical .ant-list-item-extra{margin-left:24px}}@media screen and (max-width:480px){.ant-list-item{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.ant-list-item-action{margin-left:12px}.ant-list-vertical .ant-list-item-extra-wrap{-webkit-flex-wrap:wrap-reverse;-ms-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse}.ant-list-vertical .ant-list-item-main{min-width:220px}.ant-list-vertical .ant-list-item-extra{margin-left:0}}.ant-spin{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;color:#1890ff;vertical-align:middle;text-align:center;opacity:0;position:absolute;-webkit-transition:-webkit-transform .3s cubic-bezier(.78,.14,.15,.86);transition:-webkit-transform .3s cubic-bezier(.78,.14,.15,.86);transition:transform .3s cubic-bezier(.78,.14,.15,.86);transition:transform .3s cubic-bezier(.78,.14,.15,.86),-webkit-transform .3s cubic-bezier(.78,.14,.15,.86);display:none}.ant-spin-spinning{opacity:1;position:static;display:inline-block}.ant-spin-nested-loading{position:relative}.ant-spin-nested-loading>div>.ant-spin{display:block;position:absolute;height:100%;max-height:360px;width:100%;z-index:4}.ant-spin-nested-loading>div>.ant-spin .ant-spin-dot{position:absolute;top:50%;left:50%;margin:-10px}.ant-spin-nested-loading>div>.ant-spin .ant-spin-text{position:absolute;top:50%;width:100%;padding-top:5px;text-shadow:0 1px 2px #fff}.ant-spin-nested-loading>div>.ant-spin.ant-spin-show-text .ant-spin-dot{margin-top:-20px}.ant-spin-nested-loading>div>.ant-spin-sm .ant-spin-dot{margin:-7px}.ant-spin-nested-loading>div>.ant-spin-sm .ant-spin-text{padding-top:2px}.ant-spin-nested-loading>div>.ant-spin-sm.ant-spin-show-text .ant-spin-dot{margin-top:-17px}.ant-spin-nested-loading>div>.ant-spin-lg .ant-spin-dot{margin:-16px}.ant-spin-nested-loading>div>.ant-spin-lg .ant-spin-text{padding-top:11px}.ant-spin-nested-loading>div>.ant-spin-lg.ant-spin-show-text .ant-spin-dot{margin-top:-26px}.ant-spin-container{position:relative;-webkit-transition:opacity .3s;transition:opacity .3s;zoom:1}.ant-spin-container:after,.ant-spin-container:before{content:"";display:table}.ant-spin-container:after{clear:both}.ant-spin-blur{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;opacity:.5;-webkit-filter:blur(.5px);filter:blur(.5px);-webkit-filter:progid\:DXImageTransform\.Microsoft\.Blur(PixelRadius\=1,MakeShadow\=false);filter:progid\:DXImageTransform\.Microsoft\.Blur(PixelRadius\=1,MakeShadow\=false)}.ant-spin-blur:after{content:"";position:absolute;left:0;right:0;top:0;bottom:0;background:#fff;opacity:.3;-webkit-transition:all .3s;transition:all .3s;z-index:10}.ant-spin-tip{color:rgba(0,0,0,.45)}.ant-spin-dot{position:relative;display:inline-block;font-size:20px;width:20px;height:20px}.ant-spin-dot i{width:9px;height:9px;border-radius:100%;background-color:#1890ff;-webkit-transform:scale(.75);-ms-transform:scale(.75);transform:scale(.75);display:block;position:absolute;opacity:.3;-webkit-animation:antSpinMove 1s infinite linear alternate;animation:antSpinMove 1s infinite linear alternate;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.ant-spin-dot i:first-child{left:0;top:0}.ant-spin-dot i:nth-child(2){right:0;top:0;-webkit-animation-delay:.4s;animation-delay:.4s}.ant-spin-dot i:nth-child(3){right:0;bottom:0;-webkit-animation-delay:.8s;animation-delay:.8s}.ant-spin-dot i:nth-child(4){left:0;bottom:0;-webkit-animation-delay:1.2s;animation-delay:1.2s}.ant-spin-dot-spin{-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);-webkit-animation:antRotate 1.2s infinite linear;animation:antRotate 1.2s infinite linear}.ant-spin-sm .ant-spin-dot{font-size:14px;width:14px;height:14px}.ant-spin-sm .ant-spin-dot i{width:6px;height:6px}.ant-spin-lg .ant-spin-dot{font-size:32px;width:32px;height:32px}.ant-spin-lg .ant-spin-dot i{width:14px;height:14px}.ant-spin.ant-spin-show-text .ant-spin-text{display:block}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.ant-spin-blur{background:#fff;opacity:.5}}@-webkit-keyframes antSpinMove{to{opacity:1}}@keyframes antSpinMove{to{opacity:1}}@-webkit-keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}@keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}.ant-pagination{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box}.ant-pagination,.ant-pagination ol,.ant-pagination ul{margin:0;padding:0;list-style:none}.ant-pagination:after{content:" ";display:block;height:0;clear:both;overflow:hidden;visibility:hidden}.ant-pagination-item,.ant-pagination-total-text{display:inline-block;vertical-align:middle;height:32px;line-height:30px;margin-right:8px}.ant-pagination-item{cursor:pointer;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;min-width:32px;text-align:center;list-style:none;border:1px solid #d9d9d9;background-color:#fff;font-family:Arial;outline:0}.ant-pagination-item a{text-decoration:none;color:rgba(0,0,0,.65);-webkit-transition:none;transition:none;margin:0 6px}.ant-pagination-item:focus,.ant-pagination-item:hover{-webkit-transition:all .3s;transition:all .3s;border-color:#1890ff}.ant-pagination-item:focus a,.ant-pagination-item:hover a{color:#1890ff}.ant-pagination-item-active{border-color:#1890ff;font-weight:500}.ant-pagination-item-active a{color:#1890ff}.ant-pagination-item-active:focus,.ant-pagination-item-active:hover{border-color:#40a9ff}.ant-pagination-item-active:focus a,.ant-pagination-item-active:hover a{color:#40a9ff}.ant-pagination-jump-next,.ant-pagination-jump-prev{outline:0}.ant-pagination-jump-next .ant-pagination-item-container,.ant-pagination-jump-prev .ant-pagination-item-container{position:relative}.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon,.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon{display:inline-block;font-size:12px;font-size:12px\9;-webkit-transform:scale(1) rotate(0deg);-ms-transform:scale(1) rotate(0deg);transform:scale(1) rotate(0deg);color:#1890ff;letter-spacing:-1px;opacity:0;-webkit-transition:all .2s;transition:all .2s}:root .ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon,:root .ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon{font-size:12px}.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-link-icon-svg,.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-link-icon-svg{top:0;right:0;bottom:0;left:0;margin:auto}.ant-pagination-jump-next .ant-pagination-item-container .ant-pagination-item-ellipsis,.ant-pagination-jump-prev .ant-pagination-item-container .ant-pagination-item-ellipsis{position:absolute;display:block;letter-spacing:2px;color:rgba(0,0,0,.25);text-align:center;opacity:1;-webkit-transition:all .2s;transition:all .2s;top:0;right:0;bottom:0;left:0;margin:auto}.ant-pagination-jump-next:focus .ant-pagination-item-link-icon,.ant-pagination-jump-next:hover .ant-pagination-item-link-icon,.ant-pagination-jump-prev:focus .ant-pagination-item-link-icon,.ant-pagination-jump-prev:hover .ant-pagination-item-link-icon{opacity:1}.ant-pagination-jump-next:focus .ant-pagination-item-ellipsis,.ant-pagination-jump-next:hover .ant-pagination-item-ellipsis,.ant-pagination-jump-prev:focus .ant-pagination-item-ellipsis,.ant-pagination-jump-prev:hover .ant-pagination-item-ellipsis{opacity:0}.ant-pagination-jump-next,.ant-pagination-jump-prev,.ant-pagination-prev{margin-right:8px}.ant-pagination-jump-next,.ant-pagination-jump-prev,.ant-pagination-next,.ant-pagination-prev{font-family:Arial;cursor:pointer;color:rgba(0,0,0,.65);border-radius:4px;list-style:none;min-width:32px;height:32px;line-height:32px;text-align:center;-webkit-transition:all .3s;transition:all .3s;display:inline-block;vertical-align:middle}.ant-pagination-next,.ant-pagination-prev{outline:0}.ant-pagination-next a,.ant-pagination-prev a{color:rgba(0,0,0,.65);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-pagination-next:hover a,.ant-pagination-prev:hover a{border-color:#40a9ff}.ant-pagination-next .ant-pagination-item-link,.ant-pagination-prev .ant-pagination-item-link{border:1px solid #d9d9d9;background-color:#fff;border-radius:4px;outline:none;display:block;-webkit-transition:all .3s;transition:all .3s;font-size:12px;height:100%;text-align:center}.ant-pagination-next:focus .ant-pagination-item-link,.ant-pagination-next:hover .ant-pagination-item-link,.ant-pagination-prev:focus .ant-pagination-item-link,.ant-pagination-prev:hover .ant-pagination-item-link{border-color:#1890ff;color:#1890ff}.ant-pagination-disabled,.ant-pagination-disabled:focus,.ant-pagination-disabled:hover{cursor:not-allowed}.ant-pagination-disabled .ant-pagination-item-link,.ant-pagination-disabled:focus .ant-pagination-item-link,.ant-pagination-disabled:focus a,.ant-pagination-disabled:hover .ant-pagination-item-link,.ant-pagination-disabled:hover a,.ant-pagination-disabled a{border-color:#d9d9d9;color:rgba(0,0,0,.25);cursor:not-allowed}.ant-pagination-slash{margin:0 10px 0 5px}.ant-pagination-options{display:inline-block;vertical-align:middle;margin-left:16px}.ant-pagination-options-size-changer.ant-select{display:inline-block;margin-right:8px}.ant-pagination-options-quick-jumper{display:inline-block;vertical-align:top;height:32px;line-height:32px}.ant-pagination-options-quick-jumper input{position:relative;display:inline-block;padding:4px 11px;width:100%;height:32px;font-size:14px;line-height:1.5;color:rgba(0,0,0,.65);background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:4px;-webkit-transition:all .3s;transition:all .3s;margin:0 8px;width:50px}.ant-pagination-options-quick-jumper input::-moz-placeholder{color:#bfbfbf;opacity:1}.ant-pagination-options-quick-jumper input:-ms-input-placeholder{color:#bfbfbf}.ant-pagination-options-quick-jumper input::-webkit-input-placeholder{color:#bfbfbf}.ant-pagination-options-quick-jumper input:focus,.ant-pagination-options-quick-jumper input:hover{border-color:#40a9ff;border-right-width:1px!important}.ant-pagination-options-quick-jumper input:focus{outline:0;-webkit-box-shadow:0 0 0 2px rgba(24,144,255,.2);box-shadow:0 0 0 2px rgba(24,144,255,.2)}.ant-pagination-options-quick-jumper input-disabled{background-color:#f5f5f5;opacity:1;cursor:not-allowed;color:rgba(0,0,0,.25)}.ant-pagination-options-quick-jumper input-disabled:hover{border-color:#e6d8d8;border-right-width:1px!important}textarea.ant-pagination-options-quick-jumper input{max-width:100%;height:auto;vertical-align:bottom;-webkit-transition:all .3s,height 0s;transition:all .3s,height 0s;min-height:32px}.ant-pagination-options-quick-jumper input-lg{padding:6px 11px;height:40px;font-size:16px}.ant-pagination-options-quick-jumper input-sm{padding:1px 7px;height:24px}.ant-pagination-simple .ant-pagination-next,.ant-pagination-simple .ant-pagination-prev{height:24px;line-height:24px;vertical-align:top}.ant-pagination-simple .ant-pagination-next .ant-pagination-item-link,.ant-pagination-simple .ant-pagination-prev .ant-pagination-item-link{border:0;height:24px}.ant-pagination-simple .ant-pagination-next .ant-pagination-item-link:after,.ant-pagination-simple .ant-pagination-prev .ant-pagination-item-link:after{height:24px;line-height:24px}.ant-pagination-simple .ant-pagination-simple-pager{display:inline-block;margin-right:8px;height:24px}.ant-pagination-simple .ant-pagination-simple-pager input{margin-right:8px;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#fff;border-radius:4px;border:1px solid #d9d9d9;outline:none;padding:0 6px;height:100%;text-align:center;-webkit-transition:border-color .3s;transition:border-color .3s}.ant-pagination-simple .ant-pagination-simple-pager input:hover{border-color:#1890ff}.ant-pagination.mini .ant-pagination-simple-pager,.ant-pagination.mini .ant-pagination-total-text{height:24px;line-height:24px}.ant-pagination.mini .ant-pagination-item{margin:0;min-width:24px;height:24px;line-height:22px}.ant-pagination.mini .ant-pagination-item:not(.ant-pagination-item-active){background:transparent;border-color:transparent}.ant-pagination.mini .ant-pagination-next,.ant-pagination.mini .ant-pagination-prev{margin:0;min-width:24px;height:24px;line-height:24px}.ant-pagination.mini .ant-pagination-next .ant-pagination-item-link,.ant-pagination.mini .ant-pagination-prev .ant-pagination-item-link{border-color:transparent;background:transparent}.ant-pagination.mini .ant-pagination-next .ant-pagination-item-link:after,.ant-pagination.mini .ant-pagination-prev .ant-pagination-item-link:after{height:24px;line-height:24px}.ant-pagination.mini .ant-pagination-jump-next,.ant-pagination.mini .ant-pagination-jump-prev{height:24px;line-height:24px;margin-right:0}.ant-pagination.mini .ant-pagination-options{margin-left:2px}.ant-pagination.mini .ant-pagination-options-quick-jumper{height:24px;line-height:24px}.ant-pagination.mini .ant-pagination-options-quick-jumper input{padding:1px 7px;height:24px;width:44px}@media only screen and (max-width:992px){.ant-pagination-item-after-jump-prev,.ant-pagination-item-before-jump-next{display:none}}@media only screen and (max-width:576px){.ant-pagination-options{display:none}}.ant-mention-wrapper{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-variant:tabular-nums;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;display:inline-block;vertical-align:middle}.ant-mention-wrapper,.ant-mention-wrapper .ant-mention-editor{font-size:14px;line-height:1.5;color:rgba(0,0,0,.65);position:relative;width:100%}.ant-mention-wrapper .ant-mention-editor{display:inline-block;padding:4px 11px;height:32px;background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:4px;-webkit-transition:all .3s;transition:all .3s;min-height:32px;height:auto;padding:0;display:block}.ant-mention-wrapper .ant-mention-editor::-moz-placeholder{color:#bfbfbf;opacity:1}.ant-mention-wrapper .ant-mention-editor:-ms-input-placeholder{color:#bfbfbf}.ant-mention-wrapper .ant-mention-editor::-webkit-input-placeholder{color:#bfbfbf}.ant-mention-wrapper .ant-mention-editor:focus,.ant-mention-wrapper .ant-mention-editor:hover{border-color:#40a9ff;border-right-width:1px!important}.ant-mention-wrapper .ant-mention-editor:focus{outline:0;-webkit-box-shadow:0 0 0 2px rgba(24,144,255,.2);box-shadow:0 0 0 2px rgba(24,144,255,.2)}.ant-mention-wrapper .ant-mention-editor-disabled{background-color:#f5f5f5;opacity:1;cursor:not-allowed;color:rgba(0,0,0,.25)}.ant-mention-wrapper .ant-mention-editor-disabled:hover{border-color:#e6d8d8;border-right-width:1px!important}textarea.ant-mention-wrapper .ant-mention-editor{max-width:100%;height:auto;vertical-align:bottom;-webkit-transition:all .3s,height 0s;transition:all .3s,height 0s;min-height:32px}.ant-mention-wrapper .ant-mention-editor-lg{padding:6px 11px;height:40px;font-size:16px}.ant-mention-wrapper .ant-mention-editor-sm{padding:1px 7px;height:24px}.ant-mention-wrapper .ant-mention-editor-wrapper{overflow-y:auto;height:auto}.ant-mention-wrapper.ant-mention-active:not(.disabled) .ant-mention-editor{border-color:#40a9ff;outline:0;-webkit-box-shadow:0 0 0 2px rgba(24,144,255,.2);box-shadow:0 0 0 2px rgba(24,144,255,.2);border-right-width:1px!important}.ant-mention-wrapper.disabled .ant-mention-editor{background-color:#f5f5f5;opacity:1;cursor:not-allowed;color:rgba(0,0,0,.25)}.ant-mention-wrapper.disabled .ant-mention-editor:hover{border-color:#e6d8d8;border-right-width:1px!important}.ant-mention-wrapper .public-DraftEditorPlaceholder-root{position:absolute;pointer-events:none}.ant-mention-wrapper .public-DraftEditorPlaceholder-root .public-DraftEditorPlaceholder-inner{color:#bfbfbf;opacity:1;outline:none;white-space:pre-wrap;word-wrap:break-word;height:auto;padding:5px 11px}.ant-mention-wrapper .DraftEditor-editorContainer .public-DraftEditor-content{height:auto;padding:5px 11px}.ant-mention-dropdown{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;margin-top:1.5em;max-height:250px;min-width:120px;background-color:#fff;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.15);box-shadow:0 2px 8px rgba(0,0,0,.15);border-radius:4px;z-index:1050;left:-9999px;top:-9999px;position:absolute;outline:none;overflow-x:hidden;overflow-y:auto}.ant-mention-dropdown-placement-top{margin-top:-.1em}.ant-mention-dropdown-notfound.ant-mention-dropdown-item{color:rgba(0,0,0,.25)}.ant-mention-dropdown-notfound.ant-mention-dropdown-item .anticon-loading{color:#1890ff;text-align:center;display:block}.ant-mention-dropdown-item{position:relative;display:block;padding:5px 12px;line-height:22px;font-weight:400;color:rgba(0,0,0,.65);white-space:nowrap;cursor:pointer;text-overflow:ellipsis;overflow:hidden;-webkit-transition:background .3s;transition:background .3s}.ant-mention-dropdown-item-active,.ant-mention-dropdown-item.focus,.ant-mention-dropdown-item:hover{background-color:#e6f7ff}.ant-mention-dropdown-item-disabled{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-mention-dropdown-item-disabled:hover{color:rgba(0,0,0,.25);background-color:#fff;cursor:not-allowed}.ant-mention-dropdown-item-selected,.ant-mention-dropdown-item-selected:hover{background-color:#f5f5f5;font-weight:700;color:rgba(0,0,0,.65)}.ant-mention-dropdown-item-divider{height:1px;margin:1px 0;overflow:hidden;background-color:#e8e8e8;line-height:0}.ant-menu{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;outline:none;margin-bottom:0;padding-left:0;list-style:none;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.15);box-shadow:0 2px 8px rgba(0,0,0,.15);color:rgba(0,0,0,.65);background:#fff;line-height:0;-webkit-transition:background .3s,width .2s;transition:background .3s,width .2s;zoom:1}.ant-menu:after,.ant-menu:before{content:"";display:table}.ant-menu:after{clear:both}.ant-menu ol,.ant-menu ul{list-style:none;margin:0;padding:0}.ant-menu-hidden{display:none}.ant-menu-item-group-title{color:rgba(0,0,0,.45);font-size:14px;line-height:1.5;padding:8px 16px;-webkit-transition:all .3s;transition:all .3s}.ant-menu-submenu,.ant-menu-submenu-inline{-webkit-transition:border-color .3s cubic-bezier(.645,.045,.355,1),background .3s cubic-bezier(.645,.045,.355,1),padding .15s cubic-bezier(.645,.045,.355,1);transition:border-color .3s cubic-bezier(.645,.045,.355,1),background .3s cubic-bezier(.645,.045,.355,1),padding .15s cubic-bezier(.645,.045,.355,1)}.ant-menu-item:active,.ant-menu-submenu-title:active{background:#e6f7ff}.ant-menu-submenu .ant-menu-sub{cursor:auto;-webkit-transition:background .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1);transition:background .3s cubic-bezier(.645,.045,.355,1),padding .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-item>a{display:block;color:rgba(0,0,0,.65)}.ant-menu-item>a:hover{color:#1890ff}.ant-menu-item>a:focus{text-decoration:none}.ant-menu-item>a:before{position:absolute;background-color:transparent;top:0;left:0;bottom:0;right:0;content:""}.ant-menu-item-divider{height:1px;overflow:hidden;background-color:#e8e8e8;line-height:0}.ant-menu-item-active,.ant-menu-item:hover,.ant-menu-submenu-active,.ant-menu-submenu-title:hover,.ant-menu:not(.ant-menu-inline) .ant-menu-submenu-open{color:#1890ff}.ant-menu-horizontal .ant-menu-item,.ant-menu-horizontal .ant-menu-submenu{margin-top:-1px}.ant-menu-horizontal>.ant-menu-item-active,.ant-menu-horizontal>.ant-menu-item:hover,.ant-menu-horizontal>.ant-menu-submenu .ant-menu-submenu-title:hover{background-color:transparent}.ant-menu-item-selected,.ant-menu-item-selected>a,.ant-menu-item-selected>a:hover{color:#1890ff}.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected{background-color:#e6f7ff}.ant-menu-inline,.ant-menu-vertical,.ant-menu-vertical-left{border-right:1px solid #e8e8e8}.ant-menu-vertical-right{border-left:1px solid #e8e8e8}.ant-menu-vertical-left.ant-menu-sub,.ant-menu-vertical-right.ant-menu-sub,.ant-menu-vertical.ant-menu-sub{border-right:0;padding:0;-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}.ant-menu-vertical-left.ant-menu-sub .ant-menu-item,.ant-menu-vertical-right.ant-menu-sub .ant-menu-item,.ant-menu-vertical.ant-menu-sub .ant-menu-item{border-right:0;margin-left:0;left:0}.ant-menu-vertical-left.ant-menu-sub .ant-menu-item:after,.ant-menu-vertical-right.ant-menu-sub .ant-menu-item:after,.ant-menu-vertical.ant-menu-sub .ant-menu-item:after{border-right:0}.ant-menu-vertical-left.ant-menu-sub>.ant-menu-item,.ant-menu-vertical-left.ant-menu-sub>.ant-menu-submenu,.ant-menu-vertical-right.ant-menu-sub>.ant-menu-item,.ant-menu-vertical-right.ant-menu-sub>.ant-menu-submenu,.ant-menu-vertical.ant-menu-sub>.ant-menu-item,.ant-menu-vertical.ant-menu-sub>.ant-menu-submenu{-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}.ant-menu-horizontal.ant-menu-sub,.ant-menu-vertical-left.ant-menu-sub,.ant-menu-vertical-right.ant-menu-sub,.ant-menu-vertical.ant-menu-sub{min-width:160px}.ant-menu-item,.ant-menu-submenu-title{cursor:pointer;margin:0;padding:0 20px;position:relative;display:block;white-space:nowrap;-webkit-transition:color .3s cubic-bezier(.645,.045,.355,1),border-color .3s cubic-bezier(.645,.045,.355,1),background .3s cubic-bezier(.645,.045,.355,1),padding .15s cubic-bezier(.645,.045,.355,1);transition:color .3s cubic-bezier(.645,.045,.355,1),border-color .3s cubic-bezier(.645,.045,.355,1),background .3s cubic-bezier(.645,.045,.355,1),padding .15s cubic-bezier(.645,.045,.355,1)}.ant-menu-item .anticon,.ant-menu-submenu-title .anticon{min-width:14px;margin-right:10px;font-size:14px;-webkit-transition:font-size .15s cubic-bezier(.215,.61,.355,1),margin .3s cubic-bezier(.645,.045,.355,1);transition:font-size .15s cubic-bezier(.215,.61,.355,1),margin .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-item .anticon+span,.ant-menu-submenu-title .anticon+span{-webkit-transition:opacity .3s cubic-bezier(.645,.045,.355,1),width .3s cubic-bezier(.645,.045,.355,1);transition:opacity .3s cubic-bezier(.645,.045,.355,1),width .3s cubic-bezier(.645,.045,.355,1);opacity:1}.ant-menu>.ant-menu-item-divider{height:1px;margin:1px 0;overflow:hidden;padding:0;line-height:0;background-color:#e8e8e8}.ant-menu-submenu-popup{position:absolute;border-radius:4px;z-index:1050}.ant-menu-submenu-popup .submenu-title-wrapper{padding-right:20px}.ant-menu-submenu-popup:before{position:absolute;top:-7px;left:0;right:0;bottom:0;content:" ";opacity:.0001}.ant-menu-submenu>.ant-menu{background-color:#fff;border-radius:4px}.ant-menu-submenu>.ant-menu-submenu-title:after{-webkit-transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-submenu-inline>.ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu-submenu-vertical-left>.ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu-submenu-vertical-right>.ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu-submenu-vertical>.ant-menu-submenu-title .ant-menu-submenu-arrow{-webkit-transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);position:absolute;top:50%;right:16px;width:10px}.ant-menu-submenu-inline>.ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-submenu-inline>.ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu-submenu-vertical-left>.ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-submenu-vertical-left>.ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu-submenu-vertical-right>.ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-submenu-vertical-right>.ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu-submenu-vertical>.ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-submenu-vertical>.ant-menu-submenu-title .ant-menu-submenu-arrow:before{content:"";position:absolute;vertical-align:baseline;background:#fff;background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.65)),to(rgba(0,0,0,.65)));background-image:-webkit-linear-gradient(left,rgba(0,0,0,.65),rgba(0,0,0,.65));background-image:linear-gradient(90deg,rgba(0,0,0,.65),rgba(0,0,0,.65));width:6px;height:1.5px;border-radius:2px;-webkit-transition:background .3s cubic-bezier(.645,.045,.355,1),top .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:background .3s cubic-bezier(.645,.045,.355,1),top .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:background .3s cubic-bezier(.645,.045,.355,1),transform .3s cubic-bezier(.645,.045,.355,1),top .3s cubic-bezier(.645,.045,.355,1);transition:background .3s cubic-bezier(.645,.045,.355,1),transform .3s cubic-bezier(.645,.045,.355,1),top .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1)}.ant-menu-submenu-inline>.ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu-submenu-vertical-left>.ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu-submenu-vertical-right>.ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu-submenu-vertical>.ant-menu-submenu-title .ant-menu-submenu-arrow:before{-webkit-transform:rotate(45deg) translateY(-2px);-ms-transform:rotate(45deg) translateY(-2px);transform:rotate(45deg) translateY(-2px)}.ant-menu-submenu-inline>.ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-submenu-vertical-left>.ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-submenu-vertical-right>.ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-submenu-vertical>.ant-menu-submenu-title .ant-menu-submenu-arrow:after{-webkit-transform:rotate(-45deg) translateY(2px);-ms-transform:rotate(-45deg) translateY(2px);transform:rotate(-45deg) translateY(2px)}.ant-menu-submenu-inline>.ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after,.ant-menu-submenu-inline>.ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before,.ant-menu-submenu-vertical-left>.ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after,.ant-menu-submenu-vertical-left>.ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before,.ant-menu-submenu-vertical-right>.ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after,.ant-menu-submenu-vertical-right>.ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before,.ant-menu-submenu-vertical>.ant-menu-submenu-title:hover .ant-menu-submenu-arrow:after,.ant-menu-submenu-vertical>.ant-menu-submenu-title:hover .ant-menu-submenu-arrow:before{background:-webkit-gradient(linear,left top,right top,from(#1890ff),to(#1890ff));background:-webkit-linear-gradient(left,#1890ff,#1890ff);background:linear-gradient(90deg,#1890ff,#1890ff)}.ant-menu-submenu-inline>.ant-menu-submenu-title .ant-menu-submenu-arrow:before{-webkit-transform:rotate(-45deg) translateX(2px);-ms-transform:rotate(-45deg) translateX(2px);transform:rotate(-45deg) translateX(2px)}.ant-menu-submenu-inline>.ant-menu-submenu-title .ant-menu-submenu-arrow:after{-webkit-transform:rotate(45deg) translateX(-2px);-ms-transform:rotate(45deg) translateX(-2px);transform:rotate(45deg) translateX(-2px)}.ant-menu-submenu-open.ant-menu-submenu-inline>.ant-menu-submenu-title .ant-menu-submenu-arrow{-webkit-transform:translateY(-2px);-ms-transform:translateY(-2px);transform:translateY(-2px)}.ant-menu-submenu-open.ant-menu-submenu-inline>.ant-menu-submenu-title .ant-menu-submenu-arrow:after{-webkit-transform:rotate(-45deg) translateX(-2px);-ms-transform:rotate(-45deg) translateX(-2px);transform:rotate(-45deg) translateX(-2px)}.ant-menu-submenu-open.ant-menu-submenu-inline>.ant-menu-submenu-title .ant-menu-submenu-arrow:before{-webkit-transform:rotate(45deg) translateX(2px);-ms-transform:rotate(45deg) translateX(2px);transform:rotate(45deg) translateX(2px)}.ant-menu-vertical-left .ant-menu-submenu-selected,.ant-menu-vertical-left .ant-menu-submenu-selected>a,.ant-menu-vertical-right .ant-menu-submenu-selected,.ant-menu-vertical-right .ant-menu-submenu-selected>a,.ant-menu-vertical .ant-menu-submenu-selected,.ant-menu-vertical .ant-menu-submenu-selected>a{color:#1890ff}.ant-menu-horizontal{border:0;border-bottom:1px solid #e8e8e8;-webkit-box-shadow:none;box-shadow:none;line-height:46px;white-space:nowrap}.ant-menu-horizontal>.ant-menu-item,.ant-menu-horizontal>.ant-menu-submenu{position:relative;top:1px;display:inline-block;vertical-align:bottom;border-bottom:2px solid transparent}.ant-menu-horizontal>.ant-menu-item-active,.ant-menu-horizontal>.ant-menu-item-open,.ant-menu-horizontal>.ant-menu-item-selected,.ant-menu-horizontal>.ant-menu-item:hover,.ant-menu-horizontal>.ant-menu-submenu-active,.ant-menu-horizontal>.ant-menu-submenu-open,.ant-menu-horizontal>.ant-menu-submenu-selected,.ant-menu-horizontal>.ant-menu-submenu:hover{border-bottom:2px solid #1890ff;color:#1890ff}.ant-menu-horizontal>.ant-menu-item>a{display:block;color:rgba(0,0,0,.65)}.ant-menu-horizontal>.ant-menu-item>a:hover{color:#1890ff}.ant-menu-horizontal>.ant-menu-item>a:before{bottom:-2px}.ant-menu-horizontal>.ant-menu-item-selected>a{color:#1890ff}.ant-menu-horizontal:after{content:" ";display:block;height:0;clear:both}.ant-menu-inline .ant-menu-item,.ant-menu-vertical-left .ant-menu-item,.ant-menu-vertical-right .ant-menu-item,.ant-menu-vertical .ant-menu-item{position:relative}.ant-menu-inline .ant-menu-item:after,.ant-menu-vertical-left .ant-menu-item:after,.ant-menu-vertical-right .ant-menu-item:after,.ant-menu-vertical .ant-menu-item:after{content:"";position:absolute;right:0;top:0;bottom:0;border-right:3px solid #1890ff;-webkit-transform:scaleY(.0001);-ms-transform:scaleY(.0001);transform:scaleY(.0001);opacity:0;-webkit-transition:opacity .15s cubic-bezier(.215,.61,.355,1),-webkit-transform .15s cubic-bezier(.215,.61,.355,1);transition:opacity .15s cubic-bezier(.215,.61,.355,1),-webkit-transform .15s cubic-bezier(.215,.61,.355,1);transition:transform .15s cubic-bezier(.215,.61,.355,1),opacity .15s cubic-bezier(.215,.61,.355,1);transition:transform .15s cubic-bezier(.215,.61,.355,1),opacity .15s cubic-bezier(.215,.61,.355,1),-webkit-transform .15s cubic-bezier(.215,.61,.355,1)}.ant-menu-inline .ant-menu-item,.ant-menu-inline .ant-menu-submenu-title,.ant-menu-vertical-left .ant-menu-item,.ant-menu-vertical-left .ant-menu-submenu-title,.ant-menu-vertical-right .ant-menu-item,.ant-menu-vertical-right .ant-menu-submenu-title,.ant-menu-vertical .ant-menu-item,.ant-menu-vertical .ant-menu-submenu-title{padding:0 16px;font-size:14px;line-height:40px;height:40px;margin-top:4px;margin-bottom:4px;overflow:hidden;text-overflow:ellipsis}.ant-menu-inline .ant-menu-submenu,.ant-menu-vertical-left .ant-menu-submenu,.ant-menu-vertical-right .ant-menu-submenu,.ant-menu-vertical .ant-menu-submenu{padding-bottom:.01px}.ant-menu-inline .ant-menu-item:not(:last-child),.ant-menu-vertical-left .ant-menu-item:not(:last-child),.ant-menu-vertical-right .ant-menu-item:not(:last-child),.ant-menu-vertical .ant-menu-item:not(:last-child){margin-bottom:8px}.ant-menu-inline>.ant-menu-item,.ant-menu-inline>.ant-menu-submenu>.ant-menu-submenu-title,.ant-menu-vertical-left>.ant-menu-item,.ant-menu-vertical-left>.ant-menu-submenu>.ant-menu-submenu-title,.ant-menu-vertical-right>.ant-menu-item,.ant-menu-vertical-right>.ant-menu-submenu>.ant-menu-submenu-title,.ant-menu-vertical>.ant-menu-item,.ant-menu-vertical>.ant-menu-submenu>.ant-menu-submenu-title{line-height:40px;height:40px}.ant-menu-inline{width:100%}.ant-menu-inline .ant-menu-item-selected:after,.ant-menu-inline .ant-menu-selected:after{-webkit-transition:opacity .15s cubic-bezier(.645,.045,.355,1),-webkit-transform .15s cubic-bezier(.645,.045,.355,1);transition:opacity .15s cubic-bezier(.645,.045,.355,1),-webkit-transform .15s cubic-bezier(.645,.045,.355,1);transition:transform .15s cubic-bezier(.645,.045,.355,1),opacity .15s cubic-bezier(.645,.045,.355,1);transition:transform .15s cubic-bezier(.645,.045,.355,1),opacity .15s cubic-bezier(.645,.045,.355,1),-webkit-transform .15s cubic-bezier(.645,.045,.355,1);opacity:1;-webkit-transform:scaleY(1);-ms-transform:scaleY(1);transform:scaleY(1)}.ant-menu-inline .ant-menu-item,.ant-menu-inline .ant-menu-submenu-title{width:calc(100% + 1px)}.ant-menu-inline .ant-menu-submenu-title{padding-right:34px}.ant-menu-inline-collapsed{width:80px}.ant-menu-inline-collapsed>.ant-menu-item,.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item,.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title,.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title{left:0;text-overflow:clip;padding:0 32px!important}.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item .ant-menu-submenu-arrow,.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu-inline-collapsed>.ant-menu-item .ant-menu-submenu-arrow,.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title .ant-menu-submenu-arrow{display:none}.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item .anticon,.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title .anticon,.ant-menu-inline-collapsed>.ant-menu-item .anticon,.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title .anticon{font-size:16px;line-height:40px;margin:0}.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-item .anticon+span,.ant-menu-inline-collapsed>.ant-menu-item-group>.ant-menu-item-group-list>.ant-menu-submenu>.ant-menu-submenu-title .anticon+span,.ant-menu-inline-collapsed>.ant-menu-item .anticon+span,.ant-menu-inline-collapsed>.ant-menu-submenu>.ant-menu-submenu-title .anticon+span{max-width:0;display:inline-block;opacity:0}.ant-menu-inline-collapsed-tooltip{pointer-events:none}.ant-menu-inline-collapsed-tooltip .anticon{display:none}.ant-menu-inline-collapsed-tooltip a{color:hsla(0,0%,100%,.85)}.ant-menu-inline-collapsed .ant-menu-item-group-title{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding-left:4px;padding-right:4px}.ant-menu-item-group-list{margin:0;padding:0}.ant-menu-item-group-list .ant-menu-item,.ant-menu-item-group-list .ant-menu-submenu-title{padding:0 16px 0 28px}.ant-menu-root.ant-menu-inline,.ant-menu-root.ant-menu-vertical,.ant-menu-root.ant-menu-vertical-left,.ant-menu-root.ant-menu-vertical-right,.ant-menu-sub.ant-menu-inline{-webkit-box-shadow:none;box-shadow:none}.ant-menu-sub.ant-menu-inline{padding:0;border:0;border-radius:0}.ant-menu-sub.ant-menu-inline>.ant-menu-item,.ant-menu-sub.ant-menu-inline>.ant-menu-submenu>.ant-menu-submenu-title{line-height:40px;height:40px;list-style-type:disc;list-style-position:inside}.ant-menu-sub.ant-menu-inline .ant-menu-item-group-title{padding-left:32px}.ant-menu-item-disabled,.ant-menu-submenu-disabled{color:rgba(0,0,0,.25)!important;cursor:not-allowed;background:none;border-color:transparent!important}.ant-menu-item-disabled>a,.ant-menu-submenu-disabled>a{color:rgba(0,0,0,.25)!important;pointer-events:none}.ant-menu-item-disabled>.ant-menu-submenu-title,.ant-menu-submenu-disabled>.ant-menu-submenu-title{color:rgba(0,0,0,.25)!important;cursor:not-allowed}.ant-menu-item-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-item-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-submenu-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-submenu-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before{background:rgba(0,0,0,.25)!important}.ant-menu-dark,.ant-menu-dark .ant-menu-sub{color:hsla(0,0%,100%,.65);background:#001529}.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow{opacity:.45;-webkit-transition:all .3s;transition:all .3s}.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-sub .ant-menu-submenu-title .ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-title .ant-menu-submenu-arrow:before{background:#fff}.ant-menu-dark.ant-menu-submenu-popup{background:transparent}.ant-menu-dark .ant-menu-inline.ant-menu-sub{background:#000c17;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.45) inset;box-shadow:inset 0 2px 8px rgba(0,0,0,.45)}.ant-menu-dark.ant-menu-horizontal{border-bottom:0}.ant-menu-dark.ant-menu-horizontal>.ant-menu-item,.ant-menu-dark.ant-menu-horizontal>.ant-menu-submenu{border-color:#001529;border-bottom:0;top:0;margin-top:0}.ant-menu-dark.ant-menu-horizontal>.ant-menu-item>a:before{bottom:0}.ant-menu-dark .ant-menu-item,.ant-menu-dark .ant-menu-item-group-title,.ant-menu-dark .ant-menu-item>a{color:hsla(0,0%,100%,.65)}.ant-menu-dark.ant-menu-inline,.ant-menu-dark.ant-menu-vertical,.ant-menu-dark.ant-menu-vertical-left,.ant-menu-dark.ant-menu-vertical-right{border-right:0}.ant-menu-dark.ant-menu-inline .ant-menu-item,.ant-menu-dark.ant-menu-vertical-left .ant-menu-item,.ant-menu-dark.ant-menu-vertical-right .ant-menu-item,.ant-menu-dark.ant-menu-vertical .ant-menu-item{border-right:0;margin-left:0;left:0}.ant-menu-dark.ant-menu-inline .ant-menu-item:after,.ant-menu-dark.ant-menu-vertical-left .ant-menu-item:after,.ant-menu-dark.ant-menu-vertical-right .ant-menu-item:after,.ant-menu-dark.ant-menu-vertical .ant-menu-item:after{border-right:0}.ant-menu-dark.ant-menu-inline .ant-menu-item,.ant-menu-dark.ant-menu-inline .ant-menu-submenu-title{width:100%}.ant-menu-dark .ant-menu-item-active,.ant-menu-dark .ant-menu-item:hover,.ant-menu-dark .ant-menu-submenu-active,.ant-menu-dark .ant-menu-submenu-open,.ant-menu-dark .ant-menu-submenu-selected,.ant-menu-dark .ant-menu-submenu-title:hover{background-color:transparent;color:#fff}.ant-menu-dark .ant-menu-item-active>a,.ant-menu-dark .ant-menu-item:hover>a,.ant-menu-dark .ant-menu-submenu-active>a,.ant-menu-dark .ant-menu-submenu-open>a,.ant-menu-dark .ant-menu-submenu-selected>a,.ant-menu-dark .ant-menu-submenu-title:hover>a{color:#fff}.ant-menu-dark .ant-menu-item-active>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-item-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-item:hover>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-item:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-active>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-open>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-open>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-selected>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-selected>.ant-menu-submenu-title>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-title:hover>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow,.ant-menu-dark .ant-menu-submenu-title:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow{opacity:1}.ant-menu-dark .ant-menu-item-active>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-item-active>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-item-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-item-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-item:hover>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-item:hover>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-item:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-item:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-active>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-active>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-active>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-open>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-open>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-open>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-open>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-selected>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-selected>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-selected>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-selected>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-title:hover>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-title:hover>.ant-menu-submenu-title:hover>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-title:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-title:hover>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before{background:#fff}.ant-menu-dark .ant-menu-item-selected{border-right:0;color:#fff}.ant-menu-dark .ant-menu-item-selected:after{border-right:0}.ant-menu-dark .ant-menu-item-selected>a,.ant-menu-dark .ant-menu-item-selected>a:hover{color:#fff}.ant-menu-submenu-popup.ant-menu-dark .ant-menu-item-selected,.ant-menu.ant-menu-dark .ant-menu-item-selected{background-color:#1890ff}.ant-menu-dark .ant-menu-item-disabled,.ant-menu-dark .ant-menu-item-disabled>a,.ant-menu-dark .ant-menu-submenu-disabled,.ant-menu-dark .ant-menu-submenu-disabled>a{opacity:.8;color:hsla(0,0%,100%,.35)!important}.ant-menu-dark .ant-menu-item-disabled>.ant-menu-submenu-title,.ant-menu-dark .ant-menu-submenu-disabled>.ant-menu-submenu-title{color:hsla(0,0%,100%,.35)!important}.ant-menu-dark .ant-menu-item-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-item-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before,.ant-menu-dark .ant-menu-submenu-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:after,.ant-menu-dark .ant-menu-submenu-disabled>.ant-menu-submenu-title>.ant-menu-submenu-arrow:before{background:hsla(0,0%,100%,.35)!important}.ant-tooltip{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;position:absolute;z-index:1060;display:block;visibility:visible;max-width:250px}.ant-tooltip-hidden{display:none}.ant-tooltip-placement-top,.ant-tooltip-placement-topLeft,.ant-tooltip-placement-topRight{padding-bottom:8px}.ant-tooltip-placement-right,.ant-tooltip-placement-rightBottom,.ant-tooltip-placement-rightTop{padding-left:8px}.ant-tooltip-placement-bottom,.ant-tooltip-placement-bottomLeft,.ant-tooltip-placement-bottomRight{padding-top:8px}.ant-tooltip-placement-left,.ant-tooltip-placement-leftBottom,.ant-tooltip-placement-leftTop{padding-right:8px}.ant-tooltip-inner{padding:6px 8px;color:#fff;text-align:left;text-decoration:none;background-color:rgba(0,0,0,.75);border-radius:4px;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.15);box-shadow:0 2px 8px rgba(0,0,0,.15);min-height:32px;word-wrap:break-word}.ant-tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.ant-tooltip-placement-top .ant-tooltip-arrow,.ant-tooltip-placement-topLeft .ant-tooltip-arrow,.ant-tooltip-placement-topRight .ant-tooltip-arrow{bottom:3px;border-width:5px 5px 0;border-top-color:rgba(0,0,0,.75)}.ant-tooltip-placement-top .ant-tooltip-arrow{left:50%;margin-left:-5px}.ant-tooltip-placement-topLeft .ant-tooltip-arrow{left:16px}.ant-tooltip-placement-topRight .ant-tooltip-arrow{right:16px}.ant-tooltip-placement-right .ant-tooltip-arrow,.ant-tooltip-placement-rightBottom .ant-tooltip-arrow,.ant-tooltip-placement-rightTop .ant-tooltip-arrow{left:3px;border-width:5px 5px 5px 0;border-right-color:rgba(0,0,0,.75)}.ant-tooltip-placement-right .ant-tooltip-arrow{top:50%;margin-top:-5px}.ant-tooltip-placement-rightTop .ant-tooltip-arrow{top:8px}.ant-tooltip-placement-rightBottom .ant-tooltip-arrow{bottom:8px}.ant-tooltip-placement-left .ant-tooltip-arrow,.ant-tooltip-placement-leftBottom .ant-tooltip-arrow,.ant-tooltip-placement-leftTop .ant-tooltip-arrow{right:3px;border-width:5px 0 5px 5px;border-left-color:rgba(0,0,0,.75)}.ant-tooltip-placement-left .ant-tooltip-arrow{top:50%;margin-top:-5px}.ant-tooltip-placement-leftTop .ant-tooltip-arrow{top:8px}.ant-tooltip-placement-leftBottom .ant-tooltip-arrow{bottom:8px}.ant-tooltip-placement-bottom .ant-tooltip-arrow,.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow,.ant-tooltip-placement-bottomRight .ant-tooltip-arrow{top:3px;border-width:0 5px 5px;border-bottom-color:rgba(0,0,0,.75)}.ant-tooltip-placement-bottom .ant-tooltip-arrow{left:50%;margin-left:-5px}.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow{left:16px}.ant-tooltip-placement-bottomRight .ant-tooltip-arrow{right:16px}.ant-message{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;position:fixed;z-index:1010;width:100%;top:16px;left:0;pointer-events:none}.ant-message-notice{padding:8px;text-align:center}.ant-message-notice:first-child{margin-top:-8px}.ant-message-notice-content{padding:10px 16px;border-radius:4px;-webkit-box-shadow:0 4px 12px rgba(0,0,0,.15);box-shadow:0 4px 12px rgba(0,0,0,.15);background:#fff;display:inline-block;pointer-events:all}.ant-message-success .anticon{color:#52c41a}.ant-message-error .anticon{color:#f5222d}.ant-message-warning .anticon{color:#faad14}.ant-message-info .anticon,.ant-message-loading .anticon{color:#1890ff}.ant-message .anticon{margin-right:8px;font-size:16px;top:1px;position:relative}.ant-message-notice.move-up-leave.move-up-leave-active{-webkit-animation-name:MessageMoveOut;animation-name:MessageMoveOut;overflow:hidden;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes MessageMoveOut{0%{opacity:1;max-height:150px;padding:8px}to{opacity:0;max-height:0;padding:0}}@keyframes MessageMoveOut{0%{opacity:1;max-height:150px;padding:8px}to{opacity:0;max-height:0;padding:0}}.ant-modal{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;position:relative;width:auto;margin:0 auto;top:100px;padding-bottom:24px}.ant-modal-wrap{position:fixed;overflow:auto;top:0;right:0;bottom:0;left:0;z-index:1000;-webkit-overflow-scrolling:touch;outline:0}.ant-modal-title{margin:0;font-size:16px;line-height:22px;font-weight:500;color:rgba(0,0,0,.85)}.ant-modal-content{position:relative;background-color:#fff;border:0;border-radius:4px;background-clip:padding-box;-webkit-box-shadow:0 4px 12px rgba(0,0,0,.15);box-shadow:0 4px 12px rgba(0,0,0,.15)}.ant-modal-close{cursor:pointer;border:0;background:transparent;position:absolute;right:0;top:0;z-index:10;font-weight:700;line-height:1;text-decoration:none;-webkit-transition:color .3s;transition:color .3s;color:rgba(0,0,0,.45);outline:0;padding:0}.ant-modal-close-x{display:block;font-style:normal;vertical-align:baseline;text-align:center;text-transform:none;text-rendering:auto;width:56px;height:56px;line-height:56px;font-size:16px}.ant-modal-close:focus,.ant-modal-close:hover{color:#444;text-decoration:none}.ant-modal-header{padding:16px 24px;border-radius:4px 4px 0 0;background:#fff;color:rgba(0,0,0,.65);border-bottom:1px solid #e8e8e8}.ant-modal-body{padding:24px;font-size:14px;line-height:1.5;word-wrap:break-word}.ant-modal-footer{border-top:1px solid #e8e8e8;padding:10px 16px;text-align:right;border-radius:0 0 4px 4px}.ant-modal-footer button+button{margin-left:8px;margin-bottom:0}.ant-modal.zoom-appear,.ant-modal.zoom-enter{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-transform:none;-ms-transform:none;transform:none;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-modal-mask{position:fixed;top:0;right:0;left:0;bottom:0;background-color:rgba(0,0,0,.65);height:100%;z-index:1000;filter:alpha(opacity=50)}.ant-modal-mask-hidden{display:none}.ant-modal-open{overflow:hidden}.ant-modal-centered{text-align:center}.ant-modal-centered:before{content:"";display:inline-block;height:100%;vertical-align:middle;width:0}.ant-modal-centered .ant-modal{display:inline-block;vertical-align:middle;top:0;text-align:left}@media (max-width:767px){.ant-modal{width:auto!important;margin:10px}.ant-modal-centered .ant-modal{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}}.ant-confirm .ant-modal-close,.ant-confirm .ant-modal-header{display:none}.ant-confirm .ant-modal-body{padding:32px 32px 24px}.ant-confirm-body-wrapper{zoom:1}.ant-confirm-body-wrapper:after,.ant-confirm-body-wrapper:before{content:"";display:table}.ant-confirm-body-wrapper:after{clear:both}.ant-confirm-body .ant-confirm-title{color:rgba(0,0,0,.85);font-weight:500;font-size:16px;line-height:1.4;display:block;overflow:hidden}.ant-confirm-body .ant-confirm-content{margin-left:38px;font-size:14px;color:rgba(0,0,0,.65);margin-top:8px}.ant-confirm-body>.anticon{font-size:22px;margin-right:16px;float:left}.ant-confirm .ant-confirm-btns{margin-top:24px;float:right}.ant-confirm .ant-confirm-btns button+button{margin-left:8px;margin-bottom:0}.ant-confirm-error .ant-confirm-body>.anticon{color:#f5222d}.ant-confirm-confirm .ant-confirm-body>.anticon,.ant-confirm-warning .ant-confirm-body>.anticon{color:#faad14}.ant-confirm-info .ant-confirm-body>.anticon{color:#1890ff}.ant-confirm-success .ant-confirm-body>.anticon{color:#52c41a}.ant-notification{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;position:fixed;z-index:1010;width:384px;max-width:calc(100vw - 32px);margin-right:24px}.ant-notification-bottomLeft,.ant-notification-topLeft{margin-left:24px;margin-right:0}.ant-notification-bottomLeft .ant-notification-fade-appear.ant-notification-fade-appear-active,.ant-notification-bottomLeft .ant-notification-fade-enter.ant-notification-fade-enter-active,.ant-notification-topLeft .ant-notification-fade-appear.ant-notification-fade-appear-active,.ant-notification-topLeft .ant-notification-fade-enter.ant-notification-fade-enter-active{-webkit-animation-name:NotificationLeftFadeIn;animation-name:NotificationLeftFadeIn}.ant-notification-close-icon{font-size:14px;cursor:pointer}.ant-notification-notice{padding:16px 24px;border-radius:4px;-webkit-box-shadow:0 4px 12px rgba(0,0,0,.15);box-shadow:0 4px 12px rgba(0,0,0,.15);background:#fff;line-height:1.5;position:relative;margin-bottom:16px;overflow:hidden}.ant-notification-notice-message{font-size:16px;color:rgba(0,0,0,.85);margin-bottom:8px;line-height:24px;display:inline-block}.ant-notification-notice-message-single-line-auto-margin{width:calc(384px - 24px * 2 - 24px - 48px - 100%);background-color:transparent;pointer-events:none;display:block;max-width:4px}.ant-notification-notice-message-single-line-auto-margin:before{content:"";display:block}.ant-notification-notice-description{font-size:14px}.ant-notification-notice-closable .ant-notification-notice-message{padding-right:24px}.ant-notification-notice-with-icon .ant-notification-notice-message{font-size:16px;margin-left:48px;margin-bottom:4px}.ant-notification-notice-with-icon .ant-notification-notice-description{margin-left:48px;font-size:14px}.ant-notification-notice-icon{position:absolute;font-size:24px;line-height:24px;margin-left:4px}.ant-notification-notice-icon-success{color:#52c41a}.ant-notification-notice-icon-info{color:#1890ff}.ant-notification-notice-icon-warning{color:#faad14}.ant-notification-notice-icon-error{color:#f5222d}.ant-notification-notice-close{position:absolute;right:22px;top:16px;color:rgba(0,0,0,.45);outline:none}a.ant-notification-notice-close:focus{text-decoration:none}.ant-notification-notice-close:hover{color:rgba(0,0,0,.67)}.ant-notification-notice-btn{float:right;margin-top:16px}.ant-notification .notification-fade-effect{-webkit-animation-duration:.24s;animation-duration:.24s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:cubic-bezier(.645,.045,.355,1);animation-timing-function:cubic-bezier(.645,.045,.355,1)}.ant-notification-fade-appear,.ant-notification-fade-enter{opacity:0;-webkit-animation-play-state:paused;animation-play-state:paused}.ant-notification-fade-appear,.ant-notification-fade-enter,.ant-notification-fade-leave{-webkit-animation-duration:.24s;animation-duration:.24s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:cubic-bezier(.645,.045,.355,1);animation-timing-function:cubic-bezier(.645,.045,.355,1)}.ant-notification-fade-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-play-state:paused;animation-play-state:paused}.ant-notification-fade-appear.ant-notification-fade-appear-active,.ant-notification-fade-enter.ant-notification-fade-enter-active{-webkit-animation-name:NotificationFadeIn;animation-name:NotificationFadeIn;-webkit-animation-play-state:running;animation-play-state:running}.ant-notification-fade-leave.ant-notification-fade-leave-active{-webkit-animation-name:NotificationFadeOut;animation-name:NotificationFadeOut;-webkit-animation-play-state:running;animation-play-state:running}@-webkit-keyframes NotificationFadeIn{0%{opacity:0;left:384px}to{left:0;opacity:1}}@keyframes NotificationFadeIn{0%{opacity:0;left:384px}to{left:0;opacity:1}}@-webkit-keyframes NotificationLeftFadeIn{0%{opacity:0;right:384px}to{right:0;opacity:1}}@keyframes NotificationLeftFadeIn{0%{opacity:0;right:384px}to{right:0;opacity:1}}@-webkit-keyframes NotificationFadeOut{0%{opacity:1;margin-bottom:16px;padding-top:16px 24px;padding-bottom:16px 24px;max-height:150px}to{opacity:0;margin-bottom:0;padding-top:0;padding-bottom:0;max-height:0}}@keyframes NotificationFadeOut{0%{opacity:1;margin-bottom:16px;padding-top:16px 24px;padding-bottom:16px 24px;max-height:150px}to{opacity:0;margin-bottom:0;padding-top:0;padding-bottom:0;max-height:0}}.ant-popover{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;position:absolute;top:0;left:0;z-index:1030;cursor:auto;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;white-space:normal;font-weight:400;text-align:left}.ant-popover:after{content:"";position:absolute;background:hsla(0,0%,100%,.01)}.ant-popover-hidden{display:none}.ant-popover-placement-top,.ant-popover-placement-topLeft,.ant-popover-placement-topRight{padding-bottom:10px}.ant-popover-placement-right,.ant-popover-placement-rightBottom,.ant-popover-placement-rightTop{padding-left:10px}.ant-popover-placement-bottom,.ant-popover-placement-bottomLeft,.ant-popover-placement-bottomRight{padding-top:10px}.ant-popover-placement-left,.ant-popover-placement-leftBottom,.ant-popover-placement-leftTop{padding-right:10px}.ant-popover-inner{background-color:#fff;background-clip:padding-box;border-radius:4px;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.15);box-shadow:0 2px 8px rgba(0,0,0,.15)}.ant-popover-title{min-width:177px;margin:0;padding:5px 16px 4px;min-height:32px;border-bottom:1px solid #e8e8e8;color:rgba(0,0,0,.85);font-weight:500}.ant-popover-inner-content{padding:12px 16px;color:rgba(0,0,0,.65)}.ant-popover-message{padding:4px 0 12px;font-size:14px;color:rgba(0,0,0,.65);position:relative}.ant-popover-message>.anticon{position:absolute;top:8px;color:#faad14;font-size:14px}.ant-popover-message-title{padding-left:22px}.ant-popover-buttons{text-align:right;margin-bottom:4px}.ant-popover-buttons button{margin-left:8px}.ant-popover-arrow{background:#fff;width:8.48528137px;height:8.48528137px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);position:absolute;display:block;border-color:transparent;border-style:solid}.ant-popover-placement-top>.ant-popover-content>.ant-popover-arrow,.ant-popover-placement-topLeft>.ant-popover-content>.ant-popover-arrow,.ant-popover-placement-topRight>.ant-popover-content>.ant-popover-arrow{bottom:5.5px;-webkit-box-shadow:3px 3px 7px rgba(0,0,0,.07);box-shadow:3px 3px 7px rgba(0,0,0,.07)}.ant-popover-placement-top>.ant-popover-content>.ant-popover-arrow{left:50%;-webkit-transform:translateX(-50%) rotate(45deg);-ms-transform:translateX(-50%) rotate(45deg);transform:translateX(-50%) rotate(45deg)}.ant-popover-placement-topLeft>.ant-popover-content>.ant-popover-arrow{left:16px}.ant-popover-placement-topRight>.ant-popover-content>.ant-popover-arrow{right:16px}.ant-popover-placement-right>.ant-popover-content>.ant-popover-arrow,.ant-popover-placement-rightBottom>.ant-popover-content>.ant-popover-arrow,.ant-popover-placement-rightTop>.ant-popover-content>.ant-popover-arrow{left:6px;-webkit-box-shadow:-3px 3px 7px rgba(0,0,0,.07);box-shadow:-3px 3px 7px rgba(0,0,0,.07)}.ant-popover-placement-right>.ant-popover-content>.ant-popover-arrow{top:50%;-webkit-transform:translateY(-50%) rotate(45deg);-ms-transform:translateY(-50%) rotate(45deg);transform:translateY(-50%) rotate(45deg)}.ant-popover-placement-rightTop>.ant-popover-content>.ant-popover-arrow{top:12px}.ant-popover-placement-rightBottom>.ant-popover-content>.ant-popover-arrow{bottom:12px}.ant-popover-placement-bottom>.ant-popover-content>.ant-popover-arrow,.ant-popover-placement-bottomLeft>.ant-popover-content>.ant-popover-arrow,.ant-popover-placement-bottomRight>.ant-popover-content>.ant-popover-arrow{top:6px;-webkit-box-shadow:-2px -2px 5px rgba(0,0,0,.06);box-shadow:-2px -2px 5px rgba(0,0,0,.06)}.ant-popover-placement-bottom>.ant-popover-content>.ant-popover-arrow{left:50%;-webkit-transform:translateX(-50%) rotate(45deg);-ms-transform:translateX(-50%) rotate(45deg);transform:translateX(-50%) rotate(45deg)}.ant-popover-placement-bottomLeft>.ant-popover-content>.ant-popover-arrow{left:16px}.ant-popover-placement-bottomRight>.ant-popover-content>.ant-popover-arrow{right:16px}.ant-popover-placement-left>.ant-popover-content>.ant-popover-arrow,.ant-popover-placement-leftBottom>.ant-popover-content>.ant-popover-arrow,.ant-popover-placement-leftTop>.ant-popover-content>.ant-popover-arrow{right:6px;-webkit-box-shadow:3px -3px 7px rgba(0,0,0,.07);box-shadow:3px -3px 7px rgba(0,0,0,.07)}.ant-popover-placement-left>.ant-popover-content>.ant-popover-arrow{top:50%;-webkit-transform:translateY(-50%) rotate(45deg);-ms-transform:translateY(-50%) rotate(45deg);transform:translateY(-50%) rotate(45deg)}.ant-popover-placement-leftTop>.ant-popover-content>.ant-popover-arrow{top:12px}.ant-popover-placement-leftBottom>.ant-popover-content>.ant-popover-arrow{bottom:12px}.ant-progress{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;display:inline-block}.ant-progress-line{width:100%;font-size:14px;position:relative}.ant-progress-small.ant-progress-line,.ant-progress-small.ant-progress-line .ant-progress-text .anticon{font-size:12px}.ant-progress-outer{display:inline-block;width:100%;margin-right:0;padding-right:0}.ant-progress-show-info .ant-progress-outer{padding-right:calc(2em + 8px);margin-right:calc(-2em - 8px)}.ant-progress-inner{display:inline-block;width:100%;background-color:#f5f5f5;border-radius:100px;vertical-align:middle;position:relative}.ant-progress-circle-trail{stroke:#f5f5f5}.ant-progress-circle-path{stroke:#1890ff;-webkit-animation:ant-progress-appear .3s;animation:ant-progress-appear .3s}.ant-progress-bg,.ant-progress-success-bg{background-color:#1890ff;-webkit-transition:all .4s cubic-bezier(.08,.82,.17,1) 0s;transition:all .4s cubic-bezier(.08,.82,.17,1) 0s;position:relative}.ant-progress-success-bg{background-color:#52c41a;position:absolute;top:0;left:0}.ant-progress-text{word-break:normal;width:2em;text-align:left;font-size:1em;margin-left:8px;vertical-align:middle;display:inline-block;white-space:nowrap;color:rgba(0,0,0,.45);line-height:1}.ant-progress-text .anticon{font-size:14px}.ant-progress-status-active .ant-progress-bg:before{content:"";opacity:0;position:absolute;top:0;left:0;right:0;bottom:0;background:#fff;border-radius:10px;-webkit-animation:ant-progress-active 2.4s cubic-bezier(.23,1,.32,1) infinite;animation:ant-progress-active 2.4s cubic-bezier(.23,1,.32,1) infinite}.ant-progress-status-exception .ant-progress-bg{background-color:#f5222d}.ant-progress-status-exception .ant-progress-text{color:#f5222d}.ant-progress-status-exception .ant-progress-circle-path{stroke:#f5222d}.ant-progress-status-success .ant-progress-bg{background-color:#52c41a}.ant-progress-status-success .ant-progress-text{color:#52c41a}.ant-progress-status-success .ant-progress-circle-path{stroke:#52c41a}.ant-progress-circle .ant-progress-inner{position:relative;line-height:1;background-color:transparent}.ant-progress-circle .ant-progress-text{display:block;position:absolute;width:100%;text-align:center;line-height:1;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);left:0;margin:0;color:rgba(0,0,0,.65)}.ant-progress-circle .ant-progress-text .anticon{font-size:1.16666667em}.ant-progress-circle.ant-progress-status-exception .ant-progress-text{color:#f5222d}.ant-progress-circle.ant-progress-status-success .ant-progress-text{color:#52c41a}@-webkit-keyframes ant-progress-active{0%{opacity:.1;width:0}20%{opacity:.5;width:0}to{opacity:0;width:100%}}@keyframes ant-progress-active{0%{opacity:.1;width:0}20%{opacity:.5;width:0}to{opacity:0;width:100%}}.ant-rate{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;line-height:unset;margin:0;padding:0;list-style:none;font-size:20px;display:inline-block;color:#fadb14;outline:none}.ant-rate-disabled .ant-rate-star{cursor:default}.ant-rate-disabled .ant-rate-star:hover{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}.ant-rate-star{margin:0;padding:0;display:inline-block;margin-right:8px;position:relative;-webkit-transition:all .3s;transition:all .3s;color:inherit;cursor:pointer}.ant-rate-star:focus{outline:0}.ant-rate-star-first,.ant-rate-star-second{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .3s;transition:all .3s;color:#e8e8e8}.ant-rate-star-first .anticon,.ant-rate-star-second .anticon{vertical-align:middle}.ant-rate-star:focus,.ant-rate-star:hover{-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)}.ant-rate-star-first{position:absolute;left:0;top:0;width:50%;height:100%;overflow:hidden;opacity:0}.ant-rate-star-half .ant-rate-star-first,.ant-rate-star-half .ant-rate-star-second{opacity:1}.ant-rate-star-full .ant-rate-star-second,.ant-rate-star-half .ant-rate-star-first{color:inherit}.ant-rate-text{margin-left:8px;display:inline-block;font-size:14px}.ant-skeleton{display:table;width:100%}.ant-skeleton-header{display:table-cell;vertical-align:top;padding-right:16px}.ant-skeleton-header .ant-skeleton-avatar{display:inline-block;vertical-align:top;background:#f2f2f2;width:32px;height:32px;line-height:32px}.ant-skeleton-header .ant-skeleton-avatar.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-header .ant-skeleton-avatar-lg{width:40px;height:40px;line-height:40px}.ant-skeleton-header .ant-skeleton-avatar-lg.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-header .ant-skeleton-avatar-sm{width:24px;height:24px;line-height:24px}.ant-skeleton-header .ant-skeleton-avatar-sm.ant-skeleton-avatar-circle{border-radius:50%}.ant-skeleton-content{display:table-cell;vertical-align:top;width:100%}.ant-skeleton-content .ant-skeleton-title{margin-top:16px;height:16px;width:100%;background:#f2f2f2}.ant-skeleton-content .ant-skeleton-title+.ant-skeleton-paragraph{margin-top:24px}.ant-skeleton-content .ant-skeleton-paragraph>li{height:16px;background:#f2f2f2;list-style:none;width:100%}.ant-skeleton-content .ant-skeleton-paragraph>li:last-child:not(:first-child):not(:nth-child(2)){width:61%}.ant-skeleton-content .ant-skeleton-paragraph>li+li{margin-top:16px}.ant-skeleton-with-avatar .ant-skeleton-content .ant-skeleton-title{margin-top:12px}.ant-skeleton-with-avatar .ant-skeleton-content .ant-skeleton-title+.ant-skeleton-paragraph{margin-top:28px}.ant-skeleton.ant-skeleton-active .ant-skeleton-avatar,.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-paragraph>li,.ant-skeleton.ant-skeleton-active .ant-skeleton-content .ant-skeleton-title{background:-webkit-gradient(linear,left top,right top,color-stop(25%,#f2f2f2),color-stop(37%,#e6e6e6),color-stop(63%,#f2f2f2));background:-webkit-linear-gradient(left,#f2f2f2 25%,#e6e6e6 37%,#f2f2f2 63%);background:linear-gradient(90deg,#f2f2f2 25%,#e6e6e6 37%,#f2f2f2 63%);-webkit-animation:ant-skeleton-loading 1.4s ease infinite;animation:ant-skeleton-loading 1.4s ease infinite;background-size:400% 100%}@-webkit-keyframes ant-skeleton-loading{0%{background-position:100% 50%}to{background-position:0 50%}}@keyframes ant-skeleton-loading{0%{background-position:100% 50%}to{background-position:0 50%}}.ant-slider{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;position:relative;margin:14px 6px 10px;padding:4px 0;height:12px;cursor:pointer}.ant-slider-vertical{width:12px;height:100%;margin:6px 10px;padding:0 4px}.ant-slider-vertical .ant-slider-rail{height:100%;width:4px}.ant-slider-vertical .ant-slider-track{width:4px}.ant-slider-vertical .ant-slider-handle{margin-left:-5px;margin-bottom:-7px}.ant-slider-vertical .ant-slider-mark{top:0;left:12px;width:18px;height:100%}.ant-slider-vertical .ant-slider-mark-text{left:4px;white-space:nowrap}.ant-slider-vertical .ant-slider-step{width:4px;height:100%}.ant-slider-vertical .ant-slider-dot{top:auto;left:2px;margin-bottom:-4px}.ant-slider-with-marks{margin-bottom:28px}.ant-slider-rail{position:absolute;width:100%;height:4px;border-radius:2px;background-color:#f5f5f5;-webkit-transition:background-color .3s;transition:background-color .3s}.ant-slider-track{position:absolute;height:4px;border-radius:4px;background-color:#91d5ff;-webkit-transition:background-color .3s ease;transition:background-color .3s ease}.ant-slider-handle{position:absolute;margin-left:-7px;margin-top:-5px;width:14px;height:14px;cursor:pointer;border-radius:50%;border:2px solid #91d5ff;background-color:#fff;-webkit-transition:border-color .3s,-webkit-transform .3s cubic-bezier(.18,.89,.32,1.28);transition:border-color .3s,-webkit-transform .3s cubic-bezier(.18,.89,.32,1.28);transition:border-color .3s,transform .3s cubic-bezier(.18,.89,.32,1.28);transition:border-color .3s,transform .3s cubic-bezier(.18,.89,.32,1.28),-webkit-transform .3s cubic-bezier(.18,.89,.32,1.28)}.ant-slider-handle:focus{border-color:#46a6ff;-webkit-box-shadow:0 0 0 5px #8cc8ff;box-shadow:0 0 0 5px #8cc8ff;outline:none}.ant-slider-handle.ant-tooltip-open{border-color:#1890ff}.ant-slider:hover .ant-slider-rail{background-color:#e1e1e1}.ant-slider:hover .ant-slider-track{background-color:#69c0ff}.ant-slider:hover .ant-slider-handle:not(.ant-tooltip-open){border-color:#69c0ff}.ant-slider-mark{position:absolute;top:14px;left:0;width:100%;font-size:14px}.ant-slider-mark-text{position:absolute;display:inline-block;vertical-align:middle;text-align:center;cursor:pointer;color:rgba(0,0,0,.45)}.ant-slider-mark-text-active{color:rgba(0,0,0,.65)}.ant-slider-step{position:absolute;width:100%;height:4px;background:transparent}.ant-slider-dot{position:absolute;top:-2px;width:8px;height:8px;border:2px solid #e8e8e8;background-color:#fff;cursor:pointer;border-radius:50%;vertical-align:middle}.ant-slider-dot,.ant-slider-dot:first-child,.ant-slider-dot:last-child{margin-left:-4px}.ant-slider-dot-active{border-color:#8cc8ff}.ant-slider-disabled{cursor:not-allowed}.ant-slider-disabled .ant-slider-track{background-color:rgba(0,0,0,.25)!important}.ant-slider-disabled .ant-slider-dot,.ant-slider-disabled .ant-slider-handle{border-color:rgba(0,0,0,.25)!important;background-color:#fff;cursor:not-allowed;-webkit-box-shadow:none;box-shadow:none}.ant-slider-disabled .ant-slider-dot,.ant-slider-disabled .ant-slider-mark-text{cursor:not-allowed!important}.ant-steps{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;font-size:0;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ant-steps-item{position:relative;display:inline-block;vertical-align:top;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;overflow:hidden}.ant-steps-item:last-child{-webkit-box-flex:0;-webkit-flex:none;-ms-flex:none;flex:none}.ant-steps-item:last-child .ant-steps-item-tail,.ant-steps-item:last-child .ant-steps-item-title:after{display:none}.ant-steps-item-content,.ant-steps-item-icon{display:inline-block;vertical-align:top}.ant-steps-item-icon{border:1px solid rgba(0,0,0,.25);width:32px;height:32px;line-height:32px;text-align:center;border-radius:32px;font-size:16px;margin-right:8px;-webkit-transition:background-color .3s,border-color .3s;transition:background-color .3s,border-color .3s;font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif}.ant-steps-item-icon>.ant-steps-icon{line-height:1;top:-1px;color:#1890ff;position:relative}.ant-steps-item-tail{position:absolute;left:0;width:100%;top:12px;padding:0 10px}.ant-steps-item-tail:after{content:"";display:inline-block;background:#e8e8e8;height:1px;border-radius:1px;width:100%;-webkit-transition:background .3s;transition:background .3s}.ant-steps-item-title{font-size:16px;color:rgba(0,0,0,.65);display:inline-block;padding-right:16px;position:relative;line-height:32px}.ant-steps-item-title:after{content:"";height:1px;width:9999px;background:#e8e8e8;display:block;position:absolute;top:16px;left:100%}.ant-steps-item-description{font-size:14px;color:rgba(0,0,0,.45)}.ant-steps-item-wait .ant-steps-item-icon{border-color:rgba(0,0,0,.25);background-color:#fff}.ant-steps-item-wait .ant-steps-item-icon>.ant-steps-icon{color:rgba(0,0,0,.25)}.ant-steps-item-wait .ant-steps-item-icon>.ant-steps-icon .ant-steps-icon-dot{background:rgba(0,0,0,.25)}.ant-steps-item-wait>.ant-steps-item-content>.ant-steps-item-title{color:rgba(0,0,0,.45)}.ant-steps-item-wait>.ant-steps-item-content>.ant-steps-item-title:after{background-color:#e8e8e8}.ant-steps-item-wait>.ant-steps-item-content>.ant-steps-item-description{color:rgba(0,0,0,.45)}.ant-steps-item-wait>.ant-steps-item-tail:after{background-color:#e8e8e8}.ant-steps-item-process .ant-steps-item-icon{border-color:#1890ff;background-color:#fff}.ant-steps-item-process .ant-steps-item-icon>.ant-steps-icon{color:#1890ff}.ant-steps-item-process .ant-steps-item-icon>.ant-steps-icon .ant-steps-icon-dot{background:#1890ff}.ant-steps-item-process>.ant-steps-item-content>.ant-steps-item-title{color:rgba(0,0,0,.85)}.ant-steps-item-process>.ant-steps-item-content>.ant-steps-item-title:after{background-color:#e8e8e8}.ant-steps-item-process>.ant-steps-item-content>.ant-steps-item-description{color:rgba(0,0,0,.65)}.ant-steps-item-process>.ant-steps-item-tail:after{background-color:#e8e8e8}.ant-steps-item-process .ant-steps-item-icon{background:#1890ff}.ant-steps-item-process .ant-steps-item-icon>.ant-steps-icon{color:#fff}.ant-steps-item-process .ant-steps-item-title{font-weight:500}.ant-steps-item-finish .ant-steps-item-icon{border-color:#1890ff;background-color:#fff}.ant-steps-item-finish .ant-steps-item-icon>.ant-steps-icon{color:#1890ff}.ant-steps-item-finish .ant-steps-item-icon>.ant-steps-icon .ant-steps-icon-dot{background:#1890ff}.ant-steps-item-finish>.ant-steps-item-content>.ant-steps-item-title{color:rgba(0,0,0,.65)}.ant-steps-item-finish>.ant-steps-item-content>.ant-steps-item-title:after{background-color:#1890ff}.ant-steps-item-finish>.ant-steps-item-content>.ant-steps-item-description{color:rgba(0,0,0,.45)}.ant-steps-item-finish>.ant-steps-item-tail:after{background-color:#1890ff}.ant-steps-item-error .ant-steps-item-icon{border-color:#f5222d;background-color:#fff}.ant-steps-item-error .ant-steps-item-icon>.ant-steps-icon{color:#f5222d}.ant-steps-item-error .ant-steps-item-icon>.ant-steps-icon .ant-steps-icon-dot{background:#f5222d}.ant-steps-item-error>.ant-steps-item-content>.ant-steps-item-title{color:#f5222d}.ant-steps-item-error>.ant-steps-item-content>.ant-steps-item-title:after{background-color:#e8e8e8}.ant-steps-item-error>.ant-steps-item-content>.ant-steps-item-description{color:#f5222d}.ant-steps-item-error>.ant-steps-item-tail:after{background-color:#e8e8e8}.ant-steps-item.ant-steps-next-error .ant-steps-item-title:after{background:#f5222d}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item{margin-right:16px;white-space:nowrap}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child{margin-right:0}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child .ant-steps-item-title{padding-right:0}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item-tail{display:none}.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item-description{max-width:140px;white-space:normal}.ant-steps-item-custom .ant-steps-item-icon{background:none;border:0;width:auto;height:auto}.ant-steps-item-custom .ant-steps-item-icon>.ant-steps-icon{font-size:24px;line-height:32px;top:0;left:.5px;width:32px;height:32px}.ant-steps-item-custom.ant-steps-item-process .ant-steps-item-icon>.ant-steps-icon{color:#1890ff}.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item{margin-right:12px}.ant-steps-small.ant-steps-horizontal:not(.ant-steps-label-vertical) .ant-steps-item:last-child{margin-right:0}.ant-steps-small .ant-steps-item-icon{width:24px;height:24px;line-height:24px;text-align:center;border-radius:24px;font-size:12px}.ant-steps-small .ant-steps-item-title{font-size:14px;line-height:24px;padding-right:12px}.ant-steps-small .ant-steps-item-title:after{top:12px}.ant-steps-small .ant-steps-item-description{font-size:14px;color:rgba(0,0,0,.45)}.ant-steps-small .ant-steps-item-tail{top:8px;padding:0 8px}.ant-steps-small .ant-steps-item-custom .ant-steps-item-icon{width:inherit;height:inherit;line-height:inherit;border-radius:0;border:0;background:none}.ant-steps-small .ant-steps-item-custom .ant-steps-item-icon>.ant-steps-icon{font-size:24px;line-height:24px;-webkit-transform:none;-ms-transform:none;transform:none}.ant-steps-vertical{display:block}.ant-steps-vertical .ant-steps-item{display:block;overflow:visible}.ant-steps-vertical .ant-steps-item-icon{float:left;margin-right:16px}.ant-steps-vertical .ant-steps-item-content{min-height:48px;overflow:hidden;display:block}.ant-steps-vertical .ant-steps-item-title{line-height:32px}.ant-steps-vertical .ant-steps-item-description{padding-bottom:12px}.ant-steps-vertical>.ant-steps-item>.ant-steps-item-tail{position:absolute;left:16px;top:0;height:100%;width:1px;padding:38px 0 6px}.ant-steps-vertical>.ant-steps-item>.ant-steps-item-tail:after{height:100%;width:1px}.ant-steps-vertical>.ant-steps-item:not(:last-child)>.ant-steps-item-tail{display:block}.ant-steps-vertical>.ant-steps-item>.ant-steps-item-content>.ant-steps-item-title:after{display:none}.ant-steps-vertical.ant-steps-small .ant-steps-item-tail{position:absolute;left:12px;top:0;padding:30px 0 6px}.ant-steps-vertical.ant-steps-small .ant-steps-item-title{line-height:24px}@media (max-width:480px){.ant-steps-horizontal.ant-steps-label-horizontal{display:block}.ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item{display:block;overflow:visible}.ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item-icon{float:left;margin-right:16px}.ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item-content{min-height:48px;overflow:hidden;display:block}.ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item-title{line-height:32px}.ant-steps-horizontal.ant-steps-label-horizontal .ant-steps-item-description{padding-bottom:12px}.ant-steps-horizontal.ant-steps-label-horizontal>.ant-steps-item>.ant-steps-item-tail{position:absolute;left:16px;top:0;height:100%;width:1px;padding:38px 0 6px}.ant-steps-horizontal.ant-steps-label-horizontal>.ant-steps-item>.ant-steps-item-tail:after{height:100%;width:1px}.ant-steps-horizontal.ant-steps-label-horizontal>.ant-steps-item:not(:last-child)>.ant-steps-item-tail{display:block}.ant-steps-horizontal.ant-steps-label-horizontal>.ant-steps-item>.ant-steps-item-content>.ant-steps-item-title:after{display:none}.ant-steps-horizontal.ant-steps-label-horizontal.ant-steps-small .ant-steps-item-tail{position:absolute;left:12px;top:0;padding:30px 0 6px}.ant-steps-horizontal.ant-steps-label-horizontal.ant-steps-small .ant-steps-item-title{line-height:24px}}.ant-steps-label-vertical .ant-steps-item{overflow:visible}.ant-steps-label-vertical .ant-steps-item-tail{padding:0 24px;margin-left:48px}.ant-steps-label-vertical .ant-steps-item-content{display:block;text-align:center;margin-top:8px;width:104px}.ant-steps-label-vertical .ant-steps-item-icon{display:inline-block;margin-left:36px}.ant-steps-label-vertical .ant-steps-item-title{padding-right:0}.ant-steps-label-vertical .ant-steps-item-title:after{display:none}.ant-steps-dot .ant-steps-item-title{line-height:1.5}.ant-steps-dot .ant-steps-item-tail{width:100%;top:2px;margin:0 0 0 70px;padding:0}.ant-steps-dot .ant-steps-item-tail:after{height:3px;width:calc(100% - 20px);margin-left:12px}.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot{left:2px}.ant-steps-dot .ant-steps-item-icon{padding-right:0;width:8px;height:8px;line-height:8px;border:0;margin-left:67px;background:transparent}.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot{float:left;width:100%;height:100%;border-radius:100px;position:relative;-webkit-transition:all .3s;transition:all .3s}.ant-steps-dot .ant-steps-item-icon .ant-steps-icon-dot:after{content:"";background:rgba(0,0,0,.001);width:60px;height:32px;position:absolute;top:-12px;left:-26px}.ant-steps-dot .ant-steps-item-content{width:140px}.ant-steps-dot .ant-steps-item-process .ant-steps-item-icon{width:10px;height:10px;line-height:10px}.ant-steps-dot .ant-steps-item-process .ant-steps-item-icon .ant-steps-icon-dot{top:-1px}.ant-steps-vertical.ant-steps-dot .ant-steps-item-icon{margin-left:0;margin-top:8px}.ant-steps-vertical.ant-steps-dot .ant-steps-item-tail{margin:0;left:-9px;top:2px;padding:22px 0 4px}.ant-steps-vertical.ant-steps-dot .ant-steps-item:first-child .ant-steps-icon-dot{left:0}.ant-steps-vertical.ant-steps-dot .ant-steps-item-process .ant-steps-icon-dot{left:-2px}.ant-switch{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);margin:0;padding:0;list-style:none;position:relative;display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;height:22px;min-width:44px;line-height:20px;vertical-align:middle;border-radius:100px;border:1px solid transparent;background-color:rgba(0,0,0,.25);cursor:pointer;-webkit-transition:all .36s;transition:all .36s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-switch-inner{color:#fff;font-size:12px;margin-left:24px;margin-right:6px;display:block}.ant-switch-loading-icon,.ant-switch:after{position:absolute;width:18px;height:18px;left:1px;top:1px;border-radius:18px;background-color:#fff;content:" ";cursor:pointer;-webkit-transition:all .36s cubic-bezier(.78,.14,.15,.86);transition:all .36s cubic-bezier(.78,.14,.15,.86)}.ant-switch:after{-webkit-box-shadow:0 2px 4px 0 rgba(0,35,11,.2);box-shadow:0 2px 4px 0 rgba(0,35,11,.2)}.ant-switch:active:after,.ant-switch:active:before{width:24px}.ant-switch-loading-icon{background:transparent;z-index:1;display:none;font-size:12px}.ant-switch-loading-icon svg{position:absolute;left:0;top:0;right:0;bottom:0;margin:auto}.ant-switch-loading .ant-switch-loading-icon{display:inline-block;color:rgba(0,0,0,.65)}.ant-switch-checked.ant-switch-loading .ant-switch-loading-icon{color:#1890ff}.ant-switch:focus{-webkit-box-shadow:0 0 0 2px rgba(24,144,255,.2);box-shadow:0 0 0 2px rgba(24,144,255,.2);outline:0}.ant-switch:focus:hover{-webkit-box-shadow:none;box-shadow:none}.ant-switch-small{height:16px;min-width:28px;line-height:14px}.ant-switch-small .ant-switch-inner{margin-left:18px;margin-right:3px;font-size:12px}.ant-switch-small:after{width:12px;height:12px}.ant-switch-small:active:after,.ant-switch-small:active:before{width:16px}.ant-switch-small .ant-switch-loading-icon{width:12px;height:12px}.ant-switch-small.ant-switch-checked .ant-switch-inner{margin-left:3px;margin-right:18px}.ant-switch-small.ant-switch-checked .ant-switch-loading-icon{left:100%;margin-left:-13px}.ant-switch-small.ant-switch-loading .ant-switch-loading-icon{-webkit-transform:scale(.66667);-ms-transform:scale(.66667);transform:scale(.66667);font-weight:700}.ant-switch-checked{background-color:#1890ff}.ant-switch-checked .ant-switch-inner{margin-left:6px;margin-right:24px}.ant-switch-checked:after{left:100%;-webkit-transform:translateX(-100%);-ms-transform:translateX(-100%);transform:translateX(-100%);margin-left:-1px}.ant-switch-checked .ant-switch-loading-icon{left:100%;margin-left:-19px}.ant-switch-disabled,.ant-switch-loading{pointer-events:none;opacity:.4}@-webkit-keyframes AntSwitchSmallLoadingCircle{0%{-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(0deg) scale(.66667);transform:rotate(0deg) scale(.66667)}to{-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(1turn) scale(.66667);transform:rotate(1turn) scale(.66667)}}@keyframes AntSwitchSmallLoadingCircle{0%{-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(0deg) scale(.66667);transform:rotate(0deg) scale(.66667)}to{-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(1turn) scale(.66667);transform:rotate(1turn) scale(.66667)}}.ant-table-wrapper{zoom:1}.ant-table-wrapper:after,.ant-table-wrapper:before{content:"";display:table}.ant-table-wrapper:after{clear:both}.ant-table{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;position:relative;clear:both}.ant-table-body{-webkit-transition:opacity .3s;transition:opacity .3s}.ant-table-empty .ant-table-body{overflow:auto!important}.ant-table table{width:100%;border-collapse:collapse;text-align:left;border-radius:4px 4px 0 0}.ant-table-thead>tr>th{background:#fafafa;-webkit-transition:background .3s ease;transition:background .3s ease;text-align:left;color:rgba(0,0,0,.85);font-weight:500;border-bottom:1px solid #e8e8e8}.ant-table-thead>tr>th[colspan]{text-align:center}.ant-table-thead>tr>th .ant-table-filter-icon,.ant-table-thead>tr>th .anticon-filter{position:relative;margin-left:8px;font-size:14px;cursor:pointer;color:rgba(0,0,0,.45);-webkit-transition:all .3s;transition:all .3s;width:14px;font-weight:400;vertical-align:text-bottom}.ant-table-thead>tr>th .ant-table-filter-icon:hover,.ant-table-thead>tr>th .anticon-filter:hover{color:rgba(0,0,0,.65)}.ant-table-thead>tr>th .ant-table-column-sorter+.anticon-filter{margin-left:4px}.ant-table-thead>tr>th .ant-table-filter-selected.anticon-filter{color:#1890ff}.ant-table-thead>tr>th.ant-table-column-has-filters{overflow:hidden}.ant-table-thead>tr:first-child>th:first-child{border-top-left-radius:4px}.ant-table-thead>tr:first-child>th:last-child{border-top-right-radius:4px}.ant-table-thead>tr:not(:last-child)>th[colspan]{border-bottom:0}.ant-table-tbody>tr>td{border-bottom:1px solid #e8e8e8;-webkit-transition:all .3s,border 0s;transition:all .3s,border 0s}.ant-table-tbody>tr,.ant-table-thead>tr{-webkit-transition:all .3s,height 0s;transition:all .3s,height 0s}.ant-table-tbody>tr.ant-table-row-hover>td,.ant-table-tbody>tr:hover>td,.ant-table-thead>tr.ant-table-row-hover>td,.ant-table-thead>tr:hover>td{background:#e6f7ff}.ant-table-thead>tr:hover{background:none}.ant-table-footer{padding:16px;background:#fafafa;border-radius:0 0 4px 4px;position:relative;border-top:1px solid #e8e8e8}.ant-table-footer:before{content:"";height:1px;background:#fafafa;position:absolute;top:-1px;width:100%;left:0}.ant-table.ant-table-bordered .ant-table-footer{border:1px solid #e8e8e8}.ant-table-title{padding:16px 0;position:relative;top:1px;border-radius:4px 4px 0 0}.ant-table.ant-table-bordered .ant-table-title{border:1px solid #e8e8e8;padding-left:16px;padding-right:16px}.ant-table-title+.ant-table-content{position:relative;border-radius:4px 4px 0 0;overflow:hidden}.ant-table-bordered .ant-table-title+.ant-table-content,.ant-table-bordered .ant-table-title+.ant-table-content .ant-table-thead>tr:first-child>th,.ant-table-bordered .ant-table-title+.ant-table-content table,.ant-table-without-column-header .ant-table-title+.ant-table-content,.ant-table-without-column-header table{border-radius:0}.ant-table-tbody>tr.ant-table-row-selected td{background:#fafafa}.ant-table-thead>tr>th.ant-table-column-sort{background:#f5f5f5}.ant-table-tbody>tr>td,.ant-table-thead>tr>th{padding:16px;word-break:break-word;-ms-word-break:break-all}.ant-table-thead>tr>th.ant-table-selection-column-custom{padding-left:16px;padding-right:0}.ant-table-tbody>tr>td.ant-table-selection-column,.ant-table-thead>tr>th.ant-table-selection-column{text-align:center;min-width:62px;width:62px}.ant-table-tbody>tr>td.ant-table-selection-column .ant-radio-wrapper,.ant-table-thead>tr>th.ant-table-selection-column .ant-radio-wrapper{margin-right:0}.ant-table-expand-icon-th,.ant-table-row-expand-icon-cell{text-align:center;min-width:50px;width:50px}.ant-table-header{background:#fafafa;overflow:hidden}.ant-table-header table{border-radius:4px 4px 0 0}.ant-table-loading{position:relative}.ant-table-loading .ant-table-body{background:#fff;opacity:.5}.ant-table-loading .ant-table-spin-holder{height:20px;line-height:20px;left:50%;top:50%;margin-left:-30px;position:absolute}.ant-table-loading .ant-table-with-pagination{margin-top:-20px}.ant-table-loading .ant-table-without-pagination{margin-top:10px}.ant-table-column-sorter{position:relative;margin-left:8px;display:inline-block;vertical-align:text-bottom;top:-1.5px;width:14px;height:14px;text-align:center;font-weight:400;color:rgba(0,0,0,.45)}.ant-table-column-sorter-down,.ant-table-column-sorter-up{display:block;width:14px;height:6px;line-height:6px;cursor:pointer;position:relative}.ant-table-column-sorter-down:hover .anticon,.ant-table-column-sorter-up:hover .anticon{color:#69c0ff}.ant-table-column-sorter-down.on .anticon-caret-down,.ant-table-column-sorter-down.on .anticon-caret-up,.ant-table-column-sorter-up.on .anticon-caret-down,.ant-table-column-sorter-up.on .anticon-caret-up{color:#1890ff}.ant-table-column-sorter-down:after,.ant-table-column-sorter-up:after{position:absolute;content:"";height:30px;width:14px;left:0}.ant-table-column-sorter-up:after{bottom:0}.ant-table-column-sorter-down:after{top:0}.ant-table-column-sorter .anticon-caret-down,.ant-table-column-sorter .anticon-caret-up{display:inline-block;font-size:12px;font-size:8px\9;-webkit-transform:scale(.66666667) rotate(0deg);-ms-transform:scale(.66666667) rotate(0deg);transform:scale(.66666667) rotate(0deg);line-height:4px;height:4px;-webkit-transition:all .3s;transition:all .3s;position:relative;display:block}:root .ant-table-column-sorter .anticon-caret-down,:root .ant-table-column-sorter .anticon-caret-up{font-size:12px}.ant-table-column-sorter-down{margin-top:1.5px}.ant-table-column-sorter .anticon-caret-up{margin-top:.5px}.ant-table-bordered .ant-table-body>table,.ant-table-bordered .ant-table-fixed-left table,.ant-table-bordered .ant-table-fixed-right table,.ant-table-bordered .ant-table-header>table{border:1px solid #e8e8e8;border-right:0;border-bottom:0}.ant-table-bordered.ant-table-empty .ant-table-placeholder{border-left:1px solid #e8e8e8;border-right:1px solid #e8e8e8}.ant-table-bordered.ant-table-fixed-header .ant-table-header>table{border-bottom:0}.ant-table-bordered.ant-table-fixed-header .ant-table-body>table{border-top:0;border-top-left-radius:0;border-top-right-radius:0}.ant-table-bordered.ant-table-fixed-header .ant-table-body-inner>table{border-top:0}.ant-table-bordered.ant-table-fixed-header .ant-table-placeholder{border:0}.ant-table-bordered .ant-table-thead>tr:not(:last-child)>th{border-bottom:1px solid #e8e8e8}.ant-table-bordered .ant-table-tbody>tr>td,.ant-table-bordered .ant-table-thead>tr>th{border-right:1px solid #e8e8e8}.ant-table-placeholder{position:relative;padding:16px;background:#fff;border-bottom:1px solid #e8e8e8;text-align:center;font-size:14px;color:rgba(0,0,0,.45);z-index:1}.ant-table-placeholder .anticon{margin-right:4px}.ant-table-pagination.ant-pagination{margin:16px 0;float:right}.ant-table-filter-dropdown{min-width:96px;margin-left:-8px;background:#fff;border-radius:4px;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.15);box-shadow:0 2px 8px rgba(0,0,0,.15)}.ant-table-filter-dropdown .ant-dropdown-menu{border:0;-webkit-box-shadow:none;box-shadow:none;border-radius:4px 4px 0 0}.ant-table-filter-dropdown .ant-dropdown-menu-without-submenu{max-height:400px;overflow-x:hidden}.ant-table-filter-dropdown .ant-dropdown-menu-item>label+span{padding-right:0}.ant-table-filter-dropdown .ant-dropdown-menu-sub{border-radius:4px;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.15);box-shadow:0 2px 8px rgba(0,0,0,.15)}.ant-table-filter-dropdown .ant-dropdown-menu .ant-dropdown-submenu-contain-selected .ant-dropdown-menu-submenu-title:after{color:#1890ff;font-weight:700;text-shadow:0 0 2px #bae7ff}.ant-table-filter-dropdown .ant-dropdown-menu-item{overflow:hidden}.ant-table-filter-dropdown>.ant-dropdown-menu>.ant-dropdown-menu-item:last-child,.ant-table-filter-dropdown>.ant-dropdown-menu>.ant-dropdown-menu-submenu:last-child .ant-dropdown-menu-submenu-title{border-radius:0}.ant-table-filter-dropdown-btns{overflow:hidden;padding:7px 8px;border-top:1px solid #e8e8e8}.ant-table-filter-dropdown-link{color:#1890ff}.ant-table-filter-dropdown-link:hover{color:#40a9ff}.ant-table-filter-dropdown-link:active{color:#096dd9}.ant-table-filter-dropdown-link.confirm{float:left}.ant-table-filter-dropdown-link.clear{float:right}.ant-table-selection-select-all-custom{margin-right:4px!important}.ant-table-selection .anticon-down{color:rgba(0,0,0,.45);-webkit-transition:all .3s;transition:all .3s}.ant-table-selection-menu{min-width:96px;margin-top:5px;margin-left:-30px;background:#fff;border-radius:4px;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.15);box-shadow:0 2px 8px rgba(0,0,0,.15)}.ant-table-selection-menu .ant-action-down{color:rgba(0,0,0,.45)}.ant-table-selection-down{cursor:pointer;padding:0;display:inline-block;line-height:1}.ant-table-selection-down:hover .anticon-down{color:#666}.ant-table-row-expand-icon{cursor:pointer;display:inline-block;width:17px;height:17px;text-align:center;line-height:14px;border:1px solid #e8e8e8;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:#fff}.ant-table-row-expanded:after{content:"-"}.ant-table-row-collapsed:after{content:"+"}.ant-table-row-spaced{visibility:hidden}.ant-table-row-spaced:after{content:"."}.ant-table-row[class*=ant-table-row-level-0] .ant-table-selection-column>span{display:inline-block}tr.ant-table-expanded-row,tr.ant-table-expanded-row:hover{background:#fbfbfb}.ant-table .ant-table-row-indent+.ant-table-row-expand-icon{margin-right:8px}.ant-table-scroll{overflow:auto;overflow-x:hidden}.ant-table-scroll table{width:auto;min-width:100%}.ant-table-body-inner{height:100%}.ant-table-fixed-header>.ant-table-content>.ant-table-scroll>.ant-table-body{position:relative;background:#fff}.ant-table-fixed-header .ant-table-body-inner{overflow:scroll}.ant-table-fixed-header .ant-table-scroll .ant-table-header{overflow:scroll;padding-bottom:20px;margin-bottom:-20px;opacity:.9999}.ant-table-fixed-left,.ant-table-fixed-right{position:absolute;top:0;overflow:hidden;-webkit-transition:-webkit-box-shadow .3s ease;transition:-webkit-box-shadow .3s ease;transition:box-shadow .3s ease;transition:box-shadow .3s ease,-webkit-box-shadow .3s ease;border-radius:0}.ant-table-fixed-left table,.ant-table-fixed-right table{width:auto;background:#fff}.ant-table-fixed-header .ant-table-fixed-left .ant-table-body-outer .ant-table-fixed,.ant-table-fixed-header .ant-table-fixed-right .ant-table-body-outer .ant-table-fixed{border-radius:0}.ant-table-fixed-left{left:0;-webkit-box-shadow:6px 0 6px -4px rgba(0,0,0,.15);box-shadow:6px 0 6px -4px rgba(0,0,0,.15)}.ant-table-fixed-left .ant-table-header{overflow-y:hidden}.ant-table-fixed-left .ant-table-body-inner{margin-right:-20px;padding-right:20px}.ant-table-fixed-header .ant-table-fixed-left .ant-table-body-inner{padding-right:0}.ant-table-fixed-left,.ant-table-fixed-left table{border-radius:4px 0 0 0}.ant-table-fixed-left .ant-table-thead>tr>th:last-child{border-top-right-radius:0}.ant-table-fixed-right{right:0;-webkit-box-shadow:-6px 0 6px -4px rgba(0,0,0,.15);box-shadow:-6px 0 6px -4px rgba(0,0,0,.15)}.ant-table-fixed-right,.ant-table-fixed-right table{border-radius:0 4px 0 0}.ant-table-fixed-right .ant-table-expanded-row{color:transparent;pointer-events:none}.ant-table-fixed-right .ant-table-thead>tr>th:first-child{border-top-left-radius:0}.ant-table.ant-table-scroll-position-left .ant-table-fixed-left,.ant-table.ant-table-scroll-position-right .ant-table-fixed-right{-webkit-box-shadow:none;box-shadow:none}.ant-table-middle>.ant-table-content>.ant-table-body>table>.ant-table-tbody>tr>td,.ant-table-middle>.ant-table-content>.ant-table-body>table>.ant-table-thead>tr>th,.ant-table-middle>.ant-table-content>.ant-table-fixed-left>.ant-table-body-outer>.ant-table-body-inner>table>.ant-table-tbody>tr>td,.ant-table-middle>.ant-table-content>.ant-table-fixed-left>.ant-table-body-outer>.ant-table-body-inner>table>.ant-table-thead>tr>th,.ant-table-middle>.ant-table-content>.ant-table-fixed-left>.ant-table-header>table>.ant-table-tbody>tr>td,.ant-table-middle>.ant-table-content>.ant-table-fixed-left>.ant-table-header>table>.ant-table-thead>tr>th,.ant-table-middle>.ant-table-content>.ant-table-fixed-right>.ant-table-body-outer>.ant-table-body-inner>table>.ant-table-tbody>tr>td,.ant-table-middle>.ant-table-content>.ant-table-fixed-right>.ant-table-body-outer>.ant-table-body-inner>table>.ant-table-thead>tr>th,.ant-table-middle>.ant-table-content>.ant-table-fixed-right>.ant-table-header>table>.ant-table-tbody>tr>td,.ant-table-middle>.ant-table-content>.ant-table-fixed-right>.ant-table-header>table>.ant-table-thead>tr>th,.ant-table-middle>.ant-table-content>.ant-table-header>table>.ant-table-tbody>tr>td,.ant-table-middle>.ant-table-content>.ant-table-header>table>.ant-table-thead>tr>th,.ant-table-middle>.ant-table-content>.ant-table-scroll>.ant-table-body>table>.ant-table-tbody>tr>td,.ant-table-middle>.ant-table-content>.ant-table-scroll>.ant-table-body>table>.ant-table-thead>tr>th,.ant-table-middle>.ant-table-content>.ant-table-scroll>.ant-table-header>table>.ant-table-tbody>tr>td,.ant-table-middle>.ant-table-content>.ant-table-scroll>.ant-table-header>table>.ant-table-thead>tr>th,.ant-table-middle>.ant-table-footer,.ant-table-middle>.ant-table-title{padding:12px 8px}.ant-table-small{border:1px solid #e8e8e8;border-radius:4px}.ant-table-small>.ant-table-footer,.ant-table-small>.ant-table-title{padding:8px}.ant-table-small>.ant-table-title{border-bottom:1px solid #e8e8e8;top:0}.ant-table-small>.ant-table-content>.ant-table-body{margin:0 8px}.ant-table-small>.ant-table-content>.ant-table-body>table,.ant-table-small>.ant-table-content>.ant-table-fixed-left>.ant-table-body-outer>.ant-table-body-inner>table,.ant-table-small>.ant-table-content>.ant-table-fixed-left>.ant-table-header>table,.ant-table-small>.ant-table-content>.ant-table-fixed-right>.ant-table-body-outer>.ant-table-body-inner>table,.ant-table-small>.ant-table-content>.ant-table-fixed-right>.ant-table-header>table,.ant-table-small>.ant-table-content>.ant-table-header>table,.ant-table-small>.ant-table-content>.ant-table-scroll>.ant-table-body>table,.ant-table-small>.ant-table-content>.ant-table-scroll>.ant-table-header>table{border:0}.ant-table-small>.ant-table-content>.ant-table-body>table>.ant-table-tbody>tr>td,.ant-table-small>.ant-table-content>.ant-table-body>table>.ant-table-thead>tr>th,.ant-table-small>.ant-table-content>.ant-table-fixed-left>.ant-table-body-outer>.ant-table-body-inner>table>.ant-table-tbody>tr>td,.ant-table-small>.ant-table-content>.ant-table-fixed-left>.ant-table-body-outer>.ant-table-body-inner>table>.ant-table-thead>tr>th,.ant-table-small>.ant-table-content>.ant-table-fixed-left>.ant-table-header>table>.ant-table-tbody>tr>td,.ant-table-small>.ant-table-content>.ant-table-fixed-left>.ant-table-header>table>.ant-table-thead>tr>th,.ant-table-small>.ant-table-content>.ant-table-fixed-right>.ant-table-body-outer>.ant-table-body-inner>table>.ant-table-tbody>tr>td,.ant-table-small>.ant-table-content>.ant-table-fixed-right>.ant-table-body-outer>.ant-table-body-inner>table>.ant-table-thead>tr>th,.ant-table-small>.ant-table-content>.ant-table-fixed-right>.ant-table-header>table>.ant-table-tbody>tr>td,.ant-table-small>.ant-table-content>.ant-table-fixed-right>.ant-table-header>table>.ant-table-thead>tr>th,.ant-table-small>.ant-table-content>.ant-table-header>table>.ant-table-tbody>tr>td,.ant-table-small>.ant-table-content>.ant-table-header>table>.ant-table-thead>tr>th,.ant-table-small>.ant-table-content>.ant-table-scroll>.ant-table-body>table>.ant-table-tbody>tr>td,.ant-table-small>.ant-table-content>.ant-table-scroll>.ant-table-body>table>.ant-table-thead>tr>th,.ant-table-small>.ant-table-content>.ant-table-scroll>.ant-table-header>table>.ant-table-tbody>tr>td,.ant-table-small>.ant-table-content>.ant-table-scroll>.ant-table-header>table>.ant-table-thead>tr>th{padding:8px}.ant-table-small>.ant-table-content>.ant-table-body>table>.ant-table-thead>tr>th,.ant-table-small>.ant-table-content>.ant-table-fixed-left>.ant-table-body-outer>.ant-table-body-inner>table>.ant-table-thead>tr>th,.ant-table-small>.ant-table-content>.ant-table-fixed-left>.ant-table-header>table>.ant-table-thead>tr>th,.ant-table-small>.ant-table-content>.ant-table-fixed-right>.ant-table-body-outer>.ant-table-body-inner>table>.ant-table-thead>tr>th,.ant-table-small>.ant-table-content>.ant-table-fixed-right>.ant-table-header>table>.ant-table-thead>tr>th,.ant-table-small>.ant-table-content>.ant-table-header>table>.ant-table-thead>tr>th,.ant-table-small>.ant-table-content>.ant-table-scroll>.ant-table-body>table>.ant-table-thead>tr>th,.ant-table-small>.ant-table-content>.ant-table-scroll>.ant-table-header>table>.ant-table-thead>tr>th{background:#fff;border-bottom:1px solid #e8e8e8}.ant-table-small>.ant-table-content>.ant-table-fixed-left>.ant-table-body-outer>.ant-table-body-inner>table,.ant-table-small>.ant-table-content>.ant-table-fixed-left>.ant-table-header>table,.ant-table-small>.ant-table-content>.ant-table-fixed-right>.ant-table-body-outer>.ant-table-body-inner>table,.ant-table-small>.ant-table-content>.ant-table-fixed-right>.ant-table-header>table,.ant-table-small>.ant-table-content>.ant-table-scroll>.ant-table-body>table,.ant-table-small>.ant-table-content>.ant-table-scroll>.ant-table-header>table{padding:0}.ant-table-small>.ant-table-content .ant-table-header{background:#fff}.ant-table-small>.ant-table-content .ant-table-placeholder,.ant-table-small>.ant-table-content .ant-table-row:last-child td{border-bottom:0}.ant-table-small.ant-table-bordered{border-right:0}.ant-table-small.ant-table-bordered .ant-table-title{border:0;border-bottom:1px solid #e8e8e8;border-right:1px solid #e8e8e8}.ant-table-small.ant-table-bordered .ant-table-content{border-right:1px solid #e8e8e8}.ant-table-small.ant-table-bordered .ant-table-footer{border:0;border-top:1px solid #e8e8e8;border-right:1px solid #e8e8e8}.ant-table-small.ant-table-bordered .ant-table-footer:before{display:none}.ant-table-small.ant-table-bordered .ant-table-placeholder{border-left:0;border-bottom:0}.ant-table-small.ant-table-bordered .ant-table-tbody>tr>td:last-child,.ant-table-small.ant-table-bordered .ant-table-thead>tr>th:last-child{border-right:none}.ant-table-small.ant-table-bordered .ant-table-fixed-left .ant-table-tbody>tr>td:last-child,.ant-table-small.ant-table-bordered .ant-table-fixed-left .ant-table-thead>tr>th:last-child,.ant-table-small.ant-table-bordered .ant-table-fixed-right{border-right:1px solid #e8e8e8}.ant-timeline{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}.ant-timeline,.ant-timeline-item{font-size:14px;list-style:none;margin:0}.ant-timeline-item{position:relative;padding:0 0 20px}.ant-timeline-item-tail{position:absolute;left:4px;top:.75em;height:100%;border-left:2px solid #e8e8e8}.ant-timeline-item-pending .ant-timeline-item-head{font-size:12px}.ant-timeline-item-pending .ant-timeline-item-tail{display:none}.ant-timeline-item-head{position:absolute;width:10px;height:10px;background-color:#fff;border-radius:100px;border:2px solid transparent}.ant-timeline-item-head-blue{border-color:#1890ff;color:#1890ff}.ant-timeline-item-head-red{border-color:#f5222d;color:#f5222d}.ant-timeline-item-head-green{border-color:#52c41a;color:#52c41a}.ant-timeline-item-head-custom{position:absolute;text-align:center;line-height:1;margin-top:0;border:0;height:auto;border-radius:0;padding:3px 1px;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);top:5.5px;left:5px;width:auto}.ant-timeline-item-content{margin:0 0 0 18px;position:relative;top:-6px}.ant-timeline-item-last .ant-timeline-item-tail{display:none}.ant-timeline-item-last .ant-timeline-item-content{min-height:48px}.ant-timeline.ant-timeline-alternate .ant-timeline-item-head,.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom,.ant-timeline.ant-timeline-alternate .ant-timeline-item-tail,.ant-timeline.ant-timeline-right .ant-timeline-item-head,.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom,.ant-timeline.ant-timeline-right .ant-timeline-item-tail{left:50%}.ant-timeline.ant-timeline-alternate .ant-timeline-item-head,.ant-timeline.ant-timeline-right .ant-timeline-item-head{margin-left:-4px}.ant-timeline.ant-timeline-alternate .ant-timeline-item-head-custom,.ant-timeline.ant-timeline-right .ant-timeline-item-head-custom{margin-left:1px}.ant-timeline.ant-timeline-alternate .ant-timeline-item-left .ant-timeline-item-content,.ant-timeline.ant-timeline-right .ant-timeline-item-left .ant-timeline-item-content{text-align:left;left:50%;width:50%}.ant-timeline.ant-timeline-alternate .ant-timeline-item-right .ant-timeline-item-content,.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content{text-align:right;right:50%;margin-right:18px;width:50%;left:-30px}.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head,.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-head-custom,.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-tail{left:100%}.ant-timeline.ant-timeline-right .ant-timeline-item-right .ant-timeline-item-content{right:0;width:100%;left:-30px}.ant-timeline.ant-timeline-pending .ant-timeline-item-last .ant-timeline-item-tail{border-left:2px dotted #e8e8e8;display:block}.ant-timeline.ant-timeline-reverse .ant-timeline-item-last .ant-timeline-item-tail{display:none}.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-tail{border-left:2px dotted #e8e8e8;display:block}.ant-timeline.ant-timeline-reverse .ant-timeline-item-pending .ant-timeline-item-content{min-height:48px}@-webkit-keyframes antCheckboxEffect{0%{-webkit-transform:scale(1);transform:scale(1);opacity:.5}to{-webkit-transform:scale(1.6);transform:scale(1.6);opacity:0}}@keyframes antCheckboxEffect{0%{-webkit-transform:scale(1);transform:scale(1);opacity:.5}to{-webkit-transform:scale(1.6);transform:scale(1.6);opacity:0}}.ant-transfer{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;position:relative}.ant-transfer-list{border:1px solid #d9d9d9;display:inline-block;border-radius:4px;vertical-align:middle;position:relative;width:180px;height:200px;padding-top:34px}.ant-transfer-list-with-footer{padding-bottom:34px}.ant-transfer-list-search{padding:0 8px}.ant-transfer-list-search-action{color:rgba(0,0,0,.25);position:absolute;top:4px;right:4px;bottom:4px;width:28px;line-height:32px;text-align:center}.ant-transfer-list-search-action .anticon{-webkit-transition:all .3s;transition:all .3s;color:rgba(0,0,0,.25)}.ant-transfer-list-search-action .anticon:hover{color:rgba(0,0,0,.45)}span.ant-transfer-list-search-action{pointer-events:none}.ant-transfer-list-header{padding:6px 12px;border-radius:4px 4px 0 0;background:#fff;color:rgba(0,0,0,.65);border-bottom:1px solid #e8e8e8;overflow:hidden;position:absolute;top:0;left:0;width:100%}.ant-transfer-list-header-title{position:absolute;right:12px}.ant-transfer-list-body{font-size:14px;position:relative;height:100%}.ant-transfer-list-body-search-wrapper{position:absolute;top:0;left:0;padding:4px;width:100%}.ant-transfer-list-body-with-search{padding-top:40px}.ant-transfer-list-content{height:100%;overflow:auto;list-style:none;padding:0;margin:0}.ant-transfer-list-content>.LazyLoad{-webkit-animation:transferHighlightIn 1s;animation:transferHighlightIn 1s}.ant-transfer-list-content-item{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding:6px 12px;min-height:32px;-webkit-transition:all .3s;transition:all .3s}.ant-transfer-list-content-item>span{padding-right:0}.ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover{cursor:pointer;background-color:#e6f7ff}.ant-transfer-list-content-item-disabled{cursor:not-allowed;color:rgba(0,0,0,.25)}.ant-transfer-list-body-not-found{padding-top:0;color:rgba(0,0,0,.25);text-align:center;display:none;position:absolute;top:50%;width:100%;margin-top:-10px}.ant-transfer-list-content:empty+.ant-transfer-list-body-not-found{display:block}.ant-transfer-list-footer{border-top:1px solid #e8e8e8;border-radius:0 0 4px 4px;position:absolute;bottom:0;left:0;width:100%}.ant-transfer-operation{display:inline-block;overflow:hidden;margin:0 8px;vertical-align:middle}.ant-transfer-operation .ant-btn{display:block}.ant-transfer-operation .ant-btn:first-child{margin-bottom:4px}.ant-transfer-operation .ant-btn .anticon{font-size:12px}@-webkit-keyframes transferHighlightIn{0%{background:#bae7ff}to{background:transparent}}@keyframes transferHighlightIn{0%{background:#bae7ff}to{background:transparent}}@-webkit-keyframes antCheckboxEffect{0%{-webkit-transform:scale(1);transform:scale(1);opacity:.5}to{-webkit-transform:scale(1.6);transform:scale(1.6);opacity:0}}@keyframes antCheckboxEffect{0%{-webkit-transform:scale(1);transform:scale(1);opacity:.5}to{-webkit-transform:scale(1.6);transform:scale(1.6);opacity:0}}.ant-select-tree-checkbox{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;white-space:nowrap;cursor:pointer;outline:none;display:inline-block;line-height:1;position:relative;vertical-align:middle;top:-.09em}.ant-select-tree-checkbox-input:focus+.ant-select-tree-checkbox-inner,.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox-inner,.ant-select-tree-checkbox:hover .ant-select-tree-checkbox-inner{border-color:#1890ff}.ant-select-tree-checkbox-checked:after{position:absolute;top:0;left:0;width:100%;height:100%;border-radius:2px;border:1px solid #1890ff;content:"";-webkit-animation:antCheckboxEffect .36s ease-in-out;animation:antCheckboxEffect .36s ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:hidden}.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox:after,.ant-select-tree-checkbox:hover:after{visibility:visible}.ant-select-tree-checkbox-inner{position:relative;top:0;left:0;display:block;width:16px;height:16px;border:1px solid #d9d9d9;border-radius:2px;background-color:#fff;-webkit-transition:all .3s;transition:all .3s}.ant-select-tree-checkbox-inner:after{-webkit-transform:rotate(45deg) scale(0);-ms-transform:rotate(45deg) scale(0);transform:rotate(45deg) scale(0);position:absolute;left:4.57142857px;top:1.14285714px;display:table;width:5.71428571px;height:9.14285714px;border:2px solid #fff;border-top:0;border-left:0;content:" ";-webkit-transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;opacity:0}.ant-select-tree-checkbox-input{position:absolute;left:0;z-index:1;cursor:pointer;opacity:0;top:0;bottom:0;right:0;width:100%;height:100%}.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner:after{content:" ";-webkit-transform:translate(-50%,-50%) scale(1);-ms-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);border:0;left:50%;top:50%;width:8px;height:8px;background-color:#1890ff;opacity:1}.ant-select-tree-checkbox-indeterminate.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner:after{border-color:rgba(0,0,0,.25)}.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner:after{-webkit-transform:rotate(45deg) scale(1);-ms-transform:rotate(45deg) scale(1);transform:rotate(45deg) scale(1);position:absolute;display:table;border:2px solid #fff;border-top:0;border-left:0;content:" ";-webkit-transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;opacity:1}.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner{background-color:#1890ff;border-color:#1890ff}.ant-select-tree-checkbox-disabled{cursor:not-allowed}.ant-select-tree-checkbox-disabled.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner:after{-webkit-animation-name:none;animation-name:none;border-color:rgba(0,0,0,.25)}.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-input{cursor:not-allowed}.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner{border-color:#d9d9d9!important;background-color:#f5f5f5}.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner:after{-webkit-animation-name:none;animation-name:none;border-color:#f5f5f5}.ant-select-tree-checkbox-disabled+span{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-select-tree-checkbox-wrapper{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;line-height:unset;cursor:pointer;display:inline-block}.ant-select-tree-checkbox-wrapper+.ant-select-tree-checkbox-wrapper{margin-left:8px}.ant-select-tree-checkbox+span,.ant-select-tree-checkbox-wrapper+span{padding-left:8px;padding-right:8px}.ant-select-tree-checkbox-group{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;display:inline-block}.ant-select-tree-checkbox-group-item{display:inline-block;margin-right:8px}.ant-select-tree-checkbox-group-item:last-child{margin-right:0}.ant-select-tree-checkbox-group-item+.ant-select-tree-checkbox-group-item{margin-left:0}.ant-select-tree{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;padding:0;list-style:none;margin:0;padding:0 4px;margin-top:-4px}.ant-select-tree li{padding:0;margin:8px 0;list-style:none;white-space:nowrap;outline:0}.ant-select-tree li.filter-node>span{font-weight:500}.ant-select-tree li ul{margin:0;padding:0 0 0 18px}.ant-select-tree li .ant-select-tree-node-content-wrapper{display:inline-block;padding:3px 5px;border-radius:2px;margin:0;cursor:pointer;text-decoration:none;color:rgba(0,0,0,.65);-webkit-transition:all .3s;transition:all .3s;width:calc(100% - 24px)}.ant-select-tree li .ant-select-tree-node-content-wrapper:hover{background-color:#e6f7ff}.ant-select-tree li .ant-select-tree-node-content-wrapper.ant-select-tree-node-selected{background-color:#bae7ff}.ant-select-tree li span.ant-select-tree-checkbox{margin:0 4px 0 0}.ant-select-tree li span.ant-select-tree-checkbox+.ant-select-tree-node-content-wrapper{width:calc(100% - 46px)}.ant-select-tree li span.ant-select-tree-iconEle,.ant-select-tree li span.ant-select-tree-switcher{margin:0;width:24px;height:24px;line-height:22px;display:inline-block;vertical-align:middle;border:0 none;cursor:pointer;outline:none;text-align:center}.ant-select-tree li span.ant-select-icon_loading .ant-select-switcher-loading-icon{display:inline-block;position:absolute;left:0;color:#1890ff;-webkit-transform:none;-ms-transform:none;transform:none;font-size:14px}.ant-select-tree li span.ant-select-icon_loading .ant-select-switcher-loading-icon svg{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}.ant-select-tree li span.ant-select-tree-switcher{position:relative}.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher-noop{cursor:auto}.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-select-switcher-icon,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-tree-switcher-icon{font-size:12px;font-size:7px\9;-webkit-transform:scale(.58333333) rotate(0deg);-ms-transform:scale(.58333333) rotate(0deg);transform:scale(.58333333) rotate(0deg);display:inline-block;font-weight:700}:root .ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-select-switcher-icon,:root .ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-tree-switcher-icon{font-size:12px}.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-select-switcher-icon svg,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-tree-switcher-icon svg{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-select-switcher-icon,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-tree-switcher-icon{font-size:12px;font-size:7px\9;-webkit-transform:scale(.58333333) rotate(0deg);-ms-transform:scale(.58333333) rotate(0deg);transform:scale(.58333333) rotate(0deg);display:inline-block;font-weight:700}:root .ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-select-switcher-icon,:root .ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-tree-switcher-icon{font-size:12px}.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-select-switcher-icon svg,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-tree-switcher-icon svg{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-select-switcher-icon svg{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-select-switcher-loading-icon,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-select-switcher-loading-icon{display:inline-block;position:absolute;left:0;width:24px;height:24px;color:#1890ff;-webkit-transform:none;-ms-transform:none;transform:none;font-size:14px}.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_close .ant-select-switcher-loading-icon svg,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher_open .ant-select-switcher-loading-icon svg{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}.ant-select-tree-child-tree,.ant-select-tree .ant-select-tree-treenode-loading .ant-select-tree-iconEle{display:none}.ant-select-tree-child-tree-open{display:block}li.ant-select-tree-treenode-disabled>.ant-select-tree-node-content-wrapper,li.ant-select-tree-treenode-disabled>.ant-select-tree-node-content-wrapper span,li.ant-select-tree-treenode-disabled>span:not(.ant-select-tree-switcher){color:rgba(0,0,0,.25);cursor:not-allowed}li.ant-select-tree-treenode-disabled>.ant-select-tree-node-content-wrapper:hover{background:transparent}.ant-select-tree-icon__close,.ant-select-tree-icon__open{margin-right:2px;vertical-align:top}.ant-select-tree-dropdown{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none}.ant-select-tree-dropdown .ant-select-dropdown-search{display:block;padding:4px}.ant-select-tree-dropdown .ant-select-dropdown-search .ant-select-search__field__wrap{width:100%}.ant-select-tree-dropdown .ant-select-dropdown-search .ant-select-search__field{padding:4px 7px;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #d9d9d9;border-radius:4px;outline:none}.ant-select-tree-dropdown .ant-select-dropdown-search.ant-select-search--hide{display:none}.ant-select-tree-dropdown .ant-select-not-found{cursor:not-allowed;color:rgba(0,0,0,.25);padding:7px 16px;display:block}@-webkit-keyframes antCheckboxEffect{0%{-webkit-transform:scale(1);transform:scale(1);opacity:.5}to{-webkit-transform:scale(1.6);transform:scale(1.6);opacity:0}}@keyframes antCheckboxEffect{0%{-webkit-transform:scale(1);transform:scale(1);opacity:.5}to{-webkit-transform:scale(1.6);transform:scale(1.6);opacity:0}}.ant-tree.ant-tree-directory{position:relative}.ant-tree.ant-tree-directory .ant-tree-child-tree>li span.ant-tree-switcher,.ant-tree.ant-tree-directory>li span.ant-tree-switcher{position:relative;z-index:1}.ant-tree.ant-tree-directory .ant-tree-child-tree>li span.ant-tree-switcher.ant-tree-switcher-noop,.ant-tree.ant-tree-directory>li span.ant-tree-switcher.ant-tree-switcher-noop{pointer-events:none}.ant-tree.ant-tree-directory .ant-tree-child-tree>li span.ant-tree-checkbox,.ant-tree.ant-tree-directory>li span.ant-tree-checkbox{position:relative;z-index:1}.ant-tree.ant-tree-directory .ant-tree-child-tree>li span.ant-tree-node-content-wrapper,.ant-tree.ant-tree-directory>li span.ant-tree-node-content-wrapper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-radius:0}.ant-tree.ant-tree-directory .ant-tree-child-tree>li span.ant-tree-node-content-wrapper:hover,.ant-tree.ant-tree-directory>li span.ant-tree-node-content-wrapper:hover{background:transparent}.ant-tree.ant-tree-directory .ant-tree-child-tree>li span.ant-tree-node-content-wrapper:hover:before,.ant-tree.ant-tree-directory>li span.ant-tree-node-content-wrapper:hover:before{background:#e6f7ff}.ant-tree.ant-tree-directory .ant-tree-child-tree>li span.ant-tree-node-content-wrapper.ant-tree-node-selected,.ant-tree.ant-tree-directory>li span.ant-tree-node-content-wrapper.ant-tree-node-selected{color:#fff;background:transparent}.ant-tree.ant-tree-directory .ant-tree-child-tree>li span.ant-tree-node-content-wrapper:before,.ant-tree.ant-tree-directory>li span.ant-tree-node-content-wrapper:before{content:"";position:absolute;left:0;right:0;height:24px;-webkit-transition:all .3s;transition:all .3s}.ant-tree.ant-tree-directory .ant-tree-child-tree>li span.ant-tree-node-content-wrapper>span,.ant-tree.ant-tree-directory>li span.ant-tree-node-content-wrapper>span{position:relative;z-index:1}.ant-tree.ant-tree-directory .ant-tree-child-tree>li.ant-tree-treenode-selected>span.ant-tree-switcher,.ant-tree.ant-tree-directory>li.ant-tree-treenode-selected>span.ant-tree-switcher{color:#fff}.ant-tree.ant-tree-directory .ant-tree-child-tree>li.ant-tree-treenode-selected>span.ant-tree-checkbox .ant-tree-checkbox-inner,.ant-tree.ant-tree-directory>li.ant-tree-treenode-selected>span.ant-tree-checkbox .ant-tree-checkbox-inner{border-color:#1890ff}.ant-tree.ant-tree-directory .ant-tree-child-tree>li.ant-tree-treenode-selected>span.ant-tree-checkbox.ant-tree-checkbox-checked:after,.ant-tree.ant-tree-directory>li.ant-tree-treenode-selected>span.ant-tree-checkbox.ant-tree-checkbox-checked:after{border-color:#fff}.ant-tree.ant-tree-directory .ant-tree-child-tree>li.ant-tree-treenode-selected>span.ant-tree-checkbox.ant-tree-checkbox-checked .ant-tree-checkbox-inner,.ant-tree.ant-tree-directory>li.ant-tree-treenode-selected>span.ant-tree-checkbox.ant-tree-checkbox-checked .ant-tree-checkbox-inner{background:#fff}.ant-tree.ant-tree-directory .ant-tree-child-tree>li.ant-tree-treenode-selected>span.ant-tree-checkbox.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after,.ant-tree.ant-tree-directory>li.ant-tree-treenode-selected>span.ant-tree-checkbox.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after{border-color:#1890ff}.ant-tree.ant-tree-directory .ant-tree-child-tree>li.ant-tree-treenode-selected>span.ant-tree-node-content-wrapper:before,.ant-tree.ant-tree-directory>li.ant-tree-treenode-selected>span.ant-tree-node-content-wrapper:before{background:#1890ff}.ant-tree-checkbox{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;white-space:nowrap;cursor:pointer;outline:none;display:inline-block;line-height:1;position:relative;vertical-align:middle;top:-.09em}.ant-tree-checkbox-input:focus+.ant-tree-checkbox-inner,.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox-inner,.ant-tree-checkbox:hover .ant-tree-checkbox-inner{border-color:#1890ff}.ant-tree-checkbox-checked:after{position:absolute;top:0;left:0;width:100%;height:100%;border-radius:2px;border:1px solid #1890ff;content:"";-webkit-animation:antCheckboxEffect .36s ease-in-out;animation:antCheckboxEffect .36s ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both;visibility:hidden}.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox:after,.ant-tree-checkbox:hover:after{visibility:visible}.ant-tree-checkbox-inner{position:relative;top:0;left:0;display:block;width:16px;height:16px;border:1px solid #d9d9d9;border-radius:2px;background-color:#fff;-webkit-transition:all .3s;transition:all .3s}.ant-tree-checkbox-inner:after{-webkit-transform:rotate(45deg) scale(0);-ms-transform:rotate(45deg) scale(0);transform:rotate(45deg) scale(0);position:absolute;left:4.57142857px;top:1.14285714px;display:table;width:5.71428571px;height:9.14285714px;border:2px solid #fff;border-top:0;border-left:0;content:" ";-webkit-transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;transition:all .1s cubic-bezier(.71,-.46,.88,.6),opacity .1s;opacity:0}.ant-tree-checkbox-input{position:absolute;left:0;z-index:1;cursor:pointer;opacity:0;top:0;bottom:0;right:0;width:100%;height:100%}.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner:after{content:" ";-webkit-transform:translate(-50%,-50%) scale(1);-ms-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1);border:0;left:50%;top:50%;width:8px;height:8px;background-color:#1890ff;opacity:1}.ant-tree-checkbox-indeterminate.ant-tree-checkbox-disabled .ant-tree-checkbox-inner:after{border-color:rgba(0,0,0,.25)}.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after{-webkit-transform:rotate(45deg) scale(1);-ms-transform:rotate(45deg) scale(1);transform:rotate(45deg) scale(1);position:absolute;display:table;border:2px solid #fff;border-top:0;border-left:0;content:" ";-webkit-transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;opacity:1}.ant-tree-checkbox-checked .ant-tree-checkbox-inner{background-color:#1890ff;border-color:#1890ff}.ant-tree-checkbox-disabled{cursor:not-allowed}.ant-tree-checkbox-disabled.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after{-webkit-animation-name:none;animation-name:none;border-color:rgba(0,0,0,.25)}.ant-tree-checkbox-disabled .ant-tree-checkbox-input{cursor:not-allowed}.ant-tree-checkbox-disabled .ant-tree-checkbox-inner{border-color:#d9d9d9!important;background-color:#f5f5f5}.ant-tree-checkbox-disabled .ant-tree-checkbox-inner:after{-webkit-animation-name:none;animation-name:none;border-color:#f5f5f5}.ant-tree-checkbox-disabled+span{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-tree-checkbox-wrapper{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;line-height:unset;cursor:pointer;display:inline-block}.ant-tree-checkbox-wrapper+.ant-tree-checkbox-wrapper{margin-left:8px}.ant-tree-checkbox+span,.ant-tree-checkbox-wrapper+span{padding-left:8px;padding-right:8px}.ant-tree-checkbox-group{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;display:inline-block}.ant-tree-checkbox-group-item{display:inline-block;margin-right:8px}.ant-tree-checkbox-group-item:last-child{margin-right:0}.ant-tree-checkbox-group-item+.ant-tree-checkbox-group-item{margin-left:0}.ant-tree{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box}.ant-tree,.ant-tree ol,.ant-tree ul{list-style:none;margin:0;padding:0}.ant-tree li{padding:4px 0;margin:0;list-style:none;white-space:nowrap;outline:0}.ant-tree li span[draggable=true],.ant-tree li span[draggable]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-top:2px solid transparent;border-bottom:2px solid transparent;-khtml-user-drag:element;-webkit-user-drag:element;line-height:20px}.ant-tree li.drag-over>span[draggable]{background-color:#1890ff;color:#fff;opacity:.8}.ant-tree li.drag-over-gap-top>span[draggable]{border-top-color:#1890ff}.ant-tree li.drag-over-gap-bottom>span[draggable]{border-bottom-color:#1890ff}.ant-tree li.filter-node>span{color:#f5222d!important;font-weight:500!important}.ant-tree li.ant-tree-treenode-loading span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-loading-icon,.ant-tree li.ant-tree-treenode-loading span.ant-tree-switcher.ant-tree-switcher_open .ant-tree-switcher-loading-icon{display:inline-block;position:absolute;left:0;width:24px;height:24px;color:#1890ff;-webkit-transform:none;-ms-transform:none;transform:none;font-size:14px}.ant-tree li.ant-tree-treenode-loading span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-loading-icon svg,.ant-tree li.ant-tree-treenode-loading span.ant-tree-switcher.ant-tree-switcher_open .ant-tree-switcher-loading-icon svg{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto}:root .ant-tree li.ant-tree-treenode-loading span.ant-tree-switcher.ant-tree-switcher_close:after,:root .ant-tree li.ant-tree-treenode-loading span.ant-tree-switcher.ant-tree-switcher_open:after{opacity:0}.ant-tree li ul{margin:0;padding:0 0 0 18px}.ant-tree li .ant-tree-node-content-wrapper{display:inline-block;padding:0 5px;border-radius:2px;margin:0;cursor:pointer;text-decoration:none;vertical-align:top;color:rgba(0,0,0,.65);-webkit-transition:all .3s;transition:all .3s;height:24px;line-height:24px}.ant-tree li .ant-tree-node-content-wrapper:hover{background-color:#e6f7ff}.ant-tree li .ant-tree-node-content-wrapper.ant-tree-node-selected{background-color:#bae7ff}.ant-tree li span.ant-tree-checkbox{margin:4px 4px 0 2px}.ant-tree li span.ant-tree-iconEle,.ant-tree li span.ant-tree-switcher{margin:0;width:24px;height:24px;line-height:24px;display:inline-block;vertical-align:top;border:0 none;cursor:pointer;outline:none;text-align:center}.ant-tree li span.ant-tree-switcher{position:relative}.ant-tree li span.ant-tree-switcher.ant-tree-switcher-noop{cursor:default}.ant-tree li span.ant-tree-switcher.ant-tree-switcher_open .ant-select-switcher-icon,.ant-tree li span.ant-tree-switcher.ant-tree-switcher_open .ant-tree-switcher-icon{font-size:12px;font-size:7px\9;-webkit-transform:scale(.58333333) rotate(0deg);-ms-transform:scale(.58333333) rotate(0deg);transform:scale(.58333333) rotate(0deg);display:inline-block;font-weight:700}:root .ant-tree li span.ant-tree-switcher.ant-tree-switcher_open .ant-select-switcher-icon,:root .ant-tree li span.ant-tree-switcher.ant-tree-switcher_open .ant-tree-switcher-icon{font-size:12px}.ant-tree li span.ant-tree-switcher.ant-tree-switcher_open .ant-select-switcher-icon svg,.ant-tree li span.ant-tree-switcher.ant-tree-switcher_open .ant-tree-switcher-icon svg{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.ant-tree li span.ant-tree-switcher.ant-tree-switcher_close .ant-select-switcher-icon,.ant-tree li span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-icon{font-size:12px;font-size:7px\9;-webkit-transform:scale(.58333333) rotate(0deg);-ms-transform:scale(.58333333) rotate(0deg);transform:scale(.58333333) rotate(0deg);display:inline-block;font-weight:700}:root .ant-tree li span.ant-tree-switcher.ant-tree-switcher_close .ant-select-switcher-icon,:root .ant-tree li span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-icon{font-size:12px}.ant-tree li span.ant-tree-switcher.ant-tree-switcher_close .ant-select-switcher-icon svg,.ant-tree li span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-icon svg{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.ant-tree li span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-icon svg{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.ant-tree li:last-child>span.ant-tree-iconEle:before,.ant-tree li:last-child>span.ant-tree-switcher:before{display:none}.ant-tree>li:first-child{padding-top:7px}.ant-tree>li:last-child{padding-bottom:7px}.ant-tree-child-tree{display:none}.ant-tree-child-tree-open{display:block}li.ant-tree-treenode-disabled>.ant-tree-node-content-wrapper,li.ant-tree-treenode-disabled>.ant-tree-node-content-wrapper span,li.ant-tree-treenode-disabled>span:not(.ant-tree-switcher){color:rgba(0,0,0,.25);cursor:not-allowed}li.ant-tree-treenode-disabled>.ant-tree-node-content-wrapper:hover{background:transparent}.ant-tree-icon__close,.ant-tree-icon__open{margin-right:2px;vertical-align:top}.ant-tree.ant-tree-show-line li{position:relative}.ant-tree.ant-tree-show-line li span.ant-tree-switcher{background:#fff;color:rgba(0,0,0,.45)}.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher-noop .ant-select-switcher-icon,.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher-noop .ant-tree-switcher-icon{font-size:12px;font-size:12px\9;-webkit-transform:scale(1) rotate(0deg);-ms-transform:scale(1) rotate(0deg);transform:scale(1) rotate(0deg);display:inline-block;font-weight:400}:root .ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher-noop .ant-select-switcher-icon,:root .ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher-noop .ant-tree-switcher-icon{font-size:12px}.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher-noop .ant-select-switcher-icon svg,.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher-noop .ant-tree-switcher-icon svg{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_open .ant-select-switcher-icon,.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_open .ant-tree-switcher-icon{font-size:12px;font-size:12px\9;-webkit-transform:scale(1) rotate(0deg);-ms-transform:scale(1) rotate(0deg);transform:scale(1) rotate(0deg);display:inline-block;font-weight:400}:root .ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_open .ant-select-switcher-icon,:root .ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_open .ant-tree-switcher-icon{font-size:12px}.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_open .ant-select-switcher-icon svg,.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_open .ant-tree-switcher-icon svg{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_close .ant-select-switcher-icon,.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-icon{font-size:12px;font-size:12px\9;-webkit-transform:scale(1) rotate(0deg);-ms-transform:scale(1) rotate(0deg);transform:scale(1) rotate(0deg);display:inline-block;font-weight:400}:root .ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_close .ant-select-switcher-icon,:root .ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-icon{font-size:12px}.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_close .ant-select-switcher-icon svg,.ant-tree.ant-tree-show-line li span.ant-tree-switcher.ant-tree-switcher_close .ant-tree-switcher-icon svg{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.ant-tree.ant-tree-show-line li:not(:last-child):before{content:" ";width:1px;border-left:1px solid #d9d9d9;height:100%;position:absolute;left:12px;margin:22px 0}.ant-tree.ant-tree-icon-hide .ant-tree-treenode-loading .ant-tree-iconEle{display:none}.ant-upload{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;outline:0}.ant-upload p{margin:0}.ant-upload-btn{display:block;width:100%;outline:none}.ant-upload input[type=file]{cursor:pointer}.ant-upload.ant-upload-select{display:inline-block}.ant-upload.ant-upload-select-picture-card{border:1px dashed #d9d9d9;width:104px;height:104px;border-radius:4px;background-color:#fafafa;text-align:center;cursor:pointer;-webkit-transition:border-color .3s ease;transition:border-color .3s ease;vertical-align:top;margin-right:8px;margin-bottom:8px;display:table}.ant-upload.ant-upload-select-picture-card>.ant-upload{width:100%;height:100%;display:table-cell;text-align:center;vertical-align:middle;padding:8px}.ant-upload.ant-upload-select-picture-card:hover{border-color:#1890ff}.ant-upload.ant-upload-drag{border:1px dashed #d9d9d9;-webkit-transition:border-color .3s;transition:border-color .3s;cursor:pointer;border-radius:4px;text-align:center;width:100%;height:100%;position:relative;background:#fafafa}.ant-upload.ant-upload-drag .ant-upload{padding:16px 0}.ant-upload.ant-upload-drag.ant-upload-drag-hover:not(.ant-upload-disabled){border:2px dashed #40a9ff}.ant-upload.ant-upload-drag.ant-upload-disabled{cursor:not-allowed}.ant-upload.ant-upload-drag .ant-upload-btn{display:table;height:100%}.ant-upload.ant-upload-drag .ant-upload-drag-container{display:table-cell;vertical-align:middle}.ant-upload.ant-upload-drag:not(.ant-upload-disabled):hover{border-color:#40a9ff}.ant-upload.ant-upload-drag p.ant-upload-drag-icon{margin-bottom:20px}.ant-upload.ant-upload-drag p.ant-upload-drag-icon .anticon{font-size:48px;color:#40a9ff}.ant-upload.ant-upload-drag p.ant-upload-text{font-size:16px;margin:0 0 4px;color:rgba(0,0,0,.85)}.ant-upload.ant-upload-drag p.ant-upload-hint{font-size:14px;color:rgba(0,0,0,.45)}.ant-upload.ant-upload-drag .anticon-plus{font-size:30px;-webkit-transition:all .3s;transition:all .3s;color:rgba(0,0,0,.25)}.ant-upload.ant-upload-drag .anticon-plus:hover,.ant-upload.ant-upload-drag:hover .anticon-plus{color:rgba(0,0,0,.45)}.ant-upload-list{font-family:Chinese Quote,-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:14px;font-variant:tabular-nums;line-height:1.5;color:rgba(0,0,0,.65);-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;list-style:none;zoom:1}.ant-upload-list:after,.ant-upload-list:before{content:"";display:table}.ant-upload-list:after{clear:both}.ant-upload-list-item{margin-top:8px;font-size:14px;position:relative;height:22px}.ant-upload-list-item-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-left:22px;width:100%;display:inline-block}.ant-upload-list-item-info{height:100%;padding:0 12px 0 4px;-webkit-transition:background-color .3s;transition:background-color .3s}.ant-upload-list-item-info>span{display:block}.ant-upload-list-item-info .anticon-loading,.ant-upload-list-item-info .anticon-paper-clip{font-size:14px;color:rgba(0,0,0,.45);position:absolute;top:5px}.ant-upload-list-item .anticon-close{display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);-ms-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg);-webkit-transition:all .3s;transition:all .3s;opacity:0;cursor:pointer;position:absolute;top:6px;right:4px;color:rgba(0,0,0,.45);line-height:0}:root .ant-upload-list-item .anticon-close{font-size:12px}.ant-upload-list-item .anticon-close:hover{color:rgba(0,0,0,.65)}.ant-upload-list-item:hover .ant-upload-list-item-info{background-color:#e6f7ff}.ant-upload-list-item:hover .anticon-close{opacity:1}.ant-upload-list-item-error,.ant-upload-list-item-error .ant-upload-list-item-name,.ant-upload-list-item-error .anticon-paper-clip{color:#f5222d}.ant-upload-list-item-error .anticon-close{opacity:1;color:#f5222d!important}.ant-upload-list-item-progress{line-height:0;font-size:14px;position:absolute;width:100%;bottom:-12px;padding-left:26px}.ant-upload-list-picture-card .ant-upload-list-item,.ant-upload-list-picture .ant-upload-list-item{padding:8px;border-radius:4px;border:1px solid #d9d9d9;height:66px;position:relative}.ant-upload-list-picture-card .ant-upload-list-item:hover,.ant-upload-list-picture .ant-upload-list-item:hover{background:transparent}.ant-upload-list-picture-card .ant-upload-list-item-error,.ant-upload-list-picture .ant-upload-list-item-error{border-color:#f5222d}.ant-upload-list-picture-card .ant-upload-list-item-info,.ant-upload-list-picture .ant-upload-list-item-info{padding:0}.ant-upload-list-picture-card .ant-upload-list-item:hover .ant-upload-list-item-info,.ant-upload-list-picture .ant-upload-list-item:hover .ant-upload-list-item-info{background:transparent}.ant-upload-list-picture-card .ant-upload-list-item-uploading,.ant-upload-list-picture .ant-upload-list-item-uploading{border-style:dashed}.ant-upload-list-picture-card .ant-upload-list-item-thumbnail,.ant-upload-list-picture .ant-upload-list-item-thumbnail{width:48px;height:48px;position:absolute;top:8px;left:8px;text-align:center}.ant-upload-list-picture-card .ant-upload-list-item-icon,.ant-upload-list-picture .ant-upload-list-item-icon{color:rgba(0,0,0,.25);font-size:36px;position:absolute;top:50%;left:50%;margin-top:-18px;margin-left:-18px}.ant-upload-list-picture-card .ant-upload-list-item-thumbnail img,.ant-upload-list-picture .ant-upload-list-item-thumbnail img{width:48px;height:48px;display:block;overflow:hidden}.ant-upload-list-picture-card .ant-upload-list-item-thumbnail.anticon:before,.ant-upload-list-picture .ant-upload-list-item-thumbnail.anticon:before{line-height:48px;font-size:24px;color:rgba(0,0,0,.45)}.ant-upload-list-picture-card .ant-upload-list-item-name,.ant-upload-list-picture .ant-upload-list-item-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin:0 0 0 8px;line-height:44px;-webkit-transition:all .3s;transition:all .3s;padding-left:48px;padding-right:8px;max-width:100%;display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box}.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-name,.ant-upload-list-picture .ant-upload-list-item-uploading .ant-upload-list-item-name{line-height:28px}.ant-upload-list-picture-card .ant-upload-list-item-progress,.ant-upload-list-picture .ant-upload-list-item-progress{padding-left:56px;margin-top:0;bottom:14px;width:calc(100% - 24px)}.ant-upload-list-picture-card .anticon-close,.ant-upload-list-picture .anticon-close{position:absolute;right:8px;top:8px;line-height:1;opacity:1}.ant-upload-list-picture-card{float:left}.ant-upload-list-picture-card.ant-upload-list:after{display:none}.ant-upload-list-picture-card .ant-upload-list-item{float:left;width:104px;height:104px;margin:0 8px 8px 0}.ant-upload-list-picture-card .ant-upload-list-item-info{height:100%;position:relative;overflow:hidden}.ant-upload-list-picture-card .ant-upload-list-item-info:before{content:" ";position:absolute;z-index:1;background-color:rgba(0,0,0,.5);-webkit-transition:all .3s;transition:all .3s;width:100%;height:100%;opacity:0}.ant-upload-list-picture-card .ant-upload-list-item:hover .ant-upload-list-item-info:before{opacity:1}.ant-upload-list-picture-card .ant-upload-list-item-actions{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);z-index:10;white-space:nowrap;opacity:0;-webkit-transition:all .3s;transition:all .3s}.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete,.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye-o{z-index:10;-webkit-transition:all .3s;transition:all .3s;cursor:pointer;font-size:16px;width:16px;color:hsla(0,0%,100%,.85);margin:0 4px}.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete:hover,.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye-o:hover{color:#fff}.ant-upload-list-picture-card .ant-upload-list-item-actions:hover,.ant-upload-list-picture-card .ant-upload-list-item-info:hover+.ant-upload-list-item-actions{opacity:1}.ant-upload-list-picture-card .ant-upload-list-item-thumbnail,.ant-upload-list-picture-card .ant-upload-list-item-thumbnail img{display:block;width:100%;height:100%;position:static}.ant-upload-list-picture-card .ant-upload-list-item-name{margin:8px 0 0;padding:0;text-align:center;line-height:1.5;display:none}.ant-upload-list-picture-card .anticon-picture+.ant-upload-list-item-name{display:block}.ant-upload-list-picture-card .ant-upload-list-item-uploading.ant-upload-list-item{background-color:#fafafa}.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info{height:auto}.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info .anticon-delete,.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info .anticon-eye-o,.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info:before{display:none}.ant-upload-list-picture-card .ant-upload-list-item-uploading-text{margin-top:18px;color:rgba(0,0,0,.45)}.ant-upload-list-picture-card .ant-upload-list-item-progress{padding-left:0;bottom:32px}.ant-upload-list .ant-upload-success-icon{color:#52c41a;font-weight:700}.ant-upload-list .ant-upload-animate-enter,.ant-upload-list .ant-upload-animate-inline-enter,.ant-upload-list .ant-upload-animate-inline-leave,.ant-upload-list .ant-upload-animate-leave{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:cubic-bezier(.78,.14,.15,.86);animation-fill-mode:cubic-bezier(.78,.14,.15,.86)}.ant-upload-list .ant-upload-animate-enter{-webkit-animation-name:uploadAnimateIn;animation-name:uploadAnimateIn}.ant-upload-list .ant-upload-animate-leave{-webkit-animation-name:uploadAnimateOut;animation-name:uploadAnimateOut}.ant-upload-list .ant-upload-animate-inline-enter{-webkit-animation-name:uploadAnimateInlineIn;animation-name:uploadAnimateInlineIn}.ant-upload-list .ant-upload-animate-inline-leave{-webkit-animation-name:uploadAnimateInlineOut;animation-name:uploadAnimateInlineOut}@-webkit-keyframes uploadAnimateIn{0%{height:0;margin:0;opacity:0;padding:0}}@keyframes uploadAnimateIn{0%{height:0;margin:0;opacity:0;padding:0}}@-webkit-keyframes uploadAnimateOut{to{height:0;margin:0;padding:0;opacity:0}}@keyframes uploadAnimateOut{to{height:0;margin:0;padding:0;opacity:0}}@-webkit-keyframes uploadAnimateInlineIn{0%{width:0;height:0;margin:0;opacity:0;padding:0}}@keyframes uploadAnimateInlineIn{0%{width:0;height:0;margin:0;opacity:0;padding:0}}@-webkit-keyframes uploadAnimateInlineOut{to{width:0;height:0;margin:0;padding:0;opacity:0}}@keyframes uploadAnimateInlineOut{to{width:0;height:0;margin:0;padding:0;opacity:0}} +/*# sourceMappingURL=antd.min.css.map*/ \ No newline at end of file diff --git a/cyclone-web/vendor/antd/antd.min.js b/cyclone-web/vendor/antd/antd.min.js new file mode 100644 index 0000000000000000000000000000000000000000..eda1e05dbaf6ae4b6814b289f0a992d54a1932db --- /dev/null +++ b/cyclone-web/vendor/antd/antd.min.js @@ -0,0 +1,36 @@ +/*! + * + * antd v3.9.3 + * + * Copyright 2015-present, Alipay, Inc. + * All rights reserved. + * + */ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("react"),require("react-dom"),require("moment")):"function"==typeof define&&define.amd?define(["react","react-dom","moment"],t):"object"==typeof exports?exports.antd=t(require("react"),require("react-dom"),require("moment")):e.antd=t(e.React,e.ReactDOM,e.moment)}("undefined"!=typeof self?self:this,function(e,t,n){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=566)}([function(t,n){t.exports=e},function(e,t,n){"use strict";t.__esModule=!0;var r=n(238),o=function(e){return e&&e.__esModule?e:{default:e}}(r);t.default=o.default||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}},function(e,t,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 r=n(16),o=function(e){return e&&e.__esModule?e:{default:e}}(r);t.default=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!==(void 0===t?"undefined":(0,o.default)(t))&&"function"!=typeof t?e:t}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var o=n(263),i=r(o),a=n(267),c=r(a),s=n(16),l=r(s);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,l.default)(t)));e.prototype=(0,c.default)(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(i.default?(0,i.default)(e,t):e.__proto__=t)}},function(e,t,n){e.exports=n(270)()},function(e,t,n){"use strict";t.__esModule=!0;var r=n(147),o=function(e){return e&&e.__esModule?e:{default:e}}(r);t.default=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),(0,o.default)(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}()},function(e,t,n){var r,o;/*! + Copyright (c) 2017 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/classnames +*/ +!function(){"use strict";function n(){for(var e=[],t=0;t<arguments.length;t++){var r=arguments[t];if(r){var o=typeof r;if("string"===o||"number"===o)e.push(r);else if(Array.isArray(r)&&r.length){var a=n.apply(null,r);a&&e.push(a)}else if("object"===o)for(var c in r)i.call(r,c)&&r[c]&&e.push(c)}}return e.join(" ")}var i={}.hasOwnProperty;void 0!==e&&e.exports?(n.default=n,e.exports=n):(r=[],void 0!==(o=function(){return n}.apply(t,r))&&(e.exports=o))}()},function(e,t,n){"use strict";t.__esModule=!0;var r=n(147),o=function(e){return e&&e.__esModule?e:{default:e}}(r);t.default=function(e,t,n){return t in e?(0,o.default)(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}},function(e,n){e.exports=t},function(e,t,n){"use strict";function r(e,t,n,r,i,a,c,s){if(o(t),!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,i,a,c,s],p=0;l=new Error(t.replace(/%s/g,function(){return u[p++]})),l.name="Invariant Violation"}throw l.framesToPop=1,l}}var o=function(e){};e.exports=r},function(e,t,n){!function(t,n){e.exports=n()}(0,function(){"use strict";function e(e,t){t&&(e.prototype=Object.create(t.prototype)),e.prototype.constructor=e}function t(e){return i(e)?e:E(e)}function n(e){return a(e)?e:T(e)}function r(e){return c(e)?e:N(e)}function o(e){return i(e)&&!s(e)?e:V(e)}function i(e){return!(!e||!e[ln])}function a(e){return!(!e||!e[un])}function c(e){return!(!e||!e[pn])}function s(e){return a(e)||c(e)}function l(e){return!(!e||!e[fn])}function u(e){return e.value=!1,e}function p(e){e&&(e.value=!0)}function f(){}function h(e,t){t=t||0;for(var n=Math.max(0,e.length-t),r=new Array(n),o=0;o<n;o++)r[o]=e[o+t];return r}function d(e){return void 0===e.size&&(e.size=e.__iterate(m)),e.size}function v(e,t){if("number"!=typeof t){var n=t>>>0;if(""+n!==t||4294967295===n)return NaN;t=n}return t<0?d(e)+t:t}function m(){return!0}function y(e,t,n){return(0===e||void 0!==n&&e<=-n)&&(void 0===t||void 0!==n&&t>=n)}function g(e,t){return C(e,t,0)}function b(e,t){return C(e,t,t)}function C(e,t,n){return void 0===e?n:e<0?Math.max(0,t+e):void 0===t?e:Math.min(t,e)}function w(e){this.next=e}function S(e,t,n,r){var o=0===e?t:1===e?n:[t,n];return r?r.value=o:r={value:o,done:!1},r}function x(){return{value:void 0,done:!0}}function M(e){return!!_(e)}function z(e){return e&&"function"==typeof e.next}function k(e){var t=_(e);return t&&t.call(e)}function _(e){var t=e&&(Sn&&e[Sn]||e[xn]);if("function"==typeof t)return t}function O(e){return e&&"number"==typeof e.length}function E(e){return null===e||void 0===e?I():i(e)?e.toSeq():F(e)}function T(e){return null===e||void 0===e?I().toKeyedSeq():i(e)?a(e)?e.toSeq():e.fromEntrySeq():R(e)}function N(e){return null===e||void 0===e?I():i(e)?a(e)?e.entrySeq():e.toIndexedSeq():j(e)}function V(e){return(null===e||void 0===e?I():i(e)?a(e)?e.entrySeq():e:j(e)).toSetSeq()}function P(e){this._array=e,this.size=e.length}function H(e){var t=Object.keys(e);this._object=e,this._keys=t,this.size=t.length}function L(e){this._iterable=e,this.size=e.length||e.size}function D(e){this._iterator=e,this._iteratorCache=[]}function A(e){return!(!e||!e[zn])}function I(){return kn||(kn=new P([]))}function R(e){var t=Array.isArray(e)?new P(e).fromEntrySeq():z(e)?new D(e).fromEntrySeq():M(e)?new L(e).fromEntrySeq():"object"==typeof e?new H(e):void 0;if(!t)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+e);return t}function j(e){var t=K(e);if(!t)throw new TypeError("Expected Array or iterable object of values: "+e);return t}function F(e){var t=K(e)||"object"==typeof e&&new H(e);if(!t)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+e);return t}function K(e){return O(e)?new P(e):z(e)?new D(e):M(e)?new L(e):void 0}function B(e,t,n,r){var o=e._cache;if(o){for(var i=o.length-1,a=0;a<=i;a++){var c=o[n?i-a:a];if(!1===t(c[1],r?c[0]:a,e))return a+1}return a}return e.__iterateUncached(t,n)}function W(e,t,n,r){var o=e._cache;if(o){var i=o.length-1,a=0;return new w(function(){var e=o[n?i-a:a];return a++>i?x():S(t,r?e[0]:a-1,e[1])})}return e.__iteratorUncached(t,n)}function U(e,t){return t?q(t,e,"",{"":e}):Y(e)}function q(e,t,n,r){return Array.isArray(t)?e.call(r,n,N(t).map(function(n,r){return q(e,n,r,t)})):G(t)?e.call(r,n,T(t).map(function(n,r){return q(e,n,r,t)})):t}function Y(e){return Array.isArray(e)?N(e).map(Y).toList():G(e)?T(e).map(Y).toMap():e}function G(e){return e&&(e.constructor===Object||void 0===e.constructor)}function X(e,t){if(e===t||e!==e&&t!==t)return!0;if(!e||!t)return!1;if("function"==typeof e.valueOf&&"function"==typeof t.valueOf){if(e=e.valueOf(),t=t.valueOf(),e===t||e!==e&&t!==t)return!0;if(!e||!t)return!1}return!("function"!=typeof e.equals||"function"!=typeof t.equals||!e.equals(t))}function $(e,t){if(e===t)return!0;if(!i(t)||void 0!==e.size&&void 0!==t.size&&e.size!==t.size||void 0!==e.__hash&&void 0!==t.__hash&&e.__hash!==t.__hash||a(e)!==a(t)||c(e)!==c(t)||l(e)!==l(t))return!1;if(0===e.size&&0===t.size)return!0;var n=!s(e);if(l(e)){var r=e.entries();return t.every(function(e,t){var o=r.next().value;return o&&X(o[1],e)&&(n||X(o[0],t))})&&r.next().done}var o=!1;if(void 0===e.size)if(void 0===t.size)"function"==typeof e.cacheResult&&e.cacheResult();else{o=!0;var u=e;e=t,t=u}var p=!0,f=t.__iterate(function(t,r){if(n?!e.has(t):o?!X(t,e.get(r,mn)):!X(e.get(r,mn),t))return p=!1,!1});return p&&e.size===f}function J(e,t){if(!(this instanceof J))return new J(e,t);if(this._value=e,this.size=void 0===t?1/0:Math.max(0,t),0===this.size){if(_n)return _n;_n=this}}function Z(e,t){if(!e)throw new Error(t)}function Q(e,t,n){if(!(this instanceof Q))return new Q(e,t,n);if(Z(0!==n,"Cannot step a Range by 0"),e=e||0,void 0===t&&(t=1/0),n=void 0===n?1:Math.abs(n),t<e&&(n=-n),this._start=e,this._end=t,this._step=n,this.size=Math.max(0,Math.ceil((t-e)/n-1)+1),0===this.size){if(On)return On;On=this}}function ee(){throw TypeError("Abstract")}function te(){}function ne(){}function re(){}function oe(e){return e>>>1&1073741824|3221225471&e}function ie(e){if(!1===e||null===e||void 0===e)return 0;if("function"==typeof e.valueOf&&(!1===(e=e.valueOf())||null===e||void 0===e))return 0;if(!0===e)return 1;var t=typeof e;if("number"===t){var n=0|e;for(n!==e&&(n^=4294967295*e);e>4294967295;)e/=4294967295,n^=e;return oe(n)}if("string"===t)return e.length>Dn?ae(e):ce(e);if("function"==typeof e.hashCode)return e.hashCode();if("object"===t)return se(e);if("function"==typeof e.toString)return ce(e.toString());throw new Error("Value type "+t+" cannot be hashed.")}function ae(e){var t=Rn[e];return void 0===t&&(t=ce(e),In===An&&(In=0,Rn={}),In++,Rn[e]=t),t}function ce(e){for(var t=0,n=0;n<e.length;n++)t=31*t+e.charCodeAt(n)|0;return oe(t)}function se(e){var t;if(Pn&&void 0!==(t=En.get(e)))return t;if(void 0!==(t=e[Ln]))return t;if(!Vn){if(void 0!==(t=e.propertyIsEnumerable&&e.propertyIsEnumerable[Ln]))return t;if(void 0!==(t=le(e)))return t}if(t=++Hn,1073741824&Hn&&(Hn=0),Pn)En.set(e,t);else{if(void 0!==Nn&&!1===Nn(e))throw new Error("Non-extensible objects are not allowed as keys.");if(Vn)Object.defineProperty(e,Ln,{enumerable:!1,configurable:!1,writable:!1,value:t});else if(void 0!==e.propertyIsEnumerable&&e.propertyIsEnumerable===e.constructor.prototype.propertyIsEnumerable)e.propertyIsEnumerable=function(){return this.constructor.prototype.propertyIsEnumerable.apply(this,arguments)},e.propertyIsEnumerable[Ln]=t;else{if(void 0===e.nodeType)throw new Error("Unable to set a non-enumerable property on object.");e[Ln]=t}}return t}function le(e){if(e&&e.nodeType>0)switch(e.nodeType){case 1:return e.uniqueID;case 9:return e.documentElement&&e.documentElement.uniqueID}}function ue(e){Z(e!==1/0,"Cannot perform this action with an infinite size.")}function pe(e){return null===e||void 0===e?Se():fe(e)&&!l(e)?e:Se().withMutations(function(t){var r=n(e);ue(r.size),r.forEach(function(e,n){return t.set(n,e)})})}function fe(e){return!(!e||!e[jn])}function he(e,t){this.ownerID=e,this.entries=t}function de(e,t,n){this.ownerID=e,this.bitmap=t,this.nodes=n}function ve(e,t,n){this.ownerID=e,this.count=t,this.nodes=n}function me(e,t,n){this.ownerID=e,this.keyHash=t,this.entries=n}function ye(e,t,n){this.ownerID=e,this.keyHash=t,this.entry=n}function ge(e,t,n){this._type=t,this._reverse=n,this._stack=e._root&&Ce(e._root)}function be(e,t){return S(e,t[0],t[1])}function Ce(e,t){return{node:e,index:0,__prev:t}}function we(e,t,n,r){var o=Object.create(Fn);return o.size=e,o._root=t,o.__ownerID=n,o.__hash=r,o.__altered=!1,o}function Se(){return Kn||(Kn=we(0))}function xe(e,t,n){var r,o;if(e._root){var i=u(yn),a=u(gn);if(r=Me(e._root,e.__ownerID,0,void 0,t,n,i,a),!a.value)return e;o=e.size+(i.value?n===mn?-1:1:0)}else{if(n===mn)return e;o=1,r=new he(e.__ownerID,[[t,n]])}return e.__ownerID?(e.size=o,e._root=r,e.__hash=void 0,e.__altered=!0,e):r?we(o,r):Se()}function Me(e,t,n,r,o,i,a,c){return e?e.update(t,n,r,o,i,a,c):i===mn?e:(p(c),p(a),new ye(t,r,[o,i]))}function ze(e){return e.constructor===ye||e.constructor===me}function ke(e,t,n,r,o){if(e.keyHash===r)return new me(t,r,[e.entry,o]);var i,a=(0===n?e.keyHash:e.keyHash>>>n)&vn,c=(0===n?r:r>>>n)&vn;return new de(t,1<<a|1<<c,a===c?[ke(e,t,n+hn,r,o)]:(i=new ye(t,r,o),a<c?[e,i]:[i,e]))}function _e(e,t,n,r){e||(e=new f);for(var o=new ye(e,ie(n),[n,r]),i=0;i<t.length;i++){var a=t[i];o=o.update(e,0,void 0,a[0],a[1])}return o}function Oe(e,t,n,r){for(var o=0,i=0,a=new Array(n),c=0,s=1,l=t.length;c<l;c++,s<<=1){var u=t[c];void 0!==u&&c!==r&&(o|=s,a[i++]=u)}return new de(e,o,a)}function Ee(e,t,n,r,o){for(var i=0,a=new Array(dn),c=0;0!==n;c++,n>>>=1)a[c]=1&n?t[i++]:void 0;return a[r]=o,new ve(e,i+1,a)}function Te(e,t,r){for(var o=[],a=0;a<r.length;a++){var c=r[a],s=n(c);i(c)||(s=s.map(function(e){return U(e)})),o.push(s)}return Pe(e,t,o)}function Ne(e,t,n){return e&&e.mergeDeep&&i(t)?e.mergeDeep(t):X(e,t)?e:t}function Ve(e){return function(t,n,r){if(t&&t.mergeDeepWith&&i(n))return t.mergeDeepWith(e,n);var o=e(t,n,r);return X(t,o)?t:o}}function Pe(e,t,n){return n=n.filter(function(e){return 0!==e.size}),0===n.length?e:0!==e.size||e.__ownerID||1!==n.length?e.withMutations(function(e){for(var r=t?function(n,r){e.update(r,mn,function(e){return e===mn?n:t(e,n,r)})}:function(t,n){e.set(n,t)},o=0;o<n.length;o++)n[o].forEach(r)}):e.constructor(n[0])}function He(e,t,n,r){var o=e===mn,i=t.next();if(i.done){var a=o?n:e,c=r(a);return c===a?e:c}Z(o||e&&e.set,"invalid keyPath");var s=i.value,l=o?mn:e.get(s,mn),u=He(l,t,n,r);return u===l?e:u===mn?e.remove(s):(o?Se():e).set(s,u)}function Le(e){return e-=e>>1&1431655765,e=(858993459&e)+(e>>2&858993459),e=e+(e>>4)&252645135,e+=e>>8,127&(e+=e>>16)}function De(e,t,n,r){var o=r?e:h(e);return o[t]=n,o}function Ae(e,t,n,r){var o=e.length+1;if(r&&t+1===o)return e[t]=n,e;for(var i=new Array(o),a=0,c=0;c<o;c++)c===t?(i[c]=n,a=-1):i[c]=e[c+a];return i}function Ie(e,t,n){var r=e.length-1;if(n&&t===r)return e.pop(),e;for(var o=new Array(r),i=0,a=0;a<r;a++)a===t&&(i=1),o[a]=e[a+i];return o}function Re(e){var t=We();if(null===e||void 0===e)return t;if(je(e))return e;var n=r(e),o=n.size;return 0===o?t:(ue(o),o>0&&o<dn?Be(0,o,hn,null,new Fe(n.toArray())):t.withMutations(function(e){e.setSize(o),n.forEach(function(t,n){return e.set(n,t)})}))}function je(e){return!(!e||!e[qn])}function Fe(e,t){this.array=e,this.ownerID=t}function Ke(e,t){function n(e,t,n){return 0===t?r(e,n):o(e,t,n)}function r(e,n){var r=n===c?s&&s.array:e&&e.array,o=n>i?0:i-n,l=a-n;return l>dn&&(l=dn),function(){if(o===l)return Xn;var e=t?--l:o++;return r&&r[e]}}function o(e,r,o){var c,s=e&&e.array,l=o>i?0:i-o>>r,u=1+(a-o>>r);return u>dn&&(u=dn),function(){for(;;){if(c){var e=c();if(e!==Xn)return e;c=null}if(l===u)return Xn;var i=t?--u:l++;c=n(s&&s[i],r-hn,o+(i<<r))}}}var i=e._origin,a=e._capacity,c=Je(a),s=e._tail;return n(e._root,e._level,0)}function Be(e,t,n,r,o,i,a){var c=Object.create(Yn);return c.size=t-e,c._origin=e,c._capacity=t,c._level=n,c._root=r,c._tail=o,c.__ownerID=i,c.__hash=a,c.__altered=!1,c}function We(){return Gn||(Gn=Be(0,0,hn))}function Ue(e,t,n){if((t=v(e,t))!==t)return e;if(t>=e.size||t<0)return e.withMutations(function(e){t<0?Xe(e,t).set(0,n):Xe(e,0,t+1).set(t,n)});t+=e._origin;var r=e._tail,o=e._root,i=u(gn);return t>=Je(e._capacity)?r=qe(r,e.__ownerID,0,t,n,i):o=qe(o,e.__ownerID,e._level,t,n,i),i.value?e.__ownerID?(e._root=o,e._tail=r,e.__hash=void 0,e.__altered=!0,e):Be(e._origin,e._capacity,e._level,o,r):e}function qe(e,t,n,r,o,i){var a=r>>>n&vn,c=e&&a<e.array.length;if(!c&&void 0===o)return e;var s;if(n>0){var l=e&&e.array[a],u=qe(l,t,n-hn,r,o,i);return u===l?e:(s=Ye(e,t),s.array[a]=u,s)}return c&&e.array[a]===o?e:(p(i),s=Ye(e,t),void 0===o&&a===s.array.length-1?s.array.pop():s.array[a]=o,s)}function Ye(e,t){return t&&e&&t===e.ownerID?e:new Fe(e?e.array.slice():[],t)}function Ge(e,t){if(t>=Je(e._capacity))return e._tail;if(t<1<<e._level+hn){for(var n=e._root,r=e._level;n&&r>0;)n=n.array[t>>>r&vn],r-=hn;return n}}function Xe(e,t,n){void 0!==t&&(t|=0),void 0!==n&&(n|=0);var r=e.__ownerID||new f,o=e._origin,i=e._capacity,a=o+t,c=void 0===n?i:n<0?i+n:o+n;if(a===o&&c===i)return e;if(a>=c)return e.clear();for(var s=e._level,l=e._root,u=0;a+u<0;)l=new Fe(l&&l.array.length?[void 0,l]:[],r),s+=hn,u+=1<<s;u&&(a+=u,o+=u,c+=u,i+=u);for(var p=Je(i),h=Je(c);h>=1<<s+hn;)l=new Fe(l&&l.array.length?[l]:[],r),s+=hn;var d=e._tail,v=h<p?Ge(e,c-1):h>p?new Fe([],r):d;if(d&&h>p&&a<i&&d.array.length){l=Ye(l,r);for(var m=l,y=s;y>hn;y-=hn){var g=p>>>y&vn;m=m.array[g]=Ye(m.array[g],r)}m.array[p>>>hn&vn]=d}if(c<i&&(v=v&&v.removeAfter(r,0,c)),a>=h)a-=h,c-=h,s=hn,l=null,v=v&&v.removeBefore(r,0,a);else if(a>o||h<p){for(u=0;l;){var b=a>>>s&vn;if(b!==h>>>s&vn)break;b&&(u+=(1<<s)*b),s-=hn,l=l.array[b]}l&&a>o&&(l=l.removeBefore(r,s,a-u)),l&&h<p&&(l=l.removeAfter(r,s,h-u)),u&&(a-=u,c-=u)}return e.__ownerID?(e.size=c-a,e._origin=a,e._capacity=c,e._level=s,e._root=l,e._tail=v,e.__hash=void 0,e.__altered=!0,e):Be(a,c,s,l,v)}function $e(e,t,n){for(var o=[],a=0,c=0;c<n.length;c++){var s=n[c],l=r(s);l.size>a&&(a=l.size),i(s)||(l=l.map(function(e){return U(e)})),o.push(l)}return a>e.size&&(e=e.setSize(a)),Pe(e,t,o)}function Je(e){return e<dn?0:e-1>>>hn<<hn}function Ze(e){return null===e||void 0===e?tt():Qe(e)?e:tt().withMutations(function(t){var r=n(e);ue(r.size),r.forEach(function(e,n){return t.set(n,e)})})}function Qe(e){return fe(e)&&l(e)}function et(e,t,n,r){var o=Object.create(Ze.prototype);return o.size=e?e.size:0,o._map=e,o._list=t,o.__ownerID=n,o.__hash=r,o}function tt(){return $n||($n=et(Se(),We()))}function nt(e,t,n){var r,o,i=e._map,a=e._list,c=i.get(t),s=void 0!==c;if(n===mn){if(!s)return e;a.size>=dn&&a.size>=2*i.size?(o=a.filter(function(e,t){return void 0!==e&&c!==t}),r=o.toKeyedSeq().map(function(e){return e[0]}).flip().toMap(),e.__ownerID&&(r.__ownerID=o.__ownerID=e.__ownerID)):(r=i.remove(t),o=c===a.size-1?a.pop():a.set(c,void 0))}else if(s){if(n===a.get(c)[1])return e;r=i,o=a.set(c,[t,n])}else r=i.set(t,a.size),o=a.set(a.size,[t,n]);return e.__ownerID?(e.size=r.size,e._map=r,e._list=o,e.__hash=void 0,e):et(r,o)}function rt(e,t){this._iter=e,this._useKeys=t,this.size=e.size}function ot(e){this._iter=e,this.size=e.size}function it(e){this._iter=e,this.size=e.size}function at(e){this._iter=e,this.size=e.size}function ct(e){var t=Ot(e);return t._iter=e,t.size=e.size,t.flip=function(){return e},t.reverse=function(){var t=e.reverse.apply(this);return t.flip=function(){return e.reverse()},t},t.has=function(t){return e.includes(t)},t.includes=function(t){return e.has(t)},t.cacheResult=Et,t.__iterateUncached=function(t,n){var r=this;return e.__iterate(function(e,n){return!1!==t(n,e,r)},n)},t.__iteratorUncached=function(t,n){if(t===wn){var r=e.__iterator(t,n);return new w(function(){var e=r.next();if(!e.done){var t=e.value[0];e.value[0]=e.value[1],e.value[1]=t}return e})}return e.__iterator(t===Cn?bn:Cn,n)},t}function st(e,t,n){var r=Ot(e);return r.size=e.size,r.has=function(t){return e.has(t)},r.get=function(r,o){var i=e.get(r,mn);return i===mn?o:t.call(n,i,r,e)},r.__iterateUncached=function(r,o){var i=this;return e.__iterate(function(e,o,a){return!1!==r(t.call(n,e,o,a),o,i)},o)},r.__iteratorUncached=function(r,o){var i=e.__iterator(wn,o);return new w(function(){var o=i.next();if(o.done)return o;var a=o.value,c=a[0];return S(r,c,t.call(n,a[1],c,e),o)})},r}function lt(e,t){var n=Ot(e);return n._iter=e,n.size=e.size,n.reverse=function(){return e},e.flip&&(n.flip=function(){var t=ct(e);return t.reverse=function(){return e.flip()},t}),n.get=function(n,r){return e.get(t?n:-1-n,r)},n.has=function(n){return e.has(t?n:-1-n)},n.includes=function(t){return e.includes(t)},n.cacheResult=Et,n.__iterate=function(t,n){var r=this;return e.__iterate(function(e,n){return t(e,n,r)},!n)},n.__iterator=function(t,n){return e.__iterator(t,!n)},n}function ut(e,t,n,r){var o=Ot(e);return r&&(o.has=function(r){var o=e.get(r,mn);return o!==mn&&!!t.call(n,o,r,e)},o.get=function(r,o){var i=e.get(r,mn);return i!==mn&&t.call(n,i,r,e)?i:o}),o.__iterateUncached=function(o,i){var a=this,c=0;return e.__iterate(function(e,i,s){if(t.call(n,e,i,s))return c++,o(e,r?i:c-1,a)},i),c},o.__iteratorUncached=function(o,i){var a=e.__iterator(wn,i),c=0;return new w(function(){for(;;){var i=a.next();if(i.done)return i;var s=i.value,l=s[0],u=s[1];if(t.call(n,u,l,e))return S(o,r?l:c++,u,i)}})},o}function pt(e,t,n){var r=pe().asMutable();return e.__iterate(function(o,i){r.update(t.call(n,o,i,e),0,function(e){return e+1})}),r.asImmutable()}function ft(e,t,n){var r=a(e),o=(l(e)?Ze():pe()).asMutable();e.__iterate(function(i,a){o.update(t.call(n,i,a,e),function(e){return e=e||[],e.push(r?[a,i]:i),e})});var i=_t(e);return o.map(function(t){return Mt(e,i(t))})}function ht(e,t,n,r){var o=e.size;if(void 0!==t&&(t|=0),void 0!==n&&(n|=0),y(t,n,o))return e;var i=g(t,o),a=b(n,o);if(i!==i||a!==a)return ht(e.toSeq().cacheResult(),t,n,r);var c,s=a-i;s===s&&(c=s<0?0:s);var l=Ot(e);return l.size=0===c?c:e.size&&c||void 0,!r&&A(e)&&c>=0&&(l.get=function(t,n){return t=v(this,t),t>=0&&t<c?e.get(t+i,n):n}),l.__iterateUncached=function(t,n){var o=this;if(0===c)return 0;if(n)return this.cacheResult().__iterate(t,n);var a=0,s=!0,l=0;return e.__iterate(function(e,n){if(!s||!(s=a++<i))return l++,!1!==t(e,r?n:l-1,o)&&l!==c}),l},l.__iteratorUncached=function(t,n){if(0!==c&&n)return this.cacheResult().__iterator(t,n);var o=0!==c&&e.__iterator(t,n),a=0,s=0;return new w(function(){for(;a++<i;)o.next();if(++s>c)return x();var e=o.next();return r||t===Cn?e:t===bn?S(t,s-1,void 0,e):S(t,s-1,e.value[1],e)})},l}function dt(e,t,n){var r=Ot(e);return r.__iterateUncached=function(r,o){var i=this;if(o)return this.cacheResult().__iterate(r,o);var a=0;return e.__iterate(function(e,o,c){return t.call(n,e,o,c)&&++a&&r(e,o,i)}),a},r.__iteratorUncached=function(r,o){var i=this;if(o)return this.cacheResult().__iterator(r,o);var a=e.__iterator(wn,o),c=!0;return new w(function(){if(!c)return x();var e=a.next();if(e.done)return e;var o=e.value,s=o[0],l=o[1];return t.call(n,l,s,i)?r===wn?e:S(r,s,l,e):(c=!1,x())})},r}function vt(e,t,n,r){var o=Ot(e);return o.__iterateUncached=function(o,i){var a=this;if(i)return this.cacheResult().__iterate(o,i);var c=!0,s=0;return e.__iterate(function(e,i,l){if(!c||!(c=t.call(n,e,i,l)))return s++,o(e,r?i:s-1,a)}),s},o.__iteratorUncached=function(o,i){var a=this;if(i)return this.cacheResult().__iterator(o,i);var c=e.__iterator(wn,i),s=!0,l=0;return new w(function(){var e,i,u;do{if(e=c.next(),e.done)return r||o===Cn?e:o===bn?S(o,l++,void 0,e):S(o,l++,e.value[1],e);var p=e.value;i=p[0],u=p[1],s&&(s=t.call(n,u,i,a))}while(s);return o===wn?e:S(o,i,u,e)})},o}function mt(e,t){var r=a(e),o=[e].concat(t).map(function(e){return i(e)?r&&(e=n(e)):e=r?R(e):j(Array.isArray(e)?e:[e]),e}).filter(function(e){return 0!==e.size});if(0===o.length)return e;if(1===o.length){var s=o[0];if(s===e||r&&a(s)||c(e)&&c(s))return s}var l=new P(o);return r?l=l.toKeyedSeq():c(e)||(l=l.toSetSeq()),l=l.flatten(!0),l.size=o.reduce(function(e,t){if(void 0!==e){var n=t.size;if(void 0!==n)return e+n}},0),l}function yt(e,t,n){var r=Ot(e);return r.__iterateUncached=function(r,o){function a(e,l){var u=this;e.__iterate(function(e,o){return(!t||l<t)&&i(e)?a(e,l+1):!1===r(e,n?o:c++,u)&&(s=!0),!s},o)}var c=0,s=!1;return a(e,0),c},r.__iteratorUncached=function(r,o){var a=e.__iterator(r,o),c=[],s=0;return new w(function(){for(;a;){var e=a.next();if(!1===e.done){var l=e.value;if(r===wn&&(l=l[1]),t&&!(c.length<t)||!i(l))return n?e:S(r,s++,l,e);c.push(a),a=l.__iterator(r,o)}else a=c.pop()}return x()})},r}function gt(e,t,n){var r=_t(e);return e.toSeq().map(function(o,i){return r(t.call(n,o,i,e))}).flatten(!0)}function bt(e,t){var n=Ot(e);return n.size=e.size&&2*e.size-1,n.__iterateUncached=function(n,r){var o=this,i=0;return e.__iterate(function(e,r){return(!i||!1!==n(t,i++,o))&&!1!==n(e,i++,o)},r),i},n.__iteratorUncached=function(n,r){var o,i=e.__iterator(Cn,r),a=0;return new w(function(){return(!o||a%2)&&(o=i.next(),o.done)?o:a%2?S(n,a++,t):S(n,a++,o.value,o)})},n}function Ct(e,t,n){t||(t=Tt);var r=a(e),o=0,i=e.toSeq().map(function(t,r){return[r,t,o++,n?n(t,r,e):t]}).toArray();return i.sort(function(e,n){return t(e[3],n[3])||e[2]-n[2]}).forEach(r?function(e,t){i[t].length=2}:function(e,t){i[t]=e[1]}),r?T(i):c(e)?N(i):V(i)}function wt(e,t,n){if(t||(t=Tt),n){var r=e.toSeq().map(function(t,r){return[t,n(t,r,e)]}).reduce(function(e,n){return St(t,e[1],n[1])?n:e});return r&&r[0]}return e.reduce(function(e,n){return St(t,e,n)?n:e})}function St(e,t,n){var r=e(n,t);return 0===r&&n!==t&&(void 0===n||null===n||n!==n)||r>0}function xt(e,n,r){var o=Ot(e);return o.size=new P(r).map(function(e){return e.size}).min(),o.__iterate=function(e,t){for(var n,r=this.__iterator(Cn,t),o=0;!(n=r.next()).done&&!1!==e(n.value,o++,this););return o},o.__iteratorUncached=function(e,o){var i=r.map(function(e){return e=t(e),k(o?e.reverse():e)}),a=0,c=!1;return new w(function(){var t;return c||(t=i.map(function(e){return e.next()}),c=t.some(function(e){return e.done})),c?x():S(e,a++,n.apply(null,t.map(function(e){return e.value})))})},o}function Mt(e,t){return A(e)?t:e.constructor(t)}function zt(e){if(e!==Object(e))throw new TypeError("Expected [K, V] tuple: "+e)}function kt(e){return ue(e.size),d(e)}function _t(e){return a(e)?n:c(e)?r:o}function Ot(e){return Object.create((a(e)?T:c(e)?N:V).prototype)}function Et(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):E.prototype.cacheResult.call(this)}function Tt(e,t){return e>t?1:e<t?-1:0}function Nt(e){var n=k(e);if(!n){if(!O(e))throw new TypeError("Expected iterable or array-like: "+e);n=k(t(e))}return n}function Vt(e,t){var n,r=function(i){if(i instanceof r)return i;if(!(this instanceof r))return new r(i);if(!n){n=!0;var a=Object.keys(e);Lt(o,a),o.size=a.length,o._name=t,o._keys=a,o._defaultValues=e}this._map=pe(i)},o=r.prototype=Object.create(Jn);return o.constructor=r,r}function Pt(e,t,n){var r=Object.create(Object.getPrototypeOf(e));return r._map=t,r.__ownerID=n,r}function Ht(e){return e._name||e.constructor.name||"Record"}function Lt(e,t){try{t.forEach(Dt.bind(void 0,e))}catch(e){}}function Dt(e,t){Object.defineProperty(e,t,{get:function(){return this.get(t)},set:function(e){Z(this.__ownerID,"Cannot set on an immutable record."),this.set(t,e)}})}function At(e){return null===e||void 0===e?Ft():It(e)&&!l(e)?e:Ft().withMutations(function(t){var n=o(e);ue(n.size),n.forEach(function(e){return t.add(e)})})}function It(e){return!(!e||!e[Zn])}function Rt(e,t){return e.__ownerID?(e.size=t.size,e._map=t,e):t===e._map?e:0===t.size?e.__empty():e.__make(t)}function jt(e,t){var n=Object.create(Qn);return n.size=e?e.size:0,n._map=e,n.__ownerID=t,n}function Ft(){return er||(er=jt(Se()))}function Kt(e){return null===e||void 0===e?Ut():Bt(e)?e:Ut().withMutations(function(t){var n=o(e);ue(n.size),n.forEach(function(e){return t.add(e)})})}function Bt(e){return It(e)&&l(e)}function Wt(e,t){var n=Object.create(tr);return n.size=e?e.size:0,n._map=e,n.__ownerID=t,n}function Ut(){return nr||(nr=Wt(tt()))}function qt(e){return null===e||void 0===e?Xt():Yt(e)?e:Xt().unshiftAll(e)}function Yt(e){return!(!e||!e[rr])}function Gt(e,t,n,r){var o=Object.create(or);return o.size=e,o._head=t,o.__ownerID=n,o.__hash=r,o.__altered=!1,o}function Xt(){return ir||(ir=Gt(0))}function $t(e,t){var n=function(n){e.prototype[n]=t[n]};return Object.keys(t).forEach(n),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(t).forEach(n),e}function Jt(e,t){return t}function Zt(e,t){return[t,e]}function Qt(e){return function(){return!e.apply(this,arguments)}}function en(e){return function(){return-e.apply(this,arguments)}}function tn(e){return"string"==typeof e?JSON.stringify(e):e}function nn(){return h(arguments)}function rn(e,t){return e<t?1:e>t?-1:0}function on(e){if(e.size===1/0)return 0;var t=l(e),n=a(e),r=t?1:0;return an(e.__iterate(n?t?function(e,t){r=31*r+cn(ie(e),ie(t))|0}:function(e,t){r=r+cn(ie(e),ie(t))|0}:t?function(e){r=31*r+ie(e)|0}:function(e){r=r+ie(e)|0}),r)}function an(e,t){return t=Tn(t,3432918353),t=Tn(t<<15|t>>>-15,461845907),t=Tn(t<<13|t>>>-13,5),t=(t+3864292196|0)^e,t=Tn(t^t>>>16,2246822507),t=Tn(t^t>>>13,3266489909),t=oe(t^t>>>16)}function cn(e,t){return e^t+2654435769+(e<<6)+(e>>2)|0}var sn=Array.prototype.slice;e(n,t),e(r,t),e(o,t),t.isIterable=i,t.isKeyed=a,t.isIndexed=c,t.isAssociative=s,t.isOrdered=l,t.Keyed=n,t.Indexed=r,t.Set=o;var ln="@@__IMMUTABLE_ITERABLE__@@",un="@@__IMMUTABLE_KEYED__@@",pn="@@__IMMUTABLE_INDEXED__@@",fn="@@__IMMUTABLE_ORDERED__@@",hn=5,dn=1<<hn,vn=dn-1,mn={},yn={value:!1},gn={value:!1},bn=0,Cn=1,wn=2,Sn="function"==typeof Symbol&&Symbol.iterator,xn="@@iterator",Mn=Sn||xn;w.prototype.toString=function(){return"[Iterator]"},w.KEYS=bn,w.VALUES=Cn,w.ENTRIES=wn,w.prototype.inspect=w.prototype.toSource=function(){return this.toString()},w.prototype[Mn]=function(){return this},e(E,t),E.of=function(){return E(arguments)},E.prototype.toSeq=function(){return this},E.prototype.toString=function(){return this.__toString("Seq {","}")},E.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},E.prototype.__iterate=function(e,t){return B(this,e,t,!0)},E.prototype.__iterator=function(e,t){return W(this,e,t,!0)},e(T,E),T.prototype.toKeyedSeq=function(){return this},e(N,E),N.of=function(){return N(arguments)},N.prototype.toIndexedSeq=function(){return this},N.prototype.toString=function(){return this.__toString("Seq [","]")},N.prototype.__iterate=function(e,t){return B(this,e,t,!1)},N.prototype.__iterator=function(e,t){return W(this,e,t,!1)},e(V,E),V.of=function(){return V(arguments)},V.prototype.toSetSeq=function(){return this},E.isSeq=A,E.Keyed=T,E.Set=V,E.Indexed=N;var zn="@@__IMMUTABLE_SEQ__@@";E.prototype[zn]=!0,e(P,N),P.prototype.get=function(e,t){return this.has(e)?this._array[v(this,e)]:t},P.prototype.__iterate=function(e,t){for(var n=this._array,r=n.length-1,o=0;o<=r;o++)if(!1===e(n[t?r-o:o],o,this))return o+1;return o},P.prototype.__iterator=function(e,t){var n=this._array,r=n.length-1,o=0;return new w(function(){return o>r?x():S(e,o,n[t?r-o++:o++])})},e(H,T),H.prototype.get=function(e,t){return void 0===t||this.has(e)?this._object[e]:t},H.prototype.has=function(e){return this._object.hasOwnProperty(e)},H.prototype.__iterate=function(e,t){for(var n=this._object,r=this._keys,o=r.length-1,i=0;i<=o;i++){var a=r[t?o-i:i];if(!1===e(n[a],a,this))return i+1}return i},H.prototype.__iterator=function(e,t){var n=this._object,r=this._keys,o=r.length-1,i=0;return new w(function(){var a=r[t?o-i:i];return i++>o?x():S(e,a,n[a])})},H.prototype[fn]=!0,e(L,N),L.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);var n=this._iterable,r=k(n),o=0;if(z(r))for(var i;!(i=r.next()).done&&!1!==e(i.value,o++,this););return o},L.prototype.__iteratorUncached=function(e,t){if(t)return this.cacheResult().__iterator(e,t);var n=this._iterable,r=k(n);if(!z(r))return new w(x);var o=0;return new w(function(){var t=r.next();return t.done?t:S(e,o++,t.value)})},e(D,N),D.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);for(var n=this._iterator,r=this._iteratorCache,o=0;o<r.length;)if(!1===e(r[o],o++,this))return o;for(var i;!(i=n.next()).done;){var a=i.value;if(r[o]=a,!1===e(a,o++,this))break}return o},D.prototype.__iteratorUncached=function(e,t){if(t)return this.cacheResult().__iterator(e,t);var n=this._iterator,r=this._iteratorCache,o=0;return new w(function(){if(o>=r.length){var t=n.next();if(t.done)return t;r[o]=t.value}return S(e,o,r[o++])})};var kn;e(J,N),J.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},J.prototype.get=function(e,t){return this.has(e)?this._value:t},J.prototype.includes=function(e){return X(this._value,e)},J.prototype.slice=function(e,t){var n=this.size;return y(e,t,n)?this:new J(this._value,b(t,n)-g(e,n))},J.prototype.reverse=function(){return this},J.prototype.indexOf=function(e){return X(this._value,e)?0:-1},J.prototype.lastIndexOf=function(e){return X(this._value,e)?this.size:-1},J.prototype.__iterate=function(e,t){for(var n=0;n<this.size;n++)if(!1===e(this._value,n,this))return n+1;return n},J.prototype.__iterator=function(e,t){var n=this,r=0;return new w(function(){return r<n.size?S(e,r++,n._value):x()})},J.prototype.equals=function(e){return e instanceof J?X(this._value,e._value):$(e)};var _n;e(Q,N),Q.prototype.toString=function(){return 0===this.size?"Range []":"Range [ "+this._start+"..."+this._end+(this._step>1?" by "+this._step:"")+" ]"},Q.prototype.get=function(e,t){return this.has(e)?this._start+v(this,e)*this._step:t},Q.prototype.includes=function(e){var t=(e-this._start)/this._step;return t>=0&&t<this.size&&t===Math.floor(t)},Q.prototype.slice=function(e,t){return y(e,t,this.size)?this:(e=g(e,this.size),t=b(t,this.size),t<=e?new Q(0,0):new Q(this.get(e,this._end),this.get(t,this._end),this._step))},Q.prototype.indexOf=function(e){var t=e-this._start;if(t%this._step==0){var n=t/this._step;if(n>=0&&n<this.size)return n}return-1},Q.prototype.lastIndexOf=function(e){return this.indexOf(e)},Q.prototype.__iterate=function(e,t){for(var n=this.size-1,r=this._step,o=t?this._start+n*r:this._start,i=0;i<=n;i++){if(!1===e(o,i,this))return i+1;o+=t?-r:r}return i},Q.prototype.__iterator=function(e,t){var n=this.size-1,r=this._step,o=t?this._start+n*r:this._start,i=0;return new w(function(){var a=o;return o+=t?-r:r,i>n?x():S(e,i++,a)})},Q.prototype.equals=function(e){return e instanceof Q?this._start===e._start&&this._end===e._end&&this._step===e._step:$(this,e)};var On;e(ee,t),e(te,ee),e(ne,ee),e(re,ee),ee.Keyed=te,ee.Indexed=ne,ee.Set=re;var En,Tn="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function(e,t){e|=0,t|=0;var n=65535&e,r=65535&t;return n*r+((e>>>16)*r+n*(t>>>16)<<16>>>0)|0},Nn=Object.isExtensible,Vn=function(){try{return Object.defineProperty({},"@",{}),!0}catch(e){return!1}}(),Pn="function"==typeof WeakMap;Pn&&(En=new WeakMap);var Hn=0,Ln="__immutablehash__";"function"==typeof Symbol&&(Ln=Symbol(Ln));var Dn=16,An=255,In=0,Rn={};e(pe,te),pe.prototype.toString=function(){return this.__toString("Map {","}")},pe.prototype.get=function(e,t){return this._root?this._root.get(0,void 0,e,t):t},pe.prototype.set=function(e,t){return xe(this,e,t)},pe.prototype.setIn=function(e,t){return this.updateIn(e,mn,function(){return t})},pe.prototype.remove=function(e){return xe(this,e,mn)},pe.prototype.deleteIn=function(e){return this.updateIn(e,function(){return mn})},pe.prototype.update=function(e,t,n){return 1===arguments.length?e(this):this.updateIn([e],t,n)},pe.prototype.updateIn=function(e,t,n){n||(n=t,t=void 0);var r=He(this,Nt(e),t,n);return r===mn?void 0:r},pe.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):Se()},pe.prototype.merge=function(){return Te(this,void 0,arguments)},pe.prototype.mergeWith=function(e){return Te(this,e,sn.call(arguments,1))},pe.prototype.mergeIn=function(e){var t=sn.call(arguments,1);return this.updateIn(e,Se(),function(e){return"function"==typeof e.merge?e.merge.apply(e,t):t[t.length-1]})},pe.prototype.mergeDeep=function(){return Te(this,Ne,arguments)},pe.prototype.mergeDeepWith=function(e){var t=sn.call(arguments,1);return Te(this,Ve(e),t)},pe.prototype.mergeDeepIn=function(e){var t=sn.call(arguments,1);return this.updateIn(e,Se(),function(e){return"function"==typeof e.mergeDeep?e.mergeDeep.apply(e,t):t[t.length-1]})},pe.prototype.sort=function(e){return Ze(Ct(this,e))},pe.prototype.sortBy=function(e,t){return Ze(Ct(this,t,e))},pe.prototype.withMutations=function(e){var t=this.asMutable();return e(t),t.wasAltered()?t.__ensureOwner(this.__ownerID):this},pe.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new f)},pe.prototype.asImmutable=function(){return this.__ensureOwner()},pe.prototype.wasAltered=function(){return this.__altered},pe.prototype.__iterator=function(e,t){return new ge(this,e,t)},pe.prototype.__iterate=function(e,t){var n=this,r=0;return this._root&&this._root.iterate(function(t){return r++,e(t[1],t[0],n)},t),r},pe.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?we(this.size,this._root,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},pe.isMap=fe;var jn="@@__IMMUTABLE_MAP__@@",Fn=pe.prototype;Fn[jn]=!0,Fn.delete=Fn.remove,Fn.removeIn=Fn.deleteIn,he.prototype.get=function(e,t,n,r){for(var o=this.entries,i=0,a=o.length;i<a;i++)if(X(n,o[i][0]))return o[i][1];return r},he.prototype.update=function(e,t,n,r,o,i,a){for(var c=o===mn,s=this.entries,l=0,u=s.length;l<u&&!X(r,s[l][0]);l++);var f=l<u;if(f?s[l][1]===o:c)return this;if(p(a),(c||!f)&&p(i),!c||1!==s.length){if(!f&&!c&&s.length>=Bn)return _e(e,s,r,o);var d=e&&e===this.ownerID,v=d?s:h(s);return f?c?l===u-1?v.pop():v[l]=v.pop():v[l]=[r,o]:v.push([r,o]),d?(this.entries=v,this):new he(e,v)}},de.prototype.get=function(e,t,n,r){void 0===t&&(t=ie(n));var o=1<<((0===e?t:t>>>e)&vn),i=this.bitmap;return 0==(i&o)?r:this.nodes[Le(i&o-1)].get(e+hn,t,n,r)},de.prototype.update=function(e,t,n,r,o,i,a){void 0===n&&(n=ie(r));var c=(0===t?n:n>>>t)&vn,s=1<<c,l=this.bitmap,u=0!=(l&s);if(!u&&o===mn)return this;var p=Le(l&s-1),f=this.nodes,h=u?f[p]:void 0,d=Me(h,e,t+hn,n,r,o,i,a);if(d===h)return this;if(!u&&d&&f.length>=Wn)return Ee(e,f,l,c,d);if(u&&!d&&2===f.length&&ze(f[1^p]))return f[1^p];if(u&&d&&1===f.length&&ze(d))return d;var v=e&&e===this.ownerID,m=u?d?l:l^s:l|s,y=u?d?De(f,p,d,v):Ie(f,p,v):Ae(f,p,d,v);return v?(this.bitmap=m,this.nodes=y,this):new de(e,m,y)},ve.prototype.get=function(e,t,n,r){void 0===t&&(t=ie(n));var o=(0===e?t:t>>>e)&vn,i=this.nodes[o];return i?i.get(e+hn,t,n,r):r},ve.prototype.update=function(e,t,n,r,o,i,a){void 0===n&&(n=ie(r));var c=(0===t?n:n>>>t)&vn,s=o===mn,l=this.nodes,u=l[c];if(s&&!u)return this;var p=Me(u,e,t+hn,n,r,o,i,a);if(p===u)return this;var f=this.count;if(u){if(!p&&--f<Un)return Oe(e,l,f,c)}else f++;var h=e&&e===this.ownerID,d=De(l,c,p,h);return h?(this.count=f,this.nodes=d,this):new ve(e,f,d)},me.prototype.get=function(e,t,n,r){for(var o=this.entries,i=0,a=o.length;i<a;i++)if(X(n,o[i][0]))return o[i][1];return r},me.prototype.update=function(e,t,n,r,o,i,a){void 0===n&&(n=ie(r));var c=o===mn;if(n!==this.keyHash)return c?this:(p(a),p(i),ke(this,e,t,n,[r,o]));for(var s=this.entries,l=0,u=s.length;l<u&&!X(r,s[l][0]);l++);var f=l<u;if(f?s[l][1]===o:c)return this;if(p(a),(c||!f)&&p(i),c&&2===u)return new ye(e,this.keyHash,s[1^l]);var d=e&&e===this.ownerID,v=d?s:h(s);return f?c?l===u-1?v.pop():v[l]=v.pop():v[l]=[r,o]:v.push([r,o]),d?(this.entries=v,this):new me(e,this.keyHash,v)},ye.prototype.get=function(e,t,n,r){return X(n,this.entry[0])?this.entry[1]:r},ye.prototype.update=function(e,t,n,r,o,i,a){var c=o===mn,s=X(r,this.entry[0]);return(s?o===this.entry[1]:c)?this:(p(a),c?void p(i):s?e&&e===this.ownerID?(this.entry[1]=o,this):new ye(e,this.keyHash,[r,o]):(p(i),ke(this,e,t,ie(r),[r,o])))},he.prototype.iterate=me.prototype.iterate=function(e,t){for(var n=this.entries,r=0,o=n.length-1;r<=o;r++)if(!1===e(n[t?o-r:r]))return!1},de.prototype.iterate=ve.prototype.iterate=function(e,t){for(var n=this.nodes,r=0,o=n.length-1;r<=o;r++){var i=n[t?o-r:r];if(i&&!1===i.iterate(e,t))return!1}},ye.prototype.iterate=function(e,t){return e(this.entry)},e(ge,w),ge.prototype.next=function(){for(var e=this._type,t=this._stack;t;){var n,r=t.node,o=t.index++;if(r.entry){if(0===o)return be(e,r.entry)}else if(r.entries){if(n=r.entries.length-1,o<=n)return be(e,r.entries[this._reverse?n-o:o])}else if(n=r.nodes.length-1,o<=n){var i=r.nodes[this._reverse?n-o:o];if(i){if(i.entry)return be(e,i.entry);t=this._stack=Ce(i,t)}continue}t=this._stack=this._stack.__prev}return x()};var Kn,Bn=dn/4,Wn=dn/2,Un=dn/4;e(Re,ne),Re.of=function(){return this(arguments)},Re.prototype.toString=function(){return this.__toString("List [","]")},Re.prototype.get=function(e,t){if((e=v(this,e))>=0&&e<this.size){e+=this._origin;var n=Ge(this,e);return n&&n.array[e&vn]}return t},Re.prototype.set=function(e,t){return Ue(this,e,t)},Re.prototype.remove=function(e){return this.has(e)?0===e?this.shift():e===this.size-1?this.pop():this.splice(e,1):this},Re.prototype.insert=function(e,t){return this.splice(e,0,t)},Re.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=this._origin=this._capacity=0,this._level=hn,this._root=this._tail=null,this.__hash=void 0,this.__altered=!0,this):We()},Re.prototype.push=function(){var e=arguments,t=this.size;return this.withMutations(function(n){Xe(n,0,t+e.length);for(var r=0;r<e.length;r++)n.set(t+r,e[r])})},Re.prototype.pop=function(){return Xe(this,0,-1)},Re.prototype.unshift=function(){var e=arguments;return this.withMutations(function(t){Xe(t,-e.length);for(var n=0;n<e.length;n++)t.set(n,e[n])})},Re.prototype.shift=function(){return Xe(this,1)},Re.prototype.merge=function(){return $e(this,void 0,arguments)},Re.prototype.mergeWith=function(e){return $e(this,e,sn.call(arguments,1))},Re.prototype.mergeDeep=function(){return $e(this,Ne,arguments)},Re.prototype.mergeDeepWith=function(e){var t=sn.call(arguments,1);return $e(this,Ve(e),t)},Re.prototype.setSize=function(e){return Xe(this,0,e)},Re.prototype.slice=function(e,t){var n=this.size;return y(e,t,n)?this:Xe(this,g(e,n),b(t,n))},Re.prototype.__iterator=function(e,t){var n=0,r=Ke(this,t);return new w(function(){var t=r();return t===Xn?x():S(e,n++,t)})},Re.prototype.__iterate=function(e,t){for(var n,r=0,o=Ke(this,t);(n=o())!==Xn&&!1!==e(n,r++,this););return r},Re.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?Be(this._origin,this._capacity,this._level,this._root,this._tail,e,this.__hash):(this.__ownerID=e,this)},Re.isList=je;var qn="@@__IMMUTABLE_LIST__@@",Yn=Re.prototype;Yn[qn]=!0,Yn.delete=Yn.remove,Yn.setIn=Fn.setIn,Yn.deleteIn=Yn.removeIn=Fn.removeIn,Yn.update=Fn.update,Yn.updateIn=Fn.updateIn,Yn.mergeIn=Fn.mergeIn,Yn.mergeDeepIn=Fn.mergeDeepIn,Yn.withMutations=Fn.withMutations,Yn.asMutable=Fn.asMutable,Yn.asImmutable=Fn.asImmutable,Yn.wasAltered=Fn.wasAltered,Fe.prototype.removeBefore=function(e,t,n){if(n===t?1<<t:0===this.array.length)return this;var r=n>>>t&vn;if(r>=this.array.length)return new Fe([],e);var o,i=0===r;if(t>0){var a=this.array[r];if((o=a&&a.removeBefore(e,t-hn,n))===a&&i)return this}if(i&&!o)return this;var c=Ye(this,e);if(!i)for(var s=0;s<r;s++)c.array[s]=void 0;return o&&(c.array[r]=o),c},Fe.prototype.removeAfter=function(e,t,n){if(n===(t?1<<t:0)||0===this.array.length)return this;var r=n-1>>>t&vn;if(r>=this.array.length)return this;var o;if(t>0){var i=this.array[r];if((o=i&&i.removeAfter(e,t-hn,n))===i&&r===this.array.length-1)return this}var a=Ye(this,e);return a.array.splice(r+1),o&&(a.array[r]=o),a};var Gn,Xn={};e(Ze,pe),Ze.of=function(){return this(arguments)},Ze.prototype.toString=function(){return this.__toString("OrderedMap {","}")},Ze.prototype.get=function(e,t){var n=this._map.get(e);return void 0!==n?this._list.get(n)[1]:t},Ze.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._map.clear(),this._list.clear(),this):tt()},Ze.prototype.set=function(e,t){return nt(this,e,t)},Ze.prototype.remove=function(e){return nt(this,e,mn)},Ze.prototype.wasAltered=function(){return this._map.wasAltered()||this._list.wasAltered()},Ze.prototype.__iterate=function(e,t){var n=this;return this._list.__iterate(function(t){return t&&e(t[1],t[0],n)},t)},Ze.prototype.__iterator=function(e,t){return this._list.fromEntrySeq().__iterator(e,t)},Ze.prototype.__ensureOwner=function(e){if(e===this.__ownerID)return this;var t=this._map.__ensureOwner(e),n=this._list.__ensureOwner(e);return e?et(t,n,e,this.__hash):(this.__ownerID=e,this._map=t,this._list=n,this)},Ze.isOrderedMap=Qe,Ze.prototype[fn]=!0,Ze.prototype.delete=Ze.prototype.remove;var $n;e(rt,T),rt.prototype.get=function(e,t){return this._iter.get(e,t)},rt.prototype.has=function(e){return this._iter.has(e)},rt.prototype.valueSeq=function(){return this._iter.valueSeq()},rt.prototype.reverse=function(){var e=this,t=lt(this,!0);return this._useKeys||(t.valueSeq=function(){return e._iter.toSeq().reverse()}),t},rt.prototype.map=function(e,t){var n=this,r=st(this,e,t);return this._useKeys||(r.valueSeq=function(){return n._iter.toSeq().map(e,t)}),r},rt.prototype.__iterate=function(e,t){var n,r=this;return this._iter.__iterate(this._useKeys?function(t,n){return e(t,n,r)}:(n=t?kt(this):0,function(o){return e(o,t?--n:n++,r)}),t)},rt.prototype.__iterator=function(e,t){if(this._useKeys)return this._iter.__iterator(e,t);var n=this._iter.__iterator(Cn,t),r=t?kt(this):0;return new w(function(){var o=n.next();return o.done?o:S(e,t?--r:r++,o.value,o)})},rt.prototype[fn]=!0,e(ot,N),ot.prototype.includes=function(e){return this._iter.includes(e)},ot.prototype.__iterate=function(e,t){var n=this,r=0;return this._iter.__iterate(function(t){return e(t,r++,n)},t)},ot.prototype.__iterator=function(e,t){var n=this._iter.__iterator(Cn,t),r=0;return new w(function(){var t=n.next();return t.done?t:S(e,r++,t.value,t)})},e(it,V),it.prototype.has=function(e){return this._iter.includes(e)},it.prototype.__iterate=function(e,t){var n=this;return this._iter.__iterate(function(t){return e(t,t,n)},t)},it.prototype.__iterator=function(e,t){var n=this._iter.__iterator(Cn,t);return new w(function(){var t=n.next();return t.done?t:S(e,t.value,t.value,t)})},e(at,T),at.prototype.entrySeq=function(){return this._iter.toSeq()},at.prototype.__iterate=function(e,t){var n=this;return this._iter.__iterate(function(t){if(t){zt(t);var r=i(t);return e(r?t.get(1):t[1],r?t.get(0):t[0],n)}},t)},at.prototype.__iterator=function(e,t){var n=this._iter.__iterator(Cn,t);return new w(function(){for(;;){var t=n.next();if(t.done)return t;var r=t.value;if(r){zt(r);var o=i(r);return S(e,o?r.get(0):r[0],o?r.get(1):r[1],t)}}})},ot.prototype.cacheResult=rt.prototype.cacheResult=it.prototype.cacheResult=at.prototype.cacheResult=Et,e(Vt,te),Vt.prototype.toString=function(){return this.__toString(Ht(this)+" {","}")},Vt.prototype.has=function(e){return this._defaultValues.hasOwnProperty(e)},Vt.prototype.get=function(e,t){if(!this.has(e))return t;var n=this._defaultValues[e];return this._map?this._map.get(e,n):n},Vt.prototype.clear=function(){if(this.__ownerID)return this._map&&this._map.clear(),this;var e=this.constructor;return e._empty||(e._empty=Pt(this,Se()))},Vt.prototype.set=function(e,t){if(!this.has(e))throw new Error('Cannot set unknown key "'+e+'" on '+Ht(this));var n=this._map&&this._map.set(e,t);return this.__ownerID||n===this._map?this:Pt(this,n)},Vt.prototype.remove=function(e){if(!this.has(e))return this;var t=this._map&&this._map.remove(e);return this.__ownerID||t===this._map?this:Pt(this,t)},Vt.prototype.wasAltered=function(){return this._map.wasAltered()},Vt.prototype.__iterator=function(e,t){var r=this;return n(this._defaultValues).map(function(e,t){return r.get(t)}).__iterator(e,t)},Vt.prototype.__iterate=function(e,t){var r=this;return n(this._defaultValues).map(function(e,t){return r.get(t)}).__iterate(e,t)},Vt.prototype.__ensureOwner=function(e){if(e===this.__ownerID)return this;var t=this._map&&this._map.__ensureOwner(e);return e?Pt(this,t,e):(this.__ownerID=e,this._map=t,this)};var Jn=Vt.prototype;Jn.delete=Jn.remove,Jn.deleteIn=Jn.removeIn=Fn.removeIn,Jn.merge=Fn.merge,Jn.mergeWith=Fn.mergeWith,Jn.mergeIn=Fn.mergeIn,Jn.mergeDeep=Fn.mergeDeep,Jn.mergeDeepWith=Fn.mergeDeepWith,Jn.mergeDeepIn=Fn.mergeDeepIn,Jn.setIn=Fn.setIn,Jn.update=Fn.update,Jn.updateIn=Fn.updateIn,Jn.withMutations=Fn.withMutations,Jn.asMutable=Fn.asMutable,Jn.asImmutable=Fn.asImmutable,e(At,re),At.of=function(){return this(arguments)},At.fromKeys=function(e){return this(n(e).keySeq())},At.prototype.toString=function(){return this.__toString("Set {","}")},At.prototype.has=function(e){return this._map.has(e)},At.prototype.add=function(e){return Rt(this,this._map.set(e,!0))},At.prototype.remove=function(e){return Rt(this,this._map.remove(e))},At.prototype.clear=function(){return Rt(this,this._map.clear())},At.prototype.union=function(){var e=sn.call(arguments,0);return e=e.filter(function(e){return 0!==e.size}),0===e.length?this:0!==this.size||this.__ownerID||1!==e.length?this.withMutations(function(t){for(var n=0;n<e.length;n++)o(e[n]).forEach(function(e){return t.add(e)})}):this.constructor(e[0])},At.prototype.intersect=function(){var e=sn.call(arguments,0);if(0===e.length)return this;e=e.map(function(e){return o(e)});var t=this;return this.withMutations(function(n){t.forEach(function(t){e.every(function(e){return e.includes(t)})||n.remove(t)})})},At.prototype.subtract=function(){var e=sn.call(arguments,0);if(0===e.length)return this;e=e.map(function(e){return o(e)});var t=this;return this.withMutations(function(n){t.forEach(function(t){e.some(function(e){return e.includes(t)})&&n.remove(t)})})},At.prototype.merge=function(){return this.union.apply(this,arguments)},At.prototype.mergeWith=function(e){var t=sn.call(arguments,1);return this.union.apply(this,t)},At.prototype.sort=function(e){return Kt(Ct(this,e))},At.prototype.sortBy=function(e,t){return Kt(Ct(this,t,e))},At.prototype.wasAltered=function(){return this._map.wasAltered()},At.prototype.__iterate=function(e,t){var n=this;return this._map.__iterate(function(t,r){return e(r,r,n)},t)},At.prototype.__iterator=function(e,t){return this._map.map(function(e,t){return t}).__iterator(e,t)},At.prototype.__ensureOwner=function(e){if(e===this.__ownerID)return this;var t=this._map.__ensureOwner(e);return e?this.__make(t,e):(this.__ownerID=e,this._map=t,this)},At.isSet=It;var Zn="@@__IMMUTABLE_SET__@@",Qn=At.prototype;Qn[Zn]=!0,Qn.delete=Qn.remove,Qn.mergeDeep=Qn.merge,Qn.mergeDeepWith=Qn.mergeWith,Qn.withMutations=Fn.withMutations,Qn.asMutable=Fn.asMutable,Qn.asImmutable=Fn.asImmutable,Qn.__empty=Ft,Qn.__make=jt;var er;e(Kt,At),Kt.of=function(){return this(arguments)},Kt.fromKeys=function(e){return this(n(e).keySeq())},Kt.prototype.toString=function(){return this.__toString("OrderedSet {","}")},Kt.isOrderedSet=Bt;var tr=Kt.prototype;tr[fn]=!0,tr.__empty=Ut,tr.__make=Wt;var nr;e(qt,ne),qt.of=function(){return this(arguments)},qt.prototype.toString=function(){return this.__toString("Stack [","]")},qt.prototype.get=function(e,t){var n=this._head;for(e=v(this,e);n&&e--;)n=n.next;return n?n.value:t},qt.prototype.peek=function(){return this._head&&this._head.value},qt.prototype.push=function(){if(0===arguments.length)return this;for(var e=this.size+arguments.length,t=this._head,n=arguments.length-1;n>=0;n--)t={value:arguments[n],next:t};return this.__ownerID?(this.size=e,this._head=t,this.__hash=void 0,this.__altered=!0,this):Gt(e,t)},qt.prototype.pushAll=function(e){if(e=r(e),0===e.size)return this;ue(e.size);var t=this.size,n=this._head;return e.reverse().forEach(function(e){t++,n={value:e,next:n}}),this.__ownerID?(this.size=t,this._head=n,this.__hash=void 0,this.__altered=!0,this):Gt(t,n)},qt.prototype.pop=function(){return this.slice(1)},qt.prototype.unshift=function(){return this.push.apply(this,arguments)},qt.prototype.unshiftAll=function(e){return this.pushAll(e)},qt.prototype.shift=function(){return this.pop.apply(this,arguments)},qt.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):Xt()},qt.prototype.slice=function(e,t){if(y(e,t,this.size))return this;var n=g(e,this.size);if(b(t,this.size)!==this.size)return ne.prototype.slice.call(this,e,t);for(var r=this.size-n,o=this._head;n--;)o=o.next;return this.__ownerID?(this.size=r,this._head=o,this.__hash=void 0,this.__altered=!0,this):Gt(r,o)},qt.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?Gt(this.size,this._head,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},qt.prototype.__iterate=function(e,t){if(t)return this.reverse().__iterate(e);for(var n=0,r=this._head;r&&!1!==e(r.value,n++,this);)r=r.next;return n},qt.prototype.__iterator=function(e,t){if(t)return this.reverse().__iterator(e);var n=0,r=this._head;return new w(function(){if(r){var t=r.value;return r=r.next,S(e,n++,t)}return x()})},qt.isStack=Yt;var rr="@@__IMMUTABLE_STACK__@@",or=qt.prototype;or[rr]=!0,or.withMutations=Fn.withMutations,or.asMutable=Fn.asMutable,or.asImmutable=Fn.asImmutable,or.wasAltered=Fn.wasAltered;var ir;t.Iterator=w,$t(t,{toArray:function(){ue(this.size);var e=new Array(this.size||0);return this.valueSeq().__iterate(function(t,n){e[n]=t}),e},toIndexedSeq:function(){return new ot(this)},toJS:function(){return this.toSeq().map(function(e){return e&&"function"==typeof e.toJS?e.toJS():e}).__toJS()},toJSON:function(){return this.toSeq().map(function(e){return e&&"function"==typeof e.toJSON?e.toJSON():e}).__toJS()},toKeyedSeq:function(){return new rt(this,!0)},toMap:function(){return pe(this.toKeyedSeq())},toObject:function(){ue(this.size);var e={};return this.__iterate(function(t,n){e[n]=t}),e},toOrderedMap:function(){return Ze(this.toKeyedSeq())},toOrderedSet:function(){return Kt(a(this)?this.valueSeq():this)},toSet:function(){return At(a(this)?this.valueSeq():this)},toSetSeq:function(){return new it(this)},toSeq:function(){return c(this)?this.toIndexedSeq():a(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return qt(a(this)?this.valueSeq():this)},toList:function(){return Re(a(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(e,t){return 0===this.size?e+t:e+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+t},concat:function(){return Mt(this,mt(this,sn.call(arguments,0)))},includes:function(e){return this.some(function(t){return X(t,e)})},entries:function(){return this.__iterator(wn)},every:function(e,t){ue(this.size);var n=!0;return this.__iterate(function(r,o,i){if(!e.call(t,r,o,i))return n=!1,!1}),n},filter:function(e,t){return Mt(this,ut(this,e,t,!0))},find:function(e,t,n){var r=this.findEntry(e,t);return r?r[1]:n},findEntry:function(e,t){var n;return this.__iterate(function(r,o,i){if(e.call(t,r,o,i))return n=[o,r],!1}),n},findLastEntry:function(e,t){return this.toSeq().reverse().findEntry(e,t)},forEach:function(e,t){return ue(this.size),this.__iterate(t?e.bind(t):e)},join:function(e){ue(this.size),e=void 0!==e?""+e:",";var t="",n=!0;return this.__iterate(function(r){n?n=!1:t+=e,t+=null!==r&&void 0!==r?r.toString():""}),t},keys:function(){return this.__iterator(bn)},map:function(e,t){return Mt(this,st(this,e,t))},reduce:function(e,t,n){ue(this.size);var r,o;return arguments.length<2?o=!0:r=t,this.__iterate(function(t,i,a){o?(o=!1,r=t):r=e.call(n,r,t,i,a)}),r},reduceRight:function(e,t,n){var r=this.toKeyedSeq().reverse();return r.reduce.apply(r,arguments)},reverse:function(){return Mt(this,lt(this,!0))},slice:function(e,t){return Mt(this,ht(this,e,t,!0))},some:function(e,t){return!this.every(Qt(e),t)},sort:function(e){return Mt(this,Ct(this,e))},values:function(){return this.__iterator(Cn)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some(function(){return!0})},count:function(e,t){return d(e?this.toSeq().filter(e,t):this)},countBy:function(e,t){return pt(this,e,t)},equals:function(e){return $(this,e)},entrySeq:function(){var e=this;if(e._cache)return new P(e._cache);var t=e.toSeq().map(Zt).toIndexedSeq();return t.fromEntrySeq=function(){return e.toSeq()},t},filterNot:function(e,t){return this.filter(Qt(e),t)},findLast:function(e,t,n){return this.toKeyedSeq().reverse().find(e,t,n)},first:function(){return this.find(m)},flatMap:function(e,t){return Mt(this,gt(this,e,t))},flatten:function(e){return Mt(this,yt(this,e,!0))},fromEntrySeq:function(){return new at(this)},get:function(e,t){return this.find(function(t,n){return X(n,e)},void 0,t)},getIn:function(e,t){for(var n,r=this,o=Nt(e);!(n=o.next()).done;){var i=n.value;if((r=r&&r.get?r.get(i,mn):mn)===mn)return t}return r},groupBy:function(e,t){return ft(this,e,t)},has:function(e){return this.get(e,mn)!==mn},hasIn:function(e){return this.getIn(e,mn)!==mn},isSubset:function(e){return e="function"==typeof e.includes?e:t(e),this.every(function(t){return e.includes(t)})},isSuperset:function(e){return e="function"==typeof e.isSubset?e:t(e),e.isSubset(this)},keySeq:function(){return this.toSeq().map(Jt).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},max:function(e){return wt(this,e)},maxBy:function(e,t){return wt(this,t,e)},min:function(e){return wt(this,e?en(e):rn)},minBy:function(e,t){return wt(this,t?en(t):rn,e)},rest:function(){return this.slice(1)},skip:function(e){return this.slice(Math.max(0,e))},skipLast:function(e){return Mt(this,this.toSeq().reverse().skip(e).reverse())},skipWhile:function(e,t){return Mt(this,vt(this,e,t,!0))},skipUntil:function(e,t){return this.skipWhile(Qt(e),t)},sortBy:function(e,t){return Mt(this,Ct(this,t,e))},take:function(e){return this.slice(0,Math.max(0,e))},takeLast:function(e){return Mt(this,this.toSeq().reverse().take(e).reverse())},takeWhile:function(e,t){return Mt(this,dt(this,e,t))},takeUntil:function(e,t){return this.takeWhile(Qt(e),t)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=on(this))}});var ar=t.prototype;ar[ln]=!0,ar[Mn]=ar.values,ar.__toJS=ar.toArray,ar.__toStringMapper=tn,ar.inspect=ar.toSource=function(){return this.toString()},ar.chain=ar.flatMap,ar.contains=ar.includes,function(){try{Object.defineProperty(ar,"length",{get:function(){if(!t.noLengthWarning){var e;try{throw new Error}catch(t){e=t.stack}if(-1===e.indexOf("_wrapObject"))return console&&console.warn&&console.warn("iterable.length has been deprecated, use iterable.size or iterable.count(). This warning will become a silent error in a future version. "+e),this.size}}})}catch(e){}}(),$t(n,{flip:function(){return Mt(this,ct(this))},findKey:function(e,t){var n=this.findEntry(e,t);return n&&n[0]},findLastKey:function(e,t){return this.toSeq().reverse().findKey(e,t)},keyOf:function(e){return this.findKey(function(t){return X(t,e)})},lastKeyOf:function(e){return this.findLastKey(function(t){return X(t,e)})},mapEntries:function(e,t){var n=this,r=0;return Mt(this,this.toSeq().map(function(o,i){return e.call(t,[i,o],r++,n)}).fromEntrySeq())},mapKeys:function(e,t){var n=this;return Mt(this,this.toSeq().flip().map(function(r,o){return e.call(t,r,o,n)}).flip())}});var cr=n.prototype;return cr[un]=!0,cr[Mn]=ar.entries,cr.__toJS=ar.toObject,cr.__toStringMapper=function(e,t){return JSON.stringify(t)+": "+tn(e)},$t(r,{toKeyedSeq:function(){return new rt(this,!1)},filter:function(e,t){return Mt(this,ut(this,e,t,!1))},findIndex:function(e,t){var n=this.findEntry(e,t);return n?n[0]:-1},indexOf:function(e){var t=this.toKeyedSeq().keyOf(e);return void 0===t?-1:t},lastIndexOf:function(e){var t=this.toKeyedSeq().reverse().keyOf(e);return void 0===t?-1:t},reverse:function(){return Mt(this,lt(this,!1))},slice:function(e,t){return Mt(this,ht(this,e,t,!1))},splice:function(e,t){var n=arguments.length;if(t=Math.max(0|t,0),0===n||2===n&&!t)return this;e=g(e,e<0?this.count():this.size);var r=this.slice(0,e);return Mt(this,1===n?r:r.concat(h(arguments,2),this.slice(e+t)))},findLastIndex:function(e,t){var n=this.toKeyedSeq().findLastKey(e,t);return void 0===n?-1:n},first:function(){return this.get(0)},flatten:function(e){return Mt(this,yt(this,e,!1))},get:function(e,t){return e=v(this,e),e<0||this.size===1/0||void 0!==this.size&&e>this.size?t:this.find(function(t,n){return n===e},void 0,t)},has:function(e){return(e=v(this,e))>=0&&(void 0!==this.size?this.size===1/0||e<this.size:-1!==this.indexOf(e))},interpose:function(e){return Mt(this,bt(this,e))},interleave:function(){var e=[this].concat(h(arguments)),t=xt(this.toSeq(),N.of,e),n=t.flatten(!0);return t.size&&(n.size=t.size*e.length),Mt(this,n)},last:function(){return this.get(-1)},skipWhile:function(e,t){return Mt(this,vt(this,e,t,!1))},zip:function(){return Mt(this,xt(this,nn,[this].concat(h(arguments))))},zipWith:function(e){var t=h(arguments);return t[0]=this,Mt(this,xt(this,e,t))}}),r.prototype[pn]=!0,r.prototype[fn]=!0,$t(o,{get:function(e,t){return this.has(e)?e:t},includes:function(e){return this.has(e)},keySeq:function(){return this.valueSeq()}}),o.prototype.has=ar.includes,$t(T,n.prototype),$t(N,r.prototype),$t(V,o.prototype),$t(te,n.prototype),$t(ne,r.prototype),$t(re,o.prototype),{Iterable:t,Seq:E,Collection:ee,Map:pe,OrderedMap:Ze,List:Re,Stack:qt,Set:At,OrderedSet:Kt,Record:Vt,Range:Q,Repeat:J,is:X,fromJS:U}})},function(e,t){},function(e,t,n){"use strict";function r(){var e=this.constructor.getDerivedStateFromProps(this.props,this.state);null!==e&&void 0!==e&&this.setState(e)}function o(e){function t(t){var n=this.constructor.getDerivedStateFromProps(e,t);return null!==n&&void 0!==n?n:null}this.setState(t.bind(this))}function i(e,t){try{var n=this.props,r=this.state;this.props=e,this.state=t,this.__reactInternalSnapshotFlag=!0,this.__reactInternalSnapshot=this.getSnapshotBeforeUpdate(n,r)}finally{this.props=n,this.state=r}}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)return e;var n=null,a=null,c=null;if("function"==typeof t.componentWillMount?n="componentWillMount":"function"==typeof t.UNSAFE_componentWillMount&&(n="UNSAFE_componentWillMount"),"function"==typeof t.componentWillReceiveProps?a="componentWillReceiveProps":"function"==typeof t.UNSAFE_componentWillReceiveProps&&(a="UNSAFE_componentWillReceiveProps"),"function"==typeof t.componentWillUpdate?c="componentWillUpdate":"function"==typeof t.UNSAFE_componentWillUpdate&&(c="UNSAFE_componentWillUpdate"),null!==n||null!==a||null!==c){var s=e.displayName||e.name,l="function"==typeof e.getDerivedStateFromProps?"getDerivedStateFromProps()":"getSnapshotBeforeUpdate()";throw Error("Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n"+s+" uses "+l+" but also contains the following legacy lifecycles:"+(null!==n?"\n "+n:"")+(null!==a?"\n "+a:"")+(null!==c?"\n "+c:"")+"\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=r,t.componentWillReceiveProps=o),"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=i;var u=t.componentDidUpdate;t.componentDidUpdate=function(e,t,n){var r=this.__reactInternalSnapshotFlag?this.__reactInternalSnapshot:n;u.call(this,e,t,r)}}return e}Object.defineProperty(t,"__esModule",{value:!0}),n.d(t,"polyfill",function(){return a}),r.__suppressDeprecationWarning=!0,o.__suppressDeprecationWarning=!0,i.__suppressDeprecationWarning=!0},function(e,t,n){"use strict";t.__esModule=!0,t.default=function(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t,n){return M.set(e,{selection:t,forceSelection:n,nativelyRenderedContent:null,inlineStyleOverride:null})}function i(e,t){return e.getBlockMap().map(function(n){return d.generate(e,n,t)}).toOrderedMap()}function a(e,t,n,r){var o=e.getCurrentContent().set("entityMap",n),i=o.getBlockMap();return e.getImmutable().get("treeMap").merge(t.toSeq().filter(function(e,t){return e!==i.get(t)}).map(function(e){return d.generate(o,e,r)}))}function c(e,t,n,r,o){return n.merge(t.toSeq().filter(function(t){return r.getDecorations(t,e)!==o.getDecorations(t,e)}).map(function(t){return d.generate(e,t,r)}))}function s(e,t){return t!==e.getLastChangeType()||"insert-characters"!==t&&"backspace-character"!==t&&"delete-character"!==t}function l(e,t){var n=t.getStartKey(),r=t.getStartOffset(),o=e.getBlockForKey(n);return r>0?o.getInlineStyleAt(r-1):o.getLength()?o.getInlineStyleAt(0):p(e,n)}function u(e,t){var n=t.getStartKey(),r=t.getStartOffset(),o=e.getBlockForKey(n);return r<o.getLength()?o.getInlineStyleAt(r):r>0?o.getInlineStyleAt(r-1):p(e,n)}function p(e,t){var n=e.getBlockMap().reverse().skipUntil(function(e,n){return n===t}).skip(1).skipUntil(function(e,t){return e.getLength()}).first();return n?n.getInlineStyleAt(n.getLength()-1):b()}var f=n(20),h=f||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},d=n(194),v=n(130),m=n(431),y=n(11),g=n(57),b=y.OrderedSet,C=y.Record,w=y.Stack,S={allowUndo:!0,currentContent:null,decorator:null,directionMap:null,forceSelection:!1,inCompositionMode:!1,inlineStyleOverride:null,lastChangeType:null,nativelyRenderedContent:null,redoStack:w(),selection:null,treeMap:null,undoStack:w()},x=C(S),M=function(){function e(t){r(this,e),this._immutable=t}return e.createEmpty=function(t){return e.createWithContent(v.createFromText(""),t)},e.createWithContent=function(t,n){var r=t.getBlockMap().first().getKey();return e.create({currentContent:t,undoStack:w(),redoStack:w(),decorator:n||null,selection:g.createEmpty(r)})},e.create=function(t){var n=t.currentContent,r=t.decorator,o=h({},t,{treeMap:i(n,r),directionMap:m.getDirectionMap(n)});return new e(new x(o))},e.set=function(t,n){return new e(t.getImmutable().withMutations(function(e){var r=e.get("decorator"),o=r;null===n.decorator?o=null:n.decorator&&(o=n.decorator);var s=n.currentContent||t.getCurrentContent();if(o!==r){var l,u=e.get("treeMap");return l=o&&r?c(s,s.getBlockMap(),u,o,r):i(s,o),void e.merge({decorator:o,treeMap:l,nativelyRenderedContent:null})}s!==t.getCurrentContent()&&e.set("treeMap",a(t,s.getBlockMap(),s.getEntityMap(),o)),e.merge(n)}))},e.prototype.toJS=function(){return this.getImmutable().toJS()},e.prototype.getAllowUndo=function(){return this.getImmutable().get("allowUndo")},e.prototype.getCurrentContent=function(){return this.getImmutable().get("currentContent")},e.prototype.getUndoStack=function(){return this.getImmutable().get("undoStack")},e.prototype.getRedoStack=function(){return this.getImmutable().get("redoStack")},e.prototype.getSelection=function(){return this.getImmutable().get("selection")},e.prototype.getDecorator=function(){return this.getImmutable().get("decorator")},e.prototype.isInCompositionMode=function(){return this.getImmutable().get("inCompositionMode")},e.prototype.mustForceSelection=function(){return this.getImmutable().get("forceSelection")},e.prototype.getNativelyRenderedContent=function(){return this.getImmutable().get("nativelyRenderedContent")},e.prototype.getLastChangeType=function(){return this.getImmutable().get("lastChangeType")},e.prototype.getInlineStyleOverride=function(){return this.getImmutable().get("inlineStyleOverride")},e.setInlineStyleOverride=function(t,n){return e.set(t,{inlineStyleOverride:n})},e.prototype.getCurrentInlineStyle=function(){var e=this.getInlineStyleOverride();if(null!=e)return e;var t=this.getCurrentContent(),n=this.getSelection();return n.isCollapsed()?l(t,n):u(t,n)},e.prototype.getBlockTree=function(e){return this.getImmutable().getIn(["treeMap",e])},e.prototype.isSelectionAtStartOfContent=function(){var e=this.getCurrentContent().getBlockMap().first().getKey();return this.getSelection().hasEdgeWithin(e,0,0)},e.prototype.isSelectionAtEndOfContent=function(){var e=this.getCurrentContent(),t=e.getBlockMap(),n=t.last(),r=n.getLength();return this.getSelection().hasEdgeWithin(n.getKey(),r,r)},e.prototype.getDirectionMap=function(){return this.getImmutable().get("directionMap")},e.acceptSelection=function(e,t){return o(e,t,!1)},e.forceSelection=function(e,t){return t.getHasFocus()||(t=t.set("hasFocus",!0)),o(e,t,!0)},e.moveSelectionToEnd=function(t){var n=t.getCurrentContent(),r=n.getLastBlock(),o=r.getKey(),i=r.getLength();return e.acceptSelection(t,new g({anchorKey:o,anchorOffset:i,focusKey:o,focusOffset:i,isBackward:!1}))},e.moveFocusToEnd=function(t){var n=e.moveSelectionToEnd(t);return e.forceSelection(n,n.getSelection())},e.push=function(t,n,r){if(t.getCurrentContent()===n)return t;var o="insert-characters"!==r,i=m.getDirectionMap(n,t.getDirectionMap());if(!t.getAllowUndo())return e.set(t,{currentContent:n,directionMap:i,lastChangeType:r,selection:n.getSelectionAfter(),forceSelection:o,inlineStyleOverride:null});var a=t.getSelection(),c=t.getCurrentContent(),l=t.getUndoStack(),u=n;a!==c.getSelectionAfter()||s(t,r)?(l=l.push(c),u=u.set("selectionBefore",a)):"insert-characters"!==r&&"backspace-character"!==r&&"delete-character"!==r||(u=u.set("selectionBefore",c.getSelectionBefore()));var p=t.getInlineStyleOverride();-1===["adjust-depth","change-block-type","split-block"].indexOf(r)&&(p=null);var f={currentContent:u,directionMap:i,undoStack:l,redoStack:w(),lastChangeType:r,selection:n.getSelectionAfter(),forceSelection:o,inlineStyleOverride:p};return e.set(t,f)},e.undo=function(t){if(!t.getAllowUndo())return t;var n=t.getUndoStack(),r=n.peek();if(!r)return t;var o=t.getCurrentContent(),i=m.getDirectionMap(r,t.getDirectionMap());return e.set(t,{currentContent:r,directionMap:i,undoStack:n.shift(),redoStack:t.getRedoStack().push(o),forceSelection:!0,inlineStyleOverride:null,lastChangeType:"undo",nativelyRenderedContent:null,selection:o.getSelectionBefore()})},e.redo=function(t){if(!t.getAllowUndo())return t;var n=t.getRedoStack(),r=n.peek();if(!r)return t;var o=t.getCurrentContent(),i=m.getDirectionMap(r,t.getDirectionMap());return e.set(t,{currentContent:r,directionMap:i,undoStack:t.getUndoStack().push(o),redoStack:n.shift(),forceSelection:!0,inlineStyleOverride:null,lastChangeType:"redo",nativelyRenderedContent:null,selection:r.getSelectionAfter()})},e.prototype.getImmutable=function(){return this._immutable},e}();e.exports=M},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var o=n(244),i=r(o),a=n(253),c=r(a),s="function"==typeof c.default&&"symbol"==typeof i.default?function(e){return typeof e}:function(e){return e&&"function"==typeof c.default&&e.constructor===c.default&&e!==c.default.prototype?"symbol":typeof e};t.default="function"==typeof c.default&&"symbol"===s(i.default)?function(e){return void 0===e?"undefined":s(e)}:function(e){return e&&"function"==typeof c.default&&e.constructor===c.default&&e!==c.default.prototype?"symbol":void 0===e?"undefined":s(e)}},function(e,t,n){"use strict";t.__esModule=!0;var r=n(157),o=function(e){return e&&e.__esModule?e:{default:e}}(r);t.default=function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return(0,o.default)(e)}},function(e,t){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t){var n=e.exports={version:"2.5.7"};"number"==typeof __e&&(__e=n)},function(e,t,n){"use strict";function r(e){if(null===e||void 0===e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ +var o=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(e){return!1}}()?Object.assign:function(e,t){for(var n,c,s=r(e),l=1;l<arguments.length;l++){n=Object(arguments[l]);for(var u in n)i.call(n,u)&&(s[u]=n[u]);if(o){c=o(n);for(var p=0;p<c.length;p++)a.call(n,c[p])&&(s[c[p]]=n[c[p]])}}return s}},function(e,t){e.exports=n},function(e,t,n){"use strict";var r=n(24),o=n(420),i=n(42),a=n(11),c=n(421),s=n(423),l=n(89),u=n(426),p=n(427),f=n(10),h=n(428),d=n(191),v=n(429),m=n(430),y=a.OrderedSet,g={replaceText:function(e,t,n,o,i){var a=d(e,t),c=v(a,t),s=r.create({style:o||y(),entity:i||null});return p(c,c.getSelectionAfter(),n,s)},insertText:function(e,t,n,r,o){return t.isCollapsed()||f(!1),g.replaceText(e,t,n,r,o)},moveText:function(e,t,n){var r=l(e,t),o=g.removeRange(e,t,"backward");return g.replaceWithFragment(o,n,r)},replaceWithFragment:function(e,t,n){var r=d(e,t),o=v(r,t);return u(o,o.getSelectionAfter(),n)},removeRange:function(e,t,n){var r=void 0,o=void 0,a=void 0,c=void 0;t.getIsBackward()&&(t=t.merge({anchorKey:t.getFocusKey(),anchorOffset:t.getFocusOffset(),focusKey:t.getAnchorKey(),focusOffset:t.getAnchorOffset(),isBackward:!1})),r=t.getAnchorKey(),o=t.getFocusKey(),a=e.getBlockForKey(r),c=e.getBlockForKey(o);var l=t.getStartOffset(),u=t.getEndOffset(),p=a.getEntityAt(l),f=c.getEntityAt(u-1);if(r===o&&p&&p===f){var h=s(e.getEntityMap(),a,c,t,n);return v(e,h)}var m=t;i.draft_segmented_entities_behavior&&(m=s(e.getEntityMap(),a,c,t,n));var y=d(e,m);return v(y,m)},splitBlock:function(e,t){var n=d(e,t),r=v(n,t);return m(r,r.getSelectionAfter())},applyInlineStyle:function(e,t,n){return o.add(e,t,n)},removeInlineStyle:function(e,t,n){return o.remove(e,t,n)},setBlockType:function(e,t,n){return h(e,t,function(e){return e.merge({type:n,depth:0})})},setBlockData:function(e,t,n){return h(e,t,function(e){return e.merge({data:n})})},mergeBlockData:function(e,t,n){return h(e,t,function(e){return e.merge({data:e.getData().merge(n)})})},applyEntity:function(e,t,n){var r=d(e,t);return c(r,t,n)}};e.exports=g},function(e,t){e.exports=function(e,t,n,r){var o=n?n.call(r,e,t):void 0;if(void 0!==o)return!!o;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var i=Object.keys(e),a=Object.keys(t);if(i.length!==a.length)return!1;for(var c=Object.prototype.hasOwnProperty.bind(t),s=0;s<i.length;s++){var l=i[s];if(!c(l))return!1;var u=e[l],p=t[l];if(!1===(o=n?n.call(r,u,p,l):void 0)||void 0===o&&u!==p)return!1}return!0}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(11),c=a.Map,s=a.OrderedSet,l=a.Record,u=s(),p={style:u,entity:null},f=l(p),h=function(e){function t(){return r(this,t),o(this,e.apply(this,arguments))}return i(t,e),t.prototype.getStyle=function(){return this.get("style")},t.prototype.getEntity=function(){return this.get("entity")},t.prototype.hasStyle=function(e){return this.getStyle().includes(e)},t.applyStyle=function(e,n){var r=e.set("style",e.getStyle().add(n));return t.create(r)},t.removeStyle=function(e,n){var r=e.set("style",e.getStyle().remove(n));return t.create(r)},t.applyEntity=function(e,n){var r=e.getEntity()===n?e:e.set("entity",n);return t.create(r)},t.create=function(e){if(!e)return d;var n={style:u,entity:null},r=c(n).merge(e),o=v.get(r);if(o)return o;var i=new t(r);return v=v.set(r,i),i},t}(f),d=new h,v=c([[c(p),d]]);h.EMPTY=d,e.exports=h},function(e,t,n){"use strict";var r=n(0),o=n(299);if(void 0===r)throw Error("create-react-class could not find the React object. If you are using script tags, make sure that React is being loaded before create-react-class.");var i=(new r.Component).updater;e.exports=o(r.Component,r.isValidElement,i)},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(24),c=n(11),s=n(66),l=c.List,u=c.Map,p=c.OrderedSet,f=c.Record,h=c.Repeat,d=p(),v={parent:null,characterList:l(),data:u(),depth:0,key:"",text:"",type:"unstyled",children:l(),prevSibling:null,nextSibling:null},m=function(e,t){return e.getStyle()===t.getStyle()},y=function(e,t){return e.getEntity()===t.getEntity()},g=function(e){if(!e)return e;var t=e.characterList,n=e.text;return n&&!t&&(e.characterList=l(h(a.EMPTY,n.length))),e},b=function(e){function t(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:v;return r(this,t),o(this,e.call(this,g(n)))}return i(t,e),t.prototype.getKey=function(){return this.get("key")},t.prototype.getType=function(){return this.get("type")},t.prototype.getText=function(){return this.get("text")},t.prototype.getCharacterList=function(){return this.get("characterList")},t.prototype.getLength=function(){return this.getText().length},t.prototype.getDepth=function(){return this.get("depth")},t.prototype.getData=function(){return this.get("data")},t.prototype.getInlineStyleAt=function(e){var t=this.getCharacterList().get(e);return t?t.getStyle():d},t.prototype.getEntityAt=function(e){var t=this.getCharacterList().get(e);return t?t.getEntity():null},t.prototype.getChildKeys=function(){return this.get("children")},t.prototype.getParentKey=function(){return this.get("parent")},t.prototype.getPrevSiblingKey=function(){return this.get("prevSibling")},t.prototype.getNextSiblingKey=function(){return this.get("nextSibling")},t.prototype.findStyleRanges=function(e,t){s(this.getCharacterList(),m,e,t)},t.prototype.findEntityRanges=function(e,t){s(this.getCharacterList(),y,e,t)},t}(f(v));e.exports=b},function(e,t,n){var r=n(101)("wks"),o=n(72),i=n(38).Symbol,a="function"==typeof i;(e.exports=function(e){return r[e]||(r[e]=a&&i[e]||(a?i:o)("Symbol."+e))}).store=r},function(e,t){function n(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}e.exports=n},function(e,t,n){var r=n(168),o="object"==typeof self&&self&&self.Object===Object&&self,i=r||o||Function("return this")();e.exports=i},function(e,t,n){"use strict";var r=function(e){if(null!=e)return e;throw new Error("Got unexpected null or undefined")};e.exports=r},function(e,t,n){(function(t){for(var r=n(281),o="undefined"==typeof window?t:window,i=["moz","webkit"],a="AnimationFrame",c=o["request"+a],s=o["cancel"+a]||o["cancelRequest"+a],l=0;!c&&l<i.length;l++)c=o[i[l]+"Request"+a],s=o[i[l]+"Cancel"+a]||o[i[l]+"CancelRequest"+a];if(!c||!s){var u=0,p=0,f=[];c=function(e){if(0===f.length){var t=r(),n=Math.max(0,1e3/60-(t-u));u=n+t,setTimeout(function(){var e=f.slice(0);f.length=0;for(var t=0;t<e.length;t++)if(!e[t].cancelled)try{e[t].callback(u)}catch(e){setTimeout(function(){throw e},0)}},Math.round(n))}return f.push({handle:++p,callback:e,cancelled:!1}),p},s=function(e){for(var t=0;t<f.length;t++)f[t].handle===e&&(f[t].cancelled=!0)}}e.exports=function(e){return c.call(o,e)},e.exports.cancel=function(){s.apply(o,arguments)},e.exports.polyfill=function(e){e||(e=o),e.requestAnimationFrame=c,e.cancelAnimationFrame=s}}).call(t,n(18))},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.create=t.connect=t.Provider=void 0;var o=n(282),i=r(o),a=n(283),c=r(a),s=n(284),l=r(s);t.Provider=i.default,t.connect=c.default,t.create=l.default},function(e,t){var n=Array.isArray;e.exports=n},function(e,t,n){"use strict";function r(e,t,n,r){if(e===n)return!0;if(!n.startsWith(e))return!1;var o=n.slice(e.length);return!!t&&(o=r?r(o):o,a.contains(o,t))}function o(e){return"Windows"===i.platformName?e.replace(/^\s*NT/,""):e}var i=n(441),a=n(444),c=n(445),s=n(446),l={isBrowser:function(e){return r(i.browserName,i.browserFullVersion,e)},isBrowserArchitecture:function(e){return r(i.browserArchitecture,null,e)},isDevice:function(e){return r(i.deviceName,null,e)},isEngine:function(e){return r(i.engineName,i.engineVersion,e)},isPlatform:function(e){return r(i.platformName,i.platformFullVersion,e,o)},isPlatformArchitecture:function(e){return r(i.platformArchitecture,null,e)}};e.exports=c(l,s)},function(e,t,n){"use strict";var r=function(){};e.exports=r},function(e,t,n){"use strict";function r(){for(var e=void 0;void 0===e||o.hasOwnProperty(e)||!isNaN(+e);)e=Math.floor(Math.random()*i).toString(32);return o[e]=!0,e}var o={},i=Math.pow(2,24);e.exports=r},function(e,t,n){var r=n(38),o=n(19),i=n(95),a=n(52),c=n(46),s=function(e,t,n){var l,u,p,f=e&s.F,h=e&s.G,d=e&s.S,v=e&s.P,m=e&s.B,y=e&s.W,g=h?o:o[t]||(o[t]={}),b=g.prototype,C=h?r:d?r[t]:(r[t]||{}).prototype;h&&(n=t);for(l in n)(u=!f&&C&&void 0!==C[l])&&c(g,l)||(p=u?C[l]:n[l],g[l]=h&&"function"!=typeof C[l]?n[l]:m&&u?i(p,r):y&&C[l]==p?function(e){var t=function(t,n,r){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,n)}return new e(t,n,r)}return e.apply(this,arguments)};return t.prototype=e.prototype,t}(p):v&&"function"==typeof p?i(Function.call,p):p,v&&((g.virtual||(g.virtual={}))[l]=p,e&s.R&&b&&!b[l]&&a(b,l,p)))};s.F=1,s.G=2,s.S=4,s.P=8,s.B=16,s.W=32,s.U=64,s.R=128,e.exports=s},function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(e,t,n){var r=n(44),o=n(148),i=n(96),a=Object.defineProperty;t.f=n(45)?Object.defineProperty:function(e,t,n){if(r(e),t=i(t,!0),r(n),o)try{return a(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},function(e,t){function n(e){return null!=e&&"object"==typeof e}e.exports=n},function(e,t,n){"use strict";var r=n(418),o=n(65),i=n(24),a=n(434),c=n(50),s=n(130),l=n(133),u=n(197),p=n(435),f=n(199),h=n(90),d=n(22),v=n(195),m=n(15),y=n(141),g=n(213),b=n(57),C=n(496),w=n(211),S=n(499),x=n(36),M=n(214),z=n(504),k={Editor:p,EditorBlock:f,EditorState:m,CompositeDecorator:a,Entity:h,EntityInstance:v,BlockMapBuilder:o,CharacterMetadata:i,ContentBlock:c,ContentState:s,SelectionState:b,AtomicBlockUtils:r,KeyBindingUtil:y,Modifier:d,RichUtils:g,DefaultDraftBlockRenderMap:l,DefaultDraftInlineStyle:u,convertFromHTML:w,convertFromRaw:S,convertToRaw:C,genKey:x,getDefaultKeyBinding:M,getVisibleSelectionRect:z};e.exports=k},function(e,t,n){"use strict";var r=n(419);e.exports=r},function(e,t,n){"use strict";var r=n(165),o=n(111),i=n(92),a=n(166);t.a={locale:"en",Pagination:r.a,DatePicker:o.a,TimePicker:i.a,Calendar:a.a,Table:{filterTitle:"Filter menu",filterConfirm:"OK",filterReset:"Reset",emptyText:"No data",selectAll:"Select current page",selectInvert:"Invert current page"},Modal:{okText:"OK",cancelText:"Cancel",justOkText:"OK"},Popconfirm:{okText:"OK",cancelText:"Cancel"},Transfer:{titles:["",""],notFoundContent:"Not Found",searchPlaceholder:"Search here",itemUnit:"item",itemsUnit:"items"},Select:{notFoundContent:"Not Found"},Upload:{uploading:"Uploading...",removeFile:"Remove file",uploadError:"Upload error",previewFile:"Preview file"}}},function(e,t,n){var r=n(53);e.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},function(e,t,n){e.exports=!n(54)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t,n){var r=n(151),o=n(98);e.exports=function(e){return r(o(e))}},function(e,t,n){function r(e){return null==e?void 0===e?s:c:l&&l in Object(e)?i(e):a(e)}var o=n(61),i=n(311),a=n(312),c="[object Null]",s="[object Undefined]",l=o?o.toStringTag:void 0;e.exports=r},function(e,t,n){function r(e,t){var n=i(e,t);return o(n)?n:void 0}var o=n(339),i=n(342);e.exports=r},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function a(e,t){return e.getStyle()===t.getStyle()}function c(e,t){return e.getEntity()===t.getEntity()}var s=n(24),l=n(11),u=n(66),p=l.List,f=l.Map,h=l.OrderedSet,d=l.Record,v=l.Repeat,m=h(),y={key:"",type:"unstyled",text:"",characterList:p(),depth:0,data:f()},g=d(y),b=function(e){if(!e)return e;var t=e.characterList,n=e.text;return n&&!t&&(e.characterList=p(v(s.EMPTY,n.length))),e},C=function(e){function t(n){return r(this,t),o(this,e.call(this,b(n)))}return i(t,e),t.prototype.getKey=function(){return this.get("key")},t.prototype.getType=function(){return this.get("type")},t.prototype.getText=function(){return this.get("text")},t.prototype.getCharacterList=function(){return this.get("characterList")},t.prototype.getLength=function(){return this.getText().length},t.prototype.getDepth=function(){return this.get("depth")},t.prototype.getData=function(){return this.get("data")},t.prototype.getInlineStyleAt=function(e){var t=this.getCharacterList().get(e);return t?t.getStyle():m},t.prototype.getEntityAt=function(e){var t=this.getCharacterList().get(e);return t?t.getEntity():null},t.prototype.findStyleRanges=function(e,t){u(this.getCharacterList(),a,e,t)},t.prototype.findEntityRanges=function(e,t){u(this.getCharacterList(),c,e,t)},t}(g);e.exports=C},function(e,t,n){"use strict";function r(e){return f<=e&&e<=v}function o(e,t){if(0<=t&&t<e.length||p(!1),t+1===e.length)return!1;var n=e.charCodeAt(t),r=e.charCodeAt(t+1);return f<=n&&n<=h&&d<=r&&r<=v}function i(e){return m.test(e)}function a(e,t){return 1+r(e.charCodeAt(t))}function c(e){if(!i(e))return e.length;for(var t=0,n=0;n<e.length;n+=a(e,n))t++;return t}function s(e,t,n){if(t=t||0,n=void 0===n?1/0:n||0,!i(e))return e.substr(t,n);var r=e.length;if(r<=0||t>r||n<=0)return"";var o=0;if(t>0){for(;t>0&&o<r;t--)o+=a(e,o);if(o>=r)return""}else if(t<0){for(o=r;t<0&&0<o;t++)o-=a(e,o-1);o<0&&(o=0)}var c=r;if(n<r)for(c=o;n>0&&c<r;n--)c+=a(e,c);return e.substring(o,c)}function l(e,t,n){t=t||0,n=void 0===n?1/0:n||0,t<0&&(t=0),n<0&&(n=0);var r=Math.abs(n-t);return t=t<n?t:n,s(e,t,r)}function u(e){for(var t=[],n=0;n<e.length;n+=a(e,n))t.push(e.codePointAt(n));return t}var p=n(10),f=55296,h=56319,d=56320,v=57343,m=/[\uD800-\uDFFF]/,y={getCodePoints:u,getUTF16Length:a,hasSurrogateUnit:i,isCodeUnitInSurrogateRange:r,isSurrogatePair:o,strlen:c,substring:l,substr:s};e.exports=y},function(e,t,n){var r=n(39),o=n(60);e.exports=n(45)?function(e,t,n){return r.f(e,t,o(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){e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t){e.exports={}},function(e,t,n){"use strict";var r=function(){};e.exports=r},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(11),c=a.Record,s={anchorKey:"",anchorOffset:0,focusKey:"",focusOffset:0,isBackward:!1,hasFocus:!1},l=c(s),u=function(e){function t(){return r(this,t),o(this,e.apply(this,arguments))}return i(t,e),t.prototype.serialize=function(){return"Anchor: "+this.getAnchorKey()+":"+this.getAnchorOffset()+", Focus: "+this.getFocusKey()+":"+this.getFocusOffset()+", Is Backward: "+String(this.getIsBackward())+", Has Focus: "+String(this.getHasFocus())},t.prototype.getAnchorKey=function(){return this.get("anchorKey")},t.prototype.getAnchorOffset=function(){return this.get("anchorOffset")},t.prototype.getFocusKey=function(){return this.get("focusKey")},t.prototype.getFocusOffset=function(){return this.get("focusOffset")},t.prototype.getIsBackward=function(){return this.get("isBackward")},t.prototype.getHasFocus=function(){return this.get("hasFocus")},t.prototype.hasEdgeWithin=function(e,t,n){var r=this.getAnchorKey(),o=this.getFocusKey();if(r===o&&r===e){var i=this.getStartOffset();return t<=this.getEndOffset()&&i<=n}if(e!==r&&e!==o)return!1;var a=e===r?this.getAnchorOffset():this.getFocusOffset();return t<=a&&n>=a},t.prototype.isCollapsed=function(){return this.getAnchorKey()===this.getFocusKey()&&this.getAnchorOffset()===this.getFocusOffset()},t.prototype.getStartKey=function(){return this.getIsBackward()?this.getFocusKey():this.getAnchorKey()},t.prototype.getStartOffset=function(){return this.getIsBackward()?this.getFocusOffset():this.getAnchorOffset()},t.prototype.getEndKey=function(){return this.getIsBackward()?this.getAnchorKey():this.getFocusKey()},t.prototype.getEndOffset=function(){return this.getIsBackward()?this.getAnchorOffset():this.getFocusOffset()},t.createEmpty=function(e){return new t({anchorKey:e,anchorOffset:0,focusKey:e,focusOffset:0,isBackward:!1,hasFocus:!1})},t}(l);e.exports=u},function(e,t,n){"use strict";function r(e){return"object"==typeof e?Object.keys(e).filter(function(t){return e[t]}).map(o).join(" "):Array.prototype.map.call(arguments,o).join(" ")}function o(e){return e.replace(/\//g,"-")}e.exports=r},function(e,t,n){!function(t,n){e.exports=n()}(0,function(){"use strict";function e(e,t){t&&(e.prototype=Object.create(t.prototype)),e.prototype.constructor=e}function t(e){return i(e)?e:E(e)}function n(e){return a(e)?e:T(e)}function r(e){return c(e)?e:N(e)}function o(e){return i(e)&&!s(e)?e:V(e)}function i(e){return!(!e||!e[ln])}function a(e){return!(!e||!e[un])}function c(e){return!(!e||!e[pn])}function s(e){return a(e)||c(e)}function l(e){return!(!e||!e[fn])}function u(e){return e.value=!1,e}function p(e){e&&(e.value=!0)}function f(){}function h(e,t){t=t||0;for(var n=Math.max(0,e.length-t),r=new Array(n),o=0;o<n;o++)r[o]=e[o+t];return r}function d(e){return void 0===e.size&&(e.size=e.__iterate(m)),e.size}function v(e,t){if("number"!=typeof t){var n=t>>>0;if(""+n!==t||4294967295===n)return NaN;t=n}return t<0?d(e)+t:t}function m(){return!0}function y(e,t,n){return(0===e||void 0!==n&&e<=-n)&&(void 0===t||void 0!==n&&t>=n)}function g(e,t){return C(e,t,0)}function b(e,t){return C(e,t,t)}function C(e,t,n){return void 0===e?n:e<0?Math.max(0,t+e):void 0===t?e:Math.min(t,e)}function w(e){this.next=e}function S(e,t,n,r){var o=0===e?t:1===e?n:[t,n];return r?r.value=o:r={value:o,done:!1},r}function x(){return{value:void 0,done:!0}}function M(e){return!!_(e)}function z(e){return e&&"function"==typeof e.next}function k(e){var t=_(e);return t&&t.call(e)}function _(e){var t=e&&(Sn&&e[Sn]||e[xn]);if("function"==typeof t)return t}function O(e){return e&&"number"==typeof e.length}function E(e){return null===e||void 0===e?I():i(e)?e.toSeq():F(e)}function T(e){return null===e||void 0===e?I().toKeyedSeq():i(e)?a(e)?e.toSeq():e.fromEntrySeq():R(e)}function N(e){return null===e||void 0===e?I():i(e)?a(e)?e.entrySeq():e.toIndexedSeq():j(e)}function V(e){return(null===e||void 0===e?I():i(e)?a(e)?e.entrySeq():e:j(e)).toSetSeq()}function P(e){this._array=e,this.size=e.length}function H(e){var t=Object.keys(e);this._object=e,this._keys=t,this.size=t.length}function L(e){this._iterable=e,this.size=e.length||e.size}function D(e){this._iterator=e,this._iteratorCache=[]}function A(e){return!(!e||!e[zn])}function I(){return kn||(kn=new P([]))}function R(e){var t=Array.isArray(e)?new P(e).fromEntrySeq():z(e)?new D(e).fromEntrySeq():M(e)?new L(e).fromEntrySeq():"object"==typeof e?new H(e):void 0;if(!t)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+e);return t}function j(e){var t=K(e);if(!t)throw new TypeError("Expected Array or iterable object of values: "+e);return t}function F(e){var t=K(e)||"object"==typeof e&&new H(e);if(!t)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+e);return t}function K(e){return O(e)?new P(e):z(e)?new D(e):M(e)?new L(e):void 0}function B(e,t,n,r){var o=e._cache;if(o){for(var i=o.length-1,a=0;a<=i;a++){var c=o[n?i-a:a];if(!1===t(c[1],r?c[0]:a,e))return a+1}return a}return e.__iterateUncached(t,n)}function W(e,t,n,r){var o=e._cache;if(o){var i=o.length-1,a=0;return new w(function(){var e=o[n?i-a:a];return a++>i?x():S(t,r?e[0]:a-1,e[1])})}return e.__iteratorUncached(t,n)}function U(e,t){return t?q(t,e,"",{"":e}):Y(e)}function q(e,t,n,r){return Array.isArray(t)?e.call(r,n,N(t).map(function(n,r){return q(e,n,r,t)})):G(t)?e.call(r,n,T(t).map(function(n,r){return q(e,n,r,t)})):t}function Y(e){return Array.isArray(e)?N(e).map(Y).toList():G(e)?T(e).map(Y).toMap():e}function G(e){return e&&(e.constructor===Object||void 0===e.constructor)}function X(e,t){if(e===t||e!==e&&t!==t)return!0;if(!e||!t)return!1;if("function"==typeof e.valueOf&&"function"==typeof t.valueOf){if(e=e.valueOf(),t=t.valueOf(),e===t||e!==e&&t!==t)return!0;if(!e||!t)return!1}return!("function"!=typeof e.equals||"function"!=typeof t.equals||!e.equals(t))}function $(e,t){if(e===t)return!0;if(!i(t)||void 0!==e.size&&void 0!==t.size&&e.size!==t.size||void 0!==e.__hash&&void 0!==t.__hash&&e.__hash!==t.__hash||a(e)!==a(t)||c(e)!==c(t)||l(e)!==l(t))return!1;if(0===e.size&&0===t.size)return!0;var n=!s(e);if(l(e)){var r=e.entries();return t.every(function(e,t){var o=r.next().value;return o&&X(o[1],e)&&(n||X(o[0],t))})&&r.next().done}var o=!1;if(void 0===e.size)if(void 0===t.size)"function"==typeof e.cacheResult&&e.cacheResult();else{o=!0;var u=e;e=t,t=u}var p=!0,f=t.__iterate(function(t,r){if(n?!e.has(t):o?!X(t,e.get(r,mn)):!X(e.get(r,mn),t))return p=!1,!1});return p&&e.size===f}function J(e,t){if(!(this instanceof J))return new J(e,t);if(this._value=e,this.size=void 0===t?1/0:Math.max(0,t),0===this.size){if(_n)return _n;_n=this}}function Z(e,t){if(!e)throw new Error(t)}function Q(e,t,n){if(!(this instanceof Q))return new Q(e,t,n);if(Z(0!==n,"Cannot step a Range by 0"),e=e||0,void 0===t&&(t=1/0),n=void 0===n?1:Math.abs(n),t<e&&(n=-n),this._start=e,this._end=t,this._step=n,this.size=Math.max(0,Math.ceil((t-e)/n-1)+1),0===this.size){if(On)return On;On=this}}function ee(){throw TypeError("Abstract")}function te(){}function ne(){}function re(){}function oe(e){return e>>>1&1073741824|3221225471&e}function ie(e){if(!1===e||null===e||void 0===e)return 0;if("function"==typeof e.valueOf&&(!1===(e=e.valueOf())||null===e||void 0===e))return 0;if(!0===e)return 1;var t=typeof e;if("number"===t){if(e!==e||e===1/0)return 0;var n=0|e;for(n!==e&&(n^=4294967295*e);e>4294967295;)e/=4294967295,n^=e;return oe(n)}if("string"===t)return e.length>Dn?ae(e):ce(e);if("function"==typeof e.hashCode)return e.hashCode();if("object"===t)return se(e);if("function"==typeof e.toString)return ce(e.toString());throw new Error("Value type "+t+" cannot be hashed.")}function ae(e){var t=Rn[e];return void 0===t&&(t=ce(e),In===An&&(In=0,Rn={}),In++,Rn[e]=t),t}function ce(e){for(var t=0,n=0;n<e.length;n++)t=31*t+e.charCodeAt(n)|0;return oe(t)}function se(e){var t;if(Pn&&void 0!==(t=En.get(e)))return t;if(void 0!==(t=e[Ln]))return t;if(!Vn){if(void 0!==(t=e.propertyIsEnumerable&&e.propertyIsEnumerable[Ln]))return t;if(void 0!==(t=le(e)))return t}if(t=++Hn,1073741824&Hn&&(Hn=0),Pn)En.set(e,t);else{if(void 0!==Nn&&!1===Nn(e))throw new Error("Non-extensible objects are not allowed as keys.");if(Vn)Object.defineProperty(e,Ln,{enumerable:!1,configurable:!1,writable:!1,value:t});else if(void 0!==e.propertyIsEnumerable&&e.propertyIsEnumerable===e.constructor.prototype.propertyIsEnumerable)e.propertyIsEnumerable=function(){return this.constructor.prototype.propertyIsEnumerable.apply(this,arguments)},e.propertyIsEnumerable[Ln]=t;else{if(void 0===e.nodeType)throw new Error("Unable to set a non-enumerable property on object.");e[Ln]=t}}return t}function le(e){if(e&&e.nodeType>0)switch(e.nodeType){case 1:return e.uniqueID;case 9:return e.documentElement&&e.documentElement.uniqueID}}function ue(e){Z(e!==1/0,"Cannot perform this action with an infinite size.")}function pe(e){return null===e||void 0===e?Se():fe(e)&&!l(e)?e:Se().withMutations(function(t){var r=n(e);ue(r.size),r.forEach(function(e,n){return t.set(n,e)})})}function fe(e){return!(!e||!e[jn])}function he(e,t){this.ownerID=e,this.entries=t}function de(e,t,n){this.ownerID=e,this.bitmap=t,this.nodes=n}function ve(e,t,n){this.ownerID=e,this.count=t,this.nodes=n}function me(e,t,n){this.ownerID=e,this.keyHash=t,this.entries=n}function ye(e,t,n){this.ownerID=e,this.keyHash=t,this.entry=n}function ge(e,t,n){this._type=t,this._reverse=n,this._stack=e._root&&Ce(e._root)}function be(e,t){return S(e,t[0],t[1])}function Ce(e,t){return{node:e,index:0,__prev:t}}function we(e,t,n,r){var o=Object.create(Fn);return o.size=e,o._root=t,o.__ownerID=n,o.__hash=r,o.__altered=!1,o}function Se(){return Kn||(Kn=we(0))}function xe(e,t,n){var r,o;if(e._root){var i=u(yn),a=u(gn);if(r=Me(e._root,e.__ownerID,0,void 0,t,n,i,a),!a.value)return e;o=e.size+(i.value?n===mn?-1:1:0)}else{if(n===mn)return e;o=1,r=new he(e.__ownerID,[[t,n]])}return e.__ownerID?(e.size=o,e._root=r,e.__hash=void 0,e.__altered=!0,e):r?we(o,r):Se()}function Me(e,t,n,r,o,i,a,c){return e?e.update(t,n,r,o,i,a,c):i===mn?e:(p(c),p(a),new ye(t,r,[o,i]))}function ze(e){return e.constructor===ye||e.constructor===me}function ke(e,t,n,r,o){if(e.keyHash===r)return new me(t,r,[e.entry,o]);var i,a=(0===n?e.keyHash:e.keyHash>>>n)&vn,c=(0===n?r:r>>>n)&vn;return new de(t,1<<a|1<<c,a===c?[ke(e,t,n+hn,r,o)]:(i=new ye(t,r,o),a<c?[e,i]:[i,e]))}function _e(e,t,n,r){e||(e=new f);for(var o=new ye(e,ie(n),[n,r]),i=0;i<t.length;i++){var a=t[i];o=o.update(e,0,void 0,a[0],a[1])}return o}function Oe(e,t,n,r){for(var o=0,i=0,a=new Array(n),c=0,s=1,l=t.length;c<l;c++,s<<=1){var u=t[c];void 0!==u&&c!==r&&(o|=s,a[i++]=u)}return new de(e,o,a)}function Ee(e,t,n,r,o){for(var i=0,a=new Array(dn),c=0;0!==n;c++,n>>>=1)a[c]=1&n?t[i++]:void 0;return a[r]=o,new ve(e,i+1,a)}function Te(e,t,r){for(var o=[],a=0;a<r.length;a++){var c=r[a],s=n(c);i(c)||(s=s.map(function(e){return U(e)})),o.push(s)}return Pe(e,t,o)}function Ne(e,t,n){return e&&e.mergeDeep&&i(t)?e.mergeDeep(t):X(e,t)?e:t}function Ve(e){return function(t,n,r){if(t&&t.mergeDeepWith&&i(n))return t.mergeDeepWith(e,n);var o=e(t,n,r);return X(t,o)?t:o}}function Pe(e,t,n){return n=n.filter(function(e){return 0!==e.size}),0===n.length?e:0!==e.size||e.__ownerID||1!==n.length?e.withMutations(function(e){for(var r=t?function(n,r){e.update(r,mn,function(e){return e===mn?n:t(e,n,r)})}:function(t,n){e.set(n,t)},o=0;o<n.length;o++)n[o].forEach(r)}):e.constructor(n[0])}function He(e,t,n,r){var o=e===mn,i=t.next();if(i.done){var a=o?n:e,c=r(a);return c===a?e:c}Z(o||e&&e.set,"invalid keyPath");var s=i.value,l=o?mn:e.get(s,mn),u=He(l,t,n,r);return u===l?e:u===mn?e.remove(s):(o?Se():e).set(s,u)}function Le(e){return e-=e>>1&1431655765,e=(858993459&e)+(e>>2&858993459),e=e+(e>>4)&252645135,e+=e>>8,127&(e+=e>>16)}function De(e,t,n,r){var o=r?e:h(e);return o[t]=n,o}function Ae(e,t,n,r){var o=e.length+1;if(r&&t+1===o)return e[t]=n,e;for(var i=new Array(o),a=0,c=0;c<o;c++)c===t?(i[c]=n,a=-1):i[c]=e[c+a];return i}function Ie(e,t,n){var r=e.length-1;if(n&&t===r)return e.pop(),e;for(var o=new Array(r),i=0,a=0;a<r;a++)a===t&&(i=1),o[a]=e[a+i];return o}function Re(e){var t=We();if(null===e||void 0===e)return t;if(je(e))return e;var n=r(e),o=n.size;return 0===o?t:(ue(o),o>0&&o<dn?Be(0,o,hn,null,new Fe(n.toArray())):t.withMutations(function(e){e.setSize(o),n.forEach(function(t,n){return e.set(n,t)})}))}function je(e){return!(!e||!e[qn])}function Fe(e,t){this.array=e,this.ownerID=t}function Ke(e,t){function n(e,t,n){return 0===t?r(e,n):o(e,t,n)}function r(e,n){var r=n===c?s&&s.array:e&&e.array,o=n>i?0:i-n,l=a-n;return l>dn&&(l=dn),function(){if(o===l)return Xn;var e=t?--l:o++;return r&&r[e]}}function o(e,r,o){var c,s=e&&e.array,l=o>i?0:i-o>>r,u=1+(a-o>>r);return u>dn&&(u=dn),function(){for(;;){if(c){var e=c();if(e!==Xn)return e;c=null}if(l===u)return Xn;var i=t?--u:l++;c=n(s&&s[i],r-hn,o+(i<<r))}}}var i=e._origin,a=e._capacity,c=Je(a),s=e._tail;return n(e._root,e._level,0)}function Be(e,t,n,r,o,i,a){var c=Object.create(Yn);return c.size=t-e,c._origin=e,c._capacity=t,c._level=n,c._root=r,c._tail=o,c.__ownerID=i,c.__hash=a,c.__altered=!1,c}function We(){return Gn||(Gn=Be(0,0,hn))}function Ue(e,t,n){if((t=v(e,t))!==t)return e;if(t>=e.size||t<0)return e.withMutations(function(e){t<0?Xe(e,t).set(0,n):Xe(e,0,t+1).set(t,n)});t+=e._origin;var r=e._tail,o=e._root,i=u(gn);return t>=Je(e._capacity)?r=qe(r,e.__ownerID,0,t,n,i):o=qe(o,e.__ownerID,e._level,t,n,i),i.value?e.__ownerID?(e._root=o,e._tail=r,e.__hash=void 0,e.__altered=!0,e):Be(e._origin,e._capacity,e._level,o,r):e}function qe(e,t,n,r,o,i){var a=r>>>n&vn,c=e&&a<e.array.length;if(!c&&void 0===o)return e;var s;if(n>0){var l=e&&e.array[a],u=qe(l,t,n-hn,r,o,i);return u===l?e:(s=Ye(e,t),s.array[a]=u,s)}return c&&e.array[a]===o?e:(p(i),s=Ye(e,t),void 0===o&&a===s.array.length-1?s.array.pop():s.array[a]=o,s)}function Ye(e,t){return t&&e&&t===e.ownerID?e:new Fe(e?e.array.slice():[],t)}function Ge(e,t){if(t>=Je(e._capacity))return e._tail;if(t<1<<e._level+hn){for(var n=e._root,r=e._level;n&&r>0;)n=n.array[t>>>r&vn],r-=hn;return n}}function Xe(e,t,n){void 0!==t&&(t|=0),void 0!==n&&(n|=0);var r=e.__ownerID||new f,o=e._origin,i=e._capacity,a=o+t,c=void 0===n?i:n<0?i+n:o+n;if(a===o&&c===i)return e;if(a>=c)return e.clear();for(var s=e._level,l=e._root,u=0;a+u<0;)l=new Fe(l&&l.array.length?[void 0,l]:[],r),s+=hn,u+=1<<s;u&&(a+=u,o+=u,c+=u,i+=u);for(var p=Je(i),h=Je(c);h>=1<<s+hn;)l=new Fe(l&&l.array.length?[l]:[],r),s+=hn;var d=e._tail,v=h<p?Ge(e,c-1):h>p?new Fe([],r):d;if(d&&h>p&&a<i&&d.array.length){l=Ye(l,r);for(var m=l,y=s;y>hn;y-=hn){var g=p>>>y&vn;m=m.array[g]=Ye(m.array[g],r)}m.array[p>>>hn&vn]=d}if(c<i&&(v=v&&v.removeAfter(r,0,c)),a>=h)a-=h,c-=h,s=hn,l=null,v=v&&v.removeBefore(r,0,a);else if(a>o||h<p){for(u=0;l;){var b=a>>>s&vn;if(b!==h>>>s&vn)break;b&&(u+=(1<<s)*b),s-=hn,l=l.array[b]}l&&a>o&&(l=l.removeBefore(r,s,a-u)),l&&h<p&&(l=l.removeAfter(r,s,h-u)),u&&(a-=u,c-=u)}return e.__ownerID?(e.size=c-a,e._origin=a,e._capacity=c,e._level=s,e._root=l,e._tail=v,e.__hash=void 0,e.__altered=!0,e):Be(a,c,s,l,v)}function $e(e,t,n){for(var o=[],a=0,c=0;c<n.length;c++){var s=n[c],l=r(s);l.size>a&&(a=l.size),i(s)||(l=l.map(function(e){return U(e)})),o.push(l)}return a>e.size&&(e=e.setSize(a)),Pe(e,t,o)}function Je(e){return e<dn?0:e-1>>>hn<<hn}function Ze(e){return null===e||void 0===e?tt():Qe(e)?e:tt().withMutations(function(t){var r=n(e);ue(r.size),r.forEach(function(e,n){return t.set(n,e)})})}function Qe(e){return fe(e)&&l(e)}function et(e,t,n,r){var o=Object.create(Ze.prototype);return o.size=e?e.size:0,o._map=e,o._list=t,o.__ownerID=n,o.__hash=r,o}function tt(){return $n||($n=et(Se(),We()))}function nt(e,t,n){var r,o,i=e._map,a=e._list,c=i.get(t),s=void 0!==c;if(n===mn){if(!s)return e;a.size>=dn&&a.size>=2*i.size?(o=a.filter(function(e,t){return void 0!==e&&c!==t}),r=o.toKeyedSeq().map(function(e){return e[0]}).flip().toMap(),e.__ownerID&&(r.__ownerID=o.__ownerID=e.__ownerID)):(r=i.remove(t),o=c===a.size-1?a.pop():a.set(c,void 0))}else if(s){if(n===a.get(c)[1])return e;r=i,o=a.set(c,[t,n])}else r=i.set(t,a.size),o=a.set(a.size,[t,n]);return e.__ownerID?(e.size=r.size,e._map=r,e._list=o,e.__hash=void 0,e):et(r,o)}function rt(e,t){this._iter=e,this._useKeys=t,this.size=e.size}function ot(e){this._iter=e,this.size=e.size}function it(e){this._iter=e,this.size=e.size}function at(e){this._iter=e,this.size=e.size}function ct(e){var t=Ot(e);return t._iter=e,t.size=e.size,t.flip=function(){return e},t.reverse=function(){var t=e.reverse.apply(this);return t.flip=function(){return e.reverse()},t},t.has=function(t){return e.includes(t)},t.includes=function(t){return e.has(t)},t.cacheResult=Et,t.__iterateUncached=function(t,n){var r=this;return e.__iterate(function(e,n){return!1!==t(n,e,r)},n)},t.__iteratorUncached=function(t,n){if(t===wn){var r=e.__iterator(t,n);return new w(function(){var e=r.next();if(!e.done){var t=e.value[0];e.value[0]=e.value[1],e.value[1]=t}return e})}return e.__iterator(t===Cn?bn:Cn,n)},t}function st(e,t,n){var r=Ot(e);return r.size=e.size,r.has=function(t){return e.has(t)},r.get=function(r,o){var i=e.get(r,mn);return i===mn?o:t.call(n,i,r,e)},r.__iterateUncached=function(r,o){var i=this;return e.__iterate(function(e,o,a){return!1!==r(t.call(n,e,o,a),o,i)},o)},r.__iteratorUncached=function(r,o){var i=e.__iterator(wn,o);return new w(function(){var o=i.next();if(o.done)return o;var a=o.value,c=a[0];return S(r,c,t.call(n,a[1],c,e),o)})},r}function lt(e,t){var n=Ot(e);return n._iter=e,n.size=e.size,n.reverse=function(){return e},e.flip&&(n.flip=function(){var t=ct(e);return t.reverse=function(){return e.flip()},t}),n.get=function(n,r){return e.get(t?n:-1-n,r)},n.has=function(n){return e.has(t?n:-1-n)},n.includes=function(t){return e.includes(t)},n.cacheResult=Et,n.__iterate=function(t,n){var r=this;return e.__iterate(function(e,n){return t(e,n,r)},!n)},n.__iterator=function(t,n){return e.__iterator(t,!n)},n}function ut(e,t,n,r){var o=Ot(e);return r&&(o.has=function(r){var o=e.get(r,mn);return o!==mn&&!!t.call(n,o,r,e)},o.get=function(r,o){var i=e.get(r,mn);return i!==mn&&t.call(n,i,r,e)?i:o}),o.__iterateUncached=function(o,i){var a=this,c=0;return e.__iterate(function(e,i,s){if(t.call(n,e,i,s))return c++,o(e,r?i:c-1,a)},i),c},o.__iteratorUncached=function(o,i){var a=e.__iterator(wn,i),c=0;return new w(function(){for(;;){var i=a.next();if(i.done)return i;var s=i.value,l=s[0],u=s[1];if(t.call(n,u,l,e))return S(o,r?l:c++,u,i)}})},o}function pt(e,t,n){var r=pe().asMutable();return e.__iterate(function(o,i){r.update(t.call(n,o,i,e),0,function(e){return e+1})}),r.asImmutable()}function ft(e,t,n){var r=a(e),o=(l(e)?Ze():pe()).asMutable();e.__iterate(function(i,a){o.update(t.call(n,i,a,e),function(e){return e=e||[],e.push(r?[a,i]:i),e})});var i=_t(e);return o.map(function(t){return Mt(e,i(t))})}function ht(e,t,n,r){var o=e.size;if(void 0!==t&&(t|=0),void 0!==n&&(n===1/0?n=o:n|=0),y(t,n,o))return e;var i=g(t,o),a=b(n,o);if(i!==i||a!==a)return ht(e.toSeq().cacheResult(),t,n,r);var c,s=a-i;s===s&&(c=s<0?0:s);var l=Ot(e);return l.size=0===c?c:e.size&&c||void 0,!r&&A(e)&&c>=0&&(l.get=function(t,n){return t=v(this,t),t>=0&&t<c?e.get(t+i,n):n}),l.__iterateUncached=function(t,n){var o=this;if(0===c)return 0;if(n)return this.cacheResult().__iterate(t,n);var a=0,s=!0,l=0;return e.__iterate(function(e,n){if(!s||!(s=a++<i))return l++,!1!==t(e,r?n:l-1,o)&&l!==c}),l},l.__iteratorUncached=function(t,n){if(0!==c&&n)return this.cacheResult().__iterator(t,n);var o=0!==c&&e.__iterator(t,n),a=0,s=0;return new w(function(){for(;a++<i;)o.next();if(++s>c)return x();var e=o.next();return r||t===Cn?e:t===bn?S(t,s-1,void 0,e):S(t,s-1,e.value[1],e)})},l}function dt(e,t,n){var r=Ot(e);return r.__iterateUncached=function(r,o){var i=this;if(o)return this.cacheResult().__iterate(r,o);var a=0;return e.__iterate(function(e,o,c){return t.call(n,e,o,c)&&++a&&r(e,o,i)}),a},r.__iteratorUncached=function(r,o){var i=this;if(o)return this.cacheResult().__iterator(r,o);var a=e.__iterator(wn,o),c=!0;return new w(function(){if(!c)return x();var e=a.next();if(e.done)return e;var o=e.value,s=o[0],l=o[1];return t.call(n,l,s,i)?r===wn?e:S(r,s,l,e):(c=!1,x())})},r}function vt(e,t,n,r){var o=Ot(e);return o.__iterateUncached=function(o,i){var a=this;if(i)return this.cacheResult().__iterate(o,i);var c=!0,s=0;return e.__iterate(function(e,i,l){if(!c||!(c=t.call(n,e,i,l)))return s++,o(e,r?i:s-1,a)}),s},o.__iteratorUncached=function(o,i){var a=this;if(i)return this.cacheResult().__iterator(o,i);var c=e.__iterator(wn,i),s=!0,l=0;return new w(function(){var e,i,u;do{if(e=c.next(),e.done)return r||o===Cn?e:o===bn?S(o,l++,void 0,e):S(o,l++,e.value[1],e);var p=e.value;i=p[0],u=p[1],s&&(s=t.call(n,u,i,a))}while(s);return o===wn?e:S(o,i,u,e)})},o}function mt(e,t){var r=a(e),o=[e].concat(t).map(function(e){return i(e)?r&&(e=n(e)):e=r?R(e):j(Array.isArray(e)?e:[e]),e}).filter(function(e){return 0!==e.size});if(0===o.length)return e;if(1===o.length){var s=o[0];if(s===e||r&&a(s)||c(e)&&c(s))return s}var l=new P(o);return r?l=l.toKeyedSeq():c(e)||(l=l.toSetSeq()),l=l.flatten(!0),l.size=o.reduce(function(e,t){if(void 0!==e){var n=t.size;if(void 0!==n)return e+n}},0),l}function yt(e,t,n){var r=Ot(e);return r.__iterateUncached=function(r,o){function a(e,l){var u=this;e.__iterate(function(e,o){return(!t||l<t)&&i(e)?a(e,l+1):!1===r(e,n?o:c++,u)&&(s=!0),!s},o)}var c=0,s=!1;return a(e,0),c},r.__iteratorUncached=function(r,o){var a=e.__iterator(r,o),c=[],s=0;return new w(function(){for(;a;){var e=a.next();if(!1===e.done){var l=e.value;if(r===wn&&(l=l[1]),t&&!(c.length<t)||!i(l))return n?e:S(r,s++,l,e);c.push(a),a=l.__iterator(r,o)}else a=c.pop()}return x()})},r}function gt(e,t,n){var r=_t(e);return e.toSeq().map(function(o,i){return r(t.call(n,o,i,e))}).flatten(!0)}function bt(e,t){var n=Ot(e);return n.size=e.size&&2*e.size-1,n.__iterateUncached=function(n,r){var o=this,i=0;return e.__iterate(function(e,r){return(!i||!1!==n(t,i++,o))&&!1!==n(e,i++,o)},r),i},n.__iteratorUncached=function(n,r){var o,i=e.__iterator(Cn,r),a=0;return new w(function(){return(!o||a%2)&&(o=i.next(),o.done)?o:a%2?S(n,a++,t):S(n,a++,o.value,o)})},n}function Ct(e,t,n){t||(t=Tt);var r=a(e),o=0,i=e.toSeq().map(function(t,r){return[r,t,o++,n?n(t,r,e):t]}).toArray();return i.sort(function(e,n){return t(e[3],n[3])||e[2]-n[2]}).forEach(r?function(e,t){i[t].length=2}:function(e,t){i[t]=e[1]}),r?T(i):c(e)?N(i):V(i)}function wt(e,t,n){if(t||(t=Tt),n){var r=e.toSeq().map(function(t,r){return[t,n(t,r,e)]}).reduce(function(e,n){return St(t,e[1],n[1])?n:e});return r&&r[0]}return e.reduce(function(e,n){return St(t,e,n)?n:e})}function St(e,t,n){var r=e(n,t);return 0===r&&n!==t&&(void 0===n||null===n||n!==n)||r>0}function xt(e,n,r){var o=Ot(e);return o.size=new P(r).map(function(e){return e.size}).min(),o.__iterate=function(e,t){for(var n,r=this.__iterator(Cn,t),o=0;!(n=r.next()).done&&!1!==e(n.value,o++,this););return o},o.__iteratorUncached=function(e,o){var i=r.map(function(e){return e=t(e),k(o?e.reverse():e)}),a=0,c=!1;return new w(function(){var t;return c||(t=i.map(function(e){return e.next()}),c=t.some(function(e){return e.done})),c?x():S(e,a++,n.apply(null,t.map(function(e){return e.value})))})},o}function Mt(e,t){return A(e)?t:e.constructor(t)}function zt(e){if(e!==Object(e))throw new TypeError("Expected [K, V] tuple: "+e)}function kt(e){return ue(e.size),d(e)}function _t(e){return a(e)?n:c(e)?r:o}function Ot(e){return Object.create((a(e)?T:c(e)?N:V).prototype)}function Et(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):E.prototype.cacheResult.call(this)}function Tt(e,t){return e>t?1:e<t?-1:0}function Nt(e){var n=k(e);if(!n){if(!O(e))throw new TypeError("Expected iterable or array-like: "+e);n=k(t(e))}return n}function Vt(e,t){var n,r=function(i){if(i instanceof r)return i;if(!(this instanceof r))return new r(i);if(!n){n=!0;var a=Object.keys(e);Lt(o,a),o.size=a.length,o._name=t,o._keys=a,o._defaultValues=e}this._map=pe(i)},o=r.prototype=Object.create(Jn);return o.constructor=r,r}function Pt(e,t,n){var r=Object.create(Object.getPrototypeOf(e));return r._map=t,r.__ownerID=n,r}function Ht(e){return e._name||e.constructor.name||"Record"}function Lt(e,t){try{t.forEach(Dt.bind(void 0,e))}catch(e){}}function Dt(e,t){Object.defineProperty(e,t,{get:function(){return this.get(t)},set:function(e){Z(this.__ownerID,"Cannot set on an immutable record."),this.set(t,e)}})}function At(e){return null===e||void 0===e?Ft():It(e)&&!l(e)?e:Ft().withMutations(function(t){var n=o(e);ue(n.size),n.forEach(function(e){return t.add(e)})})}function It(e){return!(!e||!e[Zn])}function Rt(e,t){return e.__ownerID?(e.size=t.size,e._map=t,e):t===e._map?e:0===t.size?e.__empty():e.__make(t)}function jt(e,t){var n=Object.create(Qn);return n.size=e?e.size:0,n._map=e,n.__ownerID=t,n}function Ft(){return er||(er=jt(Se()))}function Kt(e){return null===e||void 0===e?Ut():Bt(e)?e:Ut().withMutations(function(t){var n=o(e);ue(n.size),n.forEach(function(e){return t.add(e)})})}function Bt(e){return It(e)&&l(e)}function Wt(e,t){var n=Object.create(tr);return n.size=e?e.size:0,n._map=e,n.__ownerID=t,n}function Ut(){return nr||(nr=Wt(tt()))}function qt(e){return null===e||void 0===e?Xt():Yt(e)?e:Xt().unshiftAll(e)}function Yt(e){return!(!e||!e[rr])}function Gt(e,t,n,r){var o=Object.create(or);return o.size=e,o._head=t,o.__ownerID=n,o.__hash=r,o.__altered=!1,o}function Xt(){return ir||(ir=Gt(0))}function $t(e,t){var n=function(n){e.prototype[n]=t[n]};return Object.keys(t).forEach(n),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(t).forEach(n),e}function Jt(e,t){return t}function Zt(e,t){return[t,e]}function Qt(e){return function(){return!e.apply(this,arguments)}}function en(e){return function(){return-e.apply(this,arguments)}}function tn(e){return"string"==typeof e?JSON.stringify(e):String(e)}function nn(){return h(arguments)}function rn(e,t){return e<t?1:e>t?-1:0}function on(e){if(e.size===1/0)return 0;var t=l(e),n=a(e),r=t?1:0;return an(e.__iterate(n?t?function(e,t){r=31*r+cn(ie(e),ie(t))|0}:function(e,t){r=r+cn(ie(e),ie(t))|0}:t?function(e){r=31*r+ie(e)|0}:function(e){r=r+ie(e)|0}),r)}function an(e,t){return t=Tn(t,3432918353),t=Tn(t<<15|t>>>-15,461845907),t=Tn(t<<13|t>>>-13,5),t=(t+3864292196|0)^e,t=Tn(t^t>>>16,2246822507),t=Tn(t^t>>>13,3266489909),t=oe(t^t>>>16)}function cn(e,t){return e^t+2654435769+(e<<6)+(e>>2)|0}var sn=Array.prototype.slice;e(n,t),e(r,t),e(o,t),t.isIterable=i,t.isKeyed=a,t.isIndexed=c,t.isAssociative=s,t.isOrdered=l,t.Keyed=n,t.Indexed=r,t.Set=o;var ln="@@__IMMUTABLE_ITERABLE__@@",un="@@__IMMUTABLE_KEYED__@@",pn="@@__IMMUTABLE_INDEXED__@@",fn="@@__IMMUTABLE_ORDERED__@@",hn=5,dn=1<<hn,vn=dn-1,mn={},yn={value:!1},gn={value:!1},bn=0,Cn=1,wn=2,Sn="function"==typeof Symbol&&Symbol.iterator,xn="@@iterator",Mn=Sn||xn;w.prototype.toString=function(){return"[Iterator]"},w.KEYS=bn,w.VALUES=Cn,w.ENTRIES=wn,w.prototype.inspect=w.prototype.toSource=function(){return this.toString()},w.prototype[Mn]=function(){return this},e(E,t),E.of=function(){return E(arguments)},E.prototype.toSeq=function(){return this},E.prototype.toString=function(){return this.__toString("Seq {","}")},E.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},E.prototype.__iterate=function(e,t){return B(this,e,t,!0)},E.prototype.__iterator=function(e,t){return W(this,e,t,!0)},e(T,E),T.prototype.toKeyedSeq=function(){return this},e(N,E),N.of=function(){return N(arguments)},N.prototype.toIndexedSeq=function(){return this},N.prototype.toString=function(){return this.__toString("Seq [","]")},N.prototype.__iterate=function(e,t){return B(this,e,t,!1)},N.prototype.__iterator=function(e,t){return W(this,e,t,!1)},e(V,E),V.of=function(){return V(arguments)},V.prototype.toSetSeq=function(){return this},E.isSeq=A,E.Keyed=T,E.Set=V,E.Indexed=N;var zn="@@__IMMUTABLE_SEQ__@@";E.prototype[zn]=!0,e(P,N),P.prototype.get=function(e,t){return this.has(e)?this._array[v(this,e)]:t},P.prototype.__iterate=function(e,t){for(var n=this._array,r=n.length-1,o=0;o<=r;o++)if(!1===e(n[t?r-o:o],o,this))return o+1;return o},P.prototype.__iterator=function(e,t){var n=this._array,r=n.length-1,o=0;return new w(function(){return o>r?x():S(e,o,n[t?r-o++:o++])})},e(H,T),H.prototype.get=function(e,t){return void 0===t||this.has(e)?this._object[e]:t},H.prototype.has=function(e){return this._object.hasOwnProperty(e)},H.prototype.__iterate=function(e,t){for(var n=this._object,r=this._keys,o=r.length-1,i=0;i<=o;i++){var a=r[t?o-i:i];if(!1===e(n[a],a,this))return i+1}return i},H.prototype.__iterator=function(e,t){var n=this._object,r=this._keys,o=r.length-1,i=0;return new w(function(){var a=r[t?o-i:i];return i++>o?x():S(e,a,n[a])})},H.prototype[fn]=!0,e(L,N),L.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);var n=this._iterable,r=k(n),o=0;if(z(r))for(var i;!(i=r.next()).done&&!1!==e(i.value,o++,this););return o},L.prototype.__iteratorUncached=function(e,t){if(t)return this.cacheResult().__iterator(e,t);var n=this._iterable,r=k(n);if(!z(r))return new w(x);var o=0;return new w(function(){var t=r.next();return t.done?t:S(e,o++,t.value)})},e(D,N),D.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);for(var n=this._iterator,r=this._iteratorCache,o=0;o<r.length;)if(!1===e(r[o],o++,this))return o;for(var i;!(i=n.next()).done;){var a=i.value;if(r[o]=a,!1===e(a,o++,this))break}return o},D.prototype.__iteratorUncached=function(e,t){if(t)return this.cacheResult().__iterator(e,t);var n=this._iterator,r=this._iteratorCache,o=0;return new w(function(){if(o>=r.length){var t=n.next();if(t.done)return t;r[o]=t.value}return S(e,o,r[o++])})};var kn;e(J,N),J.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},J.prototype.get=function(e,t){return this.has(e)?this._value:t},J.prototype.includes=function(e){return X(this._value,e)},J.prototype.slice=function(e,t){var n=this.size;return y(e,t,n)?this:new J(this._value,b(t,n)-g(e,n))},J.prototype.reverse=function(){return this},J.prototype.indexOf=function(e){return X(this._value,e)?0:-1},J.prototype.lastIndexOf=function(e){return X(this._value,e)?this.size:-1},J.prototype.__iterate=function(e,t){for(var n=0;n<this.size;n++)if(!1===e(this._value,n,this))return n+1;return n},J.prototype.__iterator=function(e,t){var n=this,r=0;return new w(function(){return r<n.size?S(e,r++,n._value):x()})},J.prototype.equals=function(e){return e instanceof J?X(this._value,e._value):$(e)};var _n;e(Q,N),Q.prototype.toString=function(){return 0===this.size?"Range []":"Range [ "+this._start+"..."+this._end+(1!==this._step?" by "+this._step:"")+" ]"},Q.prototype.get=function(e,t){return this.has(e)?this._start+v(this,e)*this._step:t},Q.prototype.includes=function(e){var t=(e-this._start)/this._step;return t>=0&&t<this.size&&t===Math.floor(t)},Q.prototype.slice=function(e,t){return y(e,t,this.size)?this:(e=g(e,this.size),t=b(t,this.size),t<=e?new Q(0,0):new Q(this.get(e,this._end),this.get(t,this._end),this._step))},Q.prototype.indexOf=function(e){var t=e-this._start;if(t%this._step==0){var n=t/this._step;if(n>=0&&n<this.size)return n}return-1},Q.prototype.lastIndexOf=function(e){return this.indexOf(e)},Q.prototype.__iterate=function(e,t){for(var n=this.size-1,r=this._step,o=t?this._start+n*r:this._start,i=0;i<=n;i++){if(!1===e(o,i,this))return i+1;o+=t?-r:r}return i},Q.prototype.__iterator=function(e,t){var n=this.size-1,r=this._step,o=t?this._start+n*r:this._start,i=0;return new w(function(){var a=o;return o+=t?-r:r,i>n?x():S(e,i++,a)})},Q.prototype.equals=function(e){return e instanceof Q?this._start===e._start&&this._end===e._end&&this._step===e._step:$(this,e)};var On;e(ee,t),e(te,ee),e(ne,ee),e(re,ee),ee.Keyed=te,ee.Indexed=ne,ee.Set=re;var En,Tn="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function(e,t){e|=0,t|=0;var n=65535&e,r=65535&t;return n*r+((e>>>16)*r+n*(t>>>16)<<16>>>0)|0},Nn=Object.isExtensible,Vn=function(){try{return Object.defineProperty({},"@",{}),!0}catch(e){return!1}}(),Pn="function"==typeof WeakMap;Pn&&(En=new WeakMap);var Hn=0,Ln="__immutablehash__";"function"==typeof Symbol&&(Ln=Symbol(Ln));var Dn=16,An=255,In=0,Rn={};e(pe,te),pe.of=function(){var e=sn.call(arguments,0);return Se().withMutations(function(t){for(var n=0;n<e.length;n+=2){if(n+1>=e.length)throw new Error("Missing value for key: "+e[n]);t.set(e[n],e[n+1])}})},pe.prototype.toString=function(){return this.__toString("Map {","}")},pe.prototype.get=function(e,t){return this._root?this._root.get(0,void 0,e,t):t},pe.prototype.set=function(e,t){return xe(this,e,t)},pe.prototype.setIn=function(e,t){return this.updateIn(e,mn,function(){return t})},pe.prototype.remove=function(e){return xe(this,e,mn)},pe.prototype.deleteIn=function(e){return this.updateIn(e,function(){return mn})},pe.prototype.update=function(e,t,n){return 1===arguments.length?e(this):this.updateIn([e],t,n)},pe.prototype.updateIn=function(e,t,n){n||(n=t,t=void 0);var r=He(this,Nt(e),t,n);return r===mn?void 0:r},pe.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):Se()},pe.prototype.merge=function(){return Te(this,void 0,arguments)},pe.prototype.mergeWith=function(e){return Te(this,e,sn.call(arguments,1))},pe.prototype.mergeIn=function(e){var t=sn.call(arguments,1);return this.updateIn(e,Se(),function(e){return"function"==typeof e.merge?e.merge.apply(e,t):t[t.length-1]})},pe.prototype.mergeDeep=function(){return Te(this,Ne,arguments)},pe.prototype.mergeDeepWith=function(e){var t=sn.call(arguments,1);return Te(this,Ve(e),t)},pe.prototype.mergeDeepIn=function(e){var t=sn.call(arguments,1);return this.updateIn(e,Se(),function(e){return"function"==typeof e.mergeDeep?e.mergeDeep.apply(e,t):t[t.length-1]})},pe.prototype.sort=function(e){return Ze(Ct(this,e))},pe.prototype.sortBy=function(e,t){return Ze(Ct(this,t,e))},pe.prototype.withMutations=function(e){var t=this.asMutable();return e(t),t.wasAltered()?t.__ensureOwner(this.__ownerID):this},pe.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new f)},pe.prototype.asImmutable=function(){return this.__ensureOwner()},pe.prototype.wasAltered=function(){return this.__altered},pe.prototype.__iterator=function(e,t){return new ge(this,e,t)},pe.prototype.__iterate=function(e,t){var n=this,r=0;return this._root&&this._root.iterate(function(t){return r++,e(t[1],t[0],n)},t),r},pe.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?we(this.size,this._root,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},pe.isMap=fe;var jn="@@__IMMUTABLE_MAP__@@",Fn=pe.prototype;Fn[jn]=!0,Fn.delete=Fn.remove,Fn.removeIn=Fn.deleteIn,he.prototype.get=function(e,t,n,r){for(var o=this.entries,i=0,a=o.length;i<a;i++)if(X(n,o[i][0]))return o[i][1];return r},he.prototype.update=function(e,t,n,r,o,i,a){for(var c=o===mn,s=this.entries,l=0,u=s.length;l<u&&!X(r,s[l][0]);l++);var f=l<u;if(f?s[l][1]===o:c)return this;if(p(a),(c||!f)&&p(i),!c||1!==s.length){if(!f&&!c&&s.length>=Bn)return _e(e,s,r,o);var d=e&&e===this.ownerID,v=d?s:h(s);return f?c?l===u-1?v.pop():v[l]=v.pop():v[l]=[r,o]:v.push([r,o]),d?(this.entries=v,this):new he(e,v)}},de.prototype.get=function(e,t,n,r){void 0===t&&(t=ie(n));var o=1<<((0===e?t:t>>>e)&vn),i=this.bitmap;return 0==(i&o)?r:this.nodes[Le(i&o-1)].get(e+hn,t,n,r)},de.prototype.update=function(e,t,n,r,o,i,a){void 0===n&&(n=ie(r));var c=(0===t?n:n>>>t)&vn,s=1<<c,l=this.bitmap,u=0!=(l&s);if(!u&&o===mn)return this;var p=Le(l&s-1),f=this.nodes,h=u?f[p]:void 0,d=Me(h,e,t+hn,n,r,o,i,a);if(d===h)return this;if(!u&&d&&f.length>=Wn)return Ee(e,f,l,c,d);if(u&&!d&&2===f.length&&ze(f[1^p]))return f[1^p];if(u&&d&&1===f.length&&ze(d))return d;var v=e&&e===this.ownerID,m=u?d?l:l^s:l|s,y=u?d?De(f,p,d,v):Ie(f,p,v):Ae(f,p,d,v);return v?(this.bitmap=m,this.nodes=y,this):new de(e,m,y)},ve.prototype.get=function(e,t,n,r){void 0===t&&(t=ie(n));var o=(0===e?t:t>>>e)&vn,i=this.nodes[o];return i?i.get(e+hn,t,n,r):r},ve.prototype.update=function(e,t,n,r,o,i,a){void 0===n&&(n=ie(r));var c=(0===t?n:n>>>t)&vn,s=o===mn,l=this.nodes,u=l[c];if(s&&!u)return this;var p=Me(u,e,t+hn,n,r,o,i,a);if(p===u)return this;var f=this.count;if(u){if(!p&&--f<Un)return Oe(e,l,f,c)}else f++;var h=e&&e===this.ownerID,d=De(l,c,p,h);return h?(this.count=f,this.nodes=d,this):new ve(e,f,d)},me.prototype.get=function(e,t,n,r){for(var o=this.entries,i=0,a=o.length;i<a;i++)if(X(n,o[i][0]))return o[i][1];return r},me.prototype.update=function(e,t,n,r,o,i,a){void 0===n&&(n=ie(r));var c=o===mn;if(n!==this.keyHash)return c?this:(p(a),p(i),ke(this,e,t,n,[r,o]));for(var s=this.entries,l=0,u=s.length;l<u&&!X(r,s[l][0]);l++);var f=l<u;if(f?s[l][1]===o:c)return this;if(p(a),(c||!f)&&p(i),c&&2===u)return new ye(e,this.keyHash,s[1^l]);var d=e&&e===this.ownerID,v=d?s:h(s);return f?c?l===u-1?v.pop():v[l]=v.pop():v[l]=[r,o]:v.push([r,o]),d?(this.entries=v,this):new me(e,this.keyHash,v)},ye.prototype.get=function(e,t,n,r){return X(n,this.entry[0])?this.entry[1]:r},ye.prototype.update=function(e,t,n,r,o,i,a){var c=o===mn,s=X(r,this.entry[0]);return(s?o===this.entry[1]:c)?this:(p(a),c?void p(i):s?e&&e===this.ownerID?(this.entry[1]=o,this):new ye(e,this.keyHash,[r,o]):(p(i),ke(this,e,t,ie(r),[r,o])))},he.prototype.iterate=me.prototype.iterate=function(e,t){for(var n=this.entries,r=0,o=n.length-1;r<=o;r++)if(!1===e(n[t?o-r:r]))return!1},de.prototype.iterate=ve.prototype.iterate=function(e,t){for(var n=this.nodes,r=0,o=n.length-1;r<=o;r++){var i=n[t?o-r:r];if(i&&!1===i.iterate(e,t))return!1}},ye.prototype.iterate=function(e,t){return e(this.entry)},e(ge,w),ge.prototype.next=function(){for(var e=this._type,t=this._stack;t;){var n,r=t.node,o=t.index++;if(r.entry){if(0===o)return be(e,r.entry)}else if(r.entries){if(n=r.entries.length-1,o<=n)return be(e,r.entries[this._reverse?n-o:o])}else if(n=r.nodes.length-1,o<=n){var i=r.nodes[this._reverse?n-o:o];if(i){if(i.entry)return be(e,i.entry);t=this._stack=Ce(i,t)}continue}t=this._stack=this._stack.__prev}return x()};var Kn,Bn=dn/4,Wn=dn/2,Un=dn/4;e(Re,ne),Re.of=function(){return this(arguments)},Re.prototype.toString=function(){return this.__toString("List [","]")},Re.prototype.get=function(e,t){if((e=v(this,e))>=0&&e<this.size){e+=this._origin;var n=Ge(this,e);return n&&n.array[e&vn]}return t},Re.prototype.set=function(e,t){return Ue(this,e,t)},Re.prototype.remove=function(e){return this.has(e)?0===e?this.shift():e===this.size-1?this.pop():this.splice(e,1):this},Re.prototype.insert=function(e,t){return this.splice(e,0,t)},Re.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=this._origin=this._capacity=0,this._level=hn,this._root=this._tail=null,this.__hash=void 0,this.__altered=!0,this):We()},Re.prototype.push=function(){var e=arguments,t=this.size;return this.withMutations(function(n){Xe(n,0,t+e.length);for(var r=0;r<e.length;r++)n.set(t+r,e[r])})},Re.prototype.pop=function(){return Xe(this,0,-1)},Re.prototype.unshift=function(){var e=arguments;return this.withMutations(function(t){Xe(t,-e.length);for(var n=0;n<e.length;n++)t.set(n,e[n])})},Re.prototype.shift=function(){return Xe(this,1)},Re.prototype.merge=function(){return $e(this,void 0,arguments)},Re.prototype.mergeWith=function(e){return $e(this,e,sn.call(arguments,1))},Re.prototype.mergeDeep=function(){return $e(this,Ne,arguments)},Re.prototype.mergeDeepWith=function(e){var t=sn.call(arguments,1);return $e(this,Ve(e),t)},Re.prototype.setSize=function(e){return Xe(this,0,e)},Re.prototype.slice=function(e,t){var n=this.size;return y(e,t,n)?this:Xe(this,g(e,n),b(t,n))},Re.prototype.__iterator=function(e,t){var n=0,r=Ke(this,t);return new w(function(){var t=r();return t===Xn?x():S(e,n++,t)})},Re.prototype.__iterate=function(e,t){for(var n,r=0,o=Ke(this,t);(n=o())!==Xn&&!1!==e(n,r++,this););return r},Re.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?Be(this._origin,this._capacity,this._level,this._root,this._tail,e,this.__hash):(this.__ownerID=e,this)},Re.isList=je;var qn="@@__IMMUTABLE_LIST__@@",Yn=Re.prototype;Yn[qn]=!0,Yn.delete=Yn.remove,Yn.setIn=Fn.setIn,Yn.deleteIn=Yn.removeIn=Fn.removeIn,Yn.update=Fn.update,Yn.updateIn=Fn.updateIn,Yn.mergeIn=Fn.mergeIn,Yn.mergeDeepIn=Fn.mergeDeepIn,Yn.withMutations=Fn.withMutations,Yn.asMutable=Fn.asMutable,Yn.asImmutable=Fn.asImmutable,Yn.wasAltered=Fn.wasAltered,Fe.prototype.removeBefore=function(e,t,n){if(n===t?1<<t:0===this.array.length)return this;var r=n>>>t&vn;if(r>=this.array.length)return new Fe([],e);var o,i=0===r;if(t>0){var a=this.array[r];if((o=a&&a.removeBefore(e,t-hn,n))===a&&i)return this}if(i&&!o)return this;var c=Ye(this,e);if(!i)for(var s=0;s<r;s++)c.array[s]=void 0;return o&&(c.array[r]=o),c},Fe.prototype.removeAfter=function(e,t,n){if(n===(t?1<<t:0)||0===this.array.length)return this;var r=n-1>>>t&vn;if(r>=this.array.length)return this;var o;if(t>0){var i=this.array[r];if((o=i&&i.removeAfter(e,t-hn,n))===i&&r===this.array.length-1)return this}var a=Ye(this,e);return a.array.splice(r+1),o&&(a.array[r]=o),a};var Gn,Xn={};e(Ze,pe),Ze.of=function(){return this(arguments)},Ze.prototype.toString=function(){return this.__toString("OrderedMap {","}")},Ze.prototype.get=function(e,t){var n=this._map.get(e);return void 0!==n?this._list.get(n)[1]:t},Ze.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._map.clear(),this._list.clear(),this):tt()},Ze.prototype.set=function(e,t){return nt(this,e,t)},Ze.prototype.remove=function(e){return nt(this,e,mn)},Ze.prototype.wasAltered=function(){return this._map.wasAltered()||this._list.wasAltered()},Ze.prototype.__iterate=function(e,t){var n=this;return this._list.__iterate(function(t){return t&&e(t[1],t[0],n)},t)},Ze.prototype.__iterator=function(e,t){return this._list.fromEntrySeq().__iterator(e,t)},Ze.prototype.__ensureOwner=function(e){if(e===this.__ownerID)return this;var t=this._map.__ensureOwner(e),n=this._list.__ensureOwner(e);return e?et(t,n,e,this.__hash):(this.__ownerID=e,this._map=t,this._list=n,this)},Ze.isOrderedMap=Qe,Ze.prototype[fn]=!0,Ze.prototype.delete=Ze.prototype.remove;var $n;e(rt,T),rt.prototype.get=function(e,t){return this._iter.get(e,t)},rt.prototype.has=function(e){return this._iter.has(e)},rt.prototype.valueSeq=function(){return this._iter.valueSeq()},rt.prototype.reverse=function(){var e=this,t=lt(this,!0);return this._useKeys||(t.valueSeq=function(){return e._iter.toSeq().reverse()}),t},rt.prototype.map=function(e,t){var n=this,r=st(this,e,t);return this._useKeys||(r.valueSeq=function(){return n._iter.toSeq().map(e,t)}),r},rt.prototype.__iterate=function(e,t){var n,r=this;return this._iter.__iterate(this._useKeys?function(t,n){return e(t,n,r)}:(n=t?kt(this):0,function(o){return e(o,t?--n:n++,r)}),t)},rt.prototype.__iterator=function(e,t){if(this._useKeys)return this._iter.__iterator(e,t);var n=this._iter.__iterator(Cn,t),r=t?kt(this):0;return new w(function(){var o=n.next();return o.done?o:S(e,t?--r:r++,o.value,o)})},rt.prototype[fn]=!0,e(ot,N),ot.prototype.includes=function(e){return this._iter.includes(e)},ot.prototype.__iterate=function(e,t){var n=this,r=0;return this._iter.__iterate(function(t){return e(t,r++,n)},t)},ot.prototype.__iterator=function(e,t){var n=this._iter.__iterator(Cn,t),r=0;return new w(function(){var t=n.next();return t.done?t:S(e,r++,t.value,t)})},e(it,V),it.prototype.has=function(e){return this._iter.includes(e)},it.prototype.__iterate=function(e,t){var n=this;return this._iter.__iterate(function(t){return e(t,t,n)},t)},it.prototype.__iterator=function(e,t){var n=this._iter.__iterator(Cn,t);return new w(function(){var t=n.next();return t.done?t:S(e,t.value,t.value,t)})},e(at,T),at.prototype.entrySeq=function(){return this._iter.toSeq()},at.prototype.__iterate=function(e,t){var n=this;return this._iter.__iterate(function(t){if(t){zt(t);var r=i(t);return e(r?t.get(1):t[1],r?t.get(0):t[0],n)}},t)},at.prototype.__iterator=function(e,t){var n=this._iter.__iterator(Cn,t);return new w(function(){for(;;){var t=n.next();if(t.done)return t;var r=t.value;if(r){zt(r);var o=i(r);return S(e,o?r.get(0):r[0],o?r.get(1):r[1],t)}}})},ot.prototype.cacheResult=rt.prototype.cacheResult=it.prototype.cacheResult=at.prototype.cacheResult=Et,e(Vt,te),Vt.prototype.toString=function(){return this.__toString(Ht(this)+" {","}")},Vt.prototype.has=function(e){return this._defaultValues.hasOwnProperty(e)},Vt.prototype.get=function(e,t){if(!this.has(e))return t;var n=this._defaultValues[e];return this._map?this._map.get(e,n):n},Vt.prototype.clear=function(){if(this.__ownerID)return this._map&&this._map.clear(),this;var e=this.constructor;return e._empty||(e._empty=Pt(this,Se()))},Vt.prototype.set=function(e,t){if(!this.has(e))throw new Error('Cannot set unknown key "'+e+'" on '+Ht(this));if(this._map&&!this._map.has(e)){if(t===this._defaultValues[e])return this}var n=this._map&&this._map.set(e,t);return this.__ownerID||n===this._map?this:Pt(this,n)},Vt.prototype.remove=function(e){if(!this.has(e))return this;var t=this._map&&this._map.remove(e);return this.__ownerID||t===this._map?this:Pt(this,t)},Vt.prototype.wasAltered=function(){return this._map.wasAltered()},Vt.prototype.__iterator=function(e,t){var r=this;return n(this._defaultValues).map(function(e,t){return r.get(t)}).__iterator(e,t)},Vt.prototype.__iterate=function(e,t){var r=this;return n(this._defaultValues).map(function(e,t){return r.get(t)}).__iterate(e,t)},Vt.prototype.__ensureOwner=function(e){if(e===this.__ownerID)return this;var t=this._map&&this._map.__ensureOwner(e);return e?Pt(this,t,e):(this.__ownerID=e,this._map=t,this)};var Jn=Vt.prototype;Jn.delete=Jn.remove,Jn.deleteIn=Jn.removeIn=Fn.removeIn,Jn.merge=Fn.merge,Jn.mergeWith=Fn.mergeWith,Jn.mergeIn=Fn.mergeIn,Jn.mergeDeep=Fn.mergeDeep,Jn.mergeDeepWith=Fn.mergeDeepWith,Jn.mergeDeepIn=Fn.mergeDeepIn,Jn.setIn=Fn.setIn,Jn.update=Fn.update,Jn.updateIn=Fn.updateIn,Jn.withMutations=Fn.withMutations,Jn.asMutable=Fn.asMutable,Jn.asImmutable=Fn.asImmutable,e(At,re),At.of=function(){return this(arguments)},At.fromKeys=function(e){return this(n(e).keySeq())},At.prototype.toString=function(){return this.__toString("Set {","}")},At.prototype.has=function(e){return this._map.has(e)},At.prototype.add=function(e){return Rt(this,this._map.set(e,!0))},At.prototype.remove=function(e){return Rt(this,this._map.remove(e))},At.prototype.clear=function(){return Rt(this,this._map.clear())},At.prototype.union=function(){var e=sn.call(arguments,0);return e=e.filter(function(e){return 0!==e.size}),0===e.length?this:0!==this.size||this.__ownerID||1!==e.length?this.withMutations(function(t){for(var n=0;n<e.length;n++)o(e[n]).forEach(function(e){return t.add(e)})}):this.constructor(e[0])},At.prototype.intersect=function(){var e=sn.call(arguments,0);if(0===e.length)return this;e=e.map(function(e){return o(e)});var t=this;return this.withMutations(function(n){t.forEach(function(t){e.every(function(e){return e.includes(t)})||n.remove(t)})})},At.prototype.subtract=function(){var e=sn.call(arguments,0);if(0===e.length)return this;e=e.map(function(e){return o(e)});var t=this;return this.withMutations(function(n){t.forEach(function(t){e.some(function(e){return e.includes(t)})&&n.remove(t)})})},At.prototype.merge=function(){return this.union.apply(this,arguments)},At.prototype.mergeWith=function(e){var t=sn.call(arguments,1);return this.union.apply(this,t)},At.prototype.sort=function(e){return Kt(Ct(this,e))},At.prototype.sortBy=function(e,t){return Kt(Ct(this,t,e))},At.prototype.wasAltered=function(){return this._map.wasAltered()},At.prototype.__iterate=function(e,t){var n=this;return this._map.__iterate(function(t,r){return e(r,r,n)},t)},At.prototype.__iterator=function(e,t){return this._map.map(function(e,t){return t}).__iterator(e,t)},At.prototype.__ensureOwner=function(e){if(e===this.__ownerID)return this;var t=this._map.__ensureOwner(e);return e?this.__make(t,e):(this.__ownerID=e,this._map=t,this)},At.isSet=It;var Zn="@@__IMMUTABLE_SET__@@",Qn=At.prototype;Qn[Zn]=!0,Qn.delete=Qn.remove,Qn.mergeDeep=Qn.merge,Qn.mergeDeepWith=Qn.mergeWith,Qn.withMutations=Fn.withMutations,Qn.asMutable=Fn.asMutable,Qn.asImmutable=Fn.asImmutable,Qn.__empty=Ft,Qn.__make=jt;var er;e(Kt,At),Kt.of=function(){return this(arguments)},Kt.fromKeys=function(e){return this(n(e).keySeq())},Kt.prototype.toString=function(){return this.__toString("OrderedSet {","}")},Kt.isOrderedSet=Bt;var tr=Kt.prototype;tr[fn]=!0,tr.__empty=Ut,tr.__make=Wt;var nr;e(qt,ne),qt.of=function(){return this(arguments)},qt.prototype.toString=function(){return this.__toString("Stack [","]")},qt.prototype.get=function(e,t){var n=this._head;for(e=v(this,e);n&&e--;)n=n.next;return n?n.value:t},qt.prototype.peek=function(){return this._head&&this._head.value},qt.prototype.push=function(){if(0===arguments.length)return this;for(var e=this.size+arguments.length,t=this._head,n=arguments.length-1;n>=0;n--)t={value:arguments[n],next:t};return this.__ownerID?(this.size=e,this._head=t,this.__hash=void 0,this.__altered=!0,this):Gt(e,t)},qt.prototype.pushAll=function(e){if(e=r(e),0===e.size)return this;ue(e.size);var t=this.size,n=this._head;return e.reverse().forEach(function(e){t++,n={value:e,next:n}}),this.__ownerID?(this.size=t,this._head=n,this.__hash=void 0,this.__altered=!0,this):Gt(t,n)},qt.prototype.pop=function(){return this.slice(1)},qt.prototype.unshift=function(){return this.push.apply(this,arguments)},qt.prototype.unshiftAll=function(e){return this.pushAll(e)},qt.prototype.shift=function(){return this.pop.apply(this,arguments)},qt.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):Xt()},qt.prototype.slice=function(e,t){if(y(e,t,this.size))return this;var n=g(e,this.size);if(b(t,this.size)!==this.size)return ne.prototype.slice.call(this,e,t);for(var r=this.size-n,o=this._head;n--;)o=o.next;return this.__ownerID?(this.size=r,this._head=o,this.__hash=void 0,this.__altered=!0,this):Gt(r,o)},qt.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?Gt(this.size,this._head,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},qt.prototype.__iterate=function(e,t){if(t)return this.reverse().__iterate(e);for(var n=0,r=this._head;r&&!1!==e(r.value,n++,this);)r=r.next;return n},qt.prototype.__iterator=function(e,t){if(t)return this.reverse().__iterator(e);var n=0,r=this._head;return new w(function(){if(r){var t=r.value;return r=r.next,S(e,n++,t)}return x()})},qt.isStack=Yt;var rr="@@__IMMUTABLE_STACK__@@",or=qt.prototype;or[rr]=!0,or.withMutations=Fn.withMutations,or.asMutable=Fn.asMutable,or.asImmutable=Fn.asImmutable,or.wasAltered=Fn.wasAltered;var ir;t.Iterator=w,$t(t,{toArray:function(){ue(this.size);var e=new Array(this.size||0);return this.valueSeq().__iterate(function(t,n){e[n]=t}),e},toIndexedSeq:function(){return new ot(this)},toJS:function(){return this.toSeq().map(function(e){return e&&"function"==typeof e.toJS?e.toJS():e}).__toJS()},toJSON:function(){return this.toSeq().map(function(e){return e&&"function"==typeof e.toJSON?e.toJSON():e}).__toJS()},toKeyedSeq:function(){return new rt(this,!0)},toMap:function(){return pe(this.toKeyedSeq())},toObject:function(){ue(this.size);var e={};return this.__iterate(function(t,n){e[n]=t}),e},toOrderedMap:function(){return Ze(this.toKeyedSeq())},toOrderedSet:function(){return Kt(a(this)?this.valueSeq():this)},toSet:function(){return At(a(this)?this.valueSeq():this)},toSetSeq:function(){return new it(this)},toSeq:function(){return c(this)?this.toIndexedSeq():a(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return qt(a(this)?this.valueSeq():this)},toList:function(){return Re(a(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(e,t){return 0===this.size?e+t:e+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+t},concat:function(){return Mt(this,mt(this,sn.call(arguments,0)))},includes:function(e){return this.some(function(t){return X(t,e)})},entries:function(){return this.__iterator(wn)},every:function(e,t){ue(this.size);var n=!0;return this.__iterate(function(r,o,i){if(!e.call(t,r,o,i))return n=!1,!1}),n},filter:function(e,t){return Mt(this,ut(this,e,t,!0))},find:function(e,t,n){var r=this.findEntry(e,t);return r?r[1]:n},forEach:function(e,t){return ue(this.size),this.__iterate(t?e.bind(t):e)},join:function(e){ue(this.size),e=void 0!==e?""+e:",";var t="",n=!0;return this.__iterate(function(r){n?n=!1:t+=e,t+=null!==r&&void 0!==r?r.toString():""}),t},keys:function(){return this.__iterator(bn)},map:function(e,t){return Mt(this,st(this,e,t))},reduce:function(e,t,n){ue(this.size);var r,o;return arguments.length<2?o=!0:r=t,this.__iterate(function(t,i,a){o?(o=!1,r=t):r=e.call(n,r,t,i,a)}),r},reduceRight:function(e,t,n){var r=this.toKeyedSeq().reverse();return r.reduce.apply(r,arguments)},reverse:function(){return Mt(this,lt(this,!0))},slice:function(e,t){return Mt(this,ht(this,e,t,!0))},some:function(e,t){return!this.every(Qt(e),t)},sort:function(e){return Mt(this,Ct(this,e))},values:function(){return this.__iterator(Cn)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some(function(){return!0})},count:function(e,t){return d(e?this.toSeq().filter(e,t):this)},countBy:function(e,t){return pt(this,e,t)},equals:function(e){return $(this,e)},entrySeq:function(){var e=this;if(e._cache)return new P(e._cache);var t=e.toSeq().map(Zt).toIndexedSeq();return t.fromEntrySeq=function(){return e.toSeq()},t},filterNot:function(e,t){return this.filter(Qt(e),t)},findEntry:function(e,t,n){var r=n;return this.__iterate(function(n,o,i){if(e.call(t,n,o,i))return r=[o,n],!1}),r},findKey:function(e,t){var n=this.findEntry(e,t);return n&&n[0]},findLast:function(e,t,n){return this.toKeyedSeq().reverse().find(e,t,n)},findLastEntry:function(e,t,n){return this.toKeyedSeq().reverse().findEntry(e,t,n)},findLastKey:function(e,t){return this.toKeyedSeq().reverse().findKey(e,t)},first:function(){return this.find(m)},flatMap:function(e,t){return Mt(this,gt(this,e,t))},flatten:function(e){return Mt(this,yt(this,e,!0))},fromEntrySeq:function(){return new at(this)},get:function(e,t){return this.find(function(t,n){return X(n,e)},void 0,t)},getIn:function(e,t){for(var n,r=this,o=Nt(e);!(n=o.next()).done;){var i=n.value;if((r=r&&r.get?r.get(i,mn):mn)===mn)return t}return r},groupBy:function(e,t){return ft(this,e,t)},has:function(e){return this.get(e,mn)!==mn},hasIn:function(e){return this.getIn(e,mn)!==mn},isSubset:function(e){return e="function"==typeof e.includes?e:t(e),this.every(function(t){return e.includes(t)})},isSuperset:function(e){return e="function"==typeof e.isSubset?e:t(e),e.isSubset(this)},keyOf:function(e){return this.findKey(function(t){return X(t,e)})},keySeq:function(){return this.toSeq().map(Jt).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(e){return this.toKeyedSeq().reverse().keyOf(e)},max:function(e){return wt(this,e)},maxBy:function(e,t){return wt(this,t,e)},min:function(e){return wt(this,e?en(e):rn)},minBy:function(e,t){return wt(this,t?en(t):rn,e)},rest:function(){return this.slice(1)},skip:function(e){return this.slice(Math.max(0,e))},skipLast:function(e){return Mt(this,this.toSeq().reverse().skip(e).reverse())},skipWhile:function(e,t){return Mt(this,vt(this,e,t,!0))},skipUntil:function(e,t){return this.skipWhile(Qt(e),t)},sortBy:function(e,t){return Mt(this,Ct(this,t,e))},take:function(e){return this.slice(0,Math.max(0,e))},takeLast:function(e){return Mt(this,this.toSeq().reverse().take(e).reverse())},takeWhile:function(e,t){return Mt(this,dt(this,e,t))},takeUntil:function(e,t){return this.takeWhile(Qt(e),t)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=on(this))}});var ar=t.prototype;ar[ln]=!0,ar[Mn]=ar.values,ar.__toJS=ar.toArray,ar.__toStringMapper=tn,ar.inspect=ar.toSource=function(){return this.toString()},ar.chain=ar.flatMap,ar.contains=ar.includes,$t(n,{flip:function(){return Mt(this,ct(this))},mapEntries:function(e,t){var n=this,r=0;return Mt(this,this.toSeq().map(function(o,i){return e.call(t,[i,o],r++,n)}).fromEntrySeq())},mapKeys:function(e,t){var n=this;return Mt(this,this.toSeq().flip().map(function(r,o){return e.call(t,r,o,n)}).flip())}});var cr=n.prototype;return cr[un]=!0,cr[Mn]=ar.entries,cr.__toJS=ar.toObject,cr.__toStringMapper=function(e,t){return JSON.stringify(t)+": "+tn(e)},$t(r,{toKeyedSeq:function(){return new rt(this,!1)},filter:function(e,t){return Mt(this,ut(this,e,t,!1))},findIndex:function(e,t){var n=this.findEntry(e,t);return n?n[0]:-1},indexOf:function(e){var t=this.keyOf(e);return void 0===t?-1:t},lastIndexOf:function(e){var t=this.lastKeyOf(e);return void 0===t?-1:t},reverse:function(){return Mt(this,lt(this,!1))},slice:function(e,t){return Mt(this,ht(this,e,t,!1))},splice:function(e,t){var n=arguments.length;if(t=Math.max(0|t,0),0===n||2===n&&!t)return this;e=g(e,e<0?this.count():this.size);var r=this.slice(0,e);return Mt(this,1===n?r:r.concat(h(arguments,2),this.slice(e+t)))},findLastIndex:function(e,t){var n=this.findLastEntry(e,t);return n?n[0]:-1},first:function(){return this.get(0)},flatten:function(e){return Mt(this,yt(this,e,!1))},get:function(e,t){return e=v(this,e),e<0||this.size===1/0||void 0!==this.size&&e>this.size?t:this.find(function(t,n){return n===e},void 0,t)},has:function(e){return(e=v(this,e))>=0&&(void 0!==this.size?this.size===1/0||e<this.size:-1!==this.indexOf(e))},interpose:function(e){return Mt(this,bt(this,e))},interleave:function(){var e=[this].concat(h(arguments)),t=xt(this.toSeq(),N.of,e),n=t.flatten(!0);return t.size&&(n.size=t.size*e.length),Mt(this,n)},keySeq:function(){return Q(0,this.size)},last:function(){return this.get(-1)},skipWhile:function(e,t){return Mt(this,vt(this,e,t,!1))},zip:function(){return Mt(this,xt(this,nn,[this].concat(h(arguments))))},zipWith:function(e){var t=h(arguments);return t[0]=this,Mt(this,xt(this,e,t))}}),r.prototype[pn]=!0,r.prototype[fn]=!0,$t(o,{get:function(e,t){return this.has(e)?e:t},includes:function(e){return this.has(e)},keySeq:function(){return this.valueSeq()}}),o.prototype.has=ar.includes,o.prototype.contains=o.prototype.includes,$t(T,n.prototype),$t(N,r.prototype),$t(V,o.prototype),$t(te,n.prototype),$t(ne,r.prototype),$t(re,o.prototype),{Iterable:t,Seq:E,Collection:ee,Map:pe,OrderedMap:Ze,List:Re,Stack:qt,Set:At,OrderedSet:Kt,Record:Vt,Range:Q,Repeat:J,is:X,fromJS:U}})},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 r=n(29),o=r.Symbol;e.exports=o},function(e,t){function n(e,t){return e===t||e!==e&&t!==t}e.exports=n},function(e,t,n){function r(e){if("string"==typeof e||o(e))return e;var t=e+"";return"0"==t&&1/e==-i?"-0":t}var o=n(81),i=1/0;e.exports=r},function(e,t,n){function r(e){return null!=e&&i(e.length)&&!o(e)}var o=n(118),i=n(121);e.exports=r},function(e,t,n){"use strict";var r=n(11),o=r.OrderedMap,i={createFromArray:function(e){return o(e.map(function(e){return[e.getKey(),e]}))}};e.exports=i},function(e,t,n){"use strict";function r(e,t,n,r){if(e.size){var o=0;e.reduce(function(e,i,a){return t(e,i)||(n(e)&&r(o,a),o=a),i}),n(e.last())&&r(o,e.count())}}e.exports=r},function(e,t,n){"use strict";function r(e){return"handled"===e||!0===e}e.exports=r},function(e,t,n){"use strict";var r={encode:function(e,t,n){return e+"-"+t+"-"+n},decode:function(e){var t=e.split("-"),n=t[0],r=t[1],o=t[2];return{blockKey:n,decoratorKey:parseInt(r,10),leafKey:parseInt(o,10)}}};e.exports=r},function(e,t,n){"use strict";function r(e,t,n){var r=e.getSelection(),i=e.getCurrentContent(),a=r;if(r.isCollapsed()){if("forward"===n){if(e.isSelectionAtEndOfContent())return i}else if(e.isSelectionAtStartOfContent())return i;if((a=t(e))===r)return i}return o.removeRange(i,a,n)}var o=n(22);e.exports=r},function(e,t,n){var r=n(150),o=n(102);e.exports=Object.keys||function(e){return r(e,o)}},function(e,t){e.exports=!0},function(e,t){var n=0,r=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+r).toString(36))}},function(e,t){t.f={}.propertyIsEnumerable},function(e,t,n){var r=n(98);e.exports=function(e){return Object(r(e))}},function(e,t,n){"use strict";var r=n(246)(!0);n(153)(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=r(t,n),this._i+=e.length,{value:e,done:!1})})},function(e,t,n){function r(e){if(!e||!e.nodeType)throw new Error("A DOM element reference is required");this.el=e,this.list=e.classList}try{var o=n(161)}catch(e){var o=n(161)}var i=/\s+/,a=Object.prototype.toString;e.exports=function(e){return new r(e)},r.prototype.add=function(e){if(this.list)return this.list.add(e),this;var t=this.array();return~o(t,e)||t.push(e),this.el.className=t.join(" "),this},r.prototype.remove=function(e){if("[object RegExp]"==a.call(e))return this.removeMatching(e);if(this.list)return this.list.remove(e),this;var t=this.array(),n=o(t,e);return~n&&t.splice(n,1),this.el.className=t.join(" "),this},r.prototype.removeMatching=function(e){for(var t=this.array(),n=0;n<t.length;n++)e.test(t[n])&&this.remove(t[n]);return this},r.prototype.toggle=function(e,t){return this.list?(void 0!==t?t!==this.list.toggle(e,t)&&this.list.toggle(e):this.list.toggle(e),this):(void 0!==t?t?this.add(e):this.remove(e):this.has(e)?this.remove(e):this.add(e),this)},r.prototype.array=function(){var e=this.el.getAttribute("class")||"",t=e.replace(/^\s+|\s+$/g,""),n=t.split(i);return""===n[0]&&n.shift(),n},r.prototype.has=r.prototype.contains=function(e){return this.list?this.list.contains(e):!!~o(this.array(),e)}},function(e,t,n){"use strict";e.exports=n(286)},function(e,t,n){"use strict";var r=n(2),o=n.n(r),i=n(6),a=n.n(i),c=n(3),s=n.n(c),l=n(4),u=n.n(l),p=n(0),f=(n.n(p),n(9)),h=(n.n(f),n(160)),d=void 0,v=function(e){function t(){o()(this,t);var e=s()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.onClick=function(t,n){if(!(t.className.indexOf("-leave")>=0)){var r=e.props.insertExtraNode;e.extraNode=document.createElement("div");var o=e.extraNode;o.className="ant-click-animating-node";var i=e.getAttributeName();t.removeAttribute(i),t.setAttribute(i,"true"),d=d||document.createElement("style"),n&&"#ffffff"!==n&&"rgb(255, 255, 255)"!==n&&e.isNotGrey(n)&&!/rgba\(\d*, \d*, \d*, 0\)/.test(n)&&"transparent"!==n&&(o.style.borderColor=n,d.innerHTML="[ant-click-animating-without-extra-node]:after { border-color: "+n+"; }",document.body.contains(d)||document.body.appendChild(d)),r&&t.appendChild(o),h.a.addEndEventListener(t,e.onTransitionEnd)}},e.bindAnimationEvent=function(t){if(t&&t.getAttribute&&!t.getAttribute("disabled")&&!(t.className.indexOf("disabled")>=0)){var n=function(n){if("INPUT"!==n.target.tagName){e.resetEffect(t);var r=getComputedStyle(t).getPropertyValue("border-top-color")||getComputedStyle(t).getPropertyValue("border-color")||getComputedStyle(t).getPropertyValue("background-color");e.clickWaveTimeoutId=window.setTimeout(function(){return e.onClick(t,r)},0)}};return t.addEventListener("click",n,!0),{cancel:function(){t.removeEventListener("click",n,!0)}}}},e.onTransitionEnd=function(t){t&&"fadeEffect"===t.animationName&&e.resetEffect(t.target)},e}return u()(t,e),a()(t,[{key:"isNotGrey",value:function(e){var t=(e||"").match(/rgba?\((\d*), (\d*), (\d*)(, [\.\d]*)?\)/);return!(t&&t[1]&&t[2]&&t[3])||!(t[1]===t[2]&&t[2]===t[3])}},{key:"getAttributeName",value:function(){return this.props.insertExtraNode?"ant-click-animating":"ant-click-animating-without-extra-node"}},{key:"resetEffect",value:function(e){if(e&&e!==this.extraNode){var t=this.props.insertExtraNode,n=this.getAttributeName();e.removeAttribute(n),this.removeExtraStyleNode(),t&&this.extraNode&&e.contains(this.extraNode)&&e.removeChild(this.extraNode),h.a.removeEndEventListener(e,this.onTransitionEnd)}}},{key:"removeExtraStyleNode",value:function(){d&&(d.innerHTML="")}},{key:"componentDidMount",value:function(){this.instance=this.bindAnimationEvent(Object(f.findDOMNode)(this))}},{key:"componentWillUnmount",value:function(){this.instance&&this.instance.cancel(),this.clickWaveTimeoutId&&clearTimeout(this.clickWaveTimeoutId)}},{key:"render",value:function(){return this.props.children}}]),t}(p.Component);t.a=v},function(e,t,n){"use strict";var r=n(113),o=n(306),i=n(307),a=n(308);n.n(a);n.d(t,"Button",function(){return i.a}),n.d(t,"Group",function(){return o.a}),r.a.Button=i.a,r.a.Group=o.a,t.default=r.a},function(e,t,n){function r(e,t,n){function r(t){var n=g,r=b;return g=b=void 0,M=t,w=e.apply(r,n)}function u(e){return M=e,S=setTimeout(h,t),z?r(e):w}function p(e){var n=e-x,r=e-M,o=t-n;return k?l(o,C-r):o}function f(e){var n=e-x,r=e-M;return void 0===x||n>=t||n<0||k&&r>=C}function h(){var e=i();if(f(e))return d(e);S=setTimeout(h,p(e))}function d(e){return S=void 0,_&&g?r(e):(g=b=void 0,w)}function v(){void 0!==S&&clearTimeout(S),M=0,g=x=b=S=void 0}function m(){return void 0===S?w:d(i())}function y(){var e=i(),n=f(e);if(g=arguments,b=this,x=e,n){if(void 0===S)return u(x);if(k)return S=setTimeout(h,t),r(x)}return void 0===S&&(S=setTimeout(h,t)),w}var g,b,C,w,S,x,M=0,z=!1,k=!1,_=!0;if("function"!=typeof e)throw new TypeError(c);return t=a(t)||0,o(n)&&(z=!!n.leading,k="maxWait"in n,C=k?s(a(n.maxWait)||0,t):C,_="trailing"in n?!!n.trailing:_),y.cancel=v,y.flush=m,y}var o=n(28),i=n(309),a=n(310),c="Expected a function",s=Math.max,l=Math.min;e.exports=r},function(e,t,n){function r(e){return"symbol"==typeof e||i(e)&&o(e)==a}var o=n(48),i=n(40),a="[object Symbol]";e.exports=r},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0,t.canUseDOM=t.slidesOnLeft=t.slidesOnRight=t.siblingDirection=t.getTotalSlides=t.getPostClones=t.getPreClones=t.getTrackLeft=t.getTrackAnimateCSS=t.getTrackCSS=t.checkSpecKeys=t.getSlideCount=t.checkNavigable=t.getNavigableIndexes=t.swipeEnd=t.swipeMove=t.swipeStart=t.keyHandler=t.changeSlide=t.slideHandler=t.initializedState=t.extractObject=t.canGoNext=t.getSwipeDirection=t.getHeight=t.getWidth=t.lazySlidesOnRight=t.lazySlidesOnLeft=t.lazyEndIndex=t.lazyStartIndex=t.getRequiredLazySlides=t.getOnDemandLazySlides=void 0;var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(0),a=r(i),c=n(9),s=r(c),l=t.getOnDemandLazySlides=function(e){for(var t=[],n=u(e),r=p(e),o=n;o<r;o++)e.lazyLoadedList.indexOf(o)<0&&t.push(o);return t},u=(t.getRequiredLazySlides=function(e){for(var t=[],n=u(e),r=p(e),o=n;o<r;o++)t.push(o);return t},t.lazyStartIndex=function(e){return e.currentSlide-f(e)}),p=t.lazyEndIndex=function(e){return e.currentSlide+h(e)},f=t.lazySlidesOnLeft=function(e){return e.centerMode?Math.floor(e.slidesToShow/2)+(parseInt(e.centerPadding)>0?1:0):0},h=t.lazySlidesOnRight=function(e){return e.centerMode?Math.floor((e.slidesToShow-1)/2)+1+(parseInt(e.centerPadding)>0?1:0):e.slidesToShow},d=t.getWidth=function(e){return e&&e.offsetWidth||0},v=t.getHeight=function(e){return e&&e.offsetHeight||0},m=t.getSwipeDirection=function(e){var t,n,r,o,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return t=e.startX-e.curX,n=e.startY-e.curY,r=Math.atan2(n,t),o=Math.round(180*r/Math.PI),o<0&&(o=360-Math.abs(o)),o<=45&&o>=0||o<=360&&o>=315?"left":o>=135&&o<=225?"right":!0===i?o>=35&&o<=135?"up":"down":"vertical"},y=t.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},g=(t.extractObject=function(e,t){var n={};return t.forEach(function(t){return n[t]=e[t]}),n},t.initializedState=function(e){var t=a.default.Children.count(e.children),n=Math.ceil(d(s.default.findDOMNode(e.listRef))),r=Math.ceil(d(s.default.findDOMNode(e.trackRef))),o=void 0;if(e.vertical)o=n;else{var i=e.centerMode&&2*parseInt(e.centerPadding);"string"==typeof e.centerPadding&&"%"===e.centerPadding.slice(-1)&&(i*=n/100),o=Math.ceil((n-i)/e.slidesToShow)}var c=s.default.findDOMNode(e.listRef)&&v(s.default.findDOMNode(e.listRef).querySelector('[data-index="0"]')),u=c*e.slidesToShow,p=void 0===e.currentSlide?e.initialSlide:e.currentSlide;e.rtl&&void 0===e.currentSlide&&(p=t-1-e.initialSlide);var f=e.lazyLoadedList||[],h=l({currentSlide:p,lazyLoadedList:f},e);f.concat(h);var m={slideCount:t,slideWidth:o,listWidth:n,trackWidth:r,currentSlide:p,slideHeight:c,listHeight:u,lazyLoadedList:f};return null===e.autoplaying&&e.autoplay&&(m.autoplaying="playing"),m},t.slideHandler=function(e){var t=e.waitForAnimate,n=e.animating,r=e.fade,i=e.infinite,a=e.index,c=e.slideCount,s=e.lazyLoadedList,u=e.lazyLoad,p=e.currentSlide,f=e.centerMode,h=e.slidesToScroll,d=e.slidesToShow,v=e.useCSS;if(t&&n)return{};var m=a,g=void 0,b=void 0,C=void 0,w={},z={};if(r){if(!i&&(a<0||a>=c))return{};a<0?m=a+c:a>=c&&(m=a-c),u&&s.indexOf(m)<0&&s.push(m),w={animating:!0,currentSlide:m,lazyLoadedList:s},z={animating:!1}}else g=m,m<0?(g=m+c,i?c%h!=0&&(g=c-c%h):g=0):!y(e)&&m>p?m=g=p:f&&m>=c?(m=i?c:c-1,g=i?0:c-1):m>=c&&(g=m-c,i?c%h!=0&&(g=0):g=c-d),b=M(o({},e,{slideIndex:m})),C=M(o({},e,{slideIndex:g})),i||(b===C&&(m=g),b=C),u&&s.concat(l(o({},e,{currentSlide:m}))),v?(w={animating:!0,currentSlide:g,trackStyle:x(o({},e,{left:b})),lazyLoadedList:s},z={animating:!1,currentSlide:g,trackStyle:S(o({},e,{left:C})),swipeLeft:null}):w={currentSlide:g,trackStyle:S(o({},e,{left:C})),lazyLoadedList:s};return{state:w,nextState:z}},t.changeSlide=function(e,t){var n,r,i,a,c,s=e.slidesToScroll,l=e.slidesToShow,u=e.slideCount,p=e.currentSlide,f=e.lazyLoad,h=e.infinite;if(a=u%s!=0,n=a?0:(u-p)%s,"previous"===t.message)i=0===n?s:l-n,c=p-i,f&&!h&&(r=p-i,c=-1===r?u-1:r);else if("next"===t.message)i=0===n?s:n,c=p+i,f&&!h&&(c=(p+s)%u+n);else if("dots"===t.message){if((c=t.index*t.slidesToScroll)===t.currentSlide)return null}else if("children"===t.message){if((c=t.index)===t.currentSlide)return null;if(h){var d=O(o({},e,{targetSlide:c}));c>t.currentSlide&&"left"===d?c-=u:c<t.currentSlide&&"right"===d&&(c+=u)}}else if("index"===t.message&&(c=Number(t.index))===t.currentSlide)return null;return c},t.keyHandler=function(e,t,n){return e.target.tagName.match("TEXTAREA|INPUT|SELECT")||!t?"":37===e.keyCode?n?"next":"previous":39===e.keyCode?n?"previous":"next":""},t.swipeStart=function(e,t,n){return"IMG"===e.target.tagName&&e.preventDefault(),!t||!n&&-1!==e.type.indexOf("mouse")?"":{dragging:!0,touchObject:{startX:e.touches?e.touches[0].pageX:e.clientX,startY:e.touches?e.touches[0].pageY:e.clientY,curX:e.touches?e.touches[0].pageX:e.clientX,curY:e.touches?e.touches[0].pageY:e.clientY}}},t.swipeMove=function(e,t){var n=t.scrolling,r=t.animating,i=t.vertical,a=t.swipeToSlide,c=t.verticalSwiping,s=t.rtl,l=t.currentSlide,u=t.edgeFriction,p=t.edgeDragged,f=t.onEdge,h=t.swiped,d=t.swiping,v=t.slideCount,g=t.slidesToScroll,b=t.infinite,C=t.touchObject,w=t.swipeEvent,x=t.listHeight,z=t.listWidth;if(!n){if(r)return e.preventDefault();i&&a&&c&&e.preventDefault();var k=void 0,_={},O=M(t);C.curX=e.touches?e.touches[0].pageX:e.clientX,C.curY=e.touches?e.touches[0].pageY:e.clientY,C.swipeLength=Math.round(Math.sqrt(Math.pow(C.curX-C.startX,2)));var E=Math.round(Math.sqrt(Math.pow(C.curY-C.startY,2)));if(!c&&!d&&E>10)return{scrolling:!0};c&&(C.swipeLength=E);var T=(s?-1:1)*(C.curX>C.startX?1:-1);c&&(T=C.curY>C.startY?1:-1);var N=Math.ceil(v/g),V=m(t.touchObject,c),P=C.swipeLength;return b||(0===l&&"right"===V||l+1>=N&&"left"===V||!y(t)&&"left"===V)&&(P=C.swipeLength*u,!1===p&&f&&(f(V),_.edgeDragged=!0)),(!h&&w&&(w(V),_.swiped=!0),k=i?O+P*(x/z)*T:s?O-P*T:O+P*T,c&&(k=O+P*T),_=o({},_,{touchObject:C,swipeLeft:k,trackStyle:S(o({},t,{left:k}))}),Math.abs(C.curX-C.startX)<.8*Math.abs(C.curY-C.startY))?_:(C.swipeLength>10&&(_.swiping=!0,e.preventDefault()),_)}},t.swipeEnd=function(e,t){var n=t.dragging,r=t.swipe,i=t.touchObject,a=t.listWidth,c=t.touchThreshold,s=t.verticalSwiping,l=t.listHeight,u=t.currentSlide,p=t.swipeToSlide,f=t.scrolling,h=t.onSwipe;if(!n)return r&&e.preventDefault(),{};var d=s?l/c:a/c,v=m(i,s),y={dragging:!1,edgeDragged:!1,scrolling:!1,swiping:!1,swiped:!1,swipeLeft:null,touchObject:{}};if(f)return y;if(!i.swipeLength)return y;if(i.swipeLength>d){e.preventDefault(),h&&h(v);var g=void 0,w=void 0;switch(v){case"left":case"up":w=u+C(t),g=p?b(t,w):w,y.currentDirection=0;break;case"right":case"down":w=u-C(t),g=p?b(t,w):w,y.currentDirection=1;break;default:g=u}y.triggerSlideHandler=g}else{var S=M(t);y.trackStyle=x(o({},t,{left:S}))}return y},t.getNavigableIndexes=function(e){for(var t=e.infinite?2*e.slideCount:e.slideCount,n=e.infinite?-1*e.slidesToShow:0,r=e.infinite?-1*e.slidesToShow:0,o=[];n<t;)o.push(n),n=r+e.slidesToScroll,r+=Math.min(e.slidesToScroll,e.slidesToShow);return o}),b=t.checkNavigable=function(e,t){var n=g(e),r=0;if(t>n[n.length-1])t=n[n.length-1];else for(var o in n){if(t<n[o]){t=r;break}r=n[o]}return t},C=t.getSlideCount=function(e){var t=e.centerMode?e.slideWidth*Math.floor(e.slidesToShow/2):0;if(e.swipeToSlide){var n=void 0,r=s.default.findDOMNode(e.listRef),o=r.querySelectorAll(".slick-slide");if(Array.from(o).every(function(r){if(e.vertical){if(r.offsetTop+v(r)/2>-1*e.swipeLeft)return n=r,!1}else if(r.offsetLeft-t+d(r)/2>-1*e.swipeLeft)return n=r,!1;return!0}),!n)return 0;var i=!0===e.rtl?e.slideCount-e.currentSlide:e.currentSlide;return Math.abs(n.dataset.index-i)||1}return e.slidesToScroll},w=t.checkSpecKeys=function(e,t){return t.reduce(function(t,n){return t&&e.hasOwnProperty(n)},!0)?null:console.error("Keys Missing:",e)},S=t.getTrackCSS=function(e){w(e,["left","variableWidth","slideCount","slidesToShow","slideWidth"]);var t=void 0,n=void 0,r=e.slideCount+2*e.slidesToShow;e.vertical?n=r*e.slideHeight:t=_(e)*e.slideWidth;var i={opacity:1,transition:"",WebkitTransition:""};if(e.useTransform){var a=e.vertical?"translate3d(0px, "+e.left+"px, 0px)":"translate3d("+e.left+"px, 0px, 0px)",c=e.vertical?"translate3d(0px, "+e.left+"px, 0px)":"translate3d("+e.left+"px, 0px, 0px)",s=e.vertical?"translateY("+e.left+"px)":"translateX("+e.left+"px)";i=o({},i,{WebkitTransform:a,transform:c,msTransform:s})}else e.vertical?i.top=e.left:i.left=e.left;return e.fade&&(i={opacity:1}),t&&(i.width=t),n&&(i.height=n),window&&!window.addEventListener&&window.attachEvent&&(e.vertical?i.marginTop=e.left+"px":i.marginLeft=e.left+"px"),i},x=t.getTrackAnimateCSS=function(e){w(e,["left","variableWidth","slideCount","slidesToShow","slideWidth","speed","cssEase"]);var t=S(e);return e.useTransform?(t.WebkitTransition="-webkit-transform "+e.speed+"ms "+e.cssEase,t.transition="transform "+e.speed+"ms "+e.cssEase):e.vertical?t.transition="top "+e.speed+"ms "+e.cssEase:t.transition="left "+e.speed+"ms "+e.cssEase,t},M=t.getTrackLeft=function(e){if(e.unslick)return 0;w(e,["slideIndex","trackRef","infinite","centerMode","slideCount","slidesToShow","slidesToScroll","slideWidth","listWidth","variableWidth","slideHeight"]);var t,n,r=e.slideIndex,o=e.trackRef,i=e.infinite,a=e.centerMode,c=e.slideCount,l=e.slidesToShow,u=e.slidesToScroll,p=e.slideWidth,f=e.listWidth,h=e.variableWidth,d=e.slideHeight,v=e.fade,m=e.vertical,y=0,g=0;if(v||1===e.slideCount)return 0;var b=0;if(i?(b=-z(e),c%u!=0&&r+u>c&&(b=-(r>c?l-(r-c):c%u)),a&&(b+=parseInt(l/2))):(c%u!=0&&r+u>c&&(b=l-c%u),a&&(b=parseInt(l/2))),y=b*p,g=b*d,t=m?r*d*-1+g:r*p*-1+y,!0===h){var C,S=s.default.findDOMNode(o);if(C=r+z(e),n=S&&S.childNodes[C],t=n?-1*n.offsetLeft:0,!0===a){C=i?r+z(e):r,n=S&&S.children[C],t=0;for(var x=0;x<C;x++)t-=S&&S.children[x]&&S.children[x].offsetWidth;t-=parseInt(e.centerPadding),t+=n&&(f-n.offsetWidth)/2}}return t},z=t.getPreClones=function(e){return e.unslick||!e.infinite?0:e.variableWidth?e.slideCount:e.slidesToShow+(e.centerMode?1:0)},k=t.getPostClones=function(e){return e.unslick||!e.infinite?0:e.slideCount},_=t.getTotalSlides=function(e){return 1===e.slideCount?1:z(e)+e.slideCount+k(e)},O=t.siblingDirection=function(e){return e.targetSlide>e.currentSlide?e.targetSlide>e.currentSlide+E(e)?"left":"right":e.targetSlide<e.currentSlide-T(e)?"right":"left"},E=t.slidesOnRight=function(e){var t=e.slidesToShow,n=e.centerMode,r=e.rtl,o=e.centerPadding;if(n){var i=(t-1)/2+1;return parseInt(o)>0&&(i+=1),r&&t%2==0&&(i+=1),i}return r?0:t-1},T=t.slidesOnLeft=function(e){var t=e.slidesToShow,n=e.centerMode,r=e.rtl,o=e.centerPadding;if(n){var i=(t-1)/2+1;return parseInt(o)>0&&(i+=1),r||t%2!=0||(i+=1),i}return r?t-1:0};t.canUseDOM=function(){return!("undefined"==typeof window||!window.document||!window.document.createElement)}},function(e,t,n){"use strict";function r(e){return function(){return e}}var o=function(){};o.thatReturns=r,o.thatReturnsFalse=r(!1),o.thatReturnsTrue=r(!0),o.thatReturnsNull=r(null),o.thatReturnsThis=function(){return this},o.thatReturnsArgument=function(e){return e},e.exports=o},function(e,t,n){var r=n(49),o=r(Object,"create");e.exports=o},function(e,t,n){function r(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}var o=n(347),i=n(348),a=n(349),c=n(350),s=n(351);r.prototype.clear=o,r.prototype.delete=i,r.prototype.get=a,r.prototype.has=c,r.prototype.set=s,e.exports=r},function(e,t,n){function r(e,t){for(var n=e.length;n--;)if(o(e[n][0],t))return n;return-1}var o=n(62);e.exports=r},function(e,t,n){function r(e,t){var n=e.__data__;return o(t)?n["string"==typeof t?"string":"hash"]:n.map}var o=n(353);e.exports=r},function(e,t){function n(e,t){var n=typeof e;return!!(t=null==t?r:t)&&("number"==n||"symbol"!=n&&o.test(e))&&e>-1&&e%1==0&&e<t}var r=9007199254740991,o=/^(?:0|[1-9]\d*)$/;e.exports=n},function(e,t,n){"use strict";var r=n(190),o=n(191),i=function(e,t){var n=t.getStartKey(),i=t.getStartOffset(),a=t.getEndKey(),c=t.getEndOffset(),s=o(e,t),l=s.getBlockMap(),u=l.keySeq(),p=u.indexOf(n),f=u.indexOf(a)+1;return r(l.slice(p,f).map(function(e,t){var r=e.getText(),o=e.getCharacterList();return n===a?e.merge({text:r.slice(i,c),characterList:o.slice(i,c)}):t===n?e.merge({text:r.slice(i),characterList:o.slice(i)}):t===a?e.merge({text:r.slice(0,c),characterList:o.slice(0,c)}):e}))};e.exports=i},function(e,t,n){"use strict";function r(e,t){console.warn("WARNING: "+e+' will be deprecated soon!\nPlease use "'+t+'" instead.')}var o=n(20),i=o||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=n(195),c=n(11),s=n(10),l=c.Map,u=l(),p=0,f={getLastCreatedEntityKey:function(){return r("DraftEntity.getLastCreatedEntityKey","contentState.getLastCreatedEntityKey"),f.__getLastCreatedEntityKey()},create:function(e,t,n){return r("DraftEntity.create","contentState.createEntity"),f.__create(e,t,n)},add:function(e){return r("DraftEntity.add","contentState.addEntity"),f.__add(e)},get:function(e){return r("DraftEntity.get","contentState.getEntity"),f.__get(e)},mergeData:function(e,t){return r("DraftEntity.mergeData","contentState.mergeEntityData"),f.__mergeData(e,t)},replaceData:function(e,t){return r("DraftEntity.replaceData","contentState.replaceEntityData"),f.__replaceData(e,t)},__getLastCreatedEntityKey:function(){return""+p},__create:function(e,t,n){return f.__add(new a({type:e,mutability:t,data:n||{}}))},__add:function(e){var t=""+ ++p;return u=u.set(t,e),t},__get:function(e){var t=u.get(e);return t||s(!1),t},__mergeData:function(e,t){var n=f.__get(e),r=i({},n.getData(),t),o=n.set("data",r);return u=u.set(e,o),o},__replaceData:function(e,t){var n=f.__get(e),r=n.set("data",t);return u=u.set(e,r),r}};e.exports=f},function(e,t){function n(e){var t=-1,n=Array(e.size);return e.forEach(function(e){n[++t]=e}),n}e.exports=n},function(e,t,n){"use strict";var r={placeholder:"Select time"};t.a=r},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(578));n.n(o),n(94)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(579));n.n(o)},function(e,t,n){var r=n(237);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,o){return e.call(t,n,r,o)}}return function(){return e.apply(t,arguments)}}},function(e,t,n){var r=n(53);e.exports=function(e,t){if(!r(e))return e;var n,o;if(t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;if("function"==typeof(n=e.valueOf)&&!r(o=n.call(e)))return o;if(!t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;throw TypeError("Can't convert object to primitive value")}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t){e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}},function(e,t,n){var r=n(101)("keys"),o=n(72);e.exports=function(e){return r[e]||(r[e]=o(e))}},function(e,t,n){var r=n(19),o=n(38),i=o["__core-js_shared__"]||(o["__core-js_shared__"]={});(e.exports=function(e,t){return i[e]||(i[e]=void 0!==t?t:{})})("versions",[]).push({version:r.version,mode:n(71)?"pure":"global",copyright:"\xa9 2018 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 r=n(44),o=n(248),i=n(102),a=n(100)("IE_PROTO"),c=function(){},s=function(){var e,t=n(149)("iframe"),r=i.length;for(t.style.display="none",n(249).appendChild(t),t.src="javascript:",e=t.contentWindow.document,e.open(),e.write("<script>document.F=Object<\/script>"),e.close(),s=e.F;r--;)delete s.prototype[i[r]];return s()};e.exports=Object.create||function(e,t){var n;return null!==e?(c.prototype=r(e),n=new c,c.prototype=null,n[a]=e):n=s(),void 0===t?n:o(n,t)}},function(e,t,n){var r=n(39).f,o=n(46),i=n(27)("toStringTag");e.exports=function(e,t,n){e&&!o(e=n?e:e.prototype,i)&&r(e,i,{configurable:!0,value:t})}},function(e,t,n){n(250);for(var r=n(38),o=n(52),i=n(55),a=n(27)("toStringTag"),c="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<c.length;s++){var l=c[s],u=r[l],p=u&&u.prototype;p&&!p[a]&&o(p,a,l),i[l]=i.Array}},function(e,t,n){t.f=n(27)},function(e,t,n){var r=n(38),o=n(19),i=n(71),a=n(107),c=n(39).f;e.exports=function(e){var t=o.Symbol||(o.Symbol=i?{}:r.Symbol||{});"_"==e.charAt(0)||e in t||c(t,e,{value:a.f(e)})}},function(e,t,n){var r=n(73),o=n(60),i=n(47),a=n(96),c=n(46),s=n(148),l=Object.getOwnPropertyDescriptor;t.f=n(45)?l:function(e,t){if(e=i(e),t=a(t,!0),s)try{return l(e,t)}catch(e){}if(c(e,t))return o(!r.f.call(e,t),e[t])}},function(e,t){function n(){throw new Error("setTimeout has not been defined")}function r(){throw new Error("clearTimeout has not been defined")}function o(e){if(u===setTimeout)return setTimeout(e,0);if((u===n||!u)&&setTimeout)return u=setTimeout,setTimeout(e,0);try{return u(e,0)}catch(t){try{return u.call(null,e,0)}catch(t){return u.call(this,e,0)}}}function i(e){if(p===clearTimeout)return clearTimeout(e);if((p===r||!p)&&clearTimeout)return p=clearTimeout,clearTimeout(e);try{return p(e)}catch(t){try{return p.call(null,e)}catch(t){return p.call(this,e)}}}function a(){v&&h&&(v=!1,h.length?d=h.concat(d):m=-1,d.length&&c())}function c(){if(!v){var e=o(a);v=!0;for(var t=d.length;t;){for(h=d,d=[];++m<t;)h&&h[m].run();m=-1,t=d.length}h=null,v=!1,i(e)}}function s(e,t){this.fun=e,this.array=t}function l(){}var u,p,f=e.exports={};!function(){try{u="function"==typeof setTimeout?setTimeout:n}catch(e){u=n}try{p="function"==typeof clearTimeout?clearTimeout:r}catch(e){p=r}}();var h,d=[],v=!1,m=-1;f.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];d.push(new s(e,t)),1!==d.length||v||o(c)},s.prototype.run=function(){this.fun.apply(null,this.array)},f.title="browser",f.browser=!0,f.env={},f.argv=[],f.version="",f.versions={},f.on=l,f.addListener=l,f.once=l,f.off=l,f.removeListener=l,f.removeAllListeners=l,f.emit=l,f.prependListener=l,f.prependOnceListener=l,f.listeners=function(e){return[]},f.binding=function(e){throw new Error("process.binding is not supported")},f.cwd=function(){return"/"},f.chdir=function(e){throw new Error("process.chdir is not supported")},f.umask=function(){return 0}},function(e,t,n){"use strict";var r=n(1),o=n.n(r),i=n(144),a=n(92),c={lang:o()({placeholder:"Select date",rangePlaceholder:["Start date","End date"]},i.a),timePickerLocale:o()({},a.a)};t.a=c},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var o=n(293),i=r(o),a=n(296),c=r(a);t.default=function(){function e(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,s=(0,c.default)(e);!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&s.return&&s.return()}finally{if(o)throw i}}return n}return function(t,n){if(Array.isArray(t))return t;if((0,i.default)(Object(t)))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}()},function(e,t,n){"use strict";var r=n(8),o=n.n(r),i=n(1),a=n.n(i),c=n(2),s=n.n(c),l=n(6),u=n.n(l),p=n(3),f=n.n(p),h=n(4),d=n.n(h),v=n(0),m=(n.n(v),n(5)),y=(n.n(m),n(167)),g=n(7),b=n.n(g),C=n(23),w=n.n(C),S=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},x=function(e){function t(){s()(this,t);var e=f()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.saveCheckbox=function(t){e.rcCheckbox=t},e}return d()(t,e),u()(t,[{key:"shouldComponentUpdate",value:function(e,t,n){return!w()(this.props,e)||!w()(this.state,t)||!w()(this.context.radioGroup,n.radioGroup)}},{key:"focus",value:function(){this.rcCheckbox.focus()}},{key:"blur",value:function(){this.rcCheckbox.blur()}},{key:"render",value:function(){var e,t=this.props,n=this.context,r=t.prefixCls,i=t.className,c=t.children,s=t.style,l=S(t,["prefixCls","className","children","style"]),u=n.radioGroup,p=a()({},l);u&&(p.name=u.name,p.onChange=u.onChange,p.checked=t.value===u.value,p.disabled=t.disabled||u.disabled);var f=b()(i,(e={},o()(e,r+"-wrapper",!0),o()(e,r+"-wrapper-checked",p.checked),o()(e,r+"-wrapper-disabled",p.disabled),e));return v.createElement("label",{className:f,style:s,onMouseEnter:t.onMouseEnter,onMouseLeave:t.onMouseLeave},v.createElement(y.a,a()({},p,{prefixCls:r,ref:this.saveCheckbox})),void 0!==c?v.createElement("span",null,c):null)}}]),t}(v.Component);t.a=x,x.defaultProps={prefixCls:"ant-radio",type:"radio"},x.contextTypes={radioGroup:m.any}},function(e,t,n){function r(e,t,n){return!o(e.props,t)||!o(e.state,n)}var o=n(301),i={shouldComponentUpdate:function(e,t){return r(this,e,t)}};e.exports=i},function(e,t,n){function r(e,t){return o(e)?e:i(e,t)?[e]:a(c(e))}var o=n(33),i=n(116),a=n(333),c=n(357);e.exports=r},function(e,t,n){function r(e,t){if(o(e))return!1;var n=typeof e;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=e&&!i(e))||(c.test(e)||!a.test(e)||null!=t&&e in Object(t))}var o=n(33),i=n(81),a=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,c=/^\w*$/;e.exports=r},function(e,t,n){function r(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}var o=n(336),i=n(352),a=n(354),c=n(355),s=n(356);r.prototype.clear=o,r.prototype.delete=i,r.prototype.get=a,r.prototype.has=c,r.prototype.set=s,e.exports=r},function(e,t,n){function r(e){if(!i(e))return!1;var t=o(e);return t==c||t==s||t==a||t==l}var o=n(48),i=n(28),a="[object AsyncFunction]",c="[object Function]",s="[object GeneratorFunction]",l="[object Proxy]";e.exports=r},function(e,t,n){var r=n(49),o=n(29),i=r(o,"Map");e.exports=i},function(e,t,n){var r=n(359),o=n(40),i=Object.prototype,a=i.hasOwnProperty,c=i.propertyIsEnumerable,s=r(function(){return arguments}())?r:function(e){return o(e)&&a.call(e,"callee")&&!c.call(e,"callee")};e.exports=s},function(e,t){function n(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=r}var r=9007199254740991;e.exports=n},function(e,t,n){function r(e,t,n){var r=null==e?void 0:o(e,t);return void 0===r?n:r}var o=n(177);e.exports=r},function(e,t,n){function r(e,t,n){"__proto__"==t&&o?o(e,t,{configurable:!0,enumerable:!0,value:n,writable:!0}):e[t]=n}var o=n(180);e.exports=r},function(e,t,n){function r(e){var t=this.__data__=new o(e);this.size=t.size}var o=n(85),i=n(374),a=n(375),c=n(376),s=n(377),l=n(378);r.prototype.clear=i,r.prototype.delete=a,r.prototype.get=c,r.prototype.has=s,r.prototype.set=l,e.exports=r},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){function n(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||r)}var r=Object.prototype;e.exports=n},function(e,t,n){(function(e){var r=n(29),o=n(388),i="object"==typeof t&&t&&!t.nodeType&&t,a=i&&"object"==typeof e&&e&&!e.nodeType&&e,c=a&&a.exports===i,s=c?r.Buffer:void 0,l=s?s.isBuffer:void 0,u=l||o;e.exports=u}).call(t,n(125)(e))},function(e,t,n){var r=n(390),o=n(391),i=n(392),a=i&&i.isTypedArray,c=a?o(a):r;e.exports=c},function(e,t){function n(e){return e}e.exports=n},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(65),c=n(24),s=n(50),l=n(26),u=n(90),p=n(42),f=n(11),h=n(57),d=n(36),v=n(131),m=f.List,y=f.Record,g=f.Repeat,b=p.draft_tree_data_support,C={entityMap:null,blockMap:null,selectionBefore:null,selectionAfter:null},w=b?l:s,S=y(C),x=function(e){function t(){return r(this,t),o(this,e.apply(this,arguments))}return i(t,e),t.prototype.getEntityMap=function(){return u},t.prototype.getBlockMap=function(){return this.get("blockMap")},t.prototype.getSelectionBefore=function(){return this.get("selectionBefore")},t.prototype.getSelectionAfter=function(){return this.get("selectionAfter")},t.prototype.getBlockForKey=function(e){return this.getBlockMap().get(e)},t.prototype.getKeyBefore=function(e){return this.getBlockMap().reverse().keySeq().skipUntil(function(t){return t===e}).skip(1).first()},t.prototype.getKeyAfter=function(e){return this.getBlockMap().keySeq().skipUntil(function(t){return t===e}).skip(1).first()},t.prototype.getBlockAfter=function(e){return this.getBlockMap().skipUntil(function(t,n){return n===e}).skip(1).first()},t.prototype.getBlockBefore=function(e){return this.getBlockMap().reverse().skipUntil(function(t,n){return n===e}).skip(1).first()},t.prototype.getBlocksAsArray=function(){return this.getBlockMap().toArray()},t.prototype.getFirstBlock=function(){return this.getBlockMap().first()},t.prototype.getLastBlock=function(){return this.getBlockMap().last()},t.prototype.getPlainText=function(e){return this.getBlockMap().map(function(e){return e?e.getText():""}).join(e||"\n")},t.prototype.getLastCreatedEntityKey=function(){return u.__getLastCreatedEntityKey()},t.prototype.hasText=function(){var e=this.getBlockMap();return e.size>1||e.first().getLength()>0},t.prototype.createEntity=function(e,t,n){return u.__create(e,t,n),this},t.prototype.mergeEntityData=function(e,t){return u.__mergeData(e,t),this},t.prototype.replaceEntityData=function(e,t){return u.__replaceData(e,t),this},t.prototype.addEntity=function(e){return u.__add(e),this},t.prototype.getEntity=function(e){return u.__get(e)},t.createFromBlockArray=function(e,n){var r=Array.isArray(e)?e:e.contentBlocks,o=a.createFromArray(r),i=o.isEmpty()?new h:h.createEmpty(o.first().getKey());return new t({blockMap:o,entityMap:n||u,selectionBefore:i,selectionAfter:i})},t.createFromText=function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:/\r\n?|\n/g,r=e.split(n),o=r.map(function(e){return e=v(e),new w({key:d(),text:e,type:"unstyled",characterList:m(g(c.EMPTY,e.length))})});return t.createFromBlockArray(o)},t}(S);e.exports=x},function(e,t,n){"use strict";function r(e){return e.replace(o,"")}var o=new RegExp("\r","g");e.exports=r},function(e,t,n){"use strict";function r(e){return e===u||e===p}function o(e){return r(e)||l(!1),e===u?"ltr":"rtl"}function i(e,t){return r(e)||l(!1),r(t)||l(!1),e===t?null:o(e)}function a(e){f=e}function c(){a(u)}function s(){return f||this.initGlobalDir(),f||l(!1),f}var l=n(10),u="LTR",p="RTL",f=null,h={NEUTRAL:"NEUTRAL",LTR:u,RTL:p,isStrong:r,getHTMLDir:o,getHTMLDirIfDifferent:i,setGlobalDir:a,initGlobalDir:c,getGlobalDir:s};e.exports=h},function(e,t,n){"use strict";var r=n(11),o=r.Map,i=n(0),a=n(58),c=i.createElement("ul",{className:a("public/DraftStyleDefault/ul")}),s=i.createElement("ol",{className:a("public/DraftStyleDefault/ol")}),l=i.createElement("pre",{className:a("public/DraftStyleDefault/pre")}),u=o({"header-one":{element:"h1"},"header-two":{element:"h2"},"header-three":{element:"h3"},"header-four":{element:"h4"},"header-five":{element:"h5"},"header-six":{element:"h6"},"unordered-list-item":{element:"li",wrapper:c},"ordered-list-item":{element:"li",wrapper:s},blockquote:{element:"blockquote"},atomic:{element:"figure"},"code-block":{element:"pre",wrapper:l},unstyled:{element:"div",aliasedElements:["p"]}});e.exports=u},function(e,t,n){"use strict";e.exports={BACKSPACE:8,TAB:9,RETURN:13,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46,COMMA:188,PERIOD:190,A:65,Z:90,ZERO:48,NUMPAD_0:96,NUMPAD_9:105}},function(e,t,n){"use strict";function r(e,t){var n;if(t.isCollapsed()){var r=t.getAnchorKey(),i=t.getAnchorOffset();return i>0?(n=e.getBlockForKey(r).getEntityAt(i-1),n!==e.getBlockForKey(r).getEntityAt(i)?null:o(e.getEntityMap(),n)):null}var a=t.getStartKey(),c=t.getStartOffset(),s=e.getBlockForKey(a);return n=c===s.getLength()?null:s.getEntityAt(c),o(e.getEntityMap(),n)}function o(e,t){if(t){return"MUTABLE"===e.__get(t).getMutability()?t:null}return null}e.exports=r},function(e,t,n){"use strict";function r(e,t){return!(!e||!t)&&(e===t||!o(e)&&(o(t)?r(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}var o=n(449);e.exports=r},function(e,t,n){"use strict";function r(e,t){var n=i.get(e,t);return"auto"===n||"scroll"===n}var o=n(451),i={get:o,getScrollParent:function(e){if(!e)return null;for(var t=e.ownerDocument;e&&e!==t.body;){if(r(e,"overflow")||r(e,"overflowY")||r(e,"overflowX"))return e;e=e.parentNode}return t.defaultView||t.parentWindow}};e.exports=i},function(e,t,n){"use strict";function r(e){var t=o(e.ownerDocument||e.document);e.Window&&e instanceof e.Window&&(e=t);var n=i(e),r=e===t?e.ownerDocument.documentElement:e,a=e.scrollWidth-r.clientWidth,c=e.scrollHeight-r.clientHeight;return n.x=Math.max(0,Math.min(n.x,a)),n.y=Math.max(0,Math.min(n.y,c)),n}var o=n(456),i=n(457);e.exports=r},function(e,t,n){"use strict";function r(e){for(var t=e;t&&t!==document.documentElement;){var n=o(t);if(null!=n)return n;t=t.parentNode}return null}var o=n(203);e.exports=r},function(e,t,n){(function(e,t){!function(e,n){"use strict";function r(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n<t.length;n++)t[n]=arguments[n+1];var r={callback:e,args:t};return l[s]=r,c(s),s++}function o(e){delete l[e]}function i(e){var t=e.callback,r=e.args;switch(r.length){case 0:t();break;case 1:t(r[0]);break;case 2:t(r[0],r[1]);break;case 3:t(r[0],r[1],r[2]);break;default:t.apply(n,r)}}function a(e){if(u)setTimeout(a,0,e);else{var t=l[e];if(t){u=!0;try{i(t)}finally{o(e),u=!1}}}}if(!e.setImmediate){var c,s=1,l={},u=!1,p=e.document,f=Object.getPrototypeOf&&Object.getPrototypeOf(e);f=f&&f.setTimeout?f:e,"[object process]"==={}.toString.call(e.process)?function(){c=function(e){t.nextTick(function(){a(e)})}}():function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?function(){var t="setImmediate$"+Math.random()+"$",n=function(n){n.source===e&&"string"==typeof n.data&&0===n.data.indexOf(t)&&a(+n.data.slice(t.length))};e.addEventListener?e.addEventListener("message",n,!1):e.attachEvent("onmessage",n),c=function(n){e.postMessage(t+n,"*")}}():e.MessageChannel?function(){var e=new MessageChannel;e.port1.onmessage=function(e){a(e.data)},c=function(t){e.port2.postMessage(t)}}():p&&"onreadystatechange"in p.createElement("script")?function(){var e=p.documentElement;c=function(t){var n=p.createElement("script");n.onreadystatechange=function(){a(t),n.onreadystatechange=null,e.removeChild(n),n=null},e.appendChild(n)}}():function(){c=function(e){setTimeout(a,0,e)}}(),f.setImmediate=r,f.clearImmediate=o}}("undefined"==typeof self?void 0===e?this:e:self)}).call(t,n(18),n(110))},function(e,t,n){"use strict";var r=n(34),o=r.isPlatform("Mac OS X"),i={isCtrlKeyCommand:function(e){return!!e.ctrlKey&&!e.altKey},isOptionKeyCommand:function(e){return o&&e.altKey},hasCommandModifier:function(e){return o?!!e.metaKey&&!e.altKey:i.isCtrlKeyCommand(e)}};e.exports=i},function(e,t,n){"use strict";function r(e,t){var n=e.getSelection(),r=e.getCurrentContent(),o=n.getStartKey(),i=n.getStartOffset(),a=o,c=0;if(t>i){var s=r.getKeyBefore(o);if(null==s)a=o;else{a=s;c=r.getBlockForKey(s).getText().length}}else c=i-t;return n.merge({focusKey:a,focusOffset:c,isBackward:!0})}e.exports=r},function(e,t,n){function r(e){return a(e)?o(e):i(e)}var o=n(189),i=n(524),a=n(64);e.exports=r},function(e,t,n){"use strict";t.a={today:"Today",now:"Now",backToToday:"Back to today",ok:"Ok",clear:"Clear",month:"Month",year:"Year",timeSelect:"select time",dateSelect:"select date",weekSelect:"Choose a week",monthSelect:"Choose a month",yearSelect:"Choose a year",decadeSelect:"Choose a decade",yearFormat:"YYYY",dateFormat:"M/D/YYYY",dayFormat:"D",dateTimeFormat:"M/D/YYYY HH:mm:ss",monthBeforeYear:!0,previousMonth:"Previous month (PageUp)",nextMonth:"Next month (PageDown)",previousYear:"Last year (Control + left)",nextYear:"Next year (Control + right)",previousDecade:"Last decade",nextDecade:"Next decade",previousCentury:"Last century",nextCentury:"Next century"}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(577));n.n(o),n(93)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(598));n.n(o)},function(e,t,n){e.exports={default:n(235),__esModule:!0}},function(e,t,n){e.exports=!n(45)&&!n(54)(function(){return 7!=Object.defineProperty(n(149)("div"),"a",{get:function(){return 7}}).a})},function(e,t,n){var r=n(53),o=n(38).document,i=r(o)&&r(o.createElement);e.exports=function(e){return i?o.createElement(e):{}}},function(e,t,n){var r=n(46),o=n(47),i=n(242)(!1),a=n(100)("IE_PROTO");e.exports=function(e,t){var n,c=o(e),s=0,l=[];for(n in c)n!=a&&r(c,n)&&l.push(n);for(;t.length>s;)r(c,n=t[s++])&&(~i(l,n)||l.push(n));return l}},function(e,t,n){var r=n(97);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==r(e)?e.split(""):Object(e)}},function(e,t,n){var r=n(99),o=Math.min;e.exports=function(e){return e>0?o(r(e),9007199254740991):0}},function(e,t,n){"use strict";var r=n(71),o=n(37),i=n(154),a=n(52),c=n(55),s=n(247),l=n(105),u=n(155),p=n(27)("iterator"),f=!([].keys&&"next"in[].keys()),h=function(){return this};e.exports=function(e,t,n,d,v,m,y){s(n,t,d);var g,b,C,w=function(e){if(!f&&e in z)return z[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},S=t+" Iterator",x="values"==v,M=!1,z=e.prototype,k=z[p]||z["@@iterator"]||v&&z[v],_=k||w(v),O=v?x?w("entries"):_:void 0,E="Array"==t?z.entries||k:k;if(E&&(C=u(E.call(new e)))!==Object.prototype&&C.next&&(l(C,S,!0),r||"function"==typeof C[p]||a(C,p,h)),x&&k&&"values"!==k.name&&(M=!0,_=function(){return k.call(this)}),r&&!y||!f&&!M&&z[p]||a(z,p,_),c[t]=_,c[S]=h,v)if(g={values:x?_:w("values"),keys:m?_:w("keys"),entries:O},y)for(b in g)b in z||i(z,b,g[b]);else o(o.P+o.F*(f||M),t,g);return g}},function(e,t,n){e.exports=n(52)},function(e,t,n){var r=n(46),o=n(74),i=n(100)("IE_PROTO"),a=Object.prototype;e.exports=Object.getPrototypeOf||function(e){return e=o(e),r(e,i)?e[i]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?a:null}},function(e,t,n){var r=n(150),o=n(102).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,o)}},function(e,t,n){e.exports={default:n(275),__esModule:!0}},function(e,t,n){var r=n(159),o=n(27)("iterator"),i=n(55);e.exports=n(19).getIteratorMethod=function(e){if(void 0!=e)return e[o]||e["@@iterator"]||i[r(e)]}},function(e,t,n){var r=n(97),o=n(27)("toStringTag"),i="Arguments"==r(function(){return arguments}()),a=function(e,t){try{return e[t]}catch(e){}};e.exports=function(e){var t,n,c;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=a(t=Object(e),o))?n:i?r(t):"Object"==(c=r(t))&&"function"==typeof t.callee?"Arguments":c}},function(e,t,n){"use strict";function r(e,t,n){e.addEventListener(t,n,!1)}function o(e,t,n){e.removeEventListener(t,n,!1)}var i={transitionend:{transition:"transitionend",WebkitTransition:"webkitTransitionEnd",MozTransition:"mozTransitionEnd",OTransition:"oTransitionEnd",msTransition:"MSTransitionEnd"},animationend:{animation:"animationend",WebkitAnimation:"webkitAnimationEnd",MozAnimation:"mozAnimationEnd",OAnimation:"oAnimationEnd",msAnimation:"MSAnimationEnd"}},a=[];"undefined"!=typeof window&&"undefined"!=typeof document&&function(){var e=document.createElement("div"),t=e.style;"AnimationEvent"in window||delete i.animationend.animation,"TransitionEvent"in window||delete i.transitionend.transition;for(var n in i)if(i.hasOwnProperty(n)){var r=i[n];for(var o in r)if(o in t){a.push(r[o]);break}}}();var c={addEndEventListener:function(e,t){if(0===a.length)return void window.setTimeout(t,0);a.forEach(function(n){r(e,n,t)})},endEvents:a,removeEndEventListener:function(e,t){0!==a.length&&a.forEach(function(n){o(e,n,t)})}};t.a=c},function(e,t){e.exports=function(e,t){if(e.indexOf)return e.indexOf(t);for(var n=0;n<e.length;++n)if(e[n]===t)return n;return-1}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.storeShape=void 0;var r=n(5),o=function(e){return e&&e.__esModule?e:{default:e}}(r);t.storeShape=o.default.shape({subscribe:o.default.func.isRequired,setState:o.default.func.isRequired,getState:o.default.func.isRequired})},function(e,t,n){"use strict";function r(e,t,n){if("string"!=typeof t){if(p){var f=u(t);f&&f!==p&&r(e,f,n)}var h=c(t);s&&(h=h.concat(s(t)));for(var d=0;d<h.length;++d){var v=h[d];if(!(o[v]||i[v]||n&&n[v])){var m=l(t,v);try{a(e,v,m)}catch(e){}}}return e}return e}var o={childContextTypes:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},i={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},a=Object.defineProperty,c=Object.getOwnPropertyNames,s=Object.getOwnPropertySymbols,l=Object.getOwnPropertyDescriptor,u=Object.getPrototypeOf,p=u&&u(Object);e.exports=r},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){function n(e){return parseFloat(e)||0}function r(e){for(var t=[],r=arguments.length-1;r-- >0;)t[r]=arguments[r+1];return t.reduce(function(t,r){return t+n(e["border-"+r+"-width"])},0)}function o(e){for(var t=["top","right","bottom","left"],r={},o=0,i=t;o<i.length;o+=1){var a=i[o],c=e["padding-"+a];r[a]=n(c)}return r}function i(e){var t=e.getBBox();return u(0,0,t.width,t.height)}function a(e){var t=e.clientWidth,i=e.clientHeight;if(!t&&!i)return S;var a=w(e).getComputedStyle(e),s=o(a),l=s.left+s.right,p=s.top+s.bottom,f=n(a.width),h=n(a.height);if("border-box"===a.boxSizing&&(Math.round(f+l)!==t&&(f-=r(a,"left","right")+l),Math.round(h+p)!==i&&(h-=r(a,"top","bottom")+p)),!c(e)){var d=Math.round(f+l)-t,v=Math.round(h+p)-i;1!==Math.abs(d)&&(f-=d),1!==Math.abs(v)&&(h-=v)}return u(s.left,s.top,f,h)}function c(e){return e===w(e).document.documentElement}function s(e){return f?x(e)?i(e):a(e):S}function l(e){var t=e.x,n=e.y,r=e.width,o=e.height,i="undefined"!=typeof DOMRectReadOnly?DOMRectReadOnly:Object,a=Object.create(i.prototype);return C(a,{x:t,y:n,width:r,height:o,top:n,right:t+r,bottom:o+n,left:t}),a}function u(e,t,n,r){return{x:e,y:t,width:n,height:r}}var p=function(){function e(e,t){var n=-1;return e.some(function(e,r){return e[0]===t&&(n=r,!0)}),n}return"undefined"!=typeof Map?Map:function(){function t(){this.__entries__=[]}var n={size:{configurable:!0}};return n.size.get=function(){return this.__entries__.length},t.prototype.get=function(t){var n=e(this.__entries__,t),r=this.__entries__[n];return r&&r[1]},t.prototype.set=function(t,n){var r=e(this.__entries__,t);~r?this.__entries__[r][1]=n:this.__entries__.push([t,n])},t.prototype.delete=function(t){var n=this.__entries__,r=e(n,t);~r&&n.splice(r,1)},t.prototype.has=function(t){return!!~e(this.__entries__,t)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(e,t){var n=this;void 0===t&&(t=null);for(var r=0,o=n.__entries__;r<o.length;r+=1){var i=o[r];e.call(t,i[1],i[0])}},Object.defineProperties(t.prototype,n),t}()}(),f="undefined"!=typeof window&&"undefined"!=typeof document&&window.document===document,h=function(){return void 0!==e&&e.Math===Math?e:"undefined"!=typeof self&&self.Math===Math?self:"undefined"!=typeof window&&window.Math===Math?window:Function("return this")()}(),d=function(){return"function"==typeof requestAnimationFrame?requestAnimationFrame.bind(h):function(e){return setTimeout(function(){return e(Date.now())},1e3/60)}}(),v=2,m=function(e,t){function n(){i&&(i=!1,e()),a&&o()}function r(){d(n)}function o(){var e=Date.now();if(i){if(e-c<v)return;a=!0}else i=!0,a=!1,setTimeout(r,t);c=e}var i=!1,a=!1,c=0;return o},y=["top","right","bottom","left","width","height","size","weight"],g="undefined"!=typeof MutationObserver,b=function(){this.connected_=!1,this.mutationEventsAdded_=!1,this.mutationsObserver_=null,this.observers_=[],this.onTransitionEnd_=this.onTransitionEnd_.bind(this),this.refresh=m(this.refresh.bind(this),20)};b.prototype.addObserver=function(e){~this.observers_.indexOf(e)||this.observers_.push(e),this.connected_||this.connect_()},b.prototype.removeObserver=function(e){var t=this.observers_,n=t.indexOf(e);~n&&t.splice(n,1),!t.length&&this.connected_&&this.disconnect_()},b.prototype.refresh=function(){this.updateObservers_()&&this.refresh()},b.prototype.updateObservers_=function(){var e=this.observers_.filter(function(e){return e.gatherActive(),e.hasActive()});return e.forEach(function(e){return e.broadcastActive()}),e.length>0},b.prototype.connect_=function(){f&&!this.connected_&&(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),g?(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)},b.prototype.disconnect_=function(){f&&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)},b.prototype.onTransitionEnd_=function(e){var t=e.propertyName;void 0===t&&(t=""),y.some(function(e){return!!~t.indexOf(e)})&&this.refresh()},b.getInstance=function(){return this.instance_||(this.instance_=new b),this.instance_},b.instance_=null;var C=function(e,t){for(var n=0,r=Object.keys(t);n<r.length;n+=1){var o=r[n];Object.defineProperty(e,o,{value:t[o],enumerable:!1,writable:!1,configurable:!0})}return e},w=function(e){return e&&e.ownerDocument&&e.ownerDocument.defaultView||h},S=u(0,0,0,0),x=function(){return"undefined"!=typeof SVGGraphicsElement?function(e){return e instanceof w(e).SVGGraphicsElement}:function(e){return e instanceof w(e).SVGElement&&"function"==typeof e.getBBox}}(),M=function(e){this.broadcastWidth=0,this.broadcastHeight=0,this.contentRect_=u(0,0,0,0),this.target=e};M.prototype.isActive=function(){var e=s(this.target);return this.contentRect_=e,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 z=function(e,t){var n=l(t);C(this,{target:e,contentRect:n})},k=function(e,t,n){if(this.activeObservations_=[],this.observations_=new p,"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};k.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 w(e).Element))throw new TypeError('parameter 1 is not of type "Element".');var t=this.observations_;t.has(e)||(t.set(e,new M(e)),this.controller_.addObserver(this),this.controller_.refresh())}},k.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 w(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))}},k.prototype.disconnect=function(){this.clearActive(),this.observations_.clear(),this.controller_.removeObserver(this)},k.prototype.gatherActive=function(){var e=this;this.clearActive(),this.observations_.forEach(function(t){t.isActive()&&e.activeObservations_.push(t)})},k.prototype.broadcastActive=function(){if(this.hasActive()){var e=this.callbackCtx_,t=this.activeObservations_.map(function(e){return new z(e.target,e.broadcastRect())});this.callback_.call(e,t,e),this.clearActive()}},k.prototype.clearActive=function(){this.activeObservations_.splice(0)},k.prototype.hasActive=function(){return this.activeObservations_.length>0};var _="undefined"!=typeof WeakMap?new WeakMap:new p,O=function(e){if(!(this instanceof O))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var t=b.getInstance(),n=new k(e,t,this);_.set(this,n)};["observe","unobserve","disconnect"].forEach(function(e){O.prototype[e]=function(){return(t=_.get(this))[e].apply(t,arguments);var t}});var E=function(){return void 0!==h.ResizeObserver?h.ResizeObserver:O}();t.default=E}.call(t,n(18))},function(e,t,n){"use strict";t.a={items_per_page:"/ page",jump_to:"Goto",jump_to_confirm:"confirm",page:"",prev_page:"Previous Page",next_page:"Next Page",prev_5:"Previous 5 Pages",next_5:"Next 5 Pages",prev_3:"Previous 3 Pages",next_3:"Next 3 Pages"}},function(e,t,n){"use strict";var r=n(111);t.a=r.a},function(e,t,n){"use strict";var r=n(1),o=n.n(r),i=n(14),a=n.n(i),c=n(2),s=n.n(c),l=n(3),u=n.n(l),p=n(4),f=n.n(p),h=n(0),d=n.n(h),v=n(5),m=n.n(v),y=n(114),g=n.n(y),b=n(7),C=n.n(b),w=function(e){function t(n){s()(this,t);var r=u()(this,e.call(this,n));S.call(r);var o="checked"in n?n.checked:n.defaultChecked;return r.state={checked:o},r}return f()(t,e),t.prototype.componentWillReceiveProps=function(e){"checked"in e&&this.setState({checked:e.checked})},t.prototype.shouldComponentUpdate=function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return g.a.shouldComponentUpdate.apply(this,t)},t.prototype.focus=function(){this.input.focus()},t.prototype.blur=function(){this.input.blur()},t.prototype.render=function(){var e,t=this.props,n=t.prefixCls,r=t.className,i=t.style,c=t.name,s=t.id,l=t.type,u=t.disabled,p=t.readOnly,f=t.tabIndex,h=t.onClick,v=t.onFocus,m=t.onBlur,y=t.autoFocus,g=t.value,b=a()(t,["prefixCls","className","style","name","id","type","disabled","readOnly","tabIndex","onClick","onFocus","onBlur","autoFocus","value"]),w=Object.keys(b).reduce(function(e,t){return"aria-"!==t.substr(0,5)&&"data-"!==t.substr(0,5)&&"role"!==t||(e[t]=b[t]),e},{}),S=this.state.checked,x=C()(n,r,(e={},e[n+"-checked"]=S,e[n+"-disabled"]=u,e));return d.a.createElement("span",{className:x,style:i},d.a.createElement("input",o()({name:c,id:s,type:l,readOnly:p,disabled:u,tabIndex:f,className:n+"-input",checked:!!S,onClick:h,onFocus:v,onBlur:m,onChange:this.handleChange,autoFocus:y,ref:this.saveInput,value:g},w)),d.a.createElement("span",{className:n+"-inner"}))},t}(d.a.Component);w.propTypes={prefixCls:m.a.string,className:m.a.string,style:m.a.object,name:m.a.string,id:m.a.string,type:m.a.string,defaultChecked:m.a.oneOfType([m.a.number,m.a.bool]),checked:m.a.oneOfType([m.a.number,m.a.bool]),disabled:m.a.bool,onFocus:m.a.func,onBlur:m.a.func,onChange:m.a.func,onClick:m.a.func,tabIndex:m.a.string,readOnly:m.a.bool,autoFocus:m.a.bool,value:m.a.any},w.defaultProps={prefixCls:"rc-checkbox",className:"",style:{},type:"checkbox",defaultChecked:!1,onFocus:function(){},onBlur:function(){},onChange:function(){}};var S=function(){var e=this;this.handleChange=function(t){var n=e.props;n.disabled||("checked"in n||e.setState({checked:t.target.checked}),n.onChange({target:o()({},n,{checked:t.target.checked}),stopPropagation:function(){t.stopPropagation()},preventDefault:function(){t.preventDefault()},nativeEvent:t.nativeEvent}))},this.saveInput=function(t){e.input=t}},x=w;t.a=x},function(e,t,n){(function(t){var n="object"==typeof t&&t&&t.Object===Object&&t;e.exports=n}).call(t,n(18))},function(e,t,n){var r=n(313);e.exports=new r},function(e,t){function n(e,t){var n=0,r=e.length;for(n;n<r&&!1!==t(e[n],n);n++);}function r(e){return"[object Array]"===Object.prototype.toString.apply(e)}function o(e){return"function"==typeof e}e.exports={isFunction:o,isArray:r,each:n}},function(e,t,n){(function(t){function n(e,t,n){function o(t){var n=v,r=m;return v=m=void 0,M=t,g=e.apply(r,n)}function i(e){return M=e,b=setTimeout(u,t),z?o(e):g}function s(e){var n=e-x,r=e-M,o=t-n;return k?w(o,y-r):o}function l(e){var n=e-x,r=e-M;return void 0===x||n>=t||n<0||k&&r>=y}function u(){var e=S();if(l(e))return p(e);b=setTimeout(u,s(e))}function p(e){return b=void 0,_&&v?o(e):(v=m=void 0,g)}function f(){void 0!==b&&clearTimeout(b),M=0,v=x=m=b=void 0}function h(){return void 0===b?g:p(S())}function d(){var e=S(),n=l(e);if(v=arguments,m=this,x=e,n){if(void 0===b)return i(x);if(k)return b=setTimeout(u,t),o(x)}return void 0===b&&(b=setTimeout(u,t)),g}var v,m,y,g,b,x,M=0,z=!1,k=!1,_=!0;if("function"!=typeof e)throw new TypeError(c);return t=a(t)||0,r(n)&&(z=!!n.leading,k="maxWait"in n,y=k?C(a(n.maxWait)||0,t):y,_="trailing"in n?!!n.trailing:_),d.cancel=f,d.flush=h,d}function r(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function o(e){return!!e&&"object"==typeof e}function i(e){return"symbol"==typeof e||o(e)&&b.call(e)==l}function a(e){if("number"==typeof e)return e;if(i(e))return s;if(r(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=r(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(u,"");var n=f.test(e);return n||h.test(e)?d(e.slice(2),n?2:8):p.test(e)?s:+e}var c="Expected a function",s=NaN,l="[object Symbol]",u=/^\s+|\s+$/g,p=/^[-+]0x[0-9a-f]+$/i,f=/^0b[01]+$/i,h=/^0o[0-7]+$/i,d=parseInt,v="object"==typeof t&&t&&t.Object===Object&&t,m="object"==typeof self&&self&&self.Object===Object&&self,y=v||m||Function("return this")(),g=Object.prototype,b=g.toString,C=Math.max,w=Math.min,S=function(){return y.Date.now()};e.exports=n}).call(t,n(18))},function(e,t){function n(e,t,n){n=n||{},n.childrenKeyName=n.childrenKeyName||"children";var r,o=e||[],i=[],a=0;do{var r=o.filter(function(e){return t(e,a)})[0];if(!r)break;i.push(r),o=r[n.childrenKeyName]||[],a+=1}while(o.length>0);return i}e.exports=n},function(e,t,n){"use strict";var r=n(83),o=r;e.exports=o},function(e,t,n){function r(e,t,n){t=o(t,e);for(var r=-1,u=t.length,p=!1;++r<u;){var f=l(t[r]);if(!(p=null!=e&&n(e,f)))break;e=e[f]}return p||++r!=u?p:!!(u=null==e?0:e.length)&&s(u)&&c(f,u)&&(a(e)||i(e))}var o=n(115),i=n(120),a=n(33),c=n(88),s=n(121),l=n(63);e.exports=r},function(e,t){function n(e){if(null!=e){try{return o.call(e)}catch(e){}try{return e+""}catch(e){}}return""}var r=Function.prototype,o=r.toString;e.exports=n},function(e,t){function n(e,t){for(var n=-1,r=null==e?0:e.length,o=Array(r);++n<r;)o[n]=t(e[n],n,e);return o}e.exports=n},function(e,t,n){function r(e,t){t=o(t,e);for(var n=0,r=t.length;null!=e&&n<r;)e=e[i(t[n++])];return n&&n==r?e:void 0}var o=n(115),i=n(63);e.exports=r},function(e,t,n){function r(e,t,n){return null==e?e:o(e,t,n)}var o=n(360);e.exports=r},function(e,t,n){function r(e,t,n){var r=e[t];c.call(e,t)&&i(r,n)&&(void 0!==n||t in e)||o(e,t,n)}var o=n(123),i=n(62),a=Object.prototype,c=a.hasOwnProperty;e.exports=r},function(e,t,n){var r=n(49),o=function(){try{var e=r(Object,"defineProperty");return e({},"",{}),e}catch(e){}}();e.exports=o},function(e,t,n){var r=n(37),o=n(19),i=n(54);e.exports=function(e,t){var n=(o.Object||{})[e]||Object[e],a={};a[e]=t(n),r(r.S+r.F*i(function(){n(1)}),"Object",a)}},function(e,t,n){function r(e,t,n){(void 0===n||i(e[t],n))&&(void 0!==n||t in e)||o(e,t,n)}var o=n(123),i=n(62);e.exports=r},function(e,t,n){var r=n(29),o=r.Uint8Array;e.exports=o},function(e,t){function n(e,t){var n=-1,r=e.length;for(t||(t=Array(r));++n<r;)t[n]=e[n];return t}e.exports=n},function(e,t,n){var r=n(186),o=r(Object.getPrototypeOf,Object);e.exports=o},function(e,t){function n(e,t){return function(n){return e(t(n))}}e.exports=n},function(e,t){function n(e,t){if("__proto__"!=t)return e[t]}e.exports=n},function(e,t,n){function r(e){return a(e)?o(e,!0):i(e)}var o=n(189),i=n(396),a=n(64);e.exports=r},function(e,t,n){function r(e,t){var n=a(e),r=!n&&i(e),u=!n&&!r&&c(e),f=!n&&!r&&!u&&l(e),h=n||r||u||f,d=h?o(e.length,String):[],v=d.length;for(var m in e)!t&&!p.call(e,m)||h&&("length"==m||u&&("offset"==m||"parent"==m)||f&&("buffer"==m||"byteLength"==m||"byteOffset"==m)||s(m,v))||d.push(m);return d}var o=n(395),i=n(120),a=n(33),c=n(127),s=n(88),l=n(128),u=Object.prototype,p=u.hasOwnProperty;e.exports=r},function(e,t,n){"use strict";var r=n(26),o=n(11),i=n(36),a=o.OrderedMap,c=function(e){var t={},n=void 0;return a(e.withMutations(function(e){e.forEach(function(r,o){var a=r.getKey(),c=r.getNextSiblingKey(),s=r.getPrevSiblingKey(),l=r.getChildKeys(),u=r.getParentKey(),p=i();if(t[a]=p,c){e.get(c)?e.setIn([c,"prevSibling"],p):e.setIn([a,"nextSibling"],null)}if(s){e.get(s)?e.setIn([s,"nextSibling"],p):e.setIn([a,"prevSibling"],null)}if(u&&e.get(u)){var f=e.get(u),h=f.getChildKeys();e.setIn([u,"children"],h.set(h.indexOf(r.getKey()),p))}else e.setIn([a,"parent"],null),n&&(e.setIn([n.getKey(),"nextSibling"],p),e.setIn([a,"prevSibling"],t[n.getKey()])),n=e.get(a);l.forEach(function(t){e.get(t)?e.setIn([t,"parent"],p):e.setIn([a,"children"],r.getChildKeys().filter(function(e){return e!==t}))})})}).toArray().map(function(e){return[t[e.getKey()],e.set("key",t[e.getKey()])]}))},s=function(e){return a(e.toArray().map(function(e){var t=i();return[t,e.set("key",t)]}))},l=function(e){return e.first()instanceof r?c(e):s(e)};e.exports=l},function(e,t,n){"use strict";function r(e,t){var n=e.getBlockMap(),r=e.getEntityMap(),o={},a=t.getStartKey(),c=t.getStartOffset(),s=n.get(a),l=i(r,s,c);l!==s&&(o[a]=l);var u=t.getEndKey(),p=t.getEndOffset(),f=n.get(u);a===u&&(f=l);var h=i(r,f,p);return h!==f&&(o[u]=h),Object.keys(o).length?e.merge({blockMap:n.merge(o),selectionAfter:t}):e.set("selectionAfter",t)}function o(e,t,n){var r;return c(e,function(e,t){return e.getEntity()===t.getEntity()},function(e){return e.getEntity()===t},function(e,t){e<=n&&t>=n&&(r={start:e,end:t})}),"object"!=typeof r&&s(!1),r}function i(e,t,n){var r=t.getCharacterList(),i=n>0?r.get(n-1):void 0,c=n<r.count()?r.get(n):void 0,s=i?i.getEntity():void 0,l=c?c.getEntity():void 0;if(l&&l===s){if("MUTABLE"!==e.__get(l).getMutability()){for(var u,p=o(r,l,n),f=p.start,h=p.end;f<h;)u=r.get(f),r=r.set(f,a.applyEntity(u,null)),f++;return t.set("characterList",r)}}return t}var a=n(24),c=n(66),s=n(10);e.exports=r},function(e,t,n){"use strict";function r(e,t,n){if(n===e.count())t.forEach(function(t){e=e.push(t)});else if(0===n)t.reverse().forEach(function(t){e=e.unshift(t)});else{var r=e.slice(0,n),o=e.slice(n);e=r.concat(t,o).toList()}return e}e.exports=r},function(e,t,n){"use strict";var r=n(26),o=function(e,t){if(!(e instanceof r))return null;var n=e.getNextSiblingKey();if(n)return n;var o=e.getParentKey();if(!o)return null;for(var i=t.get(o);i&&!i.getNextSiblingKey();){var a=i.getParentKey();i=a?t.get(a):null}return i?i.getNextSiblingKey():null};e.exports=o},function(e,t,n){"use strict";function r(e,t){var n=[],r=e.map(function(e){return e.getStyle()}).toList();return c(r,o,p,function(e,r){n.push(new h({start:e+t,end:r+t}))}),s(n)}function o(e,t){return e===t}var i=n(11),a=n(83),c=n(66),s=i.List,l=i.Repeat,u=i.Record,p=a.thatReturnsTrue,f={start:null,end:null},h=u(f),d={start:null,end:null,decoratorKey:null,leaves:null},v=u(d),m={generate:function(e,t,n){var i=t.getLength();if(!i)return s.of(new v({start:0,end:0,decoratorKey:null,leaves:s.of(new h({start:0,end:0}))}));var a=[],u=n?n.getDecorations(t,e):s(l(null,i)),f=t.getCharacterList();return c(u,o,p,function(e,t){a.push(new v({start:e,end:t,decoratorKey:u.get(e),leaves:r(f.slice(e,t).toList(),e)}))}),s(a)},getFingerprint:function(e){return e.map(function(e){var t=e.get("decoratorKey");return(null!==t?t+"."+(e.get("end")-e.get("start")):"")+"."+e.get("leaves").size}).join("-")}};e.exports=m},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(11),c=a.Record,s=c({type:"TOKEN",mutability:"IMMUTABLE",data:Object}),l=function(e){function t(){return r(this,t),o(this,e.apply(this,arguments))}return i(t,e),t.prototype.getType=function(){return this.get("type")},t.prototype.getMutability=function(){return this.get("mutability")},t.prototype.getData=function(){return this.get("data")},t}(s);e.exports=l},function(e,t,n){"use strict";function r(e){var t=f.exec(e);return null==t?null:t[0]}function o(e){var t=r(e);return null==t?l.NEUTRAL:h.exec(t)?l.RTL:l.LTR}function i(e,t){if(t=t||l.NEUTRAL,!e.length)return t;var n=o(e);return n===l.NEUTRAL?t:n}function a(e,t){return t||(t=l.getGlobalDir()),l.isStrong(t)||u(!1),i(e,t)}function c(e,t){return a(e,t)===l.LTR}function s(e,t){return a(e,t)===l.RTL}var l=n(132),u=n(10),p={L:"A-Za-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u01ba\u01bb\u01bc-\u01bf\u01c0-\u01c3\u01c4-\u0293\u0294\u0295-\u02af\u02b0-\u02b8\u02bb-\u02c1\u02d0-\u02d1\u02e0-\u02e4\u02ee\u0370-\u0373\u0376-\u0377\u037a\u037b-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u0482\u048a-\u052f\u0531-\u0556\u0559\u055a-\u055f\u0561-\u0587\u0589\u0903\u0904-\u0939\u093b\u093d\u093e-\u0940\u0949-\u094c\u094e-\u094f\u0950\u0958-\u0961\u0964-\u0965\u0966-\u096f\u0970\u0971\u0972-\u0980\u0982-\u0983\u0985-\u098c\u098f-\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09be-\u09c0\u09c7-\u09c8\u09cb-\u09cc\u09ce\u09d7\u09dc-\u09dd\u09df-\u09e1\u09e6-\u09ef\u09f0-\u09f1\u09f4-\u09f9\u09fa\u0a03\u0a05-\u0a0a\u0a0f-\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32-\u0a33\u0a35-\u0a36\u0a38-\u0a39\u0a3e-\u0a40\u0a59-\u0a5c\u0a5e\u0a66-\u0a6f\u0a72-\u0a74\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2-\u0ab3\u0ab5-\u0ab9\u0abd\u0abe-\u0ac0\u0ac9\u0acb-\u0acc\u0ad0\u0ae0-\u0ae1\u0ae6-\u0aef\u0af0\u0b02-\u0b03\u0b05-\u0b0c\u0b0f-\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32-\u0b33\u0b35-\u0b39\u0b3d\u0b3e\u0b40\u0b47-\u0b48\u0b4b-\u0b4c\u0b57\u0b5c-\u0b5d\u0b5f-\u0b61\u0b66-\u0b6f\u0b70\u0b71\u0b72-\u0b77\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99-\u0b9a\u0b9c\u0b9e-\u0b9f\u0ba3-\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bbf\u0bc1-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcc\u0bd0\u0bd7\u0be6-\u0bef\u0bf0-\u0bf2\u0c01-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c41-\u0c44\u0c58-\u0c59\u0c60-\u0c61\u0c66-\u0c6f\u0c7f\u0c82-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cbe\u0cbf\u0cc0-\u0cc4\u0cc6\u0cc7-\u0cc8\u0cca-\u0ccb\u0cd5-\u0cd6\u0cde\u0ce0-\u0ce1\u0ce6-\u0cef\u0cf1-\u0cf2\u0d02-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d3e-\u0d40\u0d46-\u0d48\u0d4a-\u0d4c\u0d4e\u0d57\u0d60-\u0d61\u0d66-\u0d6f\u0d70-\u0d75\u0d79\u0d7a-\u0d7f\u0d82-\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dcf-\u0dd1\u0dd8-\u0ddf\u0de6-\u0def\u0df2-\u0df3\u0df4\u0e01-\u0e30\u0e32-\u0e33\u0e40-\u0e45\u0e46\u0e4f\u0e50-\u0e59\u0e5a-\u0e5b\u0e81-\u0e82\u0e84\u0e87-\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa-\u0eab\u0ead-\u0eb0\u0eb2-\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0ed0-\u0ed9\u0edc-\u0edf\u0f00\u0f01-\u0f03\u0f04-\u0f12\u0f13\u0f14\u0f15-\u0f17\u0f1a-\u0f1f\u0f20-\u0f29\u0f2a-\u0f33\u0f34\u0f36\u0f38\u0f3e-\u0f3f\u0f40-\u0f47\u0f49-\u0f6c\u0f7f\u0f85\u0f88-\u0f8c\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce-\u0fcf\u0fd0-\u0fd4\u0fd5-\u0fd8\u0fd9-\u0fda\u1000-\u102a\u102b-\u102c\u1031\u1038\u103b-\u103c\u103f\u1040-\u1049\u104a-\u104f\u1050-\u1055\u1056-\u1057\u105a-\u105d\u1061\u1062-\u1064\u1065-\u1066\u1067-\u106d\u106e-\u1070\u1075-\u1081\u1083-\u1084\u1087-\u108c\u108e\u108f\u1090-\u1099\u109a-\u109c\u109e-\u109f\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fb\u10fc\u10fd-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1360-\u1368\u1369-\u137c\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166d-\u166e\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16eb-\u16ed\u16ee-\u16f0\u16f1-\u16f8\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1735-\u1736\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17b6\u17be-\u17c5\u17c7-\u17c8\u17d4-\u17d6\u17d7\u17d8-\u17da\u17dc\u17e0-\u17e9\u1810-\u1819\u1820-\u1842\u1843\u1844-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1923-\u1926\u1929-\u192b\u1930-\u1931\u1933-\u1938\u1946-\u194f\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c0\u19c1-\u19c7\u19c8-\u19c9\u19d0-\u19d9\u19da\u1a00-\u1a16\u1a19-\u1a1a\u1a1e-\u1a1f\u1a20-\u1a54\u1a55\u1a57\u1a61\u1a63-\u1a64\u1a6d-\u1a72\u1a80-\u1a89\u1a90-\u1a99\u1aa0-\u1aa6\u1aa7\u1aa8-\u1aad\u1b04\u1b05-\u1b33\u1b35\u1b3b\u1b3d-\u1b41\u1b43-\u1b44\u1b45-\u1b4b\u1b50-\u1b59\u1b5a-\u1b60\u1b61-\u1b6a\u1b74-\u1b7c\u1b82\u1b83-\u1ba0\u1ba1\u1ba6-\u1ba7\u1baa\u1bae-\u1baf\u1bb0-\u1bb9\u1bba-\u1be5\u1be7\u1bea-\u1bec\u1bee\u1bf2-\u1bf3\u1bfc-\u1bff\u1c00-\u1c23\u1c24-\u1c2b\u1c34-\u1c35\u1c3b-\u1c3f\u1c40-\u1c49\u1c4d-\u1c4f\u1c50-\u1c59\u1c5a-\u1c77\u1c78-\u1c7d\u1c7e-\u1c7f\u1cc0-\u1cc7\u1cd3\u1ce1\u1ce9-\u1cec\u1cee-\u1cf1\u1cf2-\u1cf3\u1cf5-\u1cf6\u1d00-\u1d2b\u1d2c-\u1d6a\u1d6b-\u1d77\u1d78\u1d79-\u1d9a\u1d9b-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u200e\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2134\u2135-\u2138\u2139\u213c-\u213f\u2145-\u2149\u214e\u214f\u2160-\u2182\u2183-\u2184\u2185-\u2188\u2336-\u237a\u2395\u249c-\u24e9\u26ac\u2800-\u28ff\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2c7b\u2c7c-\u2c7d\u2c7e-\u2ce4\u2ceb-\u2cee\u2cf2-\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d70\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005\u3006\u3007\u3021-\u3029\u302e-\u302f\u3031-\u3035\u3038-\u303a\u303b\u303c\u3041-\u3096\u309d-\u309e\u309f\u30a1-\u30fa\u30fc-\u30fe\u30ff\u3105-\u312d\u3131-\u318e\u3190-\u3191\u3192-\u3195\u3196-\u319f\u31a0-\u31ba\u31f0-\u31ff\u3200-\u321c\u3220-\u3229\u322a-\u3247\u3248-\u324f\u3260-\u327b\u327f\u3280-\u3289\u328a-\u32b0\u32c0-\u32cb\u32d0-\u32fe\u3300-\u3376\u337b-\u33dd\u33e0-\u33fe\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua014\ua015\ua016-\ua48c\ua4d0-\ua4f7\ua4f8-\ua4fd\ua4fe-\ua4ff\ua500-\ua60b\ua60c\ua610-\ua61f\ua620-\ua629\ua62a-\ua62b\ua640-\ua66d\ua66e\ua680-\ua69b\ua69c-\ua69d\ua6a0-\ua6e5\ua6e6-\ua6ef\ua6f2-\ua6f7\ua722-\ua76f\ua770\ua771-\ua787\ua789-\ua78a\ua78b-\ua78e\ua790-\ua7ad\ua7b0-\ua7b1\ua7f7\ua7f8-\ua7f9\ua7fa\ua7fb-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua823-\ua824\ua827\ua830-\ua835\ua836-\ua837\ua840-\ua873\ua880-\ua881\ua882-\ua8b3\ua8b4-\ua8c3\ua8ce-\ua8cf\ua8d0-\ua8d9\ua8f2-\ua8f7\ua8f8-\ua8fa\ua8fb\ua900-\ua909\ua90a-\ua925\ua92e-\ua92f\ua930-\ua946\ua952-\ua953\ua95f\ua960-\ua97c\ua983\ua984-\ua9b2\ua9b4-\ua9b5\ua9ba-\ua9bb\ua9bd-\ua9c0\ua9c1-\ua9cd\ua9cf\ua9d0-\ua9d9\ua9de-\ua9df\ua9e0-\ua9e4\ua9e6\ua9e7-\ua9ef\ua9f0-\ua9f9\ua9fa-\ua9fe\uaa00-\uaa28\uaa2f-\uaa30\uaa33-\uaa34\uaa40-\uaa42\uaa44-\uaa4b\uaa4d\uaa50-\uaa59\uaa5c-\uaa5f\uaa60-\uaa6f\uaa70\uaa71-\uaa76\uaa77-\uaa79\uaa7a\uaa7b\uaa7d\uaa7e-\uaaaf\uaab1\uaab5-\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadc\uaadd\uaade-\uaadf\uaae0-\uaaea\uaaeb\uaaee-\uaaef\uaaf0-\uaaf1\uaaf2\uaaf3-\uaaf4\uaaf5\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5b\uab5c-\uab5f\uab64-\uab65\uabc0-\uabe2\uabe3-\uabe4\uabe6-\uabe7\uabe9-\uabea\uabeb\uabec\uabf0-\uabf9\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\ue000-\uf8ff\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\uff21-\uff3a\uff41-\uff5a\uff66-\uff6f\uff70\uff71-\uff9d\uff9e-\uff9f\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc",R:"\u0590\u05be\u05c0\u05c3\u05c6\u05c8-\u05cf\u05d0-\u05ea\u05eb-\u05ef\u05f0-\u05f2\u05f3-\u05f4\u05f5-\u05ff\u07c0-\u07c9\u07ca-\u07ea\u07f4-\u07f5\u07fa\u07fb-\u07ff\u0800-\u0815\u081a\u0824\u0828\u082e-\u082f\u0830-\u083e\u083f\u0840-\u0858\u085c-\u085d\u085e\u085f-\u089f\u200f\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb37\ufb38-\ufb3c\ufb3d\ufb3e\ufb3f\ufb40-\ufb41\ufb42\ufb43-\ufb44\ufb45\ufb46-\ufb4f",AL:"\u0608\u060b\u060d\u061b\u061c\u061d\u061e-\u061f\u0620-\u063f\u0640\u0641-\u064a\u066d\u066e-\u066f\u0671-\u06d3\u06d4\u06d5\u06e5-\u06e6\u06ee-\u06ef\u06fa-\u06fc\u06fd-\u06fe\u06ff\u0700-\u070d\u070e\u070f\u0710\u0712-\u072f\u074b-\u074c\u074d-\u07a5\u07b1\u07b2-\u07bf\u08a0-\u08b2\u08b3-\u08e3\ufb50-\ufbb1\ufbb2-\ufbc1\ufbc2-\ufbd2\ufbd3-\ufd3d\ufd40-\ufd4f\ufd50-\ufd8f\ufd90-\ufd91\ufd92-\ufdc7\ufdc8-\ufdcf\ufdf0-\ufdfb\ufdfc\ufdfe-\ufdff\ufe70-\ufe74\ufe75\ufe76-\ufefc\ufefd-\ufefe"},f=new RegExp("["+p.L+p.R+p.AL+"]"),h=new RegExp("["+p.R+p.AL+"]"),d={firstStrongChar:r,firstStrongCharDir:o,resolveBlockDir:i,getDirection:a,isDirectionLTR:c,isDirectionRTL:s};e.exports=d},function(e,t,n){"use strict";e.exports={BOLD:{fontWeight:"bold"},CODE:{fontFamily:"monospace",wordWrap:"break-word"},ITALIC:{fontStyle:"italic"},STRIKETHROUGH:{textDecoration:"line-through"},UNDERLINE:{textDecoration:"underline"}}},function(e,t,n){"use strict";function r(e){var t=e.getSelection(),n=t.getAnchorKey(),r=e.getBlockTree(n),o=t.getStartOffset(),i=!1;return r.some(function(e){return o===e.get("start")?(i=!0,!0):o<e.get("end")&&e.get("leaves").some(function(e){var t=e.get("start");return o===t&&(i=!0,!0)})}),i}e.exports=r},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(20),c=a||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=n(439),l=n(68),u=n(0),p=n(9),f=n(201),h=n(137),d=n(196),v=n(132),m=n(58),y=n(454),g=n(138),b=n(458),C=n(10),w=n(30),S=function(e,t){return e.getAnchorKey()===t||e.getFocusKey()===t},x=function(e){function t(){return r(this,t),o(this,e.apply(this,arguments))}return i(t,e),t.prototype.shouldComponentUpdate=function(e){return this.props.block!==e.block||this.props.tree!==e.tree||this.props.direction!==e.direction||S(e.selection,e.block.getKey())&&e.forceSelection},t.prototype.componentDidMount=function(){var e=this.props.selection,t=e.getEndKey();if(e.getHasFocus()&&t===this.props.block.getKey()){var n=p.findDOMNode(this),r=h.getScrollParent(n),o=g(r),i=void 0;if(r===window){var a=y(n);i=a.y+a.height-b().height,i>0&&window.scrollTo(o.x,o.y+i+10)}else{n instanceof HTMLElement||C(!1);i=n.offsetHeight+n.offsetTop-(r.offsetHeight+o.y),i>0&&f.setTop(r,f.getTop(r)+i+10)}}},t.prototype._renderChildren=function(){var e=this,t=this.props.block,n=t.getKey(),r=t.getText(),o=this.props.tree.size-1,i=S(this.props.selection,n);return this.props.tree.map(function(a,p){var f=a.get("leaves"),h=f.size-1,m=f.map(function(a,c){var f=l.encode(n,p,c),d=a.get("start"),v=a.get("end");return u.createElement(s,{key:f,offsetKey:f,block:t,start:d,selection:i?e.props.selection:null,forceSelection:e.props.forceSelection,text:r.slice(d,v),styleSet:t.getInlineStyleAt(d),customStyleMap:e.props.customStyleMap,customStyleFn:e.props.customStyleFn,isLast:p===o&&c===h})}).toArray(),y=a.get("decoratorKey");if(null==y)return m;if(!e.props.decorator)return m;var g=w(e.props.decorator),b=g.getComponentForKey(y);if(!b)return m;var C=g.getPropsForKey(y),S=l.encode(n,p,0),x=r.slice(f.first().get("start"),f.last().get("end")),M=v.getHTMLDirIfDifferent(d.getDirection(x),e.props.direction);return u.createElement(b,c({},C,{contentState:e.props.contentState,decoratedText:x,dir:M,key:S,entityKey:t.getEntityAt(a.get("start")),offsetKey:S}),m)}).toArray()},t.prototype.render=function(){var e=this.props,t=e.direction,n=e.offsetKey,r=m({"public/DraftStyleDefault/block":!0,"public/DraftStyleDefault/ltr":"LTR"===t,"public/DraftStyleDefault/rtl":"RTL"===t});return u.createElement("div",{"data-offset-key":n,className:r},this._renderChildren())},t}(u.Component);e.exports=x},function(e,t,n){"use strict";function r(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}e.exports=r},function(e,t,n){"use strict";function r(e,t){return!!t&&(e===t.documentElement||e===t.body)}var o={getTop:function(e){var t=e.ownerDocument;return r(e,t)?t.body.scrollTop||t.documentElement.scrollTop:e.scrollTop},setTop:function(e,t){var n=e.ownerDocument;r(e,n)?n.body.scrollTop=n.documentElement.scrollTop=t:e.scrollTop=t},getLeft:function(e){var t=e.ownerDocument;return r(e,t)?t.body.scrollLeft||t.documentElement.scrollLeft:e.scrollLeft},setLeft:function(e,t){var n=e.ownerDocument;r(e,n)?n.body.scrollLeft=n.documentElement.scrollLeft=t:e.scrollLeft=t}};e.exports=o},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e){if("file"==e.kind)return e.getAsFile()}var i=n(461),a=n(462),c=n(83),s=new RegExp("\r\n","g"),l={"text/rtf":1,"text/html":1},u=function(){function e(t){r(this,e),this.data=t,this.types=t.types?a(t.types):[]}return e.prototype.isRichText=function(){return!(!this.getHTML()||!this.getText())||!this.isImage()&&this.types.some(function(e){return l[e]})},e.prototype.getText=function(){var e;return this.data.getData&&(this.types.length?-1!=this.types.indexOf("text/plain")&&(e=this.data.getData("text/plain")):e=this.data.getData("Text")),e?e.replace(s,"\n"):null},e.prototype.getHTML=function(){if(this.data.getData){if(!this.types.length)return this.data.getData("Text");if(-1!=this.types.indexOf("text/html"))return this.data.getData("text/html")}},e.prototype.isLink=function(){return this.types.some(function(e){return-1!=e.indexOf("Url")||-1!=e.indexOf("text/uri-list")||e.indexOf("text/x-moz-url")})},e.prototype.getLink=function(){if(this.data.getData){if(-1!=this.types.indexOf("text/x-moz-url")){return this.data.getData("text/x-moz-url").split("\n")[0]}return-1!=this.types.indexOf("text/uri-list")?this.data.getData("text/uri-list"):this.data.getData("url")}return null},e.prototype.isImage=function(){if(this.types.some(function(e){return-1!=e.indexOf("application/x-moz-file")}))return!0;for(var e=this.getFiles(),t=0;t<e.length;t++){var n=e[t].type;if(!i.isImage(n))return!1}return!0},e.prototype.getCount=function(){return this.data.hasOwnProperty("items")?this.data.items.length:this.data.hasOwnProperty("mozItemCount")?this.data.mozItemCount:this.data.files?this.data.files.length:null},e.prototype.getFiles=function(){return this.data.items?Array.prototype.slice.call(this.data.items).map(o).filter(c.thatReturnsArgument):this.data.files?Array.prototype.slice.call(this.data.files):[]},e.prototype.hasFiles=function(){return this.getFiles().length>0},e}();e.exports=u},function(e,t,n){"use strict";function r(e){if(e instanceof Element){var t=e.getAttribute("data-offset-key");if(t)return t;for(var n=0;n<e.childNodes.length;n++){var o=r(e.childNodes[n]);if(o)return o}}return null}e.exports=r},function(e,t,n){"use strict";(function(t){function r(e,t){var n=0,r=[];e.forEach(function(i){o(i,function(o){n++,o&&r.push(o.slice(0,s)),n==e.length&&t(r.join("\r"))})})}function o(e,n){if(!t.FileReader||e.type&&!(e.type in c))return void n("");if(""===e.type){var r="";return a.test(e.name)&&(r=e.name.replace(a,"")),void n(r)}var o=new FileReader;o.onload=function(){var e=o.result;"string"!=typeof e&&i(!1),n(e)},o.onerror=function(){n("")},o.readAsText(e)}var i=n(10),a=/\.textClipping$/,c={"text/plain":!0,"text/html":!0,"text/rtf":!0},s=5e3;e.exports=r}).call(t,n(18))},function(e,t,n){"use strict";function r(e,t,n,r,a){var c=i(e.getSelection()),s=o.decode(t),l=s.blockKey,u=e.getBlockTree(l).getIn([s.decoratorKey,"leaves",s.leafKey]),p=o.decode(r),f=p.blockKey,h=e.getBlockTree(f).getIn([p.decoratorKey,"leaves",p.leafKey]),d=u.get("start"),v=h.get("start"),m=u?d+n:null,y=h?v+a:null;if(c.getAnchorKey()===l&&c.getAnchorOffset()===m&&c.getFocusKey()===f&&c.getFocusOffset()===y)return c;var g=!1;if(l===f){var b=u.get("end"),C=h.get("end");g=v===d&&C===b?a<n:v<d}else{g=e.getCurrentContent().getBlockMap().keySeq().skipUntil(function(e){return e===l||e===f}).first()===f}return c.merge({anchorKey:l,anchorOffset:m,focusKey:f,focusOffset:y,isBackward:g})}var o=n(68),i=n(30);e.exports=r},function(e,t,n){"use strict";function r(e){var t=e.getSelection();return t.isCollapsed()?null:o(e.getCurrentContent(),t)}var o=n(89);e.exports=r},function(e,t,n){"use strict";function r(e){for(var t=e.cloneRange(),n=[],r=e.endContainer;null!=r;r=r.parentNode){var o=r===e.commonAncestorContainer;o?t.setStart(e.startContainer,e.startOffset):t.setStart(t.endContainer,0);var a=Array.from(t.getClientRects());if(n.push(a),o){var c;return n.reverse(),(c=[]).concat.apply(c,n)}t.setEndBefore(r)}i(!1)}var o=n(34),i=n(10),a=o.isBrowser("Chrome"),c=a?r:function(e){return Array.from(e.getClientRects())};e.exports=c},function(e,t,n){"use strict";function r(e,t,n,r,o,i){var c=n.nodeType===Node.TEXT_NODE,l=o.nodeType===Node.TEXT_NODE;if(c&&l)return{selectionState:u(e,f(s(n)),r,f(s(o)),i),needsRecovery:!1};var p=null,h=null,d=!0;return c?(p={key:f(s(n)),offset:r},h=a(t,o,i)):l?(h={key:f(s(o)),offset:i},p=a(t,n,r)):(p=a(t,n,r),h=a(t,o,i),n===o&&r===i&&(d=!!n.firstChild&&"BR"!==n.firstChild.nodeName)),{selectionState:u(e,p.key,p.offset,h.key,h.offset),needsRecovery:d}}function o(e){for(;e.firstChild&&(e.firstChild instanceof Element&&"true"===e.firstChild.getAttribute("data-blocks")||l(e.firstChild));)e=e.firstChild;return e}function i(e){for(;e.lastChild&&(e.lastChild instanceof Element&&"true"===e.lastChild.getAttribute("data-blocks")||l(e.lastChild));)e=e.lastChild;return e}function a(e,t,n){var r=t,a=s(r);if(null!=a||e&&(e===r||e.firstChild===r)||p(!1),e===r&&(r=r.firstChild,r instanceof Element&&"true"===r.getAttribute("data-contents")||p(!1),n>0&&(n=r.childNodes.length)),0===n){var u=null;if(null!=a)u=a;else{var h=o(r);u=f(l(h))}return{key:u,offset:0}}var d=r.childNodes[n-1],v=null,m=null;if(l(d)){var y=i(d);v=f(l(y)),m=c(y)}else v=f(a),m=c(d);return{key:v,offset:m}}function c(e){var t=e.textContent;return"\n"===t?0:t.length}var s=n(139),l=n(203),u=n(205),p=n(10),f=n(30);e.exports=r},function(e,t,n){"use strict";function r(e,t){var n=t?u.exec(e):s.exec(e);return n?n[0]:e}var o=n(479),i=o.getPunctuation(),a="\\s|(?![_])"+i,c="^(?:"+a+")*(?:['\u2018\u2019]|(?!"+a+").)*(?:(?!"+a+").)",s=new RegExp(c),l="(?:(?!"+a+").)(?:['\u2018\u2019]|(?!"+a+").)*(?:"+a+")*$",u=new RegExp(l),p={getBackward:function(e){return r(e,!0)},getForward:function(e){return r(e,!1)}};e.exports=p},function(e,t,n){"use strict";function r(e,t){var n,r=e.getSelection(),o=r.getStartKey(),i=r.getStartOffset(),a=e.getCurrentContent(),c=o;return t>a.getBlockForKey(o).getText().length-i?(c=a.getKeyAfter(o),n=0):n=i+t,r.merge({focusKey:c,focusOffset:n})}e.exports=r},function(e,t,n){"use strict";function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var o,i=a||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},a=n(20),c=n(24),s=n(50),l=n(26),u=n(133),p=n(90),f=n(42),h=n(11),d=n(11),v=d.Set,m=n(490),y=n(58),g=n(36),b=n(212),C=n(10),w=n(131),S=f.draft_tree_data_support,x=h.List,M=h.OrderedSet,z=new RegExp("\r","g"),k=new RegExp("\n","g"),_=new RegExp("&nbsp;","g"),O=new RegExp("&#13;?","g"),E=new RegExp("&#8203;?","g"),T=["bold","bolder","500","600","700","800","900"],N=["light","lighter","100","200","300","400"],V={b:"BOLD",code:"CODE",del:"STRIKETHROUGH",em:"ITALIC",i:"ITALIC",s:"STRIKETHROUGH",strike:"STRIKETHROUGH",strong:"BOLD",u:"UNDERLINE"},P=(o={},r(o,y("public/DraftStyleDefault/depth0"),0),r(o,y("public/DraftStyleDefault/depth1"),1),r(o,y("public/DraftStyleDefault/depth2"),2),r(o,y("public/DraftStyleDefault/depth3"),3),r(o,y("public/DraftStyleDefault/depth4"),4),o),H=["className","href","rel","target","title"],L=["alt","className","height","src","width"],D=void 0,A={text:"",inlines:[],entities:[],blocks:[]},I={children:x(),depth:0,key:"",type:""},R=function(e,t){return"li"===e?"ol"===t?"ordered-list-item":"unordered-list-item":null},j=function(e){var t=e.get("unstyled").element,n=v([]);return e.forEach(function(e){e.aliasedElements&&e.aliasedElements.forEach(function(e){n=n.add(e)}),n=n.add(e.element)}),n.filter(function(e){return e&&e!==t}).toArray().sort()},F=function(e,t,n){for(var r=0;r<n.length;r++){var o=n[r](e,t);if(o)return o}return null},K=function(e,t,n){var r=n.filter(function(t){return t.element===e||t.wrapper===e||t.aliasedElements&&t.aliasedElements.some(function(t){return t===e})}).keySeq().toSet().toArray().sort();switch(r.length){case 0:return"unstyled";case 1:return r[0];default:return F(e,t,[R])||"unstyled"}},B=function(e,t,n){var r=V[e];if(r)n=n.add(r).toOrderedSet();else if(t instanceof HTMLElement){var o=t;n=n.withMutations(function(e){var t=o.style.fontWeight,n=o.style.fontStyle,r=o.style.textDecoration;T.indexOf(t)>=0?e.add("BOLD"):N.indexOf(t)>=0&&e.remove("BOLD"),"italic"===n?e.add("ITALIC"):"normal"===n&&e.remove("ITALIC"),"underline"===r&&e.add("UNDERLINE"),"line-through"===r&&e.add("STRIKETHROUGH"),"none"===r&&(e.remove("UNDERLINE"),e.remove("STRIKETHROUGH"))}).toOrderedSet()}return n},W=function(e,t,n){var r=e.text.slice(-1),o=t.text.slice(0,1);if("\r"!==r||"\r"!==o||n||(e.text=e.text.slice(0,-1),e.inlines.pop(),e.entities.pop(),e.blocks.pop()),"\r"===r){if(" "===t.text||"\n"===t.text)return e;" "!==o&&"\n"!==o||(t.text=t.text.slice(1),t.inlines.shift(),t.entities.shift())}return{text:e.text+t.text,inlines:e.inlines.concat(t.inlines),entities:e.entities.concat(t.entities),blocks:e.blocks.concat(t.blocks)}},U=function(e,t){return t.some(function(t){return-1!==e.indexOf("<"+t)})},q=function(e){e instanceof HTMLAnchorElement||C(!1);var t=e.protocol;return"http:"===t||"https:"===t||"mailto:"===t},Y=function(e){var t=new Array(1);return e&&(t[0]=e),i({},A,{text:" ",inlines:[M()],entities:t})},G=function(){return i({},A,{text:"\n",inlines:[M()],entities:new Array(1)})},X=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return i({},I,e)},$=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;return{text:"\r",inlines:[M()],entities:new Array(1),blocks:[X({parent:n,key:g(),type:e,depth:Math.max(0,Math.min(4,t))})]}},J=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return Object.keys(P).some(function(n){e.classList.contains(n)&&(t=P[n])}),t},Z=function e(t,n,r,o,a,c,s,l,u,f){var h=D,d=n.nodeName.toLowerCase(),v=t,y="unstyled",g=!1,b=a&&K(a,o,l),C=i({},A),w=null,x=void 0;if("#text"===d){var M=n.textContent,z=M.trim();if(o&&""===z&&n.parentElement){var _=n.parentElement.nodeName.toLowerCase();if("ol"===_||"ul"===_)return{chunk:i({},A),entityMap:t}}return""===z&&"pre"!==a?{chunk:Y(u),entityMap:t}:("pre"!==a&&(M=M.replace(k," ")),D=d,{chunk:{text:M,inlines:Array(M.length).fill(r),entities:Array(M.length).fill(u),blocks:[]},entityMap:t})}if(D=d,"br"===d)return"br"!==h||a&&"unstyled"!==b?{chunk:G(),entityMap:t}:{chunk:$("unstyled",s,f),entityMap:t};if("img"===d&&n instanceof HTMLImageElement&&n.attributes.getNamedItem("src")&&n.attributes.getNamedItem("src").value){var O=n,E={};L.forEach(function(e){var t=O.getAttribute(e);t&&(E[e]=t)}),n.textContent="\ud83d\udcf7",u=p.__create("IMAGE","MUTABLE",E||{})}r=B(d,n,r),"ul"!==d&&"ol"!==d||(o&&(s+=1),o=d),!S&&"li"===d&&n instanceof HTMLElement&&(s=J(n,s));var T=K(d,o,l),N=o&&"li"===a&&"li"===d,V=(!a||S)&&-1!==c.indexOf(d);(N||V)&&(C=$(T,s,f),x=C.blocks[0].key,a=d,g=!S),N&&(y="ul"===o?"unordered-list-item":"ordered-list-item");var P=n.firstChild;null!=P&&(d=P.nodeName.toLowerCase());for(var I=null;P;){P instanceof HTMLAnchorElement&&P.href&&q(P)?function(){var e=P,t={};H.forEach(function(n){var r=e.getAttribute(n);r&&(t[n]=r)}),t.url=new m(e.href).toString(),I=p.__create("LINK","MUTABLE",t||{})}():I=void 0;var R=e(v,P,r,o,a,c,s,l,I||u,S?x:null),j=R.chunk,F=R.entityMap;w=j,v=F,C=W(C,w,S);var U=P.nextSibling;!f&&U&&c.indexOf(d)>=0&&a&&(C=W(C,G())),U&&(d=U.nodeName.toLowerCase()),P=U}return g&&(C=W(C,$(y,s,f))),{chunk:C,entityMap:v}},Q=function(e,t,n,r){e=e.trim().replace(z,"").replace(_," ").replace(O,"").replace(E,"");var o=j(n),a=t(e);if(!a)return null;D=null;var c=U(e,o)?o:["div"],s=Z(r,a,M(),"ul",null,c,-1,n),l=s.chunk,u=s.entityMap;return 0===l.text.indexOf("\r")&&(l={text:l.text.slice(1),inlines:l.inlines.slice(1),entities:l.entities.slice(1),blocks:l.blocks}),"\r"===l.text.slice(-1)&&(l.text=l.text.slice(0,-1),l.inlines=l.inlines.slice(0,-1),l.entities=l.entities.slice(0,-1),l.blocks.pop()),0===l.blocks.length&&l.blocks.push(i({},A,{type:"unstyled",depth:0})),l.text.split("\r").length===l.blocks.length+1&&l.blocks.unshift({type:"unstyled",depth:0}),{chunk:l,entityMap:u}},ee=function(e){if(!e||!e.text||!Array.isArray(e.blocks))return null;var t={cacheRef:{},contentBlocks:[]},n=0,r=e.blocks,o=e.inlines,i=e.entities,a=S?l:s;return e.text.split("\r").reduce(function(e,t,s){t=w(t);var u=r[s],p=n+t.length,f=o.slice(n,p),h=i.slice(n,p),d=x(f.map(function(e,t){var n={style:e,entity:null};return h[t]&&(n.entity=h[t]),c.create(n)}));n=p+1;var v=u.depth,m=u.type,y=u.parent,b=u.key||g(),C=null;if(y){var S=e.cacheRef[y],M=e.contentBlocks[S];if(M.getChildKeys().isEmpty()&&M.getText()){var z=M.getCharacterList(),k=M.getText();C=g();var _=new l({key:C,text:k,characterList:z,parent:y,nextSibling:b});e.contentBlocks.push(_),M=M.withMutations(function(e){e.set("characterList",x()).set("text","").set("children",M.children.push(_.getKey()))})}e.contentBlocks[S]=M.set("children",M.children.push(b))}var O=new a({key:b,parent:y,type:m,depth:v,text:t,characterList:d,prevSibling:C||(0===s||r[s-1].parent!==y?null:r[s-1].key),nextSibling:s===r.length-1||r[s+1].parent!==y?null:r[s+1].key});return e.contentBlocks.push(O),e.cacheRef[O.key]=s,e},t).contentBlocks},te=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:b,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:u,r=Q(e,t,n,p);if(null==r)return null;var o=r.chunk,i=r.entityMap;return{contentBlocks:ee(o),entityMap:i}};e.exports=te},function(e,t,n){"use strict";function r(e){var t,n=null;return!a&&document.implementation&&document.implementation.createHTMLDocument&&(t=document.implementation.createHTMLDocument("foo"),t.documentElement||i(!1),t.documentElement.innerHTML=e,n=t.getElementsByTagName("body")[0]),n}var o=n(34),i=n(10),a=o.isBrowser("IE <= 9");e.exports=r},function(e,t,n){"use strict";var r=n(22),o=n(15),i=(n(57),n(491)),a=n(30),c={currentBlockContainsLink:function(e){var t=e.getSelection(),n=e.getCurrentContent(),r=n.getEntityMap();return n.getBlockForKey(t.getAnchorKey()).getCharacterList().slice(t.getStartOffset(),t.getEndOffset()).some(function(e){var t=e.getEntity();return!!t&&"LINK"===r.__get(t).getType()})},getCurrentBlockType:function(e){var t=e.getSelection();return e.getCurrentContent().getBlockForKey(t.getStartKey()).getType()},getDataObjectForLinkURL:function(e){return{url:e.toString()}},handleKeyCommand:function(e,t){switch(t){case"bold":return c.toggleInlineStyle(e,"BOLD");case"italic":return c.toggleInlineStyle(e,"ITALIC");case"underline":return c.toggleInlineStyle(e,"UNDERLINE");case"code":return c.toggleCode(e);case"backspace":case"backspace-word":case"backspace-to-start-of-line":return c.onBackspace(e);case"delete":case"delete-word":case"delete-to-end-of-block":return c.onDelete(e);default:return null}},insertSoftNewline:function(e){var t=r.insertText(e.getCurrentContent(),e.getSelection(),"\n",e.getCurrentInlineStyle(),null),n=o.push(e,t,"insert-characters");return o.forceSelection(n,t.getSelectionAfter())},onBackspace:function(e){var t=e.getSelection();if(!t.isCollapsed()||t.getAnchorOffset()||t.getFocusOffset())return null;var n=e.getCurrentContent(),r=t.getStartKey(),i=n.getBlockBefore(r);if(i&&"atomic"===i.getType()){var a=n.getBlockMap().delete(i.getKey()),s=n.merge({blockMap:a,selectionAfter:t});if(s!==n)return o.push(e,s,"remove-range")}var l=c.tryToRemoveBlockStyle(e);return l?o.push(e,l,"change-block-type"):null},onDelete:function(e){var t=e.getSelection();if(!t.isCollapsed())return null;var n=e.getCurrentContent(),i=t.getStartKey(),a=n.getBlockForKey(i),c=a.getLength();if(t.getStartOffset()<c)return null;var s=n.getBlockAfter(i);if(!s||"atomic"!==s.getType())return null;var l=t.merge({focusKey:s.getKey(),focusOffset:s.getLength()}),u=r.removeRange(n,l,"forward");return u!==n?o.push(e,u,"remove-range"):null},onTab:function(e,t,n){var r=t.getSelection(),a=r.getAnchorKey();if(a!==r.getFocusKey())return t;var c=t.getCurrentContent(),s=c.getBlockForKey(a),l=s.getType();if("unordered-list-item"!==l&&"ordered-list-item"!==l)return t;e.preventDefault();var u=c.getBlockBefore(a);if(!u)return t;var p=u.getType();if("unordered-list-item"!==p&&"ordered-list-item"!==p)return t;var f=s.getDepth();if(!e.shiftKey&&f===n)return t;n=Math.min(u.getDepth()+1,n);var h=i(c,r,e.shiftKey?-1:1,n);return o.push(t,h,"adjust-depth")},toggleBlockType:function(e,t){var n=e.getSelection(),i=n.getStartKey(),c=n.getEndKey(),s=e.getCurrentContent(),l=n;if(i!==c&&0===n.getEndOffset()){var u=a(s.getBlockBefore(c));c=u.getKey(),l=l.merge({anchorKey:i,anchorOffset:n.getStartOffset(),focusKey:c,focusOffset:u.getLength(),isBackward:!1})}if(s.getBlockMap().skipWhile(function(e,t){return t!==i}).reverse().skipWhile(function(e,t){return t!==c}).some(function(e){return"atomic"===e.getType()}))return e;var p=s.getBlockForKey(i).getType()===t?"unstyled":t;return o.push(e,r.setBlockType(s,l,p),"change-block-type")},toggleCode:function(e){var t=e.getSelection(),n=t.getAnchorKey(),r=t.getFocusKey();return t.isCollapsed()||n!==r?c.toggleBlockType(e,"code-block"):c.toggleInlineStyle(e,"CODE")},toggleInlineStyle:function(e,t){var n=e.getSelection(),i=e.getCurrentInlineStyle();if(n.isCollapsed())return o.setInlineStyleOverride(e,i.has(t)?i.remove(t):i.add(t));var a,c=e.getCurrentContent();return a=i.has(t)?r.removeInlineStyle(c,n,t):r.applyInlineStyle(c,n,t),o.push(e,a,"change-inline-style")},toggleLink:function(e,t,n){var i=r.applyEntity(e.getCurrentContent(),t,n);return o.push(e,i,"apply-entity")},tryToRemoveBlockStyle:function(e){var t=e.getSelection(),n=t.getAnchorOffset();if(t.isCollapsed()&&0===n){var o=t.getAnchorKey(),i=e.getCurrentContent(),a=i.getBlockForKey(o),c=i.getFirstBlock();if(a.getLength()>0&&a!==c)return null;var s=a.getType(),l=i.getBlockBefore(o);if("code-block"===s&&l&&"code-block"===l.getType()&&0!==l.getLength())return null;if("unstyled"!==s)return r.setBlockType(i,t,"unstyled")}return null}};e.exports=c},function(e,t,n){"use strict";function r(e){return p&&e.altKey||v(e)}function o(e){return d(e)?e.shiftKey?"redo":"undo":null}function i(e){return f&&e.shiftKey?null:r(e)?"delete-word":"delete"}function a(e){return d(e)&&p?"backspace-to-start-of-line":r(e)?"backspace-word":"backspace"}function c(e){switch(e.keyCode){case 66:return d(e)?"bold":null;case 68:return v(e)?"delete":null;case 72:return v(e)?"backspace":null;case 73:return d(e)?"italic":null;case 74:return d(e)?"code":null;case 75:return!f&&v(e)?"secondary-cut":null;case 77:case 79:return v(e)?"split-block":null;case 84:return p&&v(e)?"transpose-characters":null;case 85:return d(e)?"underline":null;case 87:return p&&v(e)?"backspace-word":null;case 89:return v(e)?f?"redo":"secondary-paste":null;case 90:return o(e)||null;case l.RETURN:return"split-block";case l.DELETE:return i(e);case l.BACKSPACE:return a(e);case l.LEFT:return h&&d(e)?"move-selection-to-start-of-block":null;case l.RIGHT:return h&&d(e)?"move-selection-to-end-of-block":null;default:return null}}var s=n(141),l=n(134),u=n(34),p=u.isPlatform("Mac OS X"),f=u.isPlatform("Windows"),h=p&&u.isBrowser("Firefox < 29"),d=s.hasCommandModifier,v=s.isCtrlKeyCommand;e.exports=c},function(e,t,n){"use strict";var r={stringify:function(e){return"_"+String(e)},unstringify:function(e){return e.slice(1)}};e.exports=r},function(e,t,n){(function(e){function r(e,t){this._id=e,this._clearFn=t}var o=void 0!==e&&e||"undefined"!=typeof self&&self||window,i=Function.prototype.apply;t.setTimeout=function(){return new r(i.call(setTimeout,o,arguments),clearTimeout)},t.setInterval=function(){return new r(i.call(setInterval,o,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},r.prototype.unref=r.prototype.ref=function(){},r.prototype.close=function(){this._clearFn.call(o,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout(function(){e._onTimeout&&e._onTimeout()},t))},n(140),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(t,n(18))},function(e,t,n){var r=n(513),o=n(119),i=n(514),a=n(218),c=n(515),s=n(48),l=n(175),u=l(r),p=l(o),f=l(i),h=l(a),d=l(c),v=s;(r&&"[object DataView]"!=v(new r(new ArrayBuffer(1)))||o&&"[object Map]"!=v(new o)||i&&"[object Promise]"!=v(i.resolve())||a&&"[object Set]"!=v(new a)||c&&"[object WeakMap]"!=v(new c))&&(v=function(e){var t=s(e),n="[object Object]"==t?e.constructor:void 0,r=n?l(n):"";if(r)switch(r){case u:return"[object DataView]";case p:return"[object Map]";case f:return"[object Promise]";case h:return"[object Set]";case d:return"[object WeakMap]"}return t}),e.exports=v},function(e,t,n){var r=n(49),o=n(29),i=r(o,"Set");e.exports=i},function(e,t){function n(e){var t=-1,n=Array(e.size);return e.forEach(function(e,r){n[++t]=[r,e]}),n}e.exports=n},function(e,t,n){function r(e,t,n,a,c){return e===t||(null==e||null==t||!i(e)&&!i(t)?e!==e&&t!==t:o(e,t,n,a,r,c))}var o=n(531),i=n(40);e.exports=r},function(e,t,n){function r(e,t,n,r,l,u){var p=n&c,f=e.length,h=t.length;if(f!=h&&!(p&&h>f))return!1;var d=u.get(e);if(d&&u.get(t))return d==t;var v=-1,m=!0,y=n&s?new o:void 0;for(u.set(e,t),u.set(t,e);++v<f;){var g=e[v],b=t[v];if(r)var C=p?r(b,g,v,t,e,u):r(g,b,v,e,t,u);if(void 0!==C){if(C)continue;m=!1;break}if(y){if(!i(t,function(e,t){if(!a(y,t)&&(g===e||l(g,e,n,r,u)))return y.push(t)})){m=!1;break}}else if(g!==b&&!l(g,b,n,r,u)){m=!1;break}}return u.delete(e),u.delete(t),m}var o=n(222),i=n(534),a=n(223),c=1,s=2;e.exports=r},function(e,t,n){function r(e){var t=-1,n=null==e?0:e.length;for(this.__data__=new o;++t<n;)this.add(e[t])}var o=n(117),i=n(532),a=n(533);r.prototype.add=r.prototype.push=i,r.prototype.has=a,e.exports=r},function(e,t){function n(e,t){return e.has(t)}e.exports=n},function(e,t,n){function r(e){return e===e&&!o(e)}var o=n(28);e.exports=r},function(e,t){function n(e,t){return function(n){return null!=n&&(n[e]===t&&(void 0!==t||e in Object(n)))}}e.exports=n},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(629));n.n(o)},function(e,t,n){"use strict";t.a={items_per_page:"\u6761/\u9875",jump_to:"\u8df3\u81f3",jump_to_confirm:"\u786e\u5b9a",page:"\u9875",prev_page:"\u4e0a\u4e00\u9875",next_page:"\u4e0b\u4e00\u9875",prev_5:"\u5411\u524d 5 \u9875",next_5:"\u5411\u540e 5 \u9875",prev_3:"\u5411\u524d 3 \u9875",next_3:"\u5411\u540e 3 \u9875"}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(590));n.n(o)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(230));n.n(o)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(621));n.n(o)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(622));n.n(o),n(145),n(93)},function(e,t,n){"use strict";function r(e,t,n){var r=Ms.a.unstable_batchedUpdates?function(e){Ms.a.unstable_batchedUpdates(n,e)}:n;return Os()(e,t,r)}function o(e,t){for(var n=us()({},e),r=0;r<t.length;r++){delete n[t[r]]}return n}function i(e,t){if("undefined"==typeof window)return 0;var n=t?"pageYOffset":"pageXOffset",r=t?"scrollTop":"scrollLeft",o=e===window,i=o?e[n]:e[r];return o&&"number"!=typeof i&&(i=window.document.documentElement[r]),i}function a(e){var t=void 0,n=function(n){return function(){t=null,e.apply(void 0,Ls()(n))}},r=function(){for(var e=arguments.length,r=Array(e),o=0;o<e;o++)r[o]=arguments[o];null==t&&(t=As()(n(r)))};return r.cancel=function(){return As.a.cancel(t)},r}function c(){return function(e,t,n){var r=n.value,o=!1;return{configurable:!0,get:function(){if(o||this===e.prototype||this.hasOwnProperty(t))return r;var n=a(r.bind(this));return o=!0,Object.defineProperty(this,t,{value:n,configurable:!0,writable:!0}),o=!1,n}}}}function s(e){return e!==window?e.getBoundingClientRect():{top:0,left:0,bottom:0}}function l(e,t){var n=e.getBoundingClientRect(),r=s(t),o=i(t,!0),a=i(t,!1),c=window.document.body,l=c.clientTop||0,u=c.clientLeft||0;return{top:n.top-r.top+o-l,left:n.left-r.left+a-u,width:n.width,height:n.height}}function u(){}function p(){return"undefined"!=typeof window?window:null}function f(){return window}function h(e,t){if(!e)return 0;if(!e.getClientRects().length)return 0;var n=e.getBoundingClientRect();return n.width||n.height?t===window?(t=e.ownerDocument.documentElement,n.top-t.clientTop):n.top-t.getBoundingClientRect().top:n.top}function d(e,t,n,r){var o=n-t;return e/=r/2,e<1?o/2*e*e*e+t:o/2*((e-=2)*e*e+2)+t}function v(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments[2],r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},o=n(),a=i(o,!0),c=Fs.exec(e);if(c){var s=document.getElementById(c[1]);if(s){var l=h(s,o),u=a+l-t,p=Date.now(),f=function e(){var t=Date.now(),n=t-p,i=d(n,a,u,450);o===window?window.scrollTo(window.pageXOffset,i):o.scrollTop=i,n<450?As()(e):r()};As()(f)}}}function m(e){var t=[];return Ss.a.Children.forEach(e,function(e){t.push(e)}),t}function y(e){var t=[];return Ss.a.Children.forEach(e,function(e){t.push(e)}),t}function g(e,t){var n=null;return e&&e.forEach(function(e){n||e&&e.key===t&&(n=e)}),n}function b(e,t,n){var r=null;return e&&e.forEach(function(e){if(e&&e.key===t&&e.props[n]){if(r)throw new Error("two child with same key for <rc-animate> children");r=e}}),r}function C(e,t,n){var r=e.length===t.length;return r&&e.forEach(function(e,o){var i=t[o];e&&i&&(e&&!i||!e&&i?r=!1:e.key!==i.key?r=!1:n&&e.props[n]!==i.props[n]&&(r=!1))}),r}function w(e,t){var n=[],r={},o=[];return e.forEach(function(e){e&&g(t,e.key)?o.length&&(r[e.key]=o,o=[]):o.push(e)}),t.forEach(function(e){e&&Object.prototype.hasOwnProperty.call(r,e.key)&&(n=n.concat(r[e.key])),n.push(e)}),n=n.concat(o)}function S(e,t){for(var n=window.getComputedStyle(e,null),r="",o=0;o<tl.length&&!(r=n.getPropertyValue(tl[o]+t));o++);return r}function x(e){if(Qs){var t=parseFloat(S(e,"transition-delay"))||0,n=parseFloat(S(e,"transition-duration"))||0,r=parseFloat(S(e,"animation-delay"))||0,o=parseFloat(S(e,"animation-duration"))||0,i=Math.max(n+t,o+r);e.rcEndAnimTimeout=setTimeout(function(){e.rcEndAnimTimeout=null,e.rcEndListener&&e.rcEndListener()},1e3*i+200)}}function M(e){e.rcEndAnimTimeout&&(clearTimeout(e.rcEndAnimTimeout),e.rcEndAnimTimeout=null)}function z(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n["ms"+e]="MS"+t,n["O"+e]="o"+t.toLowerCase(),n}function k(e){if(fl[e])return fl[e];var t=ul[e];if(t)for(var n=Object.keys(t),r=n.length,o=0;o<r;o+=1){var i=n[o];if(Object.prototype.hasOwnProperty.call(t,i)&&i in pl)return fl[e]=t[i],fl[e]}return""}function _(e,t){if(!e)return null;if("object"==typeof e){return e[t.replace(/-\w/g,function(e){return e[1].toUpperCase()})]}return e+"-"+t}function O(e){var t=e.children;return Ss.a.isValidElement(t)&&!t.key?Ss.a.cloneElement(t,{key:wl}):t}function E(){}function T(){var e=[].slice.call(arguments,0);return 1===e.length?e[0]:function(){for(var t=0;t<e.length;t++)e[t]&&e[t].apply&&e[t].apply(this,arguments)}}function N(){}function V(e,t,n){var r=t||"";return e.key||r+"item_"+n}function P(e){return e+"-menu-"}function H(e,t){var n=-1;Ss.a.Children.forEach(e,function(e){n++,e&&e.type&&e.type.isMenuItemGroup?Ss.a.Children.forEach(e.props.children,function(e){n++,t(e,n)}):t(e,n)})}function L(e,t,n){e&&!n.find&&Ss.a.Children.forEach(e,function(e){if(e){var r=e.type;if(!r||!(r.isSubMenu||r.isMenuItem||r.isMenuItemGroup))return;-1!==t.indexOf(e.key)?n.find=!0:e.props.children&&L(e.props.children,t,n)}})}function D(e,t){for(var n=t;n;){if(n===e)return!0;n=n.parentNode}return!1}function A(e,t,n){return n?e[0]===t[0]:e[0]===t[0]&&e[1]===t[1]}function I(e,t,n){var r=e[t]||{};return us()({},r,n)}function R(e,t,n,r){var o=n.points;for(var i in e)if(e.hasOwnProperty(i)&&A(e[i].points,o,r))return t+"-placement-"+i;return""}function j(e,t){this[e]=t}function F(){if(void 0!==Ll)return Ll;Ll="";var e=document.createElement("p").style;for(var t in Dl)t+"Transform"in e&&(Ll=t);return Ll}function K(){return F()?F()+"TransitionProperty":"transitionProperty"}function B(){return F()?F()+"Transform":"transform"}function W(e,t){var n=K();n&&(e.style[n]=t,"transitionProperty"!==n&&(e.style.transitionProperty=t))}function U(e,t){var n=B();n&&(e.style[n]=t,"transform"!==n&&(e.style.transform=t))}function q(e){return e.style.transitionProperty||e.style[K()]}function Y(e){var t=window.getComputedStyle(e,null),n=t.getPropertyValue("transform")||t.getPropertyValue(B());if(n&&"none"!==n){var r=n.replace(/[^0-9\-.,]/g,"").split(",");return{x:parseFloat(r[12]||r[4],0),y:parseFloat(r[13]||r[5],0)}}return{x:0,y:0}}function G(e,t){var n=window.getComputedStyle(e,null),r=n.getPropertyValue("transform")||n.getPropertyValue(B());if(r&&"none"!==r){var o=void 0,i=r.match(Al);if(i)i=i[1],o=i.split(",").map(function(e){return parseFloat(e,10)}),o[4]=t.x,o[5]=t.y,U(e,"matrix("+o.join(",")+")");else{o=r.match(Il)[1].split(",").map(function(e){return parseFloat(e,10)}),o[12]=t.x,o[13]=t.y,U(e,"matrix3d("+o.join(",")+")")}}else U(e,"translateX("+t.x+"px) translateY("+t.y+"px) translateZ(0)")}function X(e){var t=e.style.display;e.style.display="none",e.offsetHeight,e.style.display=t}function $(e,t,n){var r=n;{if("object"!==(void 0===t?"undefined":Rl(t)))return void 0!==r?("number"==typeof r&&(r+="px"),void(e.style[t]=r)):Fl(e,t);for(var o in t)t.hasOwnProperty(o)&&$(e,o,t[o])}}function J(e){var t=void 0,n=void 0,r=void 0,o=e.ownerDocument,i=o.body,a=o&&o.documentElement;return t=e.getBoundingClientRect(),n=t.left,r=t.top,n-=a.clientLeft||i.clientLeft||0,r-=a.clientTop||i.clientTop||0,{left:n,top:r}}function Z(e,t){var n=e["page"+(t?"Y":"X")+"Offset"],r="scroll"+(t?"Top":"Left");if("number"!=typeof n){var o=e.document;n=o.documentElement[r],"number"!=typeof n&&(n=o.body[r])}return n}function Q(e){return Z(e)}function ee(e){return Z(e,!0)}function te(e){var t=J(e),n=e.ownerDocument,r=n.defaultView||n.parentWindow;return t.left+=Q(r),t.top+=ee(r),t}function ne(e){return null!==e&&void 0!==e&&e==e.window}function re(e){return ne(e)?e.document:9===e.nodeType?e:e.ownerDocument}function oe(e,t,n){var r=n,o="",i=re(e);return r=r||i.defaultView.getComputedStyle(e,null),r&&(o=r.getPropertyValue(t)||r[t]),o}function ie(e,t){var n=e[Wl]&&e[Wl][t];if(Kl.test(n)&&!Bl.test(t)){var r=e.style,o=r[ql],i=e[Ul][ql];e[Ul][ql]=e[Wl][ql],r[ql]="fontSize"===t?"1em":n||0,n=r.pixelLeft+Yl,r[ql]=o,e[Ul][ql]=i}return""===n?"auto":n}function ae(e,t){return"left"===e?t.useCssRight?"right":e:t.useCssBottom?"bottom":e}function ce(e){return"left"===e?"right":"right"===e?"left":"top"===e?"bottom":"bottom"===e?"top":void 0}function se(e,t,n){"static"===$(e,"position")&&(e.style.position="relative");var r=-999,o=-999,i=ae("left",n),a=ae("top",n),c=ce(i),s=ce(a);"left"!==i&&(r=999),"top"!==a&&(o=999);var l="",u=te(e);("left"in t||"top"in t)&&(l=q(e)||"",W(e,"none")),"left"in t&&(e.style[c]="",e.style[i]=r+"px"),"top"in t&&(e.style[s]="",e.style[a]=o+"px"),X(e);var p=te(e),f={};for(var h in t)if(t.hasOwnProperty(h)){var d=ae(h,n),v="left"===h?r:o,m=u[h]-p[h];f[d]=d===h?v+m:v-m}$(e,f),X(e),("left"in t||"top"in t)&&W(e,l);var y={};for(var g in t)if(t.hasOwnProperty(g)){var b=ae(g,n),C=t[g]-u[g];y[b]=g===b?f[b]+C:f[b]-C}$(e,y)}function le(e,t){var n=te(e),r=Y(e),o={x:r.x,y:r.y};"left"in t&&(o.x=r.x+t.left-n.left),"top"in t&&(o.y=r.y+t.top-n.top),G(e,o)}function ue(e,t,n){if(n.ignoreShake){var r=te(e),o=r.left.toFixed(0),i=r.top.toFixed(0),a=t.left.toFixed(0),c=t.top.toFixed(0);if(o===a&&i===c)return}n.useCssRight||n.useCssBottom?se(e,t,n):n.useCssTransform&&B()in document.body.style?le(e,t,n):se(e,t,n)}function pe(e,t){for(var n=0;n<e.length;n++)t(e[n])}function fe(e){return"border-box"===Fl(e,"boxSizing")}function he(e,t,n){var r={},o=e.style,i=void 0;for(i in t)t.hasOwnProperty(i)&&(r[i]=o[i],o[i]=t[i]);n.call(e);for(i in t)t.hasOwnProperty(i)&&(o[i]=r[i])}function de(e,t,n){var r=0,o=void 0,i=void 0,a=void 0;for(i=0;i<t.length;i++)if(o=t[i])for(a=0;a<n.length;a++){var c=void 0;c="border"===o?""+o+n[a]+"Width":o+n[a],r+=parseFloat(Fl(e,c))||0}return r}function ve(e,t,n){var r=n;if(ne(e))return"width"===t?Zl.viewportWidth(e):Zl.viewportHeight(e);if(9===e.nodeType)return"width"===t?Zl.docWidth(e):Zl.docHeight(e);var o="width"===t?["Left","Right"]:["Top","Bottom"],i="width"===t?e.getBoundingClientRect().width:e.getBoundingClientRect().height,a=Fl(e),c=fe(e,a),s=0;(null===i||void 0===i||i<=0)&&(i=void 0,s=Fl(e,t),(null===s||void 0===s||Number(s)<0)&&(s=e.style[t]||0),s=parseFloat(s)||0),void 0===r&&(r=c?Jl:Xl);var l=void 0!==i||c,u=i||s;return r===Xl?l?u-de(e,["border","padding"],o,a):s:l?r===Jl?u:u+(r===$l?-de(e,["border"],o,a):de(e,["margin"],o,a)):s+de(e,Gl.slice(r),o,a)}function me(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];var r=void 0,o=t[0];return 0!==o.offsetWidth?r=ve.apply(void 0,t):he(o,Ql,function(){r=ve.apply(void 0,t)}),r}function ye(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function ge(e){if(tu.isWindow(e)||9===e.nodeType)return null;var t=tu.getDocument(e),n=t.body,r=void 0,o=tu.css(e,"position");if("fixed"!==o&&"absolute"!==o)return"html"===e.nodeName.toLowerCase()?null:e.parentNode;for(r=e.parentNode;r&&r!==n;r=r.parentNode)if("static"!==(o=tu.css(r,"position")))return r;return null}function be(e){if(tu.isWindow(e)||9===e.nodeType)return!1;var t=tu.getDocument(e),n=t.body,r=null;for(r=e.parentNode;r&&r!==n;r=r.parentNode){if("fixed"===tu.css(r,"position"))return!0}return!1}function Ce(e){for(var t={left:0,right:1/0,top:0,bottom:1/0},n=nu(e),r=tu.getDocument(e),o=r.defaultView||r.parentWindow,i=r.body,a=r.documentElement;n;){if(-1!==navigator.userAgent.indexOf("MSIE")&&0===n.clientWidth||n===i||n===a||"visible"===tu.css(n,"overflow")){if(n===i||n===a)break}else{var c=tu.offset(n);c.left+=n.clientLeft,c.top+=n.clientTop,t.top=Math.max(t.top,c.top),t.right=Math.min(t.right,c.left+n.clientWidth),t.bottom=Math.min(t.bottom,c.top+n.clientHeight),t.left=Math.max(t.left,c.left)}n=nu(n)}var s=null;if(!tu.isWindow(e)&&9!==e.nodeType){s=e.style.position;"absolute"===tu.css(e,"position")&&(e.style.position="fixed")}var l=tu.getWindowScrollLeft(o),u=tu.getWindowScrollTop(o),p=tu.viewportWidth(o),f=tu.viewportHeight(o),h=a.scrollWidth,d=a.scrollHeight;if(e.style&&(e.style.position=s),be(e))t.left=Math.max(t.left,l),t.top=Math.max(t.top,u),t.right=Math.min(t.right,l+p),t.bottom=Math.min(t.bottom,u+f);else{var v=Math.max(h,l+p);t.right=Math.min(t.right,v);var m=Math.max(d,u+f);t.bottom=Math.min(t.bottom,m)}return t.top>=0&&t.left>=0&&t.bottom>t.top&&t.right>t.left?t:null}function we(e,t,n,r){var o=tu.clone(e),i={width:t.width,height:t.height};return r.adjustX&&o.left<n.left&&(o.left=n.left),r.resizeWidth&&o.left>=n.left&&o.left+i.width>n.right&&(i.width-=o.left+i.width-n.right),r.adjustX&&o.left+i.width>n.right&&(o.left=Math.max(n.right-i.width,n.left)),r.adjustY&&o.top<n.top&&(o.top=n.top),r.resizeHeight&&o.top>=n.top&&o.top+i.height>n.bottom&&(i.height-=o.top+i.height-n.bottom),r.adjustY&&o.top+i.height>n.bottom&&(o.top=Math.max(n.bottom-i.height,n.top)),tu.mix(o,i)}function Se(e){var t=void 0,n=void 0,r=void 0;if(tu.isWindow(e)||9===e.nodeType){var o=tu.getWindow(e);t={left:tu.getWindowScrollLeft(o),top:tu.getWindowScrollTop(o)},n=tu.viewportWidth(o),r=tu.viewportHeight(o)}else t=tu.offset(e),n=tu.outerWidth(e),r=tu.outerHeight(e);return t.width=n,t.height=r,t}function xe(e,t){var n=t.charAt(0),r=t.charAt(1),o=e.width,i=e.height,a=e.left,c=e.top;return"c"===n?c+=i/2:"b"===n&&(c+=i),"c"===r?a+=o/2:"r"===r&&(a+=o),{left:a,top:c}}function Me(e,t,n,r,o){var i=au(t,n[1]),a=au(e,n[0]),c=[a.left-i.left,a.top-i.top];return{left:e.left-c[0]+r[0]-o[0],top:e.top-c[1]+r[1]-o[1]}}function ze(e,t,n){return e.left<n.left||e.left+t.width>n.right}function ke(e,t,n){return e.top<n.top||e.top+t.height>n.bottom}function _e(e,t,n){return e.left>n.right||e.left+t.width<n.left}function Oe(e,t,n){return e.top>n.bottom||e.top+t.height<n.top}function Ee(e,t,n){var r=[];return tu.each(e,function(e){r.push(e.replace(t,function(e){return n[e]}))}),r}function Te(e,t){return e[t]=-e[t],e}function Ne(e,t){return(/%$/.test(e)?parseInt(e.substring(0,e.length-1),10)/100*t:parseInt(e,10))||0}function Ve(e,t){e[0]=Ne(e[0],t.width),e[1]=Ne(e[1],t.height)}function Pe(e,t,n,r){var o=n.points,i=n.offset||[0,0],a=n.targetOffset||[0,0],c=n.overflow,s=n.source||e;i=[].concat(i),a=[].concat(a),c=c||{};var l={},u=0,p=ru(s),f=iu(s);Ve(i,f),Ve(a,t);var h=cu(f,t,o,i,a),d=tu.merge(f,h);if(p&&(c.adjustX||c.adjustY)&&r){if(c.adjustX&&ze(h,f,p)){var v=Ee(o,/[lr]/gi,{l:"r",r:"l"}),m=Te(i,0),y=Te(a,0);_e(cu(f,t,v,m,y),f,p)||(u=1,o=v,i=m,a=y)}if(c.adjustY&&ke(h,f,p)){var g=Ee(o,/[tb]/gi,{t:"b",b:"t"}),b=Te(i,1),C=Te(a,1);Oe(cu(f,t,g,b,C),f,p)||(u=1,o=g,i=b,a=C)}u&&(h=cu(f,t,o,i,a),tu.mix(d,h));var w=ze(h,f,p),S=ke(h,f,p);(w||S)&&(o=n.points,i=n.offset||[0,0],a=n.targetOffset||[0,0]),l.adjustX=c.adjustX&&w,l.adjustY=c.adjustY&&S,(l.adjustX||l.adjustY)&&(d=ou(h,f,p,l))}return d.width!==f.width&&tu.css(s,"width",tu.width(s)+d.width-f.width),d.height!==f.height&&tu.css(s,"height",tu.height(s)+d.height-f.height),tu.offset(s,{left:d.left,top:d.top},{useCssRight:n.useCssRight,useCssBottom:n.useCssBottom,useCssTransform:n.useCssTransform,ignoreShake:n.ignoreShake}),{points:o,offset:i,targetOffset:a,overflow:l}}function He(e){var t=ru(e),n=iu(e);return!t||n.left+n.width<=t.left||n.top+n.height<=t.top||n.left>=t.right||n.top>=t.bottom}function Le(e,t,n){var r=n.target||t,o=iu(r),i=!He(r);return su(e,o,n,i)}function De(e,t,n){var r=void 0,o=void 0,i=tu.getDocument(e),a=i.defaultView||i.parentWindow,c=tu.getWindowScrollLeft(a),s=tu.getWindowScrollTop(a),l=tu.viewportWidth(a),u=tu.viewportHeight(a);r="pageX"in t?t.pageX:c+t.clientX,o="pageY"in t?t.pageY:s+t.clientY;var p={left:r,top:o,width:0,height:0},f=r>=0&&r<=c+l&&o>=0&&o<=s+u,h=[n.points[0],"cc"];return su(e,p,uu({},n,{points:h}),f)}function Ae(e,t){function n(){o&&(clearTimeout(o),o=null)}function r(){n(),o=setTimeout(e,t)}var o=void 0;return r.clear=n,r}function Ie(e,t){return e===t||!(!e||!t)&&("pageX"in t&&"pageY"in t?e.pageX===t.pageX&&e.pageY===t.pageY:"clientX"in t&&"clientY"in t&&(e.clientX===t.clientX&&e.clientY===t.clientY))}function Re(e){return e&&"object"==typeof e&&e.window===e}function je(e){return"function"==typeof e&&e?e():null}function Fe(e){return"object"==typeof e&&e?e:null}function Ke(){}function Be(){return""}function We(){return window.document}function Ue(e){return!e.length||e.every(function(e){return!!e.props.disabled})}function qe(e,t,n){var r,o=e.getState();e.setState({activeKey:us()({},o.activeKey,(r={},r[t]=n,r))})}function Ye(e){return e.eventKey||"0-menu-"}function Ge(e,t){var n=t,r=e.children,o=e.eventKey;if(n){var i=void 0;if(H(r,function(e,t){e&&!e.props.disabled&&n===V(e,o,t)&&(i=!0)}),i)return n}return n=null,e.defaultActiveFirst?(H(r,function(e,t){n||!e||e.props.disabled||(n=V(e,o,t))}),n):n}function Xe(e){if(e){var t=this.instanceArray.indexOf(e);-1!==t?this.instanceArray[t]=e:this.instanceArray.push(e)}}function $e(e){return"string"==typeof e?e:null}function Je(e){if(!e)return null;var t=e.props;if("value"in t)return t.value;if(e.key)return e.key;if(e.type&&e.type.isSelectOptGroup&&t.label)return t.label;throw new Error("Need at least a key or a value or a label (only for OptGroup) for "+e)}function Ze(e,t){return"value"===t?Je(e):e.props[t]}function Qe(e){return e.multiple}function et(e){return e.combobox}function tt(e){return e.multiple||e.tags}function nt(e){return tt(e)||et(e)}function rt(e){return!nt(e)}function ot(e){var t=e;return void 0===e?t=[]:Array.isArray(e)||(t=[e]),t}function it(e){return typeof e+"-"+e}function at(e){e.preventDefault()}function ct(e,t){for(var n=-1,r=0;r<e.length;r++)if(e[r]===t){n=r;break}return n}function st(e,t){var n=void 0;e=ot(e);for(var r=0;r<e.length;r++)if(e[r].key===t){n=e[r].label;break}return n}function lt(e,t){if(null===t||void 0===t)return[];var n=[];return Ss.a.Children.forEach(e,function(e){if(e.type.isMenuItemGroup)n=n.concat(lt(e.props.children,t));else{var r=Je(e),o=e.key;-1!==ct(t,r)&&o&&n.push(o)}}),n}function ut(e){for(var t=0;t<e.length;t++){var n=e[t];if(n.type.isMenuItemGroup){var r=ut(n.props.children);if(r)return r}else if(!n.props.disabled)return n}return null}function pt(e,t){for(var n=0;n<t.length;++n)if(e.lastIndexOf(t[n])>0)return!0;return!1}function ft(e,t){var n=new RegExp("["+t.join()+"]");return e.split(n).filter(function(e){return e})}function ht(e,t){return!t.props.disabled&&ot(Ze(t,this.props.optionFilterProp)).join("").toLowerCase().indexOf(e.toLowerCase())>-1}function dt(e,t){if(!rt(t)&&!Qe(t)&&"string"!=typeof e)throw new Error("Invalid `value` of type `"+typeof e+"` supplied to Option, expected `string` when `tags/combobox` is `true`.")}function vt(e,t){return function(n){e[t]=n}}function mt(e,t,n){var r=ks.a.oneOfType([ks.a.string,ks.a.number]),o=ks.a.shape({key:r.isRequired,label:ks.a.node});if(!e.labelInValue){if(("multiple"===e.mode||"tags"===e.mode||e.multiple||e.tags)&&""===e[t])return new Error("Invalid prop `"+t+"` of type `string` supplied to `"+n+"`, expected `array` when `multiple` or `tags` is `true`.");return ks.a.oneOfType([ks.a.arrayOf(r),r]).apply(void 0,arguments)}if(ks.a.oneOfType([ks.a.arrayOf(o),o]).apply(void 0,arguments))return new Error("Invalid prop `"+t+"` supplied to `"+n+"`, when you set `labelInValue` to `true`, `"+t+"` should in shape of `{ key: string | number, label?: ReactNode }`.")}function yt(){}function gt(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return function(){for(var e=arguments.length,n=Array(e),r=0;r<e;r++)n[r]=arguments[r];for(var o=0;o<t.length;o++)t[o]&&"function"==typeof t[o]&&t[o].apply(this,n)}}function bt(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.scriptUrl,n=e.extraCommonProps,r=void 0===n?{}:n;if("undefined"!=typeof document&&"undefined"!=typeof window&&"function"==typeof document.createElement&&"string"==typeof t&&t.length&&!Np.has(t)){var o=document.createElement("script");o.setAttribute("src","https:"+t),o.setAttribute("data-namespace",t),Np.add(t),document.body.appendChild(o)}var i=function(e){var t=e.type,n=e.children,o=Tp(e,["type","children"]),i=null;return e.type&&(i=ws.createElement("use",{xlinkHref:"#"+t})),n&&(i=n),ws.createElement(Kp,us()({},o,r),i)};return i.displayName="Iconfont",i}function Ct(e){var t=null;return Lp.test(e)?t="filled":Dp.test(e)?t="outlined":Ap.test(e)&&(t="twoTone"),t}function wt(e){return e.replace(Lp,"").replace(Dp,"").replace(Ap,"")}function St(e,t){var n=e;return"filled"===t?n+="-fill":"outlined"===t?n+="-o":"twoTone"===t?n+="-twotone":Pp(!1,"This icon '"+e+"' has unknown theme '"+t+"'"),n}function xt(e){return Ep.setTwoToneColors({primaryColor:e})}function Mt(){return Ep.getTwoToneColors().primaryColor}function zt(e){return void 0===e||null===e?"":e}function kt(e){return"string"==typeof e}function _t(e,t){if(null!=e){var n=t?" ":"";return"string"!=typeof e&&"number"!=typeof e&&kt(e.type)&&ef(e.props.children)?ws.cloneElement(e,{},e.props.children.split("").join(n)):"string"==typeof e?(ef(e)&&(e=e.split("").join(n)),ws.createElement("span",null,e)):e}}function Ot(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=e.getAttribute("id")||e.getAttribute("data-reactid")||e.getAttribute("name");if(t&&hf[n])return hf[n];var r=window.getComputedStyle(e),o=r.getPropertyValue("box-sizing")||r.getPropertyValue("-moz-box-sizing")||r.getPropertyValue("-webkit-box-sizing"),i=parseFloat(r.getPropertyValue("padding-bottom"))+parseFloat(r.getPropertyValue("padding-top")),a=parseFloat(r.getPropertyValue("border-bottom-width"))+parseFloat(r.getPropertyValue("border-top-width")),c=ff.map(function(e){return e+":"+r.getPropertyValue(e)}).join(";"),s={sizingStyle:c,paddingSize:i,borderSize:a,boxSizing:o};return t&&n&&(hf[n]=s),s}function Et(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null;df||(df=document.createElement("textarea"),document.body.appendChild(df)),e.getAttribute("wrap")?df.setAttribute("wrap",e.getAttribute("wrap")):df.removeAttribute("wrap");var o=Ot(e,t),i=o.paddingSize,a=o.borderSize,c=o.boxSizing,s=o.sizingStyle;df.setAttribute("style",s+";"+pf),df.value=e.value||e.placeholder||"";var l=Number.MIN_SAFE_INTEGER,u=Number.MAX_SAFE_INTEGER,p=df.scrollHeight,f=void 0;if("border-box"===c?p+=a:"content-box"===c&&(p-=i),null!==n||null!==r){df.value=" ";var h=df.scrollHeight-i;null!==n&&(l=h*n,"border-box"===c&&(l=l+i+a),p=Math.max(l,p)),null!==r&&(u=h*r,"border-box"===c&&(u=u+i+a),f=p>u?"":"hidden",p=Math.min(u,p))}return r||(f="hidden"),{height:p,minHeight:l,maxHeight:u,overflowY:f}}function Tt(e){return window.requestAnimationFrame?window.requestAnimationFrame(e):window.setTimeout(e,1)}function Nt(e){window.cancelAnimationFrame?window.cancelAnimationFrame(e):window.clearTimeout(e)}function Vt(e){return e&&e.type&&(e.type.isSelectOption||e.type.isSelectOptGroup)}function Pt(e){return Object.keys(e).reduce(function(t,n){return"data-"!==n.substr(0,5)&&"aria-"!==n.substr(0,5)&&"role"!==n||"data-__"===n.substr(0,7)||(t[n]=e[n]),t},{})}function Ht(){}function Lt(){}function Dt(){return window}function At(e){return e?e.toString().split("").reverse().map(function(e){return Number(e)}):[]}function It(e,t){if(!e.breadcrumbName)return null;var n=Object.keys(t).join("|");return e.breadcrumbName.replace(new RegExp(":("+n+")","g"),function(e,n){return t[n]||e})}function Rt(e,t,n,r){var o=n.indexOf(e)===n.length-1,i=It(e,t);return o?ws.createElement("span",null,i):ws.createElement("a",{href:"#/"+r.join("/")},i)}function jt(e){var t=Wf()();return t.locale(e.locale()).utcOffset(e.utcOffset()),t}function Ft(e){return e.format("LL")}function Kt(e){return Ft(jt(e))}function Bt(e){var t=e.locale();return e.localeData()["zh-cn"===t?"months":"monthsShort"](e)}function Wt(e,t){Wf.a.isMoment(e)&&Wf.a.isMoment(t)&&(t.hour(e.hour()),t.minute(e.minute()),t.second(e.second()))}function Ut(e,t){var n=t?t(e):{};return n=us()({},$f,n)}function qt(e,t){var n=!1;if(e){var r=e.hour(),o=e.minute(),i=e.second();if(-1===t.disabledHours().indexOf(r)){if(-1===t.disabledMinutes(r).indexOf(o)){n=-1!==t.disabledSeconds(r,o).indexOf(i)}else n=!0}else n=!0}return!n}function Yt(e,t){return qt(e,Ut(e,t))}function Gt(e,t,n){return(!t||!t(e))&&!(n&&!Yt(e,n))}function Xt(e,t){return e&&t&&e.isSame(t,"day")}function $t(e,t){return e.year()<t.year()?1:e.year()===t.year()&&e.month()<t.month()}function Jt(e,t){return e.year()>t.year()?1:e.year()===t.year()&&e.month()>t.month()}function Zt(e){return"rc-calendar-"+e.year()+"-"+e.month()+"-"+e.date()}function Qt(e){var t=this.state.value.clone();t.month(e),this.setAndSelectValue(t)}function en(){}function tn(){}function nn(){return Wf()()}function rn(e){return e?jt(e):nn()}function on(){}function an(){}function cn(e){return e.default||e}function sn(){return null}function ln(e){return e<10?"0"+e:""+e}function un(e){var t=[];return Ss.a.Children.forEach(e,function(e){e&&t.push(e)}),t}function pn(e,t){for(var n=un(e),r=0;r<n.length;r++)if(n[r].key===t)return r;return-1}function fn(e,t){e.transform=t,e.webkitTransform=t,e.mozTransform=t}function hn(e){return"transform"in e||"webkitTransform"in e||"MozTransform"in e}function dn(e){return{transform:e,WebkitTransform:e,MozTransform:e}}function vn(e){return"left"===e||"right"===e}function mn(e,t){return(vn(t)?"translateY":"translateX")+"("+100*-e+"%) translateZ(0)"}function yn(e,t){var n=vn(t)?"marginTop":"marginLeft";return ss()({},n,100*-e+"%")}function gn(e,t){return+getComputedStyle(e).getPropertyValue(t).replace("px","")}function bn(e){return Object.keys(e).reduce(function(t,n){return"aria-"!==n.substr(0,5)&&"data-"!==n.substr(0,5)&&"role"!==n||(t[n]=e[n]),t},{})}function Cn(e,t){return+e.getPropertyValue(t).replace("px","")}function wn(e,t,n,r,o){var i=gn(o,"padding-"+e),a=r.parentNode.childNodes;return Array.prototype.some.call(a,function(o){if(o!==r){var a=getComputedStyle(o);return i+=Cn(a,"margin-"+e),i+=Cn(a,"margin-"+n),i+=Cn(a,t),"content-box"===a.boxSizing&&(i+=Cn(a,"border-"+e+"-width")+Cn(a,"padding-"+e)+Cn(a,"border-"+n+"-width")+Cn(a,"padding-"+n)),!1}return!0}),i}function Sn(e,t){return wn("left","width","right",e,t)}function xn(e,t){return wn("top","height","bottom",e,t)-gn(e.parentNode,"height")}function Mn(){}function zn(e){var t=void 0;return Ss.a.Children.forEach(e.children,function(e){!e||t||e.props.disabled||(t=e.key)}),t}function kn(e,t){return Ss.a.Children.map(e.children,function(e){return e&&e.key}).indexOf(t)>=0}function _n(e,t){var n=e.props.styles,r=e.props.getRef("root"),o=e.props.getRef("nav")||r,i=e.props.getRef("inkBar"),a=e.props.getRef("activeTab"),c=i.style,s=e.props.tabBarPosition;if(t&&(c.display="none"),a){var l=a,u=hn(c);if("top"===s||"bottom"===s){var p=Sn(l,o),f=l.offsetWidth;f===r.offsetWidth?f=0:n.inkBar&&void 0!==n.inkBar.width&&(f=parseFloat(n.inkBar.width,10))&&(p+=(l.offsetWidth-f)/2),u?(fn(c,"translate3d("+p+"px,0,0)"),c.width=f+"px",c.height=""):(c.left=p+"px",c.top="",c.bottom="",c.right=o.offsetWidth-p-f+"px")}else{var h=xn(l,o),d=l.offsetHeight;n.inkBar&&void 0!==n.inkBar.height&&(d=parseFloat(n.inkBar.height,10))&&(h+=(l.offsetHeight-d)/2),u?(fn(c,"translate3d(0,"+h+"px,0)"),c.height=d+"px",c.width=""):(c.left="",c.right="",c.top=h+"px",c.bottom=o.offsetHeight-h-d+"px")}}c.display=a?"block":"none"}function On(){if("undefined"!=typeof window&&window.document&&window.document.documentElement){var e=window.document.documentElement;return"flex"in e.style||"webkitFlex"in e.style||"Flex"in e.style||"msFlex"in e.style}return!1}function En(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Tn(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Nn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function Vn(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function Pn(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Hn(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Ln(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function Dn(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function An(e,t,n,r){var o=void 0;return rl(e,n,{start:function(){t?(o=e.offsetHeight,e.style.height=0):e.style.height=e.offsetHeight+"px"},active:function(){e.style.height=(t?o:0)+"px"},end:function(){e.style.height="",r()}})}function In(e){return{enter:function(t,n){return An(t,!0,e+"-anim",n)},leave:function(t,n){return An(t,!1,e+"-anim",n)}}}function Rn(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function jn(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}function Fn(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Kn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function Bn(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function Wn(e){var t=e;return Array.isArray(t)||(t=t?[t]:[]),t}function Un(e,t,n){var r=void 0,o=void 0;return rl(e,"ant-motion-collapse",{start:function(){t?(r=e.offsetHeight,e.style.height="0px",e.style.opacity="0"):(e.style.height=e.offsetHeight+"px",e.style.opacity="1")},active:function(){o&&As.a.cancel(o),o=As()(function(){e.style.height=(t?r:0)+"px",e.style.opacity=t?"1":"0"})},end:function(){o&&As.a.cancel(o),e.style.height="",e.style.opacity="",n()}})}function qn(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Yn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function Gn(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function Xn(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function $n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Jn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function Zn(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function Qn(e,t,n){return e.split(t).map(function(e,r){return 0===r?e:[ws.createElement("span",{className:n+"-menu-item-keyword",key:"seperator"},t),e]})}function er(e,t,n){return t.some(function(t){return t[n.label].indexOf(e)>-1})}function tr(e,t,n,r){return t.map(function(t,o){var i=t[r.label],a=i.indexOf(e)>-1?Qn(i,e,n):i;return 0===o?a:[" / ",a]})}function nr(e,t,n,r){function o(e){return e[r.label].indexOf(n)>-1}return e.findIndex(o)-t.findIndex(o)}function rr(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{children:e.children||"children",label:e.label||"label",value:e.value||"value"}}function or(e){return e}function ir(e){return Ss.a.Children.map(e,or)}function ar(e){var t=this.state.value.clone();t.add(e,"year"),this.setAndChangeValue(t)}function cr(){}function sr(e){var t=this.state.value.clone();t.add(e,"year"),this.setState({value:t})}function lr(e){var t=this.state.value.clone();t.year(e),t.month(this.state.value.month()),this.props.onSelect(t)}function ur(e){var t=this.state.value.clone();t.add(e,"years"),this.setState({value:t})}function pr(e,t){var n=this.state.value.clone();n.year(e),n.month(this.state.value.month()),this.props.onSelect(n),t.preventDefault()}function fr(e){var t=this.props.value.clone();t.add(e,"months"),this.props.onValueChange(t)}function hr(e){var t=this.props.value.clone();t.add(e,"years"),this.props.onValueChange(t)}function dr(e,t){return e?t:null}function vr(e){var t=e.prefixCls,n=e.locale,r=e.value,o=e.timePicker,i=e.disabled,a=e.disabledDate,c=e.onToday,s=e.text,l=(!s&&o?n.now:s)||n.today,u=a&&!Gt(jt(r),a),p=u||i,f=p?t+"-today-btn-disabled":"";return Ss.a.createElement("a",{className:t+"-today-btn "+f,role:"button",onClick:p?null:c,title:Kt(r)},l)}function mr(e){var t=e.prefixCls,n=e.locale,r=e.okDisabled,o=e.onOk,i=t+"-ok-btn";return r&&(i+=" "+t+"-ok-btn-disabled"),Ss.a.createElement("a",{className:i,role:"button",onClick:r?null:o},n.ok)}function yr(e){var t,n=e.prefixCls,r=e.locale,o=e.showTimePicker,i=e.onOpenTimePicker,a=e.onCloseTimePicker,c=e.timePickerDisabled,s=Ts()((t={},t[n+"-time-picker-btn"]=!0,t[n+"-time-picker-btn-disabled"]=c,t)),l=null;return c||(l=o?a:i),Ss.a.createElement("a",{className:s,role:"button",onClick:l},o?r.dateSelect:r.timeSelect)}function gr(e){return e.clone().startOf("month")}function br(e){return e.clone().endOf("month")}function Cr(e,t,n){return e.clone().add(t,n)}function wr(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments[1],n=arguments[2];return e.some(function(e){return e.isSame(t,n)})}function Sr(){}function xr(){}function Mr(e,t){this[e]=t}function zr(e){var t=function(t){function n(e){fs()(this,n);var t=ms()(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,e));t.renderFooter=function(){var e=t.props,n=e.prefixCls,r=e.renderExtraFooter;return r?ws.createElement("div",{className:n+"-footer-extra"},r.apply(void 0,arguments)):null},t.clearSelection=function(e){e.preventDefault(),e.stopPropagation(),t.handleChange(null)},t.handleChange=function(e){var n=t.props;"value"in n||t.setState({value:e,showDate:e}),n.onChange(e,e&&e.format(n.format)||"")},t.handleCalendarChange=function(e){t.setState({showDate:e})},t.saveInput=function(e){t.input=e};var r=e.value||e.defaultValue;if(r&&!cn(Bf).isMoment(r))throw new Error("The value/defaultValue of DatePicker or MonthPicker must be a moment object after `antd@2.0`, see: https://u.ant.design/date-picker-value");return t.state={value:r,showDate:r},t}return gs()(n,t),ds()(n,[{key:"focus",value:function(){this.input.focus()}},{key:"blur",value:function(){this.input.blur()}},{key:"render",value:function(){var t,n=this,r=this.state,o=r.value,i=r.showDate,a=Ps(this.props,["onChange"]),c=a.prefixCls,s=a.locale,l=a.localeCode,u="placeholder"in a?a.placeholder:s.lang.placeholder,p=a.showTime?a.disabledTime:null,f=Ts()((t={},ss()(t,c+"-time",a.showTime),ss()(t,c+"-month",kv===e),t));o&&l&&o.locale(l);var h={},d={},v={};a.showTime?(d={onSelect:this.handleChange},v.width=195):h={onChange:this.handleChange},"mode"in a&&(d.mode=a.mode),Pp(!("onOK"in a),"It should be `DatePicker[onOk]` or `MonthPicker[onOk]`, instead of `onOK`!");var m=ws.createElement(e,us()({},d,{disabledDate:a.disabledDate,disabledTime:p,locale:s.lang,timePicker:a.timePicker,defaultValue:a.defaultPickerValue||cn(Bf)(),dateInputPlaceholder:u,prefixCls:c,className:f,onOk:a.onOk,dateRender:a.dateRender,format:a.format,showToday:a.showToday,monthCellContentRender:a.monthCellContentRender,renderFooter:this.renderFooter,onPanelChange:a.onPanelChange,onChange:this.handleCalendarChange,value:i})),y=!a.disabled&&a.allowClear&&o?ws.createElement(Kp,{type:"close-circle",className:c+"-picker-clear",onClick:this.clearSelection,theme:"filled"}):null,g=Pt(a),b=function(e){var t=e.value;return ws.createElement("div",null,ws.createElement("input",us()({ref:n.saveInput,disabled:a.disabled,readOnly:!0,value:t&&t.format(a.format)||"",placeholder:u,className:a.pickerInputClass},g)),y,ws.createElement(Kp,{type:"calendar",className:c+"-picker-icon"}))};return ws.createElement("span",{id:a.id,className:Ts()(a.className,a.pickerClass),style:us()({},v,a.style),onFocus:a.onFocus,onBlur:a.onBlur,onMouseEnter:a.onMouseEnter,onMouseLeave:a.onMouseLeave},ws.createElement(Vv,us()({},a,h,{calendar:m,value:o,prefixCls:c+"-picker-container",style:a.popupStyle}),b))}}],[{key:"getDerivedStateFromProps",value:function(e,t){var n=null;return"value"in e&&(n={value:e.value},e.value!==t.value&&(n=us()({},n,{showDate:e.value}))),n}}]),n}(ws.Component);return t.defaultProps={prefixCls:"ant-calendar",allowClear:!0,showToday:!0},Object(Ys.polyfill)(t),t}function kr(){}function _r(e,t,n){for(var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1,o=[],i=0;i<e;i+=r)(!t||t.indexOf(i)<0||!n)&&o.push(i);return o}function Or(){}function Er(e,t){this[e]=t}function Tr(e){return{showHour:e.indexOf("H")>-1||e.indexOf("h")>-1||e.indexOf("k")>-1,showMinute:e.indexOf("m")>-1,showSecond:e.indexOf("s")>-1}}function Nr(e){var t=e.showHour,n=e.showMinute,r=e.showSecond,o=e.use12Hours,i=0;return t&&(i+=1),n&&(i+=1),r&&(i+=1),o&&(i+=1),i}function Vr(e,t){var n;return n=function(t){function n(){fs()(this,n);var t=ms()(this,(n.__proto__||Object.getPrototypeOf(n)).apply(this,arguments));return t.handleOpenChange=function(e){(0,t.props.onOpenChange)(e)},t.handleFocus=function(e){var n=t.props.onFocus;n&&n(e)},t.handleBlur=function(e){var n=t.props.onBlur;n&&n(e)},t.handleMouseEnter=function(e){var n=t.props.onMouseEnter;n&&n(e)},t.handleMouseLeave=function(e){var n=t.props.onMouseLeave;n&&n(e)},t.savePicker=function(e){t.picker=e},t.getDefaultLocale=function(){var e=us()({},em.a,t.props.locale);return e.lang=us()({},e.lang,(t.props.locale||{}).lang),e},t.renderPicker=function(n,r){var o,i=t.props,a=i.prefixCls,c=i.inputPrefixCls,s=Ts()(a+"-picker",ss()({},a+"-picker-"+i.size,!!i.size)),l=Ts()(a+"-picker-input",c,(o={},ss()(o,c+"-lg","large"===i.size),ss()(o,c+"-sm","small"===i.size),ss()(o,c+"-disabled",i.disabled),o)),u=i.showTime&&i.showTime.format||"HH:mm:ss",p=us()({},Tr(u),{format:u,use12Hours:i.showTime&&i.showTime.use12Hours}),f=Nr(p),h=a+"-time-picker-column-"+f,d=i.showTime?ws.createElement(Bv,us()({},p,i.showTime,{prefixCls:a+"-time-picker",className:h,placeholder:n.timePickerLocale.placeholder,transitionName:"slide-up"})):null;return ws.createElement(e,us()({},i,{ref:t.savePicker,pickerClass:s,pickerInputClass:l,locale:n,localeCode:r,timePicker:d,onOpenChange:t.handleOpenChange,onFocus:t.handleFocus,onBlur:t.handleBlur,onMouseEnter:t.handleMouseEnter,onMouseLeave:t.handleMouseLeave}))},t}return gs()(n,t),ds()(n,[{key:"componentDidMount",value:function(){var e=this.props,t=e.autoFocus,n=e.disabled;t&&!n&&this.focus()}},{key:"focus",value:function(){this.picker.focus()}},{key:"blur",value:function(){this.picker.blur()}},{key:"render",value:function(){return ws.createElement(xp,{componentName:"DatePicker",defaultLocale:this.getDefaultLocale},this.renderPicker)}}]),n}(ws.Component),n.defaultProps={format:t||"YYYY-MM-DD",transitionName:"slide-up",popupStyle:{},onChange:function(){},onOk:function(){},onOpenChange:function(){},locale:{},prefixCls:"ant-calendar",inputPrefixCls:"ant-input"},n}function Pr(){}function Hr(e){return Array.isArray(e)&&(0===e.length||e.every(function(e){return!e}))}function Lr(e,t){if(e===t)return!0;if(null===e||void 0===e||null===t||void 0===t)return!1;if(e.length!==t.length)return!1;for(var n=0;n<e.length;++n)if(e[n]!==t[n])return!1;return!0}function Dr(e){var t=e[0],n=e[1];return[t,n&&n.isSame(t,"month")?n.clone().add(1,"month"):n]}function Ar(e,t){var n=e.selectedValue||t&&e.defaultSelectedValue,r=e.value||t&&e.defaultValue,o=Dr(r?r:n);return Hr(o)?t&&[Wf()(),Wf()().add(1,"months")]:o}function Ir(e,t){for(var n=t?t().concat():[],r=0;r<e;r++)-1===n.indexOf(r)&&n.push(r);return n}function Rr(e,t){if(t){var n=this.state.selectedValue,r=n.concat(),o="left"===e?0:1;r[o]=t,r[0]&&this.compare(r[0],r[1])>0&&(r[1-o]=this.state.showTimePicker?r[o]:void 0),this.props.onInputSelect(r),this.fireSelectValueChange(r)}}function jr(e){var t=Kf()(e,2),n=t[0],r=t[1];if(n||r){return[n,r&&r.isSame(n,"month")?r.clone().add(1,"month"):r]}}function Fr(e,t){return e&&e.format(t)||""}function Kr(e){if(e)return Array.isArray(e)?e:[e,e.clone().add(1,"month")]}function Br(e){return!!Array.isArray(e)&&(0===e.length||e.every(function(e){return!e}))}function Wr(e,t){t&&e&&0!==e.length&&(e[0]&&e[0].locale(t),e[1]&&e[1].locale(t))}function Ur(e,t){return e&&e.format(t)||""}function qr(e){var t,n=e.prefixCls,r=void 0===n?"ant":n,o=e.type,i=void 0===o?"horizontal":o,a=e.orientation,c=void 0===a?"":a,s=e.className,l=e.children,u=e.dashed,p=gm(e,["prefixCls","type","orientation","className","children","dashed"]),f=c.length>0?"-"+c:c,h=Ts()(s,r+"-divider",r+"-divider-"+i,(t={},ss()(t,r+"-divider-with-text"+f,l),ss()(t,r+"-divider-dashed",!!u),t));return ws.createElement("div",us()({className:h},p),l&&ws.createElement("span",{className:r+"-divider-inner-text"},l))}function Yr(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function Gr(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Xr(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function $r(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function Jr(e){if(e||void 0===Lm){var t=document.createElement("div");t.style.width="100%",t.style.height="200px";var n=document.createElement("div"),r=n.style;r.position="absolute",r.top=0,r.left=0,r.pointerEvents="none",r.visibility="hidden",r.width="200px",r.height="150px",r.overflow="hidden",n.appendChild(t),document.body.appendChild(n);var o=t.offsetWidth;n.style.overflow="scroll";var i=t.offsetWidth;o===i&&(i=n.clientWidth),document.body.removeChild(n),Lm=o-i}return Lm}function Zr(e){return Array.isArray(e)?e:[e]}function Qr(e,t,n,r){e.addEventListener?e.addEventListener(t,n,r):e.attachEvent&&e.attachEvent("on"+t,n)}function eo(e,t,n,r){e.removeEventListener?e.removeEventListener(t,n,r):e.attachEvent&&e.detachEvent("on"+t,n)}function to(e,t){var n=void 0;return n="function"==typeof e?e(t):e,Array.isArray(n)?2===n.length?n:[n[0],n[1]]:[n]}function no(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];var r=1,o=t[0],i=t.length;if("function"==typeof o)return o.apply(null,t.slice(1));if("string"==typeof o){for(var a=String(o).replace(ty,function(e){if("%%"===e)return"%";if(r>=i)return e;switch(e){case"%s":return String(t[r++]);case"%d":return Number(t[r++]);case"%j":try{return JSON.stringify(t[r++])}catch(e){return"[Circular]"}break;default:return e}}),c=t[r];r<i;c=t[++r])a+=" "+c;return a}return o}function ro(e){return"string"===e||"url"===e||"hex"===e||"email"===e||"pattern"===e}function oo(e,t){return void 0===e||null===e||(!("array"!==t||!Array.isArray(e)||e.length)||!(!ro(t)||"string"!=typeof e||e))}function io(e,t,n){function r(e){o.push.apply(o,e),++i===a&&n(o)}var o=[],i=0,a=e.length;e.forEach(function(e){t(e,r)})}function ao(e,t,n){function r(a){if(a&&a.length)return void n(a);var c=o;o+=1,c<i?t(e[c],r):n([])}var o=0,i=e.length;r([])}function co(e){var t=[];return Object.keys(e).forEach(function(n){t.push.apply(t,e[n])}),t}function so(e,t,n,r){if(t.first){return ao(co(e),n,r)}var o=t.firstFields||[];!0===o&&(o=Object.keys(e));var i=Object.keys(e),a=i.length,c=0,s=[],l=function(e){s.push.apply(s,e),++c===a&&r(s)};i.forEach(function(t){var r=e[t];-1!==o.indexOf(t)?ao(r,n,l):io(r,n,l)})}function lo(e){return function(t){return t&&t.message?(t.field=t.field||e.fullField,t):{message:t,field:t.field||e.fullField}}}function uo(e,t){if(t)for(var n in t)if(t.hasOwnProperty(n)){var r=t[n];"object"===(void 0===r?"undefined":Cs()(r))&&"object"===Cs()(e[n])?e[n]=us()({},e[n],r):e[n]=r}return e}function po(e,t,n,r,o,i){!e.required||n.hasOwnProperty(e.field)&&!oo(t,i||e.type)||r.push(no(o.messages.required,e.fullField))}function fo(e,t,n,r,o){(/^\s+$/.test(t)||""===t)&&r.push(no(o.messages.whitespace,e.fullField))}function ho(e,t,n,r,o){if(e.required&&void 0===t)return void ry(e,t,n,r,o);var i=["integer","float","array","regexp","object","method","email","number","date","url","hex"],a=e.type;i.indexOf(a)>-1?ay[a](t)||r.push(no(o.messages.types[a],e.fullField,e.type)):a&&(void 0===t?"undefined":Cs()(t))!==e.type&&r.push(no(o.messages.types[a],e.fullField,e.type))}function vo(e,t,n,r,o){var i="number"==typeof e.len,a="number"==typeof e.min,c="number"==typeof e.max,s=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,l=t,u=null,p="number"==typeof t,f="string"==typeof t,h=Array.isArray(t);if(p?u="number":f?u="string":h&&(u="array"),!u)return!1;h&&(l=t.length),f&&(l=t.replace(s,"_").length),i?l!==e.len&&r.push(no(o.messages[u].len,e.fullField,e.len)):a&&!c&&l<e.min?r.push(no(o.messages[u].min,e.fullField,e.min)):c&&!a&&l>e.max?r.push(no(o.messages[u].max,e.fullField,e.max)):a&&c&&(l<e.min||l>e.max)&&r.push(no(o.messages[u].range,e.fullField,e.min,e.max))}function mo(e,t,n,r,o){e[ly]=Array.isArray(e[ly])?e[ly]:[],-1===e[ly].indexOf(t)&&r.push(no(o.messages[ly],e.fullField,e[ly].join(", ")))}function yo(e,t,n,r,o){if(e.pattern)if(e.pattern instanceof RegExp)e.pattern.lastIndex=0,e.pattern.test(t)||r.push(no(o.messages.pattern.mismatch,e.fullField,t,e.pattern));else if("string"==typeof e.pattern){var i=new RegExp(e.pattern);i.test(t)||r.push(no(o.messages.pattern.mismatch,e.fullField,t,e.pattern))}}function go(e,t,n,r,o){var i=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if(oo(t,"string")&&!e.required)return n();fy.required(e,t,r,i,o,"string"),oo(t,"string")||(fy.type(e,t,r,i,o),fy.range(e,t,r,i,o),fy.pattern(e,t,r,i,o),!0===e.whitespace&&fy.whitespace(e,t,r,i,o))}n(i)}function bo(e,t,n,r,o){var i=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if(oo(t)&&!e.required)return n();fy.required(e,t,r,i,o),void 0!==t&&fy.type(e,t,r,i,o)}n(i)}function Co(e,t,n,r,o){var i=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if(oo(t)&&!e.required)return n();fy.required(e,t,r,i,o),void 0!==t&&(fy.type(e,t,r,i,o),fy.range(e,t,r,i,o))}n(i)}function wo(e,t,n,r,o){var i=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if(oo(t)&&!e.required)return n();fy.required(e,t,r,i,o),void 0!==t&&fy.type(e,t,r,i,o)}n(i)}function So(e,t,n,r,o){var i=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if(oo(t)&&!e.required)return n();fy.required(e,t,r,i,o),oo(t)||fy.type(e,t,r,i,o)}n(i)}function xo(e,t,n,r,o){var i=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if(oo(t)&&!e.required)return n();fy.required(e,t,r,i,o),void 0!==t&&(fy.type(e,t,r,i,o),fy.range(e,t,r,i,o))}n(i)}function Mo(e,t,n,r,o){var i=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if(oo(t)&&!e.required)return n();fy.required(e,t,r,i,o),void 0!==t&&(fy.type(e,t,r,i,o),fy.range(e,t,r,i,o))}n(i)}function zo(e,t,n,r,o){var i=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if(oo(t,"array")&&!e.required)return n();fy.required(e,t,r,i,o,"array"),oo(t,"array")||(fy.type(e,t,r,i,o),fy.range(e,t,r,i,o))}n(i)}function ko(e,t,n,r,o){var i=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if(oo(t)&&!e.required)return n();fy.required(e,t,r,i,o),void 0!==t&&fy.type(e,t,r,i,o)}n(i)}function _o(e,t,n,r,o){var i=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if(oo(t)&&!e.required)return n();fy.required(e,t,r,i,o),t&&fy[Sy](e,t,r,i,o)}n(i)}function Oo(e,t,n,r,o){var i=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if(oo(t,"string")&&!e.required)return n();fy.required(e,t,r,i,o),oo(t,"string")||fy.pattern(e,t,r,i,o)}n(i)}function Eo(e,t,n,r,o){var i=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if(oo(t)&&!e.required)return n();if(fy.required(e,t,r,i,o),!oo(t)){var a=void 0;a="number"==typeof t?new Date(t):t,fy.type(e,a,r,i,o),a&&fy.range(e,a.getTime(),r,i,o)}}n(i)}function To(e,t,n,r,o){var i=[],a=Array.isArray(t)?"array":void 0===t?"undefined":Cs()(t);fy.required(e,t,r,i,o,a),n(i)}function No(e,t,n,r,o){var i=e.type,a=[];if(e.required||!e.required&&r.hasOwnProperty(e.field)){if(oo(t,i)&&!e.required)return n();fy.required(e,t,r,a,o,i),oo(t,i)||fy.type(e,t,r,a,o)}n(a)}function Vo(){return{default:"Validation error on field %s",required:"%s is required",enum:"%s must be one of %s",whitespace:"%s cannot be empty",date:{format:"%s date %s is invalid for format %s",parse:"%s date could not be parsed, %s is invalid ",invalid:"%s date %s is invalid"},types:{string:"%s is not a %s",method:"%s is not a %s (function)",array:"%s is not an %s",object:"%s is not an %s",number:"%s is not a %s",date:"%s is not a %s",boolean:"%s is not a %s",integer:"%s is not an %s",float:"%s is not a %s",regexp:"%s is not a valid %s",email:"%s is not a valid %s",url:"%s is not a valid %s",hex:"%s is not a valid %s"},string:{len:"%s must be exactly %s characters",min:"%s must be at least %s characters",max:"%s cannot be longer than %s characters",range:"%s must be between %s and %s characters"},number:{len:"%s must equal %s",min:"%s cannot be less than %s",max:"%s cannot be greater than %s",range:"%s must be between %s and %s"},array:{len:"%s must be exactly %s in length",min:"%s cannot be less than %s in length",max:"%s cannot be greater than %s in length",range:"%s must be between %s and %s in length"},pattern:{mismatch:"%s value %s does not match pattern %s"},clone:function(){var e=JSON.parse(JSON.stringify(this));return e.clone=this.clone,e}}}function Po(e){this.rules=null,this._messages=Ey,this.define(e)}function Ho(e){return e instanceof Ly}function Lo(e){return Ho(e)?e:new Ly(e)}function Do(e){return e.displayName||e.name||"WrappedComponent"}function Ao(e,t){return e.displayName="Form("+Do(t)+")",e.WrappedComponent=t,Ay()(e,t)}function Io(e){return e}function Ro(e){return Array.prototype.concat.apply([],e)}function jo(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments[1],n=arguments[2],r=arguments[3],o=arguments[4];if(n(e,t))o(e,t);else{if(void 0===t||null===t)return;if(Array.isArray(t))t.forEach(function(t,i){return jo(e+"["+i+"]",t,n,r,o)});else{if("object"!==(void 0===t?"undefined":Cs()(t)))return void Hh()(!1,r);Object.keys(t).forEach(function(i){var a=t[i];jo(e+(e?".":"")+i,a,n,r,o)})}}}function Fo(e,t,n){var r={};return jo(void 0,e,t,n,function(e,t){r[e]=t}),r}function Ko(e,t,n){var r=e.map(function(e){var t=us()({},e,{trigger:e.trigger||[]});return"string"==typeof t.trigger&&(t.trigger=[t.trigger]),t});return t&&r.push({trigger:n?[].concat(n):[],rules:t}),r}function Bo(e){return e.filter(function(e){return!!e.rules&&e.rules.length}).map(function(e){return e.trigger}).reduce(function(e,t){return e.concat(t)},[])}function Wo(e){if(!e||!e.target)return e;var t=e.target;return"checkbox"===t.type?t.checked:t.value}function Uo(e){return e?e.map(function(e){return e&&e.message?e.message:e}):e}function qo(e,t,n){var r=e,o=t,i=n;return void 0===n&&("function"==typeof r?(i=r,o={},r=void 0):Array.isArray(r)?"function"==typeof o?(i=o,o={}):o=o||{}:(i=o,o=r||{},r=void 0)),{names:r,options:o,callback:i}}function Yo(e){return 0===Object.keys(e).length}function Go(e){return!!e&&e.some(function(e){return e.rules&&e.rules.length})}function Xo(e,t){return 0===e.lastIndexOf(t,0)}function $o(e,t){return 0===t.indexOf(e)&&-1!==[".","["].indexOf(t[e.length])}function Jo(e){return new Iy(e)}function Zo(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=e.validateMessages,r=e.onFieldsChange,o=e.onValuesChange,i=e.mapProps,a=void 0===i?Io:i,c=e.mapPropsToFields,s=e.fieldNameProp,l=e.fieldMetaProp,u=e.fieldDataProp,p=e.formPropName,f=void 0===p?"form":p,h=e.withRef;return function(e){return Ao(qf()({displayName:"Form",mixins:t,getInitialState:function(){var e=this,t=c&&c(this.props);return this.fieldsStore=Jo(t||{}),this.instances={},this.cachedBind={},this.clearedFieldMetaCache={},["getFieldsValue","getFieldValue","setFieldsInitialValue","getFieldsError","getFieldError","isFieldValidating","isFieldsValidating","isFieldsTouched","isFieldTouched"].forEach(function(t){return e[t]=function(){var n;return(n=e.fieldsStore)[t].apply(n,arguments)}}),{submitting:!1}},componentWillReceiveProps:function(e){c&&this.fieldsStore.updateFields(c(e))},onCollectCommon:function(e,t,n){var r=this.fieldsStore.getFieldMeta(e);if(r[t])r[t].apply(r,Ls()(n));else if(r.originalProps&&r.originalProps[t]){var i;(i=r.originalProps)[t].apply(i,Ls()(n))}var a=r.getValueFromEvent?r.getValueFromEvent.apply(r,Ls()(n)):Wo.apply(void 0,Ls()(n));if(o&&a!==this.fieldsStore.getFieldValue(e)){var c=this.fieldsStore.getAllValues(),s={};c[e]=a,Object.keys(c).forEach(function(e){return Hy()(s,e,c[e])}),o(this.props,Hy()({},e,a),s)}var l=this.fieldsStore.getField(e);return{name:e,field:us()({},l,{value:a,touched:!0}),fieldMeta:r}},onCollect:function(e,t){for(var n=arguments.length,r=Array(n>2?n-2:0),o=2;o<n;o++)r[o-2]=arguments[o];var i=this.onCollectCommon(e,t,r),a=i.name,c=i.field,s=i.fieldMeta,l=s.validate,u=us()({},c,{dirty:Go(l)});this.setFields(ss()({},a,u))},onCollectValidate:function(e,t){for(var n=arguments.length,r=Array(n>2?n-2:0),o=2;o<n;o++)r[o-2]=arguments[o];var i=this.onCollectCommon(e,t,r),a=i.field,c=i.fieldMeta,s=us()({},a,{dirty:!0});this.validateFieldsInternal([s],{action:t,options:{firstFields:!!c.validateFirst}})},getCacheBind:function(e,t,n){this.cachedBind[e]||(this.cachedBind[e]={});var r=this.cachedBind[e];return r[t]||(r[t]=n.bind(this,e,t)),r[t]},recoverClearedField:function(e){this.clearedFieldMetaCache[e]&&(this.fieldsStore.setFields(ss()({},e,this.clearedFieldMetaCache[e].field)),this.fieldsStore.setFieldMeta(e,this.clearedFieldMetaCache[e].meta),delete this.clearedFieldMetaCache[e])},getFieldDecorator:function(e,t){var n=this,r=this.getFieldProps(e,t);return function(t){var o=n.fieldsStore.getFieldMeta(e),i=t.props;return o.originalProps=i,o.ref=t.ref,Ss.a.cloneElement(t,us()({},r,n.fieldsStore.getFieldValuePropValue(o)))}},getFieldProps:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!e)throw new Error("Must call `getFieldProps` with valid name string!");delete this.clearedFieldMetaCache[e];var r=us()({name:e,trigger:jy,valuePropName:"value",validate:[]},n),o=r.rules,i=r.trigger,a=r.validateTrigger,c=void 0===a?i:a,p=r.validate,f=this.fieldsStore.getFieldMeta(e);"initialValue"in r&&(f.initialValue=r.initialValue);var h=us()({},this.fieldsStore.getFieldValuePropValue(r),{ref:this.getCacheBind(e,e+"__ref",this.saveRef)});s&&(h[s]=e);var d=Ko(p,o,c),v=Bo(d);v.forEach(function(n){h[n]||(h[n]=t.getCacheBind(e,n,t.onCollectValidate))}),i&&-1===v.indexOf(i)&&(h[i]=this.getCacheBind(e,i,this.onCollect));var m=us()({},f,r,{validate:d});return this.fieldsStore.setFieldMeta(e,m),l&&(h[l]=m),u&&(h[u]=this.fieldsStore.getField(e)),h},getFieldInstance:function(e){return this.instances[e]},getRules:function(e,t){return Ro(e.validate.filter(function(e){return!t||e.trigger.indexOf(t)>=0}).map(function(e){return e.rules}))},setFields:function(e,t){var n=this,o=this.fieldsStore.flattenRegisteredFields(e);if(this.fieldsStore.setFields(o),r){var i=Object.keys(o).reduce(function(e,t){return Hy()(e,t,n.fieldsStore.getField(t))},{});r(this.props,i,this.fieldsStore.getNestedAllFields())}this.forceUpdate(t)},resetFields:function(e){var t=this,n=this.fieldsStore.resetFields(e);if(Object.keys(n).length>0&&this.setFields(n),e){(Array.isArray(e)?e:[e]).forEach(function(e){return delete t.clearedFieldMetaCache[e]})}else this.clearedFieldMetaCache={}},setFieldsValue:function(e,t){var n=this.fieldsStore.fieldsMeta,r=this.fieldsStore.flattenRegisteredFields(e),i=Object.keys(r).reduce(function(e,t){var o=n[t];if(o){var i=r[t];e[t]={value:i}}return e},{});if(this.setFields(i,t),o){var a=this.fieldsStore.getAllValues();o(this.props,e,a)}},saveRef:function(e,t,n){if(!n)return this.clearedFieldMetaCache[e]={field:this.fieldsStore.getField(e),meta:this.fieldsStore.getFieldMeta(e)},this.fieldsStore.clearField(e),delete this.instances[e],void delete this.cachedBind[e];this.recoverClearedField(e);var r=this.fieldsStore.getFieldMeta(e);if(r){var o=r.ref;if(o){if("string"==typeof o)throw new Error("can not set ref string for "+e);o(n)}}this.instances[e]=n},validateFieldsInternal:function(e,t,r){var o=this,i=t.fieldNames,a=t.action,c=t.options,s=void 0===c?{}:c,l={},u={},p={},f={};if(e.forEach(function(e){var t=e.name;if(!0!==s.force&&!1===e.dirty)return void(e.errors&&Hy()(f,t,{errors:e.errors}));var n=o.fieldsStore.getFieldMeta(t),r=us()({},e);r.errors=void 0,r.validating=!0,r.dirty=!0,l[t]=o.getRules(n,a),u[t]=r.value,p[t]=r}),this.setFields(p),Object.keys(u).forEach(function(e){u[e]=o.fieldsStore.getFieldValue(e)}),r&&Yo(p))return void r(Yo(f)?null:f,this.fieldsStore.getFieldsValue(i));var h=new Ty(l);n&&h.messages(n),h.validate(u,s,function(e){var t=us()({},f);e&&e.length&&e.forEach(function(e){var n=e.field,r=Vy()(t,n);("object"!==(void 0===r?"undefined":Cs()(r))||Array.isArray(r))&&Hy()(t,n,{errors:[]}),Vy()(t,n.concat(".errors")).push(e)});var n=[],a={};Object.keys(l).forEach(function(e){var r=Vy()(t,e),i=o.fieldsStore.getField(e);i.value!==u[e]?n.push({name:e}):(i.errors=r&&r.errors,i.value=u[e],i.validating=!1,i.dirty=!1,a[e]=i)}),o.setFields(a),r&&(n.length&&n.forEach(function(e){var n=e.name,r=[{message:n+" need to revalidate",field:n}];Hy()(t,n,{expired:!0,errors:r})}),r(Yo(t)?null:t,o.fieldsStore.getFieldsValue(i)))})},validateFields:function(e,t,n){var r=this,o=qo(e,t,n),i=o.names,a=o.callback,c=o.options,s=i?this.fieldsStore.getValidFieldsFullName(i):this.fieldsStore.getValidFieldsName(),l=s.filter(function(e){return Go(r.fieldsStore.getFieldMeta(e).validate)}).map(function(e){var t=r.fieldsStore.getField(e);return t.value=r.fieldsStore.getFieldValue(e),t});if(!l.length)return void(a&&a(null,this.fieldsStore.getFieldsValue(s)));"firstFields"in c||(c.firstFields=s.filter(function(e){return!!r.fieldsStore.getFieldMeta(e).validateFirst})),this.validateFieldsInternal(l,{fieldNames:s,options:c},a)},isSubmitting:function(){return this.state.submitting},submit:function(e){var t=this,n=function(){t.setState({submitting:!1})};this.setState({submitting:!0}),e(n)},render:function(){var t=this.props,n=t.wrappedComponentRef,r=kl()(t,["wrappedComponentRef"]),o=ss()({},f,this.getForm());h?o.ref="wrappedComponent":n&&(o.ref=n);var i=a.call(this,us()({},o,r));return Ss.a.createElement(e,i)}}),e)}}function Qo(e,t){var n=window.getComputedStyle,r=n?n(e):e.currentStyle;if(r)return r[t.replace(/-(\w)/gi,function(e,t){return t.toUpperCase()})]}function ei(e){for(var t=e,n=void 0;"body"!==(n=t.nodeName.toLowerCase());){var r=Qo(t,"overflowY");if(t!==e&&("auto"===r||"scroll"===r)&&t.scrollHeight>t.clientHeight)return t;t=t.parentNode}return"body"===n?t.ownerDocument:t}function ti(e){return Fy(us()({},e),[By])}function ni(){}function ri(e){e.preventDefault()}function oi(e){return e.replace(/[^\w\.-]+/g,"")}function ii(e){return function(t){return function(n){function r(){return fs()(this,r),ms()(this,(r.__proto__||Object.getPrototypeOf(r)).apply(this,arguments))}return gs()(r,n),ds()(r,[{key:"render",value:function(){var n=e.prefixCls;return ws.createElement(t,us()({prefixCls:n},this.props))}}]),r}(ws.Component)}}function ai(e){var t=e.prefixCls,n=e.indicator,r=t+"-dot";return ws.isValidElement(n)?ws.cloneElement(n,{className:Ts()(n.props.className,r)}):ws.isValidElement(Eg)?ws.cloneElement(Eg,{className:Ts()(Eg.props.className,r)}):ws.createElement("span",{className:Ts()(r,t+"-dot-spin")},ws.createElement("i",null),ws.createElement("i",null),ws.createElement("i",null),ws.createElement("i",null))}function ci(e,t){return!!e&&!!t&&!isNaN(Number(t))}function si(){}function li(e){return"number"==typeof e&&isFinite(e)&&Math.floor(e)===e}function ui(e,t,n){return n}function pi(e,t){return e[t]&&Math.floor(24/e[t])}function fi(e){nb=e?us()({},nb,e):us()({},Mp.a.Modal)}function hi(){return nb}function di(e){e&&e.locale?cn(Bf).locale(e.locale):cn(Bf).locale("en")}function vi(){return"rcNotification_"+sb+"_"+cb++}function mi(e){if(db)return void e(db);pb.newInstance({prefixCls:mb,transitionName:yb,style:{top:hb},getContainer:gb,maxCount:bb},function(t){if(db)return void e(db);db=t,e(t)})}function yi(e){var t=void 0!==e.duration?e.duration:fb,n={info:"info-circle",success:"check-circle",error:"close-circle",warning:"exclamation-circle",loading:"loading"}[e.type],r=vb++,o=new Promise(function(o){var i=function(){return"function"==typeof e.onClose&&e.onClose(),o(!0)};mi(function(o){var a=ws.createElement(Kp,{type:n,theme:"loading"===n?"outlined":"filled"});o.notice({key:r,duration:t,style:{},content:ws.createElement("div",{className:mb+"-custom-content"+(e.type?" "+mb+"-"+e.type:"")},e.icon?e.icon:n?a:"",ws.createElement("span",null,e.content)),onClose:i})})}),i=function(){db&&db.removeNotice(r)};return i.then=function(e,t){return o.then(e,t)},i.promise=o,i}function gi(e){return"boolean"==typeof e?e?Vb:Pb:us()({},Pb,e)}function bi(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.arrowWidth,n=void 0===t?5:t,r=e.horizontalArrowShift,o=void 0===r?16:r,i=e.verticalArrowShift,a=void 0===i?12:i,c=e.autoAdjustOverflow,s=void 0===c||c,l={left:{points:["cr","cl"],offset:[-4,0]},right:{points:["cl","cr"],offset:[4,0]},top:{points:["bc","tc"],offset:[0,-4]},bottom:{points:["tc","bc"],offset:[0,4]},topLeft:{points:["bl","tc"],offset:[-(o+n),-4]},leftTop:{points:["tr","cl"],offset:[-4,-(a+n)]},topRight:{points:["br","tc"],offset:[o+n,-4]},rightTop:{points:["tl","cr"],offset:[4,-(a+n)]},bottomRight:{points:["tr","bc"],offset:[o+n,4]},rightBottom:{points:["bl","cr"],offset:[4,a+n]},bottomLeft:{points:["tl","bc"],offset:[-(o+n),4]},leftBottom:{points:["br","cl"],offset:[-4,a+n]}};return Object.keys(l).forEach(function(t){l[t]=e.arrowPointAtCenter?us()({},l[t],{overflow:gi(s),targetOffset:Hb}):us()({},kb[t],{overflow:gi(s)})}),l}function Ci(e,t){var n=e["page"+(t?"Y":"X")+"Offset"],r="scroll"+(t?"Top":"Left");if("number"!=typeof n){var o=e.document;n=o.documentElement[r],"number"!=typeof n&&(n=o.body[r])}return n}function wi(e,t){var n=e.style;["Webkit","Moz","Ms","ms"].forEach(function(e){n[e+"TransformOrigin"]=t}),n.transformOrigin=t}function Si(e){var t=e.getBoundingClientRect(),n={left:t.left,top:t.top},r=e.ownerDocument,o=r.defaultView||r.parentWindow;return n.left+=Ci(o),n.top+=Ci(o,!0),n}function xi(e){function t(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];a=us()({},a,{visible:!1,afterClose:r.bind.apply(r,[this].concat(t))}),iC?o(a):r.apply(void 0,t)}function n(e){a=us()({},a,e),o(a)}function r(){xs.unmountComponentAtNode(i)&&i.parentNode&&i.parentNode.removeChild(i);for(var t=arguments.length,n=Array(t),r=0;r<t;r++)n[r]=arguments[r];var o=n&&n.length&&n.some(function(e){return e&&e.triggerCancel});e.onCancel&&o&&e.onCancel.apply(e,n)}function o(e){xs.render(ws.createElement(aC,e),i)}var i=document.createElement("div");document.body.appendChild(i);var a=us()({},e,{close:t,visible:!0});return o(a),{destroy:t,update:n}}function Mi(e){var t=e.duration,n=e.placement,r=e.bottom,o=e.top,i=e.getContainer;void 0!==t&&(lC=t),void 0!==n&&(fC=n),void 0!==r&&(pC=r),void 0!==o&&(uC=o),void 0!==i&&(hC=i)}function zi(e){var t=void 0;switch(e){case"topLeft":t={left:0,top:uC,bottom:"auto"};break;case"topRight":t={right:0,top:uC,bottom:"auto"};break;case"bottomLeft":t={left:0,top:"auto",bottom:pC};break;default:t={right:0,top:"auto",bottom:pC}}return t}function ki(e,t,n){var r=e+"-"+t;if(sC[r])return void n(sC[r]);pb.newInstance({prefixCls:e,className:e+"-"+t,style:zi(t),getContainer:hC,closeIcon:ws.createElement(Kp,{className:e+"-close-icon",type:"close"})},function(e){sC[r]=e,n(e)})}function _i(e){var t=e.prefixCls||"ant-notification",n=t+"-notice",r=void 0===e.duration?lC:e.duration,o=null;if(e.icon)o=ws.createElement("span",{className:n+"-icon"},e.icon);else if(e.type){var i=dC[e.type];o=ws.createElement(Kp,{className:n+"-icon "+n+"-icon-"+e.type,type:i})}var a=!e.description&&o?ws.createElement("span",{className:n+"-message-single-line-auto-margin"}):null;ki(t,e.placement||fC,function(t){t.notice({content:ws.createElement("div",{className:o?n+"-with-icon":""},o,ws.createElement("div",{className:n+"-message"},a,e.message),ws.createElement("div",{className:n+"-description"},e.description),e.btn?ws.createElement("span",{className:n+"-btn"},e.btn):null),duration:r,closable:!0,onClose:e.onClose,key:e.key,style:e.style||{},className:e.className})})}function Oi(e,t){var n=t?e.pageYOffset:e.pageXOffset,r=t?"scrollTop":"scrollLeft";if("number"!=typeof n){var o=e.document;n=o.documentElement[r],"number"!=typeof n&&(n=o.body[r])}return n}function Ei(e){var t=void 0,n=void 0,r=void 0,o=e.ownerDocument,i=o.body,a=o&&o.documentElement;return t=e.getBoundingClientRect(),n=t.left,r=t.top,n-=a.clientLeft||i.clientLeft||0,r-=a.clientTop||i.clientTop||0,{left:n,top:r}}function Ti(e){var t=Ei(e),n=e.ownerDocument,r=n.defaultView||n.parentWindow;return t.left+=Oi(r),t.left}function Ni(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Vi(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function Pi(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function Hi(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Li(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function Di(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function Ai(){}function Ii(e){return e&&"object"===(void 0===e?"undefined":Cs()(e))?e:{}}function Ri(e,t){return e&&!t?{shape:"square"}:{shape:"circle"}}function ji(e,t){return!e&&t?{width:"38%"}:e&&t?{width:"50%"}:{}}function Fi(e,t){var n={};return e&&t||(n.width="61%"),n.rows=!e&&t?3:2,n}function Ki(e,t){return Object.keys(t).some(function(n){return e.target===Object(xs.findDOMNode)(t[n])})}function Bi(e,t){var n=t.min,r=t.max;return e<n||e>r}function Wi(e){return e.touches.length>1||"touchend"===e.type.toLowerCase()&&e.touches.length>0}function Ui(e,t){var n=t.marks,r=t.step,o=t.min,i=Object.keys(n).map(parseFloat);if(null!==r){var a=Math.round((e-o)/r)*r+o;i.push(a)}var c=i.map(function(t){return Math.abs(e-t)});return i[c.indexOf(Math.min.apply(Math,Ls()(c)))]}function qi(e){var t=e.toString(),n=0;return t.indexOf(".")>=0&&(n=t.length-t.indexOf(".")-1),n}function Yi(e,t){return e?t.clientY:t.pageX}function Gi(e,t){return e?t.touches[0].clientY:t.touches[0].pageX}function Xi(e,t){var n=t.getBoundingClientRect();return e?n.top+.5*n.height:n.left+.5*n.width}function $i(e,t){var n=t.max,r=t.min;return e<=r?r:e>=n?n:e}function Ji(e,t){var n=t.step,r=Ui(e,t);return null===n?r:parseFloat(r.toFixed(qi(n)))}function Zi(e){e.stopPropagation(),e.preventDefault()}function Qi(e){switch(e.keyCode){case Xs.UP:case Xs.RIGHT:return function(e,t){return e+t.step};case Xs.DOWN:case Xs.LEFT:return function(e,t){return e-t.step};case Xs.END:return function(e,t){return t.max};case Xs.HOME:return function(e,t){return t.min};case Xs.PAGE_UP:return function(e,t){return e+2*t.step};case Xs.PAGE_DOWN:return function(e,t){return e-2*t.step};default:return}}function ea(){}function ta(e){var t,n;return n=t=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));n.onMouseDown=function(e){if(0===e.button){var t=n.props.vertical,r=Yi(t,e);if(Ki(e,n.handlesRefs)){var o=Xi(t,e.target);n.dragOffset=r-o,r=o}else n.dragOffset=0;n.removeDocumentEvents(),n.onStart(r),n.addDocumentMouseEvents()}},n.onTouchStart=function(e){if(!Wi(e)){var t=n.props.vertical,r=Gi(t,e);if(Ki(e,n.handlesRefs)){var o=Xi(t,e.target);n.dragOffset=r-o,r=o}else n.dragOffset=0;n.onStart(r),n.addDocumentTouchEvents(),Zi(e)}},n.onFocus=function(e){var t=n.props,r=t.onFocus,o=t.vertical;if(Ki(e,n.handlesRefs)){var i=Xi(o,e.target);n.dragOffset=0,n.onStart(i),Zi(e),r&&r(e)}},n.onBlur=function(e){var t=n.props.onBlur;n.onEnd(e),t&&t(e)},n.onMouseUp=function(){n.handlesRefs[n.prevMovedHandleIndex]&&n.handlesRefs[n.prevMovedHandleIndex].clickFocus()},n.onMouseMove=function(e){if(!n.sliderRef)return void n.onEnd();var t=Yi(n.props.vertical,e);n.onMove(e,t-n.dragOffset)},n.onTouchMove=function(e){if(Wi(e)||!n.sliderRef)return void n.onEnd();var t=Gi(n.props.vertical,e);n.onMove(e,t-n.dragOffset)},n.onKeyDown=function(e){n.sliderRef&&Ki(e,n.handlesRefs)&&n.onKeyboard(e)},n.onClickMarkLabel=function(e,t){e.stopPropagation(),n.onChange({value:t})},n.saveSlider=function(e){n.sliderRef=e};return n.handlesRefs={},n}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){this.document=this.sliderRef&&this.sliderRef.ownerDocument}},{key:"componentWillUnmount",value:function(){ew()(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"componentWillUnmount",this)&&ew()(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"componentWillUnmount",this).call(this),this.removeDocumentEvents()}},{key:"getSliderStart",value:function(){var e=this.sliderRef,t=e.getBoundingClientRect();return this.props.vertical?t.top:t.left}},{key:"getSliderLength",value:function(){var e=this.sliderRef;if(!e)return 0;var t=e.getBoundingClientRect();return this.props.vertical?t.height:t.width}},{key:"addDocumentTouchEvents",value:function(){this.onTouchMoveListener=r(this.document,"touchmove",this.onTouchMove),this.onTouchUpListener=r(this.document,"touchend",this.onEnd)}},{key:"addDocumentMouseEvents",value:function(){this.onMouseMoveListener=r(this.document,"mousemove",this.onMouseMove),this.onMouseUpListener=r(this.document,"mouseup",this.onEnd)}},{key:"removeDocumentEvents",value:function(){this.onTouchMoveListener&&this.onTouchMoveListener.remove(),this.onTouchUpListener&&this.onTouchUpListener.remove(),this.onMouseMoveListener&&this.onMouseMoveListener.remove(),this.onMouseUpListener&&this.onMouseUpListener.remove()}},{key:"focus",value:function(){this.props.disabled||this.handlesRefs[0].focus()}},{key:"blur",value:function(){var e=this;this.props.disabled||Object.keys(this.handlesRefs).forEach(function(t){e.handlesRefs[t]&&e.handlesRefs[t].blur&&e.handlesRefs[t].blur()})}},{key:"calcValue",value:function(e){var t=this.props,n=t.vertical,r=t.min,o=t.max,i=Math.abs(Math.max(e,0)/this.getSliderLength());return n?(1-i)*(o-r)+r:i*(o-r)+r}},{key:"calcValueByPos",value:function(e){var t=e-this.getSliderStart();return this.trimAlignValue(this.calcValue(t))}},{key:"calcOffset",value:function(e){var t=this.props,n=t.min;return(e-n)/(t.max-n)*100}},{key:"saveHandle",value:function(e,t){this.handlesRefs[e]=t}},{key:"render",value:function(){var e,n=this.props,r=n.prefixCls,o=n.className,i=n.marks,a=n.dots,c=n.step,s=n.included,l=n.disabled,u=n.vertical,p=n.min,f=n.max,h=n.children,d=n.maximumTrackStyle,v=n.style,m=n.railStyle,y=n.dotStyle,g=n.activeDotStyle,b=ew()(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"render",this).call(this),C=b.tracks,w=b.handles,S=Ts()(r,(e={},ss()(e,r+"-with-marks",Object.keys(i).length),ss()(e,r+"-disabled",l),ss()(e,r+"-vertical",u),ss()(e,o,o),e));return Ss.a.createElement("div",{ref:this.saveSlider,className:S,onTouchStart:l?ea:this.onTouchStart,onMouseDown:l?ea:this.onMouseDown,onMouseUp:l?ea:this.onMouseUp,onKeyDown:l?ea:this.onKeyDown,onFocus:l?ea:this.onFocus,onBlur:l?ea:this.onBlur,style:v},Ss.a.createElement("div",{className:r+"-rail",style:us()({},d,m)}),C,Ss.a.createElement(rw,{prefixCls:r,vertical:u,marks:i,dots:a,step:c,included:s,lowerBound:this.getLowerBound(),upperBound:this.getUpperBound(),max:f,min:p,dotStyle:y,activeDotStyle:g}),w,Ss.a.createElement(iw,{className:r+"-mark",onClickLabel:l?ea:this.onClickMarkLabel,vertical:u,marks:i,included:s,lowerBound:this.getLowerBound(),upperBound:this.getUpperBound(),max:f,min:p}),h)}}]),t}(e),t.displayName="ComponentEnhancer("+e.displayName+")",t.propTypes=us()({},e.propTypes,{min:ks.a.number,max:ks.a.number,step:ks.a.number,marks:ks.a.object,included:ks.a.bool,className:ks.a.string,prefixCls:ks.a.string,disabled:ks.a.bool,children:ks.a.any,onBeforeChange:ks.a.func,onChange:ks.a.func,onAfterChange:ks.a.func,handle:ks.a.func,dots:ks.a.bool,vertical:ks.a.bool,style:ks.a.object,minimumTrackStyle:ks.a.object,maximumTrackStyle:ks.a.object,handleStyle:ks.a.oneOfType([ks.a.object,ks.a.arrayOf(ks.a.object)]),trackStyle:ks.a.oneOfType([ks.a.object,ks.a.arrayOf(ks.a.object)]),railStyle:ks.a.object,dotStyle:ks.a.object,activeDotStyle:ks.a.object,autoFocus:ks.a.bool,onFocus:ks.a.func,onBlur:ks.a.func}),t.defaultProps=us()({},e.defaultProps,{prefixCls:"rc-slider",className:"",min:0,max:100,step:1,marks:{},handle:function(e){var t=e.index,n=kl()(e,["index"]);return delete n.dragging,Ss.a.createElement(cw,us()({},n,{key:t}))},onBeforeChange:ea,onChange:ea,onAfterChange:ea,included:!0,disabled:!1,dots:!1,vertical:!1,trackStyle:[{}],handleStyle:[{}],railStyle:{},dotStyle:{},activeDotStyle:{}}),n}function na(){if("undefined"!=typeof window&&window.document&&window.document.documentElement){var e=window.document.documentElement;return"flex"in e.style||"webkitFlex"in e.style||"Flex"in e.style||"msFlex"in e.style}return!1}function ra(e){return"string"==typeof e}function oa(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"vertical";if("undefined"==typeof document||"undefined"==typeof window)return 0;if(Ow)return Ow;var t=document.createElement("div");Object.keys(Ew).forEach(function(e){t.style[e]=Ew[e]}),document.body.appendChild(t);var n=0;return"vertical"===e?n=t.offsetWidth-t.clientWidth:"horizontal"===e&&(n=t.offsetHeight-t.clientHeight),document.body.removeChild(t),Ow=n}function ia(e,t,n){function r(){for(var r=arguments.length,i=Array(r),a=0;a<r;a++)i[a]=arguments[a];var c=this;i[0]&&i[0].persist&&i[0].persist();var s=function(){o=null,n||e.apply(c,i)},l=n&&!o;clearTimeout(o),o=setTimeout(s,t),l&&e.apply(c,i)}var o=void 0;return r.cancel=function(){o&&(clearTimeout(o),o=null)},r}function aa(e,t,n){Tw[t]||(Hh()(e,t,n),Tw[t]=!e)}function ca(e,t){var n=e.indexOf(t),r=e.slice(0,n),o=e.slice(n+1,e.length);return r.concat(o)}function sa(e,t){var n=t.table,r=n.props,o=r.prefixCls,i=r.expandIconAsCell,a=e.fixed,c=[];i&&"right"!==a&&c.push(Ss.a.createElement("col",{className:o+"-expand-icon-col",key:"rc-table-expand-icon-col"}));var s=void 0;return s="left"===a?n.columnManager.leftLeafColumns():"right"===a?n.columnManager.rightLeafColumns():n.columnManager.leafColumns(),c=c.concat(s.map(function(e){return Ss.a.createElement("col",{key:e.key||e.dataIndex,style:{width:e.width,minWidth:e.width}})})),Ss.a.createElement("colgroup",null,c)}function la(e){var t=e.row,n=e.index,r=e.height,o=e.components,i=e.onHeaderRow,a=o.header.row,c=o.header.cell,s=i(t.map(function(e){return e.column}),n),l=s?s.style:{},u=us()({height:r},l);return Ss.a.createElement(a,us()({},s,{style:u}),t.map(function(e,t){var n=e.column,r=kl()(e,["column"]),o=n.onHeaderCell?n.onHeaderCell(n):{};return n.align&&(o.style=us()({},o.style,{textAlign:n.align})),Ss.a.createElement(c,us()({},r,o,{key:n.key||n.dataIndex||t}))}))}function ua(e,t){var n=e.fixedColumnsHeadRowsHeight,r=t.columns,o=t.rows,i=t.fixed,a=n[0];return i&&a&&r?"auto"===a?"auto":a/o.length:null}function pa(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments[2];return n=n||[],n[t]=n[t]||[],e.forEach(function(e){if(e.rowSpan&&n.length<e.rowSpan)for(;n.length<e.rowSpan;)n.push([]);var r={key:e.key,className:e.className||"",children:e.title,column:e};e.children&&pa(e.children,t+1,n),"colSpan"in e&&(r.colSpan=e.colSpan),"rowSpan"in e&&(r.rowSpan=e.rowSpan),0!==r.colSpan&&n[t].push(r)}),n.filter(function(e){return e.length>0})}function fa(e,t){var n=t.table,r=n.components,o=n.props,i=o.prefixCls,a=o.showHeader,c=o.onHeaderRow,s=e.expander,l=e.columns,u=e.fixed;if(!a)return null;var p=pa(l);s.renderExpandIndentCell(p,u);var f=r.header.wrapper;return Ss.a.createElement(f,{className:i+"-thead"},p.map(function(e,t){return Ss.a.createElement(Pw,{key:t,index:t,fixed:u,columns:l,rows:p,row:e,components:r,onHeaderRow:c})}))}function ha(e){return e&&!Ss.a.isValidElement(e)&&"[object Object]"===Object.prototype.toString.call(e)}function da(e,t){var n=e.expandedRowsHeight,r=e.fixedColumnsBodyRowsHeight,o=t.fixed,i=t.rowKey;return o?n[i]?n[i]:r[i]?r[i]:null:null}function va(e,t){var n=t.table,r=n.props,o=r.prefixCls,i=r.scroll,a=r.showHeader,c=e.columns,s=e.fixed,l=e.tableClassName,u=e.handleBodyScrollLeft,p=e.expander,f=n.saveRef,h=n.props.useFixedHeader,d={};if(i.y){h=!0;var v=oa("horizontal");v>0&&!s&&(d.marginBottom="-"+v+"px",d.paddingBottom="0px")}return h&&a?Ss.a.createElement("div",{key:"headTable",ref:s?null:f("headTable"),className:o+"-header",style:d,onScroll:u},Ss.a.createElement(Bw,{tableClassName:l,hasHead:!0,hasBody:!1,fixed:s,columns:c,expander:p})):null}function ma(e,t){var n=t.table,r=n.props,o=r.prefixCls,i=r.scroll,a=e.columns,c=e.fixed,s=e.tableClassName,l=e.getRowKey,u=e.handleBodyScroll,p=e.handleWheel,f=e.expander,h=e.isAnyColumnsFixed,d=n.saveRef,v=n.props.useFixedHeader,m=us()({},n.props.bodyStyle),y={};if((i.x||c)&&(m.overflowX=m.overflowX||"scroll",m.WebkitTransform="translate3d (0, 0, 0)"),i.y){c?(y.maxHeight=m.maxHeight||i.y,y.overflowY=m.overflowY||"scroll"):m.maxHeight=m.maxHeight||i.y,m.overflowY=m.overflowY||"scroll",v=!0;var g=oa();g>0&&c&&(m.marginBottom="-"+g+"px",m.paddingBottom="0px")}var b=Ss.a.createElement(Bw,{tableClassName:s,hasHead:!v,hasBody:!0,fixed:c,columns:a,expander:f,getRowKey:l,isAnyColumnsFixed:h});if(c&&a.length){var C=void 0;return"left"===a[0].fixed||!0===a[0].fixed?C="fixedColumnsBodyLeft":"right"===a[0].fixed&&(C="fixedColumnsBodyRight"),delete m.overflowX,delete m.overflowY,Ss.a.createElement("div",{key:"bodyTable",className:o+"-body-outer",style:us()({},m)},Ss.a.createElement("div",{className:o+"-body-inner",style:y,ref:d(C),onWheel:p,onScroll:u},b))}return Ss.a.createElement("div",{key:"bodyTable",className:o+"-body",style:m,ref:d("bodyTable"),onWheel:p,onScroll:u},b)}function ya(){}function ga(e){function t(e){o=us()({},o,e);for(var t=0;t<i.length;t++)i[t]()}function n(){return o}function r(e){return i.push(e),function(){var t=i.indexOf(e);i.splice(t,1)}}var o=e,i=[];return{setState:t,getState:n,subscribe:r}}function ba(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"tr";return function(t){function n(e){fs()(this,n);var t=ms()(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,e));t.store=e.store;var r=t.store.getState(),o=r.selectedRowKeys;return t.state={selected:o.indexOf(e.rowKey)>=0},t}return gs()(n,t),ds()(n,[{key:"componentDidMount",value:function(){this.subscribe()}},{key:"componentWillUnmount",value:function(){this.unsubscribe&&this.unsubscribe()}},{key:"subscribe",value:function(){var e=this,t=this.props,n=t.store,r=t.rowKey;this.unsubscribe=n.subscribe(function(){var t=e.store.getState(),n=t.selectedRowKeys,o=n.indexOf(r)>=0;o!==e.state.selected&&e.setState({selected:o})})}},{key:"render",value:function(){var t=Ps(this.props,["prefixCls","rowKey","store"]),n=Ts()(this.props.className,ss()({},this.props.prefixCls+"-row-selected",this.state.selected));return ws.createElement(e,us()({},t,{className:n}),this.props.children)}}]),n}(ws.Component)}function Ca(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"children",n=[];return function e(r){r.forEach(function(r){if(r[t]){var o=us()({},r);delete o[t],n.push(o),r[t].length>0&&e(r[t])}else n.push(r)})}(e),n}function wa(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"children";return e.map(function(e,r){var o={};return e[n]&&(o[n]=wa(e[n],t,n)),us()({},t(e,r),o)})}function Sa(e,t){return e.reduce(function(e,n){if(t(n)&&e.push(n),n.children){var r=Sa(n.children,t);e.push.apply(e,Ls()(r))}return e},[])}function xa(e){var t=[];return ws.Children.forEach(e,function(e){if(ws.isValidElement(e)){var n=us()({},e.props);e.key&&(n.key=e.key),e.type&&e.type.__ANT_TABLE_COLUMN_GROUP&&(n.children=xa(n.children)),t.push(n)}}),t}function Ma(){}function za(e){e.stopPropagation(),e.nativeEvent.stopImmediatePropagation&&e.nativeEvent.stopImmediatePropagation()}function ka(e){return e.rowSelection||{}}function _a(e,t){if("createEvent"in document){var n=document.createEvent("HTMLEvents");n.initEvent(t,!1,!0),e.dispatchEvent(n)}}function Oa(){return document.documentMode||/Edge/.test(navigator.userAgent)}function Ea(){}function Ta(e){return e&&!ws.isValidElement(e)&&"[object Object]"===Object.prototype.toString.call(e)}function Na(){}function Va(e,t){for(var n=window.getComputedStyle(e,null),r="",o=0;o<jS.length&&!(r=n.getPropertyValue(jS[o]+t));o++);return r}function Pa(e,t){return parseFloat(Va(e,t))}function Ha(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n["ms"+e]="MS"+t,n["O"+e]="o"+t.toLowerCase(),n}function La(e){if(BS[e])return BS[e];var t=FS[e];if(t)for(var n=Object.keys(t),r=n.length,o=0;o<r;o+=1){var i=n[o];if(Object.prototype.hasOwnProperty.call(t,i)&&i in KS)return BS[e]=t[i],BS[e]}return""}function Da(e,t){var n=m(e),r=m(t);if(1===n.length&&1===r.length&&n[0].key===r[0].key)return r;var o=[],i={},a=[];return n.forEach(function(e){e&&r.some(function(t){return t.key===e.key})?a.length&&(i[e.key]=a,a=[]):a.push(e)}),r.forEach(function(e){e&&i[e.key]&&(o=o.concat(i[e.key])),o.push(e)}),o=o.concat(a)}function Aa(e,t){var n={};return t.forEach(function(t){t in e&&(n[t]=e[t])}),n}function Ia(e,t){if(!e)return null;if("object"==typeof e){return e[t.replace(/-\w/g,function(e){return e[1].toUpperCase()})]}return e+"-"+t}function Ra(){sx||(sx=!0,Hh()(!1,"Tree only accept TreeNode as children."))}function ja(e,t){var n=e.slice(),r=n.indexOf(t);return r>=0&&n.splice(r,1),n}function Fa(e,t){var n=e.slice();return-1===n.indexOf(t)&&n.push(t),n}function Ka(e){return e.split("-")}function Ba(e,t){return e+"-"+t}function Wa(e){return e&&e.type&&e.type.isTreeNode}function Ua(e){return m(e).filter(Wa)}function qa(e){var t=e.props||{},n=t.disabled,r=t.disableCheckbox;return!(!n&&!r)}function Ya(e,t){function n(r,o,i){var a=r?r.props.children:e,c=r?Ba(i.pos,o):0,s=Ua(a);if(r){var l={node:r,index:o,pos:c,key:r.key||c,parentPos:i.node?i.pos:null};t(l)}ws.Children.forEach(s,function(e,t){n(e,t,{node:r,pos:c})})}n(null)}function Ga(e,t){var n=m(e).map(t);return 1===n.length?n[0]:n}function Xa(e,t){var n=t.props,r=n.eventKey,o=n.pos,i=[];return Ya(e,function(e){var t=e.key;i.push(t)}),i.push(r||o),i}function $a(e,t){var n=e.clientY,r=t.selectHandle.getBoundingClientRect(),o=r.top,i=r.bottom,a=r.height,c=Math.max(a*ax,cx);return n<=o+c?-1:n>=i-c?1:0}function Ja(e,t){if(e){return t.multiple?e.slice():e.length?[e[0]]:e}}function Za(e){return e?e.map(function(e){return String(e)}):e}function Qa(e,t){if(!e)return[];var n=t||{},r=n.processProps,o=void 0===r?lx:r;return(Array.isArray(e)?e:[e]).map(function(e){var n=e.children,r=kl()(e,["children"]),i=Qa(n,t);return Ss.a.createElement(ix,o(r),i)})}function ec(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.initWrapper,r=t.processEntity,o=t.onProcessFinished,i={},a={},c={posEntities:i,keyEntities:a};return n&&(c=n(c)||c),Ya(e,function(e){var t=e.node,n=e.index,o=e.pos,s=e.key,l=e.parentPos,u={node:t,index:n,key:s,pos:o};i[o]=u,a[s]=u,u.parent=i[l],u.parent&&(u.parent.children=u.parent.children||[],u.parent.children.push(u)),r&&r(u,c)}),o&&o(c),c}function tc(e){if(!e)return null;var t=void 0;if(Array.isArray(e))t={checkedKeys:e,halfCheckedKeys:void 0};else{if("object"!=typeof e)return Hh()(!1,"`checkedKeys` is not an array or an object"),null;t={checkedKeys:e.checked||void 0,halfCheckedKeys:e.halfChecked||void 0}}return t.checkedKeys=Za(t.checkedKeys),t.halfCheckedKeys=Za(t.halfCheckedKeys),t}function nc(e,t,n){function r(e){if(c[e]!==t){var o=n[e];if(o){var i=o.children,a=o.parent;if(!qa(o.node)){var l=!0,u=!1;(i||[]).filter(function(e){return!qa(e.node)}).forEach(function(e){var t=e.key,n=c[t],r=s[t];(n||r)&&(u=!0),n||(l=!1)}),c[e]=!!t&&l,s[e]=u,a&&r(a.key)}}}}function o(e){if(c[e]!==t){var r=n[e];if(r){var i=r.children;qa(r.node)||(c[e]=t,(i||[]).forEach(function(e){o(e.key)}))}}}function i(e){var i=n[e];if(!i)return void Hh()(!1,"'"+e+"' does not exist in the tree.");var a=i.children,s=i.parent,l=i.node;c[e]=t,qa(l)||((a||[]).filter(function(e){return!qa(e.node)}).forEach(function(e){o(e.key)}),s&&r(s.key))}var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},c={},s={};(a.checkedKeys||[]).forEach(function(e){c[e]=!0}),(a.halfCheckedKeys||[]).forEach(function(e){s[e]=!0}),(e||[]).forEach(function(e){i(e)});var l=[],u=[];return Object.keys(c).forEach(function(e){c[e]&&l.push(e)}),Object.keys(s).forEach(function(e){!c[e]&&s[e]&&u.push(e)}),{checkedKeys:l,halfCheckedKeys:u}}function rc(e,t){function n(e){if(!r[e]){var o=t[e];if(o){r[e]=!0;var i=o.parent;qa(o.node)||i&&n(i.key)}}}var r={};return(e||[]).forEach(function(e){n(e)}),Object.keys(r)}function oc(e){return Object.keys(e).reduce(function(t,n){return"data-"!==n.substr(0,5)&&"aria-"!==n.substr(0,5)||(t[n]=e[n]),t},{})}function ic(e,t){function n(e){var n=e.key,r=e.props.children;!1!==t(n)&&ic(r,t)}(Ua(e)||[]).forEach(n)}function ac(e){var t=ec(e),n=t.keyEntities;return Object.keys(n)}function cc(e,t,n,r){function o(e){return e===n||e===r}var i=[],a=fx.None;return n&&n===r?[n]:n&&r?(ic(e,function(e){if(a===fx.End)return!1;if(o(e)){if(i.push(e),a===fx.None)a=fx.Start;else if(a===fx.Start)return a=fx.End,!1}else a===fx.Start&&i.push(e);return-1!==t.indexOf(e)}),i):[]}function sc(e){var t=e.isLeaf,n=e.expanded;return t?ws.createElement(Kp,{type:"file"}):ws.createElement(Kp,{type:n?"folder-open":"folder"})}function lc(e,t,n){return n?e[0]===t[0]:e[0]===t[0]&&e[1]===t[1]}function uc(e,t,n){var r=e[t]||{};return us()({},r,n)}function pc(e,t,n,r){var o=n.points;for(var i in e)if(e.hasOwnProperty(i)&&lc(e[i].points,o,r))return t+"-placement-"+i;return""}function fc(e,t){this[e]=t}function hc(){}function dc(){return""}function vc(){return window.document}function mc(e){return ks.a.oneOfType([e,ks.a.arrayOf(e)])}function yc(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];var r=t[0],o=t[1],i=t[2];if(xc(r)){return mc(ks.a.shape({label:ks.a.node,value:Vx})).apply(void 0,t)?new Error("Invalid prop `"+o+"` supplied to `"+i+"`. You should use { label: string, value: string | number } or [{ label: string, value: string | number }] instead."):null}return mc(Vx).apply(void 0,t)?new Error("Invalid prop `"+o+"` supplied to `"+i+"`. You should use string or [string] instead."):null}function gc(e){return"string"==typeof e?e:null}function bc(e){return e?Array.isArray(e)?e:[e]:[]}function Cc(){var e=function(t){e.current=t};return e}function wc(e){if(!e.length)return[];var t={},n={},r=e.slice().map(function(e){var t=us()({},e,{fields:e.pos.split("-")});return delete t.children,t});return r.forEach(function(e){n[e.pos]=e}),r.sort(function(e,t){return e.fields.length-t.fields.length}),r.forEach(function(e){var r=e.fields.slice(0,-1).join("-"),o=n[r];o?(o.children=o.children||[],o.children.push(e)):t[e.pos]=e,delete e.key,delete e.fields}),Object.keys(t).map(function(e){return t[e]})}function Sc(e){return jx+=1,e+"_"+jx}function xc(e){var t=e.treeCheckable,n=e.treeCheckStrictly,r=e.labelInValue;return!(!t||!n)||(r||!1)}function Mc(e,t){var n=t.id,r=t.pId,o=t.rootPId,i={},a=[];return e.map(function(e){var t=us()({},e),r=t[n];return i[r]=t,t.key=t.key||r,t}).forEach(function(e){var t=e[r],n=i[t];n&&(n.children=n.children||[],n.children.push(e)),(t===o||!n&&null===o)&&a.push(e)}),a}function zc(e,t){for(var n=e.split("-"),r=t.split("-"),o=Math.min(n.length,r.length),i=0;i<o;i+=1)if(n[i]!==r[i])return!1;return!0}function kc(e){var t=e.node,n=e.pos,r=e.children,o={node:t,pos:n};return r&&(o.children=r.map(kc)),o}function _c(e,t,n,r){function o(e){if(!e)return null;var i=!1;n(t,e)&&(i=!0);var a=m(e.props.children).map(o).filter(function(e){return e});return a.length||i?Ss.a.createElement(Hx,us()({},e.props,{key:r[e.props.value].key}),a):null}return t?e.map(o).filter(function(e){return e}):null}function Oc(e,t){var n=bc(e);return xc(t)?n.map(function(e){return"object"==typeof e&&e?e:{value:"",label:""}}):n.map(function(e){return{value:e}})}function Ec(e,t,n){return e.label?e.label:t&&t.node.props?t.node.props[n]:e.value}function Tc(e,t,n){var r=t.treeNodeLabelProp,o=t.treeCheckable,i=t.treeCheckStrictly,a=t.showCheckedStrategy;if(o&&!i){var c={};e.forEach(function(e){c[e.value]=e});var s=wc(e.map(function(e){var t=e.value;return n[t]}));if(a===Lx)return s.map(function(e){var t=e.node.props.value;return{label:Ec(c[t],n[t],r),value:t}});if(a===Dx){var l=[],u=function e(t){var o=t.node.props.value,i=t.children;if(!i||0===i.length)return void l.push({label:Ec(c[o],n[o],r),value:o});i.forEach(function(t){e(t)})};return s.forEach(function(e){u(e)}),l}}return e.map(function(e){return{label:Ec(e,n[e.value],r),value:e.value}})}function Nc(e){var t=e.title,n=e.label,r=e.key,o=e.value,i=us()({},e);return n&&!t&&(Ax||(op()(!1,"'label' in treeData is deprecated. Please use 'title' instead."),Ax=!0),i.title=n),r||(i.key=o),i}function Vc(e){return Qa(e,{processProps:Nc})}function Pc(e){return us()({},e,{valueEntities:{}})}function Hc(e,t){var n=e.node.props.value;e.value=n,t.valueEntities[n]=e}function Lc(e){return ec(e,{initWrapper:Pc,processEntity:Hc})}function Dc(e,t){var n=String(e),r=Number(t)>>>0,o=n.slice(0,r+1).search(/\S+$/),i=n.slice(r).search(/\s/);return i<0?{word:n.slice(o),begin:o,end:n.length}:{word:n.slice(o,i+r),begin:o,end:i+r}}function Ac(e,t){var n=t.getAnchorKey(),r=t.getAnchorOffset()-1,o=e.getCurrentContent(),i=o.getBlockForKey(n);if(i){return Dc(i.getText(),r)}return""}function Ic(e,t,n,r){var o="immutable"===r?"IMMUTABLE":"MUTABLE",i=e.getSelection(),a=e.getCurrentContent();a.createEntity("mention",o,n||t);var c=Ac(e,i),s=c.begin,l=c.end,u=OM.Modifier.replaceText(a,i.merge({anchorOffset:s,focusOffset:l}),t,null,a.getLastCreatedEntityKey()),p=OM.Modifier.insertText(u,u.getSelectionAfter()," "),f=OM.EditorState.push(e,p,"insert-mention");return OM.EditorState.forceSelection(f,p.getSelectionAfter())}function Rc(e){var t=e.getSelection(),n=Ac(e,t),r=n.begin,o=n.end,i=OM.Modifier.replaceText(e.getCurrentContent(),t.merge({anchorOffset:r,focusOffset:o}),"",null),a=OM.Modifier.insertText(i,i.getSelectionAfter()," "),c=OM.EditorState.push(e,a,"insert-mention");return OM.EditorState.forceSelection(c,a.getSelectionAfter())}function jc(e,t){var n=e.getBoundingClientRect();if(n.width||n.height){var r=t||e.parentElement;return{top:n.top-r.clientTop,left:n.left-r.clientLeft}}return n}function Fc(e){var t=Array.isArray(e)?e:[e],n=t.join("").replace(/(\$|\^)/g,"\\$1");return t.length>1&&(n="["+n+"]"),new RegExp("(\\s|^)("+n+")[^\\s]*","g")}function Kc(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"@",n=Fc(t),r=[];return e.getBlockMap().forEach(function(e){for(var t=e.getText(),o=void 0;null!==(o=n.exec(t));)r.push(o[0].trim())}),r}function Bc(e){return e.split("&").join("&amp;").split("<").join("&lt;").split(">").join("&gt;").split("\xa0").join("&nbsp;").split("\n").join("<br > \n")}function Wc(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return new $M(e,t).generate()}function Uc(e,t,n){for(var r=t.getText(),o=void 0,i=void 0;null!==(o=e.exec(r));)i=o.index,n(i,i+o[0].length)}function qc(e,t,n){e.findEntityRanges(function(e){var t=e.getEntity();return t&&"mention"===n.getEntity(t).getType()},t)}function Yc(){}function Gc(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t={onChange:Yc,onUpArrow:Yc,onDownArrow:Yc,getEditorState:Yc,setEditorState:Yc,handleReturn:Yc,onBlur:Yc},n={callbacks:t,mentionStore:XM},r=Fc(e.prefix),o=e.tag||UM,i=[{strategy:function(e,t){Uc(r,e,t)},component:function(t){return Ss.a.createElement(BM,us()({},t,n,{style:e.mentionStyle,suggestionRegex:Fc(e.prefix)}))}}];return"immutable"!==e.mode&&i.unshift({strategy:qc,component:function(e){return Ss.a.createElement(JM,us()({tag:o},e,{callbacks:t}))}}),{name:"mention",Suggestions:function(e){return Ss.a.createElement(FM,us()({},e,n,{store:XM}))},decorators:i,onChange:function(e){return t.onChange?t.onChange(e):e},callbacks:t,export:Wc}}function Xc(e){return OM.ContentState.createFromText(e)}function $c(e,t){var n="cannot post "+e.action+" "+t.status+"'",r=new Error(n);return r.status=t.status,r.method="post",r.url=e.action,r}function Jc(e){var t=e.responseText||e.response;if(!t)return t;try{return JSON.parse(t)}catch(e){return t}}function Zc(e){var t=new XMLHttpRequest;e.onProgress&&t.upload&&(t.upload.onprogress=function(t){t.total>0&&(t.percent=t.loaded/t.total*100),e.onProgress(t)});var n=new FormData;e.data&&Object.keys(e.data).map(function(t){n.append(t,e.data[t])}),n.append(e.filename,e.file),t.onerror=function(t){e.onError(t)},t.onload=function(){if(t.status<200||t.status>=300)return e.onError($c(e,t),Jc(t));e.onSuccess(Jc(t),t)},t.open("post",e.action,!0),e.withCredentials&&"withCredentials"in t&&(t.withCredentials=!0);var r=e.headers||{};null!==r["X-Requested-With"]&&t.setRequestHeader("X-Requested-With","XMLHttpRequest");for(var o in r)r.hasOwnProperty(o)&&null!==r[o]&&t.setRequestHeader(o,r[o]);return t.send(n),{abort:function(){t.abort()}}}function Qc(){return"rc-upload-"+rz+"-"+ ++oz}function es(e,t){return-1!==e.indexOf(t,e.length-t.length)}function ts(){}function ns(){return!0}function rs(e){return us()({},e,{lastModified:e.lastModified,lastModifiedDate:e.lastModifiedDate,name:e.name,size:e.size,type:e.type,uid:e.uid,percent:0,originFileObj:e})}function os(){var e=.1;return function(t){var n=t;return n>=.98?n:(n+=e,e-=.01,e<.001&&(e=.001),n)}}function is(e,t){var n=void 0!==e.uid?"uid":"name";return t.filter(function(t){return t[n]===e[n]})[0]}function as(e,t){var n=void 0!==e.uid?"uid":"name",r=t.filter(function(t){return t[n]!==e[n]});return r.length===t.length?null:r}Object.defineProperty(t,"__esModule",{value:!0});var cs=n(8),ss=n.n(cs),ls=n(1),us=n.n(ls),ps=n(2),fs=n.n(ps),hs=n(6),ds=n.n(hs),vs=n(3),ms=n.n(vs),ys=n(4),gs=n.n(ys),bs=n(16),Cs=n.n(bs),ws=n(0),Ss=n.n(ws),xs=n(9),Ms=n.n(xs),zs=n(5),ks=n.n(zs),_s=n(272),Os=n.n(_s),Es=n(7),Ts=n.n(Es),Ns=n(23),Vs=n.n(Ns),Ps=o,Hs=n(17),Ls=n.n(Hs),Ds=n(31),As=n.n(Ds),Is=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"===("undefined"==typeof Reflect?"undefined":Cs()(Reflect))&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var c=e.length-1;c>=0;c--)(o=e[c])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a},Rs=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.events=["resize","scroll","touchstart","touchmove","touchend","pageshow","load"],e.eventHandlers={},e.state={affixStyle:void 0,placeholderStyle:void 0},e.saveFixedNode=function(t){e.fixedNode=t},e.savePlaceholderNode=function(t){e.placeholderNode=t},e}return gs()(t,e),ds()(t,[{key:"setAffixStyle",value:function(e,t){var n=this,r=this.props,o=r.onChange,i=void 0===o?u:o,a=r.target,c=void 0===a?p:a,s=this.state.affixStyle,l=c()===window;"scroll"===e.type&&s&&t&&l||Vs()(t,s)||this.setState({affixStyle:t},function(){var e=!!n.state.affixStyle;(t&&!s||!t&&s)&&i(e)})}},{key:"setPlaceholderStyle",value:function(e){var t=this.state.placeholderStyle;Vs()(e,t)||this.setState({placeholderStyle:e})}},{key:"syncPlaceholderStyle",value:function(e){var t=this.state.affixStyle;t&&(this.placeholderNode.style.cssText="",this.setAffixStyle(e,us()({},t,{width:this.placeholderNode.offsetWidth})),this.setPlaceholderStyle({width:this.placeholderNode.offsetWidth}))}},{key:"updatePosition",value:function(e){var t=this.props,n=t.offsetTop,r=t.offsetBottom,o=t.offset,a=t.target,c=void 0===a?p:a,u=c();n=void 0===n?o:n;var f=i(u,!0),h=xs.findDOMNode(this),d=l(h,u),v={width:this.fixedNode.offsetWidth,height:this.fixedNode.offsetHeight},m={top:!1,bottom:!1};"number"!=typeof n&&"number"!=typeof r?(m.top=!0,n=0):(m.top="number"==typeof n,m.bottom="number"==typeof r);var y=s(u),g=u.innerHeight||u.clientHeight;if(f>d.top-n&&m.top){var b=d.width,C=y.top+n;this.setAffixStyle(e,{position:"fixed",top:C,left:y.left+d.left,width:b}),this.setPlaceholderStyle({width:b,height:v.height})}else if(f<d.top+v.height+r-g&&m.bottom){var w=u===window?0:window.innerHeight-y.bottom,S=d.width;this.setAffixStyle(e,{position:"fixed",bottom:w+r,left:y.left+d.left,width:S}),this.setPlaceholderStyle({width:S,height:d.height})}else{var x=this.state.affixStyle;"resize"===e.type&&x&&"fixed"===x.position&&h.offsetWidth?this.setAffixStyle(e,us()({},x,{width:h.offsetWidth})):this.setAffixStyle(e,null),this.setPlaceholderStyle(null)}"resize"===e.type&&this.syncPlaceholderStyle(e)}},{key:"componentDidMount",value:function(){var e=this,t=this.props.target||p;this.timeout=setTimeout(function(){e.setTargetEventListeners(t)})}},{key:"componentWillReceiveProps",value:function(e){this.props.target!==e.target&&(this.clearEventListeners(),this.setTargetEventListeners(e.target),this.updatePosition({})),this.props.offsetTop===e.offsetTop&&this.props.offsetBottom===e.offsetBottom||this.updatePosition({})}},{key:"componentWillUnmount",value:function(){this.clearEventListeners(),clearTimeout(this.timeout),this.updatePosition.cancel()}},{key:"setTargetEventListeners",value:function(e){var t=this,n=e();n&&(this.clearEventListeners(),this.events.forEach(function(e){t.eventHandlers[e]=r(n,e,t.updatePosition)}))}},{key:"clearEventListeners",value:function(){var e=this;this.events.forEach(function(t){var n=e.eventHandlers[t];n&&n.remove&&n.remove()})}},{key:"render",value:function(){var e=Ts()(ss()({},this.props.prefixCls||"ant-affix",this.state.affixStyle)),t=Ps(this.props,["prefixCls","offsetTop","offsetBottom","target","onChange"]),n=us()({},this.state.placeholderStyle,this.props.style);return ws.createElement("div",us()({},t,{style:n,ref:this.savePlaceholderNode}),ws.createElement("div",{className:e,ref:this.saveFixedNode,style:this.state.affixStyle},this.props.children))}}]),t}(ws.Component),js=Rs;Rs.propTypes={offsetTop:zs.number,offsetBottom:zs.number,target:zs.func},Is([c()],Rs.prototype,"updatePosition",null);var Fs=/#([^#]+)$/,Ks=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.state={activeLink:null},e.links=[],e.handleScroll=function(){if(!e.animating){var t=e.props,n=t.offsetTop,r=t.bounds;e.setState({activeLink:e.getCurrentAnchor(n,r)})}},e.handleScrollTo=function(t){var n=e.props,r=n.offsetTop,o=n.getContainer;e.animating=!0,e.setState({activeLink:t}),v(t,r,o,function(){e.animating=!1})},e.updateInk=function(){if("undefined"!=typeof document){var t=e.props.prefixCls,n=xs.findDOMNode(e),r=n.getElementsByClassName(t+"-link-title-active")[0];r&&(e.inkNode.style.top=r.offsetTop+r.clientHeight/2-4.5+"px")}},e.saveInkNode=function(t){e.inkNode=t},e}return gs()(t,e),ds()(t,[{key:"getChildContext",value:function(){var e=this;return{antAnchor:{registerLink:function(t){e.links.includes(t)||e.links.push(t)},unregisterLink:function(t){var n=e.links.indexOf(t);-1!==n&&e.links.splice(n,1)},activeLink:this.state.activeLink,scrollTo:this.handleScrollTo,onClick:this.props.onClick}}}},{key:"componentDidMount",value:function(){var e=this.props.getContainer;this.scrollEvent=r(e(),"scroll",this.handleScroll),this.handleScroll()}},{key:"componentWillUnmount",value:function(){this.scrollEvent&&this.scrollEvent.remove()}},{key:"componentDidUpdate",value:function(){this.updateInk()}},{key:"getCurrentAnchor",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:5;if("undefined"==typeof document)return"";var n=[],r=this.props.getContainer,o=r();if(this.links.forEach(function(r){var i=Fs.exec(r.toString());if(i){var a=document.getElementById(i[1]);if(a){var c=h(a,o);c<e+t&&n.push({link:r,top:c})}}}),n.length){return n.reduce(function(e,t){return t.top>e.top?t:e}).link}return""}},{key:"render",value:function(){var e=this.props,t=e.prefixCls,n=e.className,r=void 0===n?"":n,o=e.style,i=e.offsetTop,a=e.affix,c=e.showInkInFixed,s=e.children,l=e.getContainer,u=this.state.activeLink,p=Ts()(t+"-ink-ball",{visible:u}),f=Ts()(r,t+"-wrapper"),h=Ts()(t,{fixed:!a&&!c}),d=us()({maxHeight:i?"calc(100vh - "+i+"px)":"100vh"},o),v=ws.createElement("div",{className:f,style:d},ws.createElement("div",{className:h},ws.createElement("div",{className:t+"-ink"},ws.createElement("span",{className:p,ref:this.saveInkNode})),s));return a?ws.createElement(js,{offsetTop:i,target:l},v):v}}]),t}(ws.Component),Bs=Ks;Ks.defaultProps={prefixCls:"ant-anchor",affix:!0,showInkInFixed:!1,getContainer:f},Ks.childContextTypes={antAnchor:zs.object};var Ws=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.handleClick=function(t){var n=e.context.antAnchor,r=n.scrollTo,o=n.onClick,i=e.props,a=i.href,c=i.title;o&&o(t,{title:c,href:a}),r(a)},e}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){this.context.antAnchor.registerLink(this.props.href)}},{key:"componentWillReceiveProps",value:function(e){var t=e.href;this.props.href!==t&&(this.context.antAnchor.unregisterLink(this.props.href),this.context.antAnchor.registerLink(t))}},{key:"componentWillUnmount",value:function(){this.context.antAnchor.unregisterLink(this.props.href)}},{key:"render",value:function(){var e=this.props,t=e.prefixCls,n=e.href,r=e.title,o=e.children,i=this.context.antAnchor.activeLink===n,a=Ts()(t+"-link",ss()({},t+"-link-active",i)),c=Ts()(t+"-link-title",ss()({},t+"-link-title-active",i));return ws.createElement("div",{className:a},ws.createElement("a",{className:c,href:n,title:"string"==typeof r?r:"",onClick:this.handleClick},r),o)}}]),t}(ws.Component),Us=Ws;Ws.defaultProps={prefixCls:"ant-anchor",href:"#"},Ws.contextTypes={antAnchor:zs.object},Bs.Link=Us;var qs=Bs,Ys=n(13),Gs={MAC_ENTER:3,BACKSPACE:8,TAB:9,NUM_CENTER:12,ENTER:13,SHIFT:16,CTRL:17,ALT:18,PAUSE:19,CAPS_LOCK:20,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,PRINT_SCREEN:44,INSERT:45,DELETE:46,ZERO:48,ONE:49,TWO:50,THREE:51,FOUR:52,FIVE:53,SIX:54,SEVEN:55,EIGHT:56,NINE:57,QUESTION_MARK:63,A:65,B:66,C:67,D:68,E:69,F:70,G:71,H:72,I:73,J:74,K:75,L:76,M:77,N:78,O:79,P:80,Q:81,R:82,S:83,T:84,U:85,V:86,W:87,X:88,Y:89,Z:90,META:91,WIN_KEY_RIGHT:92,CONTEXT_MENU:93,NUM_ZERO:96,NUM_ONE:97,NUM_TWO:98,NUM_THREE:99,NUM_FOUR:100,NUM_FIVE:101,NUM_SIX:102,NUM_SEVEN:103,NUM_EIGHT:104,NUM_NINE:105,NUM_MULTIPLY:106,NUM_PLUS:107,NUM_MINUS:109,NUM_PERIOD:110,NUM_DIVISION:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,NUMLOCK:144,SEMICOLON:186,DASH:189,EQUALS:187,COMMA:188,PERIOD:190,SLASH:191,APOSTROPHE:192,SINGLE_QUOTE:222,OPEN_SQUARE_BRACKET:219,BACKSLASH:220,CLOSE_SQUARE_BRACKET:221,WIN_KEY:224,MAC_FF_META:224,WIN_IME:229};Gs.isTextModifyingKeyEvent=function(e){var t=e.keyCode;if(e.altKey&&!e.ctrlKey||e.metaKey||t>=Gs.F1&&t<=Gs.F12)return!1;switch(t){case Gs.ALT:case Gs.CAPS_LOCK:case Gs.CONTEXT_MENU:case Gs.CTRL:case Gs.DOWN:case Gs.END:case Gs.ESC:case Gs.HOME:case Gs.INSERT:case Gs.LEFT:case Gs.MAC_FF_META:case Gs.META:case Gs.NUMLOCK:case Gs.NUM_CENTER:case Gs.PAGE_DOWN:case Gs.PAGE_UP:case Gs.PAUSE:case Gs.PRINT_SCREEN:case Gs.RIGHT:case Gs.SHIFT:case Gs.UP:case Gs.WIN_KEY:case Gs.WIN_KEY_RIGHT:return!1;default:return!0}},Gs.isCharacterKey=function(e){if(e>=Gs.ZERO&&e<=Gs.NINE)return!0;if(e>=Gs.NUM_ZERO&&e<=Gs.NUM_MULTIPLY)return!0;if(e>=Gs.A&&e<=Gs.Z)return!0;if(-1!==window.navigation.userAgent.indexOf("WebKit")&&0===e)return!0;switch(e){case Gs.SPACE:case Gs.QUESTION_MARK:case Gs.NUM_PLUS:case Gs.NUM_MINUS:case Gs.NUM_PERIOD:case Gs.NUM_DIVISION:case Gs.SEMICOLON:case Gs.DASH:case Gs.EQUALS:case Gs.COMMA:case Gs.PERIOD:case Gs.SLASH:case Gs.APOSTROPHE:case Gs.SINGLE_QUOTE:case Gs.OPEN_SQUARE_BRACKET:case Gs.BACKSLASH:case Gs.CLOSE_SQUARE_BRACKET:return!0;default:return!1}};var Xs=Gs,$s=n(160),Js=n(76),Zs=n.n(Js),Qs=0!==$s.a.endEvents.length,el=["Webkit","Moz","O","ms"],tl=["-webkit-","-moz-","-o-","ms-",""],nl=function(e,t,n){var r="object"===(void 0===t?"undefined":Cs()(t)),o=r?t.name:t,i=r?t.active:t+"-active",a=n,c=void 0,s=void 0,l=Zs()(e);return n&&"[object Object]"===Object.prototype.toString.call(n)&&(a=n.end,c=n.start,s=n.active),e.rcEndListener&&e.rcEndListener(),e.rcEndListener=function(t){t&&t.target!==e||(e.rcAnimTimeout&&(clearTimeout(e.rcAnimTimeout),e.rcAnimTimeout=null),M(e),l.remove(o),l.remove(i),$s.a.removeEndEventListener(e,e.rcEndListener),e.rcEndListener=null,a&&a())},$s.a.addEndEventListener(e,e.rcEndListener),c&&c(),l.add(o),e.rcAnimTimeout=setTimeout(function(){e.rcAnimTimeout=null,l.add(i),s&&setTimeout(s,0),x(e)},30),{stop:function(){e.rcEndListener&&e.rcEndListener()}}};nl.style=function(e,t,n){e.rcEndListener&&e.rcEndListener(),e.rcEndListener=function(t){t&&t.target!==e||(e.rcAnimTimeout&&(clearTimeout(e.rcAnimTimeout),e.rcAnimTimeout=null),M(e),$s.a.removeEndEventListener(e,e.rcEndListener),e.rcEndListener=null,n&&n())},$s.a.addEndEventListener(e,e.rcEndListener),e.rcAnimTimeout=setTimeout(function(){for(var n in t)t.hasOwnProperty(n)&&(e.style[n]=t[n]);e.rcAnimTimeout=null,x(e)},0)},nl.setTransition=function(e,t,n){var r=t,o=n;void 0===n&&(o=r,r=""),r=r||"",el.forEach(function(t){e.style[t+"Transition"+r]=o})},nl.isCssAnimationSupported=Qs;var rl=nl,ol={isAppearSupported:function(e){return e.transitionName&&e.transitionAppear||e.animation.appear},isEnterSupported:function(e){return e.transitionName&&e.transitionEnter||e.animation.enter},isLeaveSupported:function(e){return e.transitionName&&e.transitionLeave||e.animation.leave},allowAppearCallback:function(e){return e.transitionAppear||e.animation.appear},allowEnterCallback:function(e){return e.transitionEnter||e.animation.enter},allowLeaveCallback:function(e){return e.transitionLeave||e.animation.leave}},il=ol,al={enter:"transitionEnter",appear:"transitionAppear",leave:"transitionLeave"},cl=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"componentWillUnmount",value:function(){this.stop()}},{key:"componentWillEnter",value:function(e){il.isEnterSupported(this.props)?this.transition("enter",e):e()}},{key:"componentWillAppear",value:function(e){il.isAppearSupported(this.props)?this.transition("appear",e):e()}},{key:"componentWillLeave",value:function(e){il.isLeaveSupported(this.props)?this.transition("leave",e):e()}},{key:"transition",value:function(e,t){var n=this,r=Ms.a.findDOMNode(this),o=this.props,i=o.transitionName,a="object"==typeof i;this.stop();var c=function(){n.stopper=null,t()};if((Qs||!o.animation[e])&&i&&o[al[e]]){var s=a?i[e]:i+"-"+e,l=s+"-active";a&&i[e+"Active"]&&(l=i[e+"Active"]),this.stopper=rl(r,{name:s,active:l},c)}else this.stopper=o.animation[e](r,c)}},{key:"stop",value:function(){var e=this.stopper;e&&(this.stopper=null,e.stop())}},{key:"render",value:function(){return this.props.children}}]),t}(Ss.a.Component);cl.propTypes={children:ks.a.any};var sl=cl,ll=!("undefined"==typeof window||!window.document||!window.document.createElement),ul=function(e,t){var n={animationend:z("Animation","AnimationEnd"),transitionend:z("Transition","TransitionEnd")};return e&&("AnimationEvent"in t||delete n.animationend.animation,"TransitionEvent"in t||delete n.transitionend.transition),n}(ll,"undefined"!=typeof window?window:{}),pl={};ll&&(pl=document.createElement("div").style);var fl={},hl=k("animationend"),dl=k("transitionend"),vl=!(!hl||!dl),ml="none",yl="appear",gl="enter",bl="leave",Cl=function(e){function t(t){return!(!t.motionName||!e)}var n=function(e){function n(){fs()(this,n);var e=ms()(this,(n.__proto__||Object.getPrototypeOf(n)).call(this));return e.onDomUpdate=function(){var n=e.state,r=n.status,o=n.newStatus,i=e.props,a=i.onAppearStart,c=i.onEnterStart,s=i.onLeaveStart,l=i.onAppearActive,u=i.onEnterActive,p=i.onLeaveActive,f=i.motionAppear,h=i.motionEnter,d=i.motionLeave;if(t(e.props)){var v=Ms.a.findDOMNode(e);e.$ele!==v&&(e.removeEventListener(e.$ele),e.addEventListener(v),e.$ele=v),o&&r===yl&&f?e.updateStatus(a,null,null,function(){e.updateActiveStatus(l,yl)}):o&&r===gl&&h?e.updateStatus(c,null,null,function(){e.updateActiveStatus(u,gl)}):o&&r===bl&&d&&e.updateStatus(s,null,null,function(){e.updateActiveStatus(p,bl)})}},e.onMotionEnd=function(t){var n=e.state,r=n.status,o=n.statusActive,i=e.props,a=i.onAppearEnd,c=i.onEnterEnd,s=i.onLeaveEnd;r===yl&&o?e.updateStatus(a,{status:ml},t):r===gl&&o?e.updateStatus(c,{status:ml},t):r===bl&&o&&e.updateStatus(s,{status:ml},t)},e.addEventListener=function(t){t&&(t.addEventListener(dl,e.onMotionEnd),t.addEventListener(hl,e.onMotionEnd))},e.removeEventListener=function(t){t&&(t.removeEventListener(dl,e.onMotionEnd),t.removeEventListener(hl,e.onMotionEnd))},e.updateStatus=function(t,n,r,o){var i=t?t(Ms.a.findDOMNode(e),r):null;if(!1!==i&&!e._destroyed){var a=void 0;o&&(a=function(){e.nextFrame(o)}),e.setState(us()({statusStyle:"object"==typeof i?i:null,newStatus:!1},n),a)}},e.updateActiveStatus=function(t,n){e.nextFrame(function(){e.state.status===n&&e.updateStatus(t,{statusActive:!0})})},e.nextFrame=function(t){e.cancelNextFrame(),e.raf=As()(t)},e.cancelNextFrame=function(){e.raf&&(As.a.cancel(e.raf),e.raf=null)},e.state={status:ml,statusActive:!1,newStatus:!1,statusStyle:null},e.$ele=null,e.raf=null,e}return gs()(n,e),ds()(n,[{key:"componentDidMount",value:function(){this.onDomUpdate()}},{key:"componentDidUpdate",value:function(){this.onDomUpdate()}},{key:"componentWillUnmount",value:function(){this._destroyed=!0,this.removeEventListener(this.$ele),this.cancelNextFrame()}},{key:"render",value:function(){var e,n=this.state,r=n.status,o=n.statusActive,i=n.statusStyle,a=this.props,c=a.children,s=a.motionName,l=a.visible,u=a.removeOnLeave;return c?r!==ml&&t(this.props)?c({className:Ts()((e={},ss()(e,_(s,r),r!==ml),ss()(e,_(s,r+"-active"),r!==ml&&o),ss()(e,s,"string"==typeof s),e)),style:i}):l||!u?c({}):null:null}}],[{key:"getDerivedStateFromProps",value:function(e,n){var r=n.prevProps;if(!t(e))return{};var o=e.visible,i=e.motionAppear,a=e.motionEnter,c=e.motionLeave,s=e.motionLeaveImmediately,l={prevProps:e};return!r&&o&&i&&(l.status=yl,l.statusActive=!1,l.newStatus=!0),r&&!r.visible&&o&&a&&(l.status=gl,l.statusActive=!1,l.newStatus=!0),(r&&r.visible&&!o&&c||!r&&s&&!o&&c)&&(l.status=bl,l.statusActive=!1,l.newStatus=!0),l}}]),n}(Ss.a.Component);return n.propTypes={visible:ks.a.bool,children:ks.a.func,motionName:ks.a.oneOfType([ks.a.string,ks.a.object]),motionAppear:ks.a.bool,motionEnter:ks.a.bool,motionLeave:ks.a.bool,motionLeaveImmediately:ks.a.bool,removeOnLeave:ks.a.bool,onAppearStart:ks.a.func,onAppearActive:ks.a.func,onAppearEnd:ks.a.func,onEnterStart:ks.a.func,onEnterActive:ks.a.func,onEnterEnd:ks.a.func,onLeaveStart:ks.a.func,onLeaveActive:ks.a.func,onLeaveEnd:ks.a.func},n.defaultProps={visible:!0,motionEnter:!0,motionAppear:!0,motionLeave:!0,removeOnLeave:!0},Object(Ys.polyfill)(n),n}(vl),wl="rc_animate_"+Date.now(),Sl=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return xl.call(n),n.currentlyAnimatingKeys={},n.keysToEnter=[],n.keysToLeave=[],n.state={children:y(O(e))},n.childrenRefs={},n}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){var e=this,t=this.props.showProp,n=this.state.children;t&&(n=n.filter(function(e){return!!e.props[t]})),n.forEach(function(t){t&&e.performAppear(t.key)})}},{key:"componentWillReceiveProps",value:function(e){var t=this;this.nextProps=e;var n=y(O(e)),r=this.props;r.exclusive&&Object.keys(this.currentlyAnimatingKeys).forEach(function(e){t.stop(e)});var o=r.showProp,i=this.currentlyAnimatingKeys,a=r.exclusive?y(O(r)):this.state.children,c=[];o?(a.forEach(function(e){var t=e&&g(n,e.key),r=void 0;(r=t&&t.props[o]||!e.props[o]?t:Ss.a.cloneElement(t||e,ss()({},o,!0)))&&c.push(r)}),n.forEach(function(e){e&&g(a,e.key)||c.push(e)})):c=w(a,n),this.setState({children:c}),n.forEach(function(e){var n=e&&e.key;if(!e||!i[n]){var r=e&&g(a,n);if(o){var c=e.props[o];if(r){!b(a,n,o)&&c&&t.keysToEnter.push(n)}else c&&t.keysToEnter.push(n)}else r||t.keysToEnter.push(n)}}),a.forEach(function(e){var r=e&&e.key;if(!e||!i[r]){var a=e&&g(n,r);if(o){var c=e.props[o];if(a){!b(n,r,o)&&c&&t.keysToLeave.push(r)}else c&&t.keysToLeave.push(r)}else a||t.keysToLeave.push(r)}})}},{key:"componentDidUpdate",value:function(){var e=this.keysToEnter;this.keysToEnter=[],e.forEach(this.performEnter);var t=this.keysToLeave;this.keysToLeave=[],t.forEach(this.performLeave)}},{key:"isValidChildByKey",value:function(e,t){var n=this.props.showProp;return n?b(e,t,n):g(e,t)}},{key:"stop",value:function(e){delete this.currentlyAnimatingKeys[e];var t=this.childrenRefs[e];t&&t.stop()}},{key:"render",value:function(){var e=this,t=this.props;this.nextProps=t;var n=this.state.children,r=null;n&&(r=n.map(function(n){if(null===n||void 0===n)return n;if(!n.key)throw new Error("must set key for <rc-animate> children");return Ss.a.createElement(sl,{key:n.key,ref:function(t){e.childrenRefs[n.key]=t},animation:t.animation,transitionName:t.transitionName,transitionEnter:t.transitionEnter,transitionAppear:t.transitionAppear,transitionLeave:t.transitionLeave},n)}));var o=t.component;if(o){var i=t;return"string"==typeof o&&(i=us()({className:t.className,style:t.style},t.componentProps)),Ss.a.createElement(o,i,r)}return r[0]||null}}]),t}(Ss.a.Component);Sl.isAnimate=!0,Sl.CSSMotion=Cl,Sl.propTypes={component:ks.a.any,componentProps:ks.a.object,animation:ks.a.object,transitionName:ks.a.oneOfType([ks.a.string,ks.a.object]),transitionEnter:ks.a.bool,transitionAppear:ks.a.bool,exclusive:ks.a.bool,transitionLeave:ks.a.bool,onEnd:ks.a.func,onEnter:ks.a.func,onLeave:ks.a.func,onAppear:ks.a.func,showProp:ks.a.string,children:ks.a.node},Sl.defaultProps={animation:{},component:"span",componentProps:{},transitionEnter:!0,transitionLeave:!0,transitionAppear:!1,onEnd:E,onEnter:E,onLeave:E,onAppear:E};var xl=function(){var e=this;this.performEnter=function(t){e.childrenRefs[t]&&(e.currentlyAnimatingKeys[t]=!0,e.childrenRefs[t].componentWillEnter(e.handleDoneAdding.bind(e,t,"enter")))},this.performAppear=function(t){e.childrenRefs[t]&&(e.currentlyAnimatingKeys[t]=!0,e.childrenRefs[t].componentWillAppear(e.handleDoneAdding.bind(e,t,"appear")))},this.handleDoneAdding=function(t,n){var r=e.props;if(delete e.currentlyAnimatingKeys[t],!r.exclusive||r===e.nextProps){var o=y(O(r));e.isValidChildByKey(o,t)?"appear"===n?il.allowAppearCallback(r)&&(r.onAppear(t),r.onEnd(t,!0)):il.allowEnterCallback(r)&&(r.onEnter(t),r.onEnd(t,!0)):e.performLeave(t)}},this.performLeave=function(t){e.childrenRefs[t]&&(e.currentlyAnimatingKeys[t]=!0,e.childrenRefs[t].componentWillLeave(e.handleDoneLeaving.bind(e,t)))},this.handleDoneLeaving=function(t){var n=e.props;if(delete e.currentlyAnimatingKeys[t],!n.exclusive||n===e.nextProps){var r=y(O(n));if(e.isValidChildByKey(r,t))e.performEnter(t);else{var o=function(){il.allowLeaveCallback(n)&&(n.onLeave(t),n.onEnd(t,!1))};C(e.state.children,r,n.showProp)?o():e.setState({children:r},o)}}}},Ml=Sl,zl=n(14),kl=n.n(zl),_l=n(32),Ol=["defaultSelectedKeys","selectedKeys","defaultOpenKeys","openKeys","mode","getPopupContainer","onSelect","onDeselect","onDestroy","openTransitionName","openAnimation","subMenuOpenDelay","subMenuCloseDelay","forceSubMenuRender","triggerSubMenuAction","level","selectable","multiple","onOpenChange","visible","focusable","defaultActiveFirst","prefixCls","inlineIndent","parentMenu","title","rootPrefixCls","eventKey","active","onItemHover","onTitleMouseEnter","onTitleMouseLeave","onTitleClick","popupAlign","popupOffset","isOpen","renderMenuItem","manualRef","subMenuKey","disabled","index","isSelected","store","activeKey","builtinPlacements","overflowedIndicator","attribute","value","popupClassName","inlineCollapsed","menu","theme","itemIcon","expandIcon"],El=function(e){return e.getBoundingClientRect().width},Tl=n(164),Nl=function(e){function t(){var e,n,r,o;fs()(this,t);for(var i=arguments.length,a=Array(i),c=0;c<i;c++)a[c]=arguments[c];return n=r=ms()(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(a))),r.removeContainer=function(){r.container&&(Ms.a.unmountComponentAtNode(r.container),r.container.parentNode.removeChild(r.container),r.container=null)},r.renderComponent=function(e,t){var n=r.props,o=n.visible,i=n.getComponent,a=n.forceRender,c=n.getContainer,s=n.parent;(o||s._component||a)&&(r.container||(r.container=c()),Ms.a.unstable_renderSubtreeIntoContainer(s,i(e),r.container,function(){t&&t.call(this)}))},o=n,ms()(r,o)}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){this.props.autoMount&&this.renderComponent()}},{key:"componentDidUpdate",value:function(){this.props.autoMount&&this.renderComponent()}},{key:"componentWillUnmount",value:function(){this.props.autoDestroy&&this.removeContainer()}},{key:"render",value:function(){return this.props.children({renderComponent:this.renderComponent,removeContainer:this.removeContainer})}}]),t}(Ss.a.Component);Nl.propTypes={autoMount:ks.a.bool,autoDestroy:ks.a.bool,visible:ks.a.bool,forceRender:ks.a.bool,parent:ks.a.any,getComponent:ks.a.func.isRequired,getContainer:ks.a.func.isRequired,children:ks.a.func.isRequired},Nl.defaultProps={autoMount:!0,autoDestroy:!0,forceRender:!1};var Vl=Nl,Pl=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){this.createContainer()}},{key:"componentDidUpdate",value:function(e){var t=this.props.didUpdate;t&&t(e)}},{key:"componentWillUnmount",value:function(){this.removeContainer()}},{key:"createContainer",value:function(){this._container=this.props.getContainer(),this.forceUpdate()}},{key:"removeContainer",value:function(){this._container&&this._container.parentNode.removeChild(this._container)}},{key:"render",value:function(){return this._container?Ms.a.createPortal(this.props.children,this._container):null}}]),t}(Ss.a.Component);Pl.propTypes={getContainer:ks.a.func.isRequired,children:ks.a.node.isRequired,didUpdate:ks.a.func};var Hl=Pl,Ll=void 0,Dl={Webkit:"-webkit-",Moz:"-moz-",ms:"-ms-",O:"-o-"},Al=/matrix\((.*)\)/,Il=/matrix3d\((.*)\)/,Rl="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},jl=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,Fl=void 0,Kl=new RegExp("^("+jl+")(?!px)[a-z%]+$","i"),Bl=/^(top|right|bottom|left)$/,Wl="currentStyle",Ul="runtimeStyle",ql="left",Yl="px";"undefined"!=typeof window&&(Fl=window.getComputedStyle?oe:ie);var Gl=["margin","border","padding"],Xl=-1,$l=2,Jl=1,Zl={};pe(["Width","Height"],function(e){Zl["doc"+e]=function(t){var n=t.document;return Math.max(n.documentElement["scroll"+e],n.body["scroll"+e],Zl["viewport"+e](n))},Zl["viewport"+e]=function(t){var n="client"+e,r=t.document,o=r.body,i=r.documentElement,a=i[n];return"CSS1Compat"===r.compatMode&&a||o&&o[n]||a}});var Ql={position:"absolute",visibility:"hidden",display:"block"};pe(["width","height"],function(e){var t=e.charAt(0).toUpperCase()+e.slice(1);Zl["outer"+t]=function(t,n){return t&&me(t,e,n?0:Jl)};var n="width"===e?["Left","Right"]:["Top","Bottom"];Zl[e]=function(t,r){var o=r;if(void 0===o)return t&&me(t,e,Xl);if(t){var i=Fl(t);return fe(t)&&(o+=de(t,["padding","border"],n,i)),$(t,e,o)}}});var eu={getWindow:function(e){if(e&&e.document&&e.setTimeout)return e;var t=e.ownerDocument||e;return t.defaultView||t.parentWindow},getDocument:re,offset:function(e,t,n){if(void 0===t)return te(e);ue(e,t,n||{})},isWindow:ne,each:pe,css:$,clone:function(e){var t=void 0,n={};for(t in e)e.hasOwnProperty(t)&&(n[t]=e[t]);if(e.overflow)for(t in e)e.hasOwnProperty(t)&&(n.overflow[t]=e.overflow[t]);return n},mix:ye,getWindowScrollLeft:function(e){return Q(e)},getWindowScrollTop:function(e){return ee(e)},merge:function(){for(var e={},t=arguments.length,n=Array(t),r=0;r<t;r++)n[r]=arguments[r];for(var o=0;o<n.length;o++)eu.mix(e,n[o]);return e},viewportWidth:0,viewportHeight:0};ye(eu,Zl);var tu=eu,nu=ge,ru=Ce,ou=we,iu=Se,au=xe,cu=Me,su=Pe;Le.__getOffsetParent=nu,Le.__getVisibleRectForElement=ru;var lu=Le,uu=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},pu=De,fu=function(e){function t(){var n,r,o;fs()(this,t);for(var i=arguments.length,a=Array(i),c=0;c<i;c++)a[c]=arguments[c];return n=r=ms()(this,e.call.apply(e,[this].concat(a))),r.forceAlign=function(){var e=r.props,t=e.disabled,n=e.target,o=e.align,i=e.onAlign;if(!t&&n){var a=Ms.a.findDOMNode(r),c=void 0,s=je(n),l=Fe(n);s?c=lu(a,s,o):l&&(c=pu(a,l,o)),i&&i(a,c)}},o=n,ms()(r,o)}return gs()(t,e),t.prototype.componentDidMount=function(){var e=this.props;this.forceAlign(),!e.disabled&&e.monitorWindowResize&&this.startMonitorWindowResize()},t.prototype.componentDidUpdate=function(e){var t=!1,n=this.props;if(!n.disabled){var r=Ms.a.findDOMNode(this),o=r?r.getBoundingClientRect():null;if(e.disabled)t=!0;else{var i=je(e.target),a=je(n.target),c=Fe(e.target),s=Fe(n.target);Re(i)&&Re(a)?t=!1:(i!==a||i&&!a&&s||c&&s&&a||s&&!Ie(c,s))&&(t=!0);var l=this.sourceRect||{};t||!r||l.width===o.width&&l.height===o.height||(t=!0)}this.sourceRect=o}t&&this.forceAlign(),n.monitorWindowResize&&!n.disabled?this.startMonitorWindowResize():this.stopMonitorWindowResize()},t.prototype.componentWillUnmount=function(){this.stopMonitorWindowResize()},t.prototype.startMonitorWindowResize=function(){this.resizeHandler||(this.bufferMonitor=Ae(this.forceAlign,this.props.monitorBufferTime),this.resizeHandler=r(window,"resize",this.bufferMonitor))},t.prototype.stopMonitorWindowResize=function(){this.resizeHandler&&(this.bufferMonitor.clear(),this.resizeHandler.remove(),this.resizeHandler=null)},t.prototype.render=function(){var e=this,t=this.props,n=t.childrenProps,r=t.children,o=Ss.a.Children.only(r);if(n){var i={};return Object.keys(n).forEach(function(t){i[t]=e.props[n[t]]}),Ss.a.cloneElement(o,i)}return o},t}(ws.Component);fu.propTypes={childrenProps:ks.a.object,align:ks.a.object.isRequired,target:ks.a.oneOfType([ks.a.func,ks.a.shape({clientX:ks.a.number,clientY:ks.a.number,pageX:ks.a.number,pageY:ks.a.number})]),onAlign:ks.a.func,monitorBufferTime:ks.a.number,monitorWindowResize:ks.a.bool,disabled:ks.a.bool,children:ks.a.any},fu.defaultProps={target:function(){return window},monitorBufferTime:50,monitorWindowResize:!1,disabled:!1};var hu=fu,du=hu,vu=function(e){function t(){return fs()(this,t),ms()(this,e.apply(this,arguments))}return gs()(t,e),t.prototype.shouldComponentUpdate=function(e){return e.hiddenClassName||e.visible},t.prototype.render=function(){var e=this.props,t=e.hiddenClassName,n=e.visible,r=kl()(e,["hiddenClassName","visible"]);return t||Ss.a.Children.count(r.children)>1?(!n&&t&&(r.className+=" "+t),Ss.a.createElement("div",r)):Ss.a.Children.only(r.children)},t}(ws.Component);vu.propTypes={children:ks.a.any,className:ks.a.string,visible:ks.a.bool,hiddenClassName:ks.a.string};var mu=vu,yu=function(e){function t(){return fs()(this,t),ms()(this,e.apply(this,arguments))}return gs()(t,e),t.prototype.render=function(){var e=this.props,t=e.className;return e.visible||(t+=" "+e.hiddenClassName),Ss.a.createElement("div",{className:t,onMouseEnter:e.onMouseEnter,onMouseLeave:e.onMouseLeave,onMouseDown:e.onMouseDown,style:e.style},Ss.a.createElement(mu,{className:e.prefixCls+"-content",visible:e.visible},e.children))},t}(ws.Component);yu.propTypes={hiddenClassName:ks.a.string,className:ks.a.string,prefixCls:ks.a.string,onMouseEnter:ks.a.func,onMouseLeave:ks.a.func,onMouseDown:ks.a.func,children:ks.a.any};var gu=yu,bu=function(e){function t(n){fs()(this,t);var r=ms()(this,e.call(this,n));return Cu.call(r),r.state={stretchChecked:!1,targetWidth:void 0,targetHeight:void 0},r.savePopupRef=j.bind(r,"popupInstance"),r.saveAlignRef=j.bind(r,"alignInstance"),r}return gs()(t,e),t.prototype.componentDidMount=function(){this.rootNode=this.getPopupDomNode(),this.setStretchSize()},t.prototype.componentDidUpdate=function(){this.setStretchSize()},t.prototype.getPopupDomNode=function(){return Ms.a.findDOMNode(this.popupInstance)},t.prototype.getMaskTransitionName=function(){var e=this.props,t=e.maskTransitionName,n=e.maskAnimation;return!t&&n&&(t=e.prefixCls+"-"+n),t},t.prototype.getTransitionName=function(){var e=this.props,t=e.transitionName;return!t&&e.animation&&(t=e.prefixCls+"-"+e.animation),t},t.prototype.getClassName=function(e){return this.props.prefixCls+" "+this.props.className+" "+e},t.prototype.getPopupElement=function(){var e=this,t=this.savePopupRef,n=this.state,r=n.stretchChecked,o=n.targetHeight,i=n.targetWidth,a=this.props,c=a.align,s=a.visible,l=a.prefixCls,u=a.style,p=a.getClassNameFromAlign,f=a.destroyPopupOnHide,h=a.stretch,d=a.children,v=a.onMouseEnter,m=a.onMouseLeave,y=a.onMouseDown,g=this.getClassName(this.currentAlignClassName||p(c)),b=l+"-hidden";s||(this.currentAlignClassName=null);var C={};h&&(-1!==h.indexOf("height")?C.height=o:-1!==h.indexOf("minHeight")&&(C.minHeight=o),-1!==h.indexOf("width")?C.width=i:-1!==h.indexOf("minWidth")&&(C.minWidth=i),r||(C.visibility="hidden",setTimeout(function(){e.alignInstance&&e.alignInstance.forceAlign()},0)));var w=us()({},C,u,this.getZIndexStyle()),S={className:g,prefixCls:l,ref:t,onMouseEnter:v,onMouseLeave:m,onMouseDown:y,style:w};return f?Ss.a.createElement(Ml,{component:"",exclusive:!0,transitionAppear:!0,transitionName:this.getTransitionName()},s?Ss.a.createElement(du,{target:this.getAlignTarget(),key:"popup",ref:this.saveAlignRef,monitorWindowResize:!0,align:c,onAlign:this.onAlign},Ss.a.createElement(gu,us()({visible:!0},S),d)):null):Ss.a.createElement(Ml,{component:"",exclusive:!0,transitionAppear:!0,transitionName:this.getTransitionName(),showProp:"xVisible"},Ss.a.createElement(du,{target:this.getAlignTarget(),key:"popup",ref:this.saveAlignRef,monitorWindowResize:!0,xVisible:s,childrenProps:{visible:"xVisible"},disabled:!s,align:c,onAlign:this.onAlign},Ss.a.createElement(gu,us()({hiddenClassName:b},S),d)))},t.prototype.getZIndexStyle=function(){var e={},t=this.props;return void 0!==t.zIndex&&(e.zIndex=t.zIndex),e},t.prototype.getMaskElement=function(){var e=this.props,t=void 0;if(e.mask){var n=this.getMaskTransitionName();t=Ss.a.createElement(mu,{style:this.getZIndexStyle(),key:"mask",className:e.prefixCls+"-mask",hiddenClassName:e.prefixCls+"-mask-hidden",visible:e.visible}),n&&(t=Ss.a.createElement(Ml,{key:"mask",showProp:"visible",transitionAppear:!0,component:"",transitionName:n},t))}return t},t.prototype.render=function(){return Ss.a.createElement("div",null,this.getMaskElement(),this.getPopupElement())},t}(ws.Component);bu.propTypes={visible:ks.a.bool,style:ks.a.object,getClassNameFromAlign:ks.a.func,onAlign:ks.a.func,getRootDomNode:ks.a.func,align:ks.a.any,destroyPopupOnHide:ks.a.bool,className:ks.a.string,prefixCls:ks.a.string,onMouseEnter:ks.a.func,onMouseLeave:ks.a.func,onMouseDown:ks.a.func,stretch:ks.a.string,children:ks.a.node,point:ks.a.shape({pageX:ks.a.number,pageY:ks.a.number})};var Cu=function(){var e=this;this.onAlign=function(t,n){var r=e.props,o=r.getClassNameFromAlign(n);e.currentAlignClassName!==o&&(e.currentAlignClassName=o,t.className=e.getClassName(o)),r.onAlign(t,n)},this.setStretchSize=function(){var t=e.props,n=t.stretch,r=t.getRootDomNode,o=t.visible,i=e.state,a=i.stretchChecked,c=i.targetHeight,s=i.targetWidth;if(!n||!o)return void(a&&e.setState({stretchChecked:!1}));var l=r();if(l){var u=l.offsetHeight,p=l.offsetWidth;c===u&&s===p&&a||e.setState({stretchChecked:!0,targetHeight:u,targetWidth:p})}},this.getTargetElement=function(){return e.props.getRootDomNode()},this.getAlignTarget=function(){var t=e.props.point;return t||e.getTargetElement}},wu=bu,Su=["onClick","onMouseDown","onTouchStart","onMouseEnter","onMouseLeave","onFocus","onBlur","onContextMenu"],xu=!!xs.createPortal,Mu={rcTrigger:ks.a.shape({onPopupMouseDown:ks.a.func})},zu=function(e){function t(n){fs()(this,t);var r=ms()(this,e.call(this,n));ku.call(r);var o=void 0;return o="popupVisible"in n?!!n.popupVisible:!!n.defaultPopupVisible,r.prevPopupVisible=o,r.state={popupVisible:o},r}return gs()(t,e),t.prototype.getChildContext=function(){return{rcTrigger:{onPopupMouseDown:this.onPopupMouseDown}}},t.prototype.componentWillMount=function(){var e=this;Su.forEach(function(t){e["fire"+t]=function(n){e.fireEvents(t,n)}})},t.prototype.componentDidMount=function(){this.componentDidUpdate({},{popupVisible:this.state.popupVisible})},t.prototype.componentWillReceiveProps=function(e){var t=e.popupVisible;void 0!==t&&this.setState({popupVisible:t})},t.prototype.componentDidUpdate=function(e,t){var n=this.props,o=this.state,i=function(){t.popupVisible!==o.popupVisible&&n.afterPopupVisibleChange(o.popupVisible)};if(xu||this.renderComponent(null,i),this.prevPopupVisible=t.popupVisible,o.popupVisible){var a=void 0;return this.clickOutsideHandler||!this.isClickToHide()&&!this.isContextMenuToShow()||(a=n.getDocument(),this.clickOutsideHandler=r(a,"mousedown",this.onDocumentClick)),this.touchOutsideHandler||(a=a||n.getDocument(),this.touchOutsideHandler=r(a,"touchstart",this.onDocumentClick)),!this.contextMenuOutsideHandler1&&this.isContextMenuToShow()&&(a=a||n.getDocument(),this.contextMenuOutsideHandler1=r(a,"scroll",this.onContextMenuClose)),void(!this.contextMenuOutsideHandler2&&this.isContextMenuToShow()&&(this.contextMenuOutsideHandler2=r(window,"blur",this.onContextMenuClose)))}this.clearOutsideHandler()},t.prototype.componentWillUnmount=function(){this.clearDelayTimer(),this.clearOutsideHandler(),clearTimeout(this.mouseDownTimeout)},t.prototype.getPopupDomNode=function(){return this._component&&this._component.getPopupDomNode?this._component.getPopupDomNode():null},t.prototype.getPopupAlign=function(){var e=this.props,t=e.popupPlacement,n=e.popupAlign,r=e.builtinPlacements;return t&&r?I(r,t,n):n},t.prototype.setPopupVisible=function(e,t){var n=this.props.alignPoint;this.clearDelayTimer(),this.state.popupVisible!==e&&("popupVisible"in this.props||this.setState({popupVisible:e}),this.props.onPopupVisibleChange(e)),n&&t&&this.setPoint(t)},t.prototype.delaySetPopupVisible=function(e,t,n){var r=this,o=1e3*t;if(this.clearDelayTimer(),o){var i=n?{pageX:n.pageX,pageY:n.pageY}:null;this.delayTimer=setTimeout(function(){r.setPopupVisible(e,i),r.clearDelayTimer()},o)}else this.setPopupVisible(e,n)},t.prototype.clearDelayTimer=function(){this.delayTimer&&(clearTimeout(this.delayTimer),this.delayTimer=null)},t.prototype.clearOutsideHandler=function(){this.clickOutsideHandler&&(this.clickOutsideHandler.remove(),this.clickOutsideHandler=null),this.contextMenuOutsideHandler1&&(this.contextMenuOutsideHandler1.remove(),this.contextMenuOutsideHandler1=null),this.contextMenuOutsideHandler2&&(this.contextMenuOutsideHandler2.remove(),this.contextMenuOutsideHandler2=null),this.touchOutsideHandler&&(this.touchOutsideHandler.remove(),this.touchOutsideHandler=null)},t.prototype.createTwoChains=function(e){var t=this.props.children.props,n=this.props;return t[e]&&n[e]?this["fire"+e]:t[e]||n[e]},t.prototype.isClickToShow=function(){var e=this.props,t=e.action,n=e.showAction;return-1!==t.indexOf("click")||-1!==n.indexOf("click")},t.prototype.isContextMenuToShow=function(){var e=this.props,t=e.action,n=e.showAction;return-1!==t.indexOf("contextMenu")||-1!==n.indexOf("contextMenu")},t.prototype.isClickToHide=function(){var e=this.props,t=e.action,n=e.hideAction;return-1!==t.indexOf("click")||-1!==n.indexOf("click")},t.prototype.isMouseEnterToShow=function(){var e=this.props,t=e.action,n=e.showAction;return-1!==t.indexOf("hover")||-1!==n.indexOf("mouseEnter")},t.prototype.isMouseLeaveToHide=function(){var e=this.props,t=e.action,n=e.hideAction;return-1!==t.indexOf("hover")||-1!==n.indexOf("mouseLeave")},t.prototype.isFocusToShow=function(){var e=this.props,t=e.action,n=e.showAction;return-1!==t.indexOf("focus")||-1!==n.indexOf("focus")},t.prototype.isBlurToHide=function(){var e=this.props,t=e.action,n=e.hideAction;return-1!==t.indexOf("focus")||-1!==n.indexOf("blur")},t.prototype.forcePopupAlign=function(){this.state.popupVisible&&this._component&&this._component.alignInstance&&this._component.alignInstance.forceAlign()},t.prototype.fireEvents=function(e,t){var n=this.props.children.props[e];n&&n(t);var r=this.props[e];r&&r(t)},t.prototype.close=function(){this.setPopupVisible(!1)},t.prototype.render=function(){var e=this,t=this.state.popupVisible,n=this.props,r=n.children,o=n.forceRender,i=n.alignPoint,a=n.className,c=Ss.a.Children.only(r),s={key:"trigger"};this.isContextMenuToShow()?s.onContextMenu=this.onContextMenu:s.onContextMenu=this.createTwoChains("onContextMenu"),this.isClickToHide()||this.isClickToShow()?(s.onClick=this.onClick,s.onMouseDown=this.onMouseDown,s.onTouchStart=this.onTouchStart):(s.onClick=this.createTwoChains("onClick"),s.onMouseDown=this.createTwoChains("onMouseDown"),s.onTouchStart=this.createTwoChains("onTouchStart")),this.isMouseEnterToShow()?(s.onMouseEnter=this.onMouseEnter,i&&(s.onMouseMove=this.onMouseMove)):s.onMouseEnter=this.createTwoChains("onMouseEnter"),this.isMouseLeaveToHide()?s.onMouseLeave=this.onMouseLeave:s.onMouseLeave=this.createTwoChains("onMouseLeave"),this.isFocusToShow()||this.isBlurToHide()?(s.onFocus=this.onFocus,s.onBlur=this.onBlur):(s.onFocus=this.createTwoChains("onFocus"),s.onBlur=this.createTwoChains("onBlur"));var l=Ts()(c&&c.props&&c.props.className,a);l&&(s.className=l);var u=Ss.a.cloneElement(c,s);if(!xu)return Ss.a.createElement(Vl,{parent:this,visible:t,autoMount:!1,forceRender:o,getComponent:this.getComponent,getContainer:this.getContainer},function(t){var n=t.renderComponent;return e.renderComponent=n,u});var p=void 0;return(t||this._component||o)&&(p=Ss.a.createElement(Hl,{key:"portal",getContainer:this.getContainer,didUpdate:this.handlePortalUpdate},this.getComponent())),[u,p]},t}(Ss.a.Component);zu.propTypes={children:ks.a.any,action:ks.a.oneOfType([ks.a.string,ks.a.arrayOf(ks.a.string)]),showAction:ks.a.any,hideAction:ks.a.any,getPopupClassNameFromAlign:ks.a.any,onPopupVisibleChange:ks.a.func,afterPopupVisibleChange:ks.a.func,popup:ks.a.oneOfType([ks.a.node,ks.a.func]).isRequired,popupStyle:ks.a.object,prefixCls:ks.a.string,popupClassName:ks.a.string,className:ks.a.string,popupPlacement:ks.a.string,builtinPlacements:ks.a.object,popupTransitionName:ks.a.oneOfType([ks.a.string,ks.a.object]),popupAnimation:ks.a.any,mouseEnterDelay:ks.a.number,mouseLeaveDelay:ks.a.number,zIndex:ks.a.number,focusDelay:ks.a.number,blurDelay:ks.a.number,getPopupContainer:ks.a.func,getDocument:ks.a.func,forceRender:ks.a.bool,destroyPopupOnHide:ks.a.bool,mask:ks.a.bool,maskClosable:ks.a.bool,onPopupAlign:ks.a.func,popupAlign:ks.a.object,popupVisible:ks.a.bool,defaultPopupVisible:ks.a.bool,maskTransitionName:ks.a.oneOfType([ks.a.string,ks.a.object]),maskAnimation:ks.a.string,stretch:ks.a.string,alignPoint:ks.a.bool},zu.contextTypes=Mu,zu.childContextTypes=Mu,zu.defaultProps={prefixCls:"rc-trigger-popup",getPopupClassNameFromAlign:Be,getDocument:We,onPopupVisibleChange:Ke,afterPopupVisibleChange:Ke,onPopupAlign:Ke,popupClassName:"",mouseEnterDelay:0,mouseLeaveDelay:.1,focusDelay:0,blurDelay:.15,popupStyle:{},destroyPopupOnHide:!1,popupAlign:{},defaultPopupVisible:!1,mask:!1,maskClosable:!0,action:[],showAction:[],hideAction:[]};var ku=function(){var e=this;this.onMouseEnter=function(t){var n=e.props.mouseEnterDelay;e.fireEvents("onMouseEnter",t),e.delaySetPopupVisible(!0,n,n?null:t)},this.onMouseMove=function(t){e.fireEvents("onMouseMove",t),e.setPoint(t)},this.onMouseLeave=function(t){e.fireEvents("onMouseLeave",t),e.delaySetPopupVisible(!1,e.props.mouseLeaveDelay)},this.onPopupMouseEnter=function(){e.clearDelayTimer()},this.onPopupMouseLeave=function(t){t.relatedTarget&&!t.relatedTarget.setTimeout&&e._component&&e._component.getPopupDomNode&&D(e._component.getPopupDomNode(),t.relatedTarget)||e.delaySetPopupVisible(!1,e.props.mouseLeaveDelay)},this.onFocus=function(t){e.fireEvents("onFocus",t),e.clearDelayTimer(),e.isFocusToShow()&&(e.focusTime=Date.now(),e.delaySetPopupVisible(!0,e.props.focusDelay))},this.onMouseDown=function(t){e.fireEvents("onMouseDown",t),e.preClickTime=Date.now()},this.onTouchStart=function(t){e.fireEvents("onTouchStart",t),e.preTouchTime=Date.now()},this.onBlur=function(t){e.fireEvents("onBlur",t),e.clearDelayTimer(),e.isBlurToHide()&&e.delaySetPopupVisible(!1,e.props.blurDelay)},this.onContextMenu=function(t){t.preventDefault(),e.fireEvents("onContextMenu",t),e.setPopupVisible(!0,t)},this.onContextMenuClose=function(){e.isContextMenuToShow()&&e.close()},this.onClick=function(t){if(e.fireEvents("onClick",t),e.focusTime){var n=void 0;if(e.preClickTime&&e.preTouchTime?n=Math.min(e.preClickTime,e.preTouchTime):e.preClickTime?n=e.preClickTime:e.preTouchTime&&(n=e.preTouchTime),Math.abs(n-e.focusTime)<20)return;e.focusTime=0}e.preClickTime=0,e.preTouchTime=0,t&&t.preventDefault&&t.preventDefault();var r=!e.state.popupVisible;(e.isClickToHide()&&!r||r&&e.isClickToShow())&&e.setPopupVisible(!e.state.popupVisible,t)},this.onPopupMouseDown=function(){var t=e.context.rcTrigger,n=void 0===t?{}:t;e.hasPopupMouseDown=!0,clearTimeout(e.mouseDownTimeout),e.mouseDownTimeout=setTimeout(function(){e.hasPopupMouseDown=!1},0),n.onPopupMouseDown&&n.onPopupMouseDown.apply(n,arguments)},this.onDocumentClick=function(t){if(!e.props.mask||e.props.maskClosable){var n=t.target;D(Object(xs.findDOMNode)(e),n)||e.hasPopupMouseDown||e.close()}},this.getRootDomNode=function(){return Object(xs.findDOMNode)(e)},this.getPopupClassNameFromAlign=function(t){var n=[],r=e.props,o=r.popupPlacement,i=r.builtinPlacements,a=r.prefixCls,c=r.alignPoint,s=r.getPopupClassNameFromAlign;return o&&i&&n.push(R(i,a,t,c)),s&&n.push(s(t)),n.join(" ")},this.getComponent=function(){var t=e.props,n=t.prefixCls,r=t.destroyPopupOnHide,o=t.popupClassName,i=t.action,a=t.onPopupAlign,c=t.popupAnimation,s=t.popupTransitionName,l=t.popupStyle,u=t.mask,p=t.maskAnimation,f=t.maskTransitionName,h=t.zIndex,d=t.popup,v=t.stretch,m=t.alignPoint,y=e.state,g=y.popupVisible,b=y.point,C=e.getPopupAlign(),w={};return e.isMouseEnterToShow()&&(w.onMouseEnter=e.onPopupMouseEnter),e.isMouseLeaveToHide()&&(w.onMouseLeave=e.onPopupMouseLeave),w.onMouseDown=e.onPopupMouseDown,Ss.a.createElement(wu,us()({prefixCls:n,destroyPopupOnHide:r,visible:g,point:m&&b,className:o,action:i,align:C,onAlign:a,animation:c,getClassNameFromAlign:e.getPopupClassNameFromAlign},w,{stretch:v,getRootDomNode:e.getRootDomNode,style:l,mask:u,zIndex:h,transitionName:s,maskAnimation:p,maskTransitionName:f,ref:e.savePopup}),"function"==typeof d?d():d)},this.getContainer=function(){var t=e.props,n=document.createElement("div");return n.style.position="absolute",n.style.top="0",n.style.left="0",n.style.width="100%",(t.getPopupContainer?t.getPopupContainer(Object(xs.findDOMNode)(e)):t.getDocument().body).appendChild(n),n},this.setPoint=function(t){e.props.alignPoint&&t&&e.setState({point:{pageX:t.pageX,pageY:t.pageY}})},this.handlePortalUpdate=function(){e.prevPopupVisible!==e.state.popupVisible&&e.props.afterPopupVisibleChange(e.state.popupVisible)},this.savePopup=function(t){e._component=t}},_u=zu,Ou={adjustX:1,adjustY:1},Eu={topLeft:{points:["bl","tl"],overflow:Ou,offset:[0,-7]},bottomLeft:{points:["tl","bl"],overflow:Ou,offset:[0,7]},leftTop:{points:["tr","tl"],overflow:Ou,offset:[-4,0]},rightTop:{points:["tl","tr"],overflow:Ou,offset:[4,0]}},Tu=Eu,Nu=0,Vu={horizontal:"bottomLeft",vertical:"rightTop","vertical-left":"rightTop","vertical-right":"leftTop"},Pu=function(e,t,n){var r,o=P(t),i=e.getState();e.setState({defaultActiveFirst:us()({},i.defaultActiveFirst,(r={},r[o]=n,r))})},Hu=function(e){function t(n){fs()(this,t);var r=ms()(this,e.call(this,n));Lu.call(r);var o=n.store,i=n.eventKey,a=o.getState().defaultActiveFirst;r.isRootMenu=!1;var c=!1;return a&&(c=a[i]),Pu(o,i,c),r}return gs()(t,e),t.prototype.componentDidMount=function(){this.componentDidUpdate()},t.prototype.componentDidUpdate=function(){var e=this,t=this.props,n=t.mode,r=t.parentMenu,o=t.manualRef;o&&o(this),"horizontal"===n&&r.isRootMenu&&this.props.isOpen&&(this.minWidthTimeout=setTimeout(function(){return e.adjustWidth()},0))},t.prototype.componentWillUnmount=function(){var e=this.props,t=e.onDestroy,n=e.eventKey;t&&t(n),this.minWidthTimeout&&clearTimeout(this.minWidthTimeout),this.mouseenterTimeout&&clearTimeout(this.mouseenterTimeout)},t.prototype.renderChildren=function(e){var t=this.props,n={mode:"horizontal"===t.mode?"vertical":t.mode,visible:this.props.isOpen,level:t.level+1,inlineIndent:t.inlineIndent,focusable:!1,onClick:this.onSubMenuClick,onSelect:this.onSelect,onDeselect:this.onDeselect,onDestroy:this.onDestroy,selectedKeys:t.selectedKeys,eventKey:t.eventKey+"-menu-",openKeys:t.openKeys,openTransitionName:t.openTransitionName,openAnimation:t.openAnimation,onOpenChange:this.onOpenChange,subMenuOpenDelay:t.subMenuOpenDelay,parentMenu:this,subMenuCloseDelay:t.subMenuCloseDelay,forceSubMenuRender:t.forceSubMenuRender,triggerSubMenuAction:t.triggerSubMenuAction,builtinPlacements:t.builtinPlacements,defaultActiveFirst:t.store.getState().defaultActiveFirst[P(t.eventKey)],multiple:t.multiple,prefixCls:t.rootPrefixCls,id:this._menuId,manualRef:this.saveMenuInstance,itemIcon:t.itemIcon,expandIcon:t.expandIcon},r=this.haveRendered;if(this.haveRendered=!0,this.haveOpened=this.haveOpened||n.visible||n.forceSubMenuRender,!this.haveOpened)return Ss.a.createElement("div",null);var o=r||!n.visible||"inline"===!n.mode;n.className=" "+n.prefixCls+"-sub";var i={};return n.openTransitionName?i.transitionName=n.openTransitionName:"object"==typeof n.openAnimation&&(i.animation=us()({},n.openAnimation),o||delete i.animation.appear),Ss.a.createElement(Ml,us()({},i,{showProp:"visible",component:"",transitionAppear:o}),Ss.a.createElement(Bu,us()({},n,{id:this._menuId}),e))},t.prototype.render=function(){var e,t=us()({},this.props),n=t.isOpen,r=t.level,o=this.getPrefixCls(),i="inline"===t.mode,a=Ts()(o,o+"-"+t.mode,(e={},e[t.className]=!!t.className,e[this.getOpenClassName()]=n,e[this.getActiveClassName()]=t.active||n&&!i,e[this.getDisabledClassName()]=t.disabled,e[this.getSelectedClassName()]=this.isChildrenSelected(),e));this._menuId||(t.eventKey?this._menuId=t.eventKey+"$Menu":this._menuId="$__$"+ ++Nu+"$Menu");var c={},s={},l={};t.disabled||(c={onMouseLeave:this.onMouseLeave,onMouseEnter:this.onMouseEnter},s={onClick:this.onTitleClick},l={onMouseEnter:this.onTitleMouseEnter,onMouseLeave:this.onTitleMouseLeave});var u={};i&&(u.paddingLeft=t.inlineIndent*t.level);var p={};this.props.isOpen&&(p={"aria-owns":this._menuId});var f=null;"horizontal"!==t.mode&&(f=this.props.expandIcon,"function"==typeof this.props.expandIcon&&(f=Ss.a.createElement(this.props.expandIcon,us()({},this.props))));var h=Ss.a.createElement("div",us()({ref:this.saveSubMenuTitle,style:u,className:o+"-title"},l,s,{"aria-expanded":n},p,{"aria-haspopup":"true",title:"string"==typeof t.title?t.title:void 0}),t.title,f||Ss.a.createElement("i",{className:o+"-arrow"})),d=this.renderChildren(t.children),v=t.parentMenu.isRootMenu?t.parentMenu.props.getPopupContainer:function(e){return e.parentNode},m=Vu[t.mode],y=t.popupOffset?{offset:t.popupOffset}:{},g="inline"===t.mode?"":t.popupClassName,b=t.disabled,C=t.triggerSubMenuAction,w=t.subMenuOpenDelay,S=t.forceSubMenuRender,x=t.subMenuCloseDelay,M=t.builtinPlacements;return Ol.forEach(function(e){return delete t[e]}),delete t.onClick,Ss.a.createElement("li",us()({},t,c,{className:a,role:"menuitem"}),i&&h,i&&d,!i&&Ss.a.createElement(_u,{prefixCls:o,popupClassName:o+"-popup "+g,getPopupContainer:v,builtinPlacements:us()({},Tu,M),popupPlacement:m,popupVisible:n,popupAlign:y,popup:d,action:b?[]:[C],mouseEnterDelay:w,mouseLeaveDelay:x,onPopupVisibleChange:this.onPopupVisibleChange,forceRender:S,zIndex:r},h))},t}(Ss.a.Component);Hu.propTypes={parentMenu:ks.a.object,title:ks.a.node,children:ks.a.any,selectedKeys:ks.a.array,openKeys:ks.a.array,onClick:ks.a.func,onOpenChange:ks.a.func,rootPrefixCls:ks.a.string,eventKey:ks.a.string,multiple:ks.a.bool,active:ks.a.bool,onItemHover:ks.a.func,onSelect:ks.a.func,triggerSubMenuAction:ks.a.string,onDeselect:ks.a.func,onDestroy:ks.a.func,onMouseEnter:ks.a.func,onMouseLeave:ks.a.func,onTitleMouseEnter:ks.a.func,onTitleMouseLeave:ks.a.func,onTitleClick:ks.a.func,popupOffset:ks.a.array,isOpen:ks.a.bool,store:ks.a.object,mode:ks.a.oneOf(["horizontal","vertical","vertical-left","vertical-right","inline"]),manualRef:ks.a.func,itemIcon:ks.a.oneOfType([ks.a.func,ks.a.node]),expandIcon:ks.a.oneOfType([ks.a.func,ks.a.node])},Hu.defaultProps={onMouseEnter:N,onMouseLeave:N,onTitleMouseEnter:N,onTitleMouseLeave:N,onTitleClick:N,manualRef:N,mode:"vertical",title:""};var Lu=function(){var e=this;this.onDestroy=function(t){e.props.onDestroy(t)},this.onKeyDown=function(t){var n=t.keyCode,r=e.menuInstance,o=e.props,i=o.isOpen,a=o.store;if(n===Xs.ENTER)return e.onTitleClick(t),Pu(a,e.props.eventKey,!0),!0;if(n===Xs.RIGHT)return i?r.onKeyDown(t):(e.triggerOpenChange(!0),Pu(a,e.props.eventKey,!0)),!0;if(n===Xs.LEFT){var c=void 0;if(!i)return;return c=r.onKeyDown(t),c||(e.triggerOpenChange(!1),c=!0),c}return!i||n!==Xs.UP&&n!==Xs.DOWN?void 0:r.onKeyDown(t)},this.onOpenChange=function(t){e.props.onOpenChange(t)},this.onPopupVisibleChange=function(t){e.triggerOpenChange(t,t?"mouseenter":"mouseleave")},this.onMouseEnter=function(t){var n=e.props,r=n.eventKey,o=n.onMouseEnter,i=n.store;Pu(i,e.props.eventKey,!1),o({key:r,domEvent:t})},this.onMouseLeave=function(t){var n=e.props,r=n.parentMenu,o=n.eventKey,i=n.onMouseLeave;r.subMenuInstance=e,i({key:o,domEvent:t})},this.onTitleMouseEnter=function(t){var n=e.props,r=n.eventKey,o=n.onItemHover,i=n.onTitleMouseEnter;o({key:r,hover:!0}),i({key:r,domEvent:t})},this.onTitleMouseLeave=function(t){var n=e.props,r=n.parentMenu,o=n.eventKey,i=n.onItemHover,a=n.onTitleMouseLeave;r.subMenuInstance=e,i({key:o,hover:!1}),a({key:o,domEvent:t})},this.onTitleClick=function(t){var n=e.props;n.onTitleClick({key:n.eventKey,domEvent:t}),"hover"!==n.triggerSubMenuAction&&(e.triggerOpenChange(!n.isOpen,"click"),Pu(n.store,e.props.eventKey,!1))},this.onSubMenuClick=function(t){e.props.onClick(e.addKeyPath(t))},this.onSelect=function(t){e.props.onSelect(t)},this.onDeselect=function(t){e.props.onDeselect(t)},this.getPrefixCls=function(){return e.props.rootPrefixCls+"-submenu"},this.getActiveClassName=function(){return e.getPrefixCls()+"-active"},this.getDisabledClassName=function(){return e.getPrefixCls()+"-disabled"},this.getSelectedClassName=function(){return e.getPrefixCls()+"-selected"},this.getOpenClassName=function(){return e.props.rootPrefixCls+"-submenu-open"},this.saveMenuInstance=function(t){e.menuInstance=t},this.addKeyPath=function(t){return us()({},t,{keyPath:(t.keyPath||[]).concat(e.props.eventKey)})},this.triggerOpenChange=function(t,n){var r=e.props.eventKey,o=function(){e.onOpenChange({key:r,item:e,trigger:n,open:t})};"mouseenter"===n?e.mouseenterTimeout=setTimeout(function(){o()},0):o()},this.isChildrenSelected=function(){var t={find:!1};return L(e.props.children,e.props.selectedKeys,t),t.find},this.isOpen=function(){return-1!==e.props.openKeys.indexOf(e.props.eventKey)},this.adjustWidth=function(){if(e.subMenuTitle&&e.menuInstance){var t=Ms.a.findDOMNode(e.menuInstance);t.offsetWidth>=e.subMenuTitle.offsetWidth||(t.style.minWidth=e.subMenuTitle.offsetWidth+"px")}},this.saveSubMenuTitle=function(t){e.subMenuTitle=t}},Du=Object(_l.connect)(function(e,t){var n=e.openKeys,r=e.activeKey,o=e.selectedKeys,i=t.eventKey,a=t.subMenuKey;return{isOpen:n.indexOf(i)>-1,active:r[a]===i,selectedKeys:o}})(Hu);Du.isSubMenu=!0;var Au=Du;!("undefined"==typeof window||!window.document||!window.document.createElement)&&n(285);var Iu=function(e){function t(){var n,r,o;fs()(this,t);for(var i=arguments.length,a=Array(i),c=0;c<i;c++)a[c]=arguments[c];return n=r=ms()(this,e.call.apply(e,[this].concat(a))),r.state={lastVisibleIndex:void 0},r.getOverflowedSubMenuItem=function(e,t,n){var o=r.props,i=o.overflowedIndicator,a=o.level,c=o.mode,s=o.prefixCls,l=o.theme,u=o.style;if(1!==a||"horizontal"!==c)return null;var p=r.props.children[0],f=p.props,h=(f.children,f.title,f.eventKey,kl()(f,["children","title","eventKey"])),d=us()({},u),v=e+"-overflowed-indicator";0===t.length&&!0!==n?d=us()({},d,{display:"none"}):n&&(d=us()({},d,{visibility:"hidden"}),v+="-placeholder");var m=l?s+"-"+l:"";return Ss.a.createElement(Au,us()({title:i,className:s+"-overflowed-submenu",popupClassName:m},h,{key:v,eventKey:e+"-overflowed-indicator",disabled:!1,style:d}),t)},r.setChildrenWidthAndResize=function(){if("horizontal"===r.props.mode){var e=Ms.a.findDOMNode(r);if(e){var t=e.children;if(t&&0!==t.length){r.childrenSizes=[];var n=r.props.children,o=e.children[t.length-1];o.style.width="auto",r.childrenSizes=n.map(function(t,n){return El(e.children[2*n+1])}),r.overflowedIndicatorWidth=El(e.children[e.children.length-1]),r.originalTotalWidth=r.childrenSizes.reduce(function(e,t){return e+t},0),r.handleResize(),o.style.width=0}}}},r.resizeObserver=null,r.mutationObserver=null,r.originalTotalWidth=0,r.overflowedItems=[],r.childrenSizes=[],r.handleResize=function(){if("horizontal"===r.props.mode){var e=Ms.a.findDOMNode(r);if(e){var t=El(e);r.overflowedItems=[];var n=0,o=void 0;r.originalTotalWidth>t&&(o=-1,r.childrenSizes.forEach(function(e){(n+=e)+r.overflowedIndicatorWidth<=t&&o++})),r.setState({lastVisibleIndex:o})}}},o=n,ms()(r,o)}return gs()(t,e),t.prototype.componentDidMount=function(){var e=this;if(this.setChildrenWidthAndResize(),1===this.props.level&&"horizontal"===this.props.mode){var t=Ms.a.findDOMNode(this);if(!t)return;this.resizeObserver=new Tl.default(function(t){t.forEach(e.setChildrenWidthAndResize)}),[].slice.call(t.children).concat(t).forEach(function(t){e.resizeObserver.observe(t)}),"undefined"!=typeof MutationObserver&&(this.mutationObserver=new MutationObserver(function(){e.resizeObserver.disconnect(),[].slice.call(t.children).concat(t).forEach(function(t){e.resizeObserver.observe(t)}),e.setChildrenWidthAndResize()}),this.mutationObserver.observe(t,{attributes:!1,childList:!0,subTree:!1}))}},t.prototype.componentWillUnmount=function(){this.resizeObserver&&this.resizeObserver.disconnect(),this.mutationObserver&&this.resizeObserver.disconnect()},t.prototype.renderChildren=function(e){var t=this,n=this.state.lastVisibleIndex;return(e||[]).reduce(function(r,o,i){var a=o;if("horizontal"===t.props.mode){var c=t.getOverflowedSubMenuItem(o.props.eventKey,[]);void 0!==n&&-1!==t.props.className.indexOf(t.props.prefixCls+"-root")&&(i>n&&(a=Ss.a.cloneElement(o,{style:{visibility:"hidden"},eventKey:o.props.eventKey+"-hidden"})),i===n+1&&(t.overflowedItems=e.slice(n+1).map(function(e){return Ss.a.cloneElement(e,{key:e.props.eventKey,mode:"vertical-left"})}),c=t.getOverflowedSubMenuItem(o.props.eventKey,t.overflowedItems)));var s=[].concat(r,[c,a]);return i===e.length-1&&s.push(t.getOverflowedSubMenuItem(o.props.eventKey,[],!0)),s}return[].concat(r,[a])},[])},t.prototype.render=function(){var e=this.props,t=e.hiddenClassName,n=e.visible,r=(e.prefixCls,e.overflowedIndicator,e.mode,e.level,e.tag),o=(e.children,e.theme,kl()(e,["hiddenClassName","visible","prefixCls","overflowedIndicator","mode","level","tag","children","theme"]));return n||(o.className+=" "+t),Ss.a.createElement(r,o,this.renderChildren(this.props.children))},t}(Ss.a.Component);Iu.propTypes={className:ks.a.string,children:ks.a.node,mode:ks.a.oneOf(["horizontal","vertical","vertical-left","vertical-right","inline"]),prefixCls:ks.a.string,level:ks.a.number,theme:ks.a.string,overflowedIndicator:ks.a.node,visible:ks.a.bool,hiddenClassName:ks.a.string,tag:ks.a.string,style:ks.a.object},Iu.defaultProps={tag:"div",className:""};var Ru=Iu,ju=function(e){function t(n){var r;fs()(this,t);var o=ms()(this,e.call(this,n));return Fu.call(o),n.store.setState({activeKey:us()({},n.store.getState().activeKey,(r={},r[n.eventKey]=Ge(n,n.activeKey),r))}),o.instanceArray=[],o}return gs()(t,e),t.prototype.componentDidMount=function(){this.props.manualRef&&this.props.manualRef(this)},t.prototype.shouldComponentUpdate=function(e){return this.props.visible||e.visible},t.prototype.componentDidUpdate=function(){var e=this.props,t="activeKey"in e?e.activeKey:e.store.getState().activeKey[Ye(e)],n=Ge(e,t);n!==t&&qe(e.store,Ye(e),n)},t.prototype.render=function(){var e=this,t=kl()(this.props,[]);this.instanceArray=[];var n=Ts()(t.prefixCls,t.className,t.prefixCls+"-"+t.mode),r={className:n,role:t.role||"menu"};t.id&&(r.id=t.id),t.focusable&&(r.tabIndex="0",r.onKeyDown=this.onKeyDown);var o=t.prefixCls,i=t.eventKey,a=t.visible,c=t.level,s=t.mode,l=t.overflowedIndicator,u=t.theme;return Ol.forEach(function(e){return delete t[e]}),delete t.onClick,Ss.a.createElement(Ru,us()({},t,{prefixCls:o,mode:s,tag:"ul",level:c,theme:u,hiddenClassName:o+"-hidden",visible:a,overflowedIndicator:l},r),Ss.a.Children.map(t.children,function(t,n){return e.renderMenuItem(t,n,i||"0-menu-")}))},t}(Ss.a.Component);ju.propTypes={onSelect:ks.a.func,onClick:ks.a.func,onDeselect:ks.a.func,onOpenChange:ks.a.func,onDestroy:ks.a.func,openTransitionName:ks.a.string,openAnimation:ks.a.oneOfType([ks.a.string,ks.a.object]),openKeys:ks.a.arrayOf(ks.a.string),visible:ks.a.bool,children:ks.a.any,parentMenu:ks.a.object,eventKey:ks.a.string,store:ks.a.shape({getState:ks.a.func,setState:ks.a.func}),focusable:ks.a.bool,multiple:ks.a.bool,style:ks.a.object,defaultActiveFirst:ks.a.bool,activeKey:ks.a.string,selectedKeys:ks.a.arrayOf(ks.a.string),defaultSelectedKeys:ks.a.arrayOf(ks.a.string),defaultOpenKeys:ks.a.arrayOf(ks.a.string),level:ks.a.number,mode:ks.a.oneOf(["horizontal","vertical","vertical-left","vertical-right","inline"]),triggerSubMenuAction:ks.a.oneOf(["click","hover"]),inlineIndent:ks.a.oneOfType([ks.a.number,ks.a.string]),manualRef:ks.a.func,itemIcon:ks.a.oneOfType([ks.a.func,ks.a.node]),expandIcon:ks.a.oneOfType([ks.a.func,ks.a.node])},ju.defaultProps={prefixCls:"rc-menu",className:"",mode:"vertical",level:1,inlineIndent:24,visible:!0,focusable:!0,style:{},manualRef:N};var Fu=function(){var e=this;this.onKeyDown=function(t,n){var r=t.keyCode,o=void 0;if(e.getFlatInstanceArray().forEach(function(e){e&&e.props.active&&e.onKeyDown&&(o=e.onKeyDown(t))}),o)return 1;var i=null;return r!==Xs.UP&&r!==Xs.DOWN||(i=e.step(r===Xs.UP?-1:1)),i?(t.preventDefault(),qe(e.props.store,Ye(e.props),i.props.eventKey),"function"==typeof n&&n(i),1):void 0},this.onItemHover=function(t){var n=t.key,r=t.hover;qe(e.props.store,Ye(e.props),r?n:null)},this.onDeselect=function(t){e.props.onDeselect(t)},this.onSelect=function(t){e.props.onSelect(t)},this.onClick=function(t){e.props.onClick(t)},this.onOpenChange=function(t){e.props.onOpenChange(t)},this.onDestroy=function(t){e.props.onDestroy(t)},this.getFlatInstanceArray=function(){return e.instanceArray},this.getOpenTransitionName=function(){return e.props.openTransitionName},this.step=function(t){var n=e.getFlatInstanceArray(),r=e.props.store.getState().activeKey[Ye(e.props)],o=n.length;if(!o)return null;t<0&&(n=n.concat().reverse());var i=-1;if(n.every(function(e,t){return!e||e.props.eventKey!==r||(i=t,!1)}),e.props.defaultActiveFirst||-1===i||!Ue(n.slice(i,o-1))){var a=(i+1)%o,c=a;do{var s=n[c];if(s&&!s.props.disabled)return s;c=(c+1)%o}while(c!==a);return null}},this.renderCommonMenuItem=function(t,n,r){var o=e.props.store.getState(),i=e.props,a=V(t,i.eventKey,n),c=t.props,s=a===o.activeKey,l=us()({mode:c.mode||i.mode,level:i.level,inlineIndent:i.inlineIndent,renderMenuItem:e.renderMenuItem,rootPrefixCls:i.prefixCls,index:n,parentMenu:i.parentMenu,manualRef:c.disabled?void 0:T(t.ref,Xe.bind(e)),eventKey:a,active:!c.disabled&&s,multiple:i.multiple,onClick:function(t){(c.onClick||N)(t),e.onClick(t)},onItemHover:e.onItemHover,openTransitionName:e.getOpenTransitionName(),openAnimation:i.openAnimation,subMenuOpenDelay:i.subMenuOpenDelay,subMenuCloseDelay:i.subMenuCloseDelay,forceSubMenuRender:i.forceSubMenuRender,onOpenChange:e.onOpenChange,onDeselect:e.onDeselect,onSelect:e.onSelect,builtinPlacements:i.builtinPlacements,itemIcon:c.itemIcon||e.props.itemIcon,expandIcon:c.expandIcon||e.props.expandIcon},r);return"inline"===i.mode&&(l.triggerSubMenuAction="click"),Ss.a.cloneElement(t,l)},this.renderMenuItem=function(t,n,r){if(!t)return null;var o=e.props.store.getState(),i={openKeys:o.openKeys,selectedKeys:o.selectedKeys,triggerSubMenuAction:e.props.triggerSubMenuAction,subMenuKey:r};return e.renderCommonMenuItem(t,n,i)}},Ku=Object(_l.connect)()(ju),Bu=Ku,Wu=function(e){function t(n){fs()(this,t);var r=ms()(this,e.call(this,n));Uu.call(r),r.isRootMenu=!0;var o=n.defaultSelectedKeys,i=n.defaultOpenKeys;return"selectedKeys"in n&&(o=n.selectedKeys||[]),"openKeys"in n&&(i=n.openKeys||[]),r.store=Object(_l.create)({selectedKeys:o,openKeys:i,activeKey:{"0-menu-":Ge(n,n.activeKey)}}),r}return gs()(t,e),t.prototype.componentDidMount=function(){this.updateMiniStore()},t.prototype.componentDidUpdate=function(){this.updateMiniStore()},t.prototype.updateMiniStore=function(){"selectedKeys"in this.props&&this.store.setState({selectedKeys:this.props.selectedKeys||[]}),"openKeys"in this.props&&this.store.setState({openKeys:this.props.openKeys||[]})},t.prototype.render=function(){var e=this,t=kl()(this.props,[]);return t.className+=" "+t.prefixCls+"-root",t=us()({},t,{onClick:this.onClick,onOpenChange:this.onOpenChange,onDeselect:this.onDeselect,onSelect:this.onSelect,openTransitionName:this.getOpenTransitionName(),parentMenu:this}),Ss.a.createElement(_l.Provider,{store:this.store},Ss.a.createElement(Bu,us()({},t,{ref:function(t){return e.innerMenu=t}}),this.props.children))},t}(Ss.a.Component);Wu.propTypes={defaultSelectedKeys:ks.a.arrayOf(ks.a.string),defaultActiveFirst:ks.a.bool,selectedKeys:ks.a.arrayOf(ks.a.string),defaultOpenKeys:ks.a.arrayOf(ks.a.string),openKeys:ks.a.arrayOf(ks.a.string),mode:ks.a.oneOf(["horizontal","vertical","vertical-left","vertical-right","inline"]),getPopupContainer:ks.a.func,onClick:ks.a.func,onSelect:ks.a.func,onDeselect:ks.a.func,onDestroy:ks.a.func,openTransitionName:ks.a.string,openAnimation:ks.a.oneOfType([ks.a.string,ks.a.object]),subMenuOpenDelay:ks.a.number,subMenuCloseDelay:ks.a.number,forceSubMenuRender:ks.a.bool,triggerSubMenuAction:ks.a.string,level:ks.a.number,selectable:ks.a.bool,multiple:ks.a.bool,children:ks.a.any,className:ks.a.string,style:ks.a.object,activeKey:ks.a.string,prefixCls:ks.a.string,builtinPlacements:ks.a.object,itemIcon:ks.a.oneOfType([ks.a.func,ks.a.node]),expandIcon:ks.a.oneOfType([ks.a.func,ks.a.node]),overflowedIndicator:ks.a.node},Wu.defaultProps={selectable:!0,onClick:N,onSelect:N,onOpenChange:N,onDeselect:N,defaultSelectedKeys:[],defaultOpenKeys:[],subMenuOpenDelay:.1,subMenuCloseDelay:.1,triggerSubMenuAction:"hover",prefixCls:"rc-menu",className:"",mode:"vertical",style:{},builtinPlacements:{},overflowedIndicator:Ss.a.createElement("span",null,"\xb7\xb7\xb7")};var Uu=function(){var e=this;this.onSelect=function(t){var n=e.props;if(n.selectable){var r=e.store.getState().selectedKeys,o=t.key;r=n.multiple?r.concat([o]):[o],"selectedKeys"in n||e.store.setState({selectedKeys:r}),n.onSelect(us()({},t,{selectedKeys:r}))}},this.onClick=function(t){e.props.onClick(t)},this.onKeyDown=function(t,n){e.innerMenu.getWrappedInstance().onKeyDown(t,n)},this.onOpenChange=function(t){var n=e.props,r=e.store.getState().openKeys.concat(),o=!1,i=function(e){var t=!1;if(e.open)(t=-1===r.indexOf(e.key))&&r.push(e.key);else{var n=r.indexOf(e.key);t=-1!==n,t&&r.splice(n,1)}o=o||t};Array.isArray(t)?t.forEach(i):i(t),o&&("openKeys"in e.props||e.store.setState({openKeys:r}),n.onOpenChange(r))},this.onDeselect=function(t){var n=e.props;if(n.selectable){var r=e.store.getState().selectedKeys.concat(),o=t.key,i=r.indexOf(o);-1!==i&&r.splice(i,1),"selectedKeys"in n||e.store.setState({selectedKeys:r}),n.onDeselect(us()({},t,{selectedKeys:r}))}},this.getOpenTransitionName=function(){var t=e.props,n=t.openTransitionName,r=t.openAnimation;return n||"string"!=typeof r||(n=t.prefixCls+"-open-"+r),n}},qu=Wu,Yu=n(77),Gu=n.n(Yu),Xu=function(e){function t(n){fs()(this,t);var r=ms()(this,e.call(this,n));return r.onKeyDown=function(e){if(e.keyCode===Xs.ENTER)return r.onClick(e),!0},r.onMouseLeave=function(e){var t=r.props,n=t.eventKey,o=t.onItemHover,i=t.onMouseLeave;o({key:n,hover:!1}),i({key:n,domEvent:e})},r.onMouseEnter=function(e){var t=r.props,n=t.eventKey,o=t.onItemHover,i=t.onMouseEnter;o({key:n,hover:!0}),i({key:n,domEvent:e})},r.onClick=function(e){var t=r.props,n=t.eventKey,o=t.multiple,i=t.onClick,a=t.onSelect,c=t.onDeselect,s=t.isSelected,l={key:n,keyPath:[n],item:r,domEvent:e};i(l),o?s?c(l):a(l):s||a(l)},r}return gs()(t,e),t.prototype.componentDidMount=function(){this.callRef()},t.prototype.componentDidUpdate=function(){this.props.active&&Gu()(Ms.a.findDOMNode(this),Ms.a.findDOMNode(this.props.parentMenu),{onlyScrollIfNeeded:!0}),this.callRef()},t.prototype.componentWillUnmount=function(){var e=this.props;e.onDestroy&&e.onDestroy(e.eventKey)},t.prototype.getPrefixCls=function(){return this.props.rootPrefixCls+"-item"},t.prototype.getActiveClassName=function(){return this.getPrefixCls()+"-active"},t.prototype.getSelectedClassName=function(){return this.getPrefixCls()+"-selected"},t.prototype.getDisabledClassName=function(){return this.getPrefixCls()+"-disabled"},t.prototype.callRef=function(){this.props.manualRef&&this.props.manualRef(this)},t.prototype.render=function(){var e,t=us()({},this.props),n=Ts()(this.getPrefixCls(),t.className,(e={},e[this.getActiveClassName()]=!t.disabled&&t.active,e[this.getSelectedClassName()]=t.isSelected,e[this.getDisabledClassName()]=t.disabled,e)),r=us()({},t.attribute,{title:t.title,className:n,role:t.role||"menuitem","aria-disabled":t.disabled});"option"===t.role?r=us()({},r,{role:"option","aria-selected":t.isSelected}):null!==t.role&&"none"!==t.role||(r.role="none");var o={onClick:t.disabled?null:this.onClick,onMouseLeave:t.disabled?null:this.onMouseLeave,onMouseEnter:t.disabled?null:this.onMouseEnter},i=us()({},t.style);"inline"===t.mode&&(i.paddingLeft=t.inlineIndent*t.level),Ol.forEach(function(e){return delete t[e]});var a=this.props.itemIcon;return"function"==typeof this.props.itemIcon&&(a=Ss.a.createElement(this.props.itemIcon,this.props)),Ss.a.createElement("li",us()({},t,r,o,{style:i}),t.children,a)},t}(Ss.a.Component);Xu.propTypes={attribute:ks.a.object,rootPrefixCls:ks.a.string,eventKey:ks.a.string,active:ks.a.bool,children:ks.a.any,selectedKeys:ks.a.array,disabled:ks.a.bool,title:ks.a.string,onItemHover:ks.a.func,onSelect:ks.a.func,onClick:ks.a.func,onDeselect:ks.a.func,parentMenu:ks.a.object,onDestroy:ks.a.func,onMouseEnter:ks.a.func,onMouseLeave:ks.a.func,multiple:ks.a.bool,isSelected:ks.a.bool,manualRef:ks.a.func,itemIcon:ks.a.oneOfType([ks.a.func,ks.a.node])},Xu.defaultProps={onSelect:N,onMouseEnter:N,onMouseLeave:N,manualRef:N},Xu.isMenuItem=!0;var $u=Object(_l.connect)(function(e,t){var n=e.activeKey,r=e.selectedKeys,o=t.eventKey;return{active:n[t.subMenuKey]===o,isSelected:-1!==r.indexOf(o)}})(Xu),Ju=$u,Zu=function(e){function t(){var n,r,o;fs()(this,t);for(var i=arguments.length,a=Array(i),c=0;c<i;c++)a[c]=arguments[c];return n=r=ms()(this,e.call.apply(e,[this].concat(a))),r.renderInnerMenuItem=function(e){var t=r.props;return(0,t.renderMenuItem)(e,t.index,r.props.subMenuKey)},o=n,ms()(r,o)}return gs()(t,e),t.prototype.render=function(){var e=kl()(this.props,[]),t=e.className,n=void 0===t?"":t,r=e.rootPrefixCls,o=r+"-item-group-title",i=r+"-item-group-list",a=e.title,c=e.children;return Ol.forEach(function(t){return delete e[t]}),delete e.onClick,Ss.a.createElement("li",us()({},e,{className:n+" "+r+"-item-group"}),Ss.a.createElement("div",{className:o,title:"string"==typeof a?a:void 0},a),Ss.a.createElement("ul",{className:i},Ss.a.Children.map(c,this.renderInnerMenuItem)))},t}(Ss.a.Component);Zu.propTypes={renderMenuItem:ks.a.func,index:ks.a.number,className:ks.a.string,subMenuKey:ks.a.string,rootPrefixCls:ks.a.string},Zu.defaultProps={disabled:!0},Zu.isMenuItemGroup=!0;var Qu=Zu,ep=function(e){function t(){return fs()(this,t),ms()(this,e.apply(this,arguments))}return gs()(t,e),t.prototype.render=function(){var e=this.props,t=e.className,n=e.rootPrefixCls,r=e.style;return Ss.a.createElement("li",{className:t+" "+n+"-item-divider",style:r})},t}(Ss.a.Component);ep.propTypes={className:ks.a.string,rootPrefixCls:ks.a.string,style:ks.a.object},ep.defaultProps={disabled:!0,className:"",style:{}};var tp=ep,np=qu,rp=n(56),op=n.n(rp),ip=function(e){function t(){return fs()(this,t),ms()(this,e.apply(this,arguments))}return gs()(t,e),t}(Ss.a.Component);ip.propTypes={value:ks.a.oneOfType([ks.a.string,ks.a.number])},ip.isSelectOption=!0;var ap=ip,cp={userSelect:"none",WebkitUserSelect:"none"},sp={unselectable:"on"},lp=function(e){function t(n){fs()(this,t);var r=ms()(this,e.call(this,n));return r.scrollActiveItemToView=function(){var e=Object(xs.findDOMNode)(r.firstActiveItem),t=r.props,n=t.value,o=t.visible,i=t.firstActiveValue;if(e&&o){var a={onlyScrollIfNeeded:!0};n&&0!==n.length||!i||(a.alignWithTop=!0),r.rafInstance=As()(function(){Gu()(e,Object(xs.findDOMNode)(r.menuRef),a)})}},r.lastInputValue=n.inputValue,r.saveMenuRef=vt(r,"menuRef"),r}return gs()(t,e),t.prototype.componentDidMount=function(){this.scrollActiveItemToView(),this.lastVisible=this.props.visible},t.prototype.shouldComponentUpdate=function(e){return e.visible||(this.lastVisible=!1),e.visible||e.inputValue!==this.props.inputValue},t.prototype.componentDidUpdate=function(e){var t=this.props;!e.visible&&t.visible&&this.scrollActiveItemToView(),this.lastVisible=t.visible,this.lastInputValue=t.inputValue},t.prototype.componentWillUnmount=function(){this.rafInstance&&this.rafInstance.cancel&&this.rafInstance.cancel()},t.prototype.renderMenu=function(){var e=this,t=this.props,n=t.menuItems,r=t.menuItemSelectedIcon,o=t.defaultActiveFirstOption,i=t.value,a=t.prefixCls,c=t.multiple,s=t.onMenuSelect,l=t.inputValue,u=t.firstActiveValue,p=t.backfillValue;if(n&&n.length){var f={};c?(f.onDeselect=t.onMenuDeselect,f.onSelect=s):f.onClick=s;var h=lt(n,i),d={},v=n;if(h.length||u){t.visible&&!this.lastVisible&&(d.activeKey=h[0]||u);var y=!1,g=function(t){return!y&&-1!==h.indexOf(t.key)||!y&&!h.length&&-1!==u.indexOf(t.key)?(y=!0,Object(ws.cloneElement)(t,{ref:function(t){e.firstActiveItem=t}})):t};v=n.map(function(e){if(e.type.isMenuItemGroup){var t=m(e.props.children).map(g);return Object(ws.cloneElement)(e,{},t)}return g(e)})}else this.firstActiveItem=null;var b=i&&i[i.length-1];return l===this.lastInputValue||b&&b===p||(d.activeKey=""),Ss.a.createElement(np,us()({ref:this.saveMenuRef,style:this.props.dropdownMenuStyle,defaultActiveFirst:o,role:"listbox",itemIcon:c?r:null},d,{multiple:c},f,{selectedKeys:h,prefixCls:a+"-menu"}),v)}return null},t.prototype.render=function(){var e=this.renderMenu();return e?Ss.a.createElement("div",{style:{overflow:"auto",transform:"translateZ(0)"},onFocus:this.props.onPopupFocus,onMouseDown:at,onScroll:this.props.onPopupScroll},e):null},t}(Ss.a.Component);lp.displayName="DropdownMenu",lp.propTypes={defaultActiveFirstOption:ks.a.bool,value:ks.a.any,dropdownMenuStyle:ks.a.object,multiple:ks.a.bool,onPopupFocus:ks.a.func,onPopupScroll:ks.a.func,onMenuDeSelect:ks.a.func,onMenuSelect:ks.a.func,prefixCls:ks.a.string,menuItems:ks.a.any,inputValue:ks.a.string,visible:ks.a.bool,firstActiveValue:ks.a.string,menuItemSelectedIcon:ks.a.oneOfType([ks.a.func,ks.a.node])};var up=lp;_u.displayName="Trigger";var pp={bottomLeft:{points:["tl","bl"],offset:[0,4],overflow:{adjustX:0,adjustY:1}},topLeft:{points:["bl","tl"],offset:[0,-4],overflow:{adjustX:0,adjustY:1}}},fp=function(e){function t(n){fs()(this,t);var r=ms()(this,e.call(this,n));return hp.call(r),r.saveDropdownMenuRef=vt(r,"dropdownMenuRef"),r.saveTriggerRef=vt(r,"triggerRef"),r.state={dropdownWidth:null},r}return gs()(t,e),t.prototype.componentDidMount=function(){this.setDropdownWidth()},t.prototype.componentDidUpdate=function(){this.setDropdownWidth()},t.prototype.render=function(){var e,t=this.props,n=t.onPopupFocus,r=kl()(t,["onPopupFocus"]),o=r.multiple,i=r.visible,a=r.inputValue,c=r.dropdownAlign,s=r.disabled,l=r.showSearch,u=r.dropdownClassName,p=r.dropdownStyle,f=r.dropdownMatchSelectWidth,h=this.getDropdownPrefixCls(),d=(e={},e[u]=!!u,e[h+"--"+(o?"multiple":"single")]=1,e),v=this.getDropdownElement({menuItems:r.options,onPopupFocus:n,multiple:o,inputValue:a,visible:i}),m=void 0;m=s?[]:rt(r)&&!l?["click"]:["blur"];var y=us()({},p),g=f?"width":"minWidth";return this.state.dropdownWidth&&(y[g]=this.state.dropdownWidth+"px"),Ss.a.createElement(_u,us()({},r,{showAction:s?[]:this.props.showAction,hideAction:m,ref:this.saveTriggerRef,popupPlacement:"bottomLeft",builtinPlacements:pp,prefixCls:h,popupTransitionName:this.getDropdownTransitionName(),onPopupVisibleChange:r.onDropdownVisibleChange,popup:v,popupAlign:c,popupVisible:i,getPopupContainer:r.getPopupContainer,popupClassName:Ts()(d),popupStyle:y}),r.children)},t}(Ss.a.Component);fp.propTypes={onPopupFocus:ks.a.func,onPopupScroll:ks.a.func,dropdownMatchSelectWidth:ks.a.bool,dropdownAlign:ks.a.object,visible:ks.a.bool,disabled:ks.a.bool,showSearch:ks.a.bool,dropdownClassName:ks.a.string,multiple:ks.a.bool,inputValue:ks.a.string,filterOption:ks.a.any,options:ks.a.any,prefixCls:ks.a.string,popupClassName:ks.a.string,children:ks.a.any,showAction:ks.a.arrayOf(ks.a.string),menuItemSelectedIcon:ks.a.oneOfType([ks.a.func,ks.a.node])};var hp=function(){var e=this;this.setDropdownWidth=function(){if(e.props.dropdownMatchSelectWidth){var t=Ms.a.findDOMNode(e).offsetWidth;t!==e.state.dropdownWidth&&e.setState({dropdownWidth:t})}},this.getInnerMenu=function(){return e.dropdownMenuRef&&e.dropdownMenuRef.menuRef},this.getPopupDOMNode=function(){return e.triggerRef.getPopupDomNode()},this.getDropdownElement=function(t){var n=e.props;return Ss.a.createElement(up,us()({ref:e.saveDropdownMenuRef},t,{prefixCls:e.getDropdownPrefixCls(),onMenuSelect:n.onMenuSelect,onMenuDeselect:n.onMenuDeselect,onPopupScroll:n.onPopupScroll,value:n.value,backfillValue:n.backfillValue,firstActiveValue:n.firstActiveValue,defaultActiveFirstOption:n.defaultActiveFirstOption,dropdownMenuStyle:n.dropdownMenuStyle,menuItemSelectedIcon:n.menuItemSelectedIcon}))},this.getDropdownTransitionName=function(){var t=e.props,n=t.transitionName;return!n&&t.animation&&(n=e.getDropdownPrefixCls()+"-"+t.animation),n},this.getDropdownPrefixCls=function(){return e.props.prefixCls+"-dropdown"}},dp=fp;fp.displayName="SelectTrigger";var vp={id:ks.a.string,defaultActiveFirstOption:ks.a.bool,multiple:ks.a.bool,filterOption:ks.a.any,children:ks.a.any,showSearch:ks.a.bool,disabled:ks.a.bool,allowClear:ks.a.bool,showArrow:ks.a.bool,tags:ks.a.bool,prefixCls:ks.a.string,className:ks.a.string,transitionName:ks.a.string,optionLabelProp:ks.a.string,optionFilterProp:ks.a.string,animation:ks.a.string,choiceTransitionName:ks.a.string,onChange:ks.a.func,onBlur:ks.a.func,onFocus:ks.a.func,onSelect:ks.a.func,onSearch:ks.a.func,onPopupScroll:ks.a.func,onMouseEnter:ks.a.func,onMouseLeave:ks.a.func,onInputKeyDown:ks.a.func,placeholder:ks.a.any,onDeselect:ks.a.func,labelInValue:ks.a.bool,value:mt,defaultValue:mt,dropdownStyle:ks.a.object,maxTagTextLength:ks.a.number,maxTagCount:ks.a.number,maxTagPlaceholder:ks.a.oneOfType([ks.a.node,ks.a.func]),tokenSeparators:ks.a.arrayOf(ks.a.string),getInputElement:ks.a.func,showAction:ks.a.arrayOf(ks.a.string),clearIcon:ks.a.node,inputIcon:ks.a.node,removeIcon:ks.a.node,menuItemSelectedIcon:ks.a.oneOfType([ks.a.func,ks.a.node])},mp=function(e){function t(n){fs()(this,t);var r=ms()(this,e.call(this,n));yp.call(r);var o=t.getOptionsInfoFromProps(n);return r.state={value:t.getValueFromProps(n,!0),inputValue:n.combobox?t.getInputValueForCombobox(n,o,!0):"",open:n.defaultOpen,optionsInfo:o,skipBuildOptionsInfo:!0},r.saveInputRef=vt(r,"inputRef"),r.saveInputMirrorRef=vt(r,"inputMirrorRef"),r.saveTopCtrlRef=vt(r,"topCtrlRef"),r.saveSelectTriggerRef=vt(r,"selectTriggerRef"),r.saveRootRef=vt(r,"rootRef"),r.saveSelectionRef=vt(r,"selectionRef"),r}return gs()(t,e),t.prototype.componentDidMount=function(){this.props.autoFocus&&this.focus()},t.prototype.componentDidUpdate=function(){if(tt(this.props)){var e=this.getInputDOMNode(),t=this.getInputMirrorDOMNode();e.value?(e.style.width="",e.style.width=t.clientWidth+"px"):e.style.width=""}this.forcePopupAlign()},t.prototype.componentWillUnmount=function(){this.clearFocusTime(),this.clearBlurTime(),this.dropdownContainer&&(Ms.a.unmountComponentAtNode(this.dropdownContainer),document.body.removeChild(this.dropdownContainer),this.dropdownContainer=null)},t.prototype.focus=function(){rt(this.props)?this.selectionRef.focus():this.getInputDOMNode().focus()},t.prototype.blur=function(){rt(this.props)?this.selectionRef.blur():this.getInputDOMNode().blur()},t.prototype.renderClear=function(){var e=this.props,t=e.prefixCls,n=e.allowClear,r=e.clearIcon,o=this.state,i=o.value,a=o.inputValue,c=Ss.a.createElement("span",us()({key:"clear",className:t+"-selection__clear",onMouseDown:at,style:cp},sp,{onClick:this.onClearSelection}),r||Ss.a.createElement("i",{className:t+"-selection__clear-icon"},"\xd7"));return n?et(this.props)?a?c:null:a||i.length?c:null:null},t.prototype.render=function(){var e,t=this.props,n=tt(t),r=this.state,o=t.className,i=t.disabled,a=t.prefixCls,c=t.inputIcon,s=this.renderTopControlNode(),l=this.state.open;l&&(this._options=this.renderFilterOptions());var u=this.getRealOpenState(),p=this._options||[],f={};for(var h in t)!t.hasOwnProperty(h)||"data-"!==h.substr(0,5)&&"aria-"!==h.substr(0,5)&&"role"!==h||(f[h]=t[h]);var d=us()({},f);nt(t)||(d=us()({},d,{onKeyDown:this.onKeyDown,tabIndex:t.disabled?-1:0}));var v=(e={},e[o]=!!o,e[a]=1,e[a+"-open"]=l,e[a+"-focused"]=l||!!this._focused,e[a+"-combobox"]=et(t),e[a+"-disabled"]=i,e[a+"-enabled"]=!i,e[a+"-allow-clear"]=!!t.allowClear,e[a+"-no-arrow"]=!t.showArrow,e);return Ss.a.createElement(dp,{onPopupFocus:this.onPopupFocus,onMouseEnter:this.props.onMouseEnter,onMouseLeave:this.props.onMouseLeave,dropdownAlign:t.dropdownAlign,dropdownClassName:t.dropdownClassName,dropdownMatchSelectWidth:t.dropdownMatchSelectWidth,defaultActiveFirstOption:t.defaultActiveFirstOption,dropdownMenuStyle:t.dropdownMenuStyle,transitionName:t.transitionName,animation:t.animation,prefixCls:t.prefixCls,dropdownStyle:t.dropdownStyle,combobox:t.combobox,showSearch:t.showSearch,options:p,multiple:n,disabled:i,visible:u,inputValue:r.inputValue,value:r.value,backfillValue:r.backfillValue,firstActiveValue:t.firstActiveValue,onDropdownVisibleChange:this.onDropdownVisibleChange,getPopupContainer:t.getPopupContainer,onMenuSelect:this.onMenuSelect,onMenuDeselect:this.onMenuDeselect,onPopupScroll:t.onPopupScroll,showAction:t.showAction,ref:this.saveSelectTriggerRef,menuItemSelectedIcon:t.menuItemSelectedIcon},Ss.a.createElement("div",{id:t.id,style:t.style,ref:this.saveRootRef,onBlur:this.onOuterBlur,onFocus:this.onOuterFocus,className:Ts()(v)},Ss.a.createElement("div",us()({ref:this.saveSelectionRef,key:"selection",className:a+"-selection\n "+a+"-selection--"+(n?"multiple":"single"),role:"combobox","aria-autocomplete":"list","aria-haspopup":"true","aria-expanded":u},d),s,this.renderClear(),n||!t.showArrow?null:Ss.a.createElement("span",us()({key:"arrow",className:a+"-arrow",style:cp},sp,{onClick:this.onArrowClick}),c||Ss.a.createElement("i",{className:a+"-arrow-icon"})))))},t}(Ss.a.Component);mp.propTypes=vp,mp.defaultProps={prefixCls:"rc-select",defaultOpen:!1,labelInValue:!1,defaultActiveFirstOption:!0,showSearch:!0,allowClear:!1,placeholder:"",onChange:yt,onFocus:yt,onBlur:yt,onSelect:yt,onSearch:yt,onDeselect:yt,onInputKeyDown:yt,showArrow:!0,dropdownMatchSelectWidth:!0,dropdownStyle:{},dropdownMenuStyle:{},optionFilterProp:"value",optionLabelProp:"value",notFoundContent:"Not Found",backfill:!1,showAction:["click"],tokenSeparators:[],autoClearSearchValue:!0},mp.getDerivedStateFromProps=function(e,t){var n=t.skipBuildOptionsInfo?t.optionsInfo:mp.getOptionsInfoFromProps(e,t),r={optionsInfo:n,skipBuildOptionsInfo:!1};if("open"in e&&(r.open=e.open),"value"in e){var o=mp.getValueFromProps(e);r.value=o,e.combobox&&(r.inputValue=mp.getInputValueForCombobox(e,n))}return r},mp.getOptionsFromChildren=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return Ss.a.Children.forEach(e,function(e){e&&(e.type.isSelectOptGroup?mp.getOptionsFromChildren(e.props.children,t):t.push(e))}),t},mp.getInputValueForCombobox=function(e,t,n){var r=[];if("value"in e&&!n&&(r=ot(e.value)),"defaultValue"in e&&n&&(r=ot(e.defaultValue)),!r.length)return"";r=r[0];var o=r;return e.labelInValue?o=r.label:t[it(r)]&&(o=t[it(r)].label),void 0===o&&(o=""),o},mp.getLabelFromOption=function(e,t){return Ze(t,e.optionLabelProp)},mp.getOptionsInfoFromProps=function(e,t){var n=mp.getOptionsFromChildren(e.children),r={};if(n.forEach(function(t){var n=Je(t);r[it(n)]={option:t,value:n,label:mp.getLabelFromOption(e,t),title:t.props.title}}),t){var o=t.optionsInfo;t.value.forEach(function(e){var t=it(e);r[t]||void 0===o[t]||(r[t]=o[t])})}return r},mp.getValueFromProps=function(e,t){var n=[];return"value"in e&&!t&&(n=ot(e.value)),"defaultValue"in e&&t&&(n=ot(e.defaultValue)),e.labelInValue&&(n=n.map(function(e){return e.key})),n};var yp=function(){var e=this;this.onInputChange=function(t){var n=e.props.tokenSeparators,r=t.target.value;if(tt(e.props)&&n.length&&pt(r,n)){var o=e.getValueByInput(r);return void 0!==o&&e.fireChange(o),e.setOpenState(!1,!0),void e.setInputValue("",!1)}e.setInputValue(r),e.setState({open:!0}),et(e.props)&&e.fireChange([r])},this.onDropdownVisibleChange=function(t){t&&!e._focused&&(e.clearBlurTime(),e.timeoutFocus(),e._focused=!0,e.updateFocusClassName()),e.setOpenState(t)},this.onKeyDown=function(t){if(!e.props.disabled){var n=t.keyCode;e.state.open&&!e.getInputDOMNode()?e.onInputKeyDown(t):n!==Xs.ENTER&&n!==Xs.DOWN||(e.setOpenState(!0),t.preventDefault())}},this.onInputKeyDown=function(t){var n=e.props;if(!n.disabled){var r=e.state,o=t.keyCode;if(tt(n)&&!t.target.value&&o===Xs.BACKSPACE){t.preventDefault();var i=r.value;return void(i.length&&e.removeSelected(i[i.length-1]))}if(o===Xs.DOWN){if(!r.open)return e.openIfHasChildren(),t.preventDefault(),void t.stopPropagation()}else if(o===Xs.ENTER&&r.open)t.preventDefault();else if(o===Xs.ESC)return void(r.open&&(e.setOpenState(!1),t.preventDefault(),t.stopPropagation()));if(e.getRealOpenState(r)){var a=e.selectTriggerRef.getInnerMenu();a&&a.onKeyDown(t,e.handleBackfill)&&(t.preventDefault(),t.stopPropagation())}}},this.onMenuSelect=function(t){var n=t.item;if(n){var r=e.state.value,o=e.props,i=Je(n),a=r[r.length-1];if(e.fireSelect(i),tt(o)){if(-1!==ct(r,i))return;r=r.concat([i])}else{if(void 0!==a&&a===i&&i!==e.state.backfillValue)return void e.setOpenState(!1,!0);r=[i],e.setOpenState(!1,!0)}e.fireChange(r);var c=void 0;c=et(o)?Ze(n,o.optionLabelProp):"",o.autoClearSearchValue&&e.setInputValue(c,!1)}},this.onMenuDeselect=function(t){var n=t.item,r=t.domEvent;if("keydown"===r.type&&r.keyCode===Xs.ENTER)return void e.removeSelected(Je(n));"click"===r.type&&e.removeSelected(Je(n)),e.props.autoClearSearchValue&&e.setInputValue("",!1)},this.onArrowClick=function(t){t.stopPropagation(),t.preventDefault(),e.props.disabled||e.setOpenState(!e.state.open,!e.state.open)},this.onPlaceholderClick=function(){e.getInputDOMNode()&&e.getInputDOMNode().focus()},this.onOuterFocus=function(t){if(e.props.disabled)return void t.preventDefault();e.clearBlurTime(),(nt(e.props)||t.target!==e.getInputDOMNode())&&(e._focused||(e._focused=!0,e.updateFocusClassName(),e.timeoutFocus()))},this.onPopupFocus=function(){e.maybeFocus(!0,!0)},this.onOuterBlur=function(t){if(e.props.disabled)return void t.preventDefault();e.blurTimer=setTimeout(function(){e._focused=!1,e.updateFocusClassName();var t=e.props,n=e.state.value,r=e.state.inputValue;if(rt(t)&&t.showSearch&&r&&t.defaultActiveFirstOption){var o=e._options||[];if(o.length){var i=ut(o);i&&(n=[Je(i)],e.fireChange(n))}}else tt(t)&&r&&(e.state.inputValue=e.getInputDOMNode().value="",void 0!==(n=e.getValueByInput(r))&&e.fireChange(n));e.setOpenState(!1),t.onBlur(e.getVLForOnChange(n))},10)},this.onClearSelection=function(t){var n=e.props,r=e.state;if(!n.disabled){var o=r.inputValue,i=r.value;t.stopPropagation(),(o||i.length)&&(i.length&&e.fireChange([]),e.setOpenState(!1,!0),o&&e.setInputValue(""))}},this.onChoiceAnimationLeave=function(){e.forcePopupAlign()},this.getOptionInfoBySingleValue=function(t,n){var r=void 0;if(n=n||e.state.optionsInfo,n[it(t)]&&(r=n[it(t)]),r)return r;var o=t;if(e.props.labelInValue){var i=st(e.props.value,t);void 0!==i&&(o=i)}return{option:Ss.a.createElement(ap,{value:t,key:t},t),value:t,label:o}},this.getOptionBySingleValue=function(t){return e.getOptionInfoBySingleValue(t).option},this.getOptionsBySingleValue=function(t){return t.map(function(t){return e.getOptionBySingleValue(t)})},this.getValueByLabel=function(t){if(void 0===t)return null;var n=null;return Object.keys(e.state.optionsInfo).forEach(function(r){var o=e.state.optionsInfo[r];ot(o.label).join("")===t&&(n=o.value)}),n},this.getVLBySingleValue=function(t){return e.props.labelInValue?{key:t,label:e.getLabelBySingleValue(t)}:t},this.getVLForOnChange=function(t){var n=t;return void 0!==n?(n=e.props.labelInValue?n.map(function(t){return{key:t,label:e.getLabelBySingleValue(t)}}):n.map(function(e){return e}),tt(e.props)?n:n[0]):n},this.getLabelBySingleValue=function(t,n){return e.getOptionInfoBySingleValue(t,n).label},this.getDropdownContainer=function(){return e.dropdownContainer||(e.dropdownContainer=document.createElement("div"),document.body.appendChild(e.dropdownContainer)),e.dropdownContainer},this.getPlaceholderElement=function(){var t=e.props,n=e.state,r=!1;n.inputValue&&(r=!0),n.value.length&&(r=!0),et(t)&&1===n.value.length&&!n.value[0]&&(r=!1);var o=t.placeholder;return o?Ss.a.createElement("div",us()({onMouseDown:at,style:us()({display:r?"none":"block"},cp)},sp,{onClick:e.onPlaceholderClick,className:t.prefixCls+"-selection__placeholder"}),o):null},this.getInputElement=function(){var t,n=e.props,r=n.getInputElement?n.getInputElement():Ss.a.createElement("input",{id:n.id,autoComplete:"off"}),o=Ts()(r.props.className,(t={},t[n.prefixCls+"-search__field"]=!0,t));return Ss.a.createElement("div",{className:n.prefixCls+"-search__field__wrap"},Ss.a.cloneElement(r,{ref:e.saveInputRef,onChange:e.onInputChange,onKeyDown:gt(e.onInputKeyDown,r.props.onKeyDown,e.props.onInputKeyDown),value:e.state.inputValue,disabled:n.disabled,className:o}),Ss.a.createElement("span",{ref:e.saveInputMirrorRef,className:n.prefixCls+"-search__field__mirror"},e.state.inputValue,"\xa0"))},this.getInputDOMNode=function(){return e.topCtrlRef?e.topCtrlRef.querySelector("input,textarea,div[contentEditable]"):e.inputRef},this.getInputMirrorDOMNode=function(){return e.inputMirrorRef},this.getPopupDOMNode=function(){return e.selectTriggerRef.getPopupDOMNode()},this.getPopupMenuComponent=function(){return e.selectTriggerRef.getInnerMenu()},this.setOpenState=function(t,n){var r=e.props;if(e.state.open===t)return void e.maybeFocus(t,n);e.props.onDropdownVisibleChange&&e.props.onDropdownVisibleChange(t);var o={open:t,backfillValue:void 0};!t&&rt(r)&&r.showSearch&&e.setInputValue("",!1),t||e.maybeFocus(t,n),e.setState(o,function(){t&&e.maybeFocus(t,n)})},this.setInputValue=function(t){var n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];t!==e.state.inputValue&&(e.setState({inputValue:t},e.forcePopupAlign),n&&e.props.onSearch(t))},this.getValueByInput=function(t){var n=e.props,r=n.multiple,o=n.tokenSeparators,i=e.state.value,a=!1;return ft(t,o).forEach(function(t){var n=[t];if(r){var o=e.getValueByLabel(t);o&&-1===ct(i,o)&&(i=i.concat(o),a=!0,e.fireSelect(o))}else-1===ct(i,t)&&(i=i.concat(n),a=!0,e.fireSelect(t))}),a?i:void 0},this.getRealOpenState=function(t){var n=(t||e.state).open,r=e._options||[];return!nt(e.props)&&e.props.showSearch||n&&!r.length&&(n=!1),n},this.handleBackfill=function(t){if(e.props.backfill&&(rt(e.props)||et(e.props))){var n=Je(t);et(e.props)&&e.setInputValue(n,!1),e.setState({value:[n],backfillValue:n})}},this.filterOption=function(t,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:ht,o=e.state.value,i=o[o.length-1];if(!t||i&&i===e.state.backfillValue)return!0;var a=e.props.filterOption;return"filterOption"in e.props?!0===e.props.filterOption&&(a=r):a=r,!a||("function"==typeof a?a.call(e,t,n):!n.props.disabled)},this.timeoutFocus=function(){e.focusTimer&&e.clearFocusTime(),e.focusTimer=setTimeout(function(){e.props.onFocus()},10)},this.clearFocusTime=function(){e.focusTimer&&(clearTimeout(e.focusTimer),e.focusTimer=null)},this.clearBlurTime=function(){e.blurTimer&&(clearTimeout(e.blurTimer),e.blurTimer=null)},this.updateFocusClassName=function(){var t=e.rootRef,n=e.props;e._focused?Zs()(t).add(n.prefixCls+"-focused"):Zs()(t).remove(n.prefixCls+"-focused")},this.maybeFocus=function(t,n){if(n||t){var r=e.getInputDOMNode(),o=document,i=o.activeElement;r&&(t||nt(e.props))?i!==r&&(r.focus(),e._focused=!0):i!==e.selectionRef&&(e.selectionRef.focus(),e._focused=!0)}},this.removeSelected=function(t,n){var r=e.props;if(!r.disabled&&!e.isChildDisabled(t)){n&&n.stopPropagation&&n.stopPropagation();var o=e.state.value.filter(function(e){return e!==t});if(tt(r)){var i=t;r.labelInValue&&(i={key:t,label:e.getLabelBySingleValue(t)}),r.onDeselect(i,e.getOptionBySingleValue(t))}e.fireChange(o)}},this.openIfHasChildren=function(){var t=e.props;(Ss.a.Children.count(t.children)||rt(t))&&e.setOpenState(!0)},this.fireSelect=function(t){e.props.onSelect(e.getVLBySingleValue(t),e.getOptionBySingleValue(t))},this.fireChange=function(t){var n=e.props;"value"in n||e.setState({value:t},e.forcePopupAlign);var r=e.getVLForOnChange(t),o=e.getOptionsBySingleValue(t);n.onChange(r,tt(e.props)?o:o[0])},this.isChildDisabled=function(t){return m(e.props.children).some(function(e){return Je(e)===t&&e.props&&e.props.disabled})},this.forcePopupAlign=function(){e.state.open&&e.selectTriggerRef.triggerRef.forcePopupAlign()},this.renderFilterOptions=function(){var t=e.state.inputValue,n=e.props,r=n.children,o=n.tags,i=n.filterOption,a=n.notFoundContent,c=[],s=[],l=e.renderFilterOptionsFromChildren(r,s,c);if(o){var u=e.state.value;if(u=u.filter(function(e){return-1===s.indexOf(e)&&(!t||String(e).indexOf(String(t))>-1)}),u.forEach(function(e){var t=e,n=Ss.a.createElement(Ju,{style:cp,role:"option",attribute:sp,value:t,key:t},t);l.push(n),c.push(n)}),t){c.every(function(n){var r=function(){return Je(n)===t};return!1!==i?!e.filterOption.call(e,t,n,r):!r()})&&l.unshift(Ss.a.createElement(Ju,{style:cp,role:"option",attribute:sp,value:t,key:t},t))}}return!l.length&&a&&(l=[Ss.a.createElement(Ju,{style:cp,attribute:sp,disabled:!0,role:"option",value:"NOT_FOUND",key:"NOT_FOUND"},a)]),l},this.renderFilterOptionsFromChildren=function(t,n,r){var o=[],i=e.props,a=e.state.inputValue,c=i.tags;return Ss.a.Children.forEach(t,function(t){if(t)if(t.type.isSelectOptGroup){var i=e.renderFilterOptionsFromChildren(t.props.children,n,r);if(i.length){var s=t.props.label,l=t.key;l||"string"!=typeof s?!s&&l&&(s=l):l=s,o.push(Ss.a.createElement(Qu,{key:l,title:s},i))}}else{op()(t.type.isSelectOption,"the children of `Select` should be `Select.Option` or `Select.OptGroup`, instead of `"+(t.type.name||t.type.displayName||t.type)+"`.");var u=Je(t);if(dt(u,e.props),e.filterOption(a,t)){var p=Ss.a.createElement(Ju,us()({style:cp,attribute:sp,value:u,key:u,role:"option"},t.props));o.push(p),r.push(p)}c&&n.push(u)}}),o},this.renderTopControlNode=function(){var t=e.state,n=t.value,r=t.open,o=t.inputValue,i=e.props,a=i.choiceTransitionName,c=i.prefixCls,s=i.maxTagTextLength,l=i.maxTagCount,u=i.maxTagPlaceholder,p=i.showSearch,f=i.removeIcon,h=c+"-selection__rendered",d=null;if(rt(i)){var v=null;if(n.length){var m=!1,y=1;p&&r?(m=!o)&&(y=.4):m=!0;var g=n[0],b=e.getOptionInfoBySingleValue(g),C=b.label,w=b.title;v=Ss.a.createElement("div",{key:"value",className:c+"-selection-selected-value",title:$e(w||C),style:{display:m?"block":"none",opacity:y}},C)}d=p?[v,Ss.a.createElement("div",{className:c+"-search "+c+"-search--inline",key:"input",style:{display:r?"block":"none"}},e.getInputElement())]:[v]}else{var S=[],x=n,M=void 0;if(void 0!==l&&n.length>l){x=x.slice(0,l);var z=e.getVLForOnChange(n.slice(l,n.length)),k="+ "+(n.length-l)+" ...";u&&(k="function"==typeof u?u(z):u),M=Ss.a.createElement("li",us()({style:cp},sp,{onMouseDown:at,className:c+"-selection__choice "+c+"-selection__choice__disabled",key:"maxTagPlaceholder",title:$e(k)}),Ss.a.createElement("div",{className:c+"-selection__choice__content"},k))}tt(i)&&(S=x.map(function(t){var n=e.getOptionInfoBySingleValue(t),r=n.label,o=n.title||r;s&&"string"==typeof r&&r.length>s&&(r=r.slice(0,s)+"...");var i=e.isChildDisabled(t),a=i?c+"-selection__choice "+c+"-selection__choice__disabled":c+"-selection__choice";return Ss.a.createElement("li",us()({style:cp},sp,{onMouseDown:at,className:a,key:t,title:$e(o)}),Ss.a.createElement("div",{className:c+"-selection__choice__content"},r),i?null:Ss.a.createElement("span",{onClick:function(n){e.removeSelected(t,n)},className:c+"-selection__choice__remove"},f||Ss.a.createElement("i",{className:c+"-selection__choice__remove-icon"},"\xd7")))})),M&&S.push(M),S.push(Ss.a.createElement("li",{className:c+"-search "+c+"-search--inline",key:"__input"},e.getInputElement())),d=tt(i)&&a?Ss.a.createElement(Ml,{onLeave:e.onChoiceAnimationLeave,component:"ul",transitionName:a},S):Ss.a.createElement("ul",null,S)}return Ss.a.createElement("div",{className:h,ref:e.saveTopCtrlRef},e.getPlaceholderElement(),d)}};mp.displayName="Select",Object(Ys.polyfill)(mp);var gp=mp,bp=function(e){function t(){return fs()(this,t),ms()(this,e.apply(this,arguments))}return gs()(t,e),t}(Ss.a.Component);bp.isSelectOptGroup=!0;var Cp=bp;gp.Option=ap,gp.OptGroup=Cp;var wp=gp,Sp=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"getLocale",value:function(){var e=this.props,t=e.componentName,n=e.defaultLocale,r=this.context.antLocale,o=r&&r[t];return us()({},"function"==typeof n?n():n,o||{})}},{key:"getLocaleCode",value:function(){var e=this.context.antLocale,t=e&&e.locale;return e&&e.exist&&!t?"en-us":t}},{key:"render",value:function(){return this.props.children(this.getLocale(),this.getLocaleCode())}}]),t}(ws.Component),xp=Sp;Sp.contextTypes={antLocale:zs.object};var Mp=n(43),zp=n(288),kp=n(289),_p={primaryColor:"#333",secondaryColor:"#E6E6E6"},Op=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e,n=this.props,r=n.type,o=n.className,i=n.onClick,a=n.style,c=n.primaryColor,s=n.secondaryColor,l=kl()(n,["type","className","onClick","style","primaryColor","secondaryColor"]),u=void 0,p=_p;if(c&&(p={primaryColor:c,secondaryColor:s||Object(kp.c)(c)}),Object(kp.d)(r))u=r;else if("string"==typeof r&&!(u=t.get(r,p)))return null;return u?(u&&"function"==typeof u.icon&&(u=us()({},u,{icon:u.icon(p.primaryColor,p.secondaryColor)})),Object(kp.b)(u.icon,"svg-"+u.name,us()((e={className:o,onClick:i,style:a},ss()(e,"data-icon",u.name),ss()(e,"width","1em"),ss()(e,"height","1em"),ss()(e,"fill","currentColor"),ss()(e,"aria-hidden","true"),e),l))):(Object(kp.e)("type should be string or icon definiton, but got "+r),null)}}],[{key:"add",value:function(){for(var e=this,t=arguments.length,n=Array(t),r=0;r<t;r++)n[r]=arguments[r];n.forEach(function(t){e.definitions.set(Object(kp.f)(t.name,t.theme),t)})}},{key:"clear",value:function(){this.definitions.clear()}},{key:"get",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:_p;if(e){var n=this.definitions.get(e);return n&&"function"==typeof n.icon&&(n=us()({},n,{icon:n.icon(t.primaryColor,t.secondaryColor)})),n}}},{key:"setTwoToneColors",value:function(e){var t=e.primaryColor,n=e.secondaryColor;_p.primaryColor=t,_p.secondaryColor=n||Object(kp.c)(t)}},{key:"getTwoToneColors",value:function(){return us()({},_p)}}]),t}(ws.Component);Op.displayName="IconReact",Op.definitions=new kp.a;var Ep=Op,Tp=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},Np=new Set,Vp={},Pp=function(e,t){e||Vp[t]||(op()(!1,t),Vp[t]=!0)},Hp=ss()({width:"1em",height:"1em",fill:"currentColor"},"aria-hidden","true"),Lp=/-fill$/,Dp=/-o$/,Ap=/-twotone$/,Ip=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n};Ep.add.apply(Ep,Ls()(Object.keys(zp).map(function(e){return zp[e]}))),xt("#1890ff");var Rp="outlined",jp=void 0,Fp=function(e){var t,n=e.className,r=e.type,o=e.component,i=e.viewBox,a=e.spin,c=e.children,s=e.theme,l=e.twoToneColor,u=Ip(e,["className","type","component","viewBox","spin","children","theme","twoToneColor"]);Pp(Boolean(r||o||c),"Icon should have `type` prop or `component` prop or `children`.");var p=Ts()((t={},ss()(t,"anticon",!0),ss()(t,"anticon-"+r,Boolean(r)),t),n),f=Ts()(ss()({},"anticon-spin",!!a||"loading"===r)),h=void 0;if(o){var d=us()({},Hp,{className:f,viewBox:i});i||delete d.viewBox,h=ws.createElement(o,d,c)}if(c){Pp(Boolean(i)||1===ws.Children.count(c)&&ws.isValidElement(c)&&"use"===ws.Children.only(c).type,"Make sure that you provide correct `viewBox` prop (default `0 0 1024 1024`) to the icon.");var v=us()({},Hp,{className:f});h=ws.createElement("svg",us()({},v,{viewBox:i}),c)}if("string"==typeof r){var m=r;if(s){var y=Ct(r);Pp(!y,"This icon already has a theme '"+y+"'. The prop 'theme' "+s+" will be ignored.")}m=St(wt(r),jp||s||Rp),h=ws.createElement(Ep,{className:f,type:m,primaryColor:l})}return ws.createElement("i",us()({},u,{className:p}),h)};Fp.displayName="Icon",Fp.createFromIconfontCN=bt,Fp.getTwoToneColor=Mt,Fp.setTwoToneColor=xt;var Kp=Fp,Bp=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},Wp={prefixCls:zs.string,className:zs.string,size:zs.oneOf(["default","large","small"]),notFoundContent:zs.any,showSearch:zs.bool,optionLabelProp:zs.string,transitionName:zs.string,choiceTransitionName:zs.string,id:zs.string},Up=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.saveSelect=function(e){n.rcSelect=e},n.renderSelect=function(e){var t,r=n.props,o=r.prefixCls,i=r.className,a=void 0===i?"":i,c=r.size,s=r.mode,l=Bp(r,["prefixCls","className","size","mode"]),u=Ts()((t={},ss()(t,o+"-lg","large"===c),ss()(t,o+"-sm","small"===c),t),a),p=n.props.optionLabelProp;n.isCombobox()&&(p=p||"value");var f={multiple:"multiple"===s,tags:"tags"===s,combobox:n.isCombobox()},h=ws.createElement(Kp,{type:"down",className:o+"-arrow-icon"}),d=ws.createElement(Kp,{type:"close",className:o+"-remove-icon"}),v=ws.createElement(Kp,{type:"close-circle",theme:"filled",className:o+"-clear-icon"}),m=ws.createElement(Kp,{type:"check",className:o+"-selected-icon"});return ws.createElement(wp,us()({inputIcon:h,removeIcon:d,clearIcon:v,menuItemSelectedIcon:m},l,f,{prefixCls:o,className:u,optionLabelProp:p||"children",notFoundContent:n.getNotFoundContent(e),ref:n.saveSelect}))},op()("combobox"!==e.mode,"The combobox mode of Select is deprecated,it will be removed in next major version,please use AutoComplete instead"),n}return gs()(t,e),ds()(t,[{key:"focus",value:function(){this.rcSelect.focus()}},{key:"blur",value:function(){this.rcSelect.blur()}},{key:"getNotFoundContent",value:function(e){var t=this.props.notFoundContent;return this.isCombobox()?void 0===t?null:t:void 0===t?e.notFoundContent:t}},{key:"isCombobox",value:function(){var e=this.props.mode;return"combobox"===e||e===t.SECRET_COMBOBOX_MODE_DO_NOT_USE}},{key:"render",value:function(){return ws.createElement(xp,{componentName:"Select",defaultLocale:Mp.a.Select},this.renderSelect)}}]),t}(ws.Component),qp=Up;Up.Option=ap,Up.OptGroup=Cp,Up.SECRET_COMBOBOX_MODE_DO_NOT_USE="SECRET_COMBOBOX_MODE_DO_NOT_USE",Up.defaultProps={prefixCls:"ant-select",showSearch:!1,transitionName:"slide-up",choiceTransitionName:"zoom"},Up.propTypes=Wp;var Yp=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.handleKeyDown=function(t){var n=e.props,r=n.onPressEnter,o=n.onKeyDown;13===t.keyCode&&r&&r(t),o&&o(t)},e.saveInput=function(t){e.input=t},e}return gs()(t,e),ds()(t,[{key:"focus",value:function(){this.input.focus()}},{key:"blur",value:function(){this.input.blur()}},{key:"select",value:function(){this.input.select()}},{key:"getInputClassName",value:function(){var e,t=this.props,n=t.prefixCls,r=t.size,o=t.disabled;return Ts()(n,(e={},ss()(e,n+"-sm","small"===r),ss()(e,n+"-lg","large"===r),ss()(e,n+"-disabled",o),e))}},{key:"renderLabeledInput",value:function(e){var t,n=this.props;if(!n.addonBefore&&!n.addonAfter)return e;var r=n.prefixCls+"-group",o=r+"-addon",i=n.addonBefore?ws.createElement("span",{className:o},n.addonBefore):null,a=n.addonAfter?ws.createElement("span",{className:o},n.addonAfter):null,c=Ts()(n.prefixCls+"-wrapper",ss()({},r,i||a)),s=Ts()(n.prefixCls+"-group-wrapper",(t={},ss()(t,n.prefixCls+"-group-wrapper-sm","small"===n.size),ss()(t,n.prefixCls+"-group-wrapper-lg","large"===n.size),t));return ws.createElement("span",{className:s,style:n.style},ws.createElement("span",{className:c},i,ws.cloneElement(e,{style:null}),a))}},{key:"renderLabeledIcon",value:function(e){var t,n=this.props;if(!("prefix"in n||"suffix"in n))return e;var r=n.prefix?ws.createElement("span",{className:n.prefixCls+"-prefix"},n.prefix):null,o=n.suffix?ws.createElement("span",{className:n.prefixCls+"-suffix"},n.suffix):null,i=Ts()(n.className,n.prefixCls+"-affix-wrapper",(t={},ss()(t,n.prefixCls+"-affix-wrapper-sm","small"===n.size),ss()(t,n.prefixCls+"-affix-wrapper-lg","large"===n.size),t));return ws.createElement("span",{className:i,style:n.style},r,ws.cloneElement(e,{style:null,className:this.getInputClassName()}),o)}},{key:"renderInput",value:function(){var e=this.props,t=e.value,n=e.className,r=Ps(this.props,["prefixCls","onPressEnter","addonBefore","addonAfter","prefix","suffix"]);return"value"in this.props&&(r.value=zt(t),delete r.defaultValue),this.renderLabeledIcon(ws.createElement("input",us()({},r,{className:Ts()(this.getInputClassName(),n),onKeyDown:this.handleKeyDown,ref:this.saveInput})))}},{key:"render",value:function(){return this.renderLabeledInput(this.renderInput())}}]),t}(ws.Component),Gp=Yp;Yp.defaultProps={prefixCls:"ant-input",type:"text",disabled:!1},Yp.propTypes={type:zs.string,id:zs.oneOfType([zs.string,zs.number]),size:zs.oneOf(["small","default","large"]),maxLength:zs.oneOfType([zs.string,zs.number]),disabled:zs.bool,value:zs.any,defaultValue:zs.any,className:zs.string,addonBefore:zs.node,addonAfter:zs.node,prefixCls:zs.string,onPressEnter:zs.func,onKeyDown:zs.func,onKeyUp:zs.func,onFocus:zs.func,onBlur:zs.func,prefix:zs.node,suffix:zs.node};var Xp=function(e){var t,n=e.prefixCls,r=void 0===n?"ant-input-group":n,o=e.className,i=void 0===o?"":o,a=Ts()(r,(t={},ss()(t,r+"-lg","large"===e.size),ss()(t,r+"-sm","small"===e.size),ss()(t,r+"-compact",e.compact),t),i);return ws.createElement("span",{className:a,style:e.style,onMouseEnter:e.onMouseEnter,onMouseLeave:e.onMouseLeave,onFocus:e.onFocus,onBlur:e.onBlur},e.children)},$p=Xp,Jp=n(78),Zp=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},Qp=/^[\u4e00-\u9fa5]{2}$/,ef=Qp.test.bind(Qp),tf=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.handleClick=function(e){var t=n.props.onClick;t&&t(e)},n.state={loading:e.loading,hasTwoCNChar:!1},n}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){this.fixTwoCNChar()}},{key:"componentWillReceiveProps",value:function(e){var t=this,n=this.props.loading,r=e.loading;n&&clearTimeout(this.delayTimeout),"boolean"!=typeof r&&r&&r.delay?this.delayTimeout=window.setTimeout(function(){return t.setState({loading:r})},r.delay):this.setState({loading:r})}},{key:"componentDidUpdate",value:function(){this.fixTwoCNChar()}},{key:"componentWillUnmount",value:function(){this.delayTimeout&&clearTimeout(this.delayTimeout)}},{key:"fixTwoCNChar",value:function(){var e=Object(xs.findDOMNode)(this),t=e.textContent||e.innerText;this.isNeedInserted()&&ef(t)?this.state.hasTwoCNChar||this.setState({hasTwoCNChar:!0}):this.state.hasTwoCNChar&&this.setState({hasTwoCNChar:!1})}},{key:"isNeedInserted",value:function(){var e=this.props,t=e.icon,n=e.children;return 1===ws.Children.count(n)&&!t}},{key:"render",value:function(){var e,t=this,n=this.props,r=n.type,o=n.shape,i=n.size,a=n.className,c=n.children,s=n.icon,l=n.prefixCls,u=n.ghost,p=(n.loading,n.block),f=Zp(n,["type","shape","size","className","children","icon","prefixCls","ghost","loading","block"]),h=this.state,d=h.loading,v=h.hasTwoCNChar,m="";switch(i){case"large":m="lg";break;case"small":m="sm"}var y=new Date,g=11===y.getMonth()&&25===y.getDate(),b=Ts()(l,a,(e={},ss()(e,l+"-"+r,r),ss()(e,l+"-"+o,o),ss()(e,l+"-"+m,m),ss()(e,l+"-icon-only",!c&&s),ss()(e,l+"-loading",d),ss()(e,l+"-background-ghost",u),ss()(e,l+"-two-chinese-chars",v),ss()(e,l+"-block",p),ss()(e,"christmas",g),e)),C=d?"loading":s,w=C?ws.createElement(Kp,{type:C}):null,S=c||0===c?ws.Children.map(c,function(e){return _t(e,t.isNeedInserted())}):null,x=g?"Ho Ho Ho!":f.title;if("href"in f)return ws.createElement("a",us()({},f,{className:b,onClick:this.handleClick,title:x}),w,S);var M=f.htmlType,z=Zp(f,["htmlType"]);return ws.createElement(Jp.a,null,ws.createElement("button",us()({},z,{type:M||"button",className:b,onClick:this.handleClick,title:x}),w,S))}}]),t}(ws.Component),nf=tf;tf.__ANT_BUTTON=!0,tf.defaultProps={prefixCls:"ant-btn",loading:!1,ghost:!1,block:!1},tf.propTypes={type:zs.string,shape:zs.oneOf(["circle","circle-outline"]),size:zs.oneOf(["large","default","small"]),htmlType:zs.oneOf(["submit","button","reset"]),onClick:zs.func,loading:zs.oneOfType([zs.bool,zs.object]),className:zs.string,icon:zs.string,block:zs.bool};var rf=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},of=function(e){var t=e.prefixCls,n=void 0===t?"ant-btn-group":t,r=e.size,o=e.className,i=rf(e,["prefixCls","size","className"]),a="";switch(r){case"large":a="lg";break;case"small":a="sm"}var c=Ts()(n,ss()({},n+"-"+a,a),o);return ws.createElement("div",us()({},i,{className:c}))},af=of;nf.Group=af;var cf=nf,sf=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},lf=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.onSearch=function(t){var n=e.props.onSearch;n&&n(e.input.input.value,t),e.input.focus()},e.saveInput=function(t){e.input=t},e}return gs()(t,e),ds()(t,[{key:"focus",value:function(){this.input.focus()}},{key:"blur",value:function(){this.input.blur()}},{key:"getButtonOrIcon",value:function(){var e=this.props,t=e.enterButton,n=e.prefixCls,r=e.size,o=e.disabled,i=t,a=void 0;return a=t?i.type===cf||"button"===i.type?ws.cloneElement(i,i.type===cf?{className:n+"-button",size:r}:{}):ws.createElement(cf,{className:n+"-button",type:"primary",size:r,disabled:o,key:"enterButton"},!0===t?ws.createElement(Kp,{type:"search"}):t):ws.createElement(Kp,{className:n+"-icon",type:"search",key:"searchIcon"}),ws.cloneElement(a,{onClick:this.onSearch})}},{key:"render",value:function(){var e,t=this.props,n=t.className,r=t.prefixCls,o=t.inputPrefixCls,i=t.size,a=t.suffix,c=t.enterButton,s=sf(t,["className","prefixCls","inputPrefixCls","size","suffix","enterButton"]);delete s.onSearch;var l=this.getButtonOrIcon(),u=a?[a,l]:l,p=Ts()(r,n,(e={},ss()(e,r+"-enter-button",!!c),ss()(e,r+"-"+i,!!i),e));return ws.createElement(Gp,us()({onPressEnter:this.onSearch},s,{size:i,className:p,prefixCls:o,suffix:u,ref:this.saveInput}))}}]),t}(ws.Component),uf=lf;lf.defaultProps={inputPrefixCls:"ant-input",prefixCls:"ant-input-search",enterButton:!1};var pf="\n min-height:0 !important;\n max-height:none !important;\n height:0 !important;\n visibility:hidden !important;\n overflow:hidden !important;\n position:absolute !important;\n z-index:-1000 !important;\n top:0 !important;\n right:0 !important\n",ff=["letter-spacing","line-height","padding-top","padding-bottom","font-family","font-weight","font-size","text-rendering","text-transform","width","text-indent","padding-left","padding-right","border-width","box-sizing"],hf={},df=void 0,vf=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.state={textareaStyles:{}},e.resizeTextarea=function(){var t=e.props.autosize;if(t&&e.textAreaRef){var n=t?t.minRows:null,r=t?t.maxRows:null,o=Et(e.textAreaRef,!1,n,r);e.setState({textareaStyles:o})}},e.handleTextareaChange=function(t){"value"in e.props||e.resizeTextarea();var n=e.props.onChange;n&&n(t)},e.handleKeyDown=function(t){var n=e.props,r=n.onPressEnter,o=n.onKeyDown;13===t.keyCode&&r&&r(t),o&&o(t)},e.saveTextAreaRef=function(t){e.textAreaRef=t},e}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){this.resizeTextarea()}},{key:"componentWillReceiveProps",value:function(e){this.props.value!==e.value&&(this.nextFrameActionId&&Nt(this.nextFrameActionId),this.nextFrameActionId=Tt(this.resizeTextarea))}},{key:"focus",value:function(){this.textAreaRef.focus()}},{key:"blur",value:function(){this.textAreaRef.blur()}},{key:"getTextAreaClassName",value:function(){var e=this.props,t=e.prefixCls,n=e.className,r=e.disabled;return Ts()(t,n,ss()({},t+"-disabled",r))}},{key:"render",value:function(){var e=this.props,t=Ps(e,["prefixCls","onPressEnter","autosize"]),n=us()({},e.style,this.state.textareaStyles);return"value"in t&&(t.value=t.value||""),ws.createElement("textarea",us()({},t,{className:this.getTextAreaClassName(),style:n,onKeyDown:this.handleKeyDown,onChange:this.handleTextareaChange,ref:this.saveTextAreaRef}))}}]),t}(ws.Component),mf=vf;vf.defaultProps={prefixCls:"ant-input"},Gp.Group=$p,Gp.Search=uf,Gp.TextArea=mf;var yf=Gp,gf=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.focus=function(){e.ele.focus?e.ele.focus():xs.findDOMNode(e.ele).focus()},e.blur=function(){e.ele.blur?e.ele.blur():xs.findDOMNode(e.ele).blur()},e.saveRef=function(t){e.ele=t;var n=e.props.children.ref;"function"==typeof n&&n(t)},e}return gs()(t,e),ds()(t,[{key:"render",value:function(){return ws.cloneElement(this.props.children,us()({},this.props,{ref:this.saveRef}),null)}}]),t}(ws.Component),bf=gf,Cf=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.getInputElement=function(){var t=e.props.children,n=t&&ws.isValidElement(t)&&t.type!==ap?ws.Children.only(e.props.children):ws.createElement(yf,null),r=us()({},n.props);return delete r.children,ws.createElement(bf,r,n)},e.saveSelect=function(t){e.select=t},e}return gs()(t,e),ds()(t,[{key:"focus",value:function(){this.select.focus()}},{key:"blur",value:function(){this.select.blur()}},{key:"render",value:function(){var e,t=this.props,n=t.size,r=t.className,o=void 0===r?"":r,i=t.notFoundContent,a=t.prefixCls,c=t.optionLabelProp,s=t.dataSource,l=t.children,u=Ts()((e={},ss()(e,a+"-lg","large"===n),ss()(e,a+"-sm","small"===n),ss()(e,o,!!o),ss()(e,a+"-show-search",!0),ss()(e,a+"-auto-complete",!0),e)),p=void 0,f=ws.Children.toArray(l);return p=f.length&&Vt(f[0])?l:s?s.map(function(e){if(ws.isValidElement(e))return e;switch(void 0===e?"undefined":Cs()(e)){case"string":return ws.createElement(ap,{key:e},e);case"object":return ws.createElement(ap,{key:e.value},e.text);default:throw new Error("AutoComplete[dataSource] only supports type `string[] | Object[]`.")}}):[],ws.createElement(qp,us()({},this.props,{className:u,mode:qp.SECRET_COMBOBOX_MODE_DO_NOT_USE,optionLabelProp:c,getInputElement:this.getInputElement,notFoundContent:i,ref:this.saveSelect}),p)}}]),t}(ws.Component),wf=Cf;Cf.Option=ap,Cf.OptGroup=Cp,Cf.defaultProps={prefixCls:"ant-select",transitionName:"slide-up",optionLabelProp:"children",choiceTransitionName:"zoom",showSearch:!1,filterOption:!1};var Sf=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.handleClose=function(e){e.preventDefault();var t=xs.findDOMNode(n);t.style.height=t.offsetHeight+"px",t.style.height=t.offsetHeight+"px",n.setState({closing:!1}),(n.props.onClose||Ht)(e)},n.animationEnd=function(){n.setState({closed:!0,closing:!0}),(n.props.afterClose||Ht)()},n.state={closing:!0,closed:!1},n}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e,t=this.props,n=t.closable,r=t.description,o=t.type,i=t.prefixCls,a=void 0===i?"ant-alert":i,c=t.message,s=t.closeText,l=t.showIcon,u=t.banner,p=t.className,f=void 0===p?"":p,h=t.style,d=t.iconType;l=!(!u||void 0!==l)||l,o=u&&void 0===o?"warning":o||"info";var v="filled";if(!d){switch(o){case"success":d="check-circle";break;case"info":d="info-circle";break;case"error":d="close-circle";break;case"warning":d="exclamation-circle";break;default:d="default"}r&&(v="outlined")}var m=Ts()(a,a+"-"+o,(e={},ss()(e,a+"-close",!this.state.closing),ss()(e,a+"-with-description",!!r),ss()(e,a+"-no-icon",!l),ss()(e,a+"-banner",!!u),e),f);s&&(n=!0);var y=n?ws.createElement("a",{onClick:this.handleClose,className:a+"-close-icon"},s||ws.createElement(Kp,{type:"close"})):null,g=Pt(this.props),b=ws.createElement(Kp,{className:a+"-icon",type:d,theme:v});return this.state.closed?null:ws.createElement(Ml,{component:"",showProp:"data-show",transitionName:a+"-slide-up",onEnd:this.animationEnd},ws.createElement("div",us()({"data-show":this.state.closing,className:m,style:h},g),l?b:null,ws.createElement("span",{className:a+"-message"},c),ws.createElement("span",{className:a+"-description"},r),y))}}]),t}(ws.Component),xf=Sf,Mf=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},zf=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.setScale=function(){var e=n.avatarChildren;if(e){var t=e.offsetWidth,r=xs.findDOMNode(n),o=r.getBoundingClientRect().width;o-8<t?n.setState({scale:(o-8)/t}):n.setState({scale:1})}},n.handleImgLoadError=function(){var e=n.props.onError;!1!==(e?e():void 0)&&n.setState({isImgExist:!1})},n.state={scale:1,isImgExist:!0},n}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){this.setScale()}},{key:"componentDidUpdate",value:function(e,t){(e.children!==this.props.children||t.scale!==this.state.scale&&1===this.state.scale||t.isImgExist!==this.state.isImgExist)&&this.setScale()}},{key:"render",value:function(){var e,t,n=this,r=this.props,o=r.prefixCls,i=r.shape,a=r.size,c=r.src,s=r.icon,l=r.className,u=r.alt,p=Mf(r,["prefixCls","shape","size","src","icon","className","alt"]),f=this.state,h=f.isImgExist,d=f.scale,v=Ts()((e={},ss()(e,o+"-lg","large"===a),ss()(e,o+"-sm","small"===a),e)),m=Ts()(o,l,v,(t={},ss()(t,o+"-"+i,i),ss()(t,o+"-image",c&&h),ss()(t,o+"-icon",s),t)),y="number"==typeof a?{width:a,height:a,lineHeight:a+"px",fontSize:s?a/2:18}:{},g=this.props.children;if(c&&h)g=ws.createElement("img",{src:c,onError:this.handleImgLoadError,alt:u});else if(s)g=ws.createElement(Kp,{type:s});else{var b=this.avatarChildren;if(b||1!==d){var C={msTransform:"scale("+d+")",WebkitTransform:"scale("+d+")",transform:"scale("+d+")",position:"absolute",display:"inline-block",left:"calc(50% - "+Math.round(b.offsetWidth/2)+"px)"},w="number"==typeof a?{lineHeight:a+"px"}:{};g=ws.createElement("span",{className:o+"-string",ref:function(e){return n.avatarChildren=e},style:us()({},w,C)},g)}else g=ws.createElement("span",{className:o+"-string",ref:function(e){return n.avatarChildren=e}},g)}return ws.createElement("span",us()({},p,{style:us()({},y,p.style),className:m}),g)}}]),t}(ws.Component),kf=zf;zf.defaultProps={prefixCls:"ant-avatar",shape:"circle",size:"default"};var _f=function(e,t,n,r){var o=n-t;return e/=r/2,e<1?o/2*e*e*e+t:o/2*((e-=2)*e*e+2)+t},Of=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.getCurrentScrollTop=function(){var e=n.props.target||Dt,t=e();return t===window?window.pageYOffset||document.body.scrollTop||document.documentElement.scrollTop:t.scrollTop},n.scrollToTop=function(e){var t=n.getCurrentScrollTop(),r=Date.now(),o=function e(){var o=Date.now(),i=o-r;n.setScrollTop(_f(i,t,0,450)),i<450?As()(e):n.setScrollTop(0)};As()(o),(n.props.onClick||Lt)(e)},n.handleScroll=function(){var e=n.props,t=e.visibilityHeight,r=e.target,o=void 0===r?Dt:r,a=i(o(),!0);n.setState({visible:a>t})},n.state={visible:!1},n}return gs()(t,e),ds()(t,[{key:"setScrollTop",value:function(e){var t=this.props.target||Dt,n=t();n===window?(document.body.scrollTop=e,document.documentElement.scrollTop=e):n.scrollTop=e}},{key:"componentDidMount",value:function(){var e=this.props.target||Dt;this.scrollEvent=r(e(),"scroll",this.handleScroll),this.handleScroll()}},{key:"componentWillUnmount",value:function(){this.scrollEvent&&this.scrollEvent.remove()}},{key:"render",value:function(){var e=this.props,t=e.prefixCls,n=void 0===t?"ant-back-top":t,r=e.className,o=void 0===r?"":r,i=e.children,a=Ts()(n,o),c=ws.createElement("div",{className:n+"-content"},ws.createElement("div",{className:n+"-icon"})),s=Ps(this.props,["prefixCls","className","children","visibilityHeight","target"]),l=this.state.visible?ws.createElement("div",us()({},s,{className:a,onClick:this.scrollToTop}),i||c):null;return ws.createElement(Ml,{component:"",transitionName:"fade"},l)}}]),t}(ws.Component),Ef=Of;Of.defaultProps={visibilityHeight:400};var Tf=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.state={animateStarted:!0,count:e.count},n}return gs()(t,e),ds()(t,[{key:"getPositionByNum",value:function(e,t){if(this.state.animateStarted)return 10+e;var n=At(this.state.count)[t],r=At(this.lastCount)[t];return this.state.count>this.lastCount?n>=r?10+e:20+e:n<=r?10+e:e}},{key:"componentWillReceiveProps",value:function(e){var t=this;if("count"in e){if(this.state.count===e.count)return;this.lastCount=this.state.count,this.setState({animateStarted:!0},function(){setTimeout(function(){t.setState({animateStarted:!1,count:e.count},function(){var e=t.props.onAnimated;e&&e()})},5)})}}},{key:"renderNumberList",value:function(e){for(var t=[],n=0;n<30;n++){var r=e===n?"current":"";t.push(ws.createElement("p",{key:n.toString(),className:r},n%10))}return t}},{key:"renderCurrentNumber",value:function(e,t){var n=this.getPositionByNum(e,t),r=this.state.animateStarted||void 0===At(this.lastCount)[t];return Object(ws.createElement)("span",{className:this.props.prefixCls+"-only",style:{transition:r?"none":void 0,msTransform:"translateY("+100*-n+"%)",WebkitTransform:"translateY("+100*-n+"%)",transform:"translateY("+100*-n+"%)"},key:t},this.renderNumberList(n))}},{key:"renderNumberElement",value:function(){var e=this,t=this.state;return!t.count||isNaN(t.count)?t.count:At(t.count).map(function(t,n){return e.renderCurrentNumber(t,n)}).reverse()}},{key:"render",value:function(){var e=this.props,t=e.prefixCls,n=e.className,r=e.style,o=e.title,i=e.component,a=void 0===i?"sup":i,c=Ps(this.props,["count","onAnimated","component","prefixCls"]),s=us()({},c,{className:Ts()(t,n),title:o});return r&&r.borderColor&&(s.style.boxShadow="0 0 0 1px "+r.borderColor+" inset"),Object(ws.createElement)(a,s,this.renderNumberElement())}}]),t}(ws.Component),Nf=Tf;Tf.defaultProps={prefixCls:"ant-scroll-number",count:null,onAnimated:function(){}};var Vf=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},Pf=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e,t,n,r=this.props,o=r.count,i=r.showZero,a=r.prefixCls,c=r.scrollNumberPrefixCls,s=r.overflowCount,l=r.className,u=r.style,p=r.children,f=r.dot,h=r.status,d=r.text,v=r.offset,m=r.title,y=Vf(r,["count","showZero","prefixCls","scrollNumberPrefixCls","overflowCount","className","style","children","dot","status","text","offset","title"]),g=o>s?s+"+":o,b="0"===g||0===g,C=f&&!b||h;C&&(g="");var w=null===g||void 0===g||""===g,S=(w||b&&!i)&&!C,x=Ts()((e={},ss()(e,a+"-status-dot",!!h),ss()(e,a+"-status-"+h,!!h),e)),M=Ts()((t={},ss()(t,a+"-dot",C),ss()(t,a+"-count",!C),ss()(t,a+"-multiple-words",!C&&o&&o.toString&&o.toString().length>1),ss()(t,a+"-status-"+h,!!h),t)),z=Ts()(l,a,(n={},ss()(n,a+"-status",!!h),ss()(n,a+"-not-a-wrapper",!p),n)),k=v?us()({right:-parseInt(v[0],10),marginTop:v[1]},u):u;if(!p&&h)return ws.createElement("span",us()({},y,{className:z,style:k}),ws.createElement("span",{className:x}),ws.createElement("span",{className:a+"-status-text"},d));var _=S?null:ws.createElement(Nf,{prefixCls:c,"data-show":!S,className:M,count:g,title:m||o,style:k,key:"scrollNumber"}),O=S||!d?null:ws.createElement("span",{className:a+"-status-text"},d);return ws.createElement("span",us()({},y,{className:z}),p,ws.createElement(Ml,{component:"",showProp:"data-show",transitionName:p?a+"-zoom":"",transitionAppear:!0},_),O)}}]),t}(ws.Component),Hf=Pf;Pf.defaultProps={prefixCls:"ant-badge",scrollNumberPrefixCls:"ant-scroll-number",count:null,showZero:!1,dot:!1,overflowCount:99},Pf.propTypes={count:zs.oneOfType([zs.string,zs.number]),showZero:zs.bool,dot:zs.bool,overflowCount:zs.number};var Lf=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},Df=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e=this.props,t=e.prefixCls,n=e.separator,r=e.children,o=Lf(e,["prefixCls","separator","children"]),i=void 0;return i="href"in this.props?ws.createElement("a",us()({className:t+"-link"},o),r):ws.createElement("span",us()({className:t+"-link"},o),r),r?ws.createElement("span",null,i,ws.createElement("span",{className:t+"-separator"},n)):null}}]),t}(ws.Component),Af=Df;Df.__ANT_BREADCRUMB_ITEM=!0,Df.defaultProps={prefixCls:"ant-breadcrumb",separator:"/"},Df.propTypes={prefixCls:zs.string,separator:zs.oneOfType([zs.string,zs.element]),href:zs.string};var If=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){var e=this.props;Pp(!("linkRender"in e||"nameRender"in e),"`linkRender` and `nameRender` are removed, please use `itemRender` instead, see: https://u.ant.design/item-render.")}},{key:"render",value:function(){var e=void 0,t=this.props,n=t.separator,r=t.prefixCls,o=t.style,i=t.className,a=t.routes,c=t.params,s=void 0===c?{}:c,l=t.children,u=t.itemRender,p=void 0===u?Rt:u;if(a&&a.length>0){var f=[];e=a.map(function(e){e.path=e.path||"";var t=e.path.replace(/^\//,"");return Object.keys(s).forEach(function(e){t=t.replace(":"+e,s[e])}),t&&f.push(t),ws.createElement(Af,{separator:n,key:e.breadcrumbName||t},p(e,s,a,f))})}else l&&(e=ws.Children.map(l,function(e,t){return e?(Pp(e.type&&e.type.__ANT_BREADCRUMB_ITEM,"Breadcrumb only accepts Breadcrumb.Item as it's children"),Object(ws.cloneElement)(e,{separator:n,key:t})):e}));return ws.createElement("div",{className:Ts()(i,r),style:o},e)}}]),t}(ws.Component),Rf=If;If.defaultProps={prefixCls:"ant-breadcrumb",separator:"/"},If.propTypes={prefixCls:zs.string,separator:zs.node,routes:zs.array,params:zs.object,linkRender:zs.func,nameRender:zs.func},Rf.Item=Af;var jf=Rf,Ff=n(112),Kf=n.n(Ff),Bf=n(21),Wf=n.n(Bf),Uf=n(25),qf=n.n(Uf),Yf={DATE_ROW_COUNT:6,DATE_COL_COUNT:7},Gf=function(e){function t(){return fs()(this,t),ms()(this,e.apply(this,arguments))}return gs()(t,e),t.prototype.render=function(){for(var e=this.props,t=e.value,n=t.localeData(),r=e.prefixCls,o=[],i=[],a=n.firstDayOfWeek(),c=void 0,s=Wf()(),l=0;l<Yf.DATE_COL_COUNT;l++){var u=(a+l)%Yf.DATE_COL_COUNT;s.day(u),o[l]=n.weekdaysMin(s),i[l]=n.weekdaysShort(s)}e.showWeekNumber&&(c=Ss.a.createElement("th",{role:"columnheader",className:r+"-column-header "+r+"-week-number-header"},Ss.a.createElement("span",{className:r+"-column-header-inner"},"x")));var p=i.map(function(e,t){return Ss.a.createElement("th",{key:t,role:"columnheader",title:e,className:r+"-column-header"},Ss.a.createElement("span",{className:r+"-column-header-inner"},o[t]))});return Ss.a.createElement("thead",null,Ss.a.createElement("tr",{role:"row"},c,p))},t}(Ss.a.Component),Xf=Gf,$f={disabledHours:function(){return[]},disabledMinutes:function(){return[]},disabledSeconds:function(){return[]}},Jf=qf()({displayName:"DateTBody",propTypes:{contentRender:ks.a.func,dateRender:ks.a.func,disabledDate:ks.a.func,prefixCls:ks.a.string,selectedValue:ks.a.oneOfType([ks.a.object,ks.a.arrayOf(ks.a.object)]),value:ks.a.object,hoverValue:ks.a.any,showWeekNumber:ks.a.bool},getDefaultProps:function(){return{hoverValue:[]}},render:function(){var e=this.props,t=e.contentRender,n=e.prefixCls,r=e.selectedValue,o=e.value,i=e.showWeekNumber,a=e.dateRender,c=e.disabledDate,s=e.hoverValue,l=void 0,u=void 0,p=void 0,f=[],h=jt(o),d=n+"-cell",v=n+"-week-number-cell",m=n+"-date",y=n+"-today",g=n+"-selected-day",b=n+"-selected-date",C=n+"-selected-start-date",w=n+"-selected-end-date",S=n+"-in-range-cell",x=n+"-last-month-cell",M=n+"-next-month-btn-day",z=n+"-disabled-cell",k=n+"-disabled-cell-first-of-row",_=n+"-disabled-cell-last-of-row",O=n+"-last-day-of-month",E=o.clone();E.date(1);var T=E.day(),N=(T+7-o.localeData().firstDayOfWeek())%7,V=E.clone();V.add(0-N,"days");var P=0;for(l=0;l<Yf.DATE_ROW_COUNT;l++)for(u=0;u<Yf.DATE_COL_COUNT;u++)p=V,P&&(p=p.clone(),p.add(P,"days")),f.push(p),P++;var H=[];for(P=0,l=0;l<Yf.DATE_ROW_COUNT;l++){var L,D=void 0,A=void 0,I=!1,R=[];for(i&&(A=Ss.a.createElement("td",{key:f[P].week(),role:"gridcell",className:v},f[P].week())),u=0;u<Yf.DATE_COL_COUNT;u++){var j=null,F=null;p=f[P],u<Yf.DATE_COL_COUNT-1&&(j=f[P+1]),u>0&&(F=f[P-1]);var K=d,B=!1,W=!1;Xt(p,h)&&(K+=" "+y,D=!0);var U=$t(p,o),q=Jt(p,o);if(r&&Array.isArray(r)){var Y=s.length?s:r;if(!U&&!q){var G=Y[0],X=Y[1];G&&Xt(p,G)&&(W=!0,I=!0,K+=" "+C),G&&X&&(Xt(p,X)?(W=!0,I=!0,K+=" "+w):p.isAfter(G,"day")&&p.isBefore(X,"day")&&(K+=" "+S))}}else Xt(p,o)&&(W=!0,I=!0);Xt(p,r)&&(K+=" "+b),U&&(K+=" "+x),q&&(K+=" "+M),p.clone().endOf("month").date()===p.date()&&(K+=" "+O),c&&c(p,o)&&(B=!0,F&&c(F,o)||(K+=" "+k),j&&c(j,o)||(K+=" "+_)),W&&(K+=" "+g),B&&(K+=" "+z);var $=void 0;if(a)$=a(p,o);else{var J=t?t(p,o):p.date();$=Ss.a.createElement("div",{key:Zt(p),className:m,"aria-selected":W,"aria-disabled":B},J)}R.push(Ss.a.createElement("td",{key:P,onClick:B?void 0:e.onSelect.bind(null,p),onMouseEnter:B?void 0:e.onDayHover&&e.onDayHover.bind(null,p)||void 0,role:"gridcell",title:Ft(p),className:K},$)),P++}H.push(Ss.a.createElement("tr",{key:l,role:"row",className:Ts()((L={},L[n+"-current-week"]=D,L[n+"-active-week"]=I,L))},A,R))}return Ss.a.createElement("tbody",{className:n+"-tbody"},H)}}),Zf=Jf,Qf=function(e){function t(){return fs()(this,t),ms()(this,e.apply(this,arguments))}return gs()(t,e),t.prototype.render=function(){var e=this.props,t=e.prefixCls;return Ss.a.createElement("table",{className:t+"-table",cellSpacing:"0",role:"grid"},Ss.a.createElement(Xf,e),Ss.a.createElement(Zf,e))},t}(Ss.a.Component),eh=Qf,th=function(e){function t(n){fs()(this,t);var r=ms()(this,e.call(this,n));return r.state={value:n.value},r}return gs()(t,e),t.prototype.componentWillReceiveProps=function(e){"value"in e&&this.setState({value:e.value})},t.prototype.setAndSelectValue=function(e){this.setState({value:e}),this.props.onSelect(e)},t.prototype.months=function(){for(var e=this.state.value,t=e.clone(),n=[],r=0,o=0;o<4;o++){n[o]=[];for(var i=0;i<3;i++){t.month(r);var a=Bt(t);n[o][i]={value:r,content:a,title:a},r++}}return n},t.prototype.render=function(){var e=this,t=this.props,n=this.state.value,r=jt(n),o=this.months(),i=n.month(),a=t.prefixCls,c=t.locale,s=t.contentRender,l=t.cellRender,u=o.map(function(o,u){var p=o.map(function(o){var u,p=!1;if(t.disabledDate){var f=n.clone();f.month(o.value),p=t.disabledDate(f)}var h=(u={},u[a+"-cell"]=1,u[a+"-cell-disabled"]=p,u[a+"-selected-cell"]=o.value===i,u[a+"-current-cell"]=r.year()===n.year()&&o.value===r.month(),u),d=void 0;if(l){var v=n.clone();v.month(o.value),d=l(v,c)}else{var m=void 0;if(s){var y=n.clone();y.month(o.value),m=s(y,c)}else m=o.content;d=Ss.a.createElement("a",{className:a+"-month"},m)}return Ss.a.createElement("td",{role:"gridcell",key:o.value,onClick:p?null:Qt.bind(e,o.value),title:o.title,className:Ts()(h)},d)});return Ss.a.createElement("tr",{key:u,role:"row"},p)});return Ss.a.createElement("table",{className:a+"-table",cellSpacing:"0",role:"grid"},Ss.a.createElement("tbody",{className:a+"-tbody"},u))},t}(ws.Component);th.defaultProps={onSelect:en},th.propTypes={onSelect:ks.a.func,cellRender:ks.a.func,prefixCls:ks.a.string,value:ks.a.object};var nh=th,rh={propTypes:{value:ks.a.object,defaultValue:ks.a.object,onKeyDown:ks.a.func},getDefaultProps:function(){return{onKeyDown:tn}},getInitialState:function(){var e=this.props;return{value:e.value||e.defaultValue||nn(),selectedValue:e.selectedValue||e.defaultSelectedValue}},componentWillReceiveProps:function(e){var t=e.value,n=e.selectedValue;"value"in e&&(t=t||e.defaultValue||rn(this.state.value),this.setState({value:t})),"selectedValue"in e&&this.setState({selectedValue:n})},onSelect:function(e,t){e&&this.setValue(e),this.setSelectedValue(e,t)},renderRoot:function(e){var t,n=this.props,r=n.prefixCls,o=(t={},t[r]=1,t[r+"-hidden"]=!n.visible,t[n.className]=!!n.className,t[e.className]=!!e.className,t);return Ss.a.createElement("div",{ref:this.saveRoot,className:""+Ts()(o),style:this.props.style,tabIndex:"0",onKeyDown:this.onKeyDown},e.children)},setSelectedValue:function(e,t){"selectedValue"in this.props||this.setState({selectedValue:e}),this.props.onSelect(e,t)},setValue:function(e){var t=this.state.value;"value"in this.props||this.setState({value:e}),(t&&e&&!t.isSame(e)||!t&&e||t&&!e)&&this.props.onChange(e)},isAllowedDate:function(e){return Gt(e,this.props.disabledDate,this.props.disabledTime)}},oh=rh,ih=n(144),ah={propTypes:{className:ks.a.string,locale:ks.a.object,style:ks.a.object,visible:ks.a.bool,onSelect:ks.a.func,prefixCls:ks.a.string,onChange:ks.a.func,onOk:ks.a.func},getDefaultProps:function(){return{locale:ih.a,style:{},visible:!0,prefixCls:"rc-calendar",className:"",onSelect:on,onChange:on,onClear:on,renderFooter:function(){return null},renderSidebar:function(){return null}}},shouldComponentUpdate:function(e){return this.props.visible||e.visible},getFormat:function(){var e=this.props.format,t=this.props,n=t.locale,r=t.timePicker;return e||(e=r?n.dateTimeFormat:n.dateFormat),e},focus:function(){this.rootInstance&&this.rootInstance.focus()},saveRoot:function(e){this.rootInstance=e}},ch=function(e){function t(){return fs()(this,t),ms()(this,e.apply(this,arguments))}return gs()(t,e),t.prototype.onYearChange=function(e){var t=this.props.value.clone();t.year(parseInt(e,10)),this.props.onValueChange(t)},t.prototype.onMonthChange=function(e){var t=this.props.value.clone();t.month(parseInt(e,10)),this.props.onValueChange(t)},t.prototype.yearSelectElement=function(e){for(var t=this.props,n=t.yearSelectOffset,r=t.yearSelectTotal,o=t.prefixCls,i=t.Select,a=e-n,c=a+r,s=[],l=a;l<c;l++)s.push(Ss.a.createElement(i.Option,{key:""+l},l));return Ss.a.createElement(i,{className:o+"-header-year-select",onChange:this.onYearChange.bind(this),dropdownStyle:{zIndex:2e3},dropdownMenuStyle:{maxHeight:250,overflow:"auto",fontSize:12},optionLabelProp:"children",value:String(e),showSearch:!1},s)},t.prototype.monthSelectElement=function(e){for(var t=this.props,n=t.value.clone(),r=t.prefixCls,o=[],i=t.Select,a=0;a<12;a++)n.month(a),o.push(Ss.a.createElement(i.Option,{key:""+a},Bt(n)));return Ss.a.createElement(i,{className:r+"-header-month-select",dropdownStyle:{zIndex:2e3},dropdownMenuStyle:{maxHeight:250,overflow:"auto",overflowX:"hidden",fontSize:12},optionLabelProp:"children",value:String(e),showSearch:!1,onChange:this.onMonthChange.bind(this)},o)},t.prototype.changeTypeToDate=function(){this.props.onTypeChange("date")},t.prototype.changeTypeToMonth=function(){this.props.onTypeChange("month")},t.prototype.render=function(){var e=this.props,t=e.value,n=e.locale,r=e.prefixCls,o=e.type,i=e.showTypeSwitch,a=e.headerComponents,c=t.year(),s=t.month(),l=this.yearSelectElement(c),u="month"===o?null:this.monthSelectElement(s),p=r+"-header-switcher",f=i?Ss.a.createElement("span",{className:p},"date"===o?Ss.a.createElement("span",{className:p+"-focus"},n.month):Ss.a.createElement("span",{onClick:this.changeTypeToDate.bind(this),className:p+"-normal"},n.month),"month"===o?Ss.a.createElement("span",{className:p+"-focus"},n.year):Ss.a.createElement("span",{onClick:this.changeTypeToMonth.bind(this),className:p+"-normal"},n.year)):null;return Ss.a.createElement("div",{className:r+"-header"},f,u,l,a)},t}(ws.Component);ch.propTypes={value:ks.a.object,locale:ks.a.object,yearSelectOffset:ks.a.number,yearSelectTotal:ks.a.number,onValueChange:ks.a.func,onTypeChange:ks.a.func,Select:ks.a.func,prefixCls:ks.a.string,type:ks.a.string,showTypeSwitch:ks.a.bool,headerComponents:ks.a.array},ch.defaultProps={yearSelectOffset:10,yearSelectTotal:20,onValueChange:an,onTypeChange:an};var sh=ch,lh=qf()({displayName:"FullCalendar",propTypes:{defaultType:ks.a.string,type:ks.a.string,prefixCls:ks.a.string,locale:ks.a.object,onTypeChange:ks.a.func,fullscreen:ks.a.bool,monthCellRender:ks.a.func,dateCellRender:ks.a.func,showTypeSwitch:ks.a.bool,Select:ks.a.func.isRequired,headerComponents:ks.a.array,headerComponent:ks.a.object,headerRender:ks.a.func,showHeader:ks.a.bool,disabledDate:ks.a.func},mixins:[ah,oh],getDefaultProps:function(){return{defaultType:"date",fullscreen:!1,showTypeSwitch:!0,showHeader:!0,onTypeChange:function(){}}},getInitialState:function(){var e=void 0;return e="type"in this.props?this.props.type:this.props.defaultType,{type:e}},componentWillReceiveProps:function(e){"type"in e&&this.setState({type:e.type})},onMonthSelect:function(e){this.onSelect(e,{target:"month"})},setType:function(e){"type"in this.props||this.setState({type:e}),this.props.onTypeChange(e)},render:function(){var e=this.props,t=e.locale,n=e.prefixCls,r=e.fullscreen,o=e.showHeader,i=e.headerComponent,a=e.headerRender,c=e.disabledDate,s=this.state,l=s.value,u=s.type,p=null;if(o)if(a)p=a(l,u,t);else{var f=i||sh;p=Ss.a.createElement(f,us()({key:"calendar-header"},e,{prefixCls:n+"-full",type:u,value:l,onTypeChange:this.setType,onValueChange:this.setValue}))}var h="date"===u?Ss.a.createElement(eh,{dateRender:e.dateCellRender,contentRender:e.dateCellContentRender,locale:t,prefixCls:n,onSelect:this.onSelect,value:l,disabledDate:c}):Ss.a.createElement(nh,{cellRender:e.monthCellRender,contentRender:e.monthCellContentRender,locale:t,onSelect:this.onMonthSelect,prefixCls:n+"-month-panel",value:l,disabledDate:c}),d=[p,Ss.a.createElement("div",{key:"calendar-body",className:n+"-calendar-body"},h)],v=[n+"-full"];return r&&v.push(n+"-fullscreen"),this.renderRoot({children:d,className:v.join(" ")})}}),uh=lh,ph=n(79),fh=qp.Option,hh=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.onYearChange=function(t){var n=e.props,r=n.value,o=n.validRange,i=r.clone();if(i.year(parseInt(t,10)),o){var a=Kf()(o,2),c=a[0],s=a[1],l=i.get("year"),u=i.get("month");l===s.get("year")&&u>s.get("month")&&i.month(s.get("month")),l===c.get("year")&&u<c.get("month")&&i.month(c.get("month"))}var p=e.props.onValueChange;p&&p(i)},e.onMonthChange=function(t){var n=e.props.value.clone();n.month(parseInt(t,10));var r=e.props.onValueChange;r&&r(n)},e.onTypeChange=function(t){var n=e.props.onTypeChange;n&&n(t.target.value)},e.getCalenderHeaderNode=function(t){e.calenderHeaderNode=t},e}return gs()(t,e),ds()(t,[{key:"getYearSelectElement",value:function(e){var t=this,n=this.props,r=n.yearSelectOffset,o=n.yearSelectTotal,i=n.locale,a=n.prefixCls,c=n.fullscreen,s=n.validRange,l=e-r,u=l+o;s&&(l=s[0].get("year"),u=s[1].get("year")+1);for(var p="\u5e74"===i.year?"\u5e74":"",f=[],h=l;h<u;h++)f.push(ws.createElement(fh,{key:""+h},h+p));return ws.createElement(qp,{size:c?"default":"small",dropdownMatchSelectWidth:!1,className:a+"-year-select",onChange:this.onYearChange,value:String(e),getPopupContainer:function(){return t.calenderHeaderNode}},f)}},{key:"getMonthsLocale",value:function(e){for(var t=e.clone(),n=e.localeData(),r=[],o=0;o<12;o++)t.month(o),r.push(n.monthsShort(t));return r}},{key:"getMonthSelectElement",value:function(e,t){var n=this,r=this.props,o=r.prefixCls,i=r.fullscreen,a=r.validRange,c=r.value,s=[],l=0,u=12;if(a){var p=Kf()(a,2),f=p[0],h=p[1],d=c.get("year");h.get("year")===d?u=h.get("month")+1:l=f.get("month")}for(var v=l;v<u;v++)s.push(ws.createElement(fh,{key:""+v},t[v]));return ws.createElement(qp,{size:i?"default":"small",dropdownMatchSelectWidth:!1,className:o+"-month-select",value:String(e),onChange:this.onMonthChange,getPopupContainer:function(){return n.calenderHeaderNode}},s)}},{key:"render",value:function(){var e=this.props,t=e.type,n=e.value,r=e.prefixCls,o=e.locale,i=e.fullscreen,a=this.getYearSelectElement(n.year()),c="date"===t?this.getMonthSelectElement(n.month(),this.getMonthsLocale(n)):null,s=i?"default":"small",l=ws.createElement(ph.Group,{onChange:this.onTypeChange,value:t,size:s},ws.createElement(ph.Button,{value:"date"},o.month),ws.createElement(ph.Button,{value:"month"},o.year));return ws.createElement("div",{className:r+"-header",ref:this.getCalenderHeaderNode},a,c,l)}}]),t}(ws.Component),dh=hh;hh.defaultProps={prefixCls:"ant-fullcalendar-header",yearSelectOffset:10,yearSelectTotal:20};var vh=n(166),mh=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));n.monthCellRender=function(e){var t=n.props,r=t.prefixCls,o=t.monthCellRender,i=void 0===o?sn:o;return ws.createElement("div",{className:r+"-month"},ws.createElement("div",{className:r+"-value"},e.localeData().monthsShort(e)),ws.createElement("div",{className:r+"-content"},i(e)))},n.dateCellRender=function(e){var t=n.props,r=t.prefixCls,o=t.dateCellRender,i=void 0===o?sn:o;return ws.createElement("div",{className:r+"-date"},ws.createElement("div",{className:r+"-value"},ln(e.date())),ws.createElement("div",{className:r+"-content"},i(e)))},n.setValue=function(e,t){"value"in n.props||n.setState({value:e}),"select"===t?n.props.onSelect&&n.props.onSelect(e):"changePanel"===t&&n.onPanelChange(e,n.state.mode)},n.setType=function(e){var t="date"===e?"month":"year";n.state.mode!==t&&(n.setState({mode:t}),n.onPanelChange(n.state.value,t))},n.onHeaderValueChange=function(e){n.setValue(e,"changePanel")},n.onHeaderTypeChange=function(e){n.setType(e)},n.onSelect=function(e){n.setValue(e,"select")},n.getDateRange=function(e,t){return function(n){if(!n)return!1;var r=Kf()(e,2),o=r[0],i=r[1],a=!n.isBetween(o,i,"days","[]");return t?t(n)||a:a}},n.renderCalendar=function(e,t){var r=n.state,o=n.props,i=r.value,a=r.mode;i&&t&&i.locale(t);var c=o.prefixCls,s=o.style,l=o.className,u=o.fullscreen,p=o.dateFullCellRender,f=o.monthFullCellRender,h="year"===a?"month":"date",d=l||"";u&&(d+=" "+c+"-fullscreen");var v=f||n.monthCellRender,m=p||n.dateCellRender,y=o.disabledDate;return o.validRange&&(y=n.getDateRange(o.validRange,y)),ws.createElement("div",{className:d,style:s},ws.createElement(dh,{fullscreen:u,type:h,value:i,locale:e.lang,prefixCls:c,onTypeChange:n.onHeaderTypeChange,onValueChange:n.onHeaderValueChange,validRange:o.validRange}),ws.createElement(uh,us()({},o,{disabledDate:y,Select:sn,locale:e.lang,type:h,prefixCls:c,showHeader:!1,value:i,monthCellRender:v,dateCellRender:m,onSelect:n.onSelect})))};var r=e.value||e.defaultValue||cn(Bf)();if(!cn(Bf).isMoment(r))throw new Error("The value/defaultValue of Calendar must be a moment object after `antd@2.0`, see: https://u.ant.design/calendar-value");return n.state={value:r,mode:e.mode},n}return gs()(t,e),ds()(t,[{key:"componentWillReceiveProps",value:function(e){"value"in e&&this.setState({value:e.value}),"mode"in e&&e.mode!==this.props.mode&&this.setState({mode:e.mode})}},{key:"onPanelChange",value:function(e,t){var n=this.props,r=n.onPanelChange,o=n.onChange;r&&r(e,t),o&&e!==this.state.value&&o(e)}},{key:"render",value:function(){return ws.createElement(xp,{componentName:"Calendar",defaultLocale:vh.a},this.renderCalendar)}}]),t}(ws.Component),yh=mh;mh.defaultProps={locale:{},fullscreen:!0,prefixCls:"ant-fullcalendar",mode:"month",onSelect:sn,onPanelChange:sn,onChange:sn},mh.propTypes={monthCellRender:zs.func,dateCellRender:zs.func,monthFullCellRender:zs.func,dateFullCellRender:zs.func,fullscreen:zs.bool,locale:zs.object,prefixCls:zs.string,className:zs.string,style:zs.object,onPanelChange:zs.func,value:zs.object,onSelect:zs.func,onChange:zs.func};var gh=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},bh=function(e){var t=e.prefixCls,n=void 0===t?"ant-card":t,r=e.className,o=gh(e,["prefixCls","className"]),i=Ts()(n+"-grid",r);return ws.createElement("div",us()({},o,{className:i}))},Ch=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},wh=function(e){var t=e.prefixCls,n=void 0===t?"ant-card":t,r=e.className,o=e.avatar,i=e.title,a=e.description,c=Ch(e,["prefixCls","className","avatar","title","description"]),s=Ts()(n+"-meta",r),l=o?ws.createElement("div",{className:n+"-meta-avatar"},o):null,u=i?ws.createElement("div",{className:n+"-meta-title"},i):null,p=a?ws.createElement("div",{className:n+"-meta-description"},a):null,f=u||p?ws.createElement("div",{className:n+"-meta-detail"},u,p):null;return ws.createElement("div",us()({},c,{className:s}),l,f)},Sh={LEFT:37,UP:38,RIGHT:39,DOWN:40},xh=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e,t=this.props,n=t.id,r=t.className,o=t.destroyInactiveTabPane,i=t.active,a=t.forceRender,c=t.rootPrefixCls,s=t.style,l=t.children,u=t.placeholder,p=kl()(t,["id","className","destroyInactiveTabPane","active","forceRender","rootPrefixCls","style","children","placeholder"]);this._isActived=this._isActived||i;var f=c+"-tabpane",h=Ts()((e={},ss()(e,f,1),ss()(e,f+"-inactive",!i),ss()(e,f+"-active",i),ss()(e,r,r),e)),d=o?i:this._isActived;return Ss.a.createElement("div",us()({style:s,role:"tabpanel","aria-hidden":i?"false":"true",className:h,id:n},bn(p)),d||a?l:u)}}]),t}(Ss.a.Component),Mh=xh;xh.propTypes={className:ks.a.string,active:ks.a.bool,style:ks.a.any,destroyInactiveTabPane:ks.a.bool,forceRender:ks.a.bool,placeholder:ks.a.node,rootPrefixCls:ks.a.string,children:ks.a.node,id:ks.a.string},xh.defaultProps={placeholder:null};var zh=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));kh.call(n);var r=void 0;return r="activeKey"in e?e.activeKey:"defaultActiveKey"in e?e.defaultActiveKey:zn(e),n.state={activeKey:r},n}return gs()(t,e),ds()(t,[{key:"componentWillReceiveProps",value:function(e){"activeKey"in e?this.setState({activeKey:e.activeKey}):kn(e,this.state.activeKey)||this.setState({activeKey:zn(e)})}},{key:"render",value:function(){var e,t=this.props,n=t.prefixCls,r=t.navWrapper,o=t.tabBarPosition,i=t.className,a=t.renderTabContent,c=t.renderTabBar,s=t.destroyInactiveTabPane,l=kl()(t,["prefixCls","navWrapper","tabBarPosition","className","renderTabContent","renderTabBar","destroyInactiveTabPane"]),u=Ts()((e={},ss()(e,n,1),ss()(e,n+"-"+o,1),ss()(e,i,!!i),e));this.tabBar=c();var p=[Ss.a.cloneElement(this.tabBar,{prefixCls:n,navWrapper:r,key:"tabBar",onKeyDown:this.onNavKeyDown,tabBarPosition:o,onTabClick:this.onTabClick,panels:t.children,activeKey:this.state.activeKey}),Ss.a.cloneElement(a(),{prefixCls:n,tabBarPosition:o,activeKey:this.state.activeKey,destroyInactiveTabPane:s,children:t.children,onChange:this.setActiveKey,key:"tabContent"})];return"bottom"===o&&p.reverse(),Ss.a.createElement("div",us()({className:u,style:t.style},bn(l)),p)}}]),t}(Ss.a.Component),kh=function(){var e=this;this.onTabClick=function(t,n){e.tabBar.props.onTabClick&&e.tabBar.props.onTabClick(t,n),e.setActiveKey(t)},this.onNavKeyDown=function(t){var n=t.keyCode;if(n===Sh.RIGHT||n===Sh.DOWN){t.preventDefault();var r=e.getNextActiveKey(!0);e.onTabClick(r)}else if(n===Sh.LEFT||n===Sh.UP){t.preventDefault();var o=e.getNextActiveKey(!1);e.onTabClick(o)}},this.setActiveKey=function(t){e.state.activeKey!==t&&("activeKey"in e.props||e.setState({activeKey:t}),e.props.onChange(t))},this.getNextActiveKey=function(t){var n=e.state.activeKey,r=[];Ss.a.Children.forEach(e.props.children,function(e){e&&!e.props.disabled&&(t?r.push(e):r.unshift(e))});var o=r.length,i=o&&r[0].key;return r.forEach(function(e,t){e.key===n&&(i=t===o-1?r[0].key:r[t+1].key)}),i}},_h=zh;zh.propTypes={destroyInactiveTabPane:ks.a.bool,renderTabBar:ks.a.func.isRequired,renderTabContent:ks.a.func.isRequired,navWrapper:ks.a.func,onChange:ks.a.func,children:ks.a.node,prefixCls:ks.a.string,className:ks.a.string,tabBarPosition:ks.a.string,style:ks.a.object,activeKey:ks.a.string,defaultActiveKey:ks.a.string},zh.defaultProps={prefixCls:"rc-tabs",destroyInactiveTabPane:!1,onChange:Mn,navWrapper:function(e){return e},tabBarPosition:"top",children:null,style:{}},zh.TabPane=Mh;var Oh=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"getTabPanes",value:function(){var e=this.props,t=e.activeKey,n=e.children,r=[];return Ss.a.Children.forEach(n,function(n){if(n){var o=n.key,i=t===o;r.push(Ss.a.cloneElement(n,{active:i,destroyInactiveTabPane:e.destroyInactiveTabPane,rootPrefixCls:e.prefixCls}))}}),r}},{key:"render",value:function(){var e,t=this.props,n=t.prefixCls,r=t.children,o=t.activeKey,i=t.tabBarPosition,a=t.animated,c=t.animatedWithMargin,s=t.style,l=Ts()((e={},ss()(e,n+"-content",!0),ss()(e,a?n+"-content-animated":n+"-content-no-animated",!0),e));if(a){var u=pn(r,o);if(-1!==u){var p=c?yn(u,i):dn(mn(u,i));s=us()({},s,p)}else s=us()({},s,{display:"none"})}return Ss.a.createElement("div",{className:l,style:s},this.getTabPanes())}}]),t}(Ss.a.Component),Eh=Oh;Oh.propTypes={animated:ks.a.bool,animatedWithMargin:ks.a.bool,prefixCls:ks.a.string,children:ks.a.node,activeKey:ks.a.string,style:ks.a.any,tabBarPosition:ks.a.string},Oh.defaultProps={animated:!0};var Th=_h,Nh=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){var e=this;this.timeout=setTimeout(function(){_n(e,!0)},0)}},{key:"componentDidUpdate",value:function(){_n(this)}},{key:"componentWillUnmount",value:function(){clearTimeout(this.timeout)}},{key:"render",value:function(){var e,t=this.props,n=t.prefixCls,r=t.styles,o=t.inkBarAnimated,i=n+"-ink-bar",a=Ts()((e={},ss()(e,i,!0),ss()(e,o?i+"-animated":i+"-no-animated",!0),e));return Ss.a.createElement("div",{style:r.inkBar,className:a,key:"inkBar",ref:this.props.saveRef("inkBar")})}}]),t}(Ss.a.Component),Vh=Nh;Nh.propTypes={prefixCls:ks.a.string,styles:ks.a.object,inkBarAnimated:ks.a.bool,saveRef:ks.a.func},Nh.defaultProps={prefixCls:"",inkBarAnimated:!0,styles:{},saveRef:function(){}};var Ph=n(35),Hh=n.n(Ph),Lh=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e=this,t=this.props,n=t.panels,r=t.activeKey,o=t.prefixCls,i=t.tabBarGutter,a=[];return Ss.a.Children.forEach(n,function(t,c){if(t){var s=t.key,l=r===s?o+"-tab-active":"";l+=" "+o+"-tab";var u={};t.props.disabled?l+=" "+o+"-tab-disabled":u={onClick:e.props.onTabClick.bind(e,s)};var p={};r===s&&(p.ref=e.props.saveRef("activeTab")),Hh()("tab"in t.props,"There must be `tab` property on children of Tabs."),a.push(Ss.a.createElement("div",us()({role:"tab","aria-disabled":t.props.disabled?"true":"false","aria-selected":r===s?"true":"false"},u,{className:l,key:s,style:{marginRight:i&&c===n.length-1?0:i}},p),t.props.tab))}}),Ss.a.createElement("div",null,a)}}]),t}(Ss.a.Component),Dh=Lh;Lh.propTypes={activeKey:ks.a.string,panels:ks.a.node,prefixCls:ks.a.string,tabBarGutter:ks.a.number,onTabClick:ks.a.func,saveRef:ks.a.func},Lh.defaultProps={panels:[],prefixCls:[],tabBarGutter:null,onTabClick:function(){},saveRef:function(){}};var Ah=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e=this.props,t=e.prefixCls,n=e.onKeyDown,r=e.className,o=e.extraContent,i=e.style,a=e.tabBarPosition,c=e.children,s=kl()(e,["prefixCls","onKeyDown","className","extraContent","style","tabBarPosition","children"]),l=Ts()(t+"-bar",ss()({},r,!!r)),u="top"===a||"bottom"===a,p=u?{float:"right"}:{},f=o&&o.props?o.props.style:{},h=c;return o&&(h=[Object(ws.cloneElement)(o,{key:"extra",style:us()({},p,f)}),Object(ws.cloneElement)(c,{key:"content"})],h=u?h:h.reverse()),Ss.a.createElement("div",us()({role:"tablist",className:l,tabIndex:"0",ref:this.props.saveRef("root"),onKeyDown:n,style:i},bn(s)),h)}}]),t}(Ss.a.Component),Ih=Ah;Ah.propTypes={prefixCls:ks.a.string,className:ks.a.string,style:ks.a.object,tabBarPosition:ks.a.oneOf(["left","right","top","bottom"]),children:ks.a.node,extraContent:ks.a.node,onKeyDown:ks.a.func,saveRef:ks.a.func},Ah.defaultProps={prefixCls:"",className:"",style:{},tabBarPosition:"top",extraContent:null,children:null,onKeyDown:function(){},saveRef:function(){}};var Rh=n(80),jh=n.n(Rh),Fh=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.prevTransitionEnd=function(e){if("opacity"===e.propertyName){var t=n.props.getRef("container");n.scrollToActiveTab({target:t,currentTarget:t})}},n.scrollToActiveTab=function(e){var t=n.props.getRef("activeTab"),r=n.props.getRef("navWrap");if((!e||e.target===e.currentTarget)&&t){var o=n.isNextPrevShown()&&n.lastNextPrevShown;if(n.lastNextPrevShown=n.isNextPrevShown(),o){var i=n.getScrollWH(t),a=n.getOffsetWH(r),c=n.offset,s=n.getOffsetLT(r),l=n.getOffsetLT(t);s>l?(c+=s-l,n.setOffset(c)):s+a<l+i&&(c-=l+i-(s+a),n.setOffset(c))}}},n.prev=function(e){n.props.onPrevClick(e);var t=n.props.getRef("navWrap"),r=n.getOffsetWH(t),o=n.offset;n.setOffset(o+r)},n.next=function(e){n.props.onNextClick(e);var t=n.props.getRef("navWrap"),r=n.getOffsetWH(t),o=n.offset;n.setOffset(o-r)},n.offset=0,n.state={next:!1,prev:!1},n}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){var e=this;this.componentDidUpdate(),this.debouncedResize=jh()(function(){e.setNextPrev(),e.scrollToActiveTab()},200),this.resizeEvent=r(window,"resize",this.debouncedResize)}},{key:"componentDidUpdate",value:function(e){var t=this.props;if(e&&e.tabBarPosition!==t.tabBarPosition)return void this.setOffset(0);var n=this.setNextPrev();this.isNextPrevShown(this.state)!==this.isNextPrevShown(n)?this.setState({},this.scrollToActiveTab):e&&t.activeKey===e.activeKey||this.scrollToActiveTab()}},{key:"componentWillUnmount",value:function(){this.resizeEvent&&this.resizeEvent.remove(),this.debouncedResize&&this.debouncedResize.cancel&&this.debouncedResize.cancel()}},{key:"setNextPrev",value:function(){var e=this.props.getRef("nav"),t=this.getScrollWH(e),n=this.getOffsetWH(this.props.getRef("container")),r=this.getOffsetWH(this.props.getRef("navWrap")),o=this.offset,i=n-t,a=this.state,c=a.next,s=a.prev;if(i>=0)c=!1,this.setOffset(0,!1),o=0;else if(i<o)c=!0;else{c=!1;var l=r-t;this.setOffset(l,!1),o=l}return s=o<0,this.setNext(c),this.setPrev(s),{next:c,prev:s}}},{key:"getOffsetWH",value:function(e){var t=this.props.tabBarPosition,n="offsetWidth";return"left"!==t&&"right"!==t||(n="offsetHeight"),e[n]}},{key:"getScrollWH",value:function(e){var t=this.props.tabBarPosition,n="scrollWidth";return"left"!==t&&"right"!==t||(n="scrollHeight"),e[n]}},{key:"getOffsetLT",value:function(e){var t=this.props.tabBarPosition,n="left";return"left"!==t&&"right"!==t||(n="top"),e.getBoundingClientRect()[n]}},{key:"setOffset",value:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=Math.min(0,e);if(this.offset!==n){this.offset=n;var r={},o=this.props.tabBarPosition,i=this.props.getRef("nav").style,a=hn(i);r="left"===o||"right"===o?a?{value:"translate3d(0,"+n+"px,0)"}:{name:"top",value:n+"px"}:a?{value:"translate3d("+n+"px,0,0)"}:{name:"left",value:n+"px"},a?fn(i,r.value):i[r.name]=r.value,t&&this.setNextPrev()}}},{key:"setPrev",value:function(e){this.state.prev!==e&&this.setState({prev:e})}},{key:"setNext",value:function(e){this.state.next!==e&&this.setState({next:e})}},{key:"isNextPrevShown",value:function(e){return e?e.next||e.prev:this.state.next||this.state.prev}},{key:"render",value:function(){var e,t,n,r,o=this.state,i=o.next,a=o.prev,c=this.props,s=c.prefixCls,l=c.scrollAnimated,u=c.navWrapper,p=c.prevIcon,f=c.nextIcon,h=a||i,d=Ss.a.createElement("span",{onClick:a?this.prev:null,unselectable:"unselectable",className:Ts()((e={},ss()(e,s+"-tab-prev",1),ss()(e,s+"-tab-btn-disabled",!a),ss()(e,s+"-tab-arrow-show",h),e)),onTransitionEnd:this.prevTransitionEnd},p||Ss.a.createElement("span",{className:s+"-tab-prev-icon"})),v=Ss.a.createElement("span",{onClick:i?this.next:null,unselectable:"unselectable",className:Ts()((t={},ss()(t,s+"-tab-next",1),ss()(t,s+"-tab-btn-disabled",!i),ss()(t,s+"-tab-arrow-show",h),t))},f||Ss.a.createElement("span",{className:s+"-tab-next-icon"})),m=s+"-nav",y=Ts()((n={},ss()(n,m,!0),ss()(n,l?m+"-animated":m+"-no-animated",!0),n));return Ss.a.createElement("div",{className:Ts()((r={},ss()(r,s+"-nav-container",1),ss()(r,s+"-nav-container-scrolling",h),r)),key:"container",ref:this.props.saveRef("container")},d,v,Ss.a.createElement("div",{className:s+"-nav-wrap",ref:this.props.saveRef("navWrap")},Ss.a.createElement("div",{className:s+"-nav-scroll"},Ss.a.createElement("div",{className:y,ref:this.props.saveRef("nav")},u(this.props.children)))))}}]),t}(Ss.a.Component),Kh=Fh;Fh.propTypes={getRef:ks.a.func.isRequired,saveRef:ks.a.func.isRequired,tabBarPosition:ks.a.oneOf(["left","right","top","bottom"]),prefixCls:ks.a.string,scrollAnimated:ks.a.bool,onPrevClick:ks.a.func,onNextClick:ks.a.func,navWrapper:ks.a.func,children:ks.a.node,prevIcon:ks.a.node,nextIcon:ks.a.node},Fh.defaultProps={tabBarPosition:"left",prefixCls:"",scrollAnimated:!0,onPrevClick:function(){},onNextClick:function(){},navWrapper:function(e){return e}};var Bh=function(e){function t(){var e,n,r,o;fs()(this,t);for(var i=arguments.length,a=Array(i),c=0;c<i;c++)a[c]=arguments[c];return n=r=ms()(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(a))),r.getRef=function(e){return r[e]},r.saveRef=function(e){return function(t){t&&(r[e]=t)}},o=n,ms()(r,o)}return gs()(t,e),ds()(t,[{key:"render",value:function(){return this.props.children(this.saveRef,this.getRef)}}]),t}(Ss.a.Component),Wh=Bh;Bh.propTypes={children:ks.a.func},Bh.defaultProps={children:function(){return null}};var Uh=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e=this;return Ss.a.createElement(Wh,null,function(t,n){return Ss.a.createElement(Ih,us()({saveRef:t},e.props),Ss.a.createElement(Kh,us()({saveRef:t,getRef:n},e.props),Ss.a.createElement(Dh,us()({saveRef:t},e.props)),Ss.a.createElement(Vh,us()({saveRef:t,getRef:n},e.props))))})}}]),t}(Ss.a.Component),qh=Uh,Yh=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e=this.props,t=e.tabBarStyle,n=e.animated,r=void 0===n||n,o=e.renderTabBar,i=e.tabBarExtraContent,a=e.tabPosition,c=e.prefixCls,s="object"===(void 0===r?"undefined":Cs()(r))?r.inkBar:r,l="left"===a||"right"===a,u=l?"up":"left",p=l?"down":"right",f=ws.createElement("span",{className:c+"-tab-prev-icon"},ws.createElement(Kp,{type:u,className:c+"-tab-prev-icon-target"})),h=ws.createElement("span",{className:c+"-tab-next-icon"},ws.createElement(Kp,{type:p,className:c+"-tab-next-icon-target"})),d=us()({},this.props,{inkBarAnimated:s,extraContent:i,style:t,prevIcon:f,nextIcon:h}),v=void 0;return v=o?o(d,qh):ws.createElement(qh,d),ws.cloneElement(v)}}]),t}(ws.Component),Gh=Yh,Xh=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},$h=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.removeTab=function(t,n){if(n.stopPropagation(),t){var r=e.props.onEdit;r&&r(t,"remove")}},e.handleChange=function(t){var n=e.props.onChange;n&&n(t)},e.createNewTab=function(t){var n=e.props.onEdit;n&&n(t,"add")},e}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){var e=xs.findDOMNode(this);e&&!On()&&-1===e.className.indexOf(" no-flex")&&(e.className+=" no-flex")}},{key:"render",value:function(){var e,t=this,n=this.props,r=n.prefixCls,o=n.className,i=void 0===o?"":o,a=n.size,c=n.type,s=void 0===c?"line":c,l=n.tabPosition,u=n.children,p=n.animated,f=void 0===p||p,h=n.tabBarExtraContent,d=n.hideAdd,v="object"===(void 0===f?"undefined":Cs()(f))?f.tabPane:f;"line"!==s&&(v="animated"in this.props&&v),Pp(!(s.indexOf("card")>=0&&("small"===a||"large"===a)),"Tabs[type=card|editable-card] doesn't have small or large size, it's by design.");var m=Ts()(i,(e={},ss()(e,r+"-vertical","left"===l||"right"===l),ss()(e,r+"-"+a,!!a),ss()(e,r+"-card",s.indexOf("card")>=0),ss()(e,r+"-"+s,!0),ss()(e,r+"-no-animation",!v),e)),y=[];"editable-card"===s&&(y=[],ws.Children.forEach(u,function(e,n){var o=e.props.closable;o=void 0===o||o;var i=o?ws.createElement(Kp,{type:"close",className:r+"-close-x",onClick:function(n){return t.removeTab(e.key,n)}}):null;y.push(ws.cloneElement(e,{tab:ws.createElement("div",{className:o?void 0:r+"-tab-unclosable"},e.props.tab,i),key:e.key||n}))}),d||(h=ws.createElement("span",null,ws.createElement(Kp,{type:"plus",className:r+"-new-tab",onClick:this.createNewTab}),h))),h=h?ws.createElement("div",{className:r+"-extra-content"},h):null;var g=this.props,b=(g.className,Xh(g,["className"]));return ws.createElement(Th,us()({},this.props,{className:m,tabBarPosition:l,renderTabBar:function(){return ws.createElement(Gh,us()({},b,{tabBarExtraContent:h}))},renderTabContent:function(){return ws.createElement(Eh,{animated:v,animatedWithMargin:!0})},onChange:this.handleChange}),y.length>0?y:u)}}]),t}(ws.Component),Jh=$h;$h.TabPane=Mh,$h.defaultProps={prefixCls:"ant-tabs",hideAdd:!1};var Zh=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},Qh=void 0;if("undefined"!=typeof window){var ed=function(e){return{media:e,matches:!1,addListener:function(){},removeListener:function(){}}};window.matchMedia=window.matchMedia||ed,Qh=n(169)}var td=["xxl","xl","lg","md","sm","xs"],nd={xs:"(max-width: 575px)",sm:"(min-width: 576px)",md:"(min-width: 768px)",lg:"(min-width: 992px)",xl:"(min-width: 1200px)",xxl:"(min-width: 1600px)"},rd=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.state={screens:{}},e}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){var e=this;Object.keys(nd).map(function(t){return Qh.register(nd[t],{match:function(){"object"===Cs()(e.props.gutter)&&e.setState(function(e){return{screens:us()({},e.screens,ss()({},t,!0))}})},unmatch:function(){"object"===Cs()(e.props.gutter)&&e.setState(function(e){return{screens:us()({},e.screens,ss()({},t,!1))}})},destroy:function(){}})})}},{key:"componentWillUnmount",value:function(){Object.keys(nd).map(function(e){return Qh.unregister(nd[e])})}},{key:"getGutter",value:function(){var e=this.props.gutter;if("object"===(void 0===e?"undefined":Cs()(e)))for(var t=0;t<=td.length;t++){var n=td[t];if(this.state.screens[n]&&void 0!==e[n])return e[n]}return e}},{key:"render",value:function(){var e,t=this.props,n=t.type,r=t.justify,o=t.align,i=t.className,a=t.style,c=t.children,s=t.prefixCls,l=void 0===s?"ant-row":s,u=Zh(t,["type","justify","align","className","style","children","prefixCls"]),p=this.getGutter(),f=Ts()((e={},ss()(e,l,!n),ss()(e,l+"-"+n,n),ss()(e,l+"-"+n+"-"+r,n&&r),ss()(e,l+"-"+n+"-"+o,n&&o),e),i),h=p>0?us()({marginLeft:p/-2,marginRight:p/-2},a):a,d=ws.Children.map(c,function(e){return e?e.props&&p>0?Object(ws.cloneElement)(e,{style:us()({paddingLeft:p/2,paddingRight:p/2},e.props.style)}):e:null}),v=us()({},u);return delete v.gutter,ws.createElement("div",us()({},v,{className:f,style:h}),d)}}]),t}(ws.Component),od=rd;rd.defaultProps={gutter:0},rd.propTypes={type:zs.string,align:zs.string,justify:zs.string,className:zs.string,children:zs.node,gutter:zs.oneOfType([zs.object,zs.number]),prefixCls:zs.string};var id=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},ad=zs.oneOfType([zs.string,zs.number]),cd=zs.oneOfType([zs.object,zs.number]),sd=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e,t=this.props,n=t.span,r=t.order,o=t.offset,i=t.push,a=t.pull,c=t.className,s=t.children,l=t.prefixCls,u=void 0===l?"ant-col":l,p=id(t,["span","order","offset","push","pull","className","children","prefixCls"]),f={};["xs","sm","md","lg","xl","xxl"].forEach(function(e){var n,r={};"number"==typeof t[e]?r.span=t[e]:"object"===Cs()(t[e])&&(r=t[e]||{}),delete p[e],f=us()({},f,(n={},ss()(n,u+"-"+e+"-"+r.span,void 0!==r.span),ss()(n,u+"-"+e+"-order-"+r.order,r.order||0===r.order),ss()(n,u+"-"+e+"-offset-"+r.offset,r.offset||0===r.offset),ss()(n,u+"-"+e+"-push-"+r.push,r.push||0===r.push),ss()(n,u+"-"+e+"-pull-"+r.pull,r.pull||0===r.pull),n))});var h=Ts()((e={},ss()(e,u+"-"+n,void 0!==n),ss()(e,u+"-order-"+r,r),ss()(e,u+"-offset-"+o,o),ss()(e,u+"-push-"+i,i),ss()(e,u+"-pull-"+a,a),e),c,f);return ws.createElement("div",us()({},p,{className:h}),s)}}]),t}(ws.Component),ld=sd;sd.propTypes={span:ad,order:ad,offset:ad,push:ad,pull:ad,className:zs.string,children:zs.node,xs:cd,sm:cd,md:cd,lg:cd,xl:cd,xxl:cd};var ud=od,pd=ld,fd=this&&this.__decorate||function(e,t,n,r){var o,i=arguments.length,a=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"===("undefined"==typeof Reflect?"undefined":Cs()(Reflect))&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,n,r);else for(var c=e.length-1;c>=0;c--)(o=e[c])&&(a=(i<3?o(a):i>3?o(t,n,a):o(t,n))||a);return i>3&&a&&Object.defineProperty(t,n,a),a},hd=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},dd=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.state={widerPadding:!1},e.updateWiderPaddingCalled=!1,e.onTabChange=function(t){e.props.onTabChange&&e.props.onTabChange(t)},e.saveRef=function(t){e.container=t},e}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){this.updateWiderPadding(),this.resizeEvent=r(window,"resize",this.updateWiderPadding),"noHovering"in this.props&&(Pp(!this.props.noHovering,"`noHovering` of Card is deprecated, you can remove it safely or use `hoverable` instead."),Pp(!!this.props.noHovering,"`noHovering={false}` of Card is deprecated, use `hoverable` instead."))}},{key:"componentWillUnmount",value:function(){this.resizeEvent&&this.resizeEvent.remove(),this.updateWiderPadding.cancel()}},{key:"updateWiderPadding",value:function(){var e=this;if(this.container){this.container.offsetWidth>=936&&!this.state.widerPadding&&this.setState({widerPadding:!0},function(){e.updateWiderPaddingCalled=!0}),this.container.offsetWidth<936&&this.state.widerPadding&&this.setState({widerPadding:!1},function(){e.updateWiderPaddingCalled=!0})}}},{key:"isContainGrid",value:function(){var e=void 0;return ws.Children.forEach(this.props.children,function(t){t&&t.type&&t.type===bh&&(e=!0)}),e}},{key:"getAction",value:function(e){return e&&e.length?e.map(function(t,n){return ws.createElement("li",{style:{width:100/e.length+"%"},key:"action-"+n},ws.createElement("span",null,t))}):null}},{key:"getCompatibleHoverable",value:function(){var e=this.props,t=e.noHovering,n=e.hoverable;return"noHovering"in this.props?!t||n:!!n}},{key:"render",value:function(){var e,t=this.props,n=t.prefixCls,r=void 0===n?"ant-card":n,o=t.className,i=t.extra,a=t.headStyle,c=void 0===a?{}:a,s=t.bodyStyle,l=void 0===s?{}:s,u=(t.noHovering,t.hoverable,t.title),p=t.loading,f=t.bordered,h=void 0===f||f,d=t.type,v=t.cover,m=t.actions,y=t.tabList,g=t.children,b=t.activeTabKey,C=t.defaultActiveTabKey,w=hd(t,["prefixCls","className","extra","headStyle","bodyStyle","noHovering","hoverable","title","loading","bordered","type","cover","actions","tabList","children","activeTabKey","defaultActiveTabKey"]),S=Ts()(r,o,(e={},ss()(e,r+"-loading",p),ss()(e,r+"-bordered",h),ss()(e,r+"-hoverable",this.getCompatibleHoverable()),ss()(e,r+"-wider-padding",this.state.widerPadding),ss()(e,r+"-padding-transition",this.updateWiderPaddingCalled),ss()(e,r+"-contain-grid",this.isContainGrid()),ss()(e,r+"-contain-tabs",y&&y.length),ss()(e,r+"-type-"+d,!!d),e)),x=0===l.padding||"0px"===l.padding?{padding:24}:void 0,M=ws.createElement("div",{className:r+"-loading-content",style:x},ws.createElement(ud,{gutter:8},ws.createElement(pd,{span:22},ws.createElement("div",{className:r+"-loading-block"}))),ws.createElement(ud,{gutter:8},ws.createElement(pd,{span:8},ws.createElement("div",{className:r+"-loading-block"})),ws.createElement(pd,{span:15},ws.createElement("div",{className:r+"-loading-block"}))),ws.createElement(ud,{gutter:8},ws.createElement(pd,{span:6},ws.createElement("div",{className:r+"-loading-block"})),ws.createElement(pd,{span:18},ws.createElement("div",{className:r+"-loading-block"}))),ws.createElement(ud,{gutter:8},ws.createElement(pd,{span:13},ws.createElement("div",{className:r+"-loading-block"})),ws.createElement(pd,{span:9},ws.createElement("div",{className:r+"-loading-block"}))),ws.createElement(ud,{gutter:8},ws.createElement(pd,{span:4},ws.createElement("div",{className:r+"-loading-block"})),ws.createElement(pd,{span:3},ws.createElement("div",{className:r+"-loading-block"})),ws.createElement(pd,{span:16},ws.createElement("div",{className:r+"-loading-block"}))),ws.createElement(ud,{gutter:8},ws.createElement(pd,{span:8},ws.createElement("div",{className:r+"-loading-block"})),ws.createElement(pd,{span:6},ws.createElement("div",{className:r+"-loading-block"})),ws.createElement(pd,{span:8},ws.createElement("div",{className:r+"-loading-block"})))),z=void 0!==b,k=ss()({},z?"activeKey":"defaultActiveKey",z?b:C),_=void 0,O=y&&y.length?ws.createElement(Jh,us()({},k,{className:r+"-head-tabs",size:"large",onChange:this.onTabChange}),y.map(function(e){return ws.createElement(Jh.TabPane,{tab:e.tab,disabled:e.disabled,key:e.key})})):null;(u||i||O)&&(_=ws.createElement("div",{className:r+"-head",style:c},ws.createElement("div",{className:r+"-head-wrapper"},u&&ws.createElement("div",{className:r+"-head-title"},u),i&&ws.createElement("div",{className:r+"-extra"},i)),O));var E=v?ws.createElement("div",{className:r+"-cover"},v):null,T=ws.createElement("div",{className:r+"-body",style:l},p?M:g),N=m&&m.length?ws.createElement("ul",{className:r+"-actions"},this.getAction(m)):null,V=Ps(w,["onTabChange"]);return ws.createElement("div",us()({},V,{className:S,ref:this.saveRef}),_,E,T,N)}}]),t}(ws.Component),vd=dd;dd.Grid=bh,dd.Meta=wh,fd([c()],dd.prototype,"updateWiderPadding",null);var md=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),yd=function(e){function t(){return Tn(this,t),Nn(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return Vn(t,e),md(t,[{key:"shouldComponentUpdate",value:function(e){return this.props.forceRender||this.props.isActive||e.isActive}},{key:"render",value:function(){var e;if(this._isActived=this.props.forceRender||this._isActived||this.props.isActive,!this._isActived)return null;var t=this.props,n=t.prefixCls,r=t.isActive,o=t.children,i=t.destroyInactivePanel,a=t.forceRender,c=t.role,s=Ts()((e={},En(e,n+"-content",!0),En(e,n+"-content-active",r),En(e,n+"-content-inactive",!r),e)),l=a||r||!i?Ss.a.createElement("div",{className:n+"-content-box"},o):null;return Ss.a.createElement("div",{className:s,role:c},l)}}]),t}(ws.Component);yd.propTypes={prefixCls:ks.a.string,isActive:ks.a.bool,children:ks.a.any,destroyInactivePanel:ks.a.bool,forceRender:ks.a.bool,role:ks.a.string};var gd=yd,bd=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},Cd=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),wd=function(e){function t(){var e,n,r,o;Hn(this,t);for(var i=arguments.length,a=Array(i),c=0;c<i;c++)a[c]=arguments[c];return n=r=Ln(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(a))),r.handleItemClick=function(){r.props.onItemClick&&r.props.onItemClick()},r.handleKeyPress=function(e){"Enter"!==e.key&&13!==e.keyCode&&13!==e.which||r.handleItemClick()},o=n,Ln(r,o)}return Dn(t,e),Cd(t,[{key:"render",value:function(){var e,t=this.props,n=t.className,r=t.id,o=t.style,i=t.prefixCls,a=t.header,c=t.headerClass,s=t.children,l=t.isActive,u=t.showArrow,p=t.destroyInactivePanel,f=t.disabled,h=t.accordion,d=t.forceRender,v=t.expandIcon,m=Ts()(i+"-header",Pn({},c,c)),y=Ts()((e={},Pn(e,i+"-item",!0),Pn(e,i+"-item-active",l),Pn(e,i+"-item-disabled",f),e),n),g=null;return u&&"function"==typeof v&&(g=Ss.a.createElement(v,bd({},this.props))),Ss.a.createElement("div",{className:y,style:o,id:r},Ss.a.createElement("div",{className:m,onClick:this.handleItemClick,role:h?"tab":"button",tabIndex:f?-1:0,"aria-expanded":""+l,onKeyPress:this.handleKeyPress},u&&(g||Ss.a.createElement("i",{className:"arrow"})),a),Ss.a.createElement(Ml,{showProp:"isActive",exclusive:!0,component:"",animation:this.props.openAnimation},Ss.a.createElement(gd,{prefixCls:i,isActive:l,destroyInactivePanel:p,forceRender:d,role:h?"tabpanel":null},s)))}}]),t}(ws.Component);wd.propTypes={className:ks.a.oneOfType([ks.a.string,ks.a.object]),id:ks.a.string,children:ks.a.any,openAnimation:ks.a.object,prefixCls:ks.a.string,header:ks.a.oneOfType([ks.a.string,ks.a.number,ks.a.node]),headerClass:ks.a.string,showArrow:ks.a.bool,isActive:ks.a.bool,onItemClick:ks.a.func,style:ks.a.object,destroyInactivePanel:ks.a.bool,disabled:ks.a.bool,accordion:ks.a.bool,forceRender:ks.a.bool,expandIcon:ks.a.func},wd.defaultProps={showArrow:!0,isActive:!1,destroyInactivePanel:!1,onItemClick:function(){},headerClass:"",forceRender:!1};var Sd=wd,xd=In,Md=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),zd=function(e){function t(e){Fn(this,t);var n=Kn(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e)),r=n.props,o=r.activeKey,i=r.defaultActiveKey,a=i;return"activeKey"in n.props&&(a=o),n.state={openAnimation:n.props.openAnimation||xd(n.props.prefixCls),activeKey:Wn(a)},n}return Bn(t,e),Md(t,[{key:"componentWillReceiveProps",value:function(e){"activeKey"in e&&this.setState({activeKey:Wn(e.activeKey)}),"openAnimation"in e&&this.setState({openAnimation:e.openAnimation})}},{key:"onClickItem",value:function(e){var t=this.state.activeKey;if(this.props.accordion)t=t[0]===e?[]:[e];else{t=[].concat(jn(t));var n=t.indexOf(e);n>-1?t.splice(n,1):t.push(e)}this.setActiveKey(t)}},{key:"getItems",value:function(){var e=this,t=this.state.activeKey,n=this.props,r=n.prefixCls,o=n.accordion,i=n.destroyInactivePanel,a=n.expandIcon,c=[];return ws.Children.forEach(this.props.children,function(n,s){if(n){var l=n.key||String(s),u=n.props,p=u.header,f=u.headerClass,h=u.disabled,d=!1;d=o?t[0]===l:t.indexOf(l)>-1;var v={key:l,header:p,headerClass:f,isActive:d,prefixCls:r,destroyInactivePanel:i,openAnimation:e.state.openAnimation,accordion:o,children:n.props.children,onItemClick:h?null:function(){return e.onClickItem(l)},expandIcon:a};c.push(Ss.a.cloneElement(n,v))}}),c}},{key:"setActiveKey",value:function(e){"activeKey"in this.props||this.setState({activeKey:e}),this.props.onChange(this.props.accordion?e[0]:e)}},{key:"render",value:function(){var e,t=this.props,n=t.prefixCls,r=t.className,o=t.style,i=t.accordion,a=Ts()((e={},Rn(e,n,!0),Rn(e,r,!!r),e));return Ss.a.createElement("div",{className:a,style:o,role:i?"tablist":null},this.getItems())}}]),t}(ws.Component);zd.propTypes={children:ks.a.any,prefixCls:ks.a.string,activeKey:ks.a.oneOfType([ks.a.string,ks.a.arrayOf(ks.a.string)]),defaultActiveKey:ks.a.oneOfType([ks.a.string,ks.a.arrayOf(ks.a.string)]),openAnimation:ks.a.object,onChange:ks.a.func,accordion:ks.a.bool,className:ks.a.string,style:ks.a.object,destroyInactivePanel:ks.a.bool,expandIcon:ks.a.func},zd.defaultProps={prefixCls:"rc-collapse",onChange:function(){},accordion:!1,destroyInactivePanel:!1},zd.Panel=Sd;var kd=zd,_d=kd,Od=(kd.Panel,{enter:function(e,t){return Un(e,!0,t)},leave:function(e,t){return Un(e,!1,t)},appear:function(e,t){return Un(e,!0,t)}}),Ed=Od,Td=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e=this.props,t=e.prefixCls,n=e.className,r=void 0===n?"":n,o=e.showArrow,i=void 0===o||o,a=Ts()(ss()({},t+"-no-arrow",!i),r);return ws.createElement(_d.Panel,us()({},this.props,{className:a}))}}]),t}(ws.Component),Nd=Td,Vd=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.renderExpandIcon=function(){return ws.createElement(Kp,{type:"right",className:"arrow"})},e}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e=this.props,t=e.prefixCls,n=e.className,r=void 0===n?"":n,o=e.bordered,i=Ts()(ss()({},t+"-borderless",!o),r);return ws.createElement(_d,us()({},this.props,{className:i,expandIcon:this.renderExpandIcon}))}}]),t}(ws.Component),Pd=Vd;Vd.Panel=Nd,Vd.defaultProps={prefixCls:"ant-collapse",bordered:!0,openAnimation:us()({},Ed,{appear:function(){}})};var Hd=Pd;if("undefined"!=typeof window){var Ld=function(e){return{media:e,matches:!1,addListener:function(){},removeListener:function(){}}};window.matchMedia=window.matchMedia||Ld}var Dd=n(316).default,Ad=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.onWindowResized=function(){n.props.autoplay&&n.slick&&n.slick.innerSlider&&n.slick.innerSlider.autoPlay&&n.slick.innerSlider.autoPlay()},n.saveSlick=function(e){n.slick=e},n.onWindowResized=jh()(n.onWindowResized,500,{leading:!1}),n}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){this.props.autoplay&&window.addEventListener("resize",this.onWindowResized),this.innerSlider=this.slick&&this.slick.innerSlider}},{key:"componentWillUnmount",value:function(){this.props.autoplay&&(window.removeEventListener("resize",this.onWindowResized),this.onWindowResized.cancel())}},{key:"next",value:function(){this.slick.slickNext()}},{key:"prev",value:function(){this.slick.slickPrev()}},{key:"goTo",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];this.slick.slickGoTo(e,t)}},{key:"render",value:function(){var e=us()({},this.props);"fade"===e.effect&&(e.fade=!0);var t=e.prefixCls;return e.vertical&&(t=t+" "+t+"-vertical"),ws.createElement("div",{className:t},ws.createElement(Dd,us()({ref:this.saveSlick},e)))}}]),t}(ws.Component),Id=Ad;Ad.defaultProps={dots:!0,arrows:!1,prefixCls:"ant-carousel",draggable:!1};var Rd=n(172),jd=n.n(Rd),Fd=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},Kd=function(e){function t(n){qn(this,t);var r=Yn(this,e.call(this,n));return r.saveMenuItem=function(e){return function(t){r.menuItems[e]=t}},r.menuItems={},r}return Gn(t,e),t.prototype.componentDidMount=function(){this.scrollActiveItemToView()},t.prototype.componentDidUpdate=function(e){!e.visible&&this.props.visible&&this.scrollActiveItemToView()},t.prototype.getFieldName=function(e){var t=this.props,n=t.fieldNames,r=t.defaultFieldNames;return n[e]||r[e]},t.prototype.getOption=function(e,t){var n=this.props,r=n.prefixCls,o=n.expandTrigger,i=n.expandIcon,a=n.loadingIcon,c=this.props.onSelect.bind(this,e,t),s={onClick:c},l=r+"-menu-item",u=null,p=e[this.getFieldName("children")]&&e[this.getFieldName("children")].length>0;(p||!1===e.isLeaf)&&(l+=" "+r+"-menu-item-expand",e.loading||(u=Ss.a.createElement("span",{className:r+"-menu-item-expand-icon"},i))),"hover"===o&&p&&(s={onMouseEnter:this.delayOnSelect.bind(this,c),onMouseLeave:this.delayOnSelect.bind(this),onClick:c}),this.isActiveOption(e,t)&&(l+=" "+r+"-menu-item-active",s.ref=this.saveMenuItem(t)),e.disabled&&(l+=" "+r+"-menu-item-disabled");var f=null;e.loading&&(l+=" "+r+"-menu-item-loading",f=a||null);var h="";return e.title?h=e.title:"string"==typeof e[this.getFieldName("label")]&&(h=e[this.getFieldName("label")]),Ss.a.createElement("li",Fd({key:e[this.getFieldName("value")],className:l,title:h},s),e[this.getFieldName("label")],u,f)},t.prototype.getActiveOptions=function(e){var t=this,n=e||this.props.activeValue,r=this.props.options;return jd()(r,function(e,r){return e[t.getFieldName("value")]===n[r]},{childrenKeyName:this.getFieldName("children")})},t.prototype.getShowOptions=function(){var e=this,t=this.props.options,n=this.getActiveOptions().map(function(t){return t[e.getFieldName("children")]}).filter(function(e){return!!e});return n.unshift(t),n},t.prototype.delayOnSelect=function(e){for(var t=this,n=arguments.length,r=Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];this.delayTimer&&(clearTimeout(this.delayTimer),this.delayTimer=null),"function"==typeof e&&(this.delayTimer=setTimeout(function(){e(r),t.delayTimer=null},150))},t.prototype.scrollActiveItemToView=function(){for(var e=this.getShowOptions().length,t=0;t<e;t++){var n=this.menuItems[t];if(n){var r=Object(xs.findDOMNode)(n);r.parentNode.scrollTop=r.offsetTop}}},t.prototype.isActiveOption=function(e,t){var n=this.props.activeValue;return(void 0===n?[]:n)[t]===e[this.getFieldName("value")]},t.prototype.render=function(){var e=this,t=this.props,n=t.prefixCls,r=t.dropdownMenuColumnStyle;return Ss.a.createElement("div",null,this.getShowOptions().map(function(t,o){return Ss.a.createElement("ul",{className:n+"-menu",key:o,style:r},t.map(function(t){return e.getOption(t,o)}))}))},t}(Ss.a.Component);Kd.defaultProps={options:[],value:[],activeValue:[],onSelect:function(){},prefixCls:"rc-cascader-menus",visible:!1,expandTrigger:"click"},Kd.propTypes={value:ks.a.array,activeValue:ks.a.array,options:ks.a.array.isRequired,prefixCls:ks.a.string,expandTrigger:ks.a.string,onSelect:ks.a.func,visible:ks.a.bool,dropdownMenuColumnStyle:ks.a.object,defaultFieldNames:ks.a.object,fieldNames:ks.a.object,expandIcon:ks.a.node,loadingIcon:ks.a.node};var Bd=Kd,Wd=n(326),Ud=n.n(Wd),qd=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},Yd={bottomLeft:{points:["tl","bl"],offset:[0,4],overflow:{adjustX:1,adjustY:1}},topLeft:{points:["bl","tl"],offset:[0,-4],overflow:{adjustX:1,adjustY:1}},bottomRight:{points:["tr","br"],offset:[0,4],overflow:{adjustX:1,adjustY:1}},topRight:{points:["br","tr"],offset:[0,-4],overflow:{adjustX:1,adjustY:1}}},Gd=function(e){function t(n){$n(this,t);var r=Jn(this,e.call(this,n));r.setPopupVisible=function(e){"popupVisible"in r.props||r.setState({popupVisible:e}),e&&!r.state.popupVisible&&r.setState({activeValue:r.state.value}),r.props.onPopupVisibleChange(e)},r.handleChange=function(e,t,n){"keydown"===n.type&&n.keyCode!==Xs.ENTER||(r.props.onChange(e.map(function(e){return e[r.getFieldName("value")]}),e),r.setPopupVisible(t.visible))},r.handlePopupVisibleChange=function(e){r.setPopupVisible(e)},r.handleMenuSelect=function(e,t,n){var o=r.trigger.getRootDomNode();o&&o.focus&&o.focus();var i=r.props,a=i.changeOnSelect,c=i.loadData,s=i.expandTrigger;if(e&&!e.disabled){var l=r.state.activeValue;l=l.slice(0,t+1),l[t]=e[r.getFieldName("value")];var u=r.getActiveOptions(l);if(!1===e.isLeaf&&!e[r.getFieldName("children")]&&c)return a&&r.handleChange(u,{visible:!0},n),r.setState({activeValue:l}),void c(u);var p={};e[r.getFieldName("children")]&&e[r.getFieldName("children")].length?!a||"click"!==n.type&&"keydown"!==n.type||("hover"===s?r.handleChange(u,{visible:!1},n):r.handleChange(u,{visible:!0},n),p.value=l):(r.handleChange(u,{visible:!1},n),p.value=l),p.activeValue=l,("value"in r.props||"keydown"===n.type&&n.keyCode!==Xs.ENTER)&&delete p.value,r.setState(p)}},r.handleKeyDown=function(e){var t=r.props.children;if(t&&t.props.onKeyDown)return void t.props.onKeyDown(e);var n=[].concat(r.state.activeValue),o=n.length-1<0?0:n.length-1,i=r.getCurrentLevelOptions(),a=i.map(function(e){return e[r.getFieldName("value")]}).indexOf(n[o]);if(e.keyCode===Xs.DOWN||e.keyCode===Xs.UP||e.keyCode===Xs.LEFT||e.keyCode===Xs.RIGHT||e.keyCode===Xs.ENTER||e.keyCode===Xs.BACKSPACE||e.keyCode===Xs.ESC){if(!r.state.popupVisible&&e.keyCode!==Xs.BACKSPACE&&e.keyCode!==Xs.LEFT&&e.keyCode!==Xs.RIGHT&&e.keyCode!==Xs.ESC)return void r.setPopupVisible(!0);if(e.keyCode===Xs.DOWN||e.keyCode===Xs.UP){var c=a;-1!==c?e.keyCode===Xs.DOWN?(c+=1,c=c>=i.length?0:c):(c-=1,c=c<0?i.length-1:c):c=0,n[o]=i[c][r.getFieldName("value")]}else if(e.keyCode===Xs.LEFT||e.keyCode===Xs.BACKSPACE)n.splice(n.length-1,1);else if(e.keyCode===Xs.RIGHT)i[a]&&i[a][r.getFieldName("children")]&&n.push(i[a][r.getFieldName("children")][0][r.getFieldName("value")]);else if(e.keyCode===Xs.ESC)return void r.setPopupVisible(!1);n&&0!==n.length||r.setPopupVisible(!1);var s=r.getActiveOptions(n),l=s[s.length-1];r.handleMenuSelect(l,s.length-1,e),r.props.onKeyDown&&r.props.onKeyDown(e)}},r.saveTrigger=function(e){r.trigger=e};var o=[];return"value"in n?o=n.value||[]:"defaultValue"in n&&(o=n.defaultValue||[]),op()(!("filedNames"in n),"`filedNames` of Cascader is a typo usage and deprecated, please use `fieldNames` intead."),r.state={popupVisible:n.popupVisible,activeValue:o,value:o},r.defaultFieldNames={label:"label",value:"value",children:"children"},r}return Zn(t,e),t.prototype.componentWillReceiveProps=function(e){if("value"in e&&!Ud()(this.props.value,e.value)){var t={value:e.value||[],activeValue:e.value||[]};"loadData"in e&&delete t.activeValue,this.setState(t)}"popupVisible"in e&&this.setState({popupVisible:e.popupVisible})},t.prototype.getPopupDOMNode=function(){return this.trigger.getPopupDomNode()},t.prototype.getFieldName=function(e){var t=this.defaultFieldNames,n=this.props,r=n.fieldNames,o=n.filedNames;return"filedNames"in this.props?o[e]||t[e]:r[e]||t[e]},t.prototype.getFieldNames=function(){var e=this.props,t=e.fieldNames,n=e.filedNames;return"filedNames"in this.props?n:t},t.prototype.getCurrentLevelOptions=function(){var e=this,t=this.props.options,n=this.state.activeValue,r=void 0===n?[]:n,o=jd()(t,function(t,n){return t[e.getFieldName("value")]===r[n]},{childrenKeyName:this.getFieldName("children")});return o[o.length-2]?o[o.length-2][this.getFieldName("children")]:[].concat(t).filter(function(e){return!e.disabled})},t.prototype.getActiveOptions=function(e){var t=this;return jd()(this.props.options,function(n,r){return n[t.getFieldName("value")]===e[r]},{childrenKeyName:this.getFieldName("children")})},t.prototype.render=function(){var e=this.props,t=e.prefixCls,n=e.transitionName,r=e.popupClassName,o=e.options,i=e.disabled,a=e.builtinPlacements,c=e.popupPlacement,s=e.children,l=Xn(e,["prefixCls","transitionName","popupClassName","options","disabled","builtinPlacements","popupPlacement","children"]),u=Ss.a.createElement("div",null),p="";return o&&o.length>0?u=Ss.a.createElement(Bd,qd({},this.props,{fieldNames:this.getFieldNames(),defaultFieldNames:this.defaultFieldNames,activeValue:this.state.activeValue,onSelect:this.handleMenuSelect,visible:this.state.popupVisible})):p=" "+t+"-menus-empty",Ss.a.createElement(_u,qd({ref:this.saveTrigger},l,{options:o,disabled:i,popupPlacement:c,builtinPlacements:a,popupTransitionName:n,action:i?[]:["click"],popupVisible:!i&&this.state.popupVisible,onPopupVisibleChange:this.handlePopupVisibleChange,prefixCls:t+"-menus",popupClassName:r+p,popup:u}),Object(ws.cloneElement)(s,{onKeyDown:this.handleKeyDown,tabIndex:i?void 0:0}))},t}(ws.Component);Gd.defaultProps={options:[],onChange:function(){},onPopupVisibleChange:function(){},disabled:!1,transitionName:"",prefixCls:"rc-cascader",popupClassName:"",popupPlacement:"bottomLeft",builtinPlacements:Yd,expandTrigger:"click",fieldNames:{label:"label",value:"value",children:"children"},expandIcon:">"},Gd.propTypes={value:ks.a.array,defaultValue:ks.a.array,options:ks.a.array.isRequired,onChange:ks.a.func,onPopupVisibleChange:ks.a.func,popupVisible:ks.a.bool,disabled:ks.a.bool,transitionName:ks.a.string,popupClassName:ks.a.string,popupPlacement:ks.a.string,prefixCls:ks.a.string,dropdownMenuColumnStyle:ks.a.object,builtinPlacements:ks.a.object,loadData:ks.a.func,changeOnSelect:ks.a.bool,children:ks.a.node,onKeyDown:ks.a.func,expandTrigger:ks.a.string,fieldNames:ks.a.object,filedNames:ks.a.object,expandIcon:ks.a.node,loadingIcon:ks.a.node};var Xd=Gd,$d=Xd,Jd=n(327),Zd=n.n(Jd),Qd=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},ev=function(e){return e.join(" / ")},tv=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.handleChange=function(e,t){if(n.setState({inputValue:""}),t[0].__IS_FILTERED_OPTION){var r=e[0],o=t[0].path;return void n.setValue(r,o)}n.setValue(e,t)},n.handlePopupVisibleChange=function(e){"popupVisible"in n.props||n.setState({popupVisible:e,inputFocused:e,inputValue:e?n.state.inputValue:""});var t=n.props.onPopupVisibleChange;t&&t(e)},n.handleInputBlur=function(){n.setState({inputFocused:!1})},n.handleInputClick=function(e){var t=n.state,r=t.inputFocused,o=t.popupVisible;(r||o)&&(e.stopPropagation(),e.nativeEvent.stopImmediatePropagation&&e.nativeEvent.stopImmediatePropagation())},n.handleKeyDown=function(e){e.keyCode===Xs.BACKSPACE&&e.stopPropagation()},n.handleInputChange=function(e){var t=e.target.value;n.setState({inputValue:t})},n.setValue=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];"value"in n.props||n.setState({value:e});var r=n.props.onChange;r&&r(e,t)},n.clearSelection=function(e){e.preventDefault(),e.stopPropagation(),n.state.inputValue?n.setState({inputValue:""}):(n.setValue([]),n.handlePopupVisibleChange(!1))},n.saveInput=function(e){n.input=e},n.state={value:e.value||e.defaultValue||[],inputValue:"",inputFocused:!1,popupVisible:e.popupVisible,flattenOptions:e.showSearch?n.flattenTree(e.options,e.changeOnSelect,e.fieldNames):void 0},n}return gs()(t,e),ds()(t,[{key:"componentWillReceiveProps",value:function(e){"value"in e&&this.setState({value:e.value||[]}),"popupVisible"in e&&this.setState({popupVisible:e.popupVisible}),e.showSearch&&this.props.options!==e.options&&this.setState({flattenOptions:this.flattenTree(e.options,e.changeOnSelect,e.fieldNames)})}},{key:"getLabel",value:function(){var e=this.props,t=e.options,n=e.displayRender,r=void 0===n?ev:n,o=e.fieldNames,i=rr(o),a=this.state.value,c=Array.isArray(a[0])?a[0]:a,s=Zd()(t,function(e,t){return e[i.value]===c[t]},{childrenKeyName:i.children});return r(s.map(function(e){return e[i.label]}),s)}},{key:"flattenTree",value:function(e,t,n){var r=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[],i=rr(n),a=[],c=i.children;return e.forEach(function(e){var i=o.concat(e);!t&&e[c]&&e[c].length||a.push(i),e[c]&&(a=a.concat(r.flattenTree(e[c],t,n,i)))}),a}},{key:"generateFilteredOptions",value:function(e){var t,n=this,r=this.props,o=r.showSearch,i=r.notFoundContent,a=r.fieldNames,c=rr(a),s=o.filter,l=void 0===s?er:s,u=o.render,p=void 0===u?tr:u,f=o.sort,h=void 0===f?nr:f,d=this.state,v=d.flattenOptions,m=void 0===v?[]:v,y=d.inputValue,g=m.filter(function(e){return l(n.state.inputValue,e,c)}).sort(function(e,t){return h(e,t,y,c)});return g.length>0?g.map(function(t){var n;return n={__IS_FILTERED_OPTION:!0,path:t},ss()(n,c.label,p(y,t,e,c)),ss()(n,c.value,t.map(function(e){return e[c.value]})),ss()(n,"disabled",t.some(function(e){return!!e.disabled})),n}):[(t={},ss()(t,c.label,i),ss()(t,c.value,"ANT_CASCADER_NOT_FOUND"),ss()(t,"disabled",!0),t)]}},{key:"focus",value:function(){this.input.focus()}},{key:"blur",value:function(){this.input.blur()}},{key:"render",value:function(){var e,t,n,r=this.props,o=this.state,i=r.prefixCls,a=r.inputPrefixCls,c=r.children,s=r.placeholder,l=r.size,u=r.disabled,p=r.className,f=r.style,h=r.allowClear,d=r.showSearch,v=void 0!==d&&d,m=Qd(r,["prefixCls","inputPrefixCls","children","placeholder","size","disabled","className","style","allowClear","showSearch"]),y=o.value,g=o.inputFocused,b=Ts()((e={},ss()(e,a+"-lg","large"===l),ss()(e,a+"-sm","small"===l),e)),C=h&&!u&&y.length>0||o.inputValue?ws.createElement(Kp,{type:"close-circle",theme:"filled",className:i+"-picker-clear",onClick:this.clearSelection}):null,w=Ts()((t={},ss()(t,i+"-picker-arrow",!0),ss()(t,i+"-picker-arrow-expand",o.popupVisible),t)),S=Ts()(p,i+"-picker",(n={},ss()(n,i+"-picker-with-value",o.inputValue),ss()(n,i+"-picker-disabled",u),ss()(n,i+"-picker-"+l,!!l),ss()(n,i+"-picker-show-search",!!v),ss()(n,i+"-picker-focused",g),n)),x=Ps(m,["onChange","options","popupPlacement","transitionName","displayRender","onPopupVisibleChange","changeOnSelect","expandTrigger","popupVisible","getPopupContainer","loadData","popupClassName","filterOption","renderFilteredOption","sortFilteredOption","notFoundContent","fieldNames"]),M=r.options;o.inputValue&&(M=this.generateFilteredOptions(i)),o.popupVisible?this.cachedOptions=M:M=this.cachedOptions;var z={};1===(M||[]).length&&"ANT_CASCADER_NOT_FOUND"===M[0].value&&(z.height="auto"),!1!==v.matchInputWidth&&o.inputValue&&this.input&&(z.width=this.input.input.offsetWidth);var k=c||ws.createElement("span",{style:f,className:S},ws.createElement("span",{className:i+"-picker-label"},this.getLabel()),ws.createElement(yf,us()({},x,{ref:this.saveInput,prefixCls:a,placeholder:y&&y.length>0?void 0:s,className:i+"-input "+b,value:o.inputValue,disabled:u,readOnly:!v,autoComplete:"off",onClick:v?this.handleInputClick:void 0,onBlur:v?this.handleInputBlur:void 0,onKeyDown:this.handleKeyDown,onChange:v?this.handleInputChange:void 0})),C,ws.createElement(Kp,{type:"down",className:w})),_=ws.createElement(Kp,{type:"right"}),O=ws.createElement("span",{className:i+"-menu-item-loading-icon"},ws.createElement(Kp,{type:"redo",spin:!0}));return ws.createElement($d,us()({},r,{options:M,value:y,popupVisible:o.popupVisible,onPopupVisibleChange:this.handlePopupVisibleChange,onChange:this.handleChange,dropdownMenuColumnStyle:z,expandIcon:_,loadingIcon:O}),k)}}]),t}(ws.Component),nv=tv;tv.defaultProps={prefixCls:"ant-cascader",inputPrefixCls:"ant-input",placeholder:"Please select",transitionName:"slide-up",popupPlacement:"bottomLeft",options:[],disabled:!1,allowClear:!0,notFoundContent:"Not Found"};var rv=n(167),ov=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},iv=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.saveCheckbox=function(t){e.rcCheckbox=t},e}return gs()(t,e),ds()(t,[{key:"shouldComponentUpdate",value:function(e,t,n){return!Vs()(this.props,e)||!Vs()(this.state,t)||!Vs()(this.context.checkboxGroup,n.checkboxGroup)}},{key:"focus",value:function(){this.rcCheckbox.focus()}},{key:"blur",value:function(){this.rcCheckbox.blur()}},{key:"render",value:function(){var e=this.props,t=this.context,n=e.prefixCls,r=e.className,o=e.children,i=e.indeterminate,a=e.style,c=e.onMouseEnter,s=e.onMouseLeave,l=ov(e,["prefixCls","className","children","indeterminate","style","onMouseEnter","onMouseLeave"]),u=t.checkboxGroup,p=us()({},l);u&&(p.onChange=function(){return u.toggleOption({label:o,value:e.value})},p.checked=-1!==u.value.indexOf(e.value),p.disabled=e.disabled||u.disabled);var f=Ts()(r,ss()({},n+"-wrapper",!0)),h=Ts()(ss()({},n+"-indeterminate",i));return ws.createElement("label",{className:f,style:a,onMouseEnter:c,onMouseLeave:s},ws.createElement(rv.a,us()({},p,{prefixCls:n,className:h,ref:this.saveCheckbox})),void 0!==o?ws.createElement("span",null,o):null)}}]),t}(ws.Component),av=iv;iv.defaultProps={prefixCls:"ant-checkbox",indeterminate:!1},iv.contextTypes={checkboxGroup:zs.any};var cv=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.toggleOption=function(e){var t=n.state.value.indexOf(e.value),r=[].concat(Ls()(n.state.value));-1===t?r.push(e.value):r.splice(t,1),"value"in n.props||n.setState({value:r});var o=n.props.onChange;o&&o(r)},n.state={value:e.value||e.defaultValue||[]},n}return gs()(t,e),ds()(t,[{key:"getChildContext",value:function(){return{checkboxGroup:{toggleOption:this.toggleOption,value:this.state.value,disabled:this.props.disabled}}}},{key:"shouldComponentUpdate",value:function(e,t){return!Vs()(this.props,e)||!Vs()(this.state,t)}},{key:"getOptions",value:function(){return this.props.options.map(function(e){return"string"==typeof e?{label:e,value:e}:e})}},{key:"render",value:function(){var e=this,t=this.props,n=this.state,r=t.prefixCls,o=t.className,i=t.style,a=t.options,c=r+"-group",s=t.children;a&&a.length>0&&(s=this.getOptions().map(function(o){return ws.createElement(av,{prefixCls:r,key:o.value.toString(),disabled:"disabled"in o?o.disabled:t.disabled,value:o.value,checked:-1!==n.value.indexOf(o.value),onChange:function(){return e.toggleOption(o)},className:c+"-item"},o.label)}));var l=Ts()(c,o);return ws.createElement("div",{className:l,style:i},s)}}],[{key:"getDerivedStateFromProps",value:function(e){return"value"in e?{value:e.value||[]}:null}}]),t}(ws.Component);cv.defaultProps={options:[],prefixCls:"ant-checkbox"},cv.propTypes={defaultValue:zs.array,value:zs.array,options:zs.array.isRequired,onChange:zs.func},cv.childContextTypes={checkboxGroup:zs.any},Object(Ys.polyfill)(cv);var sv=cv;av.Group=sv;var lv=av,uv=qf()({displayName:"MonthPanel",propTypes:{onChange:ks.a.func,disabledDate:ks.a.func,onSelect:ks.a.func},getDefaultProps:function(){return{onChange:cr,onSelect:cr}},getInitialState:function(){var e=this.props;return this.nextYear=ar.bind(this,1),this.previousYear=ar.bind(this,-1),this.prefixCls=e.rootPrefixCls+"-month-panel",{value:e.value||e.defaultValue}},componentWillReceiveProps:function(e){"value"in e&&this.setState({value:e.value})},setAndChangeValue:function(e){this.setValue(e),this.props.onChange(e)},setAndSelectValue:function(e){this.setValue(e),this.props.onSelect(e)},setValue:function(e){"value"in this.props||this.setState({value:e})},render:function(){var e=this.props,t=this.state.value,n=e.cellRender,r=e.contentRender,o=e.locale,i=t.year(),a=this.prefixCls;return Ss.a.createElement("div",{className:a,style:e.style},Ss.a.createElement("div",null,Ss.a.createElement("div",{className:a+"-header"},Ss.a.createElement("a",{className:a+"-prev-year-btn",role:"button",onClick:this.previousYear,title:o.previousYear}),Ss.a.createElement("a",{className:a+"-year-select",role:"button",onClick:e.onYearPanelShow,title:o.yearSelect},Ss.a.createElement("span",{className:a+"-year-select-content"},i),Ss.a.createElement("span",{className:a+"-year-select-arrow"},"x")),Ss.a.createElement("a",{className:a+"-next-year-btn",role:"button",onClick:this.nextYear,title:o.nextYear})),Ss.a.createElement("div",{className:a+"-body"},Ss.a.createElement(nh,{disabledDate:e.disabledDate,onSelect:this.setAndSelectValue,locale:o,value:t,cellRender:n,contentRender:r,prefixCls:a}))))}}),pv=uv,fv=function(e){function t(n){fs()(this,t);var r=ms()(this,e.call(this,n));return r.prefixCls=n.rootPrefixCls+"-year-panel",r.state={value:n.value||n.defaultValue},r.nextDecade=sr.bind(r,10),r.previousDecade=sr.bind(r,-10),r}return gs()(t,e),t.prototype.years=function(){for(var e=this.state.value,t=e.year(),n=10*parseInt(t/10,10),r=n-1,o=[],i=0,a=0;a<4;a++){o[a]=[];for(var c=0;c<3;c++){var s=r+i,l=String(s);o[a][c]={content:l,year:s,title:l},i++}}return o},t.prototype.render=function(){var e=this,t=this.props,n=this.state.value,r=t.locale,o=this.years(),i=n.year(),a=10*parseInt(i/10,10),c=a+9,s=this.prefixCls,l=o.map(function(t,n){var r=t.map(function(t){var n,r=(n={},n[s+"-cell"]=1,n[s+"-selected-cell"]=t.year===i,n[s+"-last-decade-cell"]=t.year<a,n[s+"-next-decade-cell"]=t.year>c,n),o=void 0;return o=t.year<a?e.previousDecade:t.year>c?e.nextDecade:lr.bind(e,t.year),Ss.a.createElement("td",{role:"gridcell",title:t.title,key:t.content,onClick:o,className:Ts()(r)},Ss.a.createElement("a",{className:s+"-year"},t.content))});return Ss.a.createElement("tr",{key:n,role:"row"},r)});return Ss.a.createElement("div",{className:this.prefixCls},Ss.a.createElement("div",null,Ss.a.createElement("div",{className:s+"-header"},Ss.a.createElement("a",{className:s+"-prev-decade-btn",role:"button",onClick:this.previousDecade,title:r.previousDecade}),Ss.a.createElement("a",{className:s+"-decade-select",role:"button",onClick:t.onDecadePanelShow,title:r.decadeSelect},Ss.a.createElement("span",{className:s+"-decade-select-content"},a,"-",c),Ss.a.createElement("span",{className:s+"-decade-select-arrow"},"x")),Ss.a.createElement("a",{className:s+"-next-decade-btn",role:"button",onClick:this.nextDecade,title:r.nextDecade})),Ss.a.createElement("div",{className:s+"-body"},Ss.a.createElement("table",{className:s+"-table",cellSpacing:"0",role:"grid"},Ss.a.createElement("tbody",{className:s+"-tbody"},l)))))},t}(Ss.a.Component),hv=fv;fv.propTypes={rootPrefixCls:ks.a.string,value:ks.a.object,defaultValue:ks.a.object},fv.defaultProps={onSelect:function(){}};var dv=function(e){function t(n){fs()(this,t);var r=ms()(this,e.call(this,n));return r.state={value:n.value||n.defaultValue},r.prefixCls=n.rootPrefixCls+"-decade-panel",r.nextCentury=ur.bind(r,100),r.previousCentury=ur.bind(r,-100),r}return gs()(t,e),t.prototype.render=function(){for(var e=this,t=this.state.value,n=this.props.locale,r=t.year(),o=100*parseInt(r/100,10),i=o-10,a=o+99,c=[],s=0,l=this.prefixCls,u=0;u<4;u++){c[u]=[];for(var p=0;p<3;p++){var f=i+10*s,h=i+10*s+9;c[u][p]={startDecade:f,endDecade:h},s++}}var d=c.map(function(t,n){var i=t.map(function(t){var n,i=t.startDecade,c=t.endDecade,s=i<o,u=c>a,p=(n={},n[l+"-cell"]=1,n[l+"-selected-cell"]=i<=r&&r<=c,n[l+"-last-century-cell"]=s,n[l+"-next-century-cell"]=u,n),f=i+"-"+c,h=void 0;return h=s?e.previousCentury:u?e.nextCentury:pr.bind(e,i),Ss.a.createElement("td",{key:i,onClick:h,role:"gridcell",className:Ts()(p)},Ss.a.createElement("a",{className:l+"-decade"},f))});return Ss.a.createElement("tr",{key:n,role:"row"},i)});return Ss.a.createElement("div",{className:this.prefixCls},Ss.a.createElement("div",{className:l+"-header"},Ss.a.createElement("a",{className:l+"-prev-century-btn",role:"button",onClick:this.previousCentury,title:n.previousCentury}),Ss.a.createElement("div",{className:l+"-century"},o,"-",a),Ss.a.createElement("a",{className:l+"-next-century-btn",role:"button",onClick:this.nextCentury,title:n.nextCentury})),Ss.a.createElement("div",{className:l+"-body"},Ss.a.createElement("table",{className:l+"-table",cellSpacing:"0",role:"grid"},Ss.a.createElement("tbody",{className:l+"-tbody"},d))))},t}(Ss.a.Component),vv=dv;dv.propTypes={locale:ks.a.object,value:ks.a.object,defaultValue:ks.a.object,rootPrefixCls:ks.a.string},dv.defaultProps={onSelect:function(){}};var mv=qf()({displayName:"CalendarHeader",propTypes:{prefixCls:ks.a.string,value:ks.a.object,onValueChange:ks.a.func,showTimePicker:ks.a.bool,onPanelChange:ks.a.func,locale:ks.a.object,enablePrev:ks.a.any,enableNext:ks.a.any,disabledMonth:ks.a.func},getDefaultProps:function(){return{enableNext:1,enablePrev:1,onPanelChange:function(){},onValueChange:function(){}}},getInitialState:function(){return this.nextMonth=fr.bind(this,1),this.previousMonth=fr.bind(this,-1),this.nextYear=hr.bind(this,1),this.previousYear=hr.bind(this,-1),{yearPanelReferer:null}},onMonthSelect:function(e){this.props.onPanelChange(e,"date"),this.props.onMonthSelect?this.props.onMonthSelect(e):this.props.onValueChange(e)},onYearSelect:function(e){var t=this.state.yearPanelReferer;this.setState({yearPanelReferer:null}),this.props.onPanelChange(e,t),this.props.onValueChange(e)},onDecadeSelect:function(e){this.props.onPanelChange(e,"year"),this.props.onValueChange(e)},monthYearElement:function(e){var t=this,n=this.props,r=n.prefixCls,o=n.locale,i=n.value,a=i.localeData(),c=o.monthBeforeYear,s=r+"-"+(c?"my-select":"ym-select"),l=e?" "+r+"-time-status":"",u=Ss.a.createElement("a",{className:r+"-year-select"+l,role:"button",onClick:e?null:function(){return t.showYearPanel("date")},title:e?null:o.yearSelect},i.format(o.yearFormat)),p=Ss.a.createElement("a",{className:r+"-month-select"+l,role:"button",onClick:e?null:this.showMonthPanel,title:e?null:o.monthSelect},o.monthFormat?i.format(o.monthFormat):a.monthsShort(i)),f=void 0;e&&(f=Ss.a.createElement("a",{className:r+"-day-select"+l,role:"button"},i.format(o.dayFormat)));var h=[];return h=c?[p,f,u]:[u,p,f],Ss.a.createElement("span",{className:s},ir(h))},showMonthPanel:function(){this.props.onPanelChange(null,"month")},showYearPanel:function(e){this.setState({yearPanelReferer:e}),this.props.onPanelChange(null,"year")},showDecadePanel:function(){this.props.onPanelChange(null,"decade")},render:function(){var e=this,t=this.props,n=t.prefixCls,r=t.locale,o=t.mode,i=t.value,a=t.showTimePicker,c=t.enableNext,s=t.enablePrev,l=t.disabledMonth,u=null;return"month"===o&&(u=Ss.a.createElement(pv,{locale:r,defaultValue:i,rootPrefixCls:n,onSelect:this.onMonthSelect,onYearPanelShow:function(){return e.showYearPanel("month")},disabledDate:l,cellRender:t.monthCellRender,contentRender:t.monthCellContentRender})),"year"===o&&(u=Ss.a.createElement(hv,{locale:r,defaultValue:i,rootPrefixCls:n,onSelect:this.onYearSelect,onDecadePanelShow:this.showDecadePanel})),"decade"===o&&(u=Ss.a.createElement(vv,{locale:r,defaultValue:i,rootPrefixCls:n,onSelect:this.onDecadeSelect})),Ss.a.createElement("div",{className:n+"-header"},Ss.a.createElement("div",{style:{position:"relative"}},dr(s&&!a,Ss.a.createElement("a",{className:n+"-prev-year-btn",role:"button",onClick:this.previousYear,title:r.previousYear})),dr(s&&!a,Ss.a.createElement("a",{className:n+"-prev-month-btn",role:"button",onClick:this.previousMonth,title:r.previousMonth})),this.monthYearElement(a),dr(c&&!a,Ss.a.createElement("a",{className:n+"-next-month-btn",onClick:this.nextMonth,title:r.nextMonth})),dr(c&&!a,Ss.a.createElement("a",{className:n+"-next-year-btn",onClick:this.nextYear,title:r.nextYear}))),u)}}),yv=mv,gv=qf()({displayName:"CalendarFooter",propTypes:{prefixCls:ks.a.string,showDateInput:ks.a.bool,disabledTime:ks.a.any,timePicker:ks.a.element,selectedValue:ks.a.any,showOk:ks.a.bool,onSelect:ks.a.func,value:ks.a.object,renderFooter:ks.a.func,defaultValue:ks.a.object},onSelect:function(e){this.props.onSelect(e)},getRootDOMNode:function(){return Ms.a.findDOMNode(this)},render:function(){var e=this.props,t=e.value,n=e.prefixCls,r=e.showOk,o=e.timePicker,i=e.renderFooter,a=null,c=i();if(e.showToday||o||c){var s,l=void 0;e.showToday&&(l=Ss.a.createElement(vr,us()({},e,{value:t})));var u=void 0;(!0===r||!1!==r&&e.timePicker)&&(u=Ss.a.createElement(mr,e));var p=void 0;e.timePicker&&(p=Ss.a.createElement(yr,e));var f=void 0;(l||p||u||c)&&(f=Ss.a.createElement("span",{className:n+"-footer-btn"},c,ir([l,p,u])));var h=Ts()(n+"-footer",(s={},s[n+"-footer-show-ok"]=u,s));a=Ss.a.createElement("div",{className:h},f)}return a}}),bv=gv,Cv=qf()({displayName:"DateInput",propTypes:{prefixCls:ks.a.string,timePicker:ks.a.object,value:ks.a.object,disabledTime:ks.a.any,format:ks.a.string,locale:ks.a.object,disabledDate:ks.a.func,onChange:ks.a.func,onClear:ks.a.func,placeholder:ks.a.string,onSelect:ks.a.func,selectedValue:ks.a.object,clearIcon:ks.a.node},getInitialState:function(){var e=this.props.selectedValue;return{str:e&&e.format(this.props.format)||"",invalid:!1}},componentWillReceiveProps:function(e){this.cachedSelectionStart=this.dateInputInstance.selectionStart,this.cachedSelectionEnd=this.dateInputInstance.selectionEnd;var t=e.selectedValue;this.setState({str:t&&t.format(e.format)||"",invalid:!1})},componentDidUpdate:function(){this.state.invalid||0===this.cachedSelectionStart&&0===this.cachedSelectionEnd||this.dateInputInstance.setSelectionRange(this.cachedSelectionStart,this.cachedSelectionEnd)},onInputChange:function(e){var t=e.target.value;this.setState({str:t});var n=void 0,r=this.props,o=r.disabledDate,i=r.format,a=r.onChange;if(t){var c=Wf()(t,i,!0);if(!c.isValid())return void this.setState({invalid:!0});if(n=this.props.value.clone(),n.year(c.year()).month(c.month()).date(c.date()).hour(c.hour()).minute(c.minute()).second(c.second()),!n||o&&o(n))return void this.setState({invalid:!0});var s=this.props.selectedValue;s&&n?s.isSame(n)||a(n):s!==n&&a(n)}else a(null);this.setState({invalid:!1})},onClear:function(){this.setState({str:""}),this.props.onClear(null)},getRootDOMNode:function(){return Ms.a.findDOMNode(this)},focus:function(){this.dateInputInstance&&this.dateInputInstance.focus()},saveDateInput:function(e){this.dateInputInstance=e},render:function(){var e=this.props,t=this.state,n=t.invalid,r=t.str,o=e.locale,i=e.prefixCls,a=e.placeholder,c=e.clearIcon,s=n?i+"-input-invalid":"";return Ss.a.createElement("div",{className:i+"-input-wrap"},Ss.a.createElement("div",{className:i+"-date-input-wrap"},Ss.a.createElement("input",{ref:this.saveDateInput,className:i+"-input "+s,value:r,disabled:e.disabled,placeholder:a,onChange:this.onInputChange})),e.showClear?Ss.a.createElement("a",{role:"button",title:o.clear,onClick:this.onClear},c||Ss.a.createElement("span",{className:i+"-clear-btn"})):null)}}),wv=Cv,Sv=qf()({displayName:"Calendar",propTypes:{prefixCls:ks.a.string,className:ks.a.string,style:ks.a.object,defaultValue:ks.a.object,value:ks.a.object,selectedValue:ks.a.object,mode:ks.a.oneOf(["time","date","month","year","decade"]),locale:ks.a.object,showDateInput:ks.a.bool,showWeekNumber:ks.a.bool,showToday:ks.a.bool,showOk:ks.a.bool,onSelect:ks.a.func,onOk:ks.a.func,onKeyDown:ks.a.func,timePicker:ks.a.element,dateInputPlaceholder:ks.a.any,onClear:ks.a.func,onChange:ks.a.func,onPanelChange:ks.a.func,disabledDate:ks.a.func,disabledTime:ks.a.any,dateRender:ks.a.func,renderFooter:ks.a.func,renderSidebar:ks.a.func,clearIcon:ks.a.node},mixins:[ah,oh],getDefaultProps:function(){return{showToday:!0,showDateInput:!0,timePicker:null,onOk:Sr,onPanelChange:Sr}},getInitialState:function(){return{mode:this.props.mode||"date"}},componentWillReceiveProps:function(e){"mode"in e&&this.state.mode!==e.mode&&this.setState({mode:e.mode})},onKeyDown:function(e){if("input"!==e.target.nodeName.toLowerCase()){var t=e.keyCode,n=e.ctrlKey||e.metaKey,r=this.props.disabledDate,o=this.state.value;switch(t){case Xs.DOWN:return this.goTime(1,"weeks"),e.preventDefault(),1;case Xs.UP:return this.goTime(-1,"weeks"),e.preventDefault(),1;case Xs.LEFT:return n?this.goTime(-1,"years"):this.goTime(-1,"days"),e.preventDefault(),1;case Xs.RIGHT:return n?this.goTime(1,"years"):this.goTime(1,"days"),e.preventDefault(),1;case Xs.HOME:return this.setValue(gr(this.state.value)),e.preventDefault(),1;case Xs.END:return this.setValue(br(this.state.value)),e.preventDefault(),1;case Xs.PAGE_DOWN:return this.goTime(1,"month"),e.preventDefault(),1;case Xs.PAGE_UP:return this.goTime(-1,"month"),e.preventDefault(),1;case Xs.ENTER:return r&&r(o)||this.onSelect(o,{source:"keyboard"}),e.preventDefault(),1;default:return this.props.onKeyDown(e),1}}},onClear:function(){this.onSelect(null),this.props.onClear()},onOk:function(){var e=this.state.selectedValue;this.isAllowedDate(e)&&this.props.onOk(e)},onDateInputChange:function(e){this.onSelect(e,{source:"dateInput"})},onDateTableSelect:function(e){var t=this.props.timePicker;if(!this.state.selectedValue&&t){var n=t.props.defaultValue;n&&Wt(n,e)}this.onSelect(e)},onToday:function(){var e=this.state.value,t=jt(e);this.onSelect(t,{source:"todayButton"})},onPanelChange:function(e,t){var n=this.props,r=this.state;"mode"in n||this.setState({mode:t}),n.onPanelChange(e||r.value,t)},getRootDOMNode:function(){return Ms.a.findDOMNode(this)},openTimePicker:function(){this.onPanelChange(null,"time")},closeTimePicker:function(){this.onPanelChange(null,"date")},goTime:function(e,t){this.setValue(Cr(this.state.value,e,t))},render:function(){var e=this.props,t=this.state,n=e.locale,r=e.prefixCls,o=e.disabledDate,i=e.dateInputPlaceholder,a=e.timePicker,c=e.disabledTime,s=e.clearIcon,l=t.value,u=t.selectedValue,p=t.mode,f="time"===p,h=f&&c&&a?Ut(u,c):null,d=null;if(a&&f){var v=us()({showHour:!0,showSecond:!0,showMinute:!0},a.props,h,{onChange:this.onDateInputChange,value:u,disabledTime:c});void 0!==a.props.defaultValue&&(v.defaultOpenValue=a.props.defaultValue),d=Ss.a.cloneElement(a,v)}var m=e.showDateInput?Ss.a.createElement(wv,{format:this.getFormat(),key:"date-input",value:l,locale:n,placeholder:i,showClear:!0,disabledTime:c,disabledDate:o,onClear:this.onClear,prefixCls:r,selectedValue:u,onChange:this.onDateInputChange,clearIcon:s}):null,y=[e.renderSidebar(),Ss.a.createElement("div",{className:r+"-panel",key:"panel"},m,Ss.a.createElement("div",{className:r+"-date-panel"},Ss.a.createElement(yv,{locale:n,mode:p,value:l,onValueChange:this.setValue,onPanelChange:this.onPanelChange,showTimePicker:f,prefixCls:r}),a&&f?Ss.a.createElement("div",{className:r+"-time-picker"},Ss.a.createElement("div",{className:r+"-time-picker-panel"},d)):null,Ss.a.createElement("div",{className:r+"-body"},Ss.a.createElement(eh,{locale:n,value:l,selectedValue:u,prefixCls:r,dateRender:e.dateRender,onSelect:this.onDateTableSelect,disabledDate:o,showWeekNumber:e.showWeekNumber})),Ss.a.createElement(bv,{showOk:e.showOk,renderFooter:e.renderFooter,locale:n,prefixCls:r,showToday:e.showToday,disabledTime:c,showTimePicker:f,showDateInput:e.showDateInput,timePicker:a,selectedValue:u,value:l,disabledDate:o,okDisabled:!this.isAllowedDate(u),onOk:this.onOk,onSelect:this.onSelect,onToday:this.onToday,onOpenTimePicker:this.openTimePicker,onCloseTimePicker:this.closeTimePicker})))];return this.renderRoot({children:y,className:e.showWeekNumber?r+"-week-number":""})}}),xv=Sv,Mv=xv,zv=qf()({displayName:"MonthCalendar",propTypes:{monthCellRender:ks.a.func,dateCellRender:ks.a.func},mixins:[ah,oh],getInitialState:function(){return{mode:"month"}},onKeyDown:function(e){var t=e.keyCode,n=e.ctrlKey||e.metaKey,r=this.state.value,o=this.props.disabledDate,i=r;switch(t){case Xs.DOWN:i=r.clone(),i.add(3,"months");break;case Xs.UP:i=r.clone(),i.add(-3,"months");break;case Xs.LEFT:i=r.clone(),n?i.add(-1,"years"):i.add(-1,"months");break;case Xs.RIGHT:i=r.clone(),n?i.add(1,"years"):i.add(1,"months");break;case Xs.ENTER:return o&&o(r)||this.onSelect(r),e.preventDefault(),1;default:return}if(i!==r)return this.setValue(i),e.preventDefault(),1},handlePanelChange:function(e,t){"date"!==t&&this.setState({mode:t})},render:function(){var e=this.props,t=this.state,n=t.mode,r=t.value,o=Ss.a.createElement("div",{className:e.prefixCls+"-month-calendar-content"},Ss.a.createElement("div",{className:e.prefixCls+"-month-header-wrap"},Ss.a.createElement(yv,{prefixCls:e.prefixCls,mode:n,value:r,locale:e.locale,disabledMonth:e.disabledDate,monthCellRender:e.monthCellRender,monthCellContentRender:e.monthCellContentRender,onMonthSelect:this.onSelect,onValueChange:this.setValue,onPanelChange:this.handlePanelChange})),Ss.a.createElement(bv,{prefixCls:e.prefixCls,renderFooter:e.renderFooter}));return this.renderRoot({className:e.prefixCls+"-month-calendar",children:o})}}),kv=zv,_v={adjustX:1,adjustY:1},Ov=[0,0],Ev={bottomLeft:{points:["tl","tl"],overflow:_v,offset:[0,-3],targetOffset:Ov},bottomRight:{points:["tr","tr"],overflow:_v,offset:[0,-3],targetOffset:Ov},topRight:{points:["br","br"],overflow:_v,offset:[0,3],targetOffset:Ov},topLeft:{points:["bl","bl"],overflow:_v,offset:[0,3],targetOffset:Ov}},Tv=Ev,Nv=qf()({displayName:"Picker",propTypes:{animation:ks.a.oneOfType([ks.a.func,ks.a.string]),disabled:ks.a.bool,transitionName:ks.a.string,onChange:ks.a.func,onOpenChange:ks.a.func,children:ks.a.func,getCalendarContainer:ks.a.func,calendar:ks.a.element,style:ks.a.object,open:ks.a.bool,defaultOpen:ks.a.bool,prefixCls:ks.a.string,placement:ks.a.any,value:ks.a.oneOfType([ks.a.object,ks.a.array]),defaultValue:ks.a.oneOfType([ks.a.object,ks.a.array]),align:ks.a.object},getDefaultProps:function(){return{prefixCls:"rc-calendar-picker",style:{},align:{},placement:"bottomLeft",defaultOpen:!1,onChange:xr,onOpenChange:xr}},getInitialState:function(){var e=this.props,t=void 0;t="open"in e?e.open:e.defaultOpen;var n=e.value||e.defaultValue;return this.saveCalendarRef=Mr.bind(this,"calendarInstance"),{open:t,value:n}},componentWillReceiveProps:function(e){var t=e.value,n=e.open;"value"in e&&this.setState({value:t}),void 0!==n&&this.setState({open:n})},componentDidUpdate:function(e,t){!t.open&&this.state.open&&(this.focusTimeout=setTimeout(this.focusCalendar,0,this))},componentWillUnmount:function(){clearTimeout(this.focusTimeout)},onCalendarKeyDown:function(e){e.keyCode===Xs.ESC&&(e.stopPropagation(),this.close(this.focus))},onCalendarSelect:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=this.props;"value"in n||this.setState({value:e}),("keyboard"===t.source||!n.calendar.props.timePicker&&"dateInput"!==t.source||"todayButton"===t.source)&&this.close(this.focus),n.onChange(e)},onKeyDown:function(e){e.keyCode!==Xs.DOWN||this.state.open||(this.open(),e.preventDefault())},onCalendarOk:function(){this.close(this.focus)},onCalendarClear:function(){this.close(this.focus)},onVisibleChange:function(e){this.setOpen(e)},getCalendarElement:function(){var e=this.props,t=this.state,n=e.calendar.props,r=t.value,o=r,i={ref:this.saveCalendarRef,defaultValue:o||n.defaultValue,selectedValue:r,onKeyDown:this.onCalendarKeyDown,onOk:T(n.onOk,this.onCalendarOk),onSelect:T(n.onSelect,this.onCalendarSelect),onClear:T(n.onClear,this.onCalendarClear)};return Ss.a.cloneElement(e.calendar,i)},setOpen:function(e,t){var n=this.props.onOpenChange;this.state.open!==e&&("open"in this.props||this.setState({open:e},t),n(e))},open:function(e){this.setOpen(!0,e)},close:function(e){this.setOpen(!1,e)},focus:function(){this.state.open||Ms.a.findDOMNode(this).focus()},focusCalendar:function(){this.state.open&&this.calendarInstance&&this.calendarInstance.focus()},render:function(){var e=this.props,t=e.prefixCls,n=e.placement,r=e.style,o=e.getCalendarContainer,i=e.align,a=e.animation,c=e.disabled,s=e.dropdownClassName,l=e.transitionName,u=e.children,p=this.state;return Ss.a.createElement(_u,{popup:this.getCalendarElement(),popupAlign:i,builtinPlacements:Tv,popupPlacement:n,action:c&&!p.open?[]:["click"],destroyPopupOnHide:!0,getPopupContainer:o,popupStyle:r,popupAnimation:a,popupTransitionName:l,popupVisible:p.open,onPopupVisibleChange:this.onVisibleChange,prefixCls:t,popupClassName:s},Ss.a.cloneElement(u(p,e),{onKeyDown:this.onKeyDown}))}}),Vv=Nv,Pv=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));Hv.call(n);var r=e.value,o=e.format;return n.state={str:r&&r.format(o)||"",invalid:!1},n}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){var e=this;if(this.props.focusOnOpen){(window.requestAnimationFrame||window.setTimeout)(function(){e.refs.input.focus(),e.refs.input.select()})}}},{key:"componentWillReceiveProps",value:function(e){var t=e.value,n=e.format;this.setState({str:t&&t.format(n)||"",invalid:!1})}},{key:"getClearButton",value:function(){var e=this.props,t=e.prefixCls,n=e.allowEmpty,r=e.clearIcon;return n?Ss.a.createElement("a",{role:"button",className:t+"-clear-btn",title:this.props.clearText,onMouseDown:this.onClear},r||Ss.a.createElement("i",{className:t+"-clear-btn-icon"})):null}},{key:"getProtoValue",value:function(){return this.props.value||this.props.defaultOpenValue}},{key:"getInput",value:function(){var e=this.props,t=e.prefixCls,n=e.placeholder,r=e.inputReadOnly,o=this.state,i=o.invalid,a=o.str,c=i?t+"-input-invalid":"";return Ss.a.createElement("input",{className:t+"-input "+c,ref:"input",onKeyDown:this.onKeyDown,value:a,placeholder:n,onChange:this.onInputChange,readOnly:!!r})}},{key:"render",value:function(){var e=this.props.prefixCls;return Ss.a.createElement("div",{className:e+"-input-wrap"},this.getInput(),this.getClearButton())}}]),t}(ws.Component);Pv.propTypes={format:ks.a.string,prefixCls:ks.a.string,disabledDate:ks.a.func,placeholder:ks.a.string,clearText:ks.a.string,value:ks.a.object,inputReadOnly:ks.a.bool,hourOptions:ks.a.array,minuteOptions:ks.a.array,secondOptions:ks.a.array,disabledHours:ks.a.func,disabledMinutes:ks.a.func,disabledSeconds:ks.a.func,onChange:ks.a.func,onClear:ks.a.func,onEsc:ks.a.func,allowEmpty:ks.a.bool,defaultOpenValue:ks.a.object,currentSelectPanel:ks.a.string,focusOnOpen:ks.a.bool,onKeyDown:ks.a.func,clearIcon:ks.a.node},Pv.defaultProps={inputReadOnly:!1};var Hv=function(){var e=this;this.onInputChange=function(t){var n=t.target.value;e.setState({str:n});var r=e.props,o=r.format,i=r.hourOptions,a=r.minuteOptions,c=r.secondOptions,s=r.disabledHours,l=r.disabledMinutes,u=r.disabledSeconds,p=r.onChange,f=r.allowEmpty;if(n){var h=e.props.value,d=e.getProtoValue().clone(),v=Wf()(n,o,!0);if(!v.isValid())return void e.setState({invalid:!0});if(d.hour(v.hour()).minute(v.minute()).second(v.second()),i.indexOf(d.hour())<0||a.indexOf(d.minute())<0||c.indexOf(d.second())<0)return void e.setState({invalid:!0});var m=s(),y=l(d.hour()),g=u(d.hour(),d.minute());if(m&&m.indexOf(d.hour())>=0||y&&y.indexOf(d.minute())>=0||g&&g.indexOf(d.second())>=0)return void e.setState({invalid:!0});if(h){if(h.hour()!==d.hour()||h.minute()!==d.minute()||h.second()!==d.second()){var b=h.clone();b.hour(d.hour()),b.minute(d.minute()),b.second(d.second()),p(b)}}else h!==d&&p(d)}else{if(!f)return void e.setState({invalid:!0});p(null)}e.setState({invalid:!1})},this.onKeyDown=function(t){var n=e.props,r=n.onEsc,o=n.onKeyDown;27===t.keyCode&&r(),o(t)},this.onClear=function(){e.setState({str:""}),e.props.onClear()}},Lv=Pv,Dv=function e(t,n,r){var o=window.requestAnimationFrame||function(){return setTimeout(arguments[0],10)};if(r<=0)return void(t.scrollTop=n);var i=n-t.scrollTop,a=i/r*10;o(function(){t.scrollTop=t.scrollTop+a,t.scrollTop!==n&&e(t,n,r-10)})},Av=function(e){function t(){var e,n,r,o;fs()(this,t);for(var i=arguments.length,a=Array(i),c=0;c<i;c++)a[c]=arguments[c];return n=r=ms()(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(a))),r.state={active:!1},r.onSelect=function(e){var t=r.props;(0,t.onSelect)(t.type,e)},r.handleMouseEnter=function(e){r.setState({active:!0}),r.props.onMouseEnter(e)},r.handleMouseLeave=function(){r.setState({active:!1})},r.saveList=function(e){r.list=e},o=n,ms()(r,o)}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){this.scrollToSelected(0)}},{key:"componentDidUpdate",value:function(e){e.selectedIndex!==this.props.selectedIndex&&this.scrollToSelected(120)}},{key:"getOptions",value:function(){var e=this,t=this.props,n=t.options,r=t.selectedIndex,o=t.prefixCls;return n.map(function(t,n){var i,a=Ts()((i={},ss()(i,o+"-select-option-selected",r===n),ss()(i,o+"-select-option-disabled",t.disabled),i)),c=null;return t.disabled||(c=e.onSelect.bind(e,t.value)),Ss.a.createElement("li",{className:a,key:n,onClick:c,disabled:t.disabled},t.value)})}},{key:"scrollToSelected",value:function(e){var t=Ms.a.findDOMNode(this),n=Ms.a.findDOMNode(this.list);if(n){var r=this.props.selectedIndex;r<0&&(r=0);var o=n.children[r],i=o.offsetTop;Dv(t,i,e)}}},{key:"render",value:function(){var e;if(0===this.props.options.length)return null;var t=this.props.prefixCls,n=Ts()((e={},ss()(e,t+"-select",1),ss()(e,t+"-select-active",this.state.active),e));return Ss.a.createElement("div",{className:n,onMouseEnter:this.handleMouseEnter,onMouseLeave:this.handleMouseLeave},Ss.a.createElement("ul",{ref:this.saveList},this.getOptions()))}}]),t}(ws.Component);Av.propTypes={prefixCls:ks.a.string,options:ks.a.array,selectedIndex:ks.a.number,type:ks.a.string,onSelect:ks.a.func,onMouseEnter:ks.a.func};var Iv=Av,Rv=function(e,t){var n=""+e;e<10&&(n="0"+e);var r=!1;return t&&t.indexOf(e)>=0&&(r=!0),{value:n,disabled:r}},jv=function(e){function t(){var e,n,r,o;fs()(this,t);for(var i=arguments.length,a=Array(i),c=0;c<i;c++)a[c]=arguments[c];return n=r=ms()(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(a))),r.onItemChange=function(e,t){var n=r.props,o=n.onChange,i=n.defaultOpenValue,a=n.use12Hours,c=(r.props.value||i).clone();if("hour"===e)a?r.props.isAM?c.hour(+t%12):c.hour(+t%12+12):c.hour(+t);else if("minute"===e)c.minute(+t);else if("ampm"===e){var s=t.toUpperCase();a&&("PM"===s&&c.hour()<12&&c.hour(c.hour()%12+12),"AM"===s&&c.hour()>=12&&c.hour(c.hour()-12))}else c.second(+t);o(c)},r.onEnterSelectPanel=function(e){r.props.onCurrentSelectPanelChange(e)},o=n,ms()(r,o)}return gs()(t,e),ds()(t,[{key:"getHourSelect",value:function(e){var t=this.props,n=t.prefixCls,r=t.hourOptions,o=t.disabledHours,i=t.showHour,a=t.use12Hours;if(!i)return null;var c=o(),s=void 0,l=void 0;return a?(s=[12].concat(r.filter(function(e){return e<12&&e>0})),l=e%12||12):(s=r,l=e),Ss.a.createElement(Iv,{prefixCls:n,options:s.map(function(e){return Rv(e,c)}),selectedIndex:s.indexOf(l),type:"hour",onSelect:this.onItemChange,onMouseEnter:this.onEnterSelectPanel.bind(this,"hour")})}},{key:"getMinuteSelect",value:function(e){var t=this.props,n=t.prefixCls,r=t.minuteOptions,o=t.disabledMinutes,i=t.defaultOpenValue;if(!t.showMinute)return null;var a=this.props.value||i,c=o(a.hour());return Ss.a.createElement(Iv,{prefixCls:n,options:r.map(function(e){return Rv(e,c)}),selectedIndex:r.indexOf(e),type:"minute",onSelect:this.onItemChange,onMouseEnter:this.onEnterSelectPanel.bind(this,"minute")})}},{key:"getSecondSelect",value:function(e){var t=this.props,n=t.prefixCls,r=t.secondOptions,o=t.disabledSeconds,i=t.showSecond,a=t.defaultOpenValue;if(!i)return null;var c=this.props.value||a,s=o(c.hour(),c.minute());return Ss.a.createElement(Iv,{prefixCls:n,options:r.map(function(e){return Rv(e,s)}),selectedIndex:r.indexOf(e),type:"second",onSelect:this.onItemChange,onMouseEnter:this.onEnterSelectPanel.bind(this,"second")})}},{key:"getAMPMSelect",value:function(){var e=this.props,t=e.prefixCls,n=e.use12Hours,r=e.format;if(!n)return null;var o=["am","pm"].map(function(e){return r.match(/\sA/)?e.toUpperCase():e}).map(function(e){return{value:e}}),i=this.props.isAM?0:1;return Ss.a.createElement(Iv,{prefixCls:t,options:o,selectedIndex:i,type:"ampm",onSelect:this.onItemChange,onMouseEnter:this.onEnterSelectPanel.bind(this,"ampm")})}},{key:"render",value:function(){var e=this.props,t=e.prefixCls,n=e.defaultOpenValue,r=this.props.value||n;return Ss.a.createElement("div",{className:t+"-combobox"},this.getHourSelect(r.hour()),this.getMinuteSelect(r.minute()),this.getSecondSelect(r.second()),this.getAMPMSelect(r.hour()))}}]),t}(ws.Component);jv.propTypes={format:ks.a.string,defaultOpenValue:ks.a.object,prefixCls:ks.a.string,value:ks.a.object,onChange:ks.a.func,showHour:ks.a.bool,showMinute:ks.a.bool,showSecond:ks.a.bool,hourOptions:ks.a.array,minuteOptions:ks.a.array,secondOptions:ks.a.array,disabledHours:ks.a.func,disabledMinutes:ks.a.func,disabledSeconds:ks.a.func,onCurrentSelectPanelChange:ks.a.func,use12Hours:ks.a.bool,isAM:ks.a.bool};var Fv=jv,Kv=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.onChange=function(e){n.setState({value:e}),n.props.onChange(e)},n.onCurrentSelectPanelChange=function(e){n.setState({currentSelectPanel:e})},n.disabledHours=function(){var e=n.props,t=e.use12Hours,r=e.disabledHours,o=r();return t&&Array.isArray(o)&&(o=n.isAM()?o.filter(function(e){return e<12}).map(function(e){return 0===e?12:e}):o.map(function(e){return 12===e?12:e-12})),o},n.state={value:e.value,selectionRange:[]},n}return gs()(t,e),ds()(t,[{key:"componentWillReceiveProps",value:function(e){var t=e.value;t&&this.setState({value:t})}},{key:"close",value:function(){this.props.onEsc()}},{key:"isAM",value:function(){var e=this.state.value||this.props.defaultOpenValue;return e.hour()>=0&&e.hour()<12}},{key:"render",value:function(){var e,t=this.props,n=t.prefixCls,r=t.className,o=t.placeholder,i=t.disabledMinutes,a=t.disabledSeconds,c=t.hideDisabledOptions,s=t.allowEmpty,l=t.showHour,u=t.showMinute,p=t.showSecond,f=t.format,h=t.defaultOpenValue,d=t.clearText,v=t.onEsc,m=t.addon,y=t.use12Hours,g=t.onClear,b=t.focusOnOpen,C=t.onKeyDown,w=t.hourStep,S=t.minuteStep,x=t.secondStep,M=t.inputReadOnly,z=t.clearIcon,k=this.state,_=k.value,O=k.currentSelectPanel,E=this.disabledHours(),T=i(_?_.hour():null),N=a(_?_.hour():null,_?_.minute():null),V=_r(24,E,c,w),P=_r(60,T,c,S),H=_r(60,N,c,x);return Ss.a.createElement("div",{className:Ts()((e={},ss()(e,n+"-inner",!0),ss()(e,r,!!r),e))},Ss.a.createElement(Lv,{clearText:d,prefixCls:n,defaultOpenValue:h,value:_,currentSelectPanel:O,onEsc:v,format:f,placeholder:o,hourOptions:V,minuteOptions:P,secondOptions:H,disabledHours:this.disabledHours,disabledMinutes:i,disabledSeconds:a,onChange:this.onChange,onClear:g,allowEmpty:s,focusOnOpen:b,onKeyDown:C,inputReadOnly:M,clearIcon:z}),Ss.a.createElement(Fv,{prefixCls:n,value:_,defaultOpenValue:h,format:f,onChange:this.onChange,showHour:l,showMinute:u,showSecond:p,hourOptions:V,minuteOptions:P,secondOptions:H,disabledHours:this.disabledHours,disabledMinutes:i,disabledSeconds:a,onCurrentSelectPanelChange:this.onCurrentSelectPanelChange,use12Hours:y,isAM:this.isAM()}),m(this))}}]),t}(ws.Component);Kv.propTypes={clearText:ks.a.string,prefixCls:ks.a.string,className:ks.a.string,defaultOpenValue:ks.a.object,value:ks.a.object,placeholder:ks.a.string,format:ks.a.string,inputReadOnly:ks.a.bool,disabledHours:ks.a.func,disabledMinutes:ks.a.func,disabledSeconds:ks.a.func,hideDisabledOptions:ks.a.bool,onChange:ks.a.func,onEsc:ks.a.func,allowEmpty:ks.a.bool,showHour:ks.a.bool,showMinute:ks.a.bool,showSecond:ks.a.bool,onClear:ks.a.func,use12Hours:ks.a.bool,hourStep:ks.a.number,minuteStep:ks.a.number,secondStep:ks.a.number,addon:ks.a.func,focusOnOpen:ks.a.bool,onKeyDown:ks.a.func,clearIcon:ks.a.node},Kv.defaultProps={prefixCls:"rc-time-picker-panel",onChange:kr,onClear:kr,disabledHours:kr,disabledMinutes:kr,disabledSeconds:kr,defaultOpenValue:Wf()(),use12Hours:!1,addon:kr,onKeyDown:kr,inputReadOnly:!1};var Bv=Kv,Wv={adjustX:1,adjustY:1},Uv=[0,0],qv={bottomLeft:{points:["tl","tl"],overflow:Wv,offset:[0,-3],targetOffset:Uv},bottomRight:{points:["tr","tr"],overflow:Wv,offset:[0,-3],targetOffset:Uv},topRight:{points:["br","br"],overflow:Wv,offset:[0,3],targetOffset:Uv},topLeft:{points:["bl","bl"],overflow:Wv,offset:[0,3],targetOffset:Uv}},Yv=qv,Gv=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));Xv.call(n),n.saveInputRef=Er.bind(n,"picker"),n.savePanelRef=Er.bind(n,"panelInstance");var r=e.defaultOpen,o=e.defaultValue,i=e.open,a=void 0===i?r:i,c=e.value,s=void 0===c?o:c;return n.state={open:a,value:s},n}return gs()(t,e),ds()(t,[{key:"componentWillReceiveProps",value:function(e){var t=e.value,n=e.open;"value"in e&&this.setState({value:t}),void 0!==n&&this.setState({open:n})}},{key:"setValue",value:function(e){"value"in this.props||this.setState({value:e}),this.props.onChange(e)}},{key:"getFormat",value:function(){var e=this.props,t=e.format,n=e.showHour,r=e.showMinute,o=e.showSecond,i=e.use12Hours;if(t)return t;if(i){return[n?"h":"",r?"mm":"",o?"ss":""].filter(function(e){return!!e}).join(":").concat(" a")}return[n?"HH":"",r?"mm":"",o?"ss":""].filter(function(e){return!!e}).join(":")}},{key:"getPanelElement",value:function(){var e=this.props,t=e.prefixCls,n=e.placeholder,r=e.disabledHours,o=e.disabledMinutes,i=e.disabledSeconds,a=e.hideDisabledOptions,c=e.inputReadOnly,s=e.allowEmpty,l=e.showHour,u=e.showMinute,p=e.showSecond,f=e.defaultOpenValue,h=e.clearText,d=e.addon,v=e.use12Hours,m=e.focusOnOpen,y=e.onKeyDown,g=e.hourStep,b=e.minuteStep,C=e.secondStep,w=e.clearIcon;return Ss.a.createElement(Bv,{clearText:h,prefixCls:t+"-panel",ref:this.savePanelRef,value:this.state.value,inputReadOnly:c,onChange:this.onPanelChange,onClear:this.onPanelClear,defaultOpenValue:f,showHour:l,showMinute:u,showSecond:p,onEsc:this.onEsc,allowEmpty:s,format:this.getFormat(),placeholder:n,disabledHours:r,disabledMinutes:o,disabledSeconds:i,hideDisabledOptions:a,use12Hours:v,hourStep:g,minuteStep:b,secondStep:C,addon:d,focusOnOpen:m,onKeyDown:y,clearIcon:w})}},{key:"getPopupClassName",value:function(){var e=this.props,t=e.showHour,n=e.showMinute,r=e.showSecond,o=e.use12Hours,i=e.prefixCls,a=this.props.popupClassName;t&&n&&r||o||(a+=" "+i+"-panel-narrow");var c=0;return t&&(c+=1),n&&(c+=1),r&&(c+=1),o&&(c+=1),a+=" "+i+"-panel-column-"+c}},{key:"setOpen",value:function(e){var t=this.props,n=t.onOpen,r=t.onClose;this.state.open!==e&&("open"in this.props||this.setState({open:e}),e?n({open:e}):r({open:e}))}},{key:"focus",value:function(){this.picker.focus()}},{key:"blur",value:function(){this.picker.blur()}},{key:"render",value:function(){var e=this.props,t=e.prefixCls,n=e.placeholder,r=e.placement,o=e.align,i=e.id,a=e.disabled,c=e.transitionName,s=e.style,l=e.className,u=e.getPopupContainer,p=e.name,f=e.autoComplete,h=e.onFocus,d=e.onBlur,v=e.autoFocus,m=e.inputReadOnly,y=e.inputIcon,g=this.state,b=g.open,C=g.value,w=this.getPopupClassName();return Ss.a.createElement(_u,{prefixCls:t+"-panel",popupClassName:w,popup:this.getPanelElement(),popupAlign:o,builtinPlacements:Yv,popupPlacement:r,action:a?[]:["click"],destroyPopupOnHide:!0,getPopupContainer:u,popupTransitionName:c,popupVisible:b,onPopupVisibleChange:this.onVisibleChange},Ss.a.createElement("span",{className:t+" "+l,style:s},Ss.a.createElement("input",{className:t+"-input",ref:this.saveInputRef,type:"text",placeholder:n,name:p,onKeyDown:this.onKeyDown,disabled:a,value:C&&C.format(this.getFormat())||"",autoComplete:f,onFocus:h,onBlur:d,autoFocus:v,onChange:Or,readOnly:!!m,id:i}),y||Ss.a.createElement("span",{className:t+"-icon"})))}}]),t}(ws.Component);Gv.propTypes={prefixCls:ks.a.string,clearText:ks.a.string,value:ks.a.object,defaultOpenValue:ks.a.object,inputReadOnly:ks.a.bool,disabled:ks.a.bool,allowEmpty:ks.a.bool,defaultValue:ks.a.object,open:ks.a.bool,defaultOpen:ks.a.bool,align:ks.a.object,placement:ks.a.any,transitionName:ks.a.string,getPopupContainer:ks.a.func,placeholder:ks.a.string,format:ks.a.string,showHour:ks.a.bool,showMinute:ks.a.bool,showSecond:ks.a.bool,style:ks.a.object,className:ks.a.string,popupClassName:ks.a.string,disabledHours:ks.a.func,disabledMinutes:ks.a.func,disabledSeconds:ks.a.func,hideDisabledOptions:ks.a.bool,onChange:ks.a.func,onOpen:ks.a.func,onClose:ks.a.func,onFocus:ks.a.func,onBlur:ks.a.func,addon:ks.a.func,name:ks.a.string,autoComplete:ks.a.string,use12Hours:ks.a.bool,hourStep:ks.a.number,minuteStep:ks.a.number,secondStep:ks.a.number,focusOnOpen:ks.a.bool,onKeyDown:ks.a.func,autoFocus:ks.a.bool,id:ks.a.string,inputIcon:ks.a.node,clearIcon:ks.a.node},Gv.defaultProps={clearText:"clear",prefixCls:"rc-time-picker",defaultOpen:!1,inputReadOnly:!1,style:{},className:"",popupClassName:"",id:"",align:{},defaultOpenValue:Wf()(),allowEmpty:!0,showHour:!0,showMinute:!0,showSecond:!0,disabledHours:Or,disabledMinutes:Or,disabledSeconds:Or,hideDisabledOptions:!1,placement:"bottomLeft",onChange:Or,onOpen:Or,onClose:Or,onFocus:Or,onBlur:Or,addon:Or,use12Hours:!1,focusOnOpen:!1,onKeyDown:Or};var Xv=function(){var e=this;this.onPanelChange=function(t){e.setValue(t)},this.onPanelClear=function(){e.setValue(null),e.setOpen(!1)},this.onVisibleChange=function(t){e.setOpen(t)},this.onEsc=function(){e.setOpen(!1),e.focus()},this.onKeyDown=function(t){40===t.keyCode&&e.setOpen(!0)}},$v=Gv,Jv=n(92),Zv=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));n.handleChange=function(e){"value"in n.props||n.setState({value:e});var t=n.props,r=t.onChange,o=t.format,i=void 0===o?"HH:mm:ss":o;r&&r(e,e&&e.format(i)||"")},n.handleOpenClose=function(e){var t=e.open,r=n.props.onOpenChange;r&&r(t)},n.saveTimePicker=function(e){n.timePickerRef=e},n.renderTimePicker=function(e){var t=us()({},n.props);delete t.defaultValue;var r=n.getDefaultFormat(),o=Ts()(t.className,ss()({},t.prefixCls+"-"+t.size,!!t.size)),i=function(e){return t.addon?ws.createElement("div",{className:t.prefixCls+"-panel-addon"},t.addon(e)):null},a=ws.createElement("span",{className:t.prefixCls+"-icon"},ws.createElement(Kp,{type:"clock-circle",className:t.prefixCls+"-clock-icon",theme:"outlined"})),c=ws.createElement(Kp,{type:"close-circle",className:t.prefixCls+"-panel-clear-btn-icon",theme:"filled"});return ws.createElement($v,us()({},Tr(r),t,{ref:n.saveTimePicker,format:r,className:o,value:n.state.value,placeholder:void 0===t.placeholder?e.placeholder:t.placeholder,onChange:n.handleChange,onOpen:n.handleOpenClose,onClose:n.handleOpenClose,addon:i,inputIcon:a,clearIcon:c}))};var r=e.value||e.defaultValue;if(r&&!cn(Bf).isMoment(r))throw new Error("The value/defaultValue of TimePicker must be a moment object after `antd@2.0`, see: https://u.ant.design/time-picker-value");return n.state={value:r},n}return gs()(t,e),ds()(t,[{key:"focus",value:function(){this.timePickerRef.focus()}},{key:"blur",value:function(){this.timePickerRef.blur()}},{key:"getDefaultFormat",value:function(){var e=this.props,t=e.format,n=e.use12Hours;return t||(n?"h:mm:ss a":"HH:mm:ss")}},{key:"render",value:function(){return ws.createElement(xp,{componentName:"TimePicker",defaultLocale:Jv.a},this.renderTimePicker)}}],[{key:"getDerivedStateFromProps",value:function(e){return"value"in e?{value:e.value}:null}}]),t}(ws.Component);Zv.defaultProps={prefixCls:"ant-time-picker",align:{offset:[0,-2]},disabled:!1,disabledHours:void 0,disabledMinutes:void 0,disabledSeconds:void 0,hideDisabledOptions:!1,placement:"bottomLeft",transitionName:"slide-up",focusOnOpen:!0},Object(Ys.polyfill)(Zv);var Qv=Zv,em=n(111),tm=qf()({displayName:"CalendarPart",propTypes:{prefixCls:ks.a.string,value:ks.a.any,hoverValue:ks.a.any,selectedValue:ks.a.any,direction:ks.a.any,locale:ks.a.any,showDateInput:ks.a.bool,showTimePicker:ks.a.bool,format:ks.a.any,placeholder:ks.a.any,disabledDate:ks.a.any,timePicker:ks.a.any,disabledTime:ks.a.any,onInputSelect:ks.a.func,timePickerDisabledTime:ks.a.object,enableNext:ks.a.any,enablePrev:ks.a.any,clearIcon:ks.a.node},render:function(){var e=this.props,t=e.prefixCls,n=e.value,r=e.hoverValue,o=e.selectedValue,i=e.mode,a=e.direction,c=e.locale,s=e.format,l=e.placeholder,u=e.disabledDate,p=e.timePicker,f=e.disabledTime,h=e.timePickerDisabledTime,d=e.showTimePicker,v=e.onInputSelect,m=e.enablePrev,y=e.enableNext,g=e.clearIcon,b=d&&p,C=b&&f?Ut(o,f):null,w=t+"-range",S={locale:c,value:n,prefixCls:t,showTimePicker:d},x="left"===a?0:1,M=b&&Ss.a.cloneElement(p,us()({showHour:!0,showMinute:!0,showSecond:!0},p.props,C,h,{onChange:v,defaultOpenValue:n,value:o[x]})),z=e.showDateInput&&Ss.a.createElement(wv,{format:s,locale:c,prefixCls:t,timePicker:p,disabledDate:u,placeholder:l,disabledTime:f,value:n,showClear:!1,selectedValue:o[x],onChange:v,clearIcon:g});return Ss.a.createElement("div",{className:w+"-part "+w+"-"+a},z,Ss.a.createElement("div",{style:{outline:"none"}},Ss.a.createElement(yv,us()({},S,{mode:i,enableNext:y,enablePrev:m,onValueChange:e.onValueChange,onPanelChange:e.onPanelChange,disabledMonth:e.disabledMonth})),d?Ss.a.createElement("div",{className:t+"-time-picker"},Ss.a.createElement("div",{className:t+"-time-picker-panel"},M)):null,Ss.a.createElement("div",{className:t+"-body"},Ss.a.createElement(eh,us()({},S,{hoverValue:r,selectedValue:o,dateRender:e.dateRender,onSelect:e.onSelect,onDayHover:e.onDayHover,disabledDate:u,showWeekNumber:e.showWeekNumber})))))}}),nm=tm,rm=qf()({displayName:"RangeCalendar",propTypes:{prefixCls:ks.a.string,dateInputPlaceholder:ks.a.any,defaultValue:ks.a.any,value:ks.a.any,hoverValue:ks.a.any,mode:ks.a.arrayOf(ks.a.oneOf(["date","month","year","decade"])),showDateInput:ks.a.bool,timePicker:ks.a.any,showOk:ks.a.bool,showToday:ks.a.bool,defaultSelectedValue:ks.a.array,selectedValue:ks.a.array,onOk:ks.a.func,showClear:ks.a.bool,locale:ks.a.object,onChange:ks.a.func,onSelect:ks.a.func,onValueChange:ks.a.func,onHoverChange:ks.a.func,onPanelChange:ks.a.func,format:ks.a.oneOfType([ks.a.object,ks.a.string]),onClear:ks.a.func,type:ks.a.any,disabledDate:ks.a.func,disabledTime:ks.a.func,clearIcon:ks.a.node},mixins:[ah],getDefaultProps:function(){return{type:"both",defaultSelectedValue:[],onValueChange:Pr,onHoverChange:Pr,onPanelChange:Pr,disabledTime:Pr,onInputSelect:Pr,showToday:!0,showDateInput:!0}},getInitialState:function(){var e=this.props,t=e.selectedValue||e.defaultSelectedValue,n=Ar(e,1);return{selectedValue:t,prevSelectedValue:t,firstSelectedValue:null,hoverValue:e.hoverValue||[],value:n,showTimePicker:!1,mode:e.mode||["date","date"]}},componentWillReceiveProps:function(e){var t=this.state,n={};"value"in e&&(n.value=Ar(e,0),this.setState(n)),"hoverValue"in e&&!Lr(t.hoverValue,e.hoverValue)&&this.setState({hoverValue:e.hoverValue}),"selectedValue"in e&&(n.selectedValue=e.selectedValue,n.prevSelectedValue=e.selectedValue,this.setState(n)),"mode"in e&&!Lr(t.mode,e.mode)&&this.setState({mode:e.mode})},onDatePanelEnter:function(){this.hasSelectedValue()&&this.fireHoverValueChange(this.state.selectedValue.concat())},onDatePanelLeave:function(){this.hasSelectedValue()&&this.fireHoverValueChange([])},onSelect:function(e){var t=this.props.type,n=this.state,r=n.selectedValue,o=n.prevSelectedValue,i=n.firstSelectedValue,a=void 0;if("both"===t)i?this.compare(i,e)<0?(Wt(o[1],e),a=[i,e]):(Wt(o[0],e),Wt(o[1],i),a=[e,i]):(Wt(o[0],e),a=[e]);else if("start"===t){Wt(o[0],e);var c=r[1];a=c&&this.compare(c,e)>0?[e,c]:[e]}else{var s=r[0];s&&this.compare(s,e)<=0?(Wt(o[1],e),a=[s,e]):(Wt(o[0],e),a=[e])}this.fireSelectValueChange(a)},onKeyDown:function(e){var t=this;if("input"!==e.target.nodeName.toLowerCase()){var n=e.keyCode,r=e.ctrlKey||e.metaKey,o=this.state,i=o.selectedValue,a=o.hoverValue,c=o.firstSelectedValue,s=o.value,l=this.props,u=l.onKeyDown,p=l.disabledDate,f=function(n){var r=void 0,o=void 0,l=void 0;if(c?1===a.length?(r=a[0].clone(),o=n(r),l=t.onDayHover(o)):(r=a[0].isSame(c,"day")?a[1]:a[0],o=n(r),l=t.onDayHover(o)):(r=a[0]||i[0]||s[0]||Wf()(),o=n(r),l=[o],t.fireHoverValueChange(l)),l.length>=2){if(l.some(function(e){return!wr(s,e,"month")})){var u=l.slice().sort(function(e,t){return e.valueOf()-t.valueOf()});u[0].isSame(u[1],"month")&&(u[1]=u[0].clone().add(1,"month")),t.fireValueChange(u)}}else if(1===l.length){var p=s.findIndex(function(e){return e.isSame(r,"month")});if(-1===p&&(p=0),s.every(function(e){return!e.isSame(o,"month")})){var f=s.slice();f[p]=o.clone(),t.fireValueChange(f)}}return e.preventDefault(),o};switch(n){case Xs.DOWN:return void f(function(e){return Cr(e,1,"weeks")});case Xs.UP:return void f(function(e){return Cr(e,-1,"weeks")});case Xs.LEFT:return void f(r?function(e){return Cr(e,-1,"years")}:function(e){return Cr(e,-1,"days")});case Xs.RIGHT:return void f(r?function(e){return Cr(e,1,"years")}:function(e){return Cr(e,1,"days")});case Xs.HOME:return void f(function(e){return gr(e)});case Xs.END:return void f(function(e){return br(e)});case Xs.PAGE_DOWN:return void f(function(e){return Cr(e,1,"month")});case Xs.PAGE_UP:return void f(function(e){return Cr(e,-1,"month")});case Xs.ENTER:var h=void 0;return h=0===a.length?f(function(e){return e}):1===a.length?a[0]:a[0].isSame(c,"day")?a[1]:a[0],!h||p&&p(h)||this.onSelect(h),void e.preventDefault();default:u&&u(e)}}},onDayHover:function(e){var t=[],n=this.state,r=n.selectedValue,o=n.firstSelectedValue,i=this.props.type;if("start"===i&&r[1])t=this.compare(e,r[1])<0?[e,r[1]]:[e];else if("end"===i&&r[0])t=this.compare(e,r[0])>0?[r[0],e]:[];else{if(!o)return this.state.hoverValue.length&&this.setState({hoverValue:[]}),t;t=this.compare(e,o)<0?[e,o]:[o,e]}return this.fireHoverValueChange(t),t},onToday:function(){var e=jt(this.state.value[0]),t=e.clone().add(1,"months");this.setState({value:[e,t]})},onOpenTimePicker:function(){this.setState({showTimePicker:!0})},onCloseTimePicker:function(){this.setState({showTimePicker:!1})},onOk:function(){var e=this.state.selectedValue;this.isAllowedDateAndTime(e)&&this.props.onOk(this.state.selectedValue)},onStartInputSelect:function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];var r=["left"].concat(t);return Rr.apply(this,r)},onEndInputSelect:function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];var r=["right"].concat(t);return Rr.apply(this,r)},onStartValueChange:function(e){var t=[].concat(this.state.value);return t[0]=e,this.fireValueChange(t)},onEndValueChange:function(e){var t=[].concat(this.state.value);return t[1]=e,this.fireValueChange(t)},onStartPanelChange:function(e,t){var n=this.props,r=this.state,o=[t,r.mode[1]];"mode"in n||this.setState({mode:o});var i=[e||r.value[0],r.value[1]];n.onPanelChange(i,o)},onEndPanelChange:function(e,t){var n=this.props,r=this.state,o=[r.mode[0],t];"mode"in n||this.setState({mode:o});var i=[r.value[0],e||r.value[1]];n.onPanelChange(i,o)},getStartValue:function(){var e=this.state.value[0],t=this.state.selectedValue;return t[0]&&this.props.timePicker&&(e=e.clone(),Wt(t[0],e)),this.state.showTimePicker&&t[0]?t[0]:e},getEndValue:function(){var e=this.state,t=e.value,n=e.selectedValue,r=e.showTimePicker,o=t[1]?t[1].clone():t[0].clone().add(1,"month");return n[1]&&this.props.timePicker&&Wt(n[1],o),r?n[1]?n[1]:this.getStartValue():o},getEndDisableTime:function(){var e=this.state,t=e.selectedValue,n=e.value,r=this.props.disabledTime,o=r(t,"end")||{},i=t&&t[0]||n[0].clone();if(!t[1]||i.isSame(t[1],"day")){var a=i.hour(),c=i.minute(),s=i.second(),l=o.disabledHours,u=o.disabledMinutes,p=o.disabledSeconds,f=u?u():[],h=p?p():[];return l=Ir(a,l),u=Ir(c,u),p=Ir(s,p),{disabledHours:function(){return l},disabledMinutes:function(e){return e===a?u:f},disabledSeconds:function(e,t){return e===a&&t===c?p:h}}}return o},isAllowedDateAndTime:function(e){return Gt(e[0],this.props.disabledDate,this.disabledStartTime)&&Gt(e[1],this.props.disabledDate,this.disabledEndTime)},isMonthYearPanelShow:function(e){return["month","year","decade"].indexOf(e)>-1},hasSelectedValue:function(){var e=this.state.selectedValue;return!!e[1]&&!!e[0]},compare:function(e,t){return this.props.timePicker?e.diff(t):e.diff(t,"days")},fireSelectValueChange:function(e,t){var n=this.props.timePicker,r=this.state.prevSelectedValue;if(n&&n.props.defaultValue){var o=n.props.defaultValue;!r[0]&&e[0]&&Wt(o[0],e[0]),!r[1]&&e[1]&&Wt(o[1],e[1])}if("selectedValue"in this.props||this.setState({selectedValue:e}),!this.state.selectedValue[0]||!this.state.selectedValue[1]){var i=e[0]||Wf()(),a=e[1]||i.clone().add(1,"months");this.setState({selectedValue:e,value:Dr([i,a])})}e[0]&&!e[1]&&(this.setState({firstSelectedValue:e[0]}),this.fireHoverValueChange(e.concat())),this.props.onChange(e),(t||e[0]&&e[1])&&(this.setState({prevSelectedValue:e,firstSelectedValue:null}),this.fireHoverValueChange([]),this.props.onSelect(e))},fireValueChange:function(e){var t=this.props;"value"in t||this.setState({value:e}),t.onValueChange(e)},fireHoverValueChange:function(e){var t=this.props;"hoverValue"in t||this.setState({hoverValue:e}),t.onHoverChange(e)},clear:function(){this.fireSelectValueChange([],!0),this.props.onClear()},disabledStartTime:function(e){return this.props.disabledTime(e,"start")},disabledEndTime:function(e){return this.props.disabledTime(e,"end")},disabledStartMonth:function(e){var t=this.state.value;return e.isSameOrAfter(t[1],"month")},disabledEndMonth:function(e){var t=this.state.value;return e.isSameOrBefore(t[0],"month")},render:function(){var e,t,n=this.props,r=this.state,o=n.prefixCls,i=n.dateInputPlaceholder,a=n.timePicker,c=n.showOk,s=n.locale,l=n.showClear,u=n.showToday,p=n.type,f=n.clearIcon,h=r.hoverValue,d=r.selectedValue,v=r.mode,m=r.showTimePicker,y=(e={},e[n.className]=!!n.className,e[o]=1,e[o+"-hidden"]=!n.visible,e[o+"-range"]=1,e[o+"-show-time-picker"]=m,e[o+"-week-number"]=n.showWeekNumber,e),g=Ts()(y),b={selectedValue:r.selectedValue,onSelect:this.onSelect,onDayHover:"start"===p&&d[1]||"end"===p&&d[0]||h.length?this.onDayHover:void 0},C=void 0,w=void 0;i&&(Array.isArray(i)?(C=i[0],w=i[1]):C=w=i);var S=!0===c||!1!==c&&!!a,x=Ts()((t={},t[o+"-footer"]=!0,t[o+"-range-bottom"]=!0,t[o+"-footer-show-ok"]=S,t)),M=this.getStartValue(),z=this.getEndValue(),k=jt(M),_=k.month(),O=k.year(),E=M.year()===O&&M.month()===_||z.year()===O&&z.month()===_,T=M.clone().add(1,"months"),N=T.year()===z.year()&&T.month()===z.month(),V=n.renderFooter();return Ss.a.createElement("div",{ref:this.saveRoot,className:g,style:n.style,tabIndex:"0",onKeyDown:this.onKeyDown},n.renderSidebar(),Ss.a.createElement("div",{className:o+"-panel"},l&&d[0]&&d[1]?Ss.a.createElement("a",{role:"button",title:s.clear,onClick:this.clear},f||Ss.a.createElement("span",{className:o+"-clear-btn"})):null,Ss.a.createElement("div",{className:o+"-date-panel",onMouseLeave:"both"!==p?this.onDatePanelLeave:void 0,onMouseEnter:"both"!==p?this.onDatePanelEnter:void 0},Ss.a.createElement(nm,us()({},n,b,{hoverValue:h,direction:"left",disabledTime:this.disabledStartTime,disabledMonth:this.disabledStartMonth,format:this.getFormat(),value:M,mode:v[0],placeholder:C,onInputSelect:this.onStartInputSelect,onValueChange:this.onStartValueChange,onPanelChange:this.onStartPanelChange,showDateInput:this.props.showDateInput,timePicker:a,showTimePicker:m,enablePrev:!0,enableNext:!N||this.isMonthYearPanelShow(v[1]),clearIcon:f})),Ss.a.createElement("span",{className:o+"-range-middle"},"~"),Ss.a.createElement(nm,us()({},n,b,{hoverValue:h,direction:"right",format:this.getFormat(),timePickerDisabledTime:this.getEndDisableTime(),placeholder:w,value:z,mode:v[1],onInputSelect:this.onEndInputSelect,onValueChange:this.onEndValueChange,onPanelChange:this.onEndPanelChange,showDateInput:this.props.showDateInput,timePicker:a,showTimePicker:m,disabledTime:this.disabledEndTime,disabledMonth:this.disabledEndMonth,enablePrev:!N||this.isMonthYearPanelShow(v[0]),enableNext:!0,clearIcon:f}))),Ss.a.createElement("div",{className:x},u||n.timePicker||S||V?Ss.a.createElement("div",{className:o+"-footer-btn"},V,u?Ss.a.createElement(vr,us()({},n,{disabled:E,value:r.value[0],onToday:this.onToday,text:s.backToToday})):null,n.timePicker?Ss.a.createElement(yr,us()({},n,{showTimePicker:m,onOpenTimePicker:this.onOpenTimePicker,onCloseTimePicker:this.onCloseTimePicker,timePickerDisabled:!this.hasSelectedValue()||h.length})):null,S?Ss.a.createElement(mr,us()({},n,{onOk:this.onOk,okDisabled:!this.isAllowedDateAndTime(d)||!this.hasSelectedValue()||h.length})):null):null)))}}),om=rm,im=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},am=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.handleClick=function(){var t=e.props,n=t.checked,r=t.onChange;r&&r(!n)},e}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e,t=this.props,n=t.prefixCls,r=void 0===n?"ant-tag":n,o=t.className,i=t.checked,a=im(t,["prefixCls","className","checked"]),c=Ts()(r,(e={},ss()(e,r+"-checkable",!0),ss()(e,r+"-checkable-checked",i),e),o);return delete a.onChange,ws.createElement("div",us()({},a,{className:c,onClick:this.handleClick}))}}]),t}(ws.Component),cm=am,sm=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},lm=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.state={closing:!1,closed:!1,visible:!0,mounted:!1},e.handleIconClick=function(t){var n=e.props.onClose;n&&n(t),t.defaultPrevented||"visible"in e.props||e.setState({visible:!1})},e.close=function(){if(!e.state.closing&&!e.state.closed){var t=xs.findDOMNode(e);t.style.width=t.getBoundingClientRect().width+"px",t.style.width=t.getBoundingClientRect().width+"px",e.setState({closing:!0})}},e.show=function(){e.setState({closed:!1})},e.animationEnd=function(t,n){if(n||e.state.closed)e.setState({closed:!1});else{e.setState({closed:!0,closing:!1});var r=e.props.afterClose;r&&r()}},e}return gs()(t,e),ds()(t,[{key:"componentDidUpdate",value:function(e,t){t.visible&&!this.state.visible?this.close():!t.visible&&this.state.visible&&this.show()}},{key:"isPresetColor",value:function(e){return!!e&&/^(pink|red|yellow|orange|cyan|green|blue|purple|geekblue|magenta|volcano|gold|lime)(-inverse)?$/.test(e)}},{key:"render",value:function(){var e,t=this.props,n=t.prefixCls,r=t.closable,o=t.color,i=t.className,a=t.children,c=t.style,s=sm(t,["prefixCls","closable","color","className","children","style"]),l=r?ws.createElement(Kp,{type:"close",onClick:this.handleIconClick}):"",u=this.isPresetColor(o),p=Ts()(n,(e={},ss()(e,n+"-"+o,u),ss()(e,n+"-has-color",o&&!u),ss()(e,n+"-close",this.state.closing),e),i),f=Ps(s,["onClose","afterClose","visible"]),h=us()({backgroundColor:o&&!u?o:null},c),d=this.state.closed?ws.createElement("span",null):ws.createElement("div",us()({"data-show":!this.state.closing},f,{className:p,style:h}),a,l);return ws.createElement(Jp.a,null,ws.createElement(Ml,{component:"",showProp:"data-show",transitionName:n+"-zoom",transitionAppear:!0,onEnd:this.animationEnd},d))}}],[{key:"getDerivedStateFromProps",value:function(e,t){if("visible"in e){var n={visible:e.visible,mounted:!0};return t.mounted||(n=us()({},n,{closed:!e.visible})),n}return null}}]),t}(ws.Component);lm.CheckableTag=cm,lm.defaultProps={prefixCls:"ant-tag",closable:!1},Object(Ys.polyfill)(lm);var um=lm,pm=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));n.clearSelection=function(e){e.preventDefault(),e.stopPropagation(),n.setState({value:[]}),n.handleChange([])},n.clearHoverValue=function(){return n.setState({hoverValue:[]})},n.handleChange=function(e){var t=n.props;"value"in t||n.setState(function(t){var n=t.showDate;return{value:e,showDate:jr(e)||n}}),t.onChange(e,[Fr(e[0],t.format),Fr(e[1],t.format)])},n.handleOpenChange=function(e){"open"in n.props||n.setState({open:e}),!1===e&&n.clearHoverValue();var t=n.props.onOpenChange;t&&t(e)},n.handleShowDateChange=function(e){return n.setState({showDate:e})},n.handleHoverChange=function(e){return n.setState({hoverValue:e})},n.handleRangeMouseLeave=function(){n.state.open&&n.clearHoverValue()},n.handleCalendarInputSelect=function(e){e[0]&&n.setState(function(t){var n=t.showDate;return{value:e,showDate:jr(e)||n}})},n.handleRangeClick=function(e){"function"==typeof e&&(e=e()),n.setValue(e,!0);var t=n.props,r=t.onOk,o=t.onOpenChange;r&&r(e),o&&o(!1)},n.savePicker=function(e){n.picker=e},n.renderFooter=function(){var e=n.props,t=e.prefixCls,r=e.ranges,o=e.renderExtraFooter,i=e.tagPrefixCls;if(!r&&!o)return null;var a=o?ws.createElement("div",{className:t+"-footer-extra",key:"extra"},o.apply(void 0,arguments)):null,c=Object.keys(r||{}).map(function(e){var t=r[e];return ws.createElement(um,{key:e,prefixCls:i,color:"blue",onClick:function(){return n.handleRangeClick(t)},onMouseEnter:function(){return n.setState({hoverValue:t})},onMouseLeave:n.handleRangeMouseLeave},e)});return[c&&c.length>0?ws.createElement("div",{className:t+"-footer-extra "+t+"-range-quick-selector",key:"range"},c):null,a]};var r=e.value||e.defaultValue||[];if(r[0]&&!cn(Bf).isMoment(r[0])||r[1]&&!cn(Bf).isMoment(r[1]))throw new Error("The value/defaultValue of RangePicker must be a moment object array after `antd@2.0`, see: https://u.ant.design/date-picker-value");var o=!r||Br(r)?e.defaultPickerValue:r;return n.state={value:r,showDate:Kr(o||cn(Bf)()),open:e.open,hoverValue:[]},n}return gs()(t,e),ds()(t,[{key:"setValue",value:function(e,t){this.handleChange(e),!t&&this.props.showTime||"open"in this.props||this.setState({open:!1})}},{key:"focus",value:function(){this.picker.focus()}},{key:"blur",value:function(){this.picker.blur()}},{key:"render",value:function(){var e,t=this,n=this.state,r=this.props,o=n.value,i=n.showDate,a=n.hoverValue,c=n.open,s=r.prefixCls,l=r.popupStyle,u=r.style,p=r.disabledDate,f=r.disabledTime,h=r.showTime,d=r.showToday,v=r.ranges,m=r.onOk,y=r.locale,g=r.localeCode,b=r.format,C=r.dateRender,w=r.onCalendarChange;Wr(o,g),Wr(i,g),Pp(!("onOK"in r),"It should be `RangePicker[onOk]`, instead of `onOK`!");var S=Ts()((e={},ss()(e,s+"-time",h),ss()(e,s+"-range-with-ranges",v),e)),x={onChange:this.handleChange},M={onOk:this.handleChange};r.timePicker?x.onChange=function(e){return t.handleChange(e)}:M={},"mode"in r&&(M.mode=r.mode);var z="placeholder"in r?r.placeholder[0]:y.lang.rangePlaceholder[0],k="placeholder"in r?r.placeholder[1]:y.lang.rangePlaceholder[1],_=ws.createElement(om,us()({},M,{onChange:w,format:b,prefixCls:s,className:S,renderFooter:this.renderFooter,timePicker:r.timePicker,disabledDate:p,disabledTime:f,dateInputPlaceholder:[z,k],locale:y.lang,onOk:m,dateRender:C,value:i,onValueChange:this.handleShowDateChange,hoverValue:a,onHoverChange:this.handleHoverChange,onPanelChange:r.onPanelChange,showToday:d,onInputSelect:this.handleCalendarInputSelect})),O={};r.showTime&&(O.width=u&&u.width||350);var E=!r.disabled&&r.allowClear&&o&&(o[0]||o[1])?ws.createElement(Kp,{type:"close-circle",className:s+"-picker-clear",onClick:this.clearSelection,theme:"filled"}):null,T=function(e){var t=e.value,n=t[0],o=t[1];return ws.createElement("span",{className:r.pickerInputClass},ws.createElement("input",{disabled:r.disabled,readOnly:!0,value:n&&n.format(r.format)||"",placeholder:z,className:s+"-range-picker-input",tabIndex:-1}),ws.createElement("span",{className:s+"-range-picker-separator"}," ~ "),ws.createElement("input",{disabled:r.disabled,readOnly:!0,value:o&&o.format(r.format)||"",placeholder:k,className:s+"-range-picker-input",tabIndex:-1}),E,ws.createElement(Kp,{type:"calendar",className:s+"-picker-icon"}))};return ws.createElement("span",{ref:this.savePicker,id:r.id,className:Ts()(r.className,r.pickerClass),style:us()({},u,O),tabIndex:r.disabled?-1:0,onFocus:r.onFocus,onBlur:r.onBlur,onMouseEnter:r.onMouseEnter,onMouseLeave:r.onMouseLeave},ws.createElement(Vv,us()({},r,x,{calendar:_,value:o,open:c,onOpenChange:this.handleOpenChange,prefixCls:s+"-picker-container",style:l}),T))}}],[{key:"getDerivedStateFromProps",value:function(e,t){var n=null;if("value"in e){var r=e.value||[];n={value:r},Vs()(e.value,t.value)||(n=us()({},n,{showDate:jr(r)||t.showDate}))}return"open"in e&&t.open!==e.open&&(n=us()({},n,{open:e.open})),n}}]),t}(ws.Component);pm.defaultProps={prefixCls:"ant-calendar",tagPrefixCls:"ant-tag",allowClear:!0,showToday:!1},Object(Ys.polyfill)(pm);var fm=pm,hm=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));n.weekDateRender=function(e){var t=n.state.value,r=n.props.prefixCls;return t&&e.year()===t.year()&&e.week()===t.week()?ws.createElement("div",{className:r+"-selected-day"},ws.createElement("div",{className:r+"-date"},e.date())):ws.createElement("div",{className:r+"-date"},e.date())},n.handleChange=function(e){"value"in n.props||n.setState({value:e}),n.props.onChange(e,Ur(e,n.props.format))},n.clearSelection=function(e){e.preventDefault(),e.stopPropagation(),n.handleChange(null)},n.saveInput=function(e){n.input=e};var r=e.value||e.defaultValue;if(r&&!cn(Bf).isMoment(r))throw new Error("The value/defaultValue of DatePicker or MonthPicker must be a moment object after `antd@2.0`, see: https://u.ant.design/date-picker-value");return n.state={value:r},n}return gs()(t,e),ds()(t,[{key:"focus",value:function(){this.input.focus()}},{key:"blur",value:function(){this.input.blur()}},{key:"render",value:function(){var e=this,t=this.props,n=t.prefixCls,r=t.className,o=t.disabled,i=t.pickerClass,a=t.popupStyle,c=t.pickerInputClass,s=t.format,l=t.allowClear,u=t.locale,p=t.localeCode,f=t.disabledDate,h=t.style,d=t.onFocus,v=t.onBlur,m=t.id,y=this.state.value;y&&p&&y.locale(p);var g="placeholder"in this.props?this.props.placeholder:u.lang.placeholder,b=ws.createElement(Mv,{showWeekNumber:!0,dateRender:this.weekDateRender,prefixCls:n,format:s,locale:u.lang,showDateInput:!1,showToday:!1,disabledDate:f}),C=!o&&l&&this.state.value?ws.createElement(Kp,{type:"close-circle",className:n+"-picker-clear",onClick:this.clearSelection,theme:"filled"}):null,w=function(t){var r=t.value;return ws.createElement("span",null,ws.createElement("input",{ref:e.saveInput,disabled:o,readOnly:!0,value:r&&r.format(s)||"",placeholder:g,className:c,onFocus:d,onBlur:v}),C,ws.createElement(Kp,{type:"calendar",className:n+"-picker-icon"}))};return ws.createElement("span",{className:Ts()(r,i),style:h,id:m},ws.createElement(Vv,us()({},this.props,{calendar:b,prefixCls:n+"-picker-container",value:y,onChange:this.handleChange,style:a}),w))}}],[{key:"getDerivedStateFromProps",value:function(e){return"value"in e?{value:e.value}:null}}]),t}(ws.Component);hm.defaultProps={format:"gggg-wo",allowClear:!0},Object(Ys.polyfill)(hm);var dm=hm,vm=Vr(zr(Mv)),mm=Vr(zr(kv),"YYYY-MM");us()(vm,{RangePicker:Vr(fm),MonthPicker:mm,WeekPicker:Vr(dm,"gggg-wo")});var ym=vm,gm=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},bm={adjustX:1,adjustY:1},Cm=[0,0],wm={topLeft:{points:["bl","tl"],overflow:bm,offset:[0,-4],targetOffset:Cm},topCenter:{points:["bc","tc"],overflow:bm,offset:[0,-4],targetOffset:Cm},topRight:{points:["br","tr"],overflow:bm,offset:[0,-4],targetOffset:Cm},bottomLeft:{points:["tl","bl"],overflow:bm,offset:[0,4],targetOffset:Cm},bottomCenter:{points:["tc","bc"],overflow:bm,offset:[0,4],targetOffset:Cm},bottomRight:{points:["tr","br"],overflow:bm,offset:[0,4],targetOffset:Cm}},Sm=wm,xm=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},Mm=function(e){function t(n){Gr(this,t);var r=Xr(this,e.call(this,n));return zm.call(r),r.state="visible"in n?{visible:n.visible}:{visible:n.defaultVisible},r}return $r(t,e),t.getDerivedStateFromProps=function(e){return"visible"in e?{visible:e.visible}:null},t.prototype.getMenuElement=function(){var e=this.props,t=e.overlay,n=e.prefixCls,r={prefixCls:n+"-menu",onClick:this.onClick};return"string"==typeof t.type&&delete r.prefixCls,Ss.a.cloneElement(t,r)},t.prototype.getPopupDomNode=function(){return this.trigger.getPopupDomNode()},t.prototype.render=function(){var e=this.props,t=e.prefixCls,n=e.children,r=e.transitionName,o=e.animation,i=e.align,a=e.placement,c=e.getPopupContainer,s=e.showAction,l=e.hideAction,u=e.overlayClassName,p=e.overlayStyle,f=e.trigger,h=Yr(e,["prefixCls","children","transitionName","animation","align","placement","getPopupContainer","showAction","hideAction","overlayClassName","overlayStyle","trigger"]),d=l;return d||-1===f.indexOf("contextMenu")||(d=["click"]),Ss.a.createElement(_u,xm({},h,{prefixCls:t,ref:this.saveTrigger,popupClassName:u,popupStyle:p,builtinPlacements:Sm,action:f,showAction:s,hideAction:d||[],popupPlacement:a,popupAlign:i,popupTransitionName:r,popupAnimation:o,popupVisible:this.state.visible,afterPopupVisibleChange:this.afterVisibleChange,popup:this.getMenuElement(),onPopupVisibleChange:this.onVisibleChange,getPopupContainer:c}),n)},t}(ws.Component);Mm.propTypes={minOverlayWidthMatchTrigger:ks.a.bool,onVisibleChange:ks.a.func,onOverlayClick:ks.a.func,prefixCls:ks.a.string,children:ks.a.any,transitionName:ks.a.string,overlayClassName:ks.a.string,animation:ks.a.any,align:ks.a.object,overlayStyle:ks.a.object,placement:ks.a.string,overlay:ks.a.node,trigger:ks.a.array,alignPoint:ks.a.bool,showAction:ks.a.array,hideAction:ks.a.array,getPopupContainer:ks.a.func,visible:ks.a.bool,defaultVisible:ks.a.bool},Mm.defaultProps={prefixCls:"rc-dropdown",trigger:["hover"],showAction:[],overlayClassName:"",overlayStyle:{},defaultVisible:!1,onVisibleChange:function(){},placement:"bottomLeft"};var zm=function(){var e=this;this.onClick=function(t){var n=e.props,r=n.overlay.props;"visible"in n||e.setState({visible:!1}),n.onOverlayClick&&n.onOverlayClick(t),r.onClick&&r.onClick(t)},this.onVisibleChange=function(t){var n=e.props;"visible"in n||e.setState({visible:t}),n.onVisibleChange(t)},this.getMinOverlayWidthMatchTrigger=function(){var t=e.props,n=t.minOverlayWidthMatchTrigger,r=t.alignPoint;return"minOverlayWidthMatchTrigger"in e.props?n:!r},this.afterVisibleChange=function(t){if(t&&e.getMinOverlayWidthMatchTrigger()){var n=e.getPopupDomNode(),r=Ms.a.findDOMNode(e);r&&n&&r.offsetWidth>n.offsetWidth&&(n.style.minWidth=r.offsetWidth+"px",e.trigger&&e.trigger._component&&e.trigger._component.alignInstance&&e.trigger._component.alignInstance.forceAlign())}},this.saveTrigger=function(t){e.trigger=t}};Object(Ys.polyfill)(Mm);var km=Mm,_m=km,Om=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"getTransitionName",value:function(){var e=this.props,t=e.placement,n=void 0===t?"":t,r=e.transitionName;return void 0!==r?r:n.indexOf("top")>=0?"slide-down":"slide-up"}},{key:"componentDidMount",value:function(){var e=this.props.overlay;if(e){var t=e.props;Pp(!t.mode||"vertical"===t.mode,'mode="'+t.mode+"\" is not supported for Dropdown's Menu.")}}},{key:"render",value:function(){var e=this.props,t=e.children,n=e.prefixCls,r=e.overlay,o=e.trigger,i=e.disabled,a=ws.Children.only(t),c=ws.Children.only(r),s=ws.cloneElement(a,{className:Ts()(a.props.className,n+"-trigger"),disabled:i}),l=c.props,u=l.selectable,p=void 0!==u&&u,f=l.focusable,h=void 0===f||f,d=ws.createElement("span",{className:n+"-menu-submenu-arrow"},ws.createElement(Kp,{type:"right",className:n+"-menu-submenu-arrow-icon"})),v="string"==typeof c.type?c:ws.cloneElement(c,{mode:"vertical",selectable:p,focusable:h,expandIcon:d}),m=i?[]:o,y=void 0;return m&&-1!==m.indexOf("contextMenu")&&(y=!0),ws.createElement(_m,us()({alignPoint:y},this.props,{transitionName:this.getTransitionName(),trigger:m,overlay:v}),s)}}]),t}(ws.Component),Em=Om;Om.defaultProps={prefixCls:"ant-dropdown",mouseEnterDelay:.15,mouseLeaveDelay:.1,placement:"bottomLeft"};var Tm=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},Nm=cf.Group,Vm=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e=this.props,t=e.type,n=e.disabled,r=e.onClick,o=e.htmlType,i=e.children,a=e.prefixCls,c=e.className,s=e.overlay,l=e.trigger,u=e.align,p=e.visible,f=e.onVisibleChange,h=e.placement,d=e.getPopupContainer,v=Tm(e,["type","disabled","onClick","htmlType","children","prefixCls","className","overlay","trigger","align","visible","onVisibleChange","placement","getPopupContainer"]),m={align:u,overlay:s,disabled:n,trigger:n?[]:l,onVisibleChange:f,placement:h,getPopupContainer:d};return"visible"in this.props&&(m.visible=p),ws.createElement(Nm,us()({},v,{className:Ts()(a,c)}),ws.createElement(cf,{type:t,disabled:n,onClick:r,htmlType:o},i),ws.createElement(Em,m,ws.createElement(cf,{type:t,icon:"ellipsis"})))}}]),t}(ws.Component),Pm=Vm;Vm.defaultProps={placement:"bottomRight",type:"default",prefixCls:"ant-dropdown-button"},Em.Button=Pm;var Hm=Em,Lm=void 0,Dm={transition:"transitionend",WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend"},Am=Object.keys(Dm).filter(function(e){if("undefined"==typeof document)return!1;var t=document.getElementsByTagName("html")[0];return e in(t?t.style:{})})[0],Im=Dm[Am],Rm=function(e){return!isNaN(parseFloat(e))&&isFinite(e)},jm="createPortal"in Ms.a,Fm={},Km=!("undefined"!=typeof window&&window.document&&window.document.createElement),Bm=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));Wm.call(n),n.levelDom=[],n.contentDom=null,n.maskDom=null,n.handlerdom=null,n.mousePos=null,n.firstEnter=e.firstEnter,n.timeout=null,n.drawerId=Number((Date.now()+Math.random()).toString().replace(".",Math.round(9*Math.random()))).toString(16);var r=void 0!==e.open?e.open:!!e.defaultOpen;return Fm[n.drawerId]=r,n.state={open:r},n}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){if(!Km){var e=!1;window.addEventListener("test",null,Object.defineProperty({},"passive",{get:function(){return e=!0,null}})),this.passive=!!e&&{passive:!1}}var t=this.getOpen();(this.props.handler||t||this.firstEnter)&&(this.getDefault(this.props),t&&(this.isOpenChange=!0),this.forceUpdate())}},{key:"componentWillReceiveProps",value:function(e){var t=e.open,n=e.placement;void 0!==t&&t!==this.props.open&&(this.isOpenChange=!0,this.container||this.getDefault(e),this.setState({open:t})),n!==this.props.placement&&(this.contentDom=null),this.props.level!==e.level&&this.getParentAndLevelDom(e)}},{key:"componentDidUpdate",value:function(){!this.firstEnter&&this.container&&(this.forceUpdate(),this.firstEnter=!0)}},{key:"componentWillUnmount",value:function(){delete Fm[this.drawerId],delete this.isOpenChange,this.container&&(this.state.open&&this.setLevelDomTransform(!1,!0),document.body.style.overflow="",this.props.getContainer&&this.container.parentNode.removeChild(this.container)),this.firstEnter=!1,clearTimeout(this.timeout),this.renderComponent&&!jm&&this.renderComponent({afterClose:this.removeContainer,onClose:function(){},visible:!1})}},{key:"render",value:function(){var e=this,t=this.props,n=t.getContainer,r=t.wrapperClassName,o=this.getOpen();Fm[this.drawerId]=o?this.container:o;var i=this.getChildToRender(!!this.firstEnter&&o);return n?this.container&&(o||this.firstEnter)?jm?Ms.a.createPortal(i,this.container):Ss.a.createElement(Vl,{parent:this,visible:!0,autoMount:!0,autoDestroy:!1,getComponent:function(){return i},getContainer:this.getContainer},function(t){var n=t.renderComponent,r=t.removeContainer;return e.renderComponent=n,e.removeContainer=r,null}):null:Ss.a.createElement("div",{className:r,ref:function(t){e.container=t}},i)}}]),t}(Ss.a.PureComponent);Bm.defaultProps={prefixCls:"drawer",placement:"left",getContainer:"body",level:"all",duration:".3s",ease:"cubic-bezier(0.78, 0.14, 0.15, 0.86)",onChange:function(){},onMaskClick:function(){},onHandleClick:function(){},handler:Ss.a.createElement("div",{className:"drawer-handle"},Ss.a.createElement("i",{className:"drawer-handle-icon"})),firstEnter:!1,showMask:!0,maskStyle:{},wrapperClassName:"",className:""};var Wm=function(){var e=this;this.onMaskTouchEnd=function(t){e.props.onMaskClick(t),e.onTouchEnd(t,!0)},this.onIconTouchEnd=function(t){e.props.onHandleClick(t),e.onTouchEnd(t)},this.onTouchEnd=function(t,n){if(void 0===e.props.open){var r=n||e.state.open;e.isOpenChange=!0,e.setState({open:!r})}},this.onWrapperTransitionEnd=function(t){t.target===e.contentWrapper&&(e.dom.style.transition="",!e.state.open&&e.getCrrentDrawerSome()&&(document.body.style.overflowX="",e.maskDom&&(e.maskDom.style.left="",e.maskDom.style.width="")))},this.getDefault=function(t){e.getParentAndLevelDom(t),(t.getContainer||t.parent)&&(e.container=e.defaultGetContainer())},this.getCrrentDrawerSome=function(){return!Object.keys(Fm).some(function(e){return Fm[e]})},this.getContainer=function(){return e.container},this.getParentAndLevelDom=function(t){if(!Km){var n=t.level,r=t.getContainer;if(e.levelDom=[],r){if("string"==typeof r){var o=document.querySelectorAll(r)[0];e.parent=o}"function"==typeof r&&(e.parent=r()),"object"==typeof r&&r instanceof window.HTMLElement&&(e.parent=r)}if(!r&&e.container&&(e.parent=e.container.parentNode),"all"===n){Array.prototype.slice.call(e.parent.children).forEach(function(t){"SCRIPT"!==t.nodeName&&"STYLE"!==t.nodeName&&"LINK"!==t.nodeName&&t!==e.container&&e.levelDom.push(t)})}else n&&Zr(n).forEach(function(t){document.querySelectorAll(t).forEach(function(t){e.levelDom.push(t)})})}},this.setLevelDomTransform=function(t,n,r,o){var i=e.props,a=i.placement,c=i.levelMove,s=i.duration,l=i.ease,u=i.onChange,p=i.getContainer;if(!Km&&(e.levelDom.forEach(function(i){if(e.isOpenChange||n){i.style.transition="transform "+s+" "+l,Qr(i,Im,e.trnasitionEnd);var u=t?o:0;if(c){var p=to(c,{target:i,open:t});u=t?p[0]:p[1]||0}var f="number"==typeof u?u+"px":u,h="left"===a||"top"===a?f:"-"+f;i.style.transform=u?r+"("+h+")":"",i.style.msTransform=u?r+"("+h+")":""}}),"body"===p)){var f=["touchstart"],h=[document.body,e.maskDom,e.handlerdom,e.contentDom],d=document.body.scrollHeight>(window.innerHeight||document.documentElement.clientHeight)&&window.innerWidth>document.body.offsetWidth?Jr(1):0,v="width "+s+" "+l,m="transform "+s+" "+l;if(t&&"hidden"!==document.body.style.overflow){if(document.body.style.overflow="hidden",d){switch(document.body.style.position="relative",document.body.style.width="calc(100% - "+d+"px)",e.dom.style.transition="none",a){case"right":e.dom.style.transform="translateX(-"+d+"px)",e.dom.style.msTransform="translateX(-"+d+"px)";break;case"top":case"bottom":e.dom.style.width="calc(100% - "+d+"px)",e.dom.style.transform="translateZ(0)"}clearTimeout(e.timeout),e.timeout=setTimeout(function(){e.dom.style.transition=m+","+v,e.dom.style.width="",e.dom.style.transform="",e.dom.style.msTransform=""})}h.forEach(function(t,n){t&&Qr(t,f[n]||"touchmove",n?e.removeMoveHandler:e.removeStartHandler,e.passive)})}else if(e.getCrrentDrawerSome()){if(document.body.style.overflow="",(e.isOpenChange||n)&&d){document.body.style.position="",document.body.style.width="",Am&&(document.body.style.overflowX="hidden"),e.dom.style.transition="none";var y=void 0;switch(a){case"right":e.dom.style.transform="translateX("+d+"px)",e.dom.style.msTransform="translateX("+d+"px)",e.dom.style.width="100%",v="width 0s "+l+" "+s,e.maskDom&&(e.maskDom.style.left="-"+d+"px",e.maskDom.style.width="calc(100% + "+d+"px)");break;case"top":case"bottom":e.dom.style.width="calc(100% + "+d+"px)",e.dom.style.height="100%",e.dom.style.transform="translateZ(0)",y="height 0s "+l+" "+s}clearTimeout(e.timeout),e.timeout=setTimeout(function(){e.dom.style.transition=m+","+(y?y+",":"")+v,e.dom.style.transform="",e.dom.style.msTransform="",e.dom.style.width="",e.dom.style.height=""})}h.forEach(function(t,n){t&&eo(t,f[n]||"touchmove",n?e.removeMoveHandler:e.removeStartHandler,e.passive)})}}u&&e.isOpenChange&&e.firstEnter&&(u(t),e.isOpenChange=!1)},this.getChildToRender=function(t){var n,r=e.props,o=r.className,i=r.prefixCls,a=r.style,c=r.placement,s=r.children,l=r.handler,u=r.showMask,p=r.maskStyle,f=r.width,h=r.height,d=Ts()(i,(n={},ss()(n,i+"-"+c,!0),ss()(n,i+"-open",t),ss()(n,o,!!o),n)),v=e.isOpenChange,m="left"===c||"right"===c,y="translate"+(m?"X":"Y"),g="left"===c||"top"===c?"-100%":"100%",b=t?"":y+"("+g+")";if(void 0===v||v){var C=e.contentDom?e.contentDom.getBoundingClientRect()[m?"width":"height"]:0,w=(m?f:h)||C;e.setLevelDomTransform(t,!1,y,w)}var S=l&&Ss.a.cloneElement(l,{onClick:function(t){l.props.onClick&&l.props.onClick(),e.onIconTouchEnd(t)},ref:function(t){e.handlerdom=t}});return Ss.a.createElement("div",{className:d,style:a,ref:function(t){e.dom=t},onTransitionEnd:e.onWrapperTransitionEnd},u&&Ss.a.createElement("div",{className:i+"-mask",onClick:e.onMaskTouchEnd,style:p,ref:function(t){e.maskDom=t}}),Ss.a.createElement("div",{className:i+"-content-wrapper",style:{transform:b,msTransform:b,width:Rm(f)?f+"px":f,height:Rm(h)?h+"px":h},ref:function(t){e.contentWrapper=t}},Ss.a.createElement("div",{className:i+"-content",ref:function(t){e.contentDom=t},onTouchStart:t?e.removeStartHandler:null,onTouchMove:t?e.removeMoveHandler:null},s),S))},this.getOpen=function(){return void 0!==e.props.open?e.props.open:e.state.open},this.getTouchParentScroll=function(t,n,r,o){if(!n)return!1;if(n===t.parentNode)return!0;var i=Math.max(Math.abs(r),Math.abs(o))===Math.abs(o),a=Math.max(Math.abs(r),Math.abs(o))===Math.abs(r),c=n.scrollHeight-n.clientHeight,s=n.scrollWidth-n.clientWidth,l=n.scrollTop,u=n.scrollLeft;n.scrollTo(n.scrollLeft+1,n.scrollTop+1);var p=n.scrollTop,f=n.scrollLeft;return n.scrollTo(n.scrollLeft-1,n.scrollTop-1),!((!i||c&&p-l&&(!c||!(n.scrollTop>=c&&o<0||n.scrollTop<=0&&o>0)))&&(!a||s&&f-u&&(!s||!(n.scrollLeft>=s&&r<0||n.scrollLeft<=0&&r>0))))&&e.getTouchParentScroll(t,n.parentNode,r,o)},this.removeStartHandler=function(t){t.touches.length>1||(e.startPos={x:t.touches[0].clientX,y:t.touches[0].clientY})},this.removeMoveHandler=function(t){if(!(t.changedTouches.length>1)){var n=t.currentTarget,r=t.changedTouches[0].clientX-e.startPos.x,o=t.changedTouches[0].clientY-e.startPos.y;(n===e.maskDom||n===e.handlerdom||n===e.contentDom&&e.getTouchParentScroll(n,t.target,r,o))&&t.preventDefault()}},this.trnasitionEnd=function(t){eo(t.target,Im,e.trnasitionEnd),t.target.style.transition=""},this.defaultGetContainer=function(){if(Km)return null;var t=document.createElement("div");return e.parent.appendChild(t),e.props.wrapperClassName&&(t.className=e.props.wrapperClassName),t}};Bm.propTypes={wrapperClassName:ks.a.string,className:ks.a.string,children:ks.a.node,style:ks.a.object,width:ks.a.any,height:ks.a.any,defaultOpen:ks.a.bool,firstEnter:ks.a.bool,open:ks.a.bool,prefixCls:ks.a.string,placement:ks.a.string,level:ks.a.oneOfType([ks.a.string,ks.a.array]),levelMove:ks.a.oneOfType([ks.a.number,ks.a.func,ks.a.array]),ease:ks.a.string,duration:ks.a.string,getContainer:ks.a.oneOfType([ks.a.string,ks.a.func,ks.a.object,ks.a.bool]),handler:ks.a.any,onChange:ks.a.func,onMaskClick:ks.a.func,onHandleClick:ks.a.func,showMask:ks.a.bool,maskStyle:ks.a.object};var Um=Bm,qm=Um,Ym=n(328),Gm=n.n(Ym),Xm=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},$m=Gm()(null),Jm=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.state={push:!1},e.close=function(t){if(void 0!==e.props.visible)return void(e.props.onClose&&e.props.onClose(t))},e.onMaskClick=function(t){e.props.maskClosable&&e.close(t)},e.push=function(){e.setState({push:!0})},e.pull=function(){e.setState({push:!1})},e.onDestoryTransitionEnd=function(){e.getDestoryOnClose()&&(e.props.visible||(e.destoryClose=!0,e.forceUpdate()))},e.getDestoryOnClose=function(){return e.props.destroyOnClose&&!e.props.visible},e.getPushTransform=function(e){return"left"===e||"right"===e?"translateX("+("left"===e?180:-180)+"px)":"top"===e||"bottom"===e?"translateY("+("top"===e?180:-180)+"px)":void 0},e.renderBody=function(){if(e.destoryClose&&!e.props.visible)return null;e.destoryClose=!1;var t=e.props.placement,n="left"===t||"right"===t?{overflow:"auto",height:"100%"}:{};e.getDestoryOnClose()&&(n.opacity=0,n.transition="opacity .3s");var r=e.props,o=r.prefixCls,i=r.title,a=r.closable,c=void 0;i&&(c=ws.createElement("div",{className:o+"-header"},ws.createElement("div",{className:o+"-title"},i)));var s=void 0;return a&&(s=ws.createElement("button",{onClick:e.close,"aria-label":"Close",className:o+"-close"},ws.createElement("span",{className:o+"-close-x"},ws.createElement(Kp,{type:"close"})))),ws.createElement("div",{className:o+"-wrapper-body",style:n,onTransitionEnd:e.onDestoryTransitionEnd},c,s,ws.createElement("div",{className:o+"-body",style:e.props.style},e.props.children))},e.getRcDrawerStyle=function(){var t=e.props,n=t.zIndex,r=t.placement,o=t.maskStyle;return e.state.push?us()({},o,{zIndex:n,transform:e.getPushTransform(r)}):us()({},o,{zIndex:n})},e.renderProvider=function(t){var n=e.props,r=(n.zIndex,n.style,n.placement),o=n.className,i=n.wrapClassName,a=n.width,c=n.height,s=Xm(n,["zIndex","style","placement","className","wrapClassName","width","height"]);op()(void 0===i,"wrapClassName is deprecated, please use className instead."),e.parentDrawer=t;var l={};return"left"===r||"right"===r?l.width=a:l.height=c,ws.createElement($m.Provider,{value:e},ws.createElement(qm,us()({handler:!1},s,l,{open:e.props.visible,onMaskClick:e.onMaskClick,showMask:e.props.mask,placement:r,style:e.getRcDrawerStyle(),className:Ts()(i,o)}),e.renderBody()))},e}return gs()(t,e),ds()(t,[{key:"componentDidUpdate",value:function(e){e.visible!==this.props.visible&&this.parentDrawer&&(this.props.visible?this.parentDrawer.push():this.parentDrawer.pull())}},{key:"render",value:function(){return ws.createElement($m.Consumer,null,this.renderProvider)}}]),t}(ws.Component),Zm=Jm;Jm.propTypes={closable:zs.bool,destroyOnClose:zs.bool,getContainer:zs.oneOfType([zs.string,zs.object,zs.func,zs.bool]),maskClosable:zs.bool,mask:zs.bool,maskStyle:zs.object,style:zs.object,title:zs.node,visible:zs.bool,width:zs.oneOfType([zs.string,zs.number]),zIndex:zs.number,prefixCls:zs.string,placement:zs.string,onClose:zs.func,className:zs.string},Jm.defaultProps={prefixCls:"ant-drawer",width:256,height:256,closable:!0,placement:"right",maskClosable:!0,level:null};var Qm=n(331),ey=n.n(Qm),ty=/%[sdj%]/g,ny=function(){},ry=po,oy=fo,iy={email:/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,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"),hex:/^#?([a-f0-9]{6}|[a-f0-9]{3})$/i},ay={integer:function(e){return ay.number(e)&&parseInt(e,10)===e},float:function(e){return ay.number(e)&&!ay.integer(e)},array:function(e){return Array.isArray(e)},regexp:function(e){if(e instanceof RegExp)return!0;try{return!!new RegExp(e)}catch(e){return!1}},date:function(e){return"function"==typeof e.getTime&&"function"==typeof e.getMonth&&"function"==typeof e.getYear},number:function(e){return!isNaN(e)&&"number"==typeof e},object:function(e){return"object"===(void 0===e?"undefined":Cs()(e))&&!ay.array(e)},method:function(e){return"function"==typeof e},email:function(e){return"string"==typeof e&&!!e.match(iy.email)&&e.length<255},url:function(e){return"string"==typeof e&&!!e.match(iy.url)},hex:function(e){return"string"==typeof e&&!!e.match(iy.hex)}},cy=ho,sy=vo,ly="enum",uy=mo,py=yo,fy={required:ry,whitespace:oy,type:cy,range:sy,enum:uy,pattern:py},hy=go,dy=bo,vy=Co,my=wo,yy=So,gy=xo,by=Mo,Cy=zo,wy=ko,Sy="enum",xy=_o,My=Oo,zy=Eo,ky=To,_y=No,Oy={string:hy,method:dy,number:vy,boolean:my,regexp:yy,integer:gy,float:by,array:Cy,object:wy,enum:xy,pattern:My,date:zy,url:_y,hex:_y,email:_y,required:ky},Ey=Vo();Po.prototype={messages:function(e){return e&&(this._messages=uo(Vo(),e)),this._messages},define:function(e){if(!e)throw new Error("Cannot configure a schema with no rules");if("object"!==(void 0===e?"undefined":Cs()(e))||Array.isArray(e))throw new Error("Rules must be an object");this.rules={};var t=void 0,n=void 0;for(t in e)e.hasOwnProperty(t)&&(n=e[t],this.rules[t]=Array.isArray(n)?n:[n])},validate:function(e){function t(e){var t=void 0,n=void 0,r=[],o={};for(t=0;t<e.length;t++)!function(e){Array.isArray(e)?r=r.concat.apply(r,e):r.push(e)}(e[t]);if(r.length)for(t=0;t<r.length;t++)n=r[t].field,o[n]=o[n]||[],o[n].push(r[t]);else r=null,o=null;c(r,o)}var n=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=arguments[2],i=e,a=r,c=o;if("function"==typeof a&&(c=a,a={}),!this.rules||0===Object.keys(this.rules).length)return void(c&&c());if(a.messages){var s=this.messages();s===Ey&&(s=Vo()),uo(s,a.messages),a.messages=s}else a.messages=this.messages();var l=void 0,u=void 0,p={};(a.keys||Object.keys(this.rules)).forEach(function(t){l=n.rules[t],u=i[t],l.forEach(function(r){var o=r;"function"==typeof o.transform&&(i===e&&(i=us()({},i)),u=i[t]=o.transform(u)),o="function"==typeof o?{validator:o}:us()({},o),o.validator=n.getValidationMethod(o),o.field=t,o.fullField=o.fullField||t,o.type=n.getType(o),o.validator&&(p[t]=p[t]||[],p[t].push({rule:o,value:u,source:i,field:t}))})});var f={};so(p,a,function(e,t){function n(e,t){return us()({},t,{fullField:o.fullField+"."+e})}function r(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],c=r;if(Array.isArray(c)||(c=[c]),c.length&&ny("async-validator:",c),c.length&&o.message&&(c=[].concat(o.message)),c=c.map(lo(o)),a.first&&c.length)return f[o.field]=1,t(c);if(i){if(o.required&&!e.value)return c=o.message?[].concat(o.message).map(lo(o)):a.error?[a.error(o,no(a.messages.required,o.field))]:[],t(c);var s={};if(o.defaultField)for(var l in e.value)e.value.hasOwnProperty(l)&&(s[l]=o.defaultField);s=us()({},s,e.rule.fields);for(var u in s)if(s.hasOwnProperty(u)){var p=Array.isArray(s[u])?s[u]:[s[u]];s[u]=p.map(n.bind(null,u))}var h=new Po(s);h.messages(a.messages),e.rule.options&&(e.rule.options.messages=a.messages,e.rule.options.error=a.error),h.validate(e.value,e.rule.options||a,function(e){t(e&&e.length?c.concat(e):e)})}else t(c)}var o=e.rule,i=!("object"!==o.type&&"array"!==o.type||"object"!==Cs()(o.fields)&&"object"!==Cs()(o.defaultField));i=i&&(o.required||!o.required&&e.value),o.field=e.field;var c=o.validator(o,e.value,r,e.source,a);c&&c.then&&c.then(function(){return r()},function(e){return r(e)})},function(e){t(e)})},getType:function(e){if(void 0===e.type&&e.pattern instanceof RegExp&&(e.type="pattern"),"function"!=typeof e.validator&&e.type&&!Oy.hasOwnProperty(e.type))throw new Error(no("Unknown rule type %s",e.type));return e.type||"string"},getValidationMethod:function(e){if("function"==typeof e.validator)return e.validator;var t=Object.keys(e),n=t.indexOf("message");return-1!==n&&t.splice(n,1),1===t.length&&"required"===t[0]?Oy.required:Oy[this.getType(e)]||!1}},Po.register=function(e,t){if("function"!=typeof t)throw new Error("Cannot register a validator by type, validator is not a function");Oy[e]=t},Po.messages=Ey;var Ty=Po,Ny=n(122),Vy=n.n(Ny),Py=n(178),Hy=n.n(Py),Ly=function e(t){fs()(this,e),us()(this,t)},Dy=n(163),Ay=n.n(Dy),Iy=function(){function e(t){fs()(this,e),Ry.call(this),this.fields=this.flattenFields(t),this.fieldsMeta={}}return ds()(e,[{key:"updateFields",value:function(e){this.fields=this.flattenFields(e)}},{key:"flattenFields",value:function(e){return Fo(e,function(e,t){return Ho(t)},"You must wrap field data with `createFormField`.")}},{key:"flattenRegisteredFields",value:function(e){var t=this.getAllFieldsName();return Fo(e,function(e){return t.indexOf(e)>=0},"You cannot set a form field before rendering a field associated with the value.")}},{key:"setFields",value:function(e){var t=this,n=this.fieldsMeta,r=us()({},this.fields,e),o={};Object.keys(n).forEach(function(e){return o[e]=t.getValueFromFields(e,r)}),Object.keys(o).forEach(function(e){var n=o[e],i=t.getFieldMeta(e);if(i&&i.normalize){var a=i.normalize(n,t.getValueFromFields(e,t.fields),o);a!==n&&(r[e]=us()({},r[e],{value:a}))}}),this.fields=r}},{key:"resetFields",value:function(e){var t=this.fields;return(e?this.getValidFieldsFullName(e):this.getAllFieldsName()).reduce(function(e,n){var r=t[n];return r&&"value"in r&&(e[n]={}),e},{})}},{key:"setFieldMeta",value:function(e,t){this.fieldsMeta[e]=t}},{key:"getFieldMeta",value:function(e){return this.fieldsMeta[e]=this.fieldsMeta[e]||{},this.fieldsMeta[e]}},{key:"getValueFromFields",value:function(e,t){var n=t[e];if(n&&"value"in n)return n.value;var r=this.getFieldMeta(e);return r&&r.initialValue}},{key:"getValidFieldsName",value:function(){var e=this,t=this.fieldsMeta;return t?Object.keys(t).filter(function(t){return!e.getFieldMeta(t).hidden}):[]}},{key:"getAllFieldsName",value:function(){var e=this.fieldsMeta;return e?Object.keys(e):[]}},{key:"getValidFieldsFullName",value:function(e){var t=Array.isArray(e)?e:[e];return this.getValidFieldsName().filter(function(e){return t.some(function(t){return e===t||Xo(e,t)&&[".","["].indexOf(e[t.length])>=0})})}},{key:"getFieldValuePropValue",value:function(e){var t=e.name,n=e.getValueProps,r=e.valuePropName,o=this.getField(t),i="value"in o?o.value:e.initialValue;return n?n(i):ss()({},r,i)}},{key:"getField",value:function(e){return us()({},this.fields[e],{name:e})}},{key:"getNotCollectedFields",value:function(){var e=this;return this.getValidFieldsName().filter(function(t){return!e.fields[t]}).map(function(t){return{name:t,dirty:!1,value:e.getFieldMeta(t).initialValue}}).reduce(function(e,t){return Hy()(e,t.name,Lo(t))},{})}},{key:"getNestedAllFields",value:function(){var e=this;return Object.keys(this.fields).reduce(function(t,n){return Hy()(t,n,Lo(e.fields[n]))},this.getNotCollectedFields())}},{key:"getFieldMember",value:function(e,t){return this.getField(e)[t]}},{key:"getNestedFields",value:function(e,t){return(e||this.getValidFieldsName()).reduce(function(e,n){return Hy()(e,n,t(n))},{})}},{key:"getNestedField",value:function(e,t){var n=this.getValidFieldsFullName(e);if(0===n.length||1===n.length&&n[0]===e)return t(e);var r="["===n[0][e.length],o=r?e.length:e.length+1;return n.reduce(function(e,n){return Hy()(e,n.slice(o),t(n))},r?[]:{})}},{key:"isValidNestedFieldName",value:function(e){return this.getAllFieldsName().every(function(t){return!$o(t,e)&&!$o(e,t)})}},{key:"clearField",value:function(e){delete this.fields[e],delete this.fieldsMeta[e]}}]),e}(),Ry=function(){var e=this;this.setFieldsInitialValue=function(t){var n=e.flattenRegisteredFields(t),r=e.fieldsMeta;Object.keys(n).forEach(function(t){r[t]&&e.setFieldMeta(t,us()({},e.getFieldMeta(t),{initialValue:n[t]}))})},this.getAllValues=function(){var t=e.fieldsMeta,n=e.fields;return Object.keys(t).reduce(function(t,r){return Hy()(t,r,e.getValueFromFields(r,n))},{})},this.getFieldsValue=function(t){return e.getNestedFields(t,e.getFieldValue)},this.getFieldValue=function(t){var n=e.fields;return e.getNestedField(t,function(t){return e.getValueFromFields(t,n)})},this.getFieldsError=function(t){return e.getNestedFields(t,e.getFieldError)},this.getFieldError=function(t){return e.getNestedField(t,function(t){return Uo(e.getFieldMember(t,"errors"))})},this.isFieldValidating=function(t){return e.getFieldMember(t,"validating")},this.isFieldsValidating=function(t){return(t||e.getValidFieldsName()).some(function(t){return e.isFieldValidating(t)})},this.isFieldTouched=function(t){return e.getFieldMember(t,"touched")},this.isFieldsTouched=function(t){return(t||e.getValidFieldsName()).some(function(t){return e.isFieldTouched(t)})}},jy="onChange",Fy=Zo,Ky={getForm:function(){return{getFieldsValue:this.fieldsStore.getFieldsValue,getFieldValue:this.fieldsStore.getFieldValue,getFieldInstance:this.getFieldInstance,setFieldsValue:this.setFieldsValue,setFields:this.setFields,setFieldsInitialValue:this.fieldsStore.setFieldsInitialValue,getFieldDecorator:this.getFieldDecorator,getFieldProps:this.getFieldProps,getFieldsError:this.fieldsStore.getFieldsError,getFieldError:this.fieldsStore.getFieldError,isFieldValidating:this.fieldsStore.isFieldValidating,isFieldsValidating:this.fieldsStore.isFieldsValidating,isFieldsTouched:this.fieldsStore.isFieldsTouched,isFieldTouched:this.fieldsStore.isFieldTouched,isSubmitting:this.isSubmitting,submit:this.submit,validateFields:this.validateFields,resetFields:this.resetFields}}},By={getForm:function(){return us()({},Ky.getForm.call(this),{validateFieldsAndScroll:this.validateFieldsAndScroll})},validateFieldsAndScroll:function(e,t,n){var r=this,o=qo(e,t,n),i=o.names,a=o.callback,c=o.options,s=function(e,t){if(e){var n=r.fieldsStore.getValidFieldsName(),o=void 0,i=void 0,s=!0,l=!1,u=void 0;try{for(var p,f=n[Symbol.iterator]();!(s=(p=f.next()).done);s=!0){var h=p.value;if(ey()(e,h)){var d=r.getFieldInstance(h);if(d){var v=Ms.a.findDOMNode(d),m=v.getBoundingClientRect().top;"hidden"!==v.type&&(void 0===i||i>m)&&(i=m,o=v)}}}}catch(e){l=!0,u=e}finally{try{!s&&f.return&&f.return()}finally{if(l)throw u}}if(o){var y=c.container||ei(o);Gu()(o,y,us()({onlyScrollIfNeeded:!0},c.scroll))}}"function"==typeof a&&a(e,t)};return this.validateFields(i,c,s)}},Wy=ti,Uy=n(361),qy=n.n(Uy),Yy=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.helpShow=!1,e.onHelpAnimEnd=function(t,n){e.helpShow=n,n||e.setState({})},e.onLabelClick=function(t){var n=e.props.label,r=e.props.id||e.getId();if(r){if(1!==document.querySelectorAll('[id="'+r+'"]').length){"string"==typeof n&&t.preventDefault();var o=xs.findDOMNode(e),i=o.querySelector('[id="'+r+'"]');i&&i.focus&&i.focus()}}},e}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){Pp(this.getControls(this.props.children,!0).length<=1,"`Form.Item` cannot generate `validateStatus` and `help` automatically, while there are more than one `getFieldDecorator` in it.")}},{key:"getHelpMessage",value:function(){var e=this.props.help;if(void 0===e&&this.getOnlyControl()){var t=this.getField().errors;return t?qy()(t.map(function(e,t){return ws.isValidElement(e.message)?ws.cloneElement(e.message,{key:t}):e.message})," "):""}return e}},{key:"getControls",value:function(e,n){for(var r=[],o=ws.Children.toArray(e),i=0;i<o.length&&(n||!(r.length>0));i++){var a=o[i];(!a.type||a.type!==t&&"FormItem"!==a.type.displayName)&&a.props&&("data-__meta"in a.props?r.push(a):a.props.children&&(r=r.concat(this.getControls(a.props.children,n))))}return r}},{key:"getOnlyControl",value:function(){var e=this.getControls(this.props.children,!1)[0];return void 0!==e?e:null}},{key:"getChildProp",value:function(e){var t=this.getOnlyControl();return t&&t.props&&t.props[e]}},{key:"getId",value:function(){return this.getChildProp("id")}},{key:"getMeta",value:function(){return this.getChildProp("data-__meta")}},{key:"getField",value:function(){return this.getChildProp("data-__field")}},{key:"renderHelp",value:function(){var e=this.props.prefixCls,t=this.getHelpMessage(),n=t?ws.createElement("div",{className:e+"-explain",key:"help"},t):null;return n&&(this.helpShow=!!n),ws.createElement(Ml,{transitionName:"show-help",component:"",transitionAppear:!0,key:"help",onEnd:this.onHelpAnimEnd},n)}},{key:"renderExtra",value:function(){var e=this.props,t=e.prefixCls,n=e.extra;return n?ws.createElement("div",{className:t+"-extra"},n):null}},{key:"getValidateStatus",value:function(){if(!this.getOnlyControl())return"";var e=this.getField();if(e.validating)return"validating";if(e.errors)return"error";var t="value"in e?e.value:this.getMeta().initialValue;return void 0!==t&&null!==t&&""!==t?"success":""}},{key:"renderValidateWrapper",value:function(e,t,n){var r=this.props,o=this.getOnlyControl,i=void 0===r.validateStatus&&o?this.getValidateStatus():r.validateStatus,a=this.props.prefixCls+"-item-control";i&&(a=Ts()(this.props.prefixCls+"-item-control",{"has-feedback":r.hasFeedback||"validating"===i,"has-success":"success"===i,"has-warning":"warning"===i,"has-error":"error"===i,"is-validating":"validating"===i}));var c="";switch(i){case"success":c="check-circle";break;case"warning":c="exclamation-circle";break;case"error":c="close-circle";break;case"validating":c="loading";break;default:c=""}var s=r.hasFeedback&&c?ws.createElement("span",{className:this.props.prefixCls+"-item-children-icon"},ws.createElement(Kp,{type:c,theme:"loading"===c?"outlined":"filled"})):null;return ws.createElement("div",{className:a},ws.createElement("span",{className:this.props.prefixCls+"-item-children"},e,s),t,n)}},{key:"renderWrapper",value:function(e){var t=this.props,n=t.prefixCls,r=t.wrapperCol,o=Ts()(n+"-item-control-wrapper",r&&r.className);return ws.createElement(ld,us()({},r,{className:o,key:"wrapper"}),e)}},{key:"isRequired",value:function(){var e=this.props.required;if(void 0!==e)return e;if(this.getOnlyControl()){return((this.getMeta()||{}).validate||[]).filter(function(e){return!!e.rules}).some(function(e){return e.rules.some(function(e){return e.required})})}return!1}},{key:"renderLabel",value:function(){var e=this.props,t=e.prefixCls,n=e.label,r=e.labelCol,o=e.colon,i=e.id,a=this.context,c=this.isRequired(),s=Ts()(t+"-item-label",r&&r.className),l=Ts()(ss()({},t+"-item-required",c)),u=n;return o&&!a.vertical&&"string"==typeof n&&""!==n.trim()&&(u=n.replace(/[\uff1a|:]\s*$/,"")),n?ws.createElement(ld,us()({},r,{className:s,key:"label"}),ws.createElement("label",{htmlFor:i||this.getId(),className:l,title:"string"==typeof n?n:"",onClick:this.onLabelClick},u)):null}},{key:"renderChildren",value:function(){var e=this.props.children;return[this.renderLabel(),this.renderWrapper(this.renderValidateWrapper(e,this.renderHelp(),this.renderExtra()))]}},{key:"renderFormItem",value:function(e){var t,n=this.props,r=n.prefixCls,o=n.style,i=(t={},ss()(t,r+"-item",!0),ss()(t,r+"-item-with-help",this.helpShow),ss()(t,r+"-item-no-colon",!n.colon),ss()(t,""+n.className,!!n.className),t);return ws.createElement(od,{className:Ts()(i),style:o},e)}},{key:"render",value:function(){var e=this.renderChildren();return this.renderFormItem(e)}}]),t}(ws.Component),Gy=Yy;Yy.defaultProps={hasFeedback:!1,prefixCls:"ant-form",colon:!0},Yy.propTypes={prefixCls:zs.string,label:zs.oneOfType([zs.string,zs.node]),labelCol:zs.object,help:zs.oneOfType([zs.node,zs.bool]),validateStatus:zs.oneOf(["","success","warning","error","validating"]),hasFeedback:zs.bool,wrapperCol:zs.object,className:zs.string,id:zs.string,children:zs.node,colon:zs.bool},Yy.contextTypes={vertical:zs.bool};var Xy=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return Pp(!e.form,"It is unnecessary to pass `form` to `Form` after antd@1.7.0."),n}return gs()(t,e),ds()(t,[{key:"getChildContext",value:function(){return{vertical:"vertical"===this.props.layout}}},{key:"render",value:function(){var e,t=this.props,n=t.prefixCls,r=t.hideRequiredMark,o=t.className,i=void 0===o?"":o,a=t.layout,c=Ts()(n,(e={},ss()(e,n+"-horizontal","horizontal"===a),ss()(e,n+"-vertical","vertical"===a),ss()(e,n+"-inline","inline"===a),ss()(e,n+"-hide-required-mark",r),e),i),s=Ps(this.props,["prefixCls","className","layout","form","hideRequiredMark"]);return ws.createElement("form",us()({},s,{className:c}))}}]),t}(ws.Component),$y=Xy;Xy.defaultProps={prefixCls:"ant-form",layout:"horizontal",hideRequiredMark:!1,onSubmit:function(e){e.preventDefault()}},Xy.propTypes={prefixCls:zs.string,layout:zs.oneOf(["horizontal","inline","vertical"]),children:zs.any,onSubmit:zs.func,hideRequiredMark:zs.bool},Xy.childContextTypes={vertical:zs.bool},Xy.Item=Gy,Xy.createFormField=Lo,Xy.create=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Wy(us()({fieldNameProp:"id"},e,{fieldMetaProp:"data-__meta",fieldDataProp:"data-__field"}))};var Jy=$y,Zy=n(362),Qy=n.n(Zy),eg=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.state={active:!1},e.onTouchStart=function(t){e.triggerEvent("TouchStart",!0,t)},e.onTouchMove=function(t){e.triggerEvent("TouchMove",!1,t)},e.onTouchEnd=function(t){e.triggerEvent("TouchEnd",!1,t)},e.onTouchCancel=function(t){e.triggerEvent("TouchCancel",!1,t)},e.onMouseDown=function(t){e.triggerEvent("MouseDown",!0,t)},e.onMouseUp=function(t){e.triggerEvent("MouseUp",!1,t)},e.onMouseLeave=function(t){e.triggerEvent("MouseLeave",!1,t)},e}return gs()(t,e),ds()(t,[{key:"componentDidUpdate",value:function(){this.props.disabled&&this.state.active&&this.setState({active:!1})}},{key:"triggerEvent",value:function(e,t,n){var r="on"+e,o=this.props.children;o.props[r]&&o.props[r](n),t!==this.state.active&&this.setState({active:t})}},{key:"render",value:function(){var e=this.props,t=e.children,n=e.disabled,r=e.activeClassName,o=e.activeStyle,i=n?void 0:{onTouchStart:this.onTouchStart,onTouchMove:this.onTouchMove,onTouchEnd:this.onTouchEnd,onTouchCancel:this.onTouchCancel,onMouseDown:this.onMouseDown,onMouseUp:this.onMouseUp,onMouseLeave:this.onMouseLeave},a=Ss.a.Children.only(t);if(!n&&this.state.active){var c=a.props,s=c.style,l=c.className;return!1!==o&&(o&&(s=us()({},s,o)),l=Ts()(l,r)),Ss.a.cloneElement(a,us()({className:l,style:s},i))}return Ss.a.cloneElement(a,i)}}]),t}(Ss.a.Component),tg=eg;eg.defaultProps={disabled:!1};var ng=function(e){function t(){return fs()(this,t),ms()(this,e.apply(this,arguments))}return gs()(t,e),t.prototype.render=function(){var e=this.props,t=e.prefixCls,n=e.disabled,r=kl()(e,["prefixCls","disabled"]);return Ss.a.createElement(tg,{disabled:n,activeClassName:t+"-handler-active"},Ss.a.createElement("span",r))},t}(ws.Component);ng.propTypes={prefixCls:ks.a.string,disabled:ks.a.bool,onTouchStart:ks.a.func,onTouchEnd:ks.a.func,onMouseDown:ks.a.func,onMouseUp:ks.a.func,onMouseLeave:ks.a.func};var rg=ng,og=Number.MAX_SAFE_INTEGER||Math.pow(2,53)-1,ig=function(e){function t(n){fs()(this,t);var r=ms()(this,e.call(this,n));ag.call(r);var o=void 0;return o="value"in n?n.value:n.defaultValue,o=r.toNumber(o),r.state={inputValue:r.toPrecisionAsStep(o),value:o,focused:n.autoFocus},r}return gs()(t,e),t.prototype.componentDidMount=function(){this.componentDidUpdate()},t.prototype.componentWillReceiveProps=function(e){if("value"in e){var t=this.state.focused?e.value:this.getValidValue(e.value,e.min,e.max);this.setState({value:t,inputValue:this.inputting?t:this.toPrecisionAsStep(t)})}var n="value"in e?e.value:this.state.value,r=this.props,o=r.onChange,i=r.max,a=r.min;"max"in e&&e.max!==i&&n>e.max&&o&&o(e.max),"min"in e&&e.min!==a&&n<e.min&&o&&o(e.min)},t.prototype.componentDidUpdate=function(){try{if(void 0!==this.cursorStart&&this.state.focused)if(this.partRestoreByAfter(this.cursorAfter)){if(this.currentValue===this.input.value)switch(this.lastKeyCode){case Xs.BACKSPACE:this.fixCaret(this.cursorStart-1,this.cursorStart-1);break;case Xs.DELETE:this.fixCaret(this.cursorStart+1,this.cursorStart+1)}}else{var e=this.cursorStart+1;this.cursorAfter?this.lastKeyCode===Xs.BACKSPACE?e=this.cursorStart-1:this.lastKeyCode===Xs.DELETE&&(e=this.cursorStart):e=this.input.value.length,this.fixCaret(e,e)}}catch(e){}this.lastKeyCode=null,this.pressingUpOrDown&&(this.props.focusOnUpDown&&this.state.focused&&document.activeElement!==this.input&&this.focus(),this.pressingUpOrDown=!1)},t.prototype.componentWillUnmount=function(){this.stop()},t.prototype.getCurrentValidValue=function(e){var t=e;return t=""===t?"":this.isNotCompleteNumber(t)?this.state.value:this.getValidValue(t),this.toNumber(t)},t.prototype.getRatio=function(e){var t=1;return e.metaKey||e.ctrlKey?t=.1:e.shiftKey&&(t=10),t},t.prototype.getValueFromEvent=function(e){return e.target.value.trim().replace(/\u3002/g,".")},t.prototype.getValidValue=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.props.min,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.props.max,r=parseFloat(e,10);return isNaN(r)?e:(r<t&&(r=t),r>n&&(r=n),r)},t.prototype.setValue=function(e,t){var n=this.isNotCompleteNumber(parseFloat(e,10))?void 0:parseFloat(e,10),r=n!==this.state.value||""+n!=""+this.state.inputValue;"value"in this.props?this.setState({inputValue:this.toPrecisionAsStep(this.state.value)},t):this.setState({value:n,inputValue:this.toPrecisionAsStep(e)},t),r&&this.props.onChange(n)},t.prototype.getPrecision=function(e){if("precision"in this.props)return this.props.precision;var t=e.toString();if(t.indexOf("e-")>=0)return parseInt(t.slice(t.indexOf("e-")+2),10);var n=0;return t.indexOf(".")>=0&&(n=t.length-t.indexOf(".")-1),n},t.prototype.getMaxPrecision=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;if("precision"in this.props)return this.props.precision;var n=this.props.step,r=this.getPrecision(t),o=this.getPrecision(n),i=this.getPrecision(e);return e?Math.max(i,r+o):r+o},t.prototype.getPrecisionFactor=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,n=this.getMaxPrecision(e,t);return Math.pow(10,n)},t.prototype.fixCaret=function(e,t){if(void 0!==e&&void 0!==t&&this.input&&this.input.value)try{var n=this.input.selectionStart,r=this.input.selectionEnd;e===n&&t===r||this.input.setSelectionRange(e,t)}catch(e){}},t.prototype.focus=function(){this.input.focus(),this.recordCursorPosition()},t.prototype.blur=function(){this.input.blur()},t.prototype.formatWrapper=function(e){return Qy()(e)?"-0":this.props.formatter?this.props.formatter(e):e},t.prototype.toPrecisionAsStep=function(e){if(this.isNotCompleteNumber(e)||""===e)return e;var t=Math.abs(this.getMaxPrecision(e));return 0===t?e.toString():isNaN(t)?e.toString():Number(e).toFixed(t)},t.prototype.isNotCompleteNumber=function(e){return isNaN(e)||""===e||null===e||e&&e.toString().indexOf(".")===e.toString().length-1},t.prototype.toNumber=function(e){return this.isNotCompleteNumber(e)?e:"precision"in this.props?Number(Number(e).toFixed(this.props.precision)):Number(e)},t.prototype.toNumberWhenUserInput=function(e){return(/\.\d*0$/.test(e)||e.length>16)&&this.state.focused?e:this.toNumber(e)},t.prototype.upStep=function(e,t){var n=this.props,r=n.step,o=n.min,i=this.getPrecisionFactor(e,t),a=Math.abs(this.getMaxPrecision(e,t)),c=void 0;return c="number"==typeof e?((i*e+i*r*t)/i).toFixed(a):o===-1/0?r:o,this.toNumber(c)},t.prototype.downStep=function(e,t){var n=this.props,r=n.step,o=n.min,i=this.getPrecisionFactor(e,t),a=Math.abs(this.getMaxPrecision(e,t)),c=void 0;return c="number"==typeof e?((i*e-i*r*t)/i).toFixed(a):o===-1/0?-r:o,this.toNumber(c)},t.prototype.step=function(e,t){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,o=arguments[3];this.stop(),t&&(t.persist(),t.preventDefault());var i=this.props;if(!i.disabled){var a=this.getCurrentValidValue(this.state.inputValue)||0;if(!this.isNotCompleteNumber(a)){var c=this[e+"Step"](a,r),s=c>i.max||c<i.min;c>i.max?c=i.max:c<i.min&&(c=i.min),this.setValue(c),this.setState({focused:!0}),s||(this.autoStepTimer=setTimeout(function(){n[e](t,r,!0)},o?200:600))}}},t.prototype.render=function(){var e,t=us()({},this.props),n=t.prefixCls,r=t.disabled,o=t.readOnly,i=t.useTouch,a=Ts()((e={},e[n]=!0,e[t.className]=!!t.className,e[n+"-disabled"]=r,e[n+"-focused"]=this.state.focused,e)),c="",s="",l=this.state.value;if(l||0===l)if(isNaN(l))c=n+"-handler-up-disabled",s=n+"-handler-down-disabled";else{var u=Number(l);u>=t.max&&(c=n+"-handler-up-disabled"),u<=t.min&&(s=n+"-handler-down-disabled")}var p={};for(var f in t)!t.hasOwnProperty(f)||"data-"!==f.substr(0,5)&&"aria-"!==f.substr(0,5)&&"role"!==f||(p[f]=t[f]);var h=!t.readOnly&&!t.disabled,d=this.getInputDisplayValue(),v=void 0,m=void 0;i?(v={onTouchStart:h&&!c?this.up:ni,onTouchEnd:this.stop},m={onTouchStart:h&&!s?this.down:ni,onTouchEnd:this.stop}):(v={onMouseDown:h&&!c?this.up:ni,onMouseUp:this.stop,onMouseLeave:this.stop},m={onMouseDown:h&&!s?this.down:ni,onMouseUp:this.stop,onMouseLeave:this.stop});var y=this.formatWrapper(d),g=!!c||r||o,b=!!s||r||o;return Ss.a.createElement("div",{className:a,style:t.style,onMouseEnter:t.onMouseEnter,onMouseLeave:t.onMouseLeave,onMouseOver:t.onMouseOver,onMouseOut:t.onMouseOut},Ss.a.createElement("div",{className:n+"-handler-wrap"},Ss.a.createElement(rg,us()({ref:this.saveUp,disabled:g,prefixCls:n,unselectable:"unselectable"},v,{role:"button","aria-label":"Increase Value","aria-disabled":!!g,className:n+"-handler "+n+"-handler-up "+c}),this.props.upHandler||Ss.a.createElement("span",{unselectable:"unselectable",className:n+"-handler-up-inner",onClick:ri})),Ss.a.createElement(rg,us()({ref:this.saveDown,disabled:b,prefixCls:n,unselectable:"unselectable"},m,{role:"button","aria-label":"Decrease Value","aria-disabled":!!b,className:n+"-handler "+n+"-handler-down "+s}),this.props.downHandler||Ss.a.createElement("span",{unselectable:"unselectable",className:n+"-handler-down-inner",onClick:ri}))),Ss.a.createElement("div",{className:n+"-input-wrap",role:"spinbutton","aria-valuemin":t.min,"aria-valuemax":t.max,"aria-valuenow":l},Ss.a.createElement("input",us()({required:t.required,type:t.type,placeholder:t.placeholder,onClick:t.onClick,onMouseUp:this.onMouseUp,className:n+"-input",tabIndex:t.tabIndex,autoComplete:"off",onFocus:this.onFocus,onBlur:this.onBlur,onKeyDown:h?this.onKeyDown:ni,onKeyUp:h?this.onKeyUp:ni,autoFocus:t.autoFocus,maxLength:t.maxLength,readOnly:t.readOnly,disabled:t.disabled,max:t.max,min:t.min,step:t.step,name:t.name,id:t.id,onChange:this.onChange,ref:this.saveInput,value:y,pattern:t.pattern},p))))},t}(Ss.a.Component);ig.propTypes={value:ks.a.oneOfType([ks.a.number,ks.a.string]),defaultValue:ks.a.oneOfType([ks.a.number,ks.a.string]),focusOnUpDown:ks.a.bool,autoFocus:ks.a.bool,onChange:ks.a.func,onKeyDown:ks.a.func,onKeyUp:ks.a.func,prefixCls:ks.a.string,tabIndex:ks.a.oneOfType([ks.a.string,ks.a.number]),disabled:ks.a.bool,onFocus:ks.a.func,onBlur:ks.a.func,readOnly:ks.a.bool,max:ks.a.number,min:ks.a.number,step:ks.a.oneOfType([ks.a.number,ks.a.string]),upHandler:ks.a.node,downHandler:ks.a.node,useTouch:ks.a.bool,formatter:ks.a.func,parser:ks.a.func,onMouseEnter:ks.a.func,onMouseLeave:ks.a.func,onMouseOver:ks.a.func,onMouseOut:ks.a.func,onMouseUp:ks.a.func,precision:ks.a.number,required:ks.a.bool,pattern:ks.a.string},ig.defaultProps={focusOnUpDown:!0,useTouch:!1,prefixCls:"rc-input-number",min:-og,step:1,style:{},onChange:ni,onKeyDown:ni,onFocus:ni,onBlur:ni,parser:oi,required:!1};var ag=function(){var e=this;this.onKeyDown=function(t){for(var n=arguments.length,r=Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];var i=e.props.onKeyDown;if(t.keyCode===Xs.UP){var a=e.getRatio(t);e.up(t,a),e.stop()}else if(t.keyCode===Xs.DOWN){var c=e.getRatio(t);e.down(t,c),e.stop()}e.recordCursorPosition(),e.lastKeyCode=t.keyCode,i&&i.apply(void 0,[t].concat(r))},this.onKeyUp=function(t){for(var n=arguments.length,r=Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];var i=e.props.onKeyUp;e.stop(),e.recordCursorPosition(),i&&i.apply(void 0,[t].concat(r))},this.onChange=function(t){e.state.focused&&(e.inputting=!0);var n=e.props.parser(e.getValueFromEvent(t));e.setState({inputValue:n}),e.props.onChange(e.toNumberWhenUserInput(n))},this.onMouseUp=function(){var t=e.props.onMouseUp;e.recordCursorPosition(),t&&t.apply(void 0,arguments)},this.onFocus=function(){var t;e.setState({focused:!0}),(t=e.props).onFocus.apply(t,arguments)},this.onBlur=function(t){for(var n=arguments.length,r=Array(n>1?n-1:0),o=1;o<n;o++)r[o-1]=arguments[o];e.inputting=!1,e.setState({focused:!1});var i=e.getCurrentValidValue(e.state.inputValue);t.persist(),e.setValue(i,function(){var n;(n=e.props).onBlur.apply(n,[t].concat(r))})},this.getInputDisplayValue=function(){var t=e.state,n=t.focused,r=t.inputValue,o=t.value,i=void 0;return i=n?r:e.toPrecisionAsStep(o),void 0!==i&&null!==i||(i=""),i},this.recordCursorPosition=function(){try{e.cursorStart=e.input.selectionStart,e.cursorEnd=e.input.selectionEnd,e.currentValue=e.input.value,e.cursorBefore=e.input.value.substring(0,e.cursorStart),e.cursorAfter=e.input.value.substring(e.cursorEnd)}catch(e){}},this.restoreByAfter=function(t){if(void 0===t)return!1;var n=e.input.value,r=n.lastIndexOf(t);return-1!==r&&(r+t.length===n.length&&(e.fixCaret(r,r),!0))},this.partRestoreByAfter=function(t){return void 0!==t&&Array.prototype.some.call(t,function(n,r){var o=t.substring(r);return e.restoreByAfter(o)})},this.stop=function(){e.autoStepTimer&&clearTimeout(e.autoStepTimer)},this.down=function(t,n,r){e.pressingUpOrDown=!0,e.step("down",t,n,r)},this.up=function(t,n,r){e.pressingUpOrDown=!0,e.step("up",t,n,r)},this.saveUp=function(t){e.upHandler=t},this.saveDown=function(t){e.downHandler=t},this.saveInput=function(t){e.input=t}},cg=ig,sg=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},lg=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e,t=this,n=this.props,r=n.className,o=n.size,i=sg(n,["className","size"]),a=Ts()((e={},ss()(e,this.props.prefixCls+"-lg","large"===o),ss()(e,this.props.prefixCls+"-sm","small"===o),e),r),c=ws.createElement(Kp,{type:"up",className:this.props.prefixCls+"-handler-up-inner"}),s=ws.createElement(Kp,{type:"down",className:this.props.prefixCls+"-handler-down-inner"});return ws.createElement(cg,us()({ref:function(e){return t.inputNumberRef=e},className:a,upHandler:c,downHandler:s},i))}},{key:"focus",value:function(){this.inputNumberRef.focus()}},{key:"blur",value:function(){this.inputNumberRef.blur()}}]),t}(ws.Component),ug=lg;lg.defaultProps={prefixCls:"ant-input-number",step:1};var pg=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},fg=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e=this.props,t=e.prefixCls,n=e.className,r=e.children,o=pg(e,["prefixCls","className","children"]),i=Ts()(n,t);return ws.createElement("div",us()({className:i},o),r)}}]),t}(ws.Component),hg=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.state={siders:[]},e}return gs()(t,e),ds()(t,[{key:"getChildContext",value:function(){var e=this;return{siderHook:{addSider:function(t){e.setState({siders:[].concat(Ls()(e.state.siders),[t])})},removeSider:function(t){e.setState({siders:e.state.siders.filter(function(e){return e!==t})})}}}}},{key:"render",value:function(){var e=this.props,t=e.prefixCls,n=e.className,r=e.children,o=e.hasSider,i=pg(e,["prefixCls","className","children","hasSider"]),a=Ts()(n,t,ss()({},t+"-has-sider",o||this.state.siders.length>0));return ws.createElement("div",us()({className:a},i),r)}}]),t}(ws.Component);hg.childContextTypes={siderHook:zs.object};var dg=ii({prefixCls:"ant-layout"})(hg),vg=ii({prefixCls:"ant-layout-header"})(fg),mg=ii({prefixCls:"ant-layout-footer"})(fg),yg=ii({prefixCls:"ant-layout-content"})(fg);dg.Header=vg,dg.Footer=mg,dg.Content=yg;var gg=dg,bg=function(e){return!isNaN(parseFloat(e))&&isFinite(e)},Cg=bg,wg=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n};if("undefined"!=typeof window){var Sg=function(e){return{media:e,matches:!1,addListener:function(){},removeListener:function(){}}};window.matchMedia=window.matchMedia||Sg}var xg={xs:"480px",sm:"576px",md:"768px",lg:"992px",xl:"1200px",xxl:"1600px"},Mg=function(){var e=0;return function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return e+=1,""+t+e}}(),zg=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));n.responsiveHandler=function(e){n.setState({below:e.matches});var t=n.props.onBreakpoint;t&&t(e.matches),n.state.collapsed!==e.matches&&n.setCollapsed(e.matches,"responsive")},n.setCollapsed=function(e,t){"collapsed"in n.props||n.setState({collapsed:e});var r=n.props.onCollapse;r&&r(e,t)},n.toggle=function(){var e=!n.state.collapsed;n.setCollapsed(e,"clickTrigger")},n.belowShowChange=function(){n.setState({belowShow:!n.state.belowShow})},n.uniqueId=Mg("ant-sider-");var r=void 0;"undefined"!=typeof window&&(r=window.matchMedia),r&&e.breakpoint&&e.breakpoint in xg&&(n.mql=r("(max-width: "+xg[e.breakpoint]+")"));var o=void 0;return o="collapsed"in e?e.collapsed:e.defaultCollapsed,n.state={collapsed:o,below:!1},n}return gs()(t,e),ds()(t,[{key:"getChildContext",value:function(){return{siderCollapsed:this.state.collapsed,collapsedWidth:this.props.collapsedWidth}}},{key:"componentDidMount",value:function(){this.mql&&(this.mql.addListener(this.responsiveHandler),this.responsiveHandler(this.mql)),this.context.siderHook&&this.context.siderHook.addSider(this.uniqueId)}},{key:"componentWillUnmount",value:function(){this.mql&&this.mql.removeListener(this.responsiveHandler),this.context.siderHook&&this.context.siderHook.removeSider(this.uniqueId)}},{key:"render",value:function(){var e,t=this.props,n=t.prefixCls,r=t.className,o=t.theme,i=t.collapsible,a=t.reverseArrow,c=t.trigger,s=t.style,l=t.width,u=t.collapsedWidth,p=wg(t,["prefixCls","className","theme","collapsible","reverseArrow","trigger","style","width","collapsedWidth"]),f=Ps(p,["collapsed","defaultCollapsed","onCollapse","breakpoint","onBreakpoint"]),h=this.state.collapsed?u:l,d=Cg(h)?h+"px":String(h),v=0===parseFloat(String(u||0))?ws.createElement("span",{onClick:this.toggle,className:n+"-zero-width-trigger"},ws.createElement(Kp,{type:"bars"})):null,m={expanded:a?ws.createElement(Kp,{type:"right"}):ws.createElement(Kp,{type:"left"}),collapsed:a?ws.createElement(Kp,{type:"left"}):ws.createElement(Kp,{type:"right"})},y=this.state.collapsed?"collapsed":"expanded",g=m[y],b=null!==c?v||ws.createElement("div",{className:n+"-trigger",onClick:this.toggle,style:{width:d}},c||g):null,C=us()({},s,{flex:"0 0 "+d,maxWidth:d,minWidth:d,width:d}),w=Ts()(r,n,n+"-"+o,(e={},ss()(e,n+"-collapsed",!!this.state.collapsed),ss()(e,n+"-has-trigger",i&&null!==c&&!v),ss()(e,n+"-below",!!this.state.below),ss()(e,n+"-zero-width",0===parseFloat(d)),e));return ws.createElement("div",us()({className:w},f,{style:C}),ws.createElement("div",{className:n+"-children"},this.props.children),i||this.state.below&&v?b:null)}}],[{key:"getDerivedStateFromProps",value:function(e){return"collapsed"in e?{collapsed:e.collapsed}:null}}]),t}(ws.Component);zg.__ANT_LAYOUT_SIDER=!0,zg.defaultProps={prefixCls:"ant-layout-sider",collapsible:!1,defaultCollapsed:!1,reverseArrow:!1,width:200,collapsedWidth:80,style:{},theme:"dark"},zg.childContextTypes={siderCollapsed:zs.bool,collapsedWidth:zs.oneOfType([zs.number,zs.string])},zg.contextTypes={siderHook:zs.object},Object(Ys.polyfill)(zg);var kg=zg;gg.Sider=kg;var _g=gg,Og=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},Eg=null,Tg=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e)),r=e.spinning,o=e.delay;return n.state={spinning:r&&!ci(r,o)},n}return gs()(t,e),ds()(t,[{key:"isNestedPattern",value:function(){return!(!this.props||!this.props.children)}},{key:"componentDidMount",value:function(){var e=this,t=this.props,n=t.spinning,r=t.delay;ci(n,r)&&(this.delayTimeout=window.setTimeout(function(){return e.setState({spinning:n})},r))}},{key:"componentWillUnmount",value:function(){this.debounceTimeout&&clearTimeout(this.debounceTimeout),this.delayTimeout&&clearTimeout(this.delayTimeout)}},{key:"componentWillReceiveProps",value:function(e){var t=this,n=this.props.spinning,r=e.spinning,o=this.props.delay;this.debounceTimeout&&clearTimeout(this.debounceTimeout),n&&!r?(this.debounceTimeout=window.setTimeout(function(){return t.setState({spinning:r})},200),this.delayTimeout&&clearTimeout(this.delayTimeout)):r&&o&&!isNaN(Number(o))?(this.delayTimeout&&clearTimeout(this.delayTimeout),this.delayTimeout=window.setTimeout(function(){return t.setState({spinning:r})},o)):this.setState({spinning:r})}},{key:"render",value:function(){var e,t=this.props,n=t.className,r=t.size,o=t.prefixCls,i=t.tip,a=t.wrapperClassName,c=Og(t,["className","size","prefixCls","tip","wrapperClassName"]),s=this.state.spinning,l=Ts()(o,(e={},ss()(e,o+"-sm","small"===r),ss()(e,o+"-lg","large"===r),ss()(e,o+"-spinning",s),ss()(e,o+"-show-text",!!i),e),n),u=Ps(c,["spinning","delay","indicator"]),p=ws.createElement("div",us()({},u,{className:l}),ai(this.props),i?ws.createElement("div",{className:o+"-text"},i):null);if(this.isNestedPattern()){var f,h=o+"-nested-loading";a&&(h+=" "+a);var d=Ts()((f={},ss()(f,o+"-container",!0),ss()(f,o+"-blur",s),f));return ws.createElement(Ml,us()({},u,{component:"div",className:h,style:null,transitionName:"fade"}),s&&ws.createElement("div",{key:"loading"},p),ws.createElement("div",{className:d,key:"container"},this.props.children))}return p}}],[{key:"setDefaultIndicator",value:function(e){Eg=e}}]),t}(ws.Component);Tg.defaultProps={prefixCls:"ant-spin",spinning:!0,size:"default",wrapperClassName:""},Tg.propTypes={prefixCls:zs.string,className:zs.string,spinning:zs.bool,size:zs.oneOf(["small","default","large"]),wrapperClassName:zs.string,indicator:zs.node};var Ng=Tg,Vg=function(e){var t=e.rootPrefixCls+"-item",n=t+" "+t+"-"+e.page;e.active&&(n=n+" "+t+"-active"),e.className&&(n=n+" "+e.className);var r=function(){e.onClick(e.page)},o=function(t){e.onKeyPress(t,e.onClick,e.page)};return Ss.a.createElement("li",{title:e.showTitle?e.page:null,className:n,onClick:r,onKeyPress:o,tabIndex:"0"},e.itemRender(e.page,"page",Ss.a.createElement("a",null,e.page)))};Vg.propTypes={page:ks.a.number,active:ks.a.bool,last:ks.a.bool,locale:ks.a.object,className:ks.a.string,showTitle:ks.a.bool,rootPrefixCls:ks.a.string,onClick:ks.a.func,onKeyPress:ks.a.func,itemRender:ks.a.func};var Pg=Vg,Hg={ZERO:48,NINE:57,NUMPAD_ZERO:96,NUMPAD_NINE:105,BACKSPACE:8,DELETE:46,ENTER:13,ARROW_UP:38,ARROW_DOWN:40},Lg=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.buildOptionText=function(e){return e+" "+n.props.locale.items_per_page},n.changeSize=function(e){n.props.changeSize(Number(e))},n.handleChange=function(e){n.setState({goInputText:e.target.value})},n.go=function(e){var t=n.state.goInputText;""!==t&&(t=isNaN(t)?n.props.current:Number(t),e.keyCode!==Hg.ENTER&&"click"!==e.type||(n.setState({goInputText:""}),n.props.quickGo(t)))},n.state={goInputText:""},n}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e=this.props,t=this.state,n=e.locale,r=e.rootPrefixCls+"-options",o=e.changeSize,i=e.quickGo,a=e.goButton,c=e.buildOptionText||this.buildOptionText,s=e.selectComponentClass,l=null,u=null,p=null;if(!o&&!i)return null;if(o&&s){var f=s.Option,h=e.pageSize||e.pageSizeOptions[0],d=e.pageSizeOptions.map(function(e,t){return Ss.a.createElement(f,{key:t,value:e},c(e))});l=Ss.a.createElement(s,{prefixCls:e.selectPrefixCls,showSearch:!1,className:r+"-size-changer",optionLabelProp:"children",dropdownMatchSelectWidth:!1,value:h.toString(),onChange:this.changeSize,getPopupContainer:function(e){return e.parentNode}},d)}return i&&(a&&(p="boolean"==typeof a?Ss.a.createElement("button",{type:"button",onClick:this.go,onKeyUp:this.go},n.jump_to_confirm):Ss.a.createElement("span",{onClick:this.go,onKeyUp:this.go},a)),u=Ss.a.createElement("div",{className:r+"-quick-jumper"},n.jump_to,Ss.a.createElement("input",{type:"text",value:t.goInputText,onChange:this.handleChange,onKeyUp:this.go}),n.page,p)),Ss.a.createElement("li",{className:""+r},l,u)}}]),t}(Ss.a.Component);Lg.propTypes={changeSize:ks.a.func,quickGo:ks.a.func,selectComponentClass:ks.a.func,current:ks.a.number,pageSizeOptions:ks.a.arrayOf(ks.a.string),pageSize:ks.a.number,buildOptionText:ks.a.func,locale:ks.a.object},Lg.defaultProps={pageSizeOptions:["10","20","30","40"]};var Dg=Lg,Ag=n(228),Ig=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));Rg.call(n);var r=e.onChange!==si;"current"in e&&!r&&console.warn("Warning: You provided a `current` prop to a Pagination component without an `onChange` handler. This will render a read-only component.");var o=e.defaultCurrent;"current"in e&&(o=e.current);var i=e.defaultPageSize;return"pageSize"in e&&(i=e.pageSize),n.state={current:o,currentInputValue:o,pageSize:i},n}return gs()(t,e),ds()(t,[{key:"componentWillReceiveProps",value:function(e){if("current"in e&&this.setState({current:e.current,currentInputValue:e.current}),"pageSize"in e){var t={},n=this.state.current,r=this.calculatePage(e.pageSize);n=n>r?r:n,"current"in e||(t.current=n,t.currentInputValue=n),t.pageSize=e.pageSize,this.setState(t)}}},{key:"componentDidUpdate",value:function(e,t){var n=this.props.prefixCls;if(t.current!==this.state.current&&this.paginationNode){var r=this.paginationNode.querySelector("."+n+"-item-"+t.current);r&&document.activeElement===r&&r.blur()}}},{key:"getJumpPrevPage",value:function(){return Math.max(1,this.state.current-(this.props.showLessItems?3:5))}},{key:"getJumpNextPage",value:function(){return Math.min(this.calculatePage(),this.state.current+(this.props.showLessItems?3:5))}},{key:"getJumpPrevPage",value:function(){return Math.max(1,this.state.current-(this.props.showLessItems?3:5))}},{key:"getJumpNextPage",value:function(){return Math.min(this.calculatePage(),this.state.current+(this.props.showLessItems?3:5))}},{key:"render",value:function(){if(!0===this.props.hideOnSinglePage&&this.props.total<=this.state.pageSize)return null;var e=this.props,t=e.locale,n=e.prefixCls,r=this.calculatePage(),o=[],i=null,a=null,c=null,s=null,l=null,u=e.showQuickJumper&&e.showQuickJumper.goButton,p=e.showLessItems?1:2,f=this.state,h=f.current,d=f.pageSize,v=h-1>0?h-1:0,m=h+1<r?h+1:r,y=Object.keys(e).reduce(function(t,n){return"data-"!==n.substr(0,5)&&"aria-"!==n.substr(0,5)&&"role"!==n||(t[n]=e[n]),t},{});if(e.simple)return u&&(l="boolean"==typeof u?Ss.a.createElement("button",{type:"button",onClick:this.handleGoTO,onKeyUp:this.handleGoTO},t.jump_to_confirm):Ss.a.createElement("span",{onClick:this.handleGoTO,onKeyUp:this.handleGoTO},u),l=Ss.a.createElement("li",{title:e.showTitle?""+t.jump_to+this.state.current+"/"+r:null,className:n+"-simple-pager"},l)),Ss.a.createElement("ul",us()({className:n+" "+n+"-simple "+e.className,style:e.style,ref:this.savePaginationNode},y),Ss.a.createElement("li",{title:e.showTitle?t.prev_page:null,onClick:this.prev,tabIndex:this.hasPrev()?0:null,onKeyPress:this.runIfEnterPrev,className:(this.hasPrev()?"":n+"-disabled")+" "+n+"-prev","aria-disabled":!this.hasPrev()},e.itemRender(v,"prev",this.getItemIcon(e.prevIcon))),Ss.a.createElement("li",{title:e.showTitle?this.state.current+"/"+r:null,className:n+"-simple-pager"},Ss.a.createElement("input",{type:"text",value:this.state.currentInputValue,onKeyDown:this.handleKeyDown,onKeyUp:this.handleKeyUp,onChange:this.handleKeyUp,size:"3"}),Ss.a.createElement("span",{className:n+"-slash"},"\uff0f"),r),Ss.a.createElement("li",{title:e.showTitle?t.next_page:null,onClick:this.next,tabIndex:this.hasPrev()?0:null,onKeyPress:this.runIfEnterNext,className:(this.hasNext()?"":n+"-disabled")+" "+n+"-next","aria-disabled":!this.hasNext()},e.itemRender(m,"next",this.getItemIcon(e.nextIcon))),l);if(r<=5+2*p)for(var g=1;g<=r;g++){var b=this.state.current===g;o.push(Ss.a.createElement(Pg,{locale:t,rootPrefixCls:n,onClick:this.handleChange,onKeyPress:this.runIfEnter,key:g,page:g,active:b,showTitle:e.showTitle,itemRender:e.itemRender}))}else{var C=e.showLessItems?t.prev_3:t.prev_5,w=e.showLessItems?t.next_3:t.next_5;if(e.showPrevNextJumpers){var S=n+"-jump-prev";e.jumpPrevIcon&&(S+=" "+n+"-jump-prev-custom-icon"),i=Ss.a.createElement("li",{title:e.showTitle?C:null,key:"prev",onClick:this.jumpPrev,tabIndex:"0",onKeyPress:this.runIfEnterJumpPrev,className:S},e.itemRender(this.getJumpPrevPage(),"jump-prev",this.getItemIcon(e.jumpPrevIcon)));var x=n+"-jump-next";e.jumpNextIcon&&(x+=" "+n+"-jump-next-custom-icon"),a=Ss.a.createElement("li",{title:e.showTitle?w:null,key:"next",tabIndex:"0",onClick:this.jumpNext,onKeyPress:this.runIfEnterJumpNext,className:x},e.itemRender(this.getJumpNextPage(),"jump-next",this.getItemIcon(e.jumpNextIcon)))}s=Ss.a.createElement(Pg,{locale:e.locale,last:!0,rootPrefixCls:n,onClick:this.handleChange,onKeyPress:this.runIfEnter,key:r,page:r,active:!1,showTitle:e.showTitle,itemRender:e.itemRender}),c=Ss.a.createElement(Pg,{locale:e.locale,rootPrefixCls:n,onClick:this.handleChange,onKeyPress:this.runIfEnter,key:1,page:1,active:!1,showTitle:e.showTitle,itemRender:e.itemRender});var M=Math.max(1,h-p),z=Math.min(h+p,r);h-1<=p&&(z=1+2*p),r-h<=p&&(M=r-2*p);for(var k=M;k<=z;k++){var _=h===k;o.push(Ss.a.createElement(Pg,{locale:e.locale,rootPrefixCls:n,onClick:this.handleChange,onKeyPress:this.runIfEnter,key:k,page:k,active:_,showTitle:e.showTitle,itemRender:e.itemRender}))}h-1>=2*p&&3!==h&&(o[0]=Ss.a.cloneElement(o[0],{className:n+"-item-after-jump-prev"}),o.unshift(i)),r-h>=2*p&&h!==r-2&&(o[o.length-1]=Ss.a.cloneElement(o[o.length-1],{className:n+"-item-before-jump-next"}),o.push(a)),1!==M&&o.unshift(c),z!==r&&o.push(s)}var O=null;e.showTotal&&(O=Ss.a.createElement("li",{className:n+"-total-text"},e.showTotal(e.total,[(h-1)*d+1,h*d>e.total?e.total:h*d])));var E=!this.hasPrev(),T=!this.hasNext();return Ss.a.createElement("ul",us()({className:n+" "+e.className,style:e.style,unselectable:"unselectable",ref:this.savePaginationNode},y),O,Ss.a.createElement("li",{title:e.showTitle?t.prev_page:null,onClick:this.prev,tabIndex:E?null:0,onKeyPress:this.runIfEnterPrev,className:(E?n+"-disabled":"")+" "+n+"-prev","aria-disabled":E},e.itemRender(v,"prev",this.getItemIcon(e.prevIcon))),o,Ss.a.createElement("li",{title:e.showTitle?t.next_page:null,onClick:this.next,tabIndex:T?null:0,onKeyPress:this.runIfEnterNext,className:(T?n+"-disabled":"")+" "+n+"-next","aria-disabled":T},e.itemRender(m,"next",this.getItemIcon(e.nextIcon))),Ss.a.createElement(Dg,{locale:e.locale,rootPrefixCls:n,selectComponentClass:e.selectComponentClass,selectPrefixCls:e.selectPrefixCls,changeSize:this.props.showSizeChanger?this.changePageSize:null,current:this.state.current,pageSize:this.state.pageSize,pageSizeOptions:this.props.pageSizeOptions,quickGo:this.props.showQuickJumper?this.handleChange:null,goButton:u}))}}]),t}(Ss.a.Component);Ig.propTypes={prefixCls:ks.a.string,current:ks.a.number,defaultCurrent:ks.a.number,total:ks.a.number,pageSize:ks.a.number,defaultPageSize:ks.a.number,onChange:ks.a.func,hideOnSinglePage:ks.a.bool,showSizeChanger:ks.a.bool,showLessItems:ks.a.bool,onShowSizeChange:ks.a.func,selectComponentClass:ks.a.func,showPrevNextJumpers:ks.a.bool,showQuickJumper:ks.a.oneOfType([ks.a.bool,ks.a.object]),showTitle:ks.a.bool,pageSizeOptions:ks.a.arrayOf(ks.a.string),showTotal:ks.a.func,locale:ks.a.object,style:ks.a.object,itemRender:ks.a.func,prevIcon:ks.a.oneOfType([ks.a.func,ks.a.node]),nextIcon:ks.a.oneOfType([ks.a.func,ks.a.node]),jumpPrevIcon:ks.a.oneOfType([ks.a.func,ks.a.node]),jumpNextIcon:ks.a.oneOfType([ks.a.func,ks.a.node])},Ig.defaultProps={defaultCurrent:1,total:0,defaultPageSize:10,onChange:si,className:"",selectPrefixCls:"rc-select",prefixCls:"rc-pagination",selectComponentClass:null,hideOnSinglePage:!1,showPrevNextJumpers:!0,showQuickJumper:!1,showSizeChanger:!1,showLessItems:!1,showTitle:!0,onShowSizeChange:si,locale:Ag.a,style:{},itemRender:ui};var Rg=function(){var e=this;this.getItemIcon=function(t){var n=e.props.prefixCls,r=t||Ss.a.createElement("a",{className:n+"-item-link"});return"function"==typeof t&&(r=Ss.a.createElement(t,us()({},e.props))),r},this.savePaginationNode=function(t){e.paginationNode=t},this.calculatePage=function(t){var n=t;return void 0===n&&(n=e.state.pageSize),Math.floor((e.props.total-1)/n)+1},this.isValid=function(t){return li(t)&&t>=1&&t!==e.state.current},this.handleKeyDown=function(e){e.keyCode!==Hg.ARROW_UP&&e.keyCode!==Hg.ARROW_DOWN||e.preventDefault()},this.handleKeyUp=function(t){var n=t.target.value,r=e.state.currentInputValue,o=void 0;o=""===n?n:isNaN(Number(n))?r:Number(n),o!==r&&e.setState({currentInputValue:o}),t.keyCode===Hg.ENTER?e.handleChange(o):t.keyCode===Hg.ARROW_UP?e.handleChange(o-1):t.keyCode===Hg.ARROW_DOWN&&e.handleChange(o+1)},this.changePageSize=function(t){var n=e.state.current,r=e.calculatePage(t);n=n>r?r:n,0===r&&(n=e.state.current),"number"==typeof t&&("pageSize"in e.props||e.setState({pageSize:t}),"current"in e.props||e.setState({current:n,currentInputValue:n})),e.props.onShowSizeChange(n,t)},this.handleChange=function(t){var n=t;if(e.isValid(n)){n>e.calculatePage()&&(n=e.calculatePage()),"current"in e.props||e.setState({current:n,currentInputValue:n});var r=e.state.pageSize;return e.props.onChange(n,r),n}return e.state.current},this.prev=function(){e.hasPrev()&&e.handleChange(e.state.current-1)},this.next=function(){e.hasNext()&&e.handleChange(e.state.current+1)},this.jumpPrev=function(){e.handleChange(e.getJumpPrevPage())},this.jumpNext=function(){e.handleChange(e.getJumpNextPage())},this.hasPrev=function(){return e.state.current>1},this.hasNext=function(){return e.state.current<e.calculatePage()},this.runIfEnter=function(e,t){for(var n=arguments.length,r=Array(n>2?n-2:0),o=2;o<n;o++)r[o-2]=arguments[o];"Enter"!==e.key&&13!==e.charCode||t.apply(void 0,r)},this.runIfEnterPrev=function(t){e.runIfEnter(t,e.prev)},this.runIfEnterNext=function(t){e.runIfEnter(t,e.next)},this.runIfEnterJumpPrev=function(t){e.runIfEnter(t,e.jumpPrev)},this.runIfEnterJumpNext=function(t){e.runIfEnter(t,e.jumpNext)},this.handleGoTO=function(t){t.keyCode!==Hg.ENTER&&"click"!==t.type||e.handleChange(e.state.currentInputValue)}},jg=Ig,Fg=n(165),Kg=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"render",value:function(){return ws.createElement(qp,us()({size:"small"},this.props))}}]),t}(ws.Component),Bg=Kg;Kg.Option=qp.Option;var Wg=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},Ug=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.getIconsProps=function(){var t=e.props.prefixCls;return{prevIcon:ws.createElement("a",{className:t+"-item-link"},ws.createElement(Kp,{type:"left"})),nextIcon:ws.createElement("a",{className:t+"-item-link"},ws.createElement(Kp,{type:"right"})),jumpPrevIcon:ws.createElement("a",{className:t+"-item-link"},ws.createElement("div",{className:t+"-item-container"},ws.createElement(Kp,{className:t+"-item-link-icon",type:"double-left"}),ws.createElement("span",{className:t+"-item-ellipsis"},"\u2022\u2022\u2022"))),jumpNextIcon:ws.createElement("a",{className:t+"-item-link"},ws.createElement("div",{className:t+"-item-container"},ws.createElement(Kp,{className:t+"-item-link-icon",type:"double-right"}),ws.createElement("span",{className:t+"-item-ellipsis"},"\u2022\u2022\u2022")))}},e.renderPagination=function(t){var n=e.props,r=n.className,o=n.size,i=n.locale,a=Wg(n,["className","size","locale"]),c=us()({},t,i),s="small"===o;return ws.createElement(jg,us()({},a,e.getIconsProps(),{className:Ts()(r,{mini:s}),selectComponentClass:s?Bg:qp,locale:c}))},e}return gs()(t,e),ds()(t,[{key:"render",value:function(){return ws.createElement(xp,{componentName:"Pagination",defaultLocale:Fg.a},this.renderPagination)}}]),t}(ws.Component),qg=Ug;Ug.defaultProps={prefixCls:"ant-pagination",selectPrefixCls:"ant-select"};var Yg=qg,Gg=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},Xg=function(e){var t=e.prefixCls,n=void 0===t?"ant-list":t,r=e.className,o=e.avatar,i=e.title,a=e.description,c=Gg(e,["prefixCls","className","avatar","title","description"]),s=Ts()(n+"-item-meta",r),l=ws.createElement("div",{className:n+"-item-meta-content"},i&&ws.createElement("h4",{className:n+"-item-meta-title"},i),a&&ws.createElement("div",{className:n+"-item-meta-description"},a));return ws.createElement("div",us()({},c,{className:s}),o&&ws.createElement("div",{className:n+"-item-meta-avatar"},o),(i||a)&&l)},$g=["",1,2,3,4,6,8,12,24],Jg=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e=this.context.grid,t=this.props,n=t.prefixCls,r=void 0===n?"ant-list":n,o=t.children,i=t.actions,a=t.extra,c=t.className,s=Gg(t,["prefixCls","children","actions","extra","className"]),l=Ts()(r+"-item",c),u=[],p=[];ws.Children.forEach(o,function(e){e&&e.type&&e.type===Xg?u.push(e):p.push(e)});var f=Ts()(r+"-item-content",ss()({},r+"-item-content-single",u.length<1)),h=p.length>0?ws.createElement("div",{className:f},p):null,d=void 0;if(i&&i.length>0){var v=function(e,t){return ws.createElement("li",{key:r+"-item-action-"+t},e,t!==i.length-1&&ws.createElement("em",{className:r+"-item-action-split"}))};d=ws.createElement("ul",{className:r+"-item-action"},i.map(function(e,t){return v(e,t)}))}var m=ws.createElement("div",{className:r+"-item-extra-wrap"},ws.createElement("div",{className:r+"-item-main"},u,h,d),ws.createElement("div",{className:r+"-item-extra"},a));return e?ws.createElement(ld,{span:pi(e,"column"),xs:pi(e,"xs"),sm:pi(e,"sm"),md:pi(e,"md"),lg:pi(e,"lg"),xl:pi(e,"xl"),xxl:pi(e,"xxl")},ws.createElement("div",us()({},s,{className:l}),a&&m,!a&&u,!a&&h,!a&&d)):ws.createElement("div",us()({},s,{className:l}),a&&m,!a&&u,!a&&h,!a&&d)}}]),t}(ws.Component),Zg=Jg;Jg.Meta=Xg,Jg.propTypes={column:zs.oneOf($g),xs:zs.oneOf($g),sm:zs.oneOf($g),md:zs.oneOf($g),lg:zs.oneOf($g),xl:zs.oneOf($g),xxl:zs.oneOf($g)},Jg.contextTypes={grid:zs.any};var Qg=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},eb=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.state={paginationCurrent:1},e.defaultPaginationProps={current:1,pageSize:10,onChange:function(t,n){var r=e.props.pagination;e.setState({paginationCurrent:t}),r&&r.onChange&&r.onChange(t,n)},total:0},e.keys={},e.renderItem=function(t,n){var r=e.props,o=r.dataSource,i=r.renderItem,a=r.rowKey,c=void 0;return c="function"==typeof a?a(o[n]):"string"==typeof a?o[a]:o.key,c||(c="list-item-"+n),e.keys[n]=c,i(t,n)},e.renderEmpty=function(t){var n=us()({},t,e.props.locale);return ws.createElement("div",{className:e.props.prefixCls+"-empty-text"},n.emptyText)},e}return gs()(t,e),ds()(t,[{key:"getChildContext",value:function(){return{grid:this.props.grid}}},{key:"isSomethingAfterLastItem",value:function(){var e=this.props,t=e.loadMore,n=e.pagination,r=e.footer;return!!(t||n||r)}},{key:"render",value:function(){var e,t=this,n=this.state.paginationCurrent,r=this.props,o=r.bordered,i=r.split,a=r.className,c=r.children,s=r.itemLayout,l=r.loadMore,u=r.pagination,p=r.prefixCls,f=r.grid,h=r.dataSource,d=r.size,v=(r.rowKey,r.renderItem,r.header),m=r.footer,y=r.loading,g=(r.locale,Qg(r,["bordered","split","className","children","itemLayout","loadMore","pagination","prefixCls","grid","dataSource","size","rowKey","renderItem","header","footer","loading","locale"])),b=y;"boolean"==typeof b&&(b={spinning:b});var C=b&&b.spinning,w="";switch(d){case"large":w="lg";break;case"small":w="sm"}var S=Ts()(p,a,(e={},ss()(e,p+"-vertical","vertical"===s),ss()(e,p+"-"+w,w),ss()(e,p+"-split",i),ss()(e,p+"-bordered",o),ss()(e,p+"-loading",C),ss()(e,p+"-grid",f),ss()(e,p+"-something-after-last-item",this.isSomethingAfterLastItem()),e)),x=us()({},this.defaultPaginationProps,{total:h.length,current:n},u||{}),M=Math.ceil(x.total/x.pageSize);x.current>M&&(x.current=M);var z=u?ws.createElement("div",{className:p+"-pagination"},ws.createElement(Yg,us()({},x,{onChange:this.defaultPaginationProps.onChange}))):null,k=[].concat(Ls()(h));u&&h.length>(x.current-1)*x.pageSize&&(k=[].concat(Ls()(h)).splice((x.current-1)*x.pageSize,x.pageSize));var _=void 0;if(_=C&&ws.createElement("div",{style:{minHeight:53}}),k.length>0){var O=k.map(function(e,n){return t.renderItem(e,n)}),E=[];ws.Children.forEach(O,function(e,n){E.push(ws.cloneElement(e,{key:t.keys[n]}))}),_=f?ws.createElement(od,{gutter:f.gutter},E):E}else c||C||(_=ws.createElement(xp,{componentName:"Table",defaultLocale:Mp.a.Table},this.renderEmpty));var T=x.position||"bottom";return ws.createElement("div",us()({className:S},g),("top"===T||"both"===T)&&z,v&&ws.createElement("div",{className:p+"-header"},v),ws.createElement(Ng,b,_,c),m&&ws.createElement("div",{className:p+"-footer"},m),l||("bottom"===T||"both"===T)&&z)}}]),t}(ws.Component),tb=eb;eb.Item=Zg,eb.childContextTypes={grid:zs.any},eb.defaultProps={dataSource:[],prefixCls:"ant-list",bordered:!1,split:!0,loading:!1,pagination:!1};var nb=us()({},Mp.a.Modal),rb=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return di(e.locale),fi(e.locale&&e.locale.Modal),n}return gs()(t,e),ds()(t,[{key:"getChildContext",value:function(){return{antLocale:us()({},this.props.locale,{exist:!0})}}},{key:"componentWillReceiveProps",value:function(e){this.props.locale!==e.locale&&di(e.locale)}},{key:"componentDidUpdate",value:function(){var e=this.props.locale;fi(e&&e.Modal)}},{key:"componentWillUnmount",value:function(){fi()}},{key:"render",value:function(){return ws.Children.only(this.props.children)}}]),t}(ws.Component),ob=rb;rb.propTypes={locale:zs.object},rb.defaultProps={locale:{}},rb.childContextTypes={antLocale:zs.object};var ib=function(e){function t(){var e,n,r,o;fs()(this,t);for(var i=arguments.length,a=Array(i),c=0;c<i;c++)a[c]=arguments[c];return n=r=ms()(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(a))),r.close=function(){r.clearCloseTimer(),r.props.onClose()},r.startCloseTimer=function(){r.props.duration&&(r.closeTimer=setTimeout(function(){r.close()},1e3*r.props.duration))},r.clearCloseTimer=function(){r.closeTimer&&(clearTimeout(r.closeTimer),r.closeTimer=null)},o=n,ms()(r,o)}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){this.startCloseTimer()}},{key:"componentDidUpdate",value:function(e){(this.props.duration!==e.duration||this.props.update)&&this.restartCloseTimer()}},{key:"componentWillUnmount",value:function(){this.clearCloseTimer()}},{key:"restartCloseTimer",value:function(){this.clearCloseTimer(),this.startCloseTimer()}},{key:"render",value:function(){var e,t=this.props,n=t.prefixCls+"-notice",r=(e={},ss()(e,""+n,1),ss()(e,n+"-closable",t.closable),ss()(e,t.className,!!t.className),e);return Ss.a.createElement("div",{className:Ts()(r),style:t.style,onMouseEnter:this.clearCloseTimer,onMouseLeave:this.startCloseTimer},Ss.a.createElement("div",{className:n+"-content"},t.children),t.closable?Ss.a.createElement("a",{tabIndex:"0",onClick:this.close,className:n+"-close"},t.closeIcon||Ss.a.createElement("span",{className:n+"-close-x"})):null)}}]),t}(ws.Component);ib.propTypes={duration:ks.a.number,onClose:ks.a.func,children:ks.a.any,update:ks.a.bool,closeIcon:ks.a.node},ib.defaultProps={onEnd:function(){},onClose:function(){},duration:1.5,style:{right:"50%"}};var ab=ib,cb=0,sb=Date.now(),lb=function(e){function t(){var e,n,r,o;fs()(this,t);for(var i=arguments.length,a=Array(i),c=0;c<i;c++)a[c]=arguments[c];return n=r=ms()(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(a))),r.state={notices:[]},r.add=function(e){var t=e.key=e.key||vi(),n=r.props.maxCount;r.setState(function(r){var o=r.notices,i=o.map(function(e){return e.key}).indexOf(t),a=o.concat();return-1!==i?a.splice(i,1,e):(n&&o.length>=n&&(e.updateKey=a[0].updateKey||a[0].key,a.shift()),a.push(e)),{notices:a}})},r.remove=function(e){r.setState(function(t){return{notices:t.notices.filter(function(t){return t.key!==e})}})},o=n,ms()(r,o)}return gs()(t,e),ds()(t,[{key:"getTransitionName",value:function(){var e=this.props,t=e.transitionName;return!t&&e.animation&&(t=e.prefixCls+"-"+e.animation),t}},{key:"render",value:function(){var e,t=this,n=this.props,r=this.state.notices,o=r.map(function(e,o){var i=Boolean(o===r.length-1&&e.updateKey),a=e.updateKey?e.updateKey:e.key,c=T(t.remove.bind(t,e.key),e.onClose);return Ss.a.createElement(ab,us()({prefixCls:n.prefixCls},e,{key:a,update:i,onClose:c,closeIcon:n.closeIcon}),e.content)}),i=(e={},ss()(e,n.prefixCls,1),ss()(e,n.className,!!n.className),e);return Ss.a.createElement("div",{className:Ts()(i),style:n.style},Ss.a.createElement(Ml,{transitionName:this.getTransitionName()},o))}}]),t}(ws.Component);lb.propTypes={prefixCls:ks.a.string,transitionName:ks.a.string,animation:ks.a.oneOfType([ks.a.string,ks.a.object]),style:ks.a.object,maxCount:ks.a.number,closeIcon:ks.a.node},lb.defaultProps={prefixCls:"rc-notification",animation:"fade",style:{top:65,left:"50%"}},lb.newInstance=function(e,t){function n(e){c||(c=!0,t({notice:function(t){e.add(t)},removeNotice:function(t){e.remove(t)},component:e,destroy:function(){Ms.a.unmountComponentAtNode(a),a.parentNode.removeChild(a)}}))}var r=e||{},o=r.getContainer,i=kl()(r,["getContainer"]),a=document.createElement("div");if(o){o().appendChild(a)}else document.body.appendChild(a);var c=!1;Ms.a.render(Ss.a.createElement(lb,us()({},i,{ref:n})),a)};var ub=lb,pb=ub,fb=3,hb=void 0,db=void 0,vb=1,mb="ant-message",yb="move-up",gb=void 0,bb=void 0,Cb={open:yi,config:function(e){void 0!==e.top&&(hb=e.top,db=null),void 0!==e.duration&&(fb=e.duration),void 0!==e.prefixCls&&(mb=e.prefixCls),void 0!==e.getContainer&&(gb=e.getContainer),void 0!==e.transitionName&&(yb=e.transitionName,db=null),void 0!==e.maxCount&&(bb=e.maxCount,db=null)},destroy:function(){db&&(db.destroy(),db=null)}};["success","info","warning","error","loading"].forEach(function(e){Cb[e]=function(t,n,r){return"function"==typeof n&&(r=n,n=void 0),Cb.open({content:t,duration:n,type:e,onClose:r})}}),Cb.warn=Cb.warning;var wb=Cb,Sb=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.onKeyDown=function(t){e.subMenu.onKeyDown(t)},e.saveSubMenu=function(t){e.subMenu=t},e}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e=this.props,t=e.rootPrefixCls,n=e.className,r=this.context.antdMenuTheme;return ws.createElement(Au,us()({},this.props,{ref:this.saveSubMenu,popupClassName:Ts()(t+"-"+r,n)}))}}]),t}(ws.Component);Sb.contextTypes={antdMenuTheme:zs.string},Sb.isSubMenu=1;var xb=Sb,Mb={adjustX:1,adjustY:1},zb=[0,0],kb={left:{points:["cr","cl"],overflow:Mb,offset:[-4,0],targetOffset:zb},right:{points:["cl","cr"],overflow:Mb,offset:[4,0],targetOffset:zb},top:{points:["bc","tc"],overflow:Mb,offset:[0,-4],targetOffset:zb},bottom:{points:["tc","bc"],overflow:Mb,offset:[0,4],targetOffset:zb},topLeft:{points:["bl","tl"],overflow:Mb,offset:[0,-4],targetOffset:zb},leftTop:{points:["tr","tl"],overflow:Mb,offset:[-4,0],targetOffset:zb},topRight:{points:["br","tr"],overflow:Mb,offset:[0,-4],targetOffset:zb},rightTop:{points:["tl","tr"],overflow:Mb,offset:[4,0],targetOffset:zb},bottomRight:{points:["tr","br"],overflow:Mb,offset:[0,4],targetOffset:zb},rightBottom:{points:["bl","br"],overflow:Mb,offset:[4,0],targetOffset:zb},bottomLeft:{points:["tl","bl"],overflow:Mb,offset:[0,4],targetOffset:zb},leftBottom:{points:["br","bl"],overflow:Mb,offset:[-4,0],targetOffset:zb}},_b=function(e){function t(){return fs()(this,t),ms()(this,e.apply(this,arguments))}return gs()(t,e),t.prototype.componentDidUpdate=function(){var e=this.props.trigger;e&&e.forcePopupAlign()},t.prototype.render=function(){var e=this.props,t=e.overlay,n=e.prefixCls,r=e.id;return Ss.a.createElement("div",{className:n+"-inner",id:r,role:"tooltip"},"function"==typeof t?t():t)},t}(Ss.a.Component);_b.propTypes={prefixCls:ks.a.string,overlay:ks.a.oneOfType([ks.a.node,ks.a.func]).isRequired,id:ks.a.string,trigger:ks.a.any};var Ob=_b,Eb=function(e){function t(){var n,r,o;fs()(this,t);for(var i=arguments.length,a=Array(i),c=0;c<i;c++)a[c]=arguments[c];return n=r=ms()(this,e.call.apply(e,[this].concat(a))),r.getPopupElement=function(){var e=r.props,t=e.arrowContent,n=e.overlay,o=e.prefixCls,i=e.id;return[Ss.a.createElement("div",{className:o+"-arrow",key:"arrow"},t),Ss.a.createElement(Ob,{key:"content",trigger:r.trigger,prefixCls:o,id:i,overlay:n})]},r.saveTrigger=function(e){r.trigger=e},o=n,ms()(r,o)}return gs()(t,e),t.prototype.getPopupDomNode=function(){return this.trigger.getPopupDomNode()},t.prototype.render=function(){var e=this.props,t=e.overlayClassName,n=e.trigger,r=e.mouseEnterDelay,o=e.mouseLeaveDelay,i=e.overlayStyle,a=e.prefixCls,c=e.children,s=e.onVisibleChange,l=e.afterVisibleChange,u=e.transitionName,p=e.animation,f=e.placement,h=e.align,d=e.destroyTooltipOnHide,v=e.defaultVisible,m=e.getTooltipContainer,y=kl()(e,["overlayClassName","trigger","mouseEnterDelay","mouseLeaveDelay","overlayStyle","prefixCls","children","onVisibleChange","afterVisibleChange","transitionName","animation","placement","align","destroyTooltipOnHide","defaultVisible","getTooltipContainer"]),g=us()({},y);return"visible"in this.props&&(g.popupVisible=this.props.visible),Ss.a.createElement(_u,us()({popupClassName:t,ref:this.saveTrigger,prefixCls:a,popup:this.getPopupElement,action:n,builtinPlacements:kb,popupPlacement:f,popupAlign:h,getPopupContainer:m,onPopupVisibleChange:s,afterPopupVisibleChange:l,popupTransitionName:u,popupAnimation:p,defaultPopupVisible:v,destroyPopupOnHide:d,mouseLeaveDelay:o,popupStyle:i,mouseEnterDelay:r},g),c)},t}(ws.Component);Eb.propTypes={trigger:ks.a.any,children:ks.a.any,defaultVisible:ks.a.bool,visible:ks.a.bool,placement:ks.a.string,transitionName:ks.a.oneOfType([ks.a.string,ks.a.object]),animation:ks.a.any,onVisibleChange:ks.a.func,afterVisibleChange:ks.a.func,overlay:ks.a.oneOfType([ks.a.node,ks.a.func]).isRequired,overlayStyle:ks.a.object,overlayClassName:ks.a.string,prefixCls:ks.a.string,mouseEnterDelay:ks.a.number,mouseLeaveDelay:ks.a.number,getTooltipContainer:ks.a.func,destroyTooltipOnHide:ks.a.bool,align:ks.a.object,arrowContent:ks.a.any,id:ks.a.string},Eb.defaultProps={prefixCls:"rc-tooltip",mouseEnterDelay:0,destroyTooltipOnHide:!1,mouseLeaveDelay:.1,align:{},placement:"right",trigger:["hover"],arrowContent:null};var Tb=Eb,Nb=Tb,Vb={adjustX:1,adjustY:1},Pb={adjustX:0,adjustY:0},Hb=[0,0],Lb=function(e,t){var n={},r=us()({},e);return t.forEach(function(t){e&&t in e&&(n[t]=e[t],delete r[t])}),{picked:n,omitted:r}},Db=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.onVisibleChange=function(e){var t=n.props.onVisibleChange;"visible"in n.props||n.setState({visible:!n.isNoTitle()&&e}),t&&!n.isNoTitle()&&t(e)},n.onPopupAlign=function(e,t){var r=n.getPlacements(),o=Object.keys(r).filter(function(e){return r[e].points[0]===t.points[0]&&r[e].points[1]===t.points[1]})[0];if(o){var i=e.getBoundingClientRect(),a={top:"50%",left:"50%"};o.indexOf("top")>=0||o.indexOf("Bottom")>=0?a.top=i.height-t.offset[1]+"px":(o.indexOf("Top")>=0||o.indexOf("bottom")>=0)&&(a.top=-t.offset[1]+"px"),o.indexOf("left")>=0||o.indexOf("Right")>=0?a.left=i.width-t.offset[0]+"px":(o.indexOf("right")>=0||o.indexOf("Left")>=0)&&(a.left=-t.offset[0]+"px"),e.style.transformOrigin=a.left+" "+a.top}},n.saveTooltip=function(e){n.tooltip=e},n.state={visible:!!e.visible||!!e.defaultVisible},n}return gs()(t,e),ds()(t,[{key:"getPopupDomNode",value:function(){return this.tooltip.getPopupDomNode()}},{key:"getPlacements",value:function(){var e=this.props,t=e.builtinPlacements,n=e.arrowPointAtCenter,r=e.autoAdjustOverflow;return t||bi({arrowPointAtCenter:n,verticalArrowShift:8,autoAdjustOverflow:r})}},{key:"isHoverTrigger",value:function(){var e=this.props.trigger;return!e||"hover"===e||!!Array.isArray(e)&&e.indexOf("hover")>=0}},{key:"getDisabledCompatibleChildren",value:function(e){if((e.type.__ANT_BUTTON||"button"===e.type)&&e.props.disabled&&this.isHoverTrigger()){var t=Lb(e.props.style,["position","left","right","top","bottom","float","display","zIndex"]),n=t.picked,r=t.omitted,o=us()({display:"inline-block"},n,{cursor:"not-allowed"}),i=us()({},r,{pointerEvents:"none"}),a=Object(ws.cloneElement)(e,{style:i,className:null});return ws.createElement("span",{style:o,className:e.props.className},a)}return e}},{key:"isNoTitle",value:function(){var e=this.props,t=e.title,n=e.overlay;return!t&&!n}},{key:"render",value:function(){var e=this.props,t=this.state,n=e.prefixCls,r=e.title,o=e.overlay,i=e.openClassName,a=e.getPopupContainer,c=e.getTooltipContainer,s=e.children,l=t.visible;"visible"in e||!this.isNoTitle()||(l=!1);var u=this.getDisabledCompatibleChildren(ws.isValidElement(s)?s:ws.createElement("span",null,s)),p=u.props,f=Ts()(p.className,ss()({},i||n+"-open",!0));return ws.createElement(Nb,us()({},this.props,{getTooltipContainer:a||c,ref:this.saveTooltip,builtinPlacements:this.getPlacements(),overlay:o||r||"",visible:l,onVisibleChange:this.onVisibleChange,onPopupAlign:this.onPopupAlign}),l?Object(ws.cloneElement)(u,{className:f}):u)}}],[{key:"getDerivedStateFromProps",value:function(e){return"visible"in e?{visible:e.visible}:null}}]),t}(ws.Component);Db.defaultProps={prefixCls:"ant-tooltip",placement:"top",transitionName:"zoom-big-fast",mouseEnterDelay:.1,mouseLeaveDelay:.1,arrowPointAtCenter:!1,autoAdjustOverflow:!0},Object(Ys.polyfill)(Db);var Ab=Db,Ib=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.onKeyDown=function(t){e.menuItem.onKeyDown(t)},e.saveMenuItem=function(t){e.menuItem=t},e}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e=this.context.inlineCollapsed,t=this.props;return ws.createElement(Ab,{title:e&&1===t.level?t.children:"",placement:"right",overlayClassName:t.rootPrefixCls+"-inline-collapsed-tooltip"},ws.createElement(Ju,us()({},t,{ref:this.saveMenuItem})))}}]),t}(ws.Component);Ib.contextTypes={inlineCollapsed:zs.bool},Ib.isMenuItem=1;var Rb=Ib,jb=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));n.inlineOpenKeys=[],n.handleClick=function(e){n.handleOpenChange([]);var t=n.props.onClick;t&&t(e)},n.handleOpenChange=function(e){n.setOpenKeys(e);var t=n.props.onOpenChange;t&&t(e)},Pp(!("onOpen"in e||"onClose"in e),"`onOpen` and `onClose` are removed, please use `onOpenChange` instead, see: https://u.ant.design/menu-on-open-change."),Pp(!("inlineCollapsed"in e&&"inline"!==e.mode),"`inlineCollapsed` should only be used when Menu's `mode` is inline.");var r=void 0;return"openKeys"in e?r=e.openKeys:"defaultOpenKeys"in e&&(r=e.defaultOpenKeys),n.state={openKeys:r||[]},n}return gs()(t,e),ds()(t,[{key:"getChildContext",value:function(){return{inlineCollapsed:this.getInlineCollapsed(),antdMenuTheme:this.props.theme}}},{key:"componentWillReceiveProps",value:function(e,t){var n=this.props.prefixCls;if("inline"===this.props.mode&&"inline"!==e.mode&&(this.switchModeFromInline=!0),"openKeys"in e)return void this.setState({openKeys:e.openKeys});if(e.inlineCollapsed&&!this.props.inlineCollapsed||t.siderCollapsed&&!this.context.siderCollapsed){var r=Object(xs.findDOMNode)(this);this.switchModeFromInline=!!this.state.openKeys.length&&!!r.querySelectorAll("."+n+"-submenu-open").length,this.inlineOpenKeys=this.state.openKeys,this.setState({openKeys:[]})}(!e.inlineCollapsed&&this.props.inlineCollapsed||!t.siderCollapsed&&this.context.siderCollapsed)&&(this.setState({openKeys:this.inlineOpenKeys}),this.inlineOpenKeys=[])}},{key:"setOpenKeys",value:function(e){"openKeys"in this.props||this.setState({openKeys:e})}},{key:"getRealMenuMode",value:function(){var e=this.getInlineCollapsed();if(this.switchModeFromInline&&e)return"inline";var t=this.props.mode;return e?"vertical":t}},{key:"getInlineCollapsed",value:function(){var e=this.props.inlineCollapsed;return void 0!==this.context.siderCollapsed?this.context.siderCollapsed:e}},{key:"getMenuOpenAnimation",value:function(e){var t=this,n=this.props,r=n.openAnimation,o=n.openTransitionName,i=r||o;if(void 0===r&&void 0===o)switch(e){case"horizontal":i="slide-up";break;case"vertical":case"vertical-left":case"vertical-right":this.switchModeFromInline?(i="",this.switchModeFromInline=!1):i="zoom-big";break;case"inline":i=us()({},Ed,{leave:function(e,n){return Ed.leave(e,function(){t.switchModeFromInline=!1,t.setState({}),"vertical"!==t.getRealMenuMode()&&n()})}})}return i}},{key:"render",value:function(){var e=this.props,t=e.prefixCls,n=e.className,r=e.theme,o=this.getRealMenuMode(),i=this.getMenuOpenAnimation(o),a=Ts()(n,t+"-"+r,ss()({},t+"-inline-collapsed",this.getInlineCollapsed())),c={openKeys:this.state.openKeys,onOpenChange:this.handleOpenChange,className:a,mode:o};"inline"!==o?(c.onClick=this.handleClick,c.openTransitionName=i):c.openAnimation=i;var s=this.context.collapsedWidth;return!this.getInlineCollapsed()||0!==s&&"0"!==s&&"0px"!==s?ws.createElement(np,us()({},this.props,c)):null}}]),t}(ws.Component),Fb=jb;jb.Divider=tp,jb.Item=Rb,jb.SubMenu=xb,jb.ItemGroup=Qu,jb.defaultProps={prefixCls:"ant-menu",className:"",theme:"light",focusable:!1},jb.childContextTypes={inlineCollapsed:zs.bool,antdMenuTheme:zs.string},jb.contextTypes={siderCollapsed:zs.bool,collapsedWidth:zs.oneOfType([zs.number,zs.string])};var Kb=function(e){function t(){return fs()(this,t),ms()(this,e.apply(this,arguments))}return gs()(t,e),t.prototype.shouldComponentUpdate=function(e){return!!e.hiddenClassName||!!e.visible},t.prototype.render=function(){var e=this.props.className;this.props.hiddenClassName&&!this.props.visible&&(e+=" "+this.props.hiddenClassName);var t=us()({},this.props);return delete t.hiddenClassName,delete t.visible,t.className=e,ws.createElement("div",us()({},t))},t}(ws.Component),Bb=Kb,Wb=0,Ub=0,qb=function(e){function t(){fs()(this,t);var n=ms()(this,e.apply(this,arguments));return n.onAnimateLeave=function(){var e=n.props.afterClose;n.wrap&&(n.wrap.style.display="none"),n.inTransition=!1,n.removeScrollingEffect(),e&&e()},n.onMaskClick=function(e){Date.now()-n.openTime<300||e.target===e.currentTarget&&n.close(e)},n.onKeyDown=function(e){var t=n.props;if(t.keyboard&&e.keyCode===Xs.ESC)return e.stopPropagation(),void n.close(e);if(t.visible&&e.keyCode===Xs.TAB){var r=document.activeElement,o=n.sentinelStart;e.shiftKey?r===o&&n.sentinelEnd.focus():r===n.sentinelEnd&&o.focus()}},n.getDialogElement=function(){var e=n.props,t=e.closable,r=e.prefixCls,o={};void 0!==e.width&&(o.width=e.width),void 0!==e.height&&(o.height=e.height);var i=void 0;e.footer&&(i=ws.createElement("div",{className:r+"-footer",ref:n.saveRef("footer")},e.footer));var a=void 0;e.title&&(a=ws.createElement("div",{className:r+"-header",ref:n.saveRef("header")},ws.createElement("div",{className:r+"-title",id:n.titleId},e.title)));var c=void 0;t&&(c=ws.createElement("button",{onClick:n.close,"aria-label":"Close",className:r+"-close"},e.closeIcon||ws.createElement("span",{className:r+"-close-x"})));var s=us()({},e.style,o),l={width:0,height:0,overflow:"hidden"},u=n.getTransitionName(),p=ws.createElement(Bb,{key:"dialog-element",role:"document",ref:n.saveRef("dialog"),style:s,className:r+" "+(e.className||""),visible:e.visible},ws.createElement("div",{tabIndex:0,ref:n.saveRef("sentinelStart"),style:l},"sentinelStart"),ws.createElement("div",{className:r+"-content"},c,a,ws.createElement("div",us()({className:r+"-body",style:e.bodyStyle,ref:n.saveRef("body")},e.bodyProps),e.children),i),ws.createElement("div",{tabIndex:0,ref:n.saveRef("sentinelEnd"),style:l},"sentinelEnd"));return ws.createElement(Ml,{key:"dialog",showProp:"visible",onLeave:n.onAnimateLeave,transitionName:u,component:"",transitionAppear:!0},e.visible||!e.destroyOnClose?p:null)},n.getZIndexStyle=function(){var e={},t=n.props;return void 0!==t.zIndex&&(e.zIndex=t.zIndex),e},n.getWrapStyle=function(){return us()({},n.getZIndexStyle(),n.props.wrapStyle)},n.getMaskStyle=function(){return us()({},n.getZIndexStyle(),n.props.maskStyle)},n.getMaskElement=function(){var e=n.props,t=void 0;if(e.mask){var r=n.getMaskTransitionName();t=ws.createElement(Bb,us()({style:n.getMaskStyle(),key:"mask",className:e.prefixCls+"-mask",hiddenClassName:e.prefixCls+"-mask-hidden",visible:e.visible},e.maskProps)),r&&(t=ws.createElement(Ml,{key:"mask",showProp:"visible",transitionAppear:!0,component:"",transitionName:r},t))}return t},n.getMaskTransitionName=function(){var e=n.props,t=e.maskTransitionName,r=e.maskAnimation;return!t&&r&&(t=e.prefixCls+"-"+r),t},n.getTransitionName=function(){var e=n.props,t=e.transitionName,r=e.animation;return!t&&r&&(t=e.prefixCls+"-"+r),t},n.setScrollbar=function(){n.bodyIsOverflowing&&void 0!==n.scrollbarWidth&&(document.body.style.paddingRight=n.scrollbarWidth+"px")},n.addScrollingEffect=function(){1===++Ub&&(n.checkScrollbar(),n.setScrollbar(),document.body.style.overflow="hidden")},n.removeScrollingEffect=function(){0===--Ub&&(document.body.style.overflow="",n.resetScrollbar())},n.close=function(e){var t=n.props.onClose;t&&t(e)},n.checkScrollbar=function(){var e=window.innerWidth;if(!e){var t=document.documentElement.getBoundingClientRect();e=t.right-Math.abs(t.left)}n.bodyIsOverflowing=document.body.clientWidth<e,n.bodyIsOverflowing&&(n.scrollbarWidth=Jr())},n.resetScrollbar=function(){document.body.style.paddingRight=""},n.adjustDialog=function(){if(n.wrap&&void 0!==n.scrollbarWidth){var e=n.wrap.scrollHeight>document.documentElement.clientHeight;n.wrap.style.paddingLeft=(!n.bodyIsOverflowing&&e?n.scrollbarWidth:"")+"px",n.wrap.style.paddingRight=(n.bodyIsOverflowing&&!e?n.scrollbarWidth:"")+"px"}},n.resetAdjustments=function(){n.wrap&&(n.wrap.style.paddingLeft=n.wrap.style.paddingLeft="")},n.saveRef=function(e){return function(t){n[e]=t}},n}return gs()(t,e),t.prototype.componentWillMount=function(){this.inTransition=!1,this.titleId="rcDialogTitle"+Wb++},t.prototype.componentDidMount=function(){this.componentDidUpdate({})},t.prototype.componentDidUpdate=function(e){var t=this.props,n=this.props.mousePosition;if(t.visible){if(!e.visible){this.openTime=Date.now(),this.addScrollingEffect(),this.tryFocus();var r=xs.findDOMNode(this.dialog);if(n){var o=Si(r);wi(r,n.x-o.left+"px "+(n.y-o.top)+"px")}else wi(r,"")}}else if(e.visible&&(this.inTransition=!0,t.mask&&this.lastOutSideFocusNode)){try{this.lastOutSideFocusNode.focus()}catch(e){this.lastOutSideFocusNode=null}this.lastOutSideFocusNode=null}},t.prototype.componentWillUnmount=function(){(this.props.visible||this.inTransition)&&this.removeScrollingEffect()},t.prototype.tryFocus=function(){D(this.wrap,document.activeElement)||(this.lastOutSideFocusNode=document.activeElement,this.sentinelStart.focus())},t.prototype.render=function(){var e=this.props,t=e.prefixCls,n=e.maskClosable,r=this.getWrapStyle();return e.visible&&(r.display=null),ws.createElement("div",null,this.getMaskElement(),ws.createElement("div",us()({tabIndex:-1,onKeyDown:this.onKeyDown,className:t+"-wrap "+(e.wrapClassName||""),ref:this.saveRef("wrap"),onClick:n?this.onMaskClick:void 0,role:"dialog","aria-labelledby":e.title?this.titleId:null,style:r},e.wrapProps),this.getDialogElement()))},t}(ws.Component),Yb=qb;qb.defaultProps={className:"",mask:!0,visible:!1,keyboard:!0,closable:!0,maskClosable:!0,destroyOnClose:!1,prefixCls:"rc-dialog"};var Gb="createPortal"in xs,Xb=function(e){function t(){fs()(this,t);var n=ms()(this,e.apply(this,arguments));return n.saveDialog=function(e){n._component=e},n.getComponent=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return ws.createElement(Yb,us()({ref:n.saveDialog},n.props,e,{key:"dialog"}))},n.getContainer=function(){var e=document.createElement("div");return n.props.getContainer?n.props.getContainer().appendChild(e):document.body.appendChild(e),e},n}return gs()(t,e),t.prototype.shouldComponentUpdate=function(e){var t=e.visible;return!(!this.props.visible&&!t)},t.prototype.componentWillUnmount=function(){Gb||(this.props.visible?this.renderComponent({afterClose:this.removeContainer,onClose:function(){},visible:!1}):this.removeContainer())},t.prototype.render=function(){var e=this,t=this.props.visible,n=null;return Gb?((t||this._component)&&(n=ws.createElement(Hl,{getContainer:this.getContainer},this.getComponent())),n):ws.createElement(Vl,{parent:this,visible:t,autoDestroy:!1,getComponent:this.getComponent,getContainer:this.getContainer},function(t){var n=t.renderComponent,r=t.removeContainer;return e.renderComponent=n,e.removeContainer=r,null})},t}(ws.Component);Xb.defaultProps={visible:!1};var $b=Xb,Jb=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},Zb=void 0,Qb=void 0,eC=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.handleCancel=function(t){var n=e.props.onCancel;n&&n(t)},e.handleOk=function(t){var n=e.props.onOk;n&&n(t)},e.renderFooter=function(t){var n=e.props,r=n.okText,o=n.okType,i=n.cancelText,a=n.confirmLoading;return ws.createElement("div",null,ws.createElement(cf,us()({onClick:e.handleCancel},e.props.cancelButtonProps),i||t.cancelText),ws.createElement(cf,us()({type:o,loading:a,onClick:e.handleOk},e.props.okButtonProps),r||t.okText))},e}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){Qb||(r(document.documentElement,"click",function(e){Zb={x:e.pageX,y:e.pageY},setTimeout(function(){return Zb=null},100)}),Qb=!0)}},{key:"render",value:function(){var e=this.props,t=e.footer,n=e.visible,r=e.wrapClassName,o=e.centered,i=e.prefixCls,a=Jb(e,["footer","visible","wrapClassName","centered","prefixCls"]),c=ws.createElement(xp,{componentName:"Modal",defaultLocale:hi()},this.renderFooter),s=ws.createElement("span",{className:i+"-close-x"},ws.createElement(Kp,{className:i+"-close-icon",type:"close"}));return ws.createElement($b,us()({},a,{prefixCls:i,wrapClassName:Ts()(ss()({},i+"-centered",!!o),r),footer:void 0===t?c:t,visible:n,mousePosition:Zb,onClose:this.handleCancel,closeIcon:s}))}}]),t}(ws.Component),tC=eC;eC.defaultProps={prefixCls:"ant-modal",width:520,transitionName:"zoom",maskTransitionName:"fade",confirmLoading:!1,visible:!1,okType:"primary",okButtonDisabled:!1,cancelButtonDisabled:!1},eC.propTypes={prefixCls:zs.string,onOk:zs.func,onCancel:zs.func,okText:zs.node,cancelText:zs.node,centered:zs.bool,width:zs.oneOfType([zs.number,zs.string]),confirmLoading:zs.bool,visible:zs.bool,align:zs.object,footer:zs.node,title:zs.node,closable:zs.bool};var nC=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.onClick=function(){var e=n.props,t=e.actionFn,r=e.closeModal;if(t){var o=void 0;t.length?o=t(r):(o=t())||r(),o&&o.then&&(n.setState({loading:!0}),o.then(function(){r.apply(void 0,arguments)},function(){n.setState({loading:!1})}))}else r()},n.state={loading:!1},n}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){if(this.props.autoFocus){var e=xs.findDOMNode(this);this.timeoutId=setTimeout(function(){return e.focus()})}}},{key:"componentWillUnmount",value:function(){clearTimeout(this.timeoutId)}},{key:"render",value:function(){var e=this.props,t=e.type,n=e.children,r=this.state.loading;return ws.createElement(cf,{type:t,onClick:this.onClick,loading:r},n)}}]),t}(ws.Component),rC=nC,oC=this,iC=!!xs.createPortal,aC=function(e){var t=e.onCancel,n=e.onOk,r=e.close,o=e.zIndex,i=e.afterClose,a=e.visible,c=e.keyboard,s=e.centered,l=e.getContainer,u=e.iconType||"question-circle",p=e.okType||"primary",f=e.prefixCls||"ant-confirm",h=!("okCancel"in e)||e.okCancel,d=e.width||416,v=e.style||{},m=void 0!==e.maskClosable&&e.maskClosable,y=hi(),g=e.okText||(h?y.okText:y.justOkText),b=e.cancelText||y.cancelText,C=Ts()(f,f+"-"+e.type,e.className),w=h&&ws.createElement(rC,{actionFn:t,closeModal:r},b);return ws.createElement(tC,{className:C,wrapClassName:Ts()(ss()({},f+"-centered",!!e.centered)),onCancel:r.bind(oC,{triggerCancel:!0}),visible:a,title:"",transitionName:"zoom",footer:"",maskTransitionName:"fade",maskClosable:m,style:v,width:d,zIndex:o,afterClose:i,keyboard:c,centered:s,getContainer:l},ws.createElement("div",{className:f+"-body-wrapper"},ws.createElement("div",{className:f+"-body"},ws.createElement(Kp,{type:u}),ws.createElement("span",{className:f+"-title"},e.title),ws.createElement("div",{className:f+"-content"},e.content)),ws.createElement("div",{className:f+"-btns"},w,ws.createElement(rC,{type:p,actionFn:n,closeModal:r,autoFocus:!0},g))))};tC.info=function(e){return xi(us()({type:"info",iconType:"info-circle",okCancel:!1},e))},tC.success=function(e){return xi(us()({type:"success",iconType:"check-circle",okCancel:!1},e))},tC.error=function(e){return xi(us()({type:"error",iconType:"close-circle",okCancel:!1},e))},tC.warning=tC.warn=function(e){return xi(us()({type:"warning",iconType:"exclamation-circle",okCancel:!1},e))},tC.confirm=function(e){return xi(us()({type:"confirm",okCancel:!0},e))};var cC=tC,sC={},lC=4.5,uC=24,pC=24,fC="topRight",hC=void 0,dC={success:"check-circle-o",info:"info-circle-o",error:"close-circle-o",warning:"exclamation-circle-o"},vC={open:_i,close:function(e){Object.keys(sC).forEach(function(t){return sC[t].removeNotice(e)})},config:Mi,destroy:function(){Object.keys(sC).forEach(function(e){sC[e].destroy(),delete sC[e]})}};["success","info","warning","error"].forEach(function(e){vC[e]=function(t){return vC.open(us()({},t,{type:e}))}}),vC.warn=vC.warning;var mC=vC,yC=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},gC=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.onConfirm=function(e){n.setVisible(!1,e);var t=n.props.onConfirm;t&&t.call(n,e)},n.onCancel=function(e){n.setVisible(!1,e);var t=n.props.onCancel;t&&t.call(n,e)},n.onVisibleChange=function(e){n.setVisible(e)},n.saveTooltip=function(e){n.tooltip=e},n.renderOverlay=function(e){var t=n.props,r=t.prefixCls,o=t.title,i=t.cancelText,a=t.okText,c=t.okType,s=t.icon;return ws.createElement("div",null,ws.createElement("div",{className:r+"-inner-content"},ws.createElement("div",{className:r+"-message"},s,ws.createElement("div",{className:r+"-message-title"},o)),ws.createElement("div",{className:r+"-buttons"},ws.createElement(cf,{onClick:n.onCancel,size:"small"},i||e.cancelText),ws.createElement(cf,{onClick:n.onConfirm,type:c,size:"small"},a||e.okText))))},n.state={visible:e.visible},n}return gs()(t,e),ds()(t,[{key:"getPopupDomNode",value:function(){return this.tooltip.getPopupDomNode()}},{key:"setVisible",value:function(e,t){var n=this.props;"visible"in n||this.setState({visible:e});var r=n.onVisibleChange;r&&r(e,t)}},{key:"render",value:function(){var e=this.props,t=e.prefixCls,n=e.placement,r=yC(e,["prefixCls","placement"]),o=ws.createElement(xp,{componentName:"Popconfirm",defaultLocale:Mp.a.Popconfirm},this.renderOverlay);return ws.createElement(Ab,us()({},r,{prefixCls:t,placement:n,onVisibleChange:this.onVisibleChange,visible:this.state.visible,overlay:o,ref:this.saveTooltip}))}}],[{key:"getDerivedStateFromProps",value:function(e){return"visible"in e?{visible:e.visible}:null}}]),t}(ws.Component);gC.defaultProps={prefixCls:"ant-popover",transitionName:"zoom-big",placement:"top",trigger:"click",okType:"primary",icon:ws.createElement(Kp,{type:"exclamation-circle",theme:"filled"})},Object(Ys.polyfill)(gC);var bC=gC,CC=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.saveTooltip=function(t){e.tooltip=t},e}return gs()(t,e),ds()(t,[{key:"getPopupDomNode",value:function(){return this.tooltip.getPopupDomNode()}},{key:"getOverlay",value:function(){var e=this.props,t=e.title,n=e.prefixCls,r=e.content;return Pp(!("overlay"in this.props),"Popover[overlay] is removed, please use Popover[content] instead, see: https://u.ant.design/popover-content"),ws.createElement("div",null,t&&ws.createElement("div",{className:n+"-title"},t),ws.createElement("div",{className:n+"-inner-content"},r))}},{key:"render",value:function(){var e=us()({},this.props);return delete e.title,ws.createElement(Ab,us()({},e,{ref:this.saveTooltip,overlay:this.getOverlay()}))}}]),t}(ws.Component),wC=CC;CC.defaultProps={prefixCls:"ant-popover",placement:"top",transitionName:"zoom-big",trigger:"hover",mouseEnterDelay:.1,mouseLeaveDelay:.1,overlayStyle:{}};var SC=function(e){return function(e){function t(){return fs()(this,t),ms()(this,e.apply(this,arguments))}return gs()(t,e),t.prototype.componentDidUpdate=function(){if(this.path){var e=this.path.style;e.transitionDuration=".3s, .3s, .3s, .06s";var t=Date.now();this.prevTimeStamp&&t-this.prevTimeStamp<100&&(e.transitionDuration="0s, 0s"),this.prevTimeStamp=Date.now()}},t.prototype.render=function(){return e.prototype.render.call(this)},t}(e)},xC=SC,MC={className:"",percent:0,prefixCls:"rc-progress",strokeColor:"#2db7f5",strokeLinecap:"round",strokeWidth:1,style:{},trailColor:"#D9D9D9",trailWidth:1},zC={className:ks.a.string,percent:ks.a.oneOfType([ks.a.number,ks.a.string]),prefixCls:ks.a.string,strokeColor:ks.a.string,strokeLinecap:ks.a.oneOf(["butt","round","square"]),strokeWidth:ks.a.oneOfType([ks.a.number,ks.a.string]),style:ks.a.object,trailColor:ks.a.string,trailWidth:ks.a.oneOfType([ks.a.number,ks.a.string])},kC=function(e){function t(){return fs()(this,t),ms()(this,e.apply(this,arguments))}return gs()(t,e),t.prototype.render=function(){var e=this,t=this.props,n=t.className,r=t.percent,o=t.prefixCls,i=t.strokeColor,a=t.strokeLinecap,c=t.strokeWidth,s=t.style,l=t.trailColor,u=t.trailWidth,p=kl()(t,["className","percent","prefixCls","strokeColor","strokeLinecap","strokeWidth","style","trailColor","trailWidth"]);delete p.gapPosition;var f={strokeDasharray:"100px, 100px",strokeDashoffset:100-r+"px",transition:"stroke-dashoffset 0.3s ease 0s, stroke 0.3s linear"},h=c/2,d=100-c/2,v="M "+("round"===a?h:0)+","+h+"\n L "+("round"===a?d:100)+","+h,m="0 0 100 "+c;return Ss.a.createElement("svg",us()({className:o+"-line "+n,viewBox:m,preserveAspectRatio:"none",style:s},p),Ss.a.createElement("path",{className:o+"-line-trail",d:v,strokeLinecap:a,stroke:l,strokeWidth:u||c,fillOpacity:"0"}),Ss.a.createElement("path",{className:o+"-line-path",d:v,strokeLinecap:a,stroke:i,strokeWidth:c,fillOpacity:"0",ref:function(t){e.path=t},style:f}))},t}(ws.Component);kC.propTypes=zC,kC.defaultProps=MC;var _C=(xC(kC),function(e){function t(){return fs()(this,t),ms()(this,e.apply(this,arguments))}return gs()(t,e),t.prototype.getPathStyles=function(){var e=this.props,t=e.percent,n=e.strokeWidth,r=e.gapDegree,o=void 0===r?0:r,i=e.gapPosition,a=50-n/2,c=0,s=-a,l=0,u=-2*a;switch(i){case"left":c=-a,s=0,l=2*a,u=0;break;case"right":c=a,s=0,l=-2*a,u=0;break;case"bottom":s=a,u=2*a}var p="M 50,50 m "+c+","+s+"\n a "+a+","+a+" 0 1 1 "+l+","+-u+"\n a "+a+","+a+" 0 1 1 "+-l+","+u,f=2*Math.PI*a;return{pathString:p,trailPathStyle:{strokeDasharray:f-o+"px "+f+"px",strokeDashoffset:"-"+o/2+"px",transition:"stroke-dashoffset .3s ease 0s, stroke-dasharray .3s ease 0s, stroke .3s"},strokePathStyle:{strokeDasharray:t/100*(f-o)+"px "+f+"px",strokeDashoffset:"-"+o/2+"px",transition:"stroke-dashoffset .3s ease 0s, stroke-dasharray .3s ease 0s, stroke .3s, stroke-width .06s ease .3s"}}},t.prototype.render=function(){var e=this,t=this.props,n=t.prefixCls,r=t.strokeWidth,o=t.trailWidth,i=t.strokeColor,a=(t.percent,t.trailColor),c=t.strokeLinecap,s=t.style,l=t.className,u=kl()(t,["prefixCls","strokeWidth","trailWidth","strokeColor","percent","trailColor","strokeLinecap","style","className"]),p=this.getPathStyles(),f=p.pathString,h=p.trailPathStyle,d=p.strokePathStyle;return delete u.percent,delete u.gapDegree,delete u.gapPosition,Ss.a.createElement("svg",us()({className:n+"-circle "+l,viewBox:"0 0 100 100",style:s},u),Ss.a.createElement("path",{className:n+"-circle-trail",d:f,stroke:a,strokeWidth:o||r,fillOpacity:"0",style:h}),Ss.a.createElement("path",{className:n+"-circle-path",d:f,strokeLinecap:c,stroke:i,strokeWidth:0===this.props.percent?0:r,fillOpacity:"0",ref:function(t){e.path=t},style:d}))},t}(ws.Component));_C.propTypes=us()({},zC,{gapPosition:ks.a.oneOf(["top","bottom","left","right"])}),_C.defaultProps=us()({},MC,{gapPosition:"top"});var OC=xC(_C),EC=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},TC={normal:"#108ee9",exception:"#ff5500",success:"#87d068"},NC=function(e){return!e||e<0?0:e>100?100:e},VC=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e,t=this.props,n=t.prefixCls,r=t.className,o=t.percent,i=void 0===o?0:o,a=t.status,c=t.format,s=t.trailColor,l=t.size,u=t.successPercent,p=t.type,f=t.strokeWidth,h=t.width,d=t.showInfo,v=t.gapDegree,m=void 0===v?0:v,y=t.gapPosition,g=t.strokeColor,b=t.strokeLinecap,C=void 0===b?"round":b,w=EC(t,["prefixCls","className","percent","status","format","trailColor","size","successPercent","type","strokeWidth","width","showInfo","gapDegree","gapPosition","strokeColor","strokeLinecap"]),S=parseInt(u?u.toString():i.toString(),10)>=100&&!("status"in t)?"success":a||"normal",x=void 0,M=void 0,z=c||function(e){return e+"%"};if(d){var k=void 0,_="circle"===p||"dashboard"===p?"":"-circle";c||"exception"!==S&&"success"!==S?k=z(NC(i),NC(u)):"exception"===S?k=ws.createElement(Kp,{type:"close"+_,theme:"line"===p?"filled":"outlined"}):"success"===S&&(k=ws.createElement(Kp,{type:"check"+_,theme:"line"===p?"filled":"outlined"})),x=ws.createElement("span",{className:n+"-text"},k)}if("line"===p){var O={width:NC(i)+"%",height:f||("small"===l?6:8),background:g,borderRadius:"square"===C?0:"100px"},E={width:NC(u)+"%",height:f||("small"===l?6:8),borderRadius:"square"===C?0:"100px"},T=void 0!==u?ws.createElement("div",{className:n+"-success-bg",style:E}):null;M=ws.createElement("div",null,ws.createElement("div",{className:n+"-outer"},ws.createElement("div",{className:n+"-inner"},ws.createElement("div",{className:n+"-bg",style:O}),T)),x)}else if("circle"===p||"dashboard"===p){var N=h||120,V={width:N,height:N,fontSize:.15*N+6},P=f||6,H=y||"dashboard"===p&&"bottom"||"top",L=m||"dashboard"===p&&75;M=ws.createElement("div",{className:n+"-inner",style:V},ws.createElement(OC,{percent:NC(i),strokeWidth:P,trailWidth:P,strokeColor:TC[S],strokeLinecap:C,trailColor:s,prefixCls:n,gapDegree:L,gapPosition:H}),x)}var D=Ts()(n,(e={},ss()(e,n+"-"+("dashboard"===p&&"circle"||p),!0),ss()(e,n+"-status-"+S,!0),ss()(e,n+"-show-info",d),ss()(e,n+"-"+l,l),e),r);return ws.createElement("div",us()({},w,{className:D}),M)}}]),t}(ws.Component),PC=VC;VC.defaultProps={type:"line",percent:0,showInfo:!0,trailColor:"#f3f3f3",prefixCls:"ant-progress",size:"default"},VC.propTypes={status:zs.oneOf(["normal","exception","active","success"]),type:zs.oneOf(["line","circle","dashboard"]),showInfo:zs.bool,percent:zs.number,width:zs.number,strokeWidth:zs.number,strokeLinecap:zs.oneOf(["round","square"]),strokeColor:zs.string,trailColor:zs.string,format:zs.func,gapDegree:zs.number,default:zs.oneOf(["default","small"])};var HC=PC,LC=function(e){function t(){var n,r,o;Ni(this,t);for(var i=arguments.length,a=Array(i),c=0;c<i;c++)a[c]=arguments[c];return n=r=Vi(this,e.call.apply(e,[this].concat(a))),r.onHover=function(e){var t=r.props;(0,t.onHover)(e,t.index)},r.onClick=function(e){var t=r.props;(0,t.onClick)(e,t.index)},r.onKeyDown=function(e){var t=r.props,n=t.onClick,o=t.index;13===e.keyCode&&n(e,o)},o=n,Vi(r,o)}return Pi(t,e),t.prototype.getClassName=function(){var e=this.props,t=e.prefixCls,n=e.index,r=e.value,o=e.allowHalf,i=e.focused,a=n+1,c=t;return 0===r&&0===n&&i?c+=" "+t+"-focused":o&&r+.5===a?(c+=" "+t+"-half "+t+"-active",i&&(c+=" "+t+"-focused")):(c+=a<=r?" "+t+"-full":" "+t+"-zero",a===r&&i&&(c+=" "+t+"-focused")),c},t.prototype.render=function(){var e=this.onHover,t=this.onClick,n=this.onKeyDown,r=this.props,o=r.disabled,i=r.prefixCls,a=r.character,c=r.index,s=r.count,l=r.value;return Ss.a.createElement("li",{className:this.getClassName(),onClick:o?null:t,onKeyDown:o?null:n,onMouseMove:o?null:e,role:"radio","aria-checked":l>c?"true":"false","aria-posinset":c+1,"aria-setsize":s,tabIndex:0},Ss.a.createElement("div",{className:i+"-first"},a),Ss.a.createElement("div",{className:i+"-second"},a))},t}(Ss.a.Component);LC.propTypes={value:ks.a.number,index:ks.a.number,prefixCls:ks.a.string,allowHalf:ks.a.bool,disabled:ks.a.bool,onHover:ks.a.func,onClick:ks.a.func,character:ks.a.node,focused:ks.a.bool,count:ks.a.number};var DC=LC,AC=function(e){function t(n){Hi(this,t);var r=Li(this,e.call(this,n));IC.call(r);var o=n.value;return void 0===o&&(o=n.defaultValue),r.stars={},r.state={value:o,focused:!1,cleanedValue:null},r}return Di(t,e),t.prototype.componentDidMount=function(){this.props.autoFocus&&!this.props.disabled&&this.focus()},t.prototype.componentWillReceiveProps=function(e){if("value"in e){var t=e.value;void 0===t&&(t=e.defaultValue),this.setState({value:t})}},t.prototype.getStarDOM=function(e){return Ms.a.findDOMNode(this.stars[e])},t.prototype.getStarValue=function(e,t){var n=e+1;if(this.props.allowHalf){var r=this.getStarDOM(e);t-Ti(r)<r.clientWidth/2&&(n-=.5)}return n},t.prototype.focus=function(){this.props.disabled||this.rate.focus()},t.prototype.blur=function(){this.props.disabled||this.rate.focus()},t.prototype.changeValue=function(e){"value"in this.props||this.setState({value:e}),this.props.onChange(e)},t.prototype.render=function(){for(var e=this.props,t=e.count,n=e.allowHalf,r=e.style,o=e.prefixCls,i=e.disabled,a=e.className,c=e.character,s=e.tabIndex,l=this.state,u=l.value,p=l.hoverValue,f=l.focused,h=[],d=i?o+"-disabled":"",v=0;v<t;v++)h.push(Ss.a.createElement(DC,{ref:this.saveRef(v),index:v,count:t,disabled:i,prefixCls:o+"-star",allowHalf:n,value:void 0===p?u:p,onClick:this.onClick,onHover:this.onHover,key:v,character:c,focused:f}));return Ss.a.createElement("ul",{className:Ts()(o,d,a),style:r,onMouseLeave:i?null:this.onMouseLeave,tabIndex:i?-1:s,onFocus:i?null:this.onFocus,onBlur:i?null:this.onBlur,onKeyDown:i?null:this.onKeyDown,ref:this.saveRate,role:"radiogroup"},h)},t}(Ss.a.Component);AC.propTypes={disabled:ks.a.bool,value:ks.a.number,defaultValue:ks.a.number,count:ks.a.number,allowHalf:ks.a.bool,allowClear:ks.a.bool,style:ks.a.object,prefixCls:ks.a.string,onChange:ks.a.func,onHoverChange:ks.a.func,className:ks.a.string,character:ks.a.node,tabIndex:ks.a.number,onFocus:ks.a.func,onBlur:ks.a.func,onKeyDown:ks.a.func,autoFocus:ks.a.bool},AC.defaultProps={defaultValue:0,count:5,allowHalf:!1,allowClear:!0,style:{},prefixCls:"rc-rate",onChange:Ai,character:"\u2605",onHoverChange:Ai,tabIndex:0};var IC=function(){var e=this;this.onHover=function(t,n){var r=e.getStarValue(n,t.pageX);r!==e.state.cleanedValue&&e.setState({hoverValue:r,cleanedValue:null}),e.props.onHoverChange(r)},this.onMouseLeave=function(){e.setState({hoverValue:void 0,cleanedValue:null}),e.props.onHoverChange(void 0)},this.onClick=function(t,n){var r=e.getStarValue(n,t.pageX),o=!1;e.props.allowClear&&(o=r===e.state.value),e.onMouseLeave(!0),e.changeValue(o?0:r),e.setState({cleanedValue:o?r:null})},this.onFocus=function(){var t=e.props.onFocus;e.setState({focused:!0}),t&&t()},this.onBlur=function(){var t=e.props.onBlur;e.setState({focused:!1}),t&&t()},this.onKeyDown=function(t){var n=t.keyCode,r=e.props,o=r.count,i=r.allowHalf,a=r.onKeyDown,c=e.state.value;n===Xs.RIGHT&&c<o?(c+=i?.5:1,e.changeValue(c),t.preventDefault()):n===Xs.LEFT&&c>0&&(c-=i?.5:1,e.changeValue(c),t.preventDefault()),a&&a(t)},this.saveRef=function(t){return function(n){e.stars[t]=n}},this.saveRate=function(t){e.rate=t}},RC=AC,jC=RC,FC=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.saveRate=function(t){e.rcRate=t},e}return gs()(t,e),ds()(t,[{key:"focus",value:function(){this.rcRate.focus()}},{key:"blur",value:function(){this.rcRate.blur()}},{key:"render",value:function(){return ws.createElement(jC,us()({ref:this.saveRate},this.props))}}]),t}(ws.Component),KC=FC;FC.propTypes={prefixCls:zs.string,character:zs.node},FC.defaultProps={prefixCls:"ant-rate",character:ws.createElement(Kp,{type:"star",theme:"filled"})};var BC=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e,t,n=this.props,r=n.prefixCls,o=n.className,i=n.style,a=n.size,c=n.shape,s=Ts()((e={},ss()(e,r+"-lg","large"===a),ss()(e,r+"-sm","small"===a),e)),l=Ts()((t={},ss()(t,r+"-circle","circle"===c),ss()(t,r+"-square","square"===c),t));return ws.createElement("span",{className:Ts()(r,o,s,l),style:i})}}]),t}(ws.Component);BC.defaultProps={prefixCls:"ant-skeleton-avatar",size:"large"};var WC=BC,UC=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e=this.props,t=e.prefixCls,n=e.className,r=e.width,o=e.style;return ws.createElement("h3",{className:Ts()(t,n),style:us()({width:r},o)})}}]),t}(ws.Component);UC.defaultProps={prefixCls:"ant-skeleton-title"};var qC=UC,YC=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"getWidth",value:function(e){var t=this.props,n=t.width,r=t.rows,o=void 0===r?2:r;return Array.isArray(n)?n[e]:o-1===e?n:void 0}},{key:"render",value:function(){var e=this,t=this.props,n=t.prefixCls,r=t.className,o=t.style,i=t.rows,a=[].concat(Ls()(Array(i))).map(function(t,n){return ws.createElement("li",{key:n,style:{width:e.getWidth(n)}})});return ws.createElement("ul",{className:Ts()(n,r),style:o},a)}}]),t}(ws.Component);YC.defaultProps={prefixCls:"ant-skeleton-paragraph"};var GC=YC,XC=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e=this.props,t=e.loading,n=e.prefixCls,r=e.className,o=e.children,i=e.avatar,a=e.title,c=e.paragraph,s=e.active;if(t||!("loading"in this.props)){var l,u=!!i,p=!!a,f=!!c,h=void 0;if(u){var d=us()({},Ri(p,f),Ii(i));h=ws.createElement("div",{className:n+"-header"},ws.createElement(WC,d))}var v=void 0;if(p||f){var m=void 0;if(p){var y=us()({},ji(u,f),Ii(a));m=ws.createElement(qC,y)}var g=void 0;if(f){var b=us()({},Fi(u,p),Ii(c));g=ws.createElement(GC,b)}v=ws.createElement("div",{className:n+"-content"},m,g)}var C=Ts()(n,r,(l={},ss()(l,n+"-with-avatar",u),ss()(l,n+"-active",s),l));return ws.createElement("div",{className:C},h,v)}return o}}]),t}(ws.Component);XC.defaultProps={prefixCls:"ant-skeleton",avatar:!1,title:!0,paragraph:!0};var $C=XC,JC=function(e){var t=e.className,n=e.included,r=e.vertical,o=e.offset,i=e.length,a=e.style,c=r?{bottom:o+"%",height:i+"%"}:{left:o+"%",width:i+"%"},s=us()({},a,c);return n?Ss.a.createElement("div",{className:t,style:s}):null},ZC=JC,QC=n(363),ew=n.n(QC),tw=function(e,t,n,r,o,i){Hh()(!n||r>0,"`Slider[step]` should be a positive number in order to make Slider[dots] work.");var a=Object.keys(t).map(parseFloat);if(n)for(var c=o;c<=i;c+=r)-1===a.indexOf(c)&&a.push(c);return a},nw=function(e){var t=e.prefixCls,n=e.vertical,r=e.marks,o=e.dots,i=e.step,a=e.included,c=e.lowerBound,s=e.upperBound,l=e.max,u=e.min,p=e.dotStyle,f=e.activeDotStyle,h=l-u,d=tw(0,r,o,i,u,l).map(function(e){var r,o=Math.abs(e-u)/h*100+"%",i=!a&&e===s||a&&e<=s&&e>=c,l=n?us()({bottom:o},p):us()({left:o},p);i&&(l=us()({},l,f));var d=Ts()((r={},ss()(r,t+"-dot",!0),ss()(r,t+"-dot-active",i),r));return Ss.a.createElement("span",{className:d,style:l,key:e})});return Ss.a.createElement("div",{className:t+"-step"},d)};nw.propTypes={prefixCls:ks.a.string,activeDotStyle:ks.a.object,dotStyle:ks.a.object,min:ks.a.number,max:ks.a.number,upperBound:ks.a.number,lowerBound:ks.a.number,included:ks.a.bool,dots:ks.a.bool,step:ks.a.number,marks:ks.a.object,vertical:ks.a.bool};var rw=nw,ow=function(e){var t=e.className,n=e.vertical,r=e.marks,o=e.included,i=e.upperBound,a=e.lowerBound,c=e.max,s=e.min,l=e.onClickLabel,u=Object.keys(r),p=u.length,f=p>1?100/(p-1):100,h=.9*f,d=c-s,v=u.map(parseFloat).sort(function(e,t){return e-t}).map(function(e){var c,u=r[e],p="object"==typeof u&&!Ss.a.isValidElement(u),f=p?u.label:u;if(!f&&0!==f)return null;var v=!o&&e===i||o&&e<=i&&e>=a,m=Ts()((c={},ss()(c,t+"-text",!0),ss()(c,t+"-text-active",v),c)),y={marginBottom:"-50%",bottom:(e-s)/d*100+"%"},g={width:h+"%",marginLeft:-h/2+"%",left:(e-s)/d*100+"%"},b=n?y:g,C=p?us()({},b,u.style):b;return Ss.a.createElement("span",{className:m,style:C,key:e,onMouseDown:function(t){return l(t,e)},onTouchStart:function(t){return l(t,e)}},f)});return Ss.a.createElement("div",{className:t},v)};ow.propTypes={className:ks.a.string,vertical:ks.a.bool,marks:ks.a.object,included:ks.a.bool,upperBound:ks.a.number,lowerBound:ks.a.number,max:ks.a.number,min:ks.a.number,onClickLabel:ks.a.func};var iw=ow,aw=function(e){function t(){var e,n,r,o;fs()(this,t);for(var i=arguments.length,a=Array(i),c=0;c<i;c++)a[c]=arguments[c];return n=r=ms()(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(a))),r.state={clickFocused:!1},r.setHandleRef=function(e){r.handle=e},r.handleMouseUp=function(){document.activeElement===r.handle&&r.setClickFocus(!0)},r.handleBlur=function(){r.setClickFocus(!1)},r.handleKeyDown=function(){r.setClickFocus(!1)},o=n,ms()(r,o)}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){this.onMouseUpListener=r(document,"mouseup",this.handleMouseUp)}},{key:"componentWillUnmount",value:function(){this.onMouseUpListener&&this.onMouseUpListener.remove()}},{key:"setClickFocus",value:function(e){this.setState({clickFocused:e})}},{key:"clickFocus",value:function(){this.setClickFocus(!0),this.focus()}},{key:"focus",value:function(){this.handle.focus()}},{key:"blur",value:function(){this.handle.blur()}},{key:"render",value:function(){var e=this.props,t=e.prefixCls,n=e.vertical,r=e.offset,o=e.style,i=e.disabled,a=e.min,c=e.max,s=e.value,l=e.tabIndex,u=kl()(e,["prefixCls","vertical","offset","style","disabled","min","max","value","tabIndex"]),p=Ts()(this.props.className,ss()({},t+"-handle-click-focused",this.state.clickFocused)),f=n?{bottom:r+"%"}:{left:r+"%"},h=us()({},o,f);return Ss.a.createElement("div",us()({ref:this.setHandleRef,tabIndex:i?null:l||0},u,{className:p,style:h,onBlur:this.handleBlur,onKeyDown:this.handleKeyDown,role:"slider","aria-valuemin":a,"aria-valuemax":c,"aria-valuenow":s,"aria-disabled":!!i}))}}]),t}(Ss.a.Component),cw=aw;aw.propTypes={prefixCls:ks.a.string,className:ks.a.string,vertical:ks.a.bool,offset:ks.a.number,style:ks.a.object,disabled:ks.a.bool,min:ks.a.number,max:ks.a.number,value:ks.a.number,tabIndex:ks.a.number};var sw=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));n.onEnd=function(){n.setState({dragging:!1}),n.removeDocumentEvents(),n.props.onAfterChange(n.getValue())};var r=void 0!==e.defaultValue?e.defaultValue:e.min,o=void 0!==e.value?e.value:r;return n.state={value:n.trimAlignValue(o),dragging:!1},n}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){var e=this.props,t=e.autoFocus,n=e.disabled;t&&!n&&this.focus()}},{key:"componentWillReceiveProps",value:function(e){if("value"in e||"min"in e||"max"in e){var t=this.state.value,n=void 0!==e.value?e.value:t,r=this.trimAlignValue(n,e);r!==t&&(this.setState({value:r}),Bi(n,e)&&this.props.onChange(r))}}},{key:"onChange",value:function(e){var t=this.props;!("value"in t)&&this.setState(e);var n=e.value;t.onChange(n)}},{key:"onStart",value:function(e){this.setState({dragging:!0});var t=this.props,n=this.getValue();t.onBeforeChange(n);var r=this.calcValueByPos(e);this.startValue=r,this.startPosition=e,r!==n&&(this.prevMovedHandleIndex=0,this.onChange({value:r}))}},{key:"onMove",value:function(e,t){Zi(e);var n=this.state.value,r=this.calcValueByPos(t);r!==n&&this.onChange({value:r})}},{key:"onKeyboard",value:function(e){var t=Qi(e);if(t){Zi(e);var n=this.state,r=n.value,o=t(r,this.props),i=this.trimAlignValue(o);if(i===r)return;this.onChange({value:i})}}},{key:"getValue",value:function(){return this.state.value}},{key:"getLowerBound",value:function(){return this.props.min}},{key:"getUpperBound",value:function(){return this.state.value}},{key:"trimAlignValue",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=us()({},this.props,t);return Ji($i(e,n),n)}},{key:"render",value:function(){var e=this,t=this.props,n=t.prefixCls,r=t.vertical,o=t.included,i=t.disabled,a=t.minimumTrackStyle,c=t.trackStyle,s=t.handleStyle,l=t.tabIndex,u=t.min,p=t.max,f=t.handle,h=this.state,d=h.value,v=h.dragging,m=this.calcOffset(d),y=f({className:n+"-handle",prefixCls:n,vertical:r,offset:m,value:d,dragging:v,disabled:i,min:u,max:p,index:0,tabIndex:l,style:s[0]||s,ref:function(t){return e.saveHandle(0,t)}}),g=c[0]||c;return{tracks:Ss.a.createElement(ZC,{className:n+"-track",vertical:r,included:o,offset:0,length:m,style:us()({},a,g)}),handles:y}}}]),t}(Ss.a.Component);sw.propTypes={defaultValue:ks.a.number,value:ks.a.number,disabled:ks.a.bool,autoFocus:ks.a.bool,tabIndex:ks.a.number};var lw=ta(sw),uw=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));n.onEnd=function(){n.setState({handle:null},n.blur),n.removeDocumentEvents(),n.props.onAfterChange(n.getValue())};var r=e.count,o=e.min,i=e.max,a=Array.apply(void 0,Ls()(Array(r+1))).map(function(){return o}),c="defaultValue"in e?e.defaultValue:a,s=void 0!==e.value?e.value:c,l=s.map(function(e,t){return n.trimAlignValue(e,t)}),u=l[0]===i?0:l.length-1;return n.state={handle:null,recent:u,bounds:l},n}return gs()(t,e),ds()(t,[{key:"componentWillReceiveProps",value:function(e){var t=this;if(("value"in e||"min"in e||"max"in e)&&(this.props.min!==e.min||this.props.max!==e.max||!Vs()(this.props.value,e.value))){var n=this.state.bounds,r=e.value||n,o=r.map(function(n,r){return t.trimAlignValue(n,r,e)});if((o.length!==n.length||!o.every(function(e,t){return e===n[t]}))&&(this.setState({bounds:o}),n.some(function(t){return Bi(t,e)}))){var i=r.map(function(t){return $i(t,e)});this.props.onChange(i)}}}},{key:"onChange",value:function(e){var t=this.props;"value"in t?void 0!==e.handle&&this.setState({handle:e.handle}):this.setState(e);var n=us()({},this.state,e),r=n.bounds;t.onChange(r)}},{key:"onStart",value:function(e){var t=this.props,n=this.state,r=this.getValue();t.onBeforeChange(r);var o=this.calcValueByPos(e);this.startValue=o,this.startPosition=e;var i=this.getClosestBound(o);if(this.prevMovedHandleIndex=this.getBoundNeedMoving(o,i),this.setState({handle:this.prevMovedHandleIndex,recent:this.prevMovedHandleIndex}),o!==r[this.prevMovedHandleIndex]){var a=[].concat(Ls()(n.bounds));a[this.prevMovedHandleIndex]=o,this.onChange({bounds:a})}}},{key:"onMove",value:function(e,t){Zi(e);var n=this.state,r=this.calcValueByPos(t);r!==n.bounds[n.handle]&&this.moveTo(r)}},{key:"onKeyboard",value:function(e){var t=Qi(e);if(t){Zi(e);var n=this.state,r=this.props,o=n.bounds,i=n.handle,a=o[i],c=t(a,r),s=this.trimAlignValue(c);if(s===a)return;this.moveTo(s,!0)}}},{key:"getValue",value:function(){return this.state.bounds}},{key:"getClosestBound",value:function(e){for(var t=this.state.bounds,n=0,r=1;r<t.length-1;++r)e>t[r]&&(n=r);return Math.abs(t[n+1]-e)<Math.abs(t[n]-e)&&(n+=1),n}},{key:"getBoundNeedMoving",value:function(e,t){var n=this.state,r=n.bounds,o=n.recent,i=t,a=r[t+1]===r[t];return a&&r[o]===r[t]&&(i=o),a&&e!==r[t+1]&&(i=e<r[t+1]?t:t+1),i}},{key:"getLowerBound",value:function(){return this.state.bounds[0]}},{key:"getUpperBound",value:function(){var e=this.state.bounds;return e[e.length-1]}},{key:"getPoints",value:function(){var e=this.props,t=e.marks,n=e.step,r=e.min,o=e.max,i=this._getPointsCache;if(!i||i.marks!==t||i.step!==n){var a=us()({},t);if(null!==n)for(var c=r;c<=o;c+=n)a[c]=c;var s=Object.keys(a).map(parseFloat);s.sort(function(e,t){return e-t}),this._getPointsCache={marks:t,step:n,points:s}}return this._getPointsCache.points}},{key:"moveTo",value:function(e,t){var n=this,r=this.state,o=this.props,i=[].concat(Ls()(r.bounds));i[r.handle]=e;var a=r.handle;!1!==o.pushable?this.pushSurroundingHandles(i,a):o.allowCross&&(i.sort(function(e,t){return e-t}),a=i.indexOf(e)),this.onChange({handle:a,bounds:i}),t&&this.setState({},function(){n.handlesRefs[a].focus()})}},{key:"pushSurroundingHandles",value:function(e,t){var n=e[t],r=this.props.pushable;r=Number(r);var o=0;if(e[t+1]-n<r&&(o=1),n-e[t-1]<r&&(o=-1),0!==o){var i=t+o,a=o*(e[i]-n);this.pushHandle(e,i,o,r-a)||(e[t]=e[i]-o*r)}}},{key:"pushHandle",value:function(e,t,n,r){for(var o=e[t],i=e[t];n*(i-o)<r;){if(!this.pushHandleOnePoint(e,t,n))return e[t]=o,!1;i=e[t]}return!0}},{key:"pushHandleOnePoint",value:function(e,t,n){var r=this.getPoints(),o=r.indexOf(e[t]),i=o+n;if(i>=r.length||i<0)return!1;var a=t+n,c=r[i],s=this.props.pushable,l=n*(e[a]-c);return!!this.pushHandle(e,a,n,s-l)&&(e[t]=c,!0)}},{key:"trimAlignValue",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=us()({},this.props,n),o=$i(e,r);return Ji(this.ensureValueNotConflict(t,o,r),r)}},{key:"ensureValueNotConflict",value:function(e,t,n){var r=n.allowCross,o=n.pushable,i=this.state||{},a=i.bounds;if(e=void 0===e?i.handle:e,o=Number(o),!r&&null!=e&&void 0!==a){if(e>0&&t<=a[e-1]+o)return a[e-1]+o;if(e<a.length-1&&t>=a[e+1]-o)return a[e+1]-o}return t}},{key:"render",value:function(){var e=this,t=this.state,n=t.handle,r=t.bounds,o=this.props,i=o.prefixCls,a=o.vertical,c=o.included,s=o.disabled,l=o.min,u=o.max,p=o.handle,f=o.trackStyle,h=o.handleStyle,d=o.tabIndex,v=r.map(function(t){return e.calcOffset(t)}),m=i+"-handle",y=r.map(function(t,r){var o;return p({className:Ts()((o={},ss()(o,m,!0),ss()(o,m+"-"+(r+1),!0),o)),prefixCls:i,vertical:a,offset:v[r],value:t,dragging:n===r,index:r,tabIndex:d[r]||0,min:l,max:u,disabled:s,style:h[r],ref:function(t){return e.saveHandle(r,t)}})});return{tracks:r.slice(0,-1).map(function(e,t){var n,r=t+1,o=Ts()((n={},ss()(n,i+"-track",!0),ss()(n,i+"-track-"+r,!0),n));return Ss.a.createElement(ZC,{className:o,vertical:a,included:c,offset:v[r-1],length:v[r]-v[r-1],style:f[t],key:r})}),handles:y}}}]),t}(Ss.a.Component);uw.displayName="Range",uw.propTypes={defaultValue:ks.a.arrayOf(ks.a.number),value:ks.a.arrayOf(ks.a.number),count:ks.a.number,pushable:ks.a.oneOfType([ks.a.bool,ks.a.number]),allowCross:ks.a.bool,disabled:ks.a.bool,tabIndex:ks.a.arrayOf(ks.a.number)},uw.defaultProps={count:1,allowCross:!0,pushable:!1,tabIndex:[]};var pw=ta(uw),fw=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},hw=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.toggleTooltipVisible=function(e,t){n.setState(function(n){var r=n.visibles;return{visibles:us()({},r,ss()({},e,t))}})},n.handleWithTooltip=function(e){var t=e.value,r=e.dragging,o=e.index,i=fw(e,["value","dragging","index"]),a=n.props,c=a.tooltipPrefixCls,s=a.tipFormatter,l=n.state.visibles,u=!!s&&(l[o]||r);return ws.createElement(Ab,{prefixCls:c,title:s?s(t):"",visible:u,placement:"top",transitionName:"zoom-down",key:o},ws.createElement(cw,us()({},i,{value:t,onMouseEnter:function(){return n.toggleTooltipVisible(o,!0)},onMouseLeave:function(){return n.toggleTooltipVisible(o,!1)}})))},n.saveSlider=function(e){n.rcSlider=e},n.state={visibles:{}},n}return gs()(t,e),ds()(t,[{key:"focus",value:function(){this.rcSlider.focus()}},{key:"blur",value:function(){this.rcSlider.focus()}},{key:"render",value:function(){var e=this.props,t=e.range,n=fw(e,["range"]);return t?ws.createElement(pw,us()({},n,{ref:this.saveSlider,handle:this.handleWithTooltip})):ws.createElement(lw,us()({},n,{ref:this.saveSlider,handle:this.handleWithTooltip}))}}]),t}(ws.Component),dw=hw;hw.defaultProps={prefixCls:"ant-slider",tooltipPrefixCls:"ant-tooltip",tipFormatter:function(e){return e.toString()}};var vw=function(e){function t(n){fs()(this,t);var r=ms()(this,e.call(this,n));return r.calcStepOffsetWidth=function(){if(!na()){var e=Object(xs.findDOMNode)(r);e.children.length>0&&(r.calcTimeout&&clearTimeout(r.calcTimeout),r.calcTimeout=setTimeout(function(){var t=(e.lastChild.offsetWidth||0)+1;r.state.lastStepOffsetWidth===t||Math.abs(r.state.lastStepOffsetWidth-t)<=3||r.setState({lastStepOffsetWidth:t})}))}},r.state={flexSupported:!0,lastStepOffsetWidth:0},r.calcStepOffsetWidth=jh()(r.calcStepOffsetWidth,150),r}return gs()(t,e),t.prototype.componentDidMount=function(){this.calcStepOffsetWidth(),na()||this.setState({flexSupported:!1})},t.prototype.componentDidUpdate=function(){this.calcStepOffsetWidth()},t.prototype.componentWillUnmount=function(){this.calcTimeout&&clearTimeout(this.calcTimeout),this.calcStepOffsetWidth&&this.calcStepOffsetWidth.cancel&&this.calcStepOffsetWidth.cancel()},t.prototype.render=function(){var e,t=this.props,n=t.prefixCls,r=t.style,o=void 0===r?{}:r,i=t.className,a=t.children,c=t.direction,s=t.labelPlacement,l=t.iconPrefix,u=t.status,p=t.size,f=t.current,h=t.progressDot,d=t.initial,v=t.icons,m=kl()(t,["prefixCls","style","className","children","direction","labelPlacement","iconPrefix","status","size","current","progressDot","initial","icons"]),y=this.state,g=y.lastStepOffsetWidth,b=y.flexSupported,C=Ss.a.Children.toArray(a).filter(function(e){return!!e}),w=C.length-1,S=h?"vertical":s,x=Ts()(n,n+"-"+c,i,(e={},e[n+"-"+p]=p,e[n+"-label-"+S]="horizontal"===c,e[n+"-dot"]=!!h,e));return Ss.a.createElement("div",us()({className:x,style:o},m),ws.Children.map(C,function(e,t){if(!e)return null;var r=d+t,i=us()({stepNumber:""+(r+1),prefixCls:n,iconPrefix:l,wrapperStyle:o,progressDot:h,icons:v},e.props);return b||"vertical"===c||t===w||(i.itemWidth=100/w+"%",i.adjustMarginRight=-Math.round(g/w+1)),"error"===u&&t===f-1&&(i.className=n+"-next-error"),e.props.status||(i.status=r===f?u:r<f?"finish":"wait"),Object(ws.cloneElement)(e,i)}))},t}(ws.Component);vw.propTypes={prefixCls:ks.a.string,className:ks.a.string,iconPrefix:ks.a.string,direction:ks.a.string,labelPlacement:ks.a.string,children:ks.a.any,status:ks.a.string,size:ks.a.string,progressDot:ks.a.oneOfType([ks.a.bool,ks.a.func]),style:ks.a.object,initial:ks.a.number,current:ks.a.number,icons:ks.a.shape({finish:ks.a.node,error:ks.a.node})},vw.defaultProps={prefixCls:"rc-steps",iconPrefix:"rc",direction:"horizontal",labelPlacement:"horizontal",initial:0,current:0,status:"process",size:"",progressDot:!1};var mw=vw,yw=function(e){function t(){return fs()(this,t),ms()(this,e.apply(this,arguments))}return gs()(t,e),t.prototype.renderIconNode=function(){var e,t=this.props,n=t.prefixCls,r=t.progressDot,o=t.stepNumber,i=t.status,a=t.title,c=t.description,s=t.icon,l=t.iconPrefix,u=t.icons,p=Ts()(n+"-icon",l+"icon",(e={},e[l+"icon-"+s]=s&&ra(s),e[l+"icon-check"]=!s&&"finish"===i&&u&&!u.finish,e[l+"icon-close"]=!s&&"error"===i&&u&&!u.error,e)),f=Ss.a.createElement("span",{className:n+"-icon-dot"});return r?"function"==typeof r?Ss.a.createElement("span",{className:n+"-icon"},r(f,{index:o-1,status:i,title:a,description:c})):Ss.a.createElement("span",{className:n+"-icon"},f):s&&!ra(s)?Ss.a.createElement("span",{className:n+"-icon"},s):u&&u.finish&&"finish"===i?Ss.a.createElement("span",{className:n+"-icon"},u.finish):u&&u.error&&"error"===i?Ss.a.createElement("span",{className:n+"-icon"},u.error):s||"finish"===i||"error"===i?Ss.a.createElement("span",{className:p}):Ss.a.createElement("span",{className:n+"-icon"},o)},t.prototype.render=function(){var e,t=this.props,n=t.className,r=t.prefixCls,o=t.style,i=t.itemWidth,a=t.status,c=void 0===a?"wait":a,s=(t.iconPrefix,t.icon),l=(t.wrapperStyle,t.adjustMarginRight),u=(t.stepNumber,t.description),p=t.title,f=(t.progressDot,t.tailContent),h=(t.icons,kl()(t,["className","prefixCls","style","itemWidth","status","iconPrefix","icon","wrapperStyle","adjustMarginRight","stepNumber","description","title","progressDot","tailContent","icons"])),d=Ts()(r+"-item",r+"-item-"+c,n,(e={},e[r+"-item-custom"]=s,e)),v=us()({},o);return i&&(v.width=i),l&&(v.marginRight=l),Ss.a.createElement("div",us()({},h,{className:d,style:v}),Ss.a.createElement("div",{className:r+"-item-tail"},f),Ss.a.createElement("div",{className:r+"-item-icon"},this.renderIconNode()),Ss.a.createElement("div",{className:r+"-item-content"},Ss.a.createElement("div",{className:r+"-item-title"},p),u&&Ss.a.createElement("div",{className:r+"-item-description"},u)))},t}(Ss.a.Component);yw.propTypes={className:ks.a.string,prefixCls:ks.a.string,style:ks.a.object,wrapperStyle:ks.a.object,itemWidth:ks.a.oneOfType([ks.a.number,ks.a.string]),status:ks.a.string,iconPrefix:ks.a.string,icon:ks.a.node,adjustMarginRight:ks.a.oneOfType([ks.a.number,ks.a.string]),stepNumber:ks.a.string,description:ks.a.any,title:ks.a.any,progressDot:ks.a.oneOfType([ks.a.bool,ks.a.func]),tailContent:ks.a.any,icons:ks.a.shape({finish:ks.a.node,error:ks.a.node})};var gw=yw;mw.Step=gw;var bw=mw,Cw=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e=this.props.prefixCls,t={finish:ws.createElement(Kp,{type:"check",className:e+"-finish-icon"}),error:ws.createElement(Kp,{type:"close",className:e+"-error-icon"})};return ws.createElement(bw,us()({icons:t},this.props))}}]),t}(ws.Component),ww=Cw;Cw.Step=bw.Step,Cw.defaultProps={prefixCls:"ant-steps",iconPrefix:"ant",current:0},Cw.propTypes={prefixCls:zs.string,iconPrefix:zs.string,current:zs.number};var Sw=n(370),xw=n.n(Sw),Mw=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.saveSwitch=function(t){e.rcSwitch=t},e}return gs()(t,e),ds()(t,[{key:"focus",value:function(){this.rcSwitch.focus()}},{key:"blur",value:function(){this.rcSwitch.blur()}},{key:"render",value:function(){var e,t=this.props,n=t.prefixCls,r=t.size,o=t.loading,i=t.className,a=void 0===i?"":i,c=Ts()(a,(e={},ss()(e,n+"-small","small"===r),ss()(e,n+"-loading",o),e)),s=o?ws.createElement(Kp,{type:"loading",className:n+"-loading-icon"}):null;return ws.createElement(Jp.a,{insertExtraNode:!0},ws.createElement(xw.a,us()({},Ps(this.props,["loading"]),{className:c,ref:this.saveSwitch,loadingIcon:s})))}}]),t}(ws.Component),zw=Mw;Mw.defaultProps={prefixCls:"ant-switch"},Mw.propTypes={prefixCls:zs.string,size:zs.oneOf(["small","default","large"]),className:zs.string};var kw=n(372),_w=n.n(kw),Ow=void 0,Ew={position:"absolute",top:"-9999px",width:"50px",height:"50px",overflow:"scroll"},Tw={},Nw=function(){function e(t,n){fs()(this,e),this._cached={},this.columns=t||this.normalize(n)}return ds()(e,[{key:"isAnyColumnsFixed",value:function(){var e=this;return this._cache("isAnyColumnsFixed",function(){return e.columns.some(function(e){return!!e.fixed})})}},{key:"isAnyColumnsLeftFixed",value:function(){var e=this;return this._cache("isAnyColumnsLeftFixed",function(){return e.columns.some(function(e){return"left"===e.fixed||!0===e.fixed})})}},{key:"isAnyColumnsRightFixed",value:function(){var e=this;return this._cache("isAnyColumnsRightFixed",function(){return e.columns.some(function(e){return"right"===e.fixed})})}},{key:"leftColumns",value:function(){var e=this;return this._cache("leftColumns",function(){return e.groupedColumns().filter(function(e){return"left"===e.fixed||!0===e.fixed})})}},{key:"rightColumns",value:function(){var e=this;return this._cache("rightColumns",function(){return e.groupedColumns().filter(function(e){return"right"===e.fixed})})}},{key:"leafColumns",value:function(){var e=this;return this._cache("leafColumns",function(){return e._leafColumns(e.columns)})}},{key:"leftLeafColumns",value:function(){var e=this;return this._cache("leftLeafColumns",function(){return e._leafColumns(e.leftColumns())})}},{key:"rightLeafColumns",value:function(){var e=this;return this._cache("rightLeafColumns",function(){return e._leafColumns(e.rightColumns())})}},{key:"groupedColumns",value:function(){var e=this;return this._cache("groupedColumns",function(){return function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[];o[n]=o[n]||[];var i=[],a=function(e){var t=o.length-n;e&&!e.children&&t>1&&(!e.rowSpan||e.rowSpan<t)&&(e.rowSpan=t)};return t.forEach(function(c,s){var l=us()({},c);o[n].push(l),r.colSpan=r.colSpan||0,l.children&&l.children.length>0?(l.children=e(l.children,n+1,l,o),r.colSpan+=l.colSpan):r.colSpan++;for(var u=0;u<o[n].length-1;++u)a(o[n][u]);s+1===t.length&&a(l),i.push(l)}),i}(e.columns)})}},{key:"normalize",value:function(e){var t=this,n=[];return Ss.a.Children.forEach(e,function(e){if(Ss.a.isValidElement(e)){var r=us()({},e.props);e.key&&(r.key=e.key),e.type.isTableColumnGroup&&(r.children=t.normalize(r.children)),n.push(r)}}),n}},{key:"reset",value:function(e,t){this.columns=e||this.normalize(t),this._cached={}}},{key:"_cache",value:function(e,t){return e in this._cached?this._cached[e]:(this._cached[e]=t(),this._cached[e])}},{key:"_leafColumns",value:function(e){var t=this,n=[];return e.forEach(function(e){e.children?n.push.apply(n,Ls()(t._leafColumns(e.children))):n.push(e)}),n}}]),e}(),Vw=Nw;sa.propTypes={fixed:ks.a.string},sa.contextTypes={table:ks.a.any},la.propTypes={row:ks.a.array,index:ks.a.number,height:ks.a.oneOfType([ks.a.string,ks.a.number]),components:ks.a.any,onHeaderRow:ks.a.func};var Pw=Object(_l.connect)(function(e,t){return{height:ua(e,t)}})(la);fa.propTypes={fixed:ks.a.string,columns:ks.a.array.isRequired,expander:ks.a.object.isRequired,onHeaderRow:ks.a.func},fa.contextTypes={table:ks.a.any};var Hw=function(e){function t(){var e,n,r,o;fs()(this,t);for(var i=arguments.length,a=Array(i),c=0;c<i;c++)a[c]=arguments[c];return n=r=ms()(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(a))),r.handleClick=function(e){var t=r.props,n=t.record,o=t.column.onCellClick;o&&o(n,e)},o=n,ms()(r,o)}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e=this.props,t=e.record,n=e.indentSize,r=e.prefixCls,o=e.indent,i=e.index,a=e.expandIcon,c=e.column,s=e.component,l=c.dataIndex,u=c.render,p=c.className,f=void 0===p?"":p,h=void 0;h="number"==typeof l?Vy()(t,l):l&&0!==l.length?Vy()(t,l):t;var d={},v=void 0,m=void 0;u&&(h=u(h,t,i),ha(h)&&(d=h.props||d,v=d.colSpan,m=d.rowSpan,h=h.children)),c.onCell&&(d=us()({},d,c.onCell(t))),ha(h)&&(h=null);var y=a?Ss.a.createElement("span",{style:{paddingLeft:n*o+"px"},className:r+"-indent indent-level-"+o}):null;return 0===m||0===v?null:(c.align&&(d.style=us()({},d.style,{textAlign:c.align})),Ss.a.createElement(s,us()({className:f,onClick:this.handleClick},d),y,a,h))}}]),t}(Ss.a.Component);Hw.propTypes={record:ks.a.object,prefixCls:ks.a.string,index:ks.a.number,indent:ks.a.number,indentSize:ks.a.number,column:ks.a.object,expandIcon:ks.a.node,component:ks.a.any};var Lw=Hw,Dw=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.onRowClick=function(e){var t=n.props,r=t.record,o=t.index,i=t.onRowClick;i&&i(r,o,e)},n.onRowDoubleClick=function(e){var t=n.props,r=t.record,o=t.index,i=t.onRowDoubleClick;i&&i(r,o,e)},n.onContextMenu=function(e){var t=n.props,r=t.record,o=t.index,i=t.onRowContextMenu;i&&i(r,o,e)},n.onMouseEnter=function(e){var t=n.props,r=t.record,o=t.index,i=t.onRowMouseEnter;(0,t.onHover)(!0,t.rowKey),i&&i(r,o,e)},n.onMouseLeave=function(e){var t=n.props,r=t.record,o=t.index,i=t.onRowMouseLeave;(0,t.onHover)(!1,t.rowKey),i&&i(r,o,e)},n.shouldRender=e.visible,n.state={},n}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){this.state.shouldRender&&this.saveRowRef()}},{key:"shouldComponentUpdate",value:function(e){return!(!this.props.visible&&!e.visible)}},{key:"componentDidUpdate",value:function(){this.state.shouldRender&&!this.rowRef&&this.saveRowRef()}},{key:"setExpanedRowHeight",value:function(){var e=this.props,t=e.store,n=e.rowKey,r=t.getState(),o=r.expandedRowsHeight,i=this.rowRef.getBoundingClientRect().height;o=us()({},o,ss()({},n,i)),t.setState({expandedRowsHeight:o})}},{key:"setRowHeight",value:function(){var e=this.props,t=e.store,n=e.rowKey,r=t.getState(),o=r.fixedColumnsBodyRowsHeight,i=this.rowRef.getBoundingClientRect().height;t.setState({fixedColumnsBodyRowsHeight:us()({},o,ss()({},n,i))})}},{key:"getStyle",value:function(){var e=this.props,t=e.height,n=e.visible;return t&&t!==this.style.height&&(this.style=us()({},this.style,{height:t})),n||this.style.display||(this.style=us()({},this.style,{display:"none"})),this.style}},{key:"saveRowRef",value:function(){this.rowRef=Ms.a.findDOMNode(this);var e=this.props,t=e.isAnyColumnsFixed,n=e.fixed,r=e.expandedRow,o=e.ancestorKeys;t&&(!n&&r&&this.setExpanedRowHeight(),!n&&o.length>=0&&this.setRowHeight())}},{key:"render",value:function(){if(!this.state.shouldRender)return null;var e=this.props,t=e.prefixCls,n=e.columns,r=e.record,o=e.rowKey,i=e.index,a=e.onRow,c=e.indent,s=e.indentSize,l=e.hovered,u=e.height,p=e.visible,f=e.components,h=e.hasExpandIcon,d=e.renderExpandIcon,v=e.renderExpandIconCell,m=f.body.row,y=f.body.cell,g=this.props.className;l&&(g+=" "+t+"-hover");var b=[];v(b);for(var C=0;C<n.length;C++){var w=n[C];aa(void 0===w.onCellClick,"column[onCellClick] is deprecated, please use column[onCell] instead."),b.push(Ss.a.createElement(Lw,{prefixCls:t,record:r,indentSize:s,indent:c,index:i,column:w,key:w.key||w.dataIndex,expandIcon:h(C)&&d(),component:y}))}var S=a(r,i)||{},x=S.className,M=S.style,z=kl()(S,["className","style"]),k={height:u};p||(k.display="none"),k=us()({},k,M);var _=Ts()(t,g,t+"-level-"+c,x);return Ss.a.createElement(m,us()({onClick:this.onRowClick,onDoubleClick:this.onRowDoubleClick,onMouseEnter:this.onMouseEnter,onMouseLeave:this.onMouseLeave,onContextMenu:this.onContextMenu},z,{className:_,style:k,"data-row-key":o}),b)}}],[{key:"getDerivedStateFromProps",value:function(e,t){return t.visible||!t.visible&&e.visible?{shouldRender:!0,visible:e.visible}:{visible:e.visible}}}]),t}(Ss.a.Component);Dw.propTypes={onRow:ks.a.func,onRowClick:ks.a.func,onRowDoubleClick:ks.a.func,onRowContextMenu:ks.a.func,onRowMouseEnter:ks.a.func,onRowMouseLeave:ks.a.func,record:ks.a.object,prefixCls:ks.a.string,onHover:ks.a.func,columns:ks.a.array,height:ks.a.oneOfType([ks.a.string,ks.a.number]),index:ks.a.number,rowKey:ks.a.oneOfType([ks.a.string,ks.a.number]).isRequired,className:ks.a.string,indent:ks.a.number,indentSize:ks.a.number,hasExpandIcon:ks.a.func,hovered:ks.a.bool.isRequired,visible:ks.a.bool.isRequired,store:ks.a.object.isRequired,fixed:ks.a.oneOfType([ks.a.string,ks.a.bool]),renderExpandIcon:ks.a.func,renderExpandIconCell:ks.a.func,components:ks.a.any,expandedRow:ks.a.bool,isAnyColumnsFixed:ks.a.bool,ancestorKeys:ks.a.array.isRequired},Dw.defaultProps={onRow:function(){},onHover:function(){},hasExpandIcon:function(){},renderExpandIcon:function(){},renderExpandIconCell:function(){}},Object(Ys.polyfill)(Dw);var Aw=Object(_l.connect)(function(e,t){var n=e.currentHoverKey,r=e.expandedRowKeys,o=t.rowKey,i=t.ancestorKeys;return{visible:0===i.length||i.every(function(e){return~r.indexOf(e)}),hovered:n===o,height:da(e,t)}})(Dw),Iw=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"shouldComponentUpdate",value:function(e){return!Vs()(e,this.props)}},{key:"render",value:function(){var e=this.props,t=e.expandable,n=e.prefixCls,r=e.onExpand,o=e.needIndentSpaced,i=e.expanded,a=e.record;if(t){var c=i?"expanded":"collapsed";return Ss.a.createElement("span",{className:n+"-expand-icon "+n+"-"+c,onClick:function(e){return r(a,e)}})}return o?Ss.a.createElement("span",{className:n+"-expand-icon "+n+"-spaced"}):null}}]),t}(Ss.a.Component);Iw.propTypes={record:ks.a.object,prefixCls:ks.a.string,expandable:ks.a.any,expanded:ks.a.bool,needIndentSpaced:ks.a.bool,onExpand:ks.a.func};var Rw=Iw,jw=function(e){function t(){var e,n,r,o;fs()(this,t);for(var i=arguments.length,a=Array(i),c=0;c<i;c++)a[c]=arguments[c];return n=r=ms()(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(a))),r.hasExpandIcon=function(e){var t=r.props.expandRowByClick;return!r.expandIconAsCell&&!t&&e===r.expandIconColumnIndex},r.handleExpandChange=function(e,t){var n=r.props,o=n.onExpandedChange,i=n.expanded,a=n.rowKey;r.expandable&&o(!i,e,t,a)},r.handleRowClick=function(e,t,n){var o=r.props,i=o.expandRowByClick,a=o.onRowClick;i&&r.handleExpandChange(e,n),a&&a(e,t,n)},r.renderExpandIcon=function(){var e=r.props,t=e.prefixCls,n=e.expanded,o=e.record,i=e.needIndentSpaced;return Ss.a.createElement(Rw,{expandable:r.expandable,prefixCls:t,onExpand:r.handleExpandChange,needIndentSpaced:i,expanded:n,record:o})},r.renderExpandIconCell=function(e){if(r.expandIconAsCell){var t=r.props.prefixCls;e.push(Ss.a.createElement("td",{className:t+"-expand-icon-cell",key:"rc-table-expand-icon-cell"},r.renderExpandIcon()))}},o=n,ms()(r,o)}return gs()(t,e),ds()(t,[{key:"componentWillUnmount",value:function(){this.handleDestroy()}},{key:"handleDestroy",value:function(){var e=this.props,t=e.onExpandedChange,n=e.rowKey,r=e.record;this.expandable&&t(!1,r,null,n,!0)}},{key:"render",value:function(){var e=this.props,t=e.childrenColumnName,n=e.expandedRowRender,r=e.indentSize,o=e.record,i=e.fixed;this.expandIconAsCell="right"!==i&&this.props.expandIconAsCell,this.expandIconColumnIndex="right"!==i?this.props.expandIconColumnIndex:-1;var a=o[t];this.expandable=!(!a&&!n);var c={indentSize:r,onRowClick:this.handleRowClick,hasExpandIcon:this.hasExpandIcon,renderExpandIcon:this.renderExpandIcon,renderExpandIconCell:this.renderExpandIconCell};return this.props.children(c)}}]),t}(Ss.a.Component);jw.propTypes={prefixCls:ks.a.string.isRequired,rowKey:ks.a.oneOfType([ks.a.string,ks.a.number]).isRequired,fixed:ks.a.oneOfType([ks.a.string,ks.a.bool]),record:ks.a.object.isRequired,indentSize:ks.a.number,needIndentSpaced:ks.a.bool.isRequired,expandRowByClick:ks.a.bool,expanded:ks.a.bool.isRequired,expandIconAsCell:ks.a.bool,expandIconColumnIndex:ks.a.number,childrenColumnName:ks.a.string,expandedRowRender:ks.a.func,onExpandedChange:ks.a.func.isRequired,onRowClick:ks.a.func,children:ks.a.func.isRequired};var Fw=Object(_l.connect)(function(e,t){var n=e.expandedRowKeys,r=t.rowKey;return{expanded:!!~n.indexOf(r)}})(jw),Kw=function(e){function t(){var e,n,r,o;fs()(this,t);for(var i=arguments.length,a=Array(i),c=0;c<i;c++)a[c]=arguments[c];return n=r=ms()(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(a))),r.handleRowHover=function(e,t){r.props.store.setState({currentHoverKey:e?t:null})},r.renderRows=function(e,t){for(var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],o=r.context.table,i=o.columnManager,a=o.components,c=o.props,s=c.prefixCls,l=c.childrenColumnName,u=c.rowClassName,p=c.rowRef,f=c.onRowClick,h=c.onRowDoubleClick,d=c.onRowContextMenu,v=c.onRowMouseEnter,m=c.onRowMouseLeave,y=c.onRow,g=r.props,b=g.getRowKey,C=g.fixed,w=g.expander,S=g.isAnyColumnsFixed,x=[],M=0;M<e.length;M++)!function(o){var c=e[o],g=b(c,o),M="string"==typeof u?u:u(c,o,t),z={};i.isAnyColumnsFixed()&&(z.onHover=r.handleRowHover);var k=void 0;k="left"===C?i.leftLeafColumns():"right"===C?i.rightLeafColumns():r.getColumns(i.leafColumns());var _=s+"-row",O=Ss.a.createElement(Fw,us()({},w.props,{fixed:C,index:o,prefixCls:_,record:c,key:g,rowKey:g,onRowClick:f,needIndentSpaced:w.needIndentSpaced,onExpandedChange:w.handleExpandChange}),function(e){return Ss.a.createElement(Aw,us()({fixed:C,indent:t,className:M,record:c,index:o,prefixCls:_,childrenColumnName:l,columns:k,onRow:y,onRowDoubleClick:h,onRowContextMenu:d,onRowMouseEnter:v,onRowMouseLeave:m},z,{rowKey:g,ancestorKeys:n,ref:p(c,o,t),components:a,isAnyColumnsFixed:S},e))});x.push(O),w.renderRows(r.renderRows,x,c,o,t,C,g,n)}(M);return x},o=n,ms()(r,o)}return gs()(t,e),ds()(t,[{key:"getColumns",value:function(e){var t=this.props,n=t.columns,r=void 0===n?[]:n,o=t.fixed,i=this.context.table,a=i.props.prefixCls;return(e||r).map(function(e){return us()({},e,{className:e.fixed&&!o?Ts()(a+"-fixed-columns-in-body",e.className):e.className})})}},{key:"render",value:function(){var e=this.context.table,t=e.components,n=e.props,r=n.prefixCls,o=n.scroll,i=n.data,a=n.getBodyWrapper,c=this.props,s=c.expander,l=c.tableClassName,u=c.hasHead,p=c.hasBody,f=c.fixed,h={};!f&&o.x&&(!0===o.x?h.tableLayout="fixed":h.width=o.x);var d=p?t.table:"table",v=t.body.wrapper,m=void 0;p&&(m=Ss.a.createElement(v,{className:r+"-tbody"},this.renderRows(i,0)),a&&(m=a(m)));var y=this.getColumns();return Ss.a.createElement(d,{className:l,style:h,key:"table"},Ss.a.createElement(sa,{columns:y,fixed:f}),u&&Ss.a.createElement(fa,{expander:s,columns:y,fixed:f}),m)}}]),t}(Ss.a.Component);Kw.propTypes={fixed:ks.a.oneOfType([ks.a.string,ks.a.bool]),columns:ks.a.array.isRequired,tableClassName:ks.a.string.isRequired,hasHead:ks.a.bool.isRequired,hasBody:ks.a.bool.isRequired,store:ks.a.object.isRequired,expander:ks.a.object.isRequired,getRowKey:ks.a.func,isAnyColumnsFixed:ks.a.bool},Kw.contextTypes={table:ks.a.any};var Bw=Object(_l.connect)()(Kw);va.propTypes={fixed:ks.a.oneOfType([ks.a.string,ks.a.bool]),columns:ks.a.array.isRequired,tableClassName:ks.a.string.isRequired,handleBodyScrollLeft:ks.a.func.isRequired,expander:ks.a.object.isRequired},va.contextTypes={table:ks.a.any},ma.propTypes={fixed:ks.a.oneOfType([ks.a.string,ks.a.bool]),columns:ks.a.array.isRequired,tableClassName:ks.a.string.isRequired,handleWheel:ks.a.func.isRequired,handleBodyScroll:ks.a.func.isRequired,getRowKey:ks.a.func.isRequired,expander:ks.a.object.isRequired,isAnyColumnsFixed:ks.a.bool},ma.contextTypes={table:ks.a.any};var Ww=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));Uw.call(n);var r=e.data,o=e.childrenColumnName,i=e.defaultExpandAllRows,a=e.expandedRowKeys,c=e.defaultExpandedRowKeys,s=e.getRowKey,l=[],u=[].concat(Ls()(r));if(i)for(var p=0;p<u.length;p++){var f=u[p];l.push(s(f,p)),u=u.concat(f[o]||[])}else l=a||c;return n.columnManager=e.columnManager,n.store=e.store,n.store.setState({expandedRowsHeight:{},expandedRowKeys:l}),n}return gs()(t,e),ds()(t,[{key:"componentDidUpdate",value:function(){"expandedRowKeys"in this.props&&this.store.setState({expandedRowKeys:this.props.expandedRowKeys})}},{key:"renderExpandedRow",value:function(e,t,n,r,o,i,a){var c=this,s=this.props,l=s.prefixCls,u=s.expandIconAsCell,p=s.indentSize,f=o[o.length-1],h=f+"-extra-row",d={body:{row:"tr",cell:"td"}},v=void 0;v="left"===a?this.columnManager.leftLeafColumns().length:"right"===a?this.columnManager.rightLeafColumns().length:this.columnManager.leafColumns().length;var m=[{key:"extra-row",render:function(){var r=c.store.getState(),o=r.expandedRowKeys,s=!!~o.indexOf(f);return{props:{colSpan:v},children:"right"!==a?n(e,t,i,s):"&nbsp;"}}}];return u&&"right"!==a&&m.unshift({key:"expand-icon-placeholder",render:function(){return null}}),Ss.a.createElement(Aw,{key:h,columns:m,className:r,rowKey:h,ancestorKeys:o,prefixCls:l+"-expanded-row",indentSize:p,indent:i,fixed:a,components:d,expandedRow:!0})}},{key:"render",value:function(){var e=this.props,t=e.data,n=e.childrenColumnName,r=e.children,o=t.some(function(e){return e[n]});return r({props:this.props,needIndentSpaced:o,renderRows:this.renderRows,handleExpandChange:this.handleExpandChange,renderExpandIndentCell:this.renderExpandIndentCell})}}]),t}(Ss.a.Component);Ww.propTypes={expandIconAsCell:ks.a.bool,expandedRowKeys:ks.a.array,expandedRowClassName:ks.a.func,defaultExpandAllRows:ks.a.bool,defaultExpandedRowKeys:ks.a.array,expandIconColumnIndex:ks.a.number,expandedRowRender:ks.a.func,childrenColumnName:ks.a.string,indentSize:ks.a.number,onExpand:ks.a.func,onExpandedRowsChange:ks.a.func,columnManager:ks.a.object.isRequired,store:ks.a.object.isRequired,prefixCls:ks.a.string.isRequired,data:ks.a.array,children:ks.a.func.isRequired,getRowKey:ks.a.func.isRequired},Ww.defaultProps={expandIconAsCell:!1,expandedRowClassName:function(){return""},expandIconColumnIndex:0,defaultExpandAllRows:!1,defaultExpandedRowKeys:[],childrenColumnName:"children",indentSize:15,onExpand:function(){},onExpandedRowsChange:function(){}};var Uw=function(){var e=this;this.handleExpandChange=function(t,n,r,o){var i=arguments.length>4&&void 0!==arguments[4]&&arguments[4];r&&(r.preventDefault(),r.stopPropagation());var a=e.props,c=a.onExpandedRowsChange,s=a.onExpand,l=e.store.getState(),u=l.expandedRowKeys;if(t)u=[].concat(Ls()(u),[o]);else{-1!==u.indexOf(o)&&(u=ca(u,o))}e.props.expandedRowKeys||e.store.setState({expandedRowKeys:u}),c(u),i||s(t,n)},this.renderExpandIndentCell=function(t,n){var r=e.props,o=r.prefixCls;if(r.expandIconAsCell&&"right"!==n&&t.length){var i={key:"rc-table-expand-icon-cell",className:o+"-expand-icon-th",title:"",rowSpan:t.length};t[0].unshift(us()({},i,{column:i}))}},this.renderRows=function(t,n,r,o,i,a,c,s){var l=e.props,u=l.expandedRowClassName,p=l.expandedRowRender,f=l.childrenColumnName,h=r[f],d=[].concat(Ls()(s),[c]),v=i+1;p&&n.push(e.renderExpandedRow(r,o,p,u(r,o,i),d,v,a)),h&&n.push.apply(n,Ls()(t(h,v,d)))}};Object(Ys.polyfill)(Ww);var qw=Object(_l.connect)()(Ww),Yw=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.state={},n.getRowKey=function(e,t){var r=n.props.rowKey,o="function"==typeof r?r(e,t):e[r];return aa(void 0!==o,"Each record in table should have a unique `key` prop,or set `rowKey` to an unique primary key."),void 0===o?t:o},n.handleWindowResize=function(){n.syncFixedTableRowHeight(),n.setScrollPositionClassName()},n.syncFixedTableRowHeight=function(){var e=n.tableNode.getBoundingClientRect();if(!(void 0!==e.height&&e.height<=0)){var t=n.props.prefixCls,r=n.headTable?n.headTable.querySelectorAll("thead"):n.bodyTable.querySelectorAll("thead"),o=n.bodyTable.querySelectorAll("."+t+"-row")||[],i=[].map.call(r,function(e){return e.getBoundingClientRect().height||"auto"}),a=n.store.getState(),c=[].reduce.call(o,function(e,t){var n=t.getAttribute("data-row-key"),r=t.getBoundingClientRect().height||a.fixedColumnsBodyRowsHeight[n]||"auto";return e[n]=r,e},{});Vs()(a.fixedColumnsHeadRowsHeight,i)&&Vs()(a.fixedColumnsBodyRowsHeight,c)||n.store.setState({fixedColumnsHeadRowsHeight:i,fixedColumnsBodyRowsHeight:c})}},n.handleBodyScrollLeft=function(e){if(e.currentTarget===e.target){var t=e.target,r=n.props.scroll,o=void 0===r?{}:r,i=n.headTable,a=n.bodyTable;t.scrollLeft!==n.lastScrollLeft&&o.x&&(t===a&&i?i.scrollLeft=t.scrollLeft:t===i&&a&&(a.scrollLeft=t.scrollLeft),n.setScrollPositionClassName()),n.lastScrollLeft=t.scrollLeft}},n.handleBodyScrollTop=function(e){var t=e.target;if(e.currentTarget===t){var r=n.props.scroll,o=void 0===r?{}:r,i=n.headTable,a=n.bodyTable,c=n.fixedColumnsBodyLeft,s=n.fixedColumnsBodyRight;if(t.scrollTop!==n.lastScrollTop&&o.y&&t!==i){var l=t.scrollTop;c&&t!==c&&(c.scrollTop=l),s&&t!==s&&(s.scrollTop=l),a&&t!==a&&(a.scrollTop=l)}n.lastScrollTop=t.scrollTop}},n.handleBodyScroll=function(e){n.handleBodyScrollLeft(e),n.handleBodyScrollTop(e)},n.handleWheel=function(e){var t=n.props.scroll,r=void 0===t?{}:t;if(window.navigator.userAgent.match(/Trident\/7\./)&&r.y){e.preventDefault();var o=e.deltaY,i=e.target,a=n.bodyTable,c=n.fixedColumnsBodyLeft,s=n.fixedColumnsBodyRight,l=0;l=n.lastScrollTop?n.lastScrollTop+o:o,c&&i!==c&&(c.scrollTop=l),s&&i!==s&&(s.scrollTop=l),a&&i!==a&&(a.scrollTop=l)}},n.saveRef=function(e){return function(t){n[e]=t}},["onRowClick","onRowDoubleClick","onRowContextMenu","onRowMouseEnter","onRowMouseLeave"].forEach(function(t){aa(void 0===e[t],t+" is deprecated, please use onRow instead.")}),aa(void 0===e.getBodyWrapper,"getBodyWrapper is deprecated, please use custom components instead."),n.columnManager=new Vw(e.columns,e.children),n.store=Object(_l.create)({currentHoverKey:null,fixedColumnsHeadRowsHeight:[],fixedColumnsBodyRowsHeight:{}}),n.setScrollPosition("left"),n.debouncedWindowResize=ia(n.handleWindowResize,150),n}return gs()(t,e),ds()(t,[{key:"getChildContext",value:function(){return{table:{props:this.props,columnManager:this.columnManager,saveRef:this.saveRef,components:_w()({table:"table",header:{wrapper:"thead",row:"tr",cell:"th"},body:{wrapper:"tbody",row:"tr",cell:"td"}},this.props.components)}}}},{key:"componentDidMount",value:function(){this.columnManager.isAnyColumnsFixed()&&(this.handleWindowResize(),this.resizeEvent=r(window,"resize",this.debouncedWindowResize)),this.headTable&&(this.headTable.scrollLeft=0),this.bodyTable&&(this.bodyTable.scrollLeft=0)}},{key:"componentDidUpdate",value:function(e){this.columnManager.isAnyColumnsFixed()&&(this.handleWindowResize(),this.resizeEvent||(this.resizeEvent=r(window,"resize",this.debouncedWindowResize))),e.data.length>0&&0===this.props.data.length&&this.hasScrollX()&&this.resetScrollX()}},{key:"componentWillUnmount",value:function(){this.resizeEvent&&this.resizeEvent.remove(),this.debouncedWindowResize&&this.debouncedWindowResize.cancel()}},{key:"setScrollPosition",value:function(e){if(this.scrollPosition=e,this.tableNode){var t=this.props.prefixCls;"both"===e?Zs()(this.tableNode).remove(new RegExp("^"+t+"-scroll-position-.+$")).add(t+"-scroll-position-left").add(t+"-scroll-position-right"):Zs()(this.tableNode).remove(new RegExp("^"+t+"-scroll-position-.+$")).add(t+"-scroll-position-"+e)}}},{key:"setScrollPositionClassName",value:function(){var e=this.bodyTable,t=0===e.scrollLeft,n=e.scrollLeft+1>=e.children[0].getBoundingClientRect().width-e.getBoundingClientRect().width;t&&n?this.setScrollPosition("both"):t?this.setScrollPosition("left"):n?this.setScrollPosition("right"):"middle"!==this.scrollPosition&&this.setScrollPosition("middle")}},{key:"resetScrollX",value:function(){this.headTable&&(this.headTable.scrollLeft=0),this.bodyTable&&(this.bodyTable.scrollLeft=0)}},{key:"hasScrollX",value:function(){var e=this.props.scroll;return"x"in(void 0===e?{}:e)}},{key:"renderMainTable",value:function(){var e=this.props,t=e.scroll,n=e.prefixCls,r=this.columnManager.isAnyColumnsFixed(),o=r||t.x||t.y,i=[this.renderTable({columns:this.columnManager.groupedColumns(),isAnyColumnsFixed:r}),this.renderEmptyText(),this.renderFooter()];return o?Ss.a.createElement("div",{className:n+"-scroll"},i):i}},{key:"renderLeftFixedTable",value:function(){var e=this.props.prefixCls;return Ss.a.createElement("div",{className:e+"-fixed-left"},this.renderTable({columns:this.columnManager.leftColumns(),fixed:"left"}))}},{key:"renderRightFixedTable",value:function(){var e=this.props.prefixCls;return Ss.a.createElement("div",{className:e+"-fixed-right"},this.renderTable({columns:this.columnManager.rightColumns(),fixed:"right"}))}},{key:"renderTable",value:function(e){var t=e.columns,n=e.fixed,r=e.isAnyColumnsFixed,o=this.props,i=o.prefixCls,a=o.scroll,c=void 0===a?{}:a,s=c.x||n?i+"-fixed":"";return[Ss.a.createElement(va,{key:"head",columns:t,fixed:n,tableClassName:s,handleBodyScrollLeft:this.handleBodyScrollLeft,expander:this.expander}),Ss.a.createElement(ma,{key:"body",columns:t,fixed:n,tableClassName:s,getRowKey:this.getRowKey,handleWheel:this.handleWheel,handleBodyScroll:this.handleBodyScroll,expander:this.expander,isAnyColumnsFixed:r})]}},{key:"renderTitle",value:function(){var e=this.props,t=e.title,n=e.prefixCls;return t?Ss.a.createElement("div",{className:n+"-title",key:"title"},t(this.props.data)):null}},{key:"renderFooter",value:function(){var e=this.props,t=e.footer,n=e.prefixCls;return t?Ss.a.createElement("div",{className:n+"-footer",key:"footer"},t(this.props.data)):null}},{key:"renderEmptyText",value:function(){var e=this.props,t=e.emptyText,n=e.prefixCls;if(e.data.length)return null;var r=n+"-placeholder";return Ss.a.createElement("div",{className:r,key:"emptyText"},"function"==typeof t?t():t)}},{key:"render",value:function(){var e=this,t=this.props,n=t.prefixCls;this.state.columns?this.columnManager.reset(t.columns):this.state.children&&this.columnManager.reset(null,t.children);var r=t.prefixCls;t.className&&(r+=" "+t.className),(t.useFixedHeader||t.scroll&&t.scroll.y)&&(r+=" "+n+"-fixed-header"),"both"===this.scrollPosition?r+=" "+n+"-scroll-position-left "+n+"-scroll-position-right":r+=" "+n+"-scroll-position-"+this.scrollPosition;var o=this.columnManager.isAnyColumnsLeftFixed(),i=this.columnManager.isAnyColumnsRightFixed();return Ss.a.createElement(_l.Provider,{store:this.store},Ss.a.createElement(qw,us()({},t,{columnManager:this.columnManager,getRowKey:this.getRowKey}),function(a){return e.expander=a,Ss.a.createElement("div",{ref:e.saveRef("tableNode"),className:r,style:t.style,id:t.id},e.renderTitle(),Ss.a.createElement("div",{className:n+"-content"},e.renderMainTable(),o&&e.renderLeftFixedTable(),i&&e.renderRightFixedTable()))}))}}],[{key:"getDerivedStateFromProps",value:function(e,t){return e.columns&&e.columns!==t.columns?{columns:e.columns,children:null}:e.children!==t.children?{columns:null,children:e.children}:null}}]),t}(Ss.a.Component);Yw.propTypes=us()({data:ks.a.array,useFixedHeader:ks.a.bool,columns:ks.a.array,prefixCls:ks.a.string,bodyStyle:ks.a.object,style:ks.a.object,rowKey:ks.a.oneOfType([ks.a.string,ks.a.func]),rowClassName:ks.a.oneOfType([ks.a.string,ks.a.func]),onRow:ks.a.func,onHeaderRow:ks.a.func,onRowClick:ks.a.func,onRowDoubleClick:ks.a.func,onRowContextMenu:ks.a.func,onRowMouseEnter:ks.a.func,onRowMouseLeave:ks.a.func,showHeader:ks.a.bool,title:ks.a.func,id:ks.a.string,footer:ks.a.func,emptyText:ks.a.oneOfType([ks.a.node,ks.a.func]),scroll:ks.a.object,rowRef:ks.a.func,getBodyWrapper:ks.a.func,children:ks.a.node,components:ks.a.shape({table:ks.a.any,header:ks.a.shape({wrapper:ks.a.any,row:ks.a.any,cell:ks.a.any}),body:ks.a.shape({wrapper:ks.a.any,row:ks.a.any,cell:ks.a.any})})},qw.PropTypes),Yw.childContextTypes={table:ks.a.any,components:ks.a.any},Yw.defaultProps={data:[],useFixedHeader:!1,rowKey:"key",rowClassName:function(){return""},onRow:function(){},onHeaderRow:function(){},prefixCls:"rc-table",bodyStyle:{},style:{},showHeader:!0,scroll:{},rowRef:function(){return null},emptyText:function(){return"No Data"}},Object(Ys.polyfill)(Yw);var Gw=Yw;ya.propTypes={className:ks.a.string,colSpan:ks.a.number,title:ks.a.node,dataIndex:ks.a.string,width:ks.a.oneOfType([ks.a.number,ks.a.string]),fixed:ks.a.oneOf([!0,"left","right"]),render:ks.a.func,onCellClick:ks.a.func,onCell:ks.a.func,onHeaderCell:ks.a.func};var Xw=ya,$w=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),t}(ws.Component);$w.isTableColumnGroup=!0,$w.propTypes={title:ks.a.node};var Jw=$w;Gw.Column=Xw,Gw.ColumnGroup=Jw;var Zw=Gw,Qw=n(407),eS=n.n(Qw),tS=function(e){return ws.createElement("div",{className:e.className,onClick:e.onClick},e.children)},nS=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));n.setNeverShown=function(e){var t=xs.findDOMNode(n);!!eS()(t,".ant-table-scroll")&&(n.neverShown=!!e.fixed)},n.setSelectedKeys=function(e){var t=e.selectedKeys;n.setState({selectedKeys:t})},n.handleClearFilters=function(){n.setState({selectedKeys:[]},n.handleConfirm)},n.handleConfirm=function(){n.setVisible(!1),n.setState({},n.confirmFilter)},n.onVisibleChange=function(e){n.setVisible(e),e||n.confirmFilter()},n.handleMenuItemClick=function(e){if(e.keyPath&&!(e.keyPath.length<=1)){var t=n.state.keyPathOfSelectedItem;n.state.selectedKeys.indexOf(e.key)>=0?delete t[e.key]:t[e.key]=e.keyPath,n.setState({keyPathOfSelectedItem:t})}},n.renderFilterIcon=function(){var e=n.props,t=e.column,r=e.locale,o=e.prefixCls,i=n.props.selectedKeys.length>0,a=t.filterIcon;"function"==typeof a&&(a=a(i));var c=i?o+"-selected":"";return a?ws.cloneElement(a,{title:r.filterTitle,className:Ts()(o+"-icon",a.props.className)}):ws.createElement(Kp,{title:r.filterTitle,type:"filter",className:c})};var r="filterDropdownVisible"in e.column&&e.column.filterDropdownVisible;return n.state={selectedKeys:e.selectedKeys,keyPathOfSelectedItem:{},visible:r},n}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){var e=this.props.column;this.setNeverShown(e)}},{key:"componentWillReceiveProps",value:function(e){var t=e.column;this.setNeverShown(t);var n={};"selectedKeys"in e&&!Vs()(this.props.selectedKeys,e.selectedKeys)&&(n.selectedKeys=e.selectedKeys),"filterDropdownVisible"in t&&(n.visible=t.filterDropdownVisible),Object.keys(n).length>0&&this.setState(n)}},{key:"setVisible",value:function(e){var t=this.props.column;"filterDropdownVisible"in t||this.setState({visible:e}),t.onFilterDropdownVisibleChange&&t.onFilterDropdownVisibleChange(e)}},{key:"confirmFilter",value:function(){var e=this.state.selectedKeys;Vs()(e,this.props.selectedKeys)||this.props.confirmFilter(this.props.column,e)}},{key:"renderMenuItem",value:function(e){var t=this.props.column,n=this.state.selectedKeys,r=!("filterMultiple"in t)||t.filterMultiple,o=r?ws.createElement(lv,{checked:n.indexOf(e.value.toString())>=0}):ws.createElement(ph.default,{checked:n.indexOf(e.value.toString())>=0});return ws.createElement(Ju,{key:e.value},o,ws.createElement("span",null,e.text))}},{key:"hasSubMenu",value:function(){var e=this.props.column.filters;return(void 0===e?[]:e).some(function(e){return!!(e.children&&e.children.length>0)})}},{key:"renderMenus",value:function(e){var t=this;return e.map(function(e){if(e.children&&e.children.length>0){var n=t.state.keyPathOfSelectedItem,r=Object.keys(n).some(function(t){return n[t].indexOf(e.value)>=0}),o=r?t.props.dropdownPrefixCls+"-submenu-contain-selected":"";return ws.createElement(Au,{title:e.text,className:o,key:e.value.toString()},t.renderMenus(e.children))}return t.renderMenuItem(e)})}},{key:"render",value:function(){var e=this,t=this.props,n=t.column,r=t.locale,o=t.prefixCls,i=t.dropdownPrefixCls,a=t.getPopupContainer,c=!("filterMultiple"in n)||n.filterMultiple,s=Ts()(ss()({},i+"-menu-without-submenu",!this.hasSubMenu())),l=n.filterDropdown;l&&"function"==typeof l&&(l=l({prefixCls:i+"-custom",setSelectedKeys:function(t){return e.setSelectedKeys({selectedKeys:t})},selectedKeys:this.state.selectedKeys,confirm:this.handleConfirm,clearFilters:this.handleClearFilters,filters:n.filters,getPopupContainer:function(e){return e.parentNode}}));var u=l?ws.createElement(tS,null,l):ws.createElement(tS,{className:o+"-dropdown"},ws.createElement(np,{multiple:c,onClick:this.handleMenuItemClick,prefixCls:i+"-menu",className:s,onSelect:this.setSelectedKeys,onDeselect:this.setSelectedKeys,selectedKeys:this.state.selectedKeys,getPopupContainer:function(e){return e.parentNode}},this.renderMenus(n.filters)),ws.createElement("div",{className:o+"-dropdown-btns"},ws.createElement("a",{className:o+"-dropdown-link confirm",onClick:this.handleConfirm},r.filterConfirm),ws.createElement("a",{className:o+"-dropdown-link clear",onClick:this.handleClearFilters},r.filterReset)));return ws.createElement(Hm,{trigger:["click"],overlay:u,visible:!this.neverShown&&this.state.visible,onVisibleChange:this.onVisibleChange,getPopupContainer:a,forceRender:!0},this.renderFilterIcon())}}]),t}(ws.Component),rS=nS;nS.defaultProps={handleFilter:function(){},column:{}};var oS=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},iS=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.state={checked:n.getCheckState(e)},n}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){this.subscribe()}},{key:"componentWillUnmount",value:function(){this.unsubscribe&&this.unsubscribe()}},{key:"subscribe",value:function(){var e=this,t=this.props.store;this.unsubscribe=t.subscribe(function(){var t=e.getCheckState(e.props);e.setState({checked:t})})}},{key:"getCheckState",value:function(e){var t=e.store,n=e.defaultSelection,r=e.rowIndex;return t.getState().selectionDirty?t.getState().selectedRowKeys.indexOf(r)>=0:t.getState().selectedRowKeys.indexOf(r)>=0||n.indexOf(r)>=0}},{key:"render",value:function(){var e=this.props,t=e.type,n=e.rowIndex,r=oS(e,["type","rowIndex"]),o=this.state.checked;return"radio"===t?ws.createElement(ph.default,us()({checked:o,value:n},r)):ws.createElement(lv,us()({checked:o},r))}}]),t}(ws.Component),aS=iS,cS=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.handleSelectAllChagne=function(e){var t=e.target.checked;n.props.onSelect(t?"all":"removeAll",0,null)},n.defaultSelections=e.hideDefaultSelections?[]:[{key:"all",text:e.locale.selectAll,onSelect:function(){}},{key:"invert",text:e.locale.selectInvert,onSelect:function(){}}],n.state={checked:n.getCheckState(e),indeterminate:n.getIndeterminateState(e)},n}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){this.subscribe()}},{key:"componentWillReceiveProps",value:function(e){this.setCheckState(e)}},{key:"componentWillUnmount",value:function(){this.unsubscribe&&this.unsubscribe()}},{key:"subscribe",value:function(){var e=this,t=this.props.store;this.unsubscribe=t.subscribe(function(){e.setCheckState(e.props)})}},{key:"checkSelection",value:function(e,t,n){var r=this.props,o=r.store,i=r.getCheckboxPropsByItem,a=r.getRecordKey;return("every"===t||"some"===t)&&(n?e[t](function(e,t){return i(e,t).defaultChecked}):e[t](function(e,t){return o.getState().selectedRowKeys.indexOf(a(e,t))>=0}))}},{key:"setCheckState",value:function(e){var t=this.getCheckState(e),n=this.getIndeterminateState(e);this.setState(function(e){var r={};return n!==e.indeterminate&&(r.indeterminate=n),t!==e.checked&&(r.checked=t),r})}},{key:"getCheckState",value:function(e){var t=e.store,n=e.data;return!!n.length&&(t.getState().selectionDirty?this.checkSelection(n,"every",!1):this.checkSelection(n,"every",!1)||this.checkSelection(n,"every",!0))}},{key:"getIndeterminateState",value:function(e){var t=e.store,n=e.data;return!!n.length&&(t.getState().selectionDirty?this.checkSelection(n,"some",!1)&&!this.checkSelection(n,"every",!1):this.checkSelection(n,"some",!1)&&!this.checkSelection(n,"every",!1)||this.checkSelection(n,"some",!0)&&!this.checkSelection(n,"every",!0))}},{key:"renderMenus",value:function(e){var t=this;return e.map(function(e,n){return ws.createElement(Fb.Item,{key:e.key||n},ws.createElement("div",{onClick:function(){t.props.onSelect(e.key,n,e.onSelect)}},e.text))})}},{key:"render",value:function(){var e=this.props,t=e.disabled,n=e.prefixCls,r=e.selections,o=e.getPopupContainer,i=this.state,a=i.checked,c=i.indeterminate,s=n+"-selection",l=null;if(r){var u=Array.isArray(r)?this.defaultSelections.concat(r):this.defaultSelections,p=ws.createElement(Fb,{className:s+"-menu",selectedKeys:[]},this.renderMenus(u));l=u.length>0?ws.createElement(Hm,{overlay:p,getPopupContainer:o},ws.createElement("div",{className:s+"-down"},ws.createElement(Kp,{type:"down"}))):null}return ws.createElement("div",{className:s},ws.createElement(lv,{className:Ts()(ss()({},s+"-select-all-custom",l)),checked:a,indeterminate:c,disabled:t,onChange:this.handleSelectAllChagne}),l)}}]),t}(ws.Component),sS=cS,lS=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),t}(ws.Component),uS=lS,pS=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),t}(ws.Component),fS=pS;pS.__ANT_TABLE_COLUMN_GROUP=!0;var hS=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},dS={onChange:Ma,onShowSizeChange:Ma},vS={},mS=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.getCheckboxPropsByItem=function(e,t){var r=ka(n.props);if(!r.getCheckboxProps)return{};var o=n.getRecordKey(e,t);return n.CheckboxPropsCache[o]||(n.CheckboxPropsCache[o]=r.getCheckboxProps(e)),n.CheckboxPropsCache[o]},n.onRow=function(e,t){var r=n.props,o=r.onRow,i=r.prefixCls,a=o?o(e,t):{};return us()({},a,{prefixCls:i,store:n.store,rowKey:n.getRecordKey(e,t)})},n.handleFilter=function(e,t){var r=n.props,o=us()({},n.state.pagination),i=us()({},n.state.filters,ss()({},n.getColumnKey(e),t)),a=[];wa(n.columns,function(e){e.children||a.push(n.getColumnKey(e))}),Object.keys(i).forEach(function(e){a.indexOf(e)<0&&delete i[e]}),r.pagination&&(o.current=1,o.onChange(o.current));var c={pagination:o,filters:{}},s=us()({},i);n.getFilteredValueColumns().forEach(function(e){var t=n.getColumnKey(e);t&&delete s[t]}),Object.keys(s).length>0&&(c.filters=s),"object"===Cs()(r.pagination)&&"current"in r.pagination&&(c.pagination=us()({},o,{current:n.state.pagination.current})),n.setState(c,function(){n.store.setState({selectionDirty:!1});var e=n.props.onChange;e&&e.apply(null,n.prepareParamsArguments(us()({},n.state,{selectionDirty:!1,filters:i,pagination:o})))})},n.handleSelect=function(e,t,r){var o=r.target.checked,i=r.nativeEvent,a=n.store.getState().selectionDirty?[]:n.getDefaultSelection(),c=n.store.getState().selectedRowKeys.concat(a),s=n.getRecordKey(e,t),l=n.state.pivot,u=n.getFlatCurrentPageData(),p=t;if(n.props.expandedRowRender&&(p=u.findIndex(function(e){return n.getRecordKey(e,t)===s})),i.shiftKey&&void 0!==l&&p!==l){for(var f=[],h=Math.sign(l-p),d=Math.abs(l-p),v=0;v<=d;)!function(){var e=p+v*h;v+=1;var t=u[e],r=n.getRecordKey(t,e);n.getCheckboxPropsByItem(t,e).disabled||(c.includes(r)?o||(c=c.filter(function(e){return r!==e}),f.push(r)):o&&(c.push(r),f.push(r)))}();n.setState({pivot:p}),n.store.setState({selectionDirty:!0}),n.setSelectedRowKeys(c,{selectWay:"onSelectMultiple",record:e,checked:o,changeRowKeys:f,nativeEvent:i})}else o?c.push(n.getRecordKey(e,p)):c=c.filter(function(e){return s!==e}),n.setState({pivot:p}),n.store.setState({selectionDirty:!0}),n.setSelectedRowKeys(c,{selectWay:"onSelect",record:e,checked:o,changeRowKeys:void 0,nativeEvent:i})},n.handleRadioSelect=function(e,t,r){var o=r.target.checked,i=r.nativeEvent,a=n.store.getState().selectionDirty?[]:n.getDefaultSelection(),c=n.store.getState().selectedRowKeys.concat(a);c=[n.getRecordKey(e,t)],n.store.setState({selectionDirty:!0}),n.setSelectedRowKeys(c,{selectWay:"onSelect",record:e,checked:o,changeRowKeys:void 0,nativeEvent:i})},n.handleSelectRow=function(e,t,r){var o=n.getFlatCurrentPageData(),i=n.store.getState().selectionDirty?[]:n.getDefaultSelection(),a=n.store.getState().selectedRowKeys.concat(i),c=o.filter(function(e,t){return!n.getCheckboxPropsByItem(e,t).disabled}).map(function(e,t){return n.getRecordKey(e,t)}),s=[],l="onSelectAll",u=void 0;switch(e){case"all":c.forEach(function(e){a.indexOf(e)<0&&(a.push(e),s.push(e))}),l="onSelectAll",u=!0;break;case"removeAll":c.forEach(function(e){a.indexOf(e)>=0&&(a.splice(a.indexOf(e),1),s.push(e))}),l="onSelectAll",u=!1;break;case"invert":c.forEach(function(e){a.indexOf(e)<0?a.push(e):a.splice(a.indexOf(e),1),s.push(e),l="onSelectInvert"})}n.store.setState({selectionDirty:!0});var p=n.props.rowSelection,f=2;if(p&&p.hideDefaultSelections&&(f=0),t>=f&&"function"==typeof r)return r(c);n.setSelectedRowKeys(a,{selectWay:l,checked:u,changeRowKeys:s})},n.handlePageChange=function(e){for(var t=arguments.length,r=Array(t>1?t-1:0),o=1;o<t;o++)r[o-1]=arguments[o];var i=n.props,a=us()({},n.state.pagination);a.current=e||(a.current||1),a.onChange.apply(a,[a.current].concat(r));var c={pagination:a};i.pagination&&"object"===Cs()(i.pagination)&&"current"in i.pagination&&(c.pagination=us()({},a,{current:n.state.pagination.current})),n.setState(c),n.store.setState({selectionDirty:!1});var s=n.props.onChange;s&&s.apply(null,n.prepareParamsArguments(us()({},n.state,{selectionDirty:!1,pagination:a})))},n.renderSelectionBox=function(e){return function(t,r,o){var i=n.getRecordKey(r,o),a=n.getCheckboxPropsByItem(r,o),c=function(t){"radio"===e?n.handleRadioSelect(r,o,t):n.handleSelect(r,o,t)};return ws.createElement("span",{onClick:za},ws.createElement(aS,us()({type:e,store:n.store,rowIndex:i,onChange:c,defaultSelection:n.getDefaultSelection()},a)))}},n.getRecordKey=function(e,t){var r=n.props.rowKey,o="function"==typeof r?r(e,t):e[r];return Pp(void 0!==o,"Each record in dataSource of table should have a unique `key` prop, or set `rowKey` of Table to an unique primary key, see https://u.ant.design/table-row-key"),void 0===o?t:o},n.getPopupContainer=function(){return xs.findDOMNode(n)},n.handleShowSizeChange=function(e,t){var r=n.state.pagination;r.onShowSizeChange(e,t);var o=us()({},r,{pageSize:t,current:e});n.setState({pagination:o});var i=n.props.onChange;i&&i.apply(null,n.prepareParamsArguments(us()({},n.state,{pagination:o})))},n.renderTable=function(e,t){var r,o=us()({},e,n.props.locale),i=n.props,a=(i.style,i.className,i.prefixCls),c=i.showHeader,s=hS(i,["style","className","prefixCls","showHeader"]),l=n.getCurrentPageData(),u=n.props.expandedRowRender&&!1!==n.props.expandIconAsCell,p=Ts()((r={},ss()(r,a+"-"+n.props.size,!0),ss()(r,a+"-bordered",n.props.bordered),ss()(r,a+"-empty",!l.length),ss()(r,a+"-without-column-header",!c),r)),f=n.renderRowSelection(o);f=n.renderColumnsDropdown(f,o),f=f.map(function(e,t){var r=us()({},e);return r.key=n.getColumnKey(r,t),r});var h=f[0]&&"selection-column"===f[0].key?1:0;return"expandIconColumnIndex"in s&&(h=s.expandIconColumnIndex),ws.createElement(Zw,us()({key:"table"},s,{onRow:n.onRow,components:n.components,prefixCls:a,data:l,columns:f,showHeader:c,className:p,expandIconColumnIndex:h,expandIconAsCell:u,emptyText:!t.spinning&&o.emptyText}))},Pp(!("columnsPageRange"in e||"columnsPageSize"in e),"`columnsPageRange` and `columnsPageSize` are removed, please use fixed columns instead, see: https://u.ant.design/fixed-columns."),n.columns=e.columns||xa(e.children),n.createComponents(e.components),n.state=us()({},n.getDefaultSortOrder(n.columns),{filters:n.getFiltersFromColumns(),pagination:n.getDefaultPagination(e),pivot:void 0}),n.CheckboxPropsCache={},n.store=ga({selectedRowKeys:ka(e).selectedRowKeys||[],selectionDirty:!1}),n}return gs()(t,e),ds()(t,[{key:"getDefaultSelection",value:function(){var e=this;return ka(this.props).getCheckboxProps?this.getFlatData().filter(function(t,n){return e.getCheckboxPropsByItem(t,n).defaultChecked}).map(function(t,n){return e.getRecordKey(t,n)}):[]}},{key:"getDefaultPagination",value:function(e){var t=e.pagination||{};return this.hasPagination(e)?us()({},dS,t,{current:t.defaultCurrent||t.current||1,pageSize:t.defaultPageSize||t.pageSize||10}):{}}},{key:"componentWillReceiveProps",value:function(e){if(this.columns=e.columns||xa(e.children),("pagination"in e||"pagination"in this.props)&&this.setState(function(t){var n=us()({},dS,t.pagination,e.pagination);return n.current=n.current||1,n.pageSize=n.pageSize||10,{pagination:!1!==e.pagination?n:vS}}),e.rowSelection&&"selectedRowKeys"in e.rowSelection&&this.store.setState({selectedRowKeys:e.rowSelection.selectedRowKeys||[]}),"dataSource"in e&&e.dataSource!==this.props.dataSource&&this.store.setState({selectionDirty:!1}),this.CheckboxPropsCache={},this.getSortOrderColumns(this.columns).length>0){var t=this.getSortStateFromColumns(this.columns);t.sortColumn===this.state.sortColumn&&t.sortOrder===this.state.sortOrder||this.setState(t)}if(this.getFilteredValueColumns(this.columns).length>0){var n=this.getFiltersFromColumns(this.columns),r=us()({},this.state.filters);Object.keys(n).forEach(function(e){r[e]=n[e]}),this.isFiltersChanged(r)&&this.setState({filters:r})}this.createComponents(e.components,this.props.components)}},{key:"setSelectedRowKeys",value:function(e,t){var n=this,r=t.selectWay,o=t.record,i=t.checked,a=t.changeRowKeys,c=t.nativeEvent,s=ka(this.props);!s||"selectedRowKeys"in s||this.store.setState({selectedRowKeys:e});var l=this.getFlatData();if(s.onChange||s[r]){var u=l.filter(function(t,r){return e.indexOf(n.getRecordKey(t,r))>=0});if(s.onChange&&s.onChange(e,u),"onSelect"===r&&s.onSelect)s.onSelect(o,i,u,c);else if("onSelectMultiple"===r&&s.onSelectMultiple){var p=l.filter(function(e,t){return a.indexOf(n.getRecordKey(e,t))>=0});s.onSelectMultiple(i,u,p)}else if("onSelectAll"===r&&s.onSelectAll){var f=l.filter(function(e,t){return a.indexOf(n.getRecordKey(e,t))>=0});s.onSelectAll(i,u,f)}else"onSelectInvert"===r&&s.onSelectInvert&&s.onSelectInvert(e)}}},{key:"hasPagination",value:function(e){return!1!==(e||this.props).pagination}},{key:"isFiltersChanged",value:function(e){var t=this,n=!1;return Object.keys(e).length!==Object.keys(this.state.filters).length?n=!0:Object.keys(e).forEach(function(r){e[r]!==t.state.filters[r]&&(n=!0)}),n}},{key:"getSortOrderColumns",value:function(e){return Sa(e||this.columns||[],function(e){return"sortOrder"in e})}},{key:"getFilteredValueColumns",value:function(e){return Sa(e||this.columns||[],function(e){return void 0!==e.filteredValue})}},{key:"getFiltersFromColumns",value:function(e){var t=this,n={};return this.getFilteredValueColumns(e).forEach(function(e){var r=t.getColumnKey(e);n[r]=e.filteredValue}),n}},{key:"getDefaultSortOrder",value:function(e){var t=this.getSortStateFromColumns(e),n=Sa(e||[],function(e){return null!=e.defaultSortOrder})[0];return n&&!t.sortColumn?{sortColumn:n,sortOrder:n.defaultSortOrder}:t}},{key:"getSortStateFromColumns",value:function(e){var t=this.getSortOrderColumns(e).filter(function(e){return e.sortOrder})[0];return t?{sortColumn:t,sortOrder:t.sortOrder}:{sortColumn:null,sortOrder:null}}},{key:"getSorterFn",value:function(){var e=this.state,t=e.sortOrder,n=e.sortColumn;if(t&&n&&"function"==typeof n.sorter)return function(e,r){var o=n.sorter(e,r,t);return 0!==o?"descend"===t?-o:o:0}}},{key:"toggleSortOrder",value:function(e,t){var n=this.state,r=n.sortColumn,o=n.sortOrder;this.isSortColumn(t)?o===e?(o=void 0,r=null):o=e:(o=e,r=t);var i={sortOrder:o,sortColumn:r};0===this.getSortOrderColumns().length&&this.setState(i);var a=this.props.onChange;a&&a.apply(null,this.prepareParamsArguments(us()({},this.state,i)))}},{key:"renderRowSelection",value:function(e){var t=this,n=this.props,r=n.prefixCls,o=n.rowSelection,i=this.columns.concat();if(o){var a=this.getFlatCurrentPageData().filter(function(e,n){return!o.getCheckboxProps||!t.getCheckboxPropsByItem(e,n).disabled}),c=Ts()(r+"-selection-column",ss()({},r+"-selection-column-custom",o.selections)),s={key:"selection-column",render:this.renderSelectionBox(o.type),className:c,fixed:o.fixed,width:o.columnWidth,title:o.columnTitle};if("radio"!==o.type){var l=a.every(function(e,n){return t.getCheckboxPropsByItem(e,n).disabled});s.title=s.title||ws.createElement(sS,{store:this.store,locale:e,data:a,getCheckboxPropsByItem:this.getCheckboxPropsByItem,getRecordKey:this.getRecordKey,disabled:l,prefixCls:r,onSelect:this.handleSelectRow,selections:o.selections,hideDefaultSelections:o.hideDefaultSelections,getPopupContainer:this.getPopupContainer})}"fixed"in o?s.fixed=o.fixed:i.some(function(e){return"left"===e.fixed||!0===e.fixed})&&(s.fixed="left"),i[0]&&"selection-column"===i[0].key?i[0]=s:i.unshift(s)}return i}},{key:"getColumnKey",value:function(e,t){return e.key||e.dataIndex||t}},{key:"getMaxCurrent",value:function(e){var t=this.state.pagination,n=t.current,r=t.pageSize;return(n-1)*r>=e?Math.floor((e-1)/r)+1:n}},{key:"isSortColumn",value:function(e){var t=this.state.sortColumn;return!(!e||!t)&&this.getColumnKey(t)===this.getColumnKey(e)}},{key:"renderColumnsDropdown",value:function(e,t){var n=this,r=this.props,o=r.prefixCls,i=r.dropdownPrefixCls,a=this.state.sortOrder;return wa(e,function(e,r){var c=us()({},e),s=n.getColumnKey(c,r),l=void 0,u=void 0;if(c.filters&&c.filters.length>0||c.filterDropdown){var p=n.state.filters[s]||[];l=ws.createElement(rS,{locale:t,column:c,selectedKeys:p,confirmFilter:n.handleFilter,prefixCls:o+"-filter",dropdownPrefixCls:i||"ant-dropdown",getPopupContainer:n.getPopupContainer})}if(c.sorter){var f=n.isSortColumn(c);f&&(c.className=Ts()(c.className,ss()({},o+"-column-sort",a)));var h=f&&"ascend"===a,d=f&&"descend"===a;u=ws.createElement("div",{className:o+"-column-sorter"},ws.createElement("span",{className:o+"-column-sorter-up "+(h?"on":"off"),title:"\u2191",onClick:function(){return n.toggleSortOrder("ascend",c)}},ws.createElement(Kp,{type:"caret-up"})),ws.createElement("span",{className:o+"-column-sorter-down "+(d?"on":"off"),title:"\u2193",onClick:function(){return n.toggleSortOrder("descend",c)}},ws.createElement(Kp,{type:"caret-down"})))}return c.title=ws.createElement("span",{key:s},c.title,u,l),(u||l)&&(c.className=Ts()(o+"-column-has-filters",c.className)),c})}},{key:"renderPagination",value:function(e){if(!this.hasPagination())return null;var t="default",n=this.state.pagination;n.size?t=n.size:"middle"!==this.props.size&&"small"!==this.props.size||(t="small");var r=n.position||"bottom",o=n.total||this.getLocalData().length;return o>0&&(r===e||"both"===r)?ws.createElement(Yg,us()({key:"pagination-"+e},n,{className:Ts()(n.className,this.props.prefixCls+"-pagination"),onChange:this.handlePageChange,total:o,size:t,current:this.getMaxCurrent(o),onShowSizeChange:this.handleShowSizeChange})):null}},{key:"prepareParamsArguments",value:function(e){var t=us()({},e.pagination);delete t.onChange,delete t.onShowSizeChange;var n=e.filters,r={};return e.sortColumn&&e.sortOrder&&(r.column=e.sortColumn,r.order=e.sortOrder,r.field=e.sortColumn.dataIndex,r.columnKey=this.getColumnKey(e.sortColumn)),[t,n,r]}},{key:"findColumn",value:function(e){var t=this,n=void 0;return wa(this.columns,function(r){t.getColumnKey(r)===e&&(n=r)}),n}},{key:"getCurrentPageData",value:function(){var e=this.getLocalData(),t=void 0,n=void 0,r=this.state;return this.hasPagination()?(n=r.pagination.pageSize,t=this.getMaxCurrent(r.pagination.total||e.length)):(n=Number.MAX_VALUE,t=1),(e.length>n||n===Number.MAX_VALUE)&&(e=e.filter(function(e,r){return r>=(t-1)*n&&r<t*n})),e}},{key:"getFlatData",value:function(){return Ca(this.getLocalData())}},{key:"getFlatCurrentPageData",value:function(){return Ca(this.getCurrentPageData())}},{key:"recursiveSort",value:function(e,t){var n=this,r=this.props.childrenColumnName,o=void 0===r?"children":r;return e.sort(t).map(function(e){return e[o]?us()({},e,ss()({},o,n.recursiveSort(e[o],t))):e})}},{key:"getLocalData",value:function(){var e=this,t=this.state,n=this.props.dataSource,r=n||[];r=r.slice(0);var o=this.getSorterFn();return o&&(r=this.recursiveSort(r,o)),t.filters&&Object.keys(t.filters).forEach(function(n){var o=e.findColumn(n);if(o){var i=t.filters[n]||[];if(0!==i.length){var a=o.onFilter;r=a?r.filter(function(e){return i.some(function(t){return a(t,e)})}):r}}}),r}},{key:"createComponents",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1],n=e&&e.body&&e.body.row,r=t&&t.body&&t.body.row;this.row&&n===r||(this.row=ba(n)),this.components=us()({},e,{body:us()({},e.body,{row:this.row})})}},{key:"render",value:function(){var e=this,t=this.props,n=t.style,r=t.className,o=t.prefixCls,i=this.getCurrentPageData(),a=this.props.loading;"boolean"==typeof a&&(a={spinning:a});var c=ws.createElement(xp,{componentName:"Table",defaultLocale:Mp.a.Table},function(t){return e.renderTable(t,a)}),s=this.hasPagination()&&i&&0!==i.length?o+"-with-pagination":o+"-without-pagination";return ws.createElement("div",{className:Ts()(o+"-wrapper",r),style:n},ws.createElement(Ng,us()({},a,{className:a.spinning?s+" "+o+"-spin-holder":""}),this.renderPagination("top"),c,this.renderPagination("bottom")))}}]),t}(ws.Component),yS=mS;mS.Column=uS,mS.ColumnGroup=fS,mS.propTypes={dataSource:zs.array,columns:zs.array,prefixCls:zs.string,useFixedHeader:zs.bool,rowSelection:zs.object,className:zs.string,size:zs.string,loading:zs.oneOfType([zs.bool,zs.object]),bordered:zs.bool,onChange:zs.func,locale:zs.object,dropdownPrefixCls:zs.string},mS.defaultProps={dataSource:[],prefixCls:"ant-table",useFixedHeader:!1,className:"",size:"default",loading:!1,bordered:!1,indentSize:20,locale:{},rowKey:"key",showHeader:!0};var gS=yS,bS=n(114),CS=n.n(bS),wS=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.handleChange=function(t){var n=e.props.onChange;n&&n(t)},e.handleClear=function(t){t.preventDefault();var n=e.props.handleClear;n&&n(t)},e}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e=this.props,t=e.placeholder,n=e.value,r=e.prefixCls,o=n&&n.length>0?ws.createElement("a",{href:"#",className:r+"-action",onClick:this.handleClear},ws.createElement(Kp,{type:"close-circle"})):ws.createElement("span",{className:r+"-action"},ws.createElement(Kp,{type:"search"}));return ws.createElement("div",null,ws.createElement(yf,{placeholder:t,className:r,value:n,ref:"input",onChange:this.handleChange}),o)}}]),t}(ws.Component),SS=wS;wS.defaultProps={placeholder:""};var xS=n(409),MS=n.n(xS),zS=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"shouldComponentUpdate",value:function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return CS.a.shouldComponentUpdate.apply(this,t)}},{key:"render",value:function(){var e,t=this.props,n=t.renderedText,r=t.renderedEl,o=t.item,i=t.lazy,a=t.checked,c=t.prefixCls,s=t.onClick,l=Ts()((e={},ss()(e,c+"-content-item",!0),ss()(e,c+"-content-item-disabled",o.disabled),e)),u=ws.createElement("li",{className:l,title:n,onClick:o.disabled?void 0:function(){return s(o)}},ws.createElement(lv,{checked:a,disabled:o.disabled}),ws.createElement("span",null,r)),p=null;if(i){var f=us()({height:32,offset:500,throttle:0,debounce:!1},i);p=ws.createElement(MS.a,f,u)}else p=u;return p}}]),t}(ws.Component),kS=zS,_S=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.handleSelect=function(e){var t=n.props.checkedKeys,r=t.some(function(t){return t===e.key});n.props.handleSelect(e,!r)},n.handleFilter=function(e){n.props.handleFilter(e),e.target.value&&(n.triggerScrollTimer=window.setTimeout(function(){var e=xs.findDOMNode(n),t=e.querySelectorAll(".ant-transfer-list-content")[0];t&&_a(t,"scroll")},0),n.fixIERepaint())},n.handleClear=function(){n.props.handleClear(),n.fixIERepaint()},n.matchFilter=function(e,t){var r=n.props,o=r.filter,i=r.filterOption;return i?i(o,t):e.indexOf(o)>=0},n.renderItem=function(e){var t=n.props.render,r=void 0===t?Ea:t,o=r(e),i=Ta(o);return{renderedText:i?o.value:o,renderedEl:i?o.label:o}},n.saveNotFoundRef=function(e){n.notFoundNode=e},n.state={mounted:!1},n}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){var e=this;this.timer=window.setTimeout(function(){e.setState({mounted:!0})},0)}},{key:"componentWillUnmount",value:function(){clearTimeout(this.timer),clearTimeout(this.triggerScrollTimer),clearTimeout(this.fixIERepaintTimer)}},{key:"shouldComponentUpdate",value:function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return CS.a.shouldComponentUpdate.apply(this,t)}},{key:"getCheckStatus",value:function(e){var t=this.props.checkedKeys;return 0===t.length?"none":e.every(function(e){return t.indexOf(e.key)>=0})?"all":"part"}},{key:"fixIERepaint",value:function(){var e=this;Oa()&&(this.fixIERepaintTimer=window.setTimeout(function(){e.notFoundNode&&(e.notFoundNode.className=e.notFoundNode.className)},0))}},{key:"render",value:function(){var e=this,t=this.props,n=t.prefixCls,r=t.dataSource,o=t.titleText,i=t.checkedKeys,a=t.lazy,c=t.body,s=void 0===c?Ea:c,l=t.footer,u=void 0===l?Ea:l,p=t.showSearch,f=t.style,h=t.filter,d=t.searchPlaceholder,v=t.notFoundContent,m=t.itemUnit,y=t.itemsUnit,g=t.onScroll,b=u(us()({},this.props)),C=s(us()({},this.props)),w=Ts()(n,ss()({},n+"-with-footer",!!b)),S=[],x=[],M=r.map(function(t){var r=e.renderItem(t),o=r.renderedText,c=r.renderedEl;if(h&&h.trim()&&!e.matchFilter(o,t))return null;x.push(t),t.disabled||S.push(t);var s=i.indexOf(t.key)>=0;return ws.createElement(kS,{key:t.key,item:t,lazy:a,renderedText:o,renderedEl:c,checked:s,prefixCls:n,onClick:e.handleSelect})}),z=r.length>1?y:m,k=p?ws.createElement("div",{className:n+"-body-search-wrapper"},ws.createElement(SS,{prefixCls:n+"-search",onChange:this.handleFilter,handleClear:this.handleClear,placeholder:d,value:h})):null,_=C||ws.createElement("div",{className:p?n+"-body "+n+"-body-with-search":n+"-body"},k,ws.createElement(Ml,{component:"ul",componentProps:{onScroll:g},className:n+"-content",transitionName:this.state.mounted?n+"-content-item-highlight":"",transitionLeave:!1},M),ws.createElement("div",{className:n+"-body-not-found",ref:this.saveNotFoundRef},v)),O=b?ws.createElement("div",{className:n+"-footer"},b):null,E=this.getCheckStatus(S),T="all"===E,N=ws.createElement(lv,{ref:"checkbox",checked:T,indeterminate:"part"===E,onChange:function(){return e.props.handleSelectAll(S,T)}});return ws.createElement("div",{className:w,style:f},ws.createElement("div",{className:n+"-header"},N,ws.createElement("span",{className:n+"-header-selected"},ws.createElement("span",null,(i.length>0?i.length+"/":"")+x.length," ",z),ws.createElement("span",{className:n+"-header-title"},o))),_,O)}}]),t}(ws.Component),OS=_S;_S.defaultProps={dataSource:[],titleText:"",showSearch:!1,render:Ea,lazy:{}};var ES=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e=this.props,t=e.moveToLeft,n=e.moveToRight,r=e.leftArrowText,o=void 0===r?"":r,i=e.rightArrowText,a=void 0===i?"":i,c=e.leftActive,s=e.rightActive,l=e.className,u=e.style;return ws.createElement("div",{className:l,style:u},ws.createElement(cf,{type:"primary",size:"small",disabled:!s,onClick:n,icon:"right"},a),ws.createElement(cf,{type:"primary",size:"small",disabled:!c,onClick:t,icon:"left"},o))}}]),t}(ws.Component),TS=ES,NS=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));n.separatedDataSource=null,n.moveTo=function(e){var t=n.props,r=t.targetKeys,o=void 0===r?[]:r,i=t.dataSource,a=void 0===i?[]:i,c=t.onChange,s=n.state,l=s.sourceSelectedKeys,u=s.targetSelectedKeys,p="right"===e?l:u,f=p.filter(function(e){return!a.some(function(t){return!(e!==t.key||!t.disabled)})}),h="right"===e?f.concat(o):o.filter(function(e){return-1===f.indexOf(e)}),d="right"===e?"left":"right";n.setState(ss()({},n.getSelectedKeysName(d),[])),n.handleSelectChange(d,[]),c&&c(h,e,f)},n.moveToLeft=function(){return n.moveTo("left")},n.moveToRight=function(){return n.moveTo("right")},n.handleSelectAll=function(e,t,r){var o=n.state[n.getSelectedKeysName(e)]||[],i=t.map(function(e){return e.key}),a=o.filter(function(e){return-1===i.indexOf(e)}),c=[].concat(Ls()(o));i.forEach(function(e){-1===c.indexOf(e)&&c.push(e)});var s=r?a:c;n.handleSelectChange(e,s),n.props.selectedKeys||n.setState(ss()({},n.getSelectedKeysName(e),s))},n.handleLeftSelectAll=function(e,t){return n.handleSelectAll("left",e,t)},n.handleRightSelectAll=function(e,t){return n.handleSelectAll("right",e,t)},n.handleFilter=function(e,t){n.setState(ss()({},e+"Filter",t.target.value)),n.props.onSearchChange&&n.props.onSearchChange(e,t)},n.handleLeftFilter=function(e){return n.handleFilter("left",e)},n.handleRightFilter=function(e){return n.handleFilter("right",e)},n.handleClear=function(e){n.setState(ss()({},e+"Filter",""))},n.handleLeftClear=function(){return n.handleClear("left")},n.handleRightClear=function(){return n.handleClear("right")},n.handleSelect=function(e,t,r){var o=n.state,i=o.sourceSelectedKeys,a=o.targetSelectedKeys,c=[].concat("left"===e?Ls()(i):Ls()(a)),s=c.indexOf(t.key);s>-1&&c.splice(s,1),r&&c.push(t.key),n.handleSelectChange(e,c),n.props.selectedKeys||n.setState(ss()({},n.getSelectedKeysName(e),c))},n.handleLeftSelect=function(e,t){return n.handleSelect("left",e,t)},n.handleRightSelect=function(e,t){return n.handleSelect("right",e,t)},n.handleScroll=function(e,t){var r=n.props.onScroll;r&&r(e,t)},n.handleLeftScroll=function(e){return n.handleScroll("left",e)},n.handleRightScroll=function(e){return n.handleScroll("right",e)},n.getLocale=function(e){var t={};return"notFoundContent"in n.props&&(t.notFoundContent=n.props.notFoundContent),"searchPlaceholder"in n.props&&(t.searchPlaceholder=n.props.searchPlaceholder),us()({},e,t,n.props.locale)},n.renderTransfer=function(e){var t=n.props,r=t.prefixCls,o=void 0===r?"ant-transfer":r,i=t.className,a=t.operations,c=void 0===a?[]:a,s=t.showSearch,l=t.body,u=t.footer,p=t.style,f=t.listStyle,h=t.operationStyle,d=t.filterOption,v=t.render,m=t.lazy,y=n.getLocale(e),g=n.state,b=g.leftFilter,C=g.rightFilter,w=g.sourceSelectedKeys,S=g.targetSelectedKeys,x=n.separateDataSource(n.props),M=x.leftDataSource,z=x.rightDataSource,k=S.length>0,_=w.length>0,O=Ts()(i,o),E=n.getTitles(y);return ws.createElement("div",{className:O,style:p},ws.createElement(OS,us()({prefixCls:o+"-list",titleText:E[0],dataSource:M,filter:b,filterOption:d,style:f,checkedKeys:w,handleFilter:n.handleLeftFilter,handleClear:n.handleLeftClear,handleSelect:n.handleLeftSelect,handleSelectAll:n.handleLeftSelectAll,render:v,showSearch:s,body:l,footer:u,lazy:m,onScroll:n.handleLeftScroll},y)),ws.createElement(TS,{className:o+"-operation",rightActive:_,rightArrowText:c[0],moveToRight:n.moveToRight,leftActive:k,leftArrowText:c[1],moveToLeft:n.moveToLeft,style:h}),ws.createElement(OS,us()({prefixCls:o+"-list",titleText:E[1],dataSource:z,filter:C,filterOption:d,style:f,checkedKeys:S,handleFilter:n.handleRightFilter,handleClear:n.handleRightClear,handleSelect:n.handleRightSelect,handleSelectAll:n.handleRightSelectAll,render:v,showSearch:s,body:l,footer:u,lazy:m,onScroll:n.handleRightScroll},y)))},Pp(!("notFoundContent"in e||"searchPlaceholder"in e),"Transfer[notFoundContent] and Transfer[searchPlaceholder] will be removed, please use Transfer[locale] instead.");var r=e.selectedKeys,o=void 0===r?[]:r,i=e.targetKeys,a=void 0===i?[]:i;return n.state={leftFilter:"",rightFilter:"",sourceSelectedKeys:o.filter(function(e){return-1===a.indexOf(e)}),targetSelectedKeys:o.filter(function(e){return a.indexOf(e)>-1})},n}return gs()(t,e),ds()(t,[{key:"componentWillReceiveProps",value:function(e){var t=this.state,n=t.sourceSelectedKeys,r=t.targetSelectedKeys;if((e.targetKeys!==this.props.targetKeys||e.dataSource!==this.props.dataSource)&&(this.separatedDataSource=null,!e.selectedKeys)){var o=e.dataSource,i=e.targetKeys,a=void 0===i?[]:i,c=[],s=[];o.forEach(function(e){var t=e.key;n.includes(t)&&!a.includes(t)&&c.push(t),r.includes(t)&&a.includes(t)&&s.push(t)}),this.setState({sourceSelectedKeys:c,targetSelectedKeys:s})}if(e.selectedKeys){var l=e.targetKeys||[];this.setState({sourceSelectedKeys:e.selectedKeys.filter(function(e){return!l.includes(e)}),targetSelectedKeys:e.selectedKeys.filter(function(e){return l.includes(e)})})}}},{key:"separateDataSource",value:function(e){if(this.separatedDataSource)return this.separatedDataSource;var t=e.dataSource,n=e.rowKey,r=e.targetKeys,o=void 0===r?[]:r,i=[],a=new Array(o.length);return t.forEach(function(e){n&&(e.key=n(e));var t=o.indexOf(e.key);-1!==t?a[t]=e:i.push(e)}),this.separatedDataSource={leftDataSource:i,rightDataSource:a},this.separatedDataSource}},{key:"handleSelectChange",value:function(e,t){var n=this.state,r=n.sourceSelectedKeys,o=n.targetSelectedKeys,i=this.props.onSelectChange;i&&("left"===e?i(t,o):i(r,t))}},{key:"getTitles",value:function(e){var t=this.props;return t.titles?t.titles:e.titles}},{key:"getSelectedKeysName",value:function(e){return"left"===e?"sourceSelectedKeys":"targetSelectedKeys"}},{key:"render",value:function(){return ws.createElement(xp,{componentName:"Transfer",defaultLocale:Mp.a.Transfer},this.renderTransfer)}}]),t}(ws.Component),VS=NS;NS.List=OS,NS.Operation=TS,NS.Search=SS,NS.defaultProps={dataSource:[],render:Na,locale:{},showSearch:!1},NS.propTypes={prefixCls:zs.string,dataSource:zs.array,render:zs.func,targetKeys:zs.array,onChange:zs.func,height:zs.number,style:zs.object,listStyle:zs.object,operationStyle:zs.object,className:zs.string,titles:zs.array,operations:zs.array,showSearch:zs.bool,filterOption:zs.func,searchPlaceholder:zs.string,notFoundContent:zs.node,locale:zs.object,body:zs.func,footer:zs.func,rowKey:zs.func,lazy:zs.oneOfType([zs.object,zs.bool])};var PS={rcTree:ks.a.shape({root:ks.a.object,prefixCls:ks.a.string,selectable:ks.a.bool,showIcon:ks.a.bool,icon:ks.a.oneOfType([ks.a.node,ks.a.func]),draggable:ks.a.bool,checkable:ks.a.oneOfType([ks.a.bool,ks.a.node]),checkStrictly:ks.a.bool,disabled:ks.a.bool,openTransitionName:ks.a.string,openAnimation:ks.a.oneOfType([ks.a.string,ks.a.object]),loadData:ks.a.func,filterTreeNode:ks.a.func,renderTreeNode:ks.a.func,isKeyChecked:ks.a.func,onNodeClick:ks.a.func,onNodeDoubleClick:ks.a.func,onNodeExpand:ks.a.func,onNodeSelect:ks.a.func,onNodeCheck:ks.a.func,onNodeMouseEnter:ks.a.func,onNodeMouseLeave:ks.a.func,onNodeContextMenu:ks.a.func,onNodeDragStart:ks.a.func,onNodeDragEnter:ks.a.func,onNodeDragOver:ks.a.func,onNodeDragLeave:ks.a.func,onNodeDragEnd:ks.a.func,onNodeDrop:ks.a.func})},HS=us()({},PS,{rcTreeNode:ks.a.shape({onUpCheckConduct:ks.a.func})}),LS=n(173),DS=n.n(LS),AS=n(415),IS=n.n(AS),RS=n(416),jS=["-webkit-","-moz-","-o-","ms-",""],FS=function(e,t){var n={animationend:Ha("Animation","AnimationEnd"),transitionend:Ha("Transition","TransitionEnd")};return e&&("AnimationEvent"in t||delete n.animationend.animation,"TransitionEvent"in t||delete n.transitionend.transition),n}(RS.canUseDOM,"undefined"!=typeof window?window:{}),KS={};RS.canUseDOM&&(KS=document.createElement("div").style);var BS={},WS=La("animationend"),US=La("transitionend"),qS=!(!WS||!US),YS=["appeared","show","exclusive","children","animation"],GS=function(e){var t=function(t){function n(){fs()(this,n);var t=ms()(this,(n.__proto__||Object.getPrototypeOf(n)).call(this));return t.state={child:null,eventQueue:[],eventActive:!1},t.onDomUpdated=function(){function n(){if(e){var t=Ia(i,""+p);if(t&&h.add(t),r){var n=Ia(i,p+"-active");n&&h.add(n)}}}var r=t.state.eventActive,o=t.props,i=o.transitionName,a=o.animation,c=o.onChildLeaved,s=o.animateKey,l=t.getDomElement();if(l){e&&t.$prevEle!==l&&(t.cleanDomEvent(),t.$prevEle=l,t.$prevEle.addEventListener(WS,t.onMotionEnd),t.$prevEle.addEventListener(US,t.onMotionEnd));var u=t.getCurrentEvent();if(u.empty)return void("leave"===u.lastEventType&&c(s));var p=u.eventType,f=u.restQueue,h=Zs()(l);if(t.currentEvent&&t.currentEvent.type===p)return void n();if(clearTimeout(t.timeout),t.currentEvent&&t.currentEvent.animateObj&&t.currentEvent.animateObj.stop&&t.currentEvent.animateObj.stop(),t.currentEvent){var d=Ia(i,""+t.currentEvent.type),v=Ia(i,t.currentEvent.type+"-active");d&&h.remove(d),v&&h.remove(v)}t.currentEvent={type:p};var m=(a||{})[p];m?(t.currentEvent.animateObj=m(l,function(){t.onMotionEnd({target:l})}),t.currentEvent&&t.currentEvent.animateObj||t.nextEvent(f)):e?(n(),r||As()(function(){t.currentEvent&&t.currentEvent.type===p&&!t._destroy&&t.setState({eventActive:!0},function(){var e=Pa(l,"transition-delay")||0,n=Pa(l,"transition-duration")||0,r=Pa(l,"animation-delay")||0,o=Pa(l,"animation-duration")||0,i=Math.max(n+e,o+r);i>=0&&(t.timeout=setTimeout(function(){t.onMotionEnd({target:l})},1e3*i))})})):t.onMotionEnd({target:l})}},t.onMotionEnd=function(n){var r=n.target,o=t.props,i=o.transitionName,a=o.onChildLeaved,c=o.animateKey,s=o.onAppear,l=o.onEnter,u=o.onLeave,p=o.onEnd,f=t.getCurrentEvent();if(!f.empty){clearTimeout(t.timeout);var h=f.restQueue,d=t.getDomElement();if(t.currentEvent&&d===r){if(t.currentEvent.animateObj&&t.currentEvent.animateObj.stop&&t.currentEvent.animateObj.stop(),e&&t.currentEvent){var v=Ia(i,t.currentEvent.type),m=Ia(i,t.currentEvent.type+"-active"),y=Zs()(d);v&&y.remove(v),m&&y.remove(m)}t.currentEvent&&"leave"===t.currentEvent.type&&a(c),t.currentEvent&&!h.length&&("appear"===t.currentEvent.type&&s?s(c):"enter"===t.currentEvent.type&&l?l(c):"leave"===t.currentEvent.type&&u&&u(c),p&&p(c,"leave"!==t.currentEvent.type)),t.currentEvent=null,t.nextEvent(h)}}},t.getDomElement=function(){return t._destroy?null:Ms.a.findDOMNode(t)},t.getCurrentEvent=function(){function e(e){return"appear"===e&&(c||i.appear)||"enter"===e&&(s||i.enter)||"leave"===e&&(l||i.leave)}var n=t.state.eventQueue,r=void 0===n?[]:n,o=t.props,i=o.animation,a=o.exclusive,c=o.transitionAppear,s=o.transitionEnter,l=o.transitionLeave,u=null;if(a){var p=r[r.length-1];e(p)&&(u={eventType:p,restQueue:[]})}else for(var f=r.slice();f.length;){var h=f,d=IS()(h),v=d[0],m=d.slice(1);if(e(v)){u={eventType:v,restQueue:m};break}f=m}return u||(u={empty:!0,lastEventType:r[r.length-1]}),u},t.nextEvent=function(e){t._destroy||t.setState({eventQueue:e,eventActive:!1})},t.cleanDomEvent=function(){t.$prevEle&&e&&(t.$prevEle.removeEventListener(WS,t.onMotionEnd),t.$prevEle.removeEventListener(US,t.onMotionEnd))},t.$prevEle=null,t.currentEvent=null,t.timeout=null,t}return gs()(n,t),ds()(n,[{key:"componentDidMount",value:function(){this.onDomUpdated()}},{key:"componentDidUpdate",value:function(){this.onDomUpdated()}},{key:"componentWillUnmount",value:function(){clearTimeout(this.timeout),this._destroy=!0,this.cleanDomEvent()}},{key:"render",value:function(){var t=this.state,n=t.child,r=t.eventActive,o=this.props,i=o.showProp,a=o.transitionName,c=n.props||{},s=c.className,l=this.getCurrentEvent(),u=e&&this.currentEvent?Ts()(s,Ia(a,this.currentEvent.type),r&&Ia(a,this.currentEvent.type+"-active")):s,p=!0;p=!(!e||!(!l.empty||this.currentEvent&&this.currentEvent.animateObj))||n.props[i];var f={className:u};return i&&(f[i]=p),Ss.a.cloneElement(n,f)}}],[{key:"getDerivedStateFromProps",value:function(e,t){function n(t,n){return i[t]!==e[t]&&(n&&n(e[t]),!0)}function r(e){var n=c.eventQueue||t.eventQueue.slice(),r=n.indexOf(e);-1!==r&&(n=n.slice(0,r)),n.push(e),c.eventQueue=n}var o=t.prevProps,i=void 0===o?{}:o,a=e.appeared,c={prevProps:Aa(e,YS)};return n("children",function(e){c.child=e}),n("appeared",function(e){e&&r("appear")}),n("show",function(e){a||r(e?"enter":"leave")}),c}}]),n}(Ss.a.Component);return t.propTypes={transitionName:ks.a.oneOfType([ks.a.string,ks.a.object]),transitionAppear:ks.a.bool,transitionEnter:ks.a.bool,transitionLeave:ks.a.bool,exclusive:ks.a.bool,appeared:ks.a.bool,showProp:ks.a.string,animateKey:ks.a.any,animation:ks.a.object,onChildLeaved:ks.a.func,onEnd:ks.a.func,onAppear:ks.a.func,onEnter:ks.a.func,onLeave:ks.a.func},Object(Ys.polyfill)(t),t}(qS),XS="rc_animate_"+Date.now(),$S=["children"],JS=function(e){var t=function(t){function n(){var e,t,r,o;fs()(this,n);for(var i=arguments.length,a=Array(i),c=0;c<i;c++)a[c]=arguments[c];return t=r=ms()(this,(e=n.__proto__||Object.getPrototypeOf(n)).call.apply(e,[this].concat(a))),r.state={appeared:!0,mergedChildren:[]},r.onChildLeaved=function(e){if(!r.hasChild(e)){var t=r.state.mergedChildren;r.setState({mergedChildren:t.filter(function(t){return t.key!==e})})}},r.hasChild=function(e){return m(r.props.children).some(function(t){return t&&t.key===e})},o=t,ms()(r,o)}return gs()(n,t),ds()(n,[{key:"componentDidMount",value:function(){this.state.appeared=!1}},{key:"render",value:function(){var t=this,n=this.state,r=n.appeared,o=n.mergedChildren,i=this.props,a=i.component,c=i.componentProps,s=i.className,l=i.style,u=i.showProp,p=o.map(function(n){if(o.length>1&&!n.key)return DS()(!1,"must set key for <rc-animate> children"),null;var i=!0;t.hasChild(n.key)?u&&(i=n.props[u]):i=!1;var a=n.key||XS;return Ss.a.createElement(e,us()({},t.props,{appeared:r,show:i,className:n.props.className,style:n.props.style,key:a,animateKey:n.key,onChildLeaved:t.onChildLeaved}),n)});if(a){var f=this.props;return"string"==typeof a&&(f=us()({className:s,style:l},c)),Ss.a.createElement(a,f,p)}return p[0]||null}}],[{key:"getDerivedStateFromProps",value:function(e,t){var n=t.prevProps,r=void 0===n?{}:n,o={prevProps:Aa(e,$S)},i=e.showProp;return function(t,n){r[t]!==e[t]&&n(e[t])}("children",function(e){var n=m(e).filter(function(e){return e}),r=t.mergedChildren.filter(function(e){return!(n.every(function(t){return t.key!==e.key})&&i&&!e.props[i])});o.mergedChildren=Da(r,n)}),o}}]),n}(Ss.a.Component);return t.isAnimate=!0,t.propTypes={component:ks.a.any,componentProps:ks.a.object,animation:ks.a.object,transitionName:ks.a.oneOfType([ks.a.string,ks.a.object]),transitionEnter:ks.a.bool,transitionAppear:ks.a.bool,exclusive:ks.a.bool,transitionLeave:ks.a.bool,onEnd:ks.a.func,onEnter:ks.a.func,onLeave:ks.a.func,onAppear:ks.a.func,showProp:ks.a.string,children:ks.a.node,style:ks.a.object,className:ks.a.string},t.defaultProps={animation:{},component:"span",componentProps:{},transitionEnter:!0,transitionLeave:!0,transitionAppear:!1},Object(Ys.polyfill)(t),t}(GS),ZS="none",QS="appear",ex="enter",tx="leave",nx=(function(e){var t=function(t){function n(){fs()(this,n);var t=ms()(this,(n.__proto__||Object.getPrototypeOf(n)).call(this));return t.onDomUpdate=function(){var n=t.state,r=n.status,o=n.newStatus,i=t.props,a=i.onAppearStart,c=i.onEnterStart,s=i.onLeaveStart,l=i.onAppearActive,u=i.onEnterActive,p=i.onLeaveActive,f=i.motionAppear,h=i.motionEnter,d=i.motionLeave;if(e){var v=Ms.a.findDOMNode(t);t.$ele!==v&&(t.removeEventListener(t.$ele),t.addEventListener(v),t.$ele=v),o&&r===QS&&f?t.updateStatus(a,null,null,function(){t.updateActiveStatus(l,QS)}):o&&r===ex&&h?t.updateStatus(c,null,null,function(){t.updateActiveStatus(u,ex)}):o&&r===tx&&d&&t.updateStatus(s,null,null,function(){t.updateActiveStatus(p,tx)})}},t.onMotionEnd=function(e){var n=t.state,r=n.status,o=n.statusActive,i=t.props,a=i.onAppearEnd,c=i.onEnterEnd,s=i.onLeaveEnd;r===QS&&o?t.updateStatus(a,{status:ZS},e):r===ex&&o?t.updateStatus(c,{status:ZS},e):r===tx&&o&&t.updateStatus(s,{status:ZS},e)},t.addEventListener=function(e){e&&(e.addEventListener(US,t.onMotionEnd),e.addEventListener(WS,t.onMotionEnd))},t.removeEventListener=function(e){e&&(e.removeEventListener(US,t.onMotionEnd),e.removeEventListener(WS,t.onMotionEnd))},t.updateStatus=function(e,n,r,o){var i=e?e(Ms.a.findDOMNode(t),r):null;if(!1!==i&&!t._destroyed){var a=void 0;o&&(a=function(){t.nextFrame(o)}),t.setState(us()({statusStyle:"object"==typeof i?i:null,newStatus:!1},n),a)}},t.updateActiveStatus=function(e,n){t.nextFrame(function(){t.state.status===n&&t.updateStatus(e,{statusActive:!0})})},t.nextFrame=function(e){t.cancelNextFrame(),t.raf=As()(e)},t.cancelNextFrame=function(){t.raf&&(As.a.cancel(t.raf),t.raf=null)},t.state={status:ZS,statusActive:!1,newStatus:!1,statusStyle:null},t.$ele=null,t.raf=null,t}return gs()(n,t),ds()(n,[{key:"componentDidMount",value:function(){this.onDomUpdate()}},{key:"componentDidUpdate",value:function(){this.onDomUpdate()}},{key:"componentWillUnmount",value:function(){this._destroyed=!0,this.removeEventListener(this.$ele),this.cancelNextFrame()}},{key:"render",value:function(){var t,n=this.state,r=n.status,o=n.statusActive,i=n.statusStyle,a=this.props,c=a.children,s=a.motionName,l=a.visible;return c?r!==ZS&&e?c({className:Ts()((t={},ss()(t,Ia(s,r),r!==ZS),ss()(t,Ia(s,r+"-active"),r!==ZS&&o),ss()(t,s,"string"==typeof s),t)),style:i}):l?c({}):null:null}}],[{key:"getDerivedStateFromProps",value:function(t,n){var r=n.prevProps;if(!e)return{};var o=t.visible,i=t.motionAppear,a=t.motionEnter,c=t.motionLeave,s=t.motionLeaveImmediately,l={prevProps:t};return!r&&o&&i&&(l.status=QS,l.statusActive=!1,l.newStatus=!0),r&&!r.visible&&o&&a&&(l.status=ex,l.statusActive=!1,l.newStatus=!0),(r&&r.visible&&!o&&c||!r&&s&&!o&&c)&&(l.status=tx,l.statusActive=!1,l.newStatus=!0),l}}]),n}(Ss.a.Component);t.propTypes={visible:ks.a.bool,children:ks.a.func,motionName:ks.a.oneOfType([ks.a.string,ks.a.object]),motionAppear:ks.a.bool,motionEnter:ks.a.bool,motionLeave:ks.a.bool,motionLeaveImmediately:ks.a.bool,onAppearStart:ks.a.func,onAppearActive:ks.a.func,onAppearEnd:ks.a.func,onEnterStart:ks.a.func,onEnterActive:ks.a.func,onEnterEnd:ks.a.func,onLeaveStart:ks.a.func,onLeaveActive:ks.a.func,onLeaveEnd:ks.a.func},t.defaultProps={visible:!0,motionEnter:!0,motionAppear:!0,motionLeave:!0},Object(Ys.polyfill)(t)}(qS),JS),rx=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return ox.call(n),n.state={dragNodeHighlight:!1},n}return gs()(t,e),ds()(t,[{key:"getChildContext",value:function(){return us()({},this.context,{rcTreeNode:{}})}},{key:"componentDidMount",value:function(){this.syncLoadData(this.props)}},{key:"componentDidUpdate",value:function(){this.syncLoadData(this.props)}},{key:"isSelectable",value:function(){var e=this.props.selectable,t=this.context.rcTree.selectable;return"boolean"==typeof e?e:t}},{key:"render",value:function(){var e,t=this.props.loading,n=this.props,r=n.className,o=n.style,i=n.dragOver,a=n.dragOverGapTop,c=n.dragOverGapBottom,s=n.isLeaf,l=n.expanded,u=n.selected,p=n.checked,f=n.halfChecked,h=kl()(n,["className","style","dragOver","dragOverGapTop","dragOverGapBottom","isLeaf","expanded","selected","checked","halfChecked"]),d=this.context.rcTree,v=d.prefixCls,m=d.filterTreeNode,y=d.draggable,g=this.isDisabled(),b=oc(h);return Ss.a.createElement("li",us()({className:Ts()(r,(e={},ss()(e,v+"-treenode-disabled",g),ss()(e,v+"-treenode-switcher-"+(l?"open":"close"),!s),ss()(e,v+"-treenode-checkbox-checked",p),ss()(e,v+"-treenode-checkbox-indeterminate",f),ss()(e,v+"-treenode-selected",u),ss()(e,v+"-treenode-loading",t),ss()(e,"drag-over",!g&&i),ss()(e,"drag-over-gap-top",!g&&a),ss()(e,"drag-over-gap-bottom",!g&&c),ss()(e,"filter-node",m&&m(this)),e)),style:o,role:"treeitem",onDragEnter:y?this.onDragEnter:void 0,onDragOver:y?this.onDragOver:void 0,onDragLeave:y?this.onDragLeave:void 0,onDrop:y?this.onDrop:void 0,onDragEnd:y?this.onDragEnd:void 0},b),this.renderSwitcher(),this.renderCheckbox(),this.renderSelector(),this.renderChildren())}}]),t}(Ss.a.Component);rx.propTypes={eventKey:ks.a.string,prefixCls:ks.a.string,className:ks.a.string,style:ks.a.object,root:ks.a.object,onSelect:ks.a.func,expanded:ks.a.bool,selected:ks.a.bool,checked:ks.a.bool,loaded:ks.a.bool,loading:ks.a.bool,halfChecked:ks.a.bool,children:ks.a.node,title:ks.a.node,pos:ks.a.string,dragOver:ks.a.bool,dragOverGapTop:ks.a.bool,dragOverGapBottom:ks.a.bool,isLeaf:ks.a.bool,selectable:ks.a.bool,disabled:ks.a.bool,disableCheckbox:ks.a.bool,icon:ks.a.oneOfType([ks.a.node,ks.a.func]),switcherIcon:ks.a.oneOfType([ks.a.node,ks.a.func])},rx.contextTypes=HS,rx.childContextTypes=HS,rx.defaultProps={title:"---"};var ox=function(){var e=this;this.onSelectorClick=function(t){(0,e.context.rcTree.onNodeClick)(t,e),e.isSelectable()?e.onSelect(t):e.onCheck(t)},this.onSelectorDoubleClick=function(t){(0,e.context.rcTree.onNodeDoubleClick)(t,e)},this.onSelect=function(t){if(!e.isDisabled()){var n=e.context.rcTree.onNodeSelect;t.preventDefault(),n(t,e)}},this.onCheck=function(t){if(!e.isDisabled()){var n=e.props,r=n.disableCheckbox,o=n.checked,i=e.context.rcTree,a=i.checkable,c=i.onNodeCheck;if(a&&!r){t.preventDefault();c(t,e,!o)}}},this.onMouseEnter=function(t){(0,e.context.rcTree.onNodeMouseEnter)(t,e)},this.onMouseLeave=function(t){(0,e.context.rcTree.onNodeMouseLeave)(t,e)},this.onContextMenu=function(t){(0,e.context.rcTree.onNodeContextMenu)(t,e)},this.onDragStart=function(t){var n=e.context.rcTree.onNodeDragStart;t.stopPropagation(),e.setState({dragNodeHighlight:!0}),n(t,e);try{t.dataTransfer.setData("text/plain","")}catch(e){}},this.onDragEnter=function(t){var n=e.context.rcTree.onNodeDragEnter;t.preventDefault(),t.stopPropagation(),n(t,e)},this.onDragOver=function(t){var n=e.context.rcTree.onNodeDragOver;t.preventDefault(),t.stopPropagation(),n(t,e)},this.onDragLeave=function(t){var n=e.context.rcTree.onNodeDragLeave;t.stopPropagation(),n(t,e)},this.onDragEnd=function(t){var n=e.context.rcTree.onNodeDragEnd;t.stopPropagation(),e.setState({dragNodeHighlight:!1}),n(t,e)},this.onDrop=function(t){var n=e.context.rcTree.onNodeDrop;t.preventDefault(),t.stopPropagation(),e.setState({dragNodeHighlight:!1}),n(t,e)},this.onExpand=function(t){(0,e.context.rcTree.onNodeExpand)(t,e)},this.setSelectHandle=function(t){e.selectHandle=t},this.getNodeChildren=function(){var t=e.props.children,n=m(t).filter(function(e){return e}),r=Ua(n);return n.length!==r.length&&Ra(),r},this.getNodeState=function(){var t=e.props.expanded;return e.isLeaf()?null:t?"open":"close"},this.isLeaf=function(){var t=e.props,n=t.isLeaf,r=t.loaded,o=e.context.rcTree.loadData,i=0!==e.getNodeChildren().length;return!1!==n&&(n||!o&&!i||o&&r&&!i)},this.isDisabled=function(){var t=e.props.disabled,n=e.context.rcTree.disabled;return!1!==t&&!(!n&&!t)},this.syncLoadData=function(t){var n=t.expanded,r=t.loading,o=t.loaded,i=e.context.rcTree,a=i.loadData,c=i.onNodeLoad;if(!r&&a&&n&&!e.isLeaf()){0!==e.getNodeChildren().length||o||c(e)}},this.renderSwitcher=function(){var t=e.props,n=t.expanded,r=t.switcherIcon,o=e.context.rcTree,i=o.prefixCls,a=o.switcherIcon,c=r||a;if(e.isLeaf())return Ss.a.createElement("span",{className:Ts()(i+"-switcher",i+"-switcher-noop")},"function"==typeof c?Ss.a.createElement(c,us()({},e.props,{isLeaf:!0})):c);var s=Ts()(i+"-switcher",i+"-switcher_"+(n?"open":"close"));return Ss.a.createElement("span",{onClick:e.onExpand,className:s},"function"==typeof c?Ss.a.createElement(c,us()({},e.props,{isLeaf:!1})):c)},this.renderCheckbox=function(){var t=e.props,n=t.checked,r=t.halfChecked,o=t.disableCheckbox,i=e.context.rcTree,a=i.prefixCls,c=i.checkable,s=e.isDisabled();if(!c)return null;var l="boolean"!=typeof c?c:null;return Ss.a.createElement("span",{className:Ts()(a+"-checkbox",n&&a+"-checkbox-checked",!n&&r&&a+"-checkbox-indeterminate",(s||o)&&a+"-checkbox-disabled"),onClick:e.onCheck},l)},this.renderIcon=function(){var t=e.props.loading,n=e.context.rcTree.prefixCls;return Ss.a.createElement("span",{className:Ts()(n+"-iconEle",n+"-icon__"+(e.getNodeState()||"docu"),t&&n+"-icon_loading")})},this.renderSelector=function(){var t=e.state.dragNodeHighlight,n=e.props,r=n.title,o=n.selected,i=n.icon,a=n.loading,c=e.context.rcTree,s=c.prefixCls,l=c.showIcon,u=c.icon,p=c.draggable,f=c.loadData,h=e.isDisabled(),d=s+"-node-content-wrapper",v=void 0;if(l){var m=i||u;v=m?Ss.a.createElement("span",{className:Ts()(s+"-iconEle",s+"-icon__customize")},"function"==typeof m?Ss.a.createElement(m,us()({},e.props)):m):e.renderIcon()}else f&&a&&(v=e.renderIcon());var y=Ss.a.createElement("span",{className:s+"-title"},r);return Ss.a.createElement("span",{ref:e.setSelectHandle,title:"string"==typeof r?r:"",className:Ts()(""+d,d+"-"+(e.getNodeState()||"normal"),!h&&(o||t)&&s+"-node-selected",!h&&p&&"draggable"),draggable:!h&&p||void 0,"aria-grabbed":!h&&p||void 0,onMouseEnter:e.onMouseEnter,onMouseLeave:e.onMouseLeave,onContextMenu:e.onContextMenu,onClick:e.onSelectorClick,onDoubleClick:e.onSelectorDoubleClick,onDragStart:p?e.onDragStart:void 0},v,y)},this.renderChildren=function(){var t=e.props,n=t.expanded,r=t.pos,o=e.context.rcTree,i=o.prefixCls,a=o.openTransitionName,c=o.openAnimation,s=o.renderTreeNode,l={};a?l.transitionName=a:"object"==typeof c&&(l.animation=us()({},c));var u=e.getNodeChildren();if(0===u.length)return null;var p=void 0;return n&&(p=Ss.a.createElement("ul",{className:Ts()(i+"-child-tree",n&&i+"-child-tree-open"),"data-expanded":n,role:"group"},Ga(u,function(e,t){return s(e,t,r)}))),Ss.a.createElement(nx,us()({},l,{showProp:"data-expanded",component:""}),p)}};rx.isTreeNode=1,Object(Ys.polyfill)(rx);var ix=rx,ax=.25,cx=2,sx=!1,lx=function(e){return e},ux=function(e){function t(){var e,n,r,o;fs()(this,t);for(var i=arguments.length,a=Array(i),c=0;c<i;c++)a[c]=arguments[c];return n=r=ms()(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(a))),r.state={posEntities:{},keyEntities:{},selectedKeys:[],checkedKeys:[],halfCheckedKeys:[],loadedKeys:[],loadingKeys:[],treeNode:[]},r.onNodeDragStart=function(e,t){var n=r.state.expandedKeys,o=r.props.onDragStart,i=t.props,a=i.eventKey,c=i.children;r.dragNode=t,r.setState({dragNodesKeys:Xa(c,t),expandedKeys:ja(n,a)}),o&&o({event:e,node:t})},r.onNodeDragEnter=function(e,t){var n=r.state.expandedKeys,o=r.props.onDragEnter,i=t.props,a=i.pos,c=i.eventKey;if(r.dragNode){var s=$a(e,t);if(r.dragNode.props.eventKey===c&&0===s)return void r.setState({dragOverNodeKey:"",dropPosition:null});setTimeout(function(){r.setState({dragOverNodeKey:c,dropPosition:s}),r.delayedDragEnterLogic||(r.delayedDragEnterLogic={}),Object.keys(r.delayedDragEnterLogic).forEach(function(e){clearTimeout(r.delayedDragEnterLogic[e])}),r.delayedDragEnterLogic[a]=setTimeout(function(){var i=Fa(n,c);r.setState({expandedKeys:i}),o&&o({event:e,node:t,expandedKeys:i})},400)},0)}},r.onNodeDragOver=function(e,t){var n=r.props.onDragOver,o=t.props.eventKey;if(r.dragNode&&o===r.state.dragOverNodeKey){var i=$a(e,t);if(i===r.state.dropPosition)return;r.setState({dropPosition:i})}n&&n({event:e,node:t})},r.onNodeDragLeave=function(e,t){var n=r.props.onDragLeave;r.setState({dragOverNodeKey:""}),n&&n({event:e,node:t})},r.onNodeDragEnd=function(e,t){var n=r.props.onDragEnd;r.setState({dragOverNodeKey:""}),n&&n({event:e,node:t})},r.onNodeDrop=function(e,t){var n=r.state,o=n.dragNodesKeys,i=void 0===o?[]:o,a=n.dropPosition,c=r.props.onDrop,s=t.props,l=s.eventKey,u=s.pos;if(r.setState({dragOverNodeKey:""}),-1!==i.indexOf(l))return void Hh()(!1,"Can not drop to dragNode(include it's children node)");var p=Ka(u),f={event:e,node:t,dragNode:r.dragNode,dragNodesKeys:i.slice(),dropPosition:a+Number(p[p.length-1])};0!==a&&(f.dropToGap=!0),c&&c(f)},r.onNodeClick=function(e,t){var n=r.props.onClick;n&&n(e,t)},r.onNodeDoubleClick=function(e,t){var n=r.props.onDoubleClick;n&&n(e,t)},r.onNodeSelect=function(e,t){var n=r.state.selectedKeys,o=r.state.keyEntities,i=r.props,a=i.onSelect,c=i.multiple,s=t.props,l=s.selected,u=s.eventKey,p=!l;n=p?c?Fa(n,u):[u]:ja(n,u);var f=n.map(function(e){var t=o[e];return t?t.node:null}).filter(function(e){return e});if(r.setUncontrolledState({selectedKeys:n}),a){a(n,{event:"select",selected:p,node:t,selectedNodes:f,nativeEvent:e.nativeEvent})}},r.onNodeCheck=function(e,t,n){var o=r.state,i=o.keyEntities,a=o.checkedKeys,c=o.halfCheckedKeys,s=r.props,l=s.checkStrictly,u=s.onCheck,p=t.props.eventKey,f=void 0,h={event:"check",node:t,checked:n,nativeEvent:e.nativeEvent};if(l){var d=n?Fa(a,p):ja(a,p);f={checked:d,halfChecked:ja(c,p)},h.checkedNodes=d.map(function(e){return i[e]}).filter(function(e){return e}).map(function(e){return e.node}),r.setUncontrolledState({checkedKeys:d})}else{var v=nc([p],n,i,{checkedKeys:a,halfCheckedKeys:c}),m=v.checkedKeys,y=v.halfCheckedKeys;f=m,h.checkedNodes=[],h.checkedNodesPositions=[],h.halfCheckedKeys=y,m.forEach(function(e){var t=i[e];if(t){var n=t.node,r=t.pos;h.checkedNodes.push(n),h.checkedNodesPositions.push({node:n,pos:r})}}),r.setUncontrolledState({checkedKeys:m,halfCheckedKeys:y})}u&&u(f,h)},r.onNodeLoad=function(e){return new Promise(function(t){r.setState(function(n){var o=n.loadedKeys,i=void 0===o?[]:o,a=n.loadingKeys,c=void 0===a?[]:a,s=r.props,l=s.loadData,u=s.onLoad,p=e.props.eventKey;return l&&-1===i.indexOf(p)&&-1===c.indexOf(p)?(l(e).then(function(){var n=Fa(r.state.loadedKeys,p);r.setUncontrolledState({loadedKeys:n}),r.setState({loadingKeys:ja(r.state.loadingKeys,p)}),u&&u(n,{event:"load",node:e}),t()}),{loadingKeys:Fa(c,p)}):{}})})},r.onNodeExpand=function(e,t){var n=r.state.expandedKeys,o=r.props,i=o.onExpand,a=o.loadData,c=t.props,s=c.eventKey,l=c.expanded,u=n.indexOf(s),p=!l;if(Hh()(l&&-1!==u||!l&&-1===u,"Expand state not sync with index check"),n=p?Fa(n,s):ja(n,s),r.setUncontrolledState({expandedKeys:n}),i&&i(n,{node:t,expanded:p,nativeEvent:e.nativeEvent}),p&&a){var f=r.onNodeLoad(t);return f?f.then(function(){r.setUncontrolledState({expandedKeys:n})}):null}return null},r.onNodeMouseEnter=function(e,t){var n=r.props.onMouseEnter;n&&n({event:e,node:t})},r.onNodeMouseLeave=function(e,t){var n=r.props.onMouseLeave;n&&n({event:e,node:t})},r.onNodeContextMenu=function(e,t){var n=r.props.onRightClick;n&&(e.preventDefault(),n({event:e,node:t}))},r.setUncontrolledState=function(e){var t=!1,n={};Object.keys(e).forEach(function(o){o in r.props||(t=!0,n[o]=e[o])}),t&&r.setState(n)},r.isKeyChecked=function(e){var t=r.state.checkedKeys;return-1!==(void 0===t?[]:t).indexOf(e)},r.renderTreeNode=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,o=r.state,i=o.keyEntities,a=o.expandedKeys,c=void 0===a?[]:a,s=o.selectedKeys,l=void 0===s?[]:s,u=o.halfCheckedKeys,p=void 0===u?[]:u,f=o.loadedKeys,h=void 0===f?[]:f,d=o.loadingKeys,v=void 0===d?[]:d,m=o.dragOverNodeKey,y=o.dropPosition,g=Ba(n,t),b=e.key||g;return i[b]?Ss.a.cloneElement(e,{key:b,eventKey:b,expanded:-1!==c.indexOf(b),selected:-1!==l.indexOf(b),loaded:-1!==h.indexOf(b),loading:-1!==v.indexOf(b),checked:r.isKeyChecked(b),halfChecked:-1!==p.indexOf(b),pos:g,dragOver:m===b&&0===y,dragOverGapTop:m===b&&-1===y,dragOverGapBottom:m===b&&1===y}):(Ra(),null)},o=n,ms()(r,o)}return gs()(t,e),ds()(t,[{key:"getChildContext",value:function(){var e=this.props,t=e.prefixCls,n=e.selectable,r=e.showIcon,o=e.icon,i=e.draggable,a=e.checkable,c=e.checkStrictly,s=e.disabled,l=e.loadData,u=e.filterTreeNode,p=e.openTransitionName,f=e.openAnimation;return{rcTree:{prefixCls:t,selectable:n,showIcon:r,icon:o,switcherIcon:e.switcherIcon,draggable:i,checkable:a,checkStrictly:c,disabled:s,openTransitionName:p,openAnimation:f,loadData:l,filterTreeNode:u,renderTreeNode:this.renderTreeNode,isKeyChecked:this.isKeyChecked,onNodeClick:this.onNodeClick,onNodeDoubleClick:this.onNodeDoubleClick,onNodeExpand:this.onNodeExpand,onNodeSelect:this.onNodeSelect,onNodeCheck:this.onNodeCheck,onNodeLoad:this.onNodeLoad,onNodeMouseEnter:this.onNodeMouseEnter,onNodeMouseLeave:this.onNodeMouseLeave,onNodeContextMenu:this.onNodeContextMenu,onNodeDragStart:this.onNodeDragStart,onNodeDragEnter:this.onNodeDragEnter,onNodeDragOver:this.onNodeDragOver,onNodeDragLeave:this.onNodeDragLeave,onNodeDragEnd:this.onNodeDragEnd,onNodeDrop:this.onNodeDrop}}}},{key:"render",value:function(){var e=this,t=this.state.treeNode,n=this.props,r=n.prefixCls,o=n.className,i=n.focusable,a=n.showLine,c=n.tabIndex,s=void 0===c?0:c,l=oc(this.props);return i&&(l.tabIndex=s,l.onKeyDown=this.onKeyDown),Ss.a.createElement("ul",us()({},l,{className:Ts()(r,o,ss()({},r+"-show-line",a)),role:"tree",unselectable:"on"}),Ga(t,function(t,n){return e.renderTreeNode(t,n)}))}}],[{key:"getDerivedStateFromProps",value:function(e,t){function n(t){return!r&&t in e||r&&r[t]!==e[t]}var r=t.prevProps,o={prevProps:e},i=null;if(n("treeData")?i=Qa(e.treeData):n("children")&&(i=m(e.children)),i){o.treeNode=i;var a=ec(i);o.posEntities=a.posEntities,o.keyEntities=a.keyEntities}var c=o.keyEntities||t.keyEntities;if(n("expandedKeys")||r&&n("autoExpandParent")?o.expandedKeys=e.autoExpandParent||!r&&e.defaultExpandParent?rc(e.expandedKeys,c):e.expandedKeys:!r&&e.defaultExpandAll?o.expandedKeys=Object.keys(c):!r&&e.defaultExpandedKeys&&(o.expandedKeys=e.autoExpandParent||e.defaultExpandParent?rc(e.defaultExpandedKeys,c):e.defaultExpandedKeys),e.selectable&&(n("selectedKeys")?o.selectedKeys=Ja(e.selectedKeys,e):!r&&e.defaultSelectedKeys&&(o.selectedKeys=Ja(e.defaultSelectedKeys,e))),e.checkable){var s=void 0;if(n("checkedKeys")?s=tc(e.checkedKeys)||{}:!r&&e.defaultCheckedKeys?s=tc(e.defaultCheckedKeys)||{}:i&&(s={checkedKeys:t.checkedKeys,halfCheckedKeys:t.halfCheckedKeys}),s){var l=s,u=l.checkedKeys,p=void 0===u?[]:u,f=l.halfCheckedKeys,h=void 0===f?[]:f;if(!e.checkStrictly){var d=nc(p,!0,c);p=d.checkedKeys,h=d.halfCheckedKeys}o.checkedKeys=p,o.halfCheckedKeys=h}}return n("loadedKeys")&&(o.loadedKeys=e.loadedKeys),o}}]),t}(Ss.a.Component);ux.propTypes={prefixCls:ks.a.string,className:ks.a.string,tabIndex:ks.a.oneOfType([ks.a.string,ks.a.number]),children:ks.a.any,treeData:ks.a.array,showLine:ks.a.bool,showIcon:ks.a.bool,icon:ks.a.oneOfType([ks.a.node,ks.a.func]),focusable:ks.a.bool,selectable:ks.a.bool,disabled:ks.a.bool,multiple:ks.a.bool,checkable:ks.a.oneOfType([ks.a.bool,ks.a.node]),checkStrictly:ks.a.bool,draggable:ks.a.bool,defaultExpandParent:ks.a.bool,autoExpandParent:ks.a.bool,defaultExpandAll:ks.a.bool,defaultExpandedKeys:ks.a.arrayOf(ks.a.string),expandedKeys:ks.a.arrayOf(ks.a.string),defaultCheckedKeys:ks.a.arrayOf(ks.a.string),checkedKeys:ks.a.oneOfType([ks.a.arrayOf(ks.a.oneOfType([ks.a.string,ks.a.number])),ks.a.object]),defaultSelectedKeys:ks.a.arrayOf(ks.a.string),selectedKeys:ks.a.arrayOf(ks.a.string),onClick:ks.a.func,onDoubleClick:ks.a.func,onExpand:ks.a.func,onCheck:ks.a.func,onSelect:ks.a.func,onLoad:ks.a.func,loadData:ks.a.func,loadedKeys:ks.a.arrayOf(ks.a.string),onMouseEnter:ks.a.func,onMouseLeave:ks.a.func,onRightClick:ks.a.func,onDragStart:ks.a.func,onDragEnter:ks.a.func,onDragOver:ks.a.func,onDragLeave:ks.a.func,onDragEnd:ks.a.func,onDrop:ks.a.func,filterTreeNode:ks.a.func,openTransitionName:ks.a.string,openAnimation:ks.a.oneOfType([ks.a.string,ks.a.object]),switcherIcon:ks.a.oneOfType([ks.a.node,ks.a.func])},ux.childContextTypes=PS,ux.defaultProps={prefixCls:"rc-tree",showLine:!1,showIcon:!0,selectable:!0,multiple:!1,checkable:!1,disabled:!1,checkStrictly:!1,draggable:!1,defaultExpandParent:!0,autoExpandParent:!1,defaultExpandAll:!1,defaultExpandedKeys:[],defaultCheckedKeys:[],defaultSelectedKeys:[]},Object(Ys.polyfill)(ux);var px=ux;px.TreeNode=ix;var fx,hx=px;!function(e){e[e.None=0]="None",e[e.Start=1]="Start",e[e.End=2]="End"}(fx||(fx={}));var dx=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},vx=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));n.onExpand=function(e,t){var r=n.props.onExpand;if(n.setUncontrolledState({expandedKeys:e}),r)return r(e,t)},n.onClick=function(e,t){var r=n.props,o=r.onClick;"click"===r.expandAction&&n.onDebounceExpand(e,t),o&&o(e,t)},n.onDoubleClick=function(e,t){var r=n.props,o=r.onDoubleClick;"doubleClick"===r.expandAction&&n.onDebounceExpand(e,t),o&&o(e,t)},n.onSelect=function(e,t){var r=n.props,o=r.onSelect,i=r.multiple,a=r.children,c=n.state,s=c.expandedKeys,l=void 0===s?[]:s,u=c.selectedKeys,p=void 0===u?[]:u,f=t.node,h=t.nativeEvent,d=f.props.eventKey,v=void 0===d?"":d,m={},y=h.ctrlKey||h.metaKey,g=h.shiftKey,b=p.slice();i&&y?(b=e,n.lastSelectedKey=v,n.cachedSelectedKeys=b):i&&g?b=Array.from(new Set([].concat(Ls()(n.cachedSelectedKeys||[]),Ls()(cc(a,l,v,n.lastSelectedKey))))):(b=[v],n.lastSelectedKey=v,n.cachedSelectedKeys=b),m.selectedKeys=b,o&&o(b,t),n.setUncontrolledState(m)},n.expandFolderNode=function(e,t){var r=n.state.expandedKeys,o=void 0===r?[]:r,i=n.props.onExpand,a=t.props,c=a.eventKey,s=void 0===c?"":c,l=a.expanded;if(!(a.isLeaf||e.shiftKey||e.metaKey||e.ctrlKey)){var u=o.slice(),p=u.indexOf(s);l&&p>=0?u.splice(p,1):l||-1!==p||u.push(s),n.setUncontrolledState({expandedKeys:u}),i&&i(u,{expanded:!l,node:t,nativeEvent:e.nativeEvent})}},n.setUncontrolledState=function(e){var t=Ps(e,Object.keys(n.props));Object.keys(t).length&&n.setState(t)};var r=e.defaultExpandAll,o=e.defaultExpandParent,i=e.expandedKeys,a=e.defaultExpandedKeys,c=e.children,s=ec(c),l=s.keyEntities;return n.state={selectedKeys:e.selectedKeys||e.defaultSelectedKeys||[]},n.state.expandedKeys=r?ac(e.children):o?rc(i||a,l):a,n.onDebounceExpand=jh()(n.expandFolderNode,200,{leading:!0}),n}return gs()(t,e),ds()(t,[{key:"componentWillReceiveProps",value:function(e){"expandedKeys"in e&&this.setState({expandedKeys:e.expandedKeys}),"selectedKeys"in e&&this.setState({selectedKeys:e.selectedKeys})}},{key:"render",value:function(){var e=this.props,t=e.prefixCls,n=e.className,r=dx(e,["prefixCls","className"]),o=this.state,i=o.expandedKeys,a=o.selectedKeys,c=Ts()(t+"-directory",n);return ws.createElement(gx,us()({icon:sc},r,{prefixCls:t,className:c,expandedKeys:i,selectedKeys:a,onSelect:this.onSelect,onClick:this.onClick,onDoubleClick:this.onDoubleClick,onExpand:this.onExpand}))}}]),t}(ws.Component),mx=vx;vx.defaultProps={prefixCls:"ant-tree",showIcon:!0,expandAction:"click"};var yx=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.renderSwitcherIcon=function(t){var n=t.isLeaf,r=t.expanded,o=t.loading,i=e.props,a=i.prefixCls,c=i.showLine;return o?ws.createElement(Kp,{type:"loading",className:a+"-switcher-loading-icon"}):c?n?ws.createElement(Kp,{type:"file",className:a+"-switcher-line-icon"}):ws.createElement(Kp,{type:r?"minus-square":"plus-square",className:a+"-switcher-line-icon",theme:"outlined"}):n?null:ws.createElement(Kp,{type:"caret-down",className:a+"-switcher-icon",theme:"filled"})},e}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e=this.props,t=e.prefixCls,n=e.className,r=e.showIcon,o=e.checkable;return ws.createElement(hx,us()({},e,{className:Ts()(!r&&t+"-icon-hide",n),checkable:o?ws.createElement("span",{className:t+"-checkbox-inner"}):o,switcherIcon:this.renderSwitcherIcon}),this.props.children)}}]),t}(ws.Component),gx=yx;yx.TreeNode=ix,yx.DirectoryTree=mx,yx.defaultProps={prefixCls:"ant-tree",checkable:!1,showIcon:!1,openAnimation:us()({},Ed,{appear:null})};var bx=gx,Cx=function(e){function t(){return fs()(this,t),ms()(this,e.apply(this,arguments))}return gs()(t,e),t.prototype.shouldComponentUpdate=function(e){return e.hiddenClassName||e.visible},t.prototype.render=function(){var e=this.props,t=e.hiddenClassName,n=e.visible,r=kl()(e,["hiddenClassName","visible"]);return t||Ss.a.Children.count(r.children)>1?(!n&&t&&(r.className+=" "+t),Ss.a.createElement("div",r)):Ss.a.Children.only(r.children)},t}(ws.Component);Cx.propTypes={children:ks.a.any,className:ks.a.string,visible:ks.a.bool,hiddenClassName:ks.a.string};var wx=Cx,Sx=function(e){function t(){return fs()(this,t),ms()(this,e.apply(this,arguments))}return gs()(t,e),t.prototype.render=function(){var e=this.props,t=e.className;return e.visible||(t+=" "+e.hiddenClassName),Ss.a.createElement("div",{className:t,onMouseEnter:e.onMouseEnter,onMouseLeave:e.onMouseLeave,style:e.style},Ss.a.createElement(wx,{className:e.prefixCls+"-content",visible:e.visible},e.children))},t}(ws.Component);Sx.propTypes={hiddenClassName:ks.a.string,className:ks.a.string,prefixCls:ks.a.string,onMouseEnter:ks.a.func,onMouseLeave:ks.a.func,children:ks.a.any};var xx=Sx,Mx=function(e){function t(n){fs()(this,t);var r=ms()(this,e.call(this,n));return zx.call(r),r.state={stretchChecked:!1,targetWidth:void 0,targetHeight:void 0},r.savePopupRef=fc.bind(r,"popupInstance"),r.saveAlignRef=fc.bind(r,"alignInstance"),r}return gs()(t,e),t.prototype.componentDidMount=function(){this.rootNode=this.getPopupDomNode(),this.setStretchSize()},t.prototype.componentDidUpdate=function(){this.setStretchSize()},t.prototype.getPopupDomNode=function(){return Ms.a.findDOMNode(this.popupInstance)},t.prototype.getMaskTransitionName=function(){var e=this.props,t=e.maskTransitionName,n=e.maskAnimation;return!t&&n&&(t=e.prefixCls+"-"+n),t},t.prototype.getTransitionName=function(){var e=this.props,t=e.transitionName;return!t&&e.animation&&(t=e.prefixCls+"-"+e.animation),t},t.prototype.getClassName=function(e){return this.props.prefixCls+" "+this.props.className+" "+e},t.prototype.getPopupElement=function(){var e=this,t=this.savePopupRef,n=this.state,r=n.stretchChecked,o=n.targetHeight,i=n.targetWidth,a=this.props,c=a.align,s=a.visible,l=a.prefixCls,u=a.style,p=a.getClassNameFromAlign,f=a.destroyPopupOnHide,h=a.stretch,d=a.children,v=a.onMouseEnter,m=a.onMouseLeave,y=this.getClassName(this.currentAlignClassName||p(c)),g=l+"-hidden";s||(this.currentAlignClassName=null);var b={};h&&(-1!==h.indexOf("height")?b.height=o:-1!==h.indexOf("minHeight")&&(b.minHeight=o),-1!==h.indexOf("width")?b.width=i:-1!==h.indexOf("minWidth")&&(b.minWidth=i),r||(b.visibility="hidden",As()(function(){e.alignInstance&&e.alignInstance.forceAlign()})));var C=us()({},b,u,this.getZIndexStyle()),w={className:y,prefixCls:l,ref:t,onMouseEnter:v,onMouseLeave:m,style:C};return f?Ss.a.createElement(nx,{component:"",exclusive:!0,transitionAppear:!0,transitionName:this.getTransitionName(),onLeave:this.onAnimateLeaved},s?Ss.a.createElement(du,{target:this.getAlignTarget(),key:"popup",ref:this.saveAlignRef,monitorWindowResize:!0,align:c,onAlign:this.onAlign},Ss.a.createElement(xx,us()({visible:!0},w),d)):null):Ss.a.createElement(nx,{component:"",exclusive:!0,transitionAppear:!0,transitionName:this.getTransitionName(),showProp:"xVisible",onLeave:this.onAnimateLeaved},Ss.a.createElement(du,{target:this.getAlignTarget(),key:"popup",ref:this.saveAlignRef,monitorWindowResize:!0,xVisible:s,childrenProps:{visible:"xVisible"},disabled:!s,align:c,onAlign:this.onAlign},Ss.a.createElement(xx,us()({hiddenClassName:g},w),d)))},t.prototype.getZIndexStyle=function(){var e={},t=this.props;return void 0!==t.zIndex&&(e.zIndex=t.zIndex),e},t.prototype.getMaskElement=function(){var e=this.props,t=void 0;if(e.mask){var n=this.getMaskTransitionName();t=Ss.a.createElement(wx,{style:this.getZIndexStyle(),key:"mask",className:e.prefixCls+"-mask",hiddenClassName:e.prefixCls+"-mask-hidden",visible:e.visible}),n&&(t=Ss.a.createElement(nx,{key:"mask",showProp:"visible",transitionAppear:!0,component:"",transitionName:n},t))}return t},t.prototype.render=function(){return Ss.a.createElement("div",null,this.getMaskElement(),this.getPopupElement())},t}(ws.Component);Mx.propTypes={visible:ks.a.bool,style:ks.a.object,getClassNameFromAlign:ks.a.func,onAlign:ks.a.func,getRootDomNode:ks.a.func,onMouseEnter:ks.a.func,align:ks.a.any,destroyPopupOnHide:ks.a.bool,className:ks.a.string,prefixCls:ks.a.string,onMouseLeave:ks.a.func,stretch:ks.a.string,children:ks.a.node,point:ks.a.shape({pageX:ks.a.number,pageY:ks.a.number})};var zx=function(){var e=this;this.onAlign=function(t,n){var r=e.props,o=r.getClassNameFromAlign(n);e.currentAlignClassName!==o&&(e.currentAlignClassName=o,t.className=e.getClassName(o)),r.onAlign(t,n)},this.onAnimateLeaved=function(){var t=e.props.stretch,n=e.state.stretchChecked;t&&n&&e.setState({stretchChecked:!1})},this.setStretchSize=function(){var t=e.props.getRootDomNode,n=e.state,r=n.stretchChecked,o=n.targetHeight,i=n.targetWidth,a=t();if(a){var c=a.offsetHeight,s=a.offsetWidth;o===c&&i===s&&r||e.setState({stretchChecked:!0,targetHeight:c,targetWidth:s})}},this.getTargetElement=function(){return e.props.getRootDomNode()},this.getAlignTarget=function(){var t=e.props.point;return t||e.getTargetElement}},kx=Mx,_x=["onClick","onMouseDown","onTouchStart","onMouseEnter","onMouseLeave","onFocus","onBlur","onContextMenu"],Ox=!!xs.createPortal,Ex=function(e){function t(n){fs()(this,t);var r=ms()(this,e.call(this,n));Tx.call(r);var o=void 0;return o="popupVisible"in n?!!n.popupVisible:!!n.defaultPopupVisible,r.prevPopupVisible=o,r.state={popupVisible:o},r}return gs()(t,e),t.prototype.componentWillMount=function(){var e=this;_x.forEach(function(t){e["fire"+t]=function(n){e.fireEvents(t,n)}})},t.prototype.componentDidMount=function(){this.componentDidUpdate({},{popupVisible:this.state.popupVisible})},t.prototype.componentWillReceiveProps=function(e){var t=e.popupVisible;void 0!==t&&this.setState({popupVisible:t})},t.prototype.componentDidUpdate=function(e,t){var n=this.props,o=this.state,i=function(){t.popupVisible!==o.popupVisible&&n.afterPopupVisibleChange(o.popupVisible)};if(Ox||this.renderComponent(null,i),this.prevPopupVisible=t.popupVisible,o.popupVisible){var a=void 0;return this.clickOutsideHandler||!this.isClickToHide()&&!this.isContextMenuToShow()||(a=n.getDocument(),this.clickOutsideHandler=r(a,"mousedown",this.onDocumentClick)),this.touchOutsideHandler||(a=a||n.getDocument(),this.touchOutsideHandler=r(a,"touchstart",this.onDocumentClick)),!this.contextMenuOutsideHandler1&&this.isContextMenuToShow()&&(a=a||n.getDocument(),this.contextMenuOutsideHandler1=r(a,"scroll",this.onContextMenuClose)),void(!this.contextMenuOutsideHandler2&&this.isContextMenuToShow()&&(this.contextMenuOutsideHandler2=r(window,"blur",this.onContextMenuClose)))}this.clearOutsideHandler()},t.prototype.componentWillUnmount=function(){this.clearDelayTimer(),this.clearOutsideHandler()},t.prototype.getPopupDomNode=function(){return this._component&&this._component.getPopupDomNode?this._component.getPopupDomNode():null},t.prototype.getPopupAlign=function(){var e=this.props,t=e.popupPlacement,n=e.popupAlign,r=e.builtinPlacements;return t&&r?uc(r,t,n):n},t.prototype.setPopupVisible=function(e,t){var n=this.props.alignPoint;this.clearDelayTimer(),this.state.popupVisible!==e&&("popupVisible"in this.props||this.setState({popupVisible:e}),this.props.onPopupVisibleChange(e)),n&&t&&this.setPoint(t)},t.prototype.delaySetPopupVisible=function(e,t,n){var r=this,o=1e3*t;if(this.clearDelayTimer(),o){var i=n?{pageX:n.pageX,pageY:n.pageY}:null;this.delayTimer=setTimeout(function(){r.setPopupVisible(e,i),r.clearDelayTimer()},o)}else this.setPopupVisible(e,n)},t.prototype.clearDelayTimer=function(){this.delayTimer&&(clearTimeout(this.delayTimer),this.delayTimer=null)},t.prototype.clearOutsideHandler=function(){this.clickOutsideHandler&&(this.clickOutsideHandler.remove(),this.clickOutsideHandler=null),this.contextMenuOutsideHandler1&&(this.contextMenuOutsideHandler1.remove(),this.contextMenuOutsideHandler1=null),this.contextMenuOutsideHandler2&&(this.contextMenuOutsideHandler2.remove(),this.contextMenuOutsideHandler2=null),this.touchOutsideHandler&&(this.touchOutsideHandler.remove(),this.touchOutsideHandler=null)},t.prototype.createTwoChains=function(e){var t=this.props.children.props,n=this.props;return t[e]&&n[e]?this["fire"+e]:t[e]||n[e]},t.prototype.isClickToShow=function(){var e=this.props,t=e.action,n=e.showAction;return-1!==t.indexOf("click")||-1!==n.indexOf("click")},t.prototype.isContextMenuToShow=function(){var e=this.props,t=e.action,n=e.showAction;return-1!==t.indexOf("contextMenu")||-1!==n.indexOf("contextMenu")},t.prototype.isClickToHide=function(){var e=this.props,t=e.action,n=e.hideAction;return-1!==t.indexOf("click")||-1!==n.indexOf("click")},t.prototype.isMouseEnterToShow=function(){var e=this.props,t=e.action,n=e.showAction;return-1!==t.indexOf("hover")||-1!==n.indexOf("mouseEnter")},t.prototype.isMouseLeaveToHide=function(){var e=this.props,t=e.action,n=e.hideAction;return-1!==t.indexOf("hover")||-1!==n.indexOf("mouseLeave")},t.prototype.isFocusToShow=function(){var e=this.props,t=e.action,n=e.showAction;return-1!==t.indexOf("focus")||-1!==n.indexOf("focus")},t.prototype.isBlurToHide=function(){var e=this.props,t=e.action,n=e.hideAction;return-1!==t.indexOf("focus")||-1!==n.indexOf("blur")},t.prototype.forcePopupAlign=function(){this.state.popupVisible&&this._component&&this._component.alignInstance&&this._component.alignInstance.forceAlign()},t.prototype.fireEvents=function(e,t){var n=this.props.children.props[e];n&&n(t);var r=this.props[e];r&&r(t)},t.prototype.close=function(){this.setPopupVisible(!1)},t.prototype.render=function(){var e=this,t=this.state.popupVisible,n=this.props,r=n.children,o=n.forceRender,i=n.alignPoint,a=n.className,c=Ss.a.Children.only(r),s={key:"trigger"};this.isContextMenuToShow()?s.onContextMenu=this.onContextMenu:s.onContextMenu=this.createTwoChains("onContextMenu"),this.isClickToHide()||this.isClickToShow()?(s.onClick=this.onClick,s.onMouseDown=this.onMouseDown,s.onTouchStart=this.onTouchStart):(s.onClick=this.createTwoChains("onClick"),s.onMouseDown=this.createTwoChains("onMouseDown"),s.onTouchStart=this.createTwoChains("onTouchStart")),this.isMouseEnterToShow()?(s.onMouseEnter=this.onMouseEnter,i&&(s.onMouseMove=this.onMouseMove)):s.onMouseEnter=this.createTwoChains("onMouseEnter"),this.isMouseLeaveToHide()?s.onMouseLeave=this.onMouseLeave:s.onMouseLeave=this.createTwoChains("onMouseLeave"),this.isFocusToShow()||this.isBlurToHide()?(s.onFocus=this.onFocus,s.onBlur=this.onBlur):(s.onFocus=this.createTwoChains("onFocus"),s.onBlur=this.createTwoChains("onBlur"));var l=Ts()(c&&c.props&&c.props.className,a);l&&(s.className=l);var u=Ss.a.cloneElement(c,s);if(!Ox)return Ss.a.createElement(Vl,{parent:this,visible:t,autoMount:!1,forceRender:o,getComponent:this.getComponent,getContainer:this.getContainer},function(t){var n=t.renderComponent;return e.renderComponent=n,u});var p=void 0;return(t||this._component||o)&&(p=Ss.a.createElement(Hl,{key:"portal",getContainer:this.getContainer,didUpdate:this.handlePortalUpdate},this.getComponent())),[u,p]},t}(Ss.a.Component);Ex.propTypes={children:ks.a.any,action:ks.a.oneOfType([ks.a.string,ks.a.arrayOf(ks.a.string)]),showAction:ks.a.any,hideAction:ks.a.any,getPopupClassNameFromAlign:ks.a.any,onPopupVisibleChange:ks.a.func,afterPopupVisibleChange:ks.a.func,popup:ks.a.oneOfType([ks.a.node,ks.a.func]).isRequired,popupStyle:ks.a.object,prefixCls:ks.a.string,popupClassName:ks.a.string,className:ks.a.string,popupPlacement:ks.a.string,builtinPlacements:ks.a.object,popupTransitionName:ks.a.oneOfType([ks.a.string,ks.a.object]),popupAnimation:ks.a.any,mouseEnterDelay:ks.a.number,mouseLeaveDelay:ks.a.number,zIndex:ks.a.number,focusDelay:ks.a.number,blurDelay:ks.a.number,getPopupContainer:ks.a.func,getDocument:ks.a.func,forceRender:ks.a.bool,destroyPopupOnHide:ks.a.bool,mask:ks.a.bool,maskClosable:ks.a.bool,onPopupAlign:ks.a.func,popupAlign:ks.a.object,popupVisible:ks.a.bool,defaultPopupVisible:ks.a.bool,maskTransitionName:ks.a.oneOfType([ks.a.string,ks.a.object]),maskAnimation:ks.a.string,stretch:ks.a.string,alignPoint:ks.a.bool},Ex.defaultProps={prefixCls:"rc-trigger-popup",getPopupClassNameFromAlign:dc,getDocument:vc,onPopupVisibleChange:hc,afterPopupVisibleChange:hc,onPopupAlign:hc,popupClassName:"",mouseEnterDelay:0,mouseLeaveDelay:.1,focusDelay:0,blurDelay:.15,popupStyle:{},destroyPopupOnHide:!1,popupAlign:{},defaultPopupVisible:!1,mask:!1,maskClosable:!0,action:[],showAction:[],hideAction:[]};var Tx=function(){var e=this;this.onMouseEnter=function(t){var n=e.props.mouseEnterDelay;e.fireEvents("onMouseEnter",t),e.delaySetPopupVisible(!0,n,n?null:t)},this.onMouseMove=function(t){e.fireEvents("onMouseMove",t),e.setPoint(t)},this.onMouseLeave=function(t){e.fireEvents("onMouseLeave",t),e.delaySetPopupVisible(!1,e.props.mouseLeaveDelay)},this.onPopupMouseEnter=function(){e.clearDelayTimer()},this.onPopupMouseLeave=function(t){t.relatedTarget&&!t.relatedTarget.setTimeout&&e._component&&e._component.getPopupDomNode&&D(e._component.getPopupDomNode(),t.relatedTarget)||e.delaySetPopupVisible(!1,e.props.mouseLeaveDelay)},this.onFocus=function(t){e.fireEvents("onFocus",t),e.clearDelayTimer(),e.isFocusToShow()&&(e.focusTime=Date.now(),e.delaySetPopupVisible(!0,e.props.focusDelay))},this.onMouseDown=function(t){e.fireEvents("onMouseDown",t),e.preClickTime=Date.now()},this.onTouchStart=function(t){e.fireEvents("onTouchStart",t),e.preTouchTime=Date.now()},this.onBlur=function(t){e.fireEvents("onBlur",t),e.clearDelayTimer(),e.isBlurToHide()&&e.delaySetPopupVisible(!1,e.props.blurDelay)},this.onContextMenu=function(t){t.preventDefault(),e.fireEvents("onContextMenu",t),e.setPopupVisible(!0,t)},this.onContextMenuClose=function(){e.isContextMenuToShow()&&e.close()},this.onClick=function(t){if(e.fireEvents("onClick",t),e.focusTime){var n=void 0;if(e.preClickTime&&e.preTouchTime?n=Math.min(e.preClickTime,e.preTouchTime):e.preClickTime?n=e.preClickTime:e.preTouchTime&&(n=e.preTouchTime),Math.abs(n-e.focusTime)<20)return;e.focusTime=0}e.preClickTime=0,e.preTouchTime=0,t&&t.preventDefault&&t.preventDefault();var r=!e.state.popupVisible;(e.isClickToHide()&&!r||r&&e.isClickToShow())&&e.setPopupVisible(!e.state.popupVisible,t)},this.onDocumentClick=function(t){if(!e.props.mask||e.props.maskClosable){var n=t.target,r=Object(xs.findDOMNode)(e),o=e.getPopupDomNode();D(r,n)||D(o,n)||e.close()}},this.getRootDomNode=function(){return Object(xs.findDOMNode)(e)},this.getPopupClassNameFromAlign=function(t){var n=[],r=e.props,o=r.popupPlacement,i=r.builtinPlacements,a=r.prefixCls,c=r.alignPoint,s=r.getPopupClassNameFromAlign;return o&&i&&n.push(pc(i,a,t,c)),s&&n.push(s(t)),n.join(" ")},this.getComponent=function(){var t=e.props,n=t.prefixCls,r=t.destroyPopupOnHide,o=t.popupClassName,i=t.action,a=t.onPopupAlign,c=t.popupAnimation,s=t.popupTransitionName,l=t.popupStyle,u=t.mask,p=t.maskAnimation,f=t.maskTransitionName,h=t.zIndex,d=t.popup,v=t.stretch,m=t.alignPoint,y=e.state,g=y.popupVisible,b=y.point,C=e.getPopupAlign(),w={};return e.isMouseEnterToShow()&&(w.onMouseEnter=e.onPopupMouseEnter),e.isMouseLeaveToHide()&&(w.onMouseLeave=e.onPopupMouseLeave),Ss.a.createElement(kx,us()({prefixCls:n,destroyPopupOnHide:r,visible:g,point:m&&b,className:o,action:i,align:C,onAlign:a,animation:c,getClassNameFromAlign:e.getPopupClassNameFromAlign},w,{stretch:v,getRootDomNode:e.getRootDomNode,style:l,mask:u,zIndex:h,transitionName:s,maskAnimation:p,maskTransitionName:f,ref:e.savePopup}),"function"==typeof d?d():d)},this.getContainer=function(){var t=e.props,n=document.createElement("div");return n.style.position="absolute",n.style.top="0",n.style.left="0",n.style.width="100%",(t.getPopupContainer?t.getPopupContainer(Object(xs.findDOMNode)(e)):t.getDocument().body).appendChild(n),n},this.setPoint=function(t){e.props.alignPoint&&t&&e.setState({point:{pageX:t.pageX,pageY:t.pageY}})},this.handlePortalUpdate=function(){e.prevPopupVisible!==e.state.popupVisible&&e.props.afterPopupVisibleChange(e.state.popupVisible)},this.savePopup=function(t){e._component=t}},Nx=Ex,Vx=ks.a.oneOfType([ks.a.string,ks.a.number]),Px=function(e){return Ss.a.createElement(ix,e)};Px.propTypes=us()({},ix.propTypes,{value:yc}),Px.isTreeNode=1;var Hx=Px,Lx="SHOW_PARENT",Dx="SHOW_CHILD",Ax=!1,Ix={userSelect:"none",WebkitUserSelect:"none"},Rx={unselectable:"unselectable"},jx=0,Fx=nc,Kx={bottomLeft:{points:["tl","bl"],offset:[0,4],overflow:{adjustX:0,adjustY:1},ignoreShake:!0},topLeft:{points:["bl","tl"],offset:[0,-4],overflow:{adjustX:0,adjustY:1},ignoreShake:!0}},Bx=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return e.getDropdownTransitionName=function(){var t=e.props,n=t.transitionName,r=t.animation,o=t.dropdownPrefixCls;return!n&&r?o+"-"+r:n},e.forcePopupAlign=function(){var t=e.triggerRef.current;t&&t.forcePopupAlign()},e.triggerRef=Cc(),e}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e,t=this.props,n=t.disabled,r=t.isMultiple,o=t.dropdownPopupAlign,i=t.dropdownMatchSelectWidth,a=t.dropdownClassName,c=t.dropdownStyle,s=t.onDropdownVisibleChange,l=t.getPopupContainer,u=t.dropdownPrefixCls,p=t.popupElement,f=t.open,h=t.children,d=void 0;return!1!==i&&(d=i?"width":"minWidth"),Ss.a.createElement(Nx,{ref:this.triggerRef,action:n?[]:["click"],popupPlacement:"bottomLeft",builtinPlacements:Kx,popupAlign:o,prefixCls:u,popupTransitionName:this.getDropdownTransitionName(),onPopupVisibleChange:s,popup:p,popupVisible:f,getPopupContainer:l,stretch:d,popupClassName:Ts()(a,(e={},ss()(e,u+"--multiple",r),ss()(e,u+"--single",!r),e)),popupStyle:c},h)}}]),t}(Ss.a.Component);Bx.propTypes={disabled:ks.a.bool,showSearch:ks.a.bool,prefixCls:ks.a.string,dropdownPopupAlign:ks.a.object,dropdownClassName:ks.a.string,dropdownStyle:ks.a.object,transitionName:ks.a.string,animation:ks.a.string,getPopupContainer:ks.a.func,children:ks.a.node,dropdownMatchSelectWidth:ks.a.bool,isMultiple:ks.a.bool,dropdownPrefixCls:ks.a.string,onDropdownVisibleChange:ks.a.func,popupElement:ks.a.node,open:ks.a.bool},Object(Ys.polyfill)(Bx);var Wx=Bx,Ux={prefixCls:ks.a.string,className:ks.a.string,style:ks.a.object,open:ks.a.bool,valueList:ks.a.array,allowClear:ks.a.bool,showArrow:ks.a.bool,onClick:ks.a.func,onBlur:ks.a.func,onFocus:ks.a.func,removeSelected:ks.a.func,ariaId:ks.a.string,inputIcon:ks.a.oneOfType([ks.a.node,ks.a.func]),clearIcon:ks.a.oneOfType([ks.a.node,ks.a.func])},qx={onSelectorFocus:ks.a.func.isRequired,onSelectorBlur:ks.a.func.isRequired,onSelectorKeyDown:ks.a.func.isRequired,onSelectorClear:ks.a.func.isRequired},Yx=function(e){var t=function(t){function n(){fs()(this,n);var e=ms()(this,(n.__proto__||Object.getPrototypeOf(n)).call(this));return e.onFocus=function(){var t=e.props,n=t.onFocus,r=t.focused,o=e.context.rcTreeSelect.onSelectorFocus;r||o(),n&&n.apply(void 0,arguments)},e.onBlur=function(){var t=e.props.onBlur;(0,e.context.rcTreeSelect.onSelectorBlur)(),t&&t.apply(void 0,arguments)},e.focus=function(){e.domRef.current.focus()},e.blur=function(){e.domRef.current.focus()},e.domRef=Cc(),e}return gs()(n,t),ds()(n,[{key:"renderClear",value:function(){var e=this.props,t=e.prefixCls,n=e.allowClear,r=e.valueList,o=e.clearIcon,i=this.context.rcTreeSelect.onSelectorClear;return n&&r.length&&r[0].value?Ss.a.createElement("span",{key:"clear",className:t+"-selection__clear",onClick:i},"function"==typeof o?Ss.a.createElement(o,us()({},this.props)):o):null}},{key:"renderArrow",value:function(){var e=this.props,t=e.prefixCls,n=e.showArrow,r=e.inputIcon;return n?Ss.a.createElement("span",{key:"arrow",className:t+"-arrow",style:{outline:"none"}},"function"==typeof r?Ss.a.createElement(r,us()({},this.props)):r):null}},{key:"render",value:function(){var t,n=this.props,r=n.prefixCls,o=n.className,i=n.style,a=n.open,c=n.focused,s=n.disabled,l=n.allowClear,u=n.onClick,p=n.ariaId,f=n.renderSelection,h=n.renderPlaceholder,d=n.tabIndex,v=this.context.rcTreeSelect.onSelectorKeyDown,m=d;return s&&(m=null),Ss.a.createElement("span",{style:i,onClick:u,className:Ts()(o,r,(t={},ss()(t,r+"-open",a),ss()(t,r+"-focused",a||c),ss()(t,r+"-disabled",s),ss()(t,r+"-enabled",!s),ss()(t,r+"-allow-clear",l),t)),ref:this.domRef,role:"combobox","aria-expanded":a,"aria-owns":a?p:void 0,"aria-controls":a?p:void 0,"aria-haspopup":"listbox","aria-disabled":s,tabIndex:m,onFocus:this.onFocus,onBlur:this.onBlur,onKeyDown:v},Ss.a.createElement("span",{key:"selection",className:Ts()(r+"-selection",r+"-selection--"+e)},f(),this.renderClear(),this.renderArrow(),h&&h()))}}]),n}(Ss.a.Component);return t.propTypes=us()({},Ux,{renderSelection:ks.a.func.isRequired,renderPlaceholder:ks.a.func,tabIndex:ks.a.number}),t.contextTypes={rcTreeSelect:ks.a.shape(us()({},qx))},t.defaultProps={tabIndex:0},Object(Ys.polyfill)(t),t},Gx={onPopupKeyDown:ks.a.func.isRequired,onTreeNodeSelect:ks.a.func.isRequired,onTreeNodeCheck:ks.a.func.isRequired},Xx=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));$x.call(n);var r=e.treeDefaultExpandAll,o=e.treeDefaultExpandedKeys,i=e.keyEntities,a=o;return r&&(a=Object.keys(i)),n.state={keyList:[],expandedKeyList:a,loadedKeys:[]},n}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e=this.state,t=e.keyList,n=e.expandedKeyList,r=e.loadedKeys,o=this.props,i=o.prefixCls,a=o.treeNodes,c=o.filteredTreeNodes,s=o.treeIcon,l=o.treeLine,u=o.treeCheckable,p=o.treeCheckStrictly,f=o.multiple,h=o.loadData,d=o.ariaId,v=o.renderSearch,m=o.switcherIcon,y=this.context.rcTreeSelect,g=y.onPopupKeyDown,b=y.onTreeNodeSelect,C=y.onTreeNodeCheck,w={};u?w.checkedKeys=t:w.selectedKeys=t;var S=void 0,x=void 0;c?c.length?(w.checkStrictly=!0,x=c):S=this.renderNotFound():a.length?x=a:S=this.renderNotFound();var M=void 0;return M=S||Ss.a.createElement(hx,us()({prefixCls:i+"-tree",showIcon:s,showLine:l,selectable:!u,checkable:u,checkStrictly:p,multiple:f,loadData:h,loadedKeys:r,expandedKeys:n,filterTreeNode:this.filterTreeNode,onSelect:b,onCheck:C,onExpand:this.onTreeExpand,onLoad:this.onLoad,switcherIcon:m},w),x),Ss.a.createElement("div",{role:"listbox",id:d,onKeyDown:g,tabIndex:-1},v?v():null,M)}}],[{key:"getDerivedStateFromProps",value:function(e,t){var n=t||{},r=n.prevProps,o=void 0===r?{}:r,i=n.loadedKeys,a=e.valueList,c=e.valueEntities,s=e.keyEntities,l=e.filteredTreeNodes,u={prevProps:e};return a!==o.valueList&&(u.keyList=a.map(function(e){var t=e.value;return c[t]}).filter(function(e){return e}).map(function(e){return e.key})),l&&l.length&&l!==o.filteredTreeNodes&&(u.expandedKeyList=Object.keys(s)),e.loadData&&(u.loadedKeys=i.filter(function(e){return e in s})),u}}]),t}(Ss.a.Component);Xx.propTypes={prefixCls:ks.a.string,upperSearchValue:ks.a.string,valueList:ks.a.array,valueEntities:ks.a.object,keyEntities:ks.a.object,treeIcon:ks.a.bool,treeLine:ks.a.bool,treeNodeFilterProp:ks.a.string,treeCheckable:ks.a.oneOfType([ks.a.bool,ks.a.node]),treeCheckStrictly:ks.a.bool,treeDefaultExpandAll:ks.a.bool,treeDefaultExpandedKeys:ks.a.array,loadData:ks.a.func,multiple:ks.a.bool,treeNodes:ks.a.node,filteredTreeNodes:ks.a.node,notFoundContent:ks.a.string,ariaId:ks.a.string,switcherIcon:ks.a.oneOfType([ks.a.node,ks.a.func]),renderSearch:ks.a.func,onTreeExpanded:ks.a.func},Xx.contextTypes={rcTreeSelect:ks.a.shape(us()({},Gx))};var $x=function(){var e=this;this.onTreeExpand=function(t){var n=e.props.onTreeExpanded;e.setState({expandedKeyList:t},n)},this.onLoad=function(t){e.setState({loadedKeys:t})},this.filterTreeNode=function(t){var n=e.props,r=n.upperSearchValue,o=n.treeNodeFilterProp,i=t.props[o];return"string"==typeof i&&(r&&-1!==i.toUpperCase().indexOf(r))},this.renderNotFound=function(){var t=e.props,n=t.prefixCls,r=t.notFoundContent;return Ss.a.createElement("span",{className:n+"-not-found"},r)}};Object(Ys.polyfill)(Xx);var Jx=Xx,Zx=Yx("single"),Qx=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return e.focus=function(){e.selectorRef.current.focus()},e.blur=function(){e.selectorRef.current.blur()},e.renderSelection=function(){var t=e.props,n=t.selectorValueList,r=t.placeholder,o=t.prefixCls,i=void 0;if(n.length){var a=n[0],c=a.label,s=a.value;i=Ss.a.createElement("span",{key:"value",title:gc(c),className:o+"-selection-selected-value"},c||s)}else i=Ss.a.createElement("span",{key:"placeholder",className:o+"-selection__placeholder"},r);return Ss.a.createElement("span",{className:o+"-selection__rendered"},i)},e.selectorRef=Cc(),e}return gs()(t,e),ds()(t,[{key:"render",value:function(){return Ss.a.createElement(Zx,us()({},this.props,{ref:this.selectorRef,renderSelection:this.renderSelection}))}}]),t}(Ss.a.Component);Qx.propTypes=us()({},Ux);var eM=Qx,tM={onSearchInputChange:ks.a.func.isRequired},nM=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return e.alignInputWidth=function(){e.inputRef.current.style.width=e.mirrorInputRef.current.clientWidth+"px"},e.focus=function(t){e.inputRef.current&&(e.inputRef.current.focus(),t&&setTimeout(function(){e.inputRef.current.focus()},0))},e.blur=function(){e.inputRef.current&&e.inputRef.current.blur()},e.inputRef=Cc(),e.mirrorInputRef=Cc(),e}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){var e=this.props,t=e.open;e.needAlign&&this.alignInputWidth(),t&&this.focus(!0)}},{key:"componentDidUpdate",value:function(e){var t=this.props,n=t.open,r=t.searchValue,o=t.needAlign;n&&e.open!==n&&this.focus(),o&&r!==e.searchValue&&this.alignInputWidth()}},{key:"render",value:function(){var e=this.props,t=e.searchValue,n=e.prefixCls,r=e.disabled,o=e.renderPlaceholder,i=e.open,a=e.ariaId,c=this.context.rcTreeSelect,s=c.onSearchInputChange,l=c.onSearchInputKeyDown;return Ss.a.createElement("span",{className:n+"-search__field__wrap"},Ss.a.createElement("input",{type:"text",ref:this.inputRef,onChange:s,onKeyDown:l,value:t,disabled:r,className:n+"-search__field","aria-label":"filter select","aria-autocomplete":"list","aria-controls":i?a:void 0,"aria-multiline":"false"}),Ss.a.createElement("span",{ref:this.mirrorInputRef,className:n+"-search__field__mirror"},t,"\xa0"),o?o():null)}}]),t}(Ss.a.Component);nM.propTypes={open:ks.a.bool,searchValue:ks.a.string,prefixCls:ks.a.string,disabled:ks.a.bool,renderPlaceholder:ks.a.func,needAlign:ks.a.bool,ariaId:ks.a.string},nM.contextTypes={rcTreeSelect:ks.a.shape(us()({},tM))},Object(Ys.polyfill)(nM);var rM=nM,oM=function(e){function t(){var e,n,r,o;fs()(this,t);for(var i=arguments.length,a=Array(i),c=0;c<i;c++)a[c]=arguments[c];return n=r=ms()(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(a))),r.onRemove=function(e){var t=r.props;(0,t.onRemove)(e,t.value),e.stopPropagation()},o=n,ms()(r,o)}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e=this.props,t=e.prefixCls,n=e.maxTagTextLength,r=e.label,o=e.value,i=e.onRemove,a=e.removeIcon,c=r||o;return n&&"string"==typeof c&&c.length>n&&(c=c.slice(0,n)+"..."),Ss.a.createElement("li",us()({style:Ix},Rx,{role:"menuitem",className:t+"-selection__choice",title:gc(r)}),i&&Ss.a.createElement("span",{className:t+"-selection__choice__remove",onClick:this.onRemove},"function"==typeof a?Ss.a.createElement(a,us()({},this.props)):a),Ss.a.createElement("span",{className:t+"-selection__choice__content"},c))}}]),t}(Ss.a.Component);oM.propTypes={prefixCls:ks.a.string,maxTagTextLength:ks.a.number,onRemove:ks.a.func,label:ks.a.node,value:ks.a.oneOfType([ks.a.string,ks.a.number]),removeIcon:ks.a.oneOfType([ks.a.node,ks.a.func])};var iM=oM,aM=Yx("multiple"),cM={onMultipleSelectorRemove:ks.a.func.isRequired},sM=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return e.onPlaceholderClick=function(){e.inputRef.current.focus()},e.focus=function(){e.inputRef.current.focus()},e.blur=function(){e.inputRef.current.blur()},e.renderPlaceholder=function(){var t=e.props,n=t.prefixCls,r=t.placeholder,o=t.searchPlaceholder,i=t.searchValue,a=t.selectorValueList,c=r||o;if(!c)return null;var s=i||a.length;return Ss.a.createElement("span",{style:{display:s?"none":"block"},onClick:e.onPlaceholderClick,className:n+"-search__field__placeholder"},c)},e.renderSelection=function(){var t=e.props,n=t.selectorValueList,r=t.choiceTransitionName,o=t.prefixCls,i=t.onChoiceAnimationLeave,a=t.labelInValue,c=t.maxTagCount,s=t.maxTagPlaceholder,l=e.context.rcTreeSelect.onMultipleSelectorRemove,u=n;c>=0&&(u=n.slice(0,c));var p=u.map(function(t){var n=t.label,r=t.value;return Ss.a.createElement(iM,us()({},e.props,{key:r,label:n,value:r,onRemove:l}))});if(c>=0&&c<n.length){var f="+ "+(n.length-c)+" ...";if("string"==typeof s)f=s;else if("function"==typeof s){var h=n.slice(c);f=s(a?h:h.map(function(e){return e.value}))}var d=Ss.a.createElement(iM,us()({},e.props,{key:"rc-tree-select-internal-max-tag-counter",label:f,value:null}));p.push(d)}p.push(Ss.a.createElement("li",{className:o+"-search "+o+"-search--inline",key:"__input"},Ss.a.createElement(rM,us()({},e.props,{ref:e.inputRef,needAlign:!0}))));var v=o+"-selection__rendered";return r?Ss.a.createElement(nx,{className:v,component:"ul",transitionName:r,onLeave:i},p):Ss.a.createElement("ul",{className:v,role:"menubar"},p)},e.inputRef=Cc(),e}return gs()(t,e),ds()(t,[{key:"render",value:function(){return Ss.a.createElement(aM,us()({},this.props,{tabIndex:-1,showArrow:!1,renderSelection:this.renderSelection,renderPlaceholder:this.renderPlaceholder}))}}]),t}(Ss.a.Component);sM.propTypes=us()({},Ux,{selectorValueList:ks.a.array,disabled:ks.a.bool,searchValue:ks.a.string,labelInValue:ks.a.bool,maxTagCount:ks.a.number,maxTagPlaceholder:ks.a.oneOfType([ks.a.node,ks.a.func]),onChoiceAnimationLeave:ks.a.func}),sM.contextTypes={rcTreeSelect:ks.a.shape(us()({},cM,{onSearchInputChange:ks.a.func}))};var lM=sM,uM=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this));return e.onPlaceholderClick=function(){e.inputRef.current.focus()},e.renderPlaceholder=function(){var t=e.props,n=t.searchPlaceholder,r=t.searchValue,o=t.prefixCls;return n?Ss.a.createElement("span",{style:{display:r?"none":"block"},onClick:e.onPlaceholderClick,className:o+"-search__field__placeholder"},n):null},e.renderSearch=function(){var t=e.props,n=t.showSearch,r=t.dropdownPrefixCls;return n?Ss.a.createElement("span",{className:r+"-search"},Ss.a.createElement(rM,us()({},e.props,{ref:e.inputRef,renderPlaceholder:e.renderPlaceholder}))):null},e.inputRef=Cc(),e}return gs()(t,e),ds()(t,[{key:"render",value:function(){return Ss.a.createElement(Jx,us()({},this.props,{renderSearch:this.renderSearch}))}}]),t}(Ss.a.Component);uM.propTypes=us()({},Jx.propTypes,{searchValue:ks.a.string,showSearch:ks.a.bool,dropdownPrefixCls:ks.a.string,disabled:ks.a.bool,searchPlaceholder:ks.a.string});var pM=uM,fM=Jx,hM=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));dM.call(n);var r=e.prefixAria,o=e.defaultOpen,i=e.open;return n.state={open:i||o,valueList:[],missValueList:[],selectorValueList:[],valueEntities:{},keyEntities:{},searchValue:"",init:!0},n.selectorRef=Cc(),n.selectTriggerRef=Cc(),n.ariaId=Sc(r+"-list"),n}return gs()(t,e),ds()(t,[{key:"getChildContext",value:function(){return{rcTreeSelect:{onSelectorFocus:this.onSelectorFocus,onSelectorBlur:this.onSelectorBlur,onSelectorKeyDown:this.onComponentKeyDown,onSelectorClear:this.onSelectorClear,onMultipleSelectorRemove:this.onMultipleSelectorRemove,onTreeNodeSelect:this.onTreeNodeSelect,onTreeNodeCheck:this.onTreeNodeCheck,onPopupKeyDown:this.onComponentKeyDown,onSearchInputChange:this.onSearchInputChange,onSearchInputKeyDown:this.onSearchInputKeyDown}}}},{key:"componentDidMount",value:function(){var e=this.props,t=e.autoFocus,n=e.disabled;t&&!n&&this.focus()}},{key:"componentDidUpdate",value:function(e,t){t.valueList!==this.state.valueList&&this.forcePopupAlign()}},{key:"focus",value:function(){this.selectorRef.current.focus()}},{key:"blur",value:function(){this.selectorRef.current.blur()}},{key:"render",value:function(){var e=this.state,t=e.valueList,n=e.missValueList,r=e.selectorValueList,o=e.valueEntities,i=e.keyEntities,a=e.searchValue,c=e.open,s=e.focused,l=e.treeNodes,u=e.filteredTreeNodes,p=this.props.prefixCls,f=this.isMultiple(),h=us()({},this.props,{isMultiple:f,valueList:t,selectorValueList:[].concat(Ls()(n),Ls()(r)),valueEntities:o,keyEntities:i,searchValue:a,upperSearchValue:(a||"").toUpperCase(),open:c,focused:s,dropdownPrefixCls:p+"-dropdown",ariaId:this.ariaId}),d=f?fM:pM,v=Ss.a.createElement(d,us()({},h,{onTreeExpanded:this.delayForcePopupAlign,treeNodes:l,filteredTreeNodes:u})),m=f?lM:eM,y=Ss.a.createElement(m,us()({},h,{ref:this.selectorRef}));return Ss.a.createElement(Wx,us()({},h,{ref:this.selectTriggerRef,popupElement:v,onKeyDown:this.onKeyDown,onDropdownVisibleChange:this.onDropdownVisibleChange}),y)}}],[{key:"getDerivedStateFromProps",value:function(e,t){function n(t,n){return o[t]!==e[t]&&(n(e[t],o[t]),!0)}var r=t.prevProps,o=void 0===r?{}:r,i=e.treeCheckable,a=e.treeCheckStrictly,c=e.filterTreeNode,s=e.treeNodeFilterProp,l=e.treeDataSimpleMode,u={prevProps:e,init:!1},p=!1;n("open",function(e){u.open=e});var f=void 0,h=!1,d=!1;if(n("treeData",function(e){f=Vc(e),h=!0}),n("treeDataSimpleMode",function(e,t){if(e){var n=t&&!0!==t?t:{};Vs()(e,n)||(d=!0)}}),l&&(h||d)){var v=us()({id:"id",pId:"pId",rootPId:null},!0!==l?l:{});f=Vc(Mc(e.treeData,v))}if(e.treeData||n("children",function(e){f=Array.isArray(e)?e:[e]}),f){var m=Lc(f);u.treeNodes=f,u.posEntities=m.posEntities,u.valueEntities=m.valueEntities,u.keyEntities=m.keyEntities,p=!0}if(t.init&&n("defaultValue",function(t){u.valueList=Oc(t,e),p=!0}),n("value",function(t){u.valueList=Oc(t,e),p=!0}),p){var y=[],g=[],b=[],C=u.valueList;if(C||(C=[].concat(Ls()(t.valueList),Ls()(t.missValueList))),C.forEach(function(e){var n=e.value,r=(u.valueEntities||t.valueEntities)[n];if(r)return b.push(r.key),void g.push(e);y.push(e)}),i&&!a){var w=Fx(b,!0,u.keyEntities||t.keyEntities),S=w.checkedKeys;u.valueList=S.map(function(e){return{value:(u.keyEntities||t.keyEntities)[e].value}})}else u.valueList=g;u.missValueList=y,u.selectorValueList=Tc(u.valueList,e,u.valueEntities||t.valueEntities)}if(n("inputValue",function(e){null!==e&&(u.searchValue=e)}),n("searchValue",function(e){u.searchValue=e}),void 0!==u.searchValue||t.searchValue&&f){var x=void 0!==u.searchValue?u.searchValue:t.searchValue,M=String(x).toUpperCase(),z=c;!1===c?z=function(){return!0}:"function"!=typeof z&&(z=function(e,t){return-1!==String(t.props[s]).toUpperCase().indexOf(M)}),u.filteredTreeNodes=_c(u.treeNodes||t.treeNodes,x,z,u.valueEntities||t.valueEntities)}return n("showCheckedStrategy",function(){u.selectorValueList=u.selectorValueList||Tc(u.valueList||t.valueList,e,u.valueEntities||t.valueEntities)}),u}}]),t}(Ss.a.Component);hM.propTypes={prefixCls:ks.a.string,prefixAria:ks.a.string,multiple:ks.a.bool,showArrow:ks.a.bool,open:ks.a.bool,value:yc,autoFocus:ks.a.bool,defaultOpen:ks.a.bool,defaultValue:yc,showSearch:ks.a.bool,placeholder:ks.a.node,inputValue:ks.a.string,searchValue:ks.a.string,autoClearSearchValue:ks.a.bool,searchPlaceholder:ks.a.node,disabled:ks.a.bool,children:ks.a.node,labelInValue:ks.a.bool,maxTagCount:ks.a.number,maxTagPlaceholder:ks.a.oneOfType([ks.a.node,ks.a.func]),maxTagTextLength:ks.a.number,showCheckedStrategy:ks.a.oneOf(["SHOW_ALL",Lx,Dx]),dropdownMatchSelectWidth:ks.a.bool,treeData:ks.a.array,treeDataSimpleMode:ks.a.oneOfType([ks.a.bool,ks.a.object]),treeNodeFilterProp:ks.a.string,treeNodeLabelProp:ks.a.string,treeCheckable:ks.a.oneOfType([ks.a.bool,ks.a.node]),treeCheckStrictly:ks.a.bool,treeIcon:ks.a.bool,treeLine:ks.a.bool,treeDefaultExpandAll:ks.a.bool,treeDefaultExpandedKeys:ks.a.array,loadData:ks.a.func,filterTreeNode:ks.a.oneOfType([ks.a.func,ks.a.bool]),notFoundContent:ks.a.string,onSearch:ks.a.func,onSelect:ks.a.func,onDeselect:ks.a.func,onChange:ks.a.func,onDropdownVisibleChange:ks.a.func,inputIcon:ks.a.oneOfType([ks.a.node,ks.a.func]),clearIcon:ks.a.oneOfType([ks.a.node,ks.a.func]),removeIcon:ks.a.oneOfType([ks.a.node,ks.a.func]),switcherIcon:ks.a.oneOfType([ks.a.node,ks.a.func])},hM.childContextTypes={rcTreeSelect:ks.a.shape(us()({},qx,cM,Gx,{onSearchInputChange:ks.a.func,onSearchInputKeyDown:ks.a.func}))},hM.defaultProps={prefixCls:"rc-tree-select",prefixAria:"rc-tree-select",showArrow:!0,showSearch:!0,autoClearSearchValue:!0,showCheckedStrategy:Dx,treeNodeFilterProp:"value",treeNodeLabelProp:"title",treeIcon:!1,notFoundContent:"Not Found"};var dM=function(){var e=this;this.onSelectorFocus=function(){e.setState({focused:!0})},this.onSelectorBlur=function(){e.setState({focused:!1})},this.onComponentKeyDown=function(t){var n=e.state.open,r=t.keyCode;n?Xs.ESC===r?e.setOpenState(!1):-1!==[Xs.UP,Xs.DOWN,Xs.LEFT,Xs.RIGHT].indexOf(r)&&t.stopPropagation():-1!==[Xs.ENTER,Xs.DOWN].indexOf(r)&&e.setOpenState(!0)},this.onDeselect=function(t,n,r){var o=e.props.onDeselect;o&&o(t,n,r)},this.onSelectorClear=function(t){e.props.disabled||(e.triggerChange([],[]),e.isSearchValueControlled()||e.setUncontrolledState({searchValue:"",filteredTreeNodes:null}),t.stopPropagation())},this.onMultipleSelectorRemove=function(t,n){t.stopPropagation();var r=e.state,o=r.valueList,i=r.missValueList,a=r.valueEntities,c=e.props,s=c.treeCheckable,l=c.treeCheckStrictly,u=c.treeNodeLabelProp;if(!c.disabled){var p=a[n],f=o;p&&(f=s&&!l?o.filter(function(e){var t=e.value;return!zc(a[t].pos,p.pos)}):o.filter(function(e){return e.value!==n}));var h=p?p.node:null,d={triggerValue:n,triggerNode:h},v={node:h};if(s){var m=f.map(function(e){var t=e.value;return a[t]});v.event="check",v.checked=!1,v.checkedNodes=m.map(function(e){return e.node}),v.checkedNodesPositions=m.map(function(e){return{node:e.node,pos:e.pos}}),d.allCheckedNodes=l?v.checkedNodes:wc(m).map(function(e){return e.node})}else v.event="select",v.selected=!1,v.selectedNodes=f.map(function(e){var t=e.value;return(a[t]||{}).node});var y=i.filter(function(e){return e.value!==n}),g=void 0;g=e.isLabelInValue()?{label:h?h.props[u]:null,value:n}:n,e.onDeselect(g,h,v),e.triggerChange(y,f,d)}},this.onValueTrigger=function(t,n,r,o){var i=r.node,a=i.props.value,c=e.state,s=c.missValueList,l=c.valueEntities,u=c.keyEntities,p=e.props,f=p.disabled,h=p.inputValue,d=p.treeNodeLabelProp,v=p.onSelect,m=p.treeCheckable,y=p.treeCheckStrictly,g=p.autoClearSearchValue,b=i.props[d];if(!f){var C=void 0;C=e.isLabelInValue()?{value:a,label:b}:a,t?v&&v(C,i,r):e.onDeselect(C,i,r);var w=n.map(function(e){var t=e.props;return{value:t.value,label:t[d]}});if(m&&!y){var S=w.map(function(e){var t=e.value;return l[t].key});S=t?Fx(S,!0,u).checkedKeys:Fx([l[a].key],!1,u,{checkedKeys:S}).checkedKeys,w=S.map(function(e){var t=u[e].node.props;return{value:t.value,label:t[d]}})}e.isSearchValueControlled()||!g&&null!==h||e.setUncontrolledState({searchValue:"",filteredTreeNodes:null});var x=us()({},o,{triggerValue:a,triggerNode:i});e.triggerChange(s,w,x)}},this.onTreeNodeSelect=function(t,n){var r=e.state,o=r.valueList,i=r.valueEntities,a=e.props,c=a.treeCheckable,s=a.multiple;if(!c){s||e.setOpenState(!1);var l=n.selected,u=n.node.props.value,p=o.filter(function(e){return e.value!==u});l&&p.push({value:u});var f=p.map(function(e){var t=e.value;return i[t]}).filter(function(e){return e}).map(function(e){return e.node});e.onValueTrigger(l,f,n,{selected:l})}},this.onTreeNodeCheck=function(t,n){var r=e.state,o=r.searchValue,i=r.keyEntities,a=r.valueEntities,c=r.valueList,s=e.props.treeCheckStrictly,l=n.checkedNodes,u=n.checkedNodesPositions,p=n.checked,f={checked:p},h=l;if(s)f.allCheckedNodes=n.checkedNodes;else if(o){var d=c.map(function(e){var t=e.value;return a[t]}).filter(function(e){return e}).map(function(e){return e.key}),v=void 0;v=p?Array.from(new Set([].concat(Ls()(d),Ls()(h.map(function(e){var t=e.props.value;return a[t].key}))))):Fx([n.node.props.eventKey],!1,i,{checkedKeys:d}).checkedKeys,h=v.map(function(e){return i[e].node}),f.allCheckedNodes=v.map(function(e){return kc(i[e])})}else f.allCheckedNodes=wc(u);e.onValueTrigger(p,h,n,f)},this.onDropdownVisibleChange=function(t){e.setOpenState(t,!0)},this.onSearchInputChange=function(t){var n=t.target.value,r=e.state,o=r.treeNodes,i=r.valueEntities,a=e.props,c=a.onSearch,s=a.filterTreeNode,l=a.treeNodeFilterProp;c&&c(n);var u=!1;if(e.isSearchValueControlled()||(u=e.setUncontrolledState({searchValue:n}),e.setOpenState(!0)),u){var p=String(n).toUpperCase(),f=s;f||(f=function(e,t){return-1!==String(t.props[l]).toUpperCase().indexOf(p)}),e.setState({filteredTreeNodes:_c(o,n,f,i)})}},this.onSearchInputKeyDown=function(t){var n=e.state,r=n.searchValue,o=n.valueList,i=t.keyCode;if(Xs.BACKSPACE===i&&e.isMultiple()&&!r&&o.length){var a=o[o.length-1].value;e.onMultipleSelectorRemove(t,a)}},this.setUncontrolledState=function(t){var n=!1,r={};return Object.keys(t).forEach(function(o){o in e.props||(n=!0,r[o]=t[o])}),n&&e.setState(r),n},this.setOpenState=function(t){var n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=e.props.onDropdownVisibleChange;r&&!1===r(t,{documentClickClose:!t&&n})||e.setUncontrolledState({open:t})},this.isMultiple=function(){var t=e.props,n=t.multiple,r=t.treeCheckable;return!(!n&&!r)},this.isLabelInValue=function(){return xc(e.props)},this.isSearchValueControlled=function(){var t=e.props.inputValue;return"searchValue"in e.props||"inputValue"in e.props&&null!==t},this.forcePopupAlign=function(){var t=e.selectTriggerRef.current;t&&t.forcePopupAlign()},this.delayForcePopupAlign=function(){As()(function(){As()(e.forcePopupAlign)})},this.triggerChange=function(t,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=e.state.valueEntities,i=e.props,a=i.onChange;if(!i.disabled){var c=us()({preValue:e.state.selectorValueList.map(function(e){return{label:e.label,value:e.value}})},r),s=Tc(n,e.props,o);if("value"in e.props||e.setState({missValueList:t,valueList:n,selectorValueList:s}),a){var l=void 0;l=e.isMultiple()?[].concat(Ls()(t),Ls()(s)):s.slice(0,1);var u=null,p=void 0;e.isLabelInValue()?p=l.map(function(e){return{label:e.label,value:e.value}}):(u=[],p=l.map(function(e){var t=e.label,n=e.value;return u.push(t),n})),e.isMultiple()||(p=p[0]),a(p,u,c)}}}};hM.TreeNode=Hx,hM.SHOW_ALL="SHOW_ALL",hM.SHOW_PARENT=Lx,hM.SHOW_CHILD=Dx,hM.displayName="TreeSelect",Object(Ys.polyfill)(hM);var vM=hM,mM=Hx,yM=vM,gM=(n(417),this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n}),bM=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.saveTreeSelect=function(e){n.rcTreeSelect=e},n.renderSwitcherIcon=function(e){var t=e.isLeaf,r=e.loading,o=n.props.prefixCls;return r?ws.createElement(Kp,{type:"loading",className:o+"-switcher-loading-icon"}):t?null:ws.createElement(Kp,{type:"caret-down",className:o+"-switcher-icon"})},n.renderTreeSelect=function(e){var t,r=n.props,o=r.prefixCls,i=r.className,a=r.size,c=r.notFoundContent,s=r.dropdownStyle,l=r.dropdownClassName,u=gM(r,["prefixCls","className","size","notFoundContent","dropdownStyle","dropdownClassName"]),p=Ts()((t={},ss()(t,o+"-lg","large"===a),ss()(t,o+"-sm","small"===a),t),i),f=u.treeCheckable;f&&(f=ws.createElement("span",{className:o+"-tree-checkbox-inner"}));var h=ws.createElement(Kp,{type:"down",className:o+"-arrow-icon"}),d=ws.createElement(Kp,{type:"close",className:o+"-remove-icon"}),v=ws.createElement(Kp,{type:"close-circle",className:o+"-clear-icon",theme:"filled"});return ws.createElement(yM,us()({},u,{dropdownClassName:Ts()(l,o+"-tree-dropdown"),prefixCls:o,className:p,dropdownStyle:us()({maxHeight:"100vh",overflow:"auto"},s),treeCheckable:f,notFoundContent:c||e.notFoundContent,ref:n.saveTreeSelect,switcherIcon:n.renderSwitcherIcon,inputIcon:h,removeIcon:d,clearIcon:v}))},Pp(!1!==e.multiple||!e.treeCheckable,"`multiple` will alway be `true` when `treeCheckable` is true"),n}return gs()(t,e),ds()(t,[{key:"focus",value:function(){this.rcTreeSelect.focus()}},{key:"blur",value:function(){this.rcTreeSelect.blur()}},{key:"render",value:function(){return ws.createElement(xp,{componentName:"Select",defaultLocale:{}},this.renderTreeSelect)}}]),t}(ws.Component),CM=bM;bM.TreeNode=mM,bM.SHOW_ALL="SHOW_ALL",bM.SHOW_PARENT=Lx,bM.SHOW_CHILD=Dx,bM.defaultProps={prefixCls:"ant-select",transitionName:"slide-up",choiceTransitionName:"zoom",showSearch:!1};var wM=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},SM=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e,t,n=this.props,r=n.prefixCls,o=n.className,i=n.color,a=void 0===i?"":i,c=n.children,s=n.pending,l=n.dot,u=wM(n,["prefixCls","className","color","children","pending","dot"]),p=Ts()((e={},ss()(e,r+"-item",!0),ss()(e,r+"-item-pending",s),e),o),f=Ts()((t={},ss()(t,r+"-item-head",!0),ss()(t,r+"-item-head-custom",l),ss()(t,r+"-item-head-"+a,!0),t));return ws.createElement("li",us()({},u,{className:p}),ws.createElement("div",{className:r+"-item-tail"}),ws.createElement("div",{className:f,style:{borderColor:/blue|red|green/.test(a)?void 0:a}},l),ws.createElement("div",{className:r+"-item-content"},c))}}]),t}(ws.Component),xM=SM;SM.defaultProps={prefixCls:"ant-timeline",color:"blue",pending:!1};var MM=this&&this.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols)for(var o=0,r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&(n[r[o]]=e[r[o]]);return n},zM=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e,t=this.props,n=t.prefixCls,r=t.pending,o=void 0===r?null:r,i=t.pendingDot,a=t.children,c=t.className,s=t.reverse,l=t.mode,u=MM(t,["prefixCls","pending","pendingDot","children","className","reverse","mode"]),p="boolean"==typeof o?null:o,f=Ts()(n,(e={},ss()(e,n+"-pending",!!o),ss()(e,n+"-reverse",!!s),ss()(e,n+"-"+l,!!l),e),c),h=o?ws.createElement(xM,{pending:!!o,dot:i||ws.createElement(Kp,{type:"loading"})},p):null,d=s?[h].concat(Ls()(ws.Children.toArray(a).reverse())):[].concat(Ls()(ws.Children.toArray(a)),[h]),v=d.filter(function(e){return!!e}),m=ws.Children.count(v),y=n+"-item-last",g=ws.Children.map(v,function(e,t){return ws.cloneElement(e,{className:Ts()([e.props.className,!s&&o?t===m-2?y:"":t===m-1?y:"","alternate"===l?t%2==0?n+"-item-left":n+"-item-right":"right"===l?n+"-item-right":""])})});return ws.createElement("ul",us()({},u,{className:f}),g)}}]),t}(ws.Component),kM=zM;zM.Item=xM,zM.defaultProps={prefixCls:"ant-timeline",reverse:!1,mode:""};var _M=kM,OM=n(41),EM=n(506),TM=EM.a.GetText,NM=EM.a.GetHTML,VM=EM.a.ToEditorState,PM=(EM.a,n(68)),HM=function(e){function t(){return fs()(this,t),ms()(this,e.apply(this,arguments))}return gs()(t,e),t.prototype.render=function(){var e=this.props;return Ss.a.createElement("div",e)},t}(ws.Component),LM=HM,DM=!!xs.createPortal,AM=function(e){function t(){return fs()(this,t),ms()(this,e.apply(this,arguments))}return gs()(t,e),t.prototype.componentDidMount=function(){this.renderOrReady()},t.prototype.componentDidUpdate=function(){this.renderOrReady()},t.prototype.renderOrReady=function(){DM?this.props.renderReady():this.renderComponent()},t.prototype.renderComponent=function(){var e=this.props,t=e.children,n=e.container,r=e.renderReady;Object(xs.unstable_renderSubtreeIntoContainer)(this,t,n,function(){r&&r.call(this)})},t.prototype.render=function(){if(DM){var e=this.props,t=e.children,n=e.container;return Object(xs.createPortal)(t,n)}return null},t}(Ss.a.Component),IM=AM;AM.propTypes={children:ks.a.any,renderReady:ks.a.func,container:ks.a.any};var RM=function(e){return!1!==e},jM=function(e){function t(){fs()(this,t);var n=ms()(this,e.call(this));return n.onEditorStateChange=function(e){var t=n.props.store.getOffset();if(0===t.size)return n.closeDropDown(),e;var r=e.getSelection();if(!n.props.callbacks.getEditorState().getSelection().getHasFocus()&&r.getHasFocus())return e;var o=Ac(e,r),i=o.word;if(!i)return n.closeDropDown(),e;var a=t.map(function(t){var n=t.offsetKey,o=Object(PM.decode)(n),a=o.blockKey,c=o.decoratorKey,s=o.leafKey;if(a!==r.anchorKey)return!1;var l=e.getBlockTree(a).getIn([c,"leaves",s]);if(!l)return!1;var u=l.get("start"),p=l.get("end");return!!i&&(u===p-1?r.anchorOffset>=u+1&&r.anchorOffset<=p&&n:r.anchorOffset>u+1&&r.anchorOffset<=p&&n)}),c=a.some(RM);n.activeOffsetKey=a.find(RM);var s=n.props.store.getTrigger(n.activeOffsetKey);if(!c||!r.getHasFocus())return n.closeDropDown(),e;var l=i.substring(s.length,i.length);return n.lastSearchValue===l&&n.lastTrigger===s||(n.lastSearchValue=l,n.lastTrigger=s,n.props.onSearchChange(l,s)),n.state.active||s&&-1===i.indexOf(s)||n.openDropDown(),e},n.onUpArrow=function(e){if(e.preventDefault(),n.props.suggestions.length>0){var t=n.state.focusedIndex-1;n.setState({focusedIndex:Math.max(t,0)})}},n.onBlur=function(e){e.preventDefault(),n.closeDropDown()},n.onDownArrow=function(e){e.preventDefault();var t=n.state.focusedIndex+1;n.setState({focusedIndex:t>=n.props.suggestions.length?0:t})},n.getContainer=function(){var e=document.createElement("div"),t=void 0;return n.props.getSuggestionContainer?(t=n.props.getSuggestionContainer(),e.style.position="relative"):t=document.body,t.appendChild(e),e},n.handleKeyBinding=function(e){return"split-block"===e},n.handleReturn=function(e){e.preventDefault();var t=n.props.suggestions[n.state.focusedIndex];return!!t&&(Ss.a.isValidElement(t)?n.onMentionSelect(t.props.value,t.props.data):n.onMentionSelect(t),n.lastSearchValue=null,n.lastTrigger=null,!0)},n.renderReady=function(){var e=n.dropdownContainer;if(e){var t=n.state.active,r=n.activeOffsetKey,o=n.props.store.getOffset(),i=o.get(r);if(t&&i){var a=n.props.placement,c=n.getPositionStyle(!0,i.position()),s=parseFloat(c.top)-window.scrollY-e.offsetHeight<0,l=(window.innerHeight||document.documentElement.clientHeight)-(parseFloat(c.top)-window.scrollY)-e.offsetHeight<0;"top"!==a||s||(c.top=(parseFloat(c.top)-e.offsetHeight||0)+"px"),"bottom"===a&&l&&!s&&(c.top=(parseFloat(c.top)-e.offsetHeight||0)+"px"),Object.keys(c).forEach(function(t){e.style[t]=c[t]})}n.focusItem&&Gu()(Ms.a.findDOMNode(n.focusItem),e,{onlyScrollIfNeeded:!0})}},n.getNavigations=function(){var e=n.props,t=e.prefixCls,r=e.suggestions,o=n.state.focusedIndex;return r.length?Ss.a.Children.map(r,function(e,r){var i=r===o,a=i?function(e){n.focusItem=e}:null,c=Ts()(t+"-dropdown-item",{focus:i});return Ss.a.isValidElement(e)?Ss.a.cloneElement(e,{className:c,onMouseDown:function(){return n.onMentionSelect(e.props.value,e.props.data)},ref:a}):Ss.a.createElement(LM,{ref:a,className:c,onMouseDown:function(){return n.onMentionSelect(e)}},e)},n):Ss.a.createElement("div",{className:t+"-dropdown-notfound "+t+"-dropdown-item"},n.props.notFoundContent)},n.state={isActive:!1,focusedIndex:0,container:!1},n}return gs()(t,e),t.prototype.componentDidMount=function(){this.props.callbacks.onChange=this.onEditorStateChange},t.prototype.componentWillReceiveProps=function(e){e.suggestions.length!==this.props.suggestions.length&&this.setState({focusedIndex:0})},t.prototype.onMentionSelect=function(e,t){var n=this.props.callbacks.getEditorState(),r=this.props,o=r.store,i=r.onSelect,a=o.getTrigger(this.activeOffsetKey);if(i&&i(e,t||e),this.props.noRedup){if(-1!==Kc(n.getCurrentContent(),a).indexOf(""+a+e))return console.warn("you have specified `noRedup` props but have duplicated mentions."),this.closeDropDown(),void this.props.callbacks.setEditorState(Rc(n))}this.props.callbacks.setEditorState(Ic(n,""+a+e,t,this.props.mode),!0),this.closeDropDown()},t.prototype.getPositionStyle=function(e,t){if(this.props.getSuggestionStyle)return this.props.getSuggestionStyle(e,t);var n=this.props.getSuggestionContainer?this.state.container:document.body,r=jc(n);return t?us()({position:"absolute",left:t.left-r.left+"px",top:t.top-r.top+"px"},this.props.style):{}},t.prototype.openDropDown=function(){this.props.callbacks.onUpArrow=this.onUpArrow,this.props.callbacks.handleReturn=this.handleReturn,this.props.callbacks.handleKeyBinding=this.handleKeyBinding,this.props.callbacks.onDownArrow=this.onDownArrow,this.props.callbacks.onBlur=this.onBlur,this.setState({active:!0,container:this.state.container||this.getContainer()})},t.prototype.closeDropDown=function(){this.props.callbacks.onUpArrow=null,this.props.callbacks.handleReturn=null,this.props.callbacks.handleKeyBinding=null,this.props.callbacks.onDownArrow=null,this.props.callbacks.onBlur=null,this.setState({active:!1})},t.prototype.render=function(){var e,t=this,n=this.props,r=n.prefixCls,o=n.className,i=n.placement,a=this.state,c=a.container,s=a.active,l=Ts()(us()((e={},e[r+"-dropdown"]=!0,e[r+"-dropdown-placement-"+i]=!0,e),o)),u="top"===i?"slide-down":"slide-up",p=this.getNavigations();return c?Ss.a.createElement(IM,{renderReady:this.renderReady,container:c},Ss.a.createElement(Ml,{transitionName:u},s?Ss.a.createElement("div",{className:l,ref:function(e){t.dropdownContainer=e}},p):null)):null},t}(Ss.a.Component),FM=jM;jM.propTypes={callbacks:ks.a.object,suggestions:ks.a.array,store:ks.a.object,onSearchChange:ks.a.func,prefixCls:ks.a.string,mode:ks.a.string,style:ks.a.object,onSelect:ks.a.func,getSuggestionContainer:ks.a.func,notFoundContent:ks.a.any,getSuggestionStyle:ks.a.func,className:ks.a.string,noRedup:ks.a.bool,placement:ks.a.string};var KM=function(e){function t(){var n,r,o;fs()(this,t);for(var i=arguments.length,a=Array(i),c=0;c<i;c++)a[c]=arguments[c];return n=r=ms()(this,e.call.apply(e,[this].concat(a))),r.matchDecorates=function(e){var t=e.callbacks,n=e.suggestionRegex,o=e.decoratedText,i=n.exec(o);r.trigger=i[2],r.updatePortalPosition(r.props),t.setEditorState(t.getEditorState())},o=n,ms()(r,o)}return gs()(t,e),t.prototype.componentWillMount=function(){this.matchDecorates(this.props)},t.prototype.componentWillReceiveProps=function(e){e.decoratedText!==this.props.decoratedText&&this.matchDecorates(e),this.updatePortalPosition(e)},t.prototype.componentWillUnmount=function(){var e=this.props,t=e.offsetKey;e.mentionStore.inActiveSuggestion({offsetKey:t})},t.prototype.updatePortalPosition=function(e){var t=this,n=e.offsetKey;e.mentionStore.updateSuggestion({offsetKey:n,trigger:this.trigger,position:function(){var e=t.searchPortal,n=jc(e);return{left:n.left,top:n.top,width:e.offsetWidth,height:e.offsetHeight}}})},t.prototype.render=function(){var e=this;return Ss.a.createElement("span",{ref:function(t){e.searchPortal=t},style:this.props.style},this.props.children)},t}(Ss.a.Component);KM.propTypes={offsetKey:ks.a.any,mentionStore:ks.a.object,decoratedText:ks.a.string,children:ks.a.any,callbacks:ks.a.any,suggestionRegex:ks.a.any};var BM=KM,WM=function(e){var t=e.children;return Ss.a.createElement("span",{style:{backgroundColor:"#e6f3ff"}},t)},UM=WM,qM=n(59),YM=Object(qM.Map)(),GM={offset:Object(qM.Map)(),getOffset:function(){return YM},getTrigger:function(e){var t=YM.get(e);return t&&t.trigger},activeSuggestion:function(e){var t=e.offsetKey;YM=YM.set(t,{offsetKey:t})},inActiveSuggestion:function(e){var t=e.offsetKey;YM=YM.delete(t)},updateSuggestion:function(e){var t=e.offsetKey,n=e.position,r=e.trigger;YM=YM.set(t,{offsetKey:t,position:n,trigger:r})}},XM=GM,$M=function(){function e(t,n){fs()(this,e),this.contentState=t,this.options=n}return e.prototype.generate=function(){var e=Object(OM.convertToRaw)(this.contentState);return this.processContent(e)},e.prototype.processContent=function(e){var t=e.blocks,n=this.options.encode;return t.map(function(e){return n?Bc(e.text):e.text}).join(n?"<br />\n":"\n")},e}(),JM=function(e){var t=e.entityKey,n=e.tag,r=e.callbacks,o=r.getEditorState().getCurrentContent(),i=o.getEntity(t).getData();return Ss.a.createElement(n,us()({},e,{data:i}))},ZM=function(e){function t(n){fs()(this,t);var r=ms()(this,e.call(this,n));return r.onEditorChange=function(e){var t=e.getSelection();r._decorator=e.getDecorator();var n=e.getCurrentContent();r.props.onChange?r.setState({selection:t},function(){r.props.onChange(n,Wc(n))}):r.setState({editorState:e,selection:t})},r.onFocus=function(e){r.props.onFocus&&r.props.onFocus(e)},r.onBlur=function(e){r.props.onBlur&&r.props.onBlur(e)},r.reset=function(){r._editor.Reset()},r.mention=Gc({prefix:r.getPrefix(n),tag:n.tag,mode:n.mode,mentionStyle:n.mentionStyle}),r.Suggestions=r.mention.Suggestions,r.plugins=[r.mention],r.state={suggestions:n.suggestions,value:n.value&&OM.EditorState.createWithContent(n.value,new OM.CompositeDecorator(r.mention.decorators)),selection:OM.SelectionState.createEmpty()},"string"==typeof n.defaultValue&&console.warn("The property `defaultValue` now allow `EditorState` only, see http://react-component.github.io/editor-mention/examples/defaultValue.html "),void 0!==n.value&&(r.controlledMode=!0),r}return gs()(t,e),t.prototype.componentWillReceiveProps=function(e){var t=e.suggestions,n=this.state.selection,r=e.value;r&&n&&(r=OM.EditorState.acceptSelection(OM.EditorState.createWithContent(r,this._decorator),n)),this.setState({suggestions:t,value:r})},t.prototype.getPrefix=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.props;return Array.isArray(e.prefix)?e.prefix:[e.prefix]},t.prototype.render=function(){var e,t=this,n=this.props,r=n.prefixCls,o=n.style,i=n.tag,a=n.multiLines,c=n.editorKey,s=n.suggestionStyle,l=n.placeholder,u=n.defaultValue,p=n.className,f=n.notFoundContent,h=n.getSuggestionContainer,d=n.readOnly,v=n.disabled,m=n.placement,y=this.state.suggestions,g=this.Suggestions,b=Ts()(p,(e={},e[r+"-wrapper"]=!0,e.readonly=d,e.disabled=v,e.multilines=a,e)),C=this.controlledMode?{value:this.state.value}:{},w=u&&OM.EditorState.createWithContent("string"==typeof u?OM.ContentState.createFromText(u):u,this._decorator);return Ss.a.createElement("div",{className:b,style:o,ref:function(e){return t._wrapper=e}},Ss.a.createElement(EM.a,us()({ref:function(e){return t._editor=e},prefixCls:r,style:o,multiLines:a,editorKey:c,plugins:this.plugins,defaultValue:w,placeholder:l,onFocus:this.onFocus,onBlur:this.onBlur,onChange:this.onEditorChange},C,{readOnly:d||v}),Ss.a.createElement(g,{mode:i?"immutable":"mutable",prefix:this.getPrefix(),prefixCls:r,style:s,placement:m,notFoundContent:f,suggestions:y,getSuggestionContainer:h?function(){return h(t._wrapper)}:null,onSearchChange:this.props.onSearchChange,onSelect:this.props.onSelect,noRedup:this.props.noRedup})))},t}(Ss.a.Component);ZM.propTypes={value:ks.a.object,suggestions:ks.a.array,prefix:ks.a.oneOfType([ks.a.string,ks.a.arrayOf(ks.a.string)]),prefixCls:ks.a.string,tag:ks.a.element,style:ks.a.object,className:ks.a.string,onSearchChange:ks.a.func,onChange:ks.a.func,mode:ks.a.string,multiLines:ks.a.bool,suggestionStyle:ks.a.object,placeholder:ks.a.string,defaultValue:ks.a.object,notFoundContent:ks.a.any,position:ks.a.string,onFocus:ks.a.func,onBlur:ks.a.func,onSelect:ks.a.func,getSuggestionContainer:ks.a.func,noRedup:ks.a.bool,mentionStyle:ks.a.object,placement:ks.a.string,editorKey:ks.a.string},ZM.controlledMode=!1,ZM.defaultProps={prefixCls:"rc-editor-mention",prefix:"@",mode:"immutable",suggestions:[],multiLines:!1,className:"",suggestionStyle:{},notFoundContent:"\u65e0\u6cd5\u627e\u5230",position:"absolute",placement:"bottom",mentionStyle:{}};var QM=ZM;QM.Nav=LM,QM.toString=Wc,QM.toEditorState=Xc,QM.getMentions=Kc;var ez=QM,tz=function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.onSearchChange=function(e,t){return n.props.onSearchChange?n.props.onSearchChange(e,t):n.defaultSearchChange(e)},n.onChange=function(e){n.props.onChange&&n.props.onChange(e)},n.onFocus=function(e){n.setState({focus:!0}),n.props.onFocus&&n.props.onFocus(e)},n.onBlur=function(e){n.setState({focus:!1}),n.props.onBlur&&n.props.onBlur(e)},n.focus=function(){n.mentionEle._editor.focusEditor()},n.mentionRef=function(e){n.mentionEle=e},n.state={suggestions:e.suggestions,focus:!1},n}return gs()(t,e),ds()(t,[{key:"componentWillReceiveProps",value:function(e){var t=e.suggestions;Vs()(t,this.props.suggestions)||this.setState({suggestions:t})}},{key:"defaultSearchChange",value:function(e){var t=e.toLowerCase(),n=(this.props.suggestions||[]).filter(function(e){return e.type&&e.type===LM?!e.props.value||-1!==e.props.value.toLowerCase().indexOf(t):-1!==e.toLowerCase().indexOf(t)});this.setState({suggestions:n})}},{key:"render",value:function(){var e,t=this.props,n=t.className,r=void 0===n?"":n,o=t.prefixCls,i=t.loading,a=t.placement,c=this.state,s=c.suggestions,l=c.focus,u=Ts()(r,(e={},ss()(e,o+"-active",l),ss()(e,o+"-placement-top","top"===a),e)),p=i?ws.createElement(Kp,{type:"loading"}):this.props.notFoundContent;return ws.createElement(ez,us()({},this.props,{className:u,ref:this.mentionRef,onSearchChange:this.onSearchChange,onChange:this.onChange,onFocus:this.onFocus,onBlur:this.onBlur,suggestions:s,notFoundContent:p}))}}]),t}(ws.Component),nz=tz;tz.getMentions=Kc,tz.defaultProps={prefixCls:"ant-mention",notFoundContent:"\u65e0\u5339\u914d\u7ed3\u679c\uff0c\u8f7b\u6572\u7a7a\u683c\u5b8c\u6210\u8f93\u5165",loading:!1,multiLines:!1,placement:"bottom"},tz.Nav=LM,tz.toString=Wc,tz.toContentState=Xc;var rz=+new Date,oz=0,iz=function(e,t){if(e&&t){var n=Array.isArray(t)?t:t.split(","),r=e.name||"",o=e.type||"",i=o.replace(/\/.*$/,"");return n.some(function(e){var t=e.trim();return"."===t.charAt(0)?es(r.toLowerCase(),t.toLowerCase()):/\/\*$/.test(t)?i===t.replace(/\/.*$/,""):o===t})}return!0},az=function(e,t,n){var r=!0,o=!1,i=void 0;try{for(var a,c=e[Symbol.iterator]();!(r=(a=c.next()).done);r=!0){var s=a.value;!function e(r,o){if(o=o||"",r.isFile)r.file(function(e){n(e)&&t([e])});else if(r.isDirectory){var i=r.createReader();i.readEntries(function(t){var n=!0,i=!1,a=void 0;try{for(var c,s=t[Symbol.iterator]();!(n=(c=s.next()).done);n=!0){var l=c.value;e(l,""+o+r.name+"/")}}catch(e){i=!0,a=e}finally{try{!n&&s.return&&s.return()}finally{if(i)throw a}}})}}(s.webkitGetAsEntry())}}catch(e){o=!0,i=e}finally{try{!r&&c.return&&c.return()}finally{if(o)throw i}}},cz=az,sz=function(e){function t(){var e,n,r,o;fs()(this,t);for(var i=arguments.length,a=Array(i),c=0;c<i;c++)a[c]=arguments[c];return n=r=ms()(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(a))),r.state={uid:Qc()},r.reqs={},r.onChange=function(e){var t=e.target.files;r.uploadFiles(t),r.reset()},r.onClick=function(){var e=r.fileInput;e&&e.click()},r.onKeyDown=function(e){"Enter"===e.key&&r.onClick()},r.onFileDrop=function(e){if(e.preventDefault(),"dragover"!==e.type)if(r.props.directory)cz(e.dataTransfer.items,r.uploadFiles,function(e){return iz(e,r.props.accept)});else{var t=Array.prototype.slice.call(e.dataTransfer.files).filter(function(e){return iz(e,r.props.accept)});r.uploadFiles(t)}},r.uploadFiles=function(e){var t=Array.prototype.slice.call(e);t.forEach(function(e){e.uid=Qc(),r.upload(e,t)})},r.saveFileInput=function(e){r.fileInput=e},o=n,ms()(r,o)}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){this._isMounted=!0}},{key:"componentWillUnmount",value:function(){this._isMounted=!1,this.abort()}},{key:"upload",value:function(e,t){var n=this,r=this.props;if(!r.beforeUpload)return setTimeout(function(){return n.post(e)},0);var o=r.beforeUpload(e,t);o&&o.then?o.then(function(t){var r=Object.prototype.toString.call(t);return"[object File]"===r||"[object Blob]"===r?n.post(t):n.post(e)}).catch(function(e){console&&console.log(e)}):!1!==o&&setTimeout(function(){return n.post(e)},0)}},{key:"post",value:function(e){var t=this;if(this._isMounted){var n=this.props,r=n.data,o=n.onStart,i=n.onProgress;"function"==typeof r&&(r=r(e)),new Promise(function(t){var r=n.action;if("function"==typeof r)return t(r(e));t(r)}).then(function(a){var c=e.uid,s=n.customRequest||Zc;t.reqs[c]=s({action:a,filename:n.name,file:e,data:r,headers:n.headers,withCredentials:n.withCredentials,onProgress:i?function(t){i(t,e)}:null,onSuccess:function(r,o){delete t.reqs[c],n.onSuccess(r,e,o)},onError:function(r,o){delete t.reqs[c],n.onError(r,o,e)}}),o(e)})}}},{key:"reset",value:function(){this.setState({uid:Qc()})}},{key:"abort",value:function(e){var t=this.reqs;if(e){var n=e;e&&e.uid&&(n=e.uid),t[n]&&(t[n].abort(),delete t[n])}else Object.keys(t).forEach(function(e){t[e]&&t[e].abort(),delete t[e]})}},{key:"render",value:function(){var e,t=this.props,n=t.component,r=t.prefixCls,o=t.className,i=t.disabled,a=t.style,c=t.multiple,s=t.accept,l=t.children,u=t.directory,p=Ts()((e={},ss()(e,r,!0),ss()(e,r+"-disabled",i),ss()(e,o,o),e)),f=i?{}:{onClick:this.onClick,onKeyDown:this.onKeyDown,onDrop:this.onFileDrop,onDragOver:this.onFileDrop,tabIndex:"0"};return Ss.a.createElement(n,us()({},f,{className:p,role:"button",style:a}),Ss.a.createElement("input",{type:"file",ref:this.saveFileInput,key:this.state.uid,style:{display:"none"},accept:s,directory:u?"directory":null,webkitdirectory:u?"webkitdirectory":null,multiple:c,onChange:this.onChange}),l)}}]),t}(ws.Component);sz.propTypes={component:ks.a.string,style:ks.a.object,prefixCls:ks.a.string,className:ks.a.string,multiple:ks.a.bool,directory:ks.a.bool,disabled:ks.a.bool,accept:ks.a.string,children:ks.a.any,onStart:ks.a.func,data:ks.a.oneOfType([ks.a.object,ks.a.func]),action:ks.a.oneOfType([ks.a.string,ks.a.func]),headers:ks.a.object,beforeUpload:ks.a.func,customRequest:ks.a.func,onProgress:ks.a.func,withCredentials:ks.a.bool};var lz=sz,uz=n(526),pz=n.n(uz),fz={position:"absolute",top:0,opacity:0,filter:"alpha(opacity=0)",left:0,zIndex:9999},hz=function(e){function t(){var e,n,r,o;fs()(this,t);for(var i=arguments.length,a=Array(i),c=0;c<i;c++)a[c]=arguments[c];return n=r=ms()(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(a))),r.state={uploading:!1},r.file={},r.onLoad=function(){if(r.state.uploading){var e=r,t=e.props,n=e.file,o=void 0;try{var i=r.getIframeDocument(),a=i.getElementsByTagName("script")[0];a&&a.parentNode===i.body&&i.body.removeChild(a),o=i.body.innerHTML,t.onSuccess(o,n)}catch(e){pz()(!1,"cross domain error for Upload. Maybe server should return document.domain script. see Note from https://github.com/react-component/upload"),o="cross-domain",t.onError(e,null,n)}r.endUpload()}},r.onChange=function(){var e=r.getFormInputNode(),t=r.file={uid:Qc(),name:e.value};r.startUpload();var n=r,o=n.props;if(!o.beforeUpload)return r.post(t);var i=o.beforeUpload(t);i&&i.then?i.then(function(){r.post(t)},function(){r.endUpload()}):!1!==i?r.post(t):r.endUpload()},r.saveIframe=function(e){r.iframe=e},o=n,ms()(r,o)}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){this.updateIframeWH(),this.initIframe()}},{key:"componentDidUpdate",value:function(){this.updateIframeWH()}},{key:"getIframeNode",value:function(){return this.iframe}},{key:"getIframeDocument",value:function(){return this.getIframeNode().contentDocument}},{key:"getFormNode",value:function(){return this.getIframeDocument().getElementById("form")}},{key:"getFormInputNode",value:function(){return this.getIframeDocument().getElementById("input")}},{key:"getFormDataNode",value:function(){return this.getIframeDocument().getElementById("data")}},{key:"getFileForMultiple",value:function(e){return this.props.multiple?[e]:e}},{key:"getIframeHTML",value:function(e){var t="",n="";if(e){t='<script>document.domain="'+e+'";<\/script>',n='<input name="_documentDomain" value="'+e+'" />'}return'\n <!DOCTYPE html>\n <html>\n <head>\n <meta http-equiv="X-UA-Compatible" content="IE=edge" />\n <style>\n body,html {padding:0;margin:0;border:0;overflow:hidden;}\n </style>\n '+t+'\n </head>\n <body>\n <form method="post"\n encType="multipart/form-data"\n action="" id="form"\n style="display:block;height:9999px;position:relative;overflow:hidden;">\n <input id="input" type="file"\n name="'+this.props.name+'"\n style="position:absolute;top:0;right:0;height:9999px;font-size:9999px;cursor:pointer;"/>\n '+n+'\n <span id="data"></span>\n </form>\n </body>\n </html>\n '}},{key:"initIframeSrc",value:function(){this.domain&&(this.getIframeNode().src="javascript:void((function(){\n var d = document;\n d.open();\n d.domain='"+this.domain+"';\n d.write('');\n d.close();\n })())")}},{key:"initIframe",value:function(){var e=this.getIframeNode(),t=e.contentWindow,n=void 0;this.domain=this.domain||"",this.initIframeSrc();try{n=t.document}catch(r){this.domain=document.domain,this.initIframeSrc(),t=e.contentWindow,n=t.document}n.open("text/html","replace"),n.write(this.getIframeHTML(this.domain)),n.close(),this.getFormInputNode().onchange=this.onChange}},{key:"endUpload",value:function(){this.state.uploading&&(this.file={},this.state.uploading=!1,this.setState({uploading:!1}),this.initIframe())}},{key:"startUpload",value:function(){this.state.uploading||(this.state.uploading=!0,this.setState({uploading:!0}))}},{key:"updateIframeWH",value:function(){var e=Ms.a.findDOMNode(this),t=this.getIframeNode();t.style.height=e.offsetHeight+"px",t.style.width=e.offsetWidth+"px"}},{key:"abort",value:function(e){if(e){var t=e;e&&e.uid&&(t=e.uid),t===this.file.uid&&this.endUpload()}else this.endUpload()}},{key:"post",value:function(e){var t=this,n=this.getFormNode(),r=this.getFormDataNode(),o=this.props.data,i=this.props.onStart;"function"==typeof o&&(o=o(e));var a=document.createDocumentFragment();for(var c in o)if(o.hasOwnProperty(c)){var s=document.createElement("input");s.setAttribute("name",c),s.value=o[c],a.appendChild(s)}r.appendChild(a),new Promise(function(n){var r=t.props.action;if("function"==typeof r)return n(r(e));n(r)}).then(function(t){n.setAttribute("action",t),n.submit(),r.innerHTML="",i(e)})}},{key:"render",value:function(){var e,t=this.props,n=t.component,r=t.disabled,o=t.className,i=t.prefixCls,a=t.children,c=t.style,s=us()({},fz,{display:this.state.uploading||r?"none":""}),l=Ts()((e={},ss()(e,i,!0),ss()(e,i+"-disabled",r),ss()(e,o,o),e));return Ss.a.createElement(n,{className:l,style:us()({position:"relative",zIndex:0},c)},Ss.a.createElement("iframe",{ref:this.saveIframe,onLoad:this.onLoad,style:s}),a)}}]),t}(ws.Component);hz.propTypes={component:ks.a.string,style:ks.a.object,disabled:ks.a.bool,prefixCls:ks.a.string,className:ks.a.string,accept:ks.a.string,onStart:ks.a.func,multiple:ks.a.bool,children:ks.a.any,data:ks.a.oneOfType([ks.a.object,ks.a.func]),action:ks.a.oneOfType([ks.a.string,ks.a.func]),name:ks.a.string};var dz=hz,vz=function(e){function t(){var e,n,r,o;fs()(this,t);for(var i=arguments.length,a=Array(i),c=0;c<i;c++)a[c]=arguments[c];return n=r=ms()(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(a))),r.state={Component:null},r.saveUploader=function(e){r.uploader=e},o=n,ms()(r,o)}return gs()(t,e),ds()(t,[{key:"componentDidMount",value:function(){this.props.supportServerRender&&this.setState({Component:this.getComponent()},this.props.onReady)}},{key:"getComponent",value:function(){return"undefined"!=typeof File?lz:dz}},{key:"abort",value:function(e){this.uploader.abort(e)}},{key:"render",value:function(){if(this.props.supportServerRender){var e=this.state.Component;return e?Ss.a.createElement(e,us()({},this.props,{ref:this.saveUploader})):null}var t=this.getComponent();return Ss.a.createElement(t,us()({},this.props,{ref:this.saveUploader}))}}]),t}(ws.Component);vz.propTypes={component:ks.a.string,style:ks.a.object,prefixCls:ks.a.string,action:ks.a.oneOfType([ks.a.string,ks.a.func]),name:ks.a.string,multipart:ks.a.bool,directory:ks.a.bool,onError:ks.a.func,onSuccess:ks.a.func,onProgress:ks.a.func,onStart:ks.a.func,data:ks.a.oneOfType([ks.a.object,ks.a.func]),headers:ks.a.object,accept:ks.a.string,multiple:ks.a.bool,disabled:ks.a.bool,beforeUpload:ks.a.func,customRequest:ks.a.func,onReady:ks.a.func,withCredentials:ks.a.bool,supportServerRender:ks.a.bool},vz.defaultProps={component:"span",prefixCls:"rc-upload",data:{},headers:{},name:"file",multipart:!1,onReady:ts,onStart:ts,onError:ts,onSuccess:ts,supportServerRender:!1,multiple:!1,beforeUpload:null,customRequest:null,withCredentials:!1};var mz=vz,yz=mz,gz=n(527),bz=n.n(gz),Cz=function(e,t){var n=new FileReader;n.onloadend=function(){return t(n.result)},n.readAsDataURL(e)},wz=function(e){if(!e)return"";var t=e.split("/");return(/\.[^.\/\\]*$/.exec(t[t.length-1].split(/#|\?/)[0])||[""])[0]},Sz=["image","webp","png","svg","gif","jpg","jpeg","bmp"],xz=function(e){if(Sz.includes(e.type))return!0;var t=e.thumbUrl||e.url,n=wz(t);return!(!/^data:image\//.test(t)&&!/(webp|svg|png|gif|jpg|jpeg|bmp)$/i.test(n))||!/^data:/.test(t)&&!n},Mz=function(e){function t(){fs()(this,t);var e=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments));return e.handleClose=function(t){var n=e.props.onRemove;n&&n(t)},e.handlePreview=function(t,n){var r=e.props.onPreview;if(r)return n.preventDefault(),r(t)},e}return gs()(t,e),ds()(t,[{key:"componentDidUpdate",value:function(){var e=this;"picture"!==this.props.listType&&"picture-card"!==this.props.listType||(this.props.items||[]).forEach(function(t){"undefined"!=typeof document&&"undefined"!=typeof window&&window.FileReader&&window.File&&t.originFileObj instanceof File&&void 0===t.thumbUrl&&(t.thumbUrl="",Cz(t.originFileObj,function(n){t.thumbUrl=n,e.forceUpdate()}))})}},{key:"render",value:function(){var e,t=this,n=this.props,r=n.prefixCls,o=n.items,i=void 0===o?[]:o,a=n.listType,c=n.showPreviewIcon,s=n.showRemoveIcon,l=n.locale,u=i.map(function(e){var n,o=void 0,i=ws.createElement(Kp,{type:"uploading"===e.status?"loading":"paper-clip"});if("picture"===a||"picture-card"===a)if("picture-card"===a&&"uploading"===e.status)i=ws.createElement("div",{className:r+"-list-item-uploading-text"},l.uploading);else if(e.thumbUrl||e.url){var u=xz(e)?ws.createElement("img",{src:e.thumbUrl||e.url,alt:e.name}):ws.createElement(Kp,{type:"file",className:r+"-list-item-icon"});i=ws.createElement("a",{className:r+"-list-item-thumbnail",onClick:function(n){return t.handlePreview(e,n)},href:e.url||e.thumbUrl,target:"_blank",rel:"noopener noreferrer"},u)}else i=ws.createElement(Kp,{className:r+"-list-item-thumbnail",type:"picture"});if("uploading"===e.status){var p="percent"in e?ws.createElement(HC,us()({type:"line"},t.props.progressAttr,{percent:e.percent})):null;o=ws.createElement("div",{className:r+"-list-item-progress",key:"progress"},p)}var f=Ts()((n={},ss()(n,r+"-list-item",!0),ss()(n,r+"-list-item-"+e.status,!0),n)),h="string"==typeof e.linkProps?JSON.parse(e.linkProps):e.linkProps,d=e.url?ws.createElement("a",us()({target:"_blank",rel:"noopener noreferrer",className:r+"-list-item-name",title:e.name},h,{href:e.url,onClick:function(n){return t.handlePreview(e,n)}}),e.name):ws.createElement("span",{className:r+"-list-item-name",onClick:function(n){return t.handlePreview(e,n)},title:e.name},e.name),v={pointerEvents:"none",opacity:.5},m=c?ws.createElement("a",{href:e.url||e.thumbUrl,target:"_blank",rel:"noopener noreferrer",style:e.url||e.thumbUrl?void 0:v,onClick:function(n){return t.handlePreview(e,n)},title:l.previewFile},ws.createElement(Kp,{type:"eye-o"})):null,y=s?ws.createElement(Kp,{type:"delete",title:l.removeFile,onClick:function(){return t.handleClose(e)}}):null,g=s?ws.createElement(Kp,{type:"close",title:l.removeFile,onClick:function(){return t.handleClose(e)}}):null,b="picture-card"===a&&"uploading"!==e.status?ws.createElement("span",{className:r+"-list-item-actions"},m,y):g,C=void 0;C=e.response&&"string"==typeof e.response?e.response:e.error&&e.error.statusText||l.uploadError;var w="error"===e.status?ws.createElement(Ab,{title:C},i,d):ws.createElement("span",null,i,d);return ws.createElement("div",{className:f,key:e.uid},ws.createElement("div",{className:r+"-list-item-info"},w),b,ws.createElement(Ml,{transitionName:"fade",component:""},o))}),p=Ts()((e={},ss()(e,r+"-list",!0),ss()(e,r+"-list-"+a,!0),e)),f="picture-card"===a?"animate-inline":"animate";return ws.createElement(Ml,{transitionName:r+"-"+f,component:"div",className:p},u)}}]),t}(ws.Component),zz=Mz;Mz.defaultProps={listType:"text",progressAttr:{strokeWidth:2,showInfo:!1},prefixCls:"ant-upload",showRemoveIcon:!0,showPreviewIcon:!0};var kz=(n(226),function(e){function t(e){fs()(this,t);var n=ms()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.onStart=function(e){var t=rs(e);t.status="uploading";var r=n.state.fileList.concat(),o=r.findIndex(function(e){return e.uid===t.uid});-1===o?r.push(t):r[o]=t,n.onChange({file:t,fileList:r}),window.FormData||n.autoUpdateProgress(0,t)},n.onSuccess=function(e,t){n.clearProgressTimer();try{"string"==typeof e&&(e=JSON.parse(e))}catch(e){}var r=n.state.fileList,o=is(t,r);o&&(o.status="done",o.response=e,n.onChange({file:us()({},o),fileList:r}))},n.onProgress=function(e,t){var r=n.state.fileList,o=is(t,r);o&&(o.percent=e.percent,n.onChange({event:e,file:us()({},o),fileList:n.state.fileList}))},n.onError=function(e,t,r){n.clearProgressTimer();var o=n.state.fileList,i=is(r,o);i&&(i.error=e,i.response=t,i.status="error",n.onChange({file:us()({},i),fileList:o}))},n.handleManualRemove=function(e){n.upload.abort(e),e.status="removed",n.handleRemove(e)},n.onChange=function(e){"fileList"in n.props||n.setState({fileList:e.fileList});var t=n.props.onChange;t&&t(e)},n.onFileDrop=function(e){n.setState({dragState:e.type})},n.beforeUpload=function(e,t){if(!n.props.beforeUpload)return!0;var r=n.props.beforeUpload(e,t);return!1===r?(n.onChange({file:e,fileList:bz()(n.state.fileList.concat(t.map(rs)),function(e){return e.uid})}),!1):!r||!r.then||r},n.saveUpload=function(e){n.upload=e},n.renderUploadList=function(e){var t=n.props,r=t.showUploadList,o=t.listType,i=t.onPreview,a=r.showRemoveIcon,c=r.showPreviewIcon;return ws.createElement(zz,{listType:o,items:n.state.fileList,onPreview:i,onRemove:n.handleManualRemove,showRemoveIcon:a,showPreviewIcon:c,locale:us()({},e,n.props.locale)})},n.state={fileList:e.fileList||e.defaultFileList||[],dragState:"drop"},n}return gs()(t,e),ds()(t,[{key:"componentWillUnmount",value:function(){this.clearProgressTimer()}},{key:"autoUpdateProgress",value:function(e,t){var n=this,r=os(),o=0;this.clearProgressTimer(),this.progressTimer=setInterval(function(){o=r(o),n.onProgress({percent:100*o},t)},200)}},{key:"handleRemove",value:function(e){var t=this,n=this.props.onRemove;Promise.resolve("function"==typeof n?n(e):n).then(function(n){if(!1!==n){var r=as(e,t.state.fileList);r&&t.onChange({file:e,fileList:r})}})}},{key:"clearProgressTimer",value:function(){clearInterval(this.progressTimer)}},{key:"render",value:function(){var e,t=this.props,n=t.prefixCls,r=void 0===n?"":n,o=t.className,i=t.showUploadList,a=t.listType,c=t.type,s=t.disabled,l=t.children,u=us()({onStart:this.onStart,onError:this.onError,onProgress:this.onProgress,onSuccess:this.onSuccess},this.props,{beforeUpload:this.beforeUpload});delete u.className;var p=i?ws.createElement(xp,{componentName:"Upload",defaultLocale:Mp.a.Upload},this.renderUploadList):null;if("drag"===c){var f,h=Ts()(r,(f={},ss()(f,r+"-drag",!0),ss()(f,r+"-drag-uploading",this.state.fileList.some(function(e){return"uploading"===e.status})),ss()(f,r+"-drag-hover","dragover"===this.state.dragState),ss()(f,r+"-disabled",s),f));return ws.createElement("span",{className:o},ws.createElement("div",{className:h,onDrop:this.onFileDrop,onDragOver:this.onFileDrop,onDragLeave:this.onFileDrop},ws.createElement(yz,us()({},u,{ref:this.saveUpload,className:r+"-btn"}),ws.createElement("div",{className:r+"-drag-container"},l))),p)}var d=Ts()(r,(e={},ss()(e,r+"-select",!0),ss()(e,r+"-select-"+a,!0),ss()(e,r+"-disabled",s),e)),v=ws.createElement("div",{className:d,style:{display:l?"":"none"}},ws.createElement(yz,us()({},u,{ref:this.saveUpload})));return"picture-card"===a?ws.createElement("span",{className:o},p,v):ws.createElement("span",{className:o},v,p)}}],[{key:"getDerivedStateFromProps",value:function(e){return"fileList"in e?{fileList:e.fileList||[]}:null}}]),t}(ws.Component));kz.defaultProps={prefixCls:"ant-upload",type:"select",multiple:!1,action:"",data:{},accept:"",beforeUpload:ns,showUploadList:!0,listType:"text",className:"",disabled:!1,supportServerRender:!0},Object(Ys.polyfill)(kz);var _z=kz,Oz=function(e){function t(){return fs()(this,t),ms()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return gs()(t,e),ds()(t,[{key:"render",value:function(){var e=this.props;return ws.createElement(_z,us()({},e,{type:"drag",style:us()({},e.style,{height:e.height})}))}}]),t}(ws.Component),Ez=Oz;_z.Dragger=Ez;var Tz=_z,Nz=n(559),Vz=Nz.version;n.d(t,"Affix",function(){return js}),n.d(t,"Anchor",function(){return qs}),n.d(t,"AutoComplete",function(){return wf}),n.d(t,"Alert",function(){return xf}),n.d(t,"Avatar",function(){return kf}),n.d(t,"BackTop",function(){return Ef}),n.d(t,"Badge",function(){return Hf}),n.d(t,"Breadcrumb",function(){return jf}),n.d(t,"Button",function(){return cf}),n.d(t,"Calendar",function(){return yh}),n.d(t,"Card",function(){return vd}),n.d(t,"Collapse",function(){return Hd}),n.d(t,"Carousel",function(){return Id}),n.d(t,"Cascader",function(){return nv}),n.d(t,"Checkbox",function(){return lv}),n.d(t,"Col",function(){return pd}),n.d(t,"DatePicker",function(){return ym}),n.d(t,"Divider",function(){return qr}),n.d(t,"Dropdown",function(){return Hm}),n.d(t,"Drawer",function(){return Zm}),n.d(t,"Form",function(){return Jy}),n.d(t,"Icon",function(){return Kp}),n.d(t,"Input",function(){return yf}),n.d(t,"InputNumber",function(){return ug}),n.d(t,"Layout",function(){return _g}),n.d(t,"List",function(){return tb}),n.d(t,"LocaleProvider",function(){return ob}),n.d(t,"message",function(){return wb}),n.d(t,"Menu",function(){return Fb}),n.d(t,"Modal",function(){return cC}),n.d(t,"notification",function(){return mC}),n.d(t,"Pagination",function(){return Yg}),n.d(t,"Popconfirm",function(){return bC}),n.d(t,"Popover",function(){return wC}),n.d(t,"Progress",function(){return HC}),n.d(t,"Radio",function(){return ph.default}),n.d(t,"Rate",function(){return KC}),n.d(t,"Row",function(){return ud}),n.d(t,"Select",function(){return qp}),n.d(t,"Skeleton",function(){return $C}),n.d(t,"Slider",function(){return dw}),n.d(t,"Spin",function(){return Ng}),n.d(t,"Steps",function(){return ww}),n.d(t,"Switch",function(){return zw}),n.d(t,"Table",function(){return gS}),n.d(t,"Transfer",function(){return VS}),n.d(t,"Tree",function(){return bx}),n.d(t,"TreeSelect",function(){return CM}),n.d(t,"Tabs",function(){return Jh}),n.d(t,"Tag",function(){return um}),n.d(t,"TimePicker",function(){return Qv}),n.d(t,"Timeline",function(){return _M}),n.d(t,"Tooltip",function(){return Ab}),n.d(t,"Mention",function(){return nz}),n.d(t,"Upload",function(){return Tz}),n.d(t,"version",function(){return Vz})},function(e,t,n){n(236);var r=n(19).Object;e.exports=function(e,t,n){return r.defineProperty(e,t,n)}},function(e,t,n){var r=n(37);r(r.S+r.F*!n(45),"Object",{defineProperty:n(39).f})},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t,n){e.exports={default:n(239),__esModule:!0}},function(e,t,n){n(240),e.exports=n(19).Object.assign},function(e,t,n){var r=n(37);r(r.S+r.F,"Object",{assign:n(241)})},function(e,t,n){"use strict";var r=n(70),o=n(103),i=n(73),a=n(74),c=n(151),s=Object.assign;e.exports=!s||n(54)(function(){var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach(function(e){t[e]=e}),7!=s({},e)[n]||Object.keys(s({},t)).join("")!=r})?function(e,t){for(var n=a(e),s=arguments.length,l=1,u=o.f,p=i.f;s>l;)for(var f,h=c(arguments[l++]),d=u?r(h).concat(u(h)):r(h),v=d.length,m=0;v>m;)p.call(h,f=d[m++])&&(n[f]=h[f]);return n}:s},function(e,t,n){var r=n(47),o=n(152),i=n(243);e.exports=function(e){return function(t,n,a){var c,s=r(t),l=o(s.length),u=i(a,l);if(e&&n!=n){for(;l>u;)if((c=s[u++])!=c)return!0}else for(;l>u;u++)if((e||u in s)&&s[u]===n)return e||u||0;return!e&&-1}}},function(e,t,n){var r=n(99),o=Math.max,i=Math.min;e.exports=function(e,t){return e=r(e),e<0?o(e+t,0):i(e,t)}},function(e,t,n){e.exports={default:n(245),__esModule:!0}},function(e,t,n){n(75),n(106),e.exports=n(107).f("iterator")},function(e,t,n){var r=n(99),o=n(98);e.exports=function(e){return function(t,n){var i,a,c=String(o(t)),s=r(n),l=c.length;return s<0||s>=l?e?"":void 0:(i=c.charCodeAt(s),i<55296||i>56319||s+1===l||(a=c.charCodeAt(s+1))<56320||a>57343?e?c.charAt(s):i:e?c.slice(s,s+2):a-56320+(i-55296<<10)+65536)}}},function(e,t,n){"use strict";var r=n(104),o=n(60),i=n(105),a={};n(52)(a,n(27)("iterator"),function(){return this}),e.exports=function(e,t,n){e.prototype=r(a,{next:o(1,n)}),i(e,t+" Iterator")}},function(e,t,n){var r=n(39),o=n(44),i=n(70);e.exports=n(45)?Object.defineProperties:function(e,t){o(e);for(var n,a=i(t),c=a.length,s=0;c>s;)r.f(e,n=a[s++],t[n]);return e}},function(e,t,n){var r=n(38).document;e.exports=r&&r.documentElement},function(e,t,n){"use strict";var r=n(251),o=n(252),i=n(55),a=n(47);e.exports=n(153)(Array,"Array",function(e,t){this._t=a(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,o(1)):"keys"==t?o(0,n):"values"==t?o(0,e[n]):o(0,[n,e[n]])},"values"),i.Arguments=i.Array,r("keys"),r("values"),r("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(254),__esModule:!0}},function(e,t,n){n(255),n(260),n(261),n(262),e.exports=n(19).Symbol},function(e,t,n){"use strict";var r=n(38),o=n(46),i=n(45),a=n(37),c=n(154),s=n(256).KEY,l=n(54),u=n(101),p=n(105),f=n(72),h=n(27),d=n(107),v=n(108),m=n(257),y=n(258),g=n(44),b=n(53),C=n(47),w=n(96),S=n(60),x=n(104),M=n(259),z=n(109),k=n(39),_=n(70),O=z.f,E=k.f,T=M.f,N=r.Symbol,V=r.JSON,P=V&&V.stringify,H=h("_hidden"),L=h("toPrimitive"),D={}.propertyIsEnumerable,A=u("symbol-registry"),I=u("symbols"),R=u("op-symbols"),j=Object.prototype,F="function"==typeof N,K=r.QObject,B=!K||!K.prototype||!K.prototype.findChild,W=i&&l(function(){return 7!=x(E({},"a",{get:function(){return E(this,"a",{value:7}).a}})).a})?function(e,t,n){var r=O(j,t);r&&delete j[t],E(e,t,n),r&&e!==j&&E(j,t,r)}:E,U=function(e){var t=I[e]=x(N.prototype);return t._k=e,t},q=F&&"symbol"==typeof N.iterator?function(e){return"symbol"==typeof e}:function(e){return e instanceof N},Y=function(e,t,n){return e===j&&Y(R,t,n),g(e),t=w(t,!0),g(n),o(I,t)?(n.enumerable?(o(e,H)&&e[H][t]&&(e[H][t]=!1),n=x(n,{enumerable:S(0,!1)})):(o(e,H)||E(e,H,S(1,{})),e[H][t]=!0),W(e,t,n)):E(e,t,n)},G=function(e,t){g(e);for(var n,r=m(t=C(t)),o=0,i=r.length;i>o;)Y(e,n=r[o++],t[n]);return e},X=function(e,t){return void 0===t?x(e):G(x(e),t)},$=function(e){var t=D.call(this,e=w(e,!0));return!(this===j&&o(I,e)&&!o(R,e))&&(!(t||!o(this,e)||!o(I,e)||o(this,H)&&this[H][e])||t)},J=function(e,t){if(e=C(e),t=w(t,!0),e!==j||!o(I,t)||o(R,t)){var n=O(e,t);return!n||!o(I,t)||o(e,H)&&e[H][t]||(n.enumerable=!0),n}},Z=function(e){for(var t,n=T(C(e)),r=[],i=0;n.length>i;)o(I,t=n[i++])||t==H||t==s||r.push(t);return r},Q=function(e){for(var t,n=e===j,r=T(n?R:C(e)),i=[],a=0;r.length>a;)!o(I,t=r[a++])||n&&!o(j,t)||i.push(I[t]);return i};F||(N=function(){if(this instanceof N)throw TypeError("Symbol is not a constructor!");var e=f(arguments.length>0?arguments[0]:void 0),t=function(n){this===j&&t.call(R,n),o(this,H)&&o(this[H],e)&&(this[H][e]=!1),W(this,e,S(1,n))};return i&&B&&W(j,e,{configurable:!0,set:t}),U(e)},c(N.prototype,"toString",function(){return this._k}),z.f=J,k.f=Y,n(156).f=M.f=Z,n(73).f=$,n(103).f=Q,i&&!n(71)&&c(j,"propertyIsEnumerable",$,!0),d.f=function(e){return U(h(e))}),a(a.G+a.W+a.F*!F,{Symbol:N});for(var ee="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),te=0;ee.length>te;)h(ee[te++]);for(var ne=_(h.store),re=0;ne.length>re;)v(ne[re++]);a(a.S+a.F*!F,"Symbol",{for:function(e){return o(A,e+="")?A[e]:A[e]=N(e)},keyFor:function(e){if(!q(e))throw TypeError(e+" is not a symbol!");for(var t in A)if(A[t]===e)return t},useSetter:function(){B=!0},useSimple:function(){B=!1}}),a(a.S+a.F*!F,"Object",{create:X,defineProperty:Y,defineProperties:G,getOwnPropertyDescriptor:J,getOwnPropertyNames:Z,getOwnPropertySymbols:Q}),V&&a(a.S+a.F*(!F||l(function(){var e=N();return"[null]"!=P([e])||"{}"!=P({a:e})||"{}"!=P(Object(e))})),"JSON",{stringify:function(e){for(var t,n,r=[e],o=1;arguments.length>o;)r.push(arguments[o++]);if(n=t=r[1],(b(t)||void 0!==e)&&!q(e))return y(t)||(t=function(e,t){if("function"==typeof n&&(t=n.call(this,e,t)),!q(t))return t}),r[1]=t,P.apply(V,r)}}),N.prototype[L]||n(52)(N.prototype,L,N.prototype.valueOf),p(N,"Symbol"),p(Math,"Math",!0),p(r.JSON,"JSON",!0)},function(e,t,n){var r=n(72)("meta"),o=n(53),i=n(46),a=n(39).f,c=0,s=Object.isExtensible||function(){return!0},l=!n(54)(function(){return s(Object.preventExtensions({}))}),u=function(e){a(e,r,{value:{i:"O"+ ++c,w:{}}})},p=function(e,t){if(!o(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!i(e,r)){if(!s(e))return"F";if(!t)return"E";u(e)}return e[r].i},f=function(e,t){if(!i(e,r)){if(!s(e))return!0;if(!t)return!1;u(e)}return e[r].w},h=function(e){return l&&d.NEED&&s(e)&&!i(e,r)&&u(e),e},d=e.exports={KEY:r,NEED:!1,fastKey:p,getWeak:f,onFreeze:h}},function(e,t,n){var r=n(70),o=n(103),i=n(73);e.exports=function(e){var t=r(e),n=o.f;if(n)for(var a,c=n(e),s=i.f,l=0;c.length>l;)s.call(e,a=c[l++])&&t.push(a);return t}},function(e,t,n){var r=n(97);e.exports=Array.isArray||function(e){return"Array"==r(e)}},function(e,t,n){var r=n(47),o=n(156).f,i={}.toString,a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],c=function(e){try{return o(e)}catch(e){return a.slice()}};e.exports.f=function(e){return a&&"[object Window]"==i.call(e)?c(e):o(r(e))}},function(e,t){},function(e,t,n){n(108)("asyncIterator")},function(e,t,n){n(108)("observable")},function(e,t,n){e.exports={default:n(264),__esModule:!0}},function(e,t,n){n(265),e.exports=n(19).Object.setPrototypeOf},function(e,t,n){var r=n(37);r(r.S,"Object",{setPrototypeOf:n(266).set})},function(e,t,n){var r=n(53),o=n(44),i=function(e,t){if(o(e),!r(t)&&null!==t)throw TypeError(t+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,r){try{r=n(95)(Function.call,n(109).f(Object.prototype,"__proto__").set,2),r(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,n){return i(e,n),t?e.__proto__=n:r(e,n),e}}({},!1):void 0),check:i}},function(e,t,n){e.exports={default:n(268),__esModule:!0}},function(e,t,n){n(269);var r=n(19).Object;e.exports=function(e,t){return r.create(e,t)}},function(e,t,n){var r=n(37);r(r.S,"Object",{create:n(104)})},function(e,t,n){"use strict";function r(){}var o=n(271);e.exports=function(){function e(e,t,n,r,i,a){if(a!==o){var c=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");throw c.name="Invariant Violation",c}}function t(){return e}e.isRequired=e;var n={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t};return n.checkPropTypes=r,n.PropTypes=n,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 r(e,t,n){function r(t){var r=new i.default(t);n.call(e,r)}return e.addEventListener?(e.addEventListener(t,r,!1),{remove:function(){e.removeEventListener(t,r,!1)}}):e.attachEvent?(e.attachEvent("on"+t,r),{remove:function(){e.detachEvent("on"+t,r)}}):void 0}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var o=n(273),i=function(e){return e&&e.__esModule?e:{default:e}}(o);e.exports=t.default},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return null===e||void 0===e}function i(){return f}function a(){return h}function c(e){var t=e.type,n="function"==typeof e.stopPropagation||"boolean"==typeof e.cancelBubble;l.default.call(this),this.nativeEvent=e;var r=a;"defaultPrevented"in e?r=e.defaultPrevented?i:a:"getPreventDefault"in e?r=e.getPreventDefault()?i:a:"returnValue"in e&&(r=e.returnValue===h?i:a),this.isDefaultPrevented=r;var o=[],c=void 0,s=void 0,u=d.concat();for(v.forEach(function(e){t.match(e.reg)&&(u=u.concat(e.props),e.fix&&o.push(e.fix))}),c=u.length;c;)s=u[--c],this[s]=e[s];for(!this.target&&n&&(this.target=e.srcElement||document),this.target&&3===this.target.nodeType&&(this.target=this.target.parentNode),c=o.length;c;)(0,o[--c])(this,e);this.timeStamp=e.timeStamp||Date.now()}Object.defineProperty(t,"__esModule",{value:!0});var s=n(274),l=r(s),u=n(20),p=r(u),f=!0,h=!1,d=["altKey","bubbles","cancelable","ctrlKey","currentTarget","eventPhase","metaKey","shiftKey","target","timeStamp","view","type"],v=[{reg:/^key/,props:["char","charCode","key","keyCode","which"],fix:function(e,t){o(e.which)&&(e.which=o(t.charCode)?t.keyCode:t.charCode),void 0===e.metaKey&&(e.metaKey=e.ctrlKey)}},{reg:/^touch/,props:["touches","changedTouches","targetTouches"]},{reg:/^hashchange$/,props:["newURL","oldURL"]},{reg:/^gesturechange$/i,props:["rotation","scale"]},{reg:/^(mousewheel|DOMMouseScroll)$/,props:[],fix:function(e,t){var n=void 0,r=void 0,o=void 0,i=t.wheelDelta,a=t.axis,c=t.wheelDeltaY,s=t.wheelDeltaX,l=t.detail;i&&(o=i/120),l&&(o=0-(l%3==0?l/3:l)),void 0!==a&&(a===e.HORIZONTAL_AXIS?(r=0,n=0-o):a===e.VERTICAL_AXIS&&(n=0,r=o)),void 0!==c&&(r=c/120),void 0!==s&&(n=-1*s/120),n||r||(r=o),void 0!==n&&(e.deltaX=n),void 0!==r&&(e.deltaY=r),void 0!==o&&(e.delta=o)}},{reg:/^mouse|contextmenu|click|mspointer|(^DOMMouseScroll$)/i,props:["buttons","clientX","clientY","button","offsetX","relatedTarget","which","fromElement","toElement","offsetY","pageX","pageY","screenX","screenY"],fix:function(e,t){var n=void 0,r=void 0,i=void 0,a=e.target,c=t.button;return a&&o(e.pageX)&&!o(t.clientX)&&(n=a.ownerDocument||document,r=n.documentElement,i=n.body,e.pageX=t.clientX+(r&&r.scrollLeft||i&&i.scrollLeft||0)-(r&&r.clientLeft||i&&i.clientLeft||0),e.pageY=t.clientY+(r&&r.scrollTop||i&&i.scrollTop||0)-(r&&r.clientTop||i&&i.clientTop||0)),e.which||void 0===c||(e.which=1&c?1:2&c?3:4&c?2:0),!e.relatedTarget&&e.fromElement&&(e.relatedTarget=e.fromElement===a?e.toElement:e.fromElement),e}}],m=l.default.prototype;(0,p.default)(c.prototype,m,{constructor:c,preventDefault:function(){var e=this.nativeEvent;e.preventDefault?e.preventDefault():e.returnValue=h,m.preventDefault.call(this)},stopPropagation:function(){var e=this.nativeEvent;e.stopPropagation?e.stopPropagation():e.cancelBubble=f,m.stopPropagation.call(this)}}),t.default=c,e.exports=t.default},function(e,t,n){"use strict";function r(){return!1}function o(){return!0}function i(){this.timeStamp=Date.now(),this.target=void 0,this.currentTarget=void 0}Object.defineProperty(t,"__esModule",{value:!0}),i.prototype={isEventObject:1,constructor:i,isDefaultPrevented:r,isPropagationStopped:r,isImmediatePropagationStopped:r,preventDefault:function(){this.isDefaultPrevented=o},stopPropagation:function(){this.isPropagationStopped=o},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=o,this.stopPropagation()},halt:function(e){e?this.stopImmediatePropagation():this.stopPropagation(),this.preventDefault()}},t.default=i,e.exports=t.default},function(e,t,n){n(75),n(276),e.exports=n(19).Array.from},function(e,t,n){"use strict";var r=n(95),o=n(37),i=n(74),a=n(277),c=n(278),s=n(152),l=n(279),u=n(158);o(o.S+o.F*!n(280)(function(e){Array.from(e)}),"Array",{from:function(e){var t,n,o,p,f=i(e),h="function"==typeof this?this:Array,d=arguments.length,v=d>1?arguments[1]:void 0,m=void 0!==v,y=0,g=u(f);if(m&&(v=r(v,d>2?arguments[2]:void 0,2)),void 0==g||h==Array&&c(g))for(t=s(f.length),n=new h(t);t>y;y++)l(n,y,m?v(f[y],y):f[y]);else for(p=g.call(f),n=new h;!(o=p.next()).done;y++)l(n,y,m?a(p,v,[o.value,y],!0):o.value);return n.length=y,n}})},function(e,t,n){var r=n(44);e.exports=function(e,t,n,o){try{return o?t(r(n)[0],n[1]):t(n)}catch(t){var i=e.return;throw void 0!==i&&r(i.call(e)),t}}},function(e,t,n){var r=n(55),o=n(27)("iterator"),i=Array.prototype;e.exports=function(e){return void 0!==e&&(r.Array===e||i[o]===e)}},function(e,t,n){"use strict";var r=n(39),o=n(60);e.exports=function(e,t,n){t in e?r.f(e,t,o(0,n)):e[t]=n}},function(e,t,n){var r=n(27)("iterator"),o=!1;try{var i=[7][r]();i.return=function(){o=!0},Array.from(i,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!o)return!1;var n=!1;try{var i=[7],a=i[r]();a.next=function(){return{done:n=!0}},i[r]=function(){return a},e(i)}catch(e){}return n}},function(e,t,n){(function(t){(function(){var n,r,o,i,a,c;"undefined"!=typeof performance&&null!==performance&&performance.now?e.exports=function(){return performance.now()}:void 0!==t&&null!==t&&t.hrtime?(e.exports=function(){return(n()-a)/1e6},r=t.hrtime,n=function(){var e;return e=r(),1e9*e[0]+e[1]},i=n(),c=1e9*t.uptime(),a=i-c):Date.now?(e.exports=function(){return Date.now()-o},o=Date.now()):(e.exports=function(){return(new Date).getTime()-o},o=(new Date).getTime())}).call(this)}).call(t,n(110))},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),c=n(0),s=(function(e){e&&e.__esModule}(c),n(162)),l=function(e){function t(){return r(this,t),o(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return i(t,e),a(t,[{key:"getChildContext",value:function(){return{miniStore:this.props.store}}},{key:"render",value:function(){return c.Children.only(this.props.children)}}]),t}(c.Component);l.propTypes={store:s.storeShape.isRequired},l.childContextTypes={miniStore:s.storeShape.isRequired},t.default=l},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function c(e){return e.displayName||e.name||"Component"}function s(e){return!e.prototype.render}function l(e){var t=!!e,n=e||C;return function(r){var l=function(c){function l(e,t){o(this,l);var r=i(this,(l.__proto__||Object.getPrototypeOf(l)).call(this,e,t));return r.handleChange=function(){if(r.unsubscribe){var e=n(r.store.getState(),r.props);(0,v.default)(r.state.subscribed,e)||r.setState({subscribed:e})}},r.store=t.miniStore,r.state={subscribed:n(r.store.getState(),e),store:r.store,props:e},r}return a(l,c),p(l,null,[{key:"getDerivedStateFromProps",value:function(t,r){return e&&2===e.length&&t!==r.props?{subscribed:n(r.store.getState(),t),props:t}:{props:t}}}]),p(l,[{key:"componentDidMount",value:function(){this.trySubscribe()}},{key:"componentWillUnmount",value:function(){this.tryUnsubscribe()}},{key:"trySubscribe",value:function(){t&&(this.unsubscribe=this.store.subscribe(this.handleChange),this.handleChange())}},{key:"tryUnsubscribe",value:function(){this.unsubscribe&&(this.unsubscribe(),this.unsubscribe=null)}},{key:"getWrappedInstance",value:function(){return this.wrappedInstance}},{key:"render",value:function(){var e=this,t=u({},this.props,this.state.subscribed,{store:this.store});return s(r)||(t=u({},t,{ref:function(t){return e.wrappedInstance=t}})),h.default.createElement(r,t)}}]),l}(f.Component);return l.displayName="Connect("+c(r)+")",l.contextTypes={miniStore:b.storeShape.isRequired},(0,g.polyfill)(l),(0,y.default)(l,r)}}Object.defineProperty(t,"__esModule",{value:!0});var u=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},p=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}();t.default=l;var f=n(0),h=r(f),d=n(23),v=r(d),m=n(163),y=r(m),g=n(13),b=n(162),C=function(){return{}}},function(e,t,n){"use strict";function r(e){function t(e){i=o({},i,e);for(var t=0;t<a.length;t++)a[t]()}function n(){return i}function r(e){return a.push(e),function(){var t=a.indexOf(e);a.splice(t,1)}}var i=e,a=[];return{setState:t,getState:n,subscribe:r}}Object.defineProperty(t,"__esModule",{value:!0});var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e};t.default=r},function(e,t){window.MutationObserver=window.MutationObserver||function(e){function t(e){this.i=[],this.m=e}function n(e){!function n(){var r=e.takeRecords();r.length&&e.m(r,e),e.h=setTimeout(n,t._period)}()}function r(t){var n,r={type:null,target:null,addedNodes:[],removedNodes:[],previousSibling:null,nextSibling:null,attributeName:null,attributeNamespace:null,oldValue:null};for(n in t)r[n]!==e&&t[n]!==e&&(r[n]=t[n]);return r}function o(e,t){var n=l(e,t);return function(o){var i,a=o.length;t.a&&3===e.nodeType&&e.nodeValue!==n.a&&o.push(new r({type:"characterData",target:e,oldValue:n.a})),t.b&&n.b&&c(o,e,n.b,t.f),(t.c||t.g)&&(i=s(o,e,n,t)),(i||o.length!==a)&&(n=l(e,t))}}function i(e,t){return t.value}function a(e,t){return"style"!==t.name?t.value:e.style.cssText}function c(t,n,o,i){for(var a,c,s={},l=n.attributes,u=l.length;u--;)a=l[u],c=a.name,i&&i[c]===e||(v(n,a)!==o[c]&&t.push(r({type:"attributes",target:n,attributeName:c,oldValue:o[c],attributeNamespace:a.namespaceURI})),s[c]=!0);for(c in o)s[c]||t.push(r({target:n,type:"attributes",attributeName:c,oldValue:o[c]}))}function s(t,n,o,i){function a(e,n,o,a,l){var u=e.length-1;l=-~((u-l)/2);for(var p,f,h;h=e.pop();)p=o[h.j],f=a[h.l],i.c&&l&&Math.abs(h.j-h.l)>=u&&(t.push(r({type:"childList",target:n,addedNodes:[p],removedNodes:[p],nextSibling:p.nextSibling,previousSibling:p.previousSibling})),l--),i.b&&f.b&&c(t,p,f.b,i.f),i.a&&3===p.nodeType&&p.nodeValue!==f.a&&t.push(r({type:"characterData",target:p,oldValue:f.a})),i.g&&s(p,f)}function s(n,o){for(var p,f,d,v,m,y=n.childNodes,g=o.c,b=y.length,C=g?g.length:0,w=0,S=0,x=0;S<b||x<C;)v=y[S],m=(d=g[x])&&d.node,v===m?(i.b&&d.b&&c(t,v,d.b,i.f),i.a&&d.a!==e&&v.nodeValue!==d.a&&t.push(r({type:"characterData",target:v,oldValue:d.a})),f&&a(f,n,y,g,w),i.g&&(v.childNodes.length||d.c&&d.c.length)&&s(v,d),S++,x++):(l=!0,p||(p={},f=[]),v&&(p[d=u(v)]||(p[d]=!0,-1===(d=h(g,v,x,"node"))?i.c&&(t.push(r({type:"childList",target:n,addedNodes:[v],nextSibling:v.nextSibling,previousSibling:v.previousSibling})),w++):f.push({j:S,l:d})),S++),m&&m!==y[S]&&(p[d=u(m)]||(p[d]=!0,-1===(d=h(y,m,S))?i.c&&(t.push(r({type:"childList",target:o.node,removedNodes:[m],nextSibling:g[x+1],previousSibling:g[x-1]})),w--):f.push({j:d,l:x})),x++));f&&a(f,n,y,g,w)}var l;return s(n,o),l}function l(e,t){var n=!0;return function e(r){var o={node:r};return!t.a||3!==r.nodeType&&8!==r.nodeType?(t.b&&n&&1===r.nodeType&&(o.b=f(r.attributes,function(e,n){return t.f&&!t.f[n.name]||(e[n.name]=v(r,n)),e})),n&&(t.c||t.a||t.b&&t.g)&&(o.c=p(r.childNodes,e)),n=t.g):o.a=r.nodeValue,o}(e)}function u(e){try{return e.id||(e.mo_id=e.mo_id||m++)}catch(t){try{return e.nodeValue}catch(e){return m++}}}function p(e,t){for(var n=[],r=0;r<e.length;r++)n[r]=t(e[r],r,e);return n}function f(e,t){for(var n={},r=0;r<e.length;r++)n=t(n,e[r],r,e);return n}function h(e,t,n,r){for(;n<e.length;n++)if((r?e[n][r]:e[n])===t)return n;return-1}t._period=30,t.prototype={observe:function(e,t){for(var r={b:!!(t.attributes||t.attributeFilter||t.attributeOldValue),c:!!t.childList,g:!!t.subtree,a:!(!t.characterData&&!t.characterDataOldValue)},i=this.i,a=0;a<i.length;a++)i[a].s===e&&i.splice(a,1);t.attributeFilter&&(r.f=f(t.attributeFilter,function(e,t){return e[t]=!0,e})),i.push({s:e,o:o(e,r)}),this.h||n(this)},takeRecords:function(){for(var e=[],t=this.i,n=0;n<t.length;n++)t[n].o(e);return e},disconnect:function(){this.i=[],clearTimeout(this.h),this.h=null}};var d=document.createElement("i");d.style.top=0;var v=(d="null"!=d.attributes.style.value)?i:a,m=1;return t}(void 0)},function(e,t,n){"use strict";function r(e,t,n){n=n||{},9===t.nodeType&&(t=o.getWindow(t));var r=n.allowHorizontalScroll,i=n.onlyScrollIfNeeded,a=n.alignWithTop,c=n.alignWithLeft,s=n.offsetTop||0,l=n.offsetLeft||0,u=n.offsetBottom||0,p=n.offsetRight||0;r=void 0===r||r;var f=o.isWindow(t),h=o.offset(e),d=o.outerHeight(e),v=o.outerWidth(e),m=void 0,y=void 0,g=void 0,b=void 0,C=void 0,w=void 0,S=void 0,x=void 0,M=void 0,z=void 0;f?(S=t,z=o.height(S),M=o.width(S),x={left:o.scrollLeft(S),top:o.scrollTop(S)},C={left:h.left-x.left-l,top:h.top-x.top-s},w={left:h.left+v-(x.left+M)+p,top:h.top+d-(x.top+z)+u},b=x):(m=o.offset(t),y=t.clientHeight,g=t.clientWidth,b={left:t.scrollLeft,top:t.scrollTop},C={left:h.left-(m.left+(parseFloat(o.css(t,"borderLeftWidth"))||0))-l,top:h.top-(m.top+(parseFloat(o.css(t,"borderTopWidth"))||0))-s},w={left:h.left+v-(m.left+g+(parseFloat(o.css(t,"borderRightWidth"))||0))+p,top:h.top+d-(m.top+y+(parseFloat(o.css(t,"borderBottomWidth"))||0))+u}),C.top<0||w.top>0?!0===a?o.scrollTop(t,b.top+C.top):!1===a?o.scrollTop(t,b.top+w.top):C.top<0?o.scrollTop(t,b.top+C.top):o.scrollTop(t,b.top+w.top):i||(a=void 0===a||!!a,a?o.scrollTop(t,b.top+C.top):o.scrollTop(t,b.top+w.top)),r&&(C.left<0||w.left>0?!0===c?o.scrollLeft(t,b.left+C.left):!1===c?o.scrollLeft(t,b.left+w.left):C.left<0?o.scrollLeft(t,b.left+C.left):o.scrollLeft(t,b.left+w.left):i||(c=void 0===c||!!c,c?o.scrollLeft(t,b.left+C.left):o.scrollLeft(t,b.left+w.left)))}var o=n(287);e.exports=r},function(e,t,n){"use strict";function r(e){var t=void 0,n=void 0,r=void 0,o=e.ownerDocument,i=o.body,a=o&&o.documentElement;return t=e.getBoundingClientRect(),n=t.left,r=t.top,n-=a.clientLeft||i.clientLeft||0,r-=a.clientTop||i.clientTop||0,{left:n,top:r}}function o(e,t){var n=e["page"+(t?"Y":"X")+"Offset"],r="scroll"+(t?"Top":"Left");if("number"!=typeof n){var o=e.document;n=o.documentElement[r],"number"!=typeof n&&(n=o.body[r])}return n}function i(e){return o(e)}function a(e){return o(e,!0)}function c(e){var t=r(e),n=e.ownerDocument,o=n.defaultView||n.parentWindow;return t.left+=i(o),t.top+=a(o),t}function s(e,t,n){var r="",o=e.ownerDocument,i=n||o.defaultView.getComputedStyle(e,null);return i&&(r=i.getPropertyValue(t)||i[t]),r}function l(e,t){var n=e[M]&&e[M][t];if(S.test(n)&&!x.test(t)){var r=e.style,o=r[k],i=e[z][k];e[z][k]=e[M][k],r[k]="fontSize"===t?"1em":n||0,n=r.pixelLeft+_,r[k]=o,e[z][k]=i}return""===n?"auto":n}function u(e,t){for(var n=0;n<e.length;n++)t(e[n])}function p(e){return"border-box"===O(e,"boxSizing")}function f(e,t,n){var r={},o=e.style,i=void 0;for(i in t)t.hasOwnProperty(i)&&(r[i]=o[i],o[i]=t[i]);n.call(e);for(i in t)t.hasOwnProperty(i)&&(o[i]=r[i])}function h(e,t,n){var r=0,o=void 0,i=void 0,a=void 0;for(i=0;i<t.length;i++)if(o=t[i])for(a=0;a<n.length;a++){var c=void 0;c="border"===o?o+n[a]+"Width":o+n[a],r+=parseFloat(O(e,c))||0}return r}function d(e){return null!=e&&e==e.window}function v(e,t,n){if(d(e))return"width"===t?P.viewportWidth(e):P.viewportHeight(e);if(9===e.nodeType)return"width"===t?P.docWidth(e):P.docHeight(e);var r="width"===t?["Left","Right"]:["Top","Bottom"],o="width"===t?e.offsetWidth:e.offsetHeight,i=O(e),a=p(e,i),c=0;(null==o||o<=0)&&(o=void 0,c=O(e,t),(null==c||Number(c)<0)&&(c=e.style[t]||0),c=parseFloat(c)||0),void 0===n&&(n=a?V:T);var s=void 0!==o||a,l=o||c;if(n===T)return s?l-h(e,["border","padding"],r,i):c;if(s){var u=n===N?-h(e,["border"],r,i):h(e,["margin"],r,i);return l+(n===V?0:u)}return c+h(e,E.slice(n),r,i)}function m(e){var t=void 0,n=arguments;return 0!==e.offsetWidth?t=v.apply(void 0,n):f(e,H,function(){t=v.apply(void 0,n)}),t}function y(e,t,n){var r=n;{if("object"!==(void 0===t?"undefined":C(t)))return void 0!==r?("number"==typeof r&&(r+="px"),void(e.style[t]=r)):O(e,t);for(var o in t)t.hasOwnProperty(o)&&y(e,o,t[o])}}function g(e,t){"static"===y(e,"position")&&(e.style.position="relative");var n=c(e),r={},o=void 0,i=void 0;for(i in t)t.hasOwnProperty(i)&&(o=parseFloat(y(e,i))||0,r[i]=o+t[i]-n[i]);y(e,r)}var b=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},C="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},w=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,S=new RegExp("^("+w+")(?!px)[a-z%]+$","i"),x=/^(top|right|bottom|left)$/,M="currentStyle",z="runtimeStyle",k="left",_="px",O=void 0;"undefined"!=typeof window&&(O=window.getComputedStyle?s:l);var E=["margin","border","padding"],T=-1,N=2,V=1,P={};u(["Width","Height"],function(e){P["doc"+e]=function(t){var n=t.document;return Math.max(n.documentElement["scroll"+e],n.body["scroll"+e],P["viewport"+e](n))},P["viewport"+e]=function(t){var n="client"+e,r=t.document,o=r.body,i=r.documentElement,a=i[n];return"CSS1Compat"===r.compatMode&&a||o&&o[n]||a}});var H={position:"absolute",visibility:"hidden",display:"block"};u(["width","height"],function(e){var t=e.charAt(0).toUpperCase()+e.slice(1);P["outer"+t]=function(t,n){return t&&m(t,e,n?0:V)};var n="width"===e?["Left","Right"]:["Top","Bottom"];P[e]=function(t,r){if(void 0===r)return t&&m(t,e,T);if(t){var o=O(t);return p(t)&&(r+=h(t,["padding","border"],n,o)),y(t,e,r)}}}),e.exports=b({getWindow:function(e){var t=e.ownerDocument||e;return t.defaultView||t.parentWindow},offset:function(e,t){if(void 0===t)return c(e);g(e,t)},isWindow:d,each:u,css:y,clone:function(e){var t={};for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);if(e.overflow)for(var n in e)e.hasOwnProperty(n)&&(t.overflow[n]=e.overflow[n]);return t},scrollLeft:function(e,t){if(d(e)){if(void 0===t)return i(e);window.scrollTo(t,a(e))}else{if(void 0===t)return e.scrollLeft;e.scrollLeft=t}},scrollTop:function(e,t){if(d(e)){if(void 0===t)return a(e);window.scrollTo(i(e),t)}else{if(void 0===t)return e.scrollTop;e.scrollTop=t}},viewportWidth:0,viewportHeight:0},P)},function(e,t,n){"use strict";function r(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];return{tag:"svg",attrs:{viewBox:e},children:t.map(function(e){return Array.isArray(e)?{tag:"path",attrs:{fill:e[0],d:e[1]}}:{tag:"path",attrs:{d:e}}})}}function o(e,t,n){return{name:e,theme:t,icon:n}}Object.defineProperty(t,"__esModule",{value:!0});var i="0 0 1024 1024",a="64 64 896 896",c="fill",s="outline",l="twotone";t.AlertFill=o("alert",c,r(a,"M512 244c176.18 0 319 142.82 319 319v233a32 32 0 0 1-32 32H225a32 32 0 0 1-32-32V563c0-176.18 142.82-319 319-319zM484 68h56a8 8 0 0 1 8 8v96a8 8 0 0 1-8 8h-56a8 8 0 0 1-8-8V76a8 8 0 0 1 8-8zM177.25 191.66a8 8 0 0 1 11.32 0l67.88 67.88a8 8 0 0 1 0 11.31l-39.6 39.6a8 8 0 0 1-11.31 0l-67.88-67.88a8 8 0 0 1 0-11.31l39.6-39.6zm669.6 0l39.6 39.6a8 8 0 0 1 0 11.3l-67.88 67.9a8 8 0 0 1-11.32 0l-39.6-39.6a8 8 0 0 1 0-11.32l67.89-67.88a8 8 0 0 1 11.31 0zM192 892h640a32 32 0 0 1 32 32v24a8 8 0 0 1-8 8H168a8 8 0 0 1-8-8v-24a32 32 0 0 1 32-32zm148-317v253h64V575h-64z")),t.AlipayCircleFill=o("alipay-circle",c,r(a,"M308.6 545.7c-19.8 2-57.1 10.7-77.4 28.6-61 53-24.5 150 99 150 71.8 0 143.5-45.7 199.8-119-80.2-38.9-148.1-66.8-221.4-59.6zm460.5 67c100.1 33.4 154.7 43 166.7 44.8A445.9 445.9 0 0 0 960 512c0-247.4-200.6-448-448-448S64 264.6 64 512s200.6 448 448 448c155.9 0 293.2-79.7 373.5-200.5-75.6-29.8-213.6-85-286.8-120.1-69.9 85.7-160.1 137.8-253.7 137.8-158.4 0-212.1-138.1-137.2-229 16.3-19.8 44.2-38.7 87.3-49.4 67.5-16.5 175 10.3 275.7 43.4 18.1-33.3 33.4-69.9 44.7-108.9H305.1V402h160v-56.2H271.3v-31.3h193.8v-80.1s0-13.5 13.7-13.5H557v93.6h191.7v31.3H557.1V402h156.4c-15 61.1-37.7 117.4-66.2 166.8 47.5 17.1 90.1 33.3 121.8 43.9z")),t.AlipaySquareFill=o("alipay-square",c,r(a,"M308.6 545.7c-19.8 2-57.1 10.7-77.4 28.6-61 53-24.5 150 99 150 71.8 0 143.5-45.7 199.8-119-80.2-38.9-148.1-66.8-221.4-59.6zM880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm29.4 663.2S703 689.4 598.7 639.5C528.8 725.2 438.6 777.3 345 777.3c-158.4 0-212.1-138.1-137.2-229 16.3-19.8 44.2-38.7 87.3-49.4 67.5-16.5 175 10.3 275.7 43.4 18.1-33.3 33.4-69.9 44.7-108.9H305.1V402h160v-56.2H271.3v-31.3h193.8v-80.1s0-13.5 13.7-13.5H557v93.6h191.7v31.3H557.1V402h156.4c-15 61.1-37.7 117.4-66.2 166.8 47.5 17.1 90.1 33.3 121.8 43.9 114.3 38.2 140.2 40.2 140.2 40.2v122.3z")),t.AliwangwangFill=o("aliwangwang",c,r(a,"M868.2 377.4c-18.9-45.1-46.3-85.6-81.2-120.6a377.26 377.26 0 0 0-120.5-81.2A375.65 375.65 0 0 0 519 145.8c-41.9 0-82.9 6.7-121.9 20C306 123.3 200.8 120 170.6 120c-2.2 0-7.4 0-9.4.2-11.9.4-22.8 6.5-29.2 16.4-6.5 9.9-7.7 22.4-3.4 33.5l64.3 161.6a378.59 378.59 0 0 0-52.8 193.2c0 51.4 10 101 29.8 147.6 18.9 45 46.2 85.6 81.2 120.5 34.7 34.8 75.4 62.1 120.5 81.2C418.3 894 467.9 904 519 904c51.3 0 100.9-10 147.7-29.8 44.9-18.9 85.5-46.3 120.4-81.2 34.7-34.8 62.1-75.4 81.2-120.6a376.5 376.5 0 0 0 29.8-147.6c-.2-51.2-10.1-100.8-29.9-147.4zm-325.2 79c0 20.4-16.6 37.1-37.1 37.1-20.4 0-37.1-16.7-37.1-37.1v-55.1c0-20.4 16.6-37.1 37.1-37.1 20.4 0 37.1 16.6 37.1 37.1v55.1zm175.2 0c0 20.4-16.6 37.1-37.1 37.1S644 476.8 644 456.4v-55.1c0-20.4 16.7-37.1 37.1-37.1 20.4 0 37.1 16.6 37.1 37.1v55.1z")),t.AccountBookFill=o("account-book",c,r(a,"M880 184H712v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H384v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H144c-17.7 0-32 14.3-32 32v664c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V216c0-17.7-14.3-32-32-32zM648.3 426.8l-87.7 161.1h45.7c5.5 0 10 4.5 10 10v21.3c0 5.5-4.5 10-10 10h-63.4v29.7h63.4c5.5 0 10 4.5 10 10v21.3c0 5.5-4.5 10-10 10h-63.4V752c0 5.5-4.5 10-10 10h-41.3c-5.5 0-10-4.5-10-10v-51.8h-63.1c-5.5 0-10-4.5-10-10v-21.3c0-5.5 4.5-10 10-10h63.1v-29.7h-63.1c-5.5 0-10-4.5-10-10v-21.3c0-5.5 4.5-10 10-10h45.2l-88-161.1c-2.6-4.8-.9-10.9 4-13.6 1.5-.8 3.1-1.2 4.8-1.2h46c3.8 0 7.2 2.1 8.9 5.5l72.9 144.3 73.2-144.3a10 10 0 0 1 8.9-5.5h45c5.5 0 10 4.5 10 10 .1 1.7-.3 3.3-1.1 4.8z")),t.AmazonCircleFill=o("amazon-circle",c,r(a,"M485 467.5c-11.6 4.9-20.9 12.2-27.8 22-6.9 9.8-10.4 21.6-10.4 35.5 0 17.8 7.5 31.5 22.4 41.2 14.1 9.1 28.9 11.4 44.4 6.8 17.9-5.2 30-17.9 36.4-38.1 3-9.3 4.5-19.7 4.5-31.3v-50.2c-12.6.4-24.4 1.6-35.5 3.7-11.1 2.1-22.4 5.6-34 10.4zM512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm35.8 262.7c-7.2-10.9-20.1-16.4-38.7-16.4-1.3 0-3 .1-5.3.3-2.2.2-6.6 1.5-12.9 3.7a79.4 79.4 0 0 0-17.9 9.1c-5.5 3.8-11.5 10-18 18.4-6.4 8.5-11.5 18.4-15.3 29.8l-94-8.4c0-12.4 2.4-24.7 7-36.9 4.7-12.2 11.8-23.9 21.4-35 9.6-11.2 21.1-21 34.5-29.4 13.4-8.5 29.6-15.2 48.4-20.3 18.9-5.1 39.1-7.6 60.9-7.6 21.3 0 40.6 2.6 57.8 7.7 17.2 5.2 31.1 11.5 41.4 19.1a117 117 0 0 1 25.9 25.7c6.9 9.6 11.7 18.5 14.4 26.7 2.7 8.2 4 15.7 4 22.8v182.5c0 6.4 1.4 13 4.3 19.8 2.9 6.8 6.3 12.8 10.2 18 3.9 5.2 7.9 9.9 12 14.3 4.1 4.3 7.6 7.7 10.6 9.9l4.1 3.4-72.5 69.4c-8.5-7.7-16.9-15.4-25.2-23.4-8.3-8-14.5-14-18.5-18.1l-6.1-6.2c-2.4-2.3-5-5.7-8-10.2-8.1 12.2-18.5 22.8-31.1 31.8-12.7 9-26.3 15.6-40.7 19.7-14.5 4.1-29.4 6.5-44.7 7.1-15.3.6-30-1.5-43.9-6.5-13.9-5-26.5-11.7-37.6-20.3-11.1-8.6-19.9-20.2-26.5-35-6.6-14.8-9.9-31.5-9.9-50.4 0-17.4 3-33.3 8.9-47.7 6-14.5 13.6-26.5 23-36.1 9.4-9.6 20.7-18.2 34-25.7s26.4-13.4 39.2-17.7c12.8-4.2 26.6-7.8 41.5-10.7 14.9-2.9 27.6-4.8 38.2-5.7 10.6-.9 21.2-1.6 31.8-2v-39.4c0-13.5-2.3-23.5-6.7-30.1zm180.5 379.6c-2.8 3.3-7.5 7.8-14.1 13.5s-16.8 12.7-30.5 21.1c-13.7 8.4-28.8 16-45 22.9-16.3 6.9-36.3 12.9-60.1 18-23.7 5.1-48.2 7.6-73.3 7.6-25.4 0-50.7-3.2-76.1-9.6-25.4-6.4-47.6-14.3-66.8-23.7-19.1-9.4-37.6-20.2-55.1-32.2-17.6-12.1-31.7-22.9-42.4-32.5-10.6-9.6-19.6-18.7-26.8-27.1-1.7-1.9-2.8-3.6-3.2-5.1-.4-1.5-.3-2.8.3-3.7.6-.9 1.5-1.6 2.6-2.2a7.42 7.42 0 0 1 7.4.8c40.9 24.2 72.9 41.3 95.9 51.4 82.9 36.4 168 45.7 255.3 27.9 40.5-8.3 82.1-22.2 124.9-41.8 3.2-1.2 6-1.5 8.3-.9 2.3.6 3.5 2.4 3.5 5.4 0 2.8-1.6 6.3-4.8 10.2zm59.9-29c-1.8 11.1-4.9 21.6-9.1 31.8-7.2 17.1-16.3 30-27.1 38.4-3.6 2.9-6.4 3.8-8.3 2.8-1.9-1-1.9-3.5 0-7.4 4.5-9.3 9.2-21.8 14.2-37.7 5-15.8 5.7-26 2.1-30.5-1.1-1.5-2.7-2.6-5-3.6-2.2-.9-5.1-1.5-8.6-1.9s-6.7-.6-9.4-.8c-2.8-.2-6.5-.2-11.2 0-4.7.2-8 .4-10.1.6a874.4 874.4 0 0 1-17.1 1.5c-1.3.2-2.7.4-4.1.5-1.5.1-2.7.2-3.5.3l-2.7.3c-1 .1-1.7.2-2.2.2h-3.2l-1-.2-.6-.5-.5-.9c-1.3-3.3 3.7-7.4 15-12.4s22.3-8.1 32.9-9.3c9.8-1.5 21.3-1.5 34.5-.3s21.3 3.7 24.3 7.4c2.3 3.5 2.5 10.7.7 21.7z")),t.AmazonSquareFill=o("amazon-square",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM547.8 326.7c-7.2-10.9-20.1-16.4-38.7-16.4-1.3 0-3 .1-5.3.3-2.2.2-6.6 1.5-12.9 3.7a79.4 79.4 0 0 0-17.9 9.1c-5.5 3.8-11.5 10-18 18.4-6.4 8.5-11.5 18.4-15.3 29.8l-94-8.4c0-12.4 2.4-24.7 7-36.9s11.8-23.9 21.4-35c9.6-11.2 21.1-21 34.5-29.4 13.4-8.5 29.6-15.2 48.4-20.3 18.9-5.1 39.1-7.6 60.9-7.6 21.3 0 40.6 2.6 57.8 7.7 17.2 5.2 31.1 11.5 41.4 19.1a117 117 0 0 1 25.9 25.7c6.9 9.6 11.7 18.5 14.4 26.7 2.7 8.2 4 15.7 4 22.8v182.5c0 6.4 1.4 13 4.3 19.8 2.9 6.8 6.3 12.8 10.2 18 3.9 5.2 7.9 9.9 12 14.3 4.1 4.3 7.6 7.7 10.6 9.9l4.1 3.4-72.5 69.4c-8.5-7.7-16.9-15.4-25.2-23.4-8.3-8-14.5-14-18.5-18.1l-6.1-6.2c-2.4-2.3-5-5.7-8-10.2-8.1 12.2-18.5 22.8-31.1 31.8-12.7 9-26.3 15.6-40.7 19.7-14.5 4.1-29.4 6.5-44.7 7.1-15.3.6-30-1.5-43.9-6.5-13.9-5-26.5-11.7-37.6-20.3-11.1-8.6-19.9-20.2-26.5-35-6.6-14.8-9.9-31.5-9.9-50.4 0-17.4 3-33.3 8.9-47.7 6-14.5 13.6-26.5 23-36.1 9.4-9.6 20.7-18.2 34-25.7s26.4-13.4 39.2-17.7c12.8-4.2 26.6-7.8 41.5-10.7 14.9-2.9 27.6-4.8 38.2-5.7 10.6-.9 21.2-1.6 31.8-2v-39.4c0-13.5-2.3-23.5-6.7-30.1zm180.5 379.6c-2.8 3.3-7.5 7.8-14.1 13.5s-16.8 12.7-30.5 21.1c-13.7 8.4-28.8 16-45 22.9-16.3 6.9-36.3 12.9-60.1 18-23.7 5.1-48.2 7.6-73.3 7.6-25.4 0-50.7-3.2-76.1-9.6-25.4-6.4-47.6-14.3-66.8-23.7-19.1-9.4-37.6-20.2-55.1-32.2-17.6-12.1-31.7-22.9-42.4-32.5-10.6-9.6-19.6-18.7-26.8-27.1-1.7-1.9-2.8-3.6-3.2-5.1-.4-1.5-.3-2.8.3-3.7.6-.9 1.5-1.6 2.6-2.2a7.42 7.42 0 0 1 7.4.8c40.9 24.2 72.9 41.3 95.9 51.4 82.9 36.4 168 45.7 255.3 27.9 40.5-8.3 82.1-22.2 124.9-41.8 3.2-1.2 6-1.5 8.3-.9 2.3.6 3.5 2.4 3.5 5.4 0 2.8-1.6 6.3-4.8 10.2zm59.9-29c-1.8 11.1-4.9 21.6-9.1 31.8-7.2 17.1-16.3 30-27.1 38.4-3.6 2.9-6.4 3.8-8.3 2.8-1.9-1-1.9-3.5 0-7.4 4.5-9.3 9.2-21.8 14.2-37.7 5-15.8 5.7-26 2.1-30.5-1.1-1.5-2.7-2.6-5-3.6-2.2-.9-5.1-1.5-8.6-1.9s-6.7-.6-9.4-.8c-2.8-.2-6.5-.2-11.2 0-4.7.2-8 .4-10.1.6a874.4 874.4 0 0 1-17.1 1.5c-1.3.2-2.7.4-4.1.5-1.5.1-2.7.2-3.5.3l-2.7.3c-1 .1-1.7.2-2.2.2h-3.2l-1-.2-.6-.5-.5-.9c-1.3-3.3 3.7-7.4 15-12.4s22.3-8.1 32.9-9.3c9.8-1.5 21.3-1.5 34.5-.3s21.3 3.7 24.3 7.4c2.3 3.5 2.5 10.7.7 21.7zM485 467.5c-11.6 4.9-20.9 12.2-27.8 22-6.9 9.8-10.4 21.6-10.4 35.5 0 17.8 7.5 31.5 22.4 41.2 14.1 9.1 28.9 11.4 44.4 6.8 17.9-5.2 30-17.9 36.4-38.1 3-9.3 4.5-19.7 4.5-31.3v-50.2c-12.6.4-24.4 1.6-35.5 3.7-11.1 2.1-22.4 5.6-34 10.4z")),t.AndroidFill=o("android",c,r(a,"M270.1 741.7c0 23.4 19.1 42.5 42.6 42.5h48.7v120.4c0 30.5 24.5 55.4 54.6 55.4 30.2 0 54.6-24.8 54.6-55.4V784.1h85v120.4c0 30.5 24.5 55.4 54.6 55.4 30.2 0 54.6-24.8 54.6-55.4V784.1h48.7c23.5 0 42.6-19.1 42.6-42.5V346.4h-486v395.3zm357.1-600.1l44.9-65c2.6-3.8 2-8.9-1.5-11.4-3.5-2.4-8.5-1.2-11.1 2.6l-46.6 67.6c-30.7-12.1-64.9-18.8-100.8-18.8-35.9 0-70.1 6.7-100.8 18.8l-46.6-67.5c-2.6-3.8-7.6-5.1-11.1-2.6-3.5 2.4-4.1 7.4-1.5 11.4l44.9 65c-71.4 33.2-121.4 96.1-127.8 169.6h486c-6.6-73.6-56.7-136.5-128-169.7zM409.5 244.1a26.9 26.9 0 1 1 26.9-26.9 26.97 26.97 0 0 1-26.9 26.9zm208.4 0a26.9 26.9 0 1 1 26.9-26.9 26.97 26.97 0 0 1-26.9 26.9zm223.4 100.7c-30.2 0-54.6 24.8-54.6 55.4v216.4c0 30.5 24.5 55.4 54.6 55.4 30.2 0 54.6-24.8 54.6-55.4V400.1c.1-30.6-24.3-55.3-54.6-55.3zm-658.6 0c-30.2 0-54.6 24.8-54.6 55.4v216.4c0 30.5 24.5 55.4 54.6 55.4 30.2 0 54.6-24.8 54.6-55.4V400.1c0-30.6-24.5-55.3-54.6-55.3z")),t.ApiFill=o("api",c,r(a,"M917.7 148.8l-42.4-42.4c-1.6-1.6-3.6-2.3-5.7-2.3s-4.1.8-5.7 2.3l-76.1 76.1a199.27 199.27 0 0 0-112.1-34.3c-51.2 0-102.4 19.5-141.5 58.6L432.3 308.7a8.03 8.03 0 0 0 0 11.3L704 591.7c1.6 1.6 3.6 2.3 5.7 2.3 2 0 4.1-.8 5.7-2.3l101.9-101.9c68.9-69 77-175.7 24.3-253.5l76.1-76.1c3.1-3.2 3.1-8.3 0-11.4zM578.9 546.7a8.03 8.03 0 0 0-11.3 0L501 613.3 410.7 523l66.7-66.7c3.1-3.1 3.1-8.2 0-11.3L441 408.6a8.03 8.03 0 0 0-11.3 0L363 475.3l-43-43a7.85 7.85 0 0 0-5.7-2.3c-2 0-4.1.8-5.7 2.3L206.8 534.2c-68.9 68.9-77 175.7-24.3 253.5l-76.1 76.1a8.03 8.03 0 0 0 0 11.3l42.4 42.4c1.6 1.6 3.6 2.3 5.7 2.3s4.1-.8 5.7-2.3l76.1-76.1c33.7 22.9 72.9 34.3 112.1 34.3 51.2 0 102.4-19.5 141.5-58.6l101.9-101.9c3.1-3.1 3.1-8.2 0-11.3l-43-43 66.7-66.7c3.1-3.1 3.1-8.2 0-11.3l-36.6-36.2z")),t.AppleFill=o("apple",c,r(a,"M747.4 535.7c-.4-68.2 30.5-119.6 92.9-157.5-34.9-50-87.7-77.5-157.3-82.8-65.9-5.2-138 38.4-164.4 38.4-27.9 0-91.7-36.6-141.9-36.6C273.1 298.8 163 379.8 163 544.6c0 48.7 8.9 99 26.7 150.8 23.8 68.2 109.6 235.3 199.1 232.6 46.8-1.1 79.9-33.2 140.8-33.2 59.1 0 89.7 33.2 141.9 33.2 90.3-1.3 167.9-153.2 190.5-221.6-121.1-57.1-114.6-167.2-114.6-170.7zm-105.1-305c50.7-60.2 46.1-115 44.6-134.7-44.8 2.6-96.6 30.5-126.1 64.8-32.5 36.8-51.6 82.3-47.5 133.6 48.4 3.7 92.6-21.2 129-63.7z")),t.AppstoreFill=o("appstore",c,r(a,"M864 144H560c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V160c0-8.8-7.2-16-16-16zm0 400H560c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V560c0-8.8-7.2-16-16-16zM464 144H160c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V160c0-8.8-7.2-16-16-16zm0 400H160c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V560c0-8.8-7.2-16-16-16z")),t.BackwardFill=o("backward",c,r(i,"M448.98 106.1L12.68 481.6c-16.9 15.7-16.9 43.3 0 59l436.2 377.3c24.4 22.8 63.1 4.7 63.1-29.5V135.6c.1-34.1-38.6-52.2-63-29.5zM960.98 106.1l-436.3 375.5c-8.4 7.9-12.6 18.7-12.6 29.5s4.2 21.6 12.6 29.5l436.2 377.3c24.4 22.8 63.1 4.7 63.1-29.5V135.6c.1-34.1-38.6-52.2-63-29.5z")),t.BankFill=o("bank",c,r(a,"M894 462c30.9 0 43.8-39.7 18.7-58L530.8 126.2a31.81 31.81 0 0 0-37.6 0L111.3 404c-25.1 18.2-12.2 58 18.8 58H192v374h-72c-4.4 0-8 3.6-8 8v52c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-52c0-4.4-3.6-8-8-8h-72V462h62zM381 836H264V462h117v374zm189 0H453V462h117v374zm190 0H642V462h118v374z")),t.BehanceCircleFill=o("behance-circle",c,r(a,"M420.3 470.3c8.7-6.3 12.9-16.7 12.9-31 .3-6.8-1.1-13.5-4.1-19.6-2.7-4.9-6.7-9-11.6-11.9a44.8 44.8 0 0 0-16.6-6c-6.4-1.2-12.9-1.8-19.3-1.7h-70.3v79.7h76.1c13.1.1 24.2-3.1 32.9-9.5zm11.8 72c-9.8-7.5-22.9-11.2-39.2-11.2h-81.8v94h80.2c7.5 0 14.4-.7 21.1-2.1a50.5 50.5 0 0 0 17.8-7.2c5.1-3.3 9.2-7.8 12.3-13.6 3-5.8 4.5-13.2 4.5-22.1 0-17.7-5-30.2-14.9-37.8zM512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm86.5 286.9h138.4v33.7H598.5v-33.7zM512 628.8a89.52 89.52 0 0 1-27 31c-11.8 8.2-24.9 14.2-38.8 17.7a167.4 167.4 0 0 1-44.6 5.7H236V342.1h161c16.3 0 31.1 1.5 44.6 4.3 13.4 2.8 24.8 7.6 34.4 14.1 9.5 6.5 17 15.2 22.3 26 5.2 10.7 7.9 24.1 7.9 40 0 17.2-3.9 31.4-11.7 42.9-7.9 11.5-19.3 20.8-34.8 28.1 21.1 6 36.6 16.7 46.8 31.7 10.4 15.2 15.5 33.4 15.5 54.8 0 17.4-3.3 32.3-10 44.8zM790.8 576H612.4c0 19.4 6.7 38 16.8 48 10.2 9.9 24.8 14.9 43.9 14.9 13.8 0 25.5-3.5 35.5-10.4 9.9-6.9 15.9-14.2 18.1-21.8h59.8c-9.6 29.7-24.2 50.9-44 63.7-19.6 12.8-43.6 19.2-71.5 19.2-19.5 0-37-3.2-52.7-9.3-15.1-5.9-28.7-14.9-39.9-26.5a121.2 121.2 0 0 1-25.1-41.2c-6.1-16.9-9.1-34.7-8.9-52.6 0-18.5 3.1-35.7 9.1-51.7 11.5-31.1 35.4-56 65.9-68.9 16.3-6.8 33.8-10.2 51.5-10 21 0 39.2 4 55 12.2a111.6 111.6 0 0 1 38.6 32.8c10.1 13.7 17.2 29.3 21.7 46.9 4.3 17.3 5.8 35.5 4.6 54.7zm-122-95.6c-10.8 0-19.9 1.9-26.9 5.6-7 3.7-12.8 8.3-17.2 13.6a48.4 48.4 0 0 0-9.1 17.4c-1.6 5.3-2.7 10.7-3.1 16.2H723c-1.6-17.3-7.6-30.1-15.6-39.1-8.4-8.9-21.9-13.7-38.6-13.7z")),t.BehanceSquareFill=o("behance-square",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM598.5 350.9h138.4v33.7H598.5v-33.7zM512 628.8a89.52 89.52 0 0 1-27 31c-11.8 8.2-24.9 14.2-38.8 17.7a167.4 167.4 0 0 1-44.6 5.7H236V342.1h161c16.3 0 31.1 1.5 44.6 4.3 13.4 2.8 24.8 7.6 34.4 14.1 9.5 6.5 17 15.2 22.3 26 5.2 10.7 7.9 24.1 7.9 40 0 17.2-3.9 31.4-11.7 42.9-7.9 11.5-19.3 20.8-34.8 28.1 21.1 6 36.6 16.7 46.8 31.7 10.4 15.2 15.5 33.4 15.5 54.8 0 17.4-3.3 32.3-10 44.8zM790.8 576H612.4c0 19.4 6.7 38 16.8 48 10.2 9.9 24.8 14.9 43.9 14.9 13.8 0 25.5-3.5 35.5-10.4 9.9-6.9 15.9-14.2 18.1-21.8h59.8c-9.6 29.7-24.2 50.9-44 63.7-19.6 12.8-43.6 19.2-71.5 19.2-19.5 0-37-3.2-52.7-9.3-15.1-5.9-28.7-14.9-39.9-26.5a121.2 121.2 0 0 1-25.1-41.2c-6.1-16.9-9.1-34.7-8.9-52.6 0-18.5 3.1-35.7 9.1-51.7 11.5-31.1 35.4-56 65.9-68.9 16.3-6.8 33.8-10.2 51.5-10 21 0 39.2 4 55 12.2a111.6 111.6 0 0 1 38.6 32.8c10.1 13.7 17.2 29.3 21.7 46.9 4.3 17.3 5.8 35.5 4.6 54.7zm-122-95.6c-10.8 0-19.9 1.9-26.9 5.6-7 3.7-12.8 8.3-17.2 13.6a48.4 48.4 0 0 0-9.1 17.4c-1.6 5.3-2.7 10.7-3.1 16.2H723c-1.6-17.3-7.6-30.1-15.6-39.1-8.4-8.9-21.9-13.7-38.6-13.7zm-248.5-10.1c8.7-6.3 12.9-16.7 12.9-31 .3-6.8-1.1-13.5-4.1-19.6-2.7-4.9-6.7-9-11.6-11.9a44.8 44.8 0 0 0-16.6-6c-6.4-1.2-12.9-1.8-19.3-1.7h-70.3v79.7h76.1c13.1.1 24.2-3.1 32.9-9.5zm11.8 72c-9.8-7.5-22.9-11.2-39.2-11.2h-81.8v94h80.2c7.5 0 14.4-.7 21.1-2.1s12.7-3.8 17.8-7.2c5.1-3.3 9.2-7.8 12.3-13.6 3-5.8 4.5-13.2 4.5-22.1 0-17.7-5-30.2-14.9-37.8z")),t.AudioFill=o("audio",c,r(a,"M512 624c93.9 0 170-75.2 170-168V232c0-92.8-76.1-168-170-168s-170 75.2-170 168v224c0 92.8 76.1 168 170 168zm330-170c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8 0 140.3-113.7 254-254 254S258 594.3 258 454c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8 0 168.7 126.6 307.9 290 327.6V884H326.7c-13.7 0-24.7 14.3-24.7 32v36c0 4.4 2.8 8 6.2 8h407.6c3.4 0 6.2-3.6 6.2-8v-36c0-17.7-11-32-24.7-32H548V782.1c165.3-18 294-158 294-328.1z")),t.BellFill=o("bell",c,r(a,"M816 768h-24V428c0-141.1-104.3-257.8-240-277.2V112c0-22.1-17.9-40-40-40s-40 17.9-40 40v38.8C336.3 170.2 232 286.9 232 428v340h-24c-17.7 0-32 14.3-32 32v32c0 4.4 3.6 8 8 8h216c0 61.8 50.2 112 112 112s112-50.2 112-112h216c4.4 0 8-3.6 8-8v-32c0-17.7-14.3-32-32-32zM512 888c-26.5 0-48-21.5-48-48h96c0 26.5-21.5 48-48 48z")),t.BookFill=o("book",c,r(a,"M832 64H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V96c0-17.7-14.3-32-32-32zM668 345.9L621.5 312 572 347.4V124h96v221.9z")),t.BoxPlotFill=o("box-plot",c,r(a,"M952 224h-52c-4.4 0-8 3.6-8 8v248h-92V304c0-4.4-3.6-8-8-8H448v432h344c4.4 0 8-3.6 8-8V548h92v244c0 4.4 3.6 8 8 8h52c4.4 0 8-3.6 8-8V232c0-4.4-3.6-8-8-8zm-728 80v176h-92V232c0-4.4-3.6-8-8-8H72c-4.4 0-8 3.6-8 8v560c0 4.4 3.6 8 8 8h52c4.4 0 8-3.6 8-8V548h92v172c0 4.4 3.6 8 8 8h152V296H232c-4.4 0-8 3.6-8 8z")),t.BuildFill=o("build",c,r(a,"M916 210H376c-17.7 0-32 14.3-32 32v236H108c-17.7 0-32 14.3-32 32v272c0 17.7 14.3 32 32 32h540c17.7 0 32-14.3 32-32V546h236c17.7 0 32-14.3 32-32V242c0-17.7-14.3-32-32-32zM612 746H412V546h200v200zm268-268H680V278h200v200z")),t.BulbFill=o("bulb",c,r(a,"M348 676.1C250 619.4 184 513.4 184 392c0-181.1 146.9-328 328-328s328 146.9 328 328c0 121.4-66 227.4-164 284.1V792c0 17.7-14.3 32-32 32H380c-17.7 0-32-14.3-32-32V676.1zM392 888h240c4.4 0 8 3.6 8 8v32c0 17.7-14.3 32-32 32H416c-17.7 0-32-14.3-32-32v-32c0-4.4 3.6-8 8-8z")),t.CalculatorFill=o("calculator",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM440.2 765h-50.8c-2.2 0-4.5-1.1-5.9-2.9L348 718.6l-35.5 43.5a7.38 7.38 0 0 1-5.9 2.9h-50.8c-6.6 0-10.2-7.9-5.8-13.1l62.7-76.8-61.2-74.9c-4.3-5.2-.7-13.1 5.9-13.1h50.9c2.2 0 4.5 1.1 5.9 2.9l34 41.6 34-41.6c1.5-1.9 3.6-2.9 5.9-2.9h50.8c6.6 0 10.2 7.9 5.9 13.1L383.5 675l62.7 76.8c4.2 5.3.6 13.2-6 13.2zm7.8-382c0 2.2-1.4 4-3.2 4H376v68.7c0 1.9-1.8 3.3-4 3.3h-48c-2.2 0-4-1.4-4-3.2V387h-68.8c-1.8 0-3.2-1.8-3.2-4v-48c0-2.2 1.4-4 3.2-4H320v-68.8c0-1.8 1.8-3.2 4-3.2h48c2.2 0 4 1.4 4 3.2V331h68.7c1.9 0 3.3 1.8 3.3 4v48zm328 369c0 2.2-1.4 4-3.2 4H579.2c-1.8 0-3.2-1.8-3.2-4v-48c0-2.2 1.4-4 3.2-4h193.5c1.9 0 3.3 1.8 3.3 4v48zm0-104c0 2.2-1.4 4-3.2 4H579.2c-1.8 0-3.2-1.8-3.2-4v-48c0-2.2 1.4-4 3.2-4h193.5c1.9 0 3.3 1.8 3.3 4v48zm0-265c0 2.2-1.4 4-3.2 4H579.2c-1.8 0-3.2-1.8-3.2-4v-48c0-2.2 1.4-4 3.2-4h193.5c1.9 0 3.3 1.8 3.3 4v48z")),t.CalendarFill=o("calendar",c,r(a,"M112 880c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V460H112v420zm768-696H712v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H384v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H144c-17.7 0-32 14.3-32 32v176h800V216c0-17.7-14.3-32-32-32z")),t.CarFill=o("car",c,r(a,"M959 413.4L935.3 372a8 8 0 0 0-10.9-2.9l-50.7 29.6-78.3-216.2a63.9 63.9 0 0 0-60.9-44.4H301.2c-34.7 0-65.5 22.4-76.2 55.5l-74.6 205.2-50.8-29.6a8 8 0 0 0-10.9 2.9L65 413.4c-2.2 3.8-.9 8.6 2.9 10.8l60.4 35.2-14.5 40c-1.2 3.2-1.8 6.6-1.8 10v348.2c0 15.7 11.8 28.4 26.3 28.4h67.6c12.3 0 23-9.3 25.6-22.3l7.7-37.7h545.6l7.7 37.7c2.7 13 13.3 22.3 25.6 22.3h67.6c14.5 0 26.3-12.7 26.3-28.4V509.4c0-3.4-.6-6.8-1.8-10l-14.5-40 60.3-35.2a8 8 0 0 0 3-10.8zM264 621c-22.1 0-40-17.9-40-40s17.9-40 40-40 40 17.9 40 40-17.9 40-40 40zm388 75c0 4.4-3.6 8-8 8H380c-4.4 0-8-3.6-8-8v-84c0-4.4 3.6-8 8-8h40c4.4 0 8 3.6 8 8v36h168v-36c0-4.4 3.6-8 8-8h40c4.4 0 8 3.6 8 8v84zm108-75c-22.1 0-40-17.9-40-40s17.9-40 40-40 40 17.9 40 40-17.9 40-40 40zM220 418l72.7-199.9.5-1.3.4-1.3c1.1-3.3 4.1-5.5 7.6-5.5h427.6l75.4 208H220z")),t.CaretDownFill=o("caret-down",c,r(i,"M76.3 392.3l403.1 489.1a42.53 42.53 0 0 0 63.4 0l405.1-489.1c24.4-27.4 5-70.8-31.7-70.8H108.1c-36.8 0-56.3 43.4-31.8 70.8z")),t.CaretLeftFill=o("caret-left",c,r(i,"M631.3 76.3l-489.2 403a42.53 42.53 0 0 0 0 63.4l489.1 405.1c27.4 24.4 70.8 5 70.8-31.7V107.9c0-36.6-43.4-56.1-70.7-31.6z")),t.CameraFill=o("camera",c,r(a,"M864 260H728l-32.4-90.8a32.07 32.07 0 0 0-30.2-21.2H358.6c-13.5 0-25.6 8.5-30.1 21.2L296 260H160c-44.2 0-80 35.8-80 80v456c0 44.2 35.8 80 80 80h704c44.2 0 80-35.8 80-80V340c0-44.2-35.8-80-80-80zM512 716c-88.4 0-160-71.6-160-160s71.6-160 160-160 160 71.6 160 160-71.6 160-160 160zm-96-160a96 96 0 1 0 192 0 96 96 0 1 0-192 0z")),t.CaretRightFill=o("caret-right",c,r(i,"M392.7 76.3l489.1 403.1a42.53 42.53 0 0 1 0 63.4L392.7 947.7c-27.4 24.4-70.8 5-70.8-31.7V107.9c.1-36.6 43.4-56.1 70.8-31.6z")),t.CaretUpFill=o("caret-up",c,r(i,"M76.3 632.8l405.1-489.1a42.53 42.53 0 0 1 63.4 0l403.1 489.1c24.4 27.4 5 70.8-31.7 70.8H107.9c-36.6 0-56.1-43.4-31.6-70.8z")),t.CarryOutFill=o("carry-out",c,r(a,"M880 184H712v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H384v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H144c-17.7 0-32 14.3-32 32v664c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V216c0-17.7-14.3-32-32-32zM694.5 432.7L481.9 725.4a16.1 16.1 0 0 1-26 0l-126.4-174c-3.8-5.3 0-12.7 6.5-12.7h55.2c5.1 0 10 2.5 13 6.6l64.7 89 150.9-207.8c3-4.1 7.8-6.6 13-6.6H688c6.5.1 10.3 7.5 6.5 12.8z")),t.CheckCircleFill=o("check-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm193.5 301.7l-210.6 292a31.8 31.8 0 0 1-51.7 0L318.5 484.9c-3.8-5.3 0-12.7 6.5-12.7h46.9c10.2 0 19.9 4.9 25.9 13.3l71.2 98.8 157.2-218c6-8.3 15.6-13.3 25.9-13.3H699c6.5 0 10.3 7.4 6.5 12.7z")),t.CheckSquareFill=o("check-square",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM695.5 365.7l-210.6 292a31.8 31.8 0 0 1-51.7 0L308.5 484.9c-3.8-5.3 0-12.7 6.5-12.7h46.9c10.2 0 19.9 4.9 25.9 13.3l71.2 98.8 157.2-218c6-8.3 15.6-13.3 25.9-13.3H689c6.5 0 10.3 7.4 6.5 12.7z")),t.ChromeFill=o("chrome",c,r(a,"M371.8 512c0 77.5 62.7 140.2 140.2 140.2S652.2 589.5 652.2 512 589.5 371.8 512 371.8 371.8 434.4 371.8 512zM900 362.4l-234.3 12.1c63.6 74.3 64.6 181.5 11.1 263.7l-188 289.2c78 4.2 158.4-12.9 231.2-55.2 180-104 253-322.1 180-509.8zM320.3 591.9L163.8 284.1A415.35 415.35 0 0 0 96 512c0 208 152.3 380.3 351.4 410.8l106.9-209.4c-96.6 18.2-189.9-34.8-234-121.5zm218.5-285.5l344.4 18.1C848 254.7 792.6 194 719.8 151.7 653.9 113.6 581.5 95.5 510.5 96c-122.5.5-242.2 55.2-322.1 154.5l128.2 196.9c32-91.9 124.8-146.7 222.2-141z")),t.CiCircleFill=o("ci-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm-63.6 656c-103 0-162.4-68.6-162.4-182.6v-49C286 373.5 345.4 304 448.3 304c88.3 0 152.3 56.9 152.3 138.1 0 2.4-2 4.4-4.4 4.4h-52.6c-4.2 0-7.6-3.2-8-7.4-4-46.1-37.6-77.6-87-77.6-61.1 0-95.6 45.4-95.6 126.9v49.3c0 80.3 34.5 125.1 95.6 125.1 49.3 0 82.8-29.5 87-72.4.4-4.1 3.8-7.3 8-7.3h52.7c2.4 0 4.4 2 4.4 4.4 0 77.4-64.3 132.5-152.3 132.5zM738 704.1c0 4.4-3.6 8-8 8h-50.4c-4.4 0-8-3.6-8-8V319.9c0-4.4 3.6-8 8-8H730c4.4 0 8 3.6 8 8v384.2z")),t.ClockCircleFill=o("clock-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm176.5 585.7l-28.6 39a7.99 7.99 0 0 1-11.2 1.7L483.3 569.8a7.92 7.92 0 0 1-3.3-6.5V288c0-4.4 3.6-8 8-8h48.1c4.4 0 8 3.6 8 8v247.5l142.6 103.1c3.6 2.5 4.4 7.5 1.8 11.1z")),t.CloseCircleFill=o("close-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm165.4 618.2l-66-.3L512 563.4l-99.3 118.4-66.1.3c-4.4 0-8-3.5-8-8 0-1.9.7-3.7 1.9-5.2l130.1-155L340.5 359a8.32 8.32 0 0 1-1.9-5.2c0-4.4 3.6-8 8-8l66.1.3L512 464.6l99.3-118.4 66-.3c4.4 0 8 3.5 8 8 0 1.9-.7 3.7-1.9 5.2L553.5 514l130 155c1.2 1.5 1.9 3.3 1.9 5.2 0 4.4-3.6 8-8 8z")),t.CloseSquareFill=o("close-square",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM676.1 657.9c4.4 5.2.7 13.1-6.1 13.1h-58.9c-4.7 0-9.2-2.1-12.3-5.7L512 561.8l-86.8 103.5c-3 3.6-7.5 5.7-12.3 5.7H354c-6.8 0-10.5-7.9-6.1-13.1L470.2 512 347.9 366.1A7.95 7.95 0 0 1 354 353h58.9c4.7 0 9.2 2.1 12.3 5.7L512 462.2l86.8-103.5c3-3.6 7.5-5.7 12.3-5.7H670c6.8 0 10.5 7.9 6.1 13.1L553.8 512l122.3 145.9z")),t.CodeSandboxCircleFill=o("code-sandbox-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm243.7 589.2L512 794 268.3 653.2V371.8l110-63.6-.4-.2h.2L512 231l134 77h-.2l-.3.2 110.1 63.6v281.4zM307.9 536.7l87.6 49.9V681l96.7 55.9V524.8L307.9 418.4zm203.9-151.8L418 331l-91.1 52.6 185.2 107 185.2-106.9-91.4-52.8zm20 352l97.3-56.2v-94.1l87-49.5V418.5L531.8 525z")),t.CloudFill=o("cloud",c,r(a,"M811.4 418.7C765.6 297.9 648.9 212 512.2 212S258.8 297.8 213 418.6C127.3 441.1 64 519.1 64 612c0 110.5 89.5 200 199.9 200h496.2C870.5 812 960 722.5 960 612c0-92.7-63.1-170.7-148.6-193.3z")),t.CodeSandboxSquareFill=o("code-sandbox-square",c,r(a,"M307.9 536.7l87.6 49.9V681l96.7 55.9V524.8L307.9 418.4zM880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM755.7 653.2L512 794 268.3 653.2V371.8l110-63.6-.4-.2h.2L512 231l134 77h-.2l-.3.2 110.1 63.6v281.4zm-223.9 83.7l97.3-56.2v-94.1l87-49.5V418.5L531.8 525zm-20-352L418 331l-91.1 52.6 185.2 107 185.2-106.9-91.4-52.8z")),t.CodeFill=o("code",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM513.1 518.1l-192 161c-5.2 4.4-13.1.7-13.1-6.1v-62.7c0-2.3 1.1-4.6 2.9-6.1L420.7 512l-109.8-92.2a7.63 7.63 0 0 1-2.9-6.1V351c0-6.8 7.9-10.5 13.1-6.1l192 160.9c3.9 3.2 3.9 9.1 0 12.3zM716 673c0 4.4-3.4 8-7.5 8h-185c-4.1 0-7.5-3.6-7.5-8v-48c0-4.4 3.4-8 7.5-8h185c4.1 0 7.5 3.6 7.5 8v48z")),t.CodepenCircleFill=o("codepen-circle",c,r(a,"M488.1 414.7V303.4L300.9 428l83.6 55.8zm254.1 137.7v-79.8l-59.8 39.9zM512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm278 533c0 1.1-.1 2.1-.2 3.1 0 .4-.1.7-.2 1a14.16 14.16 0 0 1-.8 3.2c-.2.6-.4 1.2-.6 1.7-.2.4-.4.8-.5 1.2-.3.5-.5 1.1-.8 1.6-.2.4-.4.7-.7 1.1-.3.5-.7 1-1 1.5-.3.4-.5.7-.8 1-.4.4-.8.9-1.2 1.3-.3.3-.6.6-1 .9-.4.4-.9.8-1.4 1.1-.4.3-.7.6-1.1.8-.1.1-.3.2-.4.3L525.2 786c-4 2.7-8.6 4-13.2 4-4.7 0-9.3-1.4-13.3-4L244.6 616.9c-.1-.1-.3-.2-.4-.3l-1.1-.8c-.5-.4-.9-.7-1.3-1.1-.3-.3-.6-.6-1-.9-.4-.4-.8-.8-1.2-1.3a7 7 0 0 1-.8-1c-.4-.5-.7-1-1-1.5-.2-.4-.5-.7-.7-1.1-.3-.5-.6-1.1-.8-1.6-.2-.4-.4-.8-.5-1.2-.2-.6-.4-1.2-.6-1.7-.1-.4-.3-.8-.4-1.2-.2-.7-.3-1.3-.4-2-.1-.3-.1-.7-.2-1-.1-1-.2-2.1-.2-3.1V427.9c0-1 .1-2.1.2-3.1.1-.3.1-.7.2-1a14.16 14.16 0 0 1 .8-3.2c.2-.6.4-1.2.6-1.7.2-.4.4-.8.5-1.2.2-.5.5-1.1.8-1.6.2-.4.4-.7.7-1.1.6-.9 1.2-1.7 1.8-2.5.4-.4.8-.9 1.2-1.3.3-.3.6-.6 1-.9.4-.4.9-.8 1.3-1.1.4-.3.7-.6 1.1-.8.1-.1.3-.2.4-.3L498.7 239c8-5.3 18.5-5.3 26.5 0l254.1 169.1c.1.1.3.2.4.3l1.1.8 1.4 1.1c.3.3.6.6 1 .9.4.4.8.8 1.2 1.3.7.8 1.3 1.6 1.8 2.5.2.4.5.7.7 1.1.3.5.6 1 .8 1.6.2.4.4.8.5 1.2.2.6.4 1.2.6 1.7.1.4.3.8.4 1.2.2.7.3 1.3.4 2 .1.3.1.7.2 1 .1 1 .2 2.1.2 3.1V597zm-254.1 13.3v111.3L723.1 597l-83.6-55.8zM281.8 472.6v79.8l59.8-39.9zM512 456.1l-84.5 56.4 84.5 56.4 84.5-56.4zM723.1 428L535.9 303.4v111.3l103.6 69.1zM384.5 541.2L300.9 597l187.2 124.6V610.3l-103.6-69.1z")),t.CodepenSquareFill=o("codepen-square",c,r(a,"M723.1 428L535.9 303.4v111.3l103.6 69.1zM512 456.1l-84.5 56.4 84.5 56.4 84.5-56.4zm23.9 154.2v111.3L723.1 597l-83.6-55.8zm-151.4-69.1L300.9 597l187.2 124.6V610.3l-103.6-69.1zM880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-90 485c0 1.1-.1 2.1-.2 3.1 0 .4-.1.7-.2 1a14.16 14.16 0 0 1-.8 3.2c-.2.6-.4 1.2-.6 1.7-.2.4-.4.8-.5 1.2-.3.5-.5 1.1-.8 1.6-.2.4-.4.7-.7 1.1-.3.5-.7 1-1 1.5-.3.4-.5.7-.8 1-.4.4-.8.9-1.2 1.3-.3.3-.6.6-1 .9-.4.4-.9.8-1.4 1.1-.4.3-.7.6-1.1.8-.1.1-.3.2-.4.3L525.2 786c-4 2.7-8.6 4-13.2 4-4.7 0-9.3-1.4-13.3-4L244.6 616.9c-.1-.1-.3-.2-.4-.3l-1.1-.8c-.5-.4-.9-.7-1.3-1.1-.3-.3-.6-.6-1-.9-.4-.4-.8-.8-1.2-1.3a7 7 0 0 1-.8-1c-.4-.5-.7-1-1-1.5-.2-.4-.5-.7-.7-1.1-.3-.5-.6-1.1-.8-1.6-.2-.4-.4-.8-.5-1.2-.2-.6-.4-1.2-.6-1.7-.1-.4-.3-.8-.4-1.2-.2-.7-.3-1.3-.4-2-.1-.3-.1-.7-.2-1-.1-1-.2-2.1-.2-3.1V427.9c0-1 .1-2.1.2-3.1.1-.3.1-.7.2-1a14.16 14.16 0 0 1 .8-3.2c.2-.6.4-1.2.6-1.7.2-.4.4-.8.5-1.2.2-.5.5-1.1.8-1.6.2-.4.4-.7.7-1.1.6-.9 1.2-1.7 1.8-2.5.4-.4.8-.9 1.2-1.3.3-.3.6-.6 1-.9.4-.4.9-.8 1.3-1.1.4-.3.7-.6 1.1-.8.1-.1.3-.2.4-.3L498.7 239c8-5.3 18.5-5.3 26.5 0l254.1 169.1c.1.1.3.2.4.3l1.1.8 1.4 1.1c.3.3.6.6 1 .9.4.4.8.8 1.2 1.3.7.8 1.3 1.6 1.8 2.5.2.4.5.7.7 1.1.3.5.6 1 .8 1.6.2.4.4.8.5 1.2.2.6.4 1.2.6 1.7.1.4.3.8.4 1.2.2.7.3 1.3.4 2 .1.3.1.7.2 1 .1 1 .2 2.1.2 3.1V597zm-47.8-44.6v-79.8l-59.8 39.9zm-460.4-79.8v79.8l59.8-39.9zm206.3-57.9V303.4L300.9 428l83.6 55.8z")),t.ContainerFill=o("container",c,r(a,"M832 64H192c-17.7 0-32 14.3-32 32v529c0-.6.4-1 1-1h219.3l5.2 24.7C397.6 708.5 450.8 752 512 752s114.4-43.5 126.4-103.3l5.2-24.7H863c.6 0 1 .4 1 1V96c0-17.7-14.3-32-32-32zM712 493c0 4.4-3.6 8-8 8H320c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h384c4.4 0 8 3.6 8 8v48zm0-160c0 4.4-3.6 8-8 8H320c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h384c4.4 0 8 3.6 8 8v48zm151 354H694.1c-11.6 32.8-32 62.3-59.1 84.7-34.5 28.6-78.2 44.3-123 44.3s-88.5-15.8-123-44.3a194.02 194.02 0 0 1-59.1-84.7H161c-.6 0-1-.4-1-1v242c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V686c0 .6-.4 1-1 1z")),t.ContactsFill=o("contacts",c,r(a,"M928 224H768v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56H548v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56H328v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56H96c-17.7 0-32 14.3-32 32v576c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V256c0-17.7-14.3-32-32-32zM661 736h-43.9c-4.2 0-7.6-3.3-7.9-7.5-3.8-50.6-46-90.5-97.2-90.5s-93.4 40-97.2 90.5c-.3 4.2-3.7 7.5-7.9 7.5H363a8 8 0 0 1-8-8.4c2.8-53.3 32-99.7 74.6-126.1a111.8 111.8 0 0 1-29.1-75.5c0-61.9 49.9-112 111.4-112 61.5 0 111.4 50.1 111.4 112 0 29.1-11 55.5-29.1 75.5 42.7 26.5 71.8 72.8 74.6 126.1.4 4.6-3.2 8.4-7.8 8.4zM512 474c-28.5 0-51.7 23.3-51.7 52s23.2 52 51.7 52c28.5 0 51.7-23.3 51.7-52s-23.2-52-51.7-52z")),t.CompassFill=o("compass",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zM327.3 702.4c-2 .9-4.4 0-5.3-2.1-.4-1-.4-2.2 0-3.2l98.7-225.5 132.1 132.1-225.5 98.7zm375.1-375.1l-98.7 225.5-132.1-132.1L697.1 322c2-.9 4.4 0 5.3 2.1.4 1 .4 2.1 0 3.2z")),t.ControlFill=o("control",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM404 683v77c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-77c-41.7-13.6-72-52.8-72-99s30.3-85.5 72-99V264c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v221c41.7 13.6 72 52.8 72 99s-30.3 85.5-72 99zm279.6-143.9c.2 0 .3-.1.4-.1v221c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V539c.2 0 .3.1.4.1-42-13.4-72.4-52.7-72.4-99.1 0-46.4 30.4-85.7 72.4-99.1-.2 0-.3.1-.4.1v-77c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v77c-.2 0-.3-.1-.4-.1 42 13.4 72.4 52.7 72.4 99.1 0 46.4-30.4 85.7-72.4 99.1zM616 440a36 36 0 1 0 72 0 36 36 0 1 0-72 0zM403.4 566.5l-1.5-2.4c0-.1-.1-.1-.1-.2l-.9-1.2c-.1-.1-.2-.2-.2-.3-1-1.3-2-2.5-3.2-3.6l-.2-.2c-.4-.4-.8-.8-1.2-1.1-.8-.8-1.7-1.5-2.6-2.1h-.1l-1.2-.9c-.1-.1-.3-.2-.4-.3-1.2-.8-2.5-1.6-3.9-2.2-.2-.1-.5-.2-.7-.4-.4-.2-.7-.3-1.1-.5-.3-.1-.7-.3-1-.4-.5-.2-1-.4-1.5-.5-.4-.1-.9-.3-1.3-.4l-.9-.3-1.4-.3c-.2-.1-.5-.1-.7-.2-.7-.1-1.4-.3-2.1-.4-.2 0-.4 0-.6-.1-.6-.1-1.1-.1-1.7-.2-.2 0-.4 0-.7-.1-.8 0-1.5-.1-2.3-.1s-1.5 0-2.3.1c-.2 0-.4 0-.7.1-.6 0-1.2.1-1.7.2-.2 0-.4 0-.6.1-.7.1-1.4.2-2.1.4-.2.1-.5.1-.7.2l-1.4.3-.9.3c-.4.1-.9.3-1.3.4-.5.2-1 .4-1.5.5-.3.1-.7.3-1 .4-.4.2-.7.3-1.1.5-.2.1-.5.2-.7.4-1.3.7-2.6 1.4-3.9 2.2-.1.1-.3.2-.4.3l-1.2.9h-.1c-.9.7-1.8 1.4-2.6 2.1-.4.4-.8.7-1.2 1.1l-.2.2a54.8 54.8 0 0 0-3.2 3.6c-.1.1-.2.2-.2.3l-.9 1.2c0 .1-.1.1-.1.2l-1.5 2.4c-.1.2-.2.3-.3.5-2.7 5.1-4.3 10.9-4.3 17s1.6 12 4.3 17c.1.2.2.3.3.5l1.5 2.4c0 .1.1.1.1.2l.9 1.2c.1.1.2.2.2.3 1 1.3 2 2.5 3.2 3.6l.2.2c.4.4.8.8 1.2 1.1.8.8 1.7 1.5 2.6 2.1h.1l1.2.9c.1.1.3.2.4.3 1.2.8 2.5 1.6 3.9 2.2.2.1.5.2.7.4.4.2.7.3 1.1.5.3.1.7.3 1 .4.5.2 1 .4 1.5.5.4.1.9.3 1.3.4l.9.3 1.4.3c.2.1.5.1.7.2.7.1 1.4.3 2.1.4.2 0 .4 0 .6.1.6.1 1.1.1 1.7.2.2 0 .4 0 .7.1.8 0 1.5.1 2.3.1s1.5 0 2.3-.1c.2 0 .4 0 .7-.1.6 0 1.2-.1 1.7-.2.2 0 .4 0 .6-.1.7-.1 1.4-.2 2.1-.4.2-.1.5-.1.7-.2l1.4-.3.9-.3c.4-.1.9-.3 1.3-.4.5-.2 1-.4 1.5-.5.3-.1.7-.3 1-.4.4-.2.7-.3 1.1-.5.2-.1.5-.2.7-.4 1.3-.7 2.6-1.4 3.9-2.2.1-.1.3-.2.4-.3l1.2-.9h.1c.9-.7 1.8-1.4 2.6-2.1.4-.4.8-.7 1.2-1.1l.2-.2c1.1-1.1 2.2-2.4 3.2-3.6.1-.1.2-.2.2-.3l.9-1.2c0-.1.1-.1.1-.2l1.5-2.4c.1-.2.2-.3.3-.5 2.7-5.1 4.3-10.9 4.3-17s-1.6-12-4.3-17c-.1-.2-.2-.4-.3-.5z")),t.CreditCardFill=o("credit-card",c,r(a,"M928 160H96c-17.7 0-32 14.3-32 32v160h896V192c0-17.7-14.3-32-32-32zM64 832c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V440H64v392zm579-184c0-4.4 3.6-8 8-8h165c4.4 0 8 3.6 8 8v72c0 4.4-3.6 8-8 8H651c-4.4 0-8-3.6-8-8v-72z")),t.CopyrightCircleFill=o("copyright-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm5.4 670c-110 0-173.4-73.2-173.4-194.9v-52.3C344 364.2 407.4 290 517.3 290c94.3 0 162.7 60.7 162.7 147.4 0 2.6-2.1 4.7-4.7 4.7h-56.7c-4.2 0-7.6-3.2-8-7.4-4-49.5-40-83.4-93-83.4-65.3 0-102.1 48.5-102.1 135.5v52.6c0 85.7 36.9 133.6 102.1 133.6 52.8 0 88.7-31.7 93-77.8.4-4.1 3.8-7.3 8-7.3h56.8c2.6 0 4.7 2.1 4.7 4.7 0 82.6-68.7 141.4-162.7 141.4z")),t.CrownFill=o("crown",c,r(a,"M899.6 276.5L705 396.4 518.4 147.5a8.06 8.06 0 0 0-12.9 0L319 396.4 124.3 276.5c-5.7-3.5-13.1 1.2-12.2 7.9L188.5 865c1.1 7.9 7.9 14 16 14h615.1c8 0 14.9-6 15.9-14l76.4-580.6c.8-6.7-6.5-11.4-12.3-7.9zM512 734.2c-62.1 0-112.6-50.5-112.6-112.6S449.9 509 512 509s112.6 50.5 112.6 112.6S574.1 734.2 512 734.2zm0-160.9c-26.6 0-48.2 21.6-48.2 48.3 0 26.6 21.6 48.3 48.2 48.3s48.2-21.6 48.2-48.3c0-26.6-21.6-48.3-48.2-48.3z")),t.CustomerServiceFill=o("customer-service",c,r(a,"M512 128c-212.1 0-384 171.9-384 384v360c0 13.3 10.7 24 24 24h184c35.3 0 64-28.7 64-64V624c0-35.3-28.7-64-64-64H200v-48c0-172.3 139.7-312 312-312s312 139.7 312 312v48H688c-35.3 0-64 28.7-64 64v208c0 35.3 28.7 64 64 64h184c13.3 0 24-10.7 24-24V512c0-212.1-171.9-384-384-384z")),t.DashboardFill=o("dashboard",c,r(a,"M924.8 385.6a446.7 446.7 0 0 0-96-142.4 446.7 446.7 0 0 0-142.4-96C631.1 123.8 572.5 112 512 112s-119.1 11.8-174.4 35.2a446.7 446.7 0 0 0-142.4 96 446.7 446.7 0 0 0-96 142.4C75.8 440.9 64 499.5 64 560c0 132.7 58.3 257.7 159.9 343.1l1.7 1.4c5.8 4.8 13.1 7.5 20.6 7.5h531.7c7.5 0 14.8-2.7 20.6-7.5l1.7-1.4C901.7 817.7 960 692.7 960 560c0-60.5-11.9-119.1-35.2-174.4zM482 232c0-4.4 3.6-8 8-8h44c4.4 0 8 3.6 8 8v80c0 4.4-3.6 8-8 8h-44c-4.4 0-8-3.6-8-8v-80zM270 582c0 4.4-3.6 8-8 8h-80c-4.4 0-8-3.6-8-8v-44c0-4.4 3.6-8 8-8h80c4.4 0 8 3.6 8 8v44zm90.7-204.5l-31.1 31.1a8.03 8.03 0 0 1-11.3 0L261.7 352a8.03 8.03 0 0 1 0-11.3l31.1-31.1c3.1-3.1 8.2-3.1 11.3 0l56.6 56.6c3.1 3.1 3.1 8.2 0 11.3zm291.1 83.6l-84.5 84.5c5 18.7.2 39.4-14.5 54.1a55.95 55.95 0 0 1-79.2 0 55.95 55.95 0 0 1 0-79.2 55.87 55.87 0 0 1 54.1-14.5l84.5-84.5c3.1-3.1 8.2-3.1 11.3 0l28.3 28.3c3.1 3.1 3.1 8.1 0 11.3zm43-52.4l-31.1-31.1a8.03 8.03 0 0 1 0-11.3l56.6-56.6c3.1-3.1 8.2-3.1 11.3 0l31.1 31.1c3.1 3.1 3.1 8.2 0 11.3l-56.6 56.6a8.03 8.03 0 0 1-11.3 0zM846 582c0 4.4-3.6 8-8 8h-80c-4.4 0-8-3.6-8-8v-44c0-4.4 3.6-8 8-8h80c4.4 0 8 3.6 8 8v44z")),t.DatabaseFill=o("database",c,r(a,"M832 64H192c-17.7 0-32 14.3-32 32v224h704V96c0-17.7-14.3-32-32-32zM288 232c-22.1 0-40-17.9-40-40s17.9-40 40-40 40 17.9 40 40-17.9 40-40 40zM160 928c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V704H160v224zm128-136c22.1 0 40 17.9 40 40s-17.9 40-40 40-40-17.9-40-40 17.9-40 40-40zM160 640h704V384H160v256zm128-168c22.1 0 40 17.9 40 40s-17.9 40-40 40-40-17.9-40-40 17.9-40 40-40z")),t.CopyFill=o("copy",c,r(a,"M832 64H296c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h496v688c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V96c0-17.7-14.3-32-32-32zM704 192H192c-17.7 0-32 14.3-32 32v530.7c0 8.5 3.4 16.6 9.4 22.6l173.3 173.3c2.2 2.2 4.7 4 7.4 5.5v1.9h4.2c3.5 1.3 7.2 2 11 2H704c17.7 0 32-14.3 32-32V224c0-17.7-14.3-32-32-32zM382 896h-.2L232 746.2v-.2h150v150z")),t.DingtalkSquareFill=o("dingtalk-square",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM739 449.3c-1 4.2-3.5 10.4-7 17.8h.1l-.4.7c-20.3 43.1-73.1 127.7-73.1 127.7s-.1-.2-.3-.5l-15.5 26.8h74.5L575.1 810l32.3-128h-58.6l20.4-84.7c-16.5 3.9-35.9 9.4-59 16.8 0 0-31.2 18.2-89.9-35 0 0-39.6-34.7-16.6-43.4 9.8-3.7 47.4-8.4 77-12.3 40-5.4 64.6-8.2 64.6-8.2S422 517 392.7 512.5c-29.3-4.6-66.4-53.1-74.3-95.8 0 0-12.2-23.4 26.3-12.3 38.5 11.1 197.9 43.2 197.9 43.2s-207.4-63.3-221.2-78.7c-13.8-15.4-40.6-84.2-37.1-126.5 0 0 1.5-10.5 12.4-7.7 0 0 153.3 69.7 258.1 107.9 104.8 37.9 195.9 57.3 184.2 106.7z")),t.DiffFill=o("diff",c,r(a,"M854.2 306.6L611.3 72.9c-6-5.7-13.9-8.9-22.2-8.9H296c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h277l219 210.6V824c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V329.6c0-8.7-3.5-17-9.8-23zM553.4 201.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v704c0 17.7 14.3 32 32 32h512c17.7 0 32-14.3 32-32V397.3c0-8.5-3.4-16.6-9.4-22.6L553.4 201.4zM568 753c0 3.8-3.4 7-7.5 7h-225c-4.1 0-7.5-3.2-7.5-7v-42c0-3.8 3.4-7 7.5-7h225c4.1 0 7.5 3.2 7.5 7v42zm0-220c0 3.8-3.4 7-7.5 7H476v84.9c0 3.9-3.1 7.1-7 7.1h-42c-3.8 0-7-3.2-7-7.1V540h-84.5c-4.1 0-7.5-3.2-7.5-7v-42c0-3.9 3.4-7 7.5-7H420v-84.9c0-3.9 3.2-7.1 7-7.1h42c3.9 0 7 3.2 7 7.1V484h84.5c4.1 0 7.5 3.1 7.5 7v42z")),t.DeleteFill=o("delete",c,r(a,"M864 256H736v-80c0-35.3-28.7-64-64-64H352c-35.3 0-64 28.7-64 64v80H160c-17.7 0-32 14.3-32 32v32c0 4.4 3.6 8 8 8h60.4l24.7 523c1.6 34.1 29.8 61 63.9 61h454c34.2 0 62.3-26.8 63.9-61l24.7-523H888c4.4 0 8-3.6 8-8v-32c0-17.7-14.3-32-32-32zm-200 0H360v-72h304v72z")),t.DislikeFill=o("dislike",c,r(a,"M885.9 490.3c3.6-12 5.4-24.4 5.4-37 0-28.3-9.3-55.5-26.1-77.7 3.6-12 5.4-24.4 5.4-37 0-28.3-9.3-55.5-26.1-77.7 3.6-12 5.4-24.4 5.4-37 0-51.6-30.7-98.1-78.3-118.4a66.1 66.1 0 0 0-26.5-5.4H273v428h.3l85.8 310.8C372.9 889 418.9 924 470.9 924c29.7 0 57.4-11.8 77.9-33.4 20.5-21.5 31-49.7 29.5-79.4l-6-122.9h239.9c12.1 0 23.9-3.2 34.3-9.3 40.4-23.5 65.5-66.1 65.5-111 0-28.3-9.3-55.5-26.1-77.7zM112 132v364c0 17.7 14.3 32 32 32h65V100h-65c-17.7 0-32 14.3-32 32z")),t.DollarCircleFill=o("dollar-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm22.3 665.2l.2 31.7c0 4.4-3.6 8.1-8 8.1h-28.4c-4.4 0-8-3.6-8-8v-31.4C401.3 723 359.5 672.4 355 617.4c-.4-4.7 3.3-8.7 8-8.7h46.2c3.9 0 7.3 2.8 7.9 6.6 5.1 31.7 29.8 55.4 74.1 61.3V533.9l-24.7-6.3c-52.3-12.5-102.1-45.1-102.1-112.7 0-72.9 55.4-112.1 126.2-119v-33c0-4.4 3.6-8 8-8h28.1c4.4 0 8 3.6 8 8v32.7c68.5 6.9 119.9 46.9 125.9 109.2.5 4.7-3.2 8.8-8 8.8h-44.9c-4 0-7.4-3-7.9-6.9-4-29.2-27.4-53-65.5-58.2v134.3l25.4 5.9c64.8 16 108.9 47 108.9 116.4 0 75.3-56 117.3-134.3 124.1zM426.6 410.3c0 25.4 15.7 45.1 49.5 57.3 4.7 1.9 9.4 3.4 15 5v-124c-36.9 4.7-64.5 25.4-64.5 61.7zm116.5 135.2c-2.8-.6-5.6-1.3-8.8-2.2V677c42.6-3.8 72-27.2 72-66.4 0-30.7-15.9-50.7-63.2-65.1z")),t.DownCircleFill=o("down-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm184.5 353.7l-178 246a7.95 7.95 0 0 1-12.9 0l-178-246c-3.8-5.3 0-12.7 6.5-12.7H381c10.2 0 19.9 4.9 25.9 13.2L512 563.6l105.2-145.4c6-8.3 15.6-13.2 25.9-13.2H690c6.5 0 10.3 7.4 6.5 12.7z")),t.DribbbleCircleFill=o("dribbble-circle",c,r(a,"M675.1 328.3a245.2 245.2 0 0 0-220.8-55.1c6.8 9.1 51.5 69.9 91.8 144 87.5-32.8 124.5-82.6 129-88.9zM554 552.8c-138.7 48.3-188.6 144.6-193 153.6 41.7 32.5 94.1 51.9 151 51.9 34.1 0 66.6-6.9 96.1-19.5-3.7-21.6-17.9-96.8-52.5-186.6l-1.6.6zm47.7-11.9c32.2 88.4 45.3 160.4 47.8 175.4 55.2-37.3 94.5-96.4 105.4-164.9-8.4-2.6-76.1-22.8-153.2-10.5zM512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 736c-158.8 0-288-129.2-288-288s129.2-288 288-288 288 129.2 288 288-129.2 288-288 288zm53.1-346.2c5.7 11.7 11.2 23.6 16.3 35.6 1.8 4.2 3.6 8.4 5.3 12.7 81.8-10.3 163.2 6.2 171.3 7.9-.5-58.1-21.3-111.4-55.5-153.3-5.3 7.1-46.5 60-137.4 97.1zM498.6 432c-40.8-72.5-84.7-133.4-91.2-142.3-68.8 32.5-120.3 95.9-136.2 172.2 11 .2 112.4.7 227.4-29.9zm30.6 82.5c3.2-1 6.4-2 9.7-2.9-6.2-14-12.9-28-19.9-41.7-122.8 36.8-242.1 35.2-252.8 35-.1 2.5-.1 5-.1 7.5 0 63.2 23.9 120.9 63.2 164.5 5.5-9.6 73-121.4 199.9-162.4z")),t.DribbbleSquareFill=o("dribbble-square",c,r(a,"M498.6 432c-40.8-72.5-84.7-133.4-91.2-142.3-68.8 32.5-120.3 95.9-136.2 172.2 11 .2 112.4.7 227.4-29.9zm66.5 21.8c5.7 11.7 11.2 23.6 16.3 35.6 1.8 4.2 3.6 8.4 5.3 12.7 81.8-10.3 163.2 6.2 171.3 7.9-.5-58.1-21.3-111.4-55.5-153.3-5.3 7.1-46.5 60-137.4 97.1zM880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM512 800c-158.8 0-288-129.2-288-288s129.2-288 288-288 288 129.2 288 288-129.2 288-288 288zm89.7-259.1c32.2 88.4 45.3 160.4 47.8 175.4 55.2-37.3 94.5-96.4 105.4-164.9-8.4-2.6-76.1-22.8-153.2-10.5zm-72.5-26.4c3.2-1 6.4-2 9.7-2.9-6.2-14-12.9-28-19.9-41.7-122.8 36.8-242.1 35.2-252.8 35-.1 2.5-.1 5-.1 7.5 0 63.2 23.9 120.9 63.2 164.5 5.5-9.6 73-121.4 199.9-162.4zm145.9-186.2a245.2 245.2 0 0 0-220.8-55.1c6.8 9.1 51.5 69.9 91.8 144 87.5-32.8 124.5-82.6 129-88.9zM554 552.8c-138.7 48.3-188.6 144.6-193 153.6 41.7 32.5 94.1 51.9 151 51.9 34.1 0 66.6-6.9 96.1-19.5-3.7-21.6-17.9-96.8-52.5-186.6l-1.6.6z")),t.DropboxCircleFill=o("dropbox-circle",c,r(a,"M663.8 455.5zm-151.5-93.8l-151.8 93.8 151.8 93.9 151.5-93.9zM512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm151.2 595.5L512.6 750l-151-90.5v-33.1l45.4 29.4 105.6-87.7 105.6 87.7 45.1-29.4v33.1zm-45.6-22.4l-105.3-87.7L407 637.1l-151-99.2 104.5-82.4L256 371.2 407 274l105.3 87.7L617.6 274 768 372.1l-104.2 83.5L768 539l-150.4 98.1z")),t.DropboxSquareFill=o("dropbox-square",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM663.2 659.5L512.6 750l-151-90.5v-33.1l45.4 29.4 105.6-87.7 105.6 87.7 45.1-29.4v33.1zm-45.6-22.4l-105.3-87.7L407 637.1l-151-99.2 104.5-82.4L256 371.2 407 274l105.3 87.7L617.6 274 768 372.1l-104.2 83.5L768 539l-150.4 98.1zM512.3 361.7l-151.8 93.8 151.8 93.9 151.5-93.9zm151.5 93.8z")),t.EditFill=o("edit",c,r(a,"M880 836H144c-17.7 0-32 14.3-32 32v36c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-36c0-17.7-14.3-32-32-32zm-622.3-84c2 0 4-.2 6-.5L431.9 722c2-.4 3.9-1.3 5.3-2.8l423.9-423.9a9.96 9.96 0 0 0 0-14.1L694.9 114.9c-1.9-1.9-4.4-2.9-7.1-2.9s-5.2 1-7.1 2.9L256.8 538.8c-1.5 1.5-2.4 3.3-2.8 5.3l-29.5 168.2a33.5 33.5 0 0 0 9.4 29.8c6.6 6.4 14.9 9.9 23.8 9.9z")),t.EnvironmentFill=o("environment",c,r(a,"M512 327c-29.9 0-58 11.6-79.2 32.8A111.6 111.6 0 0 0 400 439c0 29.9 11.7 58 32.8 79.2A111.6 111.6 0 0 0 512 551c29.9 0 58-11.7 79.2-32.8C612.4 497 624 468.9 624 439c0-29.9-11.6-58-32.8-79.2S541.9 327 512 327zm342.6-37.9a362.49 362.49 0 0 0-79.9-115.7 370.83 370.83 0 0 0-118.2-77.8C610.7 76.6 562.1 67 512 67c-50.1 0-98.7 9.6-144.5 28.5-44.3 18.3-84 44.5-118.2 77.8A363.6 363.6 0 0 0 169.4 289c-19.5 45-29.4 92.8-29.4 142 0 70.6 16.9 140.9 50.1 208.7 26.7 54.5 64 107.6 111 158.1 80.3 86.2 164.5 138.9 188.4 153a43.9 43.9 0 0 0 22.4 6.1c7.8 0 15.5-2 22.4-6.1 23.9-14.1 108.1-66.8 188.4-153 47-50.4 84.3-103.6 111-158.1C867.1 572 884 501.8 884 431.1c0-49.2-9.9-97-29.4-142zM512 615c-97.2 0-176-78.8-176-176s78.8-176 176-176 176 78.8 176 176-78.8 176-176 176z")),t.EuroCircleFill=o("euro-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm63.5 375.8c4.4 0 8 3.6 8 8V475c0 4.4-3.6 8-8 8h-136c-.3 4.4-.3 9.1-.3 13.8v36h136.2c4.4 0 8 3.6 8 8V568c0 4.4-3.6 8-8 8H444.9c15.3 62 61.3 98.6 129.8 98.6 19.9 0 37.1-1.2 51.8-4.1 4.9-1 9.5 2.8 9.5 7.8v42.8c0 3.8-2.7 7-6.4 7.8-15.9 3.4-34.3 5.1-55.3 5.1-109.8 0-183-58.8-200.2-158H344c-4.4 0-8-3.6-8-8v-27.2c0-4.4 3.6-8 8-8h26.1v-36.9c0-4.4 0-8.8.3-12.8H344c-4.4 0-8-3.6-8-8v-27.2c0-4.4 3.6-8 8-8h31.7c19.7-94.2 92-149.9 198.6-149.9 20.9 0 39.4 1.9 55.3 5.4 3.7.8 6.3 4 6.3 7.8V346h.1c0 5.1-4.6 8.8-9.6 7.8-14.7-2.9-31.8-4.4-51.7-4.4-65.4 0-110.4 33.5-127.6 90.4h128.4z")),t.ExclamationCircleFill=o("exclamation-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm-32 232c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v272c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V296zm32 440a48.01 48.01 0 0 1 0-96 48.01 48.01 0 0 1 0 96z")),t.ExperimentFill=o("experiment",c,r(a,"M218.9 636.3l42.6 26.6c.1.1.3.2.4.3l12.7 8 .3.3a186.9 186.9 0 0 0 94.1 25.1c44.9 0 87.2-15.7 121-43.8a256.27 256.27 0 0 1 164.9-59.9c52.3 0 102.2 15.7 144.6 44.5l7.9 5-111.6-289V179.8h63.5c4.4 0 8-3.6 8-8V120c0-4.4-3.6-8-8-8H264.7c-4.4 0-8 3.6-8 8v51.9c0 4.4 3.6 8 8 8h63.5v173.6L218.9 636.3zm333-203.1c22 0 39.9 17.9 39.9 39.9S573.9 513 551.9 513 512 495.1 512 473.1s17.9-39.9 39.9-39.9zM878 825.1l-29.9-77.4-85.7-53.5-.1.1c-.7-.5-1.5-1-2.2-1.5l-8.1-5-.3-.3c-29-17.5-62.3-26.8-97-26.8-44.9 0-87.2 15.7-121 43.8a256.27 256.27 0 0 1-164.9 59.9c-53 0-103.5-16.1-146.2-45.6l-28.9-18.1L146 825.1c-2.8 7.4-4.3 15.2-4.3 23 0 35.2 28.6 63.8 63.8 63.8h612.9c7.9 0 15.7-1.5 23-4.3a63.6 63.6 0 0 0 36.6-82.5z")),t.EyeFill=o("eye",c,r(a,"M396 512a112 112 0 1 0 224 0 112 112 0 1 0-224 0zm546.2-25.8C847.4 286.5 704.1 186 512 186c-192.2 0-335.4 100.5-430.2 300.3a60.3 60.3 0 0 0 0 51.5C176.6 737.5 319.9 838 512 838c192.2 0 335.4-100.5 430.2-300.3 7.7-16.2 7.7-35 0-51.5zM508 688c-97.2 0-176-78.8-176-176s78.8-176 176-176 176 78.8 176 176-78.8 176-176 176z")),t.FacebookFill=o("facebook",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-92.4 233.5h-63.9c-50.1 0-59.8 23.8-59.8 58.8v77.1h119.6l-15.6 120.7h-104V912H539.2V602.2H434.9V481.4h104.3v-89c0-103.3 63.1-159.6 155.3-159.6 44.2 0 82.1 3.3 93.2 4.8v107.9z")),t.FastBackwardFill=o("fast-backward",c,r(i,"M524.6 481.6l436.2-375.4c24.4-22.8 63.1-4.7 63.1 29.5v752.7c0 34.2-38.7 52.3-63.1 29.5L524.6 540.6a40.84 40.84 0 0 1-12.7-29.5c.1-10.9 4.3-21.7 12.7-29.5z","M36 96c19.9 0 36 16.1 36 36v298.5l376.9-324.4c24.4-22.8 63.1-4.7 63.1 29.5v752.7c0 34.2-38.7 52.3-63.1 29.5L72 591.9V892c0 19.9-16.1 36-36 36S0 911.9 0 892V132c0-19.9 16.1-36 36-36z")),t.FastForwardFill=o("fast-forward",c,r(i,"M499.4 481.6L63.1 106.1C38.7 83.4 0 101.5 0 135.6v752.7c0 34.2 38.7 52.3 63.1 29.5l436.2-377.3c8.4-7.9 12.6-18.7 12.7-29.5 0-10.8-4.2-21.6-12.6-29.4zM988 96c-19.9 0-36 16.1-36 36v298.5L575.1 106.1c-24.4-22.8-63.1-4.7-63.1 29.5v752.7c0 34.2 38.7 52.3 63.1 29.5l376.9-326V892c0 19.9 16.1 36 36 36s36-16.1 36-36V132c0-19.9-16.1-36-36-36z")),t.FileAddFill=o("file-add",c,r(a,"M480 580H372a8 8 0 0 0-8 8v48a8 8 0 0 0 8 8h108v108a8 8 0 0 0 8 8h48a8 8 0 0 0 8-8V644h108a8 8 0 0 0 8-8v-48a8 8 0 0 0-8-8H544V472a8 8 0 0 0-8-8h-48a8 8 0 0 0-8 8v108zm374.6-291.3c6 6 9.4 14.1 9.4 22.6V928c0 17.7-14.3 32-32 32H192c-17.7 0-32-14.3-32-32V96c0-17.7 14.3-32 32-32h424.7c8.5 0 16.7 3.4 22.7 9.4l215.2 215.3zM790.2 326L602 137.8V326h188.2z")),t.FileExcelFill=o("file-excel",c,r(a,"M854.6 288.7c6 6 9.4 14.1 9.4 22.6V928c0 17.7-14.3 32-32 32H192c-17.7 0-32-14.3-32-32V96c0-17.7 14.3-32 32-32h424.7c8.5 0 16.7 3.4 22.7 9.4l215.2 215.3zM790.2 326L602 137.8V326h188.2zM575.34 477.84l-61.22 102.3L452.3 477.8a12 12 0 0 0-10.27-5.79h-38.44a12 12 0 0 0-6.4 1.85 12 12 0 0 0-3.75 16.56l82.34 130.42-83.45 132.78a12 12 0 0 0-1.84 6.39 12 12 0 0 0 12 12h34.46a12 12 0 0 0 10.21-5.7l62.7-101.47 62.3 101.45a12 12 0 0 0 10.23 5.72h37.48a12 12 0 0 0 6.48-1.9 12 12 0 0 0 3.62-16.58l-83.83-130.55 85.3-132.47a12 12 0 0 0 1.9-6.5 12 12 0 0 0-12-12h-35.7a12 12 0 0 0-10.29 5.84z")),t.FileExclamationFill=o("file-exclamation",c,r(a,"M854.6 288.7c6 6 9.4 14.1 9.4 22.6V928c0 17.7-14.3 32-32 32H192c-17.7 0-32-14.3-32-32V96c0-17.7 14.3-32 32-32h424.7c8.5 0 16.7 3.4 22.7 9.4l215.2 215.3zM790.2 326L602 137.8V326h188.2zM512 784a40 40 0 1 0 0-80 40 40 0 0 0 0 80zm32-152V448a8 8 0 0 0-8-8h-48a8 8 0 0 0-8 8v184a8 8 0 0 0 8 8h48a8 8 0 0 0 8-8z")),t.FileImageFill=o("file-image",c,r(a,"M854.6 288.7L639.4 73.4c-6-6-14.2-9.4-22.7-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.6-9.4-22.6zM400 402c22.1 0 40 17.9 40 40s-17.9 40-40 40-40-17.9-40-40 17.9-40 40-40zm296 294H328c-6.7 0-10.4-7.7-6.3-12.9l99.8-127.2a8 8 0 0 1 12.6 0l41.1 52.4 77.8-99.2a8 8 0 0 1 12.6 0l136.5 174c4.3 5.2.5 12.9-6.1 12.9zm-94-370V137.8L790.2 326H602z")),t.FileMarkdownFill=o("file-markdown",c,r(a,"M854.6 288.7c6 6 9.4 14.1 9.4 22.6V928c0 17.7-14.3 32-32 32H192c-17.7 0-32-14.3-32-32V96c0-17.7 14.3-32 32-32h424.7c8.5 0 16.7 3.4 22.7 9.4l215.2 215.3zM790.2 326L602 137.8V326h188.2zM426.13 600.93l59.11 132.97a16 16 0 0 0 14.62 9.5h24.06a16 16 0 0 0 14.63-9.51l59.1-133.35V758a16 16 0 0 0 16.01 16H641a16 16 0 0 0 16-16V486a16 16 0 0 0-16-16h-34.75a16 16 0 0 0-14.67 9.62L512.1 662.2l-79.48-182.59a16 16 0 0 0-14.67-9.61H383a16 16 0 0 0-16 16v272a16 16 0 0 0 16 16h27.13a16 16 0 0 0 16-16V600.93z")),t.FilePdfFill=o("file-pdf",c,r(a,"M854.6 288.7c6 6 9.4 14.1 9.4 22.6V928c0 17.7-14.3 32-32 32H192c-17.7 0-32-14.3-32-32V96c0-17.7 14.3-32 32-32h424.7c8.5 0 16.7 3.4 22.7 9.4l215.2 215.3zM790.2 326L602 137.8V326h188.2zM633.22 637.26c-15.18-.5-31.32.67-49.65 2.96-24.3-14.99-40.66-35.58-52.28-65.83l1.07-4.38 1.24-5.18c4.3-18.13 6.61-31.36 7.3-44.7.52-10.07-.04-19.36-1.83-27.97-3.3-18.59-16.45-29.46-33.02-30.13-15.45-.63-29.65 8-33.28 21.37-5.91 21.62-2.45 50.07 10.08 98.59-15.96 38.05-37.05 82.66-51.2 107.54-18.89 9.74-33.6 18.6-45.96 28.42-16.3 12.97-26.48 26.3-29.28 40.3-1.36 6.49.69 14.97 5.36 21.92 5.3 7.88 13.28 13 22.85 13.74 24.15 1.87 53.83-23.03 86.6-79.26 3.29-1.1 6.77-2.26 11.02-3.7l11.9-4.02c7.53-2.54 12.99-4.36 18.39-6.11 23.4-7.62 41.1-12.43 57.2-15.17 27.98 14.98 60.32 24.8 82.1 24.8 17.98 0 30.13-9.32 34.52-23.99 3.85-12.88.8-27.82-7.48-36.08-8.56-8.41-24.3-12.43-45.65-13.12zM385.23 765.68v-.36l.13-.34c1.27-3.42 3.15-7.01 5.6-10.76 4.28-6.58 10.17-13.5 17.47-20.87 3.92-3.95 8-7.8 12.79-12.12 1.07-.96 7.91-7.05 9.19-8.25l11.17-10.4-8.12 12.93c-12.32 19.64-23.46 33.78-33 43-3.51 3.4-6.6 5.9-9.1 7.51a16.43 16.43 0 0 1-2.61 1.42c-.41.17-.77.27-1.13.3a2.2 2.2 0 0 1-1.12-.15 2.07 2.07 0 0 1-1.27-1.91zM511.17 547.4l-2.26 4-1.4-4.38c-3.1-9.83-5.38-24.64-6.01-38-.72-15.2.49-24.32 5.29-24.32 6.74 0 9.83 10.8 10.07 27.05.22 14.28-2.03 29.14-5.7 35.65zm-5.81 58.46l1.53-4.05 2.09 3.8c11.69 21.24 26.86 38.96 43.54 51.31l3.6 2.66-4.39.9c-16.33 3.38-31.54 8.46-52.34 16.85 2.17-.88-21.62 8.86-27.64 11.17l-5.25 2.01 2.8-4.88c12.35-21.5 23.76-47.32 36.05-79.77zm157.62 76.26c-7.86 3.1-24.78.33-54.57-12.39l-7.56-3.22 8.2-.6c23.3-1.73 39.8-.45 49.42 3.07 4.1 1.5 6.83 3.39 8.04 5.55a4.64 4.64 0 0 1-1.36 6.31 6.7 6.7 0 0 1-2.17 1.28z")),t.FilePptFill=o("file-ppt",c,r(a,"M854.6 288.7c6 6 9.4 14.1 9.4 22.6V928c0 17.7-14.3 32-32 32H192c-17.7 0-32-14.3-32-32V96c0-17.7 14.3-32 32-32h424.7c8.5 0 16.7 3.4 22.7 9.4l215.2 215.3zM790.2 326L602 137.8V326h188.2zM468.53 760v-91.54h59.27c60.57 0 100.2-39.65 100.2-98.12 0-58.22-39.58-98.34-99.98-98.34H424a12 12 0 0 0-12 12v276a12 12 0 0 0 12 12h32.53a12 12 0 0 0 12-12zm0-139.33h34.9c47.82 0 67.19-12.93 67.19-50.33 0-32.05-18.12-50.12-49.87-50.12h-52.22v100.45z")),t.FileTextFill=o("file-text",c,r(a,"M854.6 288.7c6 6 9.4 14.1 9.4 22.6V928c0 17.7-14.3 32-32 32H192c-17.7 0-32-14.3-32-32V96c0-17.7 14.3-32 32-32h424.7c8.5 0 16.7 3.4 22.7 9.4l215.2 215.3zM790.2 326L602 137.8V326h188.2zM320 482a8 8 0 0 0-8 8v48a8 8 0 0 0 8 8h384a8 8 0 0 0 8-8v-48a8 8 0 0 0-8-8H320zm0 136a8 8 0 0 0-8 8v48a8 8 0 0 0 8 8h184a8 8 0 0 0 8-8v-48a8 8 0 0 0-8-8H320z")),t.FileWordFill=o("file-word",c,r(a,"M854.6 288.7c6 6 9.4 14.1 9.4 22.6V928c0 17.7-14.3 32-32 32H192c-17.7 0-32-14.3-32-32V96c0-17.7 14.3-32 32-32h424.7c8.5 0 16.7 3.4 22.7 9.4l215.2 215.3zM790.2 326L602 137.8V326h188.2zM512 566.1l52.81 197a12 12 0 0 0 11.6 8.9h31.77a12 12 0 0 0 11.6-8.88l74.37-276a12 12 0 0 0 .4-3.12 12 12 0 0 0-12-12h-35.57a12 12 0 0 0-11.7 9.31l-45.78 199.1-49.76-199.32A12 12 0 0 0 528.1 472h-32.2a12 12 0 0 0-11.64 9.1L434.6 680.01 388.5 481.3a12 12 0 0 0-11.68-9.29h-35.39a12 12 0 0 0-3.11.41 12 12 0 0 0-8.47 14.7l74.17 276A12 12 0 0 0 415.6 772h31.99a12 12 0 0 0 11.59-8.9l52.81-197z")),t.FileZipFill=o("file-zip",c,r(a,"M854.6 288.7c6 6 9.4 14.1 9.4 22.6V928c0 17.7-14.3 32-32 32H192c-17.7 0-32-14.3-32-32V96c0-17.7 14.3-32 32-32h424.7c8.5 0 16.7 3.4 22.7 9.4l215.2 215.3zM790.2 326L602 137.8V326h188.2zM296 136v64h64v-64h-64zm64 64v64h64v-64h-64zm-64 64v64h64v-64h-64zm64 64v64h64v-64h-64zm-64 64v64h64v-64h-64zm64 64v64h64v-64h-64zm-64 64v64h64v-64h-64zm0 64v160h128V584H296zm48 48h32v64h-32v-64z")),t.FileFill=o("file",c,r(a,"M854.6 288.7c6 6 9.4 14.1 9.4 22.6V928c0 17.7-14.3 32-32 32H192c-17.7 0-32-14.3-32-32V96c0-17.7 14.3-32 32-32h424.7c8.5 0 16.7 3.4 22.7 9.4l215.2 215.3zM790.2 326L602 137.8V326h188.2z")),t.FilterFill=o("filter",c,r(a,"M349 838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V642H349v196zm531.1-684H143.9c-24.5 0-39.8 26.7-27.5 48l221.3 376h348.8l221.3-376c12.1-21.3-3.2-48-27.7-48z")),t.FireFill=o("fire",c,r(a,"M834.1 469.2A347.49 347.49 0 0 0 751.2 354l-29.1-26.7a8.09 8.09 0 0 0-13 3.3l-13 37.3c-8.1 23.4-23 47.3-44.1 70.8-1.4 1.5-3 1.9-4.1 2-1.1.1-2.8-.1-4.3-1.5-1.4-1.2-2.1-3-2-4.8 3.7-60.2-14.3-128.1-53.7-202C555.3 171 510 123.1 453.4 89.7l-41.3-24.3c-5.4-3.2-12.3 1-12 7.3l2.2 48c1.5 32.8-2.3 61.8-11.3 85.9-11 29.5-26.8 56.9-47 81.5a295.64 295.64 0 0 1-47.5 46.1 352.6 352.6 0 0 0-100.3 121.5A347.75 347.75 0 0 0 160 610c0 47.2 9.3 92.9 27.7 136a349.4 349.4 0 0 0 75.5 110.9c32.4 32 70 57.2 111.9 74.7C418.5 949.8 464.5 959 512 959s93.5-9.2 136.9-27.3A348.6 348.6 0 0 0 760.8 857c32.4-32 57.8-69.4 75.5-110.9a344.2 344.2 0 0 0 27.7-136c0-48.8-10-96.2-29.9-140.9z")),t.FlagFill=o("flag",c,r(a,"M880 305H624V192c0-17.7-14.3-32-32-32H184v-40c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v784c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V640h248v113c0 17.7 14.3 32 32 32h416c17.7 0 32-14.3 32-32V337c0-17.7-14.3-32-32-32z")),t.FileUnknownFill=o("file-unknown",c,r(a,"M854.6 288.7c6 6 9.4 14.1 9.4 22.6V928c0 17.7-14.3 32-32 32H192c-17.7 0-32-14.3-32-32V96c0-17.7 14.3-32 32-32h424.7c8.5 0 16.7 3.4 22.7 9.4l215.2 215.3zM790.2 326L602 137.8V326h188.2zM402 549c0 5.4 4.4 9.5 9.8 9.5h32.4c5.4 0 9.8-4.2 9.8-9.4 0-28.2 25.8-51.6 58-51.6s58 23.4 58 51.5c0 25.3-21 47.2-49.3 50.9-19.3 2.8-34.5 20.3-34.7 40.1v32c0 5.5 4.5 10 10 10h32c5.5 0 10-4.5 10-10v-12.2c0-6 4-11.5 9.7-13.3 44.6-14.4 75-54 74.3-98.9-.8-55.5-49.2-100.8-108.5-101.6-61.4-.7-111.5 45.6-111.5 103zm110 227a32 32 0 1 0 0-64 32 32 0 0 0 0 64z")),t.FolderOpenFill=o("folder-open",c,r(a,"M928 444H820V330.4c0-17.7-14.3-32-32-32H473L355.7 186.2a8.15 8.15 0 0 0-5.5-2.2H96c-17.7 0-32 14.3-32 32v592c0 17.7 14.3 32 32 32h698c13 0 24.8-7.9 29.7-20l134-332c1.5-3.8 2.3-7.9 2.3-12 0-17.7-14.3-32-32-32zm-180 0H238c-13 0-24.8 7.9-29.7 20L136 643.2V256h188.5l119.6 114.4H748V444z")),t.FolderFill=o("folder",c,r(a,"M880 298.4H521L403.7 186.2a8.15 8.15 0 0 0-5.5-2.2H144c-17.7 0-32 14.3-32 32v592c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V330.4c0-17.7-14.3-32-32-32z")),t.ForwardFill=o("forward",c,r(i,"M575.1 106.1l436.2 375.4c16.9 15.7 16.9 43.3 0 59L575.1 917.9c-24.4 22.8-63.1 4.7-63.1-29.5V135.6c0-34.1 38.7-52.2 63.1-29.5zM63.1 106.1l436.2 375.4c8.4 7.9 12.6 18.7 12.6 29.5s-4.2 21.6-12.6 29.5L63.1 917.9C38.7 940.6 0 922.5 0 888.4V135.7c0-34.2 38.7-52.3 63.1-29.6z")),t.FrownFill=o("frown",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zM288 421a48.01 48.01 0 0 1 96 0 48.01 48.01 0 0 1-96 0zm376 272h-48.1c-4.2 0-7.8-3.2-8.1-7.4C604 636.1 562.5 597 512 597s-92.1 39.1-95.8 88.6c-.3 4.2-3.9 7.4-8.1 7.4H360a8 8 0 0 1-8-8.4c4.4-84.3 74.5-151.6 160-151.6s155.6 67.3 160 151.6a8 8 0 0 1-8 8.4zm24-224a48.01 48.01 0 0 1 0-96 48.01 48.01 0 0 1 0 96z")),t.FundFill=o("fund",c,r(a,"M926 164H94c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V196c0-17.7-14.3-32-32-32zm-92.3 194.4l-297 297.2a8.03 8.03 0 0 1-11.3 0L410.9 541.1 238.4 713.7a8.03 8.03 0 0 1-11.3 0l-36.8-36.8a8.03 8.03 0 0 1 0-11.3l214.9-215c3.1-3.1 8.2-3.1 11.3 0L531 565l254.5-254.6c3.1-3.1 8.2-3.1 11.3 0l36.8 36.8c3.2 3 3.2 8.1.1 11.2z")),t.FunnelPlotFill=o("funnel-plot",c,r(a,"M336.7 586h350.6l84.9-148H251.8zm543.4-432H143.9c-24.5 0-39.8 26.7-27.5 48L215 374h594l98.7-172c12.2-21.3-3.1-48-27.6-48zM349 838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V650H349v188z")),t.GiftFill=o("gift",c,r(a,"M160 894c0 17.7 14.3 32 32 32h286V550H160v344zm386 32h286c17.7 0 32-14.3 32-32V550H546v376zm334-616H732.4c13.6-21.4 21.6-46.8 21.6-74 0-76.1-61.9-138-138-138-41.4 0-78.7 18.4-104 47.4-25.3-29-62.6-47.4-104-47.4-76.1 0-138 61.9-138 138 0 27.2 7.9 52.6 21.6 74H144c-17.7 0-32 14.3-32 32v140h366V310h68v172h366V342c0-17.7-14.3-32-32-32zm-402-4h-70c-38.6 0-70-31.4-70-70s31.4-70 70-70 70 31.4 70 70v70zm138 0h-70v-70c0-38.6 31.4-70 70-70s70 31.4 70 70-31.4 70-70 70z")),t.GithubFill=o("github",c,r(a,"M511.6 76.3C264.3 76.2 64 276.4 64 523.5 64 718.9 189.3 885 363.8 946c23.5 5.9 19.9-10.8 19.9-22.2v-77.5c-135.7 15.9-141.2-73.9-150.3-88.9C215 726 171.5 718 184.5 703c30.9-15.9 62.4 4 98.9 57.9 26.4 39.1 77.9 32.5 104 26 5.7-23.5 17.9-44.5 34.7-60.8-140.6-25.2-199.2-111-199.2-213 0-49.5 16.3-95 48.3-131.7-20.4-60.5 1.9-112.3 4.9-120 58.1-5.2 118.5 41.6 123.2 45.3 33-8.9 70.7-13.6 112.9-13.6 42.4 0 80.2 4.9 113.5 13.9 11.3-8.6 67.3-48.8 121.3-43.9 2.9 7.7 24.7 58.3 5.5 118 32.4 36.8 48.9 82.7 48.9 132.3 0 102.2-59 188.1-200 212.9a127.5 127.5 0 0 1 38.1 91v112.5c.8 9 0 17.9 15 17.9 177.1-59.7 304.6-227 304.6-424.1 0-247.2-200.4-447.3-447.5-447.3z")),t.GitlabFill=o("gitlab",c,r(a,"M910.5 553.2l-109-370.8c-6.8-20.4-23.1-34.1-44.9-34.1s-39.5 12.3-46.3 32.7l-72.2 215.4H386.2L314 181.1c-6.8-20.4-24.5-32.7-46.3-32.7s-39.5 13.6-44.9 34.1L113.9 553.2c-4.1 13.6 1.4 28.6 12.3 36.8l385.4 289 386.7-289c10.8-8.1 16.3-23.1 12.2-36.8z")),t.GoogleCircleFill=o("google-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm167 633.6C638.4 735 583 757 516.9 757c-95.7 0-178.5-54.9-218.8-134.9C281.5 589 272 551.6 272 512s9.5-77 26.1-110.1c40.3-80.1 123.1-135 218.8-135 66 0 121.4 24.3 163.9 63.8L610.6 401c-25.4-24.3-57.7-36.6-93.6-36.6-63.8 0-117.8 43.1-137.1 101-4.9 14.7-7.7 30.4-7.7 46.6s2.8 31.9 7.7 46.6c19.3 57.9 73.3 101 137 101 33 0 61-8.7 82.9-23.4 26-17.4 43.2-43.3 48.9-74H516.9v-94.8h230.7c2.9 16.1 4.4 32.8 4.4 50.1 0 74.7-26.7 137.4-73 180.1z")),t.GooglePlusCircleFill=o("google-plus-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm36.5 558.8c-43.9 61.8-132.1 79.8-200.9 53.3-69-26.3-118-99.2-112.1-173.5 1.5-90.9 85.2-170.6 176.1-167.5 43.6-2 84.6 16.9 118 43.6-14.3 16.2-29 31.8-44.8 46.3-40.1-27.7-97.2-35.6-137.3-3.6-57.4 39.7-60 133.4-4.8 176.1 53.7 48.7 155.2 24.5 170.1-50.1-33.6-.5-67.4 0-101-1.1-.1-20.1-.2-40.1-.1-60.2 56.2-.2 112.5-.3 168.8.2 3.3 47.3-3 97.5-32 136.5zM791 536.5c-16.8.2-33.6.3-50.4.4-.2 16.8-.3 33.6-.3 50.4H690c-.2-16.8-.2-33.5-.3-50.3-16.8-.2-33.6-.3-50.4-.5v-50.1c16.8-.2 33.6-.3 50.4-.3.1-16.8.3-33.6.4-50.4h50.2l.3 50.4c16.8.2 33.6.2 50.4.3v50.1z")),t.GoldenFill=o("golden",c,r(a,"M905.9 806.7l-40.2-248c-.6-3.9-4-6.7-7.9-6.7H596.2c-3.9 0-7.3 2.8-7.9 6.7l-40.2 248c-.1.4-.1.9-.1 1.3 0 4.4 3.6 8 8 8h342c.4 0 .9 0 1.3-.1 4.3-.7 7.3-4.8 6.6-9.2zm-470.2-248c-.6-3.9-4-6.7-7.9-6.7H166.2c-3.9 0-7.3 2.8-7.9 6.7l-40.2 248c-.1.4-.1.9-.1 1.3 0 4.4 3.6 8 8 8h342c.4 0 .9 0 1.3-.1 4.4-.7 7.3-4.8 6.6-9.2l-40.2-248zM342 472h342c.4 0 .9 0 1.3-.1 4.4-.7 7.3-4.8 6.6-9.2l-40.2-248c-.6-3.9-4-6.7-7.9-6.7H382.2c-3.9 0-7.3 2.8-7.9 6.7l-40.2 248c-.1.4-.1.9-.1 1.3 0 4.4 3.6 8 8 8z")),t.GooglePlusSquareFill=o("google-plus-square",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM548.5 622.8c-43.9 61.8-132.1 79.8-200.9 53.3-69-26.3-118-99.2-112.1-173.5 1.5-90.9 85.2-170.6 176.1-167.5 43.6-2 84.6 16.9 118 43.6-14.3 16.2-29 31.8-44.8 46.3-40.1-27.7-97.2-35.6-137.3-3.6-57.4 39.7-60 133.4-4.8 176.1 53.7 48.7 155.2 24.5 170.1-50.1-33.6-.5-67.4 0-101-1.1-.1-20.1-.2-40.1-.1-60.2 56.2-.2 112.5-.3 168.8.2 3.3 47.3-3 97.5-32 136.5zM791 536.5c-16.8.2-33.6.3-50.4.4-.2 16.8-.3 33.6-.3 50.4H690c-.2-16.8-.2-33.5-.3-50.3-16.8-.2-33.6-.3-50.4-.5v-50.1c16.8-.2 33.6-.3 50.4-.3.1-16.8.3-33.6.4-50.4h50.2l.3 50.4c16.8.2 33.6.2 50.4.3v50.1z")),t.DingtalkCircleFill=o("dingtalk-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm227 385.3c-1 4.2-3.5 10.4-7 17.8h.1l-.4.7c-20.3 43.1-73.1 127.7-73.1 127.7s-.1-.2-.3-.5l-15.5 26.8h74.5L575.1 810l32.3-128h-58.6l20.4-84.7c-16.5 3.9-35.9 9.4-59 16.8 0 0-31.2 18.2-89.9-35 0 0-39.6-34.7-16.6-43.4 9.8-3.7 47.4-8.4 77-12.3 40-5.4 64.6-8.2 64.6-8.2S422 517 392.7 512.5c-29.3-4.6-66.4-53.1-74.3-95.8 0 0-12.2-23.4 26.3-12.3 38.5 11.1 197.9 43.2 197.9 43.2s-207.4-63.3-221.2-78.7c-13.8-15.4-40.6-84.2-37.1-126.5 0 0 1.5-10.5 12.4-7.7 0 0 153.3 69.7 258.1 107.9 104.8 37.9 195.9 57.3 184.2 106.7z")),t.HddFill=o("hdd",c,r(a,"M832 64H192c-17.7 0-32 14.3-32 32v224h704V96c0-17.7-14.3-32-32-32zM456 216c0 4.4-3.6 8-8 8H264c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h184c4.4 0 8 3.6 8 8v48zM160 928c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V704H160v224zm576-136c22.1 0 40 17.9 40 40s-17.9 40-40 40-40-17.9-40-40 17.9-40 40-40zM160 640h704V384H160v256zm96-152c0-4.4 3.6-8 8-8h184c4.4 0 8 3.6 8 8v48c0 4.4-3.6 8-8 8H264c-4.4 0-8-3.6-8-8v-48z")),t.HeartFill=o("heart",c,r(a,"M923 283.6a260.04 260.04 0 0 0-56.9-82.8 264.4 264.4 0 0 0-84-55.5A265.34 265.34 0 0 0 679.7 125c-49.3 0-97.4 13.5-139.2 39-10 6.1-19.5 12.8-28.5 20.1-9-7.3-18.5-14-28.5-20.1-41.8-25.5-89.9-39-139.2-39-35.5 0-69.9 6.8-102.4 20.3-31.4 13-59.7 31.7-84 55.5a258.44 258.44 0 0 0-56.9 82.8c-13.9 32.3-21 66.6-21 101.9 0 33.3 6.8 68 20.3 103.3 11.3 29.5 27.5 60.1 48.2 91 32.8 48.9 77.9 99.9 133.9 151.6 92.8 85.7 184.7 144.9 188.6 147.3l23.7 15.2c10.5 6.7 24 6.7 34.5 0l23.7-15.2c3.9-2.5 95.7-61.6 188.6-147.3 56-51.7 101.1-102.7 133.9-151.6 20.7-30.9 37-61.5 48.2-91 13.5-35.3 20.3-70 20.3-103.3.1-35.3-7-69.6-20.9-101.9z")),t.HomeFill=o("home",c,r(a,"M946.5 505L534.6 93.4a31.93 31.93 0 0 0-45.2 0L77.5 505c-12 12-18.8 28.3-18.8 45.3 0 35.3 28.7 64 64 64h43.4V908c0 17.7 14.3 32 32 32H448V716h112v224h265.9c17.7 0 32-14.3 32-32V614.3h43.4c17 0 33.3-6.7 45.3-18.8 24.9-25 24.9-65.5-.1-90.5z")),t.HighlightFill=o("highlight",c,r(a,"M957.6 507.4L603.2 158.2a7.9 7.9 0 0 0-11.2 0L353.3 393.4a8.03 8.03 0 0 0-.1 11.3l.1.1 40 39.4-117.2 115.3a8.03 8.03 0 0 0-.1 11.3l.1.1 39.5 38.9-189.1 187H72.1c-4.4 0-8.1 3.6-8.1 8V860c0 4.4 3.6 8 8 8h344.9c2.1 0 4.1-.8 5.6-2.3l76.1-75.6 40.4 39.8a7.9 7.9 0 0 0 11.2 0l117.1-115.6 40.1 39.5a7.9 7.9 0 0 0 11.2 0l238.7-235.2c3.4-3 3.4-8 .3-11.2z")),t.HourglassFill=o("hourglass",c,r(a,"M742 318V184h86c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H196c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h86v134c0 81.5 42.4 153.2 106.4 194-64 40.8-106.4 112.5-106.4 194v134h-86c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h632c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-86V706c0-81.5-42.4-153.2-106.4-194 64-40.8 106.4-112.5 106.4-194z")),t.Html5Fill=o("html5",c,r(a,"M145.2 96l66 746.6L512 928l299.6-85.4L878.9 96H145.2zm595 177.1l-4.8 47.2-1.7 19.5H382.3l8.2 94.2h335.1l-3.3 24.3-21.2 242.2-1.7 16.2-187 51.6v.3h-1.2l-.3.1v-.1h-.1l-188.6-52L310.8 572h91.1l6.5 73.2 102.4 27.7h.4l102-27.6 11.4-118.6H510.9v-.1H306l-22.8-253.5-1.7-24.3h460.3l-1.6 24.3z")),t.IdcardFill=o("idcard",c,r(a,"M373 411c-28.5 0-51.7 23.3-51.7 52s23.2 52 51.7 52 51.7-23.3 51.7-52-23.2-52-51.7-52zm555-251H96c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V192c0-17.7-14.3-32-32-32zM608 420c0-4.4 1-8 2.3-8h123.4c1.3 0 2.3 3.6 2.3 8v48c0 4.4-1 8-2.3 8H610.3c-1.3 0-2.3-3.6-2.3-8v-48zm-86 253h-43.9c-4.2 0-7.6-3.3-7.9-7.5-3.8-50.5-46-90.5-97.2-90.5s-93.4 40-97.2 90.5c-.3 4.2-3.7 7.5-7.9 7.5H224a8 8 0 0 1-8-8.4c2.8-53.3 32-99.7 74.6-126.1a111.8 111.8 0 0 1-29.1-75.5c0-61.9 49.9-112 111.4-112s111.4 50.1 111.4 112c0 29.1-11 55.5-29.1 75.5 42.7 26.5 71.8 72.8 74.6 126.1.4 4.6-3.2 8.4-7.8 8.4zm278.9-53H615.1c-3.9 0-7.1-3.6-7.1-8v-48c0-4.4 3.2-8 7.1-8h185.7c3.9 0 7.1 3.6 7.1 8v48h.1c0 4.4-3.2 8-7.1 8z")),t.IeCircleFill=o("ie-circle",c,r(a,"M693.6 284.4c-24 0-51.1 11.7-72.6 22 46.3 18 86 57.3 112.3 99.6 7.1-18.9 14.6-47.9 14.6-67.9 0-32-22.8-53.7-54.3-53.7zM512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm253.9 492.9H437.1c0 100.4 144.3 136 196.8 47.4h120.8c-32.6 91.7-119.7 146-216.8 146-35.1 0-70.3-.1-101.7-15.6-87.4 44.5-180.3 56.6-180.3-42 0-45.8 23.2-107.1 44-145C335 484 381.3 422.8 435.6 374.5c-43.7 18.9-91.1 66.3-122 101.2 25.9-112.8 129.5-193.6 237.1-186.5 130-59.8 209.7-34.1 209.7 38.6 0 27.4-10.6 63.3-21.4 87.9 25.2 45.5 33.3 97.6 26.9 141.2zM540.5 399.1c-53.7 0-102 39.7-104 94.9h208c-2-55.1-50.6-94.9-104-94.9zM320.6 602.9c-73 152.4 11.5 172.2 100.3 123.3-46.6-27.5-82.6-72.2-100.3-123.3z")),t.IeSquareFill=o("ie-square",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM765.9 556.9H437.1c0 100.4 144.3 136 196.8 47.4h120.8c-32.6 91.7-119.7 146-216.8 146-35.1 0-70.3-.1-101.7-15.6-87.4 44.5-180.3 56.6-180.3-42 0-45.8 23.2-107.1 44-145C335 484 381.3 422.8 435.6 374.5c-43.7 18.9-91.1 66.3-122 101.2 25.9-112.8 129.5-193.6 237.1-186.5 130-59.8 209.7-34.1 209.7 38.6 0 27.4-10.6 63.3-21.4 87.9 25.2 45.5 33.3 97.6 26.9 141.2zm-72.3-272.5c-24 0-51.1 11.7-72.6 22 46.3 18 86 57.3 112.3 99.6 7.1-18.9 14.6-47.9 14.6-67.9 0-32-22.8-53.7-54.3-53.7zM540.5 399.1c-53.7 0-102 39.7-104 94.9h208c-2-55.1-50.6-94.9-104-94.9zM320.6 602.9c-73 152.4 11.5 172.2 100.3 123.3-46.6-27.5-82.6-72.2-100.3-123.3z")),t.InfoCircleFill=o("info-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm32 664c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V456c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v272zm-32-344a48.01 48.01 0 0 1 0-96 48.01 48.01 0 0 1 0 96z")),t.InstagramFill=o("instagram",c,r(a,"M512 378.7c-73.4 0-133.3 59.9-133.3 133.3S438.6 645.3 512 645.3 645.3 585.4 645.3 512 585.4 378.7 512 378.7zM911.8 512c0-55.2.5-109.9-2.6-165-3.1-64-17.7-120.8-64.5-167.6-46.9-46.9-103.6-61.4-167.6-64.5-55.2-3.1-109.9-2.6-165-2.6-55.2 0-109.9-.5-165 2.6-64 3.1-120.8 17.7-167.6 64.5C132.6 226.3 118.1 283 115 347c-3.1 55.2-2.6 109.9-2.6 165s-.5 109.9 2.6 165c3.1 64 17.7 120.8 64.5 167.6 46.9 46.9 103.6 61.4 167.6 64.5 55.2 3.1 109.9 2.6 165 2.6 55.2 0 109.9.5 165-2.6 64-3.1 120.8-17.7 167.6-64.5 46.9-46.9 61.4-103.6 64.5-167.6 3.2-55.1 2.6-109.8 2.6-165zM512 717.1c-113.5 0-205.1-91.6-205.1-205.1S398.5 306.9 512 306.9 717.1 398.5 717.1 512 625.5 717.1 512 717.1zm213.5-370.7c-26.5 0-47.9-21.4-47.9-47.9s21.4-47.9 47.9-47.9 47.9 21.4 47.9 47.9a47.84 47.84 0 0 1-47.9 47.9z")),t.InsuranceFill=o("insurance",c,r(a,"M519.9 358.8h97.9v41.6h-97.9zm347-188.9L527.1 54.1C523 52.7 517.5 52 512 52s-11 .7-15.1 2.1L157.1 169.9c-8.3 2.8-15.1 12.4-15.1 21.2v482.4c0 8.8 5.7 20.4 12.6 25.9L499.3 968c3.5 2.7 8 4.1 12.6 4.1s9.2-1.4 12.6-4.1l344.7-268.6c6.9-5.4 12.6-17 12.6-25.9V191.1c.2-8.8-6.6-18.3-14.9-21.2zM411.3 656h-.2c0 4.4-3.6 8-8 8h-37.3c-4.4 0-8-3.6-8-8V471.4c-7.7 9.2-15.4 17.9-23.1 26a6.04 6.04 0 0 1-10.2-2.4l-13.2-43.5c-.6-2-.2-4.1 1.2-5.6 37-43.4 64.7-95.1 82.2-153.6 1.1-3.5 5-5.3 8.4-3.7l38.6 18.3c2.7 1.3 4.1 4.4 3.2 7.2a429.2 429.2 0 0 1-33.6 79V656zm296.5-49.2l-26.3 35.3a5.92 5.92 0 0 1-8.9.7c-30.6-29.3-56.8-65.2-78.1-106.9V656c0 4.4-3.6 8-8 8h-36.2c-4.4 0-8-3.6-8-8V536c-22 44.7-49 80.8-80.6 107.6a5.9 5.9 0 0 1-8.9-1.4L430 605.7a6 6 0 0 1 1.6-8.1c28.6-20.3 51.9-45.2 71-76h-55.1c-4.4 0-8-3.6-8-8V478c0-4.4 3.6-8 8-8h94.9v-18.6h-65.9c-4.4 0-8-3.6-8-8V316c0-4.4 3.6-8 8-8h184.7c4.4 0 8 3.6 8 8v127.2c0 4.4-3.6 8-8 8h-66.7v18.6h98.8c4.4 0 8 3.6 8 8v35.6c0 4.4-3.6 8-8 8h-59c18.1 29.1 41.8 54.3 72.3 76.9 2.6 2.1 3.2 5.9 1.2 8.5z")),t.InterationFill=o("interation",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM726 585.7c0 55.3-44.7 100.1-99.7 100.1H420.6v53.4c0 5.7-6.5 8.8-10.9 5.3l-109.1-85.7c-3.5-2.7-3.5-8 0-10.7l109.1-85.7c4.4-3.5 10.9-.3 10.9 5.3v53.4h205.7c19.6 0 35.5-16 35.5-35.6v-78.9c0-3.7 3-6.8 6.8-6.8h50.7c3.7 0 6.8 3 6.8 6.8v79.1zm-2.6-209.9l-109.1 85.7c-4.4 3.5-10.9.3-10.9-5.3v-53.4H397.7c-19.6 0-35.5 16-35.5 35.6v78.9c0 3.7-3 6.8-6.8 6.8h-50.7c-3.7 0-6.8-3-6.8-6.8v-78.9c0-55.3 44.7-100.1 99.7-100.1h205.7v-53.4c0-5.7 6.5-8.8 10.9-5.3l109.1 85.7c3.6 2.5 3.6 7.8.1 10.5z")),t.GoogleSquareFill=o("google-square",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM679 697.6C638.4 735 583 757 516.9 757c-95.7 0-178.5-54.9-218.8-134.9A245.02 245.02 0 0 1 272 512c0-39.6 9.5-77 26.1-110.1 40.3-80.1 123.1-135 218.8-135 66 0 121.4 24.3 163.9 63.8L610.6 401c-25.4-24.3-57.7-36.6-93.6-36.6-63.8 0-117.8 43.1-137.1 101-4.9 14.7-7.7 30.4-7.7 46.6s2.8 31.9 7.7 46.6c19.3 57.9 73.3 101 137 101 33 0 61-8.7 82.9-23.4 26-17.4 43.2-43.3 48.9-74H516.9v-94.8h230.7c2.9 16.1 4.4 32.8 4.4 50.1 0 74.7-26.7 137.4-73 180.1z")),t.LayoutFill=o("layout",c,r(a,"M384 912h496c17.7 0 32-14.3 32-32V340H384v572zm496-800H384v164h528V144c0-17.7-14.3-32-32-32zm-768 32v736c0 17.7 14.3 32 32 32h176V112H144c-17.7 0-32 14.3-32 32z")),t.LeftCircleFill=o("left-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm104 316.9c0 10.2-4.9 19.9-13.2 25.9L457.4 512l145.4 105.2c8.3 6 13.2 15.6 13.2 25.9V690c0 6.5-7.4 10.3-12.7 6.5l-246-178a7.95 7.95 0 0 1 0-12.9l246-178a8 8 0 0 1 12.7 6.5v46.8z")),t.LeftSquareFill=o("left-square",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM624 380.9c0 10.2-4.9 19.9-13.2 25.9L465.4 512l145.4 105.2c8.3 6 13.2 15.6 13.2 25.9V690c0 6.5-7.4 10.3-12.7 6.5l-246-178a7.95 7.95 0 0 1 0-12.9l246-178c5.3-3.8 12.7 0 12.7 6.5v46.8z")),t.LikeFill=o("like",c,r(a,"M885.9 533.7c16.8-22.2 26.1-49.4 26.1-77.7 0-44.9-25.1-87.4-65.5-111.1a67.67 67.67 0 0 0-34.3-9.3H572.4l6-122.9c1.4-29.7-9.1-57.9-29.5-79.4A106.62 106.62 0 0 0 471 99.9c-52 0-98 35-111.8 85.1l-85.9 311h-.3v428h472.3c9.2 0 18.2-1.8 26.5-5.4 47.6-20.3 78.3-66.8 78.3-118.4 0-12.6-1.8-25-5.4-37 16.8-22.2 26.1-49.4 26.1-77.7 0-12.6-1.8-25-5.4-37 16.8-22.2 26.1-49.4 26.1-77.7-.2-12.6-2-25.1-5.6-37.1zM112 528v364c0 17.7 14.3 32 32 32h65V496h-65c-17.7 0-32 14.3-32 32z")),t.LinkedinFill=o("linkedin",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM349.3 793.7H230.6V411.9h118.7v381.8zm-59.3-434a68.8 68.8 0 1 1 68.8-68.8c-.1 38-30.9 68.8-68.8 68.8zm503.7 434H675.1V608c0-44.3-.8-101.2-61.7-101.2-61.7 0-71.2 48.2-71.2 98v188.9H423.7V411.9h113.8v52.2h1.6c15.8-30 54.5-61.7 112.3-61.7 120.2 0 142.3 79.1 142.3 181.9v209.4z")),t.MailFill=o("mail",c,r(a,"M928 160H96c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V192c0-17.7-14.3-32-32-32zm-80.8 108.9L531.7 514.4c-7.8 6.1-18.7 6.1-26.5 0L189.6 268.9A7.2 7.2 0 0 1 194 256h648.8a7.2 7.2 0 0 1 4.4 12.9z")),t.LockFill=o("lock",c,r(a,"M832 464h-68V240c0-70.7-57.3-128-128-128H388c-70.7 0-128 57.3-128 128v224h-68c-17.7 0-32 14.3-32 32v384c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V496c0-17.7-14.3-32-32-32zM540 701v53c0 4.4-3.6 8-8 8h-40c-4.4 0-8-3.6-8-8v-53a48.01 48.01 0 1 1 56 0zm152-237H332V240c0-30.9 25.1-56 56-56h248c30.9 0 56 25.1 56 56v224z")),t.MedicineBoxFill=o("medicine-box",c,r(a,"M839.2 278.1a32 32 0 0 0-30.4-22.1H736V144c0-17.7-14.3-32-32-32H320c-17.7 0-32 14.3-32 32v112h-72.8a31.9 31.9 0 0 0-30.4 22.1L112 502v378c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V502l-72.8-223.9zM660 628c0 4.4-3.6 8-8 8H544v108c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V636H372c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h108V464c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v108h108c4.4 0 8 3.6 8 8v48zm4-372H360v-72h304v72z")),t.MediumCircleFill=o("medium-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm256 253.7l-40.8 39.1c-3.6 2.7-5.3 7.1-4.6 11.4v287.7c-.7 4.4 1 8.8 4.6 11.4l40 39.1v8.7H566.4v-8.3l41.3-40.1c4.1-4.1 4.1-5.3 4.1-11.4V422.5l-115 291.6h-15.5L347.5 422.5V618c-1.2 8.2 1.7 16.5 7.5 22.4l53.8 65.1v8.7H256v-8.7l53.8-65.1a26.1 26.1 0 0 0 7-22.4V392c.7-6.3-1.7-12.4-6.5-16.7l-47.8-57.6V309H411l114.6 251.5 100.9-251.3H768v8.5z")),t.MediumSquareFill=o("medium-square",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM768 317.7l-40.8 39.1c-3.6 2.7-5.3 7.1-4.6 11.4v287.7c-.7 4.4 1 8.8 4.6 11.4l40 39.1v8.7H566.4v-8.3l41.3-40.1c4.1-4.1 4.1-5.3 4.1-11.4V422.5l-115 291.6h-15.5L347.5 422.5V618c-1.2 8.2 1.7 16.5 7.5 22.4l53.8 65.1v8.7H256v-8.7l53.8-65.1a26.1 26.1 0 0 0 7-22.4V392c.7-6.3-1.7-12.4-6.5-16.7l-47.8-57.6V309H411l114.6 251.5 100.9-251.3H768v8.5z")),t.MessageFill=o("message",c,r(a,"M924.3 338.4a447.57 447.57 0 0 0-96.1-143.3 443.09 443.09 0 0 0-143-96.3A443.91 443.91 0 0 0 512 64h-2c-60.5.3-119 12.3-174.1 35.9a444.08 444.08 0 0 0-141.7 96.5 445 445 0 0 0-95 142.8A449.89 449.89 0 0 0 65 514.1c.3 69.4 16.9 138.3 47.9 199.9v152c0 25.4 20.6 46 45.9 46h151.8a447.72 447.72 0 0 0 199.5 48h2.1c59.8 0 117.7-11.6 172.3-34.3A443.2 443.2 0 0 0 827 830.5c41.2-40.9 73.6-88.7 96.3-142 23.5-55.2 35.5-113.9 35.8-174.5.2-60.9-11.6-120-34.8-175.6zM312.4 560c-26.4 0-47.9-21.5-47.9-48s21.5-48 47.9-48 47.9 21.5 47.9 48-21.4 48-47.9 48zm199.6 0c-26.4 0-47.9-21.5-47.9-48s21.5-48 47.9-48 47.9 21.5 47.9 48-21.5 48-47.9 48zm199.6 0c-26.4 0-47.9-21.5-47.9-48s21.5-48 47.9-48 47.9 21.5 47.9 48-21.5 48-47.9 48z")),t.MehFill=o("meh",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zM288 421a48.01 48.01 0 0 1 96 0 48.01 48.01 0 0 1-96 0zm384 200c0 4.4-3.6 8-8 8H360c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h304c4.4 0 8 3.6 8 8v48zm16-152a48.01 48.01 0 0 1 0-96 48.01 48.01 0 0 1 0 96z")),t.MinusCircleFill=o("minus-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm192 472c0 4.4-3.6 8-8 8H328c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h368c4.4 0 8 3.6 8 8v48z")),t.MinusSquareFill=o("minus-square",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM704 536c0 4.4-3.6 8-8 8H328c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h368c4.4 0 8 3.6 8 8v48z")),t.MobileFill=o("mobile",c,r(a,"M744 62H280c-35.3 0-64 28.7-64 64v768c0 35.3 28.7 64 64 64h464c35.3 0 64-28.7 64-64V126c0-35.3-28.7-64-64-64zM512 824c-22.1 0-40-17.9-40-40s17.9-40 40-40 40 17.9 40 40-17.9 40-40 40z")),t.MoneyCollectFill=o("money-collect",c,r(a,"M911.5 699.7a8 8 0 0 0-10.3-4.8L840 717.2V179c0-37.6-30.4-68-68-68H252c-37.6 0-68 30.4-68 68v538.2l-61.3-22.3c-.9-.3-1.8-.5-2.7-.5-4.4 0-8 3.6-8 8V762c0 3.3 2.1 6.3 5.3 7.5L501 909.1c7.1 2.6 14.8 2.6 21.9 0l383.8-139.5c3.2-1.2 5.3-4.2 5.3-7.5v-59.6c0-1-.2-1.9-.5-2.8zm-243.8-377L564 514.3h57.6c4.4 0 8 3.6 8 8v27.1c0 4.4-3.6 8-8 8h-76.3v39h76.3c4.4 0 8 3.6 8 8v27.1c0 4.4-3.6 8-8 8h-76.3V703c0 4.4-3.6 8-8 8h-49.9c-4.4 0-8-3.6-8-8v-63.4h-76c-4.4 0-8-3.6-8-8v-27.1c0-4.4 3.6-8 8-8h76v-39h-76c-4.4 0-8-3.6-8-8v-27.1c0-4.4 3.6-8 8-8h57L356.5 322.8c-2.1-3.8-.7-8.7 3.2-10.8 1.2-.7 2.5-1 3.8-1h55.7a8 8 0 0 1 7.1 4.4L511 484.2h3.3L599 315.4c1.3-2.7 4.1-4.4 7.1-4.4h54.5c4.4 0 8 3.6 8.1 7.9 0 1.3-.4 2.6-1 3.8z")),t.PauseCircleFill=o("pause-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm-80 600c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V360c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v304zm224 0c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V360c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v304z")),t.NotificationFill=o("notification",c,r(a,"M880 112c-3.8 0-7.7.7-11.6 2.3L292 345.9H128c-8.8 0-16 7.4-16 16.6v299c0 9.2 7.2 16.6 16 16.6h101.6c-3.7 11.6-5.6 23.9-5.6 36.4 0 65.9 53.8 119.5 120 119.5 55.4 0 102.1-37.6 115.9-88.4l408.6 164.2c3.9 1.5 7.8 2.3 11.6 2.3 16.9 0 32-14.2 32-33.2V145.2C912 126.2 897 112 880 112zM344 762.3c-26.5 0-48-21.4-48-47.8 0-11.2 3.9-21.9 11-30.4l84.9 34.1c-2 24.6-22.7 44.1-47.9 44.1z")),t.PhoneFill=o("phone",c,r(a,"M885.6 230.2L779.1 123.8a80.83 80.83 0 0 0-57.3-23.8c-21.7 0-42.1 8.5-57.4 23.8L549.8 238.4a80.83 80.83 0 0 0-23.8 57.3c0 21.7 8.5 42.1 23.8 57.4l83.8 83.8A393.82 393.82 0 0 1 553.1 553 395.34 395.34 0 0 1 437 633.8L353.2 550a80.83 80.83 0 0 0-57.3-23.8c-21.7 0-42.1 8.5-57.4 23.8L123.8 664.5a80.89 80.89 0 0 0-23.8 57.4c0 21.7 8.5 42.1 23.8 57.4l106.3 106.3c24.4 24.5 58.1 38.4 92.7 38.4 7.3 0 14.3-.6 21.2-1.8 134.8-22.2 268.5-93.9 376.4-201.7C828.2 612.8 899.8 479.2 922.3 344c6.8-41.3-6.9-83.8-36.7-113.8z")),t.PayCircleFill=o("pay-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm166.6 246.8L567.5 515.6h62c4.4 0 8 3.6 8 8v29.9c0 4.4-3.6 8-8 8h-82V603h82c4.4 0 8 3.6 8 8v29.9c0 4.4-3.6 8-8 8h-82V717c0 4.4-3.6 8-8 8h-54.3c-4.4 0-8-3.6-8-8v-68.1h-81.7c-4.4 0-8-3.6-8-8V611c0-4.4 3.6-8 8-8h81.7v-41.5h-81.7c-4.4 0-8-3.6-8-8v-29.9c0-4.4 3.6-8 8-8h61.4L345.4 310.8a8.07 8.07 0 0 1 7-11.9h60.7c3 0 5.8 1.7 7.1 4.4l90.6 180h3.4l90.6-180a8 8 0 0 1 7.1-4.4h59.5c4.4 0 8 3.6 8 8 .2 1.4-.2 2.7-.8 3.9z")),t.PictureFill=o("picture",c,r(a,"M928 160H96c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V192c0-17.7-14.3-32-32-32zM338 304c35.3 0 64 28.7 64 64s-28.7 64-64 64-64-28.7-64-64 28.7-64 64-64zm513.9 437.1a8.11 8.11 0 0 1-5.2 1.9H177.2c-4.4 0-8-3.6-8-8 0-1.9.7-3.7 1.9-5.2l170.3-202c2.8-3.4 7.9-3.8 11.3-1 .3.3.7.6 1 1l99.4 118 158.1-187.5c2.8-3.4 7.9-3.8 11.3-1 .3.3.7.6 1 1l229.6 271.6c2.6 3.3 2.2 8.4-1.2 11.2z")),t.PieChartFill=o("pie-chart",c,r(a,"M863.1 518.5H505.5V160.9c0-4.4-3.6-8-8-8h-26a398.57 398.57 0 0 0-282.5 117 397.47 397.47 0 0 0-85.6 127C82.6 446.2 72 498.5 72 552.5S82.6 658.7 103.4 708c20.1 47.5 48.9 90.3 85.6 127 36.7 36.7 79.4 65.5 127 85.6a396.64 396.64 0 0 0 155.6 31.5 398.57 398.57 0 0 0 282.5-117c36.7-36.7 65.5-79.4 85.6-127a396.64 396.64 0 0 0 31.5-155.6v-26c-.1-4.4-3.7-8-8.1-8zM951 463l-2.6-28.2c-8.5-92-49.3-178.8-115.1-244.3A398.5 398.5 0 0 0 588.4 75.6L560.1 73c-4.7-.4-8.7 3.2-8.7 7.9v383.7c0 4.4 3.6 8 8 8l383.6-1c4.7-.1 8.4-4 8-8.6z")),t.PlayCircleFill=o("play-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm144.1 454.9L437.7 677.8a8.02 8.02 0 0 1-12.7-6.5V353.7a8 8 0 0 1 12.7-6.5L656.1 506a7.9 7.9 0 0 1 0 12.9z")),t.PlaySquareFill=o("play-square",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM641.7 520.8L442.3 677.6c-7.4 5.8-18.3.6-18.3-8.8V355.3c0-9.4 10.9-14.7 18.3-8.8l199.4 156.7a11.2 11.2 0 0 1 0 17.6z")),t.PlusSquareFill=o("plus-square",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM704 536c0 4.4-3.6 8-8 8H544v152c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V544H328c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h152V328c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v152h152c4.4 0 8 3.6 8 8v48z")),t.PlusCircleFill=o("plus-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm192 472c0 4.4-3.6 8-8 8H544v152c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V544H328c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h152V328c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v152h152c4.4 0 8 3.6 8 8v48z")),t.PrinterFill=o("printer",c,r(a,"M732 120c0-4.4-3.6-8-8-8H300c-4.4 0-8 3.6-8 8v148h440V120zm120 212H172c-44.2 0-80 35.8-80 80v328c0 17.7 14.3 32 32 32h168v132c0 4.4 3.6 8 8 8h424c4.4 0 8-3.6 8-8V772h168c17.7 0 32-14.3 32-32V412c0-44.2-35.8-80-80-80zM664 844H360V568h304v276zm164-360c0 4.4-3.6 8-8 8h-40c-4.4 0-8-3.6-8-8v-40c0-4.4 3.6-8 8-8h40c4.4 0 8 3.6 8 8v40z")),t.ProfileFill=o("profile",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM380 696c-22.1 0-40-17.9-40-40s17.9-40 40-40 40 17.9 40 40-17.9 40-40 40zm0-144c-22.1 0-40-17.9-40-40s17.9-40 40-40 40 17.9 40 40-17.9 40-40 40zm0-144c-22.1 0-40-17.9-40-40s17.9-40 40-40 40 17.9 40 40-17.9 40-40 40zm304 272c0 4.4-3.6 8-8 8H492c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h184c4.4 0 8 3.6 8 8v48zm0-144c0 4.4-3.6 8-8 8H492c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h184c4.4 0 8 3.6 8 8v48zm0-144c0 4.4-3.6 8-8 8H492c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h184c4.4 0 8 3.6 8 8v48z")),t.DownSquareFill=o("down-square",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM696.5 412.7l-178 246a7.95 7.95 0 0 1-12.9 0l-178-246c-3.8-5.3 0-12.7 6.5-12.7H381c10.2 0 19.9 4.9 25.9 13.2L512 558.6l105.2-145.4c6-8.3 15.6-13.2 25.9-13.2H690c6.5 0 10.3 7.4 6.5 12.7z")),t.ProjectFill=o("project",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM368 744c0 4.4-3.6 8-8 8h-80c-4.4 0-8-3.6-8-8V280c0-4.4 3.6-8 8-8h80c4.4 0 8 3.6 8 8v464zm192-280c0 4.4-3.6 8-8 8h-80c-4.4 0-8-3.6-8-8V280c0-4.4 3.6-8 8-8h80c4.4 0 8 3.6 8 8v184zm192 72c0 4.4-3.6 8-8 8h-80c-4.4 0-8-3.6-8-8V280c0-4.4 3.6-8 8-8h80c4.4 0 8 3.6 8 8v256z")),t.PropertySafetyFill=o("property-safety",c,r(a,"M866.9 169.9L527.1 54.1C523 52.7 517.5 52 512 52s-11 .7-15.1 2.1L157.1 169.9c-8.3 2.8-15.1 12.4-15.1 21.2v482.4c0 8.8 5.7 20.4 12.6 25.9L499.3 968c3.5 2.7 8 4.1 12.6 4.1s9.2-1.4 12.6-4.1l344.7-268.6c6.9-5.4 12.6-17 12.6-25.9V191.1c.2-8.8-6.6-18.3-14.9-21.2zM648.3 332.8l-87.7 161.1h45.7c5.5 0 10 4.5 10 10v21.3c0 5.5-4.5 10-10 10h-63.4v29.7h63.4c5.5 0 10 4.5 10 10v21.3c0 5.5-4.5 10-10 10h-63.4V658c0 5.5-4.5 10-10 10h-41.3c-5.5 0-10-4.5-10-10v-51.8h-63.1c-5.5 0-10-4.5-10-10v-21.3c0-5.5 4.5-10 10-10h63.1v-29.7h-63.1c-5.5 0-10-4.5-10-10v-21.3c0-5.5 4.5-10 10-10h45.2l-88-161.1c-2.6-4.8-.9-10.9 4-13.6 1.5-.8 3.1-1.2 4.8-1.2h46c3.8 0 7.2 2.1 8.9 5.5l72.9 144.3 73.2-144.3a10 10 0 0 1 8.9-5.5h45c5.5 0 10 4.5 10 10 .1 1.7-.3 3.3-1.1 4.8z")),t.PushpinFill=o("pushpin",c,r(a,"M878.3 392.1L631.9 145.7c-6.5-6.5-15-9.7-23.5-9.7s-17 3.2-23.5 9.7L423.8 306.9c-12.2-1.4-24.5-2-36.8-2-73.2 0-146.4 24.1-206.5 72.3-15.4 12.3-16.6 35.4-2.7 49.4l181.7 181.7-215.4 215.2a15.8 15.8 0 0 0-4.6 9.8l-3.4 37.2c-.9 9.4 6.6 17.4 15.9 17.4.5 0 1 0 1.5-.1l37.2-3.4c3.7-.3 7.2-2 9.8-4.6l215.4-215.4 181.7 181.7c6.5 6.5 15 9.7 23.5 9.7 9.7 0 19.3-4.2 25.9-12.4 56.3-70.3 79.7-158.3 70.2-243.4l161.1-161.1c12.9-12.8 12.9-33.8 0-46.8z")),t.QqCircleFill=o("qq-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm210.5 612.4c-11.5 1.4-44.9-52.7-44.9-52.7 0 31.3-16.2 72.2-51.1 101.8 16.9 5.2 54.9 19.2 45.9 34.4-7.3 12.3-125.6 7.9-159.8 4-34.2 3.8-152.5 8.3-159.8-4-9.1-15.2 28.9-29.2 45.8-34.4-35-29.5-51.1-70.4-51.1-101.8 0 0-33.4 54.1-44.9 52.7-5.4-.7-12.4-29.6 9.4-99.7 10.3-33 22-60.5 40.2-105.8-3.1-116.9 45.3-215 160.4-215 113.9 0 163.3 96.1 160.4 215 18.1 45.2 29.9 72.8 40.2 105.8 21.7 70.1 14.6 99.1 9.3 99.7z")),t.QqSquareFill=o("qq-square",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM722.5 676.4c-11.5 1.4-44.9-52.7-44.9-52.7 0 31.3-16.2 72.2-51.1 101.8 16.9 5.2 54.9 19.2 45.9 34.4-7.3 12.3-125.6 7.9-159.8 4-34.2 3.8-152.5 8.3-159.8-4-9.1-15.2 28.9-29.2 45.8-34.4-35-29.5-51.1-70.4-51.1-101.8 0 0-33.4 54.1-44.9 52.7-5.4-.7-12.4-29.6 9.4-99.7 10.3-33 22-60.5 40.2-105.8-3.1-116.9 45.3-215 160.4-215 113.9 0 163.3 96.1 160.4 215 18.1 45.2 29.9 72.8 40.2 105.8 21.7 70.1 14.6 99.1 9.3 99.7z")),t.QuestionCircleFill=o("question-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 708c-22.1 0-40-17.9-40-40s17.9-40 40-40 40 17.9 40 40-17.9 40-40 40zm62.9-219.5a48.3 48.3 0 0 0-30.9 44.8V620c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-21.5c0-23.1 6.7-45.9 19.9-64.9 12.9-18.6 30.9-32.8 52.1-40.9 34-13.1 56-41.6 56-72.7 0-44.1-43.1-80-96-80s-96 35.9-96 80v7.6c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V420c0-39.3 17.2-76 48.4-103.3C430.4 290.4 470 276 512 276s81.6 14.5 111.6 40.7C654.8 344 672 380.7 672 420c0 57.8-38.1 109.8-97.1 132.5z")),t.ReadFill=o("read",c,r(a,"M928 161H699.2c-49.1 0-97.1 14.1-138.4 40.7L512 233l-48.8-31.3A255.2 255.2 0 0 0 324.8 161H96c-17.7 0-32 14.3-32 32v568c0 17.7 14.3 32 32 32h228.8c49.1 0 97.1 14.1 138.4 40.7l44.4 28.6c1.3.8 2.8 1.3 4.3 1.3s3-.4 4.3-1.3l44.4-28.6C602 807.1 650.1 793 699.2 793H928c17.7 0 32-14.3 32-32V193c0-17.7-14.3-32-32-32zM404 553.5c0 4.1-3.2 7.5-7.1 7.5H211.1c-3.9 0-7.1-3.4-7.1-7.5v-45c0-4.1 3.2-7.5 7.1-7.5h185.7c3.9 0 7.1 3.4 7.1 7.5v45zm0-140c0 4.1-3.2 7.5-7.1 7.5H211.1c-3.9 0-7.1-3.4-7.1-7.5v-45c0-4.1 3.2-7.5 7.1-7.5h185.7c3.9 0 7.1 3.4 7.1 7.5v45zm416 140c0 4.1-3.2 7.5-7.1 7.5H627.1c-3.9 0-7.1-3.4-7.1-7.5v-45c0-4.1 3.2-7.5 7.1-7.5h185.7c3.9 0 7.1 3.4 7.1 7.5v45zm0-140c0 4.1-3.2 7.5-7.1 7.5H627.1c-3.9 0-7.1-3.4-7.1-7.5v-45c0-4.1 3.2-7.5 7.1-7.5h185.7c3.9 0 7.1 3.4 7.1 7.5v45z")),t.ReconciliationFill=o("reconciliation",c,r(a,"M676 623c-18.8 0-34 15.2-34 34s15.2 34 34 34 34-15.2 34-34-15.2-34-34-34zm204-455H668c0-30.9-25.1-56-56-56h-80c-30.9 0-56 25.1-56 56H264c-17.7 0-32 14.3-32 32v200h-88c-17.7 0-32 14.3-32 32v448c0 17.7 14.3 32 32 32h336c17.7 0 32-14.3 32-32v-16h368c17.7 0 32-14.3 32-32V200c0-17.7-14.3-32-32-32zM448 848H176V616h272v232zm0-296H176v-88h272v88zm20-272v-48h72v-56h64v56h72v48H468zm180 168v56c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-56c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8zm28 301c-50.8 0-92-41.2-92-92s41.2-92 92-92 92 41.2 92 92-41.2 92-92 92zm92-245c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-96c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v96zm-92 61c-50.8 0-92 41.2-92 92s41.2 92 92 92 92-41.2 92-92-41.2-92-92-92zm0 126c-18.8 0-34-15.2-34-34s15.2-34 34-34 34 15.2 34 34-15.2 34-34 34z")),t.RedEnvelopeFill=o("red-envelope",c,r(a,"M832 64H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V96c0-17.7-14.3-32-32-32zM647 470.4l-87.2 161h45.9c4.6 0 8.4 3.8 8.4 8.4v25.1c0 4.6-3.8 8.4-8.4 8.4h-63.3v28.6h63.3c4.6 0 8.4 3.8 8.4 8.4v25c.2 4.6-3.6 8.5-8.2 8.5h-63.3v49.9c0 4.6-3.8 8.4-8.4 8.4h-43.7c-4.6 0-8.4-3.8-8.4-8.4v-49.9h-63c-4.6 0-8.4-3.8-8.4-8.4v-25.1c0-4.6 3.8-8.4 8.4-8.4h63v-28.6h-63c-4.6 0-8.4-3.8-8.4-8.4v-25.1c0-4.6 3.8-8.4 8.4-8.4h45.4l-87.5-161c-2.2-4.1-.7-9.1 3.4-11.4 1.3-.6 2.6-1 3.9-1h48.8c3.2 0 6.1 1.8 7.5 4.6l71.9 141.8 71.9-141.9a8.5 8.5 0 0 1 7.5-4.6h47.8c4.6 0 8.4 3.8 8.4 8.4-.1 1.5-.5 2.9-1.1 4.1zM512.6 323L289 148h446L512.6 323z")),t.RedditCircleFill=o("reddit-circle",c,r(a,"M584 548a36 36 0 1 0 72 0 36 36 0 1 0-72 0zm144-108a35.9 35.9 0 0 0-32.5 20.6c18.8 14.3 34.4 30.7 45.9 48.8A35.98 35.98 0 0 0 728 440zM512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm245 477.9c4.6 13.5 7 27.6 7 42.1 0 99.4-112.8 180-252 180s-252-80.6-252-180c0-14.5 2.4-28.6 7-42.1A72.01 72.01 0 0 1 296 404c27.1 0 50.6 14.9 62.9 37 36.2-19.8 80.2-32.8 128.1-36.1l58.4-131.1c4.3-9.8 15.2-14.8 25.5-11.8l91.6 26.5a54.03 54.03 0 0 1 101.6 25.6c0 29.8-24.2 54-54 54-23.5 0-43.5-15.1-50.9-36.1L577 308.3l-43 96.5c49.1 3 94.2 16.1 131.2 36.3 12.3-22.1 35.8-37 62.9-37 39.8 0 72 32.2 72 72-.1 29.3-17.8 54.6-43.1 65.8zm-171.3 83c-14.9 11.7-44.3 24.3-73.7 24.3s-58.9-12.6-73.7-24.3c-9.3-7.3-22.7-5.7-30 3.6-7.3 9.3-5.7 22.7 3.6 30 25.7 20.4 65 33.5 100.1 33.5 35.1 0 74.4-13.1 100.2-33.5 9.3-7.3 10.9-20.8 3.6-30a21.46 21.46 0 0 0-30.1-3.6zM296 440a35.98 35.98 0 0 0-13.4 69.4c11.5-18.1 27.1-34.5 45.9-48.8A35.9 35.9 0 0 0 296 440zm72 108a36 36 0 1 0 72 0 36 36 0 1 0-72 0z")),t.RedditSquareFill=o("reddit-square",c,r(a,"M296 440a35.98 35.98 0 0 0-13.4 69.4c11.5-18.1 27.1-34.5 45.9-48.8A35.9 35.9 0 0 0 296 440zm289.7 184.9c-14.9 11.7-44.3 24.3-73.7 24.3s-58.9-12.6-73.7-24.3c-9.3-7.3-22.7-5.7-30 3.6-7.3 9.3-5.7 22.7 3.6 30 25.7 20.4 65 33.5 100.1 33.5 35.1 0 74.4-13.1 100.2-33.5 9.3-7.3 10.9-20.8 3.6-30a21.46 21.46 0 0 0-30.1-3.6zM880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM757 541.9c4.6 13.5 7 27.6 7 42.1 0 99.4-112.8 180-252 180s-252-80.6-252-180c0-14.5 2.4-28.6 7-42.1A72.01 72.01 0 0 1 296 404c27.1 0 50.6 14.9 62.9 37 36.2-19.8 80.2-32.8 128.1-36.1l58.4-131.1c4.3-9.8 15.2-14.8 25.5-11.8l91.6 26.5a54.03 54.03 0 0 1 101.6 25.6c0 29.8-24.2 54-54 54-23.5 0-43.5-15.1-50.9-36.1L577 308.3l-43 96.5c49.1 3 94.2 16.1 131.2 36.3 12.3-22.1 35.8-37 62.9-37 39.8 0 72 32.2 72 72-.1 29.3-17.8 54.6-43.1 65.8zM584 548a36 36 0 1 0 72 0 36 36 0 1 0-72 0zm144-108a35.9 35.9 0 0 0-32.5 20.6c18.8 14.3 34.4 30.7 45.9 48.8A35.98 35.98 0 0 0 728 440zM368 548a36 36 0 1 0 72 0 36 36 0 1 0-72 0z")),t.RestFill=o("rest",c,r(a,"M832 256h-28.1l-35.7-120.9c-4-13.7-16.5-23.1-30.7-23.1h-451c-14.3 0-26.8 9.4-30.7 23.1L220.1 256H192c-17.7 0-32 14.3-32 32v28c0 4.4 3.6 8 8 8h45.8l47.7 558.7a32 32 0 0 0 31.9 29.3h429.2a32 32 0 0 0 31.9-29.3L802.2 324H856c4.4 0 8-3.6 8-8v-28c0-17.7-14.3-32-32-32zM508 704c-79.5 0-144-64.5-144-144s64.5-144 144-144 144 64.5 144 144-64.5 144-144 144zM291 256l22.4-76h397.2l22.4 76H291zm137 304a80 80 0 1 0 160 0 80 80 0 1 0-160 0z")),t.RightCircleFill=o("right-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm154.7 454.5l-246 178c-5.3 3.8-12.7 0-12.7-6.5v-46.9c0-10.2 4.9-19.9 13.2-25.9L566.6 512 421.2 406.8c-8.3-6-13.2-15.6-13.2-25.9V334c0-6.5 7.4-10.3 12.7-6.5l246 178c4.4 3.2 4.4 9.8 0 13z")),t.RightSquareFill=o("right-square",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM658.7 518.5l-246 178c-5.3 3.8-12.7 0-12.7-6.5v-46.9c0-10.2 4.9-19.9 13.2-25.9L558.6 512 413.2 406.8c-8.3-6-13.2-15.6-13.2-25.9V334c0-6.5 7.4-10.3 12.7-6.5l246 178c4.4 3.2 4.4 9.8 0 13z")),t.RocketFill=o("rocket",c,r(a,"M864 736c0-111.6-65.4-208-160-252.9V317.3c0-15.1-5.3-29.7-15.1-41.2L536.5 95.4C530.1 87.8 521 84 512 84s-18.1 3.8-24.5 11.4L335.1 276.1a63.97 63.97 0 0 0-15.1 41.2v165.8C225.4 528 160 624.4 160 736h156.5c-2.3 7.2-3.5 15-3.5 23.8 0 22.1 7.6 43.7 21.4 60.8a97.2 97.2 0 0 0 43.1 30.6c23.1 54 75.6 88.8 134.5 88.8 29.1 0 57.3-8.6 81.4-24.8 23.6-15.8 41.9-37.9 53-64a97 97 0 0 0 43.1-30.5 97.52 97.52 0 0 0 21.4-60.8c0-8.4-1.1-16.4-3.1-23.8L864 736zM512 352a48.01 48.01 0 0 1 0 96 48.01 48.01 0 0 1 0-96zm116.1 432.2c-5.2 3-11.2 4.2-17.1 3.4l-19.5-2.4-2.8 19.4c-5.4 37.9-38.4 66.5-76.7 66.5s-71.3-28.6-76.7-66.5l-2.8-19.5-19.5 2.5a27.7 27.7 0 0 1-17.1-3.5c-8.7-5-14.1-14.3-14.1-24.4 0-10.6 5.9-19.4 14.6-23.8h231.3c8.8 4.5 14.6 13.3 14.6 23.8-.1 10.2-5.5 19.6-14.2 24.5z")),t.SafetyCertificateFill=o("safety-certificate",c,r(a,"M866.9 169.9L527.1 54.1C523 52.7 517.5 52 512 52s-11 .7-15.1 2.1L157.1 169.9c-8.3 2.8-15.1 12.4-15.1 21.2v482.4c0 8.8 5.7 20.4 12.6 25.9L499.3 968c3.5 2.7 8 4.1 12.6 4.1s9.2-1.4 12.6-4.1l344.7-268.6c6.9-5.4 12.6-17 12.6-25.9V191.1c.2-8.8-6.6-18.3-14.9-21.2zM694.5 340.7L481.9 633.4a16.1 16.1 0 0 1-26 0l-126.4-174c-3.8-5.3 0-12.7 6.5-12.7h55.2c5.1 0 10 2.5 13 6.6l64.7 89 150.9-207.8c3-4.1 7.8-6.6 13-6.6H688c6.5.1 10.3 7.5 6.5 12.8z")),t.SaveFill=o("save",c,r(a,"M893.3 293.3L730.7 130.7c-12-12-28.3-18.7-45.3-18.7H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V338.5c0-17-6.7-33.2-18.7-45.2zM384 176h256v112H384V176zm128 554c-79.5 0-144-64.5-144-144s64.5-144 144-144 144 64.5 144 144-64.5 144-144 144zm0-224c-44.2 0-80 35.8-80 80s35.8 80 80 80 80-35.8 80-80-35.8-80-80-80z")),t.ScheduleFill=o("schedule",c,r(a,"M928 224H768v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56H548v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56H328v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56H96c-17.7 0-32 14.3-32 32v576c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V256c0-17.7-14.3-32-32-32zM424 688c0 4.4-3.6 8-8 8H232c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h184c4.4 0 8 3.6 8 8v48zm0-136c0 4.4-3.6 8-8 8H232c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h184c4.4 0 8 3.6 8 8v48zm374.5-91.3l-165 228.7a15.9 15.9 0 0 1-25.8 0L493.5 531.2c-3.8-5.3 0-12.7 6.5-12.7h54.9c5.1 0 9.9 2.5 12.9 6.6l52.8 73.1 103.7-143.7c3-4.2 7.8-6.6 12.9-6.6H792c6.5.1 10.3 7.5 6.5 12.8z")),t.SecurityScanFill=o("security-scan",c,r(a,"M866.9 169.9L527.1 54.1C523 52.7 517.5 52 512 52s-11 .7-15.1 2.1L157.1 169.9c-8.3 2.8-15.1 12.4-15.1 21.2v482.4c0 8.8 5.7 20.4 12.6 25.9L499.3 968c3.5 2.7 8 4.1 12.6 4.1s9.2-1.4 12.6-4.1l344.7-268.6c6.9-5.4 12.6-17 12.6-25.9V191.1c.2-8.8-6.6-18.3-14.9-21.2zM626.8 554c-48.5 48.5-123 55.2-178.6 20.1l-77.5 77.5a8.03 8.03 0 0 1-11.3 0l-34-34a8.03 8.03 0 0 1 0-11.3l77.5-77.5c-35.1-55.7-28.4-130.1 20.1-178.6 56.3-56.3 147.5-56.3 203.8 0 56.3 56.3 56.3 147.5 0 203.8zm-158.54-45.27a80.1 80.1 0 1 0 113.27-113.28 80.1 80.1 0 1 0-113.27 113.28z")),t.ShopFill=o("shop",c,r(a,"M882 272.1V144c0-17.7-14.3-32-32-32H174c-17.7 0-32 14.3-32 32v128.1c-16.7 1-30 14.9-30 31.9v131.7a177 177 0 0 0 14.4 70.4c4.3 10.2 9.6 19.8 15.6 28.9v345c0 17.6 14.3 32 32 32h274V736h128v176h274c17.7 0 32-14.3 32-32V535a175 175 0 0 0 15.6-28.9c9.5-22.3 14.4-46 14.4-70.4V304c0-17-13.3-30.9-30-31.9zm-72 568H640V704c0-17.7-14.3-32-32-32H416c-17.7 0-32 14.3-32 32v136.1H214V597.9c2.9 1.4 5.9 2.8 9 4 22.3 9.4 46 14.1 70.4 14.1s48-4.7 70.4-14.1c13.8-5.8 26.8-13.2 38.7-22.1.2-.1.4-.1.6 0a180.4 180.4 0 0 0 38.7 22.1c22.3 9.4 46 14.1 70.4 14.1 24.4 0 48-4.7 70.4-14.1 13.8-5.8 26.8-13.2 38.7-22.1.2-.1.4-.1.6 0a180.4 180.4 0 0 0 38.7 22.1c22.3 9.4 46 14.1 70.4 14.1 24.4 0 48-4.7 70.4-14.1 3-1.3 6-2.6 9-4v242.2zm0-568.1H214v-88h596v88z")),t.ShoppingFill=o("shopping",c,r(a,"M832 312H696v-16c0-101.6-82.4-184-184-184s-184 82.4-184 184v16H192c-17.7 0-32 14.3-32 32v536c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V344c0-17.7-14.3-32-32-32zm-208 0H400v-16c0-61.9 50.1-112 112-112s112 50.1 112 112v16z")),t.SketchCircleFill=o("sketch-circle",c,r(a,"M582.3 625.6l147.9-166.3h-63.4zm90-202.3h62.5l-92.1-115.1zm-274.7 36L512 684.5l114.4-225.2zM512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm286.7 380.2L515.8 762.3c-1 1.1-2.4 1.7-3.8 1.7s-2.8-.6-3.8-1.7L225.3 444.2a5.14 5.14 0 0 1-.2-6.6L365.6 262c1-1.2 2.4-1.9 4-1.9h284.6c1.6 0 3 .7 4 1.9l140.5 175.6a4.9 4.9 0 0 1 0 6.6zm-190.5-20.9L512 326.1l-96.2 97.2zM420.3 301.1l-23.1 89.8 88.8-89.8zm183.4 0H538l88.8 89.8zm-222.4 7.1l-92.1 115.1h62.5zm-87.5 151.1l147.9 166.3-84.5-166.3z")),t.SketchSquareFill=o("sketch-square",c,r(a,"M608.2 423.3L512 326.1l-96.2 97.2zm-25.9 202.3l147.9-166.3h-63.4zm90-202.3h62.5l-92.1-115.1zM880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-81.3 332.2L515.8 762.3c-1 1.1-2.4 1.7-3.8 1.7s-2.8-.6-3.8-1.7L225.3 444.2a5.14 5.14 0 0 1-.2-6.6L365.6 262c1-1.2 2.4-1.9 4-1.9h284.6c1.6 0 3 .7 4 1.9l140.5 175.6a4.9 4.9 0 0 1 0 6.6zm-401.1 15.1L512 684.5l114.4-225.2zm-16.3-151.1l-92.1 115.1h62.5zm-87.5 151.1l147.9 166.3-84.5-166.3zm126.5-158.2l-23.1 89.8 88.8-89.8zm183.4 0H538l88.8 89.8z")),t.SkinFill=o("skin",c,r(a,"M870 126H663.8c-17.4 0-32.9 11.9-37 29.3C614.3 208.1 567 246 512 246s-102.3-37.9-114.8-90.7a37.93 37.93 0 0 0-37-29.3H154a44 44 0 0 0-44 44v252a44 44 0 0 0 44 44h75v388a44 44 0 0 0 44 44h478a44 44 0 0 0 44-44V466h75a44 44 0 0 0 44-44V170a44 44 0 0 0-44-44z")),t.SkypeFill=o("skype",c,r(a,"M883.7 578.6c4.1-22.5 6.3-45.5 6.3-68.5 0-51-10-100.5-29.7-147-19-45-46.3-85.4-81-120.1a375.79 375.79 0 0 0-120.1-80.9c-46.6-19.7-96-29.7-147-29.7-24 0-48.1 2.3-71.5 6.8A225.1 225.1 0 0 0 335.6 113c-59.7 0-115.9 23.3-158.1 65.5A222.25 222.25 0 0 0 112 336.6c0 38 9.8 75.4 28.1 108.4-3.7 21.4-5.7 43.3-5.7 65.1 0 51 10 100.5 29.7 147 19 45 46.2 85.4 80.9 120.1 34.7 34.7 75.1 61.9 120.1 80.9 46.6 19.7 96 29.7 147 29.7 22.2 0 44.4-2 66.2-5.9 33.5 18.9 71.3 29 110 29 59.7 0 115.9-23.2 158.1-65.5 42.3-42.2 65.5-98.4 65.5-158.1.1-38-9.7-75.5-28.2-108.7zm-370 162.9c-134.2 0-194.2-66-194.2-115.4 0-25.4 18.7-43.1 44.5-43.1 57.4 0 42.6 82.5 149.7 82.5 54.9 0 85.2-29.8 85.2-60.3 0-18.3-9-38.7-45.2-47.6l-119.4-29.8c-96.1-24.1-113.6-76.1-113.6-124.9 0-101.4 95.5-139.5 185.2-139.5 82.6 0 180 45.7 180 106.5 0 26.1-22.6 41.2-48.4 41.2-49 0-40-67.8-138.7-67.8-49 0-76.1 22.2-76.1 53.9s38.7 41.8 72.3 49.5l88.4 19.6c96.8 21.6 121.3 78.1 121.3 131.3 0 82.3-63.3 143.9-191 143.9z")),t.SlackSquareFill=o("slack-square",c,r(a,"M893.1 397.6c-85.8-286-209.5-352.5-495.5-266.7S45.1 340.4 130.9 626.4s209.5 352.5 495.5 266.7 352.5-209.5 266.7-495.5zm-150 189.9l-50.3 16.3 16.5 50.6c7.7 23.6-5.3 49-28.9 56.7-23.6 7.7-49-5.3-56.7-28.9l-16.5-50.6L506 664.5l16.5 50.6c7.7 23.6-5.3 49-28.9 56.7-23.6 7.7-49-5.3-56.7-28.9l-16.5-50.6-51 16.6c-23.6 7.7-49-5.3-56.7-28.9s5.3-49 28.9-56.7l51-16.6-32.9-101.3-51 16.6c-23.6 7.7-49-5.3-56.7-28.9-7.7-23.6 5.3-49 28.9-56.7l51-16.6-16.5-50.6c-7.7-23.6 5.3-49 28.9-56.7 23.6-7.7 49 5.3 56.7 28.9l16.5 50.6 101.3-32.9-16.5-50.6c-7.7-23.6 5.3-49 28.9-56.7s49 5.3 56.7 28.9l16.5 50.6 50.3-16.3c23.6-7.7 49 5.3 56.7 28.9 7.7 23.6-5.3 49-28.9 56.7L632.1 417 665 518.3l50.3-16.3c23.6-7.7 49 5.3 56.7 28.9 7.7 23.6-5.3 48.9-28.9 56.6zM445.26 477.67l101.3-32.9 32.9 101.29-101.29 32.9z")),t.SlackCircleFill=o("slack-circle",c,r(a,"M445.26 477.67l101.3-32.9 32.9 101.29-101.29 32.9zM512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm231.1 523.5l-50.3 16.3 16.5 50.6c7.7 23.6-5.3 49-28.9 56.7-23.6 7.7-49-5.3-56.7-28.9l-16.5-50.6L506 664.5l16.5 50.6c7.7 23.6-5.3 49-28.9 56.7-23.6 7.7-49-5.3-56.7-28.9l-16.5-50.6-51 16.6c-23.6 7.7-49-5.3-56.7-28.9s5.3-49 28.9-56.7l51-16.6-32.9-101.3-51 16.6c-23.6 7.7-49-5.3-56.7-28.9-7.7-23.6 5.3-49 28.9-56.7l51-16.6-16.5-50.6c-7.7-23.6 5.3-49 28.9-56.7 23.6-7.7 49 5.3 56.7 28.9l16.5 50.6 101.3-32.9-16.5-50.6c-7.7-23.6 5.3-49 28.9-56.7s49 5.3 56.7 28.9l16.5 50.6 50.3-16.3c23.6-7.7 49 5.3 56.7 28.9 7.7 23.6-5.3 49-28.9 56.7L632.1 417 665 518.3l50.3-16.3c23.6-7.7 49 5.3 56.7 28.9 7.6 23.5-5.3 48.9-28.9 56.6z")),t.SlidersFill=o("sliders",c,r(a,"M904 296h-66v-96c0-4.4-3.6-8-8-8h-52c-4.4 0-8 3.6-8 8v96h-66c-4.4 0-8 3.6-8 8v416c0 4.4 3.6 8 8 8h66v96c0 4.4 3.6 8 8 8h52c4.4 0 8-3.6 8-8v-96h66c4.4 0 8-3.6 8-8V304c0-4.4-3.6-8-8-8zm-584-72h-66v-56c0-4.4-3.6-8-8-8h-52c-4.4 0-8 3.6-8 8v56h-66c-4.4 0-8 3.6-8 8v560c0 4.4 3.6 8 8 8h66v56c0 4.4 3.6 8 8 8h52c4.4 0 8-3.6 8-8v-56h66c4.4 0 8-3.6 8-8V232c0-4.4-3.6-8-8-8zm292 180h-66V232c0-4.4-3.6-8-8-8h-52c-4.4 0-8 3.6-8 8v172h-66c-4.4 0-8 3.6-8 8v200c0 4.4 3.6 8 8 8h66v172c0 4.4 3.6 8 8 8h52c4.4 0 8-3.6 8-8V620h66c4.4 0 8-3.6 8-8V412c0-4.4-3.6-8-8-8z")),t.SmileFill=o("smile",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zM288 421a48.01 48.01 0 0 1 96 0 48.01 48.01 0 0 1-96 0zm224 272c-85.5 0-155.6-67.3-160-151.6a8 8 0 0 1 8-8.4h48.1c4.2 0 7.8 3.2 8.1 7.4C420 589.9 461.5 629 512 629s92.1-39.1 95.8-88.6c.3-4.2 3.9-7.4 8.1-7.4H664a8 8 0 0 1 8 8.4C667.6 625.7 597.5 693 512 693zm176-224a48.01 48.01 0 0 1 0-96 48.01 48.01 0 0 1 0 96z")),t.SnippetsFill=o("snippets",c,r(a,"M832 112H724V72c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v40H500V72c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v40H320c-17.7 0-32 14.3-32 32v120h-96c-17.7 0-32 14.3-32 32v632c0 17.7 14.3 32 32 32h512c17.7 0 32-14.3 32-32v-96h96c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM664 486H514V336h.2L664 485.8v.2zm128 274h-56V456L544 264H360v-80h68v32c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-32h152v32c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-32h68v576z")),t.SoundFill=o("sound",c,r(a,"M892.1 737.8l-110.3-63.7a15.9 15.9 0 0 0-21.7 5.9l-19.9 34.5c-4.4 7.6-1.8 17.4 5.8 21.8L856.3 800a15.9 15.9 0 0 0 21.7-5.9l19.9-34.5c4.4-7.6 1.7-17.4-5.8-21.8zM760 344a15.9 15.9 0 0 0 21.7 5.9L892 286.2c7.6-4.4 10.2-14.2 5.8-21.8L878 230a15.9 15.9 0 0 0-21.7-5.9L746 287.8a15.99 15.99 0 0 0-5.8 21.8L760 344zm174 132H806c-8.8 0-16 7.2-16 16v40c0 8.8 7.2 16 16 16h128c8.8 0 16-7.2 16-16v-40c0-8.8-7.2-16-16-16zM625.9 115c-5.9 0-11.9 1.6-17.4 5.3L254 352H90c-8.8 0-16 7.2-16 16v288c0 8.8 7.2 16 16 16h164l354.5 231.7c5.5 3.6 11.6 5.3 17.4 5.3 16.7 0 32.1-13.3 32.1-32.1V147.1c0-18.8-15.4-32.1-32.1-32.1z")),t.StarFill=o("star",c,r(a,"M908.1 353.1l-253.9-36.9L540.7 86.1c-3.1-6.3-8.2-11.4-14.5-14.5-15.8-7.8-35-1.3-42.9 14.5L369.8 316.2l-253.9 36.9c-7 1-13.4 4.3-18.3 9.3a32.05 32.05 0 0 0 .6 45.3l183.7 179.1-43.4 252.9a31.95 31.95 0 0 0 46.4 33.7L512 754l227.1 119.4c6.2 3.3 13.4 4.4 20.3 3.2 17.4-3 29.1-19.5 26.1-36.9l-43.4-252.9 183.7-179.1c5-4.9 8.3-11.3 9.3-18.3 2.7-17.5-9.5-33.7-27-36.3z")),t.StepBackwardFill=o("step-backward",c,r(i,"M759.3 76.3L327.9 431.6V132c0-19.9-16.1-36-36-36s-36 16.1-36 36v760c0 19.9 16.1 36 36 36s36-16.1 36-36V590.6l431.3 357.2c27.4 24.4 70.8 5 70.8-31.7V107.9c0-36.6-43.4-56.1-70.7-31.6z")),t.StepForwardFill=o("step-forward",c,r(i,"M326.6 76.3L758 431.6V132c0-19.9 16.1-36 36-36s36 16.1 36 36v760c0 19.9-16.1 36-36 36s-36-16.1-36-36V590.6L326.7 947.8c-27.4 24.4-70.8 5-70.8-31.7V107.9c0-36.6 43.4-56.1 70.7-31.6z")),t.StopFill=o("stop",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm234.8 736.5L223.5 277.2c16-19.7 34-37.7 53.7-53.7l523.3 523.3c-16 19.6-34 37.7-53.7 53.7z")),t.SwitcherFill=o("switcher",c,r(a,"M752 240H144c-17.7 0-32 14.3-32 32v608c0 17.7 14.3 32 32 32h608c17.7 0 32-14.3 32-32V272c0-17.7-14.3-32-32-32zM596 606c0 4.4-3.6 8-8 8H308c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h280c4.4 0 8 3.6 8 8v48zm284-494H264c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h576v576c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V144c0-17.7-14.3-32-32-32z")),t.SettingFill=o("setting",c,r(a,"M512.5 390.6c-29.9 0-57.9 11.6-79.1 32.8-21.1 21.2-32.8 49.2-32.8 79.1 0 29.9 11.7 57.9 32.8 79.1 21.2 21.1 49.2 32.8 79.1 32.8 29.9 0 57.9-11.7 79.1-32.8 21.1-21.2 32.8-49.2 32.8-79.1 0-29.9-11.7-57.9-32.8-79.1a110.96 110.96 0 0 0-79.1-32.8zm412.3 235.5l-65.4-55.9c3.1-19 4.7-38.4 4.7-57.7s-1.6-38.8-4.7-57.7l65.4-55.9a32.03 32.03 0 0 0 9.3-35.2l-.9-2.6a442.5 442.5 0 0 0-79.6-137.7l-1.8-2.1a32.12 32.12 0 0 0-35.1-9.5l-81.2 28.9c-30-24.6-63.4-44-99.6-57.5l-15.7-84.9a32.05 32.05 0 0 0-25.8-25.7l-2.7-.5c-52-9.4-106.8-9.4-158.8 0l-2.7.5a32.05 32.05 0 0 0-25.8 25.7l-15.8 85.3a353.44 353.44 0 0 0-98.9 57.3l-81.8-29.1a32 32 0 0 0-35.1 9.5l-1.8 2.1a445.93 445.93 0 0 0-79.6 137.7l-.9 2.6c-4.5 12.5-.8 26.5 9.3 35.2l66.2 56.5c-3.1 18.8-4.6 38-4.6 57 0 19.2 1.5 38.4 4.6 57l-66 56.5a32.03 32.03 0 0 0-9.3 35.2l.9 2.6c18.1 50.3 44.8 96.8 79.6 137.7l1.8 2.1a32.12 32.12 0 0 0 35.1 9.5l81.8-29.1c29.8 24.5 63 43.9 98.9 57.3l15.8 85.3a32.05 32.05 0 0 0 25.8 25.7l2.7.5a448.27 448.27 0 0 0 158.8 0l2.7-.5a32.05 32.05 0 0 0 25.8-25.7l15.7-84.9c36.2-13.6 69.6-32.9 99.6-57.5l81.2 28.9a32 32 0 0 0 35.1-9.5l1.8-2.1c34.8-41.1 61.5-87.4 79.6-137.7l.9-2.6c4.3-12.4.6-26.3-9.5-35zm-412.3 52.2c-97.1 0-175.8-78.7-175.8-175.8s78.7-175.8 175.8-175.8 175.8 78.7 175.8 175.8-78.7 175.8-175.8 175.8z")),t.TabletFill=o("tablet",c,r(a,"M800 64H224c-35.3 0-64 28.7-64 64v768c0 35.3 28.7 64 64 64h576c35.3 0 64-28.7 64-64V128c0-35.3-28.7-64-64-64zM512 824c-22.1 0-40-17.9-40-40s17.9-40 40-40 40 17.9 40 40-17.9 40-40 40z")),t.TagFill=o("tag",c,r(a,"M938 458.8l-29.6-312.6c-1.5-16.2-14.4-29-30.6-30.6L565.2 86h-.4c-3.2 0-5.7 1-7.6 2.9L88.9 557.2a9.96 9.96 0 0 0 0 14.1l363.8 363.8c1.9 1.9 4.4 2.9 7.1 2.9s5.2-1 7.1-2.9l468.3-468.3c2-2.1 3-5 2.8-8zM699 387c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.7 64-64 64z")),t.TaobaoCircleFill=o("taobao-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zM315.7 291.5c27.3 0 49.5 22.1 49.5 49.4s-22.1 49.4-49.5 49.4a49.4 49.4 0 1 1 0-98.8zM366.9 578c-13.6 42.3-10.2 26.7-64.4 144.5l-78.5-49s87.7-79.8 105.6-116.2c19.2-38.4-21.1-58.9-21.1-58.9l-60.2-37.5 32.7-50.2c45.4 33.7 48.7 36.6 79.2 67.2 23.8 23.9 20.7 56.8 6.7 100.1zm427.2 55c-15.3 143.8-202.4 90.3-202.4 90.3l10.2-41.1 43.3 9.3c80 5 72.3-64.9 72.3-64.9V423c.6-77.3-72.6-85.4-204.2-38.3l30.6 8.3c-2.5 9-12.5 23.2-25.2 38.6h176v35.6h-99.1v44.5h98.7v35.7h-98.7V622c14.9-4.8 28.6-11.5 40.5-20.5l-8.7-32.5 46.5-14.4 38.8 94.9-57.3 23.9-10.2-37.8c-25.6 19.5-78.8 48-171.8 45.4-99.2 2.6-73.7-112-73.7-112l2.5-1.3H472c-.5 14.7-6.6 38.7 1.7 51.8 6.8 10.8 24.2 12.6 35.3 13.1 1.3.1 2.6.1 3.9.1v-85.3h-101v-35.7h101v-44.5H487c-22.7 24.1-43.5 44.1-43.5 44.1l-30.6-26.7c21.7-22.9 43.3-59.1 56.8-83.2-10.9 4.4-22 9.2-33.6 14.2-11.2 14.3-24.2 29-38.7 43.5.5.8-50-28.4-50-28.4 52.2-44.4 81.4-139.9 81.4-139.9l72.5 20.4s-5.9 14-18.4 35.6c290.3-82.3 307.4 50.5 307.4 50.5s19.1 91.8 3.8 235.7z")),t.TagsFill=o("tags",c,r(a,"M483.2 790.3L861.4 412c1.7-1.7 2.5-4 2.3-6.3l-25.5-301.4c-.7-7.8-6.8-13.9-14.6-14.6L522.2 64.3c-2.3-.2-4.7.6-6.3 2.3L137.7 444.8a8.03 8.03 0 0 0 0 11.3l334.2 334.2c3.1 3.2 8.2 3.2 11.3 0zm122.7-533.4c18.7-18.7 49.1-18.7 67.9 0 18.7 18.7 18.7 49.1 0 67.9-18.7 18.7-49.1 18.7-67.9 0-18.7-18.7-18.7-49.1 0-67.9zm283.8 282.9l-39.6-39.5a8.03 8.03 0 0 0-11.3 0l-362 361.3-237.6-237a8.03 8.03 0 0 0-11.3 0l-39.6 39.5a8.03 8.03 0 0 0 0 11.3l243.2 242.8 39.6 39.5c3.1 3.1 8.2 3.1 11.3 0l407.3-406.6c3.1-3.1 3.1-8.2 0-11.3z")),t.TaobaoSquareFill=o("taobao-square",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM315.7 291.5c27.3 0 49.5 22.1 49.5 49.4s-22.1 49.4-49.5 49.4a49.4 49.4 0 1 1 0-98.8zM366.9 578c-13.6 42.3-10.2 26.7-64.4 144.5l-78.5-49s87.7-79.8 105.6-116.2c19.2-38.4-21.1-58.9-21.1-58.9l-60.2-37.5 32.7-50.2c45.4 33.7 48.7 36.6 79.2 67.2 23.8 23.9 20.7 56.8 6.7 100.1zm427.2 55c-15.3 143.8-202.4 90.3-202.4 90.3l10.2-41.1 43.3 9.3c80 5 72.3-64.9 72.3-64.9V423c.6-77.3-72.6-85.4-204.2-38.3l30.6 8.3c-2.5 9-12.5 23.2-25.2 38.6h176v35.6h-99.1v44.5h98.7v35.7h-98.7V622c14.9-4.8 28.6-11.5 40.5-20.5l-8.7-32.5 46.5-14.4 38.8 94.9-57.3 23.9-10.2-37.8c-25.6 19.5-78.8 48-171.8 45.4-99.2 2.6-73.7-112-73.7-112l2.5-1.3H472c-.5 14.7-6.6 38.7 1.7 51.8 6.8 10.8 24.2 12.6 35.3 13.1 1.3.1 2.6.1 3.9.1v-85.3h-101v-35.7h101v-44.5H487c-22.7 24.1-43.5 44.1-43.5 44.1l-30.6-26.7c21.7-22.9 43.3-59.1 56.8-83.2-10.9 4.4-22 9.2-33.6 14.2-11.2 14.3-24.2 29-38.7 43.5.5.8-50-28.4-50-28.4 52.2-44.4 81.4-139.9 81.4-139.9l72.5 20.4s-5.9 14-18.4 35.6c290.3-82.3 307.4 50.5 307.4 50.5s19.1 91.8 3.8 235.7z")),t.ToolFill=o("tool",c,r(a,"M865.3 244.7c-.3-.3-61.1 59.8-182.1 180.6l-84.9-84.9 180.9-180.9c-95.2-57.3-217.5-42.6-296.8 36.7A244.42 244.42 0 0 0 419 432l1.8 6.7-283.5 283.4c-6.2 6.2-6.2 16.4 0 22.6l141.4 141.4c6.2 6.2 16.4 6.2 22.6 0l283.3-283.3 6.7 1.8c83.7 22.3 173.6-.9 236-63.3 79.4-79.3 94.1-201.6 38-296.6z")),t.ThunderboltFill=o("thunderbolt",c,r(a,"M848 359.3H627.7L825.8 109c4.1-5.3.4-13-6.3-13H436c-2.8 0-5.5 1.5-6.9 4L170 547.5c-3.1 5.3.7 12 6.9 12h174.4l-89.4 357.6c-1.9 7.8 7.5 13.3 13.3 7.7L853.5 373c5.2-4.9 1.7-13.7-5.5-13.7z")),t.TrademarkCircleFill=o("trademark-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm164.7 660.2c-1.1.5-2.3.8-3.5.8h-62c-3.1 0-5.9-1.8-7.2-4.6l-74.6-159.2h-88.7V717c0 4.4-3.6 8-8 8H378c-4.4 0-8-3.6-8-8V307c0-4.4 3.6-8 8-8h155.6c98.8 0 144.2 59.9 144.2 131.1 0 70.2-43.6 106.4-78.4 119.2l80.8 164.2c2.1 3.9.4 8.7-3.5 10.7zM523.9 357h-83.4v148H522c53 0 82.8-25.6 82.8-72.4 0-50.3-32.9-75.6-80.9-75.6z")),t.TrophyFill=o("trophy",c,r(a,"M868 160h-92v-40c0-4.4-3.6-8-8-8H256c-4.4 0-8 3.6-8 8v40h-92a44 44 0 0 0-44 44v148c0 81.7 60 149.6 138.2 162C265.6 630.2 359 721.8 476 734.5v105.2H280c-17.7 0-32 14.3-32 32V904c0 4.4 3.6 8 8 8h512c4.4 0 8-3.6 8-8v-32.3c0-17.7-14.3-32-32-32H548V734.5C665 721.8 758.4 630.2 773.8 514 852 501.6 912 433.7 912 352V204a44 44 0 0 0-44-44zM248 439.6c-37.1-11.9-64-46.7-64-87.6V232h64v207.6zM840 352c0 41-26.9 75.8-64 87.6V232h64v120z")),t.TwitterCircleFill=o("twitter-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm215.3 337.7c.3 4.7.3 9.6.3 14.4 0 146.8-111.8 315.9-316.1 315.9-63 0-121.4-18.3-170.6-49.8 9 1 17.6 1.4 26.8 1.4 52 0 99.8-17.6 137.9-47.4-48.8-1-89.8-33-103.8-77 17.1 2.5 32.5 2.5 50.1-2a111 111 0 0 1-88.9-109v-1.4c14.7 8.3 32 13.4 50.1 14.1a111.13 111.13 0 0 1-49.5-92.4c0-20.7 5.4-39.6 15.1-56a315.28 315.28 0 0 0 229 116.1C492 353.1 548.4 292 616.2 292c32 0 60.8 13.4 81.1 35 25.1-4.7 49.1-14.1 70.5-26.7-8.3 25.7-25.7 47.4-48.8 61.1 22.4-2.4 44-8.6 64-17.3-15.1 22.2-34 41.9-55.7 57.6z")),t.TwitterSquareFill=o("twitter-square",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM727.3 401.7c.3 4.7.3 9.6.3 14.4 0 146.8-111.8 315.9-316.1 315.9-63 0-121.4-18.3-170.6-49.8 9 1 17.6 1.4 26.8 1.4 52 0 99.8-17.6 137.9-47.4-48.8-1-89.8-33-103.8-77 17.1 2.5 32.5 2.5 50.1-2a111 111 0 0 1-88.9-109v-1.4c14.7 8.3 32 13.4 50.1 14.1a111.13 111.13 0 0 1-49.5-92.4c0-20.7 5.4-39.6 15.1-56a315.28 315.28 0 0 0 229 116.1C492 353.1 548.4 292 616.2 292c32 0 60.8 13.4 81.1 35 25.1-4.7 49.1-14.1 70.5-26.7-8.3 25.7-25.7 47.4-48.8 61.1 22.4-2.4 44-8.6 64-17.3-15.1 22.2-34 41.9-55.7 57.6z")),t.UnlockFill=o("unlock",c,r(a,"M832 464H332V240c0-30.9 25.1-56 56-56h248c30.9 0 56 25.1 56 56v68c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-68c0-70.7-57.3-128-128-128H388c-70.7 0-128 57.3-128 128v224h-68c-17.7 0-32 14.3-32 32v384c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V496c0-17.7-14.3-32-32-32zM540 701v53c0 4.4-3.6 8-8 8h-40c-4.4 0-8-3.6-8-8v-53a48.01 48.01 0 1 1 56 0z")),t.UpSquareFill=o("up-square",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM690 624h-46.9c-10.2 0-19.9-4.9-25.9-13.2L512 465.4 406.8 610.8c-6 8.3-15.6 13.2-25.9 13.2H334c-6.5 0-10.3-7.4-6.5-12.7l178-246c3.2-4.4 9.7-4.4 12.9 0l178 246c3.9 5.3.1 12.7-6.4 12.7z")),t.UpCircleFill=o("up-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm178 555h-46.9c-10.2 0-19.9-4.9-25.9-13.2L512 460.4 406.8 605.8c-6 8.3-15.6 13.2-25.9 13.2H334c-6.5 0-10.3-7.4-6.5-12.7l178-246c3.2-4.4 9.7-4.4 12.9 0l178 246c3.9 5.3.1 12.7-6.4 12.7z")),t.UsbFill=o("usb",c,r(a,"M408 312h48c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8zm352 120V144c0-17.7-14.3-32-32-32H296c-17.7 0-32 14.3-32 32v288c-66.2 0-120 52.1-120 116v356c0 4.4 3.6 8 8 8h720c4.4 0 8-3.6 8-8V548c0-63.9-53.8-116-120-116zm-72 0H336V184h352v248zM568 312h48c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8z")),t.VideoCameraFill=o("video-camera",c,r(a,"M912 302.3L784 376V224c0-35.3-28.7-64-64-64H128c-35.3 0-64 28.7-64 64v576c0 35.3 28.7 64 64 64h592c35.3 0 64-28.7 64-64V648l128 73.7c21.3 12.3 48-3.1 48-27.6V330c0-24.6-26.7-40-48-27.7zM328 352c0 4.4-3.6 8-8 8H208c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h112c4.4 0 8 3.6 8 8v48zm560 273l-104-59.8V458.9L888 399v226z")),t.WarningFill=o("warning",c,r(a,"M955.7 856l-416-720c-6.2-10.7-16.9-16-27.7-16s-21.6 5.3-27.7 16l-416 720C56 877.4 71.4 904 96 904h832c24.6 0 40-26.6 27.7-48zM480 416c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v184c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V416zm32 352a48.01 48.01 0 0 1 0-96 48.01 48.01 0 0 1 0 96z")),t.WechatFill=o("wechat",c,r(a,"M690.1 377.4c5.9 0 11.8.2 17.6.5-24.4-128.7-158.3-227.1-319.9-227.1C209 150.8 64 271.4 64 420.2c0 81.1 43.6 154.2 111.9 203.6a21.5 21.5 0 0 1 9.1 17.6c0 2.4-.5 4.6-1.1 6.9-5.5 20.3-14.2 52.8-14.6 54.3-.7 2.6-1.7 5.2-1.7 7.9 0 5.9 4.8 10.8 10.8 10.8 2.3 0 4.2-.9 6.2-2l70.9-40.9c5.3-3.1 11-5 17.2-5 3.2 0 6.4.5 9.5 1.4 33.1 9.5 68.8 14.8 105.7 14.8 6 0 11.9-.1 17.8-.4-7.1-21-10.9-43.1-10.9-66 0-135.8 132.2-245.8 295.3-245.8zm-194.3-86.5c23.8 0 43.2 19.3 43.2 43.1s-19.3 43.1-43.2 43.1c-23.8 0-43.2-19.3-43.2-43.1s19.4-43.1 43.2-43.1zm-215.9 86.2c-23.8 0-43.2-19.3-43.2-43.1s19.3-43.1 43.2-43.1 43.2 19.3 43.2 43.1-19.4 43.1-43.2 43.1zm586.8 415.6c56.9-41.2 93.2-102 93.2-169.7 0-124-120.8-224.5-269.9-224.5-149 0-269.9 100.5-269.9 224.5S540.9 847.5 690 847.5c30.8 0 60.6-4.4 88.1-12.3 2.6-.8 5.2-1.2 7.9-1.2 5.2 0 9.9 1.6 14.3 4.1l59.1 34c1.7 1 3.3 1.7 5.2 1.7a9 9 0 0 0 6.4-2.6 9 9 0 0 0 2.6-6.4c0-2.2-.9-4.4-1.4-6.6-.3-1.2-7.6-28.3-12.2-45.3-.5-1.9-.9-3.8-.9-5.7.1-5.9 3.1-11.2 7.6-14.5zM600.2 587.2c-19.9 0-36-16.1-36-35.9 0-19.8 16.1-35.9 36-35.9s36 16.1 36 35.9c0 19.8-16.2 35.9-36 35.9zm179.9 0c-19.9 0-36-16.1-36-35.9 0-19.8 16.1-35.9 36-35.9s36 16.1 36 35.9a36.08 36.08 0 0 1-36 35.9z"));t.WalletFill=o("wallet",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-32 464H528V448h320v128zm-268-64a40 40 0 1 0 80 0 40 40 0 1 0-80 0z")),t.WeiboCircleFill=o("weibo-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm-44.4 672C353.1 736 236 680.4 236 588.9c0-47.8 30.2-103.1 82.3-155.3 69.5-69.6 150.6-101.4 181.1-70.8 13.5 13.5 14.8 36.8 6.1 64.6-4.5 14 13.1 6.3 13.1 6.3 56.2-23.6 105.2-25 123.1.7 9.6 13.7 8.6 32.8-.2 55.1-4.1 10.2 1.3 11.8 9 14.1 31.7 9.8 66.9 33.6 66.9 75.5.2 69.5-99.7 156.9-249.8 156.9zm207.3-290.8a34.9 34.9 0 0 0-7.2-34.1 34.68 34.68 0 0 0-33.1-10.7 18.24 18.24 0 0 1-7.6-35.7c24.1-5.1 50.1 2.3 67.7 21.9 17.7 19.6 22.4 46.3 14.9 69.8a18.13 18.13 0 0 1-22.9 11.7 18.18 18.18 0 0 1-11.8-22.9zm106 34.3s0 .1 0 0a21.1 21.1 0 0 1-26.6 13.7 21.19 21.19 0 0 1-13.6-26.7c11-34.2 4-73.2-21.7-101.8a104.04 104.04 0 0 0-98.9-32.1 21.14 21.14 0 0 1-25.1-16.3 21.07 21.07 0 0 1 16.2-25.1c49.4-10.5 102.8 4.8 139.1 45.1 36.3 40.2 46.1 95.1 30.6 143.2zm-334.5 6.1c-91.4 9-160.7 65.1-154.7 125.2 5.9 60.1 84.8 101.5 176.2 92.5 91.4-9.1 160.7-65.1 154.7-125.3-5.9-60.1-84.8-101.5-176.2-92.4zm80.2 141.7c-18.7 42.3-72.3 64.8-117.8 50.1-43.9-14.2-62.5-57.7-43.3-96.8 18.9-38.4 68-60.1 111.5-48.8 45 11.7 68 54.2 49.6 95.5zm-93-32.2c-14.2-5.9-32.4.2-41.2 13.9-8.8 13.8-4.7 30.2 9.3 36.6 14.3 6.5 33.2.3 42-13.8 8.8-14.3 4.2-30.6-10.1-36.7zm34.9-14.5c-5.4-2.2-12.2.5-15.4 5.8-3.1 5.4-1.4 11.5 4.1 13.8 5.5 2.3 12.6-.3 15.8-5.8 3-5.6 1-11.8-4.5-13.8z")),t.WeiboSquareFill=o("weibo-square",c,r(a,"M433.6 595.1c-14.2-5.9-32.4.2-41.2 13.9-8.8 13.8-4.7 30.2 9.3 36.6 14.3 6.5 33.2.3 42-13.8 8.8-14.3 4.2-30.6-10.1-36.7zM880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM467.6 736C353.1 736 236 680.4 236 588.9c0-47.8 30.2-103.1 82.3-155.3 69.5-69.6 150.6-101.4 181.1-70.8 13.5 13.5 14.8 36.8 6.1 64.6-4.5 14 13.1 6.3 13.1 6.3 56.2-23.6 105.2-25 123.1.7 9.6 13.7 8.6 32.8-.2 55.1-4.1 10.2 1.3 11.8 9 14.1 31.7 9.8 66.9 33.6 66.9 75.5.2 69.5-99.7 156.9-249.8 156.9zm207.3-290.8a34.9 34.9 0 0 0-7.2-34.1 34.68 34.68 0 0 0-33.1-10.7 18.24 18.24 0 0 1-7.6-35.7c24.1-5.1 50.1 2.3 67.7 21.9 17.7 19.6 22.4 46.3 14.9 69.8a18.13 18.13 0 0 1-22.9 11.7 18.18 18.18 0 0 1-11.8-22.9zm106 34.3s0 .1 0 0a21.1 21.1 0 0 1-26.6 13.7 21.19 21.19 0 0 1-13.6-26.7c11-34.2 4-73.2-21.7-101.8a104.04 104.04 0 0 0-98.9-32.1 21.14 21.14 0 0 1-25.1-16.3 21.07 21.07 0 0 1 16.2-25.1c49.4-10.5 102.8 4.8 139.1 45.1 36.3 40.2 46.1 95.1 30.6 143.2zm-334.5 6.1c-91.4 9-160.7 65.1-154.7 125.2 5.9 60.1 84.8 101.5 176.2 92.5 91.4-9.1 160.7-65.1 154.7-125.3-5.9-60.1-84.8-101.5-176.2-92.4zm80.2 141.7c-18.7 42.3-72.3 64.8-117.8 50.1-43.9-14.2-62.5-57.7-43.3-96.8 18.9-38.4 68-60.1 111.5-48.8 45 11.7 68 54.2 49.6 95.5zm-58.1-46.7c-5.4-2.2-12.2.5-15.4 5.8-3.1 5.4-1.4 11.5 4.1 13.8 5.5 2.3 12.6-.3 15.8-5.8 3-5.6 1-11.8-4.5-13.8z")),t.YahooFill=o("yahoo",c,r(a,"M937.3 231H824.7c-15.5 0-27.7 12.6-27.1 28.1l13.1 366h84.4l65.4-366.4c2.7-15.2-7.8-27.7-23.2-27.7zm-77.4 450.4h-14.1c-27.1 0-49.2 22.2-49.2 49.3v14.1c0 27.1 22.2 49.3 49.2 49.3h14.1c27.1 0 49.2-22.2 49.2-49.3v-14.1c0-27.1-22.2-49.3-49.2-49.3zM402.6 231C216.2 231 65 357 65 512.5S216.2 794 402.6 794s337.6-126 337.6-281.5S589.1 231 402.6 231zm225.2 225.2h-65.3L458.9 559.8v65.3h84.4v56.3H318.2v-56.3h84.4v-65.3L242.9 399.9h-37v-56.3h168.5v56.3h-37l93.4 93.5 28.1-28.1V400h168.8v56.2z")),t.YoutubeFill=o("youtube",c,r(a,"M941.3 296.1a112.3 112.3 0 0 0-79.2-79.3C792.2 198 512 198 512 198s-280.2 0-350.1 18.7A112.12 112.12 0 0 0 82.7 296C64 366 64 512 64 512s0 146 18.7 215.9c10.3 38.6 40.7 69 79.2 79.3C231.8 826 512 826 512 826s280.2 0 350.1-18.8c38.6-10.3 68.9-40.7 79.2-79.3C960 658 960 512 960 512s0-146-18.7-215.9zM423 646V378l232 133-232 135z")),t.YuqueFill=o("yuque",c,r(a,"M854.6 370.6c-9.9-39.4 9.9-102.2 73.4-124.4l-67.9-3.6s-25.7-90-143.6-98c-117.9-8.1-195-3-195-3s87.4 55.6 52.4 154.7c-25.6 52.5-65.8 95.6-108.8 144.7-1.3 1.3-2.5 2.6-3.5 3.7C319.4 605 96 860 96 860c245.9 64.4 410.7-6.3 508.2-91.1 20.5-.2 35.9-.3 46.3-.3 135.8 0 250.6-117.6 245.9-248.4-3.2-89.9-31.9-110.2-41.8-149.6z")),t.ZhihuCircleFill=o("zhihu-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm-90.7 477.8l-.1 1.5c-1.5 20.4-6.3 43.9-12.9 67.6l24-18.1 71 80.7c9.2 33-3.3 63.1-3.3 63.1l-95.7-111.9v-.1c-8.9 29-20.1 57.3-33.3 84.7-22.6 45.7-55.2 54.7-89.5 57.7-34.4 3-23.3-5.3-23.3-5.3 68-55.5 78-87.8 96.8-123.1 11.9-22.3 20.4-64.3 25.3-96.8H264.1s4.8-31.2 19.2-41.7h101.6c.6-15.3-1.3-102.8-2-131.4h-49.4c-9.2 45-41 56.7-48.1 60.1-7 3.4-23.6 7.1-21.1 0 2.6-7.1 27-46.2 43.2-110.7 16.3-64.6 63.9-62 63.9-62-12.8 22.5-22.4 73.6-22.4 73.6h159.7c10.1 0 10.6 39 10.6 39h-90.8c-.7 22.7-2.8 83.8-5 131.4H519s12.2 15.4 12.2 41.7H421.3zm346.5 167h-87.6l-69.5 46.6-16.4-46.6h-40.1V321.5h213.6v387.3zM408.2 611s0-.1 0 0zm216 94.3l56.8-38.1h45.6-.1V364.7H596.7v302.5h14.1z")),t.ZhihuSquareFill=o("zhihu-square",c,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM432.3 592.8l71 80.7c9.2 33-3.3 63.1-3.3 63.1l-95.7-111.9v-.1c-8.9 29-20.1 57.3-33.3 84.7-22.6 45.7-55.2 54.7-89.5 57.7-34.4 3-23.3-5.3-23.3-5.3 68-55.5 78-87.8 96.8-123.1 11.9-22.3 20.4-64.3 25.3-96.8H264.1s4.8-31.2 19.2-41.7h101.6c.6-15.3-1.3-102.8-2-131.4h-49.4c-9.2 45-41 56.7-48.1 60.1-7 3.4-23.6 7.1-21.1 0 2.6-7.1 27-46.2 43.2-110.7 16.3-64.6 63.9-62 63.9-62-12.8 22.5-22.4 73.6-22.4 73.6h159.7c10.1 0 10.6 39 10.6 39h-90.8c-.7 22.7-2.8 83.8-5 131.4H519s12.2 15.4 12.2 41.7h-110l-.1 1.5c-1.5 20.4-6.3 43.9-12.9 67.6l24.1-18.1zm335.5 116h-87.6l-69.5 46.6-16.4-46.6h-40.1V321.5h213.6v387.3zM408.2 611s0-.1 0 0zm216 94.3l56.8-38.1h45.6-.1V364.7H596.7v302.5h14.1z")),t.AccountBookOutline=o("account-book",s,r(a,"M880 184H712v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H384v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H144c-17.7 0-32 14.3-32 32v664c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V216c0-17.7-14.3-32-32-32zm-40 656H184V256h128v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h256v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h128v584zM639.5 414h-45c-3 0-5.8 1.7-7.1 4.4L514 563.8h-2.8l-73.4-145.4a8 8 0 0 0-7.1-4.4h-46c-1.3 0-2.7.3-3.8 1-3.9 2.1-5.3 7-3.2 10.9l89.3 164h-48.6c-4.4 0-8 3.6-8 8v21.3c0 4.4 3.6 8 8 8h65.1v33.7h-65.1c-4.4 0-8 3.6-8 8v21.3c0 4.4 3.6 8 8 8h65.1V752c0 4.4 3.6 8 8 8h41.3c4.4 0 8-3.6 8-8v-53.8h65.4c4.4 0 8-3.6 8-8v-21.3c0-4.4-3.6-8-8-8h-65.4v-33.7h65.4c4.4 0 8-3.6 8-8v-21.3c0-4.4-3.6-8-8-8h-49.1l89.3-164.1c.6-1.2 1-2.5 1-3.8.1-4.4-3.4-8-7.9-8z")),t.AlertOutline=o("alert",s,r(a,"M193 796c0 17.7 14.3 32 32 32h574c17.7 0 32-14.3 32-32V563c0-176.2-142.8-319-319-319S193 386.8 193 563v233zm72-233c0-136.4 110.6-247 247-247s247 110.6 247 247v193H404V585c0-5.5-4.5-10-10-10h-44c-5.5 0-10 4.5-10 10v171h-75V563zm-48.1-252.5l39.6-39.6c3.1-3.1 3.1-8.2 0-11.3l-67.9-67.9a8.03 8.03 0 0 0-11.3 0l-39.6 39.6a8.03 8.03 0 0 0 0 11.3l67.9 67.9c3.1 3.1 8.1 3.1 11.3 0zm669.6-79.2l-39.6-39.6a8.03 8.03 0 0 0-11.3 0l-67.9 67.9a8.03 8.03 0 0 0 0 11.3l39.6 39.6c3.1 3.1 8.2 3.1 11.3 0l67.9-67.9c3.1-3.2 3.1-8.2 0-11.3zM832 892H192c-17.7 0-32 14.3-32 32v24c0 4.4 3.6 8 8 8h688c4.4 0 8-3.6 8-8v-24c0-17.7-14.3-32-32-32zM484 180h56c4.4 0 8-3.6 8-8V76c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v96c0 4.4 3.6 8 8 8z")),t.AlipayCircleOutline=o("alipay-circle",s,r(a,"M308.6 545.7c-19.8 2-57.1 10.7-77.4 28.6-61 53-24.5 150 99 150 71.8 0 143.5-45.7 199.8-119-80.2-38.9-148.1-66.8-221.4-59.6zm460.5 67c100.1 33.4 154.7 43 166.7 44.8A445.9 445.9 0 0 0 960 512c0-247.4-200.6-448-448-448S64 264.6 64 512s200.6 448 448 448c155.9 0 293.2-79.7 373.5-200.5-75.6-29.8-213.6-85-286.8-120.1-69.9 85.7-160.1 137.8-253.7 137.8-158.4 0-212.1-138.1-137.2-229 16.3-19.8 44.2-38.7 87.3-49.4 67.5-16.5 175 10.3 275.7 43.4 18.1-33.3 33.4-69.9 44.7-108.9H305.1V402h160v-56.2H271.3v-31.3h193.8v-80.1s0-13.5 13.7-13.5H557v93.6h191.7v31.3H557.1V402h156.4c-15 61.1-37.7 117.4-66.2 166.8 47.5 17.1 90.1 33.3 121.8 43.9z")),t.AliwangwangOutline=o("aliwangwang",s,r(a,"M868.2 377.4c-18.9-45.1-46.3-85.6-81.2-120.6a377.26 377.26 0 0 0-120.5-81.2A375.65 375.65 0 0 0 519 145.8c-41.9 0-82.9 6.7-121.9 20C306 123.3 200.8 120 170.6 120c-2.2 0-7.4 0-9.4.2-11.9.4-22.8 6.5-29.2 16.4-6.5 9.9-7.7 22.4-3.4 33.5l64.3 161.6a378.59 378.59 0 0 0-52.8 193.2c0 51.4 10 101 29.8 147.6 18.9 45 46.2 85.6 81.2 120.5 34.7 34.8 75.4 62.1 120.5 81.2C418.3 894 467.9 904 519 904c51.3 0 100.9-10.1 147.7-29.8 44.9-18.9 85.5-46.3 120.4-81.2 34.7-34.8 62.1-75.4 81.2-120.6a376.5 376.5 0 0 0 29.8-147.6c-.2-51.2-10.1-100.8-29.9-147.4zm-66.4 266.5a307.08 307.08 0 0 1-65.9 98c-28.4 28.5-61.3 50.7-97.7 65.9h-.1c-38 16-78.3 24.2-119.9 24.2a306.51 306.51 0 0 1-217.5-90.2c-28.4-28.5-50.6-61.4-65.8-97.8v-.1c-16-37.8-24.1-78.2-24.1-119.9 0-55.4 14.8-109.7 42.8-157l13.2-22.1-9.5-23.9L206 192c14.9.6 35.9 2.1 59.7 5.6 43.8 6.5 82.5 17.5 114.9 32.6l19 8.9 19.9-6.8c31.5-10.8 64.8-16.2 98.9-16.2a306.51 306.51 0 0 1 217.5 90.2c28.4 28.5 50.6 61.4 65.8 97.8l.1.1.1.1c16 37.6 24.1 78 24.2 119.8-.1 41.7-8.3 82-24.3 119.8zM681.1 364.2c-20.4 0-37.1 16.7-37.1 37.1v55.1c0 20.4 16.6 37.1 37.1 37.1s37.1-16.7 37.1-37.1v-55.1c0-20.5-16.7-37.1-37.1-37.1zm-175.2 0c-20.5 0-37.1 16.7-37.1 37.1v55.1c0 20.4 16.7 37.1 37.1 37.1 20.5 0 37.1-16.7 37.1-37.1v-55.1c0-20.5-16.7-37.1-37.1-37.1z")),t.AndroidOutline=o("android",s,r(a,"M448.3 225.2c-18.6 0-32 13.4-32 31.9s13.5 31.9 32 31.9c18.6 0 32-13.4 32-31.9.1-18.4-13.4-31.9-32-31.9zm393.9 96.4c-13.8-13.8-32.7-21.5-53.2-21.5-3.9 0-7.4.4-10.7 1v-1h-3.6c-5.5-30.6-18.6-60.5-38.1-87.4-18.7-25.7-43-47.9-70.8-64.9l25.1-35.8v-3.3c0-.8.4-2.3.7-3.8.6-2.4 1.4-5.5 1.4-8.9 0-18.5-13.5-31.9-32-31.9-9.8 0-19.5 5.7-25.9 15.4l-29.3 42.1c-30-9.8-62.4-15-93.8-15-31.3 0-63.7 5.2-93.8 15L389 79.4c-6.6-9.6-16.1-15.4-26-15.4-18.6 0-32 13.4-32 31.9 0 6.2 2.5 12.8 6.7 17.4l22.6 32.3c-28.7 17-53.5 39.4-72.2 65.1-19.4 26.9-32 56.8-36.7 87.4h-5.5v1c-3.2-.6-6.7-1-10.7-1-20.3 0-39.2 7.5-53.1 21.3-13.8 13.8-21.5 32.6-21.5 53v235c0 20.3 7.5 39.1 21.4 52.9 13.8 13.8 32.8 21.5 53.2 21.5 3.9 0 7.4-.4 10.7-1v93.5c0 29.2 23.9 53.1 53.2 53.1H331v58.3c0 20.3 7.5 39.1 21.4 52.9 13.8 13.8 32.8 21.5 53.2 21.5 20.3 0 39.2-7.5 53.1-21.3 13.8-13.8 21.5-32.6 21.5-53v-58.2H544v58.1c0 20.3 7.5 39.1 21.4 52.9 13.8 13.8 32.8 21.5 53.2 21.5 20.4 0 39.2-7.5 53.1-21.6 13.8-13.8 21.5-32.6 21.5-53v-58.2h31.9c29.3 0 53.2-23.8 53.2-53.1v-91.4c3.2.6 6.7 1 10.7 1 20.3 0 39.2-7.5 53.1-21.3 13.8-13.8 21.5-32.6 21.5-53v-235c-.1-20.3-7.6-39-21.4-52.9zM246 609.6c0 6.8-3.9 10.6-10.7 10.6-6.8 0-10.7-3.8-10.7-10.6V374.5c0-6.8 3.9-10.6 10.7-10.6 6.8 0 10.7 3.8 10.7 10.6v235.1zm131.1-396.8c37.5-27.3 85.3-42.3 135-42.3s97.5 15.1 135 42.5c32.4 23.7 54.2 54.2 62.7 87.5H314.4c8.5-33.4 30.5-64 62.7-87.7zm39.3 674.7c-.6 5.6-4.4 8.7-10.5 8.7-6.8 0-10.7-3.8-10.7-10.6v-58.2h21.2v60.1zm202.3 8.7c-6.8 0-10.7-3.8-10.7-10.6v-58.2h21.2v60.1c-.6 5.6-4.3 8.7-10.5 8.7zm95.8-132.6H309.9V364h404.6v399.6zm85.2-154c0 6.8-3.9 10.6-10.7 10.6-6.8 0-10.7-3.8-10.7-10.6V374.5c0-6.8 3.9-10.6 10.7-10.6 6.8 0 10.7 3.8 10.7 10.6v235.1zM576.1 225.2c-18.6 0-32 13.4-32 31.9s13.5 31.9 32 31.9c18.6 0 32.1-13.4 32.1-32-.1-18.6-13.4-31.8-32.1-31.8z")),t.WindowsFill=o("windows",c,r(a,"M523.8 191.4v288.9h382V128.1zm0 642.2l382 62.2v-352h-382zM120.1 480.2H443V201.9l-322.9 53.5zm0 290.4L443 823.2V543.8H120.1z")),t.ApiOutline=o("api",s,r(a,"M917.7 148.8l-42.4-42.4c-1.6-1.6-3.6-2.3-5.7-2.3s-4.1.8-5.7 2.3l-76.1 76.1a199.27 199.27 0 0 0-112.1-34.3c-51.2 0-102.4 19.5-141.5 58.6L432.3 308.7a8.03 8.03 0 0 0 0 11.3L704 591.7c1.6 1.6 3.6 2.3 5.7 2.3 2 0 4.1-.8 5.7-2.3l101.9-101.9c68.9-69 77-175.7 24.3-253.5l76.1-76.1c3.1-3.2 3.1-8.3 0-11.4zM769.1 441.7l-59.4 59.4-186.8-186.8 59.4-59.4c24.9-24.9 58.1-38.7 93.4-38.7 35.3 0 68.4 13.7 93.4 38.7 24.9 24.9 38.7 58.1 38.7 93.4 0 35.3-13.8 68.4-38.7 93.4zm-190.2 105a8.03 8.03 0 0 0-11.3 0L501 613.3 410.7 523l66.7-66.7c3.1-3.1 3.1-8.2 0-11.3L441 408.6a8.03 8.03 0 0 0-11.3 0L363 475.3l-43-43a7.85 7.85 0 0 0-5.7-2.3c-2 0-4.1.8-5.7 2.3L206.8 534.2c-68.9 69-77 175.7-24.3 253.5l-76.1 76.1a8.03 8.03 0 0 0 0 11.3l42.4 42.4c1.6 1.6 3.6 2.3 5.7 2.3s4.1-.8 5.7-2.3l76.1-76.1c33.7 22.9 72.9 34.3 112.1 34.3 51.2 0 102.4-19.5 141.5-58.6l101.9-101.9c3.1-3.1 3.1-8.2 0-11.3l-43-43 66.7-66.7c3.1-3.1 3.1-8.2 0-11.3l-36.6-36.2zM441.7 769.1a131.32 131.32 0 0 1-93.4 38.7c-35.3 0-68.4-13.7-93.4-38.7a131.32 131.32 0 0 1-38.7-93.4c0-35.3 13.7-68.4 38.7-93.4l59.4-59.4 186.8 186.8-59.4 59.4z")),t.AppleOutline=o("apple",s,r(a,"M747.4 535.7c-.4-68.2 30.5-119.6 92.9-157.5-34.9-50-87.7-77.5-157.3-82.8-65.9-5.2-138 38.4-164.4 38.4-27.9 0-91.7-36.6-141.9-36.6C273.1 298.8 163 379.8 163 544.6c0 48.7 8.9 99 26.7 150.8 23.8 68.2 109.6 235.3 199.1 232.6 46.8-1.1 79.9-33.2 140.8-33.2 59.1 0 89.7 33.2 141.9 33.2 90.3-1.3 167.9-153.2 190.5-221.6-121.1-57.1-114.6-167.2-114.6-170.7zm-10.6 267c-14.3 19.9-28.7 35.6-41.9 45.7-10.5 8-18.6 11.4-24 11.6-9-.1-17.7-2.3-34.7-8.8-1.2-.5-2.5-1-4.2-1.6l-4.4-1.7c-17.4-6.7-27.8-10.3-41.1-13.8-18.6-4.8-37.1-7.4-56.9-7.4-20.2 0-39.2 2.5-58.1 7.2-13.9 3.5-25.6 7.4-42.7 13.8-.7.3-8.1 3.1-10.2 3.9-3.5 1.3-6.2 2.3-8.7 3.2-10.4 3.6-17 5.1-22.9 5.2-.7 0-1.3-.1-1.8-.2-1.1-.2-2.5-.6-4.1-1.3-4.5-1.8-9.9-5.1-16-9.8-14-10.9-29.4-28-45.1-49.9-27.5-38.6-53.5-89.8-66-125.7-15.4-44.8-23-87.7-23-128.6 0-60.2 17.8-106 48.4-137.1 26.3-26.6 61.7-41.5 97.8-42.3 5.9.1 14.5 1.5 25.4 4.5 8.6 2.3 18 5.4 30.7 9.9 3.8 1.4 16.9 6.1 18.5 6.7 7.7 2.8 13.5 4.8 19.2 6.6 18.2 5.8 32.3 9 47.6 9 15.5 0 28.8-3.3 47.7-9.8 7.1-2.4 32.9-12 37.5-13.6 25.6-9.1 44.5-14 60.8-15.2 4.8-.4 9.1-.4 13.2-.1 22.7 1.8 42.1 6.3 58.6 13.8-37.6 43.4-57 96.5-56.9 158.4-.3 14.7.9 31.7 5.1 51.8 6.4 30.5 18.6 60.7 37.9 89 14.7 21.5 32.9 40.9 54.7 57.8-11.5 23.7-25.6 48.2-40.4 68.8zm-94.5-572c50.7-60.2 46.1-115 44.6-134.7-44.8 2.6-96.6 30.5-126.1 64.8-32.5 36.8-51.6 82.3-47.5 133.6 48.4 3.7 92.6-21.2 129-63.7z")),t.AppstoreOutline=o("appstore",s,r(a,"M464 144H160c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V160c0-8.8-7.2-16-16-16zm-52 268H212V212h200v200zm452-268H560c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V160c0-8.8-7.2-16-16-16zm-52 268H612V212h200v200zM464 544H160c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V560c0-8.8-7.2-16-16-16zm-52 268H212V612h200v200zm452-268H560c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V560c0-8.8-7.2-16-16-16zm-52 268H612V612h200v200z")),t.AudioOutline=o("audio",s,r(a,"M842 454c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8 0 140.3-113.7 254-254 254S258 594.3 258 454c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8 0 168.7 126.6 307.9 290 327.6V884H326.7c-13.7 0-24.7 14.3-24.7 32v36c0 4.4 2.8 8 6.2 8h407.6c3.4 0 6.2-3.6 6.2-8v-36c0-17.7-11-32-24.7-32H548V782.1c165.3-18 294-158 294-328.1zM512 624c93.9 0 170-75.2 170-168V232c0-92.8-76.1-168-170-168s-170 75.2-170 168v224c0 92.8 76.1 168 170 168zm-94-392c0-50.6 41.9-92 94-92s94 41.4 94 92v224c0 50.6-41.9 92-94 92s-94-41.4-94-92V232z")),t.BackwardOutline=o("backward",s,r(i,"M448.98 106.1L12.68 481.6c-16.9 15.7-16.9 43.3 0 59l436.2 377.3c24.4 22.8 63.1 4.7 63.1-29.5V135.6c.1-34.1-38.6-52.2-63-29.5zM960.98 106.1l-436.3 375.5c-8.4 7.9-12.6 18.7-12.6 29.5s4.2 21.6 12.6 29.5l436.2 377.3c24.4 22.8 63.1 4.7 63.1-29.5V135.6c.1-34.1-38.6-52.2-63-29.5z")),t.BankOutline=o("bank",s,r(a,"M894 462c30.9 0 43.8-39.7 18.7-58L530.8 126.2a31.81 31.81 0 0 0-37.6 0L111.3 404c-25.1 18.2-12.2 58 18.8 58H192v374h-72c-4.4 0-8 3.6-8 8v52c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-52c0-4.4-3.6-8-8-8h-72V462h62zM512 196.7l271.1 197.2H240.9L512 196.7zM264 462h117v374H264V462zm189 0h117v374H453V462zm307 374H642V462h118v374z")),t.BehanceSquareOutline=o("behance-square",s,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM598.5 350.9h138.4v33.7H598.5v-33.7zM512 628.8a89.52 89.52 0 0 1-27 31c-11.8 8.2-24.9 14.2-38.8 17.7a167.4 167.4 0 0 1-44.6 5.7H236V342.1h161c16.3 0 31.1 1.5 44.6 4.3 13.4 2.8 24.8 7.6 34.4 14.1 9.5 6.5 17 15.2 22.3 26 5.2 10.7 7.9 24.1 7.9 40 0 17.2-3.9 31.4-11.7 42.9-7.9 11.5-19.3 20.8-34.8 28.1 21.1 6 36.6 16.7 46.8 31.7 10.4 15.2 15.5 33.4 15.5 54.8 0 17.4-3.3 32.3-10 44.8zM790.8 576H612.4c0 19.4 6.7 38 16.8 48 10.2 9.9 24.8 14.9 43.9 14.9 13.8 0 25.5-3.5 35.5-10.4 9.9-6.9 15.9-14.2 18.1-21.8h59.8c-9.6 29.7-24.2 50.9-44 63.7-19.6 12.8-43.6 19.2-71.5 19.2-19.5 0-37-3.2-52.7-9.3-15.1-5.9-28.7-14.9-39.9-26.5a121.2 121.2 0 0 1-25.1-41.2c-6.1-16.9-9.1-34.7-8.9-52.6 0-18.5 3.1-35.7 9.1-51.7 11.5-31.1 35.4-56 65.9-68.9 16.3-6.8 33.8-10.2 51.5-10 21 0 39.2 4 55 12.2a111.6 111.6 0 0 1 38.6 32.8c10.1 13.7 17.2 29.3 21.7 46.9 4.3 17.3 5.8 35.5 4.6 54.7zm-122-95.6c-10.8 0-19.9 1.9-26.9 5.6-7 3.7-12.8 8.3-17.2 13.6a48.4 48.4 0 0 0-9.1 17.4c-1.6 5.3-2.7 10.7-3.1 16.2H723c-1.6-17.3-7.6-30.1-15.6-39.1-8.4-8.9-21.9-13.7-38.6-13.7zm-248.5-10.1c8.7-6.3 12.9-16.7 12.9-31 .3-6.8-1.1-13.5-4.1-19.6-2.7-4.9-6.7-9-11.6-11.9a44.8 44.8 0 0 0-16.6-6c-6.4-1.2-12.9-1.8-19.3-1.7h-70.3v79.7h76.1c13.1.1 24.2-3.1 32.9-9.5zm11.8 72c-9.8-7.5-22.9-11.2-39.2-11.2h-81.8v94h80.2c7.5 0 14.4-.7 21.1-2.1s12.7-3.8 17.8-7.2c5.1-3.3 9.2-7.8 12.3-13.6 3-5.8 4.5-13.2 4.5-22.1 0-17.7-5-30.2-14.9-37.8z")),t.BellOutline=o("bell",s,r(a,"M816 768h-24V428c0-141.1-104.3-257.7-240-277.1V112c0-22.1-17.9-40-40-40s-40 17.9-40 40v38.9c-135.7 19.4-240 136-240 277.1v340h-24c-17.7 0-32 14.3-32 32v32c0 4.4 3.6 8 8 8h216c0 61.8 50.2 112 112 112s112-50.2 112-112h216c4.4 0 8-3.6 8-8v-32c0-17.7-14.3-32-32-32zM512 888c-26.5 0-48-21.5-48-48h96c0 26.5-21.5 48-48 48zM304 768V428c0-55.6 21.6-107.8 60.9-147.1S456.4 220 512 220c55.6 0 107.8 21.6 147.1 60.9S720 372.4 720 428v340H304z")),t.BookOutline=o("book",s,r(a,"M832 64H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V96c0-17.7-14.3-32-32-32zm-260 72h96v209.9L621.5 312 572 347.4V136zm220 752H232V136h280v296.9c0 3.3 1 6.6 3 9.3a15.9 15.9 0 0 0 22.3 3.7l83.8-59.9 81.4 59.4c2.7 2 6 3.1 9.4 3.1 8.8 0 16-7.2 16-16V136h64v752z")),t.BoxPlotOutline=o("box-plot",s,r(a,"M952 224h-52c-4.4 0-8 3.6-8 8v248h-92V304c0-4.4-3.6-8-8-8H232c-4.4 0-8 3.6-8 8v176h-92V232c0-4.4-3.6-8-8-8H72c-4.4 0-8 3.6-8 8v560c0 4.4 3.6 8 8 8h52c4.4 0 8-3.6 8-8V548h92v172c0 4.4 3.6 8 8 8h560c4.4 0 8-3.6 8-8V548h92v244c0 4.4 3.6 8 8 8h52c4.4 0 8-3.6 8-8V232c0-4.4-3.6-8-8-8zM296 368h88v288h-88V368zm432 288H448V368h280v288z")),t.BuildOutline=o("build",s,r(a,"M916 210H376c-17.7 0-32 14.3-32 32v236H108c-17.7 0-32 14.3-32 32v272c0 17.7 14.3 32 32 32h540c17.7 0 32-14.3 32-32V546h236c17.7 0 32-14.3 32-32V242c0-17.7-14.3-32-32-32zm-504 68h200v200H412V278zm-68 468H144V546h200v200zm268 0H412V546h200v200zm268-268H680V278h200v200z")),t.BulbOutline=o("bulb",s,r(a,"M632 888H392c-4.4 0-8 3.6-8 8v32c0 17.7 14.3 32 32 32h192c17.7 0 32-14.3 32-32v-32c0-4.4-3.6-8-8-8zM512 64c-181.1 0-328 146.9-328 328 0 121.4 66 227.4 164 284.1V792c0 17.7 14.3 32 32 32h264c17.7 0 32-14.3 32-32V676.1c98-56.7 164-162.7 164-284.1 0-181.1-146.9-328-328-328zm127.9 549.8L604 634.6V752H420V634.6l-35.9-20.8C305.4 568.3 256 484.5 256 392c0-141.4 114.6-256 256-256s256 114.6 256 256c0 92.5-49.4 176.3-128.1 221.8z")),t.CalculatorOutline=o("calculator",s,r(a,"M251.2 387H320v68.8c0 1.8 1.8 3.2 4 3.2h48c2.2 0 4-1.4 4-3.3V387h68.8c1.8 0 3.2-1.8 3.2-4v-48c0-2.2-1.4-4-3.3-4H376v-68.8c0-1.8-1.8-3.2-4-3.2h-48c-2.2 0-4 1.4-4 3.2V331h-68.8c-1.8 0-3.2 1.8-3.2 4v48c0 2.2 1.4 4 3.2 4zm328 0h193.6c1.8 0 3.2-1.8 3.2-4v-48c0-2.2-1.4-4-3.3-4H579.2c-1.8 0-3.2 1.8-3.2 4v48c0 2.2 1.4 4 3.2 4zm0 265h193.6c1.8 0 3.2-1.8 3.2-4v-48c0-2.2-1.4-4-3.3-4H579.2c-1.8 0-3.2 1.8-3.2 4v48c0 2.2 1.4 4 3.2 4zm0 104h193.6c1.8 0 3.2-1.8 3.2-4v-48c0-2.2-1.4-4-3.3-4H579.2c-1.8 0-3.2 1.8-3.2 4v48c0 2.2 1.4 4 3.2 4zm-195.7-81l61.2-74.9c4.3-5.2.7-13.1-5.9-13.1H388c-2.3 0-4.5 1-5.9 2.9l-34 41.6-34-41.6a7.85 7.85 0 0 0-5.9-2.9h-50.9c-6.6 0-10.2 7.9-5.9 13.1l61.2 74.9-62.7 76.8c-4.4 5.2-.8 13.1 5.8 13.1h50.8c2.3 0 4.5-1 5.9-2.9l35.5-43.5 35.5 43.5c1.5 1.8 3.7 2.9 5.9 2.9h50.8c6.6 0 10.2-7.9 5.9-13.1L383.5 675zM880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-36 732H180V180h664v664z")),t.CalendarOutline=o("calendar",s,r(a,"M880 184H712v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H384v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H144c-17.7 0-32 14.3-32 32v664c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V216c0-17.7-14.3-32-32-32zm-40 656H184V460h656v380zM184 392V256h128v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h256v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h128v136H184z")),t.CarOutline=o("car",s,r(a,"M380 704h264c4.4 0 8-3.6 8-8v-84c0-4.4-3.6-8-8-8h-40c-4.4 0-8 3.6-8 8v36H428v-36c0-4.4-3.6-8-8-8h-40c-4.4 0-8 3.6-8 8v84c0 4.4 3.6 8 8 8zm340-123a40 40 0 1 0 80 0 40 40 0 1 0-80 0zm239-167.6L935.3 372a8 8 0 0 0-10.9-2.9l-50.7 29.6-78.3-216.2a63.9 63.9 0 0 0-60.9-44.4H301.2c-34.7 0-65.5 22.4-76.2 55.5l-74.6 205.2-50.8-29.6a8 8 0 0 0-10.9 2.9L65 413.4c-2.2 3.8-.9 8.6 2.9 10.8l60.4 35.2-14.5 40c-1.2 3.2-1.8 6.6-1.8 10v348.2c0 15.7 11.8 28.4 26.3 28.4h67.6c12.3 0 23-9.3 25.6-22.3l7.7-37.7h545.6l7.7 37.7c2.7 13 13.3 22.3 25.6 22.3h67.6c14.5 0 26.3-12.7 26.3-28.4V509.4c0-3.4-.6-6.8-1.8-10l-14.5-40 60.3-35.2a8 8 0 0 0 3-10.8zM840 517v237H184V517l15.6-43h624.8l15.6 43zM292.7 218.1l.5-1.3.4-1.3c1.1-3.3 4.1-5.5 7.6-5.5h427.6l75.4 208H220l72.7-199.9zM224 581a40 40 0 1 0 80 0 40 40 0 1 0-80 0z")),t.CaretDownOutline=o("caret-down",s,r(i,"M76.3 392.3l403.1 489.1a42.53 42.53 0 0 0 63.4 0l405.1-489.1c24.4-27.4 5-70.8-31.7-70.8H108.1c-36.8 0-56.3 43.4-31.8 70.8z")),t.CaretRightOutline=o("caret-right",s,r(i,"M392.7 76.3l489.1 403.1a42.53 42.53 0 0 1 0 63.4L392.7 947.7c-27.4 24.4-70.8 5-70.8-31.7V107.9c.1-36.6 43.4-56.1 70.8-31.6z")),t.CaretLeftOutline=o("caret-left",s,r(i,"M631.3 76.3l-489.2 403a42.53 42.53 0 0 0 0 63.4l489.1 405.1c27.4 24.4 70.8 5 70.8-31.7V107.9c0-36.6-43.4-56.1-70.7-31.6z")),t.CaretUpOutline=o("caret-up",s,r(i,"M76.3 632.8l405.1-489.1a42.53 42.53 0 0 1 63.4 0l403.1 489.1c24.4 27.4 5 70.8-31.7 70.8H107.9c-36.6 0-56.1-43.4-31.6-70.8z")),t.CarryOutOutline=o("carry-out",s,r(a,"M880 184H712v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H384v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H144c-17.7 0-32 14.3-32 32v664c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V216c0-17.7-14.3-32-32-32zm-40 656H184V256h128v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h256v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h128v584zM688 420h-55.2c-5.1 0-10 2.5-13 6.6L468.9 634.4l-64.7-89c-3-4.1-7.8-6.6-13-6.6H336c-6.5 0-10.3 7.4-6.5 12.7l126.4 174a16.1 16.1 0 0 0 26 0l212.6-292.7c3.8-5.4 0-12.8-6.5-12.8z")),t.CheckCircleOutline=o("check-circle",s,r(a,"M699 353h-46.9c-10.2 0-19.9 4.9-25.9 13.3L469 584.3l-71.2-98.8c-6-8.3-15.6-13.3-25.9-13.3H325c-6.5 0-10.3 7.4-6.5 12.7l124.6 172.8a31.8 31.8 0 0 0 51.7 0l210.6-292c3.9-5.3.1-12.7-6.4-12.7z","M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z")),t.CheckSquareOutline=o("check-square",s,r(a,"M433.1 657.7a31.8 31.8 0 0 0 51.7 0l210.6-292c3.8-5.3 0-12.7-6.5-12.7H642c-10.2 0-19.9 4.9-25.9 13.3L459 584.3l-71.2-98.8c-6-8.3-15.6-13.3-25.9-13.3H315c-6.5 0-10.3 7.4-6.5 12.7l124.6 172.8z","M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z")),t.ChromeOutline=o("chrome",s,r(a,"M928 512.3v-.3c0-229.8-186.2-416-416-416S96 282.2 96 512v.4c0 229.8 186.2 416 416 416s416-186.2 416-416v-.3.2zm-6.7-74.6l.6 3.3-.6-3.3zM676.7 638.2c53.5-82.2 52.5-189.4-11.1-263.7l162.4-8.4c20.5 44.4 32 93.8 32 145.9 0 185.2-144.6 336.6-327.1 347.4l143.8-221.2zM512 652.3c-77.5 0-140.2-62.7-140.2-140.2 0-77.7 62.7-140.2 140.2-140.2S652.2 434.5 652.2 512 589.5 652.3 512 652.3zm369.2-331.7l-3-5.7 3 5.7zM512 164c121.3 0 228.2 62.1 290.4 156.2l-263.6-13.9c-97.5-5.7-190.2 49.2-222.3 141.1L227.8 311c63.1-88.9 166.9-147 284.2-147zM102.5 585.8c26 145 127.1 264 261.6 315.1C229.6 850 128.5 731 102.5 585.8zM164 512c0-55.9 13.2-108.7 36.6-155.5l119.7 235.4c44.1 86.7 137.4 139.7 234 121.6l-74 145.1C302.9 842.5 164 693.5 164 512zm324.7 415.4c4 .2 8 .4 12 .5-4-.2-8-.3-12-.5z")),t.ClockCircleOutline=o("clock-circle",s,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z","M686.7 638.6L544.1 535.5V288c0-4.4-3.6-8-8-8H488c-4.4 0-8 3.6-8 8v275.4c0 2.6 1.2 5 3.3 6.5l165.4 120.6c3.6 2.6 8.6 1.8 11.2-1.7l28.6-39c2.6-3.7 1.8-8.7-1.8-11.2z")),t.CloseCircleOutline=o("close-circle",s,r(a,"M685.4 354.8c0-4.4-3.6-8-8-8l-66 .3L512 465.6l-99.3-118.4-66.1-.3c-4.4 0-8 3.5-8 8 0 1.9.7 3.7 1.9 5.2l130.1 155L340.5 670a8.32 8.32 0 0 0-1.9 5.2c0 4.4 3.6 8 8 8l66.1-.3L512 564.4l99.3 118.4 66 .3c4.4 0 8-3.5 8-8 0-1.9-.7-3.7-1.9-5.2L553.5 515l130.1-155c1.2-1.4 1.8-3.3 1.8-5.2z","M512 65C264.6 65 64 265.6 64 513s200.6 448 448 448 448-200.6 448-448S759.4 65 512 65zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z")),t.CameraOutline=o("camera",s,r(a,"M864 248H728l-32.4-90.8a32.07 32.07 0 0 0-30.2-21.2H358.6c-13.5 0-25.6 8.5-30.1 21.2L296 248H160c-44.2 0-80 35.8-80 80v456c0 44.2 35.8 80 80 80h704c44.2 0 80-35.8 80-80V328c0-44.2-35.8-80-80-80zm8 536c0 4.4-3.6 8-8 8H160c-4.4 0-8-3.6-8-8V328c0-4.4 3.6-8 8-8h186.7l17.1-47.8 22.9-64.2h250.5l22.9 64.2 17.1 47.8H864c4.4 0 8 3.6 8 8v456zM512 384c-88.4 0-160 71.6-160 160s71.6 160 160 160 160-71.6 160-160-71.6-160-160-160zm0 256c-53 0-96-43-96-96s43-96 96-96 96 43 96 96-43 96-96 96z")),t.CloseSquareOutline=o("close-square",s,r(a,"M354 671h58.9c4.7 0 9.2-2.1 12.3-5.7L512 561.8l86.8 103.5c3 3.6 7.5 5.7 12.3 5.7H670c6.8 0 10.5-7.9 6.1-13.1L553.8 512l122.4-145.9c4.4-5.2.7-13.1-6.1-13.1h-58.9c-4.7 0-9.2 2.1-12.3 5.7L512 462.2l-86.8-103.5c-3-3.6-7.5-5.7-12.3-5.7H354c-6.8 0-10.5 7.9-6.1 13.1L470.2 512 347.9 657.9A7.95 7.95 0 0 0 354 671z","M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z")),t.CloudOutline=o("cloud",s,r(a,"M811.4 418.7C765.6 297.9 648.9 212 512.2 212S258.8 297.8 213 418.6C127.3 441.1 64 519.1 64 612c0 110.5 89.5 200 199.9 200h496.2C870.5 812 960 722.5 960 612c0-92.7-63.1-170.7-148.6-193.3zm36.3 281a123.07 123.07 0 0 1-87.6 36.3H263.9c-33.1 0-64.2-12.9-87.6-36.3A123.3 123.3 0 0 1 140 612c0-28 9.1-54.3 26.2-76.3a125.7 125.7 0 0 1 66.1-43.7l37.9-9.9 13.9-36.6c8.6-22.8 20.6-44.1 35.7-63.4a245.6 245.6 0 0 1 52.4-49.9c41.1-28.9 89.5-44.2 140-44.2s98.9 15.3 140 44.2c19.9 14 37.5 30.8 52.4 49.9 15.1 19.3 27.1 40.7 35.7 63.4l13.8 36.5 37.8 10c54.3 14.5 92.1 63.8 92.1 120 0 33.1-12.9 64.3-36.3 87.7z")),t.CodepenCircleOutline=o("codepen-circle",s,r(a,"M488.1 414.7V303.4L300.9 428l83.6 55.8zm254.1 137.7v-79.8l-59.8 39.9zM512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm278 533c0 1.1-.1 2.1-.2 3.1 0 .4-.1.7-.2 1a14.16 14.16 0 0 1-.8 3.2c-.2.6-.4 1.2-.6 1.7-.2.4-.4.8-.5 1.2-.3.5-.5 1.1-.8 1.6-.2.4-.4.7-.7 1.1-.3.5-.7 1-1 1.5-.3.4-.5.7-.8 1-.4.4-.8.9-1.2 1.3-.3.3-.6.6-1 .9-.4.4-.9.8-1.4 1.1-.4.3-.7.6-1.1.8-.1.1-.3.2-.4.3L525.2 786c-4 2.7-8.6 4-13.2 4-4.7 0-9.3-1.4-13.3-4L244.6 616.9c-.1-.1-.3-.2-.4-.3l-1.1-.8c-.5-.4-.9-.7-1.3-1.1-.3-.3-.6-.6-1-.9-.4-.4-.8-.8-1.2-1.3a7 7 0 0 1-.8-1c-.4-.5-.7-1-1-1.5-.2-.4-.5-.7-.7-1.1-.3-.5-.6-1.1-.8-1.6-.2-.4-.4-.8-.5-1.2-.2-.6-.4-1.2-.6-1.7-.1-.4-.3-.8-.4-1.2-.2-.7-.3-1.3-.4-2-.1-.3-.1-.7-.2-1-.1-1-.2-2.1-.2-3.1V427.9c0-1 .1-2.1.2-3.1.1-.3.1-.7.2-1a14.16 14.16 0 0 1 .8-3.2c.2-.6.4-1.2.6-1.7.2-.4.4-.8.5-1.2.2-.5.5-1.1.8-1.6.2-.4.4-.7.7-1.1.6-.9 1.2-1.7 1.8-2.5.4-.4.8-.9 1.2-1.3.3-.3.6-.6 1-.9.4-.4.9-.8 1.3-1.1.4-.3.7-.6 1.1-.8.1-.1.3-.2.4-.3L498.7 239c8-5.3 18.5-5.3 26.5 0l254.1 169.1c.1.1.3.2.4.3l1.1.8 1.4 1.1c.3.3.6.6 1 .9.4.4.8.8 1.2 1.3.7.8 1.3 1.6 1.8 2.5.2.4.5.7.7 1.1.3.5.6 1 .8 1.6.2.4.4.8.5 1.2.2.6.4 1.2.6 1.7.1.4.3.8.4 1.2.2.7.3 1.3.4 2 .1.3.1.7.2 1 .1 1 .2 2.1.2 3.1V597zm-254.1 13.3v111.3L723.1 597l-83.6-55.8zM281.8 472.6v79.8l59.8-39.9zM512 456.1l-84.5 56.4 84.5 56.4 84.5-56.4zM723.1 428L535.9 303.4v111.3l103.6 69.1zM384.5 541.2L300.9 597l187.2 124.6V610.3l-103.6-69.1z")),t.CodeOutline=o("code",s,r(a,"M516 673c0 4.4 3.4 8 7.5 8h185c4.1 0 7.5-3.6 7.5-8v-48c0-4.4-3.4-8-7.5-8h-185c-4.1 0-7.5 3.6-7.5 8v48zm-194.9 6.1l192-161c3.8-3.2 3.8-9.1 0-12.3l-192-160.9A7.95 7.95 0 0 0 308 351v62.7c0 2.4 1 4.6 2.9 6.1L420.7 512l-109.8 92.2a8.1 8.1 0 0 0-2.9 6.1V673c0 6.8 7.9 10.5 13.1 6.1zM880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z")),t.ContactsOutline=o("contacts",s,r(a,"M594.3 601.5a111.8 111.8 0 0 0 29.1-75.5c0-61.9-49.9-112-111.4-112s-111.4 50.1-111.4 112c0 29.1 11 55.5 29.1 75.5a158.09 158.09 0 0 0-74.6 126.1 8 8 0 0 0 8 8.4H407c4.2 0 7.6-3.3 7.9-7.5 3.8-50.6 46-90.5 97.2-90.5s93.4 40 97.2 90.5c.3 4.2 3.7 7.5 7.9 7.5H661a8 8 0 0 0 8-8.4c-2.8-53.3-32-99.7-74.7-126.1zM512 578c-28.5 0-51.7-23.3-51.7-52s23.2-52 51.7-52 51.7 23.3 51.7 52-23.2 52-51.7 52zm416-354H768v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56H548v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56H328v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56H96c-17.7 0-32 14.3-32 32v576c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V256c0-17.7-14.3-32-32-32zm-40 568H136V296h120v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56h148v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56h148v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56h120v496z")),t.ContainerOutline=o("container",s,r(a,"M832 64H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V96c0-17.7-14.3-32-32-32zm-40 824H232V687h97.9c11.6 32.8 32 62.3 59.1 84.7 34.5 28.5 78.2 44.3 123 44.3s88.5-15.7 123-44.3c27.1-22.4 47.5-51.9 59.1-84.7H792v-63H643.6l-5.2 24.7C626.4 708.5 573.2 752 512 752s-114.4-43.5-126.5-103.3l-5.2-24.7H232V136h560v752zM320 341h384c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H320c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8zm0 160h384c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H320c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8z")),t.ControlOutline=o("control",s,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656zM340 683v77c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-77c-10.1 3.3-20.8 5-32 5s-21.9-1.8-32-5zm64-198V264c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v221c10.1-3.3 20.8-5 32-5s21.9 1.8 32 5zm-64 198c10.1 3.3 20.8 5 32 5s21.9-1.8 32-5c41.8-13.5 72-52.7 72-99s-30.2-85.5-72-99c-10.1-3.3-20.8-5-32-5s-21.9 1.8-32 5c-41.8 13.5-72 52.7-72 99s30.2 85.5 72 99zm.1-115.7c.3-.6.7-1.2 1-1.8v-.1l1.2-1.8c.1-.2.2-.3.3-.5.3-.5.7-.9 1-1.4.1-.1.2-.3.3-.4.5-.6.9-1.1 1.4-1.6l.3-.3 1.2-1.2.4-.4c.5-.5 1-.9 1.6-1.4.6-.5 1.1-.9 1.7-1.3.2-.1.3-.2.5-.3.5-.3.9-.7 1.4-1 .1-.1.3-.2.4-.3.6-.4 1.2-.7 1.9-1.1.1-.1.3-.1.4-.2.5-.3 1-.5 1.6-.8l.6-.3c.7-.3 1.3-.6 2-.8.7-.3 1.4-.5 2.1-.7.2-.1.4-.1.6-.2.6-.2 1.1-.3 1.7-.4.2 0 .3-.1.5-.1.7-.2 1.5-.3 2.2-.4.2 0 .3 0 .5-.1.6-.1 1.2-.1 1.8-.2h.6c.8 0 1.5-.1 2.3-.1s1.5 0 2.3.1h.6c.6 0 1.2.1 1.8.2.2 0 .3 0 .5.1.7.1 1.5.2 2.2.4.2 0 .3.1.5.1.6.1 1.2.3 1.7.4.2.1.4.1.6.2.7.2 1.4.4 2.1.7.7.2 1.3.5 2 .8l.6.3c.5.2 1.1.5 1.6.8.1.1.3.1.4.2.6.3 1.3.7 1.9 1.1.1.1.3.2.4.3.5.3 1 .6 1.4 1 .2.1.3.2.5.3.6.4 1.2.9 1.7 1.3s1.1.9 1.6 1.4l.4.4 1.2 1.2.3.3c.5.5 1 1.1 1.4 1.6.1.1.2.3.3.4.4.4.7.9 1 1.4.1.2.2.3.3.5l1.2 1.8s0 .1.1.1a36.18 36.18 0 0 1 5.1 18.5c0 6-1.5 11.7-4.1 16.7-.3.6-.7 1.2-1 1.8 0 0 0 .1-.1.1l-1.2 1.8c-.1.2-.2.3-.3.5-.3.5-.7.9-1 1.4-.1.1-.2.3-.3.4-.5.6-.9 1.1-1.4 1.6l-.3.3-1.2 1.2-.4.4c-.5.5-1 .9-1.6 1.4-.6.5-1.1.9-1.7 1.3-.2.1-.3.2-.5.3-.5.3-.9.7-1.4 1-.1.1-.3.2-.4.3-.6.4-1.2.7-1.9 1.1-.1.1-.3.1-.4.2-.5.3-1 .5-1.6.8l-.6.3c-.7.3-1.3.6-2 .8-.7.3-1.4.5-2.1.7-.2.1-.4.1-.6.2-.6.2-1.1.3-1.7.4-.2 0-.3.1-.5.1-.7.2-1.5.3-2.2.4-.2 0-.3 0-.5.1-.6.1-1.2.1-1.8.2h-.6c-.8 0-1.5.1-2.3.1s-1.5 0-2.3-.1h-.6c-.6 0-1.2-.1-1.8-.2-.2 0-.3 0-.5-.1-.7-.1-1.5-.2-2.2-.4-.2 0-.3-.1-.5-.1-.6-.1-1.2-.3-1.7-.4-.2-.1-.4-.1-.6-.2-.7-.2-1.4-.4-2.1-.7-.7-.2-1.3-.5-2-.8l-.6-.3c-.5-.2-1.1-.5-1.6-.8-.1-.1-.3-.1-.4-.2-.6-.3-1.3-.7-1.9-1.1-.1-.1-.3-.2-.4-.3-.5-.3-1-.6-1.4-1-.2-.1-.3-.2-.5-.3-.6-.4-1.2-.9-1.7-1.3s-1.1-.9-1.6-1.4l-.4-.4-1.2-1.2-.3-.3c-.5-.5-1-1.1-1.4-1.6-.1-.1-.2-.3-.3-.4-.4-.4-.7-.9-1-1.4-.1-.2-.2-.3-.3-.5l-1.2-1.8v-.1c-.4-.6-.7-1.2-1-1.8-2.6-5-4.1-10.7-4.1-16.7s1.5-11.7 4.1-16.7zM620 539v221c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V539c-10.1 3.3-20.8 5-32 5s-21.9-1.8-32-5zm64-198v-77c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v77c10.1-3.3 20.8-5 32-5s21.9 1.8 32 5zm-64 198c10.1 3.3 20.8 5 32 5s21.9-1.8 32-5c41.8-13.5 72-52.7 72-99s-30.2-85.5-72-99c-10.1-3.3-20.8-5-32-5s-21.9 1.8-32 5c-41.8 13.5-72 52.7-72 99s30.2 85.5 72 99zm.1-115.7c.3-.6.7-1.2 1-1.8v-.1l1.2-1.8c.1-.2.2-.3.3-.5.3-.5.7-.9 1-1.4.1-.1.2-.3.3-.4.5-.6.9-1.1 1.4-1.6l.3-.3 1.2-1.2.4-.4c.5-.5 1-.9 1.6-1.4.6-.5 1.1-.9 1.7-1.3.2-.1.3-.2.5-.3.5-.3.9-.7 1.4-1 .1-.1.3-.2.4-.3.6-.4 1.2-.7 1.9-1.1.1-.1.3-.1.4-.2.5-.3 1-.5 1.6-.8l.6-.3c.7-.3 1.3-.6 2-.8.7-.3 1.4-.5 2.1-.7.2-.1.4-.1.6-.2.6-.2 1.1-.3 1.7-.4.2 0 .3-.1.5-.1.7-.2 1.5-.3 2.2-.4.2 0 .3 0 .5-.1.6-.1 1.2-.1 1.8-.2h.6c.8 0 1.5-.1 2.3-.1s1.5 0 2.3.1h.6c.6 0 1.2.1 1.8.2.2 0 .3 0 .5.1.7.1 1.5.2 2.2.4.2 0 .3.1.5.1.6.1 1.2.3 1.7.4.2.1.4.1.6.2.7.2 1.4.4 2.1.7.7.2 1.3.5 2 .8l.6.3c.5.2 1.1.5 1.6.8.1.1.3.1.4.2.6.3 1.3.7 1.9 1.1.1.1.3.2.4.3.5.3 1 .6 1.4 1 .2.1.3.2.5.3.6.4 1.2.9 1.7 1.3s1.1.9 1.6 1.4l.4.4 1.2 1.2.3.3c.5.5 1 1.1 1.4 1.6.1.1.2.3.3.4.4.4.7.9 1 1.4.1.2.2.3.3.5l1.2 1.8v.1a36.18 36.18 0 0 1 5.1 18.5c0 6-1.5 11.7-4.1 16.7-.3.6-.7 1.2-1 1.8v.1l-1.2 1.8c-.1.2-.2.3-.3.5-.3.5-.7.9-1 1.4-.1.1-.2.3-.3.4-.5.6-.9 1.1-1.4 1.6l-.3.3-1.2 1.2-.4.4c-.5.5-1 .9-1.6 1.4-.6.5-1.1.9-1.7 1.3-.2.1-.3.2-.5.3-.5.3-.9.7-1.4 1-.1.1-.3.2-.4.3-.6.4-1.2.7-1.9 1.1-.1.1-.3.1-.4.2-.5.3-1 .5-1.6.8l-.6.3c-.7.3-1.3.6-2 .8-.7.3-1.4.5-2.1.7-.2.1-.4.1-.6.2-.6.2-1.1.3-1.7.4-.2 0-.3.1-.5.1-.7.2-1.5.3-2.2.4-.2 0-.3 0-.5.1-.6.1-1.2.1-1.8.2h-.6c-.8 0-1.5.1-2.3.1s-1.5 0-2.3-.1h-.6c-.6 0-1.2-.1-1.8-.2-.2 0-.3 0-.5-.1-.7-.1-1.5-.2-2.2-.4-.2 0-.3-.1-.5-.1-.6-.1-1.2-.3-1.7-.4-.2-.1-.4-.1-.6-.2-.7-.2-1.4-.4-2.1-.7-.7-.2-1.3-.5-2-.8l-.6-.3c-.5-.2-1.1-.5-1.6-.8-.1-.1-.3-.1-.4-.2-.6-.3-1.3-.7-1.9-1.1-.1-.1-.3-.2-.4-.3-.5-.3-1-.6-1.4-1-.2-.1-.3-.2-.5-.3-.6-.4-1.2-.9-1.7-1.3s-1.1-.9-1.6-1.4l-.4-.4-1.2-1.2-.3-.3c-.5-.5-1-1.1-1.4-1.6-.1-.1-.2-.3-.3-.4-.4-.4-.7-.9-1-1.4-.1-.2-.2-.3-.3-.5l-1.2-1.8v-.1c-.4-.6-.7-1.2-1-1.8-2.6-5-4.1-10.7-4.1-16.7s1.5-11.7 4.1-16.7z")),t.CopyOutline=o("copy",s,r(a,"M832 64H296c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h496v688c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V96c0-17.7-14.3-32-32-32zM704 192H192c-17.7 0-32 14.3-32 32v530.7c0 8.5 3.4 16.6 9.4 22.6l173.3 173.3c2.2 2.2 4.7 4 7.4 5.5v1.9h4.2c3.5 1.3 7.2 2 11 2H704c17.7 0 32-14.3 32-32V224c0-17.7-14.3-32-32-32zM350 856.2L263.9 770H350v86.2zM664 888H414V746c0-22.1-17.9-40-40-40H232V264h432v624z")),t.CreditCardOutline=o("credit-card",s,r(a,"M928 160H96c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V192c0-17.7-14.3-32-32-32zm-792 72h752v120H136V232zm752 560H136V440h752v352zm-237-64h165c4.4 0 8-3.6 8-8v-72c0-4.4-3.6-8-8-8H651c-4.4 0-8 3.6-8 8v72c0 4.4 3.6 8 8 8z")),t.CrownOutline=o("crown",s,r(a,"M899.6 276.5L705 396.4 518.4 147.5a8.06 8.06 0 0 0-12.9 0L319 396.4 124.3 276.5c-5.7-3.5-13.1 1.2-12.2 7.9L188.5 865c1.1 7.9 7.9 14 16 14h615.1c8 0 14.9-6 15.9-14l76.4-580.6c.8-6.7-6.5-11.4-12.3-7.9zm-126 534.1H250.3l-53.8-409.4 139.8 86.1L512 252.9l175.7 234.4 139.8-86.1-53.9 409.4zM512 509c-62.1 0-112.6 50.5-112.6 112.6S449.9 734.2 512 734.2s112.6-50.5 112.6-112.6S574.1 509 512 509zm0 160.9c-26.6 0-48.2-21.6-48.2-48.3 0-26.6 21.6-48.3 48.2-48.3s48.2 21.6 48.2 48.3c0 26.6-21.6 48.3-48.2 48.3z")),t.CustomerServiceOutline=o("customer-service",s,r(a,"M512 128c-212.1 0-384 171.9-384 384v360c0 13.3 10.7 24 24 24h184c35.3 0 64-28.7 64-64V624c0-35.3-28.7-64-64-64H200v-48c0-172.3 139.7-312 312-312s312 139.7 312 312v48H688c-35.3 0-64 28.7-64 64v208c0 35.3 28.7 64 64 64h184c13.3 0 24-10.7 24-24V512c0-212.1-171.9-384-384-384zM328 632v192H200V632h128zm496 192H696V632h128v192z")),t.DashboardOutline=o("dashboard",s,r(a,"M924.8 385.6a446.7 446.7 0 0 0-96-142.4 446.7 446.7 0 0 0-142.4-96C631.1 123.8 572.5 112 512 112s-119.1 11.8-174.4 35.2a446.7 446.7 0 0 0-142.4 96 446.7 446.7 0 0 0-96 142.4C75.8 440.9 64 499.5 64 560c0 132.7 58.3 257.7 159.9 343.1l1.7 1.4c5.8 4.8 13.1 7.5 20.6 7.5h531.7c7.5 0 14.8-2.7 20.6-7.5l1.7-1.4C901.7 817.7 960 692.7 960 560c0-60.5-11.9-119.1-35.2-174.4zM761.4 836H262.6A371.12 371.12 0 0 1 140 560c0-99.4 38.7-192.8 109-263 70.3-70.3 163.7-109 263-109 99.4 0 192.8 38.7 263 109 70.3 70.3 109 163.7 109 263 0 105.6-44.5 205.5-122.6 276zM623.5 421.5a8.03 8.03 0 0 0-11.3 0L527.7 506c-18.7-5-39.4-.2-54.1 14.5a55.95 55.95 0 0 0 0 79.2 55.95 55.95 0 0 0 79.2 0 55.87 55.87 0 0 0 14.5-54.1l84.5-84.5c3.1-3.1 3.1-8.2 0-11.3l-28.3-28.3zM490 320h44c4.4 0 8-3.6 8-8v-80c0-4.4-3.6-8-8-8h-44c-4.4 0-8 3.6-8 8v80c0 4.4 3.6 8 8 8zm260 218v44c0 4.4 3.6 8 8 8h80c4.4 0 8-3.6 8-8v-44c0-4.4-3.6-8-8-8h-80c-4.4 0-8 3.6-8 8zm12.7-197.2l-31.1-31.1a8.03 8.03 0 0 0-11.3 0l-56.6 56.6a8.03 8.03 0 0 0 0 11.3l31.1 31.1c3.1 3.1 8.2 3.1 11.3 0l56.6-56.6c3.1-3.1 3.1-8.2 0-11.3zm-458.6-31.1a8.03 8.03 0 0 0-11.3 0l-31.1 31.1a8.03 8.03 0 0 0 0 11.3l56.6 56.6c3.1 3.1 8.2 3.1 11.3 0l31.1-31.1c3.1-3.1 3.1-8.2 0-11.3l-56.6-56.6zM262 530h-80c-4.4 0-8 3.6-8 8v44c0 4.4 3.6 8 8 8h80c4.4 0 8-3.6 8-8v-44c0-4.4-3.6-8-8-8z")),t.DatabaseOutline=o("database",s,r(a,"M832 64H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V96c0-17.7-14.3-32-32-32zm-600 72h560v208H232V136zm560 480H232V408h560v208zm0 272H232V680h560v208zM304 240a40 40 0 1 0 80 0 40 40 0 1 0-80 0zm0 272a40 40 0 1 0 80 0 40 40 0 1 0-80 0zm0 272a40 40 0 1 0 80 0 40 40 0 1 0-80 0z")),t.DeleteOutline=o("delete",s,r(a,"M360 184h-8c4.4 0 8-3.6 8-8v8h304v-8c0 4.4 3.6 8 8 8h-8v72h72v-80c0-35.3-28.7-64-64-64H352c-35.3 0-64 28.7-64 64v80h72v-72zm504 72H160c-17.7 0-32 14.3-32 32v32c0 4.4 3.6 8 8 8h60.4l24.7 523c1.6 34.1 29.8 61 63.9 61h454c34.2 0 62.3-26.8 63.9-61l24.7-523H888c4.4 0 8-3.6 8-8v-32c0-17.7-14.3-32-32-32zM731.3 840H292.7l-24.2-512h487l-24.2 512z")),t.DiffOutline=o("diff",s,r(a,"M476 399.1c0-3.9-3.1-7.1-7-7.1h-42c-3.8 0-7 3.2-7 7.1V484h-84.5c-4.1 0-7.5 3.1-7.5 7v42c0 3.8 3.4 7 7.5 7H420v84.9c0 3.9 3.2 7.1 7 7.1h42c3.9 0 7-3.2 7-7.1V540h84.5c4.1 0 7.5-3.2 7.5-7v-42c0-3.9-3.4-7-7.5-7H476v-84.9zM560.5 704h-225c-4.1 0-7.5 3.2-7.5 7v42c0 3.8 3.4 7 7.5 7h225c4.1 0 7.5-3.2 7.5-7v-42c0-3.8-3.4-7-7.5-7zm-7.1-502.6c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v704c0 17.7 14.3 32 32 32h512c17.7 0 32-14.3 32-32V397.3c0-8.5-3.4-16.6-9.4-22.6L553.4 201.4zM664 888H232V264h282.2L664 413.8V888zm190.2-581.4L611.3 72.9c-6-5.7-13.9-8.9-22.2-8.9H296c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h277l219 210.6V824c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V329.6c0-8.7-3.5-17-9.8-23z")),t.FolderAddFill=o("folder-add",c,r(a,"M880 298.4H521L403.7 186.2a8.15 8.15 0 0 0-5.5-2.2H144c-17.7 0-32 14.3-32 32v592c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V330.4c0-17.7-14.3-32-32-32zM632 577c0 3.8-3.4 7-7.5 7H540v84.9c0 3.9-3.2 7.1-7 7.1h-42c-3.8 0-7-3.2-7-7.1V584h-84.5c-4.1 0-7.5-3.2-7.5-7v-42c0-3.8 3.4-7 7.5-7H484v-84.9c0-3.9 3.2-7.1 7-7.1h42c3.8 0 7 3.2 7 7.1V528h84.5c4.1 0 7.5 3.2 7.5 7v42z")),t.DislikeOutline=o("dislike",s,r(a,"M885.9 490.3c3.6-12 5.4-24.4 5.4-37 0-28.3-9.3-55.5-26.1-77.7 3.6-12 5.4-24.4 5.4-37 0-28.3-9.3-55.5-26.1-77.7 3.6-12 5.4-24.4 5.4-37 0-51.6-30.7-98.1-78.3-118.4a66.1 66.1 0 0 0-26.5-5.4H144c-17.7 0-32 14.3-32 32v364c0 17.7 14.3 32 32 32h129.3l85.8 310.8C372.9 889 418.9 924 470.9 924c29.7 0 57.4-11.8 77.9-33.4 20.5-21.5 31-49.7 29.5-79.4l-6-122.9h239.9c12.1 0 23.9-3.2 34.3-9.3 40.4-23.5 65.5-66.1 65.5-111 0-28.3-9.3-55.5-26.1-77.7zM184 456V172h81v284h-81zm627.2 160.4H496.8l9.6 198.4c.6 11.9-4.7 23.1-14.6 30.5-6.1 4.5-13.6 6.8-21.1 6.7a44.28 44.28 0 0 1-42.2-32.3L329 459.2V172h415.4a56.85 56.85 0 0 1 33.6 51.8c0 9.7-2.3 18.9-6.9 27.3l-13.9 25.4 21.9 19a56.76 56.76 0 0 1 19.6 43c0 9.7-2.3 18.9-6.9 27.3l-13.9 25.4 21.9 19a56.76 56.76 0 0 1 19.6 43c0 9.7-2.3 18.9-6.9 27.3l-14 25.5 21.9 19a56.76 56.76 0 0 1 19.6 43c0 19.1-11 37.5-28.8 48.4z")),t.DownCircleOutline=o("down-circle",s,r(a,"M690 405h-46.9c-10.2 0-19.9 4.9-25.9 13.2L512 563.6 406.8 418.2c-6-8.3-15.6-13.2-25.9-13.2H334c-6.5 0-10.3 7.4-6.5 12.7l178 246c3.2 4.4 9.7 4.4 12.9 0l178-246c3.9-5.3.1-12.7-6.4-12.7z","M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z")),t.DownSquareOutline=o("down-square",s,r(a,"M505.5 658.7c3.2 4.4 9.7 4.4 12.9 0l178-246c3.8-5.3 0-12.7-6.5-12.7H643c-10.2 0-19.9 4.9-25.9 13.2L512 558.6 406.8 413.2c-6-8.3-15.6-13.2-25.9-13.2H334c-6.5 0-10.3 7.4-6.5 12.7l178 246z","M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z")),t.DribbbleSquareOutline=o("dribbble-square",s,r(a,"M498.6 432c-40.8-72.5-84.7-133.4-91.2-142.3-68.8 32.5-120.3 95.9-136.2 172.2 11 .2 112.4.7 227.4-29.9zm66.5 21.8c5.7 11.7 11.2 23.6 16.3 35.6 1.8 4.2 3.6 8.4 5.3 12.7 81.8-10.3 163.2 6.2 171.3 7.9-.5-58.1-21.3-111.4-55.5-153.3-5.3 7.1-46.5 60-137.4 97.1zM880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM512 800c-158.8 0-288-129.2-288-288s129.2-288 288-288 288 129.2 288 288-129.2 288-288 288zm89.7-259.1c32.2 88.4 45.3 160.4 47.8 175.4 55.2-37.3 94.5-96.4 105.4-164.9-8.4-2.6-76.1-22.8-153.2-10.5zm-72.5-26.4c3.2-1 6.4-2 9.7-2.9-6.2-14-12.9-28-19.9-41.7-122.8 36.8-242.1 35.2-252.8 35-.1 2.5-.1 5-.1 7.5 0 63.2 23.9 120.9 63.2 164.5 5.5-9.6 73-121.4 199.9-162.4zm145.9-186.2a245.2 245.2 0 0 0-220.8-55.1c6.8 9.1 51.5 69.9 91.8 144 87.5-32.8 124.5-82.6 129-88.9zM554 552.8c-138.7 48.3-188.6 144.6-193 153.6 41.7 32.5 94.1 51.9 151 51.9 34.1 0 66.6-6.9 96.1-19.5-3.7-21.6-17.9-96.8-52.5-186.6l-1.6.6z")),t.EnvironmentOutline=o("environment",s,r(a,"M854.6 289.1a362.49 362.49 0 0 0-79.9-115.7 370.83 370.83 0 0 0-118.2-77.8C610.7 76.6 562.1 67 512 67c-50.1 0-98.7 9.6-144.5 28.5-44.3 18.3-84 44.5-118.2 77.8A363.6 363.6 0 0 0 169.4 289c-19.5 45-29.4 92.8-29.4 142 0 70.6 16.9 140.9 50.1 208.7 26.7 54.5 64 107.6 111 158.1 80.3 86.2 164.5 138.9 188.4 153a43.9 43.9 0 0 0 22.4 6.1c7.8 0 15.5-2 22.4-6.1 23.9-14.1 108.1-66.8 188.4-153 47-50.4 84.3-103.6 111-158.1C867.1 572 884 501.8 884 431.1c0-49.2-9.9-97-29.4-142zM512 880.2c-65.9-41.9-300-207.8-300-449.1 0-77.9 31.1-151.1 87.6-206.3C356.3 169.5 431.7 139 512 139s155.7 30.5 212.4 85.9C780.9 280 812 353.2 812 431.1c0 241.3-234.1 407.2-300 449.1zm0-617.2c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm79.2 255.2A111.6 111.6 0 0 1 512 551c-29.9 0-58-11.7-79.2-32.8A111.6 111.6 0 0 1 400 439c0-29.9 11.7-58 32.8-79.2C454 338.6 482.1 327 512 327c29.9 0 58 11.6 79.2 32.8C612.4 381 624 409.1 624 439c0 29.9-11.6 58-32.8 79.2z")),t.EditOutline=o("edit",s,r(a,"M257.7 752c2 0 4-.2 6-.5L431.9 722c2-.4 3.9-1.3 5.3-2.8l423.9-423.9a9.96 9.96 0 0 0 0-14.1L694.9 114.9c-1.9-1.9-4.4-2.9-7.1-2.9s-5.2 1-7.1 2.9L256.8 538.8c-1.5 1.5-2.4 3.3-2.8 5.3l-29.5 168.2a33.5 33.5 0 0 0 9.4 29.8c6.6 6.4 14.9 9.9 23.8 9.9zm67.4-174.4L687.8 215l73.3 73.3-362.7 362.6-88.9 15.7 15.6-89zM880 836H144c-17.7 0-32 14.3-32 32v36c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-36c0-17.7-14.3-32-32-32z")),t.ExclamationCircleOutline=o("exclamation-circle",s,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z","M464 688a48 48 0 1 0 96 0 48 48 0 1 0-96 0zM488 576h48c4.4 0 8-3.6 8-8V296c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v272c0 4.4 3.6 8 8 8z")),t.ExperimentOutline=o("experiment",s,r(a,"M512 472a40 40 0 1 0 80 0 40 40 0 1 0-80 0zm367 352.9L696.3 352V178H768v-68H256v68h71.7v174L145 824.9c-2.8 7.4-4.3 15.2-4.3 23.1 0 35.3 28.7 64 64 64h614.6c7.9 0 15.7-1.5 23.1-4.3 33-12.7 49.4-49.8 36.6-82.8zM395.7 364.7V180h232.6v184.7L719.2 600c-20.7-5.3-42.1-8-63.9-8-61.2 0-119.2 21.5-165.3 60a188.78 188.78 0 0 1-121.3 43.9c-32.7 0-64.1-8.3-91.8-23.7l118.8-307.5zM210.5 844l41.7-107.8c35.7 18.1 75.4 27.8 116.6 27.8 61.2 0 119.2-21.5 165.3-60 33.9-28.2 76.3-43.9 121.3-43.9 35 0 68.4 9.5 97.6 27.1L813.5 844h-603z")),t.EyeOutline=o("eye",s,r(a,"M942.2 486.2C847.4 286.5 704.1 186 512 186c-192.2 0-335.4 100.5-430.2 300.3a60.3 60.3 0 0 0 0 51.5C176.6 737.5 319.9 838 512 838c192.2 0 335.4-100.5 430.2-300.3 7.7-16.2 7.7-35 0-51.5zM512 766c-161.3 0-279.4-81.8-362.7-254C232.6 339.8 350.7 258 512 258c161.3 0 279.4 81.8 362.7 254C791.5 684.2 673.4 766 512 766zm-4-430c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm0 288c-61.9 0-112-50.1-112-112s50.1-112 112-112 112 50.1 112 112-50.1 112-112 112z")),t.FacebookOutline=o("facebook",s,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-32 736H663.9V602.2h104l15.6-120.7H663.9v-77.1c0-35 9.7-58.8 59.8-58.8h63.9v-108c-11.1-1.5-49-4.8-93.2-4.8-92.2 0-155.3 56.3-155.3 159.6v89H434.9v120.7h104.3V848H176V176h672v672z")),t.FastBackwardOutline=o("fast-backward",s,r(i,"M524.6 481.6l436.2-375.4c24.4-22.8 63.1-4.7 63.1 29.5v752.7c0 34.2-38.7 52.3-63.1 29.5L524.6 540.6a40.84 40.84 0 0 1-12.7-29.5c.1-10.9 4.3-21.7 12.7-29.5z","M36 96c19.9 0 36 16.1 36 36v298.5l376.9-324.4c24.4-22.8 63.1-4.7 63.1 29.5v752.7c0 34.2-38.7 52.3-63.1 29.5L72 591.9V892c0 19.9-16.1 36-36 36S0 911.9 0 892V132c0-19.9 16.1-36 36-36z")),t.FastForwardOutline=o("fast-forward",s,r(i,"M499.4 481.6L63.1 106.1C38.7 83.4 0 101.5 0 135.6v752.7c0 34.2 38.7 52.3 63.1 29.5l436.2-377.3c8.4-7.9 12.6-18.7 12.7-29.5 0-10.8-4.2-21.6-12.6-29.4zM988 96c-19.9 0-36 16.1-36 36v298.5L575.1 106.1c-24.4-22.8-63.1-4.7-63.1 29.5v752.7c0 34.2 38.7 52.3 63.1 29.5l376.9-326V892c0 19.9 16.1 36 36 36s36-16.1 36-36V132c0-19.9-16.1-36-36-36z")),t.FileAddOutline=o("file-add",s,r(a,"M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM790.2 326H602V137.8L790.2 326zm1.8 562H232V136h302v216a42 42 0 0 0 42 42h216v494zM544 472c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v108H372c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h108v108c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V644h108c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H544V472z")),t.FileExcelOutline=o("file-excel",s,r(a,"M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM790.2 326H602V137.8L790.2 326zm1.8 562H232V136h302v216a42 42 0 0 0 42 42h216v494zM514.1 580.1l-61.8-102.4c-2.2-3.6-6.1-5.8-10.3-5.8h-38.4c-2.3 0-4.5.6-6.4 1.9-5.6 3.5-7.3 10.9-3.7 16.6l82.3 130.4-83.4 132.8a12.04 12.04 0 0 0 10.2 18.4h34.5c4.2 0 8-2.2 10.2-5.7L510 664.8l62.3 101.4c2.2 3.6 6.1 5.7 10.2 5.7H620c2.3 0 4.5-.7 6.5-1.9 5.6-3.6 7.2-11 3.6-16.6l-84-130.4 85.3-132.5a12.04 12.04 0 0 0-10.1-18.5h-35.7c-4.2 0-8.1 2.2-10.3 5.8l-61.2 102.3z")),t.FileExclamationOutline=o("file-exclamation",s,r(a,"M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM790.2 326H602V137.8L790.2 326zm1.8 562H232V136h302v216a42 42 0 0 0 42 42h216v494zM472 744a40 40 0 1 0 80 0 40 40 0 1 0-80 0zm16-104h48c4.4 0 8-3.6 8-8V448c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v184c0 4.4 3.6 8 8 8z")),t.FileImageOutline=o("file-image",s,r(a,"M553.1 509.1l-77.8 99.2-41.1-52.4a8 8 0 0 0-12.6 0l-99.8 127.2a7.98 7.98 0 0 0 6.3 12.9H696c6.7 0 10.4-7.7 6.3-12.9l-136.5-174a8.1 8.1 0 0 0-12.7 0zM360 442a40 40 0 1 0 80 0 40 40 0 1 0-80 0zm494.6-153.4L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM790.2 326H602V137.8L790.2 326zm1.8 562H232V136h302v216a42 42 0 0 0 42 42h216v494z")),t.FileMarkdownOutline=o("file-markdown",s,r(a,"M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM790.2 326H602V137.8L790.2 326zm1.8 562H232V136h302v216a42 42 0 0 0 42 42h216v494zM429 481.2c-1.9-4.4-6.2-7.2-11-7.2h-35c-6.6 0-12 5.4-12 12v272c0 6.6 5.4 12 12 12h27.1c6.6 0 12-5.4 12-12V582.1l66.8 150.2a12 12 0 0 0 11 7.1H524c4.7 0 9-2.8 11-7.1l66.8-150.6V758c0 6.6 5.4 12 12 12H641c6.6 0 12-5.4 12-12V486c0-6.6-5.4-12-12-12h-34.7c-4.8 0-9.1 2.8-11 7.2l-83.1 191-83.2-191z")),t.FilePdfOutline=o("file-pdf",s,r(a,"M531.3 574.4l.3-1.4c5.8-23.9 13.1-53.7 7.4-80.7-3.8-21.3-19.5-29.6-32.9-30.2-15.8-.7-29.9 8.3-33.4 21.4-6.6 24-.7 56.8 10.1 98.6-13.6 32.4-35.3 79.5-51.2 107.5-29.6 15.3-69.3 38.9-75.2 68.7-1.2 5.5.2 12.5 3.5 18.8 3.7 7 9.6 12.4 16.5 15 3 1.1 6.6 2 10.8 2 17.6 0 46.1-14.2 84.1-79.4 5.8-1.9 11.8-3.9 17.6-5.9 27.2-9.2 55.4-18.8 80.9-23.1 28.2 15.1 60.3 24.8 82.1 24.8 21.6 0 30.1-12.8 33.3-20.5 5.6-13.5 2.9-30.5-6.2-39.6-13.2-13-45.3-16.4-95.3-10.2-24.6-15-40.7-35.4-52.4-65.8zM421.6 726.3c-13.9 20.2-24.4 30.3-30.1 34.7 6.7-12.3 19.8-25.3 30.1-34.7zm87.6-235.5c5.2 8.9 4.5 35.8.5 49.4-4.9-19.9-5.6-48.1-2.7-51.4.8.1 1.5.7 2.2 2zm-1.6 120.5c10.7 18.5 24.2 34.4 39.1 46.2-21.6 4.9-41.3 13-58.9 20.2-4.2 1.7-8.3 3.4-12.3 5 13.3-24.1 24.4-51.4 32.1-71.4zm155.6 65.5c.1.2.2.5-.4.9h-.2l-.2.3c-.8.5-9 5.3-44.3-8.6 40.6-1.9 45 7.3 45.1 7.4zm191.4-388.2L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM790.2 326H602V137.8L790.2 326zm1.8 562H232V136h302v216a42 42 0 0 0 42 42h216v494z")),t.FilePptOutline=o("file-ppt",s,r(a,"M424 476c-4.4 0-8 3.6-8 8v276c0 4.4 3.6 8 8 8h32.5c4.4 0 8-3.6 8-8v-95.5h63.3c59.4 0 96.2-38.9 96.2-94.1 0-54.5-36.3-94.3-96-94.3H424zm150.6 94.3c0 43.4-26.5 54.3-71.2 54.3h-38.9V516.2h56.2c33.8 0 53.9 19.7 53.9 54.1zm280-281.7L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM790.2 326H602V137.8L790.2 326zm1.8 562H232V136h302v216a42 42 0 0 0 42 42h216v494z")),t.FileTextOutline=o("file-text",s,r(a,"M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM790.2 326H602V137.8L790.2 326zm1.8 562H232V136h302v216a42 42 0 0 0 42 42h216v494zM504 618H320c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zM312 490v48c0 4.4 3.6 8 8 8h384c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H320c-4.4 0-8 3.6-8 8z")),t.FileUnknownOutline=o("file-unknown",s,r(a,"M854.6 288.7L639.4 73.4c-6-6-14.2-9.4-22.7-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.6-9.4-22.6zM790.2 326H602V137.8L790.2 326zm1.8 562H232V136h302v216a42 42 0 0 0 42 42h216v494zM402 549c0 5.4 4.4 9.5 9.8 9.5h32.4c5.4 0 9.8-4.2 9.8-9.4 0-28.2 25.8-51.6 58-51.6s58 23.4 58 51.5c0 25.3-21 47.2-49.3 50.9-19.3 2.8-34.5 20.3-34.7 40.1v32c0 5.5 4.5 10 10 10h32c5.5 0 10-4.5 10-10v-12.2c0-6 4-11.5 9.7-13.3 44.6-14.4 75-54 74.3-98.9-.8-55.5-49.2-100.8-108.5-101.6-61.4-.7-111.5 45.6-111.5 103zm78 195a32 32 0 1 0 64 0 32 32 0 1 0-64 0z")),t.FileWordOutline=o("file-word",s,r(a,"M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM790.2 326H602V137.8L790.2 326zm1.8 562H232V136h302v216a42 42 0 0 0 42 42h216v494zM528.1 472h-32.2c-5.5 0-10.3 3.7-11.6 9.1L434.6 680l-46.1-198.7c-1.3-5.4-6.1-9.3-11.7-9.3h-35.4a12.02 12.02 0 0 0-11.6 15.1l74.2 276c1.4 5.2 6.2 8.9 11.6 8.9h32c5.4 0 10.2-3.6 11.6-8.9l52.8-197 52.8 197c1.4 5.2 6.2 8.9 11.6 8.9h31.8c5.4 0 10.2-3.6 11.6-8.9l74.4-276a12.04 12.04 0 0 0-11.6-15.1H647c-5.6 0-10.4 3.9-11.7 9.3l-45.8 199.1-49.8-199.3c-1.3-5.4-6.1-9.1-11.6-9.1z")),t.FileZipOutline=o("file-zip",s,r(a,"M296 392h64v64h-64zm0 190v160h128V582h-64v-62h-64v62zm80 48v64h-32v-64h32zm-16-302h64v64h-64zm-64-64h64v64h-64zm64 192h64v64h-64zm0-256h64v64h-64zm494.6 88.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM790.2 326H602V137.8L790.2 326zm1.8 562H232V136h64v64h64v-64h174v216a42 42 0 0 0 42 42h216v494z")),t.FileOutline=o("file",s,r(a,"M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM790.2 326H602V137.8L790.2 326zm1.8 562H232V136h302v216a42 42 0 0 0 42 42h216v494z")),t.FilterOutline=o("filter",s,r(a,"M880.1 154H143.9c-24.5 0-39.8 26.7-27.5 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48zM603.4 798H420.6V642h182.9v156zm9.6-236.6l-9.5 16.6h-183l-9.5-16.6L212.7 226h598.6L613 561.4z")),t.FireOutline=o("fire",s,r(a,"M834.1 469.2A347.49 347.49 0 0 0 751.2 354l-29.1-26.7a8.09 8.09 0 0 0-13 3.3l-13 37.3c-8.1 23.4-23 47.3-44.1 70.8-1.4 1.5-3 1.9-4.1 2-1.1.1-2.8-.1-4.3-1.5-1.4-1.2-2.1-3-2-4.8 3.7-60.2-14.3-128.1-53.7-202C555.3 171 510 123.1 453.4 89.7l-41.3-24.3c-5.4-3.2-12.3 1-12 7.3l2.2 48c1.5 32.8-2.3 61.8-11.3 85.9-11 29.5-26.8 56.9-47 81.5a295.64 295.64 0 0 1-47.5 46.1 352.6 352.6 0 0 0-100.3 121.5A347.75 347.75 0 0 0 160 610c0 47.2 9.3 92.9 27.7 136a349.4 349.4 0 0 0 75.5 110.9c32.4 32 70 57.2 111.9 74.7C418.5 949.8 464.5 959 512 959s93.5-9.2 136.9-27.3A348.6 348.6 0 0 0 760.8 857c32.4-32 57.8-69.4 75.5-110.9a344.2 344.2 0 0 0 27.7-136c0-48.8-10-96.2-29.9-140.9zM713 808.5c-53.7 53.2-125 82.4-201 82.4s-147.3-29.2-201-82.4c-53.5-53.1-83-123.5-83-198.4 0-43.5 9.8-85.2 29.1-124 18.8-37.9 46.8-71.8 80.8-97.9a349.6 349.6 0 0 0 58.6-56.8c25-30.5 44.6-64.5 58.2-101a240 240 0 0 0 12.1-46.5c24.1 22.2 44.3 49 61.2 80.4 33.4 62.6 48.8 118.3 45.8 165.7a74.01 74.01 0 0 0 24.4 59.8 73.36 73.36 0 0 0 53.4 18.8c19.7-1 37.8-9.7 51-24.4 13.3-14.9 24.8-30.1 34.4-45.6 14 17.9 25.7 37.4 35 58.4 15.9 35.8 24 73.9 24 113.1 0 74.9-29.5 145.4-83 198.4z")),t.FlagOutline=o("flag",s,r(a,"M880 305H624V192c0-17.7-14.3-32-32-32H184v-40c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v784c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V640h248v113c0 17.7 14.3 32 32 32h416c17.7 0 32-14.3 32-32V337c0-17.7-14.3-32-32-32zM184 568V232h368v336H184zm656 145H504v-73h112c4.4 0 8-3.6 8-8V377h216v336z")),t.FolderAddOutline=o("folder-add",s,r(a,"M484 443.1V528h-84.5c-4.1 0-7.5 3.1-7.5 7v42c0 3.8 3.4 7 7.5 7H484v84.9c0 3.9 3.2 7.1 7 7.1h42c3.9 0 7-3.2 7-7.1V584h84.5c4.1 0 7.5-3.2 7.5-7v-42c0-3.9-3.4-7-7.5-7H540v-84.9c0-3.9-3.1-7.1-7-7.1h-42c-3.8 0-7 3.2-7 7.1zm396-144.7H521L403.7 186.2a8.15 8.15 0 0 0-5.5-2.2H144c-17.7 0-32 14.3-32 32v592c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V330.4c0-17.7-14.3-32-32-32zM840 768H184V256h188.5l119.6 114.4H840V768z")),t.FolderOpenOutline=o("folder-open",s,r(a,"M928 444H820V330.4c0-17.7-14.3-32-32-32H473L355.7 186.2a8.15 8.15 0 0 0-5.5-2.2H96c-17.7 0-32 14.3-32 32v592c0 17.7 14.3 32 32 32h698c13 0 24.8-7.9 29.7-20l134-332c1.5-3.8 2.3-7.9 2.3-12 0-17.7-14.3-32-32-32zM136 256h188.5l119.6 114.4H748V444H238c-13 0-24.8 7.9-29.7 20L136 643.2V256zm635.3 512H159l103.3-256h612.4L771.3 768z")),t.FolderOutline=o("folder",s,r(a,"M880 298.4H521L403.7 186.2a8.15 8.15 0 0 0-5.5-2.2H144c-17.7 0-32 14.3-32 32v592c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V330.4c0-17.7-14.3-32-32-32zM840 768H184V256h188.5l119.6 114.4H840V768z")),t.ForwardOutline=o("forward",s,r(i,"M575.1 106.1l436.2 375.4c16.9 15.7 16.9 43.3 0 59L575.1 917.9c-24.4 22.8-63.1 4.7-63.1-29.5V135.6c0-34.1 38.7-52.2 63.1-29.5zM63.1 106.1l436.2 375.4c8.4 7.9 12.6 18.7 12.6 29.5s-4.2 21.6-12.6 29.5L63.1 917.9C38.7 940.6 0 922.5 0 888.4V135.7c0-34.2 38.7-52.3 63.1-29.6z")),t.FrownOutline=o("frown",s,r(a,"M288 421a48 48 0 1 0 96 0 48 48 0 1 0-96 0zm352 0a48 48 0 1 0 96 0 48 48 0 1 0-96 0zM512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm263 711c-34.2 34.2-74 61-118.3 79.8C611 874.2 562.3 884 512 884c-50.3 0-99-9.8-144.8-29.2A370.4 370.4 0 0 1 248.9 775c-34.2-34.2-61-74-79.8-118.3C149.8 611 140 562.3 140 512s9.8-99 29.2-144.8A370.4 370.4 0 0 1 249 248.9c34.2-34.2 74-61 118.3-79.8C413 149.8 461.7 140 512 140c50.3 0 99 9.8 144.8 29.2A370.4 370.4 0 0 1 775.1 249c34.2 34.2 61 74 79.8 118.3C874.2 413 884 461.7 884 512s-9.8 99-29.2 144.8A368.89 368.89 0 0 1 775 775zM512 533c-85.5 0-155.6 67.3-160 151.6a8 8 0 0 0 8 8.4h48.1c4.2 0 7.8-3.2 8.1-7.4C420 636.1 461.5 597 512 597s92.1 39.1 95.8 88.6c.3 4.2 3.9 7.4 8.1 7.4H664a8 8 0 0 0 8-8.4C667.6 600.3 597.5 533 512 533z")),t.FundOutline=o("fund",s,r(a,"M926 164H94c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V196c0-17.7-14.3-32-32-32zm-40 632H134V236h752v560zm-658.9-82.3c3.1 3.1 8.2 3.1 11.3 0l172.5-172.5 114.4 114.5c3.1 3.1 8.2 3.1 11.3 0l297-297.2c3.1-3.1 3.1-8.2 0-11.3l-36.8-36.8a8.03 8.03 0 0 0-11.3 0L531 565 416.6 450.5a8.03 8.03 0 0 0-11.3 0l-214.9 215a8.03 8.03 0 0 0 0 11.3l36.7 36.9z")),t.GiftOutline=o("gift",s,r(a,"M880 310H732.4c13.6-21.4 21.6-46.8 21.6-74 0-76.1-61.9-138-138-138-41.4 0-78.7 18.4-104 47.4-25.3-29-62.6-47.4-104-47.4-76.1 0-138 61.9-138 138 0 27.2 7.9 52.6 21.6 74H144c-17.7 0-32 14.3-32 32v200c0 4.4 3.6 8 8 8h40v344c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V550h40c4.4 0 8-3.6 8-8V342c0-17.7-14.3-32-32-32zm-334-74c0-38.6 31.4-70 70-70s70 31.4 70 70-31.4 70-70 70h-70v-70zm-138-70c38.6 0 70 31.4 70 70v70h-70c-38.6 0-70-31.4-70-70s31.4-70 70-70zM180 482V378h298v104H180zm48 68h250v308H228V550zm568 308H546V550h250v308zm48-376H546V378h298v104z")),t.FunnelPlotOutline=o("funnel-plot",s,r(a,"M880.1 154H143.9c-24.5 0-39.8 26.7-27.5 48L349 607.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V607.4L907.7 202c12.2-21.3-3.1-48-27.6-48zM603.4 798H420.6V650h182.9v148zm9.6-226.6l-8.4 14.6H419.3l-8.4-14.6L334.4 438h355.2L613 571.4zM726.3 374H297.7l-85-148h598.6l-85 148z")),t.GithubOutline=o("github",s,r(a,"M511.6 76.3C264.3 76.2 64 276.4 64 523.5 64 718.9 189.3 885 363.8 946c23.5 5.9 19.9-10.8 19.9-22.2v-77.5c-135.7 15.9-141.2-73.9-150.3-88.9C215 726 171.5 718 184.5 703c30.9-15.9 62.4 4 98.9 57.9 26.4 39.1 77.9 32.5 104 26 5.7-23.5 17.9-44.5 34.7-60.8-140.6-25.2-199.2-111-199.2-213 0-49.5 16.3-95 48.3-131.7-20.4-60.5 1.9-112.3 4.9-120 58.1-5.2 118.5 41.6 123.2 45.3 33-8.9 70.7-13.6 112.9-13.6 42.4 0 80.2 4.9 113.5 13.9 11.3-8.6 67.3-48.8 121.3-43.9 2.9 7.7 24.7 58.3 5.5 118 32.4 36.8 48.9 82.7 48.9 132.3 0 102.2-59 188.1-200 212.9a127.5 127.5 0 0 1 38.1 91v112.5c.8 9 0 17.9 15 17.9 177.1-59.7 304.6-227 304.6-424.1 0-247.2-200.4-447.3-447.5-447.3z")),t.GitlabOutline=o("gitlab",s,r(a,"M913.9 552.2L805 181.4v-.1c-7.6-22.9-25.7-36.5-48.3-36.5-23.4 0-42.5 13.5-49.7 35.2l-71.4 213H388.8l-71.4-213c-7.2-21.7-26.3-35.2-49.7-35.2-23.1 0-42.5 14.8-48.4 36.6L110.5 552.2c-4.4 14.7 1.2 31.4 13.5 40.7l368.5 276.4c2.6 3.6 6.2 6.3 10.4 7.8l8.6 6.4 8.5-6.4c4.9-1.7 9-4.7 11.9-8.9l368.4-275.4c12.4-9.2 18-25.9 13.6-40.6zM751.7 193.4c1-1.8 2.9-1.9 3.5-1.9 1.1 0 2.5.3 3.4 3L818 394.3H684.5l67.2-200.9zm-487.4 1c.9-2.6 2.3-2.9 3.4-2.9 2.7 0 2.9.1 3.4 1.7l67.3 201.2H206.5l57.8-200zM158.8 558.7l28.2-97.3 202.4 270.2-230.6-172.9zm73.9-116.4h122.1l90.8 284.3-212.9-284.3zM512.9 776L405.7 442.3H620L512.9 776zm157.9-333.7h119.5L580 723.1l90.8-280.8zm-40.7 293.9l207.3-276.7 29.5 99.2-236.8 177.5z")),t.HddOutline=o("hdd",s,r(a,"M832 64H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V96c0-17.7-14.3-32-32-32zm-600 72h560v208H232V136zm560 480H232V408h560v208zm0 272H232V680h560v208zM496 208H312c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zM312 544h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H312c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8zm328 244a40 40 0 1 0 80 0 40 40 0 1 0-80 0z")),t.HeartOutline=o("heart",s,r(a,"M923 283.6a260.04 260.04 0 0 0-56.9-82.8 264.4 264.4 0 0 0-84-55.5A265.34 265.34 0 0 0 679.7 125c-49.3 0-97.4 13.5-139.2 39-10 6.1-19.5 12.8-28.5 20.1-9-7.3-18.5-14-28.5-20.1-41.8-25.5-89.9-39-139.2-39-35.5 0-69.9 6.8-102.4 20.3-31.4 13-59.7 31.7-84 55.5a258.44 258.44 0 0 0-56.9 82.8c-13.9 32.3-21 66.6-21 101.9 0 33.3 6.8 68 20.3 103.3 11.3 29.5 27.5 60.1 48.2 91 32.8 48.9 77.9 99.9 133.9 151.6 92.8 85.7 184.7 144.9 188.6 147.3l23.7 15.2c10.5 6.7 24 6.7 34.5 0l23.7-15.2c3.9-2.5 95.7-61.6 188.6-147.3 56-51.7 101.1-102.7 133.9-151.6 20.7-30.9 37-61.5 48.2-91 13.5-35.3 20.3-70 20.3-103.3.1-35.3-7-69.6-20.9-101.9zM512 814.8S156 586.7 156 385.5C156 283.6 240.3 201 344.3 201c73.1 0 136.5 40.8 167.7 100.4C543.2 241.8 606.6 201 679.7 201c104 0 188.3 82.6 188.3 184.5 0 201.2-356 429.3-356 429.3z")),t.HomeOutline=o("home",s,r(a,"M946.5 505L560.1 118.8l-25.9-25.9a31.5 31.5 0 0 0-44.4 0L77.5 505a63.9 63.9 0 0 0-18.8 46c.4 35.2 29.7 63.3 64.9 63.3h42.5V940h691.8V614.3h43.4c17.1 0 33.2-6.7 45.3-18.8a63.6 63.6 0 0 0 18.7-45.3c0-17-6.7-33.1-18.8-45.2zM568 868H456V664h112v204zm217.9-325.7V868H632V640c0-22.1-17.9-40-40-40H432c-22.1 0-40 17.9-40 40v228H238.1V542.3h-96l370-369.7 23.1 23.1L882 542.3h-96.1z")),t.HourglassOutline=o("hourglass",s,r(a,"M742 318V184h86c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H196c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h86v134c0 81.5 42.4 153.2 106.4 194-64 40.8-106.4 112.5-106.4 194v134h-86c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h632c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-86V706c0-81.5-42.4-153.2-106.4-194 64-40.8 106.4-112.5 106.4-194zm-72 388v134H354V706c0-42.2 16.4-81.9 46.3-111.7C430.1 564.4 469.8 548 512 548s81.9 16.4 111.7 46.3C653.6 624.1 670 663.8 670 706zm0-388c0 42.2-16.4 81.9-46.3 111.7C593.9 459.6 554.2 476 512 476s-81.9-16.4-111.7-46.3A156.63 156.63 0 0 1 354 318V184h316v134z")),t.Html5Outline=o("html5",s,r(a,"M145 96l66 746.6L511.8 928l299.6-85.4L878.7 96H145zm610.9 700.6l-244.1 69.6-245.2-69.6-56.7-641.2h603.8l-57.8 641.2zM281 249l1.7 24.3 22.7 253.5h206.5v-.1h112.9l-11.4 118.5L511 672.9v.2h-.8l-102.4-27.7-6.5-73.2h-91l11.3 144.7 188.6 52h1.7v-.4l187.7-51.7 1.7-16.3 21.2-242.2 3.2-24.3H511v.2H389.9l-8.2-94.2h352.1l1.7-19.5 4.8-47.2L742 249H511z")),t.IdcardOutline=o("idcard",s,r(a,"M928 160H96c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V192c0-17.7-14.3-32-32-32zm-40 632H136V232h752v560zM610.3 476h123.4c1.3 0 2.3-3.6 2.3-8v-48c0-4.4-1-8-2.3-8H610.3c-1.3 0-2.3 3.6-2.3 8v48c0 4.4 1 8 2.3 8zm4.8 144h185.7c3.9 0 7.1-3.6 7.1-8v-48c0-4.4-3.2-8-7.1-8H615.1c-3.9 0-7.1 3.6-7.1 8v48c0 4.4 3.2 8 7.1 8zM224 673h43.9c4.2 0 7.6-3.3 7.9-7.5 3.8-50.5 46-90.5 97.2-90.5s93.4 40 97.2 90.5c.3 4.2 3.7 7.5 7.9 7.5H522a8 8 0 0 0 8-8.4c-2.8-53.3-32-99.7-74.6-126.1a111.8 111.8 0 0 0 29.1-75.5c0-61.9-49.9-112-111.4-112s-111.4 50.1-111.4 112c0 29.1 11 55.5 29.1 75.5a158.09 158.09 0 0 0-74.6 126.1c-.4 4.6 3.2 8.4 7.8 8.4zm149-262c28.5 0 51.7 23.3 51.7 52s-23.2 52-51.7 52-51.7-23.3-51.7-52 23.2-52 51.7-52z")),t.InfoCircleOutline=o("info-circle",s,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z","M464 336a48 48 0 1 0 96 0 48 48 0 1 0-96 0zM536 448h-48c-4.4 0-8 3.6-8 8v272c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V456c0-4.4-3.6-8-8-8z")),t.InstagramOutline=o("instagram",s,r(a,"M512 306.9c-113.5 0-205.1 91.6-205.1 205.1S398.5 717.1 512 717.1 717.1 625.5 717.1 512 625.5 306.9 512 306.9zm0 338.4c-73.4 0-133.3-59.9-133.3-133.3S438.6 378.7 512 378.7 645.3 438.6 645.3 512 585.4 645.3 512 645.3zm213.5-394.6c-26.5 0-47.9 21.4-47.9 47.9s21.4 47.9 47.9 47.9 47.9-21.3 47.9-47.9a47.84 47.84 0 0 0-47.9-47.9zM911.8 512c0-55.2.5-109.9-2.6-165-3.1-64-17.7-120.8-64.5-167.6-46.9-46.9-103.6-61.4-167.6-64.5-55.2-3.1-109.9-2.6-165-2.6-55.2 0-109.9-.5-165 2.6-64 3.1-120.8 17.7-167.6 64.5C132.6 226.3 118.1 283 115 347c-3.1 55.2-2.6 109.9-2.6 165s-.5 109.9 2.6 165c3.1 64 17.7 120.8 64.5 167.6 46.9 46.9 103.6 61.4 167.6 64.5 55.2 3.1 109.9 2.6 165 2.6 55.2 0 109.9.5 165-2.6 64-3.1 120.8-17.7 167.6-64.5 46.9-46.9 61.4-103.6 64.5-167.6 3.2-55.1 2.6-109.8 2.6-165zm-88 235.8c-7.3 18.2-16.1 31.8-30.2 45.8-14.1 14.1-27.6 22.9-45.8 30.2C695.2 844.7 570.3 840 512 840c-58.3 0-183.3 4.7-235.9-16.1-18.2-7.3-31.8-16.1-45.8-30.2-14.1-14.1-22.9-27.6-30.2-45.8C179.3 695.2 184 570.3 184 512c0-58.3-4.7-183.3 16.1-235.9 7.3-18.2 16.1-31.8 30.2-45.8s27.6-22.9 45.8-30.2C328.7 179.3 453.7 184 512 184s183.3-4.7 235.9 16.1c18.2 7.3 31.8 16.1 45.8 30.2 14.1 14.1 22.9 27.6 30.2 45.8C844.7 328.7 840 453.7 840 512c0 58.3 4.7 183.2-16.2 235.8z")),t.InsuranceOutline=o("insurance",s,r(a,"M441.6 306.8L403 288.6a6.1 6.1 0 0 0-8.4 3.7c-17.5 58.5-45.2 110.1-82.2 153.6a6.05 6.05 0 0 0-1.2 5.6l13.2 43.5c1.3 4.4 7 5.7 10.2 2.4 7.7-8.1 15.4-16.9 23.1-26V656c0 4.4 3.6 8 8 8H403c4.4 0 8-3.6 8-8V393.1a429.2 429.2 0 0 0 33.6-79c1-2.9-.3-6-3-7.3zm26.8 9.2v127.2c0 4.4 3.6 8 8 8h65.9v18.6h-94.9c-4.4 0-8 3.6-8 8v35.6c0 4.4 3.6 8 8 8h55.1c-19.1 30.8-42.4 55.7-71 76a6 6 0 0 0-1.6 8.1l22.8 36.5c1.9 3.1 6.2 3.8 8.9 1.4 31.6-26.8 58.7-62.9 80.6-107.6v120c0 4.4 3.6 8 8 8h36.2c4.4 0 8-3.6 8-8V536c21.3 41.7 47.5 77.5 78.1 106.9 2.6 2.5 6.8 2.1 8.9-.7l26.3-35.3c2-2.7 1.4-6.5-1.2-8.4-30.5-22.6-54.2-47.8-72.3-76.9h59c4.4 0 8-3.6 8-8V478c0-4.4-3.6-8-8-8h-98.8v-18.6h66.7c4.4 0 8-3.6 8-8V316c0-4.4-3.6-8-8-8H476.4c-4.4 0-8 3.6-8 8zm51.5 42.8h97.9v41.6h-97.9v-41.6zm347-188.9L527.1 54.1C523 52.7 517.5 52 512 52s-11 .7-15.1 2.1L157.1 169.9c-8.3 2.8-15.1 12.4-15.1 21.2v482.4c0 8.8 5.7 20.4 12.6 25.9L499.3 968c3.5 2.7 8 4.1 12.6 4.1s9.2-1.4 12.6-4.1l344.7-268.6c6.9-5.4 12.6-17 12.6-25.9V191.1c.2-8.8-6.6-18.3-14.9-21.2zM810 654.3L512 886.5 214 654.3V226.7l298-101.6 298 101.6v427.6z")),t.InterationOutline=o("interation",s,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656zM304.8 524h50.7c3.7 0 6.8-3 6.8-6.8v-78.9c0-19.7 15.9-35.6 35.5-35.6h205.7v53.4c0 5.7 6.5 8.8 10.9 5.3l109.1-85.7c3.5-2.7 3.5-8 0-10.7l-109.1-85.7c-4.4-3.5-10.9-.3-10.9 5.3V338H397.7c-55.1 0-99.7 44.8-99.7 100.1V517c0 4 3 7 6.8 7zm-4.2 134.9l109.1 85.7c4.4 3.5 10.9.3 10.9-5.3v-53.4h205.7c55.1 0 99.7-44.8 99.7-100.1v-78.9c0-3.7-3-6.8-6.8-6.8h-50.7c-3.7 0-6.8 3-6.8 6.8v78.9c0 19.7-15.9 35.6-35.5 35.6H420.6V568c0-5.7-6.5-8.8-10.9-5.3l-109.1 85.7c-3.5 2.5-3.5 7.8 0 10.5z")),t.LayoutOutline=o("layout",s,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-696 72h136v656H184V184zm656 656H384V384h456v456zM384 320V184h456v136H384z")),t.LeftCircleOutline=o("left-circle",s,r(a,"M603.3 327.5l-246 178a7.95 7.95 0 0 0 0 12.9l246 178c5.3 3.8 12.7 0 12.7-6.5V643c0-10.2-4.9-19.9-13.2-25.9L457.4 512l145.4-105.2c8.3-6 13.2-15.6 13.2-25.9V334c0-6.5-7.4-10.3-12.7-6.5z","M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z")),t.HighlightOutline=o("highlight",s,r(a,"M957.6 507.4L603.2 158.2a7.9 7.9 0 0 0-11.2 0L353.3 393.4a8.03 8.03 0 0 0-.1 11.3l.1.1 40 39.4-117.2 115.3a8.03 8.03 0 0 0-.1 11.3l.1.1 39.5 38.9-189.1 187H72.1c-4.4 0-8.1 3.6-8.1 8V860c0 4.4 3.6 8 8 8h344.9c2.1 0 4.1-.8 5.6-2.3l76.1-75.6 40.4 39.8a7.9 7.9 0 0 0 11.2 0l117.1-115.6 40.1 39.5a7.9 7.9 0 0 0 11.2 0l238.7-235.2c3.4-3 3.4-8 .3-11.2zM389.8 796.2H229.6l134.4-133 80.1 78.9-54.3 54.1zm154.8-62.1L373.2 565.2l68.6-67.6 171.4 168.9-68.6 67.6zM713.1 658L450.3 399.1 597.6 254l262.8 259-147.3 145z")),t.LeftSquareOutline=o("left-square",s,r(a,"M365.3 518.5l246 178c5.3 3.8 12.7 0 12.7-6.5v-46.9c0-10.2-4.9-19.9-13.2-25.9L465.4 512l145.4-105.2c8.3-6 13.2-15.6 13.2-25.9V334c0-6.5-7.4-10.3-12.7-6.5l-246 178a8.05 8.05 0 0 0 0 13z","M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z")),t.LikeOutline=o("like",s,r(a,"M885.9 533.7c16.8-22.2 26.1-49.4 26.1-77.7 0-44.9-25.1-87.4-65.5-111.1a67.67 67.67 0 0 0-34.3-9.3H572.4l6-122.9c1.4-29.7-9.1-57.9-29.5-79.4A106.62 106.62 0 0 0 471 99.9c-52 0-98 35-111.8 85.1l-85.9 311H144c-17.7 0-32 14.3-32 32v364c0 17.7 14.3 32 32 32h601.3c9.2 0 18.2-1.8 26.5-5.4 47.6-20.3 78.3-66.8 78.3-118.4 0-12.6-1.8-25-5.4-37 16.8-22.2 26.1-49.4 26.1-77.7 0-12.6-1.8-25-5.4-37 16.8-22.2 26.1-49.4 26.1-77.7-.2-12.6-2-25.1-5.6-37.1zM184 852V568h81v284h-81zm636.4-353l-21.9 19 13.9 25.4a56.2 56.2 0 0 1 6.9 27.3c0 16.5-7.2 32.2-19.6 43l-21.9 19 13.9 25.4a56.2 56.2 0 0 1 6.9 27.3c0 16.5-7.2 32.2-19.6 43l-21.9 19 13.9 25.4a56.2 56.2 0 0 1 6.9 27.3c0 22.4-13.2 42.6-33.6 51.8H329V564.8l99.5-360.5a44.1 44.1 0 0 1 42.2-32.3c7.6 0 15.1 2.2 21.1 6.7 9.9 7.4 15.2 18.6 14.6 30.5l-9.6 198.4h314.4C829 418.5 840 436.9 840 456c0 16.5-7.2 32.1-19.6 43z")),t.LinkedinOutline=o("linkedin",s,r(a,"M847.7 112H176.3c-35.5 0-64.3 28.8-64.3 64.3v671.4c0 35.5 28.8 64.3 64.3 64.3h671.4c35.5 0 64.3-28.8 64.3-64.3V176.3c0-35.5-28.8-64.3-64.3-64.3zm0 736c-447.8-.1-671.7-.2-671.7-.3.1-447.8.2-671.7.3-671.7 447.8.1 671.7.2 671.7.3-.1 447.8-.2 671.7-.3 671.7zM230.6 411.9h118.7v381.8H230.6zm59.4-52.2c37.9 0 68.8-30.8 68.8-68.8a68.8 68.8 0 1 0-137.6 0c-.1 38 30.7 68.8 68.8 68.8zm252.3 245.1c0-49.8 9.5-98 71.2-98 60.8 0 61.7 56.9 61.7 101.2v185.7h118.6V584.3c0-102.8-22.2-181.9-142.3-181.9-57.7 0-96.4 31.7-112.3 61.7h-1.6v-52.2H423.7v381.8h118.6V604.8z")),t.MailOutline=o("mail",s,r(a,"M928 160H96c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V192c0-17.7-14.3-32-32-32zm-40 110.8V792H136V270.8l-27.6-21.5 39.3-50.5 42.8 33.3h643.1l42.8-33.3 39.3 50.5-27.7 21.5zM833.6 232L512 482 190.4 232l-42.8-33.3-39.3 50.5 27.6 21.5 341.6 265.6a55.99 55.99 0 0 0 68.7 0L888 270.8l27.6-21.5-39.3-50.5-42.7 33.2z")),t.MedicineBoxOutline=o("medicine-box",s,r(a,"M839.2 278.1a32 32 0 0 0-30.4-22.1H736V144c0-17.7-14.3-32-32-32H320c-17.7 0-32 14.3-32 32v112h-72.8a31.9 31.9 0 0 0-30.4 22.1L112 502v378c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V502l-72.8-223.9zM360 184h304v72H360v-72zm480 656H184V513.4L244.3 328h535.4L840 513.4V840zM652 572H544V464c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v108H372c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h108v108c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V636h108c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8z")),t.MehOutline=o("meh",s,r(a,"M288 421a48 48 0 1 0 96 0 48 48 0 1 0-96 0zm352 0a48 48 0 1 0 96 0 48 48 0 1 0-96 0zM512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm263 711c-34.2 34.2-74 61-118.3 79.8C611 874.2 562.3 884 512 884c-50.3 0-99-9.8-144.8-29.2A370.4 370.4 0 0 1 248.9 775c-34.2-34.2-61-74-79.8-118.3C149.8 611 140 562.3 140 512s9.8-99 29.2-144.8A370.4 370.4 0 0 1 249 248.9c34.2-34.2 74-61 118.3-79.8C413 149.8 461.7 140 512 140c50.3 0 99 9.8 144.8 29.2A370.4 370.4 0 0 1 775.1 249c34.2 34.2 61 74 79.8 118.3C874.2 413 884 461.7 884 512s-9.8 99-29.2 144.8A368.89 368.89 0 0 1 775 775zM664 565H360c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h304c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8z")),t.MessageOutline=o("message",s,r(a,"M464 512a48 48 0 1 0 96 0 48 48 0 1 0-96 0zm200 0a48 48 0 1 0 96 0 48 48 0 1 0-96 0zm-400 0a48 48 0 1 0 96 0 48 48 0 1 0-96 0zm661.2-173.6c-22.6-53.7-55-101.9-96.3-143.3a444.35 444.35 0 0 0-143.3-96.3C630.6 75.7 572.2 64 512 64h-2c-60.6.3-119.3 12.3-174.5 35.9a445.35 445.35 0 0 0-142 96.5c-40.9 41.3-73 89.3-95.2 142.8-23 55.4-34.6 114.3-34.3 174.9A449.4 449.4 0 0 0 112 714v152a46 46 0 0 0 46 46h152.1A449.4 449.4 0 0 0 510 960h2.1c59.9 0 118-11.6 172.7-34.3a444.48 444.48 0 0 0 142.8-95.2c41.3-40.9 73.8-88.7 96.5-142 23.6-55.2 35.6-113.9 35.9-174.5.3-60.9-11.5-120-34.8-175.6zm-151.1 438C704 845.8 611 884 512 884h-1.7c-60.3-.3-120.2-15.3-173.1-43.5l-8.4-4.5H188V695.2l-4.5-8.4C155.3 633.9 140.3 574 140 513.7c-.4-99.7 37.7-193.3 107.6-263.8 69.8-70.5 163.1-109.5 262.8-109.9h1.7c50 0 98.5 9.7 144.2 28.9 44.6 18.7 84.6 45.6 119 80 34.3 34.3 61.3 74.4 80 119 19.4 46.2 29.1 95.2 28.9 145.8-.6 99.6-39.7 192.9-110.1 262.7z")),t.LockOutline=o("lock",s,r(a,"M832 464h-68V240c0-70.7-57.3-128-128-128H388c-70.7 0-128 57.3-128 128v224h-68c-17.7 0-32 14.3-32 32v384c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V496c0-17.7-14.3-32-32-32zM332 240c0-30.9 25.1-56 56-56h248c30.9 0 56 25.1 56 56v224H332V240zm460 600H232V536h560v304zM484 701v53c0 4.4 3.6 8 8 8h40c4.4 0 8-3.6 8-8v-53a48.01 48.01 0 1 0-56 0z")),t.MinusCircleOutline=o("minus-circle",s,r(a,"M696 480H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h368c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8z","M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z")),t.MinusSquareOutline=o("minus-square",s,r(a,"M328 544h368c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8z","M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z")),t.MobileOutline=o("mobile",s,r(a,"M744 62H280c-35.3 0-64 28.7-64 64v768c0 35.3 28.7 64 64 64h464c35.3 0 64-28.7 64-64V126c0-35.3-28.7-64-64-64zm-8 824H288V134h448v752zM472 784a40 40 0 1 0 80 0 40 40 0 1 0-80 0z")),t.MoneyCollectOutline=o("money-collect",s,r(a,"M911.5 700.7a8 8 0 0 0-10.3-4.8L840 718.2V180c0-37.6-30.4-68-68-68H252c-37.6 0-68 30.4-68 68v538.2l-61.3-22.3c-.9-.3-1.8-.5-2.7-.5-4.4 0-8 3.6-8 8V763c0 3.3 2.1 6.3 5.3 7.5L501 910.1c7.1 2.6 14.8 2.6 21.9 0l383.8-139.5c3.2-1.2 5.3-4.2 5.3-7.5v-59.6c0-1-.2-1.9-.5-2.8zM512 837.5l-256-93.1V184h512v560.4l-256 93.1zM660.6 312h-54.5c-3 0-5.8 1.7-7.1 4.4l-84.7 168.8H511l-84.7-168.8a8 8 0 0 0-7.1-4.4h-55.7c-1.3 0-2.6.3-3.8 1-3.9 2.1-5.3 7-3.2 10.8l103.9 191.6h-57c-4.4 0-8 3.6-8 8v27.1c0 4.4 3.6 8 8 8h76v39h-76c-4.4 0-8 3.6-8 8v27.1c0 4.4 3.6 8 8 8h76V704c0 4.4 3.6 8 8 8h49.9c4.4 0 8-3.6 8-8v-63.5h76.3c4.4 0 8-3.6 8-8v-27.1c0-4.4-3.6-8-8-8h-76.3v-39h76.3c4.4 0 8-3.6 8-8v-27.1c0-4.4-3.6-8-8-8H564l103.7-191.6c.6-1.2 1-2.5 1-3.8-.1-4.3-3.7-7.9-8.1-7.9z")),t.NotificationOutline=o("notification",s,r(a,"M880 112c-3.8 0-7.7.7-11.6 2.3L292 345.9H128c-8.8 0-16 7.4-16 16.6v299c0 9.2 7.2 16.6 16 16.6h101.7c-3.7 11.6-5.7 23.9-5.7 36.4 0 65.9 53.8 119.5 120 119.5 55.4 0 102.1-37.6 115.9-88.4l408.6 164.2c3.9 1.5 7.8 2.3 11.6 2.3 16.9 0 32-14.2 32-33.2V145.2C912 126.2 897 112 880 112zM344 762.3c-26.5 0-48-21.4-48-47.8 0-11.2 3.9-21.9 11-30.4l84.9 34.1c-2 24.6-22.7 44.1-47.9 44.1zm496 58.4L318.8 611.3l-12.9-5.2H184V417.9h121.9l12.9-5.2L840 203.3v617.4z")),t.PauseCircleOutline=o("pause-circle",s,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372zm-88-532h-48c-4.4 0-8 3.6-8 8v304c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V360c0-4.4-3.6-8-8-8zm224 0h-48c-4.4 0-8 3.6-8 8v304c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V360c0-4.4-3.6-8-8-8z")),t.PayCircleOutline=o("pay-circle",s,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372zm159.6-585h-59.5c-3 0-5.8 1.7-7.1 4.4l-90.6 180H511l-90.6-180a8 8 0 0 0-7.1-4.4h-60.7c-1.3 0-2.6.3-3.8 1-3.9 2.1-5.3 7-3.2 10.9L457 515.7h-61.4c-4.4 0-8 3.6-8 8v29.9c0 4.4 3.6 8 8 8h81.7V603h-81.7c-4.4 0-8 3.6-8 8v29.9c0 4.4 3.6 8 8 8h81.7V717c0 4.4 3.6 8 8 8h54.3c4.4 0 8-3.6 8-8v-68.1h82c4.4 0 8-3.6 8-8V611c0-4.4-3.6-8-8-8h-82v-41.5h82c4.4 0 8-3.6 8-8v-29.9c0-4.4-3.6-8-8-8h-62l111.1-204.8c.6-1.2 1-2.5 1-3.8-.1-4.4-3.7-8-8.1-8z")),t.PhoneOutline=o("phone",s,r(a,"M877.1 238.7L770.6 132.3c-13-13-30.4-20.3-48.8-20.3s-35.8 7.2-48.8 20.3L558.3 246.8c-13 13-20.3 30.5-20.3 48.9 0 18.5 7.2 35.8 20.3 48.9l89.6 89.7a405.46 405.46 0 0 1-86.4 127.3c-36.7 36.9-79.6 66-127.2 86.6l-89.6-89.7c-13-13-30.4-20.3-48.8-20.3a68.2 68.2 0 0 0-48.8 20.3L132.3 673c-13 13-20.3 30.5-20.3 48.9 0 18.5 7.2 35.8 20.3 48.9l106.4 106.4c22.2 22.2 52.8 34.9 84.2 34.9 6.5 0 12.8-.5 19.2-1.6 132.4-21.8 263.8-92.3 369.9-198.3C818 606 888.4 474.6 910.4 342.1c6.3-37.6-6.3-76.3-33.3-103.4zm-37.6 91.5c-19.5 117.9-82.9 235.5-178.4 331s-213 158.9-330.9 178.4c-14.8 2.5-30-2.5-40.8-13.2L184.9 721.9 295.7 611l119.8 120 .9.9 21.6-8a481.29 481.29 0 0 0 285.7-285.8l8-21.6-120.8-120.7 110.8-110.9 104.5 104.5c10.8 10.8 15.8 26 13.3 40.8z")),t.PictureOutline=o("picture",s,r(a,"M928 160H96c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V192c0-17.7-14.3-32-32-32zm-40 632H136v-39.9l138.5-164.3 150.1 178L658.1 489 888 761.6V792zm0-129.8L664.2 396.8c-3.2-3.8-9-3.8-12.2 0L424.6 666.4l-144-170.7c-3.2-3.8-9-3.8-12.2 0L136 652.7V232h752v430.2zM304 456a88 88 0 1 0 0-176 88 88 0 0 0 0 176zm0-116c15.5 0 28 12.5 28 28s-12.5 28-28 28-28-12.5-28-28 12.5-28 28-28z")),t.PieChartOutline=o("pie-chart",s,r(a,"M864 518H506V160c0-4.4-3.6-8-8-8h-26a398.46 398.46 0 0 0-282.8 117.1 398.19 398.19 0 0 0-85.7 127.1A397.61 397.61 0 0 0 72 552a398.46 398.46 0 0 0 117.1 282.8c36.7 36.7 79.5 65.6 127.1 85.7A397.61 397.61 0 0 0 472 952a398.46 398.46 0 0 0 282.8-117.1c36.7-36.7 65.6-79.5 85.7-127.1A397.61 397.61 0 0 0 872 552v-26c0-4.4-3.6-8-8-8zM705.7 787.8A331.59 331.59 0 0 1 470.4 884c-88.1-.4-170.9-34.9-233.2-97.2C174.5 724.1 140 640.7 140 552c0-88.7 34.5-172.1 97.2-234.8 54.6-54.6 124.9-87.9 200.8-95.5V586h364.3c-7.7 76.3-41.3 147-96.6 201.8zM952 462.4l-2.6-28.2c-8.5-92.1-49.4-179-115.2-244.6A399.4 399.4 0 0 0 589 74.6L560.7 72c-4.7-.4-8.7 3.2-8.7 7.9V464c0 4.4 3.6 8 8 8l384-1c4.7 0 8.4-4 8-8.6zm-332.2-58.2V147.6a332.24 332.24 0 0 1 166.4 89.8c45.7 45.6 77 103.6 90 166.1l-256.4.7z")),t.PlayCircleOutline=o("play-circle",s,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z","M719.4 499.1l-296.1-215A15.9 15.9 0 0 0 398 297v430c0 13.1 14.8 20.5 25.3 12.9l296.1-215a15.9 15.9 0 0 0 0-25.8zm-257.6 134V390.9L628.5 512 461.8 633.1z")),t.PlaySquareOutline=o("play-square",s,r(a,"M442.3 677.6l199.4-156.7a11.3 11.3 0 0 0 0-17.7L442.3 346.4c-7.4-5.8-18.3-.6-18.3 8.8v313.5c0 9.4 10.9 14.7 18.3 8.9z","M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z")),t.PlusCircleOutline=o("plus-circle",s,r(a,"M696 480H544V328c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v152H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h152v152c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V544h152c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8z","M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z")),t.PlusSquareOutline=o("plus-square",s,r(a,"M328 544h152v152c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V544h152c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H544V328c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v152H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8z","M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z")),t.PrinterOutline=o("printer",s,r(a,"M820 436h-40c-4.4 0-8 3.6-8 8v40c0 4.4 3.6 8 8 8h40c4.4 0 8-3.6 8-8v-40c0-4.4-3.6-8-8-8zm32-104H732V120c0-4.4-3.6-8-8-8H300c-4.4 0-8 3.6-8 8v212H172c-44.2 0-80 35.8-80 80v328c0 17.7 14.3 32 32 32h168v132c0 4.4 3.6 8 8 8h424c4.4 0 8-3.6 8-8V772h168c17.7 0 32-14.3 32-32V412c0-44.2-35.8-80-80-80zM360 180h304v152H360V180zm304 664H360V568h304v276zm200-140H732V500H292v204H160V412c0-6.6 5.4-12 12-12h680c6.6 0 12 5.4 12 12v292z")),t.PushpinOutline=o("pushpin",s,r(a,"M878.3 392.1L631.9 145.7c-6.5-6.5-15-9.7-23.5-9.7s-17 3.2-23.5 9.7L423.8 306.9c-12.2-1.4-24.5-2-36.8-2-73.2 0-146.4 24.1-206.5 72.3a33.23 33.23 0 0 0-2.7 49.4l181.7 181.7-215.4 215.2a15.8 15.8 0 0 0-4.6 9.8l-3.4 37.2c-.9 9.4 6.6 17.4 15.9 17.4.5 0 1 0 1.5-.1l37.2-3.4c3.7-.3 7.2-2 9.8-4.6l215.4-215.4 181.7 181.7c6.5 6.5 15 9.7 23.5 9.7 9.7 0 19.3-4.2 25.9-12.4 56.3-70.3 79.7-158.3 70.2-243.4l161.1-161.1c12.9-12.8 12.9-33.8 0-46.8zM666.2 549.3l-24.5 24.5 3.8 34.4a259.92 259.92 0 0 1-30.4 153.9L262 408.8c12.9-7.1 26.3-13.1 40.3-17.9 27.2-9.4 55.7-14.1 84.7-14.1 9.6 0 19.3.5 28.9 1.6l34.4 3.8 24.5-24.5L608.5 224 800 415.5 666.2 549.3z")),t.QuestionCircleOutline=o("question-circle",s,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z","M623.6 316.7C593.6 290.4 554 276 512 276s-81.6 14.5-111.6 40.7C369.2 344 352 380.7 352 420v7.6c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V420c0-44.1 43.1-80 96-80s96 35.9 96 80c0 31.1-22 59.6-56.1 72.7-21.2 8.1-39.2 22.3-52.1 40.9-13.1 19-19.9 41.8-19.9 64.9V620c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-22.7a48.3 48.3 0 0 1 30.9-44.8c59-22.7 97.1-74.7 97.1-132.5.1-39.3-17.1-76-48.3-103.3zM472 732a40 40 0 1 0 80 0 40 40 0 1 0-80 0z")),t.ReadOutline=o("read",s,r(a,"M928 161H699.2c-49.1 0-97.1 14.1-138.4 40.7L512 233l-48.8-31.3A255.2 255.2 0 0 0 324.8 161H96c-17.7 0-32 14.3-32 32v568c0 17.7 14.3 32 32 32h228.8c49.1 0 97.1 14.1 138.4 40.7l44.4 28.6c1.3.8 2.8 1.3 4.3 1.3s3-.4 4.3-1.3l44.4-28.6C602 807.1 650.1 793 699.2 793H928c17.7 0 32-14.3 32-32V193c0-17.7-14.3-32-32-32zM324.8 721H136V233h188.8c35.4 0 69.8 10.1 99.5 29.2l48.8 31.3 6.9 4.5v462c-47.6-25.6-100.8-39-155.2-39zm563.2 0H699.2c-54.4 0-107.6 13.4-155.2 39V298l6.9-4.5 48.8-31.3c29.7-19.1 64.1-29.2 99.5-29.2H888v488zM396.9 361H211.1c-3.9 0-7.1 3.4-7.1 7.5v45c0 4.1 3.2 7.5 7.1 7.5h185.7c3.9 0 7.1-3.4 7.1-7.5v-45c.1-4.1-3.1-7.5-7-7.5zm223.1 7.5v45c0 4.1 3.2 7.5 7.1 7.5h185.7c3.9 0 7.1-3.4 7.1-7.5v-45c0-4.1-3.2-7.5-7.1-7.5H627.1c-3.9 0-7.1 3.4-7.1 7.5zM396.9 501H211.1c-3.9 0-7.1 3.4-7.1 7.5v45c0 4.1 3.2 7.5 7.1 7.5h185.7c3.9 0 7.1-3.4 7.1-7.5v-45c.1-4.1-3.1-7.5-7-7.5zm416 0H627.1c-3.9 0-7.1 3.4-7.1 7.5v45c0 4.1 3.2 7.5 7.1 7.5h185.7c3.9 0 7.1-3.4 7.1-7.5v-45c.1-4.1-3.1-7.5-7-7.5z")),t.PropertySafetyOutline=o("property-safety",s,r(a,"M866.9 169.9L527.1 54.1C523 52.7 517.5 52 512 52s-11 .7-15.1 2.1L157.1 169.9c-8.3 2.8-15.1 12.4-15.1 21.2v482.4c0 8.8 5.7 20.4 12.6 25.9L499.3 968c3.5 2.7 8 4.1 12.6 4.1s9.2-1.4 12.6-4.1l344.7-268.6c6.9-5.4 12.6-17 12.6-25.9V191.1c.2-8.8-6.6-18.3-14.9-21.2zM810 654.3L512 886.5 214 654.3V226.7l298-101.6 298 101.6v427.6zM430.5 318h-46c-1.7 0-3.3.4-4.8 1.2a10.1 10.1 0 0 0-4 13.6l88 161.1h-45.2c-5.5 0-10 4.5-10 10v21.3c0 5.5 4.5 10 10 10h63.1v29.7h-63.1c-5.5 0-10 4.5-10 10v21.3c0 5.5 4.5 10 10 10h63.1V658c0 5.5 4.5 10 10 10h41.3c5.5 0 10-4.5 10-10v-51.8h63.4c5.5 0 10-4.5 10-10v-21.3c0-5.5-4.5-10-10-10h-63.4v-29.7h63.4c5.5 0 10-4.5 10-10v-21.3c0-5.5-4.5-10-10-10h-45.7l87.7-161.1a10.05 10.05 0 0 0-8.8-14.8h-45c-3.8 0-7.2 2.1-8.9 5.5l-73.2 144.3-72.9-144.3c-1.7-3.4-5.2-5.5-9-5.5z")),t.ReconciliationOutline=o("reconciliation",s,r(a,"M676 565c-50.8 0-92 41.2-92 92s41.2 92 92 92 92-41.2 92-92-41.2-92-92-92zm0 126c-18.8 0-34-15.2-34-34s15.2-34 34-34 34 15.2 34 34-15.2 34-34 34zm204-523H668c0-30.9-25.1-56-56-56h-80c-30.9 0-56 25.1-56 56H264c-17.7 0-32 14.3-32 32v200h-88c-17.7 0-32 14.3-32 32v448c0 17.7 14.3 32 32 32h336c17.7 0 32-14.3 32-32v-16h368c17.7 0 32-14.3 32-32V200c0-17.7-14.3-32-32-32zm-412 64h72v-56h64v56h72v48H468v-48zm-20 616H176V616h272v232zm0-296H176v-88h272v88zm392 240H512V432c0-17.7-14.3-32-32-32H304V240h100v104h336V240h100v552zM704 408v96c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-96c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8zM592 512h48c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8z")),t.RedEnvelopeOutline=o("red-envelope",s,r(a,"M440.6 462.6a8.38 8.38 0 0 0-7.5-4.6h-48.8c-1.3 0-2.6.4-3.9 1a8.4 8.4 0 0 0-3.4 11.4l87.4 161.1H419c-4.6 0-8.4 3.8-8.4 8.4V665c0 4.6 3.8 8.4 8.4 8.4h63V702h-63c-4.6 0-8.4 3.8-8.4 8.4v25.1c0 4.6 3.8 8.4 8.4 8.4h63v49.9c0 4.6 3.8 8.4 8.4 8.4h43.7c4.6 0 8.4-3.8 8.4-8.4v-49.9h63.3c4.7 0 8.4-3.8 8.2-8.5v-25c0-4.6-3.8-8.4-8.4-8.4h-63.3v-28.6h63.3c4.6 0 8.4-3.8 8.4-8.4v-25.1c0-4.6-3.8-8.4-8.4-8.4h-45.9l87.2-161a8.45 8.45 0 0 0-7.4-12.4h-47.8c-3.1 0-6 1.8-7.5 4.6l-71.9 141.9-71.7-142zM832 64H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V96c0-17.7-14.3-32-32-32zm-40 824H232V193.1l260.3 204.1c11.6 9.1 27.9 9.1 39.5 0L792 193.1V888zm0-751.3h-31.7L512 331.3 263.7 136.7H232v-.7h560v.7z")),t.RestOutline=o("rest",s,r(a,"M508 704c79.5 0 144-64.5 144-144s-64.5-144-144-144-144 64.5-144 144 64.5 144 144 144zm0-224c44.2 0 80 35.8 80 80s-35.8 80-80 80-80-35.8-80-80 35.8-80 80-80zm324-224h-28.1l-35.7-120.9c-4-13.7-16.5-23.1-30.7-23.1h-451c-14.3 0-26.8 9.4-30.7 23.1L220.1 256H192c-17.7 0-32 14.3-32 32v28c0 4.4 3.6 8 8 8h45.8l47.7 558.7a32 32 0 0 0 31.9 29.3h429.2a32 32 0 0 0 31.9-29.3L802.2 324H856c4.4 0 8-3.6 8-8v-28c0-17.7-14.3-32-32-32zm-518.6-76h397.2l22.4 76H291l22.4-76zm376.2 664H326.4L282 324h451.9l-44.3 520z")),t.RightCircleOutline=o("right-circle",s,r(a,"M666.7 505.5l-246-178A8 8 0 0 0 408 334v46.9c0 10.2 4.9 19.9 13.2 25.9L566.6 512 421.2 617.2c-8.3 6-13.2 15.6-13.2 25.9V690c0 6.5 7.4 10.3 12.7 6.5l246-178c4.4-3.2 4.4-9.8 0-13z","M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z")),t.RightSquareOutline=o("right-square",s,r(a,"M412.7 696.5l246-178c4.4-3.2 4.4-9.7 0-12.9l-246-178c-5.3-3.8-12.7 0-12.7 6.5V381c0 10.2 4.9 19.9 13.2 25.9L558.6 512 413.2 617.2c-8.3 6-13.2 15.6-13.2 25.9V690c0 6.5 7.4 10.3 12.7 6.5z","M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z")),t.SafetyCertificateOutline=o("safety-certificate",s,r(a,"M866.9 169.9L527.1 54.1C523 52.7 517.5 52 512 52s-11 .7-15.1 2.1L157.1 169.9c-8.3 2.8-15.1 12.4-15.1 21.2v482.4c0 8.8 5.7 20.4 12.6 25.9L499.3 968c3.5 2.7 8 4.1 12.6 4.1s9.2-1.4 12.6-4.1l344.7-268.6c6.9-5.4 12.6-17 12.6-25.9V191.1c.2-8.8-6.6-18.3-14.9-21.2zM810 654.3L512 886.5 214 654.3V226.7l298-101.6 298 101.6v427.6zm-405.8-201c-3-4.1-7.8-6.6-13-6.6H336c-6.5 0-10.3 7.4-6.5 12.7l126.4 174a16.1 16.1 0 0 0 26 0l212.6-292.7c3.8-5.3 0-12.7-6.5-12.7h-55.2c-5.1 0-10 2.5-13 6.6L468.9 542.4l-64.7-89.1z")),t.RocketOutline=o("rocket",s,r(a,"M864 736c0-111.6-65.4-208-160-252.9V317.3c0-15.1-5.3-29.7-15.1-41.2L536.5 95.4C530.1 87.8 521 84 512 84s-18.1 3.8-24.5 11.4L335.1 276.1a63.97 63.97 0 0 0-15.1 41.2v165.8C225.4 528 160 624.4 160 736h156.5c-2.3 7.2-3.5 15-3.5 23.8 0 22.1 7.6 43.7 21.4 60.8a97.2 97.2 0 0 0 43.1 30.6c23.1 54 75.6 88.8 134.5 88.8 29.1 0 57.3-8.6 81.4-24.8 23.6-15.8 41.9-37.9 53-64a97 97 0 0 0 43.1-30.5 97.52 97.52 0 0 0 21.4-60.8c0-8.4-1.1-16.4-3.1-23.8H864zM762.3 621.4c9.4 14.6 17 30.3 22.5 46.6H700V558.7a211.6 211.6 0 0 1 62.3 62.7zM388 483.1V318.8l124-147 124 147V668H388V483.1zM239.2 668c5.5-16.3 13.1-32 22.5-46.6 16.3-25.2 37.5-46.5 62.3-62.7V668h-84.8zm388.9 116.2c-5.2 3-11.2 4.2-17.1 3.4l-19.5-2.4-2.8 19.4c-5.4 37.9-38.4 66.5-76.7 66.5-38.3 0-71.3-28.6-76.7-66.5l-2.8-19.5-19.5 2.5a27.7 27.7 0 0 1-17.1-3.5c-8.7-5-14.1-14.3-14.1-24.4 0-10.6 5.9-19.4 14.6-23.8h231.3c8.8 4.5 14.6 13.3 14.6 23.8-.1 10.2-5.5 19.6-14.2 24.5zM464 400a48 48 0 1 0 96 0 48 48 0 1 0-96 0z")),t.SaveOutline=o("save",s,r(a,"M893.3 293.3L730.7 130.7c-7.5-7.5-16.7-13-26.7-16V112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V338.5c0-17-6.7-33.2-18.7-45.2zM384 184h256v104H384V184zm456 656H184V184h136v136c0 17.7 14.3 32 32 32h320c17.7 0 32-14.3 32-32V205.8l136 136V840zM512 442c-79.5 0-144 64.5-144 144s64.5 144 144 144 144-64.5 144-144-64.5-144-144-144zm0 224c-44.2 0-80-35.8-80-80s35.8-80 80-80 80 35.8 80 80-35.8 80-80 80z")),t.ScheduleOutline=o("schedule",s,r(a,"M928 224H768v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56H548v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56H328v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56H96c-17.7 0-32 14.3-32 32v576c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V256c0-17.7-14.3-32-32-32zm-40 568H136V296h120v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56h148v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56h148v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56h120v496zM416 496H232c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zm0 136H232c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zm308.2-177.4L620.6 598.3l-52.8-73.1c-3-4.2-7.8-6.6-12.9-6.6H500c-6.5 0-10.3 7.4-6.5 12.7l114.1 158.2a15.9 15.9 0 0 0 25.8 0l165-228.7c3.8-5.3 0-12.7-6.5-12.7H737c-5-.1-9.8 2.4-12.8 6.5z")),t.SecurityScanOutline=o("security-scan",s,r(a,"M866.9 169.9L527.1 54.1C523 52.7 517.5 52 512 52s-11 .7-15.1 2.1L157.1 169.9c-8.3 2.8-15.1 12.4-15.1 21.2v482.4c0 8.8 5.7 20.4 12.6 25.9L499.3 968c3.5 2.7 8 4.1 12.6 4.1s9.2-1.4 12.6-4.1l344.7-268.6c6.9-5.4 12.6-17 12.6-25.9V191.1c.2-8.8-6.6-18.3-14.9-21.2zM810 654.3L512 886.5 214 654.3V226.7l298-101.6 298 101.6v427.6zM402.9 528.8l-77.5 77.5a8.03 8.03 0 0 0 0 11.3l34 34c3.1 3.1 8.2 3.1 11.3 0l77.5-77.5c55.7 35.1 130.1 28.4 178.6-20.1 56.3-56.3 56.3-147.5 0-203.8-56.3-56.3-147.5-56.3-203.8 0-48.5 48.5-55.2 123-20.1 178.6zm65.4-133.3c31.3-31.3 82-31.3 113.2 0 31.3 31.3 31.3 82 0 113.2-31.3 31.3-82 31.3-113.2 0s-31.3-81.9 0-113.2z")),t.SettingOutline=o("setting",s,r(a,"M924.8 625.7l-65.5-56c3.1-19 4.7-38.4 4.7-57.8s-1.6-38.8-4.7-57.8l65.5-56a32.03 32.03 0 0 0 9.3-35.2l-.9-2.6a443.74 443.74 0 0 0-79.7-137.9l-1.8-2.1a32.12 32.12 0 0 0-35.1-9.5l-81.3 28.9c-30-24.6-63.5-44-99.7-57.6l-15.7-85a32.05 32.05 0 0 0-25.8-25.7l-2.7-.5c-52.1-9.4-106.9-9.4-159 0l-2.7.5a32.05 32.05 0 0 0-25.8 25.7l-15.8 85.4a351.86 351.86 0 0 0-99 57.4l-81.9-29.1a32 32 0 0 0-35.1 9.5l-1.8 2.1a446.02 446.02 0 0 0-79.7 137.9l-.9 2.6c-4.5 12.5-.8 26.5 9.3 35.2l66.3 56.6c-3.1 18.8-4.6 38-4.6 57.1 0 19.2 1.5 38.4 4.6 57.1L99 625.5a32.03 32.03 0 0 0-9.3 35.2l.9 2.6c18.1 50.4 44.9 96.9 79.7 137.9l1.8 2.1a32.12 32.12 0 0 0 35.1 9.5l81.9-29.1c29.8 24.5 63.1 43.9 99 57.4l15.8 85.4a32.05 32.05 0 0 0 25.8 25.7l2.7.5a449.4 449.4 0 0 0 159 0l2.7-.5a32.05 32.05 0 0 0 25.8-25.7l15.7-85a350 350 0 0 0 99.7-57.6l81.3 28.9a32 32 0 0 0 35.1-9.5l1.8-2.1c34.8-41.1 61.6-87.5 79.7-137.9l.9-2.6c4.5-12.3.8-26.3-9.3-35zM788.3 465.9c2.5 15.1 3.8 30.6 3.8 46.1s-1.3 31-3.8 46.1l-6.6 40.1 74.7 63.9a370.03 370.03 0 0 1-42.6 73.6L721 702.8l-31.4 25.8c-23.9 19.6-50.5 35-79.3 45.8l-38.1 14.3-17.9 97a377.5 377.5 0 0 1-85 0l-17.9-97.2-37.8-14.5c-28.5-10.8-55-26.2-78.7-45.7l-31.4-25.9-93.4 33.2c-17-22.9-31.2-47.6-42.6-73.6l75.5-64.5-6.5-40c-2.4-14.9-3.7-30.3-3.7-45.5 0-15.3 1.2-30.6 3.7-45.5l6.5-40-75.5-64.5c11.3-26.1 25.6-50.7 42.6-73.6l93.4 33.2 31.4-25.9c23.7-19.5 50.2-34.9 78.7-45.7l37.9-14.3 17.9-97.2c28.1-3.2 56.8-3.2 85 0l17.9 97 38.1 14.3c28.7 10.8 55.4 26.2 79.3 45.8l31.4 25.8 92.8-32.9c17 22.9 31.2 47.6 42.6 73.6L781.8 426l6.5 39.9zM512 326c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm79.2 255.2A111.6 111.6 0 0 1 512 614c-29.9 0-58-11.7-79.2-32.8A111.6 111.6 0 0 1 400 502c0-29.9 11.7-58 32.8-79.2C454 401.6 482.1 390 512 390c29.9 0 58 11.6 79.2 32.8A111.6 111.6 0 0 1 624 502c0 29.9-11.7 58-32.8 79.2z")),t.ShopOutline=o("shop",s,r(a,"M882 272.1V144c0-17.7-14.3-32-32-32H174c-17.7 0-32 14.3-32 32v128.1c-16.7 1-30 14.9-30 31.9v131.7a177 177 0 0 0 14.4 70.4c4.3 10.2 9.6 19.8 15.6 28.9v345c0 17.6 14.3 32 32 32h676c17.7 0 32-14.3 32-32V535a175 175 0 0 0 15.6-28.9c9.5-22.3 14.4-46 14.4-70.4V304c0-17-13.3-30.9-30-31.9zM214 184h596v88H214v-88zm362 656.1H448V736h128v104.1zm234 0H640V704c0-17.7-14.3-32-32-32H416c-17.7 0-32 14.3-32 32v136.1H214V597.9c2.9 1.4 5.9 2.8 9 4 22.3 9.4 46 14.1 70.4 14.1s48-4.7 70.4-14.1c13.8-5.8 26.8-13.2 38.7-22.1.2-.1.4-.1.6 0a180.4 180.4 0 0 0 38.7 22.1c22.3 9.4 46 14.1 70.4 14.1 24.4 0 48-4.7 70.4-14.1 13.8-5.8 26.8-13.2 38.7-22.1.2-.1.4-.1.6 0a180.4 180.4 0 0 0 38.7 22.1c22.3 9.4 46 14.1 70.4 14.1 24.4 0 48-4.7 70.4-14.1 3-1.3 6-2.6 9-4v242.2zm30-404.4c0 59.8-49 108.3-109.3 108.3-40.8 0-76.4-22.1-95.2-54.9-2.9-5-8.1-8.1-13.9-8.1h-.6c-5.7 0-11 3.1-13.9 8.1A109.24 109.24 0 0 1 512 544c-40.7 0-76.2-22-95-54.7-3-5.1-8.4-8.3-14.3-8.3s-11.4 3.2-14.3 8.3a109.63 109.63 0 0 1-95.1 54.7C233 544 184 495.5 184 435.7v-91.2c0-.3.2-.5.5-.5h655c.3 0 .5.2.5.5v91.2z")),t.ShoppingOutline=o("shopping",s,r(a,"M832 312H696v-16c0-101.6-82.4-184-184-184s-184 82.4-184 184v16H192c-17.7 0-32 14.3-32 32v536c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V344c0-17.7-14.3-32-32-32zm-432-16c0-61.9 50.1-112 112-112s112 50.1 112 112v16H400v-16zm392 544H232V384h96v88c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-88h224v88c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-88h96v456z")),t.SkinOutline=o("skin",s,r(a,"M870 126H663.8c-17.4 0-32.9 11.9-37 29.3C614.3 208.1 567 246 512 246s-102.3-37.9-114.8-90.7a37.93 37.93 0 0 0-37-29.3H154a44 44 0 0 0-44 44v252a44 44 0 0 0 44 44h75v388a44 44 0 0 0 44 44h478a44 44 0 0 0 44-44V466h75a44 44 0 0 0 44-44V170a44 44 0 0 0-44-44zm-28 268H723v432H301V394H182V198h153.3c28.2 71.2 97.5 120 176.7 120s148.5-48.8 176.7-120H842v196z")),t.SkypeOutline=o("skype",s,r(a,"M883.7 578.6c4.1-22.5 6.3-45.5 6.3-68.5 0-51-10-100.5-29.7-147-19-45-46.3-85.4-81-120.1a375.79 375.79 0 0 0-120.1-80.9c-46.6-19.7-96-29.7-147-29.7-24 0-48.1 2.3-71.5 6.8A225.1 225.1 0 0 0 335.6 113c-59.7 0-115.9 23.3-158.1 65.5A222.25 222.25 0 0 0 112 336.6c0 38 9.8 75.4 28.1 108.4-3.7 21.4-5.7 43.3-5.7 65.1 0 51 10 100.5 29.7 147 19 45 46.2 85.4 80.9 120.1 34.7 34.7 75.1 61.9 120.1 80.9 46.6 19.7 96 29.7 147 29.7 22.2 0 44.4-2 66.2-5.9 33.5 18.9 71.3 29 110 29 59.7 0 115.9-23.2 158.1-65.5 42.3-42.2 65.5-98.4 65.5-158.1.1-38-9.7-75.5-28.2-108.7zm-88.1 216C766.9 823.4 729 839 688.4 839c-26.1 0-51.8-6.8-74.6-19.7l-22.5-12.7-25.5 4.5c-17.8 3.2-35.8 4.8-53.6 4.8-41.4 0-81.3-8.1-119.1-24.1-36.3-15.3-69-37.3-97.2-65.5a304.29 304.29 0 0 1-65.5-97.1c-16-37.7-24-77.6-24-119 0-17.4 1.6-35.2 4.6-52.8l4.4-25.1L203 410a151.02 151.02 0 0 1-19.1-73.4c0-40.6 15.7-78.5 44.4-107.2C257.1 200.7 295 185 335.6 185a153 153 0 0 1 71.4 17.9l22.4 11.8 24.8-4.8c18.9-3.6 38.4-5.5 58-5.5 41.4 0 81.3 8.1 119 24 36.5 15.4 69.1 37.4 97.2 65.5 28.2 28.1 50.2 60.8 65.6 97.2 16 37.7 24 77.6 24 119 0 18.4-1.7 37-5.1 55.5l-4.7 25.5 12.6 22.6c12.6 22.5 19.2 48 19.2 73.7 0 40.7-15.7 78.5-44.4 107.2zM583.4 466.2L495 446.6c-33.6-7.7-72.3-17.8-72.3-49.5s27.1-53.9 76.1-53.9c98.7 0 89.7 67.8 138.7 67.8 25.8 0 48.4-15.2 48.4-41.2 0-60.8-97.4-106.5-180-106.5-89.7 0-185.2 38.1-185.2 139.5 0 48.8 17.4 100.8 113.6 124.9l119.4 29.8c36.1 8.9 45.2 29.2 45.2 47.6 0 30.5-30.3 60.3-85.2 60.3-107.2 0-92.3-82.5-149.7-82.5-25.8 0-44.5 17.8-44.5 43.1 0 49.4 60 115.4 194.2 115.4 127.7 0 191-61.5 191-144 0-53.1-24.5-109.6-121.3-131.2z")),t.SlackSquareOutline=o("slack-square",s,r(a,"M893.1 397.6c-85.8-286-209.5-352.5-495.5-266.7S45.1 340.4 130.9 626.4s209.5 352.5 495.5 266.7 352.5-209.5 266.7-495.5zm-150 189.9l-50.3 16.3 16.5 50.6c7.7 23.6-5.3 49-28.9 56.7-23.6 7.7-49-5.3-56.7-28.9l-16.5-50.6L506 664.5l16.5 50.6c7.7 23.6-5.3 49-28.9 56.7-23.6 7.7-49-5.3-56.7-28.9l-16.5-50.6-51 16.6c-23.6 7.7-49-5.3-56.7-28.9s5.3-49 28.9-56.7l51-16.6-32.9-101.3-51 16.6c-23.6 7.7-49-5.3-56.7-28.9-7.7-23.6 5.3-49 28.9-56.7l51-16.6-16.5-50.6c-7.7-23.6 5.3-49 28.9-56.7 23.6-7.7 49 5.3 56.7 28.9l16.5 50.6 101.3-32.9-16.5-50.6c-7.7-23.6 5.3-49 28.9-56.7s49 5.3 56.7 28.9l16.5 50.6 50.3-16.3c23.6-7.7 49 5.3 56.7 28.9 7.7 23.6-5.3 49-28.9 56.7L632.1 417 665 518.3l50.3-16.3c23.6-7.7 49 5.3 56.7 28.9 7.7 23.6-5.3 48.9-28.9 56.6zM445.26 477.67l101.3-32.9 32.9 101.29-101.29 32.9z")),t.SlidersOutline=o("sliders",s,r(a,"M320 224h-66v-56c0-4.4-3.6-8-8-8h-52c-4.4 0-8 3.6-8 8v56h-66c-4.4 0-8 3.6-8 8v560c0 4.4 3.6 8 8 8h66v56c0 4.4 3.6 8 8 8h52c4.4 0 8-3.6 8-8v-56h66c4.4 0 8-3.6 8-8V232c0-4.4-3.6-8-8-8zm-60 508h-80V292h80v440zm644-436h-66v-96c0-4.4-3.6-8-8-8h-52c-4.4 0-8 3.6-8 8v96h-66c-4.4 0-8 3.6-8 8v416c0 4.4 3.6 8 8 8h66v96c0 4.4 3.6 8 8 8h52c4.4 0 8-3.6 8-8v-96h66c4.4 0 8-3.6 8-8V304c0-4.4-3.6-8-8-8zm-60 364h-80V364h80v296zM612 404h-66V232c0-4.4-3.6-8-8-8h-52c-4.4 0-8 3.6-8 8v172h-66c-4.4 0-8 3.6-8 8v200c0 4.4 3.6 8 8 8h66v172c0 4.4 3.6 8 8 8h52c4.4 0 8-3.6 8-8V620h66c4.4 0 8-3.6 8-8V412c0-4.4-3.6-8-8-8zm-60 145a3 3 0 0 1-3 3h-74a3 3 0 0 1-3-3v-74a3 3 0 0 1 3-3h74a3 3 0 0 1 3 3v74z")),t.SmileOutline=o("smile",s,r(a,"M288 421a48 48 0 1 0 96 0 48 48 0 1 0-96 0zm352 0a48 48 0 1 0 96 0 48 48 0 1 0-96 0zM512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm263 711c-34.2 34.2-74 61-118.3 79.8C611 874.2 562.3 884 512 884c-50.3 0-99-9.8-144.8-29.2A370.4 370.4 0 0 1 248.9 775c-34.2-34.2-61-74-79.8-118.3C149.8 611 140 562.3 140 512s9.8-99 29.2-144.8A370.4 370.4 0 0 1 249 248.9c34.2-34.2 74-61 118.3-79.8C413 149.8 461.7 140 512 140c50.3 0 99 9.8 144.8 29.2A370.4 370.4 0 0 1 775.1 249c34.2 34.2 61 74 79.8 118.3C874.2 413 884 461.7 884 512s-9.8 99-29.2 144.8A368.89 368.89 0 0 1 775 775zM664 533h-48.1c-4.2 0-7.8 3.2-8.1 7.4C604 589.9 562.5 629 512 629s-92.1-39.1-95.8-88.6c-.3-4.2-3.9-7.4-8.1-7.4H360a8 8 0 0 0-8 8.4c4.4 84.3 74.5 151.6 160 151.6s155.6-67.3 160-151.6a8 8 0 0 0-8-8.4z")),t.SnippetsOutline=o("snippets",s,r(a,"M832 112H724V72c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v40H500V72c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v40H320c-17.7 0-32 14.3-32 32v120h-96c-17.7 0-32 14.3-32 32v632c0 17.7 14.3 32 32 32h512c17.7 0 32-14.3 32-32v-96h96c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM664 888H232V336h218v174c0 22.1 17.9 40 40 40h174v338zm0-402H514V336h.2L664 485.8v.2zm128 274h-56V456L544 264H360v-80h68v32c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-32h152v32c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-32h68v576z")),t.SoundOutline=o("sound",s,r(a,"M625.9 115c-5.9 0-11.9 1.6-17.4 5.3L254 352H90c-8.8 0-16 7.2-16 16v288c0 8.8 7.2 16 16 16h164l354.5 231.7c5.5 3.6 11.6 5.3 17.4 5.3 16.7 0 32.1-13.3 32.1-32.1V147.1c0-18.8-15.4-32.1-32.1-32.1zM586 803L293.4 611.7l-18-11.7H146V424h129.4l17.9-11.7L586 221v582zm348-327H806c-8.8 0-16 7.2-16 16v40c0 8.8 7.2 16 16 16h128c8.8 0 16-7.2 16-16v-40c0-8.8-7.2-16-16-16zm-41.9 261.8l-110.3-63.7a15.9 15.9 0 0 0-21.7 5.9l-19.9 34.5c-4.4 7.6-1.8 17.4 5.8 21.8L856.3 800a15.9 15.9 0 0 0 21.7-5.9l19.9-34.5c4.4-7.6 1.7-17.4-5.8-21.8zM760 344a15.9 15.9 0 0 0 21.7 5.9L892 286.2c7.6-4.4 10.2-14.2 5.8-21.8L878 230a15.9 15.9 0 0 0-21.7-5.9L746 287.8a15.99 15.99 0 0 0-5.8 21.8L760 344z")),t.StarOutline=o("star",s,r(a,"M908.1 353.1l-253.9-36.9L540.7 86.1c-3.1-6.3-8.2-11.4-14.5-14.5-15.8-7.8-35-1.3-42.9 14.5L369.8 316.2l-253.9 36.9c-7 1-13.4 4.3-18.3 9.3a32.05 32.05 0 0 0 .6 45.3l183.7 179.1-43.4 252.9a31.95 31.95 0 0 0 46.4 33.7L512 754l227.1 119.4c6.2 3.3 13.4 4.4 20.3 3.2 17.4-3 29.1-19.5 26.1-36.9l-43.4-252.9 183.7-179.1c5-4.9 8.3-11.3 9.3-18.3 2.7-17.5-9.5-33.7-27-36.3zM664.8 561.6l36.1 210.3L512 672.7 323.1 772l36.1-210.3-152.8-149L417.6 382 512 190.7 606.4 382l211.2 30.7-152.8 148.9z")),t.StepBackwardOutline=o("step-backward",s,r(i,"M759.3 76.3L327.9 431.6V132c0-19.9-16.1-36-36-36s-36 16.1-36 36v760c0 19.9 16.1 36 36 36s36-16.1 36-36V590.6l431.3 357.2c27.4 24.4 70.8 5 70.8-31.7V107.9c0-36.6-43.4-56.1-70.7-31.6z")),t.StepForwardOutline=o("step-forward",s,r(i,"M326.6 76.3L758 431.6V132c0-19.9 16.1-36 36-36s36 16.1 36 36v760c0 19.9-16.1 36-36 36s-36-16.1-36-36V590.6L326.7 947.8c-27.4 24.4-70.8 5-70.8-31.7V107.9c0-36.6 43.4-56.1 70.7-31.6z")),t.StopOutline=o("stop",s,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372 0-89 31.3-170.8 83.5-234.8l523.3 523.3C682.8 852.7 601 884 512 884zm288.5-137.2L277.2 223.5C341.2 171.3 423 140 512 140c205.4 0 372 166.6 372 372 0 89-31.3 170.8-83.5 234.8z")),t.SwitcherOutline=o("switcher",s,r(a,"M752 240H144c-17.7 0-32 14.3-32 32v608c0 17.7 14.3 32 32 32h608c17.7 0 32-14.3 32-32V272c0-17.7-14.3-32-32-32zm-40 600H184V312h528v528zm168-728H264c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h576v576c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V144c0-17.7-14.3-32-32-32zM300 550h296v64H300z")),t.TabletOutline=o("tablet",s,r(a,"M800 64H224c-35.3 0-64 28.7-64 64v768c0 35.3 28.7 64 64 64h576c35.3 0 64-28.7 64-64V128c0-35.3-28.7-64-64-64zm-8 824H232V136h560v752zM472 784a40 40 0 1 0 80 0 40 40 0 1 0-80 0z")),t.TagOutline=o("tag",s,r(a,"M938 458.8l-29.6-312.6c-1.5-16.2-14.4-29-30.6-30.6L565.2 86h-.4c-3.2 0-5.7 1-7.6 2.9L88.9 557.2a9.96 9.96 0 0 0 0 14.1l363.8 363.8c1.9 1.9 4.4 2.9 7.1 2.9s5.2-1 7.1-2.9l468.3-468.3c2-2.1 3-5 2.8-8zM459.7 834.7L189.3 564.3 589 164.6 836 188l23.4 247-399.7 399.7zM680 256c-48.5 0-88 39.5-88 88s39.5 88 88 88 88-39.5 88-88-39.5-88-88-88zm0 120c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z")),t.TagsOutline=o("tags",s,r(a,"M483.2 790.3L861.4 412c1.7-1.7 2.5-4 2.3-6.3l-25.5-301.4c-.7-7.8-6.8-13.9-14.6-14.6L522.2 64.3c-2.3-.2-4.7.6-6.3 2.3L137.7 444.8a8.03 8.03 0 0 0 0 11.3l334.2 334.2c3.1 3.2 8.2 3.2 11.3 0zm62.6-651.7l224.6 19 19 224.6L477.5 694 233.9 450.5l311.9-311.9zm60.16 186.23a48 48 0 1 0 67.88-67.89 48 48 0 1 0-67.88 67.89zM889.7 539.8l-39.6-39.5a8.03 8.03 0 0 0-11.3 0l-362 361.3-237.6-237a8.03 8.03 0 0 0-11.3 0l-39.6 39.5a8.03 8.03 0 0 0 0 11.3l243.2 242.8 39.6 39.5c3.1 3.1 8.2 3.1 11.3 0l407.3-406.6c3.1-3.1 3.1-8.2 0-11.3z")),t.TaobaoCircleOutline=o("taobao-circle",s,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zM315.7 291.5c27.3 0 49.5 22.1 49.5 49.4s-22.1 49.4-49.5 49.4a49.4 49.4 0 1 1 0-98.8zM366.9 578c-13.6 42.3-10.2 26.7-64.4 144.5l-78.5-49s87.7-79.8 105.6-116.2c19.2-38.4-21.1-58.9-21.1-58.9l-60.2-37.5 32.7-50.2c45.4 33.7 48.7 36.6 79.2 67.2 23.8 23.9 20.7 56.8 6.7 100.1zm427.2 55c-15.3 143.8-202.4 90.3-202.4 90.3l10.2-41.1 43.3 9.3c80 5 72.3-64.9 72.3-64.9V423c.6-77.3-72.6-85.4-204.2-38.3l30.6 8.3c-2.5 9-12.5 23.2-25.2 38.6h176v35.6h-99.1v44.5h98.7v35.7h-98.7V622c14.9-4.8 28.6-11.5 40.5-20.5l-8.7-32.5 46.5-14.4 38.8 94.9-57.3 23.9-10.2-37.8c-25.6 19.5-78.8 48-171.8 45.4-99.2 2.6-73.7-112-73.7-112l2.5-1.3H472c-.5 14.7-6.6 38.7 1.7 51.8 6.8 10.8 24.2 12.6 35.3 13.1 1.3.1 2.6.1 3.9.1v-85.3h-101v-35.7h101v-44.5H487c-22.7 24.1-43.5 44.1-43.5 44.1l-30.6-26.7c21.7-22.9 43.3-59.1 56.8-83.2-10.9 4.4-22 9.2-33.6 14.2-11.2 14.3-24.2 29-38.7 43.5.5.8-50-28.4-50-28.4 52.2-44.4 81.4-139.9 81.4-139.9l72.5 20.4s-5.9 14-18.4 35.6c290.3-82.3 307.4 50.5 307.4 50.5s19.1 91.8 3.8 235.7z")),t.ThunderboltOutline=o("thunderbolt",s,r(a,"M848 359.3H627.7L825.8 109c4.1-5.3.4-13-6.3-13H436c-2.8 0-5.5 1.5-6.9 4L170 547.5c-3.1 5.3.7 12 6.9 12h174.4l-89.4 357.6c-1.9 7.8 7.5 13.3 13.3 7.7L853.5 373c5.2-4.9 1.7-13.7-5.5-13.7zM378.2 732.5l60.3-241H281.1l189.6-327.4h224.6L487 427.4h211L378.2 732.5z")),t.ToolOutline=o("tool",s,r(a,"M876.6 239.5c-.5-.9-1.2-1.8-2-2.5-5-5-13.1-5-18.1 0L684.2 409.3l-67.9-67.9L788.7 169c.8-.8 1.4-1.6 2-2.5 3.6-6.1 1.6-13.9-4.5-17.5-98.2-58-226.8-44.7-311.3 39.7-67 67-89.2 162-66.5 247.4l-293 293c-3 3-2.8 7.9.3 11l169.7 169.7c3.1 3.1 8.1 3.3 11 .3l292.9-292.9c85.5 22.8 180.5.7 247.6-66.4 84.4-84.5 97.7-213.1 39.7-311.3zM786 499.8c-58.1 58.1-145.3 69.3-214.6 33.6l-8.8 8.8-.1-.1-274 274.1-79.2-79.2 230.1-230.1s0 .1.1.1l52.8-52.8c-35.7-69.3-24.5-156.5 33.6-214.6a184.2 184.2 0 0 1 144-53.5L537 318.9a32.05 32.05 0 0 0 0 45.3l124.5 124.5a32.05 32.05 0 0 0 45.3 0l132.8-132.8c3.7 51.8-14.4 104.8-53.6 143.9z")),t.TrophyOutline=o("trophy",s,r(a,"M868 160h-92v-40c0-4.4-3.6-8-8-8H256c-4.4 0-8 3.6-8 8v40h-92a44 44 0 0 0-44 44v148c0 81.7 60 149.6 138.2 162C265.7 630.2 359 721.7 476 734.5v105.2H280c-17.7 0-32 14.3-32 32V904c0 4.4 3.6 8 8 8h512c4.4 0 8-3.6 8-8v-32.3c0-17.7-14.3-32-32-32H548V734.5C665 721.7 758.3 630.2 773.8 514 852 501.6 912 433.7 912 352V204a44 44 0 0 0-44-44zM184 352V232h64v207.6a91.99 91.99 0 0 1-64-87.6zm520 128c0 49.1-19.1 95.4-53.9 130.1-34.8 34.8-81 53.9-130.1 53.9h-16c-49.1 0-95.4-19.1-130.1-53.9-34.8-34.8-53.9-81-53.9-130.1V184h384v296zm136-128c0 41-26.9 75.8-64 87.6V232h64v120z")),t.UpCircleOutline=o("up-circle",s,r(a,"M518.5 360.3a7.95 7.95 0 0 0-12.9 0l-178 246c-3.8 5.3 0 12.7 6.5 12.7H381c10.2 0 19.9-4.9 25.9-13.2L512 460.4l105.2 145.4c6 8.3 15.6 13.2 25.9 13.2H690c6.5 0 10.3-7.4 6.5-12.7l-178-246z","M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z")),t.UpSquareOutline=o("up-square",s,r(a,"M334 624h46.9c10.2 0 19.9-4.9 25.9-13.2L512 465.4l105.2 145.4c6 8.3 15.6 13.2 25.9 13.2H690c6.5 0 10.3-7.4 6.5-12.7l-178-246a7.95 7.95 0 0 0-12.9 0l-178 246A7.96 7.96 0 0 0 334 624z","M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z")),t.UnlockOutline=o("unlock",s,r(a,"M832 464H332V240c0-30.9 25.1-56 56-56h248c30.9 0 56 25.1 56 56v68c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-68c0-70.7-57.3-128-128-128H388c-70.7 0-128 57.3-128 128v224h-68c-17.7 0-32 14.3-32 32v384c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V496c0-17.7-14.3-32-32-32zm-40 376H232V536h560v304zM484 701v53c0 4.4 3.6 8 8 8h40c4.4 0 8-3.6 8-8v-53a48.01 48.01 0 1 0-56 0z")),t.WalletOutline=o("wallet",s,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 464H528V448h312v128zm0 264H184V184h656v200H496c-17.7 0-32 14.3-32 32v192c0 17.7 14.3 32 32 32h344v200zM580 512a40 40 0 1 0 80 0 40 40 0 1 0-80 0z")),t.VideoCameraOutline=o("video-camera",s,r(a,"M912 302.3L784 376V224c0-35.3-28.7-64-64-64H128c-35.3 0-64 28.7-64 64v576c0 35.3 28.7 64 64 64h592c35.3 0 64-28.7 64-64V648l128 73.7c21.3 12.3 48-3.1 48-27.6V330c0-24.6-26.7-40-48-27.7zM712 792H136V232h576v560zm176-167l-104-59.8V458.9L888 399v226zM208 360h112c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H208c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8z")),t.UsbOutline=o("usb",s,r(a,"M760 432V144c0-17.7-14.3-32-32-32H296c-17.7 0-32 14.3-32 32v288c-66.2 0-120 52.1-120 116v356c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V548c0-24.3 21.6-44 48.1-44h495.8c26.5 0 48.1 19.7 48.1 44v356c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V548c0-63.9-53.8-116-120-116zm-424 0V184h352v248H336zm120-184h-48c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zm160 0h-48c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8z")),t.WarningOutline=o("warning",s,r(a,"M464 720a48 48 0 1 0 96 0 48 48 0 1 0-96 0zm16-304v184c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V416c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8zm475.7 440l-416-720c-6.2-10.7-16.9-16-27.7-16s-21.6 5.3-27.7 16l-416 720C56 877.4 71.4 904 96 904h832c24.6 0 40-26.6 27.7-48zm-783.5-27.9L512 239.9l339.8 588.2H172.2z")),t.WeiboCircleOutline=o("weibo-circle",s,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm-44.4 672C353.1 736 236 680.4 236 588.9c0-47.8 30.2-103.1 82.3-155.3 69.5-69.6 150.6-101.4 181.1-70.8 13.5 13.5 14.8 36.8 6.1 64.6-4.5 14 13.1 6.3 13.1 6.3 56.2-23.6 105.2-25 123.1.7 9.6 13.7 8.6 32.8-.2 55.1-4.1 10.2 1.3 11.8 9 14.1 31.7 9.8 66.9 33.6 66.9 75.5.2 69.5-99.7 156.9-249.8 156.9zm207.3-290.8a34.9 34.9 0 0 0-7.2-34.1 34.68 34.68 0 0 0-33.1-10.7 18.24 18.24 0 0 1-7.6-35.7c24.1-5.1 50.1 2.3 67.7 21.9 17.7 19.6 22.4 46.3 14.9 69.8a18.13 18.13 0 0 1-22.9 11.7 18.18 18.18 0 0 1-11.8-22.9zm106 34.3s0 .1 0 0a21.1 21.1 0 0 1-26.6 13.7 21.19 21.19 0 0 1-13.6-26.7c11-34.2 4-73.2-21.7-101.8a104.04 104.04 0 0 0-98.9-32.1 21.14 21.14 0 0 1-25.1-16.3 21.07 21.07 0 0 1 16.2-25.1c49.4-10.5 102.8 4.8 139.1 45.1 36.3 40.2 46.1 95.1 30.6 143.2zm-334.5 6.1c-91.4 9-160.7 65.1-154.7 125.2 5.9 60.1 84.8 101.5 176.2 92.5 91.4-9.1 160.7-65.1 154.7-125.3-5.9-60.1-84.8-101.5-176.2-92.4zm80.2 141.7c-18.7 42.3-72.3 64.8-117.8 50.1-43.9-14.2-62.5-57.7-43.3-96.8 18.9-38.4 68-60.1 111.5-48.8 45 11.7 68 54.2 49.6 95.5zm-93-32.2c-14.2-5.9-32.4.2-41.2 13.9-8.8 13.8-4.7 30.2 9.3 36.6 14.3 6.5 33.2.3 42-13.8 8.8-14.3 4.2-30.6-10.1-36.7zm34.9-14.5c-5.4-2.2-12.2.5-15.4 5.8-3.1 5.4-1.4 11.5 4.1 13.8 5.5 2.3 12.6-.3 15.8-5.8 3-5.6 1-11.8-4.5-13.8z")),t.ProjectOutline=o("project",s,r(a,"M280 752h80c4.4 0 8-3.6 8-8V280c0-4.4-3.6-8-8-8h-80c-4.4 0-8 3.6-8 8v464c0 4.4 3.6 8 8 8zm192-280h80c4.4 0 8-3.6 8-8V280c0-4.4-3.6-8-8-8h-80c-4.4 0-8 3.6-8 8v184c0 4.4 3.6 8 8 8zm192 72h80c4.4 0 8-3.6 8-8V280c0-4.4-3.6-8-8-8h-80c-4.4 0-8 3.6-8 8v256c0 4.4 3.6 8 8 8zm216-432H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z")),t.WeiboSquareOutline=o("weibo-square",s,r(a,"M433.6 595.1c-14.2-5.9-32.4.2-41.2 13.9-8.8 13.8-4.7 30.2 9.3 36.6 14.3 6.5 33.2.3 42-13.8 8.8-14.3 4.2-30.6-10.1-36.7zM880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM467.6 736C353.1 736 236 680.4 236 588.9c0-47.8 30.2-103.1 82.3-155.3 69.5-69.6 150.6-101.4 181.1-70.8 13.5 13.5 14.8 36.8 6.1 64.6-4.5 14 13.1 6.3 13.1 6.3 56.2-23.6 105.2-25 123.1.7 9.6 13.7 8.6 32.8-.2 55.1-4.1 10.2 1.3 11.8 9 14.1 31.7 9.8 66.9 33.6 66.9 75.5.2 69.5-99.7 156.9-249.8 156.9zm207.3-290.8a34.9 34.9 0 0 0-7.2-34.1 34.68 34.68 0 0 0-33.1-10.7 18.24 18.24 0 0 1-7.6-35.7c24.1-5.1 50.1 2.3 67.7 21.9 17.7 19.6 22.4 46.3 14.9 69.8a18.13 18.13 0 0 1-22.9 11.7 18.18 18.18 0 0 1-11.8-22.9zm106 34.3s0 .1 0 0a21.1 21.1 0 0 1-26.6 13.7 21.19 21.19 0 0 1-13.6-26.7c11-34.2 4-73.2-21.7-101.8a104.04 104.04 0 0 0-98.9-32.1 21.14 21.14 0 0 1-25.1-16.3 21.07 21.07 0 0 1 16.2-25.1c49.4-10.5 102.8 4.8 139.1 45.1 36.3 40.2 46.1 95.1 30.6 143.2zm-334.5 6.1c-91.4 9-160.7 65.1-154.7 125.2 5.9 60.1 84.8 101.5 176.2 92.5 91.4-9.1 160.7-65.1 154.7-125.3-5.9-60.1-84.8-101.5-176.2-92.4zm80.2 141.7c-18.7 42.3-72.3 64.8-117.8 50.1-43.9-14.2-62.5-57.7-43.3-96.8 18.9-38.4 68-60.1 111.5-48.8 45 11.7 68 54.2 49.6 95.5zm-58.1-46.7c-5.4-2.2-12.2.5-15.4 5.8-3.1 5.4-1.4 11.5 4.1 13.8 5.5 2.3 12.6-.3 15.8-5.8 3-5.6 1-11.8-4.5-13.8z")),t.WindowsOutline=o("windows",s,r(a,"M120.1 770.6L443 823.2V543.8H120.1v226.8zm63.4-163.5h196.2v141.6l-196.2-31.9V607.1zm340.3 226.5l382 62.2v-352h-382v289.8zm63.4-226.5h255.3v214.4l-255.3-41.6V607.1zm-63.4-415.7v288.8h382V128.1l-382 63.3zm318.7 225.5H587.3V245l255.3-42.3v214.2zm-722.4 63.3H443V201.9l-322.9 53.5v224.8zM183.5 309l196.2-32.5v140.4H183.5V309z")),t.YoutubeOutline=o("youtube",s,r(a,"M960 509.2c0-2.2 0-4.7-.1-7.6-.1-8.1-.3-17.2-.5-26.9-.8-27.9-2.2-55.7-4.4-81.9-3-36.1-7.4-66.2-13.4-88.8a139.52 139.52 0 0 0-98.3-98.5c-28.3-7.6-83.7-12.3-161.7-15.2-37.1-1.4-76.8-2.3-116.5-2.8-13.9-.2-26.8-.3-38.4-.4h-29.4c-11.6.1-24.5.2-38.4.4-39.7.5-79.4 1.4-116.5 2.8-78 3-133.5 7.7-161.7 15.2A139.35 139.35 0 0 0 82.4 304C76.3 326.6 72 356.7 69 392.8c-2.2 26.2-3.6 54-4.4 81.9-.3 9.7-.4 18.8-.5 26.9 0 2.9-.1 5.4-.1 7.6v5.6c0 2.2 0 4.7.1 7.6.1 8.1.3 17.2.5 26.9.8 27.9 2.2 55.7 4.4 81.9 3 36.1 7.4 66.2 13.4 88.8 12.8 47.9 50.4 85.7 98.3 98.5 28.2 7.6 83.7 12.3 161.7 15.2 37.1 1.4 76.8 2.3 116.5 2.8 13.9.2 26.8.3 38.4.4h29.4c11.6-.1 24.5-.2 38.4-.4 39.7-.5 79.4-1.4 116.5-2.8 78-3 133.5-7.7 161.7-15.2 47.9-12.8 85.5-50.5 98.3-98.5 6.1-22.6 10.4-52.7 13.4-88.8 2.2-26.2 3.6-54 4.4-81.9.3-9.7.4-18.8.5-26.9 0-2.9.1-5.4.1-7.6v-5.6zm-72 5.2c0 2.1 0 4.4-.1 7.1-.1 7.8-.3 16.4-.5 25.7-.7 26.6-2.1 53.2-4.2 77.9-2.7 32.2-6.5 58.6-11.2 76.3-6.2 23.1-24.4 41.4-47.4 47.5-21 5.6-73.9 10.1-145.8 12.8-36.4 1.4-75.6 2.3-114.7 2.8-13.7.2-26.4.3-37.8.3h-28.6l-37.8-.3c-39.1-.5-78.2-1.4-114.7-2.8-71.9-2.8-124.9-7.2-145.8-12.8-23-6.2-41.2-24.4-47.4-47.5-4.7-17.7-8.5-44.1-11.2-76.3-2.1-24.7-3.4-51.3-4.2-77.9-.3-9.3-.4-18-.5-25.7 0-2.7-.1-5.1-.1-7.1v-4.8c0-2.1 0-4.4.1-7.1.1-7.8.3-16.4.5-25.7.7-26.6 2.1-53.2 4.2-77.9 2.7-32.2 6.5-58.6 11.2-76.3 6.2-23.1 24.4-41.4 47.4-47.5 21-5.6 73.9-10.1 145.8-12.8 36.4-1.4 75.6-2.3 114.7-2.8 13.7-.2 26.4-.3 37.8-.3h28.6l37.8.3c39.1.5 78.2 1.4 114.7 2.8 71.9 2.8 124.9 7.2 145.8 12.8 23 6.2 41.2 24.4 47.4 47.5 4.7 17.7 8.5 44.1 11.2 76.3 2.1 24.7 3.4 51.3 4.2 77.9.3 9.3.4 18 .5 25.7 0 2.7.1 5.1.1 7.1v4.8zM423 646l232-135-232-133z")),t.YahooOutline=o("yahoo",s,r(a,"M859.9 681.4h-14.1c-27.1 0-49.2 22.2-49.2 49.3v14.1c0 27.1 22.2 49.3 49.2 49.3h14.1c27.1 0 49.2-22.2 49.2-49.3v-14.1c0-27.1-22.2-49.3-49.2-49.3zM402.6 231C216.2 231 65 357 65 512.5S216.2 794 402.6 794s337.6-126 337.6-281.5S589.1 231 402.6 231zm0 507C245.1 738 121 634.6 121 512.5c0-62.3 32.3-119.7 84.9-161v48.4h37l159.8 159.9v65.3h-84.4v56.3h225.1v-56.3H459v-65.3l103.5-103.6h65.3v-56.3H459v65.3l-28.1 28.1-93.4-93.5h37v-56.3H216.4c49.4-35 114.3-56.6 186.2-56.6 157.6 0 281.6 103.4 281.6 225.5S560.2 738 402.6 738zm534.7-507H824.7c-15.5 0-27.7 12.6-27.1 28.1l13.1 366h84.4l65.4-366.4c2.7-15.2-7.8-27.7-23.2-27.7z")),t.YuqueOutline=o("yuque",s,r(a,"M854.6 370.6c-9.9-39.4 9.9-102.2 73.4-124.4l-67.9-3.6s-25.7-90-143.6-98c-117.8-8.1-194.9-3-195-3 .1 0 87.4 55.6 52.4 154.7-25.6 52.5-65.8 95.6-108.8 144.7-1.3 1.3-2.5 2.6-3.5 3.7C319.4 605 96 860 96 860c245.9 64.4 410.7-6.3 508.2-91.1 20.5-.2 35.9-.3 46.3-.3 135.8 0 250.6-117.6 245.9-248.4-3.2-89.9-31.9-110.2-41.8-149.6zm-204.1 334c-10.6 0-26.2.1-46.8.3l-23.6.2-17.8 15.5c-47.1 41-104.4 71.5-171.4 87.6-52.5 12.6-110 16.2-172.7 9.6 18-20.5 36.5-41.6 55.4-63.1 92-104.6 173.8-197.5 236.9-268.5l1.4-1.4 1.3-1.5c4.1-4.6 20.6-23.3 24.7-28.1 9.7-11.1 17.3-19.9 24.5-28.6 30.7-36.7 52.2-67.8 69-102.2l1.6-3.3 1.2-3.4c13.7-38.8 15.4-76.9 6.2-112.8 22.5.7 46.5 1.9 71.7 3.6 33.3 2.3 55.5 12.9 71.1 29.2 5.8 6 10.2 12.5 13.4 18.7 1 2 1.7 3.6 2.3 5l5 17.7c-15.7 34.5-19.9 73.3-11.4 107.2 3 11.8 6.9 22.4 12.3 34.4 2.1 4.7 9.5 20.1 11 23.3 10.3 22.7 15.4 43 16.7 78.7 3.3 94.6-82.7 181.9-182 181.9z")),t.AlibabaOutline=o("alibaba",s,r(a,"M602.9 669.8c-37.2 2.6-33.6-17.3-11.5-46.2 50.4-67.2 143.7-158.5 147.9-225.2 5.8-86.6-81.3-113.4-171-113.4-62.4 1.6-127 18.9-171 34.6-151.6 53.5-246.6 137.5-306.9 232-62.4 93.4-43 183.2 91.8 185.8 101.8-4.2 170.5-32.5 239.7-68.2.5 0-192.5 55.1-263.9 14.7-7.9-4.2-15.7-10-17.8-26.2 0-33.1 54.6-67.7 86.6-78.7v-56.7c64.5 22.6 140.6 16.3 205.7-32 2.1 5.8 4.2 13.1 3.7 21h11c2.6-22.6-12.6-44.6-37.8-46.2 7.3 5.8 12.6 10.5 15.2 14.7l-1 1-.5.5c-83.9 58.8-165.3 31.5-173.1 29.9l46.7-45.7-13.1-33.1c92.9-32.5 169.5-56.2 296.9-78.7l-28.5-23 14.7-8.9c75.5 21 126.4 36.7 123.8 76.6-1 6.8-3.7 14.7-7.9 23.1C660.1 466.1 594 538 567.2 569c-17.3 20.5-34.6 39.4-46.7 58.3-13.6 19.4-20.5 37.3-21 53.5 2.6 131.8 391.4-61.9 468-112.9-111.7 47.8-232.9 93.5-364.6 101.9zm85-302.9c2.8 5.2 4.1 11.6 4.1 19.1-.1-6.8-1.4-13.3-4.1-19.1z")),t.AlignCenterOutline=o("align-center",s,r(a,"M264 230h496c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H264c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm496 424c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H264c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h496zm144 140H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-424H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z")),t.AlignLeftOutline=o("align-left",s,r(a,"M120 230h496c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm0 424h496c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm784 140H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-424H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z")),t.AlignRightOutline=o("align-right",s,r(a,"M904 158H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h496c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 424H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h496c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 212H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-424H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z")),t.AlipayOutline=o("alipay",s,r(a,"M789 610.3c-38.7-12.9-90.7-32.7-148.5-53.6 34.8-60.3 62.5-129 80.7-203.6H530.5v-68.6h233.6v-38.3H530.5V132h-95.4c-16.7 0-16.7 16.5-16.7 16.5v97.8H182.2v38.3h236.3v68.6H223.4v38.3h378.4a667.18 667.18 0 0 1-54.5 132.9c-122.8-40.4-253.8-73.2-336.1-53-52.6 13-86.5 36.1-106.5 60.3-91.4 111-25.9 279.6 167.2 279.6C386 811.2 496 747.6 581.2 643 708.3 704 960 808.7 960 808.7V659.4s-31.6-2.5-171-49.1zM253.9 746.6c-150.5 0-195-118.3-120.6-183.1 24.8-21.9 70.2-32.6 94.4-35 89.4-8.8 172.2 25.2 269.9 72.8-68.8 89.5-156.3 145.3-243.7 145.3z")),t.AliyunOutline=o("aliyun",s,r(a,"M959.2 383.9c-.3-82.1-66.9-148.6-149.1-148.6H575.9l21.6 85.2 201 43.7a42.58 42.58 0 0 1 32.9 39.7c.1.5.1 216.1 0 216.6a42.58 42.58 0 0 1-32.9 39.7l-201 43.7-21.6 85.3h234.2c82.1 0 148.8-66.5 149.1-148.6V383.9zM225.5 660.4a42.58 42.58 0 0 1-32.9-39.7c-.1-.6-.1-216.1 0-216.6.8-19.4 14.6-35.5 32.9-39.7l201-43.7 21.6-85.2H213.8c-82.1 0-148.8 66.4-149.1 148.6V641c.3 82.1 67 148.6 149.1 148.6H448l-21.6-85.3-200.9-43.9zm200.9-158.8h171v21.3h-171z")),t.AmazonOutline=o("amazon",s,r(a,"M825 768.9c-3.3-.9-7.3-.4-11.9 1.3-61.6 28.2-121.5 48.3-179.7 60.2C507.7 856 385.2 842.6 266 790.3c-33.1-14.6-79.1-39.2-138-74a9.36 9.36 0 0 0-5.3-2c-2-.1-3.7.1-5.3.9-1.6.8-2.8 1.8-3.7 3.1-.9 1.3-1.1 3.1-.4 5.4.6 2.2 2.1 4.7 4.6 7.4 10.4 12.2 23.3 25.2 38.6 39s35.6 29.4 60.9 46.8c25.3 17.4 51.8 32.9 79.3 46.4 27.6 13.5 59.6 24.9 96.1 34.1s73 13.8 109.4 13.8c36.2 0 71.4-3.7 105.5-10.9 34.2-7.3 63-15.9 86.5-25.9 23.4-9.9 45-21 64.8-33 19.8-12 34.4-22.2 43.9-30.3 9.5-8.2 16.3-14.6 20.2-19.4 4.6-5.7 6.9-10.6 6.9-14.9.1-4.5-1.7-7.1-5-7.9zM527.4 348.1c-15.2 1.3-33.5 4.1-55 8.3-21.5 4.1-41.4 9.3-59.8 15.4s-37.2 14.6-56.3 25.4c-19.2 10.8-35.5 23.2-49 37s-24.5 31.1-33.1 52c-8.6 20.8-12.9 43.7-12.9 68.7 0 27.1 4.7 51.2 14.3 72.5 9.5 21.3 22.2 38 38.2 50.4 15.9 12.4 34 22.1 54 29.2 20 7.1 41.2 10.3 63.2 9.4 22-.9 43.5-4.3 64.4-10.3 20.8-5.9 40.4-15.4 58.6-28.3 18.2-12.9 33.1-28.2 44.8-45.7 4.3 6.6 8.1 11.5 11.5 14.7l8.7 8.9c5.8 5.9 14.7 14.6 26.7 26.1 11.9 11.5 24.1 22.7 36.3 33.7l104.4-99.9-6-4.9c-4.3-3.3-9.4-8-15.2-14.3-5.8-6.2-11.6-13.1-17.2-20.5-5.7-7.4-10.6-16.1-14.7-25.9-4.1-9.8-6.2-19.3-6.2-28.5V258.7c0-10.1-1.9-21-5.7-32.8-3.9-11.7-10.7-24.5-20.7-38.3-10-13.8-22.4-26.2-37.2-37-14.9-10.8-34.7-20-59.6-27.4-24.8-7.4-52.6-11.1-83.2-11.1-31.3 0-60.4 3.7-87.6 10.9-27.1 7.3-50.3 17-69.7 29.2-19.3 12.2-35.9 26.3-49.7 42.4-13.8 16.1-24.1 32.9-30.8 50.4-6.7 17.5-10.1 35.2-10.1 53.1L408 310c5.5-16.4 12.9-30.6 22-42.8 9.2-12.2 17.9-21 25.8-26.5 8-5.5 16.6-9.9 25.7-13.2 9.2-3.3 15.4-5 18.6-5.4 3.2-.3 5.7-.4 7.6-.4 26.7 0 45.2 7.9 55.6 23.6 6.5 9.5 9.7 23.9 9.7 43.3v56.6c-15.2.6-30.4 1.6-45.6 2.9zM573.1 500c0 16.6-2.2 31.7-6.5 45-9.2 29.1-26.7 47.4-52.4 54.8-22.4 6.6-43.7 3.3-63.9-9.8-21.5-14-32.2-33.8-32.2-59.3 0-19.9 5-36.9 15-51.1 10-14.1 23.3-24.7 40-31.7s33-12 49-14.9c15.9-3 33-4.8 51-5.4V500zm335.2 218.9c-4.3-5.4-15.9-8.9-34.9-10.7-19-1.8-35.5-1.7-49.7.4-15.3 1.8-31.1 6.2-47.3 13.4-16.3 7.1-23.4 13.1-21.6 17.8l.7 1.3.9.7 1.4.2h4.6c.8 0 1.8-.1 3.2-.2 1.4-.1 2.7-.3 3.9-.4 1.2-.1 2.9-.3 5.1-.4 2.1-.1 4.1-.4 6-.7.3 0 3.7-.3 10.3-.9 6.6-.6 11.4-1 14.3-1.3 2.9-.3 7.8-.6 14.5-.9 6.7-.3 12.1-.3 16.1 0 4 .3 8.5.7 13.6 1.1 5.1.4 9.2 1.3 12.4 2.7 3.2 1.3 5.6 3 7.1 5.1 5.2 6.6 4.2 21.2-3 43.9s-14 40.8-20.4 54.2c-2.8 5.7-2.8 9.2 0 10.7s6.7.1 11.9-4c15.6-12.2 28.6-30.6 39.1-55.3 6.1-14.6 10.5-29.8 13.1-45.7 2.4-15.9 2-26.2-1.3-31z")),t.AntCloudOutline=o("ant-cloud",s,r(a,"M378.9 738c-3.1 0-6.1-.5-8.8-1.5l4.4 30.7h26.3l-15.5-29.9c-2.1.5-4.2.7-6.4.7zm421-291.2c-12.6 0-24.8 1.5-36.5 4.2-21.4-38.4-62.3-64.3-109.3-64.3-6.9 0-13.6.6-20.2 1.6-35.4-77.4-113.4-131.1-203.9-131.1-112.3 0-205.3 82.6-221.6 190.4C127.3 455.5 64 523.8 64 607c0 88.4 71.6 160.1 160 160.2h50l13.2-27.6c-26.2-8.3-43.3-29-39.1-48.8 4.6-21.6 32.8-33.9 63.1-27.5 22.9 4.9 40.4 19.1 45.5 35.1a26.1 26.1 0 0 1 22.1-12.4h.2c-.8-3.2-1.2-6.5-1.2-9.9 0-20.1 14.8-36.7 34.1-39.6v-25.4c0-4.4 3.6-8 8-8s8 3.6 8 8v26.3c4.6 1.2 8.8 3.2 12.6 5.8l19.5-21.4c3-3.3 8-3.5 11.3-.5 3.3 3 3.5 8 .5 11.3l-20 22-.2.2a40 40 0 0 1-46.9 59.2c-.4 5.6-2.6 10.7-6 14.8l20 38.4H804v-.1c86.5-2.2 156-73 156-160.1 0-88.5-71.7-160.2-160.1-160.2zM338.2 737.2l-4.3 30h24.4l-5.9-41.5c-3.5 4.6-8.3 8.5-14.2 11.5zM797.5 305a48 48 0 1 0 96 0 48 48 0 1 0-96 0zm-65.7 61.3a24 24 0 1 0 48 0 24 24 0 1 0-48 0zM303.4 742.9l-11.6 24.3h26l3.5-24.7c-5.7.8-11.7 1-17.9.4z")),t.AntDesignOutline=o("ant-design",s,r(a,"M716.3 313.8c19-18.9 19-49.7 0-68.6l-69.9-69.9.1.1c-18.5-18.5-50.3-50.3-95.3-95.2-21.2-20.7-55.5-20.5-76.5.5L80.9 474.2a53.84 53.84 0 0 0 0 76.4L474.6 944a54.14 54.14 0 0 0 76.5 0l165.1-165c19-18.9 19-49.7 0-68.6a48.7 48.7 0 0 0-68.7 0l-125 125.2c-5.2 5.2-13.3 5.2-18.5 0L189.5 521.4c-5.2-5.2-5.2-13.3 0-18.5l314.4-314.2c.4-.4.9-.7 1.3-1.1 5.2-4.1 12.4-3.7 17.2 1.1l125.2 125.1c19 19 49.8 19 68.7 0zM408.6 514.4a106.3 106.2 0 1 0 212.6 0 106.3 106.2 0 1 0-212.6 0zm536.2-38.6L821.9 353.5c-19-18.9-49.8-18.9-68.7.1a48.4 48.4 0 0 0 0 68.6l83 82.9c5.2 5.2 5.2 13.3 0 18.5l-81.8 81.7a48.4 48.4 0 0 0 0 68.6 48.7 48.7 0 0 0 68.7 0l121.8-121.7a53.93 53.93 0 0 0-.1-76.4z")),t.ApartmentOutline=o("apartment",s,r(a,"M908 640H804V488c0-4.4-3.6-8-8-8H548v-96h108c8.8 0 16-7.2 16-16V80c0-8.8-7.2-16-16-16H368c-8.8 0-16 7.2-16 16v288c0 8.8 7.2 16 16 16h108v96H228c-4.4 0-8 3.6-8 8v152H116c-8.8 0-16 7.2-16 16v288c0 8.8 7.2 16 16 16h288c8.8 0 16-7.2 16-16V656c0-8.8-7.2-16-16-16H292v-88h440v88H620c-8.8 0-16 7.2-16 16v288c0 8.8 7.2 16 16 16h288c8.8 0 16-7.2 16-16V656c0-8.8-7.2-16-16-16zm-564 76v168H176V716h168zm84-408V140h168v168H428zm420 576H680V716h168v168z")),t.AreaChartOutline=o("area-chart",s,r(a,"M888 792H200V168c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v688c0 4.4 3.6 8 8 8h752c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-616-64h536c4.4 0 8-3.6 8-8V284c0-7.2-8.7-10.7-13.7-5.7L592 488.6l-125.4-124a8.03 8.03 0 0 0-11.3 0l-189 189.6a7.87 7.87 0 0 0-2.3 5.6V720c0 4.4 3.6 8 8 8z")),t.ArrowDownOutline=o("arrow-down",s,r(a,"M862 465.3h-81c-4.6 0-9 2-12.1 5.5L550 723.1V160c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v563.1L255.1 470.8c-3-3.5-7.4-5.5-12.1-5.5h-81c-6.8 0-10.5 8.1-6 13.2L487.9 861a31.96 31.96 0 0 0 48.3 0L868 478.5c4.5-5.2.8-13.2-6-13.2z")),t.ArrowLeftOutline=o("arrow-left",s,r(a,"M872 474H286.9l350.2-304c5.6-4.9 2.2-14-5.2-14h-88.5c-3.9 0-7.6 1.4-10.5 3.9L155 487.8a31.96 31.96 0 0 0 0 48.3L535.1 866c1.5 1.3 3.3 2 5.2 2h91.5c7.4 0 10.8-9.2 5.2-14L286.9 550H872c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8z")),t.ArrowRightOutline=o("arrow-right",s,r(a,"M869 487.8L491.2 159.9c-2.9-2.5-6.6-3.9-10.5-3.9h-88.5c-7.4 0-10.8 9.2-5.2 14l350.2 304H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h585.1L386.9 854c-5.6 4.9-2.2 14 5.2 14h91.5c1.9 0 3.8-.7 5.2-2L869 536.2a32.07 32.07 0 0 0 0-48.4z")),t.ArrowsAltOutline=o("arrows-alt",s,r(a,"M855 160.1l-189.2 23.5c-6.6.8-9.3 8.8-4.7 13.5l54.7 54.7-153.5 153.5a8.03 8.03 0 0 0 0 11.3l45.1 45.1c3.1 3.1 8.2 3.1 11.3 0l153.6-153.6 54.7 54.7a7.94 7.94 0 0 0 13.5-4.7L863.9 169a7.9 7.9 0 0 0-8.9-8.9zM416.6 562.3a8.03 8.03 0 0 0-11.3 0L251.8 715.9l-54.7-54.7a7.94 7.94 0 0 0-13.5 4.7L160.1 855c-.6 5.2 3.7 9.5 8.9 8.9l189.2-23.5c6.6-.8 9.3-8.8 4.7-13.5l-54.7-54.7 153.6-153.6c3.1-3.1 3.1-8.2 0-11.3l-45.2-45z")),t.ArrowUpOutline=o("arrow-up",s,r(a,"M868 545.5L536.1 163a31.96 31.96 0 0 0-48.3 0L156 545.5a7.97 7.97 0 0 0 6 13.2h81c4.6 0 9-2 12.1-5.5L474 300.9V864c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V300.9l218.9 252.3c3 3.5 7.4 5.5 12.1 5.5h81c6.8 0 10.5-8 6-13.2z")),t.AuditOutline=o("audit",s,r(a,"M296 250c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h384c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H296zm184 144H296c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zm-48 458H208V148h560v320c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V108c0-17.7-14.3-32-32-32H168c-17.7 0-32 14.3-32 32v784c0 17.7 14.3 32 32 32h264c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm440-88H728v-36.6c46.3-13.8 80-56.6 80-107.4 0-61.9-50.1-112-112-112s-112 50.1-112 112c0 50.7 33.7 93.6 80 107.4V764H520c-8.8 0-16 7.2-16 16v152c0 8.8 7.2 16 16 16h352c8.8 0 16-7.2 16-16V780c0-8.8-7.2-16-16-16zM646 620c0-27.6 22.4-50 50-50s50 22.4 50 50-22.4 50-50 50-50-22.4-50-50zm180 266H566v-60h260v60z")),t.BarChartOutline=o("bar-chart",s,r(a,"M888 792H200V168c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v688c0 4.4 3.6 8 8 8h752c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-600-80h56c4.4 0 8-3.6 8-8V560c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v144c0 4.4 3.6 8 8 8zm152 0h56c4.4 0 8-3.6 8-8V384c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v320c0 4.4 3.6 8 8 8zm152 0h56c4.4 0 8-3.6 8-8V462c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v242c0 4.4 3.6 8 8 8zm152 0h56c4.4 0 8-3.6 8-8V304c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v400c0 4.4 3.6 8 8 8z")),t.BarcodeOutline=o("barcode",s,r(a,"M120 160H72c-4.4 0-8 3.6-8 8v688c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V168c0-4.4-3.6-8-8-8zm833 0h-48c-4.4 0-8 3.6-8 8v688c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V168c0-4.4-3.6-8-8-8zM200 736h112c4.4 0 8-3.6 8-8V168c0-4.4-3.6-8-8-8H200c-4.4 0-8 3.6-8 8v560c0 4.4 3.6 8 8 8zm321 0h48c4.4 0 8-3.6 8-8V168c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v560c0 4.4 3.6 8 8 8zm126 0h178c4.4 0 8-3.6 8-8V168c0-4.4-3.6-8-8-8H647c-4.4 0-8 3.6-8 8v560c0 4.4 3.6 8 8 8zm-255 0h48c4.4 0 8-3.6 8-8V168c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v560c0 4.4 3.6 8 8 8zm-79 64H201c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h112c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zm257 0h-48c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zm256 0H648c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h178c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zm-385 0h-48c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8z")),t.BarsOutline=o("bars",s,r(i,"M123.80000000000001 256.8a63 63 0 1 0 126 0 63 63 0 1 0-126 0zM855.7 285.8H357.9c-19.9 0-36.1-16.2-36.1-36.1 0-19.9 16.2-36.1 36.1-36.1h497.9c19.9 0 36.1 16.2 36.1 36.1-.1 20-16.2 36.1-36.2 36.1zM123.80000000000001 512a63 63 0 1 0 126 0 63 63 0 1 0-126 0zM855.7 541.1H357.9c-19.9 0-36.1-16.2-36.1-36.1 0-19.9 16.2-36.1 36.1-36.1h497.9c19.9 0 36.1 16.2 36.1 36.1a36.23 36.23 0 0 1-36.2 36.1zM123.80000000000001 767.2a63 63 0 1 0 126 0 63 63 0 1 0-126 0zM855.7 796.3H357.9c-19.9 0-36.1-16.2-36.1-36.1 0-19.9 16.2-36.1 36.1-36.1h497.9c19.9 0 36.1 16.2 36.1 36.1-.1 20-16.2 36.1-36.2 36.1z")),t.BehanceOutline=o("behance",s,r(a,"M634 294.3h199.5v48.4H634zM434.1 485.8c44.1-21.1 67.2-53.2 67.2-102.8 0-98.1-73-121.9-157.3-121.9H112v492.4h238.5c89.4 0 173.3-43 173.3-143 0-61.8-29.2-107.5-89.7-124.7zM220.2 345.1h101.5c39.1 0 74.2 10.9 74.2 56.3 0 41.8-27.3 58.6-66 58.6H220.2V345.1zm115.5 324.8H220.1V534.3H338c47.6 0 77.7 19.9 77.7 70.3 0 49.6-35.9 65.3-80 65.3zm575.8-89.5c0-105.5-61.7-193.4-173.3-193.4-108.5 0-182.3 81.7-182.3 188.8 0 111 69.9 187.2 182.3 187.2 85.1 0 140.2-38.3 166.7-120h-86.3c-9.4 30.5-47.6 46.5-77.3 46.5-57.4 0-87.4-33.6-87.4-90.7h256.9c.3-5.9.7-12.1.7-18.4zM653.9 537c3.1-46.9 34.4-76.2 81.2-76.2 49.2 0 73.8 28.9 78.1 76.2H653.9z"));t.BgColorsOutline=o("bg-colors",s,r(a,"M766.4 744.3c43.7 0 79.4-36.2 79.4-80.5 0-53.5-79.4-140.8-79.4-140.8S687 610.3 687 663.8c0 44.3 35.7 80.5 79.4 80.5zm-377.1-44.1c7.1 7.1 18.6 7.1 25.6 0l256.1-256c7.1-7.1 7.1-18.6 0-25.6l-256-256c-.6-.6-1.3-1.2-2-1.7l-78.2-78.2a9.11 9.11 0 0 0-12.8 0l-48 48a9.11 9.11 0 0 0 0 12.8l67.2 67.2-207.8 207.9c-7.1 7.1-7.1 18.6 0 25.6l255.9 256zm12.9-448.6l178.9 178.9H223.4l178.8-178.9zM904 816H120c-4.4 0-8 3.6-8 8v80c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-80c0-4.4-3.6-8-8-8z")),t.BlockOutline=o("block",s,r(a,"M856 376H648V168c0-8.8-7.2-16-16-16H168c-8.8 0-16 7.2-16 16v464c0 8.8 7.2 16 16 16h208v208c0 8.8 7.2 16 16 16h464c8.8 0 16-7.2 16-16V392c0-8.8-7.2-16-16-16zm-480 16v188H220V220h360v156H392c-8.8 0-16 7.2-16 16zm204 52v136H444V444h136zm224 360H444V648h188c8.8 0 16-7.2 16-16V444h156v360z")),t.BoldOutline=o("bold",s,r(a,"M697.8 481.4c33.6-35 54.2-82.3 54.2-134.3v-10.2C752 229.3 663.9 142 555.3 142H259.4c-15.1 0-27.4 12.3-27.4 27.4v679.1c0 16.3 13.2 29.5 29.5 29.5h318.7c117 0 211.8-94.2 211.8-210.5v-11c0-73-37.4-137.3-94.2-175.1zM328 238h224.7c57.1 0 103.3 44.4 103.3 99.3v9.5c0 54.8-46.3 99.3-103.3 99.3H328V238zm366.6 429.4c0 62.9-51.7 113.9-115.5 113.9H328V542.7h251.1c63.8 0 115.5 51 115.5 113.9v10.8z")),t.BorderBottomOutline=o("border-bottom",s,r(a,"M872 808H152c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h720c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-720-94h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm0-498h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm0 332h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm0-166h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm166 166h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm0-332h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm332 0h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm0 332h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm222-72h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-388 72h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm388-404h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-388 72h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm388 426h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-388 72h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm388-404h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-388 72h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8z")),t.BorderHorizontalOutline=o("border-horizontal",s,r(a,"M540 144h-56c-4.4 0-8 3.6-8 8v720c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V152c0-4.4-3.6-8-8-8zm-166 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm498 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-664 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm498 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM208 310h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm664 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 332h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-664 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 166h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-332h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm664 332h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-332h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM374 808h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-332h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm332 332h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-332h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z")),t.BorderInnerOutline=o("border-inner",s,r(a,"M872 476H548V144h-72v332H152c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h324v332h72V548h324c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-166h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 498h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-664h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 498h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM650 216h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm56 592h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-332 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-56-592h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-166 0h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm56 592h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-56-426h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm56 260h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z")),t.BorderLeftOutline=o("border-left",s,r(a,"M208 144h-56c-4.4 0-8 3.6-8 8v720c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V152c0-4.4-3.6-8-8-8zm166 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm498 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-332 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm166 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM540 310h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm332 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 332h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-332 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 166h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-332h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm332 332h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-332h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM374 808h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-332h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm332 332h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-332h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z")),t.BorderOuterOutline=o("border-outer",s,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656zM484 366h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zM302 548h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm364 0h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-182 0h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm0 182h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8z")),t.BorderRightOutline=o("border-right",s,r(a,"M872 144h-56c-4.4 0-8 3.6-8 8v720c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V152c0-4.4-3.6-8-8-8zm-166 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-498 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm332 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-166 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm166 166h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-332 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 332h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm332 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 166h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-332h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM208 808h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-332h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm498 332h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-332h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM374 808h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-332h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z")),t.BorderTopOutline=o("border-top",s,r(a,"M872 144H152c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h720c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM208 310h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 498h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-332h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 166h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm166-166h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 332h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm332 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-332h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm166 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-332 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm332 332h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-332 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm332-498h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-332 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm332 332h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-332 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z")),t.BorderVerticleOutline=o("border-verticle",s,r(a,"M872 476H152c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h720c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-166h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 498h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-664h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 498h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM650 216h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm56 592h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-332 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-56-592h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-166 0h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm332 0h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zM208 808h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm332 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM152 382h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm332 0h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zM208 642h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm332 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z")),t.BorderOutline=o("border",s,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z")),t.BranchesOutline=o("branches",s,r(a,"M740 161c-61.8 0-112 50.2-112 112 0 50.1 33.1 92.6 78.5 106.9v95.9L320 602.4V318.1c44.2-15 76-56.9 76-106.1 0-61.8-50.2-112-112-112s-112 50.2-112 112c0 49.2 31.8 91 76 106.1V706c-44.2 15-76 56.9-76 106.1 0 61.8 50.2 112 112 112s112-50.2 112-112c0-49.2-31.8-91-76-106.1v-27.8l423.5-138.7a50.52 50.52 0 0 0 34.9-48.2V378.2c42.9-15.8 73.6-57 73.6-105.2 0-61.8-50.2-112-112-112zm-504 51a48.01 48.01 0 0 1 96 0 48.01 48.01 0 0 1-96 0zm96 600a48.01 48.01 0 0 1-96 0 48.01 48.01 0 0 1 96 0zm408-491a48.01 48.01 0 0 1 0-96 48.01 48.01 0 0 1 0 96z")),t.CheckOutline=o("check",s,r(a,"M912 190h-69.9c-9.8 0-19.1 4.5-25.1 12.2L404.7 724.5 207 474a32 32 0 0 0-25.1-12.2H112c-6.7 0-10.4 7.7-6.3 12.9l273.9 347c12.8 16.2 37.4 16.2 50.3 0l488.4-618.9c4.1-5.1.4-12.8-6.3-12.8z")),t.CiOutline=o("ci",s,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372zm218-572.1h-50.4c-4.4 0-8 3.6-8 8v384.2c0 4.4 3.6 8 8 8H730c4.4 0 8-3.6 8-8V319.9c0-4.4-3.6-8-8-8zm-281.4 49.6c49.5 0 83.1 31.5 87 77.6.4 4.2 3.8 7.4 8 7.4h52.6c2.4 0 4.4-2 4.4-4.4 0-81.2-64-138.1-152.3-138.1C345.4 304 286 373.5 286 488.4v49c0 114 59.4 182.6 162.3 182.6 88 0 152.3-55.1 152.3-132.5 0-2.4-2-4.4-4.4-4.4h-52.7c-4.2 0-7.6 3.2-8 7.3-4.2 43-37.7 72.4-87 72.4-61.1 0-95.6-44.9-95.6-125.2v-49.3c.1-81.4 34.6-126.8 95.7-126.8z")),t.CloseOutline=o("close",s,r(a,"M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 0 0 203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z")),t.CloudDownloadOutline=o("cloud-download",s,r(a,"M624 706.3h-74.1V464c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v242.3H400c-6.7 0-10.4 7.7-6.3 12.9l112 141.7a8 8 0 0 0 12.6 0l112-141.7c4.1-5.2.4-12.9-6.3-12.9z","M811.4 366.7C765.6 245.9 648.9 160 512.2 160S258.8 245.8 213 366.6C127.3 389.1 64 467.2 64 560c0 110.5 89.5 200 199.9 200H304c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8h-40.1c-33.7 0-65.4-13.4-89-37.7-23.5-24.2-36-56.8-34.9-90.6.9-26.4 9.9-51.2 26.2-72.1 16.7-21.3 40.1-36.8 66.1-43.7l37.9-9.9 13.9-36.6c8.6-22.8 20.6-44.1 35.7-63.4a245.6 245.6 0 0 1 52.4-49.9c41.1-28.9 89.5-44.2 140-44.2s98.9 15.3 140 44.2c19.9 14 37.5 30.8 52.4 49.9 15.1 19.3 27.1 40.7 35.7 63.4l13.8 36.5 37.8 10C846.1 454.5 884 503.8 884 560c0 33.1-12.9 64.3-36.3 87.7a123.07 123.07 0 0 1-87.6 36.3H720c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h40.1C870.5 760 960 670.5 960 560c0-92.7-63.1-170.7-148.6-193.3z")),t.CloudServerOutline=o("cloud-server",s,r(a,"M704 446H320c-4.4 0-8 3.6-8 8v402c0 4.4 3.6 8 8 8h384c4.4 0 8-3.6 8-8V454c0-4.4-3.6-8-8-8zm-328 64h272v117H376V510zm272 290H376V683h272v117z","M424 748a32 32 0 1 0 64 0 32 32 0 1 0-64 0zM424 570a32 32 0 1 0 64 0 32 32 0 1 0-64 0z","M811.4 368.9C765.6 248 648.9 162 512.2 162S258.8 247.9 213 368.8C126.9 391.5 63.5 470.2 64 563.6 64.6 668 145.6 752.9 247.6 762c4.7.4 8.7-3.3 8.7-8v-60.4c0-4-3-7.4-7-7.9-27-3.4-52.5-15.2-72.1-34.5-24-23.5-37.2-55.1-37.2-88.6 0-28 9.1-54.4 26.2-76.4 16.7-21.4 40.2-36.9 66.1-43.7l37.9-10 13.9-36.7c8.6-22.8 20.6-44.2 35.7-63.5 14.9-19.2 32.6-36 52.4-50 41.1-28.9 89.5-44.2 140-44.2s98.9 15.3 140 44.3c19.9 14 37.5 30.8 52.4 50 15.1 19.3 27.1 40.7 35.7 63.5l13.8 36.6 37.8 10c54.2 14.4 92.1 63.7 92.1 120 0 33.6-13.2 65.1-37.2 88.6-19.5 19.2-44.9 31.1-71.9 34.5-4 .5-6.9 3.9-6.9 7.9V754c0 4.7 4.1 8.4 8.8 8 101.7-9.2 182.5-94 183.2-198.2.6-93.4-62.7-172.1-148.6-194.9z")),t.CloudSyncOutline=o("cloud-sync",s,r(a,"M811.4 368.9C765.6 248 648.9 162 512.2 162S258.8 247.9 213 368.8C126.9 391.5 63.5 470.2 64 563.6 64.6 668 145.6 752.9 247.6 762c4.7.4 8.7-3.3 8.7-8v-60.4c0-4-3-7.4-7-7.9-27-3.4-52.5-15.2-72.1-34.5-24-23.5-37.2-55.1-37.2-88.6 0-28 9.1-54.4 26.2-76.4 16.7-21.4 40.2-36.9 66.1-43.7l37.9-10 13.9-36.7c8.6-22.8 20.6-44.2 35.7-63.5 14.9-19.2 32.6-36 52.4-50 41.1-28.9 89.5-44.2 140-44.2s98.9 15.3 140 44.3c19.9 14 37.5 30.8 52.4 50 15.1 19.3 27.1 40.7 35.7 63.5l13.8 36.6 37.8 10c54.2 14.4 92.1 63.7 92.1 120 0 33.6-13.2 65.1-37.2 88.6-19.5 19.2-44.9 31.1-71.9 34.5-4 .5-6.9 3.9-6.9 7.9V754c0 4.7 4.1 8.4 8.8 8 101.7-9.2 182.5-94 183.2-198.2.6-93.4-62.7-172.1-148.6-194.9z","M376.9 656.4c1.8-33.5 15.7-64.7 39.5-88.6 25.4-25.5 60-39.8 96-39.8 36.2 0 70.3 14.1 96 39.8 1.4 1.4 2.7 2.8 4.1 4.3l-25 19.6a8 8 0 0 0 3 14.1l98.2 24c5 1.2 9.9-2.6 9.9-7.7l.5-101.3c0-6.7-7.6-10.5-12.9-6.3L663 532.7c-36.6-42-90.4-68.6-150.5-68.6-107.4 0-195 85.1-199.4 191.7-.2 4.5 3.4 8.3 8 8.3H369c4.2-.1 7.7-3.4 7.9-7.7zM703 664h-47.9c-4.2 0-7.7 3.3-8 7.6-1.8 33.5-15.7 64.7-39.5 88.6-25.4 25.5-60 39.8-96 39.8-36.2 0-70.3-14.1-96-39.8-1.4-1.4-2.7-2.8-4.1-4.3l25-19.6a8 8 0 0 0-3-14.1l-98.2-24c-5-1.2-9.9 2.6-9.9 7.7l-.4 101.4c0 6.7 7.6 10.5 12.9 6.3l23.2-18.2c36.6 42 90.4 68.6 150.5 68.6 107.4 0 195-85.1 199.4-191.7.2-4.5-3.4-8.3-8-8.3z")),t.CloudUploadOutline=o("cloud-upload",s,r(a,"M518.3 459a8 8 0 0 0-12.6 0l-112 141.7a7.98 7.98 0 0 0 6.3 12.9h73.9V856c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V613.7H624c6.7 0 10.4-7.7 6.3-12.9L518.3 459z","M811.4 366.7C765.6 245.9 648.9 160 512.2 160S258.8 245.8 213 366.6C127.3 389.1 64 467.2 64 560c0 110.5 89.5 200 199.9 200H304c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8h-40.1c-33.7 0-65.4-13.4-89-37.7-23.5-24.2-36-56.8-34.9-90.6.9-26.4 9.9-51.2 26.2-72.1 16.7-21.3 40.1-36.8 66.1-43.7l37.9-9.9 13.9-36.6c8.6-22.8 20.6-44.1 35.7-63.4a245.6 245.6 0 0 1 52.4-49.9c41.1-28.9 89.5-44.2 140-44.2s98.9 15.3 140 44.2c19.9 14 37.5 30.8 52.4 49.9 15.1 19.3 27.1 40.7 35.7 63.4l13.8 36.5 37.8 10C846.1 454.5 884 503.8 884 560c0 33.1-12.9 64.3-36.3 87.7a123.07 123.07 0 0 1-87.6 36.3H720c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h40.1C870.5 760 960 670.5 960 560c0-92.7-63.1-170.7-148.6-193.3z")),t.ClusterOutline=o("cluster",s,r(a,"M888 680h-54V540H546v-92h238c8.8 0 16-7.2 16-16V168c0-8.8-7.2-16-16-16H240c-8.8 0-16 7.2-16 16v264c0 8.8 7.2 16 16 16h238v92H190v140h-54c-4.4 0-8 3.6-8 8v176c0 4.4 3.6 8 8 8h176c4.4 0 8-3.6 8-8V688c0-4.4-3.6-8-8-8h-54v-72h220v72h-54c-4.4 0-8 3.6-8 8v176c0 4.4 3.6 8 8 8h176c4.4 0 8-3.6 8-8V688c0-4.4-3.6-8-8-8h-54v-72h220v72h-54c-4.4 0-8 3.6-8 8v176c0 4.4 3.6 8 8 8h176c4.4 0 8-3.6 8-8V688c0-4.4-3.6-8-8-8zM256 805.3c0 1.5-1.2 2.7-2.7 2.7h-58.7c-1.5 0-2.7-1.2-2.7-2.7v-58.7c0-1.5 1.2-2.7 2.7-2.7h58.7c1.5 0 2.7 1.2 2.7 2.7v58.7zm288 0c0 1.5-1.2 2.7-2.7 2.7h-58.7c-1.5 0-2.7-1.2-2.7-2.7v-58.7c0-1.5 1.2-2.7 2.7-2.7h58.7c1.5 0 2.7 1.2 2.7 2.7v58.7zM288 384V216h448v168H288zm544 421.3c0 1.5-1.2 2.7-2.7 2.7h-58.7c-1.5 0-2.7-1.2-2.7-2.7v-58.7c0-1.5 1.2-2.7 2.7-2.7h58.7c1.5 0 2.7 1.2 2.7 2.7v58.7zM360 300a40 40 0 1 0 80 0 40 40 0 1 0-80 0z")),t.CodeSandboxOutline=o("code-sandbox",s,r(a,"M709.6 210l.4-.2h.2L512 96 313.9 209.8h-.2l.7.3L151.5 304v416L512 928l360.5-208V304l-162.9-94zM482.7 843.6L339.6 761V621.4L210 547.8V372.9l272.7 157.3v313.4zM238.2 321.5l134.7-77.8 138.9 79.7 139.1-79.9 135.2 78-273.9 158-274-158zM814 548.3l-128.8 73.1v139.1l-143.9 83V530.4L814 373.1v175.2z")),t.PoundCircleFill=o("pound-circle",c,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm146 658c0 4.4-3.6 8-8 8H376.2c-4.4 0-8-3.6-8-8v-38.5c0-3.7 2.5-6.9 6.1-7.8 44-10.9 72.8-49 72.8-94.2 0-14.7-2.5-29.4-5.9-44.2H374c-4.4 0-8-3.6-8-8v-30c0-4.4 3.6-8 8-8h53.7c-7.8-25.1-14.6-50.7-14.6-77.1 0-75.8 58.6-120.3 151.5-120.3 26.5 0 51.4 5.5 70.3 12.7 3.1 1.2 5.2 4.2 5.2 7.5v39.5a8 8 0 0 1-10.6 7.6c-17.9-6.4-39-10.5-60.4-10.5-53.3 0-87.3 26.6-87.3 70.2 0 24.7 6.2 47.9 13.4 70.5h112c4.4 0 8 3.6 8 8v30c0 4.4-3.6 8-8 8h-98.6c3.1 13.2 5.3 26.9 5.3 41 0 40.7-16.5 73.9-43.9 91.1v4.7h180c4.4 0 8 3.6 8 8V722z")),t.CodepenOutline=o("codepen",s,r(a,"M911.7 385.3l-.3-1.5c-.2-1-.3-1.9-.6-2.9-.2-.6-.4-1.1-.5-1.7-.3-.8-.5-1.7-.9-2.5-.2-.6-.5-1.1-.8-1.7-.4-.8-.8-1.5-1.2-2.3-.3-.5-.6-1.1-1-1.6-.8-1.2-1.7-2.4-2.6-3.6-.5-.6-1.1-1.3-1.7-1.9-.4-.5-.9-.9-1.4-1.3-.6-.6-1.3-1.1-1.9-1.6-.5-.4-1-.8-1.6-1.2-.2-.1-.4-.3-.6-.4L531.1 117.8a34.3 34.3 0 0 0-38.1 0L127.3 361.3c-.2.1-.4.3-.6.4-.5.4-1 .8-1.6 1.2-.7.5-1.3 1.1-1.9 1.6-.5.4-.9.9-1.4 1.3-.6.6-1.2 1.2-1.7 1.9-1 1.1-1.8 2.3-2.6 3.6-.3.5-.7 1-1 1.6-.4.7-.8 1.5-1.2 2.3-.3.5-.5 1.1-.8 1.7-.3.8-.6 1.7-.9 2.5-.2.6-.4 1.1-.5 1.7-.2.9-.4 1.9-.6 2.9l-.3 1.5c-.2 1.5-.3 3-.3 4.5v243.5c0 1.5.1 3 .3 4.5l.3 1.5.6 2.9c.2.6.3 1.1.5 1.7.3.9.6 1.7.9 2.5.2.6.5 1.1.8 1.7.4.8.7 1.5 1.2 2.3.3.5.6 1.1 1 1.6.5.7.9 1.4 1.5 2.1l1.2 1.5c.5.6 1.1 1.3 1.7 1.9.4.5.9.9 1.4 1.3.6.6 1.3 1.1 1.9 1.6.5.4 1 .8 1.6 1.2.2.1.4.3.6.4L493 905.7c5.6 3.8 12.3 5.8 19.1 5.8 6.6 0 13.3-1.9 19.1-5.8l365.6-243.5c.2-.1.4-.3.6-.4.5-.4 1-.8 1.6-1.2.7-.5 1.3-1.1 1.9-1.6.5-.4.9-.9 1.4-1.3.6-.6 1.2-1.2 1.7-1.9l1.2-1.5 1.5-2.1c.3-.5.7-1 1-1.6.4-.8.8-1.5 1.2-2.3.3-.5.5-1.1.8-1.7.3-.8.6-1.7.9-2.5.2-.5.4-1.1.5-1.7.3-.9.4-1.9.6-2.9l.3-1.5c.2-1.5.3-3 .3-4.5V389.8c-.3-1.5-.4-3-.6-4.5zM546.4 210.5l269.4 179.4-120.3 80.4-149-99.6V210.5zm-68.8 0v160.2l-149 99.6-120.3-80.4 269.3-179.4zM180.7 454.1l86 57.5-86 57.5v-115zm296.9 358.5L208.3 633.2l120.3-80.4 149 99.6v160.2zM512 592.8l-121.6-81.2L512 430.3l121.6 81.2L512 592.8zm34.4 219.8V652.4l149-99.6 120.3 80.4-269.3 179.4zM843.3 569l-86-57.5 86-57.5v115z")),t.ColumHeightOutline=o("colum-height",s,r(a,"M840 836H184c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h656c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zm0-724H184c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h656c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zM610.8 378c6 0 9.4-7 5.7-11.7L515.7 238.7a7.14 7.14 0 0 0-11.3 0L403.6 366.3a7.23 7.23 0 0 0 5.7 11.7H476v268h-62.8c-6 0-9.4 7-5.7 11.7l100.8 127.5c2.9 3.7 8.5 3.7 11.3 0l100.8-127.5c3.7-4.7.4-11.7-5.7-11.7H548V378h62.8z")),t.CoffeeOutline=o("coffee",s,r(i,"M275 281c19.9 0 36-16.1 36-36V36c0-19.9-16.1-36-36-36s-36 16.1-36 36v209c0 19.9 16.1 36 36 36zm613 144H768c0-39.8-32.2-72-72-72H200c-39.8 0-72 32.2-72 72v248c0 3.4.2 6.7.7 9.9-.5 7-.7 14-.7 21.1 0 176.7 143.3 320 320 320 160.1 0 292.7-117.5 316.3-271H888c39.8 0 72-32.2 72-72V497c0-39.8-32.2-72-72-72zM696 681h-1.1c.7 7.6 1.1 15.2 1.1 23 0 137-111 248-248 248S200 841 200 704c0-7.8.4-15.4 1.1-23H200V425h496v256zm192-8H776V497h112v176zM613 281c19.9 0 36-16.1 36-36V36c0-19.9-16.1-36-36-36s-36 16.1-36 36v209c0 19.9 16.1 36 36 36zm-170 0c19.9 0 36-16.1 36-36V36c0-19.9-16.1-36-36-36s-36 16.1-36 36v209c0 19.9 16.1 36 36 36z")),t.ColumnWidthOutline=o("column-width",s,r(a,"M180 176h-60c-4.4 0-8 3.6-8 8v656c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V184c0-4.4-3.6-8-8-8zm724 0h-60c-4.4 0-8 3.6-8 8v656c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V184c0-4.4-3.6-8-8-8zM785.3 504.3L657.7 403.6a7.23 7.23 0 0 0-11.7 5.7V476H378v-62.8c0-6-7-9.4-11.7-5.7L238.7 508.3a7.14 7.14 0 0 0 0 11.3l127.5 100.8c4.7 3.7 11.7.4 11.7-5.7V548h268v62.8c0 6 7 9.4 11.7 5.7l127.5-100.8c3.8-2.9 3.8-8.5.2-11.4z")),t.CopyrightOutline=o("copyright",s,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372zm5.6-532.7c53 0 89 33.8 93 83.4.3 4.2 3.8 7.4 8 7.4h56.7c2.6 0 4.7-2.1 4.7-4.7 0-86.7-68.4-147.4-162.7-147.4C407.4 290 344 364.2 344 486.8v52.3C344 660.8 407.4 734 517.3 734c94 0 162.7-58.8 162.7-141.4 0-2.6-2.1-4.7-4.7-4.7h-56.8c-4.2 0-7.6 3.2-8 7.3-4.2 46.1-40.1 77.8-93 77.8-65.3 0-102.1-47.9-102.1-133.6v-52.6c.1-87 37-135.5 102.2-135.5z")),t.DashOutline=o("dash",s,r(a,"M112 476h160v72H112zm320 0h160v72H432zm320 0h160v72H752z")),t.DeploymentUnitOutline=o("deployment-unit",s,r(a,"M888.3 693.2c-42.5-24.6-94.3-18-129.2 12.8l-53-30.7V523.6c0-15.7-8.4-30.3-22-38.1l-136-78.3v-67.1c44.2-15 76-56.8 76-106.1 0-61.9-50.1-112-112-112s-112 50.1-112 112c0 49.3 31.8 91.1 76 106.1v67.1l-136 78.3c-13.6 7.8-22 22.4-22 38.1v151.6l-53 30.7c-34.9-30.8-86.8-37.4-129.2-12.8-53.5 31-71.7 99.4-41 152.9 30.8 53.5 98.9 71.9 152.2 41 42.5-24.6 62.7-73 53.6-118.8l48.7-28.3 140.6 81c6.8 3.9 14.4 5.9 22 5.9s15.2-2 22-5.9L674.5 740l48.7 28.3c-9.1 45.7 11.2 94.2 53.6 118.8 53.3 30.9 121.5 12.6 152.2-41 30.8-53.6 12.6-122-40.7-152.9zm-673 138.4a47.6 47.6 0 0 1-65.2-17.6c-13.2-22.9-5.4-52.3 17.5-65.5a47.6 47.6 0 0 1 65.2 17.6c13.2 22.9 5.4 52.3-17.5 65.5zM522 463.8zM464 234a48.01 48.01 0 0 1 96 0 48.01 48.01 0 0 1-96 0zm170 446.2l-122 70.3-122-70.3V539.8l122-70.3 122 70.3v140.4zm239.9 133.9c-13.2 22.9-42.4 30.8-65.2 17.6-22.8-13.2-30.7-42.6-17.5-65.5s42.4-30.8 65.2-17.6c22.9 13.2 30.7 42.5 17.5 65.5z")),t.DesktopOutline=o("desktop",s,r(a,"M928 140H96c-17.7 0-32 14.3-32 32v496c0 17.7 14.3 32 32 32h380v112H304c-8.8 0-16 7.2-16 16v48c0 4.4 3.6 8 8 8h432c4.4 0 8-3.6 8-8v-48c0-8.8-7.2-16-16-16H548V700h380c17.7 0 32-14.3 32-32V172c0-17.7-14.3-32-32-32zm-40 488H136V212h752v416z")),t.DingdingOutline=o("dingding",s,r(a,"M573.7 252.5C422.5 197.4 201.3 96.7 201.3 96.7c-15.7-4.1-17.9 11.1-17.9 11.1-5 61.1 33.6 160.5 53.6 182.8 19.9 22.3 319.1 113.7 319.1 113.7S326 357.9 270.5 341.9c-55.6-16-37.9 17.8-37.9 17.8 11.4 61.7 64.9 131.8 107.2 138.4 42.2 6.6 220.1 4 220.1 4s-35.5 4.1-93.2 11.9c-42.7 5.8-97 12.5-111.1 17.8-33.1 12.5 24 62.6 24 62.6 84.7 76.8 129.7 50.5 129.7 50.5 33.3-10.7 61.4-18.5 85.2-24.2L565 743.1h84.6L603 928l205.3-271.9H700.8l22.3-38.7c.3.5.4.8.4.8S799.8 496.1 829 433.8l.6-1h-.1c5-10.8 8.6-19.7 10-25.8 17-71.3-114.5-99.4-265.8-154.5z")),t.DisconnectOutline=o("disconnect",s,r(a,"M832.6 191.4c-84.6-84.6-221.5-84.6-306 0l-96.9 96.9 51 51 96.9-96.9c53.8-53.8 144.6-59.5 204 0 59.5 59.5 53.8 150.2 0 204l-96.9 96.9 51.1 51.1 96.9-96.9c84.4-84.6 84.4-221.5-.1-306.1zM446.5 781.6c-53.8 53.8-144.6 59.5-204 0-59.5-59.5-53.8-150.2 0-204l96.9-96.9-51.1-51.1-96.9 96.9c-84.6 84.6-84.6 221.5 0 306s221.5 84.6 306 0l96.9-96.9-51-51-96.8 97zM260.3 209.4a8.03 8.03 0 0 0-11.3 0L209.4 249a8.03 8.03 0 0 0 0 11.3l554.4 554.4c3.1 3.1 8.2 3.1 11.3 0l39.6-39.6c3.1-3.1 3.1-8.2 0-11.3L260.3 209.4z")),t.DollarOutline=o("dollar",s,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372zm47.7-395.2l-25.4-5.9V348.6c38 5.2 61.5 29 65.5 58.2.5 4 3.9 6.9 7.9 6.9h44.9c4.7 0 8.4-4.1 8-8.8-6.1-62.3-57.4-102.3-125.9-109.2V263c0-4.4-3.6-8-8-8h-28.1c-4.4 0-8 3.6-8 8v33c-70.8 6.9-126.2 46-126.2 119 0 67.6 49.8 100.2 102.1 112.7l24.7 6.3v142.7c-44.2-5.9-69-29.5-74.1-61.3-.6-3.8-4-6.6-7.9-6.6H363c-4.7 0-8.4 4-8 8.7 4.5 55 46.2 105.6 135.2 112.1V761c0 4.4 3.6 8 8 8h28.4c4.4 0 8-3.6 8-8.1l-.2-31.7c78.3-6.9 134.3-48.8 134.3-124-.1-69.4-44.2-100.4-109-116.4zm-68.6-16.2c-5.6-1.6-10.3-3.1-15-5-33.8-12.2-49.5-31.9-49.5-57.3 0-36.3 27.5-57 64.5-61.7v124zM534.3 677V543.3c3.1.9 5.9 1.6 8.8 2.2 47.3 14.4 63.2 34.4 63.2 65.1 0 39.1-29.4 62.6-72 66.4z")),t.DotChartOutline=o("dot-chart",s,r(a,"M888 792H200V168c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v688c0 4.4 3.6 8 8 8h752c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM288 604a64 64 0 1 0 128 0 64 64 0 1 0-128 0zm118-224a48 48 0 1 0 96 0 48 48 0 1 0-96 0zm158 228a96 96 0 1 0 192 0 96 96 0 1 0-192 0zm148-314a56 56 0 1 0 112 0 56 56 0 1 0-112 0z")),t.DoubleLeftOutline=o("double-left",s,r(a,"M272.9 512l265.4-339.1c4.1-5.2.4-12.9-6.3-12.9h-77.3c-4.9 0-9.6 2.3-12.6 6.1L186.8 492.3a31.99 31.99 0 0 0 0 39.5l255.3 326.1c3 3.9 7.7 6.1 12.6 6.1H532c6.7 0 10.4-7.7 6.3-12.9L272.9 512zm304 0l265.4-339.1c4.1-5.2.4-12.9-6.3-12.9h-77.3c-4.9 0-9.6 2.3-12.6 6.1L490.8 492.3a31.99 31.99 0 0 0 0 39.5l255.3 326.1c3 3.9 7.7 6.1 12.6 6.1H836c6.7 0 10.4-7.7 6.3-12.9L576.9 512z")),t.DoubleRightOutline=o("double-right",s,r(a,"M533.2 492.3L277.9 166.1c-3-3.9-7.7-6.1-12.6-6.1H188c-6.7 0-10.4 7.7-6.3 12.9L447.1 512 181.7 851.1A7.98 7.98 0 0 0 188 864h77.3c4.9 0 9.6-2.3 12.6-6.1l255.3-326.1c9.1-11.7 9.1-27.9 0-39.5zm304 0L581.9 166.1c-3-3.9-7.7-6.1-12.6-6.1H492c-6.7 0-10.4 7.7-6.3 12.9L751.1 512 485.7 851.1A7.98 7.98 0 0 0 492 864h77.3c4.9 0 9.6-2.3 12.6-6.1l255.3-326.1c9.1-11.7 9.1-27.9 0-39.5z")),t.DownOutline=o("down",s,r(a,"M884 256h-75c-5.1 0-9.9 2.5-12.9 6.6L512 654.2 227.9 262.6c-3-4.1-7.8-6.6-12.9-6.6h-75c-6.5 0-10.3 7.4-6.5 12.7l352.6 486.1c12.8 17.6 39 17.6 51.7 0l352.6-486.1c3.9-5.3.1-12.7-6.4-12.7z")),t.DownloadOutline=o("download",s,r(a,"M505.7 661a8 8 0 0 0 12.6 0l112-141.7c4.1-5.2.4-12.9-6.3-12.9h-74.1V168c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v338.3H400c-6.7 0-10.4 7.7-6.3 12.9l112 141.8zM878 626h-60c-4.4 0-8 3.6-8 8v154H214V634c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v198c0 17.7 14.3 32 32 32h684c17.7 0 32-14.3 32-32V634c0-4.4-3.6-8-8-8z")),t.DragOutline=o("drag",s,r(a,"M909.3 506.3L781.7 405.6a7.23 7.23 0 0 0-11.7 5.7V476H548V254h64.8c6 0 9.4-7 5.7-11.7L517.7 114.7a7.14 7.14 0 0 0-11.3 0L405.6 242.3a7.23 7.23 0 0 0 5.7 11.7H476v222H254v-64.8c0-6-7-9.4-11.7-5.7L114.7 506.3a7.14 7.14 0 0 0 0 11.3l127.5 100.8c4.7 3.7 11.7.4 11.7-5.7V548h222v222h-64.8c-6 0-9.4 7-5.7 11.7l100.8 127.5c2.9 3.7 8.5 3.7 11.3 0l100.8-127.5c3.7-4.7.4-11.7-5.7-11.7H548V548h222v64.8c0 6 7 9.4 11.7 5.7l127.5-100.8a7.3 7.3 0 0 0 .1-11.4z")),t.DribbbleOutline=o("dribbble",s,r(a,"M512 96C282.6 96 96 282.6 96 512s186.6 416 416 416 416-186.6 416-416S741.4 96 512 96zm275.1 191.8c49.5 60.5 79.5 137.5 80.2 221.4-11.7-2.5-129.2-26.3-247.4-11.4-2.5-6.1-5-12.2-7.6-18.3-7.4-17.3-15.3-34.6-23.6-51.5C720 374.3 779.6 298 787.1 287.8zM512 157.2c90.3 0 172.8 33.9 235.5 89.5-6.4 9.1-59.9 81-186.2 128.4-58.2-107-122.7-194.8-132.6-208 27.3-6.6 55.2-9.9 83.3-9.9zM360.9 191c9.4 12.8 72.9 100.9 131.7 205.5C326.4 440.6 180 440 164.1 439.8c23.1-110.3 97.4-201.9 196.8-248.8zM156.7 512.5c0-3.6.1-7.3.2-10.9 15.5.3 187.7 2.5 365.2-50.6 10.2 19.9 19.9 40.1 28.8 60.3-4.7 1.3-9.4 2.7-14 4.2C353.6 574.9 256.1 736.4 248 750.1c-56.7-63-91.3-146.3-91.3-237.6zM512 867.8c-82.2 0-157.9-28-218.1-75 6.4-13.1 78.3-152 278.7-221.9l2.3-.8c49.9 129.6 70.5 238.3 75.8 269.5A350.46 350.46 0 0 1 512 867.8zm198.5-60.7c-3.6-21.6-22.5-125.6-69-253.3C752.9 536 850.7 565.2 862.8 569c-15.8 98.8-72.5 184.2-152.3 238.1z")),t.DropboxOutline=o("dropbox",s,r(a,"M64 556.9l264.2 173.5L512.5 577 246.8 412.7zm896-290.3zm0 0L696.8 95 512.5 248.5l265.2 164.2L512.5 577l184.3 153.4L960 558.8 777.7 412.7zM513 609.8L328.2 763.3l-79.4-51.5v57.8L513 928l263.7-158.4v-57.8l-78.9 51.5zM328.2 95L64 265.1l182.8 147.6 265.7-164.2zM64 556.9z")),t.EuroOutline=o("euro",s,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372zm117.7-588.6c-15.9-3.5-34.4-5.4-55.3-5.4-106.7 0-178.9 55.7-198.6 149.9H344c-4.4 0-8 3.6-8 8v27.2c0 4.4 3.6 8 8 8h26.4c-.3 4.1-.3 8.4-.3 12.8v36.9H344c-4.4 0-8 3.6-8 8V568c0 4.4 3.6 8 8 8h30.2c17.2 99.2 90.4 158 200.2 158 20.9 0 39.4-1.7 55.3-5.1 3.7-.8 6.4-4 6.4-7.8v-42.8c0-5-4.6-8.8-9.5-7.8-14.7 2.8-31.9 4.1-51.8 4.1-68.5 0-114.5-36.6-129.8-98.6h130.6c4.4 0 8-3.6 8-8v-27.2c0-4.4-3.6-8-8-8H439.2v-36c0-4.7 0-9.4.3-13.8h135.9c4.4 0 8-3.6 8-8v-27.2c0-4.4-3.6-8-8-8H447.1c17.2-56.9 62.3-90.4 127.6-90.4 19.9 0 37.1 1.5 51.7 4.4a8 8 0 0 0 9.6-7.8v-42.8c0-3.8-2.6-7-6.3-7.8z")),t.EnterOutline=o("enter",s,r(a,"M864 170h-60c-4.4 0-8 3.6-8 8v518H310v-73c0-6.7-7.8-10.5-13-6.3l-141.9 112a8 8 0 0 0 0 12.6l141.9 112c5.3 4.2 13 .4 13-6.3v-75h498c35.3 0 64-28.7 64-64V178c0-4.4-3.6-8-8-8z")),t.ExceptionOutline=o("exception",s,r(a,"M688 312v-48c0-4.4-3.6-8-8-8H296c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h384c4.4 0 8-3.6 8-8zm-392 88c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H296zm376 116c-119.3 0-216 96.7-216 216s96.7 216 216 216 216-96.7 216-216-96.7-216-216-216zm107.5 323.5C750.8 868.2 712.6 884 672 884s-78.8-15.8-107.5-44.5C535.8 810.8 520 772.6 520 732s15.8-78.8 44.5-107.5C593.2 595.8 631.4 580 672 580s78.8 15.8 107.5 44.5C808.2 653.2 824 691.4 824 732s-15.8 78.8-44.5 107.5zM640 812a32 32 0 1 0 64 0 32 32 0 1 0-64 0zm12-64h40c4.4 0 8-3.6 8-8V628c0-4.4-3.6-8-8-8h-40c-4.4 0-8 3.6-8 8v112c0 4.4 3.6 8 8 8zM440 852H208V148h560v344c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V108c0-17.7-14.3-32-32-32H168c-17.7 0-32 14.3-32 32v784c0 17.7 14.3 32 32 32h272c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z")),t.ExclamationOutline=o("exclamation",s,r(a,"M448 804a64 64 0 1 0 128 0 64 64 0 1 0-128 0zm32-168h64c4.4 0 8-3.6 8-8V164c0-4.4-3.6-8-8-8h-64c-4.4 0-8 3.6-8 8v464c0 4.4 3.6 8 8 8z")),t.ExportOutline=o("export",s,r(a,"M888.3 757.4h-53.8c-4.2 0-7.7 3.5-7.7 7.7v61.8H197.1V197.1h629.8v61.8c0 4.2 3.5 7.7 7.7 7.7h53.8c4.2 0 7.7-3.4 7.7-7.7V158.7c0-17-13.7-30.7-30.7-30.7H158.7c-17 0-30.7 13.7-30.7 30.7v706.6c0 17 13.7 30.7 30.7 30.7h706.6c17 0 30.7-13.7 30.7-30.7V765.1c0-4.3-3.5-7.7-7.7-7.7zm18.6-251.7L765 393.7c-5.3-4.2-13-.4-13 6.3v76H438c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h314v76c0 6.7 7.8 10.5 13 6.3l141.9-112a8 8 0 0 0 0-12.6z")),t.FallOutline=o("fall",s,r(a,"M925.9 804l-24-199.2c-.8-6.6-8.9-9.4-13.6-4.7L829 659.5 557.7 388.3c-6.3-6.2-16.4-6.2-22.6 0L433.3 490 156.6 213.3a8.03 8.03 0 0 0-11.3 0l-45 45.2a8.03 8.03 0 0 0 0 11.3L422 591.7c6.2 6.3 16.4 6.3 22.6 0L546.4 490l226.1 226-59.3 59.3a8.01 8.01 0 0 0 4.7 13.6l199.2 24c5.1.7 9.5-3.7 8.8-8.9z")),t.FileDoneOutline=o("file-done",s,r(a,"M688 312v-48c0-4.4-3.6-8-8-8H296c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h384c4.4 0 8-3.6 8-8zm-392 88c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H296zm376 116c-119.3 0-216 96.7-216 216s96.7 216 216 216 216-96.7 216-216-96.7-216-216-216zm107.5 323.5C750.8 868.2 712.6 884 672 884s-78.8-15.8-107.5-44.5C535.8 810.8 520 772.6 520 732s15.8-78.8 44.5-107.5C593.2 595.8 631.4 580 672 580s78.8 15.8 107.5 44.5C808.2 653.2 824 691.4 824 732s-15.8 78.8-44.5 107.5zM761 656h-44.3c-2.6 0-5 1.2-6.5 3.3l-63.5 87.8-23.1-31.9a7.92 7.92 0 0 0-6.5-3.3H573c-6.5 0-10.3 7.4-6.5 12.7l73.8 102.1c3.2 4.4 9.7 4.4 12.9 0l114.2-158c3.9-5.3.1-12.7-6.4-12.7zM440 852H208V148h560v344c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V108c0-17.7-14.3-32-32-32H168c-17.7 0-32 14.3-32 32v784c0 17.7 14.3 32 32 32h272c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z")),t.FileJpgOutline=o("file-jpg",s,r(i,"M874.6 301.8L596.8 21.3c-4.5-4.5-9.4-8.3-14.7-11.5-1.4-.8-2.8-1.6-4.3-2.3-.9-.5-1.9-.9-2.8-1.3-9-4-18.9-6.2-29-6.2H201c-39.8 0-73 32.2-73 72v880c0 39.8 33.2 72 73 72h623c39.8 0 71-32.2 71-72V352.5c0-19-7-37.2-20.4-50.7zM583 110.4L783.8 312H583V110.4zM823 952H200V72h311v240c0 39.8 33.2 72 73 72h239v568zM350 696.5c0 24.2-7.5 31.4-21.9 31.4-9 0-18.4-5.8-24.8-18.5L272.9 732c13.4 22.9 32.3 34.2 61.3 34.2 41.6 0 60.8-29.9 60.8-66.2V577h-45v119.5zM501.3 577H437v186h44v-62h21.6c39.1 0 73.1-19.6 73.1-63.6 0-45.8-33.5-60.4-74.4-60.4zm-.8 89H481v-53h18.2c21.5 0 33.4 6.2 33.4 24.9 0 18.1-10.5 28.1-32.1 28.1zm182.5-9v36h30v30.1c-4 2.9-11 4.7-17.7 4.7-34.3 0-50.7-21.4-50.7-58.2 0-36.1 19.7-57.4 47.1-57.4 15.3 0 25 6.2 34 14.4l23.7-28.3c-12.7-12.8-32.1-24.2-59.2-24.2-49.6 0-91.1 35.3-91.1 97 0 62.7 40 95.1 91.5 95.1 25.9 0 49.2-10.2 61.5-22.6V657H683z")),t.FileProtectOutline=o("file-protect",s,r(a,"M644.7 669.2a7.92 7.92 0 0 0-6.5-3.3H594c-6.5 0-10.3 7.4-6.5 12.7l73.8 102.1c3.2 4.4 9.7 4.4 12.9 0l114.2-158c3.8-5.3 0-12.7-6.5-12.7h-44.3c-2.6 0-5 1.2-6.5 3.3l-63.5 87.8-22.9-31.9zM688 306v-48c0-4.4-3.6-8-8-8H296c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h384c4.4 0 8-3.6 8-8zm-392 88c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H296zm184 458H208V148h560v296c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V108c0-17.7-14.3-32-32-32H168c-17.7 0-32 14.3-32 32v784c0 17.7 14.3 32 32 32h312c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm402.6-320.8l-192-66.7c-.9-.3-1.7-.4-2.6-.4s-1.8.1-2.6.4l-192 66.7a7.96 7.96 0 0 0-5.4 7.5v251.1c0 2.5 1.1 4.8 3.1 6.3l192 150.2c1.4 1.1 3.2 1.7 4.9 1.7s3.5-.6 4.9-1.7l192-150.2c1.9-1.5 3.1-3.8 3.1-6.3V538.7c0-3.4-2.2-6.4-5.4-7.5zM826 763.7L688 871.6 550 763.7V577l138-48 138 48v186.7z")),t.FileSearchOutline=o("file-search",s,r(a,"M688 312v-48c0-4.4-3.6-8-8-8H296c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h384c4.4 0 8-3.6 8-8zm-392 88c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H296zm144 452H208V148h560v344c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V108c0-17.7-14.3-32-32-32H168c-17.7 0-32 14.3-32 32v784c0 17.7 14.3 32 32 32h272c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm445.7 51.5l-93.3-93.3C814.7 780.7 828 743.9 828 704c0-97.2-78.8-176-176-176s-176 78.8-176 176 78.8 176 176 176c35.8 0 69-10.7 96.8-29l94.7 94.7c1.6 1.6 3.6 2.3 5.6 2.3s4.1-.8 5.6-2.3l31-31a7.9 7.9 0 0 0 0-11.2zM652 816c-61.9 0-112-50.1-112-112s50.1-112 112-112 112 50.1 112 112-50.1 112-112 112z")),t.FileSyncOutline=o("file-sync",s,r(a,"M296 256c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h384c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H296zm192 200v-48c0-4.4-3.6-8-8-8H296c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h184c4.4 0 8-3.6 8-8zm-48 396H208V148h560v344c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V108c0-17.7-14.3-32-32-32H168c-17.7 0-32 14.3-32 32v784c0 17.7 14.3 32 32 32h272c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm104.1-115.6c1.8-34.5 16.2-66.8 40.8-91.4 26.2-26.2 62-41 99.1-41 37.4 0 72.6 14.6 99.1 41 3.2 3.2 6.3 6.6 9.2 10.1L769.2 673a8 8 0 0 0 3 14.1l93.3 22.5c5 1.2 9.8-2.6 9.9-7.7l.6-95.4a8 8 0 0 0-12.9-6.4l-20.3 15.8C805.4 569.6 748.1 540 684 540c-109.9 0-199.6 86.9-204 195.7-.2 4.5 3.5 8.3 8 8.3h48.1c4.3 0 7.8-3.3 8-7.6zM880 744h-48.1c-4.3 0-7.8 3.3-8 7.6-1.8 34.5-16.2 66.8-40.8 91.4-26.2 26.2-62 41-99.1 41-37.4 0-72.6-14.6-99.1-41-3.2-3.2-6.3-6.6-9.2-10.1l23.1-17.9a8 8 0 0 0-3-14.1l-93.3-22.5c-5-1.2-9.8 2.6-9.9 7.7l-.6 95.4a8 8 0 0 0 12.9 6.4l20.3-15.8C562.6 918.4 619.9 948 684 948c109.9 0 199.6-86.9 204-195.7.2-4.5-3.5-8.3-8-8.3z")),t.FontColorsOutline=o("font-colors",s,r(a,"M904 816H120c-4.4 0-8 3.6-8 8v80c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-80c0-4.4-3.6-8-8-8zm-650.3-80h85c4.2 0 8-2.7 9.3-6.8l53.7-166h219.2l53.2 166c1.3 4 5 6.8 9.3 6.8h89.1c1.1 0 2.2-.2 3.2-.5a9.7 9.7 0 0 0 6-12.4L573.6 118.6a9.9 9.9 0 0 0-9.2-6.6H462.1c-4.2 0-7.9 2.6-9.2 6.6L244.5 723.1c-.4 1-.5 2.1-.5 3.2-.1 5.3 4.3 9.7 9.7 9.7zm255.9-516.1h4.1l83.8 263.8H424.9l84.7-263.8z")),t.FontSizeOutline=o("font-size",s,r(a,"M920 416H616c-4.4 0-8 3.6-8 8v112c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-56h60v320h-46c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h164c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8h-46V480h60v56c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V424c0-4.4-3.6-8-8-8zM656 296V168c0-4.4-3.6-8-8-8H104c-4.4 0-8 3.6-8 8v128c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-64h168v560h-92c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h264c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-92V232h168v64c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8z")),t.ForkOutline=o("fork",s,r(a,"M752 100c-61.8 0-112 50.2-112 112 0 47.7 29.9 88.5 72 104.6v27.6L512 601.4 312 344.2v-27.6c42.1-16.1 72-56.9 72-104.6 0-61.8-50.2-112-112-112s-112 50.2-112 112c0 50.6 33.8 93.5 80 107.3v34.4c0 9.7 3.3 19.3 9.3 27L476 672.3v33.6c-44.2 15-76 56.9-76 106.1 0 61.8 50.2 112 112 112s112-50.2 112-112c0-49.2-31.8-91-76-106.1v-33.6l226.7-291.6c6-7.7 9.3-17.3 9.3-27v-34.4c46.2-13.8 80-56.7 80-107.3 0-61.8-50.2-112-112-112zM224 212a48.01 48.01 0 0 1 96 0 48.01 48.01 0 0 1-96 0zm336 600a48.01 48.01 0 0 1-96 0 48.01 48.01 0 0 1 96 0zm192-552a48.01 48.01 0 0 1 0-96 48.01 48.01 0 0 1 0 96z")),t.FormOutline=o("form",s,r(a,"M904 512h-56c-4.4 0-8 3.6-8 8v320H184V184h320c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V520c0-4.4-3.6-8-8-8z","M355.9 534.9L354 653.8c-.1 8.9 7.1 16.2 16 16.2h.4l118-2.9c2-.1 4-.9 5.4-2.3l415.9-415c3.1-3.1 3.1-8.2 0-11.3L785.4 114.3c-1.6-1.6-3.6-2.3-5.7-2.3s-4.1.8-5.7 2.3l-415.8 415a8.3 8.3 0 0 0-2.3 5.6zm63.5 23.6L779.7 199l45.2 45.1-360.5 359.7-45.7 1.1.7-46.4z")),t.FullscreenExitOutline=o("fullscreen-exit",s,r(a,"M391 240.9c-.8-6.6-8.9-9.4-13.6-4.7l-43.7 43.7L200 146.3a8.03 8.03 0 0 0-11.3 0l-42.4 42.3a8.03 8.03 0 0 0 0 11.3L280 333.6l-43.9 43.9a8.01 8.01 0 0 0 4.7 13.6L401 410c5.1.6 9.5-3.7 8.9-8.9L391 240.9zm10.1 373.2L240.8 633c-6.6.8-9.4 8.9-4.7 13.6l43.9 43.9L146.3 824a8.03 8.03 0 0 0 0 11.3l42.4 42.3c3.1 3.1 8.2 3.1 11.3 0L333.7 744l43.7 43.7A8.01 8.01 0 0 0 391 783l18.9-160.1c.6-5.1-3.7-9.4-8.8-8.8zm221.8-204.2L783.2 391c6.6-.8 9.4-8.9 4.7-13.6L744 333.6 877.7 200c3.1-3.1 3.1-8.2 0-11.3l-42.4-42.3a8.03 8.03 0 0 0-11.3 0L690.3 279.9l-43.7-43.7a8.01 8.01 0 0 0-13.6 4.7L614.1 401c-.6 5.2 3.7 9.5 8.8 8.9zM744 690.4l43.9-43.9a8.01 8.01 0 0 0-4.7-13.6L623 614c-5.1-.6-9.5 3.7-8.9 8.9L633 783.1c.8 6.6 8.9 9.4 13.6 4.7l43.7-43.7L824 877.7c3.1 3.1 8.2 3.1 11.3 0l42.4-42.3c3.1-3.1 3.1-8.2 0-11.3L744 690.4z")),t.EllipsisOutline=o("ellipsis",s,r(a,"M176 511a56 56 0 1 0 112 0 56 56 0 1 0-112 0zm280 0a56 56 0 1 0 112 0 56 56 0 1 0-112 0zm280 0a56 56 0 1 0 112 0 56 56 0 1 0-112 0z")),t.FullscreenOutline=o("fullscreen",s,r(a,"M290 236.4l43.9-43.9a8.01 8.01 0 0 0-4.7-13.6L169 160c-5.1-.6-9.5 3.7-8.9 8.9L179 329.1c.8 6.6 8.9 9.4 13.6 4.7l43.7-43.7L370 423.7c3.1 3.1 8.2 3.1 11.3 0l42.4-42.3c3.1-3.1 3.1-8.2 0-11.3L290 236.4zm352.7 187.3c3.1 3.1 8.2 3.1 11.3 0l133.7-133.6 43.7 43.7a8.01 8.01 0 0 0 13.6-4.7L863.9 169c.6-5.1-3.7-9.5-8.9-8.9L694.8 179c-6.6.8-9.4 8.9-4.7 13.6l43.9 43.9L600.3 370a8.03 8.03 0 0 0 0 11.3l42.4 42.4zM845 694.9c-.8-6.6-8.9-9.4-13.6-4.7l-43.7 43.7L654 600.3a8.03 8.03 0 0 0-11.3 0l-42.4 42.3a8.03 8.03 0 0 0 0 11.3L734 787.6l-43.9 43.9a8.01 8.01 0 0 0 4.7 13.6L855 864c5.1.6 9.5-3.7 8.9-8.9L845 694.9zm-463.7-94.6a8.03 8.03 0 0 0-11.3 0L236.3 733.9l-43.7-43.7a8.01 8.01 0 0 0-13.6 4.7L160.1 855c-.6 5.1 3.7 9.5 8.9 8.9L329.2 845c6.6-.8 9.4-8.9 4.7-13.6L290 787.6 423.7 654c3.1-3.1 3.1-8.2 0-11.3l-42.4-42.4z")),t.GatewayOutline=o("gateway",s,r(a,"M928 392c8.8 0 16-7.2 16-16V192c0-8.8-7.2-16-16-16H744c-8.8 0-16 7.2-16 16v56H296v-56c0-8.8-7.2-16-16-16H96c-8.8 0-16 7.2-16 16v184c0 8.8 7.2 16 16 16h56v240H96c-8.8 0-16 7.2-16 16v184c0 8.8 7.2 16 16 16h184c8.8 0 16-7.2 16-16v-56h432v56c0 8.8 7.2 16 16 16h184c8.8 0 16-7.2 16-16V648c0-8.8-7.2-16-16-16h-56V392h56zM792 240h88v88h-88v-88zm-648 88v-88h88v88h-88zm88 456h-88v-88h88v88zm648-88v88h-88v-88h88zm-80-64h-56c-8.8 0-16 7.2-16 16v56H296v-56c0-8.8-7.2-16-16-16h-56V392h56c8.8 0 16-7.2 16-16v-56h432v56c0 8.8 7.2 16 16 16h56v240z")),t.GlobalOutline=o("global",s,r(a,"M854.4 800.9c.2-.3.5-.6.7-.9C920.6 722.1 960 621.7 960 512s-39.4-210.1-104.8-288c-.2-.3-.5-.5-.7-.8-1.1-1.3-2.1-2.5-3.2-3.7-.4-.5-.8-.9-1.2-1.4l-4.1-4.7-.1-.1c-1.5-1.7-3.1-3.4-4.6-5.1l-.1-.1c-3.2-3.4-6.4-6.8-9.7-10.1l-.1-.1-4.8-4.8-.3-.3c-1.5-1.5-3-2.9-4.5-4.3-.5-.5-1-1-1.6-1.5-1-1-2-1.9-3-2.8-.3-.3-.7-.6-1-1C736.4 109.2 629.5 64 512 64s-224.4 45.2-304.3 119.2c-.3.3-.7.6-1 1-1 .9-2 1.9-3 2.9-.5.5-1 1-1.6 1.5-1.5 1.4-3 2.9-4.5 4.3l-.3.3-4.8 4.8-.1.1c-3.3 3.3-6.5 6.7-9.7 10.1l-.1.1c-1.6 1.7-3.1 3.4-4.6 5.1l-.1.1c-1.4 1.5-2.8 3.1-4.1 4.7-.4.5-.8.9-1.2 1.4-1.1 1.2-2.1 2.5-3.2 3.7-.2.3-.5.5-.7.8C103.4 301.9 64 402.3 64 512s39.4 210.1 104.8 288c.2.3.5.6.7.9l3.1 3.7c.4.5.8.9 1.2 1.4l4.1 4.7c0 .1.1.1.1.2 1.5 1.7 3 3.4 4.6 5l.1.1c3.2 3.4 6.4 6.8 9.6 10.1l.1.1c1.6 1.6 3.1 3.2 4.7 4.7l.3.3c3.3 3.3 6.7 6.5 10.1 9.6 80.1 74 187 119.2 304.5 119.2s224.4-45.2 304.3-119.2a300 300 0 0 0 10-9.6l.3-.3c1.6-1.6 3.2-3.1 4.7-4.7l.1-.1c3.3-3.3 6.5-6.7 9.6-10.1l.1-.1c1.5-1.7 3.1-3.3 4.6-5 0-.1.1-.1.1-.2 1.4-1.5 2.8-3.1 4.1-4.7.4-.5.8-.9 1.2-1.4a99 99 0 0 0 3.3-3.7zm4.1-142.6c-13.8 32.6-32 62.8-54.2 90.2a444.07 444.07 0 0 0-81.5-55.9c11.6-46.9 18.8-98.4 20.7-152.6H887c-3 40.9-12.6 80.6-28.5 118.3zM887 484H743.5c-1.9-54.2-9.1-105.7-20.7-152.6 29.3-15.6 56.6-34.4 81.5-55.9A373.86 373.86 0 0 1 887 484zM658.3 165.5c39.7 16.8 75.8 40 107.6 69.2a394.72 394.72 0 0 1-59.4 41.8c-15.7-45-35.8-84.1-59.2-115.4 3.7 1.4 7.4 2.9 11 4.4zm-90.6 700.6c-9.2 7.2-18.4 12.7-27.7 16.4V697a389.1 389.1 0 0 1 115.7 26.2c-8.3 24.6-17.9 47.3-29 67.8-17.4 32.4-37.8 58.3-59 75.1zm59-633.1c11 20.6 20.7 43.3 29 67.8A389.1 389.1 0 0 1 540 327V141.6c9.2 3.7 18.5 9.1 27.7 16.4 21.2 16.7 41.6 42.6 59 75zM540 640.9V540h147.5c-1.6 44.2-7.1 87.1-16.3 127.8l-.3 1.2A445.02 445.02 0 0 0 540 640.9zm0-156.9V383.1c45.8-2.8 89.8-12.5 130.9-28.1l.3 1.2c9.2 40.7 14.7 83.5 16.3 127.8H540zm-56 56v100.9c-45.8 2.8-89.8 12.5-130.9 28.1l-.3-1.2c-9.2-40.7-14.7-83.5-16.3-127.8H484zm-147.5-56c1.6-44.2 7.1-87.1 16.3-127.8l.3-1.2c41.1 15.6 85 25.3 130.9 28.1V484H336.5zM484 697v185.4c-9.2-3.7-18.5-9.1-27.7-16.4-21.2-16.7-41.7-42.7-59.1-75.1-11-20.6-20.7-43.3-29-67.8 37.2-14.6 75.9-23.3 115.8-26.1zm0-370a389.1 389.1 0 0 1-115.7-26.2c8.3-24.6 17.9-47.3 29-67.8 17.4-32.4 37.8-58.4 59.1-75.1 9.2-7.2 18.4-12.7 27.7-16.4V327zM365.7 165.5c3.7-1.5 7.3-3 11-4.4-23.4 31.3-43.5 70.4-59.2 115.4-21-12-40.9-26-59.4-41.8 31.8-29.2 67.9-52.4 107.6-69.2zM165.5 365.7c13.8-32.6 32-62.8 54.2-90.2 24.9 21.5 52.2 40.3 81.5 55.9-11.6 46.9-18.8 98.4-20.7 152.6H137c3-40.9 12.6-80.6 28.5-118.3zM137 540h143.5c1.9 54.2 9.1 105.7 20.7 152.6a444.07 444.07 0 0 0-81.5 55.9A373.86 373.86 0 0 1 137 540zm228.7 318.5c-39.7-16.8-75.8-40-107.6-69.2 18.5-15.8 38.4-29.7 59.4-41.8 15.7 45 35.8 84.1 59.2 115.4-3.7-1.4-7.4-2.9-11-4.4zm292.6 0c-3.7 1.5-7.3 3-11 4.4 23.4-31.3 43.5-70.4 59.2-115.4 21 12 40.9 26 59.4 41.8a373.81 373.81 0 0 1-107.6 69.2z")),t.GoldOutline=o("gold",s,r(a,"M342 472h342c.4 0 .9 0 1.3-.1 4.4-.7 7.3-4.8 6.6-9.2l-40.2-248c-.6-3.9-4-6.7-7.9-6.7H382.2c-3.9 0-7.3 2.8-7.9 6.7l-40.2 248c-.1.4-.1.9-.1 1.3 0 4.4 3.6 8 8 8zm91.2-196h159.5l20.7 128h-201l20.8-128zm2.5 282.7c-.6-3.9-4-6.7-7.9-6.7H166.2c-3.9 0-7.3 2.8-7.9 6.7l-40.2 248c-.1.4-.1.9-.1 1.3 0 4.4 3.6 8 8 8h342c.4 0 .9 0 1.3-.1 4.4-.7 7.3-4.8 6.6-9.2l-40.2-248zM196.5 748l20.7-128h159.5l20.7 128H196.5zm709.4 58.7l-40.2-248c-.6-3.9-4-6.7-7.9-6.7H596.2c-3.9 0-7.3 2.8-7.9 6.7l-40.2 248c-.1.4-.1.9-.1 1.3 0 4.4 3.6 8 8 8h342c.4 0 .9 0 1.3-.1 4.3-.7 7.3-4.8 6.6-9.2zM626.5 748l20.7-128h159.5l20.7 128H626.5z")),t.GooglePlusOutline=o("google-plus",s,r(a,"M879.5 470.4c-.3-27-.4-54.2-.5-81.3h-80.8c-.3 27-.5 54.1-.7 81.3-27.2.1-54.2.3-81.2.6v80.9c27 .3 54.2.5 81.2.8.3 27 .3 54.1.5 81.1h80.9c.1-27 .3-54.1.5-81.3 27.2-.3 54.2-.4 81.2-.7v-80.9c-26.9-.2-54.1-.2-81.1-.5zm-530 .4c-.1 32.3 0 64.7.1 97 54.2 1.8 108.5 1 162.7 1.8-23.9 120.3-187.4 159.3-273.9 80.7-89-68.9-84.8-220 7.7-284 64.7-51.6 156.6-38.9 221.3 5.8 25.4-23.5 49.2-48.7 72.1-74.7-53.8-42.9-119.8-73.5-190-70.3-146.6-4.9-281.3 123.5-283.7 270.2-9.4 119.9 69.4 237.4 180.6 279.8 110.8 42.7 252.9 13.6 323.7-86 46.7-62.9 56.8-143.9 51.3-220-90.7-.7-181.3-.6-271.9-.3z")),t.GoogleOutline=o("google",s,r(a,"M881 442.4H519.7v148.5h206.4c-8.9 48-35.9 88.6-76.6 115.8-34.4 23-78.3 36.6-129.9 36.6-99.9 0-184.4-67.5-214.6-158.2-7.6-23-12-47.6-12-72.9s4.4-49.9 12-72.9c30.3-90.6 114.8-158.1 214.7-158.1 56.3 0 106.8 19.4 146.6 57.4l110-110.1c-66.5-62-153.2-100-256.6-100-149.9 0-279.6 86-342.7 211.4-26 51.8-40.8 110.4-40.8 172.4S151 632.8 177 684.6C240.1 810 369.8 896 519.7 896c103.6 0 190.4-34.4 253.8-93 72.5-66.8 114.4-165.2 114.4-282.1 0-27.2-2.4-53.3-6.9-78.5z")),t.HeatMapOutline=o("heat-map",s,r(a,"M955.7 856l-416-720c-6.2-10.7-16.9-16-27.7-16s-21.6 5.3-27.7 16l-416 720C56 877.4 71.4 904 96 904h832c24.6 0 40-26.6 27.7-48zm-790.4-23.9L512 231.9 858.7 832H165.3zm319-474.1l-228 394c-12.3 21.3 3.1 48 27.7 48h455.8c24.7 0 40.1-26.7 27.7-48L539.7 358c-6.2-10.7-17-16-27.7-16-10.8 0-21.6 5.3-27.7 16zm214 386H325.7L512 422l186.3 322zm-214-194.1l-57 98.4C415 669.5 430.4 696 455 696h114c24.6 0 39.9-26.5 27.7-47.7l-57-98.4c-6.1-10.6-16.9-15.9-27.7-15.9s-21.5 5.3-27.7 15.9zm57.1 98.4h-58.7l29.4-50.7 29.3 50.7z")),t.IeOutline=o("ie",s,r(a,"M852.6 367.6c16.3-36.9 32.1-90.7 32.1-131.8 0-109.1-119.5-147.6-314.5-57.9-161.4-10.8-316.8 110.5-355.6 279.7 46.3-52.3 117.4-123.4 183-151.7C316.1 378.3 246.7 470 194 565.6c-31.1 56.9-66 148.8-66 217.5 0 147.9 139.3 129.8 270.4 63 47.1 23.1 99.8 23.4 152.5 23.4 145.7 0 276.4-81.4 325.2-219H694.9c-78.8 132.9-295.2 79.5-295.2-71.2h493.2c9.6-65.4-2.5-143.6-40.3-211.7zM224.8 648.3c26.6 76.7 80.6 143.8 150.4 185-133.1 73.4-259.9 43.6-150.4-185zm174-163.3c3-82.7 75.4-142.3 156-142.3 80.1 0 153 59.6 156 142.3h-312zm276.8-281.4c32.1-15.4 72.8-33 108.8-33 47.1 0 81.4 32.6 81.4 80.6 0 30-11.1 73.5-21.9 101.8-39.3-63.5-98.9-122.4-168.3-149.4z")),t.ImportOutline=o("import",s,r(a,"M888.3 757.4h-53.8c-4.2 0-7.7 3.5-7.7 7.7v61.8H197.1V197.1h629.8v61.8c0 4.2 3.5 7.7 7.7 7.7h53.8c4.2 0 7.7-3.4 7.7-7.7V158.7c0-17-13.7-30.7-30.7-30.7H158.7c-17 0-30.7 13.7-30.7 30.7v706.6c0 17 13.7 30.7 30.7 30.7h706.6c17 0 30.7-13.7 30.7-30.7V765.1c0-4.3-3.5-7.7-7.7-7.7zM902 476H588v-76c0-6.7-7.8-10.5-13-6.3l-141.9 112a8 8 0 0 0 0 12.6l141.9 112c5.3 4.2 13 .4 13-6.3v-76h314c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z")),t.InboxOutline=o("inbox",s,r(i,"M885.2 446.3l-.2-.8-112.2-285.1c-5-16.1-19.9-27.2-36.8-27.2H281.2c-17 0-32.1 11.3-36.9 27.6L139.4 443l-.3.7-.2.8c-1.3 4.9-1.7 9.9-1 14.8-.1 1.6-.2 3.2-.2 4.8V830a60.9 60.9 0 0 0 60.8 60.8h627.2c33.5 0 60.8-27.3 60.9-60.8V464.1c0-1.3 0-2.6-.1-3.7.4-4.9 0-9.6-1.3-14.1zm-295.8-43l-.3 15.7c-.8 44.9-31.8 75.1-77.1 75.1-22.1 0-41.1-7.1-54.8-20.6S436 441.2 435.6 419l-.3-15.7H229.5L309 210h399.2l81.7 193.3H589.4zm-375 76.8h157.3c24.3 57.1 76 90.8 140.4 90.8 33.7 0 65-9.4 90.3-27.2 22.2-15.6 39.5-37.4 50.7-63.6h156.5V814H214.4V480.1z")),t.IssuesCloseOutline=o("issues-close",s,r(a,"M464 688a48 48 0 1 0 96 0 48 48 0 1 0-96 0zm72-112c4.4 0 8-3.6 8-8V296c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v272c0 4.4 3.6 8 8 8h48zm400-188h-59.3c-2.6 0-5 1.2-6.5 3.3L763.7 538.1l-49.9-68.8a7.92 7.92 0 0 0-6.5-3.3H648c-6.5 0-10.3 7.4-6.5 12.7l109.2 150.7a16.1 16.1 0 0 0 26 0l165.8-228.7c3.8-5.3 0-12.7-6.5-12.7zm-44 306h-64.2c-5.5 0-10.6 2.9-13.6 7.5a352.2 352.2 0 0 1-49.8 62.2A355.92 355.92 0 0 1 651.1 840a355 355 0 0 1-138.7 27.9c-48.1 0-94.8-9.4-138.7-27.9a355.92 355.92 0 0 1-113.3-76.3A353.06 353.06 0 0 1 184 650.5c-18.6-43.8-28-90.5-28-138.5s9.4-94.7 28-138.5c17.9-42.4 43.6-80.5 76.4-113.2 32.8-32.7 70.9-58.4 113.3-76.3a355 355 0 0 1 138.7-27.9c48.1 0 94.8 9.4 138.7 27.9 42.4 17.9 80.5 43.6 113.3 76.3 19 19 35.6 39.8 49.8 62.2 2.9 4.7 8.1 7.5 13.6 7.5H892c6 0 9.8-6.3 7.2-11.6C828.8 178.5 684.7 82 517.7 80 278.9 77.2 80.5 272.5 80 511.2 79.5 750.1 273.3 944 512.4 944c169.2 0 315.6-97 386.7-238.4A8 8 0 0 0 892 694z")),t.InfoOutline=o("info",s,r(a,"M448 224a64 64 0 1 0 128 0 64 64 0 1 0-128 0zm96 168h-64c-4.4 0-8 3.6-8 8v464c0 4.4 3.6 8 8 8h64c4.4 0 8-3.6 8-8V400c0-4.4-3.6-8-8-8z")),t.ItalicOutline=o("italic",s,r(a,"M798 160H366c-4.4 0-8 3.6-8 8v64c0 4.4 3.6 8 8 8h181.2l-156 544H229c-4.4 0-8 3.6-8 8v64c0 4.4 3.6 8 8 8h432c4.4 0 8-3.6 8-8v-64c0-4.4-3.6-8-8-8H474.4l156-544H798c4.4 0 8-3.6 8-8v-64c0-4.4-3.6-8-8-8z")),t.LaptopOutline=o("laptop",s,r(a,"M956.9 845.1L896.4 632V168c0-17.7-14.3-32-32-32h-704c-17.7 0-32 14.3-32 32v464L67.9 845.1C60.4 866 75.8 888 98 888h828.8c22.2 0 37.6-22 30.1-42.9zM200.4 208h624v395h-624V208zm228.3 608l8.1-37h150.3l8.1 37H428.7zm224 0l-19.1-86.7c-.8-3.7-4.1-6.3-7.8-6.3H398.2c-3.8 0-7 2.6-7.8 6.3L371.3 816H151l42.3-149h638.2l42.3 149H652.7z")),t.KeyOutline=o("key",s,r(a,"M608 112c-167.9 0-304 136.1-304 304 0 70.3 23.9 135 63.9 186.5l-41.1 41.1-62.3-62.3a8.15 8.15 0 0 0-11.4 0l-39.8 39.8a8.15 8.15 0 0 0 0 11.4l62.3 62.3-44.9 44.9-62.3-62.3a8.15 8.15 0 0 0-11.4 0l-39.8 39.8a8.15 8.15 0 0 0 0 11.4l62.3 62.3-65.3 65.3a8.03 8.03 0 0 0 0 11.3l42.3 42.3c3.1 3.1 8.2 3.1 11.3 0l253.6-253.6A304.06 304.06 0 0 0 608 720c167.9 0 304-136.1 304-304S775.9 112 608 112zm161.2 465.2C726.2 620.3 668.9 644 608 644c-60.9 0-118.2-23.7-161.2-66.8-43.1-43-66.8-100.3-66.8-161.2 0-60.9 23.7-118.2 66.8-161.2 43-43.1 100.3-66.8 161.2-66.8 60.9 0 118.2 23.7 161.2 66.8 43.1 43 66.8 100.3 66.8 161.2 0 60.9-23.7 118.2-66.8 161.2z")),t.LeftOutline=o("left",s,r(a,"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")),t.LineChartOutline=o("line-chart",s,r(a,"M888 792H200V168c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v688c0 4.4 3.6 8 8 8h752c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM305.8 637.7c3.1 3.1 8.1 3.1 11.3 0l138.3-137.6L583 628.5c3.1 3.1 8.2 3.1 11.3 0l275.4-275.3c3.1-3.1 3.1-8.2 0-11.3l-39.6-39.6a8.03 8.03 0 0 0-11.3 0l-230 229.9L461.4 404a8.03 8.03 0 0 0-11.3 0L266.3 586.7a8.03 8.03 0 0 0 0 11.3l39.5 39.7z")),t.LineHeightOutline=o("line-height",s,r(a,"M648 160H104c-4.4 0-8 3.6-8 8v128c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-64h168v560h-92c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h264c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-92V232h168v64c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V168c0-4.4-3.6-8-8-8zm272.8 546H856V318h64.8c6 0 9.4-7 5.7-11.7L825.7 178.7a7.14 7.14 0 0 0-11.3 0L713.6 306.3a7.23 7.23 0 0 0 5.7 11.7H784v388h-64.8c-6 0-9.4 7-5.7 11.7l100.8 127.5c2.9 3.7 8.5 3.7 11.3 0l100.8-127.5a7.2 7.2 0 0 0-5.6-11.7z")),t.LineOutline=o("line",s,r(a,"M904 476H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z")),t.LinkOutline=o("link",s,r(a,"M574 665.4a8.03 8.03 0 0 0-11.3 0L446.5 781.6c-53.8 53.8-144.6 59.5-204 0-59.5-59.5-53.8-150.2 0-204l116.2-116.2c3.1-3.1 3.1-8.2 0-11.3l-39.8-39.8a8.03 8.03 0 0 0-11.3 0L191.4 526.5c-84.6 84.6-84.6 221.5 0 306s221.5 84.6 306 0l116.2-116.2c3.1-3.1 3.1-8.2 0-11.3L574 665.4zm258.6-474c-84.6-84.6-221.5-84.6-306 0L410.3 307.6a8.03 8.03 0 0 0 0 11.3l39.7 39.7c3.1 3.1 8.2 3.1 11.3 0l116.2-116.2c53.8-53.8 144.6-59.5 204 0 59.5 59.5 53.8 150.2 0 204L665.3 562.6a8.03 8.03 0 0 0 0 11.3l39.8 39.8c3.1 3.1 8.2 3.1 11.3 0l116.2-116.2c84.5-84.6 84.5-221.5 0-306.1zM610.1 372.3a8.03 8.03 0 0 0-11.3 0L372.3 598.7a8.03 8.03 0 0 0 0 11.3l39.6 39.6c3.1 3.1 8.2 3.1 11.3 0l226.4-226.4c3.1-3.1 3.1-8.2 0-11.3l-39.5-39.6z")),t.Loading3QuartersOutline=o("loading-3-quarters",s,r(i,"M512 1024c-69.1 0-136.2-13.5-199.3-40.2C251.7 958 197 921 150 874c-47-47-84-101.7-109.8-162.7C13.5 648.2 0 581.1 0 512c0-19.9 16.1-36 36-36s36 16.1 36 36c0 59.4 11.6 117 34.6 171.3 22.2 52.4 53.9 99.5 94.3 139.9 40.4 40.4 87.5 72.2 139.9 94.3C395 940.4 452.6 952 512 952c59.4 0 117-11.6 171.3-34.6 52.4-22.2 99.5-53.9 139.9-94.3 40.4-40.4 72.2-87.5 94.3-139.9C940.4 629 952 571.4 952 512c0-59.4-11.6-117-34.6-171.3a440.45 440.45 0 0 0-94.3-139.9 437.71 437.71 0 0 0-139.9-94.3C629 83.6 571.4 72 512 72c-19.9 0-36-16.1-36-36s16.1-36 36-36c69.1 0 136.2 13.5 199.3 40.2C772.3 66 827 103 874 150c47 47 83.9 101.8 109.7 162.7 26.7 63.1 40.2 130.2 40.2 199.3s-13.5 136.2-40.2 199.3C958 772.3 921 827 874 874c-47 47-101.8 83.9-162.7 109.7-63.1 26.8-130.2 40.3-199.3 40.3z")),t.LoadingOutline=o("loading",s,r(i,"M988 548c-19.9 0-36-16.1-36-36 0-59.4-11.6-117-34.6-171.3a440.45 440.45 0 0 0-94.3-139.9 437.71 437.71 0 0 0-139.9-94.3C629 83.6 571.4 72 512 72c-19.9 0-36-16.1-36-36s16.1-36 36-36c69.1 0 136.2 13.5 199.3 40.3C772.3 66 827 103 874 150c47 47 83.9 101.8 109.7 162.7 26.7 63.1 40.2 130.2 40.2 199.3.1 19.9-16 36-35.9 36z")),t.LoginOutline=o("login",s,r(a,"M521.7 82c-152.5-.4-286.7 78.5-363.4 197.7-3.4 5.3.4 12.3 6.7 12.3h70.3c4.8 0 9.3-2.1 12.3-5.8 7-8.5 14.5-16.7 22.4-24.5 32.6-32.5 70.5-58.1 112.7-75.9 43.6-18.4 90-27.8 137.9-27.8 47.9 0 94.3 9.3 137.9 27.8 42.2 17.8 80.1 43.4 112.7 75.9 32.6 32.5 58.1 70.4 76 112.5C865.7 417.8 875 464.1 875 512c0 47.9-9.4 94.2-27.8 137.8-17.8 42.1-43.4 80-76 112.5s-70.5 58.1-112.7 75.9A352.8 352.8 0 0 1 520.6 866c-47.9 0-94.3-9.4-137.9-27.8A353.84 353.84 0 0 1 270 762.3c-7.9-7.9-15.3-16.1-22.4-24.5-3-3.7-7.6-5.8-12.3-5.8H165c-6.3 0-10.2 7-6.7 12.3C234.9 863.2 368.5 942 520.6 942c236.2 0 428-190.1 430.4-425.6C953.4 277.1 761.3 82.6 521.7 82zM395.02 624v-76h-314c-4.4 0-8-3.6-8-8v-56c0-4.4 3.6-8 8-8h314v-76c0-6.7 7.8-10.5 13-6.3l141.9 112a8 8 0 0 1 0 12.6l-141.9 112c-5.2 4.1-13 .4-13-6.3z")),t.LogoutOutline=o("logout",s,r(a,"M868 732h-70.3c-4.8 0-9.3 2.1-12.3 5.8-7 8.5-14.5 16.7-22.4 24.5a353.84 353.84 0 0 1-112.7 75.9A352.8 352.8 0 0 1 512.4 866c-47.9 0-94.3-9.4-137.9-27.8a353.84 353.84 0 0 1-112.7-75.9 353.28 353.28 0 0 1-76-112.5C167.3 606.2 158 559.9 158 512s9.4-94.2 27.8-137.8c17.8-42.1 43.4-80 76-112.5s70.5-58.1 112.7-75.9c43.6-18.4 90-27.8 137.9-27.8 47.9 0 94.3 9.3 137.9 27.8 42.2 17.8 80.1 43.4 112.7 75.9 7.9 7.9 15.3 16.1 22.4 24.5 3 3.7 7.6 5.8 12.3 5.8H868c6.3 0 10.2-7 6.7-12.3C798 160.5 663.8 81.6 511.3 82 271.7 82.6 79.6 277.1 82 516.4 84.4 751.9 276.2 942 512.4 942c152.1 0 285.7-78.8 362.3-197.7 3.4-5.3-.4-12.3-6.7-12.3zm88.9-226.3L815 393.7c-5.3-4.2-13-.4-13 6.3v76H488c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h314v76c0 6.7 7.8 10.5 13 6.3l141.9-112a8 8 0 0 0 0-12.6z")),t.ManOutline=o("man",s,r(a,"M874 120H622c-3.3 0-6 2.7-6 6v56c0 3.3 2.7 6 6 6h160.4L583.1 387.3c-50-38.5-111-59.3-175.1-59.3-76.9 0-149.3 30-203.6 84.4S120 539.1 120 616s30 149.3 84.4 203.6C258.7 874 331.1 904 408 904s149.3-30 203.6-84.4C666 765.3 696 692.9 696 616c0-64.1-20.8-124.9-59.2-174.9L836 241.9V402c0 3.3 2.7 6 6 6h56c3.3 0 6-2.7 6-6V150c0-16.5-13.5-30-30-30zM408 828c-116.9 0-212-95.1-212-212s95.1-212 212-212 212 95.1 212 212-95.1 212-212 212z")),t.MediumWorkmarkOutline=o("medium-workmark",s,r(i,"M517.2 590.55c0 3.55 0 4.36 2.4 6.55l13.43 13.25v.57h-59.57v-25.47a41.44 41.44 0 0 1-39.5 27.65c-30.61 0-52.84-24.25-52.84-68.87 0-41.8 23.99-69.69 57.65-69.69a35.15 35.15 0 0 1 34.61 21.67v-56.19a6.99 6.99 0 0 0-2.71-6.79l-12.8-12.45v-.56l59.33-7.04v177.37zm-43.74-8.09v-83.83a22.2 22.2 0 0 0-17.74-8.4c-14.48 0-28.47 13.25-28.47 52.62 0 36.86 12.07 49.88 27.1 49.88a23.91 23.91 0 0 0 19.11-10.27zm83.23 28.46V497.74a7.65 7.65 0 0 0-2.4-6.79l-13.19-13.74v-.57h59.56v114.8c0 3.55 0 4.36 2.4 6.54l13.12 12.45v.57l-59.49-.08zm-2.16-175.67c0-13.4 10.74-24.25 23.99-24.25 13.25 0 23.98 10.86 23.98 24.25 0 13.4-10.73 24.25-23.98 24.25s-23.99-10.85-23.99-24.25zm206.83 155.06c0 3.55 0 4.6 2.4 6.79l13.43 13.25v.57h-59.88V581.9a43.4 43.4 0 0 1-41.01 31.2c-26.55 0-40.78-19.56-40.78-56.59 0-17.86 0-37.43.56-59.41a6.91 6.91 0 0 0-2.4-6.55L620.5 477.2v-.57h59.09v73.81c0 24.25 3.51 40.42 18.54 40.42a23.96 23.96 0 0 0 19.35-12.2v-80.85a7.65 7.65 0 0 0-2.4-6.79l-13.27-13.82v-.57h59.56v113.67zm202.76 20.6c0-4.36.8-59.97.8-72.75 0-24.25-3.76-40.98-20.63-40.98a26.7 26.7 0 0 0-21.19 11.64 99.68 99.68 0 0 1 2.4 23.04c0 16.81-.56 38.23-.8 59.66a6.91 6.91 0 0 0 2.4 6.55l13.43 12.45v.56h-60.12c0-4.04.8-59.98.8-72.76 0-24.65-3.76-40.98-20.39-40.98-8.2.3-15.68 4.8-19.83 11.96v82.46c0 3.56 0 4.37 2.4 6.55l13.11 12.45v.56h-59.48V498.15a7.65 7.65 0 0 0-2.4-6.8l-13.19-14.14v-.57H841v28.78c5.53-19 23.13-31.76 42.7-30.96 19.82 0 33.26 11.16 38.93 32.34a46.41 46.41 0 0 1 44.77-32.34c26.55 0 41.58 19.8 41.58 57.23 0 17.87-.56 38.24-.8 59.66a6.5 6.5 0 0 0 2.72 6.55l13.11 12.45v.57h-59.88zM215.87 593.3l17.66 17.05v.57h-89.62v-.57l17.99-17.05a6.91 6.91 0 0 0 2.4-6.55V477.69c0-4.6 0-10.83.8-16.16L104.66 613.1h-.72l-62.6-139.45c-1.37-3.47-1.77-3.72-2.65-6.06v91.43a32.08 32.08 0 0 0 2.96 17.87l25.19 33.46v.57H0v-.57l25.18-33.55a32.16 32.16 0 0 0 2.96-17.78V457.97A19.71 19.71 0 0 0 24 444.15L6.16 420.78v-.56h63.96l53.56 118.1 47.17-118.1h62.6v.56l-17.58 19.8a6.99 6.99 0 0 0-2.72 6.8v139.37a6.5 6.5 0 0 0 2.72 6.55zm70.11-54.65v.56c0 34.6 17.67 48.5 38.38 48.5 17.29.6 33.29-9.2 40.77-24.97h.56c-7.2 34.2-28.14 50.36-59.48 50.36-33.82 0-65.72-20.61-65.72-68.39 0-50.2 31.98-70.25 67.32-70.25 28.46 0 58.76 13.58 58.76 57.24v6.95h-80.59zm0-6.95h39.42v-7.04c0-35.57-7.28-45.03-18.23-45.03-13.27 0-21.35 14.15-21.35 52.07h.16z")),t.MediumOutline=o("medium",s,r(a,"M834.7 279.8l61.3-58.9V208H683.7L532.4 586.4 360.3 208H137.7v12.9l71.6 86.6c7 6.4 10.6 15.8 9.7 25.2V673c2.2 12.3-1.7 24.8-10.3 33.7L128 805v12.7h228.6v-12.9l-80.6-98a39.99 39.99 0 0 1-11.1-33.7V378.7l200.7 439.2h23.3l172.6-439.2v349.9c0 9.2 0 11.1-6 17.2l-62.1 60.3V819h301.2v-12.9l-59.9-58.9c-5.2-4-7.9-10.7-6.8-17.2V297a18.1 18.1 0 0 1 6.8-17.2z")),t.MenuFoldOutline=o("menu-fold",s,r(a,"M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z")),t.MenuUnfoldOutline=o("menu-unfold",s,r(a,"M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z")),t.MenuOutline=o("menu",s,r(a,"M904 160H120c-4.4 0-8 3.6-8 8v64c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-64c0-4.4-3.6-8-8-8zm0 624H120c-4.4 0-8 3.6-8 8v64c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-64c0-4.4-3.6-8-8-8zm0-312H120c-4.4 0-8 3.6-8 8v64c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-64c0-4.4-3.6-8-8-8z")),t.MinusOutline=o("minus",s,r(a,"M872 474H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h720c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8z")),t.MonitorOutline=o("monitor",s,r(a,"M692.8 412.7l.2-.2-34.6-44.3a7.97 7.97 0 0 0-11.2-1.4l-50.4 39.3-70.5-90.1a7.97 7.97 0 0 0-11.2-1.4l-37.9 29.7a7.97 7.97 0 0 0-1.4 11.2l70.5 90.2-.2.1 34.6 44.3c2.7 3.5 7.7 4.1 11.2 1.4l50.4-39.3 64.1 82c2.7 3.5 7.7 4.1 11.2 1.4l37.9-29.6c3.5-2.7 4.1-7.7 1.4-11.2l-64.1-82.1zM608 112c-167.9 0-304 136.1-304 304 0 70.3 23.9 135 63.9 186.5L114.3 856.1a8.03 8.03 0 0 0 0 11.3l42.3 42.3c3.1 3.1 8.2 3.1 11.3 0l253.6-253.6C473 696.1 537.7 720 608 720c167.9 0 304-136.1 304-304S775.9 112 608 112zm161.2 465.2C726.2 620.3 668.9 644 608 644s-118.2-23.7-161.2-66.8C403.7 534.2 380 476.9 380 416s23.7-118.2 66.8-161.2c43-43.1 100.3-66.8 161.2-66.8s118.2 23.7 161.2 66.8c43.1 43 66.8 100.3 66.8 161.2s-23.7 118.2-66.8 161.2z")),t.MrOutline=o("mr",s,r(a,"M788 705.9V192c0-8.8-7.2-16-16-16H602v-68.8c0-6-7-9.4-11.7-5.7L462.7 202.3a7.14 7.14 0 0 0 0 11.3l127.5 100.8c4.7 3.7 11.7.4 11.7-5.7V240h114v465.9c-44.2 15-76 56.9-76 106.1 0 61.8 50.2 112 112 112s112-50.2 112-112c.1-49.2-31.7-91-75.9-106.1zM752 860a48.01 48.01 0 0 1 0-96 48.01 48.01 0 0 1 0 96zM384 212c0-61.8-50.2-112-112-112s-112 50.2-112 112c0 49.2 31.8 91 76 106.1V706c-44.2 15-76 56.9-76 106.1 0 61.8 50.2 112 112 112s112-50.2 112-112c0-49.2-31.8-91-76-106.1V318.1c44.2-15.1 76-56.9 76-106.1zm-160 0a48.01 48.01 0 0 1 96 0 48.01 48.01 0 0 1-96 0zm96 600a48.01 48.01 0 0 1-96 0 48.01 48.01 0 0 1 96 0z")),t.NumberOutline=o("number",s,r(a,"M872 394c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8H708V152c0-4.4-3.6-8-8-8h-64c-4.4 0-8 3.6-8 8v166H400V152c0-4.4-3.6-8-8-8h-64c-4.4 0-8 3.6-8 8v166H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h168v236H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h168v166c0 4.4 3.6 8 8 8h64c4.4 0 8-3.6 8-8V706h228v166c0 4.4 3.6 8 8 8h64c4.4 0 8-3.6 8-8V706h164c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8H708V394h164zM628 630H400V394h228v236z")),t.OrderedListOutline=o("ordered-list",s,r(a,"M920 760H336c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-568H336c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 284H336c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM216 712H100c-2.2 0-4 1.8-4 4v34c0 2.2 1.8 4 4 4h72.4v20.5h-35.7c-2.2 0-4 1.8-4 4v34c0 2.2 1.8 4 4 4h35.7V838H100c-2.2 0-4 1.8-4 4v34c0 2.2 1.8 4 4 4h116c2.2 0 4-1.8 4-4V716c0-2.2-1.8-4-4-4zM100 188h38v120c0 2.2 1.8 4 4 4h40c2.2 0 4-1.8 4-4V152c0-4.4-3.6-8-8-8h-78c-2.2 0-4 1.8-4 4v36c0 2.2 1.8 4 4 4zm116 240H100c-2.2 0-4 1.8-4 4v36c0 2.2 1.8 4 4 4h68.4l-70.3 77.7a8.3 8.3 0 0 0-2.1 5.4V592c0 2.2 1.8 4 4 4h116c2.2 0 4-1.8 4-4v-36c0-2.2-1.8-4-4-4h-68.4l70.3-77.7a8.3 8.3 0 0 0 2.1-5.4V432c0-2.2-1.8-4-4-4z")),t.PauseOutline=o("pause",s,r(a,"M304 176h80v672h-80zm408 0h-64c-4.4 0-8 3.6-8 8v656c0 4.4 3.6 8 8 8h64c4.4 0 8-3.6 8-8V184c0-4.4-3.6-8-8-8z")),t.PaperClipOutline=o("paper-clip",s,r(a,"M779.3 196.6c-94.2-94.2-247.6-94.2-341.7 0l-261 260.8c-1.7 1.7-2.6 4-2.6 6.4s.9 4.7 2.6 6.4l36.9 36.9a9 9 0 0 0 12.7 0l261-260.8c32.4-32.4 75.5-50.2 121.3-50.2s88.9 17.8 121.2 50.2c32.4 32.4 50.2 75.5 50.2 121.2 0 45.8-17.8 88.8-50.2 121.2l-266 265.9-43.1 43.1c-40.3 40.3-105.8 40.3-146.1 0-19.5-19.5-30.2-45.4-30.2-73s10.7-53.5 30.2-73l263.9-263.8c6.7-6.6 15.5-10.3 24.9-10.3h.1c9.4 0 18.1 3.7 24.7 10.3 6.7 6.7 10.3 15.5 10.3 24.9 0 9.3-3.7 18.1-10.3 24.7L372.4 653c-1.7 1.7-2.6 4-2.6 6.4s.9 4.7 2.6 6.4l36.9 36.9a9 9 0 0 0 12.7 0l215.6-215.6c19.9-19.9 30.8-46.3 30.8-74.4s-11-54.6-30.8-74.4c-41.1-41.1-107.9-41-149 0L463 364 224.8 602.1A172.22 172.22 0 0 0 174 724.8c0 46.3 18.1 89.8 50.8 122.5 33.9 33.8 78.3 50.7 122.7 50.7 44.4 0 88.8-16.9 122.6-50.7l309.2-309C824.8 492.7 850 432 850 367.5c.1-64.6-25.1-125.3-70.7-170.9z")),t.PercentageOutline=o("percentage",s,r(a,"M855.7 210.8l-42.4-42.4a8.03 8.03 0 0 0-11.3 0L168.3 801.9a8.03 8.03 0 0 0 0 11.3l42.4 42.4c3.1 3.1 8.2 3.1 11.3 0L855.6 222c3.2-3 3.2-8.1.1-11.2zM304 448c79.4 0 144-64.6 144-144s-64.6-144-144-144-144 64.6-144 144 64.6 144 144 144zm0-216c39.7 0 72 32.3 72 72s-32.3 72-72 72-72-32.3-72-72 32.3-72 72-72zm416 344c-79.4 0-144 64.6-144 144s64.6 144 144 144 144-64.6 144-144-64.6-144-144-144zm0 216c-39.7 0-72-32.3-72-72s32.3-72 72-72 72 32.3 72 72-32.3 72-72 72z")),t.PicCenterOutline=o("pic-center",s,r(a,"M952 792H72c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h880c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-632H72c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h880c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM848 660c8.8 0 16-7.2 16-16V380c0-8.8-7.2-16-16-16H176c-8.8 0-16 7.2-16 16v264c0 8.8 7.2 16 16 16h672zM232 436h560v152H232V436z")),t.PicLeftOutline=o("pic-left",s,r(a,"M952 792H72c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h880c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-632H72c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h880c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM608 660c8.8 0 16-7.2 16-16V380c0-8.8-7.2-16-16-16H96c-8.8 0-16 7.2-16 16v264c0 8.8 7.2 16 16 16h512zM152 436h400v152H152V436zm552 210c0 4.4 3.6 8 8 8h224c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H712c-4.4 0-8 3.6-8 8v56zm8-204h224c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H712c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8z")),t.PicRightOutline=o("pic-right",s,r(a,"M952 792H72c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h880c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-632H72c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h880c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-24 500c8.8 0 16-7.2 16-16V380c0-8.8-7.2-16-16-16H416c-8.8 0-16 7.2-16 16v264c0 8.8 7.2 16 16 16h512zM472 436h400v152H472V436zM80 646c0 4.4 3.6 8 8 8h224c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H88c-4.4 0-8 3.6-8 8v56zm8-204h224c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H88c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8z")),t.PlusOutline=o("plus",s,r(a,"M848 474H550V152h-76v322H176c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h298v322h76V550h298c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8z")),t.PoundOutline=o("pound",s,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372zm138-209.8H469.8v-4.7c27.4-17.2 43.9-50.4 43.9-91.1 0-14.1-2.2-27.9-5.3-41H607c4.4 0 8-3.6 8-8v-30c0-4.4-3.6-8-8-8H495c-7.2-22.6-13.4-45.7-13.4-70.5 0-43.5 34-70.2 87.3-70.2 21.5 0 42.5 4.1 60.4 10.5 5.2 1.9 10.6-2 10.6-7.6v-39.5c0-3.3-2.1-6.3-5.2-7.5-18.8-7.2-43.8-12.7-70.3-12.7-92.9 0-151.5 44.5-151.5 120.3 0 26.3 6.9 52 14.6 77.1H374c-4.4 0-8 3.6-8 8v30c0 4.4 3.6 8 8 8h67.1c3.4 14.7 5.9 29.4 5.9 44.2 0 45.2-28.8 83.3-72.8 94.2-3.6.9-6.1 4.1-6.1 7.8V722c0 4.4 3.6 8 8 8H650c4.4 0 8-3.6 8-8v-39.8c0-4.4-3.6-8-8-8z")),t.PoweroffOutline=o("poweroff",s,r(a,"M705.6 124.9a8 8 0 0 0-11.6 7.2v64.2c0 5.5 2.9 10.6 7.5 13.6a352.2 352.2 0 0 1 62.2 49.8c32.7 32.8 58.4 70.9 76.3 113.3a355 355 0 0 1 27.9 138.7c0 48.1-9.4 94.8-27.9 138.7a355.92 355.92 0 0 1-76.3 113.3 353.06 353.06 0 0 1-113.2 76.4c-43.8 18.6-90.5 28-138.5 28s-94.7-9.4-138.5-28a353.06 353.06 0 0 1-113.2-76.4A355.92 355.92 0 0 1 184 650.4a355 355 0 0 1-27.9-138.7c0-48.1 9.4-94.8 27.9-138.7 17.9-42.4 43.6-80.5 76.3-113.3 19-19 39.8-35.6 62.2-49.8 4.7-2.9 7.5-8.1 7.5-13.6V132c0-6-6.3-9.8-11.6-7.2C178.5 195.2 82 339.3 80 506.3 77.2 745.1 272.5 943.5 511.2 944c239 .5 432.8-193.3 432.8-432.4 0-169.2-97-315.7-238.4-386.7zM480 560h64c4.4 0 8-3.6 8-8V88c0-4.4-3.6-8-8-8h-64c-4.4 0-8 3.6-8 8v464c0 4.4 3.6 8 8 8z")),t.QqOutline=o("qq",s,r(a,"M824.8 613.2c-16-51.4-34.4-94.6-62.7-165.3C766.5 262.2 689.3 112 511.5 112 331.7 112 256.2 265.2 261 447.9c-28.4 70.8-46.7 113.7-62.7 165.3-34 109.5-23 154.8-14.6 155.8 18 2.2 70.1-82.4 70.1-82.4 0 49 25.2 112.9 79.8 159-26.4 8.1-85.7 29.9-71.6 53.8 11.4 19.3 196.2 12.3 249.5 6.3 53.3 6 238.1 13 249.5-6.3 14.1-23.8-45.3-45.7-71.6-53.8 54.6-46.2 79.8-110.1 79.8-159 0 0 52.1 84.6 70.1 82.4 8.5-1.1 19.5-46.4-14.5-155.8z")),t.QrcodeOutline=o("qrcode",s,r(a,"M468 128H160c-17.7 0-32 14.3-32 32v308c0 4.4 3.6 8 8 8h332c4.4 0 8-3.6 8-8V136c0-4.4-3.6-8-8-8zm-56 284H192V192h220v220zm-138-74h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm194 210H136c-4.4 0-8 3.6-8 8v308c0 17.7 14.3 32 32 32h308c4.4 0 8-3.6 8-8V556c0-4.4-3.6-8-8-8zm-56 284H192V612h220v220zm-138-74h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm590-630H556c-4.4 0-8 3.6-8 8v332c0 4.4 3.6 8 8 8h332c4.4 0 8-3.6 8-8V160c0-17.7-14.3-32-32-32zm-32 284H612V192h220v220zm-138-74h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm194 210h-48c-4.4 0-8 3.6-8 8v134h-78V556c0-4.4-3.6-8-8-8H556c-4.4 0-8 3.6-8 8v332c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V644h78v102c0 4.4 3.6 8 8 8h190c4.4 0 8-3.6 8-8V556c0-4.4-3.6-8-8-8zM746 832h-48c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zm142 0h-48c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8z")),t.QuestionOutline=o("question",s,r(a,"M764 280.9c-14-30.6-33.9-58.1-59.3-81.6C653.1 151.4 584.6 125 512 125s-141.1 26.4-192.7 74.2c-25.4 23.6-45.3 51-59.3 81.7-14.6 32-22 65.9-22 100.9v27c0 6.2 5 11.2 11.2 11.2h54c6.2 0 11.2-5 11.2-11.2v-27c0-99.5 88.6-180.4 197.6-180.4s197.6 80.9 197.6 180.4c0 40.8-14.5 79.2-42 111.2-27.2 31.7-65.6 54.4-108.1 64-24.3 5.5-46.2 19.2-61.7 38.8a110.85 110.85 0 0 0-23.9 68.6v31.4c0 6.2 5 11.2 11.2 11.2h54c6.2 0 11.2-5 11.2-11.2v-31.4c0-15.7 10.9-29.5 26-32.9 58.4-13.2 111.4-44.7 149.3-88.7 19.1-22.3 34-47.1 44.3-74 10.7-27.9 16.1-57.2 16.1-87 0-35-7.4-69-22-100.9zM512 787c-30.9 0-56 25.1-56 56s25.1 56 56 56 56-25.1 56-56-25.1-56-56-56z")),t.RadiusBottomleftOutline=o("radius-bottomleft",s,r(a,"M712 824h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm2-696h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM136 374h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm0-174h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm752 624h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-174h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-174h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-174h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-174h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-348 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-230 72h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm230 624H358c-87.3 0-158-70.7-158-158V484c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v182c0 127 103 230 230 230h182c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z")),t.RadarChartOutline=o("radar-chart",s,r(a,"M926.8 397.1l-396-288a31.81 31.81 0 0 0-37.6 0l-396 288a31.99 31.99 0 0 0-11.6 35.8l151.3 466a32 32 0 0 0 30.4 22.1h489.5c13.9 0 26.1-8.9 30.4-22.1l151.3-466c4.2-13.2-.5-27.6-11.7-35.8zM838.6 417l-98.5 32-200-144.7V199.9L838.6 417zM466 567.2l-89.1 122.3-55.2-169.2L466 567.2zm-116.3-96.8L484 373.3v140.8l-134.3-43.7zM512 599.2l93.9 128.9H418.1L512 599.2zm28.1-225.9l134.2 97.1L540.1 514V373.3zM558 567.2l144.3-46.9-55.2 169.2L558 567.2zm-74-367.3v104.4L283.9 449l-98.5-32L484 199.9zM169.3 470.8l86.5 28.1 80.4 246.4-53.8 73.9-113.1-348.4zM327.1 853l50.3-69h269.3l50.3 69H327.1zm414.5-33.8l-53.8-73.9 80.4-246.4 86.5-28.1-113.1 348.4z")),t.RadiusBottomrightOutline=o("radius-bottomright",s,r(a,"M368 824h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-58-624h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm578 102h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-174h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM192 824h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-174h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-174h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-174h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0-174h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm292 72h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm174 0h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm230 276h-56c-4.4 0-8 3.6-8 8v182c0 87.3-70.7 158-158 158H484c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h182c127 0 230-103 230-230V484c0-4.4-3.6-8-8-8z")),t.RadiusSettingOutline=o("radius-setting",s,r(a,"M396 140h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-44 684h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm524-204h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM192 344h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 160h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 160h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 160h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm320 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm160 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm140-284c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V370c0-127-103-230-230-230H484c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h170c87.3 0 158 70.7 158 158v170zM236 96H92c-4.4 0-8 3.6-8 8v144c0 4.4 3.6 8 8 8h144c4.4 0 8-3.6 8-8V104c0-4.4-3.6-8-8-8zm-48 101.6c0 1.3-1.1 2.4-2.4 2.4h-43.2c-1.3 0-2.4-1.1-2.4-2.4v-43.2c0-1.3 1.1-2.4 2.4-2.4h43.2c1.3 0 2.4 1.1 2.4 2.4v43.2zM920 780H776c-4.4 0-8 3.6-8 8v144c0 4.4 3.6 8 8 8h144c4.4 0 8-3.6 8-8V788c0-4.4-3.6-8-8-8zm-48 101.6c0 1.3-1.1 2.4-2.4 2.4h-43.2c-1.3 0-2.4-1.1-2.4-2.4v-43.2c0-1.3 1.1-2.4 2.4-2.4h43.2c1.3 0 2.4 1.1 2.4 2.4v43.2z")),t.RadiusUprightOutline=o("radius-upright",s,r(a,"M368 128h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-2 696h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm522-174h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 174h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM192 128h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 174h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 174h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 174h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 174h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm348 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm174 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-48-696H484c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h182c87.3 0 158 70.7 158 158v182c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V358c0-127-103-230-230-230z")),t.RadiusUpleftOutline=o("radius-upleft",s,r(a,"M656 200h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm58 624h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM192 650h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 174h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm696-696h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 174h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 174h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 174h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 174h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-348 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm-174 0h-56c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm174-696H358c-127 0-230 103-230 230v182c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V358c0-87.3 70.7-158 158-158h182c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z")),t.RedditOutline=o("reddit",s,r(a,"M288 568a56 56 0 1 0 112 0 56 56 0 1 0-112 0zm338.7 119.7c-23.1 18.2-68.9 37.8-114.7 37.8s-91.6-19.6-114.7-37.8c-14.4-11.3-35.3-8.9-46.7 5.5s-8.9 35.3 5.5 46.7C396.3 771.6 457.5 792 512 792s115.7-20.4 155.9-52.1a33.25 33.25 0 1 0-41.2-52.2zM960 456c0-61.9-50.1-112-112-112-42.1 0-78.7 23.2-97.9 57.6-57.6-31.5-127.7-51.8-204.1-56.5L612.9 195l127.9 36.9c11.5 32.6 42.6 56.1 79.2 56.1 46.4 0 84-37.6 84-84s-37.6-84-84-84c-32 0-59.8 17.9-74 44.2L603.5 123a33.2 33.2 0 0 0-39.6 18.4l-90.8 203.9c-74.5 5.2-142.9 25.4-199.2 56.2A111.94 111.94 0 0 0 176 344c-61.9 0-112 50.1-112 112 0 45.8 27.5 85.1 66.8 102.5-7.1 21-10.8 43-10.8 65.5 0 154.6 175.5 280 392 280s392-125.4 392-280c0-22.6-3.8-44.5-10.8-65.5C932.5 541.1 960 501.8 960 456zM820 172.5a31.5 31.5 0 1 1 0 63 31.5 31.5 0 0 1 0-63zM120 456c0-30.9 25.1-56 56-56a56 56 0 0 1 50.6 32.1c-29.3 22.2-53.5 47.8-71.5 75.9a56.23 56.23 0 0 1-35.1-52zm392 381.5c-179.8 0-325.5-95.6-325.5-213.5S332.2 410.5 512 410.5 837.5 506.1 837.5 624 691.8 837.5 512 837.5zM868.8 508c-17.9-28.1-42.2-53.7-71.5-75.9 9-18.9 28.3-32.1 50.6-32.1 30.9 0 56 25.1 56 56 .1 23.5-14.5 43.7-35.1 52zM624 568a56 56 0 1 0 112 0 56 56 0 1 0-112 0z")),t.RedoOutline=o("redo",s,r(a,"M758.2 839.1C851.8 765.9 912 651.9 912 523.9 912 303 733.5 124.3 512.6 124 291.4 123.7 112 302.8 112 523.9c0 125.2 57.5 236.9 147.6 310.2 3.5 2.8 8.6 2.2 11.4-1.3l39.4-50.5c2.7-3.4 2.1-8.3-1.2-11.1-8.1-6.6-15.9-13.7-23.4-21.2a318.64 318.64 0 0 1-68.6-101.7C200.4 609 192 567.1 192 523.9s8.4-85.1 25.1-124.5c16.1-38.1 39.2-72.3 68.6-101.7 29.4-29.4 63.6-52.5 101.7-68.6C426.9 212.4 468.8 204 512 204s85.1 8.4 124.5 25.1c38.1 16.1 72.3 39.2 101.7 68.6 29.4 29.4 52.5 63.6 68.6 101.7 16.7 39.4 25.1 81.3 25.1 124.5s-8.4 85.1-25.1 124.5a318.64 318.64 0 0 1-68.6 101.7c-9.3 9.3-19.1 18-29.3 26L668.2 724a8 8 0 0 0-14.1 3l-39.6 162.2c-1.2 5 2.6 9.9 7.7 9.9l167 .8c6.7 0 10.5-7.7 6.3-12.9l-37.3-47.9z")),t.ReloadTimeOutline=o("reload-time",s,r(a,"M536.1 273H488c-4.4 0-8 3.6-8 8v275.3c0 2.6 1.2 5 3.3 6.5l165.3 120.7c3.6 2.6 8.6 1.9 11.2-1.7l28.6-39c2.7-3.7 1.9-8.7-1.7-11.2L544.1 528.5V281c0-4.4-3.6-8-8-8zm219.8 75.2l156.8 38.3c5 1.2 9.9-2.6 9.9-7.7l.8-161.5c0-6.7-7.7-10.5-12.9-6.3L752.9 334.1a8 8 0 0 0 3 14.1zm167.7 301.1l-56.7-19.5a8 8 0 0 0-10.1 4.8c-1.9 5.1-3.9 10.1-6 15.1-17.8 42.1-43.3 80-75.9 112.5a353 353 0 0 1-112.5 75.9 352.18 352.18 0 0 1-137.7 27.8c-47.8 0-94.1-9.3-137.7-27.8a353 353 0 0 1-112.5-75.9c-32.5-32.5-58-70.4-75.9-112.5A353.44 353.44 0 0 1 171 512c0-47.8 9.3-94.2 27.8-137.8 17.8-42.1 43.3-80 75.9-112.5a353 353 0 0 1 112.5-75.9C430.6 167.3 477 158 524.8 158s94.1 9.3 137.7 27.8A353 353 0 0 1 775 261.7c10.2 10.3 19.8 21 28.6 32.3l59.8-46.8C784.7 146.6 662.2 81.9 524.6 82 285 82.1 92.6 276.7 95 516.4 97.4 751.9 288.9 942 524.8 942c185.5 0 343.5-117.6 403.7-282.3 1.5-4.2-.7-8.9-4.9-10.4z")),t.RetweetOutline=o("retweet",s,r(i,"M365.6 317.3h349L595.5 436.5a35.91 35.91 0 0 0 0 50.9c7 7 16.2 10.5 25.5 10.5s18.4-3.5 25.5-10.5L825 308.9c6.8-6.8 10.5-15.9 10.5-25.5s-3.8-18.7-10.5-25.5L641.2 74.2a35.91 35.91 0 0 0-50.9 0 35.91 35.91 0 0 0 0 50.9l120.2 120.2H365.6c-79.8 0-154.8 31.1-211.2 87.5C98.1 389.2 67 464.2 67 544c0 19.9 16.1 36 36 36s36-16.1 36-36c0-60.5 23.6-117.5 66.4-160.3 42.8-42.8 99.7-66.4 160.2-66.4z","M923.1 441c-19.9 0-36 16.1-36 36 0 60.5-23.6 117.5-66.4 160.3a225.18 225.18 0 0 1-160.3 66.4h-349l119.2-119.2a35.91 35.91 0 0 0 0-50.9 35.91 35.91 0 0 0-50.9 0L201.2 712.1c-6.8 6.8-10.5 15.9-10.5 25.5s3.8 18.7 10.5 25.5l183.7 183.7c7 7 16.2 10.5 25.5 10.5s18.4-3.5 25.5-10.5a35.91 35.91 0 0 0 0-50.9L315.6 775.6h344.9c79.8 0 154.8-31.1 211.2-87.5 56.4-56.4 87.5-131.4 87.5-211.2a36.1 36.1 0 0 0-36.1-35.9z")),t.ReloadOutline=o("reload",s,r(a,"M909.1 209.3l-56.4 44.1C775.8 155.1 656.2 92 521.9 92 290 92 102.3 279.5 102 511.5 101.7 743.7 289.8 932 521.9 932c181.3 0 335.8-115 394.6-276.1 1.5-4.2-.7-8.9-4.9-10.3l-56.7-19.5a8 8 0 0 0-10.1 4.8c-1.8 5-3.8 10-5.9 14.9-17.3 41-42.1 77.8-73.7 109.4A344.77 344.77 0 0 1 655.9 829c-42.3 17.9-87.4 27-133.8 27-46.5 0-91.5-9.1-133.8-27A341.5 341.5 0 0 1 279 755.2a342.16 342.16 0 0 1-73.7-109.4c-17.9-42.4-27-87.4-27-133.9s9.1-91.5 27-133.9c17.3-41 42.1-77.8 73.7-109.4 31.6-31.6 68.4-56.4 109.3-73.8 42.3-17.9 87.4-27 133.8-27 46.5 0 91.5 9.1 133.8 27a341.5 341.5 0 0 1 109.3 73.8c9.9 9.9 19.2 20.4 27.8 31.4l-60.2 47a8 8 0 0 0 3 14.1l175.6 43c5 1.2 9.9-2.6 9.9-7.7l.8-180.9c-.1-6.6-7.8-10.3-13-6.2z")),t.RightOutline=o("right",s,r(a,"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")),t.RobotOutline=o("robot",s,r(a,"M300 328a60 60 0 1 0 120 0 60 60 0 1 0-120 0zM852 64H172c-17.7 0-32 14.3-32 32v660c0 17.7 14.3 32 32 32h680c17.7 0 32-14.3 32-32V96c0-17.7-14.3-32-32-32zm-32 660H204V128h616v596zM604 328a60 60 0 1 0 120 0 60 60 0 1 0-120 0zm250.2 556H169.8c-16.5 0-29.8 14.3-29.8 32v36c0 4.4 3.3 8 7.4 8h729.1c4.1 0 7.4-3.6 7.4-8v-36c.1-17.7-13.2-32-29.7-32zM664 508H360c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h304c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8z")),t.RiseOutline=o("rise",s,r(a,"M917 211.1l-199.2 24c-6.6.8-9.4 8.9-4.7 13.6l59.3 59.3-226 226-101.8-101.7c-6.3-6.3-16.4-6.2-22.6 0L100.3 754.1a8.03 8.03 0 0 0 0 11.3l45 45.2c3.1 3.1 8.2 3.1 11.3 0L433.3 534 535 635.7c6.3 6.2 16.4 6.2 22.6 0L829 364.5l59.3 59.3a8.01 8.01 0 0 0 13.6-4.7l24-199.2c.7-5.1-3.7-9.5-8.9-8.8z")),t.RollbackOutline=o("rollback",s,r(a,"M793 242H366v-74c0-6.7-7.7-10.4-12.9-6.3l-142 112a8 8 0 0 0 0 12.6l142 112c5.2 4.1 12.9.4 12.9-6.3v-74h415v470H175c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h618c35.3 0 64-28.7 64-64V306c0-35.3-28.7-64-64-64z")),t.SafetyOutline=o("safety",s,r(i,"M512 64L128 192v384c0 212.1 171.9 384 384 384s384-171.9 384-384V192L512 64zm312 512c0 172.3-139.7 312-312 312S200 748.3 200 576V246l312-110 312 110v330z","M378.4 475.1a35.91 35.91 0 0 0-50.9 0 35.91 35.91 0 0 0 0 50.9l129.4 129.4 2.1 2.1a33.98 33.98 0 0 0 48.1 0L730.6 434a33.98 33.98 0 0 0 0-48.1l-2.8-2.8a33.98 33.98 0 0 0-48.1 0L483 579.7 378.4 475.1z")),t.ScanOutline=o("scan",s,r(a,"M136 384h56c4.4 0 8-3.6 8-8V200h176c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H196c-37.6 0-68 30.4-68 68v180c0 4.4 3.6 8 8 8zm512-184h176v176c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V196c0-37.6-30.4-68-68-68H648c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zM376 824H200V648c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v180c0 37.6 30.4 68 68 68h180c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm512-184h-56c-4.4 0-8 3.6-8 8v176H648c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h180c37.6 0 68-30.4 68-68V648c0-4.4-3.6-8-8-8zm16-164H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z")),t.ScissorOutline=o("scissor",s,r(a,"M567.1 512l318.5-319.3c5-5 1.5-13.7-5.6-13.7h-90.5c-2.1 0-4.2.8-5.6 2.3l-273.3 274-90.2-90.5c12.5-22.1 19.7-47.6 19.7-74.8 0-83.9-68.1-152-152-152s-152 68.1-152 152 68.1 152 152 152c27.7 0 53.6-7.4 75.9-20.3l90 90.3-90.1 90.3A151.04 151.04 0 0 0 288 582c-83.9 0-152 68.1-152 152s68.1 152 152 152 152-68.1 152-152c0-27.2-7.2-52.7-19.7-74.8l90.2-90.5 273.3 274c1.5 1.5 3.5 2.3 5.6 2.3H880c7.1 0 10.7-8.6 5.6-13.7L567.1 512zM288 370c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80zm0 444c-44.1 0-80-35.9-80-80s35.9-80 80-80 80 35.9 80 80-35.9 80-80 80z")),t.SelectOutline=o("select",s,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h360c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H184V184h656v320c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V144c0-17.7-14.3-32-32-32zM653.3 599.4l52.2-52.2a8.01 8.01 0 0 0-4.7-13.6l-179.4-21c-5.1-.6-9.5 3.7-8.9 8.9l21 179.4c.8 6.6 8.9 9.4 13.6 4.7l52.4-52.4 256.2 256.2c3.1 3.1 8.2 3.1 11.3 0l42.4-42.4c3.1-3.1 3.1-8.2 0-11.3L653.3 599.4z")),t.SearchOutline=o("search",s,r(a,"M608 112c-167.9 0-304 136.1-304 304 0 70.3 23.9 135 63.9 186.5L114.3 856.1a8.03 8.03 0 0 0 0 11.3l42.3 42.3c3.1 3.1 8.2 3.1 11.3 0l253.6-253.6C473 696.1 537.7 720 608 720c167.9 0 304-136.1 304-304S775.9 112 608 112zm161.2 465.2C726.2 620.3 668.9 644 608 644s-118.2-23.7-161.2-66.8C403.7 534.2 380 476.9 380 416s23.7-118.2 66.8-161.2c43-43.1 100.3-66.8 161.2-66.8s118.2 23.7 161.2 66.8c43.1 43 66.8 100.3 66.8 161.2s-23.7 118.2-66.8 161.2z")),t.ShakeOutline=o("shake",s,r(a,"M324 666a48 48 0 1 0 96 0 48 48 0 1 0-96 0zm616.7-309.6L667.6 83.2C655.2 70.9 638.7 64 621.1 64s-34.1 6.8-46.5 19.2L83.3 574.5a65.85 65.85 0 0 0 0 93.1l273.2 273.2c12.3 12.3 28.9 19.2 46.5 19.2s34.1-6.8 46.5-19.2l491.3-491.3c25.6-25.7 25.6-67.5-.1-93.1zM403 880.1L143.9 621l477.2-477.2 259 259.2L403 880.1zM152.8 373.7a7.9 7.9 0 0 0 11.2 0L373.7 164a7.9 7.9 0 0 0 0-11.2l-38.4-38.4a7.9 7.9 0 0 0-11.2 0L114.3 323.9a7.9 7.9 0 0 0 0 11.2l38.5 38.6zm718.6 276.6a7.9 7.9 0 0 0-11.2 0L650.3 860.1a7.9 7.9 0 0 0 0 11.2l38.4 38.4a7.9 7.9 0 0 0 11.2 0L909.7 700a7.9 7.9 0 0 0 0-11.2l-38.3-38.5z")),t.ShareAltOutline=o("share-alt",s,r(a,"M752 664c-28.5 0-54.8 10-75.4 26.7L469.4 540.8a160.68 160.68 0 0 0 0-57.6l207.2-149.9C697.2 350 723.5 360 752 360c66.2 0 120-53.8 120-120s-53.8-120-120-120-120 53.8-120 120c0 11.6 1.6 22.7 4.7 33.3L439.9 415.8C410.7 377.1 364.3 352 312 352c-88.4 0-160 71.6-160 160s71.6 160 160 160c52.3 0 98.7-25.1 127.9-63.8l196.8 142.5c-3.1 10.6-4.7 21.8-4.7 33.3 0 66.2 53.8 120 120 120s120-53.8 120-120-53.8-120-120-120zm0-476c28.7 0 52 23.3 52 52s-23.3 52-52 52-52-23.3-52-52 23.3-52 52-52zM312 600c-48.5 0-88-39.5-88-88s39.5-88 88-88 88 39.5 88 88-39.5 88-88 88zm440 236c-28.7 0-52-23.3-52-52s23.3-52 52-52 52 23.3 52 52-23.3 52-52 52z")),t.ShoppingCartOutline=o("shopping-cart",s,r(i,"M922.9 701.9H327.4l29.9-60.9 496.8-.9c16.8 0 31.2-12 34.2-28.6l68.8-385.1c1.8-10.1-.9-20.5-7.5-28.4a34.99 34.99 0 0 0-26.6-12.5l-632-2.1-5.4-25.4c-3.4-16.2-18-28-34.6-28H96.5a35.3 35.3 0 1 0 0 70.6h125.9L246 312.8l58.1 281.3-74.8 122.1a34.96 34.96 0 0 0-3 36.8c6 11.9 18.1 19.4 31.5 19.4h62.8a102.43 102.43 0 0 0-20.6 61.7c0 56.6 46 102.6 102.6 102.6s102.6-46 102.6-102.6c0-22.3-7.4-44-20.6-61.7h161.1a102.43 102.43 0 0 0-20.6 61.7c0 56.6 46 102.6 102.6 102.6s102.6-46 102.6-102.6c0-22.3-7.4-44-20.6-61.7H923c19.4 0 35.3-15.8 35.3-35.3a35.42 35.42 0 0 0-35.4-35.2zM305.7 253l575.8 1.9-56.4 315.8-452.3.8L305.7 253zm96.9 612.7c-17.4 0-31.6-14.2-31.6-31.6 0-17.4 14.2-31.6 31.6-31.6s31.6 14.2 31.6 31.6a31.6 31.6 0 0 1-31.6 31.6zm325.1 0c-17.4 0-31.6-14.2-31.6-31.6 0-17.4 14.2-31.6 31.6-31.6s31.6 14.2 31.6 31.6a31.6 31.6 0 0 1-31.6 31.6z")),t.ShrinkOutline=o("shrink",s,r(a,"M881.7 187.4l-45.1-45.1a8.03 8.03 0 0 0-11.3 0L667.8 299.9l-54.7-54.7a7.94 7.94 0 0 0-13.5 4.7L576.1 439c-.6 5.2 3.7 9.5 8.9 8.9l189.2-23.5c6.6-.8 9.3-8.8 4.7-13.5l-54.7-54.7 157.6-157.6c3-3 3-8.1-.1-11.2zM439 576.1l-189.2 23.5c-6.6.8-9.3 8.9-4.7 13.5l54.7 54.7-157.5 157.5a8.03 8.03 0 0 0 0 11.3l45.1 45.1c3.1 3.1 8.2 3.1 11.3 0l157.6-157.6 54.7 54.7a7.94 7.94 0 0 0 13.5-4.7L447.9 585a7.9 7.9 0 0 0-8.9-8.9z")),t.SketchOutline=o("sketch",s,r(a,"M925.6 405.1l-203-253.7a6.5 6.5 0 0 0-5-2.4H306.4c-1.9 0-3.8.9-5 2.4l-203 253.7a6.5 6.5 0 0 0 .2 8.3l408.6 459.5c1.2 1.4 3 2.1 4.8 2.1 1.8 0 3.5-.8 4.8-2.1l408.6-459.5a6.5 6.5 0 0 0 .2-8.3zM645.2 206.4l34.4 133.9-132.5-133.9h98.1zm8.2 178.5H370.6L512 242l141.4 142.9zM378.8 206.4h98.1L344.3 340.3l34.5-133.9zm-53.4 7l-44.1 171.5h-93.1l137.2-171.5zM194.6 434.9H289l125.8 247.7-220.2-247.7zM512 763.4L345.1 434.9h333.7L512 763.4zm97.1-80.8L735 434.9h94.4L609.1 682.6zm133.6-297.7l-44.1-171.5 137.2 171.5h-93.1z")),t.SmallDashOutline=o("small-dash",s,r(a,"M112 476h72v72h-72zm182 0h72v72h-72zm364 0h72v72h-72zm182 0h72v72h-72zm-364 0h72v72h-72z")),t.SlackOutline=o("slack",s,r(a,"M925.5 541.9a71.49 71.49 0 0 0-90.1-45.9l-80 26L703 360.9l80-26a71.49 71.49 0 0 0 45.9-90.1 71.49 71.49 0 0 0-90.1-45.9l-80 26-26.2-80.6a71.49 71.49 0 1 0-136 44.2l26.2 80.6-161.1 52.4-26.2-80.6a71.49 71.49 0 1 0-136 44.2l26.2 80.6-81.1 26.4a71.49 71.49 0 0 0-45.9 90.1 71.49 71.49 0 0 0 90.1 45.9l81.1-26.4 52.4 161.1-81.3 26.3a71.49 71.49 0 0 0-45.9 90.1 71.49 71.49 0 0 0 90.1 45.9l81.1-26.4 26.2 80.6a71.49 71.49 0 0 0 90.1 45.9 71.49 71.49 0 0 0 45.9-90.1l-26.2-80.6 161.1-52.4 26.2 80.6a71.49 71.49 0 0 0 90.1 45.9 71.49 71.49 0 0 0 45.9-90.1l-26-80.5 80-26c37.5-12.1 58.1-52.5 45.9-90.1zm-467.3 76.7l-52.4-161.1L567 405.1l52.4 161.1-161.2 52.4z")),t.SolutionOutline=o("solution",s,r(a,"M688 264c0-4.4-3.6-8-8-8H296c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h384c4.4 0 8-3.6 8-8v-48zm-8 136H296c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h384c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zM480 544H296c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zm-48 308H208V148h560v344c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V108c0-17.7-14.3-32-32-32H168c-17.7 0-32 14.3-32 32v784c0 17.7 14.3 32 32 32h264c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm356.8-74.4c29-26.3 47.2-64.3 47.2-106.6 0-79.5-64.5-144-144-144s-144 64.5-144 144c0 42.3 18.2 80.3 47.2 106.6-57 32.5-96.2 92.7-99.2 162.1-.2 4.5 3.5 8.3 8 8.3h48.1c4.2 0 7.7-3.3 8-7.6C564 871.2 621.7 816 692 816s128 55.2 131.9 124.4c.2 4.2 3.7 7.6 8 7.6H880c4.6 0 8.2-3.8 8-8.3-2.9-69.5-42.2-129.6-99.2-162.1zM692 591c44.2 0 80 35.8 80 80s-35.8 80-80 80-80-35.8-80-80 35.8-80 80-80z")),t.SortAscendingOutline=o("sort-ascending",s,r(a,"M839.6 433.8L749 150.5a9.24 9.24 0 0 0-8.9-6.5h-77.4c-4.1 0-7.6 2.6-8.9 6.5l-91.3 283.3c-.3.9-.5 1.9-.5 2.9 0 5.1 4.2 9.3 9.3 9.3h56.4c4.2 0 7.8-2.8 9-6.8l17.5-61.6h89l17.3 61.5c1.1 4 4.8 6.8 9 6.8h61.2c1 0 1.9-.1 2.8-.4 2.4-.8 4.3-2.4 5.5-4.6 1.1-2.2 1.3-4.7.6-7.1zM663.3 325.5l32.8-116.9h6.3l32.1 116.9h-71.2zm143.5 492.9H677.2v-.4l132.6-188.9c1.1-1.6 1.7-3.4 1.7-5.4v-36.4c0-5.1-4.2-9.3-9.3-9.3h-204c-5.1 0-9.3 4.2-9.3 9.3v43c0 5.1 4.2 9.3 9.3 9.3h122.6v.4L587.7 828.9a9.35 9.35 0 0 0-1.7 5.4v36.4c0 5.1 4.2 9.3 9.3 9.3h211.4c5.1 0 9.3-4.2 9.3-9.3v-43a9.2 9.2 0 0 0-9.2-9.3zM416 702h-76V172c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v530h-76c-6.7 0-10.5 7.8-6.3 13l112 141.9a8 8 0 0 0 12.6 0l112-141.9c4.1-5.2.4-13-6.3-13z")),t.SortDescendingOutline=o("sort-descending",s,r(a,"M839.6 433.8L749 150.5a9.24 9.24 0 0 0-8.9-6.5h-77.4c-4.1 0-7.6 2.6-8.9 6.5l-91.3 283.3c-.3.9-.5 1.9-.5 2.9 0 5.1 4.2 9.3 9.3 9.3h56.4c4.2 0 7.8-2.8 9-6.8l17.5-61.6h89l17.3 61.5c1.1 4 4.8 6.8 9 6.8h61.2c1 0 1.9-.1 2.8-.4 2.4-.8 4.3-2.4 5.5-4.6 1.1-2.2 1.3-4.7.6-7.1zM663.3 325.5l32.8-116.9h6.3l32.1 116.9h-71.2zm143.5 492.9H677.2v-.4l132.6-188.9c1.1-1.6 1.7-3.4 1.7-5.4v-36.4c0-5.1-4.2-9.3-9.3-9.3h-204c-5.1 0-9.3 4.2-9.3 9.3v43c0 5.1 4.2 9.3 9.3 9.3h122.6v.4L587.7 828.9a9.35 9.35 0 0 0-1.7 5.4v36.4c0 5.1 4.2 9.3 9.3 9.3h211.4c5.1 0 9.3-4.2 9.3-9.3v-43a9.2 9.2 0 0 0-9.2-9.3zM310.3 167.1a8 8 0 0 0-12.6 0L185.7 309c-4.2 5.3-.4 13 6.3 13h76v530c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V322h76c6.7 0 10.5-7.8 6.3-13l-112-141.9z")),t.StockOutline=o("stock",s,r(a,"M904 747H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM165.7 621.8l39.7 39.5c3.1 3.1 8.2 3.1 11.3 0l234.7-233.9 97.6 97.3a32.11 32.11 0 0 0 45.2 0l264.2-263.2c3.1-3.1 3.1-8.2 0-11.3l-39.7-39.6a8.03 8.03 0 0 0-11.3 0l-235.7 235-97.7-97.3a32.11 32.11 0 0 0-45.2 0L165.7 610.5a7.94 7.94 0 0 0 0 11.3z")),t.StrikethroughOutline=o("strikethrough",s,r(a,"M952 474H569.9c-10-2-20.5-4-31.6-6-15.9-2.9-22.2-4.1-30.8-5.8-51.3-10-82.2-20-106.8-34.2-35.1-20.5-52.2-48.3-52.2-85.1 0-37 15.2-67.7 44-89 28.4-21 68.8-32.1 116.8-32.1 54.8 0 97.1 14.4 125.8 42.8 14.6 14.4 25.3 32.1 31.8 52.6 1.3 4.1 2.8 10 4.3 17.8.9 4.8 5.2 8.2 9.9 8.2h72.8c5.6 0 10.1-4.6 10.1-10.1v-1c-.7-6.8-1.3-12.1-2-16-7.3-43.5-28-81.7-59.7-110.3-44.4-40.5-109.7-61.8-188.7-61.8-72.3 0-137.4 18.1-183.3 50.9-25.6 18.4-45.4 41.2-58.6 67.7-13.5 27.1-20.3 58.4-20.3 92.9 0 29.5 5.7 54.5 17.3 76.5 8.3 15.7 19.6 29.5 34.1 42H72c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h433.2c2.1.4 3.9.8 5.9 1.2 30.9 6.2 49.5 10.4 66.6 15.2 23 6.5 40.6 13.3 55.2 21.5 35.8 20.2 53.3 49.2 53.3 89 0 35.3-15.5 66.8-43.6 88.8-30.5 23.9-75.6 36.4-130.5 36.4-43.7 0-80.7-8.5-110.2-25-29.1-16.3-49.1-39.8-59.7-69.5-.8-2.2-1.7-5.2-2.7-9-1.2-4.4-5.3-7.5-9.7-7.5h-79.7c-5.6 0-10.1 4.6-10.1 10.1v1c.2 2.3.4 4.2.6 5.7 6.5 48.8 30.3 88.8 70.7 118.8 47.1 34.8 113.4 53.2 191.8 53.2 84.2 0 154.8-19.8 204.2-57.3 25-18.9 44.2-42.2 57.1-69 13-27.1 19.7-57.9 19.7-91.5 0-31.8-5.8-58.4-17.8-81.4-5.8-11.2-13.1-21.5-21.8-30.8H952c4.4 0 8-3.6 8-8v-60a8 8 0 0 0-8-7.9z")),t.SwapLeftOutline=o("swap-left",s,r(i,"M163.9 575.6c-.3 0-.6 0-.9-.1-.4 0-.7-.1-1.1-.1-.2 0-.5-.1-.7-.1-.4-.1-.8-.1-1.1-.2-.2 0-.4-.1-.6-.1-.4-.1-.8-.2-1.1-.3-.2 0-.4-.1-.6-.1l-1.1-.3c-.2-.1-.4-.1-.6-.2l-1-.3c-.2-.1-.5-.2-.7-.2l-.9-.3c-.3-.1-.5-.2-.8-.3-.3-.1-.5-.2-.8-.3-.3-.1-.6-.3-.9-.4-.2-.1-.4-.2-.7-.3-.3-.2-.6-.3-.9-.5l-.6-.3c-.3-.2-.7-.4-1-.6-.2-.1-.3-.2-.5-.3-.3-.2-.7-.4-1-.6-.2-.1-.3-.2-.5-.3-.3-.2-.6-.4-.9-.7-.2-.1-.4-.3-.5-.4-.3-.2-.6-.4-.8-.7-.2-.2-.5-.4-.7-.6-.2-.2-.4-.4-.6-.5-.9-.8-1.7-1.6-2.5-2.5-.2-.2-.4-.4-.5-.6-.2-.2-.4-.5-.6-.7-.2-.3-.4-.6-.7-.8-.1-.2-.3-.4-.4-.5-.2-.3-.4-.6-.7-.9-.1-.2-.2-.3-.3-.5-.2-.3-.4-.7-.6-1-.1-.2-.2-.3-.3-.5-.2-.3-.4-.7-.6-1l-.3-.6c-.2-.3-.3-.6-.5-.9l-.3-.6c-.1-.3-.3-.6-.4-.9-.1-.3-.2-.5-.3-.8-.1-.3-.2-.5-.3-.8l-.3-.9c-.1-.2-.2-.5-.2-.7l-.3-1c-.1-.2-.1-.4-.2-.6l-.3-1.1c0-.2-.1-.4-.1-.6-.1-.4-.2-.8-.2-1.1 0-.2-.1-.4-.1-.6-.1-.4-.1-.8-.2-1.1 0-.2-.1-.5-.1-.7 0-.4-.1-.7-.1-1.1 0-.3 0-.6-.1-.9 0-.3 0-.6-.1-.8-.1-1.2-.1-2.4 0-3.6 0-.3 0-.6.1-.8 0-.3 0-.6.1-.9 0-.4.1-.7.1-1.1 0-.2.1-.5.1-.7.1-.4.1-.8.2-1.1 0-.2.1-.4.1-.6.1-.4.2-.8.2-1.1 0-.2.1-.4.1-.6l.3-1.1c.1-.2.1-.4.2-.6l.3-1c.1-.2.2-.5.2-.7l.3-.9c.1-.3.2-.5.3-.8.1-.3.2-.5.3-.8.1-.3.3-.6.4-.9l.3-.6c.2-.3.3-.6.5-.9l.3-.6c.2-.3.4-.7.6-1 .1-.2.2-.3.3-.5.2-.3.4-.7.6-1 .1-.2.2-.3.3-.5.2-.3.4-.6.7-.9.1-.2.3-.4.4-.5.2-.3.4-.6.7-.8.2-.2.4-.5.6-.7l.6-.6c.4-.4.8-.9 1.2-1.3L318.6 337a35.91 35.91 0 0 1 50.9 0 35.91 35.91 0 0 1 0 50.9l-116 116h544.1c19.9 0 36 16.1 36 36s-16.1 36-36 36H164.8c-.4-.2-.7-.3-.9-.3z")),t.SwapOutline=o("swap",s,r(a,"M847.9 592H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h605.2L612.9 851c-4.1 5.2-.4 13 6.3 13h72.5c4.9 0 9.5-2.2 12.6-6.1l168.8-214.1c16.5-21 1.6-51.8-25.2-51.8zM872 356H266.8l144.3-183c4.1-5.2.4-13-6.3-13h-72.5c-4.9 0-9.5 2.2-12.6 6.1L150.9 380.2c-16.5 21-1.6 51.8 25.1 51.8h696c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8z")),t.SwapRightOutline=o("swap-right",s,r(i,"M830.1 575.6c.3 0 .6 0 .9-.1.4 0 .7-.1 1.1-.1.2 0 .5-.1.7-.1.4-.1.8-.1 1.1-.2.2 0 .4-.1.6-.1.4-.1.8-.2 1.1-.3.2 0 .4-.1.6-.1l1.1-.3c.2-.1.4-.1.6-.2l1-.3c.2-.1.5-.2.7-.2l.9-.3c.3-.1.5-.2.8-.3.3-.1.5-.2.8-.3.3-.1.6-.3.9-.4.2-.1.4-.2.7-.3.3-.2.6-.3.9-.5l.6-.3c.3-.2.7-.4 1-.6.2-.1.3-.2.5-.3.3-.2.7-.4 1-.6.2-.1.3-.2.5-.3.3-.2.6-.4.9-.7.2-.1.4-.3.5-.4.3-.2.6-.4.8-.7.2-.2.5-.4.7-.6.2-.2.4-.4.6-.5.9-.8 1.7-1.6 2.5-2.5.2-.2.4-.4.5-.6.2-.2.4-.5.6-.7.2-.3.4-.6.7-.8.1-.2.3-.4.4-.5.2-.3.4-.6.7-.9.1-.2.2-.3.3-.5.2-.3.4-.7.6-1 .1-.2.2-.3.3-.5.2-.3.4-.7.6-1l.3-.6c.2-.3.3-.6.5-.9l.3-.6c.1-.3.3-.6.4-.9.1-.3.2-.5.3-.8.1-.3.2-.5.3-.8l.3-.9c.1-.2.2-.5.2-.7l.3-1c.1-.2.1-.4.2-.6l.3-1.1c0-.2.1-.4.1-.6.1-.4.2-.8.2-1.1 0-.2.1-.4.1-.6.1-.4.1-.8.2-1.1 0-.2.1-.5.1-.7 0-.4.1-.7.1-1.1 0-.3 0-.6.1-.9 0-.3 0-.6.1-.8.1-1.2.1-2.4 0-3.6 0-.3 0-.6-.1-.8 0-.3 0-.6-.1-.9 0-.4-.1-.7-.1-1.1 0-.2-.1-.5-.1-.7-.1-.4-.1-.8-.2-1.1 0-.2-.1-.4-.1-.6-.1-.4-.2-.8-.2-1.1 0-.2-.1-.4-.1-.6l-.3-1.1c-.1-.2-.1-.4-.2-.6l-.3-1c-.1-.2-.2-.5-.2-.7l-.3-.9c-.1-.3-.2-.5-.3-.8-.1-.3-.2-.5-.3-.8-.1-.3-.3-.6-.4-.9l-.3-.6c-.2-.3-.3-.6-.5-.9l-.3-.6c-.2-.3-.4-.7-.6-1-.1-.2-.2-.3-.3-.5-.2-.3-.4-.7-.6-1-.1-.2-.2-.3-.3-.5-.2-.3-.4-.6-.7-.9-.1-.2-.3-.4-.4-.5-.2-.3-.4-.6-.7-.8-.2-.2-.4-.5-.6-.7l-.6-.6c-.4-.4-.8-.9-1.2-1.3L675.5 336.8a35.91 35.91 0 0 0-50.9 0 35.91 35.91 0 0 0 0 50.9l116 116H196.5c-19.9 0-36 16.1-36 36s16.1 36 36 36h632.8c.3 0 .6-.1.8-.1z")),t.SyncOutline=o("sync",s,r(a,"M168 504.2c1-43.7 10-86.1 26.9-126 17.3-41 42.1-77.7 73.7-109.4S337 212.3 378 195c42.4-17.9 87.4-27 133.9-27s91.5 9.1 133.8 27A341.5 341.5 0 0 1 755 268.8c9.9 9.9 19.2 20.4 27.8 31.4l-60.2 47a8 8 0 0 0 3 14.1l175.7 43c5 1.2 9.9-2.6 9.9-7.7l.8-180.9c0-6.7-7.7-10.5-12.9-6.3l-56.4 44.1C765.8 155.1 646.2 92 511.8 92 282.7 92 96.3 275.6 92 503.8a8 8 0 0 0 8 8.2h60c4.4 0 7.9-3.5 8-7.8zm756 7.8h-60c-4.4 0-7.9 3.5-8 7.8-1 43.7-10 86.1-26.9 126-17.3 41-42.1 77.8-73.7 109.4A342.45 342.45 0 0 1 512.1 856a342.24 342.24 0 0 1-243.2-100.8c-9.9-9.9-19.2-20.4-27.8-31.4l60.2-47a8 8 0 0 0-3-14.1l-175.7-43c-5-1.2-9.9 2.6-9.9 7.7l-.7 181c0 6.7 7.7 10.5 12.9 6.3l56.4-44.1C258.2 868.9 377.8 932 512.2 932c229.2 0 415.5-183.7 419.8-411.8a8 8 0 0 0-8-8.2z")),t.TaobaoOutline=o("taobao",s,r(a,"M168.5 273.7a68.7 68.7 0 1 0 137.4 0 68.7 68.7 0 1 0-137.4 0zm730 79.2s-23.7-184.4-426.9-70.1c17.3-30 25.6-49.5 25.6-49.5L396.4 205s-40.6 132.6-113 194.4c0 0 70.1 40.6 69.4 39.4 20.1-20.1 38.2-40.6 53.7-60.4 16.1-7 31.5-13.6 46.7-19.8-18.6 33.5-48.7 83.8-78.8 115.6l42.4 37s28.8-27.7 60.4-61.2h36v61.8H372.9v49.5h140.3v118.5c-1.7 0-3.6 0-5.4-.2-15.4-.7-39.5-3.3-49-18.2-11.5-18.1-3-51.5-2.4-71.9h-97l-3.4 1.8s-35.5 159.1 102.3 155.5c129.1 3.6 203-36 238.6-63.1l14.2 52.6 79.6-33.2-53.9-131.9-64.6 20.1 12.1 45.2c-16.6 12.4-35.6 21.7-56.2 28.4V561.3h137.1v-49.5H628.1V450h137.6v-49.5H521.3c17.6-21.4 31.5-41.1 35-53.6l-42.5-11.6c182.8-65.5 284.5-54.2 283.6 53.2v282.8s10.8 97.1-100.4 90.1l-60.2-12.9-14.2 57.1S882.5 880 903.7 680.2c21.3-200-5.2-327.3-5.2-327.3zm-707.4 18.3l-45.4 69.7 83.6 52.1s56 28.5 29.4 81.9C233.8 625.5 112 736.3 112 736.3l109 68.1c75.4-163.7 70.5-142 89.5-200.7 19.5-60.1 23.7-105.9-9.4-139.1-42.4-42.6-47-46.6-110-93.4z")),t.TeamOutline=o("team",s,r(a,"M824.2 699.9a301.55 301.55 0 0 0-86.4-60.4C783.1 602.8 812 546.8 812 484c0-110.8-92.4-201.7-203.2-200-109.1 1.7-197 90.6-197 200 0 62.8 29 118.8 74.2 155.5a300.95 300.95 0 0 0-86.4 60.4C345 754.6 314 826.8 312 903.8a8 8 0 0 0 8 8.2h56c4.3 0 7.9-3.4 8-7.7 1.9-58 25.4-112.3 66.7-153.5A226.62 226.62 0 0 1 612 684c60.9 0 118.2 23.7 161.3 66.8C814.5 792 838 846.3 840 904.3c.1 4.3 3.7 7.7 8 7.7h56a8 8 0 0 0 8-8.2c-2-77-33-149.2-87.8-203.9zM612 612c-34.2 0-66.4-13.3-90.5-37.5a126.86 126.86 0 0 1-37.5-91.8c.3-32.8 13.4-64.5 36.3-88 24-24.6 56.1-38.3 90.4-38.7 33.9-.3 66.8 12.9 91 36.6 24.8 24.3 38.4 56.8 38.4 91.4 0 34.2-13.3 66.3-37.5 90.5A127.3 127.3 0 0 1 612 612zM361.5 510.4c-.9-8.7-1.4-17.5-1.4-26.4 0-15.9 1.5-31.4 4.3-46.5.7-3.6-1.2-7.3-4.5-8.8-13.6-6.1-26.1-14.5-36.9-25.1a127.54 127.54 0 0 1-38.7-95.4c.9-32.1 13.8-62.6 36.3-85.6 24.7-25.3 57.9-39.1 93.2-38.7 31.9.3 62.7 12.6 86 34.4 7.9 7.4 14.7 15.6 20.4 24.4 2 3.1 5.9 4.4 9.3 3.2 17.6-6.1 36.2-10.4 55.3-12.4 5.6-.6 8.8-6.6 6.3-11.6-32.5-64.3-98.9-108.7-175.7-109.9-110.9-1.7-203.3 89.2-203.3 199.9 0 62.8 28.9 118.8 74.2 155.5-31.8 14.7-61.1 35-86.5 60.4-54.8 54.7-85.8 126.9-87.8 204a8 8 0 0 0 8 8.2h56.1c4.3 0 7.9-3.4 8-7.7 1.9-58 25.4-112.3 66.7-153.5 29.4-29.4 65.4-49.8 104.7-59.7 3.9-1 6.5-4.7 6-8.7z")),t.TableOutline=o("table",s,r(a,"M928 160H96c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V192c0-17.7-14.3-32-32-32zm-40 208H676V232h212v136zm0 224H676V432h212v160zM412 432h200v160H412V432zm200-64H412V232h200v136zm-476 64h212v160H136V432zm0-200h212v136H136V232zm0 424h212v136H136V656zm276 0h200v136H412V656zm476 136H676V656h212v136z")),t.TrademarkOutline=o("trademark",s,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372zm87.5-334.7c34.8-12.8 78.4-49 78.4-119.2 0-71.2-45.5-131.1-144.2-131.1H378c-4.4 0-8 3.6-8 8v410c0 4.4 3.6 8 8 8h54.5c4.4 0 8-3.6 8-8V561.2h88.7l74.6 159.2c1.3 2.8 4.1 4.6 7.2 4.6h62a7.9 7.9 0 0 0 7.1-11.5l-80.6-164.2zM522 505h-81.5V357h83.4c48 0 80.9 25.3 80.9 75.5 0 46.9-29.8 72.5-82.8 72.5z")),t.TransactionOutline=o("transaction",s,r(a,"M668.6 320c0-4.4-3.6-8-8-8h-54.5c-3 0-5.8 1.7-7.1 4.4l-84.7 168.8H511l-84.7-168.8a8 8 0 0 0-7.1-4.4h-55.7c-1.3 0-2.6.3-3.8 1-3.9 2.1-5.3 7-3.2 10.8l103.9 191.6h-57c-4.4 0-8 3.6-8 8v27.1c0 4.4 3.6 8 8 8h76v39h-76c-4.4 0-8 3.6-8 8v27.1c0 4.4 3.6 8 8 8h76V704c0 4.4 3.6 8 8 8h49.9c4.4 0 8-3.6 8-8v-63.5h76.3c4.4 0 8-3.6 8-8v-27.1c0-4.4-3.6-8-8-8h-76.3v-39h76.3c4.4 0 8-3.6 8-8v-27.1c0-4.4-3.6-8-8-8H564l103.7-191.6c.5-1.1.9-2.4.9-3.7zM157.9 504.2a352.7 352.7 0 0 1 103.5-242.4c32.5-32.5 70.3-58.1 112.4-75.9 43.6-18.4 89.9-27.8 137.6-27.8 47.8 0 94.1 9.3 137.6 27.8 42.1 17.8 79.9 43.4 112.4 75.9 10 10 19.3 20.5 27.9 31.4l-50 39.1a8 8 0 0 0 3 14.1l156.8 38.3c5 1.2 9.9-2.6 9.9-7.7l.8-161.5c0-6.7-7.7-10.5-12.9-6.3l-47.8 37.4C770.7 146.3 648.6 82 511.5 82 277 82 86.3 270.1 82 503.8a8 8 0 0 0 8 8.2h60c4.3 0 7.8-3.5 7.9-7.8zM934 512h-60c-4.3 0-7.9 3.5-8 7.8a352.7 352.7 0 0 1-103.5 242.4 352.57 352.57 0 0 1-112.4 75.9c-43.6 18.4-89.9 27.8-137.6 27.8s-94.1-9.3-137.6-27.8a352.57 352.57 0 0 1-112.4-75.9c-10-10-19.3-20.5-27.9-31.4l49.9-39.1a8 8 0 0 0-3-14.1l-156.8-38.3c-5-1.2-9.9 2.6-9.9 7.7l-.8 161.7c0 6.7 7.7 10.5 12.9 6.3l47.8-37.4C253.3 877.7 375.4 942 512.5 942 747 942 937.7 753.9 942 520.2a8 8 0 0 0-8-8.2z")),t.TwitterOutline=o("twitter",s,r(a,"M928 254.3c-30.6 13.2-63.9 22.7-98.2 26.4a170.1 170.1 0 0 0 75-94 336.64 336.64 0 0 1-108.2 41.2A170.1 170.1 0 0 0 672 174c-94.5 0-170.5 76.6-170.5 170.6 0 13.2 1.6 26.4 4.2 39.1-141.5-7.4-267.7-75-351.6-178.5a169.32 169.32 0 0 0-23.2 86.1c0 59.2 30.1 111.4 76 142.1a172 172 0 0 1-77.1-21.7v2.1c0 82.9 58.6 151.6 136.7 167.4a180.6 180.6 0 0 1-44.9 5.8c-11.1 0-21.6-1.1-32.2-2.6C211 652 273.9 701.1 348.8 702.7c-58.6 45.9-132 72.9-211.7 72.9-14.3 0-27.5-.5-41.2-2.1C171.5 822 261.2 850 357.8 850 671.4 850 843 590.2 843 364.7c0-7.4 0-14.8-.5-22.2 33.2-24.3 62.3-54.4 85.5-88.2z")),t.UnderlineOutline=o("underline",s,r(a,"M824 804H200c-4.4 0-8 3.4-8 7.6v60.8c0 4.2 3.6 7.6 8 7.6h624c4.4 0 8-3.4 8-7.6v-60.8c0-4.2-3.6-7.6-8-7.6zm-312-76c69.4 0 134.6-27.1 183.8-76.2C745 602.7 772 537.4 772 468V156c0-6.6-5.4-12-12-12h-60c-6.6 0-12 5.4-12 12v312c0 97-79 176-176 176s-176-79-176-176V156c0-6.6-5.4-12-12-12h-60c-6.6 0-12 5.4-12 12v312c0 69.4 27.1 134.6 76.2 183.8C377.3 701 442.6 728 512 728z")),t.UndoOutline=o("undo",s,r(a,"M511.4 124C290.5 124.3 112 303 112 523.9c0 128 60.2 242 153.8 315.2l-37.5 48c-4.1 5.3-.3 13 6.3 12.9l167-.8c5.2 0 9-4.9 7.7-9.9L369.8 727a8 8 0 0 0-14.1-3L315 776.1c-10.2-8-20-16.7-29.3-26a318.64 318.64 0 0 1-68.6-101.7C200.4 609 192 567.1 192 523.9s8.4-85.1 25.1-124.5c16.1-38.1 39.2-72.3 68.6-101.7 29.4-29.4 63.6-52.5 101.7-68.6C426.9 212.4 468.8 204 512 204s85.1 8.4 124.5 25.1c38.1 16.1 72.3 39.2 101.7 68.6 29.4 29.4 52.5 63.6 68.6 101.7 16.7 39.4 25.1 81.3 25.1 124.5s-8.4 85.1-25.1 124.5a318.64 318.64 0 0 1-68.6 101.7c-7.5 7.5-15.3 14.5-23.4 21.2a7.93 7.93 0 0 0-1.2 11.1l39.4 50.5c2.8 3.5 7.9 4.1 11.4 1.3C854.5 760.8 912 649.1 912 523.9c0-221.1-179.4-400.2-400.6-399.9z")),t.UnorderedListOutline=o("unordered-list",s,r(a,"M912 192H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 284H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 284H328c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h584c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM104 228a56 56 0 1 0 112 0 56 56 0 1 0-112 0zm0 284a56 56 0 1 0 112 0 56 56 0 1 0-112 0zm0 284a56 56 0 1 0 112 0 56 56 0 1 0-112 0z")),t.UpOutline=o("up",s,r(a,"M890.5 755.3L537.9 269.2c-12.8-17.6-39-17.6-51.7 0L133.5 755.3A8 8 0 0 0 140 768h75c5.1 0 9.9-2.5 12.9-6.6L512 369.8l284.1 391.6c3 4.1 7.8 6.6 12.9 6.6h75c6.5 0 10.3-7.4 6.5-12.7z")),t.UploadOutline=o("upload",s,r(a,"M400 317.7h73.9V656c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V317.7H624c6.7 0 10.4-7.7 6.3-12.9L518.3 163a8 8 0 0 0-12.6 0l-112 141.7c-4.1 5.3-.4 13 6.3 13zM878 626h-60c-4.4 0-8 3.6-8 8v154H214V634c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v198c0 17.7 14.3 32 32 32h684c17.7 0 32-14.3 32-32V634c0-4.4-3.6-8-8-8z")),t.UserAddOutline=o("user-add",s,r(a,"M678.3 642.4c24.2-13 51.9-20.4 81.4-20.4h.1c3 0 4.4-3.6 2.2-5.6a371.67 371.67 0 0 0-103.7-65.8c-.4-.2-.8-.3-1.2-.5C719.2 505 759.6 431.7 759.6 349c0-137-110.8-248-247.5-248S264.7 212 264.7 349c0 82.7 40.4 156 102.6 201.1-.4.2-.8.3-1.2.5-44.7 18.9-84.8 46-119.3 80.6a373.42 373.42 0 0 0-80.4 119.5A373.6 373.6 0 0 0 137 888.8a8 8 0 0 0 8 8.2h59.9c4.3 0 7.9-3.5 8-7.8 2-77.2 32.9-149.5 87.6-204.3C357 628.2 432.2 597 512.2 597c56.7 0 111.1 15.7 158 45.1a8.1 8.1 0 0 0 8.1.3zM512.2 521c-45.8 0-88.9-17.9-121.4-50.4A171.2 171.2 0 0 1 340.5 349c0-45.9 17.9-89.1 50.3-121.6S466.3 177 512.2 177s88.9 17.9 121.4 50.4A171.2 171.2 0 0 1 683.9 349c0 45.9-17.9 89.1-50.3 121.6C601.1 503.1 558 521 512.2 521zM880 759h-84v-84c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v84h-84c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h84v84c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-84h84c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z")),t.UserDeleteOutline=o("user-delete",s,r(a,"M678.3 655.4c24.2-13 51.9-20.4 81.4-20.4h.1c3 0 4.4-3.6 2.2-5.6a371.67 371.67 0 0 0-103.7-65.8c-.4-.2-.8-.3-1.2-.5C719.2 518 759.6 444.7 759.6 362c0-137-110.8-248-247.5-248S264.7 225 264.7 362c0 82.7 40.4 156 102.6 201.1-.4.2-.8.3-1.2.5-44.7 18.9-84.8 46-119.3 80.6a373.42 373.42 0 0 0-80.4 119.5A373.6 373.6 0 0 0 137 901.8a8 8 0 0 0 8 8.2h59.9c4.3 0 7.9-3.5 8-7.8 2-77.2 32.9-149.5 87.6-204.3C357 641.2 432.2 610 512.2 610c56.7 0 111.1 15.7 158 45.1a8.1 8.1 0 0 0 8.1.3zM512.2 534c-45.8 0-88.9-17.9-121.4-50.4A171.2 171.2 0 0 1 340.5 362c0-45.9 17.9-89.1 50.3-121.6S466.3 190 512.2 190s88.9 17.9 121.4 50.4A171.2 171.2 0 0 1 683.9 362c0 45.9-17.9 89.1-50.3 121.6C601.1 516.1 558 534 512.2 534zM880 772H640c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h240c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z")),t.UserOutline=o("user",s,r(a,"M858.5 763.6a374 374 0 0 0-80.6-119.5 375.63 375.63 0 0 0-119.5-80.6c-.4-.2-.8-.3-1.2-.5C719.5 518 760 444.7 760 362c0-137-111-248-248-248S264 225 264 362c0 82.7 40.5 156 102.8 201.1-.4.2-.8.3-1.2.5-44.8 18.9-85 46-119.5 80.6a375.63 375.63 0 0 0-80.6 119.5A371.7 371.7 0 0 0 136 901.8a8 8 0 0 0 8 8.2h60c4.4 0 7.9-3.5 8-7.8 2-77.2 33-149.5 87.8-204.3 56.7-56.7 132-87.9 212.2-87.9s155.5 31.2 212.2 87.9C779 752.7 810 825 812 902.2c.1 4.4 3.6 7.8 8 7.8h60a8 8 0 0 0 8-8.2c-1-47.8-10.9-94.3-29.5-138.2zM512 534c-45.9 0-89.1-17.9-121.6-50.4S340 407.9 340 362c0-45.9 17.9-89.1 50.4-121.6S466.1 190 512 190s89.1 17.9 121.6 50.4S684 316.1 684 362c0 45.9-17.9 89.1-50.4 121.6S557.9 534 512 534z")),t.UsergroupAddOutline=o("usergroup-add",s,r(a,"M892 772h-80v-80c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v80h-80c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h80v80c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-80h80c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zM373.5 498.4c-.9-8.7-1.4-17.5-1.4-26.4 0-15.9 1.5-31.4 4.3-46.5.7-3.6-1.2-7.3-4.5-8.8-13.6-6.1-26.1-14.5-36.9-25.1a127.54 127.54 0 0 1-38.7-95.4c.9-32.1 13.8-62.6 36.3-85.6 24.7-25.3 57.9-39.1 93.2-38.7 31.9.3 62.7 12.6 86 34.4 7.9 7.4 14.7 15.6 20.4 24.4 2 3.1 5.9 4.4 9.3 3.2 17.6-6.1 36.2-10.4 55.3-12.4 5.6-.6 8.8-6.6 6.3-11.6-32.5-64.3-98.9-108.7-175.7-109.9-110.8-1.7-203.2 89.2-203.2 200 0 62.8 28.9 118.8 74.2 155.5-31.8 14.7-61.1 35-86.5 60.4-54.8 54.7-85.8 126.9-87.8 204a8 8 0 0 0 8 8.2h56.1c4.3 0 7.9-3.4 8-7.7 1.9-58 25.4-112.3 66.7-153.5 29.4-29.4 65.4-49.8 104.7-59.7 3.8-1.1 6.4-4.8 5.9-8.8zM824 472c0-109.4-87.9-198.3-196.9-200C516.3 270.3 424 361.2 424 472c0 62.8 29 118.8 74.2 155.5a300.95 300.95 0 0 0-86.4 60.4C357 742.6 326 814.8 324 891.8a8 8 0 0 0 8 8.2h56c4.3 0 7.9-3.4 8-7.7 1.9-58 25.4-112.3 66.7-153.5C505.8 695.7 563 672 624 672c110.4 0 200-89.5 200-200zm-109.5 90.5C690.3 586.7 658.2 600 624 600s-66.3-13.3-90.5-37.5a127.26 127.26 0 0 1-37.5-91.8c.3-32.8 13.4-64.5 36.3-88 24-24.6 56.1-38.3 90.4-38.7 33.9-.3 66.8 12.9 91 36.6 24.8 24.3 38.4 56.8 38.4 91.4-.1 34.2-13.4 66.3-37.6 90.5z")),t.UsergroupDeleteOutline=o("usergroup-delete",s,r(a,"M888 784H664c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h224c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zM373.5 510.4c-.9-8.7-1.4-17.5-1.4-26.4 0-15.9 1.5-31.4 4.3-46.5.7-3.6-1.2-7.3-4.5-8.8-13.6-6.1-26.1-14.5-36.9-25.1a127.54 127.54 0 0 1-38.7-95.4c.9-32.1 13.8-62.6 36.3-85.6 24.7-25.3 57.9-39.1 93.2-38.7 31.9.3 62.7 12.6 86 34.4 7.9 7.4 14.7 15.6 20.4 24.4 2 3.1 5.9 4.4 9.3 3.2 17.6-6.1 36.2-10.4 55.3-12.4 5.6-.6 8.8-6.6 6.3-11.6-32.5-64.3-98.9-108.7-175.7-109.9-110.9-1.7-203.3 89.2-203.3 199.9 0 62.8 28.9 118.8 74.2 155.5-31.8 14.7-61.1 35-86.5 60.4-54.8 54.7-85.8 126.9-87.8 204a8 8 0 0 0 8 8.2h56.1c4.3 0 7.9-3.4 8-7.7 1.9-58 25.4-112.3 66.7-153.5 29.4-29.4 65.4-49.8 104.7-59.7 3.9-1 6.5-4.7 6-8.7zM824 484c0-109.4-87.9-198.3-196.9-200C516.3 282.3 424 373.2 424 484c0 62.8 29 118.8 74.2 155.5a300.95 300.95 0 0 0-86.4 60.4C357 754.6 326 826.8 324 903.8a8 8 0 0 0 8 8.2h56c4.3 0 7.9-3.4 8-7.7 1.9-58 25.4-112.3 66.7-153.5C505.8 707.7 563 684 624 684c110.4 0 200-89.5 200-200zm-109.5 90.5C690.3 598.7 658.2 612 624 612s-66.3-13.3-90.5-37.5a127.26 127.26 0 0 1-37.5-91.8c.3-32.8 13.4-64.5 36.3-88 24-24.6 56.1-38.3 90.4-38.7 33.9-.3 66.8 12.9 91 36.6 24.8 24.3 38.4 56.8 38.4 91.4-.1 34.2-13.4 66.3-37.6 90.5z")),t.VerticalAlignBottomOutline=o("vertical-align-bottom",s,r(a,"M859.9 780H164.1c-4.5 0-8.1 3.6-8.1 8v60c0 4.4 3.6 8 8.1 8h695.8c4.5 0 8.1-3.6 8.1-8v-60c0-4.4-3.6-8-8.1-8zM505.7 669a8 8 0 0 0 12.6 0l112-141.7c4.1-5.2.4-12.9-6.3-12.9h-74.1V176c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v338.3H400c-6.7 0-10.4 7.7-6.3 12.9l112 141.8z")),t.VerticalAlignMiddleOutline=o("vertical-align-middle",s,r(a,"M859.9 474H164.1c-4.5 0-8.1 3.6-8.1 8v60c0 4.4 3.6 8 8.1 8h695.8c4.5 0 8.1-3.6 8.1-8v-60c0-4.4-3.6-8-8.1-8zm-353.6-74.7c2.9 3.7 8.5 3.7 11.3 0l100.8-127.5c3.7-4.7.4-11.7-5.7-11.7H550V104c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v156h-62.8c-6 0-9.4 7-5.7 11.7l100.8 127.6zm11.4 225.4a7.14 7.14 0 0 0-11.3 0L405.6 752.3a7.23 7.23 0 0 0 5.7 11.7H474v156c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V764h62.8c6 0 9.4-7 5.7-11.7L517.7 624.7z")),t.VerticalAlignTopOutline=o("vertical-align-top",s,r(a,"M859.9 168H164.1c-4.5 0-8.1 3.6-8.1 8v60c0 4.4 3.6 8 8.1 8h695.8c4.5 0 8.1-3.6 8.1-8v-60c0-4.4-3.6-8-8.1-8zM518.3 355a8 8 0 0 0-12.6 0l-112 141.7a7.98 7.98 0 0 0 6.3 12.9h73.9V848c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V509.7H624c6.7 0 10.4-7.7 6.3-12.9L518.3 355z")),t.VerticalLeftOutline=o("vertical-left",s,r(a,"M762 164h-64c-4.4 0-8 3.6-8 8v688c0 4.4 3.6 8 8 8h64c4.4 0 8-3.6 8-8V172c0-4.4-3.6-8-8-8zm-508 0v72.4c0 9.5 4.2 18.4 11.4 24.5L564.6 512 265.4 763.1c-7.2 6.1-11.4 15-11.4 24.5V860c0 6.8 7.9 10.5 13.1 6.1L689 512 267.1 157.9A7.95 7.95 0 0 0 254 164z")),t.VerticalRightOutline=o("vertical-right",s,r(a,"M326 164h-64c-4.4 0-8 3.6-8 8v688c0 4.4 3.6 8 8 8h64c4.4 0 8-3.6 8-8V172c0-4.4-3.6-8-8-8zm444 72.4V164c0-6.8-7.9-10.5-13.1-6.1L335 512l421.9 354.1c5.2 4.4 13.1.7 13.1-6.1v-72.4c0-9.4-4.2-18.4-11.4-24.5L459.4 512l299.2-251.1c7.2-6.1 11.4-15.1 11.4-24.5z")),t.WifiOutline=o("wifi",s,r(a,"M723 620.5C666.8 571.6 593.4 542 513 542s-153.8 29.6-210.1 78.6a8.1 8.1 0 0 0-.8 11.2l36 42.9c2.9 3.4 8 3.8 11.4.9C393.1 637.2 450.3 614 513 614s119.9 23.2 163.5 61.5c3.4 2.9 8.5 2.5 11.4-.9l36-42.9c2.8-3.3 2.4-8.3-.9-11.2zm117.4-140.1C751.7 406.5 637.6 362 513 362s-238.7 44.5-327.5 118.4a8.05 8.05 0 0 0-1 11.3l36 42.9c2.8 3.4 7.9 3.8 11.2 1C308 472.2 406.1 434 513 434s205 38.2 281.2 101.6c3.4 2.8 8.4 2.4 11.2-1l36-42.9c2.8-3.4 2.4-8.5-1-11.3zm116.7-139C835.7 241.8 680.3 182 511 182c-168.2 0-322.6 59-443.7 157.4a8 8 0 0 0-1.1 11.4l36 42.9c2.8 3.3 7.8 3.8 11.1 1.1C222 306.7 360.3 254 511 254c151.8 0 291 53.5 400 142.7 3.4 2.8 8.4 2.3 11.2-1.1l36-42.9c2.9-3.4 2.4-8.5-1.1-11.3zM448 778a64 64 0 1 0 128 0 64 64 0 1 0-128 0z")),t.WomanOutline=o("woman",s,r(a,"M712.8 548.8c53.6-53.6 83.2-125 83.2-200.8 0-75.9-29.5-147.2-83.2-200.8C659.2 93.6 587.8 64 512 64s-147.2 29.5-200.8 83.2C257.6 200.9 228 272.1 228 348c0 63.8 20.9 124.4 59.4 173.9 7.3 9.4 15.2 18.3 23.7 26.9 8.5 8.5 17.5 16.4 26.8 23.7 39.6 30.8 86.3 50.4 136.1 57V736H360c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h114v140c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V812h114c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8H550V629.5c61.5-8.2 118.2-36.1 162.8-80.7zM512 556c-55.6 0-107.7-21.6-147.1-60.9C325.6 455.8 304 403.6 304 348s21.6-107.7 60.9-147.1C404.2 161.5 456.4 140 512 140s107.7 21.6 147.1 60.9C698.4 240.2 720 292.4 720 348s-21.6 107.7-60.9 147.1C619.7 534.4 567.6 556 512 556z")),t.ZhihuOutline=o("zhihu",s,r(a,"M564.7 230.1V803h60l25.2 71.4L756.3 803h131.5V230.1H564.7zm247.7 497h-59.9l-75.1 50.4-17.8-50.4h-18V308.3h170.7v418.8zM526.1 486.9H393.3c2.1-44.9 4.3-104.3 6.6-172.9h130.9l-.1-8.1c0-.6-.2-14.7-2.3-29.1-2.1-15-6.6-34.9-21-34.9H287.8c4.4-20.6 15.7-69.7 29.4-93.8l6.4-11.2-12.9-.7c-.8 0-19.6-.9-41.4 10.6-35.7 19-51.7 56.4-58.7 84.4-18.4 73.1-44.6 123.9-55.7 145.6-3.3 6.4-5.3 10.2-6.2 12.8-1.8 4.9-.8 9.8 2.8 13 10.5 9.5 38.2-2.9 38.5-3 .6-.3 1.3-.6 2.2-1 13.9-6.3 55.1-25 69.8-84.5h56.7c.7 32.2 3.1 138.4 2.9 172.9h-141l-2.1 1.5c-23.1 16.9-30.5 63.2-30.8 65.2l-1.4 9.2h167c-12.3 78.3-26.5 113.4-34 127.4-3.7 7-7.3 14-10.7 20.8-21.3 42.2-43.4 85.8-126.3 153.6-3.6 2.8-7 8-4.8 13.7 2.4 6.3 9.3 9.1 24.6 9.1 5.4 0 11.8-.3 19.4-1 49.9-4.4 100.8-18 135.1-87.6 17-35.1 31.7-71.7 43.9-108.9L497 850l5-12c.8-1.9 19-46.3 5.1-95.9l-.5-1.8-108.1-123-22 16.6c6.4-26.1 10.6-49.9 12.5-71.1h158.7v-8c0-40.1-18.5-63.9-19.2-64.9l-2.4-3z")),t.ToTopOutline=o("to-top",s,r(a,"M885 780H165c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h720c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zM400 325.7h73.9V664c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V325.7H624c6.7 0 10.4-7.7 6.3-12.9L518.3 171a8 8 0 0 0-12.6 0l-112 141.7c-4.1 5.3-.4 13 6.3 13z")),t.WeiboOutline=o("weibo",s,r(a,"M457.3 543c-68.1-17.7-145 16.2-174.6 76.2-30.1 61.2-1 129.1 67.8 151.3 71.2 23 155.2-12.2 184.4-78.3 28.7-64.6-7.2-131-77.6-149.2zm-52 156.2c-13.8 22.1-43.5 31.7-65.8 21.6-22-10-28.5-35.7-14.6-57.2 13.7-21.4 42.3-31 64.4-21.7 22.4 9.5 29.6 35 16 57.3zm45.5-58.5c-5 8.6-16.1 12.7-24.7 9.1-8.5-3.5-11.2-13.1-6.4-21.5 5-8.4 15.6-12.4 24.1-9.1 8.7 3.2 11.8 12.9 7 21.5zm334.5-197.2c15 4.8 31-3.4 35.9-18.3 11.8-36.6 4.4-78.4-23.2-109a111.39 111.39 0 0 0-106-34.3 28.45 28.45 0 0 0-21.9 33.8 28.39 28.39 0 0 0 33.8 21.8c18.4-3.9 38.3 1.8 51.9 16.7a54.2 54.2 0 0 1 11.3 53.3 28.45 28.45 0 0 0 18.2 36zm99.8-206c-56.7-62.9-140.4-86.9-217.7-70.5a32.98 32.98 0 0 0-25.4 39.3 33.12 33.12 0 0 0 39.3 25.5c55-11.7 114.4 5.4 154.8 50.1 40.3 44.7 51.2 105.7 34 159.1-5.6 17.4 3.9 36 21.3 41.7 17.4 5.6 36-3.9 41.6-21.2v-.1c24.1-75.4 8.9-161.1-47.9-223.9zM729 499c-12.2-3.6-20.5-6.1-14.1-22.1 13.8-34.7 15.2-64.7.3-86-28-40.1-104.8-37.9-192.8-1.1 0 0-27.6 12.1-20.6-9.8 13.5-43.5 11.5-79.9-9.6-101-47.7-47.8-174.6 1.8-283.5 110.6C127.3 471.1 80 557.5 80 632.2 80 775.1 263.2 862 442.5 862c235 0 391.3-136.5 391.3-245 0-65.5-55.2-102.6-104.8-118zM443 810.8c-143 14.1-266.5-50.5-275.8-144.5-9.3-93.9 99.2-181.5 242.2-195.6 143-14.2 266.5 50.5 275.8 144.4C694.4 709 586 796.6 443 810.8z")),t.ZoomOutOutline=o("zoom-out",s,r(a,"M637 443H325c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h312c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zm284 424L775 721c122.1-148.9 113.6-369.5-26-509-148-148.1-388.4-148.1-537 0-148.1 148.6-148.1 389 0 537 139.5 139.6 360.1 148.1 509 26l146 146c3.2 2.8 8.3 2.8 11 0l43-43c2.8-2.7 2.8-7.8 0-11zM696 696c-118.8 118.7-311.2 118.7-430 0-118.7-118.8-118.7-311.2 0-430 118.8-118.7 311.2-118.7 430 0 118.7 118.8 118.7 311.2 0 430z")),t.ZoomInOutline=o("zoom-in",s,r(a,"M637 443H519V309c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v134H325c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h118v134c0 4.4 3.6 8 8 8h60c4.4 0 8-3.6 8-8V519h118c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8zm284 424L775 721c122.1-148.9 113.6-369.5-26-509-148-148.1-388.4-148.1-537 0-148.1 148.6-148.1 389 0 537 139.5 139.6 360.1 148.1 509 26l146 146c3.2 2.8 8.3 2.8 11 0l43-43c2.8-2.7 2.8-7.8 0-11zM696 696c-118.8 118.7-311.2 118.7-430 0-118.7-118.8-118.7-311.2 0-430 118.8-118.7 311.2-118.7 430 0 118.7 118.8 118.7 311.2 0 430z")),t.AccountBookTwoTone=o("account-book",l,function(e,t){return r(a,[t,"M712 304c0 4.4-3.6 8-8 8h-56c-4.4 0-8-3.6-8-8v-48H384v48c0 4.4-3.6 8-8 8h-56c-4.4 0-8-3.6-8-8v-48H184v584h656V256H712v48zm-65.6 121.8l-89.3 164.1h49.1c4.4 0 8 3.6 8 8v21.3c0 4.4-3.6 8-8 8h-65.4v33.7h65.4c4.4 0 8 3.6 8 8v21.3c0 4.4-3.6 8-8 8h-65.4V752c0 4.4-3.6 8-8 8h-41.3c-4.4 0-8-3.6-8-8v-53.8h-65.1c-4.4 0-8-3.6-8-8v-21.3c0-4.4 3.6-8 8-8h65.1v-33.7h-65.1c-4.4 0-8-3.6-8-8v-21.3c0-4.4 3.6-8 8-8H467l-89.3-164c-2.1-3.9-.7-8.8 3.2-10.9 1.1-.7 2.5-1 3.8-1h46a8 8 0 0 1 7.1 4.4l73.4 145.4h2.8l73.4-145.4c1.3-2.7 4.1-4.4 7.1-4.4h45c4.5 0 8 3.6 7.9 8 0 1.3-.4 2.6-1 3.8z"],[e,"M639.5 414h-45c-3 0-5.8 1.7-7.1 4.4L514 563.8h-2.8l-73.4-145.4a8 8 0 0 0-7.1-4.4h-46c-1.3 0-2.7.3-3.8 1-3.9 2.1-5.3 7-3.2 10.9l89.3 164h-48.6c-4.4 0-8 3.6-8 8v21.3c0 4.4 3.6 8 8 8h65.1v33.7h-65.1c-4.4 0-8 3.6-8 8v21.3c0 4.4 3.6 8 8 8h65.1V752c0 4.4 3.6 8 8 8h41.3c4.4 0 8-3.6 8-8v-53.8h65.4c4.4 0 8-3.6 8-8v-21.3c0-4.4-3.6-8-8-8h-65.4v-33.7h65.4c4.4 0 8-3.6 8-8v-21.3c0-4.4-3.6-8-8-8h-49.1l89.3-164.1c.6-1.2 1-2.5 1-3.8.1-4.4-3.4-8-7.9-8z"],[e,"M880 184H712v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H384v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H144c-17.7 0-32 14.3-32 32v664c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V216c0-17.7-14.3-32-32-32zm-40 656H184V256h128v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h256v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h128v584z"])}),t.AlertTwoTone=o("alert",l,function(e,t){return r(a,[t,"M340 585c0-5.5 4.5-10 10-10h44c5.5 0 10 4.5 10 10v171h355V563c0-136.4-110.6-247-247-247S265 426.6 265 563v193h75V585z"],[e,"M216.9 310.5l39.6-39.6c3.1-3.1 3.1-8.2 0-11.3l-67.9-67.9a8.03 8.03 0 0 0-11.3 0l-39.6 39.6a8.03 8.03 0 0 0 0 11.3l67.9 67.9c3.1 3.1 8.1 3.1 11.3 0zm669.6-79.2l-39.6-39.6a8.03 8.03 0 0 0-11.3 0l-67.9 67.9a8.03 8.03 0 0 0 0 11.3l39.6 39.6c3.1 3.1 8.2 3.1 11.3 0l67.9-67.9c3.1-3.2 3.1-8.2 0-11.3zM484 180h56c4.4 0 8-3.6 8-8V76c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v96c0 4.4 3.6 8 8 8zm348 712H192c-17.7 0-32 14.3-32 32v24c0 4.4 3.6 8 8 8h688c4.4 0 8-3.6 8-8v-24c0-17.7-14.3-32-32-32zm-639-96c0 17.7 14.3 32 32 32h574c17.7 0 32-14.3 32-32V563c0-176.2-142.8-319-319-319S193 386.8 193 563v233zm72-233c0-136.4 110.6-247 247-247s247 110.6 247 247v193H404V585c0-5.5-4.5-10-10-10h-44c-5.5 0-10 4.5-10 10v171h-75V563z"])}),t.ApiTwoTone=o("api",l,function(e,t){return r(a,[t,"M148.2 674.6zm106.7-92.3c-25 25-38.7 58.1-38.7 93.4s13.8 68.5 38.7 93.4c25 25 58.1 38.7 93.4 38.7 35.3 0 68.5-13.8 93.4-38.7l59.4-59.4-186.8-186.8-59.4 59.4zm420.8-366.1c-35.3 0-68.5 13.8-93.4 38.7l-59.4 59.4 186.8 186.8 59.4-59.4c24.9-25 38.7-58.1 38.7-93.4s-13.8-68.5-38.7-93.4c-25-25-58.1-38.7-93.4-38.7z"],[e,"M578.9 546.7a8.03 8.03 0 0 0-11.3 0L501 613.3 410.7 523l66.7-66.7c3.1-3.1 3.1-8.2 0-11.3L441 408.6a8.03 8.03 0 0 0-11.3 0L363 475.3l-43-43a7.85 7.85 0 0 0-5.7-2.3c-2 0-4.1.8-5.7 2.3L206.8 534.2a199.45 199.45 0 0 0-58.6 140.4c-.2 39.5 11.2 79.1 34.3 113.1l-76.1 76.1a8.03 8.03 0 0 0 0 11.3l42.4 42.4c1.6 1.6 3.6 2.3 5.7 2.3s4.1-.8 5.7-2.3l76.1-76.1c33.7 22.9 72.9 34.3 112.1 34.3 51.2 0 102.4-19.5 141.5-58.6l101.9-101.9c3.1-3.1 3.1-8.2 0-11.3l-43-43 66.7-66.7c3.1-3.1 3.1-8.2 0-11.3l-36.6-36.2zM441.7 769.1a131.32 131.32 0 0 1-93.4 38.7c-35.3 0-68.4-13.7-93.4-38.7-24.9-24.9-38.7-58.1-38.7-93.4s13.7-68.4 38.7-93.4l59.4-59.4 186.8 186.8-59.4 59.4zm476-620.3l-42.4-42.4c-1.6-1.6-3.6-2.3-5.7-2.3s-4.1.8-5.7 2.3l-76.1 76.1a199.27 199.27 0 0 0-112.1-34.3c-51.2 0-102.4 19.5-141.5 58.6L432.3 308.7a8.03 8.03 0 0 0 0 11.3L704 591.7c1.6 1.6 3.6 2.3 5.7 2.3 2 0 4.1-.8 5.7-2.3l101.9-101.9c68.9-69 77-175.7 24.3-253.5l76.1-76.1c3.1-3.2 3.1-8.3 0-11.4zM769.1 441.7l-59.4 59.4-186.8-186.8 59.4-59.4c24.9-24.9 58.1-38.7 93.4-38.7s68.4 13.7 93.4 38.7c24.9 24.9 38.7 58.1 38.7 93.4s-13.8 68.4-38.7 93.4z"])}),t.AppstoreTwoTone=o("appstore",l,function(e,t){return r(a,[e,"M864 144H560c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V160c0-8.8-7.2-16-16-16zm-52 268H612V212h200v200zM464 544H160c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V560c0-8.8-7.2-16-16-16zm-52 268H212V612h200v200zm52-668H160c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V160c0-8.8-7.2-16-16-16zm-52 268H212V212h200v200zm452 132H560c-8.8 0-16 7.2-16 16v304c0 8.8 7.2 16 16 16h304c8.8 0 16-7.2 16-16V560c0-8.8-7.2-16-16-16zm-52 268H612V612h200v200z"],[t,"M212 212h200v200H212zm400 0h200v200H612zM212 612h200v200H212zm400 0h200v200H612z"])}),t.AudioTwoTone=o("audio",l,function(e,t){return r(a,[t,"M512 552c54.3 0 98-43.2 98-96V232c0-52.8-43.7-96-98-96s-98 43.2-98 96v224c0 52.8 43.7 96 98 96z"],[e,"M842 454c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8 0 140.3-113.7 254-254 254S258 594.3 258 454c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8 0 168.7 126.6 307.9 290 327.6V884H326.7c-13.7 0-24.7 14.3-24.7 32v36c0 4.4 2.8 8 6.2 8h407.6c3.4 0 6.2-3.6 6.2-8v-36c0-17.7-11-32-24.7-32H548V782.1c165.3-18 294-158 294-328.1z"],[e,"M512 624c93.9 0 170-75.2 170-168V232c0-92.8-76.1-168-170-168s-170 75.2-170 168v224c0 92.8 76.1 168 170 168zm-98-392c0-52.8 43.7-96 98-96s98 43.2 98 96v224c0 52.8-43.7 96-98 96s-98-43.2-98-96V232z"])}),t.BankTwoTone=o("bank",l,function(e,t){return r(a,[t,"M240.9 393.9h542.2L512 196.7z"],[e,"M894 462c30.9 0 43.8-39.7 18.7-58L530.8 126.2a31.81 31.81 0 0 0-37.6 0L111.3 404c-25.1 18.2-12.2 58 18.8 58H192v374h-72c-4.4 0-8 3.6-8 8v52c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-52c0-4.4-3.6-8-8-8h-72V462h62zM381 836H264V462h117v374zm189 0H453V462h117v374zm190 0H642V462h118v374zM240.9 393.9L512 196.7l271.1 197.2H240.9z"])}),t.BellTwoTone=o("bell",l,function(e,t){return r(a,[t,"M512 220c-55.6 0-107.8 21.6-147.1 60.9S304 372.4 304 428v340h416V428c0-55.6-21.6-107.8-60.9-147.1S567.6 220 512 220zm280 208c0-141.1-104.3-257.8-240-277.2v.1c135.7 19.4 240 136 240 277.1zM472 150.9v-.1C336.3 170.2 232 286.9 232 428c0-141.1 104.3-257.7 240-277.1z"],[e,"M816 768h-24V428c0-141.1-104.3-257.7-240-277.1V112c0-22.1-17.9-40-40-40s-40 17.9-40 40v38.9c-135.7 19.4-240 136-240 277.1v340h-24c-17.7 0-32 14.3-32 32v32c0 4.4 3.6 8 8 8h216c0 61.8 50.2 112 112 112s112-50.2 112-112h216c4.4 0 8-3.6 8-8v-32c0-17.7-14.3-32-32-32zM512 888c-26.5 0-48-21.5-48-48h96c0 26.5-21.5 48-48 48zm208-120H304V428c0-55.6 21.6-107.8 60.9-147.1S456.4 220 512 220c55.6 0 107.8 21.6 147.1 60.9S720 372.4 720 428v340z"])}),t.BookTwoTone=o("book",l,function(e,t){return r(a,[e,"M832 64H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V96c0-17.7-14.3-32-32-32zm-260 72h96v209.9L621.5 312 572 347.4V136zM232 888V136h280v296.9c0 3.3 1 6.6 3 9.3a15.9 15.9 0 0 0 22.3 3.7l83.8-59.9 81.4 59.4c2.7 2 6 3.1 9.4 3.1 8.8 0 16-7.2 16-16V136h64v752H232z"],[t,"M668 345.9V136h-96v211.4l49.5-35.4z"],[t,"M727.9 136v296.5c0 8.8-7.2 16-16 16-3.4 0-6.7-1.1-9.4-3.1L621.1 386l-83.8 59.9a15.9 15.9 0 0 1-22.3-3.7c-2-2.7-3-6-3-9.3V136H232v752h559.9V136h-64z"])}),t.BoxPlotTwoTone=o("box-plot",l,function(e,t){return r(a,[t,"M296 368h88v288h-88zm152 0h280v288H448z"],[e,"M952 224h-52c-4.4 0-8 3.6-8 8v248h-92V304c0-4.4-3.6-8-8-8H232c-4.4 0-8 3.6-8 8v176h-92V232c0-4.4-3.6-8-8-8H72c-4.4 0-8 3.6-8 8v560c0 4.4 3.6 8 8 8h52c4.4 0 8-3.6 8-8V548h92v172c0 4.4 3.6 8 8 8h560c4.4 0 8-3.6 8-8V548h92v244c0 4.4 3.6 8 8 8h52c4.4 0 8-3.6 8-8V232c0-4.4-3.6-8-8-8zM384 656h-88V368h88v288zm344 0H448V368h280v288z"])}),t.BuildTwoTone=o("build",l,function(e,t){return r(a,[t,"M144 546h200v200H144zm268-268h200v200H412z"],[e,"M916 210H376c-17.7 0-32 14.3-32 32v236H108c-17.7 0-32 14.3-32 32v272c0 17.7 14.3 32 32 32h540c17.7 0 32-14.3 32-32V546h236c17.7 0 32-14.3 32-32V242c0-17.7-14.3-32-32-32zM344 746H144V546h200v200zm268 0H412V546h200v200zm0-268H412V278h200v200zm268 0H680V278h200v200z"])}),t.BulbTwoTone=o("bulb",l,function(e,t){return r(a,[t,"M512 136c-141.4 0-256 114.6-256 256 0 92.5 49.4 176.3 128.1 221.8l35.9 20.8V752h184V634.6l35.9-20.8C718.6 568.3 768 484.5 768 392c0-141.4-114.6-256-256-256z"],[e,"M632 888H392c-4.4 0-8 3.6-8 8v32c0 17.7 14.3 32 32 32h192c17.7 0 32-14.3 32-32v-32c0-4.4-3.6-8-8-8zM512 64c-181.1 0-328 146.9-328 328 0 121.4 66 227.4 164 284.1V792c0 17.7 14.3 32 32 32h264c17.7 0 32-14.3 32-32V676.1c98-56.7 164-162.7 164-284.1 0-181.1-146.9-328-328-328zm127.9 549.8L604 634.6V752H420V634.6l-35.9-20.8C305.4 568.3 256 484.5 256 392c0-141.4 114.6-256 256-256s256 114.6 256 256c0 92.5-49.4 176.3-128.1 221.8z"])}),t.CalculatorTwoTone=o("calculator",l,function(e,t){return r(a,[e,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z"],[t,"M184 840h656V184H184v656zm256.2-75h-50.8c-2.2 0-4.5-1.1-5.9-2.9L348 718.6l-35.5 43.5a7.38 7.38 0 0 1-5.9 2.9h-50.8c-6.6 0-10.2-7.9-5.8-13.1l62.7-76.8-61.2-74.9c-4.3-5.2-.7-13.1 5.9-13.1h50.9c2.2 0 4.5 1.1 5.9 2.9l34 41.6 34-41.6c1.5-1.9 3.6-2.9 5.9-2.9h50.8c6.6 0 10.2 7.9 5.9 13.1L383.5 675l62.7 76.8c4.2 5.3.6 13.2-6 13.2zM576 335c0-2.2 1.4-4 3.2-4h193.5c1.9 0 3.3 1.8 3.3 4v48c0 2.2-1.4 4-3.2 4H579.2c-1.8 0-3.2-1.8-3.2-4v-48zm0 265c0-2.2 1.4-4 3.2-4h193.5c1.9 0 3.3 1.8 3.3 4v48c0 2.2-1.4 4-3.2 4H579.2c-1.8 0-3.2-1.8-3.2-4v-48zm0 104c0-2.2 1.4-4 3.2-4h193.5c1.9 0 3.3 1.8 3.3 4v48c0 2.2-1.4 4-3.2 4H579.2c-1.8 0-3.2-1.8-3.2-4v-48zM248 335c0-2.2 1.4-4 3.2-4H320v-68.8c0-1.8 1.8-3.2 4-3.2h48c2.2 0 4 1.4 4 3.2V331h68.7c1.9 0 3.3 1.8 3.3 4v48c0 2.2-1.4 4-3.2 4H376v68.7c0 1.9-1.8 3.3-4 3.3h-48c-2.2 0-4-1.4-4-3.2V387h-68.8c-1.8 0-3.2-1.8-3.2-4v-48z"],[e,"M383.5 675l61.3-74.8c4.3-5.2.7-13.1-5.9-13.1h-50.8c-2.3 0-4.4 1-5.9 2.9l-34 41.6-34-41.6a7.69 7.69 0 0 0-5.9-2.9h-50.9c-6.6 0-10.2 7.9-5.9 13.1l61.2 74.9-62.7 76.8c-4.4 5.2-.8 13.1 5.8 13.1h50.8c2.3 0 4.4-1 5.9-2.9l35.5-43.5 35.5 43.5c1.4 1.8 3.7 2.9 5.9 2.9h50.8c6.6 0 10.2-7.9 6-13.2L383.5 675zM251.2 387H320v68.8c0 1.8 1.8 3.2 4 3.2h48c2.2 0 4-1.4 4-3.3V387h68.8c1.8 0 3.2-1.8 3.2-4v-48c0-2.2-1.4-4-3.3-4H376v-68.8c0-1.8-1.8-3.2-4-3.2h-48c-2.2 0-4 1.4-4 3.2V331h-68.8c-1.8 0-3.2 1.8-3.2 4v48c0 2.2 1.4 4 3.2 4zm328 369h193.6c1.8 0 3.2-1.8 3.2-4v-48c0-2.2-1.4-4-3.3-4H579.2c-1.8 0-3.2 1.8-3.2 4v48c0 2.2 1.4 4 3.2 4zm0-104h193.6c1.8 0 3.2-1.8 3.2-4v-48c0-2.2-1.4-4-3.3-4H579.2c-1.8 0-3.2 1.8-3.2 4v48c0 2.2 1.4 4 3.2 4zm0-265h193.6c1.8 0 3.2-1.8 3.2-4v-48c0-2.2-1.4-4-3.3-4H579.2c-1.8 0-3.2 1.8-3.2 4v48c0 2.2 1.4 4 3.2 4z"])}),t.CameraTwoTone=o("camera",l,function(e,t){return r(a,[t,"M864 320H677.2l-17.1-47.8-22.9-64.2H386.7l-22.9 64.2-17.1 47.8H160c-4.4 0-8 3.6-8 8v456c0 4.4 3.6 8 8 8h704c4.4 0 8-3.6 8-8V328c0-4.4-3.6-8-8-8zM512 704c-88.4 0-160-71.6-160-160s71.6-160 160-160 160 71.6 160 160-71.6 160-160 160z"],[e,"M512 384c-88.4 0-160 71.6-160 160s71.6 160 160 160 160-71.6 160-160-71.6-160-160-160zm0 256c-53 0-96-43-96-96s43-96 96-96 96 43 96 96-43 96-96 96z"],[e,"M864 248H728l-32.4-90.8a32.07 32.07 0 0 0-30.2-21.2H358.6c-13.5 0-25.6 8.5-30.1 21.2L296 248H160c-44.2 0-80 35.8-80 80v456c0 44.2 35.8 80 80 80h704c44.2 0 80-35.8 80-80V328c0-44.2-35.8-80-80-80zm8 536c0 4.4-3.6 8-8 8H160c-4.4 0-8-3.6-8-8V328c0-4.4 3.6-8 8-8h186.7l17.1-47.8 22.9-64.2h250.5l22.9 64.2 17.1 47.8H864c4.4 0 8 3.6 8 8v456z"])}),t.CarTwoTone=o("car",l,function(e,t){return r(a,[t,"M199.6 474L184 517v237h656V517l-15.6-43H199.6zM264 621c-22.1 0-40-17.9-40-40s17.9-40 40-40 40 17.9 40 40-17.9 40-40 40zm388 75c0 4.4-3.6 8-8 8H380c-4.4 0-8-3.6-8-8v-84c0-4.4 3.6-8 8-8h40c4.4 0 8 3.6 8 8v36h168v-36c0-4.4 3.6-8 8-8h40c4.4 0 8 3.6 8 8v84zm108-75c-22.1 0-40-17.9-40-40s17.9-40 40-40 40 17.9 40 40-17.9 40-40 40z"],[e,"M720 581a40 40 0 1 0 80 0 40 40 0 1 0-80 0z"],[e,"M959 413.4L935.3 372a8 8 0 0 0-10.9-2.9l-50.7 29.6-78.3-216.2a63.9 63.9 0 0 0-60.9-44.4H301.2c-34.7 0-65.5 22.4-76.2 55.5l-74.6 205.2-50.8-29.6a8 8 0 0 0-10.9 2.9L65 413.4c-2.2 3.8-.9 8.6 2.9 10.8l60.4 35.2-14.5 40c-1.2 3.2-1.8 6.6-1.8 10v348.2c0 15.7 11.8 28.4 26.3 28.4h67.6c12.3 0 23-9.3 25.6-22.3l7.7-37.7h545.6l7.7 37.7c2.7 13 13.3 22.3 25.6 22.3h67.6c14.5 0 26.3-12.7 26.3-28.4V509.4c0-3.4-.6-6.8-1.8-10l-14.5-40 60.3-35.2a8 8 0 0 0 3-10.8zM292.7 218.1l.5-1.3.4-1.3c1.1-3.3 4.1-5.5 7.6-5.5h427.6l75.4 208H220l72.7-199.9zM840 754H184V517l15.6-43h624.8l15.6 43v237z"],[e,"M224 581a40 40 0 1 0 80 0 40 40 0 1 0-80 0zM644 604h-40c-4.4 0-8 3.6-8 8v36H428v-36c0-4.4-3.6-8-8-8h-40c-4.4 0-8 3.6-8 8v84c0 4.4 3.6 8 8 8h264c4.4 0 8-3.6 8-8v-84c0-4.4-3.6-8-8-8z"])}),t.CarryOutTwoTone=o("carry-out",l,function(e,t){return r(a,[e,"M880 184H712v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H384v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H144c-17.7 0-32 14.3-32 32v664c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V216c0-17.7-14.3-32-32-32zm-40 656H184V256h128v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h256v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h128v584z"],[t,"M712 304c0 4.4-3.6 8-8 8h-56c-4.4 0-8-3.6-8-8v-48H384v48c0 4.4-3.6 8-8 8h-56c-4.4 0-8-3.6-8-8v-48H184v584h656V256H712v48zm-17.5 128.8L481.9 725.5a16.1 16.1 0 0 1-26 0l-126.4-174c-3.8-5.3 0-12.7 6.5-12.7h55.2c5.2 0 10 2.5 13 6.6l64.7 89 150.9-207.8c3-4.1 7.9-6.6 13-6.6H688c6.5 0 10.3 7.4 6.5 12.8z"],[e,"M688 420h-55.2c-5.1 0-10 2.5-13 6.6L468.9 634.4l-64.7-89c-3-4.1-7.8-6.6-13-6.6H336c-6.5 0-10.3 7.4-6.5 12.7l126.4 174a16.1 16.1 0 0 0 26 0l212.6-292.7c3.8-5.4 0-12.8-6.5-12.8z"])}),t.CheckCircleTwoTone=o("check-circle",l,function(e,t){return r(a,[e,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"],[t,"M512 140c-205.4 0-372 166.6-372 372s166.6 372 372 372 372-166.6 372-372-166.6-372-372-372zm193.4 225.7l-210.6 292a31.8 31.8 0 0 1-51.7 0L318.5 484.9c-3.8-5.3 0-12.7 6.5-12.7h46.9c10.3 0 19.9 5 25.9 13.3l71.2 98.8 157.2-218c6-8.4 15.7-13.3 25.9-13.3H699c6.5 0 10.3 7.4 6.4 12.7z"],[e,"M699 353h-46.9c-10.2 0-19.9 4.9-25.9 13.3L469 584.3l-71.2-98.8c-6-8.3-15.6-13.3-25.9-13.3H325c-6.5 0-10.3 7.4-6.5 12.7l124.6 172.8a31.8 31.8 0 0 0 51.7 0l210.6-292c3.9-5.3.1-12.7-6.4-12.7z"])}),t.CheckSquareTwoTone=o("check-square",l,function(e,t){return r(a,[e,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z"],[t,"M184 840h656V184H184v656zm130-367.8h46.9c10.2 0 19.9 4.9 25.9 13.3l71.2 98.8 157.2-218c6-8.3 15.6-13.3 25.9-13.3H688c6.5 0 10.3 7.4 6.5 12.7l-210.6 292a31.8 31.8 0 0 1-51.7 0L307.5 484.9c-3.8-5.3 0-12.7 6.5-12.7z"],[e,"M432.2 657.7a31.8 31.8 0 0 0 51.7 0l210.6-292c3.8-5.3 0-12.7-6.5-12.7h-46.9c-10.3 0-19.9 5-25.9 13.3L458 584.3l-71.2-98.8c-6-8.4-15.7-13.3-25.9-13.3H314c-6.5 0-10.3 7.4-6.5 12.7l124.7 172.8z"])}),t.ClockCircleTwoTone=o("clock-circle",l,function(e,t){return r(a,[e,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"],[t,"M512 140c-205.4 0-372 166.6-372 372s166.6 372 372 372 372-166.6 372-372-166.6-372-372-372zm176.5 509.7l-28.6 39a7.99 7.99 0 0 1-11.2 1.7L483.3 569.8a7.92 7.92 0 0 1-3.3-6.5V288c0-4.4 3.6-8 8-8h48.1c4.4 0 8 3.6 8 8v247.5l142.6 103.1c3.6 2.5 4.4 7.5 1.8 11.1z"],[e,"M686.7 638.6L544.1 535.5V288c0-4.4-3.6-8-8-8H488c-4.4 0-8 3.6-8 8v275.3c0 2.6 1.2 5 3.3 6.5l165.4 120.6c3.6 2.6 8.6 1.9 11.2-1.7l28.6-39c2.6-3.6 1.8-8.6-1.8-11.1z"])}),t.CloseCircleTwoTone=o("close-circle",l,function(e,t){return r(a,[e,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"],[t,"M512 140c-205.4 0-372 166.6-372 372s166.6 372 372 372 372-166.6 372-372-166.6-372-372-372zm171.8 527.1c1.2 1.5 1.9 3.3 1.9 5.2 0 4.5-3.6 8-8 8l-66-.3-99.3-118.4-99.3 118.5-66.1.3c-4.4 0-8-3.6-8-8 0-1.9.7-3.7 1.9-5.2L471 512.3l-130.1-155a8.32 8.32 0 0 1-1.9-5.2c0-4.5 3.6-8 8-8l66.1.3 99.3 118.4 99.4-118.5 66-.3c4.4 0 8 3.6 8 8 0 1.9-.6 3.8-1.8 5.2l-130.1 155 129.9 154.9z"],[e,"M685.8 352c0-4.4-3.6-8-8-8l-66 .3-99.4 118.5-99.3-118.4-66.1-.3c-4.4 0-8 3.5-8 8 0 1.9.7 3.7 1.9 5.2l130.1 155-130.1 154.9a8.32 8.32 0 0 0-1.9 5.2c0 4.4 3.6 8 8 8l66.1-.3 99.3-118.5L611.7 680l66 .3c4.4 0 8-3.5 8-8 0-1.9-.7-3.7-1.9-5.2L553.9 512.2l130.1-155c1.2-1.4 1.8-3.3 1.8-5.2z"])}),t.CloseSquareTwoTone=o("close-square",l,function(e,t){return r(a,[e,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z"],[t,"M184 840h656V184H184v656zm163.9-473.9A7.95 7.95 0 0 1 354 353h58.9c4.7 0 9.2 2.1 12.3 5.7L512 462.2l86.8-103.5c3-3.6 7.5-5.7 12.3-5.7H670c6.8 0 10.5 7.9 6.1 13.1L553.8 512l122.3 145.9c4.4 5.2.7 13.1-6.1 13.1h-58.9c-4.7 0-9.2-2.1-12.3-5.7L512 561.8l-86.8 103.5c-3 3.6-7.5 5.7-12.3 5.7H354c-6.8 0-10.5-7.9-6.1-13.1L470.2 512 347.9 366.1z"],[e,"M354 671h58.9c4.8 0 9.3-2.1 12.3-5.7L512 561.8l86.8 103.5c3.1 3.6 7.6 5.7 12.3 5.7H670c6.8 0 10.5-7.9 6.1-13.1L553.8 512l122.3-145.9c4.4-5.2.7-13.1-6.1-13.1h-58.9c-4.8 0-9.3 2.1-12.3 5.7L512 462.2l-86.8-103.5c-3.1-3.6-7.6-5.7-12.3-5.7H354c-6.8 0-10.5 7.9-6.1 13.1L470.2 512 347.9 657.9A7.95 7.95 0 0 0 354 671z"])}),t.CloudTwoTone=o("cloud",l,function(e,t){return r(a,[t,"M791.9 492l-37.8-10-13.8-36.5c-8.6-22.7-20.6-44.1-35.7-63.4a245.73 245.73 0 0 0-52.4-49.9c-41.1-28.9-89.5-44.2-140-44.2s-98.9 15.3-140 44.2a245.6 245.6 0 0 0-52.4 49.9 240.47 240.47 0 0 0-35.7 63.4l-13.9 36.6-37.9 9.9a125.7 125.7 0 0 0-66.1 43.7A123.1 123.1 0 0 0 140 612c0 33.1 12.9 64.3 36.3 87.7 23.4 23.4 54.5 36.3 87.6 36.3h496.2c33.1 0 64.2-12.9 87.6-36.3A123.3 123.3 0 0 0 884 612c0-56.2-37.8-105.5-92.1-120z"],[e,"M811.4 418.7C765.6 297.9 648.9 212 512.2 212S258.8 297.8 213 418.6C127.3 441.1 64 519.1 64 612c0 110.5 89.5 200 199.9 200h496.2C870.5 812 960 722.5 960 612c0-92.7-63.1-170.7-148.6-193.3zm36.3 281a123.07 123.07 0 0 1-87.6 36.3H263.9c-33.1 0-64.2-12.9-87.6-36.3A123.3 123.3 0 0 1 140 612c0-28 9.1-54.3 26.2-76.3a125.7 125.7 0 0 1 66.1-43.7l37.9-9.9 13.9-36.6c8.6-22.8 20.6-44.1 35.7-63.4a245.6 245.6 0 0 1 52.4-49.9c41.1-28.9 89.5-44.2 140-44.2s98.9 15.3 140 44.2c19.9 14 37.5 30.8 52.4 49.9 15.1 19.3 27.1 40.7 35.7 63.4l13.8 36.5 37.8 10c54.3 14.5 92.1 63.8 92.1 120 0 33.1-12.9 64.3-36.3 87.7z"])}),t.CodeTwoTone=o("code",l,function(e,t){return r(a,[e,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z"],[t,"M184 840h656V184H184v656zm339.5-223h185c4.1 0 7.5 3.6 7.5 8v48c0 4.4-3.4 8-7.5 8h-185c-4.1 0-7.5-3.6-7.5-8v-48c0-4.4 3.4-8 7.5-8zM308 610.3c0-2.3 1.1-4.6 2.9-6.1L420.7 512l-109.8-92.2a7.63 7.63 0 0 1-2.9-6.1V351c0-6.8 7.9-10.5 13.1-6.1l192 160.9c3.9 3.2 3.9 9.1 0 12.3l-192 161c-5.2 4.4-13.1.7-13.1-6.1v-62.7z"],[e,"M321.1 679.1l192-161c3.9-3.2 3.9-9.1 0-12.3l-192-160.9A7.95 7.95 0 0 0 308 351v62.7c0 2.4 1 4.6 2.9 6.1L420.7 512l-109.8 92.2a8.1 8.1 0 0 0-2.9 6.1V673c0 6.8 7.9 10.5 13.1 6.1zM516 673c0 4.4 3.4 8 7.5 8h185c4.1 0 7.5-3.6 7.5-8v-48c0-4.4-3.4-8-7.5-8h-185c-4.1 0-7.5 3.6-7.5 8v48z"])}),t.CompassTwoTone=o("compass",l,function(e,t){return r(a,[t,"M512 140c-205.4 0-372 166.6-372 372s166.6 372 372 372 372-166.6 372-372-166.6-372-372-372zM327.6 701.7c-2 .9-4.4 0-5.3-2.1-.4-1-.4-2.2 0-3.2L421 470.9 553.1 603l-225.5 98.7zm375.1-375.1L604 552.1 471.9 420l225.5-98.7c2-.9 4.4 0 5.3 2.1.4 1 .4 2.1 0 3.2z"],[e,"M322.3 696.4c-.4 1-.4 2.2 0 3.2.9 2.1 3.3 3 5.3 2.1L553.1 603 421 470.9l-98.7 225.5zm375.1-375.1L471.9 420 604 552.1l98.7-225.5c.4-1.1.4-2.2 0-3.2-.9-2.1-3.3-3-5.3-2.1z"],[e,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"])}),t.ContainerTwoTone=o("container",l,function(e,t){return r(a,[t,"M635 771.7c-34.5 28.6-78.2 44.3-123 44.3s-88.5-15.8-123-44.3a194.02 194.02 0 0 1-59.1-84.7H232v201h560V687h-97.9c-11.6 32.8-32 62.3-59.1 84.7z"],[e,"M320 501h384c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H320c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8z"],[e,"M832 64H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V96c0-17.7-14.3-32-32-32zm-40 824H232V687h97.9c11.6 32.8 32 62.3 59.1 84.7 34.5 28.5 78.2 44.3 123 44.3s88.5-15.7 123-44.3c27.1-22.4 47.5-51.9 59.1-84.7H792v201zm0-264H643.6l-5.2 24.7C626.4 708.5 573.2 752 512 752s-114.4-43.5-126.5-103.3l-5.2-24.7H232V136h560v488z"],[e,"M320 341h384c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H320c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8z"])}),t.ContactsTwoTone=o("contacts",l,function(e,t){return r(a,[t,"M460.3 526a51.7 52 0 1 0 103.4 0 51.7 52 0 1 0-103.4 0z"],[t,"M768 352c0 4.4-3.6 8-8 8h-56c-4.4 0-8-3.6-8-8v-56H548v56c0 4.4-3.6 8-8 8h-56c-4.4 0-8-3.6-8-8v-56H328v56c0 4.4-3.6 8-8 8h-56c-4.4 0-8-3.6-8-8v-56H136v496h752V296H768v56zM661 736h-43.8c-4.2 0-7.6-3.3-7.9-7.5-3.8-50.5-46-90.5-97.2-90.5s-93.4 39.9-97.2 90.5c-.3 4.2-3.7 7.5-7.9 7.5h-43.9a8 8 0 0 1-8-8.4c2.8-53.3 31.9-99.6 74.6-126.1-18.1-20-29.1-46.4-29.1-75.5 0-61.9 49.9-112 111.4-112s111.4 50.1 111.4 112c0 29.1-11 55.6-29.1 75.5 42.7 26.4 71.9 72.8 74.7 126.1a8 8 0 0 1-8 8.4z"],[e,"M594.3 601.5a111.8 111.8 0 0 0 29.1-75.5c0-61.9-49.9-112-111.4-112s-111.4 50.1-111.4 112c0 29.1 11 55.5 29.1 75.5a158.09 158.09 0 0 0-74.6 126.1 8 8 0 0 0 8 8.4H407c4.2 0 7.6-3.3 7.9-7.5 3.8-50.6 46-90.5 97.2-90.5s93.4 40 97.2 90.5c.3 4.2 3.7 7.5 7.9 7.5H661a8 8 0 0 0 8-8.4c-2.8-53.3-32-99.7-74.7-126.1zM512 578c-28.5 0-51.7-23.3-51.7-52s23.2-52 51.7-52 51.7 23.3 51.7 52-23.2 52-51.7 52z"],[e,"M928 224H768v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56H548v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56H328v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56H96c-17.7 0-32 14.3-32 32v576c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V256c0-17.7-14.3-32-32-32zm-40 568H136V296h120v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56h148v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56h148v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56h120v496z"])}),t.ControlTwoTone=o("control",l,function(e,t){return r(a,[e,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z"],[t,"M616 440a36 36 0 1 0 72 0 36 36 0 1 0-72 0zM340.4 601.5l1.5 2.4c0 .1.1.1.1.2l.9 1.2c.1.1.2.2.2.3 1 1.3 2 2.5 3.2 3.6l.2.2c.4.4.8.8 1.2 1.1.8.8 1.7 1.5 2.6 2.1h.1l1.2.9c.1.1.3.2.4.3 1.2.8 2.5 1.6 3.9 2.2.2.1.5.2.7.4.4.2.7.3 1.1.5.3.1.7.3 1 .4.5.2 1 .4 1.5.5.4.1.9.3 1.3.4l.9.3 1.4.3c.2.1.5.1.7.2.7.1 1.4.3 2.1.4.2 0 .4 0 .6.1.6.1 1.1.1 1.7.2.2 0 .4 0 .7.1.8 0 1.5.1 2.3.1s1.5 0 2.3-.1c.2 0 .4 0 .7-.1.6 0 1.2-.1 1.7-.2.2 0 .4 0 .6-.1.7-.1 1.4-.2 2.1-.4.2-.1.5-.1.7-.2l1.4-.3.9-.3c.4-.1.9-.3 1.3-.4.5-.2 1-.4 1.5-.5.3-.1.7-.3 1-.4.4-.2.7-.3 1.1-.5.2-.1.5-.2.7-.4 1.3-.7 2.6-1.4 3.9-2.2.1-.1.3-.2.4-.3l1.2-.9h.1c.9-.7 1.8-1.4 2.6-2.1.4-.4.8-.7 1.2-1.1l.2-.2c1.1-1.1 2.2-2.4 3.2-3.6.1-.1.2-.2.2-.3l.9-1.2c0-.1.1-.1.1-.2l1.5-2.4c.1-.2.2-.3.3-.5 2.7-5.1 4.3-10.9 4.3-17s-1.6-12-4.3-17c-.1-.2-.2-.4-.3-.5l-1.5-2.4c0-.1-.1-.1-.1-.2l-.9-1.2c-.1-.1-.2-.2-.2-.3-1-1.3-2-2.5-3.2-3.6l-.2-.2c-.4-.4-.8-.8-1.2-1.1-.8-.8-1.7-1.5-2.6-2.1h-.1l-1.2-.9c-.1-.1-.3-.2-.4-.3-1.2-.8-2.5-1.6-3.9-2.2-.2-.1-.5-.2-.7-.4-.4-.2-.7-.3-1.1-.5-.3-.1-.7-.3-1-.4-.5-.2-1-.4-1.5-.5-.4-.1-.9-.3-1.3-.4l-.9-.3-1.4-.3c-.2-.1-.5-.1-.7-.2-.7-.1-1.4-.3-2.1-.4-.2 0-.4 0-.6-.1-.6-.1-1.1-.1-1.7-.2-.2 0-.4 0-.7-.1-.8 0-1.5-.1-2.3-.1s-1.5 0-2.3.1c-.2 0-.4 0-.7.1-.6 0-1.2.1-1.7.2-.2 0-.4 0-.6.1-.7.1-1.4.2-2.1.4-.2.1-.5.1-.7.2l-1.4.3-.9.3c-.4.1-.9.3-1.3.4-.5.2-1 .4-1.5.5-.3.1-.7.3-1 .4-.4.2-.7.3-1.1.5-.2.1-.5.2-.7.4-1.3.7-2.6 1.4-3.9 2.2-.1.1-.3.2-.4.3l-1.2.9h-.1c-.9.7-1.8 1.4-2.6 2.1-.4.4-.8.7-1.2 1.1l-.2.2a54.8 54.8 0 0 0-3.2 3.6c-.1.1-.2.2-.2.3l-.9 1.2c0 .1-.1.1-.1.2l-1.5 2.4c-.1.2-.2.3-.3.5-2.7 5.1-4.3 10.9-4.3 17s1.6 12 4.3 17c.1.2.2.3.3.5z"],[t,"M184 840h656V184H184v656zm436.4-499.1c-.2 0-.3.1-.4.1v-77c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v77c-.2 0-.3-.1-.4-.1 42 13.4 72.4 52.7 72.4 99.1 0 46.4-30.4 85.7-72.4 99.1.2 0 .3-.1.4-.1v221c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V539c.2 0 .3.1.4.1-42-13.4-72.4-52.7-72.4-99.1 0-46.4 30.4-85.7 72.4-99.1zM340 485V264c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v221c41.7 13.6 72 52.8 72 99s-30.3 85.5-72 99v77c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-77c-41.7-13.6-72-52.8-72-99s30.3-85.5 72-99z"],[e,"M340 683v77c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-77c41.7-13.5 72-52.8 72-99s-30.3-85.4-72-99V264c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v221c-41.7 13.5-72 52.8-72 99s30.3 85.4 72 99zm.1-116c.1-.2.2-.3.3-.5l1.5-2.4c0-.1.1-.1.1-.2l.9-1.2c0-.1.1-.2.2-.3 1-1.2 2.1-2.5 3.2-3.6l.2-.2c.4-.4.8-.7 1.2-1.1.8-.7 1.7-1.4 2.6-2.1h.1l1.2-.9c.1-.1.3-.2.4-.3 1.3-.8 2.6-1.5 3.9-2.2.2-.2.5-.3.7-.4.4-.2.7-.3 1.1-.5.3-.1.7-.3 1-.4.5-.1 1-.3 1.5-.5.4-.1.9-.3 1.3-.4l.9-.3 1.4-.3c.2-.1.5-.1.7-.2.7-.2 1.4-.3 2.1-.4.2-.1.4-.1.6-.1.5-.1 1.1-.2 1.7-.2.3-.1.5-.1.7-.1.8-.1 1.5-.1 2.3-.1s1.5.1 2.3.1c.3.1.5.1.7.1.6.1 1.1.1 1.7.2.2.1.4.1.6.1.7.1 1.4.3 2.1.4.2.1.5.1.7.2l1.4.3.9.3c.4.1.9.3 1.3.4.5.1 1 .3 1.5.5.3.1.7.3 1 .4.4.2.7.3 1.1.5.2.2.5.3.7.4 1.4.6 2.7 1.4 3.9 2.2.1.1.3.2.4.3l1.2.9h.1c.9.6 1.8 1.3 2.6 2.1.4.3.8.7 1.2 1.1l.2.2c1.2 1.1 2.2 2.3 3.2 3.6 0 .1.1.2.2.3l.9 1.2c0 .1.1.1.1.2l1.5 2.4A36.03 36.03 0 0 1 408 584c0 6.1-1.6 11.9-4.3 17-.1.2-.2.3-.3.5l-1.5 2.4c0 .1-.1.1-.1.2l-.9 1.2c0 .1-.1.2-.2.3-1 1.2-2.1 2.5-3.2 3.6l-.2.2c-.4.4-.8.7-1.2 1.1-.8.7-1.7 1.4-2.6 2.1h-.1l-1.2.9c-.1.1-.3.2-.4.3-1.3.8-2.6 1.5-3.9 2.2-.2.2-.5.3-.7.4-.4.2-.7.3-1.1.5-.3.1-.7.3-1 .4-.5.1-1 .3-1.5.5-.4.1-.9.3-1.3.4l-.9.3-1.4.3c-.2.1-.5.1-.7.2-.7.2-1.4.3-2.1.4-.2.1-.4.1-.6.1-.5.1-1.1.2-1.7.2-.3.1-.5.1-.7.1-.8.1-1.5.1-2.3.1s-1.5-.1-2.3-.1c-.3-.1-.5-.1-.7-.1-.6-.1-1.1-.1-1.7-.2-.2-.1-.4-.1-.6-.1-.7-.1-1.4-.3-2.1-.4-.2-.1-.5-.1-.7-.2l-1.4-.3-.9-.3c-.4-.1-.9-.3-1.3-.4-.5-.1-1-.3-1.5-.5-.3-.1-.7-.3-1-.4-.4-.2-.7-.3-1.1-.5-.2-.2-.5-.3-.7-.4-1.4-.6-2.7-1.4-3.9-2.2-.1-.1-.3-.2-.4-.3l-1.2-.9h-.1c-.9-.6-1.8-1.3-2.6-2.1-.4-.3-.8-.7-1.2-1.1l-.2-.2c-1.2-1.1-2.2-2.3-3.2-3.6 0-.1-.1-.2-.2-.3l-.9-1.2c0-.1-.1-.1-.1-.2l-1.5-2.4c-.1-.2-.2-.3-.3-.5-2.7-5-4.3-10.9-4.3-17s1.6-11.9 4.3-17zm280.3-27.9c-.1 0-.2-.1-.4-.1v221c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V539c-.1 0-.2.1-.4.1 42-13.4 72.4-52.7 72.4-99.1 0-46.4-30.4-85.7-72.4-99.1.1 0 .2.1.4.1v-77c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v77c.1 0 .2-.1.4-.1-42 13.4-72.4 52.7-72.4 99.1 0 46.4 30.4 85.7 72.4 99.1zM652 404c19.9 0 36 16.1 36 36s-16.1 36-36 36-36-16.1-36-36 16.1-36 36-36z"])}),t.CopyTwoTone=o("copy",l,function(e,t){return r(a,[t,"M232 706h142c22.1 0 40 17.9 40 40v142h250V264H232v442z"],[e,"M832 64H296c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h496v688c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V96c0-17.7-14.3-32-32-32z"],[e,"M704 192H192c-17.7 0-32 14.3-32 32v530.7c0 8.5 3.4 16.6 9.4 22.6l173.3 173.3c2.2 2.2 4.7 4 7.4 5.5v1.9h4.2c3.5 1.3 7.2 2 11 2H704c17.7 0 32-14.3 32-32V224c0-17.7-14.3-32-32-32zM350 856.2L263.9 770H350v86.2zM664 888H414V746c0-22.1-17.9-40-40-40H232V264h432v624z"])}),t.CreditCardTwoTone=o("credit-card",l,function(e,t){return r(a,[t,"M136 792h752V440H136v352zm507-144c0-4.4 3.6-8 8-8h165c4.4 0 8 3.6 8 8v72c0 4.4-3.6 8-8 8H651c-4.4 0-8-3.6-8-8v-72zM136 232h752v120H136z"],[e,"M651 728h165c4.4 0 8-3.6 8-8v-72c0-4.4-3.6-8-8-8H651c-4.4 0-8 3.6-8 8v72c0 4.4 3.6 8 8 8z"],[e,"M928 160H96c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V192c0-17.7-14.3-32-32-32zm-40 632H136V440h752v352zm0-440H136V232h752v120z"])}),t.CrownTwoTone=o("crown",l,function(e,t){return r(a,[t,"M911.9 283.9v.5L835.5 865c-1 8-7.9 14-15.9 14H204.5c-8.1 0-14.9-6.1-16-14l-76.4-580.6v-.6 1.6L188.5 866c1.1 7.9 7.9 14 16 14h615.1c8 0 14.9-6 15.9-14l76.4-580.6c.1-.5.1-1 0-1.5z"],[t,"M773.6 810.6l53.9-409.4-139.8 86.1L512 252.9 336.3 487.3l-139.8-86.1 53.8 409.4h523.3zm-374.2-189c0-62.1 50.5-112.6 112.6-112.6s112.6 50.5 112.6 112.6v1c0 62.1-50.5 112.6-112.6 112.6s-112.6-50.5-112.6-112.6v-1z"],[e,"M512 734.2c61.9 0 112.3-50.2 112.6-112.1v-.5c0-62.1-50.5-112.6-112.6-112.6s-112.6 50.5-112.6 112.6v.5c.3 61.9 50.7 112.1 112.6 112.1zm0-160.9c26.6 0 48.2 21.6 48.2 48.3 0 26.6-21.6 48.3-48.2 48.3s-48.2-21.6-48.2-48.3c0-26.6 21.6-48.3 48.2-48.3z"],[e,"M188.5 865c1.1 7.9 7.9 14 16 14h615.1c8 0 14.9-6 15.9-14l76.4-580.6v-.5c.3-6.4-6.7-10.8-12.3-7.4L705 396.4 518.4 147.5a8.06 8.06 0 0 0-12.9 0L319 396.4 124.3 276.5c-5.5-3.4-12.6.9-12.2 7.3v.6L188.5 865zm147.8-377.7L512 252.9l175.7 234.4 139.8-86.1-53.9 409.4H250.3l-53.8-409.4 139.8 86.1z"])}),t.CustomerServiceTwoTone=o("customer-service",l,function(e,t){return r(a,[t,"M696 632h128v192H696zm-496 0h128v192H200z"],[e,"M512 128c-212.1 0-384 171.9-384 384v360c0 13.3 10.7 24 24 24h184c35.3 0 64-28.7 64-64V624c0-35.3-28.7-64-64-64H200v-48c0-172.3 139.7-312 312-312s312 139.7 312 312v48H688c-35.3 0-64 28.7-64 64v208c0 35.3 28.7 64 64 64h184c13.3 0 24-10.7 24-24V512c0-212.1-171.9-384-384-384zM328 632v192H200V632h128zm496 192H696V632h128v192z"])});t.DashboardTwoTone=o("dashboard",l,function(e,t){return r(a,[t,"M512 188c-99.3 0-192.7 38.7-263 109-70.3 70.2-109 163.6-109 263 0 105.6 44.5 205.5 122.6 276h498.8A371.12 371.12 0 0 0 884 560c0-99.3-38.7-192.7-109-263-70.2-70.3-163.6-109-263-109zm-30 44c0-4.4 3.6-8 8-8h44c4.4 0 8 3.6 8 8v80c0 4.4-3.6 8-8 8h-44c-4.4 0-8-3.6-8-8v-80zM270 582c0 4.4-3.6 8-8 8h-80c-4.4 0-8-3.6-8-8v-44c0-4.4 3.6-8 8-8h80c4.4 0 8 3.6 8 8v44zm90.7-204.4l-31.1 31.1a8.03 8.03 0 0 1-11.3 0l-56.6-56.6a8.03 8.03 0 0 1 0-11.3l31.1-31.1c3.1-3.1 8.2-3.1 11.3 0l56.6 56.6c3.1 3.1 3.1 8.2 0 11.3zm291.1 83.5l-84.5 84.5c5 18.7.2 39.4-14.5 54.1a55.95 55.95 0 0 1-79.2 0 55.95 55.95 0 0 1 0-79.2 55.87 55.87 0 0 1 54.1-14.5l84.5-84.5c3.1-3.1 8.2-3.1 11.3 0l28.3 28.3c3.1 3.1 3.1 8.2 0 11.3zm43-52.4l-31.1-31.1a8.03 8.03 0 0 1 0-11.3l56.6-56.6c3.1-3.1 8.2-3.1 11.3 0l31.1 31.1c3.1 3.1 3.1 8.2 0 11.3l-56.6 56.6a8.03 8.03 0 0 1-11.3 0zM846 538v44c0 4.4-3.6 8-8 8h-80c-4.4 0-8-3.6-8-8v-44c0-4.4 3.6-8 8-8h80c4.4 0 8 3.6 8 8z"],[e,"M623.5 421.5a8.03 8.03 0 0 0-11.3 0L527.7 506c-18.7-5-39.4-.2-54.1 14.5a55.95 55.95 0 0 0 0 79.2 55.95 55.95 0 0 0 79.2 0 55.87 55.87 0 0 0 14.5-54.1l84.5-84.5c3.1-3.1 3.1-8.2 0-11.3l-28.3-28.3zM490 320h44c4.4 0 8-3.6 8-8v-80c0-4.4-3.6-8-8-8h-44c-4.4 0-8 3.6-8 8v80c0 4.4 3.6 8 8 8z"],[e,"M924.8 385.6a446.7 446.7 0 0 0-96-142.4 446.7 446.7 0 0 0-142.4-96C631.1 123.8 572.5 112 512 112s-119.1 11.8-174.4 35.2a446.7 446.7 0 0 0-142.4 96 446.7 446.7 0 0 0-96 142.4C75.8 440.9 64 499.5 64 560c0 132.7 58.3 257.7 159.9 343.1l1.7 1.4c5.8 4.8 13.1 7.5 20.6 7.5h531.7c7.5 0 14.8-2.7 20.6-7.5l1.7-1.4C901.7 817.7 960 692.7 960 560c0-60.5-11.9-119.1-35.2-174.4zM761.4 836H262.6A371.12 371.12 0 0 1 140 560c0-99.4 38.7-192.8 109-263 70.3-70.3 163.7-109 263-109 99.4 0 192.8 38.7 263 109 70.3 70.3 109 163.7 109 263 0 105.6-44.5 205.5-122.6 276z"],[e,"M762.7 340.8l-31.1-31.1a8.03 8.03 0 0 0-11.3 0l-56.6 56.6a8.03 8.03 0 0 0 0 11.3l31.1 31.1c3.1 3.1 8.2 3.1 11.3 0l56.6-56.6c3.1-3.1 3.1-8.2 0-11.3zM750 538v44c0 4.4 3.6 8 8 8h80c4.4 0 8-3.6 8-8v-44c0-4.4-3.6-8-8-8h-80c-4.4 0-8 3.6-8 8zM304.1 309.7a8.03 8.03 0 0 0-11.3 0l-31.1 31.1a8.03 8.03 0 0 0 0 11.3l56.6 56.6c3.1 3.1 8.2 3.1 11.3 0l31.1-31.1c3.1-3.1 3.1-8.2 0-11.3l-56.6-56.6zM262 530h-80c-4.4 0-8 3.6-8 8v44c0 4.4 3.6 8 8 8h80c4.4 0 8-3.6 8-8v-44c0-4.4-3.6-8-8-8z"])}),t.DatabaseTwoTone=o("database",l,function(e,t){return r(a,[t,"M232 616h560V408H232v208zm112-144c22.1 0 40 17.9 40 40s-17.9 40-40 40-40-17.9-40-40 17.9-40 40-40zM232 888h560V680H232v208zm112-144c22.1 0 40 17.9 40 40s-17.9 40-40 40-40-17.9-40-40 17.9-40 40-40zM232 344h560V136H232v208zm112-144c22.1 0 40 17.9 40 40s-17.9 40-40 40-40-17.9-40-40 17.9-40 40-40z"],[e,"M304 512a40 40 0 1 0 80 0 40 40 0 1 0-80 0zM304 784a40 40 0 1 0 80 0 40 40 0 1 0-80 0zM304 240a40 40 0 1 0 80 0 40 40 0 1 0-80 0z"],[e,"M832 64H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V96c0-17.7-14.3-32-32-32zm-40 824H232V680h560v208zm0-272H232V408h560v208zm0-272H232V136h560v208z"])}),t.DeleteTwoTone=o("delete",l,function(e,t){return r(a,[t,"M292.7 840h438.6l24.2-512h-487z"],[e,"M864 256H736v-80c0-35.3-28.7-64-64-64H352c-35.3 0-64 28.7-64 64v80H160c-17.7 0-32 14.3-32 32v32c0 4.4 3.6 8 8 8h60.4l24.7 523c1.6 34.1 29.8 61 63.9 61h454c34.2 0 62.3-26.8 63.9-61l24.7-523H888c4.4 0 8-3.6 8-8v-32c0-17.7-14.3-32-32-32zm-504-72h304v72H360v-72zm371.3 656H292.7l-24.2-512h487l-24.2 512z"])}),t.DiffTwoTone=o("diff",l,function(e,t){return r(a,[t,"M232 264v624h432V413.8L514.2 264H232zm336 489c0 3.8-3.4 7-7.5 7h-225c-4.1 0-7.5-3.2-7.5-7v-42c0-3.8 3.4-7 7.5-7h225c4.1 0 7.5 3.2 7.5 7v42zm0-262v42c0 3.8-3.4 7-7.5 7H476v84.9c0 3.9-3.1 7.1-7 7.1h-42c-3.8 0-7-3.2-7-7.1V540h-84.5c-4.1 0-7.5-3.2-7.5-7v-42c0-3.9 3.4-7 7.5-7H420v-84.9c0-3.9 3.2-7.1 7-7.1h42c3.9 0 7 3.2 7 7.1V484h84.5c4.1 0 7.5 3.1 7.5 7z"],[e,"M854.2 306.6L611.3 72.9c-6-5.7-13.9-8.9-22.2-8.9H296c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h277l219 210.6V824c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V329.6c0-8.7-3.5-17-9.8-23z"],[e,"M553.4 201.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v704c0 17.7 14.3 32 32 32h512c17.7 0 32-14.3 32-32V397.3c0-8.5-3.4-16.6-9.4-22.6L553.4 201.4zM664 888H232V264h282.2L664 413.8V888z"],[e,"M476 399.1c0-3.9-3.1-7.1-7-7.1h-42c-3.8 0-7 3.2-7 7.1V484h-84.5c-4.1 0-7.5 3.1-7.5 7v42c0 3.8 3.4 7 7.5 7H420v84.9c0 3.9 3.2 7.1 7 7.1h42c3.9 0 7-3.2 7-7.1V540h84.5c4.1 0 7.5-3.2 7.5-7v-42c0-3.9-3.4-7-7.5-7H476v-84.9zM560.5 704h-225c-4.1 0-7.5 3.2-7.5 7v42c0 3.8 3.4 7 7.5 7h225c4.1 0 7.5-3.2 7.5-7v-42c0-3.8-3.4-7-7.5-7z"])}),t.DislikeTwoTone=o("dislike",l,function(e,t){return r(a,[t,"M273 100.1v428h.3l-.3-428zM820.4 525l-21.9-19 14-25.5a56.2 56.2 0 0 0 6.9-27.3c0-16.5-7.1-32.2-19.6-43l-21.9-19 13.9-25.4a56.2 56.2 0 0 0 6.9-27.3c0-16.5-7.1-32.2-19.6-43l-21.9-19 13.9-25.4a56.2 56.2 0 0 0 6.9-27.3c0-22.4-13.2-42.6-33.6-51.8H345v345.2c18.6 67.2 46.4 168 83.5 302.5a44.28 44.28 0 0 0 42.2 32.3c7.5.1 15-2.2 21.1-6.7 9.9-7.4 15.2-18.6 14.6-30.5l-9.6-198.4h314.4C829 605.5 840 587.1 840 568c0-16.5-7.1-32.2-19.6-43z"],[e,"M112 132v364c0 17.7 14.3 32 32 32h65V100h-65c-17.7 0-32 14.3-32 32zm773.9 358.3c3.6-12 5.4-24.4 5.4-37 0-28.3-9.3-55.5-26.1-77.7 3.6-12 5.4-24.4 5.4-37 0-28.3-9.3-55.5-26.1-77.7 3.6-12 5.4-24.4 5.4-37 0-51.6-30.7-98.1-78.3-118.4a66.1 66.1 0 0 0-26.5-5.4H273l.3 428 85.8 310.8C372.9 889 418.9 924 470.9 924c29.7 0 57.4-11.8 77.9-33.4 20.5-21.5 31-49.7 29.5-79.4l-6-122.9h239.9c12.1 0 23.9-3.2 34.3-9.3 40.4-23.5 65.5-66.1 65.5-111 0-28.3-9.3-55.5-26.1-77.7zm-74.7 126.1H496.8l9.6 198.4c.6 11.9-4.7 23.1-14.6 30.5-6.1 4.5-13.6 6.8-21.1 6.7a44.28 44.28 0 0 1-42.2-32.3c-37.1-134.4-64.9-235.2-83.5-302.5V172h399.4a56.85 56.85 0 0 1 33.6 51.8c0 9.7-2.3 18.9-6.9 27.3l-13.9 25.4 21.9 19a56.76 56.76 0 0 1 19.6 43c0 9.7-2.3 18.9-6.9 27.3l-13.9 25.4 21.9 19a56.76 56.76 0 0 1 19.6 43c0 9.7-2.3 18.9-6.9 27.3l-14 25.5 21.9 19a56.76 56.76 0 0 1 19.6 43c0 19.1-11 37.5-28.8 48.4z"])}),t.DownCircleTwoTone=o("down-circle",l,function(e,t){return r(a,[t,"M512 140c-205.4 0-372 166.6-372 372s166.6 372 372 372 372-166.6 372-372-166.6-372-372-372zm184.4 277.7l-178 246a7.95 7.95 0 0 1-12.9 0l-178-246c-3.8-5.3 0-12.7 6.5-12.7h46.9c10.3 0 19.9 4.9 25.9 13.2L512 563.6l105.2-145.4c6-8.3 15.7-13.2 25.9-13.2H690c6.5 0 10.3 7.4 6.4 12.7z"],[e,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"],[e,"M690 405h-46.9c-10.2 0-19.9 4.9-25.9 13.2L512 563.6 406.8 418.2c-6-8.3-15.6-13.2-25.9-13.2H334c-6.5 0-10.3 7.4-6.5 12.7l178 246c3.2 4.4 9.7 4.4 12.9 0l178-246c3.9-5.3.1-12.7-6.4-12.7z"])}),t.DownSquareTwoTone=o("down-square",l,function(e,t){return r(a,[e,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z"],[t,"M184 840h656V184H184v656zm150-440h46.9c10.3 0 19.9 4.9 25.9 13.2L512 558.6l105.2-145.4c6-8.3 15.7-13.2 25.9-13.2H690c6.5 0 10.3 7.4 6.4 12.7l-178 246a7.95 7.95 0 0 1-12.9 0l-178-246c-3.8-5.3 0-12.7 6.5-12.7z"],[e,"M505.5 658.7c3.2 4.4 9.7 4.4 12.9 0l178-246c3.9-5.3.1-12.7-6.4-12.7h-46.9c-10.2 0-19.9 4.9-25.9 13.2L512 558.6 406.8 413.2c-6-8.3-15.6-13.2-25.9-13.2H334c-6.5 0-10.3 7.4-6.5 12.7l178 246z"])}),t.EditTwoTone=o("edit",l,function(e,t){return r(a,[t,"M761.1 288.3L687.8 215 325.1 577.6l-15.6 89 88.9-15.7z"],[e,"M880 836H144c-17.7 0-32 14.3-32 32v36c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-36c0-17.7-14.3-32-32-32zm-622.3-84c2 0 4-.2 6-.5L431.9 722c2-.4 3.9-1.3 5.3-2.8l423.9-423.9a9.96 9.96 0 0 0 0-14.1L694.9 114.9c-1.9-1.9-4.4-2.9-7.1-2.9s-5.2 1-7.1 2.9L256.8 538.8c-1.5 1.5-2.4 3.3-2.8 5.3l-29.5 168.2a33.5 33.5 0 0 0 9.4 29.8c6.6 6.4 14.9 9.9 23.8 9.9zm67.4-174.4L687.8 215l73.3 73.3-362.7 362.6-88.9 15.7 15.6-89z"])}),t.ExclamationCircleTwoTone=o("exclamation-circle",l,function(e,t){return r(a,[e,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"],[t,"M512 140c-205.4 0-372 166.6-372 372s166.6 372 372 372 372-166.6 372-372-166.6-372-372-372zm-32 156c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v272c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V296zm32 440a48.01 48.01 0 0 1 0-96 48.01 48.01 0 0 1 0 96z"],[e,"M488 576h48c4.4 0 8-3.6 8-8V296c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v272c0 4.4 3.6 8 8 8zM464 688a48 48 0 1 0 96 0 48 48 0 1 0-96 0z"])}),t.EnvironmentTwoTone=o("environment",l,function(e,t){return r(a,[t,"M724.4 224.9C667.7 169.5 592.3 139 512 139s-155.7 30.5-212.4 85.8C243.1 280 212 353.2 212 431.1c0 241.3 234.1 407.2 300 449.1 65.9-41.9 300-207.8 300-449.1 0-77.9-31.1-151.1-87.6-206.2zM512 615c-97.2 0-176-78.8-176-176s78.8-176 176-176 176 78.8 176 176-78.8 176-176 176z"],[e,"M512 263c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm79.2 255.2A111.6 111.6 0 0 1 512 551c-29.9 0-58-11.7-79.2-32.8A111.6 111.6 0 0 1 400 439c0-29.9 11.7-58 32.8-79.2C454 338.6 482.1 327 512 327c29.9 0 58 11.6 79.2 32.8S624 409.1 624 439c0 29.9-11.6 58-32.8 79.2z"],[e,"M854.6 289.1a362.49 362.49 0 0 0-79.9-115.7 370.83 370.83 0 0 0-118.2-77.8C610.7 76.6 562.1 67 512 67c-50.1 0-98.7 9.6-144.5 28.5-44.3 18.3-84 44.5-118.2 77.8A363.6 363.6 0 0 0 169.4 289c-19.5 45-29.4 92.8-29.4 142 0 70.6 16.9 140.9 50.1 208.7 26.7 54.5 64 107.6 111 158.1 80.3 86.2 164.5 138.9 188.4 153a43.9 43.9 0 0 0 22.4 6.1c7.8 0 15.5-2 22.4-6.1 23.9-14.1 108.1-66.8 188.4-153 47-50.4 84.3-103.6 111-158.1C867.1 572 884 501.8 884 431.1c0-49.2-9.9-97-29.4-142zM512 880.2c-65.9-41.9-300-207.8-300-449.1 0-77.9 31.1-151.1 87.6-206.3C356.3 169.5 431.7 139 512 139s155.7 30.5 212.4 85.9C780.9 280 812 353.2 812 431.1c0 241.3-234.1 407.2-300 449.1z"])}),t.ExperimentTwoTone=o("experiment",l,function(e,t){return r(a,[t,"M551.9 513c19.6 0 35.9-14.2 39.3-32.8A40.02 40.02 0 0 1 552 512a40 40 0 0 1-40-39.4v.5c0 22 17.9 39.9 39.9 39.9zM752 687.8l-.3-.3c-29-17.5-62.3-26.8-97-26.8-44.9 0-87.2 15.7-121 43.8a256.27 256.27 0 0 1-164.9 59.9c-41.2 0-81-9.8-116.7-28L210.5 844h603l-59.9-155.2-1.6-1z"],[e,"M879 824.9L696.3 352V178H768v-68H256v68h71.7v174L145 824.9c-2.8 7.4-4.3 15.2-4.3 23.1 0 35.3 28.7 64 64 64h614.6c7.9 0 15.7-1.5 23.1-4.3 33-12.7 49.4-49.8 36.6-82.8zM395.7 364.7V180h232.6v184.7L719.2 600c-20.7-5.3-42.1-8-63.9-8-61.2 0-119.2 21.5-165.3 60a188.78 188.78 0 0 1-121.3 43.9c-32.7 0-64.1-8.3-91.8-23.7l118.8-307.5zM210.5 844l41.6-107.6.1-.2c35.7 18.1 75.4 27.8 116.6 27.8 61.2 0 119.2-21.5 165.3-60 33.9-28.2 76.3-43.9 121.3-43.9 35 0 68.4 9.5 97.6 27.1l.6 1.6L813.5 844h-603z"],[e,"M552 512c19.3 0 35.4-13.6 39.2-31.8.6-2.7.8-5.4.8-8.2 0-22.1-17.9-40-40-40s-40 17.9-40 40v.6a40 40 0 0 0 40 39.4z"])}),t.EyeTwoTone=o("eye",l,function(e,t){return r(a,[t,"M81.8 537.8a60.3 60.3 0 0 1 0-51.5C176.6 286.5 319.8 186 512 186c-192.2 0-335.4 100.5-430.2 300.3a60.3 60.3 0 0 0 0 51.5C176.6 737.5 319.9 838 512 838c-192.1 0-335.4-100.5-430.2-300.2z"],[t,"M512 258c-161.3 0-279.4 81.8-362.7 254C232.6 684.2 350.7 766 512 766c161.4 0 279.5-81.8 362.7-254C791.4 339.8 673.3 258 512 258zm-4 430c-97.2 0-176-78.8-176-176s78.8-176 176-176 176 78.8 176 176-78.8 176-176 176z"],[e,"M942.2 486.2C847.4 286.5 704.1 186 512 186c-192.2 0-335.4 100.5-430.2 300.3a60.3 60.3 0 0 0 0 51.5C176.6 737.5 319.9 838 512 838c192.2 0 335.4-100.5 430.2-300.3 7.7-16.2 7.7-35 0-51.5zM512 766c-161.3 0-279.4-81.8-362.7-254C232.6 339.8 350.7 258 512 258s279.4 81.8 362.7 254C791.5 684.2 673.4 766 512 766z"],[e,"M508 336c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm0 288c-61.9 0-112-50.1-112-112s50.1-112 112-112 112 50.1 112 112-50.1 112-112 112z"])}),t.FileAddTwoTone=o("file-add",l,function(e,t){return r(a,[t,"M534 352V136H232v752h560V394H576a42 42 0 0 1-42-42zm126 236v48c0 4.4-3.6 8-8 8H544v108c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V644H372c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h108V472c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v108h108c4.4 0 8 3.6 8 8z"],[e,"M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM602 137.8L790.2 326H602V137.8zM792 888H232V136h302v216a42 42 0 0 0 42 42h216v494z"],[e,"M544 472c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v108H372c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h108v108c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V644h108c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H544V472z"])}),t.FileExcelTwoTone=o("file-excel",l,function(e,t){return r(a,[t,"M534 352V136H232v752h560V394H576a42 42 0 0 1-42-42zm51.6 120h35.7a12.04 12.04 0 0 1 10.1 18.5L546.1 623l84 130.4c3.6 5.6 2 13-3.6 16.6-2 1.2-4.2 1.9-6.5 1.9h-37.5c-4.1 0-8-2.1-10.2-5.7L510 664.8l-62.7 101.5c-2.2 3.5-6 5.7-10.2 5.7h-34.5a12.04 12.04 0 0 1-10.2-18.4l83.4-132.8-82.3-130.4c-3.6-5.7-1.9-13.1 3.7-16.6 1.9-1.3 4.1-1.9 6.4-1.9H442c4.2 0 8.1 2.2 10.3 5.8l61.8 102.4 61.2-102.3c2.2-3.6 6.1-5.8 10.3-5.8z"],[e,"M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM602 137.8L790.2 326H602V137.8zM792 888H232V136h302v216a42 42 0 0 0 42 42h216v494z"],[e,"M514.1 580.1l-61.8-102.4c-2.2-3.6-6.1-5.8-10.3-5.8h-38.4c-2.3 0-4.5.6-6.4 1.9-5.6 3.5-7.3 10.9-3.7 16.6l82.3 130.4-83.4 132.8a12.04 12.04 0 0 0 10.2 18.4h34.5c4.2 0 8-2.2 10.2-5.7L510 664.8l62.3 101.4c2.2 3.6 6.1 5.7 10.2 5.7H620c2.3 0 4.5-.7 6.5-1.9 5.6-3.6 7.2-11 3.6-16.6l-84-130.4 85.3-132.5a12.04 12.04 0 0 0-10.1-18.5h-35.7c-4.2 0-8.1 2.2-10.3 5.8l-61.2 102.3z"])}),t.FileExclamationTwoTone=o("file-exclamation",l,function(e,t){return r(a,[t,"M534 352V136H232v752h560V394H576a42 42 0 0 1-42-42zm-54 96c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v184c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V448zm32 336c-22.1 0-40-17.9-40-40s17.9-40 40-40 40 17.9 40 40-17.9 40-40 40z"],[e,"M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM602 137.8L790.2 326H602V137.8zM792 888H232V136h302v216a42 42 0 0 0 42 42h216v494z"],[e,"M488 640h48c4.4 0 8-3.6 8-8V448c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v184c0 4.4 3.6 8 8 8zM472 744a40 40 0 1 0 80 0 40 40 0 1 0-80 0z"])}),t.FileImageTwoTone=o("file-image",l,function(e,t){return r(a,[t,"M534 352V136H232v752h560V394H576a42 42 0 0 1-42-42zm-134 50c22.1 0 40 17.9 40 40s-17.9 40-40 40-40-17.9-40-40 17.9-40 40-40zm296 294H328.1c-6.7 0-10.4-7.7-6.3-12.9l99.8-127.2a8 8 0 0 1 12.6 0l41.1 52.4 77.8-99.2a8.1 8.1 0 0 1 12.7 0l136.5 174c4.1 5.2.4 12.9-6.3 12.9z"],[e,"M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM602 137.8L790.2 326H602V137.8zM792 888H232V136h302v216a42 42 0 0 0 42 42h216v494z"],[e,"M553.1 509.1l-77.8 99.2-41.1-52.4a8 8 0 0 0-12.6 0l-99.8 127.2a7.98 7.98 0 0 0 6.3 12.9H696c6.7 0 10.4-7.7 6.3-12.9l-136.5-174a8.1 8.1 0 0 0-12.7 0zM360 442a40 40 0 1 0 80 0 40 40 0 1 0-80 0z"])}),t.FileMarkdownTwoTone=o("file-markdown",l,function(e,t){return r(a,[t,"M534 352V136H232v752h560V394H576a42 42 0 0 1-42-42zm72.3 122H641c6.6 0 12 5.4 12 12v272c0 6.6-5.4 12-12 12h-27.2c-6.6 0-12-5.4-12-12V581.7L535 732.3c-2 4.3-6.3 7.1-11 7.1h-24.1a12 12 0 0 1-11-7.1l-66.8-150.2V758c0 6.6-5.4 12-12 12H383c-6.6 0-12-5.4-12-12V486c0-6.6 5.4-12 12-12h35c4.8 0 9.1 2.8 11 7.2l83.2 191 83.1-191c1.9-4.4 6.2-7.2 11-7.2z"],[e,"M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM602 137.8L790.2 326H602V137.8zM792 888H232V136h302v216a42 42 0 0 0 42 42h216v494z"],[e,"M429 481.2c-1.9-4.4-6.2-7.2-11-7.2h-35c-6.6 0-12 5.4-12 12v272c0 6.6 5.4 12 12 12h27.1c6.6 0 12-5.4 12-12V582.1l66.8 150.2a12 12 0 0 0 11 7.1H524c4.7 0 9-2.8 11-7.1l66.8-150.6V758c0 6.6 5.4 12 12 12H641c6.6 0 12-5.4 12-12V486c0-6.6-5.4-12-12-12h-34.7c-4.8 0-9.1 2.8-11 7.2l-83.1 191-83.2-191z"])}),t.FilePdfTwoTone=o("file-pdf",l,function(e,t){return r(a,[t,"M509.2 490.8c-.7-1.3-1.4-1.9-2.2-2-2.9 3.3-2.2 31.5 2.7 51.4 4-13.6 4.7-40.5-.5-49.4zm-1.6 120.5c-7.7 20-18.8 47.3-32.1 71.4 4-1.6 8.1-3.3 12.3-5 17.6-7.2 37.3-15.3 58.9-20.2-14.9-11.8-28.4-27.7-39.1-46.2z"],[t,"M534 352V136H232v752h560V394H576a42 42 0 0 1-42-42zm55 287.6c16.1-1.9 30.6-2.8 44.3-2.3 12.8.4 23.6 2 32 5.1.2.1.3.1.5.2.4.2.8.3 1.2.5.5.2 1.1.4 1.6.7.1.1.3.1.4.2 4.1 1.8 7.5 4 10.1 6.6 9.1 9.1 11.8 26.1 6.2 39.6-3.2 7.7-11.7 20.5-33.3 20.5-21.8 0-53.9-9.7-82.1-24.8-25.5 4.3-53.7 13.9-80.9 23.1-5.8 2-11.8 4-17.6 5.9-38 65.2-66.5 79.4-84.1 79.4-4.2 0-7.8-.9-10.8-2-6.9-2.6-12.8-8-16.5-15-.9-1.7-1.6-3.4-2.2-5.2-1.6-4.8-2.1-9.6-1.3-13.6l.6-2.7c.1-.2.1-.4.2-.6.2-.7.4-1.4.7-2.1 0-.1.1-.2.1-.3 4.1-11.9 13.6-23.4 27.7-34.6 12.3-9.8 27.1-18.7 45.9-28.4 15.9-28 37.6-75.1 51.2-107.4-10.8-41.8-16.7-74.6-10.1-98.6.9-3.3 2.5-6.4 4.6-9.1.2-.2.3-.4.5-.6.1-.1.1-.2.2-.2 6.3-7.5 16.9-11.9 28.1-11.5 16.6.7 29.7 11.5 33 30.1 1.7 8 2.2 16.5 1.9 25.7v.7c0 .5 0 1-.1 1.5-.7 13.3-3 26.6-7.3 44.7-.4 1.6-.8 3.2-1.2 5.2l-1 4.1-.1.3c.1.2.1.3.2.5l1.8 4.5c.1.3.3.7.4 1 .7 1.6 1.4 3.3 2.1 4.8v.1c8.7 18.8 19.7 33.4 33.9 45.1 4.3 3.5 8.9 6.7 13.9 9.8 1.8-.5 3.5-.7 5.3-.9z"],[t,"M391.5 761c5.7-4.4 16.2-14.5 30.1-34.7-10.3 9.4-23.4 22.4-30.1 34.7zm270.9-83l.2-.3h.2c.6-.4.5-.7.4-.9-.1-.1-4.5-9.3-45.1-7.4 35.3 13.9 43.5 9.1 44.3 8.6z"],[e,"M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM602 137.8L790.2 326H602V137.8zM792 888H232V136h302v216a42 42 0 0 0 42 42h216v494z"],[e,"M535.9 585.3c-.8-1.7-1.5-3.3-2.2-4.9-.1-.3-.3-.7-.4-1l-1.8-4.5c-.1-.2-.1-.3-.2-.5l.1-.3.2-1.1c4-16.3 8.6-35.3 9.4-54.4v-.7c.3-8.6-.2-17.2-2-25.6-3.8-21.3-19.5-29.6-32.9-30.2-11.3-.5-21.8 4-28.1 11.4-.1.1-.1.2-.2.2-.2.2-.4.4-.5.6-2.1 2.7-3.7 5.8-4.6 9.1-6.6 24-.7 56.8 10.1 98.6-13.6 32.4-35.3 79.4-51.2 107.4v.1c-27.7 14.3-64.1 35.8-73.6 62.9 0 .1-.1.2-.1.3-.2.7-.5 1.4-.7 2.1-.1.2-.1.4-.2.6-.2.9-.5 1.8-.6 2.7-.9 4-.4 8.8 1.3 13.6.6 1.8 1.3 3.5 2.2 5.2 3.7 7 9.6 12.4 16.5 15 3 1.1 6.6 2 10.8 2 17.6 0 46.1-14.2 84.1-79.4 5.8-1.9 11.8-3.9 17.6-5.9 27.2-9.2 55.4-18.8 80.9-23.1 28.2 15.1 60.3 24.8 82.1 24.8 21.6 0 30.1-12.8 33.3-20.5 5.6-13.5 2.9-30.5-6.2-39.6-2.6-2.6-6-4.8-10.1-6.6-.1-.1-.3-.1-.4-.2-.5-.2-1.1-.4-1.6-.7-.4-.2-.8-.3-1.2-.5-.2-.1-.3-.1-.5-.2-16.2-5.8-41.7-6.7-76.3-2.8l-5.3.6c-5-3-9.6-6.3-13.9-9.8-14.2-11.3-25.1-25.8-33.8-44.7zM391.5 761c6.7-12.3 19.8-25.3 30.1-34.7-13.9 20.2-24.4 30.3-30.1 34.7zM507 488.8c.8.1 1.5.7 2.2 2 5.2 8.9 4.5 35.8.5 49.4-4.9-19.9-5.6-48.1-2.7-51.4zm-19.2 188.9c-4.2 1.7-8.3 3.4-12.3 5 13.3-24.1 24.4-51.4 32.1-71.4 10.7 18.5 24.2 34.4 39.1 46.2-21.6 4.9-41.3 13-58.9 20.2zm175.4-.9c.1.2.2.5-.4.9h-.2l-.2.3c-.8.5-9 5.3-44.3-8.6 40.6-1.9 45 7.3 45.1 7.4z"])}),t.FilePptTwoTone=o("file-ppt",l,function(e,t){return r(a,[t,"M464.5 516.2v108.4h38.9c44.7 0 71.2-10.9 71.2-54.3 0-34.4-20.1-54.1-53.9-54.1h-56.2z"],[t,"M534 352V136H232v752h560V394H576a42 42 0 0 1-42-42zm90 218.4c0 55.2-36.8 94.1-96.2 94.1h-63.3V760c0 4.4-3.6 8-8 8H424c-4.4 0-8-3.6-8-8V484c0-4.4 3.6-8 8-8v.1h104c59.7 0 96 39.8 96 94.3z"],[e,"M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM602 137.8L790.2 326H602V137.8zM792 888H232V136h302v216a42 42 0 0 0 42 42h216v494z"],[e,"M424 476.1c-4.4-.1-8 3.5-8 7.9v276c0 4.4 3.6 8 8 8h32.5c4.4 0 8-3.6 8-8v-95.5h63.3c59.4 0 96.2-38.9 96.2-94.1 0-54.5-36.3-94.3-96-94.3H424zm150.6 94.2c0 43.4-26.5 54.3-71.2 54.3h-38.9V516.2h56.2c33.8 0 53.9 19.7 53.9 54.1z"])}),t.FileTextTwoTone=o("file-text",l,function(e,t){return r(a,[t,"M534 352V136H232v752h560V394H576a42 42 0 0 1-42-42zm-22 322c0 4.4-3.6 8-8 8H320c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h184c4.4 0 8 3.6 8 8v48zm200-184v48c0 4.4-3.6 8-8 8H320c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h384c4.4 0 8 3.6 8 8z"],[e,"M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM602 137.8L790.2 326H602V137.8zM792 888H232V136h302v216a42 42 0 0 0 42 42h216v494z"],[e,"M312 490v48c0 4.4 3.6 8 8 8h384c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H320c-4.4 0-8 3.6-8 8zm192 128H320c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8z"])}),t.FileUnknownTwoTone=o("file-unknown",l,function(e,t){return r(a,[t,"M534 352V136H232v752h560V394H576a42 42 0 0 1-42-42zm-22 424c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm110-228.4c.7 44.9-29.7 84.5-74.3 98.9-5.7 1.8-9.7 7.3-9.7 13.3V672c0 5.5-4.5 10-10 10h-32c-5.5 0-10-4.5-10-10v-32c.2-19.8 15.4-37.3 34.7-40.1C549 596.2 570 574.3 570 549c0-28.1-25.8-51.5-58-51.5s-58 23.4-58 51.6c0 5.2-4.4 9.4-9.8 9.4h-32.4c-5.4 0-9.8-4.1-9.8-9.5 0-57.4 50.1-103.7 111.5-103 59.3.8 107.7 46.1 108.5 101.6z"],[e,"M854.6 288.7L639.4 73.4c-6-6-14.2-9.4-22.7-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.6-9.4-22.6zM602 137.8L790.2 326H602V137.8zM792 888H232V136h302v216a42 42 0 0 0 42 42h216v494z"],[e,"M480 744a32 32 0 1 0 64 0 32 32 0 1 0-64 0zM402 549c0 5.4 4.4 9.5 9.8 9.5h32.4c5.4 0 9.8-4.2 9.8-9.4 0-28.2 25.8-51.6 58-51.6s58 23.4 58 51.5c0 25.3-21 47.2-49.3 50.9-19.3 2.8-34.5 20.3-34.7 40.1v32c0 5.5 4.5 10 10 10h32c5.5 0 10-4.5 10-10v-12.2c0-6 4-11.5 9.7-13.3 44.6-14.4 75-54 74.3-98.9-.8-55.5-49.2-100.8-108.5-101.6-61.4-.7-111.5 45.6-111.5 103z"])}),t.FileWordTwoTone=o("file-word",l,function(e,t){return r(a,[t,"M534 352V136H232v752h560V394H576a42 42 0 0 1-42-42zm101.3 129.3c1.3-5.4 6.1-9.3 11.7-9.3h35.6a12.04 12.04 0 0 1 11.6 15.1l-74.4 276c-1.4 5.3-6.2 8.9-11.6 8.9h-31.8c-5.4 0-10.2-3.7-11.6-8.9l-52.8-197-52.8 197c-1.4 5.3-6.2 8.9-11.6 8.9h-32c-5.4 0-10.2-3.7-11.6-8.9l-74.2-276a12.02 12.02 0 0 1 11.6-15.1h35.4c5.6 0 10.4 3.9 11.7 9.3L434.6 680l49.7-198.9c1.3-5.4 6.1-9.1 11.6-9.1h32.2c5.5 0 10.3 3.7 11.6 9.1l49.8 199.3 45.8-199.1z"],[e,"M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM602 137.8L790.2 326H602V137.8zM792 888H232V136h302v216a42 42 0 0 0 42 42h216v494z"],[e,"M528.1 472h-32.2c-5.5 0-10.3 3.7-11.6 9.1L434.6 680l-46.1-198.7c-1.3-5.4-6.1-9.3-11.7-9.3h-35.4a12.02 12.02 0 0 0-11.6 15.1l74.2 276c1.4 5.2 6.2 8.9 11.6 8.9h32c5.4 0 10.2-3.6 11.6-8.9l52.8-197 52.8 197c1.4 5.2 6.2 8.9 11.6 8.9h31.8c5.4 0 10.2-3.6 11.6-8.9l74.4-276a12.04 12.04 0 0 0-11.6-15.1H647c-5.6 0-10.4 3.9-11.7 9.3l-45.8 199.1-49.8-199.3c-1.3-5.4-6.1-9.1-11.6-9.1z"])}),t.FileZipTwoTone=o("file-zip",l,function(e,t){return r(a,[t,"M344 630h32v2h-32z"],[t,"M534 352V136H360v64h64v64h-64v64h64v64h-64v64h64v64h-64v62h64v160H296V520h64v-64h-64v-64h64v-64h-64v-64h64v-64h-64v-64h-64v752h560V394H576a42 42 0 0 1-42-42z"],[e,"M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM602 137.8L790.2 326H602V137.8zM792 888H232V136h64v64h64v-64h174v216a42 42 0 0 0 42 42h216v494z"],[e,"M296 392h64v64h-64zm0-128h64v64h-64zm0 318v160h128V582h-64v-62h-64v62zm48 50v-2h32v64h-32v-62zm16-432h64v64h-64zm0 256h64v64h-64zm0-128h64v64h-64z"])}),t.FileTwoTone=o("file",l,function(e,t){return r(a,[t,"M534 352V136H232v752h560V394H576a42 42 0 0 1-42-42z"],[e,"M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM602 137.8L790.2 326H602V137.8zM792 888H232V136h302v216a42 42 0 0 0 42 42h216v494z"])}),t.FilterTwoTone=o("filter",l,function(e,t){return r(a,[t,"M420.6 798h182.9V642H420.6zM411 561.4l9.5 16.6h183l9.5-16.6L811.3 226H212.7z"],[e,"M880.1 154H143.9c-24.5 0-39.8 26.7-27.5 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48zM603.5 798H420.6V642h182.9v156zm9.5-236.6l-9.5 16.6h-183l-9.5-16.6L212.7 226h598.6L613 561.4z"])}),t.FireTwoTone=o("fire",l,function(e,t){return r(a,[t,"M737 438.6c-9.6 15.5-21.1 30.7-34.4 45.6a73.1 73.1 0 0 1-51 24.4 73.36 73.36 0 0 1-53.4-18.8 74.01 74.01 0 0 1-24.4-59.8c3-47.4-12.4-103.1-45.8-165.7-16.9-31.4-37.1-58.2-61.2-80.4a240 240 0 0 1-12.1 46.5 354.26 354.26 0 0 1-58.2 101 349.6 349.6 0 0 1-58.6 56.8c-34 26.1-62 60-80.8 97.9a275.96 275.96 0 0 0-29.1 124c0 74.9 29.5 145.3 83 198.4 53.7 53.2 125 82.4 201 82.4s147.3-29.2 201-82.4c53.5-53 83-123.5 83-198.4 0-39.2-8.1-77.3-24-113.1-9.3-21-21-40.5-35-58.4z"],[e,"M834.1 469.2A347.49 347.49 0 0 0 751.2 354l-29.1-26.7a8.09 8.09 0 0 0-13 3.3l-13 37.3c-8.1 23.4-23 47.3-44.1 70.8-1.4 1.5-3 1.9-4.1 2-1.1.1-2.8-.1-4.3-1.5-1.4-1.2-2.1-3-2-4.8 3.7-60.2-14.3-128.1-53.7-202C555.3 171 510 123.1 453.4 89.7l-41.3-24.3c-5.4-3.2-12.3 1-12 7.3l2.2 48c1.5 32.8-2.3 61.8-11.3 85.9-11 29.5-26.8 56.9-47 81.5a295.64 295.64 0 0 1-47.5 46.1 352.6 352.6 0 0 0-100.3 121.5A347.75 347.75 0 0 0 160 610c0 47.2 9.3 92.9 27.7 136a349.4 349.4 0 0 0 75.5 110.9c32.4 32 70 57.2 111.9 74.7C418.5 949.8 464.5 959 512 959s93.5-9.2 136.9-27.3A348.6 348.6 0 0 0 760.8 857c32.4-32 57.8-69.4 75.5-110.9a344.2 344.2 0 0 0 27.7-136c0-48.8-10-96.2-29.9-140.9zM713 808.5c-53.7 53.2-125 82.4-201 82.4s-147.3-29.2-201-82.4c-53.5-53.1-83-123.5-83-198.4 0-43.5 9.8-85.2 29.1-124 18.8-37.9 46.8-71.8 80.8-97.9a349.6 349.6 0 0 0 58.6-56.8c25-30.5 44.6-64.5 58.2-101a240 240 0 0 0 12.1-46.5c24.1 22.2 44.3 49 61.2 80.4 33.4 62.6 48.8 118.3 45.8 165.7a74.01 74.01 0 0 0 24.4 59.8 73.36 73.36 0 0 0 53.4 18.8c19.7-1 37.8-9.7 51-24.4 13.3-14.9 24.8-30.1 34.4-45.6 14 17.9 25.7 37.4 35 58.4 15.9 35.8 24 73.9 24 113.1 0 74.9-29.5 145.4-83 198.4z"])}),t.FlagTwoTone=o("flag",l,function(e,t){return r(a,[t,"M184 232h368v336H184z"],[t,"M624 632c0 4.4-3.6 8-8 8H504v73h336V377H624v255z"],[e,"M880 305H624V192c0-17.7-14.3-32-32-32H184v-40c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v784c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V640h248v113c0 17.7 14.3 32 32 32h416c17.7 0 32-14.3 32-32V337c0-17.7-14.3-32-32-32zM184 568V232h368v336H184zm656 145H504v-73h112c4.4 0 8-3.6 8-8V377h216v336z"])}),t.FolderAddTwoTone=o("folder-add",l,function(e,t){return r(a,[t,"M372.5 256H184v512h656V370.4H492.1L372.5 256zM540 443.1V528h84.5c4.1 0 7.5 3.1 7.5 7v42c0 3.8-3.4 7-7.5 7H540v84.9c0 3.9-3.1 7.1-7 7.1h-42c-3.8 0-7-3.2-7-7.1V584h-84.5c-4.1 0-7.5-3.2-7.5-7v-42c0-3.9 3.4-7 7.5-7H484v-84.9c0-3.9 3.2-7.1 7-7.1h42c3.9 0 7 3.2 7 7.1z"],[e,"M880 298.4H521L403.7 186.2a8.15 8.15 0 0 0-5.5-2.2H144c-17.7 0-32 14.3-32 32v592c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V330.4c0-17.7-14.3-32-32-32zM840 768H184V256h188.5l119.6 114.4H840V768z"],[e,"M484 443.1V528h-84.5c-4.1 0-7.5 3.1-7.5 7v42c0 3.8 3.4 7 7.5 7H484v84.9c0 3.9 3.2 7.1 7 7.1h42c3.9 0 7-3.2 7-7.1V584h84.5c4.1 0 7.5-3.2 7.5-7v-42c0-3.9-3.4-7-7.5-7H540v-84.9c0-3.9-3.1-7.1-7-7.1h-42c-3.8 0-7 3.2-7 7.1z"])}),t.FolderOpenTwoTone=o("folder-open",l,function(e,t){return r(a,[t,"M159 768h612.3l103.4-256H262.3z"],[e,"M928 444H820V330.4c0-17.7-14.3-32-32-32H473L355.7 186.2a8.15 8.15 0 0 0-5.5-2.2H96c-17.7 0-32 14.3-32 32v592c0 17.7 14.3 32 32 32h698c13 0 24.8-7.9 29.7-20l134-332c1.5-3.8 2.3-7.9 2.3-12 0-17.7-14.3-32-32-32zM136 256h188.5l119.6 114.4H748V444H238c-13 0-24.8 7.9-29.7 20L136 643.2V256zm635.3 512H159l103.3-256h612.4L771.3 768z"])}),t.FrownTwoTone=o("frown",l,function(e,t){return r(a,[e,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"],[t,"M512 140c-205.4 0-372 166.6-372 372s166.6 372 372 372 372-166.6 372-372-166.6-372-372-372zM288 421a48.01 48.01 0 0 1 96 0 48.01 48.01 0 0 1-96 0zm376 272h-48.1c-4.2 0-7.8-3.2-8.1-7.4C604 636.1 562.5 597 512 597s-92.1 39.1-95.8 88.6c-.3 4.2-3.9 7.4-8.1 7.4H360a8 8 0 0 1-8-8.4c4.4-84.3 74.5-151.6 160-151.6s155.6 67.3 160 151.6a8 8 0 0 1-8 8.4zm24-224a48.01 48.01 0 0 1 0-96 48.01 48.01 0 0 1 0 96z"],[e,"M288 421a48 48 0 1 0 96 0 48 48 0 1 0-96 0zM512 533c-85.5 0-155.6 67.3-160 151.6a8 8 0 0 0 8 8.4h48.1c4.2 0 7.8-3.2 8.1-7.4 3.7-49.5 45.3-88.6 95.8-88.6s92 39.1 95.8 88.6c.3 4.2 3.9 7.4 8.1 7.4H664a8 8 0 0 0 8-8.4C667.6 600.3 597.5 533 512 533zM640 421a48 48 0 1 0 96 0 48 48 0 1 0-96 0z"])}),t.FolderTwoTone=o("folder",l,function(e,t){return r(a,[e,"M880 298.4H521L403.7 186.2a8.15 8.15 0 0 0-5.5-2.2H144c-17.7 0-32 14.3-32 32v592c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V330.4c0-17.7-14.3-32-32-32zM840 768H184V256h188.5l119.6 114.4H840V768z"],[t,"M372.5 256H184v512h656V370.4H492.1z"])}),t.FundTwoTone=o("fund",l,function(e,t){return r(a,[e,"M928 160H96c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V192c0-17.7-14.3-32-32-32zm-40 632H136V232h752v560z"],[t,"M136 792h752V232H136v560zm56.4-130.5l214.9-215c3.1-3.1 8.2-3.1 11.3 0L533 561l254.5-254.6c3.1-3.1 8.2-3.1 11.3 0l36.8 36.8c3.1 3.1 3.1 8.2 0 11.3l-297 297.2a8.03 8.03 0 0 1-11.3 0L412.9 537.2 240.4 709.7a8.03 8.03 0 0 1-11.3 0l-36.7-36.9a8.03 8.03 0 0 1 0-11.3z"],[e,"M229.1 709.7c3.1 3.1 8.2 3.1 11.3 0l172.5-172.5 114.4 114.5c3.1 3.1 8.2 3.1 11.3 0l297-297.2c3.1-3.1 3.1-8.2 0-11.3l-36.8-36.8a8.03 8.03 0 0 0-11.3 0L533 561 418.6 446.5a8.03 8.03 0 0 0-11.3 0l-214.9 215a8.03 8.03 0 0 0 0 11.3l36.7 36.9z"])}),t.FunnelPlotTwoTone=o("funnel-plot",l,function(e,t){return r(a,[t,"M420.6 798h182.9V650H420.6zM297.7 374h428.6l85-148H212.7zm113.2 197.4l8.4 14.6h185.3l8.4-14.6L689.6 438H334.4z"],[e,"M880.1 154H143.9c-24.5 0-39.8 26.7-27.5 48L349 607.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V607.4L907.7 202c12.2-21.3-3.1-48-27.6-48zM603.5 798H420.6V650h182.9v148zm9.5-226.6l-8.4 14.6H419.3l-8.4-14.6L334.4 438h355.2L613 571.4zM726.3 374H297.7l-85-148h598.6l-85 148z"])}),t.GiftTwoTone=o("gift",l,function(e,t){return r(a,[t,"M546 378h298v104H546zM228 550h250v308H228zm-48-172h298v104H180zm366 172h250v308H546z"],[e,"M880 310H732.4c13.6-21.4 21.6-46.8 21.6-74 0-76.1-61.9-138-138-138-41.4 0-78.7 18.4-104 47.4-25.3-29-62.6-47.4-104-47.4-76.1 0-138 61.9-138 138 0 27.2 7.9 52.6 21.6 74H144c-17.7 0-32 14.3-32 32v200c0 4.4 3.6 8 8 8h40v344c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V550h40c4.4 0 8-3.6 8-8V342c0-17.7-14.3-32-32-32zM478 858H228V550h250v308zm0-376H180V378h298v104zm0-176h-70c-38.6 0-70-31.4-70-70s31.4-70 70-70 70 31.4 70 70v70zm68-70c0-38.6 31.4-70 70-70s70 31.4 70 70-31.4 70-70 70h-70v-70zm250 622H546V550h250v308zm48-376H546V378h298v104z"])}),t.HddTwoTone=o("hdd",l,function(e,t){return r(a,[t,"M232 888h560V680H232v208zm448-140c22.1 0 40 17.9 40 40s-17.9 40-40 40-40-17.9-40-40 17.9-40 40-40zM232 616h560V408H232v208zm72-128c0-4.4 3.6-8 8-8h184c4.4 0 8 3.6 8 8v48c0 4.4-3.6 8-8 8H312c-4.4 0-8-3.6-8-8v-48zm-72-144h560V136H232v208zm72-128c0-4.4 3.6-8 8-8h184c4.4 0 8 3.6 8 8v48c0 4.4-3.6 8-8 8H312c-4.4 0-8-3.6-8-8v-48z"],[e,"M832 64H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V96c0-17.7-14.3-32-32-32zm-40 824H232V680h560v208zm0-272H232V408h560v208zm0-272H232V136h560v208z"],[e,"M312 544h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H312c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8zm0-272h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H312c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8zM640 788a40 40 0 1 0 80 0 40 40 0 1 0-80 0z"])}),t.HeartTwoTone=o("heart",l,function(e,t){return r(a,[e,"M923 283.6a260.04 260.04 0 0 0-56.9-82.8 264.4 264.4 0 0 0-84-55.5A265.34 265.34 0 0 0 679.7 125c-49.3 0-97.4 13.5-139.2 39-10 6.1-19.5 12.8-28.5 20.1-9-7.3-18.5-14-28.5-20.1-41.8-25.5-89.9-39-139.2-39-35.5 0-69.9 6.8-102.4 20.3-31.4 13-59.7 31.7-84 55.5a258.44 258.44 0 0 0-56.9 82.8c-13.9 32.3-21 66.6-21 101.9 0 33.3 6.8 68 20.3 103.3 11.3 29.5 27.5 60.1 48.2 91 32.8 48.9 77.9 99.9 133.9 151.6 92.8 85.7 184.7 144.9 188.6 147.3l23.7 15.2c10.5 6.7 24 6.7 34.5 0l23.7-15.2c3.9-2.5 95.7-61.6 188.6-147.3 56-51.7 101.1-102.7 133.9-151.6 20.7-30.9 37-61.5 48.2-91 13.5-35.3 20.3-70 20.3-103.3.1-35.3-7-69.6-20.9-101.9zM512 814.8S156 586.7 156 385.5C156 283.6 240.3 201 344.3 201c73.1 0 136.5 40.8 167.7 100.4C543.2 241.8 606.6 201 679.7 201c104 0 188.3 82.6 188.3 184.5 0 201.2-356 429.3-356 429.3z"],[t,"M679.7 201c-73.1 0-136.5 40.8-167.7 100.4C480.8 241.8 417.4 201 344.3 201c-104 0-188.3 82.6-188.3 184.5 0 201.2 356 429.3 356 429.3s356-228.1 356-429.3C868 283.6 783.7 201 679.7 201z"])}),t.HighlightTwoTone=o("highlight",l,function(e,t){return r(a,[t,"M229.6 796.3h160.2l54.3-54.1-80.1-78.9zm220.7-397.1l262.8 258.9 147.3-145-262.8-259zm-77.1 166.1l171.4 168.9 68.6-67.6-171.4-168.9z"],[e,"M957.6 507.5L603.2 158.3a7.9 7.9 0 0 0-11.2 0L353.3 393.5a8.03 8.03 0 0 0-.1 11.3l.1.1 40 39.4-117.2 115.3a8.03 8.03 0 0 0-.1 11.3l.1.1 39.5 38.9-189.1 187H72.1c-4.4 0-8.1 3.6-8.1 8v55.2c0 4.4 3.6 8 8 8h344.9c2.1 0 4.1-.8 5.6-2.3l76.1-75.6L539 830a7.9 7.9 0 0 0 11.2 0l117.1-115.6 40.1 39.5a7.9 7.9 0 0 0 11.2 0l238.7-235.2c3.4-3 3.4-8 .3-11.2zM389.8 796.3H229.6l134.4-133 80.1 78.9-54.3 54.1zm154.8-62.1L373.2 565.3l68.6-67.6 171.4 168.9-68.6 67.6zm168.5-76.1L450.3 399.2l147.3-145.1 262.8 259-147.3 145z"])}),t.HomeTwoTone=o("home",l,function(e,t){return r(a,[t,"M512.1 172.6l-370 369.7h96V868H392V640c0-22.1 17.9-40 40-40h160c22.1 0 40 17.9 40 40v228h153.9V542.3H882L535.2 195.7l-23.1-23.1zm434.5 422.9c-6 6-13.1 10.8-20.8 13.9 7.7-3.2 14.8-7.9 20.8-13.9zm-887-34.7c5 30.3 31.4 53.5 63.1 53.5h.9c-31.9 0-58.9-23-64-53.5zm-.9-10.5v-1.9 1.9zm.1-2.6c.1-3.1.5-6.1 1-9.1-.6 2.9-.9 6-1 9.1z"],[e,"M951 510c0-.1-.1-.1-.1-.2l-1.8-2.1c-.1-.1-.2-.3-.4-.4-.7-.8-1.5-1.6-2.2-2.4L560.1 118.8l-25.9-25.9a31.5 31.5 0 0 0-44.4 0L77.5 505a63.6 63.6 0 0 0-16 26.6l-.6 2.1-.3 1.1-.3 1.2c-.2.7-.3 1.4-.4 2.1 0 .1 0 .3-.1.4-.6 3-.9 6-1 9.1v3.3c0 .5 0 1 .1 1.5 0 .5 0 .9.1 1.4 0 .5.1 1 .1 1.5 0 .6.1 1.2.2 1.8 0 .3.1.6.1.9l.3 2.5v.1c5.1 30.5 32.2 53.5 64 53.5h42.5V940h691.7V614.3h43.4c8.6 0 16.9-1.7 24.5-4.9s14.7-7.9 20.8-13.9a63.6 63.6 0 0 0 18.7-45.3c0-14.7-5-28.8-14.3-40.2zM568 868H456V664h112v204zm217.9-325.7V868H632V640c0-22.1-17.9-40-40-40H432c-22.1 0-40 17.9-40 40v228H238.1V542.3h-96l370-369.7 23.1 23.1L882 542.3h-96.1z"])}),t.HourglassTwoTone=o("hourglass",l,function(e,t){return r(a,[t,"M512 548c-42.2 0-81.9 16.4-111.7 46.3A156.63 156.63 0 0 0 354 706v134h316V706c0-42.2-16.4-81.9-46.3-111.7A156.63 156.63 0 0 0 512 548zM354 318c0 42.2 16.4 81.9 46.3 111.7C430.1 459.6 469.8 476 512 476s81.9-16.4 111.7-46.3C653.6 399.9 670 360.2 670 318V184H354v134z"],[e,"M742 318V184h86c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H196c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h86v134c0 81.5 42.4 153.2 106.4 194-64 40.8-106.4 112.5-106.4 194v134h-86c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h632c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-86V706c0-81.5-42.4-153.2-106.4-194 64-40.8 106.4-112.5 106.4-194zm-72 388v134H354V706c0-42.2 16.4-81.9 46.3-111.7C430.1 564.4 469.8 548 512 548s81.9 16.4 111.7 46.3C653.6 624.1 670 663.8 670 706zm0-388c0 42.2-16.4 81.9-46.3 111.7C593.9 459.6 554.2 476 512 476s-81.9-16.4-111.7-46.3A156.63 156.63 0 0 1 354 318V184h316v134z"])}),t.IdcardTwoTone=o("idcard",l,function(e,t){return r(a,[e,"M928 160H96c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V192c0-17.7-14.3-32-32-32zm-40 632H136V232h752v560z"],[t,"M136 792h752V232H136v560zm472-372c0-4.4 1-8 2.3-8h123.4c1.3 0 2.3 3.6 2.3 8v48c0 4.4-1 8-2.3 8H610.3c-1.3 0-2.3-3.6-2.3-8v-48zm0 144c0-4.4 3.2-8 7.1-8h185.7c3.9 0 7.1 3.6 7.1 8v48c0 4.4-3.2 8-7.1 8H615.1c-3.9 0-7.1-3.6-7.1-8v-48zM216.2 664.6c2.8-53.3 31.9-99.6 74.6-126.1-18.1-20-29.1-46.4-29.1-75.5 0-61.9 49.9-112 111.4-112s111.4 50.1 111.4 112c0 29.1-11 55.6-29.1 75.5 42.6 26.4 71.8 72.8 74.6 126.1a8 8 0 0 1-8 8.4h-43.9c-4.2 0-7.6-3.3-7.9-7.5-3.8-50.5-46-90.5-97.2-90.5s-93.4 40-97.2 90.5c-.3 4.2-3.7 7.5-7.9 7.5H224c-4.6 0-8.2-3.8-7.8-8.4z"],[t,"M321.3 463a51.7 52 0 1 0 103.4 0 51.7 52 0 1 0-103.4 0z"],[e,"M610.3 476h123.4c1.3 0 2.3-3.6 2.3-8v-48c0-4.4-1-8-2.3-8H610.3c-1.3 0-2.3 3.6-2.3 8v48c0 4.4 1 8 2.3 8zm4.8 144h185.7c3.9 0 7.1-3.6 7.1-8v-48c0-4.4-3.2-8-7.1-8H615.1c-3.9 0-7.1 3.6-7.1 8v48c0 4.4 3.2 8 7.1 8zM224 673h43.9c4.2 0 7.6-3.3 7.9-7.5 3.8-50.5 46-90.5 97.2-90.5s93.4 40 97.2 90.5c.3 4.2 3.7 7.5 7.9 7.5H522a8 8 0 0 0 8-8.4c-2.8-53.3-32-99.7-74.6-126.1a111.8 111.8 0 0 0 29.1-75.5c0-61.9-49.9-112-111.4-112s-111.4 50.1-111.4 112c0 29.1 11 55.5 29.1 75.5a158.09 158.09 0 0 0-74.6 126.1c-.4 4.6 3.2 8.4 7.8 8.4zm149-262c28.5 0 51.7 23.3 51.7 52s-23.2 52-51.7 52-51.7-23.3-51.7-52 23.2-52 51.7-52z"])}),t.Html5TwoTone=o("html5",l,function(e,t){return r(a,[e,"M145 96l66 746.6L511.8 928l299.6-85.4L878.7 96H145zm610.9 700.6l-244.1 69.6-245.2-69.6-56.7-641.2h603.8l-57.8 641.2z"],[t,"M209.9 155.4l56.7 641.2 245.2 69.6 244.1-69.6 57.8-641.2H209.9zm530.4 117.9l-4.8 47.2-1.7 19.5H381.7l8.2 94.2H511v-.2h214.7l-3.2 24.3-21.2 242.2-1.7 16.3-187.7 51.7v.4h-1.7l-188.6-52-11.3-144.7h91l6.5 73.2 102.4 27.7h.8v-.2l102.4-27.7 11.4-118.5H511.9v.1H305.4l-22.7-253.5L281 249h461l-1.7 24.3z"],[e,"M281 249l1.7 24.3 22.7 253.5h206.5v-.1h112.9l-11.4 118.5L511 672.9v.2h-.8l-102.4-27.7-6.5-73.2h-91l11.3 144.7 188.6 52h1.7v-.4l187.7-51.7 1.7-16.3 21.2-242.2 3.2-24.3H511v.2H389.9l-8.2-94.2h352.1l1.7-19.5 4.8-47.2L742 249H511z"])}),t.InfoCircleTwoTone=o("info-circle",l,function(e,t){return r(a,[e,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"],[t,"M512 140c-205.4 0-372 166.6-372 372s166.6 372 372 372 372-166.6 372-372-166.6-372-372-372zm32 588c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V456c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v272zm-32-344a48.01 48.01 0 0 1 0-96 48.01 48.01 0 0 1 0 96z"],[e,"M464 336a48 48 0 1 0 96 0 48 48 0 1 0-96 0zM536 448h-48c-4.4 0-8 3.6-8 8v272c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V456c0-4.4-3.6-8-8-8z"])}),t.InsuranceTwoTone=o("insurance",l,function(e,t){return r(a,[e,"M866.9 169.9L527.1 54.1C523 52.7 517.5 52 512 52s-11 .7-15.1 2.1L157.1 169.9c-8.3 2.8-15.1 12.4-15.1 21.2v482.4c0 8.8 5.7 20.4 12.6 25.9L499.3 968c3.5 2.7 8 4.1 12.6 4.1s9.2-1.4 12.6-4.1l344.7-268.6c6.9-5.4 12.6-17 12.6-25.9V191.1c.2-8.8-6.6-18.3-14.9-21.2zM810 654.3L512 886.5 214 654.3V226.7l298-101.6 298 101.6v427.6z"],[t,"M521.9 358.8h97.9v41.6h-97.9z"],[t,"M214 226.7v427.6l298 232.2 298-232.2V226.7L512 125.1 214 226.7zM413.3 656h-.2c0 4.4-3.6 8-8 8h-37.3c-4.4 0-8-3.6-8-8V471.4c-7.7 9.2-15.4 17.9-23.1 26a6.04 6.04 0 0 1-10.2-2.4l-13.2-43.5c-.6-2-.2-4.1 1.2-5.6 37-43.4 64.7-95.1 82.2-153.6 1.1-3.5 5-5.3 8.4-3.7l38.6 18.3c2.7 1.3 4.1 4.4 3.2 7.2a429.2 429.2 0 0 1-33.6 79V656zm257.9-340v127.2c0 4.4-3.6 8-8 8h-66.7v18.6h98.8c4.4 0 8 3.6 8 8v35.6c0 4.4-3.6 8-8 8h-59c18.1 29.1 41.8 54.3 72.3 76.9 2.6 2.1 3.2 5.9 1.2 8.5l-26.3 35.3a5.92 5.92 0 0 1-8.9.7c-30.6-29.3-56.8-65.2-78.1-106.9V656c0 4.4-3.6 8-8 8h-36.2c-4.4 0-8-3.6-8-8V536c-22 44.7-49 80.8-80.6 107.6a6.38 6.38 0 0 1-4.8 1.4c-1.7-.3-3.2-1.3-4.1-2.8L432 605.7a6 6 0 0 1 1.6-8.1c28.6-20.3 51.9-45.2 71-76h-55.1c-4.4 0-8-3.6-8-8V478c0-4.4 3.6-8 8-8h94.9v-18.6h-65.9c-4.4 0-8-3.6-8-8V316c0-4.4 3.6-8 8-8h184.7c4.4 0 8 3.6 8 8z"],[e,"M443.7 306.9l-38.6-18.3c-3.4-1.6-7.3.2-8.4 3.7-17.5 58.5-45.2 110.2-82.2 153.6a5.7 5.7 0 0 0-1.2 5.6l13.2 43.5c1.4 4.5 7 5.8 10.2 2.4 7.7-8.1 15.4-16.8 23.1-26V656c0 4.4 3.6 8 8 8h37.3c4.4 0 8-3.6 8-8h.2V393.1a429.2 429.2 0 0 0 33.6-79c.9-2.8-.5-5.9-3.2-7.2zm26.8 9.1v127.4c0 4.4 3.6 8 8 8h65.9V470h-94.9c-4.4 0-8 3.6-8 8v35.6c0 4.4 3.6 8 8 8h55.1c-19.1 30.8-42.4 55.7-71 76a6 6 0 0 0-1.6 8.1l22.8 36.5c.9 1.5 2.4 2.5 4.1 2.8 1.7.3 3.5-.2 4.8-1.4 31.6-26.8 58.6-62.9 80.6-107.6v120c0 4.4 3.6 8 8 8h36.2c4.4 0 8-3.6 8-8V535.9c21.3 41.7 47.5 77.6 78.1 106.9 2.6 2.5 6.7 2.2 8.9-.7l26.3-35.3c2-2.6 1.4-6.4-1.2-8.5-30.5-22.6-54.2-47.8-72.3-76.9h59c4.4 0 8-3.6 8-8v-35.6c0-4.4-3.6-8-8-8h-98.8v-18.6h66.7c4.4 0 8-3.6 8-8V316c0-4.4-3.6-8-8-8H478.5c-4.4 0-8 3.6-8 8zm51.4 42.8h97.9v41.6h-97.9v-41.6z"])}),t.InterationTwoTone=o("interation",l,function(e,t){return r(a,[e,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z"],[t,"M184 840h656V184H184v656zm114-401.9c0-55.3 44.6-100.1 99.7-100.1h205.8v-53.4c0-5.6 6.5-8.8 10.9-5.3L723.5 365c3.5 2.7 3.5 8 0 10.7l-109.1 85.7c-4.4 3.5-10.9.4-10.9-5.3v-53.4H397.8c-19.6 0-35.5 15.9-35.5 35.6v78.9c0 3.8-3.1 6.8-6.8 6.8h-50.7c-3.8 0-6.8-3-6.8-7v-78.9zm2.6 210.3l109.1-85.7c4.4-3.5 10.9-.4 10.9 5.3v53.4h205.6c19.6 0 35.5-15.9 35.5-35.6v-78.9c0-3.8 3.1-6.8 6.8-6.8h50.7c3.8 0 6.8 3.1 6.8 6.8v78.9c0 55.3-44.6 100.1-99.7 100.1H420.6v53.4c0 5.6-6.5 8.8-10.9 5.3l-109.1-85.7c-3.5-2.7-3.5-8 0-10.5z"],[e,"M304.8 524h50.7c3.7 0 6.8-3 6.8-6.8v-78.9c0-19.7 15.9-35.6 35.5-35.6h205.7v53.4c0 5.7 6.5 8.8 10.9 5.3l109.1-85.7c3.5-2.7 3.5-8 0-10.7l-109.1-85.7c-4.4-3.5-10.9-.3-10.9 5.3V338H397.7c-55.1 0-99.7 44.8-99.7 100.1V517c0 4 3 7 6.8 7zm-4.2 134.9l109.1 85.7c4.4 3.5 10.9.3 10.9-5.3v-53.4h205.7c55.1 0 99.7-44.8 99.7-100.1v-78.9c0-3.7-3-6.8-6.8-6.8h-50.7c-3.7 0-6.8 3-6.8 6.8v78.9c0 19.7-15.9 35.6-35.5 35.6H420.6V568c0-5.7-6.5-8.8-10.9-5.3l-109.1 85.7c-3.5 2.5-3.5 7.8 0 10.5z"])}),t.LayoutTwoTone=o("layout",l,function(e,t){return r(a,[t,"M384 185h456v136H384zm-200 0h136v656H184zm696-73H144c-17.7 0-32 14.3-32 32v1c0-17.7 14.3-32 32-32h736c17.7 0 32 14.3 32 32v-1c0-17.7-14.3-32-32-32zM384 385h456v456H384z"],[e,"M880 113H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V145c0-17.7-14.3-32-32-32zM320 841H184V185h136v656zm520 0H384V385h456v456zm0-520H384V185h456v136z"])}),t.LeftCircleTwoTone=o("left-circle",l,function(e,t){return r(a,[t,"M512 140c-205.4 0-372 166.6-372 372s166.6 372 372 372 372-166.6 372-372-166.6-372-372-372zm104 240.9c0 10.3-4.9 19.9-13.2 25.9L457.4 512l145.4 105.1c8.3 6 13.2 15.7 13.2 25.9v46.9c0 6.5-7.4 10.3-12.7 6.5l-246-178a7.95 7.95 0 0 1 0-12.9l246-178c5.3-3.8 12.7 0 12.7 6.5v46.9z"],[e,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"],[e,"M603.3 327.5l-246 178a7.95 7.95 0 0 0 0 12.9l246 178c5.3 3.8 12.7 0 12.7-6.5V643c0-10.2-4.9-19.9-13.2-25.9L457.4 512l145.4-105.2c8.3-6 13.2-15.6 13.2-25.9V334c0-6.5-7.4-10.3-12.7-6.5z"])}),t.LeftSquareTwoTone=o("left-square",l,function(e,t){return r(a,[e,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z"],[t,"M184 840h656V184H184v656zm181.3-334.5l246-178c5.3-3.8 12.7 0 12.7 6.5v46.9c0 10.3-4.9 19.9-13.2 25.9L465.4 512l145.4 105.2c8.3 6 13.2 15.7 13.2 25.9V690c0 6.5-7.4 10.3-12.7 6.4l-246-178a7.95 7.95 0 0 1 0-12.9z"],[e,"M365.3 518.4l246 178c5.3 3.9 12.7.1 12.7-6.4v-46.9c0-10.2-4.9-19.9-13.2-25.9L465.4 512l145.4-105.2c8.3-6 13.2-15.6 13.2-25.9V334c0-6.5-7.4-10.3-12.7-6.5l-246 178a7.95 7.95 0 0 0 0 12.9z"])}),t.LikeTwoTone=o("like",l,function(e,t){return r(a,[t,"M273 495.9v428l.3-428zm538.2-88.3H496.8l9.6-198.4c.6-11.9-4.7-23.1-14.6-30.5-6.1-4.5-13.6-6.8-21.1-6.7-19.6.1-36.9 13.4-42.2 32.3-37.1 134.4-64.9 235.2-83.5 302.5V852h399.4a56.85 56.85 0 0 0 33.6-51.8c0-9.7-2.3-18.9-6.9-27.3l-13.9-25.4 21.9-19a56.76 56.76 0 0 0 19.6-43c0-9.7-2.3-18.9-6.9-27.3l-13.9-25.4 21.9-19a56.76 56.76 0 0 0 19.6-43c0-9.7-2.3-18.9-6.9-27.3l-14-25.5 21.9-19a56.76 56.76 0 0 0 19.6-43c0-19.1-11-37.5-28.8-48.4z"],[e,"M112 528v364c0 17.7 14.3 32 32 32h65V496h-65c-17.7 0-32 14.3-32 32zm773.9 5.7c16.8-22.2 26.1-49.4 26.1-77.7 0-44.9-25.1-87.5-65.5-111a67.67 67.67 0 0 0-34.3-9.3H572.3l6-122.9c1.5-29.7-9-57.9-29.5-79.4a106.4 106.4 0 0 0-77.9-33.4c-52 0-98 35-111.8 85.1l-85.8 310.8-.3 428h472.1c9.3 0 18.2-1.8 26.5-5.4 47.6-20.3 78.3-66.8 78.3-118.4 0-12.6-1.8-25-5.4-37 16.8-22.2 26.1-49.4 26.1-77.7 0-12.6-1.8-25-5.4-37 16.8-22.2 26.1-49.4 26.1-77.7 0-12.6-1.8-25-5.4-37zM820.4 499l-21.9 19 14 25.5a56.2 56.2 0 0 1 6.9 27.3c0 16.5-7.1 32.2-19.6 43l-21.9 19 13.9 25.4a56.2 56.2 0 0 1 6.9 27.3c0 16.5-7.1 32.2-19.6 43l-21.9 19 13.9 25.4a56.2 56.2 0 0 1 6.9 27.3c0 22.4-13.2 42.6-33.6 51.8H345V506.8c18.6-67.2 46.4-168 83.5-302.5a44.28 44.28 0 0 1 42.2-32.3c7.5-.1 15 2.2 21.1 6.7 9.9 7.4 15.2 18.6 14.6 30.5l-9.6 198.4h314.4C829 418.5 840 436.9 840 456c0 16.5-7.1 32.2-19.6 43z"])}),t.LockTwoTone=o("lock",l,function(e,t){return r(a,[e,"M832 464h-68V240c0-70.7-57.3-128-128-128H388c-70.7 0-128 57.3-128 128v224h-68c-17.7 0-32 14.3-32 32v384c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V496c0-17.7-14.3-32-32-32zM332 240c0-30.9 25.1-56 56-56h248c30.9 0 56 25.1 56 56v224H332V240zm460 600H232V536h560v304z"],[t,"M232 840h560V536H232v304zm280-226a48.01 48.01 0 0 1 28 87v53c0 4.4-3.6 8-8 8h-40c-4.4 0-8-3.6-8-8v-53a48.01 48.01 0 0 1 28-87z"],[e,"M484 701v53c0 4.4 3.6 8 8 8h40c4.4 0 8-3.6 8-8v-53a48.01 48.01 0 1 0-56 0z"])}),t.MedicineBoxTwoTone=o("medicine-box",l,function(e,t){return r(a,[t,"M244.3 328L184 513.4V840h656V513.4L779.7 328H244.3zM660 628c0 4.4-3.6 8-8 8H544v108c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V636H372c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h108V464c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v108h108c4.4 0 8 3.6 8 8v48z"],[e,"M652 572H544V464c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v108H372c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h108v108c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V636h108c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8z"],[e,"M839.2 278.1a32 32 0 0 0-30.4-22.1H736V144c0-17.7-14.3-32-32-32H320c-17.7 0-32 14.3-32 32v112h-72.8a31.9 31.9 0 0 0-30.4 22.1L112 502v378c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V502l-72.8-223.9zM360 184h304v72H360v-72zm480 656H184V513.4L244.3 328h535.4L840 513.4V840z"])}),t.MailTwoTone=o("mail",l,function(e,t){return r(a,[t,"M477.5 536.3L135.9 270.7l-27.5-21.4 27.6 21.5V792h752V270.8L546.2 536.3a55.99 55.99 0 0 1-68.7 0z"],[t,"M876.3 198.8l39.3 50.5-27.6 21.5 27.7-21.5-39.3-50.5z"],[e,"M928 160H96c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V192c0-17.7-14.3-32-32-32zm-94.5 72.1L512 482 190.5 232.1h643zm54.5 38.7V792H136V270.8l-27.6-21.5 27.5 21.4 341.6 265.6a55.99 55.99 0 0 0 68.7 0L888 270.8l27.6-21.5-39.3-50.5h.1l39.3 50.5-27.7 21.5z"])}),t.MehTwoTone=o("meh",l,function(e,t){return r(a,[e,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"],[t,"M512 140c-205.4 0-372 166.6-372 372s166.6 372 372 372 372-166.6 372-372-166.6-372-372-372zM288 421a48.01 48.01 0 0 1 96 0 48.01 48.01 0 0 1-96 0zm384 200c0 4.4-3.6 8-8 8H360c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h304c4.4 0 8 3.6 8 8v48zm16-152a48.01 48.01 0 0 1 0-96 48.01 48.01 0 0 1 0 96z"],[e,"M288 421a48 48 0 1 0 96 0 48 48 0 1 0-96 0zM664 565H360c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h304c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zM640 421a48 48 0 1 0 96 0 48 48 0 1 0-96 0z"])}),t.MessageTwoTone=o("message",l,function(e,t){return r(a,[t,"M775.3 248.9a369.62 369.62 0 0 0-119-80A370.2 370.2 0 0 0 512.1 140h-1.7c-99.7.4-193 39.4-262.8 109.9-69.9 70.5-108 164.1-107.6 263.8.3 60.3 15.3 120.2 43.5 173.1l4.5 8.4V836h140.8l8.4 4.5c52.9 28.2 112.8 43.2 173.1 43.5h1.7c99 0 192-38.2 262.1-107.6 70.4-69.8 109.5-163.1 110.1-262.7.2-50.6-9.5-99.6-28.9-145.8a370.15 370.15 0 0 0-80-119zM312 560a48.01 48.01 0 0 1 0-96 48.01 48.01 0 0 1 0 96zm200 0a48.01 48.01 0 0 1 0-96 48.01 48.01 0 0 1 0 96zm200 0a48.01 48.01 0 0 1 0-96 48.01 48.01 0 0 1 0 96z"],[e,"M664 512a48 48 0 1 0 96 0 48 48 0 1 0-96 0zM264 512a48 48 0 1 0 96 0 48 48 0 1 0-96 0z"],[e,"M925.2 338.4c-22.6-53.7-55-101.9-96.3-143.3a444.35 444.35 0 0 0-143.3-96.3C630.6 75.7 572.2 64 512 64h-2c-60.6.3-119.3 12.3-174.5 35.9a445.35 445.35 0 0 0-142 96.5c-40.9 41.3-73 89.3-95.2 142.8-23 55.4-34.6 114.3-34.3 174.9A449.4 449.4 0 0 0 112 714v152a46 46 0 0 0 46 46h152.1A449.4 449.4 0 0 0 510 960h2.1c59.9 0 118-11.6 172.7-34.3a444.48 444.48 0 0 0 142.8-95.2c41.3-40.9 73.8-88.7 96.5-142 23.6-55.2 35.6-113.9 35.9-174.5.3-60.9-11.5-120-34.8-175.6zm-151.1 438C704 845.8 611 884 512 884h-1.7c-60.3-.3-120.2-15.3-173.1-43.5l-8.4-4.5H188V695.2l-4.5-8.4C155.3 633.9 140.3 574 140 513.7c-.4-99.7 37.7-193.3 107.6-263.8 69.8-70.5 163.1-109.5 262.8-109.9h1.7c50 0 98.5 9.7 144.2 28.9 44.6 18.7 84.6 45.6 119 80 34.3 34.3 61.3 74.4 80 119 19.4 46.2 29.1 95.2 28.9 145.8-.6 99.6-39.7 192.9-110.1 262.7z"],[e,"M464 512a48 48 0 1 0 96 0 48 48 0 1 0-96 0z"])}),t.MinusSquareTwoTone=o("minus-square",l,function(e,t){return r(a,[e,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z"],[t,"M184 840h656V184H184v656zm136-352c0-4.4 3.6-8 8-8h368c4.4 0 8 3.6 8 8v48c0 4.4-3.6 8-8 8H328c-4.4 0-8-3.6-8-8v-48z"],[e,"M328 544h368c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8z"])}),t.MobileTwoTone=o("mobile",l,function(e,t){return r(a,[e,"M744 64H280c-35.3 0-64 28.7-64 64v768c0 35.3 28.7 64 64 64h464c35.3 0 64-28.7 64-64V128c0-35.3-28.7-64-64-64zm-8 824H288V136h448v752z"],[t,"M288 888h448V136H288v752zm224-142c22.1 0 40 17.9 40 40s-17.9 40-40 40-40-17.9-40-40 17.9-40 40-40z"],[e,"M472 786a40 40 0 1 0 80 0 40 40 0 1 0-80 0z"])}),t.MinusCircleTwoTone=o("minus-circle",l,function(e,t){return r(a,[e,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"],[t,"M512 140c-205.4 0-372 166.6-372 372s166.6 372 372 372 372-166.6 372-372-166.6-372-372-372zm192 396c0 4.4-3.6 8-8 8H328c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h368c4.4 0 8 3.6 8 8v48z"],[e,"M696 480H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h368c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8z"])}),t.MoneyCollectTwoTone=o("money-collect",l,function(e,t){return r(a,[t,"M256 744.4l256 93.1 256-93.1V184H256v560.4zM359.7 313c1.2-.7 2.5-1 3.8-1h55.7a8 8 0 0 1 7.1 4.4L511 485.2h3.3L599 316.4c1.3-2.7 4.1-4.4 7.1-4.4h54.5c4.4 0 8 3.6 8.1 7.9 0 1.3-.4 2.6-1 3.8L564 515.3h57.6c4.4 0 8 3.6 8 8v27.1c0 4.4-3.6 8-8 8h-76.3v39h76.3c4.4 0 8 3.6 8 8v27.1c0 4.4-3.6 8-8 8h-76.3V704c0 4.4-3.6 8-8 8h-49.9c-4.4 0-8-3.6-8-8v-63.4h-76c-4.4 0-8-3.6-8-8v-27.1c0-4.4 3.6-8 8-8h76v-39h-76c-4.4 0-8-3.6-8-8v-27.1c0-4.4 3.6-8 8-8h57L356.5 323.8c-2.1-3.8-.7-8.7 3.2-10.8z"],[e,"M911.5 700.7a8 8 0 0 0-10.3-4.8L840 718.2V180c0-37.6-30.4-68-68-68H252c-37.6 0-68 30.4-68 68v538.2l-61.3-22.3c-.9-.3-1.8-.5-2.7-.5-4.4 0-8 3.6-8 8V763c0 3.3 2.1 6.3 5.3 7.5L501 910.1c7.1 2.6 14.8 2.6 21.9 0l383.8-139.5c3.2-1.2 5.3-4.2 5.3-7.5v-59.6c0-1-.2-1.9-.5-2.8zM768 744.4l-256 93.1-256-93.1V184h512v560.4z"],[e,"M460.4 515.4h-57c-4.4 0-8 3.6-8 8v27.1c0 4.4 3.6 8 8 8h76v39h-76c-4.4 0-8 3.6-8 8v27.1c0 4.4 3.6 8 8 8h76V704c0 4.4 3.6 8 8 8h49.9c4.4 0 8-3.6 8-8v-63.5h76.3c4.4 0 8-3.6 8-8v-27.1c0-4.4-3.6-8-8-8h-76.3v-39h76.3c4.4 0 8-3.6 8-8v-27.1c0-4.4-3.6-8-8-8H564l103.7-191.6c.6-1.2 1-2.5 1-3.8-.1-4.3-3.7-7.9-8.1-7.9h-54.5c-3 0-5.8 1.7-7.1 4.4l-84.7 168.8H511l-84.7-168.8a8 8 0 0 0-7.1-4.4h-55.7c-1.3 0-2.6.3-3.8 1-3.9 2.1-5.3 7-3.2 10.8l103.9 191.6z"])}),t.NotificationTwoTone=o("notification",l,function(e,t){return r(a,[t,"M229.6 678.1c-3.7 11.6-5.6 23.9-5.6 36.4 0-12.5 2-24.8 5.7-36.4h-.1zm76.3-260.2H184v188.2h121.9l12.9 5.2L840 820.7V203.3L318.8 412.7z"],[e,"M880 112c-3.8 0-7.7.7-11.6 2.3L292 345.9H128c-8.8 0-16 7.4-16 16.6v299c0 9.2 7.2 16.6 16 16.6h101.7c-3.7 11.6-5.7 23.9-5.7 36.4 0 65.9 53.8 119.5 120 119.5 55.4 0 102.1-37.6 115.9-88.4l408.6 164.2c3.9 1.5 7.8 2.3 11.6 2.3 16.9 0 32-14.2 32-33.2V145.2C912 126.2 897 112 880 112zM344 762.3c-26.5 0-48-21.4-48-47.8 0-11.2 3.9-21.9 11-30.4l84.9 34.1c-2 24.6-22.7 44.1-47.9 44.1zm496 58.4L318.8 611.3l-12.9-5.2H184V417.9h121.9l12.9-5.2L840 203.3v617.4z"])}),t.PauseCircleTwoTone=o("pause-circle",l,function(e,t){return r(a,[e,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"],[t,"M512 140c-205.4 0-372 166.6-372 372s166.6 372 372 372 372-166.6 372-372-166.6-372-372-372zm-80 524c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V360c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v304zm224 0c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V360c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v304z"],[e,"M424 352h-48c-4.4 0-8 3.6-8 8v304c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V360c0-4.4-3.6-8-8-8zm224 0h-48c-4.4 0-8 3.6-8 8v304c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V360c0-4.4-3.6-8-8-8z"])}),t.PhoneTwoTone=o("phone",l,function(e,t){return r(a,[t,"M721.7 184.9L610.9 295.8l120.8 120.7-8 21.6A481.29 481.29 0 0 1 438 723.9l-21.6 8-.9-.9-119.8-120-110.8 110.9 104.5 104.5c10.8 10.7 26 15.7 40.8 13.2 117.9-19.5 235.4-82.9 330.9-178.4s158.9-213.1 178.4-331c2.5-14.8-2.5-30-13.3-40.8L721.7 184.9z"],[e,"M877.1 238.7L770.6 132.3c-13-13-30.4-20.3-48.8-20.3s-35.8 7.2-48.8 20.3L558.3 246.8c-13 13-20.3 30.5-20.3 48.9 0 18.5 7.2 35.8 20.3 48.9l89.6 89.7a405.46 405.46 0 0 1-86.4 127.3c-36.7 36.9-79.6 66-127.2 86.6l-89.6-89.7c-13-13-30.4-20.3-48.8-20.3a68.2 68.2 0 0 0-48.8 20.3L132.3 673c-13 13-20.3 30.5-20.3 48.9 0 18.5 7.2 35.8 20.3 48.9l106.4 106.4c22.2 22.2 52.8 34.9 84.2 34.9 6.5 0 12.8-.5 19.2-1.6 132.4-21.8 263.8-92.3 369.9-198.3C818 606 888.4 474.6 910.4 342.1c6.3-37.6-6.3-76.3-33.3-103.4zm-37.6 91.5c-19.5 117.9-82.9 235.5-178.4 331s-213 158.9-330.9 178.4c-14.8 2.5-30-2.5-40.8-13.2L184.9 721.9 295.7 611l119.8 120 .9.9 21.6-8a481.29 481.29 0 0 0 285.7-285.8l8-21.6-120.8-120.7 110.8-110.9 104.5 104.5c10.8 10.8 15.8 26 13.3 40.8z"])}),t.PictureTwoTone=o("picture",l,function(e,t){return r(a,[e,"M928 160H96c-17.7 0-32 14.3-32 32v640c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V192c0-17.7-14.3-32-32-32zm-40 632H136v-39.9l138.5-164.3 150.1 178L658.1 489 888 761.6V792zm0-129.8L664.2 396.8c-3.2-3.8-9-3.8-12.2 0L424.6 666.4l-144-170.7c-3.2-3.8-9-3.8-12.2 0L136 652.7V232h752v430.2z"],[t,"M424.6 765.8l-150.1-178L136 752.1V792h752v-30.4L658.1 489z"],[t,"M136 652.7l132.4-157c3.2-3.8 9-3.8 12.2 0l144 170.7L652 396.8c3.2-3.8 9-3.8 12.2 0L888 662.2V232H136v420.7zM304 280a88 88 0 1 1 0 176 88 88 0 0 1 0-176z"],[t,"M276 368a28 28 0 1 0 56 0 28 28 0 1 0-56 0z"],[e,"M304 456a88 88 0 1 0 0-176 88 88 0 0 0 0 176zm0-116c15.5 0 28 12.5 28 28s-12.5 28-28 28-28-12.5-28-28 12.5-28 28-28z"])}),t.PieChartTwoTone=o("pie-chart",l,function(e,t){return r(a,[t,"M316.2 920.5c-47.6-20.1-90.4-49-127.1-85.7a398.19 398.19 0 0 1-85.7-127.1A397.12 397.12 0 0 1 72 552.2v.2a398.57 398.57 0 0 0 117 282.5c36.7 36.7 79.4 65.5 127 85.6A396.64 396.64 0 0 0 471.6 952c27 0 53.6-2.7 79.7-7.9-25.9 5.2-52.4 7.8-79.3 7.8-54 .1-106.4-10.5-155.8-31.4zM560 472c-4.4 0-8-3.6-8-8V79.9c0-1.3.3-2.5.9-3.6-.9 1.3-1.5 2.9-1.5 4.6v383.7c0 4.4 3.6 8 8 8l383.6-1c1.6 0 3.1-.5 4.4-1.3-1 .5-2.2.7-3.4.7l-384 1z"],[t,"M619.8 147.6v256.6l256.4-.7c-13-62.5-44.3-120.5-90-166.1a332.24 332.24 0 0 0-166.4-89.8z"],[t,"M438 221.7c-75.9 7.6-146.2 40.9-200.8 95.5C174.5 379.9 140 463.3 140 552s34.5 172.1 97.2 234.8c62.3 62.3 145.1 96.8 233.2 97.2 88.2.4 172.7-34.1 235.3-96.2C761 733 794.6 662.3 802.3 586H438V221.7z"],[e,"M864 518H506V160c0-4.4-3.6-8-8-8h-26a398.46 398.46 0 0 0-282.8 117.1 398.19 398.19 0 0 0-85.7 127.1A397.61 397.61 0 0 0 72 552v.2c0 53.9 10.6 106.2 31.4 155.5 20.1 47.6 49 90.4 85.7 127.1 36.7 36.7 79.5 65.6 127.1 85.7A397.61 397.61 0 0 0 472 952c26.9 0 53.4-2.6 79.3-7.8 26.1-5.3 51.7-13.1 76.4-23.6 47.6-20.1 90.4-49 127.1-85.7 36.7-36.7 65.6-79.5 85.7-127.1A397.61 397.61 0 0 0 872 552v-26c0-4.4-3.6-8-8-8zM705.7 787.8A331.59 331.59 0 0 1 470.4 884c-88.1-.4-170.9-34.9-233.2-97.2C174.5 724.1 140 640.7 140 552s34.5-172.1 97.2-234.8c54.6-54.6 124.9-87.9 200.8-95.5V586h364.3c-7.7 76.3-41.3 147-96.6 201.8z"],[e,"M952 462.4l-2.6-28.2c-8.5-92.1-49.4-179-115.2-244.6A399.4 399.4 0 0 0 589 74.6L560.7 72c-3.4-.3-6.4 1.5-7.8 4.3a8.7 8.7 0 0 0-.9 3.6V464c0 4.4 3.6 8 8 8l384-1c1.2 0 2.3-.3 3.4-.7a8.1 8.1 0 0 0 4.6-7.9zm-332.2-58.2V147.6a332.24 332.24 0 0 1 166.4 89.8c45.7 45.6 77 103.6 90 166.1l-256.4.7z"])}),t.PlayCircleTwoTone=o("play-circle",l,function(e,t){return r(a,[e,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"],[t,"M512 140c-205.4 0-372 166.6-372 372s166.6 372 372 372 372-166.6 372-372-166.6-372-372-372zm164.1 378.2L457.7 677.1a8.02 8.02 0 0 1-12.7-6.5V353a8 8 0 0 1 12.7-6.5l218.4 158.8a7.9 7.9 0 0 1 0 12.9z"],[e,"M676.1 505.3L457.7 346.5A8 8 0 0 0 445 353v317.6a8.02 8.02 0 0 0 12.7 6.5l218.4-158.9a7.9 7.9 0 0 0 0-12.9z"])}),t.PlaySquareTwoTone=o("play-square",l,function(e,t){return r(a,[e,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z"],[t,"M184 840h656V184H184v656zm240-484.7c0-9.4 10.9-14.7 18.3-8.8l199.4 156.7a11.2 11.2 0 0 1 0 17.6L442.3 677.6c-7.4 5.8-18.3.6-18.3-8.8V355.3z"],[e,"M442.3 677.6l199.4-156.8a11.2 11.2 0 0 0 0-17.6L442.3 346.5c-7.4-5.9-18.3-.6-18.3 8.8v313.5c0 9.4 10.9 14.6 18.3 8.8z"])}),t.PlusCircleTwoTone=o("plus-circle",l,function(e,t){return r(a,[e,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"],[t,"M512 140c-205.4 0-372 166.6-372 372s166.6 372 372 372 372-166.6 372-372-166.6-372-372-372zm192 396c0 4.4-3.6 8-8 8H544v152c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V544H328c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h152V328c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v152h152c4.4 0 8 3.6 8 8v48z"],[e,"M696 480H544V328c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v152H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h152v152c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V544h152c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8z"])}),t.WechatOutline=o("wechat",s,r(a,"M690.1 377.4c5.9 0 11.8.2 17.6.5-24.4-128.7-158.3-227.1-319.9-227.1C209 150.8 64 271.4 64 420.2c0 81.1 43.6 154.2 111.9 203.6a21.5 21.5 0 0 1 9.1 17.6c0 2.4-.5 4.6-1.1 6.9-5.5 20.3-14.2 52.8-14.6 54.3-.7 2.6-1.7 5.2-1.7 7.9 0 5.9 4.8 10.8 10.8 10.8 2.3 0 4.2-.9 6.2-2l70.9-40.9c5.3-3.1 11-5 17.2-5 3.2 0 6.4.5 9.5 1.4 33.1 9.5 68.8 14.8 105.7 14.8 6 0 11.9-.1 17.8-.4-7.1-21-10.9-43.1-10.9-66 0-135.8 132.2-245.8 295.3-245.8zm-194.3-86.5c23.8 0 43.2 19.3 43.2 43.1s-19.3 43.1-43.2 43.1c-23.8 0-43.2-19.3-43.2-43.1s19.4-43.1 43.2-43.1zm-215.9 86.2c-23.8 0-43.2-19.3-43.2-43.1s19.3-43.1 43.2-43.1 43.2 19.3 43.2 43.1-19.4 43.1-43.2 43.1zm586.8 415.6c56.9-41.2 93.2-102 93.2-169.7 0-124-120.8-224.5-269.9-224.5-149 0-269.9 100.5-269.9 224.5S540.9 847.5 690 847.5c30.8 0 60.6-4.4 88.1-12.3 2.6-.8 5.2-1.2 7.9-1.2 5.2 0 9.9 1.6 14.3 4.1l59.1 34c1.7 1 3.3 1.7 5.2 1.7a9 9 0 0 0 6.4-2.6 9 9 0 0 0 2.6-6.4c0-2.2-.9-4.4-1.4-6.6-.3-1.2-7.6-28.3-12.2-45.3-.5-1.9-.9-3.8-.9-5.7.1-5.9 3.1-11.2 7.6-14.5zM600.2 587.2c-19.9 0-36-16.1-36-35.9 0-19.8 16.1-35.9 36-35.9s36 16.1 36 35.9c0 19.8-16.2 35.9-36 35.9zm179.9 0c-19.9 0-36-16.1-36-35.9 0-19.8 16.1-35.9 36-35.9s36 16.1 36 35.9a36.08 36.08 0 0 1-36 35.9z")),t.PoundCircleTwoTone=o("pound-circle",l,function(e,t){return r(a,[e,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"],[t,"M512 140c-205.4 0-372 166.6-372 372s166.6 372 372 372 372-166.6 372-372-166.6-372-372-372zm146 582.1c0 4.4-3.6 8-8 8H376.2c-4.4 0-8-3.6-8-8v-38.5c0-3.7 2.5-6.9 6.1-7.8 44-10.9 72.8-49 72.8-94.2 0-14.7-2.5-29.4-5.9-44.2H374c-4.4 0-8-3.6-8-8v-30c0-4.4 3.6-8 8-8h53.7c-7.8-25.1-14.6-50.7-14.6-77.1 0-75.8 58.6-120.3 151.5-120.3 26.5 0 51.4 5.5 70.3 12.7 3.1 1.2 5.2 4.2 5.2 7.5v39.5a8 8 0 0 1-10.6 7.6c-17.9-6.4-39-10.5-60.4-10.5-53.3 0-87.3 26.6-87.3 70.2 0 24.7 6.2 47.9 13.4 70.5h112c4.4 0 8 3.6 8 8v30c0 4.4-3.6 8-8 8h-98.6c3.1 13.2 5.3 26.9 5.3 41 0 40.7-16.5 73.9-43.9 91.1v4.7h180c4.4 0 8 3.6 8 8v39.8z"],[e,"M650 674.3H470v-4.7c27.4-17.2 43.9-50.4 43.9-91.1 0-14.1-2.2-27.8-5.3-41h98.6c4.4 0 8-3.6 8-8v-30c0-4.4-3.6-8-8-8h-112c-7.2-22.6-13.4-45.8-13.4-70.5 0-43.6 34-70.2 87.3-70.2 21.4 0 42.5 4.1 60.4 10.5a8 8 0 0 0 10.6-7.6v-39.5c0-3.3-2.1-6.3-5.2-7.5-18.9-7.2-43.8-12.7-70.3-12.7-92.9 0-151.5 44.5-151.5 120.3 0 26.4 6.8 52 14.6 77.1H374c-4.4 0-8 3.6-8 8v30c0 4.4 3.6 8 8 8h67.2c3.4 14.8 5.9 29.5 5.9 44.2 0 45.2-28.8 83.3-72.8 94.2-3.6.9-6.1 4.1-6.1 7.8v38.5c0 4.4 3.6 8 8 8H650c4.4 0 8-3.6 8-8v-39.8c0-4.4-3.6-8-8-8z"])}),t.PrinterTwoTone=o("printer",l,function(e,t){return r(a,[t,"M360 180h304v152H360zm492 220H172c-6.6 0-12 5.4-12 12v292h132V500h440v204h132V412c0-6.6-5.4-12-12-12zm-24 84c0 4.4-3.6 8-8 8h-40c-4.4 0-8-3.6-8-8v-40c0-4.4 3.6-8 8-8h40c4.4 0 8 3.6 8 8v40z"],[e,"M852 332H732V120c0-4.4-3.6-8-8-8H300c-4.4 0-8 3.6-8 8v212H172c-44.2 0-80 35.8-80 80v328c0 17.7 14.3 32 32 32h168v132c0 4.4 3.6 8 8 8h424c4.4 0 8-3.6 8-8V772h168c17.7 0 32-14.3 32-32V412c0-44.2-35.8-80-80-80zM360 180h304v152H360V180zm304 664H360V568h304v276zm200-140H732V500H292v204H160V412c0-6.6 5.4-12 12-12h680c6.6 0 12 5.4 12 12v292z"],[e,"M820 436h-40c-4.4 0-8 3.6-8 8v40c0 4.4 3.6 8 8 8h40c4.4 0 8-3.6 8-8v-40c0-4.4-3.6-8-8-8z"])}),t.ProfileTwoTone=o("profile",l,function(e,t){return r(a,[e,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z"],[t,"M184 840h656V184H184v656zm300-496c0-4.4 3.6-8 8-8h184c4.4 0 8 3.6 8 8v48c0 4.4-3.6 8-8 8H492c-4.4 0-8-3.6-8-8v-48zm0 144c0-4.4 3.6-8 8-8h184c4.4 0 8 3.6 8 8v48c0 4.4-3.6 8-8 8H492c-4.4 0-8-3.6-8-8v-48zm0 144c0-4.4 3.6-8 8-8h184c4.4 0 8 3.6 8 8v48c0 4.4-3.6 8-8 8H492c-4.4 0-8-3.6-8-8v-48zM380 328c22.1 0 40 17.9 40 40s-17.9 40-40 40-40-17.9-40-40 17.9-40 40-40zm0 144c22.1 0 40 17.9 40 40s-17.9 40-40 40-40-17.9-40-40 17.9-40 40-40zm0 144c22.1 0 40 17.9 40 40s-17.9 40-40 40-40-17.9-40-40 17.9-40 40-40z"],[e,"M340 656a40 40 0 1 0 80 0 40 40 0 1 0-80 0zM340 512a40 40 0 1 0 80 0 40 40 0 1 0-80 0zM340 368a40 40 0 1 0 80 0 40 40 0 1 0-80 0zM492 688h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H492c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8zm0-144h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H492c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8zm0-144h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H492c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8z"])}),t.PropertySafetyTwoTone=o("property-safety",l,function(e,t){return r(a,[e,"M866.9 169.9L527.1 54.1C523 52.7 517.5 52 512 52s-11 .7-15.1 2.1L157.1 169.9c-8.3 2.8-15.1 12.4-15.1 21.2v482.4c0 8.8 5.7 20.4 12.6 25.9L499.3 968c3.5 2.7 8 4.1 12.6 4.1s9.2-1.4 12.6-4.1l344.7-268.6c6.9-5.4 12.6-17 12.6-25.9V191.1c.2-8.8-6.6-18.3-14.9-21.2zM810 654.3L512 886.5 214 654.3V226.7l298-101.6 298 101.6v427.6z"],[t,"M214 226.7v427.6l298 232.2 298-232.2V226.7L512 125.1 214 226.7zM593.9 318h45c5.5 0 10 4.5 10 10 .1 1.7-.3 3.3-1.1 4.8l-87.7 161.1h45.7c5.5 0 10 4.5 10 10v21.3c0 5.5-4.5 10-10 10h-63.4v29.7h63.4c5.5 0 10 4.5 10 10v21.3c0 5.5-4.5 10-10 10h-63.4V658c0 5.5-4.5 10-10 10h-41.3c-5.5 0-10-4.5-10-10v-51.8H418c-5.5 0-10-4.5-10-10v-21.3c0-5.5 4.5-10 10-10h63.1v-29.7H418c-5.5 0-10-4.5-10-10v-21.3c0-5.5 4.5-10 10-10h45.2l-88-161.1c-2.6-4.8-.9-10.9 4-13.6 1.5-.8 3.1-1.2 4.8-1.2h46c3.8 0 7.2 2.1 8.9 5.5l72.9 144.3L585 323.5a10 10 0 0 1 8.9-5.5z"],[e,"M438.9 323.5a9.88 9.88 0 0 0-8.9-5.5h-46c-1.7 0-3.3.4-4.8 1.2-4.9 2.7-6.6 8.8-4 13.6l88 161.1H418c-5.5 0-10 4.5-10 10v21.3c0 5.5 4.5 10 10 10h63.1v29.7H418c-5.5 0-10 4.5-10 10v21.3c0 5.5 4.5 10 10 10h63.1V658c0 5.5 4.5 10 10 10h41.3c5.5 0 10-4.5 10-10v-51.8h63.4c5.5 0 10-4.5 10-10v-21.3c0-5.5-4.5-10-10-10h-63.4v-29.7h63.4c5.5 0 10-4.5 10-10v-21.3c0-5.5-4.5-10-10-10h-45.7l87.7-161.1c.8-1.5 1.2-3.1 1.1-4.8 0-5.5-4.5-10-10-10h-45a10 10 0 0 0-8.9 5.5l-73.2 144.3-72.9-144.3z"])}),t.ProjectTwoTone=o("project",l,function(e,t){return r(a,[e,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z"],[t,"M184 840h656V184H184v656zm472-560c0-4.4 3.6-8 8-8h80c4.4 0 8 3.6 8 8v256c0 4.4-3.6 8-8 8h-80c-4.4 0-8-3.6-8-8V280zm-192 0c0-4.4 3.6-8 8-8h80c4.4 0 8 3.6 8 8v184c0 4.4-3.6 8-8 8h-80c-4.4 0-8-3.6-8-8V280zm-192 0c0-4.4 3.6-8 8-8h80c4.4 0 8 3.6 8 8v464c0 4.4-3.6 8-8 8h-80c-4.4 0-8-3.6-8-8V280z"],[e,"M280 752h80c4.4 0 8-3.6 8-8V280c0-4.4-3.6-8-8-8h-80c-4.4 0-8 3.6-8 8v464c0 4.4 3.6 8 8 8zm192-280h80c4.4 0 8-3.6 8-8V280c0-4.4-3.6-8-8-8h-80c-4.4 0-8 3.6-8 8v184c0 4.4 3.6 8 8 8zm192 72h80c4.4 0 8-3.6 8-8V280c0-4.4-3.6-8-8-8h-80c-4.4 0-8 3.6-8 8v256c0 4.4 3.6 8 8 8z"])}),t.PushpinTwoTone=o("pushpin",l,function(e,t){return r(a,[t,"M474.8 357.7l-24.5 24.5-34.4-3.8c-9.6-1.1-19.3-1.6-28.9-1.6-29 0-57.5 4.7-84.7 14.1-14 4.8-27.4 10.8-40.3 17.9l353.1 353.3a259.92 259.92 0 0 0 30.4-153.9l-3.8-34.4 24.5-24.5L800 415.5 608.5 224 474.8 357.7z"],[e,"M878.3 392.1L631.9 145.7c-6.5-6.5-15-9.7-23.5-9.7s-17 3.2-23.5 9.7L423.8 306.9c-12.2-1.4-24.5-2-36.8-2-73.2 0-146.4 24.1-206.5 72.3a33.23 33.23 0 0 0-2.7 49.4l181.7 181.7-215.4 215.2a15.8 15.8 0 0 0-4.6 9.8l-3.4 37.2c-.9 9.4 6.6 17.4 15.9 17.4.5 0 1 0 1.5-.1l37.2-3.4c3.7-.3 7.2-2 9.8-4.6l215.4-215.4 181.7 181.7c6.5 6.5 15 9.7 23.5 9.7 9.7 0 19.3-4.2 25.9-12.4 56.3-70.3 79.7-158.3 70.2-243.4l161.1-161.1c12.9-12.8 12.9-33.8 0-46.8zM666.2 549.3l-24.5 24.5 3.8 34.4a259.92 259.92 0 0 1-30.4 153.9L262 408.8c12.9-7.1 26.3-13.1 40.3-17.9 27.2-9.4 55.7-14.1 84.7-14.1 9.6 0 19.3.5 28.9 1.6l34.4 3.8 24.5-24.5L608.5 224 800 415.5 666.2 549.3z"])}),t.QuestionCircleTwoTone=o("question-circle",l,function(e,t){return r(a,[e,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"],[t,"M512 140c-205.4 0-372 166.6-372 372s166.6 372 372 372 372-166.6 372-372-166.6-372-372-372zm0 632c-22.1 0-40-17.9-40-40s17.9-40 40-40 40 17.9 40 40-17.9 40-40 40zm62.9-219.5a48.3 48.3 0 0 0-30.9 44.8V620c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-21.5c0-23.1 6.7-45.9 19.9-64.9 12.9-18.6 30.9-32.8 52.1-40.9 34-13.1 56-41.6 56-72.7 0-44.1-43.1-80-96-80s-96 35.9-96 80v7.6c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V420c0-39.3 17.2-76 48.4-103.3C430.4 290.4 470 276 512 276s81.6 14.5 111.6 40.7C654.8 344 672 380.7 672 420c0 57.8-38.1 109.8-97.1 132.5z"],[e,"M472 732a40 40 0 1 0 80 0 40 40 0 1 0-80 0zM623.6 316.7C593.6 290.5 554 276 512 276s-81.6 14.4-111.6 40.7C369.2 344 352 380.7 352 420v7.6c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V420c0-44.1 43.1-80 96-80s96 35.9 96 80c0 31.1-22 59.6-56 72.7-21.2 8.1-39.2 22.3-52.1 40.9-13.2 19-19.9 41.8-19.9 64.9V620c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-22.7a48.3 48.3 0 0 1 30.9-44.8c59-22.7 97.1-74.7 97.1-132.5 0-39.3-17.2-76-48.4-103.3z"])}),t.ProfileOutline=o("profile",s,r(a,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656zM492 400h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H492c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8zm0 144h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H492c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8zm0 144h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H492c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8zM340 368a40 40 0 1 0 80 0 40 40 0 1 0-80 0zm0 144a40 40 0 1 0 80 0 40 40 0 1 0-80 0zm0 144a40 40 0 1 0 80 0 40 40 0 1 0-80 0z")),t.PlusSquareTwoTone=o("plus-square",l,function(e,t){return r(a,[e,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z"],[t,"M184 840h656V184H184v656zm136-352c0-4.4 3.6-8 8-8h152V328c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v152h152c4.4 0 8 3.6 8 8v48c0 4.4-3.6 8-8 8H544v152c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V544H328c-4.4 0-8-3.6-8-8v-48z"],[e,"M328 544h152v152c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V544h152c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H544V328c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v152H328c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8z"])}),t.ReconciliationTwoTone=o("reconciliation",l,function(e,t){return r(a,[t,"M740 344H404V240H304v160h176c17.7 0 32 14.3 32 32v360h328V240H740v104zM584 448c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8v56c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-56zm92 301c-50.8 0-92-41.2-92-92s41.2-92 92-92 92 41.2 92 92-41.2 92-92 92zm92-341v96c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8v-96c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8z"],[t,"M642 657a34 34 0 1 0 68 0 34 34 0 1 0-68 0z"],[e,"M592 512h48c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm112-104v96c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-96c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8z"],[e,"M880 168H668c0-30.9-25.1-56-56-56h-80c-30.9 0-56 25.1-56 56H264c-17.7 0-32 14.3-32 32v200h-88c-17.7 0-32 14.3-32 32v448c0 17.7 14.3 32 32 32h336c17.7 0 32-14.3 32-32v-16h368c17.7 0 32-14.3 32-32V200c0-17.7-14.3-32-32-32zm-412 64h72v-56h64v56h72v48H468v-48zm-20 616H176V616h272v232zm0-296H176v-88h272v88zm392 240H512V432c0-17.7-14.3-32-32-32H304V240h100v104h336V240h100v552z"],[e,"M676 565c-50.8 0-92 41.2-92 92s41.2 92 92 92 92-41.2 92-92-41.2-92-92-92zm0 126c-18.8 0-34-15.2-34-34s15.2-34 34-34 34 15.2 34 34-15.2 34-34 34z"])}),t.RestTwoTone=o("rest",l,function(e,t){return r(a,[t,"M326.4 844h363.2l44.3-520H282l44.4 520zM508 416c79.5 0 144 64.5 144 144s-64.5 144-144 144-144-64.5-144-144 64.5-144 144-144z"],[e,"M508 704c79.5 0 144-64.5 144-144s-64.5-144-144-144-144 64.5-144 144 64.5 144 144 144zm0-224c44.2 0 80 35.8 80 80s-35.8 80-80 80-80-35.8-80-80 35.8-80 80-80z"],[e,"M832 256h-28.1l-35.7-120.9c-4-13.7-16.5-23.1-30.7-23.1h-451c-14.3 0-26.8 9.4-30.7 23.1L220.1 256H192c-17.7 0-32 14.3-32 32v28c0 4.4 3.6 8 8 8h45.8l47.7 558.7a32 32 0 0 0 31.9 29.3h429.2a32 32 0 0 0 31.9-29.3L802.2 324H856c4.4 0 8-3.6 8-8v-28c0-17.7-14.3-32-32-32zm-518.6-76h397.2l22.4 76H291l22.4-76zm376.2 664H326.4L282 324h451.9l-44.3 520z"])}),t.RightSquareTwoTone=o("right-square",l,function(e,t){return r(a,[e,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z"],[t,"M184 840h656V184H184v656zm216-196.9c0-10.2 4.9-19.9 13.2-25.9L558.6 512 413.2 406.8c-8.3-6-13.2-15.6-13.2-25.9V334c0-6.5 7.4-10.3 12.7-6.5l246 178c4.4 3.2 4.4 9.7 0 12.9l-246 178c-5.3 3.9-12.7.1-12.7-6.4v-46.9z"],[e,"M412.7 696.4l246-178c4.4-3.2 4.4-9.7 0-12.9l-246-178c-5.3-3.8-12.7 0-12.7 6.5v46.9c0 10.3 4.9 19.9 13.2 25.9L558.6 512 413.2 617.2c-8.3 6-13.2 15.7-13.2 25.9V690c0 6.5 7.4 10.3 12.7 6.4z"])}),t.RightCircleTwoTone=o("right-circle",l,function(e,t){return r(a,[t,"M512 140c-205.4 0-372 166.6-372 372s166.6 372 372 372 372-166.6 372-372-166.6-372-372-372zm154.7 378.4l-246 178c-5.3 3.8-12.7 0-12.7-6.5V643c0-10.2 4.9-19.9 13.2-25.9L566.6 512 421.2 406.8c-8.3-6-13.2-15.6-13.2-25.9V334c0-6.5 7.4-10.3 12.7-6.5l246 178c4.4 3.2 4.4 9.7 0 12.9z"],[e,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"],[e,"M666.7 505.5l-246-178c-5.3-3.8-12.7 0-12.7 6.5v46.9c0 10.3 4.9 19.9 13.2 25.9L566.6 512 421.2 617.1c-8.3 6-13.2 15.7-13.2 25.9v46.9c0 6.5 7.4 10.3 12.7 6.5l246-178c4.4-3.2 4.4-9.7 0-12.9z"])}),t.RocketTwoTone=o("rocket",l,function(e,t){return r(a,[t,"M261.7 621.4c-9.4 14.6-17 30.3-22.5 46.6H324V558.7c-24.8 16.2-46 37.5-62.3 62.7zM700 558.7V668h84.8c-5.5-16.3-13.1-32-22.5-46.6a211.6 211.6 0 0 0-62.3-62.7zm-64-239.9l-124-147-124 147V668h248V318.8zM512 448a48.01 48.01 0 0 1 0-96 48.01 48.01 0 0 1 0 96z"],[e,"M864 736c0-111.6-65.4-208-160-252.9V317.3c0-15.1-5.3-29.7-15.1-41.2L536.5 95.4C530.1 87.8 521 84 512 84s-18.1 3.8-24.5 11.4L335.1 276.1a63.97 63.97 0 0 0-15.1 41.2v165.8C225.4 528 160 624.4 160 736h156.5c-2.3 7.2-3.5 15-3.5 23.8 0 22.1 7.6 43.7 21.4 60.8a97.2 97.2 0 0 0 43.1 30.6c23.1 54 75.6 88.8 134.5 88.8 29.1 0 57.3-8.6 81.4-24.8 23.6-15.8 41.9-37.9 53-64a97 97 0 0 0 43.1-30.5 97.52 97.52 0 0 0 21.4-60.8c0-8.4-1.1-16.4-3.1-23.8L864 736zm-540-68h-84.8c5.5-16.3 13.1-32 22.5-46.6 16.3-25.2 37.5-46.5 62.3-62.7V668zm64-184.9V318.8l124-147 124 147V668H388V483.1zm240.1 301.1c-5.2 3-11.2 4.2-17.1 3.4l-19.5-2.4-2.8 19.4c-5.4 37.9-38.4 66.5-76.7 66.5s-71.3-28.6-76.7-66.5l-2.8-19.5-19.5 2.5a27.7 27.7 0 0 1-17.1-3.5c-8.7-5-14.1-14.3-14.1-24.4 0-10.6 5.9-19.4 14.6-23.8h231.3c8.8 4.5 14.6 13.3 14.6 23.8-.1 10.2-5.5 19.6-14.2 24.5zM700 668V558.7a211.6 211.6 0 0 1 62.3 62.7c9.4 14.6 17 30.3 22.5 46.6H700z"],[e,"M464 400a48 48 0 1 0 96 0 48 48 0 1 0-96 0z"])}),t.SafetyCertificateTwoTone=o("safety-certificate",l,function(e,t){return r(a,[e,"M866.9 169.9L527.1 54.1C523 52.7 517.5 52 512 52s-11 .7-15.1 2.1L157.1 169.9c-8.3 2.8-15.1 12.4-15.1 21.2v482.4c0 8.8 5.7 20.4 12.6 25.9L499.3 968c3.5 2.7 8 4.1 12.6 4.1s9.2-1.4 12.6-4.1l344.7-268.6c6.9-5.4 12.6-17 12.6-25.9V191.1c.2-8.8-6.6-18.3-14.9-21.2zM810 654.3L512 886.5 214 654.3V226.7l298-101.6 298 101.6v427.6z"],[t,"M214 226.7v427.6l298 232.2 298-232.2V226.7L512 125.1 214 226.7zM632.8 328H688c6.5 0 10.3 7.4 6.5 12.7L481.9 633.4a16.1 16.1 0 0 1-26 0l-126.4-174c-3.8-5.3 0-12.7 6.5-12.7h55.2c5.2 0 10 2.5 13 6.6l64.7 89.1 150.9-207.8c3-4.1 7.9-6.6 13-6.6z"],[e,"M404.2 453.3c-3-4.1-7.8-6.6-13-6.6H336c-6.5 0-10.3 7.4-6.5 12.7l126.4 174a16.1 16.1 0 0 0 26 0l212.6-292.7c3.8-5.3 0-12.7-6.5-12.7h-55.2c-5.1 0-10 2.5-13 6.6L468.9 542.4l-64.7-89.1z"])}),t.SaveTwoTone=o("save",l,function(e,t){return r(a,[t,"M704 320c0 17.7-14.3 32-32 32H352c-17.7 0-32-14.3-32-32V184H184v656h656V341.8l-136-136V320zM512 730c-79.5 0-144-64.5-144-144s64.5-144 144-144 144 64.5 144 144-64.5 144-144 144z"],[e,"M512 442c-79.5 0-144 64.5-144 144s64.5 144 144 144 144-64.5 144-144-64.5-144-144-144zm0 224c-44.2 0-80-35.8-80-80s35.8-80 80-80 80 35.8 80 80-35.8 80-80 80z"],[e,"M893.3 293.3L730.7 130.7c-.7-.7-1.4-1.3-2.1-2-.1-.1-.3-.2-.4-.3-.7-.7-1.5-1.3-2.2-1.9a64 64 0 0 0-22-11.7V112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V338.5c0-17-6.7-33.2-18.7-45.2zM384 184h256v104H384V184zm456 656H184V184h136v136c0 17.7 14.3 32 32 32h320c17.7 0 32-14.3 32-32V205.8l136 136V840z"])}),t.ScheduleTwoTone=o("schedule",l,function(e,t){return r(a,[t,"M768 352c0 4.4-3.6 8-8 8h-56c-4.4 0-8-3.6-8-8v-56H548v56c0 4.4-3.6 8-8 8h-56c-4.4 0-8-3.6-8-8v-56H328v56c0 4.4-3.6 8-8 8h-56c-4.4 0-8-3.6-8-8v-56H136v496h752V296H768v56zM424 688c0 4.4-3.6 8-8 8H232c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h184c4.4 0 8 3.6 8 8v48zm0-136c0 4.4-3.6 8-8 8H232c-4.4 0-8-3.6-8-8v-48c0-4.4 3.6-8 8-8h184c4.4 0 8 3.6 8 8v48zm374.4-91.2l-165 228.7a15.9 15.9 0 0 1-25.8 0L493.5 531.3c-3.8-5.3 0-12.7 6.5-12.7h54.9c5.1 0 9.9 2.4 12.9 6.6l52.8 73.1 103.6-143.7c3-4.1 7.8-6.6 12.8-6.5h54.9c6.5 0 10.3 7.4 6.5 12.7z"],[e,"M724.2 454.6L620.6 598.3l-52.8-73.1c-3-4.2-7.8-6.6-12.9-6.6H500c-6.5 0-10.3 7.4-6.5 12.7l114.1 158.2a15.9 15.9 0 0 0 25.8 0l165-228.7c3.8-5.3 0-12.7-6.5-12.7H737c-5-.1-9.8 2.4-12.8 6.5zM416 496H232c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8z"],[e,"M928 224H768v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56H548v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56H328v-56c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v56H96c-17.7 0-32 14.3-32 32v576c0 17.7 14.3 32 32 32h832c17.7 0 32-14.3 32-32V256c0-17.7-14.3-32-32-32zm-40 568H136V296h120v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56h148v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56h148v56c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-56h120v496z"],[e,"M416 632H232c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h184c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8z"])}),t.SecurityScanTwoTone=o("security-scan",l,function(e,t){return r(a,[e,"M866.9 169.9L527.1 54.1C523 52.7 517.5 52 512 52s-11 .7-15.1 2.1L157.1 169.9c-8.3 2.8-15.1 12.4-15.1 21.2v482.4c0 8.8 5.7 20.4 12.6 25.9L499.3 968c3.5 2.7 8 4.1 12.6 4.1s9.2-1.4 12.6-4.1l344.7-268.6c6.9-5.4 12.6-17 12.6-25.9V191.1c.2-8.8-6.6-18.3-14.9-21.2zM810 654.3L512 886.5 214 654.3V226.7l298-101.6 298 101.6v427.6z"],[t,"M460.69999999999993 451.1a80.1 80.1 0 1 0 160.2 0 80.1 80.1 0 1 0-160.2 0z"],[t,"M214 226.7v427.6l298 232.2 298-232.2V226.7L512 125.1 214 226.7zm428.7 122.5c56.3 56.3 56.3 147.5 0 203.8-48.5 48.5-123 55.2-178.6 20.1l-77.5 77.5a8.03 8.03 0 0 1-11.3 0l-34-34a8.03 8.03 0 0 1 0-11.3l77.5-77.5c-35.1-55.7-28.4-130.1 20.1-178.6 56.3-56.3 147.5-56.3 203.8 0z"],[e,"M418.8 527.8l-77.5 77.5a8.03 8.03 0 0 0 0 11.3l34 34c3.1 3.1 8.2 3.1 11.3 0l77.5-77.5c55.6 35.1 130.1 28.4 178.6-20.1 56.3-56.3 56.3-147.5 0-203.8-56.3-56.3-147.5-56.3-203.8 0-48.5 48.5-55.2 122.9-20.1 178.6zm65.4-133.3a80.1 80.1 0 0 1 113.3 0 80.1 80.1 0 0 1 0 113.3c-31.3 31.3-82 31.3-113.3 0s-31.3-82 0-113.3z"])}),t.ShoppingTwoTone=o("shopping",l,function(e,t){return r(a,[t,"M696 472c0 4.4-3.6 8-8 8h-56c-4.4 0-8-3.6-8-8v-88H400v88c0 4.4-3.6 8-8 8h-56c-4.4 0-8-3.6-8-8v-88h-96v456h560V384h-96v88z"],[e,"M832 312H696v-16c0-101.6-82.4-184-184-184s-184 82.4-184 184v16H192c-17.7 0-32 14.3-32 32v536c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V344c0-17.7-14.3-32-32-32zm-432-16c0-61.9 50.1-112 112-112s112 50.1 112 112v16H400v-16zm392 544H232V384h96v88c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-88h224v88c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-88h96v456z"])}),t.SettingTwoTone=o("setting",l,function(e,t){return r(a,[t,"M859.3 569.7l.2.1c3.1-18.9 4.6-38.2 4.6-57.3 0-17.1-1.3-34.3-3.7-51.1 2.4 16.7 3.6 33.6 3.6 50.5 0 19.4-1.6 38.8-4.7 57.8zM99 398.1c-.5-.4-.9-.8-1.4-1.3.7.7 1.4 1.4 2.2 2.1l65.5 55.9v-.1L99 398.1zm536.6-216h.1l-15.5-83.8c-.2-1-.4-1.9-.7-2.8.1.5.3 1.1.4 1.6l15.7 85zm54 546.5l31.4-25.8 92.8 32.9c17-22.9 31.3-47.5 42.6-73.6l-74.7-63.9 6.6-40.1c2.5-15.1 3.8-30.6 3.8-46.1s-1.3-31-3.8-46.1l-6.5-39.9 74.7-63.9c-11.4-26-25.6-50.7-42.6-73.6l-92.8 32.9-31.4-25.8c-23.9-19.6-50.6-35-79.3-45.8l-38.1-14.3-17.9-97a377.5 377.5 0 0 0-85 0l-17.9 97.2-37.9 14.3c-28.5 10.8-55 26.2-78.7 45.7l-31.4 25.9-93.4-33.2c-17 22.9-31.3 47.5-42.6 73.6l75.5 64.5-6.5 40c-2.5 14.9-3.7 30.2-3.7 45.5 0 15.2 1.3 30.6 3.7 45.5l6.5 40-75.5 64.5c11.4 26 25.6 50.7 42.6 73.6l93.4-33.2 31.4 25.9c23.7 19.5 50.2 34.9 78.7 45.7l37.8 14.5 17.9 97.2c28.2 3.2 56.9 3.2 85 0l17.9-97 38.1-14.3c28.8-10.8 55.4-26.2 79.3-45.8zm-177.1-50.3c-30.5 0-59.2-7.8-84.3-21.5C373.3 627 336 568.9 336 502c0-97.2 78.8-176 176-176 66.9 0 125 37.3 154.8 92.2 13.7 25 21.5 53.7 21.5 84.3 0 97.1-78.7 175.8-175.8 175.8zM207.2 812.8c-5.5 1.9-11.2 2.3-16.6 1.2 5.7 1.2 11.7 1 17.5-1l81.4-29c-.1-.1-.3-.2-.4-.3l-81.9 29.1zm717.6-414.7l-65.5 56c0 .2.1.5.1.7l65.4-55.9c7.1-6.1 11.1-14.9 11.2-24-.3 8.8-4.3 17.3-11.2 23.2z"],[t,"M935.8 646.6c.5 4.7 0 9.5-1.7 14.1l-.9 2.6a446.02 446.02 0 0 1-79.7 137.9l-1.8 2.1a32 32 0 0 1-35.1 9.5l-81.3-28.9a350 350 0 0 1-99.7 57.6l-15.7 85a32.05 32.05 0 0 1-25.8 25.7l-2.7.5a445.2 445.2 0 0 1-79.2 7.1h.3c26.7 0 53.4-2.4 79.4-7.1l2.7-.5a32.05 32.05 0 0 0 25.8-25.7l15.7-84.9c36.2-13.6 69.6-32.9 99.6-57.5l81.2 28.9a32 32 0 0 0 35.1-9.5l1.8-2.1c34.8-41.1 61.5-87.4 79.6-137.7l.9-2.6c1.6-4.7 2.1-9.7 1.5-14.5z"],[e,"M688 502c0-30.3-7.7-58.9-21.2-83.8C637 363.3 578.9 326 512 326c-97.2 0-176 78.8-176 176 0 66.9 37.3 125 92.2 154.8 24.9 13.5 53.4 21.2 83.8 21.2 97.2 0 176-78.8 176-176zm-288 0c0-29.9 11.7-58 32.8-79.2C454 401.6 482.1 390 512 390c29.9 0 58 11.6 79.2 32.8A111.6 111.6 0 0 1 624 502c0 29.9-11.7 58-32.8 79.2A111.6 111.6 0 0 1 512 614c-29.9 0-58-11.7-79.2-32.8A111.6 111.6 0 0 1 400 502z"],[e,"M594.1 952.2a32.05 32.05 0 0 0 25.8-25.7l15.7-85a350 350 0 0 0 99.7-57.6l81.3 28.9a32 32 0 0 0 35.1-9.5l1.8-2.1c34.8-41.1 61.6-87.5 79.7-137.9l.9-2.6c1.7-4.6 2.2-9.4 1.7-14.1-.9-7.9-4.7-15.4-11-20.9l-65.3-55.9-.2-.1c3.1-19 4.7-38.4 4.7-57.8 0-16.9-1.2-33.9-3.6-50.5-.3-2.2-.7-4.4-1-6.6 0-.2-.1-.5-.1-.7l65.5-56c6.9-5.9 10.9-14.4 11.2-23.2.1-4-.5-8.1-1.9-12l-.9-2.6a443.74 443.74 0 0 0-79.7-137.9l-1.8-2.1a32.12 32.12 0 0 0-35.1-9.5l-81.3 28.9c-30-24.6-63.4-44-99.6-57.6h-.1l-15.7-85c-.1-.5-.2-1.1-.4-1.6a32.08 32.08 0 0 0-25.4-24.1l-2.7-.5c-52.1-9.4-106.9-9.4-159 0l-2.7.5a32.05 32.05 0 0 0-25.8 25.7l-15.8 85.4a351.86 351.86 0 0 0-99 57.4l-81.9-29.1a32 32 0 0 0-35.1 9.5l-1.8 2.1a446.02 446.02 0 0 0-79.7 137.9l-.9 2.6a32.09 32.09 0 0 0 7.9 33.9c.5.4.9.9 1.4 1.3l66.3 56.6v.1c-3.1 18.8-4.6 37.9-4.6 57 0 19.2 1.5 38.4 4.6 57.1L99 625.5a32.03 32.03 0 0 0-9.3 35.2l.9 2.6c18.1 50.4 44.9 96.9 79.7 137.9l1.8 2.1c4.9 5.7 11.4 9.4 18.5 10.7 5.4 1 11.1.7 16.6-1.2l81.9-29.1c.1.1.3.2.4.3 29.7 24.3 62.8 43.6 98.6 57.1l15.8 85.4a32.05 32.05 0 0 0 25.8 25.7l2.7.5c26.1 4.7 52.8 7.1 79.5 7.1h.3c26.6 0 53.3-2.4 79.2-7.1l2.7-.5zm-39.8-66.5a377.5 377.5 0 0 1-85 0l-17.9-97.2-37.8-14.5c-28.5-10.8-55-26.2-78.7-45.7l-31.4-25.9-93.4 33.2c-17-22.9-31.2-47.6-42.6-73.6l75.5-64.5-6.5-40c-2.4-14.9-3.7-30.3-3.7-45.5 0-15.3 1.2-30.6 3.7-45.5l6.5-40-75.5-64.5c11.3-26.1 25.6-50.7 42.6-73.6l93.4 33.2 31.4-25.9c23.7-19.5 50.2-34.9 78.7-45.7l37.9-14.3 17.9-97.2c28.1-3.2 56.8-3.2 85 0l17.9 97 38.1 14.3c28.7 10.8 55.4 26.2 79.3 45.8l31.4 25.8 92.8-32.9c17 22.9 31.2 47.6 42.6 73.6L781.8 426l6.5 39.9c2.5 15.1 3.8 30.6 3.8 46.1s-1.3 31-3.8 46.1l-6.6 40.1 74.7 63.9a370.03 370.03 0 0 1-42.6 73.6L721 702.8l-31.4 25.8c-23.9 19.6-50.5 35-79.3 45.8l-38.1 14.3-17.9 97z"])}),t.ShopTwoTone=o("shop",l,function(e,t){return r(a,[t,"M839.5 344h-655c-.3 0-.5.2-.5.5v91.2c0 59.8 49 108.3 109.3 108.3 40.7 0 76.2-22 95.1-54.7 2.9-5.1 8.4-8.3 14.3-8.3s11.3 3.2 14.3 8.3c18.8 32.7 54.3 54.7 95 54.7 40.8 0 76.4-22.1 95.1-54.9 2.9-5 8.2-8.1 13.9-8.1h.6c5.8 0 11 3.1 13.9 8.1 18.8 32.8 54.4 54.9 95.2 54.9C791 544 840 495.5 840 435.7v-91.2c0-.3-.2-.5-.5-.5z"],[e,"M882 272.1V144c0-17.7-14.3-32-32-32H174c-17.7 0-32 14.3-32 32v128.1c-16.7 1-30 14.9-30 31.9v131.7a177 177 0 0 0 14.4 70.4c4.3 10.2 9.6 19.8 15.6 28.9v345c0 17.6 14.3 32 32 32h676c17.7 0 32-14.3 32-32V535a175 175 0 0 0 15.6-28.9c9.5-22.3 14.4-46 14.4-70.4V304c0-17-13.3-30.9-30-31.9zM214 184h596v88H214v-88zm362 656.1H448V736h128v104.1zm234.4 0H640V704c0-17.7-14.3-32-32-32H416c-17.7 0-32 14.3-32 32v136.1H214V597.9c2.9 1.4 5.9 2.8 9 4 22.3 9.4 46 14.1 70.4 14.1 24.4 0 48-4.7 70.4-14.1 13.8-5.8 26.8-13.2 38.7-22.1.2-.1.4-.1.6 0a180.4 180.4 0 0 0 38.7 22.1c22.3 9.4 46 14.1 70.4 14.1s48-4.7 70.4-14.1c13.8-5.8 26.8-13.2 38.7-22.1.2-.1.4-.1.6 0a180.4 180.4 0 0 0 38.7 22.1c22.3 9.4 46 14.1 70.4 14.1s48-4.7 70.4-14.1c3-1.3 6-2.6 9-4v242.2zM840 435.7c0 59.8-49 108.3-109.3 108.3-40.8 0-76.4-22.1-95.2-54.9-2.9-5-8.1-8.1-13.9-8.1h-.6c-5.7 0-11 3.1-13.9 8.1A109.24 109.24 0 0 1 512 544c-40.7 0-76.2-22-95-54.7-3-5.1-8.4-8.3-14.3-8.3s-11.4 3.2-14.3 8.3a109.63 109.63 0 0 1-95.1 54.7C233 544 184 495.5 184 435.7v-91.2c0-.3.2-.5.5-.5h655c.3 0 .5.2.5.5v91.2z"])}),t.SkinTwoTone=o("skin",l,function(e,t){return r(a,[t,"M512 318c-79.2 0-148.5-48.8-176.7-120H182v196h119v432h422V394h119V198H688.7c-28.2 71.2-97.5 120-176.7 120z"],[e,"M870 126H663.8c-17.4 0-32.9 11.9-37 29.3C614.3 208.1 567 246 512 246s-102.3-37.9-114.8-90.7a37.93 37.93 0 0 0-37-29.3H154a44 44 0 0 0-44 44v252a44 44 0 0 0 44 44h75v388a44 44 0 0 0 44 44h478a44 44 0 0 0 44-44V466h75a44 44 0 0 0 44-44V170a44 44 0 0 0-44-44zm-28 268H723v432H301V394H182V198h153.3c28.2 71.2 97.5 120 176.7 120s148.5-48.8 176.7-120H842v196z"])}),t.SmileTwoTone=o("smile",l,function(e,t){return r(a,[e,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"],[t,"M512 140c-205.4 0-372 166.6-372 372s166.6 372 372 372 372-166.6 372-372-166.6-372-372-372zM288 421a48.01 48.01 0 0 1 96 0 48.01 48.01 0 0 1-96 0zm224 272c-85.5 0-155.6-67.3-160-151.6a8 8 0 0 1 8-8.4h48.1c4.2 0 7.8 3.2 8.1 7.4C420 589.9 461.5 629 512 629s92.1-39.1 95.8-88.6c.3-4.2 3.9-7.4 8.1-7.4H664a8 8 0 0 1 8 8.4C667.6 625.7 597.5 693 512 693zm176-224a48.01 48.01 0 0 1 0-96 48.01 48.01 0 0 1 0 96z"],[e,"M288 421a48 48 0 1 0 96 0 48 48 0 1 0-96 0zM664 533h-48.1c-4.2 0-7.8 3.2-8.1 7.4-3.7 49.5-45.3 88.6-95.8 88.6s-92-39.1-95.8-88.6c-.3-4.2-3.9-7.4-8.1-7.4H360a8 8 0 0 0-8 8.4c4.4 84.3 74.5 151.6 160 151.6s155.6-67.3 160-151.6a8 8 0 0 0-8-8.4zM640 421a48 48 0 1 0 96 0 48 48 0 1 0-96 0z"])}),t.SlidersTwoTone=o("sliders",l,function(e,t){return r(a,[t,"M180 292h80v440h-80zm369 180h-74a3 3 0 0 0-3 3v74a3 3 0 0 0 3 3h74a3 3 0 0 0 3-3v-74a3 3 0 0 0-3-3zm215-108h80v296h-80z"],[e,"M904 296h-66v-96c0-4.4-3.6-8-8-8h-52c-4.4 0-8 3.6-8 8v96h-66c-4.4 0-8 3.6-8 8v416c0 4.4 3.6 8 8 8h66v96c0 4.4 3.6 8 8 8h52c4.4 0 8-3.6 8-8v-96h66c4.4 0 8-3.6 8-8V304c0-4.4-3.6-8-8-8zm-60 364h-80V364h80v296zM612 404h-66V232c0-4.4-3.6-8-8-8h-52c-4.4 0-8 3.6-8 8v172h-66c-4.4 0-8 3.6-8 8v200c0 4.4 3.6 8 8 8h66v172c0 4.4 3.6 8 8 8h52c4.4 0 8-3.6 8-8V620h66c4.4 0 8-3.6 8-8V412c0-4.4-3.6-8-8-8zm-60 145a3 3 0 0 1-3 3h-74a3 3 0 0 1-3-3v-74a3 3 0 0 1 3-3h74a3 3 0 0 1 3 3v74zM320 224h-66v-56c0-4.4-3.6-8-8-8h-52c-4.4 0-8 3.6-8 8v56h-66c-4.4 0-8 3.6-8 8v560c0 4.4 3.6 8 8 8h66v56c0 4.4 3.6 8 8 8h52c4.4 0 8-3.6 8-8v-56h66c4.4 0 8-3.6 8-8V232c0-4.4-3.6-8-8-8zm-60 508h-80V292h80v440z"])}),t.SnippetsTwoTone=o("snippets",l,function(e,t){return r(a,[t,"M450 510V336H232v552h432V550H490c-22.1 0-40-17.9-40-40z"],[e,"M832 112H724V72c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v40H500V72c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v40H320c-17.7 0-32 14.3-32 32v120h-96c-17.7 0-32 14.3-32 32v632c0 17.7 14.3 32 32 32h512c17.7 0 32-14.3 32-32v-96h96c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM664 888H232V336h218v174c0 22.1 17.9 40 40 40h174v338zm0-402H514V336h.2L664 485.8v.2zm128 274h-56V456L544 264H360v-80h68v32c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-32h152v32c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-32h68v576z"])}),t.SoundTwoTone=o("sound",l,function(e,t){return r(a,[t,"M275.4 424H146v176h129.4l18 11.7L586 803V221L293.3 412.3z"],[e,"M892.1 737.8l-110.3-63.7a15.9 15.9 0 0 0-21.7 5.9l-19.9 34.5c-4.4 7.6-1.8 17.4 5.8 21.8L856.3 800a15.9 15.9 0 0 0 21.7-5.9l19.9-34.5c4.4-7.6 1.7-17.4-5.8-21.8zM934 476H806c-8.8 0-16 7.2-16 16v40c0 8.8 7.2 16 16 16h128c8.8 0 16-7.2 16-16v-40c0-8.8-7.2-16-16-16zM760 344a15.9 15.9 0 0 0 21.7 5.9L892 286.2c7.6-4.4 10.2-14.2 5.8-21.8L878 230a15.9 15.9 0 0 0-21.7-5.9L746 287.8a15.99 15.99 0 0 0-5.8 21.8L760 344zM625.9 115c-5.9 0-11.9 1.6-17.4 5.3L254 352H90c-8.8 0-16 7.2-16 16v288c0 8.8 7.2 16 16 16h164l354.5 231.7c5.5 3.6 11.6 5.3 17.4 5.3 16.7 0 32.1-13.3 32.1-32.1V147.1c0-18.8-15.4-32.1-32.1-32.1zM586 803L293.4 611.7l-18-11.7H146V424h129.4l17.9-11.7L586 221v582z"])}),t.StopTwoTone=o("stop",l,function(e,t){return r(a,[e,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm288.5 682.8L277.7 224C258 240 240 258 224 277.7l522.8 522.8C682.8 852.7 601 884 512 884c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372c0 89-31.3 170.8-83.5 234.8z"],[t,"M512 140c-205.4 0-372 166.6-372 372s166.6 372 372 372c89 0 170.8-31.3 234.8-83.5L224 277.7c16-19.7 34-37.7 53.7-53.7l522.8 522.8C852.7 682.8 884 601 884 512c0-205.4-166.6-372-372-372z"])}),t.StarTwoTone=o("star",l,function(e,t){return r(a,[t,"M512.5 190.4l-94.4 191.3-211.2 30.7 152.8 149-36.1 210.3 188.9-99.3 188.9 99.2-36.1-210.3 152.8-148.9-211.2-30.7z"],[e,"M908.6 352.8l-253.9-36.9L541.2 85.8c-3.1-6.3-8.2-11.4-14.5-14.5-15.8-7.8-35-1.3-42.9 14.5L370.3 315.9l-253.9 36.9c-7 1-13.4 4.3-18.3 9.3a32.05 32.05 0 0 0 .6 45.3l183.7 179.1L239 839.4a31.95 31.95 0 0 0 46.4 33.7l227.1-119.4 227.1 119.4c6.2 3.3 13.4 4.4 20.3 3.2 17.4-3 29.1-19.5 26.1-36.9l-43.4-252.9 183.7-179.1c5-4.9 8.3-11.3 9.3-18.3 2.7-17.5-9.5-33.7-27-36.3zM665.3 561.3l36.1 210.3-188.9-99.2-188.9 99.3 36.1-210.3-152.8-149 211.2-30.7 94.4-191.3 94.4 191.3 211.2 30.7-152.8 148.9z"])}),t.SwitcherTwoTone=o("switcher",l,function(e,t){return r(a,[t,"M184 840h528V312H184v528zm116-290h296v64H300v-64z"],[e,"M880 112H264c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h576v576c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8V144c0-17.7-14.3-32-32-32z"],[e,"M752 240H144c-17.7 0-32 14.3-32 32v608c0 17.7 14.3 32 32 32h608c17.7 0 32-14.3 32-32V272c0-17.7-14.3-32-32-32zm-40 600H184V312h528v528z"],[e,"M300 550h296v64H300z"])}),t.TagTwoTone=o("tag",l,function(e,t){return r(a,[t,"M589 164.6L189.3 564.3l270.4 270.4L859.4 435 836 188l-247-23.4zM680 432c-48.5 0-88-39.5-88-88s39.5-88 88-88 88 39.5 88 88-39.5 88-88 88z"],[e,"M680 256c-48.5 0-88 39.5-88 88s39.5 88 88 88 88-39.5 88-88-39.5-88-88-88zm0 120c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z"],[e,"M938 458.8l-29.6-312.6c-1.5-16.2-14.4-29-30.6-30.6L565.2 86h-.4c-3.2 0-5.7 1-7.6 2.9L88.9 557.2a9.96 9.96 0 0 0 0 14.1l363.8 363.8a9.9 9.9 0 0 0 7.1 2.9c2.7 0 5.2-1 7.1-2.9l468.3-468.3c2-2.1 3-5 2.8-8zM459.7 834.7L189.3 564.3 589 164.6 836 188l23.4 247-399.7 399.7z"])}),t.TabletTwoTone=o("tablet",l,function(e,t){return r(a,[e,"M800 64H224c-35.3 0-64 28.7-64 64v768c0 35.3 28.7 64 64 64h576c35.3 0 64-28.7 64-64V128c0-35.3-28.7-64-64-64zm-8 824H232V136h560v752z"],[t,"M232 888h560V136H232v752zm280-144c22.1 0 40 17.9 40 40s-17.9 40-40 40-40-17.9-40-40 17.9-40 40-40z"],[e,"M472 784a40 40 0 1 0 80 0 40 40 0 1 0-80 0z"])}),t.TagsTwoTone=o("tags",l,function(e,t){return r(a,[t,"M477.5 694l311.9-311.8-19-224.6-224.6-19-311.9 311.9L477.5 694zm116-415.5a47.81 47.81 0 0 1 33.9-33.9c16.6-4.4 34.2.3 46.4 12.4a47.93 47.93 0 0 1 12.4 46.4 47.81 47.81 0 0 1-33.9 33.9c-16.6 4.4-34.2-.3-46.4-12.4a48.3 48.3 0 0 1-12.4-46.4z"],[t,"M476.6 792.6c-1.7-.2-3.4-1-4.7-2.3L137.7 456.1a8.03 8.03 0 0 1 0-11.3L515.9 66.6c1.2-1.3 2.9-2.1 4.7-2.3h-.4c-2.3-.2-4.7.6-6.3 2.3L135.7 444.8a8.03 8.03 0 0 0 0 11.3l334.2 334.2c1.8 1.9 4.3 2.6 6.7 2.3z"],[e,"M889.7 539.8l-39.6-39.5a8.03 8.03 0 0 0-11.3 0l-362 361.3-237.6-237a8.03 8.03 0 0 0-11.3 0l-39.6 39.5a8.03 8.03 0 0 0 0 11.3l243.2 242.8 39.6 39.5c3.1 3.1 8.2 3.1 11.3 0l407.3-406.6c3.1-3.1 3.1-8.2 0-11.3zM652.3 337.3a47.81 47.81 0 0 0 33.9-33.9c4.4-16.6-.3-34.2-12.4-46.4a47.93 47.93 0 0 0-46.4-12.4 47.81 47.81 0 0 0-33.9 33.9c-4.4 16.6.3 34.2 12.4 46.4a48.3 48.3 0 0 0 46.4 12.4z"],[e,"M137.7 444.8a8.03 8.03 0 0 0 0 11.3l334.2 334.2c1.3 1.3 2.9 2.1 4.7 2.3 2.4.3 4.8-.5 6.6-2.3L861.4 412c1.7-1.7 2.5-4 2.3-6.3l-25.5-301.4c-.7-7.8-6.8-13.9-14.6-14.6L522.2 64.3h-1.6c-1.8.2-3.4 1-4.7 2.3L137.7 444.8zm408.1-306.2l224.6 19 19 224.6L477.5 694 233.9 450.5l311.9-311.9z"])}),t.ToolTwoTone=o("tool",l,function(e,t){return r(a,[t,"M706.8 488.7a32.05 32.05 0 0 1-45.3 0L537 364.2a32.05 32.05 0 0 1 0-45.3l132.9-132.8a184.2 184.2 0 0 0-144 53.5c-58.1 58.1-69.3 145.3-33.6 214.6L439.5 507c-.1 0-.1-.1-.1-.1L209.3 737l79.2 79.2 274-274.1.1.1 8.8-8.8c69.3 35.7 156.5 24.5 214.6-33.6 39.2-39.1 57.3-92.1 53.6-143.9L706.8 488.7z"],[e,"M876.6 239.5c-.5-.9-1.2-1.8-2-2.5-5-5-13.1-5-18.1 0L684.2 409.3l-67.9-67.9L788.7 169c.8-.8 1.4-1.6 2-2.5 3.6-6.1 1.6-13.9-4.5-17.5-98.2-58-226.8-44.7-311.3 39.7-67 67-89.2 162-66.5 247.4l-293 293c-3 3-2.8 7.9.3 11l169.7 169.7c3.1 3.1 8.1 3.3 11 .3l292.9-292.9c85.5 22.8 180.5.7 247.6-66.4 84.4-84.5 97.7-213.1 39.7-311.3zM786 499.8c-58.1 58.1-145.3 69.3-214.6 33.6l-8.8 8.8-.1-.1-274 274.1-79.2-79.2 230.1-230.1s0 .1.1.1l52.8-52.8c-35.7-69.3-24.5-156.5 33.6-214.6a184.2 184.2 0 0 1 144-53.5L537 318.9a32.05 32.05 0 0 0 0 45.3l124.5 124.5a32.05 32.05 0 0 0 45.3 0l132.8-132.8c3.7 51.8-14.4 104.8-53.6 143.9z"])}),t.ThunderboltTwoTone=o("thunderbolt",l,function(e,t){return r(a,[t,"M695.4 164.1H470.8L281.2 491.5h157.4l-60.3 241 319.8-305.1h-211z"],[e,"M848.1 359.3H627.8L825.9 109c4.1-5.3.4-13-6.3-13H436.1c-2.8 0-5.5 1.5-6.9 4L170.1 547.5c-3.1 5.3.7 12 6.9 12h174.4L262 917.1c-1.9 7.8 7.5 13.3 13.3 7.7L853.6 373c5.2-4.9 1.7-13.7-5.5-13.7zM378.3 732.5l60.3-241H281.2l189.6-327.4h224.6L487.1 427.4h211L378.3 732.5z"])}),t.TrademarkCircleTwoTone=o("trademark-circle",l,function(e,t){return r(a,[e,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"],[t,"M512 140c-205.4 0-372 166.6-372 372s166.6 372 372 372 372-166.6 372-372-166.6-372-372-372zm170.7 584.2c-1.1.5-2.3.8-3.5.8h-62c-3.1 0-5.9-1.8-7.2-4.6l-74.6-159.2h-88.7V717c0 4.4-3.6 8-8 8H384c-4.4 0-8-3.6-8-8V307c0-4.4 3.6-8 8-8h155.6c98.8 0 144.2 59.9 144.2 131.1 0 70.2-43.6 106.4-78.4 119.2l80.8 164.2c2.1 3.9.4 8.7-3.5 10.7z"],[t,"M529.9 357h-83.4v148H528c53 0 82.8-25.6 82.8-72.4 0-50.3-32.9-75.6-80.9-75.6z"],[e,"M605.4 549.3c34.8-12.8 78.4-49 78.4-119.2 0-71.2-45.4-131.1-144.2-131.1H384c-4.4 0-8 3.6-8 8v410c0 4.4 3.6 8 8 8h54.7c4.4 0 8-3.6 8-8V561.2h88.7L610 720.4c1.3 2.8 4.1 4.6 7.2 4.6h62c1.2 0 2.4-.3 3.5-.8 3.9-2 5.6-6.8 3.5-10.7l-80.8-164.2zM528 505h-81.5V357h83.4c48 0 80.9 25.3 80.9 75.6 0 46.8-29.8 72.4-82.8 72.4z"])}),t.UnlockTwoTone=o("unlock",l,function(e,t){return r(a,[t,"M232 840h560V536H232v304zm280-226a48.01 48.01 0 0 1 28 87v53c0 4.4-3.6 8-8 8h-40c-4.4 0-8-3.6-8-8v-53a48.01 48.01 0 0 1 28-87z"],[e,"M484 701v53c0 4.4 3.6 8 8 8h40c4.4 0 8-3.6 8-8v-53a48.01 48.01 0 1 0-56 0z"],[e,"M832 464H332V240c0-30.9 25.1-56 56-56h248c30.9 0 56 25.1 56 56v68c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-68c0-70.7-57.3-128-128-128H388c-70.7 0-128 57.3-128 128v224h-68c-17.7 0-32 14.3-32 32v384c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V496c0-17.7-14.3-32-32-32zm-40 376H232V536h560v304z"])}),t.TrophyTwoTone=o("trophy",l,function(e,t){return r(a,[t,"M320 480c0 49.1 19.1 95.3 53.9 130.1 34.7 34.8 81 53.9 130.1 53.9h16c49.1 0 95.3-19.1 130.1-53.9 34.8-34.7 53.9-81 53.9-130.1V184H320v296zM184 352c0 41 26.9 75.8 64 87.6-37.1-11.9-64-46.7-64-87.6zm364 382.5C665 721.8 758.4 630.2 773.8 514 758.3 630.2 665 721.7 548 734.5zM250.2 514C265.6 630.2 359 721.8 476 734.5 359 721.7 265.7 630.2 250.2 514z"],[e,"M868 160h-92v-40c0-4.4-3.6-8-8-8H256c-4.4 0-8 3.6-8 8v40h-92a44 44 0 0 0-44 44v148c0 81.7 60 149.6 138.2 162C265.7 630.2 359 721.7 476 734.5v105.2H280c-17.7 0-32 14.3-32 32V904c0 4.4 3.6 8 8 8h512c4.4 0 8-3.6 8-8v-32.3c0-17.7-14.3-32-32-32H548V734.5C665 721.7 758.3 630.2 773.8 514 852 501.6 912 433.7 912 352V204a44 44 0 0 0-44-44zM248 439.6a91.99 91.99 0 0 1-64-87.6V232h64v207.6zM704 480c0 49.1-19.1 95.4-53.9 130.1-34.8 34.8-81 53.9-130.1 53.9h-16c-49.1 0-95.4-19.1-130.1-53.9-34.8-34.8-53.9-81-53.9-130.1V184h384v296zm136-128c0 41-26.9 75.8-64 87.6V232h64v120z"])}),t.UpCircleTwoTone=o("up-circle",l,function(e,t){return r(a,[t,"M512 140c-205.4 0-372 166.6-372 372s166.6 372 372 372 372-166.6 372-372-166.6-372-372-372zm178 479h-46.9c-10.2 0-19.9-4.9-25.9-13.2L512 460.4 406.8 605.8c-6 8.3-15.6 13.2-25.9 13.2H334c-6.5 0-10.3-7.4-6.5-12.7l178-246c3.2-4.4 9.7-4.4 12.9 0l178 246c3.9 5.3.1 12.7-6.4 12.7z"],[e,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"],[e,"M518.4 360.3a7.95 7.95 0 0 0-12.9 0l-178 246c-3.8 5.3 0 12.7 6.5 12.7h46.9c10.3 0 19.9-4.9 25.9-13.2L512 460.4l105.2 145.4c6 8.3 15.7 13.2 25.9 13.2H690c6.5 0 10.3-7.4 6.4-12.7l-178-246z"])}),t.WalletTwoTone=o("wallet",l,function(e,t){return r(a,[e,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 464H528V448h312v128zm0-192H496c-17.7 0-32 14.3-32 32v192c0 17.7 14.3 32 32 32h344v200H184V184h656v200z"],[t,"M528 576h312V448H528v128zm92-104c22.1 0 40 17.9 40 40s-17.9 40-40 40-40-17.9-40-40 17.9-40 40-40z"],[e,"M580 512a40 40 0 1 0 80 0 40 40 0 1 0-80 0z"],[t,"M184 840h656V640H496c-17.7 0-32-14.3-32-32V416c0-17.7 14.3-32 32-32h344V184H184v656z"])}),t.UpSquareTwoTone=o("up-square",l,function(e,t){return r(a,[e,"M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-40 728H184V184h656v656z"],[t,"M184 840h656V184H184v656zm143.5-228.7l178-246c3.2-4.4 9.7-4.4 12.9 0l178 246c3.9 5.3.1 12.7-6.4 12.7h-46.9c-10.2 0-19.9-4.9-25.9-13.2L512 465.4 406.8 610.8c-6 8.3-15.6 13.2-25.9 13.2H334c-6.5 0-10.3-7.4-6.5-12.7z"],[e,"M334 624h46.9c10.3 0 19.9-4.9 25.9-13.2L512 465.4l105.2 145.4c6 8.3 15.7 13.2 25.9 13.2H690c6.5 0 10.3-7.4 6.4-12.7l-178-246a7.95 7.95 0 0 0-12.9 0l-178 246c-3.8 5.3 0 12.7 6.5 12.7z"])}),t.UsbTwoTone=o("usb",l,function(e,t){return r(a,[t,"M759.9 504H264.1c-26.5 0-48.1 19.7-48.1 44v292h592V548c0-24.3-21.6-44-48.1-44z"],[e,"M456 248h-48c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zm160 0h-48c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8z"],[e,"M760 432V144c0-17.7-14.3-32-32-32H296c-17.7 0-32 14.3-32 32v288c-66.2 0-120 52.1-120 116v356c0 4.4 3.6 8 8 8h720c4.4 0 8-3.6 8-8V548c0-63.9-53.8-116-120-116zM336 184h352v248H336V184zm472 656H216V548c0-24.3 21.6-44 48.1-44h495.8c26.5 0 48.1 19.7 48.1 44v292z"])}),t.VideoCameraTwoTone=o("video-camera",l,function(e,t){return r(a,[t,"M136 792h576V232H136v560zm64-488c0-4.4 3.6-8 8-8h112c4.4 0 8 3.6 8 8v48c0 4.4-3.6 8-8 8H208c-4.4 0-8-3.6-8-8v-48z"],[e,"M912 302.3L784 376V224c0-35.3-28.7-64-64-64H128c-35.3 0-64 28.7-64 64v576c0 35.3 28.7 64 64 64h592c35.3 0 64-28.7 64-64V648l128 73.7c21.3 12.3 48-3.1 48-27.6V330c0-24.6-26.7-40-48-27.7zM712 792H136V232h576v560zm176-167l-104-59.8V458.9L888 399v226z"],[e,"M208 360h112c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8H208c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8z"])}),t.WarningTwoTone=o("warning",l,function(e,t){return r(a,[e,"M955.7 856l-416-720c-6.2-10.7-16.9-16-27.7-16s-21.6 5.3-27.7 16l-416 720C56 877.4 71.4 904 96 904h832c24.6 0 40-26.6 27.7-48zm-783.5-27.9L512 239.9l339.8 588.2H172.2z"],[t,"M172.2 828.1h679.6L512 239.9 172.2 828.1zM560 720a48.01 48.01 0 0 1-96 0 48.01 48.01 0 0 1 96 0zm-16-304v184c0 4.4-3.6 8-8 8h-48c-4.4 0-8-3.6-8-8V416c0-4.4 3.6-8 8-8h48c4.4 0 8 3.6 8 8z"],[e,"M464 720a48 48 0 1 0 96 0 48 48 0 1 0-96 0zM480 416v184c0 4.4 3.6 8 8 8h48c4.4 0 8-3.6 8-8V416c0-4.4-3.6-8-8-8h-48c-4.4 0-8 3.6-8 8z"])}),t.CopyrightTwoTone=o("copyright",l,function(e,t){return r(a,[e,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"],[t,"M512 140c-205.4 0-372 166.6-372 372s166.6 372 372 372 372-166.6 372-372-166.6-372-372-372zm5.5 533c52.9 0 88.8-31.7 93-77.8.4-4.1 3.8-7.3 8-7.3h56.8c2.6 0 4.7 2.1 4.7 4.7 0 82.6-68.7 141.4-162.7 141.4C407.4 734 344 660.8 344 539.1v-52.3C344 364.2 407.4 290 517.3 290c94.3 0 162.7 60.7 162.7 147.4 0 2.6-2.1 4.7-4.7 4.7h-56.7c-4.2 0-7.7-3.2-8-7.4-4-49.6-40-83.4-93-83.4-65.2 0-102.1 48.5-102.2 135.5v52.6c0 85.7 36.8 133.6 102.1 133.6z"],[e,"M517.6 351.3c53 0 89 33.8 93 83.4.3 4.2 3.8 7.4 8 7.4h56.7c2.6 0 4.7-2.1 4.7-4.7 0-86.7-68.4-147.4-162.7-147.4C407.4 290 344 364.2 344 486.8v52.3C344 660.8 407.4 734 517.3 734c94 0 162.7-58.8 162.7-141.4 0-2.6-2.1-4.7-4.7-4.7h-56.8c-4.2 0-7.6 3.2-8 7.3-4.2 46.1-40.1 77.8-93 77.8-65.3 0-102.1-47.9-102.1-133.6v-52.6c.1-87 37-135.5 102.2-135.5z"])}),t.CiTwoTone=o("ci",l,function(e,t){return r(a,[e,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"],[t,"M512 140c-205.4 0-372 166.6-372 372s166.6 372 372 372 372-166.6 372-372-166.6-372-372-372zm-63.5 522.8c49.3 0 82.8-29.4 87-72.4.4-4.1 3.8-7.3 8-7.3h52.7c2.4 0 4.4 2 4.4 4.4 0 77.4-64.3 132.5-152.3 132.5C345.4 720 286 651.4 286 537.4v-49C286 373.5 345.4 304 448.3 304c88.3 0 152.3 56.9 152.3 138.1 0 2.4-2 4.4-4.4 4.4h-52.6c-4.2 0-7.6-3.2-8-7.4-3.9-46.1-37.5-77.6-87-77.6-61.1 0-95.6 45.4-95.7 126.8v49.3c0 80.3 34.5 125.2 95.6 125.2zM738 704.1c0 4.4-3.6 8-8 8h-50.4c-4.4 0-8-3.6-8-8V319.9c0-4.4 3.6-8 8-8H730c4.4 0 8 3.6 8 8v384.2z"],[e,"M730 311.9h-50.4c-4.4 0-8 3.6-8 8v384.2c0 4.4 3.6 8 8 8H730c4.4 0 8-3.6 8-8V319.9c0-4.4-3.6-8-8-8zm-281.4 49.6c49.5 0 83.1 31.5 87 77.6.4 4.2 3.8 7.4 8 7.4h52.6c2.4 0 4.4-2 4.4-4.4 0-81.2-64-138.1-152.3-138.1C345.4 304 286 373.5 286 488.4v49c0 114 59.4 182.6 162.3 182.6 88 0 152.3-55.1 152.3-132.5 0-2.4-2-4.4-4.4-4.4h-52.7c-4.2 0-7.6 3.2-8 7.3-4.2 43-37.7 72.4-87 72.4-61.1 0-95.6-44.9-95.6-125.2v-49.3c.1-81.4 34.6-126.8 95.7-126.8z"])}),t.EuroTwoTone=o("euro",l,function(e,t){return r(a,[e,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"],[t,"M512 140c-205.4 0-372 166.6-372 372s166.6 372 372 372 372-166.6 372-372-166.6-372-372-372zm117.1 581.1c0 3.8-2.7 7-6.4 7.8-15.9 3.4-34.4 5.1-55.3 5.1-109.8 0-183-58.8-200.2-158H337c-4.4 0-8-3.6-8-8v-27.2c0-4.4 3.6-8 8-8h26.1v-36.9c0-4.4 0-8.7.3-12.8H337c-4.4 0-8-3.6-8-8v-27.2c0-4.4 3.6-8 8-8h31.8C388.5 345.7 460.7 290 567.4 290c20.9 0 39.4 1.9 55.3 5.4 3.7.8 6.3 4 6.3 7.8V346a8 8 0 0 1-9.6 7.8c-14.6-2.9-31.8-4.4-51.7-4.4-65.3 0-110.4 33.5-127.6 90.4h128.3c4.4 0 8 3.6 8 8V475c0 4.4-3.6 8-8 8H432.5c-.3 4.4-.3 9.1-.3 13.8v36h136.4c4.4 0 8 3.6 8 8V568c0 4.4-3.6 8-8 8H438c15.3 62 61.3 98.6 129.8 98.6 19.9 0 37.1-1.3 51.8-4.1 4.9-1 9.5 2.8 9.5 7.8v42.8z"],[e,"M619.6 670.5c-14.7 2.8-31.9 4.1-51.8 4.1-68.5 0-114.5-36.6-129.8-98.6h130.6c4.4 0 8-3.6 8-8v-27.2c0-4.4-3.6-8-8-8H432.2v-36c0-4.7 0-9.4.3-13.8h135.9c4.4 0 8-3.6 8-8v-27.2c0-4.4-3.6-8-8-8H440.1c17.2-56.9 62.3-90.4 127.6-90.4 19.9 0 37.1 1.5 51.7 4.4a8 8 0 0 0 9.6-7.8v-42.8c0-3.8-2.6-7-6.3-7.8-15.9-3.5-34.4-5.4-55.3-5.4-106.7 0-178.9 55.7-198.6 149.9H337c-4.4 0-8 3.6-8 8v27.2c0 4.4 3.6 8 8 8h26.4c-.3 4.1-.3 8.4-.3 12.8v36.9H337c-4.4 0-8 3.6-8 8V568c0 4.4 3.6 8 8 8h30.2c17.2 99.2 90.4 158 200.2 158 20.9 0 39.4-1.7 55.3-5.1 3.7-.8 6.4-4 6.4-7.8v-42.8c0-5-4.6-8.8-9.5-7.8z"])}),t.DollarTwoTone=o("dollar",l,function(e,t){return r(a,[e,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"],[t,"M426.6 410.3c0 25.4 15.7 45.1 49.5 57.3 4.7 1.9 9.4 3.4 15 5v-124c-37 4.7-64.5 25.4-64.5 61.7zm116.5 135.2c-2.9-.6-5.7-1.3-8.8-2.2V677c42.6-3.8 72-27.3 72-66.4 0-30.7-15.9-50.7-63.2-65.1z"],[t,"M512 140c-205.4 0-372 166.6-372 372s166.6 372 372 372 372-166.6 372-372-166.6-372-372-372zm22.4 589.2l.2 31.7c0 4.5-3.6 8.1-8 8.1h-28.4c-4.4 0-8-3.6-8-8v-31.4c-89-6.5-130.7-57.1-135.2-112.1-.4-4.7 3.3-8.7 8-8.7h46.2c3.9 0 7.3 2.8 7.9 6.6 5.1 31.8 29.9 55.4 74.1 61.3V534l-24.7-6.3c-52.3-12.5-102.1-45.1-102.1-112.7 0-73 55.4-112.1 126.2-119v-33c0-4.4 3.6-8 8-8h28.1c4.4 0 8 3.6 8 8v32.7c68.5 6.9 119.8 46.9 125.9 109.2a8.1 8.1 0 0 1-8 8.8h-44.9c-4 0-7.4-2.9-7.9-6.9-4-29.2-27.5-53-65.5-58.2v134.3l25.4 5.9c64.8 16 108.9 47 109 116.4 0 75.2-56 117.1-134.3 124z"],[e,"M559.7 488.8l-25.4-5.9V348.6c38 5.2 61.5 29 65.5 58.2.5 4 3.9 6.9 7.9 6.9h44.9c4.7 0 8.4-4.1 8-8.8-6.1-62.3-57.4-102.3-125.9-109.2V263c0-4.4-3.6-8-8-8h-28.1c-4.4 0-8 3.6-8 8v33c-70.8 6.9-126.2 46-126.2 119 0 67.6 49.8 100.2 102.1 112.7l24.7 6.3v142.7c-44.2-5.9-69-29.5-74.1-61.3-.6-3.8-4-6.6-7.9-6.6H363c-4.7 0-8.4 4-8 8.7 4.5 55 46.2 105.6 135.2 112.1V761c0 4.4 3.6 8 8 8h28.4c4.4 0 8-3.6 8-8.1l-.2-31.7c78.3-6.9 134.3-48.8 134.3-124-.1-69.4-44.2-100.4-109-116.4zm-68.6-16.2c-5.6-1.6-10.3-3.1-15-5-33.8-12.2-49.5-31.9-49.5-57.3 0-36.3 27.5-57 64.5-61.7v124zM534.3 677V543.3c3.1.9 5.9 1.6 8.8 2.2 47.3 14.4 63.2 34.4 63.2 65.1 0 39.1-29.4 62.6-72 66.4z"])}),t.CanlendarTwoTone=o("canlendar",l,function(e,t){return r(a,[t,"M712 304c0 4.4-3.6 8-8 8h-56c-4.4 0-8-3.6-8-8v-48H384v48c0 4.4-3.6 8-8 8h-56c-4.4 0-8-3.6-8-8v-48H184v136h656V256H712v48z"],[e,"M880 184H712v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H384v-64c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v64H144c-17.7 0-32 14.3-32 32v664c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V216c0-17.7-14.3-32-32-32zm-40 656H184V460h656v380zm0-448H184V256h128v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h256v48c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8v-48h128v136z"])}),t.GoldTwoTone=o("gold",l,function(e,t){return r(a,[e,"M435.7 558.7c-.6-3.9-4-6.7-7.9-6.7H166.2c-3.9 0-7.3 2.8-7.9 6.7l-40.2 248c-.1.4-.1.9-.1 1.3 0 4.4 3.6 8 8 8h342c.4 0 .9 0 1.3-.1 4.4-.7 7.3-4.8 6.6-9.2l-40.2-248zM196.5 748l20.7-128h159.5l20.7 128H196.5zm709.4 58.7l-40.2-248c-.6-3.9-4-6.7-7.9-6.7H596.2c-3.9 0-7.3 2.8-7.9 6.7l-40.2 248c-.1.4-.1.9-.1 1.3 0 4.4 3.6 8 8 8h342c.4 0 .9 0 1.3-.1 4.3-.7 7.3-4.8 6.6-9.2zM626.5 748l20.7-128h159.5l20.7 128H626.5zM342 472h342c.4 0 .9 0 1.3-.1 4.4-.7 7.3-4.8 6.6-9.2l-40.2-248c-.6-3.9-4-6.7-7.9-6.7H382.2c-3.9 0-7.3 2.8-7.9 6.7l-40.2 248c-.1.4-.1.9-.1 1.3 0 4.4 3.6 8 8 8zm91.2-196h159.5l20.7 128h-201l20.8-128z"],[t,"M592.7 276H433.2l-20.8 128h201zM217.2 620l-20.7 128h200.9l-20.7-128zm430 0l-20.7 128h200.9l-20.7-128z"])}),t.RedEnvelopeTwoTone=o("red-envelope",l,function(e,t){return r(a,[e,"M832 64H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V96c0-17.7-14.3-32-32-32zm-40 824H232V193.1l260.3 204.1c11.6 9.1 27.9 9.1 39.5 0L792 193.1V888zm0-751.3h-31.7L512 331.3 263.7 136.7H232v-.7h560v.7z"],[t,"M492.3 397.2L232 193.1V888h560V193.1L531.8 397.2a31.99 31.99 0 0 1-39.5 0zm99.4 60.9h47.8a8.45 8.45 0 0 1 7.4 12.4l-87.2 161h45.9c4.6 0 8.4 3.8 8.4 8.4V665c0 4.6-3.8 8.4-8.4 8.4h-63.3V702h63.3c4.6 0 8.4 3.8 8.4 8.4v25c.2 4.7-3.5 8.5-8.2 8.5h-63.3v49.9c0 4.6-3.8 8.4-8.4 8.4h-43.7c-4.6 0-8.4-3.8-8.4-8.4v-49.9h-63c-4.6 0-8.4-3.8-8.4-8.4v-25.1c0-4.6 3.8-8.4 8.4-8.4h63v-28.6h-63c-4.6 0-8.4-3.8-8.4-8.4v-25.1c0-4.6 3.8-8.4 8.4-8.4h45.4L377 470.4a8.4 8.4 0 0 1 3.4-11.4c1.3-.6 2.6-1 3.9-1h48.8c3.2 0 6.1 1.8 7.5 4.6l71.7 142 71.9-141.9a8.6 8.6 0 0 1 7.5-4.6z"],[t,"M232 136.7h31.7L512 331.3l248.3-194.6H792v-.7H232z"],[e,"M440.6 462.6a8.38 8.38 0 0 0-7.5-4.6h-48.8c-1.3 0-2.6.4-3.9 1a8.4 8.4 0 0 0-3.4 11.4l87.4 161.1H419c-4.6 0-8.4 3.8-8.4 8.4V665c0 4.6 3.8 8.4 8.4 8.4h63V702h-63c-4.6 0-8.4 3.8-8.4 8.4v25.1c0 4.6 3.8 8.4 8.4 8.4h63v49.9c0 4.6 3.8 8.4 8.4 8.4h43.7c4.6 0 8.4-3.8 8.4-8.4v-49.9h63.3c4.7 0 8.4-3.8 8.2-8.5v-25c0-4.6-3.8-8.4-8.4-8.4h-63.3v-28.6h63.3c4.6 0 8.4-3.8 8.4-8.4v-25.1c0-4.6-3.8-8.4-8.4-8.4h-45.9l87.2-161a8.45 8.45 0 0 0-7.4-12.4h-47.8c-3.1 0-6 1.8-7.5 4.6l-71.9 141.9-71.7-142z"])}),t.CompassOutline=o("compass",s,r(a,"M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372zm198.4-588.1a32 32 0 0 0-24.5.5L414.9 415 296.4 686c-3.6 8.2-3.6 17.5 0 25.7 3.4 7.8 9.7 13.9 17.7 17 3.8 1.5 7.7 2.2 11.7 2.2 4.4 0 8.7-.9 12.8-2.7l271-118.6 118.5-271a32.06 32.06 0 0 0-17.7-42.7zM576.8 534.4l26.2 26.2-42.4 42.4-26.2-26.2L380 644.4 447.5 490 422 464.4l42.4-42.4 25.5 25.5L644.4 380l-67.6 154.4zM464.4 422L422 464.4l25.5 25.6 86.9 86.8 26.2 26.2 42.4-42.4-26.2-26.2-86.8-86.9z"))},function(e,t,n){"use strict";(function(e){function r(t){e&&e.env||console.error("[@ant-design/icons-react]: "+t+".")}function o(e){return"object"==typeof e&&"string"==typeof e.name&&"string"==typeof e.theme&&("object"==typeof e.icon||"function"==typeof e.icon)}function i(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object.keys(e).reduce(function(t,n){var r=e[n];switch(n){case"class":t.className=r,delete t.class;break;default:t[n]=r}return t},{})}function a(e,t,n){return n?m.createElement(e.tag,u()({key:t},i(e.attrs),n),(e.children||[]).map(function(n,r){return a(n,t+"-"+e.tag+"-"+r)})):m.createElement(e.tag,u()({key:t},i(e.attrs)),(e.children||[]).map(function(n,r){return a(n,t+"-"+e.tag+"-"+r)}))}function c(e){return Object(v.generate)(e)[0]}function s(e,t){switch(t){case"fill":return e+"-fill";case"outline":return e+"-o";case"twotone":return e+"-twotone";default:throw new TypeError("Unknown theme type: "+t+", name: "+e)}}t.e=r,t.d=o,n.d(t,"a",function(){return y}),t.b=a,t.c=c,t.f=s;var l=n(1),u=n.n(l),p=n(2),f=n.n(p),h=n(6),d=n.n(h),v=n(290),m=(n.n(v),n(0)),y=(n.n(m),function(){function e(){f()(this,e),this.collection={}}return d()(e,[{key:"clear",value:function(){this.collection={}}},{key:"delete",value:function(e){return delete this.collection[e]}},{key:"get",value:function(e){return this.collection[e]}},{key:"has",value:function(e){return Boolean(this.collection[e])}},{key:"set",value:function(e,t){return this.collection[e]=t,this}},{key:"size",get:function(){return Object.keys(this.collection).length}}]),e}())}).call(t,n(110))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.presetPrimaryColors=t.presetPalettes=t.generate=void 0;var r=n(291),o=function(e){return e&&e.__esModule?e:{default:e}}(r),i={red:"#F5222D",volcano:"#FA541C",orange:"#FA8C16",gold:"#FAAD14",yellow:"#FADB14",lime:"#A0D911",green:"#52C41A",cyan:"#13C2C2",blue:"#1890FF",geekblue:"#2F54EB",purple:"#722ED1",magenta:"#EB2F96",grey:"#666666"},a={};Object.keys(i).forEach(function(e){a[e]=(0,o.default)(i[e])}),t.generate=o.default,t.presetPalettes=a,t.presetPrimaryColors=i},function(e,t,n){"use strict";function r(e,t,n){var r=void 0;return r=Math.round(e.h)>=60&&Math.round(e.h)<=240?n?Math.round(e.h)-l*t:Math.round(e.h)+l*t:n?Math.round(e.h)+l*t:Math.round(e.h)-l*t,r<0?r+=360:r>=360&&(r-=360),r}function o(e,t,n){if(0===e.h&&0===e.s)return e.s;var r=void 0;return r=n?Math.round(100*e.s)-u*t:t===v?Math.round(100*e.s)+u:Math.round(100*e.s)+p*t,r>100&&(r=100),n&&t===d&&r>10&&(r=10),r<6&&(r=6),r}function i(e,t,n){return n?Math.round(100*e.v)+f*t:Math.round(100*e.v)-h*t}function a(e){for(var t=[],n=(0,s.default)(e),a=d;a>0;a-=1){var c=n.toHsv(),l=(0,s.default)({h:r(c,a,!0),s:o(c,a,!0),v:i(c,a,!0)}).toHexString();t.push(l)}t.push(n.toHexString());for(var u=1;u<=v;u+=1){var p=n.toHsv(),f=(0,s.default)({h:r(p,u),s:o(p,u),v:i(p,u)}).toHexString();t.push(f)}return t}Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var c=n(292),s=function(e){return e&&e.__esModule?e:{default:e}}(c),l=2,u=16,p=5,f=5,h=15,d=5,v=4},function(e,t,n){var r;!function(o){function i(e,t){if(e=e||"",t=t||{},e instanceof i)return e;if(!(this instanceof i))return new i(e,t);var n=a(e);this._originalInput=e,this._r=n.r,this._g=n.g,this._b=n.b,this._a=n.a,this._roundA=W(100*this._a)/100,this._format=t.format||n.format,this._gradientType=t.gradientType,this._r<1&&(this._r=W(this._r)),this._g<1&&(this._g=W(this._g)),this._b<1&&(this._b=W(this._b)),this._ok=n.ok,this._tc_id=B++}function a(e){var t={r:0,g:0,b:0},n=1,r=null,o=null,i=null,a=!1,s=!1;return"string"==typeof e&&(e=R(e)),"object"==typeof e&&(I(e.r)&&I(e.g)&&I(e.b)?(t=c(e.r,e.g,e.b),a=!0,s="%"===String(e.r).substr(-1)?"prgb":"rgb"):I(e.h)&&I(e.s)&&I(e.v)?(r=L(e.s),o=L(e.v),t=p(e.h,r,o),a=!0,s="hsv"):I(e.h)&&I(e.s)&&I(e.l)&&(r=L(e.s),i=L(e.l),t=l(e.h,r,i),a=!0,s="hsl"),e.hasOwnProperty("a")&&(n=e.a)),n=O(n),{ok:a,format:e.format||s,r:U(255,q(t.r,0)),g:U(255,q(t.g,0)),b:U(255,q(t.b,0)),a:n}}function c(e,t,n){return{r:255*E(e,255),g:255*E(t,255),b:255*E(n,255)}}function s(e,t,n){e=E(e,255),t=E(t,255),n=E(n,255);var r,o,i=q(e,t,n),a=U(e,t,n),c=(i+a)/2;if(i==a)r=o=0;else{var s=i-a;switch(o=c>.5?s/(2-i-a):s/(i+a),i){case e:r=(t-n)/s+(t<n?6:0);break;case t:r=(n-e)/s+2;break;case n:r=(e-t)/s+4}r/=6}return{h:r,s:o,l:c}}function l(e,t,n){function r(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}var o,i,a;if(e=E(e,360),t=E(t,100),n=E(n,100),0===t)o=i=a=n;else{var c=n<.5?n*(1+t):n+t-n*t,s=2*n-c;o=r(s,c,e+1/3),i=r(s,c,e),a=r(s,c,e-1/3)}return{r:255*o,g:255*i,b:255*a}}function u(e,t,n){e=E(e,255),t=E(t,255),n=E(n,255);var r,o,i=q(e,t,n),a=U(e,t,n),c=i,s=i-a;if(o=0===i?0:s/i,i==a)r=0;else{switch(i){case e:r=(t-n)/s+(t<n?6:0);break;case t:r=(n-e)/s+2;break;case n:r=(e-t)/s+4}r/=6}return{h:r,s:o,v:c}}function p(e,t,n){e=6*E(e,360),t=E(t,100),n=E(n,100);var r=o.floor(e),i=e-r,a=n*(1-t),c=n*(1-i*t),s=n*(1-(1-i)*t),l=r%6;return{r:255*[n,c,a,a,s,n][l],g:255*[s,n,n,c,a,a][l],b:255*[a,a,s,n,n,c][l]}}function f(e,t,n,r){var o=[H(W(e).toString(16)),H(W(t).toString(16)),H(W(n).toString(16))];return r&&o[0].charAt(0)==o[0].charAt(1)&&o[1].charAt(0)==o[1].charAt(1)&&o[2].charAt(0)==o[2].charAt(1)?o[0].charAt(0)+o[1].charAt(0)+o[2].charAt(0):o.join("")}function h(e,t,n,r,o){var i=[H(W(e).toString(16)),H(W(t).toString(16)),H(W(n).toString(16)),H(D(r))];return o&&i[0].charAt(0)==i[0].charAt(1)&&i[1].charAt(0)==i[1].charAt(1)&&i[2].charAt(0)==i[2].charAt(1)&&i[3].charAt(0)==i[3].charAt(1)?i[0].charAt(0)+i[1].charAt(0)+i[2].charAt(0)+i[3].charAt(0):i.join("")}function d(e,t,n,r){return[H(D(r)),H(W(e).toString(16)),H(W(t).toString(16)),H(W(n).toString(16))].join("")}function v(e,t){t=0===t?0:t||10;var n=i(e).toHsl();return n.s-=t/100,n.s=T(n.s),i(n)}function m(e,t){t=0===t?0:t||10;var n=i(e).toHsl();return n.s+=t/100,n.s=T(n.s),i(n)}function y(e){return i(e).desaturate(100)}function g(e,t){t=0===t?0:t||10;var n=i(e).toHsl();return n.l+=t/100,n.l=T(n.l),i(n)}function b(e,t){t=0===t?0:t||10;var n=i(e).toRgb();return n.r=q(0,U(255,n.r-W(-t/100*255))),n.g=q(0,U(255,n.g-W(-t/100*255))),n.b=q(0,U(255,n.b-W(-t/100*255))),i(n)}function C(e,t){t=0===t?0:t||10;var n=i(e).toHsl();return n.l-=t/100,n.l=T(n.l),i(n)}function w(e,t){var n=i(e).toHsl(),r=(n.h+t)%360;return n.h=r<0?360+r:r,i(n)}function S(e){var t=i(e).toHsl();return t.h=(t.h+180)%360,i(t)}function x(e){var t=i(e).toHsl(),n=t.h;return[i(e),i({h:(n+120)%360,s:t.s,l:t.l}),i({h:(n+240)%360,s:t.s,l:t.l})]}function M(e){var t=i(e).toHsl(),n=t.h;return[i(e),i({h:(n+90)%360,s:t.s,l:t.l}),i({h:(n+180)%360,s:t.s,l:t.l}),i({h:(n+270)%360,s:t.s,l:t.l})]}function z(e){var t=i(e).toHsl(),n=t.h;return[i(e),i({h:(n+72)%360,s:t.s,l:t.l}),i({h:(n+216)%360,s:t.s,l:t.l})]}function k(e,t,n){t=t||6,n=n||30;var r=i(e).toHsl(),o=360/n,a=[i(e)];for(r.h=(r.h-(o*t>>1)+720)%360;--t;)r.h=(r.h+o)%360,a.push(i(r));return a}function _(e,t){t=t||6;for(var n=i(e).toHsv(),r=n.h,o=n.s,a=n.v,c=[],s=1/t;t--;)c.push(i({h:r,s:o,v:a})),a=(a+s)%1;return c}function O(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function E(e,t){V(e)&&(e="100%");var n=P(e);return e=U(t,q(0,parseFloat(e))),n&&(e=parseInt(e*t,10)/100),o.abs(e-t)<1e-6?1:e%t/parseFloat(t)}function T(e){return U(1,q(0,e))}function N(e){return parseInt(e,16)}function V(e){return"string"==typeof e&&-1!=e.indexOf(".")&&1===parseFloat(e)}function P(e){return"string"==typeof e&&-1!=e.indexOf("%")}function H(e){return 1==e.length?"0"+e:""+e}function L(e){return e<=1&&(e=100*e+"%"),e}function D(e){return o.round(255*parseFloat(e)).toString(16)}function A(e){return N(e)/255}function I(e){return!!$.CSS_UNIT.exec(e)}function R(e){e=e.replace(F,"").replace(K,"").toLowerCase();var t=!1;if(G[e])e=G[e],t=!0;else if("transparent"==e)return{r:0,g:0,b:0,a:0,format:"name"};var n;return(n=$.rgb.exec(e))?{r:n[1],g:n[2],b:n[3]}:(n=$.rgba.exec(e))?{r:n[1],g:n[2],b:n[3],a:n[4]}:(n=$.hsl.exec(e))?{h:n[1],s:n[2],l:n[3]}:(n=$.hsla.exec(e))?{h:n[1],s:n[2],l:n[3],a:n[4]}:(n=$.hsv.exec(e))?{h:n[1],s:n[2],v:n[3]}:(n=$.hsva.exec(e))?{h:n[1],s:n[2],v:n[3],a:n[4]}:(n=$.hex8.exec(e))?{r:N(n[1]),g:N(n[2]),b:N(n[3]),a:A(n[4]),format:t?"name":"hex8"}:(n=$.hex6.exec(e))?{r:N(n[1]),g:N(n[2]),b:N(n[3]),format:t?"name":"hex"}:(n=$.hex4.exec(e))?{r:N(n[1]+""+n[1]),g:N(n[2]+""+n[2]),b:N(n[3]+""+n[3]),a:A(n[4]+""+n[4]),format:t?"name":"hex8"}:!!(n=$.hex3.exec(e))&&{r:N(n[1]+""+n[1]),g:N(n[2]+""+n[2]),b:N(n[3]+""+n[3]),format:t?"name":"hex"}}function j(e){var t,n;return e=e||{level:"AA",size:"small"},t=(e.level||"AA").toUpperCase(),n=(e.size||"small").toLowerCase(),"AA"!==t&&"AAA"!==t&&(t="AA"),"small"!==n&&"large"!==n&&(n="small"),{level:t,size:n}}var F=/^\s+/,K=/\s+$/,B=0,W=o.round,U=o.min,q=o.max,Y=o.random;i.prototype={isDark:function(){return this.getBrightness()<128},isLight:function(){return!this.isDark()},isValid:function(){return this._ok},getOriginalInput:function(){return this._originalInput},getFormat:function(){return this._format},getAlpha:function(){return this._a},getBrightness:function(){var e=this.toRgb();return(299*e.r+587*e.g+114*e.b)/1e3},getLuminance:function(){var e,t,n,r,i,a,c=this.toRgb();return e=c.r/255,t=c.g/255,n=c.b/255,r=e<=.03928?e/12.92:o.pow((e+.055)/1.055,2.4),i=t<=.03928?t/12.92:o.pow((t+.055)/1.055,2.4),a=n<=.03928?n/12.92:o.pow((n+.055)/1.055,2.4),.2126*r+.7152*i+.0722*a},setAlpha:function(e){return this._a=O(e),this._roundA=W(100*this._a)/100,this},toHsv:function(){var e=u(this._r,this._g,this._b);return{h:360*e.h,s:e.s,v:e.v,a:this._a}},toHsvString:function(){var e=u(this._r,this._g,this._b),t=W(360*e.h),n=W(100*e.s),r=W(100*e.v);return 1==this._a?"hsv("+t+", "+n+"%, "+r+"%)":"hsva("+t+", "+n+"%, "+r+"%, "+this._roundA+")"},toHsl:function(){var e=s(this._r,this._g,this._b);return{h:360*e.h,s:e.s,l:e.l,a:this._a}},toHslString:function(){var e=s(this._r,this._g,this._b),t=W(360*e.h),n=W(100*e.s),r=W(100*e.l);return 1==this._a?"hsl("+t+", "+n+"%, "+r+"%)":"hsla("+t+", "+n+"%, "+r+"%, "+this._roundA+")"},toHex:function(e){return f(this._r,this._g,this._b,e)},toHexString:function(e){return"#"+this.toHex(e)},toHex8:function(e){return h(this._r,this._g,this._b,this._a,e)},toHex8String:function(e){return"#"+this.toHex8(e)},toRgb:function(){return{r:W(this._r),g:W(this._g),b:W(this._b),a:this._a}},toRgbString:function(){return 1==this._a?"rgb("+W(this._r)+", "+W(this._g)+", "+W(this._b)+")":"rgba("+W(this._r)+", "+W(this._g)+", "+W(this._b)+", "+this._roundA+")"},toPercentageRgb:function(){return{r:W(100*E(this._r,255))+"%",g:W(100*E(this._g,255))+"%",b:W(100*E(this._b,255))+"%",a:this._a}},toPercentageRgbString:function(){return 1==this._a?"rgb("+W(100*E(this._r,255))+"%, "+W(100*E(this._g,255))+"%, "+W(100*E(this._b,255))+"%)":"rgba("+W(100*E(this._r,255))+"%, "+W(100*E(this._g,255))+"%, "+W(100*E(this._b,255))+"%, "+this._roundA+")"},toName:function(){return 0===this._a?"transparent":!(this._a<1)&&(X[f(this._r,this._g,this._b,!0)]||!1)},toFilter:function(e){var t="#"+d(this._r,this._g,this._b,this._a),n=t,r=this._gradientType?"GradientType = 1, ":"";if(e){var o=i(e);n="#"+d(o._r,o._g,o._b,o._a)}return"progid:DXImageTransform.Microsoft.gradient("+r+"startColorstr="+t+",endColorstr="+n+")"},toString:function(e){var t=!!e;e=e||this._format;var n=!1,r=this._a<1&&this._a>=0;return t||!r||"hex"!==e&&"hex6"!==e&&"hex3"!==e&&"hex4"!==e&&"hex8"!==e&&"name"!==e?("rgb"===e&&(n=this.toRgbString()),"prgb"===e&&(n=this.toPercentageRgbString()),"hex"!==e&&"hex6"!==e||(n=this.toHexString()),"hex3"===e&&(n=this.toHexString(!0)),"hex4"===e&&(n=this.toHex8String(!0)),"hex8"===e&&(n=this.toHex8String()),"name"===e&&(n=this.toName()),"hsl"===e&&(n=this.toHslString()),"hsv"===e&&(n=this.toHsvString()),n||this.toHexString()):"name"===e&&0===this._a?this.toName():this.toRgbString()},clone:function(){return i(this.toString())},_applyModification:function(e,t){var n=e.apply(null,[this].concat([].slice.call(t)));return this._r=n._r,this._g=n._g,this._b=n._b,this.setAlpha(n._a),this},lighten:function(){return this._applyModification(g,arguments)},brighten:function(){return this._applyModification(b,arguments)},darken:function(){return this._applyModification(C,arguments)},desaturate:function(){return this._applyModification(v,arguments)},saturate:function(){return this._applyModification(m,arguments)},greyscale:function(){return this._applyModification(y,arguments)},spin:function(){return this._applyModification(w,arguments)},_applyCombination:function(e,t){return e.apply(null,[this].concat([].slice.call(t)))},analogous:function(){return this._applyCombination(k,arguments)},complement:function(){return this._applyCombination(S,arguments)},monochromatic:function(){return this._applyCombination(_,arguments)},splitcomplement:function(){return this._applyCombination(z,arguments)},triad:function(){return this._applyCombination(x,arguments)},tetrad:function(){return this._applyCombination(M,arguments)}},i.fromRatio=function(e,t){if("object"==typeof e){var n={};for(var r in e)e.hasOwnProperty(r)&&(n[r]="a"===r?e[r]:L(e[r]));e=n}return i(e,t)},i.equals=function(e,t){return!(!e||!t)&&i(e).toRgbString()==i(t).toRgbString()},i.random=function(){return i.fromRatio({r:Y(),g:Y(),b:Y()})},i.mix=function(e,t,n){n=0===n?0:n||50;var r=i(e).toRgb(),o=i(t).toRgb(),a=n/100;return i({r:(o.r-r.r)*a+r.r,g:(o.g-r.g)*a+r.g,b:(o.b-r.b)*a+r.b,a:(o.a-r.a)*a+r.a})},i.readability=function(e,t){var n=i(e),r=i(t);return(o.max(n.getLuminance(),r.getLuminance())+.05)/(o.min(n.getLuminance(),r.getLuminance())+.05)},i.isReadable=function(e,t,n){var r,o,a=i.readability(e,t);switch(o=!1,r=j(n),r.level+r.size){case"AAsmall":case"AAAlarge":o=a>=4.5;break;case"AAlarge":o=a>=3;break;case"AAAsmall":o=a>=7}return o},i.mostReadable=function(e,t,n){var r,o,a,c,s=null,l=0;n=n||{},o=n.includeFallbackColors,a=n.level,c=n.size;for(var u=0;u<t.length;u++)(r=i.readability(e,t[u]))>l&&(l=r,s=i(t[u]));return i.isReadable(e,s,{level:a,size:c})||!o?s:(n.includeFallbackColors=!1,i.mostReadable(e,["#fff","#000"],n))};var G=i.names={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},X=i.hexNames=function(e){var t={};for(var n in e)e.hasOwnProperty(n)&&(t[e[n]]=n);return t}(G),$=function(){var e="(?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?)",t="[\\s|\\(]+("+e+")[,|\\s]+("+e+")[,|\\s]+("+e+")\\s*\\)?",n="[\\s|\\(]+("+e+")[,|\\s]+("+e+")[,|\\s]+("+e+")[,|\\s]+("+e+")\\s*\\)?";return{CSS_UNIT:new RegExp(e),rgb:new RegExp("rgb"+t),rgba:new RegExp("rgba"+n),hsl:new RegExp("hsl"+t),hsla:new RegExp("hsla"+n),hsv:new RegExp("hsv"+t),hsva:new RegExp("hsva"+n),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/}}();void 0!==e&&e.exports?e.exports=i:void 0!==(r=function(){return i}.call(t,n,t,e))&&(e.exports=r)}(Math)},function(e,t,n){e.exports={default:n(294),__esModule:!0}},function(e,t,n){n(106),n(75),e.exports=n(295)},function(e,t,n){var r=n(159),o=n(27)("iterator"),i=n(55);e.exports=n(19).isIterable=function(e){var t=Object(e);return void 0!==t[o]||"@@iterator"in t||i.hasOwnProperty(r(t))}},function(e,t,n){e.exports={default:n(297),__esModule:!0}},function(e,t,n){n(106),n(75),e.exports=n(298)},function(e,t,n){var r=n(44),o=n(158);e.exports=n(19).getIterator=function(e){var t=o(e);if("function"!=typeof t)throw TypeError(e+" is not iterable!");return r(t.call(e))}},function(e,t,n){"use strict";function r(e){return e}function o(e,t,n){function o(e,t){var n=g.hasOwnProperty(t)?g[t]:null;x.hasOwnProperty(t)&&c("OVERRIDE_BASE"===n,"ReactClassInterface: You are attempting to override `%s` from your class specification. Ensure that your method names do not overlap with React methods.",t),e&&c("DEFINE_MANY"===n||"DEFINE_MANY_MERGED"===n,"ReactClassInterface: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.",t)}function l(e,n){if(n){c("function"!=typeof n,"ReactClass: You're attempting to use a component class or function as a mixin. Instead, just use a regular object."),c(!t(n),"ReactClass: You're attempting to use a component as a mixin. Instead, just use a regular object.");var r=e.prototype,i=r.__reactAutoBindPairs;n.hasOwnProperty(s)&&C.mixins(e,n.mixins);for(var a in n)if(n.hasOwnProperty(a)&&a!==s){var l=n[a],u=r.hasOwnProperty(a);if(o(u,a),C.hasOwnProperty(a))C[a](e,l);else{var p=g.hasOwnProperty(a),d="function"==typeof l,v=d&&!p&&!u&&!1!==n.autobind;if(v)i.push(a,l),r[a]=l;else if(u){var m=g[a];c(p&&("DEFINE_MANY_MERGED"===m||"DEFINE_MANY"===m),"ReactClass: Unexpected spec policy %s for key %s when mixing in component specs.",m,a),"DEFINE_MANY_MERGED"===m?r[a]=f(r[a],l):"DEFINE_MANY"===m&&(r[a]=h(r[a],l))}else r[a]=l}}}else;}function u(e,t){if(t)for(var n in t){var r=t[n];if(t.hasOwnProperty(n)){var o=n in C;c(!o,'ReactClass: You are attempting to define a reserved property, `%s`, that shouldn\'t be on the "statics" key. Define it as an instance property instead; it will still be accessible on the constructor.',n);var i=n in e;if(i){var a=b.hasOwnProperty(n)?b[n]:null;return c("DEFINE_MANY_MERGED"===a,"ReactClass: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.",n),void(e[n]=f(e[n],r))}e[n]=r}}}function p(e,t){c(e&&t&&"object"==typeof e&&"object"==typeof t,"mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.");for(var n in t)t.hasOwnProperty(n)&&(c(void 0===e[n],"mergeIntoWithNoDuplicateKeys(): Tried to merge two objects with the same key: `%s`. This conflict may be due to a mixin; in particular, this may be caused by two getInitialState() or getDefaultProps() methods returning objects with clashing keys.",n),e[n]=t[n]);return e}function f(e,t){return function(){var n=e.apply(this,arguments),r=t.apply(this,arguments);if(null==n)return r;if(null==r)return n;var o={};return p(o,n),p(o,r),o}}function h(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}function d(e,t){var n=t.bind(e);return n}function v(e){for(var t=e.__reactAutoBindPairs,n=0;n<t.length;n+=2){var r=t[n],o=t[n+1];e[r]=d(e,o)}}function m(e){var t=r(function(e,r,o){this.__reactAutoBindPairs.length&&v(this),this.props=e,this.context=r,this.refs=a,this.updater=o||n,this.state=null;var i=this.getInitialState?this.getInitialState():null;c("object"==typeof i&&!Array.isArray(i),"%s.getInitialState(): must return an object or null",t.displayName||"ReactCompositeComponent"),this.state=i});t.prototype=new M,t.prototype.constructor=t,t.prototype.__reactAutoBindPairs=[],y.forEach(l.bind(null,t)),l(t,w),l(t,e),l(t,S),t.getDefaultProps&&(t.defaultProps=t.getDefaultProps()),c(t.prototype.render,"createClass(...): Class specification must implement a `render` method.");for(var o in g)t.prototype[o]||(t.prototype[o]=null);return t}var y=[],g={mixins:"DEFINE_MANY",statics:"DEFINE_MANY",propTypes:"DEFINE_MANY",contextTypes:"DEFINE_MANY",childContextTypes:"DEFINE_MANY",getDefaultProps:"DEFINE_MANY_MERGED",getInitialState:"DEFINE_MANY_MERGED",getChildContext:"DEFINE_MANY_MERGED",render:"DEFINE_ONCE",componentWillMount:"DEFINE_MANY",componentDidMount:"DEFINE_MANY",componentWillReceiveProps:"DEFINE_MANY",shouldComponentUpdate:"DEFINE_ONCE",componentWillUpdate:"DEFINE_MANY",componentDidUpdate:"DEFINE_MANY",componentWillUnmount:"DEFINE_MANY",UNSAFE_componentWillMount:"DEFINE_MANY",UNSAFE_componentWillReceiveProps:"DEFINE_MANY",UNSAFE_componentWillUpdate:"DEFINE_MANY",updateComponent:"OVERRIDE_BASE"},b={getDerivedStateFromProps:"DEFINE_MANY_MERGED"},C={displayName:function(e,t){e.displayName=t},mixins:function(e,t){if(t)for(var n=0;n<t.length;n++)l(e,t[n])},childContextTypes:function(e,t){e.childContextTypes=i({},e.childContextTypes,t)},contextTypes:function(e,t){e.contextTypes=i({},e.contextTypes,t)},getDefaultProps:function(e,t){e.getDefaultProps?e.getDefaultProps=f(e.getDefaultProps,t):e.getDefaultProps=t},propTypes:function(e,t){e.propTypes=i({},e.propTypes,t)},statics:function(e,t){u(e,t)},autobind:function(){}},w={componentDidMount:function(){this.__isMounted=!0}},S={componentWillUnmount:function(){this.__isMounted=!1}},x={replaceState:function(e,t){this.updater.enqueueReplaceState(this,e,t)},isMounted:function(){return!!this.__isMounted}},M=function(){};return i(M.prototype,e.prototype,x),m}var i=n(20),a=n(300),c=n(10),s="mixins";e.exports=o},function(e,t,n){"use strict";var r={};e.exports=r},function(e,t,n){"use strict";var r=n(302);e.exports=function(e,t,n,o){var i=n?n.call(o,e,t):void 0;if(void 0!==i)return!!i;if(e===t)return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var a=r(e),c=r(t),s=a.length;if(s!==c.length)return!1;o=o||null;for(var l=Object.prototype.hasOwnProperty.bind(t),u=0;u<s;u++){var p=a[u];if(!l(p))return!1;var f=e[p],h=t[p],d=n?n.call(o,f,h,p):void 0;if(!1===d||void 0===d&&f!==h)return!1}return!0}},function(e,t,n){function r(e){return null!=e&&i(y(e))}function o(e,t){return e="number"==typeof e||f.test(e)?+e:-1,t=null==t?m:t,e>-1&&e%1==0&&e<t}function i(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=m}function a(e){for(var t=s(e),n=t.length,r=n&&e.length,a=!!r&&i(r)&&(p(e)||u(e)),c=-1,l=[];++c<n;){var f=t[c];(a&&o(f,r)||d.call(e,f))&&l.push(f)}return l}function c(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function s(e){if(null==e)return[];c(e)||(e=Object(e));var t=e.length;t=t&&i(t)&&(p(e)||u(e))&&t||0;for(var n=e.constructor,r=-1,a="function"==typeof n&&n.prototype===e,s=Array(t),l=t>0;++r<t;)s[r]=r+"";for(var f in e)l&&o(f,t)||"constructor"==f&&(a||!d.call(e,f))||s.push(f);return s}var l=n(303),u=n(304),p=n(305),f=/^\d+$/,h=Object.prototype,d=h.hasOwnProperty,v=l(Object,"keys"),m=9007199254740991,y=function(e){return function(t){return null==t?void 0:t[e]}}("length"),g=v?function(e){var t=null==e?void 0:e.constructor;return"function"==typeof t&&t.prototype===e||"function"!=typeof e&&r(e)?a(e):c(e)?v(e):[]}:a;e.exports=g},function(e,t){function n(e){return!!e&&"object"==typeof e}function r(e,t){var n=null==e?void 0:e[t];return a(n)?n:void 0}function o(e){return i(e)&&f.call(e)==c}function i(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function a(e){return null!=e&&(o(e)?h.test(u.call(e)):n(e)&&s.test(e))}var c="[object Function]",s=/^\[object .+?Constructor\]$/,l=Object.prototype,u=Function.prototype.toString,p=l.hasOwnProperty,f=l.toString,h=RegExp("^"+u.call(p).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");e.exports=r},function(e,t){function n(e){return o(e)&&d.call(e,"callee")&&(!m.call(e,"callee")||v.call(e)==u)}function r(e){return null!=e&&a(e.length)&&!i(e)}function o(e){return s(e)&&r(e)}function i(e){var t=c(e)?v.call(e):"";return t==p||t==f}function a(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=l}function c(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function s(e){return!!e&&"object"==typeof e}var l=9007199254740991,u="[object Arguments]",p="[object Function]",f="[object GeneratorFunction]",h=Object.prototype,d=h.hasOwnProperty,v=h.toString,m=h.propertyIsEnumerable;e.exports=n},function(e,t){function n(e){return!!e&&"object"==typeof e}function r(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=v}function o(e){return i(e)&&f.call(e)==c}function i(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function a(e){return null!=e&&(o(e)?h.test(u.call(e)):n(e)&&s.test(e))}var c="[object Function]",s=/^\[object .+?Constructor\]$/,l=Object.prototype,u=Function.prototype.toString,p=l.hasOwnProperty,f=l.toString,h=RegExp("^"+u.call(p).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),d=function(e,t){var n=null==e?void 0:e[t];return a(n)?n:void 0}(Array,"isArray"),v=9007199254740991,m=d||function(e){return n(e)&&r(e.length)&&"[object Array]"==f.call(e)};e.exports=m},function(e,t,n){"use strict";function r(e){var t=null,n=!1;return d.Children.forEach(e,function(e){e&&e.props&&e.props.checked&&(t=e.props.value,n=!0)}),n?{value:t}:void 0}var o=n(8),i=n.n(o),a=n(2),c=n.n(a),s=n(6),l=n.n(s),u=n(3),p=n.n(u),f=n(4),h=n.n(f),d=n(0),v=(n.n(d),n(5)),m=(n.n(v),n(7)),y=n.n(m),g=n(23),b=n.n(g),C=n(113),w=function(e){function t(e){c()(this,t);var n=p()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));n.onRadioChange=function(e){var t=n.state.value,r=e.target.value;"value"in n.props||n.setState({value:r});var o=n.props.onChange;o&&r!==t&&o(e)};var o=void 0;if("value"in e)o=e.value;else if("defaultValue"in e)o=e.defaultValue;else{var i=r(e.children);o=i&&i.value}return n.state={value:o},n}return h()(t,e),l()(t,[{key:"getChildContext",value:function(){return{radioGroup:{onChange:this.onRadioChange,value:this.state.value,disabled:this.props.disabled,name:this.props.name}}}},{key:"componentWillReceiveProps",value:function(e){if("value"in e)this.setState({value:e.value});else{var t=r(e.children);t&&this.setState({value:t.value})}}},{key:"shouldComponentUpdate",value:function(e,t){return!b()(this.props,e)||!b()(this.state,t)}},{key:"render",value:function(){var e=this,t=this.props,n=t.prefixCls,r=t.className,o=void 0===r?"":r,a=t.options,c=t.buttonStyle,s=n+"-group",l=y()(s,s+"-"+c,i()({},s+"-"+t.size,t.size),o),u=t.children;return a&&a.length>0&&(u=a.map(function(t,r){return"string"==typeof t?d.createElement(C.a,{key:r,prefixCls:n,disabled:e.props.disabled,value:t,onChange:e.onRadioChange,checked:e.state.value===t},t):d.createElement(C.a,{key:r,prefixCls:n,disabled:t.disabled||e.props.disabled,value:t.value,onChange:e.onRadioChange,checked:e.state.value===t.value},t.label)})),d.createElement("div",{className:l,style:t.style,onMouseEnter:t.onMouseEnter,onMouseLeave:t.onMouseLeave,id:t.id},u)}}]),t}(d.Component);t.a=w,w.defaultProps={disabled:!1,prefixCls:"ant-radio",buttonStyle:"outline"},w.childContextTypes={radioGroup:v.any}},function(e,t,n){"use strict";var r=n(1),o=n.n(r),i=n(2),a=n.n(i),c=n(6),s=n.n(c),l=n(3),u=n.n(l),p=n(4),f=n.n(p),h=n(0),d=(n.n(h),n(5)),v=(n.n(d),n(113)),m=n(78),y=function(e){function t(){return a()(this,t),u()(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return f()(t,e),s()(t,[{key:"render",value:function(){var e=o()({},this.props);return this.context.radioGroup&&(e.onChange=this.context.radioGroup.onChange,e.checked=this.props.value===this.context.radioGroup.value,e.disabled=this.props.disabled||this.context.radioGroup.disabled),h.createElement(m.a,null,h.createElement(v.a,e))}}]),t}(h.Component);t.a=y,y.defaultProps={prefixCls:"ant-radio-button"},y.contextTypes={radioGroup:d.any}},function(e,t){},function(e,t,n){var r=n(29),o=function(){return r.Date.now()};e.exports=o},function(e,t,n){function r(e){if("number"==typeof e)return e;if(i(e))return a;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(c,"");var n=l.test(e);return n||u.test(e)?p(e.slice(2),n?2:8):s.test(e)?a:+e}var o=n(28),i=n(81),a=NaN,c=/^\s+|\s+$/g,s=/^[-+]0x[0-9a-f]+$/i,l=/^0b[01]+$/i,u=/^0o[0-7]+$/i,p=parseInt;e.exports=r},function(e,t,n){function r(e){var t=a.call(e,s),n=e[s];try{e[s]=void 0;var r=!0}catch(e){}var o=c.call(e);return r&&(t?e[s]=n:delete e[s]),o}var o=n(61),i=Object.prototype,a=i.hasOwnProperty,c=i.toString,s=o?o.toStringTag:void 0;e.exports=r},function(e,t){function n(e){return o.call(e)}var r=Object.prototype,o=r.toString;e.exports=n},function(e,t,n){function r(){if(!window.matchMedia)throw new Error("matchMedia not present, legacy browsers require a polyfill");this.queries={},this.browserIsIncapable=!window.matchMedia("only all").matches}var o=n(314),i=n(170),a=i.each,c=i.isFunction,s=i.isArray;r.prototype={constructor:r,register:function(e,t,n){var r=this.queries,i=n&&this.browserIsIncapable;return r[e]||(r[e]=new o(e,i)),c(t)&&(t={match:t}),s(t)||(t=[t]),a(t,function(t){c(t)&&(t={match:t}),r[e].addHandler(t)}),this},unregister:function(e,t){var n=this.queries[e];return n&&(t?n.removeHandler(t):(n.clear(),delete this.queries[e])),this}},e.exports=r},function(e,t,n){function r(e,t){this.query=e,this.isUnconditional=t,this.handlers=[],this.mql=window.matchMedia(e);var n=this;this.listener=function(e){n.mql=e.currentTarget||e,n.assess()},this.mql.addListener(this.listener)}var o=n(315),i=n(170).each;r.prototype={constuctor:r,addHandler:function(e){var t=new o(e);this.handlers.push(t),this.matches()&&t.on()},removeHandler:function(e){var t=this.handlers;i(t,function(n,r){if(n.equals(e))return n.destroy(),!t.splice(r,1)})},matches:function(){return this.mql.matches||this.isUnconditional},clear:function(){i(this.handlers,function(e){e.destroy()}),this.mql.removeListener(this.listener),this.handlers.length=0},assess:function(){var e=this.matches()?"on":"off";i(this.handlers,function(t){t[e]()})}},e.exports=r},function(e,t){function n(e){this.options=e,!e.deferSetup&&this.setup()}n.prototype={constructor:n,setup:function(){this.options.setup&&this.options.setup(),this.initialised=!0},on:function(){!this.initialised&&this.setup(),this.options.match&&this.options.match()},off:function(){this.options.unmatch&&this.options.unmatch()},destroy:function(){this.options.destroy?this.options.destroy():this.off()},equals:function(e){return this.options===e||this.options.match===e}},e.exports=n},function(e,t,n){"use strict";t.__esModule=!0;var r=n(317),o=function(e){return e&&e.__esModule?e:{default:e}}(r);t.default=o.default},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0;var c=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=n(0),l=r(s),u=n(318),p=n(323),f=r(p),h=n(325),d=r(h),v=n(82),m=(0,v.canUseDOM)()&&n(169),y=function(e){function t(n){o(this,t);var r=i(this,e.call(this,n));return r.innerSliderRefHandler=function(e){return r.innerSlider=e},r.slickPrev=function(){return r.innerSlider.slickPrev()},r.slickNext=function(){return r.innerSlider.slickNext()},r.slickGoTo=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return r.innerSlider.slickGoTo(e,t)},r.slickPause=function(){return r.innerSlider.pause("paused")},r.slickPlay=function(){return r.innerSlider.autoPlay("play")},r.state={breakpoint:null},r._responsiveMediaHandlers=[],r}return a(t,e),t.prototype.media=function(e,t){m.register(e,t),this._responsiveMediaHandlers.push({query:e,handler:t})},t.prototype.componentWillMount=function(){var e=this;if(this.props.responsive){var t=this.props.responsive.map(function(e){return e.breakpoint});t.sort(function(e,t){return e-t}),t.forEach(function(n,r){var o=void 0;o=0===r?(0,f.default)({minWidth:0,maxWidth:n}):(0,f.default)({minWidth:t[r-1]+1,maxWidth:n}),(0,v.canUseDOM)()&&e.media(o,function(){e.setState({breakpoint:n})})});var n=(0,f.default)({minWidth:t.slice(-1)[0]});(0,v.canUseDOM)()&&this.media(n,function(){e.setState({breakpoint:null})})}},t.prototype.componentWillUnmount=function(){this._responsiveMediaHandlers.forEach(function(e){m.unregister(e.query,e.handler)})},t.prototype.render=function(){var e,t,n=this;this.state.breakpoint?(t=this.props.responsive.filter(function(e){return e.breakpoint===n.state.breakpoint}),e="unslick"===t[0].settings?"unslick":c({},d.default,this.props,t[0].settings)):e=c({},d.default,this.props),e.centerMode&&(e.slidesToScroll,e.slidesToScroll=1),e.fade&&(e.slidesToShow,e.slidesToScroll,e.slidesToShow=1,e.slidesToScroll=1);var r=l.default.Children.toArray(this.props.children);r=r.filter(function(e){return"string"==typeof e?!!e.trim():!!e}),e.variableWidth&&(e.rows>1||e.slidesPerRow>1)&&(console.warn("variableWidth is not supported in case of rows > 1 or slidesPerRow > 1"),e.variableWidth=!1);for(var o=[],i=null,a=0;a<r.length;a+=e.rows*e.slidesPerRow){for(var s=[],p=a;p<a+e.rows*e.slidesPerRow;p+=e.slidesPerRow){for(var f=[],h=p;h<p+e.slidesPerRow&&(e.variableWidth&&r[h].props.style&&(i=r[h].props.style.width),!(h>=r.length));h+=1)f.push(l.default.cloneElement(r[h],{key:100*a+10*p+h,tabIndex:-1,style:{width:100/e.slidesPerRow+"%",display:"inline-block"}}));s.push(l.default.createElement("div",{key:10*a+p},f))}e.variableWidth?o.push(l.default.createElement("div",{key:a,style:{width:i}},s)):o.push(l.default.createElement("div",{key:a},s))}if("unslick"===e){var v="regular slider "+(this.props.className||"");return l.default.createElement("div",{className:v},o)}return o.length<=e.slidesToShow&&(e.unslick=!0),l.default.createElement(u.InnerSlider,c({ref:this.innerSliderRefHandler},e),o)},t}(l.default.Component);t.default=y},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function c(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0,t.InnerSlider=void 0;var s="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},l=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},u=n(0),p=r(u),f=n(9),h=r(f),d=n(319),v=r(d),m=n(171),y=r(m),g=n(7),b=r(g),C=n(82),w=n(320),S=n(321),x=n(322),M=n(164),z=r(M);t.InnerSlider=function(e){function t(n){i(this,t);var r=a(this,e.call(this,n));return r.listRefHandler=function(e){return r.list=e},r.trackRefHandler=function(e){return r.track=e},r.adaptHeight=function(){if(r.props.adaptiveHeight&&r.list){var e=r.list.querySelector('[data-index="'+r.state.currentSlide+'"]');r.list.style.height=(0,C.getHeight)(e)+"px"}},r.componentWillMount=function(){if(r.ssrInit(),r.props.onInit&&r.props.onInit(),r.props.lazyLoad){var e=(0,C.getOnDemandLazySlides)(l({},r.props,r.state));e.length>0&&(r.setState(function(t){return{lazyLoadedList:t.lazyLoadedList.concat(e)}}),r.props.onLazyLoad&&r.props.onLazyLoad(e))}},r.componentDidMount=function(){var e=l({listRef:r.list,trackRef:r.track},r.props);r.updateState(e,!0,function(){r.adaptHeight(),r.props.autoplay&&r.autoPlay("update")}),"progressive"===r.props.lazyLoad&&(r.lazyLoadTimer=setInterval(r.progressiveLazyLoad,1e3)),r.ro=new z.default(function(){r.state.animating?(r.onWindowResized(!1),r.callbackTimers.push(setTimeout(function(){return r.onWindowResized()},r.props.speed))):r.onWindowResized()}),r.ro.observe(r.list),Array.prototype.forEach.call(document.querySelectorAll(".slick-slide"),function(e){e.onfocus=r.props.pauseOnFocus?r.onSlideFocus:null,e.onblur=r.props.pauseOnFocus?r.onSlideBlur:null}),window&&(window.addEventListener?window.addEventListener("resize",r.onWindowResized):window.attachEvent("onresize",r.onWindowResized))},r.componentWillUnmount=function(){r.animationEndCallback&&clearTimeout(r.animationEndCallback),r.lazyLoadTimer&&clearInterval(r.lazyLoadTimer),r.callbackTimers.length&&(r.callbackTimers.forEach(function(e){return clearTimeout(e)}),r.callbackTimers=[]),window.addEventListener?window.removeEventListener("resize",r.onWindowResized):window.detachEvent("onresize",r.onWindowResized),r.autoplayTimer&&clearInterval(r.autoplayTimer)},r.componentWillReceiveProps=function(e){for(var t=l({listRef:r.list,trackRef:r.track},e,r.state),n=!1,o=Object.keys(r.props),i=Array.isArray(o),a=0,o=i?o:o[Symbol.iterator]();;){var c;if(i){if(a>=o.length)break;c=o[a++]}else{if(a=o.next(),a.done)break;c=a.value}var u=c;if(!e.hasOwnProperty(u)){n=!0;break}if("object"!==s(e[u])&&"function"!=typeof e[u]&&e[u]!==r.props[u]){n=!0;break}}r.updateState(t,n,function(){r.state.currentSlide>=p.default.Children.count(e.children)&&r.changeSlide({message:"index",index:p.default.Children.count(e.children)-e.slidesToShow,currentSlide:r.state.currentSlide}),e.autoplay?r.autoPlay("update"):r.pause("paused")})},r.componentDidUpdate=function(){if(r.checkImagesLoad(),r.props.onReInit&&r.props.onReInit(),r.props.lazyLoad){var e=(0,C.getOnDemandLazySlides)(l({},r.props,r.state));e.length>0&&(r.setState(function(t){return{lazyLoadedList:t.lazyLoadedList.concat(e)}}),r.props.onLazyLoad&&r.props.onLazyLoad(e))}r.adaptHeight()},r.onWindowResized=function(e){r.debouncedResize&&r.debouncedResize.cancel(),r.debouncedResize=(0,y.default)(function(){return r.resizeWindow(e)},50),r.debouncedResize()},r.resizeWindow=function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];if(h.default.findDOMNode(r.track)){var t=l({listRef:r.list,trackRef:r.track},r.props,r.state);r.updateState(t,e,function(){r.props.autoplay?r.autoPlay("update"):r.pause("paused")}),r.setState({animating:!1}),clearTimeout(r.animationEndCallback),delete r.animationEndCallback}},r.updateState=function(e,t,n){var o=(0,C.initializedState)(e);e=l({},e,o,{slideIndex:o.currentSlide});var i=(0,C.getTrackLeft)(e);e=l({},e,{left:i});var a=(0,C.getTrackCSS)(e);(t||p.default.Children.count(r.props.children)!==p.default.Children.count(e.children))&&(o.trackStyle=a),r.setState(o,n)},r.ssrInit=function(){if(r.props.variableWidth){var e=0,t=0,n=[],o=(0,C.getPreClones)(l({},r.props,r.state,{slideCount:r.props.children.length})),i=(0,C.getPostClones)(l({},r.props,r.state,{slideCount:r.props.children.length}));r.props.children.forEach(function(t){n.push(t.props.style.width),e+=t.props.style.width});for(var a=0;a<o;a++)t+=n[n.length-1-a],e+=n[n.length-1-a];for(var c=0;c<i;c++)e+=n[c];for(var s=0;s<r.state.currentSlide;s++)t+=n[s];var u={width:e+"px",left:-t+"px"};if(r.props.centerMode){var f=n[r.state.currentSlide]+"px";u.left="calc("+u.left+" + (100% - "+f+") / 2 ) "}return void r.setState({trackStyle:u})}var h=p.default.Children.count(r.props.children),d=l({},r.props,r.state,{slideCount:h}),v=(0,C.getPreClones)(d)+(0,C.getPostClones)(d)+h,m=100/r.props.slidesToShow*v,y=100/v,g=-y*((0,C.getPreClones)(d)+r.state.currentSlide)*m/100;r.props.centerMode&&(g+=(100-y*m/100)/2);var b={width:m+"%",left:g+"%"};r.setState({slideWidth:y+"%",trackStyle:b})},r.checkImagesLoad=function(){var e=document.querySelectorAll(".slick-slide img"),t=e.length,n=0;Array.prototype.forEach.call(e,function(e){var o=function(){return++n&&n>=t&&r.onWindowResized()};if(e.onclick){var i=e.onclick;e.onclick=function(){i(),e.parentNode.focus()}}else e.onclick=function(){return e.parentNode.focus()};e.onload||(r.props.lazyLoad?e.onload=function(){r.adaptHeight(),r.callbackTimers.push(setTimeout(r.onWindowResized,r.props.speed))}:(e.onload=o,e.onerror=function(){o(),r.props.onLazyLoadError&&r.props.onLazyLoadError()}))})},r.progressiveLazyLoad=function(){for(var e=[],t=l({},r.props,r.state),n=r.state.currentSlide;n<r.state.slideCount+(0,C.getPostClones)(t);n++)if(r.state.lazyLoadedList.indexOf(n)<0){e.push(n);break}for(var o=r.state.currentSlide-1;o>=-(0,C.getPreClones)(t);o--)if(r.state.lazyLoadedList.indexOf(o)<0){e.push(o);break}e.length>0?(r.setState(function(t){return{lazyLoadedList:t.lazyLoadedList.concat(e)}}),r.props.onLazyLoad&&r.props.onLazyLoad(e)):r.lazyLoadTimer&&(clearInterval(r.lazyLoadTimer),delete r.lazyLoadTimer)},r.slideHandler=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=r.props,i=n.asNavFor,a=n.currentSlide,c=n.beforeChange,s=n.onLazyLoad,u=n.speed,p=n.afterChange,f=(0,C.slideHandler)(l({index:e},r.props,r.state,{trackRef:r.track,useCSS:r.props.useCSS&&!t})),h=f.state,d=f.nextState;if(h){c&&c(a,h.currentSlide);var v=h.lazyLoadedList.filter(function(e){return r.state.lazyLoadedList.indexOf(e)<0});s&&v.length>0&&s(v),r.setState(h,function(){i&&i.innerSlider.state.currentSlide!==a&&i.innerSlider.slideHandler(e),d&&(r.animationEndCallback=setTimeout(function(){var e=d.animating,t=o(d,["animating"]);r.setState(t,function(){r.callbackTimers.push(setTimeout(function(){return r.setState({animating:e})},10)),p&&p(h.currentSlide),delete r.animationEndCallback})},u))})}},r.changeSlide=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=l({},r.props,r.state),o=(0,C.changeSlide)(n,e);(0===o||o)&&(!0===t?r.slideHandler(o,t):r.slideHandler(o))},r.clickHandler=function(e){!1===r.clickable&&(e.stopPropagation(),e.preventDefault()),r.clickable=!0},r.keyHandler=function(e){var t=(0,C.keyHandler)(e,r.props.accessibility,r.props.rtl);""!==t&&r.changeSlide({message:t})},r.selectHandler=function(e){r.changeSlide(e)},r.disableBodyScroll=function(){var e=function(e){e=e||window.event,e.preventDefault&&e.preventDefault(),e.returnValue=!1};window.ontouchmove=e},r.enableBodyScroll=function(){window.ontouchmove=null},r.swipeStart=function(e){r.props.verticalSwiping&&r.disableBodyScroll();var t=(0,C.swipeStart)(e,r.props.swipe,r.props.draggable);""!==t&&r.setState(t)},r.swipeMove=function(e){var t=(0,C.swipeMove)(e,l({},r.props,r.state,{trackRef:r.track,listRef:r.list,slideIndex:r.state.currentSlide}));t&&(t.swiping&&(r.clickable=!1),r.setState(t))},r.swipeEnd=function(e){var t=(0,C.swipeEnd)(e,l({},r.props,r.state,{trackRef:r.track,listRef:r.list,slideIndex:r.state.currentSlide}));if(t){var n=t.triggerSlideHandler;delete t.triggerSlideHandler,r.setState(t),void 0!==n&&(r.slideHandler(n),r.props.verticalSwiping&&r.enableBodyScroll())}},r.slickPrev=function(){r.callbackTimers.push(setTimeout(function(){return r.changeSlide({message:"previous"})},0))},r.slickNext=function(){r.callbackTimers.push(setTimeout(function(){return r.changeSlide({message:"next"})},0))},r.slickGoTo=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(e=Number(e),isNaN(e))return"";r.callbackTimers.push(setTimeout(function(){return r.changeSlide({message:"index",index:e,currentSlide:r.state.currentSlide},t)},0))},r.play=function(){var e;if(r.props.rtl)e=r.state.currentSlide-r.props.slidesToScroll;else{if(!(0,C.canGoNext)(l({},r.props,r.state)))return!1;e=r.state.currentSlide+r.props.slidesToScroll}r.slideHandler(e)},r.autoPlay=function(e){r.autoplayTimer&&clearInterval(r.autoplayTimer);var t=r.state.autoplaying;if("update"===e){if("hovered"===t||"focused"===t||"paused"===t)return}else if("leave"===e){if("paused"===t||"focused"===t)return}else if("blur"===e&&("paused"===t||"hovered"===t))return;r.autoplayTimer=setInterval(r.play,r.props.autoplaySpeed+50),r.setState({autoplaying:"playing"})},r.pause=function(e){r.autoplayTimer&&(clearInterval(r.autoplayTimer),r.autoplayTimer=null);var t=r.state.autoplaying;"paused"===e?r.setState({autoplaying:"paused"}):"focused"===e?"hovered"!==t&&"playing"!==t||r.setState({autoplaying:"focused"}):"playing"===t&&r.setState({autoplaying:"hovered"})},r.onDotsOver=function(){return r.props.autoplay&&r.pause("hovered")},r.onDotsLeave=function(){return r.props.autoplay&&"hovered"===r.state.autoplaying&&r.autoPlay("leave")},r.onTrackOver=function(){return r.props.autoplay&&r.pause("hovered")},r.onTrackLeave=function(){return r.props.autoplay&&"hovered"===r.state.autoplaying&&r.autoPlay("leave")},r.onSlideFocus=function(){return r.props.autoplay&&r.pause("focused")},r.onSlideBlur=function(){return r.props.autoplay&&"focused"===r.state.autoplaying&&r.autoPlay("blur")},r.render=function(){var e=(0,b.default)("slick-slider",r.props.className,{"slick-vertical":r.props.vertical,"slick-initialized":!0}),t=l({},r.props,r.state),n=(0,C.extractObject)(t,["fade","cssEase","speed","infinite","centerMode","focusOnSelect","currentSlide","lazyLoad","lazyLoadedList","rtl","slideWidth","slideHeight","listHeight","vertical","slidesToShow","slidesToScroll","slideCount","trackStyle","variableWidth","unslick","centerPadding"]),o=r.props.pauseOnHover;n=l({},n,{onMouseEnter:o?r.onTrackOver:null,onMouseLeave:o?r.onTrackLeave:null,onMouseOver:o?r.onTrackOver:null,focusOnSelect:r.props.focusOnSelect?r.selectHandler:null});var i;if(!0===r.props.dots&&r.state.slideCount>=r.props.slidesToShow){var a=(0,C.extractObject)(t,["dotsClass","slideCount","slidesToShow","currentSlide","slidesToScroll","clickHandler","children","customPaging","infinite","appendDots"]),c=r.props.pauseOnDotsHover;a=l({},a,{clickHandler:r.changeSlide,onMouseEnter:c?r.onDotsLeave:null,onMouseOver:c?r.onDotsOver:null,onMouseLeave:c?r.onDotsLeave:null}),i=p.default.createElement(S.Dots,a)}var s,u,f=(0,C.extractObject)(t,["infinite","centerMode","currentSlide","slideCount","slidesToShow","prevArrow","nextArrow"]);f.clickHandler=r.changeSlide,r.props.arrows&&(s=p.default.createElement(x.PrevArrow,f),u=p.default.createElement(x.NextArrow,f));var h=null;r.props.vertical&&(h={height:r.state.listHeight});var d=null;!1===r.props.vertical?!0===r.props.centerMode&&(d={padding:"0px "+r.props.centerPadding}):!0===r.props.centerMode&&(d={padding:r.props.centerPadding+" 0px"});var v=l({},h,d),m=r.props.touchMove,y={className:"slick-list",style:v,onClick:r.clickHandler,onMouseDown:m?r.swipeStart:null,onMouseMove:r.state.dragging&&m?r.swipeMove:null,onMouseUp:m?r.swipeEnd:null,onMouseLeave:r.state.dragging&&m?r.swipeEnd:null,onTouchStart:m?r.swipeStart:null,onTouchMove:r.state.dragging&&m?r.swipeMove:null,onTouchEnd:m?r.swipeEnd:null,onTouchCancel:r.state.dragging&&m?r.swipeEnd:null,onKeyDown:r.props.accessibility?r.keyHandler:null},g={className:e,dir:"ltr"};return r.props.unslick&&(y={className:"slick-list"},g={className:e}),p.default.createElement("div",g,r.props.unslick?"":s,p.default.createElement("div",l({ref:r.listRefHandler},y),p.default.createElement(w.Track,l({ref:r.trackRefHandler},n),r.props.children)),r.props.unslick?"":u,r.props.unslick?"":i)},r.list=null,r.track=null,r.state=l({},v.default,{currentSlide:r.props.initialSlide,slideCount:p.default.Children.count(r.props.children)}),r.callbackTimers=[],r.clickable=!0,r.debouncedResize=null,r}return c(t,e),t}(p.default.Component)},function(e,t,n){"use strict";t.__esModule=!0;var r={animating:!1,autoplaying:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,dragging:!1,edgeDragged:!1,initialized:!1,lazyLoadedList:[],listHeight:null,listWidth:null,scrolling:!1,slideCount:null,slideHeight:null,slideWidth:null,swipeLeft:null,swiped:!1,swiping:!1,touchObject:{startX:0,startY:0,curX:0,curY:0},trackStyle:{},trackWidth:0};t.default=r},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0,t.Track=void 0;var c=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=n(0),l=r(s),u=n(7),p=r(u),f=n(82),h=function(e){var t,n,r,o,i;return i=e.rtl?e.slideCount-1-e.index:e.index,r=i<0||i>=e.slideCount,e.centerMode?(o=Math.floor(e.slidesToShow/2),n=(i-e.currentSlide)%e.slideCount==0,i>e.currentSlide-o-1&&i<=e.currentSlide+o&&(t=!0)):t=e.currentSlide<=i&&i<e.currentSlide+e.slidesToShow,{"slick-slide":!0,"slick-active":t,"slick-center":n,"slick-cloned":r,"slick-current":i===e.currentSlide}},d=function(e){var t={};return void 0!==e.variableWidth&&!1!==e.variableWidth||(t.width=e.slideWidth),e.fade&&(t.position="relative",e.vertical?t.top=-e.index*parseInt(e.slideHeight):t.left=-e.index*parseInt(e.slideWidth),t.opacity=e.currentSlide===e.index?1:0,t.transition="opacity "+e.speed+"ms "+e.cssEase+", visibility "+e.speed+"ms "+e.cssEase,t.WebkitTransition="opacity "+e.speed+"ms "+e.cssEase+", visibility "+e.speed+"ms "+e.cssEase),t},v=function(e,t){return e.key||t},m=function(e){var t,n=[],r=[],o=[],i=l.default.Children.count(e.children),a=(0,f.lazyStartIndex)(e),s=(0,f.lazyEndIndex)(e);return l.default.Children.forEach(e.children,function(u,m){var y=void 0,g={message:"children",index:m,slidesToScroll:e.slidesToScroll,currentSlide:e.currentSlide};y=!e.lazyLoad||e.lazyLoad&&e.lazyLoadedList.indexOf(m)>=0?u:l.default.createElement("div",null);var b=d(c({},e,{index:m})),C=y.props.className||"",w=h(c({},e,{index:m}));if(n.push(l.default.cloneElement(y,{key:"original"+v(y,m),"data-index":m,className:(0,p.default)(w,C),tabIndex:"-1","aria-hidden":!w["slick-active"],style:c({outline:"none"},y.props.style||{},b),onClick:function(t){y.props&&y.props.onClick&&y.props.onClick(t),e.focusOnSelect&&e.focusOnSelect(g)}})),e.infinite&&!1===e.fade){var S=i-m;S<=(0,f.getPreClones)(e)&&i!==e.slidesToShow&&(t=-S,t>=a&&(y=u),w=h(c({},e,{index:t})),r.push(l.default.cloneElement(y,{key:"precloned"+v(y,t),"data-index":t,tabIndex:"-1",className:(0,p.default)(w,C),"aria-hidden":!w["slick-active"],style:c({},y.props.style||{},b),onClick:function(t){y.props&&y.props.onClick&&y.props.onClick(t),e.focusOnSelect&&e.focusOnSelect(g)}}))),i!==e.slidesToShow&&(t=i+m,t<s&&(y=u),w=h(c({},e,{index:t})),o.push(l.default.cloneElement(y,{key:"postcloned"+v(y,t),"data-index":t,tabIndex:"-1",className:(0,p.default)(w,C),"aria-hidden":!w["slick-active"],style:c({},y.props.style||{},b),onClick:function(t){y.props&&y.props.onClick&&y.props.onClick(t),e.focusOnSelect&&e.focusOnSelect(g)}})))}}),e.rtl?r.concat(n,o).reverse():r.concat(n,o)};t.Track=function(e){function t(){return o(this,t),i(this,e.apply(this,arguments))}return a(t,e),t.prototype.render=function(){var e=m(this.props),t=this.props,n=t.onMouseEnter,r=t.onMouseOver,o=t.onMouseLeave,i={onMouseEnter:n,onMouseOver:r,onMouseLeave:o};return l.default.createElement("div",c({className:"slick-track",style:this.props.trackStyle},i),e)},t}(l.default.PureComponent)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0,t.Dots=void 0;var c=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=n(0),l=r(s),u=n(7),p=r(u),f=function(e){return e.infinite?Math.ceil(e.slideCount/e.slidesToScroll):Math.ceil((e.slideCount-e.slidesToShow)/e.slidesToScroll)+1};t.Dots=function(e){function t(){return o(this,t),i(this,e.apply(this,arguments))}return a(t,e),t.prototype.clickHandler=function(e,t){t.preventDefault(),this.props.clickHandler(e)},t.prototype.render=function(){var e=this,t=f({slideCount:this.props.slideCount,slidesToScroll:this.props.slidesToScroll,slidesToShow:this.props.slidesToShow,infinite:this.props.infinite}),n=this.props,r=n.onMouseEnter,o=n.onMouseOver,i=n.onMouseLeave,a={onMouseEnter:r,onMouseOver:o,onMouseLeave:i},s=Array.apply(null,Array(t+1).join("0").split("")).map(function(t,n){var r=n*e.props.slidesToScroll,o=n*e.props.slidesToScroll+(e.props.slidesToScroll-1),i=(0,p.default)({"slick-active":e.props.currentSlide>=r&&e.props.currentSlide<=o}),a={message:"dots",index:n,slidesToScroll:e.props.slidesToScroll,currentSlide:e.props.currentSlide},c=e.clickHandler.bind(e,a);return l.default.createElement("li",{key:n,className:i},l.default.cloneElement(e.props.customPaging(n),{onClick:c}))});return l.default.cloneElement(this.props.appendDots(s),c({className:this.props.dotsClass},a))},t}(l.default.PureComponent)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}t.__esModule=!0,t.NextArrow=t.PrevArrow=void 0;var c=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=n(0),l=r(s),u=n(7),p=r(u),f=n(82);t.PrevArrow=function(e){function t(){return o(this,t),i(this,e.apply(this,arguments))}return a(t,e),t.prototype.clickHandler=function(e,t){t&&t.preventDefault(),this.props.clickHandler(e,t)},t.prototype.render=function(){var e={"slick-arrow":!0,"slick-prev":!0},t=this.clickHandler.bind(this,{message:"previous"});!this.props.infinite&&(0===this.props.currentSlide||this.props.slideCount<=this.props.slidesToShow)&&(e["slick-disabled"]=!0,t=null);var n={key:"0","data-role":"none",className:(0,p.default)(e),style:{display:"block"},onClick:t},r={currentSlide:this.props.currentSlide,slideCount:this.props.slideCount};return this.props.prevArrow?l.default.cloneElement(this.props.prevArrow,c({},n,r)):l.default.createElement("button",c({key:"0",type:"button"},n)," ","Previous")},t}(l.default.PureComponent),t.NextArrow=function(e){function t(){return o(this,t),i(this,e.apply(this,arguments))}return a(t,e),t.prototype.clickHandler=function(e,t){t&&t.preventDefault(),this.props.clickHandler(e,t)},t.prototype.render=function(){var e={"slick-arrow":!0,"slick-next":!0},t=this.clickHandler.bind(this,{message:"next"});(0,f.canGoNext)(this.props)||(e["slick-disabled"]=!0,t=null);var n={key:"1","data-role":"none",className:(0,p.default)(e),style:{display:"block"},onClick:t},r={currentSlide:this.props.currentSlide,slideCount:this.props.slideCount};return this.props.nextArrow?l.default.cloneElement(this.props.nextArrow,c({},n,r)):l.default.createElement("button",c({key:"1",type:"button"},n)," ","Next")},t}(l.default.PureComponent)},function(e,t,n){var r=n(324),o=function(e){return/[height|width]$/.test(e)},i=function(e){var t="",n=Object.keys(e);return n.forEach(function(i,a){var c=e[i];i=r(i),o(i)&&"number"==typeof c&&(c+="px"),t+=!0===c?i:!1===c?"not "+i:"("+i+": "+c+")",a<n.length-1&&(t+=" and ")}),t},a=function(e){var t="";return"string"==typeof e?e:e instanceof Array?(e.forEach(function(n,r){t+=i(n),r<e.length-1&&(t+=", ")}),t):i(e)};e.exports=a},function(e,t){var n=function(e){return e.replace(/[A-Z]/g,function(e){return"-"+e.toLowerCase()}).toLowerCase()};e.exports=n},function(e,t,n){"use strict";t.__esModule=!0;var r=n(0),o=function(e){return e&&e.__esModule?e:{default:e}}(r),i={accessibility:!0,adaptiveHeight:!1,afterChange:null,appendDots:function(e){return o.default.createElement("ul",{style:{display:"block"}},e)},arrows:!0,autoplay:!1,autoplaySpeed:3e3,beforeChange:null,centerMode:!1,centerPadding:"50px",className:"",cssEase:"ease",customPaging:function(e){return o.default.createElement("button",null,e+1)},dots:!1,dotsClass:"slick-dots",draggable:!0,easing:"linear",edgeFriction:.35,fade:!1,focusOnSelect:!1,infinite:!0,initialSlide:0,lazyLoad:null,nextArrow:null,onEdge:null,onInit:null,onLazyLoadError:null,onReInit:null,pauseOnDotsHover:!1,pauseOnFocus:!1,pauseOnHover:!0,prevArrow:null,responsive:null,rows:1,rtl:!1,slide:"div",slidesPerRow:1,slidesToScroll:1,slidesToShow:1,speed:500,swipe:!0,swipeEvent:null,swipeToSlide:!1,touchMove:!0,touchThreshold:5,useCSS:!0,useTransform:!0,variableWidth:!1,vertical:!1,waitForAnimate:!0};t.default=i},function(e,t){e.exports=function(e,t){if(e===t)return!0;var n=e.length;if(t.length!==n)return!1;for(var r=0;r<n;r++)if(e[r]!==t[r])return!1;return!0}},function(e,t,n){!function(t,n){e.exports=n()}(0,function(){"use strict";function e(e,t,n){n=n||{},n.childrenKeyName=n.childrenKeyName||"children";var r=e||[],o=[],i=0;do{var a=r.filter(function(e){return t(e,i)})[0];if(!a)break;o.push(a),r=a[n.childrenKeyName]||[],i+=1}while(r.length>0);return o}return e})},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var o=n(0),i=r(o),a=n(329),c=r(a);t.default=i.default.createContext||c.default,e.exports=t.default},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function c(e,t){return e===t?0!==e||1/e==1/t:e!==e&&t!==t}function s(e){var t=[];return{on:function(e){t.push(e)},off:function(e){t=t.filter(function(t){return t!==e})},get:function(){return e},set:function(n,r){e=n,t.forEach(function(t){return t(e,r)})}}}function l(e){return Array.isArray(e)?e[0]:e}function u(e,t){var n,r,u="__create-react-context-"+(0,v.default)()+"__",f=function(e){function n(){var t,r,a;o(this,n);for(var c=arguments.length,l=Array(c),u=0;u<c;u++)l[u]=arguments[u];return t=r=i(this,e.call.apply(e,[this].concat(l))),r.emitter=s(r.props.value),a=t,i(r,a)}return a(n,e),n.prototype.getChildContext=function(){var e;return e={},e[u]=this.emitter,e},n.prototype.componentWillReceiveProps=function(e){if(this.props.value!==e.value){var n=this.props.value,r=e.value,o=void 0;c(n,r)?o=0:(o="function"==typeof t?t(n,r):y,0!==(o|=0)&&this.emitter.set(e.value,o))}},n.prototype.render=function(){return this.props.children},n}(p.Component);f.childContextTypes=(n={},n[u]=h.default.object.isRequired,n);var d=function(t){function n(){var e,r,a;o(this,n);for(var c=arguments.length,s=Array(c),l=0;l<c;l++)s[l]=arguments[l];return e=r=i(this,t.call.apply(t,[this].concat(s))),r.state={value:r.getValue()},r.onUpdate=function(e,t){0!=((0|r.observedBits)&t)&&r.setState({value:r.getValue()})},a=e,i(r,a)}return a(n,t),n.prototype.componentWillReceiveProps=function(e){var t=e.observedBits;this.observedBits=void 0===t||null===t?y:t},n.prototype.componentDidMount=function(){this.context[u]&&this.context[u].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=void 0===e||null===e?y:e},n.prototype.componentWillUnmount=function(){this.context[u]&&this.context[u].off(this.onUpdate)},n.prototype.getValue=function(){return this.context[u]?this.context[u].get():e},n.prototype.render=function(){return l(this.props.children)(this.state.value)},n}(p.Component);return d.contextTypes=(r={},r[u]=h.default.object,r),{Provider:f,Consumer:d}}t.__esModule=!0;var p=n(0),f=(r(p),n(5)),h=r(f),d=n(330),v=r(d),m=n(173),y=(r(m),1073741823);t.default=u,e.exports=t.default},function(e,t,n){"use strict";(function(t){var n="__global_unique_id__";e.exports=function(){return t[n]=(t[n]||0)+1}}).call(t,n(18))},function(e,t,n){function r(e,t){return null!=e&&i(e,t,o)}var o=n(332),i=n(174);e.exports=r},function(e,t){function n(e,t){return null!=e&&o.call(e,t)}var r=Object.prototype,o=r.hasOwnProperty;e.exports=n},function(e,t,n){var r=n(334),o=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,i=/\\(\\)?/g,a=r(function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(""),e.replace(o,function(e,n,r,o){t.push(r?o.replace(i,"$1"):n||e)}),t});e.exports=a},function(e,t,n){function r(e){var t=o(e,function(e){return n.size===i&&n.clear(),e}),n=t.cache;return t}var o=n(335),i=500;e.exports=r},function(e,t,n){function r(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new TypeError(i);var n=function(){var r=arguments,o=t?t.apply(this,r):r[0],i=n.cache;if(i.has(o))return i.get(o);var a=e.apply(this,r);return n.cache=i.set(o,a)||i,a};return n.cache=new(r.Cache||o),n}var o=n(117),i="Expected a function";r.Cache=o,e.exports=r},function(e,t,n){function r(){this.size=0,this.__data__={hash:new o,map:new(a||i),string:new o}}var o=n(337),i=n(85),a=n(119);e.exports=r},function(e,t,n){function r(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}var o=n(338),i=n(343),a=n(344),c=n(345),s=n(346);r.prototype.clear=o,r.prototype.delete=i,r.prototype.get=a,r.prototype.has=c,r.prototype.set=s,e.exports=r},function(e,t,n){function r(){this.__data__=o?o(null):{},this.size=0}var o=n(84);e.exports=r},function(e,t,n){function r(e){return!(!a(e)||i(e))&&(o(e)?d:l).test(c(e))}var o=n(118),i=n(340),a=n(28),c=n(175),s=/[\\^$.*+?()[\]{}|]/g,l=/^\[object .+?Constructor\]$/,u=Function.prototype,p=Object.prototype,f=u.toString,h=p.hasOwnProperty,d=RegExp("^"+f.call(h).replace(s,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");e.exports=r},function(e,t,n){function r(e){return!!i&&i in e}var o=n(341),i=function(){var e=/[^.]+$/.exec(o&&o.keys&&o.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}();e.exports=r},function(e,t,n){var r=n(29),o=r["__core-js_shared__"];e.exports=o},function(e,t){function n(e,t){return null==e?void 0:e[t]}e.exports=n},function(e,t){function n(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}e.exports=n},function(e,t,n){function r(e){var t=this.__data__;if(o){var n=t[e];return n===i?void 0:n}return c.call(t,e)?t[e]:void 0}var o=n(84),i="__lodash_hash_undefined__",a=Object.prototype,c=a.hasOwnProperty;e.exports=r},function(e,t,n){function r(e){var t=this.__data__;return o?void 0!==t[e]:a.call(t,e)}var o=n(84),i=Object.prototype,a=i.hasOwnProperty;e.exports=r},function(e,t,n){function r(e,t){var n=this.__data__;return this.size+=this.has(e)?0:1,n[e]=o&&void 0===t?i:t,this}var o=n(84),i="__lodash_hash_undefined__";e.exports=r},function(e,t){function n(){this.__data__=[],this.size=0}e.exports=n},function(e,t,n){function r(e){var t=this.__data__,n=o(t,e);return!(n<0)&&(n==t.length-1?t.pop():a.call(t,n,1),--this.size,!0)}var o=n(86),i=Array.prototype,a=i.splice;e.exports=r},function(e,t,n){function r(e){var t=this.__data__,n=o(t,e);return n<0?void 0:t[n][1]}var o=n(86);e.exports=r},function(e,t,n){function r(e){return o(this.__data__,e)>-1}var o=n(86);e.exports=r},function(e,t,n){function r(e,t){var n=this.__data__,r=o(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this}var o=n(86);e.exports=r},function(e,t,n){function r(e){var t=o(this,e).delete(e);return this.size-=t?1:0,t}var o=n(87);e.exports=r},function(e,t){function n(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e}e.exports=n},function(e,t,n){function r(e){return o(this,e).get(e)}var o=n(87);e.exports=r},function(e,t,n){function r(e){return o(this,e).has(e)}var o=n(87);e.exports=r},function(e,t,n){function r(e,t){var n=o(this,e),r=n.size;return n.set(e,t),this.size+=n.size==r?0:1,this}var o=n(87);e.exports=r},function(e,t,n){function r(e){return null==e?"":o(e)}var o=n(358);e.exports=r},function(e,t,n){function r(e){if("string"==typeof e)return e;if(a(e))return i(e,r)+"";if(c(e))return u?u.call(e):"";var t=e+"";return"0"==t&&1/e==-s?"-0":t}var o=n(61),i=n(176),a=n(33),c=n(81),s=1/0,l=o?o.prototype:void 0,u=l?l.toString:void 0;e.exports=r},function(e,t,n){function r(e){return i(e)&&o(e)==a}var o=n(48),i=n(40),a="[object Arguments]";e.exports=r},function(e,t,n){function r(e,t,n,r){if(!c(e))return e;t=i(t,e);for(var l=-1,u=t.length,p=u-1,f=e;null!=f&&++l<u;){var h=s(t[l]),d=n;if(l!=p){var v=f[h];d=r?r(v,h,f):void 0,void 0===d&&(d=c(v)?v:a(t[l+1])?[]:{})}o(f,h,d),f=f[h]}return e}var o=n(179),i=n(115),a=n(88),c=n(28),s=n(63);e.exports=r},function(e,t){function n(e,t){if(!e.length)return[];if(1===e.length)return e.slice(0);for(var n=[e[0]],r=1,o=e.length;r<o;++r)n.push(t,e[r]);return n}e.exports=n},function(e,t,n){"use strict";e.exports=function(e){return 0===e&&1/e==-1/0}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var o=n(364),i=r(o),a=n(367),c=r(a);t.default=function e(t,n,r){null===t&&(t=Function.prototype);var o=(0,c.default)(t,n);if(void 0===o){var a=(0,i.default)(t);return null===a?void 0:e(a,n,r)}if("value"in o)return o.value;var s=o.get;if(void 0!==s)return s.call(r)}},function(e,t,n){e.exports={default:n(365),__esModule:!0}},function(e,t,n){n(366),e.exports=n(19).Object.getPrototypeOf},function(e,t,n){var r=n(74),o=n(155);n(181)("getPrototypeOf",function(){return function(e){return o(r(e))}})},function(e,t,n){e.exports={default:n(368),__esModule:!0}},function(e,t,n){n(369);var r=n(19).Object;e.exports=function(e,t){return r.getOwnPropertyDescriptor(e,t)}},function(e,t,n){var r=n(47),o=n(109).f;n(181)("getOwnPropertyDescriptor",function(){return function(e,t){return o(r(e),t)}})},function(e,t,n){e.exports=n(371)},function(e,t,n){"use strict";function r(){}Object.defineProperty(t,"__esModule",{value:!0});var o=n(1),i=n.n(o),a=n(8),c=n.n(a),s=n(14),l=n.n(s),u=n(2),p=n.n(u),f=n(6),h=n.n(f),d=n(3),v=n.n(d),m=n(4),y=n.n(m),g=n(0),b=n.n(g),C=n(5),w=n.n(C),S=n(7),x=function(e){function t(e){p()(this,t);var n=v()(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));M.call(n);var r=!1;return r="checked"in e?!!e.checked:!!e.defaultChecked,n.state={checked:r},n}return y()(t,e),h()(t,[{key:"componentDidMount",value:function(){var e=this.props,t=e.autoFocus,n=e.disabled;t&&!n&&this.focus()}},{key:"componentWillReceiveProps",value:function(e){"checked"in e&&this.setState({checked:!!e.checked})}},{key:"setChecked",value:function(e){this.props.disabled||("checked"in this.props||this.setState({checked:e}),this.props.onChange(e))}},{key:"focus",value:function(){this.node.focus()}},{key:"blur",value:function(){this.node.blur()}},{key:"render",value:function(){var e,t=this.props,n=t.className,r=t.prefixCls,o=t.disabled,a=t.loadingIcon,s=t.checkedChildren,u=t.tabIndex,p=t.unCheckedChildren,f=l()(t,["className","prefixCls","disabled","loadingIcon","checkedChildren","tabIndex","unCheckedChildren"]),h=this.state.checked,d=o?-1:u||0,v=S((e={},c()(e,n,!!n),c()(e,r,!0),c()(e,r+"-checked",h),c()(e,r+"-disabled",o),e));return b.a.createElement("span",i()({},f,{className:v,tabIndex:d,ref:this.saveNode,onKeyDown:this.handleKeyDown,onClick:this.toggle,onMouseUp:this.handleMouseUp}),a,b.a.createElement("span",{className:r+"-inner"},h?s:p))}}]),t}(g.Component),M=function(){var e=this;this.toggle=function(){var t=e.props.onClick,n=!e.state.checked;e.setChecked(n),t(n)},this.handleKeyDown=function(t){37===t.keyCode?e.setChecked(!1):39===t.keyCode?e.setChecked(!0):32!==t.keyCode&&13!==t.keyCode||e.toggle()},this.handleMouseUp=function(t){e.node&&e.node.blur(),e.props.onMouseUp&&e.props.onMouseUp(t)},this.saveNode=function(t){e.node=t}};x.propTypes={className:w.a.string,prefixCls:w.a.string,disabled:w.a.bool,checkedChildren:w.a.any,unCheckedChildren:w.a.any,onChange:w.a.func,onMouseUp:w.a.func,onClick:w.a.func,tabIndex:w.a.number,checked:w.a.bool,defaultChecked:w.a.bool,autoFocus:w.a.bool,loadingIcon:w.a.node},x.defaultProps={prefixCls:"rc-switch",checkedChildren:null,unCheckedChildren:null,className:"",defaultChecked:!1,onChange:r,onClick:r},t.default=x},function(e,t,n){var r=n(373),o=n(398),i=o(function(e,t,n){r(e,t,n)});e.exports=i},function(e,t,n){function r(e,t,n,p,f){e!==t&&a(t,function(a,l){if(s(a))f||(f=new o),c(e,t,l,n,r,p,f);else{var h=p?p(u(e,l),a,l+"",e,t,f):void 0;void 0===h&&(h=a),i(e,l,h)}},l)}var o=n(124),i=n(182),a=n(379),c=n(381),s=n(28),l=n(188),u=n(187);e.exports=r},function(e,t,n){function r(){this.__data__=new o,this.size=0}var o=n(85);e.exports=r},function(e,t){function n(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n}e.exports=n},function(e,t){function n(e){return this.__data__.get(e)}e.exports=n},function(e,t){function n(e){return this.__data__.has(e)}e.exports=n},function(e,t,n){function r(e,t){var n=this.__data__;if(n instanceof o){var r=n.__data__;if(!i||r.length<c-1)return r.push([e,t]),this.size=++n.size,this;n=this.__data__=new a(r)}return n.set(e,t),this.size=n.size,this}var o=n(85),i=n(119),a=n(117),c=200;e.exports=r},function(e,t,n){var r=n(380),o=r();e.exports=o},function(e,t){function n(e){return function(t,n,r){for(var o=-1,i=Object(t),a=r(t),c=a.length;c--;){var s=a[e?c:++o];if(!1===n(i[s],s,i))break}return t}}e.exports=n},function(e,t,n){function r(e,t,n,r,b,C,w){var S=y(e,n),x=y(t,n),M=w.get(x);if(M)return void o(e,n,M);var z=C?C(S,x,n+"",e,t,w):void 0,k=void 0===z;if(k){var _=u(x),O=!_&&f(x),E=!_&&!O&&m(x);z=x,_||O||E?u(S)?z=S:p(S)?z=c(S):O?(k=!1,z=i(x,!0)):E?(k=!1,z=a(x,!0)):z=[]:v(x)||l(x)?(z=S,l(S)?z=g(S):d(S)&&!h(S)||(z=s(x))):k=!1}k&&(w.set(x,z),b(z,x,r,C,w),w.delete(x)),o(e,n,z)}var o=n(182),i=n(382),a=n(383),c=n(184),s=n(385),l=n(120),u=n(33),p=n(387),f=n(127),h=n(118),d=n(28),v=n(389),m=n(128),y=n(187),g=n(393);e.exports=r},function(e,t,n){(function(e){function r(e,t){if(t)return e.slice();var n=e.length,r=l?l(n):new e.constructor(n);return e.copy(r),r}var o=n(29),i="object"==typeof t&&t&&!t.nodeType&&t,a=i&&"object"==typeof e&&e&&!e.nodeType&&e,c=a&&a.exports===i,s=c?o.Buffer:void 0,l=s?s.allocUnsafe:void 0;e.exports=r}).call(t,n(125)(e))},function(e,t,n){function r(e,t){var n=t?o(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.length)}var o=n(384);e.exports=r},function(e,t,n){function r(e){var t=new e.constructor(e.byteLength);return new o(t).set(new o(e)),t}var o=n(183);e.exports=r},function(e,t,n){function r(e){return"function"!=typeof e.constructor||a(e)?{}:o(i(e))}var o=n(386),i=n(185),a=n(126);e.exports=r},function(e,t,n){var r=n(28),o=Object.create,i=function(){function e(){}return function(t){if(!r(t))return{};if(o)return o(t);e.prototype=t;var n=new e;return e.prototype=void 0,n}}();e.exports=i},function(e,t,n){function r(e){return i(e)&&o(e)}var o=n(64),i=n(40);e.exports=r},function(e,t){function n(){return!1}e.exports=n},function(e,t,n){function r(e){if(!a(e)||o(e)!=c)return!1;var t=i(e);if(null===t)return!0;var n=p.call(t,"constructor")&&t.constructor;return"function"==typeof n&&n instanceof n&&u.call(n)==f}var o=n(48),i=n(185),a=n(40),c="[object Object]",s=Function.prototype,l=Object.prototype,u=s.toString,p=l.hasOwnProperty,f=u.call(Object);e.exports=r},function(e,t,n){function r(e){return a(e)&&i(e.length)&&!!c[o(e)]}var o=n(48),i=n(121),a=n(40),c={};c["[object Float32Array]"]=c["[object Float64Array]"]=c["[object Int8Array]"]=c["[object Int16Array]"]=c["[object Int32Array]"]=c["[object Uint8Array]"]=c["[object Uint8ClampedArray]"]=c["[object Uint16Array]"]=c["[object Uint32Array]"]=!0,c["[object Arguments]"]=c["[object Array]"]=c["[object ArrayBuffer]"]=c["[object Boolean]"]=c["[object DataView]"]=c["[object Date]"]=c["[object Error]"]=c["[object Function]"]=c["[object Map]"]=c["[object Number]"]=c["[object Object]"]=c["[object RegExp]"]=c["[object Set]"]=c["[object String]"]=c["[object WeakMap]"]=!1,e.exports=r},function(e,t){function n(e){return function(t){return e(t)}}e.exports=n},function(e,t,n){(function(e){var r=n(168),o="object"==typeof t&&t&&!t.nodeType&&t,i=o&&"object"==typeof e&&e&&!e.nodeType&&e,a=i&&i.exports===o,c=a&&r.process,s=function(){try{var e=i&&i.require&&i.require("util").types;return e||c&&c.binding&&c.binding("util")}catch(e){}}();e.exports=s}).call(t,n(125)(e))},function(e,t,n){function r(e){return o(e,i(e))}var o=n(394),i=n(188);e.exports=r},function(e,t,n){function r(e,t,n,r){var a=!n;n||(n={});for(var c=-1,s=t.length;++c<s;){var l=t[c],u=r?r(n[l],e[l],l,n,e):void 0;void 0===u&&(u=e[l]),a?i(n,l,u):o(n,l,u)}return n}var o=n(179),i=n(123);e.exports=r},function(e,t){function n(e,t){for(var n=-1,r=Array(e);++n<e;)r[n]=t(n);return r}e.exports=n},function(e,t,n){function r(e){if(!o(e))return a(e);var t=i(e),n=[];for(var r in e)("constructor"!=r||!t&&s.call(e,r))&&n.push(r);return n}var o=n(28),i=n(126),a=n(397),c=Object.prototype,s=c.hasOwnProperty;e.exports=r},function(e,t){function n(e){var t=[];if(null!=e)for(var n in Object(e))t.push(n);return t}e.exports=n},function(e,t,n){function r(e){return o(function(t,n){var r=-1,o=n.length,a=o>1?n[o-1]:void 0,c=o>2?n[2]:void 0;for(a=e.length>3&&"function"==typeof a?(o--,a):void 0,c&&i(n[0],n[1],c)&&(a=o<3?void 0:a,o=1),t=Object(t);++r<o;){var s=n[r];s&&e(t,s,r,a)}return t})}var o=n(399),i=n(406);e.exports=r},function(e,t,n){function r(e,t){return a(i(e,t,o),e+"")}var o=n(129),i=n(400),a=n(402);e.exports=r},function(e,t,n){function r(e,t,n){return t=i(void 0===t?e.length-1:t,0),function(){for(var r=arguments,a=-1,c=i(r.length-t,0),s=Array(c);++a<c;)s[a]=r[t+a];a=-1;for(var l=Array(t+1);++a<t;)l[a]=r[a];return l[t]=n(s),o(e,this,l)}}var o=n(401),i=Math.max;e.exports=r},function(e,t){function n(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}e.exports=n},function(e,t,n){var r=n(403),o=n(405),i=o(r);e.exports=i},function(e,t,n){var r=n(404),o=n(180),i=n(129),a=o?function(e,t){return o(e,"toString",{configurable:!0,enumerable:!1,value:r(t),writable:!0})}:i;e.exports=a},function(e,t){function n(e){return function(){return e}}e.exports=n},function(e,t){function n(e){var t=0,n=0;return function(){var a=i(),c=o-(a-n);if(n=a,c>0){if(++t>=r)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}var r=800,o=16,i=Date.now;e.exports=n},function(e,t,n){function r(e,t,n){if(!c(n))return!1;var r=typeof t;return!!("number"==r?i(n)&&a(t,n.length):"string"==r&&t in n)&&o(n[t],e)}var o=n(62),i=n(64),a=n(88),c=n(28);e.exports=r},function(e,t,n){var r=n(408);e.exports=function(e,t,n){for(n=n||document,e={parentNode:e};(e=e.parentNode)&&e!==n;)if(r(e,t))return e}},function(e,t,n){"use strict";function r(e,t){var n=window.Element.prototype,r=n.matches||n.mozMatchesSelector||n.msMatchesSelector||n.oMatchesSelector||n.webkitMatchesSelector;if(!e||1!==e.nodeType)return!1;var o=e.parentNode;if(r)return r.call(e,t);for(var i=o.querySelectorAll(t),a=i.length,c=0;c<a;c++)if(i[c]===e)return!0;return!1}e.exports=r},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var c=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),s=n(0),l=r(s),u=n(5),p=r(u),f=n(9),h=n(410),d=n(171),v=r(d),m=n(411),y=r(m),g=n(412),b=r(g),C=n(413),w=r(C),S=function(e){function t(e){o(this,t);var n=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.lazyLoadHandler=n.lazyLoadHandler.bind(n),e.throttle>0&&(e.debounce?n.lazyLoadHandler=(0,v.default)(n.lazyLoadHandler,e.throttle):n.lazyLoadHandler=(0,y.default)(n.lazyLoadHandler,e.throttle)),n.state={visible:!1},n}return a(t,e),c(t,[{key:"componentDidMount",value:function(){this._mounted=!0;var e=this.getEventNode();this.lazyLoadHandler(),this.lazyLoadHandler.flush&&this.lazyLoadHandler.flush(),(0,h.add)(window,"resize",this.lazyLoadHandler),(0,h.add)(e,"scroll",this.lazyLoadHandler)}},{key:"componentWillReceiveProps",value:function(){this.state.visible||this.lazyLoadHandler()}},{key:"shouldComponentUpdate",value:function(e,t){return t.visible}},{key:"componentWillUnmount",value:function(){this._mounted=!1,this.lazyLoadHandler.cancel&&this.lazyLoadHandler.cancel(),this.detachListeners()}},{key:"getEventNode",value:function(){return(0,b.default)((0,f.findDOMNode)(this))}},{key:"getOffset",value:function(){var e=this.props,t=e.offset,n=e.offsetVertical,r=e.offsetHorizontal,o=e.offsetTop,i=e.offsetBottom,a=e.offsetLeft,c=e.offsetRight,s=e.threshold,l=s||t,u=n||l,p=r||l;return{top:o||u,bottom:i||u,left:a||p,right:c||p}}},{key:"lazyLoadHandler",value:function(){if(this._mounted){var e=this.getOffset(),t=(0,f.findDOMNode)(this),n=this.getEventNode();if((0,w.default)(t,n,e)){var r=this.props.onContentVisible;this.setState({visible:!0},function(){r&&r()}),this.detachListeners()}}}},{key:"detachListeners",value:function(){var e=this.getEventNode();(0,h.remove)(window,"resize",this.lazyLoadHandler),(0,h.remove)(e,"scroll",this.lazyLoadHandler)}},{key:"render",value:function(){var e=this.props,t=e.children,n=e.className,r=e.height,o=e.width,i=this.state.visible,a={height:r,width:o},c="LazyLoad"+(i?" is-visible":"")+(n?" "+n:"");return l.default.createElement(this.props.elementType,{className:c,style:a},i&&s.Children.only(t))}}]),t}(s.Component);t.default=S,S.propTypes={children:p.default.node.isRequired,className:p.default.string,debounce:p.default.bool,elementType:p.default.string,height:p.default.oneOfType([p.default.string,p.default.number]),offset:p.default.number,offsetBottom:p.default.number,offsetHorizontal:p.default.number,offsetLeft:p.default.number,offsetRight:p.default.number,offsetTop:p.default.number,offsetVertical:p.default.number,threshold:p.default.number,throttle:p.default.number,width:p.default.oneOfType([p.default.string,p.default.number]),onContentVisible:p.default.func},S.defaultProps={elementType:"div",debounce:!0,offset:0,offsetBottom:0,offsetHorizontal:0,offsetLeft:0,offsetRight:0,offsetTop:0,offsetVertical:0,throttle:250}},function(e,t,n){var r,o;!function(i,a){r=a,void 0!==(o="function"==typeof r?r.call(t,n,t,e):r)&&(e.exports=o)}(0,function(){function e(e,t){return function(n,r,o,i){n[e]?n[e](r,o,i):n[t]&&n[t]("on"+r,o)}}return{add:e("addEventListener","attachEvent"),remove:e("removeEventListener","detachEvent")}})},function(e,t,n){(function(t){function n(e,t,n){function r(t){var n=v,r=m;return v=m=void 0,M=t,g=e.apply(r,n)}function i(e){return M=e,b=setTimeout(u,t),z?r(e):g}function a(e){var n=e-C,r=e-M,o=t-n;return k?S(o,y-r):o}function l(e){var n=e-C,r=e-M;return void 0===C||n>=t||n<0||k&&r>=y}function u(){var e=x();if(l(e))return p(e);b=setTimeout(u,a(e))}function p(e){return b=void 0,_&&v?r(e):(v=m=void 0,g)}function f(){void 0!==b&&clearTimeout(b),M=0,v=C=m=b=void 0}function h(){return void 0===b?g:p(x())}function d(){var e=x(),n=l(e);if(v=arguments,m=this,C=e,n){if(void 0===b)return i(C);if(k)return b=setTimeout(u,t),r(C)}return void 0===b&&(b=setTimeout(u,t)),g}var v,m,y,g,b,C,M=0,z=!1,k=!1,_=!0;if("function"!=typeof e)throw new TypeError(s);return t=c(t)||0,o(n)&&(z=!!n.leading,k="maxWait"in n,y=k?w(c(n.maxWait)||0,t):y,_="trailing"in n?!!n.trailing:_),d.cancel=f,d.flush=h,d}function r(e,t,r){var i=!0,a=!0;if("function"!=typeof e)throw new TypeError(s);return o(r)&&(i="leading"in r?!!r.leading:i,a="trailing"in r?!!r.trailing:a),n(e,t,{leading:i,maxWait:t,trailing:a})}function o(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function i(e){return!!e&&"object"==typeof e}function a(e){return"symbol"==typeof e||i(e)&&C.call(e)==u}function c(e){if("number"==typeof e)return e;if(a(e))return l;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(p,"");var n=h.test(e);return n||d.test(e)?v(e.slice(2),n?2:8):f.test(e)?l:+e}var s="Expected a function",l=NaN,u="[object Symbol]",p=/^\s+|\s+$/g,f=/^[-+]0x[0-9a-f]+$/i,h=/^0b[01]+$/i,d=/^0o[0-7]+$/i,v=parseInt,m="object"==typeof t&&t&&t.Object===Object&&t,y="object"==typeof self&&self&&self.Object===Object&&self,g=m||y||Function("return this")(),b=Object.prototype,C=b.toString,w=Math.max,S=Math.min,x=function(){return g.Date.now()};e.exports=r}).call(t,n(18))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e,t){return"undefined"!=typeof getComputedStyle?getComputedStyle(e,null).getPropertyValue(t):e.style[t]},o=function(e){return r(e,"overflow")+r(e,"overflow-y")+r(e,"overflow-x")},i=function(e){if(!(e instanceof HTMLElement))return window;for(var t=e;t&&t!==document.body&&t!==document.documentElement&&t.parentNode;){if(/(scroll|auto)/.test(o(t)))return t;t=t.parentNode}return window};t.default=i},function(e,t,n){"use strict";function r(e,t,n){if(a(e))return!1;var r=void 0,o=void 0,c=void 0,s=void 0;if(void 0===t||t===window)r=window.pageYOffset,c=window.pageXOffset,o=r+window.innerHeight,s=c+window.innerWidth;else{var l=(0,i.default)(t);r=l.top,c=l.left,o=r+t.offsetHeight,s=c+t.offsetWidth}var u=(0,i.default)(e);return r<=u.top+e.offsetHeight+n.top&&o>=u.top-n.bottom&&c<=u.left+e.offsetWidth+n.left&&s>=u.left-n.right}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r;var o=n(414),i=function(e){return e&&e.__esModule?e:{default:e}}(o),a=function(e){return null===e.offsetParent}},function(e,t,n){"use strict";function r(e){var t=e.getBoundingClientRect();return{top:t.top+window.pageYOffset,left:t.left+window.pageXOffset}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=r},function(e,t,n){"use strict";t.__esModule=!0;var r=n(157),o=function(e){return e&&e.__esModule?e:{default:e}}(r);t.default=function(e){return Array.isArray(e)?e:(0,o.default)(e)}},function(e,t,n){"use strict";var r=!("undefined"==typeof window||!window.document||!window.document.createElement),o={canUseDOM:r,canUseWorkers:"undefined"!=typeof Worker,canUseEventListeners:r&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:r&&!!window.screen,isInWorker:!r};e.exports=o},function(e,t){},function(e,t,n){"use strict";var r=n(20),o=r||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(65),a=n(24),c=n(50),s=n(26),l=n(42),u=n(22),p=n(15),f=n(11),h=(n(57),n(36)),d=n(433),v=l.draft_tree_data_support,m=v?s:c,y=f.List,g=f.Repeat,b={insertAtomicBlock:function(e,t,n){var r=e.getCurrentContent(),c=e.getSelection(),s=u.removeRange(r,c,"backward"),l=s.getSelectionAfter(),f=u.splitBlock(s,l),d=f.getSelectionAfter(),b=u.setBlockType(f,d,"atomic"),C=a.create({entity:t}),w={key:h(),type:"atomic",text:n,characterList:y(g(C,n.length))},S={key:h(),type:"unstyled"};v&&(w=o({},w,{nextSibling:S.key}),S=o({},S,{prevSibling:w.key}));var x=[new m(w),new m(S)],M=i.createFromArray(x),z=u.replaceWithFragment(b,d,M),k=z.merge({selectionBefore:c,selectionAfter:z.getSelectionAfter().set("hasFocus",!0)});return p.push(e,k,"insert-fragment")},moveAtomicBlock:function(e,t,n,r){var o=e.getCurrentContent(),i=e.getSelection(),a=void 0;if("before"===r||"after"===r){var c=o.getBlockForKey("before"===r?n.getStartKey():n.getEndKey());a=d(o,t,c,r)}else{var s=u.removeRange(o,n,"backward"),l=s.getSelectionAfter(),f=s.getBlockForKey(l.getFocusKey());if(0===l.getStartOffset())a=d(s,t,f,"before");else if(l.getEndOffset()===f.getLength())a=d(s,t,f,"after");else{var h=u.splitBlock(s,l),v=h.getSelectionAfter(),m=h.getBlockForKey(v.getFocusKey());a=d(h,t,m,"before")}}var y=a.merge({selectionBefore:i,selectionAfter:a.getSelectionAfter().set("hasFocus",!0)});return p.push(e,y,"move-block")}};e.exports=b},function(e,t,n){"use strict";var r={draft_killswitch_allow_nontextnodes:!1,draft_segmented_entities_behavior:!1,draft_handlebeforeinput_composed_text:!1,draft_tree_data_support:!1};e.exports=r},function(e,t,n){"use strict";function r(e,t,n,r){var i=e.getBlockMap(),c=t.getStartKey(),s=t.getStartOffset(),l=t.getEndKey(),u=t.getEndOffset(),p=i.skipUntil(function(e,t){return t===c}).takeUntil(function(e,t){return t===l}).concat(a([[l,i.get(l)]])).map(function(e,t){var i,a;c===l?(i=s,a=u):(i=t===c?s:0,a=t===l?u:e.getLength());for(var p,f=e.getCharacterList();i<a;)p=f.get(i),f=f.set(i,r?o.applyStyle(p,n):o.removeStyle(p,n)),i++;return e.set("characterList",f)});return e.merge({blockMap:i.merge(p),selectionBefore:t,selectionAfter:t})}var o=n(24),i=n(11),a=i.Map,c={add:function(e,t,n){return r(e,t,n,!0)},remove:function(e,t,n){return r(e,t,n,!1)}};e.exports=c},function(e,t,n){"use strict";function r(e,t,n){var r=e.getBlockMap(),a=t.getStartKey(),c=t.getStartOffset(),s=t.getEndKey(),l=t.getEndOffset(),u=r.skipUntil(function(e,t){return t===a}).takeUntil(function(e,t){return t===s}).toOrderedMap().merge(o.OrderedMap([[s,r.get(s)]])).map(function(e,t){var r=t===a?c:0,o=t===s?l:e.getLength();return i(e,r,o,n)});return e.merge({blockMap:r.merge(u),selectionBefore:t,selectionAfter:t})}var o=n(11),i=n(422);e.exports=r},function(e,t,n){"use strict";function r(e,t,n,r){for(var i=e.getCharacterList();t<n;)i=i.set(t,o.applyEntity(i.get(t),r)),t++;return e.set("characterList",i)}var o=n(24);e.exports=r},function(e,t,n){"use strict";function r(e,t,n,r,i){var a=r.getStartOffset(),c=r.getEndOffset(),s=t.getEntityAt(a),l=n.getEntityAt(c-1);if(!s&&!l)return r;var u=r;if(s&&s===l)u=o(e,t,u,i,s,!0,!0);else if(s&&l){var p=o(e,t,u,i,s,!1,!0),f=o(e,n,u,i,l,!1,!1);u=u.merge({anchorOffset:p.getAnchorOffset(),focusOffset:f.getFocusOffset(),isBackward:!1})}else if(s){var h=o(e,t,u,i,s,!1,!0);u=u.merge({anchorOffset:h.getStartOffset(),isBackward:!1})}else if(l){var d=o(e,n,u,i,l,!1,!1);u=u.merge({focusOffset:d.getEndOffset(),isBackward:!1})}return u}function o(e,t,n,r,o,s,l){var u=n.getStartOffset(),p=n.getEndOffset(),f=e.__get(o),h=f.getMutability(),d=l?u:p;if("MUTABLE"===h)return n;var v=a(t,o).filter(function(e){return d<=e.end&&d>=e.start});1!=v.length&&c(!1);var m=v[0];if("IMMUTABLE"===h)return n.merge({anchorOffset:m.start,focusOffset:m.end,isBackward:!1});s||(l?p=m.end:u=m.start);var y=i.getRemovalRange(u,p,t.getText().slice(m.start,m.end),m.start,r);return n.merge({anchorOffset:y.start,focusOffset:y.end,isBackward:!1})}var i=n(424),a=n(425),c=n(10);e.exports=r},function(e,t,n){"use strict";var r={getRemovalRange:function(e,t,n,r,o){var i=n.split(" ");i=i.map(function(e,t){if("forward"===o){if(t>0)return" "+e}else if(t<i.length-1)return e+" ";return e});for(var a,c,s=r,l=null,u=null,p=0;p<i.length;p++){if(c=i[p],a=s+c.length,e<a&&s<t)null!==l?u=a:(l=s,u=a);else if(null!==l)break;s=a}var f=r+n.length,h=l===r,d=u===f;return(!h&&d||h&&!d)&&("forward"===o?u!==f&&u++:l!==r&&l--),{start:l,end:u}}};e.exports=r},function(e,t,n){"use strict";function r(e,t){var n=[];return e.findEntityRanges(function(e){return e.getEntity()===t},function(e,t){n.push({start:e,end:t})}),n.length||o(!1),n}var o=n(10);e.exports=r},function(e,t,n){"use strict";var r=n(65),o=n(26),i=n(11),a=n(192),c=n(10),s=n(190),l=i.List,u=function(e,t,n,r,o,i){var c=n.get(o),s=c.getText(),l=c.getCharacterList(),u=o,p=i+r.getText().length,f=c.merge({text:s.slice(0,i)+r.getText()+s.slice(i),characterList:a(l,r.getCharacterList(),i),data:r.getData()});return e.merge({blockMap:n.set(o,f),selectionBefore:t,selectionAfter:t.merge({anchorKey:u,anchorOffset:p,focusKey:u,focusOffset:p,isBackward:!1})})},p=function(e,t,n){var r=e.getText(),o=e.getCharacterList(),i=r.slice(0,t),a=o.slice(0,t),c=n.first();return e.merge({text:i+c.getText(),characterList:a.concat(c.getCharacterList()),type:i?e.getType():c.getType(),data:c.getData()})},f=function(e,t,n){var r=e.getText(),o=e.getCharacterList(),i=r.length,a=r.slice(t,i),c=o.slice(t,i),s=n.last();return s.merge({text:s.getText()+a,characterList:s.getCharacterList().concat(c),data:s.getData()})},h=function(e,t){var n=e.getKey(),r=e,o=[];for(t.get(n)&&o.push(n);r&&r.getNextSiblingKey();){var i=r.getNextSiblingKey();if(!i)break;o.push(i),r=t.get(i)}return o},d=function(e,t,n,r){return e.withMutations(function(t){var o=n.getKey(),i=r.getKey(),a=n.getNextSiblingKey(),c=n.getParentKey(),s=h(r,e),u=s[s.length-1];if(t.get(i)?(t.setIn([o,"nextSibling"],i),t.setIn([i,"prevSibling"],o)):(t.setIn([o,"nextSibling"],r.getNextSiblingKey()),t.setIn([r.getNextSiblingKey(),"prevSibling"],o)),t.setIn([u,"nextSibling"],a),a&&t.setIn([a,"prevSibling"],u),s.forEach(function(e){return t.setIn([e,"parent"],c)}),c){var p=e.get(c),f=p.getChildKeys(),d=f.indexOf(o),v=d+1,m=f.toArray();m.splice.apply(m,[v,0].concat(s)),t.setIn([c,"children"],l(m))}})},v=function(e,t,n,i,a,c){var s=n.first()instanceof o,l=[],u=i.size,h=n.get(a),v=i.first(),m=i.last(),y=m.getLength(),g=m.getKey(),b=s&&(!h.getChildKeys().isEmpty()||!v.getChildKeys().isEmpty());n.forEach(function(e,t){if(t!==a)return void l.push(e);b?l.push(e):l.push(p(e,c,i)),i.slice(b?0:1,u-1).forEach(function(e){return l.push(e)}),l.push(f(e,c,i))});var C=r.createFromArray(l);return s&&(C=d(C,0,h,v)),e.merge({blockMap:C,selectionBefore:t,selectionAfter:t.merge({anchorKey:g,anchorOffset:y,focusKey:g,focusOffset:y,isBackward:!1})})},m=function(e,t,n){t.isCollapsed()||c(!1);var r=e.getBlockMap(),i=s(n),a=t.getStartKey(),l=t.getStartOffset(),p=r.get(a);return p instanceof o&&(p.getChildKeys().isEmpty()||c(!1)),1===i.size?u(e,t,r,i.first(),a,l):v(e,t,r,i,a,l)};e.exports=m},function(e,t,n){"use strict";function r(e,t,n,r){t.isCollapsed()||a(!1);var o=n.length;if(!o)return e;var s=e.getBlockMap(),l=t.getStartKey(),u=t.getStartOffset(),p=s.get(l),f=p.getText(),h=p.merge({text:f.slice(0,u)+n+f.slice(u,p.getLength()),characterList:i(p.getCharacterList(),c(r,o).toList(),u)}),d=u+o;return e.merge({blockMap:s.set(l,h),selectionAfter:t.merge({anchorOffset:d,focusOffset:d})})}var o=n(11),i=n(192),a=n(10),c=o.Repeat;e.exports=r},function(e,t,n){"use strict";function r(e,t,n){var r=t.getStartKey(),o=t.getEndKey(),a=e.getBlockMap(),c=a.toSeq().skipUntil(function(e,t){return t===r}).takeUntil(function(e,t){return t===o}).concat(i([[o,a.get(o)]])).map(n);return e.merge({blockMap:a.merge(c),selectionBefore:t,selectionAfter:t})}var o=n(11),i=o.Map;e.exports=r},function(e,t,n){"use strict";var r=n(26),o=n(11),i=n(193),a=(o.List,o.Map),c=function(e,t,n){if(e){var r=t.get(e);r&&t.set(e,n(r))}},s=function(e,t){var n=[];if(!e)return n;for(var r=t.get(e);r&&r.getParentKey();){var o=r.getParentKey();o&&n.push(o),r=o?t.get(o):null}return n},l=function(e,t){var n=[];if(!e)return n;for(var r=i(e,t);r&&t.get(r);){var o=t.get(r);n.push(r),r=o.getParentKey()?i(o,t):null}return n},u=function(e,t,n){if(!e)return null;for(var r=n.get(e.getKey()).getNextSiblingKey();r&&!t.get(r);)r=n.get(r).getNextSiblingKey()||null;return r},p=function(e,t,n){if(!e)return null;for(var r=n.get(e.getKey()).getPrevSiblingKey();r&&!t.get(r);)r=n.get(r).getPrevSiblingKey()||null;return r},f=function(e,t,n,r){return e.withMutations(function(e){c(t.getKey(),e,function(n){return n.merge({nextSibling:u(t,e,r),prevSibling:p(t,e,r)})}),c(n.getKey(),e,function(t){return t.merge({nextSibling:u(n,e,r),prevSibling:p(n,e,r)})}),s(t.getKey(),r).forEach(function(t){return c(t,e,function(t){return t.merge({children:t.getChildKeys().filter(function(t){return e.get(t)}),nextSibling:u(t,e,r),prevSibling:p(t,e,r)})})}),c(t.getNextSiblingKey(),e,function(e){return e.merge({prevSibling:t.getPrevSiblingKey()})}),c(t.getPrevSiblingKey(),e,function(n){return n.merge({nextSibling:u(t,e,r)})}),c(n.getNextSiblingKey(),e,function(t){return t.merge({prevSibling:p(n,e,r)})}),c(n.getPrevSiblingKey(),e,function(e){return e.merge({nextSibling:n.getNextSiblingKey()})}),s(n.getKey(),r).forEach(function(t){c(t,e,function(t){return t.merge({children:t.getChildKeys().filter(function(t){return e.get(t)}),nextSibling:u(t,e,r),prevSibling:p(t,e,r)})})}),l(n,r).forEach(function(t){return c(t,e,function(t){return t.merge({nextSibling:u(t,e,r),prevSibling:p(t,e,r)})})})})},h=function(e,t){if(t.isCollapsed())return e;var n=e.getBlockMap(),o=t.getStartKey(),c=t.getStartOffset(),l=t.getEndKey(),u=t.getEndOffset(),p=n.get(o),h=n.get(l),v=p instanceof r,m=[];if(v){var y=h.getChildKeys(),g=s(l,n);h.getNextSiblingKey()&&(m=m.concat(g)),y.isEmpty()||(m=m.concat(g.concat([l]))),m=m.concat(s(i(h,n),n))}var b=void 0;b=p===h?d(p.getCharacterList(),c,u):p.getCharacterList().slice(0,c).concat(h.getCharacterList().slice(u));var C=p.merge({text:p.getText().slice(0,c)+h.getText().slice(u),characterList:b}),w=n.toSeq().skipUntil(function(e,t){return t===o}).takeUntil(function(e,t){return t===l}).filter(function(e,t){return-1===m.indexOf(t)}).concat(a([[l,null]])).map(function(e,t){return t===o?C:null}),S=n.merge(w).filter(function(e){return!!e});return v&&(S=f(S,p,h,n)),e.merge({blockMap:S,selectionBefore:t,selectionAfter:t.merge({anchorKey:o,anchorOffset:c,focusKey:o,focusOffset:c,isBackward:!1})})},d=function(e,t,n){if(0===t)for(;t<n;)e=e.shift(),t++;else if(n===e.count())for(;n>t;)e=e.pop(),n--;else{var r=e.slice(0,t),o=e.slice(n);e=r.concat(o).toList()}return e};e.exports=h},function(e,t,n){"use strict";var r=n(26),o=n(11),i=n(36),a=n(10),c=o.List,s=o.Map,l=function(e,t,n){if(e){var r=t.get(e);r&&t.set(e,n(r))}},u=function(e,t,n){return e.withMutations(function(e){var r=t.getKey(),o=n.getKey();l(t.getParentKey(),e,function(e){var t=e.getChildKeys(),n=t.indexOf(r)+1,i=t.toArray();return i.splice(n,0,o),e.merge({children:c(i)})}),l(t.getNextSiblingKey(),e,function(e){return e.merge({prevSibling:o})}),l(r,e,function(e){return e.merge({nextSibling:o})}),l(o,e,function(e){return e.merge({prevSibling:r})})})},p=function(e,t){t.isCollapsed()||a(!1);var n=t.getAnchorKey(),o=t.getAnchorOffset(),c=e.getBlockMap(),l=c.get(n),p=l.getText(),f=l.getCharacterList(),h=i(),d=l instanceof r,v=l.merge({text:p.slice(0,o),characterList:f.slice(0,o)}),m=v.merge({key:h,text:p.slice(o),characterList:f.slice(o),data:s()}),y=c.toSeq().takeUntil(function(e){return e===l}),g=c.toSeq().skipUntil(function(e){return e===l}).rest(),b=y.concat([[n,v],[h,m]],g).toOrderedMap();return d&&(l.getChildKeys().isEmpty()||a(!1),b=u(b,v,m)),e.merge({blockMap:b,selectionBefore:t,selectionAfter:t.merge({anchorKey:h,anchorOffset:0,focusKey:h,focusOffset:0,isBackward:!1})})};e.exports=p},function(e,t,n){"use strict";var r,o=n(11),i=n(432),a=n(30),c=o.OrderedMap,s={getDirectionMap:function(e,t){r?r.reset():r=new i;var n=e.getBlockMap(),s=n.valueSeq().map(function(e){return a(r).getDirection(e.getText())}),l=c(n.keySeq().zip(s));return null!=t&&o.is(t,l)?t:l}};e.exports=s},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var o=n(196),i=n(132),a=n(10),c=function(){function e(t){r(this,e),t?i.isStrong(t)||a(!1):t=i.getGlobalDir(),this._defaultDir=t,this.reset()}return e.prototype.reset=function(){this._lastDir=this._defaultDir},e.prototype.getDirection=function(e){return this._lastDir=o.getDirection(e,this._lastDir),this._lastDir},e}();e.exports=c},function(e,t,n){"use strict";var r=n(26),o=n(11),i=n(193),a=n(10),c=o.OrderedMap,s=o.List,l=function(e,t,n){if(e){var r=t.get(e);r&&t.set(e,n(r))}},u=function(e,t,n,r,o){if(!o)return e;var i="after"===r,a=t.getKey(),c=n.getKey(),u=t.getParentKey(),p=t.getNextSiblingKey(),f=t.getPrevSiblingKey(),h=n.getParentKey(),d=i?n.getNextSiblingKey():c,v=i?c:n.getPrevSiblingKey();return e.withMutations(function(e){l(u,e,function(e){var t=e.getChildKeys();return e.merge({children:t.delete(t.indexOf(a))})}),l(f,e,function(e){return e.merge({nextSibling:p})}),l(p,e,function(e){return e.merge({prevSibling:f})}),l(d,e,function(e){return e.merge({prevSibling:a})}),l(v,e,function(e){return e.merge({nextSibling:a})}),l(h,e,function(e){var t=e.getChildKeys(),n=t.indexOf(c),r=i?n+1:0!==n?n-1:0,o=t.toArray();return o.splice(r,0,a),e.merge({children:s(o)})}),l(a,e,function(e){return e.merge({nextSibling:d,prevSibling:v,parent:h})})})},p=function(e,t,n,o){"replace"===o&&a(!1);var s=n.getKey(),l=t.getKey();l===s&&a(!1);var p=e.getBlockMap(),f=t instanceof r,h=[t],d=p.delete(l);f&&(h=[],d=p.withMutations(function(e){var n=t.getNextSiblingKey(),r=i(t,e);e.toSeq().skipUntil(function(e){return e.getKey()===l}).takeWhile(function(e){var t=e.getKey(),o=t===l,i=n&&t!==n,a=!n&&e.getParentKey()&&(!r||t!==r);return!!(o||i||a)}).forEach(function(t){h.push(t),e.delete(t.getKey())})}));var v=d.toSeq().takeUntil(function(e){return e===n}),m=d.toSeq().skipUntil(function(e){return e===n}).skip(1),y=h.map(function(e){return[e.getKey(),e]}),g=c();if("before"===o){var b=e.getBlockBefore(s);b&&b.getKey()===t.getKey()&&a(!1),g=v.concat([].concat(y,[[s,n]]),m).toOrderedMap()}else if("after"===o){var C=e.getBlockAfter(s);C&&C.getKey()===l&&a(!1),g=v.concat([[s,n]].concat(y),m).toOrderedMap()}return e.merge({blockMap:u(g,t,n,o,f),selectionBefore:e.getSelectionAfter(),selectionAfter:e.getSelectionAfter().merge({anchorKey:l,focusKey:l})})};e.exports=p},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t,n){for(var r=t;r<n;r++)if(null!=e[r])return!1;return!0}function i(e,t,n,r){for(var o=t;o<n;o++)e[o]=r}var a=n(11),c=a.List,s=function(){function e(t){r(this,e),this._decorators=t.slice()}return e.prototype.getDecorations=function(e,t){var n=Array(e.getText().length).fill(null);return this._decorators.forEach(function(r,a){var c=0;(0,r.strategy)(e,function(e,t){o(n,e,t)&&(i(n,e,t,a+"."+c),c++)},t)}),c(n)},e.prototype.getComponentForKey=function(e){var t=parseInt(e.split(".")[0],10);return this._decorators[t].component},e.prototype.getPropsForKey=function(e){var t=parseInt(e.split(".")[0],10);return this._decorators[t].props},e}();e.exports=s},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(20),c=a||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=n(133),l=n(197),u=n(436),p=n(437),f=n(460),h=n(463),d=n(495),v=n(15),m=n(0),y=n(9),g=n(201),b=n(137),C=n(34),w=n(58),S=n(83),x=n(36),M=n(214),z=n(138),k=n(10),_=n(30),O=C.isBrowser("IE"),E=!O,T={edit:h,composite:u,drag:f,cut:null,render:null},N=function(e){function t(n){r(this,t);var i=o(this,e.call(this,n));return i.focus=function(e){var t=i.props.editorState,n=t.getSelection().getHasFocus(),r=y.findDOMNode(i.editor);if(r){var o=b.getScrollParent(r),a=e||z(o),c=a.x,s=a.y;r instanceof HTMLElement||k(!1),r.focus(),o===window?window.scrollTo(c,s):g.setTop(o,s),n||i.update(v.forceSelection(t,t.getSelection()))}},i.blur=function(){var e=y.findDOMNode(i.editor);e instanceof HTMLElement||k(!1),e.blur()},i.setMode=function(e){i._handler=T[e]},i.exitCurrentMode=function(){i.setMode("edit")},i.restoreEditorDOM=function(e){i.setState({contentsKey:i.state.contentsKey+1},function(){i.focus(e)})},i.setClipboard=function(e){i._clipboard=e},i.getClipboard=function(){return i._clipboard},i.update=function(e){i._latestEditorState=e,i.props.onChange(e)},i.onDragEnter=function(){i._dragCount++},i.onDragLeave=function(){0===--i._dragCount&&i.exitCurrentMode()},i._blockSelectEvents=!1,i._clipboard=null,i._handler=null,i._dragCount=0,i._editorKey=n.editorKey||x(),i._placeholderAccessibilityID="placeholder-"+i._editorKey,i._latestEditorState=n.editorState,i._latestCommittedEditorState=n.editorState,i._onBeforeInput=i._buildHandler("onBeforeInput"),i._onBlur=i._buildHandler("onBlur"),i._onCharacterData=i._buildHandler("onCharacterData"),i._onCompositionEnd=i._buildHandler("onCompositionEnd"),i._onCompositionStart=i._buildHandler("onCompositionStart"),i._onCopy=i._buildHandler("onCopy"),i._onCut=i._buildHandler("onCut"),i._onDragEnd=i._buildHandler("onDragEnd"),i._onDragOver=i._buildHandler("onDragOver"),i._onDragStart=i._buildHandler("onDragStart"),i._onDrop=i._buildHandler("onDrop"),i._onInput=i._buildHandler("onInput"),i._onFocus=i._buildHandler("onFocus"),i._onKeyDown=i._buildHandler("onKeyDown"),i._onKeyPress=i._buildHandler("onKeyPress"),i._onKeyUp=i._buildHandler("onKeyUp"),i._onMouseDown=i._buildHandler("onMouseDown"),i._onMouseUp=i._buildHandler("onMouseUp"),i._onPaste=i._buildHandler("onPaste"),i._onSelect=i._buildHandler("onSelect"),i.getEditorKey=function(){return i._editorKey},i.state={contentsKey:0},i}return i(t,e),t.prototype._buildHandler=function(e){var t=this;return function(n){if(!t.props.readOnly){var r=t._handler&&t._handler[e];r&&r(t,n)}}},t.prototype._showPlaceholder=function(){return!!this.props.placeholder&&!this.props.editorState.isInCompositionMode()&&!this.props.editorState.getCurrentContent().hasText()},t.prototype._renderPlaceholder=function(){if(this._showPlaceholder()){var e={text:_(this.props.placeholder),editorState:this.props.editorState,textAlignment:this.props.textAlignment,accessibilityID:this._placeholderAccessibilityID};return m.createElement(d,e)}return null},t.prototype.render=function(){var e=this,t=this.props,n=t.blockRenderMap,r=t.blockRendererFn,o=t.blockStyleFn,i=t.customStyleFn,a=t.customStyleMap,s=t.editorState,u=t.readOnly,f=t.textAlignment,h=t.textDirectionality,d=w({"DraftEditor/root":!0,"DraftEditor/alignLeft":"left"===f,"DraftEditor/alignRight":"right"===f,"DraftEditor/alignCenter":"center"===f}),v={outline:"none",userSelect:"text",WebkitUserSelect:"text",whiteSpace:"pre-wrap",wordWrap:"break-word"},y=this.props.role||"textbox",g="combobox"===y?!!this.props.ariaExpanded:null,b={blockRenderMap:n,blockRendererFn:r,blockStyleFn:o,customStyleMap:c({},l,a),customStyleFn:i,editorKey:this._editorKey,editorState:s,key:"contents"+this.state.contentsKey,textDirectionality:h};return m.createElement("div",{className:d},this._renderPlaceholder(),m.createElement("div",{className:w("DraftEditor/editorContainer"),ref:function(t){return e.editorContainer=t}},m.createElement("div",{"aria-activedescendant":u?null:this.props.ariaActiveDescendantID,"aria-autocomplete":u?null:this.props.ariaAutoComplete,"aria-controls":u?null:this.props.ariaControls,"aria-describedby":this.props.ariaDescribedBy||this._placeholderAccessibilityID,"aria-expanded":u?null:g,"aria-label":this.props.ariaLabel,"aria-labelledby":this.props.ariaLabelledBy,"aria-multiline":this.props.ariaMultiline,autoCapitalize:this.props.autoCapitalize,autoComplete:this.props.autoComplete,autoCorrect:this.props.autoCorrect,className:w({notranslate:!u,"public/DraftEditor/content":!0}),contentEditable:!u,"data-testid":this.props.webDriverTestID,onBeforeInput:this._onBeforeInput,onBlur:this._onBlur,onCompositionEnd:this._onCompositionEnd,onCompositionStart:this._onCompositionStart,onCopy:this._onCopy,onCut:this._onCut,onDragEnd:this._onDragEnd,onDragEnter:this.onDragEnter,onDragLeave:this.onDragLeave,onDragOver:this._onDragOver,onDragStart:this._onDragStart,onDrop:this._onDrop,onFocus:this._onFocus,onInput:this._onInput,onKeyDown:this._onKeyDown,onKeyPress:this._onKeyPress,onKeyUp:this._onKeyUp,onMouseUp:this._onMouseUp,onPaste:this._onPaste,onSelect:this._onSelect,ref:function(t){return e.editor=t},role:u?null:y,spellCheck:E&&this.props.spellCheck,style:v,suppressContentEditableWarning:!0,tabIndex:this.props.tabIndex},m.createElement(p,b))))},t.prototype.componentDidMount=function(){this.setMode("edit"),O&&document.execCommand("AutoUrlDetect",!1,!1)},t.prototype.componentWillUpdate=function(e){this._blockSelectEvents=!0,this._latestEditorState=e.editorState},t.prototype.componentDidUpdate=function(){this._blockSelectEvents=!1,this._latestCommittedEditorState=this.props.editorState},t}(m.Component);N.defaultProps={blockRenderMap:s,blockRendererFn:S.thatReturnsNull,blockStyleFn:S.thatReturns(""),keyBindingFn:M,readOnly:!1,spellCheck:!1,stripPastedStyles:!1},e.exports=N},function(e,t,n){"use strict";var r=n(42),o=n(22),i=n(15),a=n(134),c=n(135),s=n(67),l=n(198),u=!1,p=!1,f="",h={onBeforeInput:function(e,t){f=(f||"")+t.data},onCompositionStart:function(e){p=!0},onCompositionEnd:function(e){u=!1,p=!1,setTimeout(function(){u||h.resolveComposition(e)},20)},onKeyDown:function(e,t){if(!p)return h.resolveComposition(e),void e._onKeyDown(t);t.which!==a.RIGHT&&t.which!==a.LEFT||t.preventDefault()},onKeyPress:function(e,t){t.which===a.RETURN&&t.preventDefault()},resolveComposition:function(e){if(!p){u=!0;var t=f;f="";var n=i.set(e._latestEditorState,{inCompositionMode:!1}),a=n.getCurrentInlineStyle(),h=c(n.getCurrentContent(),n.getSelection()),d=!t||l(n)||a.size>0||null!==h;if(d&&e.restoreEditorDOM(),e.exitCurrentMode(),t){if(r.draft_handlebeforeinput_composed_text&&e.props.handleBeforeInput&&s(e.props.handleBeforeInput(t,n)))return;var v=o.replaceText(n.getCurrentContent(),n.getSelection(),t,a,h);return void e.update(i.push(n,v,"insert-characters"))}d&&e.update(i.set(n,{nativelyRenderedContent:null,forceSelection:!0}))}}};e.exports=h},function(e,t,n){"use strict";var r=n(438);e.exports=r},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(20),c=a||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s=n(199),l=n(68),u=(n(15),n(0)),p=n(58),f=n(459),h=n(30),d=function(e,t,n,r){return p({"public/DraftStyleDefault/unorderedListItem":"unordered-list-item"===e,"public/DraftStyleDefault/orderedListItem":"ordered-list-item"===e,"public/DraftStyleDefault/reset":n,"public/DraftStyleDefault/depth0":0===t,"public/DraftStyleDefault/depth1":1===t,"public/DraftStyleDefault/depth2":2===t,"public/DraftStyleDefault/depth3":3===t,"public/DraftStyleDefault/depth4":4===t,"public/DraftStyleDefault/listLTR":"LTR"===r,"public/DraftStyleDefault/listRTL":"RTL"===r})},v=function(e){function t(){return r(this,t),o(this,e.apply(this,arguments))}return i(t,e),t.prototype.shouldComponentUpdate=function(e){var t=this.props.editorState,n=e.editorState;if(t.getDirectionMap()!==n.getDirectionMap())return!0;if(t.getSelection().getHasFocus()!==n.getSelection().getHasFocus())return!0;var r=n.getNativelyRenderedContent(),o=t.isInCompositionMode(),i=n.isInCompositionMode();if(t===n||null!==r&&n.getCurrentContent()===r||o&&i)return!1;var a=t.getCurrentContent(),c=n.getCurrentContent(),s=t.getDecorator(),l=n.getDecorator();return o!==i||a!==c||s!==l||n.mustForceSelection()},t.prototype.render=function(){for(var e=this.props,t=e.blockRenderMap,n=e.blockRendererFn,r=e.blockStyleFn,o=e.customStyleMap,i=e.customStyleFn,a=e.editorState,p=e.editorKey,v=e.textDirectionality,m=a.getCurrentContent(),y=a.getSelection(),g=a.mustForceSelection(),b=a.getDecorator(),C=h(a.getDirectionMap()),w=m.getBlocksAsArray(),S=[],x=null,M=null,z=0;z<w.length;z++){var k=w[z],_=k.getKey(),O=k.getType(),E=n(k),T=void 0,N=void 0,V=void 0;E&&(T=E.component,N=E.props,V=E.editable);var P=v||C.get(_),H=l.encode(_,0,0),L={contentState:m,block:k,blockProps:N,blockStyleFn:r,customStyleMap:o,customStyleFn:i,decorator:b,direction:P,forceSelection:g,key:_,offsetKey:H,selection:y,tree:a.getBlockTree(_)},D=t.get(O)||t.get("unstyled"),A=D.wrapper,I=D.element||t.get("unstyled").element,R=k.getDepth(),j="";if(r&&(j=r(k)),"li"===I){j=f(j,d(O,R,M!==A||null===x||R>x,P))}var F=T||s,K={className:j,"data-block":!0,"data-editor":p,"data-offset-key":H,key:_};void 0!==V&&(K=c({},K,{contentEditable:V,suppressContentEditableWarning:!0}));var B=u.createElement(I,K,u.createElement(F,L));S.push({block:B,wrapperTemplate:A,key:_,offsetKey:H}),x=A?k.getDepth():null,M=A}for(var W=[],U=0;U<S.length;){var q=S[U];if(q.wrapperTemplate){var Y=[];do{Y.push(S[U].block),U++}while(U<S.length&&S[U].wrapperTemplate===q.wrapperTemplate);var G=u.cloneElement(q.wrapperTemplate,{key:q.key+"-wrap","data-offset-key":q.offsetKey},Y);W.push(G)}else W.push(q.block),U++}return u.createElement("div",{"data-contents":"true"},W)},t}(u.Component);e.exports=v},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(20),c=n(440),s=n(0),l=n(9),u=n(10),p=n(447),f=function(e){function t(){return r(this,t),o(this,e.apply(this,arguments))}return i(t,e),t.prototype._setSelection=function(){var e=this.props.selection;if(null!=e&&e.getHasFocus()){var t=this.props,n=t.block,r=t.start,o=t.text,i=n.getKey(),a=r+o.length;if(e.hasEdgeWithin(i,r,a)){var c=l.findDOMNode(this);c||u(!1);var s=c.firstChild;s||u(!1);var f=void 0;s.nodeType===Node.TEXT_NODE?f=s:"BR"===s.tagName?f=c:(f=s.firstChild)||u(!1),p(e,f,i,r,a)}}},t.prototype.shouldComponentUpdate=function(e){var t=l.findDOMNode(this.leaf);return t||u(!1),t.textContent!==e.text||e.styleSet!==this.props.styleSet||e.forceSelection},t.prototype.componentDidUpdate=function(){this._setSelection()},t.prototype.componentDidMount=function(){this._setSelection()},t.prototype.render=function(){var e=this,t=this.props.block,n=this.props.text;n.endsWith("\n")&&this.props.isLast&&(n+="\n");var r=this.props,o=r.customStyleMap,i=r.customStyleFn,l=r.offsetKey,u=r.styleSet,p=u.reduce(function(e,t){var n={},r=o[t];return void 0!==r&&e.textDecoration!==r.textDecoration&&(n.textDecoration=[e.textDecoration,r.textDecoration].join(" ").trim()),a(e,r,n)},{});if(i){var f=i(u,t);p=a(p,f)}return s.createElement("span",{"data-offset-key":l,ref:function(t){return e.leaf=t},style:p},s.createElement(c,null,n))},t}(s.Component);e.exports=f},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function a(e){return p?"\n"===e.textContent:"BR"===e.tagName}var c=n(0),s=n(9),l=n(34),u=n(10),p=l.isBrowser("IE <= 11"),f=p?c.createElement("span",{key:"A","data-text":"true"},"\n"):c.createElement("br",{key:"A","data-text":"true"}),h=p?c.createElement("span",{key:"B","data-text":"true"},"\n"):c.createElement("br",{key:"B","data-text":"true"}),d=function(e){function t(n){r(this,t);var i=o(this,e.call(this,n));return i._forceFlag=!1,i}return i(t,e),t.prototype.shouldComponentUpdate=function(e){var t=s.findDOMNode(this),n=""===e.children;return t instanceof Element||u(!1),n?!a(t):t.textContent!==e.children},t.prototype.componentDidMount=function(){this._forceFlag=!this._forceFlag},t.prototype.componentDidUpdate=function(){this._forceFlag=!this._forceFlag},t.prototype.render=function(){return""===this.props.children?this._forceFlag?f:h:c.createElement("span",{key:this._forceFlag?"A":"B","data-text":"true"},this.props.children)},t}(c.Component);e.exports=d},function(e,t,n){"use strict";var r=n(442),o="Unknown",i={"Mac OS":"Mac OS X"},a=new r,c=a.getResult(),s=function(e){if(!e)return{major:"",minor:""};var t=e.split(".");return{major:t[0],minor:t[1]}}(c.browser.version),l={browserArchitecture:c.cpu.architecture||o,browserFullVersion:c.browser.version||o,browserMinorVersion:s.minor||o,browserName:c.browser.name||o,browserVersion:c.browser.major||o,deviceName:c.device.model||o,engineName:c.engine.name||o,engineVersion:c.engine.version||o,platformArchitecture:c.cpu.architecture||o,platformName:function(e){return i[e]||e}(c.os.name)||o,platformVersion:c.os.version||o,platformFullVersion:c.os.version||o};e.exports=l},function(e,t,n){var r;/*! + * UAParser.js v0.7.18 + * Lightweight JavaScript-based User-Agent string parser + * https://github.com/faisalman/ua-parser-js + * + * Copyright © 2012-2016 Faisal Salman <fyzlman@gmail.com> + * Dual licensed under GPLv2 or MIT + */ +!function(o,i){"use strict";var a="model",c="name",s="type",l="vendor",u="version",p="mobile",f="tablet",h={extend:function(e,t){var n={};for(var r in e)t[r]&&t[r].length%2==0?n[r]=t[r].concat(e[r]):n[r]=e[r];return n},has:function(e,t){return"string"==typeof e&&-1!==t.toLowerCase().indexOf(e.toLowerCase())},lowerize:function(e){return e.toLowerCase()},major:function(e){/*! + * UAParser.js v0.7.18 + * Lightweight JavaScript-based User-Agent string parser + * https://github.com/faisalman/ua-parser-js + * + * Copyright © 2012-2016 Faisal Salman <fyzlman@gmail.com> + * Dual licensed under GPLv2 or MIT + */ +return"string"==typeof e?e.replace(/[^\d\.]/g,"").split(".")[0]:void 0},trim:function(e){return e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}},d={rgx:function(e,t){for(var n,r,o,i,a,c,s=0;s<t.length&&!a;){var l=t[s],u=t[s+1];for(n=r=0;n<l.length&&!a;)if(a=l[n++].exec(e))for(o=0;o<u.length;o++)c=a[++r],i=u[o],"object"==typeof i&&i.length>0?2==i.length?"function"==typeof i[1]?this[i[0]]=i[1].call(this,c):this[i[0]]=i[1]:3==i.length?"function"!=typeof i[1]||i[1].exec&&i[1].test?this[i[0]]=c?c.replace(i[1],i[2]):void 0:this[i[0]]=c?i[1].call(this,c,i[2]):void 0:4==i.length&&(this[i[0]]=c?i[3].call(this,c.replace(i[1],i[2])):void 0):this[i]=c||void 0;s+=2}},str:function(e,t){for(var n in t)if("object"==typeof t[n]&&t[n].length>0){for(var r=0;r<t[n].length;r++)if(h.has(t[n][r],e))return"?"===n?void 0:n}else if(h.has(t[n],e))return"?"===n?void 0:n;return e}},v={browser:{oldsafari:{version:{"1.0":"/8",1.2:"/1",1.3:"/3","2.0":"/412","2.0.2":"/416","2.0.3":"/417","2.0.4":"/419","?":"/"}}},device:{amazon:{model:{"Fire Phone":["SD","KF"]}},sprint:{model:{"Evo Shift 4G":"7373KT"},vendor:{HTC:"APA",Sprint:"Sprint"}}},os:{windows:{version:{ME:"4.90","NT 3.11":"NT3.51","NT 4.0":"NT4.0",2000:"NT 5.0",XP:["NT 5.1","NT 5.2"],Vista:"NT 6.0",7:"NT 6.1",8:"NT 6.2",8.1:"NT 6.3",10:["NT 6.4","NT 10.0"],RT:"ARM"}}}},m={browser:[[/(opera\smini)\/([\w\.-]+)/i,/(opera\s[mobiletab]+).+version\/([\w\.-]+)/i,/(opera).+version\/([\w\.]+)/i,/(opera)[\/\s]+([\w\.]+)/i],[c,u],[/(opios)[\/\s]+([\w\.]+)/i],[[c,"Opera Mini"],u],[/\s(opr)\/([\w\.]+)/i],[[c,"Opera"],u],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer)[\/\s]?([\w\.]*)/i,/(avant\s|iemobile|slim|baidu)(?:browser)?[\/\s]?([\w\.]*)/i,/(?:ms|\()(ie)\s([\w\.]+)/i,/(rekonq)\/([\w\.]*)/i,/(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark)\/([\w\.-]+)/i],[c,u],[/(trident).+rv[:\s]([\w\.]+).+like\sgecko/i],[[c,"IE"],u],[/(edge|edgios|edgea)\/((\d+)?[\w\.]+)/i],[[c,"Edge"],u],[/(yabrowser)\/([\w\.]+)/i],[[c,"Yandex"],u],[/(puffin)\/([\w\.]+)/i],[[c,"Puffin"],u],[/((?:[\s\/])uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i],[[c,"UCBrowser"],u],[/(comodo_dragon)\/([\w\.]+)/i],[[c,/_/g," "],u],[/(micromessenger)\/([\w\.]+)/i],[[c,"WeChat"],u],[/(qqbrowserlite)\/([\w\.]+)/i],[c,u],[/(QQ)\/([\d\.]+)/i],[c,u],[/m?(qqbrowser)[\/\s]?([\w\.]+)/i],[c,u],[/(BIDUBrowser)[\/\s]?([\w\.]+)/i],[c,u],[/(2345Explorer)[\/\s]?([\w\.]+)/i],[c,u],[/(MetaSr)[\/\s]?([\w\.]+)/i],[c],[/(LBBROWSER)/i],[c],[/xiaomi\/miuibrowser\/([\w\.]+)/i],[u,[c,"MIUI Browser"]],[/;fbav\/([\w\.]+);/i],[u,[c,"Facebook"]],[/headlesschrome(?:\/([\w\.]+)|\s)/i],[u,[c,"Chrome Headless"]],[/\swv\).+(chrome)\/([\w\.]+)/i],[[c,/(.+)/,"$1 WebView"],u],[/((?:oculus|samsung)browser)\/([\w\.]+)/i],[[c,/(.+(?:g|us))(.+)/,"$1 $2"],u],[/android.+version\/([\w\.]+)\s+(?:mobile\s?safari|safari)*/i],[u,[c,"Android Browser"]],[/(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i],[c,u],[/(dolfin)\/([\w\.]+)/i],[[c,"Dolphin"],u],[/((?:android.+)crmo|crios)\/([\w\.]+)/i],[[c,"Chrome"],u],[/(coast)\/([\w\.]+)/i],[[c,"Opera Coast"],u],[/fxios\/([\w\.-]+)/i],[u,[c,"Firefox"]],[/version\/([\w\.]+).+?mobile\/\w+\s(safari)/i],[u,[c,"Mobile Safari"]],[/version\/([\w\.]+).+?(mobile\s?safari|safari)/i],[u,c],[/webkit.+?(gsa)\/([\w\.]+).+?(mobile\s?safari|safari)(\/[\w\.]+)/i],[[c,"GSA"],u],[/webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i],[c,[u,d.str,v.browser.oldsafari.version]],[/(konqueror)\/([\w\.]+)/i,/(webkit|khtml)\/([\w\.]+)/i],[c,u],[/(navigator|netscape)\/([\w\.-]+)/i],[[c,"Netscape"],u],[/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i,/(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([\w\.-]+)$/i,/(mozilla)\/([\w\.]+).+rv\:.+gecko\/\d+/i,/(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\/\s]?([\w\.]+)/i,/(links)\s\(([\w\.]+)/i,/(gobrowser)\/?([\w\.]*)/i,/(ice\s?browser)\/v?([\w\._]+)/i,/(mosaic)[\/\s]([\w\.]+)/i],[c,u]],cpu:[[/(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\)]/i],[["architecture","amd64"]],[/(ia32(?=;))/i],[["architecture",h.lowerize]],[/((?:i[346]|x)86)[;\)]/i],[["architecture","ia32"]],[/windows\s(ce|mobile);\sppc;/i],[["architecture","arm"]],[/((?:ppc|powerpc)(?:64)?)(?:\smac|;|\))/i],[["architecture",/ower/,"",h.lowerize]],[/(sun4\w)[;\)]/i],[["architecture","sparc"]],[/((?:avr32|ia64(?=;))|68k(?=\))|arm(?:64|(?=v\d+;))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?(?=;)|pa-risc)/i],[["architecture",h.lowerize]]],device:[[/\((ipad|playbook);[\w\s\);-]+(rim|apple)/i],[a,l,[s,f]],[/applecoremedia\/[\w\.]+ \((ipad)/],[a,[l,"Apple"],[s,f]],[/(apple\s{0,1}tv)/i],[[a,"Apple TV"],[l,"Apple"]],[/(archos)\s(gamepad2?)/i,/(hp).+(touchpad)/i,/(hp).+(tablet)/i,/(kindle)\/([\w\.]+)/i,/\s(nook)[\w\s]+build\/(\w+)/i,/(dell)\s(strea[kpr\s\d]*[\dko])/i],[l,a,[s,f]],[/(kf[A-z]+)\sbuild\/.+silk\//i],[a,[l,"Amazon"],[s,f]],[/(sd|kf)[0349hijorstuw]+\sbuild\/.+silk\//i],[[a,d.str,v.device.amazon.model],[l,"Amazon"],[s,p]],[/\((ip[honed|\s\w*]+);.+(apple)/i],[a,l,[s,p]],[/\((ip[honed|\s\w*]+);/i],[a,[l,"Apple"],[s,p]],[/(blackberry)[\s-]?(\w+)/i,/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]*)/i,/(hp)\s([\w\s]+\w)/i,/(asus)-?(\w+)/i],[l,a,[s,p]],[/\(bb10;\s(\w+)/i],[a,[l,"BlackBerry"],[s,p]],[/android.+(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus 7|padfone)/i],[a,[l,"Asus"],[s,f]],[/(sony)\s(tablet\s[ps])\sbuild\//i,/(sony)?(?:sgp.+)\sbuild\//i],[[l,"Sony"],[a,"Xperia Tablet"],[s,f]],[/android.+\s([c-g]\d{4}|so[-l]\w+)\sbuild\//i],[a,[l,"Sony"],[s,p]],[/\s(ouya)\s/i,/(nintendo)\s([wids3u]+)/i],[l,a,[s,"console"]],[/android.+;\s(shield)\sbuild/i],[a,[l,"Nvidia"],[s,"console"]],[/(playstation\s[34portablevi]+)/i],[a,[l,"Sony"],[s,"console"]],[/(sprint\s(\w+))/i],[[l,d.str,v.device.sprint.vendor],[a,d.str,v.device.sprint.model],[s,p]],[/(lenovo)\s?(S(?:5000|6000)+(?:[-][\w+]))/i],[l,a,[s,f]],[/(htc)[;_\s-]+([\w\s]+(?=\))|\w+)*/i,/(zte)-(\w*)/i,/(alcatel|geeksphone|lenovo|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i],[l,[a,/_/g," "],[s,p]],[/(nexus\s9)/i],[a,[l,"HTC"],[s,f]],[/d\/huawei([\w\s-]+)[;\)]/i,/(nexus\s6p)/i],[a,[l,"Huawei"],[s,p]],[/(microsoft);\s(lumia[\s\w]+)/i],[l,a,[s,p]],[/[\s\(;](xbox(?:\sone)?)[\s\);]/i],[a,[l,"Microsoft"],[s,"console"]],[/(kin\.[onetw]{3})/i],[[a,/\./g," "],[l,"Microsoft"],[s,p]],[/\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?:?(\s4g)?)[\w\s]+build\//i,/mot[\s-]?(\w*)/i,/(XT\d{3,4}) build\//i,/(nexus\s6)/i],[a,[l,"Motorola"],[s,p]],[/android.+\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i],[a,[l,"Motorola"],[s,f]],[/hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i],[[l,h.trim],[a,h.trim],[s,"smarttv"]],[/hbbtv.+maple;(\d+)/i],[[a,/^/,"SmartTV"],[l,"Samsung"],[s,"smarttv"]],[/\(dtv[\);].+(aquos)/i],[a,[l,"Sharp"],[s,"smarttv"]],[/android.+((sch-i[89]0\d|shw-m380s|gt-p\d{4}|gt-n\d+|sgh-t8[56]9|nexus 10))/i,/((SM-T\w+))/i],[[l,"Samsung"],a,[s,f]],[/smart-tv.+(samsung)/i],[l,[s,"smarttv"],a],[/((s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+))/i,/(sam[sung]*)[\s-]*(\w+-?[\w-]*)/i,/sec-((sgh\w+))/i],[[l,"Samsung"],a,[s,p]],[/sie-(\w*)/i],[a,[l,"Siemens"],[s,p]],[/(maemo|nokia).*(n900|lumia\s\d+)/i,/(nokia)[\s_-]?([\w-]*)/i],[[l,"Nokia"],a,[s,p]],[/android\s3\.[\s\w;-]{10}(a\d{3})/i],[a,[l,"Acer"],[s,f]],[/android.+([vl]k\-?\d{3})\s+build/i],[a,[l,"LG"],[s,f]],[/android\s3\.[\s\w;-]{10}(lg?)-([06cv9]{3,4})/i],[[l,"LG"],a,[s,f]],[/(lg) netcast\.tv/i],[l,a,[s,"smarttv"]],[/(nexus\s[45])/i,/lg[e;\s\/-]+(\w*)/i,/android.+lg(\-?[\d\w]+)\s+build/i],[a,[l,"LG"],[s,p]],[/android.+(ideatab[a-z0-9\-\s]+)/i],[a,[l,"Lenovo"],[s,f]],[/linux;.+((jolla));/i],[l,a,[s,p]],[/((pebble))app\/[\d\.]+\s/i],[l,a,[s,"wearable"]],[/android.+;\s(oppo)\s?([\w\s]+)\sbuild/i],[l,a,[s,p]],[/crkey/i],[[a,"Chromecast"],[l,"Google"]],[/android.+;\s(glass)\s\d/i],[a,[l,"Google"],[s,"wearable"]],[/android.+;\s(pixel c)\s/i],[a,[l,"Google"],[s,f]],[/android.+;\s(pixel xl|pixel)\s/i],[a,[l,"Google"],[s,p]],[/android.+;\s(\w+)\s+build\/hm\1/i,/android.+(hm[\s\-_]*note?[\s_]*(?:\d\w)?)\s+build/i,/android.+(mi[\s\-_]*(?:one|one[\s_]plus|note lte)?[\s_]*(?:\d?\w?)[\s_]*(?:plus)?)\s+build/i,/android.+(redmi[\s\-_]*(?:note)?(?:[\s_]*[\w\s]+))\s+build/i],[[a,/_/g," "],[l,"Xiaomi"],[s,p]],[/android.+(mi[\s\-_]*(?:pad)(?:[\s_]*[\w\s]+))\s+build/i],[[a,/_/g," "],[l,"Xiaomi"],[s,f]],[/android.+;\s(m[1-5]\snote)\sbuild/i],[a,[l,"Meizu"],[s,f]],[/android.+a000(1)\s+build/i,/android.+oneplus\s(a\d{4})\s+build/i],[a,[l,"OnePlus"],[s,p]],[/android.+[;\/]\s*(RCT[\d\w]+)\s+build/i],[a,[l,"RCA"],[s,f]],[/android.+[;\/\s]+(Venue[\d\s]{2,7})\s+build/i],[a,[l,"Dell"],[s,f]],[/android.+[;\/]\s*(Q[T|M][\d\w]+)\s+build/i],[a,[l,"Verizon"],[s,f]],[/android.+[;\/]\s+(Barnes[&\s]+Noble\s+|BN[RT])(V?.*)\s+build/i],[[l,"Barnes & Noble"],a,[s,f]],[/android.+[;\/]\s+(TM\d{3}.*\b)\s+build/i],[a,[l,"NuVision"],[s,f]],[/android.+;\s(k88)\sbuild/i],[a,[l,"ZTE"],[s,f]],[/android.+[;\/]\s*(gen\d{3})\s+build.*49h/i],[a,[l,"Swiss"],[s,p]],[/android.+[;\/]\s*(zur\d{3})\s+build/i],[a,[l,"Swiss"],[s,f]],[/android.+[;\/]\s*((Zeki)?TB.*\b)\s+build/i],[a,[l,"Zeki"],[s,f]],[/(android).+[;\/]\s+([YR]\d{2})\s+build/i,/android.+[;\/]\s+(Dragon[\-\s]+Touch\s+|DT)(\w{5})\sbuild/i],[[l,"Dragon Touch"],a,[s,f]],[/android.+[;\/]\s*(NS-?\w{0,9})\sbuild/i],[a,[l,"Insignia"],[s,f]],[/android.+[;\/]\s*((NX|Next)-?\w{0,9})\s+build/i],[a,[l,"NextBook"],[s,f]],[/android.+[;\/]\s*(Xtreme\_)?(V(1[045]|2[015]|30|40|60|7[05]|90))\s+build/i],[[l,"Voice"],a,[s,p]],[/android.+[;\/]\s*(LVTEL\-)?(V1[12])\s+build/i],[[l,"LvTel"],a,[s,p]],[/android.+[;\/]\s*(V(100MD|700NA|7011|917G).*\b)\s+build/i],[a,[l,"Envizen"],[s,f]],[/android.+[;\/]\s*(Le[\s\-]+Pan)[\s\-]+(\w{1,9})\s+build/i],[l,a,[s,f]],[/android.+[;\/]\s*(Trio[\s\-]*.*)\s+build/i],[a,[l,"MachSpeed"],[s,f]],[/android.+[;\/]\s*(Trinity)[\-\s]*(T\d{3})\s+build/i],[l,a,[s,f]],[/android.+[;\/]\s*TU_(1491)\s+build/i],[a,[l,"Rotor"],[s,f]],[/android.+(KS(.+))\s+build/i],[a,[l,"Amazon"],[s,f]],[/android.+(Gigaset)[\s\-]+(Q\w{1,9})\s+build/i],[l,a,[s,f]],[/\s(tablet|tab)[;\/]/i,/\s(mobile)(?:[;\/]|\ssafari)/i],[[s,h.lowerize],l,a],[/(android[\w\.\s\-]{0,9});.+build/i],[a,[l,"Generic"]]],engine:[[/windows.+\sedge\/([\w\.]+)/i],[u,[c,"EdgeHTML"]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m)\/([\w\.]+)/i,/(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i,/(icab)[\/\s]([23]\.[\d\.]+)/i],[c,u],[/rv\:([\w\.]{1,9}).+(gecko)/i],[u,c]],os:[[/microsoft\s(windows)\s(vista|xp)/i],[c,u],[/(windows)\snt\s6\.2;\s(arm)/i,/(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s\w]*)/i,/(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)/i],[c,[u,d.str,v.os.windows.version]],[/(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i],[[c,"Windows"],[u,d.str,v.os.windows.version]],[/\((bb)(10);/i],[[c,"BlackBerry"],u],[/(blackberry)\w*\/?([\w\.]*)/i,/(tizen)[\/\s]([\w\.]+)/i,/(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|contiki)[\/\s-]?([\w\.]*)/i,/linux;.+(sailfish);/i],[c,u],[/(symbian\s?os|symbos|s60(?=;))[\/\s-]?([\w\.]*)/i],[[c,"Symbian"],u],[/\((series40);/i],[c],[/mozilla.+\(mobile;.+gecko.+firefox/i],[[c,"Firefox OS"],u],[/(nintendo|playstation)\s([wids34portablevu]+)/i,/(mint)[\/\s\(]?(\w*)/i,/(mageia|vectorlinux)[;\s]/i,/(joli|[kxln]?ubuntu|debian|suse|opensuse|gentoo|(?=\s)arch|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus)[\/\s-]?(?!chrom)([\w\.-]*)/i,/(hurd|linux)\s?([\w\.]*)/i,/(gnu)\s?([\w\.]*)/i],[c,u],[/(cros)\s[\w]+\s([\w\.]+\w)/i],[[c,"Chromium OS"],u],[/(sunos)\s?([\w\.\d]*)/i],[[c,"Solaris"],u],[/\s([frentopc-]{0,4}bsd|dragonfly)\s?([\w\.]*)/i],[c,u],[/(haiku)\s(\w+)/i],[c,u],[/cfnetwork\/.+darwin/i,/ip[honead]{2,4}(?:.*os\s([\w]+)\slike\smac|;\sopera)/i],[[u,/_/g,"."],[c,"iOS"]],[/(mac\sos\sx)\s?([\w\s\.]*)/i,/(macintosh|mac(?=_powerpc)\s)/i],[[c,"Mac OS"],[u,/_/g,"."]],[/((?:open)?solaris)[\/\s-]?([\w\.]*)/i,/(aix)\s((\d)(?=\.|\)|\s)[\w\.])*/i,/(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms)/i,/(unix)\s?([\w\.]*)/i],[c,u]]},y=function(e,t){if("object"==typeof e&&(t=e,e=void 0),!(this instanceof y))return new y(e,t).getResult();var n=e||(o&&o.navigator&&o.navigator.userAgent?o.navigator.userAgent:""),r=t?h.extend(m,t):m;return this.getBrowser=function(){var e={name:void 0,version:void 0};return d.rgx.call(e,n,r.browser),e.major=h.major(e.version),e},this.getCPU=function(){var e={architecture:void 0};return d.rgx.call(e,n,r.cpu),e},this.getDevice=function(){var e={vendor:void 0,model:void 0,type:void 0};return d.rgx.call(e,n,r.device),e},this.getEngine=function(){var e={name:void 0,version:void 0};return d.rgx.call(e,n,r.engine),e},this.getOS=function(){var e={name:void 0,version:void 0};return d.rgx.call(e,n,r.os),e},this.getResult=function(){return{ua:this.getUA(),browser:this.getBrowser(),engine:this.getEngine(),os:this.getOS(),device:this.getDevice(),cpu:this.getCPU()}},this.getUA=function(){return n},this.setUA=function(e){return n=e,this},this};y.VERSION="0.7.18",y.BROWSER={NAME:c,MAJOR:"major",VERSION:u},y.CPU={ARCHITECTURE:"architecture"},y.DEVICE={MODEL:a,VENDOR:l,TYPE:s,CONSOLE:"console",MOBILE:p,SMARTTV:"smarttv",TABLET:f,WEARABLE:"wearable",EMBEDDED:"embedded"},y.ENGINE={NAME:c,VERSION:u},y.OS={NAME:c,VERSION:u},void 0!==t?(void 0!==e&&e.exports&&(t=e.exports=y),t.UAParser=y):n(443)?void 0!==(r=function(){return y}.call(t,n,t,e))&&(e.exports=r):o&&(o.UAParser=y);var g=o&&(o.jQuery||o.Zepto);if(void 0!==g){var b=new y;g.ua=b.getResult(),g.ua.get=function(){return b.getUA()},g.ua.set=function(e){b.setUA(e);var t=b.getResult();for(var n in t)g.ua[n]=t[n]}}}("object"==typeof window?window:this)},function(e,t){(function(t){e.exports=t}).call(t,{})},function(e,t,n){"use strict";function r(e,t){var n=e.split(S);return n.length>1?n.some(function(e){return k.contains(e,t)}):(e=n[0].trim(),o(e,t))}function o(e,t){var n=e.split(x);if(n.length>0&&n.length<=2||C(!1),1===n.length)return i(n[0],t);var r=n[0],o=n[1];return d(r)&&d(o)||C(!1),i(">="+r,t)&&i("<="+o,t)}function i(e,t){if(""===(e=e.trim()))return!0;var n=t.split(w),r=f(e),o=r.modifier,i=r.rangeComponents;switch(o){case"<":return a(n,i);case"<=":return c(n,i);case">=":return l(n,i);case">":return u(n,i);case"~":case"~>":return p(n,i);default:return s(n,i)}}function a(e,t){return-1===b(e,t)}function c(e,t){var n=b(e,t);return-1===n||0===n}function s(e,t){return 0===b(e,t)}function l(e,t){var n=b(e,t);return 1===n||0===n}function u(e,t){return 1===b(e,t)}function p(e,t){var n=t.slice(),r=t.slice();r.length>1&&r.pop();var o=r.length-1,i=parseInt(r[o],10);return h(i)&&(r[o]=i+1+""),l(e,n)&&a(e,r)}function f(e){var t=e.split(w),n=t[0].match(M);return n||C(!1),{modifier:n[1],rangeComponents:[n[2]].concat(t.slice(1))}}function h(e){return!isNaN(e)&&isFinite(e)}function d(e){return!f(e).modifier}function v(e,t){for(var n=e.length;n<t;n++)e[n]="0"}function m(e,t){e=e.slice(),t=t.slice(),v(e,t.length);for(var n=0;n<t.length;n++){var r=t[n].match(/^[x*]$/i);if(r&&(t[n]=e[n]="0","*"===r[0]&&n===t.length-1))for(var o=n;o<e.length;o++)e[o]="0"}return v(t,e.length),[e,t]}function y(e,t){var n=e.match(z)[1],r=t.match(z)[1],o=parseInt(n,10),i=parseInt(r,10);return h(o)&&h(i)&&o!==i?g(o,i):g(e,t)}function g(e,t){return typeof e!=typeof t&&C(!1),e>t?1:e<t?-1:0}function b(e,t){for(var n=m(e,t),r=n[0],o=n[1],i=0;i<o.length;i++){var a=y(r[i],o[i]);if(a)return a}return 0}var C=n(10),w=/\./,S=/\|\|/,x=/\s+\-\s+/,M=/^(<=|<|=|>=|~>|~|>|)?\s*(.+)/,z=/^(\d*)(.*)/,k={contains:function(e,t){return r(e.trim(),t.trim())}};e.exports=k},function(e,t,n){"use strict";function r(e,t,n){if(!e)return null;var r={};for(var i in e)o.call(e,i)&&(r[i]=t.call(n,e[i],i,e));return r}var o=Object.prototype.hasOwnProperty;e.exports=r},function(e,t,n){"use strict";function r(e){var t={};return function(n){return t.hasOwnProperty(n)||(t[n]=e.call(this,n)),t[n]}}e.exports=r},function(e,t,n){"use strict";(function(t){function r(e,t){if(!e)return"[empty]";var n=o(e,t);return n.nodeType===Node.TEXT_NODE?n.textContent:(n instanceof Element||h(!1),n.outerHTML)}function o(e,t){var n=void 0!==t?t(e):[];if(e.nodeType===Node.TEXT_NODE){var r=e.textContent.length;return document.createTextNode("[text "+r+(n.length?" | "+n.join(", "):"")+"]")}var i=e.cloneNode();1===i.nodeType&&n.length&&i.setAttribute("data-labels",n.join(", "));for(var a=e.childNodes,c=0;c<a.length;c++)i.appendChild(o(a[c],t));return i}function i(e,t){for(var n=e;n;){if(n instanceof Element&&n.hasAttribute("contenteditable"))return r(n,t);n=n.parentNode}return"Could not find contentEditable parent of node"}function a(e){return null===e.nodeValue?e.childNodes.length:e.nodeValue.length}function c(e,n,r,o,i){if(p(document.documentElement,n)){var a=t.getSelection(),c=e.getAnchorKey(),u=e.getAnchorOffset(),f=e.getFocusKey(),h=e.getFocusOffset(),d=e.getIsBackward();if(!a.extend&&d){var v=c,m=u;c=f,u=h,f=v,h=m,d=!1}var y=c===r&&o<=u&&i>=u,g=f===r&&o<=h&&i>=h;if(y&&g)return a.removeAllRanges(),l(a,n,u-o,e),void s(a,n,h-o,e);if(d){if(g&&(a.removeAllRanges(),l(a,n,h-o,e)),y){var b=a.focusNode,C=a.focusOffset;a.removeAllRanges(),l(a,n,u-o,e),s(a,b,C,e)}}else y&&(a.removeAllRanges(),l(a,n,u-o,e)),g&&s(a,n,h-o,e)}}function s(e,t,n,r){var o=f();if(e.extend&&p(o,t)){n>a(t)&&u.logSelectionStateFailure({anonymizedDom:i(t),extraParams:JSON.stringify({offset:n}),selectionState:JSON.stringify(r.toJS())});var c=t===e.focusNode;try{e.extend(t,n)}catch(a){throw u.logSelectionStateFailure({anonymizedDom:i(t,function(t){var n=[];return t===o&&n.push("active element"),t===e.anchorNode&&n.push("selection anchor node"),t===e.focusNode&&n.push("selection focus node"),n}),extraParams:JSON.stringify({activeElementName:o?o.nodeName:null,nodeIsFocus:t===e.focusNode,nodeWasFocus:c,selectionRangeCount:e.rangeCount,selectionAnchorNodeName:e.anchorNode?e.anchorNode.nodeName:null,selectionAnchorOffset:e.anchorOffset,selectionFocusNodeName:e.focusNode?e.focusNode.nodeName:null,selectionFocusOffset:e.focusOffset,message:a?""+a:null,offset:n},null,2),selectionState:JSON.stringify(r.toJS(),null,2)}),a}}else{var s=e.getRangeAt(0);s.setEnd(t,n),e.addRange(s.cloneRange())}}function l(e,t,n,r){var o=document.createRange();n>a(t)&&u.logSelectionStateFailure({anonymizedDom:i(t),extraParams:JSON.stringify({offset:n}),selectionState:JSON.stringify(r.toJS())}),o.setStart(t,n),e.addRange(o)}var u=n(448),p=n(136),f=n(200),h=n(10);e.exports=c}).call(t,n(18))},function(e,t,n){"use strict";e.exports={logSelectionStateFailure:function(){return null}}},function(e,t,n){"use strict";function r(e){return o(e)&&3==e.nodeType}var o=n(450);e.exports=r},function(e,t,n){"use strict";function r(e){var t=e?e.ownerDocument||e:document,n=t.defaultView||window;return!(!e||!("function"==typeof n.Node?e instanceof n.Node:"object"==typeof e&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName))}e.exports=r},function(e,t,n){"use strict";function r(e){return null==e?e:String(e)}function o(e,t){var n=void 0;if(window.getComputedStyle&&(n=window.getComputedStyle(e,null)))return r(n.getPropertyValue(a(t)));if(document.defaultView&&document.defaultView.getComputedStyle){if(n=document.defaultView.getComputedStyle(e,null))return r(n.getPropertyValue(a(t)));if("display"===t)return"none"}return r(e.currentStyle?"float"===t?e.currentStyle.cssFloat||e.currentStyle.styleFloat:e.currentStyle[i(t)]:e.style&&e.style[i(t)])}var i=n(452),a=n(453);e.exports=o},function(e,t,n){"use strict";function r(e){return e.replace(o,function(e,t){return t.toUpperCase()})}var o=/-(.)/g;e.exports=r},function(e,t,n){"use strict";function r(e){return e.replace(o,"-$1").toLowerCase()}var o=/([A-Z])/g;e.exports=r},function(e,t,n){"use strict";function r(e){var t=o(e);return{x:t.left,y:t.top,width:t.right-t.left,height:t.bottom-t.top}}var o=n(455);e.exports=r},function(e,t,n){"use strict";function r(e){var t=e.ownerDocument.documentElement;if(!("getBoundingClientRect"in e&&o(t,e)))return{left:0,right:0,top:0,bottom:0};var n=e.getBoundingClientRect();return{left:Math.round(n.left)-t.clientLeft,right:Math.round(n.right)-t.clientLeft,top:Math.round(n.top)-t.clientTop,bottom:Math.round(n.bottom)-t.clientTop}}var o=n(136);e.exports=r},function(e,t,n){"use strict";function r(e){return e=e||document,e.scrollingElement?e.scrollingElement:o||"CSS1Compat"!==e.compatMode?e.body:e.documentElement}var o="undefined"!=typeof navigator&&navigator.userAgent.indexOf("AppleWebKit")>-1;e.exports=r},function(e,t,n){"use strict";function r(e){return e.Window&&e instanceof e.Window?{x:e.pageXOffset||e.document.documentElement.scrollLeft,y:e.pageYOffset||e.document.documentElement.scrollTop}:{x:e.scrollLeft,y:e.scrollTop}}e.exports=r},function(e,t,n){"use strict";function r(){var e=void 0;return document.documentElement&&(e=document.documentElement.clientWidth),!e&&document.body&&(e=document.body.clientWidth),e||0}function o(){var e=void 0;return document.documentElement&&(e=document.documentElement.clientHeight),!e&&document.body&&(e=document.body.clientHeight),e||0}function i(){return{width:window.innerWidth||r(),height:window.innerHeight||o()}}i.withoutScrollbars=function(){return{width:r(),height:o()}},e.exports=i},function(e,t,n){"use strict";function r(e){e||(e="");var t=void 0,n=arguments.length;if(n>1)for(var r=1;r<n;r++)(t=arguments[r])&&(e=(e?e+" ":"")+t);return e}e.exports=r},function(e,t,n){"use strict";function r(e,t){var n=null,r=null;if("function"==typeof document.caretRangeFromPoint){var o=document.caretRangeFromPoint(e.x,e.y);n=o.startContainer,r=o.startOffset}else{if(!e.rangeParent)return null;n=e.rangeParent,r=e.rangeOffset}n=h(n),r=h(r);var i=h(l(n));return p(t,i,r,i,r)}function o(e,t){var n=c.moveText(e.getCurrentContent(),e.getSelection(),t);return s.push(e,n,"insert-fragment")}function i(e,t,n){var r=c.insertText(e.getCurrentContent(),t,n,e.getCurrentInlineStyle());return s.push(e,r,"insert-fragment")}var a=n(202),c=n(22),s=n(15),l=n(139),u=n(204),p=n(205),f=n(67),h=n(30),d={onDragEnd:function(e){e.exitCurrentMode()},onDrop:function(e,t){var n=new a(t.nativeEvent.dataTransfer),c=e._latestEditorState,s=r(t.nativeEvent,c);if(t.preventDefault(),e.exitCurrentMode(),null!=s){var l=n.getFiles();if(l.length>0){if(e.props.handleDroppedFiles&&f(e.props.handleDroppedFiles(s,l)))return;return void u(l,function(t){t&&e.update(i(c,s,t))})}var p=e._internalDrag?"internal":"external";if(!e.props.handleDrop||!f(e.props.handleDrop(s,n,p)))return e._internalDrag?void e.update(o(c,s)):void e.update(i(c,s,n.getText()))}}};e.exports=d},function(e,t,n){"use strict";function r(e){return e.split("/")}var o={isImage:function(e){return"image"===r(e)[0]},isJpeg:function(e){var t=r(e);return o.isImage(e)&&("jpeg"===t[1]||"pjpeg"===t[1])}};e.exports=o},function(e,t,n){"use strict";function r(e){var t=e.length;if((Array.isArray(e)||"object"!=typeof e&&"function"!=typeof e)&&a(!1),"number"!=typeof t&&a(!1),0===t||t-1 in e||a(!1),"function"==typeof e.callee&&a(!1),e.hasOwnProperty)try{return Array.prototype.slice.call(e)}catch(e){}for(var n=Array(t),r=0;r<t;r++)n[r]=e[r];return n}function o(e){return!!e&&("object"==typeof e||"function"==typeof e)&&"length"in e&&!("setInterval"in e)&&"number"!=typeof e.nodeType&&(Array.isArray(e)||"callee"in e||"item"in e)}function i(e){return o(e)?Array.isArray(e)?e.slice():r(e):[e]}var a=n(10);e.exports=i},function(e,t,n){"use strict";var r=n(464),o=n(466),i=n(467),a=n(468),c=n(469),s=n(470),l=n(471),u=n(472),p=n(473),f=n(474),h=n(488),d=n(493),v={onBeforeInput:r,onBlur:o,onCompositionStart:i,onCopy:a,onCut:c,onDragOver:s,onDragStart:l,onFocus:u,onInput:p,onKeyDown:f,onPaste:h,onSelect:d};e.exports=v},function(e,t,n){"use strict";(function(t){function r(e){return y&&(e==v||e==m)}function o(e,t,n,r){var o=c.replaceText(e.getCurrentContent(),e.getSelection(),t,n,r);return s.push(e,o,"insert-characters")}function i(e,n){void 0!==e._pendingStateFromBeforeInput&&(e.update(e._pendingStateFromBeforeInput),e._pendingStateFromBeforeInput=void 0);var i=e._latestEditorState,c=n.data;if(c){if(e.props.handleBeforeInput&&p(e.props.handleBeforeInput(c,i)))return void n.preventDefault();var l=i.getSelection(),v=l.getStartOffset(),m=l.getEndOffset(),y=l.getAnchorKey();if(!l.isCollapsed()){n.preventDefault();return void(c===i.getCurrentContent().getPlainText().slice(v,m)?e.update(s.forceSelection(i,l.merge({focusOffset:m}))):e.update(o(i,c,i.getCurrentInlineStyle(),u(i.getCurrentContent(),i.getSelection()))))}var g=o(i,c,i.getCurrentInlineStyle(),u(i.getCurrentContent(),i.getSelection())),b=!1;if(b||(b=f(e._latestCommittedEditorState)),!b){var C=t.getSelection();if(C.anchorNode&&C.anchorNode.nodeType===Node.TEXT_NODE){var w=C.anchorNode.parentNode;b="SPAN"===w.nodeName&&w.firstChild.nodeType===Node.TEXT_NODE&&-1!==w.firstChild.nodeValue.indexOf("\t")}}if(!b){b=a.getFingerprint(i.getBlockTree(y))!==a.getFingerprint(g.getBlockTree(y))}if(b||(b=r(c)),b||(b=h(g.getDirectionMap()).get(y)!==h(i.getDirectionMap()).get(y)),b)return n.preventDefault(),void e.update(g);g=s.set(g,{nativelyRenderedContent:g.getCurrentContent()}),e._pendingStateFromBeforeInput=g,d(function(){void 0!==e._pendingStateFromBeforeInput&&(e.update(e._pendingStateFromBeforeInput),e._pendingStateFromBeforeInput=void 0)})}}var a=n(194),c=n(22),s=n(15),l=n(34),u=n(135),p=n(67),f=n(198),h=n(30),d=n(465),v="'",m="/",y=l.isBrowser("Firefox");e.exports=i}).call(t,n(18))},function(e,t,n){"use strict";(function(t){n(140),e.exports=t.setImmediate}).call(t,n(18))},function(e,t,n){"use strict";(function(t){function r(e,n){if(a()===document.body){var r=t.getSelection(),c=e.editor;1===r.rangeCount&&i(c,r.anchorNode)&&i(c,r.focusNode)&&r.removeAllRanges()}var s=e._latestEditorState,l=s.getSelection();if(l.getHasFocus()){var u=l.set("hasFocus",!1);e.props.onBlur&&e.props.onBlur(n),e.update(o.acceptSelection(s,u))}}var o=n(15),i=n(136),a=n(200);e.exports=r}).call(t,n(18))},function(e,t,n){"use strict";function r(e,t){e.setMode("composite"),e.update(o.set(e._latestEditorState,{inCompositionMode:!0})),e._onCompositionStart(t)}var o=n(15);e.exports=r},function(e,t,n){"use strict";function r(e,t){if(e._latestEditorState.getSelection().isCollapsed())return void t.preventDefault();e.setClipboard(o(e._latestEditorState))}var o=n(206);e.exports=r},function(e,t,n){"use strict";function r(e,t){var n=e._latestEditorState,r=n.getSelection(),i=t.target,a=void 0;if(r.isCollapsed())return void t.preventDefault();i instanceof Node&&(a=l(c.getScrollParent(i)));var u=s(n);e.setClipboard(u),e.setMode("cut"),setTimeout(function(){e.restoreEditorDOM(a),e.exitCurrentMode(),e.update(o(n))},0)}function o(e){var t=i.removeRange(e.getCurrentContent(),e.getSelection(),"forward");return a.push(e,t,"remove-range")}var i=n(22),a=n(15),c=n(137),s=n(206),l=n(138);e.exports=r},function(e,t,n){"use strict";function r(e,t){e._internalDrag=!1,e.setMode("drag"),t.preventDefault()}e.exports=r},function(e,t,n){"use strict";function r(e){e._internalDrag=!0,e.setMode("drag")}e.exports=r},function(e,t,n){"use strict";function r(e,t){var n=e._latestEditorState,r=n.getSelection();if(!r.getHasFocus()){var a=r.set("hasFocus",!0);e.props.onFocus&&e.props.onFocus(t),i.isBrowser("Chrome < 60.0.3081.0")?e.update(o.forceSelection(n,a)):e.update(o.acceptSelection(n,a))}}var o=n(15),i=n(34);e.exports=r},function(e,t,n){"use strict";(function(t){function r(e){void 0!==e._pendingStateFromBeforeInput&&(e.update(e._pendingStateFromBeforeInput),e._pendingStateFromBeforeInput=void 0);var n=t.getSelection(),r=n.anchorNode,s=n.isCollapsed,h=r.nodeType!==Node.TEXT_NODE,d=r.nodeType!==Node.TEXT_NODE&&r.nodeType!==Node.ELEMENT_NODE;if(o.draft_killswitch_allow_nontextnodes){if(h)return}else if(d)return;if(r.nodeType===Node.TEXT_NODE&&(null!==r.previousSibling||null!==r.nextSibling)){var v=r.parentNode;r.nodeValue=v.textContent;for(var m=v.firstChild;null!==m;m=m.nextSibling)m!==r&&v.removeChild(m)}var y=r.textContent,g=e._latestEditorState,b=u(l(r)),C=a.decode(b),w=C.blockKey,S=C.decoratorKey,x=C.leafKey,M=g.getBlockTree(w).getIn([S,"leaves",x]),z=M.start,k=M.end,_=g.getCurrentContent(),O=_.getBlockForKey(w),E=O.getText().slice(z,k);if(y.endsWith(f)&&(y=y.slice(0,-1)),y!==E){var T,N,V,P,H=g.getSelection(),L=H.merge({anchorOffset:z,focusOffset:k,isBackward:!1}),D=O.getEntityAt(z),A=D&&_.getEntity(D),I=A&&A.getMutability(),R="MUTABLE"===I,j=R?"spellcheck-change":"apply-entity",F=i.replaceText(_,L,y,O.getInlineStyleAt(z),R?O.getEntityAt(z):null);if(p)T=n.anchorOffset,N=n.focusOffset,V=z+Math.min(T,N),P=V+Math.abs(T-N),T=V,N=P;else{var K=y.length-E.length;V=H.getStartOffset(),P=H.getEndOffset(),T=s?P+K:V,N=P+K}var B=F.merge({selectionBefore:_.getSelectionAfter(),selectionAfter:H.merge({anchorOffset:T,focusOffset:N})});e.update(c.push(g,B,j))}}var o=n(42),i=n(22),a=n(68),c=n(15),s=n(34),l=n(139),u=n(30),p=s.isEngine("Gecko"),f="\n\n";e.exports=r}).call(t,n(18))},function(e,t,n){"use strict";function r(e,t){switch(e){case"redo":return a.redo(t);case"delete":return b(t);case"delete-word":return d(t);case"backspace":return g(t);case"backspace-word":return h(t);case"backspace-to-start-of-line":return f(t);case"split-block":return v(t);case"transpose-characters":return C(t);case"move-selection-to-start-of-block":return y(t);case"move-selection-to-end-of-block":return m(t);case"secondary-cut":return l.cut(t);case"secondary-paste":return l.paste(t);default:return t}}function o(e,t){var n=t.which,o=e._latestEditorState;switch(n){case s.RETURN:if(t.preventDefault(),e.props.handleReturn&&p(e.props.handleReturn(t,o)))return;break;case s.ESC:return t.preventDefault(),void(e.props.onEscape&&e.props.onEscape(t));case s.TAB:return void(e.props.onTab&&e.props.onTab(t));case s.UP:return void(e.props.onUpArrow&&e.props.onUpArrow(t));case s.RIGHT:return void(e.props.onRightArrow&&e.props.onRightArrow(t));case s.DOWN:return void(e.props.onDownArrow&&e.props.onDownArrow(t));case s.LEFT:return void(e.props.onLeftArrow&&e.props.onLeftArrow(t));case s.SPACE:if(x&&S(t)){t.preventDefault();var c=i.replaceText(o.getCurrentContent(),o.getSelection(),"\xa0");return void e.update(a.push(o,c,"insert-characters"))}}var l=e.props.keyBindingFn(t);if(l){if("undo"===l)return void w(t,o,e.update);if(t.preventDefault(),!e.props.handleKeyCommand||!p(e.props.handleKeyCommand(l,o))){var u=r(l,o);u!==o&&e.update(u)}}}var i=n(22),a=n(15),c=n(141),s=n(134),l=n(475),u=n(34),p=n(67),f=n(476),h=n(478),d=n(480),v=n(481),m=n(482),y=n(483),g=n(484),b=n(485),C=n(486),w=n(487),S=c.isOptionKeyCommand,x=u.isBrowser("Chrome");e.exports=o},function(e,t,n){"use strict";var r=n(22),o=n(15),i=n(89),a=n(30),c=null,s={cut:function(e){var t=e.getCurrentContent(),n=e.getSelection(),s=null;if(n.isCollapsed()){var l=n.getAnchorKey(),u=t.getBlockForKey(l).getLength();if(u===n.getAnchorOffset())return e;s=n.set("focusOffset",u)}else s=n;s=a(s),c=i(t,s);var p=r.removeRange(t,s,"forward");return p===t?e:o.push(e,p,"remove-range")},paste:function(e){if(!c)return e;var t=r.replaceWithFragment(e.getCurrentContent(),e.getSelection(),c);return o.push(e,t,"insert-fragment")}};e.exports=s},function(e,t,n){"use strict";(function(t){function r(e){var n=s(e,function(e){var n=e.getSelection();if(n.isCollapsed()&&0===n.getAnchorOffset())return c(e,1);var r=t.getSelection(),o=r.getRangeAt(0);return o=i(o),a(e,null,o.endContainer,o.endOffset,o.startContainer,o.startOffset).selectionState},"backward");return n===e.getCurrentContent()?e:o.push(e,n,"remove-range")}var o=n(15),i=n(477),a=n(208),c=n(142),s=n(69);e.exports=r}).call(t,n(18))},function(e,t,n){"use strict";function r(e){var t=getComputedStyle(e),n=document.createElement("div");n.style.fontFamily=t.fontFamily,n.style.fontSize=t.fontSize,n.style.fontStyle=t.fontStyle,n.style.fontWeight=t.fontWeight,n.style.lineHeight=t.lineHeight,n.style.position="absolute",n.textContent="M";var r=document.body;r||l(!1),r.appendChild(n);var o=n.getBoundingClientRect();return r.removeChild(n),o.height}function o(e,t){for(var n=1/0,r=1/0,o=-1/0,i=-1/0,a=0;a<e.length;a++){var c=e[a];0!==c.width&&1!==c.width&&(n=Math.min(n,c.top),r=Math.min(r,c.bottom),o=Math.max(o,c.top),i=Math.max(i,c.bottom))}return o<=r&&o-n<t&&i-r<t}function i(e){switch(e.nodeType){case Node.DOCUMENT_TYPE_NODE:return 0;case Node.TEXT_NODE:case Node.PROCESSING_INSTRUCTION_NODE:case Node.COMMENT_NODE:return e.length;default:return e.childNodes.length}}function a(e){e.collapsed||l(!1),e=e.cloneRange();var t=e.startContainer;1!==t.nodeType&&(t=t.parentNode);var n=r(t),a=e.endContainer,u=e.endOffset;for(e.setStart(e.startContainer,0);o(s(e),n)&&(a=e.startContainer,u=e.startOffset,a.parentNode||l(!1),e.setStartBefore(a),1!==a.nodeType||"inline"===getComputedStyle(a).display););for(var p=a,f=u-1;;){for(var h=p.nodeValue,d=f;d>=0;d--)if(!(null!=h&&d>0&&c.isSurrogatePair(h,d-1))){if(e.setStart(p,d),!o(s(e),n))break;a=p,u=d}if(-1===d||0===p.childNodes.length)break;p=p.childNodes[d],f=i(p)}return e.setStart(a,u),e}var c=n(51),s=n(207),l=n(10);e.exports=a},function(e,t,n){"use strict";function r(e){var t=c(e,function(e){var t=e.getSelection(),n=t.getStartOffset();if(0===n)return a(e,1);var r=t.getStartKey(),i=e.getCurrentContent(),c=i.getBlockForKey(r).getText().slice(0,n),s=o.getBackward(c);return a(e,s.length||1)},"backward");return t===e.getCurrentContent()?e:i.push(e,t,"remove-range")}var o=n(209),i=n(15),a=n(142),c=n(69);e.exports=r},function(e,t,n){"use strict";e.exports={getPunctuation:function(){return"[.,+*?$|#{}()'\\^\\-\\[\\]\\\\\\/!@%\"~=<>_:;\u30fb\u3001\u3002\u3008-\u3011\u3014-\u301f\uff1a-\uff1f\uff01-\uff0f\uff3b-\uff40\uff5b-\uff65\u2e2e\u061f\u066a-\u066c\u061b\u060c\u060d\ufd3e\ufd3f\u1801\u0964\u104a\u104b\u2010-\u2027\u2030-\u205e\xa1-\xb1\xb4-\xb8\xba\xbb\xbf]"}}},function(e,t,n){"use strict";function r(e){var t=c(e,function(e){var t=e.getSelection(),n=t.getStartOffset(),r=t.getStartKey(),i=e.getCurrentContent(),c=i.getBlockForKey(r).getText().slice(n),s=o.getForward(c);return a(e,s.length||1)},"forward");return t===e.getCurrentContent()?e:i.push(e,t,"remove-range")}var o=n(209),i=n(15),a=n(210),c=n(69);e.exports=r},function(e,t,n){"use strict";function r(e){var t=o.splitBlock(e.getCurrentContent(),e.getSelection());return i.push(e,t,"split-block")}var o=n(22),i=n(15);e.exports=r},function(e,t,n){"use strict";function r(e){var t=e.getSelection(),n=t.getEndKey(),r=e.getCurrentContent(),i=r.getBlockForKey(n).getLength();return o.set(e,{selection:t.merge({anchorKey:n,anchorOffset:i,focusKey:n,focusOffset:i,isBackward:!1}),forceSelection:!0})}var o=n(15);e.exports=r},function(e,t,n){"use strict";function r(e){var t=e.getSelection(),n=t.getStartKey();return o.set(e,{selection:t.merge({anchorKey:n,anchorOffset:0,focusKey:n,focusOffset:0,isBackward:!1}),forceSelection:!0})}var o=n(15);e.exports=r},function(e,t,n){"use strict";function r(e){var t=c(e,function(e){var t=e.getSelection(),n=e.getCurrentContent(),r=t.getAnchorKey(),o=t.getAnchorOffset(),c=n.getBlockForKey(r).getText()[o-1];return a(e,c?i.getUTF16Length(c,0):1)},"backward");if(t===e.getCurrentContent())return e;var n=e.getSelection();return o.push(e,t.set("selectionBefore",n),n.isCollapsed()?"backspace-character":"remove-range")}var o=n(15),i=n(51),a=n(142),c=n(69);e.exports=r},function(e,t,n){"use strict";function r(e){var t=c(e,function(e){var t=e.getSelection(),n=e.getCurrentContent(),r=t.getAnchorKey(),o=t.getAnchorOffset(),c=n.getBlockForKey(r).getText()[o];return a(e,c?i.getUTF16Length(c,0):1)},"forward");if(t===e.getCurrentContent())return e;var n=e.getSelection();return o.push(e,t.set("selectionBefore",n),n.isCollapsed()?"delete-character":"remove-range")}var o=n(15),i=n(51),a=n(210),c=n(69);e.exports=r},function(e,t,n){"use strict";function r(e){var t=e.getSelection();if(!t.isCollapsed())return e;var n=t.getAnchorOffset();if(0===n)return e;var r=t.getAnchorKey(),c=e.getCurrentContent(),s=c.getBlockForKey(r),l=s.getLength();if(l<=1)return e;var u,p;n===l?(u=t.set("anchorOffset",n-1),p=t):(u=t.set("focusOffset",n+1),p=u.set("anchorOffset",n+1));var f=a(c,u),h=o.removeRange(c,u,"backward"),d=h.getSelectionAfter(),v=d.getAnchorOffset()-1,m=d.merge({anchorOffset:v,focusOffset:v}),y=o.replaceWithFragment(h,m,f),g=i.push(e,y,"insert-fragment");return i.acceptSelection(g,p)}var o=n(22),i=n(15),a=n(89);e.exports=r},function(e,t,n){"use strict";function r(e,t,n){var r=o.undo(t);if("spellcheck-change"===t.getLastChangeType()){var i=r.getCurrentContent();return void n(o.set(r,{nativelyRenderedContent:i}))}if(e.preventDefault(),!t.getNativelyRenderedContent())return void n(r);n(o.set(t,{nativelyRenderedContent:null})),setTimeout(function(){n(r)},0)}var o=n(15);e.exports=r},function(e,t,n){"use strict";function r(e,t){t.preventDefault();var n=new s(t.clipboardData);if(!n.isRichText()){var r=n.getFiles(),y=n.getText();if(r.length>0){if(e.props.handlePastedFiles&&v(e.props.handlePastedFiles(r)))return;return void d(r,function(t){if(t=t||y){var n=e._latestEditorState,r=m(t),o=c.create({style:n.getCurrentInlineStyle(),entity:h(n.getCurrentContent(),n.getSelection())}),i=f.getCurrentBlockType(n),s=u.processText(r,o,i),d=a.createFromArray(s),v=l.replaceWithFragment(n.getCurrentContent(),n.getSelection(),d);e.update(p.push(n,v,"insert-fragment"))}})}}var g=[],b=n.getText(),C=n.getHTML(),w=e._latestEditorState;if(!e.props.handlePastedText||!v(e.props.handlePastedText(b,C,w))){if(b&&(g=m(b)),!e.props.stripPastedStyles){var S=e.getClipboard();if(n.isRichText()&&S){if(-1!==C.indexOf(e.getEditorKey())||1===g.length&&1===S.size&&S.first().getText()===b)return void e.update(o(e._latestEditorState,S))}else if(S&&n.types.includes("com.apple.webarchive")&&!n.types.includes("text/html")&&i(g,S))return void e.update(o(e._latestEditorState,S));if(C){var x=u.processHTML(C,e.props.blockRenderMap);if(x){var M=x.contentBlocks,z=x.entityMap;if(M){var k=a.createFromArray(M);return void e.update(o(e._latestEditorState,k,z))}}}e.setClipboard(null)}if(g.length){var _=c.create({style:w.getCurrentInlineStyle(),entity:h(w.getCurrentContent(),w.getSelection())}),O=f.getCurrentBlockType(w),E=u.processText(g,_,O),T=a.createFromArray(E);e.update(o(e._latestEditorState,T))}}}function o(e,t,n){var r=l.replaceWithFragment(e.getCurrentContent(),e.getSelection(),t);return p.push(e,r.set("entityMap",n),"insert-fragment")}function i(e,t){return e.length===t.size&&t.valueSeq().every(function(t,n){return t.getText()===e[n]})}var a=n(65),c=n(24),s=n(202),l=n(22),u=n(489),p=n(15),f=n(213),h=n(135),d=n(204),v=n(67),m=n(492);e.exports=r},function(e,t,n){"use strict";var r=n(20),o=r||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=(n(24),n(50)),a=n(26),c=n(42),s=n(11),l=n(211),u=n(36),p=n(212),f=n(131),h=s.List,d=s.Repeat,v=c.draft_tree_data_support,m=v?a:i,y={processHTML:function(e,t){return l(e,p,t)},processText:function(e,t,n){return e.reduce(function(e,r,i){r=f(r);var a=u(),c={key:a,type:n,text:r,characterList:h(d(t,r.length))};if(v&&0!==i){var s=i-1,l=e[s]=e[s].merge({nextSibling:a});c=o({},c,{prevSibling:l.getKey()})}return e.push(new m(c)),e},[])}};e.exports=y},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var o=function(){function e(t){r(this,e),this._uri=t}return e.prototype.toString=function(){return this._uri},e}();e.exports=o},function(e,t,n){"use strict";function r(e,t,n,r){var o=t.getStartKey(),i=t.getEndKey(),a=e.getBlockMap(),c=a.toSeq().skipUntil(function(e,t){return t===o}).takeUntil(function(e,t){return t===i}).concat([[i,a.get(i)]]).map(function(e){var t=e.getDepth()+n;return t=Math.max(0,Math.min(t,r)),e.set("depth",t)});return a=a.merge(c),e.merge({blockMap:a,selectionBefore:t,selectionAfter:t})}e.exports=r},function(e,t,n){"use strict";function r(e){return e.split(o)}var o=/\r\n?|\n/g;e.exports=r},function(e,t,n){"use strict";function r(e){if(!e._blockSelectEvents&&e._latestEditorState===e.props.editorState){var t=e.props.editorState,n=i.findDOMNode(e.editorContainer);n||c(!1),n.firstChild instanceof HTMLElement||c(!1);var r=a(t,n.firstChild),s=r.selectionState;s!==t.getSelection()&&(t=r.needsRecovery?o.forceSelection(t,s):o.acceptSelection(t,s),e.update(t))}}var o=n(15),i=n(9),a=n(494),c=n(10);e.exports=r},function(e,t,n){"use strict";(function(t){function r(e,n){var r=t.getSelection();return 0===r.rangeCount?{selectionState:e.getSelection().set("hasFocus",!1),needsRecovery:!1}:o(e,n,r.anchorNode,r.anchorOffset,r.focusNode,r.focusOffset)}var o=n(208);e.exports=r}).call(t,n(18))},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(0),c=n(58),s=function(e){function t(){return r(this,t),o(this,e.apply(this,arguments))}return i(t,e),t.prototype.shouldComponentUpdate=function(e){return this.props.text!==e.text||this.props.editorState.getSelection().getHasFocus()!==e.editorState.getSelection().getHasFocus()},t.prototype.render=function(){var e=this.props.editorState.getSelection().getHasFocus(),t=c({"public/DraftEditorPlaceholder/root":!0,"public/DraftEditorPlaceholder/hasFocus":e}),n={whiteSpace:"pre-wrap"};return a.createElement("div",{className:t},a.createElement("div",{className:c("public/DraftEditorPlaceholder/inner"),id:this.props.accessibilityID,style:n},this.props.text))},t}(a.Component);e.exports=s},function(e,t,n){"use strict";var r=n(20),o=r||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(50),a=n(26),c=n(215),s=n(497),l=n(498),u=n(10),p=function(e,t){return{key:e.getKey(),text:e.getText(),type:e.getType(),depth:e.getDepth(),inlineStyleRanges:l(e),entityRanges:s(e,t),data:e.getData().toObject()}},f=function(e,t,n,r){if(e instanceof i)return void n.push(p(e,t));e instanceof a||u(!1);var c=e.getParentKey(),s=r[e.getKey()]=o({},p(e,t),{children:[]});if(c)return void r[c].children.push(s);n.push(s)},h=function(e,t){var n=t.entityMap,r=[],o={},i={},a=0;return e.getBlockMap().forEach(function(e){e.findEntityRanges(function(e){return null!==e.getEntity()},function(t){var r=e.getEntityAt(t),o=c.stringify(r);i[o]||(i[o]=r,n[o]=""+a,a++)}),f(e,n,r,o)}),{blocks:r,entityMap:n}},d=function(e,t){var n=t.blocks,r=t.entityMap,o={};return Object.keys(r).forEach(function(t,n){var r=e.getEntity(c.unstringify(t));o[n]={type:r.getType(),mutability:r.getMutability(),data:r.getData()}}),{blocks:n,entityMap:o}},v=function(e){var t={entityMap:{},blocks:[]};return t=h(e,t),t=d(e,t)};e.exports=v},function(e,t,n){"use strict";function r(e,t){var n=[];return e.findEntityRanges(function(e){return!!e.getEntity()},function(r,i){var c=e.getText(),s=e.getEntityAt(r);n.push({offset:a(c.slice(0,r)),length:a(c.slice(r,i)),key:Number(t[o.stringify(s)])})}),n}var o=n(215),i=n(51),a=i.strlen;e.exports=r},function(e,t,n){"use strict";function r(e,t,n){var r=[],o=t.map(function(e){return e.has(n)}).toList();return a(o,c,s,function(t,o){var a=e.getText();r.push({offset:i.strlen(a.slice(0,t)),length:i.strlen(a.slice(t,o)),style:n})}),r}function o(e){var t=e.getCharacterList().map(function(e){return e.getStyle()}).toList(),n=t.flatten().toSet().map(function(n){return r(e,t,n)});return Array.prototype.concat.apply(l,n.toJS())}var i=n(51),a=n(66),c=function(e,t){return e===t},s=function(e){return!!e},l=[];e.exports=o},function(e,t,n){"use strict";var r=n(20),o=r||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(50),a=n(26),c=n(130),s=n(90),l=n(42),u=n(500),p=n(11),f=n(57),h=n(501),d=n(502),v=n(503),m=n(36),y=n(10),g=l.draft_tree_data_support,b=p.List,C=p.Map,w=p.OrderedMap,S=function(e,t){var n=e.key,r=e.type,o=e.data;return{text:e.text,depth:e.depth||0,type:r||"unstyled",key:n||m(),data:C(o),characterList:x(e,t)}},x=function(e,t){var n=e.text,r=e.entityRanges,i=e.inlineStyleRanges,a=r||[];return h(v(n,i||[]),d(n,a.filter(function(e){return t.hasOwnProperty(e.key)}).map(function(e){return o({},e,{key:t[e.key]})})))},M=function(e){return o({},e,{key:e.key||m()})},z=function(e,t,n){var r=t.map(function(e){return o({},e,{parentRef:n})});return e.concat(r.reverse())},k=function(e,t){return e.map(M).reduce(function(n,r,i){Array.isArray(r.children)||y(!1);var c=r.children.map(M),s=new a(o({},S(r,t),{prevSibling:0===i?null:e[i-1].key,nextSibling:i===e.length-1?null:e[i+1].key,children:b(c.map(function(e){return e.key}))}));n=n.set(s.getKey(),s);for(var l=z([],c,s);l.length>0;){var u=l.pop(),p=u.parentRef,f=p.getChildKeys(),h=f.indexOf(u.key),d=Array.isArray(u.children);if(!d){d||y(!1);break}var v=u.children.map(M),m=new a(o({},S(u,t),{parent:p.getKey(),children:b(v.map(function(e){return e.key})),prevSibling:0===h?null:f.get(h-1),nextSibling:h===f.size-1?null:f.get(h+1)}));n=n.set(m.getKey(),m),l=z(l,v,m)}return n},w())},_=function(e,t){return w(e.map(function(e){var n=new i(S(e,t));return[n.getKey(),n]}))},O=function(e,t){var n=Array.isArray(e.blocks[0].children),r=g&&!n?u.fromRawStateToRawTreeState(e).blocks:e.blocks;return g?k(r,t):_(n?u.fromRawTreeStateToRawState(e).blocks:r,t)},E=function(e){var t=e.entityMap,n={};return Object.keys(t).forEach(function(e){var r=t[e],o=r.type,i=r.mutability,a=r.data;n[e]=s.__create(o,i,a||{})}),n},T=function(e){Array.isArray(e.blocks)||y(!1);var t=E(e),n=O(e,t),r=n.isEmpty()?new f:f.createEmpty(n.first().getKey());return new c({blockMap:n,entityMap:t,selectionBefore:r,selectionAfter:r})};e.exports=T},function(e,t,n){"use strict";var r=n(20),o=r||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},i=n(10),a=function(e,t){for(var n=[].concat(e).reverse();n.length;){var r=n.pop();t(r);var o=r.children;Array.isArray(o)||i(!1),n=n.concat([].concat(o.reverse()))}},c=function(e){if(!e||!e.type)return!1;var t=e.type;return"unordered-list-item"===t||"ordered-list-item"===t},s=function(e){Array.isArray(e.children)&&(e.children=e.children.map(function(t){return t.type===e.type?o({},t,{depth:(e.depth||0)+1}):t}))},l={fromRawTreeStateToRawState:function(e){var t=e.blocks,n=[];return Array.isArray(t)||i(!1),Array.isArray(t)&&t.length?(a(t,function(e){var t=o({},e);c(e)&&(t.depth=t.depth||0,s(e)),delete t.children,n.push(t)}),e.blocks=n,o({},e,{blocks:n})):e},fromRawStateToRawTreeState:function(e){var t={},n=[];return e.blocks.forEach(function(e){var r=c(e),a=e.depth||0,s=o({},e,{children:[]});if(!r)return t={},void n.push(s);if(t[a]=s,a>0){var l=t[a-1];return l||i(!1),void l.children.push(s)}n.push(s)}),o({},e,{blocks:n})}};e.exports=l},function(e,t,n){"use strict";function r(e,t){var n=e.map(function(e,n){var r=t[n];return o.create({style:e,entity:r})});return a(n)}var o=n(24),i=n(11),a=i.List;e.exports=r},function(e,t,n){"use strict";function r(e,t){var n=Array(e.length).fill(null);return t&&t.forEach(function(t){for(var r=i(e,0,t.offset).length,o=r+i(e,t.offset,t.length).length,a=r;a<o;a++)n[a]=t.key}),n}var o=n(51),i=o.substr;e.exports=r},function(e,t,n){"use strict";function r(e,t){var n=Array(e.length).fill(s);return t&&t.forEach(function(t){for(var r=c(e,0,t.offset).length,o=r+c(e,t.offset,t.length).length;r<o;)n[r]=n[r].add(t.style),r++}),n}var o=n(11),i=o.OrderedSet,a=n(51),c=a.substr,s=i();e.exports=r},function(e,t,n){"use strict";function r(e){var t=e.getSelection();if(!t.rangeCount)return null;var n=t.getRangeAt(0),r=o(n),i=r.top,a=r.right,c=r.bottom,s=r.left;return 0===i&&0===a&&0===c&&0===s?null:r}var o=n(505);e.exports=r},function(e,t,n){"use strict";function r(e){var t=o(e),n=0,r=0,i=0,a=0;if(t.length){if(t.length>1&&0===t[0].width){var c=t[1];n=c.top,r=c.right,i=c.bottom,a=c.left}else{var s=t[0];n=s.top,r=s.right,i=s.bottom,a=s.left}for(var l=1;l<t.length;l++){var u=t[l];0!==u.height&&0!==u.width&&(n=Math.min(n,u.top),r=Math.max(r,u.right),i=Math.max(i,u.bottom),a=Math.min(a,u.left))}}return{top:n,right:r,bottom:i,left:a,width:r-a,height:i-n}}var o=n(207);e.exports=r},function(e,t,n){"use strict";(function(e,r){function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function c(){}var s=n(0),l=n.n(s),u=n(5),p=n.n(u),f=n(41),h=(n.n(f),n(59)),d=(n.n(h),n(140)),v=(n.n(d),n(7)),m=n.n(v),y=n(507),g=n(508),b=n(509),C=n(510),w=n(511),S=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},x=f.KeyBindingUtil.hasCommandModifier,M={},z={width:0,opacity:0,border:0,position:"absolute",left:0,top:0},k=Object(y.a)(),_=new g.a,O=function(t){function n(r){o(this,n);var a=i(this,t.call(this,r));a.cancelForceUpdateImmediate=function(){e(a.forceUpdateImmediate),a.forceUpdateImmediate=null},a.handlePastedText=function(e,t){var n=a.state.editorState;if(t){var r=n.getCurrentContent(),o=n.getSelection(),i=Object(w.a)(t,r),c=f.Modifier.replaceWithFragment(r,o,i),s=c.merge({selectionBefore:o,selectionAfter:c.getSelectionAfter().set("hasFocus",!0)});return a.setEditorState(f.EditorState.push(n,s,"insert-fragment"),!0),"handled"}return"not-handled"},a.plugins=Object(h.List)(Object(h.List)(r.plugins).flatten(!0));var c=void 0;return c=void 0!==r.value&&r.value instanceof f.EditorState?r.value||f.EditorState.createEmpty():f.EditorState.createEmpty(),c=a.generatorDefaultValue(c),a.state={plugins:a.reloadPlugins(),editorState:c,customStyleMap:{},customBlockStyleMap:{},compositeDecorator:null},void 0!==r.value&&(a.controlledMode=!0,console.warn("this component is in controllred mode")),a}return a(n,t),n.ToEditorState=function(e){var t=f.ContentState.createFromText(Object(C.a)(e)||""),n=f.EditorState.createWithContent(t);return f.EditorState.forceSelection(n,t.getSelectionAfter())},n.prototype.Reset=function(){var e=this.props.defaultValue,t=e?e.getCurrentContent():f.ContentState.createFromText(""),n=f.EditorState.push(this.state.editorState,t,"remove-range");this.setEditorState(f.EditorState.forceSelection(n,t.getSelectionBefore()))},n.prototype.SetText=function(e){var t=f.ContentState.createFromText(e||""),n=f.EditorState.push(this.state.editorState,t,"change-block-data");this.setEditorState(f.EditorState.moveFocusToEnd(n),!0)},n.prototype.getChildContext=function(){return{getEditorState:this.getEditorState,setEditorState:this.setEditorState}},n.prototype.reloadPlugins=function(){var e=this;return this.plugins&&this.plugins.size?this.plugins.map(function(t){if(t.callbacks)return t;if(t.hasOwnProperty("constructor")){var n=S(e.props.pluginConfig,t.config||{},M);return t.constructor(n)}return console.warn(">> \u63d2\u4ef6: [",t.name,"] \u65e0\u6548\u3002\u63d2\u4ef6\u6216\u8bb8\u5df2\u7ecf\u8fc7\u671f\u3002"),!1}).filter(function(e){return e}).toArray():[]},n.prototype.componentWillMount=function(){var e=this.initPlugins().concat([k]),t={},n={},r=Object(h.Map)(f.DefaultDraftBlockRenderMap),o=Object(h.List)([]),i=new f.CompositeDecorator(e.filter(function(e){return void 0!==e.decorators}).map(function(e){return e.decorators}).reduce(function(e,t){return e.concat(t)},[])),a=Object(h.List)(e.filter(function(e){return!!e.component&&"toolbar"!==e.name}));e.forEach(function(e){var i=e.styleMap,a=e.blockStyleMap,c=e.blockRenderMap,s=e.toHtml;if(i)for(var l in i)i.hasOwnProperty(l)&&(t[l]=i[l]);if(a)for(var u in a)a.hasOwnProperty(u)&&(n[u]=a[u],r=r.set(u,{element:null}));if(s&&(o=o.push(s)),c)for(var p in c)c.hasOwnProperty(p)&&(r=r.set(p,c[p]))}),_.set("customStyleMap",t),_.set("customBlockStyleMap",n),_.set("blockRenderMap",r),_.set("customStyleFn",this.customStyleFn.bind(this)),_.set("toHTMLList",o),this.setState({toolbarPlugins:a,compositeDecorator:i}),this.setEditorState(f.EditorState.set(this.state.editorState,{decorator:i}),!1,!1)},n.prototype.componentWillReceiveProps=function(e){if(this.forceUpdateImmediate&&this.cancelForceUpdateImmediate(),this.controlledMode){var t=e.value.getDecorator(),n=t?e.value:f.EditorState.set(e.value,{decorator:this.state.compositeDecorator});this.setState({editorState:n})}},n.prototype.componentWillUnmount=function(){this.cancelForceUpdateImmediate()},n.prototype.generatorDefaultValue=function(e){var t=this.props.defaultValue;return t||e},n.prototype.getStyleMap=function(){return _.get("customStyleMap")},n.prototype.setStyleMap=function(e){_.set("customStyleMap",e),this.render()},n.prototype.initPlugins=function(){var e=this,t=["focus","getEditorState","setEditorState","getStyleMap","setStyleMap"];return this.getPlugins().map(function(n){return t.forEach(function(t){n.callbacks.hasOwnProperty(t)&&(n.callbacks[t]=e[t].bind(e))}),n})},n.prototype.focusEditor=function(e){this.refs.editor.focus(e),this.props.readOnly&&this._focusDummy.focus(),this.props.onFocus&&this.props.onFocus(e)},n.prototype._focus=function(e){if(e&&e.nativeEvent&&e.nativeEvent.target&&(!document.activeElement||"true"!==document.activeElement.getAttribute("contenteditable")))return this.focus(e)},n.prototype.focus=function(e){var t=this,n=e&&e.nativeEvent;if(n&&n.target===this._editorWrapper){var r=this.state.editorState,o=r.getSelection();if(!o.getHasFocus()&&o.isCollapsed())return this.setState({editorState:f.EditorState.moveSelectionToEnd(r)},function(){t.focusEditor(e)})}this.focusEditor(e)},n.prototype.getPlugins=function(){return this.state.plugins.slice()},n.prototype.getEventHandler=function(){var e=this,t=["onUpArrow","onDownArrow","handleReturn","onFocus","onBlur","onTab","handlePastedText"],n={};return t.forEach(function(t){n[t]=e.generatorEventHandler(t)}),n},n.prototype.getEditorState=function(){return arguments.length>0&&void 0!==arguments[0]&&arguments[0]&&this.refs.editor.focus(),this.state.editorState},n.prototype.setEditorState=function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],o=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],i=e;this.getPlugins().forEach(function(e){if(e.onChange){var t=e.onChange(i);t&&(i=t)}}),this.props.onChange&&o&&(this.props.onChange(i),this.controlledMode&&(this.forceUpdateImmediate=r(function(){return t.setState({editorState:new f.EditorState(t.state.editorState.getImmutable())})}))),this.controlledMode||this.setState({editorState:i},n?function(){return r(function(){return t.refs.editor.focus()})}:c)},n.prototype.handleKeyBinding=function(e){if(this.props.onKeyDown){e.ctrlKey=x(e);var t=this.props.onKeyDown(e);return t||Object(f.getDefaultKeyBinding)(e)}return Object(f.getDefaultKeyBinding)(e)},n.prototype.handleKeyCommand=function(e){return this.props.multiLines?this.eventHandle("handleKeyBinding",e):"split-block"===e?"handled":"not-handled"},n.prototype.getBlockStyle=function(e){var t=_.get("customBlockStyleMap"),n=e.getType();return t.hasOwnProperty(n)?t[n]:""},n.prototype.blockRendererFn=function(e){var t=null;return this.getPlugins().forEach(function(n){if(n.blockRendererFn){var r=n.blockRendererFn(e);r&&(t=r)}}),t},n.prototype.eventHandle=function(e){for(var t,n=this.getPlugins(),r=arguments.length,o=Array(r>1?r-1:0),i=1;i<r;i++)o[i-1]=arguments[i];for(var a=0;a<n.length;a++){var c=n[a];if(c.callbacks[e]&&"function"==typeof c.callbacks[e]){var s;if(!0===(s=c.callbacks)[e].apply(s,o))return"handled"}}return this.props.hasOwnProperty(e)&&!0===(t=this.props)[e].apply(t,o)?"handled":"not-handled"},n.prototype.generatorEventHandler=function(e){var t=this;return function(){for(var n=arguments.length,r=Array(n),o=0;o<n;o++)r[o]=arguments[o];return t.eventHandle.apply(t,[e].concat(r))}},n.prototype.customStyleFn=function(e){if(0===e.size)return{};for(var t=this.getPlugins(),n={},r=0;r<t.length;r++)if(t[r].customStyleFn){var o=t[r].customStyleFn(e);o&&S(n,o)}return n},n.prototype.render=function(){var e,t=this,n=this.props,r=n.prefixCls,o=n.toolbars,i=n.style,a=n.readOnly,c=n.multiLines,s=this.state,u=s.editorState,p=s.toolbarPlugins,h=_.get("customStyleMap"),d=_.get("blockRenderMap"),v=this.getEventHandler(),y=k.component,g=m()((e={},e[r+"-editor"]=!0,e.readonly=a,e.oneline=!c,e));return l.a.createElement("div",{style:i,className:g,onClick:this._focus.bind(this)},l.a.createElement(y,{editorState:u,prefixCls:r,className:r+"-toolbar",plugins:p,toolbars:o}),l.a.createElement("div",{className:r+"-editor-wrapper",ref:function(e){return t._editorWrapper=e},style:i,onClick:function(e){return e.preventDefault()}},l.a.createElement(f.Editor,S({},this.props,v,{ref:"editor",customStyleMap:h,customStyleFn:this.customStyleFn.bind(this),editorState:u,handleKeyCommand:this.handleKeyCommand.bind(this),keyBindingFn:this.handleKeyBinding.bind(this),onChange:this.setEditorState.bind(this),blockStyleFn:this.getBlockStyle.bind(this),blockRenderMap:d,handlePastedText:this.handlePastedText,blockRendererFn:this.blockRendererFn.bind(this)})),a?l.a.createElement("input",{style:z,ref:function(e){return t._focusDummy=e},onBlur:v.onBlur}):null,this.props.children))},n}(l.a.Component);O.GetText=C.b,O.GetHTML=Object(b.a)(_),O.defaultProps={multiLines:!0,plugins:[],prefixCls:"rc-editor-core",pluginConfig:{},toolbars:[],spilitLine:"enter"},O.childContextTypes={getEditorState:p.a.func,setEditorState:p.a.func},t.a=O}).call(t,n(216).clearImmediate,n(216).setImmediate)},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function c(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function l(){}function u(e){}function p(){function e(e){}var t=(arguments.length>0&&void 0!==arguments[0]&&arguments[0],{onChange:e,onUpArrow:u,onDownArrow:u,getEditorState:u,setEditorState:u,handleReturn:u});return{name:"toolbar",decorators:[],callbacks:t,onChange:function(e){return t.onChange?t.onChange(e):e},component:g}}var f=n(0),h=n.n(f),d=n(59),v=function(e){function t(){return r(this,t),o(this,e.apply(this,arguments))}return i(t,e),t.prototype.render=function(){return h.a.createElement("div",null,this.props.children)},t}(h.a.Component),m=v,y=function(e){function t(n){a(this,t);var r=c(this,e.call(this,n)),o={};return n.plugins.forEach(function(e){o[e.name]=e}),r.pluginsMap=Object(d.Map)(o),r.state={editorState:n.editorState,toolbars:[]},r}return s(t,e),t.prototype.renderToolbarItem=function(e,t){var n=this.pluginsMap.get(e);if(n&&n.component){var r=n.component,o={key:"toolbar-item-"+t,onClick:r.props?r.props.onClick:l};return h.a.isValidElement(r)?h.a.cloneElement(r,o):h.a.createElement(r,o)}return null},t.prototype.conpomentWillReceiveProps=function(e){this.render()},t.prototype.render=function(){var e=this,t=this.props,n=t.toolbars,r=t.prefixCls;return h.a.createElement("div",{className:r+"-toolbar"},n.map(function(t,n){var r=h.a.Children.map(t,e.renderToolbarItem.bind(e));return h.a.createElement(m,{key:"toolbar-"+n},r)}))},t}(h.a.Component),g=y;t.a=p},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var o=n(59),i=(n.n(o),function(){function e(){r(this,e),this._store=Object(o.Map)()}return e.prototype.set=function(e,t){this._store=this._store.set(e,t)},e.prototype.get=function(e){return this._store.get(e)},e}());t.a=i},function(e,t,n){"use strict";function r(e,t){return e+t.charAt(0).toUpperCase()+t.substring(1)}function o(e){return e.split("&").join("&amp;").split("<").join("&lt;").split(">").join("&gt;").split("\xa0").join("&nbsp;").split("\n").join("<br >\n")}function i(e){return e.replace(C,"-$1").toLowerCase().replace(g,"-$1-")}function a(e,t){var n=void 0;return"string"==typeof t?n=b.test(t):(n=!0,t=String(t)),n&&"0"!==t&&!0!==d[e]?t+"px":t}function c(e){return e?Object.keys(e).map(function(t){return i(t)+":"+a(t,e[t])}).join(";"):""}function s(e){return function(t){var n=t.getCurrentContent(),r=n.getBlockMap(),i=e.get("customStyleMap")||{},a=e.get("blockRenderMap")||{},s=e.get("customStyleFn"),u=e.get("toHTMLList");return v(i,y),r.map(function(e){var t="<div>",r="</div>",p=e.getText(),f=e.getType(),h=a.get(f);if(h){var d="function"==typeof h.element?h.elementTag||"div":"div";t="<"+(d||"div")+' style="'+c(a.get(f).style||{})+'">',r="</"+(d||"div")+">"}for(var m=e.getCharacterList(),y=null,g=null,b=[],C=0,w=0,S=p.length;w<S;w++){g=y;var x=m.get(w);y=x?x.getEntity():null,w>0&&y!==g&&(b.push([g,l(p.slice(C,w),m.slice(C,w))]),C=w)}return b.push([y,l(p.slice(C),m.slice(C))]),b.map(function(e){var r=e[0],a=e[1],l=a.map(function(e){return e[0]}).join(""),p=a.map(function(e){var t=e[0],n=e[1],r=o(t);if(n.size){var a={};n.forEach(function(e){if(i.hasOwnProperty(e)){var t=i[e];a=v(a,t)}});var l=s(n);return a=v(a,l),'<span style="'+c(a)+'">'+r+"</span>"}return"<span>"+r+"</span>"}).join("");if(r){var f=n.getEntity(r),h=f.getData();if(h&&h.export)t+=h.export(p,h);else{var d="";u.forEach(function(e){var t=e(l,f,n);t&&(d=t)}),d&&(t+=d)}}else t+=p}),t+=r}).join("\n")}}function l(e,t){for(var n=m,r=m,o=[],i=0,a=0,c=e.length;a<c;a++){r=n;var s=t.get(a);n=s?s.getStyle():m,a>0&&!Object(p.is)(n,r)&&(o.push([e.slice(i,a),r]),i=a)}return o.push([e.slice(i),n]),o}var u=n(41),p=n(59),f={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridRow:!0,gridColumn:!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},h=["Webkit","ms","Moz","O"];Object.keys(f).forEach(function(e){h.forEach(function(t){f[r(t,e)]=f[e]})});var d=f;t.a=s;var v=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},m=Object(p.OrderedSet)(),y=u.DefaultDraftInlineStyle,g=/^(moz|ms|o|webkit)-/,b=/^\d+$/,C=/([A-Z])/g},function(e,t,n){"use strict";function r(e){return e.split("&").join("&amp;").split("<").join("&lt;").split(">").join("&gt;").split("\xa0").join("&nbsp;").split("\n").join("<br />\n")}function o(e){return e.split("<br />\n").join("\n")}function i(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{encode:!1},n=e.getCurrentContent(),o=n.getBlockMap(),i=t.encode;return o.map(function(e){var t="",o=0,a=e.getText();return e.findEntityRanges(function(e){return!!e.getEntity()},function(r,i){var c=e.getEntityAt(r),s=n.getEntity(c).getData();t+=a.slice(o,r),t+=s&&s.export?s.export(s):a.slice(r,i),o=i}),t+=a.slice(o),i?r(t):t}).join(i?"<br />\n":"\n")}t.a=o,t.b=i},function(e,t,n){"use strict";function r(e,t){var n=(new DOMParser).parseFromString(e,"text/html");a()(n.querySelectorAll("img")).forEach(f);var r=Object(o.convertFromHTML)(n.body.innerHTML),i=r.contentBlocks;return i=i.reduce(function(e,n){if("blockquote"!==n.getType())return e.concat(n);var r=JSON.parse(n.getText());t.createEntity("IMAGE-ENTITY","IMMUTABLE",r);var i=t.getLastCreatedEntityKey(),a=o.CharacterMetadata.create({entity:i}),s=[new o.ContentBlock({key:Object(o.genKey)(),type:"image-block",text:" ",characterList:Object(c.List)(Object(c.Repeat)(a,a.count()))}),new o.ContentBlock({key:Object(o.genKey)(),type:"unstyled",text:"",characterList:Object(c.List)()})];return e.concat(s)},[]),n=null,o.BlockMapBuilder.createFromArray(i)}t.a=r;var o=n(41),i=(n.n(o),n(512)),a=n.n(i),c=n(59),s=(n.n(c),function(e){return{contentType:"image",src:e.getAttribute("src"),width:e.getAttribute("width"),height:e.getAttribute("height"),align:e.style.cssFloat}}),l=function(e){if(null==e)return null;var t=document.createElement("blockquote");return t.innerText=JSON.stringify(e),t},u=function(e,t){if(t instanceof HTMLElement){return e.parentNode.replaceChild(t,e)}},p=function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];var r=arguments,o=r.length-1;return function(){for(var e=o,t=r[o].apply(this,arguments);e--;)t=r[e].call(this,t);return t}}(l,s),f=function(e){return u(e,p(e))}},function(e,t,n){function r(e){if(!e)return[];if(c(e))return s(e)?f(e):i(e);if(m&&e[m])return l(e[m]());var t=a(e);return(t==d?u:t==v?p:h)(e)}var o=n(61),i=n(184),a=n(217),c=n(64),s=n(516),l=n(517),u=n(219),p=n(91),f=n(518),h=n(522),d="[object Map]",v="[object Set]",m=o?o.iterator:void 0;e.exports=r},function(e,t,n){var r=n(49),o=n(29),i=r(o,"DataView");e.exports=i},function(e,t,n){var r=n(49),o=n(29),i=r(o,"Promise");e.exports=i},function(e,t,n){var r=n(49),o=n(29),i=r(o,"WeakMap");e.exports=i},function(e,t,n){function r(e){return"string"==typeof e||!i(e)&&a(e)&&o(e)==c}var o=n(48),i=n(33),a=n(40),c="[object String]";e.exports=r},function(e,t){function n(e){for(var t,n=[];!(t=e.next()).done;)n.push(t.value);return n}e.exports=n},function(e,t,n){function r(e){return i(e)?a(e):o(e)}var o=n(519),i=n(520),a=n(521);e.exports=r},function(e,t){function n(e){return e.split("")}e.exports=n},function(e,t){function n(e){return r.test(e)}var r=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");e.exports=n},function(e,t){function n(e){return e.match(p)||[]}var r="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",o="\\ud83c[\\udffb-\\udfff]",i="(?:\\ud83c[\\udde6-\\uddff]){2}",a="[\\ud800-\\udbff][\\udc00-\\udfff]",c="(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?",s="(?:\\u200d(?:"+["[^\\ud800-\\udfff]",i,a].join("|")+")[\\ufe0e\\ufe0f]?"+c+")*",l="[\\ufe0e\\ufe0f]?"+c+s,u="(?:"+["[^\\ud800-\\udfff]"+r+"?",r,i,a,"[\\ud800-\\udfff]"].join("|")+")",p=RegExp(o+"(?="+o+")|"+u+l,"g");e.exports=n},function(e,t,n){function r(e){return null==e?[]:o(e,i(e))}var o=n(523),i=n(143);e.exports=r},function(e,t,n){function r(e,t){return o(t,function(t){return e[t]})}var o=n(176);e.exports=r},function(e,t,n){function r(e){if(!o(e))return i(e);var t=[];for(var n in Object(e))c.call(e,n)&&"constructor"!=n&&t.push(n);return t}var o=n(126),i=n(525),a=Object.prototype,c=a.hasOwnProperty;e.exports=r},function(e,t,n){var r=n(186),o=r(Object.keys,Object);e.exports=o},function(e,t,n){"use strict";var r=function(){};e.exports=r},function(e,t,n){function r(e,t){return e&&e.length?i(e,o(t,2)):[]}var o=n(528),i=n(550);e.exports=r},function(e,t,n){function r(e){return"function"==typeof e?e:null==e?a:"object"==typeof e?c(e)?i(e[0],e[1]):o(e):s(e)}var o=n(529),i=n(544),a=n(129),c=n(33),s=n(547);e.exports=r},function(e,t,n){function r(e){var t=i(e);return 1==t.length&&t[0][2]?a(t[0][0],t[0][1]):function(n){return n===e||o(n,e,t)}}var o=n(530),i=n(543),a=n(225);e.exports=r},function(e,t,n){function r(e,t,n,r){var s=n.length,l=s,u=!r;if(null==e)return!l;for(e=Object(e);s--;){var p=n[s];if(u&&p[2]?p[1]!==e[p[0]]:!(p[0]in e))return!1}for(;++s<l;){p=n[s];var f=p[0],h=e[f],d=p[1];if(u&&p[2]){if(void 0===h&&!(f in e))return!1}else{var v=new o;if(r)var m=r(h,d,f,e,t,v);if(!(void 0===m?i(d,h,a|c,r,v):m))return!1}}return!0}var o=n(124),i=n(220),a=1,c=2;e.exports=r},function(e,t,n){function r(e,t,n,r,m,g){var b=l(e),C=l(t),w=b?d:s(e),S=C?d:s(t);w=w==h?v:w,S=S==h?v:S;var x=w==v,M=S==v,z=w==S;if(z&&u(e)){if(!u(t))return!1;b=!0,x=!1}if(z&&!x)return g||(g=new o),b||p(e)?i(e,t,n,r,m,g):a(e,t,w,n,r,m,g);if(!(n&f)){var k=x&&y.call(e,"__wrapped__"),_=M&&y.call(t,"__wrapped__");if(k||_){var O=k?e.value():e,E=_?t.value():t;return g||(g=new o),m(O,E,n,r,g)}}return!!z&&(g||(g=new o),c(e,t,n,r,m,g))}var o=n(124),i=n(221),a=n(535),c=n(536),s=n(217),l=n(33),u=n(127),p=n(128),f=1,h="[object Arguments]",d="[object Array]",v="[object Object]",m=Object.prototype,y=m.hasOwnProperty;e.exports=r},function(e,t){function n(e){return this.__data__.set(e,r),this}var r="__lodash_hash_undefined__";e.exports=n},function(e,t){function n(e){return this.__data__.has(e)}e.exports=n},function(e,t){function n(e,t){for(var n=-1,r=null==e?0:e.length;++n<r;)if(t(e[n],n,e))return!0;return!1}e.exports=n},function(e,t,n){function r(e,t,n,r,o,x,z){switch(n){case S:if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case w:return!(e.byteLength!=t.byteLength||!x(new i(e),new i(t)));case f:case h:case m:return a(+e,+t);case d:return e.name==t.name&&e.message==t.message;case y:case b:return e==t+"";case v:var k=s;case g:var _=r&u;if(k||(k=l),e.size!=t.size&&!_)return!1;var O=z.get(e);if(O)return O==t;r|=p,z.set(e,t);var E=c(k(e),k(t),r,o,x,z);return z.delete(e),E;case C:if(M)return M.call(e)==M.call(t)}return!1}var o=n(61),i=n(183),a=n(62),c=n(221),s=n(219),l=n(91),u=1,p=2,f="[object Boolean]",h="[object Date]",d="[object Error]",v="[object Map]",m="[object Number]",y="[object RegExp]",g="[object Set]",b="[object String]",C="[object Symbol]",w="[object ArrayBuffer]",S="[object DataView]",x=o?o.prototype:void 0,M=x?x.valueOf:void 0;e.exports=r},function(e,t,n){function r(e,t,n,r,a,s){var l=n&i,u=o(e),p=u.length;if(p!=o(t).length&&!l)return!1;for(var f=p;f--;){var h=u[f];if(!(l?h in t:c.call(t,h)))return!1}var d=s.get(e);if(d&&s.get(t))return d==t;var v=!0;s.set(e,t),s.set(t,e);for(var m=l;++f<p;){h=u[f];var y=e[h],g=t[h];if(r)var b=l?r(g,y,h,t,e,s):r(y,g,h,e,t,s);if(!(void 0===b?y===g||a(y,g,n,r,s):b)){v=!1;break}m||(m="constructor"==h)}if(v&&!m){var C=e.constructor,w=t.constructor;C!=w&&"constructor"in e&&"constructor"in t&&!("function"==typeof C&&C instanceof C&&"function"==typeof w&&w instanceof w)&&(v=!1)}return s.delete(e),s.delete(t),v}var o=n(537),i=1,a=Object.prototype,c=a.hasOwnProperty;e.exports=r},function(e,t,n){function r(e){return o(e,a,i)}var o=n(538),i=n(540),a=n(143);e.exports=r},function(e,t,n){function r(e,t,n){var r=t(e);return i(e)?r:o(r,n(e))}var o=n(539),i=n(33);e.exports=r},function(e,t){function n(e,t){for(var n=-1,r=t.length,o=e.length;++n<r;)e[o+n]=t[n];return e}e.exports=n},function(e,t,n){var r=n(541),o=n(542),i=Object.prototype,a=i.propertyIsEnumerable,c=Object.getOwnPropertySymbols,s=c?function(e){return null==e?[]:(e=Object(e),r(c(e),function(t){return a.call(e,t)}))}:o;e.exports=s},function(e,t){function n(e,t){for(var n=-1,r=null==e?0:e.length,o=0,i=[];++n<r;){var a=e[n];t(a,n,e)&&(i[o++]=a)}return i}e.exports=n},function(e,t){function n(){return[]}e.exports=n},function(e,t,n){function r(e){for(var t=i(e),n=t.length;n--;){var r=t[n],a=e[r];t[n]=[r,a,o(a)]}return t}var o=n(224),i=n(143);e.exports=r},function(e,t,n){function r(e,t){return c(e)&&s(t)?l(u(e),t):function(n){var r=i(n,e);return void 0===r&&r===t?a(n,e):o(t,r,p|f)}}var o=n(220),i=n(122),a=n(545),c=n(116),s=n(224),l=n(225),u=n(63),p=1,f=2;e.exports=r},function(e,t,n){function r(e,t){return null!=e&&i(e,t,o)}var o=n(546),i=n(174);e.exports=r},function(e,t){function n(e,t){return null!=e&&t in Object(e)}e.exports=n},function(e,t,n){function r(e){return a(e)?o(c(e)):i(e)}var o=n(548),i=n(549),a=n(116),c=n(63);e.exports=r},function(e,t){function n(e){return function(t){return null==t?void 0:t[e]}}e.exports=n},function(e,t,n){function r(e){return function(t){return o(t,e)}}var o=n(177);e.exports=r},function(e,t,n){function r(e,t,n){var r=-1,p=i,f=e.length,h=!0,d=[],v=d;if(n)h=!1,p=a;else if(f>=u){var m=t?null:s(e);if(m)return l(m);h=!1,p=c,v=new o}else v=t?[]:d;e:for(;++r<f;){var y=e[r],g=t?t(y):y;if(y=n||0!==y?y:0,h&&g===g){for(var b=v.length;b--;)if(v[b]===g)continue e;t&&v.push(g),d.push(y)}else p(v,g,n)||(v!==d&&v.push(g),d.push(y))}return d}var o=n(222),i=n(551),a=n(556),c=n(223),s=n(557),l=n(91),u=200;e.exports=r},function(e,t,n){function r(e,t){return!!(null==e?0:e.length)&&o(e,t,0)>-1}var o=n(552);e.exports=r},function(e,t,n){function r(e,t,n){return t===t?a(e,t,n):o(e,i,n)}var o=n(553),i=n(554),a=n(555);e.exports=r},function(e,t){function n(e,t,n,r){for(var o=e.length,i=n+(r?1:-1);r?i--:++i<o;)if(t(e[i],i,e))return i;return-1}e.exports=n},function(e,t){function n(e){return e!==e}e.exports=n},function(e,t){function n(e,t,n){for(var r=n-1,o=e.length;++r<o;)if(e[r]===t)return r;return-1}e.exports=n},function(e,t){function n(e,t,n){for(var r=-1,o=null==e?0:e.length;++r<o;)if(n(t,e[r]))return!0;return!1}e.exports=n},function(e,t,n){var r=n(218),o=n(558),i=n(91),a=r&&1/i(new r([,-0]))[1]==1/0?function(e){return new r(e)}:o;e.exports=a},function(e,t){function n(){}e.exports=n},function(e,t){e.exports={name:"antd",version:"3.9.3",title:"Ant Design",description:"An enterprise-class UI design language and React-based implementation",homepage:"http://ant.design/",keywords:["ant","design","react","react-component","component","components","ui","framework","frontend"],contributors:["ant"],repository:{type:"git",url:"https://github.com/ant-design/ant-design"},bugs:{url:"https://github.com/ant-design/ant-design/issues"},main:"lib/index.js",module:"es/index.js",files:["dist","lib","es"],typings:"lib/index.d.ts",license:"MIT",peerDependencies:{react:">=16.0.0","react-dom":">=16.0.0"},dependencies:{"@ant-design/icons":"~1.1.5","@ant-design/icons-react":"~1.1.1","array-tree-filter":"^2.0.0","babel-runtime":"6.x",classnames:"~2.2.0","create-react-class":"^15.6.0","create-react-context":"0.2.2","css-animation":"^1.2.5","dom-closest":"^0.2.0","enquire.js":"^2.1.1",intersperse:"^1.0.0",lodash:"^4.17.5",moment:"^2.19.3","omit.js":"^1.0.0","prop-types":"^15.5.7",raf:"^3.4.0","rc-animate":"^2.4.1","rc-calendar":"~9.7.3","rc-cascader":"~0.16.0","rc-checkbox":"~2.1.5","rc-collapse":"~1.10.0","rc-dialog":"~7.2.0","rc-drawer":"~1.7.3","rc-dropdown":"~2.2.0","rc-editor-mention":"^1.0.2","rc-form":"^2.1.0","rc-input-number":"~4.0.0","rc-menu":"~7.4.1","rc-notification":"~3.2.0","rc-pagination":"~1.17.0","rc-progress":"~2.2.2","rc-rate":"~2.4.0","rc-select":"~8.2.6","rc-slider":"~8.6.0","rc-steps":"~3.3.0","rc-switch":"~1.7.0","rc-table":"~6.3.2","rc-tabs":"~9.4.0","rc-time-picker":"~3.4.0","rc-tooltip":"~3.7.0","rc-tree":"~1.14.5","rc-tree-select":"~2.2.0","rc-trigger":"^2.5.4","rc-upload":"~2.5.0","rc-util":"^4.0.4","react-lazy-load":"^3.0.12","react-lifecycles-compat":"^3.0.2","react-slick":"~0.23.1",shallowequal:"^1.0.1",warning:"~4.0.1"},devDependencies:{"@types/classnames":"^2.2.6","@types/prop-types":"^15.5.4","@types/react":"^16.0.0","@types/react-dom":"^16.0.0","@types/react-intl":"^2.3.10","@types/react-slick":"^0.23.2","@yesmeck/offline-plugin":"^5.0.5","ansi-styles":"^3.2.0","ant-design-palettes":"^1.0.0","antd-theme-generator":"1.1.3","antd-tools":"^5.1.6","babel-cli":"^6.18.0","babel-eslint":"^9.0.0","babel-plugin-import":"^1.0.0","babel-plugin-transform-runtime":"^6.23.0","babel-preset-es2015":"^6.18.0","babel-preset-react":"^6.16.0","babel-preset-stage-0":"^6.16.0","bezier-easing":"^2.0.3",bisheng:"^0.28.0","bisheng-plugin-antd":"^0.16.0","bisheng-plugin-description":"^0.1.1","bisheng-plugin-react":"^0.6.0","bisheng-plugin-toc":"^0.4.0",commander:"^2.11.0","cross-env":"^5.0.3","css-split-webpack-plugin":"^0.2.3",dekko:"^0.2.0",delegate:"^3.1.2","docsearch.js":"^2.5.2","dora-plugin-upload":"^0.3.1","enquire-js":"^0.2.1",enzyme:"^3.1.0","enzyme-adapter-react-16":"^1.0.0","enzyme-to-json":"^3.1.2",eslint:"^5.1.0","eslint-config-airbnb":"^17.0.0","eslint-plugin-babel":"^5.0.0","eslint-plugin-import":"^2.2.0","eslint-plugin-jsx-a11y":"6.1.1","eslint-plugin-markdown":"~1.0.0-beta.4","eslint-plugin-react":"^7.10.0","eslint-tinker":"^0.5.0","fetch-jsonp":"^1.0.3",glob:"^7.1.1","immutability-helper":"^2.5.0","intersection-observer":"^0.5.0",jest:"^23.2.0",jsdom:"^12.0.0","jsonml.js":"^0.1.0","lint-staged":"^7.0.0","lz-string":"^1.4.4",majo:"^0.6.2",mockdate:"^2.0.1","moment-timezone":"^0.5.5","pre-commit":"^1.2.2",preact:"^8.2.5","preact-compat":"^3.17.0",querystring:"^0.2.0","rc-queue-anim":"^1.4.1","rc-scroll-anim":"^2.2.1","rc-tween-one":"^2.0.1",react:"^16.3.2","react-color":"^2.11.7","react-copy-to-clipboard":"^5.0.0","react-dnd":"^5.0.0","react-dnd-html5-backend":"^5.0.1","react-document-title":"^2.0.1","react-dom":"^16.3.2","react-github-button":"^0.1.1","react-infinite-scroller":"^1.0.15","react-intl":"^2.0.1","react-resizable":"^1.7.5","react-router-dom":"^4.2.2","react-sticky":"^6.0.3","react-sublime-video":"^0.2.0","react-virtualized":"~9.20.0","remark-frontmatter":"^1.1.0","remark-parse":"^5.0.0","remark-stringify":"^5.0.0","remark-yaml-config":"^4.0.1",reqwest:"^2.0.5",rimraf:"^2.5.4",scrollama:"^1.4.1",stylelint:"^9.5.0","stylelint-config-standard":"^18.0.0",typescript:"~3.0.1",unified:"^7.0.0","values.js":"^1.0.3",webpackbar:"^2.6.1","xhr-mock":"^2.4.0",xhr2:"^0.1.3"},scripts:{test:"jest --config .jest.js","test-node":"jest --config .jest.node.js","test-all":"./scripts/test-all.sh",lint:"npm run lint:ts && npm run lint:es && npm run lint:demo && npm run lint:style","lint:ts":"npm run tsc && antd-tools run ts-lint","lint:es":"eslint tests site scripts components ./.*.js ./webpack.config.js --ext '.js,.jsx'","lint:demo":"cross-env RUN_ENV=DEMO eslint components/*/demo/*.md --ext '.md'","lint:style":'stylelint "{site,components}/**/*.less" --syntax less',"lint-fix:ts":"npm run tsc && antd-tools run ts-lint-fix","lint-fix":"npm run lint-fix:code && npm run lint-fix:demo","lint-fix:code":"eslint --fix tests site scripts components ./.*.js ./webpack.config.js --ext '.js,.jsx'","lint-fix:demo":"eslint-tinker ./components/*/demo/*.md","sort-api":"node ./scripts/sort-api-table.js",dist:"antd-tools run dist",compile:"antd-tools run compile",tsc:"tsc",start:"rimraf _site && mkdir _site && node ./scripts/generateColorLess.js && cross-env NODE_ENV=development bisheng start -c ./site/bisheng.config.js","start:preact":"node ./scripts/generateColorLess.js && cross-env NODE_ENV=development REACT_ENV=preact bisheng start -c ./site/bisheng.config.js",site:"cross-env NODE_ENV=production bisheng build --ssr -c ./site/bisheng.config.js && node ./scripts/generateColorLess.js",predeploy:"antd-tools run clean && npm run site && cp netlify.toml _site && cp -r .circleci _site",deploy:"bisheng gh-pages --push-only","deploy:china-mirror":"git checkout gh-pages && git pull origin gh-pages && git push git@gitee.com:ant-design/ant-design.git gh-pages",pub:"antd-tools run pub",prepublish:"antd-tools run guard","pre-publish":"npm run test-all && node ./scripts/prepub",authors:"git log --format='%aN <%aE>' | sort -u | grep -v 'users.noreply.github.com' | grep -v 'gitter.im' | grep -v '.local>' | grep -v 'alibaba-inc.com' | grep -v 'alipay.com' | grep -v 'taobao.com' > AUTHORS.txt","lint-staged":"lint-staged","lint-staged:ts":"tsc && node node_modules/tslint/bin/tslint","lint-staged:es":"eslint ./.*.js ./webpack.config.js","lint-staged:demo":"cross-env RUN_ENV=DEMO eslint --ext '.md'"},"lint-staged":{"components/**/*.tsx":["npm run lint-staged:ts"],"{tests,site,scripts,components}/**/*.{js,jsx}":["npm run lint-staged:es"],"{site,components}/**/*.less":"stylelint --syntax less","components/*/demo/*.md":["npm run lint-staged:demo"]},"pre-commit":["lint-staged"],sideEffects:["dist/*","es/**/style/*","lib/**/style/*"]}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(593));n.n(o)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(604));n.n(o),n(93)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(605));n.n(o)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(610));n.n(o),n(94)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(637));n.n(o)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(638));n.n(o)},function(e,t,n){e.exports=n(567)},function(e,t,n){function r(e){return e.charAt(0).toUpperCase()+e.slice(1).replace(/-(\w)/g,function(e,t){return t.toUpperCase()})}var o=n(568);o.keys().forEach(function(e){var n=o(e);n&&n.default&&(n=n.default);var i=e.match(/^\.\/([^_][\w-]+)\/index\.tsx?$/);i&&i[1]&&("message"===i[1]||"notification"===i[1]?t[i[1]]=n:t[r(i[1])]=n)}),e.exports=n(234)},function(e,t,n){function r(e){return n(o(e))}function o(e){var t=i[e];if(!(t+1))throw new Error("Cannot find module '"+e+"'.");return t}var i={"./affix/style/index.tsx":569,"./alert/style/index.tsx":571,"./anchor/style/index.tsx":573,"./auto-complete/style/index.tsx":575,"./avatar/style/index.tsx":580,"./back-top/style/index.tsx":582,"./badge/style/index.tsx":584,"./breadcrumb/style/index.tsx":586,"./button/style/index.tsx":94,"./calendar/style/index.tsx":588,"./card/style/index.tsx":591,"./carousel/style/index.tsx":594,"./cascader/style/index.tsx":596,"./checkbox/style/index.tsx":146,"./col/style/index.tsx":599,"./collapse/style/index.tsx":600,"./date-picker/style/index.tsx":602,"./divider/style/index.tsx":606,"./drawer/style/index.tsx":608,"./dropdown/style/index.tsx":563,"./form/style/index.tsx":611,"./grid/style/index.tsx":231,"./icon/style/index.tsx":613,"./input-number/style/index.tsx":615,"./input/style/index.tsx":93,"./layout/style/index.tsx":617,"./list/style/index.tsx":619,"./locale-provider/style/index.tsx":623,"./mention/style/index.tsx":625,"./menu/style/index.tsx":627,"./message/style/index.tsx":630,"./modal/style/index.tsx":632,"./notification/style/index.tsx":634,"./pagination/style/index.tsx":233,"./popconfirm/style/index.tsx":636,"./popover/style/index.tsx":564,"./progress/style/index.tsx":565,"./radio/style/index.tsx":229,"./rate/style/index.tsx":639,"./row/style/index.tsx":641,"./select/style/index.tsx":145,"./skeleton/style/index.tsx":642,"./slider/style/index.tsx":644,"./spin/style/index.tsx":232,"./steps/style/index.tsx":646,"./switch/style/index.tsx":648,"./table/style/index.tsx":650,"./tabs/style/index.tsx":560,"./tag/style/index.tsx":562,"./time-picker/style/index.tsx":561,"./timeline/style/index.tsx":652,"./tooltip/style/index.tsx":227,"./transfer/style/index.tsx":654,"./tree-select/style/index.tsx":656,"./tree/style/index.tsx":658,"./upload/style/index.tsx":660,"./version/style/index.tsx":662};r.keys=function(){return Object.keys(i)},r.resolve=o,e.exports=r,r.id=568},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(570));n.n(o)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(572));n.n(o)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(574));n.n(o)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(576));n.n(o),n(145)},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(581));n.n(o)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(583));n.n(o)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(585));n.n(o)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(587));n.n(o)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(589));n.n(o),n(145),n(229)},function(e,t){},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(592));n.n(o),n(560)},function(e,t){},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(595));n.n(o)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(597));n.n(o),n(93)},function(e,t){},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(230));n.n(o)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(601));n.n(o)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(603));n.n(o),n(93),n(561),n(562)},function(e,t){},function(e,t){},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(607));n.n(o)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(609));n.n(o),n(94)},function(e,t){},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(612));n.n(o),n(231)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(614));n.n(o)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(616));n.n(o)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(618));n.n(o)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(620));n.n(o),n(232),n(233),n(231)},function(e,t){},function(e,t){},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(624);n.n(r)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(626);n.n(r)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(628));n.n(o),n(227)},function(e,t){},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(631));n.n(o)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(633));n.n(o),n(94)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(635));n.n(o)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12);n.n(r),n(564),n(94)},function(e,t){},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(640));n.n(o)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(230));n.n(o)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(643));n.n(o)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(645));n.n(o),n(227)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(647));n.n(o)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(649));n.n(o)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(651));n.n(o),n(229),n(146),n(563),n(232),n(233)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(653));n.n(o)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(655));n.n(o),n(146),n(94),n(93)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(657));n.n(o),n(145),n(146)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(659));n.n(o),n(146)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12),o=(n.n(r),n(661));n.n(o),n(565),n(227)},function(e,t){},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(12);n.n(r)}])}); +//# sourceMappingURL=antd.min.js.map \ No newline at end of file diff --git a/cyclone-web/vendor/antd/font/font_zck90zmlh7hf47vi.eot b/cyclone-web/vendor/antd/font/font_zck90zmlh7hf47vi.eot new file mode 100644 index 0000000000000000000000000000000000000000..4e4424275fa4d0f2b3ea78aead863f420d47cdab Binary files /dev/null and b/cyclone-web/vendor/antd/font/font_zck90zmlh7hf47vi.eot differ diff --git a/cyclone-web/vendor/antd/font/font_zck90zmlh7hf47vi.svg b/cyclone-web/vendor/antd/font/font_zck90zmlh7hf47vi.svg new file mode 100644 index 0000000000000000000000000000000000000000..0b7e189028aa7dad164f416667b8d333b7c05886 --- /dev/null +++ b/cyclone-web/vendor/antd/font/font_zck90zmlh7hf47vi.svg @@ -0,0 +1,927 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +Created by FontForge 20120731 at Thu May 11 13:24:05 2017 + By admin +</metadata> +<defs> +<font id="anticon" horiz-adv-x="1024" > + <font-face + font-family="anticon" + font-weight="500" + font-stretch="normal" + units-per-em="1024" + panose-1="2 0 6 3 0 0 0 0 0 0" + ascent="896" + descent="-128" + x-height="792" + bbox="-0.142858 -128.087 1024.37 896.923" + underline-thickness="0" + underline-position="0" + unicode-range="U+0078-E951" + /> +<missing-glyph + /> + <glyph glyph-name=".notdef" + /> + <glyph glyph-name=".notdef" + /> + <glyph glyph-name=".null" horiz-adv-x="0" + /> + <glyph glyph-name="nonmarkingreturn" horiz-adv-x="341" + /> + <glyph glyph-name="x" unicode="x" horiz-adv-x="1001" +d="M281 543q-27 -1 -53 -1h-83q-18 0 -36.5 -6t-32.5 -18.5t-23 -32t-9 -45.5v-76h912v41q0 16 -0.5 30t-0.5 18q0 13 -5 29t-17 29.5t-31.5 22.5t-49.5 9h-133v-97h-438v97zM955 310v-52q0 -23 0.5 -52t0.5 -58t-10.5 -47.5t-26 -30t-33 -16t-31.5 -4.5q-14 -1 -29.5 -0.5 +t-29.5 0.5h-32l-45 128h-439l-44 -128h-29h-34q-20 0 -45 1q-25 0 -41 9.5t-25.5 23t-13.5 29.5t-4 30v167h911zM163 247q-12 0 -21 -8.5t-9 -21.5t9 -21.5t21 -8.5q13 0 22 8.5t9 21.5t-9 21.5t-22 8.5zM316 123q-8 -26 -14 -48q-5 -19 -10.5 -37t-7.5 -25t-3 -15t1 -14.5 +t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q-5 19 -11 39h-368zM336 498v228q0 11 2.5 23t10 21.5t20.5 15.5t34 6h188q31 0 51.5 -14.5t20.5 -52.5v-227h-327z" /> + <glyph glyph-name="stepforward" unicode="&#xe600;" +d="M327 820l431 -356v300q0 15 10.5 25.5t25.5 10.5v0q15 0 25.5 -10.5t10.5 -25.5v-760q0 -15 -10.5 -25.5t-25.5 -10.5v0q-15 0 -25.5 10.5t-10.5 25.5v301l-431 -357q-21 -18 -46 -7t-25 39v808q0 28 25 39t46 -7z" /> + <glyph glyph-name="stepbackward" unicode="&#xe601;" +d="M759 820l-431 -356v300q0 15 -10.5 25.5t-25.5 10.5v0q-15 0 -25.5 -10.5t-10.5 -25.5v-760q0 -15 10.5 -25.5t25.5 -10.5v0q15 0 25.5 10.5t10.5 25.5v301l431 -357q21 -18 46 -7t25 39v808q0 28 -25 39t-46 -7z" /> + <glyph glyph-name="forward" unicode="&#xe602;" +d="M575 790l436 -375q13 -12 13 -30t-13 -29l-436 -378q-18 -17 -40.5 -6.5t-22.5 36.5v377v375q0 26 22.5 36.5t40.5 -6.5zM63 790l436 -375q13 -12 13 -30t-13 -29l-436 -378q-18 -17 -40.5 -6.5t-22.5 36.5v752q0 26 22.5 36.5t40.5 -6.5z" /> + <glyph glyph-name="banckward" unicode="&#xe603;" horiz-adv-x="1025" +d="M449 790l-436 -376q-13 -11 -13 -29t13 -30l436 -377q18 -17 40.5 -6.5t22.5 36.5v377v375q0 26 -22.5 36.5t-40.5 -6.5zM961 790l-436 -376q-13 -11 -13 -29t13 -30l436 -377q18 -17 40.5 -6.5t22.5 36.5v752q0 26 -22.5 36.5t-40.5 -6.5z" /> + <glyph glyph-name="caretright" unicode="&#xe604;" +d="M393 820l489 -403q14 -13 14 -32t-14 -32l-489 -405q-21 -18 -46 -7t-25 39v808q0 28 25 39t46 -7z" /> + <glyph glyph-name="caretleft" unicode="&#xe605;" +d="M631 820l-489 -403q-14 -13 -14 -32t14 -32l489 -405q21 -18 46 -7t25 39v808q0 28 -25 39t-46 -7z" /> + <glyph glyph-name="caretdown" unicode="&#xe606;" +d="M76 504l403 -489q13 -15 32 -15t32 15l405 489q18 20 7 45t-39 25h-808q-28 0 -39 -25t7 -45z" /> + <glyph glyph-name="caretup" unicode="&#xe607;" +d="M76 263l405 489q13 14 32 14t32 -14l403 -489q18 -20 7 -45.5t-39 -25.5h-808q-28 0 -39 25.5t7 45.5z" /> + <glyph glyph-name="rightcircle" unicode="&#xe608;" +d="M512 895q-104 0 -199 -40.5t-163 -109t-109 -163t-41 -199t41 -199t109 -163t163 -109t199 -40.5t199 40.5t163 109t109 163t41 199t-41 199t-109 163t-163 109t-199 40.5zM681 358l-235 -220q-11 -11 -26 -10.5t-25 11.5t-9.5 26t11.5 25l207 194l-207 195 +q-11 10 -11.5 25t9.5 26t25 11.5t26 -9.5l235 -221q12 -11 12 -26.5t-12 -26.5z" /> + <glyph glyph-name="leftcircle" unicode="&#xe609;" +d="M512 895q-104 0 -199 -40.5t-163 -109t-109 -163t-41 -199t41 -199t109 -163t163 -109t199 -40.5t199 40.5t163 109t109 163t41 199t-41 199t-109 163t-163 109t-199 40.5zM629 139q-10 -11 -25 -11.5t-26 9.5l-235 221q-12 11 -12 26.5t11 26.5l236 220q11 11 26 10.5 +t25 -11.5t9.5 -26t-11.5 -25l-207 -195l207 -194q11 -10 11.5 -25t-9.5 -26z" /> + <glyph glyph-name="upcircle" unicode="&#xe60a;" +d="M512 895q-104 0 -199 -40.5t-163 -109t-109 -163t-41 -199t41 -199t109 -163t163 -109t199 -40.5t199 40.5t163 109t109 163t41 199t-41 199t-109 163t-163 109t-199 40.5zM757 278.5q-11 -10.5 -25.5 -10t-24.5 11.5l-195 208l-195 -208q-10 -11 -25 -11.5t-25.5 10 +t-11 25t9.5 25.5l221 236q10 11 26 11t26 -11l221 -236q10 -11 9.5 -25.5t-11.5 -25z" /> + <glyph glyph-name="downcircle" unicode="&#xe60b;" +d="M512 895q-104 0 -199 -40.5t-163 -109t-109 -163t-41 -199t41 -199t109 -163t163 -109t199 -40.5t199 40.5t163 109t109 163t41 199t-41 199t-109 163t-163 109t-199 40.5zM759 430l-221 -236q-10 -11 -26 -11t-26 11l-221 236q-10 11 -9.5 25.5t11 25t25.5 10t25 -11.5 +l195 -208l195 208q10 11 24.5 11.5t25.5 -10t11.5 -25t-9.5 -25.5z" /> + <glyph glyph-name="rightcircleo" unicode="&#xe60c;" +d="M511.5 823q89.5 0 171.5 -34q79 -34 140 -95t94 -139q35 -82 35 -171.5t-35 -171.5q-33 -78 -94 -139t-140 -95q-81 -34 -170.5 -34t-171.5 34q-79 34 -140 95t-94 139q-35 82 -35 171.5t35 171.5q33 78 94 139t140 95q81 34 170.5 34zM512 895q-104 0 -199 -40.5 +t-163 -109t-109 -163t-41 -199t41 -199t109 -163t163 -109t199 -40.5t199 40.5t163 109t109 163t41 199t-41 199t-109 163t-163 109t-199 40.5v0zM681 411l-235 220q-11 11 -26 10.5t-25 -11.5t-9.5 -26t11.5 -25l207 -195l-207 -194q-11 -10 -11.5 -25t9.5 -26t25 -11.5 +t26 9.5l235 221q12 11 12 26.5t-12 26.5z" /> + <glyph glyph-name="leftcircleo" unicode="&#xe60d;" +d="M511.5 823q89.5 0 171.5 -34q79 -34 140 -95t94 -139q35 -82 35 -171.5t-35 -171.5q-33 -78 -94 -139t-140 -95q-81 -34 -170.5 -34t-171.5 34q-79 34 -140 95t-94 139q-35 82 -35 171.5t35 171.5q33 78 94 139t140 95q81 34 170.5 34zM512 895q-104 0 -199 -40.5 +t-163 -109t-109 -163t-41 -199t41 -199t109 -163t163 -109t199 -40.5t199 40.5t163 109t109 163t41 199t-41 199t-109 163t-163 109t-199 40.5v0zM331 384.5q0 -15.5 12 -26.5l235 -221q11 -10 26 -9.5t25 11.5t9.5 26t-11.5 25l-207 194l207 195q11 10 11.5 25t-9.5 26 +t-25 11.5t-26 -10.5l-236 -220q-11 -11 -11 -26.5z" /> + <glyph glyph-name="upcircleo" unicode="&#xe60e;" +d="M511.5 823q89.5 0 171.5 -34q79 -34 140 -95t94 -139q35 -82 35 -171.5t-35 -171.5q-33 -78 -94 -139t-140 -95q-81 -34 -170.5 -34t-171.5 34q-79 34 -140 95t-94 139q-35 82 -35 171.5t35 171.5q33 78 94 139t140 95q81 34 170.5 34zM512 895q-104 0 -199 -40.5 +t-163 -109t-109 -163t-41 -199t41 -199t109 -163t163 -109t199 -40.5t199 40.5t163 109t109 163t41 199t-41 199t-109 163t-163 109t-199 40.5v0zM512 576q-16 0 -26 -11l-221 -236q-10 -11 -9.5 -25.5t11 -25t25.5 -10t25 11.5l195 208l195 -208q10 -11 24.5 -11.5t25.5 10 +t11.5 25t-9.5 25.5l-221 236q-10 11 -26 11z" /> + <glyph glyph-name="downcircleo" unicode="&#xe60f;" +d="M511.5 823q89.5 0 171.5 -34q79 -34 140 -95t94 -139q35 -82 35 -171.5t-35 -171.5q-33 -78 -94 -139t-140 -95q-81 -34 -170.5 -34t-171.5 34q-79 34 -140 95t-94 139q-35 82 -35 171.5t35 171.5q33 78 94 139t140 95q81 34 170.5 34zM512 895q-104 0 -199 -40.5 +t-163 -109t-109 -163t-41 -199t41 -199t109 -163t163 -109t199 -40.5t199 40.5t163 109t109 163t41 199t-41 199t-109 163t-163 109t-199 40.5v0zM512 183q-16 0 -26 11l-221 236q-10 11 -9.5 25.5t11 25t25.5 10t25 -11.5l195 -208l195 208q10 11 24.5 11.5t25.5 -10 +t11.5 -25t-9.5 -25.5l-221 -236q-10 -11 -26 -11z" /> + <glyph glyph-name="verticleleft" unicode="&#xe610;" +d="M273 78l382 307l-380 305q-14 11 -16 29t9.5 32t29.5 16t32 -9l358 -288v262q0 15 10.5 25.5t25.5 10.5h8q15 0 25.5 -10.5t10.5 -25.5v-696q0 -15 -10.5 -25.5t-25.5 -10.5h-8q-15 0 -25.5 10.5t-10.5 25.5v264l-360 -290q-12 -10 -27 -10q-21 0 -35 17q-11 14 -9 32 +t16 29z" /> + <glyph glyph-name="verticleright" unicode="&#xe611;" +d="M752 78l-382 307l380 305q14 11 16 29t-9.5 32t-29.5 16t-32 -9l-358 -288v262q0 15 -10.5 25.5t-25.5 10.5h-8q-15 0 -25.5 -10.5t-10.5 -25.5v-696q0 -15 10.5 -25.5t25.5 -10.5h8q15 0 25.5 10.5t10.5 25.5v264l360 -290q12 -10 27 -10q21 0 34 17q12 14 10 32t-16 29 +z" /> + <glyph glyph-name="rollback" unicode="&#xe612;" +d="M811.5 471.5q-88.5 88.5 -213.5 88.5h-336l114 114q12 12 12 28.5t-12 28t-28.5 11.5t-28.5 -12l-183 -183q-12 -12 -12 -28.5t12 -28.5l178 -178q12 -12 28.5 -12t28 11.5t11.5 28t-11 28.5l-113 112h340q92 0 157 -65t65 -157v-192q0 -17 12 -28.5t28.5 -11.5t28 11.5 +t11.5 28.5v192q0 125 -88.5 213.5z" /> + <glyph glyph-name="retweet" unicode="&#xe613;" +d="M366 579h349l-119 -119q-11 -11 -11 -26t10.5 -25.5t25.5 -10.5t25 11l179 178q11 11 11 25.5t-11 25.5l-184 184q-10 10 -25 10t-25.5 -10.5t-10.5 -25.5t10 -25l120 -120h-344q-124 0 -211.5 -87.5t-87.5 -211.5q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5 +q0 94 66.5 160.5t160.5 66.5zM923 455q-15 0 -25.5 -10.5t-10.5 -25.5q0 -94 -66.5 -160.5t-160.5 -66.5h-349l120 120q10 10 10 25t-10.5 25.5t-25.5 10.5t-25 -11l-179 -178q-10 -11 -10 -25.5t10 -25.5l184 -184q10 -10 25 -10t25.5 10.5t10.5 25.5t-10 25l-120 120h344 +q124 0 211.5 87.5t87.5 211.5q0 15 -10.5 25.5t-25.5 10.5z" /> + <glyph glyph-name="shrink" unicode="&#xe614;" +d="M109 247h211l-232 -232q-13 -13 -13 -31t13 -31t31 -13t31 13l236 236v-210q0 -18 13 -31t31 -13t31 13t13 31v312q0 19 -13 31.5t-31 12.5h-321q-18 0 -31 -12.5t-13 -31t13 -31.5t31 -13zM595 431h321q18 0 31 13t13 31t-13 31t-31 13h-211l232 232q13 13 13 31.5 +t-13 31t-31 12.5t-31 -12l-236 -236v209q0 18 -13 31t-31 13t-31 -13t-13 -31v-312q0 -18 13 -31t31 -13z" /> + <glyph glyph-name="arrowsalt" unicode="&#xe615;" +d="M430 23h-211l232 232q13 13 13 31.5t-13 31t-31 12.5t-31 -12l-236 -236v209q0 18 -13 31t-31 13t-31 -13t-13 -31v-312q0 -18 13 -31t31 -13h321q18 0 31 13t13 31t-13 31t-31 13zM916 831h-321q-18 0 -31 -13t-13 -31t13 -31t31 -13h211l-232 -232q-13 -13 -13 -31 +t13 -31t31 -13t31 13l236 236v-210q0 -18 13 -31t31 -13t31 13t13 31v312q0 18 -13 31t-31 13z" /> + <glyph glyph-name="doubleright" unicode="&#xe617;" +d="M431 17q-11 14 -9 32t16 29l381 307l-379 305q-14 11 -16 29t9 32t29 16t32 -9l422 -339q17 -13 17 -34t-17 -34l-424 -341q-12 -10 -27 -10q-21 0 -34 17zM101 17q-11 14 -9 32t16 29l381 307l-379 305q-14 11 -16 29t9 32t29 16t32 -9l422 -339q17 -13 17 -34t-17 -34 +l-424 -341q-12 -10 -27 -10q-21 0 -34 17z" /> + <glyph glyph-name="doubleleft" unicode="&#xe618;" +d="M559 0q-15 0 -27 10l-424 341q-17 13 -17 34t17 34l422 339q14 11 32 9t29 -16t9 -32t-16 -29l-379 -305l381 -307q14 -11 16 -29t-9 -32q-13 -17 -34 -17zM889 0q-15 0 -27 10l-424 341q-17 13 -17 34t17 34l422 339q14 11 32 9t29 -16t9 -32t-16 -29l-379 -305 +l381 -307q14 -11 16 -29t-9 -32q-13 -17 -34 -17z" /> + <glyph glyph-name="arrowdown" unicode="&#xe619;" +d="M558 725v-574v0l208 216q13 14 31 14t31.5 -12.5t13.5 -30.5t-12 -32l-284 -294q-13 -14 -31.5 -14t-31.5 14l-285 296q-12 13 -12 30q0 19 14 32q13 13 31 12.5t31 -13.5l208 -216v0v573q0 17 12 30t29 14q19 1 33 -12.5t14 -32.5z" /> + <glyph glyph-name="arrowup" unicode="&#xe61a;" +d="M470 43v574v0l-208 -216q-13 -14 -31 -14t-31.5 12.5t-13.5 30.5t12 32l284 294q13 14 31.5 14t31.5 -14l285 -296q12 -13 12 -30q0 -19 -14 -32q-13 -13 -31 -12.5t-31 13.5l-208 216v0v-573q0 -17 -12 -30t-29 -14q-19 -1 -33 12.5t-14 32.5z" /> + <glyph glyph-name="arrowright" unicode="&#xe61b;" +d="M173 428h574v0l-216 208q-14 13 -14 31t12.5 31.5t30.5 13.5t32 -12l294 -284q14 -13 14 -31.5t-14 -31.5l-296 -285q-13 -12 -30 -12q-19 0 -32 14q-13 13 -12.5 31t13.5 31l216 208v0h-573q-17 0 -30 12t-14 29q-1 19 12.5 33t32.5 14z" /> + <glyph glyph-name="arrowleft" unicode="&#xe61c;" +d="M855 428h-574v0l216 208q14 13 14 31t-12.5 31.5t-30.5 13.5t-32 -12l-294 -284q-14 -13 -14 -31.5t14 -31.5l296 -285q13 -12 30 -12q19 0 32 14q13 13 12.5 31t-13.5 31l-216 208v0h573q17 0 30 12t14 29q1 19 -12.5 33t-32.5 14z" /> + <glyph glyph-name="down" unicode="&#xe61d;" +d="M896 596q0 -15 -10 -28l-341 -423q-13 -17 -34 -17t-34 17l-339 422q-11 14 -9 32t16 29t32 9t29 -16l305 -379l307 381q11 14 29 16t32 -9q17 -13 17 -34z" /> + <glyph glyph-name="up" unicode="&#xe61e;" +d="M896 236q0 15 -10 28l-341 423q-13 17 -34 17t-34 -17l-339 -422q-11 -14 -9 -32t16 -29t32 -9t29 16l305 379l307 -381q11 -14 29 -16t32 9q17 13 17 34z" /> + <glyph glyph-name="right" unicode="&#xe61f;" +d="M301 0q15 0 27 10l424 341q16 13 16 34t-16 34l-422 339q-14 11 -32 9t-29.5 -16t-9.5 -32t16 -29l380 -305l-382 -307q-14 -11 -16 -29t9 -32q14 -17 35 -17z" /> + <glyph glyph-name="left" unicode="&#xe620;" +d="M724 0q-15 0 -27 10l-424 341q-16 13 -16 34t16 34l422 339q14 11 32 9t29.5 -16t9.5 -32t-16 -29l-380 -305l382 -307q14 -11 16 -29t-10 -32q-13 -17 -34 -17z" /> + <glyph glyph-name="minussquareo" unicode="&#xe621;" +d="M888 760v0v0v-753v0h-752v0v753v0h752zM888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21v0zM732 347h-442q-14 0 -25 10.5t-11 25.5v0q0 15 11 25.5t25 10.5h442q14 0 25 -10.5t11 -25.5v0 +q0 -15 -11 -25.5t-25 -10.5z" /> + <glyph glyph-name="minuscircle" unicode="&#xe622;" +d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM832 384q0 -15 -10.5 -25.5t-25.5 -10.5h-568q-15 0 -25.5 10.5t-10.5 25.5v0q0 15 10.5 25.5t25.5 10.5h568 +q15 0 25.5 -10.5t10.5 -25.5v0z" /> + <glyph glyph-name="minuscircleo" unicode="&#xe623;" +d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171 +q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM796 348h-568q-15 0 -25.5 10.5t-10.5 25.5v0q0 15 10.5 25.5t25.5 10.5h568q15 0 25.5 -10.5t10.5 -25.5v0q0 -15 -10.5 -25.5t-25.5 -10.5z" /> + <glyph glyph-name="minus" unicode="&#xe624;" +d="M796 348h-568q-15 0 -25.5 10.5t-10.5 25.5v0q0 15 10.5 25.5t25.5 10.5h568q15 0 25.5 -10.5t10.5 -25.5v0q0 -15 -10.5 -25.5t-25.5 -10.5z" /> + <glyph glyph-name="pluscircleo" unicode="&#xe625;" +d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171 +q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM732 420h-184v183q0 15 -10.5 25.5t-25.5 10.5v0q-14 0 -25 -10.5t-11 -25.5v-183h-184q-15 0 -25.5 -11t-10.5 -25v0q0 -15 10.5 -25.5t25.5 -10.5h184v-183 +q0 -15 11 -25.5t25 -10.5v0q15 0 25.5 10.5t10.5 25.5v183h184q15 0 25.5 10.5t10.5 25.5v0q0 14 -10.5 25t-25.5 11z" /> + <glyph glyph-name="pluscircle" unicode="&#xe626;" +d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM768 384q0 -15 -10.5 -25.5t-25.5 -10.5h-184v-183q0 -15 -10.5 -25.5t-25.5 -10.5v0q-14 0 -25 10.5 +t-11 25.5v183h-184q-15 0 -25.5 10.5t-10.5 25.5v0q0 14 10.5 25t25.5 11h184v183q0 15 11 25.5t25 10.5v0q15 0 25.5 -10.5t10.5 -25.5v-183h184q15 0 25.5 -11t10.5 -25v0z" /> + <glyph glyph-name="plus" unicode="&#xe627;" +d="M866 420h-318v310q0 15 -10.5 25.5t-25.5 10.5v0q-15 0 -25.5 -10.5t-10.5 -25.5v-310h-312q-14 0 -25 -10.5t-11 -25.5v0q0 -15 11 -25.5t25 -10.5h312v-312q0 -14 10.5 -25t25.5 -11v0q15 0 25.5 11t10.5 25v312h318q15 0 25.5 10.5t10.5 25.5v0q0 15 -10.5 25.5 +t-25.5 10.5z" /> + <glyph glyph-name="infocirlce" unicode="&#xe628;" +d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM509 712q15 0 25.5 -11t10.5 -25.5t-10.5 -25t-25.5 -10.5t-25.5 10.5t-10.5 25t10.5 25.5t25.5 11zM666 154 +q0 -15 -10.5 -25.5t-25.5 -10.5h-85h-72h-85q-15 0 -25.5 10.5t-10.5 25.5v0q0 15 10.5 25.5t25.5 10.5h85v314h-60q-15 0 -25.5 11t-10.5 25v0q0 15 10.5 25.5t25.5 10.5h60h36v0q15 0 25.5 -10.5t10.5 -25.5v-350h85q15 0 25.5 -10.5t10.5 -25.5v0z" /> + <glyph glyph-name="infocirlceo" unicode="&#xe629;" +d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171 +q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM630 190h-85v350q0 15 -10.5 25.5t-25.5 10.5v0h-36h-60q-15 0 -25.5 -10.5t-10.5 -25.5v0q0 -14 10.5 -25t25.5 -11h60v-314h-85q-15 0 -25.5 -10.5 +t-10.5 -25.5v0q0 -15 10.5 -25.5t25.5 -10.5h85h72h85q15 0 25.5 10.5t10.5 25.5v0q0 15 -10.5 25.5t-25.5 10.5zM509 676zM473 675.5q0 14.5 10.5 25.5t25.5 11t25.5 -11t10.5 -25.5t-10.5 -25t-25.5 -10.5t-25.5 10.5t-10.5 25z" /> + <glyph glyph-name="info" unicode="&#xe62a;" +d="M660 136h-85v404q0 15 -10.5 25.5t-25.5 10.5v0h-36h-60q-15 0 -25.5 -10.5t-10.5 -25.5v0q0 -14 10.5 -25t25.5 -11h60v-368h-85q-15 0 -25.5 -10.5t-10.5 -25.5v0q0 -15 10.5 -25.5t25.5 -10.5h85h72h85q15 0 25.5 10.5t10.5 25.5v0q0 15 -10.5 25.5t-25.5 10.5z +M539 676zM503 675.5q0 14.5 10.5 25.5t25.5 11t25.5 -11t10.5 -25.5t-10.5 -25t-25.5 -10.5t-25.5 10.5t-10.5 25z" /> + <glyph glyph-name="exclamation" unicode="&#xe62b;" +d="M512 193q-17 0 -28.5 11.5t-11.5 28.5v495q0 17 11.5 28.5t28.5 11.5t28.5 -11.5t11.5 -28.5v-495q0 -17 -11.5 -28.5t-28.5 -11.5zM512 83zM467 83q0 19 13 32t32 13t32 -13t13 -32t-13 -32t-32 -13t-32 13t-13 32z" /> + <glyph glyph-name="exclamationcircle" unicode="&#xe62c;" +d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM472 665q0 17 11.5 28.5t28.5 11.5t28.5 -11.5t11.5 -28.5v-369q0 -17 -11.5 -28.5t-28.5 -11.5t-28.5 11.5 +t-11.5 28.5v369zM512 102q-19 0 -32 13t-13 32t13 32t32 13t32 -13t13 -32t-13 -32t-32 -13z" /> + <glyph glyph-name="exclamationcircleo" unicode="&#xe62d;" +d="M512 824q90 0 171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140t-140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171q34 79 95 140t140 94q81 35 171 35zM512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257 +t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5v0zM512 256q-17 0 -28.5 11.5t-11.5 28.5v369q0 17 11.5 28.5t28.5 11.5t28.5 -11.5t11.5 -28.5v-369q0 -17 -11.5 -28.5t-28.5 -11.5zM512 147zM467 147q0 19 13 32 +t32 13t32 -13t13 -32t-13 -32t-32 -13t-32 13t-13 32z" /> + <glyph glyph-name="closecircle" unicode="&#xe62e;" +d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM717 229q11 -10 11 -25t-10.5 -25.5t-25.5 -10.5t-26 10l-154 155l-154 -155q-11 -10 -26 -10t-25.5 10.5 +t-10.5 25.5t11 25l154 155l-154 155q-11 10 -11 25t10.5 25.5t25.5 10.5t26 -10l154 -155l154 155q11 10 26 10t25.5 -10.5t10.5 -25t-11 -25.5l-154 -155z" /> + <glyph glyph-name="closecircleo" unicode="&#xe62f;" +d="M717.5 589.5q-10.5 10.5 -25.5 10.5t-26 -10l-154 -155l-154 155q-11 10 -26 10t-25.5 -10.5t-10.5 -25.5t11 -25l154 -155l-154 -155q-11 -10 -11 -25t10.5 -25.5t25.5 -10.5t26 10l154 155l154 -155q11 -10 26 -10t25.5 10.5t10.5 25t-11 25.5l-154 155l154 155 +q11 10 11 25t-10.5 25.5zM512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140 +q-35 81 -35 171t34 171q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140z" /> + <glyph glyph-name="checkcircle" unicode="&#xe630;" +d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM772 540l-359 -361v0l-1 -1q-3 -3 -8 -6q-8 -5 -18 -5q-21 0 -31 18l-109 191q-8 13 -4 27t17 21.5t27.5 3.5 +t21.5 -17l86 -149l327 328q11 11 26 11t25.5 -10.5t10.5 -25.5t-11 -25z" /> + <glyph glyph-name="checkcircleo" unicode="&#xe631;" +d="M721 590l-327 -328l-86 149q-7 13 -21.5 17t-27.5 -3.5t-17 -21.5t4 -27l109 -191q10 -18 31 -18q10 0 18 5q5 3 8 6l1 1l359 360q11 11 11 26t-10.5 25.5t-25.5 10.5t-26 -11zM512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5 +t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171 +q-34 -79 -95 -140z" /> + <glyph glyph-name="check" unicode="&#xe632;" +d="M328 96q-3 0 -5 1q-20 2 -30 20l-159 278q-8 15 -4 31t18.5 24t30.5 3.5t25 -18.5l133 -233l491 492q11 12 28 12t28.5 -11.5t11.5 -28.5t-12 -28l-526 -528l-2 -2q-11 -12 -28 -12z" /> + <glyph glyph-name="close" unicode="&#xe633;" +d="M568 381l254 255q12 11 12 27.5t-11.5 28t-28 11.5t-27.5 -12l-255 -254l-255 254q-11 12 -27.5 12t-28 -11.5t-11.5 -28t12 -27.5l254 -255l-254 -255q-12 -11 -12 -27.5t11.5 -28t28 -11.5t27.5 12l255 255l255 -255q11 -12 27.5 -12t28 11.5t11.5 28t-12 27.5z" /> + <glyph glyph-name="customerservice" unicode="&#xe634;" +d="M838 579q-6 26 -18 52q-25 59 -72 105q-46 45 -107 70q-63 26 -131 26t-131 -26q-60 -25 -107 -70.5t-72 -104.5q-11 -25 -18 -53q-24 -8 -45 -23q-22 -16 -38 -38q-35 -47 -35 -106q0 -72 51 -123q37 -37 87 -48q4 -1 8 -1q15 0 25 11q10 10 10 25l-1 227q0 107 77 183 +q78 76 188.5 76t188.5 -76t78 -183v-236q0 -107 -78 -183q-31 -31 -71 -50q1 11 1 22q-1 46 -34 79t-79 35h-3q-48 0 -82 -34.5t-34 -82.5q0 -47 33.5 -81t80.5 -35v0h2v0h2h1v0v0q66 1 126 26t107 70.5t73 104.5q22 53 26 111q35 13 62 40q51 51 51 123q0 58 -34 104.5 +t-88 63.5zM82 355q1 -3 3 -7q-2 5 -3 7zM92 333q2 -4 5 -9q-4 6 -5 9zM160 332l-3 3l3 -3l2 -2zM173 332q-4 3 -7 6q-31 31 -31 73q0 29 14 53q9 17 24 29v-161zM181 316q-1 0 -2 0.5t-1 1.5q1 -1 3 -2v0zM188 571v0q1 5 4 13q-2 -7 -4 -13zM204 248l-10 2q9 -2 10 -2h2h-2z +M210 248h-1h1v0zM237 274v1l-1 227l1 -227v-1zM307 756q7 5 10 7q-6 -4 -10 -7zM382 799q-30 -13 -58 -31q28 18 58 31q1 0 2.5 0.5t2.5 0.5q-3 0 -5 -1zM442 761l2 0.5t3 0.5h2zM742 730q-45 44 -104 69q-1 0 -2.5 0.5t-2.5 0.5q1 0 2.5 -0.5t2.5 -0.5q59 -25 104 -69l6 -6 +zM754 718q4 -4 9 -10q-5 6 -9 10zM765 706q2 -3 8 -10q-4 4 -8 10zM404 52v0v3v-3zM512 161h3h-3v0zM544.5 21q-12.5 -13 -30.5 -14h-2q-19 0 -32 13.5t-13 31.5q0 19 13 32.5t32 13.5t32 -13.5t13 -32t-12.5 -31.5zM565 44v8v3v-1v-2v-8zM615 19l1 3l-1 -3q1 1 2.5 1.5 +t2.5 0.5q-2 -1 -5 -2zM742 38l-6 -6q1 1 3.5 3t2.5 3l6 6q-3 -4 -6 -6zM784 266v-14v14v236v6v-3v-3v-236zM813 140q-3 -7 -7 -14q4 7 7 14q0 1 1 2.5t1 2.5q-1 -3 -2 -5zM813 628q-3 7 -7 14q4 -7 7 -14q1 -2 3 -7q-1 3 -3 7zM831 572q0 3 -1 7q0 -1 0.5 -3t0.5 -4v0z +M839 510q7 -3 12 -7q-5 4 -12 7v0zM864 332q-11 -11 -25 -18v0q14 7 25 18q0 1 1 1q0 1 1 1q-1 0 -1 -1q-1 0 -1 -1zM858 338q-5 -5 -11 -10v168q17 -13 27 -30q15 -25 15 -55q0 -42 -31 -73zM945 460l-2 6q1 -2 2 -6zM935 485q1 -1 3 -6q-1 1 -1.5 3.5t-1.5 2.5zM943 356 +q0 2 2 7q-1 -2 -2 -7z" /> + <glyph glyph-name="creditcard" unicode="&#xe635;" +d="M952 766h-880q-30 0 -51 -21t-21 -51v-120v-96v-405q0 -29 21 -50.5t51 -21.5h880q30 0 51 21.5t21 50.5v405v96v120q0 30 -21 51t-51 21zM952 73h-880v405h880v-405zM72 574v120h880v-120h-880zM237 192v0q18 0 31 13t13 31v0q0 18 -13 31t-31 13v0q-18 0 -31 -13 +t-13 -31v0q0 -18 13 -31t31 -13zM404 192v0q18 0 31 13t13 31v0q0 18 -13 31t-31 13v0q-19 0 -31.5 -13t-12.5 -31v0q0 -18 12.5 -31t31.5 -13z" /> + <glyph glyph-name="codesquareo" unicode="&#xe636;" +d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM888 7h-752v753h752v-753zM203.5 357.5q10.5 -10.5 25.5 -10.5t25 11l140 141q11 10 11 25t-10 26l-141 142q-10 10 -25 10t-25.5 -10.5 +t-10.5 -25t10 -25.5l115 -117l-115 -115q-10 -11 -10 -26t10.5 -25.5zM383 384q0 -15 10.5 -25.5t24.5 -10.5l199 -1h1q14 0 25 10.5t11 25.5t-11 25.5t-25 10.5l-199 1v0q-15 0 -25.5 -10.5t-10.5 -25.5z" /> + <glyph glyph-name="book" unicode="&#xe637;" +d="M822 832h-259h-72h-121h-72h-94q-29 0 -50.5 -21t-21.5 -51v-753q0 -29 21.5 -50.5t50.5 -21.5h619q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM491 760v-209l-9 8l-33 34q-8 7 -18 7t-17 -7l-44 -44v211h121zM298 760v-277q0 -15 10 -25t25 -10v0 +q37 0 63 25l35 35l35 -34q25 -25 60 -26h1q15 0 25.5 10t10.5 25v277h260v-624h-618v624h93zM204 7v57h618v-57h-618z" /> + <glyph glyph-name="barschart" unicode="&#xe638;" +d="M203 730v-696q0 -15 -10.5 -25.5t-25.5 -10.5v0q-15 0 -25.5 10.5t-10.5 25.5v696q0 15 10.5 25.5t25.5 10.5v0q15 0 25.5 -10.5t10.5 -25.5zM167 70h694q15 0 25.5 -10.5t10.5 -25.5v0q0 -15 -10.5 -25.5t-25.5 -10.5h-694q-15 0 -25.5 10.5t-10.5 25.5v0 +q0 15 10.5 25.5t25.5 10.5zM394 537v-371q0 -15 -10.5 -25.5t-25.5 -10.5v0q-15 0 -25.5 10.5t-10.5 25.5v371q0 15 10.5 25.5t25.5 10.5v0q15 0 25.5 -10.5t10.5 -25.5zM777 667v-501q0 -15 -10.5 -25.5t-25.5 -10.5v0q-15 0 -25.5 10.5t-10.5 25.5v501q0 15 10.5 25.5 +t25.5 10.5v0q15 0 25.5 -10.5t10.5 -25.5zM585 411v-245q0 -15 -10.5 -25.5t-25.5 -10.5v0q-15 0 -25.5 10.5t-10.5 25.5v245q0 15 10.5 25.5t25.5 10.5v0q14 0 25 -10.5t11 -25.5z" /> + <glyph glyph-name="bars" unicode="&#xe639;" +d="M187 639zM124 639q0 26 18.5 44.5t44.5 18.5t44.5 -18.5t18.5 -44.5t-18.5 -44.5t-44.5 -18.5t-44.5 18.5t-18.5 44.5zM856 610h-498q-15 0 -25.5 10.5t-10.5 25.5v0q0 15 10.5 25.5t25.5 10.5h498q15 0 25.5 -10.5t10.5 -25.5v0q0 -15 -10.5 -25.5t-25.5 -10.5zM187 384 +zM124 384q0 26 18.5 44.5t44.5 18.5t44.5 -18.5t18.5 -44.5t-18.5 -44.5t-44.5 -18.5t-44.5 18.5t-18.5 44.5zM856 355h-498q-15 0 -25.5 10.5t-10.5 25.5v0q0 15 10.5 25.5t25.5 10.5h498q15 0 25.5 -10.5t10.5 -25.5v0q0 -15 -10.5 -25.5t-25.5 -10.5zM187 129zM124 129 +q0 26 18.5 44.5t44.5 18.5t44.5 -18.5t18.5 -44.5t-18.5 -44.5t-44.5 -18.5t-44.5 18.5t-18.5 44.5zM856 100h-498q-15 0 -25.5 10.5t-10.5 25.5v0q0 15 10.5 25.5t25.5 10.5h498q15 0 25.5 -10.5t10.5 -25.5v0q0 -15 -10.5 -25.5t-25.5 -10.5z" /> + <glyph glyph-name="question" unicode="&#xe63a;" +d="M644 633q-61 64 -152 64q-84 0 -143.5 -59.5t-59.5 -143.5q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5q0 54 38.5 92.5t92.5 38.5h1q59 0 99 -42q35 -37 32 -85q-1 -18 -4 -29t-21 -37.5t-54 -62.5q-43 -43 -66.5 -77t-27.5 -72q-2 -15 7.5 -26.5t24.5 -12.5h4 +q14 0 24 9t12 23q3 35 73 105q61 61 79.5 98t20.5 78q5 79 -52 139zM486 80zM443 80q0 18 12.5 30.5t30.5 12.5t30.5 -12.5t12.5 -30.5t-12.5 -30.5t-30.5 -12.5t-30.5 12.5t-12.5 30.5z" /> + <glyph glyph-name="questioncircle" unicode="&#xe63b;" +d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM505.5 83q-17.5 0 -30.5 13t-13 31t13 30.5t30.5 12.5t30.5 -12.5t13 -30.5t-13 -31t-30.5 -13zM691 505 +q-2 -38 -19.5 -70.5t-67.5 -83.5q-59 -58 -61 -87q-2 -13 -12 -22.5t-24 -9.5h-4q-15 2 -24.5 13.5t-7.5 26.5q3 33 23.5 63t58.5 67q30 30 45.5 52t18 31t2.5 24q2 39 -26 69q-33 34 -81 34v0q-45 0 -76.5 -31.5t-31.5 -75.5q0 -15 -10.5 -25.5t-25.5 -10.5t-25.5 10.5 +t-10.5 25.5q0 74 52.5 126.5t126.5 52.5q80 1 134 -56q50 -53 46 -123z" /> + <glyph glyph-name="questioncircleo" unicode="&#xe63c;" +d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171 +q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM546 372zM507 232h-4q-15 2 -24.5 13.5t-7.5 26.5q3 33 23.5 63t58.5 67q30 30 45.5 52t18 31.5t2.5 23.5q2 39 -26 69q-33 35 -81 35v0q-45 0 -76.5 -32 +t-31.5 -76q0 -15 -10.5 -25.5t-25.5 -10.5t-25.5 10.5t-10.5 25.5q0 74 52.5 126.5t126.5 53.5q80 0 134 -57q50 -53 46 -123q-2 -37 -19.5 -70t-67.5 -84q-59 -58 -61 -86q-2 -14 -12 -23.5t-24 -9.5zM506 127zM462 127q0 18 13 30.5t30.5 12.5t30.5 -12.5t13 -30.5 +t-13 -30.5t-30.5 -12.5t-30.5 12.5t-13 30.5z" /> + <glyph glyph-name="pause" unicode="&#xe63d;" +d="M326 704v0q-15 0 -25.5 -11t-10.5 -25v-568q0 -14 10.5 -25t25.5 -11v0q15 0 25 11t9 25v568q1 14 -9 25t-25 11zM698 704v0q-14 0 -25 -11t-11 -25v-568q0 -14 11 -25t25 -11v0q15 0 25.5 11t10.5 25v568q0 14 -10.5 25t-25.5 11z" /> + <glyph glyph-name="pausecircle" unicode="&#xe63e;" +d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM393 228q0 -15 -10.5 -25.5t-25.5 -10.5v0q-15 0 -25.5 10.5t-10.5 25.5v312q0 15 10.5 25.5t25.5 10.5v0 +q15 0 25.5 -10.5t10.5 -25.5v-312zM703 228q0 -15 -10.5 -25.5t-25.5 -10.5v0q-15 0 -25.5 10.5t-10.5 25.5v312q0 15 10.5 25.5t25.5 10.5v0q15 0 25.5 -10.5t10.5 -25.5v-312z" /> + <glyph glyph-name="pausecircleo" unicode="&#xe63f;" +d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171 +q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM357 576v0q-15 0 -25.5 -10.5t-10.5 -25.5v-312q0 -15 10.5 -25.5t25.5 -10.5v0q15 0 25.5 10.5t10.5 25.5v312q0 15 -10.5 25.5t-25.5 10.5zM667 576v0 +q-15 0 -25.5 -10.5t-10.5 -25.5v-312q0 -15 10.5 -25.5t25.5 -10.5v0q15 0 25.5 10.5t10.5 25.5v312q0 15 -10.5 25.5t-25.5 10.5z" /> + <glyph glyph-name="clockcircle" unicode="&#xe640;" +d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM769 356q0 -15 -10.5 -25.5t-25.5 -10.5h-185v0q-30 0 -51 21t-21 51v0v240q0 15 10.5 25.5t25.5 10.5v0 +q15 0 25.5 -10.5t10.5 -25.5v-240h185q15 0 25.5 -10.5t10.5 -25.5v0z" /> + <glyph glyph-name="clockcircleo" unicode="&#xe641;" +d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171 +q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM733 392h-185v240q0 15 -10.5 25.5t-25.5 10.5v0q-15 0 -25.5 -10.5t-10.5 -25.5v-240v0q0 -30 21 -51t51 -21v0h185q15 0 25.5 10.5t10.5 25.5v0 +q0 15 -10.5 25.5t-25.5 10.5z" /> + <glyph glyph-name="swap" unicode="&#xe642;" +d="M194 481q-1 0 -1 0.5t-0.5 0.5h-0.5h-0.5h-0.5h-0.5h-0.5v0h-1h-0.5h-0.5v0l-0.5 0.5l-0.5 0.5h-0.5h-0.5h-0.5h-0.5h-1l-1 1v0v0h-0.5h-0.5l-0.5 0.5l-0.5 0.5h-0.5h-0.5h-1v1h-0.5h-0.5l-0.5 0.5l-0.5 0.5h-0.5h-0.5v0.5v0.5h-1l-1 1v0l-0.5 0.5l-0.5 0.5h-1q-1 2 -2 3 +q-1 0 -1 0.5v0.5v0l-1 1v1h-1v1v0l-0.5 0.5l-0.5 0.5v0v0.5t-0.5 0.5h-0.5v1l-0.5 0.5l-0.5 0.5v1v0v0.5t-0.5 0.5h-0.5v0.5v0.5q0 1 -0.5 1t-0.5 0.5v1v0.5v0v0v0.5v0.5v0.5v0.5l-1 1v0.5v0.5v0.5v0.5v0v0.5v0.5v1v0v1v4v1v0.5v0.5v0.5v0.5v0.5v0.5v0.5v0.5v0l1 1v0.5v0.5 +v0.5v0.5v0v0.5v0.5v0q1 1 1 1.5v0.5v0.5v0.5l0.5 0.5l0.5 0.5v0v0.5v0.5l0.5 0.5l0.5 0.5v0.5t0.5 1l0.5 0.5v0v0v0.5t0.5 0.5t0.5 0.5v0.5l0.5 0.5l0.5 0.5q0 1 1 1v0v1h1l0.5 0.5l0.5 0.5l178 178q10 11 25 11t25 -11v0q11 -11 11 -25.5t-11 -25.5l-116 -116h545 +q15 0 25.5 -10.5t10.5 -25.5v0q0 -15 -10.5 -25.5t-25.5 -10.5h-631v0h-2h-0.5h-0.5zM830 287q1 0 1 -0.5t0.5 -0.5h0.5h0.5h0.5h0.5h0.5v0v0h2v0v0l0.5 -0.5l0.5 -0.5h0.5h0.5h0.5h0.5h1v-1h1v0h0.5h0.5l0.5 -0.5l0.5 -0.5h0.5h0.5h1v-1h0.5h0.5l0.5 -0.5l0.5 -0.5h0.5h0.5 +v-0.5v-0.5h1l1 -1l0.5 -0.5l0.5 -0.5v0h1q1 -2 2 -3q1 0 1 -0.5v-0.5v0l1 -1v-1h1v-1h0.5t0.5 -0.5v-0.5v0v-0.5t0.5 -0.5t0.5 -0.5v-0.5l0.5 -0.5l0.5 -0.5v-0.5v-0.5v-0.5t0.5 -0.5h0.5v-0.5v-0.5v-1l0.5 -0.5t0.5 -1v-0.5v0v-0.5v-0.5v0v-0.5v-0.5l1 -1v-0.5v-0.5v-0.5 +v-0.5v0v-0.5v-0.5v-1v0v-1v-4v-1v-0.5v-1v-0.5v0v-0.5v-0.5v-0.5v-0.5v0l-1 -1v-0.5v-0.5v-0.5v-0.5v0v-0.5v-0.5l-1 -1v-0.5v-0.5v-0.5v-0.5l-0.5 -0.5l-0.5 -0.5v0v-0.5v-0.5l-0.5 -0.5l-0.5 -0.5v-0.5t-0.5 -1l-0.5 -0.5v0v0v-0.5t-0.5 -0.5t-0.5 -0.5v-0.5l-1 -1v0 +q0 -1 -0.5 -1h-0.5v-1h-1l-0.5 -0.5t-0.5 -1.5l-177 -177q-11 -11 -26 -11t-25 11v0q-11 10 -11 25t11 26l116 116h-545q-14 0 -25 10.5t-11 25.5v0q0 15 11 25.5t25 10.5h632v0h1h1z" /> + <glyph glyph-name="swapleft" unicode="&#xe643;" +d="M164 320h-1l-0.5 0.5l-0.5 0.5h-0.5h-0.5h-0.5h-0.5v0h-1h-1v0v0l-0.5 0.5l-0.5 0.5h-0.5h-0.5h-0.5h-0.5h-1l-1 1v0v0h-0.5h-0.5l-0.5 0.5l-0.5 0.5h-0.5h-0.5h-1v1h-0.5h-0.5l-0.5 0.5l-0.5 0.5h-0.5h-0.5v0.5v0.5h-1l-1 1v0l-0.5 0.5l-0.5 0.5h-1q-1 2 -2 3 +q-1 0 -1 0.5v0.5v0l-1 1v1h-1v1v0l-0.5 0.5l-0.5 0.5v0v0.5t-0.5 0.5h-0.5v1l-0.5 0.5l-0.5 0.5v1v0v0.5t-0.5 0.5h-0.5v0.5v0.5q0 1 -0.5 1t-0.5 0.5v1v0.5v0v0.5v0.5v0v0.5v0.5l-1 1v0.5v0.5v0.5v0.5v0v0.5v0.5v1v1v0v4v1v0.5v0.5v0.5v0.5v0.5v0.5v0.5v0.5v0l1 1v0.5v0.5 +v0.5v0.5v0v0.5v0.5v1q1 0 1 0.5v0.5v0.5v0.5l0.5 0.5l0.5 0.5v0v1v0l0.5 0.5l0.5 0.5v1l0.5 0.5l0.5 0.5v0v0v0.5t0.5 0.5t0.5 0.5v0.5l0.5 0.5l0.5 0.5q0 1 0.5 1h0.5v1h1l0.5 0.5t0.5 1.5l178 177q10 11 25 11t25 -11v0q11 -11 11 -25.5t-11 -25.5l-116 -116h545 +q15 0 25.5 -10.5t10.5 -25.5v0q0 -15 -10.5 -25.5t-25.5 -10.5h-631v0h-2h-1z" /> + <glyph glyph-name="swapright" unicode="&#xe644;" +d="M830 320h1l0.5 0.5l0.5 0.5h0.5h0.5h0.5h0.5v0v0h2v0v0l0.5 0.5l0.5 0.5h0.5h0.5h0.5h0.5h1v1h1v0h0.5h0.5l0.5 0.5l0.5 0.5h0.5h0.5h1v1h0.5h0.5l0.5 0.5l0.5 0.5h0.5h0.5v0.5v0.5h1l1 1v0.5t0.5 0.5h0.5h1q1 2 2 3q1 0 1 0.5v0.5v0l1 1v1h1v1h0.5t0.5 0.5v0.5v0v0.5 +t0.5 0.5t0.5 0.5v0.5l0.5 0.5l0.5 0.5v0.5v0.5v0.5t0.5 0.5h0.5v0.5v0.5v1l0.5 0.5t0.5 1v0.5v0v0v0.5v0.5v0.5v0.5l1 1v0.5v0.5v0.5v0.5v0v0.5v0.5v1v1v0v4v1v0.5v0.5v0.5v0.5v0.5v0.5v0.5v0.5v0l-1 1v0.5v0.5v0.5v0.5v0v0.5v0.5l-1 1v0.5v0.5v0.5v0.5l-0.5 0.5l-0.5 0.5v0 +v0.5v0.5l-0.5 0.5l-0.5 0.5v0.5t-0.5 1l-0.5 0.5v0v0l-0.5 0.5l-0.5 0.5v0.5v0.5l-0.5 0.5l-0.5 0.5q0 1 -1 1v0l-0.5 0.5l-0.5 0.5l-0.5 0.5t-0.5 1.5l-177 177q-11 11 -26 11t-25 -11v0q-11 -10 -11 -25t11 -26l116 -116h-545q-14 0 -25 -10.5t-11 -25.5v0q0 -15 11 -25.5 +t25 -10.5h632v0h1h0.5h0.5z" /> + <glyph glyph-name="plussquareo" unicode="&#xe645;" +d="M888 760v0v0v-753v0h-752v0v753v0h752zM888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21v0zM732 420h-184v183q0 15 -10.5 25.5t-25.5 10.5v0q-14 0 -25 -10.5t-11 -25.5v-183h-184 +q-15 0 -25.5 -11t-10.5 -25v0q0 -15 10.5 -25.5t25.5 -10.5h184v-183q0 -15 11 -25.5t25 -10.5v0q15 0 25.5 10.5t10.5 25.5v183h184q15 0 25.5 10.5t10.5 25.5v0q0 14 -10.5 25t-25.5 11z" /> + <glyph glyph-name="frown" unicode="&#xe646;" +d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM254 454q-25 0 -42.5 17.5t-17.5 42t17.5 42.5t42.5 18t42.5 -18t17.5 -42.5t-17.5 -42t-42.5 -17.5zM640 130 +q-15 0 -25.5 11t-10.5 25q0 39 -27 66t-65 27t-65 -27t-27 -66q0 -14 -10.5 -25t-25.5 -11t-25.5 11t-10.5 25q0 68 48 116.5t116 48.5t116 -48.5t48 -116.5q0 -14 -10.5 -25t-25.5 -11zM769.5 454q-24.5 0 -42 17.5t-17.5 42t17.5 42.5t42 18t42.5 -18t18 -42.5t-18 -42 +t-42.5 -17.5z" /> + <glyph glyph-name="menufold" unicode="&#xe658;" +d="M97 695h828q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-828q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5zM923 450h-565q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h565q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM925 72h-825 +q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h825q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM195 281q11 -10 25 -10q15 0 26 11q10 10 10 25t-10 25l-96 94l94 88q11 11 11.5 26t-10 25.5t-25.5 11t-25 -9.5l-121 -114q-12 -11 -12 -26t11 -26z" /> + <glyph glyph-name="mail" unicode="&#xe659;" +d="M886 768h-753q-30 0 -51 -21t-21 -51v-626q0 -30 21 -51t51 -21h753q30 0 51 21t21 51v626q0 30 -21 51t-51 21zM809 696l-268 -224l-2 -1l-1 -2q-11 -11 -26 -11h-1q-15 0 -25 11l-2 1l-274 226h599zM886 70h-753v0v597l303 -250q31 -31 76 -31v0q45 0 76 32l298 249 +v-597v0z" /> + <glyph glyph-name="link" unicode="&#xe65b;" +d="M542 230l-179 -179q-39 -38 -93 -38t-92 38q-39 39 -39 93t39 93l178 179q11 10 11 25t-10.5 25.5t-25.5 10.5t-25 -11l-179 -178q-60 -60 -60 -144t59.5 -143.5t143.5 -59.5t144 59l179 179q10 11 10 26t-10.5 25.5t-25.5 10.5t-25 -11zM899.5 773.5 +q-59.5 59.5 -143.5 59.5t-144 -60l-179 -179q-10 -10 -10 -25t10.5 -25.5t25.5 -10.5t25 10l179 179q39 39 93 39t92.5 -38.5t38.5 -93t-39 -92.5l-178 -179q-11 -10 -11 -25t10.5 -25.5t25.5 -10.5t26 10l179 179q59 60 59 144t-59.5 143.5zM486 308l102 102q11 10 11 25 +t-10.5 25.5t-25.5 10.5t-25 -11l-102 -102q-11 -10 -11 -25t10.5 -25.5t25.5 -10.5t25 11z" /> + <glyph glyph-name="areachart" unicode="&#xe65c;" +d="M923 -64h-824q-15 0 -25.5 10.5t-10.5 25.5v825q0 15 10.5 25.5t25.5 10.5t25.5 -10.5t10.5 -25.5v-789h788q15 0 25.5 -10.5t10.5 -25.5t-10.5 -25.5t-25.5 -10.5zM192 96l117 209q4 7 12 9.5t16 -0.5l111 -52l118 171q11 15 27 7l110 -56l160 251q7 11 19.5 7.5 +t12.5 -16.5v-520q0 -16 -11.5 -27.5t-27.5 -11.5h-646q-11 0 -17 9.5t-1 19.5z" /> + <glyph glyph-name="linechart" unicode="&#xe65d;" +d="M923 -64h-824q-15 0 -25.5 10.5t-10.5 25.5v825q0 15 10.5 25.5t25.5 10.5t25.5 -10.5t10.5 -25.5v-789h788q15 0 25.5 -10.5t10.5 -25.5t-10.5 -25.5t-25.5 -10.5zM385 153q-19 0 -30 16l-157 250q-8 13 -5 27.5t15.5 22.5t27 5t22.5 -15l112 -182l46 177q4 16 19 23 +l182 88q13 6 26 2.5t21 -15.5l91 -148l134 403q5 14 18 21t27 2t21 -18t2 -27l-158 -477q-7 -22 -30 -24.5t-35 16.5l-115 186l-137 -66l-62 -240q-6 -23 -29 -26q-3 -1 -6 -1z" /> + <glyph glyph-name="home" unicode="&#xe65e;" +d="M932 454l-372 358q-20 18 -48 18t-48 -18l-372 -358q-11 -10 -12 -25t9 -26v0q10 -11 25 -12t26 9l372 358l372 -358q11 -10 26 -9t25 12v0q10 11 9 26t-12 25zM833 321v0q-15 0 -25.5 -10.5t-10.5 -25.5v-277h-143v240q0 30 -21 51t-51 21h-140q-30 0 -51 -21t-21 -51 +v-240h-143v277q0 15 -10.5 25.5t-25.5 10.5v0q-15 0 -25.5 -10.5t-10.5 -25.5v-277q0 -30 21 -51t51 -21h570q30 0 51 21t21 51v277q0 15 -10.5 25.5t-25.5 10.5zM442 248h140v-240h-140v240z" /> + <glyph glyph-name="laptop" unicode="&#xe65f;" +d="M887 760v0v0v-559v0l-752 -1v0v560v0h752zM887 832h-752q-30 0 -51 -21t-21 -51v-559q0 -30 21 -51t51 -21h752q30 0 51 21t21 51v559q0 30 -21 51t-51 21v0zM923 -16h-824q-15 0 -25.5 10.5t-10.5 25.5v0q0 15 10.5 25.5t25.5 10.5h824q15 0 25.5 -10.5t10.5 -25.5v0 +q0 -15 -10.5 -25.5t-25.5 -10.5z" /> + <glyph glyph-name="star" unicode="&#xe660;" +d="M956 497.5q-8 23.5 -26.5 39t-42.5 19.5l-205 31l-92 195q-11 24 -33 37q-21 13 -45 13t-45 -13q-22 -13 -33 -37l-92 -195l-205 -31q-24 -4 -42.5 -19.5t-26.5 -39t-2.5 -47t22.5 -41.5l151 -154l-36 -218q-6 -40 20 -70.5t66 -30.5q22 0 42 11l181 100l181 -100 +q20 -11 42 -11q40 0 66 30.5t20 70.5l-36 218l151 154q17 18 22.5 41.5t-2.5 47z" /> + <glyph glyph-name="staro" unicode="&#xe661;" +d="M512 760q9 0 13 -9l105 -222q3 -7 11 -9l235 -35q9 -2 12 -10.5t-4 -14.5l-171 -176q-5 -5 -4 -12l41 -247q1 -7 -3.5 -12t-11.5 -5q-4 0 -7 2l-209 115q-3 2 -7 2t-7 -2l-209 -115q-3 -2 -7 -2q-7 0 -11.5 5t-3.5 12l41 247q1 7 -4 12l-171 176q-7 6 -4 14.5t12 9.5 +l235 36q8 1 11 9l105 222q4 9 13 9zM512 832q-24 0 -45 -13q-22 -13 -33 -37l-92 -195l-205 -31q-24 -4 -42.5 -19.5t-26.5 -39t-2.5 -47t22.5 -41.5l151 -154l-36 -218q-6 -40 20 -70.5t66 -30.5q22 0 42 11l181 100l181 -100q20 -11 42 -11q40 0 66 30.5t20 70.5l-36 218 +l151 154q17 18 22.5 41.5t-2.5 47t-26.5 39t-42.5 19.5l-205 31l-92 195q-11 24 -33 37q-21 13 -45 13v0z" /> + <glyph glyph-name="filter" unicode="&#xe663;" +d="M890.5 719.5q-9.5 23.5 -30.5 37t-46 13.5h-602q-25 0 -46 -13.5t-30.5 -37t-4.5 -48t22 -42.5l273 -263v-262q0 -15 11 -25l125 -129q10 -11 26 -11q6 0 13 2q23 9 23 34v393l248 261q18 18 23 42.5t-4.5 48zM821 680l-259 -272q-10 -10 -10 -25v-322l-54 58v262 +q0 15 -10 25l-284 274q-5 5 -2 11.5t10 6.5h602q7 0 9.5 -6.5t-2.5 -11.5z" /> + <glyph glyph-name="meho" unicode="&#xe666;" +d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM254 454q-25 0 -42.5 17.5t-17.5 42t17.5 42.5t42.5 18t42.5 -18t17.5 -42.5t-17.5 -42t-42.5 -17.5zM643 118 +h-264q-15 0 -25.5 10.5t-10.5 25.5t10.5 25.5t25.5 10.5h264q15 0 25.5 -10.5t10.5 -25.5t-10.5 -25.5t-25.5 -10.5zM769.5 454q-24.5 0 -42 17.5t-17.5 42t17.5 42.5t42 18t42.5 -18t18 -42.5t-18 -42t-42.5 -17.5z" /> + <glyph glyph-name="meh" unicode="&#xe667;" +d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171 +q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM254 514zM194 513.5q0 24.5 17.5 42.5t42.5 18t42.5 -18t17.5 -42.5t-17.5 -42t-42.5 -17.5t-42.5 17.5t-17.5 42zM770 514zM710 513.5q0 24.5 17.5 42.5 +t42 18t42.5 -18t18 -42.5t-18 -42t-42.5 -17.5t-42 17.5t-17.5 42zM643 190h-264q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h264q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5z" /> + <glyph glyph-name="shoppingcart" unicode="&#xe668;" +d="M923 194h-596l30 61l497 1q13 0 22.5 8t11.5 20l69 386q3 16 -7.5 28t-26.5 12l-632 3l-5 25q-3 12 -13 20t-22 8h-155q-14 0 -24.5 -10.5t-10.5 -25t10.5 -25t24.5 -10.5h126l24 -112l58 -281l-75 -122q-13 -18 -3 -37t32 -19h63q-21 -28 -21 -62q0 -43 30 -73t72.5 -30 +t72.5 30t30 73q0 34 -20 62h161q-21 -28 -21 -62q0 -43 30 -73t72.5 -30t72.5 30t30 73q0 34 -20 62h113q15 0 25 10t10 24.5t-10 25t-25 10.5zM306 643l576 -2l-57 -316l-452 -1zM403 30q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5t22 -9.5t9 -22.5t-9 -22.5t-22 -9.5z +M728 30q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5t22 -9.5t9 -22.5t-9 -22.5t-22 -9.5z" /> + <glyph glyph-name="save" unicode="&#xe669;" +d="M650 768h-450q-30 0 -51 -21t-21 -51v-623q0 -30 21 -51t51 -21h623q30 0 51 21t21 51v450zM329 696h217v-206q0 -15 -10.5 -25.5t-25.5 -10.5h-145q-15 0 -25.5 10.5t-10.5 25.5v206zM823 73h-623v623h57v-206q0 -45 31.5 -76.5t76.5 -31.5h145q44 0 76 32t32 76v206h2 +l203 -203v-420v0zM469 526q15 0 25.5 10.5t10.5 25.5v43q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-43q0 -15 10.5 -25.5t25.5 -10.5z" /> + <glyph glyph-name="user" unicode="&#xe66a;" +d="M819 103q-25 60 -71 106t-106 71q-20 9 -42 15q61 20 107 66q81 81 81 195t-81 194.5t-195 80.5t-194.5 -80.5t-80.5 -194.5t80 -195q46 -46 107 -66q-23 -6 -42 -15q-60 -25 -106 -71t-71 -106q-26 -62 -26 -130q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5 +q0 108 76.5 185t185 77t185 -76.5t76.5 -185.5q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5q-1 68 -27 130zM309 556q0 84 59.5 143.5t143.5 59.5t143.5 -59.5t59.5 -143.5t-59.5 -144t-143.5 -60t-143.5 60t-59.5 144z" /> + <glyph glyph-name="videocamera" unicode="&#xe66b;" +d="M1010 573q-11 10 -26 10q-9 0 -18 -5l-126 -67v188q0 29 -20.5 50t-50.5 21h-698q-29 0 -50 -21t-21 -50v-630q0 -29 21 -50t50 -21h698q30 0 50.5 21t20.5 50v203l123 -79q10 -6 22 -6q13 0 25 9q14 12 14 31v316q0 18 -14 30zM945 477v-178l-103 66v57zM761 667v-566 +q0 -10 -6.5 -17t-16.5 -7h-636q-9 0 -16 7t-7 17v566q0 10 7 17t16 7h636q10 0 16.5 -7t6.5 -17z" /> + <glyph glyph-name="totop" unicode="&#xe66c;" +d="M920 74h-816q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h816q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM365.5 576q14.5 0 25.5 10l85 85v-449q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v449l85 -85q10 -10 25 -10t25.5 10.5t10.5 25.5 +t-10 25l-146 146q-11 11 -26 11t-25 -11l-147 -146q-10 -11 -10 -25.5t10.5 -25t25 -10.5z" /> + <glyph glyph-name="team" unicode="&#xe66d;" +d="M839 409q-30 30 -67 47q44 23 72 64q35 51 35 113q0 84 -59 142.5t-142 58.5q-65 0 -117 -36q-45 -33 -67 -83q-60 64 -147 64q-84 0 -143 -59t-59 -142q0 -62 35 -113q28 -41 73 -65q-38 -17 -68 -47q-67 -67 -67 -161v-165q0 -37 26.5 -64t64.5 -27h276q27 0 49.5 15.5 +t33.5 40.5h248q37 0 64 26.5t27 63.5v165q-1 95 -68 162zM586 725q38 38 92 38t92 -38t38 -91.5t-38 -92t-92 -38.5t-92 38t-38 92t38 92zM216 578q0 54 38 92t92 38t92 -38t38 -92t-38 -92t-92 -38t-92 38t-38 92zM504 27q0 -8 -6 -13.5t-14 -5.5h-276q-8 0 -13.5 5.5 +t-5.5 13.5v165q0 65 46 111t111 46t112 -46l1 -1v-1q45 -46 45 -109v-165zM486 372q-21 17 -46 28q62 33 90 96q24 -25 54 -40q-38 -17 -68 -47q-17 -17 -30 -37zM835 82q0 -8 -5.5 -13.5t-13.5 -5.5h-241v129q0 69 -38 126q12 23 29 40q47 47 112 47t111 -46.5t46 -111.5 +v-165z" /> + <glyph glyph-name="sharealt" unicode="&#xe671;" +d="M814 233q-38 0 -70.5 -18t-53.5 -49l-236 168q6 24 6 48q0 39 -15 75l257 130q45 -51 112 -51q61 0 104.5 43.5t43.5 104.5t-43.5 104.5t-104.5 43.5t-104.5 -43.5t-43.5 -104.5q0 -17 4 -33l-264 -133q-59 62 -144 62q-82 0 -140 -58t-58 -140t58 -140t140 -58 +q49 0 91.5 22.5t69.5 60.5l243 -172v-10q0 -61 43.5 -104.5t104.5 -43.5t104.5 43.5t43.5 104.5t-43.5 104.5t-104.5 43.5zM814 760q31 0 53.5 -22.5t22.5 -54t-22.5 -53.5t-53.5 -22t-53.5 22t-22.5 53.5t22.5 54t53.5 22.5zM262 256q-52 0 -89 37t-37 89t37 89t89 37 +t89 -37t37 -89t-37 -89t-89 -37zM814 9q-31 0 -53.5 22t-22.5 53.5t22.5 54t53.5 22.5t53.5 -22.5t22.5 -54t-22.5 -53.5t-53.5 -22z" /> + <glyph glyph-name="setting" unicode="&#xe672;" +d="M962 456l-4 24l-73 25q-10 30 -24 58l34 69l-14 19q-43 60 -102 103l-20 14l-69 -35q-28 14 -58 24l-24 73l-24 4q-39 6 -72 6t-72 -6l-24 -4l-25 -73q-30 -10 -57 -24l-69 35l-20 -15q-59 -43 -102 -102l-14 -20l34 -69q-14 -28 -24 -57l-73 -25l-4 -24q-6 -39 -6 -72 +t6 -72l4 -24l73 -25q10 -30 24 -57l-34 -69l14 -20q22 -30 47 -55q23 -23 55 -47l20 -14l69 34q28 -14 57 -24l25 -73l24 -4q39 -6 72 -6t72 6l24 4l25 73q29 10 57 24l69 -35l20 15q32 23 55 47q24 23 47 55l14 20l-34 69q14 28 24 58l73 24l4 24q6 39 6 72t-6 72zM896 385 +v-1q0 -19 -2 -42l-36 -11l-31 -11l-10 -32q-8 -27 -21 -52l-16 -29l32 -63q-14 -17 -28 -31v-1q-14 -14 -32 -27l-62 31l-29 -15q-26 -13 -54 -22l-31 -10l-10 -31l-12 -35q-21 -3 -42 -3q-19 0 -42 3l-11 35l-11 31l-31 10q-28 9 -53 22l-29 15l-30 -15l-33 -16 +q-17 13 -31 28q-15 14 -28 31l31 62l-15 29q-14 27 -22 53l-10 32l-66 22q-3 21 -3 42q0 19 3 42l66 22l10 31q8 27 22 53l15 30l-15 29l-16 33q26 33 59 59l62 -31l30 15q25 14 53 22l31 10l10 31l12 36q23 2 42 2q20 0 42 -2l22 -67l31 -9q28 -9 54 -22l29 -16l62 32 +q33 -27 60 -60l-32 -62l15 -29q14 -26 23 -53l9 -32l31 -10l36 -12q3 -22 2 -41zM512 558q-72 0 -123 -51t-51 -123t51 -123t123 -51t123 51t51 123t-51 123t-123 51zM584 312q-30 -30 -72 -30t-72 30t-30 72t30 72t72.5 30t72 -30t29.5 -72t-30 -72z" /> + <glyph glyph-name="picture" unicode="&#xe674;" +d="M886 768h-752q-30 0 -51 -21.5t-21 -50.5v-626q0 -29 21 -50.5t51 -21.5h752q30 0 51 21.5t21 50.5v626q0 30 -21 51t-51 21zM886 70v0h-752v0v213l186 190l217 -270q9 -10 22.5 -11.5t24.5 5.5l161 109l141 -67v-169zM886 330l-118 48q-21 16 -42 2l-156 -105l-222 275 +q-10 12 -26 12t-27 -11l-161 -165v310v0h752v0v-366zM696 622q-42 0 -71.5 -29.5t-29.5 -71.5t29.5 -71.5t71.5 -29.5t71.5 29.5t29.5 71.5t-29.5 71.5t-71.5 29.5zM696 492q-12 0 -20.5 8.5t-8.5 20.5t8.5 20.5t20.5 8.5t20.5 -8.5t8.5 -20.5t-8.5 -20.5t-20.5 -8.5z" /> + <glyph glyph-name="phone" unicode="&#xe675;" +d="M914 733q-66 101 -128 101q-36 0 -64 -28q-48 -48 -77 -93q-44 -68 -29 -115q4 -15 17.5 -31t44.5 -47v0q32 -32 38 -41q10 -14 -19 -60q-27 -43 -99 -118q-61 -58 -99 -85q-48 -35 -71 -35q-5 0 -8 2q-9 7 -41 38q-32 32 -47.5 45t-30.5 17q-12 4 -25 4q-43 0 -100 -40 +q-40 -27 -82 -70q-33 -32 -28 -73q6 -57 100 -119q78 -50 176 -50q101 0 210.5 53.5t206.5 151.5q68 68 117 144q48 76 70 153q49 170 -32 296zM878 457q-20 -67 -63 -135q-43 -69 -106 -132q-44 -44 -92 -80q-47 -34 -95 -58q-47 -22 -93 -34q-45 -12 -87 -12 +q-77 0 -137 39q-35 23 -52 40q-16 16 -17 27q-1 7 8 15q39 39 72 62q39 27 60 27q2 0 3 -1q5 -2 12 -9q11 -9 38 -35q35 -36 49 -46l2 -1q21 -14 48 -14q24 0 52 12q27 11 61 36q41 30 106 91l1 1l2 2q76 80 107 129q16 25 24 47q7 20 8 37q2 31 -15 55q-10 14 -44 48l-2 2 +q-26 26 -35 37q-7 9 -9 13q-4 16 21 55q24 37 67 80v0q8 8 14 8q10 0 26 -15q18 -17 42 -54q31 -48 38 -106q6 -62 -14 -131z" /> + <glyph glyph-name="paperclip" unicode="&#xe676;" +d="M885 629q-73 72 -177 72v0q-49 0 -94 -18q-46 -18 -82 -53l-233 -231q-42 -41 -41.5 -99.5t42 -100t100.5 -41.5h1q59 0 100 41l205 202q10 10 10 25t-10 25q-11 10 -25.5 10t-25.5 -10l-204 -202q-21 -21 -50 -21h-1q-30 1 -50 21q-21 21 -21 50.5t20 49.5l233 231 +q52 50 126 50v0q74 0 126.5 -51.5t52.5 -124.5t-52 -124l-247 -245q-76 -75 -186 -75v0q-110 0 -187 76.5t-77.5 184.5t76.5 184l319 316q10 10 10 24.5t-10 25.5q-11 10 -25.5 10t-25.5 -10l-319 -316q-47 -47 -73 -109q-24 -60 -24 -125t25 -125q25 -62 73 -110 +q48 -47 111 -72q60 -25 127 -25v0q66 0 126 24q63 25 110 72l248 245q35 35 54 81q18 45 18 93q0 103 -73 175z" /> + <glyph glyph-name="notification" unicode="&#xe677;" +d="M922 518h-57v18q0 20 -14 34.5t-34 14.5h-172q-12 24 -33 24q-70 0 -145 22.5t-132 54.5t-103 63.5t-72 54t-25 22.5q-10 6 -22 6q-19 0 -33 -13.5t-14 -33.5v-801q0 -20 14 -34t33 -14q13 0 24 7q4 6 12.5 15t35 36t55.5 52t73.5 55t89 51.5t101 36.5t111.5 15 +q19 0 30 22h4q2 -74 -25 -171q-6 -20 1.5 -39.5t24.5 -31.5q16 -10 35 -10q22 0 40 15q84 69 105 169q7 34 6 68q4 5 10 14q19 29 19 45v23h57q15 0 25.5 10.5t10.5 25.5v138q0 15 -10.5 25.5t-25.5 10.5zM584 275q-92 -6 -186 -46q-84 -36 -167 -98q-48 -37 -93 -81v679 +q50 -39 104 -73q83 -51 165 -81q91 -33 177 -37v-2v-7v-253v-1zM793 291q-6 -10 -14 -21q-5 -3 -8 -7q-11 -13 -8 -30v0q4 -27 -3 -60q-13 -62 -59 -109q29 116 18 202q-2 14 -12 23t-24 9h-25v30q0 4 -2 9v176h137v-222zM886 380h-21v66h21v-66z" /> + <glyph glyph-name="menuunfold" unicode="&#xe679;" +d="M925 695h-828q-15 0 -25.5 10.5t-10.5 25.5t10.5 25.5t25.5 10.5h828q15 0 25.5 -10.5t10.5 -25.5t-10.5 -25.5t-25.5 -10.5zM99 450h565q15 0 25.5 -10.5t10.5 -25.5t-10.5 -25.5t-25.5 -10.5h-565q-15 0 -25.5 10.5t-10.5 25.5t10.5 25.5t25.5 10.5zM97 72h825 +q15 0 25.5 -10.5t10.5 -25.5t-10.5 -25.5t-25.5 -10.5h-825q-15 0 -25.5 10.5t-10.5 25.5t10.5 25.5t25.5 10.5zM827 281q-11 -10 -26 -10t-25 11q-11 10 -11 25t11 25l96 94l-94 88q-11 11 -11.5 26t9.5 25.5t25 11t26 -9.5l121 -114q11 -11 11 -26t-11 -26z" /> + <glyph glyph-name="inbox" unicode="&#xe67a;" +d="M885 450v0l-112 286q-4 12 -14 19.5t-23 7.5h-455q-13 0 -23 -8t-14 -20l-105 -282v-1v0q-2 -8 -1 -15v-5v-366q0 -25 17.5 -43t42.5 -18h628q25 0 43 18t18 43v366q0 3 -1 4q1 7 -1 14zM589 493v-16q0 -34 -21.5 -54.5t-55.5 -20.5t-55 20.5t-21 54.5l-1 16h-205l79 193 +h399l82 -193h-201zM214 416h158q18 -43 55 -67t85 -24q52 0 90 27q34 24 51 64h157v-334h-596v334z" /> + <glyph glyph-name="lock" unicode="&#xe67b;" +d="M801 596q-24 60 -67 106q-43 45 -100 71q-58 26 -122 26t-122 -26q-56 -26 -99.5 -71.5t-67.5 -105.5q-25 -61 -25 -128v-436q0 -26 18 -45t43 -19h505q26 0 44 19t18 45v385v17v34q0 67 -25 128zM414 714h1l1 1q45 21 96 21q50 0 96 -21q45 -20 80 -57t54 -85 +q21 -50 21 -105v-27h-502v0v27q0 55 20 105q20 48 55 85t78 56zM763 377v-345v-1h-502v1v345h502zM483 235v-83q0 -12 8.5 -20.5t20.5 -8.5t21 8.5t9 20.5v83q24 16 24 46q0 22 -15.5 38t-38 16t-38.5 -16t-16 -38q0 -30 25 -46z" /> + <glyph glyph-name="qrcode" unicode="&#xe67c;" +d="M876 492h-63v-103h-91v103h-153v102h-51v39h51v52h51v63h-51v51h-166v-63h103v-39h-52v-115h52v-90h-52v-52h-90v52h-63v-52h-39v52h-115v-52h-51v-63h63v51h91v-51h51v-102h63v102h102v52h193v-40h-153v-63h51v-102h114v63h-51v39h205v51h39v-51h63v63h-51v103zM466 287 +h-63v-166h51v-39h-51v-63h103v-51h63v51h51v63h-63v-51h-39v90h102v64h-154v102zM96 338h63v-63h-63v63zM153 531h154q23 0 40 17t17 40v154q0 23 -17 40t-40 17h-154q-23 0 -40 -17t-17 -40v-154q0 -23 17 -40t40 -17zM159 594v142h142v-142h-142zM198 697h64v-64h-64v64z +M870 799h-154q-23 0 -40 -17t-17 -40v-154q0 -23 17 -40t40 -17h154q24 0 40.5 17t16.5 40v154q0 23 -16.5 40t-40.5 17zM864 736v-142h-142v142h142zM762 697h63v-64h-63v64zM870 236h-154q-23 0 -40 -17t-17 -40v-154q0 -24 17 -40.5t40 -16.5h154q24 0 40.5 16.5 +t16.5 40.5v154q0 23 -16.5 40t-40.5 17zM864 173v-142h-142v142h142zM762 133h63v-63h-63v63zM307 236h-154q-23 0 -40 -17t-17 -40v-154q0 -24 17 -40.5t40 -16.5h154q23 0 40 16.5t17 40.5v154q0 23 -17 40t-40 17zM301 173v-142h-142v142h142zM198 133h64v-63h-64v63z +" /> + <glyph glyph-name="tags" unicode="&#xe67d;" +d="M910 352l-360 362q-12 13 -30 13h-362q-26 0 -44 -18t-18 -43v-224q0 -17 12 -30l359 -354q18 -18 43.5 -18t44.5 18l28 28l28 -28q19 -18 44 -18t44 18l210 208q18 17 18 42.5t-17 43.5zM280 457q-32 0 -54.5 22.5t-22.5 54.5t22.5 54.5t54.5 22.5t54.5 -22.5 +t22.5 -54.5t-22.5 -54.5t-54.5 -22.5v0zM869 306l-210 -207q-2 -2 -4 -2t-4 2l-32 31l142 140q16 16 16 39t-16 39l-319 322h72l355 -358q1 -1 1 -3t-1 -3v0zM869 306zM280 560q-11 0 -18.5 -7.5t-7.5 -18.5t7.5 -18.5t18.5 -7.5t18.5 7.5t7.5 18.5t-7.5 18.5t-18.5 7.5v0z +" /> + <glyph glyph-name="tagso" unicode="&#xe67e;" +d="M280 617q-34 0 -58.5 -24t-24.5 -58.5t24.5 -59t58.5 -24.5t58.5 24.5t24.5 59t-24.5 58.5t-58.5 24zM280 514q-8 0 -14 6t-6 14t6 14t14 6t14 -6t6 -14t-6 -14t-14 -6zM910 352l-360 362q-12 13 -30 13h-362q-26 0 -44 -18t-18 -43v-224q0 -17 12 -30l359 -354 +q18 -18 43.5 -18t44.5 18l28 28l28 -28q19 -18 44 -18t44 18l210 208q18 17 18 42.5t-17 43.5zM765 266q18 17 18 42.5t-18 43.5l-309 312h56l351 -355l-208 -205l-27 26zM159 451v213h209l351 -355l-140 -138l-37 -36l-31 -31z" /> + <glyph glyph-name="cloudo" unicode="&#xe67f;" +d="M702 35h-404q-48 0 -90.5 17t-76.5 50q-34 34 -52 76t-18 90q0 83 53 147q19 23 42 40q0 38 15 71q14 33 41 60l1 1q27 26 61 39.5t72 13.5q12 0 24 -1q24 26 54 46q72 48 159 48q58 0 109 -20q51 -21 92 -61q42 -41 63 -90q14 -34 19 -71q32 -25 55 -60l7 -11v-1 +q35 -59 35 -128q0 -52 -19 -99q-20 -46 -58 -83t-84 -56q-47 -18 -100 -18zM263 535q-18 -17 -26 -37v0q-9 -21 -9 -44q0 -7 1 -13l2 -23l-19 -12q-24 -14 -43 -37v0q-36 -44 -36 -101q0 -33 12 -62t36.5 -52.5t53.5 -35.5q29 -11 63 -11h404q39 0 72.5 13.5t61 40 +t41.5 59.5t14 71q0 54 -29 98l-2 4q-20 29 -49 49l-14 10l-2 17q-2 34 -15 64q-15 37 -47 67q-31 31 -68 46q-38 15 -82 15q-66 0 -119 -35q-30 -21 -51 -48l-15 -19l-23 6q-14 4 -30 3q-24 0 -44.5 -8t-37.5 -25z" /> + <glyph glyph-name="cloud" unicode="&#xe680;" +d="M926 411v1l-1 2q-26 39 -65 66q-3 43 -20 82q-20 48 -59 86t-88 58q-48 19 -103 19q-84 0 -152 -45q-38 -26 -65 -61q-21 5 -42 5q-34 0 -64 -12t-54 -35q-25 -24 -37 -53q-13 -30 -13 -64q0 -10 1 -18q-31 -19 -56 -49q-48 -59 -48 -135q0 -44 16 -83t48 -70t71 -46.5 +t84 -15.5h440q50 0 94 17q44 18 79 53q36 35 54 78t18 92q0 70 -38 128z" /> + <glyph glyph-name="cloudupload" unicode="&#xe681;" +d="M926 411v1l-1 2q-26 39 -65 66q-3 43 -20 82q-20 48 -59 86t-88 58q-48 19 -103 19q-84 0 -152 -45q-38 -26 -65 -61q-21 5 -42 5q-34 0 -64 -12t-54 -35q-25 -24 -37 -53q-13 -30 -13 -64q0 -10 1 -18q-31 -19 -56 -49q-48 -59 -48 -135q0 -44 16 -83t48 -70t71 -46.5 +t84 -15.5h440q50 0 94 17q44 18 79 53q36 35 54 78t18 92q0 70 -38 128zM751.5 367.5q-10.5 -10.5 -25.5 -10.5t-26 11l-68 68v-246q0 -15 -10.5 -25.5t-25.5 -10.5t-25.5 10.5t-10.5 25.5v246l-68 -69q-11 -10 -25.5 -10t-25 10.5t-10.5 25.5t10 25l130 130q10 10 25 10 +t25 -10l130 -130q11 -10 11 -25t-10.5 -25.5z" /> + <glyph glyph-name="clouddownload" unicode="&#xe682;" +d="M926 411v1l-1 2q-26 39 -65 66q-3 43 -20 82q-20 48 -59 86t-88 58q-48 19 -103 19q-84 0 -152 -45q-38 -26 -65 -61q-21 5 -42 5q-34 0 -64 -12t-54 -35q-25 -24 -37 -53q-13 -30 -13 -64q0 -10 1 -18q-31 -19 -56 -49q-48 -59 -48 -135q0 -44 16 -83t48 -70t71 -46.5 +t84 -15.5h440q50 0 94 17q44 18 79 53q36 35 54 78t18 92q0 70 -38 128zM751 294l-129 -130q-11 -10 -26 -10t-25 10l-130 130q-10 10 -10 25t10.5 25.5t25 10.5t25.5 -11l68 -68v246q0 15 10.5 25.5t25.5 10.5t25.5 -10.5t10.5 -25.5v-246l69 68q10 11 25 11t25.5 -10.5 +t10.5 -25.5t-11 -25z" /> + <glyph glyph-name="clouddownloado" unicode="&#xe683;" +d="M926 411v1l-1 2q-26 39 -65 66q-3 43 -20 82q-20 48 -59 86t-88 58q-48 19 -103 19q-84 0 -152 -45q-38 -26 -65 -61q-21 5 -42 5q-34 0 -64 -12t-54 -35q-25 -24 -37 -53q-13 -30 -13 -64q0 -10 1 -18q-31 -19 -56 -49q-48 -59 -48 -135q0 -44 16 -83t48 -70t71 -46.5 +t84 -15.5h440q50 0 94 17q44 18 79 53q36 35 54 78t18 92q0 70 -38 128zM142 203q-11 25 -11 55q0 25 8 47t24 42h1q17 22 40 35l38 22l-6 43q-1 5 -1 13q0 19 7 36v1q7 16 21 29t31 20t36 7q15 0 28 -4l43 -12l26 36q21 27 51 48q50 33 111 33q42 0 77 -15q36 -14 65 -42 +q29 -29 43 -63q13 -29 15 -63l1 -31l27 -18q27 -18 46 -45l2 -3q14 -21 21 -43.5t7 -47.5q0 -35 -13 -65t-38.5 -54.5t-55.5 -36.5q-31 -13 -67 -13h-440q-31 0 -57 11q-25 10 -48 31q-21 21 -31 45v0zM466.5 355q14.5 0 25.5 -11l68 -68v246q0 15 10.5 25.5t25.5 10.5 +t25.5 -10.5t10.5 -25.5v-246l69 68q10 11 25 11t25.5 -10.5t10.5 -25.5t-11 -25l-129 -130q-11 -10 -26 -10t-25 10l-130 130q-10 10 -10 25t10.5 25.5t25 10.5z" /> + <glyph glyph-name="clouduploado" unicode="&#xe684;" +d="M926 411v1l-1 2q-26 39 -65 66q-3 43 -20 82q-20 48 -59 86t-88 58q-48 19 -103 19q-84 0 -152 -45q-38 -26 -65 -61q-21 5 -42 5q-34 0 -64 -12t-54 -35q-25 -24 -37 -53q-13 -30 -13 -64q0 -10 1 -18q-31 -19 -56 -49q-48 -59 -48 -135q0 -44 16 -83t48 -70t71 -46.5 +t84 -15.5h440q50 0 94 17q44 18 79 53q36 35 54 78t18 92q0 70 -38 128zM142 203q-11 25 -11 55q0 25 8 47t24 42h1q17 22 40 35l38 22l-6 43q-1 5 -1 13q0 19 7 36v1q7 16 21 29t31 20t36 7q15 0 28 -4l43 -12l26 36q21 27 51 48q50 33 111 33q42 0 77 -15q36 -14 65 -42 +q29 -29 43 -63q13 -29 15 -63l1 -31l27 -18q27 -18 46 -45l2 -3q14 -21 21 -43.5t7 -47.5q0 -35 -13 -65t-38.5 -54.5t-55.5 -36.5q-31 -13 -67 -13h-440q-31 0 -57 11q-25 10 -48 31q-21 21 -31 45v0zM466.5 357q14.5 0 25.5 11l68 68v-246q0 -15 10.5 -25.5t25.5 -10.5 +t25.5 10.5t10.5 25.5v246l69 -68q10 -11 25 -11t25.5 10.5t10.5 25.5t-11 25l-129 130q-11 10 -26 10t-25 -10l-130 -130q-10 -10 -10 -25t10.5 -25.5t25 -10.5z" /> + <glyph glyph-name="enviroment" unicode="&#xe685;" +d="M512 592q-54 0 -92 -38.5t-38 -92.5t38 -92t92 -38t92 38t38 92t-38 92.5t-92 38.5zM871 621q-31 62 -86 109t-125 74q-71 26 -148 26v0q-77 0 -149 -26q-69 -27 -124 -74t-86 -109q-32 -64 -32 -133q0 -97 47 -197q39 -83 109 -164q92 -108 212 -192q10 -7 22.5 -7 +t23.5 7q120 85 212 192q70 82 109 164q47 100 47 197q0 69 -32 133zM655 319q-59 -59 -143 -59t-143 59t-59 142.5t59 142.5t143 59t143 -59t59 -142.5t-59 -142.5z" /> + <glyph glyph-name="enviromento" unicode="&#xe686;" +d="M512 663q-84 0 -143 -59t-59 -142.5t59 -142.5t143 -59t143 59t59 142.5t-59 142.5t-143 59zM512 331q-54 0 -92 38t-38 92t38 92.5t92 38.5t92 -38.5t38 -92.5t-38 -92t-92 -38zM871 621q-31 62 -86 109t-125 74q-71 26 -148 26v0q-77 0 -149 -26q-69 -27 -124 -74 +t-86 -109q-32 -64 -32 -133q0 -97 47 -197q39 -83 109 -164q92 -108 212 -192q10 -7 22.5 -7t23.5 7q120 85 212 192q70 82 109 164q47 100 47 197q0 69 -32 133zM831 487q0 -81 -40 -166q-34 -73 -98 -148q-77 -90 -181 -166q-104 76 -181 166q-63 75 -98 148 +q-40 85 -40 167q0 53 24 102q25 48 69 86q45 39 102 61q60 22 124 22v0q64 0 124 -22q57 -22 102 -61q45 -38 69 -86q24 -50 24 -103z" /> + <glyph glyph-name="eye" unicode="&#xe687;" +d="M512 487q-42 0 -72 -30t-30 -72t30 -72t72 -30t72 30t30 72t-30 72t-72 30zM963 384q0 14 -21 62q-26 65 -61 109q-57 71 -139 112q-99 50 -230 50t-231 -50q-80 -41 -138 -112q-34 -43 -61 -109q-21 -48 -21 -62v0v0v0v0q0 -14 21 -62q27 -66 61 -109q57 -71 139 -112 +q100 -50 230 -50t230 50q81 41 139 112q35 44 62 109q20 48 20 62v0v0v0v0zM512 212q-72 0 -122.5 50.5t-50.5 122t50.5 122.5t122.5 51t122.5 -51t50.5 -122.5t-50.5 -122t-122.5 -50.5z" /> + <glyph glyph-name="eyeo" unicode="&#xe688;" +d="M963 384q0 14 -21 62q-26 65 -61 109q-57 71 -139 112q-99 50 -230 50t-231 -50q-80 -41 -138 -112q-34 -43 -61 -109q-21 -48 -21 -62v0v0v0v0q0 -14 21 -62q27 -66 61 -109q57 -71 139 -112q100 -50 230 -50t230 50q81 41 139 112q35 44 62 109q20 48 20 62v0v0v0v0z +M889 384q-25 -77 -64 -126h-1q-46 -59 -114 -93q-85 -42 -198.5 -42t-198.5 42q-67 34 -114 93q-40 49 -65 126q25 77 65 126q47 59 114 93q85 43 199 43t198 -43q67 -33 114 -93q40 -49 65 -126zM512 558q-72 0 -122.5 -50.5t-50.5 -122.5t50.5 -122.5t122.5 -50.5 +t122.5 50.5t50.5 122.5t-50.5 122.5t-122.5 50.5zM614 385q0 -42 -30 -72t-72 -30t-72 30t-30 72t30 72t72 30t72 -30t30 -72z" /> + <glyph glyph-name="camera" unicode="&#xe689;" +d="M899 659h-168l-94 100h-1q-10 10 -26 10h-196q-16 0 -27 -10v0l-94 -100h-168q-26 0 -44.5 -18.5t-18.5 -44.5v-532q0 -26 18.5 -44.5t44.5 -18.5l774 -1q26 0 44.5 19t18.5 45v532q0 26 -18.5 44.5t-44.5 18.5zM428 696h168l35 -37h-238zM511 164q-72 0 -123 51t-51 123 +t51 123t123 51t123 -51t51 -123t-51 -123t-123 -51zM511 440q-42 0 -72 -30t-30 -72.5t30 -72.5t72.5 -30t72.5 30t30 72.5t-30 72.5t-73 30z" /> + <glyph glyph-name="camerao" unicode="&#xe68a;" +d="M511 164q72 0 123 51t51 123t-51 123t-123 51t-123 -51t-51 -123t51 -123t123 -51zM439 410q30 30 72.5 30t72.5 -30t30 -72.5t-30 -72.5t-72.5 -30t-72.5 30t-30 72.5t30 72.5zM899 659h-168l-94 100h-1q-10 10 -26 10h-196q-16 0 -27 -10v0l-94 -100h-168 +q-26 0 -44.5 -18.5t-18.5 -44.5v-532q0 -26 18.5 -44.5t44.5 -18.5l774 -1q26 0 44.5 19t18.5 45v532q0 26 -18.5 44.5t-44.5 18.5zM428 696h168l35 -37h-238zM881 81h-739v497h739v-497z" /> + <glyph glyph-name="windows" unicode="&#xe68b;" +d="M527 27l434 -71v401h-434v-330zM527 758v-329h434v401zM68 429h367v317l-367 -61v-256zM68 99l367 -60v318h-367v-258z" /> + <glyph glyph-name="export2" unicode="&#xe690;" +d="M248.5 473q14.5 0 25 10.5t10.5 25.5v203q0 8 5.5 13.5t13.5 5.5h567q8 0 13 -5.5t5 -13.5v-587q0 -7 -5 -12.5t-13 -5.5h-255q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h255q37 0 63.5 26.5t26.5 63.5v587q0 38 -26.5 64t-63.5 26h-567q-38 0 -64 -26 +t-26 -64v-203q0 -15 10.5 -25.5t25 -10.5zM622 263q44 66 55 136q2 14 -7 26t-23 14q-3 1 -5 1q-14 0 -24 -9t-12 -22l-3.5 -17.5t-14 -40t-26.5 -50.5q-70 -104 -206 -104h-4q-14 0 -25 -10.5t-11 -25.5v-42l-100 96l101 84v-35q0 -14 10.5 -24.5t25 -10.5t25 10.5 +t10.5 24.5v111q0 23 -20 33q-7 3 -16 3q-12 0 -22 -8l-190 -159q-13 -10 -13 -26q-1 -16 11 -27l190 -181q17 -16 38.5 -7t21.5 33v91q152 13 234 136z" /> + <glyph glyph-name="export" unicode="&#xe691;" +d="M838 330q-15 0 -25.5 -10.5t-10.5 -25.5v-204q0 -8 -5.5 -13t-12.5 -5h-567q-8 0 -13.5 5t-5.5 13v587q0 8 5.5 13.5t13.5 5.5h254q15 0 25.5 10.5t10.5 25t-10.5 25t-25.5 10.5h-254q-37 0 -63.5 -26t-26.5 -64v-587q0 -37 26.5 -63.5t63.5 -26.5h567q37 0 63.5 26.5 +t26.5 63.5v204q0 15 -10.5 25.5t-25.5 10.5zM464 540q-45 -68 -54 -136q-2 -15 7 -26.5t23 -13.5q2 -1 5 -1q13 0 23.5 9t12.5 22q0 5 3 17.5t14 40t27 50.5q70 103 206 104l3 -1q15 0 25.5 10.5t10.5 25.5v42l101 -95l-101 -84v34q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5 +t-10.5 -25.5v-111q0 -22 21 -32q7 -3 15 -3q13 0 23 8l190 158q12 11 13 26q0 17 -11 28l-190 181q-17 16 -39 6.5t-22 -32.5v-91q-152 -13 -234 -136z" /> + <glyph glyph-name="circledowno" unicode="&#xe693;" +d="M512 895q-104 0 -199 -40.5t-163.5 -109t-109 -163t-40.5 -199t40.5 -199t109 -163t163.5 -109t199 -40.5t198.5 40.5t163 109t109 163t40.5 199t-40.5 199t-109 163t-163 109t-198.5 40.5zM822 73q-61 -61 -139 -94q-82 -35 -171.5 -35t-171.5 35q-79 33 -139.5 94 +t-94.5 140q-34 81 -34 170.5t35 171.5q33 79 94 139.5t140 94.5q81 34 170.5 34t171.5 -34q79 -34 139.5 -95t94.5 -139q34 -82 34 -171.5t-34 -171.5q-34 -78 -95 -139zM768 520q-16 0 -28 -12l-229 -229l-228 228q-12 12 -28.5 12t-28 -11.5t-11.5 -28t12 -28.5l256 -255 +q11 -12 27.5 -12t28.5 12l257 256q12 12 12 28.5t-12 27.5q-12 12 -28 12z" /> + <glyph glyph-name="circledown" unicode="&#xe694;" +d="M512 895q-104 0 -199 -40.5t-163.5 -109t-109 -163t-40.5 -199t40.5 -199t109 -163t163.5 -109t199 -40.5t198.5 40.5t163 109t109 163t40.5 199t-40.5 199t-109 163t-163 109t-198.5 40.5zM796 452l-258 -256q-11 -12 -27 -12q-17 0 -28 12l-256 255q-12 12 -12 28.5 +t11.5 28t28 11.5t28.5 -12l227 -228l230 229q12 12 28.5 12t28 -11.5t11.5 -28.5q0 -16 -12 -28z" /> + <glyph glyph-name="hdd" unicode="&#xe69a;" +d="M786 765v0q-4 15 -17 24.5t-29 9.5h-462q-16 0 -29 -9.5t-17 -24.5v0q-3 -8 -68 -243q-68 -245 -68 -248v-257q0 -20 14.5 -34.5t34.5 -14.5h733q20 0 34.5 14.5t14.5 34.5l1 265zM864 224v-193h-705v193h705zM861 287h-699l127 449h440zM588 70q13 0 22.5 9.5t9.5 22.5 +v51q0 13 -9.5 22.5t-22.5 9.5t-22 -9.5t-9 -22.5v-51q0 -13 9 -22.5t22 -9.5zM691 70q13 0 22.5 9.5t9.5 22.5v51q0 13 -9.5 22.5t-22.5 9.5t-22 -9.5t-9 -22.5v-51q0 -13 9 -22.5t22 -9.5zM794 70q13 0 22 9.5t9 22.5v51q0 13 -9 22.5t-22 9.5t-22.5 -9.5t-9.5 -22.5v-51 +q0 -13 9.5 -22.5t22.5 -9.5z" /> + <glyph glyph-name="ie" unicode="&#xe69b;" +d="M878 548q24 66 22 118q-3 57 -37 91q-33 33 -111.5 27.5t-173.5 -47.5q-13 1 -27 1q-65 0 -126 -21q-58 -21 -107 -60q-101 -80 -132 -203l-7 -28l17 22q69 89 150 136q-22 -21 -25 -25q-73 -73 -126 -159q-49 -80 -75 -160q-25 -75 -24 -135t28 -88q37 -36 99 -36 +q69 0 160 44q78 -39 168 -39q121 0 219 70t137 184l3 8h-213l-1 -3q-21 -38 -58 -60t-80.5 -22t-80.5 22t-57 60q-18 32 -19 69h319h204l1 5q2 20 2 43q0 100 -49 186zM201 222q45 -111 146 -177q-54 -23 -95 -26q-45 -3 -67 20q-23 23 -19 71t35 112zM859 578 +q-30 42 -70 75q-39 32 -85 53q108 42 149 1q37 -38 6 -129zM402 423q5 57 48 96t101 39t100.5 -39t48.5 -96h-298z" /> + <glyph glyph-name="delete" unicode="&#xe69f;" +d="M178 -50q-1 0 -3 1l1 -0.5t2 -0.5zM170 -46q-3 2 -5 3q2 -1 5 -3zM950.5 692.5q-10.5 10.5 -26.5 10.5h-184v58q0 29 -21 49.5t-50 20.5h-314q-30 0 -50.5 -20.5t-20.5 -49.5v-58h-185q-15 0 -25.5 -10.5t-10.5 -25t10.5 -25t25.5 -10.5h31v-623q0 -29 21 -49.5t50 -20.5 +h632q29 0 50 20.5t21 49.5v623h20q15 0 26 10.5t11 25t-10.5 25zM354 760h315v-57h-315v57zM833 9h-632v623h91h541v-623v0zM511.5 512q-14.5 0 -25 -10.5t-10.5 -25.5v-334q0 -15 10.5 -25.5t25 -10.5t25 10.5t10.5 25.5v334q0 15 -10.5 25.5t-25 10.5zM317 512 +q-15 0 -25.5 -10.5t-10.5 -25.5v-334q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v334q0 15 -10.5 25.5t-25.5 10.5zM704 512q-15 0 -25.5 -10.5t-10.5 -25.5v-334q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v334q0 15 -10.5 25.5t-25.5 10.5z" /> + <glyph glyph-name="enter" unicode="&#xe6a0;" +d="M900 510v192q0 17 -11.5 28.5t-28 11.5t-28.5 -11.5t-12 -28.5v-192q0 -92 -65 -157t-157 -65h-340l113 112q11 12 11 28.5t-11.5 28t-28 11.5t-28.5 -12l-178 -178q-12 -12 -12 -28.5t12 -28.5l183 -183q12 -12 28.5 -12t28.5 11.5t12 28t-12 28.5l-114 114h336 +q125 0 213.5 88.5t88.5 213.5z" /> + <glyph glyph-name="pushpino" unicode="&#xe6a1;" +d="M303 728q2 -10 1 -20l-1 -36l29 -23l214 -170l30 -24l37 12q44 15 90 15q49 0 95 -16q26 -10 51 -24l-169 -170l-43 -43l-13 -13v0l-169 -170q-27 45 -36 96q-13 72 10 141l12 37l-24 30l-170 214l-23 29l-36 -1h-1.5h-2.5q-8 0 -16 1zM318 831q-14 0 -24 -10l-219 -219 +q-11 -11 -9.5 -27t14.5 -24q48 -31 104 -31h6l170 -215q-28 -84 -11.5 -175.5t74.5 -163.5q11 -13 27 -13q14 0 24 10l206 207l223 -223q10 -10 23.5 -10t23 9.5t9.5 23t-10 23.5l-223 223l206 207q11 11 10 26t-13 25q-98 80 -226 80q-57 0 -112 -18l-215 170q2 60 -30 110 +q-10 15 -28 15v0z" /> + <glyph glyph-name="pushpin" unicode="&#xe6a2;" +d="M949 -7l-223 223l206 207q11 11 10 26t-13 25q-72 58 -163 74t-175 -12l-215 170q2 60 -30 110q-9 13 -25 14.5t-27 -9.5l-219 -219q-11 -11 -9.5 -27t14.5 -24q50 -33 110 -31l170 -215q-28 -84 -11.5 -175.5t74.5 -163.5q10 -12 25 -13t26 10l206 207l223 -223 +q10 -10 23.5 -10t23 9.5t9.5 23t-10 23.5z" /> + <glyph glyph-name="heart" unicode="&#xe6a3;" horiz-adv-x="1025" +d="M1000 648q-23 56 -66 99q-84 85 -201 85q-64 0 -121.5 -28t-99.5 -79q-42 51 -99.5 79t-121.5 28q-117 0 -201 -86q-43 -43 -66 -99q-25 -59 -24 -122q1 -69 29 -130.5t79 -104.5q5 -4 9 -8q14 -12 113 -102q208 -191 257 -235q11 -9 25 -9t25 9q33 30 181 165 +q158 144 196 179q52 43 81 105t29 132q0 64 -24 122z" /> + <glyph glyph-name="hearto" unicode="&#xe6a4;" horiz-adv-x="1025" +d="M1000 648q-23 56 -66 99q-84 85 -201 85q-64 0 -121.5 -28t-99.5 -79q-42 51 -99.5 79t-121.5 28q-117 0 -201 -86q-43 -43 -66 -99q-25 -59 -24 -122q1 -69 29 -130.5t79 -104.5q5 -4 9 -8q14 -12 113 -102q208 -191 257 -235q11 -9 25 -9t25 9q33 30 181 165 +q158 144 196 179q52 43 81 105t29 132q0 64 -24 122zM568 672q30 40 73.5 61.5t91.5 21.5q85 0 147 -62q32 -32 49 -74q18 -44 18 -93q0 -53 -22 -101q-22 -46 -60 -77l-2 -2q-62 -55 -197 -180q-108 -98 -154 -140q-58 53 -202 184l-48 44q-76 69 -94 85q-1 2 -2 3 +q-6 4 -8 7q-39 32 -60 78.5t-21 97.5q-1 49 18 93q17 42 49 74q62 63 147 63q48 0 91.5 -22t73.5 -61q21 -28 56 -28t56 28z" /> + <glyph glyph-name="smile-circle" unicode="&#xe6a7;" +d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM254 454q-25 0 -42.5 17.5t-17.5 42t17.5 42.5t42.5 18t42.5 -18t17.5 -42.5t-17.5 -42t-42.5 -17.5zM512 130 +q-68 0 -116 48.5t-48 116.5q0 15 10.5 25.5t25.5 10.5t25.5 -10.5t10.5 -25.5q0 -38 27 -65.5t65 -27.5t65 27.5t27 65.5q0 15 10.5 25.5t25.5 10.5t25.5 -10.5t10.5 -25.5q0 -68 -48 -116.5t-116 -48.5zM769.5 454q-24.5 0 -42 17.5t-17.5 42t17.5 42.5t42 18t42.5 -18 +t18 -42.5t-18 -42t-42.5 -17.5z" /> + <glyph glyph-name="smileo" unicode="&#xe6a8;" +d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171 +q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM640 331q-15 0 -25.5 -10.5t-10.5 -25.5q0 -38 -27 -65.5t-65 -27.5t-65 27.5t-27 65.5q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5 +q0 -68 48 -116.5t116 -48.5t116 48.5t48 116.5q0 15 -10.5 25.5t-25.5 10.5zM254 514zM194 513.5q0 24.5 17.5 42.5t42.5 18t42.5 -18t17.5 -42.5t-17.5 -42t-42.5 -17.5t-42.5 17.5t-17.5 42zM770 514zM710 513.5q0 24.5 17.5 42.5t42 18t42.5 -18t18 -42.5t-18 -42 +t-42.5 -17.5t-42 17.5t-17.5 42z" /> + <glyph glyph-name="frowno" unicode="&#xe6a9;" +d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171 +q34 79 95 140t140 94q81 35 171 35t171 -34q79 -34 140 -95t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140zM640 130q-15 0 -25.5 11t-10.5 25q0 39 -27 66t-65 27t-65 -27t-27 -66q0 -14 -10.5 -25t-25.5 -11t-25.5 11t-10.5 25q0 68 48 116.5t116 48.5t116 -48.5 +t48 -116.5q0 -14 -10.5 -25t-25.5 -11zM254 514zM194 513.5q0 24.5 17.5 42.5t42.5 18t42.5 -18t17.5 -42.5t-17.5 -42t-42.5 -17.5t-42.5 17.5t-17.5 42zM770 514zM710 513.5q0 24.5 17.5 42.5t42 18t42.5 -18t18 -42.5t-18 -42t-42.5 -17.5t-42 17.5t-17.5 42z" /> + <glyph glyph-name="calculator" unicode="&#xe6aa;" +d="M857 832h-689q-16 0 -27.5 -11.5t-11.5 -27.5v-818q0 -16 11.5 -27.5t27.5 -11.5h689q16 0 27 11.5t11 27.5v818q0 16 -11 27.5t-27 11.5zM818 14h-612v740h612v-740v0zM324 410h377q16 0 27.5 11.5t11.5 27.5v185q0 16 -11.5 27.5t-27.5 11.5h-377q-16 0 -27.5 -11.5 +t-11.5 -27.5v-185q0 -16 11.5 -27.5t27.5 -11.5zM362 595h300v-108h-300v108zM293 189h23v-23q0 -16 11.5 -27.5t27.5 -11.5t27.5 11.5t11.5 27.5v23h23q16 0 27.5 11.5t11.5 27.5t-11.5 27t-27.5 11h-23v24q0 16 -11.5 27t-27.5 11t-27.5 -11t-11.5 -27v-24h-23 +q-16 0 -27.5 -11t-11.5 -27t11.5 -27.5t27.5 -11.5zM607 328q-16 0 -27.5 -11t-11.5 -27t11.5 -27.5t27.5 -11.5h124q16 0 27.5 11.5t11.5 27.5t-11.5 27t-27.5 11h-124zM731 162h-124q-16 0 -27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5h124q16 0 27.5 11.5t11.5 27.5 +t-11.5 27.5t-27.5 11.5z" /> + <glyph glyph-name="chrome" unicode="&#xe6ac;" horiz-adv-x="1025" +d="M258 449l-146 254q71 90 176 141.5t224 51.5q138 0 255.5 -68t185.5 -183h-418q-11 1 -23 1q-90 0 -161 -55.5t-93 -141.5v0zM695 571h294q35 -90 35 -187q0 -103 -40 -197.5t-107.5 -163t-161.5 -109.5t-197 -42l209 363q47 67 47 149q0 110 -79 187v0v0zM326 384 +q0 77 54.5 131.5t131.5 54.5t131.5 -54.5t54.5 -131.5t-54.5 -131.5t-131.5 -54.5t-131.5 54.5t-54.5 131.5zM582 131l-146 -253q-122 18 -222 89t-157 181t-57 236q0 135 66 251l209 -362q32 -68 96 -109.5t141 -41.5q36 0 70 9z" /> + <glyph glyph-name="github" unicode="&#xe6ad;" horiz-adv-x="1025" +d="M0 371q0 -166 95.5 -298.5t247.5 -185.5q6 -1 10 -1t6.5 1.5t4 3t2 5t0.5 5v6v6.5v88q-37 -4 -66 0.5t-45.5 14t-29 23.5t-17 25.5t-9 24t-5.5 14.5q-9 15 -27 27.5t-27 20t-2 14.5q50 26 113 -66q34 -51 119 -30q10 41 40 70q-116 21 -172 86t-56 158q0 87 55 151 +q-22 65 6 137q29 2 65 -11.5t50.5 -23t25.5 -17.5q57 16 128.5 16t129.5 -16q13 9 29 19t49 21.5t61 9.5q27 -71 7 -135q56 -64 56 -151q0 -93 -57 -158.5t-172 -85.5q43 -43 43 -104v-129q0 -1 1 -3q0 -6 0.5 -9t4.5 -6t12 -3q153 52 250.5 185.5t97.5 300.5 +q0 104 -40.5 199t-109 163.5t-163.5 109t-199 40.5t-199 -40.5t-163.5 -109t-109 -163.5t-40.5 -199v0z" /> + <glyph glyph-name="iconfontdesktop" unicode="&#xe6b4;" +d="M902 766h-779q-23 0 -40 -17t-17 -40v-480q0 -24 17 -40.5t40 -16.5h357v-108h-147q-13 0 -22.5 -9.5t-9.5 -22.5t9.5 -22t22.5 -9h358q13 0 22.5 9t9.5 22t-9.5 22.5t-22.5 9.5h-148v108h359q24 0 40.5 16.5t16.5 40.5v480q0 23 -16.5 40t-40.5 17zM896 703v-468h-767 +v468h767z" /> + <glyph glyph-name="caretcircleoup" unicode="&#xe6b5;" +d="M512 895q-104 0 -199 -40.5t-163.5 -109t-109 -163.5t-40.5 -199t40.5 -198.5t109 -163t163.5 -109t199 -40.5t198.5 40.5t163 109t109 163t40.5 198.5t-40.5 199t-109 163.5t-163 109t-198.5 40.5zM828 67q-62 -62 -142 -96q-83 -35 -174 -35t-174 35q-81 34 -143 96 +t-96 142q-35 83 -35 174t35 175q34 80 96 142t142 96q83 35 174.5 35t174.5 -35q80 -34 142 -96t96 -142q35 -83 35 -174.5t-35 -174.5q-34 -80 -96 -142zM528 559q-7 7 -16 7h-1q-10 0 -16 -7l-229 -244q-10 -11 -4.5 -25t21.5 -14h457q16 0 22 14t-5 25z" /> + <glyph glyph-name="upload" unicode="&#xe6b6;" +d="M488 822q10 10 24 10t24 -10l156 -156q10 -10 10 -24.5t-10 -24.5t-24 -10t-25 10l-96 97v-578q0 -14 -10.5 -24t-24.5 -10t-24.5 10t-10.5 24v578l-97 -97q-10 -10 -24 -10t-24 10t-10 24.5t10 24.5zM924.5 256q-14.5 0 -24.5 -10.5t-10 -24.5v-195q0 -9 -6 -15t-15 -6 +h-716q-9 0 -15 6t-6 15v195q0 14 -10 24.5t-24.5 10.5t-24.5 -10.5t-10 -24.5v-223q0 -26 18 -44t44 -18h772q26 0 44 18.5t18 43.5v223q0 14 -10 24.5t-24.5 10.5z" /> + <glyph glyph-name="download" unicode="&#xe6b7;" +d="M488 112q10 -10 24 -10t24 10l156 156q11 10 11 24t-10.5 24.5t-24.5 10.5t-24 -11l-97 -96v577q0 15 -10.5 25t-24.5 10t-24 -10t-10 -25v-577l-97 97q-11 10 -25 10t-24 -10.5t-10 -24.5t10 -24zM924.5 256q-14.5 0 -24.5 -10.5t-10 -24.5v-195q0 -9 -6 -15t-15 -6 +h-716q-9 0 -15 6t-6 15v195q0 14 -10 24.5t-24.5 10.5t-24.5 -10.5t-10 -24.5v-223q0 -26 18 -44t44 -18h772q26 0 44 18.5t18 43.5v223q0 14 -10 24.5t-24.5 10.5z" /> + <glyph glyph-name="piechart" unicode="&#xe6b8;" +d="M467 -128q95 0 180 36t150 101l-330 328v465q-95 0 -181.5 -36.5t-149 -99t-99.5 -148.5t-37 -180.5t37 -181t99.5 -148.5t149 -99t181.5 -37v0v0zM531 404h493q0 100 -39 191t-105 157t-157.5 105t-191.5 39v-492v0zM557 339l332 -327q64 64 99.5 148.5t35.5 178.5h-467 +v0z" /> + <glyph glyph-name="lock1" unicode="&#xe6b9;" +d="M824 614q-26 64 -73 113q-46 50 -107 77q-63 28 -132 28t-132 -28q-61 -27 -108 -76.5t-72 -113.5q-27 -66 -27 -139v-470q0 -29 19.5 -49t46.5 -20h545q28 0 47.5 20t18.5 49v415l1 19v36q0 72 -27 139zM407 741v0l1 1q49 22 104 22q54 0 104 -22q48 -22 86 -62 +q38 -39 59 -92t21 -113v-29h-541v0v29q0 59 22 113q21 53 59 92.5t85 60.5zM783 378v-373q0 -1 -1 -1h-540q-1 0 -1 1v373h542zM480 224v-90q0 -13 9.5 -22t22.5 -9t22.5 9t9.5 22v90q27 17 27 49q0 25 -17.5 42t-41.5 17t-41.5 -17t-17.5 -42q0 -32 27 -49z" /> + <glyph glyph-name="unlock" unicode="&#xe6ba;" +d="M241 446v30q0 58 22 113q21 52 59 91q38 40 85 61v0l1 1q49 22 104 22q54 0 104 -22q48 -22 86 -61q21 -23 53 -83q10 -20 31 -20h14q14 0 21.5 11.5t2.5 24.5v0q-26 64 -73 113q-46 50 -107 77q-63 28 -132 28t-132 -28q-61 -27 -108 -76.5t-72 -113.5q-27 -66 -27 -139 +v-470q0 -29 19.5 -49t46.5 -20h545q28 0 47 20t19 49l1 377q0 26 -19 45t-45 19h-546v0zM783 5q0 -1 -1 -1h-540q-1 0 -1 1v373h542v-373zM480 224v-90q0 -13 9.5 -22t22.5 -9t22.5 9t9.5 22v90q27 17 27 49q0 25 -17.5 42t-41.5 17t-41.5 -17t-17.5 -42q0 -32 27 -49z" /> + <glyph glyph-name="windowso" unicode="&#xe6bc;" +d="M527 27l434 -71v401h-434v-330zM599 285h290v-244l-290 47v197zM527 758v-329h434v401zM889 501h-290v196l290 48v-244zM68 429h367v317l-367 -61v-256zM140 624l223 37v-160h-223v123zM68 99l367 -60v318h-367v-258zM140 285h223v-161l-223 36v125z" /> + <glyph glyph-name="dotchart" unicode="&#xe6bd;" +d="M923 8h-788v789q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-825q0 -15 10.5 -25.5t25.5 -10.5h824q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM319 259zM253 259.5q0 27.5 19 46.5t46.5 19t47 -19t19.5 -46.5t-19.5 -47t-47 -19.5t-46.5 19.5t-19 47z +M598 299zM512 299q0 35 25 60t60.5 25t60.5 -25t25 -60t-25 -60t-60.5 -25t-60.5 25t-25 60zM623 514zM563 514q0 25 17.5 42.5t42.5 17.5t42.5 -17.5t17.5 -42.5t-17.5 -42.5t-42.5 -17.5t-42.5 17.5t-17.5 42.5zM850 657zM805 657.5q0 18.5 13 32t32 13.5t32.5 -13.5 +t13.5 -32t-13.5 -32t-32.5 -13.5t-32 13.5t-13 32zM863 466zM830 466q0 14 9.5 23.5t23.5 9.5t23.5 -9.5t9.5 -23.5t-9.5 -23.5t-23.5 -9.5t-23.5 9.5t-9.5 23.5z" /> + <glyph glyph-name="barchart" unicode="&#xe6be;" +d="M923 -64h-824q-15 0 -25.5 10.5t-10.5 25.5v824q0 15 10.5 25.5t25.5 10.5t25.5 -10.5t10.5 -25.5v-788h788q15 0 25.5 -10.5t10.5 -25.5t-10.5 -25.5t-25.5 -10.5zM264 523q-29 -1 -50 -22t-22 -50q0 -23 11.5 -41t30.5 -28v-285q0 -13 9.5 -22.5t22.5 -9.5v0 +q13 0 22.5 9.5t9.5 22.5v285q19 9 30.5 27t11.5 40q0 31 -22.5 53t-53.5 21zM542 641q-30 -1 -51 -22t-21 -50q-1 -23 10.5 -41t31.5 -28v-403q0 -13 9 -22.5t23 -9.5v0q13 0 22.5 9.5t9.5 22.5v403q18 9 30 27t12 40q0 31 -22.5 53t-53.5 21zM895 438q0 31 -22.5 53 +t-53.5 21q-29 -1 -50 -22t-22 -50q0 -23 11.5 -41t30.5 -28v-274q0 -13 9.5 -22.5t22.5 -9.5v0q13 0 22.5 9.5t9.5 22.5v274q19 9 30.5 27t11.5 40z" /> + <glyph glyph-name="codesquare" unicode="&#xe6bf;" +d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM229 347q-15 0 -25.5 10.5t-10.5 25.5t10 26l115 115l-115 117q-10 11 -10 25.5t10.5 25t25.5 10.5t25 -10l141 -142q10 -11 10 -26 +t-11 -25l-140 -141q-10 -11 -25 -11zM618 347v0l-199 1q-15 0 -25.5 10.5t-10.5 25.5t10.5 25.5t25.5 10.5v0l199 -1q15 0 25.5 -10.5t10.5 -25.5t-11 -25.5t-25 -10.5z" /> + <glyph glyph-name="plussquare" unicode="&#xe6c0;" +d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM732 348h-184v-183q0 -15 -10.5 -25.5t-25 -10.5t-25.5 10.5t-11 25.5v183h-184q-15 0 -25.5 10.5t-10.5 25t10.5 25.5t25.5 11h184v183 +q0 15 11 25.5t25.5 10.5t25 -10.5t10.5 -25.5v-183h184q15 0 25.5 -11t10.5 -25.5t-10.5 -25t-25.5 -10.5z" /> + <glyph glyph-name="minussquare" unicode="&#xe6c1;" +d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM768 383q0 -15 -11 -25.5t-25 -10.5h-442q-14 0 -25 10.5t-11 25.5v0q0 15 11 25.5t25 10.5h442q14 0 25 -10.5t11 -25.5v0z" /> + <glyph glyph-name="closesquare" unicode="&#xe6c2;" +d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM717.5 178.5q-10.5 -10.5 -25.5 -10.5t-26 10l-154 155l-154 -155q-11 -10 -26 -10t-25.5 10.5t-10.5 25.5t11 25l154 155l-154 155 +q-11 10 -11 25t10.5 25.5t25.5 10.5t26 -10l154 -155l154 155q11 10 26 10t25.5 -10.5t10.5 -25.5t-11 -25l-154 -155l154 -155q11 -11 11 -25.5t-10.5 -25z" /> + <glyph glyph-name="closesquareo" unicode="&#xe6c3;" +d="M717.5 589.5q-10.5 10.5 -25.5 10.5t-26 -10l-154 -155l-154 155q-11 10 -26 10t-25.5 -10.5t-10.5 -25.5t11 -25l154 -155l-154 -155q-11 -10 -11 -25t10.5 -25.5t25.5 -10.5t26 10l154 155l154 -155q11 -10 26 -10t25.5 10.5t10.5 25t-11 25.5l-154 155l154 155 +q11 10 11 25t-10.5 25.5zM888 760v0v0v-753v0h-752v0v753v0h752zM888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21v0z" /> + <glyph glyph-name="checksquare" unicode="&#xe6c4;" +d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM772 539l-359 -360l-1 -1q-3 -3 -8 -6q-8 -5 -18 -5q-21 0 -31 18l-109 191q-8 13 -4 27t17 21.5t27.5 3.5t21.5 -17l86 -149l327 328 +q11 11 26 11t25.5 -10.5t10.5 -25.5t-11 -26z" /> + <glyph glyph-name="checksquareo" unicode="&#xe6c5;" +d="M721 590l-327 -328l-86 149q-7 13 -21.5 17t-27.5 -3.5t-17 -21.5t4 -27l109 -191q10 -18 31 -18q10 0 18 5q5 3 8 6l1 1l359 360q11 11 11 26t-10.5 25.5t-25.5 10.5t-26 -11zM888 760v0v0v-753v0h-752v0v753v0h752zM888 832h-752q-30 0 -51 -21t-21 -51v-753 +q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21v0z" /> + <glyph glyph-name="fastbackward" unicode="&#xe6c6;" +d="M525 414l436 376q18 17 40.5 6.5t22.5 -36.5v-752q0 -26 -22.5 -36.5t-40.5 6.5l-436 377q-13 12 -13 30t13 29zM36 800v0q15 0 25.5 -10.5t10.5 -25.5v-298l377 324q18 17 40.5 6.5t22.5 -36.5v-375v-377q0 -26 -22.5 -36.5t-40.5 6.5l-377 326v-300q0 -15 -10.5 -25.5 +t-25.5 -10.5v0q-15 0 -25.5 10.5t-10.5 25.5v760q0 15 10.5 25.5t25.5 10.5z" /> + <glyph glyph-name="fastforward" unicode="&#xe6c7;" +d="M499 414l-436 376q-18 17 -40.5 6.5t-22.5 -36.5v-752q0 -26 22.5 -36.5t40.5 6.5l436 378q13 11 13 29t-13 29zM988 800v0q-15 0 -25.5 -10.5t-10.5 -25.5v-298l-377 324q-18 17 -40.5 6.5t-22.5 -36.5v-375v-377q0 -26 22.5 -36.5t40.5 6.5l377 326v-300 +q0 -15 10.5 -25.5t25.5 -10.5v0q15 0 25.5 10.5t10.5 25.5v760q0 15 -10.5 25.5t-25.5 10.5z" /> + <glyph glyph-name="upsquare" unicode="&#xe6c8;" +d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM757.5 277q-10.5 -10 -25.5 -9.5t-25 10.5l-195 208l-195 -208q-10 -10 -25 -10.5t-26 9.5t-11.5 25t10.5 26l221 236q10 11 26 11t26 -11 +l221 -236q10 -11 9.5 -26t-11 -25z" /> + <glyph glyph-name="downsquare" unicode="&#xe6c9;" +d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM759 451l-221 -236q-10 -11 -26 -11t-26 11l-221 236q-11 11 -10.5 26t11.5 25t26 9.5t25 -11.5l195 -207l195 207q10 11 25 11.5 +t25.5 -9.5t11 -25t-9.5 -26z" /> + <glyph glyph-name="leftsquare" unicode="&#xe6ca;" +d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM616 189q11 -10 11.5 -25t-9.5 -25.5t-25 -11t-26 9.5l-236 221q-11 10 -11 26t11 26l236 221q11 11 26 10.5t25 -11.5t9.5 -26t-10.5 -25 +l-208 -195z" /> + <glyph glyph-name="rightsquare" unicode="&#xe6cb;" +d="M888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21zM694 358l-236 -221q-11 -10 -26 -9.5t-25 11t-9.5 25.5t10.5 25l208 195l-208 195q-10 10 -10.5 25t9.5 26t25 11.5t26 -10.5l236 -221 +q11 -10 11 -26t-11 -26z" /> + <glyph glyph-name="rightsquareo" unicode="&#xe6cc;" +d="M888 760v0v0v-753v0h-752v0v753v0h752zM888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21v0zM705 384q0 16 -11 26l-236 221q-11 11 -26 10.5t-25 -11.5t-9.5 -26t10.5 -25l208 -195 +l-208 -195q-10 -10 -10.5 -25t9.5 -26t25 -11.5t26 10.5l236 221q11 10 11 26z" /> + <glyph glyph-name="leftsquareo" unicode="&#xe6cd;" +d="M888 760v0v0v-753v0h-752v0v753v0h752zM888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21v0zM331 358l236 -221q11 -10 26 -9.5t25 11t9.5 25.5t-11.5 25l-207 195l207 195q11 10 11.5 25 +t-9.5 26t-25 11.5t-26 -10.5l-236 -221q-11 -10 -11 -26t11 -26z" /> + <glyph glyph-name="down-square-o" unicode="&#xe6ce;" +d="M888 760v0v0v-753h-752v753h752zM888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21v0zM538 215l221 236q10 11 9.5 26t-11 25t-25.5 9.5t-25 -11.5l-195 -207l-195 207q-10 11 -25 11.5 +t-26 -9.5t-11.5 -25t10.5 -26l221 -236q10 -11 26 -11t26 11z" /> + <glyph glyph-name="up-square-o" unicode="&#xe6cf;" +d="M888 760v0v0v-753v0h-752v0v753v0h752zM888 832h-752q-30 0 -51 -21t-21 -51v-753q0 -29 21 -50.5t51 -21.5h753q29 0 50.5 21.5t21.5 50.5v753q0 30 -21.5 51t-51.5 21v0zM512 575q-16 0 -26 -11l-221 -236q-11 -11 -10.5 -26t11.5 -25t26 -9.5t25 10.5l195 208 +l195 -208q10 -10 25 -10.5t25.5 9.5t11 25t-9.5 26l-221 236q-10 11 -26 11z" /> + <glyph glyph-name="play" unicode="&#xe6d0;" +d="M512 894q-139 0 -256.5 -68.5t-186 -186t-68.5 -256.5t68.5 -256.5t186 -186t256.5 -68.5t256.5 68.5t186 186t68.5 256.5t-68.5 256.5t-186 186t-256.5 68.5zM712 369l-291 -247q-6 -6 -15 -6q-8 0 -14.5 5.5t-6.5 14.5v495q0 8 6.5 13.5t15 5.5t14.5 -6l291 -247 +q6 -6 6 -14t-6 -14z" /> + <glyph glyph-name="playcircleo" unicode="&#xe6d1;" +d="M512 894q-139 0 -256.5 -68.5t-186 -186t-68.5 -256.5t68.5 -256.5t186 -186t256.5 -68.5t256.5 68.5t186 186t68.5 256.5t-68.5 256.5t-186 186t-256.5 68.5zM822 73q-60 -61 -139 -95q-82 -34 -171 -34t-171 34q-78 34 -139 95q-61 60 -95 139q-34 82 -34 171t35 171 +q33 78 94 140q60 60 139 94q82 34 171 34t171 -34q78 -34 139 -95q61 -60 95 -139q34 -82 34 -171t-35 -171q-33 -79 -94 -139zM712 397l-291 247q-6 6 -15 6q-8 0 -14.5 -5.5t-6.5 -13.5v-495q0 -9 6.5 -14t15 -5t14.5 5l291 247q6 6 6 14t-6 14z" /> + <glyph glyph-name="tag" unicode="&#xe6d2;" +d="M963 291v3q-1 9 -4 18q-4 10 -10 19q-4 5 -7 8l-479 483q-4 5 -9 8q-12 7 -25 7h-291q-31 0 -53 -22t-22 -52v-298q0 -5 1 -10l0.5 -1l0.5 -1q1 -4 2 -7q1 -1 1 -2q4 -7 10 -13l477 -472q9 -8 18 -13q17 -9 35 -9q15 0 28 6q14 5 25 16l280 277q3 2 5 5q3 3 5 7q2 3 3 5 +q2 3 3 5q0 2 1 3q5 14 5 30zM264.5 560q-29.5 0 -50.5 21t-21 50.5t21 50.5t50.5 21t50.5 -21t21 -50.5t-21 -50.5t-50.5 -21z" /> + <glyph glyph-name="tago" unicode="&#xe6d3;" +d="M963 291v3q-1 9 -4 18q-4 10 -10 19q-4 5 -7 8l-479 483q-4 5 -9 8q-12 7 -25 7h-291q-31 0 -52.5 -22t-21.5 -52v-298v-10l0.5 -1l0.5 -1q1 -4 2 -7q1 -1 1 -2q4 -7 10 -13l238 -236l239 -236q9 -8 19 -13q16 -9 34 -9q15 0 28 6q14 5 25 16l280 277q3 2 5 5q3 3 5 7 +q2 3 3 5q2 3 3 5q0 2 1 3q5 14 5 30zM891 287v0v0v0v0v0h-1v0l-280 -277v0q-1 -1 -2 -1t-1 1h-0.5h-0.5l-239 236l-231 229v288q0 2 2 2h281l471 -476h1v-1v0v0v-1zM264 632zM193 631.5q0 29.5 21 50.5t50.5 21t50.5 -21t21 -50.5t-21 -50.5t-50.5 -21t-50.5 21t-21 50.5z +" /> + <glyph glyph-name="addfile" unicode="&#xe910;" +d="M860 128h-156v156q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-156h-148q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h148v-148q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v148h156q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM875 594 +l-278 281q-6 6 -15 11q-2 2 -4 2q-1 1 -3 2q-14 6 -29 6h-346q-30 0 -51 -21t-21 -51v-880q0 -30 21 -51t51 -21h212q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-212v880h312v-240q0 -30 21 -51t51 -21h240v-156q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5 +v188q0 29 -21 50zM584 584v202l200 -202h-200z" /> + <glyph glyph-name="folder1" unicode="&#xe662;" +d="M952 704h-463l-25 78q-7 22 -26 36t-43 14h-323q-30 0 -51 -21t-21 -51v-688q0 -30 21 -51t51 -21h880q30 0 51 21t21 51v560q0 30 -21 51t-51 21zM72 760h323l18 -56h-341v56zM952 72h-880v560h880v-560z" /> + <glyph glyph-name="file1" unicode="&#xe664;" +d="M875 594l-278 281q-6 6 -15 11q-2 2 -4 2q-1 1 -3 2q-14 6 -29 6h-346q-30 0 -51 -21t-21 -51v-880q0 -30 21 -51t51 -21h624q30 0 51 21t21 51v600q0 29 -21 50zM784 584h-200v202zM824 -56h-624v880h312v-240q0 -30 21 -51t51 -21h240v-568z" /> + <glyph glyph-name="switcher" unicode="&#xe913;" +d="M572 292h-376q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h376q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM696 568v-624h-624v624h624zM696 640h-624q-30 0 -51 -21t-21 -51v-624q0 -30 21 -51t51 -21h624q30 0 51 21t21 51v624q0 30 -21 51t-51 21z +M952 896h-592q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h592v-596q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v596q0 30 -21 51t-51 21zM824 768h-660q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h660v-660q0 -15 10.5 -25.5t25.5 -10.5 +t25.5 10.5t10.5 25.5v660q0 30 -21 51t-51 21z" /> + <glyph glyph-name="addfolder" unicode="&#xe914;" +d="M988 256h-156v156q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-156h-148q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h148v-148q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v148h156q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM952 704 +h-463l-25 78q-7 22 -26 36t-43 14h-323q-30 0 -51 -21t-21 -51v-688q0 -30 21 -51t51 -21h468q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-468v560h880v-148q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v148q0 30 -21 51t-51 21zM72 704v56h323l18 -56h-341z +" /> + <glyph glyph-name="folderopen" unicode="&#xe699;" +d="M960 512v120q0 30 -21 51t-51 21h-399l-25 78q-7 22 -26 36t-43 14h-323q-30 0 -51 -21t-21 -51v-688q0 -5 1 -11v0v-2v-1l0.5 -0.5l0.5 -0.5v-1v-1.5t0.5 -1l0.5 -0.5v-1q0 -2 1 -3v0q5 -17 18 -29v0q1 0 1.5 -0.5l1 -1t0.5 -1.5q1 0 1 -0.5t0.5 -0.5t1 -0.5t1.5 -0.5 +v-0.5v-0.5q1 0 1.5 -0.5l1.5 -1.5v0q15 -10 32 -11l1 -1h3h1h1h2h788q25 0 44.5 15.5t25.5 39.5l92 368q8 31 -11 58t-51 31zM72 760h323l41 -128h452v-120h-724q-25 0 -44.5 -15t-25.5 -39l-22 -89v391zM860 72h-788l92 368h788z" /> + <glyph glyph-name="search1" unicode="&#xe670;" +d="M950 -2l-206 205q88 107 88 245q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5q138 0 245 88l206 -206q10 -10 25 -10t26 10q10 11 10 26t-10 26zM569 160q-57 -24 -121 -24t-121 24q-56 24 -99.5 67.5t-66.5 99.5 +q-25 57 -25 121t25 121q23 56 66.5 99.5t99.5 67.5q57 24 121 24t121 -24q56 -24 99.5 -67.5t67.5 -99.5q24 -57 24 -121t-24 -121q-24 -56 -67.5 -99.5t-99.5 -67.5z" /> + <glyph glyph-name="ellipsis1" unicode="&#xe647;" +d="M128 384q0 -27 18.5 -45.5t45.5 -18.5t45.5 18.5t18.5 45.5t-18.5 45.5t-45.5 18.5t-45.5 -18.5t-18.5 -45.5zM448 384q0 -27 18.5 -45.5t45.5 -18.5t45.5 18.5t18.5 45.5t-18.5 45.5t-45.5 18.5t-45.5 -18.5t-18.5 -45.5zM768 384q0 -27 18.5 -45.5t45.5 -18.5 +t45.5 18.5t18.5 45.5t-18.5 45.5t-45.5 18.5t-45.5 -18.5t-18.5 -45.5z" /> + <glyph glyph-name="calendar" unicode="&#xe6bb;" +d="M888 768h-120v28q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-28h-368v28q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-28h-120q-30 0 -51 -21t-21 -51v-688q0 -30 21 -51t51 -21h752q30 0 51 21t21 51v688q0 30 -21 51t-51 21zM136 696h120v-20 +q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v20h368v-20q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v20h120v-112h-752v112zM888 8h-752v504h752v-504zM288 384h64q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5 +t22.5 9.5zM480 384h64q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5zM672 384h64q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5zM288 190h64q13 0 22.5 -9.5 +t9.5 -22.5t-9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5zM480 190h64q13 0 22.5 -9.5t9.5 -22.5t-9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5z" /> + <glyph glyph-name="filetext1" unicode="&#xe698;" +d="M875 594l-278 281q-7 6 -15 11q-3 2 -4 2q-1 1 -3 2q-14 6 -29 6h-345q-30 0 -51.5 -21t-21.5 -51v-880q0 -30 21.5 -51t51.5 -21h623q30 0 50.5 21t20.5 51v600q0 30 -20 50zM583 786l201 -202h-201v202zM823 -56h-623v880h311v-240q0 -30 21.5 -51t51.5 -21h239v-568z +M584 412q0 15 -10.5 25.5t-25.5 10.5h-256q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h256q15 0 25.5 10.5t10.5 25.5zM776 252q0 15 -10.5 25.5t-25.5 10.5h-448q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h448q15 0 25.5 10.5t10.5 25.5zM648 92 +q0 15 -10.5 25.5t-25.5 10.5h-320q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h320q15 0 25.5 10.5t10.5 25.5z" /> + <glyph glyph-name="copy1" unicode="&#xe648;" +d="M875 658l-214 217q-7 6 -15 11q-3 2 -4 2q-1 1 -3 2q-14 6 -29 6h-281q-30 0 -51.5 -21t-21.5 -51v-56h-56q-29 0 -50.5 -21.5t-21.5 -50.5v-752q0 -30 21.5 -51t50.5 -21h496q29 0 50 21t21 51v56h57q30 0 50.5 21t20.5 51v536q0 30 -20 50zM647 786l137 -138h-137v138z +M695 -56h-495v752h56v-624q0 -30 21.5 -51t51.5 -21h366v-56zM823 72h-495v752h247v-176q0 -30 21.5 -51t51.5 -21h175v-504zM640 476q0 15 -10.5 25.5t-25.5 10.5h-184q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h184q15 0 25.5 10.5t10.5 25.5zM768 348 +q0 15 -10.5 25.5t-25.5 10.5h-312q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h312q15 0 25.5 10.5t10.5 25.5zM704 220q0 15 -10.5 25.5t-25.5 10.5h-248q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h248q15 0 25.5 10.5t10.5 25.5z" /> + <glyph glyph-name="jpgfile1" unicode="&#xe69c;" +d="M875 594l-278 281q-7 6 -15 11q-3 2 -4 2q-1 1 -3 2q-14 6 -29 6h-345q-30 0 -51.5 -21t-21.5 -51v-880q0 -30 21.5 -51t51.5 -21h623q30 0 50.5 21t20.5 51v600q0 30 -20 50zM583 786l201 -202h-201v202zM823 -56h-623v880h311v-240q0 -30 21.5 -51t51.5 -21h239v-568z +M350 200q0 -18 -5.5 -25t-16.5 -7q-15 0 -25 19l-30 -23q20 -34 61 -34q30 0 45.5 18.5t15.5 47.5v123h-45v-119zM501 319h-64v-186h44v62h22q31 0 52 16t21 48q0 60 -75 60zM500 230h-19v53h18q34 0 34 -25q0 -28 -33 -28zM683 239v-36h30v-30q-6 -5 -18 -5q-50 0 -50 58 +q0 27 13 42.5t34 15.5q18 0 34 -15l23 29q-24 24 -59 24q-39 0 -65 -26t-26 -71q0 -46 25.5 -70.5t66.5 -24.5q39 0 61 22v87h-69z" /> + <glyph glyph-name="pdffile1" unicode="&#xe6b3;" +d="M875 594l-278 281q-7 6 -15 11q-3 2 -4 2q-1 1 -3 2q-14 6 -29 6h-345q-30 0 -51.5 -21t-21.5 -51v-880q0 -30 21.5 -51t51.5 -21h623q30 0 50.5 21t20.5 51v600q0 30 -20 50zM583 786l201 -202h-201v202zM823 -56h-623v880h311v-240q0 -30 21.5 -51t51.5 -21h239v-568z +M333 320h-67v-192h46v64h22q33 0 54.5 16.5t21.5 49.5q0 62 -77 62zM332 228h-20v56h18q35 0 35 -26q0 -30 -33 -30zM498 320h-56v-192h58q44 0 69 24.5t25 72.5t-25.5 71.5t-70.5 23.5zM495 165h-6v118h6q25 0 38.5 -13t13.5 -45q0 -60 -52 -60zM752 282v38h-122v-192h46 +v73h65v38h-65v43h76z" /> + <glyph glyph-name="exclefile1" unicode="&#xe6b0;" +d="M875 594l-278 281q-7 6 -15 11q-3 2 -4 2q-1 1 -3 2q-14 6 -29 6h-345q-30 0 -51.5 -21t-21.5 -51v-880q0 -30 21.5 -51t51.5 -21h623q30 0 50.5 21t20.5 51v600q0 30 -20 50zM583 786l201 -202h-201v202zM823 -56h-623v880h311v-240q0 -30 21.5 -51t51.5 -21h239v-568z +M460 229l-56 155h86l16 -57q5 -18 14 -53h2q15 29 30 53l33 57h82l-111 -159l60 -162h-86l-19 63q-4 14 -14 54h-2q-14 -25 -31 -54l-39 -63h-82z" /> + <glyph glyph-name="pptfile1" unicode="&#xe6b1;" +d="M875 594l-278 281q-7 6 -15 11q-3 2 -4 2q-1 1 -3 2q-14 6 -29 6h-345q-30 0 -51.5 -21t-21.5 -51v-880q0 -30 21.5 -51t51.5 -21h623q30 0 50.5 21t20.5 51v600q0 30 -20 50zM583 786l201 -202h-201v202zM823 -56h-623v880h311v-240q0 -30 21.5 -51t51.5 -21h239v-568z +M538 390h-112l-57 -334h77l19 119h37q55 0 96 28t51 82q10 56 -21 80.5t-90 24.5zM574 285q-9 -49 -65 -49h-33l16 93h32q29 0 41.5 -10t8.5 -34z" /> + <glyph glyph-name="unknowfile1" unicode="&#xe6af;" +d="M875 594l-278 281q-7 6 -15 11q-3 2 -4 2q-1 1 -3 2q-14 6 -29 6h-345q-30 0 -51.5 -21t-21.5 -51v-880q0 -30 21.5 -51t51.5 -21h623q30 0 50.5 21t20.5 51v600q0 30 -20 50zM583 786l201 -202h-201v202zM823 -56h-623v880h311v-240q0 -30 21.5 -51t51.5 -21h239v-568z +M510 329q0 18 -11 28t-29 10q-28 0 -58 -29l-55 51q52 59 125 59q56 0 90.5 -28t34.5 -84q0 -21 -10 -40.5t-24 -34t-27.5 -29t-22 -33t-5.5 -39.5h-88q-5 30 6.5 57t28.5 43.5t31 35.5t14 33zM432 62q0 19 12 31t29.5 12t29.5 -12.5t12 -30.5t-12 -30.5t-29.5 -12.5 +t-29.5 12.5t-12 30.5z" /> + <glyph glyph-name="wordfile1" unicode="&#xe6b2;" +d="M875 594l-278 281q-7 6 -15 11q-3 2 -4 2q-1 1 -3 2q-14 6 -29 6h-345q-30 0 -51.5 -21t-21.5 -51v-880q0 -30 21.5 -51t51.5 -21h623q30 0 50.5 21t20.5 51v600q0 30 -20 50zM583 786l201 -202h-201v202zM823 -56h-623v880h311v-240q0 -30 21.5 -51t51.5 -21h239v-568z +M559 142q-1 14 -1 46v48l-7 136h-60l-55 -136q-21 -57 -34 -94h-2l5 94l5 136h-73l2 -298h88l49 130q3 8 24 70h2q-2 -35 -1 -70l4 -130h90l104 298h-68l-43 -136q-3 -11 -12.5 -43t-15.5 -51h-1z" /> + <glyph glyph-name="dingding" unicode="&#xe923;" +d="M913 513q-3 -11 -12 -31v0l-1 -2q-16 -34 -48.5 -90.5t-56.5 -96.5l-24 -40q0 1 -1 1l-27 -47h131l-251 -335l57 228h-103l36 150q-46 -11 -104 -30q-3 -1 -7 -2.5t-19 -2t-32 4t-44.5 20.5t-56.5 42l-5 5l-11.5 11.5t-13.5 17t-9.5 17.5t-2 16t12.5 11q14 5 136 22 +l114 14q-218 -3 -270 5q-38 6 -79 59.5t-52 110.5l-3 15q2 21 49 7q31 -8 118 -27.5t160 -34.5l72 -14q-5 1 -13 3.5t-33 10.5l-50 16t-58.5 19t-63 21t-60.5 21t-53.5 20t-39 16.5t-20.5 11.5q-21 24 -45 99t-20 126q0 2 1 5t6.5 7t14.5 2q271 -124 456 -192 +q30 -11 76 -26.5t73.5 -25t62 -23t53.5 -25t36.5 -25.5t22.5 -30t1 -35z" /> + <glyph glyph-name="dingding-o" unicode="&#xe925;" +d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM749 415q-1 -6 -7 -19v0v0q-6 -13 -16.5 -32t-20.5 -36.5t-19.5 -33t-15.5 -25.5l-6 -10v1l-17 -28h79 +l-151 -201l35 136h-62l21 90q-28 -6 -63 -17q-3 -3 -10.5 -4.5t-32 7.5t-52.5 34l-3 3l-7 7t-8 9.5t-5.5 10t-1 10t7.5 6.5q8 3 81 13l69 9q-131 -2 -162 3q-23 4 -47.5 36t-31.5 66l-2 10q3 11 30 3q18 -5 70.5 -16.5t96 -20.5l43.5 -9q-220 68 -235 84q-12 15 -26.5 59.5 +t-12.5 75.5q0 1 0.5 3t4 4.5t8.5 0.5q163 -74 274 -115q19 -7 46.5 -16t43.5 -15t37 -14t32.5 -15t21.5 -15.5t13.5 -18t0.5 -20.5z" /> + <glyph glyph-name="mobile1" unicode="&#xe678;" +d="M760 896h-496q-30 0 -51 -21t-21 -51v-880q0 -30 21 -51t51 -21h496q30 0 51 21t21 51v880q0 30 -21 51t-51 21zM542 -64h-60q-15 0 -24.5 9.5t-9.5 22.5t9.5 22.5t24.5 9.5h60q15 0 24.5 -9.5t9.5 -22.5t-9.5 -22.5t-24.5 -9.5zM760 65h-496v704h496v-704z" /> + <glyph glyph-name="tablet1" unicode="&#xe66e;" +d="M824 896h-624q-30 0 -51 -21t-21 -51v-880q0 -30 21 -51t51 -21h624q30 0 51 21t21 51v880q0 30 -21 51t-51 21zM542 -64h-60q-15 0 -24.5 9.5t-9.5 22.5t9.5 22.5t24.5 9.5h60q15 0 24.5 -9.5t9.5 -22.5t-9.5 -22.5t-24.5 -9.5zM824 65h-624v759h624v-759z" /> + <glyph glyph-name="bells" unicode="&#xe64e;" +d="M860 64h-28v448q0 123 -82 214t-202 104v30q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-30q-120 -13 -202 -104t-82 -214v-448h-28q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h276v-48q0 -30 21 -51t51 -21t51 21t21 51v48h276q15 0 25.5 10.5 +t10.5 25.5t-10.5 25.5t-25.5 10.5zM760 64h-496v448q0 103 72.5 175.5t175.5 72.5t175.5 -72.5t72.5 -175.5v-448z" /> + <glyph glyph-name="disconnect" unicode="&#xe64f;" +d="M900 772q-60 60 -144.5 60t-143.5 -60l-180 -180q-11 -10 -11 -25t11 -26t26 -11t25 11l180 180q38 38 92.5 38t93 -38.5t38.5 -93t-38 -92.5l-180 -180q-10 -11 -10 -25.5t10.5 -25t25.5 -10.5t25 10l180 180q60 59 60 143.5t-60 144.5zM377 615q15 0 25.5 10.5 +t10.5 25.5v145q0 15 -10.5 25.5t-25.5 10.5t-26 -10.5t-11 -25.5v-145q1 -15 11 -26q11 -10 26 -10zM809 139q-11 11 -25 10q-16 0 -26.5 -10.5t-10.5 -25.5t11 -25l102 -103q11 -10 26 -10t25.5 10.5t10.5 25.5t-10 25zM924 285h-145q-16 0 -26 -11q-11 -11 -11 -25.5 +t11 -25t26 -10.5h144q15 0 26 10.5t11 25.5t-10.5 25.5t-25.5 10.5zM648 153q-15 0 -25.5 -10.5t-10.5 -25.5v-145q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v145q0 15 -11 25q-10 11 -25 11zM541 227l-180 -180q-38 -39 -92.5 -39t-93.5 39q-38 39 -38 93t38 93 +l180 180q10 10 10 25t-10.5 25.5t-25.5 10.5t-25 -10l-180 -180q-60 -60 -60 -144q0 -85 60 -144q60 -60 144 -60q85 0 144 60l180 180q11 10 11 25t-11 25.5t-26 10.5t-25 -10zM215 629q11 -11 26 -11t25.5 10.5t10.5 25.5t-11 26l-102 102q-11 11 -26 11t-25.5 -10.5 +t-10.5 -25.5t11 -26zM101 483h145q15 0 25 11q11 10 11 25t-10.5 25.5t-25.5 10.5h-145q-15 0 -25.5 -10.5t-10.5 -25.5q-1 -15 10 -25.5t26 -10.5z" /> + <glyph glyph-name="database" unicode="&#xe650;" +d="M824 896h-624q-30 0 -51 -21t-21 -51v-880q0 -30 21 -51t51 -21h624q30 0 51 21t21 51v880q0 30 -21 51t-51 21zM824 -47h-624v244q0 -1 1 -1h622q1 0 1 1v-244zM824 267q0 1 -1 1h-622q-1 0 -1 -1v244q0 -1 1 -1h622q1 0 1 1v-244zM824 581q0 1 -1 1h-622q-1 0 -1 -1 +v243h624v-243zM321 75zM285 75q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5zM321 389zM285 389q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5zM321 703zM285 703 +q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5z" /> + <glyph glyph-name="barcode" unicode="&#xe652;" +d="M706 128h70q1 0 1 1v638q0 1 -1 1h-70q-1 0 -1 -1v-638q0 -1 1 -1zM534 72h-70q-1 0 -1 -1v-70q0 -1 1 -1h70q1 0 1 1v70q0 1 -1 1zM640 72h-70q-1 0 -1 -1v-70q0 -1 1 -1h70q1 0 1 1v70q0 1 -1 1zM428 72h-214q-1 0 -1 -1v-70q0 -1 1 -1h214q1 0 1 1v70q0 1 -1 1z +M670 768h-34q-1 0 -1 -1v-638q0 -1 1 -1h34q1 0 1 1v638q0 1 -1 1zM213 767q0 1 -1 1h-34q-1 0 -1 -1v-638q0 -1 1 -1h34q1 0 1 1v638zM1023 768h-70q-1 0 -1 -1v-766q0 -1 1 -1h70q1 0 1 1v766q0 1 -1 1zM916 72h-240q-1 0 -1 -1v-70q0 -1 1 -1h240q1 0 1 1v70q0 1 -1 1z +M916 768h-34q-1 0 -1 -1v-638q0 -1 1 -1h34q1 0 1 1v638q0 1 -1 1zM108 128h34q1 0 1 1v638q0 1 -1 1h-34q-1 0 -1 -1v-638q0 -1 1 -1zM354 128h34q1 0 1 1v638q0 1 -1 1h-34q-1 0 -1 -1v-638q0 -1 1 -1zM424 128h70q1 0 1 1v638q0 1 -1 1h-70q-1 0 -1 -1v-638q0 -1 1 -1z +M530 128h70q1 0 1 1v638q0 1 -1 1h-70q-1 0 -1 -1v-638q0 -1 1 -1zM812 128h34q1 0 1 1v638q0 1 -1 1h-34q-1 0 -1 -1v-638q0 -1 1 -1zM71 768h-70q-1 0 -1 -1v-766q0 -1 1 -1h70q1 0 1 1v766q0 1 -1 1zM178 72h-70q-1 0 -1 -1v-70q0 -1 1 -1h70q1 0 1 1v70q0 1 -1 1z +M248 128h70q1 0 1 1v638q0 1 -1 1h-70q-1 0 -1 -1v-638q0 -1 1 -1z" /> + <glyph glyph-name="hourglass" unicode="&#xe653;" +d="M860 8h-92v219l-192 157l192 157v219h92q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-696q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h92v-219l192 -157l-192 -157v-219h-92q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h696q15 0 25.5 10.5 +t10.5 25.5t-10.5 25.5t-25.5 10.5zM328 581v179h368v-179l-182 -147l-2 2l-2 -2zM696 8h-368v179l184 149l184 -149v-179z" /> + <glyph glyph-name="key" unicode="&#xe654;" +d="M876 427q-77 78 -186.5 84t-193.5 -60l-369 369q-11 11 -26 11t-25.5 -10.5t-10.5 -25.5t11 -25l369 -370q-66 -84 -60 -193.5t84 -186.5q84 -84 203.5 -84t204 84t84 203.5t-84.5 203.5zM825 71q-63 -63 -152.5 -63t-153 63t-63.5 152.5t63.5 153t153 63.5t152.5 -63.5 +t63 -153t-63 -152.5zM353 596l76 76q11 10 11 25t-10.5 25.5t-25.5 10.5t-26 -10l-76 -77zM333 768q11 11 11 25.5t-10.5 25t-25.5 10.5t-26 -10l-76 -77l51 -50z" /> + <glyph glyph-name="flag" unicode="&#xe655;" +d="M888 640h-176v56q0 30 -21 51t-51 21h-360q-3 27 -23.5 45.5t-48.5 18.5h-72q-30 0 -51 -21t-21 -51v-752q0 -30 21 -51t51 -21h72q30 0 51 21t21 51v256h360v-56q0 -30 21 -51t51 -21h176q30 0 51 21t21 51v360q0 30 -21 51t-51 21zM208 8h-72v752h72v-752zM640 336 +h-360v360h360v-360zM888 208h-176v360h176v-360z" /> + <glyph glyph-name="layout" unicode="&#xe656;" +d="M136 624zM100 624q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5zM952 768h-880q-30 0 -51 -21t-21 -51v-624q0 -30 21 -51t51 -21h880q30 0 51 21t21 51v624q0 30 -21 51t-51 21zM256 72h-184v408h184v-408zM952 72 +h-624v169q0 -1 1 -1h622q1 0 1 1v-169zM952 311q0 1 -1 1h-622q-1 0 -1 -1v169h624v-169zM952 552h-880v144h880v-144zM240 624zM204 624q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5zM344 624zM308 624 +q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5z" /> + <glyph glyph-name="printer" unicode="&#xe673;" +d="M392 144h240v-72h-240v72zM392 312h240v-72h-240v72zM888 648h-120v112q0 30 -21 51t-51 21h-368q-30 0 -51 -21t-21 -51v-112h-120q-30 0 -51 -21t-21 -51v-304q0 -30 21 -51t51 -21h120v-192q0 -30 21 -51t51 -21h368q30 0 51 21t21 51v192h120q30 0 51 21t21 51v304 +q0 30 -21 51t-51 21zM328 759q0 1 1 1h366q1 0 1 -1v-110q0 -1 -1 -1h-366q-1 0 -1 1v110zM696 8h-368v368h368v-368zM888 272h-120v104q0 30 -21 51t-51 21h-368q-30 0 -51 -21t-21 -51v-104h-120v304h752v-304zM820 508zM784 508q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5 +t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5z" /> + <glyph glyph-name="USB" unicode="&#xe6d7;" +d="M768 704v-192h56v-138h-276v330h60l-96 128l-96 -128h60v-440h-276v129q37 17 50 55q6 16 6 32q0 40 -28 68t-68 28t-68 -28t-28 -68q0 -31 18 -56t46 -34v-126q0 -30 21 -51t51 -21h276v-71q-27 -11 -43.5 -35t-16.5 -54q0 -40 28 -68t68 -28t68 28t28 68q0 30 -16.5 54 +t-43.5 35v181h276q30 0 51 21t21 51v138h64v192h-192zM160 456q-10 0 -17 7t-7 17t7 17t17 7t17 -7t7 -17t-7 -17t-17 -7zM888 584h-48v48h48v-48z" /> + <glyph glyph-name="skin" unicode="&#xe6d8;" +d="M888 832h-259q-2 -5 -3 -11q-13 -36 -44 -58.5t-70 -22.5t-70 22.5t-44 58.5q-1 6 -3 11h-259q-30 0 -51 -21t-21 -51v-368q0 -30 21 -51t51 -21h56v-312q0 -30 21 -51t51 -21h496q30 0 51 21t21 51v312h56q30 0 51 21t21 51v368q0 30 -21 51t-51 21zM888 392h-129 +q1 0 1 -1v-382q0 -1 -1 -1h-494q-1 0 -1 1v382q0 1 1 1h-129v368h210q26 -43 70 -69t96 -26t96 26t70 69h210v-368z" /> + <glyph glyph-name="tool" unicode="&#xe6d9;" +d="M925 731l-167 -166l-68 67l166 166q-63 40 -139.5 32t-130.5 -63q-43 -42 -57.5 -99.5t0.5 -111.5l-189 -189q-54 15 -111.5 0.5t-99.5 -57.5q-55 -54 -63 -130.5t32 -139.5l166 166l67 -68l-166 -166q63 -42 140.5 -34t132.5 63q43 42 57.5 99.5t-0.5 111.5l189 189 +q54 -16 111.5 -1t99.5 57q56 56 63.5 133.5t-33.5 140.5zM395 44q-47 -47 -114 -45l95 95q18 18 18 43t-18 43l-68 68q-18 18 -43.5 18t-43.5 -18l-95 -95q-1 67 46 114q37 37 88 44.5t96 -15.5q21 -12 39 -29q17 -17 28 -39q24 -44 16.5 -95.5t-44.5 -88.5zM468 273 +q-13 21 -30 37q-17 18 -37 30l155 155q13 -21 30 -37q17 -18 37 -30zM852 501q-37 -37 -88 -44.5t-96 15.5q-21 12 -39 29q-17 17 -28 39q-24 44 -16.5 95.5t44.5 87.5q47 47 114 46l-95 -95q-18 -18 -18 -43.5t18 -43.5l68 -67q18 -18 43.5 -18t43.5 18l95 95 +q1 -67 -46 -114z" /> + <glyph glyph-name="car" unicode="&#xe6dc;" +d="M952 448h8l-50 242q-5 29 -30.5 49.5t-55.5 20.5h-624q-30 0 -55 -20.5t-31 -49.5l-50 -242h8q-30 0 -51 -21t-21 -51v-176q0 -28 18.5 -48.5t45.5 -23.5v0q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5h384q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5v0 +q27 3 45.5 23.5t18.5 48.5v176q0 30 -21 51t-51 21zM182 688h656l50 -240h-752zM952 200h-64v-72q0 -23 -16.5 -39.5t-39.5 -16.5t-39.5 16.5t-16.5 39.5v72h-528v-72q0 -23 -16.5 -39.5t-39.5 -16.5t-39.5 16.5t-16.5 39.5v72h-64v176h880v-176zM192 288zM156 288 +q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5zM832 288zM796 288q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5z" /> + <glyph glyph-name="addusergroup" unicode="&#xe6dd;" +d="M420 470q-5 24 -5 48q0 13 1 25q-38 5 -63.5 34.5t-25.5 68.5q0 43 30.5 73.5t73.5 30.5q28 0 52 -14t37 -37q33 18 69 24q-22 45 -64.5 72t-93.5 27q-73 0 -124.5 -51.5t-51.5 -124.5q0 -70 48 -121t117 -55zM777 307q-73 35 -154 35q-146 0 -249 -103t-103 -249 +q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5q0 116 82 198t198 82q28 0 56 -6q44 33 98 43zM909 142h-88v88q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-88h-88q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h88v-88q0 -15 10.5 -25.5t25.5 -10.5 +t25.5 10.5t10.5 25.5v88h88q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM799 518q0 73 -51.5 124.5t-124.5 51.5t-124.5 -51.5t-51.5 -124.5t51.5 -124.5t124.5 -51.5t124.5 51.5t51.5 124.5zM623 414q-43 0 -73.5 30.5t-30.5 73.5t30.5 73.5t73.5 30.5t73.5 -30.5 +t30.5 -73.5t-30.5 -73.5t-73.5 -30.5zM454 397q-24 33 -33 73q-94 -3 -172.5 -50.5t-124 -127.5t-45.5 -174q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5q0 116 82 198t198 82q11 0 23 -1z" /> + <glyph glyph-name="carryout" unicode="&#xe6df;" +d="M162 312h380q14 0 24 10t10 24v4q0 14 -10 24t-24 10h-380q-14 0 -24 -10t-10 -24v-4q0 -14 10 -24t24 -10zM537.5 265.5q-10.5 -10.5 -10.5 -25.5t11 -25l84 -85l1 -1l1 -1l4 -3q10 -10 23.5 -10t23.5 10l224 224q10 10 10 24t-10 23l-3 4q-10 10 -24 10t-24 -10 +l-197 -197l-63 63q-10 10 -25 10t-25.5 -10.5zM952 704h-84v28q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-28h-248v28q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-28h-248v28q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-28h-84 +q-30 0 -51 -21t-21 -51v-560q0 -30 21 -51t51 -21h880q30 0 51 21t21 51v560q0 30 -21 51t-51 21zM952 72h-880v376h880v-376zM952 520h-880v112h84v-20q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v20h248v-20q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v20 +h248v-20q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v20h84v-112zM162 188h252q14 0 24 10t10 24v4q0 14 -10 24t-24 10h-252q-14 0 -24 -10t-10 -24v-4q0 -14 10 -24t24 -10z" /> + <glyph glyph-name="deleteuser" unicode="&#xe6e0;" +d="M722 320q-95 63 -210 63q-104 0 -192.5 -51.5t-140 -140t-51.5 -193.5v0v-1v-1q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v2v0q0 130 91.5 221.5t220.5 91.5q58 0 111 -21q46 27 99 30zM787 96l62 62q11 11 11 26t-10.5 25.5t-25.5 10.5t-26 -10l-62 -63l-62 63 +q-11 10 -26 10t-25.5 -10.5t-10.5 -25.5t11 -26l62 -62l-62 -62q-11 -10 -11 -25t10.5 -25.5t25.5 -10.5t26 10l62 62l62 -62q11 -10 26 -10t25.5 10.5t10.5 25.5t-11 25zM736 607.5q0 92.5 -65.5 158.5t-158.5 66t-158.5 -66t-65.5 -158.5t65.5 -158.5t158.5 -66t158.5 66 +t65.5 158.5zM512 455q-63 0 -107.5 44.5t-44.5 108t44.5 108t107.5 44.5t107.5 -44.5t44.5 -108t-44.5 -108t-107.5 -44.5z" /> + <glyph glyph-name="deleteusergroup" unicode="&#xe6e1;" +d="M420 470q-5 24 -5 48q0 13 1 25q-38 5 -63.5 34.5t-25.5 68.5q0 43 30.5 73.5t73.5 30.5q28 0 52 -14t37 -37q33 18 69 24q-22 45 -64.5 72t-93.5 27q-73 0 -124.5 -51.5t-51.5 -124.5q0 -70 48 -121t117 -55zM898 44l-62 62l62 62q11 11 11 26t-10.5 25.5t-25.5 10.5 +t-26 -11l-62 -62l-62 62q-11 11 -26 11t-25.5 -10.5t-10.5 -25.5t11 -26l62 -62l-62 -62q-11 -11 -11 -26t10.5 -25.5t25.5 -10.5t26 11l62 62l62 -62q11 -11 26 -11t25.5 10.5t10.5 25.5t-11 26zM777 307q-73 35 -154 35q73 0 124.5 51.5t51.5 124.5t-51.5 124.5 +t-124.5 51.5t-124.5 -51.5t-51.5 -124.5t51.5 -124.5t124.5 -51.5q-146 0 -249 -103t-103 -249q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5q0 116 82 198t198 82q28 0 56 -6q44 33 98 43zM519 518q0 43 30.5 73.5t73.5 30.5t73.5 -30.5t30.5 -73.5t-30.5 -73.5 +t-73.5 -30.5t-73.5 30.5t-30.5 73.5zM454 397q-24 33 -33 73q-94 -3 -172.5 -50.5t-124 -127.5t-45.5 -174q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5q0 116 82 198t198 82q11 0 23 -1z" /> + <glyph glyph-name="man" unicode="&#xe6e2;" +d="M384 576q-133 0 -226.5 -93.5t-93.5 -226.5t93.5 -226.5t226.5 -93.5t226.5 93.5t93.5 226.5t-93.5 226.5t-226.5 93.5zM384 8q-103 0 -175.5 72.5t-72.5 175.5t72.5 175.5t175.5 72.5t175.5 -72.5t72.5 -175.5t-72.5 -175.5t-175.5 -72.5zM949.5 821.5 +q-10.5 10.5 -25.5 10.5h-376q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h340v-340q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v376q0 15 -10.5 25.5z" /> + <glyph glyph-name="isv" unicode="&#xe6e3;" +d="M860 292q-15 0 -25.5 -10.5t-10.5 -25.5v-248h-624v248q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-248q0 -30 21 -51t51 -21h624q30 0 51 21t21 51v248q0 15 -10.5 25.5t-25.5 10.5zM888 832h-752q-30 0 -51 -21t-21 -51v-204q0 -71 51 -122t123 -51 +q41 0 77 18t60 50q24 -32 60 -50t77 -18q42 0 77.5 18t60.5 49q24 -31 59.5 -49t76.5 -18q72 0 123 51t51 122v204q0 30 -21 51t-51 21zM339 658v-102q0 -42 -29.5 -71.5t-72 -29.5t-72 29.5t-29.5 71.5v204h203v-102zM512 455q-42 0 -71.5 29.5t-29.5 71.5v204h202v-204 +v-11q-4 -38 -33 -64t-68 -26zM888 556q0 -42 -29.5 -71.5t-72 -29.5t-72 29.5t-29.5 71.5v204h203v-204z" /> + <glyph glyph-name="gift" unicode="&#xe6e4;" +d="M888 576h-248q53 0 90.5 37.5t37.5 90.5t-37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5h-248q-30 0 -51 -21t-21 -51v-112q0 -30 21 -51t51 -21h-8v-312q0 -30 21 -51t51 -21h624 +q30 0 51 21t21 51v312h-8q30 0 51 21t21 51v112q0 30 -21 51t-51 21zM384 648q-23 0 -39.5 16.5t-16.5 39.5t16.5 39.5t39.5 16.5t39.5 -16.5t16.5 -39.5v-56h-56zM476 8h-276v312h276v-312zM476 392h-340v112h340v-112zM584 704q0 23 16.5 39.5t39.5 16.5t39.5 -16.5 +t16.5 -39.5t-16.5 -39.5t-39.5 -16.5h-56v56zM824 8h-276v312h276v-312zM888 392h-340v112h340v-112z" /> + <glyph glyph-name="idcard" unicode="&#xe6e5;" +d="M200 128h176q30 0 51 21t21 51v88q0 41 -19 76t-51 57q38 37 38 91q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5q0 -54 38 -91q-32 -22 -51 -57t-19 -76v-88q0 -30 21 -51t51 -21zM288 568q23 0 39.5 -16.5t16.5 -39.5t-16.5 -39.5t-39.5 -16.5t-39.5 16.5 +t-16.5 39.5t16.5 39.5t39.5 16.5zM200 283v1v4q0 36 26 62t62 26t62 -26t26 -62v-4v-1v-78q0 -5 -5 -5h-166q-5 0 -5 5v78zM952 768h-880q-30 0 -51 -21t-21 -51v-624q0 -30 21 -51t51 -21h880q30 0 51 21t21 51v624q0 30 -21 51t-51 21zM952 72h-880v624h880v-624zM548 348 +h248q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-248q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5zM548 184h184q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-184q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5zM548 512h312q15 0 25.5 10.5 +t10.5 25.5t-10.5 25.5t-25.5 10.5h-312q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5z" /> + <glyph glyph-name="medicinebox" unicode="&#xe6e6;" +d="M952 584h-120v112q0 30 -21 51t-51 21h-496q-30 0 -51 -21t-21 -51v-112h-120q-30 0 -51 -21t-21 -51v-440q0 -30 21 -51t51 -21h880q30 0 51 21t21 51v440q0 30 -21 51t-51 21zM264 696h496v-112h-496v112zM952 72h-880v440h880v-440zM388 256h88v-88q0 -15 10.5 -25.5 +t25.5 -10.5t25.5 10.5t10.5 25.5v88h88q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-88v88q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-88h-88q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5z" /> + <glyph glyph-name="redenvelopes" unicode="&#xe6e7;" +d="M512 457l-59 59q-11 10 -25.5 10t-25 -10.5t-10.5 -25t10 -25.5l67 -67h-115q-14 0 -24 -10t-10 -24v-4q0 -14 10 -24t24 -10h122v-64h-90q-14 0 -24 -10t-10 -24v-4q0 -14 10 -24t24 -10h90v-84q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v84h90q14 0 24 10 +t10 24v4q0 14 -10 24t-24 10h-90v64h122q14 0 24 10t10 24v4q0 14 -10 24t-24 10h-114l67 68q11 10 11 25t-10.5 25.5t-25.5 10.5t-26 -10zM896 770h-1q-3 26 -23.5 44t-47.5 18h-624q-27 0 -47.5 -18t-23.5 -44h-1h1q-1 -5 -1 -10v-752q0 -30 21 -51t51 -21h624q30 0 51 21 +t21 51v752q0 5 -1 10h1zM715 760l-158 -78q-19 -10 -45 -10t-45 10l-157 78h405zM824 8h-624v725l248 -126q26 -14 64 -14t64 14l248 126v-725z" /> + <glyph glyph-name="rest" unicode="&#xe6e8;" +d="M275 615q15 0 25.5 10.5t10.5 25.5v209q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-209q0 -15 10.5 -25.5t25.5 -10.5zM888 471h-120q0 30 -21 51t-51 21h-496q-30 0 -51 -21t-21 -51v-248q0 -5 1 -10q-1 -10 -1 -21q0 -133 93.5 -226.5t226.5 -93.5 +q119 0 208.5 77.5t107.5 193.5h124q30 0 51 21t21 51v184q0 30 -21 51t-51 21zM696 215h-1q1 -12 1 -23q0 -103 -72.5 -175.5t-175.5 -72.5t-175.5 72.5t-72.5 175.5q0 11 1 23h-1v256h496v-256zM888 223h-112v176h112v-176zM613 615q15 0 25.5 10.5t10.5 25.5v209 +q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-209q0 -15 10.5 -25.5t25.5 -10.5zM443 615q15 0 25.5 10.5t10.5 25.5v209q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-209q0 -15 10.5 -25.5t25.5 -10.5z" /> + <glyph glyph-name="Safety" unicode="&#xe6ea;" +d="M512 832l-384 -128v-384q0 -159 112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5v384zM824 320q0 -129 -91.5 -220.5t-220.5 -91.5t-220.5 91.5t-91.5 220.5v330l312 110l312 -110v-330zM378 421q-10 10 -25 10t-25.5 -10.5t-10.5 -25.5t11 -25l129 -129l2 -3 +q10 -9 24 -9t24 9l224 224q10 10 10 24t-10 24l-3 3q-10 10 -24 10t-24 -10l-197 -197z" /> + <glyph glyph-name="wallet" unicode="&#xe6eb;" +d="M620 384zM584 384q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5zM952 768h-880q-30 0 -51 -21t-21 -51v-624q0 -30 21 -51t51 -21h880q30 0 51 21t21 51v624q0 30 -21 51t-51 21zM952 328h-432v112h432v-112z +M952 512h-432q-30 0 -51 -21t-21 -51v-112q0 -30 21 -51t51 -21h432v-184h-880v624h880v-184z" /> + <glyph glyph-name="woman" unicode="&#xe6ec;" +d="M512 320q119 0 203.5 84.5t84.5 203.5t-84.5 203.5t-203.5 84.5t-203.5 -84.5t-84.5 -203.5t84.5 -203.5t203.5 -84.5zM512 824q89 0 152.5 -63.5t63.5 -152.5t-63.5 -152.5t-152.5 -63.5t-152.5 63.5t-63.5 152.5t63.5 152.5t152.5 63.5zM860 256h-696 +q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h312v-276q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v276h312q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5z" /> + <glyph glyph-name="adduser" unicode="&#xe6ed;" +d="M860 132h-88v88q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-88h-88q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h88v-88q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v88h88q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM736 607.5 +q0 92.5 -65.5 158.5t-158.5 66t-158.5 -66t-65.5 -158.5t65.5 -158.5t158.5 -66t158.5 66t65.5 158.5zM512 455q-63 0 -107.5 44.5t-44.5 108t44.5 108t107.5 44.5t107.5 -44.5t44.5 -108t-44.5 -108t-107.5 -44.5zM722 320q-95 63 -210 63q-104 0 -192.5 -51.5t-140 -140 +t-51.5 -193.5v0v-1v-1q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v2v0q0 130 91.5 221.5t220.5 91.5q58 0 111 -21q46 27 99 30z" /> + <glyph glyph-name="bank" unicode="&#xe6ee;" +d="M940 419l-402 401q-10 11 -25 11t-26 -11l-401 -401q-11 -11 -11 -26t10.5 -25.5t25.5 -10.5t25 11l377 376l376 -376q10 -11 25 -11t25.5 11t10.5 25.5t-10 25.5zM828 292q-15 0 -25.5 -10.5t-10.5 -25.5v-248h-560v248q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5 +t-10.5 -25.5v-248q0 -30 21 -51t51 -21h560q30 0 51 21t21 51v248q0 15 -10.5 25.5t-25.5 10.5zM320 358v-4q0 -14 10 -24t24 -10h122v-64h-90q-14 0 -24 -10t-10 -24v-4q0 -14 10 -24t24 -10h90v-84q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v84h90q14 0 24 10 +t10 24v4q0 14 -10 24t-24 10h-90v64h122q14 0 24 10t10 24v4q0 14 -10 24t-24 10h-135q2 1 2 2l85 85q11 10 11 25t-10.5 25.5t-25.5 10.5t-26 -10l-59 -60l-60 60q-10 10 -25 10t-25.5 -10.5t-10.5 -25.5t10 -25l85 -85l2 -2h-134q-14 0 -24 -10t-10 -24z" /> + <glyph glyph-name="Trophy" unicode="&#xe6ef;" +d="M760 384h8q53 0 90.5 37.5t37.5 90.5v256h-128q-4 27 -24 45.5t-48 18.5h-368q-28 0 -48.5 -18.5t-23.5 -45.5h-128v-256q0 -53 37.5 -90.5t90.5 -37.5h8q19 -75 77 -127t135 -63v-186h-312q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h696q15 0 25.5 10.5 +t10.5 25.5t-10.5 25.5t-25.5 10.5h-312v186q77 11 135 63t77 127zM768 696h56v-184q0 -23 -16.5 -39.5t-39.5 -16.5v240zM256 456q-23 0 -39.5 16.5t-16.5 39.5v184h56v-240zM512 264q-76 0 -130 54t-54 130v312h368v-312q0 -76 -54 -130t-130 -54z" /> + <glyph glyph-name="loading1" unicode="&#xe6ae;" +d="M512 -128q-104 0 -199 40q-92 39 -163 110t-110 163q-40 95 -40 199q0 15 10.5 25.5t25.5 10.5t25.5 -10.5t10.5 -25.5q0 -90 35 -171q33 -79 94 -140t140 -95q81 -34 171 -34t171 35q79 33 140 94t95 140q34 81 34 171t-35 171q-33 79 -94 140t-140 95q-81 34 -171 34 +q-15 0 -25.5 10.5t-10.5 25.5t10.5 25.5t25.5 10.5q104 0 199 -40q92 -39 163 -110t110 -163q40 -95 40 -199t-40 -199q-39 -92 -110 -163t-163 -110q-95 -40 -199 -40z" /> + <glyph glyph-name="loading2" unicode="&#xe64d;" +d="M988 348q-15 0 -25.5 10.5t-10.5 25.5q0 90 -35 171q-33 79 -94 140t-140 95q-81 34 -171 34q-15 0 -25.5 10.5t-10.5 25.5t10.5 25.5t25.5 10.5q104 0 199 -40q92 -39 163 -110t110 -163q40 -95 40 -199q0 -15 -10.5 -25.5t-25.5 -10.5z" /> + <glyph glyph-name="like2" unicode="&#xe69d;" +d="M958 421v3q-2 3 -2 4q-15 58 -66 77q-24 8 -50 8h-1h-87h-32.5h-32.5h-21q4 27 7 41q13 67 -5 119q-7 20 -24 66l-9 24q-16 40 -54 56q-29 13 -59 13q-34 0 -66 -17q-51 -26 -50 -83q1 -23 1 -36q1 -41 2 -62q0 -5 -2 -9q-3 -6 -10.5 -19t-11.5 -20q-35 -61 -53 -90 +q-12 -18 -32.5 -30t-35.5 -15l-15 -3h-113q-30 0 -51 -21t-21 -51v-368q0 -30 21 -51t51 -21h248h80h80h50h50h94q42 0 72 10q40 13 64.5 44t28.5 73q2 23 -3 45q25 40 23 84q-1 12 -5 24q24 36 23 76q0 15 -5 30q14 21 20 45l4 5v44zM248 8h-112v368h112v-368zM888 391 +l-2 -8q-3 -11 -9 -21l-19 -28l9 -32q2 -6 2 -13q1 -17 -11 -33l-18 -28l9 -32q1 -5 2 -9q1 -20 -12 -40l-16 -25l6 -25v0v-3q3 -13 2 -25v0v-1q-2 -20 -13 -33q-11 -14 -30 -21q-19 -6 -50 -6h-94h-24.5h-25h-25.5h-25h-77h-83h-64l1 388q46 22 72 62v1q19 30 53 91l1 1v0 +q2 3 14 24q1 1 4 6t4 7q14 24 12 51q-1 22 -2 57v2v16v20q-1 6 2 10q2 4 9 8q16 8 32 8q15 0 31 -7q10 -4 15 -15q7 -21 9 -24q15 -41 23 -64q12 -35 2 -82q-3 -17 -7 -43l-14 -84h106h32h32h88h1v0q13 0 26 -4q15 -6 20 -27q1 0 1.5 -2t0.5 -3v-14z" /> + <glyph glyph-name="dislike2" unicode="&#xe69e;" +d="M960 352v44l-4 6q-6 24 -20 44q5 14 5 30q2 40 -23 76q4 12 5 25q2 43 -23 83q5 22 2 46q-3 41 -27.5 72t-64.5 44q-30 10 -72 10h-94h-50h-51h-79h-80h-248q-30 0 -51 -21t-21 -51v-368q0 -30 21 -51t51 -21h113q6 -1 16 -3t32.5 -14.5t34.5 -30.5q18 -29 53 -90 +q4 -7 11.5 -20t10.5 -18q2 -5 2 -10q-1 -20 -2 -62q0 -13 -1 -36q-1 -56 50 -83q32 -17 66 -17q30 0 59 12q38 17 54 57l9 24q15 41 24 65q18 53 5 120q-4 19 -7 41h21h32.5h32.5h87h1q26 0 50 8q52 19 66 77l2 4v3zM248 392h-112v368h112v-368zM888 363q0 -1 -1 -3 +q0 -2 -1 -2q-5 -21 -20 -27q-13 -4 -26 -4v0h-1h-88h-32h-15.5h-16.5h-106l14 -84q4 -26 7 -43q10 -48 -2 -82q-8 -23 -24 -63q-1 -5 -4.5 -14t-4.5 -10q-4 -12 -14 -16q-16 -7 -31 -7q-16 0 -32 8q-7 4 -10 8q-2 3 -2 10q1 23 1 37v1q1 39 2 57q2 27 -12 51q-1 2 -4 6.5 +t-4 6.5q-13 23 -14 24v0l-1 2q-34 60 -53 91h-1q-25 40 -71 62l-1 388h64h83h77h25h25.5h25h24.5h94q31 0 50 -6t30 -21q11 -13 13 -33v-1v0q1 -12 -2 -24v-4v0l-6 -25l16 -25q13 -20 12 -39q0 -5 -2 -9l-9 -33l18 -28q12 -16 11 -33q0 -7 -2 -13l-9 -32l19 -28q6 -10 9 -21 +l2 -8v-14z" /> + <glyph glyph-name="like1" unicode="&#xe64c;" +d="M184 448h-48q-30 0 -51 -21t-21 -51v-368q0 -30 21 -51t51 -21h48q30 0 51 21t21 51v368q0 30 -21 51t-51 21zM957 422q-11 43 -47 56q-21 6 -42 6h-226q-7 0 -8 1.5t0 8.5q2 10 4.5 26.5t5 30.5t4.5 26q12 62 -4 109q-6 17 -36 97q-10 28 -36 39q-53 22 -102 -3 +q-34 -18 -33 -54q0 -10 1 -48t2 -58q1 -18 -8 -33q-73 -125 -76 -130q-4 -6 -28 -32q-17 -18 -24 -30t-7 -29q0 -284 -1 -397q0 -30 21.5 -51t51.5 -21h390q40 0 66 9q32 10 51 34t22 58q2 29 -6 50q-1 4 2 9q28 37 26 76q-1 10 -7 29q-3 7 2 13q26 33 25 69q0 7 -3.5 21 +t-3.5 16q-2 6 0 9q19 21 26 53q0 1 1 2v29z" /> + <glyph glyph-name="dislike1" unicode="&#xe64b;" +d="M256 392q0 -30 -21 -51t-51 -21h-48q-30 0 -51 21t-21 51v368q0 30 21 51t51 21h48q30 0 51 -21t21 -51v-368zM957 346q-11 -43 -47 -56q-21 -6 -42 -6h-226q-7 0 -8 -1.5t0 -8.5q2 -10 4.5 -26.5t5 -30.5t4.5 -26q12 -62 -4 -109q-6 -17 -36 -97q-10 -28 -36 -39 +q-53 -22 -102 3q-34 18 -33 54q0 10 1 48t2 58q1 18 -8 33q-73 125 -76 130q-4 6 -28 32q-17 18 -24 30t-7 29q0 284 -1 397q0 30 21.5 51t51.5 21h390q40 0 66 -9q32 -10 51 -34t22 -58q2 -29 -6 -50q-1 -4 2 -9q28 -37 26 -76q-1 -10 -7 -29q-3 -7 2 -13q26 -33 25 -69 +q0 -7 -3.5 -21t-3.5 -15q-2 -7 0 -9q19 -22 26 -54q0 -1 1 -2v-28q-2 -7 -3 -10z" /> + <glyph glyph-name="bulb1" unicode="&#xe649;" +d="M640 -56h-256q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h256q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM896 522q0 155 -112.5 264.5t-271.5 109.5t-271.5 -109.5t-112.5 -264.5q0 -102 52 -188.5t140 -135.5v-62q0 -30 21 -51t51 -21h240 +q30 0 51 21t21 51v62q88 49 140 135.5t52 188.5zM733 309q-43 -42 -99 -65l-1 -0.5l-1 -0.5v-107h-240v107l-1 0.5l-1 0.5q-56 23 -99 65t-67 96q-24 56 -24 117t24 117q24 54 67 96t99 65q58 24 122 24t122 -24q56 -23 99 -65t67 -96q24 -56 24 -117t-24 -117 +q-24 -54 -67 -96z" /> + <glyph glyph-name="rocket1" unicode="&#xe90f;" +d="M954 799l-6 21l-21 5q-27 7 -72 7q-111 0 -235 -34q-63 -18 -112 -41q-50 -25 -78 -53q-25 -25 -65 -97q-9 -17 -19 -36q-60 -18 -143 -70q-97 -61 -132 -107q-11 -14 -6 -31.5t22 -23.5q3 -1 10.5 -4t11.5 -4q79 -30 111 -46v0l192 -193q16 -33 46 -112q4 -10 9 -21 +q6 -17 23 -22q5 -1 10 -1q12 0 22 7q46 34 106 132q53 84 70 143q21 11 37 19q73 40 98 65q35 35 64.5 106.5t46.5 163.5q16 83 16 152q0 47 -6 75zM293 457q-21 -47 -46 -105q-29 14 -82 34q33 27 76 54q31 19 59 34q-4 -10 -7 -17zM568 113q-27 -43 -54 -76q-20 51 -34 82 +q55 23 106 46q1 0 15 7q-14 -28 -33 -59zM888 725q0 -64 -14 -140q-16 -81 -42 -145q-24 -61 -50 -87v0q-17 -17 -82 -52q-58 -32 -144 -71q-56 -25 -126 -54l-126 126q27 65 54 126q39 86 71 144q35 64 52 82q19 19 59 38q43 21 100 36q113 32 216 32q17 0 31 -1 +q1 -16 1 -34zM185 144q-29 0 -51.5 -17t-31.5 -44l-37 -125q-1 -2 -1 -5q0 -7 5 -12t12 -5q3 0 5 1l124 37q27 9 44.5 32t17.5 52q0 35 -25.5 60.5t-61.5 25.5zM594.5 466.5q18.5 -18.5 45.5 -18.5t45.5 18.5t18.5 45.5t-18.5 45.5t-45.5 18.5t-45.5 -18.5t-18.5 -45.5 +t18.5 -45.5z" /> + <glyph glyph-name="select1" unicode="&#xe64a;" +d="M888 832h-752q-30 0 -51 -21t-21 -51v-752q0 -30 21 -51t51 -21h504q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-504v752h752v-504q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v504q0 30 -21 51t-51 21zM634 314l103 103q9 9 4.5 20t-16.5 11h-241 +q-15 0 -25.5 -10.5t-10.5 -25.5v-240q0 -13 11 -17.5t20 4.5l103 104l188 -188q11 -11 26 -11t25.5 10.5t10.5 25.5t-10 26z" /> + <glyph glyph-name="apple1" unicode="&#xe68c;" +d="M902 547q-21 31 -49 52.5t-55.5 31t-46.5 13.5t-36 4q-35 4 -75 -7.5t-73 -25t-48 -13.5q-17 0 -75 22.5t-94 21.5q-65 -1 -121.5 -35.5t-90.5 -92.5q-32 -56 -40 -128t5.5 -142t39.5 -133.5t60 -112.5q20 -30 34.5 -48t36 -40t44.5 -32.5t47 -9.5q29 1 77.5 21.5 +t89.5 20.5q40 0 88 -20.5t81 -20.5q25 1 47 11t42.5 30.5t34 37.5t33.5 47q44 64 71 146v0q-8 3 -17.5 8t-33 22.5t-40.5 38.5t-31.5 58t-14.5 80q-1 36 11 70t24.5 53.5t34 39t26.5 23t14 9.5zM716 896q-39 -2 -81 -23.5t-70 -54.5q-27 -30 -41.5 -73t-9.5 -85 +q41 -3 80.5 17.5t68.5 55.5q28 34 43 77t10 86z" /> + <glyph glyph-name="apple-o" unicode="&#xe6d4;" +d="M698 577h10h2l2 -1q30 -1 59 -13q13 -5 25 -12q-4 -5 -10 -11q-30 -37 -46 -79q-21 -52 -21 -110q1 -125 88 -210q16 -15 33 -27q-18 -40 -42 -74q-37 -55 -58 -74q-21 -20 -40 -21h-2q-17 0 -47 14q-64 27 -119 27q-56 0 -122 -28q-31 -13 -48 -14h-1q-15 0 -38 22 +t-61 77q-66 95 -88 218q-11 65 -5 120q7 57 31 101q25 42 65 67q41 24 86 25h1q23 0 77 -21q58 -24 90 -24q29 0 87 23q63 25 92 25zM698 649q-41 0 -103 -24t-76 -24q-17 0 -74 22.5t-93 22.5h-2q-65 -1 -121.5 -35.5t-90.5 -92.5q-32 -57 -40 -128.5t5.5 -141.5 +t39.5 -133.5t60 -112.5q20 -29 34 -47.5t35 -40t43.5 -32t45.5 -10.5h3q30 1 78.5 21.5t89.5 20.5q40 0 87 -20.5t79 -20.5h3q25 1 47 11t42.5 30.5t33.5 37.5t34 47q44 64 71 146v0q-8 3 -17.5 8t-33 22.5t-40.5 38.5t-31.5 58t-15.5 80q0 36 12 70t24.5 53.5t34 39t26 23 +t14.5 9.5q-21 31 -49 52.5t-55.5 31t-46.5 13.5t-36 4q-9 1 -17 1zM716 896q-39 -2 -81 -23.5t-70 -54.5q-27 -30 -41.5 -73t-9.5 -85q41 -3 80.5 17.5t68.5 55.5q28 34 43 77t10 86z" /> + <glyph glyph-name="android1" unicode="&#xe938;" +d="M888 575q-26 0 -44.5 -18.5t-18.5 -44.5v-247q0 -27 18.5 -45.5t44 -18.5t44 18.5t18.5 45.5v247q0 26 -18 44.5t-44 18.5zM136.5 575q-25.5 0 -44 -18.5t-18.5 -44.5v-247q0 -27 18.5 -45.5t44 -18.5t44 18.5t18.5 45.5v247q0 26 -18.5 44.5t-44 18.5zM236 573v-452 +q0 -20 14.5 -34t34.5 -14h55v-138q0 -26 18.5 -44.5t44 -18.5t44 18.5t18.5 44.5v138h97v-138q0 -26 18 -44.5t44 -18.5t44 18.5t18 44.5v138h56q20 0 34 14t14 35v451h-554zM643 807l52 75q5 8 -2 13t-13 -3l-53 -78q-55 22 -115 22t-115 -22l-53 77q-6 9 -13 3 +q-7 -4 -2 -13l52 -74q-62 -29 -101.5 -80t-44.5 -114h554q-5 63 -44.5 114t-101.5 80zM395 690q-13 0 -22 9t-9 22t9 22t22 9t22 -9t9 -22t-9 -22t-22 -9zM632.5 690q-12.5 0 -21.5 9t-9 22t9 22t21.5 9t21.5 -9t9 -22t-9 -22t-21.5 -9z" /> + <glyph glyph-name="android" unicode="&#xe68d;" +d="M888.5 601.5q-24.5 24.5 -60.5 24.5q-6 0 -13 -1v1h-4q-9 53 -43 100q-32 44 -81 74l29 41v4v2l1 2q1 7 1 10q0 16 -10 26.5t-26 10.5q-18 0 -30 -18l-33 -48q-53 18 -107 18t-107 -18l-33 48q-12 18 -30 18q-16 0 -26 -10.5t-10 -26.5q0 -11 7 -19l26 -37 +q-50 -30 -82 -75q-34 -47 -42 -100h-6v-1q-6 1 -12 1q-37 0 -61 -24t-24 -60v-269q0 -36 24 -60.5t60 -24.5q6 0 13 1v-107q0 -25 17.5 -42.5t42.5 -17.5h37v-67q0 -36 24 -60q24 -25 60.5 -25t60.5 24q24 25 24 61v66h73v-66q0 -36 25 -60q24 -25 60 -25t61 25q24 24 24 60 +v67h36q25 0 43 17.5t18 42.5v105q6 -1 12 -1q36 0 61 24q24 25 24 61v268q1 36 -23.5 60.5zM209 272q0 -12 -12 -12t-12 12v269q0 12 12 12t12 -12v-269zM358 726q66 48 154 48t154 -48q56 -42 71 -100h-450q15 58 71 100zM403 -45q-1 -10 -12 -10q-12 0 -12 12v67h24v-69z +M646 -45q-2 -10 -12 -10q-13 0 -13 12v67h25v-69zM743 96h-461v457h461v-457zM840 272q0 -12 -12.5 -12t-12.5 12v269q0 12 12.5 12t12.5 -12v-269zM585 712q-16 0 -26 -10.5t-10 -26.5t10 -26t26 -10t26.5 10t10 26t-10.5 26.5t-26 10.5zM439.5 712q-15.5 0 -26 -10.5 +t-10.5 -26.5t10.5 -26t26 -10t26 10t10.5 26t-10.5 26.5t-26 10.5z" /> + <glyph glyph-name="aliwangwang-o1" unicode="&#xe68f;" +d="M985 560q-37 88 -106 157q-68 69 -158 106q-92 39 -192 39q-83 0 -160 -26q-54 25 -122 40t-105 17.5t-69 2.5h-12q-25 -1 -38.5 -21.5t-4.5 -43.5l84 -211q-69 -117 -69 -253q0 -101 39 -193q38 -88 106 -157q69 -68 158 -106q92 -39 193 -39q100 0 193 39 +q88 37 157 106q68 68 106 157q39 92 39 193.5t-39 192.5zM919 202q-32 -75 -91 -134t-134 -91h-1q-78 -33 -164.5 -33t-164.5 33q-76 32 -135 91t-90 134v1q-34 78 -34 164q0 117 59 216l18 30l-83 210q40 -1 82 -7q91 -14 158 -45l26 -12l28 9q65 22 136 22q86 0 164 -33 +q76 -32 135 -91t91 -134v0q33 -78 33 -165q0 -86 -33 -165zM511.5 577q-20.5 0 -34.5 -14t-14 -34v-72q0 -20 14 -34.5t34.5 -14.5t34.5 14.5t14 34.5v72q0 20 -14 34t-34.5 14zM740.5 577q-20.5 0 -34.5 -14t-14 -34v-72q0 -20 14 -34.5t34.5 -14.5t34.5 14.5t14 34.5v72 +q0 20 -14 34t-34.5 14z" /> + <glyph glyph-name="aliwangwang" unicode="&#xe68e;" +d="M985 560q-37 88 -106 157q-68 69 -158 106q-91 39 -192 39q-83 0 -160 -26q-54 25 -122 40t-105 17.5t-69 2.5h-12q-25 -1 -38.5 -21.5t-4.5 -43.5l84 -211q-69 -117 -69 -253q0 -101 39 -193q38 -88 106 -157q69 -68 158 -106q92 -39 193 -39t193 39q88 37 157 106 +q68 68 106 157q39 92 39 193.5t-39 192.5zM560 457q0 -20 -14 -34.5t-34.5 -14.5t-34.5 14.5t-14 34.5v72q0 20 14 34t34.5 14t34.5 -14t14 -34v-72zM789 457q0 -20 -14 -34.5t-34.5 -14.5t-34.5 14.5t-14 34.5v72q0 20 14 34t34.5 14t34.5 -14t14 -34v-72z" /> + <glyph glyph-name="pay-circle1" unicode="&#xe6a5;" +d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM737 419q0 -14 -10.5 -23.5t-24.5 -9.5h-154v-64h122q14 0 24.5 -10.5t10.5 -24.5v-4q0 -14 -10.5 -23.5 +t-24.5 -9.5h-122v-149q0 -15 -10.5 -25.5t-25.5 -10.5t-25.5 10.5t-10.5 25.5v149h-122q-15 0 -24.5 9.5t-9.5 23.5v4q0 14 10 24.5t24 10.5h122v64h-154q-15 0 -25 10t-10 24v3q0 14 10 24.5t25 10.5h166l-2 1l-118 118q-11 11 -11 26t10.5 25.5t25.5 10.5t26 -10l93 -93 +l92 92q11 11 25.5 11t25.5 -10.5t10.5 -25.5t-10.5 -25l-118 -118q-1 -1 -2 -1h167q14 0 24.5 -11t10.5 -25v-4z" /> + <glyph glyph-name="pay-circle-o1" unicode="&#xe6a6;" +d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM823 73q-61 -61 -140 -94q-81 -35 -171 -35t-171 35q-79 33 -140 94t-94 140q-35 81 -35 171t35 171 +q33 79 94 140t140 94q81 35 171 35t171 -35q79 -33 140 -94t94 -140q35 -81 35 -171t-35 -171q-33 -79 -94 -140zM702 459h-167q1 0 2 1l118 118q11 10 11 25t-10.5 25.5t-25.5 10.5t-26 -11l-92 -92l-93 93q-11 10 -26 10t-25.5 -10.5t-10.5 -25.5t11 -26l118 -118l2 -1 +h-166q-14 0 -24.5 -10.5t-10.5 -24.5v-3q0 -14 10 -24t25 -10h154v-64h-123q-13 0 -23 -10.5t-10 -24.5v-4q0 -14 9.5 -23.5t23.5 -9.5h123v-149q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v149h122q14 0 24.5 9.5t10.5 23.5v4q0 14 -10.5 24.5t-24.5 10.5h-122v64 +h154q14 0 24.5 9.5t10.5 23.5v4q0 14 -10.5 25t-24.5 11z" /> + <glyph glyph-name="poweroff" unicode="&#xe6d5;" +d="M512 512q15 0 25.5 10.5t10.5 25.5v312q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-312q0 -15 10.5 -25.5t25.5 -10.5zM512 -128q-104 0 -199 40q-92 39 -163 110t-110 163q-40 95 -40 199q0 123 55 231q53 105 147 177q12 9 27 7t24 -14t7 -27t-14 -24 +q-81 -61 -127 -151q-47 -94 -47 -199q0 -90 35 -171q33 -79 94 -140t140 -95q81 -34 171 -34t171 35q79 33 140 94t95 140q34 81 34 171q0 105 -47 199q-46 90 -127 151q-12 9 -14 24t7 27t24 14t27 -7q94 -72 147 -177q55 -109 55 -231q0 -104 -40 -200q-39 -91 -110 -162 +t-163 -110q-95 -40 -199 -40z" /> + <glyph glyph-name="trademark" unicode="&#xe651;" +d="M666.5 397q46.5 43 46.5 115q0 37 -14 69q-14 30 -39 51q-25 19 -59 27.5t-125 8.5h-113v-578h65v264h23l194 -264h82l-196 264q89 0 135.5 43zM516 420h-88v182h91q66 0 96 -22q31 -22 31 -69.5t-32 -69.5q-31 -22 -98 -21zM512 896q-139 0 -257 -68.5t-186.5 -186.5 +t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM512 -56q-182 0 -311 129t-129 311t129 311t311 129t311 -129t129 -311t-129 -311t-311 -129z" /> + <glyph glyph-name="find" unicode="&#xe6db;" +d="M521 512q-58 4 -99.5 -37.5t-37.5 -99.5l-98 -217l217 98q58 -4 99.5 37.5t37.5 99.5l98 217zM551.5 344.5q-16.5 -16.5 -39.5 -16.5t-39.5 16.5t-16.5 39.5t16.5 39.5t39.5 16.5t39.5 -16.5t16.5 -39.5t-16.5 -39.5zM512 896q-139 0 -257 -68.5t-186.5 -186.5 +t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM512 -56q-182 0 -311 129t-129 311t129 311t311 129t311 -129t129 -311t-129 -311t-311 -129z" /> + <glyph glyph-name="copyright" unicode="&#xe6de;" +d="M518 176q-79 0 -121 56q-42 53 -42 150q0 96 43 152q44 58 121 58q63 0 101 -29q38 -31 49 -91h80q-14 96 -74 142q-59 46 -156 46q-119 0 -185 -83q-62 -75 -62 -195q0 -121 62 -195q65 -79 184 -79q96 0 156 51q59 50 78 153h-81q-19 -136 -153 -136zM512 896 +q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM512 -56q-182 0 -311 129t-129 311t129 311t311 129t311 -129t129 -311t-129 -311t-311 -129z" /> + <glyph glyph-name="sound" unicode="&#xe6e9;" +d="M464 731l-233 -155h-166q-27 0 -46 -21t-19 -51v-240q0 -30 19 -51t46 -21h166l233 -155q23 -15 39.5 -5t16.5 40v624q0 30 -16.5 40t-39.5 -5zM448 134l-191 130h-185v240h185l191 127v-497zM640 232q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5 +q93 0 158.5 65.5t65.5 158.5t-65.5 158.5t-158.5 65.5q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5q63 0 107.5 -44.5t44.5 -107.5t-44.5 -107.5t-107.5 -44.5zM640 768q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5q129 0 220.5 -91.5t91.5 -220.5 +t-91.5 -220.5t-220.5 -91.5q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5z" /> + <glyph glyph-name="earth" unicode="&#xe6f1;" +d="M512 896q-139 0 -257 -68.5t-186.5 -186.5t-68.5 -257t68.5 -257t186.5 -186.5t257 -68.5t257 68.5t186.5 186.5t68.5 257t-68.5 257t-186.5 186.5t-257 68.5zM394 808q-46 -39 -80 -104q-31 16 -59 36h-2q65 47 141 68zM198 692q40 -31 87 -54q-35 -94 -41 -204h-169 +q17 150 123 258zM72 362h170q4 -126 43 -232q-46 -23 -87 -54q-56 56 -88.5 130t-37.5 156zM253 28h2q28 20 59 36q35 -65 80 -104q-76 21 -141 68zM481 -10q-59 19 -103 100q50 16 103 20v-120zM481 182q-67 -4 -132 -25q-32 92 -35 205h167v-180zM481 434h-165 +q6 97 33 177q64 -21 132 -25v-152v0zM481 658q-53 4 -103 20q44 82 103 100v-120zM949 434h-169q-6 110 -41 204q46 23 87 54q106 -108 123 -258zM771 740h-2q-28 -20 -59 -36q-35 65 -81 104q77 -21 142 -68zM553 774q53 -22 93 -96q-45 -15 -93 -19v115zM553 587 +q62 4 122 24q27 -80 33 -177h-155v153zM553 362h157q-3 -113 -35 -205q-59 19 -122 24v181zM553 -6v115q48 -4 93 -19q-40 -74 -93 -96zM630 -40q46 39 80 104q31 -16 59 -36h2q-65 -47 -141 -68zM826 76q-40 31 -87 54q39 106 43 232h169q-4 -82 -36.5 -156t-88.5 -130z +" /> + <glyph glyph-name="wifi" unicode="&#xe6d6;" +d="M964 576q-92 93 -212 140.5t-241 47.5t-240.5 -47.5t-212.5 -140.5q-10 -10 -10 -25t10.5 -25.5t25.5 -10.5t25 11q82 81 188 123.5t214 42.5t214 -42.5t188 -123.5q10 -11 25 -11t25.5 10.5t10.5 25.5t-10 25zM194 422q-10 -11 -10 -26t10.5 -25.5t25.5 -10.5t25 11 +q54 54 124.5 82t141.5 28t141.5 -28t124.5 -82q10 -11 25 -11t25.5 10.5t10.5 25.5t-10 26q-86 86 -201.5 116.5t-231 0t-201.5 -116.5zM693 258v0q-75 75 -181 75t-181 -75q-11 -11 -11 -26t10.5 -25.5t25.5 -10.5t26 11q54 54 130 54t130 -54v0l3 -3q10 -11 25 -11 +t25.5 11t10.5 25.5t-10 25.5q-3 2 -3 3zM512 54zM458 54q0 -22 16 -38t38 -16t38 16t16 38t-16 38t-38 16t-38 -16t-16 -38z" /> + <glyph glyph-name="sync" unicode="&#xe6da;" +d="M989 384q-15 1 -26 -8.5t-12 -24.5q-7 -83 -42.5 -157.5t-96.5 -131.5t-138.5 -87.5t-161.5 -30.5q-133 0 -243 73q-97 64 -149 167h100q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-184q-15 0 -25.5 -10.5t-10.5 -25.5v-184q0 -15 10.5 -25.5t25.5 -10.5 +t25.5 10.5t10.5 25.5v86q59 -100 157 -165q128 -85 283 -85q98 0 188 35.5t161 101.5t112.5 153t48.5 183q2 15 -8 26.5t-25 12.5zM988 768q-15 0 -25.5 -10.5t-10.5 -25.5v-86q-59 100 -157 165q-128 85 -283 85q-98 0 -188 -35.5t-161 -101.5t-112.5 -153t-49.5 -183 +q-1 -15 9 -26.5t25 -12.5h2q14 0 24.5 9.5t11.5 23.5q6 83 42 157.5t97 131.5t138.5 87.5t161.5 30.5q133 0 243 -73q97 -64 149 -167h-100q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h184q15 0 25.5 10.5t10.5 25.5v184q0 15 -10.5 25.5t-25.5 10.5z" /> + <glyph glyph-name="login" unicode="&#xe657;" +d="M443 274q-11 -11 -11 -26t10.5 -25.5t25.5 -10.5t26 11l136 135q10 11 10 26t-10 26l-136 135q-11 11 -26 11t-25.5 -10.5t-10.5 -25.5t11 -26l74 -74h-481q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h481zM984 583q-39 92 -110 163t-163 110q-95 40 -199 40 +q-123 0 -231 -55q-105 -53 -177 -147q-9 -12 -7 -27t14 -24t27 -7t24 14q61 81 151 127q94 47 199 47q90 0 171 -35q79 -33 140 -94t94 -140q35 -81 35 -171t-34 -171q-34 -79 -95 -140t-140 -94q-81 -35 -171 -35q-105 0 -199 47q-90 46 -151 127q-9 12 -24 14t-27 -7 +t-14 -24t7 -27q72 -94 177 -147q108 -55 231 -55q104 0 199 40q92 39 163 110t110 163q40 95 40 199t-40 199z" /> + <glyph glyph-name="logout" unicode="&#xe65a;" +d="M772 29q-116 -85 -260 -85q-90 0 -171 34q-79 34 -140 95t-94 140q-35 81 -35 171t34 171q34 79 95 140t140 94q81 35 171 35q144 0 260 -85q12 -9 26.5 -6.5t23.5 14.5t7 26.5t-14 23.5q-135 99 -303 99q-104 0 -199 -40q-92 -39 -163 -110t-110 -163q-40 -95 -40 -199 +t40 -199q39 -92 110 -163t163 -110q95 -40 199 -40q168 0 303 99q12 9 14 23.5t-6.5 26.5t-23.5 14.5t-27 -6.5zM1014 410l-136 135q-11 11 -26 11t-25.5 -10.5t-10.5 -25.5t11 -26l74 -74h-481q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h481l-74 -74 +q-11 -11 -11 -26t10.5 -25.5t25.5 -10.5t26 11l136 135q10 11 10 26t-10 26z" /> + <glyph glyph-name="reload1" unicode="&#xe616;" +d="M954 392q-2 15 -14.5 23.5t-27 6t-23 -14.5t-6.5 -27q5 -28 5 -60q0 -76 -28.5 -144.5t-81.5 -121.5t-122 -81.5t-144 -28.5t-144 28.5t-122 81.5t-81.5 122t-28.5 144t28.5 144t81.5 122t122 81.5t144 28.5h13l-82 -82q-11 -11 -11 -25.5t10.5 -25.5t25.5 -11t26 11 +l135 136q11 10 11 25t-11 26l-135 135q-11 11 -26 11t-25.5 -10.5t-10.5 -25.5t11 -25l66 -67q-89 -1 -171 -35q-81 -34 -143 -96t-96 -143q-35 -83 -35 -174t35 -174q34 -81 96 -143t143 -96q83 -35 174 -35t174 35q81 34 143 96t96 142q35 83 35 175q0 37 -6 72z" /> + <glyph glyph-name="message1" unicode="&#xe6ab;" +d="M292 471q-23 0 -39 -16t-16 -39t16 -39t39 -16t39 16t16 39t-16 39t-39 16zM732 471q-23 0 -39 -16t-16 -39t16 -39t39 -16t39 16t16 39t-16 39t-39 16zM512 471q-23 0 -39 -16t-16 -39t16 -39t39 -16t39 16t16 39t-16 39t-39 16zM983 604q-39 86 -110 153 +q-71 66 -163 102q-94 37 -198 37t-198 -37q-92 -36 -163 -102q-71 -67 -110 -153q-41 -90 -41 -187q0 -88 33 -169.5t94 -147.5l23 -196q3 -19 20 -28q7 -4 16 -4t18 5l148 84q78 -24 160 -24q103 0 198 37q92 37 163 103t110 152q41 89 41 188q0 97 -41 187zM918 259 +q-33 -73 -94 -130q-61 -56 -140 -87q-82 -33 -172 -33q-79 0 -152 25q-16 5 -30 -3l-115 -65l-18 155q-1 12 -10 21q-56 56 -85.5 127t-29.5 148q0 82 34 157q33 73 94 130t140 88q82 32 172 32t172 -32q79 -32 140 -88.5t94 -129.5q34 -75 34 -157.5t-34 -157.5z" /> + <glyph glyph-name="shake" unicode="&#xe94f;" +d="M760 896h-496q-30 0 -51 -21t-21 -51v-880q0 -30 21 -51t51 -21h464q33 0 68.5 22t35.5 50v880q0 30 -21 51t-51 21zM542 -64h-60q-15 0 -24.5 9.5t-9.5 22.5t9.5 22.5t24.5 9.5h60q15 0 24.5 -9.5t9.5 -22.5t-9.5 -22.5t-24.5 -9.5zM760 65h-496v704h496v-704zM80 870 +l-44 -10q-19 -12 -29 -33t-6 -44l127 -832l-75 853q-3 39 27 66zM130 886q-20 -11 -31.5 -31t-10.5 -44l54 -839v856q0 39 32 63zM988 860l-44 10q30 -26 27 -66l-75 -853l127 832q4 23 -6 44t-29 33zM936 812q1 23 -10.5 43t-31.5 31l-44 6q32 -25 32 -64v-856z" /> + <glyph glyph-name="API" unicode="&#xe951;" +d="M952 722l-183 106q-8 4 -16.5 4t-15.5 -4l-183 -106q-16 -9 -16 -27v-9l-10 6q-7 4 -15.5 4t-16.5 -4l-10 -6v9q0 18 -16 27l-183 106q-8 4 -16 4t-16 -4l-183 -106q-16 -9 -16 -27v-212q0 -18 16 -27l183 -106q8 -4 16 -4t16 4l10 6v-9q0 -18 16 -27l6 -4l-6 -4 +q-16 -9 -16 -27v-212q0 -18 16 -27l183 -106q8 -4 16 -4t16 4l183 106q16 9 16 27v212q0 18 -16 27l-6 4l6 4q16 9 16 27v9l10 -6q7 -4 15.5 -4t16.5 4l183 106q16 9 16 27v212q0 18 -16 27zM271 424l-143 82v166l143 82l143 -82v-28l-101 -58q-16 -9 -16 -27v-120zM414 591 +v-85l-71 -40v84zM655 261v-165l-143 -82l-143 82v165l23 13l104 -60q8 -4 16 -4t16 4l104 60zM438 301l74 43l74 -43l-74 -43zM681 355l-23 -13l-130 76q-8 4 -16 4t-16 -4l-130 -76l-23 13v28l127 73q16 9 16 27v150l26 15l26 -15v-150q0 -18 16 -27l127 -74v-27zM681 466 +l-71 40v86l71 -41v-85zM896 506l-143 -82l-26 15v120q0 18 -16 27l-101 58v28l143 82l143 -82v-166z" /> + <glyph glyph-name="appstore-o" unicode="&#xe695;" +d="M398 760v-262h-262v262h262zM398 832h-262q-30 0 -51 -21t-21 -51v-262q0 -30 21 -51t51 -21h262q30 0 51 21t21 51v262q0 30 -21 51t-51 21zM888 760v-262h-262v262h262zM888 832h-262q-30 0 -51 -21t-21 -51v-262q0 -30 21 -51t51 -21h262q30 0 51 21t21 51v262 +q0 30 -21 51t-51 21zM398 270v-262h-262v262h262zM398 342h-262q-30 0 -51 -21t-21 -51v-262q0 -30 21 -51t51 -21h262q30 0 51 21t21 51v262q0 30 -21 51t-51 21zM888 270v-262h-262v262h262zM888 342h-262q-30 0 -51 -21t-21 -51v-262q0 -30 21 -51t51 -21h262q30 0 51 21 +t21 51v262q0 30 -21 51t-51 21z" /> + <glyph glyph-name="appstore1" unicode="&#xe696;" +d="M398 832h-262q-30 0 -51 -21t-21 -51v-262q0 -30 21 -51t51 -21h262q30 0 51 21t21 51v262q0 30 -21 51t-51 21zM888 832h-262q-30 0 -51 -21t-21 -51v-262q0 -30 21 -51t51 -21h262q30 0 51 21t21 51v262q0 30 -21 51t-51 21zM398 342h-262q-30 0 -51 -21t-21 -51v-262 +q0 -30 21 -51t51 -21h262q30 0 51 21t21 51v262q0 30 -21 51t-51 21zM888 342h-262q-30 0 -51 -21t-21 -51v-262q0 -30 21 -51t51 -21h262q30 0 51 21t21 51v262q0 30 -21 51t-51 21z" /> + <glyph glyph-name="scan1" unicode="&#xe697;" +d="M768 200v368q0 30 -21 51t-51 21h-368q-30 0 -51 -21t-21 -51v-368q0 -30 21 -51t51 -21h368q30 0 51 21t21 51zM696 200h-368v368h368v-368zM100 572q15 0 25.5 10.5t10.5 25.5v152h152q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-152q-30 0 -51 -21t-21 -51 +v-152q0 -15 10.5 -25.5t25.5 -10.5zM288 8h-152v152q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-152q0 -30 21 -51t51 -21h152q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM888 832h-152q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h152v-152 +q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v152q0 30 -21 51t-51 21zM924 196q-15 0 -25.5 -10.5t-10.5 -25.5v-152h-152q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h152q30 0 51 21t21 51v152q0 15 -10.5 25.5t-25.5 10.5z" /> + <glyph glyph-name="exception1" unicode="&#xe665;" +d="M888 832h-753q-30 0 -51 -21t-21 -51v-752q0 -30 21 -51t51 -21h277q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-277v752h753v-752h-84q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h84q30 0 51 21t21 51v752q0 30 -21 51t-51 21zM640 -28 +q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5zM676 512q-15 0 -25.5 -10.5t-10.5 -25.5v-376q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v376q0 15 -10.5 25.5t-25.5 10.5zM540 640h-312q-15 0 -25.5 -10.5 +t-10.5 -25.5t10.5 -25.5t25.5 -10.5h312q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM412 448h-184q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h184q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM412 256h-184q-15 0 -25.5 -10.5t-10.5 -25.5 +t10.5 -25.5t25.5 -10.5h184q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5z" /> + <glyph glyph-name="contacts" unicode="&#xe6f0;" +d="M256 204q0 15 -10.5 25.5t-25.5 10.5h-120q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h120q15 0 25.5 10.5t10.5 25.5zM100 526h120q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-120q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5zM888 832 +h-688q-30 0 -51 -21t-21 -51v-56q0 -15 10.5 -25.5t25.5 -10.5t25.5 10.5t10.5 25.5v56h688v-752h-688v54v0v1v1q0 15 -10.5 25.5t-25.5 10.5t-25.5 -10.5t-10.5 -25.5v-2v0v-54q0 -30 21 -51t51 -21h688q30 0 51 21t21 51v752q0 30 -21 51t-51 21zM100 347h120 +q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-120q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5zM575.5 312q-67.5 0 -115.5 48t-48 116t48 116t115.5 48t116 -48t48.5 -116t-48.5 -116t-116 -48zM576 568q-38 0 -65 -27t-27 -65t27 -65t65 -27t65 27t27 65 +t-27 65t-65 27zM764 128q-13 0 -23 8t-12 21q-11 55 -54 91t-99.5 36t-99.5 -36t-54 -91q-2 -13 -12 -21t-23 -8q-3 0 -7 1q-14 2 -22.5 14.5t-5.5 27.5q15 80 78 132.5t145.5 52.5t145.5 -52.5t79 -132.5q2 -15 -6 -27.5t-23 -14.5q-3 -1 -7 -1z" /> + <glyph glyph-name="solution1" unicode="&#xe66f;" +d="M959 -21q-10 50 -41.5 88t-77.5 56q28 18 43.5 47t15.5 63q0 55 -38.5 93.5t-93 38.5t-93.5 -38.5t-39 -93.5q0 -33 16 -62.5t44 -47.5q-46 -18 -77.5 -56t-41.5 -88q-3 -14 5.5 -26.5t23.5 -15.5t27 5.5t15 23.5q8 43 42 71t78.5 28t78.5 -28t42 -71q3 -13 13 -21.5 +t22 -8.5q4 0 7 1q15 3 23.5 15.5t5.5 26.5zM767.5 293q24.5 0 42.5 -17.5t18 -42.5t-18 -42.5t-42.5 -17.5t-42 17.5t-17.5 42.5t17.5 42.5t42 17.5zM888 832h-752q-30 0 -51 -21t-21 -51v-752q0 -30 21 -51t51 -21h276q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5 +h-276v752h752v-340q0 -15 11 -25.5t25.5 -10.5t25 10.5t10.5 25.5v340q0 30 -21 51t-51 21zM228 568h312q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5h-312q-14 0 -25 -10.5t-11 -25.5t11 -25.5t25 -10.5zM412 448h-184q-14 0 -25 -10.5t-11 -25.5t11 -25.5t25 -10.5 +h184q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM412 256h-184q-14 0 -25 -10.5t-11 -25.5t11 -25.5t25 -10.5h184q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5z" /> + <glyph glyph-name="fork" unicode="&#xe6f2;" +d="M896 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5q0 -43 26 -77t66 -46v-127l-220 -221l-220 221v127q40 12 66 46t26 77q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5q0 -43 25.5 -77t66.5 -46v-157h-1l257 -257v-108q-40 -12 -66 -46t-26 -77 +q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5q0 43 -26 77t-66 46v109l256 256v0v157q40 12 66 46t26 77zM200 768q0 23 16.5 39.5t39.5 16.5t39.5 -16.5t16.5 -39.5t-16.5 -39.5t-39.5 -16.5t-39.5 16.5t-16.5 39.5zM568 0q0 -23 -16.5 -39.5t-39.5 -16.5t-39.5 16.5 +t-16.5 39.5t16.5 39.5t39.5 16.5t39.5 -16.5t16.5 -39.5zM768 712q-23 0 -39.5 16.5t-16.5 39.5t16.5 39.5t39.5 16.5t39.5 -16.5t16.5 -39.5t-16.5 -39.5t-39.5 -16.5z" /> + <glyph glyph-name="edit1" unicode="&#xe692;" +d="M924 8h-824q-15 0 -25.5 -10.5t-10.5 -25.5t10.5 -25.5t25.5 -10.5h824q15 0 25.5 10.5t10.5 25.5t-10.5 25.5t-25.5 10.5zM296 126l236 100q5 2 10 6l397 398q21 21 21 51t-21 51l-79 79q-21 21 -51 21t-51 -21l-397 -397q-5 -5 -7 -11l-100 -235q-8 -20 7 -35t35 -7z +M809 760v0l79 -79l-62 -62l-79 79zM417 368l279 279l79 -79l-279 -279l-137 -58z" /> + </font> +</defs></svg> diff --git a/cyclone-web/vendor/antd/font/font_zck90zmlh7hf47vi.ttf b/cyclone-web/vendor/antd/font/font_zck90zmlh7hf47vi.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1c0a2fc8d8b9a14a43ca932284c42c997d809d69 Binary files /dev/null and b/cyclone-web/vendor/antd/font/font_zck90zmlh7hf47vi.ttf differ diff --git a/cyclone-web/vendor/antd/font/font_zck90zmlh7hf47vi.woff b/cyclone-web/vendor/antd/font/font_zck90zmlh7hf47vi.woff new file mode 100644 index 0000000000000000000000000000000000000000..c9d2d8705eb74f98f41f14e02af543ea095ef769 Binary files /dev/null and b/cyclone-web/vendor/antd/font/font_zck90zmlh7hf47vi.woff differ diff --git a/cyclone-web/vendor/antd/font/font_zck90zmlh7hf47vi_iefix.eot b/cyclone-web/vendor/antd/font/font_zck90zmlh7hf47vi_iefix.eot new file mode 100644 index 0000000000000000000000000000000000000000..4e4424275fa4d0f2b3ea78aead863f420d47cdab Binary files /dev/null and b/cyclone-web/vendor/antd/font/font_zck90zmlh7hf47vi_iefix.eot differ diff --git a/cyclone-web/vendor/clipboard/clipboard.min.js b/cyclone-web/vendor/clipboard/clipboard.min.js new file mode 100644 index 0000000000000000000000000000000000000000..90fd15b1c06ab11571aceb625f76512bbc2b67ad --- /dev/null +++ b/cyclone-web/vendor/clipboard/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v1.7.1 + * https://zenorocha.github.io/clipboard.js + * + * Licensed MIT © Zeno Rocha + */ +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.Clipboard=t()}}(function(){var t,e,n;return function t(e,n,o){function i(a,c){if(!n[a]){if(!e[a]){var l="function"==typeof require&&require;if(!c&&l)return l(a,!0);if(r)return r(a,!0);var s=new Error("Cannot find module '"+a+"'");throw s.code="MODULE_NOT_FOUND",s}var u=n[a]={exports:{}};e[a][0].call(u.exports,function(t){var n=e[a][1][t];return i(n||t)},u,u.exports,t,e,n,o)}return n[a].exports}for(var r="function"==typeof require&&require,a=0;a<o.length;a++)i(o[a]);return i}({1:[function(t,e,n){function o(t,e){for(;t&&t.nodeType!==i;){if("function"==typeof t.matches&&t.matches(e))return t;t=t.parentNode}}var i=9;if("undefined"!=typeof Element&&!Element.prototype.matches){var r=Element.prototype;r.matches=r.matchesSelector||r.mozMatchesSelector||r.msMatchesSelector||r.oMatchesSelector||r.webkitMatchesSelector}e.exports=o},{}],2:[function(t,e,n){function o(t,e,n,o,r){var a=i.apply(this,arguments);return t.addEventListener(n,a,r),{destroy:function(){t.removeEventListener(n,a,r)}}}function i(t,e,n,o){return function(n){n.delegateTarget=r(n.target,e),n.delegateTarget&&o.call(t,n)}}var r=t("./closest");e.exports=o},{"./closest":1}],3:[function(t,e,n){n.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},n.nodeList=function(t){var e=Object.prototype.toString.call(t);return void 0!==t&&("[object NodeList]"===e||"[object HTMLCollection]"===e)&&"length"in t&&(0===t.length||n.node(t[0]))},n.string=function(t){return"string"==typeof t||t instanceof String},n.fn=function(t){return"[object Function]"===Object.prototype.toString.call(t)}},{}],4:[function(t,e,n){function o(t,e,n){if(!t&&!e&&!n)throw new Error("Missing required arguments");if(!c.string(e))throw new TypeError("Second argument must be a String");if(!c.fn(n))throw new TypeError("Third argument must be a Function");if(c.node(t))return i(t,e,n);if(c.nodeList(t))return r(t,e,n);if(c.string(t))return a(t,e,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function i(t,e,n){return t.addEventListener(e,n),{destroy:function(){t.removeEventListener(e,n)}}}function r(t,e,n){return Array.prototype.forEach.call(t,function(t){t.addEventListener(e,n)}),{destroy:function(){Array.prototype.forEach.call(t,function(t){t.removeEventListener(e,n)})}}}function a(t,e,n){return l(document.body,t,e,n)}var c=t("./is"),l=t("delegate");e.exports=o},{"./is":3,delegate:2}],5:[function(t,e,n){function o(t){var e;if("SELECT"===t.nodeName)t.focus(),e=t.value;else if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName){var n=t.hasAttribute("readonly");n||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),n||t.removeAttribute("readonly"),e=t.value}else{t.hasAttribute("contenteditable")&&t.focus();var o=window.getSelection(),i=document.createRange();i.selectNodeContents(t),o.removeAllRanges(),o.addRange(i),e=o.toString()}return e}e.exports=o},{}],6:[function(t,e,n){function o(){}o.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){function o(){i.off(t,o),e.apply(n,arguments)}var i=this;return o._=e,this.on(t,o,n)},emit:function(t){var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,i=n.length;for(o;o<i;o++)n[o].fn.apply(n[o].ctx,e);return this},off:function(t,e){var n=this.e||(this.e={}),o=n[t],i=[];if(o&&e)for(var r=0,a=o.length;r<a;r++)o[r].fn!==e&&o[r].fn._!==e&&i.push(o[r]);return i.length?n[t]=i:delete n[t],this}},e.exports=o},{}],7:[function(e,n,o){!function(i,r){if("function"==typeof t&&t.amd)t(["module","select"],r);else if(void 0!==o)r(n,e("select"));else{var a={exports:{}};r(a,i.select),i.clipboardAction=a.exports}}(this,function(t,e){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i=n(e),r="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},a=function(){function t(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}return function(e,n,o){return n&&t(e.prototype,n),o&&t(e,o),e}}(),c=function(){function t(e){o(this,t),this.resolveOptions(e),this.initSelection()}return a(t,[{key:"resolveOptions",value:function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.action=e.action,this.container=e.container,this.emitter=e.emitter,this.target=e.target,this.text=e.text,this.trigger=e.trigger,this.selectedText=""}},{key:"initSelection",value:function t(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function t(){var e=this,n="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return e.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[n?"right":"left"]="-9999px";var o=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=o+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=(0,i.default)(this.fakeElem),this.copyText()}},{key:"removeFake",value:function t(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function t(){this.selectedText=(0,i.default)(this.target),this.copyText()}},{key:"copyText",value:function t(){var e=void 0;try{e=document.execCommand(this.action)}catch(t){e=!1}this.handleResult(e)}},{key:"handleResult",value:function t(e){this.emitter.emit(e?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function t(){this.trigger&&this.trigger.focus(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function t(){this.removeFake()}},{key:"action",set:function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"copy";if(this._action=e,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function t(){return this._action}},{key:"target",set:function t(e){if(void 0!==e){if(!e||"object"!==(void 0===e?"undefined":r(e))||1!==e.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&e.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(e.hasAttribute("readonly")||e.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=e}},get:function t(){return this._target}}]),t}();t.exports=c})},{select:5}],8:[function(e,n,o){!function(i,r){if("function"==typeof t&&t.amd)t(["module","./clipboard-action","tiny-emitter","good-listener"],r);else if(void 0!==o)r(n,e("./clipboard-action"),e("tiny-emitter"),e("good-listener"));else{var a={exports:{}};r(a,i.clipboardAction,i.tinyEmitter,i.goodListener),i.clipboard=a.exports}}(this,function(t,e,n,o){"use strict";function i(t){return t&&t.__esModule?t:{default:t}}function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function a(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function c(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function l(t,e){var n="data-clipboard-"+t;if(e.hasAttribute(n))return e.getAttribute(n)}var s=i(e),u=i(n),f=i(o),d="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},h=function(){function t(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}return function(e,n,o){return n&&t(e.prototype,n),o&&t(e,o),e}}(),p=function(t){function e(t,n){r(this,e);var o=a(this,(e.__proto__||Object.getPrototypeOf(e)).call(this));return o.resolveOptions(n),o.listenClick(t),o}return c(e,t),h(e,[{key:"resolveOptions",value:function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText,this.container="object"===d(e.container)?e.container:document.body}},{key:"listenClick",value:function t(e){var n=this;this.listener=(0,f.default)(e,"click",function(t){return n.onClick(t)})}},{key:"onClick",value:function t(e){var n=e.delegateTarget||e.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new s.default({action:this.action(n),target:this.target(n),text:this.text(n),container:this.container,trigger:n,emitter:this})}},{key:"defaultAction",value:function t(e){return l("action",e)}},{key:"defaultTarget",value:function t(e){var n=l("target",e);if(n)return document.querySelector(n)}},{key:"defaultText",value:function t(e){return l("text",e)}},{key:"destroy",value:function t(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],n="string"==typeof e?[e]:e,o=!!document.queryCommandSupported;return n.forEach(function(t){o=o&&!!document.queryCommandSupported(t)}),o}}]),e}(u.default);t.exports=p})},{"./clipboard-action":7,"good-listener":4,"tiny-emitter":6}]},{},[8])(8)}); \ No newline at end of file diff --git a/cyclone-web/vendor/codeMirror/base16-light.css b/cyclone-web/vendor/codeMirror/base16-light.css new file mode 100644 index 0000000000000000000000000000000000000000..8e23ef81849fc6b1a2112929d9cfc19ee1e0c005 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/base16-light.css @@ -0,0 +1,42 @@ +/* + + Name: Base16 Default Light + Author: Chris Kempson (http://chriskempson.com) + + CodeMirror template by Jan T. Sott (https://github.com/idleberg/base16-codemirror) + Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) + +*/ + +.cm-s-base16-light.CodeMirror { background: #f5f5f5; color: #202020; } +.cm-s-base16-light div.CodeMirror-selected { background: #e0e0e0; } +.cm-s-base16-light .CodeMirror-line::selection, .cm-s-base16-light .CodeMirror-line > span::selection, .cm-s-base16-light .CodeMirror-line > span > span::selection { background: #e0e0e0; } +.cm-s-base16-light .CodeMirror-line::-moz-selection, .cm-s-base16-light .CodeMirror-line > span::-moz-selection, .cm-s-base16-light .CodeMirror-line > span > span::-moz-selection { background: #e0e0e0; } +.cm-s-base16-light .CodeMirror-gutters { background: #f5f5f5; border-right: 0px; } +.cm-s-base16-light .CodeMirror-guttermarker { color: #ac4142; } +.cm-s-base16-light .CodeMirror-guttermarker-subtle { color: #b0b0b0; } +.cm-s-base16-light .CodeMirror-linenumber { color: #b0b0b0; } +.cm-s-base16-light .CodeMirror-cursor { border-left: 1px solid #505050; } + +.cm-s-base16-light span.cm-comment { color: #8f5536; } +.cm-s-base16-light span.cm-atom { color: #aa759f; } +.cm-s-base16-light span.cm-number { color: #aa759f; } + +.cm-s-base16-light span.cm-property, .cm-s-base16-light span.cm-attribute { color: #90a959; } +.cm-s-base16-light span.cm-keyword { color: #ac4142; } +.cm-s-base16-light span.cm-string { color: #f4bf75; } + +.cm-s-base16-light span.cm-variable { color: #90a959; } +.cm-s-base16-light span.cm-variable-2 { color: #6a9fb5; } +.cm-s-base16-light span.cm-def { color: #d28445; } +.cm-s-base16-light span.cm-bracket { color: #202020; } +.cm-s-base16-light span.cm-tag { color: #ac4142; } +.cm-s-base16-light span.cm-link { color: #aa759f; } +.cm-s-base16-light span.cm-error { background: #ac4142; color: #505050; } + +.cm-s-base16-light .CodeMirror-activeline-background { background: #DDDCDC; } +.cm-s-base16-light .CodeMirror-matchingbracket { text-decoration: underline; color: white !important; } + +.CodeMirror-gutter-wrapper {left: -36px !important;} +.CodeMirror-code div {height: 18px !important;line-height: 18px !important;} +.CodeMirror-gutters {left:0 !important;} diff --git a/cyclone-web/vendor/codeMirror/codemirror.css b/cyclone-web/vendor/codeMirror/codemirror.css new file mode 100644 index 0000000000000000000000000000000000000000..c7a8ae70478fc8f253524bb64c0094766f191c1b --- /dev/null +++ b/cyclone-web/vendor/codeMirror/codemirror.css @@ -0,0 +1,346 @@ +/* BASICS */ + +.CodeMirror { + /* Set height, width, borders, and global font properties here */ + font-family: monospace; + height: 300px; + color: black; + direction: ltr; +} + +/* PADDING */ + +.CodeMirror-lines { + padding: 4px 0; /* Vertical padding around content */ +} +.CodeMirror pre { + padding: 0 4px; /* Horizontal padding of content */ +} + +.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { + background-color: white; /* The little square between H and V scrollbars */ +} + +/* GUTTER */ + +.CodeMirror-gutters { + border-right: 1px solid #ddd; + background-color: #f7f7f7; + white-space: nowrap; +} +.CodeMirror-linenumbers {} +.CodeMirror-linenumber { + padding: 0 3px 0 5px; + min-width: 20px; + text-align: right; + color: #999; + white-space: nowrap; +} + +.CodeMirror-guttermarker { color: black; } +.CodeMirror-guttermarker-subtle { color: #999; } + +/* CURSOR */ + +.CodeMirror-cursor { + border-left: 1px solid black; + border-right: none; + width: 0; +} +/* Shown when moving in bi-directional text */ +.CodeMirror div.CodeMirror-secondarycursor { + border-left: 1px solid silver; +} +.cm-fat-cursor .CodeMirror-cursor { + width: auto; + border: 0 !important; + background: #7e7; +} +.cm-fat-cursor div.CodeMirror-cursors { + z-index: 1; +} +.cm-fat-cursor-mark { + background-color: rgba(20, 255, 20, 0.5); + -webkit-animation: blink 1.06s steps(1) infinite; + -moz-animation: blink 1.06s steps(1) infinite; + animation: blink 1.06s steps(1) infinite; +} +.cm-animate-fat-cursor { + width: auto; + border: 0; + -webkit-animation: blink 1.06s steps(1) infinite; + -moz-animation: blink 1.06s steps(1) infinite; + animation: blink 1.06s steps(1) infinite; + background-color: #7e7; +} +@-moz-keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} +@-webkit-keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} +@keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} + +/* Can style cursor different in overwrite (non-insert) mode */ +.CodeMirror-overwrite .CodeMirror-cursor {} + +.cm-tab { display: inline-block; text-decoration: inherit; } + +.CodeMirror-rulers { + position: absolute; + left: 0; right: 0; top: -50px; bottom: -20px; + overflow: hidden; +} +.CodeMirror-ruler { + border-left: 1px solid #ccc; + top: 0; bottom: 0; + position: absolute; +} + +/* DEFAULT THEME */ + +.cm-s-default .cm-header {color: blue;} +.cm-s-default .cm-quote {color: #090;} +.cm-negative {color: #d44;} +.cm-positive {color: #292;} +.cm-header, .cm-strong {font-weight: bold;} +.cm-em {font-style: italic;} +.cm-link {text-decoration: underline;} +.cm-strikethrough {text-decoration: line-through;} + +.cm-s-default .cm-keyword {color: #708;} +.cm-s-default .cm-atom {color: #219;} +.cm-s-default .cm-number {color: #164;} +.cm-s-default .cm-def {color: #00f;} +.cm-s-default .cm-variable, +.cm-s-default .cm-punctuation, +.cm-s-default .cm-property, +.cm-s-default .cm-operator {} +.cm-s-default .cm-variable-2 {color: #05a;} +.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;} +.cm-s-default .cm-comment {color: #a50;} +.cm-s-default .cm-string {color: #a11;} +.cm-s-default .cm-string-2 {color: #f50;} +.cm-s-default .cm-meta {color: #555;} +.cm-s-default .cm-qualifier {color: #555;} +.cm-s-default .cm-builtin {color: #30a;} +.cm-s-default .cm-bracket {color: #997;} +.cm-s-default .cm-tag {color: #170;} +.cm-s-default .cm-attribute {color: #00c;} +.cm-s-default .cm-hr {color: #999;} +.cm-s-default .cm-link {color: #00c;} + +.cm-s-default .cm-error {color: #f00;} +.cm-invalidchar {color: #f00;} + +.CodeMirror-composing { border-bottom: 2px solid; } + +/* Default styles for common addons */ + +div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;} +div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;} +.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); } +.CodeMirror-activeline-background {background: #e8f2ff;} + +/* STOP */ + +/* The rest of this file contains styles related to the mechanics of + the editor. You probably shouldn't touch them. */ + +.CodeMirror { + position: relative; + overflow: hidden; + background: white; +} + +.CodeMirror-scroll { + overflow: scroll !important; /* Things will break if this is overridden */ + /* 30px is the magic margin used to hide the element's real scrollbars */ + /* See overflow: hidden in .CodeMirror */ + margin-bottom: -30px; margin-right: -30px; + padding-bottom: 30px; + height: 100%; + outline: none; /* Prevent dragging from highlighting the element */ + position: relative; +} +.CodeMirror-sizer { + position: relative; + border-right: 30px solid transparent; +} + +/* The fake, visible scrollbars. Used to force redraw during scrolling + before actual scrolling happens, thus preventing shaking and + flickering artifacts. */ +.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { + position: absolute; + z-index: 6; + display: none; +} +.CodeMirror-vscrollbar { + right: 0; top: 0; + overflow-x: hidden; + overflow-y: scroll; +} +.CodeMirror-hscrollbar { + bottom: 0; left: 0; + overflow-y: hidden; + overflow-x: scroll; +} +.CodeMirror-scrollbar-filler { + right: 0; bottom: 0; +} +.CodeMirror-gutter-filler { + left: 0; bottom: 0; +} + +.CodeMirror-gutters { + position: absolute; left: 0; top: 0; + min-height: 100%; + z-index: 3; +} +.CodeMirror-gutter { + white-space: normal; + height: 100%; + display: inline-block; + vertical-align: top; + margin-bottom: -30px; +} +.CodeMirror-gutter-wrapper { + position: absolute; + z-index: 4; + background: none !important; + border: none !important; +} +.CodeMirror-gutter-background { + position: absolute; + top: 0; bottom: 0; + z-index: 4; +} +.CodeMirror-gutter-elt { + position: absolute; + cursor: default; + z-index: 4; +} +.CodeMirror-gutter-wrapper ::selection { background-color: transparent } +.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent } + +.CodeMirror-lines { + cursor: text; + min-height: 1px; /* prevents collapsing before first draw */ +} +.CodeMirror pre { + /* Reset some styles that the rest of the page might have set */ + -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; + border-width: 0; + background: transparent; + font-family: inherit; + font-size: inherit; + margin: 0; + white-space: pre; + word-wrap: normal; + line-height: inherit; + color: inherit; + z-index: 2; + position: relative; + overflow: visible; + -webkit-tap-highlight-color: transparent; + -webkit-font-variant-ligatures: contextual; + font-variant-ligatures: contextual; +} +.CodeMirror-wrap pre { + word-wrap: break-word; + white-space: pre-wrap; + word-break: normal; +} + +.CodeMirror-linebackground { + position: absolute; + left: 0; right: 0; top: 0; bottom: 0; + z-index: 0; +} + +.CodeMirror-linewidget { + position: relative; + z-index: 2; + padding: 0.1px; /* Force widget margins to stay inside of the container */ +} + +.CodeMirror-widget {} + +.CodeMirror-rtl pre { direction: rtl; } + +.CodeMirror-code { + outline: none; +} + +/* Force content-box sizing for the elements where we expect it */ +.CodeMirror-scroll, +.CodeMirror-sizer, +.CodeMirror-gutter, +.CodeMirror-gutters, +.CodeMirror-linenumber { + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +.CodeMirror-measure { + position: absolute; + width: 100%; + height: 0; + overflow: hidden; + visibility: hidden; +} + +.CodeMirror-cursor { + position: absolute; + pointer-events: none; +} +.CodeMirror-measure pre { position: static; } + +div.CodeMirror-cursors { + visibility: hidden; + position: relative; + z-index: 3; +} +div.CodeMirror-dragcursors { + visibility: visible; +} + +.CodeMirror-focused div.CodeMirror-cursors { + visibility: visible; +} + +.CodeMirror-selected { background: #d9d9d9; } +.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; } +.CodeMirror-crosshair { cursor: crosshair; } +.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; } +.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; } + +.cm-searching { + background-color: #ffa; + background-color: rgba(255, 255, 0, .4); +} + +/* Used to force a border model for a node */ +.cm-force-border { padding-right: .1px; } + +@media print { + /* Hide the cursor when printing */ + .CodeMirror div.CodeMirror-cursors { + visibility: hidden; + } +} + +/* See issue #2901 */ +.cm-tab-wrap-hack:after { content: ''; } + +/* Help users use markselection to safely style text background */ +span.CodeMirror-selectedtext { background: none; } diff --git a/cyclone-web/vendor/codeMirror/codemirror.js b/cyclone-web/vendor/codeMirror/codemirror.js new file mode 100644 index 0000000000000000000000000000000000000000..c5a9da5f8d00108a16aa681498df5e8bcf64ede5 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/codemirror.js @@ -0,0 +1,9725 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// This is CodeMirror (https://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}, sel_mouse = {origin: "*mouse"}, 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`. Supports `from` being greater than `to`. + function findFirst(pred, from, to) { + // At any point we are certain `to` satisfies `pred`, don't know + // whether `from` does. + var dir = from > to ? -1 : 1; + for (;;) { + if (from == to) { return from } + var midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF); + if (mid == from) { return pred(mid) ? from : to } + if (pred(mid)) { to = mid; } + else { from = mid + dir; } + } + } + + // 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, 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) } + + function collapsedSpanAround(line, ch) { + var sps = sawCollapsedSpans && line.markedSpans, found; + if (sps) { for (var i = 0; i < sps.length; ++i) { + var sp = sps[i]; + if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) && + (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { found = sp.marker; } + } } + return found + } + + // 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", 0) } + 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", i); + 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 (direction == "ltr") { + 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 + } + + // 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 = {}, 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) + }; + StringStream.prototype.baseToken = function () { + var oracle = this.lineOracle; + return oracle && oracle.baseToken(this.pos) + }; + + 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; + this.baseTokens = null; + this.baseTokenPos = 1; + }; + + 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.baseToken = function (n) { + var this$1 = this; + + if (!this.baseTokens) { return null } + while (this.baseTokens[this.baseTokenPos] <= n) + { this$1.baseTokenPos += 2; } + var type = this.baseTokens[this.baseTokenPos + 1]; + return {type: type && type.replace(/( |^)overlay .*/, ""), + size: this.baseTokens[this.baseTokenPos] - n} + }; + + 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 ) { + context.baseTokens = st; + 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); + context.state = state; + context.baseTokens = null; + context.baseTokenPos = 1; + }; + + for (var o = 0; o < cm.state.overlays.length; ++o) loop( o ); + + 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 = {}, 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: 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, css, attributes) { + 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 (attributes) { + for (var attr in attributes) { if (attributes.hasOwnProperty(attr) && attr != "style" && attr != "class") + { token.setAttribute(attr, attributes[attr]); } } + } + return builder.content.appendChild(token) + } + builder.content.appendChild(content); + } + + // Change some spaces to NBSP to prevent the browser from collapsing + // trailing spaces at the end of a line when rendering text (issue #1362). + 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, css, attributes) { + 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, css, attributes) } + inner(builder, text.slice(0, part.to - start), style, startStyle, null, css, attributes); + 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, collapsed, attributes; + for (;;) { + if (nextChange == pos) { // Update current marker set + spanStyle = spanEndStyle = spanStartStyle = css = ""; + attributes = null; + 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); } + // support for the old title property + // https://github.com/codemirror/CodeMirror/pull/5673 + if (m.title) { (attributes || (attributes = {})).title = m.title; } + if (m.attributes) { + for (var attr in m.attributes) + { (attributes || (attributes = {}))[attr] = m.attributes[attr]; } + } + 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 : "", css, attributes); + } + 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 + } + + function widgetTopHeight(lineObj) { + var height = 0; + if (lineObj.widgets) { for (var i = 0; i < lineObj.widgets.length; ++i) { if (lineObj.widgets[i].above) + { height += widgetHeight(lineObj.widgets[i]); } } } + return height + } + + // 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) { + var height = widgetTopHeight(lineObj); + rect.top += height; rect.bottom += height; + } + 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 == 1; + 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 collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 ? 1 : 0)); + if (!collapsed) { return found } + var rangeEnd = collapsed.find(1); + if (rangeEnd.line == lineN) { return rangeEnd } + lineObj = getLine(doc, lineN = rangeEnd.line); + } + } + + function wrappedLineExtent(cm, lineObj, preparedMeasure, y) { + y -= widgetTopHeight(lineObj); + var end = lineObj.text.length; + var begin = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; }, end, 0); + end = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch).top > y; }, begin, end); + return {begin: begin, end: end} + } + + function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) { + if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); } + var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), "line").top; + return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop) + } + + // Returns true if the given side of a box is after the given + // coordinates, in top-to-bottom, left-to-right order. + function boxIsAfter(box, x, y, left) { + return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x + } + + function coordsCharInner(cm, lineObj, lineNo$$1, x, y) { + // Move y into line-local coordinate space + y -= heightAtLine(lineObj); + var preparedMeasure = prepareMeasureForLine(cm, lineObj); + // When directly calling `measureCharPrepared`, we have to adjust + // for the widgets at this line. + var widgetHeight$$1 = widgetTopHeight(lineObj); + var begin = 0, end = lineObj.text.length, ltr = true; + + var order = getOrder(lineObj, cm.doc.direction); + // If the line isn't plain left-to-right text, first figure out + // which bidi section the coordinates fall into. + if (order) { + var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart) + (cm, lineObj, lineNo$$1, preparedMeasure, order, x, y); + ltr = part.level != 1; + // The awkward -1 offsets are needed because findFirst (called + // on these below) will treat its first bound as inclusive, + // second as exclusive, but we want to actually address the + // characters in the part's range + begin = ltr ? part.from : part.to - 1; + end = ltr ? part.to : part.from - 1; + } + + // A binary search to find the first character whose bounding box + // starts after the coordinates. If we run across any whose box wrap + // the coordinates, store that. + var chAround = null, boxAround = null; + var ch = findFirst(function (ch) { + var box = measureCharPrepared(cm, preparedMeasure, ch); + box.top += widgetHeight$$1; box.bottom += widgetHeight$$1; + if (!boxIsAfter(box, x, y, false)) { return false } + if (box.top <= y && box.left <= x) { + chAround = ch; + boxAround = box; + } + return true + }, begin, end); + + var baseX, sticky, outside = false; + // If a box around the coordinates was found, use that + if (boxAround) { + // Distinguish coordinates nearer to the left or right side of the box + var atLeft = x - boxAround.left < boxAround.right - x, atStart = atLeft == ltr; + ch = chAround + (atStart ? 0 : 1); + sticky = atStart ? "after" : "before"; + baseX = atLeft ? boxAround.left : boxAround.right; + } else { + // (Adjust for extended bound, if necessary.) + if (!ltr && (ch == end || ch == begin)) { ch++; } + // To determine which side to associate with, get the box to the + // left of the character and compare it's vertical position to the + // coordinates + sticky = ch == 0 ? "after" : ch == lineObj.text.length ? "before" : + (measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight$$1 <= y) == ltr ? + "after" : "before"; + // Now get accurate coordinates for this place, in order to get a + // base X position + var coords = cursorCoords(cm, Pos(lineNo$$1, ch, sticky), "line", lineObj, preparedMeasure); + baseX = coords.left; + outside = y < coords.top || y >= coords.bottom; + } + + ch = skipExtendingChars(lineObj.text, ch, 1); + return PosWithInfo(lineNo$$1, ch, sticky, outside, x - baseX) + } + + function coordsBidiPart(cm, lineObj, lineNo$$1, preparedMeasure, order, x, y) { + // Bidi parts are sorted left-to-right, and in a non-line-wrapping + // situation, we can take this ordering to correspond to the visual + // ordering. This finds the first part whose end is after the given + // coordinates. + var index = findFirst(function (i) { + var part = order[i], ltr = part.level != 1; + return boxIsAfter(cursorCoords(cm, Pos(lineNo$$1, ltr ? part.to : part.from, ltr ? "before" : "after"), + "line", lineObj, preparedMeasure), x, y, true) + }, 0, order.length - 1); + var part = order[index]; + // If this isn't the first part, the part's start is also after + // the coordinates, and the coordinates aren't on the same line as + // that start, move one part back. + if (index > 0) { + var ltr = part.level != 1; + var start = cursorCoords(cm, Pos(lineNo$$1, ltr ? part.from : part.to, ltr ? "after" : "before"), + "line", lineObj, preparedMeasure); + if (boxIsAfter(start, x, y, true) && start.top > y) + { part = order[index - 1]; } + } + return part + } + + function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) { + // In a wrapped line, rtl text on wrapping boundaries can do things + // that don't correspond to the ordering in our `order` array at + // all, so a binary search doesn't work, and we want to return a + // part that only spans one line so that the binary search in + // coordsCharInner is safe. As such, we first find the extent of the + // wrapped line, and then do a flat search in which we discard any + // spans that aren't on the line. + var ref = wrappedLineExtent(cm, lineObj, preparedMeasure, y); + var begin = ref.begin; + var end = ref.end; + if (/\s/.test(lineObj.text.charAt(end - 1))) { end--; } + var part = null, closestDist = null; + for (var i = 0; i < order.length; i++) { + var p = order[i]; + if (p.from >= end || p.to <= begin) { continue } + var ltr = p.level != 1; + var endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right; + // Weigh against spans ending before this, so that they are only + // picked if nothing ends after + var dist = endX < x ? x - endX + 1e9 : endX - x; + if (!part || closestDist > dist) { + part = p; + closestDist = dist; + } + } + if (!part) { part = order[order.length - 1]; } + // Clip the part to the wrapped line. + if (part.from < begin) { part = {from: begin, to: part.to, level: part.level}; } + if (part.to > end) { part = {from: part.from, to: end, level: part.level}; } + return part + } + + 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) { + if ( primary === void 0 ) primary = true; + + 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 && 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"; + } + } + + function cmpCoords(a, b) { return a.top - b.top || a.left - b.left } + + // 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; + var docLTR = doc.direction == "ltr"; + + 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) + } + + function wrapX(pos, dir, side) { + var extent = wrappedLineExtentChar(cm, lineObj, null, pos); + var prop = (dir == "ltr") == (side == "after") ? "left" : "right"; + var ch = side == "after" ? extent.begin : extent.end - (/\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1); + return coords(ch, prop)[prop] + } + + var order = getOrder(lineObj, doc.direction); + iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i) { + var ltr = dir == "ltr"; + var fromPos = coords(from, ltr ? "left" : "right"); + var toPos = coords(to - 1, ltr ? "right" : "left"); + + var openStart = fromArg == null && from == 0, openEnd = toArg == null && to == lineLen; + var first = i == 0, last = !order || i == order.length - 1; + if (toPos.top - fromPos.top <= 3) { // Single line + var openLeft = (docLTR ? openStart : openEnd) && first; + var openRight = (docLTR ? openEnd : openStart) && last; + var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left; + var right = openRight ? rightSide : (ltr ? toPos : fromPos).right; + add(left, fromPos.top, right - left, fromPos.bottom); + } else { // Multiple lines + var topLeft, topRight, botLeft, botRight; + if (ltr) { + topLeft = docLTR && openStart && first ? leftSide : fromPos.left; + topRight = docLTR ? rightSide : wrapX(from, dir, "before"); + botLeft = docLTR ? leftSide : wrapX(to, dir, "after"); + botRight = docLTR && openEnd && last ? rightSide : toPos.right; + } else { + topLeft = !docLTR ? leftSide : wrapX(from, dir, "before"); + topRight = !docLTR && openStart && first ? rightSide : fromPos.right; + botLeft = !docLTR && openEnd && last ? leftSide : toPos.left; + botRight = !docLTR ? rightSide : wrapX(to, dir, "after"); + } + add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom); + if (fromPos.bottom < toPos.top) { add(leftSide, fromPos.bottom, null, toPos.top); } + add(botLeft, toPos.top, botRight - botLeft, toPos.bottom); + } + + if (!start || cmpCoords(fromPos, start) < 0) { start = fromPos; } + if (cmpCoords(toPos, start) < 0) { start = toPos; } + if (!end || cmpCoords(fromPos, end) < 0) { end = fromPos; } + if (cmpCoords(toPos, end) < 0) { end = toPos; } + }); + 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], wrapping = cm.options.lineWrapping; + var height = (void 0), width = 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; + // Check that lines don't extend past the right of the current + // editor width + if (!wrapping && cur.text.firstChild) + { width = cur.text.firstChild.getBoundingClientRect().right - box.left - 1; } + } + 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]); } } + } + if (width > cm.display.sizerWidth) { + var chWidth = Math.ceil(width / charWidth(cm.display)); + if (chWidth > cm.display.maxLineLength) { + cm.display.maxLineLength = chWidth; + cm.display.maxLine = cur.line; + cm.display.maxLineChanged = true; + } + } + } + } + + // 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) { + var w = line.widgets[i], parent = w.node.parentNode; + if (parent) { w.height = parent.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"); + vert.tabIndex = horiz.tabIndex = -1; + 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; + if (op) { 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(); } + } + + 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(); + 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, 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(cm, ranges, primIndex) { + var mayTouch = cm && cm.options.selectionsMayTouch; + 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]; + var diff = cmp(prev.to(), cur.from()); + if (mayTouch && !cur.empty() ? diff > 0 : diff >= 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(doc.cm, 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) == "+" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500)) || + 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(doc.cm, 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(doc.cm, 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(doc.cm, 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(doc.cm, 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, origin: change.origin}); } + } 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) { + var suppress = doc.cm && doc.cm.state.suppressEdits; + if (suppress && !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 if (suppress) { + source.push(event); + return + } 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) { + var assign; + + if (!to) { to = from; } + if (cmp(to, from) < 0) { (assign = [to, from], from = assign[0], to = assign[1]); } + 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() { return this.lines.length }, + + // Remove the n lines at offset 'at'. + removeInner: function(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(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(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(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() { return this.size }, + + removeInner: function(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(lines) { + var this$1 = this; + + for (var i = 0; i < this.children.length; ++i) { this$1.children[i].collapse(lines); } + }, + + insertInner: function(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() { + 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(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 } + if (!lineIsHidden(this.doc, line)) { 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 + }); + if (cm) { 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.startStyle || marker.endStyle || marker.css || + marker.attributes || marker.title) + { 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(this.cm, 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(this.cm, 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) { 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"), editors = []; + for (var i = 0; i < byClass.length; i++) { + var cm = byClass[i].CodeMirror; + if (cm) { editors.push(cm); } + } + if (editors.length) { editors[0].operation(function () { + for (var i = 0; i < editors.length; i++) { f(editors[i]); } + }); } + } + + 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; + // Might be a text scaling operation, clear size caches. + d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; + d.scrollbarsClipped = false; + cm.setSize(); + } + + var keyNames = { + 3: "Pause", 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", 145: "ScrollLock", + 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 } + // Ctrl-ScrollLock has keyCode 3, same as Ctrl-Pause, + // so we'll use event.code when available (Chrome 48+, FF 38+, Safari 10.1+) + if (event.keyCode == 3 && event.code) { name = event.code; } + 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); + }); + } + + 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 || cm.doc.direction == "rtl") { + 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 + } + + // 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.cursorCoords(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.cursorCoords(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.cursorCoords(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" } + if (/\'$/.test(name)) + { cm.state.keySeq = null; } + else + { stopSeq.set(50, function () { + if (cm.state.keySeq == seq) { + cm.state.keySeq = null; + cm.display.input.reset(); + } + }); } + if (dispatchKeyInner(cm, seq + " " + name, e, handle)) { return true } + } + return dispatchKeyInner(cm, name, e, handle) + } + + function dispatchKeyInner(cm, name, e, handle) { + 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); + } + + 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, 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) { cm.display.input.onContextMenu(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(display.wrapper.ownerDocument, "mouseup", dragEnd); + off(display.wrapper.ownerDocument, "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 () {display.wrapper.ownerDocument.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(display.wrapper.ownerDocument, "mouseup", dragEnd); + on(display.wrapper.ownerDocument, "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(cm, ranges.concat([ourRange]), ourIndex), + {scroll: false, origin: "*mouse"}); + } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == "char" && !behavior.extend) { + setSelection(doc, normalizeSelection(cm, 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(cm, 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] = bidiSimplify(cm, new Range(clipPos(doc, anchor), head)); + setSelection(doc, normalizeSelection(cm, 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(display.wrapper.ownerDocument, "mousemove", move); + off(display.wrapper.ownerDocument, "mouseup", up); + doc.history.lastSelOrigin = null; + } + + var move = operation(cm, function (e) { + if (e.buttons === 0 || !e_button(e)) { done(e); } + else { extend(e); } + }); + var up = operation(cm, done); + cm.state.selectingText = up; + on(display.wrapper.ownerDocument, "mousemove", move); + on(display.wrapper.ownerDocument, "mouseup", up); + } + + // Used when mouse-selecting to adjust the anchor to the proper side + // of a bidi jump depending on the visual position of the head. + function bidiSimplify(cm, range$$1) { + var anchor = range$$1.anchor; + var head = range$$1.head; + var anchorLine = getLine(cm.doc, anchor.line); + if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) { return range$$1 } + var order = getOrder(anchorLine); + if (!order) { return range$$1 } + var index = getBidiPartAt(order, anchor.ch, anchor.sticky), part = order[index]; + if (part.from != anchor.ch && part.to != anchor.ch) { return range$$1 } + var boundary = index + ((part.from == anchor.ch) == (part.level != 1) ? 0 : 1); + if (boundary == 0 || boundary == order.length) { return range$$1 } + + // Compute the relative visual position of the head compared to the + // anchor (<0 is to the left, >0 to the right) + var leftSide; + if (head.line != anchor.line) { + leftSide = (head.line - anchor.line) * (cm.doc.direction == "ltr" ? 1 : -1) > 0; + } else { + var headIndex = getBidiPartAt(order, head.ch, head.sticky); + var dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1); + if (headIndex == boundary - 1 || headIndex == boundary) + { leftSide = dir < 0; } + else + { leftSide = dir > 0; } + } + + var usePart = order[boundary + (leftSide ? -1 : 0)]; + var from = leftSide == (usePart.level == 1); + var ch = from ? usePart.from : usePart.to, sticky = from ? "after" : "before"; + return anchor.ch == ch && anchor.sticky == sticky ? range$$1 : new Range(new Pos(anchor.line, ch, sticky), head) + } + + + // 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; + if (e.touches) { + mX = e.touches[0].clientX; + mY = e.touches[0].clientY; + } else { + 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 } + if (!captureRightClick) { 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("selectionsMayTouch", false); + + 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); + option("phrases", null); + } + + 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(place, options) { + var this$1 = this; + + if (!(this instanceof CodeMirror)) { return new CodeMirror(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); } + else if (options.mode) { doc.modeOption = options.mode; } + this.doc = doc; + + var input = new CodeMirror.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.defaults = defaults; + // Functions to run when options are changed. + CodeMirror.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. + 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) && !clickInGutter(cm, 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.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 pasting 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 (paste && 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. + + function addEditorMethods(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)}, + startOperation: function(){return startOperation(this)}, + endOperation: function(){return endOperation(this)}, + + 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 + }), + + phrase: function(phraseText) { + var phrases = this.options.phrases; + return phrases && Object.prototype.hasOwnProperty.call(phrases, phraseText) ? phrases[phraseText] : phraseText + }, + + 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.getSelection = function () { + return this.cm.display.wrapper.ownerDocument.getSelection() + }; + + ContentEditableInput.prototype.showPrimarySelection = function () { + var sel = this.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 = this.getSelection(); + this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset; + this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset; + }; + + ContentEditableInput.prototype.selectionInEditor = function () { + var sel = this.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 = this.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 = this.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 || this.composing) { 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(), extraLinebreak = false; + function recognizeMarker(id) { return function (marker) { return marker.id == id; } } + function close() { + if (closing) { + text += lineSep; + if (extraLinebreak) { text += lineSep; } + closing = extraLinebreak = false; + } + } + function addText(str) { + if (str) { + close(); + text += str; + } + } + function walk(node) { + if (node.nodeType == 1) { + var cmText = node.getAttribute("cm-text"); + if (cmText) { + addText(cmText); + 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(0))) + { addText(getBetween(cm.doc, range$$1.from, range$$1.to).join(lineSep)); } + return + } + if (node.getAttribute("contenteditable") == "false") { return } + var isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName); + if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) { return } + + if (isBlock) { close(); } + for (var i = 0; i < node.childNodes.length; i++) + { walk(node.childNodes[i]); } + + if (/^(pre|p)$/i.test(node.nodeName)) { extraLinebreak = true; } + if (isBlock) { closing = true; } + } else if (node.nodeType == 3) { + addText(node.nodeValue.replace(/\u200b/g, "").replace(/\u00a0/g, " ")); + } + } + for (;;) { + walk(from); + if (from == to) { break } + from = from.nextSibling; + extraLinebreak = false; + } + 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(); + // 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; + this.createField(display); + var te = this.textarea; + + display.wrapper.insertBefore(this.wrapper, 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()}); + } 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.createField = function (_display) { + // Wraps and hides input textarea + this.wrapper = hiddenTextarea(); + // The semihidden textarea that is focused when the editor is + // focused, and receives input. + this.textarea = this.wrapper.firstChild; + }; + + 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 cm = this.cm; + if (cm.somethingSelected()) { + this.prevInput = ""; + var content = 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; } + } + }; + + 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(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); + + addEditorMethods(CodeMirror); + + // 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.prototype[prop] = (function(method) { + return function() {return method.apply(this.doc, arguments)} + })(Doc.prototype[prop]); } } + + eventMixin(Doc); + CodeMirror.inputStyles = {"textarea": TextareaInput, "contenteditable": ContentEditableInput}; + + // 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.defineMode = function(name/*, mode, …*/) { + if (!CodeMirror.defaults.mode && name != "null") { CodeMirror.defaults.mode = name; } + defineMode.apply(this, arguments); + }; + + CodeMirror.defineMIME = defineMIME; + + // Minimal default mode. + CodeMirror.defineMode("null", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); }); + CodeMirror.defineMIME("text/plain", "null"); + + // EXTENSIONS + + CodeMirror.defineExtension = function (name, func) { + CodeMirror.prototype[name] = func; + }; + CodeMirror.defineDocExtension = function (name, func) { + Doc.prototype[name] = func; + }; + + CodeMirror.fromTextArea = fromTextArea; + + addLegacyProps(CodeMirror); + + CodeMirror.version = "5.42.0"; + + return CodeMirror; + +}))); diff --git a/cyclone-web/vendor/codeMirror/css.js b/cyclone-web/vendor/codeMirror/css.js new file mode 100644 index 0000000000000000000000000000000000000000..74fcdef7d9158809972e01a4979346b10818aa50 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/css.js @@ -0,0 +1,832 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/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.defineMode("css", function(config, parserConfig) { + var inline = parserConfig.inline + if (!parserConfig.propertyKeywords) parserConfig = CodeMirror.resolveMode("text/css"); + + var indentUnit = config.indentUnit, + tokenHooks = parserConfig.tokenHooks, + documentTypes = parserConfig.documentTypes || {}, + mediaTypes = parserConfig.mediaTypes || {}, + mediaFeatures = parserConfig.mediaFeatures || {}, + mediaValueKeywords = parserConfig.mediaValueKeywords || {}, + propertyKeywords = parserConfig.propertyKeywords || {}, + nonStandardPropertyKeywords = parserConfig.nonStandardPropertyKeywords || {}, + fontProperties = parserConfig.fontProperties || {}, + counterDescriptors = parserConfig.counterDescriptors || {}, + colorKeywords = parserConfig.colorKeywords || {}, + valueKeywords = parserConfig.valueKeywords || {}, + allowNested = parserConfig.allowNested, + lineComment = parserConfig.lineComment, + supportsAtComponent = parserConfig.supportsAtComponent === true; + + var type, override; + function ret(style, tp) { type = tp; return style; } + + // Tokenizers + + function tokenBase(stream, state) { + var ch = stream.next(); + if (tokenHooks[ch]) { + var result = tokenHooks[ch](stream, state); + if (result !== false) return result; + } + if (ch == "@") { + stream.eatWhile(/[\w\\\-]/); + return ret("def", stream.current()); + } else if (ch == "=" || (ch == "~" || ch == "|") && stream.eat("=")) { + return ret(null, "compare"); + } else if (ch == "\"" || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } else if (ch == "#") { + stream.eatWhile(/[\w\\\-]/); + return ret("atom", "hash"); + } else if (ch == "!") { + stream.match(/^\s*\w*/); + return ret("keyword", "important"); + } else if (/\d/.test(ch) || ch == "." && stream.eat(/\d/)) { + stream.eatWhile(/[\w.%]/); + return ret("number", "unit"); + } else if (ch === "-") { + if (/[\d.]/.test(stream.peek())) { + stream.eatWhile(/[\w.%]/); + return ret("number", "unit"); + } else if (stream.match(/^-[\w\\\-]+/)) { + stream.eatWhile(/[\w\\\-]/); + if (stream.match(/^\s*:/, false)) + return ret("variable-2", "variable-definition"); + return ret("variable-2", "variable"); + } else if (stream.match(/^\w+-/)) { + return ret("meta", "meta"); + } + } else if (/[,+>*\/]/.test(ch)) { + return ret(null, "select-op"); + } else if (ch == "." && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) { + return ret("qualifier", "qualifier"); + } else if (/[:;{}\[\]\(\)]/.test(ch)) { + return ret(null, ch); + } else if (((ch == "u" || ch == "U") && stream.match(/rl(-prefix)?\(/i)) || + ((ch == "d" || ch == "D") && stream.match("omain(", true, true)) || + ((ch == "r" || ch == "R") && stream.match("egexp(", true, true))) { + stream.backUp(1); + state.tokenize = tokenParenthesized; + return ret("property", "word"); + } else if (/[\w\\\-]/.test(ch)) { + stream.eatWhile(/[\w\\\-]/); + return ret("property", "word"); + } else { + return ret(null, null); + } + } + + function tokenString(quote) { + return function(stream, state) { + var escaped = false, ch; + while ((ch = stream.next()) != null) { + if (ch == quote && !escaped) { + if (quote == ")") stream.backUp(1); + break; + } + escaped = !escaped && ch == "\\"; + } + if (ch == quote || !escaped && quote != ")") state.tokenize = null; + return ret("string", "string"); + }; + } + + function tokenParenthesized(stream, state) { + stream.next(); // Must be '(' + if (!stream.match(/\s*[\"\')]/, false)) + state.tokenize = tokenString(")"); + else + state.tokenize = null; + return ret(null, "("); + } + + // Context management + + function Context(type, indent, prev) { + this.type = type; + this.indent = indent; + this.prev = prev; + } + + function pushContext(state, stream, type, indent) { + state.context = new Context(type, stream.indentation() + (indent === false ? 0 : indentUnit), state.context); + return type; + } + + function popContext(state) { + if (state.context.prev) + state.context = state.context.prev; + return state.context.type; + } + + function pass(type, stream, state) { + return states[state.context.type](type, stream, state); + } + function popAndPass(type, stream, state, n) { + for (var i = n || 1; i > 0; i--) + state.context = state.context.prev; + return pass(type, stream, state); + } + + // Parser + + function wordAsValue(stream) { + var word = stream.current().toLowerCase(); + if (valueKeywords.hasOwnProperty(word)) + override = "atom"; + else if (colorKeywords.hasOwnProperty(word)) + override = "keyword"; + else + override = "variable"; + } + + var states = {}; + + states.top = function(type, stream, state) { + if (type == "{") { + return pushContext(state, stream, "block"); + } else if (type == "}" && state.context.prev) { + return popContext(state); + } else if (supportsAtComponent && /@component/i.test(type)) { + return pushContext(state, stream, "atComponentBlock"); + } else if (/^@(-moz-)?document$/i.test(type)) { + return pushContext(state, stream, "documentTypes"); + } else if (/^@(media|supports|(-moz-)?document|import)$/i.test(type)) { + return pushContext(state, stream, "atBlock"); + } else if (/^@(font-face|counter-style)/i.test(type)) { + state.stateArg = type; + return "restricted_atBlock_before"; + } else if (/^@(-(moz|ms|o|webkit)-)?keyframes$/i.test(type)) { + return "keyframes"; + } else if (type && type.charAt(0) == "@") { + return pushContext(state, stream, "at"); + } else if (type == "hash") { + override = "builtin"; + } else if (type == "word") { + override = "tag"; + } else if (type == "variable-definition") { + return "maybeprop"; + } else if (type == "interpolation") { + return pushContext(state, stream, "interpolation"); + } else if (type == ":") { + return "pseudo"; + } else if (allowNested && type == "(") { + return pushContext(state, stream, "parens"); + } + return state.context.type; + }; + + states.block = function(type, stream, state) { + if (type == "word") { + var word = stream.current().toLowerCase(); + if (propertyKeywords.hasOwnProperty(word)) { + override = "property"; + return "maybeprop"; + } else if (nonStandardPropertyKeywords.hasOwnProperty(word)) { + override = "string-2"; + return "maybeprop"; + } else if (allowNested) { + override = stream.match(/^\s*:(?:\s|$)/, false) ? "property" : "tag"; + return "block"; + } else { + override += " error"; + return "maybeprop"; + } + } else if (type == "meta") { + return "block"; + } else if (!allowNested && (type == "hash" || type == "qualifier")) { + override = "error"; + return "block"; + } else { + return states.top(type, stream, state); + } + }; + + states.maybeprop = function(type, stream, state) { + if (type == ":") return pushContext(state, stream, "prop"); + return pass(type, stream, state); + }; + + states.prop = function(type, stream, state) { + if (type == ";") return popContext(state); + if (type == "{" && allowNested) return pushContext(state, stream, "propBlock"); + if (type == "}" || type == "{") return popAndPass(type, stream, state); + if (type == "(") return pushContext(state, stream, "parens"); + + if (type == "hash" && !/^#([0-9a-fA-f]{3,4}|[0-9a-fA-f]{6}|[0-9a-fA-f]{8})$/.test(stream.current())) { + override += " error"; + } else if (type == "word") { + wordAsValue(stream); + } else if (type == "interpolation") { + return pushContext(state, stream, "interpolation"); + } + return "prop"; + }; + + states.propBlock = function(type, _stream, state) { + if (type == "}") return popContext(state); + if (type == "word") { override = "property"; return "maybeprop"; } + return state.context.type; + }; + + states.parens = function(type, stream, state) { + if (type == "{" || type == "}") return popAndPass(type, stream, state); + if (type == ")") return popContext(state); + if (type == "(") return pushContext(state, stream, "parens"); + if (type == "interpolation") return pushContext(state, stream, "interpolation"); + if (type == "word") wordAsValue(stream); + return "parens"; + }; + + states.pseudo = function(type, stream, state) { + if (type == "meta") return "pseudo"; + + if (type == "word") { + override = "variable-3"; + return state.context.type; + } + return pass(type, stream, state); + }; + + states.documentTypes = function(type, stream, state) { + if (type == "word" && documentTypes.hasOwnProperty(stream.current())) { + override = "tag"; + return state.context.type; + } else { + return states.atBlock(type, stream, state); + } + }; + + states.atBlock = function(type, stream, state) { + if (type == "(") return pushContext(state, stream, "atBlock_parens"); + if (type == "}" || type == ";") return popAndPass(type, stream, state); + if (type == "{") return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top"); + + if (type == "interpolation") return pushContext(state, stream, "interpolation"); + + if (type == "word") { + var word = stream.current().toLowerCase(); + if (word == "only" || word == "not" || word == "and" || word == "or") + override = "keyword"; + else if (mediaTypes.hasOwnProperty(word)) + override = "attribute"; + else if (mediaFeatures.hasOwnProperty(word)) + override = "property"; + else if (mediaValueKeywords.hasOwnProperty(word)) + override = "keyword"; + else if (propertyKeywords.hasOwnProperty(word)) + override = "property"; + else if (nonStandardPropertyKeywords.hasOwnProperty(word)) + override = "string-2"; + else if (valueKeywords.hasOwnProperty(word)) + override = "atom"; + else if (colorKeywords.hasOwnProperty(word)) + override = "keyword"; + else + override = "error"; + } + return state.context.type; + }; + + states.atComponentBlock = function(type, stream, state) { + if (type == "}") + return popAndPass(type, stream, state); + if (type == "{") + return popContext(state) && pushContext(state, stream, allowNested ? "block" : "top", false); + if (type == "word") + override = "error"; + return state.context.type; + }; + + states.atBlock_parens = function(type, stream, state) { + if (type == ")") return popContext(state); + if (type == "{" || type == "}") return popAndPass(type, stream, state, 2); + return states.atBlock(type, stream, state); + }; + + states.restricted_atBlock_before = function(type, stream, state) { + if (type == "{") + return pushContext(state, stream, "restricted_atBlock"); + if (type == "word" && state.stateArg == "@counter-style") { + override = "variable"; + return "restricted_atBlock_before"; + } + return pass(type, stream, state); + }; + + states.restricted_atBlock = function(type, stream, state) { + if (type == "}") { + state.stateArg = null; + return popContext(state); + } + if (type == "word") { + if ((state.stateArg == "@font-face" && !fontProperties.hasOwnProperty(stream.current().toLowerCase())) || + (state.stateArg == "@counter-style" && !counterDescriptors.hasOwnProperty(stream.current().toLowerCase()))) + override = "error"; + else + override = "property"; + return "maybeprop"; + } + return "restricted_atBlock"; + }; + + states.keyframes = function(type, stream, state) { + if (type == "word") { override = "variable"; return "keyframes"; } + if (type == "{") return pushContext(state, stream, "top"); + return pass(type, stream, state); + }; + + states.at = function(type, stream, state) { + if (type == ";") return popContext(state); + if (type == "{" || type == "}") return popAndPass(type, stream, state); + if (type == "word") override = "tag"; + else if (type == "hash") override = "builtin"; + return "at"; + }; + + states.interpolation = function(type, stream, state) { + if (type == "}") return popContext(state); + if (type == "{" || type == ";") return popAndPass(type, stream, state); + if (type == "word") override = "variable"; + else if (type != "variable" && type != "(" && type != ")") override = "error"; + return "interpolation"; + }; + + return { + startState: function(base) { + return {tokenize: null, + state: inline ? "block" : "top", + stateArg: null, + context: new Context(inline ? "block" : "top", base || 0, null)}; + }, + + token: function(stream, state) { + if (!state.tokenize && stream.eatSpace()) return null; + var style = (state.tokenize || tokenBase)(stream, state); + if (style && typeof style == "object") { + type = style[1]; + style = style[0]; + } + override = style; + if (type != "comment") + state.state = states[state.state](type, stream, state); + return override; + }, + + indent: function(state, textAfter) { + var cx = state.context, ch = textAfter && textAfter.charAt(0); + var indent = cx.indent; + if (cx.type == "prop" && (ch == "}" || ch == ")")) cx = cx.prev; + if (cx.prev) { + if (ch == "}" && (cx.type == "block" || cx.type == "top" || + cx.type == "interpolation" || cx.type == "restricted_atBlock")) { + // Resume indentation from parent context. + cx = cx.prev; + indent = cx.indent; + } else if (ch == ")" && (cx.type == "parens" || cx.type == "atBlock_parens") || + ch == "{" && (cx.type == "at" || cx.type == "atBlock")) { + // Dedent relative to current context. + indent = Math.max(0, cx.indent - indentUnit); + } + } + return indent; + }, + + electricChars: "}", + blockCommentStart: "/*", + blockCommentEnd: "*/", + blockCommentContinue: " * ", + lineComment: lineComment, + fold: "brace" + }; + }); + + function keySet(array) { + var keys = {}; + for (var i = 0; i < array.length; ++i) { + keys[array[i].toLowerCase()] = true; + } + return keys; + } + + var documentTypes_ = [ + "domain", "regexp", "url", "url-prefix" + ], documentTypes = keySet(documentTypes_); + + var mediaTypes_ = [ + "all", "aural", "braille", "handheld", "print", "projection", "screen", + "tty", "tv", "embossed" + ], mediaTypes = keySet(mediaTypes_); + + var mediaFeatures_ = [ + "width", "min-width", "max-width", "height", "min-height", "max-height", + "device-width", "min-device-width", "max-device-width", "device-height", + "min-device-height", "max-device-height", "aspect-ratio", + "min-aspect-ratio", "max-aspect-ratio", "device-aspect-ratio", + "min-device-aspect-ratio", "max-device-aspect-ratio", "color", "min-color", + "max-color", "color-index", "min-color-index", "max-color-index", + "monochrome", "min-monochrome", "max-monochrome", "resolution", + "min-resolution", "max-resolution", "scan", "grid", "orientation", + "device-pixel-ratio", "min-device-pixel-ratio", "max-device-pixel-ratio", + "pointer", "any-pointer", "hover", "any-hover" + ], mediaFeatures = keySet(mediaFeatures_); + + var mediaValueKeywords_ = [ + "landscape", "portrait", "none", "coarse", "fine", "on-demand", "hover", + "interlace", "progressive" + ], mediaValueKeywords = keySet(mediaValueKeywords_); + + var propertyKeywords_ = [ + "align-content", "align-items", "align-self", "alignment-adjust", + "alignment-baseline", "anchor-point", "animation", "animation-delay", + "animation-direction", "animation-duration", "animation-fill-mode", + "animation-iteration-count", "animation-name", "animation-play-state", + "animation-timing-function", "appearance", "azimuth", "backface-visibility", + "background", "background-attachment", "background-blend-mode", "background-clip", + "background-color", "background-image", "background-origin", "background-position", + "background-repeat", "background-size", "baseline-shift", "binding", + "bleed", "bookmark-label", "bookmark-level", "bookmark-state", + "bookmark-target", "border", "border-bottom", "border-bottom-color", + "border-bottom-left-radius", "border-bottom-right-radius", + "border-bottom-style", "border-bottom-width", "border-collapse", + "border-color", "border-image", "border-image-outset", + "border-image-repeat", "border-image-slice", "border-image-source", + "border-image-width", "border-left", "border-left-color", + "border-left-style", "border-left-width", "border-radius", "border-right", + "border-right-color", "border-right-style", "border-right-width", + "border-spacing", "border-style", "border-top", "border-top-color", + "border-top-left-radius", "border-top-right-radius", "border-top-style", + "border-top-width", "border-width", "bottom", "box-decoration-break", + "box-shadow", "box-sizing", "break-after", "break-before", "break-inside", + "caption-side", "caret-color", "clear", "clip", "color", "color-profile", "column-count", + "column-fill", "column-gap", "column-rule", "column-rule-color", + "column-rule-style", "column-rule-width", "column-span", "column-width", + "columns", "content", "counter-increment", "counter-reset", "crop", "cue", + "cue-after", "cue-before", "cursor", "direction", "display", + "dominant-baseline", "drop-initial-after-adjust", + "drop-initial-after-align", "drop-initial-before-adjust", + "drop-initial-before-align", "drop-initial-size", "drop-initial-value", + "elevation", "empty-cells", "fit", "fit-position", "flex", "flex-basis", + "flex-direction", "flex-flow", "flex-grow", "flex-shrink", "flex-wrap", + "float", "float-offset", "flow-from", "flow-into", "font", "font-feature-settings", + "font-family", "font-kerning", "font-language-override", "font-size", "font-size-adjust", + "font-stretch", "font-style", "font-synthesis", "font-variant", + "font-variant-alternates", "font-variant-caps", "font-variant-east-asian", + "font-variant-ligatures", "font-variant-numeric", "font-variant-position", + "font-weight", "grid", "grid-area", "grid-auto-columns", "grid-auto-flow", + "grid-auto-rows", "grid-column", "grid-column-end", "grid-column-gap", + "grid-column-start", "grid-gap", "grid-row", "grid-row-end", "grid-row-gap", + "grid-row-start", "grid-template", "grid-template-areas", "grid-template-columns", + "grid-template-rows", "hanging-punctuation", "height", "hyphens", + "icon", "image-orientation", "image-rendering", "image-resolution", + "inline-box-align", "justify-content", "justify-items", "justify-self", "left", "letter-spacing", + "line-break", "line-height", "line-stacking", "line-stacking-ruby", + "line-stacking-shift", "line-stacking-strategy", "list-style", + "list-style-image", "list-style-position", "list-style-type", "margin", + "margin-bottom", "margin-left", "margin-right", "margin-top", + "marks", "marquee-direction", "marquee-loop", + "marquee-play-count", "marquee-speed", "marquee-style", "max-height", + "max-width", "min-height", "min-width", "move-to", "nav-down", "nav-index", + "nav-left", "nav-right", "nav-up", "object-fit", "object-position", + "opacity", "order", "orphans", "outline", + "outline-color", "outline-offset", "outline-style", "outline-width", + "overflow", "overflow-style", "overflow-wrap", "overflow-x", "overflow-y", + "padding", "padding-bottom", "padding-left", "padding-right", "padding-top", + "page", "page-break-after", "page-break-before", "page-break-inside", + "page-policy", "pause", "pause-after", "pause-before", "perspective", + "perspective-origin", "pitch", "pitch-range", "place-content", "place-items", "place-self", "play-during", "position", + "presentation-level", "punctuation-trim", "quotes", "region-break-after", + "region-break-before", "region-break-inside", "region-fragment", + "rendering-intent", "resize", "rest", "rest-after", "rest-before", "richness", + "right", "rotation", "rotation-point", "ruby-align", "ruby-overhang", + "ruby-position", "ruby-span", "shape-image-threshold", "shape-inside", "shape-margin", + "shape-outside", "size", "speak", "speak-as", "speak-header", + "speak-numeral", "speak-punctuation", "speech-rate", "stress", "string-set", + "tab-size", "table-layout", "target", "target-name", "target-new", + "target-position", "text-align", "text-align-last", "text-decoration", + "text-decoration-color", "text-decoration-line", "text-decoration-skip", + "text-decoration-style", "text-emphasis", "text-emphasis-color", + "text-emphasis-position", "text-emphasis-style", "text-height", + "text-indent", "text-justify", "text-outline", "text-overflow", "text-shadow", + "text-size-adjust", "text-space-collapse", "text-transform", "text-underline-position", + "text-wrap", "top", "transform", "transform-origin", "transform-style", + "transition", "transition-delay", "transition-duration", + "transition-property", "transition-timing-function", "unicode-bidi", + "user-select", "vertical-align", "visibility", "voice-balance", "voice-duration", + "voice-family", "voice-pitch", "voice-range", "voice-rate", "voice-stress", + "voice-volume", "volume", "white-space", "widows", "width", "will-change", "word-break", + "word-spacing", "word-wrap", "z-index", + // SVG-specific + "clip-path", "clip-rule", "mask", "enable-background", "filter", "flood-color", + "flood-opacity", "lighting-color", "stop-color", "stop-opacity", "pointer-events", + "color-interpolation", "color-interpolation-filters", + "color-rendering", "fill", "fill-opacity", "fill-rule", "image-rendering", + "marker", "marker-end", "marker-mid", "marker-start", "shape-rendering", "stroke", + "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", + "stroke-miterlimit", "stroke-opacity", "stroke-width", "text-rendering", + "baseline-shift", "dominant-baseline", "glyph-orientation-horizontal", + "glyph-orientation-vertical", "text-anchor", "writing-mode" + ], propertyKeywords = keySet(propertyKeywords_); + + var nonStandardPropertyKeywords_ = [ + "scrollbar-arrow-color", "scrollbar-base-color", "scrollbar-dark-shadow-color", + "scrollbar-face-color", "scrollbar-highlight-color", "scrollbar-shadow-color", + "scrollbar-3d-light-color", "scrollbar-track-color", "shape-inside", + "searchfield-cancel-button", "searchfield-decoration", "searchfield-results-button", + "searchfield-results-decoration", "zoom" + ], nonStandardPropertyKeywords = keySet(nonStandardPropertyKeywords_); + + var fontProperties_ = [ + "font-family", "src", "unicode-range", "font-variant", "font-feature-settings", + "font-stretch", "font-weight", "font-style" + ], fontProperties = keySet(fontProperties_); + + var counterDescriptors_ = [ + "additive-symbols", "fallback", "negative", "pad", "prefix", "range", + "speak-as", "suffix", "symbols", "system" + ], counterDescriptors = keySet(counterDescriptors_); + + var colorKeywords_ = [ + "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", + "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", + "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", "cornflowerblue", + "cornsilk", "crimson", "cyan", "darkblue", "darkcyan", "darkgoldenrod", + "darkgray", "darkgreen", "darkkhaki", "darkmagenta", "darkolivegreen", + "darkorange", "darkorchid", "darkred", "darksalmon", "darkseagreen", + "darkslateblue", "darkslategray", "darkturquoise", "darkviolet", + "deeppink", "deepskyblue", "dimgray", "dodgerblue", "firebrick", + "floralwhite", "forestgreen", "fuchsia", "gainsboro", "ghostwhite", + "gold", "goldenrod", "gray", "grey", "green", "greenyellow", "honeydew", + "hotpink", "indianred", "indigo", "ivory", "khaki", "lavender", + "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", "lightcoral", + "lightcyan", "lightgoldenrodyellow", "lightgray", "lightgreen", "lightpink", + "lightsalmon", "lightseagreen", "lightskyblue", "lightslategray", + "lightsteelblue", "lightyellow", "lime", "limegreen", "linen", "magenta", + "maroon", "mediumaquamarine", "mediumblue", "mediumorchid", "mediumpurple", + "mediumseagreen", "mediumslateblue", "mediumspringgreen", "mediumturquoise", + "mediumvioletred", "midnightblue", "mintcream", "mistyrose", "moccasin", + "navajowhite", "navy", "oldlace", "olive", "olivedrab", "orange", "orangered", + "orchid", "palegoldenrod", "palegreen", "paleturquoise", "palevioletred", + "papayawhip", "peachpuff", "peru", "pink", "plum", "powderblue", + "purple", "rebeccapurple", "red", "rosybrown", "royalblue", "saddlebrown", + "salmon", "sandybrown", "seagreen", "seashell", "sienna", "silver", "skyblue", + "slateblue", "slategray", "snow", "springgreen", "steelblue", "tan", + "teal", "thistle", "tomato", "turquoise", "violet", "wheat", "white", + "whitesmoke", "yellow", "yellowgreen" + ], colorKeywords = keySet(colorKeywords_); + + var valueKeywords_ = [ + "above", "absolute", "activeborder", "additive", "activecaption", "afar", + "after-white-space", "ahead", "alias", "all", "all-scroll", "alphabetic", "alternate", + "always", "amharic", "amharic-abegede", "antialiased", "appworkspace", + "arabic-indic", "armenian", "asterisks", "attr", "auto", "auto-flow", "avoid", "avoid-column", "avoid-page", + "avoid-region", "background", "backwards", "baseline", "below", "bidi-override", "binary", + "bengali", "blink", "block", "block-axis", "bold", "bolder", "border", "border-box", + "both", "bottom", "break", "break-all", "break-word", "bullets", "button", "button-bevel", + "buttonface", "buttonhighlight", "buttonshadow", "buttontext", "calc", "cambodian", + "capitalize", "caps-lock-indicator", "caption", "captiontext", "caret", + "cell", "center", "checkbox", "circle", "cjk-decimal", "cjk-earthly-branch", + "cjk-heavenly-stem", "cjk-ideographic", "clear", "clip", "close-quote", + "col-resize", "collapse", "color", "color-burn", "color-dodge", "column", "column-reverse", + "compact", "condensed", "contain", "content", "contents", + "content-box", "context-menu", "continuous", "copy", "counter", "counters", "cover", "crop", + "cross", "crosshair", "currentcolor", "cursive", "cyclic", "darken", "dashed", "decimal", + "decimal-leading-zero", "default", "default-button", "dense", "destination-atop", + "destination-in", "destination-out", "destination-over", "devanagari", "difference", + "disc", "discard", "disclosure-closed", "disclosure-open", "document", + "dot-dash", "dot-dot-dash", + "dotted", "double", "down", "e-resize", "ease", "ease-in", "ease-in-out", "ease-out", + "element", "ellipse", "ellipsis", "embed", "end", "ethiopic", "ethiopic-abegede", + "ethiopic-abegede-am-et", "ethiopic-abegede-gez", "ethiopic-abegede-ti-er", + "ethiopic-abegede-ti-et", "ethiopic-halehame-aa-er", + "ethiopic-halehame-aa-et", "ethiopic-halehame-am-et", + "ethiopic-halehame-gez", "ethiopic-halehame-om-et", + "ethiopic-halehame-sid-et", "ethiopic-halehame-so-et", + "ethiopic-halehame-ti-er", "ethiopic-halehame-ti-et", "ethiopic-halehame-tig", + "ethiopic-numeric", "ew-resize", "exclusion", "expanded", "extends", "extra-condensed", + "extra-expanded", "fantasy", "fast", "fill", "fixed", "flat", "flex", "flex-end", "flex-start", "footnotes", + "forwards", "from", "geometricPrecision", "georgian", "graytext", "grid", "groove", + "gujarati", "gurmukhi", "hand", "hangul", "hangul-consonant", "hard-light", "hebrew", + "help", "hidden", "hide", "higher", "highlight", "highlighttext", + "hiragana", "hiragana-iroha", "horizontal", "hsl", "hsla", "hue", "icon", "ignore", + "inactiveborder", "inactivecaption", "inactivecaptiontext", "infinite", + "infobackground", "infotext", "inherit", "initial", "inline", "inline-axis", + "inline-block", "inline-flex", "inline-grid", "inline-table", "inset", "inside", "intrinsic", "invert", + "italic", "japanese-formal", "japanese-informal", "justify", "kannada", + "katakana", "katakana-iroha", "keep-all", "khmer", + "korean-hangul-formal", "korean-hanja-formal", "korean-hanja-informal", + "landscape", "lao", "large", "larger", "left", "level", "lighter", "lighten", + "line-through", "linear", "linear-gradient", "lines", "list-item", "listbox", "listitem", + "local", "logical", "loud", "lower", "lower-alpha", "lower-armenian", + "lower-greek", "lower-hexadecimal", "lower-latin", "lower-norwegian", + "lower-roman", "lowercase", "ltr", "luminosity", "malayalam", "match", "matrix", "matrix3d", + "media-controls-background", "media-current-time-display", + "media-fullscreen-button", "media-mute-button", "media-play-button", + "media-return-to-realtime-button", "media-rewind-button", + "media-seek-back-button", "media-seek-forward-button", "media-slider", + "media-sliderthumb", "media-time-remaining-display", "media-volume-slider", + "media-volume-slider-container", "media-volume-sliderthumb", "medium", + "menu", "menulist", "menulist-button", "menulist-text", + "menulist-textfield", "menutext", "message-box", "middle", "min-intrinsic", + "mix", "mongolian", "monospace", "move", "multiple", "multiply", "myanmar", "n-resize", + "narrower", "ne-resize", "nesw-resize", "no-close-quote", "no-drop", + "no-open-quote", "no-repeat", "none", "normal", "not-allowed", "nowrap", + "ns-resize", "numbers", "numeric", "nw-resize", "nwse-resize", "oblique", "octal", "opacity", "open-quote", + "optimizeLegibility", "optimizeSpeed", "oriya", "oromo", "outset", + "outside", "outside-shape", "overlay", "overline", "padding", "padding-box", + "painted", "page", "paused", "persian", "perspective", "plus-darker", "plus-lighter", + "pointer", "polygon", "portrait", "pre", "pre-line", "pre-wrap", "preserve-3d", + "progress", "push-button", "radial-gradient", "radio", "read-only", + "read-write", "read-write-plaintext-only", "rectangle", "region", + "relative", "repeat", "repeating-linear-gradient", + "repeating-radial-gradient", "repeat-x", "repeat-y", "reset", "reverse", + "rgb", "rgba", "ridge", "right", "rotate", "rotate3d", "rotateX", "rotateY", + "rotateZ", "round", "row", "row-resize", "row-reverse", "rtl", "run-in", "running", + "s-resize", "sans-serif", "saturation", "scale", "scale3d", "scaleX", "scaleY", "scaleZ", "screen", + "scroll", "scrollbar", "scroll-position", "se-resize", "searchfield", + "searchfield-cancel-button", "searchfield-decoration", + "searchfield-results-button", "searchfield-results-decoration", "self-start", "self-end", + "semi-condensed", "semi-expanded", "separate", "serif", "show", "sidama", + "simp-chinese-formal", "simp-chinese-informal", "single", + "skew", "skewX", "skewY", "skip-white-space", "slide", "slider-horizontal", + "slider-vertical", "sliderthumb-horizontal", "sliderthumb-vertical", "slow", + "small", "small-caps", "small-caption", "smaller", "soft-light", "solid", "somali", + "source-atop", "source-in", "source-out", "source-over", "space", "space-around", "space-between", "space-evenly", "spell-out", "square", + "square-button", "start", "static", "status-bar", "stretch", "stroke", "sub", + "subpixel-antialiased", "super", "sw-resize", "symbolic", "symbols", "system-ui", "table", + "table-caption", "table-cell", "table-column", "table-column-group", + "table-footer-group", "table-header-group", "table-row", "table-row-group", + "tamil", + "telugu", "text", "text-bottom", "text-top", "textarea", "textfield", "thai", + "thick", "thin", "threeddarkshadow", "threedface", "threedhighlight", + "threedlightshadow", "threedshadow", "tibetan", "tigre", "tigrinya-er", + "tigrinya-er-abegede", "tigrinya-et", "tigrinya-et-abegede", "to", "top", + "trad-chinese-formal", "trad-chinese-informal", "transform", + "translate", "translate3d", "translateX", "translateY", "translateZ", + "transparent", "ultra-condensed", "ultra-expanded", "underline", "unset", "up", + "upper-alpha", "upper-armenian", "upper-greek", "upper-hexadecimal", + "upper-latin", "upper-norwegian", "upper-roman", "uppercase", "urdu", "url", + "var", "vertical", "vertical-text", "visible", "visibleFill", "visiblePainted", + "visibleStroke", "visual", "w-resize", "wait", "wave", "wider", + "window", "windowframe", "windowtext", "words", "wrap", "wrap-reverse", "x-large", "x-small", "xor", + "xx-large", "xx-small" + ], valueKeywords = keySet(valueKeywords_); + + var allWords = documentTypes_.concat(mediaTypes_).concat(mediaFeatures_).concat(mediaValueKeywords_) + .concat(propertyKeywords_).concat(nonStandardPropertyKeywords_).concat(colorKeywords_) + .concat(valueKeywords_); + CodeMirror.registerHelper("hintWords", "css", allWords); + + function tokenCComment(stream, state) { + var maybeEnd = false, ch; + while ((ch = stream.next()) != null) { + if (maybeEnd && ch == "/") { + state.tokenize = null; + break; + } + maybeEnd = (ch == "*"); + } + return ["comment", "comment"]; + } + + CodeMirror.defineMIME("text/css", { + documentTypes: documentTypes, + mediaTypes: mediaTypes, + mediaFeatures: mediaFeatures, + mediaValueKeywords: mediaValueKeywords, + propertyKeywords: propertyKeywords, + nonStandardPropertyKeywords: nonStandardPropertyKeywords, + fontProperties: fontProperties, + counterDescriptors: counterDescriptors, + colorKeywords: colorKeywords, + valueKeywords: valueKeywords, + tokenHooks: { + "/": function(stream, state) { + if (!stream.eat("*")) return false; + state.tokenize = tokenCComment; + return tokenCComment(stream, state); + } + }, + name: "css" + }); + + CodeMirror.defineMIME("text/x-scss", { + mediaTypes: mediaTypes, + mediaFeatures: mediaFeatures, + mediaValueKeywords: mediaValueKeywords, + propertyKeywords: propertyKeywords, + nonStandardPropertyKeywords: nonStandardPropertyKeywords, + colorKeywords: colorKeywords, + valueKeywords: valueKeywords, + fontProperties: fontProperties, + allowNested: true, + lineComment: "//", + tokenHooks: { + "/": function(stream, state) { + if (stream.eat("/")) { + stream.skipToEnd(); + return ["comment", "comment"]; + } else if (stream.eat("*")) { + state.tokenize = tokenCComment; + return tokenCComment(stream, state); + } else { + return ["operator", "operator"]; + } + }, + ":": function(stream) { + if (stream.match(/\s*\{/, false)) + return [null, null] + return false; + }, + "$": function(stream) { + stream.match(/^[\w-]+/); + if (stream.match(/^\s*:/, false)) + return ["variable-2", "variable-definition"]; + return ["variable-2", "variable"]; + }, + "#": function(stream) { + if (!stream.eat("{")) return false; + return [null, "interpolation"]; + } + }, + name: "css", + helperType: "scss" + }); + + CodeMirror.defineMIME("text/x-less", { + mediaTypes: mediaTypes, + mediaFeatures: mediaFeatures, + mediaValueKeywords: mediaValueKeywords, + propertyKeywords: propertyKeywords, + nonStandardPropertyKeywords: nonStandardPropertyKeywords, + colorKeywords: colorKeywords, + valueKeywords: valueKeywords, + fontProperties: fontProperties, + allowNested: true, + lineComment: "//", + tokenHooks: { + "/": function(stream, state) { + if (stream.eat("/")) { + stream.skipToEnd(); + return ["comment", "comment"]; + } else if (stream.eat("*")) { + state.tokenize = tokenCComment; + return tokenCComment(stream, state); + } else { + return ["operator", "operator"]; + } + }, + "@": function(stream) { + if (stream.eat("{")) return [null, "interpolation"]; + if (stream.match(/^(charset|document|font-face|import|(-(moz|ms|o|webkit)-)?keyframes|media|namespace|page|supports)\b/i, false)) return false; + stream.eatWhile(/[\w\\\-]/); + if (stream.match(/^\s*:/, false)) + return ["variable-2", "variable-definition"]; + return ["variable-2", "variable"]; + }, + "&": function() { + return ["atom", "atom"]; + } + }, + name: "css", + helperType: "less" + }); + + CodeMirror.defineMIME("text/x-gss", { + documentTypes: documentTypes, + mediaTypes: mediaTypes, + mediaFeatures: mediaFeatures, + propertyKeywords: propertyKeywords, + nonStandardPropertyKeywords: nonStandardPropertyKeywords, + fontProperties: fontProperties, + counterDescriptors: counterDescriptors, + colorKeywords: colorKeywords, + valueKeywords: valueKeywords, + supportsAtComponent: true, + tokenHooks: { + "/": function(stream, state) { + if (!stream.eat("*")) return false; + state.tokenize = tokenCComment; + return tokenCComment(stream, state); + } + }, + name: "css", + helperType: "gss" + }); + +}); diff --git a/cyclone-web/vendor/codeMirror/dialog/dialog.css b/cyclone-web/vendor/codeMirror/dialog/dialog.css new file mode 100644 index 0000000000000000000000000000000000000000..677c078387dc8866612bd3b662e9e346e02f6977 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/dialog/dialog.css @@ -0,0 +1,32 @@ +.CodeMirror-dialog { + position: absolute; + left: 0; right: 0; + background: inherit; + z-index: 15; + padding: .1em .8em; + overflow: hidden; + color: inherit; +} + +.CodeMirror-dialog-top { + border-bottom: 1px solid #eee; + top: 0; +} + +.CodeMirror-dialog-bottom { + border-top: 1px solid #eee; + bottom: 0; +} + +.CodeMirror-dialog input { + border: none; + outline: none; + background: transparent; + width: 20em; + color: inherit; + font-family: monospace; +} + +.CodeMirror-dialog button { + font-size: 70%; +} diff --git a/cyclone-web/vendor/codeMirror/dialog/dialog.js b/cyclone-web/vendor/codeMirror/dialog/dialog.js new file mode 100644 index 0000000000000000000000000000000000000000..f10bb5bf190bee2a5995cb1fc5b9ac599d2a1cba --- /dev/null +++ b/cyclone-web/vendor/codeMirror/dialog/dialog.js @@ -0,0 +1,157 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +// Open simple dialogs on top of an editor. Relies on dialog.css. + +(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) { + function dialogDiv(cm, template, bottom) { + var wrap = cm.getWrapperElement(); + var dialog; + dialog = wrap.appendChild(document.createElement("div")); + if (bottom) + dialog.className = "CodeMirror-dialog CodeMirror-dialog-bottom"; + else + dialog.className = "CodeMirror-dialog CodeMirror-dialog-top"; + + if (typeof template == "string") { + dialog.innerHTML = template; + } else { // Assuming it's a detached DOM element. + dialog.appendChild(template); + } + return dialog; + } + + function closeNotification(cm, newVal) { + if (cm.state.currentNotificationClose) + cm.state.currentNotificationClose(); + cm.state.currentNotificationClose = newVal; + } + + CodeMirror.defineExtension("openDialog", function(template, callback, options) { + if (!options) options = {}; + + closeNotification(this, null); + + var dialog = dialogDiv(this, template, options.bottom); + var closed = false, me = this; + function close(newVal) { + if (typeof newVal == 'string') { + inp.value = newVal; + } else { + if (closed) return; + closed = true; + dialog.parentNode.removeChild(dialog); + me.focus(); + + if (options.onClose) options.onClose(dialog); + } + } + + var inp = dialog.getElementsByTagName("input")[0], button; + if (inp) { + inp.focus(); + + if (options.value) { + inp.value = options.value; + if (options.selectValueOnOpen !== false) { + inp.select(); + } + } + + if (options.onInput) + CodeMirror.on(inp, "input", function(e) { options.onInput(e, inp.value, close);}); + if (options.onKeyUp) + CodeMirror.on(inp, "keyup", function(e) {options.onKeyUp(e, inp.value, close);}); + + CodeMirror.on(inp, "keydown", function(e) { + if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; } + if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) { + inp.blur(); + CodeMirror.e_stop(e); + close(); + } + if (e.keyCode == 13) callback(inp.value, e); + }); + + if (options.closeOnBlur !== false) CodeMirror.on(inp, "blur", close); + } else if (button = dialog.getElementsByTagName("button")[0]) { + CodeMirror.on(button, "click", function() { + close(); + me.focus(); + }); + + if (options.closeOnBlur !== false) CodeMirror.on(button, "blur", close); + + button.focus(); + } + return close; + }); + + CodeMirror.defineExtension("openConfirm", function(template, callbacks, options) { + closeNotification(this, null); + var dialog = dialogDiv(this, template, options && options.bottom); + var buttons = dialog.getElementsByTagName("button"); + var closed = false, me = this, blurring = 1; + function close() { + if (closed) return; + closed = true; + dialog.parentNode.removeChild(dialog); + me.focus(); + } + buttons[0].focus(); + for (var i = 0; i < buttons.length; ++i) { + var b = buttons[i]; + (function(callback) { + CodeMirror.on(b, "click", function(e) { + CodeMirror.e_preventDefault(e); + close(); + if (callback) callback(me); + }); + })(callbacks[i]); + CodeMirror.on(b, "blur", function() { + --blurring; + setTimeout(function() { if (blurring <= 0) close(); }, 200); + }); + CodeMirror.on(b, "focus", function() { ++blurring; }); + } + }); + + /* + * openNotification + * Opens a notification, that can be closed with an optional timer + * (default 5000ms timer) and always closes on click. + * + * If a notification is opened while another is opened, it will close the + * currently opened one and open the new one immediately. + */ + CodeMirror.defineExtension("openNotification", function(template, options) { + closeNotification(this, close); + var dialog = dialogDiv(this, template, options && options.bottom); + var closed = false, doneTimer; + var duration = options && typeof options.duration !== "undefined" ? options.duration : 5000; + + function close() { + if (closed) return; + closed = true; + clearTimeout(doneTimer); + dialog.parentNode.removeChild(dialog); + } + + CodeMirror.on(dialog, 'click', function(e) { + CodeMirror.e_preventDefault(e); + close(); + }); + + if (duration) + doneTimer = setTimeout(close, duration); + + return close; + }); +}); diff --git a/cyclone-web/vendor/codeMirror/diff_match_patch.js b/cyclone-web/vendor/codeMirror/diff_match_patch.js new file mode 100644 index 0000000000000000000000000000000000000000..b1b7c71866c0ad65e1dbacef3f9b5866fd5fee59 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/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/cyclone-web/vendor/codeMirror/duotone-dark.css b/cyclone-web/vendor/codeMirror/duotone-dark.css new file mode 100644 index 0000000000000000000000000000000000000000..c2bb2d78726a1a64a9545dd46e510107aacaa1f7 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/duotone-dark.css @@ -0,0 +1,34 @@ +/* +Name: DuoTone-Dark +Author: by Bram de Haan, adapted from DuoTone themes by Simurai (http://simurai.com/projects/2016/01/01/duotone-themes) +CodeMirror template by Jan T. Sott (https://github.com/idleberg), adapted by Bram de Haan (https://github.com/atelierbram/) +*/ + +.cm-s-duotone-dark.CodeMirror { background: #2a2734; color: #6c6783; } +.cm-s-duotone-dark div.CodeMirror-selected { background: #545167!important; } +.cm-s-duotone-dark .CodeMirror-gutters { background: #2a2734; border-right: 0px; } +.cm-s-duotone-dark .CodeMirror-linenumber { color: #545167; } + +/* begin cursor */ +.cm-s-duotone-dark .CodeMirror-cursor { border-left: 1px solid #ffad5c; /* border-left: 1px solid #ffad5c80; */ border-right: .5em solid #ffad5c; /* border-right: .5em solid #ffad5c80; */ opacity: .5; } +.cm-s-duotone-dark .CodeMirror-activeline-background { background: #363342; /* background: #36334280; */ opacity: .5;} +.cm-s-duotone-dark .cm-fat-cursor .CodeMirror-cursor { background: #ffad5c; /* background: #ffad5c80; */ opacity: .5;} +/* end cursor */ + +.cm-s-duotone-dark span.cm-atom, .cm-s-duotone-dark span.cm-number, .cm-s-duotone-dark span.cm-keyword, .cm-s-duotone-dark span.cm-variable, .cm-s-duotone-dark span.cm-attribute, .cm-s-duotone-dark span.cm-quote, .cm-s-duotone-dark span.cm-hr, .cm-s-duotone-dark span.cm-link { color: #ffcc99; } + +.cm-s-duotone-dark span.cm-property { color: #9a86fd; } +.cm-s-duotone-dark span.cm-punctuation, .cm-s-duotone-dark span.cm-unit, .cm-s-duotone-dark span.cm-negative { color: #e09142; } +.cm-s-duotone-dark span.cm-string { color: #ffb870; } +.cm-s-duotone-dark span.cm-operator { color: #ffad5c; } +.cm-s-duotone-dark span.cm-positive { color: #6a51e6; } + +.cm-s-duotone-dark span.cm-variable-2, .cm-s-duotone-dark span.cm-variable-3, .cm-s-duotone-dark span.cm-string-2, .cm-s-duotone-dark span.cm-url { color: #7a63ee; } +.cm-s-duotone-dark span.cm-def, .cm-s-duotone-dark span.cm-tag, .cm-s-duotone-dark span.cm-builtin, .cm-s-duotone-dark span.cm-qualifier, .cm-s-duotone-dark span.cm-header, .cm-s-duotone-dark span.cm-em { color: #eeebff; } +.cm-s-duotone-dark span.cm-bracket, .cm-s-duotone-dark span.cm-comment { color: #6c6783; } + +/* using #f00 red for errors, don't think any of the colorscheme variables will stand out enough, ... maybe by giving it a background-color ... */ +.cm-s-duotone-dark span.cm-error, .cm-s-duotone-dark span.cm-invalidchar { color: #f00; } + +.cm-s-duotone-dark span.cm-header { font-weight: normal; } +.cm-s-duotone-dark .CodeMirror-matchingbracket { text-decoration: underline; color: #eeebff !important; } \ No newline at end of file diff --git a/cyclone-web/vendor/codeMirror/edit/closebrackets.js b/cyclone-web/vendor/codeMirror/edit/closebrackets.js new file mode 100644 index 0000000000000000000000000000000000000000..01fdd96ce1a6ba31a1aa39000c27a5df13c23e32 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/edit/closebrackets.js @@ -0,0 +1,202 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/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) { + var defaults = { + pairs: "()[]{}''\"\"", + triples: "", + explode: "[]{}" + }; + + var Pos = CodeMirror.Pos; + + CodeMirror.defineOption("autoCloseBrackets", false, function(cm, val, old) { + if (old && old != CodeMirror.Init) { + cm.removeKeyMap(keyMap); + cm.state.closeBrackets = null; + } + if (val) { + cm.state.closeBrackets = val; + cm.addKeyMap(keyMap); + } + }); + + function getOption(conf, name) { + if (name == "pairs" && typeof conf == "string") return conf; + if (typeof conf == "object" && conf[name] != null) return conf[name]; + return defaults[name]; + } + + var bind = defaults.pairs + "`"; + var keyMap = {Backspace: handleBackspace, Enter: handleEnter}; + for (var i = 0; i < bind.length; i++) + keyMap["'" + bind.charAt(i) + "'"] = handler(bind.charAt(i)); + + function handler(ch) { + return function(cm) { return handleChar(cm, ch); }; + } + + function getConfig(cm) { + var deflt = cm.state.closeBrackets; + if (!deflt || deflt.override) return deflt; + var mode = cm.getModeAt(cm.getCursor()); + return mode.closeBrackets || deflt; + } + + function handleBackspace(cm) { + var conf = getConfig(cm); + if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass; + + var pairs = getOption(conf, "pairs"); + var ranges = cm.listSelections(); + for (var i = 0; i < ranges.length; i++) { + if (!ranges[i].empty()) return CodeMirror.Pass; + var around = charsAround(cm, ranges[i].head); + if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass; + } + for (var i = ranges.length - 1; i >= 0; i--) { + var cur = ranges[i].head; + cm.replaceRange("", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1), "+delete"); + } + } + + function handleEnter(cm) { + var conf = getConfig(cm); + var explode = conf && getOption(conf, "explode"); + if (!explode || cm.getOption("disableInput")) return CodeMirror.Pass; + + var ranges = cm.listSelections(); + for (var i = 0; i < ranges.length; i++) { + if (!ranges[i].empty()) return CodeMirror.Pass; + var around = charsAround(cm, ranges[i].head); + if (!around || explode.indexOf(around) % 2 != 0) return CodeMirror.Pass; + } + cm.operation(function() { + cm.replaceSelection("\n\n", null); + cm.execCommand("goCharLeft"); + ranges = cm.listSelections(); + for (var i = 0; i < ranges.length; i++) { + var line = ranges[i].head.line; + cm.indentLine(line, null, true); + cm.indentLine(line + 1, null, true); + } + }); + } + + function contractSelection(sel) { + var inverted = CodeMirror.cmpPos(sel.anchor, sel.head) > 0; + return {anchor: new Pos(sel.anchor.line, sel.anchor.ch + (inverted ? -1 : 1)), + head: new Pos(sel.head.line, sel.head.ch + (inverted ? 1 : -1))}; + } + + function handleChar(cm, ch) { + var conf = getConfig(cm); + if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass; + + var pairs = getOption(conf, "pairs"); + var pos = pairs.indexOf(ch); + if (pos == -1) return CodeMirror.Pass; + var triples = getOption(conf, "triples"); + + var identical = pairs.charAt(pos + 1) == ch; + var ranges = cm.listSelections(); + var opening = pos % 2 == 0; + + var type; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i], cur = range.head, curType; + var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1)); + if (opening && !range.empty()) { + curType = "surround"; + } else if ((identical || !opening) && next == ch) { + if (identical && stringStartsAfter(cm, cur)) + curType = "both"; + else if (triples.indexOf(ch) >= 0 && cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == ch + ch + ch) + curType = "skipThree"; + else + curType = "skip"; + } else if (identical && cur.ch > 1 && triples.indexOf(ch) >= 0 && + cm.getRange(Pos(cur.line, cur.ch - 2), cur) == ch + ch && + (cur.ch <= 2 || cm.getRange(Pos(cur.line, cur.ch - 3), Pos(cur.line, cur.ch - 2)) != ch)) { + curType = "addFour"; + } else if (identical) { + if (!CodeMirror.isWordChar(next) && enteringString(cm, cur, ch)) curType = "both"; + else return CodeMirror.Pass; + } else if (opening && (cm.getLine(cur.line).length == cur.ch || + isClosingBracket(next, pairs) || + /\s/.test(next))) { + curType = "both"; + } else { + return CodeMirror.Pass; + } + if (!type) type = curType; + else if (type != curType) return CodeMirror.Pass; + } + + var left = pos % 2 ? pairs.charAt(pos - 1) : ch; + var right = pos % 2 ? ch : pairs.charAt(pos + 1); + cm.operation(function() { + if (type == "skip") { + cm.execCommand("goCharRight"); + } else if (type == "skipThree") { + for (var i = 0; i < 3; i++) + cm.execCommand("goCharRight"); + } else if (type == "surround") { + var sels = cm.getSelections(); + for (var i = 0; i < sels.length; i++) + sels[i] = left + sels[i] + right; + cm.replaceSelections(sels, "around"); + sels = cm.listSelections().slice(); + for (var i = 0; i < sels.length; i++) + sels[i] = contractSelection(sels[i]); + cm.setSelections(sels); + } else if (type == "both") { + cm.replaceSelection(left + right, null); + cm.triggerElectric(left + right); + cm.execCommand("goCharLeft"); + } else if (type == "addFour") { + cm.replaceSelection(left + left + left + left, "before"); + cm.execCommand("goCharRight"); + } + }); + } + + function isClosingBracket(ch, pairs) { + var pos = pairs.lastIndexOf(ch); + return pos > -1 && pos % 2 == 1; + } + + function charsAround(cm, pos) { + var str = cm.getRange(Pos(pos.line, pos.ch - 1), + Pos(pos.line, pos.ch + 1)); + return str.length == 2 ? str : null; + } + + // Project the token type that will exists after the given char is + // typed, and use it to determine whether it would cause the start + // of a string token. + function enteringString(cm, pos, ch) { + var line = cm.getLine(pos.line); + var token = cm.getTokenAt(pos); + if (/\bstring2?\b/.test(token.type) || stringStartsAfter(cm, pos)) return false; + var stream = new CodeMirror.StringStream(line.slice(0, pos.ch) + ch + line.slice(pos.ch), 4); + stream.pos = stream.start = token.start; + for (;;) { + var type1 = cm.getMode().token(stream, token.state); + if (stream.pos >= pos.ch + 1) return /\bstring2?\b/.test(type1); + stream.start = stream.pos; + } + } + + function stringStartsAfter(cm, pos) { + var token = cm.getTokenAt(Pos(pos.line, pos.ch + 1)) + return /\bstring/.test(token.type) && token.start == pos.ch + } +}); diff --git a/cyclone-web/vendor/codeMirror/edit/closetag.js b/cyclone-web/vendor/codeMirror/edit/closetag.js new file mode 100644 index 0000000000000000000000000000000000000000..a518da3ec12aae850d45c61cfbe4da3f25882ce7 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/edit/closetag.js @@ -0,0 +1,169 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +/** + * Tag-closer extension for CodeMirror. + * + * This extension adds an "autoCloseTags" option that can be set to + * either true to get the default behavior, or an object to further + * configure its behavior. + * + * These are supported options: + * + * `whenClosing` (default true) + * Whether to autoclose when the '/' of a closing tag is typed. + * `whenOpening` (default true) + * Whether to autoclose the tag when the final '>' of an opening + * tag is typed. + * `dontCloseTags` (default is empty tags for HTML, none for XML) + * An array of tag names that should not be autoclosed. + * `indentTags` (default is block tags for HTML, none for XML) + * An array of tag names that should, when opened, cause a + * blank line to be added inside the tag, and the blank line and + * closing line to be indented. + * + * See demos/closetag.html for a usage example. + */ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../fold/xml-fold")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../fold/xml-fold"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + CodeMirror.defineOption("autoCloseTags", false, function(cm, val, old) { + if (old != CodeMirror.Init && old) + cm.removeKeyMap("autoCloseTags"); + if (!val) return; + var map = {name: "autoCloseTags"}; + if (typeof val != "object" || val.whenClosing) + map["'/'"] = function(cm) { return autoCloseSlash(cm); }; + if (typeof val != "object" || val.whenOpening) + map["'>'"] = function(cm) { return autoCloseGT(cm); }; + cm.addKeyMap(map); + }); + + var htmlDontClose = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", + "source", "track", "wbr"]; + var htmlIndent = ["applet", "blockquote", "body", "button", "div", "dl", "fieldset", "form", "frameset", "h1", "h2", "h3", "h4", + "h5", "h6", "head", "html", "iframe", "layer", "legend", "object", "ol", "p", "select", "table", "ul"]; + + function autoCloseGT(cm) { + if (cm.getOption("disableInput")) return CodeMirror.Pass; + var ranges = cm.listSelections(), replacements = []; + for (var i = 0; i < ranges.length; i++) { + if (!ranges[i].empty()) return CodeMirror.Pass; + var pos = ranges[i].head, tok = cm.getTokenAt(pos); + var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state; + if (inner.mode.name != "xml" || !state.tagName) return CodeMirror.Pass; + + var opt = cm.getOption("autoCloseTags"), html = inner.mode.configuration == "html"; + var dontCloseTags = (typeof opt == "object" && opt.dontCloseTags) || (html && htmlDontClose); + var indentTags = (typeof opt == "object" && opt.indentTags) || (html && htmlIndent); + + var tagName = state.tagName; + if (tok.end > pos.ch) tagName = tagName.slice(0, tagName.length - tok.end + pos.ch); + var lowerTagName = tagName.toLowerCase(); + // Don't process the '>' at the end of an end-tag or self-closing tag + if (!tagName || + tok.type == "string" && (tok.end != pos.ch || !/[\"\']/.test(tok.string.charAt(tok.string.length - 1)) || tok.string.length == 1) || + tok.type == "tag" && state.type == "closeTag" || + tok.string.indexOf("/") == (tok.string.length - 1) || // match something like <someTagName /> + dontCloseTags && indexOf(dontCloseTags, lowerTagName) > -1 || + closingTagExists(cm, tagName, pos, state, true)) + return CodeMirror.Pass; + + var indent = indentTags && indexOf(indentTags, lowerTagName) > -1; + replacements[i] = {indent: indent, + text: ">" + (indent ? "\n\n" : "") + "</" + tagName + ">", + newPos: indent ? CodeMirror.Pos(pos.line + 1, 0) : CodeMirror.Pos(pos.line, pos.ch + 1)}; + } + + for (var i = ranges.length - 1; i >= 0; i--) { + var info = replacements[i]; + cm.replaceRange(info.text, ranges[i].head, ranges[i].anchor, "+insert"); + var sel = cm.listSelections().slice(0); + sel[i] = {head: info.newPos, anchor: info.newPos}; + cm.setSelections(sel); + if (info.indent) { + cm.indentLine(info.newPos.line, null, true); + cm.indentLine(info.newPos.line + 1, null, true); + } + } + } + + function autoCloseCurrent(cm, typingSlash) { + var ranges = cm.listSelections(), replacements = []; + var head = typingSlash ? "/" : "</"; + for (var i = 0; i < ranges.length; i++) { + if (!ranges[i].empty()) return CodeMirror.Pass; + var pos = ranges[i].head, tok = cm.getTokenAt(pos); + var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state; + if (typingSlash && (tok.type == "string" || tok.string.charAt(0) != "<" || + tok.start != pos.ch - 1)) + return CodeMirror.Pass; + // Kludge to get around the fact that we are not in XML mode + // when completing in JS/CSS snippet in htmlmixed mode. Does not + // work for other XML embedded languages (there is no general + // way to go from a mixed mode to its current XML state). + var replacement; + if (inner.mode.name != "xml") { + if (cm.getMode().name == "htmlmixed" && inner.mode.name == "javascript") + replacement = head + "script"; + else if (cm.getMode().name == "htmlmixed" && inner.mode.name == "css") + replacement = head + "style"; + else + return CodeMirror.Pass; + } else { + if (!state.context || !state.context.tagName || + closingTagExists(cm, state.context.tagName, pos, state)) + return CodeMirror.Pass; + replacement = head + state.context.tagName; + } + if (cm.getLine(pos.line).charAt(tok.end) != ">") replacement += ">"; + replacements[i] = replacement; + } + cm.replaceSelections(replacements); + ranges = cm.listSelections(); + for (var i = 0; i < ranges.length; i++) + if (i == ranges.length - 1 || ranges[i].head.line < ranges[i + 1].head.line) + cm.indentLine(ranges[i].head.line); + } + + function autoCloseSlash(cm) { + if (cm.getOption("disableInput")) return CodeMirror.Pass; + return autoCloseCurrent(cm, true); + } + + CodeMirror.commands.closeTag = function(cm) { return autoCloseCurrent(cm); }; + + function indexOf(collection, elt) { + if (collection.indexOf) return collection.indexOf(elt); + for (var i = 0, e = collection.length; i < e; ++i) + if (collection[i] == elt) return i; + return -1; + } + + // If xml-fold is loaded, we use its functionality to try and verify + // whether a given tag is actually unclosed. + function closingTagExists(cm, tagName, pos, state, newTag) { + if (!CodeMirror.scanForClosingTag) return false; + var end = Math.min(cm.lastLine() + 1, pos.line + 500); + var nextClose = CodeMirror.scanForClosingTag(cm, pos, null, end); + if (!nextClose || nextClose.tag != tagName) return false; + var cx = state.context; + // If the immediate wrapping context contains onCx instances of + // the same tag, a closing tag only exists if there are at least + // that many closing tags of that type following. + for (var onCx = newTag ? 1 : 0; cx && cx.tagName == tagName; cx = cx.prev) ++onCx; + pos = nextClose.to; + for (var i = 1; i < onCx; i++) { + var next = CodeMirror.scanForClosingTag(cm, pos, null, end); + if (!next || next.tag != tagName) return false; + pos = next.to; + } + return true; + } +}); diff --git a/cyclone-web/vendor/codeMirror/edit/continuelist.js b/cyclone-web/vendor/codeMirror/edit/continuelist.js new file mode 100644 index 0000000000000000000000000000000000000000..f13e521993114b2fef3138a21b71feafbb8c45d7 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/edit/continuelist.js @@ -0,0 +1,51 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/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 listRE = /^(\s*)(>[> ]*|[*+-] \[[x ]\]\s|[*+-]\s|(\d+)([.)]))(\s*)/, + emptyListRE = /^(\s*)(>[> ]*|[*+-] \[[x ]\]|[*+-]|(\d+)[.)])(\s*)$/, + unorderedListRE = /[*+-]\s/; + + CodeMirror.commands.newlineAndIndentContinueMarkdownList = function(cm) { + if (cm.getOption("disableInput")) return CodeMirror.Pass; + var ranges = cm.listSelections(), replacements = []; + for (var i = 0; i < ranges.length; i++) { + var pos = ranges[i].head; + var eolState = cm.getStateAfter(pos.line); + var inList = eolState.list !== false; + var inQuote = eolState.quote !== 0; + + var line = cm.getLine(pos.line), match = listRE.exec(line); + if (!ranges[i].empty() || (!inList && !inQuote) || !match) { + cm.execCommand("newlineAndIndent"); + return; + } + if (emptyListRE.test(line)) { + if (!/>\s*$/.test(line)) cm.replaceRange("", { + line: pos.line, ch: 0 + }, { + line: pos.line, ch: pos.ch + 1 + }); + replacements[i] = "\n"; + } else { + var indent = match[1], after = match[5]; + var bullet = unorderedListRE.test(match[2]) || match[2].indexOf(">") >= 0 + ? match[2].replace("x", " ") + : (parseInt(match[3], 10) + 1) + match[4]; + + replacements[i] = "\n" + indent + bullet + after; + } + } + + cm.replaceSelections(replacements); + }; +}); diff --git a/cyclone-web/vendor/codeMirror/edit/matchbrackets.js b/cyclone-web/vendor/codeMirror/edit/matchbrackets.js new file mode 100644 index 0000000000000000000000000000000000000000..76754ed557fe03c0449cbadd4b927151a3be898d --- /dev/null +++ b/cyclone-web/vendor/codeMirror/edit/matchbrackets.js @@ -0,0 +1,122 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/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) { + var ie_lt8 = /MSIE \d/.test(navigator.userAgent) && + (document.documentMode == null || document.documentMode < 8); + + var Pos = CodeMirror.Pos; + + var matching = {"(": ")>", ")": "(<", "[": "]>", "]": "[<", "{": "}>", "}": "{<"}; + + function findMatchingBracket(cm, where, strict, config) { + var line = cm.getLineHandle(where.line), pos = where.ch - 1; + var match = (pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)]; + if (!match) return null; + var dir = match.charAt(1) == ">" ? 1 : -1; + if (strict && (dir > 0) != (pos == where.ch)) return null; + var style = cm.getTokenTypeAt(Pos(where.line, pos + 1)); + + var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style || null, config); + if (found == null) return null; + return {from: Pos(where.line, pos), to: found && found.pos, + match: found && found.ch == match.charAt(0), forward: dir > 0}; + } + + // bracketRegex is used to specify which type of bracket to scan + // should be a regexp, e.g. /[[\]]/ + // + // Note: If "where" is on an open bracket, then this bracket is ignored. + // + // Returns false when no bracket was found, null when it reached + // maxScanLines and gave up + function scanForBracket(cm, where, dir, style, config) { + var maxScanLen = (config && config.maxScanLineLength) || 10000; + var maxScanLines = (config && config.maxScanLines) || 1000; + + var stack = []; + var re = config && config.bracketRegex ? config.bracketRegex : /[(){}[\]]/; + var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1) + : Math.max(cm.firstLine() - 1, where.line - maxScanLines); + for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) { + var line = cm.getLine(lineNo); + if (!line) continue; + var pos = dir > 0 ? 0 : line.length - 1, end = dir > 0 ? line.length : -1; + if (line.length > maxScanLen) continue; + if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0); + for (; pos != end; pos += dir) { + var ch = line.charAt(pos); + if (re.test(ch) && (style === undefined || cm.getTokenTypeAt(Pos(lineNo, pos + 1)) == style)) { + var match = matching[ch]; + if ((match.charAt(1) == ">") == (dir > 0)) stack.push(ch); + else if (!stack.length) return {pos: Pos(lineNo, pos), ch: ch}; + else stack.pop(); + } + } + } + return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null; + } + + function matchBrackets(cm, autoclear, config) { + // Disable brace matching in long lines, since it'll cause hugely slow updates + var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000; + var marks = [], ranges = cm.listSelections(); + for (var i = 0; i < ranges.length; i++) { + var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, false, config); + if (match && cm.getLine(match.from.line).length <= maxHighlightLen) { + var style = match.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket"; + marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), {className: style})); + if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen) + marks.push(cm.markText(match.to, Pos(match.to.line, match.to.ch + 1), {className: style})); + } + } + + if (marks.length) { + // Kludge to work around the IE bug from issue #1193, where text + // input stops going to the textare whever this fires. + if (ie_lt8 && cm.state.focused) cm.focus(); + + var clear = function() { + cm.operation(function() { + for (var i = 0; i < marks.length; i++) marks[i].clear(); + }); + }; + if (autoclear) setTimeout(clear, 800); + else return clear; + } + } + + var currentlyHighlighted = null; + function doMatchBrackets(cm) { + cm.operation(function() { + if (currentlyHighlighted) {currentlyHighlighted(); currentlyHighlighted = null;} + currentlyHighlighted = matchBrackets(cm, false, cm.state.matchBrackets); + }); + } + + CodeMirror.defineOption("matchBrackets", false, function(cm, val, old) { + if (old && old != CodeMirror.Init) { + cm.off("cursorActivity", doMatchBrackets); + if (currentlyHighlighted) {currentlyHighlighted(); currentlyHighlighted = null;} + } + if (val) { + cm.state.matchBrackets = typeof val == "object" ? val : {}; + cm.on("cursorActivity", doMatchBrackets); + } + }); + + CodeMirror.defineExtension("matchBrackets", function() {matchBrackets(this, true);}); + CodeMirror.defineExtension("findMatchingBracket", function(pos, strict, config){ + return findMatchingBracket(this, pos, strict, config); + }); + CodeMirror.defineExtension("scanForBracket", function(pos, dir, style, config){ + return scanForBracket(this, pos, dir, style, config); + }); +}); diff --git a/cyclone-web/vendor/codeMirror/edit/matchtags.js b/cyclone-web/vendor/codeMirror/edit/matchtags.js new file mode 100644 index 0000000000000000000000000000000000000000..fb1911a8db73c4a0b87114140f4cde2d7bf40b70 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/edit/matchtags.js @@ -0,0 +1,66 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../fold/xml-fold")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../fold/xml-fold"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineOption("matchTags", false, function(cm, val, old) { + if (old && old != CodeMirror.Init) { + cm.off("cursorActivity", doMatchTags); + cm.off("viewportChange", maybeUpdateMatch); + clear(cm); + } + if (val) { + cm.state.matchBothTags = typeof val == "object" && val.bothTags; + cm.on("cursorActivity", doMatchTags); + cm.on("viewportChange", maybeUpdateMatch); + doMatchTags(cm); + } + }); + + function clear(cm) { + if (cm.state.tagHit) cm.state.tagHit.clear(); + if (cm.state.tagOther) cm.state.tagOther.clear(); + cm.state.tagHit = cm.state.tagOther = null; + } + + function doMatchTags(cm) { + cm.state.failedTagMatch = false; + cm.operation(function() { + clear(cm); + if (cm.somethingSelected()) return; + var cur = cm.getCursor(), range = cm.getViewport(); + range.from = Math.min(range.from, cur.line); range.to = Math.max(cur.line + 1, range.to); + var match = CodeMirror.findMatchingTag(cm, cur, range); + if (!match) return; + if (cm.state.matchBothTags) { + var hit = match.at == "open" ? match.open : match.close; + if (hit) cm.state.tagHit = cm.markText(hit.from, hit.to, {className: "CodeMirror-matchingtag"}); + } + var other = match.at == "close" ? match.open : match.close; + if (other) + cm.state.tagOther = cm.markText(other.from, other.to, {className: "CodeMirror-matchingtag"}); + else + cm.state.failedTagMatch = true; + }); + } + + function maybeUpdateMatch(cm) { + if (cm.state.failedTagMatch) doMatchTags(cm); + } + + CodeMirror.commands.toMatchingTag = function(cm) { + var found = CodeMirror.findMatchingTag(cm, cm.getCursor()); + if (found) { + var other = found.at == "close" ? found.open : found.close; + if (other) cm.extendSelection(other.to, other.from); + } + }; +}); diff --git a/cyclone-web/vendor/codeMirror/edit/trailingspace.js b/cyclone-web/vendor/codeMirror/edit/trailingspace.js new file mode 100644 index 0000000000000000000000000000000000000000..fa7b56be51017983fcd3587833892946beff688a --- /dev/null +++ b/cyclone-web/vendor/codeMirror/edit/trailingspace.js @@ -0,0 +1,27 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/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) { + CodeMirror.defineOption("showTrailingSpace", false, function(cm, val, prev) { + if (prev == CodeMirror.Init) prev = false; + if (prev && !val) + cm.removeOverlay("trailingspace"); + else if (!prev && val) + cm.addOverlay({ + token: function(stream) { + for (var l = stream.string.length, i = l; i && /\s/.test(stream.string.charAt(i - 1)); --i) {} + if (i > stream.pos) { stream.pos = i; return null; } + stream.pos = l; + return "trailingspace"; + }, + name: "trailingspace" + }); + }); +}); diff --git a/cyclone-web/vendor/codeMirror/erlang-dark.css b/cyclone-web/vendor/codeMirror/erlang-dark.css new file mode 100644 index 0000000000000000000000000000000000000000..8c8a4171a6079d22f412a057ffa5e986f51d9004 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/erlang-dark.css @@ -0,0 +1,34 @@ +.cm-s-erlang-dark.CodeMirror { background: #002240; color: white; } +.cm-s-erlang-dark div.CodeMirror-selected { background: #b36539; } +.cm-s-erlang-dark .CodeMirror-line::selection, .cm-s-erlang-dark .CodeMirror-line > span::selection, .cm-s-erlang-dark .CodeMirror-line > span > span::selection { background: rgba(179, 101, 57, .99); } +.cm-s-erlang-dark .CodeMirror-line::-moz-selection, .cm-s-erlang-dark .CodeMirror-line > span::-moz-selection, .cm-s-erlang-dark .CodeMirror-line > span > span::-moz-selection { background: rgba(179, 101, 57, .99); } +.cm-s-erlang-dark .CodeMirror-gutters { background: #002240; border-right: 1px solid #aaa; } +.cm-s-erlang-dark .CodeMirror-guttermarker { color: white; } +.cm-s-erlang-dark .CodeMirror-guttermarker-subtle { color: #d0d0d0; } +.cm-s-erlang-dark .CodeMirror-linenumber { color: #d0d0d0; } +.cm-s-erlang-dark .CodeMirror-cursor { border-left: 1px solid white; } + +.cm-s-erlang-dark span.cm-quote { color: #ccc; } +.cm-s-erlang-dark span.cm-atom { color: #f133f1; } +.cm-s-erlang-dark span.cm-attribute { color: #ff80e1; } +.cm-s-erlang-dark span.cm-bracket { color: #ff9d00; } +.cm-s-erlang-dark span.cm-builtin { color: #eaa; } +.cm-s-erlang-dark span.cm-comment { color: #77f; } +.cm-s-erlang-dark span.cm-def { color: #e7a; } +.cm-s-erlang-dark span.cm-keyword { color: #ffee80; } +.cm-s-erlang-dark span.cm-meta { color: #50fefe; } +.cm-s-erlang-dark span.cm-number { color: #ffd0d0; } +.cm-s-erlang-dark span.cm-operator { color: #d55; } +.cm-s-erlang-dark span.cm-property { color: #ccc; } +.cm-s-erlang-dark span.cm-qualifier { color: #ccc; } +.cm-s-erlang-dark span.cm-special { color: #ffbbbb; } +.cm-s-erlang-dark span.cm-string { color: #3ad900; } +.cm-s-erlang-dark span.cm-string-2 { color: #ccc; } +.cm-s-erlang-dark span.cm-tag { color: #9effff; } +.cm-s-erlang-dark span.cm-variable { color: #50fe50; } +.cm-s-erlang-dark span.cm-variable-2 { color: #e0e; } +.cm-s-erlang-dark span.cm-variable-3, .cm-s-erlang-dark span.cm-type { color: #ccc; } +.cm-s-erlang-dark span.cm-error { color: #9d1e15; } + +.cm-s-erlang-dark .CodeMirror-activeline-background { background: #013461; } +.cm-s-erlang-dark .CodeMirror-matchingbracket { outline:1px solid grey; color:white !important; } diff --git a/cyclone-web/vendor/codeMirror/fold/brace-fold.js b/cyclone-web/vendor/codeMirror/fold/brace-fold.js new file mode 100644 index 0000000000000000000000000000000000000000..13c0f0cd886f0211958b9313a6cb2119b16bc131 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/fold/brace-fold.js @@ -0,0 +1,105 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/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.registerHelper("fold", "brace", function(cm, start) { + var line = start.line, lineText = cm.getLine(line); + var tokenType; + + function findOpening(openCh) { + for (var at = start.ch, pass = 0;;) { + var found = at <= 0 ? -1 : lineText.lastIndexOf(openCh, at - 1); + if (found == -1) { + if (pass == 1) break; + pass = 1; + at = lineText.length; + continue; + } + if (pass == 1 && found < start.ch) break; + tokenType = cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1)); + if (!/^(comment|string)/.test(tokenType)) return found + 1; + at = found - 1; + } + } + + var startToken = "{", endToken = "}", startCh = findOpening("{"); + if (startCh == null) { + startToken = "[", endToken = "]"; + startCh = findOpening("["); + } + + if (startCh == null) return; + var count = 1, lastLine = cm.lastLine(), end, endCh; + outer: for (var i = line; i <= lastLine; ++i) { + var text = cm.getLine(i), pos = i == line ? startCh : 0; + for (;;) { + var nextOpen = text.indexOf(startToken, pos), nextClose = text.indexOf(endToken, pos); + if (nextOpen < 0) nextOpen = text.length; + if (nextClose < 0) nextClose = text.length; + pos = Math.min(nextOpen, nextClose); + if (pos == text.length) break; + if (cm.getTokenTypeAt(CodeMirror.Pos(i, pos + 1)) == tokenType) { + if (pos == nextOpen) ++count; + else if (!--count) { end = i; endCh = pos; break outer; } + } + ++pos; + } + } + if (end == null || line == end && endCh == startCh) return; + return {from: CodeMirror.Pos(line, startCh), + to: CodeMirror.Pos(end, endCh)}; +}); + +CodeMirror.registerHelper("fold", "import", function(cm, start) { + function hasImport(line) { + if (line < cm.firstLine() || line > cm.lastLine()) return null; + var start = cm.getTokenAt(CodeMirror.Pos(line, 1)); + if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1)); + if (start.type != "keyword" || start.string != "import") return null; + // Now find closing semicolon, return its position + for (var i = line, e = Math.min(cm.lastLine(), line + 10); i <= e; ++i) { + var text = cm.getLine(i), semi = text.indexOf(";"); + if (semi != -1) return {startCh: start.end, end: CodeMirror.Pos(i, semi)}; + } + } + + var startLine = start.line, has = hasImport(startLine), prev; + if (!has || hasImport(startLine - 1) || ((prev = hasImport(startLine - 2)) && prev.end.line == startLine - 1)) + return null; + for (var end = has.end;;) { + var next = hasImport(end.line + 1); + if (next == null) break; + end = next.end; + } + return {from: cm.clipPos(CodeMirror.Pos(startLine, has.startCh + 1)), to: end}; +}); + +CodeMirror.registerHelper("fold", "include", function(cm, start) { + function hasInclude(line) { + if (line < cm.firstLine() || line > cm.lastLine()) return null; + var start = cm.getTokenAt(CodeMirror.Pos(line, 1)); + if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1)); + if (start.type == "meta" && start.string.slice(0, 8) == "#include") return start.start + 8; + } + + var startLine = start.line, has = hasInclude(startLine); + if (has == null || hasInclude(startLine - 1) != null) return null; + for (var end = startLine;;) { + var next = hasInclude(end + 1); + if (next == null) break; + ++end; + } + return {from: CodeMirror.Pos(startLine, has + 1), + to: cm.clipPos(CodeMirror.Pos(end))}; +}); + +}); diff --git a/cyclone-web/vendor/codeMirror/fold/comment-fold.js b/cyclone-web/vendor/codeMirror/fold/comment-fold.js new file mode 100644 index 0000000000000000000000000000000000000000..e8d800eb59e7c73cf86f425f2a19bb8d79a56f6a --- /dev/null +++ b/cyclone-web/vendor/codeMirror/fold/comment-fold.js @@ -0,0 +1,59 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/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.registerGlobalHelper("fold", "comment", function(mode) { + return mode.blockCommentStart && mode.blockCommentEnd; +}, function(cm, start) { + var mode = cm.getModeAt(start), startToken = mode.blockCommentStart, endToken = mode.blockCommentEnd; + if (!startToken || !endToken) return; + var line = start.line, lineText = cm.getLine(line); + + var startCh; + for (var at = start.ch, pass = 0;;) { + var found = at <= 0 ? -1 : lineText.lastIndexOf(startToken, at - 1); + if (found == -1) { + if (pass == 1) return; + pass = 1; + at = lineText.length; + continue; + } + if (pass == 1 && found < start.ch) return; + if (/comment/.test(cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1))) && + (found == 0 || lineText.slice(found - endToken.length, found) == endToken || + !/comment/.test(cm.getTokenTypeAt(CodeMirror.Pos(line, found))))) { + startCh = found + startToken.length; + break; + } + at = found - 1; + } + + var depth = 1, lastLine = cm.lastLine(), end, endCh; + outer: for (var i = line; i <= lastLine; ++i) { + var text = cm.getLine(i), pos = i == line ? startCh : 0; + for (;;) { + var nextOpen = text.indexOf(startToken, pos), nextClose = text.indexOf(endToken, pos); + if (nextOpen < 0) nextOpen = text.length; + if (nextClose < 0) nextClose = text.length; + pos = Math.min(nextOpen, nextClose); + if (pos == text.length) break; + if (pos == nextOpen) ++depth; + else if (!--depth) { end = i; endCh = pos; break outer; } + ++pos; + } + } + if (end == null || line == end && endCh == startCh) return; + return {from: CodeMirror.Pos(line, startCh), + to: CodeMirror.Pos(end, endCh)}; +}); + +}); diff --git a/cyclone-web/vendor/codeMirror/fold/foldcode.js b/cyclone-web/vendor/codeMirror/fold/foldcode.js new file mode 100644 index 0000000000000000000000000000000000000000..78b36c4641985eafc6f040c86cfebe4bee9dc7ae --- /dev/null +++ b/cyclone-web/vendor/codeMirror/fold/foldcode.js @@ -0,0 +1,150 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/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 doFold(cm, pos, options, force) { + if (options && options.call) { + var finder = options; + options = null; + } else { + var finder = getOption(cm, options, "rangeFinder"); + } + if (typeof pos == "number") pos = CodeMirror.Pos(pos, 0); + var minSize = getOption(cm, options, "minFoldSize"); + + function getRange(allowFolded) { + var range = finder(cm, pos); + if (!range || range.to.line - range.from.line < minSize) return null; + var marks = cm.findMarksAt(range.from); + for (var i = 0; i < marks.length; ++i) { + if (marks[i].__isFold && force !== "fold") { + if (!allowFolded) return null; + range.cleared = true; + marks[i].clear(); + } + } + return range; + } + + var range = getRange(true); + if (getOption(cm, options, "scanUp")) while (!range && pos.line > cm.firstLine()) { + pos = CodeMirror.Pos(pos.line - 1, 0); + range = getRange(false); + } + if (!range || range.cleared || force === "unfold") return; + + var myWidget = makeWidget(cm, options); + CodeMirror.on(myWidget, "mousedown", function(e) { + myRange.clear(); + CodeMirror.e_preventDefault(e); + }); + var myRange = cm.markText(range.from, range.to, { + replacedWith: myWidget, + clearOnEnter: getOption(cm, options, "clearOnEnter"), + __isFold: true + }); + myRange.on("clear", function(from, to) { + CodeMirror.signal(cm, "unfold", cm, from, to); + }); + CodeMirror.signal(cm, "fold", cm, range.from, range.to); + } + + function makeWidget(cm, options) { + var widget = getOption(cm, options, "widget"); + if (typeof widget == "string") { + var text = document.createTextNode(widget); + widget = document.createElement("span"); + widget.appendChild(text); + widget.className = "CodeMirror-foldmarker"; + } + return widget; + } + + // Clumsy backwards-compatible interface + CodeMirror.newFoldFunction = function(rangeFinder, widget) { + return function(cm, pos) { doFold(cm, pos, {rangeFinder: rangeFinder, widget: widget}); }; + }; + + // New-style interface + CodeMirror.defineExtension("foldCode", function(pos, options, force) { + doFold(this, pos, options, force); + }); + + CodeMirror.defineExtension("isFolded", function(pos) { + var marks = this.findMarksAt(pos); + for (var i = 0; i < marks.length; ++i) + if (marks[i].__isFold) return true; + }); + + CodeMirror.commands.toggleFold = function(cm) { + cm.foldCode(cm.getCursor()); + }; + CodeMirror.commands.fold = function(cm) { + cm.foldCode(cm.getCursor(), null, "fold"); + }; + CodeMirror.commands.unfold = function(cm) { + cm.foldCode(cm.getCursor(), null, "unfold"); + }; + CodeMirror.commands.foldAll = function(cm) { + cm.operation(function() { + for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++) + cm.foldCode(CodeMirror.Pos(i, 0), null, "fold"); + }); + }; + CodeMirror.commands.unfoldAll = function(cm) { + cm.operation(function() { + for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++) + cm.foldCode(CodeMirror.Pos(i, 0), null, "unfold"); + }); + }; + + CodeMirror.registerHelper("fold", "combine", function() { + var funcs = Array.prototype.slice.call(arguments, 0); + return function(cm, start) { + for (var i = 0; i < funcs.length; ++i) { + var found = funcs[i](cm, start); + if (found) return found; + } + }; + }); + + CodeMirror.registerHelper("fold", "auto", function(cm, start) { + var helpers = cm.getHelpers(start, "fold"); + for (var i = 0; i < helpers.length; i++) { + var cur = helpers[i](cm, start); + if (cur) return cur; + } + }); + + var defaultOptions = { + rangeFinder: CodeMirror.fold.auto, + widget: "\u2194", + minFoldSize: 0, + scanUp: false, + clearOnEnter: true + }; + + CodeMirror.defineOption("foldOptions", null); + + function getOption(cm, options, name) { + if (options && options[name] !== undefined) + return options[name]; + var editorOptions = cm.options.foldOptions; + if (editorOptions && editorOptions[name] !== undefined) + return editorOptions[name]; + return defaultOptions[name]; + } + + CodeMirror.defineExtension("foldOption", function(options, name) { + return getOption(this, options, name); + }); +}); diff --git a/cyclone-web/vendor/codeMirror/fold/foldgutter.css b/cyclone-web/vendor/codeMirror/fold/foldgutter.css new file mode 100644 index 0000000000000000000000000000000000000000..ad19ae2d3ee19e83124c683ebc85410055920d80 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/fold/foldgutter.css @@ -0,0 +1,20 @@ +.CodeMirror-foldmarker { + color: blue; + text-shadow: #b9f 1px 1px 2px, #b9f -1px -1px 2px, #b9f 1px -1px 2px, #b9f -1px 1px 2px; + font-family: arial; + line-height: .3; + cursor: pointer; +} +.CodeMirror-foldgutter { + width: .7em; +} +.CodeMirror-foldgutter-open, +.CodeMirror-foldgutter-folded { + cursor: pointer; +} +.CodeMirror-foldgutter-open:after { + content: "\25BE"; +} +.CodeMirror-foldgutter-folded:after { + content: "\25B8"; +} diff --git a/cyclone-web/vendor/codeMirror/fold/foldgutter.js b/cyclone-web/vendor/codeMirror/fold/foldgutter.js new file mode 100644 index 0000000000000000000000000000000000000000..9d323265663b1d53d725bf3edac78b63681d045a --- /dev/null +++ b/cyclone-web/vendor/codeMirror/fold/foldgutter.js @@ -0,0 +1,146 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("./foldcode")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "./foldcode"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineOption("foldGutter", false, function(cm, val, old) { + if (old && old != CodeMirror.Init) { + cm.clearGutter(cm.state.foldGutter.options.gutter); + cm.state.foldGutter = null; + cm.off("gutterClick", onGutterClick); + cm.off("change", onChange); + cm.off("viewportChange", onViewportChange); + cm.off("fold", onFold); + cm.off("unfold", onFold); + cm.off("swapDoc", onChange); + } + if (val) { + cm.state.foldGutter = new State(parseOptions(val)); + updateInViewport(cm); + cm.on("gutterClick", onGutterClick); + cm.on("change", onChange); + cm.on("viewportChange", onViewportChange); + cm.on("fold", onFold); + cm.on("unfold", onFold); + cm.on("swapDoc", onChange); + } + }); + + var Pos = CodeMirror.Pos; + + function State(options) { + this.options = options; + this.from = this.to = 0; + } + + function parseOptions(opts) { + if (opts === true) opts = {}; + if (opts.gutter == null) opts.gutter = "CodeMirror-foldgutter"; + if (opts.indicatorOpen == null) opts.indicatorOpen = "CodeMirror-foldgutter-open"; + if (opts.indicatorFolded == null) opts.indicatorFolded = "CodeMirror-foldgutter-folded"; + return opts; + } + + function isFolded(cm, line) { + var marks = cm.findMarks(Pos(line, 0), Pos(line + 1, 0)); + for (var i = 0; i < marks.length; ++i) + if (marks[i].__isFold && marks[i].find().from.line == line) return marks[i]; + } + + function marker(spec) { + if (typeof spec == "string") { + var elt = document.createElement("div"); + elt.className = spec + " CodeMirror-guttermarker-subtle"; + return elt; + } else { + return spec.cloneNode(true); + } + } + + function updateFoldInfo(cm, from, to) { + var opts = cm.state.foldGutter.options, cur = from; + var minSize = cm.foldOption(opts, "minFoldSize"); + var func = cm.foldOption(opts, "rangeFinder"); + cm.eachLine(from, to, function(line) { + var mark = null; + if (isFolded(cm, cur)) { + mark = marker(opts.indicatorFolded); + } else { + var pos = Pos(cur, 0); + var range = func && func(cm, pos); + if (range && range.to.line - range.from.line >= minSize) + mark = marker(opts.indicatorOpen); + } + cm.setGutterMarker(line, opts.gutter, mark); + ++cur; + }); + } + + function updateInViewport(cm) { + var vp = cm.getViewport(), state = cm.state.foldGutter; + if (!state) return; + cm.operation(function() { + updateFoldInfo(cm, vp.from, vp.to); + }); + state.from = vp.from; state.to = vp.to; + } + + function onGutterClick(cm, line, gutter) { + var state = cm.state.foldGutter; + if (!state) return; + var opts = state.options; + if (gutter != opts.gutter) return; + var folded = isFolded(cm, line); + if (folded) folded.clear(); + else cm.foldCode(Pos(line, 0), opts.rangeFinder); + } + + function onChange(cm) { + var state = cm.state.foldGutter; + if (!state) return; + var opts = state.options; + state.from = state.to = 0; + clearTimeout(state.changeUpdate); + state.changeUpdate = setTimeout(function() { updateInViewport(cm); }, opts.foldOnChangeTimeSpan || 600); + } + + function onViewportChange(cm) { + var state = cm.state.foldGutter; + if (!state) return; + var opts = state.options; + clearTimeout(state.changeUpdate); + state.changeUpdate = setTimeout(function() { + var vp = cm.getViewport(); + if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) { + updateInViewport(cm); + } else { + cm.operation(function() { + if (vp.from < state.from) { + updateFoldInfo(cm, vp.from, state.from); + state.from = vp.from; + } + if (vp.to > state.to) { + updateFoldInfo(cm, state.to, vp.to); + state.to = vp.to; + } + }); + } + }, opts.updateViewportTimeSpan || 400); + } + + function onFold(cm, from) { + var state = cm.state.foldGutter; + if (!state) return; + var line = from.line; + if (line >= state.from && line < state.to) + updateFoldInfo(cm, line, line + 1); + } +}); diff --git a/cyclone-web/vendor/codeMirror/fold/indent-fold.js b/cyclone-web/vendor/codeMirror/fold/indent-fold.js new file mode 100644 index 0000000000000000000000000000000000000000..743150c6238e0815010c56aca599559cb2052b6b --- /dev/null +++ b/cyclone-web/vendor/codeMirror/fold/indent-fold.js @@ -0,0 +1,48 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/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 lineIndent(cm, lineNo) { + var text = cm.getLine(lineNo) + var spaceTo = text.search(/\S/) + if (spaceTo == -1 || /\bcomment\b/.test(cm.getTokenTypeAt(CodeMirror.Pos(lineNo, spaceTo + 1)))) + return -1 + return CodeMirror.countColumn(text, null, cm.getOption("tabSize")) +} + ! +CodeMirror.registerHelper("fold", "indent", function(cm, start) { + var myIndent = lineIndent(cm, start.line) + if (myIndent < 0) return + var lastLineInFold = null + + // Go through lines until we find a line that definitely doesn't belong in + // the block we're folding, or to the end. + for (var i = start.line + 1, end = cm.lastLine(); i <= end; ++i) { + var indent = lineIndent(cm, i) + if (indent == -1) { + } else if (indent > myIndent) { + // Lines with a greater indent are considered part of the block. + lastLineInFold = i; + } else { + // If this line has non-space, non-comment content, and is + // indented less or equal to the start line, it is the start of + // another block. + break; + } + } + if (lastLineInFold) return { + from: CodeMirror.Pos(start.line, cm.getLine(start.line).length), + to: CodeMirror.Pos(lastLineInFold, cm.getLine(lastLineInFold).length) + }; +}); + +}); diff --git a/cyclone-web/vendor/codeMirror/fold/markdown-fold.js b/cyclone-web/vendor/codeMirror/fold/markdown-fold.js new file mode 100644 index 0000000000000000000000000000000000000000..ce84c946ce8c9e6be5eab32f87f8df450d065519 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/fold/markdown-fold.js @@ -0,0 +1,49 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/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.registerHelper("fold", "markdown", function(cm, start) { + var maxDepth = 100; + + function isHeader(lineNo) { + var tokentype = cm.getTokenTypeAt(CodeMirror.Pos(lineNo, 0)); + return tokentype && /\bheader\b/.test(tokentype); + } + + function headerLevel(lineNo, line, nextLine) { + var match = line && line.match(/^#+/); + if (match && isHeader(lineNo)) return match[0].length; + match = nextLine && nextLine.match(/^[=\-]+\s*$/); + if (match && isHeader(lineNo + 1)) return nextLine[0] == "=" ? 1 : 2; + return maxDepth; + } + + var firstLine = cm.getLine(start.line), nextLine = cm.getLine(start.line + 1); + var level = headerLevel(start.line, firstLine, nextLine); + if (level === maxDepth) return undefined; + + var lastLineNo = cm.lastLine(); + var end = start.line, nextNextLine = cm.getLine(end + 2); + while (end < lastLineNo) { + if (headerLevel(end + 1, nextLine, nextNextLine) <= level) break; + ++end; + nextLine = nextNextLine; + nextNextLine = cm.getLine(end + 2); + } + + return { + from: CodeMirror.Pos(start.line, firstLine.length), + to: CodeMirror.Pos(end, cm.getLine(end).length) + }; +}); + +}); diff --git a/cyclone-web/vendor/codeMirror/fold/xml-fold.js b/cyclone-web/vendor/codeMirror/fold/xml-fold.js new file mode 100644 index 0000000000000000000000000000000000000000..08e2149553e73547ea64d6da9ca75ecbefd51d2d --- /dev/null +++ b/cyclone-web/vendor/codeMirror/fold/xml-fold.js @@ -0,0 +1,182 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/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 Pos = CodeMirror.Pos; + function cmp(a, b) { return a.line - b.line || a.ch - b.ch; } + + var nameStartChar = "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"; + var nameChar = nameStartChar + "\-\:\.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040"; + var xmlTagStart = new RegExp("<(/?)([" + nameStartChar + "][" + nameChar + "]*)", "g"); + + function Iter(cm, line, ch, range) { + this.line = line; this.ch = ch; + this.cm = cm; this.text = cm.getLine(line); + this.min = range ? Math.max(range.from, cm.firstLine()) : cm.firstLine(); + this.max = range ? Math.min(range.to - 1, cm.lastLine()) : cm.lastLine(); + } + + function tagAt(iter, ch) { + var type = iter.cm.getTokenTypeAt(Pos(iter.line, ch)); + return type && /\btag\b/.test(type); + } + + function nextLine(iter) { + if (iter.line >= iter.max) return; + iter.ch = 0; + iter.text = iter.cm.getLine(++iter.line); + return true; + } + function prevLine(iter) { + if (iter.line <= iter.min) return; + iter.text = iter.cm.getLine(--iter.line); + iter.ch = iter.text.length; + return true; + } + + function toTagEnd(iter) { + for (;;) { + var gt = iter.text.indexOf(">", iter.ch); + if (gt == -1) { if (nextLine(iter)) continue; else return; } + if (!tagAt(iter, gt + 1)) { iter.ch = gt + 1; continue; } + var lastSlash = iter.text.lastIndexOf("/", gt); + var selfClose = lastSlash > -1 && !/\S/.test(iter.text.slice(lastSlash + 1, gt)); + iter.ch = gt + 1; + return selfClose ? "selfClose" : "regular"; + } + } + function toTagStart(iter) { + for (;;) { + var lt = iter.ch ? iter.text.lastIndexOf("<", iter.ch - 1) : -1; + if (lt == -1) { if (prevLine(iter)) continue; else return; } + if (!tagAt(iter, lt + 1)) { iter.ch = lt; continue; } + xmlTagStart.lastIndex = lt; + iter.ch = lt; + var match = xmlTagStart.exec(iter.text); + if (match && match.index == lt) return match; + } + } + + function toNextTag(iter) { + for (;;) { + xmlTagStart.lastIndex = iter.ch; + var found = xmlTagStart.exec(iter.text); + if (!found) { if (nextLine(iter)) continue; else return; } + if (!tagAt(iter, found.index + 1)) { iter.ch = found.index + 1; continue; } + iter.ch = found.index + found[0].length; + return found; + } + } + function toPrevTag(iter) { + for (;;) { + var gt = iter.ch ? iter.text.lastIndexOf(">", iter.ch - 1) : -1; + if (gt == -1) { if (prevLine(iter)) continue; else return; } + if (!tagAt(iter, gt + 1)) { iter.ch = gt; continue; } + var lastSlash = iter.text.lastIndexOf("/", gt); + var selfClose = lastSlash > -1 && !/\S/.test(iter.text.slice(lastSlash + 1, gt)); + iter.ch = gt + 1; + return selfClose ? "selfClose" : "regular"; + } + } + + function findMatchingClose(iter, tag) { + var stack = []; + for (;;) { + var next = toNextTag(iter), end, startLine = iter.line, startCh = iter.ch - (next ? next[0].length : 0); + if (!next || !(end = toTagEnd(iter))) return; + if (end == "selfClose") continue; + if (next[1]) { // closing tag + for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == next[2]) { + stack.length = i; + break; + } + if (i < 0 && (!tag || tag == next[2])) return { + tag: next[2], + from: Pos(startLine, startCh), + to: Pos(iter.line, iter.ch) + }; + } else { // opening tag + stack.push(next[2]); + } + } + } + function findMatchingOpen(iter, tag) { + var stack = []; + for (;;) { + var prev = toPrevTag(iter); + if (!prev) return; + if (prev == "selfClose") { toTagStart(iter); continue; } + var endLine = iter.line, endCh = iter.ch; + var start = toTagStart(iter); + if (!start) return; + if (start[1]) { // closing tag + stack.push(start[2]); + } else { // opening tag + for (var i = stack.length - 1; i >= 0; --i) if (stack[i] == start[2]) { + stack.length = i; + break; + } + if (i < 0 && (!tag || tag == start[2])) return { + tag: start[2], + from: Pos(iter.line, iter.ch), + to: Pos(endLine, endCh) + }; + } + } + } + + CodeMirror.registerHelper("fold", "xml", function(cm, start) { + var iter = new Iter(cm, start.line, 0); + for (;;) { + var openTag = toNextTag(iter), end; + if (!openTag || iter.line != start.line || !(end = toTagEnd(iter))) return; + if (!openTag[1] && end != "selfClose") { + var startPos = Pos(iter.line, iter.ch); + var endPos = findMatchingClose(iter, openTag[2]); + return endPos && {from: startPos, to: endPos.from}; + } + } + }); + CodeMirror.findMatchingTag = function(cm, pos, range) { + var iter = new Iter(cm, pos.line, pos.ch, range); + if (iter.text.indexOf(">") == -1 && iter.text.indexOf("<") == -1) return; + var end = toTagEnd(iter), to = end && Pos(iter.line, iter.ch); + var start = end && toTagStart(iter); + if (!end || !start || cmp(iter, pos) > 0) return; + var here = {from: Pos(iter.line, iter.ch), to: to, tag: start[2]}; + if (end == "selfClose") return {open: here, close: null, at: "open"}; + + if (start[1]) { // closing tag + return {open: findMatchingOpen(iter, start[2]), close: here, at: "close"}; + } else { // opening tag + iter = new Iter(cm, to.line, to.ch, range); + return {open: here, close: findMatchingClose(iter, start[2]), at: "open"}; + } + }; + + CodeMirror.findEnclosingTag = function(cm, pos, range, tag) { + var iter = new Iter(cm, pos.line, pos.ch, range); + for (;;) { + var open = findMatchingOpen(iter, tag); + if (!open) break; + var forward = new Iter(cm, pos.line, pos.ch, range); + var close = findMatchingClose(forward, open.tag); + if (close) return {open: open, close: close}; + } + }; + + // Used by addon/edit/closetag.js + CodeMirror.scanForClosingTag = function(cm, pos, name, end) { + var iter = new Iter(cm, pos.line, pos.ch, end ? {from: 0, to: end} : null); + return findMatchingClose(iter, name); + }; +}); diff --git a/cyclone-web/vendor/codeMirror/groovy.js b/cyclone-web/vendor/codeMirror/groovy.js new file mode 100644 index 0000000000000000000000000000000000000000..721933b01c3b99d2695da29a1a1d34f317ff09d3 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/groovy.js @@ -0,0 +1,230 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/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.defineMode("groovy", function(config) { + function words(str) { + var obj = {}, words = str.split(" "); + for (var i = 0; i < words.length; ++i) obj[words[i]] = true; + return obj; + } + var keywords = words( + "abstract as assert boolean break byte case catch char class const continue def default " + + "do double else enum extends final finally float for goto if implements import in " + + "instanceof int interface long native new package private protected public return " + + "short static strictfp super switch synchronized threadsafe throw throws transient " + + "try void volatile while"); + var blockKeywords = words("catch class do else finally for if switch try while enum interface def"); + var standaloneKeywords = words("return break continue"); + var atoms = words("null true false this"); + + var curPunc; + function tokenBase(stream, state) { + var ch = stream.next(); + if (ch == '"' || ch == "'") { + return startString(ch, stream, state); + } + if (/[\[\]{}\(\),;\:\.]/.test(ch)) { + curPunc = ch; + return null; + } + if (/\d/.test(ch)) { + stream.eatWhile(/[\w\.]/); + if (stream.eat(/eE/)) { stream.eat(/\+\-/); stream.eatWhile(/\d/); } + return "number"; + } + if (ch == "/") { + if (stream.eat("*")) { + state.tokenize.push(tokenComment); + return tokenComment(stream, state); + } + if (stream.eat("/")) { + stream.skipToEnd(); + return "comment"; + } + if (expectExpression(state.lastToken, false)) { + return startString(ch, stream, state); + } + } + if (ch == "-" && stream.eat(">")) { + curPunc = "->"; + return null; + } + if (/[+\-*&%=<>!?|\/~]/.test(ch)) { + stream.eatWhile(/[+\-*&%=<>|~]/); + return "operator"; + } + stream.eatWhile(/[\w\$_]/); + if (ch == "@") { stream.eatWhile(/[\w\$_\.]/); return "meta"; } + if (state.lastToken == ".") return "property"; + if (stream.eat(":")) { curPunc = "proplabel"; return "property"; } + var cur = stream.current(); + if (atoms.propertyIsEnumerable(cur)) { return "atom"; } + if (keywords.propertyIsEnumerable(cur)) { + if (blockKeywords.propertyIsEnumerable(cur)) curPunc = "newstatement"; + else if (standaloneKeywords.propertyIsEnumerable(cur)) curPunc = "standalone"; + return "keyword"; + } + return "variable"; + } + tokenBase.isBase = true; + + function startString(quote, stream, state) { + var tripleQuoted = false; + if (quote != "/" && stream.eat(quote)) { + if (stream.eat(quote)) tripleQuoted = true; + else return "string"; + } + function t(stream, state) { + var escaped = false, next, end = !tripleQuoted; + while ((next = stream.next()) != null) { + if (next == quote && !escaped) { + if (!tripleQuoted) { break; } + if (stream.match(quote + quote)) { end = true; break; } + } + if (quote == '"' && next == "$" && !escaped && stream.eat("{")) { + state.tokenize.push(tokenBaseUntilBrace()); + return "string"; + } + escaped = !escaped && next == "\\"; + } + if (end) state.tokenize.pop(); + return "string"; + } + state.tokenize.push(t); + return t(stream, state); + } + + function tokenBaseUntilBrace() { + var depth = 1; + function t(stream, state) { + if (stream.peek() == "}") { + depth--; + if (depth == 0) { + state.tokenize.pop(); + return state.tokenize[state.tokenize.length-1](stream, state); + } + } else if (stream.peek() == "{") { + depth++; + } + return tokenBase(stream, state); + } + t.isBase = true; + return t; + } + + function tokenComment(stream, state) { + var maybeEnd = false, ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize.pop(); + break; + } + maybeEnd = (ch == "*"); + } + return "comment"; + } + + function expectExpression(last, newline) { + return !last || last == "operator" || last == "->" || /[\.\[\{\(,;:]/.test(last) || + last == "newstatement" || last == "keyword" || last == "proplabel" || + (last == "standalone" && !newline); + } + + function Context(indented, column, type, align, prev) { + this.indented = indented; + this.column = column; + this.type = type; + this.align = align; + this.prev = prev; + } + function pushContext(state, col, type) { + return state.context = new Context(state.indented, col, type, 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; + } + + // Interface + + return { + startState: function(basecolumn) { + return { + tokenize: [tokenBase], + context: new Context((basecolumn || 0) - config.indentUnit, 0, "top", false), + indented: 0, + startOfLine: true, + lastToken: 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; + // Automatic semicolon insertion + if (ctx.type == "statement" && !expectExpression(state.lastToken, true)) { + popContext(state); ctx = state.context; + } + } + if (stream.eatSpace()) return null; + curPunc = null; + var style = state.tokenize[state.tokenize.length-1](stream, state); + if (style == "comment") return style; + if (ctx.align == null) ctx.align = true; + + if ((curPunc == ";" || curPunc == ":") && ctx.type == "statement") popContext(state); + // Handle indentation for {x -> \n ... } + else if (curPunc == "->" && ctx.type == "statement" && ctx.prev.type == "}") { + popContext(state); + state.context.align = false; + } + 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 (ctx.type == "}" || ctx.type == "top" || (ctx.type == "statement" && curPunc == "newstatement")) + pushContext(state, stream.column(), "statement"); + state.startOfLine = false; + state.lastToken = curPunc || style; + return style; + }, + + indent: function(state, textAfter) { + if (!state.tokenize[state.tokenize.length-1].isBase) return 0; + var firstChar = textAfter && textAfter.charAt(0), ctx = state.context; + if (ctx.type == "statement" && !expectExpression(state.lastToken, true)) ctx = ctx.prev; + var closing = firstChar == ctx.type; + if (ctx.type == "statement") return ctx.indented + (firstChar == "{" ? 0 : config.indentUnit); + else if (ctx.align) return ctx.column + (closing ? 0 : 1); + else return ctx.indented + (closing ? 0 : config.indentUnit); + }, + + electricChars: "{}", + closeBrackets: {triples: "'\""}, + fold: "brace" + }; +}); + +CodeMirror.defineMIME("text/x-groovy", "groovy"); + +}); diff --git a/cyclone-web/vendor/codeMirror/hint/anyword-hint.js b/cyclone-web/vendor/codeMirror/hint/anyword-hint.js new file mode 100644 index 0000000000000000000000000000000000000000..dae78e2efbfbf22f52110783d9ccb33b5ef98f1e --- /dev/null +++ b/cyclone-web/vendor/codeMirror/hint/anyword-hint.js @@ -0,0 +1,41 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/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 WORD = /[\w$]+/, RANGE = 500; + + CodeMirror.registerHelper("hint", "anyword", function(editor, options) { + var word = options && options.word || WORD; + var range = options && options.range || RANGE; + var cur = editor.getCursor(), curLine = editor.getLine(cur.line); + var end = cur.ch, start = end; + while (start && word.test(curLine.charAt(start - 1))) --start; + var curWord = start != end && curLine.slice(start, end); + + var list = options && options.list || [], seen = {}; + var re = new RegExp(word.source, "g"); + for (var dir = -1; dir <= 1; dir += 2) { + var line = cur.line, endLine = Math.min(Math.max(line + dir * range, editor.firstLine()), editor.lastLine()) + dir; + for (; line != endLine; line += dir) { + var text = editor.getLine(line), m; + while (m = re.exec(text)) { + if (line == cur.line && m[0] === curWord) continue; + if ((!curWord || m[0].lastIndexOf(curWord, 0) == 0) && !Object.prototype.hasOwnProperty.call(seen, m[0])) { + seen[m[0]] = true; + list.push(m[0]); + } + } + } + } + return {list: list, from: CodeMirror.Pos(cur.line, start), to: CodeMirror.Pos(cur.line, end)}; + }); +}); diff --git a/cyclone-web/vendor/codeMirror/hint/css-hint.js b/cyclone-web/vendor/codeMirror/hint/css-hint.js new file mode 100644 index 0000000000000000000000000000000000000000..22642727cfa9e2c4b06d86fe17918b29cff91c28 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/hint/css-hint.js @@ -0,0 +1,60 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../../mode/css/css")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../../mode/css/css"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var pseudoClasses = {link: 1, visited: 1, active: 1, hover: 1, focus: 1, + "first-letter": 1, "first-line": 1, "first-child": 1, + before: 1, after: 1, lang: 1}; + + CodeMirror.registerHelper("hint", "css", function(cm) { + var cur = cm.getCursor(), token = cm.getTokenAt(cur); + var inner = CodeMirror.innerMode(cm.getMode(), token.state); + if (inner.mode.name != "css") return; + + if (token.type == "keyword" && "!important".indexOf(token.string) == 0) + return {list: ["!important"], from: CodeMirror.Pos(cur.line, token.start), + to: CodeMirror.Pos(cur.line, token.end)}; + + var start = token.start, end = cur.ch, word = token.string.slice(0, end - start); + if (/[^\w$_-]/.test(word)) { + word = ""; start = end = cur.ch; + } + + var spec = CodeMirror.resolveMode("text/css"); + + var result = []; + function add(keywords) { + for (var name in keywords) + if (!word || name.lastIndexOf(word, 0) == 0) + result.push(name); + } + + var st = inner.state.state; + if (st == "pseudo" || token.type == "variable-3") { + add(pseudoClasses); + } else if (st == "block" || st == "maybeprop") { + add(spec.propertyKeywords); + } else if (st == "prop" || st == "parens" || st == "at" || st == "params") { + add(spec.valueKeywords); + add(spec.colorKeywords); + } else if (st == "media" || st == "media_parens") { + add(spec.mediaTypes); + add(spec.mediaFeatures); + } + + if (result.length) return { + list: result, + from: CodeMirror.Pos(cur.line, start), + to: CodeMirror.Pos(cur.line, end) + }; + }); +}); diff --git a/cyclone-web/vendor/codeMirror/hint/html-hint.js b/cyclone-web/vendor/codeMirror/hint/html-hint.js new file mode 100644 index 0000000000000000000000000000000000000000..c6769bcae5e260184eb64d1ce24ee3dcc5c271e6 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/hint/html-hint.js @@ -0,0 +1,348 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("./xml-hint")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "./xml-hint"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var langs = "ab aa af ak sq am ar an hy as av ae ay az bm ba eu be bn bh bi bs br bg my ca ch ce ny zh cv kw co cr hr cs da dv nl dz en eo et ee fo fj fi fr ff gl ka de el gn gu ht ha he hz hi ho hu ia id ie ga ig ik io is it iu ja jv kl kn kr ks kk km ki rw ky kv kg ko ku kj la lb lg li ln lo lt lu lv gv mk mg ms ml mt mi mr mh mn na nv nb nd ne ng nn no ii nr oc oj cu om or os pa pi fa pl ps pt qu rm rn ro ru sa sc sd se sm sg sr gd sn si sk sl so st es su sw ss sv ta te tg th ti bo tk tl tn to tr ts tt tw ty ug uk ur uz ve vi vo wa cy wo fy xh yi yo za zu".split(" "); + var targets = ["_blank", "_self", "_top", "_parent"]; + var charsets = ["ascii", "utf-8", "utf-16", "latin1", "latin1"]; + var methods = ["get", "post", "put", "delete"]; + var encs = ["application/x-www-form-urlencoded", "multipart/form-data", "text/plain"]; + var media = ["all", "screen", "print", "embossed", "braille", "handheld", "print", "projection", "screen", "tty", "tv", "speech", + "3d-glasses", "resolution [>][<][=] [X]", "device-aspect-ratio: X/Y", "orientation:portrait", + "orientation:landscape", "device-height: [X]", "device-width: [X]"]; + var s = { attrs: {} }; // Simple tag, reused for a whole lot of tags + + var data = { + a: { + attrs: { + href: null, ping: null, type: null, + media: media, + target: targets, + hreflang: langs + } + }, + abbr: s, + acronym: s, + address: s, + applet: s, + area: { + attrs: { + alt: null, coords: null, href: null, target: null, ping: null, + media: media, hreflang: langs, type: null, + shape: ["default", "rect", "circle", "poly"] + } + }, + article: s, + aside: s, + audio: { + attrs: { + src: null, mediagroup: null, + crossorigin: ["anonymous", "use-credentials"], + preload: ["none", "metadata", "auto"], + autoplay: ["", "autoplay"], + loop: ["", "loop"], + controls: ["", "controls"] + } + }, + b: s, + base: { attrs: { href: null, target: targets } }, + basefont: s, + bdi: s, + bdo: s, + big: s, + blockquote: { attrs: { cite: null } }, + body: s, + br: s, + button: { + attrs: { + form: null, formaction: null, name: null, value: null, + autofocus: ["", "autofocus"], + disabled: ["", "autofocus"], + formenctype: encs, + formmethod: methods, + formnovalidate: ["", "novalidate"], + formtarget: targets, + type: ["submit", "reset", "button"] + } + }, + canvas: { attrs: { width: null, height: null } }, + caption: s, + center: s, + cite: s, + code: s, + col: { attrs: { span: null } }, + colgroup: { attrs: { span: null } }, + command: { + attrs: { + type: ["command", "checkbox", "radio"], + label: null, icon: null, radiogroup: null, command: null, title: null, + disabled: ["", "disabled"], + checked: ["", "checked"] + } + }, + data: { attrs: { value: null } }, + datagrid: { attrs: { disabled: ["", "disabled"], multiple: ["", "multiple"] } }, + datalist: { attrs: { data: null } }, + dd: s, + del: { attrs: { cite: null, datetime: null } }, + details: { attrs: { open: ["", "open"] } }, + dfn: s, + dir: s, + div: s, + dl: s, + dt: s, + em: s, + embed: { attrs: { src: null, type: null, width: null, height: null } }, + eventsource: { attrs: { src: null } }, + fieldset: { attrs: { disabled: ["", "disabled"], form: null, name: null } }, + figcaption: s, + figure: s, + font: s, + footer: s, + form: { + attrs: { + action: null, name: null, + "accept-charset": charsets, + autocomplete: ["on", "off"], + enctype: encs, + method: methods, + novalidate: ["", "novalidate"], + target: targets + } + }, + frame: s, + frameset: s, + h1: s, h2: s, h3: s, h4: s, h5: s, h6: s, + head: { + attrs: {}, + children: ["title", "base", "link", "style", "meta", "script", "noscript", "command"] + }, + header: s, + hgroup: s, + hr: s, + html: { + attrs: { manifest: null }, + children: ["head", "body"] + }, + i: s, + iframe: { + attrs: { + src: null, srcdoc: null, name: null, width: null, height: null, + sandbox: ["allow-top-navigation", "allow-same-origin", "allow-forms", "allow-scripts"], + seamless: ["", "seamless"] + } + }, + img: { + attrs: { + alt: null, src: null, ismap: null, usemap: null, width: null, height: null, + crossorigin: ["anonymous", "use-credentials"] + } + }, + input: { + attrs: { + alt: null, dirname: null, form: null, formaction: null, + height: null, list: null, max: null, maxlength: null, min: null, + name: null, pattern: null, placeholder: null, size: null, src: null, + step: null, value: null, width: null, + accept: ["audio/*", "video/*", "image/*"], + autocomplete: ["on", "off"], + autofocus: ["", "autofocus"], + checked: ["", "checked"], + disabled: ["", "disabled"], + formenctype: encs, + formmethod: methods, + formnovalidate: ["", "novalidate"], + formtarget: targets, + multiple: ["", "multiple"], + readonly: ["", "readonly"], + required: ["", "required"], + type: ["hidden", "text", "search", "tel", "url", "email", "password", "datetime", "date", "month", + "week", "time", "datetime-local", "number", "range", "color", "checkbox", "radio", + "file", "submit", "image", "reset", "button"] + } + }, + ins: { attrs: { cite: null, datetime: null } }, + kbd: s, + keygen: { + attrs: { + challenge: null, form: null, name: null, + autofocus: ["", "autofocus"], + disabled: ["", "disabled"], + keytype: ["RSA"] + } + }, + label: { attrs: { "for": null, form: null } }, + legend: s, + li: { attrs: { value: null } }, + link: { + attrs: { + href: null, type: null, + hreflang: langs, + media: media, + sizes: ["all", "16x16", "16x16 32x32", "16x16 32x32 64x64"] + } + }, + map: { attrs: { name: null } }, + mark: s, + menu: { attrs: { label: null, type: ["list", "context", "toolbar"] } }, + meta: { + attrs: { + content: null, + charset: charsets, + name: ["viewport", "application-name", "author", "description", "generator", "keywords"], + "http-equiv": ["content-language", "content-type", "default-style", "refresh"] + } + }, + meter: { attrs: { value: null, min: null, low: null, high: null, max: null, optimum: null } }, + nav: s, + noframes: s, + noscript: s, + object: { + attrs: { + data: null, type: null, name: null, usemap: null, form: null, width: null, height: null, + typemustmatch: ["", "typemustmatch"] + } + }, + ol: { attrs: { reversed: ["", "reversed"], start: null, type: ["1", "a", "A", "i", "I"] } }, + optgroup: { attrs: { disabled: ["", "disabled"], label: null } }, + option: { attrs: { disabled: ["", "disabled"], label: null, selected: ["", "selected"], value: null } }, + output: { attrs: { "for": null, form: null, name: null } }, + p: s, + param: { attrs: { name: null, value: null } }, + pre: s, + progress: { attrs: { value: null, max: null } }, + q: { attrs: { cite: null } }, + rp: s, + rt: s, + ruby: s, + s: s, + samp: s, + script: { + attrs: { + type: ["text/javascript"], + src: null, + async: ["", "async"], + defer: ["", "defer"], + charset: charsets + } + }, + section: s, + select: { + attrs: { + form: null, name: null, size: null, + autofocus: ["", "autofocus"], + disabled: ["", "disabled"], + multiple: ["", "multiple"] + } + }, + small: s, + source: { attrs: { src: null, type: null, media: null } }, + span: s, + strike: s, + strong: s, + style: { + attrs: { + type: ["text/css"], + media: media, + scoped: null + } + }, + sub: s, + summary: s, + sup: s, + table: s, + tbody: s, + td: { attrs: { colspan: null, rowspan: null, headers: null } }, + textarea: { + attrs: { + dirname: null, form: null, maxlength: null, name: null, placeholder: null, + rows: null, cols: null, + autofocus: ["", "autofocus"], + disabled: ["", "disabled"], + readonly: ["", "readonly"], + required: ["", "required"], + wrap: ["soft", "hard"] + } + }, + tfoot: s, + th: { attrs: { colspan: null, rowspan: null, headers: null, scope: ["row", "col", "rowgroup", "colgroup"] } }, + thead: s, + time: { attrs: { datetime: null } }, + title: s, + tr: s, + track: { + attrs: { + src: null, label: null, "default": null, + kind: ["subtitles", "captions", "descriptions", "chapters", "metadata"], + srclang: langs + } + }, + tt: s, + u: s, + ul: s, + "var": s, + video: { + attrs: { + src: null, poster: null, width: null, height: null, + crossorigin: ["anonymous", "use-credentials"], + preload: ["auto", "metadata", "none"], + autoplay: ["", "autoplay"], + mediagroup: ["movie"], + muted: ["", "muted"], + controls: ["", "controls"] + } + }, + wbr: s + }; + + var globalAttrs = { + accesskey: ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"], + "class": null, + contenteditable: ["true", "false"], + contextmenu: null, + dir: ["ltr", "rtl", "auto"], + draggable: ["true", "false", "auto"], + dropzone: ["copy", "move", "link", "string:", "file:"], + hidden: ["hidden"], + id: null, + inert: ["inert"], + itemid: null, + itemprop: null, + itemref: null, + itemscope: ["itemscope"], + itemtype: null, + lang: ["en", "es"], + spellcheck: ["true", "false"], + style: null, + tabindex: ["1", "2", "3", "4", "5", "6", "7", "8", "9"], + title: null, + translate: ["yes", "no"], + onclick: null, + rel: ["stylesheet", "alternate", "author", "bookmark", "help", "license", "next", "nofollow", "noreferrer", "prefetch", "prev", "search", "tag"] + }; + function populate(obj) { + for (var attr in globalAttrs) if (globalAttrs.hasOwnProperty(attr)) + obj.attrs[attr] = globalAttrs[attr]; + } + + populate(s); + for (var tag in data) if (data.hasOwnProperty(tag) && data[tag] != s) + populate(data[tag]); + + CodeMirror.htmlSchema = data; + function htmlHint(cm, options) { + var local = {schemaInfo: data}; + if (options) for (var opt in options) local[opt] = options[opt]; + return CodeMirror.hint.xml(cm, local); + } + CodeMirror.registerHelper("hint", "html", htmlHint); +}); diff --git a/cyclone-web/vendor/codeMirror/hint/javascript-hint.js b/cyclone-web/vendor/codeMirror/hint/javascript-hint.js new file mode 100644 index 0000000000000000000000000000000000000000..d7088c191b16022ef622d25ebf93c6f6da5afb07 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/hint/javascript-hint.js @@ -0,0 +1,155 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/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) { + var Pos = CodeMirror.Pos; + + function forEach(arr, f) { + for (var i = 0, e = arr.length; i < e; ++i) f(arr[i]); + } + + function arrayContains(arr, item) { + if (!Array.prototype.indexOf) { + var i = arr.length; + while (i--) { + if (arr[i] === item) { + return true; + } + } + return false; + } + return arr.indexOf(item) != -1; + } + + function scriptHint(editor, keywords, getToken, options) { + // Find the token at the cursor + var cur = editor.getCursor(), token = getToken(editor, cur); + if (/\b(?:string|comment)\b/.test(token.type)) return; + token.state = CodeMirror.innerMode(editor.getMode(), token.state).state; + + // If it's not a 'word-style' token, ignore the token. + if (!/^[\w$_]*$/.test(token.string)) { + token = {start: cur.ch, end: cur.ch, string: "", state: token.state, + type: token.string == "." ? "property" : null}; + } else if (token.end > cur.ch) { + token.end = cur.ch; + token.string = token.string.slice(0, cur.ch - token.start); + } + + var tprop = token; + // If it is a property, find out what it is a property of. + while (tprop.type == "property") { + tprop = getToken(editor, Pos(cur.line, tprop.start)); + if (tprop.string != ".") return; + tprop = getToken(editor, Pos(cur.line, tprop.start)); + if (!context) var context = []; + context.push(tprop); + } + return {list: getCompletions(token, context, keywords, options), + from: Pos(cur.line, token.start), + to: Pos(cur.line, token.end)}; + } + + function javascriptHint(editor, options) { + return scriptHint(editor, javascriptKeywords, + function (e, cur) {return e.getTokenAt(cur);}, + options); + }; + CodeMirror.registerHelper("hint", "javascript", javascriptHint); + + function getCoffeeScriptToken(editor, cur) { + // This getToken, it is for coffeescript, imitates the behavior of + // getTokenAt method in javascript.js, that is, returning "property" + // type and treat "." as indepenent token. + var token = editor.getTokenAt(cur); + if (cur.ch == token.start + 1 && token.string.charAt(0) == '.') { + token.end = token.start; + token.string = '.'; + token.type = "property"; + } + else if (/^\.[\w$_]*$/.test(token.string)) { + token.type = "property"; + token.start++; + token.string = token.string.replace(/\./, ''); + } + return token; + } + + function coffeescriptHint(editor, options) { + return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken, options); + } + CodeMirror.registerHelper("hint", "coffeescript", coffeescriptHint); + + var stringProps = ("charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight " + + "toUpperCase toLowerCase split concat match replace search").split(" "); + var arrayProps = ("length concat join splice push pop shift unshift slice reverse sort indexOf " + + "lastIndexOf every some filter forEach map reduce reduceRight ").split(" "); + var funcProps = "prototype apply call bind".split(" "); + var javascriptKeywords = ("break case catch continue debugger default delete do else false finally for function " + + "if in instanceof new null return switch throw true try typeof var void while with").split(" "); + var coffeescriptKeywords = ("and break catch class continue delete do else extends false finally for " + + "if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes").split(" "); + + function forAllProps(obj, callback) { + if (!Object.getOwnPropertyNames || !Object.getPrototypeOf) { + for (var name in obj) callback(name) + } else { + for (var o = obj; o; o = Object.getPrototypeOf(o)) + Object.getOwnPropertyNames(o).forEach(callback) + } + } + + function getCompletions(token, context, keywords, options) { + var found = [], start = token.string, global = options && options.globalScope || window; + function maybeAdd(str) { + if (str.lastIndexOf(start, 0) == 0 && !arrayContains(found, str)) found.push(str); + } + function gatherCompletions(obj) { + if (typeof obj == "string") forEach(stringProps, maybeAdd); + else if (obj instanceof Array) forEach(arrayProps, maybeAdd); + else if (obj instanceof Function) forEach(funcProps, maybeAdd); + forAllProps(obj, maybeAdd) + } + + if (context && context.length) { + // If this is a property, see if it belongs to some object we can + // find in the current environment. + var obj = context.pop(), base; + if (obj.type && obj.type.indexOf("variable") === 0) { + if (options && options.additionalContext) + base = options.additionalContext[obj.string]; + if (!options || options.useGlobalScope !== false) + base = base || global[obj.string]; + } else if (obj.type == "string") { + base = ""; + } else if (obj.type == "atom") { + base = 1; + } else if (obj.type == "function") { + if (global.jQuery != null && (obj.string == '$' || obj.string == 'jQuery') && + (typeof global.jQuery == 'function')) + base = global.jQuery(); + else if (global._ != null && (obj.string == '_') && (typeof global._ == 'function')) + base = global._(); + } + while (base != null && context.length) + base = base[context.pop().string]; + if (base != null) gatherCompletions(base); + } else { + // If not, just look in the global object and any local scope + // (reading into JS mode internals to get at the local and global variables) + for (var v = token.state.localVars; v; v = v.next) maybeAdd(v.name); + for (var v = token.state.globalVars; v; v = v.next) maybeAdd(v.name); + if (!options || options.useGlobalScope !== false) + gatherCompletions(global); + forEach(keywords, maybeAdd); + } + return found; + } +}); diff --git a/cyclone-web/vendor/codeMirror/hint/show-hint.css b/cyclone-web/vendor/codeMirror/hint/show-hint.css new file mode 100644 index 0000000000000000000000000000000000000000..5617ccca2bdf3102f11d4c11958e9e41364a5b80 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/hint/show-hint.css @@ -0,0 +1,36 @@ +.CodeMirror-hints { + position: absolute; + z-index: 10; + overflow: hidden; + list-style: none; + + margin: 0; + padding: 2px; + + -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2); + -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2); + box-shadow: 2px 3px 5px rgba(0,0,0,.2); + border-radius: 3px; + border: 1px solid silver; + + background: white; + font-size: 90%; + font-family: monospace; + + max-height: 20em; + overflow-y: auto; +} + +.CodeMirror-hint { + margin: 0; + padding: 0 4px; + border-radius: 2px; + white-space: pre; + color: black; + cursor: pointer; +} + +li.CodeMirror-hint-active { + background: #08f; + color: white; +} diff --git a/cyclone-web/vendor/codeMirror/hint/show-hint.js b/cyclone-web/vendor/codeMirror/hint/show-hint.js new file mode 100644 index 0000000000000000000000000000000000000000..604bd3b715550860b63f1fff38117f7259e3feae --- /dev/null +++ b/cyclone-web/vendor/codeMirror/hint/show-hint.js @@ -0,0 +1,438 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/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 HINT_ELEMENT_CLASS = "CodeMirror-hint"; + var ACTIVE_HINT_ELEMENT_CLASS = "CodeMirror-hint-active"; + + // This is the old interface, kept around for now to stay + // backwards-compatible. + CodeMirror.showHint = function(cm, getHints, options) { + if (!getHints) return cm.showHint(options); + if (options && options.async) getHints.async = true; + var newOpts = {hint: getHints}; + if (options) for (var prop in options) newOpts[prop] = options[prop]; + return cm.showHint(newOpts); + }; + + CodeMirror.defineExtension("showHint", function(options) { + options = parseOptions(this, this.getCursor("start"), options); + var selections = this.listSelections() + if (selections.length > 1) return; + // By default, don't allow completion when something is selected. + // A hint function can have a `supportsSelection` property to + // indicate that it can handle selections. + if (this.somethingSelected()) { + if (!options.hint.supportsSelection) return; + // Don't try with cross-line selections + for (var i = 0; i < selections.length; i++) + if (selections[i].head.line != selections[i].anchor.line) return; + } + + if (this.state.completionActive) this.state.completionActive.close(); + var completion = this.state.completionActive = new Completion(this, options); + if (!completion.options.hint) return; + + CodeMirror.signal(this, "startCompletion", this); + completion.update(true); + }); + + function Completion(cm, options) { + this.cm = cm; + this.options = options; + this.widget = null; + this.debounce = 0; + this.tick = 0; + this.startPos = this.cm.getCursor("start"); + this.startLen = this.cm.getLine(this.startPos.line).length - this.cm.getSelection().length; + + var self = this; + cm.on("cursorActivity", this.activityFunc = function() { self.cursorActivity(); }); + } + + var requestAnimationFrame = window.requestAnimationFrame || function(fn) { + return setTimeout(fn, 1000/60); + }; + var cancelAnimationFrame = window.cancelAnimationFrame || clearTimeout; + + Completion.prototype = { + close: function() { + if (!this.active()) return; + this.cm.state.completionActive = null; + this.tick = null; + this.cm.off("cursorActivity", this.activityFunc); + + if (this.widget && this.data) CodeMirror.signal(this.data, "close"); + if (this.widget) this.widget.close(); + CodeMirror.signal(this.cm, "endCompletion", this.cm); + }, + + active: function() { + return this.cm.state.completionActive == this; + }, + + pick: function(data, i) { + var completion = data.list[i]; + if (completion.hint) completion.hint(this.cm, data, completion); + else this.cm.replaceRange(getText(completion), completion.from || data.from, + completion.to || data.to, "complete"); + CodeMirror.signal(data, "pick", completion); + this.close(); + }, + + cursorActivity: function() { + if (this.debounce) { + cancelAnimationFrame(this.debounce); + this.debounce = 0; + } + + var pos = this.cm.getCursor(), line = this.cm.getLine(pos.line); + if (pos.line != this.startPos.line || line.length - pos.ch != this.startLen - this.startPos.ch || + pos.ch < this.startPos.ch || this.cm.somethingSelected() || + (pos.ch && this.options.closeCharacters.test(line.charAt(pos.ch - 1)))) { + this.close(); + } else { + var self = this; + this.debounce = requestAnimationFrame(function() {self.update();}); + if (this.widget) this.widget.disable(); + } + }, + + update: function(first) { + if (this.tick == null) return + var self = this, myTick = ++this.tick + fetchHints(this.options.hint, this.cm, this.options, function(data) { + if (self.tick == myTick) self.finishUpdate(data, first) + }) + }, + + finishUpdate: function(data, first) { + if (this.data) CodeMirror.signal(this.data, "update"); + + var picked = (this.widget && this.widget.picked) || (first && this.options.completeSingle); + if (this.widget) this.widget.close(); + + if (data && this.data && isNewCompletion(this.data, data)) return; + this.data = data; + + if (data && data.list.length) { + if (picked && data.list.length == 1) { + this.pick(data, 0); + } else { + this.widget = new Widget(this, data); + CodeMirror.signal(data, "shown"); + } + } + } + }; + + function isNewCompletion(old, nw) { + var moved = CodeMirror.cmpPos(nw.from, old.from) + return moved > 0 && old.to.ch - old.from.ch != nw.to.ch - nw.from.ch + } + + function parseOptions(cm, pos, options) { + var editor = cm.options.hintOptions; + var out = {}; + for (var prop in defaultOptions) out[prop] = defaultOptions[prop]; + if (editor) for (var prop in editor) + if (editor[prop] !== undefined) out[prop] = editor[prop]; + if (options) for (var prop in options) + if (options[prop] !== undefined) out[prop] = options[prop]; + if (out.hint.resolve) out.hint = out.hint.resolve(cm, pos) + return out; + } + + function getText(completion) { + if (typeof completion == "string") return completion; + else return completion.text; + } + + function buildKeyMap(completion, handle) { + var baseMap = { + Up: function() {handle.moveFocus(-1);}, + Down: function() {handle.moveFocus(1);}, + PageUp: function() {handle.moveFocus(-handle.menuSize() + 1, true);}, + PageDown: function() {handle.moveFocus(handle.menuSize() - 1, true);}, + Home: function() {handle.setFocus(0);}, + End: function() {handle.setFocus(handle.length - 1);}, + Enter: handle.pick, + Tab: handle.pick, + Esc: handle.close + }; + var custom = completion.options.customKeys; + var ourMap = custom ? {} : baseMap; + function addBinding(key, val) { + var bound; + if (typeof val != "string") + bound = function(cm) { return val(cm, handle); }; + // This mechanism is deprecated + else if (baseMap.hasOwnProperty(val)) + bound = baseMap[val]; + else + bound = val; + ourMap[key] = bound; + } + if (custom) + for (var key in custom) if (custom.hasOwnProperty(key)) + addBinding(key, custom[key]); + var extra = completion.options.extraKeys; + if (extra) + for (var key in extra) if (extra.hasOwnProperty(key)) + addBinding(key, extra[key]); + return ourMap; + } + + function getHintElement(hintsElement, el) { + while (el && el != hintsElement) { + if (el.nodeName.toUpperCase() === "LI" && el.parentNode == hintsElement) return el; + el = el.parentNode; + } + } + + function Widget(completion, data) { + this.completion = completion; + this.data = data; + this.picked = false; + var widget = this, cm = completion.cm; + + var hints = this.hints = document.createElement("ul"); + hints.className = "CodeMirror-hints"; + this.selectedHint = data.selectedHint || 0; + + var completions = data.list; + for (var i = 0; i < completions.length; ++i) { + var elt = hints.appendChild(document.createElement("li")), cur = completions[i]; + var className = HINT_ELEMENT_CLASS + (i != this.selectedHint ? "" : " " + ACTIVE_HINT_ELEMENT_CLASS); + if (cur.className != null) className = cur.className + " " + className; + elt.className = className; + if (cur.render) cur.render(elt, data, cur); + else elt.appendChild(document.createTextNode(cur.displayText || getText(cur))); + elt.hintId = i; + } + + var pos = cm.cursorCoords(completion.options.alignWithWord ? data.from : null); + var left = pos.left, top = pos.bottom, below = true; + hints.style.left = left + "px"; + hints.style.top = top + "px"; + // If we're at the edge of the screen, then we want the menu to appear on the left of the cursor. + var winW = window.innerWidth || Math.max(document.body.offsetWidth, document.documentElement.offsetWidth); + var winH = window.innerHeight || Math.max(document.body.offsetHeight, document.documentElement.offsetHeight); + (completion.options.container || document.body).appendChild(hints); + var box = hints.getBoundingClientRect(), overlapY = box.bottom - winH; + var scrolls = hints.scrollHeight > hints.clientHeight + 1 + var startScroll = cm.getScrollInfo(); + + if (overlapY > 0) { + var height = box.bottom - box.top, curTop = pos.top - (pos.bottom - box.top); + if (curTop - height > 0) { // Fits above cursor + hints.style.top = (top = pos.top - height) + "px"; + below = false; + } else if (height > winH) { + hints.style.height = (winH - 5) + "px"; + hints.style.top = (top = pos.bottom - box.top) + "px"; + var cursor = cm.getCursor(); + if (data.from.ch != cursor.ch) { + pos = cm.cursorCoords(cursor); + hints.style.left = (left = pos.left) + "px"; + box = hints.getBoundingClientRect(); + } + } + } + var overlapX = box.right - winW; + if (overlapX > 0) { + if (box.right - box.left > winW) { + hints.style.width = (winW - 5) + "px"; + overlapX -= (box.right - box.left) - winW; + } + hints.style.left = (left = pos.left - overlapX) + "px"; + } + if (scrolls) for (var node = hints.firstChild; node; node = node.nextSibling) + node.style.paddingRight = cm.display.nativeBarWidth + "px" + + cm.addKeyMap(this.keyMap = buildKeyMap(completion, { + moveFocus: function(n, avoidWrap) { widget.changeActive(widget.selectedHint + n, avoidWrap); }, + setFocus: function(n) { widget.changeActive(n); }, + menuSize: function() { return widget.screenAmount(); }, + length: completions.length, + close: function() { completion.close(); }, + pick: function() { widget.pick(); }, + data: data + })); + + if (completion.options.closeOnUnfocus) { + var closingOnBlur; + cm.on("blur", this.onBlur = function() { closingOnBlur = setTimeout(function() { completion.close(); }, 100); }); + cm.on("focus", this.onFocus = function() { clearTimeout(closingOnBlur); }); + } + + cm.on("scroll", this.onScroll = function() { + var curScroll = cm.getScrollInfo(), editor = cm.getWrapperElement().getBoundingClientRect(); + var newTop = top + startScroll.top - curScroll.top; + var point = newTop - (window.pageYOffset || (document.documentElement || document.body).scrollTop); + if (!below) point += hints.offsetHeight; + if (point <= editor.top || point >= editor.bottom) return completion.close(); + hints.style.top = newTop + "px"; + hints.style.left = (left + startScroll.left - curScroll.left) + "px"; + }); + + CodeMirror.on(hints, "dblclick", function(e) { + var t = getHintElement(hints, e.target || e.srcElement); + if (t && t.hintId != null) {widget.changeActive(t.hintId); widget.pick();} + }); + + CodeMirror.on(hints, "click", function(e) { + var t = getHintElement(hints, e.target || e.srcElement); + if (t && t.hintId != null) { + widget.changeActive(t.hintId); + if (completion.options.completeOnSingleClick) widget.pick(); + } + }); + + CodeMirror.on(hints, "mousedown", function() { + setTimeout(function(){cm.focus();}, 20); + }); + + CodeMirror.signal(data, "select", completions[0], hints.firstChild); + return true; + } + + Widget.prototype = { + close: function() { + if (this.completion.widget != this) return; + this.completion.widget = null; + this.hints.parentNode.removeChild(this.hints); + this.completion.cm.removeKeyMap(this.keyMap); + + var cm = this.completion.cm; + if (this.completion.options.closeOnUnfocus) { + cm.off("blur", this.onBlur); + cm.off("focus", this.onFocus); + } + cm.off("scroll", this.onScroll); + }, + + disable: function() { + this.completion.cm.removeKeyMap(this.keyMap); + var widget = this; + this.keyMap = {Enter: function() { widget.picked = true; }}; + this.completion.cm.addKeyMap(this.keyMap); + }, + + pick: function() { + this.completion.pick(this.data, this.selectedHint); + }, + + changeActive: function(i, avoidWrap) { + if (i >= this.data.list.length) + i = avoidWrap ? this.data.list.length - 1 : 0; + else if (i < 0) + i = avoidWrap ? 0 : this.data.list.length - 1; + if (this.selectedHint == i) return; + var node = this.hints.childNodes[this.selectedHint]; + node.className = node.className.replace(" " + ACTIVE_HINT_ELEMENT_CLASS, ""); + node = this.hints.childNodes[this.selectedHint = i]; + node.className += " " + ACTIVE_HINT_ELEMENT_CLASS; + if (node.offsetTop < this.hints.scrollTop) + this.hints.scrollTop = node.offsetTop - 3; + else if (node.offsetTop + node.offsetHeight > this.hints.scrollTop + this.hints.clientHeight) + this.hints.scrollTop = node.offsetTop + node.offsetHeight - this.hints.clientHeight + 3; + CodeMirror.signal(this.data, "select", this.data.list[this.selectedHint], node); + }, + + screenAmount: function() { + return Math.floor(this.hints.clientHeight / this.hints.firstChild.offsetHeight) || 1; + } + }; + + function applicableHelpers(cm, helpers) { + if (!cm.somethingSelected()) return helpers + var result = [] + for (var i = 0; i < helpers.length; i++) + if (helpers[i].supportsSelection) result.push(helpers[i]) + return result + } + + function fetchHints(hint, cm, options, callback) { + if (hint.async) { + hint(cm, callback, options) + } else { + var result = hint(cm, options) + if (result && result.then) result.then(callback) + else callback(result) + } + } + + function resolveAutoHints(cm, pos) { + var helpers = cm.getHelpers(pos, "hint"), words + if (helpers.length) { + var resolved = function(cm, callback, options) { + var app = applicableHelpers(cm, helpers); + function run(i) { + if (i == app.length) return callback(null) + fetchHints(app[i], cm, options, function(result) { + if (result && result.list.length > 0) callback(result) + else run(i + 1) + }) + } + run(0) + } + resolved.async = true + resolved.supportsSelection = true + return resolved + } else if (words = cm.getHelper(cm.getCursor(), "hintWords")) { + return function(cm) { return CodeMirror.hint.fromList(cm, {words: words}) } + } else if (CodeMirror.hint.anyword) { + return function(cm, options) { return CodeMirror.hint.anyword(cm, options) } + } else { + return function() {} + } + } + + CodeMirror.registerHelper("hint", "auto", { + resolve: resolveAutoHints + }); + + CodeMirror.registerHelper("hint", "fromList", function(cm, options) { + var cur = cm.getCursor(), token = cm.getTokenAt(cur); + var to = CodeMirror.Pos(cur.line, token.end); + if (token.string && /\w/.test(token.string[token.string.length - 1])) { + var term = token.string, from = CodeMirror.Pos(cur.line, token.start); + } else { + var term = "", from = to; + } + var found = []; + for (var i = 0; i < options.words.length; i++) { + var word = options.words[i]; + if (word.slice(0, term.length) == term) + found.push(word); + } + + if (found.length) return {list: found, from: from, to: to}; + }); + + CodeMirror.commands.autocomplete = CodeMirror.showHint; + + var defaultOptions = { + hint: CodeMirror.hint.auto, + completeSingle: true, + alignWithWord: true, + closeCharacters: /[\s()\[\]{};:>,]/, + closeOnUnfocus: true, + completeOnSingleClick: true, + container: null, + customKeys: null, + extraKeys: null + }; + + CodeMirror.defineOption("hintOptions", null); +}); diff --git a/cyclone-web/vendor/codeMirror/hint/sql-hint.js b/cyclone-web/vendor/codeMirror/hint/sql-hint.js new file mode 100644 index 0000000000000000000000000000000000000000..e95b6bb4e9ff2361df52cad54b3c5d422b0f37a6 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/hint/sql-hint.js @@ -0,0 +1,287 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../../mode/sql/sql")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../../mode/sql/sql"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var tables; + var defaultTable; + var keywords; + var identifierQuote; + var CONS = { + QUERY_DIV: ";", + ALIAS_KEYWORD: "AS" + }; + var Pos = CodeMirror.Pos, cmpPos = CodeMirror.cmpPos; + + function isArray(val) { return Object.prototype.toString.call(val) == "[object Array]" } + + function getKeywords(editor) { + var mode = editor.doc.modeOption; + if (mode === "sql") mode = "text/x-sql"; + return CodeMirror.resolveMode(mode).keywords; + } + + function getIdentifierQuote(editor) { + var mode = editor.doc.modeOption; + if (mode === "sql") mode = "text/x-sql"; + return CodeMirror.resolveMode(mode).identifierQuote || "`"; + } + + function getText(item) { + return typeof item == "string" ? item : item.text; + } + + function wrapTable(name, value) { + if (isArray(value)) value = {columns: value} + if (!value.text) value.text = name + return value + } + + function parseTables(input) { + var result = {} + if (isArray(input)) { + for (var i = input.length - 1; i >= 0; i--) { + var item = input[i] + result[getText(item).toUpperCase()] = wrapTable(getText(item), item) + } + } else if (input) { + for (var name in input) + result[name.toUpperCase()] = wrapTable(name, input[name]) + } + return result + } + + function getTable(name) { + return tables[name.toUpperCase()] + } + + function shallowClone(object) { + var result = {}; + for (var key in object) if (object.hasOwnProperty(key)) + result[key] = object[key]; + return result; + } + + function match(string, word) { + var len = string.length; + var sub = getText(word).substr(0, len); + return string.toUpperCase() === sub.toUpperCase(); + } + + function addMatches(result, search, wordlist, formatter) { + if (isArray(wordlist)) { + for (var i = 0; i < wordlist.length; i++) + if (match(search, wordlist[i])) result.push(formatter(wordlist[i])) + } else { + for (var word in wordlist) if (wordlist.hasOwnProperty(word)) { + var val = wordlist[word] + if (!val || val === true) + val = word + else + val = val.displayText ? {text: val.text, displayText: val.displayText} : val.text + if (match(search, val)) result.push(formatter(val)) + } + } + } + + function cleanName(name) { + // Get rid name from identifierQuote and preceding dot(.) + if (name.charAt(0) == ".") { + name = name.substr(1); + } + // replace doublicated identifierQuotes with single identifierQuotes + // and remove single identifierQuotes + var nameParts = name.split(identifierQuote+identifierQuote); + for (var i = 0; i < nameParts.length; i++) + nameParts[i] = nameParts[i].replace(new RegExp(identifierQuote,"g"), ""); + return nameParts.join(identifierQuote); + } + + function insertIdentifierQuotes(name) { + var nameParts = getText(name).split("."); + for (var i = 0; i < nameParts.length; i++) + nameParts[i] = identifierQuote + + // doublicate identifierQuotes + nameParts[i].replace(new RegExp(identifierQuote,"g"), identifierQuote+identifierQuote) + + identifierQuote; + var escaped = nameParts.join("."); + if (typeof name == "string") return escaped; + name = shallowClone(name); + name.text = escaped; + return name; + } + + function nameCompletion(cur, token, result, editor) { + // Try to complete table, column names and return start position of completion + var useIdentifierQuotes = false; + var nameParts = []; + var start = token.start; + var cont = true; + while (cont) { + cont = (token.string.charAt(0) == "."); + useIdentifierQuotes = useIdentifierQuotes || (token.string.charAt(0) == identifierQuote); + + start = token.start; + nameParts.unshift(cleanName(token.string)); + + token = editor.getTokenAt(Pos(cur.line, token.start)); + if (token.string == ".") { + cont = true; + token = editor.getTokenAt(Pos(cur.line, token.start)); + } + } + + // Try to complete table names + var string = nameParts.join("."); + addMatches(result, string, tables, function(w) { + return useIdentifierQuotes ? insertIdentifierQuotes(w) : w; + }); + + // Try to complete columns from defaultTable + addMatches(result, string, defaultTable, function(w) { + return useIdentifierQuotes ? insertIdentifierQuotes(w) : w; + }); + + // Try to complete columns + string = nameParts.pop(); + var table = nameParts.join("."); + + var alias = false; + var aliasTable = table; + // Check if table is available. If not, find table by Alias + if (!getTable(table)) { + var oldTable = table; + table = findTableByAlias(table, editor); + if (table !== oldTable) alias = true; + } + + var columns = getTable(table); + if (columns && columns.columns) + columns = columns.columns; + + if (columns) { + addMatches(result, string, columns, function(w) { + var tableInsert = table; + if (alias == true) tableInsert = aliasTable; + if (typeof w == "string") { + w = tableInsert + "." + w; + } else { + w = shallowClone(w); + w.text = tableInsert + "." + w.text; + } + return useIdentifierQuotes ? insertIdentifierQuotes(w) : w; + }); + } + + return start; + } + + function eachWord(lineText, f) { + if (!lineText) return; + var excepted = /[,;]/g; + var words = lineText.split(" "); + for (var i = 0; i < words.length; i++) { + f(words[i]?words[i].replace(excepted, '') : ''); + } + } + + function findTableByAlias(alias, editor) { + var doc = editor.doc; + var fullQuery = doc.getValue(); + var aliasUpperCase = alias.toUpperCase(); + var previousWord = ""; + var table = ""; + var separator = []; + var validRange = { + start: Pos(0, 0), + end: Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).length) + }; + + //add separator + var indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV); + while(indexOfSeparator != -1) { + separator.push(doc.posFromIndex(indexOfSeparator)); + indexOfSeparator = fullQuery.indexOf(CONS.QUERY_DIV, indexOfSeparator+1); + } + separator.unshift(Pos(0, 0)); + separator.push(Pos(editor.lastLine(), editor.getLineHandle(editor.lastLine()).text.length)); + + //find valid range + var prevItem = null; + var current = editor.getCursor() + for (var i = 0; i < separator.length; i++) { + if ((prevItem == null || cmpPos(current, prevItem) > 0) && cmpPos(current, separator[i]) <= 0) { + validRange = {start: prevItem, end: separator[i]}; + break; + } + prevItem = separator[i]; + } + + var query = doc.getRange(validRange.start, validRange.end, false); + + for (var i = 0; i < query.length; i++) { + var lineText = query[i]; + eachWord(lineText, function(word) { + var wordUpperCase = word.toUpperCase(); + if (wordUpperCase === aliasUpperCase && getTable(previousWord)) + table = previousWord; + if (wordUpperCase !== CONS.ALIAS_KEYWORD) + previousWord = word; + }); + if (table) break; + } + return table; + } + + CodeMirror.registerHelper("hint", "sql", function(editor, options) { + tables = parseTables(options && options.tables) + var defaultTableName = options && options.defaultTable; + var disableKeywords = options && options.disableKeywords; + defaultTable = defaultTableName && getTable(defaultTableName); + keywords = getKeywords(editor); + identifierQuote = getIdentifierQuote(editor); + + if (defaultTableName && !defaultTable) + defaultTable = findTableByAlias(defaultTableName, editor); + + defaultTable = defaultTable || []; + + if (defaultTable.columns) + defaultTable = defaultTable.columns; + + var cur = editor.getCursor(); + var result = []; + var token = editor.getTokenAt(cur), start, end, search; + if (token.end > cur.ch) { + token.end = cur.ch; + token.string = token.string.slice(0, cur.ch - token.start); + } + + if (token.string.match(/^[.`"\w@]\w*$/)) { + search = token.string; + start = token.start; + end = token.end; + } else { + start = end = cur.ch; + search = ""; + } + if (search.charAt(0) == "." || search.charAt(0) == identifierQuote) { + start = nameCompletion(cur, token, result, editor); + } else { + addMatches(result, search, tables, function(w) {return w;}); + addMatches(result, search, defaultTable, function(w) {return w;}); + if (!disableKeywords) + addMatches(result, search, keywords, function(w) {return w.toUpperCase();}); + } + + return {list: result, from: Pos(cur.line, start), to: Pos(cur.line, end)}; + }); +}); diff --git a/cyclone-web/vendor/codeMirror/hint/xml-hint.js b/cyclone-web/vendor/codeMirror/hint/xml-hint.js new file mode 100644 index 0000000000000000000000000000000000000000..9b9baa0c674ef9b11d5a46a7da4c0ddbf8e5f5ed --- /dev/null +++ b/cyclone-web/vendor/codeMirror/hint/xml-hint.js @@ -0,0 +1,110 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/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 Pos = CodeMirror.Pos; + + function getHints(cm, options) { + var tags = options && options.schemaInfo; + var quote = (options && options.quoteChar) || '"'; + if (!tags) return; + var cur = cm.getCursor(), token = cm.getTokenAt(cur); + if (token.end > cur.ch) { + token.end = cur.ch; + token.string = token.string.slice(0, cur.ch - token.start); + } + var inner = CodeMirror.innerMode(cm.getMode(), token.state); + if (inner.mode.name != "xml") return; + var result = [], replaceToken = false, prefix; + var tag = /\btag\b/.test(token.type) && !/>$/.test(token.string); + var tagName = tag && /^\w/.test(token.string), tagStart; + + if (tagName) { + var before = cm.getLine(cur.line).slice(Math.max(0, token.start - 2), token.start); + var tagType = /<\/$/.test(before) ? "close" : /<$/.test(before) ? "open" : null; + if (tagType) tagStart = token.start - (tagType == "close" ? 2 : 1); + } else if (tag && token.string == "<") { + tagType = "open"; + } else if (tag && token.string == "</") { + tagType = "close"; + } + + if (!tag && !inner.state.tagName || tagType) { + if (tagName) + prefix = token.string; + replaceToken = tagType; + var cx = inner.state.context, curTag = cx && tags[cx.tagName]; + var childList = cx ? curTag && curTag.children : tags["!top"]; + if (childList && tagType != "close") { + for (var i = 0; i < childList.length; ++i) if (!prefix || childList[i].lastIndexOf(prefix, 0) == 0) + result.push("<" + childList[i]); + } else if (tagType != "close") { + for (var name in tags) + if (tags.hasOwnProperty(name) && name != "!top" && name != "!attrs" && (!prefix || name.lastIndexOf(prefix, 0) == 0)) + result.push("<" + name); + } + if (cx && (!prefix || tagType == "close" && cx.tagName.lastIndexOf(prefix, 0) == 0)) + result.push("</" + cx.tagName + ">"); + } else { + // Attribute completion + var curTag = tags[inner.state.tagName], attrs = curTag && curTag.attrs; + var globalAttrs = tags["!attrs"]; + if (!attrs && !globalAttrs) return; + if (!attrs) { + attrs = globalAttrs; + } else if (globalAttrs) { // Combine tag-local and global attributes + var set = {}; + for (var nm in globalAttrs) if (globalAttrs.hasOwnProperty(nm)) set[nm] = globalAttrs[nm]; + for (var nm in attrs) if (attrs.hasOwnProperty(nm)) set[nm] = attrs[nm]; + attrs = set; + } + if (token.type == "string" || token.string == "=") { // A value + var before = cm.getRange(Pos(cur.line, Math.max(0, cur.ch - 60)), + Pos(cur.line, token.type == "string" ? token.start : token.end)); + var atName = before.match(/([^\s\u00a0=<>\"\']+)=$/), atValues; + if (!atName || !attrs.hasOwnProperty(atName[1]) || !(atValues = attrs[atName[1]])) return; + if (typeof atValues == 'function') atValues = atValues.call(this, cm); // Functions can be used to supply values for autocomplete widget + if (token.type == "string") { + prefix = token.string; + var n = 0; + if (/['"]/.test(token.string.charAt(0))) { + quote = token.string.charAt(0); + prefix = token.string.slice(1); + n++; + } + var len = token.string.length; + if (/['"]/.test(token.string.charAt(len - 1))) { + quote = token.string.charAt(len - 1); + prefix = token.string.substr(n, len - 2); + } + replaceToken = true; + } + for (var i = 0; i < atValues.length; ++i) if (!prefix || atValues[i].lastIndexOf(prefix, 0) == 0) + result.push(quote + atValues[i] + quote); + } else { // An attribute name + if (token.type == "attribute") { + prefix = token.string; + replaceToken = true; + } + for (var attr in attrs) if (attrs.hasOwnProperty(attr) && (!prefix || attr.lastIndexOf(prefix, 0) == 0)) + result.push(attr); + } + } + return { + list: result, + from: replaceToken ? Pos(cur.line, tagStart == null ? token.start : tagStart) : cur, + to: replaceToken ? Pos(cur.line, token.end) : cur + }; + } + + CodeMirror.registerHelper("hint", "xml", getHints); +}); diff --git a/cyclone-web/vendor/codeMirror/jquery.min.js b/cyclone-web/vendor/codeMirror/jquery.min.js new file mode 100644 index 0000000000000000000000000000000000000000..f3644431eea2f04111468e57034018c341592f65 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/jquery.min.js @@ -0,0 +1,6 @@ +/*! jQuery v1.11.3 | (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="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,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=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.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},m.extend=m.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||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},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=r(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(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[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=r(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&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=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);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(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&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.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?m.extend(a,d):d}},e={};return d.pipe=d.then,m.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&&m.isFunction(a.promise)?e:0,g=1===f?a:m.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]&&m.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;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1; + +return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.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.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.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 m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.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=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(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},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!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(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},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 fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ca()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ca()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.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=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?aa:ba):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=aa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=aa,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=aa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.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(f in a)this.on(f,b,c,a[f],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=ba;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.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,m(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=ba),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function da(a){var b=ea.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var ea="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fa=/ jQuery\d+="(?:null|\d+)"/g,ga=new RegExp("<(?:"+ea+")[\\s/>]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/<tbody/i,la=/<|&#?\w+;/,ma=/<(?:script|style|link)/i,na=/checked\s*(?:[^=]|=\s*.checked.)/i,oa=/^$|\/(?:java|ecma)script/i,pa=/^true\/(.*)/,qa=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ra={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?"<table>"!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(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=wa(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=wa(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?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(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,m.cleanData(ua(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,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ca[0].contentWindow||Ca[0].contentDocument).document,b.write(),b.close(),c=Ea(a,b),Ca.detach()),Da[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Ga=/^margin/,Ha=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ia,Ja,Ka=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ia=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Ha.test(g)&&Ga.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+""}):y.documentElement.currentStyle&&(Ia=function(a){return a.currentStyle},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Ha.test(g)&&!Ka.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function La(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.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",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight),b.removeChild(i)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.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 Ma=/alpha\([^)]*\)/i,Na=/opacity\s*=\s*([^)]*)/,Oa=/^(none|table(?!-c[ea]).+)/,Pa=new RegExp("^("+S+")(.*)$","i"),Qa=new RegExp("^([+-])=("+S+")","i"),Ra={position:"absolute",visibility:"hidden",display:"block"},Sa={letterSpacing:"0",fontWeight:"400"},Ta=["Webkit","O","Moz","ms"];function Ua(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Ta.length;while(e--)if(b=Ta[e]+c,b in a)return b;return d}function Va(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fa(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.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}function Wa(a,b,c){var d=Pa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xa(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+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Ya(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ia(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Ja(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ha.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xa(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ja(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":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ua(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qa.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.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)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ua(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Ja(a,b,d)),"normal"===f&&b in Sa&&(f=Sa[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Oa.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Ra,function(){return Ya(a,b,d)}):Ya(a,b,d):void 0},set:function(a,c,d){var e=d&&Ia(a);return Wa(a,c,d?Xa(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Na.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Ma,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Ma.test(f)?f.replace(Ma,e):f+" "+e)}}),m.cssHooks.marginRight=La(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Ja,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Ga.test(a)||(m.cssHooks[a+b].set=Wa)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ia(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Va(this,!0)},hide:function(){return Va(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Za(a,b,c,d,e){ +return new Za.prototype.init(a,b,c,d,e)}m.Tween=Za,Za.prototype={constructor:Za,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||(m.cssNumber[c]?"":"px")},cur:function(){var a=Za.propHooks[this.prop];return a&&a.get?a.get(this):Za.propHooks._default.get(this)},run:function(a){var b,c=Za.propHooks[this.prop];return this.options.duration?this.pos=b=m.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):Za.propHooks._default.set(this),this}},Za.prototype.init.prototype=Za.prototype,Za.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Za.propHooks.scrollTop=Za.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Za.prototype.init,m.fx.step={};var $a,_a,ab=/^(?:toggle|show|hide)$/,bb=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cb=/queueHooks$/,db=[ib],eb={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bb.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bb.exec(m.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,m.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 fb(){return setTimeout(function(){$a=void 0}),$a=m.now()}function gb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hb(a,b,c){for(var d,e=(eb[b]||[]).concat(eb["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ib(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fa(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fa(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ab.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fa(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hb(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jb(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.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 kb(a,b,c){var d,e,f=0,g=db.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$a||fb(),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:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$a||fb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.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(jb(k,j.opts.specialEasing);g>f;f++)if(d=db[f].call(j,a,k,j.opts))return d;return m.map(k,hb,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.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)}m.Animation=m.extend(kb,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],eb[c]=eb[c]||[],eb[c].unshift(b)},prefilter:function(a,b){b?db.unshift(a):db.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kb(this,m.extend({},a),f);(e||m._data(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=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cb.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)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.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})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gb(b,!0),a,d,e)}}),m.each({slideDown:gb("show"),slideUp:gb("hide"),slideToggle:gb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($a=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$a=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_a||(_a=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_a),_a=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.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,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lb=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lb,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.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&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mb,nb,ob=m.expr.attrHandle,pb=/^(?:checked|selected)$/i,qb=k.getSetAttribute,rb=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nb:mb)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.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 m.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=m.propFix[c]||c,m.expr.match.bool.test(c)?rb&&qb||!pb.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qb?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nb={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rb&&qb||!pb.test(c)?a.setAttribute(!qb&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ob[b]||m.find.attr;ob[b]=rb&&qb||!pb.test(b)?function(a,b,d){var e,f;return d||(f=ob[b],ob[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,ob[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rb&&qb||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mb&&mb.set(a,b,c)}}),qb||(mb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},ob.id=ob.name=ob.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mb.set},m.attrHooks.contenteditable={set:function(a,b,c){mb.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sb=/^(?:input|select|textarea|button|object)$/i,tb=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.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||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.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){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sb.test(a.nodeName)||tb.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var ub=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.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(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(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(ub," ").indexOf(b)>=0)return!0;return!1}}),m.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){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.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 vb=m.now(),wb=/\?/,xb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yb,zb,Ab=/#.*$/,Bb=/([?&])_=[^&]*/,Cb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Db=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Eb=/^(?:GET|HEAD)$/,Fb=/^\/\//,Gb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hb={},Ib={},Jb="*/".concat("*");try{zb=location.href}catch(Kb){zb=y.createElement("a"),zb.href="",zb=zb.href}yb=Gb.exec(zb.toLowerCase())||[];function Lb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mb(a,b,c,d){var e={},f=a===Ib;function g(h){var i;return e[h]=!0,m.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 Nb(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Ob(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pb(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}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zb,type:"GET",isLocal:Db.test(yb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jb,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":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nb(Nb(a,m.ajaxSettings),b):Nb(m.ajaxSettings,a)},ajaxPrefilter:Lb(Hb),ajaxTransport:Lb(Ib),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cb.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f: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 i&&i.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||zb)+"").replace(Ab,"").replace(Fb,yb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gb.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yb[1]&&c[2]===yb[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yb[3]||("http:"===yb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mb(Hb,k,b,v),2===t)return v;h=m.event&&k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Eb.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wb.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bb.test(e)?e.replace(Bb,"$1_="+vb++):e+(wb.test(e)?"&":"?")+"_="+vb++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(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]?", "+Jb+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mb(Ib,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Ob(k,v,c)),u=Pb(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=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,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qb=/%20/g,Rb=/\[\]$/,Sb=/\r?\n/g,Tb=/^(?:submit|button|image|reset|file)$/i,Ub=/^(?:input|select|textarea|keygen)/i;function Vb(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rb.test(a)?d(a,e):Vb(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vb(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vb(c,a[c],b,e);return d.join("&").replace(Qb,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Ub.test(this.nodeName)&&!Tb.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sb,"\r\n")}}):{name:b.name,value:c.replace(Sb,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zb()||$b()}:Zb;var Wb=0,Xb={},Yb=m.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Xb)Xb[a](void 0,!0)}),k.cors=!!Yb&&"withCredentials"in Yb,Yb=k.ajax=!!Yb,Yb&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wb;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)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xb[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xb[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zb(){try{return new a.XMLHttpRequest}catch(b){}}function $b(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _b=[],ac=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_b.pop()||m.expando+"_"+vb++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ac.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ac.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ac,"$1"+e):b.jsonp!==!1&&(b.url+=(wb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.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,_b.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bc=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bc)return bc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cc=a.document.documentElement;function dc(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cc;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cc})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=La(k.pixelPosition,function(a,c){return c?(c=Ja(a,b),Ha.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.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?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ec=a.jQuery,fc=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fc),b&&a.jQuery===m&&(a.jQuery=ec),m},typeof b===K&&(a.jQuery=a.$=m),m}); +//# sourceMappingURL=jquery.min.map \ No newline at end of file diff --git a/cyclone-web/vendor/codeMirror/keymap/vim.js b/cyclone-web/vendor/codeMirror/keymap/vim.js new file mode 100644 index 0000000000000000000000000000000000000000..9460172db74cd7454d5f5045960cc3d97f9613b3 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/keymap/vim.js @@ -0,0 +1,6392 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +/** + * Supported keybindings: + * Too many to list. Refer to defaultKeyMap below. + * + * Supported Ex commands: + * Refer to defaultExCommandMap below. + * + * Registers: unnamed, -, a-z, A-Z, 0-9 + * (Does not respect the special case for number registers when delete + * operator is made with these commands: %, (, ), , /, ?, n, N, {, } ) + * TODO: Implement the remaining registers. + * + * Marks: a-z, A-Z, and 0-9 + * TODO: Implement the remaining special marks. They have more complex + * behavior. + * + * Events: + * 'vim-mode-change' - raised on the editor anytime the current mode changes, + * Event object: {mode: "visual", subMode: "linewise"} + * + * Code structure: + * 1. Default keymap + * 2. Variable declarations and short basic helpers + * 3. Instance (External API) implementation + * 4. Internal state tracking objects (input state, counter) implementation + * and instanstiation + * 5. Key handler (the main command dispatcher) implementation + * 6. Motion, operator, and action implementations + * 7. Helper functions for the key handler, motions, operators, and actions + * 8. Set up Vim to work as a keymap for CodeMirror. + * 9. Ex command implementations. + */ + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../lib/codemirror"), require("../addon/search/searchcursor"), require("../addon/dialog/dialog"), require("../addon/edit/matchbrackets.js")); + else if (typeof define == "function" && define.amd) // AMD + define(["../lib/codemirror", "../addon/search/searchcursor", "../addon/dialog/dialog", "../addon/edit/matchbrackets"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + 'use strict'; + + var defaultKeymap = [ + // Key to key mapping. This goes first to make it possible to override + // existing mappings. + { + keys: '<Left>', + type: 'keyToKey', + toKeys: 'h' + }, { + keys: '<Right>', + type: 'keyToKey', + toKeys: 'l' + }, { + keys: '<Up>', + type: 'keyToKey', + toKeys: 'k' + }, { + keys: '<Down>', + type: 'keyToKey', + toKeys: 'j' + }, { + keys: '<Space>', + type: 'keyToKey', + toKeys: 'l' + }, { + keys: '<BS>', + type: 'keyToKey', + toKeys: 'h', + context: 'normal' + }, { + keys: '<C-Space>', + type: 'keyToKey', + toKeys: 'W' + }, { + keys: '<C-BS>', + type: 'keyToKey', + toKeys: 'B', + context: 'normal' + }, { + keys: '<S-Space>', + type: 'keyToKey', + toKeys: 'w' + }, { + keys: '<S-BS>', + type: 'keyToKey', + toKeys: 'b', + context: 'normal' + }, { + keys: '<C-n>', + type: 'keyToKey', + toKeys: 'j' + }, { + keys: '<C-p>', + type: 'keyToKey', + toKeys: 'k' + }, { + keys: '<C-[>', + type: 'keyToKey', + toKeys: '<Esc>' + }, { + keys: '<C-c>', + type: 'keyToKey', + toKeys: '<Esc>' + }, { + keys: '<C-[>', + type: 'keyToKey', + toKeys: '<Esc>', + context: 'insert' + }, { + keys: '<C-c>', + type: 'keyToKey', + toKeys: '<Esc>', + context: 'insert' + }, { + keys: 's', + type: 'keyToKey', + toKeys: 'cl', + context: 'normal' + }, { + keys: 's', + type: 'keyToKey', + toKeys: 'xi', + context: 'visual' + }, { + keys: 'S', + type: 'keyToKey', + toKeys: 'cc', + context: 'normal' + }, { + keys: 'S', + type: 'keyToKey', + toKeys: 'dcc', + context: 'visual' + }, { + keys: '<Home>', + type: 'keyToKey', + toKeys: '0' + }, { + keys: '<End>', + type: 'keyToKey', + toKeys: '$' + }, { + keys: '<PageUp>', + type: 'keyToKey', + toKeys: '<C-b>' + }, { + keys: '<PageDown>', + type: 'keyToKey', + toKeys: '<C-f>' + }, { + keys: '<CR>', + type: 'keyToKey', + toKeys: 'j^', + context: 'normal' + }, + // Motions + { + keys: 'H', + type: 'motion', + motion: 'moveToTopLine', + motionArgs: { + linewise: true, + toJumplist: true + } + }, { + keys: 'M', + type: 'motion', + motion: 'moveToMiddleLine', + motionArgs: { + linewise: true, + toJumplist: true + } + }, { + keys: 'L', + type: 'motion', + motion: 'moveToBottomLine', + motionArgs: { + linewise: true, + toJumplist: true + } + }, { + keys: 'h', + type: 'motion', + motion: 'moveByCharacters', + motionArgs: { + forward: false + } + }, { + keys: 'l', + type: 'motion', + motion: 'moveByCharacters', + motionArgs: { + forward: true + } + }, { + keys: 'j', + type: 'motion', + motion: 'moveByLines', + motionArgs: { + forward: true, + linewise: true + } + }, { + keys: 'k', + type: 'motion', + motion: 'moveByLines', + motionArgs: { + forward: false, + linewise: true + } + }, { + keys: 'gj', + type: 'motion', + motion: 'moveByDisplayLines', + motionArgs: { + forward: true + } + }, { + keys: 'gk', + type: 'motion', + motion: 'moveByDisplayLines', + motionArgs: { + forward: false + } + }, { + keys: 'w', + type: 'motion', + motion: 'moveByWords', + motionArgs: { + forward: true, + wordEnd: false + } + }, { + keys: 'W', + type: 'motion', + motion: 'moveByWords', + motionArgs: { + forward: true, + wordEnd: false, + bigWord: true + } + }, { + keys: 'e', + type: 'motion', + motion: 'moveByWords', + motionArgs: { + forward: true, + wordEnd: true, + inclusive: true + } + }, { + keys: 'E', + type: 'motion', + motion: 'moveByWords', + motionArgs: { + forward: true, + wordEnd: true, + bigWord: true, + inclusive: true + } + }, { + keys: 'b', + type: 'motion', + motion: 'moveByWords', + motionArgs: { + forward: false, + wordEnd: false + } + }, { + keys: 'B', + type: 'motion', + motion: 'moveByWords', + motionArgs: { + forward: false, + wordEnd: false, + bigWord: true + } + }, { + keys: 'ge', + type: 'motion', + motion: 'moveByWords', + motionArgs: { + forward: false, + wordEnd: true, + inclusive: true + } + }, { + keys: 'gE', + type: 'motion', + motion: 'moveByWords', + motionArgs: { + forward: false, + wordEnd: true, + bigWord: true, + inclusive: true + } + }, { + keys: '{', + type: 'motion', + motion: 'moveByParagraph', + motionArgs: { + forward: false, + toJumplist: true + } + }, { + keys: '}', + type: 'motion', + motion: 'moveByParagraph', + motionArgs: { + forward: true, + toJumplist: true + } + }, { + keys: '<C-f>', + type: 'motion', + motion: 'moveByPage', + motionArgs: { + forward: true + } + }, { + keys: '<C-b>', + type: 'motion', + motion: 'moveByPage', + motionArgs: { + forward: false + } + }, { + keys: '<C-d>', + type: 'motion', + motion: 'moveByScroll', + motionArgs: { + forward: true, + explicitRepeat: true + } + }, { + keys: '<C-u>', + type: 'motion', + motion: 'moveByScroll', + motionArgs: { + forward: false, + explicitRepeat: true + } + }, { + keys: 'gg', + type: 'motion', + motion: 'moveToLineOrEdgeOfDocument', + motionArgs: { + forward: false, + explicitRepeat: true, + linewise: true, + toJumplist: true + } + }, { + keys: 'G', + type: 'motion', + motion: 'moveToLineOrEdgeOfDocument', + motionArgs: { + forward: true, + explicitRepeat: true, + linewise: true, + toJumplist: true + } + }, { + keys: '0', + type: 'motion', + motion: 'moveToStartOfLine' + }, { + keys: '^', + type: 'motion', + motion: 'moveToFirstNonWhiteSpaceCharacter' + }, { + keys: '+', + type: 'motion', + motion: 'moveByLines', + motionArgs: { + forward: true, + toFirstChar: true + } + }, { + keys: '-', + type: 'motion', + motion: 'moveByLines', + motionArgs: { + forward: false, + toFirstChar: true + } + }, { + keys: '_', + type: 'motion', + motion: 'moveByLines', + motionArgs: { + forward: true, + toFirstChar: true, + repeatOffset: -1 + } + }, { + keys: '$', + type: 'motion', + motion: 'moveToEol', + motionArgs: { + inclusive: true + } + }, { + keys: '%', + type: 'motion', + motion: 'moveToMatchedSymbol', + motionArgs: { + inclusive: true, + toJumplist: true + } + }, { + keys: 'f<character>', + type: 'motion', + motion: 'moveToCharacter', + motionArgs: { + forward: true, + inclusive: true + } + }, { + keys: 'F<character>', + type: 'motion', + motion: 'moveToCharacter', + motionArgs: { + forward: false + } + }, { + keys: 't<character>', + type: 'motion', + motion: 'moveTillCharacter', + motionArgs: { + forward: true, + inclusive: true + } + }, { + keys: 'T<character>', + type: 'motion', + motion: 'moveTillCharacter', + motionArgs: { + forward: false + } + }, { + keys: ';', + type: 'motion', + motion: 'repeatLastCharacterSearch', + motionArgs: { + forward: true + } + }, { + keys: ',', + type: 'motion', + motion: 'repeatLastCharacterSearch', + motionArgs: { + forward: false + } + }, { + keys: '\'<character>', + type: 'motion', + motion: 'goToMark', + motionArgs: { + toJumplist: true, + linewise: true + } + }, { + keys: '`<character>', + type: 'motion', + motion: 'goToMark', + motionArgs: { + toJumplist: true + } + }, { + keys: ']`', + type: 'motion', + motion: 'jumpToMark', + motionArgs: { + forward: true + } + }, { + keys: '[`', + type: 'motion', + motion: 'jumpToMark', + motionArgs: { + forward: false + } + }, { + keys: ']\'', + type: 'motion', + motion: 'jumpToMark', + motionArgs: { + forward: true, + linewise: true + } + }, { + keys: '[\'', + type: 'motion', + motion: 'jumpToMark', + motionArgs: { + forward: false, + linewise: true + } + }, + // the next two aren't motions but must come before more general motion declarations + { + keys: ']p', + type: 'action', + action: 'paste', + isEdit: true, + actionArgs: { + after: true, + isEdit: true, + matchIndent: true + } + }, { + keys: '[p', + type: 'action', + action: 'paste', + isEdit: true, + actionArgs: { + after: false, + isEdit: true, + matchIndent: true + } + }, { + keys: ']<character>', + type: 'motion', + motion: 'moveToSymbol', + motionArgs: { + forward: true, + toJumplist: true + } + }, { + keys: '[<character>', + type: 'motion', + motion: 'moveToSymbol', + motionArgs: { + forward: false, + toJumplist: true + } + }, { + keys: '|', + type: 'motion', + motion: 'moveToColumn' + }, { + keys: 'o', + type: 'motion', + motion: 'moveToOtherHighlightedEnd', + context: 'visual' + }, { + keys: 'O', + type: 'motion', + motion: 'moveToOtherHighlightedEnd', + motionArgs: { + sameLine: true + }, + context: 'visual' + }, + // Operators + { + keys: 'd', + type: 'operator', + operator: 'delete' + }, { + keys: 'y', + type: 'operator', + operator: 'yank' + }, { + keys: 'c', + type: 'operator', + operator: 'change' + }, { + keys: '>', + type: 'operator', + operator: 'indent', + operatorArgs: { + indentRight: true + } + }, { + keys: '<', + type: 'operator', + operator: 'indent', + operatorArgs: { + indentRight: false + } + }, { + keys: 'g~', + type: 'operator', + operator: 'changeCase' + }, { + keys: 'gu', + type: 'operator', + operator: 'changeCase', + operatorArgs: { + toLower: true + }, + isEdit: true + }, { + keys: 'gU', + type: 'operator', + operator: 'changeCase', + operatorArgs: { + toLower: false + }, + isEdit: true + }, { + keys: 'n', + type: 'motion', + motion: 'findNext', + motionArgs: { + forward: true, + toJumplist: true + } + }, { + keys: 'N', + type: 'motion', + motion: 'findNext', + motionArgs: { + forward: false, + toJumplist: true + } + }, + // Operator-Motion dual commands + { + keys: 'x', + type: 'operatorMotion', + operator: 'delete', + motion: 'moveByCharacters', + motionArgs: { + forward: true + }, + operatorMotionArgs: { + visualLine: false + } + }, { + keys: 'X', + type: 'operatorMotion', + operator: 'delete', + motion: 'moveByCharacters', + motionArgs: { + forward: false + }, + operatorMotionArgs: { + visualLine: true + } + }, { + keys: 'D', + type: 'operatorMotion', + operator: 'delete', + motion: 'moveToEol', + motionArgs: { + inclusive: true + }, + context: 'normal' + }, { + keys: 'D', + type: 'operator', + operator: 'delete', + operatorArgs: { + linewise: true + }, + context: 'visual' + }, { + keys: 'Y', + type: 'operatorMotion', + operator: 'yank', + motion: 'moveToEol', + motionArgs: { + inclusive: true + }, + context: 'normal' + }, { + keys: 'Y', + type: 'operator', + operator: 'yank', + operatorArgs: { + linewise: true + }, + context: 'visual' + }, { + keys: 'C', + type: 'operatorMotion', + operator: 'change', + motion: 'moveToEol', + motionArgs: { + inclusive: true + }, + context: 'normal' + }, { + keys: 'C', + type: 'operator', + operator: 'change', + operatorArgs: { + linewise: true + }, + context: 'visual' + }, { + keys: '~', + type: 'operatorMotion', + operator: 'changeCase', + motion: 'moveByCharacters', + motionArgs: { + forward: true + }, + operatorArgs: { + shouldMoveCursor: true + }, + context: 'normal' + }, { + keys: '~', + type: 'operator', + operator: 'changeCase', + context: 'visual' + }, { + keys: '<C-w>', + type: 'operatorMotion', + operator: 'delete', + motion: 'moveByWords', + motionArgs: { + forward: false, + wordEnd: false + }, + context: 'insert' + }, + // Actions + { + keys: '<C-i>', + type: 'action', + action: 'jumpListWalk', + actionArgs: { + forward: true + } + }, { + keys: '<C-o>', + type: 'action', + action: 'jumpListWalk', + actionArgs: { + forward: false + } + }, { + keys: '<C-e>', + type: 'action', + action: 'scroll', + actionArgs: { + forward: true, + linewise: true + } + }, { + keys: '<C-y>', + type: 'action', + action: 'scroll', + actionArgs: { + forward: false, + linewise: true + } + }, { + keys: 'a', + type: 'action', + action: 'enterInsertMode', + isEdit: true, + actionArgs: { + insertAt: 'charAfter' + }, + context: 'normal' + }, { + keys: 'A', + type: 'action', + action: 'enterInsertMode', + isEdit: true, + actionArgs: { + insertAt: 'eol' + }, + context: 'normal' + }, { + keys: 'A', + type: 'action', + action: 'enterInsertMode', + isEdit: true, + actionArgs: { + insertAt: 'endOfSelectedArea' + }, + context: 'visual' + }, { + keys: 'i', + type: 'action', + action: 'enterInsertMode', + isEdit: true, + actionArgs: { + insertAt: 'inplace' + }, + context: 'normal' + }, { + keys: 'I', + type: 'action', + action: 'enterInsertMode', + isEdit: true, + actionArgs: { + insertAt: 'firstNonBlank' + }, + context: 'normal' + }, { + keys: 'I', + type: 'action', + action: 'enterInsertMode', + isEdit: true, + actionArgs: { + insertAt: 'startOfSelectedArea' + }, + context: 'visual' + }, { + keys: 'o', + type: 'action', + action: 'newLineAndEnterInsertMode', + isEdit: true, + interlaceInsertRepeat: true, + actionArgs: { + after: true + }, + context: 'normal' + }, { + keys: 'O', + type: 'action', + action: 'newLineAndEnterInsertMode', + isEdit: true, + interlaceInsertRepeat: true, + actionArgs: { + after: false + }, + context: 'normal' + }, { + keys: 'v', + type: 'action', + action: 'toggleVisualMode' + }, { + keys: 'V', + type: 'action', + action: 'toggleVisualMode', + actionArgs: { + linewise: true + } + }, { + keys: '<C-v>', + type: 'action', + action: 'toggleVisualMode', + actionArgs: { + blockwise: true + } + }, { + keys: '<C-q>', + type: 'action', + action: 'toggleVisualMode', + actionArgs: { + blockwise: true + } + }, { + keys: 'gv', + type: 'action', + action: 'reselectLastSelection' + }, { + keys: 'J', + type: 'action', + action: 'joinLines', + isEdit: true + }, { + keys: 'p', + type: 'action', + action: 'paste', + isEdit: true, + actionArgs: { + after: true, + isEdit: true + } + }, { + keys: 'P', + type: 'action', + action: 'paste', + isEdit: true, + actionArgs: { + after: false, + isEdit: true + } + }, { + keys: 'r<character>', + type: 'action', + action: 'replace', + isEdit: true + }, { + keys: '@<character>', + type: 'action', + action: 'replayMacro' + }, { + keys: 'q<character>', + type: 'action', + action: 'enterMacroRecordMode' + }, + // Handle Replace-mode as a special case of insert mode. + { + keys: 'R', + type: 'action', + action: 'enterInsertMode', + isEdit: true, + actionArgs: { + replace: true + } + }, { + keys: 'u', + type: 'action', + action: 'undo', + context: 'normal' + }, { + keys: 'u', + type: 'operator', + operator: 'changeCase', + operatorArgs: { + toLower: true + }, + context: 'visual', + isEdit: true + }, { + keys: 'U', + type: 'operator', + operator: 'changeCase', + operatorArgs: { + toLower: false + }, + context: 'visual', + isEdit: true + }, { + keys: '<C-r>', + type: 'action', + action: 'redo' + }, { + keys: 'm<character>', + type: 'action', + action: 'setMark' + }, { + keys: '"<character>', + type: 'action', + action: 'setRegister' + }, { + keys: 'zz', + type: 'action', + action: 'scrollToCursor', + actionArgs: { + position: 'center' + } + }, { + keys: 'z.', + type: 'action', + action: 'scrollToCursor', + actionArgs: { + position: 'center' + }, + motion: 'moveToFirstNonWhiteSpaceCharacter' + }, { + keys: 'zt', + type: 'action', + action: 'scrollToCursor', + actionArgs: { + position: 'top' + } + }, { + keys: 'z<CR>', + type: 'action', + action: 'scrollToCursor', + actionArgs: { + position: 'top' + }, + motion: 'moveToFirstNonWhiteSpaceCharacter' + }, { + keys: 'z-', + type: 'action', + action: 'scrollToCursor', + actionArgs: { + position: 'bottom' + } + }, { + keys: 'zb', + type: 'action', + action: 'scrollToCursor', + actionArgs: { + position: 'bottom' + }, + motion: 'moveToFirstNonWhiteSpaceCharacter' + }, { + keys: '.', + type: 'action', + action: 'repeatLastEdit' + }, { + keys: '<C-a>', + type: 'action', + action: 'incrementNumberToken', + isEdit: true, + actionArgs: { + increase: true, + backtrack: false + } + }, { + keys: '<C-x>', + type: 'action', + action: 'incrementNumberToken', + isEdit: true, + actionArgs: { + increase: false, + backtrack: false + } + }, + // Text object motions + { + keys: 'a<character>', + type: 'motion', + motion: 'textObjectManipulation' + }, { + keys: 'i<character>', + type: 'motion', + motion: 'textObjectManipulation', + motionArgs: { + textObjectInner: true + } + }, + // Search + { + keys: '/', + type: 'search', + searchArgs: { + forward: true, + querySrc: 'prompt', + toJumplist: true + } + }, { + keys: '?', + type: 'search', + searchArgs: { + forward: false, + querySrc: 'prompt', + toJumplist: true + } + }, { + keys: '*', + type: 'search', + searchArgs: { + forward: true, + querySrc: 'wordUnderCursor', + wholeWordOnly: true, + toJumplist: true + } + }, { + keys: '#', + type: 'search', + searchArgs: { + forward: false, + querySrc: 'wordUnderCursor', + wholeWordOnly: true, + toJumplist: true + } + }, { + keys: 'g*', + type: 'search', + searchArgs: { + forward: true, + querySrc: 'wordUnderCursor', + toJumplist: true + } + }, { + keys: 'g#', + type: 'search', + searchArgs: { + forward: false, + querySrc: 'wordUnderCursor', + toJumplist: true + } + }, + // Ex command + { + keys: ':', + type: 'ex' + } + ]; + + /** + * Ex commands + * Care must be taken when adding to the default Ex command map. For any + * pair of commands that have a shared prefix, at least one of their + * shortNames must not match the prefix of the other command. + */ + var defaultExCommandMap = [{ + name: 'colorscheme', + shortName: 'colo' + }, { + name: 'map' + }, { + name: 'imap', + shortName: 'im' + }, { + name: 'nmap', + shortName: 'nm' + }, { + name: 'vmap', + shortName: 'vm' + }, { + name: 'unmap' + }, { + name: 'write', + shortName: 'w' + }, { + name: 'undo', + shortName: 'u' + }, { + name: 'redo', + shortName: 'red' + }, { + name: 'set', + shortName: 'se' + }, { + name: 'set', + shortName: 'se' + }, { + name: 'setlocal', + shortName: 'setl' + }, { + name: 'setglobal', + shortName: 'setg' + }, { + name: 'sort', + shortName: 'sor' + }, { + name: 'substitute', + shortName: 's', + possiblyAsync: true + }, { + name: 'nohlsearch', + shortName: 'noh' + }, { + name: 'delmarks', + shortName: 'delm' + }, { + name: 'registers', + shortName: 'reg', + excludeFromCommandHistory: true + }, { + name: 'global', + shortName: 'g' + }]; + + var Pos = CodeMirror.Pos; + + var Vim = function() { + function enterVimMode(cm) { + cm.setOption('disableInput', true); + cm.setOption('showCursorWhenSelecting', false); + CodeMirror.signal(cm, "vim-mode-change", { + mode: "normal" + }); + cm.on('cursorActivity', onCursorActivity); + maybeInitVimState(cm); + CodeMirror.on(cm.getInputField(), 'paste', getOnPasteFn(cm)); + } + + function leaveVimMode(cm) { + cm.setOption('disableInput', false); + cm.off('cursorActivity', onCursorActivity); + CodeMirror.off(cm.getInputField(), 'paste', getOnPasteFn(cm)); + cm.state.vim = null; + } + + function detachVimMap(cm, next) { + if (this == CodeMirror.keyMap.vim) + CodeMirror.rmClass(cm.getWrapperElement(), "cm-fat-cursor"); + + if (!next || next.attach != attachVimMap) + leaveVimMode(cm, false); + } + + function attachVimMap(cm, prev) { + if (this == CodeMirror.keyMap.vim) + CodeMirror.addClass(cm.getWrapperElement(), "cm-fat-cursor"); + + if (!prev || prev.attach != attachVimMap) + enterVimMode(cm); + } + + // Deprecated, simply setting the keymap works again. + CodeMirror.defineOption('vimMode', false, function(cm, val, prev) { + if (val && cm.getOption("keyMap") != "vim") + cm.setOption("keyMap", "vim"); + else if (!val && prev != CodeMirror.Init && /^vim/.test(cm.getOption("keyMap"))) + cm.setOption("keyMap", "default"); + }); + + function cmKey(key, cm) { + if (!cm) { + return undefined; + } + var vimKey = cmKeyToVimKey(key); + if (!vimKey) { + return false; + } + var cmd = CodeMirror.Vim.findKey(cm, vimKey); + if (typeof cmd == 'function') { + CodeMirror.signal(cm, 'vim-keypress', vimKey); + } + return cmd; + } + + var modifiers = { + 'Shift': 'S', + 'Ctrl': 'C', + 'Alt': 'A', + 'Cmd': 'D', + 'Mod': 'A' + }; + var specialKeys = { + Enter: 'CR', + Backspace: 'BS', + Delete: 'Del' + }; + + function cmKeyToVimKey(key) { + if (key.charAt(0) == '\'') { + // Keypress character binding of format "'a'" + return key.charAt(1); + } + var pieces = key.split(/-(?!$)/); + var lastPiece = pieces[pieces.length - 1]; + if (pieces.length == 1 && pieces[0].length == 1) { + // No-modifier bindings use literal character bindings above. Skip. + return false; + } else if (pieces.length == 2 && pieces[0] == 'Shift' && lastPiece.length == 1) { + // Ignore Shift+char bindings as they should be handled by literal character. + return false; + } + var hasCharacter = false; + for (var i = 0; i < pieces.length; i++) { + var piece = pieces[i]; + if (piece in modifiers) { + pieces[i] = modifiers[piece]; + } else { + hasCharacter = true; + } + if (piece in specialKeys) { + pieces[i] = specialKeys[piece]; + } + } + if (!hasCharacter) { + // Vim does not support modifier only keys. + return false; + } + // TODO: Current bindings expect the character to be lower case, but + // it looks like vim key notation uses upper case. + if (isUpperCase(lastPiece)) { + pieces[pieces.length - 1] = lastPiece.toLowerCase(); + } + return '<' + pieces.join('-') + '>'; + } + + function getOnPasteFn(cm) { + var vim = cm.state.vim; + if (!vim.onPasteFn) { + vim.onPasteFn = function() { + if (!vim.insertMode) { + cm.setCursor(offsetCursor(cm.getCursor(), 0, 1)); + actions.enterInsertMode(cm, {}, vim); + } + }; + } + return vim.onPasteFn; + } + + var numberRegex = /[\d]/; + var wordCharTest = [CodeMirror.isWordChar, function(ch) { + return ch && !CodeMirror.isWordChar(ch) && !/\s/.test(ch); + }], + bigWordCharTest = [function(ch) { + return /\S/.test(ch); + }]; + + function makeKeyRange(start, size) { + var keys = []; + for (var i = start; i < start + size; i++) { + keys.push(String.fromCharCode(i)); + } + return keys; + } + var upperCaseAlphabet = makeKeyRange(65, 26); + var lowerCaseAlphabet = makeKeyRange(97, 26); + var numbers = makeKeyRange(48, 10); + var validMarks = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['<', '>']); + var validRegisters = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['-', '"', '.', ':', '/']); + + function isLine(cm, line) { + return line >= cm.firstLine() && line <= cm.lastLine(); + } + + function isLowerCase(k) { + return (/^[a-z]$/).test(k); + } + + function isMatchableSymbol(k) { + return '()[]{}'.indexOf(k) != -1; + } + + function isNumber(k) { + return numberRegex.test(k); + } + + function isUpperCase(k) { + return (/^[A-Z]$/).test(k); + } + + function isWhiteSpaceString(k) { + return (/^\s*$/).test(k); + } + + function inArray(val, arr) { + for (var i = 0; i < arr.length; i++) { + if (arr[i] == val) { + return true; + } + } + return false; + } + + var options = {}; + + function defineOption(name, defaultValue, type, aliases, callback) { + if (defaultValue === undefined && !callback) { + throw Error('defaultValue is required unless callback is provided'); + } + if (!type) { + type = 'string'; + } + options[name] = { + type: type, + defaultValue: defaultValue, + callback: callback + }; + if (aliases) { + for (var i = 0; i < aliases.length; i++) { + options[aliases[i]] = options[name]; + } + } + if (defaultValue) { + setOption(name, defaultValue); + } + } + + function setOption(name, value, cm, cfg) { + var option = options[name]; + cfg = cfg || {}; + var scope = cfg.scope; + if (!option) { + throw Error('Unknown option: ' + name); + } + if (option.type == 'boolean') { + if (value && value !== true) { + throw Error('Invalid argument: ' + name + '=' + value); + } else if (value !== false) { + // Boolean options are set to true if value is not defined. + value = true; + } + } + if (option.callback) { + if (scope !== 'local') { + option.callback(value, undefined); + } + if (scope !== 'global' && cm) { + option.callback(value, cm); + } + } else { + if (scope !== 'local') { + option.value = option.type == 'boolean' ? !!value : value; + } + if (scope !== 'global' && cm) { + cm.state.vim.options[name] = { + value: value + }; + } + } + } + + function getOption(name, cm, cfg) { + var option = options[name]; + cfg = cfg || {}; + var scope = cfg.scope; + if (!option) { + throw Error('Unknown option: ' + name); + } + if (option.callback) { + var local = cm && option.callback(undefined, cm); + if (scope !== 'global' && local !== undefined) { + return local; + } + if (scope !== 'local') { + return option.callback(); + } + return; + } else { + var local = (scope !== 'global') && (cm && cm.state.vim.options[name]); + return (local || (scope !== 'local') && option || {}).value; + } + } + + defineOption('filetype', undefined, 'string', ['ft'], function(name, cm) { + // Option is local. Do nothing for global. + if (cm === undefined) { + return; + } + // The 'filetype' option proxies to the CodeMirror 'mode' option. + if (name === undefined) { + var mode = cm.getOption('mode'); + return mode == 'null' ? '' : mode; + } else { + var mode = name == '' ? 'null' : name; + cm.setOption('mode', mode); + } + }); + + var createCircularJumpList = function() { + var size = 100; + var pointer = -1; + var head = 0; + var tail = 0; + var buffer = new Array(size); + + function add(cm, oldCur, newCur) { + var current = pointer % size; + var curMark = buffer[current]; + + function useNextSlot(cursor) { + var next = ++pointer % size; + var trashMark = buffer[next]; + if (trashMark) { + trashMark.clear(); + } + buffer[next] = cm.setBookmark(cursor); + } + if (curMark) { + var markPos = curMark.find(); + // avoid recording redundant cursor position + if (markPos && !cursorEqual(markPos, oldCur)) { + useNextSlot(oldCur); + } + } else { + useNextSlot(oldCur); + } + useNextSlot(newCur); + head = pointer; + tail = pointer - size + 1; + if (tail < 0) { + tail = 0; + } + } + + function move(cm, offset) { + pointer += offset; + if (pointer > head) { + pointer = head; + } else if (pointer < tail) { + pointer = tail; + } + var mark = buffer[(size + pointer) % size]; + // skip marks that are temporarily removed from text buffer + if (mark && !mark.find()) { + var inc = offset > 0 ? 1 : -1; + var newCur; + var oldCur = cm.getCursor(); + do { + pointer += inc; + mark = buffer[(size + pointer) % size]; + // skip marks that are the same as current position + if (mark && + (newCur = mark.find()) && + !cursorEqual(oldCur, newCur)) { + break; + } + } while (pointer < head && pointer > tail); + } + return mark; + } + return { + cachedCursor: undefined, //used for # and * jumps + add: add, + move: move + }; + }; + + // Returns an object to track the changes associated insert mode. It + // clones the object that is passed in, or creates an empty object one if + // none is provided. + var createInsertModeChanges = function(c) { + if (c) { + // Copy construction + return { + changes: c.changes, + expectCursorActivityForChange: c.expectCursorActivityForChange + }; + } + return { + // Change list + changes: [], + // Set to true on change, false on cursorActivity. + expectCursorActivityForChange: false + }; + }; + + function MacroModeState() { + this.latestRegister = undefined; + this.isPlaying = false; + this.isRecording = false; + this.replaySearchQueries = []; + this.onRecordingDone = undefined; + this.lastInsertModeChanges = createInsertModeChanges(); + } + MacroModeState.prototype = { + exitMacroRecordMode: function() { + var macroModeState = vimGlobalState.macroModeState; + if (macroModeState.onRecordingDone) { + macroModeState.onRecordingDone(); // close dialog + } + macroModeState.onRecordingDone = undefined; + macroModeState.isRecording = false; + }, + enterMacroRecordMode: function(cm, registerName) { + var register = + vimGlobalState.registerController.getRegister(registerName); + if (register) { + register.clear(); + this.latestRegister = registerName; + if (cm.openDialog) { + this.onRecordingDone = cm.openDialog( + '(recording)[' + registerName + ']', null, { + bottom: true + }); + } + this.isRecording = true; + } + } + }; + + function maybeInitVimState(cm) { + if (!cm.state.vim) { + // Store instance state in the CodeMirror object. + cm.state.vim = { + inputState: new InputState(), + // Vim's input state that triggered the last edit, used to repeat + // motions and operators with '.'. + lastEditInputState: undefined, + // Vim's action command before the last edit, used to repeat actions + // with '.' and insert mode repeat. + lastEditActionCommand: undefined, + // When using jk for navigation, if you move from a longer line to a + // shorter line, the cursor may clip to the end of the shorter line. + // If j is pressed again and cursor goes to the next line, the + // cursor should go back to its horizontal position on the longer + // line if it can. This is to keep track of the horizontal position. + lastHPos: -1, + // Doing the same with screen-position for gj/gk + lastHSPos: -1, + // The last motion command run. Cleared if a non-motion command gets + // executed in between. + lastMotion: null, + marks: {}, + // Mark for rendering fake cursor for visual mode. + fakeCursor: null, + insertMode: false, + // Repeat count for changes made in insert mode, triggered by key + // sequences like 3,i. Only exists when insertMode is true. + insertModeRepeat: undefined, + visualMode: false, + // If we are in visual line mode. No effect if visualMode is false. + visualLine: false, + visualBlock: false, + lastSelection: null, + lastPastedText: null, + sel: {}, + // Buffer-local/window-local values of vim options. + options: {} + }; + } + return cm.state.vim; + } + var vimGlobalState; + + function resetVimGlobalState() { + vimGlobalState = { + // The current search query. + searchQuery: null, + // Whether we are searching backwards. + searchIsReversed: false, + // Replace part of the last substituted pattern + lastSubstituteReplacePart: undefined, + jumpList: createCircularJumpList(), + macroModeState: new MacroModeState, + // Recording latest f, t, F or T motion command. + lastChararacterSearch: { + increment: 0, + forward: true, + selectedCharacter: '' + }, + registerController: new RegisterController({}), + // search history buffer + searchHistoryController: new HistoryController({}), + // ex Command history buffer + exCommandHistoryController: new HistoryController({}) + }; + for (var optionName in options) { + var option = options[optionName]; + option.value = option.defaultValue; + } + } + + var lastInsertModeKeyTimer; + var vimApi = { + buildKeyMap: function() { + // TODO: Convert keymap into dictionary format for fast lookup. + }, + // Testing hook, though it might be useful to expose the register + // controller anyways. + getRegisterController: function() { + return vimGlobalState.registerController; + }, + // Testing hook. + resetVimGlobalState_: resetVimGlobalState, + + // Testing hook. + getVimGlobalState_: function() { + return vimGlobalState; + }, + + // Testing hook. + maybeInitVimState_: maybeInitVimState, + + suppressErrorLogging: false, + + InsertModeKey: InsertModeKey, + map: function(lhs, rhs, ctx) { + // Add user defined key bindings. + exCommandDispatcher.map(lhs, rhs, ctx); + }, + unmap: function(lhs, ctx) { + exCommandDispatcher.unmap(lhs, ctx); + }, + // TODO: Expose setOption and getOption as instance methods. Need to decide how to namespace + // them, or somehow make them work with the existing CodeMirror setOption/getOption API. + setOption: setOption, + getOption: getOption, + defineOption: defineOption, + defineEx: function(name, prefix, func) { + if (!prefix) { + prefix = name; + } else if (name.indexOf(prefix) !== 0) { + throw new Error('(Vim.defineEx) "' + prefix + '" is not a prefix of "' + name + '", command not registered'); + } + exCommands[name] = func; + exCommandDispatcher.commandMap_[prefix] = { + name: name, + shortName: prefix, + type: 'api' + }; + }, + handleKey: function(cm, key, origin) { + var command = this.findKey(cm, key, origin); + if (typeof command === 'function') { + return command(); + } + }, + /** + * This is the outermost function called by CodeMirror, after keys have + * been mapped to their Vim equivalents. + * + * Finds a command based on the key (and cached keys if there is a + * multi-key sequence). Returns `undefined` if no key is matched, a noop + * function if a partial match is found (multi-key), and a function to + * execute the bound command if a a key is matched. The function always + * returns true. + */ + findKey: function(cm, key, origin) { + var vim = maybeInitVimState(cm); + + function handleMacroRecording() { + var macroModeState = vimGlobalState.macroModeState; + if (macroModeState.isRecording) { + if (key == 'q') { + macroModeState.exitMacroRecordMode(); + clearInputState(cm); + return true; + } + if (origin != 'mapping') { + logKey(macroModeState, key); + } + } + } + + function handleEsc() { + if (key == '<Esc>') { + // Clear input state and get back to normal mode. + clearInputState(cm); + if (vim.visualMode) { + exitVisualMode(cm); + } else if (vim.insertMode) { + exitInsertMode(cm); + } + return true; + } + } + + function doKeyToKey(keys) { + // TODO: prevent infinite recursion. + var match; + while (keys) { + // Pull off one command key, which is either a single character + // or a special sequence wrapped in '<' and '>', e.g. '<Space>'. + match = (/<\w+-.+?>|<\w+>|./).exec(keys); + key = match[0]; + keys = keys.substring(match.index + key.length); + CodeMirror.Vim.handleKey(cm, key, 'mapping'); + } + } + + function handleKeyInsertMode() { + if (handleEsc()) { + return true; + } + var keys = vim.inputState.keyBuffer = vim.inputState.keyBuffer + key; + var keysAreChars = key.length == 1; + var match = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert'); + // Need to check all key substrings in insert mode. + while (keys.length > 1 && match.type != 'full') { + var keys = vim.inputState.keyBuffer = keys.slice(1); + var thisMatch = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert'); + if (thisMatch.type != 'none') { + match = thisMatch; + } + } + if (match.type == 'none') { + clearInputState(cm); + return false; + } else if (match.type == 'partial') { + if (lastInsertModeKeyTimer) { + window.clearTimeout(lastInsertModeKeyTimer); + } + lastInsertModeKeyTimer = window.setTimeout( + function() { + if (vim.insertMode && vim.inputState.keyBuffer) { + clearInputState(cm); + } + }, + getOption('insertModeEscKeysTimeout')); + return !keysAreChars; + } + + if (lastInsertModeKeyTimer) { + window.clearTimeout(lastInsertModeKeyTimer); + } + if (keysAreChars) { + var here = cm.getCursor(); + cm.replaceRange('', offsetCursor(here, 0, -(keys.length - 1)), here, '+input'); + } + clearInputState(cm); + return match.command; + } + + function handleKeyNonInsertMode() { + if (handleMacroRecording() || handleEsc()) { + return true; + }; + + var keys = vim.inputState.keyBuffer = vim.inputState.keyBuffer + key; + if (/^[1-9]\d*$/.test(keys)) { + return true; + } + + var keysMatcher = /^(\d*)(.*)$/.exec(keys); + if (!keysMatcher) { + clearInputState(cm); + return false; + } + var context = vim.visualMode ? 'visual' : + 'normal'; + var match = commandDispatcher.matchCommand(keysMatcher[2] || keysMatcher[1], defaultKeymap, vim.inputState, context); + if (match.type == 'none') { + clearInputState(cm); + return false; + } else if (match.type == 'partial') { + return true; + } + + vim.inputState.keyBuffer = ''; + var keysMatcher = /^(\d*)(.*)$/.exec(keys); + if (keysMatcher[1] && keysMatcher[1] != '0') { + vim.inputState.pushRepeatDigit(keysMatcher[1]); + } + return match.command; + } + + var command; + if (vim.insertMode) { + command = handleKeyInsertMode(); + } else { + command = handleKeyNonInsertMode(); + } + if (command === false) { + return undefined; + } else if (command === true) { + // TODO: Look into using CodeMirror's multi-key handling. + // Return no-op since we are caching the key. Counts as handled, but + // don't want act on it just yet. + return function() {}; + } else { + return function() { + return cm.operation(function() { + cm.curOp.isVimOp = true; + try { + if (command.type == 'keyToKey') { + doKeyToKey(command.toKeys); + } else { + commandDispatcher.processCommand(cm, vim, command); + } + } catch (e) { + // clear VIM state in case it's in a bad state. + cm.state.vim = undefined; + maybeInitVimState(cm); + if (!CodeMirror.Vim.suppressErrorLogging) { + console['log'](e); + } + throw e; + } + return true; + }); + }; + } + }, + handleEx: function(cm, input) { + exCommandDispatcher.processCommand(cm, input); + }, + + defineMotion: defineMotion, + defineAction: defineAction, + defineOperator: defineOperator, + mapCommand: mapCommand, + _mapCommand: _mapCommand, + + defineRegister: defineRegister, + + exitVisualMode: exitVisualMode, + exitInsertMode: exitInsertMode + }; + + // Represents the current input state. + function InputState() { + this.prefixRepeat = []; + this.motionRepeat = []; + + this.operator = null; + this.operatorArgs = null; + this.motion = null; + this.motionArgs = null; + this.keyBuffer = []; // For matching multi-key commands. + this.registerName = null; // Defaults to the unnamed register. + } + InputState.prototype.pushRepeatDigit = function(n) { + if (!this.operator) { + this.prefixRepeat = this.prefixRepeat.concat(n); + } else { + this.motionRepeat = this.motionRepeat.concat(n); + } + }; + InputState.prototype.getRepeat = function() { + var repeat = 0; + if (this.prefixRepeat.length > 0 || this.motionRepeat.length > 0) { + repeat = 1; + if (this.prefixRepeat.length > 0) { + repeat *= parseInt(this.prefixRepeat.join(''), 10); + } + if (this.motionRepeat.length > 0) { + repeat *= parseInt(this.motionRepeat.join(''), 10); + } + } + return repeat; + }; + + function clearInputState(cm, reason) { + cm.state.vim.inputState = new InputState(); + CodeMirror.signal(cm, 'vim-command-done', reason); + } + + /* + * Register stores information about copy and paste registers. Besides + * text, a register must store whether it is linewise (i.e., when it is + * pasted, should it insert itself into a new line, or should the text be + * inserted at the cursor position.) + */ + function Register(text, linewise, blockwise) { + this.clear(); + this.keyBuffer = [text || '']; + this.insertModeChanges = []; + this.searchQueries = []; + this.linewise = !!linewise; + this.blockwise = !!blockwise; + } + Register.prototype = { + setText: function(text, linewise, blockwise) { + this.keyBuffer = [text || '']; + this.linewise = !!linewise; + this.blockwise = !!blockwise; + }, + pushText: function(text, linewise) { + // if this register has ever been set to linewise, use linewise. + if (linewise) { + if (!this.linewise) { + this.keyBuffer.push('\n'); + } + this.linewise = true; + } + this.keyBuffer.push(text); + }, + pushInsertModeChanges: function(changes) { + this.insertModeChanges.push(createInsertModeChanges(changes)); + }, + pushSearchQuery: function(query) { + this.searchQueries.push(query); + }, + clear: function() { + this.keyBuffer = []; + this.insertModeChanges = []; + this.searchQueries = []; + this.linewise = false; + }, + toString: function() { + return this.keyBuffer.join(''); + } + }; + + /** + * Defines an external register. + * + * The name should be a single character that will be used to reference the register. + * The register should support setText, pushText, clear, and toString(). See Register + * for a reference implementation. + */ + function defineRegister(name, register) { + var registers = vimGlobalState.registerController.registers[name]; + if (!name || name.length != 1) { + throw Error('Register name must be 1 character'); + } + if (registers[name]) { + throw Error('Register already defined ' + name); + } + registers[name] = register; + validRegisters.push(name); + } + + /* + * vim registers allow you to keep many independent copy and paste buffers. + * See http://usevim.com/2012/04/13/registers/ for an introduction. + * + * RegisterController keeps the state of all the registers. An initial + * state may be passed in. The unnamed register '"' will always be + * overridden. + */ + function RegisterController(registers) { + this.registers = registers; + this.unnamedRegister = registers['"'] = new Register(); + registers['.'] = new Register(); + registers[':'] = new Register(); + registers['/'] = new Register(); + } + RegisterController.prototype = { + pushText: function(registerName, operator, text, linewise, blockwise) { + if (linewise && text.charAt(0) == '\n') { + text = text.slice(1) + '\n'; + } + if (linewise && text.charAt(text.length - 1) !== '\n') { + text += '\n'; + } + // Lowercase and uppercase registers refer to the same register. + // Uppercase just means append. + var register = this.isValidRegister(registerName) ? + this.getRegister(registerName) : null; + // if no register/an invalid register was specified, things go to the + // default registers + if (!register) { + switch (operator) { + case 'yank': + // The 0 register contains the text from the most recent yank. + this.registers['0'] = new Register(text, linewise, blockwise); + break; + case 'delete': + case 'change': + if (text.indexOf('\n') == -1) { + // Delete less than 1 line. Update the small delete register. + this.registers['-'] = new Register(text, linewise); + } else { + // Shift down the contents of the numbered registers and put the + // deleted text into register 1. + this.shiftNumericRegisters_(); + this.registers['1'] = new Register(text, linewise); + } + break; + } + // Make sure the unnamed register is set to what just happened + this.unnamedRegister.setText(text, linewise, blockwise); + return; + } + + // If we've gotten to this point, we've actually specified a register + var append = isUpperCase(registerName); + if (append) { + register.pushText(text, linewise); + } else { + register.setText(text, linewise, blockwise); + } + // The unnamed register always has the same value as the last used + // register. + this.unnamedRegister.setText(register.toString(), linewise); + }, + // Gets the register named @name. If one of @name doesn't already exist, + // create it. If @name is invalid, return the unnamedRegister. + getRegister: function(name) { + if (!this.isValidRegister(name)) { + return this.unnamedRegister; + } + name = name.toLowerCase(); + if (!this.registers[name]) { + this.registers[name] = new Register(); + } + return this.registers[name]; + }, + isValidRegister: function(name) { + return name && inArray(name, validRegisters); + }, + shiftNumericRegisters_: function() { + for (var i = 9; i >= 2; i--) { + this.registers[i] = this.getRegister('' + (i - 1)); + } + } + }; + + function HistoryController() { + this.historyBuffer = []; + this.iterator; + this.initialPrefix = null; + } + HistoryController.prototype = { + // the input argument here acts a user entered prefix for a small time + // until we start autocompletion in which case it is the autocompleted. + nextMatch: function(input, up) { + var historyBuffer = this.historyBuffer; + var dir = up ? -1 : 1; + if (this.initialPrefix === null) this.initialPrefix = input; + for (var i = this.iterator + dir; up ? i >= 0 : i < historyBuffer.length; i += dir) { + var element = historyBuffer[i]; + for (var j = 0; j <= element.length; j++) { + if (this.initialPrefix == element.substring(0, j)) { + this.iterator = i; + return element; + } + } + } + // should return the user input in case we reach the end of buffer. + if (i >= historyBuffer.length) { + this.iterator = historyBuffer.length; + return this.initialPrefix; + } + // return the last autocompleted query or exCommand as it is. + if (i < 0) return input; + }, + pushInput: function(input) { + var index = this.historyBuffer.indexOf(input); + if (index > -1) this.historyBuffer.splice(index, 1); + if (input.length) this.historyBuffer.push(input); + }, + reset: function() { + this.initialPrefix = null; + this.iterator = this.historyBuffer.length; + } + }; + var commandDispatcher = { + matchCommand: function(keys, keyMap, inputState, context) { + var matches = commandMatches(keys, keyMap, context, inputState); + if (!matches.full && !matches.partial) { + return { + type: 'none' + }; + } else if (!matches.full && matches.partial) { + return { + type: 'partial' + }; + } + + var bestMatch; + for (var i = 0; i < matches.full.length; i++) { + var match = matches.full[i]; + if (!bestMatch) { + bestMatch = match; + } + } + if (bestMatch.keys.slice(-11) == '<character>') { + inputState.selectedCharacter = lastChar(keys); + } + return { + type: 'full', + command: bestMatch + }; + }, + processCommand: function(cm, vim, command) { + vim.inputState.repeatOverride = command.repeatOverride; + switch (command.type) { + case 'motion': + this.processMotion(cm, vim, command); + break; + case 'operator': + this.processOperator(cm, vim, command); + break; + case 'operatorMotion': + this.processOperatorMotion(cm, vim, command); + break; + case 'action': + this.processAction(cm, vim, command); + break; + case 'search': + this.processSearch(cm, vim, command); + break; + case 'ex': + case 'keyToEx': + this.processEx(cm, vim, command); + break; + default: + break; + } + }, + processMotion: function(cm, vim, command) { + vim.inputState.motion = command.motion; + vim.inputState.motionArgs = copyArgs(command.motionArgs); + this.evalInput(cm, vim); + }, + processOperator: function(cm, vim, command) { + var inputState = vim.inputState; + if (inputState.operator) { + if (inputState.operator == command.operator) { + // Typing an operator twice like 'dd' makes the operator operate + // linewise + inputState.motion = 'expandToLine'; + inputState.motionArgs = { + linewise: true + }; + this.evalInput(cm, vim); + return; + } else { + // 2 different operators in a row doesn't make sense. + clearInputState(cm); + } + } + inputState.operator = command.operator; + inputState.operatorArgs = copyArgs(command.operatorArgs); + if (vim.visualMode) { + // Operating on a selection in visual mode. We don't need a motion. + this.evalInput(cm, vim); + } + }, + processOperatorMotion: function(cm, vim, command) { + var visualMode = vim.visualMode; + var operatorMotionArgs = copyArgs(command.operatorMotionArgs); + if (operatorMotionArgs) { + // Operator motions may have special behavior in visual mode. + if (visualMode && operatorMotionArgs.visualLine) { + vim.visualLine = true; + } + } + this.processOperator(cm, vim, command); + if (!visualMode) { + this.processMotion(cm, vim, command); + } + }, + processAction: function(cm, vim, command) { + var inputState = vim.inputState; + var repeat = inputState.getRepeat(); + var repeatIsExplicit = !!repeat; + var actionArgs = copyArgs(command.actionArgs) || {}; + if (inputState.selectedCharacter) { + actionArgs.selectedCharacter = inputState.selectedCharacter; + } + // Actions may or may not have motions and operators. Do these first. + if (command.operator) { + this.processOperator(cm, vim, command); + } + if (command.motion) { + this.processMotion(cm, vim, command); + } + if (command.motion || command.operator) { + this.evalInput(cm, vim); + } + actionArgs.repeat = repeat || 1; + actionArgs.repeatIsExplicit = repeatIsExplicit; + actionArgs.registerName = inputState.registerName; + clearInputState(cm); + vim.lastMotion = null; + if (command.isEdit) { + this.recordLastEdit(vim, inputState, command); + } + actions[command.action](cm, actionArgs, vim); + }, + processSearch: function(cm, vim, command) { + if (!cm.getSearchCursor) { + // Search depends on SearchCursor. + return; + } + var forward = command.searchArgs.forward; + var wholeWordOnly = command.searchArgs.wholeWordOnly; + getSearchState(cm).setReversed(!forward); + var promptPrefix = (forward) ? '/' : '?'; + var originalQuery = getSearchState(cm).getQuery(); + var originalScrollPos = cm.getScrollInfo(); + + function handleQuery(query, ignoreCase, smartCase) { + vimGlobalState.searchHistoryController.pushInput(query); + vimGlobalState.searchHistoryController.reset(); + try { + updateSearchQuery(cm, query, ignoreCase, smartCase); + } catch (e) { + showConfirm(cm, 'Invalid regex: ' + query); + clearInputState(cm); + return; + } + commandDispatcher.processMotion(cm, vim, { + type: 'motion', + motion: 'findNext', + motionArgs: { + forward: true, + toJumplist: command.searchArgs.toJumplist + } + }); + } + + function onPromptClose(query) { + cm.scrollTo(originalScrollPos.left, originalScrollPos.top); + handleQuery(query, true /** ignoreCase */ , true /** smartCase */ ); + var macroModeState = vimGlobalState.macroModeState; + if (macroModeState.isRecording) { + logSearchQuery(macroModeState, query); + } + } + + function onPromptKeyUp(e, query, close) { + var keyName = CodeMirror.keyName(e), + up; + if (keyName == 'Up' || keyName == 'Down') { + up = keyName == 'Up' ? true : false; + query = vimGlobalState.searchHistoryController.nextMatch(query, up) || ''; + close(query); + } else { + if (keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift') + vimGlobalState.searchHistoryController.reset(); + } + var parsedQuery; + try { + parsedQuery = updateSearchQuery(cm, query, + true /** ignoreCase */ , true /** smartCase */ ); + } catch (e) { + // Swallow bad regexes for incremental search. + } + if (parsedQuery) { + cm.scrollIntoView(findNext(cm, !forward, parsedQuery), 30); + } else { + clearSearchHighlight(cm); + cm.scrollTo(originalScrollPos.left, originalScrollPos.top); + } + } + + function onPromptKeyDown(e, query, close) { + var keyName = CodeMirror.keyName(e); + if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[' || + (keyName == 'Backspace' && query == '')) { + vimGlobalState.searchHistoryController.pushInput(query); + vimGlobalState.searchHistoryController.reset(); + updateSearchQuery(cm, originalQuery); + clearSearchHighlight(cm); + cm.scrollTo(originalScrollPos.left, originalScrollPos.top); + CodeMirror.e_stop(e); + clearInputState(cm); + close(); + cm.focus(); + } else if (keyName == 'Ctrl-U') { + // Ctrl-U clears input. + CodeMirror.e_stop(e); + close(''); + } + } + switch (command.searchArgs.querySrc) { + case 'prompt': + var macroModeState = vimGlobalState.macroModeState; + if (macroModeState.isPlaying) { + var query = macroModeState.replaySearchQueries.shift(); + handleQuery(query, true /** ignoreCase */ , false /** smartCase */ ); + } else { + showPrompt(cm, { + onClose: onPromptClose, + prefix: promptPrefix, + desc: searchPromptDesc, + onKeyUp: onPromptKeyUp, + onKeyDown: onPromptKeyDown + }); + } + break; + case 'wordUnderCursor': + var word = expandWordUnderCursor(cm, false /** inclusive */ , + true /** forward */ , false /** bigWord */ , + true /** noSymbol */ ); + var isKeyword = true; + if (!word) { + word = expandWordUnderCursor(cm, false /** inclusive */ , + true /** forward */ , false /** bigWord */ , + false /** noSymbol */ ); + isKeyword = false; + } + if (!word) { + return; + } + var query = cm.getLine(word.start.line).substring(word.start.ch, + word.end.ch); + if (isKeyword && wholeWordOnly) { + query = '\\b' + query + '\\b'; + } else { + query = escapeRegex(query); + } + + // cachedCursor is used to save the old position of the cursor + // when * or # causes vim to seek for the nearest word and shift + // the cursor before entering the motion. + vimGlobalState.jumpList.cachedCursor = cm.getCursor(); + cm.setCursor(word.start); + + handleQuery(query, true /** ignoreCase */ , false /** smartCase */ ); + break; + } + }, + processEx: function(cm, vim, command) { + function onPromptClose(input) { + // Give the prompt some time to close so that if processCommand shows + // an error, the elements don't overlap. + vimGlobalState.exCommandHistoryController.pushInput(input); + vimGlobalState.exCommandHistoryController.reset(); + exCommandDispatcher.processCommand(cm, input); + } + + function onPromptKeyDown(e, input, close) { + var keyName = CodeMirror.keyName(e), + up; + if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[' || + (keyName == 'Backspace' && input == '')) { + vimGlobalState.exCommandHistoryController.pushInput(input); + vimGlobalState.exCommandHistoryController.reset(); + CodeMirror.e_stop(e); + clearInputState(cm); + close(); + cm.focus(); + } + if (keyName == 'Up' || keyName == 'Down') { + up = keyName == 'Up' ? true : false; + input = vimGlobalState.exCommandHistoryController.nextMatch(input, up) || ''; + close(input); + } else if (keyName == 'Ctrl-U') { + // Ctrl-U clears input. + CodeMirror.e_stop(e); + close(''); + } else { + if (keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift') + vimGlobalState.exCommandHistoryController.reset(); + } + } + if (command.type == 'keyToEx') { + // Handle user defined Ex to Ex mappings + exCommandDispatcher.processCommand(cm, command.exArgs.input); + } else { + if (vim.visualMode) { + showPrompt(cm, { + onClose: onPromptClose, + prefix: ':', + value: '\'<,\'>', + onKeyDown: onPromptKeyDown + }); + } else { + showPrompt(cm, { + onClose: onPromptClose, + prefix: ':', + onKeyDown: onPromptKeyDown + }); + } + } + }, + evalInput: function(cm, vim) { + // If the motion comand is set, execute both the operator and motion. + // Otherwise return. + var inputState = vim.inputState; + var motion = inputState.motion; + var motionArgs = inputState.motionArgs || {}; + var operator = inputState.operator; + var operatorArgs = inputState.operatorArgs || {}; + var registerName = inputState.registerName; + var sel = vim.sel; + // TODO: Make sure cm and vim selections are identical outside visual mode. + var origHead = copyCursor(vim.visualMode ? clipCursorToContent(cm, sel.head) : cm.getCursor('head')); + var origAnchor = copyCursor(vim.visualMode ? clipCursorToContent(cm, sel.anchor) : cm.getCursor('anchor')); + var oldHead = copyCursor(origHead); + var oldAnchor = copyCursor(origAnchor); + var newHead, newAnchor; + var repeat; + if (operator) { + this.recordLastEdit(vim, inputState); + } + if (inputState.repeatOverride !== undefined) { + // If repeatOverride is specified, that takes precedence over the + // input state's repeat. Used by Ex mode and can be user defined. + repeat = inputState.repeatOverride; + } else { + repeat = inputState.getRepeat(); + } + if (repeat > 0 && motionArgs.explicitRepeat) { + motionArgs.repeatIsExplicit = true; + } else if (motionArgs.noRepeat || + (!motionArgs.explicitRepeat && repeat === 0)) { + repeat = 1; + motionArgs.repeatIsExplicit = false; + } + if (inputState.selectedCharacter) { + // If there is a character input, stick it in all of the arg arrays. + motionArgs.selectedCharacter = operatorArgs.selectedCharacter = + inputState.selectedCharacter; + } + motionArgs.repeat = repeat; + clearInputState(cm); + if (motion) { + var motionResult = motions[motion](cm, origHead, motionArgs, vim); + vim.lastMotion = motions[motion]; + if (!motionResult) { + return; + } + if (motionArgs.toJumplist) { + var jumpList = vimGlobalState.jumpList; + // if the current motion is # or *, use cachedCursor + var cachedCursor = jumpList.cachedCursor; + if (cachedCursor) { + recordJumpPosition(cm, cachedCursor, motionResult); + delete jumpList.cachedCursor; + } else { + recordJumpPosition(cm, origHead, motionResult); + } + } + if (motionResult instanceof Array) { + newAnchor = motionResult[0]; + newHead = motionResult[1]; + } else { + newHead = motionResult; + } + // TODO: Handle null returns from motion commands better. + if (!newHead) { + newHead = copyCursor(origHead); + } + if (vim.visualMode) { + if (!(vim.visualBlock && newHead.ch === Infinity)) { + newHead = clipCursorToContent(cm, newHead, vim.visualBlock); + } + if (newAnchor) { + newAnchor = clipCursorToContent(cm, newAnchor, true); + } + newAnchor = newAnchor || oldAnchor; + sel.anchor = newAnchor; + sel.head = newHead; + updateCmSelection(cm); + updateMark(cm, vim, '<', + cursorIsBefore(newAnchor, newHead) ? newAnchor : newHead); + updateMark(cm, vim, '>', + cursorIsBefore(newAnchor, newHead) ? newHead : newAnchor); + } else if (!operator) { + newHead = clipCursorToContent(cm, newHead); + cm.setCursor(newHead.line, newHead.ch); + } + } + if (operator) { + if (operatorArgs.lastSel) { + // Replaying a visual mode operation + newAnchor = oldAnchor; + var lastSel = operatorArgs.lastSel; + var lineOffset = Math.abs(lastSel.head.line - lastSel.anchor.line); + var chOffset = Math.abs(lastSel.head.ch - lastSel.anchor.ch); + if (lastSel.visualLine) { + // Linewise Visual mode: The same number of lines. + newHead = Pos(oldAnchor.line + lineOffset, oldAnchor.ch); + } else if (lastSel.visualBlock) { + // Blockwise Visual mode: The same number of lines and columns. + newHead = Pos(oldAnchor.line + lineOffset, oldAnchor.ch + chOffset); + } else if (lastSel.head.line == lastSel.anchor.line) { + // Normal Visual mode within one line: The same number of characters. + newHead = Pos(oldAnchor.line, oldAnchor.ch + chOffset); + } else { + // Normal Visual mode with several lines: The same number of lines, in the + // last line the same number of characters as in the last line the last time. + newHead = Pos(oldAnchor.line + lineOffset, oldAnchor.ch); + } + vim.visualMode = true; + vim.visualLine = lastSel.visualLine; + vim.visualBlock = lastSel.visualBlock; + sel = vim.sel = { + anchor: newAnchor, + head: newHead + }; + updateCmSelection(cm); + } else if (vim.visualMode) { + operatorArgs.lastSel = { + anchor: copyCursor(sel.anchor), + head: copyCursor(sel.head), + visualBlock: vim.visualBlock, + visualLine: vim.visualLine + }; + } + var curStart, curEnd, linewise, mode; + var cmSel; + if (vim.visualMode) { + // Init visual op + curStart = cursorMin(sel.head, sel.anchor); + curEnd = cursorMax(sel.head, sel.anchor); + linewise = vim.visualLine || operatorArgs.linewise; + mode = vim.visualBlock ? 'block' : + linewise ? 'line' : + 'char'; + cmSel = makeCmSelection(cm, { + anchor: curStart, + head: curEnd + }, mode); + if (linewise) { + var ranges = cmSel.ranges; + if (mode == 'block') { + // Linewise operators in visual block mode extend to end of line + for (var i = 0; i < ranges.length; i++) { + ranges[i].head.ch = lineLength(cm, ranges[i].head.line); + } + } else if (mode == 'line') { + ranges[0].head = Pos(ranges[0].head.line + 1, 0); + } + } + } else { + // Init motion op + curStart = copyCursor(newAnchor || oldAnchor); + curEnd = copyCursor(newHead || oldHead); + if (cursorIsBefore(curEnd, curStart)) { + var tmp = curStart; + curStart = curEnd; + curEnd = tmp; + } + linewise = motionArgs.linewise || operatorArgs.linewise; + if (linewise) { + // Expand selection to entire line. + expandSelectionToLine(cm, curStart, curEnd); + } else if (motionArgs.forward) { + // Clip to trailing newlines only if the motion goes forward. + clipToLine(cm, curStart, curEnd); + } + mode = 'char'; + var exclusive = !motionArgs.inclusive || linewise; + cmSel = makeCmSelection(cm, { + anchor: curStart, + head: curEnd + }, mode, exclusive); + } + cm.setSelections(cmSel.ranges, cmSel.primary); + vim.lastMotion = null; + operatorArgs.repeat = repeat; // For indent in visual mode. + operatorArgs.registerName = registerName; + // Keep track of linewise as it affects how paste and change behave. + operatorArgs.linewise = linewise; + var operatorMoveTo = operators[operator]( + cm, operatorArgs, cmSel.ranges, oldAnchor, newHead); + if (vim.visualMode) { + exitVisualMode(cm, operatorMoveTo != null); + } + if (operatorMoveTo) { + cm.setCursor(operatorMoveTo); + } + } + }, + recordLastEdit: function(vim, inputState, actionCommand) { + var macroModeState = vimGlobalState.macroModeState; + if (macroModeState.isPlaying) { + return; + } + vim.lastEditInputState = inputState; + vim.lastEditActionCommand = actionCommand; + macroModeState.lastInsertModeChanges.changes = []; + macroModeState.lastInsertModeChanges.expectCursorActivityForChange = false; + } + }; + + /** + * typedef {Object{line:number,ch:number}} Cursor An object containing the + * position of the cursor. + */ + // All of the functions below return Cursor objects. + var motions = { + moveToTopLine: function(cm, _head, motionArgs) { + var line = getUserVisibleLines(cm).top + motionArgs.repeat - 1; + return Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line))); + }, + moveToMiddleLine: function(cm) { + var range = getUserVisibleLines(cm); + var line = Math.floor((range.top + range.bottom) * 0.5); + return Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line))); + }, + moveToBottomLine: function(cm, _head, motionArgs) { + var line = getUserVisibleLines(cm).bottom - motionArgs.repeat + 1; + return Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line))); + }, + expandToLine: function(_cm, head, motionArgs) { + // Expands forward to end of line, and then to next line if repeat is + // >1. Does not handle backward motion! + var cur = head; + return Pos(cur.line + motionArgs.repeat - 1, Infinity); + }, + findNext: function(cm, _head, motionArgs) { + var state = getSearchState(cm); + var query = state.getQuery(); + if (!query) { + return; + } + var prev = !motionArgs.forward; + // If search is initiated with ? instead of /, negate direction. + prev = (state.isReversed()) ? !prev : prev; + highlightSearchMatches(cm, query); + return findNext(cm, prev /** prev */ , query, motionArgs.repeat); + }, + goToMark: function(cm, _head, motionArgs, vim) { + var mark = vim.marks[motionArgs.selectedCharacter]; + if (mark) { + var pos = mark.find(); + return motionArgs.linewise ? { + line: pos.line, + ch: findFirstNonWhiteSpaceCharacter(cm.getLine(pos.line)) + } : pos; + } + return null; + }, + moveToOtherHighlightedEnd: function(cm, _head, motionArgs, vim) { + if (vim.visualBlock && motionArgs.sameLine) { + var sel = vim.sel; + return [ + clipCursorToContent(cm, Pos(sel.anchor.line, sel.head.ch)), + clipCursorToContent(cm, Pos(sel.head.line, sel.anchor.ch)) + ]; + } else { + return ([vim.sel.head, vim.sel.anchor]); + } + }, + jumpToMark: function(cm, head, motionArgs, vim) { + var best = head; + for (var i = 0; i < motionArgs.repeat; i++) { + var cursor = best; + for (var key in vim.marks) { + if (!isLowerCase(key)) { + continue; + } + var mark = vim.marks[key].find(); + var isWrongDirection = (motionArgs.forward) ? + cursorIsBefore(mark, cursor) : cursorIsBefore(cursor, mark); + + if (isWrongDirection) { + continue; + } + if (motionArgs.linewise && (mark.line == cursor.line)) { + continue; + } + + var equal = cursorEqual(cursor, best); + var between = (motionArgs.forward) ? + cursorIsBetween(cursor, mark, best) : + cursorIsBetween(best, mark, cursor); + + if (equal || between) { + best = mark; + } + } + } + + if (motionArgs.linewise) { + // Vim places the cursor on the first non-whitespace character of + // the line if there is one, else it places the cursor at the end + // of the line, regardless of whether a mark was found. + best = Pos(best.line, findFirstNonWhiteSpaceCharacter(cm.getLine(best.line))); + } + return best; + }, + moveByCharacters: function(_cm, head, motionArgs) { + var cur = head; + var repeat = motionArgs.repeat; + var ch = motionArgs.forward ? cur.ch + repeat : cur.ch - repeat; + return Pos(cur.line, ch); + }, + moveByLines: function(cm, head, motionArgs, vim) { + var cur = head; + var endCh = cur.ch; + // Depending what our last motion was, we may want to do different + // things. If our last motion was moving vertically, we want to + // preserve the HPos from our last horizontal move. If our last motion + // was going to the end of a line, moving vertically we should go to + // the end of the line, etc. + switch (vim.lastMotion) { + case this.moveByLines: + case this.moveByDisplayLines: + case this.moveByScroll: + case this.moveToColumn: + case this.moveToEol: + endCh = vim.lastHPos; + break; + default: + vim.lastHPos = endCh; + } + var repeat = motionArgs.repeat + (motionArgs.repeatOffset || 0); + var line = motionArgs.forward ? cur.line + repeat : cur.line - repeat; + var first = cm.firstLine(); + var last = cm.lastLine(); + // Vim cancels linewise motions that start on an edge and move beyond + // that edge. It does not cancel motions that do not start on an edge. + if ((line < first && cur.line == first) || + (line > last && cur.line == last)) { + return; + } + if (motionArgs.toFirstChar) { + endCh = findFirstNonWhiteSpaceCharacter(cm.getLine(line)); + vim.lastHPos = endCh; + } + vim.lastHSPos = cm.charCoords(Pos(line, endCh), 'div').left; + return Pos(line, endCh); + }, + moveByDisplayLines: function(cm, head, motionArgs, vim) { + var cur = head; + switch (vim.lastMotion) { + case this.moveByDisplayLines: + case this.moveByScroll: + case this.moveByLines: + case this.moveToColumn: + case this.moveToEol: + break; + default: + vim.lastHSPos = cm.charCoords(cur, 'div').left; + } + var repeat = motionArgs.repeat; + var res = cm.findPosV(cur, (motionArgs.forward ? repeat : -repeat), 'line', vim.lastHSPos); + if (res.hitSide) { + if (motionArgs.forward) { + var lastCharCoords = cm.charCoords(res, 'div'); + var goalCoords = { + top: lastCharCoords.top + 8, + left: vim.lastHSPos + }; + var res = cm.coordsChar(goalCoords, 'div'); + } else { + var resCoords = cm.charCoords(Pos(cm.firstLine(), 0), 'div'); + resCoords.left = vim.lastHSPos; + res = cm.coordsChar(resCoords, 'div'); + } + } + vim.lastHPos = res.ch; + return res; + }, + moveByPage: function(cm, head, motionArgs) { + // CodeMirror only exposes functions that move the cursor page down, so + // doing this bad hack to move the cursor and move it back. evalInput + // will move the cursor to where it should be in the end. + var curStart = head; + var repeat = motionArgs.repeat; + return cm.findPosV(curStart, (motionArgs.forward ? repeat : -repeat), 'page'); + }, + moveByParagraph: function(cm, head, motionArgs) { + var dir = motionArgs.forward ? 1 : -1; + return findParagraph(cm, head, motionArgs.repeat, dir); + }, + moveByScroll: function(cm, head, motionArgs, vim) { + var scrollbox = cm.getScrollInfo(); + var curEnd = null; + var repeat = motionArgs.repeat; + if (!repeat) { + repeat = scrollbox.clientHeight / (2 * cm.defaultTextHeight()); + } + var orig = cm.charCoords(head, 'local'); + motionArgs.repeat = repeat; + var curEnd = motions.moveByDisplayLines(cm, head, motionArgs, vim); + if (!curEnd) { + return null; + } + var dest = cm.charCoords(curEnd, 'local'); + cm.scrollTo(null, scrollbox.top + dest.top - orig.top); + return curEnd; + }, + moveByWords: function(cm, head, motionArgs) { + return moveToWord(cm, head, motionArgs.repeat, !!motionArgs.forward, !!motionArgs.wordEnd, !!motionArgs.bigWord); + }, + moveTillCharacter: function(cm, _head, motionArgs) { + var repeat = motionArgs.repeat; + var curEnd = moveToCharacter(cm, repeat, motionArgs.forward, + motionArgs.selectedCharacter); + var increment = motionArgs.forward ? -1 : 1; + recordLastCharacterSearch(increment, motionArgs); + if (!curEnd) return null; + curEnd.ch += increment; + return curEnd; + }, + moveToCharacter: function(cm, head, motionArgs) { + var repeat = motionArgs.repeat; + recordLastCharacterSearch(0, motionArgs); + return moveToCharacter(cm, repeat, motionArgs.forward, + motionArgs.selectedCharacter) || head; + }, + moveToSymbol: function(cm, head, motionArgs) { + var repeat = motionArgs.repeat; + return findSymbol(cm, repeat, motionArgs.forward, + motionArgs.selectedCharacter) || head; + }, + moveToColumn: function(cm, head, motionArgs, vim) { + var repeat = motionArgs.repeat; + // repeat is equivalent to which column we want to move to! + vim.lastHPos = repeat - 1; + vim.lastHSPos = cm.charCoords(head, 'div').left; + return moveToColumn(cm, repeat); + }, + moveToEol: function(cm, head, motionArgs, vim) { + var cur = head; + vim.lastHPos = Infinity; + var retval = Pos(cur.line + motionArgs.repeat - 1, Infinity); + var end = cm.clipPos(retval); + end.ch--; + vim.lastHSPos = cm.charCoords(end, 'div').left; + return retval; + }, + moveToFirstNonWhiteSpaceCharacter: function(cm, head) { + // Go to the start of the line where the text begins, or the end for + // whitespace-only lines + var cursor = head; + return Pos(cursor.line, + findFirstNonWhiteSpaceCharacter(cm.getLine(cursor.line))); + }, + moveToMatchedSymbol: function(cm, head) { + var cursor = head; + var line = cursor.line; + var ch = cursor.ch; + var lineText = cm.getLine(line); + var symbol; + do { + symbol = lineText.charAt(ch++); + if (symbol && isMatchableSymbol(symbol)) { + var style = cm.getTokenTypeAt(Pos(line, ch)); + if (style !== "string" && style !== "comment") { + break; + } + } + } while (symbol); + if (symbol) { + var matched = cm.findMatchingBracket(Pos(line, ch)); + return matched.to; + } else { + return cursor; + } + }, + moveToStartOfLine: function(_cm, head) { + return Pos(head.line, 0); + }, + moveToLineOrEdgeOfDocument: function(cm, _head, motionArgs) { + var lineNum = motionArgs.forward ? cm.lastLine() : cm.firstLine(); + if (motionArgs.repeatIsExplicit) { + lineNum = motionArgs.repeat - cm.getOption('firstLineNumber'); + } + return Pos(lineNum, + findFirstNonWhiteSpaceCharacter(cm.getLine(lineNum))); + }, + textObjectManipulation: function(cm, head, motionArgs, vim) { + // TODO: lots of possible exceptions that can be thrown here. Try da( + // outside of a () block. + + // TODO: adding <> >< to this map doesn't work, presumably because + // they're operators + var mirroredPairs = { + '(': ')', + ')': '(', + '{': '}', + '}': '{', + '[': ']', + ']': '[' + }; + var selfPaired = { + '\'': true, + '"': true + }; + + var character = motionArgs.selectedCharacter; + // 'b' refers to '()' block. + // 'B' refers to '{}' block. + if (character == 'b') { + character = '('; + } else if (character == 'B') { + character = '{'; + } + + // Inclusive is the difference between a and i + // TODO: Instead of using the additional text object map to perform text + // object operations, merge the map into the defaultKeyMap and use + // motionArgs to define behavior. Define separate entries for 'aw', + // 'iw', 'a[', 'i[', etc. + var inclusive = !motionArgs.textObjectInner; + + var tmp; + if (mirroredPairs[character]) { + tmp = selectCompanionObject(cm, head, character, inclusive); + } else if (selfPaired[character]) { + tmp = findBeginningAndEnd(cm, head, character, inclusive); + } else if (character === 'W') { + tmp = expandWordUnderCursor(cm, inclusive, true /** forward */ , + true /** bigWord */ ); + } else if (character === 'w') { + tmp = expandWordUnderCursor(cm, inclusive, true /** forward */ , + false /** bigWord */ ); + } else if (character === 'p') { + tmp = findParagraph(cm, head, motionArgs.repeat, 0, inclusive); + motionArgs.linewise = true; + if (vim.visualMode) { + if (!vim.visualLine) { + vim.visualLine = true; + } + } else { + var operatorArgs = vim.inputState.operatorArgs; + if (operatorArgs) { + operatorArgs.linewise = true; + } + tmp.end.line--; + } + } else { + // No text object defined for this, don't move. + return null; + } + + if (!cm.state.vim.visualMode) { + return [tmp.start, tmp.end]; + } else { + return expandSelection(cm, tmp.start, tmp.end); + } + }, + + repeatLastCharacterSearch: function(cm, head, motionArgs) { + var lastSearch = vimGlobalState.lastChararacterSearch; + var repeat = motionArgs.repeat; + var forward = motionArgs.forward === lastSearch.forward; + var increment = (lastSearch.increment ? 1 : 0) * (forward ? -1 : 1); + cm.moveH(-increment, 'char'); + motionArgs.inclusive = forward ? true : false; + var curEnd = moveToCharacter(cm, repeat, forward, lastSearch.selectedCharacter); + if (!curEnd) { + cm.moveH(increment, 'char'); + return head; + } + curEnd.ch += increment; + return curEnd; + } + }; + + function defineMotion(name, fn) { + motions[name] = fn; + } + + function fillArray(val, times) { + var arr = []; + for (var i = 0; i < times; i++) { + arr.push(val); + } + return arr; + } + /** + * An operator acts on a text selection. It receives the list of selections + * as input. The corresponding CodeMirror selection is guaranteed to + * match the input selection. + */ + var operators = { + change: function(cm, args, ranges) { + var finalHead, text; + var vim = cm.state.vim; + vimGlobalState.macroModeState.lastInsertModeChanges.inVisualBlock = vim.visualBlock; + if (!vim.visualMode) { + var anchor = ranges[0].anchor, + head = ranges[0].head; + text = cm.getRange(anchor, head); + var lastState = vim.lastEditInputState || {}; + if (lastState.motion == "moveByWords" && !isWhiteSpaceString(text)) { + // Exclude trailing whitespace if the range is not all whitespace. + var match = (/\s+$/).exec(text); + if (match && lastState.motionArgs && lastState.motionArgs.forward) { + head = offsetCursor(head, 0, -match[0].length); + text = text.slice(0, -match[0].length); + } + } + var prevLineEnd = new Pos(anchor.line - 1, Number.MAX_VALUE); + var wasLastLine = cm.firstLine() == cm.lastLine(); + if (head.line > cm.lastLine() && args.linewise && !wasLastLine) { + cm.replaceRange('', prevLineEnd, head); + } else { + cm.replaceRange('', anchor, head); + } + if (args.linewise) { + // Push the next line back down, if there is a next line. + if (!wasLastLine) { + cm.setCursor(prevLineEnd); + CodeMirror.commands.newlineAndIndent(cm); + } + // make sure cursor ends up at the end of the line. + anchor.ch = Number.MAX_VALUE; + } + finalHead = anchor; + } else { + text = cm.getSelection(); + var replacement = fillArray('', ranges.length); + cm.replaceSelections(replacement); + finalHead = cursorMin(ranges[0].head, ranges[0].anchor); + } + vimGlobalState.registerController.pushText( + args.registerName, 'change', text, + args.linewise, ranges.length > 1); + actions.enterInsertMode(cm, { + head: finalHead + }, cm.state.vim); + }, + // delete is a javascript keyword. + 'delete': function(cm, args, ranges) { + var finalHead, text; + var vim = cm.state.vim; + if (!vim.visualBlock) { + var anchor = ranges[0].anchor, + head = ranges[0].head; + if (args.linewise && + head.line != cm.firstLine() && + anchor.line == cm.lastLine() && + anchor.line == head.line - 1) { + // Special case for dd on last line (and first line). + if (anchor.line == cm.firstLine()) { + anchor.ch = 0; + } else { + anchor = Pos(anchor.line - 1, lineLength(cm, anchor.line - 1)); + } + } + text = cm.getRange(anchor, head); + cm.replaceRange('', anchor, head); + finalHead = anchor; + if (args.linewise) { + finalHead = motions.moveToFirstNonWhiteSpaceCharacter(cm, anchor); + } + } else { + text = cm.getSelection(); + var replacement = fillArray('', ranges.length); + cm.replaceSelections(replacement); + finalHead = ranges[0].anchor; + } + vimGlobalState.registerController.pushText( + args.registerName, 'delete', text, + args.linewise, vim.visualBlock); + return clipCursorToContent(cm, finalHead); + }, + indent: function(cm, args, ranges) { + var vim = cm.state.vim; + var startLine = ranges[0].anchor.line; + var endLine = vim.visualBlock ? + ranges[ranges.length - 1].anchor.line : + ranges[0].head.line; + // In visual mode, n> shifts the selection right n times, instead of + // shifting n lines right once. + var repeat = (vim.visualMode) ? args.repeat : 1; + if (args.linewise) { + // The only way to delete a newline is to delete until the start of + // the next line, so in linewise mode evalInput will include the next + // line. We don't want this in indent, so we go back a line. + endLine--; + } + for (var i = startLine; i <= endLine; i++) { + for (var j = 0; j < repeat; j++) { + cm.indentLine(i, args.indentRight); + } + } + return motions.moveToFirstNonWhiteSpaceCharacter(cm, ranges[0].anchor); + }, + changeCase: function(cm, args, ranges, oldAnchor, newHead) { + var selections = cm.getSelections(); + var swapped = []; + var toLower = args.toLower; + for (var j = 0; j < selections.length; j++) { + var toSwap = selections[j]; + var text = ''; + if (toLower === true) { + text = toSwap.toLowerCase(); + } else if (toLower === false) { + text = toSwap.toUpperCase(); + } else { + for (var i = 0; i < toSwap.length; i++) { + var character = toSwap.charAt(i); + text += isUpperCase(character) ? character.toLowerCase() : + character.toUpperCase(); + } + } + swapped.push(text); + } + cm.replaceSelections(swapped); + if (args.shouldMoveCursor) { + return newHead; + } else if (!cm.state.vim.visualMode && args.linewise && ranges[0].anchor.line + 1 == ranges[0].head.line) { + return motions.moveToFirstNonWhiteSpaceCharacter(cm, oldAnchor); + } else if (args.linewise) { + return oldAnchor; + } else { + return cursorMin(ranges[0].anchor, ranges[0].head); + } + }, + yank: function(cm, args, ranges, oldAnchor) { + var vim = cm.state.vim; + var text = cm.getSelection(); + var endPos = vim.visualMode ? cursorMin(vim.sel.anchor, vim.sel.head, ranges[0].head, ranges[0].anchor) : oldAnchor; + vimGlobalState.registerController.pushText( + args.registerName, 'yank', + text, args.linewise, vim.visualBlock); + return endPos; + } + }; + + function defineOperator(name, fn) { + operators[name] = fn; + } + + var actions = { + jumpListWalk: function(cm, actionArgs, vim) { + if (vim.visualMode) { + return; + } + var repeat = actionArgs.repeat; + var forward = actionArgs.forward; + var jumpList = vimGlobalState.jumpList; + + var mark = jumpList.move(cm, forward ? repeat : -repeat); + var markPos = mark ? mark.find() : undefined; + markPos = markPos ? markPos : cm.getCursor(); + cm.setCursor(markPos); + }, + scroll: function(cm, actionArgs, vim) { + if (vim.visualMode) { + return; + } + var repeat = actionArgs.repeat || 1; + var lineHeight = cm.defaultTextHeight(); + var top = cm.getScrollInfo().top; + var delta = lineHeight * repeat; + var newPos = actionArgs.forward ? top + delta : top - delta; + var cursor = copyCursor(cm.getCursor()); + var cursorCoords = cm.charCoords(cursor, 'local'); + if (actionArgs.forward) { + if (newPos > cursorCoords.top) { + cursor.line += (newPos - cursorCoords.top) / lineHeight; + cursor.line = Math.ceil(cursor.line); + cm.setCursor(cursor); + cursorCoords = cm.charCoords(cursor, 'local'); + cm.scrollTo(null, cursorCoords.top); + } else { + // Cursor stays within bounds. Just reposition the scroll window. + cm.scrollTo(null, newPos); + } + } else { + var newBottom = newPos + cm.getScrollInfo().clientHeight; + if (newBottom < cursorCoords.bottom) { + cursor.line -= (cursorCoords.bottom - newBottom) / lineHeight; + cursor.line = Math.floor(cursor.line); + cm.setCursor(cursor); + cursorCoords = cm.charCoords(cursor, 'local'); + cm.scrollTo( + null, cursorCoords.bottom - cm.getScrollInfo().clientHeight); + } else { + // Cursor stays within bounds. Just reposition the scroll window. + cm.scrollTo(null, newPos); + } + } + }, + scrollToCursor: function(cm, actionArgs) { + var lineNum = cm.getCursor().line; + var charCoords = cm.charCoords(Pos(lineNum, 0), 'local'); + var height = cm.getScrollInfo().clientHeight; + var y = charCoords.top; + var lineHeight = charCoords.bottom - y; + switch (actionArgs.position) { + case 'center': + y = y - (height / 2) + lineHeight; + break; + case 'bottom': + y = y - height + lineHeight; + break; + } + cm.scrollTo(null, y); + }, + replayMacro: function(cm, actionArgs, vim) { + var registerName = actionArgs.selectedCharacter; + var repeat = actionArgs.repeat; + var macroModeState = vimGlobalState.macroModeState; + if (registerName == '@') { + registerName = macroModeState.latestRegister; + } + while (repeat--) { + executeMacroRegister(cm, vim, macroModeState, registerName); + } + }, + enterMacroRecordMode: function(cm, actionArgs) { + var macroModeState = vimGlobalState.macroModeState; + var registerName = actionArgs.selectedCharacter; + macroModeState.enterMacroRecordMode(cm, registerName); + }, + enterInsertMode: function(cm, actionArgs, vim) { + if (cm.getOption('readOnly')) { + return; + } + vim.insertMode = true; + vim.insertModeRepeat = actionArgs && actionArgs.repeat || 1; + var insertAt = (actionArgs) ? actionArgs.insertAt : null; + var sel = vim.sel; + var head = actionArgs.head || cm.getCursor('head'); + var height = cm.listSelections().length; + if (insertAt == 'eol') { + head = Pos(head.line, lineLength(cm, head.line)); + } else if (insertAt == 'charAfter') { + head = offsetCursor(head, 0, 1); + } else if (insertAt == 'firstNonBlank') { + head = motions.moveToFirstNonWhiteSpaceCharacter(cm, head); + } else if (insertAt == 'startOfSelectedArea') { + if (!vim.visualBlock) { + if (sel.head.line < sel.anchor.line) { + head = sel.head; + } else { + head = Pos(sel.anchor.line, 0); + } + } else { + head = Pos( + Math.min(sel.head.line, sel.anchor.line), + Math.min(sel.head.ch, sel.anchor.ch)); + height = Math.abs(sel.head.line - sel.anchor.line) + 1; + } + } else if (insertAt == 'endOfSelectedArea') { + if (!vim.visualBlock) { + if (sel.head.line >= sel.anchor.line) { + head = offsetCursor(sel.head, 0, 1); + } else { + head = Pos(sel.anchor.line, 0); + } + } else { + head = Pos( + Math.min(sel.head.line, sel.anchor.line), + Math.max(sel.head.ch + 1, sel.anchor.ch)); + height = Math.abs(sel.head.line - sel.anchor.line) + 1; + } + } else if (insertAt == 'inplace') { + if (vim.visualMode) { + return; + } + } + cm.setOption('keyMap', 'vim-insert'); + cm.setOption('disableInput', false); + if (actionArgs && actionArgs.replace) { + // Handle Replace-mode as a special case of insert mode. + cm.toggleOverwrite(true); + cm.setOption('keyMap', 'vim-replace'); + CodeMirror.signal(cm, "vim-mode-change", { + mode: "replace" + }); + } else { + cm.setOption('keyMap', 'vim-insert'); + CodeMirror.signal(cm, "vim-mode-change", { + mode: "insert" + }); + } + if (!vimGlobalState.macroModeState.isPlaying) { + // Only record if not replaying. + cm.on('change', onChange); + CodeMirror.on(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown); + } + if (vim.visualMode) { + exitVisualMode(cm); + } + selectForInsert(cm, head, height); + }, + toggleVisualMode: function(cm, actionArgs, vim) { + var repeat = actionArgs.repeat; + var anchor = cm.getCursor(); + var head; + // TODO: The repeat should actually select number of characters/lines + // equal to the repeat times the size of the previous visual + // operation. + if (!vim.visualMode) { + // Entering visual mode + vim.visualMode = true; + vim.visualLine = !!actionArgs.linewise; + vim.visualBlock = !!actionArgs.blockwise; + head = clipCursorToContent( + cm, Pos(anchor.line, anchor.ch + repeat - 1), + true /** includeLineBreak */ ); + vim.sel = { + anchor: anchor, + head: head + }; + CodeMirror.signal(cm, "vim-mode-change", { + mode: "visual", + subMode: vim.visualLine ? "linewise" : vim.visualBlock ? "blockwise" : "" + }); + updateCmSelection(cm); + updateMark(cm, vim, '<', cursorMin(anchor, head)); + updateMark(cm, vim, '>', cursorMax(anchor, head)); + } else if (vim.visualLine ^ actionArgs.linewise || + vim.visualBlock ^ actionArgs.blockwise) { + // Toggling between modes + vim.visualLine = !!actionArgs.linewise; + vim.visualBlock = !!actionArgs.blockwise; + CodeMirror.signal(cm, "vim-mode-change", { + mode: "visual", + subMode: vim.visualLine ? "linewise" : vim.visualBlock ? "blockwise" : "" + }); + updateCmSelection(cm); + } else { + exitVisualMode(cm); + } + }, + reselectLastSelection: function(cm, _actionArgs, vim) { + var lastSelection = vim.lastSelection; + if (vim.visualMode) { + updateLastSelection(cm, vim); + } + if (lastSelection) { + var anchor = lastSelection.anchorMark.find(); + var head = lastSelection.headMark.find(); + if (!anchor || !head) { + // If the marks have been destroyed due to edits, do nothing. + return; + } + vim.sel = { + anchor: anchor, + head: head + }; + vim.visualMode = true; + vim.visualLine = lastSelection.visualLine; + vim.visualBlock = lastSelection.visualBlock; + updateCmSelection(cm); + updateMark(cm, vim, '<', cursorMin(anchor, head)); + updateMark(cm, vim, '>', cursorMax(anchor, head)); + CodeMirror.signal(cm, 'vim-mode-change', { + mode: 'visual', + subMode: vim.visualLine ? 'linewise' : vim.visualBlock ? 'blockwise' : '' + }); + } + }, + joinLines: function(cm, actionArgs, vim) { + var curStart, curEnd; + if (vim.visualMode) { + curStart = cm.getCursor('anchor'); + curEnd = cm.getCursor('head'); + if (cursorIsBefore(curEnd, curStart)) { + var tmp = curEnd; + curEnd = curStart; + curStart = tmp; + } + curEnd.ch = lineLength(cm, curEnd.line) - 1; + } else { + // Repeat is the number of lines to join. Minimum 2 lines. + var repeat = Math.max(actionArgs.repeat, 2); + curStart = cm.getCursor(); + curEnd = clipCursorToContent(cm, Pos(curStart.line + repeat - 1, + Infinity)); + } + var finalCh = 0; + for (var i = curStart.line; i < curEnd.line; i++) { + finalCh = lineLength(cm, curStart.line); + var tmp = Pos(curStart.line + 1, + lineLength(cm, curStart.line + 1)); + var text = cm.getRange(curStart, tmp); + text = text.replace(/\n\s*/g, ' '); + cm.replaceRange(text, curStart, tmp); + } + var curFinalPos = Pos(curStart.line, finalCh); + if (vim.visualMode) { + exitVisualMode(cm, false); + } + cm.setCursor(curFinalPos); + }, + newLineAndEnterInsertMode: function(cm, actionArgs, vim) { + vim.insertMode = true; + var insertAt = copyCursor(cm.getCursor()); + if (insertAt.line === cm.firstLine() && !actionArgs.after) { + // Special case for inserting newline before start of document. + cm.replaceRange('\n', Pos(cm.firstLine(), 0)); + cm.setCursor(cm.firstLine(), 0); + } else { + insertAt.line = (actionArgs.after) ? insertAt.line : + insertAt.line - 1; + insertAt.ch = lineLength(cm, insertAt.line); + cm.setCursor(insertAt); + var newlineFn = CodeMirror.commands.newlineAndIndentContinueComment || + CodeMirror.commands.newlineAndIndent; + newlineFn(cm); + } + this.enterInsertMode(cm, { + repeat: actionArgs.repeat + }, vim); + }, + paste: function(cm, actionArgs, vim) { + var cur = copyCursor(cm.getCursor()); + var register = vimGlobalState.registerController.getRegister( + actionArgs.registerName); + var text = register.toString(); + if (!text) { + return; + } + if (actionArgs.matchIndent) { + var tabSize = cm.getOption("tabSize"); + // length that considers tabs and tabSize + var whitespaceLength = function(str) { + var tabs = (str.split("\t").length - 1); + var spaces = (str.split(" ").length - 1); + return tabs * tabSize + spaces * 1; + }; + var currentLine = cm.getLine(cm.getCursor().line); + var indent = whitespaceLength(currentLine.match(/^\s*/)[0]); + // chomp last newline b/c don't want it to match /^\s*/gm + var chompedText = text.replace(/\n$/, ''); + var wasChomped = text !== chompedText; + var firstIndent = whitespaceLength(text.match(/^\s*/)[0]); + var text = chompedText.replace(/^\s*/gm, function(wspace) { + var newIndent = indent + (whitespaceLength(wspace) - firstIndent); + if (newIndent < 0) { + return ""; + } else if (cm.getOption("indentWithTabs")) { + var quotient = Math.floor(newIndent / tabSize); + return Array(quotient + 1).join('\t'); + } else { + return Array(newIndent + 1).join(' '); + } + }); + text += wasChomped ? "\n" : ""; + } + if (actionArgs.repeat > 1) { + var text = Array(actionArgs.repeat + 1).join(text); + } + var linewise = register.linewise; + var blockwise = register.blockwise; + if (linewise) { + if (vim.visualMode) { + text = vim.visualLine ? text.slice(0, -1) : '\n' + text.slice(0, text.length - 1) + '\n'; + } else if (actionArgs.after) { + // Move the newline at the end to the start instead, and paste just + // before the newline character of the line we are on right now. + text = '\n' + text.slice(0, text.length - 1); + cur.ch = lineLength(cm, cur.line); + } else { + cur.ch = 0; + } + } else { + if (blockwise) { + text = text.split('\n'); + for (var i = 0; i < text.length; i++) { + text[i] = (text[i] == '') ? ' ' : text[i]; + } + } + cur.ch += actionArgs.after ? 1 : 0; + } + var curPosFinal; + var idx; + if (vim.visualMode) { + // save the pasted text for reselection if the need arises + vim.lastPastedText = text; + var lastSelectionCurEnd; + var selectedArea = getSelectedAreaRange(cm, vim); + var selectionStart = selectedArea[0]; + var selectionEnd = selectedArea[1]; + var selectedText = cm.getSelection(); + var selections = cm.listSelections(); + var emptyStrings = new Array(selections.length).join('1').split('1'); + // save the curEnd marker before it get cleared due to cm.replaceRange. + if (vim.lastSelection) { + lastSelectionCurEnd = vim.lastSelection.headMark.find(); + } + // push the previously selected text to unnamed register + vimGlobalState.registerController.unnamedRegister.setText(selectedText); + if (blockwise) { + // first delete the selected text + cm.replaceSelections(emptyStrings); + // Set new selections as per the block length of the yanked text + selectionEnd = Pos(selectionStart.line + text.length - 1, selectionStart.ch); + cm.setCursor(selectionStart); + selectBlock(cm, selectionEnd); + cm.replaceSelections(text); + curPosFinal = selectionStart; + } else if (vim.visualBlock) { + cm.replaceSelections(emptyStrings); + cm.setCursor(selectionStart); + cm.replaceRange(text, selectionStart, selectionStart); + curPosFinal = selectionStart; + } else { + cm.replaceRange(text, selectionStart, selectionEnd); + curPosFinal = cm.posFromIndex(cm.indexFromPos(selectionStart) + text.length - 1); + } + // restore the the curEnd marker + if (lastSelectionCurEnd) { + vim.lastSelection.headMark = cm.setBookmark(lastSelectionCurEnd); + } + if (linewise) { + curPosFinal.ch = 0; + } + } else { + if (blockwise) { + cm.setCursor(cur); + for (var i = 0; i < text.length; i++) { + var line = cur.line + i; + if (line > cm.lastLine()) { + cm.replaceRange('\n', Pos(line, 0)); + } + var lastCh = lineLength(cm, line); + if (lastCh < cur.ch) { + extendLineToColumn(cm, line, cur.ch); + } + } + cm.setCursor(cur); + selectBlock(cm, Pos(cur.line + text.length - 1, cur.ch)); + cm.replaceSelections(text); + curPosFinal = cur; + } else { + cm.replaceRange(text, cur); + // Now fine tune the cursor to where we want it. + if (linewise && actionArgs.after) { + curPosFinal = Pos( + cur.line + 1, + findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line + 1))); + } else if (linewise && !actionArgs.after) { + curPosFinal = Pos( + cur.line, + findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line))); + } else if (!linewise && actionArgs.after) { + idx = cm.indexFromPos(cur); + curPosFinal = cm.posFromIndex(idx + text.length - 1); + } else { + idx = cm.indexFromPos(cur); + curPosFinal = cm.posFromIndex(idx + text.length); + } + } + } + if (vim.visualMode) { + exitVisualMode(cm, false); + } + cm.setCursor(curPosFinal); + }, + undo: function(cm, actionArgs) { + cm.operation(function() { + repeatFn(cm, CodeMirror.commands.undo, actionArgs.repeat)(); + cm.setCursor(cm.getCursor('anchor')); + }); + }, + redo: function(cm, actionArgs) { + repeatFn(cm, CodeMirror.commands.redo, actionArgs.repeat)(); + }, + setRegister: function(_cm, actionArgs, vim) { + vim.inputState.registerName = actionArgs.selectedCharacter; + }, + setMark: function(cm, actionArgs, vim) { + var markName = actionArgs.selectedCharacter; + updateMark(cm, vim, markName, cm.getCursor()); + }, + replace: function(cm, actionArgs, vim) { + var replaceWith = actionArgs.selectedCharacter; + var curStart = cm.getCursor(); + var replaceTo; + var curEnd; + var selections = cm.listSelections(); + if (vim.visualMode) { + curStart = cm.getCursor('start'); + curEnd = cm.getCursor('end'); + } else { + var line = cm.getLine(curStart.line); + replaceTo = curStart.ch + actionArgs.repeat; + if (replaceTo > line.length) { + replaceTo = line.length; + } + curEnd = Pos(curStart.line, replaceTo); + } + if (replaceWith == '\n') { + if (!vim.visualMode) cm.replaceRange('', curStart, curEnd); + // special case, where vim help says to replace by just one line-break + (CodeMirror.commands.newlineAndIndentContinueComment || CodeMirror.commands.newlineAndIndent)(cm); + } else { + var replaceWithStr = cm.getRange(curStart, curEnd); + //replace all characters in range by selected, but keep linebreaks + replaceWithStr = replaceWithStr.replace(/[^\n]/g, replaceWith); + if (vim.visualBlock) { + // Tabs are split in visua block before replacing + var spaces = new Array(cm.getOption("tabSize") + 1).join(' '); + replaceWithStr = cm.getSelection(); + replaceWithStr = replaceWithStr.replace(/\t/g, spaces).replace(/[^\n]/g, replaceWith).split('\n'); + cm.replaceSelections(replaceWithStr); + } else { + cm.replaceRange(replaceWithStr, curStart, curEnd); + } + if (vim.visualMode) { + curStart = cursorIsBefore(selections[0].anchor, selections[0].head) ? + selections[0].anchor : selections[0].head; + cm.setCursor(curStart); + exitVisualMode(cm, false); + } else { + cm.setCursor(offsetCursor(curEnd, 0, -1)); + } + } + }, + incrementNumberToken: function(cm, actionArgs) { + var cur = cm.getCursor(); + var lineStr = cm.getLine(cur.line); + var re = /-?\d+/g; + var match; + var start; + var end; + var numberStr; + var token; + while ((match = re.exec(lineStr)) !== null) { + token = match[0]; + start = match.index; + end = start + token.length; + if (cur.ch < end) break; + } + if (!actionArgs.backtrack && (end <= cur.ch)) return; + if (token) { + var increment = actionArgs.increase ? 1 : -1; + var number = parseInt(token) + (increment * actionArgs.repeat); + var from = Pos(cur.line, start); + var to = Pos(cur.line, end); + numberStr = number.toString(); + cm.replaceRange(numberStr, from, to); + } else { + return; + } + cm.setCursor(Pos(cur.line, start + numberStr.length - 1)); + }, + repeatLastEdit: function(cm, actionArgs, vim) { + var lastEditInputState = vim.lastEditInputState; + if (!lastEditInputState) { + return; + } + var repeat = actionArgs.repeat; + if (repeat && actionArgs.repeatIsExplicit) { + vim.lastEditInputState.repeatOverride = repeat; + } else { + repeat = vim.lastEditInputState.repeatOverride || repeat; + } + repeatLastEdit(cm, vim, repeat, false /** repeatForInsert */ ); + }, + exitInsertMode: exitInsertMode + }; + + function defineAction(name, fn) { + actions[name] = fn; + } + + /* + * Below are miscellaneous utility functions used by vim.js + */ + + /** + * Clips cursor to ensure that line is within the buffer's range + * If includeLineBreak is true, then allow cur.ch == lineLength. + */ + function clipCursorToContent(cm, cur, includeLineBreak) { + var line = Math.min(Math.max(cm.firstLine(), cur.line), cm.lastLine()); + var maxCh = lineLength(cm, line) - 1; + maxCh = (includeLineBreak) ? maxCh + 1 : maxCh; + var ch = Math.min(Math.max(0, cur.ch), maxCh); + return Pos(line, ch); + } + + function copyArgs(args) { + var ret = {}; + for (var prop in args) { + if (args.hasOwnProperty(prop)) { + ret[prop] = args[prop]; + } + } + return ret; + } + + function offsetCursor(cur, offsetLine, offsetCh) { + if (typeof offsetLine === 'object') { + offsetCh = offsetLine.ch; + offsetLine = offsetLine.line; + } + return Pos(cur.line + offsetLine, cur.ch + offsetCh); + } + + function getOffset(anchor, head) { + return { + line: head.line - anchor.line, + ch: head.line - anchor.line + }; + } + + function commandMatches(keys, keyMap, context, inputState) { + // Partial matches are not applied. They inform the key handler + // that the current key sequence is a subsequence of a valid key + // sequence, so that the key buffer is not cleared. + var match, partial = [], + full = []; + for (var i = 0; i < keyMap.length; i++) { + var command = keyMap[i]; + if (context == 'insert' && command.context != 'insert' || + command.context && command.context != context || + inputState.operator && command.type == 'action' || + !(match = commandMatch(keys, command.keys))) { + continue; + } + if (match == 'partial') { + partial.push(command); + } + if (match == 'full') { + full.push(command); + } + } + return { + partial: partial.length && partial, + full: full.length && full + }; + } + + function commandMatch(pressed, mapped) { + if (mapped.slice(-11) == '<character>') { + // Last character matches anything. + var prefixLen = mapped.length - 11; + var pressedPrefix = pressed.slice(0, prefixLen); + var mappedPrefix = mapped.slice(0, prefixLen); + return pressedPrefix == mappedPrefix && pressed.length > prefixLen ? 'full' : + mappedPrefix.indexOf(pressedPrefix) == 0 ? 'partial' : false; + } else { + return pressed == mapped ? 'full' : + mapped.indexOf(pressed) == 0 ? 'partial' : false; + } + } + + function lastChar(keys) { + var match = /^.*(<[\w\-]+>)$/.exec(keys); + var selectedCharacter = match ? match[1] : keys.slice(-1); + if (selectedCharacter.length > 1) { + switch (selectedCharacter) { + case '<CR>': + selectedCharacter = '\n'; + break; + case '<Space>': + selectedCharacter = ' '; + break; + default: + break; + } + } + return selectedCharacter; + } + + function repeatFn(cm, fn, repeat) { + return function() { + for (var i = 0; i < repeat; i++) { + fn(cm); + } + }; + } + + function copyCursor(cur) { + return Pos(cur.line, cur.ch); + } + + function cursorEqual(cur1, cur2) { + return cur1.ch == cur2.ch && cur1.line == cur2.line; + } + + function cursorIsBefore(cur1, cur2) { + if (cur1.line < cur2.line) { + return true; + } + if (cur1.line == cur2.line && cur1.ch < cur2.ch) { + return true; + } + return false; + } + + function cursorMin(cur1, cur2) { + if (arguments.length > 2) { + cur2 = cursorMin.apply(undefined, Array.prototype.slice.call(arguments, 1)); + } + return cursorIsBefore(cur1, cur2) ? cur1 : cur2; + } + + function cursorMax(cur1, cur2) { + if (arguments.length > 2) { + cur2 = cursorMax.apply(undefined, Array.prototype.slice.call(arguments, 1)); + } + return cursorIsBefore(cur1, cur2) ? cur2 : cur1; + } + + function cursorIsBetween(cur1, cur2, cur3) { + // returns true if cur2 is between cur1 and cur3. + var cur1before2 = cursorIsBefore(cur1, cur2); + var cur2before3 = cursorIsBefore(cur2, cur3); + return cur1before2 && cur2before3; + } + + function lineLength(cm, lineNum) { + return cm.getLine(lineNum).length; + } + + function trim(s) { + if (s.trim) { + return s.trim(); + } + return s.replace(/^\s+|\s+$/g, ''); + } + + function escapeRegex(s) { + return s.replace(/([.?*+$\[\]\/\\(){}|\-])/g, '\\$1'); + } + + function extendLineToColumn(cm, lineNum, column) { + var endCh = lineLength(cm, lineNum); + var spaces = new Array(column - endCh + 1).join(' '); + cm.setCursor(Pos(lineNum, endCh)); + cm.replaceRange(spaces, cm.getCursor()); + } + // This functions selects a rectangular block + // of text with selectionEnd as any of its corner + // Height of block: + // Difference in selectionEnd.line and first/last selection.line + // Width of the block: + // Distance between selectionEnd.ch and any(first considered here) selection.ch + function selectBlock(cm, selectionEnd) { + var selections = [], + ranges = cm.listSelections(); + var head = copyCursor(cm.clipPos(selectionEnd)); + var isClipped = !cursorEqual(selectionEnd, head); + var curHead = cm.getCursor('head'); + var primIndex = getIndex(ranges, curHead); + var wasClipped = cursorEqual(ranges[primIndex].head, ranges[primIndex].anchor); + var max = ranges.length - 1; + var index = max - primIndex > primIndex ? max : 0; + var base = ranges[index].anchor; + + var firstLine = Math.min(base.line, head.line); + var lastLine = Math.max(base.line, head.line); + var baseCh = base.ch, + headCh = head.ch; + + var dir = ranges[index].head.ch - baseCh; + var newDir = headCh - baseCh; + if (dir > 0 && newDir <= 0) { + baseCh++; + if (!isClipped) { + headCh--; + } + } else if (dir < 0 && newDir >= 0) { + baseCh--; + if (!wasClipped) { + headCh++; + } + } else if (dir < 0 && newDir == -1) { + baseCh--; + headCh++; + } + for (var line = firstLine; line <= lastLine; line++) { + var range = { + anchor: new Pos(line, baseCh), + head: new Pos(line, headCh) + }; + selections.push(range); + } + primIndex = head.line == lastLine ? selections.length - 1 : 0; + cm.setSelections(selections); + selectionEnd.ch = headCh; + base.ch = baseCh; + return base; + } + + function selectForInsert(cm, head, height) { + var sel = []; + for (var i = 0; i < height; i++) { + var lineHead = offsetCursor(head, i, 0); + sel.push({ + anchor: lineHead, + head: lineHead + }); + } + cm.setSelections(sel, 0); + } + // getIndex returns the index of the cursor in the selections. + function getIndex(ranges, cursor, end) { + for (var i = 0; i < ranges.length; i++) { + var atAnchor = end != 'head' && cursorEqual(ranges[i].anchor, cursor); + var atHead = end != 'anchor' && cursorEqual(ranges[i].head, cursor); + if (atAnchor || atHead) { + return i; + } + } + return -1; + } + + function getSelectedAreaRange(cm, vim) { + var lastSelection = vim.lastSelection; + var getCurrentSelectedAreaRange = function() { + var selections = cm.listSelections(); + var start = selections[0]; + var end = selections[selections.length - 1]; + var selectionStart = cursorIsBefore(start.anchor, start.head) ? start.anchor : start.head; + var selectionEnd = cursorIsBefore(end.anchor, end.head) ? end.head : end.anchor; + return [selectionStart, selectionEnd]; + }; + var getLastSelectedAreaRange = function() { + var selectionStart = cm.getCursor(); + var selectionEnd = cm.getCursor(); + var block = lastSelection.visualBlock; + if (block) { + var width = block.width; + var height = block.height; + selectionEnd = Pos(selectionStart.line + height, selectionStart.ch + width); + var selections = []; + // selectBlock creates a 'proper' rectangular block. + // We do not want that in all cases, so we manually set selections. + for (var i = selectionStart.line; i < selectionEnd.line; i++) { + var anchor = Pos(i, selectionStart.ch); + var head = Pos(i, selectionEnd.ch); + var range = { + anchor: anchor, + head: head + }; + selections.push(range); + } + cm.setSelections(selections); + } else { + var start = lastSelection.anchorMark.find(); + var end = lastSelection.headMark.find(); + var line = end.line - start.line; + var ch = end.ch - start.ch; + selectionEnd = { + line: selectionEnd.line + line, + ch: line ? selectionEnd.ch : ch + selectionEnd.ch + }; + if (lastSelection.visualLine) { + selectionStart = Pos(selectionStart.line, 0); + selectionEnd = Pos(selectionEnd.line, lineLength(cm, selectionEnd.line)); + } + cm.setSelection(selectionStart, selectionEnd); + } + return [selectionStart, selectionEnd]; + }; + if (!vim.visualMode) { + // In case of replaying the action. + return getLastSelectedAreaRange(); + } else { + return getCurrentSelectedAreaRange(); + } + } + // Updates the previous selection with the current selection's values. This + // should only be called in visual mode. + function updateLastSelection(cm, vim) { + var anchor = vim.sel.anchor; + var head = vim.sel.head; + // To accommodate the effect of lastPastedText in the last selection + if (vim.lastPastedText) { + head = cm.posFromIndex(cm.indexFromPos(anchor) + vim.lastPastedText.length); + vim.lastPastedText = null; + } + vim.lastSelection = { + 'anchorMark': cm.setBookmark(anchor), + 'headMark': cm.setBookmark(head), + 'anchor': copyCursor(anchor), + 'head': copyCursor(head), + 'visualMode': vim.visualMode, + 'visualLine': vim.visualLine, + 'visualBlock': vim.visualBlock + }; + } + + function expandSelection(cm, start, end) { + var sel = cm.state.vim.sel; + var head = sel.head; + var anchor = sel.anchor; + var tmp; + if (cursorIsBefore(end, start)) { + tmp = end; + end = start; + start = tmp; + } + if (cursorIsBefore(head, anchor)) { + head = cursorMin(start, head); + anchor = cursorMax(anchor, end); + } else { + anchor = cursorMin(start, anchor); + head = cursorMax(head, end); + head = offsetCursor(head, 0, -1); + if (head.ch == -1 && head.line != cm.firstLine()) { + head = Pos(head.line - 1, lineLength(cm, head.line - 1)); + } + } + return [anchor, head]; + } + /** + * Updates the CodeMirror selection to match the provided vim selection. + * If no arguments are given, it uses the current vim selection state. + */ + function updateCmSelection(cm, sel, mode) { + var vim = cm.state.vim; + sel = sel || vim.sel; + var mode = mode || + vim.visualLine ? 'line' : vim.visualBlock ? 'block' : 'char'; + var cmSel = makeCmSelection(cm, sel, mode); + cm.setSelections(cmSel.ranges, cmSel.primary); + updateFakeCursor(cm); + } + + function makeCmSelection(cm, sel, mode, exclusive) { + var head = copyCursor(sel.head); + var anchor = copyCursor(sel.anchor); + if (mode == 'char') { + var headOffset = !exclusive && !cursorIsBefore(sel.head, sel.anchor) ? 1 : 0; + var anchorOffset = cursorIsBefore(sel.head, sel.anchor) ? 1 : 0; + head = offsetCursor(sel.head, 0, headOffset); + anchor = offsetCursor(sel.anchor, 0, anchorOffset); + return { + ranges: [{ + anchor: anchor, + head: head + }], + primary: 0 + }; + } else if (mode == 'line') { + if (!cursorIsBefore(sel.head, sel.anchor)) { + anchor.ch = 0; + + var lastLine = cm.lastLine(); + if (head.line > lastLine) { + head.line = lastLine; + } + head.ch = lineLength(cm, head.line); + } else { + head.ch = 0; + anchor.ch = lineLength(cm, anchor.line); + } + return { + ranges: [{ + anchor: anchor, + head: head + }], + primary: 0 + }; + } else if (mode == 'block') { + var top = Math.min(anchor.line, head.line), + left = Math.min(anchor.ch, head.ch), + bottom = Math.max(anchor.line, head.line), + right = Math.max(anchor.ch, head.ch) + 1; + var height = bottom - top + 1; + var primary = head.line == top ? 0 : height - 1; + var ranges = []; + for (var i = 0; i < height; i++) { + ranges.push({ + anchor: Pos(top + i, left), + head: Pos(top + i, right) + }); + } + return { + ranges: ranges, + primary: primary + }; + } + } + + function getHead(cm) { + var cur = cm.getCursor('head'); + if (cm.getSelection().length == 1) { + // Small corner case when only 1 character is selected. The "real" + // head is the left of head and anchor. + cur = cursorMin(cur, cm.getCursor('anchor')); + } + return cur; + } + + /** + * If moveHead is set to false, the CodeMirror selection will not be + * touched. The caller assumes the responsibility of putting the cursor + * in the right place. + */ + function exitVisualMode(cm, moveHead) { + var vim = cm.state.vim; + if (moveHead !== false) { + cm.setCursor(clipCursorToContent(cm, vim.sel.head)); + } + updateLastSelection(cm, vim); + vim.visualMode = false; + vim.visualLine = false; + vim.visualBlock = false; + CodeMirror.signal(cm, "vim-mode-change", { + mode: "normal" + }); + if (vim.fakeCursor) { + vim.fakeCursor.clear(); + } + } + + // Remove any trailing newlines from the selection. For + // example, with the caret at the start of the last word on the line, + // 'dw' should word, but not the newline, while 'w' should advance the + // caret to the first character of the next line. + function clipToLine(cm, curStart, curEnd) { + var selection = cm.getRange(curStart, curEnd); + // Only clip if the selection ends with trailing newline + whitespace + if (/\n\s*$/.test(selection)) { + var lines = selection.split('\n'); + // We know this is all whitepsace. + lines.pop(); + + // Cases: + // 1. Last word is an empty line - do not clip the trailing '\n' + // 2. Last word is not an empty line - clip the trailing '\n' + var line; + // Find the line containing the last word, and clip all whitespace up + // to it. + for (var line = lines.pop(); lines.length > 0 && line && isWhiteSpaceString(line); line = lines.pop()) { + curEnd.line--; + curEnd.ch = 0; + } + // If the last word is not an empty line, clip an additional newline + if (line) { + curEnd.line--; + curEnd.ch = lineLength(cm, curEnd.line); + } else { + curEnd.ch = 0; + } + } + } + + // Expand the selection to line ends. + function expandSelectionToLine(_cm, curStart, curEnd) { + curStart.ch = 0; + curEnd.ch = 0; + curEnd.line++; + } + + function findFirstNonWhiteSpaceCharacter(text) { + if (!text) { + return 0; + } + var firstNonWS = text.search(/\S/); + return firstNonWS == -1 ? text.length : firstNonWS; + } + + function expandWordUnderCursor(cm, inclusive, _forward, bigWord, noSymbol) { + var cur = getHead(cm); + var line = cm.getLine(cur.line); + var idx = cur.ch; + + // Seek to first word or non-whitespace character, depending on if + // noSymbol is true. + var test = noSymbol ? wordCharTest[0] : bigWordCharTest[0]; + while (!test(line.charAt(idx))) { + idx++; + if (idx >= line.length) { + return null; + } + } + + if (bigWord) { + test = bigWordCharTest[0]; + } else { + test = wordCharTest[0]; + if (!test(line.charAt(idx))) { + test = wordCharTest[1]; + } + } + + var end = idx, + start = idx; + while (test(line.charAt(end)) && end < line.length) { + end++; + } + while (test(line.charAt(start)) && start >= 0) { + start--; + } + start++; + + if (inclusive) { + // If present, include all whitespace after word. + // Otherwise, include all whitespace before word, except indentation. + var wordEnd = end; + while (/\s/.test(line.charAt(end)) && end < line.length) { + end++; + } + if (wordEnd == end) { + var wordStart = start; + while (/\s/.test(line.charAt(start - 1)) && start > 0) { + start--; + } + if (!start) { + start = wordStart; + } + } + } + return { + start: Pos(cur.line, start), + end: Pos(cur.line, end) + }; + } + + function recordJumpPosition(cm, oldCur, newCur) { + if (!cursorEqual(oldCur, newCur)) { + vimGlobalState.jumpList.add(cm, oldCur, newCur); + } + } + + function recordLastCharacterSearch(increment, args) { + vimGlobalState.lastChararacterSearch.increment = increment; + vimGlobalState.lastChararacterSearch.forward = args.forward; + vimGlobalState.lastChararacterSearch.selectedCharacter = args.selectedCharacter; + } + + var symbolToMode = { + '(': 'bracket', + ')': 'bracket', + '{': 'bracket', + '}': 'bracket', + '[': 'section', + ']': 'section', + '*': 'comment', + '/': 'comment', + 'm': 'method', + 'M': 'method', + '#': 'preprocess' + }; + var findSymbolModes = { + bracket: { + isComplete: function(state) { + if (state.nextCh === state.symb) { + state.depth++; + if (state.depth >= 1) return true; + } else if (state.nextCh === state.reverseSymb) { + state.depth--; + } + return false; + } + }, + section: { + init: function(state) { + state.curMoveThrough = true; + state.symb = (state.forward ? ']' : '[') === state.symb ? '{' : '}'; + }, + isComplete: function(state) { + return state.index === 0 && state.nextCh === state.symb; + } + }, + comment: { + isComplete: function(state) { + var found = state.lastCh === '*' && state.nextCh === '/'; + state.lastCh = state.nextCh; + return found; + } + }, + // TODO: The original Vim implementation only operates on level 1 and 2. + // The current implementation doesn't check for code block level and + // therefore it operates on any levels. + method: { + init: function(state) { + state.symb = (state.symb === 'm' ? '{' : '}'); + state.reverseSymb = state.symb === '{' ? '}' : '{'; + }, + isComplete: function(state) { + if (state.nextCh === state.symb) return true; + return false; + } + }, + preprocess: { + init: function(state) { + state.index = 0; + }, + isComplete: function(state) { + if (state.nextCh === '#') { + var token = state.lineText.match(/#(\w+)/)[1]; + if (token === 'endif') { + if (state.forward && state.depth === 0) { + return true; + } + state.depth++; + } else if (token === 'if') { + if (!state.forward && state.depth === 0) { + return true; + } + state.depth--; + } + if (token === 'else' && state.depth === 0) return true; + } + return false; + } + } + }; + + function findSymbol(cm, repeat, forward, symb) { + var cur = copyCursor(cm.getCursor()); + var increment = forward ? 1 : -1; + var endLine = forward ? cm.lineCount() : -1; + var curCh = cur.ch; + var line = cur.line; + var lineText = cm.getLine(line); + var state = { + lineText: lineText, + nextCh: lineText.charAt(curCh), + lastCh: null, + index: curCh, + symb: symb, + reverseSymb: (forward ? { + ')': '(', + '}': '{' + } : { + '(': ')', + '{': '}' + })[symb], + forward: forward, + depth: 0, + curMoveThrough: false + }; + var mode = symbolToMode[symb]; + if (!mode) return cur; + var init = findSymbolModes[mode].init; + var isComplete = findSymbolModes[mode].isComplete; + if (init) { + init(state); + } + while (line !== endLine && repeat) { + state.index += increment; + state.nextCh = state.lineText.charAt(state.index); + if (!state.nextCh) { + line += increment; + state.lineText = cm.getLine(line) || ''; + if (increment > 0) { + state.index = 0; + } else { + var lineLen = state.lineText.length; + state.index = (lineLen > 0) ? (lineLen - 1) : 0; + } + state.nextCh = state.lineText.charAt(state.index); + } + if (isComplete(state)) { + cur.line = line; + cur.ch = state.index; + repeat--; + } + } + if (state.nextCh || state.curMoveThrough) { + return Pos(line, state.index); + } + return cur; + } + + /** + * Returns the boundaries of the next word. If the cursor in the middle of + * the word, then returns the boundaries of the current word, starting at + * the cursor. If the cursor is at the start/end of a word, and we are going + * forward/backward, respectively, find the boundaries of the next word. + * + * @param {CodeMirror} cm CodeMirror object. + * @param {Cursor} cur The cursor position. + * @param {boolean} forward True to search forward. False to search + * backward. + * @param {boolean} bigWord True if punctuation count as part of the word. + * False if only [a-zA-Z0-9] characters count as part of the word. + * @param {boolean} emptyLineIsWord True if empty lines should be treated + * as words. + * @return {Object{from:number, to:number, line: number}} The boundaries of + * the word, or null if there are no more words. + */ + function findWord(cm, cur, forward, bigWord, emptyLineIsWord) { + var lineNum = cur.line; + var pos = cur.ch; + var line = cm.getLine(lineNum); + var dir = forward ? 1 : -1; + var charTests = bigWord ? bigWordCharTest : wordCharTest; + + if (emptyLineIsWord && line == '') { + lineNum += dir; + line = cm.getLine(lineNum); + if (!isLine(cm, lineNum)) { + return null; + } + pos = (forward) ? 0 : line.length; + } + + while (true) { + if (emptyLineIsWord && line == '') { + return { + from: 0, + to: 0, + line: lineNum + }; + } + var stop = (dir > 0) ? line.length : -1; + var wordStart = stop, + wordEnd = stop; + // Find bounds of next word. + while (pos != stop) { + var foundWord = false; + for (var i = 0; i < charTests.length && !foundWord; ++i) { + if (charTests[i](line.charAt(pos))) { + wordStart = pos; + // Advance to end of word. + while (pos != stop && charTests[i](line.charAt(pos))) { + pos += dir; + } + wordEnd = pos; + foundWord = wordStart != wordEnd; + if (wordStart == cur.ch && lineNum == cur.line && + wordEnd == wordStart + dir) { + // We started at the end of a word. Find the next one. + continue; + } else { + return { + from: Math.min(wordStart, wordEnd + 1), + to: Math.max(wordStart, wordEnd), + line: lineNum + }; + } + } + } + if (!foundWord) { + pos += dir; + } + } + // Advance to next/prev line. + lineNum += dir; + if (!isLine(cm, lineNum)) { + return null; + } + line = cm.getLine(lineNum); + pos = (dir > 0) ? 0 : line.length; + } + // Should never get here. + throw new Error('The impossible happened.'); + } + + /** + * @param {CodeMirror} cm CodeMirror object. + * @param {Pos} cur The position to start from. + * @param {int} repeat Number of words to move past. + * @param {boolean} forward True to search forward. False to search + * backward. + * @param {boolean} wordEnd True to move to end of word. False to move to + * beginning of word. + * @param {boolean} bigWord True if punctuation count as part of the word. + * False if only alphabet characters count as part of the word. + * @return {Cursor} The position the cursor should move to. + */ + function moveToWord(cm, cur, repeat, forward, wordEnd, bigWord) { + var curStart = copyCursor(cur); + var words = []; + if (forward && !wordEnd || !forward && wordEnd) { + repeat++; + } + // For 'e', empty lines are not considered words, go figure. + var emptyLineIsWord = !(forward && wordEnd); + for (var i = 0; i < repeat; i++) { + var word = findWord(cm, cur, forward, bigWord, emptyLineIsWord); + if (!word) { + var eodCh = lineLength(cm, cm.lastLine()); + words.push(forward ? { + line: cm.lastLine(), + from: eodCh, + to: eodCh + } : { + line: 0, + from: 0, + to: 0 + }); + break; + } + words.push(word); + cur = Pos(word.line, forward ? (word.to - 1) : word.from); + } + var shortCircuit = words.length != repeat; + var firstWord = words[0]; + var lastWord = words.pop(); + if (forward && !wordEnd) { + // w + if (!shortCircuit && (firstWord.from != curStart.ch || firstWord.line != curStart.line)) { + // We did not start in the middle of a word. Discard the extra word at the end. + lastWord = words.pop(); + } + return Pos(lastWord.line, lastWord.from); + } else if (forward && wordEnd) { + return Pos(lastWord.line, lastWord.to - 1); + } else if (!forward && wordEnd) { + // ge + if (!shortCircuit && (firstWord.to != curStart.ch || firstWord.line != curStart.line)) { + // We did not start in the middle of a word. Discard the extra word at the end. + lastWord = words.pop(); + } + return Pos(lastWord.line, lastWord.to); + } else { + // b + return Pos(lastWord.line, lastWord.from); + } + } + + function moveToCharacter(cm, repeat, forward, character) { + var cur = cm.getCursor(); + var start = cur.ch; + var idx; + for (var i = 0; i < repeat; i++) { + var line = cm.getLine(cur.line); + idx = charIdxInLine(start, line, character, forward, true); + if (idx == -1) { + return null; + } + start = idx; + } + return Pos(cm.getCursor().line, idx); + } + + function moveToColumn(cm, repeat) { + // repeat is always >= 1, so repeat - 1 always corresponds + // to the column we want to go to. + var line = cm.getCursor().line; + return clipCursorToContent(cm, Pos(line, repeat - 1)); + } + + function updateMark(cm, vim, markName, pos) { + if (!inArray(markName, validMarks)) { + return; + } + if (vim.marks[markName]) { + vim.marks[markName].clear(); + } + vim.marks[markName] = cm.setBookmark(pos); + } + + function charIdxInLine(start, line, character, forward, includeChar) { + // Search for char in line. + // motion_options: {forward, includeChar} + // If includeChar = true, include it too. + // If forward = true, search forward, else search backwards. + // If char is not found on this line, do nothing + var idx; + if (forward) { + idx = line.indexOf(character, start + 1); + if (idx != -1 && !includeChar) { + idx -= 1; + } + } else { + idx = line.lastIndexOf(character, start - 1); + if (idx != -1 && !includeChar) { + idx += 1; + } + } + return idx; + } + + function findParagraph(cm, head, repeat, dir, inclusive) { + var line = head.line; + var min = cm.firstLine(); + var max = cm.lastLine(); + var start, end, i = line; + + function isEmpty(i) { + return !cm.getLine(i); + } + + function isBoundary(i, dir, any) { + if (any) { + return isEmpty(i) != isEmpty(i + dir); + } + return !isEmpty(i) && isEmpty(i + dir); + } + if (dir) { + while (min <= i && i <= max && repeat > 0) { + if (isBoundary(i, dir)) { + repeat--; + } + i += dir; + } + return new Pos(i, 0); + } + + var vim = cm.state.vim; + if (vim.visualLine && isBoundary(line, 1, true)) { + var anchor = vim.sel.anchor; + if (isBoundary(anchor.line, -1, true)) { + if (!inclusive || anchor.line != line) { + line += 1; + } + } + } + var startState = isEmpty(line); + for (i = line; i <= max && repeat; i++) { + if (isBoundary(i, 1, true)) { + if (!inclusive || isEmpty(i) != startState) { + repeat--; + } + } + } + end = new Pos(i, 0); + // select boundary before paragraph for the last one + if (i > max && !startState) { + startState = true; + } else { + inclusive = false; + } + for (i = line; i > min; i--) { + if (!inclusive || isEmpty(i) == startState || i == line) { + if (isBoundary(i, -1, true)) { + break; + } + } + } + start = new Pos(i, 0); + return { + start: start, + end: end + }; + } + + // TODO: perhaps this finagling of start and end positions belonds + // in codmirror/replaceRange? + function selectCompanionObject(cm, head, symb, inclusive) { + var cur = head, + start, end; + + var bracketRegexp = ({ + '(': /[()]/, + ')': /[()]/, + '[': /[[\]]/, + ']': /[[\]]/, + '{': /[{}]/, + '}': /[{}]/ + })[symb]; + var openSym = ({ + '(': '(', + ')': '(', + '[': '[', + ']': '[', + '{': '{', + '}': '{' + })[symb]; + var curChar = cm.getLine(cur.line).charAt(cur.ch); + // Due to the behavior of scanForBracket, we need to add an offset if the + // cursor is on a matching open bracket. + var offset = curChar === openSym ? 1 : 0; + + start = cm.scanForBracket(Pos(cur.line, cur.ch + offset), -1, null, { + 'bracketRegex': bracketRegexp + }); + end = cm.scanForBracket(Pos(cur.line, cur.ch + offset), 1, null, { + 'bracketRegex': bracketRegexp + }); + + if (!start || !end) { + return { + start: cur, + end: cur + }; + } + + start = start.pos; + end = end.pos; + + if ((start.line == end.line && start.ch > end.ch) || (start.line > end.line)) { + var tmp = start; + start = end; + end = tmp; + } + + if (inclusive) { + end.ch += 1; + } else { + start.ch += 1; + } + + return { + start: start, + end: end + }; + } + + // Takes in a symbol and a cursor and tries to simulate text objects that + // have identical opening and closing symbols + // TODO support across multiple lines + function findBeginningAndEnd(cm, head, symb, inclusive) { + var cur = copyCursor(head); + var line = cm.getLine(cur.line); + var chars = line.split(''); + var start, end, i, len; + var firstIndex = chars.indexOf(symb); + + // the decision tree is to always look backwards for the beginning first, + // but if the cursor is in front of the first instance of the symb, + // then move the cursor forward + if (cur.ch < firstIndex) { + cur.ch = firstIndex; + // Why is this line even here??? + // cm.setCursor(cur.line, firstIndex+1); + } + // otherwise if the cursor is currently on the closing symbol + else if (firstIndex < cur.ch && chars[cur.ch] == symb) { + end = cur.ch; // assign end to the current cursor + --cur.ch; // make sure to look backwards + } + + // if we're currently on the symbol, we've got a start + if (chars[cur.ch] == symb && !end) { + start = cur.ch + 1; // assign start to ahead of the cursor + } else { + // go backwards to find the start + for (i = cur.ch; i > -1 && !start; i--) { + if (chars[i] == symb) { + start = i + 1; + } + } + } + + // look forwards for the end symbol + if (start && !end) { + for (i = start, len = chars.length; i < len && !end; i++) { + if (chars[i] == symb) { + end = i; + } + } + } + + // nothing found + if (!start || !end) { + return { + start: cur, + end: cur + }; + } + + // include the symbols + if (inclusive) { + --start; + ++end; + } + + return { + start: Pos(cur.line, start), + end: Pos(cur.line, end) + }; + } + + // Search functions + defineOption('pcre', true, 'boolean'); + + function SearchState() {} + SearchState.prototype = { + getQuery: function() { + return vimGlobalState.query; + }, + setQuery: function(query) { + vimGlobalState.query = query; + }, + getOverlay: function() { + return this.searchOverlay; + }, + setOverlay: function(overlay) { + this.searchOverlay = overlay; + }, + isReversed: function() { + return vimGlobalState.isReversed; + }, + setReversed: function(reversed) { + vimGlobalState.isReversed = reversed; + }, + getScrollbarAnnotate: function() { + return this.annotate; + }, + setScrollbarAnnotate: function(annotate) { + this.annotate = annotate; + } + }; + + function getSearchState(cm) { + var vim = cm.state.vim; + return vim.searchState_ || (vim.searchState_ = new SearchState()); + } + + function dialog(cm, template, shortText, onClose, options) { + if (cm.openDialog) { + cm.openDialog(template, onClose, { + bottom: true, + value: options.value, + onKeyDown: options.onKeyDown, + onKeyUp: options.onKeyUp, + selectValueOnOpen: false + }); + } else { + onClose(prompt(shortText, '')); + } + } + + function splitBySlash(argString) { + var slashes = findUnescapedSlashes(argString) || []; + if (!slashes.length) return []; + var tokens = []; + // in case of strings like foo/bar + if (slashes[0] !== 0) return; + for (var i = 0; i < slashes.length; i++) { + if (typeof slashes[i] == 'number') + tokens.push(argString.substring(slashes[i] + 1, slashes[i + 1])); + } + return tokens; + } + + function findUnescapedSlashes(str) { + var escapeNextChar = false; + var slashes = []; + for (var i = 0; i < str.length; i++) { + var c = str.charAt(i); + if (!escapeNextChar && c == '/') { + slashes.push(i); + } + escapeNextChar = !escapeNextChar && (c == '\\'); + } + return slashes; + } + + // Translates a search string from ex (vim) syntax into javascript form. + function translateRegex(str) { + // When these match, add a '\' if unescaped or remove one if escaped. + var specials = '|(){'; + // Remove, but never add, a '\' for these. + var unescape = '}'; + var escapeNextChar = false; + var out = []; + for (var i = -1; i < str.length; i++) { + var c = str.charAt(i) || ''; + var n = str.charAt(i + 1) || ''; + var specialComesNext = (n && specials.indexOf(n) != -1); + if (escapeNextChar) { + if (c !== '\\' || !specialComesNext) { + out.push(c); + } + escapeNextChar = false; + } else { + if (c === '\\') { + escapeNextChar = true; + // Treat the unescape list as special for removing, but not adding '\'. + if (n && unescape.indexOf(n) != -1) { + specialComesNext = true; + } + // Not passing this test means removing a '\'. + if (!specialComesNext || n === '\\') { + out.push(c); + } + } else { + out.push(c); + if (specialComesNext && n !== '\\') { + out.push('\\'); + } + } + } + } + return out.join(''); + } + + // Translates the replace part of a search and replace from ex (vim) syntax into + // javascript form. Similar to translateRegex, but additionally fixes back references + // (translates '\[0..9]' to '$[0..9]') and follows different rules for escaping '$'. + var charUnescapes = { + '\\n': '\n', + '\\r': '\r', + '\\t': '\t' + }; + + function translateRegexReplace(str) { + var escapeNextChar = false; + var out = []; + for (var i = -1; i < str.length; i++) { + var c = str.charAt(i) || ''; + var n = str.charAt(i + 1) || ''; + if (charUnescapes[c + n]) { + out.push(charUnescapes[c + n]); + i++; + } else if (escapeNextChar) { + // At any point in the loop, escapeNextChar is true if the previous + // character was a '\' and was not escaped. + out.push(c); + escapeNextChar = false; + } else { + if (c === '\\') { + escapeNextChar = true; + if ((isNumber(n) || n === '$')) { + out.push('$'); + } else if (n !== '/' && n !== '\\') { + out.push('\\'); + } + } else { + if (c === '$') { + out.push('$'); + } + out.push(c); + if (n === '/') { + out.push('\\'); + } + } + } + } + return out.join(''); + } + + // Unescape \ and / in the replace part, for PCRE mode. + var unescapes = { + '\\/': '/', + '\\\\': '\\', + '\\n': '\n', + '\\r': '\r', + '\\t': '\t' + }; + + function unescapeRegexReplace(str) { + var stream = new CodeMirror.StringStream(str); + var output = []; + while (!stream.eol()) { + // Search for \. + while (stream.peek() && stream.peek() != '\\') { + output.push(stream.next()); + } + var matched = false; + for (var matcher in unescapes) { + if (stream.match(matcher, true)) { + matched = true; + output.push(unescapes[matcher]); + break; + } + } + if (!matched) { + // Don't change anything + output.push(stream.next()); + } + } + return output.join(''); + } + + /** + * Extract the regular expression from the query and return a Regexp object. + * Returns null if the query is blank. + * If ignoreCase is passed in, the Regexp object will have the 'i' flag set. + * If smartCase is passed in, and the query contains upper case letters, + * then ignoreCase is overridden, and the 'i' flag will not be set. + * If the query contains the /i in the flag part of the regular expression, + * then both ignoreCase and smartCase are ignored, and 'i' will be passed + * through to the Regex object. + */ + function parseQuery(query, ignoreCase, smartCase) { + // First update the last search register + var lastSearchRegister = vimGlobalState.registerController.getRegister('/'); + lastSearchRegister.setText(query); + // Check if the query is already a regex. + if (query instanceof RegExp) { + return query; + } + // First try to extract regex + flags from the input. If no flags found, + // extract just the regex. IE does not accept flags directly defined in + // the regex string in the form /regex/flags + var slashes = findUnescapedSlashes(query); + var regexPart; + var forceIgnoreCase; + if (!slashes.length) { + // Query looks like 'regexp' + regexPart = query; + } else { + // Query looks like 'regexp/...' + regexPart = query.substring(0, slashes[0]); + var flagsPart = query.substring(slashes[0]); + forceIgnoreCase = (flagsPart.indexOf('i') != -1); + } + if (!regexPart) { + return null; + } + if (!getOption('pcre')) { + regexPart = translateRegex(regexPart); + } + if (smartCase) { + ignoreCase = (/^[^A-Z]*$/).test(regexPart); + } + var regexp = new RegExp(regexPart, + (ignoreCase || forceIgnoreCase) ? 'i' : undefined); + return regexp; + } + + function showConfirm(cm, text) { + if (cm.openNotification) { + cm.openNotification('<span style="color: red">' + text + '</span>', { + bottom: true, + duration: 5000 + }); + } else { + alert(text); + } + } + + function makePrompt(prefix, desc) { + var raw = ''; + if (prefix) { + raw += '<span style="font-family: monospace">' + prefix + '</span>'; + } + raw += '<input type="text"/> ' + + '<span style="color: #888">'; + if (desc) { + raw += '<span style="color: #888">'; + raw += desc; + raw += '</span>'; + } + return raw; + } + var searchPromptDesc = '(Javascript regexp)'; + + function showPrompt(cm, options) { + var shortText = (options.prefix || '') + ' ' + (options.desc || ''); + var prompt = makePrompt(options.prefix, options.desc); + dialog(cm, prompt, shortText, options.onClose, options); + } + + function regexEqual(r1, r2) { + if (r1 instanceof RegExp && r2 instanceof RegExp) { + var props = ['global', 'multiline', 'ignoreCase', 'source']; + for (var i = 0; i < props.length; i++) { + var prop = props[i]; + if (r1[prop] !== r2[prop]) { + return false; + } + } + return true; + } + return false; + } + // Returns true if the query is valid. + function updateSearchQuery(cm, rawQuery, ignoreCase, smartCase) { + if (!rawQuery) { + return; + } + var state = getSearchState(cm); + var query = parseQuery(rawQuery, !!ignoreCase, !!smartCase); + if (!query) { + return; + } + highlightSearchMatches(cm, query); + if (regexEqual(query, state.getQuery())) { + return query; + } + state.setQuery(query); + return query; + } + + function searchOverlay(query) { + if (query.source.charAt(0) == '^') { + var matchSol = true; + } + return { + token: function(stream) { + if (matchSol && !stream.sol()) { + stream.skipToEnd(); + return; + } + var match = stream.match(query, false); + if (match) { + if (match[0].length == 0) { + // Matched empty string, skip to next. + stream.next(); + return 'searching'; + } + if (!stream.sol()) { + // Backtrack 1 to match \b + stream.backUp(1); + if (!query.exec(stream.next() + match[0])) { + stream.next(); + return null; + } + } + stream.match(query); + return 'searching'; + } + while (!stream.eol()) { + stream.next(); + if (stream.match(query, false)) break; + } + }, + query: query + }; + } + + function highlightSearchMatches(cm, query) { + var searchState = getSearchState(cm); + var overlay = searchState.getOverlay(); + if (!overlay || query != overlay.query) { + if (overlay) { + cm.removeOverlay(overlay); + } + overlay = searchOverlay(query); + cm.addOverlay(overlay); + if (cm.showMatchesOnScrollbar) { + if (searchState.getScrollbarAnnotate()) { + searchState.getScrollbarAnnotate().clear(); + } + searchState.setScrollbarAnnotate(cm.showMatchesOnScrollbar(query)); + } + searchState.setOverlay(overlay); + } + } + + function findNext(cm, prev, query, repeat) { + if (repeat === undefined) { + repeat = 1; + } + return cm.operation(function() { + var pos = cm.getCursor(); + var cursor = cm.getSearchCursor(query, pos); + for (var i = 0; i < repeat; i++) { + var found = cursor.find(prev); + if (i == 0 && found && cursorEqual(cursor.from(), pos)) { + found = cursor.find(prev); + } + if (!found) { + // SearchCursor may have returned null because it hit EOF, wrap + // around and try again. + cursor = cm.getSearchCursor(query, + (prev) ? Pos(cm.lastLine()) : Pos(cm.firstLine(), 0)); + if (!cursor.find(prev)) { + return; + } + } + } + return cursor.from(); + }); + } + + function clearSearchHighlight(cm) { + var state = getSearchState(cm); + cm.removeOverlay(getSearchState(cm).getOverlay()); + state.setOverlay(null); + if (state.getScrollbarAnnotate()) { + state.getScrollbarAnnotate().clear(); + state.setScrollbarAnnotate(null); + } + } + /** + * Check if pos is in the specified range, INCLUSIVE. + * Range can be specified with 1 or 2 arguments. + * If the first range argument is an array, treat it as an array of line + * numbers. Match pos against any of the lines. + * If the first range argument is a number, + * if there is only 1 range argument, check if pos has the same line + * number + * if there are 2 range arguments, then check if pos is in between the two + * range arguments. + */ + function isInRange(pos, start, end) { + if (typeof pos != 'number') { + // Assume it is a cursor position. Get the line number. + pos = pos.line; + } + if (start instanceof Array) { + return inArray(pos, start); + } else { + if (end) { + return (pos >= start && pos <= end); + } else { + return pos == start; + } + } + } + + function getUserVisibleLines(cm) { + var scrollInfo = cm.getScrollInfo(); + var occludeToleranceTop = 6; + var occludeToleranceBottom = 10; + var from = cm.coordsChar({ + left: 0, + top: occludeToleranceTop + scrollInfo.top + }, 'local'); + var bottomY = scrollInfo.clientHeight - occludeToleranceBottom + scrollInfo.top; + var to = cm.coordsChar({ + left: 0, + top: bottomY + }, 'local'); + return { + top: from.line, + bottom: to.line + }; + } + + var ExCommandDispatcher = function() { + this.buildCommandMap_(); + }; + ExCommandDispatcher.prototype = { + processCommand: function(cm, input, opt_params) { + var that = this; + cm.operation(function() { + cm.curOp.isVimOp = true; + that._processCommand(cm, input, opt_params); + }); + }, + _processCommand: function(cm, input, opt_params) { + var vim = cm.state.vim; + var commandHistoryRegister = vimGlobalState.registerController.getRegister(':'); + var previousCommand = commandHistoryRegister.toString(); + if (vim.visualMode) { + exitVisualMode(cm); + } + var inputStream = new CodeMirror.StringStream(input); + // update ": with the latest command whether valid or invalid + commandHistoryRegister.setText(input); + var params = opt_params || {}; + params.input = input; + try { + this.parseInput_(cm, inputStream, params); + } catch (e) { + showConfirm(cm, e); + throw e; + } + var command; + var commandName; + if (!params.commandName) { + // If only a line range is defined, move to the line. + if (params.line !== undefined) { + commandName = 'move'; + } + } else { + command = this.matchCommand_(params.commandName); + if (command) { + commandName = command.name; + if (command.excludeFromCommandHistory) { + commandHistoryRegister.setText(previousCommand); + } + this.parseCommandArgs_(inputStream, params, command); + if (command.type == 'exToKey') { + // Handle Ex to Key mapping. + for (var i = 0; i < command.toKeys.length; i++) { + CodeMirror.Vim.handleKey(cm, command.toKeys[i], 'mapping'); + } + return; + } else if (command.type == 'exToEx') { + // Handle Ex to Ex mapping. + this.processCommand(cm, command.toInput); + return; + } + } + } + if (!commandName) { + showConfirm(cm, 'Not an editor command ":' + input + '"'); + return; + } + try { + exCommands[commandName](cm, params); + // Possibly asynchronous commands (e.g. substitute, which might have a + // user confirmation), are responsible for calling the callback when + // done. All others have it taken care of for them here. + if ((!command || !command.possiblyAsync) && params.callback) { + params.callback(); + } + } catch (e) { + showConfirm(cm, e); + throw e; + } + }, + parseInput_: function(cm, inputStream, result) { + inputStream.eatWhile(':'); + // Parse range. + if (inputStream.eat('%')) { + result.line = cm.firstLine(); + result.lineEnd = cm.lastLine(); + } else { + result.line = this.parseLineSpec_(cm, inputStream); + if (result.line !== undefined && inputStream.eat(',')) { + result.lineEnd = this.parseLineSpec_(cm, inputStream); + } + } + + // Parse command name. + var commandMatch = inputStream.match(/^(\w+)/); + if (commandMatch) { + result.commandName = commandMatch[1]; + } else { + result.commandName = inputStream.match(/.*/)[0]; + } + + return result; + }, + parseLineSpec_: function(cm, inputStream) { + var numberMatch = inputStream.match(/^(\d+)/); + if (numberMatch) { + return parseInt(numberMatch[1], 10) - 1; + } + switch (inputStream.next()) { + case '.': + return cm.getCursor().line; + case '$': + return cm.lastLine(); + case '\'': + var mark = cm.state.vim.marks[inputStream.next()]; + if (mark && mark.find()) { + return mark.find().line; + } + throw new Error('Mark not set'); + default: + inputStream.backUp(1); + return undefined; + } + }, + parseCommandArgs_: function(inputStream, params, command) { + if (inputStream.eol()) { + return; + } + params.argString = inputStream.match(/.*/)[0]; + // Parse command-line arguments + var delim = command.argDelimiter || /\s+/; + var args = trim(params.argString).split(delim); + if (args.length && args[0]) { + params.args = args; + } + }, + matchCommand_: function(commandName) { + // Return the command in the command map that matches the shortest + // prefix of the passed in command name. The match is guaranteed to be + // unambiguous if the defaultExCommandMap's shortNames are set up + // correctly. (see @code{defaultExCommandMap}). + for (var i = commandName.length; i > 0; i--) { + var prefix = commandName.substring(0, i); + if (this.commandMap_[prefix]) { + var command = this.commandMap_[prefix]; + if (command.name.indexOf(commandName) === 0) { + return command; + } + } + } + return null; + }, + buildCommandMap_: function() { + this.commandMap_ = {}; + for (var i = 0; i < defaultExCommandMap.length; i++) { + var command = defaultExCommandMap[i]; + var key = command.shortName || command.name; + this.commandMap_[key] = command; + } + }, + map: function(lhs, rhs, ctx) { + if (lhs != ':' && lhs.charAt(0) == ':') { + if (ctx) { + throw Error('Mode not supported for ex mappings'); + } + var commandName = lhs.substring(1); + if (rhs != ':' && rhs.charAt(0) == ':') { + // Ex to Ex mapping + this.commandMap_[commandName] = { + name: commandName, + type: 'exToEx', + toInput: rhs.substring(1), + user: true + }; + } else { + // Ex to key mapping + this.commandMap_[commandName] = { + name: commandName, + type: 'exToKey', + toKeys: rhs, + user: true + }; + } + } else { + if (rhs != ':' && rhs.charAt(0) == ':') { + // Key to Ex mapping. + var mapping = { + keys: lhs, + type: 'keyToEx', + exArgs: { + input: rhs.substring(1) + }, + user: true + }; + if (ctx) { + mapping.context = ctx; + } + defaultKeymap.unshift(mapping); + } else { + // Key to key mapping + var mapping = { + keys: lhs, + type: 'keyToKey', + toKeys: rhs, + user: true + }; + if (ctx) { + mapping.context = ctx; + } + defaultKeymap.unshift(mapping); + } + } + }, + unmap: function(lhs, ctx) { + if (lhs != ':' && lhs.charAt(0) == ':') { + // Ex to Ex or Ex to key mapping + if (ctx) { + throw Error('Mode not supported for ex mappings'); + } + var commandName = lhs.substring(1); + if (this.commandMap_[commandName] && this.commandMap_[commandName].user) { + delete this.commandMap_[commandName]; + return; + } + } else { + // Key to Ex or key to key mapping + var keys = lhs; + for (var i = 0; i < defaultKeymap.length; i++) { + if (keys == defaultKeymap[i].keys && defaultKeymap[i].context === ctx && defaultKeymap[i].user) { + defaultKeymap.splice(i, 1); + return; + } + } + } + throw Error('No such mapping.'); + } + }; + + var exCommands = { + colorscheme: function(cm, params) { + if (!params.args || params.args.length < 1) { + showConfirm(cm, cm.getOption('theme')); + return; + } + cm.setOption('theme', params.args[0]); + }, + map: function(cm, params, ctx) { + var mapArgs = params.args; + if (!mapArgs || mapArgs.length < 2) { + if (cm) { + showConfirm(cm, 'Invalid mapping: ' + params.input); + } + return; + } + exCommandDispatcher.map(mapArgs[0], mapArgs[1], ctx); + }, + imap: function(cm, params) { + this.map(cm, params, 'insert'); + }, + nmap: function(cm, params) { + this.map(cm, params, 'normal'); + }, + vmap: function(cm, params) { + this.map(cm, params, 'visual'); + }, + unmap: function(cm, params, ctx) { + var mapArgs = params.args; + if (!mapArgs || mapArgs.length < 1) { + if (cm) { + showConfirm(cm, 'No such mapping: ' + params.input); + } + return; + } + exCommandDispatcher.unmap(mapArgs[0], ctx); + }, + move: function(cm, params) { + commandDispatcher.processCommand(cm, cm.state.vim, { + type: 'motion', + motion: 'moveToLineOrEdgeOfDocument', + motionArgs: { + forward: false, + explicitRepeat: true, + linewise: true + }, + repeatOverride: params.line + 1 + }); + }, + set: function(cm, params) { + var setArgs = params.args; + // Options passed through to the setOption/getOption calls. May be passed in by the + // local/global versions of the set command + var setCfg = params.setCfg || {}; + if (!setArgs || setArgs.length < 1) { + if (cm) { + showConfirm(cm, 'Invalid mapping: ' + params.input); + } + return; + } + var expr = setArgs[0].split('='); + var optionName = expr[0]; + var value = expr[1]; + var forceGet = false; + + if (optionName.charAt(optionName.length - 1) == '?') { + // If post-fixed with ?, then the set is actually a get. + if (value) { + throw Error('Trailing characters: ' + params.argString); + } + optionName = optionName.substring(0, optionName.length - 1); + forceGet = true; + } + if (value === undefined && optionName.substring(0, 2) == 'no') { + // To set boolean options to false, the option name is prefixed with + // 'no'. + optionName = optionName.substring(2); + value = false; + } + + var optionIsBoolean = options[optionName] && options[optionName].type == 'boolean'; + if (optionIsBoolean && value == undefined) { + // Calling set with a boolean option sets it to true. + value = true; + } + // If no value is provided, then we assume this is a get. + if (!optionIsBoolean && value === undefined || forceGet) { + var oldValue = getOption(optionName, cm, setCfg); + if (oldValue === true || oldValue === false) { + showConfirm(cm, ' ' + (oldValue ? '' : 'no') + optionName); + } else { + showConfirm(cm, ' ' + optionName + '=' + oldValue); + } + } else { + setOption(optionName, value, cm, setCfg); + } + }, + setlocal: function(cm, params) { + // setCfg is passed through to setOption + params.setCfg = { + scope: 'local' + }; + this.set(cm, params); + }, + setglobal: function(cm, params) { + // setCfg is passed through to setOption + params.setCfg = { + scope: 'global' + }; + this.set(cm, params); + }, + registers: function(cm, params) { + var regArgs = params.args; + var registers = vimGlobalState.registerController.registers; + var regInfo = '----------Registers----------<br><br>'; + if (!regArgs) { + for (var registerName in registers) { + var text = registers[registerName].toString(); + if (text.length) { + regInfo += '"' + registerName + ' ' + text + '<br>'; + } + } + } else { + var registerName; + regArgs = regArgs.join(''); + for (var i = 0; i < regArgs.length; i++) { + registerName = regArgs.charAt(i); + if (!vimGlobalState.registerController.isValidRegister(registerName)) { + continue; + } + var register = registers[registerName] || new Register(); + regInfo += '"' + registerName + ' ' + register.toString() + '<br>'; + } + } + showConfirm(cm, regInfo); + }, + sort: function(cm, params) { + var reverse, ignoreCase, unique, number; + + function parseArgs() { + if (params.argString) { + var args = new CodeMirror.StringStream(params.argString); + if (args.eat('!')) { + reverse = true; + } + if (args.eol()) { + return; + } + if (!args.eatSpace()) { + return 'Invalid arguments'; + } + var opts = args.match(/[a-z]+/); + if (opts) { + opts = opts[0]; + ignoreCase = opts.indexOf('i') != -1; + unique = opts.indexOf('u') != -1; + var decimal = opts.indexOf('d') != -1 && 1; + var hex = opts.indexOf('x') != -1 && 1; + var octal = opts.indexOf('o') != -1 && 1; + if (decimal + hex + octal > 1) { + return 'Invalid arguments'; + } + number = decimal && 'decimal' || hex && 'hex' || octal && 'octal'; + } + if (args.match(/\/.*\//)) { + return 'patterns not supported'; + } + } + } + var err = parseArgs(); + if (err) { + showConfirm(cm, err + ': ' + params.argString); + return; + } + var lineStart = params.line || cm.firstLine(); + var lineEnd = params.lineEnd || params.line || cm.lastLine(); + if (lineStart == lineEnd) { + return; + } + var curStart = Pos(lineStart, 0); + var curEnd = Pos(lineEnd, lineLength(cm, lineEnd)); + var text = cm.getRange(curStart, curEnd).split('\n'); + var numberRegex = (number == 'decimal') ? /(-?)([\d]+)/ : + (number == 'hex') ? /(-?)(?:0x)?([0-9a-f]+)/i : + (number == 'octal') ? /([0-7]+)/ : null; + var radix = (number == 'decimal') ? 10 : (number == 'hex') ? 16 : (number == 'octal') ? 8 : null; + var numPart = [], + textPart = []; + if (number) { + for (var i = 0; i < text.length; i++) { + if (numberRegex.exec(text[i])) { + numPart.push(text[i]); + } else { + textPart.push(text[i]); + } + } + } else { + textPart = text; + } + + function compareFn(a, b) { + if (reverse) { + var tmp; + tmp = a; + a = b; + b = tmp; + } + if (ignoreCase) { + a = a.toLowerCase(); + b = b.toLowerCase(); + } + var anum = number && numberRegex.exec(a); + var bnum = number && numberRegex.exec(b); + if (!anum) { + return a < b ? -1 : 1; + } + anum = parseInt((anum[1] + anum[2]).toLowerCase(), radix); + bnum = parseInt((bnum[1] + bnum[2]).toLowerCase(), radix); + return anum - bnum; + } + numPart.sort(compareFn); + textPart.sort(compareFn); + text = (!reverse) ? textPart.concat(numPart) : numPart.concat(textPart); + if (unique) { // Remove duplicate lines + var textOld = text; + var lastLine; + text = []; + for (var i = 0; i < textOld.length; i++) { + if (textOld[i] != lastLine) { + text.push(textOld[i]); + } + lastLine = textOld[i]; + } + } + cm.replaceRange(text.join('\n'), curStart, curEnd); + }, + global: function(cm, params) { + // a global command is of the form + // :[range]g/pattern/[cmd] + // argString holds the string /pattern/[cmd] + var argString = params.argString; + if (!argString) { + showConfirm(cm, 'Regular Expression missing from global'); + return; + } + // range is specified here + var lineStart = (params.line !== undefined) ? params.line : cm.firstLine(); + var lineEnd = params.lineEnd || params.line || cm.lastLine(); + // get the tokens from argString + var tokens = splitBySlash(argString); + var regexPart = argString, + cmd; + if (tokens.length) { + regexPart = tokens[0]; + cmd = tokens.slice(1, tokens.length).join('/'); + } + if (regexPart) { + // If regex part is empty, then use the previous query. Otherwise + // use the regex part as the new query. + try { + updateSearchQuery(cm, regexPart, true /** ignoreCase */ , + true /** smartCase */ ); + } catch (e) { + showConfirm(cm, 'Invalid regex: ' + regexPart); + return; + } + } + // now that we have the regexPart, search for regex matches in the + // specified range of lines + var query = getSearchState(cm).getQuery(); + var matchedLines = [], + content = ''; + for (var i = lineStart; i <= lineEnd; i++) { + var matched = query.test(cm.getLine(i)); + if (matched) { + matchedLines.push(i + 1); + content += cm.getLine(i) + '<br>'; + } + } + // if there is no [cmd], just display the list of matched lines + if (!cmd) { + showConfirm(cm, content); + return; + } + var index = 0; + var nextCommand = function() { + if (index < matchedLines.length) { + var command = matchedLines[index] + cmd; + exCommandDispatcher.processCommand(cm, command, { + callback: nextCommand + }); + } + index++; + }; + nextCommand(); + }, + substitute: function(cm, params) { + if (!cm.getSearchCursor) { + throw new Error('Search feature not available. Requires searchcursor.js or ' + + 'any other getSearchCursor implementation.'); + } + var argString = params.argString; + var tokens = argString ? splitBySlash(argString) : []; + var regexPart, replacePart = '', + trailing, flagsPart, count; + var confirm = false; // Whether to confirm each replace. + var global = false; // True to replace all instances on a line, false to replace only 1. + if (tokens.length) { + regexPart = tokens[0]; + replacePart = tokens[1]; + if (replacePart !== undefined) { + if (getOption('pcre')) { + replacePart = unescapeRegexReplace(replacePart); + } else { + replacePart = translateRegexReplace(replacePart); + } + vimGlobalState.lastSubstituteReplacePart = replacePart; + } + trailing = tokens[2] ? tokens[2].split(' ') : []; + } else { + // either the argString is empty or its of the form ' hello/world' + // actually splitBySlash returns a list of tokens + // only if the string starts with a '/' + if (argString && argString.length) { + showConfirm(cm, 'Substitutions should be of the form ' + + ':s/pattern/replace/'); + return; + } + } + // After the 3rd slash, we can have flags followed by a space followed + // by count. + if (trailing) { + flagsPart = trailing[0]; + count = parseInt(trailing[1]); + if (flagsPart) { + if (flagsPart.indexOf('c') != -1) { + confirm = true; + flagsPart.replace('c', ''); + } + if (flagsPart.indexOf('g') != -1) { + global = true; + flagsPart.replace('g', ''); + } + regexPart = regexPart + '/' + flagsPart; + } + } + if (regexPart) { + // If regex part is empty, then use the previous query. Otherwise use + // the regex part as the new query. + try { + updateSearchQuery(cm, regexPart, true /** ignoreCase */ , + true /** smartCase */ ); + } catch (e) { + showConfirm(cm, 'Invalid regex: ' + regexPart); + return; + } + } + replacePart = replacePart || vimGlobalState.lastSubstituteReplacePart; + if (replacePart === undefined) { + showConfirm(cm, 'No previous substitute regular expression'); + return; + } + var state = getSearchState(cm); + var query = state.getQuery(); + var lineStart = (params.line !== undefined) ? params.line : cm.getCursor().line; + var lineEnd = params.lineEnd || lineStart; + if (lineStart == cm.firstLine() && lineEnd == cm.lastLine()) { + lineEnd = Infinity; + } + if (count) { + lineStart = lineEnd; + lineEnd = lineStart + count - 1; + } + var startPos = clipCursorToContent(cm, Pos(lineStart, 0)); + var cursor = cm.getSearchCursor(query, startPos); + doReplace(cm, confirm, global, lineStart, lineEnd, cursor, query, replacePart, params.callback); + }, + redo: CodeMirror.commands.redo, + undo: CodeMirror.commands.undo, + write: function(cm) { + if (CodeMirror.commands.save) { + // If a save command is defined, call it. + CodeMirror.commands.save(cm); + } else { + // Saves to text area if no save command is defined. + cm.save(); + } + }, + nohlsearch: function(cm) { + clearSearchHighlight(cm); + }, + delmarks: function(cm, params) { + if (!params.argString || !trim(params.argString)) { + showConfirm(cm, 'Argument required'); + return; + } + + var state = cm.state.vim; + var stream = new CodeMirror.StringStream(trim(params.argString)); + while (!stream.eol()) { + stream.eatSpace(); + + // Record the streams position at the beginning of the loop for use + // in error messages. + var count = stream.pos; + + if (!stream.match(/[a-zA-Z]/, false)) { + showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)); + return; + } + + var sym = stream.next(); + // Check if this symbol is part of a range + if (stream.match('-', true)) { + // This symbol is part of a range. + + // The range must terminate at an alphabetic character. + if (!stream.match(/[a-zA-Z]/, false)) { + showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)); + return; + } + + var startMark = sym; + var finishMark = stream.next(); + // The range must terminate at an alphabetic character which + // shares the same case as the start of the range. + if (isLowerCase(startMark) && isLowerCase(finishMark) || + isUpperCase(startMark) && isUpperCase(finishMark)) { + var start = startMark.charCodeAt(0); + var finish = finishMark.charCodeAt(0); + if (start >= finish) { + showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count)); + return; + } + + // Because marks are always ASCII values, and we have + // determined that they are the same case, we can use + // their char codes to iterate through the defined range. + for (var j = 0; j <= finish - start; j++) { + var mark = String.fromCharCode(start + j); + delete state.marks[mark]; + } + } else { + showConfirm(cm, 'Invalid argument: ' + startMark + '-'); + return; + } + } else { + // This symbol is a valid mark, and is not part of a range. + delete state.marks[sym]; + } + } + } + }; + + var exCommandDispatcher = new ExCommandDispatcher(); + + /** + * @param {CodeMirror} cm CodeMirror instance we are in. + * @param {boolean} confirm Whether to confirm each replace. + * @param {Cursor} lineStart Line to start replacing from. + * @param {Cursor} lineEnd Line to stop replacing at. + * @param {RegExp} query Query for performing matches with. + * @param {string} replaceWith Text to replace matches with. May contain $1, + * $2, etc for replacing captured groups using Javascript replace. + * @param {function()} callback A callback for when the replace is done. + */ + function doReplace(cm, confirm, global, lineStart, lineEnd, searchCursor, query, + replaceWith, callback) { + // Set up all the functions. + cm.state.vim.exMode = true; + var done = false; + var lastPos = searchCursor.from(); + + function replaceAll() { + cm.operation(function() { + while (!done) { + replace(); + next(); + } + stop(); + }); + } + + function replace() { + var text = cm.getRange(searchCursor.from(), searchCursor.to()); + var newText = text.replace(query, replaceWith); + searchCursor.replace(newText); + } + + function next() { + // The below only loops to skip over multiple occurrences on the same + // line when 'global' is not true. + while (searchCursor.findNext() && + isInRange(searchCursor.from(), lineStart, lineEnd)) { + if (!global && lastPos && searchCursor.from().line == lastPos.line) { + continue; + } + cm.scrollIntoView(searchCursor.from(), 30); + cm.setSelection(searchCursor.from(), searchCursor.to()); + lastPos = searchCursor.from(); + done = false; + return; + } + done = true; + } + + function stop(close) { + if (close) { + close(); + } + cm.focus(); + if (lastPos) { + cm.setCursor(lastPos); + var vim = cm.state.vim; + vim.exMode = false; + vim.lastHPos = vim.lastHSPos = lastPos.ch; + } + if (callback) { + callback(); + } + } + + function onPromptKeyDown(e, _value, close) { + // Swallow all keys. + CodeMirror.e_stop(e); + var keyName = CodeMirror.keyName(e); + switch (keyName) { + case 'Y': + replace(); + next(); + break; + case 'N': + next(); + break; + case 'A': + // replaceAll contains a call to close of its own. We don't want it + // to fire too early or multiple times. + var savedCallback = callback; + callback = undefined; + cm.operation(replaceAll); + callback = savedCallback; + break; + case 'L': + replace(); + // fall through and exit. + case 'Q': + case 'Esc': + case 'Ctrl-C': + case 'Ctrl-[': + stop(close); + break; + } + if (done) { + stop(close); + } + return true; + } + + // Actually do replace. + next(); + if (done) { + showConfirm(cm, 'No matches for ' + query.source); + return; + } + if (!confirm) { + replaceAll(); + if (callback) { + callback(); + }; + return; + } + showPrompt(cm, { + prefix: 'replace with <strong>' + replaceWith + '</strong> (y/n/a/q/l)', + onKeyDown: onPromptKeyDown + }); + } + + CodeMirror.keyMap.vim = { + attach: attachVimMap, + detach: detachVimMap, + call: cmKey + }; + + function exitInsertMode(cm) { + var vim = cm.state.vim; + var macroModeState = vimGlobalState.macroModeState; + var insertModeChangeRegister = vimGlobalState.registerController.getRegister('.'); + var isPlaying = macroModeState.isPlaying; + var lastChange = macroModeState.lastInsertModeChanges; + // In case of visual block, the insertModeChanges are not saved as a + // single word, so we convert them to a single word + // so as to update the ". register as expected in real vim. + var text = []; + if (!isPlaying) { + var selLength = lastChange.inVisualBlock ? vim.lastSelection.visualBlock.height : 1; + var changes = lastChange.changes; + var text = []; + var i = 0; + // In case of multiple selections in blockwise visual, + // the inserted text, for example: 'f<Backspace>oo', is stored as + // 'f', 'f', InsertModeKey 'o', 'o', 'o', 'o'. (if you have a block with 2 lines). + // We push the contents of the changes array as per the following: + // 1. In case of InsertModeKey, just increment by 1. + // 2. In case of a character, jump by selLength (2 in the example). + while (i < changes.length) { + // This loop will convert 'ff<bs>oooo' to 'f<bs>oo'. + text.push(changes[i]); + if (changes[i] instanceof InsertModeKey) { + i++; + } else { + i += selLength; + } + } + lastChange.changes = text; + cm.off('change', onChange); + CodeMirror.off(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown); + } + if (!isPlaying && vim.insertModeRepeat > 1) { + // Perform insert mode repeat for commands like 3,a and 3,o. + repeatLastEdit(cm, vim, vim.insertModeRepeat - 1, + true /** repeatForInsert */ ); + vim.lastEditInputState.repeatOverride = vim.insertModeRepeat; + } + delete vim.insertModeRepeat; + vim.insertMode = false; + cm.setCursor(cm.getCursor().line, cm.getCursor().ch - 1); + cm.setOption('keyMap', 'vim'); + cm.setOption('disableInput', true); + cm.toggleOverwrite(false); // exit replace mode if we were in it. + // update the ". register before exiting insert mode + insertModeChangeRegister.setText(lastChange.changes.join('')); + CodeMirror.signal(cm, "vim-mode-change", { + mode: "normal" + }); + if (macroModeState.isRecording) { + logInsertModeChange(macroModeState); + } + } + + function _mapCommand(command) { + defaultKeymap.unshift(command); + } + + function mapCommand(keys, type, name, args, extra) { + var command = { + keys: keys, + type: type + }; + command[type] = name; + command[type + "Args"] = args; + for (var key in extra) + command[key] = extra[key]; + _mapCommand(command); + } + + // The timeout in milliseconds for the two-character ESC keymap should be + // adjusted according to your typing speed to prevent false positives. + defineOption('insertModeEscKeysTimeout', 200, 'number'); + + CodeMirror.keyMap['vim-insert'] = { + // TODO: override navigation keys so that Esc will cancel automatic + // indentation from o, O, i_<CR> + 'Ctrl-N': 'autocomplete', + 'Ctrl-P': 'autocomplete', + 'Enter': function(cm) { + var fn = CodeMirror.commands.newlineAndIndentContinueComment || + CodeMirror.commands.newlineAndIndent; + fn(cm); + }, + fallthrough: ['default'], + attach: attachVimMap, + detach: detachVimMap, + call: cmKey + }; + + CodeMirror.keyMap['vim-replace'] = { + 'Backspace': 'goCharLeft', + fallthrough: ['vim-insert'], + attach: attachVimMap, + detach: detachVimMap, + call: cmKey + }; + + function executeMacroRegister(cm, vim, macroModeState, registerName) { + var register = vimGlobalState.registerController.getRegister(registerName); + if (registerName == ':') { + // Read-only register containing last Ex command. + if (register.keyBuffer[0]) { + exCommandDispatcher.processCommand(cm, register.keyBuffer[0]); + } + macroModeState.isPlaying = false; + return; + } + var keyBuffer = register.keyBuffer; + var imc = 0; + macroModeState.isPlaying = true; + macroModeState.replaySearchQueries = register.searchQueries.slice(0); + for (var i = 0; i < keyBuffer.length; i++) { + var text = keyBuffer[i]; + var match, key; + while (text) { + // Pull off one command key, which is either a single character + // or a special sequence wrapped in '<' and '>', e.g. '<Space>'. + match = (/<\w+-.+?>|<\w+>|./).exec(text); + key = match[0]; + text = text.substring(match.index + key.length); + CodeMirror.Vim.handleKey(cm, key, 'macro'); + if (vim.insertMode) { + var changes = register.insertModeChanges[imc++].changes; + vimGlobalState.macroModeState.lastInsertModeChanges.changes = + changes; + repeatInsertModeChanges(cm, changes, 1); + exitInsertMode(cm); + } + } + }; + macroModeState.isPlaying = false; + } + + function logKey(macroModeState, key) { + if (macroModeState.isPlaying) { + return; + } + var registerName = macroModeState.latestRegister; + var register = vimGlobalState.registerController.getRegister(registerName); + if (register) { + register.pushText(key); + } + } + + function logInsertModeChange(macroModeState) { + if (macroModeState.isPlaying) { + return; + } + var registerName = macroModeState.latestRegister; + var register = vimGlobalState.registerController.getRegister(registerName); + if (register && register.pushInsertModeChanges) { + register.pushInsertModeChanges(macroModeState.lastInsertModeChanges); + } + } + + function logSearchQuery(macroModeState, query) { + if (macroModeState.isPlaying) { + return; + } + var registerName = macroModeState.latestRegister; + var register = vimGlobalState.registerController.getRegister(registerName); + if (register && register.pushSearchQuery) { + register.pushSearchQuery(query); + } + } + + /** + * Listens for changes made in insert mode. + * Should only be active in insert mode. + */ + function onChange(_cm, changeObj) { + var macroModeState = vimGlobalState.macroModeState; + var lastChange = macroModeState.lastInsertModeChanges; + if (!macroModeState.isPlaying) { + while (changeObj) { + lastChange.expectCursorActivityForChange = true; + if (changeObj.origin == '+input' || changeObj.origin == 'paste' || changeObj.origin === undefined /* only in testing */ ) { + var text = changeObj.text.join('\n'); + lastChange.changes.push(text); + } + // Change objects may be chained with next. + changeObj = changeObj.next; + } + } + } + + /** + * Listens for any kind of cursor activity on CodeMirror. + */ + function onCursorActivity(cm) { + var vim = cm.state.vim; + if (vim.insertMode) { + // Tracking cursor activity in insert mode (for macro support). + var macroModeState = vimGlobalState.macroModeState; + if (macroModeState.isPlaying) { + return; + } + var lastChange = macroModeState.lastInsertModeChanges; + if (lastChange.expectCursorActivityForChange) { + lastChange.expectCursorActivityForChange = false; + } else { + // Cursor moved outside the context of an edit. Reset the change. + lastChange.changes = []; + } + } else if (!cm.curOp.isVimOp) { + handleExternalSelection(cm, vim); + } + if (vim.visualMode) { + updateFakeCursor(cm); + } + } + + function updateFakeCursor(cm) { + var vim = cm.state.vim; + var from = clipCursorToContent(cm, copyCursor(vim.sel.head)); + var to = offsetCursor(from, 0, 1); + if (vim.fakeCursor) { + vim.fakeCursor.clear(); + } + vim.fakeCursor = cm.markText(from, to, { + className: 'cm-animate-fat-cursor' + }); + } + + function handleExternalSelection(cm, vim) { + var anchor = cm.getCursor('anchor'); + var head = cm.getCursor('head'); + // Enter or exit visual mode to match mouse selection. + if (vim.visualMode && !cm.somethingSelected()) { + exitVisualMode(cm, false); + } else if (!vim.visualMode && !vim.insertMode && cm.somethingSelected()) { + vim.visualMode = true; + vim.visualLine = false; + CodeMirror.signal(cm, "vim-mode-change", { + mode: "visual" + }); + } + if (vim.visualMode) { + // Bind CodeMirror selection model to vim selection model. + // Mouse selections are considered visual characterwise. + var headOffset = !cursorIsBefore(head, anchor) ? -1 : 0; + var anchorOffset = cursorIsBefore(head, anchor) ? -1 : 0; + head = offsetCursor(head, 0, headOffset); + anchor = offsetCursor(anchor, 0, anchorOffset); + vim.sel = { + anchor: anchor, + head: head + }; + updateMark(cm, vim, '<', cursorMin(head, anchor)); + updateMark(cm, vim, '>', cursorMax(head, anchor)); + } else if (!vim.insertMode) { + // Reset lastHPos if selection was modified by something outside of vim mode e.g. by mouse. + vim.lastHPos = cm.getCursor().ch; + } + } + + /** Wrapper for special keys pressed in insert mode */ + function InsertModeKey(keyName) { + this.keyName = keyName; + } + + /** + * Handles raw key down events from the text area. + * - Should only be active in insert mode. + * - For recording deletes in insert mode. + */ + function onKeyEventTargetKeyDown(e) { + var macroModeState = vimGlobalState.macroModeState; + var lastChange = macroModeState.lastInsertModeChanges; + var keyName = CodeMirror.keyName(e); + if (!keyName) { + return; + } + + function onKeyFound() { + lastChange.changes.push(new InsertModeKey(keyName)); + return true; + } + if (keyName.indexOf('Delete') != -1 || keyName.indexOf('Backspace') != -1) { + CodeMirror.lookupKey(keyName, 'vim-insert', onKeyFound); + } + } + + /** + * Repeats the last edit, which includes exactly 1 command and at most 1 + * insert. Operator and motion commands are read from lastEditInputState, + * while action commands are read from lastEditActionCommand. + * + * If repeatForInsert is true, then the function was called by + * exitInsertMode to repeat the insert mode changes the user just made. The + * corresponding enterInsertMode call was made with a count. + */ + function repeatLastEdit(cm, vim, repeat, repeatForInsert) { + var macroModeState = vimGlobalState.macroModeState; + macroModeState.isPlaying = true; + var isAction = !!vim.lastEditActionCommand; + var cachedInputState = vim.inputState; + + function repeatCommand() { + if (isAction) { + commandDispatcher.processAction(cm, vim, vim.lastEditActionCommand); + } else { + commandDispatcher.evalInput(cm, vim); + } + } + + function repeatInsert(repeat) { + if (macroModeState.lastInsertModeChanges.changes.length > 0) { + // For some reason, repeat cw in desktop VIM does not repeat + // insert mode changes. Will conform to that behavior. + repeat = !vim.lastEditActionCommand ? 1 : repeat; + var changeObject = macroModeState.lastInsertModeChanges; + repeatInsertModeChanges(cm, changeObject.changes, repeat); + } + } + vim.inputState = vim.lastEditInputState; + if (isAction && vim.lastEditActionCommand.interlaceInsertRepeat) { + // o and O repeat have to be interlaced with insert repeats so that the + // insertions appear on separate lines instead of the last line. + for (var i = 0; i < repeat; i++) { + repeatCommand(); + repeatInsert(1); + } + } else { + if (!repeatForInsert) { + // Hack to get the cursor to end up at the right place. If I is + // repeated in insert mode repeat, cursor will be 1 insert + // change set left of where it should be. + repeatCommand(); + } + repeatInsert(repeat); + } + vim.inputState = cachedInputState; + if (vim.insertMode && !repeatForInsert) { + // Don't exit insert mode twice. If repeatForInsert is set, then we + // were called by an exitInsertMode call lower on the stack. + exitInsertMode(cm); + } + macroModeState.isPlaying = false; + }; + + function repeatInsertModeChanges(cm, changes, repeat) { + function keyHandler(binding) { + if (typeof binding == 'string') { + CodeMirror.commands[binding](cm); + } else { + binding(cm); + } + return true; + } + var head = cm.getCursor('head'); + var inVisualBlock = vimGlobalState.macroModeState.lastInsertModeChanges.inVisualBlock; + if (inVisualBlock) { + // Set up block selection again for repeating the changes. + var vim = cm.state.vim; + var lastSel = vim.lastSelection; + var offset = getOffset(lastSel.anchor, lastSel.head); + selectForInsert(cm, head, offset.line + 1); + repeat = cm.listSelections().length; + cm.setCursor(head); + } + for (var i = 0; i < repeat; i++) { + if (inVisualBlock) { + cm.setCursor(offsetCursor(head, i, 0)); + } + for (var j = 0; j < changes.length; j++) { + var change = changes[j]; + if (change instanceof InsertModeKey) { + CodeMirror.lookupKey(change.keyName, 'vim-insert', keyHandler); + } else { + var cur = cm.getCursor(); + cm.replaceRange(change, cur, cur); + } + } + } + if (inVisualBlock) { + cm.setCursor(offsetCursor(head, 0, 1)); + } + } + + resetVimGlobalState(); + return vimApi; + }; + // Initialize Vim and make it available as an API. + CodeMirror.Vim = Vim(); +}); \ No newline at end of file diff --git a/cyclone-web/vendor/codeMirror/merge.css b/cyclone-web/vendor/codeMirror/merge.css new file mode 100644 index 0000000000000000000000000000000000000000..dadd7f59c788f08e8f1a5ddf3efdffa5900832e5 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/merge.css @@ -0,0 +1,119 @@ +.CodeMirror-merge { + position: relative; + border: 1px solid #ddd; + white-space: pre; +} + +.CodeMirror-merge, .CodeMirror-merge .CodeMirror { + height: 350px; +} + +.CodeMirror-merge-2pane .CodeMirror-merge-pane { width: 47%; } +.CodeMirror-merge-2pane .CodeMirror-merge-gap { width: 6%; } +.CodeMirror-merge-3pane .CodeMirror-merge-pane { width: 31%; } +.CodeMirror-merge-3pane .CodeMirror-merge-gap { width: 3.5%; } + +.CodeMirror-merge-pane { + display: inline-block; + white-space: normal; + vertical-align: top; +} +.CodeMirror-merge-pane-rightmost { + position: absolute; + right: 0px; + z-index: 1; +} + +.CodeMirror-merge-gap { + z-index: 2; + display: inline-block; + height: 100%; + -moz-box-sizing: border-box; + box-sizing: border-box; + overflow: hidden; + border-left: 1px solid #ddd; + border-right: 1px solid #ddd; + position: relative; + background: #f8f8f8; +} + +.CodeMirror-merge-scrolllock-wrap { + position: absolute; + bottom: 0; left: 50%; +} +.CodeMirror-merge-scrolllock { + position: relative; + left: -50%; + cursor: pointer; + color: #555; + line-height: 1; +} +.CodeMirror-merge-scrolllock:after { + content: "\21db\00a0\00a0\21da"; +} +.CodeMirror-merge-scrolllock.CodeMirror-merge-scrolllock-enabled:after { + content: "\21db\21da"; +} + +.CodeMirror-merge-copybuttons-left, .CodeMirror-merge-copybuttons-right { + position: absolute; + left: 0; top: 0; + right: 0; bottom: 0; + line-height: 1; +} + +.CodeMirror-merge-copy { + position: absolute; + cursor: pointer; + color: #44c; + z-index: 3; +} + +.CodeMirror-merge-copy-reverse { + position: absolute; + cursor: pointer; + color: #44c; +} + +.CodeMirror-merge-copybuttons-left .CodeMirror-merge-copy { left: 2px; } +.CodeMirror-merge-copybuttons-right .CodeMirror-merge-copy { right: 2px; } + +.CodeMirror-merge-r-inserted, .CodeMirror-merge-l-inserted { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12MwuCXy3+CWyH8GBgYGJgYkAABZbAQ9ELXurwAAAABJRU5ErkJggg==); + background-position: bottom left; + background-repeat: repeat-x; +} + +.CodeMirror-merge-r-deleted, .CodeMirror-merge-l-deleted { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12M4Kyb2/6yY2H8GBgYGJgYkAABURgPz6Ks7wQAAAABJRU5ErkJggg==); + background-position: bottom left; + background-repeat: repeat-x; +} + +.CodeMirror-merge-r-chunk { background: #ffffe0; } +.CodeMirror-merge-r-chunk-start { border-top: 1px solid #ee8; } +.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #ee8; } +.CodeMirror-merge-r-connect { fill: #ffffe0; stroke: #ee8; stroke-width: 1px; } + +.CodeMirror-merge-l-chunk { background: #eef; } +.CodeMirror-merge-l-chunk-start { border-top: 1px solid #88e; } +.CodeMirror-merge-l-chunk-end { border-bottom: 1px solid #88e; } +.CodeMirror-merge-l-connect { fill: #eef; stroke: #88e; stroke-width: 1px; } + +.CodeMirror-merge-l-chunk.CodeMirror-merge-r-chunk { background: #dfd; } +.CodeMirror-merge-l-chunk-start.CodeMirror-merge-r-chunk-start { border-top: 1px solid #4e4; } +.CodeMirror-merge-l-chunk-end.CodeMirror-merge-r-chunk-end { border-bottom: 1px solid #4e4; } + +.CodeMirror-merge-collapsed-widget:before { + content: "(...)"; +} +.CodeMirror-merge-collapsed-widget { + cursor: pointer; + color: #88b; + background: #eef; + border: 1px solid #ddf; + font-size: 90%; + padding: 0 3px; + border-radius: 4px; +} +.CodeMirror-merge-collapsed-line .CodeMirror-gutter-elt { display: none; } diff --git a/cyclone-web/vendor/codeMirror/merge.js b/cyclone-web/vendor/codeMirror/merge.js new file mode 100644 index 0000000000000000000000000000000000000000..5b87b5e62a7e9a8224ebf647190d7bd56b375790 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/merge.js @@ -0,0 +1,1002 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/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); + (val ? CodeMirror.addClass : CodeMirror.rmClass)(dv.lockButton, "CodeMirror-merge-scrolllock-enabled"); + } + + // 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; + function getDiff(a, b, ignoreWhitespace) { + if (!dmp) dmp = new diff_match_patch(); + + 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 = []; + if (!diff.length) return 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"); + } + if (mark.explicitlyCleared) clear(); + CodeMirror.on(widget, "click", clear); + mark.on("clear", clear); + 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/cyclone-web/vendor/codeMirror/perl.js b/cyclone-web/vendor/codeMirror/perl.js new file mode 100644 index 0000000000000000000000000000000000000000..66e4ed034cbc7346733a1c66d4673d46fac2d5e4 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/perl.js @@ -0,0 +1,837 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +// CodeMirror2 mode/perl/perl.js (text/x-perl) beta 0.10 (2011-11-08) +// This is a part of CodeMirror from https://github.com/sabaca/CodeMirror_mode_perl (mail@sabaca.com) + +(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.defineMode("perl",function(){ + // http://perldoc.perl.org + var PERL={ // null - magic touch + // 1 - keyword + // 2 - def + // 3 - atom + // 4 - operator + // 5 - variable-2 (predefined) + // [x,y] - x=1,2,3; y=must be defined if x{...} + // PERL operators + '->' : 4, + '++' : 4, + '--' : 4, + '**' : 4, + // ! ~ \ and unary + and - + '=~' : 4, + '!~' : 4, + '*' : 4, + '/' : 4, + '%' : 4, + 'x' : 4, + '+' : 4, + '-' : 4, + '.' : 4, + '<<' : 4, + '>>' : 4, + // named unary operators + '<' : 4, + '>' : 4, + '<=' : 4, + '>=' : 4, + 'lt' : 4, + 'gt' : 4, + 'le' : 4, + 'ge' : 4, + '==' : 4, + '!=' : 4, + '<=>' : 4, + 'eq' : 4, + 'ne' : 4, + 'cmp' : 4, + '~~' : 4, + '&' : 4, + '|' : 4, + '^' : 4, + '&&' : 4, + '||' : 4, + '//' : 4, + '..' : 4, + '...' : 4, + '?' : 4, + ':' : 4, + '=' : 4, + '+=' : 4, + '-=' : 4, + '*=' : 4, // etc. ??? + ',' : 4, + '=>' : 4, + '::' : 4, + // list operators (rightward) + 'not' : 4, + 'and' : 4, + 'or' : 4, + 'xor' : 4, + // PERL predefined variables (I know, what this is a paranoid idea, but may be needed for people, who learn PERL, and for me as well, ...and may be for you?;) + 'BEGIN' : [5,1], + 'END' : [5,1], + 'PRINT' : [5,1], + 'PRINTF' : [5,1], + 'GETC' : [5,1], + 'READ' : [5,1], + 'READLINE' : [5,1], + 'DESTROY' : [5,1], + 'TIE' : [5,1], + 'TIEHANDLE' : [5,1], + 'UNTIE' : [5,1], + 'STDIN' : 5, + 'STDIN_TOP' : 5, + 'STDOUT' : 5, + 'STDOUT_TOP' : 5, + 'STDERR' : 5, + 'STDERR_TOP' : 5, + '$ARG' : 5, + '$_' : 5, + '@ARG' : 5, + '@_' : 5, + '$LIST_SEPARATOR' : 5, + '$"' : 5, + '$PROCESS_ID' : 5, + '$PID' : 5, + '$$' : 5, + '$REAL_GROUP_ID' : 5, + '$GID' : 5, + '$(' : 5, + '$EFFECTIVE_GROUP_ID' : 5, + '$EGID' : 5, + '$)' : 5, + '$PROGRAM_NAME' : 5, + '$0' : 5, + '$SUBSCRIPT_SEPARATOR' : 5, + '$SUBSEP' : 5, + '$;' : 5, + '$REAL_USER_ID' : 5, + '$UID' : 5, + '$<' : 5, + '$EFFECTIVE_USER_ID' : 5, + '$EUID' : 5, + '$>' : 5, + '$a' : 5, + '$b' : 5, + '$COMPILING' : 5, + '$^C' : 5, + '$DEBUGGING' : 5, + '$^D' : 5, + '${^ENCODING}' : 5, + '$ENV' : 5, + '%ENV' : 5, + '$SYSTEM_FD_MAX' : 5, + '$^F' : 5, + '@F' : 5, + '${^GLOBAL_PHASE}' : 5, + '$^H' : 5, + '%^H' : 5, + '@INC' : 5, + '%INC' : 5, + '$INPLACE_EDIT' : 5, + '$^I' : 5, + '$^M' : 5, + '$OSNAME' : 5, + '$^O' : 5, + '${^OPEN}' : 5, + '$PERLDB' : 5, + '$^P' : 5, + '$SIG' : 5, + '%SIG' : 5, + '$BASETIME' : 5, + '$^T' : 5, + '${^TAINT}' : 5, + '${^UNICODE}' : 5, + '${^UTF8CACHE}' : 5, + '${^UTF8LOCALE}' : 5, + '$PERL_VERSION' : 5, + '$^V' : 5, + '${^WIN32_SLOPPY_STAT}' : 5, + '$EXECUTABLE_NAME' : 5, + '$^X' : 5, + '$1' : 5, // - regexp $1, $2... + '$MATCH' : 5, + '$&' : 5, + '${^MATCH}' : 5, + '$PREMATCH' : 5, + '$`' : 5, + '${^PREMATCH}' : 5, + '$POSTMATCH' : 5, + "$'" : 5, + '${^POSTMATCH}' : 5, + '$LAST_PAREN_MATCH' : 5, + '$+' : 5, + '$LAST_SUBMATCH_RESULT' : 5, + '$^N' : 5, + '@LAST_MATCH_END' : 5, + '@+' : 5, + '%LAST_PAREN_MATCH' : 5, + '%+' : 5, + '@LAST_MATCH_START' : 5, + '@-' : 5, + '%LAST_MATCH_START' : 5, + '%-' : 5, + '$LAST_REGEXP_CODE_RESULT' : 5, + '$^R' : 5, + '${^RE_DEBUG_FLAGS}' : 5, + '${^RE_TRIE_MAXBUF}' : 5, + '$ARGV' : 5, + '@ARGV' : 5, + 'ARGV' : 5, + 'ARGVOUT' : 5, + '$OUTPUT_FIELD_SEPARATOR' : 5, + '$OFS' : 5, + '$,' : 5, + '$INPUT_LINE_NUMBER' : 5, + '$NR' : 5, + '$.' : 5, + '$INPUT_RECORD_SEPARATOR' : 5, + '$RS' : 5, + '$/' : 5, + '$OUTPUT_RECORD_SEPARATOR' : 5, + '$ORS' : 5, + '$\\' : 5, + '$OUTPUT_AUTOFLUSH' : 5, + '$|' : 5, + '$ACCUMULATOR' : 5, + '$^A' : 5, + '$FORMAT_FORMFEED' : 5, + '$^L' : 5, + '$FORMAT_PAGE_NUMBER' : 5, + '$%' : 5, + '$FORMAT_LINES_LEFT' : 5, + '$-' : 5, + '$FORMAT_LINE_BREAK_CHARACTERS' : 5, + '$:' : 5, + '$FORMAT_LINES_PER_PAGE' : 5, + '$=' : 5, + '$FORMAT_TOP_NAME' : 5, + '$^' : 5, + '$FORMAT_NAME' : 5, + '$~' : 5, + '${^CHILD_ERROR_NATIVE}' : 5, + '$EXTENDED_OS_ERROR' : 5, + '$^E' : 5, + '$EXCEPTIONS_BEING_CAUGHT' : 5, + '$^S' : 5, + '$WARNING' : 5, + '$^W' : 5, + '${^WARNING_BITS}' : 5, + '$OS_ERROR' : 5, + '$ERRNO' : 5, + '$!' : 5, + '%OS_ERROR' : 5, + '%ERRNO' : 5, + '%!' : 5, + '$CHILD_ERROR' : 5, + '$?' : 5, + '$EVAL_ERROR' : 5, + '$@' : 5, + '$OFMT' : 5, + '$#' : 5, + '$*' : 5, + '$ARRAY_BASE' : 5, + '$[' : 5, + '$OLD_PERL_VERSION' : 5, + '$]' : 5, + // PERL blocks + 'if' :[1,1], + elsif :[1,1], + 'else' :[1,1], + 'while' :[1,1], + unless :[1,1], + 'for' :[1,1], + foreach :[1,1], + // PERL functions + 'abs' :1, // - absolute value function + accept :1, // - accept an incoming socket connect + alarm :1, // - schedule a SIGALRM + 'atan2' :1, // - arctangent of Y/X in the range -PI to PI + bind :1, // - binds an address to a socket + binmode :1, // - prepare binary files for I/O + bless :1, // - create an object + bootstrap :1, // + 'break' :1, // - break out of a "given" block + caller :1, // - get context of the current subroutine call + chdir :1, // - change your current working directory + chmod :1, // - changes the permissions on a list of files + chomp :1, // - remove a trailing record separator from a string + chop :1, // - remove the last character from a string + chown :1, // - change the ownership on a list of files + chr :1, // - get character this number represents + chroot :1, // - make directory new root for path lookups + close :1, // - close file (or pipe or socket) handle + closedir :1, // - close directory handle + connect :1, // - connect to a remote socket + 'continue' :[1,1], // - optional trailing block in a while or foreach + 'cos' :1, // - cosine function + crypt :1, // - one-way passwd-style encryption + dbmclose :1, // - breaks binding on a tied dbm file + dbmopen :1, // - create binding on a tied dbm file + 'default' :1, // + defined :1, // - test whether a value, variable, or function is defined + 'delete' :1, // - deletes a value from a hash + die :1, // - raise an exception or bail out + 'do' :1, // - turn a BLOCK into a TERM + dump :1, // - create an immediate core dump + each :1, // - retrieve the next key/value pair from a hash + endgrent :1, // - be done using group file + endhostent :1, // - be done using hosts file + endnetent :1, // - be done using networks file + endprotoent :1, // - be done using protocols file + endpwent :1, // - be done using passwd file + endservent :1, // - be done using services file + eof :1, // - test a filehandle for its end + 'eval' :1, // - catch exceptions or compile and run code + 'exec' :1, // - abandon this program to run another + exists :1, // - test whether a hash key is present + exit :1, // - terminate this program + 'exp' :1, // - raise I to a power + fcntl :1, // - file control system call + fileno :1, // - return file descriptor from filehandle + flock :1, // - lock an entire file with an advisory lock + fork :1, // - create a new process just like this one + format :1, // - declare a picture format with use by the write() function + formline :1, // - internal function used for formats + getc :1, // - get the next character from the filehandle + getgrent :1, // - get next group record + getgrgid :1, // - get group record given group user ID + getgrnam :1, // - get group record given group name + gethostbyaddr :1, // - get host record given its address + gethostbyname :1, // - get host record given name + gethostent :1, // - get next hosts record + getlogin :1, // - return who logged in at this tty + getnetbyaddr :1, // - get network record given its address + getnetbyname :1, // - get networks record given name + getnetent :1, // - get next networks record + getpeername :1, // - find the other end of a socket connection + getpgrp :1, // - get process group + getppid :1, // - get parent process ID + getpriority :1, // - get current nice value + getprotobyname :1, // - get protocol record given name + getprotobynumber :1, // - get protocol record numeric protocol + getprotoent :1, // - get next protocols record + getpwent :1, // - get next passwd record + getpwnam :1, // - get passwd record given user login name + getpwuid :1, // - get passwd record given user ID + getservbyname :1, // - get services record given its name + getservbyport :1, // - get services record given numeric port + getservent :1, // - get next services record + getsockname :1, // - retrieve the sockaddr for a given socket + getsockopt :1, // - get socket options on a given socket + given :1, // + glob :1, // - expand filenames using wildcards + gmtime :1, // - convert UNIX time into record or string using Greenwich time + 'goto' :1, // - create spaghetti code + grep :1, // - locate elements in a list test true against a given criterion + hex :1, // - convert a string to a hexadecimal number + 'import' :1, // - patch a module's namespace into your own + index :1, // - find a substring within a string + 'int' :1, // - get the integer portion of a number + ioctl :1, // - system-dependent device control system call + 'join' :1, // - join a list into a string using a separator + keys :1, // - retrieve list of indices from a hash + kill :1, // - send a signal to a process or process group + last :1, // - exit a block prematurely + lc :1, // - return lower-case version of a string + lcfirst :1, // - return a string with just the next letter in lower case + length :1, // - return the number of bytes in a string + 'link' :1, // - create a hard link in the filesytem + listen :1, // - register your socket as a server + local : 2, // - create a temporary value for a global variable (dynamic scoping) + localtime :1, // - convert UNIX time into record or string using local time + lock :1, // - get a thread lock on a variable, subroutine, or method + 'log' :1, // - retrieve the natural logarithm for a number + lstat :1, // - stat a symbolic link + m :null, // - match a string with a regular expression pattern + map :1, // - apply a change to a list to get back a new list with the changes + mkdir :1, // - create a directory + msgctl :1, // - SysV IPC message control operations + msgget :1, // - get SysV IPC message queue + msgrcv :1, // - receive a SysV IPC message from a message queue + msgsnd :1, // - send a SysV IPC message to a message queue + my : 2, // - declare and assign a local variable (lexical scoping) + 'new' :1, // + next :1, // - iterate a block prematurely + no :1, // - unimport some module symbols or semantics at compile time + oct :1, // - convert a string to an octal number + open :1, // - open a file, pipe, or descriptor + opendir :1, // - open a directory + ord :1, // - find a character's numeric representation + our : 2, // - declare and assign a package variable (lexical scoping) + pack :1, // - convert a list into a binary representation + 'package' :1, // - declare a separate global namespace + pipe :1, // - open a pair of connected filehandles + pop :1, // - remove the last element from an array and return it + pos :1, // - find or set the offset for the last/next m//g search + print :1, // - output a list to a filehandle + printf :1, // - output a formatted list to a filehandle + prototype :1, // - get the prototype (if any) of a subroutine + push :1, // - append one or more elements to an array + q :null, // - singly quote a string + qq :null, // - doubly quote a string + qr :null, // - Compile pattern + quotemeta :null, // - quote regular expression magic characters + qw :null, // - quote a list of words + qx :null, // - backquote quote a string + rand :1, // - retrieve the next pseudorandom number + read :1, // - fixed-length buffered input from a filehandle + readdir :1, // - get a directory from a directory handle + readline :1, // - fetch a record from a file + readlink :1, // - determine where a symbolic link is pointing + readpipe :1, // - execute a system command and collect standard output + recv :1, // - receive a message over a Socket + redo :1, // - start this loop iteration over again + ref :1, // - find out the type of thing being referenced + rename :1, // - change a filename + require :1, // - load in external functions from a library at runtime + reset :1, // - clear all variables of a given name + 'return' :1, // - get out of a function early + reverse :1, // - flip a string or a list + rewinddir :1, // - reset directory handle + rindex :1, // - right-to-left substring search + rmdir :1, // - remove a directory + s :null, // - replace a pattern with a string + say :1, // - print with newline + scalar :1, // - force a scalar context + seek :1, // - reposition file pointer for random-access I/O + seekdir :1, // - reposition directory pointer + select :1, // - reset default output or do I/O multiplexing + semctl :1, // - SysV semaphore control operations + semget :1, // - get set of SysV semaphores + semop :1, // - SysV semaphore operations + send :1, // - send a message over a socket + setgrent :1, // - prepare group file for use + sethostent :1, // - prepare hosts file for use + setnetent :1, // - prepare networks file for use + setpgrp :1, // - set the process group of a process + setpriority :1, // - set a process's nice value + setprotoent :1, // - prepare protocols file for use + setpwent :1, // - prepare passwd file for use + setservent :1, // - prepare services file for use + setsockopt :1, // - set some socket options + shift :1, // - remove the first element of an array, and return it + shmctl :1, // - SysV shared memory operations + shmget :1, // - get SysV shared memory segment identifier + shmread :1, // - read SysV shared memory + shmwrite :1, // - write SysV shared memory + shutdown :1, // - close down just half of a socket connection + 'sin' :1, // - return the sine of a number + sleep :1, // - block for some number of seconds + socket :1, // - create a socket + socketpair :1, // - create a pair of sockets + 'sort' :1, // - sort a list of values + splice :1, // - add or remove elements anywhere in an array + 'split' :1, // - split up a string using a regexp delimiter + sprintf :1, // - formatted print into a string + 'sqrt' :1, // - square root function + srand :1, // - seed the random number generator + stat :1, // - get a file's status information + state :1, // - declare and assign a state variable (persistent lexical scoping) + study :1, // - optimize input data for repeated searches + 'sub' :1, // - declare a subroutine, possibly anonymously + 'substr' :1, // - get or alter a portion of a stirng + symlink :1, // - create a symbolic link to a file + syscall :1, // - execute an arbitrary system call + sysopen :1, // - open a file, pipe, or descriptor + sysread :1, // - fixed-length unbuffered input from a filehandle + sysseek :1, // - position I/O pointer on handle used with sysread and syswrite + system :1, // - run a separate program + syswrite :1, // - fixed-length unbuffered output to a filehandle + tell :1, // - get current seekpointer on a filehandle + telldir :1, // - get current seekpointer on a directory handle + tie :1, // - bind a variable to an object class + tied :1, // - get a reference to the object underlying a tied variable + time :1, // - return number of seconds since 1970 + times :1, // - return elapsed time for self and child processes + tr :null, // - transliterate a string + truncate :1, // - shorten a file + uc :1, // - return upper-case version of a string + ucfirst :1, // - return a string with just the next letter in upper case + umask :1, // - set file creation mode mask + undef :1, // - remove a variable or function definition + unlink :1, // - remove one link to a file + unpack :1, // - convert binary structure into normal perl variables + unshift :1, // - prepend more elements to the beginning of a list + untie :1, // - break a tie binding to a variable + use :1, // - load in a module at compile time + utime :1, // - set a file's last access and modify times + values :1, // - return a list of the values in a hash + vec :1, // - test or set particular bits in a string + wait :1, // - wait for any child process to die + waitpid :1, // - wait for a particular child process to die + wantarray :1, // - get void vs scalar vs list context of current subroutine call + warn :1, // - print debugging info + when :1, // + write :1, // - print a picture record + y :null}; // - transliterate a string + + var RXstyle="string-2"; + var RXmodifiers=/[goseximacplud]/; // NOTE: "m", "s", "y" and "tr" need to correct real modifiers for each regexp type + + function tokenChain(stream,state,chain,style,tail){ // NOTE: chain.length > 2 is not working now (it's for s[...][...]geos;) + state.chain=null; // 12 3tail + state.style=null; + state.tail=null; + state.tokenize=function(stream,state){ + var e=false,c,i=0; + while(c=stream.next()){ + if(c===chain[i]&&!e){ + if(chain[++i]!==undefined){ + state.chain=chain[i]; + state.style=style; + state.tail=tail;} + else if(tail) + stream.eatWhile(tail); + state.tokenize=tokenPerl; + return style;} + e=!e&&c=="\\";} + return style;}; + return state.tokenize(stream,state);} + + function tokenSOMETHING(stream,state,string){ + state.tokenize=function(stream,state){ + if(stream.string==string) + state.tokenize=tokenPerl; + stream.skipToEnd(); + return "string";}; + return state.tokenize(stream,state);} + + function tokenPerl(stream,state){ + if(stream.eatSpace()) + return null; + if(state.chain) + return tokenChain(stream,state,state.chain,state.style,state.tail); + if(stream.match(/^\-?[\d\.]/,false)) + if(stream.match(/^(\-?(\d*\.\d+(e[+-]?\d+)?|\d+\.\d*)|0x[\da-fA-F]+|0b[01]+|\d+(e[+-]?\d+)?)/)) + return 'number'; + if(stream.match(/^<<(?=\w)/)){ // NOTE: <<SOMETHING\n...\nSOMETHING\n + stream.eatWhile(/\w/); + return tokenSOMETHING(stream,state,stream.current().substr(2));} + if(stream.sol()&&stream.match(/^\=item(?!\w)/)){// NOTE: \n=item...\n=cut\n + return tokenSOMETHING(stream,state,'=cut');} + var ch=stream.next(); + if(ch=='"'||ch=="'"){ // NOTE: ' or " or <<'SOMETHING'\n...\nSOMETHING\n or <<"SOMETHING"\n...\nSOMETHING\n + if(prefix(stream, 3)=="<<"+ch){ + var p=stream.pos; + stream.eatWhile(/\w/); + var n=stream.current().substr(1); + if(n&&stream.eat(ch)) + return tokenSOMETHING(stream,state,n); + stream.pos=p;} + return tokenChain(stream,state,[ch],"string");} + if(ch=="q"){ + var c=look(stream, -2); + if(!(c&&/\w/.test(c))){ + c=look(stream, 0); + if(c=="x"){ + c=look(stream, 1); + if(c=="("){ + eatSuffix(stream, 2); + return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);} + if(c=="["){ + eatSuffix(stream, 2); + return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);} + if(c=="{"){ + eatSuffix(stream, 2); + return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);} + if(c=="<"){ + eatSuffix(stream, 2); + return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);} + if(/[\^'"!~\/]/.test(c)){ + eatSuffix(stream, 1); + return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers);}} + else if(c=="q"){ + c=look(stream, 1); + if(c=="("){ + eatSuffix(stream, 2); + return tokenChain(stream,state,[")"],"string");} + if(c=="["){ + eatSuffix(stream, 2); + return tokenChain(stream,state,["]"],"string");} + if(c=="{"){ + eatSuffix(stream, 2); + return tokenChain(stream,state,["}"],"string");} + if(c=="<"){ + eatSuffix(stream, 2); + return tokenChain(stream,state,[">"],"string");} + if(/[\^'"!~\/]/.test(c)){ + eatSuffix(stream, 1); + return tokenChain(stream,state,[stream.eat(c)],"string");}} + else if(c=="w"){ + c=look(stream, 1); + if(c=="("){ + eatSuffix(stream, 2); + return tokenChain(stream,state,[")"],"bracket");} + if(c=="["){ + eatSuffix(stream, 2); + return tokenChain(stream,state,["]"],"bracket");} + if(c=="{"){ + eatSuffix(stream, 2); + return tokenChain(stream,state,["}"],"bracket");} + if(c=="<"){ + eatSuffix(stream, 2); + return tokenChain(stream,state,[">"],"bracket");} + if(/[\^'"!~\/]/.test(c)){ + eatSuffix(stream, 1); + return tokenChain(stream,state,[stream.eat(c)],"bracket");}} + else if(c=="r"){ + c=look(stream, 1); + if(c=="("){ + eatSuffix(stream, 2); + return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);} + if(c=="["){ + eatSuffix(stream, 2); + return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);} + if(c=="{"){ + eatSuffix(stream, 2); + return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);} + if(c=="<"){ + eatSuffix(stream, 2); + return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);} + if(/[\^'"!~\/]/.test(c)){ + eatSuffix(stream, 1); + return tokenChain(stream,state,[stream.eat(c)],RXstyle,RXmodifiers);}} + else if(/[\^'"!~\/(\[{<]/.test(c)){ + if(c=="("){ + eatSuffix(stream, 1); + return tokenChain(stream,state,[")"],"string");} + if(c=="["){ + eatSuffix(stream, 1); + return tokenChain(stream,state,["]"],"string");} + if(c=="{"){ + eatSuffix(stream, 1); + return tokenChain(stream,state,["}"],"string");} + if(c=="<"){ + eatSuffix(stream, 1); + return tokenChain(stream,state,[">"],"string");} + if(/[\^'"!~\/]/.test(c)){ + return tokenChain(stream,state,[stream.eat(c)],"string");}}}} + if(ch=="m"){ + var c=look(stream, -2); + if(!(c&&/\w/.test(c))){ + c=stream.eat(/[(\[{<\^'"!~\/]/); + if(c){ + if(/[\^'"!~\/]/.test(c)){ + return tokenChain(stream,state,[c],RXstyle,RXmodifiers);} + if(c=="("){ + return tokenChain(stream,state,[")"],RXstyle,RXmodifiers);} + if(c=="["){ + return tokenChain(stream,state,["]"],RXstyle,RXmodifiers);} + if(c=="{"){ + return tokenChain(stream,state,["}"],RXstyle,RXmodifiers);} + if(c=="<"){ + return tokenChain(stream,state,[">"],RXstyle,RXmodifiers);}}}} + if(ch=="s"){ + var c=/[\/>\]})\w]/.test(look(stream, -2)); + if(!c){ + c=stream.eat(/[(\[{<\^'"!~\/]/); + if(c){ + if(c=="[") + return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers); + if(c=="{") + return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers); + if(c=="<") + return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers); + if(c=="(") + return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers); + return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}} + if(ch=="y"){ + var c=/[\/>\]})\w]/.test(look(stream, -2)); + if(!c){ + c=stream.eat(/[(\[{<\^'"!~\/]/); + if(c){ + if(c=="[") + return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers); + if(c=="{") + return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers); + if(c=="<") + return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers); + if(c=="(") + return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers); + return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}} + if(ch=="t"){ + var c=/[\/>\]})\w]/.test(look(stream, -2)); + if(!c){ + c=stream.eat("r");if(c){ + c=stream.eat(/[(\[{<\^'"!~\/]/); + if(c){ + if(c=="[") + return tokenChain(stream,state,["]","]"],RXstyle,RXmodifiers); + if(c=="{") + return tokenChain(stream,state,["}","}"],RXstyle,RXmodifiers); + if(c=="<") + return tokenChain(stream,state,[">",">"],RXstyle,RXmodifiers); + if(c=="(") + return tokenChain(stream,state,[")",")"],RXstyle,RXmodifiers); + return tokenChain(stream,state,[c,c],RXstyle,RXmodifiers);}}}} + if(ch=="`"){ + return tokenChain(stream,state,[ch],"variable-2");} + if(ch=="/"){ + if(!/~\s*$/.test(prefix(stream))) + return "operator"; + else + return tokenChain(stream,state,[ch],RXstyle,RXmodifiers);} + if(ch=="$"){ + var p=stream.pos; + if(stream.eatWhile(/\d/)||stream.eat("{")&&stream.eatWhile(/\d/)&&stream.eat("}")) + return "variable-2"; + else + stream.pos=p;} + if(/[$@%]/.test(ch)){ + var p=stream.pos; + if(stream.eat("^")&&stream.eat(/[A-Z]/)||!/[@$%&]/.test(look(stream, -2))&&stream.eat(/[=|\\\-#?@;:&`~\^!\[\]*'"$+.,\/<>()]/)){ + var c=stream.current(); + if(PERL[c]) + return "variable-2";} + stream.pos=p;} + if(/[$@%&]/.test(ch)){ + if(stream.eatWhile(/[\w$\[\]]/)||stream.eat("{")&&stream.eatWhile(/[\w$\[\]]/)&&stream.eat("}")){ + var c=stream.current(); + if(PERL[c]) + return "variable-2"; + else + return "variable";}} + if(ch=="#"){ + if(look(stream, -2)!="$"){ + stream.skipToEnd(); + return "comment";}} + if(/[:+\-\^*$&%@=<>!?|\/~\.]/.test(ch)){ + var p=stream.pos; + stream.eatWhile(/[:+\-\^*$&%@=<>!?|\/~\.]/); + if(PERL[stream.current()]) + return "operator"; + else + stream.pos=p;} + if(ch=="_"){ + if(stream.pos==1){ + if(suffix(stream, 6)=="_END__"){ + return tokenChain(stream,state,['\0'],"comment");} + else if(suffix(stream, 7)=="_DATA__"){ + return tokenChain(stream,state,['\0'],"variable-2");} + else if(suffix(stream, 7)=="_C__"){ + return tokenChain(stream,state,['\0'],"string");}}} + if(/\w/.test(ch)){ + var p=stream.pos; + if(look(stream, -2)=="{"&&(look(stream, 0)=="}"||stream.eatWhile(/\w/)&&look(stream, 0)=="}")) + return "string"; + else + stream.pos=p;} + if(/[A-Z]/.test(ch)){ + var l=look(stream, -2); + var p=stream.pos; + stream.eatWhile(/[A-Z_]/); + if(/[\da-z]/.test(look(stream, 0))){ + stream.pos=p;} + else{ + var c=PERL[stream.current()]; + if(!c) + return "meta"; + if(c[1]) + c=c[0]; + if(l!=":"){ + if(c==1) + return "keyword"; + else if(c==2) + return "def"; + else if(c==3) + return "atom"; + else if(c==4) + return "operator"; + else if(c==5) + return "variable-2"; + else + return "meta";} + else + return "meta";}} + if(/[a-zA-Z_]/.test(ch)){ + var l=look(stream, -2); + stream.eatWhile(/\w/); + var c=PERL[stream.current()]; + if(!c) + return "meta"; + if(c[1]) + c=c[0]; + if(l!=":"){ + if(c==1) + return "keyword"; + else if(c==2) + return "def"; + else if(c==3) + return "atom"; + else if(c==4) + return "operator"; + else if(c==5) + return "variable-2"; + else + return "meta";} + else + return "meta";} + return null;} + + return { + startState: function() { + return { + tokenize: tokenPerl, + chain: null, + style: null, + tail: null + }; + }, + token: function(stream, state) { + return (state.tokenize || tokenPerl)(stream, state); + }, + lineComment: '#' + }; +}); + +CodeMirror.registerHelper("wordChars", "perl", /[\w$]/); + +CodeMirror.defineMIME("text/x-perl", "perl"); + +// it's like "peek", but need for look-ahead or look-behind if index < 0 +function look(stream, c){ + return stream.string.charAt(stream.pos+(c||0)); +} + +// return a part of prefix of current stream from current position +function prefix(stream, c){ + if(c){ + var x=stream.pos-c; + return stream.string.substr((x>=0?x:0),c);} + else{ + return stream.string.substr(0,stream.pos-1); + } +} + +// return a part of suffix of current stream from current position +function suffix(stream, c){ + var y=stream.string.length; + var x=y-stream.pos+1; + return stream.string.substr(stream.pos,(c&&c<y?c:x)); +} + +// eating and vomiting a part of stream from current position +function eatSuffix(stream, c){ + var x=stream.pos+c; + var y; + if(x<=0) + stream.pos=0; + else if(x>=(y=stream.string.length-1)) + stream.pos=y; + else + stream.pos=x; +} + +}); diff --git a/cyclone-web/vendor/codeMirror/python.js b/cyclone-web/vendor/codeMirror/python.js new file mode 100644 index 0000000000000000000000000000000000000000..efeed7f15434cc0f23056aeea83b9d869edeef00 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/python.js @@ -0,0 +1,340 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/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 wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b"); + } + + var wordOperators = wordRegexp(["and", "or", "not", "is"]); + var commonKeywords = ["as", "assert", "break", "class", "continue", + "def", "del", "elif", "else", "except", "finally", + "for", "from", "global", "if", "import", + "lambda", "pass", "raise", "return", + "try", "while", "with", "yield", "in"]; + var commonBuiltins = ["abs", "all", "any", "bin", "bool", "bytearray", "callable", "chr", + "classmethod", "compile", "complex", "delattr", "dict", "dir", "divmod", + "enumerate", "eval", "filter", "float", "format", "frozenset", + "getattr", "globals", "hasattr", "hash", "help", "hex", "id", + "input", "int", "isinstance", "issubclass", "iter", "len", + "list", "locals", "map", "max", "memoryview", "min", "next", + "object", "oct", "open", "ord", "pow", "property", "range", + "repr", "reversed", "round", "set", "setattr", "slice", + "sorted", "staticmethod", "str", "sum", "super", "tuple", + "type", "vars", "zip", "__import__", "NotImplemented", + "Ellipsis", "__debug__"]; + CodeMirror.registerHelper("hintWords", "python", commonKeywords.concat(commonBuiltins)); + + function top(state) { + return state.scopes[state.scopes.length - 1]; + } + + CodeMirror.defineMode("python", function(conf, parserConf) { + var ERRORCLASS = "error"; + + var singleDelimiters = parserConf.singleDelimiters || /^[\(\)\[\]\{\}@,:`=;\.]/; + var doubleOperators = parserConf.doubleOperators || /^([!<>]==|<>|<<|>>|\/\/|\*\*)/; + var doubleDelimiters = parserConf.doubleDelimiters || /^(\+=|\-=|\*=|%=|\/=|&=|\|=|\^=)/; + var tripleDelimiters = parserConf.tripleDelimiters || /^(\/\/=|>>=|<<=|\*\*=)/; + + var hangingIndent = parserConf.hangingIndent || conf.indentUnit; + + var myKeywords = commonKeywords, myBuiltins = commonBuiltins; + if (parserConf.extra_keywords != undefined) + myKeywords = myKeywords.concat(parserConf.extra_keywords); + + if (parserConf.extra_builtins != undefined) + myBuiltins = myBuiltins.concat(parserConf.extra_builtins); + + var py3 = !(parserConf.version && Number(parserConf.version) < 3) + if (py3) { + // since http://legacy.python.org/dev/peps/pep-0465/ @ is also an operator + var singleOperators = parserConf.singleOperators || /^[\+\-\*\/%&|\^~<>!@]/; + var identifiers = parserConf.identifiers|| /^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*/; + myKeywords = myKeywords.concat(["nonlocal", "False", "True", "None", "async", "await"]); + myBuiltins = myBuiltins.concat(["ascii", "bytes", "exec", "print"]); + var stringPrefixes = new RegExp("^(([rbuf]|(br))?('{3}|\"{3}|['\"]))", "i"); + } else { + var singleOperators = parserConf.singleOperators || /^[\+\-\*\/%&|\^~<>!]/; + var identifiers = parserConf.identifiers|| /^[_A-Za-z][_A-Za-z0-9]*/; + myKeywords = myKeywords.concat(["exec", "print"]); + myBuiltins = myBuiltins.concat(["apply", "basestring", "buffer", "cmp", "coerce", "execfile", + "file", "intern", "long", "raw_input", "reduce", "reload", + "unichr", "unicode", "xrange", "False", "True", "None"]); + var stringPrefixes = new RegExp("^(([rub]|(ur)|(br))?('{3}|\"{3}|['\"]))", "i"); + } + var keywords = wordRegexp(myKeywords); + var builtins = wordRegexp(myBuiltins); + + // tokenizers + function tokenBase(stream, state) { + if (stream.sol()) state.indent = stream.indentation() + // Handle scope changes + if (stream.sol() && top(state).type == "py") { + var scopeOffset = top(state).offset; + if (stream.eatSpace()) { + var lineOffset = stream.indentation(); + if (lineOffset > scopeOffset) + pushPyScope(state); + else if (lineOffset < scopeOffset && dedent(stream, state)) + state.errorToken = true; + return null; + } else { + var style = tokenBaseInner(stream, state); + if (scopeOffset > 0 && dedent(stream, state)) + style += " " + ERRORCLASS; + return style; + } + } + return tokenBaseInner(stream, state); + } + + function tokenBaseInner(stream, state) { + if (stream.eatSpace()) return null; + + var ch = stream.peek(); + + // Handle Comments + if (ch == "#") { + stream.skipToEnd(); + return "comment"; + } + + // Handle Number Literals + if (stream.match(/^[0-9\.]/, false)) { + var floatLiteral = false; + // Floats + if (stream.match(/^\d*\.\d+(e[\+\-]?\d+)?/i)) { floatLiteral = true; } + if (stream.match(/^\d+\.\d*/)) { floatLiteral = true; } + if (stream.match(/^\.\d+/)) { floatLiteral = true; } + if (floatLiteral) { + // Float literals may be "imaginary" + stream.eat(/J/i); + return "number"; + } + // Integers + var intLiteral = false; + // Hex + if (stream.match(/^0x[0-9a-f]+/i)) intLiteral = true; + // Binary + if (stream.match(/^0b[01]+/i)) intLiteral = true; + // Octal + if (stream.match(/^0o[0-7]+/i)) intLiteral = true; + // Decimal + if (stream.match(/^[1-9]\d*(e[\+\-]?\d+)?/)) { + // Decimal literals may be "imaginary" + stream.eat(/J/i); + // TODO - Can you have imaginary longs? + intLiteral = true; + } + // Zero by itself with no other piece of number. + if (stream.match(/^0(?![\dx])/i)) intLiteral = true; + if (intLiteral) { + // Integer literals may be "long" + stream.eat(/L/i); + return "number"; + } + } + + // Handle Strings + if (stream.match(stringPrefixes)) { + state.tokenize = tokenStringFactory(stream.current()); + return state.tokenize(stream, state); + } + + // Handle operators and Delimiters + if (stream.match(tripleDelimiters) || stream.match(doubleDelimiters)) + return "punctuation"; + + if (stream.match(doubleOperators) || stream.match(singleOperators)) + return "operator"; + + if (stream.match(singleDelimiters)) + return "punctuation"; + + if (state.lastToken == "." && stream.match(identifiers)) + return "property"; + + if (stream.match(keywords) || stream.match(wordOperators)) + return "keyword"; + + if (stream.match(builtins)) + return "builtin"; + + if (stream.match(/^(self|cls)\b/)) + return "variable-2"; + + if (stream.match(identifiers)) { + if (state.lastToken == "def" || state.lastToken == "class") + return "def"; + return "variable"; + } + + // Handle non-detected items + stream.next(); + return ERRORCLASS; + } + + function tokenStringFactory(delimiter) { + while ("rubf".indexOf(delimiter.charAt(0).toLowerCase()) >= 0) + delimiter = delimiter.substr(1); + + var singleline = delimiter.length == 1; + var OUTCLASS = "string"; + + function tokenString(stream, state) { + while (!stream.eol()) { + stream.eatWhile(/[^'"\\]/); + if (stream.eat("\\")) { + stream.next(); + if (singleline && stream.eol()) + return OUTCLASS; + } else if (stream.match(delimiter)) { + state.tokenize = tokenBase; + return OUTCLASS; + } else { + stream.eat(/['"]/); + } + } + if (singleline) { + if (parserConf.singleLineStringErrors) + return ERRORCLASS; + else + state.tokenize = tokenBase; + } + return OUTCLASS; + } + tokenString.isString = true; + return tokenString; + } + + function pushPyScope(state) { + while (top(state).type != "py") state.scopes.pop() + state.scopes.push({offset: top(state).offset + conf.indentUnit, + type: "py", + align: null}) + } + + function pushBracketScope(stream, state, type) { + var align = stream.match(/^([\s\[\{\(]|#.*)*$/, false) ? null : stream.column() + 1 + state.scopes.push({offset: state.indent + hangingIndent, + type: type, + align: align}) + } + + function dedent(stream, state) { + var indented = stream.indentation(); + while (state.scopes.length > 1 && top(state).offset > indented) { + if (top(state).type != "py") return true; + state.scopes.pop(); + } + return top(state).offset != indented; + } + + function tokenLexer(stream, state) { + if (stream.sol()) state.beginningOfLine = true; + + var style = state.tokenize(stream, state); + var current = stream.current(); + + // Handle decorators + if (state.beginningOfLine && current == "@") + return stream.match(identifiers, false) ? "meta" : py3 ? "operator" : ERRORCLASS; + + if (/\S/.test(current)) state.beginningOfLine = false; + + if ((style == "variable" || style == "builtin") + && state.lastToken == "meta") + style = "meta"; + + // Handle scope changes. + if (current == "pass" || current == "return") + state.dedent += 1; + + if (current == "lambda") state.lambda = true; + if (current == ":" && !state.lambda && top(state).type == "py") + pushPyScope(state); + + var delimiter_index = current.length == 1 ? "[({".indexOf(current) : -1; + if (delimiter_index != -1) + pushBracketScope(stream, state, "])}".slice(delimiter_index, delimiter_index+1)); + + delimiter_index = "])}".indexOf(current); + if (delimiter_index != -1) { + if (top(state).type == current) state.indent = state.scopes.pop().offset - hangingIndent + else return ERRORCLASS; + } + if (state.dedent > 0 && stream.eol() && top(state).type == "py") { + if (state.scopes.length > 1) state.scopes.pop(); + state.dedent -= 1; + } + + return style; + } + + var external = { + startState: function(basecolumn) { + return { + tokenize: tokenBase, + scopes: [{offset: basecolumn || 0, type: "py", align: null}], + indent: basecolumn || 0, + lastToken: null, + lambda: false, + dedent: 0 + }; + }, + + token: function(stream, state) { + var addErr = state.errorToken; + if (addErr) state.errorToken = false; + var style = tokenLexer(stream, state); + + if (style && style != "comment") + state.lastToken = (style == "keyword" || style == "punctuation") ? stream.current() : style; + if (style == "punctuation") style = null; + + if (stream.eol() && state.lambda) + state.lambda = false; + return addErr ? style + " " + ERRORCLASS : style; + }, + + indent: function(state, textAfter) { + if (state.tokenize != tokenBase) + return state.tokenize.isString ? CodeMirror.Pass : 0; + + var scope = top(state), closing = scope.type == textAfter.charAt(0) + if (scope.align != null) + return scope.align - (closing ? 1 : 0) + else + return scope.offset - (closing ? hangingIndent : 0) + }, + + electricInput: /^\s*[\}\]\)]$/, + closeBrackets: {triples: "'\""}, + lineComment: "#", + fold: "indent" + }; + return external; + }); + + CodeMirror.defineMIME("text/x-python", "python"); + + var words = function(str) { return str.split(" "); }; + + CodeMirror.defineMIME("text/x-cython", { + name: "python", + extra_keywords: words("by cdef cimport cpdef ctypedef enum except"+ + "extern gil include nogil property public"+ + "readonly struct union DEF IF ELIF ELSE") + }); + +}); diff --git a/cyclone-web/vendor/codeMirror/search/jump-to-line.js b/cyclone-web/vendor/codeMirror/search/jump-to-line.js new file mode 100644 index 0000000000000000000000000000000000000000..8b599cbc176b95cda99ead58bf2c704b0d8c7d5a --- /dev/null +++ b/cyclone-web/vendor/codeMirror/search/jump-to-line.js @@ -0,0 +1,49 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +// Defines jumpToLine command. Uses dialog.js if present. + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("../dialog/dialog")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "../dialog/dialog"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + function dialog(cm, text, shortText, deflt, f) { + if (cm.openDialog) cm.openDialog(text, f, {value: deflt, selectValueOnOpen: true}); + else f(prompt(shortText, deflt)); + } + + var jumpDialog = + 'Jump to line: <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">(Use line:column or scroll% syntax)</span>'; + + function interpretLine(cm, string) { + var num = Number(string) + if (/^[-+]/.test(string)) return cm.getCursor().line + num + else return num - 1 + } + + CodeMirror.commands.jumpToLine = function(cm) { + var cur = cm.getCursor(); + dialog(cm, jumpDialog, "Jump to line:", (cur.line + 1) + ":" + cur.ch, function(posStr) { + if (!posStr) return; + + var match; + if (match = /^\s*([\+\-]?\d+)\s*\:\s*(\d+)\s*$/.exec(posStr)) { + cm.setCursor(interpretLine(cm, match[1]), Number(match[2])) + } else if (match = /^\s*([\+\-]?\d+(\.\d+)?)\%\s*/.exec(posStr)) { + var line = Math.round(cm.lineCount() * Number(match[1]) / 100); + if (/^[-+]/.test(match[1])) line = cur.line + line + 1; + cm.setCursor(line - 1, cur.ch); + } else if (match = /^\s*\:?\s*([\+\-]?\d+)\s*/.exec(posStr)) { + cm.setCursor(interpretLine(cm, match[1]), cur.ch); + } + }); + }; + + CodeMirror.keyMap["default"]["Alt-G"] = "jumpToLine"; +}); diff --git a/cyclone-web/vendor/codeMirror/search/match-highlighter.js b/cyclone-web/vendor/codeMirror/search/match-highlighter.js new file mode 100644 index 0000000000000000000000000000000000000000..73ba0e0537090815be9ac6c7aeb3deff264d3a6d --- /dev/null +++ b/cyclone-web/vendor/codeMirror/search/match-highlighter.js @@ -0,0 +1,165 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +// Highlighting text that matches the selection +// +// Defines an option highlightSelectionMatches, which, when enabled, +// will style strings that match the selection throughout the +// document. +// +// The option can be set to true to simply enable it, or to a +// {minChars, style, wordsOnly, showToken, delay} object to explicitly +// configure it. minChars is the minimum amount of characters that should be +// selected for the behavior to occur, and style is the token style to +// apply to the matches. This will be prefixed by "cm-" to create an +// actual CSS class name. If wordsOnly is enabled, the matches will be +// highlighted only if the selected text is a word. showToken, when enabled, +// will cause the current token to be highlighted when nothing is selected. +// delay is used to specify how much time to wait, in milliseconds, before +// highlighting the matches. If annotateScrollbar is enabled, the occurences +// will be highlighted on the scrollbar via the matchesonscrollbar addon. + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("./matchesonscrollbar")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "./matchesonscrollbar"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + var defaults = { + style: "matchhighlight", + minChars: 2, + delay: 100, + wordsOnly: false, + annotateScrollbar: false, + showToken: false, + trim: true + } + + function State(options) { + this.options = {} + for (var name in defaults) + this.options[name] = (options && options.hasOwnProperty(name) ? options : defaults)[name] + this.overlay = this.timeout = null; + this.matchesonscroll = null; + this.active = false; + } + + CodeMirror.defineOption("highlightSelectionMatches", false, function(cm, val, old) { + if (old && old != CodeMirror.Init) { + removeOverlay(cm); + clearTimeout(cm.state.matchHighlighter.timeout); + cm.state.matchHighlighter = null; + cm.off("cursorActivity", cursorActivity); + cm.off("focus", onFocus) + } + if (val) { + var state = cm.state.matchHighlighter = new State(val); + if (cm.hasFocus()) { + state.active = true + highlightMatches(cm) + } else { + cm.on("focus", onFocus) + } + cm.on("cursorActivity", cursorActivity); + } + }); + + function cursorActivity(cm) { + var state = cm.state.matchHighlighter; + if (state.active || cm.hasFocus()) scheduleHighlight(cm, state) + } + + function onFocus(cm) { + var state = cm.state.matchHighlighter + if (!state.active) { + state.active = true + scheduleHighlight(cm, state) + } + } + + function scheduleHighlight(cm, state) { + clearTimeout(state.timeout); + state.timeout = setTimeout(function() {highlightMatches(cm);}, state.options.delay); + } + + function addOverlay(cm, query, hasBoundary, style) { + var state = cm.state.matchHighlighter; + cm.addOverlay(state.overlay = makeOverlay(query, hasBoundary, style)); + if (state.options.annotateScrollbar && cm.showMatchesOnScrollbar) { + var searchFor = hasBoundary ? new RegExp("\\b" + query + "\\b") : query; + state.matchesonscroll = cm.showMatchesOnScrollbar(searchFor, false, + {className: "CodeMirror-selection-highlight-scrollbar"}); + } + } + + function removeOverlay(cm) { + var state = cm.state.matchHighlighter; + if (state.overlay) { + cm.removeOverlay(state.overlay); + state.overlay = null; + if (state.matchesonscroll) { + state.matchesonscroll.clear(); + state.matchesonscroll = null; + } + } + } + + function highlightMatches(cm) { + cm.operation(function() { + var state = cm.state.matchHighlighter; + removeOverlay(cm); + if (!cm.somethingSelected() && state.options.showToken) { + var re = state.options.showToken === true ? /[\w$]/ : state.options.showToken; + var cur = cm.getCursor(), line = cm.getLine(cur.line), start = cur.ch, end = start; + while (start && re.test(line.charAt(start - 1))) --start; + while (end < line.length && re.test(line.charAt(end))) ++end; + if (start < end) + addOverlay(cm, line.slice(start, end), re, state.options.style); + return; + } + var from = cm.getCursor("from"), to = cm.getCursor("to"); + if (from.line != to.line) return; + if (state.options.wordsOnly && !isWord(cm, from, to)) return; + var selection = cm.getRange(from, to) + if (state.options.trim) selection = selection.replace(/^\s+|\s+$/g, "") + if (selection.length >= state.options.minChars) + addOverlay(cm, selection, false, state.options.style); + }); + } + + function isWord(cm, from, to) { + var str = cm.getRange(from, to); + if (str.match(/^\w+$/) !== null) { + if (from.ch > 0) { + var pos = {line: from.line, ch: from.ch - 1}; + var chr = cm.getRange(pos, from); + if (chr.match(/\W/) === null) return false; + } + if (to.ch < cm.getLine(from.line).length) { + var pos = {line: to.line, ch: to.ch + 1}; + var chr = cm.getRange(to, pos); + if (chr.match(/\W/) === null) return false; + } + return true; + } else return false; + } + + function boundariesAround(stream, re) { + return (!stream.start || !re.test(stream.string.charAt(stream.start - 1))) && + (stream.pos == stream.string.length || !re.test(stream.string.charAt(stream.pos))); + } + + function makeOverlay(query, hasBoundary, style) { + return {token: function(stream) { + if (stream.match(query) && + (!hasBoundary || boundariesAround(stream, hasBoundary))) + return style; + stream.next(); + stream.skipTo(query.charAt(0)) || stream.skipToEnd(); + }}; + } +}); diff --git a/cyclone-web/vendor/codeMirror/search/matchesonscrollbar.css b/cyclone-web/vendor/codeMirror/search/matchesonscrollbar.css new file mode 100644 index 0000000000000000000000000000000000000000..77932cc9081a3e0d3334afd2c609ddaa4e904480 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/search/matchesonscrollbar.css @@ -0,0 +1,8 @@ +.CodeMirror-search-match { + background: gold; + border-top: 1px solid orange; + border-bottom: 1px solid orange; + -moz-box-sizing: border-box; + box-sizing: border-box; + opacity: .5; +} diff --git a/cyclone-web/vendor/codeMirror/search/matchesonscrollbar.js b/cyclone-web/vendor/codeMirror/search/matchesonscrollbar.js new file mode 100644 index 0000000000000000000000000000000000000000..8d1922897116c9b78ec3547db4d836b1c44b0861 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/search/matchesonscrollbar.js @@ -0,0 +1,97 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("./searchcursor"), require("../scroll/annotatescrollbar")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "./searchcursor", "../scroll/annotatescrollbar"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + CodeMirror.defineExtension("showMatchesOnScrollbar", function(query, caseFold, options) { + if (typeof options == "string") options = {className: options}; + if (!options) options = {}; + return new SearchAnnotation(this, query, caseFold, options); + }); + + function SearchAnnotation(cm, query, caseFold, options) { + this.cm = cm; + this.options = options; + var annotateOptions = {listenForChanges: false}; + for (var prop in options) annotateOptions[prop] = options[prop]; + if (!annotateOptions.className) annotateOptions.className = "CodeMirror-search-match"; + this.annotation = cm.annotateScrollbar(annotateOptions); + this.query = query; + this.caseFold = caseFold; + this.gap = {from: cm.firstLine(), to: cm.lastLine() + 1}; + this.matches = []; + this.update = null; + + this.findMatches(); + this.annotation.update(this.matches); + + var self = this; + cm.on("change", this.changeHandler = function(_cm, change) { self.onChange(change); }); + } + + var MAX_MATCHES = 1000; + + SearchAnnotation.prototype.findMatches = function() { + if (!this.gap) return; + for (var i = 0; i < this.matches.length; i++) { + var match = this.matches[i]; + if (match.from.line >= this.gap.to) break; + if (match.to.line >= this.gap.from) this.matches.splice(i--, 1); + } + var cursor = this.cm.getSearchCursor(this.query, CodeMirror.Pos(this.gap.from, 0), this.caseFold); + var maxMatches = this.options && this.options.maxMatches || MAX_MATCHES; + while (cursor.findNext()) { + var match = {from: cursor.from(), to: cursor.to()}; + if (match.from.line >= this.gap.to) break; + this.matches.splice(i++, 0, match); + if (this.matches.length > maxMatches) break; + } + this.gap = null; + }; + + function offsetLine(line, changeStart, sizeChange) { + if (line <= changeStart) return line; + return Math.max(changeStart, line + sizeChange); + } + + SearchAnnotation.prototype.onChange = function(change) { + var startLine = change.from.line; + var endLine = CodeMirror.changeEnd(change).line; + var sizeChange = endLine - change.to.line; + if (this.gap) { + this.gap.from = Math.min(offsetLine(this.gap.from, startLine, sizeChange), change.from.line); + this.gap.to = Math.max(offsetLine(this.gap.to, startLine, sizeChange), change.from.line); + } else { + this.gap = {from: change.from.line, to: endLine + 1}; + } + + if (sizeChange) for (var i = 0; i < this.matches.length; i++) { + var match = this.matches[i]; + var newFrom = offsetLine(match.from.line, startLine, sizeChange); + if (newFrom != match.from.line) match.from = CodeMirror.Pos(newFrom, match.from.ch); + var newTo = offsetLine(match.to.line, startLine, sizeChange); + if (newTo != match.to.line) match.to = CodeMirror.Pos(newTo, match.to.ch); + } + clearTimeout(this.update); + var self = this; + this.update = setTimeout(function() { self.updateAfterChange(); }, 250); + }; + + SearchAnnotation.prototype.updateAfterChange = function() { + this.findMatches(); + this.annotation.update(this.matches); + }; + + SearchAnnotation.prototype.clear = function() { + this.cm.off("change", this.changeHandler); + this.annotation.clear(); + }; +}); diff --git a/cyclone-web/vendor/codeMirror/search/search.js b/cyclone-web/vendor/codeMirror/search/search.js new file mode 100644 index 0000000000000000000000000000000000000000..99c87e2ef71aa05b34ea416512747da05c431b05 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/search/search.js @@ -0,0 +1,252 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +// Define search commands. Depends on dialog.js or another +// implementation of the openDialog method. + +// Replace works a little oddly -- it will do the replace on the next +// Ctrl-G (or whatever is bound to findNext) press. You prevent a +// replace by making sure the match is no longer selected when hitting +// Ctrl-G. + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror"), require("./searchcursor"), require("../dialog/dialog")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror", "./searchcursor", "../dialog/dialog"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + function searchOverlay(query, caseInsensitive) { + if (typeof query == "string") + query = new RegExp(query.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"), caseInsensitive ? "gi" : "g"); + else if (!query.global) + query = new RegExp(query.source, query.ignoreCase ? "gi" : "g"); + + return {token: function(stream) { + query.lastIndex = stream.pos; + var match = query.exec(stream.string); + if (match && match.index == stream.pos) { + stream.pos += match[0].length || 1; + return "searching"; + } else if (match) { + stream.pos = match.index; + } else { + stream.skipToEnd(); + } + }}; + } + + function SearchState() { + this.posFrom = this.posTo = this.lastQuery = this.query = null; + this.overlay = null; + } + + function getSearchState(cm) { + return cm.state.search || (cm.state.search = new SearchState()); + } + + function queryCaseInsensitive(query) { + return typeof query == "string" && query == query.toLowerCase(); + } + + function getSearchCursor(cm, query, pos) { + // Heuristic: if the query string is all lowercase, do a case insensitive search. + return cm.getSearchCursor(query, pos, queryCaseInsensitive(query)); + } + + function persistentDialog(cm, text, deflt, onEnter, onKeyDown) { + cm.openDialog(text, onEnter, { + value: deflt, + selectValueOnOpen: true, + closeOnEnter: false, + onClose: function() { clearSearch(cm); }, + onKeyDown: onKeyDown + }); + } + + function dialog(cm, text, shortText, deflt, f) { + if (cm.openDialog) cm.openDialog(text, f, {value: deflt, selectValueOnOpen: true}); + else f(prompt(shortText, deflt)); + } + + function confirmDialog(cm, text, shortText, fs) { + if (cm.openConfirm) cm.openConfirm(text, fs); + else if (confirm(shortText)) fs[0](); + } + + function parseString(string) { + return string.replace(/\\(.)/g, function(_, ch) { + if (ch == "n") return "\n" + if (ch == "r") return "\r" + return ch + }) + } + + function parseQuery(query) { + var isRE = query.match(/^\/(.*)\/([a-z]*)$/); + if (isRE) { + try { query = new RegExp(isRE[1], isRE[2].indexOf("i") == -1 ? "" : "i"); } + catch(e) {} // Not a regular expression after all, do a string search + } else { + query = parseString(query) + } + if (typeof query == "string" ? query == "" : query.test("")) + query = /x^/; + return query; + } + + var queryDialog = + '<span class="CodeMirror-search-label">Search:</span> <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">(Use /re/ syntax for regexp search)</span>'; + + function startSearch(cm, state, query) { + state.queryText = query; + state.query = parseQuery(query); + cm.removeOverlay(state.overlay, queryCaseInsensitive(state.query)); + state.overlay = searchOverlay(state.query, queryCaseInsensitive(state.query)); + cm.addOverlay(state.overlay); + if (cm.showMatchesOnScrollbar) { + if (state.annotate) { state.annotate.clear(); state.annotate = null; } + state.annotate = cm.showMatchesOnScrollbar(state.query, queryCaseInsensitive(state.query)); + } + } + + function doSearch(cm, rev, persistent, immediate) { + var state = getSearchState(cm); + if (state.query) return findNext(cm, rev); + var q = cm.getSelection() || state.lastQuery; + if (persistent && cm.openDialog) { + var hiding = null + var searchNext = function(query, event) { + CodeMirror.e_stop(event); + if (!query) return; + if (query != state.queryText) { + startSearch(cm, state, query); + state.posFrom = state.posTo = cm.getCursor(); + } + if (hiding) hiding.style.opacity = 1 + findNext(cm, event.shiftKey, function(_, to) { + var dialog + if (to.line < 3 && document.querySelector && + (dialog = cm.display.wrapper.querySelector(".CodeMirror-dialog")) && + dialog.getBoundingClientRect().bottom - 4 > cm.cursorCoords(to, "window").top) + (hiding = dialog).style.opacity = .4 + }) + }; + persistentDialog(cm, queryDialog, q, searchNext, function(event, query) { + var keyName = CodeMirror.keyName(event) + var cmd = CodeMirror.keyMap[cm.getOption("keyMap")][keyName] + if (!cmd) cmd = cm.getOption('extraKeys')[keyName] + if (cmd == "findNext" || cmd == "findPrev" || + cmd == "findPersistentNext" || cmd == "findPersistentPrev") { + CodeMirror.e_stop(event); + startSearch(cm, getSearchState(cm), query); + cm.execCommand(cmd); + } else if (cmd == "find" || cmd == "findPersistent") { + CodeMirror.e_stop(event); + searchNext(query, event); + } + }); + if (immediate && q) { + startSearch(cm, state, q); + findNext(cm, rev); + } + } else { + dialog(cm, queryDialog, "Search for:", q, function(query) { + if (query && !state.query) cm.operation(function() { + startSearch(cm, state, query); + state.posFrom = state.posTo = cm.getCursor(); + findNext(cm, rev); + }); + }); + } + } + + function findNext(cm, rev, callback) {cm.operation(function() { + var state = getSearchState(cm); + var cursor = getSearchCursor(cm, state.query, rev ? state.posFrom : state.posTo); + if (!cursor.find(rev)) { + cursor = getSearchCursor(cm, state.query, rev ? CodeMirror.Pos(cm.lastLine()) : CodeMirror.Pos(cm.firstLine(), 0)); + if (!cursor.find(rev)) return; + } + cm.setSelection(cursor.from(), cursor.to()); + cm.scrollIntoView({from: cursor.from(), to: cursor.to()}, 20); + state.posFrom = cursor.from(); state.posTo = cursor.to(); + if (callback) callback(cursor.from(), cursor.to()) + });} + + function clearSearch(cm) {cm.operation(function() { + var state = getSearchState(cm); + state.lastQuery = state.query; + if (!state.query) return; + state.query = state.queryText = null; + cm.removeOverlay(state.overlay); + if (state.annotate) { state.annotate.clear(); state.annotate = null; } + });} + + var replaceQueryDialog = + ' <input type="text" style="width: 10em" class="CodeMirror-search-field"/> <span style="color: #888" class="CodeMirror-search-hint">(Use /re/ syntax for regexp search)</span>'; + var replacementQueryDialog = '<span class="CodeMirror-search-label">With:</span> <input type="text" style="width: 10em" class="CodeMirror-search-field"/>'; + var doReplaceConfirm = '<span class="CodeMirror-search-label">Replace?</span> <button>Yes</button> <button>No</button> <button>All</button> <button>Stop</button>'; + + function replaceAll(cm, query, text) { + cm.operation(function() { + for (var cursor = getSearchCursor(cm, query); cursor.findNext();) { + if (typeof query != "string") { + var match = cm.getRange(cursor.from(), cursor.to()).match(query); + cursor.replace(text.replace(/\$(\d)/g, function(_, i) {return match[i];})); + } else cursor.replace(text); + } + }); + } + + function replace(cm, all) { + if (cm.getOption("readOnly")) return; + var query = cm.getSelection() || getSearchState(cm).lastQuery; + var dialogText = '<span class="CodeMirror-search-label">' + (all ? 'Replace all:' : 'Replace:') + '</span>'; + dialog(cm, dialogText + replaceQueryDialog, dialogText, query, function(query) { + if (!query) return; + query = parseQuery(query); + dialog(cm, replacementQueryDialog, "Replace with:", "", function(text) { + text = parseString(text) + if (all) { + replaceAll(cm, query, text) + } else { + clearSearch(cm); + var cursor = getSearchCursor(cm, query, cm.getCursor("from")); + var advance = function() { + var start = cursor.from(), match; + if (!(match = cursor.findNext())) { + cursor = getSearchCursor(cm, query); + if (!(match = cursor.findNext()) || + (start && cursor.from().line == start.line && cursor.from().ch == start.ch)) return; + } + cm.setSelection(cursor.from(), cursor.to()); + cm.scrollIntoView({from: cursor.from(), to: cursor.to()}); + confirmDialog(cm, doReplaceConfirm, "Replace?", + [function() {doReplace(match);}, advance, + function() {replaceAll(cm, query, text)}]); + }; + var doReplace = function(match) { + cursor.replace(typeof query == "string" ? text : + text.replace(/\$(\d)/g, function(_, i) {return match[i];})); + advance(); + }; + advance(); + } + }); + }); + } + + CodeMirror.commands.find = function(cm) {clearSearch(cm); doSearch(cm);}; + CodeMirror.commands.findPersistent = function(cm) {clearSearch(cm); doSearch(cm, false, true);}; + CodeMirror.commands.findPersistentNext = function(cm) {doSearch(cm, false, true, true);}; + CodeMirror.commands.findPersistentPrev = function(cm) {doSearch(cm, true, true, true);}; + CodeMirror.commands.findNext = doSearch; + CodeMirror.commands.findPrev = function(cm) {doSearch(cm, true);}; + CodeMirror.commands.clearSearch = clearSearch; + CodeMirror.commands.replace = replace; + CodeMirror.commands.replaceAll = function(cm) {replace(cm, true);}; +}); diff --git a/cyclone-web/vendor/codeMirror/search/searchcursor.js b/cyclone-web/vendor/codeMirror/search/searchcursor.js new file mode 100644 index 0000000000000000000000000000000000000000..b70242ee4b8cf1b698e58be59fd4a4cd05065005 --- /dev/null +++ b/cyclone-web/vendor/codeMirror/search/searchcursor.js @@ -0,0 +1,189 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/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 Pos = CodeMirror.Pos; + + function SearchCursor(doc, query, pos, caseFold) { + this.atOccurrence = false; this.doc = doc; + if (caseFold == null && typeof query == "string") caseFold = false; + + pos = pos ? doc.clipPos(pos) : Pos(0, 0); + this.pos = {from: pos, to: pos}; + + // The matches method is filled in based on the type of query. + // It takes a position and a direction, and returns an object + // describing the next occurrence of the query, or null if no + // more matches were found. + if (typeof query != "string") { // Regexp match + if (!query.global) query = new RegExp(query.source, query.ignoreCase ? "ig" : "g"); + this.matches = function(reverse, pos) { + if (reverse) { + query.lastIndex = 0; + var line = doc.getLine(pos.line).slice(0, pos.ch), cutOff = 0, match, start; + for (;;) { + query.lastIndex = cutOff; + var newMatch = query.exec(line); + if (!newMatch) break; + match = newMatch; + start = match.index; + cutOff = match.index + (match[0].length || 1); + if (cutOff == line.length) break; + } + var matchLen = (match && match[0].length) || 0; + if (!matchLen) { + if (start == 0 && line.length == 0) {match = undefined;} + else if (start != doc.getLine(pos.line).length) { + matchLen++; + } + } + } else { + query.lastIndex = pos.ch; + var line = doc.getLine(pos.line), match = query.exec(line); + var matchLen = (match && match[0].length) || 0; + var start = match && match.index; + if (start + matchLen != line.length && !matchLen) matchLen = 1; + } + if (match && matchLen) + return {from: Pos(pos.line, start), + to: Pos(pos.line, start + matchLen), + match: match}; + }; + } else { // String query + var origQuery = query; + if (caseFold) query = query.toLowerCase(); + var fold = caseFold ? function(str){return str.toLowerCase();} : function(str){return str;}; + var target = query.split("\n"); + // Different methods for single-line and multi-line queries + if (target.length == 1) { + if (!query.length) { + // Empty string would match anything and never progress, so + // we define it to match nothing instead. + this.matches = function() {}; + } else { + this.matches = function(reverse, pos) { + if (reverse) { + var orig = doc.getLine(pos.line).slice(0, pos.ch), line = fold(orig); + var match = line.lastIndexOf(query); + if (match > -1) { + match = adjustPos(orig, line, match); + return {from: Pos(pos.line, match), to: Pos(pos.line, match + origQuery.length)}; + } + } else { + var orig = doc.getLine(pos.line).slice(pos.ch), line = fold(orig); + var match = line.indexOf(query); + if (match > -1) { + match = adjustPos(orig, line, match) + pos.ch; + return {from: Pos(pos.line, match), to: Pos(pos.line, match + origQuery.length)}; + } + } + }; + } + } else { + var origTarget = origQuery.split("\n"); + this.matches = function(reverse, pos) { + var last = target.length - 1; + if (reverse) { + if (pos.line - (target.length - 1) < doc.firstLine()) return; + if (fold(doc.getLine(pos.line).slice(0, origTarget[last].length)) != target[target.length - 1]) return; + var to = Pos(pos.line, origTarget[last].length); + for (var ln = pos.line - 1, i = last - 1; i >= 1; --i, --ln) + if (target[i] != fold(doc.getLine(ln))) return; + var line = doc.getLine(ln), cut = line.length - origTarget[0].length; + if (fold(line.slice(cut)) != target[0]) return; + return {from: Pos(ln, cut), to: to}; + } else { + if (pos.line + (target.length - 1) > doc.lastLine()) return; + var line = doc.getLine(pos.line), cut = line.length - origTarget[0].length; + if (fold(line.slice(cut)) != target[0]) return; + var from = Pos(pos.line, cut); + for (var ln = pos.line + 1, i = 1; i < last; ++i, ++ln) + if (target[i] != fold(doc.getLine(ln))) return; + if (fold(doc.getLine(ln).slice(0, origTarget[last].length)) != target[last]) return; + return {from: from, to: Pos(ln, origTarget[last].length)}; + } + }; + } + } + } + + SearchCursor.prototype = { + findNext: function() {return this.find(false);}, + findPrevious: function() {return this.find(true);}, + + find: function(reverse) { + var self = this, pos = this.doc.clipPos(reverse ? this.pos.from : this.pos.to); + function savePosAndFail(line) { + var pos = Pos(line, 0); + self.pos = {from: pos, to: pos}; + self.atOccurrence = false; + return false; + } + + for (;;) { + if (this.pos = this.matches(reverse, pos)) { + this.atOccurrence = true; + return this.pos.match || true; + } + if (reverse) { + if (!pos.line) return savePosAndFail(0); + pos = Pos(pos.line-1, this.doc.getLine(pos.line-1).length); + } + else { + var maxLine = this.doc.lineCount(); + if (pos.line == maxLine - 1) return savePosAndFail(maxLine); + pos = Pos(pos.line + 1, 0); + } + } + }, + + from: function() {if (this.atOccurrence) return this.pos.from;}, + to: function() {if (this.atOccurrence) return this.pos.to;}, + + replace: function(newText, origin) { + if (!this.atOccurrence) return; + var lines = CodeMirror.splitLines(newText); + this.doc.replaceRange(lines, this.pos.from, this.pos.to, origin); + this.pos.to = Pos(this.pos.from.line + lines.length - 1, + lines[lines.length - 1].length + (lines.length == 1 ? this.pos.from.ch : 0)); + } + }; + + // Maps a position in a case-folded line back to a position in the original line + // (compensating for codepoints increasing in number during folding) + function adjustPos(orig, folded, pos) { + if (orig.length == folded.length) return pos; + for (var pos1 = Math.min(pos, orig.length);;) { + var len1 = orig.slice(0, pos1).toLowerCase().length; + if (len1 < pos) ++pos1; + else if (len1 > pos) --pos1; + else return pos1; + } + } + + CodeMirror.defineExtension("getSearchCursor", function(query, pos, caseFold) { + return new SearchCursor(this.doc, query, pos, caseFold); + }); + CodeMirror.defineDocExtension("getSearchCursor", function(query, pos, caseFold) { + return new SearchCursor(this, query, pos, caseFold); + }); + + CodeMirror.defineExtension("selectMatches", function(query, caseFold) { + var ranges = []; + var cur = this.getSearchCursor(query, this.getCursor("from"), caseFold); + while (cur.findNext()) { + if (CodeMirror.cmpPos(cur.to(), this.getCursor("to")) > 0) break; + ranges.push({anchor: cur.from(), head: cur.to()}); + } + if (ranges.length) + this.setSelections(ranges, 0); + }); +}); diff --git a/cyclone-web/vendor/codeMirror/searchcursor.js b/cyclone-web/vendor/codeMirror/searchcursor.js new file mode 100644 index 0000000000000000000000000000000000000000..f157ac49dda6f9b87b218cf02d35695c3878b1de --- /dev/null +++ b/cyclone-web/vendor/codeMirror/searchcursor.js @@ -0,0 +1,293 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/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 Pos = CodeMirror.Pos + + function regexpFlags(regexp) { + var flags = regexp.flags + return flags != null ? flags : (regexp.ignoreCase ? "i" : "") + + (regexp.global ? "g" : "") + + (regexp.multiline ? "m" : "") + } + + function ensureFlags(regexp, flags) { + var current = regexpFlags(regexp), target = current + for (var i = 0; i < flags.length; i++) if (target.indexOf(flags.charAt(i)) == -1) + target += flags.charAt(i) + return current == target ? regexp : new RegExp(regexp.source, target) + } + + function maybeMultiline(regexp) { + return /\\s|\\n|\n|\\W|\\D|\[\^/.test(regexp.source) + } + + function searchRegexpForward(doc, regexp, start) { + regexp = ensureFlags(regexp, "g") + for (var line = start.line, ch = start.ch, last = doc.lastLine(); line <= last; line++, ch = 0) { + regexp.lastIndex = ch + var string = doc.getLine(line), match = regexp.exec(string) + if (match) + return {from: Pos(line, match.index), + to: Pos(line, match.index + match[0].length), + match: match} + } + } + + function searchRegexpForwardMultiline(doc, regexp, start) { + if (!maybeMultiline(regexp)) return searchRegexpForward(doc, regexp, start) + + regexp = ensureFlags(regexp, "gm") + var string, chunk = 1 + for (var line = start.line, last = doc.lastLine(); line <= last;) { + // This grows the search buffer in exponentially-sized chunks + // between matches, so that nearby matches are fast and don't + // require concatenating the whole document (in case we're + // searching for something that has tons of matches), but at the + // same time, the amount of retries is limited. + for (var i = 0; i < chunk; i++) { + if (line > last) break + var curLine = doc.getLine(line++) + string = string == null ? curLine : string + "\n" + curLine + } + chunk = chunk * 2 + regexp.lastIndex = start.ch + var match = regexp.exec(string) + if (match) { + var before = string.slice(0, match.index).split("\n"), inside = match[0].split("\n") + var startLine = start.line + before.length - 1, startCh = before[before.length - 1].length + return {from: Pos(startLine, startCh), + to: Pos(startLine + inside.length - 1, + inside.length == 1 ? startCh + inside[0].length : inside[inside.length - 1].length), + match: match} + } + } + } + + function lastMatchIn(string, regexp) { + var cutOff = 0, match + for (;;) { + regexp.lastIndex = cutOff + var newMatch = regexp.exec(string) + if (!newMatch) return match + match = newMatch + cutOff = match.index + (match[0].length || 1) + if (cutOff == string.length) return match + } + } + + function searchRegexpBackward(doc, regexp, start) { + regexp = ensureFlags(regexp, "g") + for (var line = start.line, ch = start.ch, first = doc.firstLine(); line >= first; line--, ch = -1) { + var string = doc.getLine(line) + if (ch > -1) string = string.slice(0, ch) + var match = lastMatchIn(string, regexp) + if (match) + return {from: Pos(line, match.index), + to: Pos(line, match.index + match[0].length), + match: match} + } + } + + function searchRegexpBackwardMultiline(doc, regexp, start) { + regexp = ensureFlags(regexp, "gm") + var string, chunk = 1 + for (var line = start.line, first = doc.firstLine(); line >= first;) { + for (var i = 0; i < chunk; i++) { + var curLine = doc.getLine(line--) + string = string == null ? curLine.slice(0, start.ch) : curLine + "\n" + string + } + chunk *= 2 + + var match = lastMatchIn(string, regexp) + if (match) { + var before = string.slice(0, match.index).split("\n"), inside = match[0].split("\n") + var startLine = line + before.length, startCh = before[before.length - 1].length + return {from: Pos(startLine, startCh), + to: Pos(startLine + inside.length - 1, + inside.length == 1 ? startCh + inside[0].length : inside[inside.length - 1].length), + match: match} + } + } + } + + var doFold, noFold + if (String.prototype.normalize) { + doFold = function(str) { return str.normalize("NFD").toLowerCase() } + noFold = function(str) { return str.normalize("NFD") } + } else { + doFold = function(str) { return str.toLowerCase() } + noFold = function(str) { return str } + } + + // Maps a position in a case-folded line back to a position in the original line + // (compensating for codepoints increasing in number during folding) + function adjustPos(orig, folded, pos, foldFunc) { + if (orig.length == folded.length) return pos + for (var min = 0, max = pos + Math.max(0, orig.length - folded.length);;) { + if (min == max) return min + var mid = (min + max) >> 1 + var len = foldFunc(orig.slice(0, mid)).length + if (len == pos) return mid + else if (len > pos) max = mid + else min = mid + 1 + } + } + + function searchStringForward(doc, query, start, caseFold) { + // Empty string would match anything and never progress, so we + // define it to match nothing instead. + if (!query.length) return null + var fold = caseFold ? doFold : noFold + var lines = fold(query).split(/\r|\n\r?/) + + search: for (var line = start.line, ch = start.ch, last = doc.lastLine() + 1 - lines.length; line <= last; line++, ch = 0) { + var orig = doc.getLine(line).slice(ch), string = fold(orig) + if (lines.length == 1) { + var found = string.indexOf(lines[0]) + if (found == -1) continue search + var start = adjustPos(orig, string, found, fold) + ch + return {from: Pos(line, adjustPos(orig, string, found, fold) + ch), + to: Pos(line, adjustPos(orig, string, found + lines[0].length, fold) + ch)} + } else { + var cutFrom = string.length - lines[0].length + if (string.slice(cutFrom) != lines[0]) continue search + for (var i = 1; i < lines.length - 1; i++) + if (fold(doc.getLine(line + i)) != lines[i]) continue search + var end = doc.getLine(line + lines.length - 1), endString = fold(end), lastLine = lines[lines.length - 1] + if (endString.slice(0, lastLine.length) != lastLine) continue search + return {from: Pos(line, adjustPos(orig, string, cutFrom, fold) + ch), + to: Pos(line + lines.length - 1, adjustPos(end, endString, lastLine.length, fold))} + } + } + } + + function searchStringBackward(doc, query, start, caseFold) { + if (!query.length) return null + var fold = caseFold ? doFold : noFold + var lines = fold(query).split(/\r|\n\r?/) + + search: for (var line = start.line, ch = start.ch, first = doc.firstLine() - 1 + lines.length; line >= first; line--, ch = -1) { + var orig = doc.getLine(line) + if (ch > -1) orig = orig.slice(0, ch) + var string = fold(orig) + if (lines.length == 1) { + var found = string.lastIndexOf(lines[0]) + if (found == -1) continue search + return {from: Pos(line, adjustPos(orig, string, found, fold)), + to: Pos(line, adjustPos(orig, string, found + lines[0].length, fold))} + } else { + var lastLine = lines[lines.length - 1] + if (string.slice(0, lastLine.length) != lastLine) continue search + for (var i = 1, start = line - lines.length + 1; i < lines.length - 1; i++) + if (fold(doc.getLine(start + i)) != lines[i]) continue search + var top = doc.getLine(line + 1 - lines.length), topString = fold(top) + if (topString.slice(topString.length - lines[0].length) != lines[0]) continue search + return {from: Pos(line + 1 - lines.length, adjustPos(top, topString, top.length - lines[0].length, fold)), + to: Pos(line, adjustPos(orig, string, lastLine.length, fold))} + } + } + } + + function SearchCursor(doc, query, pos, options) { + this.atOccurrence = false + this.doc = doc + pos = pos ? doc.clipPos(pos) : Pos(0, 0) + this.pos = {from: pos, to: pos} + + var caseFold + if (typeof options == "object") { + caseFold = options.caseFold + } else { // Backwards compat for when caseFold was the 4th argument + caseFold = options + options = null + } + + if (typeof query == "string") { + if (caseFold == null) caseFold = false + this.matches = function(reverse, pos) { + return (reverse ? searchStringBackward : searchStringForward)(doc, query, pos, caseFold) + } + } else { + query = ensureFlags(query, "gm") + if (!options || options.multiline !== false) + this.matches = function(reverse, pos) { + return (reverse ? searchRegexpBackwardMultiline : searchRegexpForwardMultiline)(doc, query, pos) + } + else + this.matches = function(reverse, pos) { + return (reverse ? searchRegexpBackward : searchRegexpForward)(doc, query, pos) + } + } + } + + SearchCursor.prototype = { + findNext: function() {return this.find(false)}, + findPrevious: function() {return this.find(true)}, + + find: function(reverse) { + var result = this.matches(reverse, this.doc.clipPos(reverse ? this.pos.from : this.pos.to)) + + // Implements weird auto-growing behavior on null-matches for + // backwards-compatiblity with the vim code (unfortunately) + while (result && CodeMirror.cmpPos(result.from, result.to) == 0) { + if (reverse) { + if (result.from.ch) result.from = Pos(result.from.line, result.from.ch - 1) + else if (result.from.line == this.doc.firstLine()) result = null + else result = this.matches(reverse, this.doc.clipPos(Pos(result.from.line - 1))) + } else { + if (result.to.ch < this.doc.getLine(result.to.line).length) result.to = Pos(result.to.line, result.to.ch + 1) + else if (result.to.line == this.doc.lastLine()) result = null + else result = this.matches(reverse, Pos(result.to.line + 1, 0)) + } + } + + if (result) { + this.pos = result + this.atOccurrence = true + return this.pos.match || true + } else { + var end = Pos(reverse ? this.doc.firstLine() : this.doc.lastLine() + 1, 0) + this.pos = {from: end, to: end} + return this.atOccurrence = false + } + }, + + from: function() {if (this.atOccurrence) return this.pos.from}, + to: function() {if (this.atOccurrence) return this.pos.to}, + + replace: function(newText, origin) { + if (!this.atOccurrence) return + var lines = CodeMirror.splitLines(newText) + this.doc.replaceRange(lines, this.pos.from, this.pos.to, origin) + this.pos.to = Pos(this.pos.from.line + lines.length - 1, + lines[lines.length - 1].length + (lines.length == 1 ? this.pos.from.ch : 0)) + } + } + + CodeMirror.defineExtension("getSearchCursor", function(query, pos, caseFold) { + return new SearchCursor(this.doc, query, pos, caseFold) + }) + CodeMirror.defineDocExtension("getSearchCursor", function(query, pos, caseFold) { + return new SearchCursor(this, query, pos, caseFold) + }) + + CodeMirror.defineExtension("selectMatches", function(query, caseFold) { + var ranges = [] + var cur = this.getSearchCursor(query, this.getCursor("from"), caseFold) + while (cur.findNext()) { + if (CodeMirror.cmpPos(cur.to(), this.getCursor("to")) > 0) break + ranges.push({anchor: cur.from(), head: cur.to()}) + } + if (ranges.length) + this.setSelections(ranges, 0) + }) +}); diff --git a/cyclone-web/vendor/codeMirror/shell.js b/cyclone-web/vendor/codeMirror/shell.js new file mode 100644 index 0000000000000000000000000000000000000000..a684e8c233ad293ee677cb53d13bd53c9acba7ca --- /dev/null +++ b/cyclone-web/vendor/codeMirror/shell.js @@ -0,0 +1,139 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/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.defineMode('shell', function() { + + var words = {}; + function define(style, string) { + var split = string.split(' '); + for(var i = 0; i < split.length; i++) { + words[split[i]] = style; + } + }; + + // Atoms + define('atom', 'true false'); + + // Keywords + define('keyword', 'if then do else elif while until for in esac fi fin ' + + 'fil done exit set unset export function'); + + // Commands + define('builtin', 'ab awk bash beep cat cc cd chown chmod chroot clear cp ' + + 'curl cut diff echo find gawk gcc get git grep kill killall ln ls make ' + + 'mkdir openssl mv nc node npm ping ps restart rm rmdir sed service sh ' + + 'shopt shred source sort sleep ssh start stop su sudo tee telnet top ' + + 'touch vi vim wall wc wget who write yes zsh'); + + function tokenBase(stream, state) { + if (stream.eatSpace()) return null; + + var sol = stream.sol(); + var ch = stream.next(); + + if (ch === '\\') { + stream.next(); + return null; + } + if (ch === '\'' || ch === '"' || ch === '`') { + state.tokens.unshift(tokenString(ch)); + return tokenize(stream, state); + } + if (ch === '#') { + if (sol && stream.eat('!')) { + stream.skipToEnd(); + return 'meta'; // 'comment'? + } + stream.skipToEnd(); + return 'comment'; + } + if (ch === '$') { + state.tokens.unshift(tokenDollar); + return tokenize(stream, state); + } + if (ch === '+' || ch === '=') { + return 'operator'; + } + if (ch === '-') { + stream.eat('-'); + stream.eatWhile(/\w/); + return 'attribute'; + } + if (/\d/.test(ch)) { + stream.eatWhile(/\d/); + if(stream.eol() || !/\w/.test(stream.peek())) { + return 'number'; + } + } + stream.eatWhile(/[\w-]/); + var cur = stream.current(); + if (stream.peek() === '=' && /\w+/.test(cur)) return 'def'; + return words.hasOwnProperty(cur) ? words[cur] : null; + } + + function tokenString(quote) { + return function(stream, state) { + var next, end = false, escaped = false; + while ((next = stream.next()) != null) { + if (next === quote && !escaped) { + end = true; + break; + } + if (next === '$' && !escaped && quote !== '\'') { + escaped = true; + stream.backUp(1); + state.tokens.unshift(tokenDollar); + break; + } + escaped = !escaped && next === '\\'; + } + if (end || !escaped) { + state.tokens.shift(); + } + return (quote === '`' || quote === ')' ? 'quote' : 'string'); + }; + }; + + var tokenDollar = function(stream, state) { + if (state.tokens.length > 1) stream.eat('$'); + var ch = stream.next(), hungry = /\w/; + if (ch === '{') hungry = /[^}]/; + if (ch === '(') { + state.tokens[0] = tokenString(')'); + return tokenize(stream, state); + } + if (!/\d/.test(ch)) { + stream.eatWhile(hungry); + stream.eat('}'); + } + state.tokens.shift(); + return 'def'; + }; + + function tokenize(stream, state) { + return (state.tokens[0] || tokenBase) (stream, state); + }; + + return { + startState: function() {return {tokens:[]};}, + token: function(stream, state) { + return tokenize(stream, state); + }, + lineComment: '#', + fold: "brace" + }; +}); + +CodeMirror.defineMIME('text/x-sh', 'shell'); + +}); diff --git a/cyclone-web/vendor/echarts/echarts.common.min.js b/cyclone-web/vendor/echarts/echarts.common.min.js new file mode 100644 index 0000000000000000000000000000000000000000..0c83363a8eb6207e7a20d61bdb70c9f36df2c31a --- /dev/null +++ b/cyclone-web/vendor/echarts/echarts.common.min.js @@ -0,0 +1,22 @@ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e(t.echarts={})}(this,function(t){"use strict";function e(t,e){"createCanvas"===t&&(rg=null),ng[t]=e}function n(t){if(null==t||"object"!=typeof t)return t;var e=t,i=qp.call(t);if("[object Array]"===i){if(!z(t)){e=[];for(var r=0,o=t.length;r<o;r++)e[r]=n(t[r])}}else if(jp[i]){if(!z(t)){var a=t.constructor;if(t.constructor.from)e=a.from(t);else{e=new a(t.length);for(var r=0,o=t.length;r<o;r++)e[r]=n(t[r])}}}else if(!Yp[i]&&!z(t)&&!M(t)){e={};for(var s in t)t.hasOwnProperty(s)&&(e[s]=n(t[s]))}return e}function i(t,e,r){if(!w(e)||!w(t))return r?n(e):t;for(var o in e)if(e.hasOwnProperty(o)){var a=t[o],s=e[o];!w(s)||!w(a)||y(s)||y(a)||M(s)||M(a)||b(s)||b(a)||z(s)||z(a)?!r&&o in t||(t[o]=n(e[o],!0)):i(a,s,r)}return t}function r(t,e){for(var n=t[0],r=1,o=t.length;r<o;r++)n=i(n,t[r],e);return n}function o(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}function a(t,e,n){for(var i in e)e.hasOwnProperty(i)&&(n?null!=e[i]:null==t[i])&&(t[i]=e[i]);return t}function s(){return rg||(rg=ig().getContext("2d")),rg}function l(t,e){if(t){if(t.indexOf)return t.indexOf(e);for(var n=0,i=t.length;n<i;n++)if(t[n]===e)return n}return-1}function u(t,e){function n(){}var i=t.prototype;n.prototype=e.prototype,t.prototype=new n;for(var r in i)t.prototype[r]=i[r];t.prototype.constructor=t,t.superClass=e}function h(t,e,n){a(t="prototype"in t?t.prototype:t,e="prototype"in e?e.prototype:e,n)}function c(t){if(t)return"string"!=typeof t&&"number"==typeof t.length}function d(t,e,n){if(t&&e)if(t.forEach&&t.forEach===Kp)t.forEach(e,n);else if(t.length===+t.length)for(var i=0,r=t.length;i<r;i++)e.call(n,t[i],i,t);else for(var o in t)t.hasOwnProperty(o)&&e.call(n,t[o],o,t)}function f(t,e,n){if(t&&e){if(t.map&&t.map===tg)return t.map(e,n);for(var i=[],r=0,o=t.length;r<o;r++)i.push(e.call(n,t[r],r,t));return i}}function p(t,e,n,i){if(t&&e){if(t.reduce&&t.reduce===eg)return t.reduce(e,n,i);for(var r=0,o=t.length;r<o;r++)n=e.call(i,n,t[r],r,t);return n}}function g(t,e,n){if(t&&e){if(t.filter&&t.filter===Qp)return t.filter(e,n);for(var i=[],r=0,o=t.length;r<o;r++)e.call(n,t[r],r,t)&&i.push(t[r]);return i}}function m(t,e){var n=Jp.call(arguments,2);return function(){return t.apply(e,n.concat(Jp.call(arguments)))}}function v(t){var e=Jp.call(arguments,1);return function(){return t.apply(this,e.concat(Jp.call(arguments)))}}function y(t){return"[object Array]"===qp.call(t)}function x(t){return"function"==typeof t}function _(t){return"[object String]"===qp.call(t)}function w(t){var e=typeof t;return"function"===e||!!t&&"object"==e}function b(t){return!!Yp[qp.call(t)]}function S(t){return!!jp[qp.call(t)]}function M(t){return"object"==typeof t&&"number"==typeof t.nodeType&&"object"==typeof t.ownerDocument}function I(t){return t!==t}function T(t){for(var e=0,n=arguments.length;e<n;e++)if(null!=arguments[e])return arguments[e]}function C(t,e){return null!=t?t:e}function A(t,e,n){return null!=t?t:null!=e?e:n}function D(){return Function.call.apply(Jp,arguments)}function k(t){if("number"==typeof t)return[t,t,t,t];var e=t.length;return 2===e?[t[0],t[1],t[0],t[1]]:3===e?[t[0],t[1],t[2],t[1]]:t}function P(t,e){if(!t)throw new Error(e)}function L(t){return null==t?null:"function"==typeof t.trim?t.trim():t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}function O(t){t[og]=!0}function z(t){return t[og]}function E(t){function e(t,e){n?i.set(t,e):i.set(e,t)}var n=y(t);this.data={};var i=this;t instanceof E?t.each(e):t&&d(t,e)}function N(t){return new E(t)}function R(){}function B(t,e){var n=new sg(2);return null==t&&(t=0),null==e&&(e=0),n[0]=t,n[1]=e,n}function F(t,e){return t[0]=e[0],t[1]=e[1],t}function V(t){var e=new sg(2);return e[0]=t[0],e[1]=t[1],e}function W(t,e,n){return t[0]=e[0]+n[0],t[1]=e[1]+n[1],t}function H(t,e,n,i){return t[0]=e[0]+n[0]*i,t[1]=e[1]+n[1]*i,t}function G(t,e,n){return t[0]=e[0]-n[0],t[1]=e[1]-n[1],t}function Z(t){return Math.sqrt(U(t))}function U(t){return t[0]*t[0]+t[1]*t[1]}function X(t,e,n){return t[0]=e[0]*n,t[1]=e[1]*n,t}function Y(t,e){var n=Z(e);return 0===n?(t[0]=0,t[1]=0):(t[0]=e[0]/n,t[1]=e[1]/n),t}function j(t,e){return Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1]))}function q(t,e){return(t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])}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}function K(t,e,n){return t[0]=Math.min(e[0],n[0]),t[1]=Math.min(e[1],n[1]),t}function Q(t,e,n){return t[0]=Math.max(e[0],n[0]),t[1]=Math.max(e[1],n[1]),t}function J(){this.on("mousedown",this._dragStart,this),this.on("mousemove",this._drag,this),this.on("mouseup",this._dragEnd,this),this.on("globalout",this._dragEnd,this)}function tt(t,e){return{target:t,topTarget:e&&e.topTarget}}function et(t,e){var n=t._$eventProcessor;return null!=e&&n&&n.normalizeQuery&&(e=n.normalizeQuery(e)),e}function nt(t){return t.getBoundingClientRect?t.getBoundingClientRect():{left:0,top:0}}function it(t,e,n,i){return n=n||{},i||!Xp.canvasSupported?rt(t,e,n):Xp.browser.firefox&&null!=e.layerX&&e.layerX!==e.offsetX?(n.zrX=e.layerX,n.zrY=e.layerY):null!=e.offsetX?(n.zrX=e.offsetX,n.zrY=e.offsetY):rt(t,e,n),n}function rt(t,e,n){var i=nt(t);n.zrX=e.clientX-i.left,n.zrY=e.clientY-i.top}function ot(t,e,n){if(null!=(e=e||window.event).zrX)return e;var i=e.type;if(i&&i.indexOf("touch")>=0){var r="touchend"!=i?e.targetTouches[0]:e.changedTouches[0];r&&it(t,r,e,n)}else it(t,e,e,n),e.zrDelta=e.wheelDelta?e.wheelDelta/120:-(e.detail||0)/3;var o=e.button;return null==e.which&&void 0!==o&&mg.test(e.type)&&(e.which=1&o?1:2&o?3:4&o?2:0),e}function at(t,e,n){gg?t.addEventListener(e,n):t.attachEvent("on"+e,n)}function st(t,e,n){gg?t.removeEventListener(e,n):t.detachEvent("on"+e,n)}function lt(t){return t.which>1}function ut(t,e,n){return{type:t,event:n,target:e.target,topTarget:e.topTarget,cancelBubble:!1,offsetX:n.zrX,offsetY:n.zrY,gestureEvent:n.gestureEvent,pinchX:n.pinchX,pinchY:n.pinchY,pinchScale:n.pinchScale,wheelDelta:n.zrDelta,zrByTouch:n.zrByTouch,which:n.which,stop:ht}}function ht(t){vg(this.event)}function ct(){}function dt(t,e,n){if(t[t.rectHover?"rectContain":"contain"](e,n)){for(var i,r=t;r;){if(r.clipPath&&!r.clipPath.contain(e,n))return!1;r.silent&&(i=!0),r=r.parent}return!i||yg}return!1}function ft(){var t=new wg(6);return pt(t),t}function pt(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t}function gt(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t}function mt(t,e,n){var i=e[0]*n[0]+e[2]*n[1],r=e[1]*n[0]+e[3]*n[1],o=e[0]*n[2]+e[2]*n[3],a=e[1]*n[2]+e[3]*n[3],s=e[0]*n[4]+e[2]*n[5]+e[4],l=e[1]*n[4]+e[3]*n[5]+e[5];return t[0]=i,t[1]=r,t[2]=o,t[3]=a,t[4]=s,t[5]=l,t}function vt(t,e,n){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+n[0],t[5]=e[5]+n[1],t}function yt(t,e,n){var i=e[0],r=e[2],o=e[4],a=e[1],s=e[3],l=e[5],u=Math.sin(n),h=Math.cos(n);return t[0]=i*h+a*u,t[1]=-i*u+a*h,t[2]=r*h+s*u,t[3]=-r*u+h*s,t[4]=h*o+u*l,t[5]=h*l-u*o,t}function xt(t,e,n){var i=n[0],r=n[1];return t[0]=e[0]*i,t[1]=e[1]*r,t[2]=e[2]*i,t[3]=e[3]*r,t[4]=e[4]*i,t[5]=e[5]*r,t}function _t(t,e){var n=e[0],i=e[2],r=e[4],o=e[1],a=e[3],s=e[5],l=n*a-o*i;return l?(l=1/l,t[0]=a*l,t[1]=-o*l,t[2]=-i*l,t[3]=n*l,t[4]=(i*s-a*r)*l,t[5]=(o*r-n*s)*l,t):null}function wt(t){return t>Mg||t<-Mg}function bt(t){this._target=t.target,this._life=t.life||1e3,this._delay=t.delay||0,this._initialized=!1,this.loop=null!=t.loop&&t.loop,this.gap=t.gap||0,this.easing=t.easing||"Linear",this.onframe=t.onframe,this.ondestroy=t.ondestroy,this.onrestart=t.onrestart,this._pausedTime=0,this._paused=!1}function St(t){return(t=Math.round(t))<0?0:t>255?255:t}function Mt(t){return(t=Math.round(t))<0?0:t>360?360:t}function It(t){return t<0?0:t>1?1:t}function Tt(t){return St(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100*255:parseInt(t,10))}function Ct(t){return It(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100:parseFloat(t))}function At(t,e,n){return n<0?n+=1:n>1&&(n-=1),6*n<1?t+(e-t)*n*6:2*n<1?e:3*n<2?t+(e-t)*(2/3-n)*6:t}function Dt(t,e,n){return t+(e-t)*n}function kt(t,e,n,i,r){return t[0]=e,t[1]=n,t[2]=i,t[3]=r,t}function Pt(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}function Lt(t,e){Bg&&Pt(Bg,e),Bg=Rg.put(t,Bg||e.slice())}function Ot(t,e){if(t){e=e||[];var n=Rg.get(t);if(n)return Pt(e,n);var i=(t+="").replace(/ /g,"").toLowerCase();if(i in Ng)return Pt(e,Ng[i]),Lt(t,e),e;if("#"!==i.charAt(0)){var r=i.indexOf("("),o=i.indexOf(")");if(-1!==r&&o+1===i.length){var a=i.substr(0,r),s=i.substr(r+1,o-(r+1)).split(","),l=1;switch(a){case"rgba":if(4!==s.length)return void kt(e,0,0,0,1);l=Ct(s.pop());case"rgb":return 3!==s.length?void kt(e,0,0,0,1):(kt(e,Tt(s[0]),Tt(s[1]),Tt(s[2]),l),Lt(t,e),e);case"hsla":return 4!==s.length?void kt(e,0,0,0,1):(s[3]=Ct(s[3]),zt(s,e),Lt(t,e),e);case"hsl":return 3!==s.length?void kt(e,0,0,0,1):(zt(s,e),Lt(t,e),e);default:return}}kt(e,0,0,0,1)}else{if(4===i.length)return(u=parseInt(i.substr(1),16))>=0&&u<=4095?(kt(e,(3840&u)>>4|(3840&u)>>8,240&u|(240&u)>>4,15&u|(15&u)<<4,1),Lt(t,e),e):void kt(e,0,0,0,1);if(7===i.length){var u=parseInt(i.substr(1),16);return u>=0&&u<=16777215?(kt(e,(16711680&u)>>16,(65280&u)>>8,255&u,1),Lt(t,e),e):void kt(e,0,0,0,1)}}}}function zt(t,e){var n=(parseFloat(t[0])%360+360)%360/360,i=Ct(t[1]),r=Ct(t[2]),o=r<=.5?r*(i+1):r+i-r*i,a=2*r-o;return e=e||[],kt(e,St(255*At(a,o,n+1/3)),St(255*At(a,o,n)),St(255*At(a,o,n-1/3)),1),4===t.length&&(e[3]=t[3]),e}function Et(t){if(t){var e,n,i=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(i,r,o),s=Math.max(i,r,o),l=s-a,u=(s+a)/2;if(0===l)e=0,n=0;else{n=u<.5?l/(s+a):l/(2-s-a);var h=((s-i)/6+l/2)/l,c=((s-r)/6+l/2)/l,d=((s-o)/6+l/2)/l;i===s?e=d-c:r===s?e=1/3+h-d:o===s&&(e=2/3+c-h),e<0&&(e+=1),e>1&&(e-=1)}var f=[360*e,n,u];return null!=t[3]&&f.push(t[3]),f}}function Nt(t,e){var n=Ot(t);if(n){for(var i=0;i<3;i++)n[i]=e<0?n[i]*(1-e)|0:(255-n[i])*e+n[i]|0,n[i]>255?n[i]=255:t[i]<0&&(n[i]=0);return Wt(n,4===n.length?"rgba":"rgb")}}function Rt(t){var e=Ot(t);if(e)return((1<<24)+(e[0]<<16)+(e[1]<<8)+ +e[2]).toString(16).slice(1)}function Bt(t,e,n){if(e&&e.length&&t>=0&&t<=1){n=n||[];var i=t*(e.length-1),r=Math.floor(i),o=Math.ceil(i),a=e[r],s=e[o],l=i-r;return n[0]=St(Dt(a[0],s[0],l)),n[1]=St(Dt(a[1],s[1],l)),n[2]=St(Dt(a[2],s[2],l)),n[3]=It(Dt(a[3],s[3],l)),n}}function Ft(t,e,n){if(e&&e.length&&t>=0&&t<=1){var i=t*(e.length-1),r=Math.floor(i),o=Math.ceil(i),a=Ot(e[r]),s=Ot(e[o]),l=i-r,u=Wt([St(Dt(a[0],s[0],l)),St(Dt(a[1],s[1],l)),St(Dt(a[2],s[2],l)),It(Dt(a[3],s[3],l))],"rgba");return n?{color:u,leftIndex:r,rightIndex:o,value:i}:u}}function Vt(t,e){if((t=Ot(t))&&null!=e)return t[3]=It(e),Wt(t,"rgba")}function Wt(t,e){if(t&&t.length){var n=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(n+=","+t[3]),e+"("+n+")"}}function Ht(t,e){return t[e]}function Gt(t,e,n){t[e]=n}function Zt(t,e,n){return(e-t)*n+t}function Ut(t,e,n){return n>.5?e:t}function Xt(t,e,n,i,r){var o=t.length;if(1==r)for(s=0;s<o;s++)i[s]=Zt(t[s],e[s],n);else for(var a=o&&t[0].length,s=0;s<o;s++)for(var l=0;l<a;l++)i[s][l]=Zt(t[s][l],e[s][l],n)}function Yt(t,e,n){var i=t.length,r=e.length;if(i!==r)if(i>r)t.length=r;else for(a=i;a<r;a++)t.push(1===n?e[a]:Hg.call(e[a]));for(var o=t[0]&&t[0].length,a=0;a<t.length;a++)if(1===n)isNaN(t[a])&&(t[a]=e[a]);else for(var s=0;s<o;s++)isNaN(t[a][s])&&(t[a][s]=e[a][s])}function jt(t,e,n){if(t===e)return!0;var i=t.length;if(i!==e.length)return!1;if(1===n){for(o=0;o<i;o++)if(t[o]!==e[o])return!1}else for(var r=t[0].length,o=0;o<i;o++)for(var a=0;a<r;a++)if(t[o][a]!==e[o][a])return!1;return!0}function qt(t,e,n,i,r,o,a,s,l){var u=t.length;if(1==l)for(c=0;c<u;c++)s[c]=$t(t[c],e[c],n[c],i[c],r,o,a);else for(var h=t[0].length,c=0;c<u;c++)for(var d=0;d<h;d++)s[c][d]=$t(t[c][d],e[c][d],n[c][d],i[c][d],r,o,a)}function $t(t,e,n,i,r,o,a){var s=.5*(n-t),l=.5*(i-e);return(2*(e-n)+s+l)*a+(-3*(e-n)-2*s-l)*o+s*r+e}function Kt(t){if(c(t)){var e=t.length;if(c(t[0])){for(var n=[],i=0;i<e;i++)n.push(Hg.call(t[i]));return n}return Hg.call(t)}return t}function Qt(t){return t[0]=Math.floor(t[0]),t[1]=Math.floor(t[1]),t[2]=Math.floor(t[2]),"rgba("+t.join(",")+")"}function Jt(t){var e=t[t.length-1].value;return c(e&&e[0])?2:1}function te(t,e,n,i,r,o){var a=t._getter,s=t._setter,l="spline"===e,u=i.length;if(u){var h,d=c(i[0].value),f=!1,p=!1,g=d?Jt(i):0;i.sort(function(t,e){return t.time-e.time}),h=i[u-1].time;for(var m=[],v=[],y=i[0].value,x=!0,_=0;_<u;_++){m.push(i[_].time/h);var w=i[_].value;if(d&&jt(w,y,g)||!d&&w===y||(x=!1),y=w,"string"==typeof w){var b=Ot(w);b?(w=b,f=!0):p=!0}v.push(w)}if(o||!x){for(var S=v[u-1],_=0;_<u-1;_++)d?Yt(v[_],S,g):!isNaN(v[_])||isNaN(S)||p||f||(v[_]=S);d&&Yt(a(t._target,r),S,g);var M,I,T,C,A,D,k=0,P=0;if(f)var L=[0,0,0,0];var O=new bt({target:t._target,life:h,loop:t._loop,delay:t._delay,onframe:function(t,e){var n;if(e<0)n=0;else if(e<P){for(n=M=Math.min(k+1,u-1);n>=0&&!(m[n]<=e);n--);n=Math.min(n,u-2)}else{for(n=k;n<u&&!(m[n]>e);n++);n=Math.min(n-1,u-2)}k=n,P=e;var i=m[n+1]-m[n];if(0!==i)if(I=(e-m[n])/i,l)if(C=v[n],T=v[0===n?n:n-1],A=v[n>u-2?u-1:n+1],D=v[n>u-3?u-1:n+2],d)qt(T,C,A,D,I,I*I,I*I*I,a(t,r),g);else{if(f)o=qt(T,C,A,D,I,I*I,I*I*I,L,1),o=Qt(L);else{if(p)return Ut(C,A,I);o=$t(T,C,A,D,I,I*I,I*I*I)}s(t,r,o)}else if(d)Xt(v[n],v[n+1],I,a(t,r),g);else{var o;if(f)Xt(v[n],v[n+1],I,L,1),o=Qt(L);else{if(p)return Ut(v[n],v[n+1],I);o=Zt(v[n],v[n+1],I)}s(t,r,o)}},ondestroy:n});return e&&"spline"!==e&&(O.easing=e),O}}}function ee(t,e,n,i,r,o,a,s){_(i)?(o=r,r=i,i=0):x(r)?(o=r,r="linear",i=0):x(i)?(o=i,i=0):x(n)?(o=n,n=500):n||(n=500),t.stopAnimation(),ne(t,"",t,e,n,i,s);var l=t.animators.slice(),u=l.length;u||o&&o();for(var h=0;h<l.length;h++)l[h].done(function(){--u||o&&o()}).start(r,a)}function ne(t,e,n,i,r,o,a){var s={},l=0;for(var u in i)i.hasOwnProperty(u)&&(null!=n[u]?w(i[u])&&!c(i[u])?ne(t,e?e+"."+u:u,n[u],i[u],r,o,a):(a?(s[u]=n[u],ie(t,e,u,i[u])):s[u]=i[u],l++):null==i[u]||a||ie(t,e,u,i[u]));l>0&&t.animate(e,!1).when(null==r?500:r,s).delay(o||0)}function ie(t,e,n,i){if(e){var r={};r[e]={},r[e][n]=i,t.attr(r)}else t.attr(n,i)}function re(t,e,n,i){n<0&&(t+=n,n=-n),i<0&&(e+=i,i=-i),this.x=t,this.y=e,this.width=n,this.height=i}function oe(t){for(var e=0;t>=tm;)e|=1&t,t>>=1;return t+e}function ae(t,e,n,i){var r=e+1;if(r===n)return 1;if(i(t[r++],t[e])<0){for(;r<n&&i(t[r],t[r-1])<0;)r++;se(t,e,r)}else for(;r<n&&i(t[r],t[r-1])>=0;)r++;return r-e}function se(t,e,n){for(n--;e<n;){var i=t[e];t[e++]=t[n],t[n--]=i}}function le(t,e,n,i,r){for(i===e&&i++;i<n;i++){for(var o,a=t[i],s=e,l=i;s<l;)r(a,t[o=s+l>>>1])<0?l=o:s=o+1;var u=i-s;switch(u){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;u>0;)t[s+u]=t[s+u-1],u--}t[s]=a}}function ue(t,e,n,i,r,o){var a=0,s=0,l=1;if(o(t,e[n+r])>0){for(s=i-r;l<s&&o(t,e[n+r+l])>0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}else{for(s=r+1;l<s&&o(t,e[n+r-l])<=0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s);var u=a;a=r-l,l=r-u}for(a++;a<l;){var h=a+(l-a>>>1);o(t,e[n+h])>0?a=h+1:l=h}return l}function he(t,e,n,i,r,o){var a=0,s=0,l=1;if(o(t,e[n+r])<0){for(s=r+1;l<s&&o(t,e[n+r-l])<0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s);var u=a;a=r-l,l=r-u}else{for(s=i-r;l<s&&o(t,e[n+r+l])>=0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}for(a++;a<l;){var h=a+(l-a>>>1);o(t,e[n+h])<0?l=h:a=h+1}return l}function ce(t,e){function n(n){var s=o[n],u=a[n],h=o[n+1],c=a[n+1];a[n]=u+c,n===l-3&&(o[n+1]=o[n+2],a[n+1]=a[n+2]),l--;var d=he(t[h],t,s,u,0,e);s+=d,0!==(u-=d)&&0!==(c=ue(t[s+u-1],t,h,c,c-1,e))&&(u<=c?i(s,u,h,c):r(s,u,h,c))}function i(n,i,r,o){var a=0;for(a=0;a<i;a++)u[a]=t[n+a];var l=0,h=r,c=n;if(t[c++]=t[h++],0!=--o)if(1!==i){for(var d,f,p,g=s;;){d=0,f=0,p=!1;do{if(e(t[h],u[l])<0){if(t[c++]=t[h++],f++,d=0,0==--o){p=!0;break}}else if(t[c++]=u[l++],d++,f=0,1==--i){p=!0;break}}while((d|f)<g);if(p)break;do{if(0!==(d=he(t[h],u,l,i,0,e))){for(a=0;a<d;a++)t[c+a]=u[l+a];if(c+=d,l+=d,(i-=d)<=1){p=!0;break}}if(t[c++]=t[h++],0==--o){p=!0;break}if(0!==(f=ue(u[l],t,h,o,0,e))){for(a=0;a<f;a++)t[c+a]=t[h+a];if(c+=f,h+=f,0===(o-=f)){p=!0;break}}if(t[c++]=u[l++],1==--i){p=!0;break}g--}while(d>=em||f>=em);if(p)break;g<0&&(g=0),g+=2}if((s=g)<1&&(s=1),1===i){for(a=0;a<o;a++)t[c+a]=t[h+a];t[c+o]=u[l]}else{if(0===i)throw new Error;for(a=0;a<i;a++)t[c+a]=u[l+a]}}else{for(a=0;a<o;a++)t[c+a]=t[h+a];t[c+o]=u[l]}else for(a=0;a<i;a++)t[c+a]=u[l+a]}function r(n,i,r,o){var a=0;for(a=0;a<o;a++)u[a]=t[r+a];var l=n+i-1,h=o-1,c=r+o-1,d=0,f=0;if(t[c--]=t[l--],0!=--i)if(1!==o){for(var p=s;;){var g=0,m=0,v=!1;do{if(e(u[h],t[l])<0){if(t[c--]=t[l--],g++,m=0,0==--i){v=!0;break}}else if(t[c--]=u[h--],m++,g=0,1==--o){v=!0;break}}while((g|m)<p);if(v)break;do{if(0!=(g=i-he(u[h],t,n,i,i-1,e))){for(i-=g,f=(c-=g)+1,d=(l-=g)+1,a=g-1;a>=0;a--)t[f+a]=t[d+a];if(0===i){v=!0;break}}if(t[c--]=u[h--],1==--o){v=!0;break}if(0!=(m=o-ue(t[l],u,0,o,o-1,e))){for(o-=m,f=(c-=m)+1,d=(h-=m)+1,a=0;a<m;a++)t[f+a]=u[d+a];if(o<=1){v=!0;break}}if(t[c--]=t[l--],0==--i){v=!0;break}p--}while(g>=em||m>=em);if(v)break;p<0&&(p=0),p+=2}if((s=p)<1&&(s=1),1===o){for(f=(c-=i)+1,d=(l-=i)+1,a=i-1;a>=0;a--)t[f+a]=t[d+a];t[c]=u[h]}else{if(0===o)throw new Error;for(d=c-(o-1),a=0;a<o;a++)t[d+a]=u[a]}}else{for(f=(c-=i)+1,d=(l-=i)+1,a=i-1;a>=0;a--)t[f+a]=t[d+a];t[c]=u[h]}else for(d=c-(o-1),a=0;a<o;a++)t[d+a]=u[a]}var o,a,s=em,l=0,u=[];o=[],a=[],this.mergeRuns=function(){for(;l>1;){var t=l-2;if(t>=1&&a[t-1]<=a[t]+a[t+1]||t>=2&&a[t-2]<=a[t]+a[t-1])a[t-1]<a[t+1]&&t--;else if(a[t]>a[t+1])break;n(t)}},this.forceMergeRuns=function(){for(;l>1;){var t=l-2;t>0&&a[t-1]<a[t+1]&&t--,n(t)}},this.pushRun=function(t,e){o[l]=t,a[l]=e,l+=1}}function de(t,e,n,i){n||(n=0),i||(i=t.length);var r=i-n;if(!(r<2)){var o=0;if(r<tm)return o=ae(t,n,i,e),void le(t,n,i,n+o,e);var a=new ce(t,e),s=oe(r);do{if((o=ae(t,n,i,e))<s){var l=r;l>s&&(l=s),le(t,n,n+l,n+o,e),o=l}a.pushRun(n,o),a.mergeRuns(),r-=o,n+=o}while(0!==r);a.forceMergeRuns()}}function fe(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t.zlevel-e.zlevel}function pe(t,e,n){var i=null==e.x?0:e.x,r=null==e.x2?1:e.x2,o=null==e.y?0:e.y,a=null==e.y2?0:e.y2;return e.global||(i=i*n.width+n.x,r=r*n.width+n.x,o=o*n.height+n.y,a=a*n.height+n.y),i=isNaN(i)?0:i,r=isNaN(r)?1:r,o=isNaN(o)?0:o,a=isNaN(a)?0:a,t.createLinearGradient(i,o,r,a)}function ge(t,e,n){var i=n.width,r=n.height,o=Math.min(i,r),a=null==e.x?.5:e.x,s=null==e.y?.5:e.y,l=null==e.r?.5:e.r;return e.global||(a=a*i+n.x,s=s*r+n.y,l*=o),t.createRadialGradient(a,s,0,a,s,l)}function me(){return!1}function ve(t,e,n){var i=ig(),r=e.getWidth(),o=e.getHeight(),a=i.style;return a&&(a.position="absolute",a.left=0,a.top=0,a.width=r+"px",a.height=o+"px",i.setAttribute("data-zr-dom-id",t)),i.width=r*n,i.height=o*n,i}function ye(t){if("string"==typeof t){var e=fm.get(t);return e&&e.image}return t}function xe(t,e,n,i,r){if(t){if("string"==typeof t){if(e&&e.__zrImageSrc===t||!n)return e;var o=fm.get(t),a={hostEl:n,cb:i,cbPayload:r};return o?!we(e=o.image)&&o.pending.push(a):(!e&&(e=new Image),e.onload=e.onerror=_e,fm.put(t,e.__cachedImgObj={image:e,pending:[a]}),e.src=e.__zrImageSrc=t),e}return t}return e}function _e(){var t=this.__cachedImgObj;this.onload=this.onerror=this.__cachedImgObj=null;for(var e=0;e<t.pending.length;e++){var n=t.pending[e],i=n.cb;i&&i(this,n.cbPayload),n.hostEl.dirty()}t.pending.length=0}function we(t){return t&&t.width&&t.height}function be(t,e){var n=t+":"+(e=e||ym);if(pm[n])return pm[n];for(var i=(t+"").split("\n"),r=0,o=0,a=i.length;o<a;o++)r=Math.max(ze(i[o],e).width,r);return gm>mm&&(gm=0,pm={}),gm++,pm[n]=r,r}function Se(t,e,n,i,r,o,a){return o?Ie(t,e,n,i,r,o,a):Me(t,e,n,i,r,a)}function Me(t,e,n,i,r,o){var a=Ee(t,e,r,o),s=be(t,e);r&&(s+=r[1]+r[3]);var l=a.outerHeight,u=new re(Te(0,s,n),Ce(0,l,i),s,l);return u.lineHeight=a.lineHeight,u}function Ie(t,e,n,i,r,o,a){var s=Ne(t,{rich:o,truncate:a,font:e,textAlign:n,textPadding:r}),l=s.outerWidth,u=s.outerHeight;return new re(Te(0,l,n),Ce(0,u,i),l,u)}function Te(t,e,n){return"right"===n?t-=e:"center"===n&&(t-=e/2),t}function Ce(t,e,n){return"middle"===n?t-=e/2:"bottom"===n&&(t-=e),t}function Ae(t,e,n){var i=e.x,r=e.y,o=e.height,a=e.width,s=o/2,l="left",u="top";switch(t){case"left":i-=n,r+=s,l="right",u="middle";break;case"right":i+=n+a,r+=s,u="middle";break;case"top":i+=a/2,r-=n,l="center",u="bottom";break;case"bottom":i+=a/2,r+=o+n,l="center";break;case"inside":i+=a/2,r+=s,l="center",u="middle";break;case"insideLeft":i+=n,r+=s,u="middle";break;case"insideRight":i+=a-n,r+=s,l="right",u="middle";break;case"insideTop":i+=a/2,r+=n,l="center";break;case"insideBottom":i+=a/2,r+=o-n,l="center",u="bottom";break;case"insideTopLeft":i+=n,r+=n;break;case"insideTopRight":i+=a-n,r+=n,l="right";break;case"insideBottomLeft":i+=n,r+=o-n,u="bottom";break;case"insideBottomRight":i+=a-n,r+=o-n,l="right",u="bottom"}return{x:i,y:r,textAlign:l,textVerticalAlign:u}}function De(t,e,n,i,r){if(!e)return"";var o=(t+"").split("\n");r=ke(e,n,i,r);for(var a=0,s=o.length;a<s;a++)o[a]=Pe(o[a],r);return o.join("\n")}function ke(t,e,n,i){(i=o({},i)).font=e;var n=C(n,"...");i.maxIterations=C(i.maxIterations,2);var r=i.minChar=C(i.minChar,0);i.cnCharWidth=be("国",e);var a=i.ascCharWidth=be("a",e);i.placeholder=C(i.placeholder,"");for(var s=t=Math.max(0,t-1),l=0;l<r&&s>=a;l++)s-=a;var u=be(n);return u>s&&(n="",u=0),s=t-u,i.ellipsis=n,i.ellipsisWidth=u,i.contentWidth=s,i.containerWidth=t,i}function Pe(t,e){var n=e.containerWidth,i=e.font,r=e.contentWidth;if(!n)return"";var o=be(t,i);if(o<=n)return t;for(var a=0;;a++){if(o<=r||a>=e.maxIterations){t+=e.ellipsis;break}var s=0===a?Le(t,r,e.ascCharWidth,e.cnCharWidth):o>0?Math.floor(t.length*r/o):0;o=be(t=t.substr(0,s),i)}return""===t&&(t=e.placeholder),t}function Le(t,e,n,i){for(var r=0,o=0,a=t.length;o<a&&r<e;o++){var s=t.charCodeAt(o);r+=0<=s&&s<=127?n:i}return o}function Oe(t){return be("国",t)}function ze(t,e){return xm.measureText(t,e)}function Ee(t,e,n,i){null!=t&&(t+="");var r=Oe(e),o=t?t.split("\n"):[],a=o.length*r,s=a;if(n&&(s+=n[0]+n[2]),t&&i){var l=i.outerHeight,u=i.outerWidth;if(null!=l&&s>l)t="",o=[];else if(null!=u)for(var h=ke(u-(n?n[1]+n[3]:0),e,i.ellipsis,{minChar:i.minChar,placeholder:i.placeholder}),c=0,d=o.length;c<d;c++)o[c]=Pe(o[c],h)}return{lines:o,height:a,outerHeight:s,lineHeight:r}}function Ne(t,e){var n={lines:[],width:0,height:0};if(null!=t&&(t+=""),!t)return n;for(var i,r=vm.lastIndex=0;null!=(i=vm.exec(t));){var o=i.index;o>r&&Re(n,t.substring(r,o)),Re(n,i[2],i[1]),r=vm.lastIndex}r<t.length&&Re(n,t.substring(r,t.length));var a=n.lines,s=0,l=0,u=[],h=e.textPadding,c=e.truncate,d=c&&c.outerWidth,f=c&&c.outerHeight;h&&(null!=d&&(d-=h[1]+h[3]),null!=f&&(f-=h[0]+h[2]));for(k=0;k<a.length;k++){for(var p=a[k],g=0,m=0,v=0;v<p.tokens.length;v++){var y=(P=p.tokens[v]).styleName&&e.rich[P.styleName]||{},x=P.textPadding=y.textPadding,_=P.font=y.font||e.font,w=P.textHeight=C(y.textHeight,Oe(_));if(x&&(w+=x[0]+x[2]),P.height=w,P.lineHeight=A(y.textLineHeight,e.textLineHeight,w),P.textAlign=y&&y.textAlign||e.textAlign,P.textVerticalAlign=y&&y.textVerticalAlign||"middle",null!=f&&s+P.lineHeight>f)return{lines:[],width:0,height:0};P.textWidth=be(P.text,_);var b=y.textWidth,S=null==b||"auto"===b;if("string"==typeof b&&"%"===b.charAt(b.length-1))P.percentWidth=b,u.push(P),b=0;else{if(S){b=P.textWidth;var M=y.textBackgroundColor,I=M&&M.image;I&&we(I=ye(I))&&(b=Math.max(b,I.width*w/I.height))}var T=x?x[1]+x[3]:0;b+=T;var D=null!=d?d-m:null;null!=D&&D<b&&(!S||D<T?(P.text="",P.textWidth=b=0):(P.text=De(P.text,D-T,_,c.ellipsis,{minChar:c.minChar}),P.textWidth=be(P.text,_),b=P.textWidth+T))}m+=P.width=b,y&&(g=Math.max(g,P.lineHeight))}p.width=m,p.lineHeight=g,s+=g,l=Math.max(l,m)}n.outerWidth=n.width=C(e.textWidth,l),n.outerHeight=n.height=C(e.textHeight,s),h&&(n.outerWidth+=h[1]+h[3],n.outerHeight+=h[0]+h[2]);for(var k=0;k<u.length;k++){var P=u[k],L=P.percentWidth;P.width=parseInt(L,10)/100*l}return n}function Re(t,e,n){for(var i=""===e,r=e.split("\n"),o=t.lines,a=0;a<r.length;a++){var s=r[a],l={styleName:n,text:s,isLineHolder:!s&&!i};if(a)o.push({tokens:[l]});else{var u=(o[o.length-1]||(o[0]={tokens:[]})).tokens,h=u.length;1===h&&u[0].isLineHolder?u[0]=l:(s||!h||i)&&u.push(l)}}}function Be(t){var e=(t.fontSize||t.fontFamily)&&[t.fontStyle,t.fontWeight,(t.fontSize||12)+"px",t.fontFamily||"sans-serif"].join(" ");return e&&L(e)||t.textFont||t.font}function Fe(t,e){var n,i,r,o,a=e.x,s=e.y,l=e.width,u=e.height,h=e.r;l<0&&(a+=l,l=-l),u<0&&(s+=u,u=-u),"number"==typeof h?n=i=r=o=h:h instanceof Array?1===h.length?n=i=r=o=h[0]:2===h.length?(n=r=h[0],i=o=h[1]):3===h.length?(n=h[0],i=o=h[1],r=h[2]):(n=h[0],i=h[1],r=h[2],o=h[3]):n=i=r=o=0;var c;n+i>l&&(n*=l/(c=n+i),i*=l/c),r+o>l&&(r*=l/(c=r+o),o*=l/c),i+r>u&&(i*=u/(c=i+r),r*=u/c),n+o>u&&(n*=u/(c=n+o),o*=u/c),t.moveTo(a+n,s),t.lineTo(a+l-i,s),0!==i&&t.arc(a+l-i,s+i,i,-Math.PI/2,0),t.lineTo(a+l,s+u-r),0!==r&&t.arc(a+l-r,s+u-r,r,0,Math.PI/2),t.lineTo(a+o,s+u),0!==o&&t.arc(a+o,s+u-o,o,Math.PI/2,Math.PI),t.lineTo(a,s+n),0!==n&&t.arc(a+n,s+n,n,Math.PI,1.5*Math.PI)}function Ve(t){return We(t),d(t.rich,We),t}function We(t){if(t){t.font=Be(t);var e=t.textAlign;"middle"===e&&(e="center"),t.textAlign=null==e||_m[e]?e:"left";var n=t.textVerticalAlign||t.textBaseline;"center"===n&&(n="middle"),t.textVerticalAlign=null==n||wm[n]?n:"top",t.textPadding&&(t.textPadding=k(t.textPadding))}}function He(t,e,n,i,r,o){i.rich?Ze(t,e,n,i,r):Ge(t,e,n,i,r,o)}function Ge(t,e,n,i,r,o){var a=o&&o.style,s=a&&"text"===o.type,l=i.font||ym;s&&l===(a.font||ym)||(e.font=l);var u=t.__computedFont;t.__styleFont!==l&&(t.__styleFont=l,u=t.__computedFont=e.font);var h=i.textPadding,c=t.__textCotentBlock;c&&!t.__dirtyText||(c=t.__textCotentBlock=Ee(n,u,h,i.truncate));var d=c.outerHeight,f=c.lines,p=c.lineHeight,g=Ke(d,i,r),m=g.baseX,v=g.baseY,y=g.textAlign||"left",x=g.textVerticalAlign;Xe(e,i,r,m,v);var _=Ce(v,d,x),w=m,b=_,S=je(i);if(S||h){var M=be(n,u);h&&(M+=h[1]+h[3]);var I=Te(m,M,y);S&&qe(t,e,i,I,_,M,d),h&&(w=nn(m,y,h),b+=h[0])}e.textAlign=y,e.textBaseline="middle";for(N=0;N<bm.length;N++){var T=bm[N],C=T[0],A=T[1],D=i[C];s&&D===a[C]||(e[A]=rm(e,A,D||T[2]))}b+=p/2;var k=i.textStrokeWidth,P=s?a.textStrokeWidth:null,L=!s||k!==P,O=!s||L||i.textStroke!==a.textStroke,z=Je(i.textStroke,k),E=tn(i.textFill);if(z&&(L&&(e.lineWidth=k),O&&(e.strokeStyle=z)),E&&(s&&i.textFill===a.textFill&&!a.textBackgroundColor||(e.fillStyle=E)),1===f.length)z&&e.strokeText(f[0],w,b),E&&e.fillText(f[0],w,b);else for(var N=0;N<f.length;N++)z&&e.strokeText(f[N],w,b),E&&e.fillText(f[N],w,b),b+=p}function Ze(t,e,n,i,r){var o=t.__textCotentBlock;o&&!t.__dirtyText||(o=t.__textCotentBlock=Ne(n,i)),Ue(t,e,o,i,r)}function Ue(t,e,n,i,r){var o=n.width,a=n.outerWidth,s=n.outerHeight,l=i.textPadding,u=Ke(s,i,r),h=u.baseX,c=u.baseY,d=u.textAlign,f=u.textVerticalAlign;Xe(e,i,r,h,c);var p=Te(h,a,d),g=Ce(c,s,f),m=p,v=g;l&&(m+=l[3],v+=l[0]);var y=m+o;je(i)&&qe(t,e,i,p,g,a,s);for(var x=0;x<n.lines.length;x++){for(var _,w=n.lines[x],b=w.tokens,S=b.length,M=w.lineHeight,I=w.width,T=0,C=m,A=y,D=S-1;T<S&&(!(_=b[T]).textAlign||"left"===_.textAlign);)Ye(t,e,_,i,M,v,C,"left"),I-=_.width,C+=_.width,T++;for(;D>=0&&"right"===(_=b[D]).textAlign;)Ye(t,e,_,i,M,v,A,"right"),I-=_.width,A-=_.width,D--;for(C+=(o-(C-m)-(y-A)-I)/2;T<=D;)Ye(t,e,_=b[T],i,M,v,C+_.width/2,"center"),C+=_.width,T++;v+=M}}function Xe(t,e,n,i,r){if(n&&e.textRotation){var o=e.textOrigin;"center"===o?(i=n.width/2+n.x,r=n.height/2+n.y):o&&(i=o[0]+n.x,r=o[1]+n.y),t.translate(i,r),t.rotate(-e.textRotation),t.translate(-i,-r)}}function Ye(t,e,n,i,r,o,a,s){var l=i.rich[n.styleName]||{};l.text=n.text;var u=n.textVerticalAlign,h=o+r/2;"top"===u?h=o+n.height/2:"bottom"===u&&(h=o+r-n.height/2),!n.isLineHolder&&je(l)&&qe(t,e,l,"right"===s?a-n.width:"center"===s?a-n.width/2:a,h-n.height/2,n.width,n.height);var c=n.textPadding;c&&(a=nn(a,s,c),h-=n.height/2-c[2]-n.textHeight/2),Qe(e,"shadowBlur",A(l.textShadowBlur,i.textShadowBlur,0)),Qe(e,"shadowColor",l.textShadowColor||i.textShadowColor||"transparent"),Qe(e,"shadowOffsetX",A(l.textShadowOffsetX,i.textShadowOffsetX,0)),Qe(e,"shadowOffsetY",A(l.textShadowOffsetY,i.textShadowOffsetY,0)),Qe(e,"textAlign",s),Qe(e,"textBaseline","middle"),Qe(e,"font",n.font||ym);var d=Je(l.textStroke||i.textStroke,p),f=tn(l.textFill||i.textFill),p=C(l.textStrokeWidth,i.textStrokeWidth);d&&(Qe(e,"lineWidth",p),Qe(e,"strokeStyle",d),e.strokeText(n.text,a,h)),f&&(Qe(e,"fillStyle",f),e.fillText(n.text,a,h))}function je(t){return t.textBackgroundColor||t.textBorderWidth&&t.textBorderColor}function qe(t,e,n,i,r,o,a){var s=n.textBackgroundColor,l=n.textBorderWidth,u=n.textBorderColor,h=_(s);if(Qe(e,"shadowBlur",n.textBoxShadowBlur||0),Qe(e,"shadowColor",n.textBoxShadowColor||"transparent"),Qe(e,"shadowOffsetX",n.textBoxShadowOffsetX||0),Qe(e,"shadowOffsetY",n.textBoxShadowOffsetY||0),h||l&&u){e.beginPath();var c=n.textBorderRadius;c?Fe(e,{x:i,y:r,width:o,height:a,r:c}):e.rect(i,r,o,a),e.closePath()}if(h)if(Qe(e,"fillStyle",s),null!=n.fillOpacity){f=e.globalAlpha;e.globalAlpha=n.fillOpacity*n.opacity,e.fill(),e.globalAlpha=f}else e.fill();else if(x(s))Qe(e,"fillStyle",s(n)),e.fill();else if(w(s)){var d=s.image;(d=xe(d,null,t,$e,s))&&we(d)&&e.drawImage(d,i,r,o,a)}if(l&&u)if(Qe(e,"lineWidth",l),Qe(e,"strokeStyle",u),null!=n.strokeOpacity){var f=e.globalAlpha;e.globalAlpha=n.strokeOpacity*n.opacity,e.stroke(),e.globalAlpha=f}else e.stroke()}function $e(t,e){e.image=t}function Ke(t,e,n){var i=e.x||0,r=e.y||0,o=e.textAlign,a=e.textVerticalAlign;if(n){var s=e.textPosition;if(s instanceof Array)i=n.x+en(s[0],n.width),r=n.y+en(s[1],n.height);else{var l=Ae(s,n,e.textDistance);i=l.x,r=l.y,o=o||l.textAlign,a=a||l.textVerticalAlign}var u=e.textOffset;u&&(i+=u[0],r+=u[1])}return{baseX:i,baseY:r,textAlign:o,textVerticalAlign:a}}function Qe(t,e,n){return t[e]=rm(t,e,n),t[e]}function Je(t,e){return null==t||e<=0||"transparent"===t||"none"===t?null:t.image||t.colorStops?"#000":t}function tn(t){return null==t||"none"===t?null:t.image||t.colorStops?"#000":t}function en(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t}function nn(t,e,n){return"right"===e?t-n[1]:"center"===e?t+n[3]/2-n[1]/2:t+n[3]}function rn(t,e){return null!=t&&(t||e.textBackgroundColor||e.textBorderWidth&&e.textBorderColor||e.textPadding)}function on(t){t=t||{},qg.call(this,t);for(var e in t)t.hasOwnProperty(e)&&"style"!==e&&(this[e]=t[e]);this.style=new am(t.style,this),this._rect=null,this.__clipPaths=[]}function an(t){on.call(this,t)}function sn(t){return parseInt(t,10)}function ln(t){return!!t&&(!!t.__builtin__||"function"==typeof t.resize&&"function"==typeof t.refresh)}function un(t,e,n){return Im.copy(t.getBoundingRect()),t.transform&&Im.applyTransform(t.transform),Tm.width=e,Tm.height=n,!Im.intersect(Tm)}function hn(t,e){if(t==e)return!1;if(!t||!e||t.length!==e.length)return!0;for(var n=0;n<t.length;n++)if(t[n]!==e[n])return!0}function cn(t,e){for(var n=0;n<t.length;n++){var i=t[n];i.setTransform(e),e.beginPath(),i.buildPath(e,i.shape),e.clip(),i.restoreTransform(e)}}function dn(t,e){var n=document.createElement("div");return n.style.cssText=["position:relative","overflow:hidden","width:"+t+"px","height:"+e+"px","padding:0","margin:0","border-width:0"].join(";")+";",n}function fn(t){var e=t[1][0]-t[0][0],n=t[1][1]-t[0][1];return Math.sqrt(e*e+n*n)}function pn(t){return[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2]}function gn(t){return"mousewheel"===t&&Xp.browser.firefox?"DOMMouseScroll":t}function mn(t,e,n){var i=t._gestureMgr;"start"===n&&i.clear();var r=i.recognize(e,t.handler.findHover(e.zrX,e.zrY,null).target,t.dom);if("end"===n&&i.clear(),r){var o=r.type;e.gestureEvent=o,t.handler.dispatchToElement({target:r.target},o,r.event)}}function vn(t){t._touching=!0,clearTimeout(t._touchTimer),t._touchTimer=setTimeout(function(){t._touching=!1},700)}function yn(t){var e=t.pointerType;return"pen"===e||"touch"===e}function xn(t){function e(t,e){return function(){if(!e._touching)return t.apply(e,arguments)}}d(Lm,function(e){t._handlers[e]=m(Em[e],t)}),d(zm,function(e){t._handlers[e]=m(Em[e],t)}),d(Pm,function(n){t._handlers[n]=e(Em[n],t)})}function _n(t){function e(e,n){d(e,function(e){at(t,gn(e),n._handlers[e])},n)}pg.call(this),this.dom=t,this._touching=!1,this._touchTimer,this._gestureMgr=new Dm,this._handlers={},xn(this),Xp.pointerEventsSupported?e(zm,this):(Xp.touchEventsSupported&&e(Lm,this),e(Pm,this))}function wn(t,e){var n=new Vm(Zp(),t,e);return Fm[n.id]=n,n}function bn(t,e){Bm[t]=e}function Sn(t){delete Fm[t]}function Mn(t){return t instanceof Array?t:null==t?[]:[t]}function In(t,e,n){if(t){t[e]=t[e]||{},t.emphasis=t.emphasis||{},t.emphasis[e]=t.emphasis[e]||{};for(var i=0,r=n.length;i<r;i++){var o=n[i];!t.emphasis[e].hasOwnProperty(o)&&t[e].hasOwnProperty(o)&&(t.emphasis[e][o]=t[e][o])}}}function Tn(t){return!Gm(t)||Zm(t)||t instanceof Date?t:t.value}function Cn(t){return Gm(t)&&!(t instanceof Array)}function An(t,e){e=(e||[]).slice();var n=f(t||[],function(t,e){return{exist:t}});return Hm(e,function(t,i){if(Gm(t)){for(r=0;r<n.length;r++)if(!n[r].option&&null!=t.id&&n[r].exist.id===t.id+"")return n[r].option=t,void(e[i]=null);for(var r=0;r<n.length;r++){var o=n[r].exist;if(!(n[r].option||null!=o.id&&null!=t.id||null==t.name||Pn(t)||Pn(o)||o.name!==t.name+""))return n[r].option=t,void(e[i]=null)}}}),Hm(e,function(t,e){if(Gm(t)){for(var i=0;i<n.length;i++){var r=n[i].exist;if(!n[i].option&&!Pn(r)&&null==t.id){n[i].option=t;break}}i>=n.length&&n.push({option:t})}}),n}function Dn(t){var e=N();Hm(t,function(t,n){var i=t.exist;i&&e.set(i.id,t)}),Hm(t,function(t,n){var i=t.option;P(!i||null==i.id||!e.get(i.id)||e.get(i.id)===t,"id duplicates: "+(i&&i.id)),i&&null!=i.id&&e.set(i.id,t),!t.keyInfo&&(t.keyInfo={})}),Hm(t,function(t,n){var i=t.exist,r=t.option,o=t.keyInfo;if(Gm(r)){if(o.name=null!=r.name?r.name+"":i?i.name:Um+n,i)o.id=i.id;else if(null!=r.id)o.id=r.id+"";else{var a=0;do{o.id="\0"+o.name+"\0"+a++}while(e.get(o.id))}e.set(o.id,t)}})}function kn(t){var e=t.name;return!(!e||!e.indexOf(Um))}function Pn(t){return Gm(t)&&t.id&&0===(t.id+"").indexOf("\0_ec_\0")}function Ln(t,e){return null!=e.dataIndexInside?e.dataIndexInside:null!=e.dataIndex?y(e.dataIndex)?f(e.dataIndex,function(e){return t.indexOfRawIndex(e)}):t.indexOfRawIndex(e.dataIndex):null!=e.name?y(e.name)?f(e.name,function(e){return t.indexOfName(e)}):t.indexOfName(e.name):void 0}function On(){var t="__\0ec_inner_"+Ym+++"_"+Math.random().toFixed(5);return function(e){return e[t]||(e[t]={})}}function zn(t,e,n){if(_(e)){var i={};i[e+"Index"]=0,e=i}var r=n&&n.defaultMainType;!r||En(e,r+"Index")||En(e,r+"Id")||En(e,r+"Name")||(e[r+"Index"]=0);var o={};return Hm(e,function(i,r){var i=e[r];if("dataIndex"!==r&&"dataIndexInside"!==r){var a=r.match(/^(\w+)(Index|Id|Name)$/)||[],s=a[1],u=(a[2]||"").toLowerCase();if(!(!s||!u||null==i||"index"===u&&"none"===i||n&&n.includeMainTypes&&l(n.includeMainTypes,s)<0)){var h={mainType:s};"index"===u&&"all"===i||(h[u]=i);var c=t.queryComponents(h);o[s+"Models"]=c,o[s+"Model"]=c[0]}}else o[r]=i}),o}function En(t,e){return t&&t.hasOwnProperty(e)}function Nn(t,e,n){t.setAttribute?t.setAttribute(e,n):t[e]=n}function Rn(t,e){return t.getAttribute?t.getAttribute(e):t[e]}function Bn(t){return"auto"===t?Xp.domSupported?"html":"richText":t||"html"}function Fn(t){var e={main:"",sub:""};return t&&(t=t.split(jm),e.main=t[0]||"",e.sub=t[1]||""),e}function Vn(t){P(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(t),'componentType "'+t+'" illegal')}function Wn(t,e){t.$constructor=t,t.extend=function(t){var e=this,n=function(){t.$constructor?t.$constructor.apply(this,arguments):e.apply(this,arguments)};return o(n.prototype,t),n.extend=this.extend,n.superCall=Gn,n.superApply=Zn,u(n,this),n.superClass=e,n}}function Hn(t){var e=["__\0is_clz",$m++,Math.random().toFixed(3)].join("_");t.prototype[e]=!0,t.isInstance=function(t){return!(!t||!t[e])}}function Gn(t,e){var n=D(arguments,2);return this.superClass.prototype[e].apply(t,n)}function Zn(t,e,n){return this.superClass.prototype[e].apply(t,n)}function Un(t,e){function n(t){var e=i[t.main];return e&&e[qm]||((e=i[t.main]={})[qm]=!0),e}e=e||{};var i={};if(t.registerClass=function(t,e){return e&&(Vn(e),(e=Fn(e)).sub?e.sub!==qm&&(n(e)[e.sub]=t):i[e.main]=t),t},t.getClass=function(t,e,n){var r=i[t];if(r&&r[qm]&&(r=e?r[e]:null),n&&!r)throw new Error(e?"Component "+t+"."+(e||"")+" not exists. Load it first.":t+".type should be specified.");return r},t.getClassesByMainType=function(t){t=Fn(t);var e=[],n=i[t.main];return n&&n[qm]?d(n,function(t,n){n!==qm&&e.push(t)}):e.push(n),e},t.hasClass=function(t){return t=Fn(t),!!i[t.main]},t.getAllClassMainTypes=function(){var t=[];return d(i,function(e,n){t.push(n)}),t},t.hasSubTypes=function(t){t=Fn(t);var e=i[t.main];return e&&e[qm]},t.parseClassType=Fn,e.registerWhenExtend){var r=t.extend;r&&(t.extend=function(e){var n=r.call(this,e);return t.registerClass(n,e.type)})}return t}function Xn(t){return t>-rv&&t<rv}function Yn(t){return t>rv||t<-rv}function jn(t,e,n,i,r){var o=1-r;return o*o*(o*t+3*r*e)+r*r*(r*i+3*o*n)}function qn(t,e,n,i,r){var o=1-r;return 3*(((e-t)*o+2*(n-e)*r)*o+(i-n)*r*r)}function $n(t,e,n,i,r,o){var a=i+3*(e-n)-t,s=3*(n-2*e+t),l=3*(e-t),u=t-r,h=s*s-3*a*l,c=s*l-9*a*u,d=l*l-3*s*u,f=0;if(Xn(h)&&Xn(c))Xn(s)?o[0]=0:(M=-l/s)>=0&&M<=1&&(o[f++]=M);else{var p=c*c-4*h*d;if(Xn(p)){var g=c/h,m=-g/2;(M=-s/a+g)>=0&&M<=1&&(o[f++]=M),m>=0&&m<=1&&(o[f++]=m)}else if(p>0){var v=iv(p),y=h*s+1.5*a*(-c+v),x=h*s+1.5*a*(-c-v);(M=(-s-((y=y<0?-nv(-y,sv):nv(y,sv))+(x=x<0?-nv(-x,sv):nv(x,sv))))/(3*a))>=0&&M<=1&&(o[f++]=M)}else{var _=(2*h*s-3*a*c)/(2*iv(h*h*h)),w=Math.acos(_)/3,b=iv(h),S=Math.cos(w),M=(-s-2*b*S)/(3*a),m=(-s+b*(S+av*Math.sin(w)))/(3*a),I=(-s+b*(S-av*Math.sin(w)))/(3*a);M>=0&&M<=1&&(o[f++]=M),m>=0&&m<=1&&(o[f++]=m),I>=0&&I<=1&&(o[f++]=I)}}return f}function Kn(t,e,n,i,r){var o=6*n-12*e+6*t,a=9*e+3*i-3*t-9*n,s=3*e-3*t,l=0;if(Xn(a))Yn(o)&&(c=-s/o)>=0&&c<=1&&(r[l++]=c);else{var u=o*o-4*a*s;if(Xn(u))r[0]=-o/(2*a);else if(u>0){var h=iv(u),c=(-o+h)/(2*a),d=(-o-h)/(2*a);c>=0&&c<=1&&(r[l++]=c),d>=0&&d<=1&&(r[l++]=d)}}return l}function Qn(t,e,n,i,r,o){var a=(e-t)*r+t,s=(n-e)*r+e,l=(i-n)*r+n,u=(s-a)*r+a,h=(l-s)*r+s,c=(h-u)*r+u;o[0]=t,o[1]=a,o[2]=u,o[3]=c,o[4]=c,o[5]=h,o[6]=l,o[7]=i}function Jn(t,e,n,i,r,o,a,s,l,u,h){var c,d,f,p,g,m=.005,v=1/0;lv[0]=l,lv[1]=u;for(var y=0;y<1;y+=.05)uv[0]=jn(t,n,r,a,y),uv[1]=jn(e,i,o,s,y),(p=cg(lv,uv))<v&&(c=y,v=p);v=1/0;for(var x=0;x<32&&!(m<ov);x++)d=c-m,f=c+m,uv[0]=jn(t,n,r,a,d),uv[1]=jn(e,i,o,s,d),p=cg(uv,lv),d>=0&&p<v?(c=d,v=p):(hv[0]=jn(t,n,r,a,f),hv[1]=jn(e,i,o,s,f),g=cg(hv,lv),f<=1&&g<v?(c=f,v=g):m*=.5);return h&&(h[0]=jn(t,n,r,a,c),h[1]=jn(e,i,o,s,c)),iv(v)}function ti(t,e,n,i){var r=1-i;return r*(r*t+2*i*e)+i*i*n}function ei(t,e,n,i){return 2*((1-i)*(e-t)+i*(n-e))}function ni(t,e,n,i,r){var o=t-2*e+n,a=2*(e-t),s=t-i,l=0;if(Xn(o))Yn(a)&&(c=-s/a)>=0&&c<=1&&(r[l++]=c);else{var u=a*a-4*o*s;if(Xn(u))(c=-a/(2*o))>=0&&c<=1&&(r[l++]=c);else if(u>0){var h=iv(u),c=(-a+h)/(2*o),d=(-a-h)/(2*o);c>=0&&c<=1&&(r[l++]=c),d>=0&&d<=1&&(r[l++]=d)}}return l}function ii(t,e,n){var i=t+n-2*e;return 0===i?.5:(t-e)/i}function ri(t,e,n,i,r){var o=(e-t)*i+t,a=(n-e)*i+e,s=(a-o)*i+o;r[0]=t,r[1]=o,r[2]=s,r[3]=s,r[4]=a,r[5]=n}function oi(t,e,n,i,r,o,a,s,l){var u,h=.005,c=1/0;lv[0]=a,lv[1]=s;for(var d=0;d<1;d+=.05)uv[0]=ti(t,n,r,d),uv[1]=ti(e,i,o,d),(m=cg(lv,uv))<c&&(u=d,c=m);c=1/0;for(var f=0;f<32&&!(h<ov);f++){var p=u-h,g=u+h;uv[0]=ti(t,n,r,p),uv[1]=ti(e,i,o,p);var m=cg(uv,lv);if(p>=0&&m<c)u=p,c=m;else{hv[0]=ti(t,n,r,g),hv[1]=ti(e,i,o,g);var v=cg(hv,lv);g<=1&&v<c?(u=g,c=v):h*=.5}}return l&&(l[0]=ti(t,n,r,u),l[1]=ti(e,i,o,u)),iv(c)}function ai(t,e,n){if(0!==t.length){var i,r=t[0],o=r[0],a=r[0],s=r[1],l=r[1];for(i=1;i<t.length;i++)r=t[i],o=cv(o,r[0]),a=dv(a,r[0]),s=cv(s,r[1]),l=dv(l,r[1]);e[0]=o,e[1]=s,n[0]=a,n[1]=l}}function si(t,e,n,i,r,o){r[0]=cv(t,n),r[1]=cv(e,i),o[0]=dv(t,n),o[1]=dv(e,i)}function li(t,e,n,i,r,o,a,s,l,u){var h,c=Kn,d=jn,f=c(t,n,r,a,xv);for(l[0]=1/0,l[1]=1/0,u[0]=-1/0,u[1]=-1/0,h=0;h<f;h++){var p=d(t,n,r,a,xv[h]);l[0]=cv(p,l[0]),u[0]=dv(p,u[0])}for(f=c(e,i,o,s,_v),h=0;h<f;h++){var g=d(e,i,o,s,_v[h]);l[1]=cv(g,l[1]),u[1]=dv(g,u[1])}l[0]=cv(t,l[0]),u[0]=dv(t,u[0]),l[0]=cv(a,l[0]),u[0]=dv(a,u[0]),l[1]=cv(e,l[1]),u[1]=dv(e,u[1]),l[1]=cv(s,l[1]),u[1]=dv(s,u[1])}function ui(t,e,n,i,r,o,a,s){var l=ii,u=ti,h=dv(cv(l(t,n,r),1),0),c=dv(cv(l(e,i,o),1),0),d=u(t,n,r,h),f=u(e,i,o,c);a[0]=cv(t,r,d),a[1]=cv(e,o,f),s[0]=dv(t,r,d),s[1]=dv(e,o,f)}function hi(t,e,n,i,r,o,a,s,l){var u=K,h=Q,c=Math.abs(r-o);if(c%gv<1e-4&&c>1e-4)return s[0]=t-n,s[1]=e-i,l[0]=t+n,void(l[1]=e+i);if(mv[0]=pv(r)*n+t,mv[1]=fv(r)*i+e,vv[0]=pv(o)*n+t,vv[1]=fv(o)*i+e,u(s,mv,vv),h(l,mv,vv),(r%=gv)<0&&(r+=gv),(o%=gv)<0&&(o+=gv),r>o&&!a?o+=gv:r<o&&a&&(r+=gv),a){var d=o;o=r,r=d}for(var f=0;f<o;f+=Math.PI/2)f>r&&(yv[0]=pv(f)*n+t,yv[1]=fv(f)*i+e,u(s,yv,s),h(l,yv,l))}function ci(t,e,n,i,r,o,a){if(0===r)return!1;var s=r,l=0,u=t;if(a>e+s&&a>i+s||a<e-s&&a<i-s||o>t+s&&o>n+s||o<t-s&&o<n-s)return!1;if(t===n)return Math.abs(o-t)<=s/2;var h=(l=(e-i)/(t-n))*o-a+(u=(t*i-n*e)/(t-n));return h*h/(l*l+1)<=s/2*s/2}function di(t,e,n,i,r,o,a,s,l,u,h){if(0===l)return!1;var c=l;return!(h>e+c&&h>i+c&&h>o+c&&h>s+c||h<e-c&&h<i-c&&h<o-c&&h<s-c||u>t+c&&u>n+c&&u>r+c&&u>a+c||u<t-c&&u<n-c&&u<r-c&&u<a-c)&&Jn(t,e,n,i,r,o,a,s,u,h,null)<=c/2}function fi(t,e,n,i,r,o,a,s,l){if(0===a)return!1;var u=a;return!(l>e+u&&l>i+u&&l>o+u||l<e-u&&l<i-u&&l<o-u||s>t+u&&s>n+u&&s>r+u||s<t-u&&s<n-u&&s<r-u)&&oi(t,e,n,i,r,o,s,l,null)<=u/2}function pi(t){return(t%=zv)<0&&(t+=zv),t}function gi(t,e,n,i,r,o,a,s,l){if(0===a)return!1;var u=a;s-=t,l-=e;var h=Math.sqrt(s*s+l*l);if(h-u>n||h+u<n)return!1;if(Math.abs(i-r)%Ev<1e-4)return!0;if(o){var c=i;i=pi(r),r=pi(c)}else i=pi(i),r=pi(r);i>r&&(r+=Ev);var d=Math.atan2(l,s);return d<0&&(d+=Ev),d>=i&&d<=r||d+Ev>=i&&d+Ev<=r}function mi(t,e,n,i,r,o){if(o>e&&o>i||o<e&&o<i)return 0;if(i===e)return 0;var a=i<e?1:-1,s=(o-e)/(i-e);1!==s&&0!==s||(a=i<e?.5:-.5);var l=s*(n-t)+t;return l===r?1/0:l>r?a:0}function vi(t,e){return Math.abs(t-e)<Bv}function yi(){var t=Vv[0];Vv[0]=Vv[1],Vv[1]=t}function xi(t,e,n,i,r,o,a,s,l,u){if(u>e&&u>i&&u>o&&u>s||u<e&&u<i&&u<o&&u<s)return 0;var h=$n(e,i,o,s,u,Fv);if(0===h)return 0;for(var c,d,f=0,p=-1,g=0;g<h;g++){var m=Fv[g],v=0===m||1===m?.5:1;jn(t,n,r,a,m)<l||(p<0&&(p=Kn(e,i,o,s,Vv),Vv[1]<Vv[0]&&p>1&&yi(),c=jn(e,i,o,s,Vv[0]),p>1&&(d=jn(e,i,o,s,Vv[1]))),2==p?m<Vv[0]?f+=c<e?v:-v:m<Vv[1]?f+=d<c?v:-v:f+=s<d?v:-v:m<Vv[0]?f+=c<e?v:-v:f+=s<c?v:-v)}return f}function _i(t,e,n,i,r,o,a,s){if(s>e&&s>i&&s>o||s<e&&s<i&&s<o)return 0;var l=ni(e,i,o,s,Fv);if(0===l)return 0;var u=ii(e,i,o);if(u>=0&&u<=1){for(var h=0,c=ti(e,i,o,u),d=0;d<l;d++){f=0===Fv[d]||1===Fv[d]?.5:1;(p=ti(t,n,r,Fv[d]))<a||(Fv[d]<u?h+=c<e?f:-f:h+=o<c?f:-f)}return h}var f=0===Fv[0]||1===Fv[0]?.5:1,p=ti(t,n,r,Fv[0]);return p<a?0:o<e?f:-f}function wi(t,e,n,i,r,o,a,s){if((s-=e)>n||s<-n)return 0;u=Math.sqrt(n*n-s*s);Fv[0]=-u,Fv[1]=u;var l=Math.abs(i-r);if(l<1e-4)return 0;if(l%Rv<1e-4){i=0,r=Rv;p=o?1:-1;return a>=Fv[0]+t&&a<=Fv[1]+t?p:0}if(o){var u=i;i=pi(r),r=pi(u)}else i=pi(i),r=pi(r);i>r&&(r+=Rv);for(var h=0,c=0;c<2;c++){var d=Fv[c];if(d+t>a){var f=Math.atan2(s,d),p=o?1:-1;f<0&&(f=Rv+f),(f>=i&&f<=r||f+Rv>=i&&f+Rv<=r)&&(f>Math.PI/2&&f<1.5*Math.PI&&(p=-p),h+=p)}}return h}function bi(t,e,n,i,r){for(var o=0,a=0,s=0,l=0,u=0,h=0;h<t.length;){var c=t[h++];switch(c===Nv.M&&h>1&&(n||(o+=mi(a,s,l,u,i,r))),1==h&&(l=a=t[h],u=s=t[h+1]),c){case Nv.M:a=l=t[h++],s=u=t[h++];break;case Nv.L:if(n){if(ci(a,s,t[h],t[h+1],e,i,r))return!0}else o+=mi(a,s,t[h],t[h+1],i,r)||0;a=t[h++],s=t[h++];break;case Nv.C:if(n){if(di(a,s,t[h++],t[h++],t[h++],t[h++],t[h],t[h+1],e,i,r))return!0}else o+=xi(a,s,t[h++],t[h++],t[h++],t[h++],t[h],t[h+1],i,r)||0;a=t[h++],s=t[h++];break;case Nv.Q:if(n){if(fi(a,s,t[h++],t[h++],t[h],t[h+1],e,i,r))return!0}else o+=_i(a,s,t[h++],t[h++],t[h],t[h+1],i,r)||0;a=t[h++],s=t[h++];break;case Nv.A:var d=t[h++],f=t[h++],p=t[h++],g=t[h++],m=t[h++],v=t[h++],y=(t[h++],1-t[h++]),x=Math.cos(m)*p+d,_=Math.sin(m)*g+f;h>1?o+=mi(a,s,x,_,i,r):(l=x,u=_);var w=(i-d)*g/p+d;if(n){if(gi(d,f,g,m,m+v,y,e,w,r))return!0}else o+=wi(d,f,g,m,m+v,y,w,r);a=Math.cos(m+v)*p+d,s=Math.sin(m+v)*g+f;break;case Nv.R:l=a=t[h++],u=s=t[h++];var x=l+t[h++],_=u+t[h++];if(n){if(ci(l,u,x,u,e,i,r)||ci(x,u,x,_,e,i,r)||ci(x,_,l,_,e,i,r)||ci(l,_,l,u,e,i,r))return!0}else o+=mi(x,u,x,_,i,r),o+=mi(l,_,l,u,i,r);break;case Nv.Z:if(n){if(ci(a,s,l,u,e,i,r))return!0}else o+=mi(a,s,l,u,i,r);a=l,s=u}}return n||vi(s,u)||(o+=mi(a,s,l,u,i,r)||0),0!==o}function Si(t,e,n){return bi(t,0,!1,e,n)}function Mi(t,e,n,i){return bi(t,e,!0,n,i)}function Ii(t){on.call(this,t),this.path=null}function Ti(t,e,n,i,r,o,a,s,l,u,h){var c=l*(Qv/180),d=Kv(c)*(t-n)/2+$v(c)*(e-i)/2,f=-1*$v(c)*(t-n)/2+Kv(c)*(e-i)/2,p=d*d/(a*a)+f*f/(s*s);p>1&&(a*=qv(p),s*=qv(p));var g=(r===o?-1:1)*qv((a*a*(s*s)-a*a*(f*f)-s*s*(d*d))/(a*a*(f*f)+s*s*(d*d)))||0,m=g*a*f/s,v=g*-s*d/a,y=(t+n)/2+Kv(c)*m-$v(c)*v,x=(e+i)/2+$v(c)*m+Kv(c)*v,_=ey([1,0],[(d-m)/a,(f-v)/s]),w=[(d-m)/a,(f-v)/s],b=[(-1*d-m)/a,(-1*f-v)/s],S=ey(w,b);ty(w,b)<=-1&&(S=Qv),ty(w,b)>=1&&(S=0),0===o&&S>0&&(S-=2*Qv),1===o&&S<0&&(S+=2*Qv),h.addData(u,y,x,a,s,_,S,c,o)}function Ci(t){if(!t)return new Ov;for(var e,n=0,i=0,r=n,o=i,a=new Ov,s=Ov.CMD,l=t.match(ny),u=0;u<l.length;u++){for(var h,c=l[u],d=c.charAt(0),f=c.match(iy)||[],p=f.length,g=0;g<p;g++)f[g]=parseFloat(f[g]);for(var m=0;m<p;){var v,y,x,_,w,b,S,M=n,I=i;switch(d){case"l":n+=f[m++],i+=f[m++],h=s.L,a.addData(h,n,i);break;case"L":n=f[m++],i=f[m++],h=s.L,a.addData(h,n,i);break;case"m":n+=f[m++],i+=f[m++],h=s.M,a.addData(h,n,i),r=n,o=i,d="l";break;case"M":n=f[m++],i=f[m++],h=s.M,a.addData(h,n,i),r=n,o=i,d="L";break;case"h":n+=f[m++],h=s.L,a.addData(h,n,i);break;case"H":n=f[m++],h=s.L,a.addData(h,n,i);break;case"v":i+=f[m++],h=s.L,a.addData(h,n,i);break;case"V":i=f[m++],h=s.L,a.addData(h,n,i);break;case"C":h=s.C,a.addData(h,f[m++],f[m++],f[m++],f[m++],f[m++],f[m++]),n=f[m-2],i=f[m-1];break;case"c":h=s.C,a.addData(h,f[m++]+n,f[m++]+i,f[m++]+n,f[m++]+i,f[m++]+n,f[m++]+i),n+=f[m-2],i+=f[m-1];break;case"S":v=n,y=i;var T=a.len(),C=a.data;e===s.C&&(v+=n-C[T-4],y+=i-C[T-3]),h=s.C,M=f[m++],I=f[m++],n=f[m++],i=f[m++],a.addData(h,v,y,M,I,n,i);break;case"s":v=n,y=i;var T=a.len(),C=a.data;e===s.C&&(v+=n-C[T-4],y+=i-C[T-3]),h=s.C,M=n+f[m++],I=i+f[m++],n+=f[m++],i+=f[m++],a.addData(h,v,y,M,I,n,i);break;case"Q":M=f[m++],I=f[m++],n=f[m++],i=f[m++],h=s.Q,a.addData(h,M,I,n,i);break;case"q":M=f[m++]+n,I=f[m++]+i,n+=f[m++],i+=f[m++],h=s.Q,a.addData(h,M,I,n,i);break;case"T":v=n,y=i;var T=a.len(),C=a.data;e===s.Q&&(v+=n-C[T-4],y+=i-C[T-3]),n=f[m++],i=f[m++],h=s.Q,a.addData(h,v,y,n,i);break;case"t":v=n,y=i;var T=a.len(),C=a.data;e===s.Q&&(v+=n-C[T-4],y+=i-C[T-3]),n+=f[m++],i+=f[m++],h=s.Q,a.addData(h,v,y,n,i);break;case"A":x=f[m++],_=f[m++],w=f[m++],b=f[m++],S=f[m++],Ti(M=n,I=i,n=f[m++],i=f[m++],b,S,x,_,w,h=s.A,a);break;case"a":x=f[m++],_=f[m++],w=f[m++],b=f[m++],S=f[m++],Ti(M=n,I=i,n+=f[m++],i+=f[m++],b,S,x,_,w,h=s.A,a)}}"z"!==d&&"Z"!==d||(h=s.Z,a.addData(h),n=r,i=o),e=h}return a.toStatic(),a}function Ai(t,e){var n=Ci(t);return e=e||{},e.buildPath=function(t){if(t.setData)t.setData(n.data),(e=t.getContext())&&t.rebuildPath(e);else{var e=t;n.rebuildPath(e)}},e.applyTransform=function(t){jv(n,t),this.dirty(!0)},e}function Di(t,e){return new Ii(Ai(t,e))}function ki(t,e){return Ii.extend(Ai(t,e))}function Pi(t,e,n,i,r,o,a){var s=.5*(n-t),l=.5*(i-e);return(2*(e-n)+s+l)*a+(-3*(e-n)-2*s-l)*o+s*r+e}function Li(t,e,n){var i=e.points,r=e.smooth;if(i&&i.length>=2){if(r&&"spline"!==r){var o=cy(i,r,n,e.smoothConstraint);t.moveTo(i[0][0],i[0][1]);for(var a=i.length,s=0;s<(n?a:a-1);s++){var l=o[2*s],u=o[2*s+1],h=i[(s+1)%a];t.bezierCurveTo(l[0],l[1],u[0],u[1],h[0],h[1])}}else{"spline"===r&&(i=hy(i,n)),t.moveTo(i[0][0],i[0][1]);for(var s=1,c=i.length;s<c;s++)t.lineTo(i[s][0],i[s][1])}n&&t.closePath()}}function Oi(t,e,n){var i=t.cpx2,r=t.cpy2;return null===i||null===r?[(n?qn:jn)(t.x1,t.cpx1,t.cpx2,t.x2,e),(n?qn:jn)(t.y1,t.cpy1,t.cpy2,t.y2,e)]:[(n?ei:ti)(t.x1,t.cpx1,t.x2,e),(n?ei:ti)(t.y1,t.cpy1,t.y2,e)]}function zi(t){on.call(this,t),this._displayables=[],this._temporaryDisplayables=[],this._cursor=0,this.notClear=!0}function Ei(t){return Ii.extend(t)}function Ni(t,e,n,i){var r=Di(t,e);return n&&("center"===i&&(n=Bi(n,r.getBoundingRect())),Fi(r,n)),r}function Ri(t,e,n){var i=new an({style:{image:t,x:e.x,y:e.y,width:e.width,height:e.height},onload:function(t){if("center"===n){var r={width:t.width,height:t.height};i.setStyle(Bi(e,r))}}});return i}function Bi(t,e){var n,i=e.width/e.height,r=t.height*i;return n=r<=t.width?t.height:(r=t.width)/i,{x:t.x+t.width/2-r/2,y:t.y+t.height/2-n/2,width:r,height:n}}function Fi(t,e){if(t.applyTransform){var n=t.getBoundingRect().calculateTransform(e);t.applyTransform(n)}}function Vi(t){var e=t.shape,n=t.style.lineWidth;return My(2*e.x1)===My(2*e.x2)&&(e.x1=e.x2=Hi(e.x1,n,!0)),My(2*e.y1)===My(2*e.y2)&&(e.y1=e.y2=Hi(e.y1,n,!0)),t}function Wi(t){var e=t.shape,n=t.style.lineWidth,i=e.x,r=e.y,o=e.width,a=e.height;return e.x=Hi(e.x,n,!0),e.y=Hi(e.y,n,!0),e.width=Math.max(Hi(i+o,n,!1)-e.x,0===o?0:1),e.height=Math.max(Hi(r+a,n,!1)-e.y,0===a?0:1),t}function Hi(t,e,n){var i=My(2*t);return(i+My(e))%2==0?i/2:(i+(n?1:-1))/2}function Gi(t){return null!=t&&"none"!==t}function Zi(t){if("string"!=typeof t)return t;var e=Ay.get(t);return e||(e=Nt(t,-.1),Dy<1e4&&(Ay.set(t,e),Dy++)),e}function Ui(t){if(t.__hoverStlDirty){t.__hoverStlDirty=!1;var e=t.__hoverStl;if(e){var n=t.__normalStl={},i=t.style;for(var r in e)null!=e[r]&&(n[r]=i[r]);n.fill=i.fill,n.stroke=i.stroke}else t.__normalStl=null}}function Xi(t){var e=t.__hoverStl;if(e&&!t.__highlighted){var n=t.useHoverLayer;t.__highlighted=n?"layer":"plain";var i=t.__zr;if(i||!n){var r=t,o=t.style;n&&(o=(r=i.addHover(t)).style),dr(o),n||Ui(r),o.extendFrom(e),Yi(o,e,"fill"),Yi(o,e,"stroke"),cr(o),n||(t.dirty(!1),t.z2+=1)}}}function Yi(t,e,n){!Gi(e[n])&&Gi(t[n])&&(t[n]=Zi(t[n]))}function ji(t){t.__highlighted&&(qi(t),t.__highlighted=!1)}function qi(t){var e=t.__highlighted;if("layer"===e)t.__zr&&t.__zr.removeHover(t);else if(e){var n=t.style,i=t.__normalStl;i&&(dr(n),t.setStyle(i),cr(n),t.z2-=1)}}function $i(t,e){t.isGroup?t.traverse(function(t){!t.isGroup&&e(t)}):e(t)}function Ki(t,e){e=t.__hoverStl=!1!==e&&(e||{}),t.__hoverStlDirty=!0,t.__highlighted&&(ji(t),Xi(t))}function Qi(t){return t&&t.__isEmphasisEntered}function Ji(t){this.__hoverSilentOnTouch&&t.zrByTouch||!this.__isEmphasisEntered&&$i(this,Xi)}function tr(t){this.__hoverSilentOnTouch&&t.zrByTouch||!this.__isEmphasisEntered&&$i(this,ji)}function er(){this.__isEmphasisEntered=!0,$i(this,Xi)}function nr(){this.__isEmphasisEntered=!1,$i(this,ji)}function ir(t,e,n){t.isGroup?t.traverse(function(t){!t.isGroup&&Ki(t,t.hoverStyle||e)}):Ki(t,t.hoverStyle||e),rr(t,n)}function rr(t,e){var n=!1===e;if(t.__hoverSilentOnTouch=null!=e&&e.hoverSilentOnTouch,!n||t.__hoverStyleTrigger){var i=n?"off":"on";t[i]("mouseover",Ji)[i]("mouseout",tr),t[i]("emphasis",er)[i]("normal",nr),t.__hoverStyleTrigger=!n}}function or(t,e,n,i,r,o,a){var s,l=(r=r||Cy).labelFetcher,u=r.labelDataIndex,h=r.labelDimIndex,c=n.getShallow("show"),d=i.getShallow("show");(c||d)&&(l&&(s=l.getFormattedLabel(u,"normal",null,h)),null==s&&(s=x(r.defaultText)?r.defaultText(u,r):r.defaultText));var f=c?s:null,p=d?C(l?l.getFormattedLabel(u,"emphasis",null,h):null,s):null;null==f&&null==p||(ar(t,n,o,r),ar(e,i,a,r,!0)),t.text=f,e.text=p}function ar(t,e,n,i,r){return sr(t,e,i,r),n&&o(t,n),t}function sr(t,e,n,i){if((n=n||Cy).isRectText){var r=e.getShallow("position")||(i?null:"inside");"outside"===r&&(r="top"),t.textPosition=r,t.textOffset=e.getShallow("offset");var o=e.getShallow("rotate");null!=o&&(o*=Math.PI/180),t.textRotation=o,t.textDistance=C(e.getShallow("distance"),i?null:5)}var a,s=e.ecModel,l=s&&s.option.textStyle,u=lr(e);if(u){a={};for(var h in u)if(u.hasOwnProperty(h)){var c=e.getModel(["rich",h]);ur(a[h]={},c,l,n,i)}}return t.rich=a,ur(t,e,l,n,i,!0),n.forceRich&&!n.textStyle&&(n.textStyle={}),t}function lr(t){for(var e;t&&t!==t.ecModel;){var n=(t.option||Cy).rich;if(n){e=e||{};for(var i in n)n.hasOwnProperty(i)&&(e[i]=1)}t=t.parentModel}return e}function ur(t,e,n,i,r,o){n=!r&&n||Cy,t.textFill=hr(e.getShallow("color"),i)||n.color,t.textStroke=hr(e.getShallow("textBorderColor"),i)||n.textBorderColor,t.textStrokeWidth=C(e.getShallow("textBorderWidth"),n.textBorderWidth),t.insideRawTextPosition=t.textPosition,r||(o&&(t.insideRollbackOpt=i,cr(t)),null==t.textFill&&(t.textFill=i.autoColor)),t.fontStyle=e.getShallow("fontStyle")||n.fontStyle,t.fontWeight=e.getShallow("fontWeight")||n.fontWeight,t.fontSize=e.getShallow("fontSize")||n.fontSize,t.fontFamily=e.getShallow("fontFamily")||n.fontFamily,t.textAlign=e.getShallow("align"),t.textVerticalAlign=e.getShallow("verticalAlign")||e.getShallow("baseline"),t.textLineHeight=e.getShallow("lineHeight"),t.textWidth=e.getShallow("width"),t.textHeight=e.getShallow("height"),t.textTag=e.getShallow("tag"),o&&i.disableBox||(t.textBackgroundColor=hr(e.getShallow("backgroundColor"),i),t.textPadding=e.getShallow("padding"),t.textBorderColor=hr(e.getShallow("borderColor"),i),t.textBorderWidth=e.getShallow("borderWidth"),t.textBorderRadius=e.getShallow("borderRadius"),t.textBoxShadowColor=e.getShallow("shadowColor"),t.textBoxShadowBlur=e.getShallow("shadowBlur"),t.textBoxShadowOffsetX=e.getShallow("shadowOffsetX"),t.textBoxShadowOffsetY=e.getShallow("shadowOffsetY")),t.textShadowColor=e.getShallow("textShadowColor")||n.textShadowColor,t.textShadowBlur=e.getShallow("textShadowBlur")||n.textShadowBlur,t.textShadowOffsetX=e.getShallow("textShadowOffsetX")||n.textShadowOffsetX,t.textShadowOffsetY=e.getShallow("textShadowOffsetY")||n.textShadowOffsetY}function hr(t,e){return"auto"!==t?t:e&&e.autoColor?e.autoColor:null}function cr(t){var e=t.insideRollbackOpt;if(e&&null==t.textFill){var n,i=e.useInsideStyle,r=t.insideRawTextPosition,o=e.autoColor;!1!==i&&(!0===i||e.isRectText&&r&&"string"==typeof r&&r.indexOf("inside")>=0)?(n={textFill:null,textStroke:t.textStroke,textStrokeWidth:t.textStrokeWidth},t.textFill="#fff",null==t.textStroke&&(t.textStroke=o,null==t.textStrokeWidth&&(t.textStrokeWidth=2))):null!=o&&(n={textFill:null},t.textFill=o),n&&(t.insideRollback=n)}}function dr(t){var e=t.insideRollback;e&&(t.textFill=e.textFill,t.textStroke=e.textStroke,t.textStrokeWidth=e.textStrokeWidth,t.insideRollback=null)}function fr(t,e){var n=e||e.getModel("textStyle");return L([t.fontStyle||n&&n.getShallow("fontStyle")||"",t.fontWeight||n&&n.getShallow("fontWeight")||"",(t.fontSize||n&&n.getShallow("fontSize")||12)+"px",t.fontFamily||n&&n.getShallow("fontFamily")||"sans-serif"].join(" "))}function pr(t,e,n,i,r,o){if("function"==typeof r&&(o=r,r=null),i&&i.isAnimationEnabled()){var a=t?"Update":"",s=i.getShallow("animationDuration"+a),l=i.getShallow("animationEasing"+a),u=i.getShallow("animationDelay"+a);"function"==typeof u&&(u=u(r,i.getAnimationDelayParams?i.getAnimationDelayParams(e,r):null)),"function"==typeof s&&(s=s(r)),s>0?e.animateTo(n,s,u||0,l,o,!!o):(e.stopAnimation(),e.attr(n),o&&o())}else e.stopAnimation(),e.attr(n),o&&o()}function gr(t,e,n,i,r){pr(!0,t,e,n,i,r)}function mr(t,e,n,i,r){pr(!1,t,e,n,i,r)}function vr(t,e){for(var n=pt([]);t&&t!==e;)mt(n,t.getLocalTransform(),n),t=t.parent;return n}function yr(t,e,n){return e&&!c(e)&&(e=Ig.getLocalTransform(e)),n&&(e=_t([],e)),$([],t,e)}function xr(t,e,n){var i=0===e[4]||0===e[5]||0===e[0]?1:Math.abs(2*e[4]/e[0]),r=0===e[4]||0===e[5]||0===e[2]?1:Math.abs(2*e[4]/e[2]),o=["left"===t?-i:"right"===t?i:0,"top"===t?-r:"bottom"===t?r:0];return o=yr(o,e,n),Math.abs(o[0])>Math.abs(o[1])?o[0]>0?"right":"left":o[1]>0?"bottom":"top"}function _r(t,e,n,i){function r(t){var e={position:V(t.position),rotation:t.rotation};return t.shape&&(e.shape=o({},t.shape)),e}if(t&&e){var a=function(t){var e={};return t.traverse(function(t){!t.isGroup&&t.anid&&(e[t.anid]=t)}),e}(t);e.traverse(function(t){if(!t.isGroup&&t.anid){var e=a[t.anid];if(e){var i=r(t);t.attr(r(e)),gr(t,i,n,t.dataIndex)}}})}}function wr(t,e){return f(t,function(t){var n=t[0];n=Iy(n,e.x),n=Ty(n,e.x+e.width);var i=t[1];return i=Iy(i,e.y),i=Ty(i,e.y+e.height),[n,i]})}function br(t,e,n){var i=(e=o({rectHover:!0},e)).style={strokeNoScale:!0};if(n=n||{x:-1,y:-1,width:2,height:2},t)return 0===t.indexOf("image://")?(i.image=t.slice(8),a(i,n),new an(e)):Ni(t.replace("path://",""),e,n,"center")}function Sr(t,e,n){this.parentModel=e,this.ecModel=n,this.option=t}function Mr(t,e,n){for(var i=0;i<e.length&&(!e[i]||null!=(t=t&&"object"==typeof t?t[e[i]]:null));i++);return null==t&&n&&(t=n.get(e)),t}function Ir(t,e){var n=Ny(t).getParent;return n?n.call(t,e):t.parentModel}function Tr(t){return[t||"",Ry++,Math.random().toFixed(5)].join("_")}function Cr(t){return t.replace(/^\s+/,"").replace(/\s+$/,"")}function Ar(t,e,n,i){var r=e[1]-e[0],o=n[1]-n[0];if(0===r)return 0===o?n[0]:(n[0]+n[1])/2;if(i)if(r>0){if(t<=e[0])return n[0];if(t>=e[1])return n[1]}else{if(t>=e[0])return n[0];if(t<=e[1])return n[1]}else{if(t===e[0])return n[0];if(t===e[1])return n[1]}return(t-e[0])/r*o+n[0]}function Dr(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return"string"==typeof t?Cr(t).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t}function kr(t,e,n){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),n?t:+t}function Pr(t){return t.sort(function(t,e){return t-e}),t}function Lr(t){if(t=+t,isNaN(t))return 0;for(var e=1,n=0;Math.round(t*e)/e!==t;)e*=10,n++;return n}function Or(t){var e=t.toString(),n=e.indexOf("e");if(n>0){var i=+e.slice(n+1);return i<0?-i:0}var r=e.indexOf(".");return r<0?0:e.length-1-r}function zr(t,e){var n=Math.log,i=Math.LN10,r=Math.floor(n(t[1]-t[0])/i),o=Math.round(n(Math.abs(e[1]-e[0]))/i),a=Math.min(Math.max(-r+o,0),20);return isFinite(a)?a:20}function Er(t,e,n){if(!t[e])return 0;var i=p(t,function(t,e){return t+(isNaN(e)?0:e)},0);if(0===i)return 0;for(var r=Math.pow(10,n),o=f(t,function(t){return(isNaN(t)?0:t)/i*r*100}),a=100*r,s=f(o,function(t){return Math.floor(t)}),l=p(s,function(t,e){return t+e},0),u=f(o,function(t,e){return t-s[e]});l<a;){for(var h=Number.NEGATIVE_INFINITY,c=null,d=0,g=u.length;d<g;++d)u[d]>h&&(h=u[d],c=d);++s[c],u[c]=0,++l}return s[e]/r}function Nr(t){var e=2*Math.PI;return(t%e+e)%e}function Rr(t){return t>-By&&t<By}function Br(t){if(t instanceof Date)return t;if("string"==typeof t){var e=Fy.exec(t);if(!e)return new Date(NaN);if(e[8]){var n=+e[4]||0;return"Z"!==e[8].toUpperCase()&&(n-=e[8].slice(0,3)),new Date(Date.UTC(+e[1],+(e[2]||1)-1,+e[3]||1,n,+(e[5]||0),+e[6]||0,+e[7]||0))}return new Date(+e[1],+(e[2]||1)-1,+e[3]||1,+e[4]||0,+(e[5]||0),+e[6]||0,+e[7]||0)}return null==t?new Date(NaN):new Date(Math.round(t))}function Fr(t){return Math.pow(10,Vr(t))}function Vr(t){return Math.floor(Math.log(t)/Math.LN10)}function Wr(t,e){var n,i=Vr(t),r=Math.pow(10,i),o=t/r;return n=e?o<1.5?1:o<2.5?2:o<4?3:o<7?5:10:o<1?1:o<2?2:o<3?3:o<5?5:10,t=n*r,i>=-20?+t.toFixed(i<0?-i:0):t}function Hr(t){return isNaN(t)?"-":(t=(t+"").split("."))[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(t.length>1?"."+t[1]:"")}function Gr(t,e){return t=(t||"").toLowerCase().replace(/-(.)/g,function(t,e){return e.toUpperCase()}),e&&t&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t}function Zr(t){return null==t?"":(t+"").replace(Hy,function(t,e){return Gy[e]})}function Ur(t,e,n){y(e)||(e=[e]);var i=e.length;if(!i)return"";for(var r=e[0].$vars||[],o=0;o<r.length;o++){var a=Zy[o];t=t.replace(Uy(a),Uy(a,0))}for(var s=0;s<i;s++)for(var l=0;l<r.length;l++){var u=e[s][r[l]];t=t.replace(Uy(Zy[l],s),n?Zr(u):u)}return t}function Xr(t,e){var n=(t=_(t)?{color:t,extraCssText:e}:t||{}).color,i=t.type,e=t.extraCssText,r=t.renderMode||"html",o=t.markerId||"X";return n?"html"===r?"subItem"===i?'<span style="display:inline-block;vertical-align:middle;margin-right:8px;margin-left:3px;border-radius:4px;width:4px;height:4px;background-color:'+Zr(n)+";"+(e||"")+'"></span>':'<span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:'+Zr(n)+";"+(e||"")+'"></span>':{renderMode:r,content:"{marker"+o+"|} ",style:{color:n}}:""}function Yr(t,e){return t+="","0000".substr(0,e-t.length)+t}function jr(t,e,n){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var i=Br(e),r=n?"UTC":"",o=i["get"+r+"FullYear"](),a=i["get"+r+"Month"]()+1,s=i["get"+r+"Date"](),l=i["get"+r+"Hours"](),u=i["get"+r+"Minutes"](),h=i["get"+r+"Seconds"](),c=i["get"+r+"Milliseconds"]();return t=t.replace("MM",Yr(a,2)).replace("M",a).replace("yyyy",o).replace("yy",o%100).replace("dd",Yr(s,2)).replace("d",s).replace("hh",Yr(l,2)).replace("h",l).replace("mm",Yr(u,2)).replace("m",u).replace("ss",Yr(h,2)).replace("s",h).replace("SSS",Yr(c,3))}function qr(t){return t?t.charAt(0).toUpperCase()+t.substr(1):t}function $r(t,e,n,i,r){var o=0,a=0;null==i&&(i=1/0),null==r&&(r=1/0);var s=0;e.eachChild(function(l,u){var h,c,d=l.position,f=l.getBoundingRect(),p=e.childAt(u+1),g=p&&p.getBoundingRect();if("horizontal"===t){var m=f.width+(g?-g.x+f.x:0);(h=o+m)>i||l.newline?(o=0,h=m,a+=s+n,s=f.height):s=Math.max(s,f.height)}else{var v=f.height+(g?-g.y+f.y:0);(c=a+v)>r||l.newline?(o+=s+n,a=0,c=v,s=f.width):s=Math.max(s,f.width)}l.newline||(d[0]=o,d[1]=a,"horizontal"===t?o=h+n:a=c+n)})}function Kr(t,e,n){n=Wy(n||0);var i=e.width,r=e.height,o=Dr(t.left,i),a=Dr(t.top,r),s=Dr(t.right,i),l=Dr(t.bottom,r),u=Dr(t.width,i),h=Dr(t.height,r),c=n[2]+n[0],d=n[1]+n[3],f=t.aspect;switch(isNaN(u)&&(u=i-s-d-o),isNaN(h)&&(h=r-l-c-a),null!=f&&(isNaN(u)&&isNaN(h)&&(f>i/r?u=.8*i:h=.8*r),isNaN(u)&&(u=f*h),isNaN(h)&&(h=u/f)),isNaN(o)&&(o=i-s-u-d),isNaN(a)&&(a=r-l-h-c),t.left||t.right){case"center":o=i/2-u/2-n[3];break;case"right":o=i-u-d}switch(t.top||t.bottom){case"middle":case"center":a=r/2-h/2-n[0];break;case"bottom":a=r-h-c}o=o||0,a=a||0,isNaN(u)&&(u=i-d-o-(s||0)),isNaN(h)&&(h=r-c-a-(l||0));var p=new re(o+n[3],a+n[0],u,h);return p.margin=n,p}function Qr(t,e,n,i,r){var o=!r||!r.hv||r.hv[0],s=!r||!r.hv||r.hv[1],l=r&&r.boundingMode||"all";if(o||s){var u;if("raw"===l)u="group"===t.type?new re(0,0,+e.width||0,+e.height||0):t.getBoundingRect();else if(u=t.getBoundingRect(),t.needLocalTransform()){var h=t.getLocalTransform();(u=u.clone()).applyTransform(h)}e=Kr(a({width:u.width,height:u.height},e),n,i);var c=t.position,d=o?e.x-u.x:0,f=s?e.y-u.y:0;t.attr("position","raw"===l?[d,f]:[c[0]+d,c[1]+f])}}function Jr(t,e,n){function i(n,i){var a={},l=0,u={},h=0;if(qy(n,function(e){u[e]=t[e]}),qy(n,function(t){r(e,t)&&(a[t]=u[t]=e[t]),o(a,t)&&l++,o(u,t)&&h++}),s[i])return o(e,n[1])?u[n[2]]=null:o(e,n[2])&&(u[n[1]]=null),u;if(2!==h&&l){if(l>=2)return a;for(var c=0;c<n.length;c++){var d=n[c];if(!r(a,d)&&r(t,d)){a[d]=t[d];break}}return a}return u}function r(t,e){return t.hasOwnProperty(e)}function o(t,e){return null!=t[e]&&"auto"!==t[e]}function a(t,e,n){qy(t,function(t){e[t]=n[t]})}!w(n)&&(n={});var s=n.ignoreSize;!y(s)&&(s=[s,s]);var l=i(Ky[0],0),u=i(Ky[1],1);a(Ky[0],t,l),a(Ky[1],t,u)}function to(t){return eo({},t)}function eo(t,e){return e&&t&&qy($y,function(n){e.hasOwnProperty(n)&&(t[n]=e[n])}),t}function no(t,e){for(var n=t.length,i=0;i<n;i++)if(t[i].length>e)return t[i];return t[n-1]}function io(t){var e=t.get("coordinateSystem"),n={coordSysName:e,coordSysDims:[],axisMap:N(),categoryAxisMap:N()},i=ax[e];if(i)return i(t,n,n.axisMap,n.categoryAxisMap),n}function ro(t){return"category"===t.get("type")}function oo(t){this.fromDataset=t.fromDataset,this.data=t.data||(t.sourceFormat===hx?{}:[]),this.sourceFormat=t.sourceFormat||cx,this.seriesLayoutBy=t.seriesLayoutBy||fx,this.dimensionsDefine=t.dimensionsDefine,this.encodeDefine=t.encodeDefine&&N(t.encodeDefine),this.startIndex=t.startIndex||0,this.dimensionsDetectCount=t.dimensionsDetectCount}function ao(t){var e=t.option.source,n=cx;if(S(e))n=dx;else if(y(e)){0===e.length&&(n=lx);for(var i=0,r=e.length;i<r;i++){var o=e[i];if(null!=o){if(y(o)){n=lx;break}if(w(o)){n=ux;break}}}}else if(w(e)){for(var a in e)if(e.hasOwnProperty(a)&&c(e[a])){n=hx;break}}else if(null!=e)throw new Error("Invalid data");gx(t).sourceFormat=n}function so(t){return gx(t).source}function lo(t){gx(t).datasetMap=N()}function uo(t){var e=t.option,n=e.data,i=S(n)?dx:sx,r=!1,o=e.seriesLayoutBy,a=e.sourceHeader,s=e.dimensions,l=mo(t);if(l){var u=l.option;n=u.source,i=gx(l).sourceFormat,r=!0,o=o||u.seriesLayoutBy,null==a&&(a=u.sourceHeader),s=s||u.dimensions}var h=ho(n,i,o,a,s),c=e.encode;!c&&l&&(c=go(t,l,n,i,o,h)),gx(t).source=new oo({data:n,fromDataset:r,seriesLayoutBy:o,sourceFormat:i,dimensionsDefine:h.dimensionsDefine,startIndex:h.startIndex,dimensionsDetectCount:h.dimensionsDetectCount,encodeDefine:c})}function ho(t,e,n,i,r){if(!t)return{dimensionsDefine:co(r)};var o,a,s;if(e===lx)"auto"===i||null==i?fo(function(t){null!=t&&"-"!==t&&(_(t)?null==a&&(a=1):a=0)},n,t,10):a=i?1:0,r||1!==a||(r=[],fo(function(t,e){r[e]=null!=t?t:""},n,t)),o=r?r.length:n===px?t.length:t[0]?t[0].length:null;else if(e===ux)r||(r=po(t),s=!0);else if(e===hx)r||(r=[],s=!0,d(t,function(t,e){r.push(e)}));else if(e===sx){var l=Tn(t[0]);o=y(l)&&l.length||1}var u;return s&&d(r,function(t,e){"name"===(w(t)?t.name:t)&&(u=e)}),{startIndex:a,dimensionsDefine:co(r),dimensionsDetectCount:o,potentialNameDimIndex:u}}function co(t){if(t){var e=N();return f(t,function(t,n){if(null==(t=o({},w(t)?t:{name:t})).name)return t;t.name+="",null==t.displayName&&(t.displayName=t.name);var i=e.get(t.name);return i?t.name+="-"+i.count++:e.set(t.name,{count:1}),t})}}function fo(t,e,n,i){if(null==i&&(i=1/0),e===px)for(o=0;o<n.length&&o<i;o++)t(n[o]?n[o][0]:null,o);else for(var r=n[0]||[],o=0;o<r.length&&o<i;o++)t(r[o],o)}function po(t){for(var e,n=0;n<t.length&&!(e=t[n++]););if(e){var i=[];return d(e,function(t,e){i.push(e)}),i}}function go(t,e,n,i,r,o){var a=io(t),s={},l=[],u=[],h=t.subType,c=N(["pie","map","funnel"]),f=N(["line","bar","pictorialBar","scatter","effectScatter","candlestick","boxplot"]);if(a&&null!=f.get(h)){var p=t.ecModel,g=gx(p).datasetMap,m=e.uid+"_"+r,v=g.get(m)||g.set(m,{categoryWayDim:1,valueWayDim:0});d(a.coordSysDims,function(t){if(null==a.firstCategoryDimIndex){e=v.valueWayDim++;s[t]=e,u.push(e)}else if(a.categoryAxisMap.get(t))s[t]=0,l.push(0);else{var e=v.categoryWayDim++;s[t]=e,u.push(e)}})}else if(null!=c.get(h)){for(var y,x=0;x<5&&null==y;x++)yo(n,i,r,o.dimensionsDefine,o.startIndex,x)||(y=x);if(null!=y){s.value=y;var _=o.potentialNameDimIndex||Math.max(y-1,0);u.push(_),l.push(_)}}return l.length&&(s.itemName=l),u.length&&(s.seriesName=u),s}function mo(t){var e=t.option;if(!e.data)return t.ecModel.getComponent("dataset",e.datasetIndex||0)}function vo(t,e){return yo(t.data,t.sourceFormat,t.seriesLayoutBy,t.dimensionsDefine,t.startIndex,e)}function yo(t,e,n,i,r,o){function a(t){return(null==t||!isFinite(t)||""===t)&&(!(!_(t)||"-"===t)||void 0)}var s;if(S(t))return!1;var l;if(i&&(l=w(l=i[o])?l.name:l),e===lx)if(n===px){for(var u=t[o],h=0;h<(u||[]).length&&h<5;h++)if(null!=(s=a(u[r+h])))return s}else for(h=0;h<t.length&&h<5;h++){var c=t[r+h];if(c&&null!=(s=a(c[o])))return s}else if(e===ux){if(!l)return;for(h=0;h<t.length&&h<5;h++)if((d=t[h])&&null!=(s=a(d[l])))return s}else if(e===hx){if(!l)return;if(!(u=t[l])||S(u))return!1;for(h=0;h<u.length&&h<5;h++)if(null!=(s=a(u[h])))return s}else if(e===sx)for(h=0;h<t.length&&h<5;h++){var d=t[h],f=Tn(d);if(!y(f))return!1;if(null!=(s=a(f[o])))return s}return!1}function xo(t,e){if(e){var n=e.seiresIndex,i=e.seriesId,r=e.seriesName;return null!=n&&t.componentIndex!==n||null!=i&&t.id!==i||null!=r&&t.name!==r}}function _o(t,e){var r=t.color&&!t.colorLayer;d(e,function(e,o){"colorLayer"===o&&r||ex.hasClass(o)||("object"==typeof e?t[o]=t[o]?i(t[o],e,!1):n(e):null==t[o]&&(t[o]=e))})}function wo(t){t=t,this.option={},this.option[mx]=1,this._componentsMap=N({series:[]}),this._seriesIndices,this._seriesIndicesMap,_o(t,this._theme.option),i(t,ix,!1),this.mergeOption(t)}function bo(t,e){y(e)||(e=e?[e]:[]);var n={};return d(e,function(e){n[e]=(t.get(e)||[]).slice()}),n}function So(t,e,n){return e.type?e.type:n?n.subType:ex.determineSubType(t,e)}function Mo(t,e){t._seriesIndicesMap=N(t._seriesIndices=f(e,function(t){return t.componentIndex})||[])}function Io(t,e){return e.hasOwnProperty("subType")?g(t,function(t){return t.subType===e.subType}):t}function To(t){d(yx,function(e){this[e]=m(t[e],t)},this)}function Co(){this._coordinateSystems=[]}function Ao(t){this._api=t,this._timelineOptions=[],this._mediaList=[],this._mediaDefault,this._currentMediaIndices=[],this._optionBackup,this._newBaseOption}function Do(t,e,n){var i,r,o=[],a=[],s=t.timeline;if(t.baseOption&&(r=t.baseOption),(s||t.options)&&(r=r||{},o=(t.options||[]).slice()),t.media){r=r||{};var l=t.media;_x(l,function(t){t&&t.option&&(t.query?a.push(t):i||(i=t))})}return r||(r=t),r.timeline||(r.timeline=s),_x([r].concat(o).concat(f(a,function(t){return t.option})),function(t){_x(e,function(e){e(t,n)})}),{baseOption:r,timelineOptions:o,mediaDefault:i,mediaList:a}}function ko(t,e,n){var i={width:e,height:n,aspectratio:e/n},r=!0;return d(t,function(t,e){var n=e.match(Ix);if(n&&n[1]&&n[2]){var o=n[1],a=n[2].toLowerCase();Po(i[a],t,o)||(r=!1)}}),r}function Po(t,e,n){return"min"===n?t>=e:"max"===n?t<=e:t===e}function Lo(t,e){return t.join(",")===e.join(",")}function Oo(t,e){_x(e=e||{},function(e,n){if(null!=e){var i=t[n];if(ex.hasClass(n)){e=Mn(e);var r=An(i=Mn(i),e);t[n]=Sx(r,function(t){return t.option&&t.exist?Mx(t.exist,t.option,!0):t.exist||t.option})}else t[n]=Mx(i,e,!0)}})}function zo(t){var e=t&&t.itemStyle;if(e)for(var n=0,r=Ax.length;n<r;n++){var o=Ax[n],a=e.normal,s=e.emphasis;a&&a[o]&&(t[o]=t[o]||{},t[o].normal?i(t[o].normal,a[o]):t[o].normal=a[o],a[o]=null),s&&s[o]&&(t[o]=t[o]||{},t[o].emphasis?i(t[o].emphasis,s[o]):t[o].emphasis=s[o],s[o]=null)}}function Eo(t,e,n){if(t&&t[e]&&(t[e].normal||t[e].emphasis)){var i=t[e].normal,r=t[e].emphasis;i&&(n?(t[e].normal=t[e].emphasis=null,a(t[e],i)):t[e]=i),r&&(t.emphasis=t.emphasis||{},t.emphasis[e]=r)}}function No(t){Eo(t,"itemStyle"),Eo(t,"lineStyle"),Eo(t,"areaStyle"),Eo(t,"label"),Eo(t,"labelLine"),Eo(t,"upperLabel"),Eo(t,"edgeLabel")}function Ro(t,e){var n=Cx(t)&&t[e],i=Cx(n)&&n.textStyle;if(i)for(var r=0,o=Xm.length;r<o;r++){var e=Xm[r];i.hasOwnProperty(e)&&(n[e]=i[e])}}function Bo(t){t&&(No(t),Ro(t,"label"),t.emphasis&&Ro(t.emphasis,"label"))}function Fo(t){if(Cx(t)){zo(t),No(t),Ro(t,"label"),Ro(t,"upperLabel"),Ro(t,"edgeLabel"),t.emphasis&&(Ro(t.emphasis,"label"),Ro(t.emphasis,"upperLabel"),Ro(t.emphasis,"edgeLabel"));var e=t.markPoint;e&&(zo(e),Bo(e));var n=t.markLine;n&&(zo(n),Bo(n));var i=t.markArea;i&&Bo(i);var r=t.data;if("graph"===t.type){r=r||t.nodes;var o=t.links||t.edges;if(o&&!S(o))for(s=0;s<o.length;s++)Bo(o[s]);d(t.categories,function(t){No(t)})}if(r&&!S(r))for(s=0;s<r.length;s++)Bo(r[s]);if((e=t.markPoint)&&e.data)for(var a=e.data,s=0;s<a.length;s++)Bo(a[s]);if((n=t.markLine)&&n.data)for(var l=n.data,s=0;s<l.length;s++)y(l[s])?(Bo(l[s][0]),Bo(l[s][1])):Bo(l[s]);"gauge"===t.type?(Ro(t,"axisLabel"),Ro(t,"title"),Ro(t,"detail")):"treemap"===t.type?(Eo(t.breadcrumb,"itemStyle"),d(t.levels,function(t){No(t)})):"tree"===t.type&&No(t.leaves)}}function Vo(t){return y(t)?t:t?[t]:[]}function Wo(t){return(y(t)?t[0]:t)||{}}function Ho(t,e){e=e.split(",");for(var n=t,i=0;i<e.length&&null!=(n=n&&n[e[i]]);i++);return n}function Go(t,e,n,i){e=e.split(",");for(var r,o=t,a=0;a<e.length-1;a++)null==o[r=e[a]]&&(o[r]={}),o=o[r];(i||null==o[e[a]])&&(o[e[a]]=n)}function Zo(t){d(kx,function(e){e[0]in t&&!(e[1]in t)&&(t[e[1]]=t[e[0]])})}function Uo(t){d(t,function(e,n){var i=[],r=[NaN,NaN],o=[e.stackResultDimension,e.stackedOverDimension],a=e.data,s=e.isStackedByIndex,l=a.map(o,function(o,l,u){var h=a.get(e.stackedDimension,u);if(isNaN(h))return r;var c,d;s?d=a.getRawIndex(u):c=a.get(e.stackedByDimension,u);for(var f=NaN,p=n-1;p>=0;p--){var g=t[p];if(s||(d=g.data.rawIndexOf(g.stackedByDimension,c)),d>=0){var m=g.data.getByRawIndex(g.stackResultDimension,d);if(h>=0&&m>0||h<=0&&m<0){h+=m,f=m;break}}}return i[0]=h,i[1]=f,i});a.hostModel.setData(l),e.data=l})}function Xo(t,e){oo.isInstance(t)||(t=oo.seriesDataToSource(t)),this._source=t;var n=this._data=t.data,i=t.sourceFormat;i===dx&&(this._offset=0,this._dimSize=e,this._data=n),o(this,zx[i===lx?i+"_"+t.seriesLayoutBy:i])}function Yo(){return this._data.length}function jo(t){return this._data[t]}function qo(t){for(var e=0;e<t.length;e++)this._data.push(t[e])}function $o(t,e,n,i){return null!=n?t[n]:t}function Ko(t,e,n,i){return Qo(t[i],this._dimensionInfos[e])}function Qo(t,e){var n=e&&e.type;if("ordinal"===n){var i=e&&e.ordinalMeta;return i?i.parseAndCollect(t):t}return"time"===n&&"number"!=typeof t&&null!=t&&"-"!==t&&(t=+Br(t)),null==t||""===t?NaN:+t}function Jo(t,e,n){if(t){var i=t.getRawDataItem(e);if(null!=i){var r,o,a=t.getProvider().getSource().sourceFormat,s=t.getDimensionInfo(n);return s&&(r=s.name,o=s.index),Ex[a](i,e,o,r)}}}function ta(t,e,n){if(t){var i=t.getProvider().getSource().sourceFormat;if(i===sx||i===ux){var r=t.getRawDataItem(e);return i!==sx||w(r)||(r=null),r?r[n]:void 0}}}function ea(t){return new na(t)}function na(t){t=t||{},this._reset=t.reset,this._plan=t.plan,this._count=t.count,this._onDirty=t.onDirty,this._dirty=!0,this.context}function ia(t,e,n,i,r,o){Vx.reset(n,i,r,o),t._callingProgress=e,t._callingProgress({start:n,end:i,count:i-n,next:Vx.next},t.context)}function ra(t,e){t._dueIndex=t._outputDueEnd=t._dueEnd=0,t._settedOutputEnd=null;var n,i;!e&&t._reset&&((n=t._reset(t.context))&&n.progress&&(i=n.forceFirstProgress,n=n.progress),y(n)&&!n.length&&(n=null)),t._progress=n,t._modBy=t._modDataCount=null;var r=t._downstream;return r&&r.dirty(),i}function oa(t){var e=t.name;kn(t)||(t.name=aa(t)||e)}function aa(t){var e=t.getRawData(),n=[];return d(e.mapDimension("seriesName",!0),function(t){var i=e.getDimensionInfo(t);i.displayName&&n.push(i.displayName)}),n.join(" ")}function sa(t){return t.model.getRawData().count()}function la(t){var e=t.model;return e.setData(e.getRawData().cloneShallow()),ua}function ua(t,e){t.end>e.outputData.count()&&e.model.getRawData().cloneShallow(e.outputData)}function ha(t,e){d(t.CHANGABLE_METHODS,function(n){t.wrapMethod(n,v(ca,e))})}function ca(t){var e=da(t);e&&e.setOutputEnd(this.count())}function da(t){var e=(t.ecModel||{}).scheduler,n=e&&e.getPipeline(t.uid);if(n){var i=n.currentTask;if(i){var r=i.agentStubMap;r&&(i=r.get(t.uid))}return i}}function fa(){this.group=new Jg,this.uid=Tr("viewChart"),this.renderTask=ea({plan:ma,reset:va}),this.renderTask.context={view:this}}function pa(t,e){if(t&&(t.trigger(e),"group"===t.type))for(var n=0;n<t.childCount();n++)pa(t.childAt(n),e)}function ga(t,e,n){var i=Ln(t,e);null!=i?d(Mn(i),function(e){pa(t.getItemGraphicEl(e),n)}):t.eachItemGraphicEl(function(t){pa(t,n)})}function ma(t){return Yx(t.model)}function va(t){var e=t.model,n=t.ecModel,i=t.api,r=t.payload,o=e.pipelineContext.progressiveRender,a=t.view,s=r&&Xx(r).updateMethod,l=o?"incrementalPrepareRender":s&&a[s]?s:"render";return"render"!==l&&a[l](e,n,i,r),qx[l]}function ya(t,e,n){function i(){h=(new Date).getTime(),c=null,t.apply(a,s||[])}var r,o,a,s,l,u=0,h=0,c=null;e=e||0;var d=function(){r=(new Date).getTime(),a=this,s=arguments;var t=l||e,d=l||n;l=null,o=r-(d?u:h)-t,clearTimeout(c),d?c=setTimeout(i,t):o>=0?i():c=setTimeout(i,-o),u=r};return d.clear=function(){c&&(clearTimeout(c),c=null)},d.debounceNextCall=function(t){l=t},d}function xa(t,e,n,i){var r=t[e];if(r){var o=r[$x]||r,a=r[Qx];if(r[Kx]!==n||a!==i){if(null==n||!i)return t[e]=o;(r=t[e]=ya(o,n,"debounce"===i))[$x]=o,r[Qx]=i,r[Kx]=n}return r}}function _a(t,e){var n=t[e];n&&n[$x]&&(t[e]=n[$x])}function wa(t,e,n,i){this.ecInstance=t,this.api=e,this.unfinished;var n=this._dataProcessorHandlers=n.slice(),i=this._visualHandlers=i.slice();this._allHandlers=n.concat(i),this._stageTaskMap=N()}function ba(t,e,n,i,r){function o(t,e){return t.setDirty&&(!t.dirtyMap||t.dirtyMap.get(e.__pipeline.id))}r=r||{};var a;d(e,function(e,s){if(!r.visualType||r.visualType===e.visualType){var l=t._stageTaskMap.get(e.uid),u=l.seriesTaskMap,h=l.overallTask;if(h){var c,d=h.agentStubMap;d.each(function(t){o(r,t)&&(t.dirty(),c=!0)}),c&&h.dirty(),r_(h,i);var f=t.getPerformArgs(h,r.block);d.each(function(t){t.perform(f)}),a|=h.perform(f)}else u&&u.each(function(s,l){o(r,s)&&s.dirty();var u=t.getPerformArgs(s,r.block);u.skip=!e.performRawSeries&&n.isSeriesFiltered(s.context.model),r_(s,i),a|=s.perform(u)})}}),t.unfinished|=a}function Sa(t,e,n,i,r){function o(n){var o=n.uid,s=a.get(o)||a.set(o,ea({plan:Da,reset:ka,count:La}));s.context={model:n,ecModel:i,api:r,useClearVisual:e.isVisual&&!e.isLayout,plan:e.plan,reset:e.reset,scheduler:t},Oa(t,n,s)}var a=n.seriesTaskMap||(n.seriesTaskMap=N()),s=e.seriesType,l=e.getTargetSeries;e.createOnAllSeries?i.eachRawSeries(o):s?i.eachRawSeriesByType(s,o):l&&l(i,r).each(o);var u=t._pipelineMap;a.each(function(t,e){u.get(e)||(t.dispose(),a.removeKey(e))})}function Ma(t,e,n,i,r){function o(e){var n=e.uid,i=s.get(n);i||(i=s.set(n,ea({reset:Ta,onDirty:Aa})),a.dirty()),i.context={model:e,overallProgress:h,modifyOutputEnd:c},i.agent=a,i.__block=h,Oa(t,e,i)}var a=n.overallTask=n.overallTask||ea({reset:Ia});a.context={ecModel:i,api:r,overallReset:e.overallReset,scheduler:t};var s=a.agentStubMap=a.agentStubMap||N(),l=e.seriesType,u=e.getTargetSeries,h=!0,c=e.modifyOutputEnd;l?i.eachRawSeriesByType(l,o):u?u(i,r).each(o):(h=!1,d(i.getSeries(),o));var f=t._pipelineMap;s.each(function(t,e){f.get(e)||(t.dispose(),a.dirty(),s.removeKey(e))})}function Ia(t){t.overallReset(t.ecModel,t.api,t.payload)}function Ta(t,e){return t.overallProgress&&Ca}function Ca(){this.agent.dirty(),this.getDownstream().dirty()}function Aa(){this.agent&&this.agent.dirty()}function Da(t){return t.plan&&t.plan(t.model,t.ecModel,t.api,t.payload)}function ka(t){t.useClearVisual&&t.data.clearAllVisual();var e=t.resetDefines=Mn(t.reset(t.model,t.ecModel,t.api,t.payload));return e.length>1?f(e,function(t,e){return Pa(e)}):o_}function Pa(t){return function(e,n){var i=n.data,r=n.resetDefines[t];if(r&&r.dataEach)for(var o=e.start;o<e.end;o++)r.dataEach(i,o);else r&&r.progress&&r.progress(e,i)}}function La(t){return t.data.count()}function Oa(t,e,n){var i=e.uid,r=t._pipelineMap.get(i);!r.head&&(r.head=n),r.tail&&r.tail.pipe(n),r.tail=n,n.__idxInPipeline=r.count++,n.__pipeline=r}function za(t){a_=null;try{t(s_,l_)}catch(t){}return a_}function Ea(t,e){for(var n in e.prototype)t[n]=R}function Na(t){for(_(t)&&(t=(new DOMParser).parseFromString(t,"text/xml")),9===t.nodeType&&(t=t.firstChild);"svg"!==t.nodeName.toLowerCase()||1!==t.nodeType;)t=t.nextSibling;return t}function Ra(){this._defs={},this._root=null,this._isDefine=!1,this._isText=!1}function Ba(t,e){for(var n=t.firstChild;n;){if(1===n.nodeType){var i=n.getAttribute("offset");i=i.indexOf("%")>0?parseInt(i,10)/100:i?parseFloat(i):0;var r=n.getAttribute("stop-color")||"#000000";e.addColorStop(i,r)}n=n.nextSibling}}function Fa(t,e){t&&t.__inheritedStyle&&(e.__inheritedStyle||(e.__inheritedStyle={}),a(e.__inheritedStyle,t.__inheritedStyle))}function Va(t){for(var e=L(t).split(p_),n=[],i=0;i<e.length;i+=2){var r=parseFloat(e[i]),o=parseFloat(e[i+1]);n.push([r,o])}return n}function Wa(t,e,n,i){var r=e.__inheritedStyle||{},a="text"===e.type;if(1===t.nodeType&&(Ga(t,e),o(r,Za(t)),!i))for(var s in v_)if(v_.hasOwnProperty(s)){var l=t.getAttribute(s);null!=l&&(r[v_[s]]=l)}var u=a?"textFill":"fill",h=a?"textStroke":"stroke";e.style=e.style||new am;var c=e.style;null!=r.fill&&c.set(u,Ha(r.fill,n)),null!=r.stroke&&c.set(h,Ha(r.stroke,n)),d(["lineWidth","opacity","fillOpacity","strokeOpacity","miterLimit","fontSize"],function(t){var e="lineWidth"===t&&a?"textStrokeWidth":t;null!=r[t]&&c.set(e,parseFloat(r[t]))}),r.textBaseline&&"auto"!==r.textBaseline||(r.textBaseline="alphabetic"),"alphabetic"===r.textBaseline&&(r.textBaseline="bottom"),"start"===r.textAlign&&(r.textAlign="left"),"end"===r.textAlign&&(r.textAlign="right"),d(["lineDashOffset","lineCap","lineJoin","fontWeight","fontFamily","fontStyle","textAlign","textBaseline"],function(t){null!=r[t]&&c.set(t,r[t])}),r.lineDash&&(e.style.lineDash=L(r.lineDash).split(p_)),c[h]&&"none"!==c[h]&&(e[h]=!0),e.__inheritedStyle=r}function Ha(t,e){var n=e&&t&&t.match(y_);return n?e[L(n[1])]:t}function Ga(t,e){var n=t.getAttribute("transform");if(n){var i=null,r=[];(n=n.replace(/,/g," ")).replace(x_,function(t,e,n){r.push(e,n)});for(var o=r.length-1;o>0;o-=2){var a=r[o],s=r[o-1];switch(i=i||ft(),s){case"translate":a=L(a).split(p_),vt(i,i,[parseFloat(a[0]),parseFloat(a[1]||0)]);break;case"scale":a=L(a).split(p_),xt(i,i,[parseFloat(a[0]),parseFloat(a[1]||a[0])]);break;case"rotate":a=L(a).split(p_),yt(i,i,parseFloat(a[0]));break;case"skew":a=L(a).split(p_),console.warn("Skew transform is not supported yet");break;case"matrix":a=L(a).split(p_);i[0]=parseFloat(a[0]),i[1]=parseFloat(a[1]),i[2]=parseFloat(a[2]),i[3]=parseFloat(a[3]),i[4]=parseFloat(a[4]),i[5]=parseFloat(a[5])}}}e.setLocalTransform(i)}function Za(t){var e=t.getAttribute("style"),n={};if(!e)return n;var i={};__.lastIndex=0;for(var r;null!=(r=__.exec(e));)i[r[1]]=r[2];for(var o in v_)v_.hasOwnProperty(o)&&null!=i[o]&&(n[v_[o]]=i[o]);return n}function Ua(t,e,n){var i=e/t.width,r=n/t.height,o=Math.min(i,r);return{scale:[o,o],position:[-(t.x+t.width/2)*o+e/2,-(t.y+t.height/2)*o+n/2]}}function Xa(t){return function(e,n,i){e=e&&e.toLowerCase(),pg.prototype[t].call(this,e,n,i)}}function Ya(){pg.call(this)}function ja(t,e,i){function r(t,e){return t.__prio-e.__prio}i=i||{},"string"==typeof e&&(e=X_[e]),this.id,this.group,this._dom=t;var o=this._zr=wn(t,{renderer:i.renderer||"canvas",devicePixelRatio:i.devicePixelRatio,width:i.width,height:i.height});this._throttledZrFlush=ya(m(o.flush,o),17),(e=n(e))&&Lx(e,!0),this._theme=e,this._chartsViews=[],this._chartsMap={},this._componentsViews=[],this._componentsMap={},this._coordSysMgr=new Co;var a=this._api=ds(this);de(U_,r),de(H_,r),this._scheduler=new wa(this,a,H_,U_),pg.call(this,this._ecEventProcessor=new fs),this._messageCenter=new Ya,this._initEvents(),this.resize=m(this.resize,this),this._pendingActions=[],o.animation.on("frame",this._onframe,this),ns(o,this),O(this)}function qa(t,e,n){var i,r=this._model,o=this._coordSysMgr.getCoordinateSystems();e=zn(r,e);for(var a=0;a<o.length;a++){var s=o[a];if(s[t]&&null!=(i=s[t](r,e,n)))return i}}function $a(t){var e=t._model,n=t._scheduler;n.restorePipelines(e),n.prepareStageTasks(),is(t,"component",e,n),is(t,"chart",e,n),n.plan()}function Ka(t,e,n,i,r){function o(i){i&&i.__alive&&i[e]&&i[e](i.__model,a,t._api,n)}var a=t._model;if(i){var s={};s[i+"Id"]=n[i+"Id"],s[i+"Index"]=n[i+"Index"],s[i+"Name"]=n[i+"Name"];var l={mainType:i,query:s};r&&(l.subType=r);var u=n.excludeSeriesId;null!=u&&(u=N(Mn(u))),a&&a.eachComponent(l,function(e){u&&null!=u.get(e.id)||o(t["series"===i?"_chartsMap":"_componentsMap"][e.__viewId])},t)}else I_(t._componentsViews.concat(t._chartsViews),o)}function Qa(t,e){var n=t._chartsMap,i=t._scheduler;e.eachSeries(function(t){i.updateStreamModes(t,n[t.__viewId])})}function Ja(t,e){var n=t.type,i=t.escapeConnect,r=V_[n],s=r.actionInfo,l=(s.update||"update").split(":"),u=l.pop();l=null!=l[0]&&A_(l[0]),this[z_]=!0;var h=[t],c=!1;t.batch&&(c=!0,h=f(t.batch,function(e){return e=a(o({},e),t),e.batch=null,e}));var d,p=[],g="highlight"===n||"downplay"===n;I_(h,function(t){d=r.action(t,this._model,this._api),(d=d||o({},t)).type=s.event||d.type,p.push(d),g?Ka(this,u,t,"series"):l&&Ka(this,u,t,l.main,l.sub)},this),"none"===u||g||l||(this[E_]?($a(this),B_.update.call(this,t),this[E_]=!1):B_[u].call(this,t)),d=c?{type:s.event||n,escapeConnect:i,batch:p}:p[0],this[z_]=!1,!e&&this._messageCenter.trigger(d.type,d)}function ts(t){for(var e=this._pendingActions;e.length;){var n=e.shift();Ja.call(this,n,t)}}function es(t){!t&&this.trigger("updated")}function ns(t,e){t.on("rendered",function(){e.trigger("rendered"),!t.animation.isFinished()||e[E_]||e._scheduler.unfinished||e._pendingActions.length||e.trigger("finished")})}function is(t,e,n,i){function r(t){var e="_ec_"+t.id+"_"+t.type,r=s[e];if(!r){var h=A_(t.type);(r=new(o?Gx.getClass(h.main,h.sub):fa.getClass(h.sub))).init(n,u),s[e]=r,a.push(r),l.add(r.group)}t.__viewId=r.__id=e,r.__alive=!0,r.__model=t,r.group.__ecComponentInfo={mainType:t.mainType,index:t.componentIndex},!o&&i.prepareView(r,t,n,u)}for(var o="component"===e,a=o?t._componentsViews:t._chartsViews,s=o?t._componentsMap:t._chartsMap,l=t._zr,u=t._api,h=0;h<a.length;h++)a[h].__alive=!1;o?n.eachComponent(function(t,e){"series"!==t&&r(e)}):n.eachSeries(r);for(h=0;h<a.length;){var c=a[h];c.__alive?h++:(!o&&c.renderTask.dispose(),l.remove(c.group),c.dispose(n,u),a.splice(h,1),delete s[c.__id],c.__id=c.group.__ecComponentInfo=null)}}function rs(t){t.clearColorPalette(),t.eachSeries(function(t){t.clearColorPalette()})}function os(t,e,n,i){as(t,e,n,i),I_(t._chartsViews,function(t){t.__alive=!1}),ss(t,e,n,i),I_(t._chartsViews,function(t){t.__alive||t.remove(e,n)})}function as(t,e,n,i,r){I_(r||t._componentsViews,function(t){var r=t.__model;t.render(r,e,n,i),cs(r,t)})}function ss(t,e,n,i,r){var o,a=t._scheduler;e.eachSeries(function(e){var n=t._chartsMap[e.__viewId];n.__alive=!0;var s=n.renderTask;a.updatePayload(s,i),r&&r.get(e.uid)&&s.dirty(),o|=s.perform(a.getPerformArgs(s)),n.group.silent=!!e.get("silent"),cs(e,n),hs(e,n)}),a.unfinished|=o,us(t._zr,e),e_(t._zr.dom,e)}function ls(t,e){I_(Z_,function(n){n(t,e)})}function us(t,e){var n=t.storage,i=0;n.traverse(function(t){t.isGroup||i++}),i>e.get("hoverLayerThreshold")&&!Xp.node&&n.traverse(function(t){t.isGroup||(t.useHoverLayer=!0)})}function hs(t,e){var n=t.get("blendMode")||null;e.group.traverse(function(t){t.isGroup||t.style.blend!==n&&t.setStyle("blend",n),t.eachPendingDisplayable&&t.eachPendingDisplayable(function(t){t.setStyle("blend",n)})})}function cs(t,e){var n=t.get("z"),i=t.get("zlevel");e.group.traverse(function(t){"group"!==t.type&&(null!=n&&(t.z=n),null!=i&&(t.zlevel=i))})}function ds(t){var e=t._coordSysMgr;return o(new To(t),{getCoordinateSystems:m(e.getCoordinateSystems,e),getComponentByElement:function(e){for(;e;){var n=e.__ecComponentInfo;if(null!=n)return t._model.getComponent(n.mainType,n.index);e=e.parent}}})}function fs(){this.eventInfo}function ps(t){function e(t,e){for(var i=0;i<t.length;i++)t[i][n]=e}var n="__connectUpdateStatus";I_(W_,function(i,r){t._messageCenter.on(r,function(i){if(q_[t.group]&&0!==t[n]){if(i&&i.escapeConnect)return;var r=t.makeActionFromEvent(i),o=[];I_(j_,function(e){e!==t&&e.group===t.group&&o.push(e)}),e(o,0),I_(o,function(t){1!==t[n]&&t.dispatchAction(r)}),e(o,2)}})})}function gs(t){q_[t]=!1}function ms(t){return j_[Rn(t,Q_)]}function vs(t,e){X_[t]=e}function ys(t){G_.push(t)}function xs(t,e){Ss(H_,t,e,k_)}function _s(t,e,n){"function"==typeof e&&(n=e,e="");var i=C_(t)?t.type:[t,t={event:e}][0];t.event=(t.event||i).toLowerCase(),e=t.event,M_(N_.test(i)&&N_.test(e)),V_[i]||(V_[i]={action:n,actionInfo:t}),W_[e]=i}function ws(t,e){Ss(U_,t,e,P_,"layout")}function bs(t,e){Ss(U_,t,e,L_,"visual")}function Ss(t,e,n,i,r){(T_(e)||C_(e))&&(n=e,e=i);var o=wa.wrapStageHandler(n,r);return o.__prio=e,o.__raw=n,t.push(o),o}function Ms(t,e){Y_[t]=e}function Is(t){return ex.extend(t)}function Ts(t){return Gx.extend(t)}function Cs(t){return Hx.extend(t)}function As(t){return fa.extend(t)}function Ds(t){return t}function ks(t,e,n,i,r){this._old=t,this._new=e,this._oldKeyGetter=n||Ds,this._newKeyGetter=i||Ds,this.context=r}function Ps(t,e,n,i,r){for(var o=0;o<t.length;o++){var a="_ec_"+r[i](t[o],o),s=e[a];null==s?(n.push(a),e[a]=o):(s.length||(e[a]=s=[s]),s.push(o))}}function Ls(t){var e={},n=e.encode={},i=N(),r=[],o=[];d(t.dimensions,function(e){var a=t.getDimensionInfo(e),s=a.coordDim;if(s){var l=n[s];n.hasOwnProperty(s)||(l=n[s]=[]),l[a.coordDimIndex]=e,a.isExtraCoord||(i.set(s,1),zs(a.type)&&(r[0]=e)),a.defaultTooltip&&o.push(e)}ew.each(function(t,e){var i=n[e];n.hasOwnProperty(e)||(i=n[e]=[]);var r=a.otherDims[e];null!=r&&!1!==r&&(i[r]=a.name)})});var a=[],s={};i.each(function(t,e){var i=n[e];s[e]=i[0],a=a.concat(i)}),e.dataDimsOnCoord=a,e.encodeFirstDimNotExtra=s;var l=n.label;l&&l.length&&(r=l.slice());var u=n.tooltip;return u&&u.length?o=u.slice():o.length||(o=r.slice()),n.defaultedLabel=r,n.defaultedTooltip=o,e}function Os(t){return"category"===t?"ordinal":"time"===t?"time":"float"}function zs(t){return!("ordinal"===t||"time"===t)}function Es(t){return t._rawCount>65535?ow:aw}function Ns(t){var e=t.constructor;return e===Array?t.slice():new e(t)}function Rs(t,e){d(sw.concat(e.__wrappedMethods||[]),function(n){e.hasOwnProperty(n)&&(t[n]=e[n])}),t.__wrappedMethods=e.__wrappedMethods,d(lw,function(i){t[i]=n(e[i])}),t._calculationInfo=o(e._calculationInfo)}function Bs(t){var e=t._invertedIndicesMap;d(e,function(n,i){var r=t._dimensionInfos[i].ordinalMeta;if(r){n=e[i]=new ow(r.categories.length);for(o=0;o<n.length;o++)n[o]=NaN;for(var o=0;o<t._count;o++)n[t.get(i,o)]=o}})}function Fs(t,e,n){var i;if(null!=e){var r=t._chunkSize,o=Math.floor(n/r),a=n%r,s=t.dimensions[e],l=t._storage[s][o];if(l){i=l[a];var u=t._dimensionInfos[s].ordinalMeta;u&&u.categories.length&&(i=u.categories[i])}}return i}function Vs(t){return t}function Ws(t){return t<this._count&&t>=0?this._indices[t]:-1}function Hs(t,e){var n=t._idList[e];return null==n&&(n=Fs(t,t._idDimIdx,e)),null==n&&(n=iw+e),n}function Gs(t){return y(t)||(t=[t]),t}function Zs(t,e){var n=t.dimensions,i=new uw(f(n,t.getDimensionInfo,t),t.hostModel);Rs(i,t);for(var r=i._storage={},o=t._storage,a=0;a<n.length;a++){var s=n[a];o[s]&&(l(e,s)>=0?(r[s]=Us(o[s]),i._rawExtent[s]=Xs(),i._extent[s]=null):r[s]=o[s])}return i}function Us(t){for(var e=new Array(t.length),n=0;n<t.length;n++)e[n]=Ns(t[n]);return e}function Xs(){return[1/0,-1/0]}function Ys(t,e,i){function r(t,e,n){null!=ew.get(e)?t.otherDims[e]=n:(t.coordDim=e,t.coordDimIndex=n,h.set(e,!0))}oo.isInstance(e)||(e=oo.seriesDataToSource(e)),i=i||{},t=(t||[]).slice();for(var s=(i.dimsDef||[]).slice(),l=N(i.encodeDef),u=N(),h=N(),c=[],f=js(e,t,s,i.dimCount),p=0;p<f;p++){var g=s[p]=o({},w(s[p])?s[p]:{name:s[p]}),m=g.name,v=c[p]={otherDims:{}};null!=m&&null==u.get(m)&&(v.name=v.displayName=m,u.set(m,p)),null!=g.type&&(v.type=g.type),null!=g.displayName&&(v.displayName=g.displayName)}l.each(function(t,e){if(1===(t=Mn(t).slice()).length&&t[0]<0)l.set(e,!1);else{var n=l.set(e,[]);d(t,function(t,i){_(t)&&(t=u.get(t)),null!=t&&t<f&&(n[i]=t,r(c[t],e,i))})}});var y=0;d(t,function(t,e){var i,t,o,s;if(_(t))i=t,t={};else{i=t.name;var u=t.ordinalMeta;t.ordinalMeta=null,(t=n(t)).ordinalMeta=u,o=t.dimsDef,s=t.otherDims,t.name=t.coordDim=t.coordDimIndex=t.dimsDef=t.otherDims=null}var h=l.get(i);if(!1!==h){if(!(h=Mn(h)).length)for(var f=0;f<(o&&o.length||1);f++){for(;y<c.length&&null!=c[y].coordDim;)y++;y<c.length&&h.push(y++)}d(h,function(e,n){var l=c[e];if(r(a(l,t),i,n),null==l.name&&o){var u=o[n];!w(u)&&(u={name:u}),l.name=l.displayName=u.name,l.defaultTooltip=u.defaultTooltip}s&&a(l.otherDims,s)})}});var x=i.generateCoord,b=i.generateCoordCount,S=null!=b;b=x?b||1:0;for(var M=x||"value",I=0;I<f;I++)null==(v=c[I]=c[I]||{}).coordDim&&(v.coordDim=qs(M,h,S),v.coordDimIndex=0,(!x||b<=0)&&(v.isExtraCoord=!0),b--),null==v.name&&(v.name=qs(v.coordDim,u)),null==v.type&&vo(e,I,v.name)&&(v.type="ordinal");return c}function js(t,e,n,i){var r=Math.max(t.dimensionsDetectCount||1,e.length,n.length,i||0);return d(e,function(t){var e=t.dimsDef;e&&(r=Math.max(r,e.length))}),r}function qs(t,e,n){if(n||null!=e.get(t)){for(var i=0;null!=e.get(t+i);)i++;t+=i}return e.set(t,!0),t}function $s(t,e,n){var i,r,o,a,s=(n=n||{}).byIndex,l=n.stackedCoordDimension,u=!(!t||!t.get("stack"));if(d(e,function(t,n){_(t)&&(e[n]=t={name:t}),u&&!t.isExtraCoord&&(s||i||!t.ordinalMeta||(i=t),r||"ordinal"===t.type||"time"===t.type||l&&l!==t.coordDim||(r=t))}),!r||s||i||(s=!0),r){o="__\0ecstackresult",a="__\0ecstackedover",i&&(i.createInvertedIndices=!0);var h=r.coordDim,c=r.type,f=0;d(e,function(t){t.coordDim===h&&f++}),e.push({name:o,coordDim:h,coordDimIndex:f,type:c,isExtraCoord:!0,isCalculationCoord:!0}),f++,e.push({name:a,coordDim:a,coordDimIndex:f,type:c,isExtraCoord:!0,isCalculationCoord:!0})}return{stackedDimension:r&&r.name,stackedByDimension:i&&i.name,isStackedByIndex:s,stackedOverDimension:a,stackResultDimension:o}}function Ks(t,e){return!!e&&e===t.getCalculationInfo("stackedDimension")}function Qs(t,e){return Ks(t,e)?t.getCalculationInfo("stackResultDimension"):e}function Js(t,e,n){n=n||{},oo.isInstance(t)||(t=oo.seriesDataToSource(t));var i,r=e.get("coordinateSystem"),o=Co.get(r),a=io(e);a&&(i=f(a.coordSysDims,function(t){var e={name:t},n=a.axisMap.get(t);if(n){var i=n.get("type");e.type=Os(i)}return e})),i||(i=o&&(o.getDimensionsInfo?o.getDimensionsInfo():o.dimensions.slice())||["x","y"]);var s,l,u=dw(t,{coordDimensions:i,generateCoord:n.generateCoord});a&&d(u,function(t,e){var n=t.coordDim,i=a.categoryAxisMap.get(n);i&&(null==s&&(s=e),t.ordinalMeta=i.getOrdinalMeta()),null!=t.otherDims.itemName&&(l=!0)}),l||null==s||(u[s].otherDims.itemName=0);var h=$s(e,u),c=new uw(u,e);c.setCalculationInfo(h);var p=null!=s&&tl(t)?function(t,e,n,i){return i===s?n:this.defaultDimValueGetter(t,e,n,i)}:null;return c.hasItemOption=!1,c.initData(t,null,p),c}function tl(t){if(t.sourceFormat===sx){var e=el(t.data||[]);return null!=e&&!y(Tn(e))}}function el(t){for(var e=0;e<t.length&&null==t[e];)e++;return t[e]}function nl(t){this._setting=t||{},this._extent=[1/0,-1/0],this._interval=0,this.init&&this.init.apply(this,arguments)}function il(t){this.categories=t.categories||[],this._needCollect=t.needCollect,this._deduplication=t.deduplication,this._map}function rl(t){return t._map||(t._map=N(t.categories))}function ol(t){return w(t)&&null!=t.value?t.value:t+""}function al(t,e,n,i){var r={},o=t[1]-t[0],a=r.interval=Wr(o/e,!0);null!=n&&a<n&&(a=r.interval=n),null!=i&&a>i&&(a=r.interval=i);var s=r.intervalPrecision=sl(a);return ul(r.niceTickExtent=[mw(Math.ceil(t[0]/a)*a,s),mw(Math.floor(t[1]/a)*a,s)],t),r}function sl(t){return Or(t)+2}function ll(t,e,n){t[e]=Math.max(Math.min(t[e],n[1]),n[0])}function ul(t,e){!isFinite(t[0])&&(t[0]=e[0]),!isFinite(t[1])&&(t[1]=e[1]),ll(t,0,e),ll(t,1,e),t[0]>t[1]&&(t[0]=t[1])}function hl(t,e,n,i){var r=[];if(!t)return r;e[0]<n[0]&&r.push(e[0]);for(var o=n[0];o<=n[1]&&(r.push(o),(o=mw(o+t,i))!==r[r.length-1]);)if(r.length>1e4)return[];return e[1]>(r.length?r[r.length-1]:n[1])&&r.push(e[1]),r}function cl(t){return t.get("stack")||xw+t.seriesIndex}function dl(t){return t.dim+t.index}function fl(t,e){var n=[];return e.eachSeriesByType(t,function(t){vl(t)&&!yl(t)&&n.push(t)}),n}function pl(t){var e=[];return d(t,function(t){var n=t.getData(),i=t.coordinateSystem.getBaseAxis(),r=i.getExtent(),o="category"===i.type?i.getBandWidth():Math.abs(r[1]-r[0])/n.count(),a=Dr(t.get("barWidth"),o),s=Dr(t.get("barMaxWidth"),o),l=t.get("barGap"),u=t.get("barCategoryGap");e.push({bandWidth:o,barWidth:a,barMaxWidth:s,barGap:l,barCategoryGap:u,axisKey:dl(i),stackId:cl(t)})}),gl(e)}function gl(t){var e={};d(t,function(t,n){var i=t.axisKey,r=t.bandWidth,o=e[i]||{bandWidth:r,remainedWidth:r,autoWidthCount:0,categoryGap:"20%",gap:"30%",stacks:{}},a=o.stacks;e[i]=o;var s=t.stackId;a[s]||o.autoWidthCount++,a[s]=a[s]||{width:0,maxWidth:0};var l=t.barWidth;l&&!a[s].width&&(a[s].width=l,l=Math.min(o.remainedWidth,l),o.remainedWidth-=l);var u=t.barMaxWidth;u&&(a[s].maxWidth=u);var h=t.barGap;null!=h&&(o.gap=h);var c=t.barCategoryGap;null!=c&&(o.categoryGap=c)});var n={};return d(e,function(t,e){n[e]={};var i=t.stacks,r=t.bandWidth,o=Dr(t.categoryGap,r),a=Dr(t.gap,1),s=t.remainedWidth,l=t.autoWidthCount,u=(s-o)/(l+(l-1)*a);u=Math.max(u,0),d(i,function(t,e){var n=t.maxWidth;n&&n<u&&(n=Math.min(n,s),t.width&&(n=Math.min(n,t.width)),s-=n,t.width=n,l--)}),u=(s-o)/(l+(l-1)*a),u=Math.max(u,0);var h,c=0;d(i,function(t,e){t.width||(t.width=u),h=t,c+=t.width*(1+a)}),h&&(c-=h.width*a);var f=-c/2;d(i,function(t,i){n[e][i]=n[e][i]||{offset:f,width:t.width},f+=t.width*(1+a)})}),n}function ml(t,e,n){if(t&&e){var i=t[dl(e)];return null!=i&&null!=n&&(i=i[cl(n)]),i}}function vl(t){return t.coordinateSystem&&"cartesian2d"===t.coordinateSystem.type}function yl(t){return t.pipelineContext&&t.pipelineContext.large}function xl(t,e,n){var i,r,o=e.getGlobalExtent();o[0]>o[1]?(i=o[1],r=o[0]):(i=o[0],r=o[1]);var a=e.toGlobalCoord(e.dataToCoord(0));return a<i&&(a=i),a>r&&(a=r),a}function _l(t,e){return Pw(t,kw(e))}function wl(t,e){var n,i,r,o=t.type,a=e.getMin(),s=e.getMax(),l=null!=a,u=null!=s,h=t.getExtent();"ordinal"===o?n=e.getCategories().length:(y(i=e.get("boundaryGap"))||(i=[i||0,i||0]),"boolean"==typeof i[0]&&(i=[0,0]),i[0]=Dr(i[0],1),i[1]=Dr(i[1],1),r=h[1]-h[0]||Math.abs(h[0])),null==a&&(a="ordinal"===o?n?0:NaN:h[0]-i[0]*r),null==s&&(s="ordinal"===o?n?n-1:NaN:h[1]+i[1]*r),"dataMin"===a?a=h[0]:"function"==typeof a&&(a=a({min:h[0],max:h[1]})),"dataMax"===s?s=h[1]:"function"==typeof s&&(s=s({min:h[0],max:h[1]})),(null==a||!isFinite(a))&&(a=NaN),(null==s||!isFinite(s))&&(s=NaN),t.setBlank(I(a)||I(s)||"ordinal"===o&&!t.getOrdinalMeta().categories.length),e.getNeedCrossZero()&&(a>0&&s>0&&!l&&(a=0),a<0&&s<0&&!u&&(s=0));var c=e.ecModel;if(c&&"time"===o){var f,p=fl("bar",c);if(d(p,function(t){f|=t.getBaseAxis()===e.axis}),f){var g=pl(p),m=bl(a,s,e,g);a=m.min,s=m.max}}return[a,s]}function bl(t,e,n,i){var r=n.axis.getExtent(),o=r[1]-r[0],a=ml(i,n.axis);if(void 0===a)return{min:t,max:e};var s=1/0;d(a,function(t){s=Math.min(t.offset,s)});var l=-1/0;d(a,function(t){l=Math.max(t.offset+t.width,l)}),s=Math.abs(s),l=Math.abs(l);var u=s+l,h=e-t,c=h/(1-(s+l)/o)-h;return e+=c*(l/u),t-=c*(s/u),{min:t,max:e}}function Sl(t,e){var n=wl(t,e),i=null!=e.getMin(),r=null!=e.getMax(),o=e.get("splitNumber");"log"===t.type&&(t.base=e.get("logBase"));var a=t.type;t.setExtent(n[0],n[1]),t.niceExtent({splitNumber:o,fixMin:i,fixMax:r,minInterval:"interval"===a||"time"===a?e.get("minInterval"):null,maxInterval:"interval"===a||"time"===a?e.get("maxInterval"):null});var s=e.get("interval");null!=s&&t.setInterval&&t.setInterval(s)}function Ml(t,e){if(e=e||t.get("type"))switch(e){case"category":return new gw(t.getOrdinalMeta?t.getOrdinalMeta():t.getCategories(),[1/0,-1/0]);case"value":return new yw;default:return(nl.getClass(e)||yw).create(t)}}function Il(t){var e=t.scale.getExtent(),n=e[0],i=e[1];return!(n>0&&i>0||n<0&&i<0)}function Tl(t){var e=t.getLabelModel().get("formatter"),n="category"===t.type?t.scale.getExtent()[0]:null;return"string"==typeof e?e=function(e){return function(n){return n=t.scale.getLabel(n),e.replace("{value}",null!=n?n:"")}}(e):"function"==typeof e?function(i,r){return null!=n&&(r=i-n),e(Cl(t,i),r)}:function(e){return t.scale.getLabel(e)}}function Cl(t,e){return"category"===t.type?t.scale.getLabel(e):e}function Al(t){var e=t.model,n=t.scale;if(e.get("axisLabel.show")&&!n.isBlank()){var i,r,o="category"===t.type,a=n.getExtent();r=o?n.count():(i=n.getTicks()).length;var s,l=t.getLabelModel(),u=Tl(t),h=1;r>40&&(h=Math.ceil(r/40));for(var c=0;c<r;c+=h){var d=u(i?i[c]:a[0]+c),f=Dl(l.getTextRect(d),l.get("rotate")||0);s?s.union(f):s=f}return s}}function Dl(t,e){var n=e*Math.PI/180,i=t.plain(),r=i.width,o=i.height,a=r*Math.cos(n)+o*Math.sin(n),s=r*Math.sin(n)+o*Math.cos(n);return new re(i.x,i.y,a,s)}function kl(t,e){if("image"!==this.type){var n=this.style,i=this.shape;i&&"line"===i.symbolType?n.stroke=t:this.__isEmptyBrush?(n.stroke=t,n.fill=e||"#fff"):(n.fill&&(n.fill=t),n.stroke&&(n.stroke=t)),this.dirty(!1)}}function Pl(t,e,n,i,r,o,a){var s=0===t.indexOf("empty");s&&(t=t.substr(5,1).toLowerCase()+t.substr(6));var l;return l=0===t.indexOf("image://")?Ri(t.slice(8),new re(e,n,i,r),a?"center":"cover"):0===t.indexOf("path://")?Ni(t.slice(7),{},new re(e,n,i,r),a?"center":"cover"):new Zw({shape:{symbolType:t,x:e,y:n,width:i,height:r}}),l.__isEmptyBrush=s,l.setColor=kl,l.setColor(o),l}function Ll(t,e){return Math.abs(t-e)<Yw}function Ol(t,e,n){var i=0,r=t[0];if(!r)return!1;for(var o=1;o<t.length;o++){var a=t[o];i+=mi(r[0],r[1],a[0],a[1],e,n),r=a}var s=t[0];return Ll(r[0],s[0])&&Ll(r[1],s[1])||(i+=mi(r[0],r[1],s[0],s[1],e,n)),0!==i}function zl(t,e,n){if(this.name=t,this.geometries=e,n)n=[n[0],n[1]];else{var i=this.getBoundingRect();n=[i.x+i.width/2,i.y+i.height/2]}this.center=n}function El(t){if(!t.UTF8Encoding)return t;var e=t.UTF8Scale;null==e&&(e=1024);for(var n=t.features,i=0;i<n.length;i++)for(var r=n[i].geometry,o=r.coordinates,a=r.encodeOffsets,s=0;s<o.length;s++){var l=o[s];if("Polygon"===r.type)o[s]=Nl(l,a[s],e);else if("MultiPolygon"===r.type)for(var u=0;u<l.length;u++){var h=l[u];l[u]=Nl(h,a[s][u],e)}}return t.UTF8Encoding=!1,t}function Nl(t,e,n){for(var i=[],r=e[0],o=e[1],a=0;a<t.length;a+=2){var s=t.charCodeAt(a)-64,l=t.charCodeAt(a+1)-64;s=s>>1^-(1&s),l=l>>1^-(1&l),r=s+=r,o=l+=o,i.push([s/n,l/n])}return i}function Rl(t){return"category"===t.type?Fl(t):Hl(t)}function Bl(t,e){return"category"===t.type?Wl(t,e):{ticks:t.scale.getTicks()}}function Fl(t){var e=t.getLabelModel(),n=Vl(t,e);return!e.get("show")||t.scale.isBlank()?{labels:[],labelCategoryInterval:n.labelCategoryInterval}:n}function Vl(t,e){var n=Gl(t,"labels"),i=Kl(e),r=Zl(n,i);if(r)return r;var o,a;return o=x(i)?$l(t,i):ql(t,a="auto"===i?Xl(t):i),Ul(n,i,{labels:o,labelCategoryInterval:a})}function Wl(t,e){var n=Gl(t,"ticks"),i=Kl(e),r=Zl(n,i);if(r)return r;var o,a;if(e.get("show")&&!t.scale.isBlank()||(o=[]),x(i))o=$l(t,i,!0);else if("auto"===i){var s=Vl(t,t.getLabelModel());a=s.labelCategoryInterval,o=f(s.labels,function(t){return t.tickValue})}else o=ql(t,a=i,!0);return Ul(n,i,{ticks:o,tickCategoryInterval:a})}function Hl(t){var e=t.scale.getTicks(),n=Tl(t);return{labels:f(e,function(e,i){return{formattedLabel:n(e,i),rawLabel:t.scale.getLabel(e),tickValue:e}})}}function Gl(t,e){return qw(t)[e]||(qw(t)[e]=[])}function Zl(t,e){for(var n=0;n<t.length;n++)if(t[n].key===e)return t[n].value}function Ul(t,e,n){return t.push({key:e,value:n}),n}function Xl(t){var e=qw(t).autoInterval;return null!=e?e:qw(t).autoInterval=t.calculateCategoryInterval()}function Yl(t){var e=jl(t),n=Tl(t),i=(e.axisRotate-e.labelRotate)/180*Math.PI,r=t.scale,o=r.getExtent(),a=r.count();if(o[1]-o[0]<1)return 0;var s=1;a>40&&(s=Math.max(1,Math.floor(a/40)));for(var l=o[0],u=t.dataToCoord(l+1)-t.dataToCoord(l),h=Math.abs(u*Math.cos(i)),c=Math.abs(u*Math.sin(i)),d=0,f=0;l<=o[1];l+=s){var p=0,g=0,m=Se(n(l),e.font,"center","top");p=1.3*m.width,g=1.3*m.height,d=Math.max(d,p,7),f=Math.max(f,g,7)}var v=d/h,y=f/c;isNaN(v)&&(v=1/0),isNaN(y)&&(y=1/0);var x=Math.max(0,Math.floor(Math.min(v,y))),_=qw(t.model),w=_.lastAutoInterval,b=_.lastTickCount;return null!=w&&null!=b&&Math.abs(w-x)<=1&&Math.abs(b-a)<=1&&w>x?x=w:(_.lastTickCount=a,_.lastAutoInterval=x),x}function jl(t){var e=t.getLabelModel();return{axisRotate:t.getRotate?t.getRotate():t.isHorizontal&&!t.isHorizontal()?90:0,labelRotate:e.get("rotate")||0,font:e.getFont()}}function ql(t,e,n){function i(t){l.push(n?t:{formattedLabel:r(t),rawLabel:o.getLabel(t),tickValue:t})}var r=Tl(t),o=t.scale,a=o.getExtent(),s=t.getLabelModel(),l=[],u=Math.max((e||0)+1,1),h=a[0],c=o.count();0!==h&&u>1&&c/u>2&&(h=Math.round(Math.ceil(h/u)*u));var d={min:s.get("showMinLabel"),max:s.get("showMaxLabel")};d.min&&h!==a[0]&&i(a[0]);for(var f=h;f<=a[1];f+=u)i(f);return d.max&&f!==a[1]&&i(a[1]),l}function $l(t,e,n){var i=t.scale,r=Tl(t),o=[];return d(i.getTicks(),function(t){var a=i.getLabel(t);e(t,a)&&o.push(n?t:{formattedLabel:r(t),rawLabel:a,tickValue:t})}),o}function Kl(t){var e=t.get("interval");return null==e?"auto":e}function Ql(t,e){var n=(t[1]-t[0])/e/2;t[0]+=n,t[1]-=n}function Jl(t,e,n,i,r){function o(t,e){return h?t>e:t<e}var a=e.length;if(t.onBand&&!i&&a){var s,l=t.getExtent();if(1===a)e[0].coord=l[0],s=e[1]={coord:l[0]};else{var u=e[1].coord-e[0].coord;d(e,function(t){t.coord-=u/2;var e=e||0;e%2>0&&(t.coord-=u/(2*(e+1)))}),s={coord:e[a-1].coord+u},e.push(s)}var h=l[0]>l[1];o(e[0].coord,l[0])&&(r?e[0].coord=l[0]:e.shift()),r&&o(l[0],e[0].coord)&&e.unshift({coord:l[0]}),o(l[1],s.coord)&&(r?s.coord=l[1]:e.pop()),r&&o(s.coord,l[1])&&e.push({coord:l[1]})}}function tu(t,e){var n=t.mapDimension("defaultedLabel",!0),i=n.length;if(1===i)return Jo(t,e,n[0]);if(i){for(var r=[],o=0;o<n.length;o++){var a=Jo(t,e,n[o]);r.push(a)}return r.join(" ")}}function eu(t,e,n){Jg.call(this),this.updateData(t,e,n)}function nu(t){return[t[0]/2,t[1]/2]}function iu(t,e){this.parent.drift(t,e)}function ru(){!Qi(this)&&au.call(this)}function ou(){!Qi(this)&&su.call(this)}function au(){if(!this.incremental&&!this.useHoverLayer){var t=this.__symbolOriginalScale,e=t[1]/t[0];this.animateTo({scale:[Math.max(1.1*t[0],t[0]+3),Math.max(1.1*t[1],t[1]+3*e)]},400,"elasticOut")}}function su(){this.incremental||this.useHoverLayer||this.animateTo({scale:this.__symbolOriginalScale},400,"elasticOut")}function lu(t){this.group=new Jg,this._symbolCtor=t||eu}function uu(t,e,n,i){return e&&!isNaN(e[0])&&!isNaN(e[1])&&!(i.isIgnore&&i.isIgnore(n))&&!(i.clipShape&&!i.clipShape.contain(e[0],e[1]))&&"none"!==t.getItemVisual(n,"symbol")}function hu(t){return null==t||w(t)||(t={isIgnore:t}),t||{}}function cu(t){var e=t.hostModel;return{itemStyle:e.getModel("itemStyle").getItemStyle(["color"]),hoverItemStyle:e.getModel("emphasis.itemStyle").getItemStyle(),symbolRotate:e.get("symbolRotate"),symbolOffset:e.get("symbolOffset"),hoverAnimation:e.get("hoverAnimation"),labelModel:e.getModel("label"),hoverLabelModel:e.getModel("emphasis.label"),cursorStyle:e.get("cursor")}}function du(t,e,n){var i,r=t.getBaseAxis(),o=t.getOtherAxis(r),a=fu(o,n),s=r.dim,l=o.dim,u=e.mapDimension(l),h=e.mapDimension(s),c="x"===l||"radius"===l?1:0,d=f(t.dimensions,function(t){return e.mapDimension(t)}),p=e.getCalculationInfo("stackResultDimension");return(i|=Ks(e,d[0]))&&(d[0]=p),(i|=Ks(e,d[1]))&&(d[1]=p),{dataDimsForPoint:d,valueStart:a,valueAxisDim:l,baseAxisDim:s,stacked:!!i,valueDim:u,baseDim:h,baseDataOffset:c,stackedOverDimension:e.getCalculationInfo("stackedOverDimension")}}function fu(t,e){var n=0,i=t.scale.getExtent();return"start"===e?n=i[0]:"end"===e?n=i[1]:i[0]>0?n=i[0]:i[1]<0&&(n=i[1]),n}function pu(t,e,n,i){var r=NaN;t.stacked&&(r=n.get(n.getCalculationInfo("stackedOverDimension"),i)),isNaN(r)&&(r=t.valueStart);var o=t.baseDataOffset,a=[];return a[o]=n.get(t.baseDim,i),a[1-o]=r,e.dataToPoint(a)}function gu(t,e){var n=[];return e.diff(t).add(function(t){n.push({cmd:"+",idx:t})}).update(function(t,e){n.push({cmd:"=",idx:e,idx1:t})}).remove(function(t){n.push({cmd:"-",idx:t})}).execute(),n}function mu(t){return isNaN(t[0])||isNaN(t[1])}function vu(t,e,n,i,r,o,a,s,l,u,h){return"none"!==u&&u?yu.apply(this,arguments):xu.apply(this,arguments)}function yu(t,e,n,i,r,o,a,s,l,u,h){for(var c=0,d=n,f=0;f<i;f++){var p=e[d];if(d>=r||d<0)break;if(mu(p)){if(h){d+=o;continue}break}if(d===n)t[o>0?"moveTo":"lineTo"](p[0],p[1]);else if(l>0){var g=e[c],m="y"===u?1:0,v=(p[m]-g[m])*l;db(pb,g),pb[m]=g[m]+v,db(gb,p),gb[m]=p[m]-v,t.bezierCurveTo(pb[0],pb[1],gb[0],gb[1],p[0],p[1])}else t.lineTo(p[0],p[1]);c=d,d+=o}return f}function xu(t,e,n,i,r,o,a,s,l,u,h){for(var c=0,d=n,f=0;f<i;f++){var p=e[d];if(d>=r||d<0)break;if(mu(p)){if(h){d+=o;continue}break}if(d===n)t[o>0?"moveTo":"lineTo"](p[0],p[1]),db(pb,p);else if(l>0){var g=d+o,m=e[g];if(h)for(;m&&mu(e[g]);)m=e[g+=o];var v=.5,y=e[c];if(!(m=e[g])||mu(m))db(gb,p);else{mu(m)&&!h&&(m=p),G(fb,m,y);var x,_;if("x"===u||"y"===u){var w="x"===u?0:1;x=Math.abs(p[w]-y[w]),_=Math.abs(p[w]-m[w])}else x=hg(p,y),_=hg(p,m);cb(gb,p,fb,-l*(1-(v=_/(_+x))))}ub(pb,pb,s),hb(pb,pb,a),ub(gb,gb,s),hb(gb,gb,a),t.bezierCurveTo(pb[0],pb[1],gb[0],gb[1],p[0],p[1]),cb(pb,p,fb,l*v)}else t.lineTo(p[0],p[1]);c=d,d+=o}return f}function _u(t,e){var n=[1/0,1/0],i=[-1/0,-1/0];if(e)for(var r=0;r<t.length;r++){var o=t[r];o[0]<n[0]&&(n[0]=o[0]),o[1]<n[1]&&(n[1]=o[1]),o[0]>i[0]&&(i[0]=o[0]),o[1]>i[1]&&(i[1]=o[1])}return{min:e?n:i,max:e?i:n}}function wu(t,e){if(t.length===e.length){for(var n=0;n<t.length;n++){var i=t[n],r=e[n];if(i[0]!==r[0]||i[1]!==r[1])return}return!0}}function bu(t){return"number"==typeof t?t:t?.5:0}function Su(t){var e=t.getGlobalExtent();if(t.onBand){var n=t.getBandWidth()/2-1,i=e[1]>e[0]?1:-1;e[0]+=i*n,e[1]-=i*n}return e}function Mu(t,e,n){if(!n.valueDim)return[];for(var i=[],r=0,o=e.count();r<o;r++)i.push(pu(n,t,e,r));return i}function Iu(t,e,n,i){var r=Su(t.getAxis("x")),o=Su(t.getAxis("y")),a=t.getBaseAxis().isHorizontal(),s=Math.min(r[0],r[1]),l=Math.min(o[0],o[1]),u=Math.max(r[0],r[1])-s,h=Math.max(o[0],o[1])-l;if(n)s-=.5,u+=.5,l-=.5,h+=.5;else{var c=i.get("lineStyle.width")||2,d=i.get("clipOverflow")?c/2:Math.max(u,h);a?(l-=d,h+=2*d):(s-=d,u+=2*d)}var f=new py({shape:{x:s,y:l,width:u,height:h}});return e&&(f.shape[a?"width":"height"]=0,mr(f,{shape:{width:u,height:h}},i)),f}function Tu(t,e,n,i){var r=t.getAngleAxis(),o=t.getRadiusAxis().getExtent().slice();o[0]>o[1]&&o.reverse();var a=r.getExtent(),s=Math.PI/180;n&&(o[0]-=.5,o[1]+=.5);var l=new ly({shape:{cx:kr(t.cx,1),cy:kr(t.cy,1),r0:kr(o[0],1),r:kr(o[1],1),startAngle:-a[0]*s,endAngle:-a[1]*s,clockwise:r.inverse}});return e&&(l.shape.endAngle=-a[0]*s,mr(l,{shape:{endAngle:-a[1]*s}},i)),l}function Cu(t,e,n,i){return"polar"===t.type?Tu(t,e,n,i):Iu(t,e,n,i)}function Au(t,e,n){for(var i=e.getBaseAxis(),r="x"===i.dim||"radius"===i.dim?0:1,o=[],a=0;a<t.length-1;a++){var s=t[a+1],l=t[a];o.push(l);var u=[];switch(n){case"end":u[r]=s[r],u[1-r]=l[1-r],o.push(u);break;case"middle":var h=(l[r]+s[r])/2,c=[];u[r]=c[r]=h,u[1-r]=l[1-r],c[1-r]=s[1-r],o.push(u),o.push(c);break;default:u[r]=l[r],u[1-r]=s[1-r],o.push(u)}}return t[a]&&o.push(t[a]),o}function Du(t,e){var n=t.getVisual("visualMeta");if(n&&n.length&&t.count()&&"cartesian2d"===e.type){for(var i,r,o=n.length-1;o>=0;o--){var a=n[o].dimension,s=t.dimensions[a],l=t.getDimensionInfo(s);if("x"===(i=l&&l.coordDim)||"y"===i){r=n[o];break}}if(r){var u=e.getAxis(i),h=f(r.stops,function(t){return{coord:u.toGlobalCoord(u.dataToCoord(t.value)),color:t.color}}),c=h.length,p=r.outerColors.slice();c&&h[0].coord>h[c-1].coord&&(h.reverse(),p.reverse());var g=h[0].coord-10,m=h[c-1].coord+10,v=m-g;if(v<.001)return"transparent";d(h,function(t){t.offset=(t.coord-g)/v}),h.push({offset:c?h[c-1].offset:.5,color:p[1]||"transparent"}),h.unshift({offset:c?h[0].offset:.5,color:p[0]||"transparent"});var y=new wy(0,0,0,0,h,!0);return y[i]=g,y[i+"2"]=m,y}}}function ku(t,e,n){var i=t.get("showAllSymbol"),r="auto"===i;if(!i||r){var o=n.getAxesByScale("ordinal")[0];if(o&&(!r||!Pu(o,e))){var a=e.mapDimension(o.dim),s={};return d(o.getViewLabels(),function(t){s[t.tickValue]=1}),function(t){return!s.hasOwnProperty(e.get(a,t))}}}}function Pu(t,e){var n=t.getExtent(),i=Math.abs(n[1]-n[0])/t.scale.count();isNaN(i)&&(i=0);for(var r=e.count(),o=Math.max(1,Math.round(r/5)),a=0;a<r;a+=o)if(1.5*eu.getSymbolSize(e,a)[t.isHorizontal()?1:0]>i)return!1;return!0}function Lu(t){return this._axes[t]}function Ou(t){bb.call(this,t)}function zu(t,e){return e.type||(e.data?"category":"value")}function Eu(t,e,n){return t.getCoordSysModel()===e}function Nu(t,e,n){this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this._initCartesian(t,e,n),this.model=t}function Ru(t,e,n,i){function r(t){return t.dim+"_"+t.index}n.getAxesOnZeroOf=function(){return o?[o]:[]};var o,a=t[e],s=n.model,l=s.get("axisLine.onZero"),u=s.get("axisLine.onZeroAxisIndex");if(l){if(null!=u)Bu(a[u])&&(o=a[u]);else for(var h in a)if(a.hasOwnProperty(h)&&Bu(a[h])&&!i[r(a[h])]){o=a[h];break}o&&(i[r(o)]=!0)}}function Bu(t){return t&&"category"!==t.type&&"time"!==t.type&&Il(t)}function Fu(t,e){var n=t.getExtent(),i=n[0]+n[1];t.toGlobalCoord="x"===t.dim?function(t){return t+e}:function(t){return i-t+e},t.toLocalCoord="x"===t.dim?function(t){return t-e}:function(t){return i-t+e}}function Vu(t,e){return f(Pb,function(e){return t.getReferringComponents(e)[0]})}function Wu(t){return"cartesian2d"===t.get("coordinateSystem")}function Hu(t){var e={componentType:t.mainType,componentIndex:t.componentIndex};return e[t.mainType+"Index"]=t.componentIndex,e}function Gu(t,e,n,i){var r,o,a=Nr(n-t.rotation),s=i[0]>i[1],l="start"===e&&!s||"start"!==e&&s;return Rr(a-Lb/2)?(o=l?"bottom":"top",r="center"):Rr(a-1.5*Lb)?(o=l?"top":"bottom",r="center"):(o="middle",r=a<1.5*Lb&&a>Lb/2?l?"left":"right":l?"right":"left"),{rotation:a,textAlign:r,textVerticalAlign:o}}function Zu(t){var e=t.get("tooltip");return t.get("silent")||!(t.get("triggerEvent")||e&&e.show)}function Uu(t,e,n){var i=t.get("axisLabel.showMinLabel"),r=t.get("axisLabel.showMaxLabel");e=e||[],n=n||[];var o=e[0],a=e[1],s=e[e.length-1],l=e[e.length-2],u=n[0],h=n[1],c=n[n.length-1],d=n[n.length-2];!1===i?(Xu(o),Xu(u)):Yu(o,a)&&(i?(Xu(a),Xu(h)):(Xu(o),Xu(u))),!1===r?(Xu(s),Xu(c)):Yu(l,s)&&(r?(Xu(l),Xu(d)):(Xu(s),Xu(c)))}function Xu(t){t&&(t.ignore=!0)}function Yu(t,e,n){var i=t&&t.getBoundingRect().clone(),r=e&&e.getBoundingRect().clone();if(i&&r){var o=pt([]);return yt(o,o,-t.rotation),i.applyTransform(mt([],o,t.getLocalTransform())),r.applyTransform(mt([],o,e.getLocalTransform())),i.intersect(r)}}function ju(t){return"middle"===t||"center"===t}function qu(t,e,n){var i=e.axis;if(e.get("axisTick.show")&&!i.scale.isBlank()){for(var r=e.getModel("axisTick"),o=r.getModel("lineStyle"),s=r.get("length"),l=i.getTicksCoords(),u=[],h=[],c=t._transform,d=[],f=0;f<l.length;f++){var p=l[f].coord;u[0]=p,u[1]=0,h[0]=p,h[1]=n.tickDirection*s,c&&($(u,u,c),$(h,h,c));var g=new gy(Vi({anid:"tick_"+l[f].tickValue,shape:{x1:u[0],y1:u[1],x2:h[0],y2:h[1]},style:a(o.getLineStyle(),{stroke:e.get("axisLine.lineStyle.color")}),z2:2,silent:!0}));t.group.add(g),d.push(g)}return d}}function $u(t,e,n){var i=e.axis;if(T(n.axisLabelShow,e.get("axisLabel.show"))&&!i.scale.isBlank()){var r=e.getModel("axisLabel"),o=r.get("margin"),a=i.getViewLabels(),s=(T(n.labelRotate,r.get("rotate"))||0)*Lb/180,l=Eb(n.rotation,s,n.labelDirection),u=e.getCategories(!0),h=[],c=Zu(e),f=e.get("triggerEvent");return d(a,function(a,s){var d=a.tickValue,p=a.formattedLabel,g=a.rawLabel,m=r;u&&u[d]&&u[d].textStyle&&(m=new Sr(u[d].textStyle,r,e.ecModel));var v=m.getTextColor()||e.get("axisLine.lineStyle.color"),y=[i.dataToCoord(d),n.labelOffset+n.labelDirection*o],x=new ry({anid:"label_"+d,position:y,rotation:l.rotation,silent:c,z2:10});ar(x.style,m,{text:p,textAlign:m.getShallow("align",!0)||l.textAlign,textVerticalAlign:m.getShallow("verticalAlign",!0)||m.getShallow("baseline",!0)||l.textVerticalAlign,textFill:"function"==typeof v?v("category"===i.type?g:"value"===i.type?d+"":d,s):v}),f&&(x.eventData=Hu(e),x.eventData.targetType="axisLabel",x.eventData.value=g),t._dumbGroup.add(x),x.updateTransform(),h.push(x),t.group.add(x),x.decomposeTransform()}),h}}function Ku(t,e){var n={axesInfo:{},seriesInvolved:!1,coordSysAxesInfo:{},coordSysMap:{}};return Qu(n,t,e),n.seriesInvolved&&th(n,t),n}function Qu(t,e,n){var i=e.getComponent("tooltip"),r=e.getComponent("axisPointer"),o=r.get("link",!0)||[],a=[];Nb(n.getCoordinateSystems(),function(n){function s(i,s,l){var c=l.model.getModel("axisPointer",r),d=c.get("show");if(d&&("auto"!==d||i||ah(c))){null==s&&(s=c.get("triggerTooltip"));var f=(c=i?Ju(l,h,r,e,i,s):c).get("snap"),p=sh(l.model),g=s||f||"category"===l.type,m=t.axesInfo[p]={key:p,axis:l,coordSys:n,axisPointerModel:c,triggerTooltip:s,involveSeries:g,snap:f,useHandle:ah(c),seriesModels:[]};u[p]=m,t.seriesInvolved|=g;var v=eh(o,l);if(null!=v){var y=a[v]||(a[v]={axesInfo:{}});y.axesInfo[p]=m,y.mapper=o[v].mapper,m.linkGroup=y}}}if(n.axisPointerEnabled){var l=sh(n.model),u=t.coordSysAxesInfo[l]={};t.coordSysMap[l]=n;var h=n.model.getModel("tooltip",i);if(Nb(n.getAxes(),Rb(s,!1,null)),n.getTooltipAxes&&i&&h.get("show")){var c="axis"===h.get("trigger"),d="cross"===h.get("axisPointer.type"),f=n.getTooltipAxes(h.get("axisPointer.axis"));(c||d)&&Nb(f.baseAxes,Rb(s,!d||"cross",c)),d&&Nb(f.otherAxes,Rb(s,"cross",!1))}}})}function Ju(t,e,i,r,o,s){var l=e.getModel("axisPointer"),u={};Nb(["type","snap","lineStyle","shadowStyle","label","animation","animationDurationUpdate","animationEasingUpdate","z"],function(t){u[t]=n(l.get(t))}),u.snap="category"!==t.type&&!!s,"cross"===l.get("type")&&(u.type="line");var h=u.label||(u.label={});if(null==h.show&&(h.show=!1),"cross"===o){var c=l.get("label.show");if(h.show=null==c||c,!s){var d=u.lineStyle=l.get("crossStyle");d&&a(h,d.textStyle)}}return t.model.getModel("axisPointer",new Sr(u,i,r))}function th(t,e){e.eachSeries(function(e){var n=e.coordinateSystem,i=e.get("tooltip.trigger",!0),r=e.get("tooltip.show",!0);n&&"none"!==i&&!1!==i&&"item"!==i&&!1!==r&&!1!==e.get("axisPointer.show",!0)&&Nb(t.coordSysAxesInfo[sh(n.model)],function(t){var i=t.axis;n.getAxis(i.dim)===i&&(t.seriesModels.push(e),null==t.seriesDataCount&&(t.seriesDataCount=0),t.seriesDataCount+=e.getData().count())})},this)}function eh(t,e){for(var n=e.model,i=e.dim,r=0;r<t.length;r++){var o=t[r]||{};if(nh(o[i+"AxisId"],n.id)||nh(o[i+"AxisIndex"],n.componentIndex)||nh(o[i+"AxisName"],n.name))return r}}function nh(t,e){return"all"===t||y(t)&&l(t,e)>=0||t===e}function ih(t){var e=rh(t);if(e){var n=e.axisPointerModel,i=e.axis.scale,r=n.option,o=n.get("status"),a=n.get("value");null!=a&&(a=i.parse(a));var s=ah(n);null==o&&(r.status=s?"show":"hide");var l=i.getExtent().slice();l[0]>l[1]&&l.reverse(),(null==a||a>l[1])&&(a=l[1]),a<l[0]&&(a=l[0]),r.value=a,s&&(r.status=e.axis.scale.isBlank()?"hide":"show")}}function rh(t){var e=(t.ecModel.getComponent("axisPointer")||{}).coordSysAxesInfo;return e&&e.axesInfo[sh(t)]}function oh(t){var e=rh(t);return e&&e.axisPointerModel}function ah(t){return!!t.get("handle.show")}function sh(t){return t.type+"||"+t.id}function lh(t,e,n,i,r,o){var a=Bb.getAxisPointerClass(t.axisPointerClass);if(a){var s=oh(e);s?(t._axisPointer||(t._axisPointer=new a)).render(e,s,i,o):uh(t,i)}}function uh(t,e,n){var i=t._axisPointer;i&&i.dispose(e,n),t._axisPointer=null}function hh(t,e,n){n=n||{};var i=t.coordinateSystem,r=e.axis,o={},a=r.getAxesOnZeroOf()[0],s=r.position,l=a?"onZero":s,u=r.dim,h=i.getRect(),c=[h.x,h.x+h.width,h.y,h.y+h.height],d={left:0,right:1,top:0,bottom:1,onZero:2},f=e.get("offset")||0,p="x"===u?[c[2]-f,c[3]+f]:[c[0]-f,c[1]+f];if(a){var g=a.toGlobalCoord(a.dataToCoord(0));p[d.onZero]=Math.max(Math.min(g,p[1]),p[0])}o.position=["y"===u?p[d[l]]:c[0],"x"===u?p[d[l]]:c[3]],o.rotation=Math.PI/2*("x"===u?0:1);var m={top:-1,bottom:1,left:-1,right:1};o.labelDirection=o.tickDirection=o.nameDirection=m[s],o.labelOffset=a?p[d[s]]-p[d.onZero]:0,e.get("axisTick.inside")&&(o.tickDirection=-o.tickDirection),T(n.labelInside,e.get("axisLabel.inside"))&&(o.labelDirection=-o.labelDirection);var v=e.get("axisLabel.rotate");return o.labelRotate="top"===l?-v:v,o.z2=1,o}function ch(t,e,n,i,r,o,a){or(t,e,n.getModel("label"),n.getModel("emphasis.label"),{labelFetcher:r,labelDataIndex:o,defaultText:tu(r.getData(),o),isRectText:!0,autoColor:i}),dh(t),dh(e)}function dh(t,e){"outside"===t.textPosition&&(t.textPosition=e)}function fh(t,e,n){n.style.text=null,gr(n,{shape:{width:0}},e,t,function(){n.parent&&n.parent.remove(n)})}function ph(t,e,n){n.style.text=null,gr(n,{shape:{r:n.shape.r0}},e,t,function(){n.parent&&n.parent.remove(n)})}function gh(t,e,n,i,r,o,s,l){var u=e.getItemVisual(n,"color"),h=e.getItemVisual(n,"opacity"),c=i.getModel("itemStyle"),d=i.getModel("emphasis.itemStyle").getBarItemStyle();l||t.setShape("r",c.get("barBorderRadius")||0),t.useStyle(a({fill:u,opacity:h},c.getBarItemStyle()));var f=i.getShallow("cursor");f&&t.attr("cursor",f);var p=s?r.height>0?"bottom":"top":r.width>0?"left":"right";l||ch(t.style,d,i,u,o,n,p),ir(t,d)}function mh(t,e){var n=t.get(Ub)||0;return Math.min(n,Math.abs(e.width),Math.abs(e.height))}function vh(t,e,n){var i=t.getData(),r=[],o=i.getLayout("valueAxisHorizontal")?1:0;r[1-o]=i.getLayout("valueAxisStart");var a=new jb({shape:{points:i.getLayout("largePoints")},incremental:!!n,__startPoint:r,__valueIdx:o});e.add(a),yh(a,t,i)}function yh(t,e,n){var i=n.getVisual("borderColor")||n.getVisual("color"),r=e.getModel("itemStyle").getItemStyle(["color","borderColor"]);t.useStyle(r),t.style.fill=null,t.style.stroke=i,t.style.lineWidth=n.getLayout("barWidth")}function xh(t,e,n,i){var r=e.getData(),o=this.dataIndex,a=r.getName(o),s=e.get("selectedOffset");i.dispatchAction({type:"pieToggleSelect",from:t,name:a,seriesId:e.id}),r.each(function(t){_h(r.getItemGraphicEl(t),r.getItemLayout(t),e.isSelected(r.getName(t)),s,n)})}function _h(t,e,n,i,r){var o=(e.startAngle+e.endAngle)/2,a=Math.cos(o),s=Math.sin(o),l=n?i:0,u=[a*l,s*l];r?t.animate().when(200,{position:u}).start("bounceOut"):t.attr("position",u)}function wh(t,e){function n(){o.ignore=o.hoverIgnore,a.ignore=a.hoverIgnore}function i(){o.ignore=o.normalIgnore,a.ignore=a.normalIgnore}Jg.call(this);var r=new ly({z2:2}),o=new fy,a=new ry;this.add(r),this.add(o),this.add(a),this.updateData(t,e,!0),this.on("emphasis",n).on("normal",i).on("mouseover",n).on("mouseout",i)}function bh(t,e,n,i,r,o,a){function s(e,n){for(var i=e;i>=0&&(t[i].y-=n,!(i>0&&t[i].y>t[i-1].y+t[i-1].height));i--);}function l(t,e,n,i,r,o){for(var a=e?Number.MAX_VALUE:0,s=0,l=t.length;s<l;s++)if("center"!==t[s].position){var u=Math.abs(t[s].y-i),h=t[s].len,c=t[s].len2,d=u<r+h?Math.sqrt((r+h+c)*(r+h+c)-u*u):Math.abs(t[s].x-n);e&&d>=a&&(d=a-10),!e&&d<=a&&(d=a+10),t[s].x=n+d*o,a=d}}t.sort(function(t,e){return t.y-e.y});for(var u,h=0,c=t.length,d=[],f=[],p=0;p<c;p++)(u=t[p].y-h)<0&&function(e,n,i,r){for(var o=e;o<n;o++)if(t[o].y+=i,o>e&&o+1<n&&t[o+1].y>t[o].y+t[o].height)return void s(o,i/2);s(n-1,i/2)}(p,c,-u),h=t[p].y+t[p].height;a-h<0&&s(c-1,h-a);for(p=0;p<c;p++)t[p].y>=n?f.push(t[p]):d.push(t[p]);l(d,!1,e,n,i,r),l(f,!0,e,n,i,r)}function Sh(t,e,n,i,r,o){for(var a=[],s=[],l=0;l<t.length;l++)t[l].x<e?a.push(t[l]):s.push(t[l]);bh(s,e,n,i,1,r,o),bh(a,e,n,i,-1,r,o);for(l=0;l<t.length;l++){var u=t[l].linePoints;if(u){var h=u[1][0]-u[2][0];t[l].x<e?u[2][0]=t[l].x+3:u[2][0]=t[l].x-3,u[1][1]=u[2][1]=t[l].y,u[1][0]=u[2][0]+h}}}function Mh(){this.group=new Jg}function Ih(t,e,n,i){var r=n.type,o=new(0,ky[r.charAt(0).toUpperCase()+r.slice(1)])(n);e.add(o),i.set(t,o),o.__ecGraphicId=t}function Th(t,e){var n=t&&t.parent;n&&("group"===t.type&&t.traverse(function(t){Th(t,e)}),e.removeKey(t.__ecGraphicId),n.remove(t))}function Ch(t){return t=o({},t),d(["id","parentId","$action","hv","bounding"].concat($y),function(e){delete t[e]}),t}function Ah(t,e){var n;return d(e,function(e){null!=t[e]&&"auto"!==t[e]&&(n=!0)}),n}function Dh(t,e){var n=t.exist;if(e.id=t.keyInfo.id,!e.type&&n&&(e.type=n.type),null==e.parentId){var i=e.parentOption;i?e.parentId=i.id:n&&(e.parentId=n.parentId)}e.parentOption=null}function kh(t,e,n){var r=o({},n),a=t[e],s=n.$action||"merge";"merge"===s?a?(i(a,r,!0),Jr(a,r,{ignoreSize:!0}),eo(n,a)):t[e]=r:"replace"===s?t[e]=r:"remove"===s&&a&&(t[e]=null)}function Ph(t,e){t&&(t.hv=e.hv=[Ah(e,["left","right"]),Ah(e,["top","bottom"])],"group"===t.type&&(null==t.width&&(t.width=e.width=0),null==t.height&&(t.height=e.height=0)))}function Lh(t,e,n){var i=t.eventData;t.silent||t.ignore||i||(i=t.eventData={componentType:"graphic",componentIndex:e.componentIndex,name:t.name}),i&&(i.info=t.info)}function Oh(t,e,n,i,r){var a=t.axis;if(!a.scale.isBlank()&&a.containData(e))if(t.involveSeries){var s=zh(e,t),l=s.payloadBatch,u=s.snapToValue;l[0]&&null==r.seriesIndex&&o(r,l[0]),!i&&t.snap&&a.containData(u)&&null!=u&&(e=u),n.showPointer(t,e,l,r),n.showTooltip(t,s,u)}else n.showPointer(t,e)}function zh(t,e){var n=e.axis,i=n.dim,r=t,o=[],a=Number.MAX_VALUE,s=-1;return aS(e.seriesModels,function(e,l){var u,h,c=e.getData().mapDimension(i,!0);if(e.getAxisTooltipData){var d=e.getAxisTooltipData(c,t,n);h=d.dataIndices,u=d.nestestValue}else{if(!(h=e.getData().indicesOfNearest(c[0],t,"category"===n.type?.5:null)).length)return;u=e.getData().get(c[0],h[0])}if(null!=u&&isFinite(u)){var f=t-u,p=Math.abs(f);p<=a&&((p<a||f>=0&&s<0)&&(a=p,s=f,r=u,o.length=0),aS(h,function(t){o.push({seriesIndex:e.seriesIndex,dataIndexInside:t,dataIndex:e.getData().getRawIndex(t)})}))}}),{payloadBatch:o,snapToValue:r}}function Eh(t,e,n,i){t[e.key]={value:n,payloadBatch:i}}function Nh(t,e,n,i){var r=n.payloadBatch,o=e.axis,a=o.model,s=e.axisPointerModel;if(e.triggerTooltip&&r.length){var l=e.coordSys.model,u=sh(l),h=t.map[u];h||(h=t.map[u]={coordSysId:l.id,coordSysIndex:l.componentIndex,coordSysType:l.type,coordSysMainType:l.mainType,dataByAxis:[]},t.list.push(h)),h.dataByAxis.push({axisDim:o.dim,axisIndex:a.componentIndex,axisType:a.type,axisId:a.id,value:i,valueLabelOpt:{precision:s.get("label.precision"),formatter:s.get("label.formatter")},seriesDataIndices:r.slice()})}}function Rh(t,e,n){var i=n.axesInfo=[];aS(e,function(e,n){var r=e.axisPointerModel.option,o=t[n];o?(!e.useHandle&&(r.status="show"),r.value=o.value,r.seriesDataIndices=(o.payloadBatch||[]).slice()):!e.useHandle&&(r.status="hide"),"show"===r.status&&i.push({axisDim:e.axis.dim,axisIndex:e.axis.model.componentIndex,value:r.value})})}function Bh(t,e,n,i){if(!Hh(e)&&t.list.length){var r=((t.list[0].dataByAxis[0]||{}).seriesDataIndices||[])[0]||{};i({type:"showTip",escapeConnect:!0,x:e[0],y:e[1],tooltipOption:n.tooltipOption,position:n.position,dataIndexInside:r.dataIndexInside,dataIndex:r.dataIndex,seriesIndex:r.seriesIndex,dataByCoordSys:t.list})}else i({type:"hideTip"})}function Fh(t,e,n){var i=n.getZr(),r=lS(i).axisPointerLastHighlights||{},o=lS(i).axisPointerLastHighlights={};aS(t,function(t,e){var n=t.axisPointerModel.option;"show"===n.status&&aS(n.seriesDataIndices,function(t){var e=t.seriesIndex+" | "+t.dataIndex;o[e]=t})});var a=[],s=[];d(r,function(t,e){!o[e]&&s.push(t)}),d(o,function(t,e){!r[e]&&a.push(t)}),s.length&&n.dispatchAction({type:"downplay",escapeConnect:!0,batch:s}),a.length&&n.dispatchAction({type:"highlight",escapeConnect:!0,batch:a})}function Vh(t,e){for(var n=0;n<(t||[]).length;n++){var i=t[n];if(e.axis.dim===i.axisDim&&e.axis.model.componentIndex===i.axisIndex)return i}}function Wh(t){var e=t.axis.model,n={},i=n.axisDim=t.axis.dim;return n.axisIndex=n[i+"AxisIndex"]=e.componentIndex,n.axisName=n[i+"AxisName"]=e.name,n.axisId=n[i+"AxisId"]=e.id,n}function Hh(t){return!t||null==t[0]||isNaN(t[0])||null==t[1]||isNaN(t[1])}function Gh(t,e,n){if(!Xp.node){var i=e.getZr();uS(i).records||(uS(i).records={}),Zh(i,e),(uS(i).records[t]||(uS(i).records[t]={})).handler=n}}function Zh(t,e){function n(n,i){t.on(n,function(n){var r=jh(e);hS(uS(t).records,function(t){t&&i(t,n,r.dispatchAction)}),Uh(r.pendings,e)})}uS(t).initialized||(uS(t).initialized=!0,n("click",v(Yh,"click")),n("mousemove",v(Yh,"mousemove")),n("globalout",Xh))}function Uh(t,e){var n,i=t.showTip.length,r=t.hideTip.length;i?n=t.showTip[i-1]:r&&(n=t.hideTip[r-1]),n&&(n.dispatchAction=null,e.dispatchAction(n))}function Xh(t,e,n){t.handler("leave",null,n)}function Yh(t,e,n,i){e.handler(t,n,i)}function jh(t){var e={showTip:[],hideTip:[]},n=function(i){var r=e[i.type];r?r.push(i):(i.dispatchAction=n,t.dispatchAction(i))};return{dispatchAction:n,pendings:e}}function qh(t,e){if(!Xp.node){var n=e.getZr();(uS(n).records||{})[t]&&(uS(n).records[t]=null)}}function $h(){}function Kh(t,e,n,i){Qh(dS(n).lastProp,i)||(dS(n).lastProp=i,e?gr(n,i,t):(n.stopAnimation(),n.attr(i)))}function Qh(t,e){if(w(t)&&w(e)){var n=!0;return d(e,function(e,i){n=n&&Qh(t[i],e)}),!!n}return t===e}function Jh(t,e){t[e.get("label.show")?"show":"hide"]()}function tc(t){return{position:t.position.slice(),rotation:t.rotation||0}}function ec(t,e,n){var i=e.get("z"),r=e.get("zlevel");t&&t.traverse(function(t){"group"!==t.type&&(null!=i&&(t.z=i),null!=r&&(t.zlevel=r),t.silent=n)})}function nc(t){var e,n=t.get("type"),i=t.getModel(n+"Style");return"line"===n?(e=i.getLineStyle()).fill=null:"shadow"===n&&((e=i.getAreaStyle()).stroke=null),e}function ic(t,e,n,i,r){var o=oc(n.get("value"),e.axis,e.ecModel,n.get("seriesDataIndices"),{precision:n.get("label.precision"),formatter:n.get("label.formatter")}),a=n.getModel("label"),s=Wy(a.get("padding")||0),l=a.getFont(),u=Se(o,l),h=r.position,c=u.width+s[1]+s[3],d=u.height+s[0]+s[2],f=r.align;"right"===f&&(h[0]-=c),"center"===f&&(h[0]-=c/2);var p=r.verticalAlign;"bottom"===p&&(h[1]-=d),"middle"===p&&(h[1]-=d/2),rc(h,c,d,i);var g=a.get("backgroundColor");g&&"auto"!==g||(g=e.get("axisLine.lineStyle.color")),t.label={shape:{x:0,y:0,width:c,height:d,r:a.get("borderRadius")},position:h.slice(),style:{text:o,textFont:l,textFill:a.getTextColor(),textPosition:"inside",fill:g,stroke:a.get("borderColor")||"transparent",lineWidth:a.get("borderWidth")||0,shadowBlur:a.get("shadowBlur"),shadowColor:a.get("shadowColor"),shadowOffsetX:a.get("shadowOffsetX"),shadowOffsetY:a.get("shadowOffsetY")},z2:10}}function rc(t,e,n,i){var r=i.getWidth(),o=i.getHeight();t[0]=Math.min(t[0]+e,r)-e,t[1]=Math.min(t[1]+n,o)-n,t[0]=Math.max(t[0],0),t[1]=Math.max(t[1],0)}function oc(t,e,n,i,r){t=e.scale.parse(t);var o=e.scale.getLabel(t,{precision:r.precision}),a=r.formatter;if(a){var s={value:Cl(e,t),seriesData:[]};d(i,function(t){var e=n.getSeriesByIndex(t.seriesIndex),i=t.dataIndexInside,r=e&&e.getDataParams(i);r&&s.seriesData.push(r)}),_(a)?o=a.replace("{value}",o):x(a)&&(o=a(s))}return o}function ac(t,e,n){var i=ft();return yt(i,i,n.rotation),vt(i,i,n.position),yr([t.dataToCoord(e),(n.labelOffset||0)+(n.labelDirection||1)*(n.labelMargin||0)],i)}function sc(t,e,n,i,r,o){var a=Ob.innerTextLayout(n.rotation,0,n.labelDirection);n.labelMargin=r.get("label.margin"),ic(e,i,r,o,{position:ac(i.axis,t,n),align:a.textAlign,verticalAlign:a.textVerticalAlign})}function lc(t,e,n){return n=n||0,{x1:t[n],y1:t[1-n],x2:e[n],y2:e[1-n]}}function uc(t,e,n){return n=n||0,{x:t[n],y:t[1-n],width:e[n],height:e[1-n]}}function hc(t,e){var n={};return n[e.dim+"AxisIndex"]=e.index,t.getCartesian(n)}function cc(t){return"x"===t.dim?0:1}function dc(t){var e="left "+t+"s cubic-bezier(0.23, 1, 0.32, 1),top "+t+"s cubic-bezier(0.23, 1, 0.32, 1)";return f(xS,function(t){return t+"transition:"+e}).join(";")}function fc(t){var e=[],n=t.get("fontSize"),i=t.getTextColor();return i&&e.push("color:"+i),e.push("font:"+t.getFont()),n&&e.push("line-height:"+Math.round(3*n/2)+"px"),vS(["decoration","align"],function(n){var i=t.get(n);i&&e.push("text-"+n+":"+i)}),e.join(";")}function pc(t){var e=[],n=t.get("transitionDuration"),i=t.get("backgroundColor"),r=t.getModel("textStyle"),o=t.get("padding");return n&&e.push(dc(n)),i&&(Xp.canvasSupported?e.push("background-Color:"+i):(e.push("background-Color:#"+Rt(i)),e.push("filter:alpha(opacity=70)"))),vS(["width","color","radius"],function(n){var i="border-"+n,r=yS(i),o=t.get(r);null!=o&&e.push(i+":"+o+("color"===n?"":"px"))}),e.push(fc(r)),null!=o&&e.push("padding:"+Wy(o).join("px ")+"px"),e.join(";")+";"}function gc(t,e){if(Xp.wxa)return null;var n=document.createElement("div"),i=this._zr=e.getZr();this.el=n,this._x=e.getWidth()/2,this._y=e.getHeight()/2,t.appendChild(n),this._container=t,this._show=!1,this._hideTimeout;var r=this;n.onmouseenter=function(){r._enterable&&(clearTimeout(r._hideTimeout),r._show=!0),r._inContent=!0},n.onmousemove=function(e){if(e=e||window.event,!r._enterable){var n=i.handler;ot(t,e,!0),n.dispatch("mousemove",e)}},n.onmouseleave=function(){r._enterable&&r._show&&r.hideLater(r._hideDelay),r._inContent=!1}}function mc(t){this._zr=t.getZr(),this._show=!1,this._hideTimeout}function vc(t){for(var e=t.pop();t.length;){var n=t.pop();n&&(Sr.isInstance(n)&&(n=n.get("tooltip",!0)),"string"==typeof n&&(n={formatter:n}),e=new Sr(n,e,e.ecModel))}return e}function yc(t,e){return t.dispatchAction||m(e.dispatchAction,e)}function xc(t,e,n,i,r,o,a){var s=n.getOuterSize(),l=s.width,u=s.height;return null!=o&&(t+l+o>i?t-=l+o:t+=o),null!=a&&(e+u+a>r?e-=u+a:e+=a),[t,e]}function _c(t,e,n,i,r){var o=n.getOuterSize(),a=o.width,s=o.height;return t=Math.min(t+a,i)-a,e=Math.min(e+s,r)-s,t=Math.max(t,0),e=Math.max(e,0),[t,e]}function wc(t,e,n){var i=n[0],r=n[1],o=0,a=0,s=e.width,l=e.height;switch(t){case"inside":o=e.x+s/2-i/2,a=e.y+l/2-r/2;break;case"top":o=e.x+s/2-i/2,a=e.y-r-5;break;case"bottom":o=e.x+s/2-i/2,a=e.y+l+5;break;case"left":o=e.x-i-5,a=e.y+l/2-r/2;break;case"right":o=e.x+s+5,a=e.y+l/2-r/2}return[o,a]}function bc(t){return"center"===t||"middle"===t}function Sc(t,e,n){var i,r={},o="toggleSelected"===t;return n.eachComponent("legend",function(n){o&&null!=i?n[i?"select":"unSelect"](e.name):(n[t](e.name),i=n.isSelected(e.name)),d(n.getData(),function(t){var e=t.get("name");if("\n"!==e&&""!==e){var i=n.isSelected(e);r.hasOwnProperty(e)?r[e]=r[e]&&i:r[e]=i}})}),{name:e.name,selected:r}}function Mc(t,e,n){var i=e.getBoxLayoutParams(),r=e.get("padding"),o={width:n.getWidth(),height:n.getHeight()},a=Kr(i,o,r);Qy(e.get("orient"),t,e.get("itemGap"),a.width,a.height),Qr(t,i,o,r)}function Ic(t,e){var n=Wy(e.get("padding")),i=e.getItemStyle(["color","opacity"]);return i.fill=e.get("backgroundColor"),t=new py({shape:{x:t.x-n[3],y:t.y-n[0],width:t.width+n[1]+n[3],height:t.height+n[0]+n[2],r:e.get("borderRadius")},style:i,silent:!0,z2:-1})}function Tc(t,e){e.dispatchAction({type:"legendToggleSelect",name:t})}function Cc(t,e,n,i){var r=n.getZr().storage.getDisplayList()[0];r&&r.useHoverLayer||n.dispatchAction({type:"highlight",seriesName:t,name:e,excludeSeriesId:i})}function Ac(t,e,n,i){var r=n.getZr().storage.getDisplayList()[0];r&&r.useHoverLayer||n.dispatchAction({type:"downplay",seriesName:t,name:e,excludeSeriesId:i})}function Dc(t,e,n){var i=[1,1];i[t.getOrient().index]=0,Jr(e,n,{type:"box",ignoreSize:i})}function kc(t){In(t,"label",["show"])}function Pc(t){return!(isNaN(parseFloat(t.x))&&isNaN(parseFloat(t.y)))}function Lc(t){return!isNaN(parseFloat(t.x))&&!isNaN(parseFloat(t.y))}function Oc(t,e,n,i,r,o){var a=[],s=Ks(e,i)?e.getCalculationInfo("stackResultDimension"):i,l=Fc(e,s,t),u=e.indicesOfNearest(s,l)[0];a[r]=e.get(n,u),a[o]=e.get(i,u);var h=Lr(e.get(i,u));return(h=Math.min(h,20))>=0&&(a[o]=+a[o].toFixed(h)),a}function zc(t,e){var i=t.getData(),r=t.coordinateSystem;if(e&&!Lc(e)&&!y(e.coord)&&r){var o=r.dimensions,a=Ec(e,i,r,t);if((e=n(e)).type&&FS[e.type]&&a.baseAxis&&a.valueAxis){var s=RS(o,a.baseAxis.dim),l=RS(o,a.valueAxis.dim);e.coord=FS[e.type](i,a.baseDataDim,a.valueDataDim,s,l),e.value=e.coord[l]}else{for(var u=[null!=e.xAxis?e.xAxis:e.radiusAxis,null!=e.yAxis?e.yAxis:e.angleAxis],h=0;h<2;h++)FS[u[h]]&&(u[h]=Fc(i,i.mapDimension(o[h]),u[h]));e.coord=u}}return e}function Ec(t,e,n,i){var r={};return null!=t.valueIndex||null!=t.valueDim?(r.valueDataDim=null!=t.valueIndex?e.getDimension(t.valueIndex):t.valueDim,r.valueAxis=n.getAxis(Nc(i,r.valueDataDim)),r.baseAxis=n.getOtherAxis(r.valueAxis),r.baseDataDim=e.mapDimension(r.baseAxis.dim)):(r.baseAxis=i.getBaseAxis(),r.valueAxis=n.getOtherAxis(r.baseAxis),r.baseDataDim=e.mapDimension(r.baseAxis.dim),r.valueDataDim=e.mapDimension(r.valueAxis.dim)),r}function Nc(t,e){var n=t.getData(),i=n.dimensions;e=n.getDimension(e);for(var r=0;r<i.length;r++){var o=n.getDimensionInfo(i[r]);if(o.name===e)return o.coordDim}}function Rc(t,e){return!(t&&t.containData&&e.coord&&!Pc(e))||t.containData(e.coord)}function Bc(t,e,n,i){return i<2?t.coord&&t.coord[i]:t.value}function Fc(t,e,n){if("average"===n){var i=0,r=0;return t.each(e,function(t,e){isNaN(t)||(i+=t,r++)}),i/r}return"median"===n?t.getMedian(e):t.getDataExtent(e,!0)["max"===n?1:0]}function Vc(t,e,n){var i=e.coordinateSystem;t.each(function(r){var o,a=t.getItemModel(r),s=Dr(a.get("x"),n.getWidth()),l=Dr(a.get("y"),n.getHeight());if(isNaN(s)||isNaN(l)){if(e.getMarkerPosition)o=e.getMarkerPosition(t.getValues(t.dimensions,r));else if(i){var u=t.get(i.dimensions[0],r),h=t.get(i.dimensions[1],r);o=i.dataToPoint([u,h])}}else o=[s,l];isNaN(s)||(o[0]=s),isNaN(l)||(o[1]=l),t.setItemLayout(r,o)})}function Wc(t,e,n){var i;i=t?f(t&&t.dimensions,function(t){return a({name:t},e.getData().getDimensionInfo(e.getData().mapDimension(t))||{})}):[{name:"value",type:"float"}];var r=new uw(i,n),o=f(n.get("data"),v(zc,e));return t&&(o=g(o,v(Rc,t))),r.initData(o,null,t?Bc:function(t){return t.value}),r}function Hc(t){return isNaN(+t.cpx1)||isNaN(+t.cpy1)}function Gc(t){return"_"+t+"Type"}function Zc(t,e,n){var i=e.getItemVisual(n,"color"),r=e.getItemVisual(n,t),o=e.getItemVisual(n,t+"Size");if(r&&"none"!==r){y(o)||(o=[o,o]);var a=Pl(r,-o[0]/2,-o[1]/2,o[0],o[1],i);return a.name=t,a}}function Uc(t){var e=new GS({name:"line"});return Xc(e.shape,t),e}function Xc(t,e){var n=e[0],i=e[1],r=e[2];t.x1=n[0],t.y1=n[1],t.x2=i[0],t.y2=i[1],t.percent=1,r?(t.cpx1=r[0],t.cpy1=r[1]):(t.cpx1=NaN,t.cpy1=NaN)}function Yc(t,e,n){Jg.call(this),this._createLine(t,e,n)}function jc(t){this._ctor=t||Yc,this.group=new Jg}function qc(t,e,n,i){if(Jc(e.getItemLayout(n))){var r=new t._ctor(e,n,i);e.setItemGraphicEl(n,r),t.group.add(r)}}function $c(t,e,n,i,r,o){var a=e.getItemGraphicEl(i);Jc(n.getItemLayout(r))?(a?a.updateData(n,r,o):a=new t._ctor(n,r,o),n.setItemGraphicEl(r,a),t.group.add(a)):t.group.remove(a)}function Kc(t){var e=t.hostModel;return{lineStyle:e.getModel("lineStyle").getLineStyle(),hoverLineStyle:e.getModel("emphasis.lineStyle").getLineStyle(),labelModel:e.getModel("label"),hoverLabelModel:e.getModel("emphasis.label")}}function Qc(t){return isNaN(t[0])||isNaN(t[1])}function Jc(t){return!Qc(t[0])&&!Qc(t[1])}function td(t){return!isNaN(t)&&!isFinite(t)}function ed(t,e,n,i){var r=1-t,o=i.dimensions[t];return td(e[r])&&td(n[r])&&e[t]===n[t]&&i.getAxis(o).containData(e[t])}function nd(t,e){if("cartesian2d"===t.type){var n=e[0].coord,i=e[1].coord;if(n&&i&&(ed(1,n,i,t)||ed(0,n,i,t)))return!0}return Rc(t,e[0])&&Rc(t,e[1])}function id(t,e,n,i,r){var o,a=i.coordinateSystem,s=t.getItemModel(e),l=Dr(s.get("x"),r.getWidth()),u=Dr(s.get("y"),r.getHeight());if(isNaN(l)||isNaN(u)){if(i.getMarkerPosition)o=i.getMarkerPosition(t.getValues(t.dimensions,e));else{var h=a.dimensions,c=t.get(h[0],e),d=t.get(h[1],e);o=a.dataToPoint([c,d])}if("cartesian2d"===a.type){var f=a.getAxis("x"),p=a.getAxis("y"),h=a.dimensions;td(t.get(h[0],e))?o[0]=f.toGlobalCoord(f.getExtent()[n?0:1]):td(t.get(h[1],e))&&(o[1]=p.toGlobalCoord(p.getExtent()[n?0:1]))}isNaN(l)||(o[0]=l),isNaN(u)||(o[1]=u)}else o=[l,u];t.setItemLayout(e,o)}function rd(t,e,n){var i;i=t?f(t&&t.dimensions,function(t){return a({name:t},e.getData().getDimensionInfo(e.getData().mapDimension(t))||{})}):[{name:"value",type:"float"}];var r=new uw(i,n),o=new uw(i,n),s=new uw([],n),l=f(n.get("data"),v(YS,e,t,n));t&&(l=g(l,v(nd,t)));var u=t?Bc:function(t){return t.value};return r.initData(f(l,function(t){return t[0]}),null,u),o.initData(f(l,function(t){return t[1]}),null,u),s.initData(f(l,function(t){return t[2]})),s.hasItemOption=!0,{from:r,to:o,line:s}}function od(t){return!isNaN(t)&&!isFinite(t)}function ad(t,e,n,i){var r=1-t;return od(e[r])&&od(n[r])}function sd(t,e){var n=e.coord[0],i=e.coord[1];return!("cartesian2d"!==t.type||!n||!i||!ad(1,n,i,t)&&!ad(0,n,i,t))||(Rc(t,{coord:n,x:e.x0,y:e.y0})||Rc(t,{coord:i,x:e.x1,y:e.y1}))}function ld(t,e,n,i,r){var o,a=i.coordinateSystem,s=t.getItemModel(e),l=Dr(s.get(n[0]),r.getWidth()),u=Dr(s.get(n[1]),r.getHeight());if(isNaN(l)||isNaN(u)){if(i.getMarkerPosition)o=i.getMarkerPosition(t.getValues(n,e));else{var h=[f=t.get(n[0],e),p=t.get(n[1],e)];a.clampData&&a.clampData(h,h),o=a.dataToPoint(h,!0)}if("cartesian2d"===a.type){var c=a.getAxis("x"),d=a.getAxis("y"),f=t.get(n[0],e),p=t.get(n[1],e);od(f)?o[0]=c.toGlobalCoord(c.getExtent()["x0"===n[0]?0:1]):od(p)&&(o[1]=d.toGlobalCoord(d.getExtent()["y0"===n[1]?0:1]))}isNaN(l)||(o[0]=l),isNaN(u)||(o[1]=u)}else o=[l,u];return o}function ud(t,e,n){var i,r,o=["x0","y0","x1","y1"];t?(i=f(t&&t.dimensions,function(t){var n=e.getData();return a({name:t},n.getDimensionInfo(n.mapDimension(t))||{})}),r=new uw(f(o,function(t,e){return{name:t,type:i[e%2].type}}),n)):r=new uw(i=[{name:"value",type:"float"}],n);var s=f(n.get("data"),v(jS,e,t,n));t&&(s=g(s,v(sd,t)));var l=t?function(t,e,n,i){return t.coord[Math.floor(i/2)][i%2]}:function(t){return t.value};return r.initData(s,null,l),r.hasItemOption=!0,r}function hd(t){return l($S,t)>=0}function cd(t,e,n){function i(t,e){return l(e.nodes,t)>=0}function r(t,i){var r=!1;return e(function(e){d(n(t,e)||[],function(t){i.records[e.name][t]&&(r=!0)})}),r}function o(t,i){i.nodes.push(t),e(function(e){d(n(t,e)||[],function(t){i.records[e.name][t]=!0})})}return function(n){var a={nodes:[],records:{}};if(e(function(t){a.records[t.name]={}}),!n)return a;o(n,a);var s;do{s=!1,t(function(t){!i(t,a)&&r(t,a)&&(o(t,a),s=!0)})}while(s);return a}}function dd(t,e,n){var i=[1/0,-1/0];return QS(n,function(t){var n=t.getData();n&&QS(n.mapDimension(e,!0),function(t){var e=n.getApproximateExtent(t);e[0]<i[0]&&(i[0]=e[0]),e[1]>i[1]&&(i[1]=e[1])})}),i[1]<i[0]&&(i=[NaN,NaN]),fd(t,i),i}function fd(t,e){var n=t.getAxisModel(),i=n.getMin(!0),r="category"===n.get("type"),o=r&&n.getCategories().length;null!=i&&"dataMin"!==i&&"function"!=typeof i?e[0]=i:r&&(e[0]=o>0?0:NaN);var a=n.getMax(!0);return null!=a&&"dataMax"!==a&&"function"!=typeof a?e[1]=a:r&&(e[1]=o>0?o-1:NaN),n.get("scale",!0)||(e[0]>0&&(e[0]=0),e[1]<0&&(e[1]=0)),e}function pd(t,e){var n=t.getAxisModel(),i=t._percentWindow,r=t._valueWindow;if(i){var o=zr(r,[0,500]);o=Math.min(o,20);var a=e||0===i[0]&&100===i[1];n.setRange(a?null:+r[0].toFixed(o),a?null:+r[1].toFixed(o))}}function gd(t){var e=t._minMaxSpan={},n=t._dataZoomModel;QS(["min","max"],function(i){e[i+"Span"]=n.get(i+"Span");var r=n.get(i+"ValueSpan");if(null!=r&&(e[i+"ValueSpan"]=r,null!=(r=t.getAxisModel().axis.scale.parse(r)))){var o=t._dataExtent;e[i+"Span"]=Ar(o[0]+r,o,[0,100],!0)}})}function md(t){var e={};return eM(["start","end","startValue","endValue","throttle"],function(n){t.hasOwnProperty(n)&&(e[n]=t[n])}),e}function vd(t,e){var n=t._rangePropMode,i=t.get("rangeMode");eM([["start","startValue"],["end","endValue"]],function(t,r){var o=null!=e[t[0]],a=null!=e[t[1]];o&&!a?n[r]="percent":!o&&a?n[r]="value":i?n[r]=i[r]:o&&(n[r]="percent")})}function yd(t,e){var n=t[e]-t[1-e];return{span:Math.abs(n),sign:n>0?-1:n<0?1:e?-1:1}}function xd(t,e){return Math.min(e[1],Math.max(e[0],t))}function _d(t){return{x:"y",y:"x",radius:"angle",angle:"radius"}[t]}function wd(t){return"vertical"===t?"ns-resize":"ew-resize"}function bd(t,e,n){Id(t)[e]=n}function Sd(t,e,n){var i=Id(t);i[e]===n&&(i[e]=null)}function Md(t,e){return!!Id(t)[e]}function Id(t){return t[gM]||(t[gM]={})}function Td(t){this.pointerChecker,this._zr=t,this._opt={};var e=m,i=e(Cd,this),r=e(Ad,this),o=e(Dd,this),s=e(kd,this),l=e(Pd,this);pg.call(this),this.setPointerChecker=function(t){this.pointerChecker=t},this.enable=function(e,u){this.disable(),this._opt=a(n(u)||{},{zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!1,preventDefaultMouseMove:!0}),null==e&&(e=!0),!0!==e&&"move"!==e&&"pan"!==e||(t.on("mousedown",i),t.on("mousemove",r),t.on("mouseup",o)),!0!==e&&"scale"!==e&&"zoom"!==e||(t.on("mousewheel",s),t.on("pinch",l))},this.disable=function(){t.off("mousedown",i),t.off("mousemove",r),t.off("mouseup",o),t.off("mousewheel",s),t.off("pinch",l)},this.dispose=this.disable,this.isDragging=function(){return this._dragging},this.isPinching=function(){return this._pinching}}function Cd(t){if(!(lt(t)||t.target&&t.target.draggable)){var e=t.offsetX,n=t.offsetY;this.pointerChecker&&this.pointerChecker(t,e,n)&&(this._x=e,this._y=n,this._dragging=!0)}}function Ad(t){if(!lt(t)&&zd("moveOnMouseMove",t,this._opt)&&this._dragging&&"pinch"!==t.gestureEvent&&!Md(this._zr,"globalPan")){var e=t.offsetX,n=t.offsetY,i=this._x,r=this._y,o=e-i,a=n-r;this._x=e,this._y=n,this._opt.preventDefaultMouseMove&&vg(t.event),Od(this,"pan","moveOnMouseMove",t,{dx:o,dy:a,oldX:i,oldY:r,newX:e,newY:n})}}function Dd(t){lt(t)||(this._dragging=!1)}function kd(t){var e=zd("zoomOnMouseWheel",t,this._opt),n=zd("moveOnMouseWheel",t,this._opt),i=t.wheelDelta,r=Math.abs(i),o=t.offsetX,a=t.offsetY;if(0!==i&&(e||n)){if(e){var s=r>3?1.4:r>1?1.2:1.1;Ld(this,"zoom","zoomOnMouseWheel",t,{scale:i>0?s:1/s,originX:o,originY:a})}if(n){var l=Math.abs(i);Ld(this,"scrollMove","moveOnMouseWheel",t,{scrollDelta:(i>0?1:-1)*(l>3?.4:l>1?.15:.05),originX:o,originY:a})}}}function Pd(t){Md(this._zr,"globalPan")||Ld(this,"zoom",null,t,{scale:t.pinchScale>1?1.1:1/1.1,originX:t.pinchX,originY:t.pinchY})}function Ld(t,e,n,i,r){t.pointerChecker&&t.pointerChecker(i,r.originX,r.originY)&&(vg(i.event),Od(t,e,n,i,r))}function Od(t,e,n,i,r){r.isAvailableBehavior=m(zd,null,n,i),t.trigger(e,r)}function zd(t,e,n){var i=n[t];return!t||i&&(!_(i)||e.event[i+"Key"])}function Ed(t,e){var n=Bd(t),i=e.dataZoomId,r=e.coordId;d(n,function(t,n){var o=t.dataZoomInfos;o[i]&&l(e.allCoordIds,r)<0&&(delete o[i],t.count--)}),Vd(n);var o=n[r];o||((o=n[r]={coordId:r,dataZoomInfos:{},count:0}).controller=Fd(t,o),o.dispatchAction=v(Wd,t)),!o.dataZoomInfos[i]&&o.count++,o.dataZoomInfos[i]=e;var a=Hd(o.dataZoomInfos);o.controller.enable(a.controlType,a.opt),o.controller.setPointerChecker(e.containsPoint),xa(o,"dispatchAction",e.dataZoomModel.get("throttle",!0),"fixRate")}function Nd(t,e){var n=Bd(t);d(n,function(t){t.controller.dispose();var n=t.dataZoomInfos;n[e]&&(delete n[e],t.count--)}),Vd(n)}function Rd(t){return t.type+"\0_"+t.id}function Bd(t){var e=t.getZr();return e[mM]||(e[mM]={})}function Fd(t,e){var n=new Td(t.getZr());return d(["pan","zoom","scrollMove"],function(t){n.on(t,function(n){var i=[];d(e.dataZoomInfos,function(r){if(n.isAvailableBehavior(r.dataZoomModel.option)){var o=(r.getRange||{})[t],a=o&&o(e.controller,n);!r.dataZoomModel.get("disabled",!0)&&a&&i.push({dataZoomId:r.dataZoomId,start:a[0],end:a[1]})}}),i.length&&e.dispatchAction(i)})}),n}function Vd(t){d(t,function(e,n){e.count||(e.controller.dispose(),delete t[n])})}function Wd(t,e){t.dispatchAction({type:"dataZoom",batch:e})}function Hd(t){var e,n={type_true:2,type_move:1,type_false:0,type_undefined:-1},i=!0;return d(t,function(t){var r=t.dataZoomModel,o=!r.get("disabled",!0)&&(!r.get("zoomLock",!0)||"move");n["type_"+o]>n["type_"+e]&&(e=o),i&=r.get("preventDefaultMouseMove",!0)}),{controlType:e,opt:{zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!0,preventDefaultMouseMove:!!i}}}function Gd(t){return function(e,n,i,r){var o=this._range,a=o.slice(),s=e.axisModels[0];if(s){var l=t(a,s,e,n,i,r);return oM(l,a,[0,100],"all"),this._range=a,o[0]!==a[0]||o[1]!==a[1]?a:void 0}}}function Zd(t,e){wM[t]=e}function Ud(t){return wM[t]}function Xd(t){return 0===t.indexOf("my")}function Yd(t){this.model=t}function jd(t){this.model=t}function qd(t){var e={},n=[],i=[];return t.eachRawSeries(function(t){var r=t.coordinateSystem;if(!r||"cartesian2d"!==r.type&&"polar"!==r.type)n.push(t);else{var o=r.getBaseAxis();if("category"===o.type){var a=o.dim+"_"+o.index;e[a]||(e[a]={categoryAxis:o,valueAxis:r.getOtherAxis(o),series:[]},i.push({axisDim:o.dim,axisIndex:o.index})),e[a].series.push(t)}else n.push(t)}}),{seriesGroupByCategoryAxis:e,other:n,meta:i}}function $d(t){var e=[];return d(t,function(t,n){var i=t.categoryAxis,r=t.valueAxis.dim,o=[" "].concat(f(t.series,function(t){return t.name})),a=[i.model.getCategories()];d(t.series,function(t){a.push(t.getRawData().mapArray(r,function(t){return t}))});for(var s=[o.join(kM)],l=0;l<a[0].length;l++){for(var u=[],h=0;h<a.length;h++)u.push(a[h][l]);s.push(u.join(kM))}e.push(s.join("\n"))}),e.join("\n\n"+DM+"\n\n")}function Kd(t){return f(t,function(t){var e=t.getRawData(),n=[t.name],i=[];return e.each(e.dimensions,function(){for(var t=arguments.length,r=arguments[t-1],o=e.getName(r),a=0;a<t-1;a++)i[a]=arguments[a];n.push((o?o+kM:"")+i.join(kM))}),n.join("\n")}).join("\n\n"+DM+"\n\n")}function Qd(t){var e=qd(t);return{value:g([$d(e.seriesGroupByCategoryAxis),Kd(e.other)],function(t){return t.replace(/[\n\t\s]/g,"")}).join("\n\n"+DM+"\n\n"),meta:e.meta}}function Jd(t){return t.replace(/^\s\s*/,"").replace(/\s\s*$/,"")}function tf(t){if(t.slice(0,t.indexOf("\n")).indexOf(kM)>=0)return!0}function ef(t){for(var e=t.split(/\n+/g),n=[],i=f(Jd(e.shift()).split(PM),function(t){return{name:t,data:[]}}),r=0;r<e.length;r++){var o=Jd(e[r]).split(PM);n.push(o.shift());for(var a=0;a<o.length;a++)i[a]&&(i[a].data[r]=o[a])}return{series:i,categories:n}}function nf(t){for(var e=t.split(/\n+/g),n=Jd(e.shift()),i=[],r=0;r<e.length;r++){var o,a=Jd(e[r]).split(PM),s="",l=!1;isNaN(a[0])?(l=!0,s=a[0],a=a.slice(1),i[r]={name:s,value:[]},o=i[r].value):o=i[r]=[];for(var u=0;u<a.length;u++)o.push(+a[u]);1===o.length&&(l?i[r].value=o[0]:i[r]=o[0])}return{name:n,data:i}}function rf(t,e){var n={series:[]};return d(t.split(new RegExp("\n*"+DM+"\n*","g")),function(t,i){if(tf(t)){var r=ef(t),o=e[i],a=o.axisDim+"Axis";o&&(n[a]=n[a]||[],n[a][o.axisIndex]={data:r.categories},n.series=n.series.concat(r.series))}else{r=nf(t);n.series.push(r)}}),n}function of(t){this._dom=null,this.model=t}function af(t,e){return f(t,function(t,n){var i=e&&e[n];return w(i)&&!y(i)?(w(t)&&!y(t)&&(t=t.value),a({value:t},i)):t})}function sf(t){pg.call(this),this._zr=t,this.group=new Jg,this._brushType,this._brushOption,this._panels,this._track=[],this._dragging,this._covers=[],this._creatingCover,this._creatingPanel,this._enableGlobalPan,this._uid="brushController_"+UM++,this._handlers={},OM(XM,function(t,e){this._handlers[e]=m(t,this)},this)}function lf(t,e){var r=t._zr;t._enableGlobalPan||bd(r,WM,t._uid),OM(t._handlers,function(t,e){r.on(e,t)}),t._brushType=e.brushType,t._brushOption=i(n(ZM),e,!0)}function uf(t){var e=t._zr;Sd(e,WM,t._uid),OM(t._handlers,function(t,n){e.off(n,t)}),t._brushType=t._brushOption=null}function hf(t,e){var n=YM[e.brushType].createCover(t,e);return n.__brushOption=e,ff(n,e),t.group.add(n),n}function cf(t,e){var n=gf(e);return n.endCreating&&(n.endCreating(t,e),ff(e,e.__brushOption)),e}function df(t,e){var n=e.__brushOption;gf(e).updateCoverShape(t,e,n.range,n)}function ff(t,e){var n=e.z;null==n&&(n=BM),t.traverse(function(t){t.z=n,t.z2=n})}function pf(t,e){gf(e).updateCommon(t,e),df(t,e)}function gf(t){return YM[t.__brushOption.brushType]}function mf(t,e,n){var i=t._panels;if(!i)return!0;var r,o=t._transform;return OM(i,function(t){t.isTargetByCursor(e,n,o)&&(r=t)}),r}function vf(t,e){var n=t._panels;if(!n)return!0;var i=e.__brushOption.panelId;return null==i||n[i]}function yf(t){var e=t._covers,n=e.length;return OM(e,function(e){t.group.remove(e)},t),e.length=0,!!n}function xf(t,e){var i=zM(t._covers,function(t){var e=t.__brushOption,i=n(e.range);return{brushType:e.brushType,panelId:e.panelId,range:i}});t.trigger("brush",i,{isEnd:!!e.isEnd,removeOnClick:!!e.removeOnClick})}function _f(t){var e=t._track;if(!e.length)return!1;var n=e[e.length-1],i=e[0],r=n[0]-i[0],o=n[1]-i[1];return RM(r*r+o*o,.5)>FM}function wf(t){var e=t.length-1;return e<0&&(e=0),[t[0],t[e]]}function bf(t,e,n,i){var r=new Jg;return r.add(new py({name:"main",style:Tf(n),silent:!0,draggable:!0,cursor:"move",drift:LM(t,e,r,"nswe"),ondragend:LM(xf,e,{isEnd:!0})})),OM(i,function(n){r.add(new py({name:n,style:{opacity:0},draggable:!0,silent:!0,invisible:!0,drift:LM(t,e,r,n),ondragend:LM(xf,e,{isEnd:!0})}))}),r}function Sf(t,e,n,i){var r=i.brushStyle.lineWidth||0,o=NM(r,VM),a=n[0][0],s=n[1][0],l=a-r/2,u=s-r/2,h=n[0][1],c=n[1][1],d=h-o+r/2,f=c-o+r/2,p=h-a,g=c-s,m=p+r,v=g+r;If(t,e,"main",a,s,p,g),i.transformable&&(If(t,e,"w",l,u,o,v),If(t,e,"e",d,u,o,v),If(t,e,"n",l,u,m,o),If(t,e,"s",l,f,m,o),If(t,e,"nw",l,u,o,o),If(t,e,"ne",d,u,o,o),If(t,e,"sw",l,f,o,o),If(t,e,"se",d,f,o,o))}function Mf(t,e){var n=e.__brushOption,i=n.transformable,r=e.childAt(0);r.useStyle(Tf(n)),r.attr({silent:!i,cursor:i?"move":"default"}),OM(["w","e","n","s","se","sw","ne","nw"],function(n){var r=e.childOfName(n),o=Df(t,n);r&&r.attr({silent:!i,invisible:!i,cursor:i?GM[o]+"-resize":null})})}function If(t,e,n,i,r,o,a){var s=e.childOfName(n);s&&s.setShape(zf(Of(t,e,[[i,r],[i+o,r+a]])))}function Tf(t){return a({strokeNoScale:!0},t.brushStyle)}function Cf(t,e,n,i){var r=[EM(t,n),EM(e,i)],o=[NM(t,n),NM(e,i)];return[[r[0],o[0]],[r[1],o[1]]]}function Af(t){return vr(t.group)}function Df(t,e){if(e.length>1)return("e"===(i=[Df(t,(e=e.split(""))[0]),Df(t,e[1])])[0]||"w"===i[0])&&i.reverse(),i.join("");var n={left:"w",right:"e",top:"n",bottom:"s"},i=xr({w:"left",e:"right",n:"top",s:"bottom"}[e],Af(t));return n[i]}function kf(t,e,n,i,r,o,a,s){var l=i.__brushOption,u=t(l.range),h=Lf(n,o,a);OM(r.split(""),function(t){var e=HM[t];u[e[0]][e[1]]+=h[e[0]]}),l.range=e(Cf(u[0][0],u[1][0],u[0][1],u[1][1])),pf(n,i),xf(n,{isEnd:!1})}function Pf(t,e,n,i,r){var o=e.__brushOption.range,a=Lf(t,n,i);OM(o,function(t){t[0]+=a[0],t[1]+=a[1]}),pf(t,e),xf(t,{isEnd:!1})}function Lf(t,e,n){var i=t.group,r=i.transformCoordToLocal(e,n),o=i.transformCoordToLocal(0,0);return[r[0]-o[0],r[1]-o[1]]}function Of(t,e,i){var r=vf(t,e);return r&&!0!==r?r.clipPath(i,t._transform):n(i)}function zf(t){var e=EM(t[0][0],t[1][0]),n=EM(t[0][1],t[1][1]);return{x:e,y:n,width:NM(t[0][0],t[1][0])-e,height:NM(t[0][1],t[1][1])-n}}function Ef(t,e,n){if(t._brushType){var i=t._zr,r=t._covers,o=mf(t,e,n);if(!t._dragging)for(var a=0;a<r.length;a++){var s=r[a].__brushOption;if(o&&(!0===o||s.panelId===o.panelId)&&YM[s.brushType].contain(r[a],n[0],n[1]))return}o&&i.setCursorStyle("crosshair")}}function Nf(t){var e=t.event;e.preventDefault&&e.preventDefault()}function Rf(t,e,n){return t.childOfName("main").contain(e,n)}function Bf(t,e,i,r){var o,a=t._creatingCover,s=t._creatingPanel,l=t._brushOption;if(t._track.push(i.slice()),_f(t)||a){if(s&&!a){"single"===l.brushMode&&yf(t);var u=n(l);u.brushType=Ff(u.brushType,s),u.panelId=!0===s?null:s.panelId,a=t._creatingCover=hf(t,u),t._covers.push(a)}if(a){var h=YM[Ff(t._brushType,s)];a.__brushOption.range=h.getCreatingRange(Of(t,a,t._track)),r&&(cf(t,a),h.updateCommon(t,a)),df(t,a),o={isEnd:r}}}else r&&"single"===l.brushMode&&l.removeOnClick&&mf(t,e,i)&&yf(t)&&(o={isEnd:r,removeOnClick:!0});return o}function Ff(t,e){return"auto"===t?e.defaultBrushType:t}function Vf(t){if(this._dragging){Nf(t);var e=Bf(this,t,this.group.transformCoordToLocal(t.offsetX,t.offsetY),!0);this._dragging=!1,this._track=[],this._creatingCover=null,e&&xf(this,e)}}function Wf(t){return{createCover:function(e,n){return bf(LM(kf,function(e){var n=[e,[0,100]];return t&&n.reverse(),n},function(e){return e[t]}),e,n,[["w","e"],["n","s"]][t])},getCreatingRange:function(e){var n=wf(e);return[EM(n[0][t],n[1][t]),NM(n[0][t],n[1][t])]},updateCoverShape:function(e,n,i,r){var o,a=vf(e,n);if(!0!==a&&a.getLinearBrushOtherExtent)o=a.getLinearBrushOtherExtent(t,e._transform);else{var s=e._zr;o=[0,[s.getWidth(),s.getHeight()][1-t]]}var l=[i,o];t&&l.reverse(),Sf(e,n,l,r)},updateCommon:Mf,contain:Rf}}function Hf(t,e,n){var i=e.getComponentByElement(t.topTarget),r=i&&i.coordinateSystem;return i&&i!==n&&!jM[i.mainType]&&r&&r.model!==n}function Gf(t){return t=Xf(t),function(e,n){return wr(e,t)}}function Zf(t,e){return t=Xf(t),function(n){var i=null!=e?e:n,r=i?t.width:t.height,o=i?t.x:t.y;return[o,o+(r||0)]}}function Uf(t,e,n){return t=Xf(t),function(i,r,o){return t.contain(r[0],r[1])&&!Hf(i,e,n)}}function Xf(t){return re.create(t)}function Yf(t,e,n){var i=this._targetInfoList=[],r={},o=qf(e,t);qM(eI,function(t,e){(!n||!n.include||$M(n.include,e)>=0)&&t(o,i,r)})}function jf(t){return t[0]>t[1]&&t.reverse(),t}function qf(t,e){return zn(t,e,{includeMainTypes:JM})}function $f(t,e,n,i){var r=n.getAxis(["x","y"][t]),o=jf(f([0,1],function(t){return e?r.coordToData(r.toLocalCoord(i[t])):r.toGlobalCoord(r.dataToCoord(i[t]))})),a=[];return a[t]=o,a[1-t]=[NaN,NaN],{values:o,xyMinMax:a}}function Kf(t,e,n,i){return[e[0]-i[t]*n[0],e[1]-i[t]*n[1]]}function Qf(t,e){var n=Jf(t),i=Jf(e),r=[n[0]/i[0],n[1]/i[1]];return isNaN(r[0])&&(r[0]=1),isNaN(r[1])&&(r[1]=1),r}function Jf(t){return t?[t[0][1]-t[0][0],t[1][1]-t[1][0]]:[NaN,NaN]}function tp(t,e){var n=rp(t);aI(e,function(e,i){for(var r=n.length-1;r>=0&&!n[r][i];r--);if(r<0){var o=t.queryComponents({mainType:"dataZoom",subType:"select",id:i})[0];if(o){var a=o.getPercentRange();n[0][i]={dataZoomId:i,start:a[0],end:a[1]}}}}),n.push(e)}function ep(t){var e=rp(t),n=e[e.length-1];e.length>1&&e.pop();var i={};return aI(n,function(t,n){for(var r=e.length-1;r>=0;r--)if(t=e[r][n]){i[n]=t;break}}),i}function np(t){t[sI]=null}function ip(t){return rp(t).length}function rp(t){var e=t[sI];return e||(e=t[sI]=[{}]),e}function op(t,e,n){(this._brushController=new sf(n.getZr())).on("brush",m(this._onBrush,this)).mount(),this._isZoomActive}function ap(t){var e={};return d(["xAxisIndex","yAxisIndex"],function(n){e[n]=t[n],null==e[n]&&(e[n]="all"),(!1===e[n]||"none"===e[n])&&(e[n]=[])}),e}function sp(t,e){t.setIconStatus("back",ip(e)>1?"emphasis":"normal")}function lp(t,e,n,i,r){var o=n._isZoomActive;i&&"takeGlobalCursor"===i.type&&(o="dataZoomSelect"===i.key&&i.dataZoomSelectActive),n._isZoomActive=o,t.setIconStatus("zoom",o?"emphasis":"normal");var a=new Yf(ap(t.option),e,{include:["grid"]});n._brushController.setPanels(a.makePanelOpts(r,function(t){return t.xAxisDeclared&&!t.yAxisDeclared?"lineX":!t.xAxisDeclared&&t.yAxisDeclared?"lineY":"rect"})).enableBrush(!!o&&{brushType:"auto",brushStyle:{lineWidth:0,fill:"rgba(0,0,0,0.2)"}})}function up(t){this.model=t}function hp(t){return pI(t)}function cp(){if(!vI&&yI){vI=!0;var t=yI.styleSheets;t.length<31?yI.createStyleSheet().addRule(".zrvml","behavior:url(#default#VML)"):t[0].addRule(".zrvml","behavior:url(#default#VML)")}}function dp(t){return parseInt(t,10)}function fp(t,e){cp(),this.root=t,this.storage=e;var n=document.createElement("div"),i=document.createElement("div");n.style.cssText="display:inline-block;overflow:hidden;position:relative;width:300px;height:150px;",i.style.cssText="position:absolute;left:0;top:0;",t.appendChild(n),this._vmlRoot=i,this._vmlViewport=n,this.resize();var r=e.delFromStorage,o=e.addToStorage;e.delFromStorage=function(t){r.call(e,t),t&&t.onRemove&&t.onRemove(i)},e.addToStorage=function(t){t.onAdd&&t.onAdd(i),o.call(e,t)},this._firstPaint=!0}function pp(t){return function(){Yg('In IE8.0 VML mode painter not support method "'+t+'"')}}function gp(t){return document.createElementNS(QI,t)}function mp(t){return nT(1e4*t)/1e4}function vp(t){return t<lT&&t>-lT}function yp(t,e){var n=e?t.textFill:t.fill;return null!=n&&n!==eT}function xp(t,e){var n=e?t.textStroke:t.stroke;return null!=n&&n!==eT}function _p(t,e){e&&wp(t,"transform","matrix("+tT.call(e,",")+")")}function wp(t,e,n){(!n||"linear"!==n.type&&"radial"!==n.type)&&("string"==typeof n&&n.indexOf("NaN")>-1&&console.log(n),t.setAttribute(e,n))}function bp(t,e,n){t.setAttributeNS("http://www.w3.org/1999/xlink",e,n)}function Sp(t,e,n,i){if(yp(e,n)){var r=n?e.textFill:e.fill;r="transparent"===r?eT:r,"none"!==t.getAttribute("clip-path")&&r===eT&&(r="rgba(0, 0, 0, 0.002)"),wp(t,"fill",r),wp(t,"fill-opacity",null!=e.fillOpacity?e.fillOpacity*e.opacity:e.opacity)}else wp(t,"fill",eT);if(xp(e,n)){var o=n?e.textStroke:e.stroke;wp(t,"stroke",o="transparent"===o?eT:o),wp(t,"stroke-width",(n?e.textStrokeWidth:e.lineWidth)/(!n&&e.strokeNoScale?i.getLineScale():1)),wp(t,"paint-order",n?"stroke":"fill"),wp(t,"stroke-opacity",null!=e.strokeOpacity?e.strokeOpacity:e.opacity),e.lineDash?(wp(t,"stroke-dasharray",e.lineDash.join(",")),wp(t,"stroke-dashoffset",nT(e.lineDashOffset||0))):wp(t,"stroke-dasharray",""),e.lineCap&&wp(t,"stroke-linecap",e.lineCap),e.lineJoin&&wp(t,"stroke-linejoin",e.lineJoin),e.miterLimit&&wp(t,"stroke-miterlimit",e.miterLimit)}else wp(t,"stroke",eT)}function Mp(t){for(var e=[],n=t.data,i=t.len(),r=0;r<i;){var o="",a=0;switch(n[r++]){case JI.M:o="M",a=2;break;case JI.L:o="L",a=2;break;case JI.Q:o="Q",a=4;break;case JI.C:o="C",a=6;break;case JI.A:var s=n[r++],l=n[r++],u=n[r++],h=n[r++],c=n[r++],d=n[r++],f=n[r++],p=n[r++],g=Math.abs(d),m=vp(g-aT)&&!vp(g),v=!1;v=g>=aT||!vp(g)&&(d>-oT&&d<0||d>oT)==!!p;var y=mp(s+u*rT(c)),x=mp(l+h*iT(c));m&&(d=p?aT-1e-4:1e-4-aT,v=!0,9===r&&e.push("M",y,x));var _=mp(s+u*rT(c+d)),w=mp(l+h*iT(c+d));e.push("A",mp(u),mp(h),nT(f*sT),+v,+p,_,w);break;case JI.Z:o="Z";break;case JI.R:var _=mp(n[r++]),w=mp(n[r++]),b=mp(n[r++]),S=mp(n[r++]);e.push("M",_,w,"L",_+b,w,"L",_+b,w+S,"L",_,w+S,"L",_,w)}o&&e.push(o);for(var M=0;M<a;M++)e.push(mp(n[r++]))}return e.join(" ")}function Ip(t){return"middle"===t?"middle":"bottom"===t?"after-edge":"hanging"}function Tp(){}function Cp(t,e,n,i){for(var r=0,o=e.length,a=0,s=0;r<o;r++){var l=e[r];if(l.removed){for(var u=[],h=s;h<s+l.count;h++)u.push(h);l.indices=u,s+=l.count}else{for(var u=[],h=a;h<a+l.count;h++)u.push(h);l.indices=u,a+=l.count,l.added||(s+=l.count)}}return e}function Ap(t){return{newPos:t.newPos,components:t.components.slice(0)}}function Dp(t,e,n,i,r){this._zrId=t,this._svgRoot=e,this._tagNames="string"==typeof n?[n]:n,this._markLabel=i,this._domName=r||"_dom",this.nextId=0}function kp(t,e){Dp.call(this,t,e,["linearGradient","radialGradient"],"__gradient_in_use__")}function Pp(t,e){Dp.call(this,t,e,"clipPath","__clippath_in_use__")}function Lp(t,e){Dp.call(this,t,e,["filter"],"__filter_in_use__","_shadowDom")}function Op(t){return t&&(t.shadowBlur||t.shadowOffsetX||t.shadowOffsetY||t.textShadowBlur||t.textShadowOffsetX||t.textShadowOffsetY)}function zp(t){return parseInt(t,10)}function Ep(t){return t instanceof Ii?uT:t instanceof an?hT:t instanceof ry?cT:uT}function Np(t,e){return e&&t&&e.parentNode!==t}function Rp(t,e,n){if(Np(t,e)&&n){var i=n.nextSibling;i?t.insertBefore(e,i):t.appendChild(e)}}function Bp(t,e){if(Np(t,e)){var n=t.firstChild;n?t.insertBefore(e,n):t.appendChild(e)}}function Fp(t,e){e&&t&&e.parentNode===t&&t.removeChild(e)}function Vp(t){return t.__textSvgEl}function Wp(t){return t.__svgEl}function Hp(t){return function(){Yg('In SVG mode painter not support method "'+t+'"')}}var Gp=2311,Zp=function(){return Gp++},Up={},Xp=Up="object"==typeof wx&&"function"==typeof wx.getSystemInfoSync?{browser:{},os:{},node:!1,wxa:!0,canvasSupported:!0,svgSupported:!1,touchEventsSupported:!0,domSupported:!1}:"undefined"==typeof document&&"undefined"!=typeof self?{browser:{},os:{},node:!1,worker:!0,canvasSupported:!0,domSupported:!1}:"undefined"==typeof navigator?{browser:{},os:{},node:!0,worker:!1,canvasSupported:!0,svgSupported:!0,domSupported:!1}:function(t){var e={},n={},i=t.match(/Firefox\/([\d.]+)/),r=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),o=t.match(/Edge\/([\d.]+)/),a=/micromessenger/i.test(t);return i&&(n.firefox=!0,n.version=i[1]),r&&(n.ie=!0,n.version=r[1]),o&&(n.edge=!0,n.version=o[1]),a&&(n.weChat=!0),{browser:n,os:e,node:!1,canvasSupported:!!document.createElement("canvas").getContext,svgSupported:"undefined"!=typeof SVGRect,touchEventsSupported:"ontouchstart"in window&&!n.ie&&!n.edge,pointerEventsSupported:"onpointerdown"in window&&(n.edge||n.ie&&n.version>=11),domSupported:"undefined"!=typeof document}}(navigator.userAgent),Yp={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1,"[object CanvasPattern]":1,"[object Image]":1,"[object Canvas]":1},jp={"[object Int8Array]":1,"[object Uint8Array]":1,"[object Uint8ClampedArray]":1,"[object Int16Array]":1,"[object Uint16Array]":1,"[object Int32Array]":1,"[object Uint32Array]":1,"[object Float32Array]":1,"[object Float64Array]":1},qp=Object.prototype.toString,$p=Array.prototype,Kp=$p.forEach,Qp=$p.filter,Jp=$p.slice,tg=$p.map,eg=$p.reduce,ng={},ig=function(){return ng.createCanvas()};ng.createCanvas=function(){return document.createElement("canvas")};var rg,og="__ec_primitive__";E.prototype={constructor:E,get:function(t){return this.data.hasOwnProperty(t)?this.data[t]:null},set:function(t,e){return this.data[t]=e},each:function(t,e){void 0!==e&&(t=m(t,e));for(var n in this.data)this.data.hasOwnProperty(n)&&t(this.data[n],n)},removeKey:function(t){delete this.data[t]}};var ag=(Object.freeze||Object)({$override:e,clone:n,merge:i,mergeAll:r,extend:o,defaults:a,createCanvas:ig,getContext:s,indexOf:l,inherits:u,mixin:h,isArrayLike:c,each:d,map:f,reduce:p,filter:g,find:function(t,e,n){if(t&&e)for(var i=0,r=t.length;i<r;i++)if(e.call(n,t[i],i,t))return t[i]},bind:m,curry:v,isArray:y,isFunction:x,isString:_,isObject:w,isBuiltInObject:b,isTypedArray:S,isDom:M,eqNaN:I,retrieve:T,retrieve2:C,retrieve3:A,slice:D,normalizeCssArray:k,assert:P,trim:L,setAsPrimitive:O,isPrimitive:z,createHashMap:N,concatArray:function(t,e){for(var n=new t.constructor(t.length+e.length),i=0;i<t.length;i++)n[i]=t[i];var r=t.length;for(i=0;i<e.length;i++)n[i+r]=e[i];return n},noop:R}),sg="undefined"==typeof Float32Array?Array:Float32Array,lg=Z,ug=U,hg=j,cg=q,dg=(Object.freeze||Object)({create:B,copy:F,clone:V,set:function(t,e,n){return t[0]=e,t[1]=n,t},add:W,scaleAndAdd:H,sub:G,len:Z,length:lg,lenSquare:U,lengthSquare:ug,mul:function(t,e,n){return t[0]=e[0]*n[0],t[1]=e[1]*n[1],t},div:function(t,e,n){return t[0]=e[0]/n[0],t[1]=e[1]/n[1],t},dot:function(t,e){return t[0]*e[0]+t[1]*e[1]},scale:X,normalize:Y,distance:j,dist:hg,distanceSquare:q,distSquare:cg,negate:function(t,e){return t[0]=-e[0],t[1]=-e[1],t},lerp:function(t,e,n,i){return t[0]=e[0]+i*(n[0]-e[0]),t[1]=e[1]+i*(n[1]-e[1]),t},applyTransform:$,min:K,max:Q});J.prototype={constructor:J,_dragStart:function(t){var e=t.target;e&&e.draggable&&(this._draggingTarget=e,e.dragging=!0,this._x=t.offsetX,this._y=t.offsetY,this.dispatchToElement(tt(e,t),"dragstart",t.event))},_drag:function(t){var e=this._draggingTarget;if(e){var n=t.offsetX,i=t.offsetY,r=n-this._x,o=i-this._y;this._x=n,this._y=i,e.drift(r,o,t),this.dispatchToElement(tt(e,t),"drag",t.event);var a=this.findHover(n,i,e).target,s=this._dropTarget;this._dropTarget=a,e!==a&&(s&&a!==s&&this.dispatchToElement(tt(s,t),"dragleave",t.event),a&&a!==s&&this.dispatchToElement(tt(a,t),"dragenter",t.event))}},_dragEnd:function(t){var e=this._draggingTarget;e&&(e.dragging=!1),this.dispatchToElement(tt(e,t),"dragend",t.event),this._dropTarget&&this.dispatchToElement(tt(this._dropTarget,t),"drop",t.event),this._draggingTarget=null,this._dropTarget=null}};var fg=Array.prototype.slice,pg=function(t){this._$handlers={},this._$eventProcessor=t};pg.prototype={constructor:pg,one:function(t,e,n,i){var r=this._$handlers;if("function"==typeof e&&(i=n,n=e,e=null),!n||!t)return this;e=et(this,e),r[t]||(r[t]=[]);for(var o=0;o<r[t].length;o++)if(r[t][o].h===n)return this;return r[t].push({h:n,one:!0,query:e,ctx:i||this}),this},on:function(t,e,n,i){var r=this._$handlers;if("function"==typeof e&&(i=n,n=e,e=null),!n||!t)return this;e=et(this,e),r[t]||(r[t]=[]);for(var o=0;o<r[t].length;o++)if(r[t][o].h===n)return this;return r[t].push({h:n,one:!1,query:e,ctx:i||this}),this},isSilent:function(t){var e=this._$handlers;return e[t]&&e[t].length},off:function(t,e){var n=this._$handlers;if(!t)return this._$handlers={},this;if(e){if(n[t]){for(var i=[],r=0,o=n[t].length;r<o;r++)n[t][r].h!==e&&i.push(n[t][r]);n[t]=i}n[t]&&0===n[t].length&&delete n[t]}else delete n[t];return this},trigger:function(t){var e=this._$handlers[t],n=this._$eventProcessor;if(e){var i=arguments,r=i.length;r>3&&(i=fg.call(i,1));for(var o=e.length,a=0;a<o;){var s=e[a];if(n&&n.filter&&null!=s.query&&!n.filter(t,s.query))a++;else{switch(r){case 1:s.h.call(s.ctx);break;case 2:s.h.call(s.ctx,i[1]);break;case 3:s.h.call(s.ctx,i[1],i[2]);break;default:s.h.apply(s.ctx,i)}s.one?(e.splice(a,1),o--):a++}}}return n&&n.afterTrigger&&n.afterTrigger(t),this},triggerWithContext:function(t){var e=this._$handlers[t],n=this._$eventProcessor;if(e){var i=arguments,r=i.length;r>4&&(i=fg.call(i,1,i.length-1));for(var o=i[i.length-1],a=e.length,s=0;s<a;){var l=e[s];if(n&&n.filter&&null!=l.query&&!n.filter(t,l.query))s++;else{switch(r){case 1:l.h.call(o);break;case 2:l.h.call(o,i[1]);break;case 3:l.h.call(o,i[1],i[2]);break;default:l.h.apply(o,i)}l.one?(e.splice(s,1),a--):s++}}}return n&&n.afterTrigger&&n.afterTrigger(t),this}};var gg="undefined"!=typeof window&&!!window.addEventListener,mg=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,vg=gg?function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0}:function(t){t.returnValue=!1,t.cancelBubble=!0},yg="silent";ct.prototype.dispose=function(){};var xg=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],_g=function(t,e,n,i){pg.call(this),this.storage=t,this.painter=e,this.painterRoot=i,n=n||new ct,this.proxy=null,this._hovered={},this._lastTouchMoment,this._lastX,this._lastY,J.call(this),this.setHandlerProxy(n)};_g.prototype={constructor:_g,setHandlerProxy:function(t){this.proxy&&this.proxy.dispose(),t&&(d(xg,function(e){t.on&&t.on(e,this[e],this)},this),t.handler=this),this.proxy=t},mousemove:function(t){var e=t.zrX,n=t.zrY,i=this._hovered,r=i.target;r&&!r.__zr&&(r=(i=this.findHover(i.x,i.y)).target);var o=this._hovered=this.findHover(e,n),a=o.target,s=this.proxy;s.setCursor&&s.setCursor(a?a.cursor:"default"),r&&a!==r&&this.dispatchToElement(i,"mouseout",t),this.dispatchToElement(o,"mousemove",t),a&&a!==r&&this.dispatchToElement(o,"mouseover",t)},mouseout:function(t){this.dispatchToElement(this._hovered,"mouseout",t);var e,n=t.toElement||t.relatedTarget;do{n=n&&n.parentNode}while(n&&9!=n.nodeType&&!(e=n===this.painterRoot));!e&&this.trigger("globalout",{event:t})},resize:function(t){this._hovered={}},dispatch:function(t,e){var n=this[t];n&&n.call(this,e)},dispose:function(){this.proxy.dispose(),this.storage=this.proxy=this.painter=null},setCursorStyle:function(t){var e=this.proxy;e.setCursor&&e.setCursor(t)},dispatchToElement:function(t,e,n){var i=(t=t||{}).target;if(!i||!i.silent){for(var r="on"+e,o=ut(e,t,n);i&&(i[r]&&(o.cancelBubble=i[r].call(i,o)),i.trigger(e,o),i=i.parent,!o.cancelBubble););o.cancelBubble||(this.trigger(e,o),this.painter&&this.painter.eachOtherLayer(function(t){"function"==typeof t[r]&&t[r].call(t,o),t.trigger&&t.trigger(e,o)}))}},findHover:function(t,e,n){for(var i=this.storage.getDisplayList(),r={x:t,y:e},o=i.length-1;o>=0;o--){var a;if(i[o]!==n&&!i[o].ignore&&(a=dt(i[o],t,e))&&(!r.topTarget&&(r.topTarget=i[o]),a!==yg)){r.target=i[o];break}}return r}},d(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(t){_g.prototype[t]=function(e){var n=this.findHover(e.zrX,e.zrY),i=n.target;if("mousedown"===t)this._downEl=i,this._downPoint=[e.zrX,e.zrY],this._upEl=i;else if("mouseup"===t)this._upEl=i;else if("click"===t){if(this._downEl!==this._upEl||!this._downPoint||hg(this._downPoint,[e.zrX,e.zrY])>4)return;this._downPoint=null}this.dispatchToElement(n,t,e)}}),h(_g,pg),h(_g,J);var wg="undefined"==typeof Float32Array?Array:Float32Array,bg=(Object.freeze||Object)({create:ft,identity:pt,copy:gt,mul:mt,translate:vt,rotate:yt,scale:xt,invert:_t,clone:function(t){var e=ft();return gt(e,t),e}}),Sg=pt,Mg=5e-5,Ig=function(t){(t=t||{}).position||(this.position=[0,0]),null==t.rotation&&(this.rotation=0),t.scale||(this.scale=[1,1]),this.origin=this.origin||null},Tg=Ig.prototype;Tg.transform=null,Tg.needLocalTransform=function(){return wt(this.rotation)||wt(this.position[0])||wt(this.position[1])||wt(this.scale[0]-1)||wt(this.scale[1]-1)};var Cg=[];Tg.updateTransform=function(){var t=this.parent,e=t&&t.transform,n=this.needLocalTransform(),i=this.transform;if(n||e){i=i||ft(),n?this.getLocalTransform(i):Sg(i),e&&(n?mt(i,t.transform,i):gt(i,t.transform)),this.transform=i;var r=this.globalScaleRatio;if(null!=r&&1!==r){this.getGlobalScale(Cg);var o=Cg[0]<0?-1:1,a=Cg[1]<0?-1:1,s=((Cg[0]-o)*r+o)/Cg[0]||0,l=((Cg[1]-a)*r+a)/Cg[1]||0;i[0]*=s,i[1]*=s,i[2]*=l,i[3]*=l}this.invTransform=this.invTransform||ft(),_t(this.invTransform,i)}else i&&Sg(i)},Tg.getLocalTransform=function(t){return Ig.getLocalTransform(this,t)},Tg.setTransform=function(t){var e=this.transform,n=t.dpr||1;e?t.setTransform(n*e[0],n*e[1],n*e[2],n*e[3],n*e[4],n*e[5]):t.setTransform(n,0,0,n,0,0)},Tg.restoreTransform=function(t){var e=t.dpr||1;t.setTransform(e,0,0,e,0,0)};var Ag=[],Dg=ft();Tg.setLocalTransform=function(t){if(t){var e=t[0]*t[0]+t[1]*t[1],n=t[2]*t[2]+t[3]*t[3],i=this.position,r=this.scale;wt(e-1)&&(e=Math.sqrt(e)),wt(n-1)&&(n=Math.sqrt(n)),t[0]<0&&(e=-e),t[3]<0&&(n=-n),i[0]=t[4],i[1]=t[5],r[0]=e,r[1]=n,this.rotation=Math.atan2(-t[1]/n,t[0]/e)}},Tg.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(mt(Ag,t.invTransform,e),e=Ag);var n=this.origin;n&&(n[0]||n[1])&&(Dg[4]=n[0],Dg[5]=n[1],mt(Ag,e,Dg),Ag[4]-=n[0],Ag[5]-=n[1],e=Ag),this.setLocalTransform(e)}},Tg.getGlobalScale=function(t){var e=this.transform;return t=t||[],e?(t[0]=Math.sqrt(e[0]*e[0]+e[1]*e[1]),t[1]=Math.sqrt(e[2]*e[2]+e[3]*e[3]),e[0]<0&&(t[0]=-t[0]),e[3]<0&&(t[1]=-t[1]),t):(t[0]=1,t[1]=1,t)},Tg.transformCoordToLocal=function(t,e){var n=[t,e],i=this.invTransform;return i&&$(n,n,i),n},Tg.transformCoordToGlobal=function(t,e){var n=[t,e],i=this.transform;return i&&$(n,n,i),n},Ig.getLocalTransform=function(t,e){Sg(e=e||[]);var n=t.origin,i=t.scale||[1,1],r=t.rotation||0,o=t.position||[0,0];return n&&(e[4]-=n[0],e[5]-=n[1]),xt(e,e,i),r&&yt(e,e,r),n&&(e[4]+=n[0],e[5]+=n[1]),e[4]+=o[0],e[5]+=o[1],e};var kg={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(2-Math.pow(2,-10*(t-1)))},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),-n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4))},elasticOut:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/.4)+1)},elasticInOut:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),(t*=2)<1?n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4)*-.5:n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?t*t*((e+1)*t-e)*.5:.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-kg.bounceOut(1-t)},bounceOut:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return t<.5?.5*kg.bounceIn(2*t):.5*kg.bounceOut(2*t-1)+.5}};bt.prototype={constructor:bt,step:function(t,e){if(this._initialized||(this._startTime=t+this._delay,this._initialized=!0),this._paused)this._pausedTime+=e;else{var n=(t-this._startTime-this._pausedTime)/this._life;if(!(n<0)){n=Math.min(n,1);var i=this.easing,r="string"==typeof i?kg[i]:i,o="function"==typeof r?r(n):n;return this.fire("frame",o),1==n?this.loop?(this.restart(t),"restart"):(this._needsRemove=!0,"destroy"):null}}},restart:function(t){var e=(t-this._startTime-this._pausedTime)%this._life;this._startTime=t-e+this.gap,this._pausedTime=0,this._needsRemove=!1},fire:function(t,e){this[t="on"+t]&&this[t](this._target,e)},pause:function(){this._paused=!0},resume:function(){this._paused=!1}};var Pg=function(){this.head=null,this.tail=null,this._len=0},Lg=Pg.prototype;Lg.insert=function(t){var e=new Og(t);return this.insertEntry(e),e},Lg.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,t.next=null,this.tail=t):this.head=this.tail=t,this._len++},Lg.remove=function(t){var e=t.prev,n=t.next;e?e.next=n:this.head=n,n?n.prev=e:this.tail=e,t.next=t.prev=null,this._len--},Lg.len=function(){return this._len},Lg.clear=function(){this.head=this.tail=null,this._len=0};var Og=function(t){this.value=t,this.next,this.prev},zg=function(t){this._list=new Pg,this._map={},this._maxSize=t||10,this._lastRemovedEntry=null},Eg=zg.prototype;Eg.put=function(t,e){var n=this._list,i=this._map,r=null;if(null==i[t]){var o=n.len(),a=this._lastRemovedEntry;if(o>=this._maxSize&&o>0){var s=n.head;n.remove(s),delete i[s.key],r=s.value,this._lastRemovedEntry=s}a?a.value=e:a=new Og(e),a.key=t,n.insertEntry(a),i[t]=a}return r},Eg.get=function(t){var e=this._map[t],n=this._list;if(null!=e)return e!==n.tail&&(n.remove(e),n.insertEntry(e)),e.value},Eg.clear=function(){this._list.clear(),this._map={}};var Ng={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]},Rg=new zg(20),Bg=null,Fg=Bt,Vg=Ft,Wg=(Object.freeze||Object)({parse:Ot,lift:Nt,toHex:Rt,fastLerp:Bt,fastMapToColor:Fg,lerp:Ft,mapToColor:Vg,modifyHSL:function(t,e,n,i){if(t=Ot(t))return t=Et(t),null!=e&&(t[0]=Mt(e)),null!=n&&(t[1]=Ct(n)),null!=i&&(t[2]=Ct(i)),Wt(zt(t),"rgba")},modifyAlpha:Vt,stringify:Wt}),Hg=Array.prototype.slice,Gg=function(t,e,n,i){this._tracks={},this._target=t,this._loop=e||!1,this._getter=n||Ht,this._setter=i||Gt,this._clipCount=0,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[]};Gg.prototype={when:function(t,e){var n=this._tracks;for(var i in e)if(e.hasOwnProperty(i)){if(!n[i]){n[i]=[];var r=this._getter(this._target,i);if(null==r)continue;0!==t&&n[i].push({time:0,value:Kt(r)})}n[i].push({time:t,value:e[i]})}return this},during:function(t){return this._onframeList.push(t),this},pause:function(){for(var t=0;t<this._clipList.length;t++)this._clipList[t].pause();this._paused=!0},resume:function(){for(var t=0;t<this._clipList.length;t++)this._clipList[t].resume();this._paused=!1},isPaused:function(){return!!this._paused},_doneCallback:function(){this._tracks={},this._clipList.length=0;for(var t=this._doneList,e=t.length,n=0;n<e;n++)t[n].call(this)},start:function(t,e){var n,i=this,r=0;for(var o in this._tracks)if(this._tracks.hasOwnProperty(o)){var a=te(this,t,function(){--r||i._doneCallback()},this._tracks[o],o,e);a&&(this._clipList.push(a),r++,this.animation&&this.animation.addClip(a),n=a)}if(n){var s=n.onframe;n.onframe=function(t,e){s(t,e);for(var n=0;n<i._onframeList.length;n++)i._onframeList[n](t,e)}}return r||this._doneCallback(),this},stop:function(t){for(var e=this._clipList,n=this.animation,i=0;i<e.length;i++){var r=e[i];t&&r.onframe(this._target,1),n&&n.removeClip(r)}e.length=0},delay:function(t){return this._delay=t,this},done:function(t){return t&&this._doneList.push(t),this},getClips:function(){return this._clipList}};var Zg=1;"undefined"!=typeof window&&(Zg=Math.max(window.devicePixelRatio||1,1));var Ug=Zg,Xg=function(){},Yg=Xg,jg=function(){this.animators=[]};jg.prototype={constructor:jg,animate:function(t,e){var n,i=!1,r=this,o=this.__zr;if(t){var a=t.split("."),s=r;i="shape"===a[0];for(var u=0,h=a.length;u<h;u++)s&&(s=s[a[u]]);s&&(n=s)}else n=r;if(n){var c=r.animators,d=new Gg(n,e);return d.during(function(t){r.dirty(i)}).done(function(){c.splice(l(c,d),1)}),c.push(d),o&&o.animation.addAnimator(d),d}Yg('Property "'+t+'" is not existed in element '+r.id)},stopAnimation:function(t){for(var e=this.animators,n=e.length,i=0;i<n;i++)e[i].stop(t);return e.length=0,this},animateTo:function(t,e,n,i,r,o){ee(this,t,e,n,i,r,o)},animateFrom:function(t,e,n,i,r,o){ee(this,t,e,n,i,r,o,!0)}};var qg=function(t){Ig.call(this,t),pg.call(this,t),jg.call(this,t),this.id=t.id||Zp()};qg.prototype={type:"element",name:"",__zr:null,ignore:!1,clipPath:null,isGroup:!1,drift:function(t,e){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var n=this.transform;n||(n=this.transform=[1,0,0,1,0,0]),n[4]+=t,n[5]+=e,this.decomposeTransform(),this.dirty(!1)},beforeUpdate:function(){},afterUpdate:function(){},update:function(){this.updateTransform()},traverse:function(t,e){},attrKV:function(t,e){if("position"===t||"scale"===t||"origin"===t){if(e){var n=this[t];n||(n=this[t]=[]),n[0]=e[0],n[1]=e[1]}}else this[t]=e},hide:function(){this.ignore=!0,this.__zr&&this.__zr.refresh()},show:function(){this.ignore=!1,this.__zr&&this.__zr.refresh()},attr:function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(w(t))for(var n in t)t.hasOwnProperty(n)&&this.attrKV(n,t[n]);return this.dirty(!1),this},setClipPath:function(t){var e=this.__zr;e&&t.addSelfToZr(e),this.clipPath&&this.clipPath!==t&&this.removeClipPath(),this.clipPath=t,t.__zr=e,t.__clipTarget=this,this.dirty(!1)},removeClipPath:function(){var t=this.clipPath;t&&(t.__zr&&t.removeSelfFromZr(t.__zr),t.__zr=null,t.__clipTarget=null,this.clipPath=null,this.dirty(!1))},addSelfToZr:function(t){this.__zr=t;var e=this.animators;if(e)for(var n=0;n<e.length;n++)t.animation.addAnimator(e[n]);this.clipPath&&this.clipPath.addSelfToZr(t)},removeSelfFromZr:function(t){this.__zr=null;var e=this.animators;if(e)for(var n=0;n<e.length;n++)t.animation.removeAnimator(e[n]);this.clipPath&&this.clipPath.removeSelfFromZr(t)}},h(qg,jg),h(qg,Ig),h(qg,pg);var $g=$,Kg=Math.min,Qg=Math.max;re.prototype={constructor:re,union:function(t){var e=Kg(t.x,this.x),n=Kg(t.y,this.y);this.width=Qg(t.x+t.width,this.x+this.width)-e,this.height=Qg(t.y+t.height,this.y+this.height)-n,this.x=e,this.y=n},applyTransform:function(){var t=[],e=[],n=[],i=[];return function(r){if(r){t[0]=n[0]=this.x,t[1]=i[1]=this.y,e[0]=i[0]=this.x+this.width,e[1]=n[1]=this.y+this.height,$g(t,t,r),$g(e,e,r),$g(n,n,r),$g(i,i,r),this.x=Kg(t[0],e[0],n[0],i[0]),this.y=Kg(t[1],e[1],n[1],i[1]);var o=Qg(t[0],e[0],n[0],i[0]),a=Qg(t[1],e[1],n[1],i[1]);this.width=o-this.x,this.height=a-this.y}}}(),calculateTransform:function(t){var e=this,n=t.width/e.width,i=t.height/e.height,r=ft();return vt(r,r,[-e.x,-e.y]),xt(r,r,[n,i]),vt(r,r,[t.x,t.y]),r},intersect:function(t){if(!t)return!1;t instanceof re||(t=re.create(t));var e=this,n=e.x,i=e.x+e.width,r=e.y,o=e.y+e.height,a=t.x,s=t.x+t.width,l=t.y,u=t.y+t.height;return!(i<a||s<n||o<l||u<r)},contain:function(t,e){var n=this;return t>=n.x&&t<=n.x+n.width&&e>=n.y&&e<=n.y+n.height},clone:function(){return new re(this.x,this.y,this.width,this.height)},copy:function(t){this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height},plain:function(){return{x:this.x,y:this.y,width:this.width,height:this.height}}},re.create=function(t){return new re(t.x,t.y,t.width,t.height)};var Jg=function(t){t=t||{},qg.call(this,t);for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e]);this._children=[],this.__storage=null,this.__dirty=!0};Jg.prototype={constructor:Jg,isGroup:!0,type:"group",silent:!1,children:function(){return this._children.slice()},childAt:function(t){return this._children[t]},childOfName:function(t){for(var e=this._children,n=0;n<e.length;n++)if(e[n].name===t)return e[n]},childCount:function(){return this._children.length},add:function(t){return t&&t!==this&&t.parent!==this&&(this._children.push(t),this._doAdd(t)),this},addBefore:function(t,e){if(t&&t!==this&&t.parent!==this&&e&&e.parent===this){var n=this._children,i=n.indexOf(e);i>=0&&(n.splice(i,0,t),this._doAdd(t))}return this},_doAdd:function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__storage,n=this.__zr;e&&e!==t.__storage&&(e.addToStorage(t),t instanceof Jg&&t.addChildrenToStorage(e)),n&&n.refresh()},remove:function(t){var e=this.__zr,n=this.__storage,i=this._children,r=l(i,t);return r<0?this:(i.splice(r,1),t.parent=null,n&&(n.delFromStorage(t),t instanceof Jg&&t.delChildrenFromStorage(n)),e&&e.refresh(),this)},removeAll:function(){var t,e,n=this._children,i=this.__storage;for(e=0;e<n.length;e++)t=n[e],i&&(i.delFromStorage(t),t instanceof Jg&&t.delChildrenFromStorage(i)),t.parent=null;return n.length=0,this},eachChild:function(t,e){for(var n=this._children,i=0;i<n.length;i++){var r=n[i];t.call(e,r,i)}return this},traverse:function(t,e){for(var n=0;n<this._children.length;n++){var i=this._children[n];t.call(e,i),"group"===i.type&&i.traverse(t,e)}return this},addChildrenToStorage:function(t){for(var e=0;e<this._children.length;e++){var n=this._children[e];t.addToStorage(n),n instanceof Jg&&n.addChildrenToStorage(t)}},delChildrenFromStorage:function(t){for(var e=0;e<this._children.length;e++){var n=this._children[e];t.delFromStorage(n),n instanceof Jg&&n.delChildrenFromStorage(t)}},dirty:function(){return this.__dirty=!0,this.__zr&&this.__zr.refresh(),this},getBoundingRect:function(t){for(var e=null,n=new re(0,0,0,0),i=t||this._children,r=[],o=0;o<i.length;o++){var a=i[o];if(!a.ignore&&!a.invisible){var s=a.getBoundingRect(),l=a.getLocalTransform(r);l?(n.copy(s),n.applyTransform(l),(e=e||n.clone()).union(n)):(e=e||s.clone()).union(s)}}return e||n}},u(Jg,qg);var tm=32,em=7,nm=function(){this._roots=[],this._displayList=[],this._displayListLen=0};nm.prototype={constructor:nm,traverse:function(t,e){for(var n=0;n<this._roots.length;n++)this._roots[n].traverse(t,e)},getDisplayList:function(t,e){return e=e||!1,t&&this.updateDisplayList(e),this._displayList},updateDisplayList:function(t){this._displayListLen=0;for(var e=this._roots,n=this._displayList,i=0,r=e.length;i<r;i++)this._updateAndAddDisplayable(e[i],null,t);n.length=this._displayListLen,Xp.canvasSupported&&de(n,fe)},_updateAndAddDisplayable:function(t,e,n){if(!t.ignore||n){t.beforeUpdate(),t.__dirty&&t.update(),t.afterUpdate();var i=t.clipPath;if(i){e=e?e.slice():[];for(var r=i,o=t;r;)r.parent=o,r.updateTransform(),e.push(r),o=r,r=r.clipPath}if(t.isGroup){for(var a=t._children,s=0;s<a.length;s++){var l=a[s];t.__dirty&&(l.__dirty=!0),this._updateAndAddDisplayable(l,e,n)}t.__dirty=!1}else t.__clipPaths=e,this._displayList[this._displayListLen++]=t}},addRoot:function(t){t.__storage!==this&&(t instanceof Jg&&t.addChildrenToStorage(this),this.addToStorage(t),this._roots.push(t))},delRoot:function(t){if(null==t){for(n=0;n<this._roots.length;n++){var e=this._roots[n];e instanceof Jg&&e.delChildrenFromStorage(this)}return this._roots=[],this._displayList=[],void(this._displayListLen=0)}if(t instanceof Array)for(var n=0,i=t.length;n<i;n++)this.delRoot(t[n]);else{var r=l(this._roots,t);r>=0&&(this.delFromStorage(t),this._roots.splice(r,1),t instanceof Jg&&t.delChildrenFromStorage(this))}},addToStorage:function(t){return t&&(t.__storage=this,t.dirty(!1)),this},delFromStorage:function(t){return t&&(t.__storage=null),this},dispose:function(){this._renderList=this._roots=null},displayableSortFunc:fe};var im={shadowBlur:1,shadowOffsetX:1,shadowOffsetY:1,textShadowBlur:1,textShadowOffsetX:1,textShadowOffsetY:1,textBoxShadowBlur:1,textBoxShadowOffsetX:1,textBoxShadowOffsetY:1},rm=function(t,e,n){return im.hasOwnProperty(e)?n*=t.dpr:n},om=[["shadowBlur",0],["shadowOffsetX",0],["shadowOffsetY",0],["shadowColor","#000"],["lineCap","butt"],["lineJoin","miter"],["miterLimit",10]],am=function(t){this.extendFrom(t,!1)};am.prototype={constructor:am,fill:"#000",stroke:null,opacity:1,fillOpacity:null,strokeOpacity:null,lineDash:null,lineDashOffset:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,lineWidth:1,strokeNoScale:!1,text:null,font:null,textFont:null,fontStyle:null,fontWeight:null,fontSize:null,fontFamily:null,textTag:null,textFill:"#000",textStroke:null,textWidth:null,textHeight:null,textStrokeWidth:0,textLineHeight:null,textPosition:"inside",textRect:null,textOffset:null,textAlign:null,textVerticalAlign:null,textDistance:5,textShadowColor:"transparent",textShadowBlur:0,textShadowOffsetX:0,textShadowOffsetY:0,textBoxShadowColor:"transparent",textBoxShadowBlur:0,textBoxShadowOffsetX:0,textBoxShadowOffsetY:0,transformText:!1,textRotation:0,textOrigin:null,textBackgroundColor:null,textBorderColor:null,textBorderWidth:0,textBorderRadius:0,textPadding:null,rich:null,truncate:null,blend:null,bind:function(t,e,n){for(var i=this,r=n&&n.style,o=!r,a=0;a<om.length;a++){var s=om[a],l=s[0];(o||i[l]!==r[l])&&(t[l]=rm(t,l,i[l]||s[1]))}if((o||i.fill!==r.fill)&&(t.fillStyle=i.fill),(o||i.stroke!==r.stroke)&&(t.strokeStyle=i.stroke),(o||i.opacity!==r.opacity)&&(t.globalAlpha=null==i.opacity?1:i.opacity),(o||i.blend!==r.blend)&&(t.globalCompositeOperation=i.blend||"source-over"),this.hasStroke()){var u=i.lineWidth;t.lineWidth=u/(this.strokeNoScale&&e&&e.getLineScale?e.getLineScale():1)}},hasFill:function(){var t=this.fill;return null!=t&&"none"!==t},hasStroke:function(){var t=this.stroke;return null!=t&&"none"!==t&&this.lineWidth>0},extendFrom:function(t,e){if(t)for(var n in t)!t.hasOwnProperty(n)||!0!==e&&(!1===e?this.hasOwnProperty(n):null==t[n])||(this[n]=t[n])},set:function(t,e){"string"==typeof t?this[t]=e:this.extendFrom(t,!0)},clone:function(){var t=new this.constructor;return t.extendFrom(this,!0),t},getGradient:function(t,e,n){for(var i=("radial"===e.type?ge:pe)(t,e,n),r=e.colorStops,o=0;o<r.length;o++)i.addColorStop(r[o].offset,r[o].color);return i}};for(var sm=am.prototype,lm=0;lm<om.length;lm++){var um=om[lm];um[0]in sm||(sm[um[0]]=um[1])}am.getGradient=sm.getGradient;var hm=function(t,e){this.image=t,this.repeat=e,this.type="pattern"};hm.prototype.getCanvasPattern=function(t){return t.createPattern(this.image,this.repeat||"repeat")};var cm=function(t,e,n){var i;n=n||Ug,"string"==typeof t?i=ve(t,e,n):w(t)&&(t=(i=t).id),this.id=t,this.dom=i;var r=i.style;r&&(i.onselectstart=me,r["-webkit-user-select"]="none",r["user-select"]="none",r["-webkit-touch-callout"]="none",r["-webkit-tap-highlight-color"]="rgba(0,0,0,0)",r.padding=0,r.margin=0,r["border-width"]=0),this.domBack=null,this.ctxBack=null,this.painter=e,this.config=null,this.clearColor=0,this.motionBlur=!1,this.lastFrameAlpha=.7,this.dpr=n};cm.prototype={constructor:cm,__dirty:!0,__used:!1,__drawIndex:0,__startIndex:0,__endIndex:0,incremental:!1,getElementCount:function(){return this.__endIndex-this.__startIndex},initContext:function(){this.ctx=this.dom.getContext("2d"),this.ctx.dpr=this.dpr},createBackBuffer:function(){var t=this.dpr;this.domBack=ve("back-"+this.id,this.painter,t),this.ctxBack=this.domBack.getContext("2d"),1!=t&&this.ctxBack.scale(t,t)},resize:function(t,e){var n=this.dpr,i=this.dom,r=i.style,o=this.domBack;r&&(r.width=t+"px",r.height=e+"px"),i.width=t*n,i.height=e*n,o&&(o.width=t*n,o.height=e*n,1!=n&&this.ctxBack.scale(n,n))},clear:function(t,e){var n=this.dom,i=this.ctx,r=n.width,o=n.height,e=e||this.clearColor,a=this.motionBlur&&!t,s=this.lastFrameAlpha,l=this.dpr;if(a&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation="copy",this.ctxBack.drawImage(n,0,0,r/l,o/l)),i.clearRect(0,0,r,o),e&&"transparent"!==e){var u;e.colorStops?(u=e.__canvasGradient||am.getGradient(i,e,{x:0,y:0,width:r,height:o}),e.__canvasGradient=u):e.image&&(u=hm.prototype.getCanvasPattern.call(e,i)),i.save(),i.fillStyle=u||e,i.fillRect(0,0,r,o),i.restore()}if(a){var h=this.domBack;i.save(),i.globalAlpha=s,i.drawImage(h,0,0,r,o),i.restore()}}};var dm="undefined"!=typeof window&&(window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.msRequestAnimationFrame&&window.msRequestAnimationFrame.bind(window)||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(t){setTimeout(t,16)},fm=new zg(50),pm={},gm=0,mm=5e3,vm=/\{([a-zA-Z0-9_]+)\|([^}]*)\}/g,ym="12px sans-serif",xm={};xm.measureText=function(t,e){var n=s();return n.font=e||ym,n.measureText(t)};var _m={left:1,right:1,center:1},wm={top:1,bottom:1,middle:1},bm=[["textShadowBlur","shadowBlur",0],["textShadowOffsetX","shadowOffsetX",0],["textShadowOffsetY","shadowOffsetY",0],["textShadowColor","shadowColor","transparent"]],Sm=new re,Mm=function(){};Mm.prototype={constructor:Mm,drawRectText:function(t,e){var n=this.style;e=n.textRect||e,this.__dirty&&Ve(n);var i=n.text;if(null!=i&&(i+=""),rn(i,n)){t.save();var r=this.transform;n.transformText?this.setTransform(t):r&&(Sm.copy(e),Sm.applyTransform(r),e=Sm),He(this,t,i,n,e),t.restore()}}},on.prototype={constructor:on,type:"displayable",__dirty:!0,invisible:!1,z:0,z2:0,zlevel:0,draggable:!1,dragging:!1,silent:!1,culling:!1,cursor:"pointer",rectHover:!1,progressive:!1,incremental:!1,globalScaleRatio:1,beforeBrush:function(t){},afterBrush:function(t){},brush:function(t,e){},getBoundingRect:function(){},contain:function(t,e){return this.rectContain(t,e)},traverse:function(t,e){t.call(e,this)},rectContain:function(t,e){var n=this.transformCoordToLocal(t,e);return this.getBoundingRect().contain(n[0],n[1])},dirty:function(){this.__dirty=this.__dirtyText=!0,this._rect=null,this.__zr&&this.__zr.refresh()},animateStyle:function(t){return this.animate("style",t)},attrKV:function(t,e){"style"!==t?qg.prototype.attrKV.call(this,t,e):this.style.set(e)},setStyle:function(t,e){return this.style.set(t,e),this.dirty(!1),this},useStyle:function(t){return this.style=new am(t,this),this.dirty(!1),this}},u(on,qg),h(on,Mm),an.prototype={constructor:an,type:"image",brush:function(t,e){var n=this.style,i=n.image;n.bind(t,this,e);var r=this._image=xe(i,this._image,this,this.onload);if(r&&we(r)){var o=n.x||0,a=n.y||0,s=n.width,l=n.height,u=r.width/r.height;if(null==s&&null!=l?s=l*u:null==l&&null!=s?l=s/u:null==s&&null==l&&(s=r.width,l=r.height),this.setTransform(t),n.sWidth&&n.sHeight){var h=n.sx||0,c=n.sy||0;t.drawImage(r,h,c,n.sWidth,n.sHeight,o,a,s,l)}else if(n.sx&&n.sy){var d=s-(h=n.sx),f=l-(c=n.sy);t.drawImage(r,h,c,d,f,o,a,s,l)}else t.drawImage(r,o,a,s,l);null!=n.text&&(this.restoreTransform(t),this.drawRectText(t,this.getBoundingRect()))}},getBoundingRect:function(){var t=this.style;return this._rect||(this._rect=new re(t.x||0,t.y||0,t.width||0,t.height||0)),this._rect}},u(an,on);var Im=new re(0,0,0,0),Tm=new re(0,0,0,0),Cm=function(t,e,n){this.type="canvas";var i=!t.nodeName||"CANVAS"===t.nodeName.toUpperCase();this._opts=n=o({},n||{}),this.dpr=n.devicePixelRatio||Ug,this._singleCanvas=i,this.root=t;var r=t.style;r&&(r["-webkit-tap-highlight-color"]="transparent",r["-webkit-user-select"]=r["user-select"]=r["-webkit-touch-callout"]="none",t.innerHTML=""),this.storage=e;var a=this._zlevelList=[],s=this._layers={};if(this._layerConfig={},this._needsManuallyCompositing=!1,i){var l=t.width,u=t.height;null!=n.width&&(l=n.width),null!=n.height&&(u=n.height),this.dpr=n.devicePixelRatio||1,t.width=l*this.dpr,t.height=u*this.dpr,this._width=l,this._height=u;var h=new cm(t,this,this.dpr);h.__builtin__=!0,h.initContext(),s[314159]=h,h.zlevel=314159,a.push(314159),this._domRoot=t}else{this._width=this._getSize(0),this._height=this._getSize(1);var c=this._domRoot=dn(this._width,this._height);t.appendChild(c)}this._hoverlayer=null,this._hoverElements=[]};Cm.prototype={constructor:Cm,getType:function(){return"canvas"},isSingleCanvas:function(){return this._singleCanvas},getViewportRoot:function(){return this._domRoot},getViewportRootOffset:function(){var t=this.getViewportRoot();if(t)return{offsetLeft:t.offsetLeft||0,offsetTop:t.offsetTop||0}},refresh:function(t){var e=this.storage.getDisplayList(!0),n=this._zlevelList;this._redrawId=Math.random(),this._paintList(e,t,this._redrawId);for(var i=0;i<n.length;i++){var r=n[i],o=this._layers[r];if(!o.__builtin__&&o.refresh){var a=0===i?this._backgroundColor:null;o.refresh(a)}}return this.refreshHover(),this},addHover:function(t,e){if(!t.__hoverMir){var n=new t.constructor({style:t.style,shape:t.shape,z:t.z,z2:t.z2,silent:t.silent});return n.__from=t,t.__hoverMir=n,e&&n.setStyle(e),this._hoverElements.push(n),n}},removeHover:function(t){var e=t.__hoverMir,n=this._hoverElements,i=l(n,e);i>=0&&n.splice(i,1),t.__hoverMir=null},clearHover:function(t){for(var e=this._hoverElements,n=0;n<e.length;n++){var i=e[n].__from;i&&(i.__hoverMir=null)}e.length=0},refreshHover:function(){var t=this._hoverElements,e=t.length,n=this._hoverlayer;if(n&&n.clear(),e){de(t,this.storage.displayableSortFunc),n||(n=this._hoverlayer=this.getLayer(1e5));var i={};n.ctx.save();for(var r=0;r<e;){var o=t[r],a=o.__from;a&&a.__zr?(r++,a.invisible||(o.transform=a.transform,o.invTransform=a.invTransform,o.__clipPaths=a.__clipPaths,this._doPaintEl(o,n,!0,i))):(t.splice(r,1),a.__hoverMir=null,e--)}n.ctx.restore()}},getHoverLayer:function(){return this.getLayer(1e5)},_paintList:function(t,e,n){if(this._redrawId===n){e=e||!1,this._updateLayerStatus(t);var i=this._doPaintList(t,e);if(this._needsManuallyCompositing&&this._compositeManually(),!i){var r=this;dm(function(){r._paintList(t,e,n)})}}},_compositeManually:function(){var t=this.getLayer(314159).ctx,e=this._domRoot.width,n=this._domRoot.height;t.clearRect(0,0,e,n),this.eachBuiltinLayer(function(i){i.virtual&&t.drawImage(i.dom,0,0,e,n)})},_doPaintList:function(t,e){for(var n=[],i=0;i<this._zlevelList.length;i++){var r=this._zlevelList[i];(s=this._layers[r]).__builtin__&&s!==this._hoverlayer&&(s.__dirty||e)&&n.push(s)}for(var o=!0,a=0;a<n.length;a++){var s=n[a],l=s.ctx,u={};l.save();var h=e?s.__startIndex:s.__drawIndex,c=!e&&s.incremental&&Date.now,f=c&&Date.now(),p=s.zlevel===this._zlevelList[0]?this._backgroundColor:null;if(s.__startIndex===s.__endIndex)s.clear(!1,p);else if(h===s.__startIndex){var g=t[h];g.incremental&&g.notClear&&!e||s.clear(!1,p)}-1===h&&(console.error("For some unknown reason. drawIndex is -1"),h=s.__startIndex);for(var m=h;m<s.__endIndex;m++){var v=t[m];if(this._doPaintEl(v,s,e,u),v.__dirty=v.__dirtyText=!1,c&&Date.now()-f>15)break}s.__drawIndex=m,s.__drawIndex<s.__endIndex&&(o=!1),u.prevElClipPaths&&l.restore(),l.restore()}return Xp.wxa&&d(this._layers,function(t){t&&t.ctx&&t.ctx.draw&&t.ctx.draw()}),o},_doPaintEl:function(t,e,n,i){var r=e.ctx,o=t.transform;if((e.__dirty||n)&&!t.invisible&&0!==t.style.opacity&&(!o||o[0]||o[3])&&(!t.culling||!un(t,this._width,this._height))){var a=t.__clipPaths;i.prevElClipPaths&&!hn(a,i.prevElClipPaths)||(i.prevElClipPaths&&(e.ctx.restore(),i.prevElClipPaths=null,i.prevEl=null),a&&(r.save(),cn(a,r),i.prevElClipPaths=a)),t.beforeBrush&&t.beforeBrush(r),t.brush(r,i.prevEl||null),i.prevEl=t,t.afterBrush&&t.afterBrush(r)}},getLayer:function(t,e){this._singleCanvas&&!this._needsManuallyCompositing&&(t=314159);var n=this._layers[t];return n||((n=new cm("zr_"+t,this,this.dpr)).zlevel=t,n.__builtin__=!0,this._layerConfig[t]&&i(n,this._layerConfig[t],!0),e&&(n.virtual=e),this.insertLayer(t,n),n.initContext()),n},insertLayer:function(t,e){var n=this._layers,i=this._zlevelList,r=i.length,o=null,a=-1,s=this._domRoot;if(n[t])Yg("ZLevel "+t+" has been used already");else if(ln(e)){if(r>0&&t>i[0]){for(a=0;a<r-1&&!(i[a]<t&&i[a+1]>t);a++);o=n[i[a]]}if(i.splice(a+1,0,t),n[t]=e,!e.virtual)if(o){var l=o.dom;l.nextSibling?s.insertBefore(e.dom,l.nextSibling):s.appendChild(e.dom)}else s.firstChild?s.insertBefore(e.dom,s.firstChild):s.appendChild(e.dom)}else Yg("Layer of zlevel "+t+" is not valid")},eachLayer:function(t,e){var n,i,r=this._zlevelList;for(i=0;i<r.length;i++)n=r[i],t.call(e,this._layers[n],n)},eachBuiltinLayer:function(t,e){var n,i,r,o=this._zlevelList;for(r=0;r<o.length;r++)i=o[r],(n=this._layers[i]).__builtin__&&t.call(e,n,i)},eachOtherLayer:function(t,e){var n,i,r,o=this._zlevelList;for(r=0;r<o.length;r++)i=o[r],(n=this._layers[i]).__builtin__||t.call(e,n,i)},getLayers:function(){return this._layers},_updateLayerStatus:function(t){function e(t){n&&(n.__endIndex!==t&&(n.__dirty=!0),n.__endIndex=t)}if(this.eachBuiltinLayer(function(t,e){t.__dirty=t.__used=!1}),this._singleCanvas)for(r=1;r<t.length;r++)if((a=t[r]).zlevel!==t[r-1].zlevel||a.incremental){this._needsManuallyCompositing=!0;break}for(var n=null,i=0,r=0;r<t.length;r++){var o,a=t[r],s=a.zlevel;a.incremental?((o=this.getLayer(s+.001,this._needsManuallyCompositing)).incremental=!0,i=1):o=this.getLayer(s+(i>0?.01:0),this._needsManuallyCompositing),o.__builtin__||Yg("ZLevel "+s+" has been used by unkown layer "+o.id),o!==n&&(o.__used=!0,o.__startIndex!==r&&(o.__dirty=!0),o.__startIndex=r,o.incremental?o.__drawIndex=-1:o.__drawIndex=r,e(r),n=o),a.__dirty&&(o.__dirty=!0,o.incremental&&o.__drawIndex<0&&(o.__drawIndex=r))}e(r),this.eachBuiltinLayer(function(t,e){!t.__used&&t.getElementCount()>0&&(t.__dirty=!0,t.__startIndex=t.__endIndex=t.__drawIndex=0),t.__dirty&&t.__drawIndex<0&&(t.__drawIndex=t.__startIndex)})},clear:function(){return this.eachBuiltinLayer(this._clearLayer),this},_clearLayer:function(t){t.clear()},setBackgroundColor:function(t){this._backgroundColor=t},configLayer:function(t,e){if(e){var n=this._layerConfig;n[t]?i(n[t],e,!0):n[t]=e;for(var r=0;r<this._zlevelList.length;r++){var o=this._zlevelList[r];o!==t&&o!==t+.01||i(this._layers[o],n[t],!0)}}},delLayer:function(t){var e=this._layers,n=this._zlevelList,i=e[t];i&&(i.dom.parentNode.removeChild(i.dom),delete e[t],n.splice(l(n,t),1))},resize:function(t,e){if(this._domRoot.style){var n=this._domRoot;n.style.display="none";var i=this._opts;if(null!=t&&(i.width=t),null!=e&&(i.height=e),t=this._getSize(0),e=this._getSize(1),n.style.display="",this._width!=t||e!=this._height){n.style.width=t+"px",n.style.height=e+"px";for(var r in this._layers)this._layers.hasOwnProperty(r)&&this._layers[r].resize(t,e);d(this._progressiveLayers,function(n){n.resize(t,e)}),this.refresh(!0)}this._width=t,this._height=e}else{if(null==t||null==e)return;this._width=t,this._height=e,this.getLayer(314159).resize(t,e)}return this},clearLayer:function(t){var e=this._layers[t];e&&e.clear()},dispose:function(){this.root.innerHTML="",this.root=this.storage=this._domRoot=this._layers=null},getRenderedCanvas:function(t){if(t=t||{},this._singleCanvas&&!this._compositeManually)return this._layers[314159].dom;var e=new cm("image",this,t.pixelRatio||this.dpr);if(e.initContext(),e.clear(!1,t.backgroundColor||this._backgroundColor),t.pixelRatio<=this.dpr){this.refresh();var n=e.dom.width,i=e.dom.height,r=e.ctx;this.eachLayer(function(t){t.__builtin__?r.drawImage(t.dom,0,0,n,i):t.renderToCanvas&&(e.ctx.save(),t.renderToCanvas(e.ctx),e.ctx.restore())})}else for(var o={},a=this.storage.getDisplayList(!0),s=0;s<a.length;s++){var l=a[s];this._doPaintEl(l,e,!0,o)}return e.dom},getWidth:function(){return this._width},getHeight:function(){return this._height},_getSize:function(t){var e=this._opts,n=["width","height"][t],i=["clientWidth","clientHeight"][t],r=["paddingLeft","paddingTop"][t],o=["paddingRight","paddingBottom"][t];if(null!=e[n]&&"auto"!==e[n])return parseFloat(e[n]);var a=this.root,s=document.defaultView.getComputedStyle(a);return(a[i]||sn(s[n])||sn(a.style[n]))-(sn(s[r])||0)-(sn(s[o])||0)|0},pathToImage:function(t,e){e=e||this.dpr;var n=document.createElement("canvas"),i=n.getContext("2d"),r=t.getBoundingRect(),o=t.style,a=o.shadowBlur*e,s=o.shadowOffsetX*e,l=o.shadowOffsetY*e,u=o.hasStroke()?o.lineWidth:0,h=Math.max(u/2,-s+a),c=Math.max(u/2,s+a),d=Math.max(u/2,-l+a),f=Math.max(u/2,l+a),p=r.width+h+c,g=r.height+d+f;n.width=p*e,n.height=g*e,i.scale(e,e),i.clearRect(0,0,p,g),i.dpr=e;var m={position:t.position,rotation:t.rotation,scale:t.scale};t.position=[h-r.x,d-r.y],t.rotation=0,t.scale=[1,1],t.updateTransform(),t&&t.brush(i);var v=new an({style:{x:0,y:0,image:n}});return null!=m.position&&(v.position=t.position=m.position),null!=m.rotation&&(v.rotation=t.rotation=m.rotation),null!=m.scale&&(v.scale=t.scale=m.scale),v}};var Am=function(t){t=t||{},this.stage=t.stage||{},this.onframe=t.onframe||function(){},this._clips=[],this._running=!1,this._time,this._pausedTime,this._pauseStart,this._paused=!1,pg.call(this)};Am.prototype={constructor:Am,addClip:function(t){this._clips.push(t)},addAnimator:function(t){t.animation=this;for(var e=t.getClips(),n=0;n<e.length;n++)this.addClip(e[n])},removeClip:function(t){var e=l(this._clips,t);e>=0&&this._clips.splice(e,1)},removeAnimator:function(t){for(var e=t.getClips(),n=0;n<e.length;n++)this.removeClip(e[n]);t.animation=null},_update:function(){for(var t=(new Date).getTime()-this._pausedTime,e=t-this._time,n=this._clips,i=n.length,r=[],o=[],a=0;a<i;a++){var s=n[a],l=s.step(t,e);l&&(r.push(l),o.push(s))}for(a=0;a<i;)n[a]._needsRemove?(n[a]=n[i-1],n.pop(),i--):a++;i=r.length;for(a=0;a<i;a++)o[a].fire(r[a]);this._time=t,this.onframe(e),this.trigger("frame",e),this.stage.update&&this.stage.update()},_startLoop:function(){function t(){e._running&&(dm(t),!e._paused&&e._update())}var e=this;this._running=!0,dm(t)},start:function(){this._time=(new Date).getTime(),this._pausedTime=0,this._startLoop()},stop:function(){this._running=!1},pause:function(){this._paused||(this._pauseStart=(new Date).getTime(),this._paused=!0)},resume:function(){this._paused&&(this._pausedTime+=(new Date).getTime()-this._pauseStart,this._paused=!1)},clear:function(){this._clips=[]},isFinished:function(){return!this._clips.length},animate:function(t,e){var n=new Gg(t,(e=e||{}).loop,e.getter,e.setter);return this.addAnimator(n),n}},h(Am,pg);var Dm=function(){this._track=[]};Dm.prototype={constructor:Dm,recognize:function(t,e,n){return this._doTrack(t,e,n),this._recognize(t)},clear:function(){return this._track.length=0,this},_doTrack:function(t,e,n){var i=t.touches;if(i){for(var r={points:[],touches:[],target:e,event:t},o=0,a=i.length;o<a;o++){var s=i[o],l=it(n,s,{});r.points.push([l.zrX,l.zrY]),r.touches.push(s)}this._track.push(r)}},_recognize:function(t){for(var e in km)if(km.hasOwnProperty(e)){var n=km[e](this._track,t);if(n)return n}}};var km={pinch:function(t,e){var n=t.length;if(n){var i=(t[n-1]||{}).points,r=(t[n-2]||{}).points||i;if(r&&r.length>1&&i&&i.length>1){var o=fn(i)/fn(r);!isFinite(o)&&(o=1),e.pinchScale=o;var a=pn(i);return e.pinchX=a[0],e.pinchY=a[1],{type:"pinch",target:t[0].target,event:e}}}}},Pm=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],Lm=["touchstart","touchend","touchmove"],Om={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},zm=f(Pm,function(t){var e=t.replace("mouse","pointer");return Om[e]?e:t}),Em={mousemove:function(t){t=ot(this.dom,t),this.trigger("mousemove",t)},mouseout:function(t){var e=(t=ot(this.dom,t)).toElement||t.relatedTarget;if(e!=this.dom)for(;e&&9!=e.nodeType;){if(e===this.dom)return;e=e.parentNode}this.trigger("mouseout",t)},touchstart:function(t){(t=ot(this.dom,t)).zrByTouch=!0,this._lastTouchMoment=new Date,mn(this,t,"start"),Em.mousemove.call(this,t),Em.mousedown.call(this,t),vn(this)},touchmove:function(t){(t=ot(this.dom,t)).zrByTouch=!0,mn(this,t,"change"),Em.mousemove.call(this,t),vn(this)},touchend:function(t){(t=ot(this.dom,t)).zrByTouch=!0,mn(this,t,"end"),Em.mouseup.call(this,t),+new Date-this._lastTouchMoment<300&&Em.click.call(this,t),vn(this)},pointerdown:function(t){Em.mousedown.call(this,t)},pointermove:function(t){yn(t)||Em.mousemove.call(this,t)},pointerup:function(t){Em.mouseup.call(this,t)},pointerout:function(t){yn(t)||Em.mouseout.call(this,t)}};d(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(t){Em[t]=function(e){e=ot(this.dom,e),this.trigger(t,e)}});var Nm=_n.prototype;Nm.dispose=function(){for(var t=Pm.concat(Lm),e=0;e<t.length;e++){var n=t[e];st(this.dom,gn(n),this._handlers[n])}},Nm.setCursor=function(t){this.dom.style&&(this.dom.style.cursor=t||"default")},h(_n,pg);var Rm=!Xp.canvasSupported,Bm={canvas:Cm},Fm={},Vm=function(t,e,n){n=n||{},this.dom=e,this.id=t;var i=this,r=new nm,o=n.renderer;if(Rm){if(!Bm.vml)throw new Error("You need to require 'zrender/vml/vml' to support IE8");o="vml"}else o&&Bm[o]||(o="canvas");var a=new Bm[o](e,r,n,t);this.storage=r,this.painter=a;var s=Xp.node||Xp.worker?null:new _n(a.getViewportRoot());this.handler=new _g(r,a,s,a.root),this.animation=new Am({stage:{update:m(this.flush,this)}}),this.animation.start(),this._needsRefresh;var l=r.delFromStorage,u=r.addToStorage;r.delFromStorage=function(t){l.call(r,t),t&&t.removeSelfFromZr(i)},r.addToStorage=function(t){u.call(r,t),t.addSelfToZr(i)}};Vm.prototype={constructor:Vm,getId:function(){return this.id},add:function(t){this.storage.addRoot(t),this._needsRefresh=!0},remove:function(t){this.storage.delRoot(t),this._needsRefresh=!0},configLayer:function(t,e){this.painter.configLayer&&this.painter.configLayer(t,e),this._needsRefresh=!0},setBackgroundColor:function(t){this.painter.setBackgroundColor&&this.painter.setBackgroundColor(t),this._needsRefresh=!0},refreshImmediately:function(){this._needsRefresh=!1,this.painter.refresh(),this._needsRefresh=!1},refresh:function(){this._needsRefresh=!0},flush:function(){var t;this._needsRefresh&&(t=!0,this.refreshImmediately()),this._needsRefreshHover&&(t=!0,this.refreshHoverImmediately()),t&&this.trigger("rendered")},addHover:function(t,e){if(this.painter.addHover){var n=this.painter.addHover(t,e);return this.refreshHover(),n}},removeHover:function(t){this.painter.removeHover&&(this.painter.removeHover(t),this.refreshHover())},clearHover:function(){this.painter.clearHover&&(this.painter.clearHover(),this.refreshHover())},refreshHover:function(){this._needsRefreshHover=!0},refreshHoverImmediately:function(){this._needsRefreshHover=!1,this.painter.refreshHover&&this.painter.refreshHover()},resize:function(t){t=t||{},this.painter.resize(t.width,t.height),this.handler.resize()},clearAnimation:function(){this.animation.clear()},getWidth:function(){return this.painter.getWidth()},getHeight:function(){return this.painter.getHeight()},pathToImage:function(t,e){return this.painter.pathToImage(t,e)},setCursorStyle:function(t){this.handler.setCursorStyle(t)},findHover:function(t,e){return this.handler.findHover(t,e)},on:function(t,e,n){this.handler.on(t,e,n)},off:function(t,e){this.handler.off(t,e)},trigger:function(t,e){this.handler.trigger(t,e)},clear:function(){this.storage.delRoot(),this.painter.clear()},dispose:function(){this.animation.stop(),this.clear(),this.storage.dispose(),this.painter.dispose(),this.handler.dispose(),this.animation=this.storage=this.painter=this.handler=null,Sn(this.id)}};var Wm=(Object.freeze||Object)({version:"4.0.5",init:wn,dispose:function(t){if(t)t.dispose();else{for(var e in Fm)Fm.hasOwnProperty(e)&&Fm[e].dispose();Fm={}}return this},getInstance:function(t){return Fm[t]},registerPainter:bn}),Hm=d,Gm=w,Zm=y,Um="series\0",Xm=["fontStyle","fontWeight","fontSize","fontFamily","rich","tag","color","textBorderColor","textBorderWidth","width","height","lineHeight","align","verticalAlign","baseline","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","textShadowColor","textShadowBlur","textShadowOffsetX","textShadowOffsetY","backgroundColor","borderColor","borderWidth","borderRadius","padding"],Ym=0,jm=".",qm="___EC__COMPONENT__CONTAINER___",$m=0,Km=function(t){for(var e=0;e<t.length;e++)t[e][1]||(t[e][1]=t[e][0]);return function(e,n,i){for(var r={},o=0;o<t.length;o++){var a=t[o][1];if(!(n&&l(n,a)>=0||i&&l(i,a)<0)){var s=e.getShallow(a);null!=s&&(r[t[o][0]]=s)}}return r}},Qm=Km([["lineWidth","width"],["stroke","color"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]),Jm={getLineStyle:function(t){var e=Qm(this,t),n=this.getLineDash(e.lineWidth);return n&&(e.lineDash=n),e},getLineDash:function(t){null==t&&(t=1);var e=this.get("type"),n=Math.max(t,2),i=4*t;return"solid"===e||null==e?null:"dashed"===e?[i,i]:[n,n]}},tv=Km([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]]),ev={getAreaStyle:function(t,e){return tv(this,t,e)}},nv=Math.pow,iv=Math.sqrt,rv=1e-8,ov=1e-4,av=iv(3),sv=1/3,lv=B(),uv=B(),hv=B(),cv=Math.min,dv=Math.max,fv=Math.sin,pv=Math.cos,gv=2*Math.PI,mv=B(),vv=B(),yv=B(),xv=[],_v=[],wv={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},bv=[],Sv=[],Mv=[],Iv=[],Tv=Math.min,Cv=Math.max,Av=Math.cos,Dv=Math.sin,kv=Math.sqrt,Pv=Math.abs,Lv="undefined"!=typeof Float32Array,Ov=function(t){this._saveData=!t,this._saveData&&(this.data=[]),this._ctx=null};Ov.prototype={constructor:Ov,_xi:0,_yi:0,_x0:0,_y0:0,_ux:0,_uy:0,_len:0,_lineDash:null,_dashOffset:0,_dashIdx:0,_dashSum:0,setScale:function(t,e){this._ux=Pv(1/Ug/t)||0,this._uy=Pv(1/Ug/e)||0},getContext:function(){return this._ctx},beginPath:function(t){return this._ctx=t,t&&t.beginPath(),t&&(this.dpr=t.dpr),this._saveData&&(this._len=0),this._lineDash&&(this._lineDash=null,this._dashOffset=0),this},moveTo:function(t,e){return this.addData(wv.M,t,e),this._ctx&&this._ctx.moveTo(t,e),this._x0=t,this._y0=e,this._xi=t,this._yi=e,this},lineTo:function(t,e){var n=Pv(t-this._xi)>this._ux||Pv(e-this._yi)>this._uy||this._len<5;return this.addData(wv.L,t,e),this._ctx&&n&&(this._needsDash()?this._dashedLineTo(t,e):this._ctx.lineTo(t,e)),n&&(this._xi=t,this._yi=e),this},bezierCurveTo:function(t,e,n,i,r,o){return this.addData(wv.C,t,e,n,i,r,o),this._ctx&&(this._needsDash()?this._dashedBezierTo(t,e,n,i,r,o):this._ctx.bezierCurveTo(t,e,n,i,r,o)),this._xi=r,this._yi=o,this},quadraticCurveTo:function(t,e,n,i){return this.addData(wv.Q,t,e,n,i),this._ctx&&(this._needsDash()?this._dashedQuadraticTo(t,e,n,i):this._ctx.quadraticCurveTo(t,e,n,i)),this._xi=n,this._yi=i,this},arc:function(t,e,n,i,r,o){return this.addData(wv.A,t,e,n,n,i,r-i,0,o?0:1),this._ctx&&this._ctx.arc(t,e,n,i,r,o),this._xi=Av(r)*n+t,this._yi=Dv(r)*n+e,this},arcTo:function(t,e,n,i,r){return this._ctx&&this._ctx.arcTo(t,e,n,i,r),this},rect:function(t,e,n,i){return this._ctx&&this._ctx.rect(t,e,n,i),this.addData(wv.R,t,e,n,i),this},closePath:function(){this.addData(wv.Z);var t=this._ctx,e=this._x0,n=this._y0;return t&&(this._needsDash()&&this._dashedLineTo(e,n),t.closePath()),this._xi=e,this._yi=n,this},fill:function(t){t&&t.fill(),this.toStatic()},stroke:function(t){t&&t.stroke(),this.toStatic()},setLineDash:function(t){if(t instanceof Array){this._lineDash=t,this._dashIdx=0;for(var e=0,n=0;n<t.length;n++)e+=t[n];this._dashSum=e}return this},setLineDashOffset:function(t){return this._dashOffset=t,this},len:function(){return this._len},setData:function(t){var e=t.length;this.data&&this.data.length==e||!Lv||(this.data=new Float32Array(e));for(var n=0;n<e;n++)this.data[n]=t[n];this._len=e},appendPath:function(t){t instanceof Array||(t=[t]);for(var e=t.length,n=0,i=this._len,r=0;r<e;r++)n+=t[r].len();Lv&&this.data instanceof Float32Array&&(this.data=new Float32Array(i+n));for(r=0;r<e;r++)for(var o=t[r].data,a=0;a<o.length;a++)this.data[i++]=o[a];this._len=i},addData:function(t){if(this._saveData){var e=this.data;this._len+arguments.length>e.length&&(this._expandData(),e=this.data);for(var n=0;n<arguments.length;n++)e[this._len++]=arguments[n];this._prevCmd=t}},_expandData:function(){if(!(this.data instanceof Array)){for(var t=[],e=0;e<this._len;e++)t[e]=this.data[e];this.data=t}},_needsDash:function(){return this._lineDash},_dashedLineTo:function(t,e){var n,i,r=this._dashSum,o=this._dashOffset,a=this._lineDash,s=this._ctx,l=this._xi,u=this._yi,h=t-l,c=e-u,d=kv(h*h+c*c),f=l,p=u,g=a.length;for(h/=d,c/=d,o<0&&(o=r+o),f-=(o%=r)*h,p-=o*c;h>0&&f<=t||h<0&&f>=t||0==h&&(c>0&&p<=e||c<0&&p>=e);)f+=h*(n=a[i=this._dashIdx]),p+=c*n,this._dashIdx=(i+1)%g,h>0&&f<l||h<0&&f>l||c>0&&p<u||c<0&&p>u||s[i%2?"moveTo":"lineTo"](h>=0?Tv(f,t):Cv(f,t),c>=0?Tv(p,e):Cv(p,e));h=f-t,c=p-e,this._dashOffset=-kv(h*h+c*c)},_dashedBezierTo:function(t,e,n,i,r,o){var a,s,l,u,h,c=this._dashSum,d=this._dashOffset,f=this._lineDash,p=this._ctx,g=this._xi,m=this._yi,v=jn,y=0,x=this._dashIdx,_=f.length,w=0;for(d<0&&(d=c+d),d%=c,a=0;a<1;a+=.1)s=v(g,t,n,r,a+.1)-v(g,t,n,r,a),l=v(m,e,i,o,a+.1)-v(m,e,i,o,a),y+=kv(s*s+l*l);for(;x<_&&!((w+=f[x])>d);x++);for(a=(w-d)/y;a<=1;)u=v(g,t,n,r,a),h=v(m,e,i,o,a),x%2?p.moveTo(u,h):p.lineTo(u,h),a+=f[x]/y,x=(x+1)%_;x%2!=0&&p.lineTo(r,o),s=r-u,l=o-h,this._dashOffset=-kv(s*s+l*l)},_dashedQuadraticTo:function(t,e,n,i){var r=n,o=i;n=(n+2*t)/3,i=(i+2*e)/3,t=(this._xi+2*t)/3,e=(this._yi+2*e)/3,this._dashedBezierTo(t,e,n,i,r,o)},toStatic:function(){var t=this.data;t instanceof Array&&(t.length=this._len,Lv&&(this.data=new Float32Array(t)))},getBoundingRect:function(){bv[0]=bv[1]=Mv[0]=Mv[1]=Number.MAX_VALUE,Sv[0]=Sv[1]=Iv[0]=Iv[1]=-Number.MAX_VALUE;for(var t=this.data,e=0,n=0,i=0,r=0,o=0;o<t.length;){var a=t[o++];switch(1==o&&(i=e=t[o],r=n=t[o+1]),a){case wv.M:e=i=t[o++],n=r=t[o++],Mv[0]=i,Mv[1]=r,Iv[0]=i,Iv[1]=r;break;case wv.L:si(e,n,t[o],t[o+1],Mv,Iv),e=t[o++],n=t[o++];break;case wv.C:li(e,n,t[o++],t[o++],t[o++],t[o++],t[o],t[o+1],Mv,Iv),e=t[o++],n=t[o++];break;case wv.Q:ui(e,n,t[o++],t[o++],t[o],t[o+1],Mv,Iv),e=t[o++],n=t[o++];break;case wv.A:var s=t[o++],l=t[o++],u=t[o++],h=t[o++],c=t[o++],d=t[o++]+c,f=(t[o++],1-t[o++]);1==o&&(i=Av(c)*u+s,r=Dv(c)*h+l),hi(s,l,u,h,c,d,f,Mv,Iv),e=Av(d)*u+s,n=Dv(d)*h+l;break;case wv.R:si(i=e=t[o++],r=n=t[o++],i+t[o++],r+t[o++],Mv,Iv);break;case wv.Z:e=i,n=r}K(bv,bv,Mv),Q(Sv,Sv,Iv)}return 0===o&&(bv[0]=bv[1]=Sv[0]=Sv[1]=0),new re(bv[0],bv[1],Sv[0]-bv[0],Sv[1]-bv[1])},rebuildPath:function(t){for(var e,n,i,r,o,a,s=this.data,l=this._ux,u=this._uy,h=this._len,c=0;c<h;){var d=s[c++];switch(1==c&&(e=i=s[c],n=r=s[c+1]),d){case wv.M:e=i=s[c++],n=r=s[c++],t.moveTo(i,r);break;case wv.L:o=s[c++],a=s[c++],(Pv(o-i)>l||Pv(a-r)>u||c===h-1)&&(t.lineTo(o,a),i=o,r=a);break;case wv.C:t.bezierCurveTo(s[c++],s[c++],s[c++],s[c++],s[c++],s[c++]),i=s[c-2],r=s[c-1];break;case wv.Q:t.quadraticCurveTo(s[c++],s[c++],s[c++],s[c++]),i=s[c-2],r=s[c-1];break;case wv.A:var f=s[c++],p=s[c++],g=s[c++],m=s[c++],v=s[c++],y=s[c++],x=s[c++],_=s[c++],w=g>m?g:m,b=g>m?1:g/m,S=g>m?m/g:1,M=v+y;Math.abs(g-m)>.001?(t.translate(f,p),t.rotate(x),t.scale(b,S),t.arc(0,0,w,v,M,1-_),t.scale(1/b,1/S),t.rotate(-x),t.translate(-f,-p)):t.arc(f,p,w,v,M,1-_),1==c&&(e=Av(v)*g+f,n=Dv(v)*m+p),i=Av(M)*g+f,r=Dv(M)*m+p;break;case wv.R:e=i=s[c],n=r=s[c+1],t.rect(s[c++],s[c++],s[c++],s[c++]);break;case wv.Z:t.closePath(),i=e,r=n}}}},Ov.CMD=wv;var zv=2*Math.PI,Ev=2*Math.PI,Nv=Ov.CMD,Rv=2*Math.PI,Bv=1e-4,Fv=[-1,-1,-1],Vv=[-1,-1],Wv=hm.prototype.getCanvasPattern,Hv=Math.abs,Gv=new Ov(!0);Ii.prototype={constructor:Ii,type:"path",__dirtyPath:!0,strokeContainThreshold:5,brush:function(t,e){var n=this.style,i=this.path||Gv,r=n.hasStroke(),o=n.hasFill(),a=n.fill,s=n.stroke,l=o&&!!a.colorStops,u=r&&!!s.colorStops,h=o&&!!a.image,c=r&&!!s.image;if(n.bind(t,this,e),this.setTransform(t),this.__dirty){var d;l&&(d=d||this.getBoundingRect(),this._fillGradient=n.getGradient(t,a,d)),u&&(d=d||this.getBoundingRect(),this._strokeGradient=n.getGradient(t,s,d))}l?t.fillStyle=this._fillGradient:h&&(t.fillStyle=Wv.call(a,t)),u?t.strokeStyle=this._strokeGradient:c&&(t.strokeStyle=Wv.call(s,t));var f=n.lineDash,p=n.lineDashOffset,g=!!t.setLineDash,m=this.getGlobalScale();if(i.setScale(m[0],m[1]),this.__dirtyPath||f&&!g&&r?(i.beginPath(t),f&&!g&&(i.setLineDash(f),i.setLineDashOffset(p)),this.buildPath(i,this.shape,!1),this.path&&(this.__dirtyPath=!1)):(t.beginPath(),this.path.rebuildPath(t)),o)if(null!=n.fillOpacity){v=t.globalAlpha;t.globalAlpha=n.fillOpacity*n.opacity,i.fill(t),t.globalAlpha=v}else i.fill(t);if(f&&g&&(t.setLineDash(f),t.lineDashOffset=p),r)if(null!=n.strokeOpacity){var v=t.globalAlpha;t.globalAlpha=n.strokeOpacity*n.opacity,i.stroke(t),t.globalAlpha=v}else i.stroke(t);f&&g&&t.setLineDash([]),null!=n.text&&(this.restoreTransform(t),this.drawRectText(t,this.getBoundingRect()))},buildPath:function(t,e,n){},createPathProxy:function(){this.path=new Ov},getBoundingRect:function(){var t=this._rect,e=this.style,n=!t;if(n){var i=this.path;i||(i=this.path=new Ov),this.__dirtyPath&&(i.beginPath(),this.buildPath(i,this.shape,!1)),t=i.getBoundingRect()}if(this._rect=t,e.hasStroke()){var r=this._rectWithStroke||(this._rectWithStroke=t.clone());if(this.__dirty||n){r.copy(t);var o=e.lineWidth,a=e.strokeNoScale?this.getLineScale():1;e.hasFill()||(o=Math.max(o,this.strokeContainThreshold||4)),a>1e-10&&(r.width+=o/a,r.height+=o/a,r.x-=o/a/2,r.y-=o/a/2)}return r}return t},contain:function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect(),r=this.style;if(t=n[0],e=n[1],i.contain(t,e)){var o=this.path.data;if(r.hasStroke()){var a=r.lineWidth,s=r.strokeNoScale?this.getLineScale():1;if(s>1e-10&&(r.hasFill()||(a=Math.max(a,this.strokeContainThreshold)),Mi(o,a/s,t,e)))return!0}if(r.hasFill())return Si(o,t,e)}return!1},dirty:function(t){null==t&&(t=!0),t&&(this.__dirtyPath=t,this._rect=null),this.__dirty=this.__dirtyText=!0,this.__zr&&this.__zr.refresh(),this.__clipTarget&&this.__clipTarget.dirty()},animateShape:function(t){return this.animate("shape",t)},attrKV:function(t,e){"shape"===t?(this.setShape(e),this.__dirtyPath=!0,this._rect=null):on.prototype.attrKV.call(this,t,e)},setShape:function(t,e){var n=this.shape;if(n){if(w(t))for(var i in t)t.hasOwnProperty(i)&&(n[i]=t[i]);else n[t]=e;this.dirty(!0)}return this},getLineScale:function(){var t=this.transform;return t&&Hv(t[0]-1)>1e-10&&Hv(t[3]-1)>1e-10?Math.sqrt(Hv(t[0]*t[3]-t[2]*t[1])):1}},Ii.extend=function(t){var e=function(e){Ii.call(this,e),t.style&&this.style.extendFrom(t.style,!1);var n=t.shape;if(n){this.shape=this.shape||{};var i=this.shape;for(var r in n)!i.hasOwnProperty(r)&&n.hasOwnProperty(r)&&(i[r]=n[r])}t.init&&t.init.call(this,e)};u(e,Ii);for(var n in t)"style"!==n&&"shape"!==n&&(e.prototype[n]=t[n]);return e},u(Ii,on);var Zv=Ov.CMD,Uv=[[],[],[]],Xv=Math.sqrt,Yv=Math.atan2,jv=function(t,e){var n,i,r,o,a,s,l=t.data,u=Zv.M,h=Zv.C,c=Zv.L,d=Zv.R,f=Zv.A,p=Zv.Q;for(r=0,o=0;r<l.length;){switch(n=l[r++],o=r,i=0,n){case u:case c:i=1;break;case h:i=3;break;case p:i=2;break;case f:var g=e[4],m=e[5],v=Xv(e[0]*e[0]+e[1]*e[1]),y=Xv(e[2]*e[2]+e[3]*e[3]),x=Yv(-e[1]/y,e[0]/v);l[r]*=v,l[r++]+=g,l[r]*=y,l[r++]+=m,l[r++]*=v,l[r++]*=y,l[r++]+=x,l[r++]+=x,o=r+=2;break;case d:s[0]=l[r++],s[1]=l[r++],$(s,s,e),l[o++]=s[0],l[o++]=s[1],s[0]+=l[r++],s[1]+=l[r++],$(s,s,e),l[o++]=s[0],l[o++]=s[1]}for(a=0;a<i;a++)(s=Uv[a])[0]=l[r++],s[1]=l[r++],$(s,s,e),l[o++]=s[0],l[o++]=s[1]}},qv=Math.sqrt,$v=Math.sin,Kv=Math.cos,Qv=Math.PI,Jv=function(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])},ty=function(t,e){return(t[0]*e[0]+t[1]*e[1])/(Jv(t)*Jv(e))},ey=function(t,e){return(t[0]*e[1]<t[1]*e[0]?-1:1)*Math.acos(ty(t,e))},ny=/([mlvhzcqtsa])([^mlvhzcqtsa]*)/gi,iy=/-?([0-9]*\.)?[0-9]+([eE]-?[0-9]+)?/g,ry=function(t){on.call(this,t)};ry.prototype={constructor:ry,type:"text",brush:function(t,e){var n=this.style;this.__dirty&&Ve(n),n.fill=n.stroke=n.shadowBlur=n.shadowColor=n.shadowOffsetX=n.shadowOffsetY=null;var i=n.text;null!=i&&(i+=""),rn(i,n)&&(this.setTransform(t),He(this,t,i,n,null,e),this.restoreTransform(t))},getBoundingRect:function(){var t=this.style;if(this.__dirty&&Ve(t),!this._rect){var e=t.text;null!=e?e+="":e="";var n=Se(t.text+"",t.font,t.textAlign,t.textVerticalAlign,t.textPadding,t.rich);if(n.x+=t.x||0,n.y+=t.y||0,Je(t.textStroke,t.textStrokeWidth)){var i=t.textStrokeWidth;n.x-=i/2,n.y-=i/2,n.width+=i,n.height+=i}this._rect=n}return this._rect}},u(ry,on);var oy=Ii.extend({type:"circle",shape:{cx:0,cy:0,r:0},buildPath:function(t,e,n){n&&t.moveTo(e.cx+e.r,e.cy),t.arc(e.cx,e.cy,e.r,0,2*Math.PI,!0)}}),ay=[["shadowBlur",0],["shadowColor","#000"],["shadowOffsetX",0],["shadowOffsetY",0]],sy=function(t){return Xp.browser.ie&&Xp.browser.version>=11?function(){var e,n=this.__clipPaths,i=this.style;if(n)for(var r=0;r<n.length;r++){var o=n[r],a=o&&o.shape,s=o&&o.type;if(a&&("sector"===s&&a.startAngle===a.endAngle||"rect"===s&&(!a.width||!a.height))){for(l=0;l<ay.length;l++)ay[l][2]=i[ay[l][0]],i[ay[l][0]]=ay[l][1];e=!0;break}}if(t.apply(this,arguments),e)for(var l=0;l<ay.length;l++)i[ay[l][0]]=ay[l][2]}:t},ly=Ii.extend({type:"sector",shape:{cx:0,cy:0,r0:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},brush:sy(Ii.prototype.brush),buildPath:function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r0||0,0),o=Math.max(e.r,0),a=e.startAngle,s=e.endAngle,l=e.clockwise,u=Math.cos(a),h=Math.sin(a);t.moveTo(u*r+n,h*r+i),t.lineTo(u*o+n,h*o+i),t.arc(n,i,o,a,s,!l),t.lineTo(Math.cos(s)*r+n,Math.sin(s)*r+i),0!==r&&t.arc(n,i,r,s,a,l),t.closePath()}}),uy=Ii.extend({type:"ring",shape:{cx:0,cy:0,r:0,r0:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=2*Math.PI;t.moveTo(n+e.r,i),t.arc(n,i,e.r,0,r,!1),t.moveTo(n+e.r0,i),t.arc(n,i,e.r0,0,r,!0)}}),hy=function(t,e){for(var n=t.length,i=[],r=0,o=1;o<n;o++)r+=j(t[o-1],t[o]);var a=r/2;a=a<n?n:a;for(o=0;o<a;o++){var s,l,u,h=o/(a-1)*(e?n:n-1),c=Math.floor(h),d=h-c,f=t[c%n];e?(s=t[(c-1+n)%n],l=t[(c+1)%n],u=t[(c+2)%n]):(s=t[0===c?c:c-1],l=t[c>n-2?n-1:c+1],u=t[c>n-3?n-1:c+2]);var p=d*d,g=d*p;i.push([Pi(s[0],f[0],l[0],u[0],d,p,g),Pi(s[1],f[1],l[1],u[1],d,p,g)])}return i},cy=function(t,e,n,i){var r,o,a,s,l=[],u=[],h=[],c=[];if(i){a=[1/0,1/0],s=[-1/0,-1/0];for(var d=0,f=t.length;d<f;d++)K(a,a,t[d]),Q(s,s,t[d]);K(a,a,i[0]),Q(s,s,i[1])}for(var d=0,f=t.length;d<f;d++){var p=t[d];if(n)r=t[d?d-1:f-1],o=t[(d+1)%f];else{if(0===d||d===f-1){l.push(V(t[d]));continue}r=t[d-1],o=t[d+1]}G(u,o,r),X(u,u,e);var g=j(p,r),m=j(p,o),v=g+m;0!==v&&(g/=v,m/=v),X(h,u,-g),X(c,u,m);var y=W([],p,h),x=W([],p,c);i&&(Q(y,y,a),K(y,y,s),Q(x,x,a),K(x,x,s)),l.push(y),l.push(x)}return n&&l.push(l.shift()),l},dy=Ii.extend({type:"polygon",shape:{points:null,smooth:!1,smoothConstraint:null},buildPath:function(t,e){Li(t,e,!0)}}),fy=Ii.extend({type:"polyline",shape:{points:null,smooth:!1,smoothConstraint:null},style:{stroke:"#000",fill:null},buildPath:function(t,e){Li(t,e,!1)}}),py=Ii.extend({type:"rect",shape:{r:0,x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.x,i=e.y,r=e.width,o=e.height;e.r?Fe(t,e):t.rect(n,i,r,o),t.closePath()}}),gy=Ii.extend({type:"line",shape:{x1:0,y1:0,x2:0,y2:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n=e.x1,i=e.y1,r=e.x2,o=e.y2,a=e.percent;0!==a&&(t.moveTo(n,i),a<1&&(r=n*(1-a)+r*a,o=i*(1-a)+o*a),t.lineTo(r,o))},pointAt:function(t){var e=this.shape;return[e.x1*(1-t)+e.x2*t,e.y1*(1-t)+e.y2*t]}}),my=[],vy=Ii.extend({type:"bezier-curve",shape:{x1:0,y1:0,x2:0,y2:0,cpx1:0,cpy1:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n=e.x1,i=e.y1,r=e.x2,o=e.y2,a=e.cpx1,s=e.cpy1,l=e.cpx2,u=e.cpy2,h=e.percent;0!==h&&(t.moveTo(n,i),null==l||null==u?(h<1&&(ri(n,a,r,h,my),a=my[1],r=my[2],ri(i,s,o,h,my),s=my[1],o=my[2]),t.quadraticCurveTo(a,s,r,o)):(h<1&&(Qn(n,a,l,r,h,my),a=my[1],l=my[2],r=my[3],Qn(i,s,u,o,h,my),s=my[1],u=my[2],o=my[3]),t.bezierCurveTo(a,s,l,u,r,o)))},pointAt:function(t){return Oi(this.shape,t,!1)},tangentAt:function(t){var e=Oi(this.shape,t,!0);return Y(e,e)}}),yy=Ii.extend({type:"arc",shape:{cx:0,cy:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},style:{stroke:"#000",fill:null},buildPath:function(t,e){var n=e.cx,i=e.cy,r=Math.max(e.r,0),o=e.startAngle,a=e.endAngle,s=e.clockwise,l=Math.cos(o),u=Math.sin(o);t.moveTo(l*r+n,u*r+i),t.arc(n,i,r,o,a,!s)}}),xy=Ii.extend({type:"compound",shape:{paths:null},_updatePathDirty:function(){for(var t=this.__dirtyPath,e=this.shape.paths,n=0;n<e.length;n++)t=t||e[n].__dirtyPath;this.__dirtyPath=t,this.__dirty=this.__dirty||t},beforeBrush:function(){this._updatePathDirty();for(var t=this.shape.paths||[],e=this.getGlobalScale(),n=0;n<t.length;n++)t[n].path||t[n].createPathProxy(),t[n].path.setScale(e[0],e[1])},buildPath:function(t,e){for(var n=e.paths||[],i=0;i<n.length;i++)n[i].buildPath(t,n[i].shape,!0)},afterBrush:function(){for(var t=this.shape.paths||[],e=0;e<t.length;e++)t[e].__dirtyPath=!1},getBoundingRect:function(){return this._updatePathDirty(),Ii.prototype.getBoundingRect.call(this)}}),_y=function(t){this.colorStops=t||[]};_y.prototype={constructor:_y,addColorStop:function(t,e){this.colorStops.push({offset:t,color:e})}};var wy=function(t,e,n,i,r,o){this.x=null==t?0:t,this.y=null==e?0:e,this.x2=null==n?1:n,this.y2=null==i?0:i,this.type="linear",this.global=o||!1,_y.call(this,r)};wy.prototype={constructor:wy},u(wy,_y);var by=function(t,e,n,i,r){this.x=null==t?.5:t,this.y=null==e?.5:e,this.r=null==n?.5:n,this.type="radial",this.global=r||!1,_y.call(this,i)};by.prototype={constructor:by},u(by,_y),zi.prototype.incremental=!0,zi.prototype.clearDisplaybles=function(){this._displayables=[],this._temporaryDisplayables=[],this._cursor=0,this.dirty(),this.notClear=!1},zi.prototype.addDisplayable=function(t,e){e?this._temporaryDisplayables.push(t):this._displayables.push(t),this.dirty()},zi.prototype.addDisplayables=function(t,e){e=e||!1;for(var n=0;n<t.length;n++)this.addDisplayable(t[n],e)},zi.prototype.eachPendingDisplayable=function(t){for(e=this._cursor;e<this._displayables.length;e++)t&&t(this._displayables[e]);for(var e=0;e<this._temporaryDisplayables.length;e++)t&&t(this._temporaryDisplayables[e])},zi.prototype.update=function(){this.updateTransform();for(t=this._cursor;t<this._displayables.length;t++)(e=this._displayables[t]).parent=this,e.update(),e.parent=null;for(var t=0;t<this._temporaryDisplayables.length;t++){var e=this._temporaryDisplayables[t];e.parent=this,e.update(),e.parent=null}},zi.prototype.brush=function(t,e){for(n=this._cursor;n<this._displayables.length;n++)(i=this._displayables[n]).beforeBrush&&i.beforeBrush(t),i.brush(t,n===this._cursor?null:this._displayables[n-1]),i.afterBrush&&i.afterBrush(t);this._cursor=n;for(var n=0;n<this._temporaryDisplayables.length;n++){var i=this._temporaryDisplayables[n];i.beforeBrush&&i.beforeBrush(t),i.brush(t,0===n?null:this._temporaryDisplayables[n-1]),i.afterBrush&&i.afterBrush(t)}this._temporaryDisplayables=[],this.notClear=!0};var Sy=[];zi.prototype.getBoundingRect=function(){if(!this._rect){for(var t=new re(1/0,1/0,-1/0,-1/0),e=0;e<this._displayables.length;e++){var n=this._displayables[e],i=n.getBoundingRect().clone();n.needLocalTransform()&&i.applyTransform(n.getLocalTransform(Sy)),t.union(i)}this._rect=t}return this._rect},zi.prototype.contain=function(t,e){var n=this.transformCoordToLocal(t,e);if(this.getBoundingRect().contain(n[0],n[1]))for(var i=0;i<this._displayables.length;i++)if(this._displayables[i].contain(t,e))return!0;return!1},u(zi,on);var My=Math.round,Iy=Math.max,Ty=Math.min,Cy={},Ay=N(),Dy=0,ky=(Object.freeze||Object)({extendShape:Ei,extendPath:function(t,e){return ki(t,e)},makePath:Ni,makeImage:Ri,mergePath:function(t,e){for(var n=[],i=t.length,r=0;r<i;r++){var o=t[r];o.path||o.createPathProxy(),o.__dirtyPath&&o.buildPath(o.path,o.shape,!0),n.push(o.path)}var a=new Ii(e);return a.createPathProxy(),a.buildPath=function(t){t.appendPath(n);var e=t.getContext();e&&t.rebuildPath(e)},a},resizePath:Fi,subPixelOptimizeLine:Vi,subPixelOptimizeRect:Wi,subPixelOptimize:Hi,setElementHoverStyle:Ki,isInEmphasis:Qi,setHoverStyle:ir,setAsHoverStyleTrigger:rr,setLabelStyle:or,setTextStyle:ar,setText:function(t,e,n){var i,r={isRectText:!0};!1===n?i=!0:r.autoColor=n,sr(t,e,r,i)},getFont:fr,updateProps:gr,initProps:mr,getTransform:vr,applyTransform:yr,transformDirection:xr,groupTransition:_r,clipPointsByRect:wr,clipRectByRect:function(t,e){var n=Iy(t.x,e.x),i=Ty(t.x+t.width,e.x+e.width),r=Iy(t.y,e.y),o=Ty(t.y+t.height,e.y+e.height);if(i>=n&&o>=r)return{x:n,y:r,width:i-n,height:o-r}},createIcon:br,Group:Jg,Image:an,Text:ry,Circle:oy,Sector:ly,Ring:uy,Polygon:dy,Polyline:fy,Rect:py,Line:gy,BezierCurve:vy,Arc:yy,IncrementalDisplayable:zi,CompoundPath:xy,LinearGradient:wy,RadialGradient:by,BoundingRect:re}),Py=["textStyle","color"],Ly={getTextColor:function(t){var e=this.ecModel;return this.getShallow("color")||(!t&&e?e.get(Py):null)},getFont:function(){return fr({fontStyle:this.getShallow("fontStyle"),fontWeight:this.getShallow("fontWeight"),fontSize:this.getShallow("fontSize"),fontFamily:this.getShallow("fontFamily")},this.ecModel)},getTextRect:function(t){return Se(t,this.getFont(),this.getShallow("align"),this.getShallow("verticalAlign")||this.getShallow("baseline"),this.getShallow("padding"),this.getShallow("rich"),this.getShallow("truncateText"))}},Oy=Km([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"],["textPosition"],["textAlign"]]),zy={getItemStyle:function(t,e){var n=Oy(this,t,e),i=this.getBorderLineDash();return i&&(n.lineDash=i),n},getBorderLineDash:function(){var t=this.get("borderType");return"solid"===t||null==t?null:"dashed"===t?[5,5]:[1,1]}},Ey=h,Ny=On();Sr.prototype={constructor:Sr,init:null,mergeOption:function(t){i(this.option,t,!0)},get:function(t,e){return null==t?this.option:Mr(this.option,this.parsePath(t),!e&&Ir(this,t))},getShallow:function(t,e){var n=this.option,i=null==n?n:n[t],r=!e&&Ir(this,t);return null==i&&r&&(i=r.getShallow(t)),i},getModel:function(t,e){var n,i=null==t?this.option:Mr(this.option,t=this.parsePath(t));return e=e||(n=Ir(this,t))&&n.getModel(t),new Sr(i,e,this.ecModel)},isEmpty:function(){return null==this.option},restoreData:function(){},clone:function(){return new(0,this.constructor)(n(this.option))},setReadOnly:function(t){},parsePath:function(t){return"string"==typeof t&&(t=t.split(".")),t},customizeGetParent:function(t){Ny(this).getParent=t},isAnimationEnabled:function(){if(!Xp.node){if(null!=this.option.animation)return!!this.option.animation;if(this.parentModel)return this.parentModel.isAnimationEnabled()}}},Wn(Sr),Hn(Sr),Ey(Sr,Jm),Ey(Sr,ev),Ey(Sr,Ly),Ey(Sr,zy);var Ry=0,By=1e-4,Fy=/^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d\d)(?::(\d\d)(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/,Vy=(Object.freeze||Object)({linearMap:Ar,parsePercent:Dr,round:kr,asc:Pr,getPrecision:Lr,getPrecisionSafe:Or,getPixelPrecision:zr,getPercentWithPrecision:Er,MAX_SAFE_INTEGER:9007199254740991,remRadian:Nr,isRadianAroundZero:Rr,parseDate:Br,quantity:Fr,nice:Wr,quantile:function(t,e){var n=(t.length-1)*e+1,i=Math.floor(n),r=+t[i-1],o=n-i;return o?r+o*(t[i]-r):r},reformIntervals:function(t){function e(t,n,i){return t.interval[i]<n.interval[i]||t.interval[i]===n.interval[i]&&(t.close[i]-n.close[i]==(i?-1:1)||!i&&e(t,n,1))}t.sort(function(t,n){return e(t,n,0)?-1:1});for(var n=-1/0,i=1,r=0;r<t.length;){for(var o=t[r].interval,a=t[r].close,s=0;s<2;s++)o[s]<=n&&(o[s]=n,a[s]=s?1:1-i),n=o[s],i=a[s];o[0]===o[1]&&a[0]*a[1]!=1?t.splice(r,1):r++}return t},isNumeric:function(t){return t-parseFloat(t)>=0}}),Wy=k,Hy=/([&<>"'])/g,Gy={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},Zy=["a","b","c","d","e","f","g"],Uy=function(t,e){return"{"+t+(null==e?"":e)+"}"},Xy=De,Yy=Se,jy=(Object.freeze||Object)({addCommas:Hr,toCamelCase:Gr,normalizeCssArray:Wy,encodeHTML:Zr,formatTpl:Ur,formatTplSimple:function(t,e,n){return d(e,function(e,i){t=t.replace("{"+i+"}",n?Zr(e):e)}),t},getTooltipMarker:Xr,formatTime:jr,capitalFirst:qr,truncateText:Xy,getTextRect:Yy}),qy=d,$y=["left","right","top","bottom","width","height"],Ky=[["width","left","right"],["height","top","bottom"]],Qy=$r,Jy=(v($r,"vertical"),v($r,"horizontal"),{getBoxLayoutParams:function(){return{left:this.get("left"),top:this.get("top"),right:this.get("right"),bottom:this.get("bottom"),width:this.get("width"),height:this.get("height")}}}),tx=On(),ex=Sr.extend({type:"component",id:"",name:"",mainType:"",subType:"",componentIndex:0,defaultOption:null,ecModel:null,dependentModels:[],uid:null,layoutMode:null,$constructor:function(t,e,n,i){Sr.call(this,t,e,n,i),this.uid=Tr("ec_cpt_model")},init:function(t,e,n,i){this.mergeDefaultAndTheme(t,n)},mergeDefaultAndTheme:function(t,e){var n=this.layoutMode,r=n?to(t):{};i(t,e.getTheme().get(this.mainType)),i(t,this.getDefaultOption()),n&&Jr(t,r,n)},mergeOption:function(t,e){i(this.option,t,!0);var n=this.layoutMode;n&&Jr(this.option,t,n)},optionUpdated:function(t,e){},getDefaultOption:function(){var t=tx(this);if(!t.defaultOption){for(var e=[],n=this.constructor;n;){var r=n.prototype.defaultOption;r&&e.push(r),n=n.superClass}for(var o={},a=e.length-1;a>=0;a--)o=i(o,e[a],!0);t.defaultOption=o}return t.defaultOption},getReferringComponents:function(t){return this.ecModel.queryComponents({mainType:t,index:this.get(t+"Index",!0),id:this.get(t+"Id",!0)})}});Un(ex,{registerWhenExtend:!0}),function(t){var e={};t.registerSubTypeDefaulter=function(t,n){t=Fn(t),e[t.main]=n},t.determineSubType=function(n,i){var r=i.type;if(!r){var o=Fn(n).main;t.hasSubTypes(n)&&e[o]&&(r=e[o](i))}return r}}(ex),function(t,e){function n(t){var n={},o=[];return d(t,function(a){var s=i(n,a),u=r(s.originalDeps=e(a),t);s.entryCount=u.length,0===s.entryCount&&o.push(a),d(u,function(t){l(s.predecessor,t)<0&&s.predecessor.push(t);var e=i(n,t);l(e.successor,t)<0&&e.successor.push(a)})}),{graph:n,noEntryList:o}}function i(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}function r(t,e){var n=[];return d(t,function(t){l(e,t)>=0&&n.push(t)}),n}t.topologicalTravel=function(t,e,i,r){function o(t){s[t].entryCount--,0===s[t].entryCount&&l.push(t)}if(t.length){var a=n(e),s=a.graph,l=a.noEntryList,u={};for(d(t,function(t){u[t]=!0});l.length;){var h=l.pop(),c=s[h],f=!!u[h];f&&(i.call(r,h,c.originalDeps.slice()),delete u[h]),d(c.successor,f?function(t){u[t]=!0,o(t)}:o)}d(u,function(){throw new Error("Circle dependency may exists")})}}}(ex,function(t){var e=[];return d(ex.getClassesByMainType(t),function(t){e=e.concat(t.prototype.dependencies||[])}),e=f(e,function(t){return Fn(t).main}),"dataset"!==t&&l(e,"dataset")<=0&&e.unshift("dataset"),e}),h(ex,Jy);var nx="";"undefined"!=typeof navigator&&(nx=navigator.platform||"");var ix={color:["#c23531","#2f4554","#61a0a8","#d48265","#91c7ae","#749f83","#ca8622","#bda29a","#6e7074","#546570","#c4ccd3"],gradientColor:["#f6efa6","#d88273","#bf444c"],textStyle:{fontFamily:nx.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},blendMode:null,animation:"auto",animationDuration:1e3,animationDurationUpdate:300,animationEasing:"exponentialOut",animationEasingUpdate:"cubicOut",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3,useUTC:!1},rx=On(),ox={clearColorPalette:function(){rx(this).colorIdx=0,rx(this).colorNameMap={}},getColorFromPalette:function(t,e,n){var i=rx(e=e||this),r=i.colorIdx||0,o=i.colorNameMap=i.colorNameMap||{};if(o.hasOwnProperty(t))return o[t];var a=Mn(this.get("color",!0)),s=this.get("colorLayer",!0),l=null!=n&&s?no(s,n):a;if((l=l||a)&&l.length){var u=l[r];return t&&(o[t]=u),i.colorIdx=(r+1)%l.length,u}}},ax={cartesian2d:function(t,e,n,i){var r=t.getReferringComponents("xAxis")[0],o=t.getReferringComponents("yAxis")[0];e.coordSysDims=["x","y"],n.set("x",r),n.set("y",o),ro(r)&&(i.set("x",r),e.firstCategoryDimIndex=0),ro(o)&&(i.set("y",o),e.firstCategoryDimIndex=1)},singleAxis:function(t,e,n,i){var r=t.getReferringComponents("singleAxis")[0];e.coordSysDims=["single"],n.set("single",r),ro(r)&&(i.set("single",r),e.firstCategoryDimIndex=0)},polar:function(t,e,n,i){var r=t.getReferringComponents("polar")[0],o=r.findAxisModel("radiusAxis"),a=r.findAxisModel("angleAxis");e.coordSysDims=["radius","angle"],n.set("radius",o),n.set("angle",a),ro(o)&&(i.set("radius",o),e.firstCategoryDimIndex=0),ro(a)&&(i.set("angle",a),e.firstCategoryDimIndex=1)},geo:function(t,e,n,i){e.coordSysDims=["lng","lat"]},parallel:function(t,e,n,i){var r=t.ecModel,o=r.getComponent("parallel",t.get("parallelIndex")),a=e.coordSysDims=o.dimensions.slice();d(o.parallelAxisIndex,function(t,o){var s=r.getComponent("parallelAxis",t),l=a[o];n.set(l,s),ro(s)&&null==e.firstCategoryDimIndex&&(i.set(l,s),e.firstCategoryDimIndex=o)})}},sx="original",lx="arrayRows",ux="objectRows",hx="keyedColumns",cx="unknown",dx="typedArray",fx="column",px="row";oo.seriesDataToSource=function(t){return new oo({data:t,sourceFormat:S(t)?dx:sx,fromDataset:!1})},Hn(oo);var gx=On(),mx="\0_ec_inner",vx=Sr.extend({init:function(t,e,n,i){n=n||{},this.option=null,this._theme=new Sr(n),this._optionManager=i},setOption:function(t,e){P(!(mx in t),"please use chart.getOption()"),this._optionManager.setOption(t,e),this.resetOption(null)},resetOption:function(t){var e=!1,n=this._optionManager;if(!t||"recreate"===t){var i=n.mountOption("recreate"===t);this.option&&"recreate"!==t?(this.restoreData(),this.mergeOption(i)):wo.call(this,i),e=!0}if("timeline"!==t&&"media"!==t||this.restoreData(),!t||"recreate"===t||"timeline"===t){var r=n.getTimelineOption(this);r&&(this.mergeOption(r),e=!0)}if(!t||"recreate"===t||"media"===t){var o=n.getMediaOption(this,this._api);o.length&&d(o,function(t){this.mergeOption(t,e=!0)},this)}return e},mergeOption:function(t){var e=this.option,r=this._componentsMap,a=[];lo(this),d(t,function(t,r){null!=t&&(ex.hasClass(r)?r&&a.push(r):e[r]=null==e[r]?n(t):i(e[r],t,!0))}),ex.topologicalTravel(a,ex.getAllClassMainTypes(),function(n,i){var a=Mn(t[n]),s=An(r.get(n),a);Dn(s),d(s,function(t,e){var i=t.option;w(i)&&(t.keyInfo.mainType=n,t.keyInfo.subType=So(n,i,t.exist))});var l=bo(r,i);e[n]=[],r.set(n,[]),d(s,function(t,i){var a=t.exist,s=t.option;if(P(w(s)||a,"Empty component definition"),s){var u=ex.getClass(n,t.keyInfo.subType,!0);if(a&&a instanceof u)a.name=t.keyInfo.name,a.mergeOption(s,this),a.optionUpdated(s,!1);else{var h=o({dependentModels:l,componentIndex:i},t.keyInfo);o(a=new u(s,this,this,h),h),a.init(s,this,this,h),a.optionUpdated(null,!0)}}else a.mergeOption({},this),a.optionUpdated({},!1);r.get(n)[i]=a,e[n][i]=a.option},this),"series"===n&&Mo(this,r.get("series"))},this),this._seriesIndicesMap=N(this._seriesIndices=this._seriesIndices||[])},getOption:function(){var t=n(this.option);return d(t,function(e,n){if(ex.hasClass(n)){for(var i=(e=Mn(e)).length-1;i>=0;i--)Pn(e[i])&&e.splice(i,1);t[n]=e}}),delete t[mx],t},getTheme:function(){return this._theme},getComponent:function(t,e){var n=this._componentsMap.get(t);if(n)return n[e||0]},queryComponents:function(t){var e=t.mainType;if(!e)return[];var n=t.index,i=t.id,r=t.name,o=this._componentsMap.get(e);if(!o||!o.length)return[];var a;if(null!=n)y(n)||(n=[n]),a=g(f(n,function(t){return o[t]}),function(t){return!!t});else if(null!=i){var s=y(i);a=g(o,function(t){return s&&l(i,t.id)>=0||!s&&t.id===i})}else if(null!=r){var u=y(r);a=g(o,function(t){return u&&l(r,t.name)>=0||!u&&t.name===r})}else a=o.slice();return Io(a,t)},findComponents:function(t){var e=t.query,n=t.mainType,i=function(t){var e=n+"Index",i=n+"Id",r=n+"Name";return!t||null==t[e]&&null==t[i]&&null==t[r]?null:{mainType:n,index:t[e],id:t[i],name:t[r]}}(e);return function(e){return t.filter?g(e,t.filter):e}(Io(i?this.queryComponents(i):this._componentsMap.get(n),t))},eachComponent:function(t,e,n){var i=this._componentsMap;"function"==typeof t?(n=e,e=t,i.each(function(t,i){d(t,function(t,r){e.call(n,i,t,r)})})):_(t)?d(i.get(t),e,n):w(t)&&d(this.findComponents(t),e,n)},getSeriesByName:function(t){return g(this._componentsMap.get("series"),function(e){return e.name===t})},getSeriesByIndex:function(t){return this._componentsMap.get("series")[t]},getSeriesByType:function(t){return g(this._componentsMap.get("series"),function(e){return e.subType===t})},getSeries:function(){return this._componentsMap.get("series").slice()},getSeriesCount:function(){return this._componentsMap.get("series").length},eachSeries:function(t,e){d(this._seriesIndices,function(n){var i=this._componentsMap.get("series")[n];t.call(e,i,n)},this)},eachRawSeries:function(t,e){d(this._componentsMap.get("series"),t,e)},eachSeriesByType:function(t,e,n){d(this._seriesIndices,function(i){var r=this._componentsMap.get("series")[i];r.subType===t&&e.call(n,r,i)},this)},eachRawSeriesByType:function(t,e,n){return d(this.getSeriesByType(t),e,n)},isSeriesFiltered:function(t){return null==this._seriesIndicesMap.get(t.componentIndex)},getCurrentSeriesIndices:function(){return(this._seriesIndices||[]).slice()},filterSeries:function(t,e){Mo(this,g(this._componentsMap.get("series"),t,e))},restoreData:function(t){var e=this._componentsMap;Mo(this,e.get("series"));var n=[];e.each(function(t,e){n.push(e)}),ex.topologicalTravel(n,ex.getAllClassMainTypes(),function(n,i){d(e.get(n),function(e){("series"!==n||!xo(e,t))&&e.restoreData()})})}});h(vx,ox);var yx=["getDom","getZr","getWidth","getHeight","getDevicePixelRatio","dispatchAction","isDisposed","on","off","getDataURL","getConnectedDataURL","getModel","getOption","getViewOfComponentModel","getViewOfSeriesModel"],xx={};Co.prototype={constructor:Co,create:function(t,e){var n=[];d(xx,function(i,r){var o=i.create(t,e);n=n.concat(o||[])}),this._coordinateSystems=n},update:function(t,e){d(this._coordinateSystems,function(n){n.update&&n.update(t,e)})},getCoordinateSystems:function(){return this._coordinateSystems.slice()}},Co.register=function(t,e){xx[t]=e},Co.get=function(t){return xx[t]};var _x=d,bx=n,Sx=f,Mx=i,Ix=/^(min|max)?(.+)$/;Ao.prototype={constructor:Ao,setOption:function(t,e){t&&d(Mn(t.series),function(t){t&&t.data&&S(t.data)&&O(t.data)}),t=bx(t,!0);var n=this._optionBackup,i=Do.call(this,t,e,!n);this._newBaseOption=i.baseOption,n?(Oo(n.baseOption,i.baseOption),i.timelineOptions.length&&(n.timelineOptions=i.timelineOptions),i.mediaList.length&&(n.mediaList=i.mediaList),i.mediaDefault&&(n.mediaDefault=i.mediaDefault)):this._optionBackup=i},mountOption:function(t){var e=this._optionBackup;return this._timelineOptions=Sx(e.timelineOptions,bx),this._mediaList=Sx(e.mediaList,bx),this._mediaDefault=bx(e.mediaDefault),this._currentMediaIndices=[],bx(t?e.baseOption:this._newBaseOption)},getTimelineOption:function(t){var e,n=this._timelineOptions;if(n.length){var i=t.getComponent("timeline");i&&(e=bx(n[i.getCurrentIndex()],!0))}return e},getMediaOption:function(t){var e=this._api.getWidth(),n=this._api.getHeight(),i=this._mediaList,r=this._mediaDefault,o=[],a=[];if(!i.length&&!r)return a;for(var s=0,l=i.length;s<l;s++)ko(i[s].query,e,n)&&o.push(s);return!o.length&&r&&(o=[-1]),o.length&&!Lo(o,this._currentMediaIndices)&&(a=Sx(o,function(t){return bx(-1===t?r.option:i[t].option)})),this._currentMediaIndices=o,a}};var Tx=d,Cx=w,Ax=["areaStyle","lineStyle","nodeStyle","linkStyle","chordStyle","label","labelLine"],Dx=function(t,e){Tx(Vo(t.series),function(t){Cx(t)&&Fo(t)});var n=["xAxis","yAxis","radiusAxis","angleAxis","singleAxis","parallelAxis","radar"];e&&n.push("valueAxis","categoryAxis","logAxis","timeAxis"),Tx(n,function(e){Tx(Vo(t[e]),function(t){t&&(Ro(t,"axisLabel"),Ro(t.axisPointer,"label"))})}),Tx(Vo(t.parallel),function(t){var e=t&&t.parallelAxisDefault;Ro(e,"axisLabel"),Ro(e&&e.axisPointer,"label")}),Tx(Vo(t.calendar),function(t){Eo(t,"itemStyle"),Ro(t,"dayLabel"),Ro(t,"monthLabel"),Ro(t,"yearLabel")}),Tx(Vo(t.radar),function(t){Ro(t,"name")}),Tx(Vo(t.geo),function(t){Cx(t)&&(Bo(t),Tx(Vo(t.regions),function(t){Bo(t)}))}),Tx(Vo(t.timeline),function(t){Bo(t),Eo(t,"label"),Eo(t,"itemStyle"),Eo(t,"controlStyle",!0);var e=t.data;y(e)&&d(e,function(t){w(t)&&(Eo(t,"label"),Eo(t,"itemStyle"))})}),Tx(Vo(t.toolbox),function(t){Eo(t,"iconStyle"),Tx(t.feature,function(t){Eo(t,"iconStyle")})}),Ro(Wo(t.axisPointer),"label"),Ro(Wo(t.tooltip).axisPointer,"label")},kx=[["x","left"],["y","top"],["x2","right"],["y2","bottom"]],Px=["grid","geo","parallel","legend","toolbox","title","visualMap","dataZoom","timeline"],Lx=function(t,e){Dx(t,e),t.series=Mn(t.series),d(t.series,function(t){if(w(t)){var e=t.type;if("pie"!==e&&"gauge"!==e||null!=t.clockWise&&(t.clockwise=t.clockWise),"gauge"===e){var n=Ho(t,"pointer.color");null!=n&&Go(t,"itemStyle.normal.color",n)}Zo(t)}}),t.dataRange&&(t.visualMap=t.dataRange),d(Px,function(e){var n=t[e];n&&(y(n)||(n=[n]),d(n,function(t){Zo(t)}))})},Ox=Xo.prototype;Ox.pure=!1,Ox.persistent=!0,Ox.getSource=function(){return this._source};var zx={arrayRows_column:{pure:!0,count:function(){return Math.max(0,this._data.length-this._source.startIndex)},getItem:function(t){return this._data[t+this._source.startIndex]},appendData:qo},arrayRows_row:{pure:!0,count:function(){var t=this._data[0];return t?Math.max(0,t.length-this._source.startIndex):0},getItem:function(t){t+=this._source.startIndex;for(var e=[],n=this._data,i=0;i<n.length;i++){var r=n[i];e.push(r?r[t]:null)}return e},appendData:function(){throw new Error('Do not support appendData when set seriesLayoutBy: "row".')}},objectRows:{pure:!0,count:Yo,getItem:jo,appendData:qo},keyedColumns:{pure:!0,count:function(){var t=this._source.dimensionsDefine[0].name,e=this._data[t];return e?e.length:0},getItem:function(t){for(var e=[],n=this._source.dimensionsDefine,i=0;i<n.length;i++){var r=this._data[n[i].name];e.push(r?r[t]:null)}return e},appendData:function(t){var e=this._data;d(t,function(t,n){for(var i=e[n]||(e[n]=[]),r=0;r<(t||[]).length;r++)i.push(t[r])})}},original:{count:Yo,getItem:jo,appendData:qo},typedArray:{persistent:!1,pure:!0,count:function(){return this._data?this._data.length/this._dimSize:0},getItem:function(t,e){t-=this._offset,e=e||[];for(var n=this._dimSize*t,i=0;i<this._dimSize;i++)e[i]=this._data[n+i];return e},appendData:function(t){this._data=t},clean:function(){this._offset+=this.count(),this._data=null}}},Ex={arrayRows:$o,objectRows:function(t,e,n,i){return null!=n?t[i]:t},keyedColumns:$o,original:function(t,e,n,i){var r=Tn(t);return null!=n&&r instanceof Array?r[n]:r},typedArray:$o},Nx={arrayRows:Ko,objectRows:function(t,e,n,i){return Qo(t[e],this._dimensionInfos[e])},keyedColumns:Ko,original:function(t,e,n,i){var r=t&&(null==t.value?t:t.value);return!this._rawData.pure&&Cn(t)&&(this.hasItemOption=!0),Qo(r instanceof Array?r[i]:r,this._dimensionInfos[e])},typedArray:function(t,e,n,i){return t[i]}},Rx=/\{@(.+?)\}/g,Bx={getDataParams:function(t,e){var n=this.getData(e),i=this.getRawValue(t,e),r=n.getRawIndex(t),o=n.getName(t),a=n.getRawDataItem(t),s=n.getItemVisual(t,"color"),l=this.ecModel.getComponent("tooltip"),u=Bn(l&&l.get("renderMode")),h=this.mainType,c="series"===h;return{componentType:h,componentSubType:this.subType,componentIndex:this.componentIndex,seriesType:c?this.subType:null,seriesIndex:this.seriesIndex,seriesId:c?this.id:null,seriesName:c?this.name:null,name:o,dataIndex:r,data:a,dataType:e,value:i,color:s,marker:Xr({color:s,renderMode:u}),$vars:["seriesName","name","value"]}},getFormattedLabel:function(t,e,n,i,r){e=e||"normal";var o=this.getData(n),a=o.getItemModel(t),s=this.getDataParams(t,n);null!=i&&s.value instanceof Array&&(s.value=s.value[i]);var l=a.get("normal"===e?[r||"label","formatter"]:[e,r||"label","formatter"]);return"function"==typeof l?(s.status=e,l(s)):"string"==typeof l?Ur(l,s).replace(Rx,function(e,n){var i=n.length;return"["===n.charAt(0)&&"]"===n.charAt(i-1)&&(n=+n.slice(1,i-1)),Jo(o,t,n)}):void 0},getRawValue:function(t,e){return Jo(this.getData(e),t)},formatTooltip:function(){}},Fx=na.prototype;Fx.perform=function(t){function e(t){return!(t>=1)&&(t=1),t}var n=this._upstream,i=t&&t.skip;if(this._dirty&&n){var r=this.context;r.data=r.outputData=n.context.outputData}this.__pipeline&&(this.__pipeline.currentTask=this);var o;this._plan&&!i&&(o=this._plan(this.context));var a=e(this._modBy),s=this._modDataCount||0,l=e(t&&t.modBy),u=t&&t.modDataCount||0;a===l&&s===u||(o="reset");var h;(this._dirty||"reset"===o)&&(this._dirty=!1,h=ra(this,i)),this._modBy=l,this._modDataCount=u;var c=t&&t.step;if(this._dueEnd=n?n._outputDueEnd:this._count?this._count(this.context):1/0,this._progress){var d=this._dueIndex,f=Math.min(null!=c?this._dueIndex+c:1/0,this._dueEnd);if(!i&&(h||d<f)){var p=this._progress;if(y(p))for(var g=0;g<p.length;g++)ia(this,p[g],d,f,l,u);else ia(this,p,d,f,l,u)}this._dueIndex=f;var m=null!=this._settedOutputEnd?this._settedOutputEnd:f;this._outputDueEnd=m}else this._dueIndex=this._outputDueEnd=null!=this._settedOutputEnd?this._settedOutputEnd:this._dueEnd;return this.unfinished()};var Vx=function(){function t(){return i<n?i++:null}function e(){var t=i%a*r+Math.ceil(i/a),e=i>=n?null:t<o?t:i;return i++,e}var n,i,r,o,a,s={reset:function(l,u,h,c){i=l,n=u,r=h,o=c,a=Math.ceil(o/r),s.next=r>1&&o>0?e:t}};return s}();Fx.dirty=function(){this._dirty=!0,this._onDirty&&this._onDirty(this.context)},Fx.unfinished=function(){return this._progress&&this._dueIndex<this._dueEnd},Fx.pipe=function(t){(this._downstream!==t||this._dirty)&&(this._downstream=t,t._upstream=this,t.dirty())},Fx.dispose=function(){this._disposed||(this._upstream&&(this._upstream._downstream=null),this._downstream&&(this._downstream._upstream=null),this._dirty=!1,this._disposed=!0)},Fx.getUpstream=function(){return this._upstream},Fx.getDownstream=function(){return this._downstream},Fx.setOutputEnd=function(t){this._outputDueEnd=this._settedOutputEnd=t};var Wx=On(),Hx=ex.extend({type:"series.__base__",seriesIndex:0,coordinateSystem:null,defaultOption:null,legendDataProvider:null,visualColorAccessPath:"itemStyle.color",layoutMode:null,init:function(t,e,n,i){this.seriesIndex=this.componentIndex,this.dataTask=ea({count:sa,reset:la}),this.dataTask.context={model:this},this.mergeDefaultAndTheme(t,n),uo(this);var r=this.getInitialData(t,n);ha(r,this),this.dataTask.context.data=r,Wx(this).dataBeforeProcessed=r,oa(this)},mergeDefaultAndTheme:function(t,e){var n=this.layoutMode,r=n?to(t):{},o=this.subType;ex.hasClass(o)&&(o+="Series"),i(t,e.getTheme().get(this.subType)),i(t,this.getDefaultOption()),In(t,"label",["show"]),this.fillDataTextStyle(t.data),n&&Jr(t,r,n)},mergeOption:function(t,e){t=i(this.option,t,!0),this.fillDataTextStyle(t.data);var n=this.layoutMode;n&&Jr(this.option,t,n),uo(this);var r=this.getInitialData(t,e);ha(r,this),this.dataTask.dirty(),this.dataTask.context.data=r,Wx(this).dataBeforeProcessed=r,oa(this)},fillDataTextStyle:function(t){if(t&&!S(t))for(var e=["show"],n=0;n<t.length;n++)t[n]&&t[n].label&&In(t[n],"label",e)},getInitialData:function(){},appendData:function(t){this.getRawData().appendData(t.data)},getData:function(t){var e=da(this);if(e){var n=e.context.data;return null==t?n:n.getLinkedData(t)}return Wx(this).data},setData:function(t){var e=da(this);if(e){var n=e.context;n.data!==t&&e.modifyOutputEnd&&e.setOutputEnd(t.count()),n.outputData=t,e!==this.dataTask&&(n.data=t)}Wx(this).data=t},getSource:function(){return so(this)},getRawData:function(){return Wx(this).dataBeforeProcessed},getBaseAxis:function(){var t=this.coordinateSystem;return t&&t.getBaseAxis&&t.getBaseAxis()},formatTooltip:function(t,e,n,i){function r(t){return{renderMode:i,content:Zr(Hr(t)),style:l}}var o=this,a="html"===(i=i||"html")?"<br/>":"\n",s="richText"===i,l={},u=0,h=this.getData(),c=h.mapDimension("defaultedTooltip",!0),f=c.length,g=this.getRawValue(t),m=y(g),v=h.getItemVisual(t,"color");w(v)&&v.colorStops&&(v=(v.colorStops[0]||{}).color),v=v||"transparent";var x=(f>1||m&&!f?function(n){function r(t,n){var r=h.getDimensionInfo(n);if(r&&!1!==r.otherDims.tooltip){var c=r.type,d="sub"+o.seriesIndex+"at"+u,p=Xr({color:v,type:"subItem",renderMode:i,markerId:d}),g="string"==typeof p?p:p.content,m=(a?g+Zr(r.displayName||"-")+": ":"")+Zr("ordinal"===c?t+"":"time"===c?e?"":jr("yyyy/MM/dd hh:mm:ss",t):Hr(t));m&&f.push(m),s&&(l[d]=v,++u)}}var a=p(n,function(t,e,n){var i=h.getDimensionInfo(n);return t|=i&&!1!==i.tooltip&&null!=i.displayName},0),f=[];c.length?d(c,function(e){r(Jo(h,t,e),e)}):d(n,r);var g=a?s?"\n":"<br/>":"",m=g+f.join(g||", ");return{renderMode:i,content:m,style:l}}(g):r(f?Jo(h,t,c[0]):m?g[0]:g)).content,_=o.seriesIndex+"at"+u,b=Xr({color:v,type:"item",renderMode:i,markerId:_});l[_]=v,++u;var S=h.getName(t),M=this.name;kn(this)||(M=""),M=M?Zr(M)+(e?": ":a):"";var I="string"==typeof b?b:b.content;return{html:e?I+M+x:M+I+(S?Zr(S)+": "+x:x),markers:l}},isAnimationEnabled:function(){if(Xp.node)return!1;var t=this.getShallow("animation");return t&&this.getData().count()>this.getShallow("animationThreshold")&&(t=!1),t},restoreData:function(){this.dataTask.dirty()},getColorFromPalette:function(t,e,n){var i=this.ecModel,r=ox.getColorFromPalette.call(this,t,e,n);return r||(r=i.getColorFromPalette(t,e,n)),r},coordDimToDataDim:function(t){return this.getRawData().mapDimension(t,!0)},getProgressive:function(){return this.get("progressive")},getProgressiveThreshold:function(){return this.get("progressiveThreshold")},getAxisTooltipData:null,getTooltipPosition:null,pipeTask:null,preventIncremental:null,pipelineContext:null});h(Hx,Bx),h(Hx,ox);var Gx=function(){this.group=new Jg,this.uid=Tr("viewComponent")};Gx.prototype={constructor:Gx,init:function(t,e){},render:function(t,e,n,i){},dispose:function(){},filterForExposedEvent:null};var Zx=Gx.prototype;Zx.updateView=Zx.updateLayout=Zx.updateVisual=function(t,e,n,i){},Wn(Gx),Un(Gx,{registerWhenExtend:!0});var Ux=function(){var t=On();return function(e){var n=t(e),i=e.pipelineContext,r=n.large,o=n.progressiveRender,a=n.large=i.large,s=n.progressiveRender=i.progressiveRender;return!!(r^a||o^s)&&"reset"}},Xx=On(),Yx=Ux();fa.prototype={type:"chart",init:function(t,e){},render:function(t,e,n,i){},highlight:function(t,e,n,i){ga(t.getData(),i,"emphasis")},downplay:function(t,e,n,i){ga(t.getData(),i,"normal")},remove:function(t,e){this.group.removeAll()},dispose:function(){},incrementalPrepareRender:null,incrementalRender:null,updateTransform:null,filterForExposedEvent:null};var jx=fa.prototype;jx.updateView=jx.updateLayout=jx.updateVisual=function(t,e,n,i){this.render(t,e,n,i)},Wn(fa),Un(fa,{registerWhenExtend:!0}),fa.markUpdateMethod=function(t,e){Xx(t).updateMethod=e};var qx={incrementalPrepareRender:{progress:function(t,e){e.view.incrementalRender(t,e.model,e.ecModel,e.api,e.payload)}},render:{forceFirstProgress:!0,progress:function(t,e){e.view.render(e.model,e.ecModel,e.api,e.payload)}}},$x="\0__throttleOriginMethod",Kx="\0__throttleRate",Qx="\0__throttleType",Jx={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){var n=t.getData(),i=(t.visualColorAccessPath||"itemStyle.color").split("."),r=t.get(i)||t.getColorFromPalette(t.name,null,e.getSeriesCount());if(n.setVisual("color",r),!e.isSeriesFiltered(t)){"function"!=typeof r||r instanceof _y||n.each(function(e){n.setItemVisual(e,"color",r(t.getDataParams(e)))});return{dataEach:n.hasItemOption?function(t,e){var n=t.getItemModel(e).get(i,!0);null!=n&&t.setItemVisual(e,"color",n)}:null}}}},t_={toolbox:{brush:{title:{rect:"矩形选择",polygon:"圈选",lineX:"横向选择",lineY:"纵向选择",keep:"保持选择",clear:"清除选择"}},dataView:{title:"数据视图",lang:["数据视图","关闭","刷新"]},dataZoom:{title:{zoom:"区域缩放",back:"区域缩放还原"}},magicType:{title:{line:"切换为折线图",bar:"切换为柱状图",stack:"切换为堆叠",tiled:"切换为平铺"}},restore:{title:"还原"},saveAsImage:{title:"保存为图片",lang:["右键另存为图片"]}},series:{typeNames:{pie:"饼图",bar:"柱状图",line:"折线图",scatter:"散点图",effectScatter:"涟漪散点图",radar:"雷达图",tree:"树图",treemap:"矩形树图",boxplot:"箱型图",candlestick:"K线图",k:"K线图",heatmap:"热力图",map:"地图",parallel:"平行坐标图",lines:"线图",graph:"关系图",sankey:"桑基图",funnel:"漏斗图",gauge:"仪表盘图",pictorialBar:"象形柱图",themeRiver:"主题河流图",sunburst:"旭日图"}},aria:{general:{withTitle:"这是一个关于“{title}”的图表。",withoutTitle:"这是一个图表,"},series:{single:{prefix:"",withName:"图表类型是{seriesType},表示{seriesName}。",withoutName:"图表类型是{seriesType}。"},multiple:{prefix:"它由{seriesCount}个图表系列组成。",withName:"第{seriesId}个系列是一个表示{seriesName}的{seriesType},",withoutName:"第{seriesId}个系列是一个{seriesType},",separator:{middle:";",end:"。"}}},data:{allData:"其数据是——",partialData:"其中,前{displayCnt}项是——",withName:"{name}的数据是{value}",withoutName:"{value}",separator:{middle:",",end:""}}}},e_=function(t,e){function n(t,e){if("string"!=typeof t)return t;var n=t;return d(e,function(t,e){n=n.replace(new RegExp("\\{\\s*"+e+"\\s*\\}","g"),t)}),n}function i(t){var e=o.get(t);if(null==e){for(var n=t.split("."),i=t_.aria,r=0;r<n.length;++r)i=i[n[r]];return i}return e}function r(t){return t_.series.typeNames[t]||"自定义图"}var o=e.getModel("aria");if(o.get("show"))if(o.get("description"))t.setAttribute("aria-label",o.get("description"));else{var a=0;e.eachSeries(function(t,e){++a},this);var s,l=o.get("data.maxCount")||10,u=o.get("series.maxCount")||10,h=Math.min(a,u);if(!(a<1)){var c=function(){var t=e.getModel("title").option;return t&&t.length&&(t=t[0]),t&&t.text}();s=c?n(i("general.withTitle"),{title:c}):i("general.withoutTitle");var f=[];s+=n(i(a>1?"series.multiple.prefix":"series.single.prefix"),{seriesCount:a}),e.eachSeries(function(t,e){if(e<h){var o,s=t.get("name"),u="series."+(a>1?"multiple":"single")+".";o=n(o=i(s?u+"withName":u+"withoutName"),{seriesId:t.seriesIndex,seriesName:t.get("name"),seriesType:r(t.subType)});var c=t.getData();window.data=c,c.count()>l?o+=n(i("data.partialData"),{displayCnt:l}):o+=i("data.allData");for(var d=[],p=0;p<c.count();p++)if(p<l){var g=c.getName(p),m=Jo(c,p);d.push(n(i(g?"data.withName":"data.withoutName"),{name:g,value:m}))}o+=d.join(i("data.separator.middle"))+i("data.separator.end"),f.push(o)}}),s+=f.join(i("series.multiple.separator.middle"))+i("series.multiple.separator.end"),t.setAttribute("aria-label",s)}}},n_=Math.PI,i_=wa.prototype;i_.restoreData=function(t,e){t.restoreData(e),this._stageTaskMap.each(function(t){var e=t.overallTask;e&&e.dirty()})},i_.getPerformArgs=function(t,e){if(t.__pipeline){var n=this._pipelineMap.get(t.__pipeline.id),i=n.context,r=!e&&n.progressiveEnabled&&(!i||i.progressiveRender)&&t.__idxInPipeline>n.blockIndex?n.step:null,o=i&&i.modDataCount;return{step:r,modBy:null!=o?Math.ceil(o/r):null,modDataCount:o}}},i_.getPipeline=function(t){return this._pipelineMap.get(t)},i_.updateStreamModes=function(t,e){var n=this._pipelineMap.get(t.uid),i=t.getData().count(),r=n.progressiveEnabled&&e.incrementalPrepareRender&&i>=n.threshold,o=t.get("large")&&i>=t.get("largeThreshold"),a="mod"===t.get("progressiveChunkMode")?i:null;t.pipelineContext=n.context={progressiveRender:r,modDataCount:a,large:o}},i_.restorePipelines=function(t){var e=this,n=e._pipelineMap=N();t.eachSeries(function(t){var i=t.getProgressive(),r=t.uid;n.set(r,{id:r,head:null,tail:null,threshold:t.getProgressiveThreshold(),progressiveEnabled:i&&!(t.preventIncremental&&t.preventIncremental()),blockIndex:-1,step:Math.round(i||700),count:0}),Oa(e,t,t.dataTask)})},i_.prepareStageTasks=function(){var t=this._stageTaskMap,e=this.ecInstance.getModel(),n=this.api;d(this._allHandlers,function(i){var r=t.get(i.uid)||t.set(i.uid,[]);i.reset&&Sa(this,i,r,e,n),i.overallReset&&Ma(this,i,r,e,n)},this)},i_.prepareView=function(t,e,n,i){var r=t.renderTask,o=r.context;o.model=e,o.ecModel=n,o.api=i,r.__block=!t.incrementalPrepareRender,Oa(this,e,r)},i_.performDataProcessorTasks=function(t,e){ba(this,this._dataProcessorHandlers,t,e,{block:!0})},i_.performVisualTasks=function(t,e,n){ba(this,this._visualHandlers,t,e,n)},i_.performSeriesTasks=function(t){var e;t.eachSeries(function(t){e|=t.dataTask.perform()}),this.unfinished|=e},i_.plan=function(){this._pipelineMap.each(function(t){var e=t.tail;do{if(e.__block){t.blockIndex=e.__idxInPipeline;break}e=e.getUpstream()}while(e)})};var r_=i_.updatePayload=function(t,e){"remain"!==e&&(t.context.payload=e)},o_=Pa(0);wa.wrapStageHandler=function(t,e){return x(t)&&(t={overallReset:t,seriesType:za(t)}),t.uid=Tr("stageHandler"),e&&(t.visualType=e),t};var a_,s_={},l_={};Ea(s_,vx),Ea(l_,To),s_.eachSeriesByType=s_.eachRawSeriesByType=function(t){a_=t},s_.eachComponent=function(t){"series"===t.mainType&&t.subType&&(a_=t.subType)};var u_=["#37A2DA","#32C5E9","#67E0E3","#9FE6B8","#FFDB5C","#ff9f7f","#fb7293","#E062AE","#E690D1","#e7bcf3","#9d96f5","#8378EA","#96BFFF"],h_={color:u_,colorLayer:[["#37A2DA","#ffd85c","#fd7b5f"],["#37A2DA","#67E0E3","#FFDB5C","#ff9f7f","#E062AE","#9d96f5"],["#37A2DA","#32C5E9","#9FE6B8","#FFDB5C","#ff9f7f","#fb7293","#e7bcf3","#8378EA","#96BFFF"],u_]},c_=["#dd6b66","#759aa0","#e69d87","#8dc1a9","#ea7e53","#eedd78","#73a373","#73b9bc","#7289ab","#91ca8c","#f49f42"],d_={color:c_,backgroundColor:"#333",tooltip:{axisPointer:{lineStyle:{color:"#eee"},crossStyle:{color:"#eee"}}},legend:{textStyle:{color:"#eee"}},textStyle:{color:"#eee"},title:{textStyle:{color:"#eee"}},toolbox:{iconStyle:{normal:{borderColor:"#eee"}}},dataZoom:{textStyle:{color:"#eee"}},visualMap:{textStyle:{color:"#eee"}},timeline:{lineStyle:{color:"#eee"},itemStyle:{normal:{color:c_[1]}},label:{normal:{textStyle:{color:"#eee"}}},controlStyle:{normal:{color:"#eee",borderColor:"#eee"}}},timeAxis:{axisLine:{lineStyle:{color:"#eee"}},axisTick:{lineStyle:{color:"#eee"}},axisLabel:{textStyle:{color:"#eee"}},splitLine:{lineStyle:{type:"dashed",color:"#aaa"}},splitArea:{areaStyle:{color:"#eee"}}},logAxis:{axisLine:{lineStyle:{color:"#eee"}},axisTick:{lineStyle:{color:"#eee"}},axisLabel:{textStyle:{color:"#eee"}},splitLine:{lineStyle:{type:"dashed",color:"#aaa"}},splitArea:{areaStyle:{color:"#eee"}}},valueAxis:{axisLine:{lineStyle:{color:"#eee"}},axisTick:{lineStyle:{color:"#eee"}},axisLabel:{textStyle:{color:"#eee"}},splitLine:{lineStyle:{type:"dashed",color:"#aaa"}},splitArea:{areaStyle:{color:"#eee"}}},categoryAxis:{axisLine:{lineStyle:{color:"#eee"}},axisTick:{lineStyle:{color:"#eee"}},axisLabel:{textStyle:{color:"#eee"}},splitLine:{lineStyle:{type:"dashed",color:"#aaa"}},splitArea:{areaStyle:{color:"#eee"}}},line:{symbol:"circle"},graph:{color:c_},gauge:{title:{textStyle:{color:"#eee"}}},candlestick:{itemStyle:{normal:{color:"#FD1050",color0:"#0CF49B",borderColor:"#FD1050",borderColor0:"#0CF49B"}}}};d_.categoryAxis.splitLine.show=!1,ex.extend({type:"dataset",defaultOption:{seriesLayoutBy:fx,sourceHeader:null,dimensions:null,source:null},optionUpdated:function(){ao(this)}}),Gx.extend({type:"dataset"});var f_=Ii.extend({type:"ellipse",shape:{cx:0,cy:0,rx:0,ry:0},buildPath:function(t,e){var n=.5522848,i=e.cx,r=e.cy,o=e.rx,a=e.ry,s=o*n,l=a*n;t.moveTo(i-o,r),t.bezierCurveTo(i-o,r-l,i-s,r-a,i,r-a),t.bezierCurveTo(i+s,r-a,i+o,r-l,i+o,r),t.bezierCurveTo(i+o,r+l,i+s,r+a,i,r+a),t.bezierCurveTo(i-s,r+a,i-o,r+l,i-o,r),t.closePath()}}),p_=/[\s,]+/;Ra.prototype.parse=function(t,e){e=e||{};var n=Na(t);if(!n)throw new Error("Illegal svg");var i=new Jg;this._root=i;var r=n.getAttribute("viewBox")||"",o=parseFloat(n.getAttribute("width")||e.width),a=parseFloat(n.getAttribute("height")||e.height);isNaN(o)&&(o=null),isNaN(a)&&(a=null),Wa(n,i,null,!0);for(var s=n.firstChild;s;)this._parseNode(s,i),s=s.nextSibling;var l,u;if(r){var h=L(r).split(p_);h.length>=4&&(l={x:parseFloat(h[0]||0),y:parseFloat(h[1]||0),width:parseFloat(h[2]),height:parseFloat(h[3])})}if(l&&null!=o&&null!=a&&(u=Ua(l,o,a),!e.ignoreViewBox)){var c=i;(i=new Jg).add(c),c.scale=u.scale.slice(),c.position=u.position.slice()}return e.ignoreRootClip||null==o||null==a||i.setClipPath(new py({shape:{x:0,y:0,width:o,height:a}})),{root:i,width:o,height:a,viewBoxRect:l,viewBoxTransform:u}},Ra.prototype._parseNode=function(t,e){var n=t.nodeName.toLowerCase();"defs"===n?this._isDefine=!0:"text"===n&&(this._isText=!0);var i;if(this._isDefine){if(a=m_[n]){var r=a.call(this,t),o=t.getAttribute("id");o&&(this._defs[o]=r)}}else{var a=g_[n];a&&(i=a.call(this,t,e),e.add(i))}for(var s=t.firstChild;s;)1===s.nodeType&&this._parseNode(s,i),3===s.nodeType&&this._isText&&this._parseText(s,i),s=s.nextSibling;"defs"===n?this._isDefine=!1:"text"===n&&(this._isText=!1)},Ra.prototype._parseText=function(t,e){if(1===t.nodeType){var n=t.getAttribute("dx")||0,i=t.getAttribute("dy")||0;this._textX+=parseFloat(n),this._textY+=parseFloat(i)}var r=new ry({style:{text:t.textContent,transformText:!0},position:[this._textX||0,this._textY||0]});Fa(e,r),Wa(t,r,this._defs);var o=r.style.fontSize;o&&o<9&&(r.style.fontSize=9,r.scale=r.scale||[1,1],r.scale[0]*=o/9,r.scale[1]*=o/9);var a=r.getBoundingRect();return this._textX+=a.width,e.add(r),r};var g_={g:function(t,e){var n=new Jg;return Fa(e,n),Wa(t,n,this._defs),n},rect:function(t,e){var n=new py;return Fa(e,n),Wa(t,n,this._defs),n.setShape({x:parseFloat(t.getAttribute("x")||0),y:parseFloat(t.getAttribute("y")||0),width:parseFloat(t.getAttribute("width")||0),height:parseFloat(t.getAttribute("height")||0)}),n},circle:function(t,e){var n=new oy;return Fa(e,n),Wa(t,n,this._defs),n.setShape({cx:parseFloat(t.getAttribute("cx")||0),cy:parseFloat(t.getAttribute("cy")||0),r:parseFloat(t.getAttribute("r")||0)}),n},line:function(t,e){var n=new gy;return Fa(e,n),Wa(t,n,this._defs),n.setShape({x1:parseFloat(t.getAttribute("x1")||0),y1:parseFloat(t.getAttribute("y1")||0),x2:parseFloat(t.getAttribute("x2")||0),y2:parseFloat(t.getAttribute("y2")||0)}),n},ellipse:function(t,e){var n=new f_;return Fa(e,n),Wa(t,n,this._defs),n.setShape({cx:parseFloat(t.getAttribute("cx")||0),cy:parseFloat(t.getAttribute("cy")||0),rx:parseFloat(t.getAttribute("rx")||0),ry:parseFloat(t.getAttribute("ry")||0)}),n},polygon:function(t,e){var n=t.getAttribute("points");n&&(n=Va(n));var i=new dy({shape:{points:n||[]}});return Fa(e,i),Wa(t,i,this._defs),i},polyline:function(t,e){var n=new Ii;Fa(e,n),Wa(t,n,this._defs);var i=t.getAttribute("points");return i&&(i=Va(i)),new fy({shape:{points:i||[]}})},image:function(t,e){var n=new an;return Fa(e,n),Wa(t,n,this._defs),n.setStyle({image:t.getAttribute("xlink:href"),x:t.getAttribute("x"),y:t.getAttribute("y"),width:t.getAttribute("width"),height:t.getAttribute("height")}),n},text:function(t,e){var n=t.getAttribute("x")||0,i=t.getAttribute("y")||0,r=t.getAttribute("dx")||0,o=t.getAttribute("dy")||0;this._textX=parseFloat(n)+parseFloat(r),this._textY=parseFloat(i)+parseFloat(o);var a=new Jg;return Fa(e,a),Wa(t,a,this._defs),a},tspan:function(t,e){var n=t.getAttribute("x"),i=t.getAttribute("y");null!=n&&(this._textX=parseFloat(n)),null!=i&&(this._textY=parseFloat(i));var r=t.getAttribute("dx")||0,o=t.getAttribute("dy")||0,a=new Jg;return Fa(e,a),Wa(t,a,this._defs),this._textX+=r,this._textY+=o,a},path:function(t,e){var n=Di(t.getAttribute("d")||"");return Fa(e,n),Wa(t,n,this._defs),n}},m_={lineargradient:function(t){var e=parseInt(t.getAttribute("x1")||0,10),n=parseInt(t.getAttribute("y1")||0,10),i=parseInt(t.getAttribute("x2")||10,10),r=parseInt(t.getAttribute("y2")||0,10),o=new wy(e,n,i,r);return Ba(t,o),o},radialgradient:function(t){}},v_={fill:"fill",stroke:"stroke","stroke-width":"lineWidth",opacity:"opacity","fill-opacity":"fillOpacity","stroke-opacity":"strokeOpacity","stroke-dasharray":"lineDash","stroke-dashoffset":"lineDashOffset","stroke-linecap":"lineCap","stroke-linejoin":"lineJoin","stroke-miterlimit":"miterLimit","font-family":"fontFamily","font-size":"fontSize","font-style":"fontStyle","font-weight":"fontWeight","text-align":"textAlign","alignment-baseline":"textBaseline"},y_=/url\(\s*#(.*?)\)/,x_=/(translate|scale|rotate|skewX|skewY|matrix)\(([\-\s0-9\.e,]*)\)/g,__=/([^\s:;]+)\s*:\s*([^:;]+)/g,w_=N(),b_={registerMap:function(t,e,n){var i;return y(e)?i=e:e.svg?i=[{type:"svg",source:e.svg,specialAreas:e.specialAreas}]:(e.geoJson&&!e.features&&(n=e.specialAreas,e=e.geoJson),i=[{type:"geoJSON",source:e,specialAreas:n}]),d(i,function(t){var e=t.type;"geoJson"===e&&(e=t.type="geoJSON"),(0,S_[e])(t)}),w_.set(t,i)},retrieveMap:function(t){return w_.get(t)}},S_={geoJSON:function(t){var e=t.source;t.geoJSON=_(e)?"undefined"!=typeof JSON&&JSON.parse?JSON.parse(e):new Function("return ("+e+");")():e},svg:function(t){t.svgXML=Na(t.source)}},M_=P,I_=d,T_=x,C_=w,A_=ex.parseClassType,D_={zrender:"4.0.5"},k_=1e3,P_=1e3,L_=3e3,O_={PROCESSOR:{FILTER:k_,STATISTIC:5e3},VISUAL:{LAYOUT:P_,GLOBAL:2e3,CHART:L_,COMPONENT:4e3,BRUSH:5e3}},z_="__flagInMainProcess",E_="__optionUpdated",N_=/^[a-zA-Z0-9_]+$/;Ya.prototype.on=Xa("on"),Ya.prototype.off=Xa("off"),Ya.prototype.one=Xa("one"),h(Ya,pg);var R_=ja.prototype;R_._onframe=function(){if(!this._disposed){var t=this._scheduler;if(this[E_]){var e=this[E_].silent;this[z_]=!0,$a(this),B_.update.call(this),this[z_]=!1,this[E_]=!1,ts.call(this,e),es.call(this,e)}else if(t.unfinished){var n=1,i=this._model;this._api;t.unfinished=!1;do{var r=+new Date;t.performSeriesTasks(i),t.performDataProcessorTasks(i),Qa(this,i),t.performVisualTasks(i),ss(this,this._model,0,"remain"),n-=+new Date-r}while(n>0&&t.unfinished);t.unfinished||this._zr.flush()}}},R_.getDom=function(){return this._dom},R_.getZr=function(){return this._zr},R_.setOption=function(t,e,n){var i;if(C_(e)&&(n=e.lazyUpdate,i=e.silent,e=e.notMerge),this[z_]=!0,!this._model||e){var r=new Ao(this._api),o=this._theme,a=this._model=new vx(null,null,o,r);a.scheduler=this._scheduler,a.init(null,null,o,r)}this._model.setOption(t,G_),n?(this[E_]={silent:i},this[z_]=!1):($a(this),B_.update.call(this),this._zr.flush(),this[E_]=!1,this[z_]=!1,ts.call(this,i),es.call(this,i))},R_.setTheme=function(){console.error("ECharts#setTheme() is DEPRECATED in ECharts 3.0")},R_.getModel=function(){return this._model},R_.getOption=function(){return this._model&&this._model.getOption()},R_.getWidth=function(){return this._zr.getWidth()},R_.getHeight=function(){return this._zr.getHeight()},R_.getDevicePixelRatio=function(){return this._zr.painter.dpr||window.devicePixelRatio||1},R_.getRenderedCanvas=function(t){if(Xp.canvasSupported)return(t=t||{}).pixelRatio=t.pixelRatio||1,t.backgroundColor=t.backgroundColor||this._model.get("backgroundColor"),this._zr.painter.getRenderedCanvas(t)},R_.getSvgDataUrl=function(){if(Xp.svgSupported){var t=this._zr;return d(t.storage.getDisplayList(),function(t){t.stopAnimation(!0)}),t.painter.pathToDataUrl()}},R_.getDataURL=function(t){var e=(t=t||{}).excludeComponents,n=this._model,i=[],r=this;I_(e,function(t){n.eachComponent({mainType:t},function(t){var e=r._componentsMap[t.__viewId];e.group.ignore||(i.push(e),e.group.ignore=!0)})});var o="svg"===this._zr.painter.getType()?this.getSvgDataUrl():this.getRenderedCanvas(t).toDataURL("image/"+(t&&t.type||"png"));return I_(i,function(t){t.group.ignore=!1}),o},R_.getConnectedDataURL=function(t){if(Xp.canvasSupported){var e=this.group,i=Math.min,r=Math.max;if(q_[e]){var o=1/0,a=1/0,s=-1/0,l=-1/0,u=[],h=t&&t.pixelRatio||1;d(j_,function(h,c){if(h.group===e){var d=h.getRenderedCanvas(n(t)),f=h.getDom().getBoundingClientRect();o=i(f.left,o),a=i(f.top,a),s=r(f.right,s),l=r(f.bottom,l),u.push({dom:d,left:f.left,top:f.top})}});var c=(s*=h)-(o*=h),f=(l*=h)-(a*=h),p=ig();p.width=c,p.height=f;var g=wn(p);return I_(u,function(t){var e=new an({style:{x:t.left*h-o,y:t.top*h-a,image:t.dom}});g.add(e)}),g.refreshImmediately(),p.toDataURL("image/"+(t&&t.type||"png"))}return this.getDataURL(t)}},R_.convertToPixel=v(qa,"convertToPixel"),R_.convertFromPixel=v(qa,"convertFromPixel"),R_.containPixel=function(t,e){var n;return t=zn(this._model,t),d(t,function(t,i){i.indexOf("Models")>=0&&d(t,function(t){var r=t.coordinateSystem;if(r&&r.containPoint)n|=!!r.containPoint(e);else if("seriesModels"===i){var o=this._chartsMap[t.__viewId];o&&o.containPoint&&(n|=o.containPoint(e,t))}},this)},this),!!n},R_.getVisual=function(t,e){var n=(t=zn(this._model,t,{defaultMainType:"series"})).seriesModel.getData(),i=t.hasOwnProperty("dataIndexInside")?t.dataIndexInside:t.hasOwnProperty("dataIndex")?n.indexOfRawIndex(t.dataIndex):null;return null!=i?n.getItemVisual(i,e):n.getVisual(e)},R_.getViewOfComponentModel=function(t){return this._componentsMap[t.__viewId]},R_.getViewOfSeriesModel=function(t){return this._chartsMap[t.__viewId]};var B_={prepareAndUpdate:function(t){$a(this),B_.update.call(this,t)},update:function(t){var e=this._model,n=this._api,i=this._zr,r=this._coordSysMgr,o=this._scheduler;if(e){o.restoreData(e,t),o.performSeriesTasks(e),r.create(e,n),o.performDataProcessorTasks(e,t),Qa(this,e),r.update(e,n),rs(e),o.performVisualTasks(e,t),os(this,e,n,t);var a=e.get("backgroundColor")||"transparent";if(Xp.canvasSupported)i.setBackgroundColor(a);else{var s=Ot(a);a=Wt(s,"rgb"),0===s[3]&&(a="transparent")}ls(e,n)}},updateTransform:function(t){var e=this._model,n=this,i=this._api;if(e){var r=[];e.eachComponent(function(o,a){var s=n.getViewOfComponentModel(a);if(s&&s.__alive)if(s.updateTransform){var l=s.updateTransform(a,e,i,t);l&&l.update&&r.push(s)}else r.push(s)});var o=N();e.eachSeries(function(r){var a=n._chartsMap[r.__viewId];if(a.updateTransform){var s=a.updateTransform(r,e,i,t);s&&s.update&&o.set(r.uid,1)}else o.set(r.uid,1)}),rs(e),this._scheduler.performVisualTasks(e,t,{setDirty:!0,dirtyMap:o}),ss(n,e,0,t,o),ls(e,this._api)}},updateView:function(t){var e=this._model;e&&(fa.markUpdateMethod(t,"updateView"),rs(e),this._scheduler.performVisualTasks(e,t,{setDirty:!0}),os(this,this._model,this._api,t),ls(e,this._api))},updateVisual:function(t){B_.update.call(this,t)},updateLayout:function(t){B_.update.call(this,t)}};R_.resize=function(t){this._zr.resize(t);var e=this._model;if(this._loadingFX&&this._loadingFX.resize(),e){var n=e.resetOption("media"),i=t&&t.silent;this[z_]=!0,n&&$a(this),B_.update.call(this),this[z_]=!1,ts.call(this,i),es.call(this,i)}},R_.showLoading=function(t,e){if(C_(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),Y_[t]){var n=Y_[t](this._api,e),i=this._zr;this._loadingFX=n,i.add(n)}},R_.hideLoading=function(){this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null},R_.makeActionFromEvent=function(t){var e=o({},t);return e.type=W_[t.type],e},R_.dispatchAction=function(t,e){C_(e)||(e={silent:!!e}),V_[t.type]&&this._model&&(this[z_]?this._pendingActions.push(t):(Ja.call(this,t,e.silent),e.flush?this._zr.flush(!0):!1!==e.flush&&Xp.browser.weChat&&this._throttledZrFlush(),ts.call(this,e.silent),es.call(this,e.silent)))},R_.appendData=function(t){var e=t.seriesIndex;this.getModel().getSeriesByIndex(e).appendData(t),this._scheduler.unfinished=!0},R_.on=Xa("on"),R_.off=Xa("off"),R_.one=Xa("one");var F_=["click","dblclick","mouseover","mouseout","mousemove","mousedown","mouseup","globalout","contextmenu"];R_._initEvents=function(){I_(F_,function(t){this._zr.on(t,function(e){var n,i=this.getModel(),r=e.target;if("globalout"===t)n={};else if(r&&null!=r.dataIndex){var a=r.dataModel||i.getSeriesByIndex(r.seriesIndex);n=a&&a.getDataParams(r.dataIndex,r.dataType,r)||{}}else r&&r.eventData&&(n=o({},r.eventData));if(n){var s=n.componentType,l=n.componentIndex;"markLine"!==s&&"markPoint"!==s&&"markArea"!==s||(s="series",l=n.seriesIndex);var u=s&&null!=l&&i.getComponent(s,l),h=u&&this["series"===u.mainType?"_chartsMap":"_componentsMap"][u.__viewId];n.event=e,n.type=t,this._ecEventProcessor.eventInfo={targetEl:r,packedEvent:n,model:u,view:h},this.trigger(t,n)}},this)},this),I_(W_,function(t,e){this._messageCenter.on(e,function(t){this.trigger(e,t)},this)},this)},R_.isDisposed=function(){return this._disposed},R_.clear=function(){this.setOption({series:[]},!0)},R_.dispose=function(){if(!this._disposed){this._disposed=!0,Nn(this.getDom(),Q_,"");var t=this._api,e=this._model;I_(this._componentsViews,function(n){n.dispose(e,t)}),I_(this._chartsViews,function(n){n.dispose(e,t)}),this._zr.dispose(),delete j_[this.id]}},h(ja,pg),fs.prototype={constructor:fs,normalizeQuery:function(t){var e={},n={},i={};if(_(t)){var r=A_(t);e.mainType=r.main||null,e.subType=r.sub||null}else{var o=["Index","Name","Id"],a={name:1,dataIndex:1,dataType:1};d(t,function(t,r){for(var s=!1,l=0;l<o.length;l++){var u=o[l],h=r.lastIndexOf(u);if(h>0&&h===r.length-u.length){var c=r.slice(0,h);"data"!==c&&(e.mainType=c,e[u.toLowerCase()]=t,s=!0)}}a.hasOwnProperty(r)&&(n[r]=t,s=!0),s||(i[r]=t)})}return{cptQuery:e,dataQuery:n,otherQuery:i}},filter:function(t,e,n){function i(t,e,n,i){return null==t[n]||e[i||n]===t[n]}var r=this.eventInfo;if(!r)return!0;var o=r.targetEl,a=r.packedEvent,s=r.model,l=r.view;if(!s||!l)return!0;var u=e.cptQuery,h=e.dataQuery;return i(u,s,"mainType")&&i(u,s,"subType")&&i(u,s,"index","componentIndex")&&i(u,s,"name")&&i(u,s,"id")&&i(h,a,"name")&&i(h,a,"dataIndex")&&i(h,a,"dataType")&&(!l.filterForExposedEvent||l.filterForExposedEvent(t,e.otherQuery,o,a))},afterTrigger:function(){this.eventInfo=null}};var V_={},W_={},H_=[],G_=[],Z_=[],U_=[],X_={},Y_={},j_={},q_={},$_=new Date-0,K_=new Date-0,Q_="_echarts_instance_",J_=gs;bs(2e3,Jx),ys(Lx),xs(5e3,function(t){var e=N();t.eachSeries(function(t){var n=t.get("stack");if(n){var i=e.get(n)||e.set(n,[]),r=t.getData(),o={stackResultDimension:r.getCalculationInfo("stackResultDimension"),stackedOverDimension:r.getCalculationInfo("stackedOverDimension"),stackedDimension:r.getCalculationInfo("stackedDimension"),stackedByDimension:r.getCalculationInfo("stackedByDimension"),isStackedByIndex:r.getCalculationInfo("isStackedByIndex"),data:r,seriesModel:t};if(!o.stackedDimension||!o.isStackedByIndex&&!o.stackedByDimension)return;i.length&&r.setCalculationInfo("stackedOnSeries",i[i.length-1].seriesModel),i.push(o)}}),e.each(Uo)}),Ms("default",function(t,e){a(e=e||{},{text:"loading",color:"#c23531",textColor:"#000",maskColor:"rgba(255, 255, 255, 0.8)",zlevel:0});var n=new py({style:{fill:e.maskColor},zlevel:e.zlevel,z:1e4}),i=new yy({shape:{startAngle:-n_/2,endAngle:-n_/2+.1,r:10},style:{stroke:e.color,lineCap:"round",lineWidth:5},zlevel:e.zlevel,z:10001}),r=new py({style:{fill:"none",text:e.text,textPosition:"right",textDistance:10,textFill:e.textColor},zlevel:e.zlevel,z:10001});i.animateShape(!0).when(1e3,{endAngle:3*n_/2}).start("circularInOut"),i.animateShape(!0).when(1e3,{startAngle:3*n_/2}).delay(300).start("circularInOut");var o=new Jg;return o.add(i),o.add(r),o.add(n),o.resize=function(){var e=t.getWidth()/2,o=t.getHeight()/2;i.setShape({cx:e,cy:o});var a=i.shape.r;r.setShape({x:e-a,y:o-a,width:2*a,height:2*a}),n.setShape({x:0,y:0,width:t.getWidth(),height:t.getHeight()})},o.resize(),o}),_s({type:"highlight",event:"highlight",update:"highlight"},R),_s({type:"downplay",event:"downplay",update:"downplay"},R),vs("light",h_),vs("dark",d_);var tw={};ks.prototype={constructor:ks,add:function(t){return this._add=t,this},update:function(t){return this._update=t,this},remove:function(t){return this._remove=t,this},execute:function(){var t=this._old,e=this._new,n={},i=[],r=[];for(Ps(t,{},i,"_oldKeyGetter",this),Ps(e,n,r,"_newKeyGetter",this),o=0;o<t.length;o++)null!=(s=n[a=i[o]])?((u=s.length)?(1===u&&(n[a]=null),s=s.unshift()):n[a]=null,this._update&&this._update(s,o)):this._remove&&this._remove(o);for(var o=0;o<r.length;o++){var a=r[o];if(n.hasOwnProperty(a)){var s=n[a];if(null==s)continue;if(s.length)for(var l=0,u=s.length;l<u;l++)this._add&&this._add(s[l]);else this._add&&this._add(s)}}}};var ew=N(["tooltip","label","itemName","itemId","seriesName"]),nw=w,iw="e\0\0",rw={float:"undefined"==typeof Float64Array?Array:Float64Array,int:"undefined"==typeof Int32Array?Array:Int32Array,ordinal:Array,number:Array,time:Array},ow="undefined"==typeof Uint32Array?Array:Uint32Array,aw="undefined"==typeof Uint16Array?Array:Uint16Array,sw=["hasItemOption","_nameList","_idList","_invertedIndicesMap","_rawData","_chunkSize","_chunkCount","_dimValueGetter","_count","_rawCount","_nameDimIdx","_idDimIdx"],lw=["_extent","_approximateExtent","_rawExtent"],uw=function(t,e){t=t||["x","y"];for(var n={},i=[],r={},o=0;o<t.length;o++){var a=t[o];_(a)&&(a={name:a});var s=a.name;a.type=a.type||"float",a.coordDim||(a.coordDim=s,a.coordDimIndex=0),a.otherDims=a.otherDims||{},i.push(s),n[s]=a,a.index=o,a.createInvertedIndices&&(r[s]=[])}this.dimensions=i,this._dimensionInfos=n,this.hostModel=e,this.dataType,this._indices=null,this._count=0,this._rawCount=0,this._storage={},this._nameList=[],this._idList=[],this._optionModels=[],this._visual={},this._layout={},this._itemVisuals=[],this.hasItemVisual={},this._itemLayouts=[],this._graphicEls=[],this._chunkSize=1e5,this._chunkCount=0,this._rawData,this._rawExtent={},this._extent={},this._approximateExtent={},this._dimensionsSummary=Ls(this),this._invertedIndicesMap=r,this._calculationInfo={}},hw=uw.prototype;hw.type="list",hw.hasItemOption=!0,hw.getDimension=function(t){return isNaN(t)||(t=this.dimensions[t]||t),t},hw.getDimensionInfo=function(t){return this._dimensionInfos[this.getDimension(t)]},hw.getDimensionsOnCoord=function(){return this._dimensionsSummary.dataDimsOnCoord.slice()},hw.mapDimension=function(t,e){var n=this._dimensionsSummary;if(null==e)return n.encodeFirstDimNotExtra[t];var i=n.encode[t];return!0===e?(i||[]).slice():i&&i[e]},hw.initData=function(t,e,n){(oo.isInstance(t)||c(t))&&(t=new Xo(t,this.dimensions.length)),this._rawData=t,this._storage={},this._indices=null,this._nameList=e||[],this._idList=[],this._nameRepeatCount={},n||(this.hasItemOption=!1),this.defaultDimValueGetter=Nx[this._rawData.getSource().sourceFormat],this._dimValueGetter=n=n||this.defaultDimValueGetter,this._rawExtent={},this._initDataFromProvider(0,t.count()),t.pure&&(this.hasItemOption=!1)},hw.getProvider=function(){return this._rawData},hw.appendData=function(t){var e=this._rawData,n=this.count();e.appendData(t);var i=e.count();e.persistent||(i+=n),this._initDataFromProvider(n,i)},hw._initDataFromProvider=function(t,e){if(!(t>=e)){for(var n,i=this._chunkSize,r=this._rawData,o=this._storage,a=this.dimensions,s=a.length,l=this._dimensionInfos,u=this._nameList,h=this._idList,c=this._rawExtent,d=this._nameRepeatCount={},f=this._chunkCount,p=f-1,g=0;g<s;g++){c[T=a[g]]||(c[T]=[1/0,-1/0]);var m=l[T];0===m.otherDims.itemName&&(n=this._nameDimIdx=g),0===m.otherDims.itemId&&(this._idDimIdx=g);var v=rw[m.type];o[T]||(o[T]=[]);var y=o[T][p];if(y&&y.length<i){for(var x=new v(Math.min(e-p*i,i)),_=0;_<y.length;_++)x[_]=y[_];o[T][p]=x}for(I=f*i;I<e;I+=i)o[T].push(new v(Math.min(e-I,i)));this._chunkCount=o[T].length}for(var w=new Array(s),b=t;b<e;b++){w=r.getItem(b,w);for(var S=Math.floor(b/i),M=b%i,I=0;I<s;I++){var T=a[I],C=o[T][S],A=this._dimValueGetter(w,T,b,I);C[M]=A;var D=c[T];A<D[0]&&(D[0]=A),A>D[1]&&(D[1]=A)}if(!r.pure){var k=u[b];if(w&&null==k)if(null!=w.name)u[b]=k=w.name;else if(null!=n){var P=a[n],L=o[P][S];if(L){k=L[M];var O=l[P].ordinalMeta;O&&O.categories.length&&(k=O.categories[k])}}var z=null==w?null:w.id;null==z&&null!=k&&(d[k]=d[k]||0,z=k,d[k]>0&&(z+="__ec__"+d[k]),d[k]++),null!=z&&(h[b]=z)}}!r.persistent&&r.clean&&r.clean(),this._rawCount=this._count=e,this._extent={},Bs(this)}},hw.count=function(){return this._count},hw.getIndices=function(){var t=this._indices;if(t){var e=t.constructor,n=this._count;if(e===Array){i=new e(n);for(r=0;r<n;r++)i[r]=t[r]}else i=new e(t.buffer,0,n)}else for(var i=new(e=Es(this))(this.count()),r=0;r<i.length;r++)i[r]=r;return i},hw.get=function(t,e){if(!(e>=0&&e<this._count))return NaN;var n=this._storage;if(!n[t])return NaN;e=this.getRawIndex(e);var i=Math.floor(e/this._chunkSize),r=e%this._chunkSize;return n[t][i][r]},hw.getByRawIndex=function(t,e){if(!(e>=0&&e<this._rawCount))return NaN;var n=this._storage[t];if(!n)return NaN;var i=Math.floor(e/this._chunkSize),r=e%this._chunkSize;return n[i][r]},hw._getFast=function(t,e){var n=Math.floor(e/this._chunkSize),i=e%this._chunkSize;return this._storage[t][n][i]},hw.getValues=function(t,e){var n=[];y(t)||(e=t,t=this.dimensions);for(var i=0,r=t.length;i<r;i++)n.push(this.get(t[i],e));return n},hw.hasValue=function(t){for(var e=this._dimensionsSummary.dataDimsOnCoord,n=this._dimensionInfos,i=0,r=e.length;i<r;i++)if("ordinal"!==n[e[i]].type&&isNaN(this.get(e[i],t)))return!1;return!0},hw.getDataExtent=function(t){t=this.getDimension(t);var e=[1/0,-1/0];if(!this._storage[t])return e;var n,i=this.count();if(!this._indices)return this._rawExtent[t].slice();if(n=this._extent[t])return n.slice();for(var r=(n=e)[0],o=n[1],a=0;a<i;a++){var s=this._getFast(t,this.getRawIndex(a));s<r&&(r=s),s>o&&(o=s)}return n=[r,o],this._extent[t]=n,n},hw.getApproximateExtent=function(t){return t=this.getDimension(t),this._approximateExtent[t]||this.getDataExtent(t)},hw.setApproximateExtent=function(t,e){e=this.getDimension(e),this._approximateExtent[e]=t.slice()},hw.getCalculationInfo=function(t){return this._calculationInfo[t]},hw.setCalculationInfo=function(t,e){nw(t)?o(this._calculationInfo,t):this._calculationInfo[t]=e},hw.getSum=function(t){var e=0;if(this._storage[t])for(var n=0,i=this.count();n<i;n++){var r=this.get(t,n);isNaN(r)||(e+=r)}return e},hw.getMedian=function(t){var e=[];this.each(t,function(t,n){isNaN(t)||e.push(t)});var n=[].concat(e).sort(function(t,e){return t-e}),i=this.count();return 0===i?0:i%2==1?n[(i-1)/2]:(n[i/2]+n[i/2-1])/2},hw.rawIndexOf=function(t,e){var n=(t&&this._invertedIndicesMap[t])[e];return null==n||isNaN(n)?-1:n},hw.indexOfName=function(t){for(var e=0,n=this.count();e<n;e++)if(this.getName(e)===t)return e;return-1},hw.indexOfRawIndex=function(t){if(!this._indices)return t;if(t>=this._rawCount||t<0)return-1;var e=this._indices,n=e[t];if(null!=n&&n<this._count&&n===t)return t;for(var i=0,r=this._count-1;i<=r;){var o=(i+r)/2|0;if(e[o]<t)i=o+1;else{if(!(e[o]>t))return o;r=o-1}}return-1},hw.indicesOfNearest=function(t,e,n){var i=[];if(!this._storage[t])return i;null==n&&(n=1/0);for(var r=Number.MAX_VALUE,o=-1,a=0,s=this.count();a<s;a++){var l=e-this.get(t,a),u=Math.abs(l);l<=n&&u<=r&&((u<r||l>=0&&o<0)&&(r=u,o=l,i.length=0),i.push(a))}return i},hw.getRawIndex=Vs,hw.getRawDataItem=function(t){if(this._rawData.persistent)return this._rawData.getItem(this.getRawIndex(t));for(var e=[],n=0;n<this.dimensions.length;n++){var i=this.dimensions[n];e.push(this.get(i,t))}return e},hw.getName=function(t){var e=this.getRawIndex(t);return this._nameList[e]||Fs(this,this._nameDimIdx,e)||""},hw.getId=function(t){return Hs(this,this.getRawIndex(t))},hw.each=function(t,e,n,i){if(this._count){"function"==typeof t&&(i=n,n=e,e=t,t=[]),n=n||i||this;for(var r=(t=f(Gs(t),this.getDimension,this)).length,o=0;o<this.count();o++)switch(r){case 0:e.call(n,o);break;case 1:e.call(n,this.get(t[0],o),o);break;case 2:e.call(n,this.get(t[0],o),this.get(t[1],o),o);break;default:for(var a=0,s=[];a<r;a++)s[a]=this.get(t[a],o);s[a]=o,e.apply(n,s)}}},hw.filterSelf=function(t,e,n,i){if(this._count){"function"==typeof t&&(i=n,n=e,e=t,t=[]),n=n||i||this,t=f(Gs(t),this.getDimension,this);for(var r=this.count(),o=new(Es(this))(r),a=[],s=t.length,l=0,u=t[0],h=0;h<r;h++){var c,d=this.getRawIndex(h);if(0===s)c=e.call(n,h);else if(1===s){var p=this._getFast(u,d);c=e.call(n,p,h)}else{for(var g=0;g<s;g++)a[g]=this._getFast(u,d);a[g]=h,c=e.apply(n,a)}c&&(o[l++]=d)}return l<r&&(this._indices=o),this._count=l,this._extent={},this.getRawIndex=this._indices?Ws:Vs,this}},hw.selectRange=function(t){if(this._count){var e=[];for(var n in t)t.hasOwnProperty(n)&&e.push(n);var i=e.length;if(i){var r=this.count(),o=new(Es(this))(r),a=0,s=e[0],l=t[s][0],u=t[s][1],h=!1;if(!this._indices){var c=0;if(1===i){for(var d=this._storage[e[0]],f=0;f<this._chunkCount;f++)for(var p=d[f],g=Math.min(this._count-f*this._chunkSize,this._chunkSize),m=0;m<g;m++)((w=p[m])>=l&&w<=u||isNaN(w))&&(o[a++]=c),c++;h=!0}else if(2===i){for(var d=this._storage[s],v=this._storage[e[1]],y=t[e[1]][0],x=t[e[1]][1],f=0;f<this._chunkCount;f++)for(var p=d[f],_=v[f],g=Math.min(this._count-f*this._chunkSize,this._chunkSize),m=0;m<g;m++){var w=p[m],b=_[m];(w>=l&&w<=u||isNaN(w))&&(b>=y&&b<=x||isNaN(b))&&(o[a++]=c),c++}h=!0}}if(!h)if(1===i)for(m=0;m<r;m++){M=this.getRawIndex(m);((w=this._getFast(s,M))>=l&&w<=u||isNaN(w))&&(o[a++]=M)}else for(m=0;m<r;m++){for(var S=!0,M=this.getRawIndex(m),f=0;f<i;f++){var I=e[f];((w=this._getFast(n,M))<t[I][0]||w>t[I][1])&&(S=!1)}S&&(o[a++]=this.getRawIndex(m))}return a<r&&(this._indices=o),this._count=a,this._extent={},this.getRawIndex=this._indices?Ws:Vs,this}}},hw.mapArray=function(t,e,n,i){"function"==typeof t&&(i=n,n=e,e=t,t=[]),n=n||i||this;var r=[];return this.each(t,function(){r.push(e&&e.apply(this,arguments))},n),r},hw.map=function(t,e,n,i){n=n||i||this;var r=Zs(this,t=f(Gs(t),this.getDimension,this));r._indices=this._indices,r.getRawIndex=r._indices?Ws:Vs;for(var o=r._storage,a=[],s=this._chunkSize,l=t.length,u=this.count(),h=[],c=r._rawExtent,d=0;d<u;d++){for(var p=0;p<l;p++)h[p]=this.get(t[p],d);h[l]=d;var g=e&&e.apply(n,h);if(null!=g){"object"!=typeof g&&(a[0]=g,g=a);for(var m=this.getRawIndex(d),v=Math.floor(m/s),y=m%s,x=0;x<g.length;x++){var _=t[x],w=g[x],b=c[_],S=o[_];S&&(S[v][y]=w),w<b[0]&&(b[0]=w),w>b[1]&&(b[1]=w)}}}return r},hw.downSample=function(t,e,n,i){for(var r=Zs(this,[t]),o=r._storage,a=[],s=Math.floor(1/e),l=o[t],u=this.count(),h=this._chunkSize,c=r._rawExtent[t],d=new(Es(this))(u),f=0,p=0;p<u;p+=s){s>u-p&&(s=u-p,a.length=s);for(var g=0;g<s;g++){var m=this.getRawIndex(p+g),v=Math.floor(m/h),y=m%h;a[g]=l[v][y]}var x=n(a),_=this.getRawIndex(Math.min(p+i(a,x)||0,u-1)),w=_%h;l[Math.floor(_/h)][w]=x,x<c[0]&&(c[0]=x),x>c[1]&&(c[1]=x),d[f++]=_}return r._count=f,r._indices=d,r.getRawIndex=Ws,r},hw.getItemModel=function(t){var e=this.hostModel;return new Sr(this.getRawDataItem(t),e,e&&e.ecModel)},hw.diff=function(t){var e=this;return new ks(t?t.getIndices():[],this.getIndices(),function(e){return Hs(t,e)},function(t){return Hs(e,t)})},hw.getVisual=function(t){var e=this._visual;return e&&e[t]},hw.setVisual=function(t,e){if(nw(t))for(var n in t)t.hasOwnProperty(n)&&this.setVisual(n,t[n]);else this._visual=this._visual||{},this._visual[t]=e},hw.setLayout=function(t,e){if(nw(t))for(var n in t)t.hasOwnProperty(n)&&this.setLayout(n,t[n]);else this._layout[t]=e},hw.getLayout=function(t){return this._layout[t]},hw.getItemLayout=function(t){return this._itemLayouts[t]},hw.setItemLayout=function(t,e,n){this._itemLayouts[t]=n?o(this._itemLayouts[t]||{},e):e},hw.clearItemLayouts=function(){this._itemLayouts.length=0},hw.getItemVisual=function(t,e,n){var i=this._itemVisuals[t],r=i&&i[e];return null!=r||n?r:this.getVisual(e)},hw.setItemVisual=function(t,e,n){var i=this._itemVisuals[t]||{},r=this.hasItemVisual;if(this._itemVisuals[t]=i,nw(e))for(var o in e)e.hasOwnProperty(o)&&(i[o]=e[o],r[o]=!0);else i[e]=n,r[e]=!0},hw.clearAllVisual=function(){this._visual={},this._itemVisuals=[],this.hasItemVisual={}};var cw=function(t){t.seriesIndex=this.seriesIndex,t.dataIndex=this.dataIndex,t.dataType=this.dataType};hw.setItemGraphicEl=function(t,e){var n=this.hostModel;e&&(e.dataIndex=t,e.dataType=this.dataType,e.seriesIndex=n&&n.seriesIndex,"group"===e.type&&e.traverse(cw,e)),this._graphicEls[t]=e},hw.getItemGraphicEl=function(t){return this._graphicEls[t]},hw.eachItemGraphicEl=function(t,e){d(this._graphicEls,function(n,i){n&&t&&t.call(e,n,i)})},hw.cloneShallow=function(t){if(!t){var e=f(this.dimensions,this.getDimensionInfo,this);t=new uw(e,this.hostModel)}if(t._storage=this._storage,Rs(t,this),this._indices){var n=this._indices.constructor;t._indices=new n(this._indices)}else t._indices=null;return t.getRawIndex=t._indices?Ws:Vs,t},hw.wrapMethod=function(t,e){var n=this[t];"function"==typeof n&&(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(t),this[t]=function(){var t=n.apply(this,arguments);return e.apply(this,[t].concat(D(arguments)))})},hw.TRANSFERABLE_METHODS=["cloneShallow","downSample","map"],hw.CHANGABLE_METHODS=["filterSelf","selectRange"];var dw=function(t,e){return e=e||{},Ys(e.coordDimensions||[],t,{dimsDef:e.dimensionsDefine||t.dimensionsDefine,encodeDef:e.encodeDefine||t.encodeDefine,dimCount:e.dimensionsCount,generateCoord:e.generateCoord,generateCoordCount:e.generateCoordCount})};nl.prototype.parse=function(t){return t},nl.prototype.getSetting=function(t){return this._setting[t]},nl.prototype.contain=function(t){var e=this._extent;return t>=e[0]&&t<=e[1]},nl.prototype.normalize=function(t){var e=this._extent;return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])},nl.prototype.scale=function(t){var e=this._extent;return t*(e[1]-e[0])+e[0]},nl.prototype.unionExtent=function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1])},nl.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},nl.prototype.getExtent=function(){return this._extent.slice()},nl.prototype.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=t),isNaN(e)||(n[1]=e)},nl.prototype.isBlank=function(){return this._isBlank},nl.prototype.setBlank=function(t){this._isBlank=t},nl.prototype.getLabel=null,Wn(nl),Un(nl,{registerWhenExtend:!0}),il.createByAxisModel=function(t){var e=t.option,n=e.data,i=n&&f(n,ol);return new il({categories:i,needCollect:!i,deduplication:!1!==e.dedplication})};var fw=il.prototype;fw.getOrdinal=function(t){return rl(this).get(t)},fw.parseAndCollect=function(t){var e,n=this._needCollect;if("string"!=typeof t&&!n)return t;if(n&&!this._deduplication)return e=this.categories.length,this.categories[e]=t,e;var i=rl(this);return null==(e=i.get(t))&&(n?(e=this.categories.length,this.categories[e]=t,i.set(t,e)):e=NaN),e};var pw=nl.prototype,gw=nl.extend({type:"ordinal",init:function(t,e){t&&!y(t)||(t=new il({categories:t})),this._ordinalMeta=t,this._extent=e||[0,t.categories.length-1]},parse:function(t){return"string"==typeof t?this._ordinalMeta.getOrdinal(t):Math.round(t)},contain:function(t){return t=this.parse(t),pw.contain.call(this,t)&&null!=this._ordinalMeta.categories[t]},normalize:function(t){return pw.normalize.call(this,this.parse(t))},scale:function(t){return Math.round(pw.scale.call(this,t))},getTicks:function(){for(var t=[],e=this._extent,n=e[0];n<=e[1];)t.push(n),n++;return t},getLabel:function(t){if(!this.isBlank())return this._ordinalMeta.categories[t]},count:function(){return this._extent[1]-this._extent[0]+1},unionExtentFromData:function(t,e){this.unionExtent(t.getApproximateExtent(e))},getOrdinalMeta:function(){return this._ordinalMeta},niceTicks:R,niceExtent:R});gw.create=function(){return new gw};var mw=kr,vw=kr,yw=nl.extend({type:"interval",_interval:0,_intervalPrecision:2,setExtent:function(t,e){var n=this._extent;isNaN(t)||(n[0]=parseFloat(t)),isNaN(e)||(n[1]=parseFloat(e))},unionExtent:function(t){var e=this._extent;t[0]<e[0]&&(e[0]=t[0]),t[1]>e[1]&&(e[1]=t[1]),yw.prototype.setExtent.call(this,e[0],e[1])},getInterval:function(){return this._interval},setInterval:function(t){this._interval=t,this._niceExtent=this._extent.slice(),this._intervalPrecision=sl(t)},getTicks:function(){return hl(this._interval,this._extent,this._niceExtent,this._intervalPrecision)},getLabel:function(t,e){if(null==t)return"";var n=e&&e.precision;return null==n?n=Or(t)||0:"auto"===n&&(n=this._intervalPrecision),t=vw(t,n,!0),Hr(t)},niceTicks:function(t,e,n){t=t||5;var i=this._extent,r=i[1]-i[0];if(isFinite(r)){r<0&&(r=-r,i.reverse());var o=al(i,t,e,n);this._intervalPrecision=o.intervalPrecision,this._interval=o.interval,this._niceExtent=o.niceTickExtent}},niceExtent:function(t){var e=this._extent;if(e[0]===e[1])if(0!==e[0]){var n=e[0];t.fixMax?e[0]-=n/2:(e[1]+=n/2,e[0]-=n/2)}else e[1]=1;var i=e[1]-e[0];isFinite(i)||(e[0]=0,e[1]=1),this.niceTicks(t.splitNumber,t.minInterval,t.maxInterval);var r=this._interval;t.fixMin||(e[0]=vw(Math.floor(e[0]/r)*r)),t.fixMax||(e[1]=vw(Math.ceil(e[1]/r)*r))}});yw.create=function(){return new yw};var xw="__ec_stack_",_w="undefined"!=typeof Float32Array?Float32Array:Array,ww={seriesType:"bar",plan:Ux(),reset:function(t){if(vl(t)&&yl(t)){var e=t.getData(),n=t.coordinateSystem,i=n.getBaseAxis(),r=n.getOtherAxis(i),o=e.mapDimension(r.dim),a=e.mapDimension(i.dim),s=r.isHorizontal(),l=s?0:1,u=ml(pl([t]),i,t).width;return u>.5||(u=.5),{progress:function(t,e){for(var i,h=new _w(2*t.count),c=[],d=[],f=0;null!=(i=t.next());)d[l]=e.get(o,i),d[1-l]=e.get(a,i),c=n.dataToPoint(d,null,c),h[f++]=c[0],h[f++]=c[1];e.setLayout({largePoints:h,barWidth:u,valueAxisStart:xl(0,r),valueAxisHorizontal:s})}}}}},bw=yw.prototype,Sw=Math.ceil,Mw=Math.floor,Iw=function(t,e,n,i){for(;n<i;){var r=n+i>>>1;t[r][1]<e?n=r+1:i=r}return n},Tw=yw.extend({type:"time",getLabel:function(t){var e=this._stepLvl,n=new Date(t);return jr(e[0],n,this.getSetting("useUTC"))},niceExtent:function(t){var e=this._extent;if(e[0]===e[1]&&(e[0]-=864e5,e[1]+=864e5),e[1]===-1/0&&e[0]===1/0){var n=new Date;e[1]=+new Date(n.getFullYear(),n.getMonth(),n.getDate()),e[0]=e[1]-864e5}this.niceTicks(t.splitNumber,t.minInterval,t.maxInterval);var i=this._interval;t.fixMin||(e[0]=kr(Mw(e[0]/i)*i)),t.fixMax||(e[1]=kr(Sw(e[1]/i)*i))},niceTicks:function(t,e,n){t=t||10;var i=this._extent,r=i[1]-i[0],o=r/t;null!=e&&o<e&&(o=e),null!=n&&o>n&&(o=n);var a=Cw.length,s=Iw(Cw,o,0,a),l=Cw[Math.min(s,a-1)],u=l[1];"year"===l[0]&&(u*=Wr(r/u/t,!0));var h=this.getSetting("useUTC")?0:60*new Date(+i[0]||+i[1]).getTimezoneOffset()*1e3,c=[Math.round(Sw((i[0]-h)/u)*u+h),Math.round(Mw((i[1]-h)/u)*u+h)];ul(c,i),this._stepLvl=l,this._interval=u,this._niceExtent=c},parse:function(t){return+Br(t)}});d(["contain","normalize"],function(t){Tw.prototype[t]=function(e){return bw[t].call(this,this.parse(e))}});var Cw=[["hh:mm:ss",1e3],["hh:mm:ss",5e3],["hh:mm:ss",1e4],["hh:mm:ss",15e3],["hh:mm:ss",3e4],["hh:mm\nMM-dd",6e4],["hh:mm\nMM-dd",3e5],["hh:mm\nMM-dd",6e5],["hh:mm\nMM-dd",9e5],["hh:mm\nMM-dd",18e5],["hh:mm\nMM-dd",36e5],["hh:mm\nMM-dd",72e5],["hh:mm\nMM-dd",216e5],["hh:mm\nMM-dd",432e5],["MM-dd\nyyyy",864e5],["MM-dd\nyyyy",1728e5],["MM-dd\nyyyy",2592e5],["MM-dd\nyyyy",3456e5],["MM-dd\nyyyy",432e6],["MM-dd\nyyyy",5184e5],["week",6048e5],["MM-dd\nyyyy",864e6],["week",12096e5],["week",18144e5],["month",26784e5],["week",36288e5],["month",53568e5],["week",6048e6],["quarter",8208e6],["month",107136e5],["month",13392e6],["half-year",16416e6],["month",214272e5],["month",26784e6],["year",32832e6]];Tw.create=function(t){return new Tw({useUTC:t.ecModel.get("useUTC")})};var Aw=nl.prototype,Dw=yw.prototype,kw=Or,Pw=kr,Lw=Math.floor,Ow=Math.ceil,zw=Math.pow,Ew=Math.log,Nw=nl.extend({type:"log",base:10,$constructor:function(){nl.apply(this,arguments),this._originalScale=new yw},getTicks:function(){var t=this._originalScale,e=this._extent,n=t.getExtent();return f(Dw.getTicks.call(this),function(i){var r=kr(zw(this.base,i));return r=i===e[0]&&t.__fixMin?_l(r,n[0]):r,r=i===e[1]&&t.__fixMax?_l(r,n[1]):r},this)},getLabel:Dw.getLabel,scale:function(t){return t=Aw.scale.call(this,t),zw(this.base,t)},setExtent:function(t,e){var n=this.base;t=Ew(t)/Ew(n),e=Ew(e)/Ew(n),Dw.setExtent.call(this,t,e)},getExtent:function(){var t=this.base,e=Aw.getExtent.call(this);e[0]=zw(t,e[0]),e[1]=zw(t,e[1]);var n=this._originalScale,i=n.getExtent();return n.__fixMin&&(e[0]=_l(e[0],i[0])),n.__fixMax&&(e[1]=_l(e[1],i[1])),e},unionExtent:function(t){this._originalScale.unionExtent(t);var e=this.base;t[0]=Ew(t[0])/Ew(e),t[1]=Ew(t[1])/Ew(e),Aw.unionExtent.call(this,t)},unionExtentFromData:function(t,e){this.unionExtent(t.getApproximateExtent(e))},niceTicks:function(t){t=t||10;var e=this._extent,n=e[1]-e[0];if(!(n===1/0||n<=0)){var i=Fr(n);for(t/n*i<=.5&&(i*=10);!isNaN(i)&&Math.abs(i)<1&&Math.abs(i)>0;)i*=10;var r=[kr(Ow(e[0]/i)*i),kr(Lw(e[1]/i)*i)];this._interval=i,this._niceExtent=r}},niceExtent:function(t){Dw.niceExtent.call(this,t);var e=this._originalScale;e.__fixMin=t.fixMin,e.__fixMax=t.fixMax}});d(["contain","normalize"],function(t){Nw.prototype[t]=function(e){return e=Ew(e)/Ew(this.base),Aw[t].call(this,e)}}),Nw.create=function(){return new Nw};var Rw={getMin:function(t){var e=this.option,n=t||null==e.rangeStart?e.min:e.rangeStart;return this.axis&&null!=n&&"dataMin"!==n&&"function"!=typeof n&&!I(n)&&(n=this.axis.scale.parse(n)),n},getMax:function(t){var e=this.option,n=t||null==e.rangeEnd?e.max:e.rangeEnd;return this.axis&&null!=n&&"dataMax"!==n&&"function"!=typeof n&&!I(n)&&(n=this.axis.scale.parse(n)),n},getNeedCrossZero:function(){var t=this.option;return null==t.rangeStart&&null==t.rangeEnd&&!t.scale},getCoordSysModel:R,setRange:function(t,e){this.option.rangeStart=t,this.option.rangeEnd=e},resetRange:function(){this.option.rangeStart=this.option.rangeEnd=null}},Bw=Ei({type:"triangle",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,o=e.height/2;t.moveTo(n,i-o),t.lineTo(n+r,i+o),t.lineTo(n-r,i+o),t.closePath()}}),Fw=Ei({type:"diamond",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,o=e.height/2;t.moveTo(n,i-o),t.lineTo(n+r,i),t.lineTo(n,i+o),t.lineTo(n-r,i),t.closePath()}}),Vw=Ei({type:"pin",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.x,i=e.y,r=e.width/5*3,o=Math.max(r,e.height),a=r/2,s=a*a/(o-a),l=i-o+a+s,u=Math.asin(s/a),h=Math.cos(u)*a,c=Math.sin(u),d=Math.cos(u),f=.6*a,p=.7*a;t.moveTo(n-h,l+s),t.arc(n,l,a,Math.PI-u,2*Math.PI+u),t.bezierCurveTo(n+h-c*f,l+s+d*f,n,i-p,n,i),t.bezierCurveTo(n,i-p,n-h+c*f,l+s+d*f,n-h,l+s),t.closePath()}}),Ww=Ei({type:"arrow",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.height,i=e.width,r=e.x,o=e.y,a=i/3*2;t.moveTo(r,o),t.lineTo(r+a,o+n),t.lineTo(r,o+n/4*3),t.lineTo(r-a,o+n),t.lineTo(r,o),t.closePath()}}),Hw={line:function(t,e,n,i,r){r.x1=t,r.y1=e+i/2,r.x2=t+n,r.y2=e+i/2},rect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i},roundRect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i,r.r=Math.min(n,i)/4},square:function(t,e,n,i,r){var o=Math.min(n,i);r.x=t,r.y=e,r.width=o,r.height=o},circle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.r=Math.min(n,i)/2},diamond:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i},pin:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},arrow:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},triangle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i}},Gw={};d({line:gy,rect:py,roundRect:py,square:py,circle:oy,diamond:Fw,pin:Vw,arrow:Ww,triangle:Bw},function(t,e){Gw[e]=new t});var Zw=Ei({type:"symbol",shape:{symbolType:"",x:0,y:0,width:0,height:0},beforeBrush:function(){var t=this.style;"pin"===this.shape.symbolType&&"inside"===t.textPosition&&(t.textPosition=["50%","40%"],t.textAlign="center",t.textVerticalAlign="middle")},buildPath:function(t,e,n){var i=e.symbolType,r=Gw[i];"none"!==e.symbolType&&(r||(r=Gw[i="rect"]),Hw[i](e.x,e.y,e.width,e.height,r.shape),r.buildPath(t,r.shape,n))}}),Uw={isDimensionStacked:Ks,enableDataStack:$s,getStackedDimension:Qs},Xw=(Object.freeze||Object)({createList:function(t){return Js(t.getSource(),t)},getLayoutRect:Kr,dataStack:Uw,createScale:function(t,e){var n=e;Sr.isInstance(e)||h(n=new Sr(e),Rw);var i=Ml(n);return i.setExtent(t[0],t[1]),Sl(i,n),i},mixinAxisModelCommonMethods:function(t){h(t,Rw)},completeDimensions:Ys,createDimensions:dw,createSymbol:Pl}),Yw=1e-8;zl.prototype={constructor:zl,properties:null,getBoundingRect:function(){var t=this._rect;if(t)return t;for(var e=Number.MAX_VALUE,n=[e,e],i=[-e,-e],r=[],o=[],a=this.geometries,s=0;s<a.length;s++)"polygon"===a[s].type&&(ai(a[s].exterior,r,o),K(n,n,r),Q(i,i,o));return 0===s&&(n[0]=n[1]=i[0]=i[1]=0),this._rect=new re(n[0],n[1],i[0]-n[0],i[1]-n[1])},contain:function(t){var e=this.getBoundingRect(),n=this.geometries;if(!e.contain(t[0],t[1]))return!1;t:for(var i=0,r=n.length;i<r;i++)if("polygon"===n[i].type){var o=n[i].exterior,a=n[i].interiors;if(Ol(o,t[0],t[1])){for(var s=0;s<(a?a.length:0);s++)if(Ol(a[s]))continue t;return!0}}return!1},transformTo:function(t,e,n,i){var r=this.getBoundingRect(),o=r.width/r.height;n?i||(i=n/o):n=o*i;for(var a=new re(t,e,n,i),s=r.calculateTransform(a),l=this.geometries,u=0;u<l.length;u++)if("polygon"===l[u].type){for(var h=l[u].exterior,c=l[u].interiors,d=0;d<h.length;d++)$(h[d],h[d],s);for(var f=0;f<(c?c.length:0);f++)for(d=0;d<c[f].length;d++)$(c[f][d],c[f][d],s)}(r=this._rect).copy(a),this.center=[r.x+r.width/2,r.y+r.height/2]},cloneShallow:function(t){null==t&&(t=this.name);var e=new zl(t,this.geometries,this.center);return e._rect=this._rect,e.transformTo=null,e}};var jw=function(t){return El(t),f(g(t.features,function(t){return t.geometry&&t.properties&&t.geometry.coordinates.length>0}),function(t){var e=t.properties,n=t.geometry,i=n.coordinates,r=[];"Polygon"===n.type&&r.push({type:"polygon",exterior:i[0],interiors:i.slice(1)}),"MultiPolygon"===n.type&&d(i,function(t){t[0]&&r.push({type:"polygon",exterior:t[0],interiors:t.slice(1)})});var o=new zl(e.name,r,e.cp);return o.properties=e,o})},qw=On(),$w=[0,1],Kw=function(t,e,n){this.dim=t,this.scale=e,this._extent=n||[0,0],this.inverse=!1,this.onBand=!1};Kw.prototype={constructor:Kw,contain:function(t){var e=this._extent,n=Math.min(e[0],e[1]),i=Math.max(e[0],e[1]);return t>=n&&t<=i},containData:function(t){return this.contain(this.dataToCoord(t))},getExtent:function(){return this._extent.slice()},getPixelPrecision:function(t){return zr(t||this.scale.getExtent(),this._extent)},setExtent:function(t,e){var n=this._extent;n[0]=t,n[1]=e},dataToCoord:function(t,e){var n=this._extent,i=this.scale;return t=i.normalize(t),this.onBand&&"ordinal"===i.type&&Ql(n=n.slice(),i.count()),Ar(t,$w,n,e)},coordToData:function(t,e){var n=this._extent,i=this.scale;this.onBand&&"ordinal"===i.type&&Ql(n=n.slice(),i.count());var r=Ar(t,n,$w,e);return this.scale.scale(r)},pointToData:function(t,e){},getTicksCoords:function(t){var e=(t=t||{}).tickModel||this.getTickModel(),n=Bl(this,e),i=f(n.ticks,function(t){return{coord:this.dataToCoord(t),tickValue:t}},this),r=e.get("alignWithLabel");return Jl(this,i,n.tickCategoryInterval,r,t.clamp),i},getViewLabels:function(){return Rl(this).labels},getLabelModel:function(){return this.model.getModel("axisLabel")},getTickModel:function(){return this.model.getModel("axisTick")},getBandWidth:function(){var t=this._extent,e=this.scale.getExtent(),n=e[1]-e[0]+(this.onBand?1:0);0===n&&(n=1);var i=Math.abs(t[1]-t[0]);return Math.abs(i)/n},isHorizontal:null,getRotate:null,calculateCategoryInterval:function(){return Yl(this)}};var Qw=jw,Jw={};d(["map","each","filter","indexOf","inherits","reduce","filter","bind","curry","isArray","isString","isObject","isFunction","extend","defaults","clone","merge"],function(t){Jw[t]=ag[t]});var tb={};d(["extendShape","extendPath","makePath","makeImage","mergePath","resizePath","createIcon","setHoverStyle","setLabelStyle","setTextStyle","setText","getFont","updateProps","initProps","getTransform","clipPointsByRect","clipRectByRect","Group","Image","Text","Circle","Sector","Ring","Polygon","Polyline","Rect","Line","BezierCurve","Arc","IncrementalDisplayable","CompoundPath","LinearGradient","RadialGradient","BoundingRect"],function(t){tb[t]=ky[t]}),Hx.extend({type:"series.line",dependencies:["grid","polar"],getInitialData:function(t,e){return Js(this.getSource(),this)},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,hoverAnimation:!0,clipOverflow:!0,label:{position:"top"},lineStyle:{width:2,type:"solid"},step:!1,smooth:!1,smoothMonotone:null,symbol:"emptyCircle",symbolSize:4,symbolRotate:null,showSymbol:!0,showAllSymbol:"auto",connectNulls:!1,sampling:"none",animationEasing:"linear",progressive:0,hoverLayerThreshold:1/0}});var eb=eu.prototype,nb=eu.getSymbolSize=function(t,e){var n=t.getItemVisual(e,"symbolSize");return n instanceof Array?n.slice():[+n,+n]};eb._createSymbol=function(t,e,n,i,r){this.removeAll();var o=Pl(t,-1,-1,2,2,e.getItemVisual(n,"color"),r);o.attr({z2:100,culling:!0,scale:nu(i)}),o.drift=iu,this._symbolType=t,this.add(o)},eb.stopSymbolAnimation=function(t){this.childAt(0).stopAnimation(t)},eb.getSymbolPath=function(){return this.childAt(0)},eb.getScale=function(){return this.childAt(0).scale},eb.highlight=function(){this.childAt(0).trigger("emphasis")},eb.downplay=function(){this.childAt(0).trigger("normal")},eb.setZ=function(t,e){var n=this.childAt(0);n.zlevel=t,n.z=e},eb.setDraggable=function(t){var e=this.childAt(0);e.draggable=t,e.cursor=t?"move":"pointer"},eb.updateData=function(t,e,n){this.silent=!1;var i=t.getItemVisual(e,"symbol")||"circle",r=t.hostModel,o=nb(t,e),a=i!==this._symbolType;if(a){var s=t.getItemVisual(e,"symbolKeepAspect");this._createSymbol(i,t,e,o,s)}else(l=this.childAt(0)).silent=!1,gr(l,{scale:nu(o)},r,e);if(this._updateCommon(t,e,o,n),a){var l=this.childAt(0),u=n&&n.fadeIn,h={scale:l.scale.slice()};u&&(h.style={opacity:l.style.opacity}),l.scale=[0,0],u&&(l.style.opacity=0),mr(l,h,r,e)}this._seriesModel=r};var ib=["itemStyle"],rb=["emphasis","itemStyle"],ob=["label"],ab=["emphasis","label"];eb._updateCommon=function(t,e,n,i){var r=this.childAt(0),a=t.hostModel,s=t.getItemVisual(e,"color");"image"!==r.type&&r.useStyle({strokeNoScale:!0});var l=i&&i.itemStyle,u=i&&i.hoverItemStyle,h=i&&i.symbolRotate,c=i&&i.symbolOffset,d=i&&i.labelModel,f=i&&i.hoverLabelModel,p=i&&i.hoverAnimation,g=i&&i.cursorStyle;if(!i||t.hasItemOption){var m=i&&i.itemModel?i.itemModel:t.getItemModel(e);l=m.getModel(ib).getItemStyle(["color"]),u=m.getModel(rb).getItemStyle(),h=m.getShallow("symbolRotate"),c=m.getShallow("symbolOffset"),d=m.getModel(ob),f=m.getModel(ab),p=m.getShallow("hoverAnimation"),g=m.getShallow("cursor")}else u=o({},u);var v=r.style;r.attr("rotation",(h||0)*Math.PI/180||0),c&&r.attr("position",[Dr(c[0],n[0]),Dr(c[1],n[1])]),g&&r.attr("cursor",g),r.setColor(s,i&&i.symbolInnerColor),r.setStyle(l);var y=t.getItemVisual(e,"opacity");null!=y&&(v.opacity=y);var x=t.getItemVisual(e,"liftZ"),_=r.__z2Origin;null!=x?null==_&&(r.__z2Origin=r.z2,r.z2+=x):null!=_&&(r.z2=_,r.__z2Origin=null);var w=i&&i.useNameLabel;or(v,u,d,f,{labelFetcher:a,labelDataIndex:e,defaultText:function(e,n){return w?t.getName(e):tu(t,e)},isRectText:!0,autoColor:s}),r.off("mouseover").off("mouseout").off("emphasis").off("normal"),r.hoverStyle=u,ir(r),r.__symbolOriginalScale=nu(n),p&&a.isAnimationEnabled()&&r.on("mouseover",ru).on("mouseout",ou).on("emphasis",au).on("normal",su)},eb.fadeOut=function(t,e){var n=this.childAt(0);this.silent=n.silent=!0,!(e&&e.keepLabel)&&(n.style.text=null),gr(n,{style:{opacity:0},scale:[0,0]},this._seriesModel,this.dataIndex,t)},u(eu,Jg);var sb=lu.prototype;sb.updateData=function(t,e){e=hu(e);var n=this.group,i=t.hostModel,r=this._data,o=this._symbolCtor,a=cu(t);r||n.removeAll(),t.diff(r).add(function(i){var r=t.getItemLayout(i);if(uu(t,r,i,e)){var s=new o(t,i,a);s.attr("position",r),t.setItemGraphicEl(i,s),n.add(s)}}).update(function(s,l){var u=r.getItemGraphicEl(l),h=t.getItemLayout(s);uu(t,h,s,e)?(u?(u.updateData(t,s,a),gr(u,{position:h},i)):(u=new o(t,s)).attr("position",h),n.add(u),t.setItemGraphicEl(s,u)):n.remove(u)}).remove(function(t){var e=r.getItemGraphicEl(t);e&&e.fadeOut(function(){n.remove(e)})}).execute(),this._data=t},sb.isPersistent=function(){return!0},sb.updateLayout=function(){var t=this._data;t&&t.eachItemGraphicEl(function(e,n){var i=t.getItemLayout(n);e.attr("position",i)})},sb.incrementalPrepareUpdate=function(t){this._seriesScope=cu(t),this._data=null,this.group.removeAll()},sb.incrementalUpdate=function(t,e,n){n=hu(n);for(var i=t.start;i<t.end;i++){var r=e.getItemLayout(i);if(uu(e,r,i,n)){var o=new this._symbolCtor(e,i,this._seriesScope);o.traverse(function(t){t.isGroup||(t.incremental=t.useHoverLayer=!0)}),o.attr("position",r),this.group.add(o),e.setItemGraphicEl(i,o)}}},sb.remove=function(t){var e=this.group,n=this._data;n&&t?n.eachItemGraphicEl(function(t){t.fadeOut(function(){e.remove(t)})}):e.removeAll()};var lb=function(t,e,n,i,r,o,a,s){for(var l=gu(t,e),u=[],h=[],c=[],d=[],f=[],p=[],g=[],m=du(r,e,a),v=du(o,t,s),y=0;y<l.length;y++){var x=l[y],_=!0;switch(x.cmd){case"=":var w=t.getItemLayout(x.idx),b=e.getItemLayout(x.idx1);(isNaN(w[0])||isNaN(w[1]))&&(w=b.slice()),u.push(w),h.push(b),c.push(n[x.idx]),d.push(i[x.idx1]),g.push(e.getRawIndex(x.idx1));break;case"+":S=x.idx;u.push(r.dataToPoint([e.get(m.dataDimsForPoint[0],S),e.get(m.dataDimsForPoint[1],S)])),h.push(e.getItemLayout(S).slice()),c.push(pu(m,r,e,S)),d.push(i[S]),g.push(e.getRawIndex(S));break;case"-":var S=x.idx,M=t.getRawIndex(S);M!==S?(u.push(t.getItemLayout(S)),h.push(o.dataToPoint([t.get(v.dataDimsForPoint[0],S),t.get(v.dataDimsForPoint[1],S)])),c.push(n[S]),d.push(pu(v,o,t,S)),g.push(M)):_=!1}_&&(f.push(x),p.push(p.length))}p.sort(function(t,e){return g[t]-g[e]});for(var I=[],T=[],C=[],A=[],D=[],y=0;y<p.length;y++){S=p[y];I[y]=u[S],T[y]=h[S],C[y]=c[S],A[y]=d[S],D[y]=f[S]}return{current:I,next:T,stackedOnCurrent:C,stackedOnNext:A,status:D}},ub=K,hb=Q,cb=H,db=F,fb=[],pb=[],gb=[],mb=Ii.extend({type:"ec-polyline",shape:{points:[],smooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},style:{fill:null,stroke:"#000"},brush:sy(Ii.prototype.brush),buildPath:function(t,e){var n=e.points,i=0,r=n.length,o=_u(n,e.smoothConstraint);if(e.connectNulls){for(;r>0&&mu(n[r-1]);r--);for(;i<r&&mu(n[i]);i++);}for(;i<r;)i+=vu(t,n,i,r,r,1,o.min,o.max,e.smooth,e.smoothMonotone,e.connectNulls)+1}}),vb=Ii.extend({type:"ec-polygon",shape:{points:[],stackedOnPoints:[],smooth:0,stackedOnSmooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},brush:sy(Ii.prototype.brush),buildPath:function(t,e){var n=e.points,i=e.stackedOnPoints,r=0,o=n.length,a=e.smoothMonotone,s=_u(n,e.smoothConstraint),l=_u(i,e.smoothConstraint);if(e.connectNulls){for(;o>0&&mu(n[o-1]);o--);for(;r<o&&mu(n[r]);r++);}for(;r<o;){var u=vu(t,n,r,o,o,1,s.min,s.max,e.smooth,a,e.connectNulls);vu(t,i,r+u-1,u,o,-1,l.min,l.max,e.stackedOnSmooth,a,e.connectNulls),r+=u+1,t.closePath()}}});fa.extend({type:"line",init:function(){var t=new Jg,e=new lu;this.group.add(e.group),this._symbolDraw=e,this._lineGroup=t},render:function(t,e,n){var i=t.coordinateSystem,r=this.group,o=t.getData(),s=t.getModel("lineStyle"),l=t.getModel("areaStyle"),u=o.mapArray(o.getItemLayout),h="polar"===i.type,c=this._coordSys,d=this._symbolDraw,f=this._polyline,p=this._polygon,g=this._lineGroup,m=t.get("animation"),v=!l.isEmpty(),y=l.get("origin"),x=Mu(i,o,du(i,o,y)),_=t.get("showSymbol"),w=_&&!h&&ku(t,o,i),b=this._data;b&&b.eachItemGraphicEl(function(t,e){t.__temp&&(r.remove(t),b.setItemGraphicEl(e,null))}),_||d.remove(),r.add(g);var S=!h&&t.get("step");f&&c.type===i.type&&S===this._step?(v&&!p?p=this._newPolygon(u,x,i,m):p&&!v&&(g.remove(p),p=this._polygon=null),g.setClipPath(Cu(i,!1,!1,t)),_&&d.updateData(o,{isIgnore:w,clipShape:Cu(i,!1,!0,t)}),o.eachItemGraphicEl(function(t){t.stopAnimation(!0)}),wu(this._stackedOnPoints,x)&&wu(this._points,u)||(m?this._updateAnimation(o,x,i,n,S,y):(S&&(u=Au(u,i,S),x=Au(x,i,S)),f.setShape({points:u}),p&&p.setShape({points:u,stackedOnPoints:x})))):(_&&d.updateData(o,{isIgnore:w,clipShape:Cu(i,!1,!0,t)}),S&&(u=Au(u,i,S),x=Au(x,i,S)),f=this._newPolyline(u,i,m),v&&(p=this._newPolygon(u,x,i,m)),g.setClipPath(Cu(i,!0,!1,t)));var M=Du(o,i)||o.getVisual("color");f.useStyle(a(s.getLineStyle(),{fill:"none",stroke:M,lineJoin:"bevel"}));var I=t.get("smooth");if(I=bu(t.get("smooth")),f.setShape({smooth:I,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")}),p){var T=o.getCalculationInfo("stackedOnSeries"),C=0;p.useStyle(a(l.getAreaStyle(),{fill:M,opacity:.7,lineJoin:"bevel"})),T&&(C=bu(T.get("smooth"))),p.setShape({smooth:I,stackedOnSmooth:C,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")})}this._data=o,this._coordSys=i,this._stackedOnPoints=x,this._points=u,this._step=S,this._valueOrigin=y},dispose:function(){},highlight:function(t,e,n,i){var r=t.getData(),o=Ln(r,i);if(!(o instanceof Array)&&null!=o&&o>=0){var a=r.getItemGraphicEl(o);if(!a){var s=r.getItemLayout(o);if(!s)return;(a=new eu(r,o)).position=s,a.setZ(t.get("zlevel"),t.get("z")),a.ignore=isNaN(s[0])||isNaN(s[1]),a.__temp=!0,r.setItemGraphicEl(o,a),a.stopSymbolAnimation(!0),this.group.add(a)}a.highlight()}else fa.prototype.highlight.call(this,t,e,n,i)},downplay:function(t,e,n,i){var r=t.getData(),o=Ln(r,i);if(null!=o&&o>=0){var a=r.getItemGraphicEl(o);a&&(a.__temp?(r.setItemGraphicEl(o,null),this.group.remove(a)):a.downplay())}else fa.prototype.downplay.call(this,t,e,n,i)},_newPolyline:function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new mb({shape:{points:t},silent:!0,z2:10}),this._lineGroup.add(e),this._polyline=e,e},_newPolygon:function(t,e){var n=this._polygon;return n&&this._lineGroup.remove(n),n=new vb({shape:{points:t,stackedOnPoints:e},silent:!0}),this._lineGroup.add(n),this._polygon=n,n},_updateAnimation:function(t,e,n,i,r,o){var a=this._polyline,s=this._polygon,l=t.hostModel,u=lb(this._data,t,this._stackedOnPoints,e,this._coordSys,n,this._valueOrigin,o),h=u.current,c=u.stackedOnCurrent,d=u.next,f=u.stackedOnNext;r&&(h=Au(u.current,n,r),c=Au(u.stackedOnCurrent,n,r),d=Au(u.next,n,r),f=Au(u.stackedOnNext,n,r)),a.shape.__points=u.current,a.shape.points=h,gr(a,{shape:{points:d}},l),s&&(s.setShape({points:h,stackedOnPoints:c}),gr(s,{shape:{points:d,stackedOnPoints:f}},l));for(var p=[],g=u.status,m=0;m<g.length;m++)if("="===g[m].cmd){var v=t.getItemGraphicEl(g[m].idx1);v&&p.push({el:v,ptIdx:m})}a.animators&&a.animators.length&&a.animators[0].during(function(){for(var t=0;t<p.length;t++)p[t].el.attr("position",a.shape.__points[p[t].ptIdx])})},remove:function(t){var e=this.group,n=this._data;this._lineGroup.removeAll(),this._symbolDraw.remove(!0),n&&n.eachItemGraphicEl(function(t,i){t.__temp&&(e.remove(t),n.setItemGraphicEl(i,null))}),this._polyline=this._polygon=this._coordSys=this._points=this._stackedOnPoints=this._data=null}});var yb=function(t,e,n){return{seriesType:t,performRawSeries:!0,reset:function(t,i,r){var o=t.getData(),a=t.get("symbol")||e,s=t.get("symbolSize"),l=t.get("symbolKeepAspect");if(o.setVisual({legendSymbol:n||a,symbol:a,symbolSize:s,symbolKeepAspect:l}),!i.isSeriesFiltered(t)){var u="function"==typeof s;return{dataEach:o.hasItemOption||u?function(e,n){if("function"==typeof s){var i=t.getRawValue(n),r=t.getDataParams(n);e.setItemVisual(n,"symbolSize",s(i,r))}if(e.hasItemOption){var o=e.getItemModel(n),a=o.getShallow("symbol",!0),l=o.getShallow("symbolSize",!0),u=o.getShallow("symbolKeepAspect",!0);null!=a&&e.setItemVisual(n,"symbol",a),null!=l&&e.setItemVisual(n,"symbolSize",l),null!=u&&e.setItemVisual(n,"symbolKeepAspect",u)}}:null}}}}},xb=function(t){return{seriesType:t,plan:Ux(),reset:function(t){var e=t.getData(),n=t.coordinateSystem,i=t.pipelineContext.large;if(n){var r=f(n.dimensions,function(t){return e.mapDimension(t)}).slice(0,2),o=r.length,a=e.getCalculationInfo("stackResultDimension");return Ks(e,r[0])&&(r[0]=a),Ks(e,r[1])&&(r[1]=a),o&&{progress:function(t,e){for(var a=t.end-t.start,s=i&&new Float32Array(a*o),l=t.start,u=0,h=[],c=[];l<t.end;l++){var d;if(1===o)f=e.get(r[0],l),d=!isNaN(f)&&n.dataToPoint(f,null,c);else{var f=h[0]=e.get(r[0],l),p=h[1]=e.get(r[1],l);d=!isNaN(f)&&!isNaN(p)&&n.dataToPoint(h,null,c)}i?(s[u++]=d?d[0]:NaN,s[u++]=d?d[1]:NaN):e.setItemLayout(l,d&&d.slice()||[NaN,NaN])}i&&e.setLayout("symbolPoints",s)}}}}}},_b={average:function(t){for(var e=0,n=0,i=0;i<t.length;i++)isNaN(t[i])||(e+=t[i],n++);return 0===n?NaN:e/n},sum:function(t){for(var e=0,n=0;n<t.length;n++)e+=t[n]||0;return e},max:function(t){for(var e=-1/0,n=0;n<t.length;n++)t[n]>e&&(e=t[n]);return isFinite(e)?e:NaN},min:function(t){for(var e=1/0,n=0;n<t.length;n++)t[n]<e&&(e=t[n]);return isFinite(e)?e:NaN},nearest:function(t){return t[0]}},wb=function(t,e){return Math.round(t.length/2)},bb=function(t){this._axes={},this._dimList=[],this.name=t||""};bb.prototype={constructor:bb,type:"cartesian",getAxis:function(t){return this._axes[t]},getAxes:function(){return f(this._dimList,Lu,this)},getAxesByScale:function(t){return t=t.toLowerCase(),g(this.getAxes(),function(e){return e.scale.type===t})},addAxis:function(t){var e=t.dim;this._axes[e]=t,this._dimList.push(e)},dataToCoord:function(t){return this._dataCoordConvert(t,"dataToCoord")},coordToData:function(t){return this._dataCoordConvert(t,"coordToData")},_dataCoordConvert:function(t,e){for(var n=this._dimList,i=t instanceof Array?[]:{},r=0;r<n.length;r++){var o=n[r],a=this._axes[o];i[o]=a[e](t[o])}return i}},Ou.prototype={constructor:Ou,type:"cartesian2d",dimensions:["x","y"],getBaseAxis:function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAxis("x")},containPoint:function(t){var e=this.getAxis("x"),n=this.getAxis("y");return e.contain(e.toLocalCoord(t[0]))&&n.contain(n.toLocalCoord(t[1]))},containData:function(t){return this.getAxis("x").containData(t[0])&&this.getAxis("y").containData(t[1])},dataToPoint:function(t,e,n){var i=this.getAxis("x"),r=this.getAxis("y");return n=n||[],n[0]=i.toGlobalCoord(i.dataToCoord(t[0])),n[1]=r.toGlobalCoord(r.dataToCoord(t[1])),n},clampData:function(t,e){var n=this.getAxis("x").scale,i=this.getAxis("y").scale,r=n.getExtent(),o=i.getExtent(),a=n.parse(t[0]),s=i.parse(t[1]);return e=e||[],e[0]=Math.min(Math.max(Math.min(r[0],r[1]),a),Math.max(r[0],r[1])),e[1]=Math.min(Math.max(Math.min(o[0],o[1]),s),Math.max(o[0],o[1])),e},pointToData:function(t,e){var n=this.getAxis("x"),i=this.getAxis("y");return e=e||[],e[0]=n.coordToData(n.toLocalCoord(t[0])),e[1]=i.coordToData(i.toLocalCoord(t[1])),e},getOtherAxis:function(t){return this.getAxis("x"===t.dim?"y":"x")}},u(Ou,bb);var Sb=function(t,e,n,i,r){Kw.call(this,t,e,n),this.type=i||"value",this.position=r||"bottom"};Sb.prototype={constructor:Sb,index:0,getAxesOnZeroOf:null,model:null,isHorizontal:function(){var t=this.position;return"top"===t||"bottom"===t},getGlobalExtent:function(t){var e=this.getExtent();return e[0]=this.toGlobalCoord(e[0]),e[1]=this.toGlobalCoord(e[1]),t&&e[0]>e[1]&&e.reverse(),e},getOtherAxis:function(){this.grid.getOtherAxis()},pointToData:function(t,e){return this.coordToData(this.toLocalCoord(t["x"===this.dim?0:1]),e)},toLocalCoord:null,toGlobalCoord:null},u(Sb,Kw);var Mb={show:!0,zlevel:0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,onZeroAxisIndex:null,lineStyle:{color:"#333",width:1,type:"solid"},symbol:["none","none"],symbolSize:[10,15]},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,fontSize:12},splitLine:{show:!0,lineStyle:{color:["#ccc"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.3)","rgba(200,200,200,0.3)"]}}},Ib={};Ib.categoryAxis=i({boundaryGap:!0,deduplication:null,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},Mb),Ib.valueAxis=i({boundaryGap:[0,0],splitNumber:5},Mb),Ib.timeAxis=a({scale:!0,min:"dataMin",max:"dataMax"},Ib.valueAxis),Ib.logAxis=a({scale:!0,logBase:10},Ib.valueAxis);var Tb=["value","category","time","log"],Cb=function(t,e,n,o){d(Tb,function(a){e.extend({type:t+"Axis."+a,mergeDefaultAndTheme:function(e,r){var o=this.layoutMode,s=o?to(e):{};i(e,r.getTheme().get(a+"Axis")),i(e,this.getDefaultOption()),e.type=n(t,e),o&&Jr(e,s,o)},optionUpdated:function(){"category"===this.option.type&&(this.__ordinalMeta=il.createByAxisModel(this))},getCategories:function(t){var e=this.option;if("category"===e.type)return t?e.data:this.__ordinalMeta.categories},getOrdinalMeta:function(){return this.__ordinalMeta},defaultOption:r([{},Ib[a+"Axis"],o],!0)})}),ex.registerSubTypeDefaulter(t+"Axis",v(n,t))},Ab=ex.extend({type:"cartesian2dAxis",axis:null,init:function(){Ab.superApply(this,"init",arguments),this.resetRange()},mergeOption:function(){Ab.superApply(this,"mergeOption",arguments),this.resetRange()},restoreData:function(){Ab.superApply(this,"restoreData",arguments),this.resetRange()},getCoordSysModel:function(){return this.ecModel.queryComponents({mainType:"grid",index:this.option.gridIndex,id:this.option.gridId})[0]}});i(Ab.prototype,Rw);var Db={offset:0};Cb("x",Ab,zu,Db),Cb("y",Ab,zu,Db),ex.extend({type:"grid",dependencies:["xAxis","yAxis"],layoutMode:"box",coordinateSystem:null,defaultOption:{show:!1,zlevel:0,z:0,left:"10%",top:60,right:"10%",bottom:60,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"}});var kb=Nu.prototype;kb.type="grid",kb.axisPointerEnabled=!0,kb.getRect=function(){return this._rect},kb.update=function(t,e){var n=this._axesMap;this._updateScale(t,this.model),d(n.x,function(t){Sl(t.scale,t.model)}),d(n.y,function(t){Sl(t.scale,t.model)});var i={};d(n.x,function(t){Ru(n,"y",t,i)}),d(n.y,function(t){Ru(n,"x",t,i)}),this.resize(this.model,e)},kb.resize=function(t,e,n){function i(){d(o,function(t){var e=t.isHorizontal(),n=e?[0,r.width]:[0,r.height],i=t.inverse?1:0;t.setExtent(n[i],n[1-i]),Fu(t,e?r.x:r.y)})}var r=Kr(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()});this._rect=r;var o=this._axesList;i(),!n&&t.get("containLabel")&&(d(o,function(t){if(!t.model.get("axisLabel.inside")){var e=Al(t);if(e){var n=t.isHorizontal()?"height":"width",i=t.model.get("axisLabel.margin");r[n]-=e[n]+i,"top"===t.position?r.y+=e.height+i:"left"===t.position&&(r.x+=e.width+i)}}}),i())},kb.getAxis=function(t,e){var n=this._axesMap[t];if(null!=n){if(null==e)for(var i in n)if(n.hasOwnProperty(i))return n[i];return n[e]}},kb.getAxes=function(){return this._axesList.slice()},kb.getCartesian=function(t,e){if(null!=t&&null!=e){var n="x"+t+"y"+e;return this._coordsMap[n]}w(t)&&(e=t.yAxisIndex,t=t.xAxisIndex);for(var i=0,r=this._coordsList;i<r.length;i++)if(r[i].getAxis("x").index===t||r[i].getAxis("y").index===e)return r[i]},kb.getCartesians=function(){return this._coordsList.slice()},kb.convertToPixel=function(t,e,n){var i=this._findConvertTarget(t,e);return i.cartesian?i.cartesian.dataToPoint(n):i.axis?i.axis.toGlobalCoord(i.axis.dataToCoord(n)):null},kb.convertFromPixel=function(t,e,n){var i=this._findConvertTarget(t,e);return i.cartesian?i.cartesian.pointToData(n):i.axis?i.axis.coordToData(i.axis.toLocalCoord(n)):null},kb._findConvertTarget=function(t,e){var n,i,r=e.seriesModel,o=e.xAxisModel||r&&r.getReferringComponents("xAxis")[0],a=e.yAxisModel||r&&r.getReferringComponents("yAxis")[0],s=e.gridModel,u=this._coordsList;return r?l(u,n=r.coordinateSystem)<0&&(n=null):o&&a?n=this.getCartesian(o.componentIndex,a.componentIndex):o?i=this.getAxis("x",o.componentIndex):a?i=this.getAxis("y",a.componentIndex):s&&s.coordinateSystem===this&&(n=this._coordsList[0]),{cartesian:n,axis:i}},kb.containPoint=function(t){var e=this._coordsList[0];if(e)return e.containPoint(t)},kb._initCartesian=function(t,e,n){function i(n){return function(i,s){if(Eu(i,t,e)){var l=i.get("position");"x"===n?"top"!==l&&"bottom"!==l&&r[l="bottom"]&&(l="top"===l?"bottom":"top"):"left"!==l&&"right"!==l&&r[l="left"]&&(l="left"===l?"right":"left"),r[l]=!0;var u=new Sb(n,Ml(i),[0,0],i.get("type"),l),h="category"===u.type;u.onBand=h&&i.get("boundaryGap"),u.inverse=i.get("inverse"),i.axis=u,u.model=i,u.grid=this,u.index=s,this._axesList.push(u),o[n][s]=u,a[n]++}}}var r={left:!1,right:!1,top:!1,bottom:!1},o={x:{},y:{}},a={x:0,y:0};if(e.eachComponent("xAxis",i("x"),this),e.eachComponent("yAxis",i("y"),this),!a.x||!a.y)return this._axesMap={},void(this._axesList=[]);this._axesMap=o,d(o.x,function(e,n){d(o.y,function(i,r){var o="x"+n+"y"+r,a=new Ou(o);a.grid=this,a.model=t,this._coordsMap[o]=a,this._coordsList.push(a),a.addAxis(e),a.addAxis(i)},this)},this)},kb._updateScale=function(t,e){function n(t,e,n){d(t.mapDimension(e.dim,!0),function(n){e.scale.unionExtentFromData(t,Qs(t,n))})}d(this._axesList,function(t){t.scale.setExtent(1/0,-1/0)}),t.eachSeries(function(i){if(Wu(i)){var r=Vu(i),o=r[0],a=r[1];if(!Eu(o,e,t)||!Eu(a,e,t))return;var s=this.getCartesian(o.componentIndex,a.componentIndex),l=i.getData(),u=s.getAxis("x"),h=s.getAxis("y");"list"===l.type&&(n(l,u),n(l,h))}},this)},kb.getTooltipAxes=function(t){var e=[],n=[];return d(this.getCartesians(),function(i){var r=null!=t&&"auto"!==t?i.getAxis(t):i.getBaseAxis(),o=i.getOtherAxis(r);l(e,r)<0&&e.push(r),l(n,o)<0&&n.push(o)}),{baseAxes:e,otherAxes:n}};var Pb=["xAxis","yAxis"];Nu.create=function(t,e){var n=[];return t.eachComponent("grid",function(i,r){var o=new Nu(i,t,e);o.name="grid_"+r,o.resize(i,e,!0),i.coordinateSystem=o,n.push(o)}),t.eachSeries(function(t){if(Wu(t)){var e=Vu(t),n=e[0],i=e[1],r=n.getCoordSysModel().coordinateSystem;t.coordinateSystem=r.getCartesian(n.componentIndex,i.componentIndex)}}),n},Nu.dimensions=Nu.prototype.dimensions=Ou.prototype.dimensions,Co.register("cartesian2d",Nu);var Lb=Math.PI,Ob=function(t,e){this.opt=e,this.axisModel=t,a(e,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0}),this.group=new Jg;var n=new Jg({position:e.position.slice(),rotation:e.rotation});n.updateTransform(),this._transform=n.transform,this._dumbGroup=n};Ob.prototype={constructor:Ob,hasBuilder:function(t){return!!zb[t]},add:function(t){zb[t].call(this)},getGroup:function(){return this.group}};var zb={axisLine:function(){var t=this.opt,e=this.axisModel;if(e.get("axisLine.show")){var n=this.axisModel.axis.getExtent(),i=this._transform,r=[n[0],0],a=[n[1],0];i&&($(r,r,i),$(a,a,i));var s=o({lineCap:"round"},e.getModel("axisLine.lineStyle").getLineStyle());this.group.add(new gy(Vi({anid:"line",shape:{x1:r[0],y1:r[1],x2:a[0],y2:a[1]},style:s,strokeContainThreshold:t.strokeContainThreshold||5,silent:!0,z2:1})));var l=e.get("axisLine.symbol"),u=e.get("axisLine.symbolSize"),h=e.get("axisLine.symbolOffset")||0;if("number"==typeof h&&(h=[h,h]),null!=l){"string"==typeof l&&(l=[l,l]),"string"!=typeof u&&"number"!=typeof u||(u=[u,u]);var c=u[0],f=u[1];d([{rotate:t.rotation+Math.PI/2,offset:h[0],r:0},{rotate:t.rotation-Math.PI/2,offset:h[1],r:Math.sqrt((r[0]-a[0])*(r[0]-a[0])+(r[1]-a[1])*(r[1]-a[1]))}],function(e,n){if("none"!==l[n]&&null!=l[n]){var i=Pl(l[n],-c/2,-f/2,c,f,s.stroke,!0),o=e.r+e.offset,a=[r[0]+o*Math.cos(t.rotation),r[1]-o*Math.sin(t.rotation)];i.attr({rotation:e.rotate,position:a,silent:!0}),this.group.add(i)}},this)}}},axisTickLabel:function(){var t=this.axisModel,e=this.opt,n=qu(this,t,e);Uu(t,$u(this,t,e),n)},axisName:function(){var t=this.opt,e=this.axisModel,n=T(t.axisName,e.get("name"));if(n){var i,r=e.get("nameLocation"),a=t.nameDirection,s=e.getModel("nameTextStyle"),l=e.get("nameGap")||0,u=this.axisModel.axis.getExtent(),h=u[0]>u[1]?-1:1,c=["start"===r?u[0]-h*l:"end"===r?u[1]+h*l:(u[0]+u[1])/2,ju(r)?t.labelOffset+a*l:0],d=e.get("nameRotate");null!=d&&(d=d*Lb/180);var f;ju(r)?i=Eb(t.rotation,null!=d?d:t.rotation,a):(i=Gu(t,r,d||0,u),null!=(f=t.axisNameAvailableWidth)&&(f=Math.abs(f/Math.sin(i.rotation)),!isFinite(f)&&(f=null)));var p=s.getFont(),g=e.get("nameTruncate",!0)||{},m=g.ellipsis,v=T(t.nameTruncateMaxWidth,g.maxWidth,f),y=null!=m&&null!=v?Xy(n,v,p,m,{minChar:2,placeholder:g.placeholder}):n,x=e.get("tooltip",!0),_=e.mainType,w={componentType:_,name:n,$vars:["name"]};w[_+"Index"]=e.componentIndex;var b=new ry({anid:"name",__fullText:n,__truncatedText:y,position:c,rotation:i.rotation,silent:Zu(e),z2:1,tooltip:x&&x.show?o({content:n,formatter:function(){return n},formatterParams:w},x):null});ar(b.style,s,{text:y,textFont:p,textFill:s.getTextColor()||e.get("axisLine.lineStyle.color"),textAlign:i.textAlign,textVerticalAlign:i.textVerticalAlign}),e.get("triggerEvent")&&(b.eventData=Hu(e),b.eventData.targetType="axisName",b.eventData.name=n),this._dumbGroup.add(b),b.updateTransform(),this.group.add(b),b.decomposeTransform()}}},Eb=Ob.innerTextLayout=function(t,e,n){var i,r,o=Nr(e-t);return Rr(o)?(r=n>0?"top":"bottom",i="center"):Rr(o-Lb)?(r=n>0?"bottom":"top",i="center"):(r="middle",i=o>0&&o<Lb?n>0?"right":"left":n>0?"left":"right"),{rotation:o,textAlign:i,textVerticalAlign:r}},Nb=d,Rb=v,Bb=Ts({type:"axis",_axisPointer:null,axisPointerClass:null,render:function(t,e,n,i){this.axisPointerClass&&ih(t),Bb.superApply(this,"render",arguments),lh(this,t,0,n,0,!0)},updateAxisPointer:function(t,e,n,i,r){lh(this,t,0,n,0,!1)},remove:function(t,e){var n=this._axisPointer;n&&n.remove(e),Bb.superApply(this,"remove",arguments)},dispose:function(t,e){uh(this,e),Bb.superApply(this,"dispose",arguments)}}),Fb=[];Bb.registerAxisPointerClass=function(t,e){Fb[t]=e},Bb.getAxisPointerClass=function(t){return t&&Fb[t]};var Vb=["axisLine","axisTickLabel","axisName"],Wb=["splitArea","splitLine"],Hb=Bb.extend({type:"cartesianAxis",axisPointerClass:"CartesianAxisPointer",render:function(t,e,n,i){this.group.removeAll();var r=this._axisGroup;if(this._axisGroup=new Jg,this.group.add(this._axisGroup),t.get("show")){var o=t.getCoordSysModel(),a=hh(o,t),s=new Ob(t,a);d(Vb,s.add,s),this._axisGroup.add(s.getGroup()),d(Wb,function(e){t.get(e+".show")&&this["_"+e](t,o)},this),_r(r,this._axisGroup,t),Hb.superCall(this,"render",t,e,n,i)}},remove:function(){this._splitAreaColors=null},_splitLine:function(t,e){var n=t.axis;if(!n.scale.isBlank()){var i=t.getModel("splitLine"),r=i.getModel("lineStyle"),o=r.get("color");o=y(o)?o:[o];for(var s=e.coordinateSystem.getRect(),l=n.isHorizontal(),u=0,h=n.getTicksCoords({tickModel:i}),c=[],d=[],f=r.getLineStyle(),p=0;p<h.length;p++){var g=n.toGlobalCoord(h[p].coord);l?(c[0]=g,c[1]=s.y,d[0]=g,d[1]=s.y+s.height):(c[0]=s.x,c[1]=g,d[0]=s.x+s.width,d[1]=g);var m=u++%o.length,v=h[p].tickValue;this._axisGroup.add(new gy(Vi({anid:null!=v?"line_"+h[p].tickValue:null,shape:{x1:c[0],y1:c[1],x2:d[0],y2:d[1]},style:a({stroke:o[m]},f),silent:!0})))}}},_splitArea:function(t,e){var n=t.axis;if(!n.scale.isBlank()){var i=t.getModel("splitArea"),r=i.getModel("areaStyle"),o=r.get("color"),s=e.coordinateSystem.getRect(),l=n.getTicksCoords({tickModel:i,clamp:!0});if(l.length){var u=o.length,h=this._splitAreaColors,c=N(),d=0;if(h)for(m=0;m<l.length;m++){var f=h.get(l[m].tickValue);if(null!=f){d=(f+(u-1)*m)%u;break}}var p=n.toGlobalCoord(l[0].coord),g=r.getAreaStyle();o=y(o)?o:[o];for(var m=1;m<l.length;m++){var v,x,_,w,b=n.toGlobalCoord(l[m].coord);n.isHorizontal()?(v=p,x=s.y,_=b-v,w=s.height,p=v+_):(v=s.x,x=p,_=s.width,p=x+(w=b-x));var S=l[m-1].tickValue;null!=S&&c.set(S,d),this._axisGroup.add(new py({anid:null!=S?"area_"+S:null,shape:{x:v,y:x,width:_,height:w},style:a({fill:o[d]},g),silent:!0})),d=(d+1)%u}this._splitAreaColors=c}}}});Hb.extend({type:"xAxis"}),Hb.extend({type:"yAxis"}),Ts({type:"grid",render:function(t,e){this.group.removeAll(),t.get("show")&&this.group.add(new py({shape:t.coordinateSystem.getRect(),style:a({fill:t.get("backgroundColor")},t.getItemStyle()),silent:!0,z2:-1}))}}),ys(function(t){t.xAxis&&t.yAxis&&!t.grid&&(t.grid={})}),bs(yb("line","circle","line")),ws(xb("line")),xs(O_.PROCESSOR.STATISTIC,function(t){return{seriesType:t,modifyOutputEnd:!0,reset:function(t,e,n){var i=t.getData(),r=t.get("sampling"),o=t.coordinateSystem;if("cartesian2d"===o.type&&r){var a=o.getBaseAxis(),s=o.getOtherAxis(a),l=a.getExtent(),u=l[1]-l[0],h=Math.round(i.count()/u);if(h>1){var c;"string"==typeof r?c=_b[r]:"function"==typeof r&&(c=r),c&&t.setData(i.downSample(i.mapDimension(s.dim),1/h,c,wb))}}}}}("line")),Hx.extend({type:"series.__base_bar__",getInitialData:function(t,e){return Js(this.getSource(),this)},getMarkerPosition:function(t){var e=this.coordinateSystem;if(e){var n=e.dataToPoint(e.clampData(t)),i=this.getData(),r=i.getLayout("offset"),o=i.getLayout("size");return n[e.getBaseAxis().isHorizontal()?0:1]+=r+o/2,n}return[NaN,NaN]},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,barMinHeight:0,barMinAngle:0,large:!1,largeThreshold:400,progressive:3e3,progressiveChunkMode:"mod",itemStyle:{},emphasis:{}}}).extend({type:"series.bar",dependencies:["grid","polar"],brushSelector:"rect",getProgressive:function(){return!!this.get("large")&&this.get("progressive")},getProgressiveThreshold:function(){var t=this.get("progressiveThreshold"),e=this.get("largeThreshold");return e>t&&(t=e),t}});var Gb=Km([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["stroke","barBorderColor"],["lineWidth","barBorderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]),Zb={getBarItemStyle:function(t){var e=Gb(this,t);if(this.getBorderLineDash){var n=this.getBorderLineDash();n&&(e.lineDash=n)}return e}},Ub=["itemStyle","barBorderWidth"];o(Sr.prototype,Zb),As({type:"bar",render:function(t,e,n){this._updateDrawMode(t);var i=t.get("coordinateSystem");return"cartesian2d"!==i&&"polar"!==i||(this._isLargeDraw?this._renderLarge(t,e,n):this._renderNormal(t,e,n)),this.group},incrementalPrepareRender:function(t,e,n){this._clear(),this._updateDrawMode(t)},incrementalRender:function(t,e,n,i){this._incrementalRenderLarge(t,e)},_updateDrawMode:function(t){var e=t.pipelineContext.large;(null==this._isLargeDraw||e^this._isLargeDraw)&&(this._isLargeDraw=e,this._clear())},_renderNormal:function(t,e,n){var i,r=this.group,o=t.getData(),a=this._data,s=t.coordinateSystem,l=s.getBaseAxis();"cartesian2d"===s.type?i=l.isHorizontal():"polar"===s.type&&(i="angle"===l.dim);var u=t.isAnimationEnabled()?t:null;o.diff(a).add(function(e){if(o.hasValue(e)){var n=o.getItemModel(e),a=Yb[s.type](o,e,n),l=Xb[s.type](o,e,n,a,i,u);o.setItemGraphicEl(e,l),r.add(l),gh(l,o,e,n,a,t,i,"polar"===s.type)}}).update(function(e,n){var l=a.getItemGraphicEl(n);if(o.hasValue(e)){var h=o.getItemModel(e),c=Yb[s.type](o,e,h);l?gr(l,{shape:c},u,e):l=Xb[s.type](o,e,h,c,i,u,!0),o.setItemGraphicEl(e,l),r.add(l),gh(l,o,e,h,c,t,i,"polar"===s.type)}else r.remove(l)}).remove(function(t){var e=a.getItemGraphicEl(t);"cartesian2d"===s.type?e&&fh(t,u,e):e&&ph(t,u,e)}).execute(),this._data=o},_renderLarge:function(t,e,n){this._clear(),vh(t,this.group)},_incrementalRenderLarge:function(t,e){vh(e,this.group,!0)},dispose:R,remove:function(t){this._clear(t)},_clear:function(t){var e=this.group,n=this._data;t&&t.get("animation")&&n&&!this._isLargeDraw?n.eachItemGraphicEl(function(e){"sector"===e.type?ph(e.dataIndex,t,e):fh(e.dataIndex,t,e)}):e.removeAll(),this._data=null}});var Xb={cartesian2d:function(t,e,n,i,r,a,s){var l=new py({shape:o({},i)});if(a){var u=l.shape,h=r?"height":"width",c={};u[h]=0,c[h]=i[h],ky[s?"updateProps":"initProps"](l,{shape:c},a,e)}return l},polar:function(t,e,n,i,r,o,s){var l=i.startAngle<i.endAngle,u=new ly({shape:a({clockwise:l},i)});if(o){var h=u.shape,c=r?"r":"endAngle",d={};h[c]=r?0:i.startAngle,d[c]=i[c],ky[s?"updateProps":"initProps"](u,{shape:d},o,e)}return u}},Yb={cartesian2d:function(t,e,n){var i=t.getItemLayout(e),r=mh(n,i),o=i.width>0?1:-1,a=i.height>0?1:-1;return{x:i.x+o*r/2,y:i.y+a*r/2,width:i.width-o*r,height:i.height-a*r}},polar:function(t,e,n){var i=t.getItemLayout(e);return{cx:i.cx,cy:i.cy,r0:i.r0,r:i.r,startAngle:i.startAngle,endAngle:i.endAngle}}},jb=Ii.extend({type:"largeBar",shape:{points:[]},buildPath:function(t,e){for(var n=e.points,i=this.__startPoint,r=this.__valueIdx,o=0;o<n.length;o+=2)i[this.__valueIdx]=n[o+r],t.moveTo(i[0],i[1]),t.lineTo(n[o],n[o+1])}});ws(v(function(t,e){var n=fl(t,e),i=pl(n),r={};d(n,function(t){var e=t.getData(),n=t.coordinateSystem,o=n.getBaseAxis(),a=cl(t),s=i[dl(o)][a],l=s.offset,u=s.width,h=n.getOtherAxis(o),c=t.get("barMinHeight")||0;r[a]=r[a]||[],e.setLayout({offset:l,size:u});for(var d=e.mapDimension(h.dim),f=e.mapDimension(o.dim),p=Ks(e,d),g=h.isHorizontal(),m=xl(0,h),v=0,y=e.count();v<y;v++){var x=e.get(d,v),_=e.get(f,v);if(!isNaN(x)){var w=x>=0?"p":"n",b=m;p&&(r[a][_]||(r[a][_]={p:m,n:m}),b=r[a][_][w]);var S,M,I,T;if(g)S=b,M=(C=n.dataToPoint([x,_]))[1]+l,I=C[0]-m,T=u,Math.abs(I)<c&&(I=(I<0?-1:1)*c),p&&(r[a][_][w]+=I);else{var C=n.dataToPoint([_,x]);S=C[0]+l,M=b,I=u,T=C[1]-m,Math.abs(T)<c&&(T=(T<=0?-1:1)*c),p&&(r[a][_][w]+=T)}e.setItemLayout(v,{x:S,y:M,width:I,height:T})}}},this)},"bar")),ws(ww),bs({seriesType:"bar",reset:function(t){t.getData().setVisual("legendSymbol","roundRect")}});var qb=function(t,e,n){e=y(e)&&{coordDimensions:e}||o({},e);var i=t.getSource(),r=dw(i,e),a=new uw(r,t);return a.initData(i,n),a},$b={updateSelectedMap:function(t){this._targetList=y(t)?t.slice():[],this._selectTargetMap=p(t||[],function(t,e){return t.set(e.name,e),t},N())},select:function(t,e){var n=null!=e?this._targetList[e]:this._selectTargetMap.get(t);"single"===this.get("selectedMode")&&this._selectTargetMap.each(function(t){t.selected=!1}),n&&(n.selected=!0)},unSelect:function(t,e){var n=null!=e?this._targetList[e]:this._selectTargetMap.get(t);n&&(n.selected=!1)},toggleSelected:function(t,e){var n=null!=e?this._targetList[e]:this._selectTargetMap.get(t);if(null!=n)return this[n.selected?"unSelect":"select"](t,e),n.selected},isSelected:function(t,e){var n=null!=e?this._targetList[e]:this._selectTargetMap.get(t);return n&&n.selected}},Kb=Cs({type:"series.pie",init:function(t){Kb.superApply(this,"init",arguments),this.legendDataProvider=function(){return this.getRawData()},this.updateSelectedMap(this._createSelectableList()),this._defaultLabelLine(t)},mergeOption:function(t){Kb.superCall(this,"mergeOption",t),this.updateSelectedMap(this._createSelectableList())},getInitialData:function(t,e){return qb(this,["value"])},_createSelectableList:function(){for(var t=this.getRawData(),e=t.mapDimension("value"),n=[],i=0,r=t.count();i<r;i++)n.push({name:t.getName(i),value:t.get(e,i),selected:ta(t,i,"selected")});return n},getDataParams:function(t){var e=this.getData(),n=Kb.superCall(this,"getDataParams",t),i=[];return e.each(e.mapDimension("value"),function(t){i.push(t)}),n.percent=Er(i,t,e.hostModel.get("percentPrecision")),n.$vars.push("percent"),n},_defaultLabelLine:function(t){In(t,"labelLine",["show"]);var e=t.labelLine,n=t.emphasis.labelLine;e.show=e.show&&t.label.show,n.show=n.show&&t.emphasis.label.show},defaultOption:{zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,selectedOffset:10,hoverOffset:10,avoidLabelOverlap:!0,percentPrecision:2,stillShowZeroSum:!0,label:{rotate:!1,show:!0,position:"outer"},labelLine:{show:!0,length:15,length2:15,smooth:!1,lineStyle:{width:1,type:"solid"}},itemStyle:{borderWidth:1},animationType:"expansion",animationEasing:"cubicOut"}});h(Kb,$b);var Qb=wh.prototype;Qb.updateData=function(t,e,n){function i(){s.stopAnimation(!0),s.animateTo({shape:{r:h.r+l.get("hoverOffset")}},300,"elasticOut")}function r(){s.stopAnimation(!0),s.animateTo({shape:{r:h.r}},300,"elasticOut")}var s=this.childAt(0),l=t.hostModel,u=t.getItemModel(e),h=t.getItemLayout(e),c=o({},h);c.label=null,n?(s.setShape(c),"scale"===l.getShallow("animationType")?(s.shape.r=h.r0,mr(s,{shape:{r:h.r}},l,e)):(s.shape.endAngle=h.startAngle,gr(s,{shape:{endAngle:h.endAngle}},l,e))):gr(s,{shape:c},l,e);var d=t.getItemVisual(e,"color");s.useStyle(a({lineJoin:"bevel",fill:d},u.getModel("itemStyle").getItemStyle())),s.hoverStyle=u.getModel("emphasis.itemStyle").getItemStyle();var f=u.getShallow("cursor");f&&s.attr("cursor",f),_h(this,t.getItemLayout(e),l.isSelected(null,e),l.get("selectedOffset"),l.get("animation")),s.off("mouseover").off("mouseout").off("emphasis").off("normal"),u.get("hoverAnimation")&&l.isAnimationEnabled()&&s.on("mouseover",i).on("mouseout",r).on("emphasis",i).on("normal",r),this._updateLabel(t,e),ir(this)},Qb._updateLabel=function(t,e){var n=this.childAt(1),i=this.childAt(2),r=t.hostModel,o=t.getItemModel(e),a=t.getItemLayout(e).label,s=t.getItemVisual(e,"color");gr(n,{shape:{points:a.linePoints||[[a.x,a.y],[a.x,a.y],[a.x,a.y]]}},r,e),gr(i,{style:{x:a.x,y:a.y}},r,e),i.attr({rotation:a.rotation,origin:[a.x,a.y],z2:10});var l=o.getModel("label"),u=o.getModel("emphasis.label"),h=o.getModel("labelLine"),c=o.getModel("emphasis.labelLine"),s=t.getItemVisual(e,"color");or(i.style,i.hoverStyle={},l,u,{labelFetcher:t.hostModel,labelDataIndex:e,defaultText:t.getName(e),autoColor:s,useInsideStyle:!!a.inside},{textAlign:a.textAlign,textVerticalAlign:a.verticalAlign,opacity:t.getItemVisual(e,"opacity")}),i.ignore=i.normalIgnore=!l.get("show"),i.hoverIgnore=!u.get("show"),n.ignore=n.normalIgnore=!h.get("show"),n.hoverIgnore=!c.get("show"),n.setStyle({stroke:s,opacity:t.getItemVisual(e,"opacity")}),n.setStyle(h.getModel("lineStyle").getLineStyle()),n.hoverStyle=c.getModel("lineStyle").getLineStyle();var d=h.get("smooth");d&&!0===d&&(d=.4),n.setShape({smooth:d})},u(wh,Jg);fa.extend({type:"pie",init:function(){var t=new Jg;this._sectorGroup=t},render:function(t,e,n,i){if(!i||i.from!==this.uid){var r=t.getData(),o=this._data,a=this.group,s=e.get("animation"),l=!o,u=t.get("animationType"),h=v(xh,this.uid,t,s,n),c=t.get("selectedMode");if(r.diff(o).add(function(t){var e=new wh(r,t);l&&"scale"!==u&&e.eachChild(function(t){t.stopAnimation(!0)}),c&&e.on("click",h),r.setItemGraphicEl(t,e),a.add(e)}).update(function(t,e){var n=o.getItemGraphicEl(e);n.updateData(r,t),n.off("click"),c&&n.on("click",h),a.add(n),r.setItemGraphicEl(t,n)}).remove(function(t){var e=o.getItemGraphicEl(t);a.remove(e)}).execute(),s&&l&&r.count()>0&&"scale"!==u){var d=r.getItemLayout(0),f=Math.max(n.getWidth(),n.getHeight())/2,p=m(a.removeClipPath,a);a.setClipPath(this._createClipPath(d.cx,d.cy,f,d.startAngle,d.clockwise,p,t))}else a.removeClipPath();this._data=r}},dispose:function(){},_createClipPath:function(t,e,n,i,r,o,a){var s=new ly({shape:{cx:t,cy:e,r0:0,r:n,startAngle:i,endAngle:i,clockwise:r}});return mr(s,{shape:{endAngle:i+(r?1:-1)*Math.PI*2}},a,o),s},containPoint:function(t,e){var n=e.getData().getItemLayout(0);if(n){var i=t[0]-n.cx,r=t[1]-n.cy,o=Math.sqrt(i*i+r*r);return o<=n.r&&o>=n.r0}}});var Jb=function(t,e,n,i){var r,o,a=t.getData(),s=[],l=!1;a.each(function(n){var i,u,h,c,d=a.getItemLayout(n),f=a.getItemModel(n),p=f.getModel("label"),g=p.get("position")||f.get("emphasis.label.position"),m=f.getModel("labelLine"),v=m.get("length"),y=m.get("length2"),x=(d.startAngle+d.endAngle)/2,_=Math.cos(x),w=Math.sin(x);r=d.cx,o=d.cy;var b="inside"===g||"inner"===g;if("center"===g)i=d.cx,u=d.cy,c="center";else{var S=(b?(d.r+d.r0)/2*_:d.r*_)+r,M=(b?(d.r+d.r0)/2*w:d.r*w)+o;if(i=S+3*_,u=M+3*w,!b){var I=S+_*(v+e-d.r),T=M+w*(v+e-d.r),C=I+(_<0?-1:1)*y,A=T;i=C+(_<0?-5:5),u=A,h=[[S,M],[I,T],[C,A]]}c=b?"center":_>0?"left":"right"}var D=p.getFont(),k=p.get("rotate")?_<0?-x+Math.PI:-x:0,P=Se(t.getFormattedLabel(n,"normal")||a.getName(n),D,c,"top");l=!!k,d.label={x:i,y:u,position:g,height:P.height,len:v,len2:y,linePoints:h,textAlign:c,verticalAlign:"middle",rotation:k,inside:b},b||s.push(d.label)}),!l&&t.get("avoidLabelOverlap")&&Sh(s,r,o,e,n,i)},tS=2*Math.PI,eS=Math.PI/180;!function(t,e){d(e,function(e){e.update="updateView",_s(e,function(n,i){var r={};return i.eachComponent({mainType:"series",subType:t,query:n},function(t){t[e.method]&&t[e.method](n.name,n.dataIndex);var i=t.getData();i.each(function(e){var n=i.getName(e);r[n]=t.isSelected(n)||!1})}),{name:n.name,selected:r}})})}("pie",[{type:"pieToggleSelect",event:"pieselectchanged",method:"toggleSelected"},{type:"pieSelect",event:"pieselected",method:"select"},{type:"pieUnSelect",event:"pieunselected",method:"unSelect"}]),bs(function(t){return{getTargetSeries:function(e){var n={},i=N();return e.eachSeriesByType(t,function(t){t.__paletteScope=n,i.set(t.uid,t)}),i},reset:function(t,e){var n=t.getRawData(),i={},r=t.getData();r.each(function(t){var e=r.getRawIndex(t);i[e]=t}),n.each(function(e){var o=i[e],a=null!=o&&r.getItemVisual(o,"color",!0);if(a)n.setItemVisual(e,"color",a);else{var s=n.getItemModel(e).get("itemStyle.color")||t.getColorFromPalette(n.getName(e)||e+"",t.__paletteScope,n.count());n.setItemVisual(e,"color",s),null!=o&&r.setItemVisual(o,"color",s)}})}}}("pie")),ws(v(function(t,e,n,i){e.eachSeriesByType(t,function(t){var e=t.getData(),i=e.mapDimension("value"),r=t.get("center"),o=t.get("radius");y(o)||(o=[0,o]),y(r)||(r=[r,r]);var a=n.getWidth(),s=n.getHeight(),l=Math.min(a,s),u=Dr(r[0],a),h=Dr(r[1],s),c=Dr(o[0],l/2),d=Dr(o[1],l/2),f=-t.get("startAngle")*eS,p=t.get("minAngle")*eS,g=0;e.each(i,function(t){!isNaN(t)&&g++});var m=e.getSum(i),v=Math.PI/(m||g)*2,x=t.get("clockwise"),_=t.get("roseType"),w=t.get("stillShowZeroSum"),b=e.getDataExtent(i);b[0]=0;var S=tS,M=0,I=f,T=x?1:-1;if(e.each(i,function(t,n){var i;if(isNaN(t))e.setItemLayout(n,{angle:NaN,startAngle:NaN,endAngle:NaN,clockwise:x,cx:u,cy:h,r0:c,r:_?NaN:d});else{(i="area"!==_?0===m&&w?v:t*v:tS/g)<p?(i=p,S-=p):M+=t;var r=I+T*i;e.setItemLayout(n,{angle:i,startAngle:I,endAngle:r,clockwise:x,cx:u,cy:h,r0:c,r:_?Ar(t,b,[c,d]):d}),I=r}}),S<tS&&g)if(S<=.001){var C=tS/g;e.each(i,function(t,n){if(!isNaN(t)){var i=e.getItemLayout(n);i.angle=C,i.startAngle=f+T*n*C,i.endAngle=f+T*(n+1)*C}})}else v=S/M,I=f,e.each(i,function(t,n){if(!isNaN(t)){var i=e.getItemLayout(n),r=i.angle===p?p:t*v;i.startAngle=I,i.endAngle=I+T*r,I+=T*r}});Jb(t,d,a,s)})},"pie")),xs(function(t){return{seriesType:t,reset:function(t,e){var n=e.findComponents({mainType:"legend"});if(n&&n.length){var i=t.getData();i.filterSelf(function(t){for(var e=i.getName(t),r=0;r<n.length;r++)if(!n[r].isSelected(e))return!1;return!0})}}}}("pie")),Hx.extend({type:"series.scatter",dependencies:["grid","polar","geo","singleAxis","calendar"],getInitialData:function(t,e){return Js(this.getSource(),this)},brushSelector:"point",getProgressive:function(){var t=this.option.progressive;return null==t?this.option.large?5e3:this.get("progressive"):t},getProgressiveThreshold:function(){var t=this.option.progressiveThreshold;return null==t?this.option.large?1e4:this.get("progressiveThreshold"):t},defaultOption:{coordinateSystem:"cartesian2d",zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,symbolSize:10,large:!1,largeThreshold:2e3,itemStyle:{opacity:.8}}});var nS=Ei({shape:{points:null},symbolProxy:null,buildPath:function(t,e){var n=e.points,i=e.size,r=this.symbolProxy,o=r.shape;if(!((t.getContext?t.getContext():t)&&i[0]<4))for(var a=0;a<n.length;){var s=n[a++],l=n[a++];isNaN(s)||isNaN(l)||(o.x=s-i[0]/2,o.y=l-i[1]/2,o.width=i[0],o.height=i[1],r.buildPath(t,o,!0))}},afterBrush:function(t){var e=this.shape,n=e.points,i=e.size;if(i[0]<4){this.setTransform(t);for(var r=0;r<n.length;){var o=n[r++],a=n[r++];isNaN(o)||isNaN(a)||t.fillRect(o-i[0]/2,a-i[1]/2,i[0],i[1])}this.restoreTransform(t)}},findDataIndex:function(t,e){for(var n=this.shape,i=n.points,r=n.size,o=Math.max(r[0],4),a=Math.max(r[1],4),s=i.length/2-1;s>=0;s--){var l=2*s,u=i[l]-o/2,h=i[l+1]-a/2;if(t>=u&&e>=h&&t<=u+o&&e<=h+a)return s}return-1}}),iS=Mh.prototype;iS.isPersistent=function(){return!this._incremental},iS.updateData=function(t){this.group.removeAll();var e=new nS({rectHover:!0,cursor:"default"});e.setShape({points:t.getLayout("symbolPoints")}),this._setCommon(e,t),this.group.add(e),this._incremental=null},iS.updateLayout=function(t){if(!this._incremental){var e=t.getLayout("symbolPoints");this.group.eachChild(function(t){if(null!=t.startIndex){var n=2*(t.endIndex-t.startIndex),i=4*t.startIndex*2;e=new Float32Array(e.buffer,i,n)}t.setShape("points",e)})}},iS.incrementalPrepareUpdate=function(t){this.group.removeAll(),this._clearIncremental(),t.count()>2e6?(this._incremental||(this._incremental=new zi({silent:!0})),this.group.add(this._incremental)):this._incremental=null},iS.incrementalUpdate=function(t,e){var n;this._incremental?(n=new nS,this._incremental.addDisplayable(n,!0)):((n=new nS({rectHover:!0,cursor:"default",startIndex:t.start,endIndex:t.end})).incremental=!0,this.group.add(n)),n.setShape({points:e.getLayout("symbolPoints")}),this._setCommon(n,e,!!this._incremental)},iS._setCommon=function(t,e,n){var i=e.hostModel,r=e.getVisual("symbolSize");t.setShape("size",r instanceof Array?r:[r,r]),t.symbolProxy=Pl(e.getVisual("symbol"),0,0,0,0),t.setColor=t.symbolProxy.setColor;var o=t.shape.size[0]<4;t.useStyle(i.getModel("itemStyle").getItemStyle(o?["color","shadowBlur","shadowColor"]:["color"]));var a=e.getVisual("color");a&&t.setColor(a),n||(t.seriesIndex=i.seriesIndex,t.on("mousemove",function(e){t.dataIndex=null;var n=t.findDataIndex(e.offsetX,e.offsetY);n>=0&&(t.dataIndex=n+(t.startIndex||0))}))},iS.remove=function(){this._clearIncremental(),this._incremental=null,this.group.removeAll()},iS._clearIncremental=function(){var t=this._incremental;t&&t.clearDisplaybles()},As({type:"scatter",render:function(t,e,n){var i=t.getData();this._updateSymbolDraw(i,t).updateData(i),this._finished=!0},incrementalPrepareRender:function(t,e,n){var i=t.getData();this._updateSymbolDraw(i,t).incrementalPrepareUpdate(i),this._finished=!1},incrementalRender:function(t,e,n){this._symbolDraw.incrementalUpdate(t,e.getData()),this._finished=t.end===e.getData().count()},updateTransform:function(t,e,n){var i=t.getData();if(this.group.dirty(),!this._finished||i.count()>1e4||!this._symbolDraw.isPersistent())return{update:!0};var r=xb().reset(t);r.progress&&r.progress({start:0,end:i.count()},i),this._symbolDraw.updateLayout(i)},_updateSymbolDraw:function(t,e){var n=this._symbolDraw,i=e.pipelineContext.large;return n&&i===this._isLargeDraw||(n&&n.remove(),n=this._symbolDraw=i?new Mh:new lu,this._isLargeDraw=i,this.group.removeAll()),this.group.add(n.group),n},remove:function(t,e){this._symbolDraw&&this._symbolDraw.remove(!0),this._symbolDraw=null},dispose:function(){}}),bs(yb("scatter","circle")),ws(xb("scatter")),ys(function(t){var e=t.graphic;y(e)?e[0]&&e[0].elements?t.graphic=[t.graphic[0]]:t.graphic=[{elements:e}]:e&&!e.elements&&(t.graphic=[{elements:[e]}])});var rS=Is({type:"graphic",defaultOption:{elements:[],parentId:null},_elOptionsToUpdate:null,mergeOption:function(t){var e=this.option.elements;this.option.elements=null,rS.superApply(this,"mergeOption",arguments),this.option.elements=e},optionUpdated:function(t,e){var n=this.option,i=(e?n:t).elements,r=n.elements=e?[]:n.elements,o=[];this._flatten(i,o);var a=An(r,o);Dn(a);var s=this._elOptionsToUpdate=[];d(a,function(t,e){var n=t.option;n&&(s.push(n),Dh(t,n),kh(r,e,n),Ph(r[e],n))},this);for(var l=r.length-1;l>=0;l--)null==r[l]?r.splice(l,1):delete r[l].$action},_flatten:function(t,e,n){d(t,function(t){if(t){n&&(t.parentOption=n),e.push(t);var i=t.children;"group"===t.type&&i&&this._flatten(i,e,t),delete t.children}},this)},useElOptionsToUpdate:function(){var t=this._elOptionsToUpdate;return this._elOptionsToUpdate=null,t}});Ts({type:"graphic",init:function(t,e){this._elMap=N(),this._lastGraphicModel},render:function(t,e,n){t!==this._lastGraphicModel&&this._clear(),this._lastGraphicModel=t,this._updateElements(t),this._relocate(t,n)},_updateElements:function(t){var e=t.useElOptionsToUpdate();if(e){var n=this._elMap,i=this.group;d(e,function(e){var r=e.$action,o=e.id,a=n.get(o),s=e.parentId,l=null!=s?n.get(s):i,u=e.style;"text"===e.type&&u&&(e.hv&&e.hv[1]&&(u.textVerticalAlign=u.textBaseline=null),!u.hasOwnProperty("textFill")&&u.fill&&(u.textFill=u.fill),!u.hasOwnProperty("textStroke")&&u.stroke&&(u.textStroke=u.stroke));var h=Ch(e);r&&"merge"!==r?"replace"===r?(Th(a,n),Ih(o,l,h,n)):"remove"===r&&Th(a,n):a?a.attr(h):Ih(o,l,h,n);var c=n.get(o);c&&(c.__ecGraphicWidth=e.width,c.__ecGraphicHeight=e.height,Lh(c,t))})}},_relocate:function(t,e){for(var n=t.option.elements,i=this.group,r=this._elMap,o=n.length-1;o>=0;o--){var a=n[o],s=r.get(a.id);if(s){var l=s.parent;Qr(s,a,l===i?{width:e.getWidth(),height:e.getHeight()}:{width:l.__ecGraphicWidth||0,height:l.__ecGraphicHeight||0},null,{hv:a.hv,boundingMode:a.bounding})}}},_clear:function(){var t=this._elMap;t.each(function(e){Th(e,t)}),this._elMap=N()},dispose:function(){this._clear()}});var oS=function(t,e){var n,i=[],r=t.seriesIndex;if(null==r||!(n=e.getSeriesByIndex(r)))return{point:[]};var o=n.getData(),a=Ln(o,t);if(null==a||a<0||y(a))return{point:[]};var s=o.getItemGraphicEl(a),l=n.coordinateSystem;if(n.getTooltipPosition)i=n.getTooltipPosition(a)||[];else if(l&&l.dataToPoint)i=l.dataToPoint(o.getValues(f(l.dimensions,function(t){return o.mapDimension(t)}),a,!0))||[];else if(s){var u=s.getBoundingRect().clone();u.applyTransform(s.transform),i=[u.x+u.width/2,u.y+u.height/2]}return{point:i,el:s}},aS=d,sS=v,lS=On(),uS=(Is({type:"axisPointer",coordSysAxesInfo:null,defaultOption:{show:"auto",triggerOn:null,zlevel:0,z:50,type:"line",snap:!1,triggerTooltip:!0,value:null,status:null,link:[],animation:null,animationDurationUpdate:200,lineStyle:{color:"#aaa",width:1,type:"solid"},shadowStyle:{color:"rgba(150,150,150,0.3)"},label:{show:!0,formatter:null,precision:"auto",margin:3,color:"#fff",padding:[5,7,5,7],backgroundColor:"auto",borderColor:null,borderWidth:0,shadowBlur:3,shadowColor:"#aaa"},handle:{show:!1,icon:"M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z",size:45,margin:50,color:"#333",shadowBlur:3,shadowColor:"#aaa",shadowOffsetX:0,shadowOffsetY:2,throttle:40}}}),On()),hS=d,cS=Ts({type:"axisPointer",render:function(t,e,n){var i=e.getComponent("tooltip"),r=t.get("triggerOn")||i&&i.get("triggerOn")||"mousemove|click";Gh("axisPointer",n,function(t,e,n){"none"!==r&&("leave"===t||r.indexOf(t)>=0)&&n({type:"updateAxisPointer",currTrigger:t,x:e&&e.offsetX,y:e&&e.offsetY})})},remove:function(t,e){qh(e.getZr(),"axisPointer"),cS.superApply(this._model,"remove",arguments)},dispose:function(t,e){qh("axisPointer",e),cS.superApply(this._model,"dispose",arguments)}}),dS=On(),fS=n,pS=m;($h.prototype={_group:null,_lastGraphicKey:null,_handle:null,_dragging:!1,_lastValue:null,_lastStatus:null,_payloadInfo:null,animationThreshold:15,render:function(t,e,n,i){var r=e.get("value"),o=e.get("status");if(this._axisModel=t,this._axisPointerModel=e,this._api=n,i||this._lastValue!==r||this._lastStatus!==o){this._lastValue=r,this._lastStatus=o;var a=this._group,s=this._handle;if(!o||"hide"===o)return a&&a.hide(),void(s&&s.hide());a&&a.show(),s&&s.show();var l={};this.makeElOption(l,r,t,e,n);var u=l.graphicKey;u!==this._lastGraphicKey&&this.clear(n),this._lastGraphicKey=u;var h=this._moveAnimation=this.determineAnimation(t,e);if(a){var c=v(Kh,e,h);this.updatePointerEl(a,l,c,e),this.updateLabelEl(a,l,c,e)}else a=this._group=new Jg,this.createPointerEl(a,l,t,e),this.createLabelEl(a,l,t,e),n.getZr().add(a);ec(a,e,!0),this._renderHandle(r)}},remove:function(t){this.clear(t)},dispose:function(t){this.clear(t)},determineAnimation:function(t,e){var n=e.get("animation"),i=t.axis,r="category"===i.type,o=e.get("snap");if(!o&&!r)return!1;if("auto"===n||null==n){var a=this.animationThreshold;if(r&&i.getBandWidth()>a)return!0;if(o){var s=rh(t).seriesDataCount,l=i.getExtent();return Math.abs(l[0]-l[1])/s>a}return!1}return!0===n},makeElOption:function(t,e,n,i,r){},createPointerEl:function(t,e,n,i){var r=e.pointer;if(r){var o=dS(t).pointerEl=new ky[r.type](fS(e.pointer));t.add(o)}},createLabelEl:function(t,e,n,i){if(e.label){var r=dS(t).labelEl=new py(fS(e.label));t.add(r),Jh(r,i)}},updatePointerEl:function(t,e,n){var i=dS(t).pointerEl;i&&(i.setStyle(e.pointer.style),n(i,{shape:e.pointer.shape}))},updateLabelEl:function(t,e,n,i){var r=dS(t).labelEl;r&&(r.setStyle(e.label.style),n(r,{shape:e.label.shape,position:e.label.position}),Jh(r,i))},_renderHandle:function(t){if(!this._dragging&&this.updateHandleTransform){var e=this._axisPointerModel,n=this._api.getZr(),i=this._handle,r=e.getModel("handle"),o=e.get("status");if(!r.get("show")||!o||"hide"===o)return i&&n.remove(i),void(this._handle=null);var a;this._handle||(a=!0,i=this._handle=br(r.get("icon"),{cursor:"move",draggable:!0,onmousemove:function(t){vg(t.event)},onmousedown:pS(this._onHandleDragMove,this,0,0),drift:pS(this._onHandleDragMove,this),ondragend:pS(this._onHandleDragEnd,this)}),n.add(i)),ec(i,e,!1);var s=["color","borderColor","borderWidth","opacity","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"];i.setStyle(r.getItemStyle(null,s));var l=r.get("size");y(l)||(l=[l,l]),i.attr("scale",[l[0]/2,l[1]/2]),xa(this,"_doDispatchAxisPointer",r.get("throttle")||0,"fixRate"),this._moveHandleToValue(t,a)}},_moveHandleToValue:function(t,e){Kh(this._axisPointerModel,!e&&this._moveAnimation,this._handle,tc(this.getHandleTransform(t,this._axisModel,this._axisPointerModel)))},_onHandleDragMove:function(t,e){var n=this._handle;if(n){this._dragging=!0;var i=this.updateHandleTransform(tc(n),[t,e],this._axisModel,this._axisPointerModel);this._payloadInfo=i,n.stopAnimation(),n.attr(tc(i)),dS(n).lastProp=null,this._doDispatchAxisPointer()}},_doDispatchAxisPointer:function(){if(this._handle){var t=this._payloadInfo,e=this._axisModel;this._api.dispatchAction({type:"updateAxisPointer",x:t.cursorPoint[0],y:t.cursorPoint[1],tooltipOption:t.tooltipOption,axesInfo:[{axisDim:e.axis.dim,axisIndex:e.componentIndex}]})}},_onHandleDragEnd:function(t){if(this._dragging=!1,this._handle){var e=this._axisPointerModel.get("value");this._moveHandleToValue(e),this._api.dispatchAction({type:"hideTip"})}},getHandleTransform:null,updateHandleTransform:null,clear:function(t){this._lastValue=null,this._lastStatus=null;var e=t.getZr(),n=this._group,i=this._handle;e&&n&&(this._lastGraphicKey=null,n&&e.remove(n),i&&e.remove(i),this._group=null,this._handle=null,this._payloadInfo=null)},doClear:function(){},buildLabel:function(t,e,n){return n=n||0,{x:t[n],y:t[1-n],width:e[n],height:e[1-n]}}}).constructor=$h,Wn($h);var gS=$h.extend({makeElOption:function(t,e,n,i,r){var o=n.axis,a=o.grid,s=i.get("type"),l=hc(a,o).getOtherAxis(o).getGlobalExtent(),u=o.toGlobalCoord(o.dataToCoord(e,!0));if(s&&"none"!==s){var h=nc(i),c=mS[s](o,u,l,h);c.style=h,t.graphicKey=c.type,t.pointer=c}sc(e,t,hh(a.model,n),n,i,r)},getHandleTransform:function(t,e,n){var i=hh(e.axis.grid.model,e,{labelInside:!1});return i.labelMargin=n.get("handle.margin"),{position:ac(e.axis,t,i),rotation:i.rotation+(i.labelDirection<0?Math.PI:0)}},updateHandleTransform:function(t,e,n,i){var r=n.axis,o=r.grid,a=r.getGlobalExtent(!0),s=hc(o,r).getOtherAxis(r).getGlobalExtent(),l="x"===r.dim?0:1,u=t.position;u[l]+=e[l],u[l]=Math.min(a[1],u[l]),u[l]=Math.max(a[0],u[l]);var h=(s[1]+s[0])/2,c=[h,h];c[l]=u[l];var d=[{verticalAlign:"middle"},{align:"center"}];return{position:u,rotation:t.rotation,cursorPoint:c,tooltipOption:d[l]}}}),mS={line:function(t,e,n,i){var r=lc([e,n[0]],[e,n[1]],cc(t));return Vi({shape:r,style:i}),{type:"Line",shape:r}},shadow:function(t,e,n,i){var r=Math.max(1,t.getBandWidth()),o=n[1]-n[0];return{type:"Rect",shape:uc([e-r/2,n[0]],[r,o],cc(t))}}};Bb.registerAxisPointerClass("CartesianAxisPointer",gS),ys(function(t){if(t){(!t.axisPointer||0===t.axisPointer.length)&&(t.axisPointer={});var e=t.axisPointer.link;e&&!y(e)&&(t.axisPointer.link=[e])}}),xs(O_.PROCESSOR.STATISTIC,function(t,e){t.getComponent("axisPointer").coordSysAxesInfo=Ku(t,e)}),_s({type:"updateAxisPointer",event:"updateAxisPointer",update:":updateAxisPointer"},function(t,e,n){var i=t.currTrigger,r=[t.x,t.y],o=t,a=t.dispatchAction||m(n.dispatchAction,n),s=e.getComponent("axisPointer").coordSysAxesInfo;if(s){Hh(r)&&(r=oS({seriesIndex:o.seriesIndex,dataIndex:o.dataIndex},e).point);var l=Hh(r),u=o.axesInfo,h=s.axesInfo,c="leave"===i||Hh(r),d={},f={},p={list:[],map:{}},g={showPointer:sS(Eh,f),showTooltip:sS(Nh,p)};aS(s.coordSysMap,function(t,e){var n=l||t.containPoint(r);aS(s.coordSysAxesInfo[e],function(t,e){var i=t.axis,o=Vh(u,t);if(!c&&n&&(!u||o)){var a=o&&o.value;null!=a||l||(a=i.pointToData(r)),null!=a&&Oh(t,a,g,!1,d)}})});var v={};return aS(h,function(t,e){var n=t.linkGroup;n&&!f[e]&&aS(n.axesInfo,function(e,i){var r=f[i];if(e!==t&&r){var o=r.value;n.mapper&&(o=t.axis.scale.parse(n.mapper(o,Wh(e),Wh(t)))),v[t.key]=o}})}),aS(v,function(t,e){Oh(h[e],t,g,!0,d)}),Rh(f,h,d),Bh(p,r,t,a),Fh(h,0,n),d}}),Is({type:"tooltip",dependencies:["axisPointer"],defaultOption:{zlevel:0,z:60,show:!0,showContent:!0,trigger:"item",triggerOn:"mousemove|click",alwaysShowContent:!1,displayMode:"single",renderMode:"auto",confine:!1,showDelay:0,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:"rgba(50,50,50,0.7)",borderColor:"#333",borderRadius:4,borderWidth:0,padding:5,extraCssText:"",axisPointer:{type:"line",axis:"auto",animation:"auto",animationDurationUpdate:200,animationEasingUpdate:"exponentialOut",crossStyle:{color:"#999",width:1,type:"dashed",textStyle:{}}},textStyle:{color:"#fff",fontSize:14}}});var vS=d,yS=Gr,xS=["","-webkit-","-moz-","-o-"];gc.prototype={constructor:gc,_enterable:!0,update:function(){var t=this._container,e=t.currentStyle||document.defaultView.getComputedStyle(t),n=t.style;"absolute"!==n.position&&"absolute"!==e.position&&(n.position="relative")},show:function(t){clearTimeout(this._hideTimeout);var e=this.el;e.style.cssText="position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;"+pc(t)+";left:"+this._x+"px;top:"+this._y+"px;"+(t.get("extraCssText")||""),e.style.display=e.innerHTML?"block":"none",e.style.pointerEvents=this._enterable?"auto":"none",this._show=!0},setContent:function(t){this.el.innerHTML=null==t?"":t},setEnterable:function(t){this._enterable=t},getSize:function(){var t=this.el;return[t.clientWidth,t.clientHeight]},moveTo:function(t,e){var n,i=this._zr;i&&i.painter&&(n=i.painter.getViewportRootOffset())&&(t+=n.offsetLeft,e+=n.offsetTop);var r=this.el.style;r.left=t+"px",r.top=e+"px",this._x=t,this._y=e},hide:function(){this.el.style.display="none",this._show=!1},hideLater:function(t){!this._show||this._inContent&&this._enterable||(t?(this._hideDelay=t,this._show=!1,this._hideTimeout=setTimeout(m(this.hide,this),t)):this.hide())},isShow:function(){return this._show},getOuterSize:function(){var t=this.el.clientWidth,e=this.el.clientHeight;if(document.defaultView&&document.defaultView.getComputedStyle){var n=document.defaultView.getComputedStyle(this.el);n&&(t+=parseInt(n.paddingLeft,10)+parseInt(n.paddingRight,10)+parseInt(n.borderLeftWidth,10)+parseInt(n.borderRightWidth,10),e+=parseInt(n.paddingTop,10)+parseInt(n.paddingBottom,10)+parseInt(n.borderTopWidth,10)+parseInt(n.borderBottomWidth,10))}return{width:t,height:e}}},mc.prototype={constructor:mc,_enterable:!0,update:function(){},show:function(t){this._hideTimeout&&clearTimeout(this._hideTimeout),this.el.attr("show",!0),this._show=!0},setContent:function(t,e,n){this.el&&this._zr.remove(this.el);for(var i={},r=t,o=r.indexOf("{marker");o>=0;){var a=r.indexOf("|}"),s=r.substr(o+"{marker".length,a-o-"{marker".length);s.indexOf("sub")>-1?i["marker"+s]={textWidth:4,textHeight:4,textBorderRadius:2,textBackgroundColor:e[s],textOffset:[3,0]}:i["marker"+s]={textWidth:10,textHeight:10,textBorderRadius:5,textBackgroundColor:e[s]},o=(r=r.substr(a+1)).indexOf("{marker")}this.el=new ry({style:{rich:i,text:t,textLineHeight:20,textBackgroundColor:n.get("backgroundColor"),textBorderRadius:n.get("borderRadius"),textFill:n.get("textStyle.color"),textPadding:n.get("padding")},z:n.get("z")}),this._zr.add(this.el);var l=this;this.el.on("mouseover",function(){l._enterable&&(clearTimeout(l._hideTimeout),l._show=!0),l._inContent=!0}),this.el.on("mouseout",function(){l._enterable&&l._show&&l.hideLater(l._hideDelay),l._inContent=!1})},setEnterable:function(t){this._enterable=t},getSize:function(){var t=this.el.getBoundingRect();return[t.width,t.height]},moveTo:function(t,e){this.el&&this.el.attr("position",[t,e])},hide:function(){this.el.hide(),this._show=!1},hideLater:function(t){!this._show||this._inContent&&this._enterable||(t?(this._hideDelay=t,this._show=!1,this._hideTimeout=setTimeout(m(this.hide,this),t)):this.hide())},isShow:function(){return this._show},getOuterSize:function(){return this.getSize()}};var _S=m,wS=d,bS=Dr,SS=new py({shape:{x:-1,y:-1,width:2,height:2}});Ts({type:"tooltip",init:function(t,e){if(!Xp.node){var n=t.getComponent("tooltip").get("renderMode");this._renderMode=Bn(n);var i;"html"===this._renderMode?(i=new gc(e.getDom(),e),this._newLine="<br/>"):(i=new mc(e),this._newLine="\n"),this._tooltipContent=i}},render:function(t,e,n){if(!Xp.node){this.group.removeAll(),this._tooltipModel=t,this._ecModel=e,this._api=n,this._lastDataByCoordSys=null,this._alwaysShowContent=t.get("alwaysShowContent");var i=this._tooltipContent;i.update(),i.setEnterable(t.get("enterable")),this._initGlobalListener(),this._keepShow()}},_initGlobalListener:function(){var t=this._tooltipModel.get("triggerOn");Gh("itemTooltip",this._api,_S(function(e,n,i){"none"!==t&&(t.indexOf(e)>=0?this._tryShow(n,i):"leave"===e&&this._hide(i))},this))},_keepShow:function(){var t=this._tooltipModel,e=this._ecModel,n=this._api;if(null!=this._lastX&&null!=this._lastY&&"none"!==t.get("triggerOn")){var i=this;clearTimeout(this._refreshUpdateTimeout),this._refreshUpdateTimeout=setTimeout(function(){i.manuallyShowTip(t,e,n,{x:i._lastX,y:i._lastY})})}},manuallyShowTip:function(t,e,n,i){if(i.from!==this.uid&&!Xp.node){var r=yc(i,n);this._ticket="";var o=i.dataByCoordSys;if(i.tooltip&&null!=i.x&&null!=i.y){var a=SS;a.position=[i.x,i.y],a.update(),a.tooltip=i.tooltip,this._tryShow({offsetX:i.x,offsetY:i.y,target:a},r)}else if(o)this._tryShow({offsetX:i.x,offsetY:i.y,position:i.position,event:{},dataByCoordSys:i.dataByCoordSys,tooltipOption:i.tooltipOption},r);else if(null!=i.seriesIndex){if(this._manuallyAxisShowTip(t,e,n,i))return;var s=oS(i,e),l=s.point[0],u=s.point[1];null!=l&&null!=u&&this._tryShow({offsetX:l,offsetY:u,position:i.position,target:s.el,event:{}},r)}else null!=i.x&&null!=i.y&&(n.dispatchAction({type:"updateAxisPointer",x:i.x,y:i.y}),this._tryShow({offsetX:i.x,offsetY:i.y,position:i.position,target:n.getZr().findHover(i.x,i.y).target,event:{}},r))}},manuallyHideTip:function(t,e,n,i){var r=this._tooltipContent;!this._alwaysShowContent&&this._tooltipModel&&r.hideLater(this._tooltipModel.get("hideDelay")),this._lastX=this._lastY=null,i.from!==this.uid&&this._hide(yc(i,n))},_manuallyAxisShowTip:function(t,e,n,i){var r=i.seriesIndex,o=i.dataIndex,a=e.getComponent("axisPointer").coordSysAxesInfo;if(null!=r&&null!=o&&null!=a){var s=e.getSeriesByIndex(r);if(s&&"axis"===(t=vc([s.getData().getItemModel(o),s,(s.coordinateSystem||{}).model,t])).get("trigger"))return n.dispatchAction({type:"updateAxisPointer",seriesIndex:r,dataIndex:o,position:i.position}),!0}},_tryShow:function(t,e){var n=t.target;if(this._tooltipModel){this._lastX=t.offsetX,this._lastY=t.offsetY;var i=t.dataByCoordSys;i&&i.length?this._showAxisTooltip(i,t):n&&null!=n.dataIndex?(this._lastDataByCoordSys=null,this._showSeriesItemTooltip(t,n,e)):n&&n.tooltip?(this._lastDataByCoordSys=null,this._showComponentItemTooltip(t,n,e)):(this._lastDataByCoordSys=null,this._hide(e))}},_showOrMove:function(t,e){var n=t.get("showDelay");e=m(e,this),clearTimeout(this._showTimout),n>0?this._showTimout=setTimeout(e,n):e()},_showAxisTooltip:function(t,e){var n=this._ecModel,r=this._tooltipModel,o=[e.offsetX,e.offsetY],a=[],s=[],l=vc([e.tooltipOption,r]),u=this._renderMode,h=this._newLine,c={};wS(t,function(t){wS(t.dataByAxis,function(t){var e=n.getComponent(t.axisDim+"Axis",t.axisIndex),r=t.value,o=[];if(e&&null!=r){var l=oc(r,e.axis,n,t.seriesDataIndices,t.valueLabelOpt);d(t.seriesDataIndices,function(a){var h=n.getSeriesByIndex(a.seriesIndex),d=a.dataIndexInside,f=h&&h.getDataParams(d);if(f.axisDim=t.axisDim,f.axisIndex=t.axisIndex,f.axisType=t.axisType,f.axisId=t.axisId,f.axisValue=Cl(e.axis,r),f.axisValueLabel=l,f){s.push(f);var p,g=h.formatTooltip(d,!0,null,u);if(w(g)){p=g.html;var m=g.markers;i(c,m)}else p=g;o.push(p)}});var f=l;"html"!==u?a.push(o.join(h)):a.push((f?Zr(f)+h:"")+o.join(h))}})},this),a.reverse(),a=a.join(this._newLine+this._newLine);var f=e.position;this._showOrMove(l,function(){this._updateContentNotChangedOnAxis(t)?this._updatePosition(l,f,o[0],o[1],this._tooltipContent,s):this._showTooltipContent(l,a,s,Math.random(),o[0],o[1],f,void 0,c)})},_showSeriesItemTooltip:function(t,e,n){var i=this._ecModel,r=e.seriesIndex,o=i.getSeriesByIndex(r),a=e.dataModel||o,s=e.dataIndex,l=e.dataType,u=a.getData(),h=vc([u.getItemModel(s),a,o&&(o.coordinateSystem||{}).model,this._tooltipModel]),c=h.get("trigger");if(null==c||"item"===c){var d,f,p=a.getDataParams(s,l),g=a.formatTooltip(s,!1,l,this._renderMode);w(g)?(d=g.html,f=g.markers):(d=g,f=null);var m="item_"+a.name+"_"+s;this._showOrMove(h,function(){this._showTooltipContent(h,d,p,m,t.offsetX,t.offsetY,t.position,t.target,f)}),n({type:"showTip",dataIndexInside:s,dataIndex:u.getRawIndex(s),seriesIndex:r,from:this.uid})}},_showComponentItemTooltip:function(t,e,n){var i=e.tooltip;if("string"==typeof i){var r=i;i={content:r,formatter:r}}var o=new Sr(i,this._tooltipModel,this._ecModel),a=o.get("content"),s=Math.random();this._showOrMove(o,function(){this._showTooltipContent(o,a,o.get("formatterParams")||{},s,t.offsetX,t.offsetY,t.position,e)}),n({type:"showTip",from:this.uid})},_showTooltipContent:function(t,e,n,i,r,o,a,s,l){if(this._ticket="",t.get("showContent")&&t.get("show")){var u=this._tooltipContent,h=t.get("formatter");a=a||t.get("position");var c=e;if(h&&"string"==typeof h)c=Ur(h,n,!0);else if("function"==typeof h){var d=_S(function(e,i){e===this._ticket&&(u.setContent(i,l,t),this._updatePosition(t,a,r,o,u,n,s))},this);this._ticket=i,c=h(n,i,d)}u.setContent(c,l,t),u.show(t),this._updatePosition(t,a,r,o,u,n,s)}},_updatePosition:function(t,e,n,i,r,o,a){var s=this._api.getWidth(),l=this._api.getHeight();e=e||t.get("position");var u=r.getSize(),h=t.get("align"),c=t.get("verticalAlign"),d=a&&a.getBoundingRect().clone();if(a&&d.applyTransform(a.transform),"function"==typeof e&&(e=e([n,i],o,r.el,d,{viewSize:[s,l],contentSize:u.slice()})),y(e))n=bS(e[0],s),i=bS(e[1],l);else if(w(e)){e.width=u[0],e.height=u[1];var f=Kr(e,{width:s,height:l});n=f.x,i=f.y,h=null,c=null}else"string"==typeof e&&a?(n=(p=wc(e,d,u))[0],i=p[1]):(n=(p=xc(n,i,r,s,l,h?null:20,c?null:20))[0],i=p[1]);if(h&&(n-=bc(h)?u[0]/2:"right"===h?u[0]:0),c&&(i-=bc(c)?u[1]/2:"bottom"===c?u[1]:0),t.get("confine")){var p=_c(n,i,r,s,l);n=p[0],i=p[1]}r.moveTo(n,i)},_updateContentNotChangedOnAxis:function(t){var e=this._lastDataByCoordSys,n=!!e&&e.length===t.length;return n&&wS(e,function(e,i){var r=e.dataByAxis||{},o=(t[i]||{}).dataByAxis||[];(n&=r.length===o.length)&&wS(r,function(t,e){var i=o[e]||{},r=t.seriesDataIndices||[],a=i.seriesDataIndices||[];(n&=t.value===i.value&&t.axisType===i.axisType&&t.axisId===i.axisId&&r.length===a.length)&&wS(r,function(t,e){var i=a[e];n&=t.seriesIndex===i.seriesIndex&&t.dataIndex===i.dataIndex})})}),this._lastDataByCoordSys=t,!!n},_hide:function(t){this._lastDataByCoordSys=null,t({type:"hideTip",from:this.uid})},dispose:function(t,e){Xp.node||(this._tooltipContent.hide(),qh("itemTooltip",e))}}),_s({type:"showTip",event:"showTip",update:"tooltip:manuallyShowTip"},function(){}),_s({type:"hideTip",event:"hideTip",update:"tooltip:manuallyHideTip"},function(){});var MS=Is({type:"legend.plain",dependencies:["series"],layoutMode:{type:"box",ignoreSize:!0},init:function(t,e,n){this.mergeDefaultAndTheme(t,n),t.selected=t.selected||{}},mergeOption:function(t){MS.superCall(this,"mergeOption",t)},optionUpdated:function(){this._updateData(this.ecModel);var t=this._data;if(t[0]&&"single"===this.get("selectedMode")){for(var e=!1,n=0;n<t.length;n++){var i=t[n].get("name");if(this.isSelected(i)){this.select(i),e=!0;break}}!e&&this.select(t[0].get("name"))}},_updateData:function(t){var e=[],n=[];t.eachRawSeries(function(i){var r=i.name;n.push(r);var o;if(i.legendDataProvider){var a=i.legendDataProvider(),s=a.mapArray(a.getName);t.isSeriesFiltered(i)||(n=n.concat(s)),s.length?e=e.concat(s):o=!0}else o=!0;o&&kn(i)&&e.push(i.name)}),this._availableNames=n;var i=f(this.get("data")||e,function(t){return"string"!=typeof t&&"number"!=typeof t||(t={name:t}),new Sr(t,this,this.ecModel)},this);this._data=i},getData:function(){return this._data},select:function(t){var e=this.option.selected;"single"===this.get("selectedMode")&&d(this._data,function(t){e[t.get("name")]=!1}),e[t]=!0},unSelect:function(t){"single"!==this.get("selectedMode")&&(this.option.selected[t]=!1)},toggleSelected:function(t){var e=this.option.selected;e.hasOwnProperty(t)||(e[t]=!0),this[e[t]?"unSelect":"select"](t)},isSelected:function(t){var e=this.option.selected;return!(e.hasOwnProperty(t)&&!e[t])&&l(this._availableNames,t)>=0},defaultOption:{zlevel:0,z:4,show:!0,orient:"horizontal",left:"center",top:0,align:"auto",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemGap:10,itemWidth:25,itemHeight:14,inactiveColor:"#ccc",textStyle:{color:"#333"},selectedMode:!0,tooltip:{show:!1}}});_s("legendToggleSelect","legendselectchanged",v(Sc,"toggleSelected")),_s("legendSelect","legendselected",v(Sc,"select")),_s("legendUnSelect","legendunselected",v(Sc,"unSelect"));var IS=v,TS=d,CS=Jg,AS=Ts({type:"legend.plain",newlineDisabled:!1,init:function(){this.group.add(this._contentGroup=new CS),this._backgroundEl},getContentGroup:function(){return this._contentGroup},render:function(t,e,n){if(this.resetInner(),t.get("show",!0)){var i=t.get("align");i&&"auto"!==i||(i="right"===t.get("left")&&"vertical"===t.get("orient")?"right":"left"),this.renderInner(i,t,e,n);var r=t.getBoxLayoutParams(),o={width:n.getWidth(),height:n.getHeight()},s=t.get("padding"),l=Kr(r,o,s),u=this.layoutInner(t,i,l),h=Kr(a({width:u.width,height:u.height},r),o,s);this.group.attr("position",[h.x-u.x,h.y-u.y]),this.group.add(this._backgroundEl=Ic(u,t))}},resetInner:function(){this.getContentGroup().removeAll(),this._backgroundEl&&this.group.remove(this._backgroundEl)},renderInner:function(t,e,n,i){var r=this.getContentGroup(),o=N(),a=e.get("selectedMode"),s=[];n.eachRawSeries(function(t){!t.get("legendHoverLink")&&s.push(t.id)}),TS(e.getData(),function(l,u){var h=l.get("name");if(this.newlineDisabled||""!==h&&"\n"!==h){var c=n.getSeriesByName(h)[0];if(!o.get(h))if(c){var d=c.getData(),f=d.getVisual("color");"function"==typeof f&&(f=f(c.getDataParams(0)));var p=d.getVisual("legendSymbol")||"roundRect",g=d.getVisual("symbol");this._createItem(h,u,l,e,p,g,t,f,a).on("click",IS(Tc,h,i)).on("mouseover",IS(Cc,c.name,null,i,s)).on("mouseout",IS(Ac,c.name,null,i,s)),o.set(h,!0)}else n.eachRawSeries(function(n){if(!o.get(h)&&n.legendDataProvider){var r=n.legendDataProvider(),c=r.indexOfName(h);if(c<0)return;var d=r.getItemVisual(c,"color");this._createItem(h,u,l,e,"roundRect",null,t,d,a).on("click",IS(Tc,h,i)).on("mouseover",IS(Cc,null,h,i,s)).on("mouseout",IS(Ac,null,h,i,s)),o.set(h,!0)}},this)}else r.add(new CS({newline:!0}))},this)},_createItem:function(t,e,n,i,r,a,s,l,u){var h=i.get("itemWidth"),c=i.get("itemHeight"),d=i.get("inactiveColor"),f=i.get("symbolKeepAspect"),p=i.isSelected(t),g=new CS,m=n.getModel("textStyle"),v=n.get("icon"),y=n.getModel("tooltip"),x=y.parentModel;if(r=v||r,g.add(Pl(r,0,0,h,c,p?l:d,null==f||f)),!v&&a&&(a!==r||"none"===a)){var _=.8*c;"none"===a&&(a="circle"),g.add(Pl(a,(h-_)/2,(c-_)/2,_,_,p?l:d,null==f||f))}var w="left"===s?h+5:-5,b=s,S=i.get("formatter"),M=t;"string"==typeof S&&S?M=S.replace("{name}",null!=t?t:""):"function"==typeof S&&(M=S(t)),g.add(new ry({style:ar({},m,{text:M,x:w,y:c/2,textFill:p?m.getTextColor():d,textAlign:b,textVerticalAlign:"middle"})}));var I=new py({shape:g.getBoundingRect(),invisible:!0,tooltip:y.get("show")?o({content:t,formatter:x.get("formatter",!0)||function(){return t},formatterParams:{componentType:"legend",legendIndex:i.componentIndex,name:t,$vars:["name"]}},y.option):null});return g.add(I),g.eachChild(function(t){t.silent=!0}),I.silent=!u,this.getContentGroup().add(g),ir(g),g.__legendDataIndex=e,g},layoutInner:function(t,e,n){var i=this.getContentGroup();Qy(t.get("orient"),i,t.get("itemGap"),n.width,n.height);var r=i.getBoundingRect();return i.attr("position",[-r.x,-r.y]),this.group.getBoundingRect()}});xs(function(t){var e=t.findComponents({mainType:"legend"});e&&e.length&&t.filterSeries(function(t){for(var n=0;n<e.length;n++)if(!e[n].isSelected(t.name))return!1;return!0})}),ex.registerSubTypeDefaulter("legend",function(){return"plain"});var DS=MS.extend({type:"legend.scroll",setScrollDataIndex:function(t){this.option.scrollDataIndex=t},defaultOption:{scrollDataIndex:0,pageButtonItemGap:5,pageButtonGap:null,pageButtonPosition:"end",pageFormatter:"{current}/{total}",pageIcons:{horizontal:["M0,0L12,-10L12,10z","M0,0L-12,-10L-12,10z"],vertical:["M0,0L20,0L10,-20z","M0,0L20,0L10,20z"]},pageIconColor:"#2f4554",pageIconInactiveColor:"#aaa",pageIconSize:15,pageTextStyle:{color:"#333"},animationDurationUpdate:800},init:function(t,e,n,i){var r=to(t);DS.superCall(this,"init",t,e,n,i),Dc(this,t,r)},mergeOption:function(t,e){DS.superCall(this,"mergeOption",t,e),Dc(this,this.option,t)},getOrient:function(){return"vertical"===this.get("orient")?{index:1,name:"vertical"}:{index:0,name:"horizontal"}}}),kS=Jg,PS=["width","height"],LS=["x","y"],OS=AS.extend({type:"legend.scroll",newlineDisabled:!0,init:function(){OS.superCall(this,"init"),this._currentIndex=0,this.group.add(this._containerGroup=new kS),this._containerGroup.add(this.getContentGroup()),this.group.add(this._controllerGroup=new kS),this._showController},resetInner:function(){OS.superCall(this,"resetInner"),this._controllerGroup.removeAll(),this._containerGroup.removeClipPath(),this._containerGroup.__rectSize=null},renderInner:function(t,e,n,i){function r(t,n){var r=t+"DataIndex",l=br(e.get("pageIcons",!0)[e.getOrient().name][n],{onclick:m(o._pageGo,o,r,e,i)},{x:-s[0]/2,y:-s[1]/2,width:s[0],height:s[1]});l.name=t,a.add(l)}var o=this;OS.superCall(this,"renderInner",t,e,n,i);var a=this._controllerGroup,s=e.get("pageIconSize",!0);y(s)||(s=[s,s]),r("pagePrev",0);var l=e.getModel("pageTextStyle");a.add(new ry({name:"pageText",style:{textFill:l.getTextColor(),font:l.getFont(),textVerticalAlign:"middle",textAlign:"center"},silent:!0})),r("pageNext",1)},layoutInner:function(t,e,n){var i=this.getContentGroup(),r=this._containerGroup,o=this._controllerGroup,a=t.getOrient().index,s=PS[a],l=PS[1-a],u=LS[1-a];Qy(t.get("orient"),i,t.get("itemGap"),a?n.width:null,a?null:n.height),Qy("horizontal",o,t.get("pageButtonItemGap",!0));var h=i.getBoundingRect(),c=o.getBoundingRect(),d=this._showController=h[s]>n[s],f=[-h.x,-h.y];f[a]=i.position[a];var p=[0,0],g=[-c.x,-c.y],m=C(t.get("pageButtonGap",!0),t.get("itemGap",!0));d&&("end"===t.get("pageButtonPosition",!0)?g[a]+=n[s]-c[s]:p[a]+=c[s]+m),g[1-a]+=h[l]/2-c[l]/2,i.attr("position",f),r.attr("position",p),o.attr("position",g);var v=this.group.getBoundingRect();if((v={x:0,y:0})[s]=d?n[s]:h[s],v[l]=Math.max(h[l],c[l]),v[u]=Math.min(0,c[u]+g[1-a]),r.__rectSize=n[s],d){var y={x:0,y:0};y[s]=Math.max(n[s]-c[s]-m,0),y[l]=v[l],r.setClipPath(new py({shape:y})),r.__rectSize=y[s]}else o.eachChild(function(t){t.attr({invisible:!0,silent:!0})});var x=this._getPageInfo(t);return null!=x.pageIndex&&gr(i,{position:x.contentPosition},!!d&&t),this._updatePageInfoView(t,x),v},_pageGo:function(t,e,n){var i=this._getPageInfo(e)[t];null!=i&&n.dispatchAction({type:"legendScroll",scrollDataIndex:i,legendId:e.id})},_updatePageInfoView:function(t,e){var n=this._controllerGroup;d(["pagePrev","pageNext"],function(i){var r=null!=e[i+"DataIndex"],o=n.childOfName(i);o&&(o.setStyle("fill",r?t.get("pageIconColor",!0):t.get("pageIconInactiveColor",!0)),o.cursor=r?"pointer":"default")});var i=n.childOfName("pageText"),r=t.get("pageFormatter"),o=e.pageIndex,a=null!=o?o+1:0,s=e.pageCount;i&&r&&i.setStyle("text",_(r)?r.replace("{current}",a).replace("{total}",s):r({current:a,total:s}))},_getPageInfo:function(t){function e(t){var e=t.getBoundingRect().clone();return e[f]+=t.position[h],e}var n,i,r,o,a=t.get("scrollDataIndex",!0),s=this.getContentGroup(),l=s.getBoundingRect(),u=this._containerGroup.__rectSize,h=t.getOrient().index,c=PS[h],d=PS[1-h],f=LS[h],p=s.position.slice();this._showController?s.eachChild(function(t){t.__legendDataIndex===a&&(o=t)}):o=s.childAt(0);var g=u?Math.ceil(l[c]/u):0;if(o){var m=o.getBoundingRect(),v=o.position[h]+m[f];p[h]=-v-l[f],n=Math.floor(g*(v+m[f]+u/2)/l[c]),n=l[c]&&g?Math.max(0,Math.min(g-1,n)):-1;var y={x:0,y:0};y[c]=u,y[d]=l[d],y[f]=-p[h]-l[f];var x,_=s.children();if(s.eachChild(function(t,n){var i=e(t);i.intersect(y)&&(null==x&&(x=n),r=t.__legendDataIndex),n===_.length-1&&i[f]+i[c]<=y[f]+y[c]&&(r=null)}),null!=x){var w=e(_[x]);if(y[f]=w[f]+w[c]-y[c],x<=0&&w[f]>=y[f])i=null;else{for(;x>0&&e(_[x-1]).intersect(y);)x--;i=_[x].__legendDataIndex}}}return{contentPosition:p,pageIndex:n,pageCount:g,pagePrevDataIndex:i,pageNextDataIndex:r}}});_s("legendScroll","legendscroll",function(t,e){var n=t.scrollDataIndex;null!=n&&e.eachComponent({mainType:"legend",subType:"scroll",query:t},function(t){t.setScrollDataIndex(n)})}),Is({type:"title",layoutMode:{type:"box",ignoreSize:!0},defaultOption:{zlevel:0,z:6,show:!0,text:"",target:"blank",subtext:"",subtarget:"blank",left:0,top:0,backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,textStyle:{fontSize:18,fontWeight:"bolder",color:"#333"},subtextStyle:{color:"#aaa"}}}),Ts({type:"title",render:function(t,e,n){if(this.group.removeAll(),t.get("show")){var i=this.group,r=t.getModel("textStyle"),o=t.getModel("subtextStyle"),a=t.get("textAlign"),s=t.get("textBaseline"),l=new ry({style:ar({},r,{text:t.get("text"),textFill:r.getTextColor()},{disableBox:!0}),z2:10}),u=l.getBoundingRect(),h=t.get("subtext"),c=new ry({style:ar({},o,{text:h,textFill:o.getTextColor(),y:u.height+t.get("itemGap"),textVerticalAlign:"top"},{disableBox:!0}),z2:10}),d=t.get("link"),f=t.get("sublink"),p=t.get("triggerEvent",!0);l.silent=!d&&!p,c.silent=!f&&!p,d&&l.on("click",function(){window.open(d,"_"+t.get("target"))}),f&&c.on("click",function(){window.open(f,"_"+t.get("subtarget"))}),l.eventData=c.eventData=p?{componentType:"title",componentIndex:t.componentIndex}:null,i.add(l),h&&i.add(c);var g=i.getBoundingRect(),m=t.getBoxLayoutParams();m.width=g.width,m.height=g.height;var v=Kr(m,{width:n.getWidth(),height:n.getHeight()},t.get("padding"));a||("middle"===(a=t.get("left")||t.get("right"))&&(a="center"),"right"===a?v.x+=v.width:"center"===a&&(v.x+=v.width/2)),s||("center"===(s=t.get("top")||t.get("bottom"))&&(s="middle"),"bottom"===s?v.y+=v.height:"middle"===s&&(v.y+=v.height/2),s=s||"top"),i.attr("position",[v.x,v.y]);var y={textAlign:a,textVerticalAlign:s};l.setStyle(y),c.setStyle(y),g=i.getBoundingRect();var x=v.margin,_=t.getItemStyle(["color","opacity"]);_.fill=t.get("backgroundColor");var w=new py({shape:{x:g.x-x[3],y:g.y-x[0],width:g.width+x[1]+x[3],height:g.height+x[0]+x[2],r:t.get("borderRadius")},style:_,silent:!0});Wi(w),i.add(w)}}});var zS=Hr,ES=Zr,NS=Is({type:"marker",dependencies:["series","grid","polar","geo"],init:function(t,e,n,i){this.mergeDefaultAndTheme(t,n),this.mergeOption(t,n,i.createdBySelf,!0)},isAnimationEnabled:function(){if(Xp.node)return!1;var t=this.__hostSeries;return this.getShallow("animation")&&t&&t.isAnimationEnabled()},mergeOption:function(t,e,n,i){var r=this.constructor,a=this.mainType+"Model";n||e.eachSeries(function(t){var n=t.get(this.mainType,!0),s=t[a];n&&n.data?(s?s.mergeOption(n,e,!0):(i&&kc(n),d(n.data,function(t){t instanceof Array?(kc(t[0]),kc(t[1])):kc(t)}),o(s=new r(n,this,e),{mainType:this.mainType,seriesIndex:t.seriesIndex,name:t.name,createdBySelf:!0}),s.__hostSeries=t),t[a]=s):t[a]=null},this)},formatTooltip:function(t){var e=this.getData(),n=this.getRawValue(t),i=y(n)?f(n,zS).join(", "):zS(n),r=e.getName(t),o=ES(this.name);return(null!=n||r)&&(o+="<br />"),r&&(o+=ES(r),null!=n&&(o+=" : ")),null!=n&&(o+=ES(i)),o},getData:function(){return this._data},setData:function(t){this._data=t}});h(NS,Bx),NS.extend({type:"markPoint",defaultOption:{zlevel:0,z:5,symbol:"pin",symbolSize:50,tooltip:{trigger:"item"},label:{show:!0,position:"inside"},itemStyle:{borderWidth:2},emphasis:{label:{show:!0}}}});var RS=l,BS=v,FS={min:BS(Oc,"min"),max:BS(Oc,"max"),average:BS(Oc,"average")},VS=Ts({type:"marker",init:function(){this.markerGroupMap=N()},render:function(t,e,n){var i=this.markerGroupMap;i.each(function(t){t.__keep=!1});var r=this.type+"Model";e.eachSeries(function(t){var i=t[r];i&&this.renderSeries(t,i,e,n)},this),i.each(function(t){!t.__keep&&this.group.remove(t.group)},this)},renderSeries:function(){}});VS.extend({type:"markPoint",updateTransform:function(t,e,n){e.eachSeries(function(t){var e=t.markPointModel;e&&(Vc(e.getData(),t,n),this.markerGroupMap.get(t.id).updateLayout(e))},this)},renderSeries:function(t,e,n,i){var r=t.coordinateSystem,o=t.id,a=t.getData(),s=this.markerGroupMap,l=s.get(o)||s.set(o,new lu),u=Wc(r,t,e);e.setData(u),Vc(e.getData(),t,i),u.each(function(t){var n=u.getItemModel(t),i=n.getShallow("symbolSize");"function"==typeof i&&(i=i(e.getRawValue(t),e.getDataParams(t))),u.setItemVisual(t,{symbolSize:i,color:n.get("itemStyle.color")||a.getVisual("color"),symbol:n.getShallow("symbol")})}),l.updateData(u),this.group.add(l.group),u.eachItemGraphicEl(function(t){t.traverse(function(t){t.dataModel=e})}),l.__keep=!0,l.group.silent=e.get("silent")||t.get("silent")}}),ys(function(t){t.markPoint=t.markPoint||{}}),NS.extend({type:"markLine",defaultOption:{zlevel:0,z:5,symbol:["circle","arrow"],symbolSize:[8,16],precision:2,tooltip:{trigger:"item"},label:{show:!0,position:"end"},lineStyle:{type:"dashed"},emphasis:{label:{show:!0},lineStyle:{width:3}},animationEasing:"linear"}});var WS=gy.prototype,HS=vy.prototype,GS=Ei({type:"ec-line",style:{stroke:"#000",fill:null},shape:{x1:0,y1:0,x2:0,y2:0,percent:1,cpx1:null,cpy1:null},buildPath:function(t,e){(Hc(e)?WS:HS).buildPath(t,e)},pointAt:function(t){return Hc(this.shape)?WS.pointAt.call(this,t):HS.pointAt.call(this,t)},tangentAt:function(t){var e=this.shape,n=Hc(e)?[e.x2-e.x1,e.y2-e.y1]:HS.tangentAt.call(this,t);return Y(n,n)}}),ZS=["fromSymbol","toSymbol"],US=Yc.prototype;US.beforeUpdate=function(){var t=this,e=t.childOfName("fromSymbol"),n=t.childOfName("toSymbol"),i=t.childOfName("label");if(e||n||!i.ignore){for(var r=1,o=this.parent;o;)o.scale&&(r/=o.scale[0]),o=o.parent;var a=t.childOfName("line");if(this.__dirty||a.__dirty){var s=a.shape.percent,l=a.pointAt(0),u=a.pointAt(s),h=G([],u,l);if(Y(h,h),e&&(e.attr("position",l),c=a.tangentAt(0),e.attr("rotation",Math.PI/2-Math.atan2(c[1],c[0])),e.attr("scale",[r*s,r*s])),n){n.attr("position",u);var c=a.tangentAt(1);n.attr("rotation",-Math.PI/2-Math.atan2(c[1],c[0])),n.attr("scale",[r*s,r*s])}if(!i.ignore){i.attr("position",u);var d,f,p,g=5*r;if("end"===i.__position)d=[h[0]*g+u[0],h[1]*g+u[1]],f=h[0]>.8?"left":h[0]<-.8?"right":"center",p=h[1]>.8?"top":h[1]<-.8?"bottom":"middle";else if("middle"===i.__position){var m=s/2,v=[(c=a.tangentAt(m))[1],-c[0]],y=a.pointAt(m);v[1]>0&&(v[0]=-v[0],v[1]=-v[1]),d=[y[0]+v[0]*g,y[1]+v[1]*g],f="center",p="bottom";var x=-Math.atan2(c[1],c[0]);u[0]<l[0]&&(x=Math.PI+x),i.attr("rotation",x)}else d=[-h[0]*g+l[0],-h[1]*g+l[1]],f=h[0]>.8?"right":h[0]<-.8?"left":"center",p=h[1]>.8?"bottom":h[1]<-.8?"top":"middle";i.attr({style:{textVerticalAlign:i.__verticalAlign||p,textAlign:i.__textAlign||f},position:d,scale:[r,r]})}}}},US._createLine=function(t,e,n){var i=t.hostModel,r=Uc(t.getItemLayout(e));r.shape.percent=0,mr(r,{shape:{percent:1}},i,e),this.add(r);var o=new ry({name:"label"});this.add(o),d(ZS,function(n){var i=Zc(n,t,e);this.add(i),this[Gc(n)]=t.getItemVisual(e,n)},this),this._updateCommonStl(t,e,n)},US.updateData=function(t,e,n){var i=t.hostModel,r=this.childOfName("line"),o=t.getItemLayout(e),a={shape:{}};Xc(a.shape,o),gr(r,a,i,e),d(ZS,function(n){var i=t.getItemVisual(e,n),r=Gc(n);if(this[r]!==i){this.remove(this.childOfName(n));var o=Zc(n,t,e);this.add(o)}this[r]=i},this),this._updateCommonStl(t,e,n)},US._updateCommonStl=function(t,e,n){var i=t.hostModel,r=this.childOfName("line"),o=n&&n.lineStyle,s=n&&n.hoverLineStyle,l=n&&n.labelModel,u=n&&n.hoverLabelModel;if(!n||t.hasItemOption){var h=t.getItemModel(e);o=h.getModel("lineStyle").getLineStyle(),s=h.getModel("emphasis.lineStyle").getLineStyle(),l=h.getModel("label"),u=h.getModel("emphasis.label")}var c=t.getItemVisual(e,"color"),f=A(t.getItemVisual(e,"opacity"),o.opacity,1);r.useStyle(a({strokeNoScale:!0,fill:"none",stroke:c,opacity:f},o)),r.hoverStyle=s,d(ZS,function(t){var e=this.childOfName(t);e&&(e.setColor(c),e.setStyle({opacity:f}))},this);var p,g,m=l.getShallow("show"),v=u.getShallow("show"),y=this.childOfName("label");if((m||v)&&(p=c||"#000",null==(g=i.getFormattedLabel(e,"normal",t.dataType)))){var x=i.getRawValue(e);g=null==x?t.getName(e):isFinite(x)?kr(x):x}var _=m?g:null,w=v?C(i.getFormattedLabel(e,"emphasis",t.dataType),g):null,b=y.style;null==_&&null==w||(ar(y.style,l,{text:_},{autoColor:p}),y.__textAlign=b.textAlign,y.__verticalAlign=b.textVerticalAlign,y.__position=l.get("position")||"middle"),y.hoverStyle=null!=w?{text:w,textFill:u.getTextColor(!0),fontStyle:u.getShallow("fontStyle"),fontWeight:u.getShallow("fontWeight"),fontSize:u.getShallow("fontSize"),fontFamily:u.getShallow("fontFamily")}:{text:null},y.ignore=!m&&!v,ir(this)},US.highlight=function(){this.trigger("emphasis")},US.downplay=function(){this.trigger("normal")},US.updateLayout=function(t,e){this.setLinePoints(t.getItemLayout(e))},US.setLinePoints=function(t){var e=this.childOfName("line");Xc(e.shape,t),e.dirty()},u(Yc,Jg);var XS=jc.prototype;XS.isPersistent=function(){return!0},XS.updateData=function(t){var e=this,n=e.group,i=e._lineData;e._lineData=t,i||n.removeAll();var r=Kc(t);t.diff(i).add(function(n){qc(e,t,n,r)}).update(function(n,o){$c(e,i,t,o,n,r)}).remove(function(t){n.remove(i.getItemGraphicEl(t))}).execute()},XS.updateLayout=function(){var t=this._lineData;t&&t.eachItemGraphicEl(function(e,n){e.updateLayout(t,n)},this)},XS.incrementalPrepareUpdate=function(t){this._seriesScope=Kc(t),this._lineData=null,this.group.removeAll()},XS.incrementalUpdate=function(t,e){for(var n=t.start;n<t.end;n++)if(Jc(e.getItemLayout(n))){var i=new this._ctor(e,n,this._seriesScope);i.traverse(function(t){t.isGroup||(t.incremental=t.useHoverLayer=!0)}),this.group.add(i),e.setItemGraphicEl(n,i)}},XS.remove=function(){this._clearIncremental(),this._incremental=null,this.group.removeAll()},XS._clearIncremental=function(){var t=this._incremental;t&&t.clearDisplaybles()};var YS=function(t,e,r,a){var s=t.getData(),l=a.type;if(!y(a)&&("min"===l||"max"===l||"average"===l||"median"===l||null!=a.xAxis||null!=a.yAxis)){var u,h;if(null!=a.yAxis||null!=a.xAxis)u=null!=a.yAxis?"y":"x",e.getAxis(u),h=T(a.yAxis,a.xAxis);else{var c=Ec(a,s,e,t);u=c.valueDataDim,c.valueAxis,h=Fc(s,u,l)}var d="x"===u?0:1,f=1-d,p=n(a),g={};p.type=null,p.coord=[],g.coord=[],p.coord[f]=-1/0,g.coord[f]=1/0;var m=r.get("precision");m>=0&&"number"==typeof h&&(h=+h.toFixed(Math.min(m,20))),p.coord[d]=g.coord[d]=h,a=[p,g,{type:l,valueIndex:a.valueIndex,value:h}]}return a=[zc(t,a[0]),zc(t,a[1]),o({},a[2])],a[2].type=a[2].type||"",i(a[2],a[0]),i(a[2],a[1]),a};VS.extend({type:"markLine",updateTransform:function(t,e,n){e.eachSeries(function(t){var e=t.markLineModel;if(e){var i=e.getData(),r=e.__from,o=e.__to;r.each(function(e){id(r,e,!0,t,n),id(o,e,!1,t,n)}),i.each(function(t){i.setItemLayout(t,[r.getItemLayout(t),o.getItemLayout(t)])}),this.markerGroupMap.get(t.id).updateLayout()}},this)},renderSeries:function(t,e,n,i){function r(e,n,r){var o=e.getItemModel(n);id(e,n,r,t,i),e.setItemVisual(n,{symbolSize:o.get("symbolSize")||g[r?0:1],symbol:o.get("symbol",!0)||p[r?0:1],color:o.get("itemStyle.color")||s.getVisual("color")})}var o=t.coordinateSystem,a=t.id,s=t.getData(),l=this.markerGroupMap,u=l.get(a)||l.set(a,new jc);this.group.add(u.group);var h=rd(o,t,e),c=h.from,d=h.to,f=h.line;e.__from=c,e.__to=d,e.setData(f);var p=e.get("symbol"),g=e.get("symbolSize");y(p)||(p=[p,p]),"number"==typeof g&&(g=[g,g]),h.from.each(function(t){r(c,t,!0),r(d,t,!1)}),f.each(function(t){var e=f.getItemModel(t).get("lineStyle.color");f.setItemVisual(t,{color:e||c.getItemVisual(t,"color")}),f.setItemLayout(t,[c.getItemLayout(t),d.getItemLayout(t)]),f.setItemVisual(t,{fromSymbolSize:c.getItemVisual(t,"symbolSize"),fromSymbol:c.getItemVisual(t,"symbol"),toSymbolSize:d.getItemVisual(t,"symbolSize"),toSymbol:d.getItemVisual(t,"symbol")})}),u.updateData(f),h.line.eachItemGraphicEl(function(t,n){t.traverse(function(t){t.dataModel=e})}),u.__keep=!0,u.group.silent=e.get("silent")||t.get("silent")}}),ys(function(t){t.markLine=t.markLine||{}}),NS.extend({type:"markArea",defaultOption:{zlevel:0,z:1,tooltip:{trigger:"item"},animation:!1,label:{show:!0,position:"top"},itemStyle:{borderWidth:0},emphasis:{label:{show:!0,position:"top"}}}});var jS=function(t,e,n,i){var o=zc(t,i[0]),a=zc(t,i[1]),s=T,l=o.coord,u=a.coord;l[0]=s(l[0],-1/0),l[1]=s(l[1],-1/0),u[0]=s(u[0],1/0),u[1]=s(u[1],1/0);var h=r([{},o,a]);return h.coord=[o.coord,a.coord],h.x0=o.x,h.y0=o.y,h.x1=a.x,h.y1=a.y,h},qS=[["x0","y0"],["x1","y0"],["x1","y1"],["x0","y1"]];VS.extend({type:"markArea",updateTransform:function(t,e,n){e.eachSeries(function(t){var e=t.markAreaModel;if(e){var i=e.getData();i.each(function(e){var r=f(qS,function(r){return ld(i,e,r,t,n)});i.setItemLayout(e,r),i.getItemGraphicEl(e).setShape("points",r)})}},this)},renderSeries:function(t,e,n,i){var r=t.coordinateSystem,o=t.id,s=t.getData(),l=this.markerGroupMap,u=l.get(o)||l.set(o,{group:new Jg});this.group.add(u.group),u.__keep=!0;var h=ud(r,t,e);e.setData(h),h.each(function(e){h.setItemLayout(e,f(qS,function(n){return ld(h,e,n,t,i)})),h.setItemVisual(e,{color:s.getVisual("color")})}),h.diff(u.__data).add(function(t){var e=new dy({shape:{points:h.getItemLayout(t)}});h.setItemGraphicEl(t,e),u.group.add(e)}).update(function(t,n){var i=u.__data.getItemGraphicEl(n);gr(i,{shape:{points:h.getItemLayout(t)}},e,t),u.group.add(i),h.setItemGraphicEl(t,i)}).remove(function(t){var e=u.__data.getItemGraphicEl(t);u.group.remove(e)}).execute(),h.eachItemGraphicEl(function(t,n){var i=h.getItemModel(n),r=i.getModel("label"),o=i.getModel("emphasis.label"),s=h.getItemVisual(n,"color");t.useStyle(a(i.getModel("itemStyle").getItemStyle(),{fill:Vt(s,.4),stroke:s})),t.hoverStyle=i.getModel("emphasis.itemStyle").getItemStyle(),or(t.style,t.hoverStyle,r,o,{labelFetcher:e,labelDataIndex:n,defaultText:h.getName(n)||"",isRectText:!0,autoColor:s}),ir(t,{}),t.dataModel=e}),u.__data=h,u.group.silent=e.get("silent")||t.get("silent")}}),ys(function(t){t.markArea=t.markArea||{}}),ex.registerSubTypeDefaulter("dataZoom",function(){return"slider"});var $S=["cartesian2d","polar","singleAxis"],KS=function(t,e){var n=f(t=t.slice(),qr),i=f(e=(e||[]).slice(),qr);return function(r,o){d(t,function(t,a){for(var s={name:t,capital:n[a]},l=0;l<e.length;l++)s[e[l]]=t+i[l];r.call(o,s)})}}(["x","y","z","radius","angle","single"],["axisIndex","axis","index","id"]),QS=d,JS=Pr,tM=function(t,e,n,i){this._dimName=t,this._axisIndex=e,this._valueWindow,this._percentWindow,this._dataExtent,this._minMaxSpan,this.ecModel=i,this._dataZoomModel=n};tM.prototype={constructor:tM,hostedBy:function(t){return this._dataZoomModel===t},getDataValueWindow:function(){return this._valueWindow.slice()},getDataPercentWindow:function(){return this._percentWindow.slice()},getTargetSeriesModels:function(){var t=[],e=this.ecModel;return e.eachSeries(function(n){if(hd(n.get("coordinateSystem"))){var i=this._dimName,r=e.queryComponents({mainType:i+"Axis",index:n.get(i+"AxisIndex"),id:n.get(i+"AxisId")})[0];this._axisIndex===(r&&r.componentIndex)&&t.push(n)}},this),t},getAxisModel:function(){return this.ecModel.getComponent(this._dimName+"Axis",this._axisIndex)},getOtherAxisModel:function(){var t,e,n=this._dimName,i=this.ecModel,r=this.getAxisModel();"x"===n||"y"===n?(e="gridIndex",t="x"===n?"y":"x"):(e="polarIndex",t="angle"===n?"radius":"angle");var o;return i.eachComponent(t+"Axis",function(t){(t.get(e)||0)===(r.get(e)||0)&&(o=t)}),o},getMinMaxSpan:function(){return n(this._minMaxSpan)},calculateDataWindow:function(t){var e=this._dataExtent,n=this.getAxisModel().axis.scale,i=this._dataZoomModel.getRangePropMode(),r=[0,100],o=[t.start,t.end],a=[];return QS(["startValue","endValue"],function(e){a.push(null!=t[e]?n.parse(t[e]):null)}),QS([0,1],function(t){var s=a[t],l=o[t];"percent"===i[t]?(null==l&&(l=r[t]),s=n.parse(Ar(l,r,e,!0))):l=Ar(s,e,r,!0),a[t]=s,o[t]=l}),{valueWindow:JS(a),percentWindow:JS(o)}},reset:function(t){if(t===this._dataZoomModel){var e=this.getTargetSeriesModels();this._dataExtent=dd(this,this._dimName,e);var n=this.calculateDataWindow(t.option);this._valueWindow=n.valueWindow,this._percentWindow=n.percentWindow,gd(this),pd(this)}},restore:function(t){t===this._dataZoomModel&&(this._valueWindow=this._percentWindow=null,pd(this,!0))},filterData:function(t,e){function n(t){return t>=a[0]&&t<=a[1]}if(t===this._dataZoomModel){var i=this._dimName,r=this.getTargetSeriesModels(),o=t.get("filterMode"),a=this._valueWindow;"none"!==o&&QS(r,function(t){var e=t.getData(),r=e.mapDimension(i,!0);r.length&&("weakFilter"===o?e.filterSelf(function(t){for(var n,i,o,s=0;s<r.length;s++){var l=e.get(r[s],t),u=!isNaN(l),h=l<a[0],c=l>a[1];if(u&&!h&&!c)return!0;u&&(o=!0),h&&(n=!0),c&&(i=!0)}return o&&n&&i}):QS(r,function(i){if("empty"===o)t.setData(e.map(i,function(t){return n(t)?t:NaN}));else{var r={};r[i]=a,e.selectRange(r)}}),QS(r,function(t){e.setApproximateExtent(a,t)}))})}}};var eM=d,nM=KS,iM=Is({type:"dataZoom",dependencies:["xAxis","yAxis","zAxis","radiusAxis","angleAxis","singleAxis","series"],defaultOption:{zlevel:0,z:4,orient:null,xAxisIndex:null,yAxisIndex:null,filterMode:"filter",throttle:null,start:0,end:100,startValue:null,endValue:null,minSpan:null,maxSpan:null,minValueSpan:null,maxValueSpan:null,rangeMode:null},init:function(t,e,n){this._dataIntervalByAxis={},this._dataInfo={},this._axisProxies={},this.textStyleModel,this._autoThrottle=!0,this._rangePropMode=["percent","percent"];var i=md(t);this.mergeDefaultAndTheme(t,n),this.doInit(i)},mergeOption:function(t){var e=md(t);i(this.option,t,!0),this.doInit(e)},doInit:function(t){var e=this.option;Xp.canvasSupported||(e.realtime=!1),this._setDefaultThrottle(t),vd(this,t),eM([["start","startValue"],["end","endValue"]],function(t,n){"value"===this._rangePropMode[n]&&(e[t[0]]=null)},this),this.textStyleModel=this.getModel("textStyle"),this._resetTarget(),this._giveAxisProxies()},_giveAxisProxies:function(){var t=this._axisProxies;this.eachTargetAxis(function(e,n,i,r){var o=this.dependentModels[e.axis][n],a=o.__dzAxisProxy||(o.__dzAxisProxy=new tM(e.name,n,this,r));t[e.name+"_"+n]=a},this)},_resetTarget:function(){var t=this.option,e=this._judgeAutoMode();nM(function(e){var n=e.axisIndex;t[n]=Mn(t[n])},this),"axisIndex"===e?this._autoSetAxisIndex():"orient"===e&&this._autoSetOrient()},_judgeAutoMode:function(){var t=this.option,e=!1;nM(function(n){null!=t[n.axisIndex]&&(e=!0)},this);var n=t.orient;return null==n&&e?"orient":e?void 0:(null==n&&(t.orient="horizontal"),"axisIndex")},_autoSetAxisIndex:function(){var t=!0,e=this.get("orient",!0),n=this.option,i=this.dependentModels;if(t){var r="vertical"===e?"y":"x";i[r+"Axis"].length?(n[r+"AxisIndex"]=[0],t=!1):eM(i.singleAxis,function(i){t&&i.get("orient",!0)===e&&(n.singleAxisIndex=[i.componentIndex],t=!1)})}t&&nM(function(e){if(t){var i=[],r=this.dependentModels[e.axis];if(r.length&&!i.length)for(var o=0,a=r.length;o<a;o++)"category"===r[o].get("type")&&i.push(o);n[e.axisIndex]=i,i.length&&(t=!1)}},this),t&&this.ecModel.eachSeries(function(t){this._isSeriesHasAllAxesTypeOf(t,"value")&&nM(function(e){var i=n[e.axisIndex],r=t.get(e.axisIndex),o=t.get(e.axisId);l(i,r=t.ecModel.queryComponents({mainType:e.axis,index:r,id:o})[0].componentIndex)<0&&i.push(r)})},this)},_autoSetOrient:function(){var t;this.eachTargetAxis(function(e){!t&&(t=e.name)},this),this.option.orient="y"===t?"vertical":"horizontal"},_isSeriesHasAllAxesTypeOf:function(t,e){var n=!0;return nM(function(i){var r=t.get(i.axisIndex),o=this.dependentModels[i.axis][r];o&&o.get("type")===e||(n=!1)},this),n},_setDefaultThrottle:function(t){if(t.hasOwnProperty("throttle")&&(this._autoThrottle=!1),this._autoThrottle){var e=this.ecModel.option;this.option.throttle=e.animation&&e.animationDurationUpdate>0?100:20}},getFirstTargetAxisModel:function(){var t;return nM(function(e){if(null==t){var n=this.get(e.axisIndex);n.length&&(t=this.dependentModels[e.axis][n[0]])}},this),t},eachTargetAxis:function(t,e){var n=this.ecModel;nM(function(i){eM(this.get(i.axisIndex),function(r){t.call(e,i,r,this,n)},this)},this)},getAxisProxy:function(t,e){return this._axisProxies[t+"_"+e]},getAxisModel:function(t,e){var n=this.getAxisProxy(t,e);return n&&n.getAxisModel()},setRawRange:function(t,e){var n=this.option;eM([["start","startValue"],["end","endValue"]],function(e){null==t[e[0]]&&null==t[e[1]]||(n[e[0]]=t[e[0]],n[e[1]]=t[e[1]])},this),!e&&vd(this,t)},getPercentRange:function(){var t=this.findRepresentativeAxisProxy();if(t)return t.getDataPercentWindow()},getValueRange:function(t,e){if(null!=t||null!=e)return this.getAxisProxy(t,e).getDataValueWindow();var n=this.findRepresentativeAxisProxy();return n?n.getDataValueWindow():void 0},findRepresentativeAxisProxy:function(t){if(t)return t.__dzAxisProxy;var e=this._axisProxies;for(var n in e)if(e.hasOwnProperty(n)&&e[n].hostedBy(this))return e[n];for(var n in e)if(e.hasOwnProperty(n)&&!e[n].hostedBy(this))return e[n]},getRangePropMode:function(){return this._rangePropMode.slice()}}),rM=Gx.extend({type:"dataZoom",render:function(t,e,n,i){this.dataZoomModel=t,this.ecModel=e,this.api=n},getTargetCoordInfo:function(){function t(t,e,n,i){for(var r,o=0;o<n.length;o++)if(n[o].model===t){r=n[o];break}r||n.push(r={model:t,axisModels:[],coordIndex:i}),r.axisModels.push(e)}var e=this.dataZoomModel,n=this.ecModel,i={};return e.eachTargetAxis(function(e,r){var o=n.getComponent(e.axis,r);if(o){var a=o.getCoordSysModel();a&&t(a,o,i[a.mainType]||(i[a.mainType]=[]),a.componentIndex)}},this),i}}),oM=(iM.extend({type:"dataZoom.slider",layoutMode:"box",defaultOption:{show:!0,right:"ph",top:"ph",width:"ph",height:"ph",left:null,bottom:null,backgroundColor:"rgba(47,69,84,0)",dataBackground:{lineStyle:{color:"#2f4554",width:.5,opacity:.3},areaStyle:{color:"rgba(47,69,84,0.3)",opacity:.3}},borderColor:"#ddd",fillerColor:"rgba(167,183,204,0.4)",handleIcon:"M8.2,13.6V3.9H6.3v9.7H3.1v14.9h3.3v9.7h1.8v-9.7h3.3V13.6H8.2z M9.7,24.4H4.8v-1.4h4.9V24.4z M9.7,19.1H4.8v-1.4h4.9V19.1z",handleSize:"100%",handleStyle:{color:"#a7b7cc"},labelPrecision:null,labelFormatter:null,showDetail:!0,showDataShadow:"auto",realtime:!0,zoomLock:!1,textStyle:{color:"#333"}}}),function(t,e,n,i,r,o){e[0]=xd(e[0],n),e[1]=xd(e[1],n),t=t||0;var a=n[1]-n[0];null!=r&&(r=xd(r,[0,a])),null!=o&&(o=Math.max(o,null!=r?r:0)),"all"===i&&(r=o=Math.abs(e[1]-e[0]),i=0);var s=yd(e,i);e[i]+=t;var l=r||0,u=n.slice();s.sign<0?u[0]+=l:u[1]-=l,e[i]=xd(e[i],u);h=yd(e,i);null!=r&&(h.sign!==s.sign||h.span<r)&&(e[1-i]=e[i]+s.sign*r);var h=yd(e,i);return null!=o&&h.span>o&&(e[1-i]=e[i]+h.sign*o),e}),aM=py,sM=Ar,lM=Pr,uM=m,hM=d,cM="horizontal",dM=5,fM=["line","bar","candlestick","scatter"],pM=rM.extend({type:"dataZoom.slider",init:function(t,e){this._displayables={},this._orient,this._range,this._handleEnds,this._size,this._handleWidth,this._handleHeight,this._location,this._dragging,this._dataShadowInfo,this.api=e},render:function(t,e,n,i){pM.superApply(this,"render",arguments),xa(this,"_dispatchZoomAction",this.dataZoomModel.get("throttle"),"fixRate"),this._orient=t.get("orient"),!1!==this.dataZoomModel.get("show")?(i&&"dataZoom"===i.type&&i.from===this.uid||this._buildView(),this._updateView()):this.group.removeAll()},remove:function(){pM.superApply(this,"remove",arguments),_a(this,"_dispatchZoomAction")},dispose:function(){pM.superApply(this,"dispose",arguments),_a(this,"_dispatchZoomAction")},_buildView:function(){var t=this.group;t.removeAll(),this._resetLocation(),this._resetInterval();var e=this._displayables.barGroup=new Jg;this._renderBackground(),this._renderHandle(),this._renderDataShadow(),t.add(e),this._positionGroup()},_resetLocation:function(){var t=this.dataZoomModel,e=this.api,n=this._findCoordRect(),i={width:e.getWidth(),height:e.getHeight()},r=this._orient===cM?{right:i.width-n.x-n.width,top:i.height-30-7,width:n.width,height:30}:{right:7,top:n.y,width:30,height:n.height},o=to(t.option);d(["right","top","width","height"],function(t){"ph"===o[t]&&(o[t]=r[t])});var a=Kr(o,i,t.padding);this._location={x:a.x,y:a.y},this._size=[a.width,a.height],"vertical"===this._orient&&this._size.reverse()},_positionGroup:function(){var t=this.group,e=this._location,n=this._orient,i=this.dataZoomModel.getFirstTargetAxisModel(),r=i&&i.get("inverse"),o=this._displayables.barGroup,a=(this._dataShadowInfo||{}).otherAxisInverse;o.attr(n!==cM||r?n===cM&&r?{scale:a?[-1,1]:[-1,-1]}:"vertical"!==n||r?{scale:a?[-1,-1]:[-1,1],rotation:Math.PI/2}:{scale:a?[1,-1]:[1,1],rotation:Math.PI/2}:{scale:a?[1,1]:[1,-1]});var s=t.getBoundingRect([o]);t.attr("position",[e.x-s.x,e.y-s.y])},_getViewExtent:function(){return[0,this._size[0]]},_renderBackground:function(){var t=this.dataZoomModel,e=this._size,n=this._displayables.barGroup;n.add(new aM({silent:!0,shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:t.get("backgroundColor")},z2:-40})),n.add(new aM({shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:"transparent"},z2:0,onclick:m(this._onClickPanelClick,this)}))},_renderDataShadow:function(){var t=this._dataShadowInfo=this._prepareDataShadowInfo();if(t){var e=this._size,n=t.series,i=n.getRawData(),r=n.getShadowDim?n.getShadowDim():t.otherDim;if(null!=r){var o=i.getDataExtent(r),s=.3*(o[1]-o[0]);o=[o[0]-s,o[1]+s];var l,u=[0,e[1]],h=[0,e[0]],c=[[e[0],0],[0,0]],d=[],f=h[1]/(i.count()-1),p=0,g=Math.round(i.count()/e[0]);i.each([r],function(t,e){if(g>0&&e%g)p+=f;else{var n=null==t||isNaN(t)||""===t,i=n?0:sM(t,o,u,!0);n&&!l&&e?(c.push([c[c.length-1][0],0]),d.push([d[d.length-1][0],0])):!n&&l&&(c.push([p,0]),d.push([p,0])),c.push([p,i]),d.push([p,i]),p+=f,l=n}});var m=this.dataZoomModel;this._displayables.barGroup.add(new dy({shape:{points:c},style:a({fill:m.get("dataBackgroundColor")},m.getModel("dataBackground.areaStyle").getAreaStyle()),silent:!0,z2:-20})),this._displayables.barGroup.add(new fy({shape:{points:d},style:m.getModel("dataBackground.lineStyle").getLineStyle(),silent:!0,z2:-19}))}}},_prepareDataShadowInfo:function(){var t=this.dataZoomModel,e=t.get("showDataShadow");if(!1!==e){var n,i=this.ecModel;return t.eachTargetAxis(function(r,o){d(t.getAxisProxy(r.name,o).getTargetSeriesModels(),function(t){if(!(n||!0!==e&&l(fM,t.get("type"))<0)){var a,s=i.getComponent(r.axis,o).axis,u=_d(r.name),h=t.coordinateSystem;null!=u&&h.getOtherAxis&&(a=h.getOtherAxis(s).inverse),u=t.getData().mapDimension(u),n={thisAxis:s,series:t,thisDim:r.name,otherDim:u,otherAxisInverse:a}}},this)},this),n}},_renderHandle:function(){var t=this._displayables,e=t.handles=[],n=t.handleLabels=[],i=this._displayables.barGroup,r=this._size,o=this.dataZoomModel;i.add(t.filler=new aM({draggable:!0,cursor:wd(this._orient),drift:uM(this._onDragMove,this,"all"),onmousemove:function(t){vg(t.event)},ondragstart:uM(this._showDataInfo,this,!0),ondragend:uM(this._onDragEnd,this),onmouseover:uM(this._showDataInfo,this,!0),onmouseout:uM(this._showDataInfo,this,!1),style:{fill:o.get("fillerColor"),textPosition:"inside"}})),i.add(new aM(Wi({silent:!0,shape:{x:0,y:0,width:r[0],height:r[1]},style:{stroke:o.get("dataBackgroundColor")||o.get("borderColor"),lineWidth:1,fill:"rgba(0,0,0,0)"}}))),hM([0,1],function(t){var r=br(o.get("handleIcon"),{cursor:wd(this._orient),draggable:!0,drift:uM(this._onDragMove,this,t),onmousemove:function(t){vg(t.event)},ondragend:uM(this._onDragEnd,this),onmouseover:uM(this._showDataInfo,this,!0),onmouseout:uM(this._showDataInfo,this,!1)},{x:-1,y:0,width:2,height:2}),a=r.getBoundingRect();this._handleHeight=Dr(o.get("handleSize"),this._size[1]),this._handleWidth=a.width/a.height*this._handleHeight,r.setStyle(o.getModel("handleStyle").getItemStyle());var s=o.get("handleColor");null!=s&&(r.style.fill=s),i.add(e[t]=r);var l=o.textStyleModel;this.group.add(n[t]=new ry({silent:!0,invisible:!0,style:{x:0,y:0,text:"",textVerticalAlign:"middle",textAlign:"center",textFill:l.getTextColor(),textFont:l.getFont()},z2:10}))},this)},_resetInterval:function(){var t=this._range=this.dataZoomModel.getPercentRange(),e=this._getViewExtent();this._handleEnds=[sM(t[0],[0,100],e,!0),sM(t[1],[0,100],e,!0)]},_updateInterval:function(t,e){var n=this.dataZoomModel,i=this._handleEnds,r=this._getViewExtent(),o=n.findRepresentativeAxisProxy().getMinMaxSpan(),a=[0,100];oM(e,i,r,n.get("zoomLock")?"all":t,null!=o.minSpan?sM(o.minSpan,a,r,!0):null,null!=o.maxSpan?sM(o.maxSpan,a,r,!0):null);var s=this._range,l=this._range=lM([sM(i[0],r,a,!0),sM(i[1],r,a,!0)]);return!s||s[0]!==l[0]||s[1]!==l[1]},_updateView:function(t){var e=this._displayables,n=this._handleEnds,i=lM(n.slice()),r=this._size;hM([0,1],function(t){var i=e.handles[t],o=this._handleHeight;i.attr({scale:[o/2,o/2],position:[n[t],r[1]/2-o/2]})},this),e.filler.setShape({x:i[0],y:0,width:i[1]-i[0],height:r[1]}),this._updateDataInfo(t)},_updateDataInfo:function(t){function e(t){var e=vr(i.handles[t].parent,this.group),n=xr(0===t?"right":"left",e),s=this._handleWidth/2+dM,l=yr([c[t]+(0===t?-s:s),this._size[1]/2],e);r[t].setStyle({x:l[0],y:l[1],textVerticalAlign:o===cM?"middle":n,textAlign:o===cM?n:"center",text:a[t]})}var n=this.dataZoomModel,i=this._displayables,r=i.handleLabels,o=this._orient,a=["",""];if(n.get("showDetail")){var s=n.findRepresentativeAxisProxy();if(s){var l=s.getAxisModel().axis,u=this._range,h=t?s.calculateDataWindow({start:u[0],end:u[1]}).valueWindow:s.getDataValueWindow();a=[this._formatLabel(h[0],l),this._formatLabel(h[1],l)]}}var c=lM(this._handleEnds.slice());e.call(this,0),e.call(this,1)},_formatLabel:function(t,e){var n=this.dataZoomModel,i=n.get("labelFormatter"),r=n.get("labelPrecision");null!=r&&"auto"!==r||(r=e.getPixelPrecision());var o=null==t||isNaN(t)?"":"category"===e.type||"time"===e.type?e.scale.getLabel(Math.round(t)):t.toFixed(Math.min(r,20));return x(i)?i(t,o):_(i)?i.replace("{value}",o):o},_showDataInfo:function(t){t=this._dragging||t;var e=this._displayables.handleLabels;e[0].attr("invisible",!t),e[1].attr("invisible",!t)},_onDragMove:function(t,e,n){this._dragging=!0;var i=yr([e,n],this._displayables.barGroup.getLocalTransform(),!0),r=this._updateInterval(t,i[0]),o=this.dataZoomModel.get("realtime");this._updateView(!o),r&&o&&this._dispatchZoomAction()},_onDragEnd:function(){this._dragging=!1,this._showDataInfo(!1),!this.dataZoomModel.get("realtime")&&this._dispatchZoomAction()},_onClickPanelClick:function(t){var e=this._size,n=this._displayables.barGroup.transformCoordToLocal(t.offsetX,t.offsetY);if(!(n[0]<0||n[0]>e[0]||n[1]<0||n[1]>e[1])){var i=this._handleEnds,r=(i[0]+i[1])/2,o=this._updateInterval("all",n[0]-r);this._updateView(),o&&this._dispatchZoomAction()}},_dispatchZoomAction:function(){var t=this._range;this.api.dispatchAction({type:"dataZoom",from:this.uid,dataZoomId:this.dataZoomModel.id,start:t[0],end:t[1]})},_findCoordRect:function(){var t;if(hM(this.getTargetCoordInfo(),function(e){if(!t&&e.length){var n=e[0].model.coordinateSystem;t=n.getRect&&n.getRect()}}),!t){var e=this.api.getWidth(),n=this.api.getHeight();t={x:.2*e,y:.2*n,width:.6*e,height:.6*n}}return t}});iM.extend({type:"dataZoom.inside",defaultOption:{disabled:!1,zoomLock:!1,zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!1,preventDefaultMouseMove:!0}});var gM="\0_ec_interaction_mutex";_s({type:"takeGlobalCursor",event:"globalCursorTaken",update:"update"},function(){}),h(Td,pg);var mM="\0_ec_dataZoom_roams",vM=m,yM=rM.extend({type:"dataZoom.inside",init:function(t,e){this._range},render:function(t,e,n,i){yM.superApply(this,"render",arguments),this._range=t.getPercentRange(),d(this.getTargetCoordInfo(),function(e,i){var r=f(e,function(t){return Rd(t.model)});d(e,function(e){var o=e.model,a={};d(["pan","zoom","scrollMove"],function(t){a[t]=vM(xM[t],this,e,i)},this),Ed(n,{coordId:Rd(o),allCoordIds:r,containsPoint:function(t,e,n){return o.coordinateSystem.containPoint([e,n])},dataZoomId:t.id,dataZoomModel:t,getRange:a})},this)},this)},dispose:function(){Nd(this.api,this.dataZoomModel.id),yM.superApply(this,"dispose",arguments),this._range=null}}),xM={zoom:function(t,e,n,i){var r=this._range,o=r.slice(),a=t.axisModels[0];if(a){var s=_M[e](null,[i.originX,i.originY],a,n,t),l=(s.signal>0?s.pixelStart+s.pixelLength-s.pixel:s.pixel-s.pixelStart)/s.pixelLength*(o[1]-o[0])+o[0],u=Math.max(1/i.scale,0);o[0]=(o[0]-l)*u+l,o[1]=(o[1]-l)*u+l;var h=this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();return oM(0,o,[0,100],0,h.minSpan,h.maxSpan),this._range=o,r[0]!==o[0]||r[1]!==o[1]?o:void 0}},pan:Gd(function(t,e,n,i,r,o){var a=_M[i]([o.oldX,o.oldY],[o.newX,o.newY],e,r,n);return a.signal*(t[1]-t[0])*a.pixel/a.pixelLength}),scrollMove:Gd(function(t,e,n,i,r,o){return _M[i]([0,0],[o.scrollDelta,o.scrollDelta],e,r,n).signal*(t[1]-t[0])*o.scrollDelta})},_M={grid:function(t,e,n,i,r){var o=n.axis,a={},s=r.model.coordinateSystem.getRect();return t=t||[0,0],"x"===o.dim?(a.pixel=e[0]-t[0],a.pixelLength=s.width,a.pixelStart=s.x,a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=s.height,a.pixelStart=s.y,a.signal=o.inverse?-1:1),a},polar:function(t,e,n,i,r){var o=n.axis,a={},s=r.model.coordinateSystem,l=s.getRadiusAxis().getExtent(),u=s.getAngleAxis().getExtent();return t=t?s.pointToCoord(t):[0,0],e=s.pointToCoord(e),"radiusAxis"===n.mainType?(a.pixel=e[0]-t[0],a.pixelLength=l[1]-l[0],a.pixelStart=l[0],a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=u[1]-u[0],a.pixelStart=u[0],a.signal=o.inverse?-1:1),a},singleAxis:function(t,e,n,i,r){var o=n.axis,a=r.model.coordinateSystem.getRect(),s={};return t=t||[0,0],"horizontal"===o.orient?(s.pixel=e[0]-t[0],s.pixelLength=a.width,s.pixelStart=a.x,s.signal=o.inverse?1:-1):(s.pixel=e[1]-t[1],s.pixelLength=a.height,s.pixelStart=a.y,s.signal=o.inverse?-1:1),s}};xs({getTargetSeries:function(t){var e=N();return t.eachComponent("dataZoom",function(t){t.eachTargetAxis(function(t,n,i){d(i.getAxisProxy(t.name,n).getTargetSeriesModels(),function(t){e.set(t.uid,t)})})}),e},modifyOutputEnd:!0,overallReset:function(t,e){t.eachComponent("dataZoom",function(t){t.eachTargetAxis(function(t,n,i){i.getAxisProxy(t.name,n).reset(i,e)}),t.eachTargetAxis(function(t,n,i){i.getAxisProxy(t.name,n).filterData(i,e)})}),t.eachComponent("dataZoom",function(t){var e=t.findRepresentativeAxisProxy(),n=e.getDataPercentWindow(),i=e.getDataValueWindow();t.setRawRange({start:n[0],end:n[1],startValue:i[0],endValue:i[1]},!0)})}}),_s("dataZoom",function(t,e){var n=cd(m(e.eachComponent,e,"dataZoom"),KS,function(t,e){return t.get(e.axisIndex)}),i=[];e.eachComponent({mainType:"dataZoom",query:t},function(t,e){i.push.apply(i,n(t).nodes)}),d(i,function(e,n){e.setRawRange({start:t.start,end:t.end,startValue:t.startValue,endValue:t.endValue})})});var wM={},bM=Is({type:"toolbox",layoutMode:{type:"box",ignoreSize:!0},optionUpdated:function(){bM.superApply(this,"optionUpdated",arguments),d(this.option.feature,function(t,e){var n=Ud(e);n&&i(t,n.defaultOption)})},defaultOption:{show:!0,z:6,zlevel:0,orient:"horizontal",left:"right",top:"top",backgroundColor:"transparent",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemSize:15,itemGap:8,showTitle:!0,iconStyle:{borderColor:"#666",color:"none"},emphasis:{iconStyle:{borderColor:"#3E98C5"}}}});Ts({type:"toolbox",render:function(t,e,n,i){function r(r,a){var s,c=h[r],d=h[a],f=new Sr(l[c],t,t.ecModel);if(c&&!d){if(Xd(c))s={model:f,onclick:f.option.onclick,featureName:c};else{var p=Ud(c);if(!p)return;s=new p(f,e,n)}u[c]=s}else{if(!(s=u[d]))return;s.model=f,s.ecModel=e,s.api=n}c||!d?f.get("show")&&!s.unusable?(o(f,s,c),f.setIconStatus=function(t,e){var n=this.option,i=this.iconPaths;n.iconStatus=n.iconStatus||{},n.iconStatus[t]=e,i[t]&&i[t].trigger(e)},s.render&&s.render(f,e,n,i)):s.remove&&s.remove(e,n):s.dispose&&s.dispose(e,n)}function o(i,r,o){var l=i.getModel("iconStyle"),u=i.getModel("emphasis.iconStyle"),h=r.getIcons?r.getIcons():i.get("icon"),c=i.get("title")||{};if("string"==typeof h){var f=h,p=c;c={},(h={})[o]=f,c[o]=p}var g=i.iconPaths={};d(h,function(o,h){var d=br(o,{},{x:-s/2,y:-s/2,width:s,height:s});d.setStyle(l.getItemStyle()),d.hoverStyle=u.getItemStyle(),ir(d),t.get("showTitle")&&(d.__title=c[h],d.on("mouseover",function(){var t=u.getItemStyle();d.setStyle({text:c[h],textPosition:t.textPosition||"bottom",textFill:t.fill||t.stroke||"#000",textAlign:t.textAlign||"center"})}).on("mouseout",function(){d.setStyle({textFill:null})})),d.trigger(i.get("iconStatus."+h)||"normal"),a.add(d),d.on("click",m(r.onclick,r,e,n,h)),g[h]=d})}var a=this.group;if(a.removeAll(),t.get("show")){var s=+t.get("itemSize"),l=t.get("feature")||{},u=this._features||(this._features={}),h=[];d(l,function(t,e){h.push(e)}),new ks(this._featureNames||[],h).add(r).update(r).remove(v(r,null)).execute(),this._featureNames=h,Mc(a,t,n),a.add(Ic(a.getBoundingRect(),t)),a.eachChild(function(t){var e=t.__title,i=t.hoverStyle;if(i&&e){var r=Se(e,Be(i)),o=t.position[0]+a.position[0],l=!1;t.position[1]+a.position[1]+s+r.height>n.getHeight()&&(i.textPosition="top",l=!0);var u=l?-5-r.height:s+8;o+r.width/2>n.getWidth()?(i.textPosition=["100%",u],i.textAlign="right"):o-r.width/2<0&&(i.textPosition=[0,u],i.textAlign="left")}})}},updateView:function(t,e,n,i){d(this._features,function(t){t.updateView&&t.updateView(t.model,e,n,i)})},remove:function(t,e){d(this._features,function(n){n.remove&&n.remove(t,e)}),this.group.removeAll()},dispose:function(t,e){d(this._features,function(n){n.dispose&&n.dispose(t,e)})}});var SM=t_.toolbox.saveAsImage;Yd.defaultOption={show:!0,icon:"M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0",title:SM.title,type:"png",name:"",excludeComponents:["toolbox"],pixelRatio:1,lang:SM.lang.slice()},Yd.prototype.unusable=!Xp.canvasSupported,Yd.prototype.onclick=function(t,e){var n=this.model,i=n.get("name")||t.get("title.0.text")||"echarts",r=document.createElement("a"),o=n.get("type",!0)||"png";r.download=i+"."+o,r.target="_blank";var a=e.getConnectedDataURL({type:o,backgroundColor:n.get("backgroundColor",!0)||t.get("backgroundColor")||"#fff",excludeComponents:n.get("excludeComponents"),pixelRatio:n.get("pixelRatio")});if(r.href=a,"function"!=typeof MouseEvent||Xp.browser.ie||Xp.browser.edge)if(window.navigator.msSaveOrOpenBlob){for(var s=atob(a.split(",")[1]),l=s.length,u=new Uint8Array(l);l--;)u[l]=s.charCodeAt(l);var h=new Blob([u]);window.navigator.msSaveOrOpenBlob(h,i+"."+o)}else{var c=n.get("lang"),d='<body style="margin:0;"><img src="'+a+'" style="max-width:100%;" title="'+(c&&c[0]||"")+'" /></body>';window.open().document.write(d)}else{var f=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!1});r.dispatchEvent(f)}},Zd("saveAsImage",Yd);var MM=t_.toolbox.magicType;jd.defaultOption={show:!0,type:[],icon:{line:"M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4",bar:"M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7",stack:"M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z",tiled:"M2.3,2.2h22.8V25H2.3V2.2z M35,2.2h22.8V25H35V2.2zM2.3,35h22.8v22.8H2.3V35z M35,35h22.8v22.8H35V35z"},title:n(MM.title),option:{},seriesIndex:{}};var IM=jd.prototype;IM.getIcons=function(){var t=this.model,e=t.get("icon"),n={};return d(t.get("type"),function(t){e[t]&&(n[t]=e[t])}),n};var TM={line:function(t,e,n,r){if("bar"===t)return i({id:e,type:"line",data:n.get("data"),stack:n.get("stack"),markPoint:n.get("markPoint"),markLine:n.get("markLine")},r.get("option.line")||{},!0)},bar:function(t,e,n,r){if("line"===t)return i({id:e,type:"bar",data:n.get("data"),stack:n.get("stack"),markPoint:n.get("markPoint"),markLine:n.get("markLine")},r.get("option.bar")||{},!0)},stack:function(t,e,n,r){if("line"===t||"bar"===t)return i({id:e,stack:"__ec_magicType_stack__"},r.get("option.stack")||{},!0)},tiled:function(t,e,n,r){if("line"===t||"bar"===t)return i({id:e,stack:""},r.get("option.tiled")||{},!0)}},CM=[["line","bar"],["stack","tiled"]];IM.onclick=function(t,e,n){var i=this.model,r=i.get("seriesIndex."+n);if(TM[n]){var o={series:[]};d(CM,function(t){l(t,n)>=0&&d(t,function(t){i.setIconStatus(t,"normal")})}),i.setIconStatus(n,"emphasis"),t.eachComponent({mainType:"series",query:null==r?null:{seriesIndex:r}},function(e){var r=e.subType,s=e.id,l=TM[n](r,s,e,i);l&&(a(l,e.option),o.series.push(l));var u=e.coordinateSystem;if(u&&"cartesian2d"===u.type&&("line"===n||"bar"===n)){var h=u.getAxesByScale("ordinal")[0];if(h){var c=h.dim+"Axis",d=t.queryComponents({mainType:c,index:e.get(name+"Index"),id:e.get(name+"Id")})[0].componentIndex;o[c]=o[c]||[];for(var f=0;f<=d;f++)o[c][d]=o[c][d]||{};o[c][d].boundaryGap="bar"===n}}}),e.dispatchAction({type:"changeMagicType",currentType:n,newOption:o})}},_s({type:"changeMagicType",event:"magicTypeChanged",update:"prepareAndUpdate"},function(t,e){e.mergeOption(t.newOption)}),Zd("magicType",jd);var AM=t_.toolbox.dataView,DM=new Array(60).join("-"),kM="\t",PM=new RegExp("["+kM+"]+","g");of.defaultOption={show:!0,readOnly:!1,optionToContent:null,contentToOption:null,icon:"M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28",title:n(AM.title),lang:n(AM.lang),backgroundColor:"#fff",textColor:"#000",textareaColor:"#fff",textareaBorderColor:"#333",buttonColor:"#c23531",buttonTextColor:"#fff"},of.prototype.onclick=function(t,e){function n(){i.removeChild(o),x._dom=null}var i=e.getDom(),r=this.model;this._dom&&i.removeChild(this._dom);var o=document.createElement("div");o.style.cssText="position:absolute;left:5px;top:5px;bottom:5px;right:5px;",o.style.backgroundColor=r.get("backgroundColor")||"#fff";var a=document.createElement("h4"),s=r.get("lang")||[];a.innerHTML=s[0]||r.get("title"),a.style.cssText="margin: 10px 20px;",a.style.color=r.get("textColor");var l=document.createElement("div"),u=document.createElement("textarea");l.style.cssText="display:block;width:100%;overflow:auto;";var h=r.get("optionToContent"),c=r.get("contentToOption"),d=Qd(t);if("function"==typeof h){var f=h(e.getOption());"string"==typeof f?l.innerHTML=f:M(f)&&l.appendChild(f)}else l.appendChild(u),u.readOnly=r.get("readOnly"),u.style.cssText="width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;",u.style.color=r.get("textColor"),u.style.borderColor=r.get("textareaBorderColor"),u.style.backgroundColor=r.get("textareaColor"),u.value=d.value;var p=d.meta,g=document.createElement("div");g.style.cssText="position:absolute;bottom:0;left:0;right:0;";var m="float:right;margin-right:20px;border:none;cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px",v=document.createElement("div"),y=document.createElement("div");m+=";background-color:"+r.get("buttonColor"),m+=";color:"+r.get("buttonTextColor");var x=this;at(v,"click",n),at(y,"click",function(){var t;try{t="function"==typeof c?c(l,e.getOption()):rf(u.value,p)}catch(t){throw n(),new Error("Data view format error "+t)}t&&e.dispatchAction({type:"changeDataView",newOption:t}),n()}),v.innerHTML=s[1],y.innerHTML=s[2],y.style.cssText=m,v.style.cssText=m,!r.get("readOnly")&&g.appendChild(y),g.appendChild(v),at(u,"keydown",function(t){if(9===(t.keyCode||t.which)){var e=this.value,n=this.selectionStart,i=this.selectionEnd;this.value=e.substring(0,n)+kM+e.substring(i),this.selectionStart=this.selectionEnd=n+1,vg(t)}}),o.appendChild(a),o.appendChild(l),o.appendChild(g),l.style.height=i.clientHeight-80+"px",i.appendChild(o),this._dom=o},of.prototype.remove=function(t,e){this._dom&&e.getDom().removeChild(this._dom)},of.prototype.dispose=function(t,e){this.remove(t,e)},Zd("dataView",of),_s({type:"changeDataView",event:"dataViewChanged",update:"prepareAndUpdate"},function(t,e){var n=[];d(t.newOption.series,function(t){var i=e.getSeriesByName(t.name)[0];if(i){var r=i.get("data");n.push({name:t.name,data:af(t.data,r)})}else n.push(o({type:"scatter"},t))}),e.mergeOption(a({series:n},t.newOption))});var LM=v,OM=d,zM=f,EM=Math.min,NM=Math.max,RM=Math.pow,BM=1e4,FM=6,VM=6,WM="globalPan",HM={w:[0,0],e:[0,1],n:[1,0],s:[1,1]},GM={w:"ew",e:"ew",n:"ns",s:"ns",ne:"nesw",sw:"nesw",nw:"nwse",se:"nwse"},ZM={brushStyle:{lineWidth:2,stroke:"rgba(0,0,0,0.3)",fill:"rgba(0,0,0,0.1)"},transformable:!0,brushMode:"single",removeOnClick:!1},UM=0;sf.prototype={constructor:sf,enableBrush:function(t){return this._brushType&&uf(this),t.brushType&&lf(this,t),this},setPanels:function(t){if(t&&t.length){var e=this._panels={};d(t,function(t){e[t.panelId]=n(t)})}else this._panels=null;return this},mount:function(t){t=t||{},this._enableGlobalPan=t.enableGlobalPan;var e=this.group;return this._zr.add(e),e.attr({position:t.position||[0,0],rotation:t.rotation||0,scale:t.scale||[1,1]}),this._transform=e.getLocalTransform(),this},eachCover:function(t,e){OM(this._covers,t,e)},updateCovers:function(t){function e(t,e){return(null!=t.id?t.id:o+e)+"-"+t.brushType}function r(e,n){var i=t[e];if(null!=n&&a[n]===u)s[e]=a[n];else{var r=s[e]=null!=n?(a[n].__brushOption=i,a[n]):cf(l,hf(l,i));pf(l,r)}}t=f(t,function(t){return i(n(ZM),t,!0)});var o="\0-brush-index-",a=this._covers,s=this._covers=[],l=this,u=this._creatingCover;return new ks(a,t,function(t,n){return e(t.__brushOption,n)},e).add(r).update(r).remove(function(t){a[t]!==u&&l.group.remove(a[t])}).execute(),this},unmount:function(){return this.enableBrush(!1),yf(this),this._zr.remove(this.group),this},dispose:function(){this.unmount(),this.off()}},h(sf,pg);var XM={mousedown:function(t){if(this._dragging)Vf.call(this,t);else if(!t.target||!t.target.draggable){Nf(t);var e=this.group.transformCoordToLocal(t.offsetX,t.offsetY);this._creatingCover=null,(this._creatingPanel=mf(this,t,e))&&(this._dragging=!0,this._track=[e.slice()])}},mousemove:function(t){var e=this.group.transformCoordToLocal(t.offsetX,t.offsetY);if(Ef(this,t,e),this._dragging){Nf(t);var n=Bf(this,t,e,!1);n&&xf(this,n)}},mouseup:Vf},YM={lineX:Wf(0),lineY:Wf(1),rect:{createCover:function(t,e){return bf(LM(kf,function(t){return t},function(t){return t}),t,e,["w","e","n","s","se","sw","ne","nw"])},getCreatingRange:function(t){var e=wf(t);return Cf(e[1][0],e[1][1],e[0][0],e[0][1])},updateCoverShape:function(t,e,n,i){Sf(t,e,n,i)},updateCommon:Mf,contain:Rf},polygon:{createCover:function(t,e){var n=new Jg;return n.add(new fy({name:"main",style:Tf(e),silent:!0})),n},getCreatingRange:function(t){return t},endCreating:function(t,e){e.remove(e.childAt(0)),e.add(new dy({name:"main",draggable:!0,drift:LM(Pf,t,e),ondragend:LM(xf,t,{isEnd:!0})}))},updateCoverShape:function(t,e,n,i){e.childAt(0).setShape({points:Of(t,e,n)})},updateCommon:Mf,contain:Rf}},jM={axisPointer:1,tooltip:1,brush:1},qM=d,$M=l,KM=v,QM=["dataToPoint","pointToData"],JM=["grid","xAxis","yAxis","geo","graph","polar","radiusAxis","angleAxis","bmap"],tI=Yf.prototype;tI.setOutputRanges=function(t,e){this.matchOutputRanges(t,e,function(t,e,n){if((t.coordRanges||(t.coordRanges=[])).push(e),!t.coordRange){t.coordRange=e;var i=rI[t.brushType](0,n,e);t.__rangeOffset={offset:oI[t.brushType](i.values,t.range,[1,1]),xyMinMax:i.xyMinMax}}})},tI.matchOutputRanges=function(t,e,n){qM(t,function(t){var i=this.findTargetInfo(t,e);i&&!0!==i&&d(i.coordSyses,function(i){var r=rI[t.brushType](1,i,t.range);n(t,r.values,i,e)})},this)},tI.setInputRanges=function(t,e){qM(t,function(t){var n=this.findTargetInfo(t,e);if(t.range=t.range||[],n&&!0!==n){t.panelId=n.panelId;var i=rI[t.brushType](0,n.coordSys,t.coordRange),r=t.__rangeOffset;t.range=r?oI[t.brushType](i.values,r.offset,Qf(i.xyMinMax,r.xyMinMax)):i.values}},this)},tI.makePanelOpts=function(t,e){return f(this._targetInfoList,function(n){var i=n.getPanelRect();return{panelId:n.panelId,defaultBrushType:e&&e(n),clipPath:Gf(i),isTargetByCursor:Uf(i,t,n.coordSysModel),getLinearBrushOtherExtent:Zf(i)}})},tI.controlSeries=function(t,e,n){var i=this.findTargetInfo(t,n);return!0===i||i&&$M(i.coordSyses,e.coordinateSystem)>=0},tI.findTargetInfo=function(t,e){for(var n=this._targetInfoList,i=qf(e,t),r=0;r<n.length;r++){var o=n[r],a=t.panelId;if(a){if(o.panelId===a)return o}else for(r=0;r<nI.length;r++)if(nI[r](i,o))return o}return!0};var eI={grid:function(t,e){var n=t.xAxisModels,i=t.yAxisModels,r=t.gridModels,o=N(),a={},s={};(n||i||r)&&(qM(n,function(t){var e=t.axis.grid.model;o.set(e.id,e),a[e.id]=!0}),qM(i,function(t){var e=t.axis.grid.model;o.set(e.id,e),s[e.id]=!0}),qM(r,function(t){o.set(t.id,t),a[t.id]=!0,s[t.id]=!0}),o.each(function(t){var r=t.coordinateSystem,o=[];qM(r.getCartesians(),function(t,e){($M(n,t.getAxis("x").model)>=0||$M(i,t.getAxis("y").model)>=0)&&o.push(t)}),e.push({panelId:"grid--"+t.id,gridModel:t,coordSysModel:t,coordSys:o[0],coordSyses:o,getPanelRect:iI.grid,xAxisDeclared:a[t.id],yAxisDeclared:s[t.id]})}))},geo:function(t,e){qM(t.geoModels,function(t){var n=t.coordinateSystem;e.push({panelId:"geo--"+t.id,geoModel:t,coordSysModel:t,coordSys:n,coordSyses:[n],getPanelRect:iI.geo})})}},nI=[function(t,e){var n=t.xAxisModel,i=t.yAxisModel,r=t.gridModel;return!r&&n&&(r=n.axis.grid.model),!r&&i&&(r=i.axis.grid.model),r&&r===e.gridModel},function(t,e){var n=t.geoModel;return n&&n===e.geoModel}],iI={grid:function(){return this.coordSys.grid.getRect().clone()},geo:function(){var t=this.coordSys,e=t.getBoundingRect().clone();return e.applyTransform(vr(t)),e}},rI={lineX:KM($f,0),lineY:KM($f,1),rect:function(t,e,n){var i=e[QM[t]]([n[0][0],n[1][0]]),r=e[QM[t]]([n[0][1],n[1][1]]),o=[jf([i[0],r[0]]),jf([i[1],r[1]])];return{values:o,xyMinMax:o}},polygon:function(t,e,n){var i=[[1/0,-1/0],[1/0,-1/0]];return{values:f(n,function(n){var r=e[QM[t]](n);return i[0][0]=Math.min(i[0][0],r[0]),i[1][0]=Math.min(i[1][0],r[1]),i[0][1]=Math.max(i[0][1],r[0]),i[1][1]=Math.max(i[1][1],r[1]),r}),xyMinMax:i}}},oI={lineX:KM(Kf,0),lineY:KM(Kf,1),rect:function(t,e,n){return[[t[0][0]-n[0]*e[0][0],t[0][1]-n[0]*e[0][1]],[t[1][0]-n[1]*e[1][0],t[1][1]-n[1]*e[1][1]]]},polygon:function(t,e,n){return f(t,function(t,i){return[t[0]-n[0]*e[i][0],t[1]-n[1]*e[i][1]]})}},aI=d,sI="\0_ec_hist_store";iM.extend({type:"dataZoom.select"}),rM.extend({type:"dataZoom.select"});var lI=t_.toolbox.dataZoom,uI=d,hI="\0_ec_\0toolbox-dataZoom_";op.defaultOption={show:!0,icon:{zoom:"M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1",back:"M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26"},title:n(lI.title)};var cI=op.prototype;cI.render=function(t,e,n,i){this.model=t,this.ecModel=e,this.api=n,lp(t,e,this,i,n),sp(t,e)},cI.onclick=function(t,e,n){dI[n].call(this)},cI.remove=function(t,e){this._brushController.unmount()},cI.dispose=function(t,e){this._brushController.dispose()};var dI={zoom:function(){var t=!this._isZoomActive;this.api.dispatchAction({type:"takeGlobalCursor",key:"dataZoomSelect",dataZoomSelectActive:t})},back:function(){this._dispatchZoomAction(ep(this.ecModel))}};cI._onBrush=function(t,e){function n(t,e,n){var a=e.getAxis(t),s=a.model,l=i(t,s,o),u=l.findRepresentativeAxisProxy(s).getMinMaxSpan();null==u.minValueSpan&&null==u.maxValueSpan||(n=oM(0,n.slice(),a.scale.getExtent(),0,u.minValueSpan,u.maxValueSpan)),l&&(r[l.id]={dataZoomId:l.id,startValue:n[0],endValue:n[1]})}function i(t,e,n){var i;return n.eachComponent({mainType:"dataZoom",subType:"select"},function(n){n.getAxisModel(t,e.componentIndex)&&(i=n)}),i}if(e.isEnd&&t.length){var r={},o=this.ecModel;this._brushController.updateCovers([]),new Yf(ap(this.model.option),o,{include:["grid"]}).matchOutputRanges(t,o,function(t,e,i){if("cartesian2d"===i.type){var r=t.brushType;"rect"===r?(n("x",i,e[0]),n("y",i,e[1])):n({lineX:"x",lineY:"y"}[r],i,e)}}),tp(o,r),this._dispatchZoomAction(r)}},cI._dispatchZoomAction=function(t){var e=[];uI(t,function(t,i){e.push(n(t))}),e.length&&this.api.dispatchAction({type:"dataZoom",from:this.uid,batch:e})},Zd("dataZoom",op),ys(function(t){function e(t,e){if(e){var r=t+"Index",o=e[r];null==o||"all"===o||y(o)||(o=!1===o||"none"===o?[]:[o]),n(t,function(e,n){if(null==o||"all"===o||-1!==l(o,n)){var a={type:"select",$fromToolbox:!0,id:hI+t+n};a[r]=n,i.push(a)}})}}function n(e,n){var i=t[e];y(i)||(i=i?[i]:[]),uI(i,n)}if(t){var i=t.dataZoom||(t.dataZoom=[]);y(i)||(t.dataZoom=i=[i]);var r=t.toolbox;if(r&&(y(r)&&(r=r[0]),r&&r.feature)){var o=r.feature.dataZoom;e("xAxis",o),e("yAxis",o)}}});var fI=t_.toolbox.restore;up.defaultOption={show:!0,icon:"M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5",title:fI.title},up.prototype.onclick=function(t,e,n){np(t),e.dispatchAction({type:"restore",from:this.uid})},Zd("restore",up),_s({type:"restore",event:"restore",update:"prepareAndUpdate"},function(t,e){e.resetOption("recreate")});var pI,gI="urn:schemas-microsoft-com:vml",mI="undefined"==typeof window?null:window,vI=!1,yI=mI&&mI.document;if(yI&&!Xp.canvasSupported)try{!yI.namespaces.zrvml&&yI.namespaces.add("zrvml",gI),pI=function(t){return yI.createElement("<zrvml:"+t+' class="zrvml">')}}catch(t){pI=function(t){return yI.createElement("<"+t+' xmlns="'+gI+'" class="zrvml">')}}var xI=Ov.CMD,_I=Math.round,wI=Math.sqrt,bI=Math.abs,SI=Math.cos,MI=Math.sin,II=Math.max;if(!Xp.canvasSupported){var TI=21600,CI=TI/2,AI=function(t){t.style.cssText="position:absolute;left:0;top:0;width:1px;height:1px;",t.coordsize=TI+","+TI,t.coordorigin="0,0"},DI=function(t){return String(t).replace(/&/g,"&amp;").replace(/"/g,"&quot;")},kI=function(t,e,n){return"rgb("+[t,e,n].join(",")+")"},PI=function(t,e){e&&t&&e.parentNode!==t&&t.appendChild(e)},LI=function(t,e){e&&t&&e.parentNode===t&&t.removeChild(e)},OI=function(t,e,n){return 1e5*(parseFloat(t)||0)+1e3*(parseFloat(e)||0)+n},zI=function(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t},EI=function(t,e,n){var i=Ot(e);n=+n,isNaN(n)&&(n=1),i&&(t.color=kI(i[0],i[1],i[2]),t.opacity=n*i[3])},NI=function(t){var e=Ot(t);return[kI(e[0],e[1],e[2]),e[3]]},RI=function(t,e,n){var i=e.fill;if(null!=i)if(i instanceof _y){var r,o=0,a=[0,0],s=0,l=1,u=n.getBoundingRect(),h=u.width,c=u.height;if("linear"===i.type){r="gradient";var d=n.transform,f=[i.x*h,i.y*c],p=[i.x2*h,i.y2*c];d&&($(f,f,d),$(p,p,d));var g=p[0]-f[0],m=p[1]-f[1];(o=180*Math.atan2(g,m)/Math.PI)<0&&(o+=360),o<1e-6&&(o=0)}else{r="gradientradial";var f=[i.x*h,i.y*c],d=n.transform,v=n.scale,y=h,x=c;a=[(f[0]-u.x)/y,(f[1]-u.y)/x],d&&$(f,f,d),y/=v[0]*TI,x/=v[1]*TI;var _=II(y,x);s=0/_,l=2*i.r/_-s}var w=i.colorStops.slice();w.sort(function(t,e){return t.offset-e.offset});for(var b=w.length,S=[],M=[],I=0;I<b;I++){var T=w[I],C=NI(T.color);M.push(T.offset*l+s+" "+C[0]),0!==I&&I!==b-1||S.push(C)}if(b>=2){var A=S[0][0],D=S[1][0],k=S[0][1]*e.opacity,P=S[1][1]*e.opacity;t.type=r,t.method="none",t.focus="100%",t.angle=o,t.color=A,t.color2=D,t.colors=M.join(","),t.opacity=P,t.opacity2=k}"radial"===r&&(t.focusposition=a.join(","))}else EI(t,i,e.opacity)},BI=function(t,e){null!=e.lineDash&&(t.dashstyle=e.lineDash.join(" ")),null==e.stroke||e.stroke instanceof _y||EI(t,e.stroke,e.opacity)},FI=function(t,e,n,i){var r="fill"==e,o=t.getElementsByTagName(e)[0];null!=n[e]&&"none"!==n[e]&&(r||!r&&n.lineWidth)?(t[r?"filled":"stroked"]="true",n[e]instanceof _y&&LI(t,o),o||(o=hp(e)),r?RI(o,n,i):BI(o,n),PI(t,o)):(t[r?"filled":"stroked"]="false",LI(t,o))},VI=[[],[],[]],WI=function(t,e){var n,i,r,o,a,s,l=xI.M,u=xI.C,h=xI.L,c=xI.A,d=xI.Q,f=[],p=t.data,g=t.len();for(o=0;o<g;){switch(r=p[o++],i="",n=0,r){case l:i=" m ",n=1,a=p[o++],s=p[o++],VI[0][0]=a,VI[0][1]=s;break;case h:i=" l ",n=1,a=p[o++],s=p[o++],VI[0][0]=a,VI[0][1]=s;break;case d:case u:i=" c ",n=3;var m,v,y=p[o++],x=p[o++],_=p[o++],w=p[o++];r===d?(m=_,v=w,_=(_+2*y)/3,w=(w+2*x)/3,y=(a+2*y)/3,x=(s+2*x)/3):(m=p[o++],v=p[o++]),VI[0][0]=y,VI[0][1]=x,VI[1][0]=_,VI[1][1]=w,VI[2][0]=m,VI[2][1]=v,a=m,s=v;break;case c:var b=0,S=0,M=1,I=1,T=0;e&&(b=e[4],S=e[5],M=wI(e[0]*e[0]+e[1]*e[1]),I=wI(e[2]*e[2]+e[3]*e[3]),T=Math.atan2(-e[1]/I,e[0]/M));var C=p[o++],A=p[o++],D=p[o++],k=p[o++],P=p[o++]+T,L=p[o++]+P+T;o++;var O=p[o++],z=C+SI(P)*D,E=A+MI(P)*k,y=C+SI(L)*D,x=A+MI(L)*k,N=O?" wa ":" at ";Math.abs(z-y)<1e-4&&(Math.abs(L-P)>.01?O&&(z+=.0125):Math.abs(E-A)<1e-4?O&&z<C||!O&&z>C?x-=.0125:x+=.0125:O&&E<A||!O&&E>A?y+=.0125:y-=.0125),f.push(N,_I(((C-D)*M+b)*TI-CI),",",_I(((A-k)*I+S)*TI-CI),",",_I(((C+D)*M+b)*TI-CI),",",_I(((A+k)*I+S)*TI-CI),",",_I((z*M+b)*TI-CI),",",_I((E*I+S)*TI-CI),",",_I((y*M+b)*TI-CI),",",_I((x*I+S)*TI-CI)),a=y,s=x;break;case xI.R:var R=VI[0],B=VI[1];R[0]=p[o++],R[1]=p[o++],B[0]=R[0]+p[o++],B[1]=R[1]+p[o++],e&&($(R,R,e),$(B,B,e)),R[0]=_I(R[0]*TI-CI),B[0]=_I(B[0]*TI-CI),R[1]=_I(R[1]*TI-CI),B[1]=_I(B[1]*TI-CI),f.push(" m ",R[0],",",R[1]," l ",B[0],",",R[1]," l ",B[0],",",B[1]," l ",R[0],",",B[1]);break;case xI.Z:f.push(" x ")}if(n>0){f.push(i);for(var F=0;F<n;F++){var V=VI[F];e&&$(V,V,e),f.push(_I(V[0]*TI-CI),",",_I(V[1]*TI-CI),F<n-1?",":"")}}}return f.join("")};Ii.prototype.brushVML=function(t){var e=this.style,n=this._vmlEl;n||(n=hp("shape"),AI(n),this._vmlEl=n),FI(n,"fill",e,this),FI(n,"stroke",e,this);var i=this.transform,r=null!=i,o=n.getElementsByTagName("stroke")[0];if(o){var a=e.lineWidth;if(r&&!e.strokeNoScale){var s=i[0]*i[3]-i[1]*i[2];a*=wI(bI(s))}o.weight=a+"px"}var l=this.path||(this.path=new Ov);this.__dirtyPath&&(l.beginPath(),this.buildPath(l,this.shape),l.toStatic(),this.__dirtyPath=!1),n.path=WI(l,this.transform),n.style.zIndex=OI(this.zlevel,this.z,this.z2),PI(t,n),null!=e.text?this.drawRectText(t,this.getBoundingRect()):this.removeRectText(t)},Ii.prototype.onRemove=function(t){LI(t,this._vmlEl),this.removeRectText(t)},Ii.prototype.onAdd=function(t){PI(t,this._vmlEl),this.appendRectText(t)};var HI=function(t){return"object"==typeof t&&t.tagName&&"IMG"===t.tagName.toUpperCase()};an.prototype.brushVML=function(t){var e,n,i=this.style,r=i.image;if(HI(r)){var o=r.src;if(o===this._imageSrc)e=this._imageWidth,n=this._imageHeight;else{var a=r.runtimeStyle,s=a.width,l=a.height;a.width="auto",a.height="auto",e=r.width,n=r.height,a.width=s,a.height=l,this._imageSrc=o,this._imageWidth=e,this._imageHeight=n}r=o}else r===this._imageSrc&&(e=this._imageWidth,n=this._imageHeight);if(r){var u=i.x||0,h=i.y||0,c=i.width,d=i.height,f=i.sWidth,p=i.sHeight,g=i.sx||0,m=i.sy||0,v=f&&p,y=this._vmlEl;y||(y=yI.createElement("div"),AI(y),this._vmlEl=y);var x,_=y.style,w=!1,b=1,S=1;if(this.transform&&(x=this.transform,b=wI(x[0]*x[0]+x[1]*x[1]),S=wI(x[2]*x[2]+x[3]*x[3]),w=x[1]||x[2]),w){var M=[u,h],I=[u+c,h],T=[u,h+d],C=[u+c,h+d];$(M,M,x),$(I,I,x),$(T,T,x),$(C,C,x);var A=II(M[0],I[0],T[0],C[0]),D=II(M[1],I[1],T[1],C[1]),k=[];k.push("M11=",x[0]/b,",","M12=",x[2]/S,",","M21=",x[1]/b,",","M22=",x[3]/S,",","Dx=",_I(u*b+x[4]),",","Dy=",_I(h*S+x[5])),_.padding="0 "+_I(A)+"px "+_I(D)+"px 0",_.filter="progid:DXImageTransform.Microsoft.Matrix("+k.join("")+", SizingMethod=clip)"}else x&&(u=u*b+x[4],h=h*S+x[5]),_.filter="",_.left=_I(u)+"px",_.top=_I(h)+"px";var P=this._imageEl,L=this._cropEl;P||(P=yI.createElement("div"),this._imageEl=P);var O=P.style;if(v){if(e&&n)O.width=_I(b*e*c/f)+"px",O.height=_I(S*n*d/p)+"px";else{var z=new Image,E=this;z.onload=function(){z.onload=null,e=z.width,n=z.height,O.width=_I(b*e*c/f)+"px",O.height=_I(S*n*d/p)+"px",E._imageWidth=e,E._imageHeight=n,E._imageSrc=r},z.src=r}L||((L=yI.createElement("div")).style.overflow="hidden",this._cropEl=L);var N=L.style;N.width=_I((c+g*c/f)*b),N.height=_I((d+m*d/p)*S),N.filter="progid:DXImageTransform.Microsoft.Matrix(Dx="+-g*c/f*b+",Dy="+-m*d/p*S+")",L.parentNode||y.appendChild(L),P.parentNode!=L&&L.appendChild(P)}else O.width=_I(b*c)+"px",O.height=_I(S*d)+"px",y.appendChild(P),L&&L.parentNode&&(y.removeChild(L),this._cropEl=null);var R="",B=i.opacity;B<1&&(R+=".Alpha(opacity="+_I(100*B)+") "),R+="progid:DXImageTransform.Microsoft.AlphaImageLoader(src="+r+", SizingMethod=scale)",O.filter=R,y.style.zIndex=OI(this.zlevel,this.z,this.z2),PI(t,y),null!=i.text&&this.drawRectText(t,this.getBoundingRect())}},an.prototype.onRemove=function(t){LI(t,this._vmlEl),this._vmlEl=null,this._cropEl=null,this._imageEl=null,this.removeRectText(t)},an.prototype.onAdd=function(t){PI(t,this._vmlEl),this.appendRectText(t)};var GI,ZI={},UI=0,XI=document.createElement("div"),YI=function(t){var e=ZI[t];if(!e){UI>100&&(UI=0,ZI={});var n,i=XI.style;try{i.font=t,n=i.fontFamily.split(",")[0]}catch(t){}e={style:i.fontStyle||"normal",variant:i.fontVariant||"normal",weight:i.fontWeight||"normal",size:0|parseFloat(i.fontSize||12),family:n||"Microsoft YaHei"},ZI[t]=e,UI++}return e};!function(t,e){xm[t]=e}("measureText",function(t,e){var n=yI;GI||((GI=n.createElement("div")).style.cssText="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;",yI.body.appendChild(GI));try{GI.style.font=e}catch(t){}return GI.innerHTML="",GI.appendChild(n.createTextNode(t)),{width:GI.offsetWidth}});for(var jI=new re,qI=[Mm,on,an,Ii,ry],$I=0;$I<qI.length;$I++){var KI=qI[$I].prototype;KI.drawRectText=function(t,e,n,i){var r=this.style;this.__dirty&&Ve(r);var o=r.text;if(null!=o&&(o+=""),o){if(r.rich){var a=Ne(o,r);o=[];for(var s=0;s<a.lines.length;s++){for(var l=a.lines[s].tokens,u=[],h=0;h<l.length;h++)u.push(l[h].text);o.push(u.join(""))}o=o.join("\n")}var c,d,f=r.textAlign,p=r.textVerticalAlign,g=YI(r.font),m=g.style+" "+g.variant+" "+g.weight+" "+g.size+'px "'+g.family+'"';n=n||Se(o,m,f,p);var v=this.transform;if(v&&!i&&(jI.copy(e),jI.applyTransform(v),e=jI),i)c=e.x,d=e.y;else{var y=r.textPosition,x=r.textDistance;if(y instanceof Array)c=e.x+zI(y[0],e.width),d=e.y+zI(y[1],e.height),f=f||"left";else{var _=Ae(y,e,x);c=_.x,d=_.y,f=f||_.textAlign,p=p||_.textVerticalAlign}}c=Te(c,n.width,f),d=Ce(d,n.height,p),d+=n.height/2;var w,b,S,M=hp,I=this._textVmlEl;I?b=(w=(S=I.firstChild).nextSibling).nextSibling:(I=M("line"),w=M("path"),b=M("textpath"),S=M("skew"),b.style["v-text-align"]="left",AI(I),w.textpathok=!0,b.on=!0,I.from="0 0",I.to="1000 0.05",PI(I,S),PI(I,w),PI(I,b),this._textVmlEl=I);var T=[c,d],C=I.style;v&&i?($(T,T,v),S.on=!0,S.matrix=v[0].toFixed(3)+","+v[2].toFixed(3)+","+v[1].toFixed(3)+","+v[3].toFixed(3)+",0,0",S.offset=(_I(T[0])||0)+","+(_I(T[1])||0),S.origin="0 0",C.left="0px",C.top="0px"):(S.on=!1,C.left=_I(c)+"px",C.top=_I(d)+"px"),b.string=DI(o);try{b.style.font=m}catch(t){}FI(I,"fill",{fill:r.textFill,opacity:r.opacity},this),FI(I,"stroke",{stroke:r.textStroke,opacity:r.opacity,lineDash:r.lineDash},this),I.style.zIndex=OI(this.zlevel,this.z,this.z2),PI(t,I)}},KI.removeRectText=function(t){LI(t,this._textVmlEl),this._textVmlEl=null},KI.appendRectText=function(t){PI(t,this._textVmlEl)}}ry.prototype.brushVML=function(t){var e=this.style;null!=e.text?this.drawRectText(t,{x:e.x||0,y:e.y||0,width:0,height:0},this.getBoundingRect(),!0):this.removeRectText(t)},ry.prototype.onRemove=function(t){this.removeRectText(t)},ry.prototype.onAdd=function(t){this.appendRectText(t)}}fp.prototype={constructor:fp,getType:function(){return"vml"},getViewportRoot:function(){return this._vmlViewport},getViewportRootOffset:function(){var t=this.getViewportRoot();if(t)return{offsetLeft:t.offsetLeft||0,offsetTop:t.offsetTop||0}},refresh:function(){var t=this.storage.getDisplayList(!0,!0);this._paintList(t)},_paintList:function(t){for(var e=this._vmlRoot,n=0;n<t.length;n++){var i=t[n];i.invisible||i.ignore?(i.__alreadyNotVisible||i.onRemove(e),i.__alreadyNotVisible=!0):(i.__alreadyNotVisible&&i.onAdd(e),i.__alreadyNotVisible=!1,i.__dirty&&(i.beforeBrush&&i.beforeBrush(),(i.brushVML||i.brush).call(i,e),i.afterBrush&&i.afterBrush())),i.__dirty=!1}this._firstPaint&&(this._vmlViewport.appendChild(e),this._firstPaint=!1)},resize:function(t,e){var t=null==t?this._getWidth():t,e=null==e?this._getHeight():e;if(this._width!=t||this._height!=e){this._width=t,this._height=e;var n=this._vmlViewport.style;n.width=t+"px",n.height=e+"px"}},dispose:function(){this.root.innerHTML="",this._vmlRoot=this._vmlViewport=this.storage=null},getWidth:function(){return this._width},getHeight:function(){return this._height},clear:function(){this._vmlViewport&&this.root.removeChild(this._vmlViewport)},_getWidth:function(){var t=this.root,e=t.currentStyle;return(t.clientWidth||dp(e.width))-dp(e.paddingLeft)-dp(e.paddingRight)|0},_getHeight:function(){var t=this.root,e=t.currentStyle;return(t.clientHeight||dp(e.height))-dp(e.paddingTop)-dp(e.paddingBottom)|0}},d(["getLayer","insertLayer","eachLayer","eachBuiltinLayer","eachOtherLayer","getLayers","modLayer","delLayer","clearLayer","toDataURL","pathToImage"],function(t){fp.prototype[t]=pp(t)}),bn("vml",fp);var QI="http://www.w3.org/2000/svg",JI=Ov.CMD,tT=Array.prototype.join,eT="none",nT=Math.round,iT=Math.sin,rT=Math.cos,oT=Math.PI,aT=2*Math.PI,sT=180/oT,lT=1e-4,uT={};uT.brush=function(t){var e=t.style,n=t.__svgEl;n||(n=gp("path"),t.__svgEl=n),t.path||t.createPathProxy();var i=t.path;if(t.__dirtyPath){i.beginPath(),t.buildPath(i,t.shape),t.__dirtyPath=!1;var r=Mp(i);r.indexOf("NaN")<0&&wp(n,"d",r)}Sp(n,e,!1,t),_p(n,t.transform),null!=e.text&&fT(t,t.getBoundingRect())};var hT={};hT.brush=function(t){var e=t.style,n=e.image;if(n instanceof HTMLImageElement&&(n=n.src),n){var i=e.x||0,r=e.y||0,o=e.width,a=e.height,s=t.__svgEl;s||(s=gp("image"),t.__svgEl=s),n!==t.__imageSrc&&(bp(s,"href",n),t.__imageSrc=n),wp(s,"width",o),wp(s,"height",a),wp(s,"x",i),wp(s,"y",r),_p(s,t.transform),null!=e.text&&fT(t,t.getBoundingRect())}};var cT={},dT=new re,fT=function(t,e,n){var i=t.style;t.__dirty&&Ve(i);var r=i.text;if(null!=r){r+="";var o=t.__textSvgEl;o||(o=gp("text"),t.__textSvgEl=o);var a,s,l=i.textPosition,u=i.textDistance,h=i.textAlign||"left";"number"==typeof i.fontSize&&(i.fontSize+="px");var c=i.font||[i.fontStyle||"",i.fontWeight||"",i.fontSize||"",i.fontFamily||""].join(" ")||ym,d=Ip(i.textVerticalAlign),f=(n=Se(r,c,h,d)).lineHeight;if(l instanceof Array)a=e.x+l[0],s=e.y+l[1];else{var p=Ae(l,e,u);a=p.x,s=p.y,d=Ip(p.textVerticalAlign),h=p.textAlign}wp(o,"alignment-baseline",d),c&&(o.style.font=c);var g=i.textPadding;if(wp(o,"x",a),wp(o,"y",s),Sp(o,i,!0,t),t instanceof ry||t.style.transformText)_p(o,t.transform);else{if(t.transform)dT.copy(e),dT.applyTransform(t.transform),e=dT;else{var m=t.transformCoordToGlobal(e.x,e.y);e.x=m[0],e.y=m[1],t.transform=pt(ft())}var v=i.textOrigin;"center"===v?(a=n.width/2+a,s=n.height/2+s):v&&(a=v[0]+a,s=v[1]+s);var y=-i.textRotation||0,x=ft();yt(x,x,y),vt(x,x,m=[t.transform[4],t.transform[5]]),_p(o,x)}var _=r.split("\n"),w=_.length,b=h;"left"===b?(b="start",g&&(a+=g[3])):"right"===b?(b="end",g&&(a-=g[1])):"center"===b&&(b="middle",g&&(a+=(g[3]-g[1])/2));var S=0;if("after-edge"===d?(S=-n.height+f,g&&(S-=g[2])):"middle"===d?(S=(-n.height+f)/2,g&&(s+=(g[0]-g[2])/2)):g&&(S+=g[0]),t.__text!==r||t.__textFont!==c){var M=t.__tspanList||[];t.__tspanList=M;for(T=0;T<w;T++)(C=M[T])?C.innerHTML="":(C=M[T]=gp("tspan"),o.appendChild(C),wp(C,"alignment-baseline",d),wp(C,"text-anchor",b)),wp(C,"x",a),wp(C,"y",s+T*f+S),C.appendChild(document.createTextNode(_[T]));for(;T<M.length;T++)o.removeChild(M[T]);M.length=w,t.__text=r,t.__textFont=c}else if(t.__tspanList.length)for(var I=t.__tspanList.length,T=0;T<I;++T){var C=t.__tspanList[T];C&&(wp(C,"x",a),wp(C,"y",s+T*f+S))}}};cT.drawRectText=fT,cT.brush=function(t){var e=t.style;null!=e.text&&(e.textPosition=[0,0],fT(t,{x:e.x||0,y:e.y||0,width:0,height:0},t.getBoundingRect()))},Tp.prototype={diff:function(t,e,n){n||(n=function(t,e){return t===e}),this.equals=n;var i=this;t=t.slice();var r=(e=e.slice()).length,o=t.length,a=1,s=r+o,l=[{newPos:-1,components:[]}],u=this.extractCommon(l[0],e,t,0);if(l[0].newPos+1>=r&&u+1>=o){for(var h=[],c=0;c<e.length;c++)h.push(c);return[{indices:h,count:e.length}]}for(;a<=s;){var d=function(){for(var n=-1*a;n<=a;n+=2){var s,u=l[n-1],h=l[n+1],c=(h?h.newPos:0)-n;u&&(l[n-1]=void 0);var d=u&&u.newPos+1<r,f=h&&0<=c&&c<o;if(d||f){if(!d||f&&u.newPos<h.newPos?(s=Ap(h),i.pushComponent(s.components,void 0,!0)):((s=u).newPos++,i.pushComponent(s.components,!0,void 0)),c=i.extractCommon(s,e,t,n),s.newPos+1>=r&&c+1>=o)return Cp(0,s.components);l[n]=s}else l[n]=void 0}a++}();if(d)return d}},pushComponent:function(t,e,n){var i=t[t.length-1];i&&i.added===e&&i.removed===n?t[t.length-1]={count:i.count+1,added:e,removed:n}:t.push({count:1,added:e,removed:n})},extractCommon:function(t,e,n,i){for(var r=e.length,o=n.length,a=t.newPos,s=a-i,l=0;a+1<r&&s+1<o&&this.equals(e[a+1],n[s+1]);)a++,s++,l++;return l&&t.components.push({count:l}),t.newPos=a,s},tokenize:function(t){return t.slice()},join:function(t){return t.slice()}};var pT=new Tp,gT=function(t,e,n){return pT.diff(t,e,n)};Dp.prototype.createElement=gp,Dp.prototype.getDefs=function(t){var e=this._svgRoot,n=this._svgRoot.getElementsByTagName("defs");return 0===n.length?t?((n=e.insertBefore(this.createElement("defs"),e.firstChild)).contains||(n.contains=function(t){var e=n.children;if(!e)return!1;for(var i=e.length-1;i>=0;--i)if(e[i]===t)return!0;return!1}),n):null:n[0]},Dp.prototype.update=function(t,e){if(t){var n=this.getDefs(!1);if(t[this._domName]&&n.contains(t[this._domName]))"function"==typeof e&&e(t);else{var i=this.add(t);i&&(t[this._domName]=i)}}},Dp.prototype.addDom=function(t){this.getDefs(!0).appendChild(t)},Dp.prototype.removeDom=function(t){var e=this.getDefs(!1);e&&t[this._domName]&&(e.removeChild(t[this._domName]),t[this._domName]=null)},Dp.prototype.getDoms=function(){var t=this.getDefs(!1);if(!t)return[];var e=[];return d(this._tagNames,function(n){var i=t.getElementsByTagName(n);e=e.concat([].slice.call(i))}),e},Dp.prototype.markAllUnused=function(){var t=this;d(this.getDoms(),function(e){e[t._markLabel]="0"})},Dp.prototype.markUsed=function(t){t&&(t[this._markLabel]="1")},Dp.prototype.removeUnused=function(){var t=this.getDefs(!1);if(t){var e=this;d(this.getDoms(),function(n){"1"!==n[e._markLabel]&&t.removeChild(n)})}},Dp.prototype.getSvgProxy=function(t){return t instanceof Ii?uT:t instanceof an?hT:t instanceof ry?cT:uT},Dp.prototype.getTextSvgElement=function(t){return t.__textSvgEl},Dp.prototype.getSvgElement=function(t){return t.__svgEl},u(kp,Dp),kp.prototype.addWithoutUpdate=function(t,e){if(e&&e.style){var n=this;d(["fill","stroke"],function(i){if(e.style[i]&&("linear"===e.style[i].type||"radial"===e.style[i].type)){var r,o=e.style[i],a=n.getDefs(!0);o._dom?(r=o._dom,a.contains(o._dom)||n.addDom(r)):r=n.add(o),n.markUsed(e);var s=r.getAttribute("id");t.setAttribute(i,"url(#"+s+")")}})}},kp.prototype.add=function(t){var e;if("linear"===t.type)e=this.createElement("linearGradient");else{if("radial"!==t.type)return Yg("Illegal gradient type."),null;e=this.createElement("radialGradient")}return t.id=t.id||this.nextId++,e.setAttribute("id","zr"+this._zrId+"-gradient-"+t.id),this.updateDom(t,e),this.addDom(e),e},kp.prototype.update=function(t){var e=this;Dp.prototype.update.call(this,t,function(){var n=t.type,i=t._dom.tagName;"linear"===n&&"linearGradient"===i||"radial"===n&&"radialGradient"===i?e.updateDom(t,t._dom):(e.removeDom(t),e.add(t))})},kp.prototype.updateDom=function(t,e){if("linear"===t.type)e.setAttribute("x1",t.x),e.setAttribute("y1",t.y),e.setAttribute("x2",t.x2),e.setAttribute("y2",t.y2);else{if("radial"!==t.type)return void Yg("Illegal gradient type.");e.setAttribute("cx",t.x),e.setAttribute("cy",t.y),e.setAttribute("r",t.r)}t.global?e.setAttribute("gradientUnits","userSpaceOnUse"):e.setAttribute("gradientUnits","objectBoundingBox"),e.innerHTML="";for(var n=t.colorStops,i=0,r=n.length;i<r;++i){var o=this.createElement("stop");o.setAttribute("offset",100*n[i].offset+"%"),o.setAttribute("stop-color",n[i].color),e.appendChild(o)}t._dom=e},kp.prototype.markUsed=function(t){if(t.style){var e=t.style.fill;e&&e._dom&&Dp.prototype.markUsed.call(this,e._dom),(e=t.style.stroke)&&e._dom&&Dp.prototype.markUsed.call(this,e._dom)}},u(Pp,Dp),Pp.prototype.update=function(t){var e=this.getSvgElement(t);e&&this.updateDom(e,t.__clipPaths,!1);var n=this.getTextSvgElement(t);n&&this.updateDom(n,t.__clipPaths,!0),this.markUsed(t)},Pp.prototype.updateDom=function(t,e,n){if(e&&e.length>0){var i,r,o=this.getDefs(!0),a=e[0],s=n?"_textDom":"_dom";a[s]?(r=a[s].getAttribute("id"),i=a[s],o.contains(i)||o.appendChild(i)):(r="zr"+this._zrId+"-clip-"+this.nextId,++this.nextId,(i=this.createElement("clipPath")).setAttribute("id",r),o.appendChild(i),a[s]=i);var l=this.getSvgProxy(a);if(a.transform&&a.parent.invTransform&&!n){var u=Array.prototype.slice.call(a.transform);mt(a.transform,a.parent.invTransform,a.transform),l.brush(a),a.transform=u}else l.brush(a);var h=this.getSvgElement(a);i.innerHTML="",i.appendChild(h.cloneNode()),t.setAttribute("clip-path","url(#"+r+")"),e.length>1&&this.updateDom(i,e.slice(1),n)}else t&&t.setAttribute("clip-path","none")},Pp.prototype.markUsed=function(t){var e=this;t.__clipPaths&&t.__clipPaths.length>0&&d(t.__clipPaths,function(t){t._dom&&Dp.prototype.markUsed.call(e,t._dom),t._textDom&&Dp.prototype.markUsed.call(e,t._textDom)})},u(Lp,Dp),Lp.prototype.addWithoutUpdate=function(t,e){if(e&&Op(e.style)){var n,i=e.style;i._shadowDom?(n=i._shadowDom,this.getDefs(!0).contains(i._shadowDom)||this.addDom(n)):n=this.add(e),this.markUsed(e);var r=n.getAttribute("id");t.style.filter="url(#"+r+")"}},Lp.prototype.add=function(t){var e=this.createElement("filter"),n=t.style;return n._shadowDomId=n._shadowDomId||this.nextId++,e.setAttribute("id","zr"+this._zrId+"-shadow-"+n._shadowDomId),this.updateDom(t,e),this.addDom(e),e},Lp.prototype.update=function(t,e){var n=e.style;if(Op(n)){var i=this;Dp.prototype.update.call(this,e,function(t){i.updateDom(e,t._shadowDom)})}else this.remove(t,n)},Lp.prototype.remove=function(t,e){null!=e._shadowDomId&&(this.removeDom(e),t.style.filter="")},Lp.prototype.updateDom=function(t,e){var n=e.getElementsByTagName("feDropShadow");n=0===n.length?this.createElement("feDropShadow"):n[0];var i,r,o,a,s=t.style,l=t.scale?t.scale[0]||1:1,u=t.scale?t.scale[1]||1:1;if(s.shadowBlur||s.shadowOffsetX||s.shadowOffsetY)i=s.shadowOffsetX||0,r=s.shadowOffsetY||0,o=s.shadowBlur,a=s.shadowColor;else{if(!s.textShadowBlur)return void this.removeDom(e,s);i=s.textShadowOffsetX||0,r=s.textShadowOffsetY||0,o=s.textShadowBlur,a=s.textShadowColor}n.setAttribute("dx",i/l),n.setAttribute("dy",r/u),n.setAttribute("flood-color",a);var h=o/2/l+" "+o/2/u;n.setAttribute("stdDeviation",h),e.setAttribute("x","-100%"),e.setAttribute("y","-100%"),e.setAttribute("width",Math.ceil(o/2*200)+"%"),e.setAttribute("height",Math.ceil(o/2*200)+"%"),e.appendChild(n),s._shadowDom=e},Lp.prototype.markUsed=function(t){var e=t.style;e&&e._shadowDom&&Dp.prototype.markUsed.call(this,e._shadowDom)};var mT=function(t,e,n,i){this.root=t,this.storage=e,this._opts=n=o({},n||{});var r=gp("svg");r.setAttribute("xmlns","http://www.w3.org/2000/svg"),r.setAttribute("version","1.1"),r.setAttribute("baseProfile","full"),r.style.cssText="user-select:none;position:absolute;left:0;top:0;",this.gradientManager=new kp(i,r),this.clipPathManager=new Pp(i,r),this.shadowManager=new Lp(i,r);var a=document.createElement("div");a.style.cssText="overflow:hidden;position:relative",this._svgRoot=r,this._viewport=a,t.appendChild(a),a.appendChild(r),this.resize(n.width,n.height),this._visibleList=[]};mT.prototype={constructor:mT,getType:function(){return"svg"},getViewportRoot:function(){return this._viewport},getViewportRootOffset:function(){var t=this.getViewportRoot();if(t)return{offsetLeft:t.offsetLeft||0,offsetTop:t.offsetTop||0}},refresh:function(){var t=this.storage.getDisplayList(!0);this._paintList(t)},setBackgroundColor:function(t){this._viewport.style.background=t},_paintList:function(t){this.gradientManager.markAllUnused(),this.clipPathManager.markAllUnused(),this.shadowManager.markAllUnused();var e,n=this._svgRoot,i=this._visibleList,r=t.length,o=[];for(e=0;e<r;e++){var a=Ep(f=t[e]),s=Wp(f)||Vp(f);f.invisible||(f.__dirty&&(a&&a.brush(f),this.clipPathManager.update(f),f.style&&(this.gradientManager.update(f.style.fill),this.gradientManager.update(f.style.stroke),this.shadowManager.update(s,f)),f.__dirty=!1),o.push(f))}var l,u=gT(i,o);for(e=0;e<u.length;e++)if((c=u[e]).removed)for(d=0;d<c.count;d++){var s=Wp(f=i[c.indices[d]]),h=Vp(f);Fp(n,s),Fp(n,h)}for(e=0;e<u.length;e++){var c=u[e];if(c.added)for(d=0;d<c.count;d++){var s=Wp(f=o[c.indices[d]]),h=Vp(f);l?Rp(n,s,l):Bp(n,s),s?Rp(n,h,s):l?Rp(n,h,l):Bp(n,h),Rp(n,h,s),l=h||s||l,this.gradientManager.addWithoutUpdate(s,f),this.shadowManager.addWithoutUpdate(l,f),this.clipPathManager.markUsed(f)}else if(!c.removed)for(var d=0;d<c.count;d++){var f=o[c.indices[d]];l=s=Vp(f)||Wp(f)||l,this.gradientManager.markUsed(f),this.gradientManager.addWithoutUpdate(s,f),this.shadowManager.markUsed(f),this.shadowManager.addWithoutUpdate(s,f),this.clipPathManager.markUsed(f)}}this.gradientManager.removeUnused(),this.clipPathManager.removeUnused(),this.shadowManager.removeUnused(),this._visibleList=o},_getDefs:function(t){var e=this._svgRoot,n=this._svgRoot.getElementsByTagName("defs");return 0===n.length?t?((n=e.insertBefore(gp("defs"),e.firstChild)).contains||(n.contains=function(t){var e=n.children;if(!e)return!1;for(var i=e.length-1;i>=0;--i)if(e[i]===t)return!0;return!1}),n):null:n[0]},resize:function(t,e){var n=this._viewport;n.style.display="none";var i=this._opts;if(null!=t&&(i.width=t),null!=e&&(i.height=e),t=this._getSize(0),e=this._getSize(1),n.style.display="",this._width!==t||this._height!==e){this._width=t,this._height=e;var r=n.style;r.width=t+"px",r.height=e+"px";var o=this._svgRoot;o.setAttribute("width",t),o.setAttribute("height",e)}},getWidth:function(){return this._width},getHeight:function(){return this._height},_getSize:function(t){var e=this._opts,n=["width","height"][t],i=["clientWidth","clientHeight"][t],r=["paddingLeft","paddingTop"][t],o=["paddingRight","paddingBottom"][t];if(null!=e[n]&&"auto"!==e[n])return parseFloat(e[n]);var a=this.root,s=document.defaultView.getComputedStyle(a);return(a[i]||zp(s[n])||zp(a.style[n]))-(zp(s[r])||0)-(zp(s[o])||0)|0},dispose:function(){this.root.innerHTML="",this._svgRoot=this._viewport=this.storage=null},clear:function(){this._viewport&&this.root.removeChild(this._viewport)},pathToDataUrl:function(){return this.refresh(),"data:image/svg+xml;charset=UTF-8,"+this._svgRoot.outerHTML}},d(["getLayer","insertLayer","eachLayer","eachBuiltinLayer","eachOtherLayer","getLayers","modLayer","delLayer","clearLayer","toDataURL","pathToImage"],function(t){mT.prototype[t]=Hp(t)}),bn("svg",mT),t.version="4.2.0",t.dependencies=D_,t.PRIORITY=O_,t.init=function(t,e,n){var i=ms(t);if(i)return i;var r=new ja(t,e,n);return r.id="ec_"+$_++,j_[r.id]=r,Nn(t,Q_,r.id),ps(r),r},t.connect=function(t){if(y(t)){var e=t;t=null,I_(e,function(e){null!=e.group&&(t=e.group)}),t=t||"g_"+K_++,I_(e,function(e){e.group=t})}return q_[t]=!0,t},t.disConnect=gs,t.disconnect=J_,t.dispose=function(t){"string"==typeof t?t=j_[t]:t instanceof ja||(t=ms(t)),t instanceof ja&&!t.isDisposed()&&t.dispose()},t.getInstanceByDom=ms,t.getInstanceById=function(t){return j_[t]},t.registerTheme=vs,t.registerPreprocessor=ys,t.registerProcessor=xs,t.registerPostUpdate=function(t){Z_.push(t)},t.registerAction=_s,t.registerCoordinateSystem=function(t,e){Co.register(t,e)},t.getCoordinateSystemDimensions=function(t){var e=Co.get(t);if(e)return e.getDimensionsInfo?e.getDimensionsInfo():e.dimensions.slice()},t.registerLayout=ws,t.registerVisual=bs,t.registerLoading=Ms,t.extendComponentModel=Is,t.extendComponentView=Ts,t.extendSeriesModel=Cs,t.extendChartView=As,t.setCanvasCreator=function(t){e("createCanvas",t)},t.registerMap=function(t,e,n){b_.registerMap(t,e,n)},t.getMap=function(t){var e=b_.retrieveMap(t);return e&&e[0]&&{geoJson:e[0].geoJSON,specialAreas:e[0].specialAreas}},t.dataTool=tw,t.zrender=Wm,t.number=Vy,t.format=jy,t.throttle=ya,t.helper=Xw,t.matrix=bg,t.vector=dg,t.color=Wg,t.parseGeoJSON=jw,t.parseGeoJson=Qw,t.util=Jw,t.graphic=tb,t.List=uw,t.Model=Sr,t.Axis=Kw,t.env=Xp}); diff --git a/cyclone-web/vendor/file-saver/FileSaver.js b/cyclone-web/vendor/file-saver/FileSaver.js new file mode 100644 index 0000000000000000000000000000000000000000..5df4bc24ac32a165f3f7bc7d0dc28e4a5bae7e84 --- /dev/null +++ b/cyclone-web/vendor/file-saver/FileSaver.js @@ -0,0 +1,280 @@ +/* FileSaver.js + * A saveAs() FileSaver implementation. + * 1.1.20160328 + * + * By Eli Grey, http://eligrey.com + * License: MIT + * See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md + */ + +/*global self */ +/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */ + +/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */ + +var saveAs = saveAs || (function (view) { + "use strict"; + // IE <10 is explicitly unsupported + if (typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) { + return; + } + var + doc = view.document + // only get URL when necessary in case Blob.js hasn't overridden it yet + , get_URL = function () { + return view.URL || view.webkitURL || view; + } + , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a") + , can_use_save_link = "download" in save_link + , click = function (node) { + var event = new MouseEvent("click"); + node.dispatchEvent(event); + } + , is_safari = /Version\/[\d\.]+.*Safari/.test(navigator.userAgent) + , webkit_req_fs = view.webkitRequestFileSystem + , req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem + , throw_outside = function (ex) { + (view.setImmediate || view.setTimeout)(function () { + throw ex; + }, 0); + } + , force_saveable_type = "application/octet-stream" + , fs_min_size = 0 + // the Blob API is fundamentally broken as there is no "downloadfinished" event to subscribe to + , arbitrary_revoke_timeout = 1000 * 40 // in ms + , revoke = function (file) { + var revoker = function () { + if (typeof file === "string") { // file is an object URL + get_URL().revokeObjectURL(file); + } else { // file is a File + file.remove(); + } + }; + /* // Take note W3C: + var + uri = typeof file === "string" ? file : file.toURL() + , revoker = function(evt) { + // idealy DownloadFinishedEvent.data would be the URL requested + if (evt.data === uri) { + if (typeof file === "string") { // file is an object URL + get_URL().revokeObjectURL(file); + } else { // file is a File + file.remove(); + } + } + } + ; + view.addEventListener("downloadfinished", revoker); + */ + setTimeout(revoker, arbitrary_revoke_timeout); + } + , dispatch = function (filesaver, event_types, event) { + event_types = [].concat(event_types); + var i = event_types.length; + while (i--) { + var listener = filesaver["on" + event_types[i]]; + if (typeof listener === "function") { + try { + listener.call(filesaver, event || filesaver); + } catch (ex) { + throw_outside(ex); + } + } + } + } + , auto_bom = function (blob) { + // prepend BOM for UTF-8 XML and text/* types (including HTML) + if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) { + return new Blob(["\ufeff", blob], {type: blob.type}); + } + return blob; + } + , FileSaver = function (blob, name, no_auto_bom) { + if (!no_auto_bom) { + blob = auto_bom(blob); + } + // First try a.download, then web filesystem, then object URLs + var + filesaver = this + , type = blob.type + , blob_changed = false + , object_url + , target_view + , dispatch_all = function () { + dispatch(filesaver, "writestart progress write writeend".split(" ")); + } + // on any filesys errors revert to saving with object URLs + , fs_error = function () { + if (target_view && is_safari && typeof FileReader !== "undefined") { + // Safari doesn't allow downloading of blob urls + var reader = new FileReader(); + reader.onloadend = function () { + var base64Data = reader.result; + target_view.location.href = "data:attachment/file" + base64Data.slice(base64Data.search(/[,;]/)); + filesaver.readyState = filesaver.DONE; + dispatch_all(); + }; + reader.readAsDataURL(blob); + filesaver.readyState = filesaver.INIT; + return; + } + // don't create more object URLs than needed + if (blob_changed || !object_url) { + object_url = get_URL().createObjectURL(blob); + } + if (target_view) { + target_view.location.href = object_url; + } else { + var new_tab = view.open(object_url, "_blank"); + if (new_tab === undefined && is_safari) { + //Apple do not allow window.open, see http://bit.ly/1kZffRI + view.location.href = object_url + } + } + filesaver.readyState = filesaver.DONE; + dispatch_all(); + revoke(object_url); + } + , abortable = function (func) { + return function () { + if (filesaver.readyState !== filesaver.DONE) { + return func.apply(this, arguments); + } + }; + } + , create_if_not_found = {create: true, exclusive: false} + , slice + ; + filesaver.readyState = filesaver.INIT; + if (!name) { + name = "download"; + } + if (can_use_save_link) { + object_url = get_URL().createObjectURL(blob); + setTimeout(function () { + save_link.href = object_url; + save_link.download = name; + click(save_link); + dispatch_all(); + revoke(object_url); + filesaver.readyState = filesaver.DONE; + }); + return; + } + // Object and web filesystem URLs have a problem saving in Google Chrome when + // viewed in a tab, so I force save with application/octet-stream + // http://code.google.com/p/chromium/issues/detail?id=91158 + // Update: Google errantly closed 91158, I submitted it again: + // https://code.google.com/p/chromium/issues/detail?id=389642 + if (view.chrome && type && type !== force_saveable_type) { + slice = blob.slice || blob.webkitSlice; + blob = slice.call(blob, 0, blob.size, force_saveable_type); + blob_changed = true; + } + // Since I can't be sure that the guessed media type will trigger a download + // in WebKit, I append .download to the filename. + // https://bugs.webkit.org/show_bug.cgi?id=65440 + if (webkit_req_fs && name !== "download") { + name += ".download"; + } + if (type === force_saveable_type || webkit_req_fs) { + target_view = view; + } + if (!req_fs) { + fs_error(); + return; + } + fs_min_size += blob.size; + req_fs(view.TEMPORARY, fs_min_size, abortable(function (fs) { + fs.root.getDirectory("saved", create_if_not_found, abortable(function (dir) { + var save = function () { + dir.getFile(name, create_if_not_found, abortable(function (file) { + file.createWriter(abortable(function (writer) { + writer.onwriteend = function (event) { + target_view.location.href = file.toURL(); + filesaver.readyState = filesaver.DONE; + dispatch(filesaver, "writeend", event); + revoke(file); + }; + writer.onerror = function () { + var error = writer.error; + if (error.code !== error.ABORT_ERR) { + fs_error(); + } + }; + "writestart progress write abort".split(" ").forEach(function (event) { + writer["on" + event] = filesaver["on" + event]; + }); + writer.write(blob); + filesaver.abort = function () { + writer.abort(); + filesaver.readyState = filesaver.DONE; + }; + filesaver.readyState = filesaver.WRITING; + }), fs_error); + }), fs_error); + }; + dir.getFile(name, {create: false}, abortable(function (file) { + // delete file if it already exists + file.remove(); + save(); + }), abortable(function (ex) { + if (ex.code === ex.NOT_FOUND_ERR) { + save(); + } else { + fs_error(); + } + })); + }), fs_error); + }), fs_error); + } + , FS_proto = FileSaver.prototype + , saveAs = function (blob, name, no_auto_bom) { + return new FileSaver(blob, name, no_auto_bom); + } + ; + // IE 10+ (native saveAs) + if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) { + return function (blob, name, no_auto_bom) { + if (!no_auto_bom) { + blob = auto_bom(blob); + } + return navigator.msSaveOrOpenBlob(blob, name || "download"); + }; + } + + FS_proto.abort = function () { + var filesaver = this; + filesaver.readyState = filesaver.DONE; + dispatch(filesaver, "abort"); + }; + FS_proto.readyState = FS_proto.INIT = 0; + FS_proto.WRITING = 1; + FS_proto.DONE = 2; + + FS_proto.error = + FS_proto.onwritestart = + FS_proto.onprogress = + FS_proto.onwrite = + FS_proto.onabort = + FS_proto.onerror = + FS_proto.onwriteend = + null; + + return saveAs; + }( + typeof self !== "undefined" && self + || typeof window !== "undefined" && window + || this.content + )); +// `self` is undefined in Firefox for Android content script context +// while `this` is nsIContentFrameMessageManager +// with an attribute `content` that corresponds to the window + +if (typeof module !== "undefined" && module.exports) { + module.exports.saveAs = saveAs; +} else if ((typeof define !== "undefined" && define !== null) && (define.amd !== null)) { + define([], function () { + return saveAs; + }); +} diff --git a/cyclone-web/vendor/fonts-boot/demo.css b/cyclone-web/vendor/fonts-boot/demo.css new file mode 100644 index 0000000000000000000000000000000000000000..3d9cbe76ad388b8e48eb2fb3482a04687050d55e --- /dev/null +++ b/cyclone-web/vendor/fonts-boot/demo.css @@ -0,0 +1,370 @@ +*{margin: 0;padding: 0;list-style: none;} +/* +KISSY CSS Reset +理念:1. reset 的目的不是清除浏览器的默认样式,这仅是部分工作。清除和重置是紧密不可分的。 +2. reset 的目的不是让默认样式在所有浏览器下一致,而是减少默认样式有可能带来的问题。 +3. reset 期望提供一套普适通用的基础样式。但没有银弹,推荐根据具体需求,裁剪和修改后再使用。 +特色:1. 适应中文;2. 基于最新主流浏览器。 +维护:玉伯<lifesinger@gmail.com>, 正淳<ragecarrier@gmail.com> + */ + +/** 清除内外边距 **/ +body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, /* structural elements 结构元素 */ +dl, dt, dd, ul, ol, li, /* list elements 列表元素 */ +pre, /* text formatting elements 文本格式元素 */ +form, fieldset, legend, button, input, textarea, /* form elements 表单元素 */ +th, td /* table elements 表格元素 */ { + margin: 0; + padding: 0; +} + +/** 设置默认字体 **/ +body, +button, input, select, textarea /* for ie */ { + font: 12px/1.5 tahoma, arial, \5b8b\4f53, sans-serif; +} +h1, h2, h3, h4, h5, h6 { font-size: 100%; } +address, cite, dfn, em, var { font-style: normal; } /* 将斜体扶正 */ +code, kbd, pre, samp { font-family: courier new, courier, monospace; } /* 统一等宽字体 */ +small { font-size: 12px; } /* 小于 12px 的中文很难阅读,让 small 正常化 */ + +/** 重置列表元素 **/ +ul, ol { list-style: none; } + +/** 重置文本格式元素 **/ +a { text-decoration: none; } +a:hover { text-decoration: underline; } + + +/** 重置表单元素 **/ +legend { color: #000; } /* for ie6 */ +fieldset, img { border: 0; } /* img 搭车:让链接里的 img 无边框 */ +button, input, select, textarea { font-size: 100%; } /* 使得表单元素在 ie 下能继承字体大小 */ +/* 注:optgroup 无法扶正 */ + +/** 重置表格元素 **/ +table { border-collapse: collapse; border-spacing: 0; } + +/* 清除浮动 */ +.ks-clear:after, .clear:after { + content: '\20'; + display: block; + height: 0; + clear: both; +} +.ks-clear, .clear { + *zoom: 1; +} + +.main { + padding: 30px 100px; +width: 960px; +margin: 0 auto; +} +.main h1{font-size:36px; color:#333; text-align:left;margin-bottom:30px; border-bottom: 1px solid #eee;} + +.helps{margin-top:40px;} +.helps pre{ + padding:20px; + margin:10px 0; + border:solid 1px #e7e1cd; + background-color: #fffdef; + overflow: auto; +} + +.icon_lists{ + width: 100% !important; + +} + +.icon_lists li{ + float:left; + width: 100px; + height:180px; + text-align: center; + list-style: none !important; +} +.icon_lists .icon{ + font-size: 42px; + line-height: 100px; + margin: 10px 0; + color:#333; + -webkit-transition: font-size 0.25s ease-out 0s; + -moz-transition: font-size 0.25s ease-out 0s; + transition: font-size 0.25s ease-out 0s; + +} +.icon_lists .icon:hover{ + font-size: 100px; +} + + + +.markdown { + color: #666; + font-size: 14px; + line-height: 1.8; +} + +.highlight { + line-height: 1.5; +} + +.markdown img { + vertical-align: middle; + max-width: 100%; +} + +.markdown h1 { + color: #404040; + font-weight: 500; + line-height: 40px; + margin-bottom: 24px; +} + +.markdown h2, +.markdown h3, +.markdown h4, +.markdown h5, +.markdown h6 { + color: #404040; + margin: 1.6em 0 0.6em 0; + font-weight: 500; + clear: both; +} + +.markdown h1 { + font-size: 28px; +} + +.markdown h2 { + font-size: 22px; +} + +.markdown h3 { + font-size: 16px; +} + +.markdown h4 { + font-size: 14px; +} + +.markdown h5 { + font-size: 12px; +} + +.markdown h6 { + font-size: 12px; +} + +.markdown hr { + height: 1px; + border: 0; + background: #e9e9e9; + margin: 16px 0; + clear: both; +} + +.markdown p, +.markdown pre { + margin: 1em 0; +} + +.markdown > p, +.markdown > blockquote, +.markdown > .highlight, +.markdown > ol, +.markdown > ul { + width: 80%; +} + +.markdown ul > li { + list-style: circle; +} + +.markdown > ul li, +.markdown blockquote ul > li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown > ul li p, +.markdown > ol li p { + margin: 0.6em 0; +} + +.markdown ol > li { + list-style: decimal; +} + +.markdown > ol li, +.markdown blockquote ol > li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown code { + margin: 0 3px; + padding: 0 5px; + background: #eee; + border-radius: 3px; +} + +.markdown pre { + border-radius: 6px; + background: #f7f7f7; + padding: 20px; +} + +.markdown pre code { + border: none; + background: #f7f7f7; + margin: 0; +} + +.markdown strong, +.markdown b { + font-weight: 600; +} + +.markdown > table { + border-collapse: collapse; + border-spacing: 0px; + empty-cells: show; + border: 1px solid #e9e9e9; + width: 95%; + margin-bottom: 24px; +} + +.markdown > table th { + white-space: nowrap; + color: #333; + font-weight: 600; + +} + +.markdown > table th, +.markdown > table td { + border: 1px solid #e9e9e9; + padding: 8px 16px; + text-align: left; +} + +.markdown > table th { + background: #F7F7F7; +} + +.markdown blockquote { + font-size: 90%; + color: #999; + border-left: 4px solid #e9e9e9; + padding-left: 0.8em; + margin: 1em 0; + font-style: italic; +} + +.markdown blockquote p { + margin: 0; +} + +.markdown .anchor { + opacity: 0; + transition: opacity 0.3s ease; + margin-left: 8px; +} + +.markdown .waiting { + color: #ccc; +} + +.markdown h1:hover .anchor, +.markdown h2:hover .anchor, +.markdown h3:hover .anchor, +.markdown h4:hover .anchor, +.markdown h5:hover .anchor, +.markdown h6:hover .anchor { + opacity: 1; + display: inline-block; +} + +.markdown > br, +.markdown > p > br { + clear: both; +} + + +.hljs { + display: block; + background: white; + padding: 0.5em; + color: #333333; + overflow-x: auto; +} + +.hljs-comment, +.hljs-meta { + color: #969896; +} + +.hljs-string, +.hljs-variable, +.hljs-template-variable, +.hljs-strong, +.hljs-emphasis, +.hljs-quote { + color: #df5000; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-type { + color: #a71d5d; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute { + color: #0086b3; +} + +.hljs-section, +.hljs-name { + color: #63a35c; +} + +.hljs-tag { + color: #333333; +} + +.hljs-title, +.hljs-attr, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #795da3; +} + +.hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.hljs-link { + text-decoration: underline; +} + +pre{ + background: #fff; +} + + + + + diff --git a/cyclone-web/vendor/fonts-boot/demo_fontclass.html b/cyclone-web/vendor/fonts-boot/demo_fontclass.html new file mode 100644 index 0000000000000000000000000000000000000000..257f147ed5d132dca848060d1dccfa783a9ac300 --- /dev/null +++ b/cyclone-web/vendor/fonts-boot/demo_fontclass.html @@ -0,0 +1,136 @@ + +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"/> + <title>IconFont</title> + <link rel="stylesheet" href="demo.css"> + <link rel="stylesheet" href="iconfont.css"> +</head> +<body> + <div class="main markdown"> + <h1>IconFont 图标</h1> + <ul class="icon_lists clear"> + + <li> + <i class="icon iconfont icon-150chanpinbaozhuangjitai"></i> + <div class="name">150-产品包装机台</div> + <div class="fontclass">.icon-150chanpinbaozhuangjitai</div> + </li> + + <li> + <i class="icon iconfont icon-dashbord"></i> + <div class="name">dashbord</div> + <div class="fontclass">.icon-dashbord</div> + </li> + + <li> + <i class="icon iconfont icon-anquanshenji"></i> + <div class="name">安全审计</div> + <div class="fontclass">.icon-anquanshenji</div> + </li> + + <li> + <i class="icon iconfont icon-yidongxuanze"></i> + <div class="name">移动选择</div> + <div class="fontclass">.icon-yidongxuanze</div> + </li> + + <li> + <i class="icon iconfont icon-heimingdan"></i> + <div class="name">黑名单</div> + <div class="fontclass">.icon-heimingdan</div> + </li> + + <li> + <i class="icon iconfont icon-xitongicon_yingjianguanli"></i> + <div class="name">系统icon_硬件管理</div> + <div class="fontclass">.icon-xitongicon_yingjianguanli</div> + </li> + + <li> + <i class="icon iconfont icon-baimingdanguanli"></i> + <div class="name">白名单管理</div> + <div class="fontclass">.icon-baimingdanguanli</div> + </li> + + <li> + <i class="icon iconfont icon-fangwenkongzhi"></i> + <div class="name">访问控制</div> + <div class="fontclass">.icon-fangwenkongzhi</div> + </li> + + <li> + <i class="icon iconfont icon-s-clonekelong"></i> + <div class="name">s-clone 克隆</div> + <div class="fontclass">.icon-s-clonekelong</div> + </li> + + <li> + <i class="icon iconfont icon-xitongshezhi"></i> + <div class="name">系统设置</div> + <div class="fontclass">.icon-xitongshezhi</div> + </li> + + <li> + <i class="icon iconfont icon-report"></i> + <div class="name">报表管理</div> + <div class="fontclass">.icon-report</div> + </li> + + <li> + <i class="icon iconfont icon-shebeiguanli"></i> + <div class="name">设备管理</div> + <div class="fontclass">.icon-shebeiguanli</div> + </li> + + <li> + <i class="icon iconfont icon-nav_ic_yingjianguanli"></i> + <div class="name">nav_ic_硬件管理</div> + <div class="fontclass">.icon-nav_ic_yingjianguanli</div> + </li> + + <li> + <i class="icon iconfont icon-distributedtransact"></i> + <div class="name">分布式事务</div> + <div class="fontclass">.icon-distributedtransact</div> + </li> + + <li> + <i class="icon iconfont icon-biaoge"></i> + <div class="name">表格3</div> + <div class="fontclass">.icon-biaoge</div> + </li> + + <li> + <i class="icon iconfont icon-biaogexianshi"></i> + <div class="name">表格显示</div> + <div class="fontclass">.icon-biaogexianshi</div> + </li> + + </ul> + + <h2 id="font-class-">font-class引用</h2> + <hr> + + <p>font-class是unicode使用方式的一种变种,主要是解决unicode书写不直观,语意不明确的问题。</p> + <p>与unicode使用方式相比,具有如下特点:</p> + <ul> + <li>兼容性良好,支持ie8+,及所有现代浏览器。</li> + <li>相比于unicode语意明确,书写更直观。可以很容易分辨这个icon是什么。</li> + <li>因为使用class来定义图标,所以当要替换图标时,只需要修改class里面的unicode引用。</li> + <li>不过因为本质上还是使用的字体,所以多色图标还是不支持的。</li> + </ul> + <p>使用步骤如下:</p> + <h3 id="-fontclass-">第一步:引入项目下面生成的fontclass代码:</h3> + + + <pre><code class="lang-js hljs javascript"><span class="hljs-comment">&lt;link rel="stylesheet" type="text/css" href="./iconfont.css"&gt;</span></code></pre> + <h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3> + <pre><code class="lang-css hljs">&lt;<span class="hljs-selector-tag">i</span> <span class="hljs-selector-tag">class</span>="<span class="hljs-selector-tag">iconfont</span> <span class="hljs-selector-tag">icon-xxx</span>"&gt;&lt;/<span class="hljs-selector-tag">i</span>&gt;</code></pre> + <blockquote> + <p>"iconfont"是你项目下的font-family。可以通过编辑项目查看,默认是"iconfont"。</p> + </blockquote> + </div> +</body> +</html> diff --git a/cyclone-web/vendor/fonts-boot/demo_symbol.html b/cyclone-web/vendor/fonts-boot/demo_symbol.html new file mode 100644 index 0000000000000000000000000000000000000000..571c5b5a6588f0cfc51cbcb6d4dd2540e5e451a0 --- /dev/null +++ b/cyclone-web/vendor/fonts-boot/demo_symbol.html @@ -0,0 +1,191 @@ + +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"/> + <title>IconFont</title> + <link rel="stylesheet" href="demo.css"> + <script src="iconfont.js"></script> + + <style type="text/css"> + .icon { + /* 通过设置 font-size 来改变图标大小 */ + width: 1em; height: 1em; + /* 图标和文字相邻时,垂直对齐 */ + vertical-align: -0.15em; + /* 通过设置 color 来改变 SVG 的颜色/fill */ + fill: currentColor; + /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示 + normalize.css 中也包含这行 */ + overflow: hidden; + } + + </style> +</head> +<body> + <div class="main markdown"> + <h1>IconFont 图标</h1> + <ul class="icon_lists clear"> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-150chanpinbaozhuangjitai"></use> + </svg> + <div class="name">150-产品包装机台</div> + <div class="fontclass">#icon-150chanpinbaozhuangjitai</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-dashbord"></use> + </svg> + <div class="name">dashbord</div> + <div class="fontclass">#icon-dashbord</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-anquanshenji"></use> + </svg> + <div class="name">安全审计</div> + <div class="fontclass">#icon-anquanshenji</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-yidongxuanze"></use> + </svg> + <div class="name">移动选择</div> + <div class="fontclass">#icon-yidongxuanze</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-heimingdan"></use> + </svg> + <div class="name">黑名单</div> + <div class="fontclass">#icon-heimingdan</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-xitongicon_yingjianguanli"></use> + </svg> + <div class="name">系统icon_硬件管理</div> + <div class="fontclass">#icon-xitongicon_yingjianguanli</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-baimingdanguanli"></use> + </svg> + <div class="name">白名单管理</div> + <div class="fontclass">#icon-baimingdanguanli</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-fangwenkongzhi"></use> + </svg> + <div class="name">访问控制</div> + <div class="fontclass">#icon-fangwenkongzhi</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-s-clonekelong"></use> + </svg> + <div class="name">s-clone 克隆</div> + <div class="fontclass">#icon-s-clonekelong</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-xitongshezhi"></use> + </svg> + <div class="name">系统设置</div> + <div class="fontclass">#icon-xitongshezhi</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-report"></use> + </svg> + <div class="name">报表管理</div> + <div class="fontclass">#icon-report</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-shebeiguanli"></use> + </svg> + <div class="name">设备管理</div> + <div class="fontclass">#icon-shebeiguanli</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-nav_ic_yingjianguanli"></use> + </svg> + <div class="name">nav_ic_硬件管理</div> + <div class="fontclass">#icon-nav_ic_yingjianguanli</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-distributedtransact"></use> + </svg> + <div class="name">分布式事务</div> + <div class="fontclass">#icon-distributedtransact</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-biaoge"></use> + </svg> + <div class="name">表格3</div> + <div class="fontclass">#icon-biaoge</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-biaogexianshi"></use> + </svg> + <div class="name">表格显示</div> + <div class="fontclass">#icon-biaogexianshi</div> + </li> + + </ul> + + + <h2 id="symbol-">symbol引用</h2> + <hr> + + <p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a> + 这种用法其实是做了一个svg的集合,与另外两种相比具有如下特点:</p> + <ul> + <li>支持多色图标了,不再受单色限制。</li> + <li>通过一些技巧,支持像字体那样,通过<code>font-size</code>,<code>color</code>来调整样式。</li> + <li>兼容性较差,支持 ie9+,及现代浏览器。</li> + <li>浏览器渲染svg的性能一般,还不如png。</li> + </ul> + <p>使用步骤如下:</p> + <h3 id="-symbol-">第一步:引入项目下面生成的symbol代码:</h3> + <pre><code class="lang-js hljs javascript"><span class="hljs-comment">&lt;script src="./iconfont.js"&gt;&lt;/script&gt;</span></code></pre> + <h3 id="-css-">第二步:加入通用css代码(引入一次就行):</h3> + <pre><code class="lang-js hljs javascript">&lt;style type=<span class="hljs-string">"text/css"</span>&gt; +.icon { + width: <span class="hljs-number">1</span>em; height: <span class="hljs-number">1</span>em; + vertical-align: <span class="hljs-number">-0.15</span>em; + fill: currentColor; + overflow: hidden; +} +&lt;<span class="hljs-regexp">/style&gt;</span></code></pre> + <h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3> + <pre><code class="lang-js hljs javascript">&lt;svg <span class="hljs-class"><span class="hljs-keyword">class</span></span>=<span class="hljs-string">"icon"</span> aria-hidden=<span class="hljs-string">"true"</span>&gt;<span class="xml"><span class="hljs-tag"> + &lt;<span class="hljs-name">use</span> <span class="hljs-attr">xlink:href</span>=<span class="hljs-string">"#icon-xxx"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">use</span>&gt;</span> +</span>&lt;<span class="hljs-regexp">/svg&gt; + </span></code></pre> + </div> +</body> +</html> diff --git a/cyclone-web/vendor/fonts-boot/demo_unicode.html b/cyclone-web/vendor/fonts-boot/demo_unicode.html new file mode 100644 index 0000000000000000000000000000000000000000..4e8e01f0a5e7759df8faff64e3de34c7fb12ad6c --- /dev/null +++ b/cyclone-web/vendor/fonts-boot/demo_unicode.html @@ -0,0 +1,174 @@ + +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"/> + <title>IconFont</title> + <link rel="stylesheet" href="demo.css"> + + <style type="text/css"> + + @font-face {font-family: "iconfont"; + src: url('iconfont.eot'); /* IE9*/ + src: url('iconfont.eot#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('iconfont.woff') format('woff'), /* chrome, firefox */ + url('iconfont.ttf') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ + url('iconfont.svg#iconfont') format('svg'); /* iOS 4.1- */ + } + + .iconfont { + font-family:"iconfont" !important; + font-size:16px; + font-style:normal; + -webkit-font-smoothing: antialiased; + -webkit-text-stroke-width: 0.2px; + -moz-osx-font-smoothing: grayscale; + } + + </style> +</head> +<body> + <div class="main markdown"> + <h1>IconFont 图标</h1> + <ul class="icon_lists clear"> + + <li> + <i class="icon iconfont">&#xe7ea;</i> + <div class="name">150-产品包装机台</div> + <div class="code">&amp;#xe7ea;</div> + </li> + + <li> + <i class="icon iconfont">&#xe794;</i> + <div class="name">dashbord</div> + <div class="code">&amp;#xe794;</div> + </li> + + <li> + <i class="icon iconfont">&#xe961;</i> + <div class="name">安全审计</div> + <div class="code">&amp;#xe961;</div> + </li> + + <li> + <i class="icon iconfont">&#xe67f;</i> + <div class="name">移动选择</div> + <div class="code">&amp;#xe67f;</div> + </li> + + <li> + <i class="icon iconfont">&#xe615;</i> + <div class="name">黑名单</div> + <div class="code">&amp;#xe615;</div> + </li> + + <li> + <i class="icon iconfont">&#xe658;</i> + <div class="name">系统icon_硬件管理</div> + <div class="code">&amp;#xe658;</div> + </li> + + <li> + <i class="icon iconfont">&#xe612;</i> + <div class="name">白名单管理</div> + <div class="code">&amp;#xe612;</div> + </li> + + <li> + <i class="icon iconfont">&#xe738;</i> + <div class="name">访问控制</div> + <div class="code">&amp;#xe738;</div> + </li> + + <li> + <i class="icon iconfont">&#xe668;</i> + <div class="name">s-clone 克隆</div> + <div class="code">&amp;#xe668;</div> + </li> + + <li> + <i class="icon iconfont">&#xe616;</i> + <div class="name">系统设置</div> + <div class="code">&amp;#xe616;</div> + </li> + + <li> + <i class="icon iconfont">&#xe611;</i> + <div class="name">报表管理</div> + <div class="code">&amp;#xe611;</div> + </li> + + <li> + <i class="icon iconfont">&#xe61b;</i> + <div class="name">设备管理</div> + <div class="code">&amp;#xe61b;</div> + </li> + + <li> + <i class="icon iconfont">&#xe61c;</i> + <div class="name">nav_ic_硬件管理</div> + <div class="code">&amp;#xe61c;</div> + </li> + + <li> + <i class="icon iconfont">&#xe667;</i> + <div class="name">分布式事务</div> + <div class="code">&amp;#xe667;</div> + </li> + + <li> + <i class="icon iconfont">&#xe6cc;</i> + <div class="name">表格3</div> + <div class="code">&amp;#xe6cc;</div> + </li> + + <li> + <i class="icon iconfont">&#xe61a;</i> + <div class="name">表格显示</div> + <div class="code">&amp;#xe61a;</div> + </li> + + </ul> + <h2 id="unicode-">unicode引用</h2> + <hr> + + <p>unicode是字体在网页端最原始的应用方式,特点是:</p> + <ul> + <li>兼容性最好,支持ie6+,及所有现代浏览器。</li> + <li>支持按字体的方式去动态调整图标大小,颜色等等。</li> + <li>但是因为是字体,所以不支持多色。只能使用平台里单色的图标,就算项目里有多色图标也会自动去色。</li> + </ul> + <blockquote> + <p>注意:新版iconfont支持多色图标,这些多色图标在unicode模式下将不能使用,如果有需求建议使用symbol的引用方式</p> + </blockquote> + <p>unicode使用步骤如下:</p> + <h3 id="-font-face">第一步:拷贝项目下面生成的font-face</h3> + <pre><code class="lang-js hljs javascript">@font-face { + font-family: <span class="hljs-string">'iconfont'</span>; + src: url(<span class="hljs-string">'iconfont.eot'</span>); + src: url(<span class="hljs-string">'iconfont.eot?#iefix'</span>) format(<span class="hljs-string">'embedded-opentype'</span>), + url(<span class="hljs-string">'iconfont.woff'</span>) format(<span class="hljs-string">'woff'</span>), + url(<span class="hljs-string">'iconfont.ttf'</span>) format(<span class="hljs-string">'truetype'</span>), + url(<span class="hljs-string">'iconfont.svg#iconfont'</span>) format(<span class="hljs-string">'svg'</span>); +} +</code></pre> + <h3 id="-iconfont-">第二步:定义使用iconfont的样式</h3> + <pre><code class="lang-js hljs javascript">.iconfont{ + font-family:<span class="hljs-string">"iconfont"</span> !important; + font-size:<span class="hljs-number">16</span>px;font-style:normal; + -webkit-font-smoothing: antialiased; + -webkit-text-stroke-width: <span class="hljs-number">0.2</span>px; + -moz-osx-font-smoothing: grayscale; +} +</code></pre> + <h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3> + <pre><code class="lang-js hljs javascript">&lt;i <span class="hljs-class"><span class="hljs-keyword">class</span></span>=<span class="hljs-string">"iconfont"</span>&gt;&amp;#x33;<span class="xml"><span class="hljs-tag">&lt;/<span class="hljs-name">i</span>&gt;</span></span></code></pre> + + <blockquote> + <p>"iconfont"是你项目下的font-family。可以通过编辑项目查看,默认是"iconfont"。</p> + </blockquote> + </div> + + +</body> +</html> diff --git a/cyclone-web/vendor/fonts-boot/iconfont.css b/cyclone-web/vendor/fonts-boot/iconfont.css new file mode 100644 index 0000000000000000000000000000000000000000..b817dba91cac43b7bfc9ef16bd415f0dd4e25d1c --- /dev/null +++ b/cyclone-web/vendor/fonts-boot/iconfont.css @@ -0,0 +1,49 @@ + +@font-face {font-family: "iconfont"; + src: url('iconfont.eot?t=1539584240846'); /* IE9*/ + src: url('iconfont.eot?t=1539584240846#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAA+4AAsAAAAAGDAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAARAAAAFY8jktTY21hcAAAAYAAAADdAAACksVI87FnbHlmAAACYAAACooAAA+4/N+/JGhlYWQAAAzsAAAAMQAAADYS+efWaGhlYQAADSAAAAAeAAAAJAflA5dobXR4AAANQAAAABgAAABERAb//2xvY2EAAA1YAAAAJAAAACQesiKibWF4cAAADXwAAAAfAAAAIAEkAO9uYW1lAAANnAAAAUUAAAJtPlT+fXBvc3QAAA7kAAAA0wAAATa1Hmy8eJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2BkYWCcwMDKwMHUyXSGgYGhH0IzvmYwYuRgYGBiYGVmwAoC0lxTGByeCb5MZG7438AQw9zA0A4UZgTJAQDmOAxfeJzlkj1uAkEMhb/JEkIICT8SKNpsgVLnAByFlgpuwRVScByq1BQ5xRvBJcibdQqEyAli6xvJHtlj+Q1wD1Tmw3QgfZEotnc2tfmKfpvv8On4lZEzPU00U6OlNtrqkBd5l0/H1fkMGmuq2jfr65ubltyxpmFuf79weOLB0/X93oBnurzw6BmG9LhzlWdO3T96/icbtOf3bzQq+w+8PzQJvEk0DYrimgVFWdVBW/sWlK5qAu8eLQOrgNaB9UCbwMqgbVB+kQ6B1SIvAutG3gVWkHwKyi87rgKqH+PiTo0AAAB4nKUXbYwb1fHNe/vlXdvrPa937buzfeu115fLnXM533pDuC9CAkEJJJcPlAPUFAK/EqgSoORIc+dETUgQEEC0alFRgUQl/fhDCqpQ1RKkUlEgbSVQW4JahUIVBLQSDYSqnPc6z76EI23aqrX9ZufNx3v7ZubNjIlMyOwke46+RTpJFymSbtJL+skoIeCVS54OBR0kHeKQMkxbtKoDQanmG4MlUS7ZpUAs41MMUjIrGSKIRpAybWtgFGqBH7BnmBReKwq7BDbN6LdEWYXDokgZHFXD5bB7XXjv2vCe7XDXh/DldeEBuPemm14Md8IB+F54x0FJUFg9AjfTcYEeAOim3QCLaURuvKwJ+wW4h2k0kO6YbN/1253FySO7MpOP5B8shaunqLU7vHk3TS88oogUFgvakTzBD8MzPs3+yr5AdNJBcng2wymDHRiOX005hh3Ipm+4vpNyjQiUqym2N3z7hjA7vAiGd8Lw4qEXHg3ffhS6YcGdd8KnEL02HB7uDbs//RR+s2jIZyw8iuhrYIYfvHkb4fass+OsTtqJT64k68lmspXsJmQBVKBsjEDg5MA2TKng+YZjOAOWKYmFsldGrh+MwCjYOchDKg6yJMeBpcwcHRihw+gOrxyHpFPwBmvVphpzOX4pcDyYR08WFgFOBvIQ1HCODoTHw1MdRYBiB63js62zrVGHrnhbGwx0louFjqXUzm1301Zhey5Nl3YUinH3WGHYTw+OFCzncq/7ehbWUToOHP7yOEc5ODaPuj4WqUSS7ap1faQ9Gdmu4l6MtPYMmwow1iC4cd1MZq1x/3ey0t9lp52KIr3hr7OybXIMDn43E/gdmdqSzFE51pHPluE2VMDfLGk9661H2Kf2qe1J1bpONTPqdpUIs7Oz9wvAbm/afC3Zhh4eRBsUJDMPbhxM61K0pskjcwT8khvUBr0CD+osoIA1UEPhKkIviU6QMehbsimEtWGwuUCZyT4qSXKq3FrWClK1oIahjlSBKPsilqFMvKvpuvb+JiWRitRFqbGco5aC6Bz/dFTXfyFEFYhG9ikJW5lIWIlNipVQvAnd1gFRAyWjiiSJe1AT7tBQzrCUTYDsCdnW5T1iTO5sqtSlqIzrfBXlIpu49klRBABUaL1JIqG919y+sWnifT47vYkvtS+CQozi+laC3w0J43WaNdhuIpAFpI8sJVeQdWg/y15cdqt2zUeTYCxizCKsYvjWAqTgEymmjLNUreraBTRyDji7Aiwoy2XZlu3ADlhLr6lB/6DIMQa6ITx59+STIlw99sCx6Fj8hYeTHRN3Mja1efM0zSgpizFga/atwd/kE4w9Mb6xsHGds27cGd/ofGXz1Jwgm6IEgEKl2hSaXFsv97/99Ud+lfYcZdf1KEanN/v9wPCwY6sOfuPgKuHw5OTh8ORGZ+O6wvh4YXyDA6Moc25BPD2ZbQiESSSGUZQjBbQB88qOJDPDsp1aUDYl18E7Oxg4VkquplxMFK5AjjG5sVNmx0Bl76lwtSzO/FDT2GrtuR07nt2+HeowLQFI4Z7woAagXSVKoAJVAdQrd+zYMWf/Ou5bJxqxSRZz8ApyFe49z3BBy/5N49pN2yYHqv+Vb6oD9mJ6Cs3FT9qEdx9m7PDdTVjoPbS6b9JGc6NP2JO7kHhRn0iKDPXzi2yeXnZuEYRnKvetqtwFf0FftEhr93jzfdFUafkCzyvyoBN4So5htenHeFtOSMktSCkcplV18ASYFlM8SQ56roMMo0WG+WYwJRnvcjUH4mAtQI6L/JPtWfeUbhg6PO4M9IV1Vk/m4252pp513SzsFyiMbXuIsYe2NeGGZDI8k70ku35ruDeZhFhnzVm/te5mjZyRvuwpOH48nk8C4arhWNbVC6Cf00TYyC5JQ0w36Nb1zmA6PMOx5tlm97BZvEsMK00S/dnbrDUGnHcLz+B+81v28Zh+i+G7fpWPFOylu8MXaisBVtZqKyldeTDcC1PN0dgLo01S7Xn80KkGo43G5efkEMLusbHR48832HRrOobT0WY9Oo7vNEbaSIUMkAfJCfIG+SPanFvZxhf4zMa+y4sSGpSXqPM82cCZI6eqZaxTrYiTXCwxFaxVzRBELaSj2ghcik4JeOrlmbFq2S1/1QKsRTnAvMrdWh3gdJNXt4XcpzyZYoshlQeq6Fkf5Ud49saFcckyMmQJ6+MicNH7vCzGweKr8RCwm0E/gMuV51m4zAOJp3O4LnyHjdegvzjzllNZkIfE2YTVadIzZgZqUOyc+WknL1CdkJ565zL4TpumeKZZUrQ2Rb5GlUWBQZ/L1DgFSQKqq9TtAyZgI7NeVoyoUkomi0rUUOS152SpGmcXyo7LbQDLQYGlvSBQ1rsU0cuZLKv5IK/KCr2Cyk0WUIo8mS6jENPyS7qisQ2VIYChSmUYYLjSWSotKZV+QG84lXur2N9XaLySX3CJlaCy2QHQnjyW/7ijVOxsPIMH2jQyMhGNdAJ0RKJsoZKOqqpWqIAeY94Cj8Z1qBSiETWaVvoYRJV2gExEA9b7mWCcoiCLfSbYK1zisXS8b4iJ2ZxusqE+3WYehgFmBkWSS4Kt9w4zIZfTk8JQr55mJRpVbFuJTVN8/9Yphr7PD7CkxK8/xZj8OfszW4p3ZDWPRHS7wasrD0PbGUHfl7Aej2IfZNWCjmb9zrUqNCYJ2WUV3FunUoqVBz3fK2BIpGSeQkyLvTbzqG60ZQ03y7AtAX3m12OiLo590VRtsX6doT8e6dAzXiFrtov33w62LgoCY/s3SKKhispEH6YPCYw4/ShuGPGZDzIegJE1/q5Gbj2ZFGIqPBWeUBO64S51Mc3s12LYdTBBEMMrjyMUBJDF+w1dTZG5PvAlzOsMcW0uH3QQksR8IKccH3AY2HMyLCOpubGEPbi6odC/8fHyquaH1WcwXa4+fTo8cfZs45UzH7H0qo/xS87lUvY8/T0xSIaUmvWbwNyt1fgdQVsGBvC+MA8O8ArGb3jg2CLuFuBgvlq0wi6rqB6g0JOn7+Z7oLFM1uF1XV7e2ElfjGmNihbL05/lw29v2fK1LVvo06Ztm+Gb4Z+6egB6uiAByXj8kXCnGo+rICxfvmLLli2kWU+fYVNsNSljlh/GroKU8K1KNa8coFNrPGWg32zZw/tt2UgSpRzlrmc8OfBuFjAYRyBHZbz1wBMMb27pJ121ZPhhLGK+2nOj67Bi6aZyWc2f6L2l0BXr6b3FhUTMXjG+or192Te7BwfX+H54tGtxwg6GKxE9thBebxGfzbY/ll/W+WpO9bpv9IrMcW/sOdEV72kt81j3NVVYfM14P90B/hqu0HjJG1niyH3DndTKhB/MUdH8kaYPHqI/Rg/nySL857QGO/4vkWlyCH2RMqWFUPCGodWnY7/5b+f/q3zge5/jX2wOG9uNQ22ZTBuCf4VBNtP2AMcvAiDXEoN5Kv+M00MbOYGDs9dyjINPztPgR/8P+1zP+p4gM/1zNifJC6xn/Ic5tx6/EHzO/zklL5izC+YPa/JtsnZRwLapSgP4hM4qakSTG6CoqkJnZS0yn0NnblU0TblVUbXwyPkVwp+cR+m9LRS1w8PzBfhyHEUT/AMZRda5AAB4nGNgZGBgAGKpykCDeH6brwzcLAwgcP1V4AcY/f///0oWduYGIJeDgQkkCgBHfAzXAAAAeJxjYGRgYG7438AQw8L2HwhY2BmAIihAEACh2AaDAAB4nGNhYGBgQcH//7NgiOHBbAwMAGyDAkkAAAAAAHIAqAFiAgAChALAAzgDpgPwBToFrAXeBiwGoAdaB9x4nGNgZGBgEGR4zMDJAAJMQMwFhAwM/8F8BgAhDwIUAHicZY9NTsMwEIVf+gekEqqoYIfkBWIBKP0Rq25YVGr3XXTfpk6bKokjx63UA3AejsAJOALcgDvwSCebNpbH37x5Y08A3OAHHo7fLfeRPVwyO3INF7gXrlN/EG6QX4SbaONVuEX9TdjHM6bCbXRheYPXuGL2hHdhDx18CNdwjU/hOvUv4Qb5W7iJO/wKt9Dx6sI+5l5XuI1HL/bHVi+cXqnlQcWhySKTOb+CmV7vkoWt0uqca1vEJlODoF9JU51pW91T7NdD5yIVWZOqCas6SYzKrdnq0AUb5/JRrxeJHoQm5Vhj/rbGAo5xBYUlDowxQhhkiMro6DtVZvSvsUPCXntWPc3ndFsU1P9zhQEC9M9cU7qy0nk6T4E9XxtSdXQrbsuelDSRXs1JErJCXta2VELqATZlV44RelzRiT8oZ0j/AAlabsgAAAB4nG1P207DMAyNB5RR0l1ASPARSPDA90xOYxJvwxlpBl2/Hk8RLwg/+HJ8fGybmanWmv9tDTO4gEu4ggauYQ430MItWOhgAUtYwRruzOPr20sfUQ4sDtMUjyhhywV57nGILmVvUT4VHSLJlu2JfZIwKjBRG4k/WIJHeRq5KM59ks2JzxKqo6Q9rxz+kiqweNfsm2Sn/ClyNzz3+yS0I/XBVh1dpq0m0yHlYrVyxHX6QfBrw/2fJfeeh5LZHQv5kvVY7EvjGFOgroaRzy+wMT/MR122AA==') format('woff'), + url('iconfont.ttf?t=1539584240846') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ + url('iconfont.svg?t=1539584240846#iconfont') format('svg'); /* iOS 4.1- */ +} + +.iconfont { + font-family:"iconfont" !important; + font-size:16px; + font-style:normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-150chanpinbaozhuangjitai:before { content: "\e7ea"; } + +.icon-dashbord:before { content: "\e794"; } + +.icon-anquanshenji:before { content: "\e961"; } + +.icon-yidongxuanze:before { content: "\e67f"; } + +.icon-heimingdan:before { content: "\e615"; } + +.icon-xitongicon_yingjianguanli:before { content: "\e658"; } + +.icon-baimingdanguanli:before { content: "\e612"; } + +.icon-fangwenkongzhi:before { content: "\e738"; } + +.icon-s-clonekelong:before { content: "\e668"; } + +.icon-xitongshezhi:before { content: "\e616"; } + +.icon-report:before { content: "\e611"; } + +.icon-shebeiguanli:before { content: "\e61b"; } + +.icon-nav_ic_yingjianguanli:before { content: "\e61c"; } + +.icon-distributedtransact:before { content: "\e667"; } + +.icon-biaoge:before { content: "\e6cc"; } + +.icon-biaogexianshi:before { content: "\e61a"; } + diff --git a/cyclone-web/vendor/fonts-boot/iconfont.eot b/cyclone-web/vendor/fonts-boot/iconfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/cyclone-web/vendor/fonts-boot/iconfont.js b/cyclone-web/vendor/fonts-boot/iconfont.js new file mode 100644 index 0000000000000000000000000000000000000000..ea7c9deaa1ff91dce85101131ce7b04281c4f63f --- /dev/null +++ b/cyclone-web/vendor/fonts-boot/iconfont.js @@ -0,0 +1 @@ +(function(window){var svgSprite='<svg><symbol id="icon-150chanpinbaozhuangjitai" viewBox="0 0 1024 1024"><path d="M947.511955 218.944548c-1.866511-2.765997-4.63353-4.951779-8.05956-6.040576L513.136893 77.434603c-3.027963-0.961908-6.28003-0.960885-9.304923 0.002047L381.125277 116.500341c-2.526543 0.162706-4.953825 0.945535-7.074116 2.252297l-127.159098 40.48097c-1.840928 0.240477-3.613294 0.804319-5.233188 1.665942L86.478584 210.299657c-3.430122 1.091868-6.198166 3.282766-8.063653 6.053879-3.063779 2.880607-4.837168 6.916527-4.837168 11.177574l0 566.623062c0 6.670933 4.307096 12.576433 10.658757 14.614859l419.249573 134.554532c2.669806 2.084475 5.988388 3.27151 9.447163 3.27151 1.537006 0 3.100618-0.233314 4.643764-0.722454l424.072415-134.482901c6.376221-2.022053 10.709923-7.941879 10.709923-14.631232L952.359356 230.137471C952.36038 225.870284 950.584943 221.827201 947.511955 218.944548zM508.492106 108.170628l380.577808 120.93535-82.174558 25.807782-374.110513-122.642225L508.492106 108.170628zM512.531096 347.362312 136.365784 226.635717l112.879883-35.935444 375.116423 121.5391L512.531096 347.362312zM382.78815 148.188041l373.775892 122.532731-81.628112 25.63689L299.482839 174.708044 382.78815 148.188041zM693.403536 322.734402l97.544617-30.635741 0 143.737682-97.544617 37.649482L693.403536 322.734402zM495.677243 908.577201 104.276948 782.960225l0-534.38073L495.677243 374.195447 495.677243 908.577201zM921.661194 785.52463 526.376429 910.878616 526.376429 375.191124l136.328945-42.816155 0 163.488515c0 5.060249 2.494821 9.795087 6.667863 12.658298 2.592035 1.778506 5.625114 2.691295 8.682753 2.691295 1.864464 0 3.738138-0.339738 5.525853-1.029446l128.243803-49.498344c5.918803-2.284019 9.822716-7.974625 9.822716-14.320147L821.648362 282.45707l100.012831-31.410384L921.661194 785.52463z" ></path></symbol><symbol id="icon-dashbord" viewBox="0 0 1024 1024"><path d="M897.828571 389.485714v-268.8h-285.257142l-91.428572-85.942857-482.742857 451.657143 12.8 12.8 12.8 12.8 9.142857 9.142857 12.8 12.8 12.8 12.8 47.542857-43.885714V974.628571h316.342857v-250.514285h120.685715V974.628571h316.342857v-469.942857l49.371428 47.542857 12.8-12.8 12.8-12.8 9.142858-9.142857 12.8-12.8 12.8-12.8-111.542858-102.4z m-82.285714 155.428572c0 1.828571 0 1.828571 0 0v343.771428h-153.6v-250.514285h-285.257143v250.514285h-153.6v-466.285714l296.228572-276.114286 296.228571 276.114286v122.514286z m-117.028571-341.942857h117.028571v109.714285l-117.028571-109.714285z" ></path></symbol><symbol id="icon-anquanshenji" viewBox="0 0 1024 1024"><path d="M416 896H128c-35.3 0-64-28.7-64-64V64c0-35.3 28.7-64 64-64h640c35.3 0 64 28.7 64 64v320c0 17.7-14.3 32-32 32s-32-14.3-32-32V64H128v768h288c17.7 0 32 14.3 32 32s-14.3 32-32 32z" ></path><path d="M736 1024c-18.5 0-41-6.8-66.9-20.1-23.8-12.2-47.9-28.8-69.9-47.9-32.6-28.4-87.2-86.3-87.2-156V583.9l23.1-6.7c35.3-10.2 136.3-45.9 178.2-87.9l23.4-23.4 22.6 24.1c40 42.7 141.3 77.3 177 87l23.6 6.4v216.5c0 70.6-54.5 128.5-87 156.7-21.9 19-46.1 35.5-70 47.6-17.7 9-43.8 19.8-66.9 19.8zM576 631.4V800c0 32.4 23.8 71.6 65.2 107.7 39.2 34.1 80.2 52.3 94.8 52.3 14.3 0 54.3-16.4 95-51.7 41.3-35.8 65-75.3 65-108.3V631.8c-14.3-4.6-33.9-11.3-55.3-20-44.1-17.9-79.4-37-105.2-57.3-50.1 37.4-122.7 64.6-159.5 76.9zM608 256H224c-17.7 0-32-14.3-32-32s14.3-32 32-32h384c17.7 0 32 14.3 32 32s-14.3 32-32 32zM416 512H224c-17.7 0-32-14.3-32-32s14.3-32 32-32h192c17.7 0 32 14.3 32 32s-14.3 32-32 32zM608 384H224c-17.7 0-32-14.3-32-32s14.3-32 32-32h384c17.7 0 32 14.3 32 32s-14.3 32-32 32z" ></path><path d="M705.1 850.6c-8.2 0-16.4-3.1-22.6-9.4l-45.3-45.3c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l22.6 22.6 90.5-90.5c12.5-12.5 32.8-12.5 45.3 0s12.5 32.8 0 45.3L727.7 841.2c-6.3 6.2-14.5 9.4-22.6 9.4z" ></path></symbol><symbol id="icon-yidongxuanze" viewBox="0 0 1024 1024"><path d="M1023.688 524.247c0.271-7.44-2.325-14.925-7.957-20.557L882.806 371.123c-10.829-10.793-28.473-10.793-39.342 0-10.834 10.829-10.834 28.432 0 39.225l88.1 87.91H700.498c-14.889 0-26.942 12.011-26.942 26.854s12.053 26.865 26.942 26.865h234.885l-88.77 88.535a26.813 26.813 0 0 0 0 38.042 26.931 26.931 0 0 0 38.082 0l128.789-128.471c3.389-3.385 5.273-7.522 6.502-11.853 2.283-3.978 3.937-8.269 3.937-13.113-0.04-0.358-0.2-0.593-0.24-0.87z m-700.18-26.86H88.616l88.77-88.535a26.767 26.767 0 0 0 0-38.005 26.86 26.86 0 0 0-38.082 0L10.516 499.317c-3.389 3.39-5.278 7.527-6.502 11.859-2.283 3.937-3.937 8.228-3.937 13.071 0 0.317 0.159 0.553 0.2 0.83a27.576 27.576 0 0 0 7.956 20.597L141.153 678.2c10.834 10.834 28.478 10.834 39.347 0a27.74 27.74 0 0 0 0-39.224l-88.104-87.91H323.46c14.894 0 26.942-12.007 26.942-26.855s-12.012-26.823-26.896-26.823zM536.498 23.87c-3.072-3.072-6.815-5.002-10.675-6.266-4.055-2.402-8.468-4.132-13.512-4.132-0.512 0-0.824 0.235-1.336 0.312-7.526-0.394-15.206 2.089-20.951 7.839L357.018 154.588c-10.793 10.788-10.793 28.508 0 39.301a27.812 27.812 0 0 0 39.342 0l88.97-88.97v231.936a26.91 26.91 0 0 0 26.982 26.941 26.931 26.931 0 0 0 26.978-26.941v-234.02l87.91 87.905c10.516 10.553 27.53 10.517 38.088-0.04a26.91 26.91 0 0 0 0-38.124L536.499 23.859zM627.2 833.22l-88.77 88.775V687.14a26.962 26.962 0 0 0-26.983-26.931 26.931 26.931 0 0 0-26.977 26.93v231.118l-88.105-88.105c-10.829-10.875-28.473-10.875-39.342-0.041-10.834 10.829-10.834 28.518 0 39.306l132.92 132.961c5.714 5.673 13.194 8.233 20.598 7.957 0.317 0 0.553 0.194 0.87 0.194 4.88 0 9.175-1.69 13.153-3.978 4.332-1.178 8.505-3.072 11.93-6.497l128.753-128.748a26.91 26.91 0 0 0 0-38.123 26.85 26.85 0 0 0-38.047 0.036z" ></path></symbol><symbol id="icon-heimingdan" viewBox="0 0 1024 1024"><path d="M734.409093 384.164264c4.846853 0.204797 9.659572 1.501842 14.43816 2.047966l0.068265-0.341328c-4.334861-0.37546-8.567324-1.877302-12.902185-1.877302l-1.60424 0.170664z m-1.60424-0.170664l1.60424 0.068266 1.60424-0.068266c4.334861 0 8.533191 0.511991 12.902185 0.648523 10.922485-30.207497 17.475975-62.531224 17.475975-96.663989a288.012266 288.012266 0 0 0-575.9904 0c0 105.470242 57.41131 196.80952 142.094699 246.984683A479.974934 479.974934 0 0 0 0.008533 959.984h63.998934a416.180797 416.180797 0 0 1 353.205846-379.010216 352.932784 352.932784 0 0 1 45.635506-70.518292c-116.153797-8.123598-208.448793-104.241463-208.448792-222.477358a224.252262 224.252262 0 0 1 223.910934-223.979201c123.492342 0 224.081599 100.486859 224.081599 224.013333a221.453376 221.453376 0 0 1-25.087582 100.794054c2.423426-0.409593 4.983384-0.341328 7.372677-0.682655 14.267496-2.082099 28.808053-3.413276 43.587541-3.754604 1.535974 0 3.003683-0.37546 4.539657-0.375461z m-4.539657 1.126381c2.047966-0.204797 4.027666-0.955717 6.143897-0.955717l-1.60424-0.170664c-1.535974 0-3.003683 1.126381-4.539657 1.126381z m7.748137 62.872552a288.012266 288.012266 0 1 0 0 575.990401 288.012266 288.012266 0 0 0 0-575.990401z m39.491609 298.42276l85.263645-85.263646-33.279445-33.279445-85.263646 85.263646-81.747971-81.747971-33.245312 33.279445 81.747971 81.747971-81.099449 81.065316 33.279446 33.279445 81.065315-81.065316 84.615123 84.580991 33.279446-33.279446-84.615123-84.58099zM736.013333 511.991467a224.252262 224.252262 0 0 1 223.9792 224.013333 224.252262 224.252262 0 0 1-224.013333 223.9792A224.252262 224.252262 0 0 1 512 735.970667 224.252262 224.252262 0 0 1 736.013333 511.991467z" ></path></symbol><symbol id="icon-xitongicon_yingjianguanli" viewBox="0 0 1024 1024"><path d="M1024 512l-178.062222-382.862222a11.377778 11.377778 0 0 0-10.24-6.826667H188.302222a11.377778 11.377778 0 0 0-10.24 6.826667L0 512v375.466667a11.377778 11.377778 0 0 0 11.377778 11.377777h1001.244444a11.377778 11.377778 0 0 0 11.377778-11.377777V512z m-77.368889 302.08a11.377778 11.377778 0 0 1-11.377778 11.377778H89.884444a11.377778 11.377778 0 0 1-11.377777-11.377778V556.373333a11.377778 11.377778 0 0 1 11.377777-11.377777h844.231112a11.377778 11.377778 0 0 1 11.377777 11.377777z" fill="#798599" ></path><path d="M760.035556 626.915556l113.777777 0 0 113.777777-113.777777 0 0-113.777777Z" fill="#798599" ></path><path d="M578.56 626.915556l113.777778 0 0 113.777777-113.777778 0 0-113.777777Z" fill="#798599" ></path></symbol><symbol id="icon-baimingdanguanli" viewBox="0 0 1024 1024"><path d="M736 512c123.52 0 224 100.48 224 224s-100.48 224-224 224S512 859.52 512 736 612.48 512 736 512z m0-64c-159.05792 0-288 128.94208-288 288S576.94208 1024 736 1024 1024 895.05792 1024 736 895.05792 448 736 448z m156.416 245.82656l-44.86656-45.696-142.52544 139.89888-75.58144-74.81344-44.98944 45.50656 120.44288 119.168 187.52-184.064z m-164.16256-309.44256c2.048-0.06656 4.03456-0.32256 6.144-0.32256l-1.59744-0.06144c-1.536 0-3.01056 0.384-4.54656 0.384z m4.54656-0.384l1.60256 0.06656 1.59744-0.06656c4.352 0 8.576 0.512 12.928 0.64 10.94144-30.208 17.46944-62.52544 17.46944-96.64 0-159.05792-128.94208-288-288-288s-288 128.94208-288 288c0 105.472 57.40544 196.80256 142.08 246.97344C144.96768 595.05152 13.16352 763.54048 0 960h64c15.17056-193.152 161.6128-350.28992 353.21344-379.008 12.48256-25.33888 27.71456-49.08544 45.63456-70.52288-116.16256-8.13056-208.44544-104.25856-208.44544-222.464 0-123.52 100.48-224 223.93344-224s224.06656 100.48 224.06656 224a221.4656 221.4656 0 0 1-25.088 100.80256c2.43712-0.384 4.99712-0.32256 7.36256-0.64a348.09856 348.09856 0 0 1 43.58656-3.77344c1.52576-0.01024 3.00032-0.39424 4.53632-0.39424z m1.60256 0.06656c4.864 0.06144 9.66656 0.512 14.464 0.70144l0.06656-0.128C744.576 384.512 740.352 384 736 384l-1.59744 0.06656z" fill="" ></path></symbol><symbol id="icon-fangwenkongzhi" viewBox="0 0 1024 1024"><path d="M473.6 768H448c-38.4 0-64 25.6-64 64H160c-19.2 0-32 12.8-32 32s12.8 32 32 32H576c-44.8-32-76.8-76.8-102.4-128zM448 640H64V192h896v192c25.6 19.2 44.8 38.4 64 64V192c0-38.4-25.6-64-64-64H64c-38.4 0-64 25.6-64 64v448c0 38.4 25.6 64 64 64h390.4c-6.4-19.2-6.4-44.8-6.4-64z" ></path><path d="M768 384c-140.8 0-256 115.2-256 256s115.2 256 256 256 256-115.2 256-256-115.2-256-256-256z m192 256c0 38.4-12.8 76.8-38.4 108.8l-268.8-268.8c38.4-19.2 76.8-32 115.2-32 108.8 0 192 83.2 192 192z m-384 0c0-44.8 12.8-76.8 38.4-108.8l268.8 268.8c-38.4 19.2-70.4 32-115.2 32-108.8 0-192-83.2-192-192z" ></path></symbol><symbol id="icon-s-clonekelong" viewBox="0 0 1024 1024"><path d="M385.559838 258.070654v764.905411h637.41725v-764.905411H385.559838z m318.706065 701.163378c-70.399661 0-127.484065-57.084404-127.484064-127.485088 0-70.403757 57.084404-127.484065 127.484064-127.484065 70.40478 0 127.485088 57.080308 127.485089 127.484065 0 70.400685-57.080308 127.485088-127.485089 127.485088z m191.227121-382.453217H513.039806v-63.742032h382.453218v63.742032z m0-127.484065H513.039806v-63.742032h382.453218v63.742032zM640.523871 194.328621V3.102525H3.10662v764.904387h318.711185v-127.484065c-70.403757 0-127.484065-57.084404-127.484064-127.484064 0-70.403757 57.080308-127.484065 127.484064-127.484065v-63.742032H130.590685v-63.743056h191.22712v-63.742033H130.590685v-63.742032h191.22712v63.742032h318.706066z" ></path></symbol><symbol id="icon-xitongshezhi" viewBox="0 0 1024 1024"><path d="M346.112 723.968H61.952v-604.16h848.896v223.744l53.76 30.72v-225.28c0-46.592-37.888-84.48-84.48-84.48h-798.72C37.376 64.512 1.536 100.352 1.536 144.384v564.736c0 39.936 32.256 72.192 72.192 72.192h272.384v-57.344z" ></path><path d="M346.112 723.968h-245.76c-20.992 0-38.4-17.408-38.4-38.4V167.424c0-26.624 21.504-48.128 48.128-48.128H865.28c25.088 0 45.568 20.48 45.568 45.568V343.04l53.76 30.72V129.024c0-35.328-28.672-64.512-64.512-64.512h-834.56C30.208 64.512 1.024 93.184 1.024 129.024v588.288c0 35.328 28.672 64.512 64.512 64.512h280.064l0.512-57.856zM220.16 869.888V931.84h227.84l-65.024-61.952H220.16z" ></path><path d="M804.864 959.488c-11.264 0-22.528-4.608-29.184-12.288-9.728-10.752-40.448-38.4-65.536-38.4s-55.808 27.648-65.024 37.376c-7.168 7.68-17.92 12.288-29.184 12.288-5.12 0-10.24-1.024-14.848-3.072l-1.024-0.512-76.288-42.496-0.512-0.512c-13.824-9.728-18.944-28.672-12.288-44.032 0 0 7.168-16.384 7.168-30.72 0-44.544-36.352-80.896-80.896-80.896h-3.072c-12.8 0-23.04-11.264-26.624-28.672-0.512-1.536-6.656-34.816-6.656-60.928 0-26.112 6.144-59.392 6.656-60.928 3.584-17.92 13.824-29.184 27.136-28.672h2.56c44.544 0 80.896-36.352 80.896-80.896 0-14.848-7.168-30.72-7.168-30.72-6.656-15.36-1.536-34.304 12.288-44.032l1.024-0.512 80.384-44.032 1.024-0.512c4.608-2.048 9.728-3.072 14.848-3.072 11.264 0 22.016 4.608 29.184 12.288 9.728 9.728 39.424 35.84 64 35.84 24.064 0 54.272-25.6 63.488-35.328 7.168-7.168 17.92-11.776 29.184-11.776 5.12 0 10.24 1.024 14.848 3.072l1.024 0.512 77.824 43.008 0.512 0.512c13.824 9.728 19.456 28.672 12.288 44.032 0 0-7.168 16.384-7.168 30.72 0 44.544 36.352 80.896 80.896 80.896h2.56c12.8-0.512 23.552 11.264 27.136 28.672 0.512 1.536 6.656 34.816 6.656 60.928 0 26.112-6.144 59.392-6.656 60.928-3.584 17.92-13.824 29.184-27.136 28.672h-2.56c-44.544 0-80.896 36.352-80.896 80.896 0 14.848 7.168 30.72 7.168 30.72 6.656 15.36 1.536 34.304-12.288 44.032l-1.024 0.512-78.848 43.52-1.024 0.512c-4.608 2.56-9.728 3.072-14.848 3.072z m-9.728-56.832c0.512 0 1.024 0.512 2.048 0.512L865.28 865.28c-1.536-3.584-9.216-22.528-9.216-41.472 0-57.856 45.568-105.472 102.912-108.032 1.024-4.608 5.12-30.208 5.12-49.152 0-18.944-4.608-44.544-5.12-49.152-57.344-3.072-102.912-50.176-102.912-108.032 0-19.456 7.68-37.888 9.216-41.472L798.208 430.08h-0.512c-1.024 0-2.048 0.512-2.56 0.512-1.024 1.024-10.752 10.752-24.576 20.992-20.48 14.336-39.936 22.016-57.856 22.016s-37.888-7.68-58.368-22.528c-13.824-10.24-23.552-19.968-25.088-20.992-0.512 0-1.536-0.512-2.56-0.512l-69.632 37.888c1.536 4.096 9.216 22.528 9.216 41.472 0 57.856-45.568 105.472-102.912 108.032-1.024 4.608-5.12 30.208-5.12 49.152s4.608 44.544 5.12 49.152c57.344 3.072 102.912 50.176 102.912 108.032 0 19.456-7.68 37.888-9.216 41.984l65.536 36.864c1.024 0 2.048-0.512 2.048-0.512 1.024-1.536 11.264-11.776 25.088-22.016 20.992-15.36 40.96-23.04 59.392-23.04s38.912 8.192 59.904 23.552c15.36 10.24 25.088 20.48 26.112 22.528z m-84.992-129.024c-59.392 0-107.52-48.128-107.52-107.52s48.128-107.52 107.52-107.52 107.52 48.128 107.52 107.52-48.128 107.52-107.52 107.52z m0-173.056c-36.352 0-65.536 29.184-65.536 65.536s29.184 65.536 65.536 65.536 65.536-29.184 65.536-65.536-29.184-65.536-65.536-65.536z" ></path></symbol><symbol id="icon-report" viewBox="0 0 1024 1024"><path d="M979.2 889.6h-870.4c-19.2 0-32-12.8-32-32V102.4c0-19.2-12.8-32-32-32S12.8 83.2 12.8 102.4v787.2c0 32 25.6 64 64 64h896c19.2 0 32-12.8 32-32s-12.8-32-25.6-32zM172.8 640h64c6.4 0 19.2-6.4 25.6-19.2L326.4 512l96 217.6 19.2 19.2c12.8 6.4 32-6.4 38.4-19.2l128-422.4 89.6 307.2c0 12.8 12.8 25.6 32 25.6h160c12.8 19.2 32 32 51.2 32 32 0 64-25.6 64-64s-25.6-64-64-64c-25.6 0-44.8 12.8-51.2 32h-140.8l-115.2-390.4c0-12.8-19.2-25.6-38.4-19.2-6.4 0-12.8 6.4-12.8 6.4s-6.4 6.4-6.4 12.8L441.6 627.2 358.4 435.2c0-6.4-6.4-6.4-6.4-12.8-6.4-6.4-19.2-6.4-32 0-6.4 0-12.8 6.4-12.8 12.8l-89.6 140.8h-44.8c-19.2 0-32 12.8-32 32 0 12.8 12.8 32 32 32z" fill="#212121" ></path></symbol><symbol id="icon-shebeiguanli" viewBox="0 0 1024 1024"><path d="M56.163989 0v1024h911.672022V0z m836.030286 75.641736v231.652816H131.805725V75.641736z m0 307.294552v245.835642H131.805725v-245.835642zM131.805725 948.358264V704.60277h760.38855v243.944598z" ></path><path d="M689.852632 156.767498h75.641735v75.641736h-75.641735zM689.852632 476.732041h75.641735v75.641736h-75.641735zM689.852632 796.507479h75.641735v75.641736h-75.641735z" ></path></symbol><symbol id="icon-nav_ic_yingjianguanli" viewBox="0 0 1024 1024"><path d="M820.837 207.08c-12.096-26.199-38.561-43.109-67.446-43.109H272.659c-28.885 0-55.35 16.91-67.446 43.085L69.403 500.377l-2.274 282.895c0 40.98 33.336 74.316 74.316 74.316h743.161c40.98 0 74.316-33.336 74.316-74.316V510.779L820.837 207.08z m-563.37 28.569c3.905-8.468 12.467-13.926 21.83-13.926h467.457c9.362 0 17.925 5.457 21.83 13.949l68.585 148.117H188.877l68.59-148.14z m640.966 540.098c0 13.291-10.821 24.088-24.088 24.088H151.706c-13.267 0-24.088-10.797-24.088-24.088V516.095l31.432-67.887h707.948l31.435 67.887v259.652z" ></path><path d="M545.157 585.088h99.088v99.088h-99.088V585.09zM693.789 585.088h99.088v99.088h-99.086V585.09z" ></path></symbol><symbol id="icon-distributedtransact" viewBox="0 0 1024 1024"><path d="M758.784 714.752a128 128 0 0 0-104.448 55.296L382.976 613.376a126.976 126.976 0 0 0-16.384-124.928l204.8-204.8a128 128 0 1 0-24.576-24.576l-204.8 204.8a128 128 0 1 0 23.552 180.224l272.384 156.672a128 128 0 1 0 120.832-86.016zM648.192 89.088a93.184 93.184 0 1 1-93.184 93.184 93.184 93.184 0 0 1 93.184-93.184zM265.216 658.432a93.184 93.184 0 1 1 81.92-48.128v2.048a93.184 93.184 0 0 1-81.92 46.08z m493.568 276.48a93.184 93.184 0 1 1 93.184-93.184 93.184 93.184 0 0 1-93.184 93.184z" ></path></symbol><symbol id="icon-biaoge" viewBox="0 0 1024 1024"><path d="M340.5 240.6v85.7c0 11.9-4.1 22-12.5 30.3-8.4 8.4-18.5 12.5-30.3 12.5H154.8c-11.9 0-22-4.1-30.3-12.5-8.4-8.3-12.5-18.4-12.5-30.3v-85.7c0-11.9 4.1-22 12.5-30.3 8.4-8.4 18.5-12.5 30.3-12.5h142.9c11.9 0 22 4.1 30.3 12.5 8.4 8.3 12.5 18.4 12.5 30.3z m0 228.6v85.7c0 11.9-4.1 22-12.5 30.3-8.4 8.4-18.5 12.5-30.3 12.5H154.8c-11.9 0-22-4.1-30.3-12.5-8.4-8.4-12.5-18.5-12.5-30.3v-85.7c0-11.9 4.1-22 12.5-30.3 8.4-8.4 18.5-12.5 30.3-12.5h142.9c11.9 0 22 4.1 30.3 12.5 8.4 8.3 12.5 18.4 12.5 30.3z m0 228.5v85.7c0 11.9-4.1 22-12.5 30.3-8.4 8.4-18.5 12.5-30.3 12.5H154.8c-11.9 0-22-4.1-30.3-12.5-8.4-8.4-12.5-18.5-12.5-30.3v-85.7c0-11.9 4.1-22 12.5-30.3 8.4-8.4 18.5-12.5 30.3-12.5h142.9c11.9 0 22 4.1 30.3 12.5 8.4 8.3 12.5 18.4 12.5 30.3z m285.7-457.1v85.7c0 11.9-4.1 22-12.5 30.3-8.4 8.4-18.5 12.5-30.3 12.5H440.5c-11.9 0-22-4.1-30.3-12.5-8.4-8.4-12.5-18.5-12.5-30.3v-85.7c0-11.9 4.1-22 12.5-30.3 8.4-8.4 18.5-12.5 30.3-12.5h142.8c11.9 0 22 4.1 30.3 12.5 8.6 8.3 12.6 18.4 12.6 30.3z m0 228.6v85.7c0 11.9-4.1 22-12.5 30.3-8.4 8.4-18.5 12.5-30.3 12.5H440.5c-11.9 0-22-4.1-30.3-12.5-8.4-8.4-12.5-18.5-12.5-30.3v-85.7c0-11.9 4.1-22 12.5-30.3 8.4-8.4 18.5-12.5 30.3-12.5h142.8c11.9 0 22 4.1 30.3 12.5 8.6 8.3 12.6 18.4 12.6 30.3z m0 228.5v85.7c0 11.9-4.1 22-12.5 30.3-8.4 8.4-18.5 12.5-30.3 12.5H440.5c-11.9 0-22-4.1-30.3-12.5-8.4-8.4-12.5-18.5-12.5-30.3v-85.7c0-11.9 4.1-22 12.5-30.3 8.4-8.4 18.5-12.5 30.3-12.5h142.8c11.9 0 22 4.1 30.3 12.5 8.6 8.3 12.6 18.4 12.6 30.3zM912 240.6v85.7c0 11.9-4.1 22-12.5 30.3-8.4 8.4-18.5 12.5-30.3 12.5H726.3c-11.9 0-22-4.1-30.3-12.5-8.4-8.4-12.5-18.5-12.5-30.3v-85.7c0-11.9 4.1-22 12.5-30.3 8.4-8.4 18.5-12.5 30.3-12.5h142.9c11.9 0 22 4.1 30.3 12.5 8.4 8.3 12.5 18.4 12.5 30.3z m0 228.6v85.7c0 11.9-4.1 22-12.5 30.3-8.4 8.4-18.5 12.5-30.3 12.5H726.3c-11.9 0-22-4.1-30.3-12.5-8.4-8.4-12.5-18.5-12.5-30.3v-85.7c0-11.9 4.1-22 12.5-30.3 8.4-8.4 18.5-12.5 30.3-12.5h142.9c11.9 0 22 4.1 30.3 12.5 8.4 8.3 12.5 18.4 12.5 30.3z m0 228.5v85.7c0 11.9-4.1 22-12.5 30.3-8.4 8.4-18.5 12.5-30.3 12.5H726.3c-11.9 0-22-4.1-30.3-12.5-8.4-8.4-12.5-18.5-12.5-30.3v-85.7c0-11.9 4.1-22 12.5-30.3 8.4-8.4 18.5-12.5 30.3-12.5h142.9c11.9 0 22 4.1 30.3 12.5 8.4 8.3 12.5 18.4 12.5 30.3z" ></path></symbol><symbol id="icon-biaogexianshi" viewBox="0 0 1030 1024"><path d="M145.864249 131.982222v109.511111a17.635556 17.635556 0 0 1-5.404445 12.8 17.635556 17.635556 0 0 1-12.743111 5.347556H18.148693a17.635556 17.635556 0 0 1-12.8-5.347556A17.635556 17.635556 0 0 1 0.001138 241.493333V131.925333a17.635556 17.635556 0 0 1 5.347555-12.8A17.635556 17.635556 0 0 1 18.205582 113.777778h109.454222a17.635556 17.635556 0 0 1 12.743112 5.347555c3.697778 3.584 5.518222 7.964444 5.518222 12.8z m0 341.333334v109.511111a17.635556 17.635556 0 0 1-5.404445 12.8 17.635556 17.635556 0 0 1-12.743111 5.347555H18.148693a17.635556 17.635556 0 0 1-12.8-5.347555 17.635556 17.635556 0 0 1-5.347555-12.8V473.258667a17.635556 17.635556 0 0 1 5.347555-12.8A17.635556 17.635556 0 0 1 18.205582 455.111111h109.454222a17.635556 17.635556 0 0 1 12.743112 5.347556c3.697778 3.470222 5.518222 7.793778 5.518222 12.8z m0 316.074666v109.568a17.635556 17.635556 0 0 1-5.404445 12.8 17.635556 17.635556 0 0 1-12.743111 5.347556H18.148693a17.635556 17.635556 0 0 1-12.8-5.347556 17.635556 17.635556 0 0 1-5.347555-12.8v-109.568a17.635556 17.635556 0 0 1 5.347555-12.743111 17.635556 17.635556 0 0 1 12.8-5.404444h109.454223a17.635556 17.635556 0 0 1 12.743111 5.404444 17.066667 17.066667 0 0 1 5.518222 12.743111zM1022.408249 131.982222v109.568a17.635556 17.635556 0 0 1-5.404445 12.8 17.635556 17.635556 0 0 1-12.743111 5.347556H237.227804a17.635556 17.635556 0 0 1-12.743111-5.347556 17.635556 17.635556 0 0 1-5.404444-12.8V131.925333a17.635556 17.635556 0 0 1 5.404444-12.8A17.635556 17.635556 0 0 1 237.227804 113.777778h767.032889a17.635556 17.635556 0 0 1 12.743111 5.347555 17.635556 17.635556 0 0 1 5.404445 12.8z m8.419555 341.333334v109.568a17.635556 17.635556 0 0 1-5.347555 12.8 17.635556 17.635556 0 0 1-12.8 5.347555H245.704249a17.635556 17.635556 0 0 1-12.8-5.347555 17.635556 17.635556 0 0 1-5.347556-12.8V473.258667a17.635556 17.635556 0 0 1 5.347556-12.8A17.635556 17.635556 0 0 1 245.761138 455.111111H1012.62336a17.635556 17.635556 0 0 1 12.8 5.347556c3.584 3.470222 5.347556 7.793778 5.347556 12.8z m-8.419555 316.131555v109.568a17.635556 17.635556 0 0 1-5.404445 12.8 17.635556 17.635556 0 0 1-12.743111 5.347556H237.227804a17.635556 17.635556 0 0 1-12.743111-5.347556 17.635556 17.635556 0 0 1-5.404444-12.8v-109.568a17.635556 17.635556 0 0 1 5.404444-12.743111 17.635556 17.635556 0 0 1 12.743111-5.404444h767.032889a17.635556 17.635556 0 0 1 12.743111 5.404444 17.408 17.408 0 0 1 5.404445 12.743111z" ></path></symbol></svg>';var script=function(){var scripts=document.getElementsByTagName("script");return scripts[scripts.length-1]}();var shouldInjectCss=script.getAttribute("data-injectcss");var ready=function(fn){if(document.addEventListener){if(~["complete","loaded","interactive"].indexOf(document.readyState)){setTimeout(fn,0)}else{var loadFn=function(){document.removeEventListener("DOMContentLoaded",loadFn,false);fn()};document.addEventListener("DOMContentLoaded",loadFn,false)}}else if(document.attachEvent){IEContentLoaded(window,fn)}function IEContentLoaded(w,fn){var d=w.document,done=false,init=function(){if(!done){done=true;fn()}};var polling=function(){try{d.documentElement.doScroll("left")}catch(e){setTimeout(polling,50);return}init()};polling();d.onreadystatechange=function(){if(d.readyState=="complete"){d.onreadystatechange=null;init()}}}};var before=function(el,target){target.parentNode.insertBefore(el,target)};var prepend=function(el,target){if(target.firstChild){before(el,target.firstChild)}else{target.appendChild(el)}};function appendSvg(){var div,svg;div=document.createElement("div");div.innerHTML=svgSprite;svgSprite=null;svg=div.getElementsByTagName("svg")[0];if(svg){svg.setAttribute("aria-hidden","true");svg.style.position="absolute";svg.style.width=0;svg.style.height=0;svg.style.overflow="hidden";prepend(svg,document.body)}}if(shouldInjectCss&&!window.__iconfont__svg__cssinject__){window.__iconfont__svg__cssinject__=true;try{document.write("<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>")}catch(e){console&&console.log(e)}}ready(appendSvg)})(window) \ No newline at end of file diff --git a/cyclone-web/vendor/fonts-boot/iconfont.svg b/cyclone-web/vendor/fonts-boot/iconfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..f873d22efbce147b939679a858acf7b2c8fa2705 --- /dev/null +++ b/cyclone-web/vendor/fonts-boot/iconfont.svg @@ -0,0 +1,74 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<!-- +2013-9-30: Created. +--> +<svg> +<metadata> +Created by iconfont +</metadata> +<defs> + +<font id="iconfont" horiz-adv-x="1024" > + <font-face + font-family="iconfont" + font-weight="500" + font-stretch="normal" + units-per-em="1024" + ascent="896" + descent="-128" + /> + <missing-glyph /> + + <glyph glyph-name="150chanpinbaozhuangjitai" unicode="&#59370;" d="M947.511955 593.055452c-1.866511 2.765997-4.63353 4.951779-8.05956 6.040576L513.136893 734.565397c-3.027963 0.961908-6.28003 0.960885-9.304923-0.002047L381.125277 695.499659c-2.526543-0.162706-4.953825-0.945535-7.074116-2.252297l-127.159098-40.48097c-1.840928-0.240477-3.613294-0.804319-5.233188-1.665942L86.478584 601.700343c-3.430122-1.091868-6.198166-3.282766-8.063653-6.053879-3.063779-2.880607-4.837168-6.916527-4.837168-11.177574l0-566.623062c0-6.670933 4.307096-12.576433 10.658757-14.614859l419.249573-134.554532c2.669806-2.084475 5.988388-3.27151 9.447163-3.27151 1.537006 0 3.100618 0.233314 4.643764 0.722454l424.072415 134.482901c6.376221 2.022053 10.709923 7.941879 10.709923 14.631232L952.359356 581.862529C952.36038 586.129716 950.584943 590.172799 947.511955 593.055452zM508.492106 703.829372l380.577808-120.93535-82.174558-25.807782-374.110513 122.642225L508.492106 703.829372zM512.531096 464.637688 136.365784 585.364283l112.879883 35.935444 375.116423-121.5391L512.531096 464.637688zM382.78815 663.811959l373.775892-122.532731-81.628112-25.63689L299.482839 637.291956 382.78815 663.811959zM693.403536 489.265598l97.544617 30.635741 0-143.737682-97.544617-37.649482L693.403536 489.265598zM495.677243-96.577201 104.276948 29.039775l0 534.38073L495.677243 437.804553 495.677243-96.577201zM921.661194 26.47537 526.376429-98.878616 526.376429 436.808876l136.328945 42.816155 0-163.488515c0-5.060249 2.494821-9.795087 6.667863-12.658298 2.592035-1.778506 5.625114-2.691295 8.682753-2.691295 1.864464 0 3.738138 0.339738 5.525853 1.029446l128.243803 49.498344c5.918803 2.284019 9.822716 7.974625 9.822716 14.320147L821.648362 529.54293l100.012831 31.410384L921.661194 26.47537z" horiz-adv-x="1024" /> + + + <glyph glyph-name="dashbord" unicode="&#59284;" d="M897.828571 506.514286v268.8h-285.257142l-91.428572 85.942857-482.742857-451.657143 12.8-12.8 12.8-12.8 9.142857-9.142857 12.8-12.8 12.8-12.8 47.542857 43.885714V-78.628571h316.342857v250.514285h120.685715V-78.628571h316.342857v469.942857l49.371428-47.542857 12.8 12.8 12.8 12.8 9.142858 9.142857 12.8 12.8 12.8 12.8-111.542858 102.4z m-82.285714-155.428572c0-1.828571 0-1.828571 0 0v-343.771428h-153.6v250.514285h-285.257143v-250.514285h-153.6v466.285714l296.228572 276.114286 296.228571-276.114286v-122.514286z m-117.028571 341.942857h117.028571v-109.714285l-117.028571 109.714285z" horiz-adv-x="1024" /> + + + <glyph glyph-name="anquanshenji" unicode="&#59745;" d="M416 0H128c-35.3 0-64 28.7-64 64V832c0 35.3 28.7 64 64 64h640c35.3 0 64-28.7 64-64v-320c0-17.7-14.3-32-32-32s-32 14.3-32 32V832H128v-768h288c17.7 0 32-14.3 32-32s-14.3-32-32-32zM736-128c-18.5 0-41 6.8-66.9 20.1-23.8 12.2-47.9 28.8-69.9 47.9-32.6 28.4-87.2 86.3-87.2 156V312.1l23.1 6.7c35.3 10.2 136.3 45.9 178.2 87.9l23.4 23.4 22.6-24.1c40-42.7 141.3-77.3 177-87l23.6-6.4v-216.5c0-70.6-54.5-128.5-87-156.7-21.9-19-46.1-35.5-70-47.6-17.7-9-43.8-19.8-66.9-19.8zM576 264.6V96c0-32.4 23.8-71.6 65.2-107.7 39.2-34.1 80.2-52.3 94.8-52.3 14.3 0 54.3 16.4 95 51.7 41.3 35.8 65 75.3 65 108.3V264.2c-14.3 4.6-33.9 11.3-55.3 20-44.1 17.9-79.4 37-105.2 57.3-50.1-37.4-122.7-64.6-159.5-76.9zM608 640H224c-17.7 0-32 14.3-32 32s14.3 32 32 32h384c17.7 0 32-14.3 32-32s-14.3-32-32-32zM416 384H224c-17.7 0-32 14.3-32 32s14.3 32 32 32h192c17.7 0 32-14.3 32-32s-14.3-32-32-32zM608 512H224c-17.7 0-32 14.3-32 32s14.3 32 32 32h384c17.7 0 32-14.3 32-32s-14.3-32-32-32zM705.1 45.4c-8.2 0-16.4 3.1-22.6 9.4l-45.3 45.3c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l22.6-22.6 90.5 90.5c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L727.7 54.8c-6.3-6.2-14.5-9.4-22.6-9.4z" horiz-adv-x="1024" /> + + + <glyph glyph-name="yidongxuanze" unicode="&#59007;" d="M1023.688 371.753c0.271 7.44-2.325 14.925-7.957 20.557L882.806 524.877c-10.829 10.793-28.473 10.793-39.342 0-10.834-10.829-10.834-28.432 0-39.225l88.1-87.91H700.498c-14.889 0-26.942-12.011-26.942-26.854s12.053-26.865 26.942-26.865h234.885l-88.77-88.535a26.813 26.813 0 0 1 0-38.042 26.931 26.931 0 0 1 38.082 0l128.789 128.471c3.389 3.385 5.273 7.522 6.502 11.853 2.283 3.978 3.937 8.269 3.937 13.113-0.04 0.358-0.2 0.593-0.24 0.87z m-700.18 26.86H88.616l88.77 88.535a26.767 26.767 0 0 1 0 38.005 26.86 26.86 0 0 1-38.082 0L10.516 396.683c-3.389-3.39-5.278-7.527-6.502-11.859-2.283-3.937-3.937-8.228-3.937-13.071 0-0.317 0.159-0.553 0.2-0.83a27.576 27.576 0 0 1 7.956-20.597L141.153 217.8c10.834-10.834 28.478-10.834 39.347 0a27.74 27.74 0 0 1 0 39.224l-88.104 87.91H323.46c14.894 0 26.942 12.007 26.942 26.855s-12.012 26.823-26.896 26.823zM536.498 872.13c-3.072 3.072-6.815 5.002-10.675 6.266-4.055 2.402-8.468 4.132-13.512 4.132-0.512 0-0.824-0.235-1.336-0.312-7.526 0.394-15.206-2.089-20.951-7.839L357.018 741.412c-10.793-10.788-10.793-28.508 0-39.301a27.812 27.812 0 0 1 39.342 0l88.97 88.97v-231.936a26.91 26.91 0 0 1 26.982-26.941 26.931 26.931 0 0 1 26.978 26.941v234.02l87.91-87.905c10.516-10.553 27.53-10.517 38.088 0.04a26.91 26.91 0 0 1 0 38.124L536.499 872.141zM627.2 62.78l-88.77-88.775V208.86a26.962 26.962 0 0 1-26.983 26.931 26.931 26.931 0 0 1-26.977-26.93v-231.118l-88.105 88.105c-10.829 10.875-28.473 10.875-39.342 0.041-10.834-10.829-10.834-28.518 0-39.306l132.92-132.961c5.714-5.673 13.194-8.233 20.598-7.957 0.317 0 0.553-0.194 0.87-0.194 4.88 0 9.175 1.69 13.153 3.978 4.332 1.178 8.505 3.072 11.93 6.497l128.753 128.748a26.91 26.91 0 0 1 0 38.123 26.85 26.85 0 0 1-38.047-0.036z" horiz-adv-x="1024" /> + + + <glyph glyph-name="heimingdan" unicode="&#58901;" d="M734.409093 511.835736c4.846853-0.204797 9.659572-1.501842 14.43816-2.047966l0.068265 0.341328c-4.334861 0.37546-8.567324 1.877302-12.902185 1.877302l-1.60424-0.170664z m-1.60424 0.170664l1.60424-0.068266 1.60424 0.068266c4.334861 0 8.533191-0.511991 12.902185-0.648523 10.922485 30.207497 17.475975 62.531224 17.475975 96.663989a288.012266 288.012266 0 0 1-575.9904 0c0-105.470242 57.41131-196.80952 142.094699-246.984683A479.974934 479.974934 0 0 1 0.008533-63.984h63.998934a416.180797 416.180797 0 0 0 353.205846 379.010216 352.932784 352.932784 0 0 0 45.635506 70.518292c-116.153797 8.123598-208.448793 104.241463-208.448792 222.477358a224.252262 224.252262 0 0 0 223.910934 223.979201c123.492342 0 224.081599-100.486859 224.081599-224.013333a221.453376 221.453376 0 0 0-25.087582-100.794054c2.423426 0.409593 4.983384 0.341328 7.372677 0.682655 14.267496 2.082099 28.808053 3.413276 43.587541 3.754604 1.535974 0 3.003683 0.37546 4.539657 0.375461z m-4.539657-1.126381c2.047966 0.204797 4.027666 0.955717 6.143897 0.955717l-1.60424 0.170664c-1.535974 0-3.003683-1.126381-4.539657-1.126381z m7.748137-62.872552a288.012266 288.012266 0 1 1 0-575.990401 288.012266 288.012266 0 0 1 0 575.990401z m39.491609-298.42276l85.263645 85.263646-33.279445 33.279445-85.263646-85.263646-81.747971 81.747971-33.245312-33.279445 81.747971-81.747971-81.099449-81.065316 33.279446-33.279445 81.065315 81.065316 84.615123-84.580991 33.279446 33.279446-84.615123 84.58099zM736.013333 384.008533a224.252262 224.252262 0 0 0 223.9792-224.013333 224.252262 224.252262 0 0 0-224.013333-223.9792A224.252262 224.252262 0 0 0 512 160.029333 224.252262 224.252262 0 0 0 736.013333 384.008533z" horiz-adv-x="1024" /> + + + <glyph glyph-name="xitongicon_yingjianguanli" unicode="&#58968;" d="M1024 384l-178.062222 382.862222a11.377778 11.377778 0 0 1-10.24 6.826667H188.302222a11.377778 11.377778 0 0 1-10.24-6.826667L0 384v-375.466667a11.377778 11.377778 0 0 1 11.377778-11.377777h1001.244444a11.377778 11.377778 0 0 1 11.377778 11.377777V384z m-77.368889-302.08a11.377778 11.377778 0 0 0-11.377778-11.377778H89.884444a11.377778 11.377778 0 0 0-11.377777 11.377778V339.626667a11.377778 11.377778 0 0 0 11.377777 11.377777h844.231112a11.377778 11.377778 0 0 0 11.377777-11.377777zM760.035556 269.084444l113.777777 0 0-113.777777-113.777777 0 0 113.777777ZM578.56 269.084444l113.777778 0 0-113.777777-113.777778 0 0 113.777777Z" horiz-adv-x="1024" /> + + + <glyph glyph-name="baimingdanguanli" unicode="&#58898;" d="M736 384c123.52 0 224-100.48 224-224s-100.48-224-224-224S512 36.48 512 160 612.48 384 736 384z m0 64c-159.05792 0-288-128.94208-288-288S576.94208-128 736-128 1024 0.94208 1024 160 895.05792 448 736 448z m156.416-245.82656l-44.86656 45.696-142.52544-139.89888-75.58144 74.81344-44.98944-45.50656 120.44288-119.168 187.52 184.064z m-164.16256 309.44256c2.048 0.06656 4.03456 0.32256 6.144 0.32256l-1.59744 0.06144c-1.536 0-3.01056-0.384-4.54656-0.384z m4.54656 0.384l1.60256-0.06656 1.59744 0.06656c4.352 0 8.576-0.512 12.928-0.64 10.94144 30.208 17.46944 62.52544 17.46944 96.64 0 159.05792-128.94208 288-288 288s-288-128.94208-288-288c0-105.472 57.40544-196.80256 142.08-246.97344C144.96768 300.94848 13.16352 132.45952 0-64h64c15.17056 193.152 161.6128 350.28992 353.21344 379.008 12.48256 25.33888 27.71456 49.08544 45.63456 70.52288-116.16256 8.13056-208.44544 104.25856-208.44544 222.464 0 123.52 100.48 224 223.93344 224s224.06656-100.48 224.06656-224a221.4656 221.4656 0 0 0-25.088-100.80256c2.43712 0.384 4.99712 0.32256 7.36256 0.64a348.09856 348.09856 0 0 0 43.58656 3.77344c1.52576 0.01024 3.00032 0.39424 4.53632 0.39424z m1.60256-0.06656c4.864-0.06144 9.66656-0.512 14.464-0.70144l0.06656 0.128C744.576 511.488 740.352 512 736 512l-1.59744-0.06656z" horiz-adv-x="1024" /> + + + <glyph glyph-name="fangwenkongzhi" unicode="&#59192;" d="M473.6 128H448c-38.4 0-64-25.6-64-64H160c-19.2 0-32-12.8-32-32s12.8-32 32-32H576c-44.8 32-76.8 76.8-102.4 128zM448 256H64V704h896v-192c25.6-19.2 44.8-38.4 64-64V704c0 38.4-25.6 64-64 64H64c-38.4 0-64-25.6-64-64v-448c0-38.4 25.6-64 64-64h390.4c-6.4 19.2-6.4 44.8-6.4 64zM768 512c-140.8 0-256-115.2-256-256s115.2-256 256-256 256 115.2 256 256-115.2 256-256 256z m192-256c0-38.4-12.8-76.8-38.4-108.8l-268.8 268.8c38.4 19.2 76.8 32 115.2 32 108.8 0 192-83.2 192-192z m-384 0c0 44.8 12.8 76.8 38.4 108.8l268.8-268.8c-38.4-19.2-70.4-32-115.2-32-108.8 0-192 83.2-192 192z" horiz-adv-x="1024" /> + + + <glyph glyph-name="s-clonekelong" unicode="&#58984;" d="M385.559838 637.929346v-764.905411h637.41725v764.905411H385.559838z m318.706065-701.163378c-70.399661 0-127.484065 57.084404-127.484064 127.485088 0 70.403757 57.084404 127.484065 127.484064 127.484065 70.40478 0 127.485088-57.080308 127.485089-127.484065 0-70.400685-57.080308-127.485088-127.485089-127.485088z m191.227121 382.453217H513.039806v63.742032h382.453218v-63.742032z m0 127.484065H513.039806v63.742032h382.453218v-63.742032zM640.523871 701.671379V892.897475H3.10662v-764.904387h318.711185v127.484065c-70.403757 0-127.484065 57.084404-127.484064 127.484064 0 70.403757 57.080308 127.484065 127.484064 127.484065v63.742032H130.590685v63.743056h191.22712v63.742033H130.590685v63.742032h191.22712v-63.742032h318.706066z" horiz-adv-x="1024" /> + + + <glyph glyph-name="xitongshezhi" unicode="&#58902;" d="M346.112 172.032H61.952v604.16h848.896v-223.744l53.76-30.72v225.28c0 46.592-37.888 84.48-84.48 84.48h-798.72C37.376 831.488 1.536 795.648 1.536 751.616v-564.736c0-39.936 32.256-72.192 72.192-72.192h272.384v57.344zM346.112 172.032h-245.76c-20.992 0-38.4 17.408-38.4 38.4V728.576c0 26.624 21.504 48.128 48.128 48.128H865.28c25.088 0 45.568-20.48 45.568-45.568V552.96l53.76-30.72V766.976c0 35.328-28.672 64.512-64.512 64.512h-834.56C30.208 831.488 1.024 802.816 1.024 766.976v-588.288c0-35.328 28.672-64.512 64.512-64.512h280.064l0.512 57.856zM220.16 26.112V-35.84h227.84l-65.024 61.952H220.16zM804.864-63.488c-11.264 0-22.528 4.608-29.184 12.288-9.728 10.752-40.448 38.4-65.536 38.4s-55.808-27.648-65.024-37.376c-7.168-7.68-17.92-12.288-29.184-12.288-5.12 0-10.24 1.024-14.848 3.072l-1.024 0.512-76.288 42.496-0.512 0.512c-13.824 9.728-18.944 28.672-12.288 44.032 0 0 7.168 16.384 7.168 30.72 0 44.544-36.352 80.896-80.896 80.896h-3.072c-12.8 0-23.04 11.264-26.624 28.672-0.512 1.536-6.656 34.816-6.656 60.928 0 26.112 6.144 59.392 6.656 60.928 3.584 17.92 13.824 29.184 27.136 28.672h2.56c44.544 0 80.896 36.352 80.896 80.896 0 14.848-7.168 30.72-7.168 30.72-6.656 15.36-1.536 34.304 12.288 44.032l1.024 0.512 80.384 44.032 1.024 0.512c4.608 2.048 9.728 3.072 14.848 3.072 11.264 0 22.016-4.608 29.184-12.288 9.728-9.728 39.424-35.84 64-35.84 24.064 0 54.272 25.6 63.488 35.328 7.168 7.168 17.92 11.776 29.184 11.776 5.12 0 10.24-1.024 14.848-3.072l1.024-0.512 77.824-43.008 0.512-0.512c13.824-9.728 19.456-28.672 12.288-44.032 0 0-7.168-16.384-7.168-30.72 0-44.544 36.352-80.896 80.896-80.896h2.56c12.8 0.512 23.552-11.264 27.136-28.672 0.512-1.536 6.656-34.816 6.656-60.928 0-26.112-6.144-59.392-6.656-60.928-3.584-17.92-13.824-29.184-27.136-28.672h-2.56c-44.544 0-80.896-36.352-80.896-80.896 0-14.848 7.168-30.72 7.168-30.72 6.656-15.36 1.536-34.304-12.288-44.032l-1.024-0.512-78.848-43.52-1.024-0.512c-4.608-2.56-9.728-3.072-14.848-3.072z m-9.728 56.832c0.512 0 1.024-0.512 2.048-0.512L865.28 30.72c-1.536 3.584-9.216 22.528-9.216 41.472 0 57.856 45.568 105.472 102.912 108.032 1.024 4.608 5.12 30.208 5.12 49.152 0 18.944-4.608 44.544-5.12 49.152-57.344 3.072-102.912 50.176-102.912 108.032 0 19.456 7.68 37.888 9.216 41.472L798.208 465.92h-0.512c-1.024 0-2.048-0.512-2.56-0.512-1.024-1.024-10.752-10.752-24.576-20.992-20.48-14.336-39.936-22.016-57.856-22.016s-37.888 7.68-58.368 22.528c-13.824 10.24-23.552 19.968-25.088 20.992-0.512 0-1.536 0.512-2.56 0.512l-69.632-37.888c1.536-4.096 9.216-22.528 9.216-41.472 0-57.856-45.568-105.472-102.912-108.032-1.024-4.608-5.12-30.208-5.12-49.152s4.608-44.544 5.12-49.152c57.344-3.072 102.912-50.176 102.912-108.032 0-19.456-7.68-37.888-9.216-41.984l65.536-36.864c1.024 0 2.048 0.512 2.048 0.512 1.024 1.536 11.264 11.776 25.088 22.016 20.992 15.36 40.96 23.04 59.392 23.04s38.912-8.192 59.904-23.552c15.36-10.24 25.088-20.48 26.112-22.528z m-84.992 129.024c-59.392 0-107.52 48.128-107.52 107.52s48.128 107.52 107.52 107.52 107.52-48.128 107.52-107.52-48.128-107.52-107.52-107.52z m0 173.056c-36.352 0-65.536-29.184-65.536-65.536s29.184-65.536 65.536-65.536 65.536 29.184 65.536 65.536-29.184 65.536-65.536 65.536z" horiz-adv-x="1024" /> + + + <glyph glyph-name="report" unicode="&#58897;" d="M979.2 6.399999999999977h-870.4c-19.2 0-32 12.8-32 32V793.6c0 19.2-12.8 32-32 32S12.8 812.8 12.8 793.6v-787.2c0-32 25.6-64 64-64h896c19.2 0 32 12.8 32 32s-12.8 32-25.6 32zM172.8 256h64c6.4 0 19.2 6.4 25.6 19.2L326.4 384l96-217.6 19.2-19.2c12.8-6.4 32 6.4 38.4 19.2l128 422.4 89.6-307.2c0-12.8 12.8-25.6 32-25.6h160c12.8-19.2 32-32 51.2-32 32 0 64 25.6 64 64s-25.6 64-64 64c-25.6 0-44.8-12.8-51.2-32h-140.8l-115.2 390.4c0 12.8-19.2 25.6-38.4 19.2-6.4 0-12.8-6.4-12.8-6.4s-6.4-6.4-6.4-12.8L441.6 268.79999999999995 358.4 460.8c0 6.4-6.4 6.4-6.4 12.8-6.4 6.4-19.2 6.4-32 0-6.4 0-12.8-6.4-12.8-12.8l-89.6-140.8h-44.8c-19.2 0-32-12.8-32-32 0-12.8 12.8-32 32-32z" horiz-adv-x="1024" /> + + + <glyph glyph-name="shebeiguanli" unicode="&#58907;" d="M56.163989 896v-1024h911.672022V896z m836.030286-75.641736v-231.652816H131.805725V820.358264z m0-307.294552v-245.835642H131.805725v245.835642zM131.805725-52.358264V191.39723h760.38855v-243.944598zM689.852632 739.232502h75.641735v-75.641736h-75.641735zM689.852632 419.267959h75.641735v-75.641736h-75.641735zM689.852632 99.492521h75.641735v-75.641736h-75.641735z" horiz-adv-x="1024" /> + + + <glyph glyph-name="nav_ic_yingjianguanli" unicode="&#58908;" d="M820.837 688.92c-12.096 26.199-38.561 43.109-67.446 43.109H272.659c-28.885 0-55.35-16.91-67.446-43.085L69.403 395.623l-2.274-282.895c0-40.98 33.336-74.316 74.316-74.316h743.161c40.98 0 74.316 33.336 74.316 74.316V385.221L820.837 688.92z m-563.37-28.569c3.905 8.468 12.467 13.926 21.83 13.926h467.457c9.362 0 17.925-5.457 21.83-13.949l68.585-148.117H188.877l68.59 148.14z m640.966-540.098c0-13.291-10.821-24.088-24.088-24.088H151.706c-13.267 0-24.088 10.797-24.088 24.088V379.905l31.432 67.887h707.948l31.435-67.887v-259.652zM545.157 310.912h99.088v-99.088h-99.088V310.91zM693.789 310.912h99.088v-99.088h-99.086V310.91z" horiz-adv-x="1024" /> + + + <glyph glyph-name="distributedtransact" unicode="&#58983;" d="M758.784 181.248a128 128 0 0 1-104.448-55.296L382.976 282.624a126.976 126.976 0 0 1-16.384 124.928l204.8 204.8a128 128 0 1 1-24.576 24.576l-204.8-204.8a128 128 0 1 1 23.552-180.224l272.384-156.672a128 128 0 1 1 120.832 86.016zM648.192 806.912a93.184 93.184 0 1 0-93.184-93.184 93.184 93.184 0 0 0 93.184 93.184zM265.216 237.568a93.184 93.184 0 1 0 81.92 48.128v-2.048a93.184 93.184 0 0 0-81.92-46.08z m493.568-276.48a93.184 93.184 0 1 0 93.184 93.184 93.184 93.184 0 0 0-93.184-93.184z" horiz-adv-x="1024" /> + + + <glyph glyph-name="biaoge" unicode="&#59084;" d="M340.5 655.4v-85.7c0-11.9-4.1-22-12.5-30.3-8.4-8.4-18.5-12.5-30.3-12.5H154.8c-11.9 0-22 4.1-30.3 12.5-8.4 8.3-12.5 18.4-12.5 30.3v85.7c0 11.9 4.1 22 12.5 30.3 8.4 8.4 18.5 12.5 30.3 12.5h142.9c11.9 0 22-4.1 30.3-12.5 8.4-8.3 12.5-18.4 12.5-30.3z m0-228.6v-85.7c0-11.9-4.1-22-12.5-30.3-8.4-8.4-18.5-12.5-30.3-12.5H154.8c-11.9 0-22 4.1-30.3 12.5-8.4 8.4-12.5 18.5-12.5 30.3v85.7c0 11.9 4.1 22 12.5 30.3 8.4 8.4 18.5 12.5 30.3 12.5h142.9c11.9 0 22-4.1 30.3-12.5 8.4-8.3 12.5-18.4 12.5-30.3z m0-228.5v-85.7c0-11.9-4.1-22-12.5-30.3-8.4-8.4-18.5-12.5-30.3-12.5H154.8c-11.9 0-22 4.1-30.3 12.5-8.4 8.4-12.5 18.5-12.5 30.3v85.7c0 11.9 4.1 22 12.5 30.3 8.4 8.4 18.5 12.5 30.3 12.5h142.9c11.9 0 22-4.1 30.3-12.5 8.4-8.3 12.5-18.4 12.5-30.3z m285.7 457.1v-85.7c0-11.9-4.1-22-12.5-30.3-8.4-8.4-18.5-12.5-30.3-12.5H440.5c-11.9 0-22 4.1-30.3 12.5-8.4 8.4-12.5 18.5-12.5 30.3v85.7c0 11.9 4.1 22 12.5 30.3 8.4 8.4 18.5 12.5 30.3 12.5h142.8c11.9 0 22-4.1 30.3-12.5 8.6-8.3 12.6-18.4 12.6-30.3z m0-228.6v-85.7c0-11.9-4.1-22-12.5-30.3-8.4-8.4-18.5-12.5-30.3-12.5H440.5c-11.9 0-22 4.1-30.3 12.5-8.4 8.4-12.5 18.5-12.5 30.3v85.7c0 11.9 4.1 22 12.5 30.3 8.4 8.4 18.5 12.5 30.3 12.5h142.8c11.9 0 22-4.1 30.3-12.5 8.6-8.3 12.6-18.4 12.6-30.3z m0-228.5v-85.7c0-11.9-4.1-22-12.5-30.3-8.4-8.4-18.5-12.5-30.3-12.5H440.5c-11.9 0-22 4.1-30.3 12.5-8.4 8.4-12.5 18.5-12.5 30.3v85.7c0 11.9 4.1 22 12.5 30.3 8.4 8.4 18.5 12.5 30.3 12.5h142.8c11.9 0 22-4.1 30.3-12.5 8.6-8.3 12.6-18.4 12.6-30.3zM912 655.4v-85.7c0-11.9-4.1-22-12.5-30.3-8.4-8.4-18.5-12.5-30.3-12.5H726.3c-11.9 0-22 4.1-30.3 12.5-8.4 8.4-12.5 18.5-12.5 30.3v85.7c0 11.9 4.1 22 12.5 30.3 8.4 8.4 18.5 12.5 30.3 12.5h142.9c11.9 0 22-4.1 30.3-12.5 8.4-8.3 12.5-18.4 12.5-30.3z m0-228.6v-85.7c0-11.9-4.1-22-12.5-30.3-8.4-8.4-18.5-12.5-30.3-12.5H726.3c-11.9 0-22 4.1-30.3 12.5-8.4 8.4-12.5 18.5-12.5 30.3v85.7c0 11.9 4.1 22 12.5 30.3 8.4 8.4 18.5 12.5 30.3 12.5h142.9c11.9 0 22-4.1 30.3-12.5 8.4-8.3 12.5-18.4 12.5-30.3z m0-228.5v-85.7c0-11.9-4.1-22-12.5-30.3-8.4-8.4-18.5-12.5-30.3-12.5H726.3c-11.9 0-22 4.1-30.3 12.5-8.4 8.4-12.5 18.5-12.5 30.3v85.7c0 11.9 4.1 22 12.5 30.3 8.4 8.4 18.5 12.5 30.3 12.5h142.9c11.9 0 22-4.1 30.3-12.5 8.4-8.3 12.5-18.4 12.5-30.3z" horiz-adv-x="1024" /> + + + <glyph glyph-name="biaogexianshi" unicode="&#58906;" d="M145.864249 764.017778v-109.511111a17.635556 17.635556 0 0 0-5.404445-12.8 17.635556 17.635556 0 0 0-12.743111-5.347556H18.148693a17.635556 17.635556 0 0 0-12.8 5.347556A17.635556 17.635556 0 0 0 0.001138 654.506667V764.074667a17.635556 17.635556 0 0 0 5.347555 12.8A17.635556 17.635556 0 0 0 18.205582 782.222222h109.454222a17.635556 17.635556 0 0 0 12.743112-5.347555c3.697778-3.584 5.518222-7.964444 5.518222-12.8z m0-341.333334v-109.511111a17.635556 17.635556 0 0 0-5.404445-12.8 17.635556 17.635556 0 0 0-12.743111-5.347555H18.148693a17.635556 17.635556 0 0 0-12.8 5.347555 17.635556 17.635556 0 0 0-5.347555 12.8V422.741333a17.635556 17.635556 0 0 0 5.347555 12.8A17.635556 17.635556 0 0 0 18.205582 440.888889h109.454222a17.635556 17.635556 0 0 0 12.743112-5.347556c3.697778-3.470222 5.518222-7.793778 5.518222-12.8z m0-316.074666v-109.568a17.635556 17.635556 0 0 0-5.404445-12.8 17.635556 17.635556 0 0 0-12.743111-5.347556H18.148693a17.635556 17.635556 0 0 0-12.8 5.347556 17.635556 17.635556 0 0 0-5.347555 12.8v109.568a17.635556 17.635556 0 0 0 5.347555 12.743111 17.635556 17.635556 0 0 0 12.8 5.404444h109.454223a17.635556 17.635556 0 0 0 12.743111-5.404444 17.066667 17.066667 0 0 0 5.518222-12.743111zM1022.408249 764.017778v-109.568a17.635556 17.635556 0 0 0-5.404445-12.8 17.635556 17.635556 0 0 0-12.743111-5.347556H237.227804a17.635556 17.635556 0 0 0-12.743111 5.347556 17.635556 17.635556 0 0 0-5.404444 12.8V764.074667a17.635556 17.635556 0 0 0 5.404444 12.8A17.635556 17.635556 0 0 0 237.227804 782.222222h767.032889a17.635556 17.635556 0 0 0 12.743111-5.347555 17.635556 17.635556 0 0 0 5.404445-12.8z m8.419555-341.333334v-109.568a17.635556 17.635556 0 0 0-5.347555-12.8 17.635556 17.635556 0 0 0-12.8-5.347555H245.704249a17.635556 17.635556 0 0 0-12.8 5.347555 17.635556 17.635556 0 0 0-5.347556 12.8V422.741333a17.635556 17.635556 0 0 0 5.347556 12.8A17.635556 17.635556 0 0 0 245.761138 440.888889H1012.62336a17.635556 17.635556 0 0 0 12.8-5.347556c3.584-3.470222 5.347556-7.793778 5.347556-12.8z m-8.419555-316.131555v-109.568a17.635556 17.635556 0 0 0-5.404445-12.8 17.635556 17.635556 0 0 0-12.743111-5.347556H237.227804a17.635556 17.635556 0 0 0-12.743111 5.347556 17.635556 17.635556 0 0 0-5.404444 12.8v109.568a17.635556 17.635556 0 0 0 5.404444 12.743111 17.635556 17.635556 0 0 0 12.743111 5.404444h767.032889a17.635556 17.635556 0 0 0 12.743111-5.404444 17.408 17.408 0 0 0 5.404445-12.743111z" horiz-adv-x="1030" /> + + + + + </font> +</defs></svg> diff --git a/cyclone-web/vendor/fonts-boot/iconfont.ttf b/cyclone-web/vendor/fonts-boot/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/cyclone-web/vendor/fonts-boot/iconfont.woff b/cyclone-web/vendor/fonts-boot/iconfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/cyclone-web/vendor/fonts/demo.css b/cyclone-web/vendor/fonts/demo.css new file mode 100644 index 0000000000000000000000000000000000000000..1fe4c4dd4e251d4d51cc08d2ae930a35e5d3cb04 --- /dev/null +++ b/cyclone-web/vendor/fonts/demo.css @@ -0,0 +1,89 @@ +*{margin: 0;padding: 0;list-style: none;} +/* +KISSY CSS Reset +理念:1. reset 的目的不是清除浏览器的默认样式,这仅是部分工作。清除和重置是紧密不可分的。 +2. reset 的目的不是让默认样式在所有浏览器下一致,而是减少默认样式有可能带来的问题。 +3. reset 期望提供一套普适通用的基础样式。但没有银弹,推荐根据具体需求,裁剪和修改后再使用。 +特色:1. 适应中文;2. 基于最新主流浏览器。 +维护:玉伯<lifesinger@gmail.com>, 正淳<ragecarrier@gmail.com> + */ + +/** 清除内外边距 **/ +body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, /* structural elements 结构元素 */ +dl, dt, dd, ul, ol, li, /* list elements 列表元素 */ +pre, /* text formatting elements 文本格式元素 */ +form, fieldset, legend, button, input, textarea, /* form elements 表单元素 */ +th, td /* table elements 表格元素 */ { + margin: 0; + padding: 0; +} + +/** 设置默认字体 **/ +body, +button, input, select, textarea /* for ie */ { + font: 12px/1.5 tahoma, arial, \5b8b\4f53, sans-serif; +} +h1, h2, h3, h4, h5, h6 { font-size: 100%; } +address, cite, dfn, em, var { font-style: normal; } /* 将斜体扶正 */ +code, kbd, pre, samp { font-family: courier new, courier, monospace; } /* 统一等宽字体 */ +small { font-size: 12px; } /* 小于 12px 的中文很难阅读,让 small 正常化 */ + +/** 重置列表元素 **/ +ul, ol { list-style: none; } + +/** 重置文本格式元素 **/ +a { text-decoration: none; } +a:hover { text-decoration: underline; } + + +/** 重置表单元素 **/ +legend { color: #000; } /* for ie6 */ +fieldset, img { border: 0; } /* img 搭车:让链接里的 img 无边框 */ +button, input, select, textarea { font-size: 100%; } /* 使得表单元素在 ie 下能继承字体大小 */ +/* 注:optgroup 无法扶正 */ + +/** 重置表格元素 **/ +table { border-collapse: collapse; border-spacing: 0; } + +/* 清除浮动 */ +.ks-clear:after, .clear:after { + content: '\20'; + display: block; + height: 0; + clear: both; +} +.ks-clear, .clear { + *zoom: 1; +} + +.main {padding: 30px 100px;} +.main h1{font-size:36px; color:#333; text-align:left;margin-bottom:30px; border-bottom: 1px solid #eee;} + +.helps{margin-top:40px;} +.helps pre{ + padding:20px; + margin:10px 0; + border:solid 1px #e7e1cd; + background-color: #fffdef; + overflow: auto; +} + +.icon_lists li{ + float:left; + width: 100px; + height:180px; + text-align: center; +} +.icon_lists .icon{ + font-size: 42px; + line-height: 100px; + margin: 10px 0; + color:#333; + -webkit-transition: font-size 0.25s ease-out 0s; + -moz-transition: font-size 0.25s ease-out 0s; + transition: font-size 0.25s ease-out 0s; + +} +.icon_lists .icon:hover{ + font-size: 100px; +} diff --git a/cyclone-web/vendor/fonts/demo.html b/cyclone-web/vendor/fonts/demo.html new file mode 100644 index 0000000000000000000000000000000000000000..57fe9a4f88c9eb6a125a83c460c3f9c323835468 --- /dev/null +++ b/cyclone-web/vendor/fonts/demo.html @@ -0,0 +1,214 @@ + +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"/> + <title>IconFont</title> + <link rel="stylesheet" href="demo.css"> + <link rel="stylesheet" href="iconfont.css"> +</head> +<body> + <div class="main"> + <h1>IconFont 图标</h1> + <ul class="icon_lists clear"> + + <li> + <i class="icon iconfont">&#xe60e;</i> + <div class="name">person</div> + <div class="code">&amp;#xe60e;</div> + <div class="fontclass">.p</div> + </li> + + <li> + <i class="icon iconfont">&#xe60f;</i> + <div class="name">down</div> + <div class="code">&amp;#xe60f;</div> + <div class="fontclass">.xiala</div> + </li> + + <li> + <i class="icon iconfont">&#xe60d;</i> + <div class="name">复制</div> + <div class="code">&amp;#xe60d;</div> + <div class="fontclass">.fuzhi</div> + </li> + + <li> + <i class="icon iconfont">&#xe600;</i> + <div class="name">brand</div> + <div class="code">&amp;#xe600;</div> + <div class="fontclass">.brand</div> + </li> + + <li> + <i class="icon iconfont">&#xe601;</i> + <div class="name">manage</div> + <div class="code">&amp;#xe601;</div> + <div class="fontclass">.manage</div> + </li> + + <li> + <i class="icon iconfont">&#xe602;</i> + <div class="name">networksegment</div> + <div class="code">&amp;#xe602;</div> + <div class="fontclass">.networksegment</div> + </li> + + <li> + <i class="icon iconfont">&#xe603;</i> + <div class="name">resourcepooling</div> + <div class="code">&amp;#xe603;</div> + <div class="fontclass">.resourcepooling</div> + </li> + + <li> + <i class="icon iconfont">&#xe604;</i> + <div class="name">server</div> + <div class="code">&amp;#xe604;</div> + <div class="fontclass">.server</div> + </li> + + <li> + <i class="icon iconfont">&#xe605;</i> + <div class="name">Statistics</div> + <div class="code">&amp;#xe605;</div> + <div class="fontclass">.statistics</div> + </li> + + <li> + <i class="icon iconfont">&#xe606;</i> + <div class="name">template</div> + <div class="code">&amp;#xe606;</div> + <div class="fontclass">.template</div> + </li> + + <li> + <i class="icon iconfont">&#xe607;</i> + <div class="name">iconfont-exit</div> + <div class="code">&amp;#xe607;</div> + <div class="fontclass">.iconfontexit</div> + </li> + + <li> + <i class="icon iconfont">&#xe608;</i> + <div class="name">modulemanagement</div> + <div class="code">&amp;#xe608;</div> + <div class="fontclass">.modulemanagement</div> + </li> + + <li> + <i class="icon iconfont">&#xe609;</i> + <div class="name">resourcedefinition</div> + <div class="code">&amp;#xe609;</div> + <div class="fontclass">.resourcedefinition</div> + </li> + + <li> + <i class="icon iconfont">&#xe60a;</i> + <div class="name">configuration</div> + <div class="code">&amp;#xe60a;</div> + <div class="fontclass">.configuration</div> + </li> + + <li> + <i class="icon iconfont">&#xe60b;</i> + <div class="name">reportmanager</div> + <div class="code">&amp;#xe60b;</div> + <div class="fontclass">.reportmanager</div> + </li> + + <li> + <i class="icon iconfont">&#xe60c;</i> + <div class="name">edit</div> + <div class="code">&amp;#xe60c;</div> + <div class="fontclass">.artboard7</div> + </li> + + <li> + <i class="icon iconfont">&#xe610;</i> + <div class="name">delete</div> + <div class="code">&amp;#xe610;</div> + <div class="fontclass">.artboard8-copy-copy</div> + </li> + + <li> + <i class="icon iconfont">&#xe611;</i> + <div class="name">logoutcloudboot</div> + <div class="code">&amp;#xe611;</div> + <div class="fontclass">.logoutcloudboot</div> + </li> + + <li> + <i class="icon iconfont">&#xe615;</i> + <div class="name">datasearch</div> + <div class="code">&amp;#xe615;</div> + <div class="fontclass">.datasearch</div> + </li> + + <li> + <i class="icon iconfont">&#xe613;</i> + <div class="name">vm</div> + <div class="code">&amp;#xe613;</div> + <div class="fontclass">.vm</div> + </li> + + <li> + <i class="icon iconfont">&#xe612;</i> + <div class="name">xen</div> + <div class="code">&amp;#xe612;</div> + <div class="fontclass">.xen</div> + </li> + + <li> + <i class="icon iconfont">&#xe614;</i> + <div class="name">check</div> + <div class="code">&amp;#xe614;</div> + <div class="fontclass">.check</div> + </li> + + <li> + <i class="icon iconfont">&#xe616;</i> + <div class="name">wrong</div> + <div class="code">&amp;#xe616;</div> + <div class="fontclass">.wrong</div> + </li> + + <li> + <i class="icon iconfont">&#xe617;</i> + <div class="name">rigth</div> + <div class="code">&amp;#xe617;</div> + <div class="fontclass">.rigth</div> + </li> + + </ul> + + + <div class="helps"> + 第一步:使用font-face声明字体 + <pre> +@font-face {font-family: 'iconfont'; + src: url('iconfont.eot'); /* IE9*/ + src: url('iconfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('iconfont.woff') format('woff'), /* chrome、firefox */ + url('iconfont.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/ + url('iconfont.svg#iconfont') format('svg'); /* iOS 4.1- */ +} +</pre> +第二步:定义使用iconfont的样式 + <pre> +.iconfont{ + font-family:"iconfont" !important; + font-size:16px;font-style:normal; + -webkit-font-smoothing: antialiased; + -webkit-text-stroke-width: 0.2px; + -moz-osx-font-smoothing: grayscale;} +</pre> +第三步:挑选相应图标并获取字体编码,应用于页面 +<pre> +&lt;i class="iconfont"&gt;&amp;#x33;&lt;/i&gt; +</pre> + </div> + + </div> +</body> +</html> diff --git a/cyclone-web/vendor/fonts/iconfont.css b/cyclone-web/vendor/fonts/iconfont.css new file mode 100644 index 0000000000000000000000000000000000000000..39ac429c34495ce1d2301c03ee380e7a3096bb96 --- /dev/null +++ b/cyclone-web/vendor/fonts/iconfont.css @@ -0,0 +1,90 @@ +@font-face { + font-family: "iconfont"; + src: url("iconfont.eot?t=1472609168"); /* IE9*/ + src: url("iconfont.eot?t=1472609168#iefix") format("embedded-opentype"), + /* IE6-IE8 */ url("iconfont.woff?t=1472609168") format("woff"), + /* chrome, firefox */ url("iconfont.ttf?t=1472609168") format("truetype"), + /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ + url("iconfont.svg?t=1472609168#iconfont") format("svg"); /* iOS 4.1- */ +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -webkit-text-stroke-width: 0.2px; + -moz-osx-font-smoothing: grayscale; +} +.icon-p:before { + content: "\e60e"; +} +.icon-xiala:before { + content: "\e60f"; +} +.icon-fuzhi:before { + content: "\e60d"; +} +.icon-brand:before { + content: "\e600"; +} +.icon-manage:before { + content: "\e601"; +} +.icon-networksegment:before { + content: "\e602"; +} +.icon-resourcepooling:before { + content: "\e603"; +} +.icon-server:before { + content: "\e604"; +} +.icon-statistics:before { + content: "\e605"; +} +.icon-template:before { + content: "\e606"; +} +.icon-iconfontexit:before { + content: "\e607"; +} +.icon-modulemanagement:before { + content: "\e608"; +} +.icon-resourcedefinition:before { + content: "\e609"; +} +.icon-configuration:before { + content: "\e60a"; +} +.icon-reportmanager:before { + content: "\e60b"; +} +.icon-artboard7:before { + content: "\e60c"; +} +.icon-artboard8-copy-copy:before { + content: "\e610"; +} +.icon-logoutcloudboot:before { + content: "\e611"; +} +.icon-datasearch:before { + content: "\e615"; +} +.icon-vm:before { + content: "\e613"; +} +.icon-xen:before { + content: "\e612"; +} +.icon-check:before { + content: "\e614"; +} +.icon-wrong:before { + content: "\e616"; +} +.icon-rigth:before { + content: "\e617"; +} diff --git a/cyclone-web/vendor/fonts/iconfont.eot b/cyclone-web/vendor/fonts/iconfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..b4fd2e9df9205cf9aa527de9e05847132eebb307 Binary files /dev/null and b/cyclone-web/vendor/fonts/iconfont.eot differ diff --git a/cyclone-web/vendor/fonts/iconfont.svg b/cyclone-web/vendor/fonts/iconfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..b3c397a41dfbe9aa45203ff8fe4006eb2890b024 --- /dev/null +++ b/cyclone-web/vendor/fonts/iconfont.svg @@ -0,0 +1,109 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +Created by FontForge 20120731 at Wed Aug 31 10:06:08 2016 + By admin +</metadata> +<defs> +<font id="iconfont" horiz-adv-x="1024" > + <font-face + font-family="iconfont" + font-weight="500" + font-stretch="normal" + units-per-em="1024" + panose-1="2 0 6 3 0 0 0 0 0 0" + ascent="896" + descent="-128" + x-height="792" + bbox="0 -138 996 848" + underline-thickness="50" + underline-position="-100" + unicode-range="U+0078-E617" + /> +<missing-glyph horiz-adv-x="374" +d="M34 0v682h272v-682h-272zM68 34h204v614h-204v-614z" /> + <glyph glyph-name=".notdef" horiz-adv-x="374" +d="M34 0v682h272v-682h-272zM68 34h204v614h-204v-614z" /> + <glyph glyph-name=".null" horiz-adv-x="0" + /> + <glyph glyph-name="nonmarkingreturn" horiz-adv-x="341" + /> + <glyph glyph-name="x" unicode="x" horiz-adv-x="1001" +d="M281 543q-27 -1 -53 -1h-83q-18 0 -36.5 -6t-32.5 -18.5t-23 -32t-9 -45.5v-76h912v41q0 16 -0.5 30t-0.5 18q0 13 -5 29t-17 29.5t-31.5 22.5t-49.5 9h-133v-97h-438v97zM955 310v-52q0 -23 0.5 -52t0.5 -58t-10.5 -47.5t-26 -30t-33 -16t-31.5 -4.5q-14 -1 -29.5 -0.5 +t-29.5 0.5h-32l-45 128h-439l-44 -128h-29h-34q-20 0 -45 1q-25 0 -41 9.5t-25.5 23t-13.5 29.5t-4 30v167h911zM163 247q-12 0 -21 -8.5t-9 -21.5t9 -21.5t21 -8.5q13 0 22 8.5t9 21.5t-9 21.5t-22 8.5zM316 123q-8 -26 -14 -48q-5 -19 -10.5 -37t-7.5 -25t-3 -15t1 -14.5 +t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q-5 19 -11 39h-368zM336 498v228q0 11 2.5 23t10 21.5t20.5 15.5t34 6h188q31 0 51.5 -14.5t20.5 -52.5v-227h-327z" /> + <glyph glyph-name="uniE600" unicode="&#xe600;" +d="M368 728h-224q-32 0 -32 -40v-120q0 -40 32 -40h224q32 0 32 40v120q0 40 -32 40zM176 648h160v-40h-160v40zM368 248h-224q-32 0 -32 -40v-120q0 -40 32 -40h224q32 0 32 40v120q0 40 -32 40zM176 168h160v-40h-160v40zM368 488h-224q-32 0 -32 -40v-120q0 -40 32 -40 +h224q32 0 32 40v120q0 40 -32 40zM176 408h160v-40h-160v40zM496 648h351q24 0 28 5t4 35t-4 35t-28 5h-351q-24 0 -27.5 -5t-3.5 -35t3.5 -35t27.5 -5zM496 248h351q24 0 28 5t4 35t-4 35t-28 5h-351q-24 0 -27.5 -5t-3.5 -35t3.5 -35t27.5 -5zM496 448h351q24 0 28 5t4 35 +t-4 35t-28 5h-351q-24 0 -27.5 -5t-3.5 -35t3.5 -35t27.5 -5zM496 48h351q24 0 28 5t4 35t-4 35t-28 5h-351q-24 0 -27.5 -5t-3.5 -35t3.5 -35t27.5 -5z" /> + <glyph glyph-name="uniE601" unicode="&#xe601;" +d="M389 776l-64 -26l40 -99q-77 -43 -120 -120l-99 40l-26 -64l98 -40q-13 -44 -13 -87t13 -87l-98 -40l26 -64l99 40q43 -76 120 -120l-40 -99l64 -26l40 98q43 -13 87 -13q43 0 87 13l40 -98l64 26l-40 99q77 43 120 120l99 -40l26 64l-98 40q13 44 13 87t-13 87l98 40 +l-26 64l-99 -40q-43 77 -120 120l40 99l-64 26l-40 -98q-44 13 -87 13t-87 -13zM516 622q100 0 170.5 -71t70.5 -171t-70.5 -170.5t-171 -70.5t-171 70.5t-70.5 171t70.5 171t171.5 70.5zM516 518q-57 0 -97.5 -40.5t-40.5 -97.5t40.5 -97.5t97.5 -40.5t97.5 40.5t40.5 97.5 +t-40.5 97.5t-97.5 40.5zM516 449q29 0 49 -20t20 -49t-20 -49t-49 -20t-49 20t-20 49t20 49t49 20z" /> + <glyph glyph-name="uniE602" unicode="&#xe602;" +d="M615 726h288v-175h-288v175zM470 160h-331v209h331v-209v0zM856 408q17 0 17 15v19q0 15 -17 15h-36v40h137q16 0 16 16v252q0 15 -16 15h-395q-17 0 -17 -15v-147h-359v-187h-108q-19 0 -19 -18v-298q0 -17 19 -17h157v-45h-41q-19 0 -19 -17v-22q0 -17 19 -17h222 +q19 0 19 17v22q0 17 -19 17h-42v45h157q19 0 19 17v299q0 17 -19 17h-292v139h306v-58q0 -15 17 -15h136v-40h-36q-17 0 -17 -15v-19q0 -15 17 -15h194v0z" /> + <glyph glyph-name="uniE603" unicode="&#xe603;" +d="M863 576q13 0 22.5 9.5t9.5 22.5v128q0 13 -9.5 22.5t-22.5 9.5h-703q-13 0 -22.5 -9.5t-9.5 -22.5v-128q0 -13 9.5 -22.5t22.5 -9.5h32v-96h-32q-13 0 -22.5 -9t-9.5 -23v-127q0 -14 9.5 -23t22.5 -9h32v-96h-32q-13 0 -22.5 -9.5t-9.5 -22.5v-128q0 -13 9.5 -22.5 +t22.5 -9.5h703q13 0 22.5 9.5t9.5 22.5v128q0 13 -9.5 22.5t-22.5 9.5h-32v96h32q13 0 22.5 9t9.5 23v127q0 14 -9.5 23t-22.5 9h-32v96h32zM256 576h511v-96h-511v96zM623 432h64v-96h-64v96zM480 432h64v-96h-64v96zM336 432h64v-96h-64v96zM623 720h64v-96h-64v96z +M480 720h64v-96h-64v96zM336 720h64v-96h-64v96zM192 720h64v-96h-64v96zM192 432h64v-96h-64v96zM192 145h64v-96h-64v96zM256 289h511v-96h-511v96zM336 145h64v-96h-64v96zM480 145h64v-96h-64v96zM623 145h64v-96h-64v96zM767 145h64v-96h-64v96zM767 432h64v-96h-64v96 +zM767 720h64v-96h-64v96z" /> + <glyph glyph-name="uniE604" unicode="&#xe604;" +d="M595 557l-2 218q3 18 1 30.5t-7.5 20.5t-11.5 13t-10 7l-5 2h-341q-11 0 -19 -7.5t-8 -18.5v-54l307 -2v-47l-307 -1v-54l307 -1v-48h-307v-370q0 -16 11.5 -27t28.5 -11h146l-2 350h219zM756 498h-318v-64l306 -1v-51h-306v-57h307v-60h-307v-312q0 -16 11.5 -27 +t27.5 -11h285q18 0 31 12.5t13 29.5v483q0 24 -12.5 38.5t-25.5 17.5zM714 136q-12 0 -20.5 8t-8.5 19.5t8.5 19.5t20.5 8t20 -8t8 -19.5t-8 -19.5t-20 -8z" /> + <glyph glyph-name="uniE605" unicode="&#xe605;" +d="M517 721l-55 -1q-144 -10 -243 -116t-99 -251q0 -100 49 -185t134 -134.5t185 -49.5q145 0 251 99.5t116 242.5l2 56h-340v339zM801 325q-11 -126 -100 -206t-213 -80q-130 0 -222 92t-92 222q0 124 80.5 213t206.5 99v-340h340zM545 776v-366h366q0 97 -49.5 181.5 +t-134 134.5t-182.5 50zM602 717q27 -4 66 -20q54 -23 98 -67t67 -98q15 -35 19 -65h-250v250z" /> + <glyph glyph-name="uniE606" unicode="&#xe606;" +d="M896 660h-765v81h765v-81zM896 505h-326v80h326v-80zM896 281h-326v80h326v-80zM896 19h-326v81h326v-81zM185 93l22 -25v466l-22 -26h204l-22 26v-466l22 25h-204zM443 16v28v513v28h-28h-256h-28v-28v-513v-28h28h256h28z" /> + <glyph glyph-name="uniE607" unicode="&#xe607;" +d="M685 637l-41 -44l169 -179h-445v-61h454l-178 -188l41 -44l244 258zM843 383l3 -4l-3 -4v8zM530 25h-382v717h382v-104h59v166h-499v-841h499v160h-59v-98z" /> + <glyph glyph-name="uniE608" unicode="&#xe608;" +d="M456 134q-15 26 -7 56t34 45l-38 66q-17 -10 -37 -10q-31 0 -52.5 22t-21.5 53h-77q0 -20 -10 -38q-15 -26 -45 -34t-56 7l-39 -66q18 -10 28 -27q15 -26 7 -56t-35 -45l39 -66q17 10 37 10q30 0 52 -22t22 -52h77q-1 19 9 37q16 26 45.5 34t56.5 -7l38 66q-17 10 -27 27 +v0zM295 92q-32 0 -55.5 23.5t-23.5 56t23.5 55.5t56 23t55.5 -23t23 -55.5t-23 -56t-56 -23.5v0zM152 455h288v288h-288v-288zM584 455h288v288h-288v-288zM584 27h288v288h-288v-288z" /> + <glyph glyph-name="uniE609" unicode="&#xe609;" +d="M238 254h270v-270h-270v270zM110 785h398v-398h-398v398zM643 254h270v-270h-270v270zM643 657h270v-270h-270v270z" /> + <glyph glyph-name="uniE60A" unicode="&#xe60a;" +d="M231 675h528v-212h106v317h-3h-631h-106v-105v-526v-105h221h11v105h-126v526zM848 207q-20 35 -9.5 74t45.5 59l-51 87q-22 -14 -48 -14q-41 0 -69.5 29t-28.5 69h-100q0 -26 -13 -49q-20 -35 -59 -45t-74 10l-51 -87q23 -13 36 -36q20 -34 9.5 -73t-45.5 -59l51 -87 +q22 13 48 13q41 0 69 -28.5t29 -68.5h100q0 26 13 48q20 35 59 45.5t74 -9.5l50 87q-22 12 -35 35zM637 153q-43 0 -73 30t-30 73t30 73t73 30t73.5 -30t30.5 -73t-30.5 -73t-73.5 -30z" /> + <glyph glyph-name="uniE60B" unicode="&#xe60b;" +d="M289 450h-159v-133h159v133zM894 450h-479v-133h479v133zM289 734h-159v-132h159v132zM894 734h-479v-132h479v132zM289 166h-159v-133h159v133zM894 166h-479v-133h479v133z" /> + <glyph glyph-name="uniE60C" unicode="&#xe60c;" +d="M59 640h522v-79h-522v79zM59 312h355v79h-355v-79zM65 128h-6v-79h224v79h-218zM770 692l-308 -507l149 -89l1 3l307 505zM437 136l-6 -176l154 88v0l-102 61zM984 758l-106 66q-17 11 -31 -5q0 -1 -1 -2t-2 -1l-40 -67l149 -89l39 65q5 9 3 18.5t-11 14.5z" /> + <glyph glyph-name="uniE60D" unicode="&#xe60d;" +d="M793 -66h-675v788h675v-788zM737 665h-563v-675h563v675zM343 834h-56v-112h56v112zM624 496h-337v-56h337v56zM624 328h-337v-56h337v56zM624 159h-337v-56h337v56zM906 834h-563v-56h563v56zM906 778h-56v-675h56v675zM850 159h-57v-56h57v56z" /> + <glyph glyph-name="uniE60E" unicode="&#xe60e;" +d="M915 471q-33 78 -93.5 138.5t-139.5 94.5q-81 34 -170 34t-170 -34q-79 -34 -139.5 -94.5t-93.5 -138.5q-35 -82 -35 -171t35 -171q33 -78 93.5 -138.5t139.5 -94.5q81 -34 170 -34t170 34q79 34 139.5 94.5t93.5 138.5q35 82 35 171t-35 171zM862 152q-29 -68 -82 -120 +q-4 -5 -10 -10q-10 23 -32.5 49.5t-55 53.5t-78 44.5t-93.5 17.5q-50 0 -96 -17t-78 -43.5t-53.5 -53.5t-30.5 -50l-9 9q-53 52 -82 120q-29 71 -29 148t29 148q29 68 81.5 120.5t120.5 81.5q71 30 148 30t148 -30q68 -29 120.5 -81.5t81.5 -120.5q29 -71 29 -148t-29 -148z +M512 507q-57 0 -101 -43t-44 -102t44 -102t101 -43q58 0 100.5 43t42.5 102.5t-42.5 102t-100.5 42.5z" /> + <glyph glyph-name="uniE60F" unicode="&#xe60f;" horiz-adv-x="1138" +d="M842 428l-301 -292l-301 292q-8 8 -19 7.5t-18.5 -8t-7.5 -18.5t8 -19l319 -310q8 -8 19 -8t19 8l319 310q8 8 8 19t-7.5 18.5t-18.5 8t-19 -7.5zM522 400q8 -8 19 -8t19 8l319 309q8 8 8 19t-7.5 19t-18.5 8t-19 -7l-301 -292l-301 292q-8 7 -19 7t-18.5 -8t-7.5 -19 +t8 -19z" /> + <glyph glyph-name="uniE610" unicode="&#xe610;" +d="M763 84q0 -20 -14.5 -34t-34.5 -14h-148v482h-75v-482h-172q-20 0 -34 14t-14 34v438h-75v-438q0 -51 36 -87t87 -36h395q51 0 87.5 36t36.5 87v441h-75v-441zM592 685v110h-150v-110h-320v-75h790v75h-320z" /> + <glyph glyph-name="uniE611" unicode="&#xe611;" +d="M706 297v65h-162v45h162v66l114 -88zM589 201h-206v367h206v-45h-161v-277h161v-45zM512 780q-108 0 -199 -53t-144 -144t-53 -198.5t53 -198t144 -143.5t198.5 -53t198.5 53t144 143.5t53 198t-53 198.5t-144 144t-198 53z" /> + <glyph glyph-name="uniE612" unicode="&#xe612;" horiz-adv-x="1048" +d="M696 325h2h18h16h31h1q9 0 11 9q8 36 14 61q8 29 36 30q15 1 21 -7q6 -7 3 -22l-3 -13q-5 -23 -13 -55l-1 -3h3h75h2l3 1l-1 2v1q5 22 8 33v1q4 15 11 47q7 38 -32 48q-12 3 -24 3q-45 0 -75 -28l-7 -7l2 10v3q0 2 1 3q1 7 2 11l1 3h-4h-23h-28h-22h-3h-2v-3 +q-5 -31 -18 -83l-9 -39v-1v-1l-1 -3h3q1 -1 2 -1zM920 363zM512 323q26 -3 47 -3h7q49 1 79 15q18 8 26 19l2 4h-22h-54q-3 0 -5 -3q-8 -9 -21 -12t-24 2q-16 7 -12 29q2 8 7 9q3 1 8 0h2h1h28h33h26h38h3h2v2v1q7 25 -3 42.5t-34 24.5q-51 15 -114 2l-27 -10 +q-36 -18 -45 -52q-13 -43 29 -63zM607.5 407q-3.5 -5 -14.5 -5h-52l1 4q5 18 18 26.5t30 4.5q14 -3 17 -14q4 -11 0.5 -16zM525.5 847q-94.5 0 -180 -36.5t-147.5 -98.5t-99 -148t-37 -180t37 -180t99 -148t147.5 -98.5t180 -36.5t180 36.5t147.5 98.5t99 148t37 180 +t-37 180t-99 148t-147.5 98.5t-180 36.5zM186 272q13 1 31 0q2 -1 5 -1q14 0 32 16q15 12 38 30v1q4 3 12.5 9.5t12.5 9.5q5 4 9 4q3 -1 7 -7q3 -4 8.5 -12.5t8.5 -12.5v-1q3 -5 10 -14.5t10 -14.5q4 -7 12 -7h42h20q18 2 28 0h3h4l4 1l-31 39q-36 47 -55 71l-1 1q-3 3 -3 7 +q0 3 4 5q12 9 36 27.5t36 27.5l27 20q7 8 18 14l9 7q4 3 12 9.5t11 8.5l6 5h-8q-23 -1 -62 0h-14h-19q-17 0 -21 -1l-19 -15q-9 -8 -28 -23.5t-28 -22.5q-3 -4 -7 -3t-7 5q-11 15 -34 45l-11 15h-109l5 -4q13 -15 35 -43q7 -8 21 -26q4 -4 11 -14h1q2 -3 6.5 -8.5t6.5 -8.5 +q4 -5 4 -8t-5 -7q-11 -9 -35 -27l-36 -27l-74 -60q-13 51 -13 102q0 112 55.5 207t150.5 150.5t207.5 55.5t207.5 -55t150.5 -150.5t55.5 -207.5t-55.5 -207.5t-150.5 -150.5t-207 -55q-141 0 -251 84.5t-147 216.5h58z" /> + <glyph glyph-name="uniE613" unicode="&#xe613;" +d="M789 707q-19 0 -32 -13.5t-13 -32.5t13 -32.5t32 -13.5t32.5 13.5t13.5 32.5t-13.5 32.5t-32.5 13.5zM789 358q-19 0 -32 -13t-13 -32t13 -32.5t32 -13.5t32.5 13.5t13.5 32.5t-13.5 32t-32.5 13zM907 582q0 -6 -7 -6h-770q-6 0 -6 6v157q0 7 6 7h770q7 0 7 -7v-157z +M900 803h-770q-26 0 -44.5 -18.5t-18.5 -45.5v-157q0 -26 18.5 -44.5t44.5 -18.5h770q27 0 45.5 18.5t18.5 44.5v157q0 27 -18.5 45.5t-45.5 18.5v0zM907 234q0 -7 -7 -7h-770q-6 0 -6 7v157q0 7 6 7h770q7 0 7 -7v-157zM553 61q9 -13 9 -28t-9 -27q-14 -19 -37.5 -19 +t-37.5 19q-9 12 -9 27t9 28l11 10q12 9 26.5 9t26.5 -9q6 -4 11 -10v0zM900 454h-770q-26 0 -44.5 -18.5t-18.5 -44.5v-157q0 -26 18.5 -44.5t44.5 -18.5h359v-48q-23 -7 -39.5 -23.5t-23.5 -38.5h-330q-11 0 -19 -8t-8 -19.5t8 -19.5t19 -8h330q9 -30 33.5 -48.5t56 -18.5 +t56 18.5t33.5 48.5h330q11 0 19 8t8 19.5t-8 19.5t-19 8h-330q-7 22 -23.5 38.5t-39.5 23.5v48h358q27 0 45.5 18.5t18.5 44.5v157q0 26 -18.5 44.5t-45.5 18.5v0z" /> + <glyph glyph-name="uniE614" unicode="&#xe614;" +d="M101 674h459v106h-459v-106zM101 331h230v106h-230v-106zM101 -12h825v106h-825v-106zM622 410l-149 166l-84 -77l235 -261l372 426l-81 76z" /> + <glyph glyph-name="uniE615" unicode="&#xe615;" horiz-adv-x="1051" +d="M0 -15h720v-50h-720v50zM0 691h191v-50h-191v50zM0 313h191v-51h-191v51zM804 284v0q82 87 82 205q0 126 -90.5 214.5t-218 88.5t-218 -88.5t-90.5 -214.5q0 -125 90.5 -214t217.5 -89q86 0 162 45l24 17l143 -164l41 35zM577.5 237q-106.5 0 -182 74t-75.5 178.5 +t75.5 178t182 73.5t182 -73.5t75.5 -178.5q-1 -104 -76 -178t-181.5 -74z" /> + <glyph glyph-name="uniE616" unicode="&#xe616;" +d="M589 399l251 251l31 31l-62 62l-31 -31l-251 -251l-251 251l-31 31l-62 -62l31 -31l251 -251l-251 -251l-31 -31l62 -62l31 31l251 251l251 -251l31 -31l62 62l-31 31z" /> + <glyph glyph-name="uniE617" unicode="&#xe617;" +d="M876 734l-505 -504l-220 292l-71 -53l251 -333l31 -41l36 35l540 542z" /> + </font> +</defs></svg> diff --git a/cyclone-web/vendor/fonts/iconfont.ttf b/cyclone-web/vendor/fonts/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1835a41b0fab9766f4471ec8d6d03df64ca87871 Binary files /dev/null and b/cyclone-web/vendor/fonts/iconfont.ttf differ diff --git a/cyclone-web/vendor/fonts/iconfont.woff b/cyclone-web/vendor/fonts/iconfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..8e43c4933467adc54ebd8a10d8e4d8a0c53e68b0 Binary files /dev/null and b/cyclone-web/vendor/fonts/iconfont.woff differ diff --git a/cyclone-web/vendor/fonts_tab/demo.css b/cyclone-web/vendor/fonts_tab/demo.css new file mode 100644 index 0000000000000000000000000000000000000000..3d9cbe76ad388b8e48eb2fb3482a04687050d55e --- /dev/null +++ b/cyclone-web/vendor/fonts_tab/demo.css @@ -0,0 +1,370 @@ +*{margin: 0;padding: 0;list-style: none;} +/* +KISSY CSS Reset +理念:1. reset 的目的不是清除浏览器的默认样式,这仅是部分工作。清除和重置是紧密不可分的。 +2. reset 的目的不是让默认样式在所有浏览器下一致,而是减少默认样式有可能带来的问题。 +3. reset 期望提供一套普适通用的基础样式。但没有银弹,推荐根据具体需求,裁剪和修改后再使用。 +特色:1. 适应中文;2. 基于最新主流浏览器。 +维护:玉伯<lifesinger@gmail.com>, 正淳<ragecarrier@gmail.com> + */ + +/** 清除内外边距 **/ +body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, /* structural elements 结构元素 */ +dl, dt, dd, ul, ol, li, /* list elements 列表元素 */ +pre, /* text formatting elements 文本格式元素 */ +form, fieldset, legend, button, input, textarea, /* form elements 表单元素 */ +th, td /* table elements 表格元素 */ { + margin: 0; + padding: 0; +} + +/** 设置默认字体 **/ +body, +button, input, select, textarea /* for ie */ { + font: 12px/1.5 tahoma, arial, \5b8b\4f53, sans-serif; +} +h1, h2, h3, h4, h5, h6 { font-size: 100%; } +address, cite, dfn, em, var { font-style: normal; } /* 将斜体扶正 */ +code, kbd, pre, samp { font-family: courier new, courier, monospace; } /* 统一等宽字体 */ +small { font-size: 12px; } /* 小于 12px 的中文很难阅读,让 small 正常化 */ + +/** 重置列表元素 **/ +ul, ol { list-style: none; } + +/** 重置文本格式元素 **/ +a { text-decoration: none; } +a:hover { text-decoration: underline; } + + +/** 重置表单元素 **/ +legend { color: #000; } /* for ie6 */ +fieldset, img { border: 0; } /* img 搭车:让链接里的 img 无边框 */ +button, input, select, textarea { font-size: 100%; } /* 使得表单元素在 ie 下能继承字体大小 */ +/* 注:optgroup 无法扶正 */ + +/** 重置表格元素 **/ +table { border-collapse: collapse; border-spacing: 0; } + +/* 清除浮动 */ +.ks-clear:after, .clear:after { + content: '\20'; + display: block; + height: 0; + clear: both; +} +.ks-clear, .clear { + *zoom: 1; +} + +.main { + padding: 30px 100px; +width: 960px; +margin: 0 auto; +} +.main h1{font-size:36px; color:#333; text-align:left;margin-bottom:30px; border-bottom: 1px solid #eee;} + +.helps{margin-top:40px;} +.helps pre{ + padding:20px; + margin:10px 0; + border:solid 1px #e7e1cd; + background-color: #fffdef; + overflow: auto; +} + +.icon_lists{ + width: 100% !important; + +} + +.icon_lists li{ + float:left; + width: 100px; + height:180px; + text-align: center; + list-style: none !important; +} +.icon_lists .icon{ + font-size: 42px; + line-height: 100px; + margin: 10px 0; + color:#333; + -webkit-transition: font-size 0.25s ease-out 0s; + -moz-transition: font-size 0.25s ease-out 0s; + transition: font-size 0.25s ease-out 0s; + +} +.icon_lists .icon:hover{ + font-size: 100px; +} + + + +.markdown { + color: #666; + font-size: 14px; + line-height: 1.8; +} + +.highlight { + line-height: 1.5; +} + +.markdown img { + vertical-align: middle; + max-width: 100%; +} + +.markdown h1 { + color: #404040; + font-weight: 500; + line-height: 40px; + margin-bottom: 24px; +} + +.markdown h2, +.markdown h3, +.markdown h4, +.markdown h5, +.markdown h6 { + color: #404040; + margin: 1.6em 0 0.6em 0; + font-weight: 500; + clear: both; +} + +.markdown h1 { + font-size: 28px; +} + +.markdown h2 { + font-size: 22px; +} + +.markdown h3 { + font-size: 16px; +} + +.markdown h4 { + font-size: 14px; +} + +.markdown h5 { + font-size: 12px; +} + +.markdown h6 { + font-size: 12px; +} + +.markdown hr { + height: 1px; + border: 0; + background: #e9e9e9; + margin: 16px 0; + clear: both; +} + +.markdown p, +.markdown pre { + margin: 1em 0; +} + +.markdown > p, +.markdown > blockquote, +.markdown > .highlight, +.markdown > ol, +.markdown > ul { + width: 80%; +} + +.markdown ul > li { + list-style: circle; +} + +.markdown > ul li, +.markdown blockquote ul > li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown > ul li p, +.markdown > ol li p { + margin: 0.6em 0; +} + +.markdown ol > li { + list-style: decimal; +} + +.markdown > ol li, +.markdown blockquote ol > li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown code { + margin: 0 3px; + padding: 0 5px; + background: #eee; + border-radius: 3px; +} + +.markdown pre { + border-radius: 6px; + background: #f7f7f7; + padding: 20px; +} + +.markdown pre code { + border: none; + background: #f7f7f7; + margin: 0; +} + +.markdown strong, +.markdown b { + font-weight: 600; +} + +.markdown > table { + border-collapse: collapse; + border-spacing: 0px; + empty-cells: show; + border: 1px solid #e9e9e9; + width: 95%; + margin-bottom: 24px; +} + +.markdown > table th { + white-space: nowrap; + color: #333; + font-weight: 600; + +} + +.markdown > table th, +.markdown > table td { + border: 1px solid #e9e9e9; + padding: 8px 16px; + text-align: left; +} + +.markdown > table th { + background: #F7F7F7; +} + +.markdown blockquote { + font-size: 90%; + color: #999; + border-left: 4px solid #e9e9e9; + padding-left: 0.8em; + margin: 1em 0; + font-style: italic; +} + +.markdown blockquote p { + margin: 0; +} + +.markdown .anchor { + opacity: 0; + transition: opacity 0.3s ease; + margin-left: 8px; +} + +.markdown .waiting { + color: #ccc; +} + +.markdown h1:hover .anchor, +.markdown h2:hover .anchor, +.markdown h3:hover .anchor, +.markdown h4:hover .anchor, +.markdown h5:hover .anchor, +.markdown h6:hover .anchor { + opacity: 1; + display: inline-block; +} + +.markdown > br, +.markdown > p > br { + clear: both; +} + + +.hljs { + display: block; + background: white; + padding: 0.5em; + color: #333333; + overflow-x: auto; +} + +.hljs-comment, +.hljs-meta { + color: #969896; +} + +.hljs-string, +.hljs-variable, +.hljs-template-variable, +.hljs-strong, +.hljs-emphasis, +.hljs-quote { + color: #df5000; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-type { + color: #a71d5d; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute { + color: #0086b3; +} + +.hljs-section, +.hljs-name { + color: #63a35c; +} + +.hljs-tag { + color: #333333; +} + +.hljs-title, +.hljs-attr, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #795da3; +} + +.hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.hljs-link { + text-decoration: underline; +} + +pre{ + background: #fff; +} + + + + + diff --git a/cyclone-web/vendor/fonts_tab/iconfont.css b/cyclone-web/vendor/fonts_tab/iconfont.css new file mode 100644 index 0000000000000000000000000000000000000000..5622ee50408fa33b409eb477243beb7e1fd8d617 --- /dev/null +++ b/cyclone-web/vendor/fonts_tab/iconfont.css @@ -0,0 +1,97 @@ +@font-face { + font-family: "conf"; + src: url("iconfont.eot?t=1522656243296"); /* IE9*/ + src: url("iconfont.eot?t=1522656243296#iefix") format("embedded-opentype"), + /* IE6-IE8 */ + url("data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAABJcAAsAAAAAH7AAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAAQwAAAFZW8EgiY21hcAAAAYAAAADMAAACmsJvoAdnbHlmAAACTAAADSgAABdQLQbNcWhlYWQAAA90AAAAMQAAADYRPU3iaGhlYQAAD6gAAAAgAAAAJAgtBDxobXR4AAAPyAAAACsAAABQUXf/+mxvY2EAAA/0AAAAKgAAACo8wDX6bWF4cAAAECAAAAAeAAAAIAEyAQpuYW1lAAAQQAAAAUMAAAI9ChTRrHBvc3QAABGEAAAA1wAAATN2y7wFeJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2BkEWacwMDKwMHUyXSGgYGhH0IzvmYwYuRgYGBiYGVmwAoC0lxTGBwYKp7JMDf8b2CIYW5kaAIKM4LkANuTC6cAeJzFkltuwjAQRY8hhUIDbRoQfeSjC2BhLCEL6VcXeLcB155ppa6AiU6UuRrZlk+AB2BpzqaD8kOh1rfT0vIl25Z3XNz3PLLw96yNBh01Xa9OZxV3o06t+63i6Z7Jz1frFl6r844r1l5lY7Y8eWLHnmdeGHhl9OCKu1W539b/q6+vv9MczJw4VOIbRUm1qKSaVFINK/HNo8QOUGITKLEXlLR8COpfoDGwNXQI6kl1DGwSnQI7RW+B7aL3wJ7RR0Bd+zOwezQFjDctLjbKeJztOFuQHNV193RPv6Z7erqnX7OzO4/u0U7va0aanUdrtdIu0q7QItCuzCIekiDgYGIqNkXJRiIYosXILonKAxKcSoIgxkVkV2JSiA8XVabAqeQjSUUVW0lFinEpEMd2KgjHVCinnJrpzbndM6tdhFwU35nqvudxzzl977n3nnPuEI6Q1bfZ19gsMcgIqZN5sp8Q4MfBU5k8uH6zxoyD5XKWY6qsX/ZdoezV2B3geLxpT7abFYcX+DSoUICGO9n2a4wPreYMMw2Tdh5gYDC3nBkeyrBPQTLrF74U7mW+BlaxPJSeqYY3TMyakyVDPKZkMgOZzG+JPMeJDJNIq/BZx5Y4KcmHL3LpnPVacZQpgjLg5266I1UazNxzsvlAftiRAFZWwBgsqV+f1XM6Po/mbCMzIGgpMZtLlTeZcOzf5ayh5Cs/JPijc11hf59dIQoZIAfIp8gxnKsKglWAyfYOaFaCil/B+UQz2wzlGvgudpfx1QvguDMQtJoVj89TJRd79RmYhl5PY9J2eoZqIJg8FUCb7cAtgKWDX1FxDvZkAO0a8AL7gGYCmEXL4lhWtkTZztvJgx5MjYUvj02BN7aVYbaOMYcRGkMmGKnuiykDEFIR2E9FInrIgKnfNdTwZdUwVNivGuHPn0xmMyC+IA1K4Ilg5iT4NgxkThjZrHEiM/BpBjhOUPK2nVc649sAto3D1vFubXwrIHxJNU31JVUH0FXmfCoTC+jqnrRhqnvGts6p9KPq7hiEfxr+5Isi6FnpDyUJ6lJOZyT0s0D9nCDoZxZxmaRxbzlkkJABcHXOtVxwW+5wy7XYhlV2rHJLbzWsBOnMsw93Tl55z52kP3alQxJk6XL3yctLly/DxcV3FxfDY4uL+J3Eamf1eOJm9nH8Rom0yT5cTdtJAV+u+FVoBx4vcLzpcHRRguF20x+uAetVKJgBh8O1GG4XgAoJH8ZVgfGHJPhU+KxuDibD03BvctAc0cL5YhFe00ZGR9LwWqkU7tZGrIG6GS6mZa2kwSvOriyc1UuarIVL1Unas4R4SYezzpyz1mPW2Trwr78u0IbfL4qXtHH9kigI4iV9XLskip3LyeRFwS3J4gVZviAkS65w0UTeBdEtJYWLsnyR8sQLySS6h/p7Cf1dJKOkSgL0g9vfs1aZnlR6NpsVv9yiO1WvAedO2pbu6s02lFuNYder7ADXMnm22zmA2x5qZTixoui6Al+j7XE44W0G2NxpsH+WVDqjKfh5tQpvdA5IKfZCil2Bqtf9da8KT+tZXRvQ4GlkMF/xqlOK1H2XMSSl89DT25TkwkJSoedwdRXXDXDdFslBch95iDxOyLA/g4Gj4uM5mmEw6mD8wdPkCDWgx8+0Keb3mCixAwKMOLiujgo9FirhXFkkUAGFZ3AatA0ijhEjpsp4NWZ9B8s3zIEJfyBXmq5ms9Xp6xDASN4wRrJ3HWeTUjU7N067mDt2U9AoHGxV5oeaSa3HQJVStrZtJAAIRqK2+x/riFdRbPcdTN/wW+u6zjSH5iutg4VGr5NaGp/LVqUke/yu7Ihh5EeA8mL1Um7AnxgwG2Yte8WexjzVt4ZtF9YRUESxK2MMV9b1EZLEPfOVRBH3zPoT+jnyDHmOnIlPqttqfOhpBTxeAY2PFS8NFR8XDbMFxkRe8CmHN4uIlinHtKfxQAqUY0/OImpRDo2QuG6UQ620ccWj4It5hMFU4lc2M5XNELRnmfYsOHaRsYsg+PQQ09jreJUZzC0mz3igz3f+moXOKvwkHKAvC2eP4g9ObOEVL5Foc6mEazmScBMvZU0vkeJaHOcq/GZBkoTNvOJyyEglPDMr8TcJkmO5KNJOJDwFeyXpfk40PFUfHtbSniEmZDnRo3UVaS4p/wjan2jjc3faAjNvmhiqTsGBebg0f6576dz8uXPwR/Pn5ufDd7O2x6W4gOPQ8hb68S0CHV+ATM/OSsKiIPVE6Mf5OhWp4xQ4br3I3XraM0VOljnRLKc1v6Kny4ZExyUZ5bRe8b2xILglCPZZBcsqmnEc/s0o36XIEMaGcbKV3IB5by060KjQ0oWGzpddz9cxVeECBS0HQx8euMYMLoov9IMHivDIDlwbCcHFIILxlR7Ovijzd+GR4gjASJFRi6NvP88w3Z+xACxMlQtfDu9M6Xrqu7T5qabAQUXTlPCMooXvF2zmN+xCwe7+AVNI5Bn43+/2JTGu+PluJu/7eWZ5tvsuAHMZ4LlcecfJk58HI09zEDZ/jjlryDRDMysDyPUksLdmZTkbkjURjDnKWk5yMFeMohc+S46S4+Qb5Dvkb8l50kWvtKIpWdGM9Chp6JELmm1ay1QEw+S9Sku3Z3F/oxwv1FXAxFHHM4AbttLE/RzU8aH706lHj20OfyyrGJ+usonRqo5HwTa52Pd6ZDIqOYIWNclSk5beM7kDPspA14wCgfbNbciXy/k+8lxmKFMqXRe12wESoiQreS+vyJKYYBL4XGFIXIL5zkc14KzXL7g9Ovzqxx5AbIB5457Rdnv0HnvX4i47LFIc3qbEMTWTUed4vstSBP6K57/IsKkk4LBl+kIyxaWG8JX7HDWdGvrtj2Mt80FjGVmm9H/D29RCWIzMXbEM/0ONhDt4PnyiZ/eXjq1nLq5lX2Z/wN5KdmMWvY3cTe7HHdwo0GKWUTEsV5pBO6BJfR3ZcnHHradpddqqMe1gBqtYWgizvareW0O4qxB2AXIcU9uujC/f7o6NFUfC92rb5bHl273R0dJI+DOo7pDHbrktotQ0TPhTtjHo3b48Jm+v3TkYLLTbC0MxCJ+NIXM0114IggX4Njumnk3uvHNxNF2aODJREM/IG8izQuLMBjrjM4+KzZtuHHLTo0uHdyYfhT1D1FK7e18McxsAwYqUrH4/McVWojtAhRAjLt/xQGJQZK9JPAaVPNvMVyr5zt/nK/DLqBUshKA6T5vwVITP0YY55a7hhIhr8SiNkXkzaZA5sofcSJZo7o1DbkuPgy63Fql7QVjf2B9gHWd8QMZAHvReLOLuoEVc+HVFh++BloL3I1JR9LBGO1OalqKdWP4+uq47pc3Aq+ECvNo5Cg77q+HrUT24i7bd92jLpLENd6wjvgxC+IvwhSuiWvgPlAXfgn8KJ8K9tCUEUxPWfwTrv3jmy+Qw3sUewNvYCjlFfo88S14kL5FvkTfI35Dvke8TvLwNY+bHKoLeyHo3MFycRnRTo1WEb+CcrZ5faH3LYvnClQO6XeOKJL7R4fmgNUh8RzP6V9jyVUjjKo6/htCou5HTR9xrG1zrEq5C1gzCkmhrYuGxmWVGc9LMkQOPFUTNFveJ4nXhLiWdVuB1JQ2Q9sOH4SR8/rFir3ffRrXbZE2zNe0LCJx0+p0Y3Iv6jqb9ZwxkCtLpDwGaBnOxxhdismcm4qJVOSaVDeAGHIhUgOXZQ3SUh249whTpkPZJlsSe0ORwJ4rJ8AZee3bCKWetb98H1Tpfol900tdqH4yxB4EOF8kN3Gu1Pal/3ahLYHUVL5DA/CPZjnETL/30roFhUfDbQZsuqWBHNE+vHnY7wJI3gk4kaUdCQQTYT++8mWPLufvybs19KAkwO1adYpnkPVbB38K2hrFhlLuGxq1N6pFBNrGwbWohgfn2/t2PS3CIOQ+HZsa2Z/44zcDgE7aDmjPjjvUgku3hSh3bTTnzMzkW0urxTVWqub9d2JJ53pk/vHO5/5/G/+eBj5cHVtifYvzl8P6joyNBkMA3fAkEsCIcwvAT2+Ed+K8gCMKFCO8zRDi8NzwKT+6Ff9sbvhgRz/dZhKiR7c+hbR1jXYH4ZAvusgVyC67OZ8jD5AR5ipymVfhazMIYRiM322oE5TqNbhi+oB8XBK9CCzuTD6JwEhfbceE9HV2Khtfhgnvluv+R8HW6NM/1+eyvdHeJiiIytsh/g1dOfzL/jKiEJvNMaPqt1lKzOYI1+0Sh8P6DtE6hTfjjaUlRpGnUgt95hXJfoQbC8xSFGuJCuIly4AcR/xq40m8Ohcci7inUZ1cUsTMiKjgUkd0iKp3rPzmqiM+wf9G9AVqLLXyeooOZKOxWdHoJwHT0Cm37FMLbFAqUF2JwPa2kMvKNMbUbYhJ6EM+V1MtRKyRHymQCb077e1nqkQ0rF7kNkyytwukScmurVoN41YYjb8eVBBc5nnKxHKd5zIqvtdy6FfkwC+vW5Z3OGHUzO0fd2jnPfhPHrCid97xqda5Wc3XLci2LuTfMUSn4MbbdJyiq0Q7AyQKVY5Y3CFxbGT0vRV9E77Df7MxG3/5nSfkXWuHg8xBQFdfapsTuU04rGcUu2bZGJT0qgl2orpzuaRztaUxHA6fO5tZqoSxxyRhWBDQm80SwiTMDNNLWoEX/YcW3QqDvlqCPOFchDHkzfIvjoPRmuY6jUiQV6uVfe+RPWC58q3u5XK9fX6+fjMEvNlDsCkq8SZVRQR9SUoM6WmC/+shfAoTI21PH54dARa9HyzH8UY+P2+b/AKu946h4nGNgZGBgAGIZvhz5eH6brwzcLAwgcO0Fy2cY/f/P/zqWIOZGIJeDgQkkCgAsRgwsAAAAeJxjYGRgYG7438AQw7Lq/5//f1mCGIAiKEAEALcBB3B4nGNhYGBgfsnAwMIAxf7//7D4g9j//7O4IImD8CpkPlCeAU0eiAGrHgi8AAAAAAAAdgEqAV4B4gI6AvwD7gR0BdwGeAa8BzoIfAjgCXwJqgqMC0ILqAAAeJxjYGRgYBBh+AfEIMAExFxAyMDwH8xnAAAlAAI9AAB4nF2Qu07DMBSG/7RpgVRiAIHE5gEhBFJ6YUB0rdTuHbq3qdOLkjhy3Ep9GkaegJGRp0Bi4UX4k552qC0ff+c/N8sArvALD/t1w7NnDz69PddwhjvhOnUl7HPfCzfQwqNwk/qLcIBnvAq3cI0ZO3j+Bb0nbIQ9nONduIZLfAjXqX8K++Qv4QZu8S3cpP4jHGCCP+EWHry3YGD11Om5mu3UKjJZbDIXlPdYLzbJ1JZYnom2xcpkqht2SnekM20PdcV20XMuVrE1qRqygU4So3Jr1jpy4dK5vN9ux6KHkUn5jAEsNKZwtHN+1ww72hUiGGSIK+uYd/DHzFvwOxLW2KN6uCeMWhSsL32FLkJ0jtERo1mVcTqvwJZde1Qd8xSPZU1KGsoLNCcmZIW8iq2pRNRDLKuqHH20ueOT/LCanv4DKWxhXgB4nG2OQVbDMAxErdAGmqSk0PAel/CCU3AAuICSqo7yEtnPsYHk9Lh0w6KznBl9jcrUVYW6rQYyuIMNbCGHe3iAHRRQQgV7eIQaDvAEz3CEBl4U/OyNFXNCmXsSx9XAZxTjiNeet+/eRlevfRy4Q7tGO/AYy9RsiQcmH7OPz0OyF0rtPt1d8sKhx4kC+fk4cuwS1/yL8z/oW3l9MdkWJe8uITUoOC6Bu1knwwc9L1P7egOhO+uWKrlf3oo+2W/ZofFEE0nYiA1UO2RJA7TDkUIgpX4BMWJYwgA=") + format("woff"), + url("iconfont.ttf?t=1522656243296") format("truetype"), + /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ + url("iconfont.svg?t=1522656243296#conf") format("svg"); /* iOS 4.1- */ +} + +.conf { + font-family: "conf" !important; + font-size: 14px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-gongdanshenpi:before { + content: "\e601"; +} + +.icon-jifangpeizhi:before { + content: "\e602"; +} + +.icon-Group:before { + content: "\e603"; +} + +.icon-zhujicaozuojilu:before { + content: "\e604"; +} + +.icon-shebeijieru:before { + content: "\e605"; +} + +.icon-ST:before { + content: "\e606"; +} + +.icon-zuoyezhihangjilu:before { + content: "\e607"; +} + +.icon-parameters:before { + content: "\e608"; +} + +.icon-zuoyezhihangjilu1:before { + content: "\e609"; +} + +.icon-liuchengzhihangjilu:before { + content: "\e611"; +} + +.icon-Group1:before { + content: "\e613"; + font-size: 20px; +} + +.icon-peizhimoban:before { + content: "\e614"; +} + +.icon-change:before { + content: "\e615"; +} + +.icon-analytics-chart-symb:before { + content: "\e617"; +} + +.icon-liuchengzhihangjilu-copy:before { + content: "\e618"; +} + +.icon-chevron-down:before { + content: "\e619"; +} + +.icon-agreement:before { + content: "\e61a"; +} + +.icon-note:before { + content: "\e61b"; +} + +.icon-painter-palette:before { + content: "\e61c"; + font-size: 20px; +} diff --git a/cyclone-web/vendor/fonts_tab/iconfont.eot b/cyclone-web/vendor/fonts_tab/iconfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..cbc78d9fa50a2f112d10a9c7a94bdf068090d120 Binary files /dev/null and b/cyclone-web/vendor/fonts_tab/iconfont.eot differ diff --git a/cyclone-web/vendor/fonts_tab/iconfont.js b/cyclone-web/vendor/fonts_tab/iconfont.js new file mode 100644 index 0000000000000000000000000000000000000000..578542f15cd3a216b98f24f5f8035a38df3cc338 --- /dev/null +++ b/cyclone-web/vendor/fonts_tab/iconfont.js @@ -0,0 +1 @@ +(function(window){var svgSprite='<svg><symbol id="icon-gongdanshenpi" viewBox="0 0 1024 1024"><path d="M877.714286 453.485714c-20.187429 0-36.571429 19.675429-36.571429 43.885715v131.657142c0 24.210286 16.384 43.885714 36.571429 43.885715s36.571429-19.675429 36.571428-43.885715V497.371429c0-24.210286-16.384-43.885714-36.571428-43.885715z m20.48-103.497143a27.062857 27.062857 0 0 0-6.582857-3.291428 36.571429 36.571429 0 0 0-39.862858 7.68 36.571429 36.571429 0 1 0 51.931429 0l-5.485714-4.388572z" fill="#D7E5FD" ></path><path d="M813.714286 102.4h-33.499429C780.214857 45.860571 735.085714 0 679.643429 0H344.356571c-55.588571 0-100.571429 45.860571-100.571428 102.4h-33.499429C155.794286 102.4 111.177143 146.578286 109.714286 202.093714v722.212572C111.177143 979.821714 155.794286 1024 210.285714 1024h603.428572c54.491429 0 99.108571-44.178286 100.571428-99.693714v-173.348572a33.865143 33.865143 0 0 0-33.499428-34.157714 33.865143 33.865143 0 0 0-33.572572 34.157714v173.348572a33.792 33.792 0 0 1-33.499428 31.451428h-603.428572a33.792 33.792 0 0 1-33.499428-31.451428V202.093714a33.792 33.792 0 0 1 33.499428-31.451428h33.499429c0 56.612571 45.056 102.4 100.571428 102.4h335.286858c55.588571 0 100.571429-45.787429 100.571428-102.4h33.499429c17.554286 0 32.182857 13.677714 33.499428 31.451428v70.948572c0 18.870857 15.067429 34.157714 33.572572 34.157714a33.865143 33.865143 0 0 0 33.499428-34.157714v-70.948572A101.449143 101.449143 0 0 0 813.714286 102.4z m-100.571429 68.242286a33.865143 33.865143 0 0 1-33.499428 34.157714H344.356571a33.865143 33.865143 0 0 1-33.499428-34.157714V102.4c0-18.870857 14.994286-34.157714 33.499428-34.157714h335.286858c18.505143 0 33.499429 15.36 33.499428 34.157714v68.242286z" fill="#D7E5FD" ></path><path d="M712.777143 448.950857L447.049143 729.965714 309.101714 600.137143a33.499429 33.499429 0 0 0-43.666285 1.536 29.257143 29.257143 0 0 0-1.682286 41.398857l160.841143 152.356571a33.060571 33.060571 0 0 0 22.454857 9.142858 32.914286 32.914286 0 0 0 23.186286-10.020572l289.499428-304.713143a29.403429 29.403429 0 0 0-2.413714-43.154285 33.499429 33.499429 0 0 0-45.494857 2.267428h0.950857z" fill="#D7E5FD" ></path></symbol><symbol id="icon-jifangpeizhi" viewBox="0 0 1024 1024"><path d="M0 0v1024h1024V0H0z m68.292923 78.769231h887.414154v236.307692H68.292923V78.769231z m887.414154 866.461538H68.292923V708.923077h887.414154v236.307692zM68.292923 630.153846V393.846154h887.414154v236.307692H68.292923z m682.614154-472.615384h136.585846v78.76923H750.907077V157.538462z m136.585846 315.076923v78.76923H750.907077V472.615385h136.585846z m-136.585846 393.846153v-78.76923h136.585846v78.76923H750.907077z" fill="#D7E5FD" ></path></symbol><symbol id="icon-Group" viewBox="0 0 1103 1024"><path d="M551.384615 78.769231c17.723077 0 30.956308 3.702154 37.021539 6.931692L945.230769 275.771077l-356.824615 189.833846A84.992 84.992 0 0 1 551.384615 472.615385c-17.644308 0-30.877538-3.702154-36.942769-6.931693L157.538462 275.692308l356.903384-189.991385c6.065231-3.229538 19.298462-6.931692 37.021539-6.931692z m0-78.769231c-27.569231 0-55.138462 5.198769-76.091077 15.675077L31.428923 237.646769c-41.905231 20.952615-41.905231 55.138462 0 76.091077l443.785846 221.971692C496.246154 546.185846 523.815385 551.384615 551.384615 551.384615c27.569231 0 55.138462-5.198769 76.091077-15.675077l443.785846-221.971692c41.905231-20.952615 41.905231-55.138462 0-76.091077L627.554462 15.675077C606.601846 5.198769 579.032615 0 551.463385 0z" fill="#D7E5FD" ></path><path d="M551.384615 787.692308c-33.870769 0-67.741538-6.774154-94.838153-20.164923L23.473231 552.487385a42.062769 42.062769 0 0 1-18.904616-56.556308 42.535385 42.535385 0 0 1 56.871385-18.904615l433.073231 215.197538c29.853538 14.808615 83.968 14.808615 113.821538 0l433.073231-215.118769a42.535385 42.535385 0 0 1 56.871385 18.904615 41.984 41.984 0 0 1-18.983385 56.477539l-433.073231 215.04A218.190769 218.190769 0 0 1 551.384615 787.692308z" fill="#D7E5FD" ></path><path d="M551.384615 1024c-33.870769 0-67.741538-6.774154-94.838153-20.164923L23.630769 788.716308a41.747692 41.747692 0 0 1-19.062154-56.477539 42.692923 42.692923 0 0 1 56.950154-18.904615l433.073231 215.197538c29.853538 14.808615 83.968 14.808615 113.821538 0l433.073231-215.118769a42.535385 42.535385 0 0 1 56.871385 18.904615 42.062769 42.062769 0 0 1-18.983385 56.477539l-433.073231 215.04C619.204923 1017.304615 585.334154 1024 551.384615 1024z" fill="#D7E5FD" ></path></symbol><symbol id="icon-zhujicaozuojilu" viewBox="0 0 1103 1024"><path d="M1020.612138 0H82.156244C36.863972 0 0 35.918742 0 80.029477v660.873338c0 44.110735 36.863972 80.029477 82.156244 80.029477h387.701856v145.329119H342.488352a29.45967 29.45967 0 0 0-29.617208 28.908285c0 15.753834 13.390759 28.829516 29.617208 28.829516h417.240294a29.45967 29.45967 0 0 0 29.617208-28.829516c0-15.753834-13.390759-28.908285-29.617208-28.908285h-126.818364v-145.329119h387.701856c45.292273 0 82.156244-35.918742 82.156244-80.029477V79.556862C1102.768382 35.367357 1065.904411 0 1020.612138 0zM81.526091 57.737802H1020.060754c12.287991 0 22.370444 9.767377 22.370444 21.740291v530.274053H59.234416V79.478093c0-11.972914 10.003685-21.740291 22.291675-21.740291z m492.228545 907.42084h-44.740889v-145.329119h44.740889v145.407888z m446.857502-202.988151H82.156244a22.134137 22.134137 0 0 1-22.370444-21.819061V667.962563H1042.903813v72.467637a22.134137 22.134137 0 0 1-22.370444 21.740291z" fill="#D7E5FD" ></path></symbol><symbol id="icon-shebeijieru" viewBox="0 0 1024 1024"><path d="M774.431716 729.596581l-51.199195-51.199196c25.599598-38.399397 44.762725-83.162122 44.762725-134.434459 0-70.362323-31.962926-134.361317-83.162122-172.760713l25.599598-51.199196h25.599598a158.424939 158.424939 0 0 0 159.960915-160.034057A158.424939 158.424939 0 0 0 736.03232 0.008046a158.424939 158.424939 0 0 0-160.034057 159.960914c0 57.635666 32.036068 102.398391 70.435465 134.434459l-19.23627 44.762726c-25.599598-12.799799-51.199195-19.163127-83.162121-19.163128-121.63466 0-224.033051 102.398391-224.033051 223.959909 0 32.036068 6.43647 57.635666 19.236269 83.235264l-44.835867 19.163127c-32.036068-38.399397-76.798793-70.362323-134.434459-70.362323A158.424939 158.424939 0 0 0 0.007314 735.959909c0 89.598592 70.435465 160.034057 159.960915 160.034057a158.424939 158.424939 0 0 0 160.034057-160.034057v-25.599598l51.199195-25.599597c38.399397 51.199195 102.398391 83.235263 172.833856 83.235263 51.199195 0 95.961921-19.236269 134.361317-44.835867l51.199195 51.199196c-12.799799 25.599598-25.599598 57.635666-25.599597 89.671734 0 89.52545 70.435465 159.960915 160.034056 159.960914A158.424939 158.424939 0 0 0 1023.991223 864.03104a158.424939 158.424939 0 0 0-159.960915-160.034057c-32.036068 0-63.998994 12.799799-89.598592 25.599598z m-38.472538-665.589541c51.199195 0 96.035062 44.762725 96.035062 95.96192 0 51.199195-44.835867 96.035062-96.035062 96.035063S639.997257 211.168156 639.997257 159.96896 684.759982 64.00704 735.959178 64.00704z m-575.990949 767.987932c-51.199195 0-95.961921-44.835867-95.96192-96.035063S108.769034 639.997989 159.968229 639.997989c51.199195 0 96.035062 44.762725 96.035062 95.96192 0 51.199195-44.835867 96.035062-96.035062 96.035063zM384.00128 543.962926c0-89.598592 70.362323-159.960915 159.960915-159.960915 89.598592 0 160.034057 70.362323 160.034057 159.960915a158.424939 158.424939 0 0 1-159.960915 160.034057A158.424939 158.424939 0 0 1 384.00128 543.962926z m480.029028 416.030034c-51.199195 0-96.035062-44.835867-96.035062-95.96192 0-51.199195 44.835867-96.035062 96.035062-96.035063s95.961921 44.835867 95.961921 96.035063-44.762725 95.961921-95.961921 95.96192z" fill="#D7E5FD" ></path></symbol><symbol id="icon-ST" viewBox="0 0 1092 1024"><path d="M0 0v887.466667h546.133333V546.133333h273.066667V477.866667h68.266667V0H0z m59.1872 68.266667h769.092267v204.8H59.1872V68.266667zM546.133333 819.2H59.1872V614.4H546.133333v204.8zM59.1872 546.133333V341.333333h769.092267v204.8H59.1872z m591.598933-409.6h118.3744v68.266667H650.786133V136.533333z m118.3744 273.066667v68.266667H650.786133V409.6h118.3744z" fill="#D7E5FD" ></path><path d="M1038.5408 684.714667h-47.104a209.032533 209.032533 0 0 0-18.090667-45.397334l33.1776-34.269866a16.452267 16.452267 0 0 0 0-22.801067l-53.589333-55.296a15.36 15.36 0 0 0-22.050133 0l-33.1776 34.269867a195.720533 195.720533 0 0 0-44.032-18.773334v-48.469333A15.9744 15.9744 0 0 0 838.0416 477.866667h-75.776a15.9744 15.9744 0 0 0-15.701333 16.110933v48.469333a195.7888 195.7888 0 0 0-43.963734 18.773334l-33.245866-34.133334a15.36 15.36 0 0 0-21.981867 0l-53.6576 55.296a16.657067 16.657067 0 0 0 0 22.7328l33.245867 34.269867a208.896 208.896 0 0 0-18.158934 45.397333h-47.104a15.9744 15.9744 0 0 0-15.5648 16.110934v78.2336c0 8.8064 7.031467 16.042667 15.633067 16.042666h47.035733c4.3008 16.042667 10.4448 31.266133 18.158934 45.397334l-33.245867 34.269866a16.657067 16.657067 0 0 0 0 22.801067l53.6576 55.296a15.36 15.36 0 0 0 21.981867 0l33.245866-34.269867c13.653333 7.9872 28.4672 14.336 44.032 18.773334v48.469333c0 8.874667 7.031467 16.110933 15.5648 16.110933h75.844267a15.9744 15.9744 0 0 0 15.633067-16.110933v-48.469333c15.496533-4.5056 30.242133-10.786133 44.032-18.773334l33.1776 34.269867a15.36 15.36 0 0 0 22.050133 0l53.589333-55.296a16.452267 16.452267 0 0 0 0-22.801067l-33.1776-34.269866a208.896 208.896 0 0 0 18.158934-45.397334h47.035733a15.9744 15.9744 0 0 0 15.5648-16.042666v-78.2336a15.9744 15.9744 0 0 0-15.5648-16.1792z m-98.986667 96.119466c-3.072 11.195733-7.304533 21.845333-12.629333 31.675734l-19.114667 34.816-33.792 19.6608c-9.489067 5.5296-19.729067 9.898667-30.651733 12.970666l-37.341867 10.786134-37.341866-10.717867a135.304533 135.304533 0 0 1-30.72-12.970667l-33.723734-19.797333-19.114666-34.816a142.472533 142.472533 0 0 1-12.561067-31.607467l-10.376533-38.5024 10.4448-38.5024c3.003733-11.127467 7.236267-21.845333 12.629333-31.607466l19.114667-34.816 33.723733-19.729067c9.557333-5.461333 19.797333-9.898667 30.72-12.970667l37.2736-10.786133 37.341867 10.786133c10.8544 3.072 21.162667 7.509333 30.72 12.970667l33.723733 19.729067 19.114667 34.816c5.393067 9.762133 9.557333 20.343467 12.629333 31.607466l10.4448 38.5024-10.581333 38.5024zM709.973333 746.837333c0 54.203733 42.5984 98.304 95.300267 98.304 52.565333 0 95.300267-44.032 95.300267-98.304 0-54.340267-42.5984-98.304-95.300267-98.304-52.565333 0-95.300267 43.963733-95.300267 98.304z m96.529067 35.498667a35.6352 35.6352 0 0 1-35.089067-36.181333c0-20.002133 15.701333-36.181333 35.089067-36.181334 19.387733 0 35.089067 16.1792 35.089067 36.181334 0 20.002133-15.701333 36.181333-35.089067 36.181333z" fill="#D7E5FD" ></path></symbol><symbol id="icon-zuoyezhihangjilu" viewBox="0 0 1024 1024"><path d="M713.508571 0H315.977143c-39.862857 0-72.192 30.866286-72.192 68.900571v749.714286c0 38.034286 32.329143 68.827429 72.192 68.827429h526.189714c39.789714 0 72.118857-30.866286 72.118857-68.827429V223.817143L713.508571 0z m-24.576 286.500571h158.281143v531.017143a6.144 6.144 0 0 1-4.461714 1.682286h-527.36c-2.486857 0-4.096-1.097143-4.534857-1.682286V70.070857c0.438857-0.658286 2.194286-1.828571 4.534857-1.828571H627.565714v157.257143c0 33.645714 27.574857 61.001143 61.366857 61.001142z m4.096-61.220571V88.722286L827.099429 225.28H693.028571zM407.990857 341.357714c-16.603429 0-30.061714 15.36-30.061714 34.084572 0 18.797714 13.458286 34.157714 29.988571 34.157714h208.091429c16.603429 0 30.061714-15.36 30.061714-34.157714s-13.458286-34.084571-29.988571-34.084572H407.917714zM377.929143 512c0 18.797714 12.8 34.157714 28.525714 34.157714h345.234286c15.725714 0 28.525714-15.36 28.525714-34.157714s-12.8-34.157714-28.525714-34.157714h-345.234286c-15.725714 0-28.525714 15.36-28.525714 34.157714zM109.714286 989.842286C109.714286 1024 133.12 1024 161.938286 1024h633.051428c28.745143 0 52.224 0 52.224-34.157714 0-34.084571-23.405714-34.084571-52.224-34.084572H176.786286V102.4C176.786286 68.242286 143.213714 68.242286 143.213714 68.242286S109.714286 68.242286 109.714286 102.4v887.442286zM616.009143 614.4H407.990857c-16.603429 0-30.061714 15.36-30.061714 34.157714s13.458286 34.084571 29.988571 34.084572h208.091429c16.603429 0 30.061714-15.36 30.061714-34.084572 0-18.797714-13.458286-34.157714-29.988571-34.157714z" fill="#D7E5FD" ></path></symbol><symbol id="icon-parameters" viewBox="0 0 1024 1024"><path d="M256 192.672V96c0-52.928-43.072-96-96-96S64 43.072 64 96v96.672C25.344 221.952 0 267.808 0 320s25.344 98.048 64 127.264V928c0 52.928 43.072 96 96 96s96-43.072 96-96V447.264c38.656-29.184 64-75.072 64-127.264s-25.344-98.048-64-127.328zM128 96a32 32 0 1 1 64 0v67.2a161.984 161.984 0 0 0-64 0V96z m64 832a32 32 0 1 1-64 0V476.736a157.312 157.312 0 0 0 64 0V928z m59.68-581.12c-0.512 1.696-0.96 3.36-1.568 5.056a94.208 94.208 0 0 1-12.096 23.552l-0.448 0.512a96.832 96.832 0 0 1-19.712 20.064l-0.32 0.256c-7.712 5.824-16.32 10.496-25.568 13.76-10.016 3.616-20.672 5.92-31.968 5.92s-21.952-2.304-32-5.952a94.784 94.784 0 0 1-25.568-13.76l-0.32-0.256a96.832 96.832 0 0 1-19.712-20.064l-0.448-0.512a95.328 95.328 0 0 1-12.096-23.552c-0.608-1.696-1.056-3.36-1.568-5.056A94.24 94.24 0 0 1 64 320c0-9.44 1.76-18.368 4.32-26.944 0.512-1.696 0.96-3.36 1.568-4.992 3.008-8.448 6.912-16.448 12.096-23.616l0.448-0.512c5.568-7.552 12.192-14.368 19.712-20.064l0.32-0.256c7.68-5.728 16.288-10.432 25.536-13.728C138.048 226.304 148.704 224 160 224s21.952 2.304 32 5.888c9.248 3.328 17.856 8 25.568 13.76l0.32 0.256c7.52 5.696 14.144 12.512 19.712 20.064l0.448 0.512a93.792 93.792 0 0 1 13.632 28.576c2.56 8.576 4.32 17.504 4.32 26.944 0 9.376-1.76 18.304-4.32 26.88zM960 192.672V96c0-52.928-43.072-96-96-96s-96 43.072-96 96v96.672c-38.688 29.28-64 75.136-64 127.328s25.312 98.048 64 127.264V928c0 52.928 43.072 96 96 96s96-43.072 96-96V447.264c38.624-29.184 64-75.072 64-127.264s-25.376-98.048-64-127.328zM832 96a32 32 0 1 1 64 0v67.2a162.464 162.464 0 0 0-64 0V96z m64 832a32 32 0 1 1-64 0V476.736a156.864 156.864 0 0 0 64 0V928z m59.68-581.12c-0.512 1.696-0.992 3.36-1.568 5.056a94.304 94.304 0 0 1-12.128 23.552l-0.448 0.512a97.472 97.472 0 0 1-19.68 20.064l-0.32 0.256c-7.744 5.824-16.32 10.496-25.568 13.76A93.824 93.824 0 0 1 864 416a93.12 93.12 0 0 1-32-5.952 94.304 94.304 0 0 1-25.888-14.016 96.192 96.192 0 0 1-19.744-20.064l-0.448-0.512a95.2 95.2 0 0 1-12.064-23.552c-0.64-1.696-1.056-3.36-1.568-5.056A94.24 94.24 0 0 1 768 320c0-9.44 1.76-18.368 4.32-26.944 0.512-1.696 0.928-3.36 1.568-4.992 3.008-8.448 6.944-16.448 12.064-23.616l0.448-0.512c5.568-7.552 12.192-14.368 19.744-20.064l0.32-0.256c7.68-5.76 16.32-10.432 25.568-13.76A95.04 95.04 0 0 1 864 224c11.264 0 21.952 2.304 32 5.888a98.976 98.976 0 0 1 25.888 14.016c7.488 5.696 14.112 12.512 19.68 20.064l0.448 0.512c5.184 7.2 9.056 15.2 12.128 23.616 0.576 1.632 1.056 3.328 1.568 4.992 2.528 8.544 4.288 17.472 4.288 26.912 0 9.376-1.76 18.304-4.32 26.88zM608 576.672V96c0-52.928-43.072-96-96-96s-96 43.072-96 96v480.672c-38.656 29.248-64 75.136-64 127.328s25.344 98.048 64 127.264V928c0 52.928 43.072 96 96 96s96-43.072 96-96v-96.736c38.624-29.184 64-75.072 64-127.264s-25.376-98.048-64-127.328zM480 96a32 32 0 1 1 64 0v451.2a161.984 161.984 0 0 0-64 0V96z m64 832a32 32 0 1 1-64 0v-67.264a157.312 157.312 0 0 0 64 0V928z m59.68-197.12c-0.512 1.696-0.992 3.36-1.568 5.056a94.304 94.304 0 0 1-12.128 23.552l-0.448 0.512a97.472 97.472 0 0 1-19.68 20.064l-0.32 0.256c-7.744 5.824-16.32 10.496-25.568 13.76A93.824 93.824 0 0 1 512 800c-11.296 0-21.952-2.304-32-5.952a94.784 94.784 0 0 1-25.568-13.76l-0.32-0.256a96.832 96.832 0 0 1-19.712-20.064l-0.448-0.512a95.328 95.328 0 0 1-12.096-23.552c-0.608-1.696-1.056-3.36-1.568-5.056A94.24 94.24 0 0 1 416 704c0-9.44 1.76-18.368 4.32-26.944 0.512-1.696 0.96-3.36 1.568-4.992 3.04-8.448 6.944-16.448 12.096-23.616l0.448-0.512c5.568-7.552 12.192-14.368 19.712-20.064l0.32-0.256c7.712-5.76 16.32-10.432 25.568-13.76 10.016-3.552 20.672-5.856 31.968-5.856 11.264 0 21.952 2.304 32 5.888a98.976 98.976 0 0 1 25.888 14.016c7.488 5.696 14.112 12.512 19.68 20.064l0.448 0.512c5.184 7.2 9.056 15.2 12.128 23.616 0.576 1.632 1.056 3.328 1.568 4.992 2.528 8.544 4.288 17.472 4.288 26.912 0 9.376-1.76 18.304-4.32 26.88z" fill="#D7E5FD" ></path></symbol><symbol id="icon-zuoyezhihangjilu1" viewBox="0 0 1024 1024"><path d="M713.508571 0H315.977143c-39.862857 0-72.192 30.866286-72.192 68.900571v749.714286c0 38.034286 32.329143 68.827429 72.192 68.827429h526.189714c39.789714 0 72.118857-30.866286 72.118857-68.827429V223.817143L713.508571 0z m-24.576 286.500571h158.281143v531.017143a6.144 6.144 0 0 1-4.461714 1.682286h-527.36c-2.486857 0-4.096-1.097143-4.534857-1.682286V70.070857c0.438857-0.658286 2.194286-1.828571 4.534857-1.828571H627.565714v157.257143c0 33.645714 27.574857 61.001143 61.366857 61.001142z m4.096-61.220571V88.722286L827.099429 225.28H693.028571zM407.990857 341.357714c-16.603429 0-30.061714 15.36-30.061714 34.084572 0 18.797714 13.458286 34.157714 29.988571 34.157714h208.091429c16.603429 0 30.061714-15.36 30.061714-34.157714s-13.458286-34.084571-29.988571-34.084572H407.917714zM377.929143 512c0 18.797714 12.8 34.157714 28.525714 34.157714h345.234286c15.725714 0 28.525714-15.36 28.525714-34.157714s-12.8-34.157714-28.525714-34.157714h-345.234286c-15.725714 0-28.525714 15.36-28.525714 34.157714zM109.714286 989.842286C109.714286 1024 133.12 1024 161.938286 1024h633.051428c28.745143 0 52.224 0 52.224-34.157714 0-34.084571-23.405714-34.084571-52.224-34.084572H176.786286V102.4C176.786286 68.242286 143.213714 68.242286 143.213714 68.242286S109.714286 68.242286 109.714286 102.4v887.442286zM616.009143 614.4H407.990857c-16.603429 0-30.061714 15.36-30.061714 34.157714s13.458286 34.084571 29.988571 34.084572h208.091429c16.603429 0 30.061714-15.36 30.061714-34.084572 0-18.797714-13.458286-34.157714-29.988571-34.157714z" fill="#D7E5FD" ></path></symbol><symbol id="icon-liuchengzhihangjilu" viewBox="0 0 1024 1024"><path d="M840.411429 453.485714h0.731428c36.571429 0 29.257143 42.861714 29.257143 58.514286v176.786286a142.262857 142.262857 0 1 1-129.828571 239.762285c-55.588571-55.588571-55.588571-145.554286 0-201.142857 20.260571-20.260571 45.202286-33.133714 71.314285-38.619428V523.190857c0-2.706286-0.219429-6.582857-0.365714-11.190857H541.257143v176.786286a142.262857 142.262857 0 1 1-129.828572 239.762285c-55.588571-55.588571-55.588571-145.554286 0-201.142857 20.260571-20.260571 45.202286-33.133714 71.314286-38.619428V512H211.236571c0.585143 4.608 0.877714 8.484571 0.877715 11.190857v165.595429a142.262857 142.262857 0 1 1-129.828572 239.762285c-55.588571-55.588571-55.588571-145.554286 0-201.142857 20.260571-20.260571 45.202286-33.133714 71.314286-38.619428V512c0-21.942857 9.142857-58.514286 29.257143-58.514286a11.190857 11.190857 0 0 1 0.804571 0H482.742857V329.362286a142.262857 142.262857 0 0 1-71.314286-239.762286A142.262857 142.262857 0 1 1 541.257143 329.362286V453.485714h299.081143zM447.926857 126.171429a90.477714 90.477714 0 1 0 128 128 90.477714 90.477714 0 0 0-128-128z m0 640a90.477714 90.477714 0 1 0 128 128 90.477714 90.477714 0 0 0-128-128z m-329.142857 0a90.477714 90.477714 0 0 0 128 128 90.477714 90.477714 0 1 0-128-128z m658.285714 0a90.477714 90.477714 0 1 0 128 128 90.477714 90.477714 0 0 0-128-128z" fill="#D7E5FD" ></path></symbol><symbol id="icon-Group1" viewBox="0 0 1194 1024"><path d="M125.098667 512c0 43.861333 30.549333 79.701333 67.754666 79.701333h820.394667c37.205333 0 67.584-35.84 67.584-79.701333s-30.378667-79.701333-67.584-79.701333H192.853333c-37.205333 0-67.754667 35.84-67.754666 79.701333zM125.098667 853.333333c0 43.861333 30.549333 79.701333 67.754666 79.701334h820.394667c37.205333 0 67.584-35.84 67.584-79.701334s-30.378667-79.701333-67.584-79.701333H192.853333c-37.205333 0-67.754667 35.84-67.754666 79.701333zM125.098667 170.666667c0 43.861333 30.549333 79.701333 67.754666 79.701333h820.394667c37.205333 0 67.584-35.84 67.584-79.701333S1050.453333 90.965333 1013.248 90.965333H192.853333C155.648 90.965333 125.098667 126.805333 125.098667 170.666667z" fill="#D7E5FD" ></path></symbol><symbol id="icon-peizhimoban" viewBox="0 0 1024 1024"><path d="M0 29.257143v321.828571a29.257143 29.257143 0 0 0 29.257143 29.257143h344.8832a29.257143 29.257143 0 0 0 29.257143-29.257143V29.257143a29.257143 29.257143 0 0 0-29.257143-29.257143H29.257143a29.257143 29.257143 0 0 0-29.257143 29.257143z m465.481143 0v526.628571a29.257143 29.257143 0 0 0 29.257143 29.257143H994.742857a29.257143 29.257143 0 0 0 29.257143-29.257143V29.257143a29.257143 29.257143 0 0 0-29.257143-29.257143H494.738286a29.257143 29.257143 0 0 0-29.257143 29.257143zM0 468.114286v526.628571a29.257143 29.257143 0 0 0 29.257143 29.257143h344.8832a29.257143 29.257143 0 0 0 29.257143-29.257143V468.114286a29.257143 29.257143 0 0 0-29.257143-29.257143H29.257143a29.257143 29.257143 0 0 0-29.257143 29.257143z m62.0544-146.285715V58.514286h279.288686v263.314285H62.025143zM465.481143 672.914286v321.828571a29.257143 29.257143 0 0 0 29.257143 29.257143H994.742857a29.257143 29.257143 0 0 0 29.257143-29.257143V672.914286a29.257143 29.257143 0 0 0-29.257143-29.257143H494.738286a29.257143 29.257143 0 0 0-29.257143 29.257143z m62.0544 292.571428v-263.314285h440.612571v263.314285H527.506286z m0-438.857143V58.514286h440.612571v468.114285H527.506286zM62.0544 965.485714V497.371429h279.288686v468.114285H62.025143z" fill="#D7E5FD" ></path></symbol><symbol id="icon-change" viewBox="0 0 1024 1024"><path d="M335.07414 823.062441c-10.647199-10.647199-27.863946-10.647199-38.511145 0-10.647199 10.647199-10.647199 27.863946 0 38.511145l30.808916 30.808915h-125.047951c-81.326475 0-147.248493-66.148554-147.248493-147.248493v-91.294066c0-14.951385-12.232952-27.184337-27.184337-27.184337s-27.184337 12.232952-27.184337 27.184337v91.294066c0 111.229246 90.387921 201.617167 201.617167 201.617167h125.047951l-30.808916 30.808916c-10.647199 10.647199-10.647199 27.863946 0 38.511144 5.210331 5.210331 12.232952 7.928765 19.255573 7.928765s13.818705-2.718434 19.255572-7.928765l77.248824-77.248825c10.647199-10.647199 10.647199-27.863946 0-38.511144l-77.248824-77.248825zM476.432693 0.056634h-446.502738c-14.951385 0-27.184337 12.232952-27.184337 27.184337v446.502738c0 14.951385 12.232952 27.184337 27.184337 27.184337h446.502738c14.951385 0 27.184337-12.232952 27.184337-27.184337v-446.502738c0-14.951385-12.006416-27.184337-27.184337-27.184337z m-27.184337 446.502738h-392.134064v-392.134064h392.134064v392.134064zM821.447239 77.305459h-125.047951l30.808915-30.808916c10.647199-10.647199 10.647199-27.863946 0-38.511144s-27.863946-10.647199-38.511144 0l-77.022289 77.248825c-10.647199 10.647199-10.647199 27.863946 0 38.511144l77.248825 77.248825c5.210331 5.210331 12.232952 7.928765 19.255572 7.928765s13.818705-2.718434 19.255572-7.928765c10.647199-10.647199 10.647199-27.863946 0-38.511144l-30.808915-30.808916h125.047951c81.326475 0 147.248493 66.148554 147.248493 147.248493v91.294066c0 14.951385 12.232952 27.184337 27.184337 27.184337s27.184337-12.232952 27.184337-27.184337v-91.294066c0-111.229246-90.614457-201.617167-201.843703-201.617167zM994.067779 969.631326c-7.249157 0-14.271777 2.94497-19.255572 7.928765s-7.928765 12.006416-7.928765 19.255572c0 7.02262 2.94497 14.271777 7.928765 19.255572s12.006416 7.928765 19.255572 7.928765 14.271777-2.94497 19.255573-7.928765 7.928765-12.006416 7.928765-19.255572-2.94497-14.271777-7.928765-19.255572c-5.210331-4.983795-12.232952-7.928765-19.255573-7.928765zM882.385461 969.631326c-14.951385 0-27.184337 12.232952-27.184337 27.184337s12.232952 27.184337 27.184337 27.184337 27.184337-12.232952 27.184337-27.184337-12.232952-27.184337-27.184337-27.184337zM659.020824 969.631326c-14.951385 0-27.184337 12.232952-27.184337 27.184337s12.232952 27.184337 27.184337 27.184337 27.184337-12.232952 27.184337-27.184337-12.006416-27.184337-27.184337-27.184337zM770.703143 969.631326c-14.951385 0-27.184337 12.232952-27.184338 27.184337s12.232952 27.184337 27.184338 27.184337 27.184337-12.232952 27.184337-27.184337-12.232952-27.184337-27.184337-27.184337zM547.567307 969.631326c-7.249157 0-14.271777 2.94497-19.255572 7.928765s-7.928765 12.006416-7.928765 19.255572c0 7.02262 2.94497 14.271777 7.928765 19.255572s12.006416 7.928765 19.255572 7.928765c7.02262 0 14.271777-2.94497 19.255572-7.928765s7.928765-12.006416 7.928765-19.255572-2.94497-14.271777-7.928765-19.255572-12.235217-7.928765-19.255572-7.928765zM547.567307 857.949007c-14.951385 0-27.184337 12.232952-27.184337 27.184337s12.232952 27.184337 27.184337 27.184338 27.184337-12.232952 27.184337-27.184338-12.235217-27.184337-27.184337-27.184337zM547.567307 746.266689c-14.951385 0-27.184337 12.232952-27.184337 27.184337s12.232952 27.184337 27.184337 27.184337 27.184337-12.232952 27.184337-27.184337-12.235217-27.184337-27.184337-27.184337zM547.567307 634.58437c-14.951385 0-27.184337 12.232952-27.184337 27.184337s12.232952 27.184337 27.184337 27.184338 27.184337-12.232952 27.184337-27.184338-12.235217-27.184337-27.184337-27.184337zM547.567307 523.128588c-7.249157 0-14.271777 2.94497-19.255572 7.928765s-7.928765 12.006416-7.928765 19.255572 2.94497 14.271777 7.928765 19.255572 12.006416 7.928765 19.255572 7.928765c7.02262 0 14.271777-2.94497 19.255572-7.928765s7.928765-12.006416 7.928765-19.255572c0-7.02262-2.94497-14.271777-7.928765-19.255572-5.212597-5.210331-12.235217-7.928765-19.255572-7.928765zM882.385461 523.128588c-14.951385 0-27.184337 12.232952-27.184337 27.184337s12.232952 27.184337 27.184337 27.184337 27.184337-12.232952 27.184337-27.184337-12.232952-27.184337-27.184337-27.184337zM770.703143 523.128588c-14.951385 0-27.184337 12.232952-27.184338 27.184337s12.232952 27.184337 27.184338 27.184337 27.184337-12.232952 27.184337-27.184337-12.232952-27.184337-27.184337-27.184337zM659.020824 523.128588c-14.951385 0-27.184337 12.232952-27.184337 27.184337s12.232952 27.184337 27.184337 27.184337 27.184337-12.232952 27.184337-27.184337-12.006416-27.184337-27.184337-27.184337zM994.067779 523.128588c-7.249157 0-14.271777 2.94497-19.255572 7.928765s-7.928765 12.006416-7.928765 19.255572 2.94497 14.271777 7.928765 19.255572 12.006416 7.928765 19.255572 7.928765 14.271777-2.94497 19.255573-7.928765 7.928765-12.006416 7.928765-19.255572c0-7.02262-2.94497-14.271777-7.928765-19.255572-5.210331-4.983795-12.232952-7.928765-19.255573-7.928765zM994.067779 634.58437c-14.951385 0-27.184337 12.232952-27.184337 27.184337s12.232952 27.184337 27.184337 27.184338 27.184337-12.232952 27.184338-27.184338-12.232952-27.184337-27.184338-27.184337zM994.067779 857.949007c-14.951385 0-27.184337 12.232952-27.184337 27.184337s12.232952 27.184337 27.184337 27.184338 27.184337-12.232952 27.184338-27.184338-12.232952-27.184337-27.184338-27.184337zM994.067779 746.266689c-14.951385 0-27.184337 12.232952-27.184337 27.184337s12.232952 27.184337 27.184337 27.184337 27.184337-12.232952 27.184338-27.184337-12.232952-27.184337-27.184338-27.184337z" fill="#D7E5FD" ></path></symbol><symbol id="icon-analytics-chart-symb" viewBox="0 0 1024 1024"><path d="M872.086821 174.158899c-85.632437-4.619932-147.490211 72.912467-151.762537 151.77062 3.059745 56.413288 28.818997 96.424403 64.097007 120.263736a727702.473159 727702.473159 0 0 1-102.624732 154.13111c-19.126437-9.999747-40.455728-16.054566-61.922445-17.202475-30.314513-1.641026-57.177214 8.601238-78.793482 25.759252-39.170393-43.757989-78.352911-87.503852-117.503095-131.265884 6.741948-14.037641 10.909183-29.392952 11.749905-44.857395 3.168877-58.915246-50.19275-101.533409-104.43956-104.45977-58.907162-3.172919-101.537451 50.212959-104.451686 104.45977a116.480485 116.480485 0 0 0 11.369963 44.424908c-32.181887 37.315145-64.3759 74.618163-96.557787 111.933308-14.22357-10.056334-31.628142-16.252621-51.30024-17.323733C39.29056 569.068081 2.642334 614.980422 0.120167 661.632437c-2.728306 50.65353 43.212328 87.293672 89.827965 89.795629 50.657572 2.732348 87.313882-43.184034 89.807755-89.795629-0.905393-17.016547-5.881016-32.185929-13.621321-45.237338 24.526462-28.426929 49.056966-56.870027 73.603638-85.309082a14441.308576 14441.308576 0 0 1 20.153088-23.3543c18.164456 17.178224 42.537325 27.941897 70.97638 29.481874 28.378426 1.519768 52.925098-10.149299 71.109764-28.641152 37.86889 42.335228 75.770115 84.654288 113.634963 126.97739-17.06505 23.374511-27.574081 52.027788-29.126185 80.968044 4.074271 75.406341 57.961349 129.265126 133.371732 133.351522 75.244663 4.041935 129.592522-64.080839 133.351522-133.351522 2.073513-38.608564-14.906657-71.631173-41.235821-95.236074 35.136542-52.771504 70.256915-105.538967 105.393457-158.298346 86.327649 31.126942 199.813061-14.522673 206.437792-137.033725 4.640141-85.66073-72.880131-147.542756-151.718075-151.790829z" fill="#D7E5FD" ></path></symbol><symbol id="icon-liuchengzhihangjilu-copy" viewBox="0 0 1024 1024"><path d="M840.411429 453.485714h0.731428c36.571429 0 29.257143 42.861714 29.257143 58.514286v176.786286a142.262857 142.262857 0 1 1-129.828571 239.762285c-55.588571-55.588571-55.588571-145.554286 0-201.142857 20.260571-20.260571 45.202286-33.133714 71.314285-38.619428V523.190857c0-2.706286-0.219429-6.582857-0.365714-11.190857H541.257143v176.786286a142.262857 142.262857 0 1 1-129.828572 239.762285c-55.588571-55.588571-55.588571-145.554286 0-201.142857 20.260571-20.260571 45.202286-33.133714 71.314286-38.619428V512H211.236571c0.585143 4.608 0.877714 8.484571 0.877715 11.190857v165.595429a142.262857 142.262857 0 1 1-129.828572 239.762285c-55.588571-55.588571-55.588571-145.554286 0-201.142857 20.260571-20.260571 45.202286-33.133714 71.314286-38.619428V512c0-21.942857 9.142857-58.514286 29.257143-58.514286a11.190857 11.190857 0 0 1 0.804571 0H482.742857V329.362286a142.262857 142.262857 0 0 1-71.314286-239.762286A142.262857 142.262857 0 1 1 541.257143 329.362286V453.485714h299.081143zM447.926857 126.171429a90.477714 90.477714 0 1 0 128 128 90.477714 90.477714 0 0 0-128-128z m0 640a90.477714 90.477714 0 1 0 128 128 90.477714 90.477714 0 0 0-128-128z m-329.142857 0a90.477714 90.477714 0 0 0 128 128 90.477714 90.477714 0 1 0-128-128z m658.285714 0a90.477714 90.477714 0 1 0 128 128 90.477714 90.477714 0 0 0-128-128z" fill="#D7E5FD" ></path></symbol><symbol id="icon-chevron-down" viewBox="0 0 1024 1024"><path d="M509.68416 903.528647L78.768897 556.018296 18.533221 630.153346l491.150939 393.846654 495.782619-393.846654-55.60183-74.13505zM1005.466779 74.135051L949.864949 0 509.68416 347.510352 78.768897 0 18.533221 74.135051l491.150939 393.846653z" fill="#D7E5FD" ></path><path d="M509.68416 625.519499L78.768897 278.009148 18.533221 352.144198l491.150939 393.846654 495.782619-393.846654-55.60183-74.13505z" fill="#D7E5FD" ></path></symbol><symbol id="icon-agreement" viewBox="0 0 1024 1024"><path d="M862.558 0H161.442c-11.264 0-20.398 9.132-20.398 20.398v983.204c0 11.266 9.134 20.398 20.398 20.398h533.124c5.41 0 10.596-2.15 14.424-5.974l167.994-167.996a20.4 20.4 0 0 0 5.974-14.424V20.398c0-11.266-9.134-20.398-20.4-20.398z m-147.632 954.392l-0.088-98.514 98.514 0.09-98.426 98.424z m127.236-139.194l-147.724-0.134h-0.018a20.406 20.406 0 0 0-14.424 5.974 20.41 20.41 0 0 0-5.974 14.442l0.132 147.724H181.84V40.796h660.322v774.402z" fill="#D7E5FD" ></path><path d="M350.046 735.952c-51.294 0-93.026 41.73-93.026 93.026 0 51.298 41.734 93.028 93.026 93.028 51.296 0 93.028-41.73 93.028-93.028 0.004-51.294-41.73-93.026-93.028-93.026z m0 145.26c-28.8 0-52.23-23.432-52.23-52.232s23.43-52.23 52.23-52.23 52.232 23.43 52.232 52.23-23.428 52.232-52.232 52.232zM616.032 811.856H503.84c-11.264 0-20.398 9.132-20.398 20.398s9.134 20.398 20.398 20.398h112.192c11.264 0 20.398-9.132 20.398-20.398s-9.134-20.398-20.398-20.398zM342.694 122.39h-59.156c-11.264 0-20.398 9.132-20.398 20.398s9.134 20.398 20.398 20.398h59.156c11.264 0 20.398-9.132 20.398-20.398s-9.134-20.398-20.398-20.398zM748.622 122.39h-177.466c-11.264 0-20.398 9.132-20.398 20.398s9.134 20.398 20.398 20.398h177.466c11.264 0 20.398-9.132 20.398-20.398s-9.134-20.398-20.398-20.398zM748.622 210.104H446.726c-11.264 0-20.398 9.132-20.398 20.398s9.134 20.398 20.398 20.398h301.896c11.264 0 20.398-9.132 20.398-20.398s-9.134-20.398-20.398-20.398zM749.642 371.25H274.358c-11.264 0-20.398 9.132-20.398 20.398s9.134 20.398 20.398 20.398H749.64c11.264 0 20.398-9.132 20.398-20.398s-9.132-20.398-20.396-20.398zM749.642 440.606H274.358c-11.264 0-20.398 9.132-20.398 20.398s9.134 20.398 20.398 20.398H749.64c11.264 0 20.398-9.132 20.398-20.398 0.002-11.266-9.132-20.398-20.396-20.398zM749.642 516.08H274.358c-11.264 0-20.398 9.132-20.398 20.398s9.134 20.398 20.398 20.398H749.64c11.264 0 20.398-9.132 20.398-20.398 0.002-11.266-9.132-20.398-20.396-20.398zM749.642 585.434h-11.22c-11.264 0-20.398 9.132-20.398 20.398s9.134 20.398 20.398 20.398h11.22c11.264 0 20.398-9.132 20.398-20.398s-9.134-20.398-20.398-20.398zM667.028 585.434H274.358c-11.264 0-20.398 9.132-20.398 20.398s9.134 20.398 20.398 20.398h392.67c11.264 0 20.398-9.132 20.398-20.398s-9.134-20.398-20.398-20.398z" fill="#D7E5FD" ></path></symbol><symbol id="icon-note" viewBox="0 0 1024 1024"><path d="M1003.161721 0H20.838279a20.838279 20.838279 0 0 0-20.838279 20.838279v982.323442a20.838279 20.838279 0 0 0 20.838279 20.838279h834.993333a20.838279 20.838279 0 0 0 0-41.676559H41.676559V41.676559h940.646882v961.485162a20.838279 20.838279 0 0 0 41.676559 0V20.838279a20.838279 20.838279 0 0 0-20.838279-20.838279z" fill="#D7E5FD" ></path><path d="M228.578561 216.791041c-44.04865 0-79.880071 35.831422-79.880072 79.880071s35.831422 79.880071 79.880072 79.880071 79.880071-35.831422 79.880071-79.880071-35.831422-79.880071-79.880071-79.880071z m0 118.083583c-21.064028 0-38.203512-17.139485-38.203513-38.203512s17.139485-38.203512 38.203513-38.203512 38.203512 17.139485 38.203512 38.203512-17.136012 38.203512-38.203512 38.203512zM857.199992 275.832833h-486.226521a20.838279 20.838279 0 0 0 0 41.676558h486.226521a20.838279 20.838279 0 0 0 0-41.676558zM228.578561 432.119929a20.838279 20.838279 0 0 0 0 41.676559c21.064028 0 38.203512 17.139485 38.203512 38.203512s-17.139485 38.203512-38.203512 38.203512-38.203512-17.139485-38.203513-38.203512a20.838279 20.838279 0 0 0-41.676559 0c0 44.04865 35.831422 79.880071 79.880072 79.880071s79.880071-35.831422 79.880071-79.880071-35.831422-79.880071-79.880071-79.880071zM857.199992 491.161721h-486.226521a20.838279 20.838279 0 0 0 0 41.676558h486.226521a20.838279 20.838279 0 0 0 0-41.676558zM228.578561 647.448817c-44.04865 0-79.880071 35.831422-79.880072 79.880071s35.831422 79.880071 79.880072 79.880071 79.880071-35.831422 79.880071-79.880071-35.831422-79.880071-79.880071-79.880071z m0 118.083583c-21.064028 0-38.203512-17.139485-38.203513-38.203512s17.139485-38.203512 38.203513-38.203512 38.203512 17.139485 38.203512 38.203512-17.136012 38.203512-38.203512 38.203512zM857.199992 706.490609h-486.226521a20.838279 20.838279 0 0 0 0 41.676558h486.226521a20.838279 20.838279 0 0 0 0-41.676558z" fill="#D7E5FD" ></path></symbol><symbol id="icon-painter-palette" viewBox="0 0 1024 1024"><path d="M512 0C227.555556 0 0 227.555556 0 512S227.555556 1024 512 1024c45.511111 0 85.333333-39.822222 85.333333-85.333333 0-22.755556-5.688889-39.822222-22.755555-56.888889-11.377778-17.066667-22.755556-34.133333-22.755556-56.888889 0-45.511111 39.824453-85.333333 85.333334-85.333333h102.4c159.288889 0 284.444444-125.155556 284.444444-284.444445C1024 204.8 796.444444 0 512 0zM199.111111 512c-45.511111 0-85.333333-39.822222-85.333333-85.333333S153.6 341.333333 199.111111 341.333333s85.333333 39.822222 85.333333 85.333334-39.822222 85.333333-85.333333 85.333333z m170.666667-227.555556c-45.511111 0-85.333333-39.822222-85.333334-85.333333S324.266667 113.777778 369.777778 113.777778 455.111111 153.6 455.111111 199.111111s-39.822222 85.333333-85.333333 85.333333z m284.444444 0c-45.511111 0-85.333333-39.822222-85.333333-85.333333S608.711111 113.777778 654.222222 113.777778s85.333333 39.822222 85.333334 85.333333-39.822222 85.333333-85.333334 85.333333z m170.666667 227.555556c-45.511111 0-85.333333-39.822222-85.333333-85.333333S779.377778 341.333333 824.888889 341.333333 910.222222 381.155556 910.222222 426.666667s-39.822222 85.333333-85.333333 85.333333z" ></path></symbol></svg>';var script=function(){var scripts=document.getElementsByTagName("script");return scripts[scripts.length-1]}();var shouldInjectCss=script.getAttribute("data-injectcss");var ready=function(fn){if(document.addEventListener){if(~["complete","loaded","interactive"].indexOf(document.readyState)){setTimeout(fn,0)}else{var loadFn=function(){document.removeEventListener("DOMContentLoaded",loadFn,false);fn()};document.addEventListener("DOMContentLoaded",loadFn,false)}}else if(document.attachEvent){IEContentLoaded(window,fn)}function IEContentLoaded(w,fn){var d=w.document,done=false,init=function(){if(!done){done=true;fn()}};var polling=function(){try{d.documentElement.doScroll("left")}catch(e){setTimeout(polling,50);return}init()};polling();d.onreadystatechange=function(){if(d.readyState=="complete"){d.onreadystatechange=null;init()}}}};var before=function(el,target){target.parentNode.insertBefore(el,target)};var prepend=function(el,target){if(target.firstChild){before(el,target.firstChild)}else{target.appendChild(el)}};function appendSvg(){var div,svg;div=document.createElement("div");div.innerHTML=svgSprite;svgSprite=null;svg=div.getElementsByTagName("svg")[0];if(svg){svg.setAttribute("aria-hidden","true");svg.style.position="absolute";svg.style.width=0;svg.style.height=0;svg.style.overflow="hidden";prepend(svg,document.body)}}if(shouldInjectCss&&!window.__iconfont__svg__cssinject__){window.__iconfont__svg__cssinject__=true;try{document.write("<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>")}catch(e){console&&console.log(e)}}ready(appendSvg)})(window) \ No newline at end of file diff --git a/cyclone-web/vendor/fonts_tab/iconfont.svg b/cyclone-web/vendor/fonts_tab/iconfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..51ed2424abd2554a6a408a8b5129ca2047e9a463 --- /dev/null +++ b/cyclone-web/vendor/fonts_tab/iconfont.svg @@ -0,0 +1,90 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<!-- +2013-9-30: Created. +--> +<svg> +<metadata> +Created by iconfont +</metadata> +<defs> + +<font id="conf" horiz-adv-x="1024" > + <font-face + font-family="conf" + font-weight="500" + font-stretch="normal" + units-per-em="1024" + ascent="896" + descent="-128" + /> + <missing-glyph /> + + <glyph glyph-name="x" unicode="x" horiz-adv-x="1001" +d="M281 543q-27 -1 -53 -1h-83q-18 0 -36.5 -6t-32.5 -18.5t-23 -32t-9 -45.5v-76h912v41q0 16 -0.5 30t-0.5 18q0 13 -5 29t-17 29.5t-31.5 22.5t-49.5 9h-133v-97h-438v97zM955 310v-52q0 -23 0.5 -52t0.5 -58t-10.5 -47.5t-26 -30t-33 -16t-31.5 -4.5q-14 -1 -29.5 -0.5 +t-29.5 0.5h-32l-45 128h-439l-44 -128h-29h-34q-20 0 -45 1q-25 0 -41 9.5t-25.5 23t-13.5 29.5t-4 30v167h911zM163 247q-12 0 -21 -8.5t-9 -21.5t9 -21.5t21 -8.5q13 0 22 8.5t9 21.5t-9 21.5t-22 8.5zM316 123q-8 -26 -14 -48q-5 -19 -10.5 -37t-7.5 -25t-3 -15t1 -14.5 +t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q-5 19 -11 39h-368zM336 498v228q0 11 2.5 23t10 21.5t20.5 15.5t34 6h188q31 0 51.5 -14.5t20.5 -52.5v-227h-327z" /> + + + + <glyph glyph-name="gongdanshenpi" unicode="&#58881;" d="M877.714286 442.514286c-20.187429 0-36.571429-19.675429-36.571429-43.885715v-131.657142c0-24.210286 16.384-43.885714 36.571429-43.885715s36.571429 19.675429 36.571428 43.885715V398.628571c0 24.210286-16.384 43.885714-36.571428 43.885715z m20.48 103.497143a27.062857 27.062857 0 0 1-6.582857 3.291428 36.571429 36.571429 0 0 1-39.862858-7.68 36.571429 36.571429 0 1 1 51.931429 0l-5.485714 4.388572zM813.714286 793.6h-33.499429C780.214857 850.139429 735.085714 896 679.643429 896H344.356571c-55.588571 0-100.571429-45.860571-100.571428-102.4h-33.499429C155.794286 793.6 111.177143 749.421714 109.714286 693.906286v-722.212572C111.177143-83.821714 155.794286-128 210.285714-128h603.428572c54.491429 0 99.108571 44.178286 100.571428 99.693714v173.348572a33.865143 33.865143 0 0 1-33.499428 34.157714 33.865143 33.865143 0 0 1-33.572572-34.157714v-173.348572a33.792 33.792 0 0 0-33.499428-31.451428h-603.428572a33.792 33.792 0 0 0-33.499428 31.451428V693.906286a33.792 33.792 0 0 0 33.499428 31.451428h33.499429c0-56.612571 45.056-102.4 100.571428-102.4h335.286858c55.588571 0 100.571429 45.787429 100.571428 102.4h33.499429c17.554286 0 32.182857-13.677714 33.499428-31.451428v-70.948572c0-18.870857 15.067429-34.157714 33.572572-34.157714a33.865143 33.865143 0 0 1 33.499428 34.157714v70.948572A101.449143 101.449143 0 0 1 813.714286 793.6z m-100.571429-68.242286a33.865143 33.865143 0 0 0-33.499428-34.157714H344.356571a33.865143 33.865143 0 0 0-33.499428 34.157714V793.6c0 18.870857 14.994286 34.157714 33.499428 34.157714h335.286858c18.505143 0 33.499429-15.36 33.499428-34.157714v-68.242286zM712.777143 447.049143L447.049143 166.034286 309.101714 295.862857a33.499429 33.499429 0 0 1-43.666285-1.536 29.257143 29.257143 0 0 1-1.682286-41.398857l160.841143-152.356571a33.060571 33.060571 0 0 1 22.454857-9.142858 32.914286 32.914286 0 0 1 23.186286 10.020572l289.499428 304.713143a29.403429 29.403429 0 0 1-2.413714 43.154285 33.499429 33.499429 0 0 1-45.494857-2.267428h0.950857z" horiz-adv-x="1024" /> + + + <glyph glyph-name="jifangpeizhi" unicode="&#58882;" d="M0 896v-1024h1024V896H0z m68.292923-78.769231h887.414154v-236.307692H68.292923V817.230769z m887.414154-866.461538H68.292923V187.076923h887.414154v-236.307692zM68.292923 265.846154V502.153846h887.414154v-236.307692H68.292923z m682.614154 472.615384h136.585846v-78.76923H750.907077V738.461538z m136.585846-315.076923v-78.76923H750.907077V423.384615h136.585846z m-136.585846-393.846153v78.76923h136.585846v-78.76923H750.907077z" horiz-adv-x="1024" /> + + + <glyph glyph-name="Group" unicode="&#58883;" d="M551.384615 817.230769c17.723077 0 30.956308-3.702154 37.021539-6.931692L945.230769 620.228923l-356.824615-189.833846A84.992 84.992 0 0 0 551.384615 423.384615c-17.644308 0-30.877538 3.702154-36.942769 6.931693L157.538462 620.307692l356.903384 189.991385c6.065231 3.229538 19.298462 6.931692 37.021539 6.931692z m0 78.769231c-27.569231 0-55.138462-5.198769-76.091077-15.675077L31.428923 658.353231c-41.905231-20.952615-41.905231-55.138462 0-76.091077l443.785846-221.971692C496.246154 349.81415400000003 523.815385 344.61538499999995 551.384615 344.61538499999995c27.569231 0 55.138462 5.198769 76.091077 15.675077l443.785846 221.971692c41.905231 20.952615 41.905231 55.138462 0 76.091077L627.554462 880.324923C606.601846 890.801231 579.032615 896 551.463385 896zM551.384615 108.30769199999997c-33.870769 0-67.741538 6.774154-94.838153 20.164923L23.473231 343.512615a42.062769 42.062769 0 0 0-18.904616 56.556308 42.535385 42.535385 0 0 0 56.871385 18.904615l433.073231-215.197538c29.853538-14.808615 83.968-14.808615 113.821538 0l433.073231 215.118769a42.535385 42.535385 0 0 0 56.871385-18.904615 41.984 41.984 0 0 0-18.983385-56.477539l-433.073231-215.04A218.190769 218.190769 0 0 0 551.384615 108.30769199999997zM551.384615-128c-33.870769 0-67.741538 6.774154-94.838153 20.164923L23.630769 107.28369199999997a41.747692 41.747692 0 0 0-19.062154 56.477539 42.692923 42.692923 0 0 0 56.950154 18.904615l433.073231-215.197538c29.853538-14.808615 83.968-14.808615 113.821538 0l433.073231 215.118769a42.535385 42.535385 0 0 0 56.871385-18.904615 42.062769 42.062769 0 0 0-18.983385-56.477539l-433.073231-215.04C619.204923-121.30461500000001 585.334154-128 551.384615-128z" horiz-adv-x="1103" /> + + + <glyph glyph-name="zhujicaozuojilu" unicode="&#58884;" d="M1020.612138 896H82.156244C36.863972 896 0 860.081258 0 815.970523v-660.873338c0-44.110735 36.863972-80.029477 82.156244-80.029477h387.701856v-145.329119H342.488352a29.45967 29.45967 0 0 1-29.617208-28.908285c0-15.753834 13.390759-28.829516 29.617208-28.829516h417.240294a29.45967 29.45967 0 0 1 29.617208 28.829516c0 15.753834-13.390759 28.908285-29.617208 28.908285h-126.818364v145.329119h387.701856c45.292273 0 82.156244 35.918742 82.156244 80.029477V816.443138C1102.768382 860.632643 1065.904411 896 1020.612138 896zM81.526091 838.262198H1020.060754c12.287991 0 22.370444-9.767377 22.370444-21.740291v-530.274053H59.234416V816.521907c0 11.972914 10.003685 21.740291 22.291675 21.740291z m492.228545-907.42084h-44.740889v145.329119h44.740889v-145.407888z m446.857502 202.988151H82.156244a22.134137 22.134137 0 0 0-22.370444 21.819061V228.037437H1042.903813v-72.467637a22.134137 22.134137 0 0 0-22.370444-21.740291z" horiz-adv-x="1103" /> + + + <glyph glyph-name="shebeijieru" unicode="&#58885;" d="M774.431716 166.403419l-51.199195 51.199196c25.599598 38.399397 44.762725 83.162122 44.762725 134.434459 0 70.362323-31.962926 134.361317-83.162122 172.760713l25.599598 51.199196h25.599598a158.424939 158.424939 0 0 1 159.960915 160.034057A158.424939 158.424939 0 0 1 736.03232 895.991954a158.424939 158.424939 0 0 1-160.034057-159.960914c0-57.635666 32.036068-102.398391 70.435465-134.434459l-19.23627-44.762726c-25.599598 12.799799-51.199195 19.163127-83.162121 19.163128-121.63466 0-224.033051-102.398391-224.033051-223.959909 0-32.036068 6.43647-57.635666 19.236269-83.235264l-44.835867-19.163127c-32.036068 38.399397-76.798793 70.362323-134.434459 70.362323A158.424939 158.424939 0 0 1 0.007314 160.040091c0-89.598592 70.435465-160.034057 159.960915-160.034057a158.424939 158.424939 0 0 1 160.034057 160.034057v25.599598l51.199195 25.599597c38.399397-51.199195 102.398391-83.235263 172.833856-83.235263 51.199195 0 95.961921 19.236269 134.361317 44.835867l51.199195-51.199196c-12.799799-25.599598-25.599598-57.635666-25.599597-89.671734 0-89.52545 70.435465-159.960915 160.034056-159.960914A158.424939 158.424939 0 0 1 1023.991223 31.96896a158.424939 158.424939 0 0 1-159.960915 160.034057c-32.036068 0-63.998994-12.799799-89.598592-25.599598z m-38.472538 665.589541c51.199195 0 96.035062-44.762725 96.035062-95.96192 0-51.199195-44.835867-96.035062-96.035062-96.035063S639.997257 684.831844 639.997257 736.03104 684.759982 831.99296 735.959178 831.99296z m-575.990949-767.987932c-51.199195 0-95.961921 44.835867-95.96192 96.035063S108.769034 256.002011 159.968229 256.002011c51.199195 0 96.035062-44.762725 96.035062-95.96192 0-51.199195-44.835867-96.035062-96.035062-96.035063zM384.00128 352.037074c0 89.598592 70.362323 159.960915 159.960915 159.960915 89.598592 0 160.034057-70.362323 160.034057-159.960915a158.424939 158.424939 0 0 0-159.960915-160.034057A158.424939 158.424939 0 0 0 384.00128 352.037074z m480.029028-416.030034c-51.199195 0-96.035062 44.835867-96.035062 95.96192 0 51.199195 44.835867 96.035062 96.035062 96.035063s95.961921-44.835867 95.961921-96.035063-44.762725-95.961921-95.961921-95.96192z" horiz-adv-x="1024" /> + + + <glyph glyph-name="ST" unicode="&#58886;" d="M0 896v-887.466667h546.133333V349.866667h273.066667V418.133333h68.266667V896H0z m59.1872-68.266667h769.092267v-204.8H59.1872V827.733333zM546.133333 76.79999999999995H59.1872V281.6H546.133333v-204.8zM59.1872 349.866667V554.666667h769.092267v-204.8H59.1872z m591.598933 409.6h118.3744v-68.266667H650.786133V759.466667z m118.3744-273.066667v-68.266667H650.786133V486.4h118.3744zM1038.5408 211.28533300000004h-47.104a209.032533 209.032533 0 0 1-18.090667 45.397334l33.1776 34.269866a16.452267 16.452267 0 0 1 0 22.801067l-53.589333 55.296a15.36 15.36 0 0 1-22.050133 0l-33.1776-34.269867a195.720533 195.720533 0 0 1-44.032 18.773334v48.469333A15.9744 15.9744 0 0 1 838.0416 418.133333h-75.776a15.9744 15.9744 0 0 1-15.701333-16.110933v-48.469333a195.7888 195.7888 0 0 1-43.963734-18.773334l-33.245866 34.133334a15.36 15.36 0 0 1-21.981867 0l-53.6576-55.296a16.657067 16.657067 0 0 1 0-22.7328l33.245867-34.269867a208.896 208.896 0 0 1-18.158934-45.397333h-47.104a15.9744 15.9744 0 0 1-15.5648-16.110934v-78.2336c0-8.8064 7.031467-16.042667 15.633067-16.042666h47.035733c4.3008-16.042667 10.4448-31.266133 18.158934-45.397334l-33.245867-34.269866a16.657067 16.657067 0 0 1 0-22.801067l53.6576-55.296a15.36 15.36 0 0 1 21.981867 0l33.245866 34.269867c13.653333-7.9872 28.4672-14.336 44.032-18.773334v-48.469333c0-8.874667 7.031467-16.110933 15.5648-16.110933h75.844267a15.9744 15.9744 0 0 1 15.633067 16.110933v48.469333c15.496533 4.5056 30.242133 10.786133 44.032 18.773334l33.1776-34.269867a15.36 15.36 0 0 1 22.050133 0l53.589333 55.296a16.452267 16.452267 0 0 1 0 22.801067l-33.1776 34.269866a208.896 208.896 0 0 1 18.158934 45.397334h47.035733a15.9744 15.9744 0 0 1 15.5648 16.042666v78.2336a15.9744 15.9744 0 0 1-15.5648 16.1792z m-98.986667-96.119466c-3.072-11.195733-7.304533-21.845333-12.629333-31.675734l-19.114667-34.816-33.792-19.6608c-9.489067-5.5296-19.729067-9.898667-30.651733-12.970666l-37.341867-10.786134-37.341866 10.717867a135.304533 135.304533 0 0 0-30.72 12.970667l-33.723734 19.797333-19.114666 34.816a142.472533 142.472533 0 0 0-12.561067 31.607467l-10.376533 38.5024 10.4448 38.5024c3.003733 11.127467 7.236267 21.845333 12.629333 31.607466l19.114667 34.816 33.723733 19.729067c9.557333 5.461333 19.797333 9.898667 30.72 12.970667l37.2736 10.786133 37.341867-10.786133c10.8544-3.072 21.162667-7.509333 30.72-12.970667l33.723733-19.729067 19.114667-34.816c5.393067-9.762133 9.557333-20.343467 12.629333-31.607466l10.4448-38.5024-10.581333-38.5024zM709.973333 149.16266700000006c0-54.203733 42.5984-98.304 95.300267-98.304 52.565333 0 95.300267 44.032 95.300267 98.304 0 54.340267-42.5984 98.304-95.300267 98.304-52.565333 0-95.300267-43.963733-95.300267-98.304z m96.529067-35.498667a35.6352 35.6352 0 0 0-35.089067 36.181333c0 20.002133 15.701333 36.181333 35.089067 36.181334 19.387733 0 35.089067-16.1792 35.089067-36.181334 0-20.002133-15.701333-36.181333-35.089067-36.181333z" horiz-adv-x="1092" /> + + + <glyph glyph-name="zuoyezhihangjilu" unicode="&#58887;" d="M713.508571 896H315.977143c-39.862857 0-72.192-30.866286-72.192-68.900571v-749.714286c0-38.034286 32.329143-68.827429 72.192-68.827429h526.189714c39.789714 0 72.118857 30.866286 72.118857 68.827429V672.182857L713.508571 896z m-24.576-286.500571h158.281143v-531.017143a6.144 6.144 0 0 0-4.461714-1.682286h-527.36c-2.486857 0-4.096 1.097143-4.534857 1.682286V825.929143c0.438857 0.658286 2.194286 1.828571 4.534857 1.828571H627.565714v-157.257143c0-33.645714 27.574857-61.001143 61.366857-61.001142z m4.096 61.220571V807.277714L827.099429 670.72H693.028571zM407.990857 554.642286c-16.603429 0-30.061714-15.36-30.061714-34.084572 0-18.797714 13.458286-34.157714 29.988571-34.157714h208.091429c16.603429 0 30.061714 15.36 30.061714 34.157714s-13.458286 34.084571-29.988571 34.084572H407.917714zM377.929143 384c0-18.797714 12.8-34.157714 28.525714-34.157714h345.234286c15.725714 0 28.525714 15.36 28.525714 34.157714s-12.8 34.157714-28.525714 34.157714h-345.234286c-15.725714 0-28.525714-15.36-28.525714-34.157714zM109.714286-93.842286C109.714286-128 133.12-128 161.938286-128h633.051428c28.745143 0 52.224 0 52.224 34.157714 0 34.084571-23.405714 34.084571-52.224 34.084572H176.786286V793.6C176.786286 827.757714 143.213714 827.757714 143.213714 827.757714S109.714286 827.757714 109.714286 793.6v-887.442286zM616.009143 281.6H407.990857c-16.603429 0-30.061714-15.36-30.061714-34.157714s13.458286-34.084571 29.988571-34.084572h208.091429c16.603429 0 30.061714 15.36 30.061714 34.084572 0 18.797714-13.458286 34.157714-29.988571 34.157714z" horiz-adv-x="1024" /> + + + <glyph glyph-name="parameters" unicode="&#58888;" d="M256 703.328V800c0 52.928-43.072 96-96 96S64 852.928 64 800v-96.672C25.344 674.048 0 628.192 0 576s25.344-98.048 64-127.264V-32c0-52.928 43.072-96 96-96s96 43.072 96 96V448.736c38.656 29.184 64 75.072 64 127.264s-25.344 98.048-64 127.328zM128 800a32 32 0 1 0 64 0v-67.2a161.984 161.984 0 0 1-64 0V800z m64-832a32 32 0 1 0-64 0V419.264a157.312 157.312 0 0 1 64 0V-32z m59.68 581.12c-0.512-1.696-0.96-3.36-1.568-5.056a94.208 94.208 0 0 0-12.096-23.552l-0.448-0.512a96.832 96.832 0 0 0-19.712-20.064l-0.32-0.256c-7.712-5.824-16.32-10.496-25.568-13.76-10.016-3.616-20.672-5.92-31.968-5.92s-21.952 2.304-32 5.952a94.784 94.784 0 0 0-25.568 13.76l-0.32 0.256a96.832 96.832 0 0 0-19.712 20.064l-0.448 0.512a95.328 95.328 0 0 0-12.096 23.552c-0.608 1.696-1.056 3.36-1.568 5.056A94.24 94.24 0 0 0 64 576c0 9.44 1.76 18.368 4.32 26.944 0.512 1.696 0.96 3.36 1.568 4.992 3.008 8.448 6.912 16.448 12.096 23.616l0.448 0.512c5.568 7.552 12.192 14.368 19.712 20.064l0.32 0.256c7.68 5.728 16.288 10.432 25.536 13.728C138.048 669.696 148.704 672 160 672s21.952-2.304 32-5.888c9.248-3.328 17.856-8 25.568-13.76l0.32-0.256c7.52-5.696 14.144-12.512 19.712-20.064l0.448-0.512a93.792 93.792 0 0 0 13.632-28.576c2.56-8.576 4.32-17.504 4.32-26.944 0-9.376-1.76-18.304-4.32-26.88zM960 703.328V800c0 52.928-43.072 96-96 96s-96-43.072-96-96v-96.672c-38.688-29.28-64-75.136-64-127.328s25.312-98.048 64-127.264V-32c0-52.928 43.072-96 96-96s96 43.072 96 96V448.736c38.624 29.184 64 75.072 64 127.264s-25.376 98.048-64 127.328zM832 800a32 32 0 1 0 64 0v-67.2a162.464 162.464 0 0 1-64 0V800z m64-832a32 32 0 1 0-64 0V419.264a156.864 156.864 0 0 1 64 0V-32z m59.68 581.12c-0.512-1.696-0.992-3.36-1.568-5.056a94.304 94.304 0 0 0-12.128-23.552l-0.448-0.512a97.472 97.472 0 0 0-19.68-20.064l-0.32-0.256c-7.744-5.824-16.32-10.496-25.568-13.76A93.824 93.824 0 0 0 864 480a93.12 93.12 0 0 0-32 5.952 94.304 94.304 0 0 0-25.888 14.016 96.192 96.192 0 0 0-19.744 20.064l-0.448 0.512a95.2 95.2 0 0 0-12.064 23.552c-0.64 1.696-1.056 3.36-1.568 5.056A94.24 94.24 0 0 0 768 576c0 9.44 1.76 18.368 4.32 26.944 0.512 1.696 0.928 3.36 1.568 4.992 3.008 8.448 6.944 16.448 12.064 23.616l0.448 0.512c5.568 7.552 12.192 14.368 19.744 20.064l0.32 0.256c7.68 5.76 16.32 10.432 25.568 13.76A95.04 95.04 0 0 0 864 672c11.264 0 21.952-2.304 32-5.888a98.976 98.976 0 0 0 25.888-14.016c7.488-5.696 14.112-12.512 19.68-20.064l0.448-0.512c5.184-7.2 9.056-15.2 12.128-23.616 0.576-1.632 1.056-3.328 1.568-4.992 2.528-8.544 4.288-17.472 4.288-26.912 0-9.376-1.76-18.304-4.32-26.88zM608 319.328V800c0 52.928-43.072 96-96 96s-96-43.072-96-96v-480.672c-38.656-29.248-64-75.136-64-127.328s25.344-98.048 64-127.264V-32c0-52.928 43.072-96 96-96s96 43.072 96 96v96.736c38.624 29.184 64 75.072 64 127.264s-25.376 98.048-64 127.328zM480 800a32 32 0 1 0 64 0v-451.2a161.984 161.984 0 0 1-64 0V800z m64-832a32 32 0 1 0-64 0v67.264a157.312 157.312 0 0 1 64 0V-32z m59.68 197.12c-0.512-1.696-0.992-3.36-1.568-5.056a94.304 94.304 0 0 0-12.128-23.552l-0.448-0.512a97.472 97.472 0 0 0-19.68-20.064l-0.32-0.256c-7.744-5.824-16.32-10.496-25.568-13.76A93.824 93.824 0 0 0 512 96c-11.296 0-21.952 2.304-32 5.952a94.784 94.784 0 0 0-25.568 13.76l-0.32 0.256a96.832 96.832 0 0 0-19.712 20.064l-0.448 0.512a95.328 95.328 0 0 0-12.096 23.552c-0.608 1.696-1.056 3.36-1.568 5.056A94.24 94.24 0 0 0 416 192c0 9.44 1.76 18.368 4.32 26.944 0.512 1.696 0.96 3.36 1.568 4.992 3.04 8.448 6.944 16.448 12.096 23.616l0.448 0.512c5.568 7.552 12.192 14.368 19.712 20.064l0.32 0.256c7.712 5.76 16.32 10.432 25.568 13.76 10.016 3.552 20.672 5.856 31.968 5.856 11.264 0 21.952-2.304 32-5.888a98.976 98.976 0 0 0 25.888-14.016c7.488-5.696 14.112-12.512 19.68-20.064l0.448-0.512c5.184-7.2 9.056-15.2 12.128-23.616 0.576-1.632 1.056-3.328 1.568-4.992 2.528-8.544 4.288-17.472 4.288-26.912 0-9.376-1.76-18.304-4.32-26.88z" horiz-adv-x="1024" /> + + + <glyph glyph-name="zuoyezhihangjilu1" unicode="&#58889;" d="M713.508571 896H315.977143c-39.862857 0-72.192-30.866286-72.192-68.900571v-749.714286c0-38.034286 32.329143-68.827429 72.192-68.827429h526.189714c39.789714 0 72.118857 30.866286 72.118857 68.827429V672.182857L713.508571 896z m-24.576-286.500571h158.281143v-531.017143a6.144 6.144 0 0 0-4.461714-1.682286h-527.36c-2.486857 0-4.096 1.097143-4.534857 1.682286V825.929143c0.438857 0.658286 2.194286 1.828571 4.534857 1.828571H627.565714v-157.257143c0-33.645714 27.574857-61.001143 61.366857-61.001142z m4.096 61.220571V807.277714L827.099429 670.72H693.028571zM407.990857 554.642286c-16.603429 0-30.061714-15.36-30.061714-34.084572 0-18.797714 13.458286-34.157714 29.988571-34.157714h208.091429c16.603429 0 30.061714 15.36 30.061714 34.157714s-13.458286 34.084571-29.988571 34.084572H407.917714zM377.929143 384c0-18.797714 12.8-34.157714 28.525714-34.157714h345.234286c15.725714 0 28.525714 15.36 28.525714 34.157714s-12.8 34.157714-28.525714 34.157714h-345.234286c-15.725714 0-28.525714-15.36-28.525714-34.157714zM109.714286-93.842286C109.714286-128 133.12-128 161.938286-128h633.051428c28.745143 0 52.224 0 52.224 34.157714 0 34.084571-23.405714 34.084571-52.224 34.084572H176.786286V793.6C176.786286 827.757714 143.213714 827.757714 143.213714 827.757714S109.714286 827.757714 109.714286 793.6v-887.442286zM616.009143 281.6H407.990857c-16.603429 0-30.061714-15.36-30.061714-34.157714s13.458286-34.084571 29.988571-34.084572h208.091429c16.603429 0 30.061714 15.36 30.061714 34.084572 0 18.797714-13.458286 34.157714-29.988571 34.157714z" horiz-adv-x="1024" /> + + + <glyph glyph-name="liuchengzhihangjilu" unicode="&#58897;" d="M840.411429 442.514286h0.731428c36.571429 0 29.257143-42.861714 29.257143-58.514286v-176.786286a142.262857 142.262857 0 1 0-129.828571-239.762285c-55.588571 55.588571-55.588571 145.554286 0 201.142857 20.260571 20.260571 45.202286 33.133714 71.314285 38.619428V372.809143c0 2.706286-0.219429 6.582857-0.365714 11.190857H541.257143v-176.786286a142.262857 142.262857 0 1 0-129.828572-239.762285c-55.588571 55.588571-55.588571 145.554286 0 201.142857 20.260571 20.260571 45.202286 33.133714 71.314286 38.619428V384H211.236571c0.585143-4.608 0.877714-8.484571 0.877715-11.190857v-165.595429a142.262857 142.262857 0 1 0-129.828572-239.762285c-55.588571 55.588571-55.588571 145.554286 0 201.142857 20.260571 20.260571 45.202286 33.133714 71.314286 38.619428V384c0 21.942857 9.142857 58.514286 29.257143 58.514286a11.190857 11.190857 0 0 0 0.804571 0H482.742857V566.637714a142.262857 142.262857 0 0 0-71.314286 239.762286A142.262857 142.262857 0 1 0 541.257143 566.637714V442.514286h299.081143zM447.926857 769.828571a90.477714 90.477714 0 1 1 128-128 90.477714 90.477714 0 0 1-128 128z m0-640a90.477714 90.477714 0 1 1 128-128 90.477714 90.477714 0 0 1-128 128z m-329.142857 0a90.477714 90.477714 0 0 1 128-128 90.477714 90.477714 0 1 1-128 128z m658.285714 0a90.477714 90.477714 0 1 1 128-128 90.477714 90.477714 0 0 1-128 128z" horiz-adv-x="1024" /> + + + <glyph glyph-name="Group1" unicode="&#58899;" d="M125.098667 384c0-43.861333 30.549333-79.701333 67.754666-79.701333h820.394667c37.205333 0 67.584 35.84 67.584 79.701333s-30.378667 79.701333-67.584 79.701333H192.853333c-37.205333 0-67.754667-35.84-67.754666-79.701333zM125.098667 42.666667c0-43.861333 30.549333-79.701333 67.754666-79.701334h820.394667c37.205333 0 67.584 35.84 67.584 79.701334s-30.378667 79.701333-67.584 79.701333H192.853333c-37.205333 0-67.754667-35.84-67.754666-79.701333zM125.098667 725.333333c0-43.861333 30.549333-79.701333 67.754666-79.701333h820.394667c37.205333 0 67.584 35.84 67.584 79.701333S1050.453333 805.034667 1013.248 805.034667H192.853333C155.648 805.034667 125.098667 769.194667 125.098667 725.333333z" horiz-adv-x="1194" /> + + + <glyph glyph-name="peizhimoban" unicode="&#58900;" d="M0 866.742857v-321.828571a29.257143 29.257143 0 0 1 29.257143-29.257143h344.8832a29.257143 29.257143 0 0 1 29.257143 29.257143V866.742857a29.257143 29.257143 0 0 1-29.257143 29.257143H29.257143a29.257143 29.257143 0 0 1-29.257143-29.257143z m465.481143 0v-526.628571a29.257143 29.257143 0 0 1 29.257143-29.257143H994.742857a29.257143 29.257143 0 0 1 29.257143 29.257143V866.742857a29.257143 29.257143 0 0 1-29.257143 29.257143H494.738286a29.257143 29.257143 0 0 1-29.257143-29.257143zM0 427.885714v-526.628571a29.257143 29.257143 0 0 1 29.257143-29.257143h344.8832a29.257143 29.257143 0 0 1 29.257143 29.257143V427.885714a29.257143 29.257143 0 0 1-29.257143 29.257143H29.257143a29.257143 29.257143 0 0 1-29.257143-29.257143z m62.0544 146.285715V837.485714h279.288686v-263.314285H62.025143zM465.481143 223.085714v-321.828571a29.257143 29.257143 0 0 1 29.257143-29.257143H994.742857a29.257143 29.257143 0 0 1 29.257143 29.257143V223.085714a29.257143 29.257143 0 0 1-29.257143 29.257143H494.738286a29.257143 29.257143 0 0 1-29.257143-29.257143z m62.0544-292.571428v263.314285h440.612571v-263.314285H527.506286z m0 438.857143V837.485714h440.612571v-468.114285H527.506286zM62.0544-69.485714V398.628571h279.288686v-468.114285H62.025143z" horiz-adv-x="1024" /> + + + <glyph glyph-name="change" unicode="&#58901;" d="M335.07414 72.937559c-10.647199 10.647199-27.863946 10.647199-38.511145 0-10.647199-10.647199-10.647199-27.863946 0-38.511145l30.808916-30.808915h-125.047951c-81.326475 0-147.248493 66.148554-147.248493 147.248493v91.294066c0 14.951385-12.232952 27.184337-27.184337 27.184337s-27.184337-12.232952-27.184337-27.184337v-91.294066c0-111.229246 90.387921-201.617167 201.617167-201.617167h125.047951l-30.808916-30.808916c-10.647199-10.647199-10.647199-27.863946 0-38.511144 5.210331-5.210331 12.232952-7.928765 19.255573-7.928765s13.818705 2.718434 19.255572 7.928765l77.248824 77.248825c10.647199 10.647199 10.647199 27.863946 0 38.511144l-77.248824 77.248825zM476.432693 895.943366h-446.502738c-14.951385 0-27.184337-12.232952-27.184337-27.184337v-446.502738c0-14.951385 12.232952-27.184337 27.184337-27.184337h446.502738c14.951385 0 27.184337 12.232952 27.184337 27.184337v446.502738c0 14.951385-12.006416 27.184337-27.184337 27.184337z m-27.184337-446.502738h-392.134064v392.134064h392.134064v-392.134064zM821.447239 818.694541h-125.047951l30.808915 30.808916c10.647199 10.647199 10.647199 27.863946 0 38.511144s-27.863946 10.647199-38.511144 0l-77.022289-77.248825c-10.647199-10.647199-10.647199-27.863946 0-38.511144l77.248825-77.248825c5.210331-5.210331 12.232952-7.928765 19.255572-7.928765s13.818705 2.718434 19.255572 7.928765c10.647199 10.647199 10.647199 27.863946 0 38.511144l-30.808915 30.808916h125.047951c81.326475 0 147.248493-66.148554 147.248493-147.248493v-91.294066c0-14.951385 12.232952-27.184337 27.184337-27.184337s27.184337 12.232952 27.184337 27.184337v91.294066c0 111.229246-90.614457 201.617167-201.843703 201.617167zM994.067779-73.631326c-7.249157 0-14.271777-2.94497-19.255572-7.928765s-7.928765-12.006416-7.928765-19.255572c0-7.02262 2.94497-14.271777 7.928765-19.255572s12.006416-7.928765 19.255572-7.928765 14.271777 2.94497 19.255573 7.928765 7.928765 12.006416 7.928765 19.255572-2.94497 14.271777-7.928765 19.255572c-5.210331 4.983795-12.232952 7.928765-19.255573 7.928765zM882.385461-73.631326c-14.951385 0-27.184337-12.232952-27.184337-27.184337s12.232952-27.184337 27.184337-27.184337 27.184337 12.232952 27.184337 27.184337-12.232952 27.184337-27.184337 27.184337zM659.020824-73.631326c-14.951385 0-27.184337-12.232952-27.184337-27.184337s12.232952-27.184337 27.184337-27.184337 27.184337 12.232952 27.184337 27.184337-12.006416 27.184337-27.184337 27.184337zM770.703143-73.631326c-14.951385 0-27.184337-12.232952-27.184338-27.184337s12.232952-27.184337 27.184338-27.184337 27.184337 12.232952 27.184337 27.184337-12.232952 27.184337-27.184337 27.184337zM547.567307-73.631326c-7.249157 0-14.271777-2.94497-19.255572-7.928765s-7.928765-12.006416-7.928765-19.255572c0-7.02262 2.94497-14.271777 7.928765-19.255572s12.006416-7.928765 19.255572-7.928765c7.02262 0 14.271777 2.94497 19.255572 7.928765s7.928765 12.006416 7.928765 19.255572-2.94497 14.271777-7.928765 19.255572-12.235217 7.928765-19.255572 7.928765zM547.567307 38.050993c-14.951385 0-27.184337-12.232952-27.184337-27.184337s12.232952-27.184337 27.184337-27.184338 27.184337 12.232952 27.184337 27.184338-12.235217 27.184337-27.184337 27.184337zM547.567307 149.733311c-14.951385 0-27.184337-12.232952-27.184337-27.184337s12.232952-27.184337 27.184337-27.184337 27.184337 12.232952 27.184337 27.184337-12.235217 27.184337-27.184337 27.184337zM547.567307 261.41563c-14.951385 0-27.184337-12.232952-27.184337-27.184337s12.232952-27.184337 27.184337-27.184338 27.184337 12.232952 27.184337 27.184338-12.235217 27.184337-27.184337 27.184337zM547.567307 372.871412c-7.249157 0-14.271777-2.94497-19.255572-7.928765s-7.928765-12.006416-7.928765-19.255572 2.94497-14.271777 7.928765-19.255572 12.006416-7.928765 19.255572-7.928765c7.02262 0 14.271777 2.94497 19.255572 7.928765s7.928765 12.006416 7.928765 19.255572c0 7.02262-2.94497 14.271777-7.928765 19.255572-5.212597 5.210331-12.235217 7.928765-19.255572 7.928765zM882.385461 372.871412c-14.951385 0-27.184337-12.232952-27.184337-27.184337s12.232952-27.184337 27.184337-27.184337 27.184337 12.232952 27.184337 27.184337-12.232952 27.184337-27.184337 27.184337zM770.703143 372.871412c-14.951385 0-27.184337-12.232952-27.184338-27.184337s12.232952-27.184337 27.184338-27.184337 27.184337 12.232952 27.184337 27.184337-12.232952 27.184337-27.184337 27.184337zM659.020824 372.871412c-14.951385 0-27.184337-12.232952-27.184337-27.184337s12.232952-27.184337 27.184337-27.184337 27.184337 12.232952 27.184337 27.184337-12.006416 27.184337-27.184337 27.184337zM994.067779 372.871412c-7.249157 0-14.271777-2.94497-19.255572-7.928765s-7.928765-12.006416-7.928765-19.255572 2.94497-14.271777 7.928765-19.255572 12.006416-7.928765 19.255572-7.928765 14.271777 2.94497 19.255573 7.928765 7.928765 12.006416 7.928765 19.255572c0 7.02262-2.94497 14.271777-7.928765 19.255572-5.210331 4.983795-12.232952 7.928765-19.255573 7.928765zM994.067779 261.41563c-14.951385 0-27.184337-12.232952-27.184337-27.184337s12.232952-27.184337 27.184337-27.184338 27.184337 12.232952 27.184338 27.184338-12.232952 27.184337-27.184338 27.184337zM994.067779 38.050993c-14.951385 0-27.184337-12.232952-27.184337-27.184337s12.232952-27.184337 27.184337-27.184338 27.184337 12.232952 27.184338 27.184338-12.232952 27.184337-27.184338 27.184337zM994.067779 149.733311c-14.951385 0-27.184337-12.232952-27.184337-27.184337s12.232952-27.184337 27.184337-27.184337 27.184337 12.232952 27.184338 27.184337-12.232952 27.184337-27.184338 27.184337z" horiz-adv-x="1024" /> + + + <glyph glyph-name="analytics-chart-symb" unicode="&#58903;" d="M872.086821 721.841101c-85.632437 4.619932-147.490211-72.912467-151.762537-151.77062 3.059745-56.413288 28.818997-96.424403 64.097007-120.263736a727702.473159 727702.473159 0 0 0-102.624732-154.13111c-19.126437 9.999747-40.455728 16.054566-61.922445 17.202475-30.314513 1.641026-57.177214-8.601238-78.793482-25.759252-39.170393 43.757989-78.352911 87.503852-117.503095 131.265884 6.741948 14.037641 10.909183 29.392952 11.749905 44.857395 3.168877 58.915246-50.19275 101.533409-104.43956 104.45977-58.907162 3.172919-101.537451-50.212959-104.451686-104.45977a116.480485 116.480485 0 0 1 11.369963-44.424908c-32.181887-37.315145-64.3759-74.618163-96.557787-111.933308-14.22357 10.056334-31.628142 16.252621-51.30024 17.323733C39.29056 326.931919 2.642334 281.019578 0.120167 234.367563c-2.728306-50.65353 43.212328-87.293672 89.827965-89.795629 50.657572-2.732348 87.313882 43.184034 89.807755 89.795629-0.905393 17.016547-5.881016 32.185929-13.621321 45.237338 24.526462 28.426929 49.056966 56.870027 73.603638 85.309082a14441.308576 14441.308576 0 0 0 20.153088 23.3543c18.164456-17.178224 42.537325-27.941897 70.97638-29.481874 28.378426-1.519768 52.925098 10.149299 71.109764 28.641152 37.86889-42.335228 75.770115-84.654288 113.634963-126.97739-17.06505-23.374511-27.574081-52.027788-29.126185-80.968044 4.074271-75.406341 57.961349-129.265126 133.371732-133.351522 75.244663-4.041935 129.592522 64.080839 133.351522 133.351522 2.073513 38.608564-14.906657 71.631173-41.235821 95.236074 35.136542 52.771504 70.256915 105.538967 105.393457 158.298346 86.327649-31.126942 199.813061 14.522673 206.437792 137.033725 4.640141 85.66073-72.880131 147.542756-151.718075 151.790829z" horiz-adv-x="1024" /> + + + <glyph glyph-name="liuchengzhihangjilu-copy" unicode="&#58904;" d="M840.411429 442.514286h0.731428c36.571429 0 29.257143-42.861714 29.257143-58.514286v-176.786286a142.262857 142.262857 0 1 0-129.828571-239.762285c-55.588571 55.588571-55.588571 145.554286 0 201.142857 20.260571 20.260571 45.202286 33.133714 71.314285 38.619428V372.80914299999995c0 2.706286-0.219429 6.582857-0.365714 11.190857H541.257143v-176.786286a142.262857 142.262857 0 1 0-129.828572-239.762285c-55.588571 55.588571-55.588571 145.554286 0 201.142857 20.260571 20.260571 45.202286 33.133714 71.314286 38.619428V384H211.236571c0.585143-4.608 0.877714-8.484571 0.877715-11.190857v-165.595429a142.262857 142.262857 0 1 0-129.828572-239.762285c-55.588571 55.588571-55.588571 145.554286 0 201.142857 20.260571 20.260571 45.202286 33.133714 71.314286 38.619428V384c0 21.942857 9.142857 58.514286 29.257143 58.514286a11.190857 11.190857 0 0 0 0.804571 0H482.742857V566.637714a142.262857 142.262857 0 0 0-71.314286 239.762286A142.262857 142.262857 0 1 0 541.257143 566.637714V442.514286h299.081143zM447.926857 769.828571a90.477714 90.477714 0 1 1 128-128 90.477714 90.477714 0 0 1-128 128z m0-640a90.477714 90.477714 0 1 1 128-128 90.477714 90.477714 0 0 1-128 128z m-329.142857 0a90.477714 90.477714 0 0 1 128-128 90.477714 90.477714 0 1 1-128 128z m658.285714 0a90.477714 90.477714 0 1 1 128-128 90.477714 90.477714 0 0 1-128 128z" horiz-adv-x="1024" /> + + + <glyph glyph-name="chevron-down" unicode="&#58905;" d="M509.68416-7.528647L78.768897 339.981704 18.533221 265.846654l491.150939-393.846654 495.782619 393.846654-55.60183 74.13505zM1005.466779 821.864949L949.864949 896 509.68416 548.489648 78.768897 896 18.533221 821.864949l491.150939-393.846653zM509.68416 270.480501L78.768897 617.990852 18.533221 543.855802l491.150939-393.846654 495.782619 393.846654-55.60183 74.13505z" horiz-adv-x="1024" /> + + + <glyph glyph-name="agreement" unicode="&#58906;" d="M862.558 896H161.442c-11.264 0-20.398-9.132-20.398-20.398v-983.204c0-11.266 9.134-20.398 20.398-20.398h533.124c5.41 0 10.596 2.15 14.424 5.974l167.994 167.996a20.4 20.4 0 0 1 5.974 14.424V875.602c0 11.266-9.134 20.398-20.4 20.398z m-147.632-954.392l-0.088 98.514 98.514-0.09-98.426-98.424z m127.236 139.194l-147.724 0.134h-0.018a20.406 20.406 0 0 1-14.424-5.974 20.41 20.41 0 0 1-5.974-14.442l0.132-147.724H181.84V855.204h660.322v-774.402zM350.046 160.048c-51.294 0-93.026-41.73-93.026-93.026 0-51.298 41.734-93.028 93.026-93.028 51.296 0 93.028 41.73 93.028 93.028 0.004 51.294-41.73 93.026-93.028 93.026z m0-145.26c-28.8 0-52.23 23.432-52.23 52.232s23.43 52.23 52.23 52.23 52.232-23.43 52.232-52.23-23.428-52.232-52.232-52.232zM616.032 84.144H503.84c-11.264 0-20.398-9.132-20.398-20.398s9.134-20.398 20.398-20.398h112.192c11.264 0 20.398 9.132 20.398 20.398s-9.134 20.398-20.398 20.398zM342.694 773.61h-59.156c-11.264 0-20.398-9.132-20.398-20.398s9.134-20.398 20.398-20.398h59.156c11.264 0 20.398 9.132 20.398 20.398s-9.134 20.398-20.398 20.398zM748.622 773.61h-177.466c-11.264 0-20.398-9.132-20.398-20.398s9.134-20.398 20.398-20.398h177.466c11.264 0 20.398 9.132 20.398 20.398s-9.134 20.398-20.398 20.398zM748.622 685.896H446.726c-11.264 0-20.398-9.132-20.398-20.398s9.134-20.398 20.398-20.398h301.896c11.264 0 20.398 9.132 20.398 20.398s-9.134 20.398-20.398 20.398zM749.642 524.75H274.358c-11.264 0-20.398-9.132-20.398-20.398s9.134-20.398 20.398-20.398H749.64c11.264 0 20.398 9.132 20.398 20.398s-9.132 20.398-20.396 20.398zM749.642 455.394H274.358c-11.264 0-20.398-9.132-20.398-20.398s9.134-20.398 20.398-20.398H749.64c11.264 0 20.398 9.132 20.398 20.398 0.002 11.266-9.132 20.398-20.396 20.398zM749.642 379.92H274.358c-11.264 0-20.398-9.132-20.398-20.398s9.134-20.398 20.398-20.398H749.64c11.264 0 20.398 9.132 20.398 20.398 0.002 11.266-9.132 20.398-20.396 20.398zM749.642 310.566h-11.22c-11.264 0-20.398-9.132-20.398-20.398s9.134-20.398 20.398-20.398h11.22c11.264 0 20.398 9.132 20.398 20.398s-9.134 20.398-20.398 20.398zM667.028 310.566H274.358c-11.264 0-20.398-9.132-20.398-20.398s9.134-20.398 20.398-20.398h392.67c11.264 0 20.398 9.132 20.398 20.398s-9.134 20.398-20.398 20.398z" horiz-adv-x="1024" /> + + + <glyph glyph-name="note" unicode="&#58907;" d="M1003.161721 896H20.838279a20.838279 20.838279 0 0 1-20.838279-20.838279v-982.323442a20.838279 20.838279 0 0 1 20.838279-20.838279h834.993333a20.838279 20.838279 0 0 1 0 41.676559H41.676559V854.323441h940.646882v-961.485162a20.838279 20.838279 0 0 1 41.676559 0V875.161721a20.838279 20.838279 0 0 1-20.838279 20.838279zM228.578561 679.208959c-44.04865 0-79.880071-35.831422-79.880072-79.880071s35.831422-79.880071 79.880072-79.880071 79.880071 35.831422 79.880071 79.880071-35.831422 79.880071-79.880071 79.880071z m0-118.083583c-21.064028 0-38.203512 17.139485-38.203513 38.203512s17.139485 38.203512 38.203513 38.203512 38.203512-17.139485 38.203512-38.203512-17.136012-38.203512-38.203512-38.203512zM857.199992 620.167167h-486.226521a20.838279 20.838279 0 0 1 0-41.676558h486.226521a20.838279 20.838279 0 0 1 0 41.676558zM228.578561 463.880071a20.838279 20.838279 0 0 1 0-41.676559c21.064028 0 38.203512-17.139485 38.203512-38.203512s-17.139485-38.203512-38.203512-38.203512-38.203512 17.139485-38.203513 38.203512a20.838279 20.838279 0 0 1-41.676559 0c0-44.04865 35.831422-79.880071 79.880072-79.880071s79.880071 35.831422 79.880071 79.880071-35.831422 79.880071-79.880071 79.880071zM857.199992 404.838279h-486.226521a20.838279 20.838279 0 0 1 0-41.676558h486.226521a20.838279 20.838279 0 0 1 0 41.676558zM228.578561 248.551183c-44.04865 0-79.880071-35.831422-79.880072-79.880071s35.831422-79.880071 79.880072-79.880071 79.880071 35.831422 79.880071 79.880071-35.831422 79.880071-79.880071 79.880071z m0-118.083583c-21.064028 0-38.203512 17.139485-38.203513 38.203512s17.139485 38.203512 38.203513 38.203512 38.203512-17.139485 38.203512-38.203512-17.136012-38.203512-38.203512-38.203512zM857.199992 189.509391h-486.226521a20.838279 20.838279 0 0 1 0-41.676558h486.226521a20.838279 20.838279 0 0 1 0 41.676558z" horiz-adv-x="1024" /> + + + <glyph glyph-name="painter-palette" unicode="&#58908;" d="M512 896C227.555556 896 0 668.444444 0 384S227.555556-128 512-128c45.511111 0 85.333333 39.822222 85.333333 85.333333 0 22.755556-5.688889 39.822222-22.755555 56.888889-11.377778 17.066667-22.755556 34.133333-22.755556 56.888889 0 45.511111 39.824453 85.333333 85.333334 85.333333h102.4c159.288889 0 284.444444 125.155556 284.444444 284.444445C1024 691.2 796.444444 896 512 896zM199.111111 384c-45.511111 0-85.333333 39.822222-85.333333 85.333333S153.6 554.666667 199.111111 554.666667s85.333333-39.822222 85.333333-85.333334-39.822222-85.333333-85.333333-85.333333z m170.666667 227.555556c-45.511111 0-85.333333 39.822222-85.333334 85.333333S324.266667 782.222222 369.777778 782.222222 455.111111 742.4 455.111111 696.888889s-39.822222-85.333333-85.333333-85.333333z m284.444444 0c-45.511111 0-85.333333 39.822222-85.333333 85.333333S608.711111 782.222222 654.222222 782.222222s85.333333-39.822222 85.333334-85.333333-39.822222-85.333333-85.333334-85.333333z m170.666667-227.555556c-45.511111 0-85.333333 39.822222-85.333333 85.333333S779.377778 554.666667 824.888889 554.666667 910.222222 514.844444 910.222222 469.333333s-39.822222-85.333333-85.333333-85.333333z" horiz-adv-x="1024" /> + + + + + </font> +</defs></svg> diff --git a/cyclone-web/vendor/fonts_tab/iconfont.ttf b/cyclone-web/vendor/fonts_tab/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..51771e2c13393b8963846849d02fdc2803800ded Binary files /dev/null and b/cyclone-web/vendor/fonts_tab/iconfont.ttf differ diff --git a/cyclone-web/vendor/fonts_tab/iconfont.woff b/cyclone-web/vendor/fonts_tab/iconfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..4e00f78ac88f080f4284410f7439fa679006c310 Binary files /dev/null and b/cyclone-web/vendor/fonts_tab/iconfont.woff differ diff --git a/cyclone-web/vendor/fonts_tab/test.css b/cyclone-web/vendor/fonts_tab/test.css new file mode 100644 index 0000000000000000000000000000000000000000..b095dcc3eaebb5aed277f482e80aeed140dbd59b --- /dev/null +++ b/cyclone-web/vendor/fonts_tab/test.css @@ -0,0 +1,109 @@ +@font-face { + font-family: "conf"; + src: url("iconfont.eot?t=1522222620030"); /* IE9*/ + src: url("iconfont.eot?t=1522222620030#iefix") format("embedded-opentype"), + /* IE6-IE8 */ + url("data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAABHcAAsAAAAAHrwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAAQwAAAFZW8EgiY21hcAAAAYAAAADJAAACjJux+nFnbHlmAAACTAAADLUAABaEQn4Fy2hlYWQAAA8EAAAAMQAAADYRMBIyaGhlYQAADzgAAAAgAAAAJAgtBDtobXR4AAAPWAAAACoAAABMTXf/+mxvY2EAAA+EAAAAKAAAACgxGDX6bWF4cAAAD6wAAAAfAAAAIAExAQpuYW1lAAAPzAAAAUMAAAI9ChTRrHBvc3QAABEQAAAAyQAAASHxksl9eJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2BkEWGcwMDKwMHUyXSGgYGhH0IzvmYwYuRgYGBiYGVmwAoC0lxTGBwYKp5JMzf8b2CIYW5kaAIKM4LkANvTC6cAeJzFkk1SwzAMRp/b0N8USEOnlLLgAD0XZ8g5WHHC7wTdt58tseAEledlIo1G9vgZeALm5mI6KL8Uavy4Wlp9zqbVO76d96yY+X/SWoMOOt9urk4qzkYdW/YXxd09n15fLZt5VucdFyw9ZW02bN2x45kXXhnYu23Bw6I8buv/0bfvNbPRTImPqMT3iZLqUEn1qKT6VeJ7R4kNoMQeUGIrKGn1IahvQGNgZ+gtqCfVIbBHdAxsFL0HdotOgS2jj4A6+xywvwMobDWJAAAAeJztOFtsHNd198zsvHZmZ2d2Xssl9zGz4s7ysSuR+xhRFElLpGJatkjFtPyQZMdOHCNGE8NQYslt7IqOlUAy0tZunSKJZSMOXCVo48LyR2Aghh2g/UiKCk3UIFKCQK3bvFDLaYwaKVrsDnvuzC5FWlZg+LuLmfO6556599x7zzl3CUfI2hvsq2yWGKRKJsgC2U8I8GPgqUweXL9ZZ8bAcjnLMVXWL/uuUPbq7Aw4Hm/ak+1mxeEFPg0qFKDhTrb9OuNDqznLTMOknQcYGMytZIaHMuyTkMz6hc+He5mvg1UsD6Vna+EN43PmZMkQjymZzEAm80WR5ziRYRJpFT7l2BInJfnwBS6ds14tjjBFUAb83E13pEqDmXtONh/IDzsSwOoqGIMl9Rtzek7H55GcbWQGBC0lZnOp8hYTjv1czhpKvvLvBH90rqvsX7CrRCED5AD5ODmGc1VBsAow2Z6BZiWo+BWcTzSzrVCug+9icxlfvQCOOwtBq1nx+Dzt5GKrPgvT0GtpTNpOz1AdBJOnCmizHbgFsHTwKyrOwZ4MoF0HXmAf0EwAs2hZHMvKlijbeTt50IOp0fCl0SnwRrczzPZR5jBiY8gEI9V9IWUAYqoC+6lKxA8ZMPVnhhq+pBqGCvtVI/zdE8lsBsTnpUEJPBHMnATfgYHMCSObNU5kBj7BAMcJSt6280pnbAfAjjHYPtatj20HxC+qpqm+qOoAusqcT2ViBV29Pm2Y6vWj2+dV+lF1T4zCvwp/9TkR9Kz0ZUmCCSmnMxL6WaB+ThD0M4u0TNK4txwySMgAuDrnWi64LXe45Vpswyo7VrmltxpWgnQW2Ic7J6+8507SH7vaIQmyfLn7xOXly5fh4tJbS0vhsaUl/E5irbN2PHEz+xh+o0TaZB+upu2kgC9X/Bq0A48XON50OLoowXC76Q/XgfUqFM2Cw+FaDLcLQJWE95KqwPhDEnw8fEY3B5Phabg3OWhWtXChWIRXtepINQ2vlkrhHq1qDUyY4VJa1koavOzszsJZvaTJWrhcm6Qty0iXdDjrzDvrLeYEOwH8a68JFPD7RfGSNqZfEgVBvKSPaZdEsXM5mbwouCVZvCDLF4RkyRUumii7ILqlpHBRli9SmXghmUT3UH8vo7+LZITUSIB+cPt71irTk0rPZrPil1t0p+p14NxJ29JdvdmGcqsx7HqVGXAtk2e7nQO47aFehhOriq4r8HUKj8MJbyvA1k6D/euk0hlJwe9qNXi9c0BKsRdS7CrUvO4feDV4Ss/q2oAGT6GA+ZJXm1Kk7luMISmdh57aoSQXF5MKPYdra7hugOu2RA6S+8hD5DFChv1ZDBwVH8/RLINRB+MPniZHqAM9fqZNKb8nRI0ZCDDi4Lo6KvRE2AnnyiKDHVB5FqdBYRBJjJgwVcarMxsbWL5hDoz7A7nSdC2brU1fhwiqecOoZu86zialWnZ+jDYxd+yhqFE42KosDDWTWk+AXUrZ+o5qABBUI9j99QbmFVTbcwfTN/yvG5rONIcWKq2DhUavkVoam8/WpCR7/K5s1TDyVaCyuHspN+CPD5gNs569Yk9jnuxbQ9iFDQwUUe3KGMPVDW2EJHHPfClRxD2z8YR+mjxNniVn4pPqthrveVoBj1dA42PFS0PFx0XDbIExkRd8KuHNIpJlKjHtaTyQApXYk3NIWlRCIySuG5VQK21c8Sj4Yh5hMJX4la1MZSsE7TmmPQeOXWTsIgg+PcQ09jpeZRZzi8kzHugLnb9nobMGvwoH6MvC2aP4gxPbeMVLJNpcKuFajiTcxEtZ00ukuBbHuQq/VZAkYSuvuBwKUgnPzEr8TYLkWC6qtBMJT8FWSbqfEw1P1YeHtbRniAlZTvR4XUWeS8q/gPaH2/jcnbbAzJsmhqpTcGABLi2c6146t3DuHHxl4dzCQvhW1va4FBdwHFreRj++TaDjC1Do2VlJWBKkngr9OD9BVSZwChy3UeVuPe2ZIifLnGiW05pf0dNlQ6LjkoxyWq/43mgQ3BIE+6yCZRXNOA7/cZTvUmQIY8MY2U5uwLy3Hh1oVGjpQkPny67n65iqcIGCloOhDw9cYxYXxRf6wQNVeBQHro2M4GIQwfhKD2dflfmH8EixClAtMmpx5I3nGKb7WxaAhaly4QvhnSldT/2Agt9oChxUNE0Jzyha+E7BZv7QLhTs7l8yhUSegf/9QV8T44qf72byvp9nVua6bwEwlwGezZVnTp78DBh5moMQ/A3mrCHTDM2sDCBPJIG9NSvL2ZCsq2DMUdZzkoO5YgS98ClylBwn3yTfJd8n50kXvdKKpmRFM9KjpKFHLmi2aS1TEQyT9yot3Z7D/Y16vDChAiaOCTwDuGErTdzPwQQ+dH86E9Fjm8MfyCrGp6tsYrSawKNgm1zsez0yGZUcQYuaZKlJS++ZnIH3M9B1o0CgfXMb8uVyvk88mxnKlErXRXAnQEKUZCXv5RVZEhNMAp8rAolLMN99vwacjf0Lbo8Pv/aBBxAbYF6/Z6TdHrnH3r202w6LlIY3KHNMzWTUeZ7vspSAv+P5zzFsKgk4bJm+kExxqSF85b5ETaeG/uSDWMu821hGlin/X/AGtRAWI3NXLMN/UyPhDM+Hj/fs/t6x9czFtexL7M/YW8kezKK3kbvJ/biDGwVazDIqhuVKM2gHNKlvYFsu7riNPK1OW3WmHcxiFUsLYbZX1XvrBHcVwS5CjmPqO5Wxldvd0dFiNXy7vlMeXbndGxkpVcPfQm1GHr3ltohT0zDuT9nGoHf7yqi8s37nYLDYbi8OxSh8JsbM0Vx7MQgW4TvsqHo2uevOpZF0afzIeEE8I29izwqJM5v4jM88IjZvunHITY8sH96VfASuH6KW2t37YpzbhAhWpGTtp4kpthLdASqEGHH5jgcSgyJ7TeZRqOTZZr5SyXf+MV+B38etYiEEtQUKwlMRPU8Bc8pdpwkR1+NRGiPzVtIg8+R6ciNZprk3DrktPQ663Hqk7gVhfXN7gHWc8S4dA2XQe7GIu4MWceE3FB1+CFoK3olYRdHDOm1MaVqKNmL5+8iG5pQ2C6+Ei/BK5yg47MfC16J6cDeF3bcpZNIIw5kNzBdACP8nfP6Kqhb+ExXBt+FH4Xi4l0JCMDVh/Uew/otnvkIO413sAbyNrZJT5M/JM+QF8iL5NnmdfI/8kPyU4OVtGDM/VhH0Rta7geHiNKKbGq0ifAPnbPX8QutbFssXrhzQ7RpXJPGNDs8HrUHiO5rRv8KWryIaV0n8dYJG3c2SPuFe2+B6k3AVsW4QlkVbEwuPzq4wmpNmjhx4tCBqtrhPFK8LdyvptAKvKWmAtB8+DCfhM48We637Nne7TdY0W9M+i8hJp9+M0b3Y39G0/4iRTFE6/R5I02A+7vHZmO2ZiaRoVY5ZZRO6AQciFWBl7hAd5aFbjzBFOqR9kiWxJzQ53IVqMryO155dcMpZb9v37m6dz9MvOulrwQdj6kGgw0V2k/RasKf1L5v7ElhbwwskMP9MdmLcxEs/vWtgWBT8dtCmSyrYEc/Tq4fdDrDkjbATadqRUhAh9hO7bubYcu6+vFt3H0oCzI3WplgmeY9V8LexrWEEjHLX0Ji1RT0yyCYWd0wtJjDf3r/nMQkOMefh0OzozsxX0wwMPm472HN2zLEeRLY9XJlAuCVnfjLHQlo9vqVGe+5vF7ZlnnMWDu9a6f+n8f954IPlgVX2Nxh/Obz/6OhIECTwDV8CAayIhjD88E54E/4zCIJwMaL7AhEO7w2PwhN74d/2hi9EzHN9ESFqZPvTaFvHWFcgPtmGu2yR3IKr80nyMDlBniSnaRW+HrMwhtHIzbYaQXmCRjcMX9CPC4JXoYWdyQdROImL7bjwno4uRcMbaMG9ct1/X/SGvjTP9eXsR7q7RUURGVvkv8krpz+af1pUQpN5OjT9Vmu52axizT5eKLzzIK1TKAh/OS0pijSNveBPX6bSl6mB8DwloY60EG6hEvhZJL8GrfTBofBYJD2F/dlVRexURQWHIrLbRKXzoY+OKOLT7N92b4DWUgufJ+lgxgt7FJ1eAjAdvUxhn0N8m0KR8nyMPkQrqYx8Y8ztgZiFHsZzJfVy1CrJkTIZx5vT/l6W+qNNKxe5DZMsrcLpEnLrq1aHeNWGI2/HlQQXOZ5KsRynecyKr7XchhV5Lwsb1uXNzih1MztP3do5z34Lx6wonbe9Wm2+Xnd1y3Iti7k3zFEt+CXC7uOU1GgD4GSB6jErmxSu3Rk9L0VfRO+w3+rMRd/+saT8hFY4+DwEtItr7VBi9ymnlYxil2xbo5oeVcEm7K6c7vU42usxHQ0cnf1/C4a35wAAAHicY2BkYGAA4ozKVdrx/DZfGbhZGEDg2sN0aRj9/8//OpYg5kYgl4OBCSQKAEPLDDUAAAB4nGNgZGBgbvjfwBDDsur/n/9/WYIYgCIoQBgAtwAHb3icY2FgYGB+ycDAwgDF/v//sPiD2P//s7ggiYPwKmQ+UJ4BVR4AiC4IuAAAAAAAAAB2ASoBXgHiAjoC/APuBHQF3AZ4BrwHOgh8COAJfAmqCowLQnicY2BkYGAQZvjHIMIAAkxAzAWEDAz/wXwGACTlAjwAeJxdkLtOwzAUhv+0aYFUYgCBxOYBIQRSemFAdK3U7h26t6nTi5I4ctxKfRpGnoCRkadAYuFF+JOedqgtH3/nPzfLAK7wCw/7dcOzZw8+vT3XcIY74Tp1Jexz3ws30MKjcJP6i3CAZ7wKt3CNGTt4/gW9J2yEPZzjXbiGS3wI16l/CvvkL+EGbvEt3KT+Ixxggj/hFh68t2Bg9dTpuZrt1CoyWWwyF5T3WC82ydSWWJ6JtsXKZKobdkp3pDNtD3XFdtFzLlaxNakasoFOEqNya9Y6cuHSubzfbseih5FJ+YwBLDSmcLRzftcMO9oVIhhkiCvrmHfwx8xb8DsS1tijergnjFoUrC99hS5CdI7REaNZlXE6r8CWXXtUHfMUj2VNShrKCzQnJmSFvIqtqUTUQyyrqhx9tLnjk/ywmp7+AylsYV4AeJxtjUFagzAQhfOwRQvUVunCS7DwFB5ALxDSMQwfTPIFosLpTe3GRd/y/W/+UZm6plC3UyPDHTbYIsc9HrBDgRIV9njEAUc84Rk1Tgo/e+vEnrVMHYnnqudPLdYTrx1v34KL/rB2sWej3Rpdz0Ms07Il7plCzN4/jqleKK27dHfhhddBjzRTmOqBo0le+w/nf9LX8vpidK2W3FwgnbToYZnZTE0qwtxMy9i+3FA0xvmlSu1XcNKc3bfstA1EI8m8ETeTUr+zc1KNAAAA") + format("woff"), + url("iconfont.ttf?t=1522222620030") format("truetype"), + /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ + url("iconfont.svg?t=1522222620030#conf") format("svg"); /* iOS 4.1- */ +} + +.conf { + font-family: "conf" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-gongdanshenpi:before { + content: "\e601"; + font-size: 12px; +} + +.icon-jifangpeizhi:before { + content: "\e602"; + font-size: 12px; +} + +.icon-Group:before { + content: "\e603"; + font-size: 12px; +} + +.icon-zhujicaozuojilu:before { + content: "\e604"; + font-size: 12px; +} + +.icon-shebeijieru:before { + content: "\e605"; + font-size: 12px; +} + +.icon-ST:before { + content: "\e606"; + font-size: 12px; +} + +.icon-zuoyezhihangjilu:before { + content: "\e607"; + font-size: 12px; +} + +.icon-parameters:before { + content: "\e608"; + font-size: 12px; +} + +.icon-zuoyezhihangjilu1:before { + content: "\e609"; + font-size: 12px; +} + +.icon-liuchengzhihangjilu:before { + content: "\e611"; + font-size: 12px; +} + +.icon-Group1:before { + content: "\e613"; + font-size: 20px; +} + +.icon-peizhimoban:before { + content: "\e614"; + font-size: 12px; +} + +.icon-change:before { + content: "\e615"; + font-size: 12px; +} + +.icon-analytics-chart-symb:before { + content: "\e617"; + font-size: 12px; +} + +.icon-liuchengzhihangjilu-copy:before { + content: "\e618"; + font-size: 12px; +} + +.icon-chevron-down:before { + content: "\e619"; + font-size: 12px; +} + +.icon-agreement:before { + content: "\e61a"; + font-size: 12px; +} + +.icon-note:before { + content: "\e61b"; + font-size: 12px; +} diff --git a/cyclone-web/vendor/gojs/VerticalCenterLayout.js b/cyclone-web/vendor/gojs/VerticalCenterLayout.js new file mode 100644 index 0000000000000000000000000000000000000000..5c3d626485c7dba2ef2bc49701535a1b755963f3 --- /dev/null +++ b/cyclone-web/vendor/gojs/VerticalCenterLayout.js @@ -0,0 +1,118 @@ +/** + * 自定义的一个垂直居中布局样式 + * + * Created by zhangrong on 16/6/21. + */ + +/** + * @constructor + * @extends Layout + * @class + * This layout assumes the graph is a chain of Nodes, + * positioning nodes in horizontal rows back and forth, alternating between left-to-right + * and right-to-left within the {@link #wrap} limit. + * {@link #spacing} controls the distance between nodes. + * <p/> + * When this layout is the Diagram.layout, it is automatically invalidated when the viewport changes size. + */ +function VerticalCenterLayout() { + go.Layout.call(this); + // this.isViewportSized = true; + this._spacing = new go.Size(30, 30); +} +go.Diagram.inherit(VerticalCenterLayout, go.Layout); + +/** + * @ignore + * Copies properties to a cloned Layout. + * @this {VerticalCenterLayout} + * @param {Layout} copy + * @override + */ +VerticalCenterLayout.prototype.cloneProtected = function (copy) { + go.Layout.prototype.cloneProtected.call(this, copy); + copy._spacing = this._spacing; +}; + +/** + * This method actually positions all of the Nodes, assuming that the ordering of the nodes + * is given by a single link from one node to the next. + * This respects the {@link #spacing} and {@link #wrap} properties to affect the layout. + * @this {VerticalCenterLayout} + * @param {Diagram|Group|Iterable} coll the collection of Parts to layout. + */ +VerticalCenterLayout.prototype.doLayout = function (coll) { + + var isDiagram = false; + + if (coll === this.diagram) { + coll = this.diagram.nodes; + isDiagram = true; + } else if (coll === this.group) { + coll = this.group.memberParts; + isDiagram = false; + } + + var it = coll.iterator; + var all = []; + + while (it.next()) { + var node = it.value; + if (!(node instanceof go.Node)) continue; + + if (isDiagram) { + if (node.isTopLevel) { + all.push(node); + } + } else { + all.push(node); + } + + } + + var x = 0; + var y = 0; + + var maxWidth = Math.max.apply(Math, all.map(function (node) { + return node.actualBounds.width; + })); + var spacing = this.spacing; + + all.forEach(function (n) { + var dd = n.actualBounds; + + x = ((maxWidth - dd.width) / 2); + + n.move(new go.Point(x, y)); + + y += (dd.height + spacing.height); + + }); + +}; + +// Public properties + +/** + * Gets or sets the {@link Size} whose width specifies the horizontal space between nodes + * and whose height specifies the minimum vertical space between nodes. + * The default value is 30x30. + * @name VerticalCenterLayout#spacing + * @function. + * @return {Size} + */ +Object.defineProperty(VerticalCenterLayout.prototype, "spacing", { + get: function () { + return this._spacing; + }, + set: function (val) { + if (!(val instanceof go.Size)) { + throw new Error("new value for VerticalCenterLayout.spacing must be a Size, not: " + val); + } + + if (!this._spacing.equals(val)) { + this._spacing = val; + this.invalidateLayout(); + } + } +}); diff --git a/cyclone-web/vendor/gojs/go-debug.js b/cyclone-web/vendor/gojs/go-debug.js new file mode 100644 index 0000000000000000000000000000000000000000..9a196b505481901a0ee98236467c3b6539295716 --- /dev/null +++ b/cyclone-web/vendor/gojs/go-debug.js @@ -0,0 +1,2070 @@ +/* + * GoJS v1.6.21 JavaScript Library for HTML Diagrams + * Northwoods Software, https://www.nwoods.com/ + * GoJS and Northwoods Software are registered trademarks of Northwoods Software Corporation. + * Copyright (C) 1998-2016 by Northwoods Software Corporation. All Rights Reserved. + * THIS SOFTWARE IS LICENSED. THE LICENSE AGREEMENT IS AT: https://gojs.net/1.6.21/doc/license.html. + */ +(function(window) { var f,aa={};if(!window.document||void 0===window.document.createElement("canvas").getContext)throw window.console&&window.console.log("The HTML Canvas element is not supported in this browser,or this browser is in Compatibility mode."),Error("The HTML Canvas element is not supported in this browser,or this browser is in Compatibility mode.");if(!Object.defineProperty)throw Error("GoJS requires a newer version of JavaScript"); +Function.prototype.bind||(Function.prototype.bind=function(a){function b(){return g.apply(a,e.concat(d.call(arguments)))}function c(){}var d=Array.prototype.slice,e=d.call(arguments,1),g=this;c.prototype=this.prototype;b.prototype=new c;return b}); +(function(){for(var a=0,b=["ms","moz","webkit","o"],c=0;c<b.length&&!window.requestAnimationFrame;++c)window.requestAnimationFrame=window[b[c]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[b[c]+"CancelAnimationFrame"]||window[b[c]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(b){var c=(new Date).getTime(),g=Math.max(8,16-(c-a)),h=window.setTimeout(function(){b(c+g)},g);a=c+g;return h});window.cancelAnimationFrame||(window.cancelAnimationFrame= +function(a){window.clearTimeout(a)})})(); +var u={cj:!1,Rz:!1,lE:!1,AH:!1,eF:!1,DE:!1,ut:null,enableBoundsInfo:function(a){u.cj=!0;a&&a.Sp()},disableBoundsInfo:function(a){u.cj=!1;a&&(ca(a.gd,!0),a.Sp())},iE:function(a,b){void 0===a&&(a=u.ut);void 0===b&&(b=a.Gl("").mb);var c=b.length,d=a.gd;d.fillStyle="rgba(255,255,0,.3)";for(var e=0;e<c;e++){var g=b.ea(e),h=g.W;if(null!==g.va)u.iE(a,g.va);else{var k=g.Ak.copy();k.uA(g.Hd);d.save();d.transform(k.m11,k.m12,k.m21,k.m22,k.dx,k.dy);d.fillRect(h.x,h.y,h.width,h.height);d.restore()}}},jE:function(a, +b){a||(a=u.ut);b||(b=a.Gl("").mb);var c=a.gd,d=b.length;c.fillStyle="rgba(0,0,255,.3)";for(var e=0;e<d;e++){var g=b.ea(e),h=g.Ga,k=g.Ak;null!==g.va?u.jE(a,g.va):(c.save(),c.transform(k.m11,k.m12,k.m21,k.m22,k.dx,k.dy),c.fillRect(h.x,h.y,h.width,h.height),c.restore())}},vH:function(a,b){a||(a=u.ut);b||(b=a.Gl("").mb);var c=a.gd,d=b.length;c.fillStyle="rgba(0,0,255,.3)";for(var e=0;e<d;e++){var g=b.ea(e),h=g.Ia,k=g.Ak;null!==g.va?u.vH(a,g.va):(c.save(),c.transform(k.m11,k.m12,k.m21,k.m22,k.dx,k.dy), +c.fillRect(h.x||0,h.y||0,h.width,h.height),c.restore())}},vK:function(){u.jE();u.iE()},wK:function(a){a||(a=u.ut);var b=a.ad;a=a.gd;a.strokeStyle="rgba(0,255,0,.9)";a.rect(b.x,b.y,b.width,b.height);a.stroke()},kE:function(a,b){b.fillStyle="red";b.fillRect(0,0,8,8);b.lineWidth=8;b.strokeStyle="rgba(255,255,0,.6)";var c=a.xb;b.rect(c.x,c.y,c.width,c.height);b.stroke();b.fillStyle="rgba(0,255,0,.2)";b.fillRect(a.ad.x,a.ad.y,a.ad.width,a.ad.height)},wH:function(a,b){b instanceof da||(a.lineWidth=2,a.strokeStyle= +"rgba(255,0,0,.5)",a.rect(b.Xb.x,b.Xb.y,b.Xb.width,b.Xb.height),a.stroke(),void 0!==b.stroke&&(a.strokeStyle=b.stroke),void 0!==b.Oe&&(a.lineWidth=b.Oe),null!==b.T&&b.T.type===ga&&(a.lineWidth=1,a.strokeStyle="rgba(10,200,10,.6)",void 0!==b.stroke&&(a.strokeStyle=b.stroke),void 0!==b.Oe&&(a.lineWidth=b.Oe)))},xH:function(a,b){a.lineWidth=1;a.strokeStyle="rgba(0,0,255,.5)";a.rect(b.Ga.x,b.Ga.y,b.Ga.width,b.Ga.height);a.stroke();void 0!==b.stroke&&(a.strokeStyle=b.stroke);void 0!==b.Oe&&(a.lineWidth= +b.Oe)},Qz:function(a,b,c){a.setTransform(1,0,0,1,0,0);a.scale(b.jd,b.jd);a.transform(c.m11,c.m12,c.m21,c.m22,c.dx,c.dy);c=b.Yb.length;for(var d=0;d<c;d++)for(var e=b.Yb.ea(d),g=e.mb.length,h=0;h<g;h++){var k=e.mb.ea(h);if(void 0!==k.location&&null!==k.location){if(k.location.F()){var l=k.location.x,m=k.location.y;a.beginPath();a.strokeStyle="limegreen";a.lineWidth=2;a.moveTo(l,m+6);a.lineTo(l,m);a.lineTo(l+6,m);a.moveTo(l,m);a.lineTo(l+10,m+20);a.stroke()}l=k.position.x;m=k.position.y;a.beginPath(); +a.strokeStyle="red";a.lineWidth=2;a.moveTo(l,m+6);a.lineTo(l,m);a.lineTo(l+6,m);a.moveTo(l,m);a.lineTo(l+20,m+10);a.stroke()}}a.setTransform(1,0,0,1,0,0)},xK:function(a,b,c){var d=a.length;b.fillStyle="rgba(255,0,0,.1)";for(var e=0;e<d;e++){var g,h=a[e];g=c.Hd;var k=h.x,l=h.y,m=k+h.width,n=l+h.height,p=g.m11,q=g.m12,r=g.m21,s=g.m22,t=g.dx,v=g.dy,x=k*p+l*r+t,h=k*q+l*s+v;g=m*p+l*r+t;var l=m*q+l*s+v,y=k*p+n*r+t,k=k*q+n*s+v,p=m*p+n*r+t,m=m*q+n*s+v,n=x,q=h,n=Math.min(n,g),x=Math.max(x,g),q=Math.min(q, +l),h=Math.max(h,l),n=Math.min(n,y),x=Math.max(x,y),q=Math.min(q,k),h=Math.max(h,k),n=Math.min(n,p),x=Math.max(x,p),q=Math.min(q,m),h=Math.max(h,m);g=new w(n,q,x-n,h-q);b.fillRect(g.x,g.y,g.width,g.height)}},yH:function(a,b,c,d,e){a.fillStyle="rgba(0,255,0,.2)";a.fillRect(b,c,d,e)},zH:function(a,b,c){a.save();var d=b.Hd;d.reset();1!==b.scale&&d.scale(b.scale);b=b.position;0===b.x&&0===b.y||d.translate(-b.x,-b.y);a.setTransform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy);c=c.Yc.o;d=c.length;for(b=0;b<d;b++){var e= +c[b];a.beginPath();a.moveTo(e.x-4,e.y);a.lineTo(e.x+4,e.y);a.moveTo(e.x,e.y-4);a.lineTo(e.x,e.y+4);a.lineWidth=2;a.strokeStyle="rgba(255,0,0,.9)";a.stroke()}a.restore()},tK:function(a){a||(a=u.ut);for(a=a.ln;a.next();)z.trace(a.value.toString())},nL:function(a,b){var c=b.ko(a),d=b.Qb;d.ue=b.$A(c);d.ga=c;return ha(b,d,a)},iL:function(a,b){b.pe(a.ga)&&(b.gd.fillStyle="lime",b.gd.fillRect(a.ue.x,a.ue.y,1*b.scale,1*b.scale))},jL:function(a){var b=ja(a,!1,null,null);if(!b.yp){a=a.gd;for(var c=0;c<=b.Nm;c++)for(var d= +0;d<=b.Om;d++){var e=b.lc[c][d];if(0!==e){var g=c*b.Rd+b.Sf,h=d*b.zd+b.Tf;0!==e&&(a.fillStyle="rgba(255, 0, 0, .2)",a.fillRect(g,h,b.Rd,b.zd));999999<=e||(e%=10,a.fillStyle="blue",a.fillText(e.toString(),g,h+b.zd))}}}},dumpReferences:function(a){if(a instanceof B)for(a=a.ln;a.next();){var b=a.value;z.trace(b.toString());for(b=b.oi;b.next();)u.dumpReferences(b.value)}else if(a instanceof D){z.trace("References for "+a);null!==a.layer&&z.trace(" "+a.layer.toString()+' LayerName: "'+a.If+'"');a.un!== +a&&z.trace(" SelectionObject: "+a.un.toString()+' SelectionObjectName: "'+a.Jx+'"');a.Zb!==a&&z.trace(" LocationObject: "+a.Zb.toString()+' LocationObjectName: "'+a.tx+'"');if(a.Xg){for(var c="",b=a.Xg.i;b.next();)c+=b.key+" ";z.trace(" Adornments: "+c)}null!==a.Va&&z.trace(" ContainingGroup: "+a.Va.toString());if(a instanceof E){if(a.Dd)for(b=a.Dd.i;b.next(););if(0<a.ee.count){c="";for(b=a.ee;b.next();)c+=b.value.toString()+", ";z.trace(" Links: "+c)}null!==a.Nd&&z.trace(" LabeledLink: "+a.Nd.toString()); +if(a instanceof F){z.trace(" Placeholder: "+a.placeholder);c="";for(b=a.Hc;b.next();)c+=b.value.toString()+", ";z.trace(" Members: "+c);c="";for(b=a.vm.i;b.next();)c+=b.value.toString()+", ";z.trace(" NestedGroups: "+c);z.trace(" Layout: "+a.Sb)}}else if(a instanceof G){z.trace(" Path: "+a.path);z.trace(" From: "+a.Y+" "+a.md+' "'+a.ag+'"');z.trace(" To: "+a.da+" "+a.Qd+' "'+a.Vg+'"');c="";for(b=a.Hf;b.next();)c+=b.value.toString()+", ";z.trace(" LabelNodes: "+c)}}},dumpVisualTree:function(a){if(a instanceof +B)for(a=a.ln;a.next();){var b=a.value;z.trace(b.toString());for(b=b.oi;b.next();)u.dumpVisualTree(b.value)}else a instanceof D&&(b=" ",a.ZD&&(b+="c"),a.cE&&(b+="d"),a.BE&&(b+="g"),a.cF&&(b+="m"),a.rF&&(b+="h"),a.sF&&(b+="z"),a.xF&&(b+="o"),a.wk&&(b+="s"),a.QF&&(b+="t"),a.FF&&(b+="A"),a.kx&&(b+="B"),a.iA&&(b+="L"),a.jb&&(b+="S"),a.tk&&(b+="H"),u.bC(a,1,b))},bC:function(a,b,c){for(var d="",e=0;e<b;e++)d+=" ";d+=a.toString();c&&(d+=c);c=" ";c=a.visible?c+"v":c+"~";a.jg&&(c+="p");a.Ff&&(c+="m");a.Mt&& +(c+="a");d+=c;if(0!==a.Vb||0!==a.column)d+=" ["+a.Vb+","+a.column+"]";d+=" "+a.W.toString();a.Aa.F()&&(d+=" d:"+a.Aa.toString());a.Ga.F()&&(d+=" n:"+a.Ga.toString());1!==a.scale&&(d+=" s:"+a.scale);0!==a.angle&&(d+=" a:"+a.angle);null!==a.background&&(d+=" b:"+a.background.toString());null!==a.wl&&(d+=" a:"+a.background.toString());a instanceof I&&(d+=" elts:"+a.va.count,0!==a.VF&&(d+=" top:"+a.VF),0!==a.WE&&(d+=" left:"+a.WE),null!==a.Tt&&(d+=" itemArray#:"+z.ab(a.Tt)),a.kI&&(d+=" cat:"+a.kI),null!== +a.data&&(d+=" data:"+a.data));null!==a.yd&&(d+=' portId: "'+a.yd+'"');z.trace(d);if(a instanceof I)for(a=a.elements;a.next();)u.bC(a.value,b+1,"")},zK:function(a){z.trace("DelayedReferences ("+a.og.count+")");for(a=a.og.i;a.next();){for(var b="",c=a.value.i;c.next();)b+=ka(c.value)+", ";z.trace(" "+a.key+": "+b)}},OD:function(a,b){if(!z.Za(b)||b instanceof Element||b instanceof CanvasRenderingContext2D||b instanceof la||b instanceof ma)return"";var c="",d;for(d in b)if("string"!==typeof d)""===c&& +(c=b+"\n"),c+=" "+d+" is not a string property\n";else if("_"!==d.charAt(0)&&!(2>=d.length)){var e=z.tb(b,d);if(null!==e&&"function"!==typeof e){if(b.hasOwnProperty(d)){var g=Object.getPrototypeOf(b);if(g&&g.Yv&&g.Yv[d])continue}else if(z.gx(b,d))continue;""===c&&(c=b+"\n");c+=' unknown property "'+d+'" has value: '+e+" at "+a+"\n"}}return c},Lw:function(a,b){if(null!==b&&void 0!==b&&"number"!==typeof b&&"string"!==typeof b&&"boolean"!==typeof b&&"function"!==typeof b)if(void 0!==z.nd(b)){if(!u.mw.contains(b))if(u.mw.add(b), +u.Mv.add(u.OD(a,b)),b instanceof J||b instanceof K||b instanceof na)for(var c=b.i;c.next();)u.Lw(a+"["+c.key+"]",c.value);else for(c in b){var d=z.tb(b,c);if(void 0!==d&&null!==d&&z.Za(d)&&d!==b.Yv){if(b instanceof qa){if(d===b.Oj)continue}else if(b instanceof I){if("data"===c||d===b.fe)continue;if("itemArray"===c||d===b.Ji)continue;if(b instanceof D&&d===b.jl)continue}else if(!(b instanceof B))if(b instanceof ra){if("archetypeGroupData"===c||d===b.jy)continue}else if(b instanceof ta){if("archetypeLinkData"=== +c||d===b.ly)continue;if("archetypeLabelNodeData"===c||d===b.ky)continue}else if(b instanceof va){if("archetypeNodeData"===c||d===b.Nk)continue}else if(b instanceof M){if("nodeDataArray"===c||d===b.wf)continue;if("linkDataArray"===c||d===b.vf||d===b.rm)continue;if(d===b.vc)continue;if(d===b.og)continue}else if(b instanceof wa||b instanceof xa||b instanceof ya)continue;u.Lw(a+"."+c,d)}}}else if(Array.isArray(b))for(c=0;c<b.length;c++)u.Lw(a+"["+c+"]",b[c]);else u.Mv.add(u.OD(a,b))},checkProperties:function(a){void 0=== +u.mw?u.mw=new K(Object):u.mw.clear();u.Mv=new za;u.Lw("",a);a=u.Mv.toString();u.Mv=null;return a}};aa.Debug=u; +var z={pd:1,Tc:2,fd:4,ed:8,hn:void 0!==window.navigator&&0<window.navigator.userAgent.indexOf("534.30")&&0<window.navigator.userAgent.indexOf("Android"),ME:void 0!==window.navigator&&0<window.navigator.userAgent.indexOf("MSIE 10.0"),NE:void 0!==window.navigator&&0<window.navigator.userAgent.indexOf("Trident/7"),GK:void 0!==window.navigator&&0<window.navigator.userAgent.indexOf("Edge/"),sk:void 0!==window.navigator&&void 0!==window.navigator.platform&&0<=window.navigator.platform.toUpperCase().indexOf("MAC"), +OE:void 0!==window.navigator&&void 0!==window.navigator.platform&&null!==window.navigator.platform.match(/(iPhone|iPod|iPad)/i),$D:function(a,b,c){var d=-1;return function(){var e=this,g=arguments;-1!==d&&z.clearTimeout(d);d=z.setTimeout(function(){d=-1;c||a.apply(e,g)},b);c&&!d&&a.apply(e,g)}},setTimeout:function(a,b){return window.setTimeout(a,b)},clearTimeout:function(a){window.clearTimeout(a)},createElement:function(a){return window.document.createElement(a)},k:function(a){throw Error(a);},oa:function(a, +b){var c="The object is frozen, so its properties cannot be set: "+a.toString();void 0!==b&&(c+=" to value: "+b);z.k(c)},l:function(a,b,c,d){a instanceof b||(c=z.getTypeName(c),void 0!==d&&(c+="."+d),z.ic(a,b,c))},g:function(a,b,c,d){typeof a!==b&&(c=z.getTypeName(c),void 0!==d&&(c+="."+d),z.ic(a,b,c))},p:function(a,b,c){"number"===typeof a&&isFinite(a)||(b=z.getTypeName(b),void 0!==c&&(b+="."+c),z.k(b+" must be a real number type, and not NaN or Infinity: "+a))},Ba:function(a,b,c,d){a instanceof +Ba&&a.Ae===b||(c=z.getTypeName(c),void 0!==d&&(c+="."+d),z.ic(a,"a constant of class "+z.kf(b),c))},ot:function(a,b){"string"===typeof a?Ca(a)||z.k('Color "'+a+'" is not a valid color string for '+b):a instanceof Da||z.k("Value for "+b+" must be a color string or a Brush, not "+a)},ic:function(a,b,c,d){b=z.getTypeName(b);c=z.getTypeName(c);void 0!==d&&(c+="."+d);"string"===typeof a?z.k(c+" value is not an instance of "+b+': "'+a+'"'):z.k(c+" value is not an instance of "+b+": "+a)},ka:function(a, +b,c,d){c=z.getTypeName(c);void 0!==d&&(c+="."+d);z.k(c+" is not in the range "+b+": "+a)},od:function(a){z.k(z.kf(a)+" constructor cannot take any arguments.")},Sa:function(a){z.k("Collection was modified during iteration: "+a.toString()+"\n Perhaps you should iterate over a copy of the collection,\n or you could collect items to be removed from the collection after the iteration.")},trace:function(a){window.console&&window.console.log(a)},Za:function(a){return"object"===typeof a&&null!==a},isArray:function(a){return Array.isArray(a)|| +a instanceof NodeList||a instanceof HTMLCollection},fI:function(a){return Array.isArray(a)},nt:function(a,b,c){z.isArray(a)||z.ic(a,"Array or NodeList or HTMLCollection",b,c)},ab:function(a){return a.length},Al:function(a){return Array.prototype.slice.call(a)},Ya:function(a,b){Array.isArray(a);return a[b]},LD:function(a,b,c){Array.isArray(a)?a[b]=c:z.k("Cannot replace an object in an HTMLCollection or NodeList at "+b)},Ez:function(a,b){if(Array.isArray(a))return a.indexOf(b);for(var c=a.length,d= +0;d<c;d++)if(a[d]===b)return d;return-1},bj:function(a,b,c){Array.isArray(a)?b>=a.length?a.push(c):a.splice(b,0,c):z.k("Cannot insert an object into an HTMLCollection or NodeList: "+c+" at "+b)},ii:function(a,b){Array.isArray(a)?b>=a.length?a.pop():a.splice(b,1):z.k("Cannot remove an object from an HTMLCollection or NodeList at "+b)},Zx:[],O:function(){var a=z.Zx.pop();return void 0===a?new N:a},Tb:function(a,b){var c=z.Zx.pop();if(void 0===c)return new N(a,b);c.x=a;c.y=b;return c},A:function(a){z.Zx.push(a)}, +mB:[],Xl:function(){var a=z.mB.pop();return void 0===a?new Ea:a},qk:function(a){z.mB.push(a)},$x:[],lg:function(){var a=z.$x.pop();return void 0===a?new w:a},zk:function(a,b,c,d){var e=z.$x.pop();if(void 0===e)return new w(a,b,c,d);e.x=a;e.y=b;e.width=c;e.height=d;return e},dc:function(a){z.$x.push(a)},nB:[],Hh:function(){var a=z.nB.pop();return void 0===a?new Fa:a},jf:function(a){z.nB.push(a)},ay:null,v:function(){var a=z.ay;return null!==a?(z.ay=null,a):new Ga},u:function(a){a.reset();z.ay=a},lB:[], +rb:function(){var a=z.lB.pop();return void 0===a?[]:a},xa:function(a){a.length=0;z.lB.push(a)},yj:Object.freeze([]),am:1,kc:function(a){a.__gohashid=z.am++},It:function(a){var b=a.__gohashid;void 0===b&&(b=z.am++,a.__gohashid=b);return b},nd:function(a){return a.__gohashid},ia:function(a,b){b.qy=a;aa[a]=b},Qa:function(a,b){function c(){}c.prototype=b.prototype;a.prototype=new c;a.prototype.constructor=a},ji:function(a){a.BG=!0},defineProperty:function(a,b,c,d,e){z.g(a,"function","Util.defineProperty:classfunc"); +z.g(b,"object","Util.defineProperty:propobj");z.g(c,"function","Util.defineProperty:getter");z.g(d,"function","Util.defineProperty:setter");for(var g in b){b=b[g];c={get:c,set:d,enumerable:!0};if(void 0!==e)for(var h in e)c[h]=e[h];Object.defineProperty(a.prototype,g,c);e=Object.getOwnPropertyDescriptor(a.prototype,g);b&&e&&Object.defineProperty(a.prototype,b,e);break}},FJ:!1,w:function(a,b,c,d){z.g(a,"function","Util.defineReadOnlyProperty:classfunc");z.g(b,"object","Util.defineReadOnlyProperty:propobj"); +z.g(c,"function","Util.defineReadOnlyProperty:getter");for(var e in b){var g=b[e];b={get:c,set:function(a){z.k('The property "'+g+'" is read-only and cannot be set to '+a)},enumerable:!0};if(void 0!==d)for(var h in d)b[h]=d[h];Object.defineProperty(a.prototype,e,b);d=Object.getOwnPropertyDescriptor(a.prototype,e);g&&d&&Object.defineProperty(a.prototype,g,d);break}},Yd:function(a,b){for(var c in b)b[c]=!0;a.prototype.Yv=b},getTypeName:function(a){return void 0===a?"":"string"===typeof a?a:"function"=== +typeof a?z.kf(a):null===a?"*":""},kf:function(a){if("function"===typeof a){if(a.qy)return a.qy;if(a.name)return a.name;var b=a.toString(),c=b.indexOf("("),b=b.substring(9,c).trim();if(""!==b)return a.qy=b}else if("object"===typeof a&&a.constructor)return z.kf(a.constructor);return typeof a},s:function(a,b,c){z.g(a,"function","Util.defineEnumValue:classfunc");z.g(b,"string","Util.defineEnumValue:name");z.g(c,"number","Util.defineEnumValue:num");c=new Ba(a,b,c);Object.freeze(c);a[b]=c;var d=a.Fu;d instanceof +na||(d=new na("string",Ba),a.Fu=d);d.add(b,c);return c},tb:function(a,b){if(!a||!b)return null;var c=void 0;try{"function"===typeof b?c=b(a):"function"===typeof a.getAttribute?(c=a.getAttribute(b),null===c&&(c=void 0)):c=a[b]}catch(d){u&&z.trace("property get error: "+d.toString())}return c},Ra:function(a,b,c){if(a&&b)try{"function"===typeof b?b(a,c):"function"===typeof a.setAttribute?a.setAttribute(b,c):a[b]=c}catch(d){u&&z.trace("property set error: "+d.toString())}},qu:function(a,b){z.g(a,"object", +"Setting properties requires Objects as arguments");z.g(b,"object","Setting properties requires Objects as arguments");var c=a instanceof I,d=a instanceof B,e;for(e in b){""===e&&z.k("Setting properties requires non-empty property names");var g=a,h=e;if(c||d){var k=e.indexOf(".");if(0<k){var l=e.substring(0,k);if(c)g=a.oe(l);else if(g=a[l],void 0===g||null===g)g=a.gb[l];z.Za(g)?h=e.substr(k+1):z.k("Unable to find object named: "+l+" in "+a.toString()+" when trying to set property: "+e)}}if("_"!== +h[0]&&!z.gx(g,h))if(d&&"ModelChanged"===h){a.PG(b[h]);continue}else if(d&&"Changed"===h){a.Qm(b[h]);continue}else if(d&&z.gx(a.gb,h))g=a.gb;else if(d&&Ia(a,h)){a.zz(h,b[h]);continue}else if(a instanceof M&&"Changed"===h){a.Qm(b[h]);continue}else z.k('Trying to set undefined property "'+h+'" on object: '+g.toString());g[h]=b[e];"_"===h[0]&&g instanceof O&&g.MG(h)}},gx:function(a,b){if(a.hasOwnProperty(b))return!0;for(var c=Object.getPrototypeOf(a);c&&c!==Function;){if(c.hasOwnProperty(b))return!0; +var d=c.Yv;if(d&&d[b])return!0;c=Object.getPrototypeOf(c)}return!1},UI:function(a){for(var b=[],c=0;256>c;c++)b[c]=c;for(var d=0,e=0,c=0;256>c;c++)d=(d+b[c]+119)%256,e=b[c],b[c]=b[d],b[d]=e;for(var d=c=0,g="",h=0;h<a.length;h++)c=(c+1)%256,d=(d+b[c])%256,e=b[c],b[c]=b[d],b[d]=e,g+=String.fromCharCode(a.charCodeAt(h)^b[(b[c]+b[d])%256]);return g},UH:function(a){for(var b=[],c=0;256>c;c++)b["0123456789abcdef".charAt(c>>4)+"0123456789abcdef".charAt(c&15)]=String.fromCharCode(c);a.length%2&&(a="0"+a); +for(var d=[],e=0,c=0;c<a.length;c+=2)d[e++]=b[a.substr(c,2)];a=d.join("");return""===a?"0":a},Gg:function(a){return z.UI(z.UH(a))},Zl:null,adym:"7da71ca0ad381e90",vfo:"2be640fdb167",aH:"@COLOR1",bH:"@COLOR2"}; +z.Zl=function(){var a=window.document.createElement("canvas"),b=a.getContext("2d");b[z.Gg("7ca11abfd022028846")]=z.Gg("398c3597c01238");for(var c=["5da73c80a3330d854f9e5e671d6633","32ab5ff3b26f42dc0ed90f22422913b54ae6247590da4bb21c324ba3a84e385776","54a702f3e53909c447824c6706603faf4cfb236cdfda5de14c134ba1a95a2d4c7cc6f93c1387","74bf19bce72555874c86"],d=1;5>d;d++)b[z.Gg("7ca11abfd7330390")](z.Gg(c[d-1]),10,15*d+0);b[z.Gg("7ca11abfd022028846")]=z.Gg("39f046ebb36e4b");for(d=1;5>d;d++)b[z.Gg("7ca11abfd7330390")](z.Gg(c[d- +1]),10,15*d+0);if(4!==c.length||"5"!==c[0][0]||"7"!==c[3][0])z.s=function(a,b){var c=new Ba(a,b,2);Object.freeze(c);a[b]=c;var d=a.Fu;d instanceof na||(d=new na("string",Ba),a.Fu=d);d.add(b,c);return c};return a}();function Ba(a,b,c){z.kc(this);this.xB=a;this.Ub=b;this.GG=c}z.ia("EnumValue",Ba);Ba.prototype.toString=function(){return z.kf(this.xB)+"."+this.Ub};z.w(Ba,{Ae:"classType"},function(){return this.xB});z.w(Ba,{name:"name"},function(){return this.Ub});z.w(Ba,{value:"value"},function(){return this.GG}); +var Ja;Ba.findName=Ja=function(a,b){if(void 0===b||null===b||""===b)return null;z.g(a,"function","findName:classfunc");z.g(b,"string","EnumValue.findName:name");var c=a.Fu;return c instanceof na?c.na(b):null};function za(){this.wB=[]}za.prototype.toString=function(){return this.wB.join("")};za.prototype.add=function(a){""!==a&&this.wB.push(a)};function ma(){} +function Ka(a){void 0===a&&(a=42);this.seed=a;this.Vx=48271;this.Eu=2147483647;this.kB=this.Eu/this.Vx;this.kG=this.Eu%this.Vx;this.jG=1/this.Eu;this.random()}Ka.prototype.random=function(){var a=this.seed%this.kB*this.Vx-this.seed/this.kB*this.kG;this.seed=0<a?a:a+this.Eu;return this.seed*this.jG};function Ma(){}z.w(Ma,{i:"iterator"},function(){return this});Ma.prototype.reset=Ma.prototype.reset=function(){};Ma.prototype.next=Ma.prototype.hasNext=Ma.prototype.next=function(){return!1}; +Ma.prototype.first=Ma.prototype.first=function(){return null};Ma.prototype.any=function(){return!1};Ma.prototype.all=function(){return!0};Ma.prototype.each=function(){return this};Ma.prototype.map=function(){return this};Ma.prototype.filter=function(){return this};Ma.prototype.concat=function(a){return a.i};z.w(Ma,{count:"count"},function(){return 0});Ma.prototype.Nf=function(){};Ma.prototype.toString=function(){return"EmptyIterator"};var Pa=new Ma;function Ra(a){this.key=-1;this.value=a} +z.Yd(Ra,{key:!0,value:!0});z.w(Ra,{i:"iterator"},function(){return this});Ra.prototype.reset=Ra.prototype.reset=function(){this.key=-1};Ra.prototype.next=Ra.prototype.hasNext=Ra.prototype.next=function(){return-1===this.key?(this.key=0,!0):!1};Ra.prototype.first=Ra.prototype.first=function(){this.key=0;return this.value};Ra.prototype.any=function(a){this.key=-1;return a(this.value)};Ra.prototype.all=function(a){this.key=-1;return a(this.value)}; +Ra.prototype.each=function(a){this.key=-1;a(this.value);return this};Ra.prototype.map=function(a){return new Ra(a(this.value))};Ra.prototype.filter=function(a){return a(this.value)?new Ra(this.value):Pa};Ra.prototype.concat=function(a){return new Sa(this,a.i)};z.w(Ra,{count:"count"},function(){return 1});Ra.prototype.Nf=function(){this.value=null};Ra.prototype.toString=function(){return"SingletonIterator("+this.value+")"};function Sa(a,b){this.al=a;this.bl=b;this.Gu=!1}z.Yd(Sa,{key:!0,value:!0}); +z.w(Sa,{i:"iterator"},function(){return this});Sa.prototype.reset=Sa.prototype.reset=function(){this.al.reset();this.bl.reset();this.Gu=!1};Sa.prototype.next=Sa.prototype.hasNext=Sa.prototype.next=function(){if(!this.Gu){var a=this.al;if(a.next())return this.key=a.key,this.value=a.value,!0;this.Gu=!0}return this.Gu&&(a=this.bl,a.next())?(this.key=a.key,this.value=a.value,!0):!1};Sa.prototype.first=Sa.prototype.first=function(){this.reset();return this.next()?this.value:null}; +Sa.prototype.any=function(a){return this.al.any(a)||this.bl.any(a)?!0:!1};Sa.prototype.all=function(a){return this.al.all(a)&&this.bl.all(a)?!0:!1};Sa.prototype.each=function(a){this.al.each(a);this.bl.each(a);return this};Sa.prototype.map=function(a){return new Sa(this.al.map(a),this.bl.map(a))};Sa.prototype.filter=function(a){return new Sa(this.al.filter(a),this.bl.filter(a))};Sa.prototype.concat=function(a){return new Sa(this,a.i)};z.w(Sa,{count:"count"},function(){return this.al.count+this.bl.count}); +Sa.prototype.Nf=function(){this.value=this.key=null};Sa.prototype.toString=function(){return"ConcatIterator()"};function Ta(a){this.Bc=a;this.Xh=null;this.reset()}z.Yd(Ta,{key:!0,value:!0});z.w(Ta,{i:"iterator"},function(){return this});z.defineProperty(Ta,{qn:"predicate"},function(){return this.Xh},function(a){this.Xh=a});Ta.prototype.reset=Ta.prototype.reset=function(){var a=this.Bc;a.ec=null;this.nb=a.H;this.Uc=-1}; +Ta.prototype.next=Ta.prototype.hasNext=Ta.prototype.next=function(){var a=this.Bc;if(a.H!==this.nb){if(0>this.key)return!1;z.Sa(a)}var a=a.o,b=a.length,c=++this.Uc,d=this.Xh;if(null!==d)for(;c<b;){var e=a[c];if(d(e))return this.key=this.Uc=c,this.value=e,!0;c++}else{if(c<b)return this.key=c,this.value=a[c],!0;this.Nf()}return!1}; +Ta.prototype.first=Ta.prototype.first=function(){var a=this.Bc;this.nb=a.H;this.Uc=0;var a=a.o,b=a.length,c=this.Xh;if(null!==c){for(var d=0;d<b;){var e=a[d];if(c(e))return this.key=this.Uc=d,this.value=e;d++}return null}return 0<b?(e=a[0],this.key=0,this.value=e):null};Ta.prototype.any=function(a){var b=this.Bc;b.ec=null;var c=b.H;this.Uc=-1;for(var d=b.o,e=d.length,g=this.Xh,h=0;h<e;h++){var k=d[h];if(null===g||g(k)){if(a(k))return!0;b.H!==c&&z.Sa(b)}}return!1}; +Ta.prototype.all=function(a){var b=this.Bc;b.ec=null;var c=b.H;this.Uc=-1;for(var d=b.o,e=d.length,g=this.Xh,h=0;h<e;h++){var k=d[h];if(null===g||g(k)){if(!a(k))return!1;b.H!==c&&z.Sa(b)}}return!0};Ta.prototype.each=function(a){var b=this.Bc;b.ec=null;var c=b.H;this.Uc=-1;for(var d=b.o,e=d.length,g=this.Xh,h=0;h<e;h++){var k=d[h];if(null===g||g(k))a(k),b.H!==c&&z.Sa(b)}return this}; +Ta.prototype.map=function(a){var b=this.Bc;b.ec=null;var c=b.H;this.Uc=-1;for(var d=[],e=b.o,g=e.length,h=this.Xh,k=0;k<g;k++){var l=e[k];if(null===h||h(l))d.push(a(l)),b.H!==c&&z.Sa(b)}a=new J;a.o=d;a.Jc();return a.i};Ta.prototype.filter=function(a){var b=this.Bc;b.ec=null;var c=b.H;this.Uc=-1;for(var d=[],e=b.o,g=e.length,h=this.Xh,k=0;k<g;k++){var l=e[k];if(null===h||h(l))a(l)&&d.push(l),b.H!==c&&z.Sa(b)}a=new J(b.ba);a.o=d;a.Jc();return a.i}; +Ta.prototype.concat=function(a){this.Bc.ec=null;return new Sa(this,a.i)};z.w(Ta,{count:"count"},function(){var a=this.Xh;if(null!==a){for(var b=0,c=this.Bc.o,d=c.length,e=0;e<d;e++)a(c[e])&&b++;return b}return this.Bc.o.length});Ta.prototype.Nf=function(){this.key=-1;this.value=null;this.nb=-1;this.Xh=null;this.Bc.ec=this};Ta.prototype.toString=function(){return"ListIterator@"+this.Uc+"/"+this.Bc.count};function Ua(a){this.Bc=a;this.reset()}z.Yd(Ua,{key:!0,value:!0});z.w(Ua,{i:"iterator"},function(){return this}); +Ua.prototype.reset=Ua.prototype.reset=function(){var a=this.Bc;a.Mj=null;this.nb=a.H;this.Uc=a.o.length};Ua.prototype.next=Ua.prototype.hasNext=Ua.prototype.next=function(){var a=this.Bc;if(a.H!==this.nb){if(0>this.key)return!1;z.Sa(a)}var b=--this.Uc;if(0<=b)return this.key=b,this.value=a.o[b],!0;this.Nf();return!1};Ua.prototype.first=Ua.prototype.first=function(){var a=this.Bc;this.nb=a.H;var b=a.o;this.Uc=a=b.length-1;return 0<=a?(b=b[a],this.key=a,this.value=b):null}; +Ua.prototype.any=function(a){var b=this.Bc;b.Mj=null;var c=b.H,d=b.o,e=d.length;this.Uc=e;for(e-=1;0<=e;e--){if(a(d[e]))return!0;b.H!==c&&z.Sa(b)}return!1};Ua.prototype.all=function(a){var b=this.Bc;b.Mj=null;var c=b.H,d=b.o,e=d.length;this.Uc=e;for(e-=1;0<=e;e--){if(!a(d[e]))return!1;b.H!==c&&z.Sa(b)}return!0};Ua.prototype.each=function(a){var b=this.Bc;b.Mj=null;var c=b.H,d=b.o,e=d.length;this.Uc=e;for(e-=1;0<=e;e--)a(d[e]),b.H!==c&&z.Sa(b);return this}; +Ua.prototype.map=function(a){var b=this.Bc;b.Mj=null;var c=b.H,d=[],e=b.o,g=e.length;this.Uc=g;for(g-=1;0<=g;g--)d.push(a(e[g])),b.H!==c&&z.Sa(b);a=new J;a.o=d;a.Jc();return a.i};Ua.prototype.filter=function(a){var b=this.Bc;b.Mj=null;var c=b.H,d=[],e=b.o,g=e.length;this.Uc=g;for(g-=1;0<=g;g--){var h=e[g];a(h)&&d.push(h);b.H!==c&&z.Sa(b)}a=new J(b.ba);a.o=d;a.Jc();return a.i};Ua.prototype.concat=function(a){this.Bc.Mj=null;return new Sa(this,a.i)};z.w(Ua,{count:"count"},function(){return this.Bc.o.length}); +Ua.prototype.Nf=function(){this.key=-1;this.value=null;this.nb=-1;this.Bc.Mj=this};Ua.prototype.toString=function(){return"ListIteratorBackwards("+this.Uc+"/"+this.Bc.count+")"}; +function J(a){z.kc(this);this.G=!1;this.o=[];this.H=0;this.Mj=this.ec=null;void 0===a||null===a?this.ba=null:"string"===typeof a?"object"===a||"string"===a||"number"===a||"boolean"===a||"function"===a?this.ba=a:z.ka(a,"the string 'object', 'number', 'string', 'boolean', or 'function'","List constructor: type"):"function"===typeof a?this.ba=a===Object?"object":a===String?"string":a===Number?"number":a===Boolean?"boolean":a===Function?"function":a:z.ka(a,"null, a primitive type name, or a class type", +"List constructor: type")}z.ia("List",J);J.prototype.Zg=function(a){null!==this.ba&&("string"===typeof this.ba?typeof a===this.ba&&null!==a||z.ic(a,this.ba):a instanceof this.ba||z.ic(a,this.ba))};J.prototype.Jc=function(){var a=this.H;a++;999999999<a&&(a=0);this.H=a};J.prototype.freeze=J.prototype.freeze=function(){this.G=!0;return this};J.prototype.thaw=J.prototype.Wa=function(){this.G=!1;return this};J.prototype.toString=function(){return"List("+z.getTypeName(this.ba)+")#"+z.nd(this)}; +J.prototype.add=J.prototype.push=J.prototype.add=function(a){null!==a&&(u&&this.Zg(a),this.G&&z.oa(this,a),this.o.push(a),this.Jc())};J.prototype.addAll=J.prototype.$c=function(a){if(null===a)return this;this.G&&z.oa(this);var b=this.o;if(z.isArray(a))for(var c=z.ab(a),d=0;d<c;d++){var e=z.Ya(a,d);u&&this.Zg(e);b.push(e)}else for(a=a.i;a.next();)e=a.value,u&&this.Zg(e),b.push(e);this.Jc();return this};J.prototype.clear=J.prototype.clear=function(){this.G&&z.oa(this);this.o.length=0;this.Jc()}; +J.prototype.contains=J.prototype.has=J.prototype.contains=function(a){if(null===a)return!1;u&&this.Zg(a);return-1!==this.o.indexOf(a)};J.prototype.indexOf=J.prototype.indexOf=function(a){if(null===a)return-1;u&&this.Zg(a);return this.o.indexOf(a)};J.prototype.elt=J.prototype.get=J.prototype.ea=function(a){u&&z.p(a,J,"elt:i");var b=this.o;(0>a||a>=b.length)&&z.ka(a,"0 <= i < length",J,"elt:i");return b[a]}; +J.prototype.setElt=J.prototype.set=J.prototype.Sg=function(a,b){u&&(this.Zg(b),z.p(a,J,"setElt:i"));var c=this.o;(0>a||a>=c.length)&&z.ka(a,"0 <= i < length",J,"setElt:i");this.G&&z.oa(this,a);c[a]=b};J.prototype.first=J.prototype.first=function(){var a=this.o;return 0===a.length?null:a[0]};J.prototype.last=J.prototype.de=function(){var a=this.o,b=a.length;return 0<b?a[b-1]:null};J.prototype.pop=J.prototype.pop=function(){this.G&&z.oa(this);var a=this.o;return 0<a.length?a.pop():null}; +J.prototype.any=function(a){for(var b=this.o,c=this.H,d=b.length,e=0;e<d;e++){if(a(b[e]))return!0;this.H!==c&&z.Sa(this)}return!1};J.prototype.all=function(a){for(var b=this.o,c=this.H,d=b.length,e=0;e<d;e++){if(!a(b[e]))return!1;this.H!==c&&z.Sa(this)}return!0};J.prototype.each=function(a){for(var b=this.o,c=this.H,d=b.length,e=0;e<d;e++)a(b[e]),this.H!==c&&z.Sa(this);return this}; +J.prototype.map=function(a){for(var b=new J,c=[],d=this.o,e=this.H,g=d.length,h=0;h<g;h++)c.push(a(d[h])),this.H!==e&&z.Sa(this);b.o=c;b.Jc();return b};J.prototype.filter=function(a){for(var b=new J(this.ba),c=[],d=this.o,e=this.H,g=d.length,h=0;h<g;h++){var k=d[h];a(k)&&c.push(k);this.H!==e&&z.Sa(this)}b.o=c;b.Jc();return b};J.prototype.concat=function(a){return this.copy().$c(a)}; +J.prototype.insertAt=J.prototype.Ld=function(a,b){u&&(this.Zg(b),z.p(a,J,"insertAt:i"));0>a&&z.ka(a,">= 0",J,"insertAt:i");this.G&&z.oa(this,a);var c=this.o;a>=c.length?c.push(b):c.splice(a,0,b);this.Jc();return!0};J.prototype.remove=J.prototype["delete"]=J.prototype.remove=function(a){if(null===a)return!1;u&&this.Zg(a);this.G&&z.oa(this,a);var b=this.o;a=b.indexOf(a);if(-1===a)return!1;a===b.length-1?b.pop():b.splice(a,1);this.Jc();return!0}; +J.prototype.removeAt=J.prototype.dd=function(a){u&&z.p(a,J,"removeAt:i");var b=this.o;(0>a||a>=b.length)&&z.ka(a,"0 <= i < length",J,"removeAt:i");this.G&&z.oa(this,a);a===b.length-1?b.pop():b.splice(a,1);this.Jc()}; +J.prototype.removeRange=J.prototype.removeRange=function(a,b){u&&(z.p(a,J,"removeRange:from"),z.p(b,J,"removeRange:to"));var c=this.o;(0>a||a>=c.length)&&z.ka(a,"0 <= from < length",J,"elt:from");(0>b||b>=c.length)&&z.ka(b,"0 <= to < length",J,"elt:to");this.G&&z.oa(this,a);var d=c.slice((b||a)+1||c.length);c.length=0>a?c.length+a:a;c.push.apply(c,d);this.Jc()};J.prototype.copy=function(){var a=new J(this.ba),b=this.o;0<b.length&&(a.o=Array.prototype.slice.call(b));return a}; +J.prototype.toArray=J.prototype.jc=function(){for(var a=this.o,b=this.count,c=Array(b),d=0;d<b;d++)c[d]=a[d];return c};J.prototype.toSet=J.prototype.UF=function(){for(var a=new K(this.ba),b=this.o,c=this.count,d=0;d<c;d++)a.add(b[d]);return a};J.prototype.sort=J.prototype.sort=function(a){u&&z.g(a,"function",J,"sort:sortfunc");this.G&&z.oa(this);this.o.sort(a);this.Jc();return this}; +J.prototype.sortRange=J.prototype.dq=function(a,b,c){var d=this.o,e=d.length;void 0===b&&(b=0);void 0===c&&(c=e);u&&(z.g(a,"function",J,"sortRange:sortfunc"),z.p(b,J,"sortRange:from"),z.p(c,J,"sortRange:to"));this.G&&z.oa(this);var g=c-b;if(1>=g)return this;(0>b||b>=e-1)&&z.ka(b,"0 <= from < length",J,"sortRange:from");if(2===g)return c=d[b],e=d[b+1],0<a(c,e)&&(d[b]=e,d[b+1]=c,this.Jc()),this;if(0===b)if(c>=e)d.sort(a);else for(g=d.slice(0,c),g.sort(a),a=0;a<c;a++)d[a]=g[a];else if(c>=e)for(g=d.slice(b), +g.sort(a),a=b;a<e;a++)d[a]=g[a-b];else for(g=d.slice(b,c),g.sort(a),a=b;a<c;a++)d[a]=g[a-b];this.Jc();return this};J.prototype.reverse=J.prototype.reverse=function(){this.G&&z.oa(this);this.o.reverse();this.Jc();return this};z.w(J,{count:"count"},function(){return this.o.length});z.w(J,{size:"size"},function(){return this.o.length});z.w(J,{length:"length"},function(){return this.o.length});z.w(J,{i:"iterator"},function(){if(0>=this.o.length)return Pa;var a=this.ec;return null!==a?(a.reset(),a):new Ta(this)}); +z.w(J,{kn:"iteratorBackwards"},function(){if(0>=this.o.length)return Pa;var a=this.Mj;return null!==a?(a.reset(),a):new Ua(this)});function Wa(a){this.Zh=a;this.reset()}z.Yd(Wa,{key:!0,value:!0});z.w(Wa,{i:"iterator"},function(){return this});Wa.prototype.reset=Wa.prototype.reset=function(){var a=this.Zh;a.ec=null;this.nb=a.H;this.lb=null}; +Wa.prototype.next=Wa.prototype.hasNext=Wa.prototype.next=function(){var a=this.Zh;if(a.H!==this.nb){if(null===this.key)return!1;z.Sa(a)}var b=this.lb,b=null===b?a.Ka:b.bb;if(null!==b)return this.lb=b,this.value=b.value,this.key=b.key,!0;this.Nf();return!1};Wa.prototype.first=Wa.prototype.first=function(){var a=this.Zh;this.nb=a.H;a=a.Ka;if(null!==a){this.lb=a;var b=a.value;this.key=a.key;return this.value=b}return null}; +Wa.prototype.any=function(a){var b=this.Zh;b.ec=null;var c=b.H;this.lb=null;for(var d=b.Ka;null!==d;){if(a(d.value))return!0;b.H!==c&&z.Sa(b);d=d.bb}return!1};Wa.prototype.all=function(a){var b=this.Zh;b.ec=null;var c=b.H;this.lb=null;for(var d=b.Ka;null!==d;){if(!a(d.value))return!1;b.H!==c&&z.Sa(b);d=d.bb}return!0};Wa.prototype.each=function(a){var b=this.Zh;b.ec=null;var c=b.H;this.lb=null;for(var d=b.Ka;null!==d;)a(d.value),b.H!==c&&z.Sa(b),d=d.bb;return this}; +Wa.prototype.map=function(a){var b=this.Zh;b.ec=null;for(var c=new J,d=b.H,e=b.Ka;null!==e;)c.add(a(e.value)),b.H!==d&&z.Sa(b),e=e.bb;return c.i};Wa.prototype.filter=function(a){var b=this.Zh;b.ec=null;for(var c=new J(b.ba),d=b.H,e=b.Ka;null!==e;){var g=e.value;a(g)&&c.add(g);b.H!==d&&z.Sa(b);e=e.bb}return c.i};Wa.prototype.concat=function(a){this.Zh.ec=null;return new Sa(this,a.i)};z.w(Wa,{count:"count"},function(){return this.Zh.rd}); +Wa.prototype.Nf=function(){this.value=this.key=null;this.nb=-1;this.Zh.ec=this};Wa.prototype.toString=function(){return null!==this.lb?"SetIterator@"+this.lb.value:"SetIterator"}; +function K(a){z.kc(this);this.G=!1;void 0===a||null===a?this.ba=null:"string"===typeof a?"object"===a||"string"===a||"number"===a?this.ba=a:z.ka(a,"the string 'object', 'number' or 'string'","Set constructor: type"):"function"===typeof a?this.ba=a===Object?"object":a===String?"string":a===Number?"number":a:z.ka(a,"null, a primitive type name, or a class type","Set constructor: type");this.sd={};this.rd=0;this.ec=null;this.H=0;this.Uh=this.Ka=null}z.ia("Set",K); +K.prototype.Zg=function(a){null!==this.ba&&("string"===typeof this.ba?typeof a===this.ba&&null!==a||z.ic(a,this.ba):a instanceof this.ba||z.ic(a,this.ba))};K.prototype.Jc=function(){var a=this.H;a++;999999999<a&&(a=0);this.H=a};K.prototype.freeze=K.prototype.freeze=function(){this.G=!0;return this};K.prototype.thaw=K.prototype.Wa=function(){this.G=!1;return this};K.prototype.toString=function(){return"Set("+z.getTypeName(this.ba)+")#"+z.nd(this)}; +K.prototype.add=K.prototype.add=function(a){if(null===a)return!1;u&&this.Zg(a);this.G&&z.oa(this,a);var b=a;z.Za(a)&&(b=z.It(a));return void 0===this.sd[b]?(this.rd++,a=new Ya(a,a),this.sd[b]=a,b=this.Uh,null===b?this.Ka=a:(a.Go=b,b.bb=a),this.Uh=a,this.Jc(),!0):!1};K.prototype.addAll=K.prototype.$c=function(a){if(null===a)return this;this.G&&z.oa(this);if(z.isArray(a))for(var b=z.ab(a),c=0;c<b;c++)this.add(z.Ya(a,c));else for(a=a.i;a.next();)this.add(a.value);return this}; +K.prototype.contains=K.prototype.has=K.prototype.contains=function(a){if(null===a)return!1;u&&this.Zg(a);var b=a;return z.Za(a)&&(b=z.nd(a),void 0===b)?!1:void 0!==this.sd[b]};K.prototype.containsAll=function(a){if(null===a)return!0;for(a=a.i;a.next();)if(!this.contains(a.value))return!1;return!0};K.prototype.containsAny=function(a){if(null===a)return!0;for(a=a.i;a.next();)if(this.contains(a.value))return!0;return!1}; +K.prototype.first=K.prototype.first=function(){var a=this.Ka;return null===a?null:a.value};K.prototype.any=function(a){for(var b=this.H,c=this.Ka;null!==c;){if(a(c.value))return!0;this.H!==b&&z.Sa(this);c=c.bb}return!1};K.prototype.all=function(a){for(var b=this.H,c=this.Ka;null!==c;){if(!a(c.value))return!1;this.H!==b&&z.Sa(this);c=c.bb}return!0};K.prototype.each=function(a){for(var b=this.H,c=this.Ka;null!==c;)a(c.value),this.H!==b&&z.Sa(this),c=c.bb;return this}; +K.prototype.map=function(a){for(var b=new K,c=this.H,d=this.Ka;null!==d;)b.add(a(d.value)),this.H!==c&&z.Sa(this),d=d.bb;return b};K.prototype.filter=function(a){for(var b=new K(this.ba),c=this.H,d=this.Ka;null!==d;){var e=d.value;a(e)&&b.add(e);this.H!==c&&z.Sa(this);d=d.bb}return b};K.prototype.concat=function(a){return this.copy().$c(a)}; +K.prototype.remove=K.prototype["delete"]=K.prototype.remove=function(a){if(null===a)return!1;u&&this.Zg(a);this.G&&z.oa(this,a);var b=a;if(z.Za(a)&&(b=z.nd(a),void 0===b))return!1;a=this.sd[b];if(void 0===a)return!1;var c=a.bb,d=a.Go;null!==c&&(c.Go=d);null!==d&&(d.bb=c);this.Ka===a&&(this.Ka=c);this.Uh===a&&(this.Uh=d);delete this.sd[b];this.rd--;this.Jc();return!0}; +K.prototype.removeAll=K.prototype.HA=function(a){if(null===a)return this;this.G&&z.oa(this);if(z.isArray(a))for(var b=z.ab(a),c=0;c<b;c++)this.remove(z.Ya(a,c));else for(a=a.i;a.next();)this.remove(a.value);return this};K.prototype.retainAll=function(a){if(null===a||0===this.count)return this;this.G&&z.oa(this);var b=new K(this.ba);b.$c(a);a=[];for(var c=this.i;c.next();){var d=c.value;b.contains(d)||a.push(d)}this.HA(a);return this}; +K.prototype.clear=K.prototype.clear=function(){this.G&&z.oa(this);this.sd={};this.rd=0;this.Uh=this.Ka=null;this.Jc()};K.prototype.copy=function(){var a=new K(this.ba),b=this.sd,c;for(c in b)a.add(b[c].value);return a};K.prototype.toArray=K.prototype.jc=function(){var a=Array(this.rd),b=this.sd,c=0,d;for(d in b)a[c]=b[d].value,c++;return a};K.prototype.toList=function(){var a=new J(this.ba),b=this.sd,c;for(c in b)a.add(b[c].value);return a};z.w(K,{count:"count"},function(){return this.rd}); +z.w(K,{size:"size"},function(){return this.rd});z.w(K,{i:"iterator"},function(){if(0>=this.rd)return Pa;var a=this.ec;return null!==a?(a.reset(),a):new Wa(this)});function Za(a){this.Na=a;this.reset()}z.Yd(Za,{key:!0,value:!0});z.w(Za,{i:"iterator"},function(){return this});Za.prototype.reset=Za.prototype.reset=function(){this.nb=this.Na.H;this.lb=null}; +Za.prototype.next=Za.prototype.hasNext=Za.prototype.next=function(){var a=this.Na;if(a.H!==this.nb){if(null===this.key)return!1;z.Sa(a)}var b=this.lb,b=null===b?a.Ka:b.bb;if(null!==b)return this.lb=b,this.value=this.key=a=b.key,!0;this.Nf();return!1};Za.prototype.first=Za.prototype.first=function(){var a=this.Na;this.nb=a.H;a=a.Ka;return null!==a?(this.lb=a,this.value=this.key=a=a.key):null}; +Za.prototype.any=function(a){var b=this.Na,c=b.H;this.lb=null;for(var d=b.Ka;null!==d;){if(a(d.key))return!0;b.H!==c&&z.Sa(b);d=d.bb}return!1};Za.prototype.all=function(a){var b=this.Na,c=b.H;this.lb=null;for(var d=b.Ka;null!==d;){if(!a(d.key))return!1;b.H!==c&&z.Sa(b);d=d.bb}return!0};Za.prototype.each=function(a){var b=this.Na,c=b.H;this.lb=null;for(var d=b.Ka;null!==d;)a(d.key),b.H!==c&&z.Sa(b),d=d.bb;return this}; +Za.prototype.map=function(a){var b=this.Na,c=b.H;this.lb=null;for(var d=new J,e=b.Ka;null!==e;)d.add(a(e.key)),b.H!==c&&z.Sa(b),e=e.bb;return d.i};Za.prototype.filter=function(a){var b=this.Na,c=b.H;this.lb=null;for(var d=new J(b.bf),e=b.Ka;null!==e;){var g=e.key;a(g)&&d.add(g);b.H!==c&&z.Sa(b);e=e.bb}return d.i};Za.prototype.concat=function(a){return new Sa(this,a.i)};z.w(Za,{count:"count"},function(){return this.Na.rd});Za.prototype.Nf=function(){this.value=this.key=null;this.nb=-1}; +Za.prototype.toString=function(){return null!==this.lb?"MapKeySetIterator@"+this.lb.value:"MapKeySetIterator"};function $a(a){z.kc(this);this.G=!0;this.Na=a}z.Qa($a,K);$a.prototype.freeze=function(){return this};$a.prototype.Wa=function(){return this};$a.prototype.toString=function(){return"MapKeySet("+this.Na.toString()+")"};$a.prototype.add=$a.prototype.set=$a.prototype.add=function(){z.k("This Set is read-only: "+this.toString());return!1}; +$a.prototype.contains=$a.prototype.has=$a.prototype.contains=function(a){return this.Na.contains(a)};$a.prototype.remove=$a.prototype["delete"]=$a.prototype.remove=function(){z.k("This Set is read-only: "+this.toString());return!1};$a.prototype.clear=$a.prototype.clear=function(){z.k("This Set is read-only: "+this.toString())};$a.prototype.first=$a.prototype.first=function(){var a=this.Na.Ka;return null!==a?a.key:null}; +$a.prototype.any=function(a){for(var b=this.Na.Ka;null!==b;){if(a(b.key))return!0;b=b.bb}return!1};$a.prototype.all=function(a){for(var b=this.Na.Ka;null!==b;){if(!a(b.key))return!1;b=b.bb}return!0};$a.prototype.each=function(a){for(var b=this.Na.Ka;null!==b;)a(b.key),b=b.bb;return this};$a.prototype.map=function(a){for(var b=new K,c=this.Na.Ka;null!==c;)b.add(a(c.key)),c=c.bb;return b}; +$a.prototype.filter=function(a){for(var b=new K(this.Na.bf),c=this.Na.Ka;null!==c;){var d=c.key;a(d)&&b.add(d);c=c.bb}return b};$a.prototype.concat=function(a){return this.UF().$c(a)};$a.prototype.copy=function(){return new $a(this.Na)};$a.prototype.toSet=$a.prototype.UF=function(){var a=new K(this.Na.bf),b=this.Na.sd,c;for(c in b)a.add(b[c].key);return a};$a.prototype.toArray=$a.prototype.jc=function(){var a=this.Na.sd,b=Array(this.Na.rd),c=0,d;for(d in a)b[c]=a[d].key,c++;return b}; +$a.prototype.toList=function(){var a=new J(this.ba),b=this.Na.sd,c;for(c in b)a.add(b[c].key);return a};z.w($a,{count:"count"},function(){return this.Na.rd});z.w($a,{size:"size"},function(){return this.Na.rd});z.w($a,{i:"iterator"},function(){return 0>=this.Na.rd?Pa:new Za(this.Na)});function ab(a){this.Na=a;this.reset()}z.Yd(ab,{key:!0,value:!0});z.w(ab,{i:"iterator"},function(){return this});ab.prototype.reset=ab.prototype.reset=function(){var a=this.Na;a.Nj=null;this.nb=a.H;this.lb=null}; +ab.prototype.next=ab.prototype.hasNext=ab.prototype.next=function(){var a=this.Na;if(a.H!==this.nb){if(null===this.key)return!1;z.Sa(a)}var b=this.lb,b=null===b?a.Ka:b.bb;if(null!==b)return this.lb=b,this.value=b.value,this.key=b.key,!0;this.Nf();return!1};ab.prototype.first=ab.prototype.first=function(){var a=this.Na;this.nb=a.H;a=a.Ka;if(null!==a){this.lb=a;var b=a.value;this.key=a.key;return this.value=b}return null}; +ab.prototype.any=function(a){var b=this.Na;b.Nj=null;var c=b.H;this.lb=null;for(var d=b.Ka;null!==d;){if(a(d.value))return!0;b.H!==c&&z.Sa(b);d=d.bb}return!1};ab.prototype.all=function(a){var b=this.Na;b.Nj=null;var c=b.H;this.lb=null;for(var d=b.Ka;null!==d;){if(!a(d.value))return!1;b.H!==c&&z.Sa(b);d=d.bb}return!0};ab.prototype.each=function(a){var b=this.Na;b.Nj=null;var c=b.H;this.lb=null;for(var d=b.Ka;null!==d;)a(d.value),b.H!==c&&z.Sa(b),d=d.bb;return this}; +ab.prototype.map=function(a){var b=this.Na;b.Nj=null;var c=b.H;this.lb=null;for(var d=new J,e=b.Ka;null!==e;)d.add(a(e.value)),b.H!==c&&z.Sa(b),e=e.bb;return d.i};ab.prototype.filter=function(a){var b=this.Na;b.Nj=null;var c=b.H;this.lb=null;for(var d=new J(b.bf),e=b.Ka;null!==e;){var g=e.value;a(g)&&d.add(g);b.H!==c&&z.Sa(b);e=e.bb}return d.i};ab.prototype.concat=function(a){this.Na.Nj=null;return new Sa(this,a.i)};z.w(ab,{count:"count"},function(){return this.Na.rd}); +ab.prototype.Nf=function(){this.value=this.key=null;this.nb=-1;this.Na.Nj=this};ab.prototype.toString=function(){return null!==this.lb?"MapValueSetIterator@"+this.lb.value:"MapValueSetIterator"};function Ya(a,b){this.key=a;this.value=b;this.Go=this.bb=null}z.Yd(Ya,{key:!0,value:!0});Ya.prototype.toString=function(){return"{"+this.key+":"+this.value+"}"};function bb(a){this.Na=a;this.reset()}z.Yd(bb,{key:!0,value:!0});z.w(bb,{i:"iterator"},function(){return this}); +bb.prototype.reset=bb.prototype.reset=function(){var a=this.Na;a.ec=null;this.nb=a.H;this.lb=null};bb.prototype.next=bb.prototype.hasNext=bb.prototype.next=function(){var a=this.Na;if(a.H!==this.nb){if(null===this.key)return!1;z.Sa(a)}var b=this.lb,b=null===b?a.Ka:b.bb;if(null!==b)return this.lb=b,this.key=b.key,this.value=b.value,!0;this.Nf();return!1}; +bb.prototype.first=bb.prototype.first=function(){var a=this.Na;this.nb=a.H;a=a.Ka;return null!==a?(this.lb=a,this.key=a.key,this.value=a.value,a):null};bb.prototype.any=function(a){var b=this.Na;b.ec=null;var c=b.H;this.lb=null;for(var d=b.Ka;null!==d;){if(a(d))return!0;b.H!==c&&z.Sa(b);d=d.bb}return!1};bb.prototype.all=function(a){var b=this.Na;b.ec=null;var c=b.H;this.lb=null;for(var d=b.Ka;null!==d;){if(!a(d))return!1;b.H!==c&&z.Sa(b);d=d.bb}return!0}; +bb.prototype.each=function(a){var b=this.Na;b.ec=null;var c=b.H;this.lb=null;for(var d=b.Ka;null!==d;)a(d),b.H!==c&&z.Sa(b),d=d.bb;return this};bb.prototype.map=function(a){var b=this.Na;b.ec=null;var c=b.H;this.lb=null;for(var d=new J,e=b.Ka;null!==e;)d.add(a(e)),b.H!==c&&z.Sa(b),e=e.bb;return d.i};bb.prototype.filter=function(a){var b=this.Na;b.ec=null;var c=b.H;this.lb=null;for(var d=new J,e=b.Ka;null!==e;)a(e)&&d.add(e),b.H!==c&&z.Sa(b),e=e.bb;return d.i}; +bb.prototype.concat=function(a){this.Na.ec=null;return new Sa(this,a.i)};z.w(bb,{count:"count"},function(){return this.Na.rd});bb.prototype.Nf=function(){this.value=this.key=null;this.nb=-1;this.Na.ec=this};bb.prototype.toString=function(){return null!==this.lb?"MapIterator@"+this.lb:"MapIterator"}; +function na(a,b){z.kc(this);this.G=!1;void 0===a||null===a?this.bf=null:"string"===typeof a?"object"===a||"string"===a||"number"===a?this.bf=a:z.ka(a,"the string 'object', 'number' or 'string'","Map constructor: keytype"):"function"===typeof a?this.bf=a===Object?"object":a===String?"string":a===Number?"number":a:z.ka(a,"null, a primitive type name, or a class type","Map constructor: keytype");void 0===b||null===b?this.gi=null:"string"===typeof b?"object"===b||"string"===b||"boolean"===b||"number"=== +b||"function"===b?this.gi=b:z.ka(b,"the string 'object', 'number', 'string', 'boolean', or 'function'","Map constructor: valtype"):"function"===typeof b?this.gi=b===Object?"object":b===String?"string":b===Number?"number":b===Boolean?"boolean":b===Function?"function":b:z.ka(b,"null, a primitive type name, or a class type","Map constructor: valtype");this.sd={};this.rd=0;this.Nj=this.ec=null;this.H=0;this.Uh=this.Ka=null}z.ia("Map",na); +function db(a,b){null!==a.bf&&("string"===typeof a.bf?typeof b===a.bf&&null!==b||z.ic(b,a.bf):b instanceof a.bf||z.ic(b,a.bf))}na.prototype.Jc=function(){var a=this.H;a++;999999999<a&&(a=0);this.H=a};na.prototype.freeze=na.prototype.freeze=function(){this.G=!0;return this};na.prototype.thaw=na.prototype.Wa=function(){this.G=!1;return this};na.prototype.toString=function(){return"Map("+z.getTypeName(this.bf)+","+z.getTypeName(this.gi)+")#"+z.nd(this)}; +na.prototype.add=na.prototype.set=na.prototype.add=function(a,b){u&&(db(this,a),null!==this.gi&&("string"===typeof this.gi?typeof b===this.gi&&null!==b||z.ic(b,this.gi):b instanceof this.gi||z.ic(b,this.gi)));this.G&&z.oa(this,a);var c=a;z.Za(a)&&(c=z.It(a));var d=this.sd[c];if(void 0===d)return this.rd++,d=new Ya(a,b),this.sd[c]=d,c=this.Uh,null===c?this.Ka=d:(d.Go=c,c.bb=d),this.Uh=d,this.Jc(),!0;d.value=b;return!1}; +na.prototype.addAll=na.prototype.$c=function(a){if(null===a)return this;if(z.isArray(a))for(var b=z.ab(a),c=0;c<b;c++){var d=z.Ya(a,c);this.add(d.key,d.value)}else for(a=a.i;a.next();)this.add(a.key,a.value);return this};na.prototype.first=na.prototype.first=function(){return this.Ka};na.prototype.any=function(a){for(var b=this.H,c=this.Ka;null!==c;){if(a(c))return!0;this.H!==b&&z.Sa(this);c=c.bb}return!1}; +na.prototype.all=function(a){for(var b=this.H,c=this.Ka;null!==c;){if(!a(c))return!1;this.H!==b&&z.Sa(this);c=c.bb}return!0};na.prototype.each=function(a){for(var b=this.H,c=this.Ka;null!==c;)a(c),this.H!==b&&z.Sa(this),c=c.bb;return this};na.prototype.map=function(a){for(var b=new na(this.bf),c=this.H,d=this.Ka;null!==d;)b.add(d.key,a(d)),this.H!==c&&z.Sa(this),d=d.bb;return b}; +na.prototype.filter=function(a){for(var b=new na(this.bf,this.gi),c=this.H,d=this.Ka;null!==d;)a(d)&&b.add(d.key,d.value),this.H!==c&&z.Sa(this),d=d.bb;return b};na.prototype.concat=function(a){return this.copy().$c(a)};na.prototype.contains=na.prototype.has=na.prototype.contains=function(a){u&&db(this,a);var b=a;return z.Za(a)&&(b=z.nd(a),void 0===b)?!1:void 0!==this.sd[b]}; +na.prototype.getValue=na.prototype.get=na.prototype.na=function(a){u&&db(this,a);var b=a;if(z.Za(a)&&(b=z.nd(a),void 0===b))return null;a=this.sd[b];return void 0===a?null:a.value}; +na.prototype.remove=na.prototype["delete"]=na.prototype.remove=function(a){if(null===a)return!1;u&&db(this,a);this.G&&z.oa(this,a);var b=a;if(z.Za(a)&&(b=z.nd(a),void 0===b))return!1;a=this.sd[b];if(void 0===a)return!1;var c=a.bb,d=a.Go;null!==c&&(c.Go=d);null!==d&&(d.bb=c);this.Ka===a&&(this.Ka=c);this.Uh===a&&(this.Uh=d);delete this.sd[b];this.rd--;this.Jc();return!0};na.prototype.clear=na.prototype.clear=function(){this.G&&z.oa(this);this.sd={};this.rd=0;this.Uh=this.Ka=null;this.Jc()}; +na.prototype.copy=function(){var a=new na(this.bf,this.gi),b=this.sd,c;for(c in b){var d=b[c];a.add(d.key,d.value)}return a};na.prototype.toArray=na.prototype.jc=function(){var a=this.sd,b=Array(this.rd),c=0,d;for(d in a){var e=a[d];b[c]=new Ya(e.key,e.value);c++}return b};na.prototype.toKeySet=na.prototype.vj=function(){return new $a(this)};z.w(na,{count:"count"},function(){return this.rd});z.w(na,{size:"size"},function(){return this.rd}); +z.w(na,{i:"iterator"},function(){if(0>=this.count)return Pa;var a=this.ec;return null!==a?(a.reset(),a):new bb(this)});z.w(na,{TE:"iteratorKeys"},function(){return 0>=this.count?Pa:new Za(this)});z.w(na,{UE:"iteratorValues"},function(){if(0>=this.count)return Pa;var a=this.Nj;return null!==a?(a.reset(),a):new ab(this)});function N(a,b){void 0===a?this.K=this.J=0:"number"===typeof a&&"number"===typeof b?(this.J=a,this.K=b):z.k("Invalid arguments to Point constructor: "+a+", "+b);this.G=!1} +z.ia("Point",N);z.ji(N);z.Yd(N,{x:!0,y:!0});N.prototype.assign=function(a){this.J=a.J;this.K=a.K};N.prototype.setTo=N.prototype.n=function(a,b){u&&(z.g(a,"number",N,"setTo:x"),z.g(b,"number",N,"setTo:y"));this.J=a;this.K=b;return this};N.prototype.set=N.prototype.set=function(a){u&&z.l(a,N,N,"set:p");this.Pa();this.J=a.J;this.K=a.K;return this};N.prototype.copy=function(){var a=new N;a.J=this.J;a.K=this.K;return a};f=N.prototype;f.La=function(){this.G=!0;Object.freeze(this);return this}; +f.V=function(){return Object.isFrozen(this)?this:this.copy().freeze()};f.freeze=function(){this.G=!0;return this};f.Wa=function(){Object.isFrozen(this)&&z.k("cannot thaw constant: "+this);this.G=!1;return this};f.Pa=function(a){if(this.G){var b="The Point is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);z.k(b)}}; +N.parse=function(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=0;""===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));for(var e=0;""===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));return new N(c,e)}return new N};N.stringify=function(a){return a instanceof N?a.x.toString()+" "+a.y.toString():a.toString()};N.prototype.toString=function(){return"Point("+this.x+","+this.y+")"};N.prototype.equals=N.prototype.N=function(a){return a instanceof N?this.J===a.x&&this.K===a.y:!1}; +N.prototype.equalTo=N.prototype.Ww=function(a,b){return this.J===a&&this.K===b};N.prototype.equalsApprox=N.prototype.Mc=function(a){return eb(this.J,a.x)&&eb(this.K,a.y)};N.prototype.add=N.prototype.add=function(a){u&&z.l(a,N,N,"add:p");this.Pa();this.J+=a.x;this.K+=a.y;return this};N.prototype.subtract=N.prototype.xu=function(a){u&&z.l(a,N,N,"subtract:p");this.Pa();this.J-=a.x;this.K-=a.y;return this}; +N.prototype.offset=N.prototype.offset=function(a,b){u&&(z.p(a,N,"offset:dx"),z.p(b,N,"offset:dy"));this.Pa();this.J+=a;this.K+=b;return this};N.prototype.rotate=N.prototype.rotate=function(a){u&&z.p(a,N,"rotate:angle");this.Pa();if(0===a)return this;var b=this.J,c=this.K;if(0===b&&0===c)return this;var d=0,e=0;360<=a?a-=360:0>a&&(a+=360);90===a?(d=0,e=1):180===a?(d=-1,e=0):270===a?(d=0,e=-1):(a=a*Math.PI/180,d=Math.cos(a),e=Math.sin(a));this.J=d*b-e*c;this.K=e*b+d*c;return this}; +N.prototype.scale=N.prototype.scale=function(a,b){u&&(z.p(a,N,"scale:sx"),z.p(b,N,"scale:sy"));this.J*=a;this.K*=b;return this};N.prototype.distanceSquaredPoint=N.prototype.Af=function(a){u&&z.l(a,N,N,"distanceSquaredPoint:p");var b=a.x-this.J;a=a.y-this.K;return b*b+a*a};N.prototype.distanceSquared=N.prototype.jp=function(a,b){u&&(z.p(a,N,"distanceSquared:px"),z.p(b,N,"distanceSquared:py"));var c=a-this.J,d=b-this.K;return c*c+d*d}; +N.prototype.normalize=N.prototype.normalize=function(){this.Pa();var a=this.J,b=this.K,c=Math.sqrt(a*a+b*b);0<c&&(this.J=a/c,this.K=b/c);return this};N.prototype.directionPoint=N.prototype.Ec=function(a){u&&z.l(a,N,N,"directionPoint:p");return fb(a.x-this.J,a.y-this.K)};N.prototype.direction=N.prototype.direction=function(a,b){u&&(z.p(a,N,"direction:px"),z.p(b,N,"direction:py"));return fb(a-this.J,b-this.K)}; +function fb(a,b){if(0===a)return 0<b?90:0>b?270:0;if(0===b)return 0<a?0:180;if(isNaN(a)||isNaN(b))return 0;var c=180*Math.atan(Math.abs(b/a))/Math.PI;0>a?c=0>b?c+180:180-c:0>b&&(c=360-c);return c}N.prototype.projectOntoLineSegment=function(a,b,c,d){u&&(z.p(a,N,"projectOntoLineSegment:px"),z.p(b,N,"projectOntoLineSegment:py"),z.p(c,N,"projectOntoLineSegment:qx"),z.p(d,N,"projectOntoLineSegment:qy"));ib(a,b,c,d,this.J,this.K,this);return this}; +N.prototype.projectOntoLineSegmentPoint=function(a,b){u&&(z.l(a,N,N,"projectOntoLineSegmentPoint:p"),z.l(b,N,N,"projectOntoLineSegmentPoint:q"));ib(a.x,a.y,b.x,b.y,this.J,this.K,this);return this};N.prototype.snapToGrid=function(a,b,c,d){u&&(z.p(a,N,"snapToGrid:originx"),z.p(b,N,"snapToGrid:originy"),z.p(c,N,"snapToGrid:cellwidth"),z.p(d,N,"snapToGrid:cellheight"));jb(this.J,this.K,a,b,c,d,this);return this}; +N.prototype.snapToGridPoint=function(a,b){u&&(z.l(a,N,N,"snapToGridPoint:p"),z.l(b,Ea,N,"snapToGridPoint:q"));jb(this.J,this.K,a.x,a.y,b.width,b.height,this);return this};N.prototype.setRectSpot=N.prototype.ru=function(a,b){u&&(z.l(a,w,N,"setRectSpot:r"),z.l(b,Q,N,"setRectSpot:spot"));this.Pa();this.J=a.x+b.x*a.width+b.offsetX;this.K=a.y+b.y*a.height+b.offsetY;return this}; +N.prototype.setSpot=N.prototype.tu=function(a,b,c,d,e){u&&(z.p(a,N,"setSpot:x"),z.p(b,N,"setSpot:y"),z.p(c,N,"setSpot:w"),z.p(d,N,"setSpot:h"),(0>c||0>d)&&z.k("Point.setSpot:Width and height cannot be negative"),z.l(e,Q,N,"setSpot:spot"));this.Pa();this.J=a+e.x*c+e.offsetX;this.K=b+e.y*d+e.offsetY;return this};N.prototype.transform=function(a){u&&z.l(a,Fa,N,"transform:t");a.Cb(this);return this};function tb(a,b){u&&z.l(b,Fa,N,"transformInverted:t");b.li(a);return a}var ub; +N.distanceLineSegmentSquared=ub=function(a,b,c,d,e,g){u&&(z.p(a,N,"distanceLineSegmentSquared:px"),z.p(b,N,"distanceLineSegmentSquared:py"),z.p(c,N,"distanceLineSegmentSquared:ax"),z.p(d,N,"distanceLineSegmentSquared:ay"),z.p(e,N,"distanceLineSegmentSquared:bx"),z.p(g,N,"distanceLineSegmentSquared:by"));var h=e-c,k=g-d,l=h*h+k*k;c-=a;d-=b;var m=-c*h-d*k;if(0>=m||m>=l)return h=e-a,k=g-b,Math.min(c*c+d*d,h*h+k*k);a=h*d-k*c;return a*a/l};var vb; +N.distanceSquared=vb=function(a,b,c,d){u&&(z.p(a,N,"distanceSquared:px"),z.p(b,N,"distanceSquared:py"),z.p(c,N,"distanceSquared:qx"),z.p(d,N,"distanceSquared:qy"));a=c-a;b=d-b;return a*a+b*b};var wb; +N.direction=wb=function(a,b,c,d){u&&(z.p(a,N,"direction:px"),z.p(b,N,"direction:py"),z.p(c,N,"direction:qx"),z.p(d,N,"direction:qy"));a=c-a;b=d-b;if(0===a)return 0<b?90:0>b?270:0;if(0===b)return 0<a?0:180;if(isNaN(a)||isNaN(b))return 0;d=180*Math.atan(Math.abs(b/a))/Math.PI;0>a?d=0>b?d+180:180-d:0>b&&(d=360-d);return d};z.defineProperty(N,{x:"x"},function(){return this.J},function(a){this.Pa(a);u&&z.g(a,"number",N,"x");this.J=a}); +z.defineProperty(N,{y:"y"},function(){return this.K},function(a){this.Pa(a);u&&z.g(a,"number",N,"y");this.K=a});N.prototype.isReal=N.prototype.F=function(){return isFinite(this.x)&&isFinite(this.y)};function Ea(a,b){void 0===a?this.Ea=this.Fa=0:"number"===typeof a&&(0<=a||isNaN(a))&&"number"===typeof b&&(0<=b||isNaN(b))?(this.Fa=a,this.Ea=b):z.k("Invalid arguments to Size constructor: "+a+", "+b);this.G=!1}z.ia("Size",Ea);z.ji(Ea);z.Yd(Ea,{width:!0,height:!0}); +Ea.prototype.assign=function(a){this.Fa=a.Fa;this.Ea=a.Ea};Ea.prototype.setTo=Ea.prototype.n=function(a,b){u&&(z.g(a,"number",Ea,"setTo:w"),z.g(b,"number",Ea,"setTo:h"),0>a&&z.ka(a,">= 0",Ea,"setTo:w"),0>b&&z.ka(b,">= 0",Ea,"setTo:h"));this.Fa=a;this.Ea=b;return this};Ea.prototype.set=Ea.prototype.set=function(a){u&&z.l(a,Ea,Ea,"set:s");this.Pa();this.Fa=a.Fa;this.Ea=a.Ea;return this};Ea.prototype.copy=function(){var a=new Ea;a.Fa=this.Fa;a.Ea=this.Ea;return a};f=Ea.prototype; +f.La=function(){this.G=!0;Object.freeze(this);return this};f.V=function(){return Object.isFrozen(this)?this:this.copy().freeze()};f.freeze=function(){this.G=!0;return this};f.Wa=function(){Object.isFrozen(this)&&z.k("cannot thaw constant: "+this);this.G=!1;return this};f.Pa=function(a){if(this.G){var b="The Size is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);z.k(b)}}; +Ea.parse=function(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=0;""===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));for(var e=0;""===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));return new Ea(c,e)}return new Ea};Ea.stringify=function(a){return a instanceof Ea?a.width.toString()+" "+a.height.toString():a.toString()};Ea.prototype.toString=function(){return"Size("+this.width+","+this.height+")"}; +Ea.prototype.equals=Ea.prototype.N=function(a){return a instanceof Ea?this.Fa===a.width&&this.Ea===a.height:!1};Ea.prototype.equalTo=Ea.prototype.Ww=function(a,b){return this.Fa===a&&this.Ea===b};Ea.prototype.equalsApprox=Ea.prototype.Mc=function(a){return eb(this.Fa,a.width)&&eb(this.Ea,a.height)};z.defineProperty(Ea,{width:"width"},function(){return this.Fa},function(a){this.Pa(a);u&&z.g(a,"number",Ea,"width");0>a&&z.ka(a,">= 0",Ea,"width");this.Fa=a}); +z.defineProperty(Ea,{height:"height"},function(){return this.Ea},function(a){this.Pa(a);u&&z.g(a,"number",Ea,"height");0>a&&z.ka(a,">= 0",Ea,"height");this.Ea=a});Ea.prototype.isReal=Ea.prototype.F=function(){return isFinite(this.width)&&isFinite(this.height)}; +function w(a,b,c,d){void 0===a?this.Ea=this.Fa=this.K=this.J=0:a instanceof N?b instanceof N?(this.J=Math.min(a.J,b.J),this.K=Math.min(a.K,b.K),this.Fa=Math.abs(a.J-b.J),this.Ea=Math.abs(a.K-b.K)):b instanceof Ea?(this.J=a.J,this.K=a.K,this.Fa=b.Fa,this.Ea=b.Ea):z.k("Incorrect arguments supplied to Rect constructor"):"number"===typeof a&&"number"===typeof b&&"number"===typeof c&&(0<=c||isNaN(c))&&"number"===typeof d&&(0<=d||isNaN(d))?(this.J=a,this.K=b,this.Fa=c,this.Ea=d):z.k("Invalid arguments to Rect constructor: "+ +a+", "+b+", "+c+", "+d);this.G=!1}z.ia("Rect",w);z.ji(w);z.Yd(w,{x:!0,y:!0,width:!0,height:!0});w.prototype.assign=function(a){this.J=a.J;this.K=a.K;this.Fa=a.Fa;this.Ea=a.Ea};function yb(a,b,c){a.Fa=b;a.Ea=c}w.prototype.setTo=w.prototype.n=function(a,b,c,d){u&&(z.g(a,"number",w,"setTo:x"),z.g(b,"number",w,"setTo:y"),z.g(c,"number",w,"setTo:w"),z.g(d,"number",w,"setTo:h"),0>c&&z.ka(c,">= 0",w,"setTo:w"),0>d&&z.ka(d,">= 0",w,"setTo:h"));this.J=a;this.K=b;this.Fa=c;this.Ea=d;return this}; +w.prototype.set=w.prototype.set=function(a){u&&z.l(a,w,w,"set:r");this.Pa();this.J=a.J;this.K=a.K;this.Fa=a.Fa;this.Ea=a.Ea;return this};w.prototype.setPoint=w.prototype.Kf=function(a){u&&z.l(a,N,w,"setPoint:p");this.Pa();this.J=a.J;this.K=a.K;return this};w.prototype.setSize=function(a){u&&z.l(a,Ea,w,"setSize:s");this.Pa();this.Fa=a.Fa;this.Ea=a.Ea;return this};w.prototype.copy=function(){var a=new w;a.J=this.J;a.K=this.K;a.Fa=this.Fa;a.Ea=this.Ea;return a};f=w.prototype; +f.La=function(){this.G=!0;Object.freeze(this);return this};f.V=function(){return Object.isFrozen(this)?this:this.copy().freeze()};f.freeze=function(){this.G=!0;return this};f.Wa=function(){Object.isFrozen(this)&&z.k("cannot thaw constant: "+this);this.G=!1;return this};f.Pa=function(a){if(this.G){var b="The Rect is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);z.k(b)}}; +w.parse=function(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=0;""===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));for(var e=0;""===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));for(var g=0;""===a[b];)b++;(d=a[b++])&&(g=parseFloat(d));for(var h=0;""===a[b];)b++;(d=a[b++])&&(h=parseFloat(d));return new w(c,e,g,h)}return new w};w.stringify=function(a){return a instanceof w?a.x.toString()+" "+a.y.toString()+" "+a.width.toString()+" "+a.height.toString():a.toString()}; +w.prototype.toString=function(){return"Rect("+this.x+","+this.y+","+this.width+","+this.height+")"};w.prototype.equals=w.prototype.N=function(a){return a instanceof w?this.J===a.x&&this.K===a.y&&this.Fa===a.width&&this.Ea===a.height:!1};w.prototype.equalTo=w.prototype.Ww=function(a,b,c,d){return this.J===a&&this.K===b&&this.Fa===c&&this.Ea===d};w.prototype.equalsApprox=w.prototype.Mc=function(a){return eb(this.J,a.x)&&eb(this.K,a.y)&&eb(this.Fa,a.width)&&eb(this.Ea,a.height)}; +w.prototype.containsPoint=w.prototype.Ma=function(a){u&&z.l(a,N,w,"containsPoint:p");return this.J<=a.x&&this.J+this.Fa>=a.x&&this.K<=a.y&&this.K+this.Ea>=a.y};w.prototype.containsRect=w.prototype.nk=function(a){u&&z.l(a,w,w,"containsRect:r");return this.J<=a.x&&a.x+a.width<=this.J+this.Fa&&this.K<=a.y&&a.y+a.height<=this.K+this.Ea}; +w.prototype.contains=w.prototype.contains=function(a,b,c,d){u?(z.p(a,w,"contains:x"),z.p(b,w,"contains:y"),void 0===c?c=0:z.p(c,w,"contains:w"),void 0===d?d=0:z.p(d,w,"contains:h"),(0>c||0>d)&&z.k("Rect.contains:Width and height cannot be negative")):(void 0===c&&(c=0),void 0===d&&(d=0));return this.J<=a&&a+c<=this.J+this.Fa&&this.K<=b&&b+d<=this.K+this.Ea};w.prototype.reset=function(){this.Pa();this.Ea=this.Fa=this.K=this.J=0}; +w.prototype.offset=w.prototype.offset=function(a,b){u&&(z.p(a,w,"offset:dx"),z.p(b,w,"offset:dy"));this.Pa();this.J+=a;this.K+=b;return this};w.prototype.inflate=w.prototype.bg=function(a,b){u&&(z.p(a,w,"inflate:w"),z.p(b,w,"inflate:h"));return zb(this,b,a,b,a)};w.prototype.addMargin=w.prototype.Cw=function(a){u&&z.l(a,Db,w,"addMargin:m");return zb(this,a.top,a.right,a.bottom,a.left)}; +w.prototype.subtractMargin=w.prototype.qJ=function(a){u&&z.l(a,Db,w,"subtractMargin:m");return zb(this,-a.top,-a.right,-a.bottom,-a.left)};w.prototype.grow=function(a,b,c,d){u&&(z.p(a,w,"grow:t"),z.p(b,w,"grow:r"),z.p(c,w,"grow:b"),z.p(d,w,"grow:l"));return zb(this,a,b,c,d)};function zb(a,b,c,d,e){a.Pa();var g=a.Fa;c+e<=-g?(a.J+=g/2,a.Fa=0):(a.J-=e,a.Fa+=c+e);c=a.Ea;b+d<=-c?(a.K+=c/2,a.Ea=0):(a.K-=b,a.Ea+=b+d);return a} +w.prototype.intersectRect=function(a){u&&z.l(a,w,w,"intersectRect:r");return Eb(this,a.x,a.y,a.width,a.height)};w.prototype.intersect=function(a,b,c,d){u&&(z.p(a,w,"intersect:x"),z.p(b,w,"intersect:y"),z.p(c,w,"intersect:w"),z.p(d,w,"intersect:h"),(0>c||0>d)&&z.k("Rect.intersect:Width and height cannot be negative"));return Eb(this,a,b,c,d)}; +function Eb(a,b,c,d,e){a.Pa();var g=Math.max(a.J,b),h=Math.max(a.K,c);b=Math.min(a.J+a.Fa,b+d);c=Math.min(a.K+a.Ea,c+e);a.J=g;a.K=h;a.Fa=Math.max(0,b-g);a.Ea=Math.max(0,c-h);return a}w.prototype.intersectsRect=w.prototype.Jg=function(a){u&&z.l(a,w,w,"intersectsRect:r");return this.FE(a.x,a.y,a.width,a.height)}; +w.prototype.intersects=w.prototype.FE=function(a,b,c,d){u&&(z.p(a,w,"intersects:x"),z.p(b,w,"intersects:y"),z.p(a,w,"intersects:w"),z.p(b,w,"intersects:h"),(0>c||0>d)&&z.k("Rect.intersects:Width and height cannot be negative"));var e=this.Fa,g=this.J;if(Infinity!==e&&Infinity!==c&&(e+=g,c+=a,isNaN(c)||isNaN(e)||g>c||a>e))return!1;a=this.Ea;c=this.K;return Infinity!==a&&Infinity!==d&&(a+=c,d+=b,isNaN(d)||isNaN(a)||c>d||b>a)?!1:!0}; +function Gb(a,b){var c=a.Fa,d=b.width+10+10,e=a.J,g=b.x-10;if(e>d+g||g>c+e)return!1;c=a.Ea;d=b.height+10+10;e=a.K;g=b.y-10;return e>d+g||g>c+e?!1:!0}w.prototype.unionPoint=w.prototype.wj=function(a){u&&z.l(a,N,w,"unionPoint:p");return Hb(this,a.x,a.y,0,0)};w.prototype.unionRect=w.prototype.ri=function(a){u&&z.l(a,w,w,"unionRect:r");return Hb(this,a.J,a.K,a.Fa,a.Ea)}; +w.prototype.union=w.prototype.cG=function(a,b,c,d){this.Pa();u?(z.p(a,w,"union:x"),z.p(b,w,"union:y"),void 0===c?c=0:z.p(c,w,"union:w"),void 0===d?d=0:z.p(d,w,"union:h"),(0>c||0>d)&&z.k("Rect.union:Width and height cannot be negative")):(void 0===c&&(c=0),void 0===d&&(d=0));return Hb(this,a,b,c,d)};function Hb(a,b,c,d,e){var g=Math.min(a.J,b),h=Math.min(a.K,c);b=Math.max(a.J+a.Fa,b+d);c=Math.max(a.K+a.Ea,c+e);a.J=g;a.K=h;a.Fa=b-g;a.Ea=c-h;return a} +w.prototype.setSpot=w.prototype.tu=function(a,b,c){u&&(z.p(a,w,"setSpot:x"),z.p(b,w,"setSpot:y"),z.l(c,Q,w,"setSpot:spot"));this.Pa();this.J=a-c.offsetX-c.x*this.Fa;this.K=b-c.offsetY-c.y*this.Ea;return this};var Jb; +w.contains=Jb=function(a,b,c,d,e,g,h,k){u?(z.p(a,w,"contains:rx"),z.p(b,w,"contains:ry"),z.p(c,w,"contains:rw"),z.p(d,w,"contains:rh"),z.p(e,w,"contains:x"),z.p(g,w,"contains:y"),void 0===h?h=0:z.p(h,w,"contains:w"),void 0===k?k=0:z.p(k,w,"contains:h"),(0>c||0>d||0>h||0>k)&&z.k("Rect.contains:Width and height cannot be negative")):(void 0===h&&(h=0),void 0===k&&(k=0));return a<=e&&e+h<=a+c&&b<=g&&g+k<=b+d}; +w.intersects=function(a,b,c,d,e,g,h,k){u&&(z.p(a,w,"intersects:rx"),z.p(b,w,"intersects:ry"),z.p(c,w,"intersects:rw"),z.p(d,w,"intersects:rh"),z.p(e,w,"intersects:x"),z.p(g,w,"intersects:y"),z.p(h,w,"intersects:w"),z.p(k,w,"intersects:h"),(0>c||0>d||0>h||0>k)&&z.k("Rect.intersects:Width and height cannot be negative"));c+=a;h+=e;if(a>h||e>c)return!1;a=d+b;k+=g;return b>k||g>a?!1:!0};z.defineProperty(w,{x:"x"},function(){return this.J},function(a){this.Pa(a);u&&z.g(a,"number",w,"x");this.J=a}); +z.defineProperty(w,{y:"y"},function(){return this.K},function(a){this.Pa(a);u&&z.g(a,"number",w,"y");this.K=a});z.defineProperty(w,{width:"width"},function(){return this.Fa},function(a){this.Pa(a);u&&z.g(a,"number",w,"width");0>a&&z.ka(a,">= 0",w,"width");this.Fa=a});z.defineProperty(w,{height:"height"},function(){return this.Ea},function(a){this.Pa(a);u&&z.g(a,"number",w,"height");0>a&&z.ka(a,">= 0",w,"height");this.Ea=a}); +z.defineProperty(w,{left:"left"},function(){return this.J},function(a){this.Pa(a);u&&z.g(a,"number",w,"left");this.J=a});z.defineProperty(w,{top:"top"},function(){return this.K},function(a){this.Pa(a);u&&z.g(a,"number",w,"top");this.K=a});z.defineProperty(w,{right:"right"},function(){return this.J+this.Fa},function(a){this.Pa(a);u&&z.p(a,w,"right");this.J+=a-(this.J+this.Fa)}); +z.defineProperty(w,{bottom:"bottom"},function(){return this.K+this.Ea},function(a){this.Pa(a);u&&z.p(a,w,"top");this.K+=a-(this.K+this.Ea)});z.defineProperty(w,{position:"position"},function(){return new N(this.J,this.K)},function(a){this.Pa(a);u&&z.l(a,N,w,"position");this.J=a.x;this.K=a.y});z.defineProperty(w,{size:"size"},function(){return new Ea(this.Fa,this.Ea)},function(a){this.Pa(a);u&&z.l(a,Ea,w,"size");this.Fa=a.width;this.Ea=a.height}); +z.defineProperty(w,{yl:"center"},function(){return new N(this.J+this.Fa/2,this.K+this.Ea/2)},function(a){this.Pa(a);u&&z.l(a,N,w,"center");this.J=a.x-this.Fa/2;this.K=a.y-this.Ea/2});z.defineProperty(w,{ra:"centerX"},function(){return this.J+this.Fa/2},function(a){this.Pa(a);u&&z.p(a,w,"centerX");this.J=a-this.Fa/2});z.defineProperty(w,{za:"centerY"},function(){return this.K+this.Ea/2},function(a){this.Pa(a);u&&z.p(a,w,"centerY");this.K=a-this.Ea/2}); +w.prototype.isReal=w.prototype.F=function(){return isFinite(this.x)&&isFinite(this.y)&&isFinite(this.width)&&isFinite(this.height)};w.prototype.isEmpty=function(){return 0===this.width&&0===this.height}; +function Db(a,b,c,d){void 0===a?this.gh=this.Yg=this.oh=this.ph=0:void 0===b?this.left=this.bottom=this.right=this.top=a:void 0===c?(d=b,this.top=a,this.right=b,this.bottom=a,this.left=d):void 0!==d?(this.top=a,this.right=b,this.bottom=c,this.left=d):z.k("Invalid arguments to Margin constructor: "+a+", "+b+", "+c+", "+d);this.G=!1}z.ia("Margin",Db);z.ji(Db);z.Yd(Db,{top:!0,right:!0,bottom:!0,left:!0});Db.prototype.assign=function(a){this.ph=a.ph;this.oh=a.oh;this.Yg=a.Yg;this.gh=a.gh}; +Db.prototype.setTo=Db.prototype.n=function(a,b,c,d){u&&(z.g(a,"number",Db,"setTo:t"),z.g(b,"number",Db,"setTo:r"),z.g(c,"number",Db,"setTo:b"),z.g(d,"number",Db,"setTo:l"));this.Pa();this.ph=a;this.oh=b;this.Yg=c;this.gh=d;return this};Db.prototype.set=Db.prototype.set=function(a){u&&z.l(a,Db,Db,"assign:m");this.Pa();this.ph=a.ph;this.oh=a.oh;this.Yg=a.Yg;this.gh=a.gh;return this};Db.prototype.copy=function(){var a=new Db;a.ph=this.ph;a.oh=this.oh;a.Yg=this.Yg;a.gh=this.gh;return a};f=Db.prototype; +f.La=function(){this.G=!0;Object.freeze(this);return this};f.V=function(){return Object.isFrozen(this)?this:this.copy().freeze()};f.freeze=function(){this.G=!0;return this};f.Wa=function(){Object.isFrozen(this)&&z.k("cannot thaw constant: "+this);this.G=!1;return this};f.Pa=function(a){if(this.G){var b="The Margin is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);z.k(b)}}; +Db.parse=function(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=NaN;""===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));if(isNaN(c))return new Db;for(var e=NaN;""===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));if(isNaN(e))return new Db(c);for(var g=NaN;""===a[b];)b++;(d=a[b++])&&(g=parseFloat(d));if(isNaN(g))return new Db(c,e);for(var h=NaN;""===a[b];)b++;(d=a[b++])&&(h=parseFloat(d));return isNaN(h)?new Db(c,e):new Db(c,e,g,h)}return new Db}; +Db.stringify=function(a){return a instanceof Db?a.top.toString()+" "+a.right.toString()+" "+a.bottom.toString()+" "+a.left.toString():a.toString()};Db.prototype.toString=function(){return"Margin("+this.top+","+this.right+","+this.bottom+","+this.left+")"};Db.prototype.equals=Db.prototype.N=function(a){return a instanceof Db?this.ph===a.top&&this.oh===a.right&&this.Yg===a.bottom&&this.gh===a.left:!1}; +Db.prototype.equalTo=Db.prototype.Ww=function(a,b,c,d){return this.ph===a&&this.oh===b&&this.Yg===c&&this.gh===d};Db.prototype.equalsApprox=Db.prototype.Mc=function(a){return eb(this.ph,a.top)&&eb(this.oh,a.right)&&eb(this.Yg,a.bottom)&&eb(this.gh,a.left)};z.defineProperty(Db,{top:"top"},function(){return this.ph},function(a){this.Pa(a);u&&z.p(a,Db,"top");this.ph=a});z.defineProperty(Db,{right:"right"},function(){return this.oh},function(a){this.Pa(a);u&&z.p(a,Db,"right");this.oh=a}); +z.defineProperty(Db,{bottom:"bottom"},function(){return this.Yg},function(a){this.Pa(a);u&&z.p(a,Db,"bottom");this.Yg=a});z.defineProperty(Db,{left:"left"},function(){return this.gh},function(a){this.Pa(a);u&&z.p(a,Db,"left");this.gh=a});Db.prototype.isReal=Db.prototype.F=function(){return isFinite(this.top)&&isFinite(this.right)&&isFinite(this.bottom)&&isFinite(this.left)};function Fa(){this.m11=1;this.m21=this.m12=0;this.m22=1;this.dy=this.dx=0}z.ji(Fa); +z.Yd(Fa,{m11:!0,m12:!0,m21:!0,m22:!0,dx:!0,dy:!0});Fa.prototype.set=Fa.prototype.set=function(a){u&&z.l(a,Fa,Fa,"set:t");this.m11=a.m11;this.m12=a.m12;this.m21=a.m21;this.m22=a.m22;this.dx=a.dx;this.dy=a.dy;return this};Fa.prototype.copy=function(){var a=new Fa;a.m11=this.m11;a.m12=this.m12;a.m21=this.m21;a.m22=this.m22;a.dx=this.dx;a.dy=this.dy;return a};Fa.prototype.toString=function(){return"Transform("+this.m11+","+this.m12+","+this.m21+","+this.m22+","+this.dx+","+this.dy+")"}; +Fa.prototype.equals=Fa.prototype.N=function(a){return a instanceof Fa?this.m11===a.m11&&this.m12===a.m12&&this.m21===a.m21&&this.m22===a.m22&&this.dx===a.dx&&this.dy===a.dy:!1};Fa.prototype.isIdentity=Fa.prototype.Pt=function(){return 1===this.m11&&0===this.m12&&0===this.m21&&1===this.m22&&0===this.dx&&0===this.dy};Fa.prototype.reset=Fa.prototype.reset=function(){this.m11=1;this.m21=this.m12=0;this.m22=1;this.dy=this.dx=0;return this}; +Fa.prototype.multiply=Fa.prototype.multiply=function(a){u&&z.l(a,Fa,Fa,"multiply:matrix");var b=this.m12*a.m11+this.m22*a.m12,c=this.m11*a.m21+this.m21*a.m22,d=this.m12*a.m21+this.m22*a.m22,e=this.m11*a.dx+this.m21*a.dy+this.dx,g=this.m12*a.dx+this.m22*a.dy+this.dy;this.m11=this.m11*a.m11+this.m21*a.m12;this.m12=b;this.m21=c;this.m22=d;this.dx=e;this.dy=g;return this}; +Fa.prototype.multiplyInverted=Fa.prototype.uA=function(a){u&&z.l(a,Fa,Fa,"multiplyInverted:matrix");var b=1/(a.m11*a.m22-a.m12*a.m21),c=a.m22*b,d=-a.m12*b,e=-a.m21*b,g=a.m11*b,h=b*(a.m21*a.dy-a.m22*a.dx),k=b*(a.m12*a.dx-a.m11*a.dy);a=this.m12*c+this.m22*d;b=this.m11*e+this.m21*g;e=this.m12*e+this.m22*g;g=this.m11*h+this.m21*k+this.dx;h=this.m12*h+this.m22*k+this.dy;this.m11=this.m11*c+this.m21*d;this.m12=a;this.m21=b;this.m22=e;this.dx=g;this.dy=h;return this}; +Fa.prototype.invert=Fa.prototype.eA=function(){var a=1/(this.m11*this.m22-this.m12*this.m21),b=-this.m12*a,c=-this.m21*a,d=this.m11*a,e=a*(this.m21*this.dy-this.m22*this.dx),g=a*(this.m12*this.dx-this.m11*this.dy);this.m11=this.m22*a;this.m12=b;this.m21=c;this.m22=d;this.dx=e;this.dy=g;return this}; +Fa.prototype.rotate=Fa.prototype.rotate=function(a,b,c){u&&(z.p(a,Fa,"rotate:angle"),z.p(b,Fa,"rotate:rx"),z.p(c,Fa,"rotate:ry"));360<=a?a-=360:0>a&&(a+=360);if(0===a)return this;this.translate(b,c);var d=0,e=0;90===a?(d=0,e=1):180===a?(d=-1,e=0):270===a?(d=0,e=-1):(e=a*Math.PI/180,d=Math.cos(e),e=Math.sin(e));a=this.m12*d+this.m22*e;var g=this.m11*-e+this.m21*d,h=this.m12*-e+this.m22*d;this.m11=this.m11*d+this.m21*e;this.m12=a;this.m21=g;this.m22=h;this.translate(-b,-c);return this}; +Fa.prototype.translate=Fa.prototype.translate=function(a,b){u&&(z.p(a,Fa,"translate:x"),z.p(b,Fa,"translate:y"));this.dx+=this.m11*a+this.m21*b;this.dy+=this.m12*a+this.m22*b;return this};Fa.prototype.scale=Fa.prototype.scale=function(a,b){void 0===b&&(b=a);u&&(z.p(a,Fa,"translate:sx"),z.p(b,Fa,"translate:sy"));this.m11*=a;this.m12*=a;this.m21*=b;this.m22*=b;return this}; +Fa.prototype.transformPoint=Fa.prototype.Cb=function(a){u&&z.l(a,N,Fa,"transformPoint:p");var b=a.J,c=a.K;a.J=b*this.m11+c*this.m21+this.dx;a.K=b*this.m12+c*this.m22+this.dy;return a};Fa.prototype.invertedTransformPoint=Fa.prototype.li=function(a){u&&z.l(a,N,Fa,"invertedTransformPoint:p");var b=1/(this.m11*this.m22-this.m12*this.m21),c=-this.m12*b,d=this.m11*b,e=b*(this.m12*this.dx-this.m11*this.dy),g=a.J,h=a.K;a.J=g*this.m22*b+h*-this.m21*b+b*(this.m21*this.dy-this.m22*this.dx);a.K=g*c+h*d+e;return a}; +Fa.prototype.transformRect=Fa.prototype.aG=function(a){u&&z.l(a,w,Fa,"transformRect:rect");var b=a.J,c=a.K,d=b+a.Fa,e=c+a.Ea,g=this.m11,h=this.m12,k=this.m21,l=this.m22,m=this.dx,n=this.dy,p=b*g+c*k+m,q=b*h+c*l+n,r=d*g+c*k+m,c=d*h+c*l+n,s=b*g+e*k+m,b=b*h+e*l+n,g=d*g+e*k+m,d=d*h+e*l+n,e=p,h=q,p=Math.min(p,r),e=Math.max(e,r),h=Math.min(h,c),q=Math.max(q,c),p=Math.min(p,s),e=Math.max(e,s),h=Math.min(h,b),q=Math.max(q,b),p=Math.min(p,g),e=Math.max(e,g),h=Math.min(h,d),q=Math.max(q,d);a.J=p;a.K=h;a.Fa= +e-p;a.Ea=q-h;return a};function Q(a,b,c,d){void 0===a?this.yg=this.xg=this.K=this.J=0:(void 0===b&&(b=0),void 0===c&&(c=0),void 0===d&&(d=0),this.x=a,this.y=b,this.offsetX=c,this.offsetY=d);this.G=!1}z.ia("Spot",Q);z.ji(Q);z.Yd(Q,{x:!0,y:!0,offsetX:!0,offsetY:!0});Q.prototype.assign=function(a){this.J=a.J;this.K=a.K;this.xg=a.xg;this.yg=a.yg}; +Q.prototype.setTo=Q.prototype.n=function(a,b,c,d){u&&(Kb(a,"setTo:x"),Kb(b,"setTo:y"),Pb(c,"setTo:offx"),Pb(d,"setTo:offy"));this.Pa();this.J=a;this.K=b;this.xg=c;this.yg=d;return this};Q.prototype.set=Q.prototype.set=function(a){u&&z.l(a,Q,Q,"set:s");this.Pa();this.J=a.J;this.K=a.K;this.xg=a.xg;this.yg=a.yg;return this};Q.prototype.copy=function(){var a=new Q;a.J=this.J;a.K=this.K;a.xg=this.xg;a.yg=this.yg;return a};f=Q.prototype;f.La=function(){this.G=!0;Object.freeze(this);return this}; +f.V=function(){return Object.isFrozen(this)?this:this.copy().freeze()};f.freeze=function(){this.G=!0;return this};f.Wa=function(){Object.isFrozen(this)&&z.k("cannot thaw constant: "+this);this.G=!1;return this};f.Pa=function(a){if(this.G){var b="The Spot is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);z.k(b)}};function Tb(a,b){a.J=NaN;a.K=NaN;a.xg=b;return a}function Kb(a,b){(isNaN(a)||1<a||0>a)&&z.ka(a,"0 <= "+b+" <= 1",Q,b)} +function Pb(a,b){(isNaN(a)||Infinity===a||-Infinity===a)&&z.ka(a,"real number, not NaN or Infinity",Q,b)}var Ub; +Q.parse=Ub=function(a){if("string"===typeof a){a=a.trim();if("None"===a)return Yb;if("TopLeft"===a)return Zb;if("Top"===a||"TopCenter"===a||"MiddleTop"===a)return $b;if("TopRight"===a)return cc;if("Left"===a||"LeftCenter"===a||"MiddleLeft"===a)return dc;if("Center"===a)return ec;if("Right"===a||"RightCenter"===a||"MiddleRight"===a)return fc;if("BottomLeft"===a)return gc;if("Bottom"===a||"BottomCenter"===a||"MiddleBottom"===a)return hc;if("BottomRight"===a)return ic;if("TopSide"===a)return pc;if("LeftSide"=== +a)return qc;if("RightSide"===a)return sc;if("BottomSide"===a)return tc;if("TopBottomSides"===a)return uc;if("LeftRightSides"===a)return vc;if("TopLeftSides"===a)return wc;if("TopRightSides"===a)return xc;if("BottomLeftSides"===a)return Cc;if("BottomRightSides"===a)return Dc;if("NotTopSide"===a)return Ec;if("NotLeftSide"===a)return Fc;if("NotRightSide"===a)return Gc;if("NotBottomSide"===a)return Hc;if("AllSides"===a)return Ic;if("Default"===a)return Pc;a=a.split(" ");for(var b=0,c=0;""===a[b];)b++; +var d=a[b++];void 0!==d&&0<d.length&&(c=parseFloat(d));for(var e=0;""===a[b];)b++;d=a[b++];void 0!==d&&0<d.length&&(e=parseFloat(d));for(var g=0;""===a[b];)b++;d=a[b++];void 0!==d&&0<d.length&&(g=parseFloat(d));for(var h=0;""===a[b];)b++;d=a[b++];void 0!==d&&0<d.length&&(h=parseFloat(d));return new Q(c,e,g,h)}return new Q};Q.stringify=function(a){return a instanceof Q?a.cd()?a.x.toString()+" "+a.y.toString()+" "+a.offsetX.toString()+" "+a.offsetY.toString():a.toString():a.toString()}; +Q.prototype.toString=function(){return this.cd()?0===this.xg&&0===this.yg?"Spot("+this.x+","+this.y+")":"Spot("+this.x+","+this.y+","+this.offsetX+","+this.offsetY+")":this.N(Yb)?"None":this.N(Zb)?"TopLeft":this.N($b)?"Top":this.N(cc)?"TopRight":this.N(dc)?"Left":this.N(ec)?"Center":this.N(fc)?"Right":this.N(gc)?"BottomLeft":this.N(hc)?"Bottom":this.N(ic)?"BottomRight":this.N(pc)?"TopSide":this.N(qc)?"LeftSide":this.N(sc)?"RightSide":this.N(tc)?"BottomSide":this.N(uc)?"TopBottomSides":this.N(vc)? +"LeftRightSides":this.N(wc)?"TopLeftSides":this.N(xc)?"TopRightSides":this.N(Cc)?"BottomLeftSides":this.N(Dc)?"BottomRightSides":this.N(Ec)?"NotTopSide":this.N(Fc)?"NotLeftSide":this.N(Gc)?"NotRightSide":this.N(Hc)?"NotBottomSide":this.N(Ic)?"AllSides":this.N(Pc)?"Default":"None"};Q.prototype.equals=Q.prototype.N=function(a){return a instanceof Q?(this.J===a.x||isNaN(this.J)&&isNaN(a.x))&&(this.K===a.y||isNaN(this.K)&&isNaN(a.y))&&this.xg===a.offsetX&&this.yg===a.offsetY:!1}; +Q.prototype.opposite=function(){return new Q(.5-(this.J-.5),.5-(this.K-.5),-this.xg,-this.yg)};Q.prototype.includesSide=Q.prototype.vp=function(a){if(!this.lj())return!1;if(!a.lj())if(a.N(Qc))a=qc;else if(a.N(Rc))a=sc;else if(a.N(Sc))a=pc;else if(a.N(Tc))a=tc;else return!1;a=a.offsetY;return(this.yg&a)===a};z.defineProperty(Q,{x:"x"},function(){return this.J},function(a){this.Pa(a);u&&Kb(a,"x");this.J=a}); +z.defineProperty(Q,{y:"y"},function(){return this.K},function(a){this.Pa(a);u&&Kb(a,"y");this.K=a});z.defineProperty(Q,{offsetX:"offsetX"},function(){return this.xg},function(a){this.Pa(a);u&&Pb(a,"offsetX");this.xg=a});z.defineProperty(Q,{offsetY:"offsetY"},function(){return this.yg},function(a){this.Pa(a);u&&Pb(a,"offsetY");this.yg=a});Q.prototype.isSpot=Q.prototype.cd=function(){return!isNaN(this.x)&&!isNaN(this.y)};Q.prototype.isNoSpot=Q.prototype.Be=function(){return isNaN(this.x)||isNaN(this.y)}; +Q.prototype.isSide=Q.prototype.lj=function(){return this.Be()&&1===this.offsetX&&0!==this.offsetY};Q.prototype.isDefault=Q.prototype.bd=function(){return isNaN(this.x)&&isNaN(this.y)&&-1===this.offsetX&&0===this.offsetY};var Yb;Q.None=Yb=Tb(new Q(0,0,0,0),0).La();var Pc;Q.Default=Pc=Tb(new Q(0,0,-1,0),-1).La();var Zb;Q.TopLeft=Zb=(new Q(0,0,0,0)).La();var $b;Q.TopCenter=$b=(new Q(.5,0,0,0)).La();var cc;Q.TopRight=cc=(new Q(1,0,0,0)).La();var dc;Q.LeftCenter=dc=(new Q(0,.5,0,0)).La();var ec; +Q.Center=ec=(new Q(.5,.5,0,0)).La();var fc;Q.RightCenter=fc=(new Q(1,.5,0,0)).La();var gc;Q.BottomLeft=gc=(new Q(0,1,0,0)).La();var hc;Q.BottomCenter=hc=(new Q(.5,1,0,0)).La();var ic;Q.BottomRight=ic=(new Q(1,1,0,0)).La();var Zc;Q.MiddleTop=Zc=$b;var $c;Q.MiddleLeft=$c=dc;var ad;Q.MiddleRight=ad=fc;var bd;Q.MiddleBottom=bd=hc;var Sc;Q.Top=Sc=$b;var Qc;Q.Left=Qc=dc;var Rc;Q.Right=Rc=fc;var Tc;Q.Bottom=Tc=hc;var pc;Q.TopSide=pc=Tb(new Q(0,0,1,z.pd),1).La();var qc; +Q.LeftSide=qc=Tb(new Q(0,0,1,z.Tc),1).La();var sc;Q.RightSide=sc=Tb(new Q(0,0,1,z.fd),1).La();var tc;Q.BottomSide=tc=Tb(new Q(0,0,1,z.ed),1).La();var uc;Q.TopBottomSides=uc=Tb(new Q(0,0,1,z.pd|z.ed),1).La();var vc;Q.LeftRightSides=vc=Tb(new Q(0,0,1,z.Tc|z.fd),1).La();var wc;Q.TopLeftSides=wc=Tb(new Q(0,0,1,z.pd|z.Tc),1).La();var xc;Q.TopRightSides=xc=Tb(new Q(0,0,1,z.pd|z.fd),1).La();var Cc;Q.BottomLeftSides=Cc=Tb(new Q(0,0,1,z.ed|z.Tc),1).La();var Dc; +Q.BottomRightSides=Dc=Tb(new Q(0,0,1,z.ed|z.fd),1).La();var Ec;Q.NotTopSide=Ec=Tb(new Q(0,0,1,z.Tc|z.fd|z.ed),1).La();var Fc;Q.NotLeftSide=Fc=Tb(new Q(0,0,1,z.pd|z.fd|z.ed),1).La();var Gc;Q.NotRightSide=Gc=Tb(new Q(0,0,1,z.pd|z.Tc|z.ed),1).La();var Hc;Q.NotBottomSide=Hc=Tb(new Q(0,0,1,z.pd|z.Tc|z.fd),1).La();var Ic;Q.AllSides=Ic=Tb(new Q(0,0,1,z.pd|z.Tc|z.fd|z.ed),1).La();function cd(){this.pf=[1,0,0,1,0,0]} +cd.prototype.copy=function(){var a=new cd;a.pf[0]=this.pf[0];a.pf[1]=this.pf[1];a.pf[2]=this.pf[2];a.pf[3]=this.pf[3];a.pf[4]=this.pf[4];a.pf[5]=this.pf[5];return a};function dd(a){this.type=a;this.r2=this.y2=this.x2=this.r1=this.y1=this.x1=0;this.RD=[];this.pattern=null}dd.prototype.addColorStop=function(a,b){this.RD.push({offset:a,color:b})}; +function ed(a,b,c){this.fillStyle="#000000";this.font="10px sans-serif";this.globalAlpha=1;this.lineCap="butt";this.mn=0;this.lineJoin="miter";this.lineWidth=1;this.miterLimit=10;this.shadowBlur=0;this.shadowColor="rgba(0, 0, 0, 0)";this.shadowOffsetY=this.shadowOffsetX=0;this.strokeStyle="#000000";this.textAlign="start";this.Nw=!1;this.Ag=this.Is=this.Hs=0;this.document=b||document;this.mE=c;this.ox=null;this.path=[];this.fj=new cd;this.stack=[];this.Cf=[];this.Uw=a;this.MI="http://www.w3.org/2000/svg"; +this.width=this.Uw.width;this.height=this.Uw.height;this.Vl=pd(this,"svg",{width:this.width+"px",height:this.height+"px",EL:"0 0 "+this.Uw.width+" "+this.Uw.height});this.Vl.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns","http://www.w3.org/2000/svg");this.Vl.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink");qd(this,1,0,0,1,0,0);a=z.am++;b=pd(this,"clipPath",{id:"mainClip"+a});b.appendChild(pd(this,"rect",{x:0,y:0,width:this.width,height:this.height})); +this.Vl.appendChild(b);this.Cf[0].setAttributeNS(null,"clip-path","url(#mainClip"+a+")")}f=ed.prototype;f.arc=function(a,b,c,d,e,g){rd(this,a,b,c,d,e,g)};f.beginPath=function(){this.path=[]};f.bezierCurveTo=function(a,b,c,d,e,g){this.path.push(["C",a,b,c,d,e,g])};f.clearRect=function(){};f.clip=function(){sd(this,"clipPath",this.path,new cd)};f.closePath=function(){this.path.push(["z"])};f.createLinearGradient=function(a,b,c,d){var e=new dd("linear");e.x1=a;e.y1=b;e.x2=c;e.y2=d;return e}; +f.createPattern=function(a){var b=new dd("pattern");b.pattern=a;return b};f.createRadialGradient=function(a,b,c,d,e,g){var h=new dd("radial");h.x1=a;h.y1=b;h.r1=c;h.x2=d;h.y2=e;h.r2=g;return h}; +f.drawImage=function(a,b,c,d,e,g,h,k,l){var m="";a instanceof HTMLCanvasElement&&(m=a.toDataURL());a instanceof HTMLImageElement&&(m=a.src);m={x:0,y:0,width:a.naturalWidth,height:a.naturalHeight,href:m};m.preserveAspectRatio=td(d,k)&&td(e,l)?"xMidYMid slice":"none";var n="";k/=d;l/=e;if(0!==g||0!==h)n+=" translate("+g+", "+h+")";if(1!==k||1!==l)n+=" scale("+k+", "+l+")";if(0!==b||0!==c)n+=" translate("+-b+", "+-c+")";if(0!==b||0!==c||d!==a.naturalWidth||e!==a.naturalHeight)a="CLIP"+z.am++,g=pd(this, +"clipPath",{id:a}),g.appendChild(pd(this,"rect",{x:b,y:c,width:d,height:e})),this.Vl.appendChild(g),m["clip-path"]="url(#"+a+")";ud(this,"image",m,this.fj,n);this.addElement("image",m)};f.fill=function(){sd(this,"fill",this.path,this.fj)};f.Hg=function(){this.Nw?this.clip():this.fill()};f.fillRect=function(a,b,c,d){vd(this,"fill",[a,b,c,d],this.fj)}; +f.fillText=function(a,b,c){a=[a,b,c];b=this.textAlign;"left"===b?b="start":"right"===b?b="end":"center"===b&&(b="middle");b={x:a[1],y:a[2],style:"font: "+this.font,"text-anchor":b};ud(this,"fill",b,this.fj);this.addElement("text",b,a[0])};f.lineTo=function(a,b){this.path.push(["L",a,b])};f.moveTo=function(a,b){this.path.push(["M",a,b])};f.quadraticCurveTo=function(a,b,c,d){this.path.push(["Q",a,b,c,d])};f.rect=function(a,b,c,d){this.path.push(["M",a,b],["L",a+c,b],["L",a+c,b+d],["L",a,b+d],["z"])}; +f.restore=function(){this.fj=this.stack.pop();this.path=this.stack.pop();var a=this.stack.pop();this.fillStyle=a.fillStyle;this.font=a.font;this.globalAlpha=a.globalAlpha;this.lineCap=a.lineCap;this.mn=a.mn;this.lineJoin=a.lineJoin;this.lineWidth=a.lineWidth;this.miterLimit=a.miterLimit;this.shadowBlur=a.shadowBlur;this.shadowColor=a.shadowColor;this.shadowOffsetX=a.shadowOffsetX;this.shadowOffsetY=a.shadowOffsetY;this.strokeStyle=a.strokeStyle;this.textAlign=a.textAlign}; +f.save=function(){this.stack.push({fillStyle:this.fillStyle,font:this.font,globalAlpha:this.globalAlpha,lineCap:this.lineCap,mn:this.mn,lineJoin:this.lineJoin,lineWidth:this.lineWidth,miterLimit:this.miterLimit,shadowBlur:this.shadowBlur,shadowColor:this.shadowColor,shadowOffsetX:this.shadowOffsetX,shadowOffsetY:this.shadowOffsetY,strokeStyle:this.strokeStyle,textAlign:this.textAlign});for(var a=[],b=0;b<this.path.length;b++)a.push(this.path[b]);this.stack.push(a);this.stack.push(this.fj.copy())}; +f.setTransform=function(a,b,c,d,e,g){1===a&&0===b&&0===c&&1===d&&0===e&&0===g||qd(this,a,b,c,d,e,g)};f.scale=function(){};f.stroke=function(){sd(this,"stroke",this.path,this.fj)};f.uj=function(){this.Kn||this.stroke()};f.strokeRect=function(a,b,c,d){vd(this,"stroke",[a,b,c,d],this.fj)};function pd(a,b,c,d){a=a.document.createElementNS(a.MI,b);if(z.Za(c))for(var e in c)a.setAttributeNS("href"===e?"http://www.w3.org/1999/xlink":"",e,c[e]);void 0!==d&&(a.textContent=d);return a} +f.addElement=function(a,b,c){a=pd(this,a,b,c);0<this.Cf.length?this.Cf[this.Cf.length-1].appendChild(a):this.Vl.appendChild(a);return this.ox=a}; +function ud(a,b,c,d,e){1!==a.globalAlpha&&(c.opacity=a.globalAlpha);"fill"===b?(/^rgba\(/.test(a.fillStyle)?(a=/^\s*rgba\s*\(([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\)\s*$/i.exec(a.fillStyle),c.fill="rgb("+a[1]+","+a[2]+","+a[3]+")",c["fill-opacity"]=a[4]):c.fill=a.fillStyle instanceof dd?wd(a,a.fillStyle):a.fillStyle,c.stroke="none"):"stroke"===b&&(c.fill="none",/^rgba\(/.test(a.strokeStyle)?(b=/^\s*rgba\s*\(([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\)\s*$/i.exec(a.strokeStyle), +c.stroke="rgb("+b[1]+","+b[2]+","+b[3]+")",c["stroke-opacity"]=b[4]):c.stroke=a.strokeStyle instanceof dd?wd(a,a.strokeStyle):a.strokeStyle,c["stroke-width"]=a.lineWidth,c["stroke-linecap"]=a.lineCap,c["stroke-linejoin"]=a.lineJoin,c["stroke-miterlimit"]=a.miterLimit);d=d.pf;d="matrix("+d[0]+", "+d[1]+", "+d[2]+", "+d[3]+", "+d[4]+", "+d[5]+")";void 0!==e&&(d+=e);c.transform=d} +function wd(a,b){var c="GRAD"+z.am++,d;if("linear"===b.type)d={x1:b.x1,x2:b.x2,y1:b.y1,y2:b.y2,id:c,gradientUnits:"userSpaceOnUse"},d=pd(a,"linearGradient",d);else if("radial"===b.type)d={x1:b.x1,x2:b.x2,y1:b.y1,y2:b.y2,r1:b.r1,r2:b.r2,id:c},d=pd(a,"radialGradient",d);else if("pattern"===b.type){var e=b.pattern;d={width:e.width,height:e.height,id:c,patternUnits:"userSpaceOnUse"};var g="";e instanceof HTMLCanvasElement&&(g=e.toDataURL());e instanceof HTMLImageElement&&(g=e.src);e={x:0,y:0,width:e.width, +height:e.height,href:g};d=pd(a,"pattern",d);d.appendChild(pd(a,"image",e))}else throw Error("invalid gradient");for(var e=b.RD,g=e.length,h=[],k=0;k<g;k++){var l=e[k],m=l.color,l={offset:l.offset,"stop-color":m};/^rgba\(/.test(m)&&(m=/^\s*rgba\s*\(([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\)\s*$/i.exec(m),l["stop-color"]="rgb("+m[1]+","+m[2]+","+m[3]+")",l["stop-opacity"]=m[4]);h.push(l)}h.sort(function(a,b){return a.offset>b.offset?1:-1});for(k=0;k<g;k++)d.appendChild(pd(a,"stop", +h[k]));a.Vl.appendChild(d);return"url(#"+c+")"}function vd(a,b,c,d){c={x:c[0],y:c[1],width:c[2],height:c[3]};ud(a,b,c,d);a.addElement("rect",c)} +function sd(a,b,c,d){for(var e=[],g=0;g<c.length;g++){var h=z.Al(c[g]),k=[h.shift()];if("A"===k[0])k.push(h.shift()+","+h.shift(),h.shift(),h.shift()+","+h.shift(),h.shift()+","+h.shift());else for(;h.length;)k.push(h.shift()+","+h.shift());e.push(k.join(" "))}c={d:e.join(" ")};ud(a,b,c,d);"clipPath"===b?(b="CLIP"+z.am++,d=pd(a,"clipPath",{id:b}),d.appendChild(pd(a,"path",c)),a.Vl.appendChild(d),0<a.Cf.length&&a.Cf[a.Cf.length-1].setAttributeNS(null,"clip-path","url(#"+b+")")):a.addElement("path", +c)}function rd(a,b,c,d,e,g,h){var k=Math.abs(e-g);if(e!==g){var l=b+d*Math.cos(g);g=c+d*Math.sin(g);k>=2*Math.PI?(rd(a,b,c,d,e,e+Math.PI,h),rd(a,b,c,d,e+Math.PI,e+2*Math.PI,h),a.path.push(["M",l,g])):(b+=d*Math.cos(e),c+=d*Math.sin(e),k=180*k/Math.PI,e=h?0:1,h=180<=k===!!h?0:1,0!==a.path.length?a.path.push(["L",b,c]):a.path.push(["M",b,c]),a.path.push(["A",d,d,k,h,e,l,g]))}}function qd(a,b,c,d,e,g,h){var k=new cd;k.pf=[b,c,d,e,g,h];b={};ud(a,"g",b,k);k=a.addElement("g",b);a.Cf.push(k)} +f.fb=function(){if(0!==this.shadowOffsetX||0!==this.shadowOffsetY||0!==this.shadowBlur){var a="SHADOW"+z.am++,b=this.addElement("filter",{id:a,x:"-100%",y:"-100%",width:"300%",height:"300%"},null),c,d,e,g,h;c=pd(this,"feGaussianBlur",{"in":"SourceAlpha",result:"blur",vL:this.shadowBlur/2});d=pd(this,"feFlood",{"in":"blur",result:"flood","flood-color":this.shadowColor});e=pd(this,"feComposite",{"in":"flood",in2:"blur",operator:"in",result:"comp"});g=pd(this,"feOffset",{"in":"comp",result:"offsetBlur", +dx:this.shadowOffsetX,dy:this.shadowOffsetY});h=pd(this,"feMerge",{});h.appendChild(pd(this,"feMergeNode",{"in":"offsetBlur"}));h.appendChild(pd(this,"feMergeNode",{"in":"SourceGraphic"}));b.appendChild(c);b.appendChild(d);b.appendChild(e);b.appendChild(g);b.appendChild(h);0<this.Cf.length&&this.Cf[this.Cf.length-1].setAttributeNS(null,"filter","url(#"+a+")")}};f.SA=function(a,b,c){this.Hs=a;this.Is=b;this.Ag=c};f.vn=function(){this.shadowBlur=this.shadowOffsetY=this.shadowOffsetX=0}; +f.wn=function(){this.shadowOffsetX=this.Hs;this.shadowOffsetY=this.Is;this.shadowBlur=this.Ag};f.Tz=function(){return!1};f.Pz=function(){};function la(a,b){this.ownerDocument=void 0===b?document:b;var c=this.ownerDocument.createElement("canvas");c.tabIndex=0;this.Kd=c;this.zl=new xd(c);c.Z=a;Object.seal(this)}f=la.prototype;f.toDataURL=function(a,b){return this.Kd.toDataURL(a,b)};f.getBoundingClientRect=function(){return this.Kd.getBoundingClientRect()};f.focus=function(){return this.Kd.focus()}; +f.addEventListener=function(a,b,c){this.Kd.addEventListener(a,b,c)};f.removeEventListener=function(a,b,c){this.Kd.removeEventListener(a,b,c)};z.defineProperty(la,{width:"width"},function(){return this.Kd.width},function(a){this.Kd.width=a});z.defineProperty(la,{height:"height"},function(){return this.Kd.height},function(a){this.Kd.height=a});z.defineProperty(la,{style:"style"},function(){return this.Kd.style},function(a){this.Kd.style=a}); +function xd(a){a.getContext&&a.getContext("2d")||z.k("Browser does not support HTML Canvas Element");this.Ca=a.getContext("2d");this.my=this.oy=this.ny="";this.Kn=!1;this.Ag=this.Is=this.Hs=0;Object.seal(this)}z.defineProperty(xd,{fillStyle:"fillStyle"},function(){return this.Ca.fillStyle},function(a){this.my!==a&&(this.my=this.Ca.fillStyle=a)});z.defineProperty(xd,{font:"font"},function(){return this.Ca.font},function(a){this.ny!==a&&(this.ny=this.Ca.font=a)}); +z.defineProperty(xd,{globalAlpha:"globalAlpha"},function(){return this.Ca.globalAlpha},function(a){this.Ca.globalAlpha=a});z.defineProperty(xd,{lineCap:"lineCap"},function(){return this.Ca.lineCap},function(a){this.Ca.lineCap=a});z.defineProperty(xd,{mn:"lineDashOffset"},function(){return this.Ca.mn},function(a){this.Ca.mn=a});z.defineProperty(xd,{lineJoin:"lineJoin"},function(){return this.Ca.lineJoin},function(a){this.Ca.lineJoin=a}); +z.defineProperty(xd,{lineWidth:"lineWidth"},function(){return this.Ca.lineWidth},function(a){this.Ca.lineWidth=a});z.defineProperty(xd,{miterLimit:"miterLimit"},function(){return this.Ca.miterLimit},function(a){this.Ca.miterLimit=a});z.defineProperty(xd,{shadowBlur:"shadowBlur"},function(){return this.Ca.shadowBlur},function(a){this.Ca.shadowBlur=a});z.defineProperty(xd,{shadowColor:"shadowColor"},function(){return this.Ca.shadowColor},function(a){this.Ca.shadowColor=a}); +z.defineProperty(xd,{shadowOffsetX:"shadowOffsetX"},function(){return this.Ca.shadowOffsetX},function(a){this.Ca.shadowOffsetX=a});z.defineProperty(xd,{shadowOffsetY:"shadowOffsetY"},function(){return this.Ca.shadowOffsetY},function(a){this.Ca.shadowOffsetY=a});z.defineProperty(xd,{strokeStyle:"strokeStyle"},function(){return this.Ca.strokeStyle},function(a){this.oy!==a&&(this.oy=this.Ca.strokeStyle=a)}); +z.defineProperty(xd,{textAlign:"textAlign"},function(){return this.Ca.textAlign},function(a){this.Ca.textAlign=a});z.defineProperty(xd,{Jt:"imageSmoothingEnabled"},function(){return this.Ca.Jt},function(a){this.Ca.Jt=a});f=xd.prototype;f.arc=function(a,b,c,d,e,g){this.Ca.arc(a,b,c,d,e,g)};f.beginPath=function(){this.Ca.beginPath()};f.bezierCurveTo=function(a,b,c,d,e,g){this.Ca.bezierCurveTo(a,b,c,d,e,g)};f.clearRect=function(a,b,c,d){this.Ca.clearRect(a,b,c,d)};f.clip=function(){this.Ca.clip()}; +f.closePath=function(){this.Ca.closePath()};f.createLinearGradient=function(a,b,c,d){return this.Ca.createLinearGradient(a,b,c,d)};f.createPattern=function(a,b){return this.Ca.createPattern(a,b)};f.createRadialGradient=function(a,b,c,d,e,g){return this.Ca.createRadialGradient(a,b,c,d,e,g)};f.drawImage=function(a,b,c,d,e,g,h,k,l){void 0===d?this.Ca.drawImage(a,b,c):this.Ca.drawImage(a,b,c,d,e,g,h,k,l)};f.fill=function(){this.Ca.fill()};f.fillRect=function(a,b,c,d){this.Ca.fillRect(a,b,c,d)}; +f.fillText=function(a,b,c){this.Ca.fillText(a,b,c)};f.getImageData=function(a,b,c,d){return this.Ca.getImageData(a,b,c,d)};f.lineTo=function(a,b){this.Ca.lineTo(a,b)};f.measureText=function(a){return this.Ca.measureText(a)};f.moveTo=function(a,b){this.Ca.moveTo(a,b)};f.quadraticCurveTo=function(a,b,c,d){this.Ca.quadraticCurveTo(a,b,c,d)};f.rect=function(a,b,c,d){this.Ca.rect(a,b,c,d)};f.restore=function(){this.Ca.restore()};xd.prototype.rotate=function(a){this.Ca.rotate(a)};f=xd.prototype; +f.save=function(){this.Ca.save()};f.setTransform=function(a,b,c,d,e,g){this.Ca.setTransform(a,b,c,d,e,g)};f.scale=function(a,b){this.Ca.scale(a,b)};f.stroke=function(){this.Ca.stroke()};f.transform=function(a,b,c,d,e,g){1===a&&0===b&&0===c&&1===d&&0===e&&0===g||this.Ca.transform(a,b,c,d,e,g)};f.translate=function(a,b){this.Ca.translate(a,b)}; +f.Hg=function(a){if(a instanceof Da&&a.type===yd){var b=a.Nn;a=a.uy;a>b?(this.scale(b/a,1),this.translate((a-b)/2,0)):b>a&&(this.scale(1,a/b),this.translate(0,(b-a)/2));this.Kn?this.clip():this.fill();a>b?(this.translate(-(a-b)/2,0),this.scale(1/(b/a),1)):b>a&&(this.translate(0,-(b-a)/2),this.scale(1,1/(a/b)))}else this.Kn?this.clip():this.fill()};f.uj=function(){this.Kn||this.stroke()};z.defineProperty(xd,{Nw:"clipInsteadOfFill"},function(){return this.Kn},function(a){this.Kn=a});f=xd.prototype; +f.SA=function(a,b,c){this.Hs=a;this.Is=b;this.Ag=c};f.vn=function(){this.shadowBlur=this.shadowOffsetY=this.shadowOffsetX=0};f.wn=function(){this.shadowOffsetX=this.Hs;this.shadowOffsetY=this.Is;this.shadowBlur=this.Ag};f.Tz=function(a,b){var c=this.Ca;if(void 0!==c.setLineDash)c.setLineDash(a),c.lineDashOffset=b;else if(void 0!==c.webkitLineDash)c.webkitLineDash=a,c.webkitLineDashOffset=b;else if(void 0!==c.mozDash)c.mozDash=a,c.mozDashOffset=b;else return!1;return!0}; +f.Pz=function(){var a=this.Ca;void 0!==a.setLineDash?(a.setLineDash(z.yj),a.lineDashOffset=0):void 0!==a.webkitLineDash?(a.webkitLineDash=z.yj,a.webkitLineDashOffset=0):void 0!==a.mozDash&&(a.mozDash=null,a.mozDashOffset=0)};function ca(a,b){b&&(a.ny="");a.oy="";a.my=""} +var Hd=(Math.sqrt(2)-1)/3*4,Id=(new N(0,0)).La(),Jd=(new w(0,0,0,0)).La(),Kd=(new Db(0,0,0,0)).La(),Ld=(new Db(2,2,2,2)).La(),Md=(new N(6,6)).La(),Nd=(new N(-Infinity,-Infinity)).La(),Od=(new N(Infinity,Infinity)).La(),Pd=(new Ea(0,0)).La(),Qd=(new Ea(1,1)).La(),ae=(new Ea(6,6)).La(),be=(new Ea(8,8)).La(),ce=(new Ea(10,10)).La(),de=(new Ea(Infinity,Infinity)).La(),ee=(new N(NaN,NaN)).La(),fe=(new Ea(NaN,NaN)).La(),ge=(new w(NaN,NaN,NaN,NaN)).La(),he=(new Q(.156,.156)).La(),ie=(new Q(.844,.844)).La(), +je=new ma,ke=new ma,le=null;function se(a){if(0>=a)return 0;var b=le;if(null===b){for(var b=[],c=0;2E3>=c;c++)b[c]=Math.sqrt(c);le=b}return 1>a?(c=1/a,2E3>=c?1/b[c|0]:Math.sqrt(a)):2E3>=a?b[a|0]:Math.sqrt(a)}function eb(a,b){var c=a-b;return.5>c&&-.5<c}function td(a,b){var c=a-b;return 5E-8>c&&-5E-8<c} +function te(a,b,c,d,e,g,h){0>=e&&(e=1E-6);var k=0,l=0,m=0,n=0;a<c?(l=a,k=c):(l=c,k=a);b<d?(n=b,m=d):(n=d,m=b);if(a===c)return n<=h&&h<=m&&a-e<=g&&g<=a+e;if(b===d)return l<=g&&g<=k&&b-e<=h&&h<=b+e;k+=e;l-=e;if(l<=g&&g<=k&&(m+=e,n-=e,n<=h&&h<=m))if(k-l>m-n)if(a-c>e||c-a>e){if(g=(d-b)/(c-a)*(g-a)+b,g-e<=h&&h<=g+e)return!0}else return!0;else if(b-d>e||d-b>e){if(h=(c-a)/(d-b)*(h-b)+a,h-e<=g&&g<=h+e)return!0}else return!0;return!1} +function ue(a,b,c,d,e,g,h,k,l,m,n,p){if(te(a,b,h,k,p,c,d)&&te(a,b,h,k,p,e,g))return te(a,b,h,k,p,m,n);var q=(a+c)/2,r=(b+d)/2,s=(c+e)/2,t=(d+g)/2;e=(e+h)/2;g=(g+k)/2;d=(q+s)/2;c=(r+t)/2;var s=(s+e)/2,t=(t+g)/2,v=(d+s)/2,x=(c+t)/2;return ue(a,b,q,r,d,c,v,x,l,m,n,p)||ue(v,x,s,t,e,g,h,k,l,m,n,p)} +function ve(a,b,c,d,e,g,h,k,l,m){if(te(a,b,h,k,l,c,d)&&te(a,b,h,k,l,e,g))Hb(m,a,b,0,0),Hb(m,h,k,0,0);else{var n=(a+c)/2,p=(b+d)/2,q=(c+e)/2,r=(d+g)/2;e=(e+h)/2;g=(g+k)/2;d=(n+q)/2;c=(p+r)/2;var q=(q+e)/2,r=(r+g)/2,s=(d+q)/2,t=(c+r)/2;ve(a,b,n,p,d,c,s,t,l,m);ve(s,t,q,r,e,g,h,k,l,m)}} +function we(a,b,c,d,e,g,h,k,l,m){if(te(a,b,h,k,l,c,d)&&te(a,b,h,k,l,e,g))0===m.length&&(m.push(a),m.push(b)),m.push(h),m.push(k);else{var n=(a+c)/2,p=(b+d)/2,q=(c+e)/2,r=(d+g)/2;e=(e+h)/2;g=(g+k)/2;d=(n+q)/2;c=(p+r)/2;var q=(q+e)/2,r=(r+g)/2,s=(d+q)/2,t=(c+r)/2;we(a,b,n,p,d,c,s,t,l,m);we(s,t,q,r,e,g,h,k,l,m)}} +function xe(a,b,c,d,e,g,h,k,l,m,n,p,q,r){var s=1-l;a=a*s+c*l;b=b*s+d*l;c=c*s+e*l;d=d*s+g*l;e=e*s+h*l;g=g*s+k*l;k=a*s+c*l;h=b*s+d*l;c=c*s+e*l;d=d*s+g*l;m.x=a;m.y=b;n.x=k;n.y=h;p.x=k*s+c*l;p.y=h*s+d*l;q.x=c;q.y=d;r.x=e;r.y=g}function ye(a,b,c,d,e,g,h,k,l,m){if(te(a,b,e,g,m,c,d))return te(a,b,e,g,m,k,l);var n=(a+c)/2,p=(b+d)/2;c=(c+e)/2;d=(d+g)/2;var q=(n+c)/2,r=(p+d)/2;return ye(a,b,n,p,q,r,h,k,l,m)||ye(q,r,c,d,e,g,h,k,l,m)} +function ze(a,b,c,d,e,g,h,k){if(te(a,b,e,g,h,c,d))Hb(k,a,b,0,0),Hb(k,e,g,0,0);else{var l=(a+c)/2,m=(b+d)/2;c=(c+e)/2;d=(d+g)/2;var n=(l+c)/2,p=(m+d)/2;ze(a,b,l,m,n,p,h,k);ze(n,p,c,d,e,g,h,k)}}function Je(a,b,c,d,e,g,h,k){if(te(a,b,e,g,h,c,d))0===k.length&&(k.push(a),k.push(b)),k.push(e),k.push(g);else{var l=(a+c)/2,m=(b+d)/2;c=(c+e)/2;d=(d+g)/2;var n=(l+c)/2,p=(m+d)/2;Je(a,b,l,m,n,p,h,k);Je(n,p,c,d,e,g,h,k)}} +function Ke(a,b,c,d,e,g,h,k,l,m,n,p,q,r){0>=q&&(q=1E-6);if(te(a,b,h,k,q,c,d)&&te(a,b,h,k,q,e,g)){var s=(a-h)*(m-p)-(b-k)*(l-n);if(0===s)return!1;q=((a*k-b*h)*(l-n)-(a-h)*(l*p-m*n))/s;s=((a*k-b*h)*(m-p)-(b-k)*(l*p-m*n))/s;if((l>n?l-n:n-l)<(m>p?m-p:p-m)){if(h=l=0,b<k?(l=b,h=k):(l=k,h=b),s<l||s>h)return!1}else if(a<h?l=a:(l=h,h=a),q<l||q>h)return!1;r.x=q;r.y=s;return!0}var s=(a+c)/2,t=(b+d)/2;c=(c+e)/2;d=(d+g)/2;e=(e+h)/2;g=(g+k)/2;var v=(s+c)/2,x=(t+d)/2;c=(c+e)/2;d=(d+g)/2;var y=(v+c)/2,A=(x+d)/2, +C=(n-l)*(n-l)+(p-m)*(p-m),L=!1;Ke(a,b,s,t,v,x,y,A,l,m,n,p,q,r)&&(b=(r.x-l)*(r.x-l)+(r.y-m)*(r.y-m),b<C&&(C=b,L=!0));a=r.x;s=r.y;Ke(y,A,c,d,e,g,h,k,l,m,n,p,q,r)&&(b=(r.x-l)*(r.x-l)+(r.y-m)*(r.y-m),b<C?L=!0:(r.x=a,r.y=s));return L} +function Le(a,b,c,d,e,g,h,k,l,m,n,p,q){var r=0;0>=q&&(q=1E-6);if(te(a,b,h,k,q,c,d)&&te(a,b,h,k,q,e,g)){q=(a-h)*(m-p)-(b-k)*(l-n);if(0===q)return r;var s=((a*k-b*h)*(l-n)-(a-h)*(l*p-m*n))/q,t=((a*k-b*h)*(m-p)-(b-k)*(l*p-m*n))/q;if(s>=n)return r;if((l>n?l-n:n-l)<(m>p?m-p:p-m)){if(a=l=0,b<k?(l=b,a=k):(l=k,a=b),t<l||t>a)return r}else if(a<h?(l=a,a=h):l=h,s<l||s>a)return r;0<q?r++:0>q&&r--}else{var s=(a+c)/2,t=(b+d)/2,v=(c+e)/2,x=(d+g)/2;e=(e+h)/2;g=(g+k)/2;d=(s+v)/2;c=(t+x)/2;var v=(v+e)/2,x=(x+g)/2, +y=(d+v)/2,A=(c+x)/2,r=r+Le(a,b,s,t,d,c,y,A,l,m,n,p,q),r=r+Le(y,A,v,x,e,g,h,k,l,m,n,p,q)}return r} +function ib(a,b,c,d,e,g,h){if(td(a,c)){var k=0;c=0;b<d?(k=b,c=d):(k=d,c=b);d=g;if(d<k)return h.x=a,h.y=k,!1;if(d>c)return h.x=a,h.y=c,!1;h.x=a;h.y=d;return!0}if(td(b,d)){a<c?k=a:(k=c,c=a);d=e;if(d<k)return h.x=k,h.y=b,!1;if(d>c)return h.x=c,h.y=b,!1;h.x=d;h.y=b;return!0}k=((a-e)*(a-c)+(b-g)*(b-d))/((c-a)*(c-a)+(d-b)*(d-b));if(-5E-6>k)return h.x=a,h.y=b,!1;if(1.000005<k)return h.x=c,h.y=d,!1;h.x=a+k*(c-a);h.y=b+k*(d-b);return!0} +function Me(a,b,c,d,e,g,h,k,l){if(eb(a,c)&&eb(b,d))return l.x=a,l.y=b,!1;if(td(e,h)){if(td(a,c))return ib(a,b,c,d,e,g,l),!1;g=(d-b)/(c-a)*(e-a)+b;return ib(a,b,c,d,e,g,l)}k=(k-g)/(h-e);if(td(a,c)){g=k*(a-e)+g;c=h=0;b<d?(h=b,c=d):(h=d,c=b);if(g<h)return l.x=a,l.y=h,!1;if(g>c)return l.x=a,l.y=c,!1;l.x=a;l.y=g;return!0}h=(d-b)/(c-a);if(td(k,h))return ib(a,b,c,d,e,g,l),!1;e=(h*a-k*e+g-b)/(h-k);if(td(h,0)){a<c?h=a:(h=c,c=a);if(e<h)return l.x=h,l.y=b,!1;if(e>c)return l.x=c,l.y=b,!1;l.x=e;l.y=b;return!0}g= +h*(e-a)+b;return ib(a,b,c,d,e,g,l)}function Ne(a,b,c,d,e,g,h,k,l){var m=1E21,n=a,p=b;if(Me(a,b,a,d,e,g,h,k,l)){var q=(l.x-e)*(l.x-e)+(l.y-g)*(l.y-g);q<m&&(m=q,n=l.x,p=l.y)}Me(c,b,c,d,e,g,h,k,l)&&(q=(l.x-e)*(l.x-e)+(l.y-g)*(l.y-g),q<m&&(m=q,n=l.x,p=l.y));Me(a,b,c,b,e,g,h,k,l)&&(q=(l.x-e)*(l.x-e)+(l.y-g)*(l.y-g),q<m&&(m=q,n=l.x,p=l.y));Me(a,d,c,d,e,g,h,k,l)&&(q=(l.x-e)*(l.x-e)+(l.y-g)*(l.y-g),q<m&&(m=q,n=l.x,p=l.y));l.x=n;l.y=p;return 1E21>m} +function Oe(a,b,c,d,e,g,h,k,l){c=a-c;var m=e-h,n=h=0;0===c||0===m?0===c?(k=(g-k)/m,h=a,n=k*h+(g-k*e)):(d=(b-d)/c,h=e,n=d*h+(b-d*a)):(d=(b-d)/c,k=(g-k)/m,a=b-d*a,h=(g-k*e-a)/(d-k),n=d*h+a);l.n(h,n);return l} +function Pe(a,b,c){var d=b.x,e=b.y,g=c.x,h=c.y,k=a.left,l=a.right,m=a.top,n=a.bottom;return d===g?(g=a=0,e<h?(a=e,g=h):(a=h,g=e),k<=d&&d<=l&&a<=n&&g>=m):e===h?(d<g?a=d:(a=g,g=d),m<=e&&e<=n&&a<=l&&g>=k):a.Ma(b)||a.Ma(c)||bf(k,m,l,m,d,e,g,h)||bf(l,m,l,n,d,e,g,h)||bf(l,n,k,n,d,e,g,h)||bf(k,n,k,m,d,e,g,h)?!0:!1}function bf(a,b,c,d,e,g,h,k){return 0>=cf(a,b,c,d,e,g)*cf(a,b,c,d,h,k)&&0>=cf(e,g,h,k,a,b)*cf(e,g,h,k,c,d)} +function cf(a,b,c,d,e,g){c-=a;d-=b;a=e-a;b=g-b;g=a*d-b*c;0===g&&(g=a*c+b*d,0<g&&(g=(a-c)*c+(b-d)*d,0>g&&(g=0)));return 0>g?-1:0<g?1:0}function df(a){0>a&&(a+=360);360<=a&&(a-=360);return a} +function ef(a,b,c,d){var e=Math.PI;d||(b*=e/180,c*=e/180);d=b<c?1:-1;var g=[],h=e/2,k=b;for(b=Math.min(2*e,Math.abs(c-b));1E-5<b;){c=k+d*Math.min(b,h);var e=(c-k)/2,l=a*Math.cos(e),m=a*Math.sin(e),n=-m,p=l*l+n*n,q=p+l*l+n*m,p=4/3*(Math.sqrt(2*p*q)-q)/(l*m-n*l),m=l-p*n,l=n+p*l,n=-l,p=e+k,e=Math.cos(p),p=Math.sin(p);g.push([0+a*Math.cos(k),0+a*Math.sin(k),0+m*e-l*p,0+m*p+l*e,0+m*e-n*p,0+m*p+n*e,0+a*Math.cos(c),0+a*Math.sin(c)]);b-=Math.abs(c-k);k=c}return g} +function jb(a,b,c,d,e,g,h){c=Math.floor((a-c)/e)*e+c;d=Math.floor((b-d)/g)*g+d;var k=c;c+e-a<e/2&&(k=c+e);a=d;d+g-b<g/2&&(a=d+g);h.n(k,a)}function ff(a,b){var c=Math.max(a,b),d=Math.min(a,b),e=1,g=1;do e=c%d,c=g=d,d=e;while(0<e);return g} +function gf(a,b,c,d){var e=0>c,g=0>d,h=0,k=h=0;a<b?(h=1,k=0):(h=0,k=1);var l=0,m=0,n=0,p=0,l=0===h?a:b,n=0===h?c:d;if(0===h?e:g)n=-n;h=k;m=0===h?a:b;p=0===h?c:d;if(0===h?e:g)p=-p;a=a=0;if(0<p)if(0<n){b=l*l;a=m*m;l*=n;c=m*p;d=-a+c;e=-a+Math.sqrt(l*l+c*c);m=d;for(g=0;9999999999>g;++g){m=.5*(d+e);if(m===d||m===e)break;k=l/(m+b);h=c/(m+a);k=k*k+h*h-1;if(0<k)d=m;else if(0>k)e=m;else break}n=b*n/(m+b)-n;p=a*p/(m+a)-p;a=Math.sqrt(n*n+p*p)}else a=Math.abs(p-m);else p=l*l-m*m,a=l*n,a<p?(p=a/p,a=m*Math.sqrt(Math.abs(1- +p*p)),n=l*p-n,a=Math.sqrt(n*n+a*a)):a=Math.abs(n-l);return a}function hf(a){1<arguments.length&&z.k("Geometry constructor can take at most one optional argument, the Geometry type.");z.kc(this);this.G=!1;void 0===a?a=jf:u&&z.Ba(a,hf,hf,"constructor:type");this.ba=a;this.Gb=this.zb=this.Cc=this.xc=0;this.Dj=new J(kf);this.mv=this.Dj.H;this.Xu=(new w).freeze();this.hb=!0;this.ci=Zb;this.di=ic;this.oo=this.qo=NaN;this.Ci=lf}z.ia("Geometry",hf);z.ji(hf); +hf.prototype.copy=function(){var a=new hf;a.ba=this.ba;a.xc=this.xc;a.Cc=this.Cc;a.zb=this.zb;a.Gb=this.Gb;for(var b=this.Dj.o,c=b.length,d=a.Dj,e=0;e<c;e++){var g=b[e].copy();d.add(g)}a.mv=this.mv;a.Xu.assign(this.Xu);a.hb=this.hb;a.ci=this.ci.V();a.di=this.di.V();a.qo=this.qo;a.oo=this.oo;a.Ci=this.Ci;return a};var mf;hf.Line=mf=z.s(hf,"Line",0);var nf;hf.Rectangle=nf=z.s(hf,"Rectangle",1);var of;hf.Ellipse=of=z.s(hf,"Ellipse",2);var jf;hf.Path=jf=z.s(hf,"Path",3); +hf.prototype.La=function(){this.freeze();Object.freeze(this);return this};hf.prototype.freeze=function(){this.G=!0;var a=this.cc;a.freeze();for(var a=a.o,b=a.length,c=0;c<b;c++)a[c].freeze();return this};hf.prototype.Wa=function(){Object.isFrozen(this)&&z.k("cannot thaw constant: "+this);this.G=!1;var a=this.cc;a.Wa();for(var a=a.o,b=a.length,c=0;c<b;c++)a[c].Wa();return this}; +hf.prototype.equalsApprox=hf.prototype.Mc=function(a){if(!(a instanceof hf))return!1;if(this.type!==a.type)return this.type===mf&&a.type===jf?pf(this,a):a.type===mf&&this.type===jf?pf(a,this):!1;if(this.type===jf){var b=this.cc.o;a=a.cc.o;var c=b.length;if(c!==a.length)return!1;for(var d=0;d<c;d++)if(!b[d].Mc(a[d]))return!1;return!0}return eb(this.Ha,a.Ha)&&eb(this.Da,a.Da)&&eb(this.L,a.L)&&eb(this.M,a.M)}; +function pf(a,b){if(a.type!==mf||b.type!==jf)return!1;if(1===b.cc.count){var c=b.cc.ea(0);if(1===c.Ab.count&&eb(a.Ha,c.Ha)&&eb(a.Da,c.Da)&&(c=c.Ab.ea(0),c.type===qf&&eb(a.L,c.L)&&eb(a.M,c.M)))return!0}return!1}var rf;hf.stringify=rf=function(a){return a.toString()}; +hf.prototype.toString=function(a){void 0===a&&(a=-1);switch(this.type){case mf:return 0>a?"M"+this.Ha.toString()+" "+this.Da.toString()+"L"+this.L.toString()+" "+this.M.toString():"M"+this.Ha.toFixed(a)+" "+this.Da.toFixed(a)+"L"+this.L.toFixed(a)+" "+this.M.toFixed(a);case nf:var b=new w(this.Ha,this.Da,0,0);b.cG(this.L,this.M,0,0);return 0>a?"M"+b.x.toString()+" "+b.y.toString()+"H"+b.right.toString()+"V"+b.bottom.toString()+"H"+b.left.toString()+"z":"M"+b.x.toFixed(a)+" "+b.y.toFixed(a)+"H"+b.right.toFixed(a)+ +"V"+b.bottom.toFixed(a)+"H"+b.left.toFixed(a)+"z";case of:b=new w(this.Ha,this.Da,0,0);b.cG(this.L,this.M,0,0);if(0>a){var c=b.left.toString()+" "+(b.y+b.height/2).toString(),d=b.right.toString()+" "+(b.y+b.height/2).toString();return"M"+c+"A"+(b.width/2).toString()+" "+(b.height/2).toString()+" 0 0 1 "+d+"A"+(b.width/2).toString()+" "+(b.height/2).toString()+" 0 0 1 "+c}c=b.left.toFixed(a)+" "+(b.y+b.height/2).toFixed(a);d=b.right.toFixed(a)+" "+(b.y+b.height/2).toFixed(a);return"M"+c+"A"+(b.width/ +2).toFixed(a)+" "+(b.height/2).toFixed(a)+" 0 0 1 "+d+"A"+(b.width/2).toFixed(a)+" "+(b.height/2).toFixed(a)+" 0 0 1 "+c;case jf:for(var b="",c=this.cc.o,d=c.length,e=0;e<d;e++){var g=c[e];0<e&&(b+=" x ");g.Ot&&(b+="F ");b+=g.toString(a)}return b;default:return this.type.toString()}}; +hf.fillPath=function(a){"string"!==typeof a&&z.ic(a,"string",hf,"fillPath:str");a=a.split(/[Xx]/);for(var b=a.length,c="",d=0;d<b;d++)var e=a[d],c=null!==e.match(/[Ff]/)?0===d?c+e:c+("X"+(" "===e[0]?"":" ")+e):c+((0===d?"":"X ")+"F"+(" "===e[0]?"":" ")+e);return c};var sf; +hf.parse=sf=function(a,b){function c(){return m>=t-1?!0:null!==l[m+1].match(/[A-Za-z]/)}function d(){m++;return l[m]}function e(){var a=new N(parseFloat(d()),parseFloat(d()));n===n.toLowerCase()&&(a.x=s.x+a.x,a.y=s.y+a.y);return a}function g(){return s=e()}function h(){return r=e()}function k(){return"c"!==p.toLowerCase()&&"s"!==p.toLowerCase()?s:new N(2*s.x-r.x,2*s.y-r.y)}void 0===b&&(b=!1);"string"!==typeof a&&z.ic(a,"string",hf,"parse:str");a=a.replace(/,/gm," ");a=a.replace(/([UuBbMmZzLlHhVvCcSsQqTtAaFf])([UuBbMmZzLlHhVvCcSsQqTtAaFf])/gm, +"$1 $2");a=a.replace(/([UuBbMmZzLlHhVvCcSsQqTtAaFf])([UuBbMmZzLlHhVvCcSsQqTtAaFf])/gm,"$1 $2");a=a.replace(/([UuBbMmZzLlHhVvCcSsQqTtAaFf])([^\s])/gm,"$1 $2");a=a.replace(/([^\s])([UuBbMmZzLlHhVvCcSsQqTtAaFf])/gm,"$1 $2");a=a.replace(/([0-9])([+\-])/gm,"$1 $2");a=a.replace(/(\.[0-9]*)(\.)/gm,"$1 $2");a=a.replace(/([Aa](\s+[0-9]+){3})\s+([01])\s*([01])/gm,"$1 $3 $4 ");a=a.replace(/[\s\r\t\n]+/gm," ");a=a.replace(/^\s+|\s+$/g,"");for(var l=a.split(" "),m=-1,n="",p="",q=new N(0,0),r=new N(0,0),s=new N(0, +0),t=l.length,v=z.v(),x=!1,y=!1,A=!0;!(m>=t-1);)if(p=n,n=d(),""!==n)switch(n.toUpperCase()){case "X":A=!0;y=x=!1;break;case "M":var C=g();null===v.$b||!0===A?(R(v,C.x,C.y,x,!1,!y),A=!1):v.moveTo(C.x,C.y);for(q=s;!c();)C=g(),v.lineTo(C.x,C.y);break;case "L":for(;!c();)C=g(),v.lineTo(C.x,C.y);break;case "H":for(;!c();)s=C=new N((n===n.toLowerCase()?s.x:0)+parseFloat(d()),s.y),v.lineTo(s.x,s.y);break;case "V":for(;!c();)s=C=new N(s.x,(n===n.toLowerCase()?s.y:0)+parseFloat(d())),v.lineTo(s.x,s.y);break; +case "C":for(;!c();){var L=e(),H=h(),C=g();S(v,L.x,L.y,H.x,H.y,C.x,C.y)}break;case "S":for(;!c();)L=k(),H=h(),C=g(),S(v,L.x,L.y,H.x,H.y,C.x,C.y);break;case "Q":for(;!c();)H=h(),C=g(),zf(v,H.x,H.y,C.x,C.y);break;case "T":for(;!c();)r=H=k(),C=g(),zf(v,H.x,H.y,C.x,C.y);break;case "B":for(;!c();){var C=parseFloat(d()),L=parseFloat(d()),H=parseFloat(d()),U=parseFloat(d()),ea=parseFloat(d()),W=ea,P=!1;c()||(W=parseFloat(d()),c()||(P=0!==parseFloat(d())));n===n.toLowerCase()&&(H+=s.x,U+=s.y);v.arcTo(C,L, +H,U,ea,W,P)}break;case "A":for(;!c();)L=Math.abs(parseFloat(d())),H=Math.abs(parseFloat(d())),U=parseFloat(d()),ea=!!parseFloat(d()),W=!!parseFloat(d()),C=g(),Af(v,L,H,U,ea,W,C.x,C.y);break;case "Z":C=v.q.cc.o[v.q.cc.length-1];T(v);s=q;break;case "F":C="";for(L=1;l[m+L];)if(null!==l[m+L].match(/[Uu]/))L++;else if(null===l[m+L].match(/[A-Za-z]/))L++;else{C=l[m+L];break}C.match(/[Mm]/)?x=!0:Bf(v);break;case "U":C="";for(L=1;l[m+L];)if(null!==l[m+L].match(/[Ff]/))L++;else if(null===l[m+L].match(/[A-Za-z]/))L++; +else{C=l[m+L];break}C.match(/[Mm]/)?y=!0:v.fb(!1)}q=v.q;z.u(v);if(b)for(v=q.cc.i;v.next();)C=v.value,C.Ot=!0;return q};function Cf(a,b){for(var c=a.length,d=z.O(),e=0;e<c;e++){var g=a[e];d.x=g[0];d.y=g[1];b.Cb(d);g[0]=d.x;g[1]=d.y;d.x=g[2];d.y=g[3];b.Cb(d);g[2]=d.x;g[3]=d.y;d.x=g[4];d.y=g[5];b.Cb(d);g[4]=d.x;g[5]=d.y;d.x=g[6];d.y=g[7];b.Cb(d);g[6]=d.x;g[7]=d.y}z.A(d)} +hf.prototype.hA=function(){if(this.hb||this.mv!==this.cc.H)return!0;for(var a=this.cc.o,b=a.length,c=0;c<b;c++)if(a[c].hA())return!0;return!1};hf.prototype.dB=function(){this.hb=!1;this.mv=this.cc.H;for(var a=this.cc.o,b=a.length,c=0;c<b;c++)a[c].dB()};hf.prototype.sh=function(){var a=this.Xu;a.Wa();isNaN(this.qo)||isNaN(this.oo)?a.n(0,0,0,0):a.n(0,0,this.qo,this.oo);Df(this,a,!1);Hb(a,0,0,0,0);a.freeze()}; +hf.prototype.computeBoundsWithoutOrigin=hf.prototype.eH=function(){var a=new w;Df(this,a,!0);return a}; +function Df(a,b,c){switch(a.type){case mf:case nf:case of:c?b.n(a.xc,a.Cc,0,0):Hb(b,a.xc,a.Cc,0,0);Hb(b,a.zb,a.Gb,0,0);break;case jf:var d=a.cc;a=d.o;for(var d=d.length,e=0;e<d;e++){var g=a[e];c&&0===e?b.n(g.Ha,g.Da,0,0):Hb(b,g.Ha,g.Da,0,0);for(var h=g.Ab.o,k=h.length,l=g.Ha,m=g.Da,n=0;n<k;n++){var p=h[n];switch(p.type){case qf:case Ef:l=p.L;m=p.M;Hb(b,l,m,0,0);break;case Ff:ve(l,m,p.zc,p.Qc,p.Ch,p.Dh,p.L,p.M,.5,b);l=p.L;m=p.M;break;case Gf:ze(l,m,p.zc,p.Qc,p.L,p.M,.5,b);l=p.L;m=p.M;break;case Hf:case If:var q= +p.type===Hf?Jf(p,g):Kf(p,g,l,m),r=q.length;if(0===r){l=p.ra;m=p.za;Hb(b,l,m,0,0);break}for(var p=null,s=0;s<r;s++)p=q[s],ve(p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7],.5,b);null!==p&&(l=p[6],m=p[7]);break;default:z.k("Unknown Segment type: "+p.type)}}}break;default:z.k("Unknown Geometry type: "+a.type)}}hf.prototype.normalize=hf.prototype.normalize=function(){this.G&&z.oa(this);var a=this.eH();this.offset(-a.x,-a.y);return new N(-a.x,-a.y)}; +hf.prototype.offset=hf.prototype.offset=function(a,b){this.G&&z.oa(this);u&&(z.p(a,hf,"offset"),z.p(b,hf,"offset"));this.transform(1,0,0,1,a,b);return this};hf.prototype.scale=hf.prototype.scale=function(a,b){this.G&&z.oa(this);u&&(z.p(a,hf,"scale:x"),z.p(b,hf,"scale:y"),0===a&&z.ka(a,"scale must be non-zero",hf,"scale:x"),0===b&&z.ka(b,"scale must be non-zero",hf,"scale:y"));this.transform(a,0,0,b,0,0);return this}; +hf.prototype.rotate=hf.prototype.rotate=function(a,b,c){this.G&&z.oa(this);void 0===b&&(b=0);void 0===c&&(c=0);u&&(z.p(a,hf,"rotate:angle"),z.p(b,hf,"rotate:x"),z.p(c,hf,"rotate:y"));var d=z.Hh();d.reset();d.rotate(a,b,c);this.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy);z.jf(d);return this}; +hf.prototype.transform=hf.prototype.transform=function(a,b,c,d,e,g){var h=0,k=0;switch(this.type){case mf:case nf:case of:h=this.xc;k=this.Cc;this.xc=h*a+k*c+e;this.Cc=h*b+k*d+g;h=this.zb;k=this.Gb;this.zb=h*a+k*c+e;this.Gb=h*b+k*d+g;break;case jf:for(var l=this.cc.o,m=l.length,n=0;n<m;n++){var p=l[n],h=p.Ha,k=p.Da;p.Ha=h*a+k*c+e;p.Da=h*b+k*d+g;for(var p=p.Ab.o,q=p.length,r=0;r<q;r++){var s=p[r];switch(s.type){case qf:case Ef:h=s.L;k=s.M;s.L=h*a+k*c+e;s.M=h*b+k*d+g;break;case Ff:h=s.zc;k=s.Qc;s.zc= +h*a+k*c+e;s.Qc=h*b+k*d+g;h=s.Ch;k=s.Dh;s.Ch=h*a+k*c+e;s.Dh=h*b+k*d+g;h=s.L;k=s.M;s.L=h*a+k*c+e;s.M=h*b+k*d+g;break;case Gf:h=s.zc;k=s.Qc;s.zc=h*a+k*c+e;s.Qc=h*b+k*d+g;h=s.L;k=s.M;s.L=h*a+k*c+e;s.M=h*b+k*d+g;break;case Hf:h=s.ra;k=s.za;s.ra=h*a+k*c+e;s.za=h*b+k*d+g;0!==b&&(h=180*Math.atan2(b,a)/Math.PI,0>h&&(h+=360),s.Fe+=h);0>a&&(s.Fe=180-s.Fe,s.Lf=-s.Lf);0>d&&(s.Fe=-s.Fe,s.Lf=-s.Lf);s.radiusX*=Math.sqrt(a*a+c*c);void 0!==s.radiusY&&(s.radiusY*=Math.sqrt(b*b+d*d));break;case If:h=s.L;k=s.M;s.L=h* +a+k*c+e;s.M=h*b+k*d+g;0!==b&&(h=180*Math.atan2(b,a)/Math.PI,0>h&&(h+=360),s.xj+=h);0>a&&(s.xj=180-s.xj,s.Ol=!s.Ol);0>d&&(s.xj=-s.xj,s.Ol=!s.Ol);s.radiusX*=Math.sqrt(a*a+c*c);s.radiusY*=Math.sqrt(b*b+d*d);break;default:z.k("Unknown Segment type: "+s.type)}}}}this.hb=!0;return this}; +hf.prototype.Ma=function(a,b,c,d){var e=a.x,g=a.y,h=this.vb.x-20;a=a.y;for(var k=0,l=0,m=0,n=0,p=0,q=0,r=this.cc.o,s=r.length,t=0;t<s;t++){var v=r[t];if(v.Ot){if(c&&v.Ma(e,g,b))return!0;for(var x=v.Ab,l=v.Ha,m=v.Da,y=l,A=m,C=x.o,L=0;L<=x.length;L++){var H,U;L!==x.length?(H=C[L],U=H.type,p=H.L,q=H.M):(U=qf,p=y,q=A);switch(U){case Ef:n=Lf(e,g,h,a,l,m,y,A);if(isNaN(n))return!0;k+=n;y=p;A=q;break;case qf:n=Lf(e,g,h,a,l,m,p,q);if(isNaN(n))return!0;k+=n;break;case Ff:n=Le(l,m,H.zc,H.Qc,H.Ch,H.Dh,p,q,h, +a,e,g,.5);k+=n;break;case Gf:n=Le(l,m,(l+2*H.zc)/3,(m+2*H.Qc)/3,(2*H.zc+p)/3,(2*H.Qc+q)/3,p,q,h,a,e,g,.5);k+=n;break;case Hf:case If:U=H.type===Hf?Jf(H,v):Kf(H,v,l,m);var ea=U.length;if(0===ea){n=Lf(e,g,h,a,l,m,H.ra,H.za);if(isNaN(n))return!0;k+=n;break}for(var W=null,P=0;P<ea;P++){W=U[P];if(0===P){n=Lf(e,g,h,a,l,m,W[0],W[1]);if(isNaN(n))return!0;k+=n}n=Le(W[0],W[1],W[2],W[3],W[4],W[5],W[6],W[7],h,a,e,g,.5);k+=n}null!==W&&(p=W[6],q=W[7]);break;default:z.k("Unknown Segment type: "+H.type)}l=p;m=q}if(0!== +k)return!0;k=0}else if(v.Ma(e,g,d?b:b+2))return!0}return 0!==k};function Lf(a,b,c,d,e,g,h,k){if(te(e,g,h,k,.05,a,b))return NaN;var l=(a-c)*(g-k);if(0===l)return 0;var m=((a*d-b*c)*(e-h)-(a-c)*(e*k-g*h))/l;b=(a*d-b*c)*(g-k)/l;if(m>=a)return 0;if((e>h?e-h:h-e)<(g>k?g-k:k-g)){if(e=a=0,g<k?(a=g,e=k):(a=k,e=g),b<a||b>e)return 0}else if(e<h?(a=e,e=h):a=h,m<a||m>e)return 0;return 0<l?1:-1}function Pf(a,b,c,d){a=a.cc.o;for(var e=a.length,g=0;g<e;g++)if(a[g].Ma(b,c,d))return!0;return!1} +hf.prototype.getPointAlongPath=function(a){(0>a||1<a)&&z.ka(a,"0 <= fraction <= 1",hf,"getPointAlongPath:fraction");var b=this.cc.first(),c=z.rb(),d=[];d.push(b.Ha);d.push(b.Da);for(var e=b.Ha,g=b.Da,h=e,k=g,l=b.Ab.o,m=l.length,n=0;n<m;n++){var p=l[n];switch(p.ba){case Ef:c.push(d);d=[];d.push(p.L);d.push(p.M);e=p.L;g=p.M;h=e;k=g;break;case qf:d.push(p.L);d.push(p.M);e=p.L;g=p.M;break;case Ff:we(e,g,p.Cd,p.Ne,p.nh,p.zg,p.zb,p.Gb,.5,d);e=p.L;g=p.M;break;case Gf:Je(e,g,p.Cd,p.Ne,p.zb,p.Gb,.5,d);e=p.L; +g=p.M;break;case Hf:var q=Jf(p,b),r=q.length;if(0===r){d.push(p.ra);d.push(p.za);e=p.ra;g=p.za;break}for(var s=0;s<r;s++){var t=q[s];we(e,g,t[2],t[3],t[4],t[5],t[6],t[7],.5,d);e=t[6];g=t[7]}break;case If:q=Kf(p,b,e,g);r=q.length;for(s=0;s<r;s++)t=q[s],we(e,g,t[2],t[3],t[4],t[5],t[6],t[7],.5,d),e=t[6],g=t[7];break;default:z.k("Segment not of valid type")}p.Th&&(d.push(h),d.push(k))}c.push(d);q=0;h=c.length;for(k=d=b=0;k<h;k++)for(l=c[k],m=l.length,n=0;n<m;n+=2)e=l[n],g=l[n+1],0!==n&&(p=Math.sqrt(vb(b, +d,e,g)),q+=p),b=e,d=g;a*=q;for(k=q=0;k<h;k++)for(l=c[k],m=l.length,n=0;n<m;n++){e=l[n];g=l[n+1];if(0!==n){p=Math.sqrt(vb(b,d,e,g));if(q+p>a)return n=(a-q)/p,z.xa(c),new N(b+(e-b)*n,d+(g-d)*n);q+=p}b=e;d=g}z.xa(c);return null};z.defineProperty(hf,{type:"type"},function(){return this.ba},function(a){this.ba!==a&&(u&&z.Ba(a,hf,hf,"type"),this.G&&z.oa(this,a),this.ba=a,this.hb=!0)}); +z.defineProperty(hf,{Ha:"startX"},function(){return this.xc},function(a){this.xc!==a&&(u&&z.p(a,hf,"startX"),this.G&&z.oa(this,a),this.xc=a,this.hb=!0)});z.defineProperty(hf,{Da:"startY"},function(){return this.Cc},function(a){this.Cc!==a&&(u&&z.p(a,hf,"startY"),this.G&&z.oa(this,a),this.Cc=a,this.hb=!0)});z.defineProperty(hf,{L:"endX"},function(){return this.zb},function(a){this.zb!==a&&(u&&z.p(a,hf,"endX"),this.G&&z.oa(this,a),this.zb=a,this.hb=!0)}); +z.defineProperty(hf,{M:"endY"},function(){return this.Gb},function(a){this.Gb!==a&&(u&&z.p(a,hf,"endY"),this.G&&z.oa(this,a),this.Gb=a,this.hb=!0)});z.defineProperty(hf,{cc:"figures"},function(){return this.Dj},function(a){this.Dj!==a&&(u&&z.l(a,J,hf,"figures"),this.G&&z.oa(this,a),this.Dj=a,this.hb=!0)});hf.prototype.add=hf.prototype.add=function(a){this.Dj.add(a);return this}; +hf.prototype.setSpots=function(a,b,c,d,e,g,h,k){this.G&&z.oa(this);this.ci=(new Q(a,b,e,g)).freeze();this.di=(new Q(c,d,h,k)).freeze();return this};z.defineProperty(hf,{C:"spot1"},function(){return this.ci},function(a){u&&z.l(a,Q,hf,"spot1");this.G&&z.oa(this,a);this.ci=a.V()});z.defineProperty(hf,{D:"spot2"},function(){return this.di},function(a){u&&z.l(a,Q,hf,"spot2");this.G&&z.oa(this,a);this.di=a.V()}); +z.defineProperty(hf,{Xd:"defaultStretch"},function(){return this.Ci},function(a){u&&z.Ba(a,O,hf,"stretch");this.G&&z.oa(this,a);this.Ci=a});z.w(hf,{vb:"bounds"},function(){this.hA()&&(this.dB(),this.sh());return this.Xu});function kf(a,b,c,d){z.kc(this);this.G=!1;void 0===c&&(c=!0);this.im=c;void 0===d&&(d=!0);this.ro=d;void 0!==a?(u&&z.p(a,kf,"sx"),this.xc=a):this.xc=0;void 0!==b?(u&&z.p(b,kf,"sy"),this.Cc=b):this.Cc=0;this.Ko=new J(Qf);this.nw=this.Ko.H;this.hb=!0}z.ia("PathFigure",kf);z.ji(kf); +kf.prototype.copy=function(){var a=new kf;a.im=this.im;a.ro=this.ro;a.xc=this.xc;a.Cc=this.Cc;for(var b=this.Ko.o,c=b.length,d=a.Ko,e=0;e<c;e++){var g=b[e].copy();d.add(g)}a.nw=this.nw;a.hb=this.hb;return a};kf.prototype.equalsApprox=kf.prototype.Mc=function(a){if(!(a instanceof kf&&eb(this.Ha,a.Ha)&&eb(this.Da,a.Da)))return!1;var b=this.Ab.o;a=a.Ab.o;var c=b.length;if(c!==a.length)return!1;for(var d=0;d<c;d++)if(!b[d].Mc(a[d]))return!1;return!0};f=kf.prototype; +f.toString=function(a){void 0===a&&(a=-1);for(var b=0>a?"M"+this.Ha.toString()+" "+this.Da.toString():"M"+this.Ha.toFixed(a)+" "+this.Da.toFixed(a),c=this.Ab.o,d=c.length,e=0;e<d;e++)b+=" "+c[e].toString(a);return b};f.freeze=function(){this.G=!0;var a=this.Ab;a.freeze();for(var b=a.o,a=a.length,c=0;c<a;c++)b[c].freeze();return this};f.Wa=function(){this.G=!1;var a=this.Ab;a.Wa();for(var a=a.o,b=a.length,c=0;c<b;c++)a[c].Wa();return this}; +f.hA=function(){if(this.hb)return!0;var a=this.Ab;if(this.nw!==a.H)return!0;for(var a=a.o,b=a.length,c=0;c<b;c++)if(a[c].hb)return!0;return!1};f.dB=function(){this.hb=!1;var a=this.Ab;this.nw=a.H;for(var a=a.o,b=a.length,c=0;c<b;c++){var d=a[c];d.hb=!1;d.ng=null}};z.defineProperty(kf,{Ot:"isFilled"},function(){return this.im},function(a){u&&z.g(a,"boolean",kf,"isFilled");this.G&&z.oa(this,a);this.im=a}); +z.defineProperty(kf,{tk:"isShadowed"},function(){return this.ro},function(a){u&&z.g(a,"boolean",kf,"isShadowed");this.G&&z.oa(this,a);this.ro=a});z.defineProperty(kf,{Ha:"startX"},function(){return this.xc},function(a){u&&z.p(a,kf,"startX");this.G&&z.oa(this,a);this.xc=a;this.hb=!0});z.defineProperty(kf,{Da:"startY"},function(){return this.Cc},function(a){u&&z.p(a,kf,"startY");this.G&&z.oa(this,a);this.Cc=a;this.hb=!0}); +z.defineProperty(kf,{Ab:"segments"},function(){return this.Ko},function(a){u&&z.l(a,J,kf,"segments");this.G&&z.oa(this,a);this.Ko=a;this.hb=!0});kf.prototype.add=kf.prototype.add=function(a){this.Ko.add(a);return this}; +kf.prototype.Ma=function(a,b,c){for(var d=this.Ha,e=this.Da,g=d,h=e,k=this.Ab.o,l=k.length,m=0;m<l;m++){var n=k[m];switch(n.type){case Ef:g=n.L;h=n.M;d=n.L;e=n.M;break;case qf:if(te(d,e,n.L,n.M,c,a,b))return!0;d=n.L;e=n.M;break;case Ff:if(ue(d,e,n.zc,n.Qc,n.Ch,n.Dh,n.L,n.M,.5,a,b,c))return!0;d=n.L;e=n.M;break;case Gf:if(ye(d,e,n.zc,n.Qc,n.L,n.M,.5,a,b,c))return!0;d=n.L;e=n.M;break;case Hf:case If:var p=n.type===Hf?Jf(n,this):Kf(n,this,d,e),q=p.length;if(0===q){if(te(d,e,n.ra,n.za,c,a,b))return!0; +d=n.ra;e=n.za;break}for(var r=null,s=0;s<q;s++)if(r=p[s],0===s&&te(d,e,r[0],r[1],c,a,b)||ue(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],.5,a,b,c))return!0;null!==r&&(d=r[6],e=r[7]);break;default:z.k("Unknown Segment type: "+n.type)}if(n.hx&&(d!==g||e!==h)&&te(d,e,g,h,c,a,b))return!0}return!1}; +function Qf(a,b,c,d,e,g,h,k){z.kc(this);this.G=!1;void 0===a?a=qf:u&&z.Ba(a,Qf,Qf,"constructor:type");this.ba=a;void 0!==b?(u&&z.p(b,Qf,"ex"),this.zb=b):this.zb=0;void 0!==c?(u&&z.p(c,Qf,"ey"),this.Gb=c):this.Gb=0;void 0===d&&(d=0);void 0===e&&(e=0);void 0===g&&(g=0);void 0===h&&(h=0);a===If?(a=g%360,0>a&&(a+=360),this.Cd=a,this.Ne=0,u&&z.p(d,Qf,"x1"),this.nh=Math.max(d,0),u&&z.p(e,Qf,"y1"),this.zg=Math.max(e,0),this.wo="boolean"===typeof h?!!h:!1,this.Ln=!!k):(u&&z.p(d,Qf,"x1"),this.Cd=d,u&&z.p(e, +Qf,"y1"),this.Ne=e,u&&z.p(g,Qf,"x2"),a===Hf&&(g=Math.max(g,0)),this.nh=g,"number"===typeof h?(a===Hf&&(h=Math.max(h,0)),this.zg=h):this.zg=0,this.Ln=this.wo=!1);this.Th=!1;this.hb=!0;this.ng=null}z.ia("PathSegment",Qf);z.ji(Qf);Qf.prototype.copy=function(){var a=new Qf;a.ba=this.ba;a.zb=this.zb;a.Gb=this.Gb;a.Cd=this.Cd;a.Ne=this.Ne;a.nh=this.nh;a.zg=this.zg;a.wo=this.wo;a.Ln=this.Ln;a.Th=this.Th;a.hb=this.hb;return a}; +Qf.prototype.equalsApprox=Qf.prototype.Mc=function(a){if(!(a instanceof Qf)||this.type!==a.type||this.hx!==a.hx)return!1;switch(this.type){case Ef:case qf:return eb(this.L,a.L)&&eb(this.M,a.M);case Ff:return eb(this.L,a.L)&&eb(this.M,a.M)&&eb(this.zc,a.zc)&&eb(this.Qc,a.Qc)&&eb(this.Ch,a.Ch)&&eb(this.Dh,a.Dh);case Gf:return eb(this.L,a.L)&&eb(this.M,a.M)&&eb(this.zc,a.zc)&&eb(this.Qc,a.Qc);case Hf:return eb(this.Fe,a.Fe)&&eb(this.Lf,a.Lf)&&eb(this.ra,a.ra)&&eb(this.za,a.za)&&eb(this.radiusX,a.radiusX)&& +eb(this.radiusY,a.radiusY);case If:return this.Ol===a.Ol&&this.lx===a.lx&&eb(this.xj,a.xj)&&eb(this.L,a.L)&&eb(this.M,a.M)&&eb(this.radiusX,a.radiusX)&&eb(this.radiusY,a.radiusY);default:return!1}}; +Qf.prototype.toString=function(a){void 0===a&&(a=-1);var b="";switch(this.type){case Ef:b=0>a?"M"+this.L.toString()+" "+this.M.toString():"M"+this.L.toFixed(a)+" "+this.M.toFixed(a);break;case qf:b=0>a?"L"+this.L.toString()+" "+this.M.toString():"L"+this.L.toFixed(a)+" "+this.M.toFixed(a);break;case Ff:b=0>a?"C"+this.zc.toString()+" "+this.Qc.toString()+" "+this.Ch.toString()+" "+this.Dh.toString()+" "+this.L.toString()+" "+this.M.toString():"C"+this.zc.toFixed(a)+" "+this.Qc.toFixed(a)+" "+this.Ch.toFixed(a)+ +" "+this.Dh.toFixed(a)+" "+this.L.toFixed(a)+" "+this.M.toFixed(a);break;case Gf:b=0>a?"Q"+this.zc.toString()+" "+this.Qc.toString()+" "+this.L.toString()+" "+this.M.toString():"Q"+this.zc.toFixed(a)+" "+this.Qc.toFixed(a)+" "+this.L.toFixed(a)+" "+this.M.toFixed(a);break;case Hf:b=0>a?"B"+this.Fe.toString()+" "+this.Lf.toString()+" "+this.ra.toString()+" "+this.za.toString()+" "+this.radiusX:"B"+this.Fe.toFixed(a)+" "+this.Lf.toFixed(a)+" "+this.ra.toFixed(a)+" "+this.za.toFixed(a)+" "+this.radiusX; +break;case If:b=0>a?"A"+this.radiusX.toString()+" "+this.radiusY.toString()+" "+this.xj.toString()+" "+(this.lx?1:0)+" "+(this.Ol?1:0)+" "+this.L.toString()+" "+this.M.toString():"A"+this.radiusX.toFixed(a)+" "+this.radiusY.toFixed(a)+" "+this.xj.toFixed(a)+" "+(this.lx?1:0)+" "+(this.Ol?1:0)+" "+this.L.toFixed(a)+" "+this.M.toFixed(a);break;default:b=this.type.toString()}return b+(this.Th?"z":"")};var Ef;Qf.Move=Ef=z.s(Qf,"Move",0);var qf;Qf.Line=qf=z.s(Qf,"Line",1);var Ff; +Qf.Bezier=Ff=z.s(Qf,"Bezier",2);var Gf;Qf.QuadraticBezier=Gf=z.s(Qf,"QuadraticBezier",3);var Hf;Qf.Arc=Hf=z.s(Qf,"Arc",4);var If;Qf.SvgArc=If=z.s(Qf,"SvgArc",4);Qf.prototype.freeze=function(){this.G=!0;return this};Qf.prototype.Wa=function(){this.G=!1;return this};Qf.prototype.close=Qf.prototype.close=function(){this.Th=!0;return this}; +function Jf(a,b){if(null!==a.ng&&!1===b.hb)return a.ng;var c=a.radiusX,d=a.radiusY;void 0===d&&(d=c);if(0===c||0===d)return a.ng=[],a.ng;var e=a.Cd,g=a.Ne,h=ef(c<d?c:d,a.Fe,a.Fe+a.Lf,!1);if(c!==d){var k=z.Hh();k.reset();c<d?k.scale(1,d/c):k.scale(c/d,1);Cf(h,k);z.jf(k)}c=h.length;for(d=0;d<c;d++)k=h[d],k[0]+=e,k[1]+=g,k[2]+=e,k[3]+=g,k[4]+=e,k[5]+=g,k[6]+=e,k[7]+=g;a.ng=h;return a.ng} +function Kf(a,b,c,d){function e(a,b,c,d){return(a*d<b*c?-1:1)*Math.acos((a*c+b*d)/(Math.sqrt(a*a+b*b)*Math.sqrt(c*c+d*d)))}if(null!==a.ng&&!1===b.hb)return a.ng;b=a.nh;var g=a.zg;if(0===b||0===g)return a.ng=[],a.ng;var h=Math.PI/180*a.Cd,k=a.wo,l=a.Ln,m=a.zb,n=a.Gb,p=Math.cos(h),q=Math.sin(h),r=p*(c-m)/2+q*(d-n)/2,h=-q*(c-m)/2+p*(d-n)/2,s=r*r/(b*b)+h*h/(g*g);1<s&&(b*=Math.sqrt(s),g*=Math.sqrt(s));s=(k===l?-1:1)*Math.sqrt((b*b*g*g-b*b*h*h-g*g*r*r)/(b*b*h*h+g*g*r*r));isNaN(s)&&(s=0);k=s*b*h/g;s=s*-g* +r/b;isNaN(k)&&(k=0);isNaN(s)&&(s=0);c=(c+m)/2+p*k-q*s;d=(d+n)/2+q*k+p*s;n=e(1,0,(r-k)/b,(h-s)/g);p=(r-k)/b;m=(h-s)/g;r=(-r-k)/b;k=(-h-s)/g;h=e(p,m,r,k);r=(p*r+m*k)/(Math.sqrt(p*p+m*m)*Math.sqrt(r*r+k*k));-1>=r?h=Math.PI:1<=r&&(h=0);!l&&0<h&&(h-=2*Math.PI);l&&0>h&&(h+=2*Math.PI);l=b>g?1:b/g;r=b>g?g/b:1;b=ef(b>g?b:g,n,n+h,!0);g=z.Hh();g.reset();g.translate(c,d);g.rotate(a.Cd,0,0);g.scale(l,r);Cf(b,g);z.jf(g);a.ng=b;return a.ng} +z.defineProperty(Qf,{hx:"isClosed"},function(){return this.Th},function(a){this.Th!==a&&(this.Th=a,this.hb=!0)});z.defineProperty(Qf,{type:"type"},function(){return this.ba},function(a){u&&z.Ba(a,Qf,Qf,"type");this.G&&z.oa(this,a);this.ba=a;this.hb=!0});z.defineProperty(Qf,{L:"endX"},function(){return this.zb},function(a){u&&z.p(a,Qf,"endX");this.G&&z.oa(this,a);this.zb=a;this.hb=!0}); +z.defineProperty(Qf,{M:"endY"},function(){return this.Gb},function(a){u&&z.p(a,Qf,"endY");this.G&&z.oa(this,a);this.Gb=a;this.hb=!0});z.defineProperty(Qf,{zc:"point1X"},function(){return this.Cd},function(a){u&&z.p(a,Qf,"point1X");this.G&&z.oa(this,a);this.Cd=a;this.hb=!0});z.defineProperty(Qf,{Qc:"point1Y"},function(){return this.Ne},function(a){u&&z.p(a,Qf,"point1Y");this.G&&z.oa(this,a);this.Ne=a;this.hb=!0}); +z.defineProperty(Qf,{Ch:"point2X"},function(){return this.nh},function(a){u&&z.p(a,Qf,"point2X");this.G&&z.oa(this,a);this.nh=a;this.hb=!0});z.defineProperty(Qf,{Dh:"point2Y"},function(){return this.zg},function(a){u&&z.p(a,Qf,"point2Y");this.G&&z.oa(this,a);this.zg=a;this.hb=!0});z.defineProperty(Qf,{ra:"centerX"},function(){return this.Cd},function(a){u&&z.p(a,Qf,"centerX");this.G&&z.oa(this,a);this.Cd=a;this.hb=!0}); +z.defineProperty(Qf,{za:"centerY"},function(){return this.Ne},function(a){u&&z.p(a,Qf,"centerY");this.G&&z.oa(this,a);this.Ne=a;this.hb=!0});z.defineProperty(Qf,{radiusX:"radiusX"},function(){return this.nh},function(a){u&&z.p(a,Qf,"radiusX");0>a&&z.ka(a,">= zero",Qf,"radiusX");this.G&&z.oa(this,a);this.nh=a;this.hb=!0});z.defineProperty(Qf,{radiusY:"radiusY"},function(){return this.zg},function(a){u&&z.p(a,Qf,"radiusY");0>a&&z.ka(a,">= zero",Qf,"radiusY");this.G&&z.oa(this,a);this.zg=a;this.hb=!0}); +z.defineProperty(Qf,{Fe:"startAngle"},function(){return this.zb},function(a){this.zb!==a&&(this.G&&z.oa(this,a),u&&z.p(a,Qf,"startAngle"),a%=360,0>a&&(a+=360),this.zb=a,this.hb=!0)});z.defineProperty(Qf,{Lf:"sweepAngle"},function(){return this.Gb},function(a){u&&z.p(a,Qf,"sweepAngle");this.G&&z.oa(this,a);360<a&&(a=360);-360>a&&(a=-360);this.Gb=a;this.hb=!0});z.defineProperty(Qf,{Ol:"isClockwiseArc"},function(){return this.Ln},function(a){this.G&&z.oa(this,a);this.Ln=a;this.hb=!0}); +z.defineProperty(Qf,{lx:"isLargeArc"},function(){return this.wo},function(a){this.G&&z.oa(this,a);this.wo=a;this.hb=!0});z.defineProperty(Qf,{xj:"xAxisRotation"},function(){return this.Cd},function(a){u&&z.p(a,Qf,"xAxisRotation");a%=360;0>a&&(a+=360);this.G&&z.oa(this,a);this.Cd=a;this.hb=!0}); +function Rf(){this.Z=null;this.vz=(new N(0,0)).freeze();this.Cy=(new N(0,0)).freeze();this.Tu=this.Pv=0;this.Uu=1;this.Dv="";this.xw=this.jv=!1;this.fv=this.Wu=0;this.zj=this.qv=this.Av=!1;this.Yq=null;this.vw=0;this.Bg=this.uw=null}z.ia("InputEvent",Rf); +Rf.prototype.copy=function(){var a=new Rf;a.Z=this.Z;a.vz.assign(this.ue);a.Cy.assign(this.ga);a.Pv=this.Pv;a.Tu=this.Tu;a.Uu=this.Uu;a.Dv=this.Dv;a.jv=this.jv;a.xw=this.xw;a.Wu=this.Wu;a.fv=this.fv;a.Av=this.Av;a.qv=this.qv;a.zj=this.zj;a.Yq=this.Yq;a.vw=this.vw;a.uw=this.uw;a.Bg=this.Bg;return a}; +Rf.prototype.toString=function(){var a="^";0!==this.xd&&(a+="M:"+this.xd);0!==this.button&&(a+="B:"+this.button);""!==this.key&&(a+="K:"+this.key);0!==this.Pe&&(a+="C:"+this.Pe);0!==this.Dl&&(a+="D:"+this.Dl);this.Gc&&(a+="h");this.bubbles&&(a+="b");null!==this.ga&&(a+="@"+this.ga.toString());return a};z.defineProperty(Rf,{h:"diagram"},function(){return this.Z},function(a){this.Z=a});z.defineProperty(Rf,{ue:"viewPoint"},function(){return this.vz},function(a){z.l(a,N,Rf,"viewPoint");this.vz.assign(a)}); +z.defineProperty(Rf,{ga:"documentPoint"},function(){return this.Cy},function(a){z.l(a,N,Rf,"documentPoint");this.Cy.assign(a)});z.defineProperty(Rf,{xd:"modifiers"},function(){return this.Pv},function(a){this.Pv=a});z.defineProperty(Rf,{button:"button"},function(){return this.Tu},function(a){this.Tu=a;if(null===this.event)switch(a){case 0:this.buttons=1;break;case 1:this.buttons=4;break;case 2:this.buttons=2}}); +z.defineProperty(Rf,{buttons:"buttons"},function(){return this.Uu},function(a){this.Uu=a});z.defineProperty(Rf,{key:"key"},function(){return this.Dv},function(a){this.Dv=a});z.defineProperty(Rf,{Fl:"down"},function(){return this.jv},function(a){this.jv=a});z.defineProperty(Rf,{up:"up"},function(){return this.xw},function(a){this.xw=a});z.defineProperty(Rf,{Pe:"clickCount"},function(){return this.Wu},function(a){this.Wu=a}); +z.defineProperty(Rf,{Dl:"delta"},function(){return this.fv},function(a){this.fv=a});z.defineProperty(Rf,{Qt:"isMultiTouch"},function(){return this.Av},function(a){this.Av=a});z.defineProperty(Rf,{Gc:"handled"},function(){return this.qv},function(a){this.qv=a});z.defineProperty(Rf,{bubbles:"bubbles"},function(){return this.zj},function(a){this.zj=a});z.defineProperty(Rf,{event:"event"},function(){return this.Yq},function(a){this.Yq=a}); +z.w(Rf,{mj:"isTouchEvent"},function(){var a=window.TouchEvent;return a&&this.event instanceof a?!0:(a=window.PointerEvent)&&this.event instanceof a&&"touch"===this.event.pointerType});z.w(Rf,{sk:"isMac"},function(){return z.sk});z.defineProperty(Rf,{timestamp:"timestamp"},function(){return this.vw},function(a){this.vw=a});z.defineProperty(Rf,{Tg:"targetDiagram"},function(){return this.uw},function(a){this.uw=a}); +z.defineProperty(Rf,{Ge:"targetObject"},function(){return this.Bg},function(a){this.Bg=a});z.defineProperty(Rf,{control:"control"},function(){return 0!==(this.xd&1)},function(a){this.xd=a?this.xd|1:this.xd&-2});z.defineProperty(Rf,{shift:"shift"},function(){return 0!==(this.xd&4)},function(a){this.xd=a?this.xd|4:this.xd&-5});z.defineProperty(Rf,{alt:"alt"},function(){return 0!==(this.xd&2)},function(a){this.xd=a?this.xd|2:this.xd&-3}); +z.defineProperty(Rf,{$t:"meta"},function(){return 0!==(this.xd&8)},function(a){this.xd=a?this.xd|8:this.xd&-9});z.defineProperty(Rf,{left:"left"},function(){var a=this.event;return null!==a&&a instanceof MouseEvent&&("mousedown"===a.type||"mouseup"===a.type)?0===this.button:0!==(this.buttons&1)},function(a){this.buttons=a?this.buttons|1:this.buttons&-2}); +z.defineProperty(Rf,{right:"right"},function(){var a=this.event;return null!==a&&a instanceof MouseEvent&&("mousedown"===a.type||"mouseup"===a.type)?2===this.button:0!==(this.buttons&2)},function(a){this.buttons=a?this.buttons|2:this.buttons&-3});z.defineProperty(Rf,{VK:"middle"},function(){var a=this.event;return null!==a&&a instanceof MouseEvent&&("mousedown"===a.type||"mouseup"===a.type)?1===this.button:0!==(this.buttons&4)},function(a){this.buttons=a?this.buttons|4:this.buttons&-5}); +function Sf(){this.Z=null;this.Ub="";this.Zv=this.sw=null;this.Vu=!1}z.ia("DiagramEvent",Sf);Sf.prototype.copy=function(){var a=new Sf;a.Z=this.Z;a.Ub=this.Ub;a.sw=this.sw;a.Zv=this.Zv;a.Vu=this.Vu;return a};Sf.prototype.toString=function(){var a="*"+this.name;this.cancel&&(a+="x");null!==this.VA&&(a+=":"+this.VA.toString());null!==this.BA&&(a+="("+this.BA.toString()+")");return a};z.defineProperty(Sf,{h:"diagram"},function(){return this.Z},function(a){this.Z=a}); +z.defineProperty(Sf,{name:"name"},function(){return this.Ub},function(a){this.Ub=a});z.defineProperty(Sf,{VA:"subject"},function(){return this.sw},function(a){this.sw=a});z.defineProperty(Sf,{BA:"parameter"},function(){return this.Zv},function(a){this.Zv=a});z.defineProperty(Sf,{cancel:"cancel"},function(){return this.Vu},function(a){this.Vu=a});function Tf(){this.vq=Uf;this.Bm=this.Ov="";this.Wr=this.Xr=this.$r=this.as=this.Zr=this.Z=this.ie=null}z.ia("ChangedEvent",Tf);var Vf; +Tf.Transaction=Vf=z.s(Tf,"Transaction",-1);var Uf;Tf.Property=Uf=z.s(Tf,"Property",0);var Wf;Tf.Insert=Wf=z.s(Tf,"Insert",1);var Xf;Tf.Remove=Xf=z.s(Tf,"Remove",2);Tf.prototype.clear=Tf.prototype.clear=function(){this.Wr=this.Xr=this.$r=this.as=this.Zr=this.Z=this.ie=null}; +Tf.prototype.copy=function(){var a=new Tf;a.vq=this.vq;a.Ov=this.Ov;a.Bm=this.Bm;a.ie=this.ie;a.Z=this.Z;a.Zr=this.Zr;var b=this.as;a.as=z.Za(b)&&"function"===typeof b.V?b.V():b;b=this.$r;a.$r=z.Za(b)&&"function"===typeof b.V?b.V():b;b=this.Xr;a.Xr=z.Za(b)&&"function"===typeof b.V?b.V():b;b=this.Wr;a.Wr=z.Za(b)&&"function"===typeof b.V?b.V():b;return a}; +Tf.prototype.toString=function(){var a="",a=this.Dc===Vf?a+"* ":this.Dc===Uf?a+(null!==this.ha?"!m":"!d"):a+((null!==this.ha?"!m":"!d")+this.Dc);this.propertyName&&"string"===typeof this.propertyName&&(a+=" "+this.propertyName);this.rf&&this.rf!==this.propertyName&&(a+=" "+this.rf);a+=": ";this.Dc===Vf?null!==this.oldValue&&(a+=" "+this.oldValue):(null!==this.object&&(a+=ka(this.object)),null!==this.oldValue&&(a+=" old: "+ka(this.oldValue)),null!==this.Ng&&(a+=" "+this.Ng),null!==this.newValue&& +(a+=" new: "+ka(this.newValue)),null!==this.Lg&&(a+=" "+this.Lg));return a};Tf.prototype.getValue=Tf.prototype.na=function(a){return a?this.oldValue:this.newValue};Tf.prototype.getParam=function(a){return a?this.Ng:this.Lg};Tf.prototype.canUndo=Tf.prototype.canUndo=function(){return null!==this.ha||null!==this.h?!0:!1};Tf.prototype.undo=Tf.prototype.undo=function(){this.canUndo()&&(null!==this.ha?this.ha.Um(this,!0):null!==this.h&&this.h.Um(this,!0))}; +Tf.prototype.canRedo=Tf.prototype.canRedo=function(){return null!==this.ha||null!==this.h?!0:!1};Tf.prototype.redo=Tf.prototype.redo=function(){this.canRedo()&&(null!==this.ha?this.ha.Um(this,!1):null!==this.h&&this.h.Um(this,!1))};z.defineProperty(Tf,{ha:"model"},function(){return this.ie},function(a){this.ie=a});z.defineProperty(Tf,{h:"diagram"},function(){return this.Z},function(a){this.Z=a}); +z.defineProperty(Tf,{Dc:"change"},function(){return this.vq},function(a){u&&z.Ba(a,Tf,Tf,"change");this.vq=a});z.defineProperty(Tf,{rf:"modelChange"},function(){return this.Ov},function(a){u&&z.g(a,"string",Tf,"modelChange");this.Ov=a});z.defineProperty(Tf,{propertyName:"propertyName"},function(){return this.Bm},function(a){u&&"string"!==typeof a&&z.g(a,"function",Tf,"propertyName");this.Bm=a}); +z.w(Tf,{SE:"isTransactionFinished"},function(){return this.vq===Vf&&("CommittedTransaction"===this.Bm||"FinishedUndo"===this.Bm||"FinishedRedo"===this.Bm)});z.defineProperty(Tf,{object:"object"},function(){return this.Zr},function(a){this.Zr=a});z.defineProperty(Tf,{oldValue:"oldValue"},function(){return this.as},function(a){this.as=a});z.defineProperty(Tf,{Ng:"oldParam"},function(){return this.$r},function(a){this.$r=a}); +z.defineProperty(Tf,{newValue:"newValue"},function(){return this.Xr},function(a){this.Xr=a});z.defineProperty(Tf,{Lg:"newParam"},function(){return this.Wr},function(a){this.Wr=a}); +function M(a){1<arguments.length&&z.k("Model constructor can only take one optional argument, the Array of node data.");z.kc(this);this.Kq=this.Ub="";this.Hi=!1;this.bz={};this.wf=[];this.vc=new na(null,Object);this.Wj="key";this.Qn=this.zo=null;this.Cq=this.Zu=!1;this.nq=null;this.wm="category";this.og=new na(null,K);this.Qj=null;this.Wi=!1;this.uz=null;this.pa=new Yf;void 0!==a&&(this.hg=a)}z.ia("Model",M); +M.prototype.cloneProtected=function(a){a.Ub=this.Ub;a.Kq=this.Kq;a.Hi=this.Hi;a.Wj=this.Wj;a.zo=this.zo;a.Qn=this.Qn;a.EJ=this.Zu;a.Cq=this.Cq;a.nq=this.nq;a.wm=this.wm};M.prototype.copy=function(){var a=new this.constructor;this.cloneProtected(a);return a};M.prototype.clear=M.prototype.clear=function(){this.wf=[];this.vc.clear();this.og.clear();this.pa.clear()};f=M.prototype; +f.toString=function(a){void 0===a&&(a=0);if(1<a)return this.YA();var b=(""!==this.name?this.name:"")+" Model";if(0<a){b+="\n node data:";a=this.hg;for(var c=z.ab(a),d=0;d<c;d++)var e=z.Ya(a,d),b=b+(" "+this.pb(e)+":"+ka(e))}return b}; +f.Bn=function(){var a="";""!==this.name&&(a+=',\n "name": '+this.quote(this.name));""!==this.Bl&&(a+=',\n "dataFormat": '+this.quote(this.Bl));this.ib&&(a+=',\n "isReadOnly": '+this.ib);"key"!==this.rj&&"string"===typeof this.rj&&(a+=',\n "nodeKeyProperty": '+this.quote(this.rj));this.Kz&&(a+=',\n "copiesArrays": true');this.Jz&&(a+=',\n "copiesArrayObjects": true');"category"!==this.pn&&"string"===typeof this.pn&&(a+=',\n "nodeCategoryProperty": '+this.quote(this.pn));return a}; +f.hu=function(a){a.name&&(this.name=a.name);a.dataFormat&&(this.Bl=a.dataFormat);a.isReadOnly&&(this.ib=a.isReadOnly);a.nodeKeyProperty&&(this.rj=a.nodeKeyProperty);a.copiesArrays&&(this.Kz=a.copiesArrays);a.copiesArrayObjects&&(this.Jz=a.copiesArrayObjects);a.nodeCategoryProperty&&(this.pn=a.nodeCategoryProperty)};function Zf(a){return',\n "modelData": '+$f(a,a.uk)}function ag(a,b){var c=b.modelData;z.Za(c)&&(a.ku(c),a.uk=c)} +f.gB=function(){var a=this.uk,b=!1,c;for(c in a)if(!bg(c,a[c])){b=!0;break}a="";b&&(a=Zf(this));return a+',\n "nodeDataArray": '+cg(this,this.hg,!0)};f.EA=function(a){ag(this,a);a=a.nodeDataArray;z.isArray(a)&&(this.ku(a),this.hg=a)}; +function dg(a,b,c,d){if(b===c)return!0;if(typeof b!==typeof c||"function"===typeof b||"function"===typeof c)return!1;if(Array.isArray(b)&&Array.isArray(c)){if(d.na(b)===c)return!0;d.add(b,c);if(b.length!==c.length)return!1;for(var e=0;e<b.length;e++)if(!dg(a,b[e],c[e],d))return!1;return!0}if(z.Za(b)&&z.Za(c)){if(d.na(b)===c)return!0;d.add(b,c);for(e in b){var g=b[e];if(!bg(e,g)){var h=c[e];if(void 0===h||!dg(a,g,h,d))return!1}}for(var k in c)if(h=c[k],!bg(k,h)&&(g=b[k],void 0===g||!dg(a,g,h,d)))return!1; +return!0}return!1}function pg(a,b,c){a[c]!==b[c]&&z.k("Model.computeJsonDifference: Model."+c+' is not the same in both models: "'+a[c]+'" and "'+b[c]+'"')} +f.hB=function(a){pg(this,a,"nodeKeyProperty");this instanceof qg&&pg(this,a,"nodeParentKeyProperty");for(var b=new K,c=new K,d=(new K).$c(this.vc.TE),e=new na,g=a.hg,h=0;h<g.length;h++){var k=g[h],l=a.pb(k);if(void 0!==l){d.remove(l);var m=this.ne(l);null===m?(b.add(l),c.add(k)):dg(this,m,k,e)||c.add(k)}else this.nA(k),l=this.pb(k),b.add(l),c.add(k)}g="";dg(this,this.uk,a.uk,e)||(g+=Zf(this));0<b.count&&(g+=this.ey+cg(this,b.jc(),!0));0<c.count&&(g+=this.pB+cg(this,c.jc(),!0));0<d.count&&(g+=this.hy+ +cg(this,d.jc(),!0));return g};M.prototype.computeJsonDifference=M.prototype.computeJSONDifference=function(a,b){z.l(a,M,M,"computeJsonDifference:newmodel");void 0===b&&(b=this.constructor===M?"go.Model":this.constructor===V?"go.GraphLinksModel":this.constructor===qg?"go.TreeModel":z.kf(this));return'{ "class": '+this.quote(b)+', "incremental": 1'+this.Bn()+this.hB(a)+"}"};f=M.prototype;f.ey=',\n "insertedNodeKeys": ';f.pB=',\n "modifiedNodeData": ';f.hy=',\n "removedNodeKeys": '; +f.fB=function(a,b){var c=this,d=!1,e=new K,g=new K,h=new K;a.Zf.each(function(a){a.ha===c&&("nodeDataArray"===a.rf?a.Dc===Wf?e.add(a.newValue):a.Dc===Xf&&h.add(a.oldValue):c.le(a.object)?g.add(a.object):c.uk===a.object&&a.Dc===Uf&&(d=!0))});var k=new K;e.each(function(a){k.add(c.pb(a));b||g.add(a)});var l=new K;h.each(function(a){l.add(c.pb(a));b&&g.add(a)});var m="";d&&(m+=Zf(this));0<k.count&&(m+=(b?this.hy:this.ey)+cg(this,k.jc(),!0));0<g.count&&(m+=this.pB+cg(this,g.jc(),!0));0<l.count&&(m+=(b? +this.ey:this.hy)+cg(this,l.jc(),!0));return m}; +f.DA=function(a){ag(this,a);var b=a.insertedNodeKeys;if(z.isArray(b))for(var c=z.ab(b),d=0;d<c;d++){var e=z.Ya(b,d),g=this.ne(e);null===g&&(g=this.copyNodeData({}),this.Nx(g,e),this.sl(g))}b=a.modifiedNodeData;if(z.isArray(b))for(c=z.ab(b),d=0;d<c;d++){var h=z.Ya(b,d),e=this.pb(h),g=this.ne(e);if(null!==g)for(var k in h)"__gohashid"!==k&&k!==this.rj&&this.setDataProperty(g,k,h[k])}a=a.removedNodeKeys;if(z.isArray(a))for(c=z.ab(a),d=0;d<c;d++)e=z.Ya(a,d),g=this.ne(e),null!==g&&this.Fx(g)}; +M.prototype.toIncrementalJson=M.prototype.toIncrementalJSON=function(a,b){z.l(a,Tf,M,"toIncrementalJson:e");a.Dc!==Vf&&z.k("Model.toIncrementalJson argument is not a Transaction ChangedEvent:"+a.toString());var c=a.object;if(!(a.SE&&c instanceof rg))return'{ "incremental": 0 }';void 0===b&&(b=this.constructor===M?"go.Model":this.constructor===V?"go.GraphLinksModel":this.constructor===qg?"go.TreeModel":z.kf(this));return'{ "class": '+this.quote(b)+', "incremental": 1'+this.Bn()+this.fB(c,"FinishedUndo"=== +a.propertyName)+"}"};M.prototype.toJson=M.prototype.toJSON=M.prototype.YA=function(a){void 0===a&&(a=this.constructor===M?"go.Model":this.constructor===V?"go.GraphLinksModel":this.constructor===qg?"go.TreeModel":z.kf(this));return'{ "class": '+this.quote(a)+this.Bn()+this.gB()+"}"}; +M.prototype.applyIncrementalJson=M.prototype.applyIncrementalJSON=function(a){var b=null;if("string"===typeof a)if(window.JSON&&window.JSON.parse)try{b=window.JSON.parse(a)}catch(c){u&&z.trace("JSON.parse error: "+c.toString())}else z.trace("WARNING: no JSON.parse available");else"object"===typeof a?b=a:z.k("Unable to modify a Model from: "+a);var d=b.incremental;"number"!==typeof d&&z.k("Unable to apply non-incremental changes to Model: "+a);0!==d&&(this.Wb("applyIncrementalJson"),this.DA(b),this.Jd("applyIncrementalJson"))}; +M.fromJson=M.fromJSON=function(a,b){void 0===b&&(b=null);null!==b&&z.l(b,M,M,"fromJson:model");var c=null;if("string"===typeof a)if(window.JSON&&window.JSON.parse)try{c=window.JSON.parse(a)}catch(d){u&&z.trace("JSON.parse error: "+d.toString())}else z.trace("WARNING: no JSON.parse available");else"object"===typeof a?c=a:z.k("Unable to construct a Model from: "+a);if(null===b){var e;e=null;var g=c["class"];if("string"===typeof g)try{var h=null;0===g.indexOf("go.")?(g=g.substr(3),h=aa[g]):(h=aa[g], +void 0===h&&(h=window[g]));"function"===typeof h&&(e=new h)}catch(k){}null===e||e instanceof M?b=e:z.k("Unable to construct a Model of declared class: "+c["class"])}null===b&&(b=new V);b.hu(c);b.EA(c);return b}; +M.prototype.replaceJsonObjects=M.prototype.ku=function(a){if(z.isArray(a))for(var b=z.ab(a),c=0;c<b;c++){var d=z.Ya(a,c);z.Za(d)&&z.LD(a,c,this.ku(d))}else if(z.Za(a)){for(c in a)if(d=a[c],z.Za(d)&&(d=this.ku(d),a[c]=d,"points"===c&&Array.isArray(d))){for(var e=0===d.length%2,g=0;g<d.length;g++)if("number"!==typeof d[g]){e=!1;break}if(e){e=new J(N);for(g=0;g<d.length/2;g++){var h=new N(d[2*g],d[2*g+1]);e.add(h)}e.freeze();a[c]=e}}if("object"===typeof a){c=a;d=a["class"];if("NaN"===d)c=NaN;else if("Date"=== +d)c=new Date(a.value);else if("go.Point"===d)c=new N(sg(a.x),sg(a.y));else if("go.Size"===d)c=new Ea(sg(a.width),sg(a.height));else if("go.Rect"===d)c=new w(sg(a.x),sg(a.y),sg(a.width),sg(a.height));else if("go.Margin"===d)c=new Db(sg(a.top),sg(a.right),sg(a.bottom),sg(a.left));else if("go.Spot"===d)c="string"===typeof a["enum"]?Ub(a["enum"]):new Q(sg(a.x),sg(a.y),sg(a.offsetX),sg(a.offsetY));else if("go.Brush"===d){if(c=new Da,c.type=Ja(Da,a.type),"string"===typeof a.color&&(c.color=a.color),a.start instanceof +Q&&(c.start=a.start),a.end instanceof Q&&(c.end=a.end),"number"===typeof a.startRadius&&(c.wu=sg(a.startRadius)),"number"===typeof a.endRadius&&(c.xt=sg(a.endRadius)),a=a.colorStops,z.Za(a))for(b in a)c.addColorStop(parseFloat(b),a[b])}else"go.Geometry"===d?(b=null,b="string"===typeof a.path?sf(a.path):new hf,b.type=Ja(hf,a.type),"number"===typeof a.startX&&(b.Ha=sg(a.startX)),"number"===typeof a.startY&&(b.Da=sg(a.startY)),"number"===typeof a.endX&&(b.L=sg(a.endX)),"number"===typeof a.endY&&(b.M= +sg(a.endY)),a.spot1 instanceof Q&&(b.C=a.spot1),a.spot2 instanceof Q&&(b.D=a.spot2),c=b):"go.EnumValue"===d&&(b=a.classType,0===b.indexOf("go.")&&(b=b.substr(3)),c=Ja(aa[b],a.name));a=c}}return a}; +M.prototype.quote=function(a){for(var b="",c=a.length,d=0;d<c;d++){var e=a[d];if('"'===e||"\\"===e)b+="\\"+e;else if("\b"===e)b+="\\b";else if("\f"===e)b+="\\f";else if("\n"===e)b+="\\n";else if("\r"===e)b+="\\r";else if("\t"===e)b+="\\t";else var g=a.charCodeAt(d),b=16>g?b+("\\u000"+a.charCodeAt(d).toString(16)):32>g?b+("\\u00"+a.charCodeAt(d).toString(16)):8232===g?b+"\\u2028":8233===g?b+"\\u2029":b+e}return'"'+b+'"'}; +M.prototype.writeJsonValue=M.prototype.Du=function(a){return void 0===a?"undefined":null===a?"null":!0===a?"true":!1===a?"false":"string"===typeof a?this.quote(a):"number"===typeof a?Infinity===a?"9e9999":-Infinity===a?"-9e9999":isNaN(a)?'{"class":"NaN"}':a.toString():a instanceof Date?'{"class":"Date", "value":"'+a.toJSON()+'"}':a instanceof Number?this.Du(a.valueOf()):z.isArray(a)?cg(this,a):z.Za(a)?$f(this,a):"function"===typeof a?"null":a.toString()}; +function cg(a,b,c){void 0===c&&(c=!1);var d=z.ab(b);if(0>=d)return"[]";var e=new za;e.add("[ ");c&&1<d&&e.add("\n");for(var g=0;g<d;g++){var h=z.Ya(b,g);void 0!==h&&(0<g&&(e.add(","),c&&e.add("\n")),e.add(a.Du(h)))}c&&1<d&&e.add("\n");e.add(" ]");return e.toString()}function bg(a,b){return void 0===b||"__gohashid"===a||"_"===a[0]||"function"===typeof b?!0:!1}function tg(a){return isNaN(a)?"NaN":Infinity===a?"9e9999":-Infinity===a?"-9e9999":a} +function $f(a,b){var c=b;if(c instanceof N){var d=c;b={"class":"go.Point",x:tg(d.x),y:tg(d.y)}}else if(c instanceof Ea){var e=c;b={"class":"go.Size",width:tg(e.width),height:tg(e.height)}}else if(c instanceof w)b={"class":"go.Rect",x:tg(c.x),y:tg(c.y),width:tg(c.width),height:tg(c.height)};else if(c instanceof Db)b={"class":"go.Margin",top:tg(c.top),right:tg(c.right),bottom:tg(c.bottom),left:tg(c.left)};else if(c instanceof Q)e=c,b=e.cd()?{"class":"go.Spot",x:tg(e.x),y:tg(e.y),offsetX:tg(e.offsetX), +offsetY:tg(e.offsetY)}:{"class":"go.Spot","enum":e.toString()};else if(c instanceof Da){b={"class":"go.Brush",type:c.type.name};if(c.type===ug)b.color=c.color;else if(c.type===vg||c.type===yd)b.start=c.start,b.end=c.end,c.type===yd&&(0!==c.wu&&(b.startRadius=tg(c.wu)),isNaN(c.xt)||(b.endRadius=tg(c.xt)));if(null!==c.st){for(var g={},h=c.st.i;h.next();)g[h.key]=h.value;b.colorStops=g}}else if(c instanceof hf)b={"class":"go.Geometry",type:c.type.name},0!==c.Ha&&(b.startX=tg(c.Ha)),0!==c.Da&&(b.startY= +tg(c.Da)),0!==c.L&&(b.endX=tg(c.L)),0!==c.M&&(b.endY=tg(c.M)),c.C.N(Zb)||(b.spot1=c.C),c.D.N(ic)||(b.spot2=c.D),c.type===jf&&(b.path=rf(c));else if(c instanceof Ba)b={"class":"go.EnumValue",classType:z.kf(c.Ae),name:c.name};else if(c instanceof O||c instanceof B||c instanceof wg||c instanceof M||c instanceof xg||c instanceof ra||c instanceof yg||c instanceof wa||c instanceof Yf||c instanceof rg)return z.trace("ERROR: trying to convert a GraphObject or Diagram or Model or Tool or Layout or UndoManager into JSON text: "+ +c.toString()),"{}";g="{";c=!0;for(d in b)if(e=z.tb(b,d),!bg(d,e))if(c?c=!1:g+=", ",g+='"'+d+'":',"points"===d&&e instanceof J&&e.ba===N){h=e;e="[";for(h=h.i;h.next();){var k=h.value;1<e.length&&(e+=",");e+=a.Du(k.x);e+=",";e+=a.Du(k.y)}e+="]";g+=e}else g+=a.Du(e);return g+"}"}function sg(a){return"number"===typeof a?a:"NaN"===a?NaN:"9e9999"===a?Infinity:"-9e9999"===a?-Infinity:parseFloat(a)} +z.defineProperty(M,{name:"name"},function(){return this.Ub},function(a){var b=this.Ub;b!==a&&(z.g(a,"string",M,"name"),this.Ub=a,this.j("name",b,a))});z.defineProperty(M,{Bl:"dataFormat"},function(){return this.Kq},function(a){var b=this.Kq;b!==a&&(z.g(a,"string",M,"dataFormat"),this.Kq=a,this.j("dataFormat",b,a))});z.defineProperty(M,{ib:"isReadOnly"},function(){return this.Hi},function(a){var b=this.Hi;b!==a&&(z.g(a,"boolean",M,"isReadOnly"),this.Hi=a,this.j("isReadOnly",b,a))}); +z.defineProperty(M,{uk:"modelData"},function(){return this.bz},function(a){var b=this.bz;b!==a&&(z.g(a,"object",M,"modelData"),this.bz=a,this.j("modelData",b,a),this.Mb(a))});M.prototype.addChangedListener=M.prototype.Qm=function(a){z.g(a,"function",M,"addChangedListener:listener");null===this.Qj&&(this.Qj=new J("function"));this.Qj.add(a)}; +M.prototype.removeChangedListener=M.prototype.iu=function(a){z.g(a,"function",M,"removeChangedListener:listener");null!==this.Qj&&(this.Qj.remove(a),0===this.Qj.count&&(this.Qj=null))};M.prototype.Kw=function(a){this.Bb||this.pa.CE(a);if(null!==this.Qj){var b=this.Qj,c=b.length;if(1===c)b=b.ea(0),b(a);else if(0!==c)for(var d=b.jc(),e=0;e<c;e++)b=d[e],b(a)}};M.prototype.raiseChangedEvent=M.prototype.Rc=function(a,b,c,d,e,g,h){zg(this,"",a,b,c,d,e,g,h)}; +M.prototype.raiseChanged=M.prototype.j=function(a,b,c,d,e){zg(this,"",Uf,a,this,b,c,d,e)};M.prototype.raiseDataChanged=M.prototype.CA=function(a,b,c,d,e,g){zg(this,"",Uf,b,a,c,d,e,g)};function zg(a,b,c,d,e,g,h,k,l){void 0===k&&(k=null);void 0===l&&(l=null);var m=new Tf;m.ha=a;m.Dc=c;m.rf=b;m.propertyName=d;m.object=e;m.oldValue=g;m.Ng=k;m.newValue=h;m.Lg=l;a.Kw(m)} +z.defineProperty(M,{pa:"undoManager"},function(){return this.uz},function(a){var b=this.uz;b!==a&&(z.l(a,Yf,M,"undoManager"),null!==b&&b.XI(this),this.uz=a,null!==a&&a.OG(this))});z.defineProperty(M,{Bb:"skipsUndoManager"},function(){return this.Wi},function(a){z.g(a,"boolean",M,"skipsUndoManager");this.Wi=a}); +M.prototype.Um=function(a,b){if(null!==a&&a.ha===this)if(a.Dc===Uf){var c=a.object,d=a.propertyName,e=a.na(b);z.Ra(c,d,e)}else a.Dc===Wf?"nodeDataArray"===a.rf?(c=a.newValue,z.Za(c)&&(d=this.pb(c),void 0!==d&&(b?(z.ii(this.wf,a.Lg),this.vc.remove(d)):(z.bj(this.wf,a.Lg,c),this.vc.add(d,c))))):""===a.rf?(c=a.object,!z.isArray(c)&&a.propertyName&&(c=z.tb(a.object,a.propertyName)),z.isArray(c)&&(d=a.newValue,e=a.Lg,b?z.ii(c,e):z.bj(c,e,d))):z.k("unknown ChangedEvent.Insert object: "+a.toString()):a.Dc=== +Xf?"nodeDataArray"===a.rf?(c=a.oldValue,z.Za(c)&&(d=this.pb(c),void 0!==d&&(b?(z.bj(this.wf,a.Ng,c),this.vc.add(d,c)):(z.ii(this.wf,a.Ng),this.vc.remove(d))))):""===a.rf?(c=a.object,!z.isArray(c)&&a.propertyName&&(c=z.tb(a.object,a.propertyName)),z.isArray(c)&&(d=a.oldValue,e=a.Ng,b?z.bj(c,e,d):z.ii(c,e))):z.k("unknown ChangedEvent.Remove object: "+a.toString()):a.Dc!==Vf&&z.k("unknown ChangedEvent: "+a.toString())};M.prototype.startTransaction=M.prototype.Wb=function(a){return this.pa.Wb(a)}; +M.prototype.commitTransaction=M.prototype.Jd=function(a){return this.pa.Jd(a)};M.prototype.rollbackTransaction=M.prototype.Vp=function(){return this.pa.Vp()};M.prototype.updateTargetBindings=M.prototype.Mb=function(a,b){void 0===b&&(b="");zg(this,"SourceChanged",Vf,b,a,null,null)}; +z.defineProperty(M,{rj:"nodeKeyProperty"},function(){return this.Wj},function(a){var b=this.Wj;b!==a&&(Ag(a,M,"nodeKeyProperty"),""===a&&z.k("Model.nodeKeyProperty may not be the empty string"),0<this.vc.count&&z.k("Cannot set Model.nodeKeyProperty when there is existing node data"),this.Wj=a,this.j("nodeKeyProperty",b,a))});function Ag(a,b,c){"string"!==typeof a&&"function"!==typeof a&&z.ic(a,"string or function",b,c)} +M.prototype.getKeyForNodeData=M.prototype.pb=function(a){if(null!==a){var b=this.Wj;if(""!==b&&(b=z.tb(a,b),void 0!==b)){if(Bg(b))return b;z.k("Key value for node data "+a+" is not a number or a string: "+b)}}}; +M.prototype.setKeyForNodeData=M.prototype.Nx=function(a,b){void 0!==b&&null!==b&&Bg(b)||z.ic(b,"number or string",M,"setKeyForNodeData:key");if(null!==a){var c=this.Wj;if(""!==c)if(this.le(a)){var d=z.tb(a,c);d!==b&&null===this.ne(b)&&(z.Ra(a,c,b),this.vc.remove(d),this.vc.add(b,a),zg(this,"nodeKey",Uf,c,a,d,b),"string"===typeof c&&this.Mb(a,c),this.ju(d,b))}else z.Ra(a,c,b)}}; +z.defineProperty(M,{OK:"makeUniqueKeyFunction"},function(){return this.zo},function(a){var b=this.zo;b!==a&&(null!==a&&z.g(a,"function",M,"makeUniqueKeyFunction"),this.zo=a,this.j("makeUniqueKeyFunction",b,a))});function Bg(a){return"number"===typeof a||"string"===typeof a}M.prototype.containsNodeData=M.prototype.le=function(a){var b=this.pb(a);return void 0===b?!1:this.vc.na(b)===a}; +M.prototype.findNodeDataForKey=M.prototype.ne=function(a){null===a&&z.k("Model.findNodeDataForKey:key must not be null");return void 0!==a&&Bg(a)?this.vc.na(a):null}; +z.defineProperty(M,{hg:"nodeDataArray"},function(){return this.wf},function(a){var b=this.wf;if(b!==a){z.nt(a,M,"nodeDataArray");this.vc.clear();this.bB();for(var c=z.ab(a),d=0;d<c;d++){var e=z.Ya(a,d);if(!z.Za(e)){z.k("Model.nodeDataArray must only contain Objects, not: "+e);return}z.It(e)}this.wf=a;for(var g=new J(Object),d=0;d<c;d++){var e=z.Ya(a,d),h=this.pb(e);void 0===h?g.add(e):null!==this.vc.na(h)?g.add(e):this.vc.add(h,e)}for(d=g.i;d.next();)e=d.value,this.nA(e),g=this.pb(e),void 0!==g&& +this.vc.add(g,e);zg(this,"nodeDataArray",Uf,"nodeDataArray",this,b,a);for(d=0;d<c;d++)e=z.Ya(a,d),this.Up(e),this.Tp(e);this.QD();z.fI(a)||(this.ib=!0)}}); +M.prototype.makeNodeDataKeyUnique=M.prototype.nA=function(a){if(null!==a){var b=this.Wj;if(""!==b){var c=this.pb(a);if(void 0===c||this.vc.contains(c)){var d=this.zo;if(null!==d&&(c=d(this,a),void 0!==c&&null!==c&&!this.vc.contains(c))){z.Ra(a,b,c);return}if("string"===typeof c){for(d=2;this.vc.contains(c+d);)d++;z.Ra(a,b,c+d)}else if(void 0===c||"number"===typeof c){for(d=-this.vc.count-1;this.vc.contains(d);)d--;z.Ra(a,b,d)}else z.k("Model.getKeyForNodeData returned something other than a string or a number: "+ +c)}}}};M.prototype.addNodeData=M.prototype.sl=function(a){null!==a&&(z.It(a),Cg(this,a,!0))};function Cg(a,b,c){var d=a.pb(b);if(void 0===d||a.vc.na(d)!==b)if(a.nA(b),d=a.pb(b),void 0===d)z.k("Model.makeNodeDataKeyUnique failed on "+b+". Data not added to Model.");else{a.vc.add(d,b);if(c){var e=z.ab(a.wf);z.bj(a.wf,e,b)}zg(a,"nodeDataArray",Wf,"nodeDataArray",a,null,b,null,e);a.Up(b);a.Tp(b)}} +M.prototype.addNodeDataCollection=function(a){if(z.isArray(a))for(var b=z.ab(a),c=0;c<b;c++)this.sl(z.Ya(a,c));else for(a=a.i;a.next();)this.sl(a.value)};M.prototype.removeNodeData=M.prototype.Fx=function(a){null!==a&&Dg(this,a,!0)};function Dg(a,b,c){var d=a.pb(b);if(void 0!==d&&a.vc.contains(d)){a.vc.remove(d);if(c){var e=z.Ez(a.wf,b);if(0>e)return;z.ii(a.wf,e)}zg(a,"nodeDataArray",Xf,"nodeDataArray",a,b,null,e,null);a.Bu(b)}} +M.prototype.removeNodeDataCollection=function(a){if(z.isArray(a))for(var b=z.ab(a),c=0;c<b;c++)this.Fx(z.Ya(a,c));else for(a=a.i;a.next();)this.Fx(a.value)};f=M.prototype;f.ju=function(a,b){var c=Eg(this,a);c instanceof K&&this.og.add(b,c)};f.bB=function(){};f.Up=function(){};f.Tp=function(){};f.Bu=function(){};function Fg(a,b,c){if(void 0!==b){var d=a.og.na(b);null===d&&(d=new K(Object),a.og.add(b,d));d.add(c)}} +function Gg(a,b,c){if(void 0!==b){var d=a.og.na(b);d instanceof K&&(void 0===c||null===c?a.og.remove(b):(d.remove(c),0===d.count&&a.og.remove(b)))}}function Eg(a,b){if(void 0===b)return null;var c=a.og.na(b);return c instanceof K?c:null}M.prototype.clearUnresolvedReferences=M.prototype.QD=function(a){void 0===a?this.og.clear():this.og.remove(a)}; +z.defineProperty(M,{fK:"copyNodeDataFunction"},function(){return this.Qn},function(a){var b=this.Qn;b!==a&&(null!==a&&z.g(a,"function",M,"copyNodeDataFunction"),this.Qn=a,this.j("copyNodeDataFunction",b,a))});z.defineProperty(M,{Kz:"copiesArrays"},function(){return this.Zu},function(a){var b=this.Zu;b!==a&&(null!==a&&z.g(a,"boolean",M,"copiesArrays"),this.Zu=a,this.j("copiesArrays",b,a))}); +z.defineProperty(M,{Jz:"copiesArrayObjects"},function(){return this.Cq},function(a){var b=this.Cq;b!==a&&(null!==a&&z.g(a,"boolean",M,"copiesArrayObjects"),this.Cq=a,this.j("copiesArrayObjects",b,a))});M.prototype.copyNodeData=function(a){if(null===a)return null;var b=null,b=this.Qn,b=null!==b?b(a,this):Hg(this,a,!0);z.Za(b)&&z.kc(b);return b}; +function Hg(a,b,c){if(a.Kz&&Array.isArray(b)){var d=[];for(c=0;c<b.length;c++){var e=Hg(a,b[c],a.Jz);d.push(e)}z.kc(d);return d}if(c&&z.Za(b)){c=(c=b.constructor)?new c:{};for(d in b)if("__gohashid"!==d){var e=z.tb(b,d),g;g=e;g instanceof O||g instanceof B||g instanceof wg||g instanceof Ig||g instanceof Jg||g instanceof xg||g instanceof ra||g instanceof yg||g instanceof Rf||g instanceof Sf?("_"!==d[0]&&z.trace('Warning: found GraphObject or Diagram reference when copying model data on property "'+ +d+'" of data object: '+b.toString()+" \nModel data should not have any references to a Diagram or any part of a diagram, such as: "+g.toString()),g=!0):g=g instanceof M||g instanceof Yf||g instanceof rg||g instanceof Tf?!0:!1;g||(e=Hg(a,e,!1));z.Ra(c,d,e)}z.kc(c);return c}return b instanceof N?b.copy():b instanceof Ea?b.copy():b instanceof w?b.copy():b instanceof Q?b.copy():b instanceof Db?b.copy():b} +z.defineProperty(M,{QG:"afterCopyFunction"},function(){return this.nq},function(a){var b=this.nq;b!==a&&(null!==a&&z.g(a,"function",M,"afterCopyFunction"),this.nq=a,this.j("afterCopyFunction",b,a))});var Kg=!1; +M.prototype.setDataProperty=function(a,b,c){u&&(z.g(a,"object",M,"setDataProperty:data"),z.g(b,"string",M,"setDataProperty:propname"),""===b&&z.k("Model.setDataProperty: property name must not be an empty string when setting "+a+" to "+c));if(this.le(a))if(b===this.rj)this.Nx(a,c);else{if(b===this.pn){this.Kx(a,c);return}}else!Kg&&a instanceof O&&(Kg=!0,z.trace('Model.setDataProperty is modifying a GraphObject, "'+a.toString()+'"'),z.trace(" Is that really your intent?"));var d=z.tb(a,b);d!==c&& +(z.Ra(a,b,c),this.CA(a,b,d,c))};M.prototype.addArrayItem=function(a,b){this.bI(a,-1,b)};M.prototype.insertArrayItem=M.prototype.bI=function(a,b,c){u&&(z.nt(a,M,"insertArrayItem:arr"),z.p(b,M,"insertArrayItem:idx"));a===this.wf&&z.k("Model.insertArrayItem or Model.addArrayItem should not be called on the Model.nodeDataArray");0>b&&(b=z.ab(a));z.bj(a,b,c);zg(this,"",Wf,"",a,null,c,null,b)}; +M.prototype.removeArrayItem=function(a,b){void 0===b&&(b=-1);u&&(z.nt(a,M,"removeArrayItem:arr"),z.p(b,M,"removeArrayItem:idx"));a===this.wf&&z.k("Model.removeArrayItem should not be called on the Model.nodeDataArray");-1===b&&(b=z.ab(a)-1);var c=z.Ya(a,b);z.ii(a,b);zg(this,"",Xf,"",a,c,null,b,null)};z.defineProperty(M,{pn:"nodeCategoryProperty"},function(){return this.wm},function(a){var b=this.wm;b!==a&&(Ag(a,M,"nodeCategoryProperty"),this.wm=a,this.j("nodeCategoryProperty",b,a))}); +M.prototype.getCategoryForNodeData=M.prototype.Zz=function(a){if(null===a)return"";var b=this.wm;if(""===b)return"";b=z.tb(a,b);if(void 0===b)return"";if("string"===typeof b)return b;z.k("getCategoryForNodeData found a non-string category for "+a+": "+b);return""}; +M.prototype.setCategoryForNodeData=M.prototype.Kx=function(a,b){z.g(b,"string",M,"setCategoryForNodeData:cat");if(null!==a){var c=this.wm;if(""!==c)if(this.le(a)){var d=z.tb(a,c);void 0===d&&(d="");d!==b&&(z.Ra(a,c,b),zg(this,"nodeCategory",Uf,c,a,d,b))}else z.Ra(a,c,b)}}; +function V(a,b){2<arguments.length&&z.k("GraphLinksModel constructor can only take two optional arguments, the Array of node data and the Array of link data.");M.call(this);this.vf=[];this.rm=new K(Object);this.hd=new na(null,Object);this.el="";this.Nk=this.Pn=this.Ao=null;this.Vh="from";this.Wh="to";this.tm=this.sm="";this.qm="category";this.vg="";this.Do="isGroup";this.kh="group";this.Dq=!1;void 0!==a&&(this.hg=a);void 0!==b&&(this.Kg=b)}z.Qa(V,M);z.ia("GraphLinksModel",V); +V.prototype.cloneProtected=function(a){M.prototype.cloneProtected.call(this,a);a.el=this.el;a.Ao=this.Ao;a.Pn=this.Pn;a.Vh=this.Vh;a.Wh=this.Wh;a.sm=this.sm;a.tm=this.tm;a.qm=this.qm;a.vg=this.vg;a.Do=this.Do;a.kh=this.kh;a.Dq=this.Dq};V.prototype.clear=V.prototype.clear=function(){M.prototype.clear.call(this);this.vf=[];this.hd.clear();this.rm.clear()};f=V.prototype; +f.toString=function(a){void 0===a&&(a=0);if(2<=a)return this.YA();var b=(""!==this.name?this.name:"")+" GraphLinksModel";if(0<a){b+="\n node data:";a=this.hg;for(var c=z.ab(a),d=0,d=0;d<c;d++)var e=z.Ya(a,d),b=b+(" "+this.pb(e)+":"+ka(e));b+="\n link data:";a=this.Kg;c=z.ab(a);for(d=0;d<c;d++)e=z.Ya(a,d),b+=" "+this.Ll(e)+"--\x3e"+this.Ml(e)}return b}; +f.Bn=function(){var a=M.prototype.Bn.call(this),b="";"category"!==this.Wt&&"string"===typeof this.Wt&&(b+=',\n "linkCategoryProperty": '+this.quote(this.Wt));""!==this.pj&&"string"===typeof this.pj&&(b+=',\n "linkKeyProperty": '+this.quote(this.pj));"from"!==this.Ep&&"string"===typeof this.Ep&&(b+=',\n "linkFromKeyProperty": '+this.quote(this.Ep));"to"!==this.Gp&&"string"===typeof this.Gp&&(b+=',\n "linkToKeyProperty": '+this.quote(this.Gp));""!==this.Xt&&"string"===typeof this.Xt&&(b+=',\n "linkFromPortIdProperty": '+ +this.quote(this.Xt));""!==this.Zt&&"string"===typeof this.Zt&&(b+=',\n "linkToPortIdProperty": '+this.quote(this.Zt));""!==this.Yt&&"string"===typeof this.Yt&&(b+=',\n "linkLabelKeysProperty": '+this.quote(this.Yt));"isGroup"!==this.eu&&"string"===typeof this.eu&&(b+=',\n "nodeIsGroupProperty": '+this.quote(this.eu));"group"!==this.Pp&&"string"===typeof this.Pp&&(b+=',\n "nodeGroupKeyProperty": '+this.quote(this.Pp));return a+b}; +f.hu=function(a){M.prototype.hu.call(this,a);a.linkKeyProperty&&(this.pj=a.linkKeyProperty);a.linkFromKeyProperty&&(this.Ep=a.linkFromKeyProperty);a.linkToKeyProperty&&(this.Gp=a.linkToKeyProperty);a.linkFromPortIdProperty&&(this.Xt=a.linkFromPortIdProperty);a.linkToPortIdProperty&&(this.Zt=a.linkToPortIdProperty);a.linkCategoryProperty&&(this.Wt=a.linkCategoryProperty);a.linkLabelKeysProperty&&(this.Yt=a.linkLabelKeysProperty);a.nodeIsGroupProperty&&(this.eu=a.nodeIsGroupProperty);a.nodeGroupKeyProperty&& +(this.Pp=a.nodeGroupKeyProperty)};f.gB=function(){var a=M.prototype.gB.call(this),b=',\n "linkDataArray": '+cg(this,this.Kg,!0);return a+b};f.EA=function(a){M.prototype.EA.call(this,a);a=a.linkDataArray;z.isArray(a)&&(this.ku(a),this.Kg=a)}; +f.hB=function(a){a instanceof V||z.k("Model.computeJsonDifference: newmodel must be a GraphLinksModel");""===this.pj&&z.k("GraphLinksModel.linkKeyProperty must not be an empty string for .computeJsonDifference() to succeed.");var b=M.prototype.hB.call(this,a);pg(this,a,"linkKeyProperty");pg(this,a,"linkFromKeyProperty");pg(this,a,"linkToKeyProperty");pg(this,a,"linkLabelKeysProperty");pg(this,a,"nodeIsGroupProperty");pg(this,a,"nodeGroupKeyProperty");for(var c=new K,d=new K,e=(new K).$c(this.hd.TE), +g=new na,h=a.Kg,k=0;k<h.length;k++){var l=h[k],m=a.lf(l);if(void 0!==m){e.remove(m);var n=this.At(m);null===n?(c.add(m),d.add(l)):dg(this,n,l,g)||d.add(l)}else this.mA(l),m=this.lf(l),c.add(m),d.add(l)}a=b;0<c.count&&(a+=this.by+cg(this,c.jc(),!0));0<d.count&&(a+=this.oB+cg(this,d.jc(),!0));0<e.count&&(a+=this.gy+cg(this,e.jc(),!0));return a};f.by=',\n "insertedLinkKeys": ';f.oB=',\n "modifiedLinkData": ';f.gy=',\n "removedLinkKeys": '; +f.fB=function(a,b){""===this.pj&&z.k("GraphLinksModel.linkKeyProperty must not be an empty string for .toIncrementalJson() to succeed.");var c=M.prototype.fB.call(this,a,b),d=this,e=new K,g=new K,h=new K;a.Zf.each(function(a){a.ha===d&&("linkDataArray"===a.rf?a.Dc===Wf?e.add(a.newValue):a.Dc===Xf&&h.add(a.oldValue):d.th(a.object)&&g.add(a.object))});var k=new K;e.each(function(a){k.add(d.lf(a));b||g.add(a)});var l=new K;h.each(function(a){l.add(d.lf(a));b&&g.add(a)});0<k.count&&(c+=(b?this.gy:this.by)+ +cg(this,k.jc(),!0));0<g.count&&(c+=this.oB+cg(this,g.jc(),!0));0<l.count&&(c+=(b?this.by:this.gy)+cg(this,l.jc(),!0));return c}; +f.DA=function(a){M.prototype.DA.call(this,a);var b=a.insertedLinkKeys;if(z.isArray(b))for(var c=z.ab(b),d=0;d<c;d++){var e=z.Ya(b,d),g=this.At(e);null===g&&(g=this.Pw({}),this.IF(g,e),this.gt(g))}b=a.modifiedLinkData;if(z.isArray(b))for(c=z.ab(b),d=0;d<c;d++){var h=z.Ya(b,d),e=this.lf(h),g=this.At(e);if(null!==g)for(var k in h)"__gohashid"!==k&&k!==this.pj&&this.setDataProperty(g,k,h[k])}a=a.removedLinkKeys;if(z.isArray(a))for(c=z.ab(a),d=0;d<c;d++)e=z.Ya(a,d),g=this.At(e),null!==g&&this.Ex(g)}; +f.Um=function(a,b){var c=null;if(a.Dc===Wf){if("linkDataArray"===a.rf?c=this.vf:"linkLabelKeys"===a.rf&&(c=this.rk(a.object)),z.isArray(c)){if(b)z.ii(c,a.Lg),c===this.vf&&(c=this.lf(a.newValue),void 0!==c&&this.hd.remove(c));else if(z.bj(c,a.Lg,a.newValue),c===this.vf){var d=a.newValue,c=this.lf(d);void 0!==c&&this.hd.add(c,d)}return}}else if(a.Dc===Xf&&("linkDataArray"===a.rf?c=this.vf:"linkLabelKeys"===a.rf&&(c=this.rk(a.object)),z.isArray(c))){b?(z.bj(c,a.Ng,a.oldValue),c===this.vf&&(d=a.newValue, +c=this.lf(d),void 0!==c&&this.hd.add(c,d))):(z.ii(c,a.Ng),c===this.vf&&(c=this.lf(a.newValue),void 0!==c&&this.hd.remove(c)));return}M.prototype.Um.call(this,a,b)};z.defineProperty(V,{Dz:"archetypeNodeData"},function(){return this.Nk},function(a){var b=this.Nk;b!==a&&(null!==a&&z.l(a,Object,V,"archetypeNodeData"),this.Nk=a,this.j("archetypeNodeData",b,a))});V.prototype.on=function(a){if(void 0!==a){var b=this.Nk;if(null!==b){var c=this.ne(a);null===c&&(c=this.copyNodeData(b),z.Ra(c,this.Wj,a),this.sl(c))}return a}}; +z.defineProperty(V,{Ep:"linkFromKeyProperty"},function(){return this.Vh},function(a){var b=this.Vh;b!==a&&(Ag(a,V,"linkFromKeyProperty"),this.Vh=a,this.j("linkFromKeyProperty",b,a))});V.prototype.getFromKeyForLinkData=V.prototype.Ll=function(a){if(null!==a){var b=this.Vh;if(""!==b&&(b=z.tb(a,b),void 0!==b)){if(Bg(b))return b;z.k("FromKey value for link data "+a+" is not a number or a string: "+b)}}}; +V.prototype.setFromKeyForLinkData=V.prototype.Lx=function(a,b){null===b&&(b=void 0);void 0===b||Bg(b)||z.ic(b,"number or string",V,"setFromKeyForLinkData:key");if(null!==a){var c=this.Vh;if(""!==c)if(b=this.on(b),this.th(a)){var d=z.tb(a,c);d!==b&&(Gg(this,d,a),z.Ra(a,c,b),null===this.ne(b)&&Fg(this,b,a),zg(this,"linkFromKey",Uf,c,a,d,b),"string"===typeof c&&this.Mb(a,c))}else z.Ra(a,c,b)}}; +z.defineProperty(V,{Gp:"linkToKeyProperty"},function(){return this.Wh},function(a){var b=this.Wh;b!==a&&(Ag(a,V,"linkToKeyProperty"),this.Wh=a,this.j("linkToKeyProperty",b,a))});V.prototype.getToKeyForLinkData=V.prototype.Ml=function(a){if(null!==a){var b=this.Wh;if(""!==b&&(b=z.tb(a,b),void 0!==b)){if(Bg(b))return b;z.k("ToKey value for link data "+a+" is not a number or a string: "+b)}}}; +V.prototype.setToKeyForLinkData=V.prototype.Px=function(a,b){null===b&&(b=void 0);void 0===b||Bg(b)||z.ic(b,"number or string",V,"setToKeyForLinkData:key");if(null!==a){var c=this.Wh;if(""!==c)if(b=this.on(b),this.th(a)){var d=z.tb(a,c);d!==b&&(Gg(this,d,a),z.Ra(a,c,b),null===this.ne(b)&&Fg(this,b,a),zg(this,"linkToKey",Uf,c,a,d,b),"string"===typeof c&&this.Mb(a,c))}else z.Ra(a,c,b)}}; +z.defineProperty(V,{Xt:"linkFromPortIdProperty"},function(){return this.sm},function(a){var b=this.sm;b!==a&&(Ag(a,V,"linkFromPortIdProperty"),this.sm=a,this.j("linkFromPortIdProperty",b,a))});V.prototype.getFromPortIdForLinkData=V.prototype.LH=function(a){if(null===a)return"";var b=this.sm;if(""===b)return"";a=z.tb(a,b);return void 0===a?"":a}; +V.prototype.setFromPortIdForLinkData=V.prototype.OA=function(a,b){z.g(b,"string",V,"setFromPortIdForLinkData:portname");if(null!==a){var c=this.sm;if(""!==c)if(this.th(a)){var d=z.tb(a,c);void 0===d&&(d="");d!==b&&(z.Ra(a,c,b),zg(this,"linkFromPortId",Uf,c,a,d,b),"string"===typeof c&&this.Mb(a,c))}else z.Ra(a,c,b)}};z.defineProperty(V,{Zt:"linkToPortIdProperty"},function(){return this.tm},function(a){var b=this.tm;b!==a&&(Ag(a,V,"linkToPortIdProperty"),this.tm=a,this.j("linkToPortIdProperty",b,a))}); +V.prototype.getToPortIdForLinkData=V.prototype.OH=function(a){if(null===a)return"";var b=this.tm;if(""===b)return"";a=z.tb(a,b);return void 0===a?"":a};V.prototype.setToPortIdForLinkData=V.prototype.RA=function(a,b){z.g(b,"string",V,"setToPortIdForLinkData:portname");if(null!==a){var c=this.tm;if(""!==c)if(this.th(a)){var d=z.tb(a,c);void 0===d&&(d="");d!==b&&(z.Ra(a,c,b),zg(this,"linkToPortId",Uf,c,a,d,b),"string"===typeof c&&this.Mb(a,c))}else z.Ra(a,c,b)}}; +z.defineProperty(V,{Yt:"linkLabelKeysProperty"},function(){return this.vg},function(a){var b=this.vg;b!==a&&(Ag(a,V,"linkLabelKeysProperty"),this.vg=a,this.j("linkLabelKeysProperty",b,a))});V.prototype.getLabelKeysForLinkData=V.prototype.rk=function(a){if(null===a)return z.yj;var b=this.vg;if(""===b)return z.yj;a=z.tb(a,b);return void 0===a?z.yj:a}; +V.prototype.setLabelKeysForLinkData=V.prototype.JF=function(a,b){z.nt(b,V,"setLabelKeysForLinkData:arr");if(null!==a){var c=this.vg;if(""!==c)if(this.th(a)){var d=z.tb(a,c);void 0===d&&(d=z.yj);if(d!==b){for(var e=z.ab(d),g=0;g<e;g++){var h=z.Ya(d,g);Gg(this,h,a)}z.Ra(a,c,b);e=z.ab(b);for(g=0;g<e;g++)h=z.Ya(b,g),null===this.ne(h)&&Fg(this,h,a);zg(this,"linkLabelKeys",Uf,c,a,d,b);"string"===typeof c&&this.Mb(a,c)}}else z.Ra(a,c,b)}}; +V.prototype.addLabelKeyForLinkData=V.prototype.Az=function(a,b){if(null!==b&&void 0!==b&&(Bg(b)||z.ic(b,"number or string",V,"addLabelKeyForLinkData:key"),null!==a)){var c=this.vg;if(""!==c){var d=z.tb(a,c);void 0===d?(c=[],c.push(b),this.JF(a,c)):z.isArray(d)?0<=z.Ez(d,b)||(z.bj(d,Infinity,b),this.th(a)&&(null===this.ne(b)&&Fg(this,b,a),zg(this,"linkLabelKeys",Wf,c,a,null,b))):z.k(c+" property is not an Array; cannot addLabelKeyForLinkData: "+a)}}}; +V.prototype.removeLabelKeyForLinkData=V.prototype.mF=function(a,b){if(null!==b&&void 0!==b&&(Bg(b)||z.ic(b,"number or string",V,"removeLabelKeyForLinkData:key"),null!==a)){var c=this.vg;if(""!==c){var d=z.tb(a,c);if(z.isArray(d)){var e=z.Ez(d,b);0>e||(z.ii(d,e),this.th(a)&&(Gg(this,b,a),zg(this,"linkLabelKeys",Xf,c,a,b,null)))}else void 0!==d&&z.k(c+" property is not an Array; cannot removeLabelKeyforLinkData: "+a)}}}; +z.defineProperty(V,{Kg:"linkDataArray"},function(){return this.vf},function(a){var b=this.vf;if(b!==a){z.nt(a,V,"linkDataArray");this.hd.clear();for(var c=z.ab(a),d=0;d<c;d++){var e=z.Ya(a,d);if(!z.Za(e)){z.k("GraphLinksModel.linkDataArray must only contain Objects, not: "+e);return}z.It(e)}this.vf=a;if(""!==this.pj){for(var g=new J(Object),d=0;d<c;d++){var e=z.Ya(a,d),h=this.lf(e);void 0===h?g.add(e):null!==this.hd.na(h)?g.add(e):this.hd.add(h,e)}for(d=g.i;d.next();)e=d.value,this.mA(e),g=this.lf(e), +void 0!==g&&this.hd.add(g,e)}g=new K(Object);for(d=0;d<c;d++)e=z.Ya(a,d),g.add(e);this.rm=g;zg(this,"linkDataArray",Uf,"linkDataArray",this,b,a);for(d=0;d<c;d++)e=z.Ya(a,d),Lg(this,e)}});z.defineProperty(V,{pj:"linkKeyProperty"},function(){return this.el},function(a){var b=this.el;if(b!==a){Ag(a,V,"linkKeyProperty");this.el=a;this.hd.clear();for(var c=z.ab(this.Kg),d=0;d<c;d++){var e=z.Ya(this.Kg,d),g=this.lf(e);void 0!==g&&this.hd.add(g,e)}this.j("linkKeyProperty",b,a)}}); +V.prototype.getKeyForLinkData=V.prototype.lf=function(a){if(null!==a){var b=this.el;if(""!==b&&(b=z.tb(a,b),void 0!==b)){if(Bg(b))return b;z.k("Key value for link data "+a+" is not a number or a string: "+b)}}}; +V.prototype.setKeyForLinkData=V.prototype.IF=function(a,b){void 0!==b&&null!==b&&Bg(b)||z.ic(b,"number or string",V,"setKeyForLinkData:key");if(null!==a){var c=this.el;if(""!==c)if(this.th(a)){var d=z.tb(a,c);d!==b&&null===this.At(b)&&(z.Ra(a,c,b),this.hd.remove(d),this.hd.add(b,a),zg(this,"linkKey",Uf,c,a,d,b),"string"===typeof c&&this.Mb(a,c))}else z.Ra(a,c,b)}}; +z.defineProperty(V,{PK:"makeUniqueLinkKeyFunction"},function(){return this.Ao},function(a){var b=this.Ao;b!==a&&(null!==a&&z.g(a,"function",V,"makeUniqueLinkKeyFunction"),this.Ao=a,this.j("makeUniqueLinkKeyFunction",b,a))});V.prototype.findLinkDataForKey=V.prototype.At=function(a){null===a&&z.k("GraphLinksModel.findLinkDataForKey:key must not be null");return void 0!==a&&Bg(a)?this.hd.na(a):null}; +V.prototype.makeLinkDataKeyUnique=V.prototype.mA=function(a){if(null!==a){var b=this.el;if(""!==b){var c=this.lf(a);if(void 0===c||this.hd.contains(c)){var d=this.Ao;if(null!==d&&(c=d(this,a),void 0!==c&&null!==c&&!this.hd.contains(c))){z.Ra(a,b,c);return}if("string"===typeof c){for(d=2;this.hd.contains(c+d);)d++;z.Ra(a,b,c+d)}else if(void 0===c||"number"===typeof c){for(d=-this.hd.count-1;this.hd.contains(d);)d--;z.Ra(a,b,d)}else z.k("GraphLinksModel.getKeyForLinkData returned something other than a string or a number: "+ +c)}}}};V.prototype.containsLinkData=V.prototype.th=function(a){return null===a?!1:this.rm.contains(a)};V.prototype.addLinkData=V.prototype.gt=function(a){if(null!==a){if(void 0===z.nd(a))z.kc(a);else if(this.th(a))return;Mg(this,a,!0)}}; +function Mg(a,b,c){if(""!==a.pj){var d=a.lf(b);if(void 0!==d&&a.hd.na(d)===b)return;a.mA(b);d=a.lf(b);if(void 0===d){z.k("GraphLinksModel.makeLinkDataKeyUnique failed on "+b+". Data not added to model.");return}a.hd.add(d,b)}a.rm.add(b);if(c){var e=z.ab(a.vf);z.bj(a.vf,e,b)}zg(a,"linkDataArray",Wf,"linkDataArray",a,null,b,null,e);Lg(a,b)}V.prototype.addLinkDataCollection=function(a){if(z.isArray(a))for(var b=z.ab(a),c=0;c<b;c++)this.gt(z.Ya(a,c));else for(a=a.i;a.next();)this.gt(a.value)}; +V.prototype.removeLinkData=V.prototype.Ex=function(a){null!==a&&Zg(this,a,!0)};function Zg(a,b,c){a.rm.remove(b);var d=a.lf(b);void 0!==d&&a.hd.remove(d);if(c){var e=a.vf.indexOf(b);if(0>e)return;z.ii(a.vf,e)}zg(a,"linkDataArray",Xf,"linkDataArray",a,b,null,e,null);c=a.Ll(b);Gg(a,c,b);c=a.Ml(b);Gg(a,c,b);d=a.rk(b);if(z.isArray(d))for(var e=z.ab(d),g=0;g<e;g++)c=z.Ya(d,g),Gg(a,c,b)} +V.prototype.removeLinkDataCollection=function(a){if(z.isArray(a))for(var b=z.ab(a),c=0;c<b;c++)this.Ex(z.Ya(a,c));else for(a=a.i;a.next();)this.Ex(a.value)};function Lg(a,b){var c=a.Ll(b),c=a.on(c);null===a.ne(c)&&Fg(a,c,b);c=a.Ml(b);c=a.on(c);null===a.ne(c)&&Fg(a,c,b);var d=a.rk(b);if(z.isArray(d))for(var e=z.ab(d),g=0;g<e;g++)c=z.Ya(d,g),null===a.ne(c)&&Fg(a,c,b)} +z.defineProperty(V,{eK:"copyLinkDataFunction"},function(){return this.Pn},function(a){var b=this.Pn;b!==a&&(null!==a&&z.g(a,"function",V,"copyLinkDataFunction"),this.Pn=a,this.j("copyLinkDataFunction",b,a))});V.prototype.copyLinkData=V.prototype.Pw=function(a){if(null===a)return null;var b=null,b=this.Pn,b=null!==b?b(a,this):Hg(this,a,!0);z.Za(b)&&(z.kc(b),""!==this.Vh&&z.Ra(b,this.Vh,void 0),""!==this.Wh&&z.Ra(b,this.Wh,void 0),""!==this.vg&&z.Ra(b,this.vg,[]));return b}; +z.defineProperty(V,{eu:"nodeIsGroupProperty"},function(){return this.Do},function(a){var b=this.Do;b!==a&&(Ag(a,V,"nodeIsGroupProperty"),this.Do=a,this.j("nodeIsGroupProperty",b,a))});V.prototype.isGroupForNodeData=V.prototype.gA=function(a){if(null===a)return!1;var b=this.Do;return""===b?!1:z.tb(a,b)?!0:!1};z.defineProperty(V,{Pp:"nodeGroupKeyProperty"},function(){return this.kh},function(a){var b=this.kh;b!==a&&(Ag(a,V,"nodeGroupKeyProperty"),this.kh=a,this.j("nodeGroupKeyProperty",b,a))}); +z.defineProperty(V,{Ym:"copiesGroupKeyOfNodeData"},function(){return this.Dq},function(a){this.Dq!==a&&(z.g(a,"boolean",V,"copiesGroupKeyOfNodeData"),this.Dq=a)});V.prototype.getGroupKeyForNodeData=V.prototype.en=function(a){if(null!==a){var b=this.kh;if(""!==b&&(b=z.tb(a,b),void 0!==b)){if(Bg(b))return b;z.k("GroupKey value for node data "+a+" is not a number or a string: "+b)}}}; +V.prototype.setGroupKeyForNodeData=V.prototype.Mx=function(a,b){null===b&&(b=void 0);void 0===b||Bg(b)||z.ic(b,"number or string",V,"setGroupKeyForNodeData:key");if(null!==a){var c=this.kh;if(""!==c)if(this.le(a)){var d=z.tb(a,c);d!==b&&(Gg(this,d,a),z.Ra(a,c,b),null===this.ne(b)&&Fg(this,b,a),zg(this,"nodeGroupKey",Uf,c,a,d,b),"string"===typeof c&&this.Mb(a,c))}else z.Ra(a,c,b)}}; +V.prototype.copyNodeData=function(a){if(null===a)return null;a=M.prototype.copyNodeData.call(this,a);this.Ym||""===this.kh||void 0===z.tb(a,this.kh)||z.Ra(a,this.kh,void 0);return a}; +V.prototype.setDataProperty=function(a,b,c){u&&(z.g(a,"object",V,"setDataProperty:data"),z.g(b,"string",V,"setDataProperty:propname"),""===b&&z.k("GraphLinksModel.setDataProperty: property name must not be an empty string when setting "+a+" to "+c));if(this.le(a))if(b===this.rj)this.Nx(a,c);else{if(b===this.pn){this.Kx(a,c);return}if(b===this.Pp){this.Mx(a,c);return}b===this.eu&&z.k("GraphLinksModel.setDataProperty: property name must not be the nodeIsGroupProperty: "+b)}else if(this.th(a)){if(b=== +this.Ep){this.Lx(a,c);return}if(b===this.Gp){this.Px(a,c);return}if(b===this.Xt){this.OA(a,c);return}if(b===this.Zt){this.RA(a,c);return}if(b===this.pj){this.IF(a,c);return}if(b===this.Wt){this.HF(a,c);return}if(b===this.Yt){this.JF(a,c);return}}else!Kg&&a instanceof O&&(Kg=!0,z.trace('GraphLinksModel.setDataProperty is modifying a GraphObject, "'+a.toString()+'"'),z.trace(" Is that really your intent?"));var d=z.tb(a,b);d!==c&&(z.Ra(a,b,c),this.CA(a,b,d,c))};f=V.prototype; +f.ju=function(a,b){M.prototype.ju.call(this,a,b);for(var c=this.vc.i;c.next();)this.JA(c.value,a,b);for(c=this.rm.i;c.next();){var d=c.value,e=a,g=b;if(this.Ll(d)===e){var h=this.Vh;z.Ra(d,h,g);zg(this,"linkFromKey",Uf,h,d,e,g);"string"===typeof h&&this.Mb(d,h)}this.Ml(d)===e&&(h=this.Wh,z.Ra(d,h,g),zg(this,"linkToKey",Uf,h,d,e,g),"string"===typeof h&&this.Mb(d,h));var k=this.rk(d);if(z.isArray(k))for(var l=z.ab(k),h=this.vg,m=0;m<l;m++)z.Ya(k,m)===e&&(z.LD(k,m,g),zg(this,"linkLabelKeys",Wf,h,d,e, +g))}};f.JA=function(a,b,c){if(this.en(a)===b){var d=this.kh;z.Ra(a,d,c);zg(this,"nodeGroupKey",Uf,d,a,b,c);"string"===typeof d&&this.Mb(a,d)}};f.bB=function(){M.prototype.bB.call(this);for(var a=this.Kg,b=z.ab(a),c=0;c<b;c++){var d=z.Ya(a,c);Lg(this,d)}}; +f.Up=function(a){M.prototype.Up.call(this,a);a=this.pb(a);var b=Eg(this,a);if(null!==b){for(var c=new J(Object),b=b.i;b.next();){var d=b.value;if(this.le(d)){if(this.en(d)===a){var e=this.kh;zg(this,"nodeGroupKey",Uf,e,d,a,a);"string"===typeof e&&this.Mb(d,e);c.add(d)}}else{this.Ll(d)===a&&(e=this.Vh,zg(this,"linkFromKey",Uf,e,d,a,a),"string"===typeof e&&this.Mb(d,e),c.add(d));this.Ml(d)===a&&(e=this.Wh,zg(this,"linkToKey",Uf,e,d,a,a),"string"===typeof e&&this.Mb(d,e),c.add(d));var g=this.rk(d);if(z.isArray(g))for(var h= +z.ab(g),e=this.vg,k=0;k<h;k++)z.Ya(g,k)===a&&(zg(this,"linkLabelKeys",Wf,e,d,a,a),c.add(d))}}for(c=c.i;c.next();)Gg(this,a,c.value)}};f.Tp=function(a){M.prototype.Tp.call(this,a);var b=this.en(a);null===this.ne(b)&&Fg(this,b,a)};f.Bu=function(a){M.prototype.Bu.call(this,a);var b=this.en(a);Gg(this,b,a)};z.defineProperty(V,{Wt:"linkCategoryProperty"},function(){return this.qm},function(a){var b=this.qm;b!==a&&(Ag(a,V,"linkCategoryProperty"),this.qm=a,this.j("linkCategoryProperty",b,a))}); +V.prototype.getCategoryForLinkData=V.prototype.bx=function(a){if(null===a)return"";var b=this.qm;if(""===b)return"";b=z.tb(a,b);if(void 0===b)return"";if("string"===typeof b)return b;z.k("getCategoryForLinkData found a non-string category for "+a+": "+b);return""}; +V.prototype.setCategoryForLinkData=V.prototype.HF=function(a,b){z.g(b,"string",V,"setCategoryForLinkData:cat");if(null!==a){var c=this.qm;if(""!==c)if(this.th(a)){var d=z.tb(a,c);void 0===d&&(d="");d!==b&&(z.Ra(a,c,b),zg(this,"linkCategory",Uf,c,a,d,b),"string"===typeof c&&this.Mb(a,c))}else z.Ra(a,c,b)}}; +function qg(a){1<arguments.length&&z.k("TreeModel constructor can only take one optional argument, the Array of node data.");M.call(this);this.lh="parent";this.Eq=!1;this.zm="parentLinkCategory";void 0!==a&&(this.hg=a)}z.Qa(qg,M);z.ia("TreeModel",qg);qg.prototype.cloneProtected=function(a){M.prototype.cloneProtected.call(this,a);a.lh=this.lh;a.Eq=this.Eq;a.zm=this.zm}; +qg.prototype.toString=function(a){void 0===a&&(a=0);if(2<=a)return this.YA();var b=(""!==this.name?this.name:"")+" TreeModel";if(0<a){b+="\n node data:";a=this.hg;for(var c=z.ab(a),d=0;d<c;d++)var e=z.Ya(a,d),b=b+(" "+this.pb(e)+":"+ka(e))}return b};qg.prototype.Bn=function(){var a=M.prototype.Bn.call(this),b="";"parent"!==this.Qp&&"string"===typeof this.Qp&&(b+=',\n "nodeParentKeyProperty": '+this.quote(this.Qp));return a+b}; +qg.prototype.hu=function(a){M.prototype.hu.call(this,a);a.nodeParentKeyProperty&&(this.Qp=a.nodeParentKeyProperty)};qg.prototype.on=function(a){return a};z.defineProperty(qg,{Qp:"nodeParentKeyProperty"},function(){return this.lh},function(a){var b=this.lh;b!==a&&(Ag(a,qg,"nodeParentKeyProperty"),this.lh=a,this.j("nodeParentKeyProperty",b,a))}); +z.defineProperty(qg,{Zm:"copiesParentKeyOfNodeData"},function(){return this.Eq},function(a){this.Eq!==a&&(z.g(a,"boolean",qg,"copiesParentKeyOfNodeData"),this.Eq=a)});qg.prototype.getParentKeyForNodeData=qg.prototype.fn=function(a){if(null!==a){var b=this.lh;if(""!==b&&(b=z.tb(a,b),void 0!==b)){if(Bg(b))return b;z.k("ParentKey value for node data "+a+" is not a number or a string: "+b)}}}; +qg.prototype.setParentKeyForNodeData=qg.prototype.Gh=function(a,b){null===b&&(b=void 0);void 0===b||Bg(b)||z.ic(b,"number or string",qg,"setParentKeyForNodeData:key");if(null!==a){var c=this.lh;if(""!==c)if(b=this.on(b),this.le(a)){var d=z.tb(a,c);d!==b&&(Gg(this,d,a),z.Ra(a,c,b),null===this.ne(b)&&Fg(this,b,a),zg(this,"nodeParentKey",Uf,c,a,d,b),"string"===typeof c&&this.Mb(a,c))}else z.Ra(a,c,b)}}; +z.defineProperty(qg,{kL:"parentLinkCategoryProperty"},function(){return this.zm},function(a){var b=this.zm;b!==a&&(Ag(a,qg,"parentLinkCategoryProperty"),this.zm=a,this.j("parentLinkCategoryProperty",b,a))});qg.prototype.getParentLinkCategoryForNodeData=qg.prototype.NH=function(a){if(null===a)return"";var b=this.zm;if(""===b)return"";b=z.tb(a,b);if(void 0===b)return"";if("string"===typeof b)return b;z.k("getParentLinkCategoryForNodeData found a non-string category for "+a+": "+b);return""}; +qg.prototype.setParentLinkCategoryForNodeData=qg.prototype.iJ=function(a,b){z.g(b,"string",qg,"setParentLinkCategoryForNodeData:cat");if(null!==a){var c=this.zm;if(""!==c)if(this.le(a)){var d=z.tb(a,c);void 0===d&&(d="");d!==b&&(z.Ra(a,c,b),zg(this,"parentLinkCategory",Uf,c,a,d,b),"string"===typeof c&&this.Mb(a,c))}else z.Ra(a,c,b)}}; +qg.prototype.copyNodeData=function(a){if(null===a)return null;a=M.prototype.copyNodeData.call(this,a);this.Zm||""===this.lh||void 0===z.tb(a,this.lh)||z.Ra(a,this.lh,void 0);return a}; +qg.prototype.setDataProperty=function(a,b,c){u&&(z.g(a,"object",qg,"setDataProperty:data"),z.g(b,"string",qg,"setDataProperty:propname"),""===b&&z.k("TreeModel.setDataProperty: property name must not be an empty string when setting "+a+" to "+c));if(this.le(a))if(b===this.rj)this.Nx(a,c);else{if(b===this.pn){this.Kx(a,c);return}if(b===this.Qp){this.Gh(a,c);return}}else!Kg&&a instanceof O&&(Kg=!0,z.trace('TreeModel.setDataProperty is modifying a GraphObject, "'+a.toString()+'"'),z.trace(" Is that really your intent?")); +var d=z.tb(a,b);d!==c&&(z.Ra(a,b,c),this.CA(a,b,d,c))};f=qg.prototype;f.ju=function(a,b){M.prototype.ju.call(this,a,b);for(var c=this.vc.i;c.next();)this.JA(c.value,a,b)};f.JA=function(a,b,c){if(this.fn(a)===b){var d=this.lh;z.Ra(a,d,c);zg(this,"nodeParentKey",Uf,d,a,b,c);"string"===typeof d&&this.Mb(a,d)}}; +f.Up=function(a){M.prototype.Up.call(this,a);a=this.pb(a);var b=Eg(this,a);if(null!==b){for(var c=new J(Object),b=b.i;b.next();){var d=b.value;if(this.le(d)&&this.fn(d)===a){var e=this.lh;zg(this,"nodeParentKey",Uf,e,d,a,a);"string"===typeof e&&this.Mb(d,e);c.add(d)}}for(c=c.i;c.next();)Gg(this,a,c.value)}};f.Tp=function(a){M.prototype.Tp.call(this,a);var b=this.fn(a),b=this.on(b);null===this.ne(b)&&Fg(this,b,a)};f.Bu=function(a){M.prototype.Bu.call(this,a);var b=this.fn(a);Gg(this,b,a)}; +function $g(a,b,c){z.kc(this);this.G=!1;void 0===a?a="":z.g(a,"string",$g,"constructor:targetprop");void 0===b?b=a:z.g(b,"string",$g,"constructor:sourceprop");void 0===c?c=null:null!==c&&z.g(c,"function",$g,"constructor:conv");this.fD=-1;this.Bg=null;this.Wo=a;this.Vo=this.Ts=0;this.pw=null;this.qr=!1;this.Mo=b;this.Bq=c;this.Nr=ah;this.uq=null}z.ia("Binding",$g); +$g.prototype.copy=function(){var a=new $g;a.Wo=this.Wo;a.Ts=this.Ts;a.Vo=this.Vo;a.pw=this.pw;a.qr=this.qr;a.Mo=this.Mo;a.Bq=this.Bq;a.Nr=this.Nr;a.uq=this.uq;return a};var ah;$g.OneWay=ah=z.s($g,"OneWay",1);var bh;$g.TwoWay=bh=z.s($g,"TwoWay",2);$g.parseEnum=function(a,b){z.g(a,"function",$g,"parseEnum:ctor");z.Ba(b,a,$g,"parseEnum:defval");return function(c){c=Ja(a,c);return null===c?b:c}};var ka; +$g.toString=ka=function(a){var b=a;z.Za(a)&&(a.text?b=a.text:a.name?b=a.name:void 0!==a.key?b=a.key:void 0!==a.id?b=a.id:a.constructor===Object&&(a.Text?b=a.Text:a.Name?b=a.Name:void 0!==a.Key?b=a.Key:void 0!==a.Id?b=a.Id:void 0!==a.ID&&(b=a.ID)));return void 0===b?"undefined":null===b?"null":b.toString()};$g.prototype.toString=function(){return"Binding("+this.yu+":"+this.NF+(-1!==this.Wl?" "+this.Wl:"")+" "+this.mode.name+")"};$g.prototype.freeze=function(){this.G=!0;return this}; +$g.prototype.Wa=function(){this.G=!1;return this};z.defineProperty($g,{Wl:null},function(){return this.fD},function(a){this.G&&z.oa(this);z.g(a,"number",$g,"targetId");this.fD=a});z.defineProperty($g,{yu:"targetProperty"},function(){return this.Wo},function(a){this.G&&z.oa(this);z.g(a,"string",$g,"targetProperty");this.Wo=a});z.defineProperty($g,{xn:"sourceName"},function(){return this.pw},function(a){this.G&&z.oa(this);null!==a&&z.g(a,"string",$g,"sourceName");this.pw=a;null!==a&&(this.qr=!1)}); +z.defineProperty($g,{St:"isToModel"},function(){return this.qr},function(a){this.G&&z.oa(this);z.g(a,"boolean",$g,"isToModel");this.qr=a});z.defineProperty($g,{NF:"sourceProperty"},function(){return this.Mo},function(a){this.G&&z.oa(this);z.g(a,"string",$g,"sourceProperty");this.Mo=a});z.defineProperty($g,{gH:"converter"},function(){return this.Bq},function(a){this.G&&z.oa(this);null!==a&&z.g(a,"function",$g,"converter");this.Bq=a}); +z.defineProperty($g,{WG:"backConverter"},function(){return this.uq},function(a){this.G&&z.oa(this);null!==a&&z.g(a,"function",$g,"backConverter");this.uq=a});z.defineProperty($g,{mode:"mode"},function(){return this.Nr},function(a){this.G&&z.oa(this);z.Ba(a,$g,$g,"mode");this.Nr=a});$g.prototype.makeTwoWay=$g.prototype.xI=function(a){void 0===a&&(a=null);null!==a&&z.g(a,"function",$g,"makeTwoWay");this.mode=bh;this.WG=a;return this}; +$g.prototype.ofObject=$g.prototype.vx=function(a){void 0===a&&(a="");u&&z.g(a,"string",$g,"ofObject:srcname");this.xn=a;this.St=!1;return this};$g.prototype.ofModel=function(){this.xn=null;this.St=!0;return this};$g.prototype.ofData=function(){this.xn=null;this.St=!1;return this};function ch(a,b,c){a=a.xn;var d=null;return d=null===a||""===a?b:"."===a?c:".."===a?c.T:b.oe(a)} +$g.prototype.updateTarget=$g.prototype.eG=function(a,b,c){var d=this.Mo;if(void 0===c||""===d||d===c){c=this.Wo;var e=this.Bq;if(null===e&&""===c)z.trace("Binding error: target property is the empty string: "+this.toString());else{u&&"string"===typeof c&&("function"!==typeof a.setAttribute&&0<c.length&&"_"!==c[0]&&!z.gx(a,c)?z.trace("Binding error: undefined target property: "+c+" on "+a.toString()):"name"===c&&a instanceof O&&z.trace("Binding error: cannot modify GraphObject.name on "+a.toString())); +var g=b;""!==d&&(g=z.tb(b,d));if(void 0!==g)if(null===e)""!==c&&z.Ra(a,c,g);else try{if(""!==c){var h=e(g,a);u&&void 0===h&&z.trace('Binding warning: conversion function returned undefined when setting target property "'+c+'" on '+a.toString()+", function is: "+e);z.Ra(a,c,h)}else e(g,a)}catch(k){u&&z.trace("Binding error: "+k.toString()+' setting target property "'+c+'" on '+a.toString()+" with conversion function: "+e)}}}}; +$g.prototype.updateSource=$g.prototype.Sx=function(a,b,c,d){void 0===d&&(d=null);if(this.Nr===bh){var e=this.Wo;if(void 0===c||e===c){c=this.Mo;var g=this.uq;if(null!==g||""!==c){var h=a;""!==e&&(h=z.tb(a,e));if(void 0!==h)if(a=null!==d?d.ha:null,null===g)null!==a?(u&&a.rj===c&&a.le(b)&&z.trace("Binding error: cannot have TwoWay Binding on node data key property: "+this.toString()),a.setDataProperty(b,c,h)):z.Ra(b,c,h);else try{if(""!==c){var k=g(h,b,a);null!==a?(u&&(a.rj===c&&a.le(b)&&z.trace("Binding error: cannot have TwoWay Binding on node data key property: "+ +this.toString()),void 0===k&&z.trace('Binding warning: conversion function returned undefined when setting source property "'+c+'" on '+b.toString()+", function is: "+g)),a.setDataProperty(b,c,k)):z.Ra(b,c,k)}else g(h,b,a)}catch(l){u&&z.trace("Binding error: "+l.toString()+' setting source property "'+c+'" on '+b.toString()+" with conversion function: "+g)}}}}};function rg(){this.lG=(new J(Tf)).freeze();this.Ub="";this.mC=!1}z.ia("Transaction",rg); +rg.prototype.toString=function(a){var b="Transaction: "+this.name+" "+this.Zf.count.toString()+(this.Nt?"":", incomplete");if(void 0!==a&&0<a){a=this.Zf.count;for(var c=0;c<a;c++){var d=this.Zf.ea(c);null!==d&&(b+="\n "+d.toString())}}return b};rg.prototype.clear=rg.prototype.clear=function(){var a=this.Zf;a.Wa();for(var b=a.count-1;0<=b;b--){var c=a.ea(b);null!==c&&c.clear()}a.clear();a.freeze()};rg.prototype.canUndo=rg.prototype.canUndo=function(){return this.Nt}; +rg.prototype.undo=rg.prototype.undo=function(){if(this.canUndo())for(var a=this.Zf.count-1;0<=a;a--){var b=this.Zf.ea(a);null!==b&&b.undo()}};rg.prototype.canRedo=rg.prototype.canRedo=function(){return this.Nt};rg.prototype.redo=rg.prototype.redo=function(){if(this.canRedo())for(var a=this.Zf.count,b=0;b<a;b++){var c=this.Zf.ea(b);null!==c&&c.redo()}};z.w(rg,{Zf:"changes"},function(){return this.lG});z.defineProperty(rg,{name:"name"},function(){return this.Ub},function(a){this.Ub=a}); +z.defineProperty(rg,{Nt:"isComplete"},function(){return this.mC},function(a){this.mC=a});function Yf(){this.cz=new K(M);this.af=!1;this.pG=(new J(rg)).freeze();this.dh=-1;this.BC=999;this.Ii=!1;this.ev=null;this.ql=0;this.py=!1;u&&(this.py=!0);this.jh=(new J("string")).freeze();this.Co=new J("number");this.Ly=!0;this.Xy=!1}z.ia("UndoManager",Yf); +Yf.prototype.toString=function(a){for(var b="UndoManager "+this.jj+"<"+this.history.count+"<="+this.ZE,b=b+"[",c=this.dF.count,d=0;d<c;d++)0<d&&(b+=" "),b+=this.dF.ea(d);b+="]";if(void 0!==a&&0<a)for(c=this.history.count,d=0;d<c;d++)b+="\n "+this.history.ea(d).toString(a-1);return b}; +Yf.prototype.clear=Yf.prototype.clear=function(){var a=this.history;a.Wa();for(var b=a.count-1;0<=b;b--){var c=a.ea(b);null!==c&&c.clear()}a.clear();this.dh=-1;a.freeze();this.Ii=!1;this.ev=null;this.ql=0;this.jh.Wa();this.jh.clear();this.jh.freeze();this.Co.clear()};Yf.prototype.addModel=Yf.prototype.OG=function(a){this.cz.add(a)};Yf.prototype.removeModel=Yf.prototype.XI=function(a){this.cz.remove(a)}; +Yf.prototype.startTransaction=Yf.prototype.Wb=function(a){void 0===a&&(a="");null===a&&(a="");if(this.qb)return!1;!0===this.Ly&&(this.Ly=!1,this.ql++,this.kd("StartingFirstTransaction",a,this.ej),0<this.ql&&this.ql--);this.isEnabled&&(this.jh.Wa(),this.jh.add(a),this.jh.freeze(),null===this.ej?this.Co.add(0):this.Co.add(this.ej.Zf.count));this.ql++;var b=1===this.Ih;b&&this.kd("StartedTransaction",a,this.ej);return b}; +Yf.prototype.commitTransaction=Yf.prototype.Jd=function(a){void 0===a&&(a="");return dh(this,!0,a)};Yf.prototype.rollbackTransaction=Yf.prototype.Vp=function(){return dh(this,!1,"")}; +function dh(a,b,c){if(a.qb)return!1;a.Fz&&1>a.Ih&&z.trace("Ending transaction without having started a transaction: "+c);var d=1===a.Ih;d&&b&&a.isEnabled&&a.kd("CommittingTransaction",c,a.ej);var e=0;if(0<a.Ih&&(a.ql--,a.isEnabled)){var g=a.jh.count;0<g&&(""===c&&(c=a.jh.ea(0)),a.jh.Wa(),a.jh.dd(g-1),a.jh.freeze());g=a.Co.count;0<g&&(e=a.Co.ea(g-1),a.Co.dd(g-1))}g=a.ej;if(d){if(b){a.Xy=!1;if(a.isEnabled&&null!==g){b=g;b.Nt=!0;b.name=c;d=a.history;d.Wa();for(e=d.count-1;e>a.jj;e--)g=d.ea(e),null!== +g&&g.clear(),d.dd(e),a.Xy=!0;e=a.ZE;0===e&&(e=1);0<e&&d.count>=e&&(g=d.ea(0),null!==g&&g.clear(),d.dd(0),a.dh--);d.add(b);a.dh++;d.freeze();g=b}a.kd("CommittedTransaction",c,g)}else{a.Ii=!0;try{a.isEnabled&&null!==g&&(g.Nt=!0,g.undo())}finally{a.kd("RolledBackTransaction",c,g),a.Ii=!1}null!==g&&g.clear()}a.ev=null;return!0}if(a.isEnabled&&!b&&null!==g){a=e;c=g.Zf;for(b=c.count-1;b>=a;b--)d=c.ea(b),null!==d&&d.undo(),c.Wa(),c.dd(b);c.freeze()}return!1} +Yf.prototype.canUndo=Yf.prototype.canUndo=function(){if(!this.isEnabled||0<this.Ih||this.qb)return!1;var a=this.$F;return null!==a&&a.canUndo()?!0:!1};Yf.prototype.undo=Yf.prototype.undo=function(){if(this.canUndo()){var a=this.$F;try{this.kd("StartingUndo","Undo",a),this.Ii=!0,this.dh--,a.undo()}catch(b){z.trace("undo error: "+b.toString())}finally{this.Ii=!1,this.kd("FinishedUndo","Undo",a)}}}; +Yf.prototype.canRedo=Yf.prototype.canRedo=function(){if(!this.isEnabled||0<this.Ih||this.qb)return!1;var a=this.ZF;return null!==a&&a.canRedo()?!0:!1};Yf.prototype.redo=Yf.prototype.redo=function(){if(this.canRedo()){var a=this.ZF;try{this.kd("StartingRedo","Redo",a),this.Ii=!0,this.dh++,a.redo()}catch(b){z.trace("redo error: "+b.toString())}finally{this.Ii=!1,this.kd("FinishedRedo","Redo",a)}}}; +Yf.prototype.kd=function(a,b,c){void 0===c&&(c=null);var d=new Tf;d.Dc=Vf;d.propertyName=a;d.object=c;d.oldValue=b;for(a=this.GI;a.next();)b=a.value,d.ha=b,b.Kw(d)};Yf.prototype.handleChanged=Yf.prototype.CE=function(a){if(this.isEnabled&&!this.qb&&!this.skipsEvent(a)){var b=this.ej;null===b&&(this.ev=b=new rg);var c=a.copy(),b=b.Zf;b.Wa();b.add(c);b.freeze();this.Fz&&0>=this.Ih&&!this.Ly&&(a=a.h,null!==a&&!1===a.jn||z.trace("Change not within a transaction: "+c.toString()))}}; +Yf.prototype.skipsEvent=function(a){if(null===a||0>a.Dc.value)return!0;a=a.object;if(a instanceof O){if(a=a.layer,null!==a&&a.Nc)return!0}else if(a instanceof wg&&a.Nc)return!0;return!1};z.w(Yf,{GI:"models"},function(){return this.cz.i});z.defineProperty(Yf,{isEnabled:"isEnabled"},function(){return this.af},function(a){this.af=a});z.w(Yf,{$F:"transactionToUndo"},function(){return 0<=this.jj&&this.jj<=this.history.count-1?this.history.ea(this.jj):null}); +z.w(Yf,{ZF:"transactionToRedo"},function(){return this.jj<this.history.count-1?this.history.ea(this.jj+1):null});z.w(Yf,{qb:"isUndoingRedoing"},function(){return this.Ii});z.w(Yf,{history:"history"},function(){return this.pG});z.defineProperty(Yf,{ZE:"maxHistoryLength"},function(){return this.BC},function(a){this.BC=a});z.w(Yf,{jj:"historyIndex"},function(){return this.dh});z.w(Yf,{ej:"currentTransaction"},function(){return this.ev});z.w(Yf,{Ih:"transactionLevel"},function(){return this.ql}); +z.w(Yf,{PE:"isInTransaction"},function(){return 0<this.ql});z.defineProperty(Yf,{Fz:"checksTransactionLevel"},function(){return this.py},function(a){this.py=a});z.w(Yf,{dF:"nestedTransactionNames"},function(){return this.jh});function ra(){0<arguments.length&&z.od(ra);z.kc(this);this.Z=null;this.zB=!1;this.TB=this.AB=!0;this.CB=this.DB=this.UB=this.EB=!1;this.il=this.jy=null;this.yD=1.05;this.RB=1;this.Yy=NaN;this.yC=null;this.yz=NaN;this.xz=Jd;this.Vi=null}z.ia("CommandHandler",ra); +var eh=null,fh="";ra.prototype.toString=function(){return"CommandHandler"};z.w(ra,{h:"diagram"},function(){return this.Z});ra.prototype.Sc=function(a){u&&null!==a&&z.l(a,B,ra,"setDiagram");this.Z=a}; +ra.prototype.doKeyDown=function(){var a=this.h;if(null!==a){var b=a.R,c=z.sk?b.$t:b.control,d=b.shift,e=b.alt,g=b.key;!c||"C"!==g&&"Insert"!==g?c&&"X"===g||d&&"Del"===g?this.canCutSelection()&&this.cutSelection():c&&"V"===g||d&&"Insert"===g?this.canPasteSelection()&&this.pasteSelection():c&&"Y"===g||e&&d&&"Backspace"===g?this.canRedo()&&this.redo():c&&"Z"===g||e&&"Backspace"===g?this.canUndo()&&this.undo():"Del"===g||"Backspace"===g?this.canDeleteSelection()&&this.deleteSelection():c&&"A"===g?this.canSelectAll()&& +this.selectAll():"Esc"===g?this.canStopCommand()&&this.stopCommand():"Up"===g?a.ze&&(c?a.scroll("pixel","up"):a.scroll("line","up")):"Down"===g?a.ze&&(c?a.scroll("pixel","down"):a.scroll("line","down")):"Left"===g?a.ye&&(c?a.scroll("pixel","left"):a.scroll("line","left")):"Right"===g?a.ye&&(c?a.scroll("pixel","right"):a.scroll("line","right")):"PageUp"===g?d&&a.ye?a.scroll("page","left"):a.ze&&a.scroll("page","up"):"PageDown"===g?d&&a.ye?a.scroll("page","right"):a.ze&&a.scroll("page","down"):"Home"=== +g?c&&a.ze?a.scroll("document","up"):!c&&a.ye&&a.scroll("document","left"):"End"===g?c&&a.ze?a.scroll("document","down"):!c&&a.ye&&a.scroll("document","right"):" "===g?this.canScrollToPart()&&this.scrollToPart():"Subtract"===g?this.canDecreaseZoom()&&this.decreaseZoom():"Add"===g?this.canIncreaseZoom()&&this.increaseZoom():c&&"0"===g?this.canResetZoom()&&this.resetZoom():d&&"Z"===g?this.canZoomToFit()&&this.zoomToFit():c&&!d&&"G"===g?this.canGroupSelection()&&this.groupSelection():c&&d&&"G"===g?this.canUngroupSelection()&& +this.ungroupSelection():b.event&&113===b.event.which?this.canEditTextBlock()&&this.editTextBlock():b.event&&93===b.event.which?this.canShowContextMenu()&&this.showContextMenu():b.bubbles=!0:this.canCopySelection()&&this.copySelection()}};ra.prototype.doKeyUp=function(){var a=this.h;null!==a&&(a.R.bubbles=!0)};ra.prototype.stopCommand=function(){var a=this.h;if(null!==a){var b=a.cb;b instanceof gh&&a.xf&&a.Mw();null!==b&&b.doCancel()}};ra.prototype.canStopCommand=function(){return!0}; +ra.prototype.selectAll=function(){var a=this.h;if(null!==a){a.ta();try{a.gc="wait";a.Ja("ChangingSelection");for(var b=a.oi;b.next();)b.value.jb=!0;for(var c=a.Mg;c.next();)c.value.jb=!0;for(var d=a.links;d.next();)d.value.jb=!0}finally{a.Ja("ChangedSelection"),a.gc=""}}};ra.prototype.canSelectAll=function(){var a=this.h;return null!==a&&a.xf}; +ra.prototype.deleteSelection=function(){var a=this.h;if(null!==a&&!a.Ja("SelectionDeleting",a.selection))try{a.gc="wait";a.Wb("Delete");a.Ja("ChangingSelection");for(var b=new K(D),c=a.selection.i;c.next();)hh(b,c.value,!0,this.pH?Infinity:0,this.gE,function(a){return a.canDelete()});a.IA(b,!0);a.Ja("SelectionDeleted",b)}finally{a.Ja("ChangedSelection"),a.Jd("Delete"),a.gc=""}};ra.prototype.canDeleteSelection=function(){var a=this.h;return null===a||a.ib||a.Ef||!a.Rm||0===a.selection.count?!1:!0}; +function hh(a,b,c,d,e,g){void 0===g&&(g=null);if(!(a.contains(b)||null!==g&&!g(b)||b instanceof da))if(a.add(b),b instanceof E){if(c&&b instanceof F)for(var h=b.Hc;h.next();)hh(a,h.value,c,d,e,g);if(e)for(h=b.ee;h.next();){var k=h.value;if(!a.contains(k)){var l=k.Y,m=k.da;null!==l&&a.contains(l)&&null!==m&&a.contains(m)?hh(a,k,c,d,e,g):null!==l&&null!==m||hh(a,k,c,d,e,g)}}if(1<d)for(b=b.sE();b.next();)hh(a,b.value,c,d-1,e,g)}else if(b instanceof G)for(h=b.Hf;h.next();)hh(a,h.value,c,d,e,g)} +ra.prototype.gp=function(a,b,c){var d=new na(D,D);for(a=a.i;a.next();)ih(this,a.value,b,d,c);if(null!==b){c=b.ha;a=!1;null!==b.gb.me&&(a=b.gb.me.gj);for(var e=new K(G),g=new na(G,G),h=d.i;h.next();){var k=h.value;if(k instanceof G){var l=k;a||null!==l.Y&&null!==l.da||e.add(l)}else if(c instanceof qg&&k instanceof E&&null!==k.data){var l=c,m=k,k=h.key,n=k.Il();null!==n&&(n=d.na(n),null!==n?(l.Gh(m.data,l.pb(n.data)),l=b.$f(m.data),k=k.op(),null!==k&&null!==l&&g.add(k,l)):l.Gh(m.data,void 0))}}0<e.count&& +b.IA(e,!1);if(0<g.count)for(c=g.i;c.next();)d.add(c.key,c.value)}if(null!==b&&(b=b.ha,c=b.QG,null!==c)){var p=new na;d.each(function(a){null!==a.key.data&&p.add(a.key.data,a.value.data)});c(p,b,this.h.ha)}for(b=d.i;b.next();)b.value.Mb();return d}; +function ih(a,b,c,d,e){if(null===b||e&&!b.canCopy())return null;if(d.contains(b))return d.na(b);var g=null,h=b.data;if(null!==h&&null!==c){var k=c.ha;b instanceof G?k instanceof V&&(h=k.Pw(h),z.Za(h)&&(k.gt(h),g=c.$f(h))):(h=k.copyNodeData(h),z.Za(h)&&(k.sl(h),g=c.vh(h)))}else jh(b),g=b.copy(),null!==g&&(null!==c?c.add(g):null!==h&&a.hH&&(k=a.h.ha,h=g instanceof G&&k instanceof V?k.Pw(h):k.copyNodeData(h),z.Za(h)&&(g.data=h)));if(!(g instanceof D))return null;g.jb=!1;g.yh=!1;d.add(b,g);if(b instanceof +E){for(h=b.ee;h.next();){k=h.value;if(k.Y===b){var l=d.na(k);null!==l&&(l.Y=g)}k.da===b&&(l=d.na(k),null!==l&&(l.da=g))}if(b instanceof F&&g instanceof F)for(h=g,b=b.Hc;b.next();)k=ih(a,b.value,c,d,e),k instanceof G||null===k||(k.Va=h)}else if(b instanceof G)for(h=b.Y,null!==h&&(h=d.na(h),null!==h&&(g.Y=h)),h=b.da,null!==h&&(h=d.na(h),null!==h&&(g.da=h)),b=b.Hf;b.next();)h=ih(a,b.value,c,d,e),null!==h&&(h.Nd=g);return g} +ra.prototype.copySelection=function(){var a=this.h;if(null!==a){for(var b=new K(D),a=a.selection.i;a.next();)hh(b,a.value,!0,this.kH?Infinity:0,this.iH,function(a){return a.canCopy()});this.copyToClipboard(b)}};ra.prototype.canCopySelection=function(){var a=this.h;return null!==a&&a.lk&&a.Bz&&0!==a.selection.count?!0:!1};ra.prototype.cutSelection=function(){this.copySelection();this.deleteSelection()}; +ra.prototype.canCutSelection=function(){var a=this.h;return null!==a&&!a.ib&&!a.Ef&&a.lk&&a.Rm&&a.Bz&&0!==a.selection.count?!0:!1};ra.prototype.copyToClipboard=function(a){var b=this.h;if(null!==b){var c=null;if(null===a)eh=null,fh="";else{var c=b.ha,d=!1,e=!1,g=null;try{if(c instanceof qg){var h=c,d=h.Zm;h.Zm=this.YD}c instanceof V&&(h=c,e=h.Ym,h.Ym=this.XD);g=b.gp(a,null,!0)}finally{c instanceof qg&&(c.Zm=d),c instanceof V&&(c.Ym=e),c=new J(D),c.$c(g),eh=c,fh=b.ha.Bl}}b.Ja("ClipboardChanged",c)}}; +ra.prototype.pasteFromClipboard=function(){var a=new K(D),b=eh;if(null===b)return a;var c=this.h;if(null===c||fh!==c.ha.Bl)return a;var d=c.ha,e=!1,g=!1,h=null;try{if(d instanceof qg){var k=d,e=k.Zm;k.Zm=this.YD}d instanceof V&&(k=d,g=k.Ym,k.Ym=this.XD);h=c.gp(b,c,!1)}finally{for(d instanceof qg&&(d.Zm=e),d instanceof V&&(d.Ym=g),b=h.i;b.next();)c=b.value,d=b.key,c.location.F()||(d.location.F()?c.location=d.location:!c.position.F()&&d.position.F()&&(c.position=d.position)),a.add(c)}return a}; +ra.prototype.pasteSelection=function(a){void 0===a&&(a=null);var b=this.h;if(null!==b)try{b.gc="wait";b.Wb("Paste");b.Ja("ChangingSelection");var c=this.pasteFromClipboard();0<c.count&&kh(b);for(var d=c.i;d.next();)d.value.jb=!0;b.Ja("ChangedSelection");if(null!==a){var e=b.computePartsBounds(b.selection);if(e){var g=b.gb.me;null===g&&(g=new lh,g.Sc(b));var h=g.computeEffectiveCollection(b.selection);g.moveParts(h,new N(a.x-e.ra,a.y-e.za),!1)}}b.Ja("ClipboardPasted",c)}finally{b.Jd("Paste"),b.gc= +""}};ra.prototype.canPasteSelection=function(){var a=this.h;return null===a||a.ib||a.Ef||!a.$o||!a.Bz||null===eh||fh!==a.ha.Bl?!1:!0};ra.prototype.undo=function(){var a=this.h;null!==a&&a.pa.undo()};ra.prototype.canUndo=function(){var a=this.h;return null===a||a.ib||a.Ef?!1:a.GD&&a.pa.canUndo()};ra.prototype.redo=function(){var a=this.h;null!==a&&a.pa.redo()};ra.prototype.canRedo=function(){var a=this.h;return null===a||a.ib||a.Ef?!1:a.GD&&a.pa.canRedo()}; +ra.prototype.decreaseZoom=function(a){void 0===a&&(a=1/this.Ux);z.p(a,ra,"decreaseZoom:factor");var b=this.h;null!==b&&b.xl===mh&&(a*=b.scale,a<b.Ah||a>b.zh||(b.scale=a))};ra.prototype.canDecreaseZoom=function(a){void 0===a&&(a=1/this.Ux);z.p(a,ra,"canDecreaseZoom:factor");var b=this.h;if(null===b||b.xl!==mh)return!1;a*=b.scale;return a<b.Ah||a>b.zh?!1:b.Jw}; +ra.prototype.increaseZoom=function(a){void 0===a&&(a=this.Ux);z.p(a,ra,"increaseZoom:factor");var b=this.h;null!==b&&b.xl===mh&&(a*=b.scale,a<b.Ah||a>b.zh||(b.scale=a))};ra.prototype.canIncreaseZoom=function(a){void 0===a&&(a=this.Ux);z.p(a,ra,"canIncreaseZoom:factor");var b=this.h;if(null===b||b.xl!==mh)return!1;a*=b.scale;return a<b.Ah||a>b.zh?!1:b.Jw};ra.prototype.resetZoom=function(a){void 0===a&&(a=this.Sw);z.p(a,ra,"resetZoom:newscale");var b=this.h;null===b||a<b.Ah||a>b.zh||(b.scale=a)}; +ra.prototype.canResetZoom=function(a){void 0===a&&(a=this.Sw);z.p(a,ra,"canResetZoom:newscale");var b=this.h;return null===b||a<b.Ah||a>b.zh?!1:b.Jw};ra.prototype.zoomToFit=function(){var a=this.h;if(null!==a){var b=a.scale,c=a.position;b===this.yz&&!isNaN(this.Yy)&&a.ad.N(this.xz)?(a.scale=this.Yy,a.position=this.yC,this.yz=NaN,this.xz=Jd):(this.Yy=b,this.yC=c.copy(),a.zoomToFit(),this.yz=a.scale,this.xz=a.ad.copy())}};ra.prototype.canZoomToFit=function(){var a=this.h;return null===a?!1:a.Jw}; +ra.prototype.scrollToPart=function(a){void 0===a&&(a=null);null!==a&&z.l(a,D,ra,"part");var b=this.h;if(null!==b){if(null===a){try{null!==this.Vi&&(this.Vi.next()?a=this.Vi.value:this.Vi=null)}catch(c){this.Vi=null}null===a&&(0<b.gn.count?this.Vi=b.gn.i:0<b.selection.count&&(this.Vi=b.selection.i),null!==this.Vi&&this.Vi.next()&&(a=this.Vi.value))}if(null!==a){var d=b.Ua;d.rn("Scroll To Part");var e=b.position.copy();b.XG(a.W);e.Mc(b.position)&&d.pi()}}}; +ra.prototype.canScrollToPart=function(a){void 0===a&&(a=null);null!==a&&z.l(a,D,ra,"part");a=this.h;return null===a||0===a.selection.count&&0===a.gn.count?!1:a.ye&&a.ze};ra.prototype.collapseTree=function(a){void 0===a&&(a=null);var b=this.h;if(null!==b)try{b.Wb("Collapse Tree");b.Ua.rn("Collapse Tree");var c=new J(E);if(null!==a&&a.vd)a.collapseTree(),c.add(a);else for(var d=b.selection.i;d.next();){var e=d.value;e instanceof E&&(a=e,a.vd&&(a.collapseTree(),c.add(a)))}b.Ja("TreeCollapsed",c)}finally{b.Jd("Collapse Tree")}}; +ra.prototype.canCollapseTree=function(a){void 0===a&&(a=null);var b=this.h;if(null===b||b.ib)return!1;if(null!==a){if(!a.vd)return!1;if(0<a.ax().count)return!0}else for(a=b.selection.i;a.next();)if(b=a.value,b instanceof E&&b.vd&&0<b.ax().count)return!0;return!1}; +ra.prototype.expandTree=function(a){void 0===a&&(a=null);var b=this.h;if(null!==b)try{b.Wb("Expand Tree");b.Ua.rn("Expand Tree");var c=new J(E);if(null===a||a.vd)for(var d=b.selection.i;d.next();){var e=d.value;e instanceof E&&(a=e,a.vd||(a.expandTree(),c.add(a)))}else a.expandTree(),c.add(a);b.Ja("TreeExpanded",c)}finally{b.Jd("Expand Tree")}}; +ra.prototype.canExpandTree=function(a){void 0===a&&(a=null);var b=this.h;if(null===b||b.ib)return!1;if(null!==a){if(a.vd)return!1;if(0<a.ax().count)return!0}else for(a=b.selection.i;a.next();)if(b=a.value,b instanceof E&&!b.vd&&0<b.ax().count)return!0;return!1}; +ra.prototype.groupSelection=function(){var a=this.h;if(null!==a){var b=a.ha;if(b instanceof V){var c=this.HD;if(null!==c){var d=null;try{a.gc="wait";a.Wb("Group");a.Ja("ChangingSelection");for(var e=new J(D),g=a.selection.i;g.next();){var h=g.value;h.be()&&h.canGroup()&&e.add(h)}for(var k=new J(D),l=e.i;l.next();){for(var m=l.value,g=!1,n=e.i;n.next();)if(m.mi(n.value)){g=!0;break}g||k.add(m)}if(0<k.count){var p=k.first().Va;if(null!==p)for(;null!==p;){for(var e=!1,q=k.i;q.next();)if(!q.value.mi(p)){e= +!0;break}if(e)p=p.Va;else break}if(c instanceof F)jh(c),d=c.copy(),null!==d&&a.add(d);else if(b.gA(c)){var r=b.copyNodeData(c);z.Za(r)&&(b.sl(r),d=a.$w(r))}if(null!==d){null!==p&&this.isValidMember(p,d)&&(d.Va=p);for(var s=k.i;s.next();){var t=s.value;this.isValidMember(d,t)&&(t.Va=d)}a.select(d)}}a.Ja("ChangedSelection");a.Ja("SelectionGrouped",d)}finally{a.Jd("Group"),a.gc=""}}}}}; +ra.prototype.canGroupSelection=function(){var a=this.h;if(null===a||a.ib||a.Ef||!a.$o||!a.Ew||!(a.ha instanceof V)||null===this.HD)return!1;for(a=a.selection.i;a.next();){var b=a.value;if(b.be()&&b.canGroup())return!0}return!1};function nh(a){var b=z.rb();for(a=a.i;a.next();){var c=a.value;c instanceof G||b.push(c)}a=new K(D);for(var c=b.length,d=0;d<c;d++){for(var e=b[d],g=!0,h=0;h<c;h++)if(e.mi(b[h])){g=!1;break}g&&a.add(e)}z.xa(b);return a} +ra.prototype.isValidMember=function(a,b){if(null===b||a===b||b instanceof G)return!1;if(null!==a){if(a===b||a.mi(b))return!1;var c=a.pA;if(null!==c&&!c(a,b)||null===a.data&&null!==b.data||null!==a.data&&null===b.data)return!1}c=this.pA;return null!==c?c(a,b):!0}; +ra.prototype.ungroupSelection=function(a){void 0===a&&(a=null);var b=this.h;if(null!==b){var c=b.ha;if(c instanceof V)try{b.gc="wait";b.Wb("Ungroup");b.Ja("ChangingSelection");var d=new J(F);if(null!==a)d.add(a);else for(var e=b.selection.i;e.next();){var g=e.value;g instanceof F&&(a=g,a.canUngroup()&&d.add(a))}if(0<d.count){b.Mw();for(var h=d.i;h.next();){var k=h.value;k.expandSubGraph();var l=k.Va,m=null!==l&&null!==l.data?c.pb(l.data):void 0,n=new J(D);n.$c(k.Hc);for(var p=n.i;p.next();){var q= +p.value;q.jb=!0;if(!(q instanceof G)){var r=q.data;null!==r?c.Mx(r,m):q.Va=l}}b.remove(k)}}b.Ja("ChangedSelection");b.Ja("SelectionUngrouped",d,n)}finally{b.Jd("Ungroup"),b.gc=""}}};ra.prototype.canUngroupSelection=function(a){void 0===a&&(a=null);var b=this.h;if(null===b||b.ib||b.Ef||!b.Rm||!b.Iw||!(b.ha instanceof V))return!1;if(null!==a){if(a.canUngroup())return!0}else for(a=b.selection.i;a.next();)if(b=a.value,b instanceof F&&b.canUngroup())return!0;return!1}; +ra.prototype.addTopLevelParts=function(a,b){for(var c=!0,d=nh(a).i;d.next();){var e=d.value;null!==e.Va&&(!b||this.isValidMember(null,e)?e.Va=null:c=!1)}return c}; +ra.prototype.collapseSubGraph=function(a){void 0===a&&(a=null);var b=this.h;if(null!==b)try{b.Wb("Collapse SubGraph");b.Ua.rn("Collapse SubGraph");var c=new J(F);if(null!==a&&a.se)a.collapseSubGraph(),c.add(a);else for(var d=b.selection.i;d.next();){var e=d.value;e instanceof F&&(a=e,a.se&&(a.collapseSubGraph(),c.add(a)))}b.Ja("SubGraphCollapsed",c)}finally{b.Jd("Collapse SubGraph")}}; +ra.prototype.canCollapseSubGraph=function(a){void 0===a&&(a=null);var b=this.h;if(null===b||b.ib)return!1;if(null!==a)return a.se?!0:!1;for(a=b.selection.i;a.next();)if(b=a.value,b instanceof F&&b.se)return!0;return!1}; +ra.prototype.expandSubGraph=function(a){void 0===a&&(a=null);var b=this.h;if(null!==b)try{b.Wb("Expand SubGraph");b.Ua.rn("Expand SubGraph");var c=new J(F);if(null===a||a.se)for(var d=b.selection.i;d.next();){var e=d.value;e instanceof F&&(a=e,a.se||(a.expandSubGraph(),c.add(a)))}else a.expandSubGraph(),c.add(a);b.Ja("SubGraphExpanded",c)}finally{b.Jd("Expand SubGraph")}}; +ra.prototype.canExpandSubGraph=function(a){void 0===a&&(a=null);var b=this.h;if(null===b||b.ib)return!1;if(null!==a)return a.se?!1:!0;for(a=b.selection.i;a.next();)if(b=a.value,b instanceof F&&!b.se)return!0;return!1}; +ra.prototype.editTextBlock=function(a){void 0===a&&(a=null);null!==a&&z.l(a,qa,ra,"editTextBlock");var b=this.h;if(null!==b){var c=b.gb.WA;if(null!==c){if(null===a){a=null;for(var d=b.selection.i;d.next();){var e=d.value;if(e.canEdit()){a=e;break}}if(null===a)return;a=a.zt(function(a){return a instanceof qa&&a.Sz})}null!==a&&(b.cb=null,c.He=a,b.cb=c)}}}; +ra.prototype.canEditTextBlock=function(a){void 0===a&&(a=null);null!==a&&z.l(a,qa,ra,"canEditTextBlock");var b=this.h;if(null===b||b.ib||b.Ef||!b.Hw||null===b.gb.WA)return!1;if(null!==a){if(a=a.ca,null!==a&&a.canEdit())return!0}else for(b=b.selection.i;b.next();)if(a=b.value,a.canEdit()&&(a=a.zt(function(a){return a instanceof qa&&a.Sz}),null!==a))return!0;return!1}; +ra.prototype.showContextMenu=function(a){var b=this.h;if(null!==b){var c=b.gb.Iz;if(null!==c&&(void 0===a&&(a=0<b.selection.count?b.selection.first():b),a=c.findObjectWithContextMenu(a),null!==a)){var d=new Rf,e=null;a instanceof O?e=a.eb(ec):b.gI||(e=b.xb,e=new N(e.x+e.width/2,e.y+e.height/2));null!==e&&(d.h=b,d.ue=b.$A(e),d.ga=e,d.left=!1,d.right=!0,d.up=!0,b.R=d);b.cb=c;oh(c,!1,a)}}}; +ra.prototype.canShowContextMenu=function(a){var b=this.h;if(null===b)return!1;var c=b.gb.Iz;if(null===c)return!1;void 0===a&&(a=0<b.selection.count?b.selection.first():b);return null===c.findObjectWithContextMenu(a)?!1:!0};z.defineProperty(ra,{hH:"copiesClipboardData"},function(){return this.zB},function(a){z.g(a,"boolean",ra,"copiesClipboardData");this.zB=a}); +z.defineProperty(ra,{iH:"copiesConnectedLinks"},function(){return this.AB},function(a){z.g(a,"boolean",ra,"copiesConnectedLinks");this.AB=a});z.defineProperty(ra,{gE:"deletesConnectedLinks"},function(){return this.TB},function(a){z.g(a,"boolean",ra,"deletesConnectedLinks");this.TB=a});z.defineProperty(ra,{kH:"copiesTree"},function(){return this.EB},function(a){z.g(a,"boolean",ra,"copiesTree");this.EB=a}); +z.defineProperty(ra,{pH:"deletesTree"},function(){return this.UB},function(a){z.g(a,"boolean",ra,"deletesTree");this.UB=a});z.defineProperty(ra,{YD:"copiesParentKey"},function(){return this.DB},function(a){z.g(a,"boolean",ra,"copiesParentKey");this.DB=a});z.defineProperty(ra,{XD:"copiesGroupKey"},function(){return this.CB},function(a){z.g(a,"boolean",ra,"copiesGroupKey");this.CB=a}); +z.defineProperty(ra,{HD:"archetypeGroupData"},function(){return this.jy},function(a){null!==a&&z.l(a,Object,ra,"archetypeGroupData");var b=this.h;null!==b&&(b=b.ha,b instanceof V&&(a instanceof F||b.gA(a)||z.k("CommandHandler.archetypeGroupData must be either a Group or a data object for which GraphLinksModel.isGroupForNodeData is true: "+a)));this.jy=a});z.defineProperty(ra,{pA:"memberValidation"},function(){return this.il},function(a){null!==a&&z.g(a,"function",ra,"memberValidation");this.il=a}); +z.defineProperty(ra,{Sw:"defaultScale"},function(){return this.RB},function(a){z.p(a,ra,"defaultScale");0<a||z.k("defaultScale must be larger than zero, not: "+a);this.RB=a});z.defineProperty(ra,{Ux:"zoomFactor"},function(){return this.yD},function(a){z.p(a,ra,"zoomFactor");1<a||z.k("zoomFactor must be larger than 1.0, not: "+a);this.yD=a});function xg(){0<arguments.length&&z.od(xg);z.kc(this);this.Z=null;this.Ub="";this.af=!0;this.kC=!1;this.uD=null;this.Aw=-1}z.ia("Tool",xg); +xg.prototype.Sc=function(a){u&&null!==a&&z.l(a,B,xg,"setDiagram");this.Z=a};xg.prototype.toString=function(){return""!==this.name?this.name+" Tool":z.kf(Object.getPrototypeOf(this))};xg.prototype.updateAdornments=function(){};xg.prototype.canStart=function(){return this.isEnabled};xg.prototype.doStart=function(){};xg.prototype.doActivate=function(){this.ua=!0};xg.prototype.doDeactivate=function(){this.ua=!1};xg.prototype.doStop=function(){};xg.prototype.doCancel=function(){this.stopTool()}; +xg.prototype.stopTool=function(){var a=this.h;null!==a&&a.cb===this&&(a.cb=null,a.gc="")};xg.prototype.doMouseDown=function(){!this.ua&&this.canStart()&&this.doActivate()};xg.prototype.doMouseMove=function(){};xg.prototype.doMouseUp=function(){this.stopTool()};xg.prototype.doMouseWheel=function(){};xg.prototype.canStartMultiTouch=function(){return!0}; +xg.prototype.standardPinchZoomStart=function(){var a=this.h;if(null!==a){var b=a.R.event,c=null,d=null;if(void 0!==b.targetTouches){if(2>b.targetTouches.length)return;c=b.targetTouches[0];d=b.targetTouches[1]}else if(null!==a.Uf[0])c=a.Uf[0],d=a.Uf[1];else return;this.doCancel();if(a.rp("hasGestureZoom")){a.My=!0;a.KC=a.scale;var e=yh(a),g=c,h=g.clientX-e.x,c=g.clientY-e.y,g=d,d=g.clientX-e.x,g=g.clientY-e.y;z.A(e);e=d-h;c=g-c;a.cD=Math.sqrt(e*e+c*c);b.preventDefault();b.cancelBubble=!0}}}; +xg.prototype.standardPinchZoomMove=function(){var a=this.h;if(null!==a){var b=a.R.event;this.doCancel();var c=null,d=null;if(void 0!==b.targetTouches){if(2>b.targetTouches.length)return;c=b.targetTouches[0];d=b.targetTouches[1]}else if(null!==a.Uf[0])c=a.Uf[0],d=a.Uf[1];else return;if(a.rp("hasGestureZoom")&&a.My){var e=yh(a),g=c,c=g.clientX-e.x,h=g.clientY-e.y,g=d,d=g.clientX-e.x,g=g.clientY-e.y;z.A(e);var e=d-c,k=g-h,e=Math.sqrt(e*e+k*k)/a.cD,c=new N((Math.min(d,c)+Math.max(d,c))/2,(Math.min(g, +h)+Math.max(g,h))/2),h=a.KC*e,d=a.wb;h!==a.scale&&d.canResetZoom(h)&&(e=a.$l,a.$l=c,d.resetZoom(h),a.$l=e);b.preventDefault();b.cancelBubble=!0}}};xg.prototype.doKeyDown=function(){var a=this.h;null!==a&&"Esc"===a.R.key&&this.doCancel()};xg.prototype.doKeyUp=function(){};xg.prototype.startTransaction=xg.prototype.Wb=function(a){void 0===a&&(a=this.name);this.Mf=null;var b=this.h;return null===b?!1:b.Wb(a)}; +xg.prototype.stopTransaction=xg.prototype.yk=function(){var a=this.h;return null===a?!1:null===this.Mf?a.Vp():a.Jd(this.Mf)}; +xg.prototype.standardMouseSelect=function(){var a=this.h;if(null!==a&&a.xf){var b=a.R,c=a.Bt(b.ga,!1);if(null!==c)if(z.sk?b.$t:b.control){a.Ja("ChangingSelection");for(b=c;null!==b&&!b.canSelect();)b=b.Va;null!==b&&(b.jb=!b.jb);a.Ja("ChangedSelection")}else if(b.shift){if(!c.jb){a.Ja("ChangingSelection");for(b=c;null!==b&&!b.canSelect();)b=b.Va;null!==b&&(b.jb=!0);a.Ja("ChangedSelection")}}else{if(!c.jb){for(b=c;null!==b&&!b.canSelect();)b=b.Va;null!==b&&a.select(b)}}else!b.left||(z.sk?b.$t:b.control)|| +b.shift||a.Mw()}};xg.prototype.standardMouseClick=function(a,b){void 0===a&&(a=null);void 0===b&&(b=function(a){return!a.layer.Nc});var c=this.h;if(null===c)return!1;var d=c.R,e=c.pe(d.ga,a,b);d.Ge=e;Gh(e,d,c);return d.Gc}; +function Gh(a,b,c){b.Gc=!1;var d=0;b.left?d=1===b.Pe?1:2===b.Pe?2:1:b.right&&1===b.Pe&&(d=3);var e="";if(null!==a){switch(d){case 1:e="ObjectSingleClicked";break;case 2:e="ObjectDoubleClicked";break;case 3:e="ObjectContextClicked"}0!==d&&c.Ja(e,a)}else{switch(d){case 1:e="BackgroundSingleClicked";break;case 2:e="BackgroundDoubleClicked";break;case 3:e="BackgroundContextClicked"}0!==d&&c.Ja(e)}if(null!==a)for(;null!==a;){c=null;switch(d){case 1:c=a.click;break;case 2:c=a.wt?a.wt:a.click;break;case 3:c= +a.Hz}if(null!==c&&(c(b,a),b.Gc))break;a=a.T}else{a=null;switch(d){case 1:a=c.click;break;case 2:a=c.wt?c.wt:c.click;break;case 3:a=c.Hz}null!==a&&a(b)}} +xg.prototype.standardMouseOver=function(){var a=this.h;if(null!==a){var b=a.R;if(null!==b.h&&!0!==a.Ua.wc){var c=a.Bb;a.Bb=!0;var d=a.pe(b.ga,null,null);b.Ge=d;var e=!1;if(d!==a.Rn){var g=a.Rn,h=g;a.Rn=d;this.doCurrentObjectChanged(g,d);for(b.Gc=!1;null!==g;){var k=g.bu;if(null!==k){if(d===g)break;if(null!==d&&d.Pl(g))break;k(b,g,d);e=!0;if(b.Gc)break}g=g.T}g=h;for(b.Gc=!1;null!==d;){k=d.au;if(null!==k){if(g===d)break;if(null!==g&&g.Pl(d))break;k(b,d,g);e=!0;if(b.Gc)break}d=d.T}d=a.Rn}if(null!==d){g= +d;for(k="";null!==g;){k=g.cursor;if(""!==k)break;g=g.T}a.gc=k;b.Gc=!1;for(g=d;null!==g;){k=g.tA;if(null!==k&&(k(b,g),e=!0,b.Gc))break;g=g.T}}else a.gc="",k=a.tA,null!==k&&(k(b),e=!0);e&&a.Ce();a.Bb=c}}};xg.prototype.doCurrentObjectChanged=function(){}; +xg.prototype.standardMouseWheel=function(){var a=this.h;if(null!==a){var b=a.R,c=b.Dl;if(0!==c&&a.ad.F()){var d=a.wb,e=a.gb.cu;if((e===Hh&&!b.shift||e===Ih&&b.control)&&(0<c?d.canIncreaseZoom():d.canDecreaseZoom()))e=a.$l,a.$l=b.ue,0<c?d.increaseZoom():d.decreaseZoom(),a.$l=e,b.bubbles=!1;else if(e===Hh&&b.shift||e===Ih&&!b.control){var d=a.position.copy(),e=0<c?c:-c,g=b.event.deltaX,h=b.event.deltaY;void 0===g||void 0===h||0===g&&0===h?!b.shift&&a.ze?(g=a.ou,e=e/40*g,0<c?a.scroll("pixel","up",e): +a.scroll("pixel","down",e)):b.shift&&a.ye&&(g=a.nu,e=e/40*g,0<c?a.scroll("pixel","left",e):a.scroll("pixel","right",e)):(0!==g&&a.ye&&(0<g?a.scroll("pixel","left",-g):a.scroll("pixel","right",g)),0!==h&&a.ze&&(0<h?a.scroll("pixel","up",-h):a.scroll("pixel","down",h)));a.position.N(d)||(b.bubbles=!1)}}}};xg.prototype.standardWaitAfter=function(a,b){z.g(a,"number",xg,"standardWaitAfter:delay");this.cancelWaitAfter();var c=this,d=b.copy();this.Aw=z.setTimeout(function(){c.doWaitAfter(d)},a)}; +xg.prototype.cancelWaitAfter=function(){-1!==this.Aw&&z.clearTimeout(this.Aw);this.Aw=-1};xg.prototype.doWaitAfter=function(){};xg.prototype.findToolHandleAt=function(a,b){var c=this.h;if(null===c)return null;c=c.pe(a,function(a){for(;null!==a&&!(a.T instanceof da);)a=a.T;return a});return null===c?null:c.T.nc===b?c:null}; +xg.prototype.isBeyondDragSize=function(a,b){var c=this.h;if(null===c)return!1;void 0===a&&(a=c.Fc.ue);void 0===b&&(b=c.R.ue);var d=c.gb.tH,e=d.width,d=d.height;c.Fc.mj&&(e+=6,d+=6);return Math.abs(b.x-a.x)>e||Math.abs(b.y-a.y)>d};z.w(xg,{h:"diagram"},function(){return this.Z});z.defineProperty(xg,{name:"name"},function(){return this.Ub},function(a){z.g(a,"string",xg,"name");this.Ub=a}); +z.defineProperty(xg,{isEnabled:"isEnabled"},function(){return this.af},function(a){z.g(a,"boolean",xg,"isEnabled");this.af=a});z.defineProperty(xg,{ua:"isActive"},function(){return this.kC},function(a){z.g(a,"boolean",xg,"isActive");this.kC=a});z.defineProperty(xg,{Mf:"transactionResult"},function(){return this.uD},function(a){null!==a&&z.g(a,"string",xg,"transactionResult");this.uD=a}); +function lh(){0<arguments.length&&z.od(lh);xg.call(this);this.name="Dragging";this.BB=this.oC=!0;this.jr=this.$B=!1;this.tC=!0;this.Ny=(new Ea(NaN,NaN)).freeze();this.Oy=Zb;this.Py=(new N(NaN,NaN)).freeze();this.ZB=!1;this.XB=this.yB=this.YB=this.JB=this.Ti=null;this.Uq=this.rC=!1;this.Po=new N(NaN,NaN);this.qw=new N;this.tw=!1;this.nC=!0;this.$n=100;this.Cj=[];this.oG=(new K(D)).freeze()}z.Qa(lh,xg);z.ia("DraggingTool",lh); +z.defineProperty(lh,{KE:"isCopyEnabled"},function(){return this.oC},function(a){z.g(a,"boolean",lh,"isCopyEnabled");this.oC=a});z.defineProperty(lh,{jH:"copiesEffectiveCollection"},function(){return this.BB},function(a){z.g(a,"boolean",lh,"copiesEffectiveCollection");this.BB=a});z.defineProperty(lh,{uH:"dragsTree"},function(){return this.$B},function(a){z.g(a,"boolean",lh,"dragsTree");this.$B=a}); +z.defineProperty(lh,{jx:"isGridSnapEnabled"},function(){return this.jr},function(a){z.g(a,"boolean",lh,"isGridSnapEnabled");this.jr=a});z.defineProperty(lh,{cI:"isComplexRoutingRealtime"},function(){return this.nC},function(a){z.g(a,"boolean",lh,"isComplexRoutingRealtime");this.nC=a});z.defineProperty(lh,{eI:"isGridSnapRealtime"},function(){return this.tC},function(a){z.g(a,"boolean",lh,"isGridSnapRealtime");this.tC=a}); +z.defineProperty(lh,{AE:"gridSnapCellSize"},function(){return this.Ny},function(a){z.l(a,Ea,lh,"gridSnapCellSize");this.Ny.N(a)||(this.Ny=a=a.V())});z.defineProperty(lh,{PH:"gridSnapCellSpot"},function(){return this.Oy},function(a){z.l(a,Q,lh,"gridSnapCellSpot");this.Oy.N(a)||(this.Oy=a=a.V())});z.defineProperty(lh,{QH:"gridSnapOrigin"},function(){return this.Py},function(a){z.l(a,N,lh,"gridSnapOrigin");this.Py.N(a)||(this.Py=a=a.V())}); +z.defineProperty(lh,{gj:"dragsLink"},function(){return this.ZB},function(a){z.g(a,"boolean",lh,"dragsLink");this.ZB=a});z.defineProperty(lh,{an:"currentPart"},function(){return this.JB},function(a){null!==a&&z.l(a,D,lh,"currentPart");this.JB=a});z.defineProperty(lh,{oc:"copiedParts"},function(){return this.yB},function(a){this.yB=a});z.defineProperty(lh,{hc:"draggedParts"},function(){return this.YB},function(a){this.YB=a}); +z.w(lh,{uK:"draggingParts"},function(){return null!==this.oc?this.oc.vj():null!==this.hc?this.hc.vj():this.oG});z.defineProperty(lh,{ld:"draggedLink"},function(){return this.XB},function(a){null!==a&&z.l(a,G,lh,"draggedLink");this.XB=a});z.defineProperty(lh,{ix:"isDragOutStarted"},function(){return this.rC},function(a){this.rC=a});z.defineProperty(lh,{xk:"startPoint"},function(){return this.qw},function(a){z.l(a,N,lh,"startPoint");this.qw.N(a)||(this.qw=a=a.V())}); +z.defineProperty(lh,{bE:"delay"},function(){return this.$n},function(a){z.g(a,"number",lh,"delay");this.$n=a});lh.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.h;if(null===a||a.ib&&!a.kt||!a.vl&&!a.lk&&!a.kt||!a.xf)return!1;var b=a.R;return!b.left||a.cb!==this&&(!this.isBeyondDragSize()||b.mj&&b.timestamp-a.Fc.timestamp<this.$n)?!1:null!==this.findDraggablePart()}; +lh.prototype.findDraggablePart=function(){var a=this.h;if(null===a)return null;a=a.Bt(a.Fc.ga,!1);if(null===a)return null;for(;null!==a&&!a.canSelect();)a=a.Va;return null!==a&&(a.canMove()||a.canCopy())?a:null};lh.prototype.standardMouseSelect=function(){var a=this.h;if(null!==a&&a.xf){var b=a.Bt(a.Fc.ga,!1);if(null!==b){for(;null!==b&&!b.canSelect();)b=b.Va;this.an=b;this.an.jb||(a.Ja("ChangingSelection"),b=a.R,(z.sk?b.$t:b.control)||b.shift||kh(a),this.an.jb=!0,a.Ja("ChangedSelection"))}}}; +lh.prototype.doActivate=function(){var a=this.h;if(null!==a){null===this.an&&this.standardMouseSelect();var b=this.an;null!==b&&(b.canMove()||b.canCopy())&&(this.ua=!0,this.Po.set(a.position),Jh(this,a.selection),this.Cj.length=0,this.hc=this.computeEffectiveCollection(a.selection),a.vu=!0,Kh(this,this.hc),this.Wb("Drag"),this.xk=a.Fc.ga,a.We=!0,a.kt&&(this.ix=!0,this.Uq=!1,Lh=this,Mh=this.h,this.doSimulatedDragOut()))}}; +function Jh(a,b){if(a.gj){var c=a.h;null!==c&&c.Sm&&(c.ha instanceof V&&1===b.count&&b.first()instanceof G?(a.ld=b.first(),a.ld.canRelinkFrom()&&a.ld.canRelinkTo()&&a.ld.pt(),a.Ti=c.gb.jF,null===a.Ti&&(a.Ti=new Nh,a.Ti.Sc(c))):(a.ld=null,a.Ti=null))}} +lh.prototype.computeEffectiveCollection=function(a){var b=null!==this.h&&this.h.cb===this,c=new na(D);if(null===a)return c;for(var d=a.i;d.next();)Oh(this,c,d.value,b);if(null!==this.ld&&this.gj)return c;for(d=a.i;d.next();)a=d.value,a instanceof G&&(b=a.Y,null===b||c.contains(b)?(b=a.da,null===b||c.contains(b)||c.remove(a)):c.remove(a));return c};function Ph(a){return void 0===a?new Qh(Id):new Qh(a.copy())} +function Oh(a,b,c,d){if(!b.contains(c)&&(!d||c.canMove()||c.canCopy()))if(c instanceof E){b.add(c,Ph(c.location));if(c instanceof F)for(var e=c.Hc;e.next();)Oh(a,b,e.value,d);for(e=c.ee;e.next();){var g=e.value;if(!b.contains(g)){var h=g.Y,k=g.da;null!==h&&b.contains(h)&&null!==k&&b.contains(k)&&Oh(a,b,g,d)}}if(a.uH)for(c=c.sE();c.next();)Oh(a,b,c.value,d)}else if(c instanceof G)for(g=c,b.add(g,Ph()),e=g.Hf;e.next();)Oh(a,b,e.value,d);else c instanceof da||b.add(c,Ph(c.location))} +lh.prototype.doDeactivate=function(){this.ua=!1;var a=this.h;null!==a&&Rh(a);Sh(this);Th(this,this.hc);this.hc=this.an=null;this.Uq=this.ix=!1;if(0<Uh.count){for(var b=Uh.length,c=0;c<b;c++){var d=Uh.ea(c);Vh(d);Wh(d);Sh(d);null!==d.h&&Rh(d.h)}Uh.clear()}Vh(this);this.Po.n(NaN,NaN);Lh=Mh=null;Wh(this);a.We=!1;a.gc="";a.vu=!1;this.yk()};function Sh(a){var b=a.h;if(null!==b){var c=b.Bb;b.Bb=!0;Xh(a,b.R,null);b.Bb=c}a.Cj.length=0} +function Yh(){var a=Lh;Wh(a);Zh(a);var b=a.h;null!==b&&a.Po.F()&&(b.position=a.Po);null!==b&&Rh(b)}lh.prototype.doCancel=function(){Wh(this);Zh(this);var a=this.h;null!==a&&this.Po.F()&&(a.position=this.Po);this.stopTool()};function Kh(a,b){if(null!==b){a.tw=!0;for(var c=b.i;c.next();){var d=c.key;d instanceof G&&(d.eq=!0)}}}function Th(a,b){if(null!==b){for(var c=b.i;c.next();){var d=c.key;d instanceof G&&(d.eq=!1,d.kj&&$h(d)&&d.qc())}a.tw=!1}} +lh.prototype.doKeyDown=function(){var a=this.h;null!==a&&(a=a.R,null!==a&&this.ua&&("Esc"===a.key?this.doCancel():this.doMouseMove()))};lh.prototype.doKeyUp=function(){var a=this.h;null!==a&&null!==a.R&&this.ua&&this.doMouseMove()};function ai(a,b){for(var c=Infinity,d=Infinity,e=-Infinity,g=-Infinity,h=a.i;h.next();){var k=h.value;if(k.be()&&k.isVisible()){var l=k.location,k=l.x,l=l.y;isNaN(k)||isNaN(l)||(k<c&&(c=k),l<d&&(d=l),k>e&&(e=k),l>g&&(g=l))}}Infinity===c?b.n(0,0,0,0):b.n(c,d,e-c,g-d)} +function bi(a,b){if(null===a.oc){var c=a.h;if(!(null===c||b&&(c.ib||c.Ef))&&null!==a.hc){var d=c.pa;d.isEnabled&&d.PE?null!==d.ej&&0<d.ej.Zf.count&&(c.pa.Vp(),c.Wb("Drag")):Zh(a);c.Bb=!b;c.lq=!b;a.xk=c.Fc.ga;d=a.jH?a.hc.vj():c.selection;d=c.gp(d,c,!0);for(c=d.i;c.next();)c.value.location=c.key.location;c=z.lg();ai(d,c);z.dc(c);for(var c=new na(D),e=a.hc.i;e.next();){var g=e.key;g.be()&&g.canCopy()&&(g=d.na(g),null!==g&&(g.Bf(),c.add(g,Ph(g.location))))}for(d=d.i;d.next();)e=d.value,e instanceof G&& +e.canCopy()&&c.add(e,Ph());a.oc=c;Jh(a,c.vj());null!==a.ld&&(c=a.ld,d=c.tn,c.Rl(a.xk.x-(d.x+d.width/2),a.xk.y-(d.y+d.height/2)))}}}function Wh(a){var b=a.h;if(null!==b){if(null!==a.oc&&(b.IA(a.oc.vj(),!1),a.oc=null,null!==a.hc))for(var c=a.hc.i;c.next();)c.key instanceof G&&(c.value.point=new N(0,0));b.Bb=!1;b.lq=!1;a.xk=b.Fc.ga}}function Vh(a){if(null!==a.ld){if(a.gj&&null!==a.Ti){var b=a.Ti;b.h.remove(b.Od);b.h.remove(b.Pd)}a.ld=null;a.Ti=null}} +function ci(a,b,c){var d=a.h;if(null!==d){var e=a.xk,g=z.O();g.assign(d.R.ga);a.moveParts(b,g.xu(e),c);z.A(g)}} +lh.prototype.moveParts=function(a,b,c){if(null!==a&&(z.l(a,na,lh,"moveParts:parts"),0!==a.count)){var d=z.O(),e=z.O();e.assign(b);isNaN(e.x)&&(e.x=0);isNaN(e.y)&&(e.y=0);(b=this.tw)||Kh(this,a);for(var g=new J(di),h=new J(Ya),k=a.i;k.next();){var l=k.key;if(l.be()){var m=ei(this,l,a);if(null!==m)g.add(new di(l,k.value,m));else if(!c||l.canMove()){m=k.value.point;d.assign(m);var n=z.O(),p=this.computeMove(l,d.add(e),a,n);l.location=p;k.value.KF=n.xu(m);z.A(n)}}else k.key instanceof G&&h.add(k.lb)}for(c= +g.i;c.next();)g=c.value,m=g.info.point,d.assign(m),g.Pc.location=d.add(g.RH.KF);c=z.O();m=z.O();for(h=h.i;h.next();)if(k=h.value,g=k.key,g instanceof G)if(g.eq)l=g.Y,n=g.da,null!==this.ld&&this.gj?(k=k.value.point,a.add(g,Ph(e)),l=e.x-k.x,k=e.y-k.y,g.Rl(l,k)):(null!==l&&(c.assign(l.location),p=a.na(l),null!==p&&c.xu(p.point)),null!==n&&(m.assign(n.location),p=a.na(n),null!==p&&m.xu(p.point)),null!==l&&null!==n?c.Mc(m)?(k=k.value.point,l=d,l.assign(c),l.xu(k),a.add(g,Ph(c)),g.Rl(l.x,l.y)):(g.eq=!1, +g.qc()):(k=k.value.point,n=null!==l?c:null!==n?m:e,a.add(g,Ph(n)),l=n.x-k.x,k=n.y-k.y,g.Rl(l,k)));else if(null===g.Y||null===g.da)k=k.value.point,a.add(g,Ph(e)),l=e.x-k.x,k=e.y-k.y,g.Rl(l,k);z.A(d);z.A(e);z.A(c);z.A(m);b||Th(this,a)}};function ei(a,b,c){b=b.Va;if(null!==b){a=ei(a,b,c);if(null!==a)return a;a=c.na(b);if(null!==a)return a}return null} +function Zh(a){if(null!==a.hc){for(var b=a.h,c=a.hc.i;c.next();){var d=c.key;d.be()&&(d.location=c.value.point)}for(c=a.hc.i;c.next();)if(d=c.key,d instanceof G&&d.eq){var e=c.value.point;a.hc.add(d,Ph());d.Rl(-e.x,-e.y)}b.cg()}} +lh.prototype.computeMove=function(a,b,c,d){void 0===d&&(d=new N);d.assign(b);if(null===a)return d;void 0===c&&(c=null);var e=b;if(this.jx&&(this.eI||null===c||this.h.R.up)&&(e=z.O(),c=e,c.assign(b),null!==a)){var g=this.h;if(null!==g){var h=g.tp,k=this.AE,g=k.width,k=k.height,l=this.QH,m=l.x,l=l.y,n=this.PH;if(null!==h){var p=h.ex;isNaN(g)&&(g=p.width);isNaN(k)&&(k=p.height);h=h.zE;isNaN(m)&&(m=h.x);isNaN(l)&&(l=h.y)}h=z.Tb(0,0);h.tu(0,0,g,k,n);jb(b.x,b.y,m+h.x,l+h.y,g,k,c);z.A(h)}}c=null!==a.hE? +a.hE(a,b,e):e;k=a.FI;g=k.x;isNaN(g)&&(g=a.location.x);k=k.y;isNaN(k)&&(k=a.location.y);h=a.AI;m=h.x;isNaN(m)&&(m=a.location.x);h=h.y;isNaN(h)&&(h=a.location.y);d.n(Math.max(g,Math.min(c.x,m)),Math.max(k,Math.min(c.y,h)));e!==b&&z.A(e);return d};function fi(a,b){if(null===b)return!0;var c=b.ca;return null===c||c instanceof da||c.layer.Nc||a.hc&&a.hc.contains(c)||a.oc&&a.oc.contains(c)?!0:!1} +function gi(a,b,c,d){var e=a.h;if(null!==e){a.gj&&(null!==a.ld&&(a.ld.Y=null,a.ld.da=null),hi(a,!1));var g=ii(e,b,null,function(b){return!fi(a,b)}),h=e.R;h.Ge=g;var k=e.Bb,l=!1;try{e.Bb=!0;l=Xh(a,h,g);if(!a.ua&&null===Lh)return;if(null===g){var m=e.JI;null!==m&&(m(h),l=!0)}if(!a.ua&&null===Lh)return;a.doDragOver(b,g);if(!a.ua&&null===Lh)return}finally{e.Bb=k,l&&e.cg()}(e.ye||e.ze)&&(c||d)&&ji(e,h.ue)}} +function Xh(a,b,c){var d=!1,e=a.Cj.length,g=0<e?a.Cj[0]:null;if(c===g)return!1;b.Gc=!1;for(var h=0;h<e;h++){var k=a.Cj[h],l=k.II;if(null!==l&&(l(b,k,c),d=!0,b.Gc))break}a.Cj.length=0;if(!a.ua&&null===Lh||null===c)return d;for(b.Gc=!1;null!==c;)a.Cj.push(c),c=ki(c);e=a.Cj.length;for(h=0;h<e&&(k=a.Cj[h],l=k.HI,null===l||(l(b,k,g),d=!0,!b.Gc));h++);return d}function ki(a){var b=a.T;return null!==b?b:a instanceof D&&!(a instanceof F)&&(a=a.Va,null!==a&&a.TH)?a:null} +function li(a,b,c){var d=a.Ti;if(null===d)return null;var e=a.h.cn(b,d.hF,function(a){return d.findValidLinkablePort(a,c)});a=z.O();for(var g=Infinity,h=null,e=e.i;e.next();){var k=e.value;if(null!==k.ca){var l=k.eb(ec,a),l=b.Af(l);l<g&&(h=k,g=l)}}z.A(a);return h} +function hi(a,b){var c=a.ld;if(null!==c&&!(2>c.sa)){var d=a.h;if(null!==d&&!d.ib&&(d=a.Ti,null!==d)){var e=null,g=null;null===c.Y&&(e=li(a,c.m(0),!1),null!==e&&(g=e.ca));var h=null,k=null;null===c.da&&(h=li(a,c.m(c.sa-1),!0),null!==h&&(k=h.ca));d.isValidLink(g,e,k,h)?b?(c.Un=c.m(0).copy(),c.Yn=c.m(c.sa-1).copy(),c.eq=!1,c.Y=g,null!==e&&(c.ag=e.yd),c.da=k,null!==h&&(c.Vg=h.yd)):mi(d,g,e,k,h):mi(d,null,null,null,null)}}}lh.prototype.doDragOver=function(){}; +function ni(a,b){var c=a.h;if(null!==c){a.gj&&hi(a,!0);Sh(a);var d=ii(c,b,null,function(b){return!fi(a,b)}),e=c.R;e.Ge=d;if(null!==d){e.Gc=!1;for(var g=d;null!==g;){var h=g.qA;if(null!==h&&(h(e,g),e.Gc))break;g=ki(g)}}else h=c.qA,null!==h&&h(e);if(a.ua||null!==Lh)if(a.doDropOnto(b,d),a.ua||null!==Lh)for(d=c.selection.i;d.next();)e=d.value,e instanceof E&&oi(c,e.W)}}lh.prototype.doDropOnto=function(){}; +lh.prototype.doMouseMove=function(){if(this.ua){var a=this.h;if(null!==a&&null!==this.an&&null!==this.hc){var b=!1,c=!1;this.mayCopy()?(b=!0,a.gc="copy",bi(this,!1),Kh(this,this.oc),ci(this,this.oc,!1),Th(this,this.oc)):this.mayMove()?(c=!0,a.gc="default",Wh(this),ci(this,this.hc,!0)):this.mayDragOut()?(a.gc="no-drop",bi(this,!1),ci(this,this.oc,!1)):Wh(this);gi(this,a.R.ga,c,b)}}}; +lh.prototype.doMouseUp=function(){if(this.ua){var a=this.h;if(null!==a){var b=!1,c=this.mayCopy();c&&null!==this.oc?(Wh(this),bi(this,!0),Kh(this,this.oc),ci(this,this.oc,!1),Th(this,this.oc),null!==this.oc&&a.EF(this.oc.vj())):(b=!0,Wh(this),this.mayMove()&&(ci(this,this.hc,!0),gi(this,a.R.ga,!0,!1)));this.Uq=!0;ni(this,a.R.ga);if(this.ua){this.oc=null;if(b&&null!==this.hc)for(b=this.hc.i;b.next();){var d=b.key;d instanceof E&&(d=d.Va,null===d||null===d.placeholder||this.hc.contains(d)||d.UD&&d.Q())}a.yc(); +Th(this,this.hc);this.Mf=c?"Copy":"Move";a.Ja(c?"SelectionCopied":"SelectionMoved",a.selection)}this.stopTool()}}};lh.prototype.mayCopy=function(){if(!this.KE)return!1;var a=this.h;if(null===a||a.ib||a.Ef||!a.$o||!a.lk||(z.sk?!a.R.alt:!a.R.control))return!1;for(a=a.selection.i;a.next();){var b=a.value;if(b.be()&&b.canCopy())return!0}return null!==this.ld&&this.gj&&this.ld.canCopy()?!0:!1}; +lh.prototype.mayDragOut=function(){if(!this.KE)return!1;var a=this.h;if(null===a||!a.kt||!a.lk||a.vl)return!1;for(a=a.selection.i;a.next();){var b=a.value;if(b.be()&&b.canCopy())return!0}return null!==this.ld&&this.gj&&this.ld.canCopy()?!0:!1};lh.prototype.mayMove=function(){var a=this.h;if(null===a||a.ib||!a.vl)return!1;for(a=a.selection.i;a.next();){var b=a.value;if(b.be()&&b.canMove())return!0}return null!==this.ld&&this.gj&&this.ld.canMove()?!0:!1};var Uh=new J(lh),Lh=null,Mh=null; +lh.prototype.mayDragIn=function(){var a=this.h;if(null===a||!a.FD||a.ib||a.Ef||!a.$o)return!1;var b=Lh;return null===b||b.h.ha.Bl!==a.ha.Bl?!1:!0};lh.prototype.doSimulatedDragEnter=function(){if(this.mayDragIn()){var a=this.h;a.Ua.pi();pi(a);a=Lh;null!==a&&(a.h.gc="copy")}};lh.prototype.doSimulatedDragLeave=function(){var a=Lh;null!==a&&a.doSimulatedDragOut();this.doCancel()}; +lh.prototype.doSimulatedDragOver=function(){var a=this.h;if(null!==a){var b=Lh;null!==b&&null!==b.hc&&this.mayDragIn()&&(a.gc="copy",qi(this,b.hc.vj(),!1),ci(this,this.oc,!1),gi(this,a.R.ga,!1,!0))}}; +lh.prototype.doSimulatedDrop=function(){var a=this.h;if(null!==a){var b=Lh;if(null!==b){var c=b.h;b.Uq=!0;Wh(this);this.mayDragIn()&&(this.Wb("Drop"),qi(this,b.hc.vj(),!0),ci(this,this.oc,!1),null!==this.oc&&a.EF(this.oc.vj()),ni(this,a.R.ga),a.yc(),b=a.selection,null!==this.oc?this.Mf="ExternalCopy":b=new K(D),this.oc=null,a.focus(),a.Ja("ExternalObjectsDropped",b,c),this.yk())}}}; +function qi(a,b,c){if(null===a.oc){var d=a.h;if(null!==d&&!d.ib&&!d.Ef){d.Bb=!c;d.lq=!c;a.xk=d.R.ga;d=d.gp(b,d,!0);c=z.lg();ai(b,c);var e=c.x+c.width/2,g=c.y+c.height/2;z.dc(c);var h=a.qw;c=new na(D);var k=z.O();for(b=b.i;b.next();){var l=b.value;if(l.be()&&l.canCopy()){var m=l.location,l=d.na(l);k.n(h.x-(e-m.x),h.y-(g-m.y));l.location=k;l.Bf();c.add(l,Ph(k))}}z.A(k);for(d=d.i;d.next();)e=d.value,e instanceof G&&e.canCopy()&&c.add(e,Ph());a.oc=c;Jh(a,c.vj());null!==a.ld&&(c=a.ld,d=c.tn,c.Rl(a.xk.x- +(d.x+d.width/2),a.xk.y-(d.y+d.height/2)))}}}lh.prototype.doSimulatedDragOut=function(){var a=this.h;null!==a&&(this.mayCopy()||this.mayMove()?a.gc="":a.gc="no-drop")};function Qh(a){this.point=a;this.KF=Id}z.ia("DraggingInfo",Qh);function di(a,b,c){this.Pc=a;this.info=b;this.RH=c} +function ri(){0<arguments.length&&z.od(ri);xg.call(this);this.UC=100;this.wC=!1;var a=new G,b=new X;b.Ff=!0;b.stroke="blue";a.add(b);b=new X;b.fq="Standard";b.fill="blue";b.stroke="blue";a.add(b);a.If="Tool";this.mD=a;a=new E;b=new X;b.yd="";b.Hb="Rectangle";b.fill=null;b.stroke="magenta";b.ub=2;b.Aa=Qd;a.add(b);a.wk=!1;a.If="Tool";this.kD=a;this.lD=b;a=new E;b=new X;b.yd="";b.Hb="Rectangle";b.fill=null;b.stroke="magenta";b.ub=2;b.Aa=Qd;a.add(b);a.wk=!1;a.If="Tool";this.nD=a;this.oD=b;this.RC=this.QC= +this.MC=this.LC=this.NC=null;this.sC=!0;this.FG=new na(O,"boolean");this.VC=this.fl=this.gD=null}z.Qa(ri,xg);z.ia("LinkingBaseTool",ri);ri.prototype.doStop=function(){var a=this.h;null!==a&&Rh(a);this.Rg=this.Qg=this.Pg=this.Og=this.sc=null;this.Tx.clear();this.kg=null};z.defineProperty(ri,{hF:"portGravity"},function(){return this.UC},function(a){z.g(a,"number",ri,"portGravity");0<=a&&(this.UC=a)}); +z.defineProperty(ri,{Cp:"isUnconnectedLinkValid"},function(){return this.wC},function(a){z.g(a,"boolean",ri,"isUnconnectedLinkValid");this.wC=a});z.defineProperty(ri,{Ug:"temporaryLink"},function(){return this.mD},function(a){z.l(a,G,ri,"temporaryLink");this.mD=a});z.defineProperty(ri,{Od:"temporaryFromNode"},function(){return this.kD},function(a){z.l(a,E,ri,"temporaryFromNode");this.kD=a}); +z.defineProperty(ri,{yn:"temporaryFromPort"},function(){return this.lD},function(a){z.l(a,O,ri,"temporaryFromPort");this.lD=a});z.defineProperty(ri,{Pd:"temporaryToNode"},function(){return this.nD},function(a){z.l(a,E,ri,"temporaryToNode");this.nD=a});z.defineProperty(ri,{zn:"temporaryToPort"},function(){return this.oD},function(a){z.l(a,O,ri,"temporaryToPort");this.oD=a});z.defineProperty(ri,{sc:"originalLink"},function(){return this.NC},function(a){null!==a&&z.l(a,G,ri,"originalLink");this.NC=a}); +z.defineProperty(ri,{Og:"originalFromNode"},function(){return this.LC},function(a){null!==a&&z.l(a,E,ri,"originalFromNode");this.LC=a});z.defineProperty(ri,{Pg:"originalFromPort"},function(){return this.MC},function(a){null!==a&&z.l(a,O,ri,"originalFromPort");this.MC=a});z.defineProperty(ri,{Qg:"originalToNode"},function(){return this.QC},function(a){null!==a&&z.l(a,E,ri,"originalToNode");this.QC=a}); +z.defineProperty(ri,{Rg:"originalToPort"},function(){return this.RC},function(a){null!==a&&z.l(a,O,ri,"originalToPort");this.RC=a});z.defineProperty(ri,{Md:"isForwards"},function(){return this.sC},function(a){z.g(a,"boolean",ri,"isForwards");this.sC=a});z.w(ri,{Tx:"validPortsCache"},function(){return this.FG});z.defineProperty(ri,{kg:"targetPort"},function(){return this.gD},function(a){null!==a&&z.l(a,O,ri,"targetPort");this.gD=a}); +ri.prototype.copyPortProperties=function(a,b,c,d,e){if(null!==a&&null!==b&&null!==c&&null!==d){d.Aa=b.W.size;e?(d.Eb=b.Eb,d.Yl=b.Yl):(d.Db=b.Db,d.Jl=b.Jl);c.of=ec;var g=z.O();c.location=b.eb(ec,g);z.A(g);d.angle=b.Kl();null!==this.Bx&&this.Bx(a,b,c,d,e)}};ri.prototype.setNoTargetPortProperties=function(a,b,c){null!==b&&(b.Aa=Qd,b.Db=Yb,b.Eb=Yb);null!==a&&(a.location=this.h.R.ga);null!==this.Bx&&this.Bx(null,null,a,b,c)};ri.prototype.doMouseDown=function(){this.ua&&this.doMouseMove()}; +ri.prototype.doMouseMove=function(){if(this.ua){var a=this.h;if(null!==a){this.kg=this.findTargetPort(this.Md);if(null!==this.kg){var b=this.kg.ca;if(b instanceof E){this.Md?this.copyPortProperties(b,this.kg,this.Pd,this.zn,!0):this.copyPortProperties(b,this.kg,this.Od,this.yn,!1);return}}this.Md?this.setNoTargetPortProperties(this.Pd,this.zn,!0):this.setNoTargetPortProperties(this.Od,this.yn,!1);(a.ye||a.ze)&&ji(a,a.R.ue)}}}; +ri.prototype.findValidLinkablePort=function(a,b){if(null===a)return null;var c=a.ca;if(!(c instanceof E))return null;for(;null!==a;){var d=b?a.SF:a.uE;if(!0===d&&(null!==a.yd||a instanceof E)&&(b?this.isValidTo(c,a):this.isValidFrom(c,a)))return a;if(!1===d)break;a=a.T}return null}; +ri.prototype.findTargetPort=function(a){var b=this.h,c=b.R.ga,d=this.hF;0>=d&&(d=.1);for(var e=this,g=b.cn(c,d,function(b){return e.findValidLinkablePort(b,a)},null,!0),d=Infinity,b=null,g=g.i;g.next();){var h=g.value,k=h.ca;if(k instanceof E){var l=h.eb(ec,z.O()),m=c.x-l.x,n=c.y-l.y;z.A(l);l=m*m+n*n;l<d&&(m=this.Tx.na(h),null!==m?m&&(b=h,d=l):a&&this.isValidLink(this.Og,this.Pg,k,h)||!a&&this.isValidLink(k,h,this.Qg,this.Rg)?(this.Tx.add(h,!0),b=h,d=l):this.Tx.add(h,!1))}}return null!==b&&(c=b.ca, +c instanceof E&&(null===c.layer||c.layer.lt))?b:null};ri.prototype.isValidFrom=function(a,b){if(null===a||null===b)return this.Cp;if(this.h.cb===this&&(null!==a.layer&&!a.layer.lt||!0!==b.uE))return!1;var c=b.Xz;if(Infinity>c){if(null!==this.sc&&a===this.Og&&b===this.Pg)return!0;var d=b.yd;null===d&&(d="");if(a.Zw(d).count>=c)return!1}return!0}; +ri.prototype.isValidTo=function(a,b){if(null===a||null===b)return this.Cp;if(this.h.cb===this&&(null!==a.layer&&!a.layer.lt||!0!==b.SF))return!1;var c=b.vJ;if(Infinity>c){if(null!==this.sc&&a===this.Qg&&b===this.Rg)return!0;var d=b.yd;null===d&&(d="");if(a.Ig(d).count>=c)return!1}return!0};ri.prototype.isInSameNode=function(a,b){if(null===a||null===b)return!1;if(a===b)return!0;var c=a.ca,d=b.ca;return null!==c&&c===d}; +ri.prototype.isLinked=function(a,b){if(null===a||null===b)return!1;var c=a.ca;if(!(c instanceof E))return!1;var d=a.yd;null===d&&(d="");var e=b.ca;if(!(e instanceof E))return!1;var g=b.yd;null===g&&(g="");for(e=e.Ig(g);e.next();)if(g=e.value,g.Y===c&&g.ag===d)return!0;return!1}; +ri.prototype.isValidLink=function(a,b,c,d){if(!this.isValidFrom(a,b)||!this.isValidTo(c,d)||!(null===b||null===d||(b.JH&&d.uJ||!this.isInSameNode(b,d))&&(b.IH&&d.tJ||!this.isLinked(b,d)))||null!==this.sc&&(null!==a&&this.isLabelDependentOnLink(a,this.sc)||null!==c&&this.isLabelDependentOnLink(c,this.sc))||null!==a&&null!==c&&(null===a.data&&null!==c.data||null!==a.data&&null===c.data)||!this.isValidCycle(a,c,this.sc))return!1;if(null!==a){var e=a.qx;if(null!==e&&!e(a,b,c,d,this.sc))return!1}if(null!== +c&&(e=c.qx,null!==e&&!e(a,b,c,d,this.sc)))return!1;e=this.qx;return null!==e?e(a,b,c,d,this.sc):!0};ri.prototype.isLabelDependentOnLink=function(a,b){if(null===a)return!1;var c=a.Nd;if(null===c)return!1;if(c===b)return!0;var d=new K(E);d.add(a);return si(this,c,b,d)};function si(a,b,c,d){if(b===c)return!0;var e=b.Y;if(null!==e&&e.Df&&(d.add(e),si(a,e.Nd,c,d)))return!0;b=b.da;return null!==b&&b.Df&&(d.add(b),si(a,b.Nd,c,d))?!0:!1} +ri.prototype.isValidCycle=function(a,b,c){void 0===c&&(c=null);if(null===a||null===b)return this.Cp;var d=this.h.BJ;if(d!==Bi){if(d===Ci){if(null!==c&&!c.Oc)return!0;for(d=b.ee;d.next();){var e=d.value;if(e!==c&&e.Oc&&e.da===b)return!1}return!Di(this,a,b,c,!0)}if(d===Ei){if(null!==c&&!c.Oc)return!0;for(d=a.ee;d.next();)if(e=d.value,e!==c&&e.Oc&&e.Y===a)return!1;return!Di(this,a,b,c,!0)}if(d===Fi)return a===b?a=!0:(d=new K(E),d.add(b),a=Gi(this,d,a,b,c)),!a;if(d===Hi)return!Di(this,a,b,c,!1);if(d=== +Ii)return a===b?a=!0:(d=new K(E),d.add(b),a=Ji(this,d,a,b,c)),!a}return!0};function Di(a,b,c,d,e){if(b===c)return!0;if(null===b||null===c)return!1;for(var g=b.ee;g.next();){var h=g.value;if(h!==d&&(!e||h.Oc)&&h.da===b&&(h=h.Y,h!==b&&Di(a,h,c,d,e)))return!0}return!1}function Gi(a,b,c,d,e){if(c===d)return!0;if(null===c||null===d||b.contains(c))return!1;b.add(c);for(var g=c.ee;g.next();){var h=g.value;if(h!==e&&h.da===c&&(h=h.Y,h!==c&&Gi(a,b,h,d,e)))return!0}return!1} +function Ji(a,b,c,d,e){if(c===d)return!0;if(null===c||null===d||b.contains(c))return!1;b.add(c);for(var g=c.ee;g.next();){var h=g.value;if(h!==e){var k=h.Y,h=h.da,k=k===c?h:k;if(k!==c&&Ji(a,b,k,d,e))return!0}}return!1}z.defineProperty(ri,{qx:"linkValidation"},function(){return this.fl},function(a){null!==a&&z.g(a,"function",ri,"linkValidation");this.fl=a});z.defineProperty(ri,{Bx:"portTargeted"},function(){return this.VC},function(a){null!==a&&z.g(a,"function",ri,"portTargeted");this.VC=a}); +function ta(){0<arguments.length&&z.od(ta);ri.call(this);this.name="Linking";this.ly={};this.ky=null;this.fa=Ki;this.dD=null}z.Qa(ta,ri);z.ia("LinkingTool",ta);var Ki;ta.Either=Ki=z.s(ta,"Either",0);var Li;ta.ForwardsOnly=Li=z.s(ta,"ForwardsOnly",0);var Mi;ta.BackwardsOnly=Mi=z.s(ta,"BackwardsOnly",0);z.defineProperty(ta,{SG:"archetypeLinkData"},function(){return this.ly},function(a){null!==a&&z.l(a,Object,ta,"archetypeLinkData");a instanceof O&&z.l(a,G,ta,"archetypeLinkData");this.ly=a}); +z.defineProperty(ta,{JD:"archetypeLabelNodeData"},function(){return this.ky},function(a){null!==a&&z.l(a,Object,ta,"archetypeLabelNodeData");a instanceof O&&z.l(a,E,ta,"archetypeLabelNodeData");this.ky=a});z.defineProperty(ta,{direction:"direction"},function(){return this.fa},function(a){z.Ba(a,ta,ta,"direction");this.fa=a});z.defineProperty(ta,{OF:"startObject"},function(){return this.dD},function(a){null!==a&&z.l(a,O,ta,"startObject");this.dD=a}); +ta.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.h;if(null===a||a.ib||a.Ef||!a.lt)return!1;var b=a.ha;return(b instanceof V||b instanceof qg)&&a.R.left&&(a.cb===this||this.isBeyondDragSize())?null!==this.findLinkablePort():!1}; +ta.prototype.findLinkablePort=function(){var a=this.h;if(null===a)return null;var b=this.OF;null===b&&(b=a.pe(a.Fc.ga,null,null));if(null===b||!(b.ca instanceof E))return null;a=this.direction;if(a===Ki||a===Li){var c=this.findValidLinkablePort(b,!1);if(null!==c)return this.Md=!0,c}if(a===Ki||a===Mi)if(c=this.findValidLinkablePort(b,!0),null!==c)return this.Md=!1,c;return null}; +ta.prototype.doActivate=function(){var a=this.h;if(null!==a){var b=this.findLinkablePort();null!==b&&(this.Wb(this.name),a.We=!0,a.gc="pointer",this.Md?(null===this.Pd||this.Pd.location.F()||(this.Pd.location=a.R.ga),this.Pg=b,b=this.Pg.ca,b instanceof E&&(this.Og=b),this.copyPortProperties(this.Og,this.Pg,this.Od,this.yn,!1)):(null===this.Od||this.Od.location.F()||(this.Od.location=a.R.ga),this.Rg=b,b=this.Rg.ca,b instanceof E&&(this.Qg=b),this.copyPortProperties(this.Qg,this.Rg,this.Pd,this.zn, +!0)),a.add(this.Od),a.add(this.Pd),null!==this.Ug&&(null!==this.Od&&(this.Ug.Y=this.Od),null!==this.Pd&&(this.Ug.da=this.Pd),this.Ug.qc(),a.add(this.Ug)),this.ua=!0)}};ta.prototype.doDeactivate=function(){this.ua=!1;var a=this.h;null!==a&&(a.remove(this.Ug),a.remove(this.Od),a.remove(this.Pd),a.We=!1,a.gc="",this.yk())};ta.prototype.doStop=function(){ri.prototype.doStop.call(this);this.OF=null}; +ta.prototype.doMouseUp=function(){if(this.ua){var a=this.h;if(null===a)return;var b=this.Mf=null,c=null,d=null,e=null,g=this.kg=this.findTargetPort(this.Md);if(null!==g){var h=g.ca;h instanceof E&&(this.Md?(null!==this.Og&&(b=this.Og,c=this.Pg),d=h,e=g):(b=h,c=g,null!==this.Qg&&(d=this.Qg,e=this.Rg)))}else this.Md?null!==this.Og&&this.Cp&&(b=this.Og,c=this.Pg):null!==this.Qg&&this.Cp&&(d=this.Qg,e=this.Rg);null!==b||null!==d?(h=this.insertLink(b,c,d,e),null!==h?(null===g&&(this.Md?h.Yn=a.R.ga.copy(): +h.Un=a.R.ga.copy()),a.xf&&a.select(h),this.Mf=this.name,a.Ja("LinkDrawn",h)):(a.ha.QD(),this.doNoLink(b,c,d,e))):this.Md?this.doNoLink(this.Og,this.Pg,null,null):this.doNoLink(null,null,this.Qg,this.Rg)}this.stopTool()}; +ta.prototype.insertLink=function(a,b,c,d){var e=this.h;if(null===e)return null;var g=e.ha;if(g instanceof qg){var h=a;b=c;e.ce||(h=c,b=a);if(null!==h&&null!==b)return g.Gh(b.data,g.pb(h.data)),b.op()}else if(g instanceof V)if(h="",null!==a&&(null===b&&(b=a),h=b.yd,null===h&&(h="")),b="",null!==c&&(null===d&&(d=c),b=d.yd,null===b&&(b="")),d=this.SG,d instanceof G){if(jh(d),g=d.copy(),null!==g)return g.Y=a,g.ag=h,g.da=c,g.Vg=b,e.add(g),a=this.JD,a instanceof E&&(jh(a),a=a.copy(),null!==a&&(a.Nd=g,e.add(a))), +g}else if(null!==d&&(d=g.Pw(d),z.Za(d)))return null!==a&&g.Lx(d,g.pb(a.data)),g.OA(d,h),null!==c&&g.Px(d,g.pb(c.data)),g.RA(d,b),g.gt(d),a=this.JD,null===a||a instanceof E||(a=g.copyNodeData(a),z.Za(a)&&(g.sl(a),a=g.pb(a),void 0!==a&&g.Az(d,a))),g=e.$f(d);return null};ta.prototype.doNoLink=function(){}; +function Nh(){0<arguments.length&&z.od(Nh);ri.call(this);this.name="Relinking";var a=new X;a.Hb="Diamond";a.Aa=be;a.fill="lightblue";a.stroke="dodgerblue";a.cursor="pointer";a.De=0;this.eC=a;a=new X;a.Hb="Diamond";a.Aa=be;a.fill="lightblue";a.stroke="dodgerblue";a.cursor="pointer";a.De=-1;this.pD=a;this.ac=null;this.OC=new w}z.Qa(Nh,ri);z.ia("RelinkingTool",Nh); +Nh.prototype.updateAdornments=function(a){if(null!==a&&a instanceof G){var b="RelinkFrom",c=null;if(a.jb&&!this.h.ib){var d=a.un;null!==d&&a.canRelinkFrom()&&a.W.F()&&a.isVisible()&&d.W.F()&&d.oj()&&(c=a.kp(b),null===c&&(c=this.makeAdornment(d,!1),null!==c&&(c.nc=b),a.rl(b,c)))}null===c&&a.sj(b);b="RelinkTo";c=null;a.jb&&!this.h.ib&&(d=a.un,null!==d&&a.canRelinkTo()&&a.W.F()&&a.isVisible()&&d.W.F()&&d.oj()&&(c=a.kp(b),null===c&&(c=this.makeAdornment(d,!0),null!==c&&(c.nc=b),a.rl(b,c))));null===c&& +a.sj(b)}};Nh.prototype.makeAdornment=function(a,b){var c=new da;c.type=Ni;var d=b?this.sJ:this.HH;null!==d&&c.add(d.copy());c.fc=a;return c};z.defineProperty(Nh,{HH:"fromHandleArchetype"},function(){return this.eC},function(a){null!==a&&z.l(a,O,Nh,"fromHandleArchetype");this.eC=a});z.defineProperty(Nh,{sJ:"toHandleArchetype"},function(){return this.pD},function(a){null!==a&&z.l(a,O,Nh,"toHandleArchetype");this.pD=a});z.w(Nh,{handle:"handle"},function(){return this.ac}); +Nh.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.h;if(null===a||a.ib||a.Ef||!a.Sm)return!1;var b=a.ha;if(!(b instanceof V||b instanceof qg)||!a.R.left)return!1;b=this.findToolHandleAt(a.Fc.ga,"RelinkFrom");null===b&&(b=this.findToolHandleAt(a.Fc.ga,"RelinkTo"));return null!==b}; +Nh.prototype.doActivate=function(){var a=this.h;if(null!==a){if(null===this.sc){var b=this.findToolHandleAt(a.Fc.ga,"RelinkFrom");null===b&&(b=this.findToolHandleAt(a.Fc.ga,"RelinkTo"));if(null===b)return;var c=b.ca;if(!(c instanceof da&&c.Xf instanceof G))return;this.ac=b;this.Md=null===c||"RelinkTo"===c.nc;this.sc=c.Xf}this.Wb(this.name);a.We=!0;a.gc="pointer";this.Pg=this.sc.md;this.Og=this.sc.Y;this.Rg=this.sc.Qd;this.Qg=this.sc.da;this.OC.set(this.sc.W);null!==this.sc&&0<this.sc.sa&&(null=== +this.sc.Y&&(null!==this.yn&&(this.yn.Aa=Pd),null!==this.Od&&(this.Od.location=this.sc.m(0))),null===this.sc.da&&(null!==this.zn&&(this.zn.Aa=Pd),null!==this.Pd&&(this.Pd.location=this.sc.m(this.sc.sa-1))));this.copyPortProperties(this.Og,this.Pg,this.Od,this.yn,!1);this.copyPortProperties(this.Qg,this.Rg,this.Pd,this.zn,!0);a.add(this.Od);a.add(this.Pd);null!==this.Ug&&(null!==this.Od&&(this.Ug.Y=this.Od),null!==this.Pd&&(this.Ug.da=this.Pd),this.copyLinkProperties(this.sc,this.Ug),this.Ug.qc(),a.add(this.Ug)); +this.ua=!0}};Nh.prototype.copyLinkProperties=function(a,b){if(null!==a&&null!==b){b.it=a.it;b.Lz=a.Lz;var c=a.Se;if(c===Oi||c===Pi)c=Qi;b.Se=c;b.Rw=a.Rw;b.Hx=a.Hx;b.cq=a.cq;b.Db=a.Db;b.Jl=a.Jl;b.Ft=a.Ft;b.Gt=a.Gt;b.Eb=a.Eb;b.Yl=a.Yl;b.zu=a.zu;b.Au=a.Au}};Nh.prototype.doDeactivate=function(){this.ua=!1;var a=this.h;null!==a&&(a.remove(this.Ug),a.remove(this.Od),a.remove(this.Pd),a.We=!1,a.gc="",this.yk())};Nh.prototype.doStop=function(){ri.prototype.doStop.call(this);this.ac=null}; +Nh.prototype.doMouseUp=function(){if(this.ua){var a=this.h;if(null===a)return;this.Mf=null;var b=this.Og,c=this.Pg,d=this.Qg,e=this.Rg,g=this.sc;this.kg=this.findTargetPort(this.Md);if(null!==this.kg){var h=this.kg.ca;h instanceof E&&(this.Md?(d=h,e=this.kg):(b=h,c=this.kg))}else this.Cp?this.Md?e=d=null:c=b=null:g=null;null!==g?(this.reconnectLink(g,this.Md?d:b,this.Md?e:c,this.Md),null===this.kg&&(this.Md?g.Yn=a.R.ga.copy():g.Un=a.R.ga.copy(),g.qc()),a.xf&&(g.jb=!0),this.Mf=this.name,a.Ja("LinkRelinked", +g,this.Md?this.Rg:this.Pg)):this.doNoRelink(this.sc,this.Md);Ri(this.sc,this.OC)}this.stopTool()};Nh.prototype.reconnectLink=function(a,b,c,d){if(null===this.h)return!1;c=null!==c&&null!==c.yd?c.yd:"";d?(a.da=b,a.Vg=c):(a.Y=b,a.ag=c);return!0};Nh.prototype.doNoRelink=function(){};function mi(a,b,c,d,e){null!==b?(a.copyPortProperties(b,c,a.Od,a.yn,!1),a.h.add(a.Od)):a.h.remove(a.Od);null!==d?(a.copyPortProperties(d,e,a.Pd,a.zn,!0),a.h.add(a.Pd)):a.h.remove(a.Pd)} +function Si(){0<arguments.length&&z.od(Si);xg.call(this);this.name="LinkReshaping";var a=new X;a.Hb="Rectangle";a.Aa=ae;a.fill="lightblue";a.stroke="dodgerblue";this.Vk=a;a=new X;a.Hb="Diamond";a.Aa=ae;a.fill="lightblue";a.stroke="dodgerblue";this.CC=a;this.WC=3;this.iy=this.ac=null;this.PC=new N;this.Vv=null}z.Qa(Si,xg);z.ia("LinkReshapingTool",Si);var Ti;Si.None=Ti=z.s(Si,"None",0);var Ui;Si.Horizontal=Ui=z.s(Si,"Horizontal",1);var Vi;Si.Vertical=Vi=z.s(Si,"Vertical",2);var Wi; +Si.All=Wi=z.s(Si,"All",3);Si.prototype.getReshapingBehavior=Si.prototype.yE=function(a){return a&&a.XC?a.XC:Ti};Si.prototype.setReshapingBehavior=Si.prototype.su=function(a,b){z.l(a,O,Si,"setReshapingBehavior:obj");z.Ba(b,Si,Si,"setReshapingBehavior:behavior");a.XC=b}; +Si.prototype.updateAdornments=function(a){if(null!==a&&a instanceof G){if(a.jb&&!this.h.ib){var b=a.path;if(null!==b&&a.canReshape()&&a.W.F()&&a.isVisible()&&b.W.F()&&b.oj()){var c=a.kp(this.name);if(null===c||c.vG!==a.sa||c.HG!==a.lu)c=this.makeAdornment(b),null!==c&&(c.vG=a.sa,c.HG=a.lu,a.rl(this.name,c));if(null!==c){c.location=a.position;return}}}a.sj(this.name)}}; +Si.prototype.makeAdornment=function(a){var b=a.ca,c=b.sa,d=b.rc,e=null;if(null!==b.points&&1<c){e=new da;e.type=Ni;var c=b.Ct,g=b.px,h=d?1:0;if(b.lu&&b.Se!==Xi)for(var k=c+h;k<g-h;k++){var l=this.makeResegmentHandle(a,k);null!==l&&(l.De=k,l.MA=.5,l.Xz=999,e.add(l))}for(k=c+1;k<g;k++)if(l=this.makeHandle(a,k),null!==l){l.De=k;if(k!==c)if(k===c+1&&d){var h=b.m(c),m=b.m(c+1);eb(h.x,m.x)&&eb(h.y,m.y)&&(m=b.m(c-1));eb(h.x,m.x)?(this.su(l,Vi),l.cursor="n-resize"):eb(h.y,m.y)&&(this.su(l,Ui),l.cursor="w-resize")}else k=== +g-1&&d?(h=b.m(g-1),m=b.m(g),eb(h.x,m.x)&&eb(h.y,m.y)&&(h=b.m(g+1)),eb(h.x,m.x)?(this.su(l,Vi),l.cursor="n-resize"):eb(h.y,m.y)&&(this.su(l,Ui),l.cursor="w-resize")):k!==g&&(this.su(l,Wi),l.cursor="move");e.add(l)}e.nc=this.name;e.fc=a}return e};Si.prototype.makeHandle=function(){var a=this.Ht;return null===a?null:a.copy()};z.defineProperty(Si,{Ht:"handleArchetype"},function(){return this.Vk},function(a){null!==a&&z.l(a,O,Si,"handleArchetype");this.Vk=a}); +Si.prototype.makeResegmentHandle=function(){var a=this.EI;return null===a?null:a.copy()};z.defineProperty(Si,{EI:"midHandleArchetype"},function(){return this.CC},function(a){null!==a&&z.l(a,O,Si,"midHandleArchetype");this.CC=a});z.w(Si,{handle:"handle"},function(){return this.ac});z.w(Si,{jt:"adornedLink"},function(){return this.iy});Si.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.h;return null!==a&&!a.ib&&a.Fw&&a.R.left?null!==this.findToolHandleAt(a.Fc.ga,this.name):!1}; +Si.prototype.doActivate=function(){var a=this.h;if(null!==a&&(this.ac=this.findToolHandleAt(a.Fc.ga,this.name),null!==this.ac)){var b=this.ac.ca.Xf;if(b instanceof G){this.iy=b;a.We=!0;this.Wb(this.name);if(b.lu&&999===this.ac.Xz){var c=b.points.copy(),d=this.ac.eb(ec);c.Ld(this.ac.De+1,d);b.rc&&c.Ld(this.ac.De+1,d);b.points=c;b.ae();this.ac=this.findToolHandleAt(a.Fc.ga,this.name);if(null===this.ac){this.doDeactivate();return}}this.PC=b.m(this.ac.De);this.Vv=b.points.copy();this.ua=!0}}}; +Si.prototype.doDeactivate=function(){this.yk();this.iy=this.ac=null;var a=this.h;null!==a&&(a.We=!1);this.ua=!1};Si.prototype.doCancel=function(){var a=this.jt;null!==a&&(a.points=this.Vv);this.stopTool()};Si.prototype.doMouseMove=function(){var a=this.h;this.ua&&null!==a&&(a=this.computeReshape(a.R.ga),this.reshape(a))}; +Si.prototype.doMouseUp=function(){var a=this.h;if(this.ua&&null!==a){var b=this.computeReshape(a.R.ga);this.reshape(b);b=this.jt;if(null!==b&&b.lu){var c=this.handle.De,d=b.m(c-1),e=b.m(c),g=b.m(c+1);if(b.rc){if(c>b.Ct+1&&c<b.px-1){var h=b.m(c-2);if(Math.abs(d.x-e.x)<this.Eh&&Math.abs(d.y-e.y)<this.Eh&&(Yi(this,h,d,e,g,!0)||Yi(this,h,d,e,g,!1))){var k=b.points.copy();Yi(this,h,d,e,g,!0)?(k.Sg(c-2,new N(h.x,(g.y+h.y)/2)),k.Sg(c+1,new N(g.x,(g.y+h.y)/2))):(k.Sg(c-2,new N((g.x+h.x)/2,h.y)),k.Sg(c+1, +new N((g.x+h.x)/2,g.y)));k.dd(c);k.dd(c-1);b.points=k;b.ae()}else h=b.m(c+2),Math.abs(e.x-g.x)<this.Eh&&Math.abs(e.y-g.y)<this.Eh&&(Yi(this,d,e,g,h,!0)||Yi(this,d,e,g,h,!1))&&(k=b.points.copy(),Yi(this,d,e,g,h,!0)?(k.Sg(c-1,new N(d.x,(d.y+h.y)/2)),k.Sg(c+2,new N(h.x,(d.y+h.y)/2))):(k.Sg(c-1,new N((d.x+h.x)/2,d.y)),k.Sg(c+2,new N((d.x+h.x)/2,h.y))),k.dd(c+1),k.dd(c),b.points=k,b.ae())}}else h=z.O(),ib(d.x,d.y,g.x,g.y,e.x,e.y,h)&&h.Af(e)<this.Eh*this.Eh&&(k=b.points.copy(),k.dd(c),b.points=k,b.ae()), +z.A(h)}a.yc();this.Mf=this.name;a.Ja("LinkReshaped",this.jt,this.Vv)}this.stopTool()};function Yi(a,b,c,d,e,g){return g?Math.abs(b.y-c.y)<a.Eh&&Math.abs(c.y-d.y)<a.Eh&&Math.abs(d.y-e.y)<a.Eh:Math.abs(b.x-c.x)<a.Eh&&Math.abs(c.x-d.x)<a.Eh&&Math.abs(d.x-e.x)<a.Eh}z.defineProperty(Si,{Eh:"resegmentingDistance"},function(){return this.WC},function(a){z.g(a,"number",Si,"resegmentingDistance");this.WC=a}); +Si.prototype.reshape=function(a){var b=this.jt;b.Ul();var c=this.handle.De,d=this.yE(this.handle);if(b.rc)if(c===b.Ct+1)c=b.Ct+1,d===Vi?(b.aa(c,b.m(c-1).x,a.y),b.aa(c+1,b.m(c+2).x,a.y)):d===Ui&&(b.aa(c,a.x,b.m(c-1).y),b.aa(c+1,a.x,b.m(c+2).y));else if(c===b.px-1)c=b.px-1,d===Vi?(b.aa(c-1,b.m(c-2).x,a.y),b.aa(c,b.m(c+1).x,a.y)):d===Ui&&(b.aa(c-1,a.x,b.m(c-2).y),b.aa(c,a.x,b.m(c+1).y));else{var d=c,e=b.m(d),g=b.m(d-1),h=b.m(d+1);eb(g.x,e.x)&&eb(e.y,h.y)?(eb(g.x,b.m(d-2).x)&&!eb(g.y,b.m(d-2).y)?(b.B(d, +a.x,g.y),c++,d++):b.aa(d-1,a.x,g.y),eb(h.y,b.m(d+2).y)&&!eb(h.x,b.m(d+2).x)?b.B(d+1,h.x,a.y):b.aa(d+1,h.x,a.y)):eb(g.y,e.y)&&eb(e.x,h.x)?(eb(g.y,b.m(d-2).y)&&!eb(g.x,b.m(d-2).x)?(b.B(d,g.x,a.y),c++,d++):b.aa(d-1,g.x,a.y),eb(h.x,b.m(d+2).x)&&!eb(h.y,b.m(d+2).y)?b.B(d+1,a.x,h.y):b.aa(d+1,a.x,h.y)):eb(g.x,e.x)&&eb(e.x,h.x)?(eb(g.x,b.m(d-2).x)&&!eb(g.y,b.m(d-2).y)?(b.B(d,a.x,g.y),c++,d++):b.aa(d-1,a.x,g.y),eb(h.x,b.m(d+2).x)&&!eb(h.y,b.m(d+2).y)?b.B(d+1,a.x,h.y):b.aa(d+1,a.x,h.y)):eb(g.y,e.y)&&eb(e.y, +h.y)&&(eb(g.y,b.m(d-2).y)&&!eb(g.x,b.m(d-2).x)?(b.B(d,g.x,a.y),c++,d++):b.aa(d-1,g.x,a.y),eb(h.y,b.m(d+2).y)&&!eb(h.x,b.m(d+2).x)?b.B(d+1,h.x,a.y):b.aa(d+1,h.x,a.y));b.aa(c,a.x,a.y)}else b.aa(c,a.x,a.y),1===c&&b.computeSpot(!0).Be()&&(e=b.Y,g=b.md,null===e||e.isVisible()||(e=e.findVisibleNode(),e!==b.Y&&(g=e.Hl(""))),d=g.eb(ec,z.O()),e=b.getLinkPointFromPoint(e,g,d,a,!0,z.O()),b.aa(0,e.x,e.y),z.A(d),z.A(e)),c===b.sa-2&&b.computeSpot(!1).Be()&&(c=b.da,e=b.Qd,null===c||c.isVisible()||(c=c.findVisibleNode(), +c!==b.da&&(e=c.Hl(""))),d=e.eb(ec,z.O()),e=b.getLinkPointFromPoint(c,e,d,a,!1,z.O()),b.aa(b.sa-1,e.x,e.y),z.A(d),z.A(e));b.dj()};Si.prototype.computeReshape=function(a){var b=this.jt,c=this.handle.De;switch(this.yE(this.handle)){case Wi:return a;case Vi:return b=b.m(c),new N(b.x,a.y);case Ui:return b=b.m(c),new N(a.x,b.y);default:case Ti:return b.m(c)}};z.w(Si,{eL:"originalPoint"},function(){return this.PC});z.w(Si,{fL:"originalPoints"},function(){return this.Vv}); +function Zi(){0<arguments.length&&z.od(Zi);xg.call(this);this.name="Resizing";this.Uj=(new Ea(1,1)).freeze();this.Sj=(new Ea(9999,9999)).freeze();this.Aj=(new Ea(NaN,NaN)).freeze();this.jr=!1;this.Ib=null;var a=new X;a.kk=ec;a.Hb="Rectangle";a.Aa=ae;a.fill="lightblue";a.stroke="dodgerblue";a.ub=1;a.cursor="pointer";this.Vk=a;this.ac=null;this.Uv=new Ea;this.gz=new N;this.Ky=new Ea(0,0);this.Jy=new Ea(Infinity,Infinity);this.Iy=new Ea(1,1);this.IC=!0}z.Qa(Zi,xg);z.ia("ResizingTool",Zi); +Zi.prototype.updateAdornments=function(a){if(!(null===a||a instanceof G)){if(a.jb&&!this.h.ib){var b=a.uF;if(null!==b&&a.canResize()&&a.W.F()&&a.isVisible()&&b.W.F()&&b.oj()){var c=a.kp(this.name);if(null===c||c.fc!==b)c=this.makeAdornment(b);if(null!==c){var d=b.Kl();c.angle=d;var e=b.eb(c.of,z.O()),g=b.hj();c.location=e;z.A(e);e=c.placeholder;if(null!==e){var b=b.Ga,h=z.Xl();h.n(b.width*g,b.height*g);e.Aa=h;z.qk(h)}$i(this,c,d);a.rl(this.name,c);return}}}a.sj(this.name)}}; +Zi.prototype.makeAdornment=function(a){var b=null,b=a.ca.tF;if(null===b){b=new da;b.type=aj;b.of=ec;var c=new bj;c.Ff=!0;b.add(c);b.add(this.makeHandle(a,Zb));b.add(this.makeHandle(a,cc));b.add(this.makeHandle(a,ic));b.add(this.makeHandle(a,gc));b.add(this.makeHandle(a,Zc));b.add(this.makeHandle(a,ad));b.add(this.makeHandle(a,bd));b.add(this.makeHandle(a,$c))}else if(jh(b),b=b.copy(),null===b)return null;b.nc=this.name;b.fc=a;return b}; +Zi.prototype.makeHandle=function(a,b){var c=this.Ht;if(null===c)return null;c=c.copy();c.alignment=b;return c}; +function $i(a,b,c){if(null!==b)if(!b.alignment.bd()&&""!==b.cursor)a:{a=b.alignment;a.Be()&&(a=ec);if(0>=a.x)c=0>=a.y?c+225:1<=a.y?c+135:c+180;else if(1<=a.x)0>=a.y?c+=315:1<=a.y&&(c+=45);else if(0>=a.y)c+=270;else if(1<=a.y)c+=90;else break a;0>c?c+=360:360<=c&&(c-=360);b.cursor=22.5>c?"e-resize":67.5>c?"se-resize":112.5>c?"s-resize":157.5>c?"sw-resize":202.5>c?"w-resize":247.5>c?"nw-resize":292.5>c?"n-resize":337.5>c?"ne-resize":"e-resize"}else if(b instanceof I)for(b=b.elements;b.next();)$i(a, +b.value,c)}z.defineProperty(Zi,{Ht:"handleArchetype"},function(){return this.Vk},function(a){null!==a&&z.l(a,O,Zi,"handleArchetype");this.Vk=a});z.w(Zi,{handle:"handle"},function(){return this.ac});z.defineProperty(Zi,{fc:"adornedObject"},function(){return this.Ib},function(a){null!==a&&z.l(a,O,Zi,"adornedObject");this.Ib=a});Zi.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.h;return null!==a&&!a.ib&&a.mt&&a.R.left?null!==this.findToolHandleAt(a.Fc.ga,this.name)?!0:!1:!1}; +Zi.prototype.doActivate=function(){var a=this.h;null!==a&&(this.ac=this.findToolHandleAt(a.Fc.ga,this.name),null!==this.ac&&(this.Ib=this.ac.ca.fc,this.gz.set(this.Ib.ca.location),this.Uv.set(this.Ib.Aa),this.Iy=this.computeCellSize(),this.Ky=this.computeMinSize(),this.Jy=this.computeMaxSize(),a.We=!0,this.IC=a.Ua.isEnabled,a.Ua.isEnabled=!1,this.Wb(this.name),this.ua=!0))};Zi.prototype.doDeactivate=function(){var a=this.h;null!==a&&(this.yk(),this.Ib=this.ac=null,this.ua=a.We=!1,a.Ua.isEnabled=this.IC)}; +Zi.prototype.doCancel=function(){this.Ib.Aa=this.Uv;this.Ib.ca.location=this.gz;this.stopTool()};Zi.prototype.doMouseMove=function(){var a=this.h;if(this.ua&&null!==a){var b=this.Ky,c=this.Jy,d=this.Iy,e=this.Ib.wE(a.R.ga,z.O()),g=cj;this.Ib instanceof X&&(g=dj(this.Ib));b=this.computeResize(e,this.ac.alignment,b,c,d,!(g===ej||g===fj||a.R.shift));this.resize(b);a.cg();z.A(e)}}; +Zi.prototype.doMouseUp=function(){var a=this.h;if(this.ua&&null!==a){var b=this.Ky,c=this.Jy,d=this.Iy,e=this.Ib.wE(a.R.ga,z.O()),g=cj;this.Ib instanceof X&&(g=dj(this.Ib));b=this.computeResize(e,this.ac.alignment,b,c,d,!(g===ej||g===fj||a.R.shift));this.resize(b);z.A(e);a.yc();this.Mf=this.name;a.Ja("PartResized",this.Ib,this.Uv)}this.stopTool()}; +Zi.prototype.resize=function(a){if(null!==this.h){var b=this.fc,c=b.ca,d=b.Kl(),e=b.hj(),g=Math.PI*d/180,h=Math.cos(g),g=Math.sin(g),k=0<d&&180>d?1:0,l=90<d&&270>d?1:0,d=180<d&&360>d?1:0,m=b.Ga.width,n=b.Ga.height;b.Aa=a.size;var p=c.position.copy();c.Bf();m=b.Ga.width-m;n=b.Ga.height-n;if(0!==m||0!==n)0!==m&&(p.x+=e*((a.x+m*l)*h-(a.y+n*k)*g)),0!==n&&(p.y+=e*((a.x+m*d)*g+(a.y+n*l)*h)),c.move(p),c instanceof E&&c.mf()}}; +Zi.prototype.computeResize=function(a,b,c,d,e,g){b.Be()&&(b=ec);var h=this.fc.Ga,k=h.x,l=h.y,m=h.x+h.width,n=h.y+h.height,p=1;if(!g){var p=h.width,q=h.height;0>=p&&(p=1);0>=q&&(q=1);p=q/p}q=z.O();jb(a.x,a.y,k,l,e.width,e.height,q);a=h.copy();0>=b.x?0>=b.y?(a.x=Math.max(q.x,m-d.width),a.x=Math.min(a.x,m-c.width),a.width=Math.max(m-a.x,c.width),a.y=Math.max(q.y,n-d.height),a.y=Math.min(a.y,n-c.height),a.height=Math.max(n-a.y,c.height),g||(b=a.height/a.width,p<b?(a.height=p*a.width,a.y=n-a.height):(a.width= +a.height/p,a.x=m-a.width))):1<=b.y?(a.x=Math.max(q.x,m-d.width),a.x=Math.min(a.x,m-c.width),a.width=Math.max(m-a.x,c.width),a.height=Math.max(Math.min(q.y-l,d.height),c.height),g||(b=a.height/a.width,p<b?a.height=p*a.width:(a.width=a.height/p,a.x=m-a.width))):(a.x=Math.max(q.x,m-d.width),a.x=Math.min(a.x,m-c.width),a.width=m-a.x,g||(a.height=p*a.width,a.y=l+.5*(n-l-a.height))):1<=b.x?0>=b.y?(a.width=Math.max(Math.min(q.x-k,d.width),c.width),a.y=Math.max(q.y,n-d.height),a.y=Math.min(a.y,n-c.height), +a.height=Math.max(n-a.y,c.height),g||(b=a.height/a.width,p<b?(a.height=p*a.width,a.y=n-a.height):a.width=a.height/p)):1<=b.y?(a.width=Math.max(Math.min(q.x-k,d.width),c.width),a.height=Math.max(Math.min(q.y-l,d.height),c.height),g||(b=a.height/a.width,p<b?a.height=p*a.width:a.width=a.height/p)):(a.width=Math.max(Math.min(q.x-k,d.width),c.width),g||(a.height=p*a.width,a.y=l+.5*(n-l-a.height))):0>=b.y?(a.y=Math.max(q.y,n-d.height),a.y=Math.min(a.y,n-c.height),a.height=n-a.y,g||(a.width=a.height/p,a.x= +k+.5*(m-k-a.width))):1<=b.y&&(a.height=Math.max(Math.min(q.y-l,d.height),c.height),g||(a.width=a.height/p,a.x=k+.5*(m-k-a.width)));z.A(q);return a};Zi.prototype.computeMinSize=function(){var a=this.fc.dg.copy(),b=this.dg;!isNaN(b.width)&&b.width>a.width&&(a.width=b.width);!isNaN(b.height)&&b.height>a.height&&(a.height=b.height);return a}; +Zi.prototype.computeMaxSize=function(){var a=this.fc.Xe.copy(),b=this.Xe;!isNaN(b.width)&&b.width<a.width&&(a.width=b.width);!isNaN(b.height)&&b.height<a.height&&(a.height=b.height);return a}; +Zi.prototype.computeCellSize=function(){var a=new Ea(NaN,NaN),b=this.fc.ca;if(null!==b){var c=b.YI;!isNaN(c.width)&&0<c.width&&(a.width=c.width);!isNaN(c.height)&&0<c.height&&(a.height=c.height)}c=this.cp;isNaN(a.width)&&!isNaN(c.width)&&0<c.width&&(a.width=c.width);isNaN(a.height)&&!isNaN(c.height)&&0<c.height&&(a.height=c.height);b=this.h;(isNaN(a.width)||isNaN(a.height))&&b&&(c=b.gb.me,null!==c&&c.jx&&(c=c.AE,isNaN(a.width)&&!isNaN(c.width)&&0<c.width&&(a.width=c.width),isNaN(a.height)&&!isNaN(c.height)&& +0<c.height&&(a.height=c.height)),b=b.tp,null!==b&&b.visible&&this.jx&&(c=b.ex,isNaN(a.width)&&!isNaN(c.width)&&0<c.width&&(a.width=c.width),isNaN(a.height)&&!isNaN(c.height)&&0<c.height&&(a.height=c.height)));if(isNaN(a.width)||0===a.width||Infinity===a.width)a.width=1;if(isNaN(a.height)||0===a.height||Infinity===a.height)a.height=1;return a}; +z.defineProperty(Zi,{dg:"minSize"},function(){return this.Uj},function(a){z.l(a,Ea,Zi,"minSize");if(!this.Uj.N(a)){var b=a.width;isNaN(b)&&(b=0);a=a.height;isNaN(a)&&(a=0);this.Uj.n(b,a)}});z.defineProperty(Zi,{Xe:"maxSize"},function(){return this.Sj},function(a){z.l(a,Ea,Zi,"maxSize");if(!this.Sj.N(a)){var b=a.width;isNaN(b)&&(b=Infinity);a=a.height;isNaN(a)&&(a=Infinity);this.Sj.n(b,a)}}); +z.defineProperty(Zi,{cp:"cellSize"},function(){return this.Aj},function(a){z.l(a,Ea,Zi,"cellSize");this.Aj.N(a)||this.Aj.assign(a)});z.defineProperty(Zi,{jx:"isGridSnapEnabled"},function(){return this.jr},function(a){z.g(a,"boolean",Zi,"isGridSnapEnabled");this.jr=a});z.w(Zi,{cL:"originalDesiredSize"},function(){return this.Uv});z.w(Zi,{dL:"originalLocation"},function(){return this.gz}); +function gj(){0<arguments.length&&z.od(gj);xg.call(this);this.name="Rotating";this.bD=45;this.aD=2;this.Ib=null;var a=new X;a.Hb="Ellipse";a.Aa=be;a.fill="lightblue";a.stroke="dodgerblue";a.ub=1;a.cursor="pointer";this.Vk=a;this.ac=null;this.Tv=0;this.YC=new N}z.Qa(gj,xg);z.ia("RotatingTool",gj); +gj.prototype.updateAdornments=function(a){if(!(null===a||a instanceof G)){if(a.jb&&!this.h.ib){var b=a.yF;if(null!==b&&a.canRotate()&&a.W.F()&&a.isVisible()&&b.W.F()&&b.oj()){var c=a.kp(this.name);if(null===c||c.fc!==b)c=this.makeAdornment(b);if(null!==c){c.angle=b.Kl();var d=null,e=null;b===a||b===a.Zb?(d=a.Zb,e=a.of):(d=b,e=ec);for(var g=d.Ga,e=z.Tb(g.width*e.x+e.offsetX,g.height*e.y+e.offsetY);null!==d&&d!==b;)d.transform.Cb(e),d=d.T;var d=e.y,g=Math.max(e.x-b.Ga.width,0),h=z.O();c.location=b.eb(new Q(1, +0,50+g,d),h);z.A(h);z.A(e);a.rl(this.name,c);return}}}a.sj(this.name)}};gj.prototype.makeAdornment=function(a){var b=null,b=a.ca.$I;if(null===b){b=new da;b.type=hj;b.of=ec;var c=this.Ht;null!==c&&b.add(c.copy())}else if(jh(b),b=b.copy(),null===b)return null;b.nc=this.name;b.fc=a;return b};z.defineProperty(gj,{Ht:"handleArchetype"},function(){return this.Vk},function(a){null!==a&&z.l(a,O,gj,"handleArchetype");this.Vk=a});z.w(gj,{handle:"handle"},function(){return this.ac}); +z.defineProperty(gj,{fc:"adornedObject"},function(){return this.Ib},function(a){null!==a&&z.l(a,O,gj,"adornedObject");this.Ib=a});gj.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.h;return null!==a&&!a.ib&&a.Gw&&a.R.left?null!==this.findToolHandleAt(a.Fc.ga,this.name)?!0:!1:!1}; +gj.prototype.doActivate=function(){var a=this.h;if(null!==a&&(this.ac=this.findToolHandleAt(a.Fc.ga,this.name),null!==this.ac)){this.Ib=this.ac.ca.fc;var b=this.Ib.ca,c=b.Zb;this.YC=this.Ib===b||this.Ib===c?c.eb(b.of):this.Ib.eb(ec);this.Tv=this.Ib.angle;a.We=!0;a.Oz=!0;this.Wb(this.name);this.ua=!0}};gj.prototype.doDeactivate=function(){var a=this.h;null!==a&&(this.yk(),this.Ib=this.ac=null,this.ua=a.We=!1)};gj.prototype.doCancel=function(){var a=this.h;null!==a&&(a.Oz=!1);this.rotate(this.Tv);this.stopTool()}; +gj.prototype.doMouseMove=function(){var a=this.h;this.ua&&null!==a&&(a=this.computeRotate(a.R.ga),this.rotate(a))};gj.prototype.doMouseUp=function(){var a=this.h;if(this.ua&&null!==a){a.Oz=!1;var b=this.computeRotate(a.R.ga);this.rotate(b);a.yc();this.Mf=this.name;a.Ja("PartRotated",this.Ib,this.Tv)}this.stopTool()};gj.prototype.rotate=function(a){u&&z.p(a,gj,"rotate:newangle");null!==this.Ib&&(this.Ib.angle=a)}; +gj.prototype.computeRotate=function(a){a=this.YC.Ec(a);var b=this.Ib.T;null!==b&&(a-=b.Kl(),360<=a?a-=360:0>a&&(a+=360));var b=Math.min(Math.abs(this.mJ),180),c=Math.min(Math.abs(this.lJ),b/2);!this.h.R.shift&&0<b&&0<c&&(a%b<c?a=Math.floor(a/b)*b:a%b>b-c&&(a=(Math.floor(a/b)+1)*b));360<=a?a-=360:0>a&&(a+=360);return a};z.defineProperty(gj,{mJ:"snapAngleMultiple"},function(){return this.bD},function(a){z.g(a,"number",gj,"snapAngleMultiple");this.bD=a}); +z.defineProperty(gj,{lJ:"snapAngleEpsilon"},function(){return this.aD},function(a){z.g(a,"number",gj,"snapAngleEpsilon");this.aD=a});z.w(gj,{bL:"originalAngle"},function(){return this.Tv});function ij(){0<arguments.length&&z.od(ij);xg.call(this);this.name="ClickSelecting"}z.Qa(ij,xg);z.ia("ClickSelectingTool",ij);ij.prototype.canStart=function(){return!this.isEnabled||null===this.h||this.isBeyondDragSize()?!1:!0}; +ij.prototype.doMouseUp=function(){this.ua&&(this.standardMouseSelect(),!this.standardMouseClick()&&this.h.R.mj&&this.h.gb.doToolTip());this.stopTool()};function jj(){0<arguments.length&&z.od(jj);xg.call(this);this.name="Action";this.En=null}z.Qa(jj,xg);z.ia("ActionTool",jj); +jj.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.h;if(null===a)return!1;var b=a.R,c=a.pe(b.ga,function(a){for(;null!==a.T&&!a.Mt;)a=a.T;return a});if(null!==c){if(!c.Mt)return!1;this.En=c;a.Rn=a.pe(b.ga,null,null);return!0}return!1};jj.prototype.doMouseDown=function(){if(this.ua){var a=this.h.R,b=this.En;null!==b&&(a.Ge=b,null!==b.AD&&b.AD(a,b))}else this.canStart()&&this.doActivate()}; +jj.prototype.doMouseMove=function(){if(this.ua){var a=this.h.R,b=this.En;null!==b&&(a.Ge=b,null!==b.BD&&b.BD(a,b))}};jj.prototype.doMouseUp=function(){if(this.ua){var a=this.h,b=a.R,c=this.En;if(null===c)return;b.Ge=c;null!==c.CD&&c.CD(b,c);this.isBeyondDragSize()||Gh(c,b,a)}this.stopTool()};jj.prototype.doCancel=function(){var a=this.h;if(null!==a){var a=a.R,b=this.En;if(null===b)return;a.Ge=b;null!==b.zD&&b.zD(a,b)}this.stopTool()};jj.prototype.doStop=function(){this.En=null}; +function va(){0<arguments.length&&z.od(va);xg.call(this);this.name="ClickCreating";this.Nk=null;this.qC=!0;this.dC=new N(0,0)}z.Qa(va,xg);z.ia("ClickCreatingTool",va); +va.prototype.canStart=function(){if(!this.isEnabled||null===this.Dz)return!1;var a=this.h;if(null===a||a.ib||a.Ef||!a.$o||!a.R.left||this.isBeyondDragSize())return!1;if(this.dI){if(1===a.R.Pe&&(this.dC=a.R.ue.copy()),2!==a.R.Pe||this.isBeyondDragSize(this.dC))return!1}else if(1!==a.R.Pe)return!1;return a.cb!==this&&null!==a.Bt(a.R.ga,!0)?!1:!0};va.prototype.doMouseUp=function(){var a=this.h;this.ua&&null!==a&&this.insertPart(a.R.ga);this.stopTool()}; +va.prototype.insertPart=function(a){var b=this.h;if(null===b)return null;var c=this.Dz;if(null===c)return null;this.Wb(this.name);var d=null;c instanceof D?c.be()&&(jh(c),d=c.copy(),null!==d&&b.add(d)):null!==c&&(c=b.ha.copyNodeData(c),z.Za(c)&&(b.ha.sl(c),d=b.vh(c)));null!==d&&(d.location=a,b.xf&&b.select(d));b.yc();this.Mf=this.name;b.Ja("PartCreated",d);this.yk();return d}; +z.defineProperty(va,{Dz:"archetypeNodeData"},function(){return this.Nk},function(a){null!==a&&z.l(a,Object,va,"archetypeNodeData");this.Nk=a});z.defineProperty(va,{dI:"isDoubleClick"},function(){return this.qC},function(a){z.g(a,"boolean",va,"isDoubleClick");this.qC=a});function kj(a,b,c){this.text=a;this.SD=b;this.visible=c}function lj(){0<arguments.length&&z.od(lj);xg.call(this);this.name="ContextMenu";this.IB=this.vy=this.FB=null;this.GC=new N;this.xy=this.Zn=null;mj(this)}z.Qa(lj,xg); +z.ia("ContextMenuTool",lj);z.aE=!1;z.qt=null;z.rt=null; +function mj(a){a.Zn=new da;a.qD=function(){a.stopTool()};if(!1===z.aE){var b=z.createElement("div"),c=z.createElement("div");b.style.cssText="top: 0px;z-index:300;position: fixed;display: none;text-align: center;left: 25%;width: 50%;background-color: #F5F5F5;padding: 16px;border: 16px solid #444;border-radius: 10px;margin-top: 10px";c.style.cssText="z-index:299;position: fixed;display: none;top: 0;left: 0;width: 100%;height: 100%;background-color: black;-moz-opacity: 0.8;opacity:.80;filter: alpha(opacity=80);";var d= +z.createElement("style");window.document.getElementsByTagName("head")[0].appendChild(d);d.sheet.insertRule(".defaultCXul { list-style: none; }",0);d.sheet.insertRule(".defaultCXli {font:700 1.5em Helvetica, Arial, sans-serif;position: relative;min-width: 60px; }",0);d.sheet.insertRule(".defaultCXa {color: #444;display: inline-block;padding: 4px;text-decoration: none;margin: 2px;border: 1px solid gray;border-radius: 10px; }",0);b.addEventListener("contextmenu",function(a){a.preventDefault();return!1}, +!1);b.addEventListener("selectstart",function(a){a.preventDefault();return!1},!1);c.addEventListener("contextmenu",function(a){a.preventDefault();return!1},!1);window.document.body&&(window.document.body.appendChild(b),window.document.body.appendChild(c));z.rt=b;z.qt=c;z.aE=!0}}lj.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.h;return null===a||this.isBeyondDragSize()||!a.R.right?!1:null!==this.Zn&&a.R.mj||null!==this.findObjectWithContextMenu()?!0:!1}; +lj.prototype.doStart=function(){var a=this.h;null!==a&&this.GC.set(a.Fc.ga)};lj.prototype.doStop=function(){this.hideDefaultContextMenu();this.hideContextMenu();this.Nz=null}; +lj.prototype.findObjectWithContextMenu=function(a){void 0===a&&(a=null);var b=this.h;if(null===b)return null;var c=b.R,d=null;a instanceof B||(d=a instanceof O?a:b.pe(c.ga,null,function(a){return!a.layer.Nc}));if(null!==d){for(a=d;null!==a;){if(null!==a.contextMenu)return a;a=a.T}if(null!==this.Zn&&b.R.mj)return d.ca}else if(null!==b.contextMenu)return b;return null};lj.prototype.doActivate=function(){}; +lj.prototype.doMouseDown=function(){xg.prototype.doMouseDown.call(this);null!==this.h&&this.h.gb.Ye.contains(this)&&nj(this)};lj.prototype.doMouseUp=function(){nj(this)};function nj(a){var b=a.h;if(null!==b)if(!a.ua)a.canStart()&&(oh(a,!0),a.ua||a.stopTool());else if(null!==a.yf){var c=b.pe(b.R.ga,null,null);null!==c&&c.Pl(a.yf)&&a.standardMouseClick(null,null);a.stopTool();a.canStart()&&(b.cb=a,a.doMouseUp())}} +function oh(a,b,c){void 0===c&&(c=null);b&&a.standardMouseSelect();a.standardMouseClick()||(a.ua=!0,null===c&&(c=a.findObjectWithContextMenu()),null!==c?(b=c.contextMenu,null!==b?(a.Nz=c instanceof O?c:null,a.showContextMenu(b,a.Nz)):a.showDefaultContextMenu()):a.showDefaultContextMenu())}lj.prototype.doMouseMove=function(){this.ua&&this.h.gb.doMouseMove()}; +lj.prototype.showContextMenu=function(a,b){z.l(a,da,lj,"showContextMenu:contextmenu");null!==b&&z.l(b,O,lj,"showContextMenu:obj");var c=this.h;if(null!==c){a!==this.yf&&this.hideContextMenu();a.If="Tool";a.wk=!1;a.scale=1/c.scale;a.nc=this.name;null!==a.placeholder&&(a.placeholder.scale=c.scale);c.add(a);if(null!==b){var c=null,d=b.np();null!==d&&(c=d.data);a.fc=b;a.data=c}else a.data=c.ha;a.Bf();this.positionContextMenu(a,b);this.yf=a}}; +lj.prototype.positionContextMenu=function(a){if(null===a.placeholder){var b=this.h;if(null!==b){var c=b.R.ga.copy(),d=a.Ia,e=b.xb;b.R.mj&&(c.x-=d.width);c.x+d.width>e.right&&(c.x-=d.width+5);c.x<e.x&&(c.x=e.x);c.y+d.height>e.bottom&&(c.y-=d.height+5);c.y<e.y&&(c.y=e.y);a.position=c}}};lj.prototype.hideContextMenu=function(){var a=this.h;null!==a&&null!==this.yf&&(a.remove(this.yf),null!==this.vy&&this.vy.sj(this.yf.nc),this.yf.data=null,this.yf=this.yf.fc=null,this.standardMouseOver())}; +function oj(a){if(null===a.h)return null;a=new J(kj);a.add(new kj("Copy",function(a){a.wb.copySelection()},function(a){return a.wb.canCopySelection()}));a.add(new kj("Cut",function(a){a.wb.cutSelection()},function(a){return a.wb.canCutSelection()}));a.add(new kj("Delete",function(a){a.wb.deleteSelection()},function(a){return a.wb.canDeleteSelection()}));a.add(new kj("Paste",function(a){a.wb.pasteSelection(a.R.ga)},function(a){return a.wb.canPasteSelection()}));a.add(new kj("Select All",function(a){a.wb.selectAll()}, +function(a){return a.wb.canSelectAll()}));a.add(new kj("Undo",function(a){a.wb.undo()},function(a){return a.wb.canUndo()}));a.add(new kj("Redo",function(a){a.wb.redo()},function(a){return a.wb.canRedo()}));a.add(new kj("Scroll To Part",function(a){a.wb.scrollToPart()},function(a){return a.wb.canScrollToPart()}));a.add(new kj("Zoom To Fit",function(a){a.wb.zoomToFit()},function(a){return a.wb.canZoomToFit()}));a.add(new kj("Reset Zoom",function(a){a.wb.resetZoom()},function(a){return a.wb.canResetZoom()})); +a.add(new kj("Group Selection",function(a){a.wb.groupSelection()},function(a){return a.wb.canGroupSelection()}));a.add(new kj("Ungroup Selection",function(a){a.wb.ungroupSelection()},function(a){return a.wb.canUngroupSelection()}));a.add(new kj("Edit Text",function(a){a.wb.editTextBlock()},function(a){return a.wb.canEditTextBlock()}));return a} +lj.prototype.showDefaultContextMenu=function(){var a=this.h;if(null!==a){null===this.xy&&(this.xy=oj(this));this.Zn!==this.yf&&this.hideContextMenu();z.rt.innerHTML="";z.qt.addEventListener("click",this.qD,!1);var b=this,c=z.createElement("ul");c.className="defaultCXul";z.rt.appendChild(c);c.innerHTML="";for(var d=this.xy.i;d.next();){var e=d.value,g=e.text,h=e.visible;if("function"===typeof e.SD&&("function"!==typeof h||h(a))){h=z.createElement("li");h.className="defaultCXli";var k=z.createElement("a"); +k.className="defaultCXa";k.href="#";k.mG=e.SD;k.addEventListener("click",function(c){this.mG(a);b.stopTool();c.preventDefault();return!1},!1);k.textContent=g;h.appendChild(k);c.appendChild(h)}}z.rt.style.display="block";z.qt.style.display="block";this.yf=this.Zn}};lj.prototype.hideDefaultContextMenu=function(){null!==this.yf&&this.yf===this.Zn&&(z.rt.style.display="none",z.qt.style.display="none",z.qt.removeEventListener("click",this.qD,!1),this.yf=null)}; +z.defineProperty(lj,{yf:"currentContextMenu"},function(){return this.FB},function(a){null!==a&&z.l(a,da,lj,"currentContextMenu");this.FB=a;this.vy=null!==a?a.Xf:null});z.defineProperty(lj,{Nz:"currentObject"},function(){return this.IB},function(a){null!==a&&z.l(a,O,lj,"currentObject");this.IB=a});z.w(lj,{XK:"mouseDownPoint"},function(){return this.GC}); +function pj(){0<arguments.length&&z.od(pj);xg.call(this);this.name="DragSelecting";this.$n=175;this.vC=!1;var a=new D;a.If="Tool";a.wk=!1;var b=new X;b.name="SHAPE";b.Hb="Rectangle";b.fill=null;b.stroke="magenta";a.add(b);this.dm=a}z.Qa(pj,xg);z.ia("DragSelectingTool",pj); +pj.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.h;if(null===a||!a.xf)return!1;var b=a.R;return!b.left||a.cb!==this&&(!this.isBeyondDragSize()||b.timestamp-a.Fc.timestamp<this.bE||null!==a.Bt(b.ga,!0))?!1:!0};pj.prototype.doActivate=function(){var a=this.h;null!==a&&(this.ua=!0,a.We=!0,a.Bb=!0,a.add(this.rh),this.doMouseMove())};pj.prototype.doDeactivate=function(){var a=this.h;null!==a&&(a.remove(this.rh),a.Bb=!1,this.ua=a.We=!1)}; +pj.prototype.doMouseMove=function(){if(null!==this.h&&this.ua&&null!==this.rh){var a=this.computeBoxBounds(),b=this.rh.oe("SHAPE");null===b&&(b=this.rh.gf());b.Aa=a.size;this.rh.position=a.position}};pj.prototype.doMouseUp=function(){if(this.ua){var a=this.h;a.remove(this.rh);try{a.gc="wait",this.selectInRect(this.computeBoxBounds())}finally{a.gc=""}}this.stopTool()};pj.prototype.computeBoxBounds=function(){var a=this.h;return null===a?new w(0,0,0,0):new w(a.Fc.ga,a.R.ga)}; +pj.prototype.selectInRect=function(a){var b=this.h;if(null!==b){var c=b.R;b.Ja("ChangingSelection");a=b.pk(a,null,function(a){return a instanceof D?a.canSelect():!1},this.iI);if(z.sk?c.$t:c.control)if(c.shift)for(a=a.i;a.next();)c=a.value,c.jb&&(c.jb=!1);else for(a=a.i;a.next();)c=a.value,c.jb=!c.jb;else{if(!c.shift){for(var c=new J(D),d=b.selection.i;d.next();){var e=d.value;a.contains(e)||c.add(e)}for(c=c.i;c.next();)c.value.jb=!1}for(a=a.i;a.next();)c=a.value,c.jb||(c.jb=!0)}b.Ja("ChangedSelection")}}; +z.defineProperty(pj,{bE:"delay"},function(){return this.$n},function(a){z.g(a,"number",pj,"delay");this.$n=a});z.defineProperty(pj,{iI:"isPartialInclusion"},function(){return this.vC},function(a){z.g(a,"boolean",pj,"isPartialInclusion");this.vC=a});z.defineProperty(pj,{rh:"box"},function(){return this.dm},function(a){null!==a&&z.l(a,D,pj,"box");this.dm=a}); +function qj(){0<arguments.length&&z.od(qj);xg.call(this);this.name="Panning";this.hz=new N;this.zj=!1;var a=this;this.eD=function(){window.document.removeEventListener("scroll",a.eD,!1);a.stopTool()}}z.Qa(qj,xg);z.ia("PanningTool",qj);qj.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.h;return null===a||!a.ye&&!a.ze||!a.R.left||a.cb!==this&&!this.isBeyondDragSize()?!1:!0}; +qj.prototype.doActivate=function(){var a=this.h;null!==a&&(this.zj?(a.R.bubbles=!0,window.document.addEventListener("scroll",this.eD,!1)):(a.gc="move",a.We=!0,this.hz=a.position.copy()),this.ua=!0)};qj.prototype.doDeactivate=function(){var a=this.h;null!==a&&(a.gc="",this.ua=a.We=!1)};qj.prototype.doCancel=function(){var a=this.h;null!==a&&(a.position=this.hz,a.We=!1);this.stopTool()};qj.prototype.doMouseMove=function(){this.move()};qj.prototype.doMouseUp=function(){this.move();this.stopTool()}; +qj.prototype.move=function(){var a=this.h;if(this.ua&&a)if(this.zj)a.R.bubbles=!0;else{var b=a.position,c=a.Fc.ga,d=a.R.ga,e=b.x+c.x-d.x,c=b.y+c.y-d.y;a.ye||(e=b.x);a.ze||(c=b.y);a.position=new N(e,c)}};z.defineProperty(qj,{bubbles:"bubbles"},function(){return this.zj},function(a){z.g(a,"boolean",qj,"bubbles");this.zj=a});z.w(qj,{gL:"originalPosition"},function(){return this.hz}); +function rj(){0<arguments.length&&z.od(rj);xg.call(this);this.name="TextEditing";this.LB=this.rz=this.iD=null;this.Qo=sj;this.ol=null;this.nb=tj;this.ll=null;this.DC=1;this.ZC=!0;var a=z.createElement("textarea");a.pC=!0;this.SB=a;a.addEventListener("input",function(){var a=this.textEditingTool;if(null!==a&&void 0!==a&&null!==a.He){var c=a.iD;c.text=this.value;var d=this.rJ;uj(c,a.He.Ev,Infinity);this.style.width=20+c.Ia.width*d+"px";this.style.height=10+c.Ia.height*d+"px";this.rows=c.rI}},!1);a.addEventListener("keydown", +function(a){var c=a.which,d=this.textEditingTool;null!==d&&void 0!==d&&null!==d.He&&(13===c?(!1===d.He.mx&&a.preventDefault(),d.acceptText(vj)):9===c?(d.acceptText(wj),a.preventDefault()):27===c&&(d.doCancel(),null!==d.h&&d.h.focus()))},!1);a.addEventListener("focus",function(a){var c=this.textEditingTool;null!==c&&void 0!==c&&c.doFocus(a)},!1);a.addEventListener("blur",function(a){var c=this.textEditingTool;null!==c&&void 0!==c&&c.doBlur(a)},!1)}z.ia("TextEditingTool",rj);z.Qa(rj,xg);var xj; +rj.LostFocus=xj=z.s(rj,"LostFocus",0);var Gj;rj.MouseDown=Gj=z.s(rj,"MouseDown",1);var wj;rj.Tab=wj=z.s(rj,"Tab",2);var vj;rj.Enter=vj=z.s(rj,"Enter",3);rj.SingleClick=z.s(rj,"SingleClick",0);var sj;rj.SingleClickSelected=sj=z.s(rj,"SingleClickSelected",1);var tj=z.s(rj,"StateNone",0),Hj=z.s(rj,"StateActive",1),Ij=z.s(rj,"StateEditing",2),Jj=z.s(rj,"StateEditing2",3),Kj=z.s(rj,"StateValidating",4),Lj=z.s(rj,"StateValidated",5); +z.defineProperty(rj,{He:"textBlock"},function(){return this.rz},function(a){null!==a&&z.l(a,qa,rj,"textBlock");this.rz=a});z.defineProperty(rj,{zf:"currentTextEditor"},function(){return this.LB},function(a){this.LB=a});z.defineProperty(rj,{oH:"defaultTextEditor"},function(){return this.SB},function(a){z.l(a,Element,rj,"defaultTextEditor");this.SB=a});z.defineProperty(rj,{UA:"starting"},function(){return this.Qo},function(a){z.Ba(a,rj,rj,"starting");this.Qo=a}); +rj.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.h;if(null===a||a.ib||!a.R.left||this.isBeyondDragSize())return!1;a=a.pe(a.R.ga,null,function(a){return a instanceof qa});if(null===a||!a.Sz||!a.ca.canEdit())return!1;a=a.ca;return null===a||this.UA===sj&&!a.jb?!1:!0};rj.prototype.doStart=function(){this.ua||null===this.He||this.doActivate()}; +rj.prototype.doActivate=function(){if(!this.ua){var a=this.h;if(null!==a){var b=this.He;null===b&&(b=a.pe(a.R.ga,function(a){return a instanceof qa?a:null}));if(null!==b&&(this.He=b,null!==b.ca)){this.ua=!0;this.nb=Hj;var c=this.oH,d=!1;null!==b.RF&&(c=b.RF);null===c||c.pC||(d=!0);this.iD=this.He.copy();var e=new w(this.He.eb(Zb),this.He.eb(ic));a.eJ(e);if(c.pC){var g=b.eb(ec),h=a.position,k=a.scale,l=b.hj()*k;l<this.bF&&(l=this.bF);var e=b.Ga.width*l,m=b.Ga.height*l,n=(g.x-h.x)*k,g=(g.y-h.y)*k;c.value= +b.text;a.El.style.font=b.font;c.style.font="inherit";c.style.fontSize=100*l+"%";c.style.lineHeight="normal";c.style.width=e+6+"px";c.style.height=m+2+"px";c.style.left=(n-e/2|0)-1+"px";c.style.top=(g-m/2|0)-1+"px";c.style.textAlign=b.textAlign;c.style.margin="0";c.style.padding="1px";c.style.border="0";c.style.outline="none";c.style["white-space"]="pre-wrap";c.style.overflow="hidden"}a.El.appendChild(c);c.style.position="absolute";c.style.zIndex=100;c.className="start";c.textEditingTool=this;c.rJ= +l;if(d&&"function"===typeof c.onActivate)c.onActivate();this.zf=c;"function"===typeof c.focus&&c.focus();"function"===typeof c.select&&this.NA&&(c.select(),c.setSelectionRange(0,9999))}}}};rj.prototype.doCancel=function(){null!==this.ll&&(this.zf.style.border=this.ll,this.ll=null);this.stopTool()};rj.prototype.doMouseUp=function(){!this.ua&&this.canStart()&&this.doActivate()};rj.prototype.doMouseDown=function(){this.ua&&this.acceptText(Gj)}; +rj.prototype.acceptText=function(a){switch(a){case Gj:if(this.nb===Lj||this.nb===Jj)"function"===typeof this.zf.focus&&this.zf.focus();else if(this.nb===Hj||this.nb===Ij)this.nb=Kj,Mj(this);break;case xj:case vj:case wj:if(vj===a&&!0===this.rz.mx)break;if(this.nb===Hj||this.nb===Ij)this.nb=Kj,Mj(this)}}; +function Mj(a){if(null!==a.He&&null!==a.zf){var b=a.He,c=a.He.text,d=a.zf.value,e="",e="function"===typeof d?d():d;if(!a.isValidText(a.He,c,e)){a.nb=Ij;null!==b.Uz&&b.Uz(a,c,e);null===a.ll&&(a.ll=a.zf.style.border,a.zf.style.border="3px solid red");"function"===typeof a.zf.focus&&a.zf.focus();return}a.Wb(a.name);a.nb=Lj;c!==e&&(a.He.text=e);a.Mf=a.name;b=a.h;null!==b&&b.Ja("TextEdited",a.He,c);a.yk();a.stopTool();null!==b&&b.focus()}null!==a.ll&&(a.zf.style.border=a.ll,a.ll=null)} +rj.prototype.doDeactivate=function(){var a=this.h;if(null!==a){this.nb=tj;this.He=null;if(null!==this.zf){var b=this.zf;if("function"===typeof b.onDeactivate)b.onDeactivate();null!==b&&a.El.removeChild(b)}this.ua=!1}};rj.prototype.doFocus=function(){var a=this.zf;null!==a&&(this.nb===Hj?this.nb=Ij:this.nb===Lj?this.nb=Jj:this.nb===Jj&&(this.nb=Ij),"function"===typeof a.select&&this.NA&&(a.select(),a.setSelectionRange(0,9999)))}; +rj.prototype.doBlur=function(){var a=this.zf;null!==a&&("function"===typeof a.focus&&a.focus(),"function"===typeof a.select&&this.NA&&(a.select(),a.setSelectionRange(0,9999)))};rj.prototype.isValidText=function(a,b,c){z.l(a,qa,rj,"isValidText:textblock");var d=this.XA;if(null!==d&&!d(a,b,c))return!1;d=a.XA;return null===d||d(a,b,c)?!0:!1};z.defineProperty(rj,{XA:"textValidation"},function(){return this.ol},function(a){null!==a&&z.g(a,"function",rj,"textValidation");this.ol=a}); +z.defineProperty(rj,{bF:"minimumEditorScale"},function(){return this.DC},function(a){null!==a&&z.g(a,"number",rj,"minimumEditorScale");this.DC=a});z.defineProperty(rj,{NA:"selectsTextOnActivate"},function(){return this.ZC},function(a){null!==a&&z.g(a,"boolean",rj,"selectsTextOnActivate");this.ZC=a}); +function gh(){xg.call(this);this.name="ToolManager";this.rG=new J(xg);this.sG=new J(xg);this.tG=new J(xg);this.hC=this.iC=850;this.WB=(new Ea(2,2)).La();this.rD=5E3;this.HC=Ih;this.fC=Nj;this.dv=this.MB=null;this.Mm=-1}z.Qa(gh,xg);z.ia("ToolManager",gh);var Ih;gh.WheelScroll=Ih=z.s(gh,"WheelScroll",0);var Hh;gh.WheelZoom=Hh=z.s(gh,"WheelZoom",1);gh.WheelNone=z.s(gh,"WheelNone",2);var Nj;gh.GestureZoom=Nj=z.s(gh,"GestureZoom",3);var Oj;gh.GestureCancel=Oj=z.s(gh,"GestureCancel",4);var Pj; +gh.GestureNone=Pj=z.s(gh,"GestureNone",5);z.defineProperty(gh,{cu:"mouseWheelBehavior"},function(){return this.HC},function(a){z.Ba(a,gh,gh,"mouseWheelBehavior");this.HC=a});z.defineProperty(gh,{qp:"gestureBehavior"},function(){return this.fC},function(a){z.Ba(a,gh,gh,"gestureBehavior");this.fC=a}); +gh.prototype.initializeStandardTools=function(){this.IG=new jj;this.jF=new Nh;this.uI=new Si;this.wF=new Zi;this.bJ=new gj;this.YE=new ta;this.me=new lh;this.sH=new pj;this.NI=new qj;this.Iz=new lj;this.WA=new rj;this.YG=new va;this.ZG=new ij};gh.prototype.updateAdornments=function(a){var b=this.uh;if(null!==b&&this.dv===a){var c=b.fc;(null!==a?c.ca===a:null===c)?this.showToolTip(b,c):this.hideToolTip()}}; +gh.prototype.doMouseDown=function(){var a=this.h;if(null!==a){var b=a.R;b.mj&&this.qp===Oj&&(b.bubbles=!1);if(b.Qt){if(this.qp===Pj){b.bubbles=!0;return}if(this.qp===Oj)return;if(a.cb.canStartMultiTouch()){a.cb.standardPinchZoomStart();return}}var c=a.pa;c.Fz&&0!==c.Ih&&z.trace("WARNING: In ToolManager.doMouseDown: UndoManager.transactionLevel is not zero");for(var c=this.Ye.length,d=0;d<c;d++){var e=this.Ye.ea(d);null===e.h&&e.Sc(this.h);if(e.canStart()){a.doFocus();a.cb=e;a.cb===e&&(e.ua||e.doActivate(), +e.doMouseDown());return}}1===a.R.button&&(this.cu===Ih?this.cu=Hh:this.cu===Hh&&(this.cu=Ih));this.doActivate();this.standardWaitAfter(this.EE,b)}}; +gh.prototype.doMouseMove=function(){var a=this.h;if(null!==a){var b=a.R;if(b.Qt){if(this.qp===Pj){b.bubbles=!0;return}if(this.qp===Oj)return;if(a.cb.canStartMultiTouch()){a.cb.standardPinchZoomMove();return}}if(this.ua)for(var c=this.eg.length,d=0;d<c;d++){var e=this.eg.ea(d);null===e.h&&e.Sc(this.h);if(e.canStart()){a.doFocus();a.cb=e;a.cb===e&&(e.ua||e.doActivate(),e.doMouseMove());return}}Qj(this,a);null===b.event||"mousemove"!==b.event.type&&b.event.cancelable||(b.bubbles=!0)}}; +function Qj(a,b){a.standardMouseOver();a.isBeyondDragSize()&&a.standardWaitAfter(a.ua?a.EE:a.VH,b.R)}gh.prototype.doCurrentObjectChanged=function(a,b){var c=this.uh;null===c||null!==b&&(b===c||b.Pl(c))||this.hideToolTip()};gh.prototype.doWaitAfter=function(a){var b=this.h;null!==b&&b.Fb&&(this.doMouseHover(),this.ua||this.doToolTip(),a.mj&&!b.R.Gc&&(a=a.copy(),a.button=2,a.buttons=2,b.R=a,b.Ss=!0,b.doMouseUp()))}; +gh.prototype.doMouseHover=function(){var a=this.h;if(null!==a){var b=a.R;null===b.Ge&&(b.Ge=a.pe(b.ga,null,null));var c=b.Ge;if(null!==c)for(b.Gc=!1;null!==c;){a=this.ua?c.rA:c.sA;if(null!==a&&(a(b,c),b.Gc))break;c=c.T}else a=this.ua?a.rA:a.sA,null!==a&&a(b)}}; +gh.prototype.doToolTip=function(){var a=this.h;if(null!==a){var b=a.R;null===b.Ge&&(b.Ge=a.pe(b.ga,null,null));b=b.Ge;if(null!==b){if(b!==this.uh&&!b.Pl(this.uh)){for(;null!==b;){a=b.ZA;if(null!==a){this.showToolTip(a,b);return}b=b.T}this.hideToolTip()}}else a=a.ZA,null!==a?this.showToolTip(a,null):this.hideToolTip()}}; +gh.prototype.showToolTip=function(a,b){z.l(a,da,gh,"showToolTip:tooltip");null!==b&&z.l(b,O,gh,"showToolTip:obj");var c=this.h;if(null!==c){a!==this.uh&&this.hideToolTip();a.If="Tool";a.wk=!1;a.scale=1/c.scale;a.nc="ToolTip";null!==a.placeholder&&(a.placeholder.scale=c.scale);c.add(a);if(null!==b){var c=null,d=b.np();null!==d&&(c=d.data);a.fc=b;a.data=c}else a.data=c.ha;a.Bf();this.positionToolTip(a,b);this.uh=a;-1!==this.Mm&&(z.clearTimeout(this.Mm),this.Mm=-1);c=this.wJ;if(0<c&&Infinity!==c){var e= +this;this.Mm=z.setTimeout(function(){e.hideToolTip()},c)}}};gh.prototype.positionToolTip=function(a){if(null===a.placeholder){var b=this.h;if(null!==b){var c=b.R.ga.copy(),d=a.Ia,e=b.xb;b.R.mj&&(c.x-=d.width);c.x+d.width>e.right&&(c.x-=d.width+5);c.x<e.x&&(c.x=e.x);c.y=c.y+20+d.height>e.bottom?c.y-(d.height+5):c.y+20;c.y<e.y&&(c.y=e.y);a.position=c}}}; +gh.prototype.hideToolTip=function(){-1!==this.Mm&&(z.clearTimeout(this.Mm),this.Mm=-1);var a=this.h;null!==a&&null!==this.uh&&(a.remove(this.uh),null!==this.dv&&this.dv.sj(this.uh.nc),this.uh.data=null,this.uh=this.uh.fc=null)};z.defineProperty(gh,{uh:"currentToolTip"},function(){return this.MB},function(a){null!==a&&z.l(a,da,gh,"currentToolTip");this.MB=a;this.dv=null!==a?a.Xf:null}); +gh.prototype.doMouseUp=function(){this.cancelWaitAfter();var a=this.h;if(null!==a){if(this.ua)for(var b=this.fg.length,c=0;c<b;c++){var d=this.fg.ea(c);null===d.h&&d.Sc(this.h);if(d.canStart()){a.doFocus();a.cb=d;a.cb===d&&(d.ua||d.doActivate(),d.doMouseUp());return}}a.doFocus();this.doDeactivate()}};gh.prototype.doMouseWheel=function(){this.standardMouseWheel()};gh.prototype.doKeyDown=function(){var a=this.h;null!==a&&a.wb.doKeyDown()};gh.prototype.doKeyUp=function(){var a=this.h;null!==a&&a.wb.doKeyUp()}; +gh.prototype.doCancel=function(){null!==Lh&&Lh.doCancel();xg.prototype.doCancel.call(this)};gh.prototype.findTool=function(a){z.g(a,"string",gh,"findTool:name");for(var b=this.Ye.length,c=0;c<b;c++){var d=this.Ye.ea(c);if(d.name===a)return d}b=this.eg.length;for(c=0;c<b;c++)if(d=this.eg.ea(c),d.name===a)return d;b=this.fg.length;for(c=0;c<b;c++)if(d=this.fg.ea(c),d.name===a)return d;return null}; +gh.prototype.replaceTool=function(a,b){z.g(a,"string",gh,"replaceTool:name");null!==b&&(z.l(b,xg,gh,"replaceTool:newtool"),b.h&&b.h!==this.h&&z.k("Cannot share tools between Diagrams: "+b.toString()),b.Sc(this.h));for(var c=this.Ye.length,d=0;d<c;d++){var e=this.Ye.ea(d);if(e.name===a)return null!==b?this.Ye.Sg(d,b):this.Ye.dd(d),e}c=this.eg.length;for(d=0;d<c;d++)if(e=this.eg.ea(d),e.name===a)return null!==b?this.eg.Sg(d,b):this.eg.dd(d),e;c=this.fg.length;for(d=0;d<c;d++)if(e=this.fg.ea(d),e.name=== +a)return null!==b?this.fg.Sg(d,b):this.fg.dd(d),e;return null};function Rj(a,b,c,d){z.g(b,"string",gh,"replaceStandardTool:name");z.l(d,J,gh,"replaceStandardTool:list");null!==c&&(z.l(c,xg,gh,"replaceStandardTool:newtool"),c.h&&c.h!==a.h&&z.k("Cannot share tools between Diagrams: "+c.toString()),c.name=b,c.Sc(a.h));a.findTool(b)?a.replaceTool(b,c):null!==c&&d.add(c)}z.w(gh,{Ye:"mouseDownTools"},function(){return this.rG});z.w(gh,{eg:"mouseMoveTools"},function(){return this.sG}); +z.w(gh,{fg:"mouseUpTools"},function(){return this.tG});z.defineProperty(gh,{VH:"hoverDelay"},function(){return this.iC},function(a){z.g(a,"number",gh,"hoverDelay");this.iC=a});z.defineProperty(gh,{EE:"holdDelay"},function(){return this.hC},function(a){z.g(a,"number",gh,"holdDelay");this.hC=a});z.defineProperty(gh,{tH:"dragSize"},function(){return this.WB},function(a){z.l(a,Ea,gh,"dragSize");this.WB=a.V()}); +z.defineProperty(gh,{wJ:"toolTipDuration"},function(){return this.rD},function(a){z.g(a,"number",gh,"toolTipDuration");this.rD=a});z.defineProperty(gh,{IG:"actionTool"},function(){return this.findTool("Action")},function(a){Rj(this,"Action",a,this.Ye)});z.defineProperty(gh,{jF:"relinkingTool"},function(){return this.findTool("Relinking")},function(a){Rj(this,"Relinking",a,this.Ye)}); +z.defineProperty(gh,{uI:"linkReshapingTool"},function(){return this.findTool("LinkReshaping")},function(a){Rj(this,"LinkReshaping",a,this.Ye)});z.defineProperty(gh,{wF:"resizingTool"},function(){return this.findTool("Resizing")},function(a){Rj(this,"Resizing",a,this.Ye)});z.defineProperty(gh,{bJ:"rotatingTool"},function(){return this.findTool("Rotating")},function(a){Rj(this,"Rotating",a,this.Ye)}); +z.defineProperty(gh,{YE:"linkingTool"},function(){return this.findTool("Linking")},function(a){Rj(this,"Linking",a,this.eg)});z.defineProperty(gh,{me:"draggingTool"},function(){return this.findTool("Dragging")},function(a){Rj(this,"Dragging",a,this.eg)});z.defineProperty(gh,{sH:"dragSelectingTool"},function(){return this.findTool("DragSelecting")},function(a){Rj(this,"DragSelecting",a,this.eg)}); +z.defineProperty(gh,{NI:"panningTool"},function(){return this.findTool("Panning")},function(a){Rj(this,"Panning",a,this.eg)});z.defineProperty(gh,{Iz:"contextMenuTool"},function(){return this.findTool("ContextMenu")},function(a){Rj(this,"ContextMenu",a,this.fg)});z.defineProperty(gh,{WA:"textEditingTool"},function(){return this.findTool("TextEditing")},function(a){Rj(this,"TextEditing",a,this.fg)}); +z.defineProperty(gh,{YG:"clickCreatingTool"},function(){return this.findTool("ClickCreating")},function(a){Rj(this,"ClickCreating",a,this.fg)});z.defineProperty(gh,{ZG:"clickSelectingTool"},function(){return this.findTool("ClickSelecting")},function(a){Rj(this,"ClickSelecting",a,this.fg)}); +function Jg(){this.NB=Sj;this.Pq=this.Qq=this.Z=null;this.Gn=this.Rq=this.Sq=0;this.Hn=this.wc=this.so=this.Kj=!1;this.Lj=this.af=!0;this.cv=this.bv=this.HB=null;this.GB=0;this.Qo=null;this.Pu=new K("string");this.Fy=600;this.xG=new N(0,0);this.vB=this.uB=this.vD=!1;this.xm=new na(O,Tj)}z.ia("AnimationManager",Jg);Jg.prototype.Sc=function(a){this.Z=a};function Sj(a,b,c,d){a/=d/2;return 1>a?c/2*a*a+b:-c/2*(--a*(a-2)-1)+b} +z.defineProperty(Jg,{UA:"starting"},function(){return this.Qo},function(a){this.Qo!==a&&(null!==a&&z.g(a,"function",Jg,"starting"),this.Qo=a)});z.w(Jg,{aK:"animationReasons"},function(){return this.Pu});Jg.prototype.prepareAutomaticAnimation=Jg.prototype.rn=function(a){if(this.af&&(this.Lj||this.Z.jn)){this.Pu.add(a);var b=this.UA;if(null===b||b(this,a))this.Kj&&this.pi(),this.wc=!0}}; +function Uj(a){if(a.af&&(a.Pu.clear(),a.wc))if(!a.Hn)a.wc=!1;else if(0===a.Gn){var b=+new Date;a.Gn=b;requestAnimationFrame(function(){if(!1!==a.wc&&!a.Kj&&a.Gn===b){var c=a.Z;c.ij("temporaryPixelRatio")&&(c.dk=1);Vj(c);a.wc=!1;c.Ja("AnimationStarting");Wj(a,b)}})}} +function Xj(a,b,c,d,e,g){if(a.wc&&(u&&z.l(b,O,Jg,"addPropToAnimation:obj"),!("position"===c&&d.N(e)||b instanceof D&&!b.HE))){var h=a.xm;if(h.contains(b)){var h=h.na(b),k=h.start,l=h.end;void 0===k[c]&&(k[c]=Yj(d));h.Qw&&void 0!==l[c]?h.yt[c]=Yj(e):(g||(h.yt[c]=Yj(e)),l[c]=Yj(e));g&&0===c.indexOf("position:")&&(h.yt.location=Yj(b.location))}else k=new ma,l=new ma,k[c]=Yj(d),l[c]=Yj(e),d=l,e=k.position,e instanceof N&&!e.F()&&a.Pu.contains("Expand SubGraph")&&e.assign(d.position),k=new Tj(k,l,g),g&& +0===c.indexOf("position:")&&(k.yt.location=Yj(b.location)),h.add(b,k);a.Hn=!0}}function Yj(a){return a instanceof N?a.copy():a instanceof Ea?a.copy():a} +function Wj(a,b){var c;function d(){if(!1!==g.Kj&&g.Gn===b){var a=+new Date,c=a>s?m:a-r;Zj(g);ak(g,e,q,h,c,m);g.bv&&g.bv();pi(e);bk(g);a>s?ck(g):requestAnimationFrame(d)}}void 0===c&&(c=new ma);var e=a.Z;if(null!==e){a.Kj=!0;var g=a,h=c.AK||a.NB,k=c.$K||null,l=c.aL||null,m=c.duration||a.Fy,n=a.xG;for(c=a.xm.i;c.next();){var p=c.value.start.position;p instanceof N&&(p.F()||p.assign(n))}a.HB=h;a.bv=k;a.cv=l;a.GB=m;a.KB=a.xm;var q=a.KB;for(c=q.i;c.next();)k=c.value.end,k["position:placeholder"]&&(l= +k["position:placeholder"],n=l.eb(Zb),n.x+=l.padding.left,n.y+=l.padding.top,k["position:placeholder"]=n);Zj(a);ak(a,e,q,h,0,m);pi(a.Z);bk(a);var r=+new Date,s=r+m;g.Gn===b&&requestAnimationFrame(function(){d()})}} +var dk={opacity:function(a,b,c,d,e,g){a.opacity=d(e,b,c-b,g)},position:function(a,b,c,d,e,g){e!==g?a.Ox(d(e,b.x,c.x-b.x,g),d(e,b.y,c.y-b.y,g)):a.position=new N(d(e,b.x,c.x-b.x,g),d(e,b.y,c.y-b.y,g))},"position:node":function(a,b,c,d,e,g){var h=a.W,k=c.W;c=k.x+k.width/2-h.width/2;h=k.y+k.height/2-h.height/2;e!==g?a.Ox(d(e,b.x,c-b.x,g),d(e,b.y,h-b.y,g)):a.position=new N(d(e,b.x,c-b.x,g),d(e,b.y,h-b.y,g))},"position:placeholder":function(a,b,c,d,e,g){e!==g?a.Ox(d(e,b.x,c.x-b.x,g),d(e,b.y,c.y-b.y,g)): +a.position=new N(d(e,b.x,c.x-b.x,g),d(e,b.y,c.y-b.y,g))},scale:function(a,b,c,d,e,g){a.scale=d(e,b,c-b,g)},visible:function(a,b,c,d,e,g){a.visible=e!==g?b:c}};function Zj(a){if(!a.so){var b=a.Z;a.vD=b.Bb;a.uB=b.Ee;a.vB=b.vu;b.Bb=!0;b.Ee=!0;b.vu=!0;a.so=!0}}function bk(a){var b=a.Z;b.Bb=a.vD;b.Ee=a.uB;b.vu=a.vB;a.so=!1} +function ak(a,b,c,d,e,g){for(c=c.i;c.next();){var h=c.key,k=c.value,l=k.start,k=k.end,m;for(m in k)if(("position"!==m||!k["position:placeholder"]&&!k["position:node"])&&void 0!==dk[m])dk[m](h,l[m],k[m],d,e,g)}d=b.fA;b.fA=!0;m=a.NB;0!==a.Sq&&0!==a.Rq&&(c=a.Sq,b.bc=m(e,c,a.Rq-c,g));null!==a.Qq&&null!==a.Pq&&(c=a.Qq,a=a.Pq,b.sb=new N(m(e,c.x,a.x-c.x,g),m(e,c.y,a.y-c.y,g)));b.fA=d}Jg.prototype.stopAnimation=Jg.prototype.pi=function(){!0===this.wc&&(this.wc=!1,this.Hn&&this.Z.Ce());this.Kj&&this.af&&ck(this)}; +function ck(a){a.Kj=!1;a.Gn=0;a.Hn=!1;a.Qq=null;a.Pq=null;a.Sq=0;a.Rq=0;Zj(a);for(var b=a.Z,c=a.HB,d=a.GB,e=a.KB.i;e.next();){var g=e.key,h=e.value,k=h.start,l=h.end,m=h.yt,n;for(n in l)if(void 0!==dk[n]){var p=n;!h.Qw||"position:node"!==p&&"position:placeholder"!==p||(p="position");dk[p](g,k[n],void 0!==m[n]?m[n]:h.Qw?k[n]:l[n],c,d,d)}h.Qw&&void 0!==m.location&&(g.location=m.location);h.Dx&&g.wd(!1)}for(c=a.Z.links;c.next();)d=c.value,null!==d.Jo&&(d.points=d.Jo,d.Jo=null);b.sx.clear();b.dk=null; +b.yc();b.ta();b.cg();ek(b);bk(a);a.xm=new na(O,Tj);a.cv&&a.cv();a.cv=null;a.bv=null;b.Ja("AnimationFinished");b.Ce()}function fk(a,b,c){var d=b.W,e=c.W,g=null;c instanceof F&&(g=c.placeholder);null!==g?(d=g.eb(Zb),d.x+=g.padding.left,d.y+=g.padding.top,Xj(a,b,"position",d,b.position,!1)):Xj(a,b,"position",new N(e.x+e.width/2-d.width/2,e.y+e.height/2-d.height/2),b.position,!1);Xj(a,b,"scale",.01,b.scale,!1);if(b instanceof F)for(b=b.Hc;b.next();)g=b.value,g instanceof E&&fk(a,g,c)} +function gk(a,b,c){if(b.isVisible()){var d=null;c instanceof F&&(d=c.placeholder);null!==d?Xj(a,b,"position:placeholder",b.position,d,!0):Xj(a,b,"position:node",b.position,c,!0);Xj(a,b,"scale",b.scale,.01,!0);a.wc&&(d=a.xm,d.contains(b)&&(d.na(b).Dx=!0));if(b instanceof F)for(b=b.Hc;b.next();)d=b.value,d instanceof E&&gk(a,d,c)}}function hk(a,b,c){a.wc&&(null===a.Qq&&b.F()&&null===a.Pq&&(a.Qq=b.copy()),a.Pq=c.copy(),a.Hn=!0)} +function ik(a,b,c){a.wc&&a.Z.jn&&(0===a.Sq&&0===a.Rq&&(a.Sq=b),a.Rq=c,a.Hn=!0)}z.defineProperty(Jg,{isEnabled:"isEnabled"},function(){return this.af},function(a){z.g(a,"boolean",Jg,"isEnabled");this.af=a});z.defineProperty(Jg,{duration:"duration"},function(){return this.Fy},function(a){z.g(a,"number",Jg,"duration");1>a&&z.ka(a,">= 1",Jg,"duration");this.Fy=a});z.w(Jg,{nf:"isAnimating"},function(){return this.Kj});z.w(Jg,{jI:"isTicking"},function(){return this.so}); +z.defineProperty(Jg,{QE:"isInitial"},function(){return this.Lj},function(a){z.g(a,"boolean",Jg,"isInitial");this.Lj=a});function Tj(a,b,c){this.start=a;this.end=b;this.yt=new ma;this.Qw=c;this.Dx=!1}function wg(){0<arguments.length&&z.od(wg);z.kc(this);this.Z=null;this.mb=new J(D);this.Ub="";this.Xc=1;this.Wy=!1;this.nl=this.wz=this.Kk=this.Jk=this.Ik=this.Hk=this.Fk=this.Gk=this.Ek=this.Mk=this.Dk=this.Lk=this.Ck=this.Bk=!0;this.Ry=!1;this.Wv=[]}z.ia("Layer",wg); +wg.prototype.Sc=function(a){this.Z=a}; +wg.prototype.toString=function(a){void 0===a&&(a=0);var b='Layer "'+this.name+'"';if(0>=a)return b;for(var c=0,d=0,e=0,g=0,h=0,k=this.mb.i;k.next();){var l=k.value;l instanceof F?e++:l instanceof E?d++:l instanceof G?g++:l instanceof da?h++:c++}k="";0<c&&(k+=c+" Parts ");0<d&&(k+=d+" Nodes ");0<e&&(k+=e+" Groups ");0<g&&(k+=g+" Links ");0<h&&(k+=h+" Adornments ");if(1<a)for(a=this.mb.i;a.next();)c=a.value,k+="\n "+c.toString(),d=c.data,null!==d&&z.nd(d)&&(k+=" #"+z.nd(d)),c instanceof E?k+=" "+ +ka(d):c instanceof G&&(k+=" "+ka(c.Y)+" "+ka(c.da));return b+" "+this.mb.count+": "+k}; +wg.prototype.findObjectAt=wg.prototype.pe=function(a,b,c){void 0===b&&(b=null);void 0===c&&(c=null);if(!1===this.nl)return null;u&&!a.F()&&z.k("findObjectAt: Point must have a real value, not: "+a.toString());var d=!1;this.h.xb.Ma(a)&&(d=!0);for(var e=z.O(),g=this.mb.o,h=g.length;h--;){var k=g[h];if((!0!==d||!1!==jk(k))&&k.isVisible()&&(e.assign(a),tb(e,k.qh),k=k.pe(e,b,c),null!==k&&(null!==b&&(k=b(k)),null!==k&&(null===c||c(k)))))return z.A(e),k}z.A(e);return null}; +wg.prototype.findObjectsAt=wg.prototype.lp=function(a,b,c,d){void 0===b&&(b=null);void 0===c&&(c=null);d instanceof J||d instanceof K||(d=new K(O));if(!1===this.nl)return d;u&&!a.F()&&z.k("findObjectsAt: Point must have a real value, not: "+a.toString());var e=!1;this.h.xb.Ma(a)&&(e=!0);for(var g=z.O(),h=this.mb.o,k=h.length;k--;){var l=h[k];!0===e&&!1===jk(l)||!l.isVisible()||(g.assign(a),tb(g,l.qh),l.lp(g,b,c,d)&&(null!==b&&(l=b(l)),null===l||null!==c&&!c(l)||d.add(l)))}z.A(g);return d}; +wg.prototype.findObjectsIn=wg.prototype.pk=function(a,b,c,d,e){void 0===b&&(b=null);void 0===c&&(c=null);void 0===d&&(d=!1);e instanceof J||e instanceof K||(e=new K(O));if(!1===this.nl)return e;u&&!a.F()&&z.k("findObjectsIn: Rect must have a real value, not: "+a.toString());var g=!1;this.h.xb.nk(a)&&(g=!0);for(var h=this.mb.o,k=h.length;k--;){var l=h[k];(!0!==g||!1!==jk(l))&&l.isVisible()&&l.pk(a,b,c,d,e)&&(null!==b&&(l=b(l)),null===l||null!==c&&!c(l)||e.add(l))}return e}; +wg.prototype.Vz=function(a,b,c,d,e,g,h){if(!1===this.nl)return e;for(var k=this.mb.o,l=k.length;l--;){var m=k[l];(!0!==h||!1!==jk(m))&&g(m)&&m.isVisible()&&m.pk(a,b,c,d,e)&&(null!==b&&(m=b(m)),null===m||null!==c&&!c(m)||e.add(m))}return e}; +wg.prototype.findObjectsNear=wg.prototype.cn=function(a,b,c,d,e,g){void 0===c&&(c=null);void 0===d&&(d=null);void 0===e&&(e=!0);if(!1!==e&&!0!==e){if(e instanceof J||e instanceof K)g=e;e=!0}g instanceof J||g instanceof K||(g=new K(O));if(!1===this.nl)return g;u&&!a.F()&&z.k("findObjectsNear: Point must have a real value, not: "+a.toString());var h=!1;this.h.xb.Ma(a)&&(h=!0);for(var k=z.O(),l=z.O(),m=this.mb.o,n=m.length;n--;){var p=m[n];!0===h&&!1===jk(p)||!p.isVisible()||(k.assign(a),tb(k,p.qh), +l.n(a.x+b,a.y),tb(l,p.qh),p.cn(k,l,c,d,e,g)&&(null!==c&&(p=c(p)),null===p||null!==d&&!d(p)||g.add(p)))}z.A(k);z.A(l);return g};f=wg.prototype;f.Jf=function(a,b){if(this.visible){var c;c=void 0===b?a.xb:b;for(var d=this.mb.o,e=d.length,g=0;g<e;g++){var h=d[g];h.AC=g;if(!(h instanceof G&&!1===h.Dg)){if(h instanceof da){var k=h;if(null!==k.Xf)continue}if(Gb(h.W,c))for(h.Jf(!0),kk(h),h=h.Dw;h.next();)k=h.value,uj(k,Infinity,Infinity),k.Lc(),k.Jf(!0);else h.Jf(!1),null!==h.Dw&&0<h.Dw.count&&kk(h)}}}}; +f.ff=function(a,b,c){if(this.visible&&0!==this.Xc&&(void 0===c&&(c=!0),c||!this.Nc)){c=this.mb.o;var d=c.length;if(0!==d){1!==this.Xc&&(a.globalAlpha=this.Xc);var e=this.Wv;e.length=0;for(var g=b.scale,h=0;h<d;h++){var k=c[h];if(jk(k)){if(k instanceof G){var l=k;l.rc&&e.push(l);if(!1===l.Dg)continue}l=k.W;1<l.width*g||1<l.height*g?k.ff(a,b):lk(k,a)}}a.globalAlpha=1}}}; +function mk(a,b,c,d){if(a.visible&&0!==a.Xc){1!==a.Xc&&(b.globalAlpha=a.Xc);var e=a.Wv;e.length=0;var g=c.scale;a=a.mb.o;for(var h=a.length,k=d.length,l=0;l<h;l++){var m=a[l];if(jk(m)){if(m instanceof G){var n=m;n.rc&&e.push(n);if(!1===n.Dg)continue}var n=nk(m,m.W),p;a:{p=n;for(var q=d,r=k,s=2/g,t=4/g,v=0;v<r;v++){var x=q[v];if(0!==x.width&&0!==x.height&&p.FE(x.x-s,x.y-s,x.width+t,x.height+t)){p=!0;break a}}p=!1}p&&(1<n.width*g||1<n.height*g?m.ff(b,c):lk(m,b))}}b.globalAlpha=1}} +f.j=function(a,b,c,d,e){var g=this.h;null!==g&&g.Rc(Uf,a,this,b,c,d,e)};f.xp=function(a,b,c){var d=this.mb;b.Fv=this;if(a>=d.count)a=d.count;else if(d.ea(a)===b)return-1;d.Ld(a,b);b.Kt(c);d=this.h;null!==d&&(c?d.ta():d.xp(b));ok(this,a,b);return a}; +f.Ve=function(a,b,c){if(!c&&b.layer!==this&&null!==b.layer)return b.layer.Ve(a,b,c);var d=this.mb;if(0>a||a>=d.length){if(a=d.indexOf(b),0>a)return-1}else if(d.ea(a)!==b&&(a=d.indexOf(b),0>a))return-1;b.Lt(c);d.dd(a);d=this.h;null!==d&&(c?d.ta():d.Ve(b));b.Fv=null;return a}; +function ok(a,b,c){b=pk(a,b,c);if(c instanceof F&&null!==c&&isNaN(c.Dn)){if(0!==c.Hc.count){for(var d=-1,e=a.mb.o,g=e.length,h=0;h<g;h++){var k=e[h];if(k===c&&(b=h,0<=d))break;if(0>d&&k.Va===c&&(d=h,0<=b))break}!(0>d)&&d<b&&(e=a.mb,e.dd(b),e.Ld(d,c))}c=c.Va;null!==c&&ok(a,-1,c)}} +function pk(a,b,c){var d=c.Dn;if(isNaN(d))return b;a=a.mb;var e=a.count;if(1>=e)return b;0>b&&(b=a.indexOf(c));if(0>b)return-1;for(var g=b-1,h=NaN;0<=g;){h=a.ea(g).Dn;if(!isNaN(h))break;g--}for(var k=b+1,l=NaN;k<e;){l=a.ea(k).Dn;if(!isNaN(l))break;k++}if(!isNaN(h)&&h>d)for(;;){if(-1===g||h<=d){g++;if(g===b)break;a.dd(b);a.Ld(g,c);return g}for(h=NaN;0<=--g&&(h=a.ea(g).Dn,isNaN(h)););}else if(!isNaN(l)&&l<d)for(;;){if(k===e||l>=d){k--;if(k===b)break;a.dd(b);a.Ld(k,c);return k}for(l=NaN;++k<e&&(l=a.ea(k).Dn, +isNaN(l)););}return b}f.clear=function(){for(var a=this.mb.jc(),b=a.length,c=0;c<b;c++)a[c].Jf(!1),this.Ve(-1,a[c],!1)};z.w(wg,{oi:"parts"},function(){return this.mb.i});z.w(wg,{lL:"partsBackwards"},function(){return this.mb.kn});z.w(wg,{h:"diagram"},function(){return this.Z}); +z.defineProperty(wg,{name:"name"},function(){return this.Ub},function(a){z.g(a,"string",wg,"name");var b=this.Ub;if(b!==a){var c=this.h;if(null!==c)for(""===b&&z.k("Cannot rename default Layer to: "+a),c=c.ln;c.next();)c.value.name===a&&z.k("Layer.name is already present in this diagram: "+a);this.Ub=a;this.j("name",b,a);for(a=this.mb.i;a.next();)a.value.If=this.Ub}}); +z.defineProperty(wg,{opacity:"opacity"},function(){return this.Xc},function(a){var b=this.Xc;b!==a&&(z.g(a,"number",wg,"opacity"),(0>a||1<a)&&z.ka(a,"0 <= value <= 1",wg,"opacity"),this.Xc=a,this.j("opacity",b,a),a=this.h,null!==a&&a.ta())});z.defineProperty(wg,{Nc:"isTemporary"},function(){return this.Wy},function(a){var b=this.Wy;b!==a&&(z.g(a,"boolean",wg,"isTemporary"),this.Wy=a,this.j("isTemporary",b,a))}); +z.defineProperty(wg,{visible:"visible"},function(){return this.wz},function(a){var b=this.wz;if(b!==a){z.g(a,"boolean",wg,"visible");this.wz=a;this.j("visible",b,a);for(b=this.mb.i;b.next();)b.value.wd(a);a=this.h;null!==a&&a.ta()}});z.defineProperty(wg,{jg:"pickable"},function(){return this.nl},function(a){var b=this.nl;b!==a&&(z.g(a,"boolean",wg,"pickable"),this.nl=a,this.j("pickable",b,a))}); +z.defineProperty(wg,{IE:"isBoundsIncluded"},function(){return this.Ry},function(a){this.Ry!==a&&(this.Ry=a,null!==this.h&&this.h.yc())});z.defineProperty(wg,{lk:"allowCopy"},function(){return this.Bk},function(a){var b=this.Bk;b!==a&&(z.g(a,"boolean",wg,"allowCopy"),this.Bk=a,this.j("allowCopy",b,a))});z.defineProperty(wg,{Rm:"allowDelete"},function(){return this.Ck},function(a){var b=this.Ck;b!==a&&(z.g(a,"boolean",wg,"allowDelete"),this.Ck=a,this.j("allowDelete",b,a))}); +z.defineProperty(wg,{Hw:"allowTextEdit"},function(){return this.Lk},function(a){var b=this.Lk;b!==a&&(z.g(a,"boolean",wg,"allowTextEdit"),this.Lk=a,this.j("allowTextEdit",b,a))});z.defineProperty(wg,{Ew:"allowGroup"},function(){return this.Dk},function(a){var b=this.Dk;b!==a&&(z.g(a,"boolean",wg,"allowGroup"),this.Dk=a,this.j("allowGroup",b,a))}); +z.defineProperty(wg,{Iw:"allowUngroup"},function(){return this.Mk},function(a){var b=this.Mk;b!==a&&(z.g(a,"boolean",wg,"allowUngroup"),this.Mk=a,this.j("allowUngroup",b,a))});z.defineProperty(wg,{lt:"allowLink"},function(){return this.Ek},function(a){var b=this.Ek;b!==a&&(z.g(a,"boolean",wg,"allowLink"),this.Ek=a,this.j("allowLink",b,a))}); +z.defineProperty(wg,{Sm:"allowRelink"},function(){return this.Gk},function(a){var b=this.Gk;b!==a&&(z.g(a,"boolean",wg,"allowRelink"),this.Gk=a,this.j("allowRelink",b,a))});z.defineProperty(wg,{vl:"allowMove"},function(){return this.Fk},function(a){var b=this.Fk;b!==a&&(z.g(a,"boolean",wg,"allowMove"),this.Fk=a,this.j("allowMove",b,a))}); +z.defineProperty(wg,{Fw:"allowReshape"},function(){return this.Hk},function(a){var b=this.Hk;b!==a&&(z.g(a,"boolean",wg,"allowReshape"),this.Hk=a,this.j("allowReshape",b,a))});z.defineProperty(wg,{mt:"allowResize"},function(){return this.Ik},function(a){var b=this.Ik;b!==a&&(z.g(a,"boolean",wg,"allowResize"),this.Ik=a,this.j("allowResize",b,a))}); +z.defineProperty(wg,{Gw:"allowRotate"},function(){return this.Jk},function(a){var b=this.Jk;b!==a&&(z.g(a,"boolean",wg,"allowRotate"),this.Jk=a,this.j("allowRotate",b,a))});z.defineProperty(wg,{xf:"allowSelect"},function(){return this.Kk},function(a){var b=this.Kk;b!==a&&(z.g(a,"boolean",wg,"allowSelect"),this.Kk=a,this.j("allowSelect",b,a))}); +function B(a){function b(){window.document.removeEventListener("DOMContentLoaded",b,!1);qk(c)}1<arguments.length&&z.k("Diagram constructor can only take one optional argument, the DIV HTML element or its id.");z.kc(this);rk=[];this.Vc=!0;this.rB=new Jg;this.rB.Sc(this);this.Gd=17;this.mr=!1;this.iz="default";var c=this;null!==window.document.body?qk(this):window.document.addEventListener("DOMContentLoaded",b,!1);this.Yb=new J(wg);this.Ob=this.Jb=0;this.Yj=this.Pb=this.gd=this.Fb=null;this.qF();this.po= +null;this.pF();this.sb=(new N(NaN,NaN)).freeze();this.bc=1;this.wv=(new N(NaN,NaN)).freeze();this.xv=NaN;this.Nv=1E-4;this.Kv=100;this.Hd=new Fa;this.Bw=(new N(NaN,NaN)).freeze();this.nv=(new w(NaN,NaN,NaN,NaN)).freeze();this.iw=(new Db(0,0,0,0)).freeze();this.jw=sk;this.fw=this.bw=null;this.cm=mh;this.On=Pc;this.Yk=mh;this.mo=Pc;this.yv=this.vv=Zb;this.ve=!0;this.gr=!1;this.rg=new K(O);this.Sk=new na(G,w);this.ao=!0;this.tB=250;this.In=-1;this.Su=(new Db(16,16,16,16)).freeze();this.gv=this.Wf=!1; +this.ho=!0;this.Fi=new Rf;this.Zc=new Rf;this.Qb=new Rf;this.hh=this.ui=null;this.Ss=!1;this.Ay=this.By=null;tk(this);this.Eo=new K(E);this.pl=new K(F);this.yo=new K(G);this.mb=new K(D);this.Cv=!0;this.ww=uk;this.lC=!1;this.yw=Bi;this.wy=this.yy=this.sz=null;this.av="";this.Oq="auto";this.zi=this.Xi=this.Ni=this.Qv=this.Oi=this.Pi=this.Qi=this.yi=this.Di=this.vi=null;this.dz=!1;this.TC={};this.aw=0;this.Uf=[null,null];this.sy=null;this.lq=this.zy=this.mz=this.$C=this.Wi=!1;this.xC=!0;this.Ty=this.Vd= +!1;this.ie=null;var d=this;this.EC=function(a){if(a.ha===d.ha&&d.$a){d.$a=!1;try{var b=a.Dc;""===a.rf&&b===Uf&&vk(d,a.object,a.propertyName)}finally{d.$a=!0}}};this.FC=function(a){wk(d,a)};this.xD=!0;this.dh=-2;this.Ai=new na(Object,D);this.Rk=new na(Object,G);this.mm=new na(Object,Array);this.Fo=new na("string",Array);this.SC=new J(xk);this.Hi=!1;this.Ck=this.Bk=this.Hu=this.af=!0;this.Ju=this.Iu=!1;this.Ou=this.Mu=this.Kk=this.Jk=this.Ik=this.Hk=this.Fk=this.Gk=this.Ek=this.Lu=this.Mk=this.Dk=this.Lk= +!0;this.jm=this.uC=!1;this.Nu=this.Ku=this.tv=this.sv=!0;this.lw=this.hw=16;this.jz=this.gw=!1;this.xs=this.kw=null;this.kz=this.lz=0;this.df=(new Db(5)).freeze();this.ow=(new K(D)).freeze();this.Lv=999999999;this.uv=(new K(D)).freeze();this.Zk=this.hm=this.Jj=!0;this.Wk=this.Ij=!1;this.he=null;this.Qu=!0;this.fh=!1;this.qG=new K(G);this.jC=new K(yk);this.Ed=null;this.KC=1;this.My=!1;this.cD=0;this.wD=(new w(NaN,NaN,NaN,NaN)).freeze();this.hv=(new w(NaN,NaN,NaN,NaN)).freeze();this.Xv=new K(zk);Ak(this); +this.Hv=this.pv=this.Rv=this.PB=this.OB=this.QB=this.Pj=this.Uk=this.Ri=null;Bk(this);this.td=null;this.ov=!1;this.Rn=null;this.gb=new gh;this.gb.initializeStandardTools();this.cb=this.vt=this.gb;this.wb=new ra;this.ha=new V;this.Wi=!0;this.Sb=new yg;this.Wi=!1;this.aC=this.Dy=null;this.jd=1;this.dk=null;this.Xk=new Ck;void 0!==a&&Dk(this,a);this.cl=1;this.om=0;this.zC=new N;this.tD=500;this.Ru=new N;this.Ks=null;this.Vc=this.$k=!1}z.ia("Diagram",B); +function Bk(a){a.Ri=new na("string",D);var b=new E,c=new qa;c.bind(new $g("text","",ka));b.add(c);a.QB=b;a.Ri.add("",b);b=new E;c=new qa;c.stroke="brown";c.bind(new $g("text","",ka));b.add(c);a.Ri.add("Comment",b);b=new E;b.wk=!1;b.ND=!1;c=new X;c.Hb="Ellipse";c.fill="black";c.stroke=null;c.Aa=(new Ea(3,3)).La();b.add(c);a.Ri.add("LinkLabel",b);a.Uk=new na("string",F);b=new F;b.Jx="GROUPPANEL";b.type=Ek;c=new qa;c.font="bold 12pt sans-serif";c.bind(new $g("text","",ka));b.add(c);c=new I(Fk);c.name= +"GROUPPANEL";var d=new X;d.Hb="Rectangle";d.fill="rgba(128,128,128,0.2)";d.stroke="black";c.add(d);d=new bj;d.padding=(new Db(5,5,5,5)).La();c.add(d);b.add(c);a.OB=b;a.Uk.add("",b);a.Pj=new na("string",G);b=new G;c=new X;c.Ff=!0;b.add(c);c=new X;c.fq="Standard";c.fill="black";c.stroke=null;c.ub=0;b.add(c);a.PB=b;a.Pj.add("",b);b=new G;c=new X;c.Ff=!0;c.stroke="brown";b.add(c);a.Pj.add("Comment",b);b=new da;b.type=Fk;c=new X;c.fill=null;c.stroke="dodgerblue";c.ub=3;b.add(c);c=new bj;c.margin=(new Db(1.5, +1.5,1.5,1.5)).La();b.add(c);a.Rv=b;a.pv=b;b=new da;b.type=Ni;c=new X;c.Ff=!0;c.fill=null;c.stroke="dodgerblue";c.ub=3;b.add(c);a.Hv=b} +function qk(a){var b=z.createElement("p");b.style.width="100%";b.style.height="200px";b.style.boxSizing="content-box";var c=z.createElement("div");c.style.position="absolute";c.style.visibility="hidden";c.style.width="200px";c.style.height="150px";c.style.overflow="hidden";c.style.boxSizing="content-box";c.appendChild(b);window.document.body.appendChild(c);var d=b.offsetWidth;c.style.overflow="scroll";b=b.offsetWidth;d===b&&(b=c.clientWidth);window.document.body.removeChild(c);c=d-b;0!==c||z.OE|| +(c=11);a.Gd=c;c=z.createElement("div");c.dir="rtl";c.style.cssText="font-size: 14px; width: 1px; height: 1px; position: absolute; top: -1000px; overflow: scroll;";c.textContent="A";window.document.body.appendChild(c);d="reverse";0<c.scrollLeft?d="default":(c.scrollLeft=1,0===c.scrollLeft&&(d="negative"));window.document.body.removeChild(c);a.iz=d} +B.prototype.toString=function(a){void 0===a&&(a=0);var b="";this.id&&(b=this.id);this.El&&this.El.id&&(b=this.El.id);b='Diagram "'+b+'"';if(0>=a)return b;for(var c=this.Yb.i;c.next();)b+="\n "+c.value.toString(a-1);return b};B.fromDiv=function(a){var b=a;"string"===typeof a&&(b=window.document.getElementById(a));return b instanceof HTMLDivElement&&b.Z instanceof B?b.Z:null}; +z.defineProperty(B,{El:"div"},function(){return this.Pb},function(a){null!==a&&z.l(a,HTMLDivElement,B,"div");if(this.Pb!==a){rk=[];var b=this.Pb;null!==b?(b.Z=void 0,b.innerHTML="",null!==this.Fb&&(this.Fb.removeEventListener("touchstart",this.YF,!1),this.Fb.removeEventListener("touchmove",this.XF,!1),this.Fb.removeEventListener("touchend",this.WF,!1),this.Fb.Kd.Z=null),b=this.gb,null!==b&&(b.Ye.each(function(a){a.cancelWaitAfter()}),b.eg.each(function(a){a.cancelWaitAfter()}),b.fg.each(function(a){a.cancelWaitAfter()})), +b.cancelWaitAfter(),this.cb.doCancel(),this.gd=this.Fb=null,window.removeEventListener("resize",this.gG,!1),window.removeEventListener("mousemove",this.Kp,!0),window.removeEventListener("mousedown",this.Jp,!0),window.removeEventListener("mouseup",this.Mp,!0),window.removeEventListener("mousewheel",this.Bh,!0),window.removeEventListener("DOMMouseScroll",this.Bh,!0),window.removeEventListener("mouseout",this.Lp,!0)):this.fh=!1;this.Pb=null;if(null!==a){if(b=a.Z)b.El=null;Dk(this,a);this.Sp()}}}); +function Gk(a){var b=a.Fb;b.addEventListener("touchstart",a.YF,!1);b.addEventListener("touchmove",a.XF,!1);b.addEventListener("touchend",a.WF,!1);b.addEventListener("mousemove",a.Kp,!1);b.addEventListener("mousedown",a.Jp,!1);b.addEventListener("mouseup",a.Mp,!1);b.addEventListener("mousewheel",a.Bh,!1);b.addEventListener("DOMMouseScroll",a.Bh,!1);b.addEventListener("mouseout",a.Lp,!1);b.addEventListener("keydown",a.nI,!1);b.addEventListener("keyup",a.oI,!1);b.addEventListener("selectstart",function(a){a.preventDefault(); +return!1},!1);b.addEventListener("contextmenu",function(a){a.preventDefault();return!1},!1);b.addEventListener("gesturechange",function(b){a.gb.qp===Oj&&b.preventDefault()},!1);b.addEventListener("pointerdown",a.OI,!1);b.addEventListener("pointermove",a.RI,!1);b.addEventListener("pointerleave",a.QI,!1);window.addEventListener("resize",a.gG,!1)}B.prototype.computePixelRatio=function(){return null!==this.dk?this.dk:this.uG};B.prototype.doMouseMove=function(){this.cb.doMouseMove()}; +B.prototype.doMouseDown=function(){this.cb.doMouseDown()};B.prototype.doMouseUp=function(){this.cb.doMouseUp()};B.prototype.doMouseWheel=function(){this.cb.doMouseWheel()};B.prototype.doKeyDown=function(){this.cb.doKeyDown()};B.prototype.doKeyUp=function(){this.cb.doKeyUp()};B.prototype.doFocus=function(){this.focus()};B.prototype.focus=B.prototype.focus=function(){this.Fb&&this.Fb.focus()}; +function Vj(a){if(null!==a.Fb){var b=a.Pb;if(0!==b.clientWidth&&0!==b.clientHeight){var c=a.Wk?a.Gd:0,d=a.Ij?a.Gd:0,e=a.jd;a.jd=a.computePixelRatio();a.jd!==e&&(a.gr=!0,a.Ce());if(b.clientWidth!==a.Jb+c||b.clientHeight!==a.Ob+d)a.hm=!0,a.ve=!0,b=a.Sb,null!==b&&b.nx&&a.xl===mh&&b.I(),a.Vd||a.Ce()}}} +function Ak(a){var b=new wg;b.name="Background";a.ft(b);b=new wg;b.name="";a.ft(b);b=new wg;b.name="Foreground";a.ft(b);b=new wg;b.name="Adornment";b.Nc=!0;a.ft(b);b=new wg;b.name="Tool";b.Nc=!0;b.IE=!0;a.ft(b);b=new wg;b.name="Grid";b.xf=!1;b.jg=!1;b.Nc=!0;a.NG(b,a.Gl("Background"))} +function Hk(a){a.td=new I(Ik);a.td.name="GRID";var b=new X;b.Hb="LineH";b.stroke="lightgray";b.ub=.5;b.interval=1;a.td.add(b);b=new X;b.Hb="LineH";b.stroke="gray";b.ub=.5;b.interval=5;a.td.add(b);b=new X;b.Hb="LineH";b.stroke="gray";b.ub=1;b.interval=10;a.td.add(b);b=new X;b.Hb="LineV";b.stroke="lightgray";b.ub=.5;b.interval=1;a.td.add(b);b=new X;b.Hb="LineV";b.stroke="gray";b.ub=.5;b.interval=5;a.td.add(b);b=new X;b.Hb="LineV";b.stroke="gray";b.ub=1;b.interval=10;a.td.add(b);b=new D;b.add(a.td); +b.If="Grid";b.Dn=0;b.kx=!1;b.HE=!1;b.jg=!1;b.tx="GRID";a.add(b);a.mb.remove(b);a.td.visible=!1}B.prototype.wG=function(){this.Z.isEnabled?this.Z.rH(this):Jk(this.Z)};B.prototype.JC=function(a){this.Z.isEnabled?(this.Z.jz=!0,this.Z.lz=a.target.scrollTop,this.Z.kz=a.target.scrollLeft):Jk(this.Z)}; +B.prototype.diagramScroll=B.prototype.rH=function(a){if(this.jz&&null!==this.Fb){this.gw=!0;var b=this.ad,c=this.xb,d=b.width,e=c.width,g=b.height,h=c.height,k=b.right,l=c.right,m=b.bottom,n=c.bottom,p=b.x,q=c.x,b=b.y,c=c.y,r=this.scale,s;s=a.scrollLeft;if(this.mr)switch(this.iz){case "negative":s=s+a.scrollWidth-a.clientWidth;break;case "reverse":s=a.scrollWidth-s-a.clientWidth}var t=s;e<d||h<g?(s=z.Tb(this.position.x,this.position.y),this.ye&&this.kz!==t&&(s.x=t/r+p,this.kz=t),this.ze&&this.lz!== +a.scrollTop&&(s.y=a.scrollTop/r+b,this.lz=a.scrollTop),this.position=s,z.A(s),this.hm=this.gw=!1):(s=z.O(),a.zG&&this.ye&&(p<q&&(this.position=s.n(t+p,this.position.y)),k>l&&(this.position=s.n(-(this.kw.scrollWidth-this.Jb)+t-this.Jb/r+k,this.position.y))),a.AG&&this.ze&&(b<c&&(this.position=s.n(this.position.x,a.scrollTop+b)),m>n&&(this.position=s.n(this.position.x,-(this.kw.scrollHeight-this.Ob)+a.scrollTop-this.Ob/r+m))),z.A(s),Kk(this),this.hm=this.gw=!1,b=this.ad,c=this.xb,k=b.right,l=c.right, +m=b.bottom,n=c.bottom,p=b.x,q=c.x,b=b.y,c=c.y,e>=d&&p>=q&&k<=l&&(this.xs.style.width="1px"),h>=g&&b>=c&&m<=n&&(this.xs.style.height="1px"))}};B.prototype.computeBounds=B.prototype.sh=function(){0<this.rg.count&&Lk(this);return Mk(this)}; +function Mk(a){if(a.tE.F()){var b=a.tE.copy();b.Cw(a.padding);return b}for(var c=!0,d=a.Yb.o,e=d.length,g=0;g<e;g++){var h=d[g];if(h.visible&&(!h.Nc||h.IE))for(var h=h.mb.o,k=h.length,l=0;l<k;l++){var m=h[l];m.kx&&m.isVisible()&&(m=m.W,m.F()&&(c?(c=!1,b=m.copy()):b.ri(m)))}}c&&(b=new w(0,0,0,0));b.Cw(a.padding);return b} +B.prototype.computePartsBounds=function(a){var b=null;for(a=a.i;a.next();){var c=a.value;c instanceof G||(c.Bf(),null===b?b=c.W.copy():b.ri(c.W))}return null===b?new w(NaN,NaN,0,0):b}; +function Nk(a,b){if((b||a.fh)&&!a.Vc&&null!==a.Fb&&!a.Ua.nf&&a.ad.F()){a.Vc=!0;var c=a.cm;b&&a.Yk!==mh&&(c=a.Yk);var d=c!==mh?Ok(a,c):a.scale,c=a.xb.copy(),e=a.Jb/d,g=a.Ob/d,h=null,k=a.Ua;k.wc&&(h=a.sb.copy());a.position.Wa();var l=a.On;b&&!l.cd()&&a.mo.cd()&&(l=a.mo);Pk(a,a.sb,a.ad,e,g,l,b);a.position.freeze();null!==h&&hk(k,h,a.sb);a.scale=d;a.Vc=!1;d=a.xb;d.Mc(c)||a.fu(c,d)}} +function Ok(a,b){var c=a.wb.Sw;if(null===a.Fb)return c;a.Jj&&Qk(a,a.sh());var d=a.ad;if(!d.F())return c;var e=d.width,d=d.height,g=a.Jb,h=a.Ob,k=g/e,l=h/d;return b===Rk?(e=Math.min(l,k),e>c&&(e=c),e<a.Ah&&(e=a.Ah),e>a.zh&&(e=a.zh),e):b===Sk?(e=l>k?(h-a.Gd)/d:(g-a.Gd)/e,e>c&&(e=c),e<a.Ah&&(e=a.Ah),e>a.zh&&(e=a.zh),e):a.scale}B.prototype.zoomToFit=B.prototype.zoomToFit=function(){this.scale=Ok(this,Rk)}; +B.prototype.zoomToRect=function(a,b){void 0===b&&(b=Rk);var c=a.width,d=a.height;if(!(0===c||0===d||isNaN(c)&&isNaN(d))){var e=1;if(b===Rk||b===Sk)if(isNaN(c))e=this.xb.height*this.scale/d;else if(isNaN(d))e=this.xb.width*this.scale/c;else var e=this.Jb,g=this.Ob,e=b===Sk?g/d>e/c?(g-(this.Ij?this.Gd:0))/d:(e-(this.Wk?this.Gd:0))/c:Math.min(g/d,e/c);this.scale=e;this.position=new N(a.x,a.y)}};z.defineProperty(B,{fA:null},function(){return this.Vc},function(a){this.Vc=a}); +B.prototype.alignDocument=function(a,b){this.Jj&&Qk(this,this.sh());var c=this.ad,d=this.xb;this.position=new N(c.x+(a.x*c.width+a.offsetX)-(b.x*d.width-b.offsetX),c.y+(a.y*c.height+a.offsetY)-(b.y*d.height-b.offsetY))}; +function Pk(a,b,c,d,e,g,h){var k=b.x,l=b.y;if(h||a.LA===sk)g.cd()&&(d>c.width&&(k=c.x+(g.x*c.width+g.offsetX)-(g.x*d-g.offsetX)),e>c.height&&(l=c.y+(g.y*c.height+g.offsetY)-(g.y*e-g.offsetY))),g=a.AF,h=d-c.width,d<c.width+g.left+g.right?(k=Math.min(k+d/2,c.right+Math.max(h,g.right)-d/2),k=Math.max(k,c.left-Math.max(h,g.left)+d/2),k-=d/2):k>c.left?k=c.left:k<c.right-d&&(k=c.right-d),d=e-c.height,e<c.height+g.top+g.bottom?(l=Math.min(l+e/2,c.bottom+Math.max(d,g.bottom)-e/2),l=Math.max(l,c.top-Math.max(d, +g.top)+e/2),l-=e/2):l>c.top?l=c.top:l<c.bottom-e&&(l=c.bottom-e);b.x=isFinite(k)?k:-a.padding.left;b.y=isFinite(l)?l:-a.padding.top;null!==a.iF&&(a=a.iF(a,b),b.x=a.x,b.y=a.y)}B.prototype.findPartAt=B.prototype.Bt=function(a,b){var c=b?ii(this,a,function(a){return a.ca},function(a){return a.canSelect()}):ii(this,a,function(a){return a.ca});return c instanceof D?c:null}; +B.prototype.findObjectAt=B.prototype.pe=function(a,b,c){void 0===b&&(b=null);void 0===c&&(c=null);Lk(this);for(var d=this.Yb.kn;d.next();){var e=d.value;if(e.visible&&(e=e.pe(a,b,c),null!==e))return e}return null};function ii(a,b,c,d){void 0===c&&(c=null);void 0===d&&(d=null);Lk(a);for(a=a.Yb.kn;a.next();){var e=a.value;if(e.visible&&!e.Nc&&(e=e.pe(b,c,d),null!==e))return e}return null} +B.prototype.findObjectsAt=B.prototype.lp=function(a,b,c,d){void 0===b&&(b=null);void 0===c&&(c=null);d instanceof J||d instanceof K||(d=new K(O));Lk(this);for(var e=this.Yb.kn;e.next();){var g=e.value;g.visible&&g.lp(a,b,c,d)}return d};B.prototype.findObjectsIn=B.prototype.pk=function(a,b,c,d,e){void 0===b&&(b=null);void 0===c&&(c=null);void 0===d&&(d=!1);e instanceof J||e instanceof K||(e=new K(O));Lk(this);for(var g=this.Yb.kn;g.next();){var h=g.value;h.visible&&h.pk(a,b,c,d,e)}return e}; +B.prototype.Vz=function(a,b,c,d,e,g){var h=new K(O);Lk(this);for(var k=this.Yb.kn;k.next();){var l=k.value;l.visible&&l.Vz(a,b,c,d,h,e,g)}return h};B.prototype.findObjectsNear=B.prototype.cn=function(a,b,c,d,e,g){void 0===c&&(c=null);void 0===d&&(d=null);void 0===e&&(e=!0);if(!1!==e&&!0!==e){if(e instanceof J||e instanceof K)g=e;e=!0}g instanceof J||g instanceof K||(g=new K(O));Lk(this);for(var h=this.Yb.kn;h.next();){var k=h.value;k.visible&&k.cn(a,b,c,d,e,g)}return g}; +B.prototype.acceptEvent=function(a){var b=this.Zc;this.Zc=this.Qb;this.Qb=b;Tk(this,this,a,b,a instanceof MouseEvent);return b}; +function Tk(a,b,c,d,e){d.h=b;d.event=c;e?Uk(a,c,d):(d.ue=b.Qb.ue,d.ga=b.Qb.ga);a=0;c.ctrlKey&&(a+=1);c.altKey&&(a+=2);c.shiftKey&&(a+=4);c.metaKey&&(a+=8);d.xd=a;d.button=c.button;c.buttons&&(d.buttons=c.buttons);z.sk&&0===c.button&&c.ctrlKey&&(d.button=2);d.Fl=!1;d.up=!1;d.Pe=1;d.Dl=0;d.Gc=!1;d.bubbles=!1;d.timestamp=Date.now();d.Qt=!1;d.Tg=c.target.Z?c.target.Z:null;d.Ge=null} +function Vk(a,b,c,d,e){d.h=a;Uk(a,c,d);d.xd=0;d.button=0;d.buttons=1;d.Fl=!0;d.up=!1;d.Pe=1;d.Dl=0;d.Gc=!1;d.bubbles=!0;d.event=b;d.timestamp=Date.now();d.Qt=e;d.Tg=b.target.Z?b.target.Z:null;d.Ge=null;a.Fi=d.copy();Lh=null} +function Wk(a,b,c,d,e){var g=null;d.h=a;null!==c?((g=window.document.elementFromPoint(c.clientX,c.clientY))&&g.Z?g=g.Z:(c=b.changedTouches[0],g=a),d.Tg=g,Uk(a,c,d)):null!==a.Zc?(d.ga=a.Zc.ga,d.ue=a.Zc.ue,d.Tg=a.Zc.Tg):null!==a.Fi&&(d.ga=a.Fi.ga,d.ue=a.Fi.ue,d.Tg=a.Fi.Tg);d.xd=0;d.button=0;d.buttons=1;d.Fl=!1;d.up=!1;d.Pe=1;d.Dl=0;d.Gc=!1;d.bubbles=!1;d.event=b;d.timestamp=Date.now();d.Qt=e;d.Ge=null} +function ha(a,b,c){if(b.bubbles)return u&&u.DE&&z.trace("NOT handled "+c.type+" "+b.toString()),!0;u&&u.DE&&z.trace("handled "+c.type+" "+a.cb.name+" "+b.toString());void 0!==c.stopPropagation&&c.stopPropagation();(void 0===c.touches||2>c.touches.length)&&c.preventDefault();c.cancelBubble=!0;return!1} +B.prototype.nI=function(a){if(!this.Z.isEnabled)return!1;var b=this.Z.Qb;Tk(this.Z,this.Z,a,b,!1);b.key=String.fromCharCode(a.which);b.Fl=!0;switch(a.which){case 8:b.key="Backspace";break;case 33:b.key="PageUp";break;case 34:b.key="PageDown";break;case 35:b.key="End";break;case 36:b.key="Home";break;case 37:b.key="Left";break;case 38:b.key="Up";break;case 39:b.key="Right";break;case 40:b.key="Down";break;case 45:b.key="Insert";break;case 46:b.key="Del";break;case 48:b.key="0";break;case 187:case 61:case 107:b.key= +"Add";break;case 189:case 173:case 109:b.key="Subtract";break;case 27:b.key="Esc"}this.Z.doKeyDown();return 187!==a.which&&189!==a.which&&48!==a.which&&107!==a.which&&109!==a.which&&61!==a.which&&173!==a.which||!0!==a.ctrlKey?ha(this.Z,b,a):(a.cancelBubble=!0,a.preventDefault(),a.stopPropagation(),!1)}; +B.prototype.oI=function(a){if(!this.Z.isEnabled)return!1;var b=this.Z.Qb;Tk(this.Z,this.Z,a,b,!1);b.key=String.fromCharCode(a.which);b.up=!0;switch(a.which){case 8:b.key="Backspace";break;case 33:b.key="PageUp";break;case 34:b.key="PageDown";break;case 35:b.key="End";break;case 36:b.key="Home";break;case 37:b.key="Left";break;case 38:b.key="Up";break;case 39:b.key="Right";break;case 40:b.key="Down";break;case 45:b.key="Insert";break;case 46:b.key="Del";break;case 93:a.preventDefault()}this.Z.doKeyUp(); +return ha(this.Z,b,a)};B.prototype.ko=function(a){var b=this.Fb;if(null===b)return new N(0,0);var c=this.Jb,d=this.Ob,b=b.getBoundingClientRect(),c=a.clientX-c/b.width*b.left;a=a.clientY-d/b.height*b.top;return null!==this.Hd?(a=new N(c,a),tb(a,this.Hd),a):new N(c,a)}; +function Uk(a,b,c){var d=a.Fb,e=a.Jb,g=a.Ob,h=0,k=0;null!==d&&(d=d.getBoundingClientRect(),h=b.clientX-e/d.width*d.left,k=b.clientY-g/d.height*d.top);c.ue.n(h,k);null!==a.Hd?(b=z.Tb(h,k),a.Hd.li(b),c.ga.assign(b),z.A(b)):c.ga.n(h,k)}B.prototype.invalidateDocumentBounds=B.prototype.yc=function(){this.Jj||(this.Jj=!0,this.Ce(!0))};function ek(a){a.Vd||Lk(a);a.Jj&&Qk(a,a.sh())}B.prototype.redraw=B.prototype.Sp=function(){this.Vc||this.Vd||(this.ta(),Xk(this),Kk(this),this.yc(),this.cg())}; +B.prototype.isUpdateRequested=function(){return this.Wf};B.prototype.delayInitialization=function(a){void 0===a&&(a=null);var b=this.Ua,c=b.isEnabled;b.pi();b.isEnabled=!1;pi(this);this.fh=!1;b.isEnabled=c;null!==a&&z.setTimeout(a,1)};B.prototype.requestUpdate=B.prototype.Ce=function(a){void 0===a&&(a=!1);if(!0!==this.Wf&&!(this.Vc||!1===a&&this.Vd)){this.Wf=!0;var b=this;requestAnimationFrame(function(){b.Wf&&b.cg()})}}; +B.prototype.maybeUpdate=B.prototype.cg=function(){if(!this.ho||this.Wf)this.ho&&(this.ho=!1),pi(this)};function Yk(a,b){a.Ua.nf||a.Vc||!a.hm||Jk(a)||(b&&Lk(a),Nk(a,!1))} +function pi(a){if(!a.Vd&&(a.Wf=!1,null!==a.Pb)){a.Vd=!0;var b=a.Ua,c=a.SC;if(!b.so&&0!==c.length){for(var d=c.o,e=d.length,g=0;g<e;g++){var h=d[g];$k(h,!1);h.Q()}c.clear()}c=a.jC;0<c.count&&(c.each(function(a){a.cB()}),c.clear());d=c=!1;b.nf&&(d=!0,c=a.Bb,a.Bb=!0);b.wc||Vj(a);Yk(a,!1);null!==a.td&&(a.td.visible&&!a.ov&&(hl(a),a.ov=!0),!a.td.visible&&a.ov&&(a.ov=!1));Lk(a);e=!1;if(!a.fh||a.Qu)a.fh?il(a,!a.gv):(a.Wb("Initial Layout"),!1===b.isEnabled&&b.pi(),il(a,!1)),e=!0;a.gv=!1;Lk(a);a.mz||b.nf|| +ek(a);Yk(a,!0);e&&(a.fh||jl(a),a.Ja("LayoutCompleted"));Lk(a);e&&!a.fh&&(a.fh=!0,a.Jd("Initial Layout"),a.Bb||a.pa.clear(),z.setTimeout(function(){a.ni=!1},1));kl(a);Uj(b);a.ff();d&&(a.Bb=c);a.Vd=!1}}z.w(B,{jn:null},function(){return this.fh}); +function jl(a){var b=a.Yb.o;a.Jf(b,b.length,a);a.Yk!==mh?a.scale=Ok(a,a.Yk):a.cm!==mh?a.scale=Ok(a,a.cm):(b=a.ZH,isFinite(b)&&0<b&&(a.scale=b));b=a.YH;if(b.F())a.position=b;else{b=z.O();b.ru(a.ad,a.XH);var c=a.xb,c=z.zk(0,0,c.width,c.height),d=z.O();d.ru(c,a.$H);d.n(b.x-d.x,b.y-d.y);a.position=d;z.dc(c);z.A(d);z.A(b);Xk(a);Yk(a,!0);Nk(a,!0)}a.Ja("InitialLayoutCompleted");hl(a)} +function Lk(a){if((a.Vd||!a.Ua.nf)&&0!==a.rg.count)for(var b=0;23>b;b++){var c=a.rg.i;if(null===c||0===a.rg.count)break;a.rg=new K(O);a.cB(c,a.rg);u&&22===b&&z.trace("failure to validate parts")}} +B.prototype.cB=function(a,b){for(a.reset();a.next();){var c=a.value;!c.be()||c instanceof F||!c.isVisible()||(c.Ql()?(uj(c,Infinity,Infinity),c.Lc()):b.add(c))}for(a.reset();a.next();)c=a.value,c instanceof F&&c.isVisible()&&ml(this,c);for(a.reset();a.next();)c=a.value,c instanceof G&&c.isVisible()&&(c.Ql()?(uj(c,Infinity,Infinity),c.Lc()):b.add(c));for(a.reset();a.next();)c=a.value,c instanceof da&&c.isVisible()&&(c.Ql()?(uj(c,Infinity,Infinity),c.Lc()):b.add(c))}; +function ml(a,b){for(var c=z.rb(),d=z.rb(),e=b.Hc;e.next();){var g=e.value;g.isVisible()&&(g instanceof F?(nl(g)||ol(g)||pl(g))&&ml(a,g):g instanceof G?g.Y===b||g.da===b?d.push(g):c.push(g):(uj(g,Infinity,Infinity),g.Lc()))}for(var e=c.length,h=0;h<e;h++)g=c[h],uj(g,Infinity,Infinity),g.Lc();z.xa(c);uj(b,Infinity,Infinity);b.Lc();e=d.length;for(h=0;h<e;h++)g=d[h],uj(g,Infinity,Infinity),g.Lc();z.xa(d)}B.prototype.Jf=function(a,b,c,d){var e=this.Ua;if(this.Zk||e.nf)for(e=0;e<b;e++)a[e].Jf(c,d)}; +B.prototype.ff=function(a,b){void 0===a&&(a=this.gd);void 0===b&&(b=null);null===this.Pb&&z.k("No div specified");var c=this.Fb;null===c&&z.k("No canvas specified");var d=this.Ua;if(!d.wc&&(ql(this),"0"!==this.Pb.style.opacity)){var e=a!==this.gd,g=this.Yb.o,h=g.length,k=this;this.Jf(g,h,k);if(e)ca(a,!0),Kk(this);else if(!this.ve&&null===b&&!d.Kj)return;var h=this.sb,l=this.bc,m=Math.round(h.x*l)/l,n=Math.round(h.y*l)/l,d=this.Hd;d.reset();1!==l&&d.scale(l);0===h.x&&0===h.y||d.translate(-m,-n);l= +this.jd;z.hn?(c.width=c.width,ca(a,!0),a.scale(l,l)):(a.setTransform(1,0,0,1,0,0),a.scale(l,l),a.clearRect(0,0,this.Jb,this.Ob));a.setTransform(1,0,0,1,0,0);a.scale(l,l);a.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy);u&&u.cj&&u.kE(this,a);c=null!==b?function(c){var d=a,e=b;if(c.visible&&0!==c.Xc){var g=c.mb.o,h=g.length;if(0!==h){1!==c.Xc&&(d.globalAlpha=c.Xc);c=c.Wv;c.length=0;for(var l=k.scale,m=0;m<h;m++){var n=g[m];if(jk(n)&&!e.contains(n)){if(n instanceof G){var A=n;A.rc&&c.push(A);if(!1===A.Dg)continue}A= +n.W;1<A.width*l||1<A.height*l?n.ff(d,k):lk(n,d)}}d.globalAlpha=1}}}:function(b){b.ff(a,k)};rl(this,a);h=g.length;for(m=0;m<h;m++)a.setTransform(1,0,0,1,0,0),a.scale(l,l),a.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy),c(g[m]);this.Xk?this.Xk.Zl(this)&&this.Ey():this.ko=function(){return new N(0,0)};u&&(u.Rz||u.cj)&&u.Qz(a,this,d);e?(ca(this.gd,!0),Kk(this)):this.ve=this.Zk=!1}}; +function sl(a,b,c,d,e){null===a.Pb&&z.k("No div specified");var g=a.Fb;null===g&&z.k("No canvas specified");if(!a.Ua.wc){var h=a.gd;if(a.ve){ql(a);var k=a.jd;z.hn?(g.width=g.width,ca(h,!0)):(h.setTransform(1,0,0,1,0,0),h.clearRect(0,0,a.Jb*k,a.Ob*k));h.Jt=!1;h.drawImage(a.Dy.Kd,0<d?0:Math.round(-d),0<e?0:Math.round(-e));e=a.sb;var g=a.bc,l=Math.round(e.x*g)/g,m=Math.round(e.y*g)/g;d=a.Hd;d.reset();1!==g&&d.scale(g);0===e.x&&0===e.y||d.translate(-l,-m);h.save();h.beginPath();e=c.length;for(g=0;g<e;g++)l= +c[g],0!==l.width&&0!==l.height&&h.rect(Math.floor(l.x),Math.floor(l.y),Math.ceil(l.width),Math.ceil(l.height));h.clip();h.setTransform(1,0,0,1,0,0);h.scale(k,k);h.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy);u&&u.cj&&u.kE(a,h);c=a.Yb.o;e=c.length;a.Jf(c,e,a);rl(a,h);for(g=0;g<e;g++)mk(c[g],h,a,b);h.restore();ca(h,!0);u&&(u.Rz||u.cj)&&u.Qz(h,a,d);a.Xk?a.Xk.Zl(a)&&a.Ey():a.ko=function(){return new N(0,0)};a.Zk=!1;a.ve=!1;a.GA()}}} +function tl(a,b,c,d,e,g,h,k,l,m){null===a.Pb&&z.k("No div specified");null===a.Fb&&z.k("No canvas specified");void 0===h&&(h=null);void 0===k&&(k=null);void 0===l&&(l=!1);void 0===m&&(m=!1);ql(a);ca(a.gd,!0);Kk(a);a.Ty=!0;var n=new w(g.x,g.y,d.width/e,d.height/e),p=n.copy();p.Cw(c);hl(a,p);Lk(a);var p=a.Yb.o,q=p.length;a.Jf(p,q,a,n);n=a.jd;b.setTransform(1,0,0,1,0,0);b.scale(n,n);b.clearRect(0,0,d.width,d.height);null!==k&&""!==k&&(b.fillStyle=k,b.fillRect(0,0,d.width,d.height));d=z.Hh();d.reset(); +d.translate(c.left,c.top);d.scale(e);0===g.x&&0===g.y||d.translate(-g.x,-g.y);b.setTransform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy);z.jf(d);rl(a,b);if(null!==h){var r=new K(O);c=h.i;for(c.reset();c.next();)e=c.value,!1===m&&"Grid"===e.layer.name||null===e||r.add(e);c=function(c){var d=l;if(c.visible&&0!==c.Xc&&(void 0===d&&(d=!0),d||!c.Nc)){var d=c.mb.o,e=d.length;if(0!==e){1!==c.Xc&&(b.globalAlpha=c.Xc);c=c.Wv;c.length=0;for(var g=a.scale,h=0;h<e;h++){var k=d[h];if(jk(k)&&r.contains(k)){if(k instanceof +G){var m=k;m.rc&&c.push(m);if(!1===m.Dg)continue}m=k.W;1<m.width*g||1<m.height*g?k.ff(b,a):lk(k,b)}}b.globalAlpha=1}}}}else if(!l&&m){var s=a.tp.ca,t=s.layer;c=function(c){c===t?s.ff(b,a):c.ff(b,a,l,m)}}else c=function(c){c.ff(b,a,l,m)};for(e=0;e<q;e++)c(p[e]);a.Ty=!1;a.Xk?a.Xk.Zl(a)&&a.Ey():a.ko=function(){return new N(0,0)};ca(a.gd,!0);Kk(a);a.Jf(p,q,a);hl(a)}B.prototype.getRenderingHint=B.prototype.ij=function(a){return this.Yj[a]}; +B.prototype.setRenderingHint=B.prototype.jJ=function(a,b){this.Yj[a]=b;this.Sp()};B.prototype.resetRenderingHints=B.prototype.qF=function(){this.Yj=new ma;this.Yj.drawShadows=!0;this.Yj.textGreeking=!0;this.Yj.viewportOptimizations=z.OE?!1:!0;this.Yj.temporaryPixelRatio=!0;this.Yj.pictureRatioOptimization=!0};function rl(a,b){var c=a.Yj;if(null!==c){if(void 0!==c.imageSmoothingEnabled){var d=!!c.imageSmoothingEnabled;b.Jt=d;b.YK=d}c=c.defaultFont;void 0!==c&&null!==c&&(b.font=c)}} +B.prototype.getInputOption=B.prototype.rp=function(a){return this.po[a]};B.prototype.setInputOption=function(a,b){this.po[a]=b};B.prototype.resetInputOptions=B.prototype.pF=function(){this.po=new ma;this.po.extraTouchArea=10;this.po.extraTouchThreshold=10;this.po.hasGestureZoom=!0};B.prototype.setProperties=function(a){z.qu(this,a)};function kl(a){if(0===a.pa.Ih&&0!==a.Sk.count){for(;0<a.Sk.count;){var b=a.Sk;a.Sk=new na(G,w);for(b=b.i;b.next();){var c=b.key;Ri(c,b.value);c.qe()}}a.ta()}} +B.prototype.ta=function(a){void 0===a&&(a=null);if(null===a)this.ve=!0,this.Ce();else{var b=this.xb;null!==a&&a.F()&&b.Jg(a)&&(this.ve=!0,this.Ce())}for(b=this.Xv.i;b.next();)b.value.ta(a)}; +B.prototype.GE=function(a,b){if(!0!==this.ve){this.ve=!0;var c=!0===this.ij("temporaryPixelRatio");if(!0===this.ij("viewportOptimizations")&&this.LA!==ul&&this.AF.Ww(0,0,0,0)&&b.width===a.width&&b.height===a.height){var d=this.scale,e=z.lg(),g=Math.max(a.x,b.x),h=Math.max(a.y,b.y),k=Math.min(a.x+a.width,b.x+b.width),l=Math.min(a.y+a.height,b.y+b.height);e.x=g;e.y=h;e.width=Math.max(0,k-g)*d;e.height=Math.max(0,l-h)*d;if(0<e.width&&0<e.height){if(!this.Vd&&(this.Wf=!1,null!==this.Pb)){this.Vd=!0;kl(this); +this.ad.F()||Qk(this,this.sh());var m=this.Fb;if(null!==m){var n=this.jd,h=this.Jb*n,k=this.Ob*n,g=this.scale*n,d=Math.round(Math.round(b.x*g)-Math.round(a.x*g)),g=Math.round(Math.round(b.y*g)-Math.round(a.y*g)),l=this.Dy,p=this.aC;l.width!==h&&(l.width=h);l.height!==k&&(l.height=k);p.clearRect(0,0,h,k);var l=190*this.jd,q=70*this.jd,r=Math.max(d,0),s=Math.max(g,0),t=Math.floor(h-r),v=Math.floor(k-s);p.Jt=!1;p.drawImage(m.Kd,r,s,t,v,0,0,t,v);this.Xk.Zl(this)&&p.clearRect(0,0,l,q);var m=z.rb(),p=z.rb(), +v=Math.abs(d),t=Math.abs(g),x=0===r?0:h-v,r=z.Tb(x,0),v=z.Tb(v+x,k);p.push(new w(Math.min(r.x,v.x),Math.min(r.y,v.y),Math.abs(r.x-v.x),Math.abs(r.y-v.y)));var y=this.Hd;y.reset();y.scale(n,n);1!==this.bc&&y.scale(this.bc);n=this.sb;(0!==n.x||0!==n.y)&&isFinite(n.x)&&isFinite(n.y)&&y.translate(-n.x,-n.y);tb(r,y);tb(v,y);m.push(new w(Math.min(r.x,v.x),Math.min(r.y,v.y),Math.abs(r.x-v.x),Math.abs(r.y-v.y)));x=0===s?0:k-t;r.n(0,x);v.n(h,t+x);p.push(new w(Math.min(r.x,v.x),Math.min(r.y,v.y),Math.abs(r.x- +v.x),Math.abs(r.y-v.y)));tb(r,y);tb(v,y);m.push(new w(Math.min(r.x,v.x),Math.min(r.y,v.y),Math.abs(r.x-v.x),Math.abs(r.y-v.y)));this.Xk.Zl(this)&&(h=0<d?0:-d,k=0<g?0:-g,r.n(h,k),v.n(l+h,q+k),p.push(new w(Math.min(r.x,v.x),Math.min(r.y,v.y),Math.abs(r.x-v.x),Math.abs(r.y-v.y))),tb(r,y),tb(v,y),m.push(new w(Math.min(r.x,v.x),Math.min(r.y,v.y),Math.abs(r.x-v.x),Math.abs(r.y-v.y))));z.A(r);z.A(v);Yk(this,!1);sl(this,m,p,d,g);z.xa(m);z.xa(p);this.Vd=!1}}}else this.cg();z.dc(e);c&&(this.dk=1,this.cg(), +this.dk=null,this.GA())}else c?(this.dk=1,this.cg(),this.dk=null,this.GA()):this.cg()}};function Xk(a){!1===a.hm&&(a.hm=!0)}function Kk(a){!1===a.Zk&&(a.Zk=!0)}function ql(a){!1!==a.gr&&(a.gr=!1,vl(a,a.Jb,a.Ob))}function vl(a,b,c){var d=a.Fb,e=a.jd,g=b*e,e=c*e;if(d.width!==g||d.height!==e)d.width=g,d.height=e,d.style.width=b+"px",d.style.height=c+"px",a.ve=!0,ca(a.gd,!0)}function yh(a){var b=a.Jb,c=a.Ob;a=a.Fb.getBoundingClientRect();return z.Tb(b/a.width*a.left,c/a.height*a.top)} +function Jk(a){var b=a.Fb;if(null===b)return!0;var c=a.Pb,d=a.Jb,e=a.Ob,g=a.wD.copy();if(!g.F())return!0;var h=!1,k=a.Wk?a.Gd:0,l=a.Ij?a.Gd:0,m=c.clientWidth||d+k,c=c.clientHeight||e+l;if(m!==d+k||c!==e+l)a.Wk=!1,a.Ij=!1,l=k=0,a.Jb=m,a.Ob=c,h=a.gr=!0;a.hm=!1;var n=a.xb,p=a.ad,m=p.width,c=p.height,q=n.width,r=n.height,s=p.x,t=n.x,v=p.right,x=n.right+k,y=p.y,A=n.y,p=p.bottom,n=n.bottom+l,C="1px",L="1px",H=a.scale;a.LA===sk&&m<q+k&&c<r+l||(a.bA&&a.ye&&(C=1,s+1<t&&(C=Math.max((t-s)*H+a.Jb,C)),v>x+1&& +(C=Math.max((v-x)*H+a.Jb,C)),q+k+1<m&&(C=Math.max((m-q+k)*H+a.Jb,C)),C+="px"),a.cA&&a.ze&&(L=1,y+1<A&&(L=Math.max((A-y)*H+a.Ob,L)),p>n+1&&(L=Math.max((p-n)*H+a.Ob,L)),r+l+1<c&&(L=Math.max((c-r+l)*H+a.Ob,L)),L+="px"));k="1px"!==C;l="1px"!==L;k&&l||!k&&!l||(l&&(x-=a.Gd),k&&(n-=a.Gd),a.bA&&a.ye&&(C=1,s+1<t&&(C=Math.max((t-s)*H+a.Jb,C)),v>x+1&&(C=Math.max((v-x)*H+a.Jb,C)),q+1<m&&(C=Math.max((m-q)*H+a.Jb,C)),C+="px"),k="1px"!==C,l=k!==a.Ij?a.Ob-a.Gd:a.Ob,a.cA&&a.ze&&(L=1,y+1<A&&(L=Math.max((A-y)*H+l,L)), +p>n+1&&(L=Math.max((p-n)*H+l,L)),r+1<c&&(L=Math.max((c-r)*H+l,L)),L+="px"),l="1px"!==L);if(a.gw&&k===a.Ij&&l===a.Wk)return d===a.Jb&&e===a.Ob||a.cg(),!1;k!==a.Ij&&(a.Ob="1px"===C?a.Ob+a.Gd:Math.max(a.Ob-a.Gd,1),h=!0);a.Ij=k;a.xs.style.width=C;l!==a.Wk&&(a.Jb="1px"===L?a.Jb+a.Gd:Math.max(a.Jb-a.Gd,1),h=!0,a.mr&&(k=z.O(),l?(b.style.left=a.Gd+"px",a.position=k.n(a.sb.x+a.Gd/a.scale,a.sb.y)):(b.style.left="0px",a.position=k.n(a.sb.x-a.Gd/a.scale,a.sb.y)),z.A(k)));a.Wk=l;a.xs.style.height=L;b=a.kw;k=b.scrollLeft; +a.bA&&a.ye&&(q+1<m?k=(a.position.x-s)*H:s+1<t?k=b.scrollWidth-b.clientWidth:v>x+1&&(k=a.position.x*H));if(a.mr)switch(a.iz){case "negative":k=-(b.scrollWidth-k-b.clientWidth);break;case "reverse":k=b.scrollWidth-k-b.clientWidth}b.scrollLeft=k;a.cA&&a.ze&&(r+1<c?b.scrollTop=(a.position.y-y)*H:y+1<A?b.scrollTop=b.scrollHeight-b.clientHeight:p>n+1&&(b.scrollTop=a.position.y*H));h&&(a.gr=!0);m=a.Jb;c=a.Ob;b.style.width=m+(a.Wk?a.Gd:0)+"px";b.style.height=c+(a.Ij?a.Gd:0)+"px";a.jz=!1;return d!==m||e!== +c||a.Ua.wc?(n=a.xb,a.fu(g,n,h),!1):!0} +B.prototype.add=B.prototype.add=function(a){z.l(a,D,B,"add:part");var b=a.h;if(b!==this){null!==b&&z.k("Cannot add part "+a.toString()+" to "+this.toString()+". It is already a part of "+b.toString());this.lq&&(a.dl="Tool");var c=a.If,b=this.Gl(c);null===b&&(b=this.Gl(""));null===b&&z.k('Cannot add a Part when unable find a Layer named "'+c+'" and there is no default Layer');a.layer!==b&&(c=b.xp(99999999,a,a.h===this),0<=c&&this.Rc(Wf,"parts",b,null,a,null,c),b.Nc||this.yc(),a.I(wl),c=a.Ut,null!== +c&&c(a,null,b))}}; +B.prototype.xp=function(a){if(a instanceof E){if(this.Eo.add(a),a instanceof F){var b=a.Va;null===b?this.pl.add(a):b.vm.add(a);b=a.Sb;null!==b&&(b.h=this)}}else a instanceof G?this.yo.add(a):a instanceof da||this.mb.add(a);var c=this;xl(a,function(a){yl(c,a)});a.Lb&&a.Q();b=a.data;null!==b&&(a instanceof da||(a instanceof G?this.Rk.add(b,a):this.Ai.add(b,a)),xl(a,function(a){zl(c,a)}));!0!==ol(a)&&!0!==pl(a)||this.rg.add(a);Al(a,!0,this);Bl(a)?(a.W.F()&&this.ta(nk(a,a.W)),this.yc()):a.isVisible()&& +a.W.F()&&this.ta(nk(a,a.W));this.Ce()}; +B.prototype.Ve=function(a){a.pt();if(a instanceof E){if(this.Eo.remove(a),a instanceof F){var b=a.Va;null===b?this.pl.remove(a):b.vm.remove(a);b=a.Sb;null!==b&&(b.h=null)}}else a instanceof G?this.yo.remove(a):a instanceof da||this.mb.remove(a);var c=this;xl(a,function(a){Cl(c,a)});b=a.data;null!==b&&(a instanceof da||(a instanceof G?this.Rk.remove(b):this.Ai.remove(b)),xl(a,function(a){Dl(c,a)}));this.rg.remove(a);Bl(a)?(a.W.F()&&this.ta(nk(a,a.W)),this.yc()):a.isVisible()&&a.W.F()&&this.ta(nk(a, +a.W));this.Ce()};B.prototype.remove=B.prototype.remove=function(a){z.l(a,D,B,"remove:part");a.jb=!1;a.yh=!1;var b=a.layer;if(null!==b&&b.h===this){a.I(El);a.bn();var c=b.Ve(-1,a,!1);0<=c&&this.Rc(Xf,"parts",b,a,null,c,null);c=a.Ut;null!==c&&c(a,b,null)}};B.prototype.removeParts=B.prototype.IA=function(a,b){if(z.isArray(a))for(var c=z.ab(a),d=0;d<c;d++){var e=z.Ya(a,d);b&&!e.canDelete()||this.remove(e)}else for(e=new K(D),e.$c(a),c=e.i;c.next();)e=c.value,b&&!e.canDelete()||this.remove(e)}; +B.prototype.copyParts=B.prototype.gp=function(a,b,c){return this.wb.gp(a,b,c)};B.prototype.moveParts=B.prototype.moveParts=function(a,b,c){z.l(b,N,B,"moveParts:offset");var d=this.gb;if(null!==d){d=d.me;null===d&&(d=new lh,d.Sc(this));var e=new na(D,Object);if(null!==a)a=a.i;else{for(a=this.oi;a.next();)Oh(d,e,a.value,c);for(a=this.Mg;a.next();)Oh(d,e,a.value,c);a=this.links}for(;a.next();)Oh(d,e,a.value,c);d.moveParts(e,b,c)}}; +function Fl(a,b,c){z.l(b,wg,B,"addLayer:layer");null!==b.h&&b.h!==a&&z.k("Cannot share a Layer with another Diagram: "+b+" of "+b.h);null===c?null!==b.h&&z.k("Cannot add an existing Layer to this Diagram again: "+b):(z.l(c,wg,B,"addLayer:existingLayer"),c.h!==a&&z.k("Existing Layer must be in this Diagram: "+c+" not in "+c.h),b===c&&z.k("Cannot move a Layer before or after itself: "+b));if(b.h!==a){b=b.name;a=a.Yb;c=a.count;for(var d=0;d<c;d++)a.ea(d).name===b&&z.k("Cannot add Layer with the name '"+ +b+"'; a Layer with the same name is already present in this Diagram.")}}B.prototype.addLayer=B.prototype.ft=function(a){Fl(this,a,null);a.Sc(this);var b=this.Yb,c=b.count-1;if(!a.Nc)for(;0<=c&&b.ea(c).Nc;)c--;b.Ld(c+1,a);null!==this.ie&&this.Rc(Wf,"layers",this,null,a,null,c+1);this.ta();this.yc()}; +B.prototype.addLayerBefore=B.prototype.NG=function(a,b){Fl(this,a,b);a.Sc(this);var c=this.Yb,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.ie&&this.Rc(Xf,"layers",this,a,null,d,null));for(var e=c.count,g=0;g<e;g++)if(c.ea(g)===b){c.Ld(g,a);break}null!==this.ie&&this.Rc(Wf,"layers",this,null,a,null,g);this.ta();0>d&&this.yc()}; +B.prototype.addLayerAfter=function(a,b){Fl(this,a,b);a.Sc(this);var c=this.Yb,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.ie&&this.Rc(Xf,"layers",this,a,null,d,null));for(var e=c.count,g=0;g<e;g++)if(c.ea(g)===b){c.Ld(g+1,a);break}null!==this.ie&&this.Rc(Wf,"layers",this,null,a,null,g+1);this.ta();0>d&&this.yc()}; +B.prototype.removeLayer=function(a){z.l(a,wg,B,"removeLayer:layer");a.h!==this&&z.k("Cannot remove a Layer from another Diagram: "+a+" of "+a.h);if(""!==a.name){var b=this.Yb,c=b.indexOf(a);if(b.remove(a)){for(b=a.mb.copy().i;b.next();){var d=b.value,e=d.If;d.If=e!==a.name?e:""}null!==this.ie&&this.Rc(Xf,"layers",this,a,null,c,null);this.ta();this.yc()}}};B.prototype.findLayer=B.prototype.Gl=function(a){for(var b=this.ln;b.next();){var c=b.value;if(c.name===a)return c}return null}; +B.prototype.addModelChangedListener=B.prototype.PG=function(a){z.g(a,"function",B,"addModelChangedListener:listener");null===this.hh&&(this.hh=new J("function"));this.hh.add(a);this.ha.Qm(a)};B.prototype.removeModelChangedListener=function(a){z.g(a,"function",B,"removeModelChangedListener:listener");null!==this.hh&&(this.hh.remove(a),0===this.hh.count&&(this.hh=null));this.ha.iu(a)}; +B.prototype.addChangedListener=B.prototype.Qm=function(a){z.g(a,"function",B,"addChangedListener:listener");null===this.ui&&(this.ui=new J("function"));this.ui.add(a)};B.prototype.removeChangedListener=B.prototype.iu=function(a){z.g(a,"function",B,"removeChangedListener:listener");null!==this.ui&&(this.ui.remove(a),0===this.ui.count&&(this.ui=null))}; +B.prototype.Kw=function(a){this.Bb||this.pa.CE(a);a.Dc!==Vf&&(this.ni=!0);if(null!==this.ui){var b=this.ui,c=b.length;if(1===c)b=b.ea(0),b(a);else if(0!==c)for(var d=b.jc(),e=0;e<c;e++)b=d[e],b(a)}};B.prototype.raiseChangedEvent=B.prototype.Rc=function(a,b,c,d,e,g,h){void 0===g&&(g=null);void 0===h&&(h=null);var k=new Tf;k.h=this;k.Dc=a;k.propertyName=b;k.object=c;k.oldValue=d;k.Ng=g;k.newValue=e;k.Lg=h;this.Kw(k)}; +B.prototype.raiseChanged=B.prototype.j=function(a,b,c,d,e){this.Rc(Uf,a,this,b,c,d,e)};z.w(B,{Ua:"animationManager"},function(){return this.rB});z.w(B,{pa:"undoManager"},function(){return this.ie.pa});z.defineProperty(B,{Bb:"skipsUndoManager"},function(){return this.Wi},function(a){z.g(a,"boolean",B,"skipsUndoManager");this.Wi=a;this.ie.Wi=a});z.defineProperty(B,{Oz:"delaysLayout"},function(){return this.zy},function(a){this.zy=a}); +B.prototype.Um=function(a,b){if(null!==a&&a.h===this){var c=this.Ee;try{this.Ee=!0;var d=a.Dc,e;if(d===Uf){var g=a.object,h=a.propertyName,k=a.na(b);z.Ra(g,h,k);if(g instanceof O){var l,m=g.ca;null!==m&&m.ae()}this.ni=!0}else if(d===Wf){var n=a.object,p=a.Lg,g=a.newValue;if(n instanceof I)if("number"===typeof p&&g instanceof O){l=g;var q=n;b?q.Ve(p):q.Ld(p,l);m=n.ca;null!==m&&m.ae()}else{if("number"===typeof p&&g instanceof Ig){var r=g,q=n;b?r.re?q.oF(p):q.kF(p):(e=r.re?q.$d(r.index):q.Zd(r.index), +e.tt(r))}}else if(n instanceof wg){var s=!0===a.Ng;if("number"===typeof p&&g instanceof D){var m=g,t=n;b?(m.ae(),t.Ve(s?p:-1,m,s)):t.xp(p,m,s)}}else if(n instanceof B){if("number"===typeof p&&g instanceof wg){var v=g;b?this.Yb.dd(p):(d=v,d.Sc(this),this.Yb.Ld(p,d))}}else z.k("unknown ChangedEvent.Insert object: "+a.toString());this.ni=!0}else d===Xf?(n=a.object,p=a.Ng,g=a.oldValue,n instanceof I?"number"===typeof p&&g instanceof O?(q=n,b?q.Ld(p,g):q.Ve(p)):"number"===typeof p&&g instanceof Ig&&(r= +g,q=n,b?(e=r.re?q.$d(r.index):q.Zd(r.index),e.tt(r)):r.re?q.oF(p):q.kF(p)):n instanceof wg?(s=!0===a.Lg,"number"===typeof p&&g instanceof D&&(m=g,t=n,b?t.xp(p,m,s):(m.ae(),t.Ve(s?p:-1,m,s)))):n instanceof B?"number"===typeof p&&g instanceof wg&&(v=g,b?(d=v,d.Sc(this),this.Yb.Ld(p,d)):this.Yb.dd(p)):z.k("unknown ChangedEvent.Remove object: "+a.toString()),this.ni=!0):d!==Vf&&z.k("unknown ChangedEvent: "+a.toString())}finally{this.Ee=c}}};B.prototype.startTransaction=B.prototype.Wb=function(a){return this.pa.Wb(a)}; +B.prototype.commitTransaction=B.prototype.Jd=function(a){return this.pa.Jd(a)};B.prototype.rollbackTransaction=B.prototype.Vp=function(){return this.pa.Vp()};B.prototype.updateAllTargetBindings=B.prototype.dG=function(a){void 0===a&&(a="");for(var b=this.oi;b.next();)b.value.Mb(a);for(b=this.Mg;b.next();)b.value.Mb(a);for(b=this.links;b.next();)b.value.Mb(a)}; +B.prototype.updateAllRelationshipsFromData=B.prototype.AJ=function(){if(0<arguments.length){for(var a=this.ha,b=new K,c=a.hg,d=0;d<c.length;d++){var e=c[d];b.add(e)}var g=[];this.Mg.each(function(a){null===a.data||b.contains(a.data)||g.push(a.data)});this.oi.each(function(a){null===a.data||b.contains(a.data)||g.push(a.data)});g.forEach(function(b){Dg(a,b,!1)});for(d=0;d<c.length;d++){var e=c[d],h=this.vh(e);null===h&&Cg(a,e,!1)}if(a instanceof V){for(var k=new K,c=a.Kg,d=0;d<c.length;d++)e=c[d],k.add(e); +var l=[];this.links.each(function(a){null===a.data||k.contains(a.data)||l.push(a.data)});l.forEach(function(b){Zg(a,b,!1)});for(d=0;d<c.length;d++)e=c[d],h=this.$f(e),null===h&&Mg(a,e,!1)}}for(d=this.oi;d.next();)h=d.value,h.updateRelationshipsFromData();for(d=this.Mg;d.next();)d.value.updateRelationshipsFromData();for(d=this.links;d.next();)h=d.value,h.updateRelationshipsFromData()}; +function Gl(a,b,c){if(a.Vc||a.Vd)a.bc=c,c=a.Ua,c.wc&&ik(c,b,a.bc);else if(a.Vc=!0,null===a.Fb)a.bc=c;else{var d=a.xb.copy(),e=a.Jb,g=a.Ob;d.width=a.Jb/b;d.height=a.Ob/b;var h=a.$l.x,k=a.$l.y,l=a.WD;isNaN(h)&&(l.lj()?l.vp(qc)?h=0:l.vp(sc)&&(h=e-1):h=l.cd()?l.x*(e-1):e/2);isNaN(k)&&(l.lj()?l.vp(pc)?k=0:l.vp(tc)&&(k=g-1):k=l.cd()?l.y*(g-1):g/2);null!==a.zF&&(c=a.zF(a,c));c<a.Ah&&(c=a.Ah);c>a.zh&&(c=a.zh);e=z.Tb(a.sb.x+h/b-h/c,a.sb.y+k/b-k/c);a.position=e;z.A(e);a.bc=c;a.fu(d,a.xb);a.Vc=!1;Nk(a,!1);c= +a.Ua;c.wc&&ik(c,b,a.bc);a.ta();Xk(a)}}B.prototype.fu=function(a,b,c){if(!a.N(b)){void 0===c&&(c=!1);c||Xk(this);Kk(this);var d=this.Sb;null===d||!d.nx||this.xl!==mh||c||a.width===b.width&&a.height===b.height||d.I();d=this.cb;!0===this.jm&&d instanceof gh&&(this.R.ga=this.bG(this.R.ue),Qj(d,this));this.Vc||this.GE(a,b);hl(this);this.Ja("ViewportBoundsChanged",c?z.yj:null,a)}}; +function hl(a,b){void 0===b&&(b=null);var c=a.td;if(null!==c&&c.visible){for(var d=z.Xl(),e=1,g=1,h=c.va.o,k=h.length,l=0;l<k;l++){var m=h[l],n=m.interval;2>n||(Hl(m.Hb)?g=g*n/ff(g,n):e=e*n/ff(e,n))}h=c.ex;d.n(g*h.width,e*h.height);h=g=l=k=0;if(null!==b)k=b.width,l=b.height,g=b.x,h=b.y;else{e=z.lg();g=a.xb;e.n(g.x,g.y,g.width,g.height);for(h=a.Xv.i;h.next();)g=h.value.xb,g.F()&&Hb(e,g.x,g.y,g.width,g.height);if(!e.F()){z.dc(e);return}k=e.width;l=e.height;g=e.x;h=e.y;z.dc(e)}c.width=k+2*d.width;c.height= +l+2*d.height;e=z.O();jb(g,h,0,0,d.width,d.height,e);e.offset(-d.width,-d.height);z.qk(d);c.ca.location=e;z.A(e)}}B.prototype.clearSelection=B.prototype.Mw=function(){var a=0<this.selection.count;a&&this.Ja("ChangingSelection");kh(this);a&&this.Ja("ChangedSelection")};function kh(a){a=a.selection;if(0<a.count){for(var b=a.jc(),c=b.length,d=0;d<c;d++)b[d].jb=!1;a.Wa();a.clear();a.freeze()}} +B.prototype.select=B.prototype.select=function(a){null!==a&&(z.l(a,D,B,"select:part"),a.layer.h===this&&(!a.jb||1<this.selection.count)&&(this.Ja("ChangingSelection"),kh(this),a.jb=!0,this.Ja("ChangedSelection")))}; +B.prototype.selectCollection=B.prototype.EF=function(a){this.Ja("ChangingSelection");kh(this);if(z.isArray(a))for(var b=z.ab(a),c=0;c<b;c++){var d=z.Ya(a,c);d instanceof D||z.k("Diagram.selectCollection given something that is not a Part: "+d);d.jb=!0}else for(a=a.i;a.next();)d=a.value,d instanceof D||z.k("Diagram.selectCollection given something that is not a Part: "+d),d.jb=!0;this.Ja("ChangedSelection")}; +B.prototype.clearHighlighteds=B.prototype.PD=function(){var a=this.gn;if(0<a.count){for(var b=a.jc(),c=b.length,d=0;d<c;d++)b[d].yh=!1;a.Wa();a.clear();a.freeze()}};B.prototype.highlight=function(a){null!==a&&a.layer.h===this&&(z.l(a,D,B,"highlight:part"),!a.yh||1<this.gn.count)&&(this.PD(),a.yh=!0)}; +B.prototype.highlightCollection=function(a){this.PD();if(z.isArray(a))for(var b=z.ab(a),c=0;c<b;c++){var d=z.Ya(a,c);d instanceof D||z.k("Diagram.highlightCollection given something that is not a Part: "+d);d.yh=!0}else for(a=a.i;a.next();)d=a.value,d instanceof D||z.k("Diagram.highlightCollection given something that is not a Part: "+d),d.yh=!0}; +B.prototype.scroll=B.prototype.scroll=function(a,b,c){void 0===c&&(c=1);var d="up"===b||"down"===b,e=0;if("pixel"===a)e=c;else if("line"===a)e=c*(d?this.ou:this.nu);else if("page"===a)a=d?this.xb.height:this.xb.width,a*=this.scale,0!==a&&(e=Math.max(a-(d?this.ou:this.nu),0),e*=c);else{if("document"===a){e=this.ad;d=this.xb;c=z.O();"up"===b?this.position=c.n(d.x,e.y):"left"===b?this.position=c.n(e.x,d.y):"down"===b?this.position=c.n(d.x,e.bottom-d.height):"right"===b&&(this.position=c.n(e.right-d.width, +d.y));z.A(c);return}z.k("scrolling unit must be 'pixel', 'line', 'page', or 'document', not: "+a)}e/=this.scale;c=this.position.copy();"up"===b?c.y=this.position.y-e:"down"===b?c.y=this.position.y+e:"left"===b?c.x=this.position.x-e:"right"===b?c.x=this.position.x+e:z.k("scrolling direction must be 'up', 'down', 'left', or 'right', not: "+b);this.position=c};B.prototype.scrollToRect=B.prototype.eJ=function(a){var b=this.xb;b.nk(a)||(a=a.yl,a.x-=b.width/2,a.y-=b.height/2,this.position=a)}; +B.prototype.centerRect=B.prototype.XG=function(a){var b=this.xb;a=a.yl;a.x-=b.width/2;a.y-=b.height/2;this.position=a};B.prototype.transformDocToView=B.prototype.$A=function(a){var b=this.Hd;b.reset();1!==this.bc&&b.scale(this.bc);var c=this.sb;(0!==c.x||0!==c.y)&&isFinite(c.x)&&isFinite(c.y)&&b.translate(-c.x,-c.y);return a.copy().transform(this.Hd)}; +B.prototype.transformViewToDoc=B.prototype.bG=function(a){var b=this.Hd;b.reset();1!==this.bc&&b.scale(this.bc);var c=this.sb;(0!==c.x||0!==c.y)&&isFinite(c.x)&&isFinite(c.y)&&b.translate(-c.x,-c.y);return tb(a.copy(),this.Hd)};var mh;B.None=mh=z.s(B,"None",0);var Rk;B.Uniform=Rk=z.s(B,"Uniform",1);var Sk;B.UniformToFill=Sk=z.s(B,"UniformToFill",2);var Bi;B.CycleAll=Bi=z.s(B,"CycleAll",10);var Fi;B.CycleNotDirected=Fi=z.s(B,"CycleNotDirected",11);var Hi; +B.CycleNotDirectedFast=Hi=z.s(B,"CycleNotDirectedFast",12);var Ii;B.CycleNotUndirected=Ii=z.s(B,"CycleNotUndirected",13);var Ci;B.CycleDestinationTree=Ci=z.s(B,"CycleDestinationTree",14);var Ei;B.CycleSourceTree=Ei=z.s(B,"CycleSourceTree",15);var sk;B.DocumentScroll=sk=z.s(B,"DocumentScroll",1);var ul;B.InfiniteScroll=ul=z.s(B,"InfiniteScroll",2);var uk;B.TreeParentCollapsed=uk=z.s(B,"TreeParentCollapsed",1);B.AllParentsCollapsed=z.s(B,"AllParentsCollapsed",2); +z.defineProperty(B,{BJ:"validCycle"},function(){return this.yw},function(a){var b=this.yw;b!==a&&(z.Ba(a,B,B,"validCycle"),this.yw=a,this.j("validCycle",b,a))});z.w(B,{ln:"layers"},function(){return this.Yb.i});z.defineProperty(B,{Ef:"isModelReadOnly"},function(){var a=this.ie;return null===a?!1:a.ib},function(a){var b=this.ie;null!==b&&(b.ib=a)}); +z.defineProperty(B,{ib:"isReadOnly"},function(){return this.Hi},function(a){var b=this.Hi;b!==a&&(z.g(a,"boolean",B,"isReadOnly"),this.Hi=a,this.j("isReadOnly",b,a))});z.defineProperty(B,{isEnabled:"isEnabled"},function(){return this.af},function(a){var b=this.af;b!==a&&(z.g(a,"boolean",B,"isEnabled"),this.af=a,this.j("isEnabled",b,a))}); +z.defineProperty(B,{Bz:"allowClipboard"},function(){return this.Hu},function(a){var b=this.Hu;b!==a&&(z.g(a,"boolean",B,"allowClipboard"),this.Hu=a,this.j("allowClipboard",b,a))});z.defineProperty(B,{lk:"allowCopy"},function(){return this.Bk},function(a){var b=this.Bk;b!==a&&(z.g(a,"boolean",B,"allowCopy"),this.Bk=a,this.j("allowCopy",b,a))}); +z.defineProperty(B,{Rm:"allowDelete"},function(){return this.Ck},function(a){var b=this.Ck;b!==a&&(z.g(a,"boolean",B,"allowDelete"),this.Ck=a,this.j("allowDelete",b,a))});z.defineProperty(B,{kt:"allowDragOut"},function(){return this.Iu},function(a){var b=this.Iu;b!==a&&(z.g(a,"boolean",B,"allowDragOut"),this.Iu=a,this.j("allowDragOut",b,a))}); +z.defineProperty(B,{FD:"allowDrop"},function(){return this.Ju},function(a){var b=this.Ju;b!==a&&(z.g(a,"boolean",B,"allowDrop"),this.Ju=a,this.j("allowDrop",b,a))});z.defineProperty(B,{Hw:"allowTextEdit"},function(){return this.Lk},function(a){var b=this.Lk;b!==a&&(z.g(a,"boolean",B,"allowTextEdit"),this.Lk=a,this.j("allowTextEdit",b,a))}); +z.defineProperty(B,{Ew:"allowGroup"},function(){return this.Dk},function(a){var b=this.Dk;b!==a&&(z.g(a,"boolean",B,"allowGroup"),this.Dk=a,this.j("allowGroup",b,a))});z.defineProperty(B,{Iw:"allowUngroup"},function(){return this.Mk},function(a){var b=this.Mk;b!==a&&(z.g(a,"boolean",B,"allowUngroup"),this.Mk=a,this.j("allowUngroup",b,a))}); +z.defineProperty(B,{$o:"allowInsert"},function(){return this.Lu},function(a){var b=this.Lu;b!==a&&(z.g(a,"boolean",B,"allowInsert"),this.Lu=a,this.j("allowInsert",b,a))});z.defineProperty(B,{lt:"allowLink"},function(){return this.Ek},function(a){var b=this.Ek;b!==a&&(z.g(a,"boolean",B,"allowLink"),this.Ek=a,this.j("allowLink",b,a))}); +z.defineProperty(B,{Sm:"allowRelink"},function(){return this.Gk},function(a){var b=this.Gk;b!==a&&(z.g(a,"boolean",B,"allowRelink"),this.Gk=a,this.j("allowRelink",b,a))});z.defineProperty(B,{vl:"allowMove"},function(){return this.Fk},function(a){var b=this.Fk;b!==a&&(z.g(a,"boolean",B,"allowMove"),this.Fk=a,this.j("allowMove",b,a))}); +z.defineProperty(B,{Fw:"allowReshape"},function(){return this.Hk},function(a){var b=this.Hk;b!==a&&(z.g(a,"boolean",B,"allowReshape"),this.Hk=a,this.j("allowReshape",b,a))});z.defineProperty(B,{mt:"allowResize"},function(){return this.Ik},function(a){var b=this.Ik;b!==a&&(z.g(a,"boolean",B,"allowResize"),this.Ik=a,this.j("allowResize",b,a))}); +z.defineProperty(B,{Gw:"allowRotate"},function(){return this.Jk},function(a){var b=this.Jk;b!==a&&(z.g(a,"boolean",B,"allowRotate"),this.Jk=a,this.j("allowRotate",b,a))});z.defineProperty(B,{xf:"allowSelect"},function(){return this.Kk},function(a){var b=this.Kk;b!==a&&(z.g(a,"boolean",B,"allowSelect"),this.Kk=a,this.j("allowSelect",b,a))}); +z.defineProperty(B,{GD:"allowUndo"},function(){return this.Mu},function(a){var b=this.Mu;b!==a&&(z.g(a,"boolean",B,"allowUndo"),this.Mu=a,this.j("allowUndo",b,a))});z.defineProperty(B,{Jw:"allowZoom"},function(){return this.Ou},function(a){var b=this.Ou;b!==a&&(z.g(a,"boolean",B,"allowZoom"),this.Ou=a,this.j("allowZoom",b,a))}); +z.defineProperty(B,{cA:"hasVerticalScrollbar"},function(){return this.tv},function(a){var b=this.tv;b!==a&&(z.g(a,"boolean",B,"hasVerticalScrollbar"),this.tv=a,Xk(this),this.ta(),this.j("hasVerticalScrollbar",b,a),Nk(this,!1))});z.defineProperty(B,{bA:"hasHorizontalScrollbar"},function(){return this.sv},function(a){var b=this.sv;b!==a&&(z.g(a,"boolean",B,"hasHorizontalScrollbar"),this.sv=a,Xk(this),this.ta(),this.j("hasHorizontalScrollbar",b,a),Nk(this,!1))}); +z.defineProperty(B,{ye:"allowHorizontalScroll"},function(){return this.Ku},function(a){var b=this.Ku;b!==a&&(z.g(a,"boolean",B,"allowHorizontalScroll"),this.Ku=a,this.j("allowHorizontalScroll",b,a),Nk(this,!1))});z.defineProperty(B,{ze:"allowVerticalScroll"},function(){return this.Nu},function(a){var b=this.Nu;b!==a&&(z.g(a,"boolean",B,"allowVerticalScroll"),this.Nu=a,this.j("allowVerticalScroll",b,a),Nk(this,!1))}); +z.defineProperty(B,{nu:"scrollHorizontalLineChange"},function(){return this.hw},function(a){var b=this.hw;b!==a&&(z.g(a,"number",B,"scrollHorizontalLineChange"),0>a&&z.ka(a,">= 0",B,"scrollHorizontalLineChange"),this.hw=a,this.j("scrollHorizontalLineChange",b,a))}); +z.defineProperty(B,{ou:"scrollVerticalLineChange"},function(){return this.lw},function(a){var b=this.lw;b!==a&&(z.g(a,"number",B,"scrollVerticalLineChange"),0>a&&z.ka(a,">= 0",B,"scrollVerticalLineChange"),this.lw=a,this.j("scrollVerticalLineChange",b,a))});z.defineProperty(B,{R:"lastInput"},function(){return this.Qb},function(a){u&&z.l(a,Rf,B,"lastInput");this.Qb=a});z.defineProperty(B,{Fc:"firstInput"},function(){return this.Fi},function(a){u&&z.l(a,Rf,B,"firstInput");this.Fi=a}); +z.defineProperty(B,{gc:"currentCursor"},function(){return this.av},function(a){""===a&&(a=this.Oq);this.av!==a&&(z.g(a,"string",B,"currentCursor"),null!==this.Fb&&(this.av=a,this.Fb.style.cursor=a,this.Pb.style.cursor=a))});z.defineProperty(B,{kK:"defaultCursor"},function(){return this.Oq},function(a){""===a&&(a="auto");var b=this.Oq;b!==a&&(z.g(a,"string",B,"defaultCursor"),this.Oq=a,this.j("defaultCursor",b,a))}); +z.defineProperty(B,{click:"click"},function(){return this.vi},function(a){var b=this.vi;b!==a&&(null!==a&&z.g(a,"function",B,"click"),this.vi=a,this.j("click",b,a))});z.defineProperty(B,{wt:"doubleClick"},function(){return this.Di},function(a){var b=this.Di;b!==a&&(null!==a&&z.g(a,"function",B,"doubleClick"),this.Di=a,this.j("doubleClick",b,a))}); +z.defineProperty(B,{Hz:"contextClick"},function(){return this.yi},function(a){var b=this.yi;b!==a&&(null!==a&&z.g(a,"function",B,"contextClick"),this.yi=a,this.j("contextClick",b,a))});z.defineProperty(B,{tA:"mouseOver"},function(){return this.Qi},function(a){var b=this.Qi;b!==a&&(null!==a&&z.g(a,"function",B,"mouseOver"),this.Qi=a,this.j("mouseOver",b,a))}); +z.defineProperty(B,{sA:"mouseHover"},function(){return this.Pi},function(a){var b=this.Pi;b!==a&&(null!==a&&z.g(a,"function",B,"mouseHover"),this.Pi=a,this.j("mouseHover",b,a))});z.defineProperty(B,{rA:"mouseHold"},function(){return this.Oi},function(a){var b=this.Oi;b!==a&&(null!==a&&z.g(a,"function",B,"mouseHold"),this.Oi=a,this.j("mouseHold",b,a))}); +z.defineProperty(B,{JI:"mouseDragOver"},function(){return this.Qv},function(a){var b=this.Qv;b!==a&&(null!==a&&z.g(a,"function",B,"mouseDragOver"),this.Qv=a,this.j("mouseDragOver",b,a))});z.defineProperty(B,{qA:"mouseDrop"},function(){return this.Ni},function(a){var b=this.Ni;b!==a&&(null!==a&&z.g(a,"function",B,"mouseDrop"),this.Ni=a,this.j("mouseDrop",b,a))}); +z.defineProperty(B,{ZA:"toolTip"},function(){return this.Xi},function(a){var b=this.Xi;b!==a&&(null!==a&&z.l(a,da,B,"toolTip"),this.Xi=a,this.j("toolTip",b,a))});z.defineProperty(B,{contextMenu:"contextMenu"},function(){return this.zi},function(a){var b=this.zi;b!==a&&(null!==a&&z.l(a,da,B,"contextMenu"),this.zi=a,this.j("contextMenu",b,a))}); +z.defineProperty(B,{wb:"commandHandler"},function(){return this.sy},function(a){var b=this.sy;b!==a&&(z.l(a,ra,B,"commandHandler"),null!==a.h&&z.k("Cannot share CommandHandlers between Diagrams: "+a.toString()),null!==b&&b.Sc(null),this.sy=a,a.Sc(this))});z.defineProperty(B,{gb:"toolManager"},function(){return this.sz},function(a){var b=this.sz;b!==a&&(z.l(a,gh,B,"toolManager"),null!==a.h&&z.k("Cannot share ToolManagers between Diagrams: "+a.toString()),null!==b&&b.Sc(null),this.sz=a,a.Sc(this))}); +z.defineProperty(B,{vt:"defaultTool"},function(){return this.yy},function(a){var b=this.yy;b!==a&&(z.l(a,xg,B,"defaultTool"),this.yy=a,this.cb===b&&(this.cb=a))});z.defineProperty(B,{cb:"currentTool"},function(){return this.wy},function(a){var b=this.wy;null!==b&&(b.ua&&b.doDeactivate(),b.cancelWaitAfter(),b.doStop());null===a&&(a=this.vt);null!==a&&(z.l(a,xg,B,"currentTool"),this.wy=a,a.Sc(this),a.doStart())});z.w(B,{selection:"selection"},function(){return this.ow}); +z.defineProperty(B,{BI:"maxSelectionCount"},function(){return this.Lv},function(a){var b=this.Lv;if(b!==a)if(z.g(a,"number",B,"maxSelectionCount"),0<=a&&!isNaN(a)){if(this.Lv=a,this.j("maxSelectionCount",b,a),!this.pa.qb&&(a=this.selection.count-a,0<a)){this.Ja("ChangingSelection");for(var b=this.selection.jc(),c=0;c<a;c++)b[c].jb=!1;this.Ja("ChangedSelection")}}else z.ka(a,">= 0",B,"maxSelectionCount")}); +z.defineProperty(B,{LI:"nodeSelectionAdornmentTemplate"},function(){return this.Rv},function(a){var b=this.Rv;b!==a&&(z.l(a,da,B,"nodeSelectionAdornmentTemplate"),this.Rv=a,this.j("nodeSelectionAdornmentTemplate",b,a))});z.defineProperty(B,{SH:"groupSelectionAdornmentTemplate"},function(){return this.pv},function(a){var b=this.pv;b!==a&&(z.l(a,da,B,"groupSelectionAdornmentTemplate"),this.pv=a,this.j("groupSelectionAdornmentTemplate",b,a))}); +z.defineProperty(B,{vI:"linkSelectionAdornmentTemplate"},function(){return this.Hv},function(a){var b=this.Hv;b!==a&&(z.l(a,da,B,"linkSelectionAdornmentTemplate"),this.Hv=a,this.j("linkSelectionAdornmentTemplate",b,a))});z.w(B,{gn:"highlighteds"},function(){return this.uv}); +z.defineProperty(B,{ni:"isModified"},function(){var a=this.pa;return a.isEnabled?null!==a.ej?!0:this.Vy&&this.dh!==a.jj:this.Vy},function(a){if(this.Vy!==a){z.g(a,"boolean",B,"isModified");this.Vy=a;var b=this.pa;!a&&b.isEnabled&&(this.dh=b.jj);a||Il(this)}});function Il(a){var b=a.ni;a.xD!==b&&(a.xD=b,a.Ja("Modified"))} +z.defineProperty(B,{ha:"model"},function(){return this.ie},function(a){var b=this.ie;if(b!==a){z.l(a,M,B,"model");this.cb.doCancel();null!==b&&b.pa!==a.pa&&b.pa.PE&&z.k("Do not replace a Diagram.model while a transaction is in progress.");this.Ua.pi();this.Mw();this.fh=!1;this.ho=!0;this.dh=-2;this.Wf=!1;var c=this.Vd;this.Vd=!0;this.Ua.rn("Model");null!==b&&(null!==this.hh&&this.hh.each(function(a){b.iu(a)}),b.iu(this.FC),b instanceof V&&Jl(this,b.Kg),Jl(this,b.hg));this.ie=a;a.Qm(this.EC);Kl(this, +a.hg);a instanceof V&&Ll(this,a.Kg);a.iu(this.EC);a.Qm(this.FC);null!==this.hh&&this.hh.each(function(b){a.Qm(b)});this.Vd=c;this.Vc||this.ta();null!==b&&(a.pa.isEnabled=b.pa.isEnabled)}});z.defineProperty(B,{$a:null},function(){return this.xC},function(a){this.xC=a});z.w(B,{sx:null},function(){return this.qG}); +function wk(a,b){if(b.ha===a.ha){var c=b.Dc,d=b.propertyName;if(c===Vf&&"S"===d[0])if("StartingFirstTransaction"===d)c=a.gb,c.Ye.each(function(b){b.Sc(a)}),c.eg.each(function(b){b.Sc(a)}),c.fg.each(function(b){b.Sc(a)}),a.Vd||a.fh||(a.gv=!0,a.ho&&(a.Wf=!0));else if("StartingUndo"===d||"StartingRedo"===d){var e=a.Ua;e.nf&&!a.Bb&&e.pi();a.Ja("ChangingSelection")}else"StartedTransaction"===d&&(e=a.Ua,e.nf&&!a.Bb&&e.pi());else if(a.$a){a.$a=!1;try{var g=b.rf;if(""!==g)if(c===Uf){if("linkFromKey"===g){var h= +b.object,k=a.$f(h);if(null!==k){var l=b.newValue,m=a.hf(l);k.Y=m}}else if("linkToKey"===g)h=b.object,k=a.$f(h),null!==k&&(l=b.newValue,m=a.hf(l),k.da=m);else if("linkFromPortId"===g){if(h=b.object,k=a.$f(h),null!==k){var n=b.newValue;"string"===typeof n&&(k.ag=n)}}else if("linkToPortId"===g)h=b.object,k=a.$f(h),null!==k&&(n=b.newValue,"string"===typeof n&&(k.Vg=n));else if("nodeGroupKey"===g){var h=b.object,p=a.vh(h);if(null!==p){var q=b.newValue;if(void 0!==q){var r=a.hf(q);p.Va=r instanceof F?r: +null}else p.Va=null}}else if("linkLabelKeys"===g){if(h=b.object,k=a.$f(h),null!==k){var s=b.oldValue,t=b.newValue;if(z.isArray(s))for(var v=z.ab(s),x=0;x<v;x++){var y=z.Ya(s,x),m=a.hf(y);null!==m&&(m.Nd=null)}if(z.isArray(t))for(v=z.ab(t),x=0;x<v;x++)y=z.Ya(t,x),m=a.hf(y),null!==m&&(m.Nd=k)}}else if("nodeParentKey"===g){var A=b.object,C=a.hf(b.newValue),L=a.$w(A);if(null!==L){var H=L.op();null!==H?null===C?a.remove(H):a.ce?H.Y=C:H.da=C:Ml(a,C,L)}}else if("parentLinkCategory"===g){var A=b.object,L= +a.$w(A),U=b.newValue;null!==L&&"string"===typeof U&&(H=L.op(),null!==H&&(H.nc=U))}else if("nodeCategory"===g){var h=b.object,ea=a.vh(h),U=b.newValue;null!==ea&&"string"===typeof U&&(ea.nc=U)}else if("linkCategory"===g){var h=b.object,W=a.$f(h),U=b.newValue;null!==W&&"string"===typeof U&&(W.nc=U)}else if("nodeDataArray"===g){var P=b.oldValue;Jl(a,P);var ba=b.newValue;Kl(a,ba)}else"linkDataArray"===g&&(P=b.oldValue,Jl(a,P),ba=b.newValue,Ll(a,ba));a.ni=!0}else c===Wf?(ba=b.newValue,"nodeDataArray"=== +g&&z.Za(ba)?Nl(a,ba):"linkDataArray"===g&&z.Za(ba)?Ol(a,ba):"linkLabelKeys"===g&&Bg(ba)&&(k=a.$f(b.object),m=a.hf(ba),null!==k&&null!==m&&(m.Nd=k)),a.ni=!0):c===Xf?(P=b.oldValue,"nodeDataArray"===g&&z.Za(P)?Pl(a,P):"linkDataArray"===g&&z.Za(P)?Pl(a,P):"linkLabelKeys"===g&&Bg(P)&&(m=a.hf(P),null!==m&&(m.Nd=null)),a.ni=!0):c===Vf&&("SourceChanged"===g?null!==b.object?vk(a,b.object,b.propertyName):(a.AJ(),a.dG()):"ModelDisplaced"===g&&a.Sl());else if(c===Uf){var Oa=b.propertyName,h=b.object;if(h===a.ha){if("nodeKeyProperty"=== +Oa||"nodeCategoryProperty"===Oa||"linkFromKeyProperty"===Oa||"linkToKeyProperty"===Oa||"linkFromPortIdProperty"===Oa||"linkToPortIdProperty"===Oa||"linkLabelKeysProperty"===Oa||"nodeIsGroupProperty"===Oa||"nodeGroupKeyProperty"===Oa||"nodeParentKeyProperty"===Oa||"linkCategoryProperty"===Oa)a.pa.qb||a.Sl()}else vk(a,h,Oa);a.ni=!0}else if(c===Wf||c===Xf)Ql(a,b),a.ni=!0;else if(c===Vf){if("FinishedUndo"===d||"FinishedRedo"===d)a.pa.Ii=!0,a.Ja("ChangedSelection"),Lk(a),a.pa.Ii=!1;e=a.Ua;"RolledBackTransaction"=== +d&&e.pi();a.gv=!0;a.cg();0===a.pa.Ih&&Uj(e);"CommittedTransaction"===d&&a.pa.Xy&&(a.dh=Math.min(a.dh,a.pa.jj-1));var sa=b.SE;sa&&(Il(a),a.sx.clear());!a.dz&&sa&&(a.dz=!0,z.setTimeout(function(){a.cb.standardMouseOver();a.dz=!1},10))}}finally{a.$a=!0}}}} +function vk(a,b,c){if("string"===typeof c){var d=a.vh(b);if(null!==d)d.Mb(c),a.ha instanceof qg&&(d=a.$f(b),null!==d&&d.Mb(c));else{for(var d=null,e=a.mm.i;e.next();){for(var g=e.value,h=0;h<g.length;h++){var k=g[h].DH(b);null!==k&&(null===d&&(d=z.rb()),d.push(k))}if(null!==d)break}if(null!==d){for(e=0;e<d.length;e++)d[e].Mb(c);z.xa(d)}}b===a.ha.uk&&a.dG(c)}}z.defineProperty(B,{Ee:"skipsModelSourceBindings"},function(){return this.$C},function(a){this.$C=a}); +z.defineProperty(B,{vu:null},function(){return this.mz},function(a){this.mz=a});function Ql(a,b){var c=b.Dc===Wf,d=c?b.Lg:b.Ng,e=c?b.newValue:b.oldValue,g=a.mm.na(b.object);if(Array.isArray(g))for(var h=0;h<g.length;h++){var k=g[h];if(c)Rl(k,e,d);else{var l=d;if(!(0>l)){var m=l;Sl(k)&&m++;k.Ve(m);Tl(k,m,l)}}}}function zl(a,b){var c=b.Ji;if(z.isArray(c)){var d=a.mm.na(c);if(null===d)d=[],d.push(b),a.mm.add(c,d);else{for(c=0;c<d.length;c++)if(d[c]===b)return;d.push(b)}}} +function Dl(a,b){var c=b.Ji;if(z.isArray(c)){var d=a.mm.na(c);if(null!==d)for(var e=0;e<d.length;e++)if(d[e]===b){d.splice(e,1);0===d.length&&a.mm.remove(c);break}}}function yl(a,b){for(var c=b.va.o,d=c.length,e=0;e<d;e++){var g=c[e];g instanceof xk&&Ul(a,g)}}function Ul(a,b){var c=b.element;if(null!==c&&c instanceof HTMLImageElement){var c=c.src,d=a.Fo.na(c);if(null===d)d=[],d.push(b),a.Fo.add(c,d);else{for(c=0;c<d.length;c++)if(d[c]===b)return;d.push(b)}}} +function Cl(a,b){for(var c=b.va.o,d=c.length,e=0;e<d;e++){var g=c[e];g instanceof xk&&Vl(a,g)}}function Vl(a,b){var c=b.element;if(null!==c&&c instanceof HTMLImageElement){var c=c.src,d=a.Fo.na(c);if(null!==d)for(var e=0;e<d.length;e++)if(d[e]===b){d.splice(e,1);0===d.length&&a.Fo.remove(c);break}}} +B.prototype.clear=B.prototype.clear=function(){var a=null;null!==this.td&&(a=this.td.ca);this.ha.clear();for(var b=this.Yb.length,c=0;c<b;c++)this.Yb.o[c].clear();this.rg.clear();this.Sk.clear();this.Eo.clear();this.pl.clear();this.yo.clear();this.mb.clear();this.Ai.clear();this.Rk.clear();this.mm.clear();this.ow.Wa();this.ow.clear();this.ow.freeze();this.uv.Wa();this.uv.clear();this.uv.freeze();eh=this.Rn=null;fh="";this.hv=(new w(NaN,NaN,NaN,NaN)).freeze();null!==a&&(this.add(a),this.mb.remove(a)); +this.ta()}; +B.prototype.reset=B.prototype.reset=function(){this.Vc=!0;this.clear();this.Yb=new J(wg);this.qF();this.pF();this.sb=(new N(NaN,NaN)).freeze();this.bc=1;this.wv=(new N(NaN,NaN)).freeze();this.xv=NaN;this.Nv=1E-4;this.Kv=100;this.Bw=(new N(NaN,NaN)).freeze();this.nv=(new w(NaN,NaN,NaN,NaN)).freeze();this.iw=(new Db(0,0,0,0)).freeze();this.jw=sk;this.fw=this.bw=null;this.cm=mh;this.On=Pc;this.Yk=mh;this.mo=Pc;this.yv=this.vv=Zb;this.tB=250;this.Su=(new Db(16,16,16,16)).freeze();this.Cv=!0;this.ww=uk; +this.yw=Bi;this.Oq="auto";this.zi=this.Xi=this.Ni=this.Qv=this.Oi=this.Pi=this.Qi=this.yi=this.Di=this.vi=null;this.Hi=!1;this.Ck=this.Bk=this.Hu=this.af=!0;this.Ju=this.Iu=!1;this.Nu=this.Ku=this.tv=this.sv=this.Ou=this.Mu=this.Kk=this.Jk=this.Ik=this.Hk=this.Fk=this.Gk=this.Ek=this.Lu=this.Mk=this.Dk=this.Lk=!0;this.lw=this.hw=16;this.df=(new Db(5)).freeze();this.Lv=999999999;this.he=null;Bk(this);this.td=null;this.gb=new gh;this.gb.initializeStandardTools();this.cb=this.vt=this.gb;this.wb=new ra; +this.Wi=!0;Ak(this);this.Sb=new yg;this.Wi=!1;this.ha=new V;this.fh=!1;this.ho=!0;this.Vc=this.Wf=!1;this.ta();this.hh=this.ui=null;tk(this);this.av=""}; +B.prototype.rebuildParts=B.prototype.Sl=function(){for(var a=this.yA.i;a.next();){var b=a.value,c=a.key;(!b.be()||b instanceof F)&&z.k('Invalid node template in Diagram.nodeTemplateMap: template for "'+c+'" must be a Node or a simple Part, not a Group or Link: '+b)}for(a=this.aA.i;a.next();)b=a.value,c=a.key,b instanceof F||z.k('Invalid group template in Diagram.groupTemplateMap: template for "'+c+'" must be a Group, not a normal Node or Link: '+b);for(a=this.kA.i;a.next();)b=a.value,c=a.key,b instanceof +G||z.k('Invalid link template in Diagram.linkTemplateMap: template for "'+c+'" must be a Link, not a normal Node or simple Part: '+b);a=z.rb();for(b=this.selection.i;b.next();)(c=b.value.data)&&a.push(c);for(var b=z.rb(),d=this.gn.i;d.next();)(c=d.value.data)&&b.push(c);c=z.rb();for(d=this.Mg.i;d.next();){var e=d.value;null!==e.data&&(c.push(e.data),c.push(e.location))}for(d=this.links.i;d.next();)e=d.value,null!==e.data&&(c.push(e.data),c.push(e.location));for(d=this.oi.i;d.next();)e=d.value,null!== +e.data&&(c.push(e.data),c.push(e.location));d=this.ha;d instanceof V&&Jl(this,d.Kg);Jl(this,d.hg);Kl(this,d.hg);d instanceof V&&Ll(this,d.Kg);for(d=0;d<a.length;d++)e=this.vh(a[d]),null!==e&&(e.jb=!0);for(d=0;d<b.length;d++)e=this.vh(b[d]),null!==e&&(e.yh=!0);for(d=0;d<c.length;d+=2)e=this.vh(c[d]),null!==e&&(e.location=c[d+1]);z.xa(a);z.xa(b);z.xa(c)}; +function Kl(a,b){if(null!==b){for(var c=a.ha,d=z.ab(b),e=0;e<d;e++){var g=z.Ya(b,e);c.le(g)?Nl(a,g,!1):c instanceof V&&Ol(a,g)}if(c instanceof V||c instanceof qg){for(e=0;e<d;e++)g=z.Ya(b,e),c.le(g)&&Wl(a,g);if(c instanceof V)for(c=a.links;c.next();)Xl(c.value)}Yl(a,!1)}} +function Nl(a,b,c){if(void 0!==b&&null!==b&&!a.pa.qb&&!a.Ai.contains(b)){void 0===c&&(c=!0);var d=a.Zz(b),e=Zl(a,b,d);if(null!==e&&(jh(e),e=e.copy(),null!==e)){var g=a.Ee;a.Ee=!0;e.ti=d;e.fe=b;a.add(e);e.fe=null;e.data=b;c&&Wl(a,b);a.Ee=g}}}B.prototype.Zz=function(a){return this.ha.Zz(a)};var $l=!1,am=!1; +function Zl(a,b,c){var d=!1,e=a.ha;e instanceof V&&(d=e.gA(b));d?(b=a.aA.na(c),null===b&&(b=a.aA.na(""),null===b&&(am||(am=!0,z.trace('No Group template found for category "'+c+'"'),z.trace(" Using default group template")),b=a.OB))):(b=a.yA.na(c),null===b&&(b=a.yA.na(""),null===b&&($l||($l=!0,z.trace('No Node template found for category "'+c+'"'),z.trace(" Using default node template")),b=a.QB)));return b} +function Wl(a,b){var c=a.ha;if(c instanceof V||c instanceof qg){var d=c.pb(b);if(void 0!==d){var e=Eg(c,d),g=a.vh(b);if(null!==e&&null!==g){for(e=e.i;e.next();){var h=e.value;if(c instanceof V){var k=c;if(k.le(h)){if(g instanceof F&&k.en(h)===d){var l=g,h=a.vh(h);null!==h&&(h.Va=l)}}else{var m=a.$f(h);if(null!==m&&g instanceof E&&(l=g,k.Ll(h)===d&&(m.Y=l),k.Ml(h)===d&&(m.da=l),h=k.rk(h),z.isArray(h)))for(k=0;k<z.ab(h);k++)if(z.Ya(h,k)===d){l.Nd=m;break}}}else c instanceof qg&&(m=c,m.le(h)&&g instanceof +E&&(l=g,m.fn(h)===d&&(h=a.$w(h),Ml(a,l,h))))}Gg(c,d)}c instanceof V?(c=c.en(b),void 0!==c&&(c=a.hf(c),c instanceof F&&(g.Va=c))):c instanceof qg&&(c=c.fn(b),void 0!==c&&g instanceof E&&(l=g,g=a.hf(c),Ml(a,g,l)))}}} +function Ml(a,b,c){if(null!==b&&null!==c){var d=a.gb.YE,e=b,g=c;if(a.ce)for(b=g.ee;b.next();){if(b.value.da===g)return}else for(e=c,g=b,b=e.ee;b.next();)if(b.value.Y===e)return;if(null===d||!Di(d,e,g,null,!0))if(d=a.bx(c.data),b=bm(a,d),null!==b&&(jh(b),b=b.copy(),null!==b)){var h=a.Ee;a.Ee=!0;b.ti=d;b.fe=c.data;b.Y=e;b.da=g;a.add(b);b.fe=null;b.data=c.data;a.Ee=h}}}function Ll(a,b){if(null!==b){for(var c=z.ab(b),d=0;d<c;d++){var e=z.Ya(b,d);Ol(a,e)}Yl(a,!1)}} +function Ol(a,b){if(void 0!==b&&null!==b&&!a.pa.qb&&!a.Rk.contains(b)){var c=a.bx(b),d=bm(a,c);if(null!==d&&(jh(d),d=d.copy(),null!==d)){var e=a.Ee;a.Ee=!0;d.ti=c;d.fe=b;var c=a.ha,g=c.LH(b);""!==g&&(d.ag=g);g=c.Ll(b);void 0!==g&&(g=a.hf(g),g instanceof E&&(d.Y=g));g=c.OH(b);""!==g&&(d.Vg=g);g=c.Ml(b);void 0!==g&&(g=a.hf(g),g instanceof E&&(d.da=g));c=c.rk(b);if(z.isArray(c))for(var g=z.ab(c),h=0;h<g;h++){var k=z.Ya(c,h),k=a.hf(k);null!==k&&(k.Nd=d)}a.add(d);d.fe=null;d.data=b;a.Ee=e}}} +B.prototype.bx=function(a){var b=this.ha,c="";b instanceof V?c=b.bx(a):b instanceof qg&&(c=b.NH(a));return c};var cm=!1;function bm(a,b){var c=a.kA.na(b);null===c&&(c=a.kA.na(""),null===c&&(cm||(cm=!0,z.trace('No Link template found for category "'+b+'"'),z.trace(" Using default link template")),c=a.PB));return c}function Jl(a,b){for(var c=z.ab(b),d=0;d<c;d++){var e=z.Ya(b,d);Pl(a,e)}} +function Pl(a,b){if(void 0!==b&&null!==b){var c=a.vh(b);if(null!==c){c.jb=!1;c.yh=!1;var d=c.layer;if(null!==d&&d.h===a){var e=a.ha;if(e instanceof V&&c instanceof E){var g=c,h=e.pb(g.data);if(void 0!==h){for(var k=g.ee;k.next();)Fg(e,h,k.value.data);g.Df&&(k=g.Nd,null!==k&&Fg(e,h,k.data));if(g instanceof F)for(g=g.Hc;g.next();)k=g.value.data,e.le(k)&&Fg(e,h,k)}}else if(e instanceof qg&&c instanceof E){g=c;k=a.$f(g.data);if(null!==k){k.jb=!1;k.yh=!1;var l=k.layer;if(null!==l){var m=l.Ve(-1,k,!1); +0<=m&&a.Rc(Xf,"parts",l,k,null,m,null);m=k.Ut;null!==m&&m(k,l,null)}}k=a.ce;for(g=g.ee;g.next();)l=g.value,l=(k?l.da:l.Y).data,e.le(l)&&Fg(e,h,l)}e=d.Ve(-1,c,!1);0<=e&&a.Rc(Xf,"parts",d,c,null,e,null);e=c.Ut;null!==e&&e(c,d,null)}}}}B.prototype.findPartForKey=B.prototype.GH=function(a){if(null===a||void 0===a)return null;a=this.ha.ne(a);return null===a?null:this.Ai.na(a)}; +B.prototype.findNodeForKey=B.prototype.hf=function(a){if(null===a||void 0===a)return null;a=this.ha.ne(a);if(null===a)return null;a=this.Ai.na(a);return a instanceof E?a:null};B.prototype.findPartForData=B.prototype.vh=function(a){if(null===a)return null;var b=this.Ai.na(a);return null!==b?b:b=this.Rk.na(a)};B.prototype.findNodeForData=B.prototype.$w=function(a){if(null===a)return null;a=this.Ai.na(a);return a instanceof E?a:null}; +B.prototype.findLinkForData=B.prototype.$f=function(a){return null===a?null:this.Rk.na(a)};B.prototype.findNodesByExample=function(a){for(var b=new K,c=this.Eo.i;c.next();){var d=c.value,e=d.data;if(null!==e)for(var g=0;g<arguments.length;g++){var h=arguments[g];if(z.Za(h)&&dm(this,e,h)){b.add(d);break}}}return b.i}; +B.prototype.findLinksByExample=function(a){for(var b=new K,c=this.yo.i;c.next();){var d=c.value,e=d.data;if(null!==e)for(var g=0;g<arguments.length;g++){var h=arguments[g];if(z.Za(h)&&dm(this,e,h)){b.add(d);break}}}return b.i};function dm(a,b,c){for(var d in c){var e=b[d],g=c[d];if(z.isArray(g)){if(!z.isArray(e)||e.length<g.length)return!1;for(var h=0;h<e.length;h++){var k=e[h],l=g[h];if(void 0!==l&&!em(a,k,l))return!1}}else if(!em(a,e,g))return!1}return!0} +function em(a,b,c){if("function"===typeof c){if(!c(b))return!1}else if(c instanceof RegExp){if(!b||!c.test(b.toString()))return!1}else if(z.Za(b)&&z.Za(c)){if(!dm(a,b,c))return!1}else if(b!==c)return!1;return!0}z.defineProperty(B,{ZK:"nodeTemplate"},function(){return this.Ri.na("")},function(a){var b=this.Ri.na("");b!==a&&(z.l(a,D,B,"nodeTemplate"),this.Ri.add("",a),this.j("nodeTemplate",b,a),this.pa.qb||this.Sl())}); +z.defineProperty(B,{yA:"nodeTemplateMap"},function(){return this.Ri},function(a){var b=this.Ri;b!==a&&(z.l(a,na,B,"nodeTemplateMap"),this.Ri=a,this.j("nodeTemplateMap",b,a),this.pa.qb||this.Sl())});z.defineProperty(B,{BK:"groupTemplate"},function(){return this.Uk.na("")},function(a){var b=this.Uk.na("");b!==a&&(z.l(a,F,B,"groupTemplate"),this.Uk.add("",a),this.j("groupTemplate",b,a),this.pa.qb||this.Sl())}); +z.defineProperty(B,{aA:"groupTemplateMap"},function(){return this.Uk},function(a){var b=this.Uk;b!==a&&(z.l(a,na,B,"groupTemplateMap"),this.Uk=a,this.j("groupTemplateMap",b,a),this.pa.qb||this.Sl())});z.defineProperty(B,{NK:"linkTemplate"},function(){return this.Pj.na("")},function(a){var b=this.Pj.na("");b!==a&&(z.l(a,G,B,"linkTemplate"),this.Pj.add("",a),this.j("linkTemplate",b,a),this.pa.qb||this.Sl())}); +z.defineProperty(B,{kA:"linkTemplateMap"},function(){return this.Pj},function(a){var b=this.Pj;b!==a&&(z.l(a,na,B,"linkTemplateMap"),this.Pj=a,this.j("linkTemplateMap",b,a),this.pa.qb||this.Sl())});z.defineProperty(B,{gI:null},function(){return this.jm},function(a){this.jm=a}); +z.defineProperty(B,{We:"isMouseCaptured"},function(){return this.uC},function(a){var b=this.Fb;null!==b&&(a?(this.R.bubbles=!1,b.removeEventListener("mousemove",this.Kp,!1),b.removeEventListener("mousedown",this.Jp,!1),b.removeEventListener("mouseup",this.Mp,!1),b.removeEventListener("mousewheel",this.Bh,!1),b.removeEventListener("DOMMouseScroll",this.Bh,!1),b.removeEventListener("mouseout",this.Lp,!1),window.addEventListener("mousemove",this.Kp,!0),window.addEventListener("mousedown",this.Jp,!0), +window.addEventListener("mouseup",this.Mp,!0),window.addEventListener("mousewheel",this.Bh,!0),window.addEventListener("DOMMouseScroll",this.Bh,!0),window.addEventListener("mouseout",this.Lp,!0),window.addEventListener("selectstart",this.preventDefault,!1)):(window.removeEventListener("mousemove",this.Kp,!0),window.removeEventListener("mousedown",this.Jp,!0),window.removeEventListener("mouseup",this.Mp,!0),window.removeEventListener("mousewheel",this.Bh,!0),window.removeEventListener("DOMMouseScroll", +this.Bh,!0),window.removeEventListener("mouseout",this.Lp,!0),window.removeEventListener("selectstart",this.preventDefault,!1),b.addEventListener("mousemove",this.Kp,!1),b.addEventListener("mousedown",this.Jp,!1),b.addEventListener("mouseup",this.Mp,!1),b.addEventListener("mousewheel",this.Bh,!1),b.addEventListener("DOMMouseScroll",this.Bh,!1),b.addEventListener("mouseout",this.Lp,!1)),this.uC=a)}); +z.defineProperty(B,{position:"position"},function(){return this.sb},function(a){var b=this.sb;if(!b.N(a)){z.l(a,N,B,"position");var c=this.xb.copy();a=a.copy();if(!this.Vc&&null!==this.Fb){this.Vc=!0;var d=this.scale;Pk(this,a,this.ad,this.Jb/d,this.Ob/d,this.On,!1);this.Vc=!1}this.sb=a.V();a=this.Ua;a.wc&&hk(a,b,this.sb);this.Vc||this.fu(c,this.xb)}});z.defineProperty(B,{YH:"initialPosition"},function(){return this.wv},function(a){this.wv.N(a)||(z.l(a,N,B,"initialPosition"),this.wv=a.V())}); +z.defineProperty(B,{ZH:"initialScale"},function(){return this.xv},function(a){this.xv!==a&&(z.g(a,"number",B,"initialScale"),this.xv=a)});z.defineProperty(B,{tp:"grid"},function(){null===this.td&&Hk(this);return this.td},function(a){var b=this.td;if(b!==a){null===b&&(Hk(this),b=this.td);z.l(a,I,B,"grid");a.type!==Ik&&z.k("Diagram.grid must be a Panel of type Panel.Grid");var c=b.T;null!==c&&c.remove(b);this.td=a;a.name="GRID";null!==c&&c.add(a);hl(this);this.ta();this.j("grid",b,a)}}); +z.w(B,{xb:"viewportBounds"},function(){var a=this.wD;if(null===this.Fb)return a;var b=this.sb,c=this.bc;a.n(b.x,b.y,Math.max(this.Jb,0)/c,Math.max(this.Ob,0)/c);return a});z.defineProperty(B,{tE:"fixedBounds"},function(){return this.nv},function(a){var b=this.nv;b.N(a)||(z.l(a,w,B,"fixedBounds"),(u&&Infinity===a.width||-Infinity===a.width||Infinity===a.height||-Infinity===a.height)&&z.k("fixedBounds width/height must not be Infinity"),this.nv=a=a.V(),this.yc(),this.j("fixedBounds",b,a))}); +z.defineProperty(B,{AF:"scrollMargin"},function(){return this.iw},function(a){"number"===typeof a?a=new Db(a):z.l(a,Db,B,"scrollMargin");var b=this.iw;b.N(a)||(this.iw=a=a.V(),this.yc(),this.j("scrollMargin",b,a))});z.defineProperty(B,{LA:"scrollMode"},function(){return this.jw},function(a){var b=this.jw;b!==a&&(z.Ba(a,B,B,"scrollMode"),this.jw=a,a===sk&&Nk(this,!1),this.j("scrollMode",b,a))}); +z.defineProperty(B,{iF:"positionComputation"},function(){return this.bw},function(a){var b=this.bw;b!==a&&(null!==a&&z.g(a,"function",B,"positionComputation"),this.bw=a,Nk(this,!1),this.j("positionComputation",b,a))});z.defineProperty(B,{zF:"scaleComputation"},function(){return this.fw},function(a){var b=this.fw;b!==a&&(null!==a&&z.g(a,"function",B,"scaleComputation"),this.fw=a,Gl(this,this.scale,this.scale),this.j("scaleComputation",b,a))});z.w(B,{ad:"documentBounds"},function(){return this.hv}); +function Qk(a,b){a.Jj=!1;var c=a.hv;c.N(b)||(b=b.V(),a.hv=b,Nk(a,!1),a.Ja("DocumentBoundsChanged",null,c.copy()),Xk(a))}z.defineProperty(B,{scale:"scale"},function(){return this.bc},function(a){var b=this.bc;z.p(a,B,"scale");b!==a&&Gl(this,b,a)});z.defineProperty(B,{xl:"autoScale"},function(){return this.cm},function(a){var b=this.cm;b!==a&&(z.Ba(a,B,B,"autoScale"),this.cm=a,this.j("autoScale",b,a),a!==mh&&Nk(this,!1))}); +z.defineProperty(B,{DK:"initialAutoScale"},function(){return this.Yk},function(a){var b=this.Yk;b!==a&&(z.Ba(a,B,B,"initialAutoScale"),this.Yk=a,this.j("initialAutoScale",b,a))});z.defineProperty(B,{$H:"initialViewportSpot"},function(){return this.yv},function(a){var b=this.yv;b!==a&&(z.l(a,Q,B,"initialViewportSpot"),a.cd()||z.k("initialViewportSpot must be a specific Spot: "+a),this.yv=a,this.j("initialViewportSpot",b,a))}); +z.defineProperty(B,{XH:"initialDocumentSpot"},function(){return this.vv},function(a){var b=this.vv;b!==a&&(z.l(a,Q,B,"initialDocumentSpot"),a.cd()||z.k("initialViewportSpot must be a specific Spot: "+a),this.vv=a,this.j("initialDocumentSpot",b,a))});z.defineProperty(B,{Ah:"minScale"},function(){return this.Nv},function(a){z.p(a,B,"minScale");var b=this.Nv;b!==a&&(0<a?(this.Nv=a,this.j("minScale",b,a),a>this.scale&&(this.scale=a)):z.ka(a,"> 0",B,"minScale"))}); +z.defineProperty(B,{zh:"maxScale"},function(){return this.Kv},function(a){z.p(a,B,"maxScale");var b=this.Kv;b!==a&&(0<a?(this.Kv=a,this.j("maxScale",b,a),a<this.scale&&(this.scale=a)):z.ka(a,"> 0",B,"maxScale"))});z.defineProperty(B,{$l:"zoomPoint"},function(){return this.Bw},function(a){this.Bw.N(a)||(z.l(a,N,B,"zoomPoint"),this.Bw=a=a.V())}); +z.defineProperty(B,{WD:"contentAlignment"},function(){return this.On},function(a){var b=this.On;b.N(a)||(z.l(a,Q,B,"contentAlignment"),this.On=a=a.V(),this.j("contentAlignment",b,a),Nk(this,!1))});z.defineProperty(B,{EK:"initialContentAlignment"},function(){return this.mo},function(a){var b=this.mo;b.N(a)||(z.l(a,Q,B,"initialContentAlignment"),this.mo=a=a.V(),this.j("initialContentAlignment",b,a))}); +z.defineProperty(B,{padding:"padding"},function(){return this.df},function(a){"number"===typeof a?a=new Db(a):z.l(a,Db,B,"padding");var b=this.df;b.N(a)||(this.df=a=a.V(),this.yc(),this.j("padding",b,a))});z.w(B,{Mg:"nodes"},function(){return this.Eo.i});z.w(B,{links:"links"},function(){return this.yo.i});z.w(B,{oi:"parts"},function(){return this.mb.i}); +B.prototype.findTopLevelNodesAndLinks=function(){for(var a=new K(D),b=this.Eo.i;b.next();){var c=b.value;c.Bp&&a.add(c)}for(b=this.yo.i;b.next();)c=b.value,c.Bp&&a.add(c);return a.i};B.prototype.findTopLevelGroups=function(){return this.pl.i};z.defineProperty(B,{Sb:"layout"},function(){return this.he},function(a){var b=this.he;b!==a&&(z.l(a,yg,B,"layout"),null!==b&&(b.h=null,b.group=null),this.he=a,a.h=this,a.group=null,this.Qu=!0,this.j("layout",b,a),this.Ce())}); +B.prototype.layoutDiagram=function(a){Lk(this);a&&Yl(this,!0);il(this,!1)};function Yl(a,b){for(var c=a.pl.i;c.next();)fm(a,c.value,b);null!==a.Sb&&(b?a.Sb.Gf=!1:a.Sb.I())}function fm(a,b,c){if(null!==b){for(var d=b.vm.i;d.next();)fm(a,d.value,c);null!==b.Sb&&(c?b.Sb.Gf=!1:b.Sb.I())}} +function il(a,b){if(!a.zy){var c=a.Sb,d=a.$a;a.$a=!0;try{a.Wb("Layout");var e=a.Ua;1!==a.pa.Ih||e.nf||e.wc||e.rn("Layout");for(var g=a.pl.i;g.next();)gm(a,g.value,b);c.Gf||b&&!c.RE&&1!==a.pa.Ih||(c.doLayout(a),Lk(a),c.Gf=!0)}finally{a.Jd("Layout"),a.Qu=!c.Gf,a.$a=d}}}function gm(a,b,c){if(null!==b){for(var d=b.vm.i;d.next();)gm(a,d.value,c);d=b.Sb;null===d||d.Gf||c&&!d.RE||(b.ez=!b.location.F(),d.doLayout(b),b.I(hm),d.Gf=!0,ml(a,b))}} +z.defineProperty(B,{ce:"isTreePathToChildren"},function(){return this.Cv},function(a){var b=this.Cv;if(b!==a&&(z.g(a,"boolean",B,"isTreePathToChildren"),this.Cv=a,this.j("isTreePathToChildren",b,a),!this.pa.qb))for(a=this.Mg;a.next();)im(a.value)});B.prototype.findTreeRoots=function(){for(var a=new J(E),b=this.Mg;b.next();){var c=b.value;c.Bp&&null===c.op()&&a.add(c)}return a.i}; +z.defineProperty(B,{aB:"treeCollapsePolicy"},function(){return this.ww},function(a){var b=this.ww;b!==a&&(z.Ba(a,B,B,"treeCollapsePolicy"),this.ww=a,this.j("treeCollapsePolicy",b,a))});z.defineProperty(B,{xh:null},function(){return this.lC},function(a){this.lC=a}); +function tk(a){function b(a){var b=a.toLowerCase(),h=new J("function");c.add(a,h);c.add(b,h);d.add(a,a);d.add(b,a)}var c=new na("string",J),d=new na("string","string");b("AnimationStarting");b("AnimationFinished");b("BackgroundSingleClicked");b("BackgroundDoubleClicked");b("BackgroundContextClicked");b("ClipboardChanged");b("ClipboardPasted");b("DocumentBoundsChanged");b("ExternalObjectsDropped");b("InitialLayoutCompleted");b("LayoutCompleted");b("LinkDrawn");b("LinkRelinked");b("LinkReshaped");b("Modified"); +b("ObjectSingleClicked");b("ObjectDoubleClicked");b("ObjectContextClicked");b("PartCreated");b("PartResized");b("PartRotated");b("SelectionMoved");b("SelectionCopied");b("SelectionDeleting");b("SelectionDeleted");b("SelectionGrouped");b("SelectionUngrouped");b("ChangingSelection");b("ChangedSelection");b("SubGraphCollapsed");b("SubGraphExpanded");b("TextEdited");b("TreeCollapsed");b("TreeExpanded");b("ViewportBoundsChanged");a.By=c;a.Ay=d} +function Ia(a,b){var c=a.Ay.na(b);return null!==c?c:a.Ay.na(b.toLowerCase())}function jm(a,b){var c=a.By.na(b);if(null!==c)return c;c=a.By.na(b.toLowerCase());if(null!==c)return c;z.k("Unknown DiagramEvent name: "+b);return null}B.prototype.addDiagramListener=B.prototype.zz=function(a,b){z.g(a,"string",B,"addDiagramListener:name");z.g(b,"function",B,"addDiagramListener:listener");var c=jm(this,a);null!==c&&c.add(b)}; +B.prototype.removeDiagramListener=B.prototype.lF=function(a,b){z.g(a,"string",B,"removeDiagramListener:name");z.g(b,"function",B,"addDiagramListener:listener");var c=jm(this,a);null!==c&&c.remove(b)};B.prototype.raiseDiagramEvent=B.prototype.Ja=function(a,b,c){u&&z.g(a,"string",B,"raiseDiagramEvent:name");var d=jm(this,a),e=new Sf;e.h=this;e.name=Ia(this,a);void 0!==b&&(e.VA=b);void 0!==c&&(e.BA=c);a=d.length;if(1===a)d=d.ea(0),d(e);else if(0!==a)for(b=d.jc(),c=0;c<a;c++)d=b[c],d(e);return e.cancel}; +function oi(a,b){var c=!1;a.xb.nk(b)&&(c=!0);c=a.Vz(b,function(a){return a.ca},function(a){return a instanceof G},!0,function(a){return a instanceof G},c);if(0!==c.count)for(c=c.i;c.next();){var d=c.value;d.kj&&d.qc()}}B.prototype.isUnoccupied=B.prototype.Dp=function(a,b){void 0===b&&(b=null);return ja(this,!1,null,b).Dp(a.x,a.y,a.width,a.height)}; +function ja(a,b,c,d){null===a.Ed&&(a.Ed=new km);if(a.Ed.yp||a.Ed.group!==c||a.Ed.TA!==d){if(null===c){b=a.Jj?Mk(a):a.ad.copy();b.bg(100,100);a.Ed.initialize(b);b=z.lg();for(var e=a.Mg;e.next();){var g=e.value,h=g.layer;null!==h&&h.visible&&!h.Nc&&lm(a,g,d,b)}}else for(c.W.F()||c.Bf(),b=c.W.copy(),b.bg(20,20),a.Ed.initialize(b),b=z.lg(),e=c.Hc;e.next();)g=e.value,g instanceof E&&lm(a,g,d,b);z.dc(b);a.Ed.group=c;a.Ed.TA=d;a.Ed.yp=!1}else b&&mm(a.Ed);return a.Ed} +function lm(a,b,c,d){if(b!==c)if(b.isVisible()&&b.canAvoid()){c=b.getAvoidableRect(d);d=a.Ed.dp;b=a.Ed.bp;for(var e=c.x+c.width,g=c.y+c.height,h=c.x;h<e;h+=d){for(var k=c.y;k<g;k+=b)nm(a.Ed,h,k);nm(a.Ed,h,g)}for(k=c.y;k<g;k+=b)nm(a.Ed,e,k);nm(a.Ed,e,g)}else if(b instanceof F)for(b=b.Hc;b.next();)e=b.value,e instanceof E&&lm(a,e,c,d)}function om(a,b){null===a.Ed||a.Ed.yp||null!==b&&!b.canAvoid()||(a.Ed.yp=!0)} +B.prototype.simulatedMouseMove=B.prototype.Qx=function(a,b,c){if(null!==Lh){var d=Lh.h;c instanceof B||(c=null);var e=Mh;c!==e&&(null!==e&&e!==d&&null!==e.gb.me&&(Rh(e),Lh.ix=!1,e.gb.me.doSimulatedDragLeave()),Mh=c,null!==c&&c!==d&&null!==c.gb.me&&(Yh(),e=c.gb.me,Uh.contains(e)||Uh.add(e),c.gb.me.doSimulatedDragEnter()));if(null===c||c===d||!c.FD||c.ib||!c.$o)return!1;d=c.gb.me;null!==d&&(null!==a?b=c.ko(a):null===b&&(b=new N),c.Qb.ga=b,c.Qb.Fl=!1,c.Qb.up=!1,d.doSimulatedDragOver());return!0}return!1}; +B.prototype.simulatedMouseUp=B.prototype.LF=function(a,b,c,d){if(null!==Lh){null===d&&(d=b);b=Mh;var e=Lh.h;if(d!==b){if(null!==b&&b!==e&&null!==b.gb.me)return Rh(b),Lh.ix=!1,b.gb.me.doSimulatedDragLeave(),!1;Mh=d;null!==d&&null!==d.gb.me&&(Yh(),b=d.gb.me,Uh.contains(b)||Uh.add(b),d.gb.me.doSimulatedDragEnter())}if(null===d)return Lh.doCancel(),!0;if(d!==this)return null!==a&&(c=d.ko(a)),d.Qb.ga=c,d.Qb.Fl=!1,d.Qb.up=!0,a=d.gb.me,null!==a&&a.doSimulatedDrop(),a=Lh,null!==a&&(d=a.mayCopy(),a.Mf=d?"Copy": +"Move",a.stopTool()),!0}return!1};z.defineProperty(B,{MD:"autoScrollRegion"},function(){return this.Su},function(a){"number"===typeof a?a=new Db(a):z.l(a,Db,B,"autoScrollRegion");var b=this.Su;b.N(a)||(this.Su=a=a.V(),this.yc(),this.j("autoScrollRegion",b,a))});function ji(a,b){a.Ru.assign(b);pm(a,a.Ru).Mc(a.position)?Rh(a):qm(a)} +function qm(a){-1===a.In&&(a.In=z.setTimeout(function(){if(-1!==a.In){Rh(a);var b=a.R.event;if(null!==b){var c=pm(a,a.Ru);c.Mc(a.position)||(a.position=c,a.R.ga=a.bG(a.Ru),a.Qx(b,null,b.target.Z)||a.doMouseMove(),a.Jj=!0,Qk(a,a.sh()),a.ve=!0,a.cg(),qm(a))}}},a.tB))}function Rh(a){-1!==a.In&&(z.clearTimeout(a.In),a.In=-1)} +function pm(a,b){var c=a.position,d=a.MD;if(0>=d.top&&0>=d.left&&0>=d.right&&0>=d.bottom)return c;var e=a.xb,g=a.scale,e=z.zk(0,0,e.width*g,e.height*g),h=z.Tb(0,0);if(b.x>=e.x&&b.x<e.x+d.left){var k=Math.max(a.nu,1),k=k|0;h.x-=k;b.x<e.x+d.left/2&&(h.x-=k);b.x<e.x+d.left/4&&(h.x-=4*k)}else b.x<=e.x+e.width&&b.x>e.x+e.width-d.right&&(k=Math.max(a.nu,1),k|=0,h.x+=k,b.x>e.x+e.width-d.right/2&&(h.x+=k),b.x>e.x+e.width-d.right/4&&(h.x+=4*k));b.y>=e.y&&b.y<e.y+d.top?(k=Math.max(a.ou,1),k|=0,h.y-=k,b.y<e.y+ +d.top/2&&(h.y-=k),b.y<e.y+d.top/4&&(h.y-=4*k)):b.y<=e.y+e.height&&b.y>e.y+e.height-d.bottom&&(k=Math.max(a.ou,1),k|=0,h.y+=k,b.y>e.y+e.height-d.bottom/2&&(h.y+=k),b.y>e.y+e.height-d.bottom/4&&(h.y+=4*k));h.Mc(Id)||(c=new N(c.x+h.x/g,c.y+h.y/g));z.dc(e);z.A(h);return c}B.prototype.makeSVG=B.prototype.makeSvg=function(a){void 0===a&&(a=new ma);a.context="svg";a=rm(this,a);return null!==a?a.Vl:null}; +B.prototype.makeImage=function(a){void 0===a&&(a=new ma);var b=(a.document||document).createElement("img");b.src=this.wI(a);return b};B.prototype.makeImageData=B.prototype.wI=function(a){void 0===a&&(a=new ma);var b=rm(this,a);return null!==b?b.toDataURL(a.type,a.details):""};var sm=!1; +function rm(a,b){a.Ua.pi();a.cg();if(null===a.Fb)return null;"object"!==typeof b&&z.k("properties argument must be an Object.");var c=!1,d=b.size||null,e=b.scale||null;void 0!==b.scale&&isNaN(b.scale)&&(e="NaN");var g=b.maxSize;void 0===b.maxSize&&(c=!0,g="svg"===b.context?new Ea(Infinity,Infinity):new Ea(2E3,2E3));var h=b.position||null,k=b.parts||null,l=void 0===b.padding?1:b.padding,m=b.background||null,n=b.omitTemporary;void 0===n&&(n=!0);var p=b.document||document,q=b.elementFinished||null,r= +b.showTemporary;void 0===r&&(r=!n);n=b.showGrid;void 0===n&&(n=r);null!==d&&isNaN(d.width)&&isNaN(d.height)&&(d=null);"number"===typeof l?l=new Db(l):l instanceof Db||(l=new Db(0));l.left=Math.max(l.left,0);l.right=Math.max(l.right,0);l.top=Math.max(l.top,0);l.bottom=Math.max(l.bottom,0);a.ao=!1;ca(a.gd,!0);var s=new la(null,p),t=s.zl,v=s;if(!(d||e||k||h))return s.width=a.Jb+Math.ceil(l.left+l.right),s.height=a.Ob+Math.ceil(l.top+l.bottom),"svg"===b.context&&(t=v=new ed(s.Kd,p,q),t instanceof ed&& +(a.ao=!0)),tl(a,t,l,new Ea(s.width,s.height),a.bc,a.sb,k,m,r,n),a.ao=!0,v;var x=a.wb.Sw,y=new N(0,0),A=a.ad.copy();A.qJ(a.padding);if(r)for(var C=!0,C=a.Yb.o,L=C.length,H=0;H<L;H++){var U=C[H];if(U.visible&&U.Nc)for(var ea=U.mb.o,U=ea.length,W=0;W<U;W++){var P=ea[W];P.kx&&P.isVisible()&&(P=P.W,P.F()&&A.ri(P))}}y.x=A.x;y.y=A.y;if(null!==k){var ba,C=!0,ea=k.i;for(ea.reset();ea.next();)L=ea.value,L instanceof D&&(P=L,U=P.layer,null!==U&&!U.visible||null!==U&&!r&&U.Nc||!P.isVisible()||(P=P.W,P.F()&&(C? +(C=!1,ba=P.copy()):ba.ri(P))));C&&(ba=new w(0,0,0,0));A.width=ba.width;A.height=ba.height;y.x=ba.x;y.y=ba.y}null!==h&&h.F()&&(y=h,e||(e=x));C=ea=0;null!==l&&(ea=l.left+l.right,C=l.top+l.bottom);H=L=0;null!==d&&(L=d.width,H=d.height,isFinite(L)&&(L=Math.max(0,L-ea)),isFinite(H)&&(H=Math.max(0,H-C)));ba=h=0;null!==d&&null!==e?("NaN"===e&&(e=x),d.F()?(h=L,ba=H):isNaN(H)?(h=L,ba=A.height*e):(h=A.width*e,ba=H)):null!==d?d.F()?(e=Math.min(L/A.width,H/A.height),h=L,ba=H):isNaN(H)?(e=L/A.width,h=L,ba=A.height* +e):(e=H/A.height,h=A.width*e,ba=H):null!==e?"NaN"===e&&g.F()?(e=Math.min((g.width-ea)/A.width,(g.height-C)/A.height),e>x?(e=x,h=A.width,ba=A.height):(h=g.width,ba=g.height)):(h=A.width*e,ba=A.height*e):(e=x,h=A.width,ba=A.height);null!==l?(h+=ea,ba+=C):l=new Db(0);null!==g&&(d=g.width,g=g.height,"svg"!==b.context&&c&&!sm&&(h>d||ba>g)&&(z.trace("Diagram.makeImage(data): Diagram width or height is larger than the default max size. ("+Math.ceil(h)+"x"+Math.ceil(ba)+" vs 2000x2000) Consider increasing the max size."), +sm=!0),isNaN(d)&&(d=2E3),isNaN(g)&&(g=2E3),isFinite(d)&&(h=Math.min(h,d)),isFinite(g)&&(ba=Math.min(ba,g)));s.width=Math.ceil(h);s.height=Math.ceil(ba);"svg"===b.context&&(t=v=new ed(s.Kd,p,q),t instanceof ed&&(a.ao=!0));tl(a,t,l,new Ea(Math.ceil(h),Math.ceil(ba)),e,y,k,m,r,n);a.ao=!0;return v}B.inherit=function(a,b){z.g(a,"function",B,"inherit");z.g(b,"function",B,"inherit");b.BG&&z.k("Cannot inherit from "+z.kf(b));z.Qa(a,b)}; +function Ck(){this.EG="63ad05bbe23a1786468a4c741b6d2";this.pg=this.EG===this._tk?!0:null} +Ck.prototype.Zl=function(a){a.gd.setTransform(a.jd,0,0,a.jd,0,0);if(null===this.pg)a:{var b="f",c=window[z.Gg("76a715b2f73f148a")][z.Gg("72ba13b5")];a=z.Gg;if(window[a("7da7")]&&window[a("7da7")][a("76a115b6ed251eaf4692")]){this.pg=!0;var d=window[a("7da7")][a("76a115b6ed251eaf4692")],d=a(d).split(a("39e9")),e=a(d[1]).split("."),g=z[a("6cae19")].split(".");if(e[0]>g[0]||e[0]===g[0]&&e[1]>=g[1]){e=c[a("76ad18b4f73e")];for(g=c[a("73a612b6fb191d")](a("35e7"))+2;g<e;g++)b+=c[g];c=b[a("73a612b6fb191d")](a(d[2])); +0>c&&a(d[2])!==a("7da71ca0ad381e90")&&(c=b[a("73a612b6fb191d")](a("76a715b2ef3e149757")));0>c&&(c=b[a("73a612b6fb191d")](a("76a715b2ef3e149757")));this.pg=!(0<=c&&c<b[a("73a612b6fb191d")](a("35")))}}else{if(a("77bb5bb2f32603de")===window[a("76a715b2f73f148a")][a("6aba19a7ec351488")])try{this.pg=!window[a("4da118b7ec2108")]([a("5bb806bfea351a904a84515e1b6d38b6")])([a("49bc19a1e6")])([a("59bd04a1e6380fa5539b")])([a("7bb8069ae7")]===a(z.adym));if(!1===this.pg)break a;this.pg=!window[a("4da118b7ec2108")]([a("5bb806bfea351a904a84515e1b6d38b6")])([a("49bc19a1e6")])([a("59bd04a1e6380fa5539b6c7a197c31bb4cfd3e")])([a("7bb8069ae7")]=== +a(z.adym));if(!1===this.pg)break a}catch(h){}e=c[a("76ad18b4f73e")];for(g=c[a("73a612b6fb191d")](a("35e7"))+2;g<e;g++)b+=c[g];c=b[a("73a612b6fb191d")](a(z.adym));0>c&&a(z.adym)!==a("7da71ca0ad381e90")&&(c=b[a("73a612b6fb191d")](a("76a715b2ef3e149757")));if(this.pg=false)b=window.document[a("79ba13b2f7333e8846865a7d00")]("div"),c=a("02cncncn"),"."===c[0]&&(c=c[a("69bd14a0f724128a44")](1)),b[a("79a417a0f0181a8946")]=c,window.document[a("78a712aa")]?(window.document[a("78a712aa")][a("7bb806b6ed32388c4a875b")](b), +c=window[a("7dad0290ec3b0b91578e5b40007031bf")](b)[a("7dad0283f1390b81519f4645156528bf")](a("78a704b7e62456904c9b12701b6532a8")),window.document[a("78a712aa")][a("68ad1bbcf533388c4a875b")](b),c&&-1!==c.indexOf(a(z.aH))&&-1!==c.indexOf(a(z.bH))&&(this.pg=!1)):(this.pg=null,this.pg=!1)}}return 0<this.pg&&this!==this.CG?!0:!1};Ck.prototype.t=function(){this.CG=null}; +function Dk(a,b){void 0!==b&&null!==b||z.k("Diagram setup requires an argument DIV.");null!==a.Pb&&z.k("Diagram has already completed setup.");"string"===typeof b?a.Pb=window.document.getElementById(b):b instanceof HTMLDivElement?a.Pb=b:z.k("No DIV or DIV id supplied: "+b);null===a.Pb&&z.k("Invalid DIV id; could not get element with id: "+b);void 0!==a.Pb.Z&&z.k("Invalid div id; div already has a Diagram associated with it.");"static"===window.getComputedStyle(a.Pb,null).position&&(a.Pb.style.position= +"relative");a.Pb.style["-webkit-tap-highlight-color"]="rgba(255, 255, 255, 0)";a.Pb.style["-ms-touch-action"]="none";a.Pb.innerHTML="";a.Pb.Z=a;var c=new la(a);c.Kd.innerHTML="This text is displayed if your browser does not support the Canvas HTML element.";void 0!==c.style&&(c.style.position="absolute",c.style.top="0px",c.style.left="0px","rtl"===window.getComputedStyle(a.Pb,null).getPropertyValue("direction")&&(a.mr=!0),c.style.zIndex="2",c.style.DL="none",c.style.webkitUserSelect="none",c.style.MozUserSelect= +"none");a.Jb=a.Pb.clientWidth||1;a.Ob=a.Pb.clientHeight||1;a.Fb=c;a.gd=c.zl;var d=a.gd;a.uG=(window.devicePixelRatio||1)/(d.webkitBackingStorePixelRatio||d.mozBackingStorePixelRatio||d.msBackingStorePixelRatio||d.oBackingStorePixelRatio||d.backingStorePixelRatio||1);a.jd=a.computePixelRatio();vl(a,a.Jb,a.Ob);a.Ey=d[z.Gg("7eba17a4ca3b1a8346")][z.Gg("78a118b7")](d,z.Zl,4,4);a.Pb.insertBefore(c.Kd,a.Pb.firstChild);c=new la(null);c.width=1;c.height=1;a.Dy=c;a.aC=c.zl;var c=z.createElement("div"),e=z.createElement("div"); +c.style.position="absolute";c.style.overflow="auto";c.style.width=a.Jb+"px";c.style.height=a.Ob+"px";c.style.zIndex="1";e.style.position="absolute";e.style.width="1px";e.style.height="1px";a.Pb.appendChild(c);c.appendChild(e);c.onscroll=a.wG;c.onmousedown=a.JC;c.ontouchstart=a.JC;c.Z=a;c.zG=!0;c.AG=!0;a.kw=c;a.xs=e;a.GA=z.$D(function(){a.dk=null;a.ta()},300,!1);a.gG=z.$D(function(){Vj(a)},250,!1);a.preventDefault=function(a){a.preventDefault();return!1};a.Kp=function(b){if(a.isEnabled){a.jm=!0;var c= +a.Zc;z.hn&&c.mj?(b.preventDefault(),b.simulated=!0,a.Ks=b):(a.Zc=a.Qb,a.Qb=c,Tk(a,a,b,c,!0),a.Qx(b,null,b.target.Z)||(a.doMouseMove(),a.cb.isBeyondDragSize()&&(a.cl=0),ha(a,c,b)))}};a.Jp=function(b){if(a.isEnabled){a.jm=!0;var c=a.Zc;if(z.hn&&null!==a.Ks)a.Ks=b,b.preventDefault();else if(z.hn&&400>b.timeStamp-a.om)b.preventDefault();else if(a.$k)b.preventDefault();else{a.Zc=a.Qb;a.Qb=c;Tk(a,a,b,c,!0);c.Fl=!0;c.Pe=b.detail;if(z.ME||z.NE)b.timeStamp-a.om<a.tD&&!a.cb.isBeyondDragSize()?a.cl++:a.cl=1, +a.om=b.timeStamp,c.Pe=a.cl;a.Fi=c;!0===c.Yq.simulated?(b.preventDefault(),b.simulated=!0):(u&&u.eF&&(window.eF=a.lp(c.ga)),Lh=null,a.doMouseDown(),a.Fi=a.Fi.copy(),1===b.button?b.preventDefault():ha(a,c,b))}}};a.Mp=function(b){if(a.isEnabled)if(a.$k&&2===b.button)b.preventDefault();else if(a.$k&&0===b.button&&(a.$k=!1),a.Ss)b.preventDefault();else{a.jm=!0;var c=a.Zc;if(z.hn){if(400>b.timeStamp-a.om){b.preventDefault();return}a.om=b.timeStamp}if(z.hn&&null!==a.Ks)a.Ks=null,b.preventDefault();else{a.Zc= +a.Qb;a.Qb=c;Tk(a,a,b,c,!0);c.up=!0;c.Pe=b.detail;if(z.ME||z.NE)c.Pe=a.cl;c.bubbles=b.bubbles;b.target.Z&&(c.Tg=b.target.Z);a.LF(b,null,new N,c.Tg)||(a.doMouseUp(),Rh(a),ha(a,c,b))}}};a.Bh=function(b){if(a.isEnabled){var c=a.Zc;a.Zc=a.Qb;a.Qb=c;Tk(a,a,b,c,!0);c.bubbles=!0;c.Dl=void 0!==b.wheelDelta?b.wheelDelta:-40*b.detail;a.doMouseWheel();ha(a,c,b)}};a.Lp=function(){if(a.isEnabled){a.jm=!1;var b=a.cb;b.cancelWaitAfter();b instanceof gh&&b.hideToolTip()}};a.YF=function(b){if(a.isEnabled){a.Ss=!1; +a.$k=!0;var c=a.Zc;a.Zc=a.Qb;a.Qb=c;Vk(a,b,b.targetTouches[0],c,1<b.touches.length);a.doMouseDown();ha(a,c,b)}};a.XF=function(b){if(a.isEnabled){var c=a.Zc;a.Zc=a.Qb;a.Qb=c;var d=null;0<b.changedTouches.length?d=b.changedTouches[0]:0<b.targetTouches.length&&(d=b.targetTouches[0]);Wk(a,b,d,c,1<b.touches.length);a.Qx(d?d:b,null,c.Tg)||a.doMouseMove();ha(a,c,b)}};a.WF=function(b){if(a.isEnabled)if(a.Ss)b.preventDefault();else{var c=a.Zc;a.Zc=a.Qb;a.Qb=c;if(1<b.touches.length)a.rp("hasGestureZoom")&& +(a.My=!1);else{var d=null,e=null;0<b.changedTouches.length?e=b.changedTouches[0]:0<b.targetTouches.length&&(e=b.targetTouches[0]);c.h=a;c.Pe=1;if(null!==e){d=window.document.elementFromPoint(e.clientX,e.clientY);null!==d&&d.Z instanceof B&&d.Z!==a&&Uk(d.Z,e,c);Uk(a,b.changedTouches[0],c);var m=e.screenX,n=e.screenY,p=a.zC;b.timeStamp-a.om<a.tD&&!(25<Math.abs(p.x-m)||25<Math.abs(p.y-n))?a.cl++:a.cl=1;c.Pe=a.cl;a.om=b.timeStamp;a.zC.n(m,n)}c.xd=0;c.button=0;c.buttons=1;c.Fl=!1;c.up=!0;c.Dl=0;c.Gc=!1; +c.bubbles=!1;c.event=b;c.timestamp=Date.now();c.Tg=null===d?b.target.Z:d.Z?d.Z:null;c.Ge=null;a.LF(e?e:b,null,new N,c.Tg)||a.doMouseUp();ha(a,c,b);a.$k=!1}}};a.OI=function(b){if("touch"===b.pointerType){var c=a.TC;void 0===c[b.pointerId]&&(a.aw++,c[b.pointerId]=b);a.Uf[0]=null;a.Uf[1]=null;for(var d in c)if(null===a.Uf[0])a.Uf[0]=c[d];else if(null===a.Uf[1]){a.Uf[1]=c[d];break}a.isEnabled&&(a.Ss=!1,a.$k=!0,c=a.Zc,a.Zc=a.Qb,a.Qb=c,Vk(a,b,b,c,1<a.aw),a.doMouseDown(),ha(a,c,b))}};a.RI=function(b){if("touch"=== +b.pointerType&&!(2>a.aw)){var c=a.Uf;c[0].pointerId===b.pointerId&&(c[0]=b);c[1].pointerId===b.pointerId&&(c[1]=b);a.isEnabled&&(c=a.Zc,a.Zc=a.Qb,a.Qb=c,Wk(a,b,b,c,!0),a.Qx(b,null,c.Tg)||(a.doMouseMove(),ha(a,c,b)))}};a.QI=function(b){if("touch"===b.pointerType){var c=a.TC;void 0!==c[b.pointerId]&&(a.aw--,delete c[b.pointerId],c=a.Uf,null!==c[0]&&c[0].pointerId===b.pointerId&&(c[0]=null),null!==c[1]&&c[1].pointerId===b.pointerId&&(c[1]=null))}};ca(d,!0);Gk(a)} +function tm(a){1<arguments.length&&z.k("Palette constructor can only take one optional argument, the DIV HTML element or its id.");B.call(this,a);this.kt=!0;this.vl=!1;this.ib=!0;this.WD=$b;this.Sb=new um}z.Qa(tm,B);z.ia("Palette",tm); +function zk(a){1<arguments.length&&z.k("Overview constructor can only take one optional argument, the DIV HTML element or its id.");B.call(this,a);this.Ua.isEnabled=!1;this.Vc=!0;this.Xj=null;this.kv=!0;this.jJ("drawShadows",!1);var b=new D,c=new X;c.stroke="magenta";c.ub=2;c.fill="transparent";c.name="BOXSHAPE";b.wk=!0;b.Jx="BOXSHAPE";b.tx="BOXSHAPE";b.vF="BOXSHAPE";b.cursor="move";b.add(c);this.dm=b;c=new da;c.type=aj;c.of=ec;var d=new bj;d.Ff=!0;c.add(d);d=new X;d.kk=ec;d.Hb="Rectangle";d.Aa=new Ea(64, +64);d.cursor="se-resize";d.alignment=ic;c.add(d);b.tF=c;this.Rm=this.lk=!1;this.xf=this.mt=!0;this.MD=0;this.pz=new la(null);this.DG=this.pz.zl;this.gb.me=new vm;this.gb.wF=new wm;var e=this;this.click=function(){var a=e.Xj;if(null!==a){var b=a.xb,c=e.R.ga;a.position=new N(c.x-b.width/2,c.y-b.height/2)}};this.gF=function(){xm(e)};this.fF=function(){null!==e.Xj&&(e.yc(),e.ta())};this.xl=Rk;this.Vc=!1}z.Qa(zk,B);z.ia("Overview",zk); +function ym(a){a.Vc||a.Vd||!1!==a.Wf||(a.Wf=!0,requestAnimationFrame(function(){if(a.Wf&&!a.Vd&&(a.Wf=!1,null!==a.Pb)){a.Vd=!0;Lk(a);a.ad.F()||Qk(a,a.sh());null===a.Pb&&z.k("No div specified");null===a.Fb&&z.k("No canvas specified");if(a.ve){var b=a.Xj;if(null!==b&&!b.Ua.nf&&!b.Ua.wc){var b=a.gd,c=a.pz;b.setTransform(1,0,0,1,0,0);b.clearRect(0,0,a.Fb.width,a.Fb.height);b.drawImage(c.Kd,0,0);c=a.Hd;c.reset();1!==a.scale&&c.scale(a.scale);0===a.position.x&&0===a.position.y||c.translate(-a.position.x, +-a.position.y);b.scale(a.jd,a.jd);b.transform(c.m11,c.m12,c.m21,c.m22,c.dx,c.dy);for(var c=a.Yb.o,d=c.length,e=0;e<d;e++)c[e].ff(b,a);a.Zk=!1;a.ve=!1}}a.Vd=!1}}))}zk.prototype.computePixelRatio=function(){return 1}; +zk.prototype.ff=function(){null===this.Pb&&z.k("No div specified");null===this.Fb&&z.k("No canvas specified");if(this.ve){var a=this.Xj;if(null!==a&&!a.Ua.nf){ql(this);var b=a.tp;(null!==b&&b.visible&&isNaN(b.width)||isNaN(b.height))&&hl(a);var c=this.Fb,b=this.gd,d=this.pz,e=this.DG;d.width=c.width;d.height=c.height;ca(b,!0);b.setTransform(1,0,0,1,0,0);b.clearRect(0,0,c.width,c.height);var g=this.Hd;g.reset();1!==this.scale&&g.scale(this.scale);0===this.position.x&&0===this.position.y||g.translate(-this.position.x, +-this.position.y);b.scale(this.jd,this.jd);b.transform(g.m11,g.m12,g.m21,g.m22,g.dx,g.dy);for(var h=this.kv,k=this.xb,l=a.Yb.o,m=l.length,a=0;a<m;a++){var n=l[a],p=b,q=k,r=h;if(n.visible&&0!==n.Xc&&(void 0===r&&(r=!0),r||!n.Nc)){1!==n.Xc&&(p.globalAlpha=n.Xc);for(var r=this.scale,n=n.mb.o,s=n.length,t=0;t<s;t++){var v=n[t],x=v.W;x.Jg(q)&&(1<x.width*r||1<x.height*r?v.ff(p,this):lk(v,p))}p.globalAlpha=1}}e.drawImage(c.Kd,0,0);u&&u.cj&&(e.fillStyle="red",e.fillRect(0,d.height/2,d.width,4));c=this.Yb.o; +d=c.length;for(a=0;a<d;a++)c[a].ff(b,this);u&&(u.Rz||u.cj)&&u.Qz(b,this,g);this.ve=this.Zk=!1}}}; +z.defineProperty(zk,{AA:"observed"},function(){return this.Xj},function(a){var b=this.Xj;null!==a&&z.l(a,B,zk,"observed");a instanceof zk&&z.k("Overview.observed Diagram may not be an Overview itself: "+a);b!==a&&(null!==b&&(this.remove(this.rh),b.lF("ViewportBoundsChanged",this.gF),b.lF("DocumentBoundsChanged",this.fF),b.Xv.remove(this)),this.Xj=a,null!==a&&(a.zz("ViewportBoundsChanged",this.gF),a.zz("DocumentBoundsChanged",this.fF),a.Xv.add(this),this.add(this.rh),xm(this)),this.yc(),this.j("observed", +b,a))});z.defineProperty(zk,{rh:"box"},function(){return this.dm},function(a){var b=this.dm;b!==a&&(this.dm=a,this.remove(b),this.add(this.dm),xm(this),this.j("box",b,a))});z.defineProperty(zk,{yK:"drawsTemporaryLayers"},function(){return this.kv},function(a){this.kv!==a&&(this.kv=a,this.Sp())}); +function xm(a){var b=a.rh;if(null!==b){var c=a.Xj;if(null!==c){a.ve=!0;var c=c.xb,d=b.un,e=z.Xl();e.n(c.width,c.height);d.Aa=e;z.qk(e);a=2/a.scale;d instanceof X&&(d.ub=a);b.location=new N(c.x-a/2,c.y-a/2)}}}zk.prototype.sh=function(){var a=this.Xj;return null===a?Jd:a.ad};zk.prototype.GE=function(){!0!==this.ve&&(this.ve=!0,ym(this))};zk.prototype.fu=function(a){this.Vc||(Kk(this),this.ta(),Xk(this),this.yc(),xm(this),this.Ja("ViewportBoundsChanged",null,a))}; +function vm(){lh.call(this);this.kl=null}z.Qa(vm,lh);vm.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.h;if(null===a||!a.vl||!a.xf)return!1;var b=a.AA;if(null===b)return!1;if(null===this.findDraggablePart()){var c=b.xb;this.kl=new N(c.width/2,c.height/2);a=a.Fc.ga;b.position=new N(a.x-this.kl.x,a.y-this.kl.y)}return!0};vm.prototype.doActivate=function(){this.kl=null;lh.prototype.doActivate.call(this)}; +vm.prototype.moveParts=function(){var a=this.h,b=a.AA;if(null!==b){var c=a.rh;if(null!==c){if(null===this.kl){var d=a.Fc.ga,c=c.location;this.kl=new N(d.x-c.x,d.y-c.y)}a=a.R.ga;b.position=new N(a.x-this.kl.x,a.y-this.kl.y)}}};function wm(){Zi.call(this)}z.Qa(wm,Zi);wm.prototype.resize=function(a){var b=this.h.AA;if(null!==b){var c=b.xb.copy();b.position=a.position;(c.width!==a.width||c.height!==a.height)&&0<a.width&&0<a.height&&(b.scale=Math.min(c.width/a.width,c.height/a.height))}}; +function Da(a){1<arguments.length&&z.k("Brush constructor can take at most one optional argument, the Brush type.");z.kc(this);this.G=!1;void 0===a?(this.ba=ug,this.Mn="black"):"string"===typeof a?(this.ba=ug,u&&!Ca(a)&&z.k('Color "'+a+'" is not a valid color string for Brush constructor'),this.Mn=a):(u&&z.Ba(a,Da,Da,"constructor:type"),this.ba=a,this.Mn="black");var b=this.ba;b===vg?(this.Oo=$b,this.co=hc):this.co=b===yd?this.Oo=ec:this.Oo=Yb;this.rw=0;this.lv=NaN;this.bh=this.$v=this.ah=null;this.uy= +this.Nn=0}z.ia("Brush",Da);var ug;Da.Solid=ug=z.s(Da,"Solid",0);var vg;Da.Linear=vg=z.s(Da,"Linear",1);var yd;Da.Radial=yd=z.s(Da,"Radial",2);var zm;Da.Pattern=zm=z.s(Da,"Pattern",4);Da.prototype.copy=function(){var a=new Da;a.ba=this.ba;a.Mn=this.Mn;a.Oo=this.Oo.V();a.co=this.co.V();a.rw=this.rw;a.lv=this.lv;null!==this.ah&&(a.ah=this.ah.copy());a.$v=this.$v;return a};Da.prototype.La=function(){this.freeze();Object.freeze(this);return this}; +Da.prototype.freeze=function(){this.G=!0;null!==this.ah&&this.ah.freeze();return this};Da.prototype.Wa=function(){Object.isFrozen(this)&&z.k("cannot thaw constant: "+this);this.G=!1;null!==this.ah&&this.ah.Wa();return this}; +Da.prototype.toString=function(){var a="Brush(";if(this.type===ug)a+=this.color;else if(a=this.type===vg?a+"Linear ":this.type===yd?a+"Radial ":this.type===zm?a+"Pattern ":a+"(unknown) ",a+=this.start+" "+this.end,null!==this.st)for(var b=this.st.i;b.next();)a+=" "+b.key+":"+b.value;return a+")"}; +Da.prototype.addColorStop=Da.prototype.addColorStop=function(a,b){this.G&&z.oa(this);("number"!==typeof a||!isFinite(a)||1<a||0>a)&&z.ka(a,"0 <= loc <= 1",Da,"addColorStop:loc");z.g(b,"string",Da,"addColorStop:color");u&&!Ca(b)&&z.k('Color "'+b+'" is not a valid color string for Brush.addColorStop');null===this.ah&&(this.ah=new na("number","string"));this.ah.add(a,b);this.ba===ug&&(this.type=vg);this.bh=null}; +z.defineProperty(Da,{type:"type"},function(){return this.ba},function(a){this.G&&z.oa(this,a);z.Ba(a,Da,Da,"type");this.ba=a;this.start.Be()&&(a===vg?this.start=$b:a===yd&&(this.start=ec));this.end.Be()&&(a===vg?this.end=hc:a===yd&&(this.end=ec));this.bh=null});z.defineProperty(Da,{color:"color"},function(){return this.Mn},function(a){this.G&&z.oa(this,a);u&&!Ca(a)&&z.k('Color "'+a+'" is not a valid color string for Brush.color');this.Mn=a;this.bh=null}); +z.defineProperty(Da,{start:"start"},function(){return this.Oo},function(a){this.G&&z.oa(this,a);z.l(a,Q,Da,"start");this.Oo=a.V();this.bh=null});z.defineProperty(Da,{end:"end"},function(){return this.co},function(a){this.G&&z.oa(this,a);z.l(a,Q,Da,"end");this.co=a.V();this.bh=null});z.defineProperty(Da,{wu:"startRadius"},function(){return this.rw},function(a){this.G&&z.oa(this,a);z.p(a,Da,"startRadius");0>a&&z.ka(a,">= zero",Da,"startRadius");this.rw=a;this.bh=null}); +z.defineProperty(Da,{xt:"endRadius"},function(){return this.lv},function(a){this.G&&z.oa(this,a);z.p(a,Da,"endRadius");0>a&&z.ka(a,">= zero",Da,"endRadius");this.lv=a;this.bh=null});z.defineProperty(Da,{st:"colorStops"},function(){return this.ah},function(a){this.G&&z.oa(this,a);u&&z.l(a,na,Da,"colorStops");this.ah=a;this.bh=null});z.defineProperty(Da,{pattern:"pattern"},function(){return this.$v},function(a){this.G&&z.oa(this,a);this.$v=a;this.bh=null}); +Da.randomColor=function(a,b){void 0===a&&(a=128);u&&(z.p(a,Da,"randomColor:min"),(0>a||255<a)&&z.ka(a,"0 <= min <= 255",Da,"randomColor:min"));void 0===b&&(b=Math.max(a,255));u&&(z.p(b,Da,"randomColor:max"),(b<a||255<b)&&z.ka(b,"min <= max <= 255",Da,"randomColor:max"));var c=Math.abs(b-a),d=Math.floor(a+Math.random()*c).toString(16),e=Math.floor(a+Math.random()*c).toString(16),c=Math.floor(a+Math.random()*c).toString(16);2>d.length&&(d="0"+d);2>e.length&&(e="0"+e);2>c.length&&(c="0"+c);return"#"+ +d+e+c};var Am=(new la(null)).zl,Ca;Da.isValidColor=Ca=function(a){if("black"===a)return!0;if(""===a)return!1;u&&z.g(a,"string",Da,"isValidColor");Am.fillStyle="#000000";var b=Am.fillStyle;Am.fillStyle=a;if(Am.fillStyle!==b)return!0;Am.fillStyle="#FFFFFF";b=Am.fillStyle;Am.fillStyle=a;return Am.fillStyle!==b}; +function O(){z.kc(this);this.ja=30723;this.Xc=1;this.mh=null;this.Ub="";this.uc=this.Nb=null;this.sb=(new N(NaN,NaN)).freeze();this.tf=fe;this.Uj=Pd;this.Sj=de;this.Hd=new Fa;this.Ak=new Fa;this.gl=new Fa;this.bc=this.iv=1;this.bm=0;this.ei=Bm;this.Er=Kd;this.ud=(new w(NaN,NaN,NaN,NaN)).freeze();this.Xb=(new w(NaN,NaN,NaN,NaN)).freeze();this.Wc=(new w(0,0,NaN,NaN)).freeze();this.Vs=this.Zq=this.la=this.fs=this.gs=null;this.Ws=this.$q=Infinity;this.oq=this.Ie=Pc;this.us=0;this.Ui=1;this.wq=0;this.xi= +1;this.Os=null;this.zs=-Infinity;this.ys=0;this.As=Id;this.Bs=Qi;this.Hq="";this.Ac=this.ma=null;this.Jn=-1;this.Am=this.Js=this.wi=this.Qk=this.No=null}z.ji(O);z.ia("GraphObject",O); +O.prototype.cloneProtected=function(a){a.ja=this.ja|6144;a.Xc=this.Xc;a.Ub=this.Ub;a.Nb=this.Nb;a.uc=this.uc;a.sb.assign(this.sb);a.tf=this.tf.V();a.Uj=this.Uj.V();a.Sj=this.Sj.V();a.gl=this.gl.copy();a.bc=this.bc;a.bm=this.bm;a.ei=this.ei;a.Er=this.Er.V();a.ud.assign(this.ud);a.Xb.assign(this.Xb);a.Wc.assign(this.Wc);a.fs=this.fs;null!==this.la&&(a.la=this.la.copy());a.Zq=this.Zq;a.Vs=this.Vs;a.$q=this.$q;a.Ws=this.Ws;a.Ie=this.Ie.V();a.oq=this.oq.V();a.us=this.us;a.Ui=this.Ui;a.wq=this.wq;a.xi= +this.xi;a.Os=this.Os;a.zs=this.zs;a.ys=this.ys;a.As=this.As.V();a.Bs=this.Bs;a.Hq=this.Hq;null!==this.ma&&(a.ma=this.ma.copy());a.Ac=this.Ac;a.Jn=this.Jn;null!==this.Qk&&(a.Qk=z.Al(this.Qk));null!==this.wi&&(a.wi=this.wi.copy());a.Js=this.Js};O.prototype.addCopyProperty=O.prototype.MG=function(a){var b=this.Qk;if(z.isArray(b))for(var c=0;c<b.length;c++){if(b[c]===a)return}else this.Qk=b=[];b.push(a)};O.prototype.ki=function(a){a.gs=null;a.Am=null;a.Q()}; +O.prototype.clone=function(){var a=new this.constructor;this.cloneProtected(a);if(null!==this.Qk)for(var b=0;b<this.Qk.length;b++){var c=this.Qk[b];a[c]=this[c]}return a};O.prototype.copy=function(){return this.clone()};O.prototype.toString=function(){return z.kf(Object.getPrototypeOf(this))+"#"+z.nd(this)};var cj;O.None=cj=z.s(O,"None",0);var Bm;O.Default=Bm=z.s(O,"Default",0);var Cm;O.Vertical=Cm=z.s(O,"Vertical",4);var Dm;O.Horizontal=Dm=z.s(O,"Horizontal",5);var lf;O.Fill=lf=z.s(O,"Fill",3);var ej; +O.Uniform=ej=z.s(O,"Uniform",1);var fj;O.UniformToFill=fj=z.s(O,"UniformToFill",2);function Em(a){null===a.ma&&(a.ma=new Fm)}O.prototype.Ue=function(){if(null===this.la){var a=new Gm;a.Hj=Yb;a.hk=Yb;a.Fj=10;a.fk=10;a.Ej=Hm;a.ek=Hm;a.Gj=0;a.gk=0;this.la=a}}; +function Im(a,b,c,d,e,g,h){var k=.001,l=g.length;a.moveTo(b,c);d-=b;k=e-c;0===d&&(d=.001);e=k/d;for(var m=Math.sqrt(d*d+k*k),n=0,p=!0,q=0===h?!1:!0;.1<=m;){if(q){k=g[n++%l];for(k-=h;0>k;)k+=g[n++%l],p=!p;q=!1}else k=g[n++%l];k>m&&(k=m);var r=Math.sqrt(k*k/(1+e*e));0>d&&(r=-r);b+=r;c+=e*r;p?a.lineTo(b,c):a.moveTo(b,c);m-=k;p=!p}}O.prototype.raiseChangedEvent=O.prototype.Rc=function(a,b,c,d,e,g,h){var k=this.ca;null!==k&&(k.sn(a,b,c,d,e,g,h),0!==(this.ja&1024)&&c===this&&a===Uf&&Jm(this,k,b))}; +function Jm(a,b,c){var d=a.np();if(null!==d)for(var e=a.Ac.i;e.next();){var g=e.value,h=null;if(null!==g.xn){h=ch(g,d,a);if(null===h)continue;g.Sx(a,h,c,null)}else if(g.St){var k=b.h;null===k||k.Ee||g.Sx(a,k.ha.uk,c,k)}else{var l=d.data;if(null===l)continue;k=b.h;null===k||k.Ee||g.Sx(a,l,c,k)}null!==h&&(k=d.Yw(g.Wl),null!==k&&g.eG(k,h,c))}}O.prototype.Yw=function(a){return this.Jn===a?this:null};O.prototype.raiseChanged=O.prototype.j=function(a,b,c){this.Rc(Uf,a,this,b,c)}; +function Km(a,b,c,d,e){var g=a.ud,h=a.gl;h.reset();Lm(a,h,b,c,d,e);a.gl=h;g.x=b;g.y=c;g.width=d;g.height=e;h.Pt()||h.aG(g)}function Mm(a,b,c,d){if(!1===a.jg)return!1;d.multiply(a.transform);return c?a.Jg(b,d):a.Xm(b,d)} +O.prototype.rE=function(a,b,c){if(!1===this.jg)return!1;var d=this.Ga;b=a.Af(b);var e=!1;c&&(e=ub(a.x,a.y,0,0,0,d.height)<b||ub(a.x,a.y,0,d.height,d.width,d.height)<b||ub(a.x,a.y,d.width,d.height,d.width,0)<b||ub(a.x,a.y,d.width,0,0,0)<b);c||(e=ub(a.x,a.y,0,0,0,d.height)<b&&ub(a.x,a.y,0,d.height,d.width,d.height)<b&&ub(a.x,a.y,d.width,d.height,d.width,0)<b&&ub(a.x,a.y,d.width,0,0,0)<b);return e};O.prototype.Wg=function(){return!0}; +O.prototype.containsPoint=O.prototype.Ma=function(a){u&&z.l(a,N,O,"containsPoint:p");var b=z.O();b.assign(a);this.transform.Cb(b);var c=this.W;if(!c.F())return z.A(b),!1;var d=this.h;if(null!==d&&d.$k){var e=d.rp("extraTouchThreshold"),g=d.rp("extraTouchArea"),h=g/2,k=this.Ga,d=this.hj()*d.scale,l=1/d;if(k.width*d<e&&k.height*d<e)return a=Jb(c.x-h*l,c.y-h*l,c.width+g*l,c.height+g*l,b.x,b.y),z.A(b),a}if(this instanceof da||this instanceof X?Jb(c.x-5,c.y-5,c.width+10,c.height+10,b.x,b.y):c.Ma(b))return e= +!1,e=this.wi&&!this.wi.Ma(b)?!1:null!==this.uc&&c.Ma(b)?!0:null!==this.Nb&&this.Wc.Ma(a)?!0:this.mk(a),z.A(b),e;z.A(b);return!1};O.prototype.mk=function(a){var b=this.Ga;return Jb(0,0,b.width,b.height,a.x,a.y)}; +O.prototype.containsRect=O.prototype.nk=function(a){u&&z.l(a,w,O,"containsRect:r");if(0===this.angle)return this.W.nk(a);var b=this.Ga,b=z.zk(0,0,b.width,b.height),c=this.transform,d=!1,e=z.Tb(a.x,a.y);b.Ma(c.li(e))&&(e.n(a.x,a.bottom),b.Ma(c.li(e))&&(e.n(a.right,a.bottom),b.Ma(c.li(e))&&(e.n(a.right,a.y),b.Ma(c.li(e))&&(d=!0))));z.A(e);z.dc(b);return d}; +O.prototype.containedInRect=O.prototype.Xm=function(a,b){u&&z.l(a,w,O,"containedInRect:r");if(void 0===b)return a.nk(this.W);var c=this.Ga,d=!1,e=z.Tb(0,0);a.Ma(b.Cb(e))&&(e.n(0,c.height),a.Ma(b.Cb(e))&&(e.n(c.width,c.height),a.Ma(b.Cb(e))&&(e.n(c.width,0),a.Ma(b.Cb(e))&&(d=!0))));z.A(e);return d}; +O.prototype.intersectsRect=O.prototype.Jg=function(a,b){u&&z.l(a,w,O,"intersectsRect:r");if(void 0===b&&(b=this.transform,0===this.angle))return a.Jg(this.W);var c=this.Ga,d=b,e=z.Tb(0,0),g=z.Tb(0,c.height),h=z.Tb(c.width,c.height),k=z.Tb(c.width,0),l=!1;if(a.Ma(d.Cb(e))||a.Ma(d.Cb(g))||a.Ma(d.Cb(h))||a.Ma(d.Cb(k)))l=!0;else{var c=z.zk(0,0,c.width,c.height),m=z.Tb(a.x,a.y);c.Ma(d.li(m))?l=!0:(m.n(a.x,a.bottom),c.Ma(d.li(m))?l=!0:(m.n(a.right,a.bottom),c.Ma(d.li(m))?l=!0:(m.n(a.right,a.y),c.Ma(d.li(m))&& +(l=!0))));z.A(m);z.dc(c);!l&&(Pe(a,e,g)||Pe(a,g,h)||Pe(a,h,k)||Pe(a,k,e))&&(l=!0)}z.A(e);z.A(g);z.A(h);z.A(k);return l};O.prototype.getDocumentPoint=O.prototype.eb=function(a,b){void 0===b&&(b=new N);a.Be()&&z.k("getDocumentPoint:s Spot must be specific: "+a.toString());var c=this.Ga;b.n(a.x*c.width+a.offsetX,a.y*c.height+a.offsetY);this.qh.Cb(b);return b}; +O.prototype.getDocumentAngle=O.prototype.Kl=function(){var a;a=this.qh;1===a.m11&&0===a.m12?a=0:(a=180*Math.atan2(a.m12,a.m11)/Math.PI,0>a&&(a+=360));return a};O.prototype.getDocumentScale=O.prototype.hj=function(){if(0!==(this.ja&4096)===!1)return this.iv;var a=this.bc;return null!==this.T?a*this.T.hj():a};O.prototype.getLocalPoint=O.prototype.wE=function(a,b){void 0===b&&(b=new N);b.assign(a);this.qh.li(b);return b}; +O.prototype.getNearestIntersectionPoint=O.prototype.xE=function(a,b,c){return this.sp(a.x,a.y,b.x,b.y,c)};f=O.prototype;f.sp=function(a,b,c,d,e){var g=this.transform,h=1/(g.m11*g.m22-g.m12*g.m21),k=g.m22*h,l=-g.m12*h,m=-g.m21*h,n=g.m11*h,p=h*(g.m21*g.dy-g.m22*g.dx),q=h*(g.m12*g.dx-g.m11*g.dy);if(null!==this.wl)return g=this.W,Ne(g.left,g.top,g.right,g.bottom,a,b,c,d,e);h=a*k+b*m+p;a=a*l+b*n+q;b=c*k+d*m+p;c=c*l+d*n+q;e.n(0,0);d=this.Ga;c=Ne(0,0,d.width,d.height,h,a,b,c,e);e.transform(g);return c}; +function uj(a,b,c,d,e){if(!1!==nl(a)){var g=a.margin,h=g.right+g.left,g=g.top+g.bottom;b=Math.max(b-h,0);c=Math.max(c-g,0);e=e||0;d=Math.max((d||0)-h,0);e=Math.max(e-g,0);var h=a.angle,g=0,g=a.Aa,k=0;a.ub&&(k=a.ub);90===h||270===h?(b=isFinite(g.height)?g.height+k:b,c=isFinite(g.width)?g.width+k:c):(b=isFinite(g.width)?g.width+k:b,c=isFinite(g.height)?g.height+k:c);var g=d||0,k=e||0,l=a instanceof I;switch(Nm(a,!0)){case cj:k=g=0;l&&(c=b=Infinity);break;case lf:isFinite(b)&&b>d&&(g=b);isFinite(c)&& +c>e&&(k=c);break;case Dm:isFinite(b)&&b>d&&(g=b);k=0;l&&(c=Infinity);break;case Cm:isFinite(c)&&c>e&&(k=c),g=0,l&&(b=Infinity)}var l=a.Xe,m=a.dg;g>l.width&&m.width<l.width&&(g=l.width);k>l.height&&m.height<l.height&&(k=l.height);d=Math.max(g/a.scale,m.width);e=Math.max(k/a.scale,m.height);l.width<d&&(d=Math.min(m.width,d));l.height<e&&(e=Math.min(m.height,e));b=Math.min(l.width,b);c=Math.min(l.height,c);b=Math.max(d,b);c=Math.max(e,c);if(90===h||270===h)g=b,b=c,c=g,g=d,d=e,e=g;a.ud.Wa();a.Ip(b,c, +d,e);a.ud.freeze();a.ud.F()||z.k("Non-real measuredBounds has been set. Object "+a+", measuredBounds: "+a.ud.toString());$k(a,!1)}} +f.Lc=function(a,b,c,d,e){this.Gi();var g=z.lg();g.assign(this.Xb);this.Xb.Wa();if(!1===ol(this)){var h=this.Xb;h.x=a;h.y=b;h.width=c;h.height=d}else this.aj(a,b,c,d);this.Xb.freeze();this.wi=void 0===e?null:e;c=!1;void 0!==e?c=!0:null!==this.T&&(e=this.T.Wc,d=this.Ia,null!==this.wl&&(d=this.Xb),c=b+d.height,d=a+d.width,c=!(0<=a+.05&&d<=e.width+.05&&0<=b+.05&&c<=e.height+.05),this instanceof qa&&(a=this.Wc,this.Jv>a.height||this.Oj.cf>a.width))&&(c=!0);this.ja=c?this.ja|256:this.ja&-257;this.Xb.F()|| +z.k("Non-real actualBounds has been set. Object "+this+", actualBounds: "+this.Xb.toString());this.wx(g,this.Xb);z.dc(g)};f.aj=function(){}; +function Om(a,b,c,d,e){var g=a.W;g.x=b;g.y=c;g.width=d;g.height=e;if(!a.Aa.F()){g=a.ud;c=a.margin;b=c.right+c.left;var h=c.top+c.bottom;c=g.width+b;g=g.height+h;d+=b;e+=h;b=Nm(a,!0);c===d&&g===e&&(b=cj);switch(b){case cj:if(c>d||g>e)$k(a,!0),uj(a,c>d?d:c,g>e?e:g);break;case lf:$k(a,!0);uj(a,d,e,0,0);break;case Dm:$k(a,!0);uj(a,d,g,0,0);break;case Cm:$k(a,!0),uj(a,c,e,0,0)}}} +f.wx=function(a,b){Pm(this,!1);var c=this.ca;if(null!==c&&null!==c.h){var d=this.ca;null!==d&&(d.un!==this&&d.uF!==this&&d.yF!==this||Qm(d,!0));this.ta();a.N(b)||(c.Nl(),this.Sv(c))}};f.Sv=function(a){null!==this.yd&&Qm(a,!0)};z.defineProperty(O,{bq:"shadowVisible"},function(){return this.Js},function(a){var b=this.Js;b!==a&&(u&&null!==a&&z.g(a,"boolean",O,"shadowVisible"),this.Js=a,this.j("shadowVisible",b,a))}); +O.prototype.ff=function(a,b){if(this.visible){var c=this.Xb;if(0!==c.width&&0!==c.height&&!isNaN(c.x)&&!isNaN(c.y)){var d=this.opacity,e=1;if(1!==d){if(0===d)return;e=a.globalAlpha;a.globalAlpha=e*d}if(a instanceof ed)a:{if(this.visible){var g=null,h=a.ox;if(this instanceof I&&(this.type===Rm||this.type===Sm))Tm(this,a,b);else{var k=this.Xb;if(0!==k.width&&0!==k.height&&!isNaN(k.x)&&!isNaN(k.y)){var l=this.transform,m=this.T;0!==(this.ja&4096)===!0&&Um(this);var c=0!==(this.ja&256),n=!1;this instanceof +qa&&(a.font=this.font);if(c){n=m.Wg()?m.Ga:m.W;if(null!==this.wi)var p=this.wi,q=p.x,r=p.y,s=p.width,p=p.height;else q=Math.max(k.x,n.x),r=Math.max(k.y,n.y),s=Math.min(k.right,n.right)-q,p=Math.min(k.bottom,n.bottom)-r;if(q>k.width+k.x||k.x>n.width+n.x||r>k.height+k.y||k.y>n.height+n.y)break a;n=!0;qd(a,1,0,0,1,0,0);a.save();a.beginPath();a.rect(q,r,s,p);a.clip()}q=!1;if(this instanceof D){var t=this,q=!0;if(!t.isVisible())break a}a.fj.pf=[1,0,0,1,0,0];r=!1;q&&this.tk&&b.ij("drawShadows")&&(s=this.Im, +a.SA(s.x*b.scale*b.jd,s.y*b.scale*b.jd,t.Ag),a.wn(),a.shadowColor=t.Hm);t=!1;this.ca&&b.ij("drawShadows")&&(t=this.ca.tk);!0===this.bq?(a.wn(),!1===r&&t&&(qd(a,1,0,0,1,0,0),a.fb(),r=!0)):!1===this.bq&&a.vn();null!==this.uc&&(Vm(this,a,this.uc,!0,!0),!1===r&&t&&(qd(a,1,0,0,1,0,0),a.fb(),r=!0),this.uc instanceof Da&&this.uc.type===yd?(a.beginPath(),a.rect(k.x,k.y,k.width,k.height),a.Hg(this.uc)):a.fillRect(k.x,k.y,k.width,k.height));this instanceof I?qd(a,l.m11,l.m12,l.m21,l.m22,l.dx,l.dy):a.fj.pf= +[l.m11,l.m12,l.m21,l.m22,l.dx,l.dy];if(null!==this.Nb){!1===r&&t&&(qd(a,1,0,0,1,0,0),a.fb(),r=!0);var p=this.Ga,l=k=0,s=p.width,p=p.height,v=0;this instanceof X&&(p=this.kb.vb,k=p.x,l=p.y,s=p.width,p=p.height,v=this.Oe);Vm(this,a,this.Nb,!0,!1);this.Nb instanceof Da&&this.Nb.type===yd?(a.beginPath(),a.rect(k-v/2,l-v/2,s+v,p+v),a.Hg(this.Nb)):a.fillRect(k-v/2,l-v/2,s+v,p+v)}t&&(null!==this.Nb||null!==this.uc||null!==m&&0!==(m.ja&512)||null!==m&&(m.type===Fk||m.type===aj)&&m.gf()!==this)?(Wm(this,!0), +null===this.bq&&a.vn()):Wm(this,!1);this.ok(a,b);t&&0!==(this.ja&512)===!0&&a.wn();q&&t&&a.vn();c&&(a.restore(),n&&a.Cf.pop());this instanceof I&&(g=a.Cf.pop());!0===r&&a.Cf.pop();null!==a.mE&&(null===g&&(h===a.ox?(qd(a,1,0,0,1,0,0),g=a.Cf.pop()):g=a.ox),a.mE(this,g))}}}}else{if(this instanceof I&&(this.type===Rm||this.type===Sm)){Tm(this,a,b);1!==d&&(a.globalAlpha=e);return}this instanceof G&&this.nn(!1);u&&u.cj&&u.wH(a,this);g=this.transform;h=this.T;0!==(this.ja&4096)===!0&&Um(this);m=0!==(this.ja& +256);this instanceof qa&&(a.font=this.font);if(m){u&&u.lE&&z.trace("clip"+this.toString());n=h.Wg()?h.Ga:h.W;null!==this.wi?(t=this.wi,k=t.x,l=t.y,q=t.width,t=t.height):(k=Math.max(c.x,n.x),l=Math.max(c.y,n.y),q=Math.min(c.right,n.right)-k,t=Math.min(c.bottom,n.bottom)-l);if(k>c.width+c.x||c.x>n.width+n.x||l>c.height+c.y||c.y>n.height+n.y){1!==d&&(a.globalAlpha=e);return}u&&u.lE&&u.yH(a,k,l,q,t);a.save();a.beginPath();a.rect(k,l,q,t);a.clip()}n=!1;if(this instanceof D){n=!0;if(!this.isVisible()){1!== +d&&(a.globalAlpha=e);return}this.tk&&b.ij("drawShadows")&&(k=this.Im,a.SA(k.x*b.scale*b.jd,k.y*b.scale*b.jd,this.Ag),a.wn(),a.shadowColor=this.Hm)}k=!1;this.ca&&b.ij("drawShadows")&&(k=this.ca.tk);!0===this.bq?a.wn():!1===this.bq&&a.vn();null!==this.uc&&(Vm(this,a,this.uc,!0,!0),this.uc instanceof Da&&this.uc.type===yd?(a.beginPath(),a.rect(c.x,c.y,c.width,c.height),a.Hg(this.uc)):a.fillRect(c.x,c.y,c.width,c.height));g.Pt()||a.transform(g.m11,g.m12,g.m21,g.m22,g.dx,g.dy);null!==this.Nb&&(t=this.Ga, +l=c=0,q=t.width,t=t.height,r=0,this instanceof X&&(t=this.kb.vb,c=t.x,l=t.y,q=t.width,t=t.height,r=this.Oe),Vm(this,a,this.Nb,!0,!1),this.Nb instanceof Da&&this.Nb.type===yd?(a.beginPath(),a.rect(c-r/2,l-r/2,q+r,t+r),a.Hg(this.Nb)):a.fillRect(c-r/2,l-r/2,q+r,t+r));u&&u.cj&&u.xH(a,this);k&&(null!==this.Nb||null!==this.uc||null!==h&&0!==(h.ja&512)||null!==h&&(h.type===Fk||h.type===aj)&&h.gf()!==this)?(Wm(this,!0),null===this.bq&&a.vn()):Wm(this,!1);this.ok(a,b);k&&0!==(this.ja&512)===!0&&a.wn();n&& +k&&a.vn();m?(a.restore(),this instanceof I?ca(a,!0):ca(a,!1)):g.Pt()||(h=1/(g.m11*g.m22-g.m12*g.m21),a.transform(g.m22*h,-g.m12*h,-g.m21*h,g.m11*h,h*(g.m21*g.dy-g.m22*g.dx),h*(g.m12*g.dx-g.m11*g.dy)))}1!==d&&(a.globalAlpha=e)}}}; +function Tm(a,b,c){var d=a.Xb;0===d.width||0===d.height||isNaN(d.x)||isNaN(d.y)||(null!==a.uc&&(Vm(a,b,a.uc,!0,!0),a.uc instanceof Da&&a.uc.type===yd?(b.beginPath(),b.rect(d.x,d.y,d.width,d.height),b.Hg(a.uc)):b.fillRect(d.x,d.y,d.width,d.height)),null!==a.Nb&&(Vm(a,b,a.Nb,!0,!1),a.Nb instanceof Da&&a.Nb.type===yd?(b.beginPath(),b.rect(d.x,d.y,d.width,d.height),b.Hg(a.Nb)):b.fillRect(d.x,d.y,d.width,d.height)),a.ok(b,c))}O.prototype.ok=function(){}; +function Vm(a,b,c,d,e){if(null!==c){var g=1,h=1;if("string"===typeof c)d?b.fillStyle=c:b.strokeStyle=c;else if(c.type===ug)d?b.fillStyle=c.color:b.strokeStyle=c.color;else{var k,h=a.Ga,g=h.width,h=h.height;if(e)var l=a.W,g=l.width,h=l.height;var m=b instanceof xd;if(m&&c.bh&&(c.type===zm||c.Nn===g&&c.uy===h))k=c.bh;else{var n=l=0,p=0,q=0,r=0,s=0,s=r=0;e&&(l=a.W,g=l.width,h=l.height,r=l.x,s=l.y);l=c.start.x*g+c.start.offsetX;n=c.start.y*h+c.start.offsetY;p=c.end.x*g+c.end.offsetX;q=c.end.y*h+c.end.offsetY; +l+=r;p+=r;n+=s;q+=s;if(c.type===vg)k=b.createLinearGradient(l,n,p,q);else if(c.type===yd)s=isNaN(c.xt)?Math.max(g,h)/2:c.xt,isNaN(c.wu)?(r=0,s=Math.max(g,h)/2):r=c.wu,k=b.createRadialGradient(l,n,r,p,q,s);else if(c.type===zm)try{k=b.createPattern(c.pattern,"repeat")}catch(t){k=null}else z.ic(c.type,"Brush type");if(c.type!==zm&&(e=c.st,null!==e))for(e=e.i;e.next();)k.addColorStop(e.key,e.value);if(m&&(c.bh=k,null!==k&&(c.Nn=g,c.uy=h),null===k&&c.type===zm&&-1!==c.Nn)){c.Nn=-1;var v=a.h;null!==v&& +-1===c.Nn&&z.setTimeout(function(){v.Sp()},600)}}d?b.fillStyle=k:b.strokeStyle=k}}}O.prototype.isContainedBy=O.prototype.Pl=function(a){if(a instanceof I)a:{if(this!==a&&null!==a)for(var b=this.T;null!==b;){if(b===a){a=!0;break a}b=b.T}a=!1}else a=!1;return a};O.prototype.isVisibleObject=O.prototype.oj=function(){if(!this.visible)return!1;var a=this.T;return null!==a?a.oj():!0}; +function Um(a){if(0!==(a.ja&2048)===!0){var b=a.Hd;b.reset();if(!a.Xb.F()||!a.ud.F()){Xm(a,!1);return}b.translate(a.Xb.x,a.Xb.y);b.translate(-a.Ia.x,-a.Ia.y);var c=a.Ga;Lm(a,b,c.x,c.y,c.width,c.height);Xm(a,!1);Ym(a,!0)}0!==(a.ja&4096)===!0&&(b=a.T,null===b?(a.Ak.set(a.Hd),a.iv=a.scale,Ym(a,!1)):null!==b.qh&&(c=a.Ak,c.reset(),b.Wg()?c.multiply(b.Ak):null!==b.T&&c.multiply(b.T.Ak),c.multiply(a.Hd),a.iv=a.scale*b.iv,Ym(a,!1)))} +function Lm(a,b,c,d,e,g){1!==a.scale&&b.scale(a.scale);if(0!==a.angle){var h=ec;a.of&&a.of.cd()&&(h=a.of);var k=z.O();if(a instanceof D&&a.Zb!==a)for(c=a.Zb,d=c.Ga,k.tu(d.x,d.y,d.width,d.height,h),c.gl.Cb(k),k.offset(-c.Ia.x,-c.Ia.y),h=c.T;null!==h&&h!==a;)h.gl.Cb(k),k.offset(-h.Ia.x,-h.Ia.y),h=h.T;else k.tu(c,d,e,g,h);b.rotate(a.angle,k.x,k.y);z.A(k)}}f=O.prototype; +f.Q=function(a){void 0===a&&(a=!1);if(!0!==nl(this)){$k(this,!0);Pm(this,!0);var b=this.T;null!==b?a||b.Q():(a=this.h,null!==a&&(a.rg.add(this),this instanceof E&&(a.pa.qb||this.mf(),null!==this.Nd&&Zm(this.Nd)),a.Ce(!0)));if(this instanceof I){if(this.ba===Fk||this.ba===Ni)a=this.gf(),null!==a&&a.Q(!0);a=this.va.o;for(var b=a.length,c=0;c<b;c++){var d=a[c];!0!==nl(d)&&(d.Aa.F()||(d instanceof bj||d instanceof I||d instanceof qa||Nm(d,!1)!==cj)&&d.Q(!0))}}}}; +f.Ap=function(){!1===nl(this)&&($k(this,!0),Pm(this,!0))};function Zm(a){if(!1===ol(a)){if(null!==a.T)a.T.Q();else{var b=a.h;null!==b&&(b.rg.add(a),a instanceof E&&a.mf(),b.Ce())}Pm(a,!0)}}f.Gi=function(){0!==(this.ja&2048)===!1&&(Xm(this,!0),Ym(this,!0))};f.dA=function(){Ym(this,!0)};f.ta=function(){var a=this.ca;null!==a&&a.ta()}; +function Nm(a,b){var c=a.stretch,d=a.T;if(null!==d&&d.ba===ga)return $m(a,d.$d(a.Vb),d.Zd(a.column),b);if(null!==d&&d.ba===Fk&&d.gf()===a)return an(a,lf,b);if(c===Bm){if(null!==d){if(d.ba===aj&&d.gf()===a)return an(a,lf,b);c=d.Xd;return c===Bm?an(a,cj,b):an(a,c,b)}return an(a,cj,b)}return an(a,c,b)} +function $m(a,b,c,d){var e=a.stretch;if(e!==Bm)return an(a,e,d);var g=e=null;switch(b.stretch){case Cm:g=!0;break;case lf:g=!0}switch(c.stretch){case Dm:e=!0;break;case lf:e=!0}b=a.T.Xd;null===e&&(e=b===Dm||b===lf);null===g&&(g=b===Cm||b===lf);return!0===e&&!0===g?an(a,lf,d):!0===e?an(a,Dm,d):!0===g?an(a,Cm,d):an(a,cj,d)} +function an(a,b,c){if(c)return b;if(b===cj)return cj;c=a.Aa;if(c.F())return cj;a=a.angle;if(!isNaN(c.width))if(90!==a&&270!==a){if(b===Dm)return cj;if(b===lf)return Cm}else{if(b===Cm)return cj;if(b===lf)return Dm}if(!isNaN(c.height))if(90!==a&&270!==a){if(b===Cm)return cj;if(b===lf)return Dm}else{if(b===Dm)return cj;if(b===lf)return Cm}return b} +z.defineProperty(O,{pu:"segmentOrientation"},function(){return this.Bs},function(a){var b=this.Bs;b!==a&&(u&&z.Ba(a,G,O,"segmentOrientation"),this.Bs=a,this.Q(),this.j("segmentOrientation",b,a),a===Qi&&(this.angle=0))});z.defineProperty(O,{De:"segmentIndex"},function(){return this.zs},function(a){u&&z.g(a,"number",O,"segmentIndex");a=Math.round(a);var b=this.zs;b!==a&&(this.zs=a,this.Q(),this.j("segmentIndex",b,a))}); +z.defineProperty(O,{MA:"segmentFraction"},function(){return this.ys},function(a){u&&z.g(a,"number",O,"segmentFraction");isNaN(a)?a=0:0>a?a=0:1<a&&(a=1);var b=this.ys;b!==a&&(this.ys=a,this.Q(),this.j("segmentFraction",b,a))});z.defineProperty(O,{DF:"segmentOffset"},function(){return this.As},function(a){var b=this.As;b.N(a)||(u&&z.l(a,N,O,"segmentOffset"),this.As=a=a.V(),this.Q(),this.j("segmentOffset",b,a))}); +z.defineProperty(O,{stretch:"stretch"},function(){return this.ei},function(a){var b=this.ei;b!==a&&(u&&z.Ba(a,O,O,"stretch"),this.ei=a,this.Q(),this.j("stretch",b,a))});z.defineProperty(O,{name:"name"},function(){return this.Ub},function(a){var b=this.Ub;b!==a&&(u&&z.g(a,"string",O,"name"),this.Ub=a,null!==this.ca&&(this.ca.jl=null),this.j("name",b,a))}); +z.defineProperty(O,{opacity:"opacity"},function(){return this.Xc},function(a){var b=this.Xc;b!==a&&(z.g(a,"number",O,"opacity"),(0>a||1<a)&&z.ka(a,"0 <= value <= 1",O,"opacity"),this.Xc=a,this.j("opacity",b,a),a=this.h,b=this.ca,null!==a&&null!==b&&a.ta(nk(b,b.W)))}); +z.defineProperty(O,{visible:"visible"},function(){return 0!==(this.ja&1)},function(a){var b=0!==(this.ja&1);b!==a&&(u&&z.g(a,"boolean",O,"visible"),this.ja^=1,this.j("visible",b,a),b=this.T,null!==b?b.Q():this instanceof D&&this.wd(a),this.ta(),bn(this))});z.defineProperty(O,{jg:"pickable"},function(){return 0!==(this.ja&2)},function(a){var b=0!==(this.ja&2);b!==a&&(u&&z.g(a,"boolean",O,"pickable"),this.ja^=2,this.j("pickable",b,a))}); +z.defineProperty(O,{IH:"fromLinkableDuplicates"},function(){return 0!==(this.ja&4)},function(a){var b=0!==(this.ja&4);b!==a&&(u&&z.g(a,"boolean",O,"fromLinkableDuplicates"),this.ja^=4,this.j("fromLinkableDuplicates",b,a))});z.defineProperty(O,{JH:"fromLinkableSelfNode"},function(){return 0!==(this.ja&8)},function(a){var b=0!==(this.ja&8);b!==a&&(u&&z.g(a,"boolean",O,"fromLinkableSelfNode"),this.ja^=8,this.j("fromLinkableSelfNode",b,a))}); +z.defineProperty(O,{tJ:"toLinkableDuplicates"},function(){return 0!==(this.ja&16)},function(a){var b=0!==(this.ja&16);b!==a&&(u&&z.g(a,"boolean",O,"toLinkableDuplicates"),this.ja^=16,this.j("toLinkableDuplicates",b,a))});z.defineProperty(O,{uJ:"toLinkableSelfNode"},function(){return 0!==(this.ja&32)},function(a){var b=0!==(this.ja&32);b!==a&&(u&&z.g(a,"boolean",O,"toLinkableSelfNode"),this.ja^=32,this.j("toLinkableSelfNode",b,a))}); +z.defineProperty(O,{Ff:"isPanelMain"},function(){return 0!==(this.ja&64)},function(a){var b=0!==(this.ja&64);b!==a&&(u&&z.g(a,"boolean",O,"isPanelMain"),this.ja^=64,this.Q(),this.j("isPanelMain",b,a))});z.defineProperty(O,{Mt:"isActionable"},function(){return 0!==(this.ja&128)},function(a){var b=0!==(this.ja&128);b!==a&&(u&&z.g(a,"boolean",O,"isActionable"),this.ja^=128,this.j("isActionable",b,a))}); +z.defineProperty(O,{wl:"areaBackground"},function(){return this.uc},function(a){var b=this.uc;b!==a&&(u&&null!==a&&z.ot(a,"GraphObject.areaBackground"),a instanceof Da&&a.freeze(),this.uc=a,this.ta(),this.j("areaBackground",b,a))});z.defineProperty(O,{background:"background"},function(){return this.Nb},function(a){var b=this.Nb;b!==a&&(u&&null!==a&&z.ot(a,"GraphObject.background"),a instanceof Da&&a.freeze(),this.Nb=a,this.ta(),this.j("background",b,a))}); +function Wm(a,b){a.ja=b?a.ja|512:a.ja&-513}function cn(a,b){a.ja=b?a.ja|1024:a.ja&-1025}function Xm(a,b){a.ja=b?a.ja|2048:a.ja&-2049}function Ym(a,b){a.ja=b?a.ja|4096:a.ja&-4097}function nl(a){return 0!==(a.ja&8192)}function $k(a,b){a.ja=b?a.ja|8192:a.ja&-8193}function ol(a){return 0!==(a.ja&16384)}function Pm(a,b){a.ja=b?a.ja|16384:a.ja&-16385} +z.w(O,{ca:"part"},function(){if(this instanceof D)return this;if(null!==this.Am)return this.Am;var a;for(a=this.T;a;){if(a instanceof D)return this.Am=a;a=a.T}return null});z.w(O,{T:"panel"},function(){return this.mh});O.prototype.Tl=function(a){this.mh=a};z.w(O,{layer:"layer"},function(){var a=this.ca;return null!==a?a.layer:null},{configurable:!0});z.w(O,{h:"diagram"},function(){var a=this.ca;return null!==a?a.h:null},{configurable:!0}); +z.defineProperty(O,{position:"position"},function(){return this.sb},function(a){var b=this.sb;b.N(a)||(u&&z.l(a,N,O,"position"),a=a.V(),this.QA(a,b)&&this.j("position",b,a))});O.prototype.QA=function(a){this.sb=a;Zm(this);this.Gi();return!0};O.prototype.Ox=function(a,b){this.sb.n(a,b);dn(this);this.Gi()};z.w(O,{W:"actualBounds"},function(){return this.Xb}); +z.defineProperty(O,{scale:"scale"},function(){return this.bc},function(a){var b=this.bc;b!==a&&(u&&z.p(a,O,"scale"),0>=a&&z.k("GraphObject.scale for "+this+" must be greater than zero, not: "+a),this.bc=a,this.Gi(),this.Q(),this.j("scale",b,a))});z.defineProperty(O,{angle:"angle"},function(){return this.bm},function(a){var b=this.bm;b!==a&&(u&&z.p(a,O,"angle"),a%=360,0>a&&(a+=360),b!==a&&(this.bm=a,this.Q(),this.Gi(),this.j("angle",b,a)))}); +z.defineProperty(O,{Aa:"desiredSize"},function(){return this.tf},function(a){u&&z.l(a,Ea,O,"desiredSize");var b=a.width,c=a.height,d=this.tf,e=d.width,g=d.height;(e===b||isNaN(e)&&isNaN(b))&&(g===c||isNaN(g)&&isNaN(c))||(this.tf=a=a.V(),this.Q(),this instanceof X&&this.qe(),this.j("desiredSize",d,a),0!==(this.ja&1024)&&(a=this.ca,null!==a&&(Jm(this,a,"width"),Jm(this,a,"height"))))}); +z.defineProperty(O,{width:"width"},function(){return this.tf.width},function(a){if(this.tf.width!==a){u&&z.g(a,"number",O,"width");var b=this.tf;this.tf=a=(new Ea(a,this.tf.height)).freeze();this.Q();this instanceof X&&this.qe();this.j("desiredSize",b,a);b=this.ca;null!==b&&0!==(this.ja&1024)&&Jm(this,b,"width")}}); +z.defineProperty(O,{height:"height"},function(){return this.tf.height},function(a){if(this.tf.height!==a){u&&z.g(a,"number",O,"height");var b=this.tf;this.tf=a=(new Ea(this.tf.width,a)).freeze();this.Q();this instanceof X&&this.qe();this.j("desiredSize",b,a);b=this.ca;null!==b&&0!==(this.ja&1024)&&Jm(this,b,"height")}}); +z.defineProperty(O,{dg:"minSize"},function(){return this.Uj},function(a){var b=this.Uj;b.N(a)||(u&&z.l(a,Ea,O,"minSize"),a=a.copy(),isNaN(a.width)&&(a.width=0),isNaN(a.height)&&(a.height=0),a.freeze(),this.Uj=a,this.Q(),this.j("minSize",b,a))});z.defineProperty(O,{Xe:"maxSize"},function(){return this.Sj},function(a){var b=this.Sj;b.N(a)||(u&&z.l(a,Ea,O,"maxSize"),a=a.copy(),isNaN(a.width)&&(a.width=Infinity),isNaN(a.height)&&(a.height=Infinity),a.freeze(),this.Sj=a,this.Q(),this.j("maxSize",b,a))}); +z.w(O,{Ia:"measuredBounds"},function(){return this.ud});z.w(O,{Ga:"naturalBounds"},function(){return this.Wc},{configurable:!0});z.defineProperty(O,{margin:"margin"},function(){return this.Er},function(a){"number"===typeof a?a=new Db(a):u&&z.l(a,Db,O,"margin");var b=this.Er;b.N(a)||(this.Er=a=a.V(),this.Q(),this.j("margin",b,a))});z.w(O,{transform:null},function(){0!==(this.ja&2048)===!0&&Um(this);return this.Hd});z.w(O,{qh:null},function(){0!==(this.ja&4096)===!0&&Um(this);return this.Ak}); +z.defineProperty(O,{alignment:"alignment"},function(){return this.Ie},function(a){var b=this.Ie;b.N(a)||(u&&z.l(a,Q,O,"alignment"),a.Be()&&!a.bd()&&z.k("GraphObject.alignment for "+this+" must be a real Spot or Spot.Default, not: "+a),this.Ie=a=a.V(),Zm(this),this.j("alignment",b,a))});z.defineProperty(O,{column:"column"},function(){return this.wq},function(a){u&&z.p(a,O,"column");a=Math.round(a);var b=this.wq;b!==a&&(0>a&&z.ka(a,">= 0",O,"column"),this.wq=a,this.Q(),this.j("column",b,a))}); +z.defineProperty(O,{dH:"columnSpan"},function(){return this.xi},function(a){u&&z.g(a,"number",O,"columnSpan");a=Math.round(a);var b=this.xi;b!==a&&(1>a&&z.ka(a,">= 1",O,"columnSpan"),this.xi=a,this.Q(),this.j("columnSpan",b,a))});z.defineProperty(O,{Vb:"row"},function(){return this.us},function(a){u&&z.p(a,O,"row");a=Math.round(a);var b=this.us;b!==a&&(0>a&&z.ka(a,">= 0",O,"row"),this.us=a,this.Q(),this.j("row",b,a))}); +z.defineProperty(O,{rowSpan:"rowSpan"},function(){return this.Ui},function(a){u&&z.g(a,"number",O,"rowSpan");a=Math.round(a);var b=this.Ui;b!==a&&(1>a&&z.ka(a,">= 1",O,"rowSpan"),this.Ui=a,this.Q(),this.j("rowSpan",b,a))});z.defineProperty(O,{Rx:"spanAllocation"},function(){return this.Os},function(a){var b=this.Os;b!==a&&(null!==a&&z.g(a,"function",O,"spanAllocation"),this.Os=a,this.j("spanAllocation",b,a))}); +z.defineProperty(O,{kk:"alignmentFocus"},function(){return this.oq},function(a){var b=this.oq;b.N(a)||(u&&z.l(a,Q,O,"alignmentFocus"),!a.Be()||a.bd()||a.N(Yb)&&this instanceof E||z.k("GraphObject.alignmentFocus must be a real Spot or Spot.Default, not: "+a),this.oq=a=a.V(),this.Q(),this.j("alignmentFocus",b,a))}); +z.defineProperty(O,{yd:"portId"},function(){return this.fs},function(a){var b=this.fs;if(b!==a){u&&null!==a&&z.g(a,"string",O,"portId");var c=this.ca;null===c||c instanceof E||(z.k("Cannot set portID on a Link: "+a),c=null);null!==b&&null!==c&&en(c,this);this.fs=a;if(null!==a&&c){c.Rh=!0;null===c.Dd&&fn(c);var d=this.yd;null!==d&&c.Dd.add(d,this)}this.j("portId",b,a)}});function bn(a){var b=a.ca;b instanceof E&&(a=a.h,null===a||a.pa.qb||b.mf())} +z.defineProperty(O,{Eb:"toSpot"},function(){return null!==this.la?this.la.hk:Yb},function(a){this.Ue();var b=this.la.hk;b.N(a)||(u&&z.l(a,Q,O,"toSpot"),a=a.V(),this.la.hk=a,this.j("toSpot",b,a),bn(this))});z.defineProperty(O,{Yl:"toEndSegmentLength"},function(){return null!==this.la?this.la.fk:10},function(a){this.Ue();var b=this.la.fk;b!==a&&(u&&z.g(a,"number",O,"toEndSegmentLength"),0>a&&z.ka(a,">= 0",O,"toEndSegmentLength"),this.la.fk=a,this.j("toEndSegmentLength",b,a),bn(this))}); +z.defineProperty(O,{zu:"toEndSegmentDirection"},function(){return null!==this.la?this.la.ek:Hm},function(a){this.Ue();var b=this.la.ek;b!==a&&(u&&z.Ba(a,E,O,"toEndSegmentDirection"),this.la.ek=a,this.j("toEndSegmentDirection",b,a),bn(this))});z.defineProperty(O,{Au:"toShortLength"},function(){return null!==this.la?this.la.gk:0},function(a){this.Ue();var b=this.la.gk;b!==a&&(u&&z.g(a,"number",O,"toShortLength"),this.la.gk=a,this.j("toShortLength",b,a),bn(this))}); +z.defineProperty(O,{SF:"toLinkable"},function(){return this.Vs},function(a){var b=this.Vs;b!==a&&(u&&null!==a&&z.g(a,"boolean",O,"toLinkable"),this.Vs=a,this.j("toLinkable",b,a))});z.defineProperty(O,{vJ:"toMaxLinks"},function(){return this.Ws},function(a){var b=this.Ws;b!==a&&(u&&z.g(a,"number",O,"toMaxLinks"),0>a&&z.ka(a,">= 0",O,"toMaxLinks"),this.Ws=a,this.j("toMaxLinks",b,a))}); +z.defineProperty(O,{Db:"fromSpot"},function(){return null!==this.la?this.la.Hj:Yb},function(a){this.Ue();var b=this.la.Hj;b.N(a)||(u&&z.l(a,Q,O,"fromSpot"),a=a.V(),this.la.Hj=a,this.j("fromSpot",b,a),bn(this))});z.defineProperty(O,{Jl:"fromEndSegmentLength"},function(){return null!==this.la?this.la.Fj:10},function(a){this.Ue();var b=this.la.Fj;b!==a&&(u&&z.g(a,"number",O,"fromEndSegmentLength"),0>a&&z.ka(a,">= 0",O,"fromEndSegmentLength"),this.la.Fj=a,this.j("fromEndSegmentLength",b,a),bn(this))}); +z.defineProperty(O,{Ft:"fromEndSegmentDirection"},function(){return null!==this.la?this.la.Ej:Hm},function(a){this.Ue();var b=this.la.Ej;b!==a&&(u&&z.Ba(a,E,O,"fromEndSegmentDirection"),this.la.Ej=a,this.j("fromEndSegmentDirection",b,a),bn(this))});z.defineProperty(O,{Gt:"fromShortLength"},function(){return null!==this.la?this.la.Gj:0},function(a){this.Ue();var b=this.la.Gj;b!==a&&(u&&z.g(a,"number",O,"fromShortLength"),this.la.Gj=a,this.j("fromShortLength",b,a),bn(this))}); +z.defineProperty(O,{uE:"fromLinkable"},function(){return this.Zq},function(a){var b=this.Zq;b!==a&&(u&&null!==a&&z.g(a,"boolean",O,"fromLinkable"),this.Zq=a,this.j("fromLinkable",b,a))});z.defineProperty(O,{Xz:"fromMaxLinks"},function(){return this.$q},function(a){var b=this.$q;b!==a&&(u&&z.g(a,"number",O,"fromMaxLinks"),0>a&&z.ka(a,">= 0",O,"fromMaxLinks"),this.$q=a,this.j("fromMaxLinks",b,a))}); +z.defineProperty(O,{cursor:"cursor"},function(){return this.Hq},function(a){var b=this.Hq;b!==a&&(z.g(a,"string",O,"cursor"),this.Hq=a,this.j("cursor",b,a))});z.defineProperty(O,{click:"click"},function(){return null!==this.ma?this.ma.vi:null},function(a){Em(this);var b=this.ma.vi;b!==a&&(null!==a&&z.g(a,"function",O,"click"),this.ma.vi=a,this.j("click",b,a))}); +z.defineProperty(O,{wt:"doubleClick"},function(){return null!==this.ma?this.ma.Di:null},function(a){Em(this);var b=this.ma.Di;b!==a&&(null!==a&&z.g(a,"function",O,"doubleClick"),this.ma.Di=a,this.j("doubleClick",b,a))});z.defineProperty(O,{Hz:"contextClick"},function(){return null!==this.ma?this.ma.yi:null},function(a){Em(this);var b=this.ma.yi;b!==a&&(null!==a&&z.g(a,"function",O,"contextClick"),this.ma.yi=a,this.j("contextClick",b,a))}); +z.defineProperty(O,{au:"mouseEnter"},function(){return null!==this.ma?this.ma.Rr:null},function(a){Em(this);var b=this.ma.Rr;b!==a&&(null!==a&&z.g(a,"function",O,"mouseEnter"),this.ma.Rr=a,this.j("mouseEnter",b,a))});z.defineProperty(O,{bu:"mouseLeave"},function(){return null!==this.ma?this.ma.Sr:null},function(a){Em(this);var b=this.ma.Sr;b!==a&&(null!==a&&z.g(a,"function",O,"mouseLeave"),this.ma.Sr=a,this.j("mouseLeave",b,a))}); +z.defineProperty(O,{tA:"mouseOver"},function(){return null!==this.ma?this.ma.Qi:null},function(a){Em(this);var b=this.ma.Qi;b!==a&&(null!==a&&z.g(a,"function",O,"mouseOver"),this.ma.Qi=a,this.j("mouseOver",b,a))});z.defineProperty(O,{sA:"mouseHover"},function(){return null!==this.ma?this.ma.Pi:null},function(a){Em(this);var b=this.ma.Pi;b!==a&&(null!==a&&z.g(a,"function",O,"mouseHover"),this.ma.Pi=a,this.j("mouseHover",b,a))}); +z.defineProperty(O,{rA:"mouseHold"},function(){return null!==this.ma?this.ma.Oi:null},function(a){Em(this);var b=this.ma.Oi;b!==a&&(null!==a&&z.g(a,"function",O,"mouseHold"),this.ma.Oi=a,this.j("mouseHold",b,a))});z.defineProperty(O,{HI:"mouseDragEnter"},function(){return null!==this.ma?this.ma.Pr:null},function(a){Em(this);var b=this.ma.Pr;b!==a&&(null!==a&&z.g(a,"function",O,"mouseDragEnter"),this.ma.Pr=a,this.j("mouseDragEnter",b,a))}); +z.defineProperty(O,{II:"mouseDragLeave"},function(){return null!==this.ma?this.ma.Qr:null},function(a){Em(this);var b=this.ma.Qr;b!==a&&(null!==a&&z.g(a,"function",O,"mouseDragLeave"),this.ma.Qr=a,this.j("mouseDragLeave",b,a))});z.defineProperty(O,{qA:"mouseDrop"},function(){return null!==this.ma?this.ma.Ni:null},function(a){Em(this);var b=this.ma.Ni;b!==a&&(null!==a&&z.g(a,"function",O,"mouseDrop"),this.ma.Ni=a,this.j("mouseDrop",b,a))}); +z.defineProperty(O,{AD:"actionDown"},function(){return null!==this.ma?this.ma.iq:null},function(a){Em(this);var b=this.ma.iq;b!==a&&(null!==a&&z.g(a,"function",O,"actionDown"),this.ma.iq=a,this.j("actionDown",b,a))});z.defineProperty(O,{BD:"actionMove"},function(){return null!==this.ma?this.ma.jq:null},function(a){Em(this);var b=this.ma.jq;b!==a&&(null!==a&&z.g(a,"function",O,"actionMove"),this.ma.jq=a,this.j("actionMove",b,a))}); +z.defineProperty(O,{CD:"actionUp"},function(){return null!==this.ma?this.ma.kq:null},function(a){Em(this);var b=this.ma.kq;b!==a&&(null!==a&&z.g(a,"function",O,"actionUp"),this.ma.kq=a,this.j("actionUp",b,a))});z.defineProperty(O,{zD:"actionCancel"},function(){return null!==this.ma?this.ma.hq:null},function(a){Em(this);var b=this.ma.hq;b!==a&&(null!==a&&z.g(a,"function",O,"actionCancel"),this.ma.hq=a,this.j("actionCancel",b,a))}); +z.defineProperty(O,{ZA:"toolTip"},function(){return null!==this.ma?this.ma.Xi:null},function(a){Em(this);var b=this.ma.Xi;b!==a&&(null!==a&&z.l(a,da,O,"toolTip"),this.ma.Xi=a,this.j("toolTip",b,a))});z.defineProperty(O,{contextMenu:"contextMenu"},function(){return null!==this.ma?this.ma.zi:null},function(a){Em(this);var b=this.ma.zi;b!==a&&(null!==a&&z.l(a,da,O,"contextMenu"),this.ma.zi=a,this.j("contextMenu",b,a))}); +O.prototype.bind=O.prototype.bind=function(a){a.Bg=this;var b=this.np();null!==b&&gn(b)&&z.k("Cannot add a Binding to a template that has already been copied: "+a);null===this.Ac&&(this.Ac=new J($g));this.Ac.add(a)};O.prototype.findTemplateBinder=O.prototype.np=function(){for(var a=this instanceof I?this:this.T;null!==a;){if(null!==a.Ok)return a;a=a.T}return null};O.prototype.setProperties=function(a){z.qu(this,a)};var hn; +O.make=hn=function(a,b){var c=arguments,d=null,e=null;if("function"===typeof a)e=a;else if("string"===typeof a){var g=jn.na(a);"function"===typeof g?(c=z.Al(arguments),d=g(c)):e=aa[a]}null===d&&(void 0===e&&(d=window.$,void 0!==d&&void 0!==d.noop&&z.k("GraphObject.make failed to complete. Is it conflicting with another $ var? (such as jQuery)"),z.k("GraphObject.make failed to complete, it may be conflicting with another var.")),null!==e&&e.constructor||z.k("GraphObject.make requires a class function or class name, not: "+ +a),d=new e);g=1;if(d instanceof B&&1<c.length){var h=d,e=c[1];if("string"===typeof e||e instanceof HTMLDivElement)Dk(h,e),g++}for(;g<c.length;g++)e=c[g],void 0===e?z.k("Undefined value at argument "+g+" for object being constructed by GraphObject.make: "+d):kn(d,e);return d}; +function kn(a,b){if("string"===typeof b)if(a instanceof qa)a.text=b;else if(a instanceof X)a.Hb=b;else if(a instanceof xk)a.source=b;else if(a instanceof I){var c=Ja(I,b);null!==c?a.type=c:z.k("Unknown Panel type as an argument to GraphObject.make: "+b)}else a instanceof Da?(c=Ja(Da,b),null!==c?a.type=c:z.k("Unknown Brush type as an argument to GraphObject.make: "+b)):a instanceof hf?(c=Ja(hf,b),null!==c?a.type=c:z.k("Unknown Geometry type as an argument to GraphObject.make: "+b)):a instanceof Qf? +(c=Ja(Qf,b),null!==c?a.type=c:z.k("Unknown PathSegment type as an argument to GraphObject.make: "+b)):z.k("Unable to use a string as an argument to GraphObject.make: "+b);else if(b instanceof O)c=b,a instanceof I||z.k("A GraphObject can only be added to a Panel, not to: "+a),a.add(c);else if(b instanceof Ig){var d=b,c=a,e;d.re&&c.getRowDefinition?e=c.getRowDefinition(d.index):!d.re&&c.getColumnDefinition?e=c.getColumnDefinition(d.index):z.k("A RowColumnDefinition can only be added to a Panel, not to: "+ +a);e.tt(d)}else if(b instanceof Ba)a instanceof G&&b.Ae===G?2===(b.value&2)?a.Hx=b:b===Xi||b===Pi||b===Oi?a.Se=b:b===ln||b===mn||b===nn?a.it=b:b!==on&&b!==Qi&&z.k("Unknown Link enum value for a Link property: "+b):a instanceof I&&b.Ae===I?a.type=b:a instanceof qa&&b.Ae===qa?a.hG=b:a instanceof X&&(b===cj||b===ej||b===fj||b===Bm)?a.Yz=b:a instanceof xk&&(b===cj||b===ej||b===fj)?a.WH=b:a instanceof O&&b.Ae===G?(c=a,0===b.name.indexOf("Orient")?c.pu=b:z.k("Unknown Link enum value for GraphObject.segmentOrientation property: "+ +b)):a instanceof O&&b.Ae===O?a.stretch=b:a instanceof Ig&&b.Ae===Ig?a.uu=b:a instanceof B&&b.Ae===B?a.xl=b:a instanceof Da&&b.Ae===Da?a.type=b:a instanceof hf&&b.Ae===hf?a.type=b:a instanceof Qf&&b.Ae===Qf?a.type=b:a instanceof $g&&b.Ae===$g?a.mode=b:a instanceof Tf&&b.Ae===Tf?a.Dc=b:a instanceof Y&&b.Ae===Y?0===b.name.indexOf("Alignment")?a.alignment=b:0===b.name.indexOf("Arrangement")?a.Yf=b:0===b.name.indexOf("Compaction")?a.compaction=b:0===b.name.indexOf("Path")?a.path=b:0===b.name.indexOf("Sorting")? +a.sorting=b:0===b.name.indexOf("Style")?a.yJ=b:z.k("Unknown enum value: "+b):a instanceof pn&&b.Ae===pn?0===b.name.indexOf("Aggressive")?a.RG=b:0===b.name.indexOf("Cycle")?a.lH=b:0===b.name.indexOf("Init")?a.aI=b:0===b.name.indexOf("Layer")?a.pI=b:z.k("Unknown enum value: "+b):a instanceof um&&b.Ae===um?b===qn||b===rn||b===sn||b===tn?a.sorting=b:b===un||b===vn?a.Yf=b:b===wn||b===xn?a.alignment=b:z.k("Unknown enum value: "+b):a instanceof yn&&b.Ae===yn?b===Cn||b===En||b===Fn||b===Gn||b===Hn?a.sorting= +b:b===In||b===Jn||b===Kn||b===Ln?a.direction=b:b===Mn||b===Nn||b===On||b===Pn?a.Yf=b:b===Qn||b===Rn?a.ux=b:z.k("Unknown enum value: "+b):z.k("No property to set for this enum value: "+b);else if(b instanceof $g)a instanceof O?a.bind(b):a instanceof Ig?a.bind(b):z.k("A Binding can only be applied to a GraphObject or RowColumnDefinition, not to: "+a);else if(b instanceof kf)a instanceof hf?a.cc.add(b):z.k("A PathFigure can only be added to a Geometry, not to: "+a);else if(b instanceof Qf)a instanceof +kf?a.Ab.add(b):z.k("A PathSegment can only be added to a PathFigure, not to: "+a);else if(b instanceof yg)a instanceof B?a.Sb=b:a instanceof F?a.Sb=b:z.k("A Layout can only be assigned to a Diagram or a Group, not to: "+a);else if(Array.isArray(b))for(c=0;c<b.length;c++)kn(a,b[c]);else if("object"===typeof b&&null!==b)if(a instanceof Da){e=new ma;for(c in b)d=parseFloat(c),isNaN(d)?e[c]=b[c]:a.addColorStop(d,b[c]);z.qu(a,e)}else if(a instanceof Ig){void 0!==b.row?(e=b.row,(void 0===e||null===e||Infinity=== +e||isNaN(e)||0>e)&&z.k("Must specify non-negative integer row for RowColumnDefinition "+b+", not: "+e),a.re=!0,a.index=e):void 0!==b.column&&(e=b.column,(void 0===e||null===e||Infinity===e||isNaN(e)||0>e)&&z.k("Must specify non-negative integer column for RowColumnDefinition "+b+", not: "+e),a.re=!1,a.index=e);e=new ma;for(c in b)"row"!==c&&"column"!==c&&(e[c]=b[c]);z.qu(a,e)}else z.qu(a,b);else z.k('Unknown initializer "'+b+'" for object being constructed by GraphObject.make: '+a)} +var jn=new na("string","function");O.getBuilders=function(){var a=new na("string","function"),b;for(b in jn)if(b!==b.toLowerCase()){var c=jn[b];"function"===typeof c&&a.add(b,c)}a.freeze();return a};var Sn;O.defineBuilder=Sn=function(a,b){z.g(a,"string",O,"defineBuilder:name");z.g(b,"function",O,"defineBuilder:func");var c=a.toLowerCase();""!==a&&"none"!==c&&a!==c||z.k("Shape.defineFigureGenerator name must not be empty or None or all-lower-case: "+a);jn.add(a,b)};var Tn; +O.takeBuilderArgument=Tn=function(a,b,c){void 0===c&&(c=null);var d=a[1];if("function"===typeof c?c(d):"string"===typeof d)return a.splice(1,1),d;if(void 0===b)throw Error("no "+("function"===typeof c?"satisfactory":"string")+" argument for GraphObject builder "+a[0]);return b}; +Sn("Button",function(){var a=new Da(vg);a.addColorStop(0,"white");a.addColorStop(1,"lightgray");var b=new Da(vg);b.addColorStop(0,"white");b.addColorStop(1,"dodgerblue");a=hn(I,Fk,{Mt:!0},{_buttonFillNormal:a,_buttonStrokeNormal:"gray",_buttonFillOver:b,_buttonStrokeOver:"blue"},hn(X,{name:"ButtonBorder",Hb:"Rectangle",C:new Q(0,0,2.761423749153968,2.761423749153968),D:new Q(1,1,-2.761423749153968,-2.761423749153968),fill:a,stroke:"gray"}));a.au=function(a,b){var e=b.oe("ButtonBorder");if(e instanceof +X){var g=b._buttonFillOver;b._buttonFillNormal=e.fill;e.fill=g;g=b._buttonStrokeOver;b._buttonStrokeNormal=e.stroke;e.stroke=g}};a.bu=function(a,b){var e=b.oe("ButtonBorder");e instanceof X&&(e.fill=b._buttonFillNormal,e.stroke=b._buttonStrokeNormal)};return a}); +Sn("TreeExpanderButton",function(){var a=hn("Button",{_treeExpandedFigure:"MinusLine",_treeCollapsedFigure:"PlusLine"},hn(X,{name:"ButtonIcon",Hb:"MinusLine",Aa:ae},(new $g("figure","isTreeExpanded",function(a,c){var d=c.T;return a?d._treeExpandedFigure:d._treeCollapsedFigure})).vx()),{visible:!1},(new $g("visible","isTreeLeaf",function(a){return!a})).vx());a.click=function(a,c){var d=c.ca;d instanceof da&&(d=d.Xf);if(d instanceof E){var e=d.h;if(null!==e){e=e.wb;if(d.vd){if(!e.canCollapseTree(d))return}else if(!e.canExpandTree(d))return; +a.Gc=!0;d.vd?e.collapseTree(d):e.expandTree(d)}}};return a}); +Sn("SubGraphExpanderButton",function(){var a=hn("Button",{_subGraphExpandedFigure:"MinusLine",_subGraphCollapsedFigure:"PlusLine"},hn(X,{name:"ButtonIcon",Hb:"MinusLine",Aa:ae},(new $g("figure","isSubGraphExpanded",function(a,c){var d=c.T;return a?d._subGraphExpandedFigure:d._subGraphCollapsedFigure})).vx()));a.click=function(a,c){var d=c.ca;d instanceof da&&(d=d.Xf);if(d instanceof F){var e=d.h;if(null!==e){e=e.wb;if(d.se){if(!e.canCollapseSubGraph(d))return}else if(!e.canExpandSubGraph(d))return;a.Gc= +!0;d.se?e.collapseSubGraph(d):e.expandSubGraph(d)}}};return a});Sn("ContextMenuButton",function(){var a=hn("Button");a.stretch=Dm;var b=a.oe("ButtonBorder");b instanceof X&&(b.Hb="Rectangle",b.C=new Q(0,0,2,3),b.D=new Q(1,1,-2,-2));return a}); +Sn("PanelExpanderButton",function(a){var b=Tn(a,"COLLAPSIBLE");a=hn("Button",hn(X,"TriangleUp",{Aa:new Ea(6,4)},(new $g("figure","visible",function(a){return a?"TriangleUp":"TriangleDown"})).vx(b)));var c=a.oe("ButtonBorder");c instanceof X&&(c.stroke=null,c.fill="transparent");a.click=function(a,c){var g=c.h;if(null!==g&&!g.ib){var h=c.ca.oe(b);null!==h&&(g.Wb("Collapse/Expand Panel"),h.visible=!h.visible,g.Jd("Collapse/Expand Panel"))}};return a}); +Sn("CheckBoxButton",function(a){var b=Tn(a);a=hn("Button",{"ButtonBorder.fill":"white","ButtonBorder.stroke":"gray",width:14,height:14},hn(X,{name:"ButtonIcon",KH:"M0 4 L3 9 9 0",ub:2,stretch:lf,Yz:ej,visible:!1},""!==b?(new $g("visible",b)).xI():[]));a.click=function(a,d){if(!(a.h.ib||""!==b&&a.h.ha.ib)){a.Gc=!0;var e=d.oe("ButtonIcon");e.h.Wb("checkbox");e.visible=!e.visible;"function"===typeof d._doClick&&d._doClick(a,d);e.h.Jd("checkbox")}};return a}); +Sn("CheckBox",function(a){a=Tn(a);a=hn("CheckBoxButton",a,{name:"Button",margin:new Db(0,1,0,0)});var b=hn(I,"Horizontal",a,{Mt:!0,margin:1,_buttonFillNormal:a._buttonFillNormal,_buttonStrokeNormal:a._buttonStrokeNormal,_buttonFillOver:a._buttonFillOver,_buttonStrokeOver:a._buttonStrokeOver,au:a.au,bu:a.bu,click:a.click,_buttonClick:a.click});a.au=null;a.bu=null;a.click=null;return b}); +function Fm(){this.zi=this.Xi=this.hq=this.kq=this.jq=this.iq=this.Ni=this.Qr=this.Pr=this.Oi=this.Pi=this.Qi=this.Sr=this.Rr=this.yi=this.Di=this.vi=null}Fm.prototype.copy=function(){var a=new Fm;a.vi=this.vi;a.Di=this.Di;a.yi=this.yi;a.Rr=this.Rr;a.Sr=this.Sr;a.Qi=this.Qi;a.Pi=this.Pi;a.Oi=this.Oi;a.Pr=this.Pr;a.Qr=this.Qr;a.Ni=this.Ni;a.iq=this.iq;a.jq=this.jq;a.kq=this.kq;a.hq=this.hq;a.Xi=this.Xi;a.zi=this.zi;return a}; +function I(a){O.call(this);void 0===a?0===arguments.length?this.ba=hj:z.k("invalid argument to Panel constructor: undefined"):(z.Ba(a,I,I,"type"),this.ba=a);this.va=new J(O);this.df=Kd;this.eh=!1;this.ba===Ik&&(this.eh=!0);this.hr=!1;this.Lq=Pc;this.Ci=Bm;this.ba===ga&&Un(this);this.Yo=ej;this.cr=ce;this.dr=Id;this.Ok=this.fe=null;this.vr=NaN;this.tg=this.Ji=null;this.uo="category";this.sg=null;this.Zi=new w(NaN,NaN,NaN,NaN);this.Km=null;this.Rh=!1;this.vs=null}z.Qa(I,O);z.ji(I);z.ia("Panel",I); +function Un(a){a.Bj=Kd;a.Oh=1;a.Bi=null;a.gm=null;a.Nh=1;a.Mh=null;a.fm=null;a.Wd=[];a.Sd=[];a.Fm=Vn;a.em=Vn;a.Yi=0;a.Ki=0} +I.prototype.cloneProtected=function(a){O.prototype.cloneProtected.call(this,a);a.ba=this.ba;a.df=this.df.V();a.eh=this.eh;a.hr=this.hr;a.Lq=this.Lq.V();a.Ci=this.Ci;if(a.ba===ga){a.Bj=this.Bj.V();a.Oh=this.Oh;a.Bi=this.Bi;a.gm=this.gm;a.Nh=this.Nh;a.Mh=this.Mh;a.fm=this.fm;var b=[];if(0<this.Wd.length)for(var c=this.Wd,d=c.length,e=0;e<d;e++)if(void 0!==c[e]){var g=c[e].copy();g.Tl(a);b[e]=g}a.Wd=b;b=[];if(0<this.Sd.length)for(c=this.Sd,d=c.length,e=0;e<d;e++)void 0!==c[e]&&(g=c[e].copy(),g.Tl(a), +b[e]=g);a.Sd=b;a.Fm=this.Fm;a.em=this.em;a.Yi=this.Yi;a.Ki=this.Ki}a.Yo=this.Yo;a.cr=this.cr.V();a.dr=this.dr.V();a.fe=this.fe;a.Ok=this.Ok;a.vr=this.vr;a.Ji=this.Ji;a.tg=this.tg;a.uo=this.uo;a.Zi.assign(this.Zi);a.Rh=this.Rh;null!==this.vs&&(a.vs=this.vs)};I.prototype.ki=function(a){O.prototype.ki.call(this,a);a.va=this.va;for(var b=a.va.o,c=b.length,d=0;d<c;d++)b[d].mh=a;a.Km=null}; +I.prototype.copy=function(){var a=O.prototype.copy.call(this);if(null!==a){for(var b=this.va.o,c=b.length,d=0;d<c;d++){var e=b[d].copy(),g=a;e.Tl(g);e.Am=null;var h=g.va,k=h.count;h.Ld(k,e);h=g.ca;if(null!==h){h.jl=null;null!==e.yd&&h instanceof E&&(h.Rh=!0);var l=g.h;null!==l&&l.pa.qb||h.Rc(Wf,"elements",g,null,e,null,k)}}return a}return null};I.prototype.toString=function(){return"Panel("+this.type+")#"+z.nd(this)};var hj;I.Position=hj=z.s(I,"Position",0);I.Horizontal=z.s(I,"Horizontal",1);var Ek; +I.Vertical=Ek=z.s(I,"Vertical",2);var aj;I.Spot=aj=z.s(I,"Spot",3);var Fk;I.Auto=Fk=z.s(I,"Auto",4);var ga;I.Table=ga=z.s(I,"Table",5);I.Viewbox=z.s(I,"Viewbox",6);var Rm;I.TableRow=Rm=z.s(I,"TableRow",7);var Sm;I.TableColumn=Sm=z.s(I,"TableColumn",8);var Ni;I.Link=Ni=z.s(I,"Link",9);var Ik;I.Grid=Ik=z.s(I,"Grid",10); +z.defineProperty(I,{type:"type"},function(){return this.ba},function(a){var b=this.ba;b!==a&&(u&&z.Ba(a,I,I,"type"),b!==Rm&&b!==Sm||z.k("Cannot change Panel.type when it is already a TableRow or a TableColumn: "+a),this.ba=a,this.ba===Ik?this.eh=!0:this.ba===ga&&Un(this),this.Q(),this.j("type",b,a))});z.w(I,{elements:"elements"},function(){return this.va.i});z.w(I,{Ga:"naturalBounds"},function(){return this.Wc}); +z.defineProperty(I,{padding:"padding"},function(){return this.df},function(a){"number"===typeof a?(0>a&&z.ka(a,">= 0",I,"padding"),a=new Db(a)):(z.l(a,Db,I,"padding"),0>a.left&&z.ka(a.left,">= 0",I,"padding:value.left"),0>a.right&&z.ka(a.right,">= 0",I,"padding:value.right"),0>a.top&&z.ka(a.top,">= 0",I,"padding:value.top"),0>a.bottom&&z.ka(a.bottom,">= 0",I,"padding:value.bottom"));var b=this.df;b.N(a)||(this.df=a=a.V(),this.Q(),this.j("padding",b,a))}); +z.defineProperty(I,{Cl:"defaultAlignment"},function(){return this.Lq},function(a){var b=this.Lq;b.N(a)||(u&&z.l(a,Q,I,"defaultAlignment"),this.Lq=a=a.V(),this.Q(),this.j("defaultAlignment",b,a))});z.defineProperty(I,{Xd:"defaultStretch"},function(){return this.Ci},function(a){var b=this.Ci;b!==a&&(z.Ba(a,O,I,"defaultStretch"),this.Ci=a,this.Q(),this.j("defaultStretch",b,a))}); +z.defineProperty(I,{qK:"defaultSeparatorPadding"},function(){return void 0===this.Bj?Kd:this.Bj},function(a){if(void 0!==this.Bj){"number"===typeof a?a=new Db(a):u&&z.l(a,Db,I,"defaultSeparatorPadding");var b=this.Bj;b.N(a)||(this.Bj=a=a.V(),this.j("defaultSeparatorPadding",b,a))}}); +z.defineProperty(I,{oK:"defaultRowSeparatorStroke"},function(){return void 0===this.Bi?null:this.Bi},function(a){var b=this.Bi;b!==a&&(null===a||"string"===typeof a||a instanceof Da)&&(a instanceof Da&&a.freeze(),this.Bi=a,this.j("defaultRowSeparatorStroke",b,a))});z.defineProperty(I,{pK:"defaultRowSeparatorStrokeWidth"},function(){return void 0===this.Oh?1:this.Oh},function(a){if(void 0!==this.Oh){var b=this.Oh;b!==a&&isFinite(a)&&0<=a&&(this.Oh=a,this.j("defaultRowSeparatorStrokeWidth",b,a))}}); +z.defineProperty(I,{nK:"defaultRowSeparatorDashArray"},function(){return void 0===this.gm?null:this.gm},function(a){if(void 0!==this.gm){var b=this.gm;if(b!==a){null===a||Array.isArray(a)||z.ic(a,"Array",I,"defaultRowSeparatorDashArray:value");if(null!==a){for(var c=a.length,d=0,e=0;e<c;e++){var g=a[e];"number"===typeof g&&0<=g&&isFinite(g)||z.k("defaultRowSeparatorDashArray value "+g+" at index "+e+" must be a positive number or zero.");d+=g}if(0===d){if(null===b)return;a=null}}this.gm=a;this.ta(); +this.j("defaultRowSeparatorDashArray",b,a)}}});z.defineProperty(I,{iK:"defaultColumnSeparatorStroke"},function(){return void 0===this.Mh?null:this.Mh},function(a){if(void 0!==this.Mh){var b=this.Mh;b!==a&&(null===a||"string"===typeof a||a instanceof Da)&&(a instanceof Da&&a.freeze(),this.Mh=a,this.j("defaultColumnSeparatorStroke",b,a))}}); +z.defineProperty(I,{jK:"defaultColumnSeparatorStrokeWidth"},function(){return void 0===this.Nh?1:this.Nh},function(a){if(void 0!==this.Nh){var b=this.Nh;b!==a&&isFinite(a)&&0<=a&&(this.Nh=a,this.j("defaultColumnSeparatorStrokeWidth",b,a))}}); +z.defineProperty(I,{hK:"defaultColumnSeparatorDashArray"},function(){return void 0===this.fm?null:this.fm},function(a){if(void 0!==this.fm){var b=this.fm;if(b!==a){null===a||Array.isArray(a)||z.ic(a,"Array",I,"defaultColumnSeparatorDashArray:value");if(null!==a){for(var c=a.length,d=0,e=0;e<c;e++){var g=a[e];"number"===typeof g&&0<=g&&isFinite(g)||z.k("defaultColumnSeparatorDashArray value "+g+" at index "+e+" must be a positive number or zero.");d+=g}if(0===d){if(null===b)return;a=null}}this.fm= +a;this.ta();this.j("defaultColumnSeparatorDashArray",b,a)}}});z.defineProperty(I,{FL:"viewboxStretch"},function(){return this.Yo},function(a){var b=this.Yo;b!==a&&(z.Ba(a,O,I,"viewboxStretch"),this.Yo=a,this.j("viewboxStretch",b,a))}); +z.defineProperty(I,{ex:"gridCellSize"},function(){return this.cr},function(a){var b=this.cr;b.N(a)||(z.l(a,Ea,I,"gridCellSize"),a.F()&&0!==a.width&&0!==a.height||z.k("Invalid Panel.gridCellSize: "+a),this.cr=a.V(),null!==this.h&&this===this.h.tp&&hl(this.h),this.ta(),this.j("gridCellSize",b,a))}); +z.defineProperty(I,{zE:"gridOrigin"},function(){return this.dr},function(a){var b=this.dr;b.N(a)||(z.l(a,N,I,"gridOrigin"),a.F()||z.k("Invalid Panel.gridOrigin: "+a),this.dr=a.V(),null!==this.h&&hl(this.h),this.ta(),this.j("gridOrigin",b,a))});f=I.prototype;f.Sv=function(a){O.prototype.Sv.call(this,a);for(var b=this.va.o,c=b.length,d=0;d<c;d++)b[d].Sv(a)}; +f.ok=function(a,b){if(this.ba===Ik){var c=this.hj()*b.scale;0>=c&&(c=1);var d=this.ex,e=d.width,d=d.height,g=this.Ga,h=g.width,g=g.height,k=Math.ceil(h/e),l=Math.ceil(g/d),m=this.zE;a.save();a.beginPath();a.rect(0,0,h,g);a.clip();for(var n=[],p=this.va.o,q=p.length,r=0;r<q;r++){var s=p[r],t=[];n.push(t);if(s.visible)for(var s=Hl(s.Hb),v=r+1;v<q;v++){var x=p[v];x.visible&&Hl(x.Hb)===s&&(x=x.interval,2<=x&&t.push(x))}}p=this.va.o;q=p.length;for(r=0;r<q;r++){var y=p[r];if(y.visible&&(t=y.interval,!(2> +e*t*c))){var s=n[r],v=!1,A=!0,C=y.PF;null!==C&&(v=!0,A=a.Tz(C,y.we));if("LineV"===y.Hb){a.lineWidth=y.ub;Vm(this,a,y.stroke,!1,!1);a.beginPath();for(var L=x=Math.floor(-m.x/e);L<=x+k;L++){var H=L*e+m.x;0<=H&&H<h&&Wn(L,t,s)&&(v&&!A?Im(a,H,0,H,g,C,y.we):(a.moveTo(H,0),a.lineTo(H,g)))}a.stroke()}else if("LineH"===y.Hb){a.lineWidth=y.ub;Vm(this,a,y.stroke,!1,!1);a.beginPath();for(L=x=Math.floor(-m.y/d);L<=x+l;L++)H=L*d+m.y,0<=H&&H<=g&&Wn(L,t,s)&&(v&&!A?Im(a,0,H,h,H,C,y.we):(a.moveTo(0,H),a.lineTo(h,H))); +a.stroke()}else if("BarV"===y.Hb)for(Vm(this,a,y.fill,!0,!1),y=y.width,isNaN(y)&&(y=e),L=x=Math.floor(-m.x/e);L<=x+k;L++)H=L*e+m.x,0<=H&&H<h&&Wn(L,t,s)&&a.fillRect(H,0,y,g);else if("BarH"===y.Hb)for(Vm(this,a,y.fill,!0,!1),y=y.height,isNaN(y)&&(y=d),L=x=Math.floor(-m.y/d);L<=x+l;L++)H=L*d+m.y,0<=H&&H<=g&&Wn(L,t,s)&&a.fillRect(0,H,h,y);v&&a.Pz()}}a.restore();ca(a,!1)}else{this.ba===ga&&(a.lineCap="butt",Xn(this,a,!0,this.Wd,!0),Xn(this,a,!1,this.Sd,!0),Yn(this,a,!0,this.Wd),Yn(this,a,!1,this.Sd),Xn(this, +a,!0,this.Wd,!1),Xn(this,a,!1,this.Sd,!1));(c=this.JE)&&a.save();e=this.gf();d=this.va.o;h=d.length;for(g=0;g<h;g++)k=d[g],c&&k===e&&(a.Nw=!0),k.ff(a,b),c&&k===e&&(a.Nw=!1);c&&(a.restore(),ca(a,!0));u&&u.AH&&this instanceof G&&u.zH(a,b,this)}}; +function Yn(a,b,c,d){for(var e=d.length,g=a.W,h=c?a.$d(0):a.Zd(0),k=0;k<e;k++){var l=d[k];if(void 0!==l&&l!==h&&0!==l.Oa){if(c){if(l.position>g.height)continue}else if(l.position>g.width)continue;var m=l.$p;isNaN(m)&&(m=c?a.Oh:a.Nh);var n=l.Zp;null===n&&(n=c?a.Bi:a.Mh);if(0!==m&&null!==n){Vm(a,b,n,!1,!1);var n=!1,p=!0,q=l.hJ;null!==q&&(n=!0,void 0!==b.setLineDash?(b.setLineDash(q),b.lineDashOffset=a.we):void 0!==b.webkitLineDash?(b.webkitLineDash=q,b.webkitLineDashOffset=a.we):void 0!==b.mozDash? +(b.mozDash=q,b.mozDashOffset=a.we):p=!1);b.beginPath();var r=l.position+m;c?r>g.height&&(m-=r-g.height):r>g.width&&(m-=r-g.width);l=l.position+m/2;b.lineWidth=m;r=a.padding;c?(l+=r.top,m=r.left,r=g.width-r.right,n&&!p?Im(b,m,l,r,l,q,0):(b.moveTo(m,l),b.lineTo(r,l))):(l+=r.left,m=r.top,r=g.height-r.bottom,n&&!p?Im(b,l,m,l,r,q,0):(b.moveTo(l,m),b.lineTo(l,r)));b.stroke();n&&(void 0!==b.setLineDash?(b.setLineDash(z.yj),b.lineDashOffset=0):void 0!==b.webkitLineDash?(b.webkitLineDash=z.yj,b.webkitLineDashOffset= +0):void 0!==b.mozDash&&(b.mozDash=null,b.mozDashOffset=0))}}}} +function Xn(a,b,c,d,e){for(var g=d.length,h=a.W,k=0;k<g;k++){var l=d[k];if(void 0!==l&&null!==l.background&&l.Mz!==e&&0!==l.Oa){var m=c?h.height:h.width;if(!(l.position>m)){var n=l.Re(),p=l.$p;isNaN(p)&&(p=c?a.Oh:a.Nh);var q=l.Zp;null===q&&(q=c?a.Bi:a.Mh);null===q&&(p=0);n-=p;p=l.position+p;n+=l.Oa;p+n>m&&(n=m-p);0>=n||(m=a.padding,Vm(a,b,l.background,!0,!1),c?b.fillRect(m.left,p+m.top,h.width-(m.left+m.right),n):b.fillRect(p+m.left,m.top,n,h.height-(m.top+m.bottom)))}}}} +function Wn(a,b,c){if(0!==a%b)return!1;b=c.length;for(var d=0;d<b;d++)if(0===a%c[d])return!1;return!0}function Hl(a){return"LineV"===a||"BarV"===a} +f.sp=function(a,b,c,d,e){var g=this.Wg(),h=this.transform,k=1/(h.m11*h.m22-h.m12*h.m21),l=h.m22*k,m=-h.m12*k,n=-h.m21*k,p=h.m11*k,q=k*(h.m21*h.dy-h.m22*h.dx),r=k*(h.m12*h.dx-h.m11*h.dy);if(null!==this.wl)return h=this.W,Ne(h.left,h.top,h.right,h.bottom,a,b,c,d,e);if(null!==this.background)g=a*l+b*n+q,k=a*m+b*p+r,a=c*l+d*n+q,c=c*m+d*p+r,e.n(0,0),d=this.Ga,c=Ne(0,0,d.width,d.height,g,k,a,c,e),e.transform(h);else{g||(l=1,n=m=0,p=1,r=q=0);k=a*l+b*n+q;a=a*m+b*p+r;l=c*l+d*n+q;d=c*m+d*p+r;e.n(l,d);m=(l- +k)*(l-k)+(d-a)*(d-a);c=!1;p=this.va.o;r=p.length;n=z.O();for(q=0;q<r;q++)b=p[q],b.visible&&b.sp(k,a,l,d,n)&&(c=!0,b=(k-n.x)*(k-n.x)+(a-n.y)*(a-n.y),b<m&&(m=b,e.set(n)));z.A(n);g&&e.transform(h)}return c};f.Q=function(a){O.prototype.Q.call(this,a);this.ba===Fk&&(a=this.gf(),null!==a&&a.Q(!0));a=this.va.o;for(var b=a.length,c=0;c<b;c++){var d=a[c];!0!==nl(d)&&(d.Aa.F()||(d instanceof bj||d instanceof I||d instanceof qa||Nm(d,!1)!==cj)&&d.Q(!0))}}; +f.Ap=function(){if(!1===nl(this)){$k(this,!0);Pm(this,!0);for(var a=this.va.o,b=a.length,c=0;c<b;c++)a[c].Ap()}};f.Gi=function(){if(0!==(this.ja&2048)===!1){Xm(this,!0);Ym(this,!0);for(var a=this.va.o,b=a.length,c=0;c<b;c++)a[c].dA()}};f.dA=function(){Ym(this,!0);for(var a=this.va.o,b=a.length,c=0;c<b;c++)a[c].dA()}; +f.Ip=function(a,b,c,d){var e=this.Zi;e.width=0;e.height=0;var g=this.Aa,h=this.dg;void 0===c&&(c=h.width,d=h.height);c=Math.max(c,h.width);d=Math.max(d,h.height);var k=this.Xe;isNaN(g.width)||(a=Math.min(g.width,k.width));isNaN(g.height)||(b=Math.min(g.height,k.height));a=Math.max(c,a);b=Math.max(d,b);var l=this.padding;a=Math.max(a-l.left-l.right,0);b=Math.max(b-l.top-l.bottom,0);var m=this.va.o;if(0!==m.length){var n=this.ba.Ub;switch(n){case "Position":var p=a,q=b,r=c,s=d,t=m.length;e.x=0;e.y= +0;e.width=0;for(var v=e.height=0;v<t;v++){var x=m[v];if(x.visible||x===this.Zb){var y=x.margin,A=y.right+y.left,C=y.top+y.bottom;uj(x,p,q,r,s);var L=x.Ia,H=Math.max(L.width+A,0),U=Math.max(L.height+C,0),ea=x.position.x,W=x.position.y;isFinite(ea)||(ea=0);isFinite(W)||(W=0);if(x instanceof X){var P=x;if(P.LE)var ba=P.ub/2,ea=ea-ba,W=W-ba}Hb(e,ea,W,H,U)}}break;case "Vertical":for(var Oa=a,sa=c,Na=m.length,ua=z.rb(),Ha=0;Ha<Na;Ha++){var Aa=m[Ha];if(Aa.visible||Aa===this.Zb){var jc=Nm(Aa,!1);if(jc!== +cj&&jc!==Cm)ua.push(Aa);else{var zd=Aa.margin,Ad=zd.right+zd.left,Qe=zd.top+zd.bottom;uj(Aa,Oa,Infinity,sa,0);var ac=Aa.Ia,Ng=Math.max(ac.width+Ad,0),Bd=Math.max(ac.height+Qe,0);e.width=Math.max(e.width,Ng);e.height+=Bd}}}var rb=ua.length;if(0!==rb){this.Aa.width?Oa=Math.min(this.Aa.width,this.Xe.width):0!==e.width&&(Oa=Math.min(e.width,this.Xe.width));for(Ha=0;Ha<rb;Ha++)if(Aa=ua[Ha],Aa.visible||Aa===this.Zb)zd=Aa.margin,Ad=zd.right+zd.left,Qe=zd.top+zd.bottom,uj(Aa,Oa,Infinity,sa,0),ac=Aa.Ia,Ng= +Math.max(ac.width+Ad,0),Bd=Math.max(ac.height+Qe,0),e.width=Math.max(e.width,Ng),e.height+=Bd;z.xa(ua)}break;case "Horizontal":for(var gb=b,oa=d,pa=m.length,sb=z.rb(),Xa=0;Xa<pa;Xa++){var Va=m[Xa];if(Va.visible||Va===this.Zb){var Ae=Nm(Va,!1);if(Ae!==cj&&Ae!==Dm)sb.push(Va);else{var Cd=Va.margin,me=Cd.right+Cd.left,Rd=Cd.top+Cd.bottom;uj(Va,Infinity,gb,0,oa);var ne=Va.Ia,Og=Math.max(ne.width+me,0),fd=Math.max(ne.height+Rd,0);e.width+=Og;e.height=Math.max(e.height,fd)}}}var ti=sb.length;if(0!==ti){this.Aa.height? +gb=Math.min(this.Aa.height,this.Xe.height):0!==e.height&&(gb=Math.min(e.height,this.Xe.height));for(Xa=0;Xa<ti;Xa++)if(Va=sb[Xa],Va.visible||Va===this.Zb)Cd=Va.margin,me=Cd.right+Cd.left,Rd=Cd.top+Cd.bottom,uj(Va,Infinity,gb,0,oa),ne=Va.Ia,Og=Math.max(ne.width+me,0),fd=Math.max(ne.height+Rd,0),e.width+=Og,e.height=Math.max(e.height,fd);z.xa(sb)}break;case "Spot":a:{var Ab=a,Qb=b,gd=c,ph=d,Lb=m.length,kb=this.gf(),cb=kb.margin,Re=0,Sd=0,Pg=cb.right+cb.left,Qg=cb.top+cb.bottom;uj(kb,Ab,Qb,gd,ph);var kc= +kb.Ia,lc=kc.width,oe=kc.height,hd=Math.max(lc+Pg,0),mb=Math.max(oe+Qg,0);e.x=-cb.left;e.y=-cb.top;e.width=hd;e.height=mb;for(var Uc=0;Uc<Lb;Uc++){var Qa=m[Uc];if(Qa!==kb&&(Qa.visible||Qa===this.Zb)){cb=Qa.margin;Re=cb.right+cb.left;Sd=cb.top+cb.bottom;uj(Qa,Ab,Qb,0,0);var kc=Qa.Ia,hd=Math.max(kc.width+Re,0),mb=Math.max(kc.height+Sd,0),nb=Qa.alignment;nb.bd()&&(nb=this.Cl);nb.cd()||(nb=ec);var yc=Qa.kk;yc.bd()&&(yc=ec);Hb(e,nb.x*lc+nb.offsetX-(yc.x*kc.width-yc.offsetX)-cb.left,nb.y*oe+nb.offsetY-(yc.y* +kc.height-yc.offsetY)-cb.top,hd,mb)}}var Dd=kb.stretch;Dd===Bm&&(Dd=Nm(kb,!1));switch(Dd){case cj:break a;case lf:if(!isFinite(Ab)&&!isFinite(Qb))break a;break;case Dm:if(!isFinite(Ab))break a;break;case Cm:if(!isFinite(Qb))break a}kc=kb.Ia;lc=kc.width;oe=kc.height;hd=Math.max(lc+Pg,0);mb=Math.max(oe+Qg,0);cb=kb.margin;e.x=-cb.left;e.y=-cb.top;e.width=hd;e.height=mb;for(Uc=0;Uc<Lb;Uc++)Qa=m[Uc],Qa===kb||!Qa.visible&&Qa!==this.Zb||(cb=Qa.margin,Re=cb.right+cb.left,Sd=cb.top+cb.bottom,kc=Qa.Ia,hd=Math.max(kc.width+ +Re,0),mb=Math.max(kc.height+Sd,0),nb=Qa.alignment,nb.bd()&&(nb=this.Cl),nb.cd()||(nb=ec),yc=Qa.kk,yc.bd()&&(yc=ec),Hb(e,nb.x*lc+nb.offsetX-(yc.x*kc.width-yc.offsetX)-cb.left,nb.y*oe+nb.offsetY-(yc.y*kc.height-yc.offsetY)-cb.top,hd,mb))}break;case "Auto":var Mb=a,pe=b,tf=c,Se=d,Mf=m.length,Ib=this.gf(),Be=Ib.margin,Rb=Be.right+Be.left,Vb=Be.top+Be.bottom;uj(Ib,Mb,pe,tf,Se);var Nb=Ib.Ia,Jc=0;if(Ib instanceof X)var xb=Ib,Jc=xb.ub*xb.scale;var Fb=Math.max(Nb.width+Rb,0),Ob=Math.max(Nb.height+Vb,0),Td= +Zn(Ib),Rg=Td.x*Fb+Td.offsetX,qh=Td.y*Ob+Td.offsetY,Td=$n(Ib),rh=Td.x*Fb+Td.offsetX,Ce=Td.y*Ob+Td.offsetY,Kc=Mb,De=pe;isFinite(Mb)&&(Kc=Math.max(Math.abs(Rg-rh)-Jc,0));isFinite(pe)&&(De=Math.max(Math.abs(qh-Ce)-Jc,0));var mc=z.Xl();mc.n(0,0);for(var Bb=0;Bb<Mf;Bb++){var Cb=m[Bb];if(Cb!==Ib&&(Cb.visible||Cb===this.Zb)){var Be=Cb.margin,Lc=Be.right+Be.left,Sg=Be.top+Be.bottom;uj(Cb,Kc,De,0,0);Nb=Cb.Ia;Fb=Math.max(Nb.width+Lc,0);Ob=Math.max(Nb.height+Sg,0);mc.n(Math.max(Fb,mc.width),Math.max(Ob,mc.height))}}if(1=== +Mf)e.width=Fb,e.height=Ob,z.qk(mc);else{var Vc=Zn(Ib),Wc=$n(Ib),lb=0,Mc=0;Wc.x!==Vc.x&&Wc.y!==Vc.y&&(lb=mc.width/Math.abs(Wc.x-Vc.x),Mc=mc.height/Math.abs(Wc.y-Vc.y));z.qk(mc);Jc=0;Ib instanceof X&&(xb=Ib,Jc=xb.ub*xb.scale,dj(xb)===ej&&(lb=Mc=Math.max(lb,Mc)));var lb=lb+(Math.abs(Vc.offsetX)+Math.abs(Wc.offsetX)+Jc),Mc=Mc+(Math.abs(Vc.offsetY)+Math.abs(Wc.offsetY)+Jc),Ud=Ib.stretch;Ud===Bm&&(Ud=Nm(Ib,!1));switch(Ud){case cj:Se=tf=0;break;case lf:isFinite(Mb)&&(lb=Mb);isFinite(pe)&&(Mc=pe);break;case Dm:isFinite(Mb)&& +(lb=Mb);Se=0;break;case Cm:tf=0,isFinite(pe)&&(Mc=pe)}Ib instanceof X&&!Ib.Aa.F()&&xb.qe();Ib.Ap();uj(Ib,lb,Mc,tf,Se);e.width=Ib.Ia.width+Rb;e.height=Ib.Ia.height+Vb}break;case "Table":for(var Vd=a,uf=b,Tg=c,yj=d,La=m.length,Te=z.rb(),qe=z.rb(),ia=0;ia<La;ia++){var fa=m[ia],id=fa instanceof I?fa:null;if(null===id||id.type!==Rm&&id.type!==Sm||!fa.visible)Te.push(fa);else{u&&(id.Aa.F()&&z.k(id.toString()+" TableRow/TableColumn Panels cannot set a desiredSize: "+id.Aa.toString()),id.dg.N(Pd)||z.k(id.toString()+ +" TableRow/TableColumn Panels cannot set a minSize: "+id.dg.toString()),id.Xe.N(de)||z.k(id.toString()+" TableRow/TableColumn Panels cannot set a maxSize: "+id.Xe.toString()));qe.push(fa);for(var sh=id.va.o,ui=sh.length,zc=0;zc<ui;zc++){var vi=sh[zc];id.type===Rm?vi.Vb=fa.Vb:id.type===Sm&&(vi.column=fa.column);Te.push(vi)}}}La=Te.length;0===La&&(this.$d(0),this.Zd(0));for(var bc=[],ia=0;ia<La;ia++)fa=Te[ia],$k(fa,!0),Pm(fa,!0),bc[fa.Vb]||(bc[fa.Vb]=[]),bc[fa.Vb][fa.column]||(bc[fa.Vb][fa.column]= +[]),bc[fa.Vb][fa.column].push(fa);z.xa(Te);for(var th=z.rb(),jd=z.rb(),Ee=z.rb(),Nc={count:0},kd={count:0},Ac=Vd,ld=uf,eg=this.Wd,La=eg.length,ia=0;ia<La;ia++){var Z=eg[ia];void 0!==Z&&(Z.Oa=0)}eg=this.Sd;La=eg.length;for(ia=0;ia<La;ia++)Z=eg[ia],void 0!==Z&&(Z.Oa=0);for(var Fe=bc.length,Ue=0,ia=0;ia<Fe;ia++)bc[ia]&&(Ue=Math.max(Ue,bc[ia].length));for(var wi=Math.min(this.Yi,Fe-1),xi=Math.min(this.Ki,Ue-1),Oc=0,Fe=bc.length,ia=0;ia<Fe;ia++)if(bc[ia])for(var Ue=bc[ia].length,ob=this.$d(ia),zc=ob.Oa= +0;zc<Ue;zc++)if(bc[ia][zc]){var pb=this.Zd(zc);void 0===th[zc]&&(pb.Oa=0,th[zc]=!0);for(var Zk=bc[ia][zc],fg=Zk.length,Ug=0;Ug<fg;Ug++)if(fa=Zk[Ug],fa.visible||fa===this.Zb){var Vg=1<fa.Ui||1<fa.xi;Vg&&(ia<wi||zc<xi||jd.push(fa));var Wb=fa.margin,gg=Wb.right+Wb.left,hg=Wb.top+Wb.bottom,Xc=$m(fa,ob,pb,!1),Ge=fa.Aa,zn=!isNaN(Ge.height),yi=!isNaN(Ge.width)&&zn;Vg||Xc===cj||yi||ia<wi||zc<xi||(void 0!==Nc[zc]||Xc!==lf&&Xc!==Dm||(Nc[zc]=-1,Nc.count++),void 0!==kd[ia]||Xc!==lf&&Xc!==Cm||(kd[ia]=-1,kd.count++), +Ee.push(fa));uj(fa,Infinity,Infinity,0,0);if(!(ia<wi||zc<xi)){var Ve=fa.Ia,We=Math.max(Ve.width+gg,0),Ed=Math.max(Ve.height+hg,0);if(1===fa.Ui&&(Xc===cj||Xc===Dm)){var Z=this.$d(ia),md=Z.Re(),Oc=Math.max(Ed-Z.Oa,0);Oc+md>ld&&(Oc=Math.max(ld-md,0));var uh=0===Z.Oa;Z.Oa+=Oc;ld=Math.max(ld-(Oc+(uh?md:0)),0)}1!==fa.xi||Xc!==cj&&Xc!==Cm||(Z=this.Zd(zc),md=Z.Re(),Oc=Math.max(We-Z.Oa,0),Oc+md>Ac&&(Oc=Math.max(Ac-md,0)),uh=0===Z.Oa,Z.Oa+=Oc,Ac=Math.max(Ac-(Oc+(uh?md:0)),0));Vg&&fa.Ap()}}}z.xa(th);for(var Wd= +0,Xd=0,La=this.fp,ia=0;ia<La;ia++){var vh=this.Sd[ia];void 0!==vh&&(Wd+=vh.Xa,0!==vh.Xa&&(Wd+=vh.Re()))}La=this.Yp;for(ia=0;ia<La;ia++){var wh=this.Wd[ia];void 0!==wh&&(Xd+=wh.Xa,0!==wh.Xa&&(Xd+=wh.Re()))}for(var Ac=Math.max(Vd-Wd,0),nd=ld=Math.max(uf-Xd,0),Wg=Ac,La=Ee.length,ia=0;ia<La;ia++){var fa=Ee[ia],ob=this.$d(fa.Vb),pb=this.Zd(fa.column),vf=fa.Ia,Wb=fa.margin,gg=Wb.right+Wb.left,hg=Wb.top+Wb.bottom;Nc[fa.column]=0===pb.Oa&&void 0!==Nc[fa.column]?Math.max(vf.width+gg,Nc[fa.column]):null;kd[fa.Vb]= +0===ob.Oa&&void 0!==kd[fa.Vb]?Math.max(vf.height+hg,kd[fa.Vb]):null}var nc=0,xh=0;for(ia in kd)"count"!==ia&&(nc+=kd[ia]);for(ia in Nc)"count"!==ia&&(xh+=Nc[ia]);for(var qb=z.Xl(),ia=0;ia<La;ia++)if(fa=Ee[ia],fa.visible||fa===this.Zb){var ob=this.$d(fa.Vb),pb=this.Zd(fa.column),He=0;isFinite(pb.width)?He=pb.width:(He=isFinite(Ac)&&null!==Nc[fa.column]?0===xh?pb.Oa+Ac:Nc[fa.column]/xh*Wg:null!==Nc[fa.column]?Ac:pb.Oa||Ac,He=Math.max(0,He-pb.Re()));var Nf=0;isFinite(ob.height)?Nf=ob.height:(Nf=isFinite(ld)&& +null!==kd[fa.Vb]?0===nc?ob.Oa+ld:kd[fa.Vb]/nc*nd:null!==kd[fa.Vb]?ld:ob.Oa||ld,Nf=Math.max(0,Nf-ob.Re()));qb.n(Math.max(pb.qj,Math.min(He,pb.qf)),Math.max(ob.qj,Math.min(Nf,ob.qf)));Xc=$m(fa,ob,pb,!1);switch(Xc){case Dm:qb.height=Math.max(qb.height,ob.Oa+ld);break;case Cm:qb.width=Math.max(qb.width,pb.Oa+Ac)}Wb=fa.margin;gg=Wb.right+Wb.left;hg=Wb.top+Wb.bottom;fa.Ap();uj(fa,qb.width,qb.height,pb.qj,ob.qj);Ve=fa.Ia;We=Math.max(Ve.width+gg,0);Ed=Math.max(Ve.height+hg,0);isFinite(Ac)&&(We=Math.min(We, +qb.width));isFinite(ld)&&(Ed=Math.min(Ed,qb.height));var wf=0,wf=ob.Oa;ob.Oa=Math.max(ob.Oa,Ed);Oc=ob.Oa-wf;ld=Math.max(ld-Oc,0);wf=pb.Oa;pb.Oa=Math.max(pb.Oa,We);Oc=pb.Oa-wf;Ac=Math.max(Ac-Oc,0)}z.xa(Ee);for(var Yd=z.Xl(),La=jd.length,ia=0;ia<La;ia++)if(fa=jd[ia],fa.visible||fa===this.Zb){ob=this.$d(fa.Vb);pb=this.Zd(fa.column);qb.n(Math.max(pb.qj,Math.min(Vd,pb.qf)),Math.max(ob.qj,Math.min(uf,ob.qf)));Xc=$m(fa,ob,pb,!1);switch(Xc){case lf:0!==pb.Oa&&(qb.width=Math.min(qb.width,pb.Oa));0!==ob.Oa&& +(qb.height=Math.min(qb.height,ob.Oa));break;case Dm:0!==pb.Oa&&(qb.width=Math.min(qb.width,pb.Oa));break;case Cm:0!==ob.Oa&&(qb.height=Math.min(qb.height,ob.Oa))}isFinite(pb.width)&&(qb.width=pb.width);isFinite(ob.height)&&(qb.height=ob.height);Yd.n(0,0);for(var hb=1;hb<fa.Ui&&!(fa.Vb+hb>=this.Yp);hb++)Z=this.$d(fa.Vb+hb),Yd.height+=Math.max(Z.qj,isNaN(Z.ef)?Z.qf:Math.min(Z.ef,Z.qf));for(hb=1;hb<fa.xi&&!(fa.column+hb>=this.fp);hb++)Z=this.Zd(fa.column+hb),Yd.width+=Math.max(Z.qj,isNaN(Z.ef)?Z.qf: +Math.min(Z.ef,Z.qf));qb.width+=Yd.width;qb.height+=Yd.height;Wb=fa.margin;gg=Wb.right+Wb.left;hg=Wb.top+Wb.bottom;uj(fa,qb.width,qb.height,Tg,yj);for(var Ve=fa.Ia,We=Math.max(Ve.width+gg,0),Ed=Math.max(Ve.height+hg,0),Xg=0,hb=0;hb<fa.Ui&&!(fa.Vb+hb>=this.Yp);hb++)Z=this.$d(fa.Vb+hb),Xg+=Z.total||0;if(Xg<Ed){var rc=Ed-Xg,Bc=Ed-Xg;if(null!==fa.Rx)for(var Fd=fa.Rx,hb=0;hb<fa.Ui&&!(0>=rc)&&!(fa.Vb+hb>=this.Yp);hb++){var Z=this.$d(fa.Vb+hb),Sb=Z.Xa||0,Zd=Fd(fa,Z,Bc);u&&"number"!==typeof Zd&&z.k(fa+" spanAllocation does not return a number: "+ +Zd);Z.Oa=Math.min(Z.qf,Sb+Zd);Z.Xa!==Sb&&(rc-=Z.Xa-Sb)}for(;0<rc;){Sb=Z.Xa||0;isNaN(Z.height)&&Z.qf>Sb&&(Z.Oa=Math.min(Z.qf,Sb+rc),Z.Xa!==Sb&&(rc-=Z.Xa-Sb));if(0===Z.index)break;Z=this.$d(Z.index-1)}}for(var Ie=0,hb=0;hb<fa.xi&&!(fa.column+hb>=this.fp);hb++)Z=this.Zd(fa.column+hb),Ie+=Z.total||0;if(Ie<We){rc=We-Ie;Bc=We-Ie;if(null!==fa.Rx)for(Fd=fa.Rx,hb=0;hb<fa.xi&&!(0>=rc)&&!(fa.column+hb>=this.fp);hb++)Z=this.Zd(fa.column+hb),Sb=Z.Xa||0,Zd=Fd(fa,Z,Bc),u&&"number"!==typeof Zd&&z.k(fa+" spanAllocation does not return a number: "+ +Zd),Z.Oa=Math.min(Z.qf,Sb+Zd),Z.Xa!==Sb&&(rc-=Z.Xa-Sb);for(;0<rc;){Sb=Z.Xa||0;isNaN(Z.width)&&Z.qf>Sb&&(Z.Oa=Math.min(Z.qf,Sb+rc),Z.Xa!==Sb&&(rc-=Z.Xa-Sb));if(0===Z.index)break;Z=this.Zd(Z.index-1)}}}z.xa(jd);z.qk(Yd);z.qk(qb);for(var ig=0,jg=0,Xc=Nm(this,!0),xf=this.Aa,zj=this.Xe,$d=Xd=Wd=0,Yc=0,La=this.fp,ia=0;ia<La;ia++)void 0!==this.Sd[ia]&&(Z=this.Zd(ia),isFinite(Z.width)?($d+=Z.width,$d+=Z.Re()):ao(Z)===bo?($d+=Z.Xa,$d+=Z.Re()):0!==Z.Xa&&(Wd+=Z.Xa,Wd+=Z.Re()));var ig=isFinite(xf.width)?Math.min(xf.width, +zj.width):Xc!==cj&&isFinite(Vd)?Vd:Wd,ig=Math.max(ig,this.dg.width),ig=Math.max(ig-$d,0),zh=Math.max(ig/Wd,1);isFinite(zh)||(zh=1);for(ia=0;ia<La;ia++)void 0!==this.Sd[ia]&&(Z=this.Zd(ia),isFinite(Z.width)||ao(Z)===bo||(Z.Oa=Z.Xa*zh),Z.position=e.width,0!==Z.Xa&&(e.width+=Z.Xa,e.width+=Z.Re()));La=this.Yp;for(ia=0;ia<La;ia++)void 0!==this.Wd[ia]&&(Z=this.$d(ia),isFinite(Z.height)?(Yc+=Z.height,Yc+=Z.Re()):ao(Z)===bo?(Yc+=Z.Xa,Yc+=Z.Re()):0!==Z.Xa&&(Xd+=Z.Xa,0!==Z.Xa&&(Xd+=Z.Re())));var jg=isFinite(xf.height)? +Math.min(xf.height,zj.height):Xc!==cj&&isFinite(uf)?uf:Xd,jg=Math.max(jg,this.dg.height),jg=Math.max(jg-Yc,0),Ah=Math.max(jg/Xd,1);isFinite(Ah)||(Ah=1);for(ia=0;ia<La;ia++)void 0!==this.Wd[ia]&&(Z=this.$d(ia),isFinite(Z.height)||ao(Z)===bo||(Z.Oa=Z.Xa*Ah),Z.position=e.height,0!==Z.Xa&&(e.height+=Z.Xa,0!==Z.Xa&&(e.height+=Z.Re())));La=qe.length;for(ia=0;ia<La;ia++){var oc=qe[ia];oc.type===Rm?(He=e.width,Z=this.$d(oc.Vb),Nf=Z.Oa):(Z=this.Zd(oc.column),He=Z.Oa,Nf=e.height);oc.ud.n(0,0,He,Nf);$k(oc,!1); +bc[oc.Vb]||(bc[oc.Vb]=[]);bc[oc.Vb][oc.column]||(bc[oc.Vb][oc.column]=[]);bc[oc.Vb][oc.column].push(oc)}z.xa(qe);this.vs=bc;break;case "Viewbox":var Bh=a,al=b,Yq=c,Zq=d;1<m.length&&z.k("Viewbox Panel cannot contain more than one GraphObject.");var Xe=m[0];Xe.bc=1;Xe.Ap();uj(Xe,Infinity,Infinity,Yq,Zq);var Aj=Xe.Ia,bl=Xe.margin,$q=bl.right+bl.left,ar=bl.top+bl.bottom;if(isFinite(Bh)||isFinite(al)){var kt=Xe.scale,cl=Aj.width,dl=Aj.height,br=Math.max(Bh-$q,0),cr=Math.max(al-ar,0),Bj=1;this.Yo===ej? +0!==cl&&0!==dl&&(Bj=Math.min(br/cl,cr/dl)):0!==cl&&0!==dl&&(Bj=Math.max(br/cl,cr/dl));0===Bj&&(Bj=1E-4);Xe.bc*=Bj;kt!==Xe.scale&&($k(Xe,!0),uj(Xe,Infinity,Infinity,Yq,Zq))}Aj=Xe.Ia;e.width=isFinite(Bh)?Bh:Math.max(Aj.width+$q,0);e.height=isFinite(al)?al:Math.max(Aj.height+ar,0);break;case "Link":var dr=m.length,kg=this instanceof da?this.Xf:this;if(kg instanceof G)if(0===dr){var el=this.Wc;yb(el,0,0);var re=this.Ia;re.n(0,0,0,0)}else{var fl=this instanceof da?null:kg.path,lg=kg.tn,Ye=this.Zi;Ye.assign(lg); +Ye.x=0;var Yg=Ye.y=0,mg=kg.points,Yg=void 0!==this.sa?this.sa:mg.count;this instanceof da?this.nn(!1):kg.nn(!1);var er=lg.width,fr=lg.height;this.Li.n(lg.x,lg.y);null===this.$g&&(this.$g=new J(w));this.$g.clear();null!==fl&&(co(fl,er,fr,this),re=fl.Ia,Ye.ri(re),this.$g.add(re));for(var ng=z.Hh(),Cj=z.O(),og=z.O(),An=0;An<dr;An++){var Xb=m[An];if(Xb!==fl)if(Xb.Ff&&Xb instanceof X)co(Xb,er,fr,this),re=Xb.Ia,Ye.ri(re),this.$g.add(re);else if(2>Yg)uj(Xb,Infinity,Infinity),re=Xb.Ia,Ye.ri(re),this.$g.add(re); +else{var od=Xb.De,hr=Xb.MA,Bn=Xb.kk;Bn.Be()&&(Bn=ec);var Of=Xb.pu,lt=Xb.DF,Dj=0,Ej=0,gl=0;if(od<-Yg||od>=Yg){var ir=kg.aF,yf=kg.$E;Of!==Qi&&(gl=kg.computeAngle(Xb,Of,yf),Xb.bm=gl);Dj=ir.x-lg.x;Ej=ir.y-lg.y}else{var Gd,Ze;if(0<=od)Gd=mg.ea(od),Ze=od<Yg-1?mg.ea(od+1):Gd;else{var Ch=Yg+od;Gd=mg.ea(Ch);Ze=0<Ch?mg.ea(Ch-1):Gd}if(Gd.Mc(Ze)){var Dh,Eh;0<=od?(Dh=0<od?mg.ea(od-1):Gd,Eh=od<Yg-2?mg.ea(od+2):Ze):(Dh=Ch<Yg-1?mg.ea(Ch+1):Gd,Eh=1<Ch?mg.ea(Ch-2):Ze);var jr=Dh.Af(Gd),kr=Ze.Af(Eh),yf=jr>kr+10?0<=od? +Dh.Ec(Gd):Gd.Ec(Dh):kr>jr+10?0<=od?Ze.Ec(Eh):Eh.Ec(Ze):0<=od?Dh.Ec(Eh):Eh.Ec(Dh)}else yf=0<=od?Gd.Ec(Ze):Ze.Ec(Gd);Of!==Qi&&(gl=kg.computeAngle(Xb,Of,yf),Xb.bm=gl);Dj=Gd.x+(Ze.x-Gd.x)*hr-lg.x;Ej=Gd.y+(Ze.y-Gd.y)*hr-lg.y}uj(Xb,Infinity,Infinity);var re=Xb.Ia,el=Xb.Ga,Fj=0;Xb instanceof X&&(Fj=Xb.ub);var Fh=el.width+Fj,zi=el.height+Fj;ng.reset();ng.translate(-re.x,-re.y);ng.scale(Xb.scale,Xb.scale);ng.rotate(Of===Qi?Xb.angle:yf,Fh/2,zi/2);Of!==eo&&Of!==fo||ng.rotate(90,Fh/2,zi/2);Of!==ho&&Of!==io|| +ng.rotate(-90,Fh/2,zi/2);Of===jo&&(45<yf&&135>yf||225<yf&&315>yf)&&ng.rotate(-yf,Fh/2,zi/2);var Ai=new w(0,0,Fh,zi);Cj.ru(Ai,Bn);ng.Cb(Cj);var mt=-Cj.x+Fj/2,nt=-Cj.y+Fj/2;og.assign(lt);isNaN(og.x)&&(og.x=0<=od?Fh/2+3:-(Fh/2+3));isNaN(og.y)&&(og.y=-(zi/2+3));og.rotate(yf);Dj+=og.x;Ej+=og.y;Ai.set(re);Ai.x=Dj+mt;Ai.y=Ej+nt;this.$g.add(Ai);Ye.ri(Ai)}}if(this.Ke)for(var lr=this.Hf;lr.next();)uj(lr.value,Infinity,Infinity);this.Zi=Ye;var Dn=this.Li;Dn.n(Dn.x+Ye.x,Dn.y+Ye.y);yb(e,Ye.width||0,Ye.height|| +0);z.jf(ng);z.A(Cj);z.A(og)}break;case "Grid":break;case "TableRow":case "TableColumn":z.k(this.toString()+" is not an element of a Table Panel. TableRow and TableColumn Panels can only be elements of a Table Panel.");break;default:z.k("Unknown panel type: "+n)}}var $e=e.width,af=e.height,ll=this.padding,ot=ll.top+ll.bottom,$e=$e+(ll.left+ll.right),af=af+ot;isFinite(g.width)&&($e=g.width);isFinite(g.height)&&(af=g.height);$e=Math.min(k.width,$e);af=Math.min(k.height,af);$e=Math.max(h.width,$e);af= +Math.max(h.height,af);$e=Math.max(c,$e);af=Math.max(d,af);e.width=$e;e.height=af;yb(this.Wc,$e,af);Km(this,0,0,$e,af)};I.prototype.findMainElement=I.prototype.gf=function(){if(null===this.Km){var a=this.va.o,b=a.length;if(0===b)return null;for(var c=0;c<b;c++){var d=a[c];if(!0===d.Ff)return this.Km=d}this.Km=a[0]}return this.Km}; +I.prototype.aj=function(a,b,c,d){var e=this.Zi,g=this.va.o,h=z.zk(0,0,0,0);if(0===g.length){var k=this.W;k.x=a;k.y=b;k.width=c;k.height=d}else{if(!this.Aa.F()){var l=Nm(this,!0),m=this.ud,n=m.width,p=m.height,q=this.margin,r=q.left+q.right,s=q.top+q.bottom;n===c&&p===d&&(l=cj);switch(l){case cj:if(n>c||p>d)this.Q(),uj(this,n>c?c:n,p>d?d:p);break;case lf:this.Q(!0);uj(this,c+r,d+s,0,0);break;case Dm:this.Q(!0);uj(this,c+r,p+s,0,0);break;case Cm:this.Q(!0),uj(this,n+r,d+s,0,0)}}k=this.W;k.x=a;k.y=b; +k.width=c;k.height=d;var t=this.ba.Ub;switch(t){case "Position":for(var v=g.length,x=e.x-this.padding.left,y=e.y-this.padding.top,A=0;A<v;A++){var C=g[A],L=C.Ia,H=C.margin,U=C.position.x,ea=C.position.y;h.x=isNaN(U)?-x:U-x;h.y=isNaN(ea)?-y:ea-y;if(C instanceof X){var W=C;if(W.LE){var P=W.ub/2;h.x-=P;h.y-=P}}h.x+=H.left;h.y+=H.top;h.width=L.width;h.height=L.height;C.visible&&C.Lc(h.x,h.y,h.width,h.height)}break;case "Vertical":for(var ba=g.length,Oa=this.padding.left,sa=this.padding.top,Na=0;Na<ba;Na++){var ua= +Oa,Ha=g[Na];if(Ha.visible){var Aa=Ha.Ia,jc=Ha.margin,zd=jc.left+jc.right,Ad=Oa+this.padding.right,Qe=Aa.width,ac=Nm(Ha,!1);if(isNaN(Ha.Aa.width)&&ac===lf||ac===Dm)Qe=Math.max(e.width-zd-Ad,0);var Ng=Qe+zd+Ad,Bd=Ha.alignment;Bd.bd()&&(Bd=this.Cl);Bd.cd()||(Bd=ec);Ha.Lc(ua+Bd.offsetX+jc.left+(e.width*Bd.x-Ng*Bd.x),sa+Bd.offsetY+jc.top,Qe,Aa.height);sa+=Aa.height+jc.bottom+jc.top}}break;case "Horizontal":for(var rb=g.length,gb=this.padding.top,oa=this.padding.left,pa=0;pa<rb;pa++){var sb=gb,Xa=g[pa]; +if(Xa.visible){var Va=Xa.Ia,Ae=Xa.margin,Cd=Ae.top+Ae.bottom,me=gb+this.padding.bottom,Rd=Va.height,ne=Nm(Xa,!1);if(isNaN(Xa.Aa.height)&&ne===lf||ne===Cm)Rd=Math.max(e.height-Cd-me,0);var Og=Rd+Cd+me,fd=Xa.alignment;fd.bd()&&(fd=this.Cl);fd.cd()||(fd=ec);Xa.Lc(oa+fd.offsetX+Ae.left,sb+fd.offsetY+Ae.top+(e.height*fd.y-Og*fd.y),Va.width,Rd);oa+=Va.width+Ae.left+Ae.right}}break;case "Spot":var ti=g.length,Ab=this.gf(),Qb=Ab.Ia,gd=Qb.width,ph=Qb.height,Lb=this.padding,kb=Lb.left,cb=Lb.top;h.x=kb-e.x; +h.y=cb-e.y;Ab.Lc(h.x,h.y,gd,ph);for(var Re=0;Re<ti;Re++){var Sd=g[Re];if(Sd!==Ab){var Pg=Sd.Ia,Qg=Pg.width,kc=Pg.height,lc=Sd.alignment;lc.bd()&&(lc=this.Cl);lc.cd()||(lc=ec);var oe=Sd.kk;oe.bd()&&(oe=ec);h.x=lc.x*gd+lc.offsetX-(oe.x*Qg-oe.offsetX);h.y=lc.y*ph+lc.offsetY-(oe.y*kc-oe.offsetY);h.x-=e.x;h.y-=e.y;Sd.visible&&Sd.Lc(kb+h.x,cb+h.y,Qg,kc)}}break;case "Auto":var hd=g.length,mb=this.gf(),Uc=mb.Ia,Qa=z.lg();Qa.n(0,0,1,1);var nb=mb.margin,yc=nb.left,Dd=nb.top,Mb=this.padding,pe=Mb.left,tf=Mb.top; +h.x=yc;h.y=Dd;h.width=Uc.width;h.height=Uc.height;mb.Lc(pe+h.x,tf+h.y,h.width,h.height);var Se=Zn(mb),Mf=$n(mb),Ib=0+Se.y*Uc.height+Se.offsetY,Be=0+Mf.x*Uc.width+Mf.offsetX,Rb=0+Mf.y*Uc.height+Mf.offsetY;Qa.x=0+Se.x*Uc.width+Se.offsetX;Qa.y=Ib;Hb(Qa,Be,Rb,0,0);Qa.x+=yc+pe;Qa.y+=Dd+tf;for(var Vb=0;Vb<hd;Vb++){var Nb=g[Vb];if(Nb!==mb){var Jc=Nb.Ia,nb=Nb.margin,xb=Math.max(Jc.width+nb.right+nb.left,0),Fb=Math.max(Jc.height+nb.top+nb.bottom,0),Ob=Nb.alignment;Ob.bd()&&(Ob=this.Cl);Ob.cd()||(Ob=ec);h.x= +Qa.width*Ob.x+Ob.offsetX-xb*Ob.x+nb.left+Qa.x;h.y=Qa.height*Ob.y+Ob.offsetY-Fb*Ob.y+nb.top+Qa.y;h.width=Qa.width;h.height=Qa.height;Nb.visible&&(Jb(Qa.x,Qa.y,Qa.width,Qa.height,h.x,h.y,Jc.width,Jc.height)?Nb.Lc(h.x,h.y,Jc.width,Jc.height):Nb.Lc(h.x,h.y,Jc.width,Jc.height,new w(Qa.x,Qa.y,Qa.width,Qa.height)))}}z.dc(Qa);break;case "Table":for(var Td=g.length,Rg=this.padding,qh=Rg.left,rh=Rg.top,Ce=this.vs,Kc=0,De=0,mc=Ce.length,Bb=0,Cb=0;Cb<mc;Cb++)Ce[Cb]&&(Bb=Math.max(Bb,Ce[Cb].length));for(var Lc= +Math.min(this.Yi,mc-1);Lc!==mc&&(void 0===this.Wd[Lc]||0===this.Wd[Lc].Xa);)Lc++;for(var Lc=Math.min(Lc,mc-1),Sg=-this.Wd[Lc].sb,Vc=Math.min(this.Ki,Bb-1);Vc!==Bb&&(void 0===this.Sd[Vc]||0===this.Sd[Vc].Xa);)Vc++;for(var Vc=Math.min(Vc,Bb-1),Wc=-this.Sd[Vc].sb,lb=z.Xl(),Cb=0;Cb<mc;Cb++)if(Ce[Cb]){var Bb=Ce[Cb].length,Mc=this.$d(Cb),De=Mc.sb+Sg+rh;0!==Mc.Xa&&(De+=Mc.TD());for(var Ud=0;Ud<Bb;Ud++)if(Ce[Cb][Ud]){var Vd=this.Zd(Ud),Kc=Vd.sb+Wc+qh;0!==Vd.Xa&&(Kc+=Vd.TD());for(var uf=Ce[Cb][Ud],Tg=uf.length, +yj=0;yj<Tg;yj++){var La=uf[yj],Te=La.Ia,qe=La instanceof I?La:null;if(null===qe||qe.type!==Rm&&qe.type!==Sm){lb.n(0,0);for(var ia=1;ia<La.rowSpan&&!(Cb+ia>=this.Yp);ia++){var fa=this.$d(Cb+ia);lb.height+=fa.total}for(ia=1;ia<La.dH&&!(Ud+ia>=this.fp);ia++){var id=this.Zd(Ud+ia);lb.width+=id.total}var sh=Vd.Xa+lb.width,ui=Mc.Xa+lb.height;h.x=Kc;h.y=De;h.width=sh;h.height=ui;var zc=Kc,vi=De,bc=sh,th=ui;Kc+sh>e.width&&(bc=Math.max(e.width-Kc,0));De+ui>e.height&&(th=Math.max(e.height-De,0));var jd=La.alignment, +Ee=0,Nc=0,kd=0,Ac=0;if(jd.bd()){jd=this.Cl;jd.cd()||(jd=ec);var Ee=jd.x,Nc=jd.y,kd=jd.offsetX,Ac=jd.offsetY,ld=Vd.alignment,eg=Mc.alignment;ld.cd()&&(Ee=ld.x,kd=ld.offsetX);eg.cd()&&(Nc=eg.y,Ac=eg.offsetY)}else Ee=jd.x,Nc=jd.y,kd=jd.offsetX,Ac=jd.offsetY;if(isNaN(Ee)||isNaN(Nc))Nc=Ee=.5,Ac=kd=0;var Z=Te.width,Fe=Te.height,Ue=La.margin,wi=Ue.left+Ue.right,xi=Ue.top+Ue.bottom,Oc=$m(La,Mc,Vd,!1);!isNaN(La.Aa.width)||Oc!==lf&&Oc!==Dm||(Z=Math.max(sh-wi,0));!isNaN(La.Aa.height)||Oc!==lf&&Oc!==Cm||(Fe= +Math.max(ui-xi,0));var ob=La.Xe,pb=La.dg,Z=Math.min(ob.width,Z),Fe=Math.min(ob.height,Fe),Z=Math.max(pb.width,Z),Fe=Math.max(pb.height,Fe),Zk=Fe+xi;h.x+=h.width*Ee-(Z+wi)*Ee+kd+Ue.left;h.y+=h.height*Nc-Zk*Nc+Ac+Ue.top;La.visible&&(Jb(zc,vi,bc,th,h.x,h.y,Te.width,Te.height)?La.Lc(h.x,h.y,Z,Fe):La.Lc(h.x,h.y,Z,Fe,new w(zc,vi,bc,th)))}else{La.Gi();La.Xb.Wa();var fg=La.Xb;fg.x=qe.type===Rm?qh:Kc;fg.y=qe.type===Sm?rh:De;fg.width=Te.width;fg.height=Te.height;La.Xb.freeze();Pm(La,!1)}}}}z.qk(lb);for(Cb= +0;Cb<Td;Cb++)La=g[Cb],qe=La instanceof I?La:null,null===qe||qe.type!==Rm&&qe.type!==Sm||(fg=La.Xb,La.Wc.Wa(),La.Wc.n(0,0,fg.width,fg.height),La.Wc.freeze());break;case "Viewbox":var Ug=g[0],Vg=Ug.Ia,Wb=Ug.margin,gg=Wb.top+Wb.bottom,hg=Math.max(Vg.width+(Wb.right+Wb.left),0),Xc=Math.max(Vg.height+gg,0),Ge=Ug.alignment;Ge.bd()&&(Ge=this.Cl);Ge.cd()||(Ge=ec);h.x=e.width*Ge.x-hg*Ge.x+Ge.offsetX;h.y=e.height*Ge.y-Xc*Ge.y+Ge.offsetY;h.width=Vg.width;h.height=Vg.height;Ug.Lc(h.x,h.y,h.width,h.height);break; +case "Link":var zn=g.length,yi=this instanceof da?this.Xf:this;if(yi instanceof G){var Ve=this instanceof da?null:yi.path;if(null!==this.$g){var We=this.$g.o,Ed=0;if(null!==Ve&&Ed<this.$g.count){var md=We[Ed];Ed++;Ve.Lc(md.x-this.Zi.x,md.y-this.Zi.y,md.width,md.height)}for(var uh=0;uh<zn;uh++){var Wd=g[uh];Wd!==Ve&&Ed<this.$g.count&&(md=We[Ed],Ed++,Wd.Lc(md.x-this.Zi.x,md.y-this.Zi.y,md.width,md.height))}}var Xd=yi.points,vh=Xd.count;if(2<=vh&&this.Ke)for(var wh=this.Hf;wh.next();){var nd=wh.value, +Wg=vh,vf=Xd,nc=nd.De,xh=nd.MA,qb=nd.kk,He=nd.pu,Nf=nd.DF,wf=0,Yd=0,hb=0;if(nc<-Wg||nc>=Wg){var Xg=this.aF,rc=this.$E;He!==Qi&&(hb=this.computeAngle(nd,He,rc),nd.angle=hb);wf=Xg.x;Yd=Xg.y}else{var Bc=void 0,Fd=void 0;if(0<=nc)Bc=vf.o[nc],Fd=nc<Wg-1?vf.o[nc+1]:Bc;else var Sb=Wg+nc,Bc=vf.o[Sb],Fd=0<Sb?vf.o[Sb-1]:Bc;if(Bc.Mc(Fd)){var Zd=void 0,Ie=void 0;0<=nc?(Zd=0<nc?vf.o[nc-1]:Bc,Ie=nc<Wg-2?vf.o[nc+2]:Fd):(Zd=Sb<Wg-1?vf.o[Sb+1]:Bc,Ie=1<Sb?vf.o[Sb-2]:Fd);var ig=Zd.Af(Bc),jg=Fd.Af(Ie),rc=ig>jg+10?0<= +nc?Zd.Ec(Bc):Bc.Ec(Zd):jg>ig+10?0<=nc?Fd.Ec(Ie):Ie.Ec(Fd):0<=nc?Zd.Ec(Ie):Ie.Ec(Zd)}else rc=0<=nc?Bc.Ec(Fd):Fd.Ec(Bc);He!==Qi&&(hb=this.computeAngle(nd,He,rc),nd.angle=hb);wf=Bc.x+(Fd.x-Bc.x)*xh;Yd=Bc.y+(Fd.y-Bc.y)*xh}if(qb.N(Yb))nd.location=new N(wf,Yd);else{qb.Be()&&(qb=ec);var xf=z.Hh();xf.reset();xf.scale(nd.scale,nd.scale);xf.rotate(nd.angle,0,0);var zj=nd.Ga,$d=z.zk(0,0,zj.width,zj.height),Yc=z.O();Yc.ru($d,qb);xf.Cb(Yc);var zh=-Yc.x,Ah=-Yc.y,oc=Nf.copy();isNaN(oc.x)&&(oc.x=0<=nc?Yc.x+3:-(Yc.x+ +3));isNaN(oc.y)&&(oc.y=-(Yc.y+3));oc.rotate(rc);wf+=oc.x;Yd+=oc.y;xf.aG($d);var zh=zh+$d.x,Ah=Ah+$d.y,Bh=z.Tb(wf+zh,Yd+Ah);nd.move(Bh);z.A(Bh);z.A(Yc);z.dc($d);z.jf(xf)}}this instanceof da?this.nn(!1):yi.nn(!1)}break;case "Grid":break;case "TableRow":case "TableColumn":z.k(this.toString()+" is not an element of a Table Panel.TableRow and TableColumn panels can only be elements of a Table Panel.");break;default:z.k("Unknown panel type: "+t)}z.dc(h)}}; +I.prototype.mk=function(a){var b=this.Ga;if(Jb(0,0,b.width,b.height,a.x,a.y)){for(var b=this.va.o,c=b.length,d=z.Tb(0,0);c--;){var e=b[c];if(e.visible||e===this.Zb)if(tb(d.set(a),e.transform),e.Ma(d))return z.A(d),!0}z.A(d);return null===this.Nb&&null===this.uc?!1:!0}return!1};I.prototype.Yw=function(a){if(this.Jn===a)return this;for(var b=this.va.o,c=b.length,d=0;d<c;d++){var e=b[d].Yw(a);if(null!==e)return e}return null}; +function ko(a,b,c){c(a,b);if(b instanceof I){b=b.va.o;for(var d=b.length,e=0;e<d;e++)ko(a,b[e],c)}}function xl(a,b){lo(a,a,b)}function lo(a,b,c){c(b);b=b.va.o;for(var d=b.length,e=0;e<d;e++){var g=b[e];g instanceof I&&lo(a,g,c)}}I.prototype.walkVisualTree=I.prototype.CJ=function(a){mo(this,this,a)};function mo(a,b,c){c(b);if(b instanceof I){b=b.va.o;for(var d=b.length,e=0;e<d;e++)mo(a,b[e],c)}}I.prototype.findInVisualTree=I.prototype.zt=function(a){return no(this,this,a)}; +function no(a,b,c){if(c(b))return b;if(b instanceof I){b=b.va.o;for(var d=b.length,e=0;e<d;e++){var g=no(a,b[e],c);if(null!==g)return g}}return null}I.prototype.findObject=I.prototype.oe=function(a){if(this.name===a)return this;for(var b=this.va.o,c=b.length,d=0;d<c;d++){var e=b[d];if(e.name===a)return e;if(e instanceof I)if(null===e.Ji&&null===e.tg){if(e=e.oe(a),null!==e)return e}else if(Sl(e)&&(e=e.va.first(),null!==e&&(e=e.oe(a),null!==e)))return e}return null}; +function oo(a){a=a.va.o;for(var b=a.length,c=0,d=0;d<b;d++){var e=a[d];if(e instanceof I)c=Math.max(c,oo(e));else if(e instanceof X){a:{if(null!==!e.Vf)switch(e.eo){case "None":case "Square":case "Ellipse":case "Circle":case "LineH":case "LineV":case "FramedRectangle":case "RoundedRectangle":case "Line1":case "Line2":case "Border":case "Cube1":case "Cube2":case "Junction":case "Cylinder1":case "Cylinder2":case "Cylinder3":case "Cylinder4":case "PlusLine":case "XLine":case "ThinCross":case "ThickCross":e= +0;break a}e=e.Oe/2*e.Jm*e.hj()}c=Math.max(c,e)}}return c}f=I.prototype;f.Wg=function(){return!(this.type===Rm||this.type===Sm)}; +f.pe=function(a,b,c){if(!1===this.jg)return null;void 0===b&&(b=null);void 0===c&&(c=null);if(ol(this))return null;var d=this.Ga,e=1/this.hj(),g=this.Wg(),h=g?a:tb(z.Tb(a.x,a.y),this.transform),k=this.h,l=10,m=5;null!==k&&(l=k.rp("extraTouchArea"),m=l/2);if(Jb(-(m*e),-(m*e),d.width+l*e,d.height+l*e,h.x,h.y)){if(!this.eh){var e=this.va.o,n=e.length,k=z.O(),m=(l=this.JE)?this.gf():null;if(l&&(m.Wg()?tb(k.set(a),m.transform):k.set(a),!m.Ma(k)))return z.A(k),g||z.A(h),null;for(;n--;){var p=e[n];if(p.visible|| +p===this.Zb)if(p.Wg()?tb(k.set(a),p.transform):k.set(a),!l||p!==m){var q=null;p instanceof I?q=p.pe(k,b,c):!0===p.jg&&p.Ma(k)&&(q=p);if(null!==q&&(null!==b&&(q=b(q)),null!==q&&(null===c||c(q))))return z.A(k),g||z.A(h),q}}z.A(k)}if(null===this.background&&null===this.wl)return g||z.A(h),null;a=Jb(0,0,d.width,d.height,h.x,h.y)?this:null;g||z.A(h);return a}g||z.A(h);return null}; +f.lp=function(a,b,c,d){if(!1===this.jg)return!1;void 0===b&&(b=null);void 0===c&&(c=null);d instanceof J||d instanceof K||(d=new J(O));var e=this.Ga,g=this.Wg(),h=g?a:tb(z.Tb(a.x,a.y),this.transform);if(Jb(0,0,e.width,e.height,h.x,h.y)){if(!this.eh){for(var e=this.va.o,k=e.length,l=z.O();k--;){var m=e[k];if(m.visible||m===this.Zb){m.Wg()?tb(l.set(a),m.transform):l.set(a);var n=m,m=m instanceof I?m:null;(null!==m?m.lp(l,b,c,d):n.Ma(l))&&!1!==n.jg&&(null!==b&&(n=b(n)),null===n||null!==c&&!c(n)||d.add(n))}}z.A(l)}g|| +z.A(h);return null!==this.background||null!==this.wl}g||z.A(h);return!1}; +f.pk=function(a,b,c,d,e,g){if(!1===this.jg)return!1;void 0===b&&(b=null);void 0===c&&(c=null);var h=g;void 0===g&&(h=z.Hh(),h.reset());h.multiply(this.transform);if(this.Xm(a,h))return po(this,b,c,e),void 0===g&&z.jf(h),!0;if(this.Jg(a,h)){if(!this.eh)for(var k=this.va.o,l=k.length;l--;){var m=k[l];if(m.visible||m===this.Zb){var n=m.W,p=this.Ga;if(!(n.x>p.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=m;m=m instanceof I?m:null;p=z.Hh();p.set(h);if(null!==m?m.pk(a,b,c,d,e,p):Mm(n,a,d,p))null!== +b&&(n=b(n)),null===n||null!==c&&!c(n)||e.add(n);z.jf(p)}}}void 0===g&&z.jf(h);return d}void 0===g&&z.jf(h);return!1};function po(a,b,c,d){for(var e=a.va.o,g=e.length;g--;){var h=e[g];if(h.visible){var k=h.W,l=a.Ga;k.x>l.width||k.y>l.height||0>k.x+k.width||0>k.y+k.height||(h instanceof I&&po(h,b,c,d),null!==b&&(h=b(h)),null===h||null!==c&&!c(h)||d.add(h))}}} +f.cn=function(a,b,c,d,e,g){if(!1===this.jg)return!1;void 0===c&&(c=null);void 0===d&&(d=null);var h=this.Ga,k=this.Wg(),l=k?a:tb(z.Tb(a.x,a.y),this.transform),m=k?b:tb(z.Tb(b.x,b.y),this.transform),n=l.Af(m),p=0<l.x&&l.x<h.width&&0<l.y&&l.y<h.height||ub(l.x,l.y,0,0,0,h.height)<n||ub(l.x,l.y,0,h.height,h.width,h.height)<n||ub(l.x,l.y,h.width,h.height,h.width,0)<n||ub(l.x,l.y,h.width,0,0,0)<n,h=0<l.x&&l.x<h.width&&0<l.y&&l.y<h.height&&ub(l.x,l.y,0,0,0,h.height)<n&&ub(l.x,l.y,0,h.height,h.width,h.height)< +n&&ub(l.x,l.y,h.width,h.height,h.width,0)<n&&ub(l.x,l.y,h.width,0,0,0)<n;k||(z.A(l),z.A(m));if(p){if(!this.eh){k=z.O();l=z.O();m=this.va.o;for(n=m.length;n--;){var q=m[n];if(q.visible||q===this.Zb){var r=q.W,s=this.Ga;r.x>s.width||r.y>s.height||0>r.x+r.width||0>r.y+r.height||(q.Wg()?(r=q.transform,tb(k.set(a),r),tb(l.set(b),r)):(k.set(a),l.set(b)),r=q,q=q instanceof I?q:null,null!==q?!q.cn(k,l,c,d,e,g):!r.rE(k,l,e))||(null!==c&&(r=c(r)),null===r||null!==d&&!d(r)||g.add(r))}}z.A(k);z.A(l)}return e? +p:h}return!1};function Zn(a){var b=a.C;if(void 0===b||b===Pc)b=null;null===b&&a instanceof X&&(a=a.wh,null!==a&&(b=a.C));null===b&&(b=Zb);return b}function $n(a){var b=a.D;if(void 0===b||b===Pc)b=null;null===b&&a instanceof X&&(a=a.wh,null!==a&&(b=a.D));null===b&&(b=ic);return b}I.prototype.add=I.prototype.add=function(a){z.l(a,O,I,"add:element");this.Ld(this.va.count,a)};I.prototype.elt=I.prototype.ea=function(a){return this.va.ea(a)}; +I.prototype.insertAt=I.prototype.Ld=function(a,b){b instanceof D&&z.k("Cannot add a Part to a Panel: "+b);if(this===b||this.Pl(b))this===b&&z.k("Cannot make a Panel contain itself: "+this.toString()),z.k("Cannot make a Panel indirectly contain itself: "+this.toString()+" already contains "+b.toString());var c=b.T;null!==c&&c!==this&&z.k("Cannot add a GraphObject that already belongs to another Panel to this Panel: "+b.toString()+", already contained by "+c.toString()+", cannot be shared by this Panel: "+ +this.toString());this.ba!==Ik||b instanceof X||z.k("Can only add Shapes to a Grid Panel, not: "+b);b.Tl(this);b.Am=null;if(null!==this.Tt){var d=b.data;null!==d&&"object"===typeof d&&(null===this.sg&&(this.sg=new na(Object,I)),this.sg.add(d,b))}var e=this.va,d=-1;if(c===this){for(var g=-1,h=this.va.o,k=h.length,l=0;l<k;l++)if(h[l]===b){g=l;break}if(-1!==g){if(g===a||g+1>=e.count&&a>=e.count)return;e.dd(g);d=g}else z.k("element "+b.toString()+" has panel "+c.toString()+" but is not contained by it.")}if(0> +a||a>e.count)a=e.count;e.Ld(a,b);this.Q();b.Q();null!==b.yd?this.Rh=!0:b instanceof I&&!0===b.Rh&&(this.Rh=!0);c=this.ca;null!==c&&(c.jl=null,c.Rj=NaN,this.Rh&&c instanceof E&&(c.Rh=!0),c.Rh&&(c.Dd=null),e=this.h,null!==e&&e.pa.qb||(-1!==d&&c.Rc(Xf,"elements",this,b,null,d,null),c.Rc(Wf,"elements",this,null,b,null,a)))};I.prototype.remove=I.prototype.remove=function(a){z.l(a,O,I,"remove:element");for(var b=this.va.o,c=b.length,d=-1,e=0;e<c;e++)if(b[e]===a){d=e;break}-1!==d&&this.Ve(d)}; +I.prototype.removeAt=I.prototype.dd=function(a){u&&z.p(a,I,"removeAt:idx");0<=a&&this.Ve(a)};I.prototype.Ve=function(a){var b=this.va,c=b.ea(a);c.Am=null;c.Tl(null);if(null!==this.sg){var d=c.data;"object"===typeof d&&this.sg.remove(d)}b.dd(a);$k(this,!1);this.Q();this.Km===c&&(this.Km=null);b=this.ca;null!==b&&(b.jl=null,b.Rj=NaN,b.ae(),d=this.h,null!==d&&d.pa.qb||b.Rc(Xf,"elements",this,c,null,a,null))};z.w(I,{Yp:"rowCount"},function(){return void 0===this.Wd?0:this.Wd.length}); +I.prototype.getRowDefinition=I.prototype.$d=function(a){u&&z.p(a,I,"getRowDefinition:idx");0>a&&z.ka(a,">= 0",I,"getRowDefinition:idx");a=Math.round(a);var b=this.Wd;if(void 0===b[a]){var c=new Ig;c.Tl(this);c.re=!0;c.index=a;b[a]=c}return b[a]};I.prototype.removeRowDefinition=I.prototype.oF=function(a){u&&z.p(a,I,"removeRowDefinition:idx");0>a&&z.ka(a,">= 0",I,"removeRowDefinition:idx");a=Math.round(a);var b=this.Wd;this.Rc(Xf,"coldefs",this,b[a],null,a,null);b[a]&&delete b[a];this.Q()}; +z.w(I,{fp:"columnCount"},function(){return void 0===this.Sd?0:this.Sd.length});I.prototype.getColumnDefinition=I.prototype.Zd=function(a){u&&z.p(a,I,"getColumnDefinition:idx");0>a&&z.ka(a,">= 0",I,"getColumnDefinition:idx");a=Math.round(a);var b=this.Sd;if(void 0===b[a]){var c=new Ig;c.Tl(this);c.re=!1;c.index=a;b[a]=c}return b[a]}; +I.prototype.removeColumnDefinition=I.prototype.kF=function(a){u&&z.p(a,I,"removeColumnDefinition:idx");0>a&&z.ka(a,">= 0",I,"removeColumnDefinition:idx");a=Math.round(a);var b=this.Sd;this.Rc(Xf,"coldefs",this,b[a],null,a,null);b[a]&&delete b[a];this.Q()}; +z.defineProperty(I,{dJ:"rowSizing"},function(){return void 0===this.Fm?Vn:this.Fm},function(a){if(void 0!==this.Fm){var b=this.Fm;b!==a&&(a!==Vn&&a!==bo&&z.k("Panel.rowSizing must be RowColumnDefinition.ProportionalExtra or RowColumnDefinition.None, not: "+a),this.Fm=a,this.Q(),this.j("rowSizing",b,a))}}); +z.defineProperty(I,{cH:"columnSizing"},function(){return void 0===this.em?Vn:this.em},function(a){if(void 0!==this.em){var b=this.em;b!==a&&(a!==Vn&&a!==bo&&z.k("Panel.columnSizing must be RowColumnDefinition.ProportionalExtra or RowColumnDefinition.None, not: "+a),this.em=a,this.Q(),this.j("columnSizing",b,a))}}); +z.defineProperty(I,{VF:"topIndex"},function(){return void 0===this.Yi?0:this.Yi},function(a){if(void 0!==this.Yi){var b=this.Yi;b!==a&&((!isFinite(a)||0>a)&&z.k("Panel.topIndex must be greater than zero and a real number, not: "+a),this.Yi=a,this.Q(),this.j("topIndex",b,a))}}); +z.defineProperty(I,{WE:"leftIndex"},function(){return void 0===this.Ki?0:this.Ki},function(a){if(void 0!==this.Ki){var b=this.Ki;b!==a&&((!isFinite(a)||0>a)&&z.k("Panel.leftIndex must be greater than zero and a real number, not: "+a),this.Ki=a,this.Q(),this.j("leftIndex",b,a))}});I.prototype.findRowForLocalY=function(a){if(0>a)return-1;if(this.type!==ga)return NaN;for(var b=0,c=this.Wd,d=c.length,e=this.Yi;e<d;e++){var g=c[e];if(void 0!==g&&(b+=g.total,a<b))return e}return-1}; +I.prototype.findColumnForLocalX=function(a){if(0>a)return-1;if(this.type!==ga)return NaN;for(var b=0,c=this.Sd,d=c.length,e=this.Ki;e<d;e++){var g=c[e];if(void 0!==g&&(b+=g.total,a<b))return e}return-1}; +z.defineProperty(I,{data:"data"},function(){return this.fe},function(a){var b=this.fe;if(b!==a){var c=this instanceof D&&!(this instanceof da);c&&z.g(a,"object",I,"data");jh(this);this.fe=a;var d=this.h;null!==d&&(c?this instanceof G?(null!==b&&d.Rk.remove(b),null!==a&&d.Rk.add(a,this)):this instanceof D&&(null!==b&&d.Ai.remove(b),null!==a&&d.Ai.add(a,this)):(c=this.T,null!==c&&null!==c.sg&&(null!==b&&c.sg.remove(b),null!==a&&c.sg.add(a,this))));this.j("data",b,a);null!==d&&d.pa.qb||null!==a&&this.Mb()}}); +z.defineProperty(I,{lI:"itemIndex"},function(){return this.vr},function(a){var b=this.vr;b!==a&&(this.vr=a,this.j("itemIndex",b,a))});function gn(a){a=a.Ok;return null!==a&&a.G} +function jh(a){var b=a.Ok;if(null===b)null!==a.data&&z.k("Template cannot have .data be non-null: "+a),a.Ok=b=new J($g);else if(b.G)return;var c=new J(O);ko(a,a,function(a,d){var e=d.Ac;if(null!==e)for(cn(d,!1),e=e.i;e.next();){var g=e.value;g.mode===bh&&cn(d,!0);if(null!==g.xn){var h=ch(g,a,d);null!==h&&(c.add(h),null===h.No&&(h.No=new J($g)),h.No.add(g))}b.add(g)}if(d instanceof I&&d.type===ga){if(0<d.Wd.length)for(e=d.Wd,g=e.length,h=0;h<g;h++){var k=e[h];if(void 0!==k&&null!==k.Ac)for(var l=k.Ac.i;l.next();){var v= +l.value;v.Bg=k;v.Ts=2;v.Vo=k.index;b.add(v)}}if(0<d.Sd.length)for(e=d.Sd,g=e.length,h=0;h<g;h++)if(k=e[h],void 0!==k&&null!==k.Ac)for(l=k.Ac.i;l.next();)v=l.value,v.Bg=k,v.Ts=1,v.Vo=k.index,b.add(v)}});for(var d=c.i;d.next();){var e=d.value;if(null!==e.No){cn(e,!0);for(var g=e.No.i;g.next();){var h=g.value;null===e.Ac&&(e.Ac=new J($g));e.Ac.add(h)}}e.No=null}for(d=b.i;d.next();)if(e=d.value,g=e.Bg,null!==g){e.Bg=null;var k=e.yu,l=k.indexOf(".");0<l&&g instanceof I&&(h=k.substring(0,l),k=k.substr(l+ +1),l=g.oe(h),null!==l?(g=l,e.yu=k):z.trace('Warning: unable to find GraphObject named "'+h+'" for Binding: '+e.toString()));g instanceof Ig?(e.Wl=z.nd(g.T),g.T.Jn=e.Wl):(e.Wl=z.nd(g),g.Jn=e.Wl)}b.freeze();a instanceof D&&(a.be()&&(uj(a,Infinity,Infinity),a.Lc()),u&&!qo&&ko(a,a,function(a,c){if(c instanceof I&&(c.type===Fk||c.type===aj)&&1>=c.elements.count&&!(c instanceof D)){if(1===c.elements.count){var d=null!==c.Tt;if(!d)for(var e=b.i;e.next();)if("itemArray"===e.value.yu){d=!0;break}}d||(z.trace("Auto or Spot Panel should not have zero or one elements: "+ +c.toString()+" in "+a.toString()),qo=!0)}}))}var qo=!1;I.prototype.copyTemplate=function(){var a=this.copy();a.CJ(function(a){a instanceof I&&(a.Ok=null,a.fe=null);var c=a.Ac;null!==c&&(a.Ac=null,c.each(function(c){a.bind(c.copy())}))});return a}; +I.prototype.updateTargetBindings=I.prototype.Mb=function(a){var b=this.Ok;if(null!==b)for(void 0===a&&(a=""),b=b.i;b.next();){var c=b.value,d=c.NF;if(""===a||""===d||d===a)if(d=c.yu,null!==c.gH||""!==d){var d=this.data,e=c.xn;if(null!==e)d=""===e?this:"."===e?this:".."===e?this:this.oe(e);else{var g=this.h;null!==g&&c.St&&(d=g.ha.uk)}if(null===d)u&&z.trace("Binding error: missing GraphObject named "+e+" in "+this.toString());else{var g=this,h=c.Wl;if(-1!==h){if(g=this.Yw(h),null===g)continue}else null!== +c.Bg&&(g=c.Bg);"."===e?d=g:".."===e&&(d=g.T);e=c.Ts;if(0!==e){if(!(g instanceof I))continue;h=g;1===e?g=h.Zd(c.Vo):2===e&&(g=h.$d(c.Vo))}void 0!==g&&c.eG(g,d)}}}};z.defineProperty(I,{Tt:"itemArray"},function(){return this.Ji},function(a){var b=this.Ji;if(b!==a){u&&null!==a&&!z.isArray(a)&&z.k("Panel.itemArray must be an Array-like object or null, not: "+a);var c=this.h;null!==c&&null!==b&&Dl(c,this);this.Ji=a;null!==c&&null!==a&&zl(c,this);this.j("itemArray",b,a);null!==c&&c.pa.qb||this.FA()}}); +function Sl(a){return a.type===aj||a.type===Fk||a.type===Ni||a.type===ga&&0<a.va.length&&(a=a.va.ea(0),a.Ff&&a instanceof I&&(a.type===Rm||a.type===Sm))?!0:!1}I.prototype.rebuildItemElements=I.prototype.FA=function(){var a=0;for(Sl(this)&&(a=1);this.va.length>a;)this.Ve(this.va.length-1);a=this.Tt;if(null!==a)for(var b=z.ab(a),c=0;c<b;c++)Rl(this,z.Ya(a,c),c)}; +I.prototype.findItemPanelForData=I.prototype.DH=function(a){if(void 0===a||null===a||null===this.sg)return null;z.g(a,"object",I,"findItemPanelForData");return this.sg.na(a)}; +function Rl(a,b,c){if(!(void 0===b||null===b||0>c)){var d;d=ro(a,b);var e=a.mI,g=null;null!==e&&(g=e.na(d));null===g&&(so||(so=!0,z.trace('No item template Panel found for category "'+d+'" on '+a),z.trace(" Using default item template."),d=new I,e=new qa,e.bind(new $g("text","",ka)),d.add(e),to=d),g=to);d=g;null!==d&&(jh(d),d=d.copy(),"object"===typeof b&&(null===a.sg&&(a.sg=new na(Object,I)),a.sg.add(b,d)),e=c,Sl(a)&&e++,a.Ld(e,d),Tl(a,e,c),d.fe=null,d.data=b)}} +function Tl(a,b,c){for(a=a.va;b<a.length;){var d=a.ea(b);if(d instanceof I){var e=b,g=c;d.type===Rm?d.Vb=e:d.type===Sm&&(d.column=e);d.lI=g}b++;c++}} +z.defineProperty(I,{LK:"itemTemplate"},function(){return null===this.tg?null:this.tg.na("")},function(a){if(null===this.tg){if(null===a)return;this.tg=new na("string",I)}var b=this.tg.na("");b!==a&&(z.l(a,I,I,"itemTemplate"),(a instanceof D||a.Ff)&&z.k("Panel.itemTemplate must not be a Part or be Panel.isPanelMain: "+a),this.tg.add("",a),this.j("itemTemplate",b,a),a=this.h,null!==a&&a.pa.qb||this.FA())}); +z.defineProperty(I,{mI:"itemTemplateMap"},function(){return this.tg},function(a){var b=this.tg;if(b!==a){z.l(a,na,I,"itemTemplateMap");for(var c=a.i;c.next();){var d=c.value;(d instanceof D||d.Ff)&&z.k("Template in Panel.itemTemplateMap must not be a Part or be Panel.isPanelMain: "+d)}this.tg=a;this.j("itemTemplateMap",b,a);a=this.h;null!==a&&a.pa.qb||this.FA()}}); +z.defineProperty(I,{KK:"itemCategoryProperty"},function(){return this.uo},function(a){var b=this.uo;b!==a&&("string"!==typeof a&&"function"!==typeof a&&z.ic(a,"string or function",I,"itemCategoryProperty"),this.uo=a,this.j("itemCategoryProperty",b,a))}); +function ro(a,b){if(null===b)return"";var c=a.uo,d="";if("function"===typeof c)d=c(b);else if("string"===typeof c&&"object"===typeof b){if(""===c)return"";d=z.tb(b,c)}else return"";if(void 0===d)return"";if("string"===typeof d)return d;z.k("Panel.getCategoryForItemData found a non-string category for "+b+": "+d);return""}var so=!1,to=null;z.defineProperty(I,{FK:"isAtomic"},function(){return this.eh},function(a){var b=this.eh;b!==a&&(z.g(a,"boolean",I,"isAtomic"),this.eh=a,this.j("isAtomic",b,a))}); +z.defineProperty(I,{JE:"isClipping"},function(){return this.hr},function(a){var b=this.hr;b!==a&&(z.g(a,"boolean",I,"isClipping"),this.hr=a,this.j("isClipping",b,a))});function Ig(){z.kc(this);this.mh=null;this.Bv=!0;this.Uc=0;this.ef=NaN;this.Vj=0;this.Tj=Infinity;this.Ie=Pc;this.sb=this.Xa=0;this.Ac=null;this.Ls=uo;this.ei=Bm;this.Fs=this.Zj=null;this.Gs=NaN;this.Nb=this.Yh=null;this.Gq=!1}z.ia("RowColumnDefinition",Ig); +Ig.prototype.copy=function(){var a=new Ig;a.Bv=this.Bv;a.Uc=this.Uc;a.ef=this.ef;a.Vj=this.Vj;a.Tj=this.Tj;a.Ie=this.Ie;a.Xa=this.Xa;a.sb=this.sb;a.ei=this.ei;a.Ls=this.Ls;a.Zj=null===this.Zj?null:this.Zj.V();a.Fs=this.Fs;a.Gs=this.Gs;a.Yh=null;null!==this.Yh&&(a.Yh=z.Al(this.Yh));a.Nb=this.Nb;a.Gq=this.Gq;a.Ac=this.Ac;return a}; +Ig.prototype.tt=function(a){z.l(a,Ig,Ig,"copyFrom:pd");a.re?this.height=a.height:this.width=a.width;this.qj=a.qj;this.qf=a.qf;this.alignment=a.alignment;this.stretch=a.stretch;this.uu=a.uu;this.Zj=null===a.Zj?null:a.Zj.V();this.Zp=a.Zp;this.$p=a.$p;this.Yh=null;a.Yh&&(this.Yh=z.Al(a.Yh));this.background=a.background;this.Mz=a.Mz;this.Ac=a.Ac};Ig.prototype.toString=function(){return"RowColumnDefinition "+(this.re?"(Row ":"(Column ")+this.index+") #"+z.nd(this)};var uo; +Ig.Default=uo=z.s(Ig,"Default",0);var bo;Ig.None=bo=z.s(Ig,"None",1);var Vn;Ig.ProportionalExtra=Vn=z.s(Ig,"ProportionalExtra",2);Ig.prototype.Tl=function(a){this.mh=a};Ig.prototype.computeEffectiveSpacingTop=Ig.prototype.TD=function(){var a=0;if(0!==this.index){var b=this.mh,c=this.Zp;null===c&&null!==b&&(c=this.re?b.Bi:b.Mh);null!==c&&(a=this.$p,isNaN(a)&&(a=null!==b?this.re?b.Oh:b.Nh:0))}b=this.GF;if(null===b)if(b=this.mh,null!==b)b=b.Bj;else return a;return a+(this.re?b.top:b.left)}; +Ig.prototype.computeEffectiveSpacing=Ig.prototype.Re=function(){var a=0;if(0!==this.index){var b=this.mh,c=this.Zp;null===c&&null!==b&&(c=this.re?b.Bi:b.Mh);null!==c&&(a=this.$p,isNaN(a)&&(a=null!==b?this.re?b.Oh:b.Nh:0))}b=this.GF;if(null===b)if(b=this.mh,null!==b)b=b.Bj;else return a;return a+(this.re?b.top+b.bottom:b.left+b.right)}; +Ig.prototype.kd=function(a,b,c,d,e){var g=this.mh;if(null!==g&&(g.Rc(Uf,a,this,b,c,d,e),null!==this.Ac&&(b=g.h,null!==b&&!b.Ee&&(g=g.np(),null!==g&&(g=g.data,null!==g)))))for(c=this.Ac.i;c.next();)c.value.Sx(this,g,a,b)};z.w(Ig,{T:"panel"},function(){return this.mh});z.defineProperty(Ig,{re:"isRow"},function(){return this.Bv},function(a){this.Bv=a});z.defineProperty(Ig,{index:"index"},function(){return this.Uc},function(a){this.Uc=a}); +z.defineProperty(Ig,{height:"height"},function(){return this.ef},function(a){var b=this.ef;b!==a&&(u&&z.g(a,"number",Ig,"height"),0>a&&z.ka(a,">= 0",Ig,"height"),this.ef=a,this.Oa=this.Xa,null!==this.T&&this.T.Q(),this.kd("height",b,a))});z.defineProperty(Ig,{width:"width"},function(){return this.ef},function(a){var b=this.ef;b!==a&&(u&&z.g(a,"number",Ig,"width"),0>a&&z.ka(a,">= 0",Ig,"width"),this.ef=a,this.Oa=this.Xa,null!==this.T&&this.T.Q(),this.kd("width",b,a))}); +z.defineProperty(Ig,{qj:"minimum"},function(){return this.Vj},function(a){var b=this.Vj;b!==a&&(u&&z.g(a,"number",Ig,"minimum"),(0>a||!isFinite(a))&&z.ka(a,">= 0",Ig,"minimum"),this.Vj=a,this.Oa=this.Xa,null!==this.T&&this.T.Q(),this.kd("minimum",b,a))});z.defineProperty(Ig,{qf:"maximum"},function(){return this.Tj},function(a){var b=this.Tj;b!==a&&(u&&z.g(a,"number",Ig,"maximum"),0>a&&z.ka(a,">= 0",Ig,"maximum"),this.Tj=a,this.Oa=this.Xa,null!==this.T&&this.T.Q(),this.kd("maximum",b,a))}); +z.defineProperty(Ig,{alignment:"alignment"},function(){return this.Ie},function(a){var b=this.Ie;b.N(a)||(u&&z.l(a,Q,Ig,"alignment"),this.Ie=a.V(),null!==this.T&&this.T.Q(),this.kd("alignment",b,a))});z.defineProperty(Ig,{stretch:"stretch"},function(){return this.ei},function(a){var b=this.ei;b!==a&&(u&&z.Ba(a,O,Ig,"stretch"),this.ei=a,null!==this.T&&this.T.Q(),this.kd("stretch",b,a))}); +z.defineProperty(Ig,{GF:"separatorPadding"},function(){return this.Zj},function(a){"number"===typeof a?a=new Db(a):null!==a&&u&&z.l(a,Db,Ig,"separatorPadding");var b=this.Zj;null!==a&&null!==b&&b.N(a)||(null!==a&&(a=a.V()),this.Zj=a,null!==this.T&&this.T.Q(),this.kd("separatorPadding",b,a))}); +z.defineProperty(Ig,{Zp:"separatorStroke"},function(){return this.Fs},function(a){var b=this.Fs;b!==a&&(null===a||"string"===typeof a||a instanceof Da)&&(a instanceof Da&&a.freeze(),this.Fs=a,null!==this.T&&this.T.Q(),this.kd("separatorStroke",b,a))});z.defineProperty(Ig,{$p:"separatorStrokeWidth"},function(){return this.Gs},function(a){var b=this.Gs;b!==a&&(this.Gs=a,null!==this.T&&this.T.Q(),this.kd("separatorStrokeWidth",b,a))}); +z.defineProperty(Ig,{hJ:"separatorDashArray"},function(){return this.Yh},function(a){var b=this.Yh;if(b!==a){null===a||Array.isArray(a)||z.ic(a,"Array",Ig,"separatorDashArray:value");if(null!==a){for(var c=a.length,d=0,e=0;e<c;e++){var g=a[e];"number"===typeof g&&0<=g&&isFinite(g)||z.k("separatorDashArray value "+g+" at index "+e+" must be a positive number or zero.");d+=g}if(0===d){if(null===b)return;a=null}}this.Yh=a;null!==this.T&&this.T.ta();this.kd("separatorDashArray",b,a)}}); +z.defineProperty(Ig,{background:"background"},function(){return this.Nb},function(a){var b=this.Nb;b!==a&&(null===a||"string"===typeof a||a instanceof Da)&&(a instanceof Da&&a.freeze(),this.Nb=a,null!==this.T&&this.T.ta(),this.kd("background",b,a))});z.defineProperty(Ig,{Mz:"coversSeparators"},function(){return this.Gq},function(a){var b=this.Gq;b!==a&&(z.g(a,"boolean",Ig,"coversSeparators"),this.Gq=a,null!==this.T&&this.T.ta(),this.kd("coversSeparators",b,a))}); +z.defineProperty(Ig,{uu:"sizing"},function(){return this.Ls},function(a){var b=this.Ls;b!==a&&(u&&z.Ba(a,Ig,Ig,"sizing"),this.Ls=a,null!==this.T&&this.T.Q(),this.kd("sizing",b,a))});function ao(a){if(a.uu===uo){var b=a.mh;return a.re?b.dJ:b.cH}return a.uu}z.defineProperty(Ig,{Oa:"actual"},function(){return this.Xa},function(a){this.Xa=isNaN(this.ef)?Math.max(Math.min(this.Tj,a),this.Vj):Math.max(Math.min(this.Tj,this.ef),this.Vj)}); +z.defineProperty(Ig,{total:"total"},function(){return this.Xa+this.Re()},function(a){this.Xa=isNaN(this.ef)?Math.max(Math.min(this.Tj,a),this.Vj):Math.max(Math.min(this.Tj,this.ef),this.Vj);this.Xa=Math.max(0,this.Xa-this.Re())});z.defineProperty(Ig,{position:"position"},function(){return this.sb},function(a){this.sb=a}); +Ig.prototype.bind=Ig.prototype.bind=function(a){a.Bg=this;var b=this.T;if(null!==b){var c=b.np();null!==c&&gn(c)&&z.k("Cannot add a Binding to a RowColumnDefinition that is already frozen: "+a+" on "+b)}null===this.Ac&&(this.Ac=new J($g));this.Ac.add(a)}; +function X(){O.call(this);this.Vf=this.kb=null;this.eo="None";this.br=Bm;this.Kc=this.Ad="black";this.Oe=1;this.Ro="butt";this.To="miter";this.Jm=10;this.So=null;this.we=0;this.di=this.ci=Pc;this.cs=this.bs=NaN;this.ir=!1;this.es=null;this.jo=this.Xo="None";this.fr=1}z.Qa(X,O);z.ia("Shape",X); +X.prototype.cloneProtected=function(a){O.prototype.cloneProtected.call(this,a);a.kb=this.kb;a.eo=this.eo;a.br=this.br;a.Vf=this.Vf;a.Ad=this.Ad;a.Kc=this.Kc;a.Oe=this.Oe;a.Ro=this.Ro;a.To=this.To;a.Jm=this.Jm;null!==this.So&&(a.So=z.Al(this.So));a.we=this.we;a.ci=this.ci.V();a.di=this.di.V();a.bs=this.bs;a.cs=this.cs;a.ir=this.ir;a.es=this.es;a.Xo=this.Xo;a.jo=this.jo;a.fr=this.fr};X.prototype.toString=function(){return"Shape("+("None"!==this.Hb?this.Hb:"None"!==this.fq?this.fq:this.Wz)+")#"+z.nd(this)}; +function vo(a,b,c,d){var e=c.length;if(!(4>e)){for(var g=d.Ia,h=Math.max(1,g.width),g=g.height,k=c[0],l=c[1],m=0,n=0,p=0,q=0,r=0,s=0,t=q=0,v=z.rb(),x=2;x<e;x+=2)m=c[x],n=c[x+1],p=m-k,q=n-l,0===p&&(p=.001),r=q/p,s=Math.atan2(q,p),q=Math.sqrt(p*p+q*q),v.push([p,s,r,q]),t+=q,k=m,l=n;k=c[0];l=c[1];p=d.Ia.width;d instanceof X&&(p-=d.ub);1>p&&(p=1);for(var e=c=p,m=h/2,n=0===m?!1:!0,x=0,q=v[x],p=q[0],s=q[1],r=q[2],q=q[3],y=0;.1<=t;){0===y&&(n?(e=c,e-=m,t-=m,n=!1):e=c,0===e&&(e=1));if(e>t){z.xa(v);return}e> +q?(y=e-q,e=q):y=0;var A=Math.sqrt(e*e/(1+r*r));0>p&&(A=-A);k+=A;l+=r*A;a.translate(k,l);a.rotate(s);a.translate(-(h/2),-(g/2));0===y&&d.ok(a,b);a.translate(h/2,g/2);a.rotate(-s);a.translate(-k,-l);t-=e;q-=e;if(0!==y){x++;if(x===v.length){z.xa(v);return}q=v[x];p=q[0];s=q[1];r=q[2];q=q[3];e=y}}z.xa(v)}} +X.prototype.ok=function(a,b){if(null!==this.Kc||null!==this.Ad){null!==this.Ad&&Vm(this,a,this.Ad,!0,!1);null!==this.Kc&&Vm(this,a,this.Kc,!1,!1);var c=this.Oe;if(0===c){var d=this.ca;d instanceof da&&d.type===Ni&&"Selection"===d.nc&&d.fc instanceof X&&d.Xf.gf()===d.fc&&(c=d.fc.ub)}a.lineWidth=c;a.lineJoin=this.To;a.lineCap=this.Ro;a.miterLimit=this.Jm;var e=!1;this.ca&&b.ij("drawShadows")&&(e=this.ca.tk);var g=!0;null!==this.Kc&&null===this.Ad&&(g=!1);var d=!1,h=!0,k=this.PF;null!==k&&(d=!0,h=a.Tz(k, +this.we));var l=this.kb;if(null!==l){if(l.ba===mf)a.beginPath(),d&&!h?Im(a,l.xc,l.Cc,l.zb,l.Gb,k,this.we):(a.moveTo(l.xc,l.Cc),a.lineTo(l.zb,l.Gb)),null!==this.Ad&&a.Hg(this.Ad),0!==c&&null!==this.Kc&&a.uj();else if(l.ba===nf){var m=l.xc,n=l.Cc,p=l.zb,q=l.Gb,l=Math.min(m,p),r=Math.min(n,q),m=Math.abs(p-m),n=Math.abs(q-n);null!==this.Ad&&(a.beginPath(),a.rect(l,r,m,n),a.Hg(this.Ad));if(null!==this.Kc){var s=p=0,t=0;g&&e&&(p=a.shadowOffsetX,s=a.shadowOffsetY,t=a.shadowBlur,a.shadowOffsetX=0,a.shadowOffsetY= +0,a.shadowBlur=0);d&&!h?(h=z.rb(),h.push(l),h.push(r),h.push(l+m),h.push(r),h.push(l+m),h.push(r+n),h.push(l),h.push(r+n),h.push(l),h.push(r),a.beginPath(),wo(a,h,k,this.we),a.uj(),z.xa(h)):0!==c&&(a.beginPath(),a.rect(l,r,m,n),a.uj());g&&e&&(a.shadowOffsetX=p,a.shadowOffsetY=s,a.shadowBlur=t)}}else if(l.ba===of)m=l.xc,n=l.Cc,p=l.zb,q=l.Gb,l=Math.abs(p-m)/2,r=Math.abs(q-n)/2,m=Math.min(m,p)+l,n=Math.min(n,q)+r,a.beginPath(),a.moveTo(m,n-r),a.bezierCurveTo(m+Hd*l,n-r,m+l,n-Hd*r,m+l,n),a.bezierCurveTo(m+ +l,n+Hd*r,m+Hd*l,n+r,m,n+r),a.bezierCurveTo(m-Hd*l,n+r,m-l,n+Hd*r,m-l,n),a.bezierCurveTo(m-l,n-Hd*r,m-Hd*l,n-r,m,n-r),a.closePath(),null!==this.Ad&&a.Hg(this.Ad),d&&!h&&(h=z.rb(),we(m,n-r,m+Hd*l,n-r,m+l,n-Hd*r,m+l,n,.5,h),we(m+l,n,m+l,n+Hd*r,m+Hd*l,n+r,m,n+r,.5,h),we(m,n+r,m-Hd*l,n+r,m-l,n+Hd*r,m-l,n,.5,h),we(m-l,n,m-l,n-Hd*r,m-Hd*l,n-r,m,n-r,.5,h),a.beginPath(),wo(a,h,k,this.we),z.xa(h)),0!==c&&null!==this.Kc&&(g&&e?(p=a.shadowOffsetX,s=a.shadowOffsetY,t=a.shadowBlur,a.shadowOffsetX=0,a.shadowOffsetY= +0,a.shadowBlur=0,a.uj(),a.shadowOffsetX=p,a.shadowOffsetY=s,a.shadowBlur=t):a.uj());else if(l.ba===jf){r=l.Dj;n=r.length;for(q=0;q<n;q++){m=r.o[q];a.beginPath();a.moveTo(m.Ha,m.Da);for(var p=m.Ab.o,s=p.length,v=null,t=0;t<s;t++){var x=p[t];switch(x.ba){case Ef:a.moveTo(x.L,x.M);break;case qf:a.lineTo(x.L,x.M);break;case Ff:a.bezierCurveTo(x.Cd,x.Ne,x.nh,x.zg,x.zb,x.Gb);break;case Gf:a.quadraticCurveTo(x.Cd,x.Ne,x.zb,x.Gb);break;case Hf:if(x.radiusX===x.radiusY)v=Math.PI/180,a.arc(x.Cd,x.Ne,x.radiusX, +x.Fe*v,(x.Fe+x.Lf)*v,0>x.Lf);else{var v=Jf(x,m),y=v.length;if(0===y){a.lineTo(x.ra,x.za);break}for(var A=0;A<y;A++){var C=v[A];0===A&&a.lineTo(C[0],C[1]);a.bezierCurveTo(C[2],C[3],C[4],C[5],C[6],C[7])}}break;case If:A=y=0;if(null!==v&&v.type===Hf){v=Jf(v,m);C=v.length;if(0===C){a.lineTo(x.ra,x.za);break}v=v[C-1]||null;null!==v&&(y=v[6],A=v[7])}else y=null!==v?v.L:m.Ha,A=null!==v?v.M:m.Da;v=Kf(x,m,y,A);y=v.length;if(0===y){a.lineTo(x.ra,x.za);break}for(A=0;A<y;A++)C=v[A],a.bezierCurveTo(C[2],C[3], +C[4],C[5],C[6],C[7]);break;default:z.k("Segment not of valid type: "+x.ba)}x.Th&&a.closePath();v=x}e?(t=s=p=0,m.ro?(!0===m.im&&null!==this.Ad?(a.Hg(this.Ad),g=!0):g=!1,0!==c&&null!==this.Kc&&(g&&(p=a.shadowOffsetX,s=a.shadowOffsetY,t=a.shadowBlur,a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0),d&&!h||a.uj(),g&&(a.shadowOffsetX=p,a.shadowOffsetY=s,a.shadowBlur=t))):(g&&(p=a.shadowOffsetX,s=a.shadowOffsetY,t=a.shadowBlur,a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0),!0===m.im&&null!==this.Ad&& +a.Hg(this.Ad),0!==c&&null!==this.Kc&&(d&&!h||a.uj()),g&&(a.shadowOffsetX=p,a.shadowOffsetY=s,a.shadowBlur=t))):(!0===m.im&&null!==this.Ad&&a.Hg(this.Ad),0===c||null===this.Kc||d&&!h||a.uj())}if(d&&!h)for(c=g,g=l.Dj,h=g.length,l=0;l<h;l++){r=g.o[l];a.beginPath();n=z.rb();n.push(r.Ha);n.push(r.Da);q=r.Ha;m=r.Da;p=q;s=m;t=r.Ab.o;x=t.length;for(v=0;v<x;v++){y=t[v];switch(y.ba){case Ef:wo(a,n,k,this.we);n.length=0;n.push(y.L);n.push(y.M);q=y.L;m=y.M;p=q;s=m;break;case qf:n.push(y.L);n.push(y.M);q=y.L; +m=y.M;break;case Ff:we(q,m,y.Cd,y.Ne,y.nh,y.zg,y.zb,y.Gb,.5,n);q=y.L;m=y.M;break;case Gf:Je(q,m,y.Cd,y.Ne,y.zb,y.Gb,.5,n);q=y.L;m=y.M;break;case Hf:A=Jf(y,r);C=A.length;if(0===C){n.push(y.ra);n.push(y.za);q=y.ra;m=y.za;break}for(var L=0;L<C;L++){var H=A[L];we(q,m,H[2],H[3],H[4],H[5],H[6],H[7],.5,n);q=H[6];m=H[7]}break;case If:A=Kf(y,r,q,m);C=A.length;if(0===C){n.push(y.ra);n.push(y.za);q=y.ra;m=y.za;break}for(L=0;L<C;L++)H=A[L],we(q,m,H[2],H[3],H[4],H[5],H[6],H[7],.5,n),q=H[6],m=H[7];break;default:z.k("Segment not of valid type: "+ +y.ba)}y.Th&&(n.push(p),n.push(s),wo(a,n,k,this.we))}wo(a,n,k,this.we);z.xa(n);null!==this.Kc&&(q=n=r=0,c&&e&&(r=a.shadowOffsetX,n=a.shadowOffsetY,q=a.shadowBlur,a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0),a.uj(),c&&e&&(a.shadowOffsetX=r,a.shadowOffsetY=n,a.shadowBlur=q))}}d&&a.Pz();if(null!==this.yx){d=this.yx;uj(d,Infinity,Infinity);k=d.Ia;d.Lc(0,0,k.width,k.height);c=this.wh;a.save();a.beginPath();k=z.rb();if(c.type===mf)k.push(c.Ha),k.push(c.Da),k.push(c.L),k.push(c.M),vo(a,b,k,d);else if(c.type=== +jf)for(h=c.cc.i;h.next();){l=h.value;k.length=0;k.push(l.Ha);k.push(l.Da);g=l.Ha;r=l.Da;n=g;q=r;m=l.Ab.o;p=m.length;for(s=0;s<p;s++){t=m[s];switch(t.ba){case Ef:vo(a,b,k,d);k.length=0;k.push(t.L);k.push(t.M);g=t.L;r=t.M;n=g;q=r;break;case qf:k.push(t.L);k.push(t.M);g=t.L;r=t.M;break;case Ff:we(g,r,t.Cd,t.Ne,t.nh,t.zg,t.zb,t.Gb,.5,k);g=t.L;r=t.M;break;case Gf:Je(g,r,t.Cd,t.Ne,t.zb,t.Gb,.5,k);g=t.L;r=t.M;break;case Hf:c=Jf(t,l);e=c.length;if(0===e){k.push(t.ra);k.push(t.za);g=t.ra;r=t.za;break}for(x= +0;x<e;x++)v=c[x],we(g,r,v[2],v[3],v[4],v[5],v[6],v[7],.5,k),g=v[6],r=v[7];break;case If:c=Kf(t,l,g,r);e=c.length;if(0===e){k.push(t.ra);k.push(t.za);g=t.ra;r=t.za;break}for(x=0;x<e;x++)v=c[x],we(g,r,v[2],v[3],v[4],v[5],v[6],v[7],.5,k),g=v[6],r=v[7];break;default:z.k("Segment not of valid type: "+t.ba)}t.Th&&(k.push(n),k.push(q),vo(a,b,k,d))}vo(a,b,k,d)}else if(c.type===nf)k.push(c.Ha),k.push(c.Da),k.push(c.L),k.push(c.Da),k.push(c.L),k.push(c.M),k.push(c.Ha),k.push(c.M),k.push(c.Ha),k.push(c.Da), +vo(a,b,k,d);else if(c.type===of){h=new kf;h.Ha=c.L;h.Da=(c.Da+c.M)/2;g=new Qf(Hf);g.Fe=0;g.Lf=360;g.ra=(c.Ha+c.L)/2;g.za=(c.Da+c.M)/2;g.radiusX=Math.abs(c.Ha-c.L)/2;g.radiusY=Math.abs(c.Da-c.M)/2;h.add(g);c=Jf(g,h);e=c.length;if(0===e)k.push(g.ra),k.push(g.za);else for(g=h.Ha,r=h.Da,x=0;x<e;x++)v=c[x],we(g,r,v[2],v[3],v[4],v[5],v[6],v[7],.5,k),g=v[6],r=v[7];vo(a,b,k,d)}z.xa(k);a.restore();ca(a,!1)}}}}; +function wo(a,b,c,d){var e=b.length;if(!(4>e)){var g=.001,h=c.length,k=b[0],l=b[1];if(4===e)Im(a,k,l,b[2],b[3],c,d);else{a.moveTo(k,l);for(var m=g=0,n=0,p=0,q=0,r=p=0,s=z.rb(),t=2;t<e;t+=2)g=b[t],m=b[t+1],n=g-k,p=m-l,0===n&&(n=.001),q=p/n,p=Math.sqrt(n*n+p*p),s.push([n,q,p]),r+=p,k=g,l=m;k=b[0];l=b[1];b=0;for(var e=!0,g=c[b%h],m=0!==d,t=0,p=s[t],n=p[0],q=p[1],p=p[2],v=0;.1<=r;){0===v&&(g=c[b%h],b++,m&&(d%=g,g-=d,m=!1));g>r&&(g=r);g>p?(v=g-p,g=p):v=0;var x=Math.sqrt(g*g/(1+q*q));0>n&&(x=-x);k+=x;l+= +q*x;e?a.lineTo(k,l):a.moveTo(k,l);r-=g;p-=g;if(0!==v){t++;if(t===s.length){z.xa(s);return}p=s[t];n=p[0];q=p[1];p=p[2];g=v}else e=!e}z.xa(s)}}}X.prototype.getDocumentPoint=X.prototype.eb=function(a,b){void 0===b&&(b=new N);a.Be()&&z.k("getDocumentPoint Spot must be a real, specific Spot, not: "+a.toString());var c=this.Ga,d=this.ub;b.n(a.x*(c.width+d)-d/2+c.x+a.offsetX,a.y*(c.height+d)-d/2+c.y+a.offsetY);this.qh.Cb(b);return b}; +X.prototype.mk=function(a,b){var c=this.wh;if(null===c||null===this.fill&&null===this.stroke)return!1;var d=c.vb,e=this.ub/2;c.type!==mf||b||(e+=2);var g=z.lg();g.assign(d);g.bg(e+2,e+2);if(!g.Ma(a))return z.dc(g),!1;d=e+1E-4;if(c.type===mf){if(null===this.stroke)return!1;d=(c.L-c.Ha)*(a.x-c.Ha)+(c.M-c.Da)*(a.y-c.Da);if(0>(c.Ha-c.L)*(a.x-c.L)+(c.Da-c.M)*(a.y-c.M)||0>d)return!1;z.dc(g);return te(c.Ha,c.Da,c.L,c.M,e,a.x,a.y)}if(c.type===nf){var h=c.Ha,k=c.Da,l=c.L,m=c.M;g.x=Math.min(h,l);g.y=Math.min(k, +m);g.width=Math.abs(l-h);g.height=Math.abs(m-k);if(null===this.fill){g.bg(-d,-d);if(g.Ma(a))return z.dc(g),!1;g.bg(d,d)}null!==this.stroke&&g.bg(e,e);e=g.Ma(a);z.dc(g);return e}if(c.type===of){var h=c.Ha,k=c.Da,l=c.L,m=c.M,c=Math.min(h,l),n=Math.min(k,m),h=Math.abs(l-h)/2,k=Math.abs(m-k)/2,c=a.x-(c+h),n=a.y-(n+k);if(null===this.fill){h-=d;k-=d;if(0>=h||0>=k||1>=c*c/(h*h)+n*n/(k*k))return z.dc(g),!1;h+=d;k+=d}null!==this.stroke&&(h+=e,k+=e);z.dc(g);return 0>=h||0>=k?!1:1>=c*c/(h*h)+n*n/(k*k)}if(c.type=== +jf)return z.dc(g),null===this.fill?Pf(c,a.x,a.y,e):c.Ma(a,e,1<this.ub,b);z.k("Unknown Geometry type: "+c.type);return!1}; +X.prototype.Ip=function(a,b,c,d){var e=this.Aa,g=this.Oe;a=Math.max(a,0);b=Math.max(b,0);var h;if(null!==this.Vf)h=this.wh.vb;else{var k=this.Hb,l=je[k];if(void 0===l){var m=xo[k];"string"===typeof m&&(m=xo[m]);"function"===typeof m?(l=m(null,100,100),je[k]=l):z.k("Unsupported Figure: "+k)}h=l.vb}var k=h.width,l=h.height,m=h.width,n=h.height;switch(Nm(this,!0)){case cj:d=c=0;break;case lf:m=Math.max(a-g,0);n=Math.max(b-g,0);break;case Dm:m=Math.max(a-g,0);d=0;break;case Cm:c=0,n=Math.max(b-g,0)}isFinite(e.width)&& +(m=e.width);isFinite(e.height)&&(n=e.height);e=this.Xe;h=this.dg;c=Math.max(c,h.width)-g;d=Math.max(d,h.height)-g;m=Math.min(e.width,m);n=Math.min(e.height,n);m=isFinite(m)?Math.max(c,m):Math.max(k,c);n=isFinite(n)?Math.max(d,n):Math.max(l,d);c=dj(this);switch(c){case cj:break;case lf:k=m;l=n;break;case ej:c=Math.min(m/k,n/l);isFinite(c)||(c=1);k*=c;l*=c;break;default:z.k(c+" is not a valid geometryStretch.")}if(null!==this.Vf)k=Math.max(k,.01),l=Math.max(l,.01),h=null!==this.Vf?this.Vf:this.kb,e= +k,d=l,c=h.copy(),h=h.vb,e/=h.width,d/=h.height,isFinite(e)||(e=1),isFinite(d)||(d=1),1===e&&1===d||c.scale(e,d),u&&c.freeze(),this.kb=c;else if(null===this.kb||this.kb.qo!==a-g||this.kb.oo!==b-g)this.kb=X.makeGeometry(this,k,l);h=this.kb.vb;Infinity===a||Infinity===b?Km(this,h.x-g/2,h.y-g/2,0===a&&0===k?0:h.width+g,0===b&&0===l?0:h.height+g):Km(this,-(g/2),-(g/2),m+g,n+g)}; +function co(a,b,c,d){if(!1!==nl(a)){a.ud.Wa();var e=a.Oe;0===e&&d instanceof da&&d.type===Ni&&d.fc instanceof X&&(e=d.fc.ub);e*=a.bc;d instanceof G&&null!==d.kb?(b=d.kb.vb,Km(a,b.x-e/2,b.y-e/2,b.width+e,b.height+e)):Km(a,-(e/2),-(e/2),b+e,c+e);a.ud.freeze();a.ud.F()||z.k("Non-real measuredBounds has been set. Object "+a+", measuredBounds: "+a.ud.toString());$k(a,!1)}}function dj(a){var b=a.Yz;return null!==a.Vf?b===Bm?lf:b:b===Bm?je[a.Hb].Xd:b}X.prototype.aj=function(a,b,c,d){Om(this,a,b,c,d)}; +X.prototype.getNearestIntersectionPoint=X.prototype.xE=function(a,b,c){return this.sp(a.x,a.y,b.x,b.y,c)}; +X.prototype.sp=function(a,b,c,d,e){var g=this.transform,h=1/(g.m11*g.m22-g.m12*g.m21),k=g.m22*h,l=-g.m12*h,m=-g.m21*h,n=g.m11*h,p=h*(g.m21*g.dy-g.m22*g.dx),q=h*(g.m12*g.dx-g.m11*g.dy),g=a*k+b*m+p,h=a*l+b*n+q,k=c*k+d*m+p,l=c*l+d*n+q,m=this.ub/2,p=this.kb;null===p&&(uj(this,Infinity,Infinity),p=this.kb);q=p.vb;n=!1;if(p.type===mf)if(1.5>=this.ub)n=Me(p.xc,p.Cc,p.zb,p.Gb,g,h,k,l,e);else{var r=0,s=0;p.xc===p.zb?(r=m,s=0):(b=(p.Gb-p.Cc)/(p.zb-p.xc),s=m/Math.sqrt(1+b*b),r=s*b);d=z.rb();b=new N;Me(p.xc+ +r,p.Cc+s,p.zb+r,p.Gb+s,g,h,k,l,b)&&d.push(b);b=new N;Me(p.xc-r,p.Cc-s,p.zb-r,p.Gb-s,g,h,k,l,b)&&d.push(b);b=new N;Me(p.xc+r,p.Cc+s,p.xc-r,p.Cc-s,g,h,k,l,b)&&d.push(b);b=new N;Me(p.zb+r,p.Gb+s,p.zb-r,p.Gb-s,g,h,k,l,b)&&d.push(b);b=d.length;if(0===b)return z.xa(d),!1;n=!0;s=Infinity;for(r=0;r<b;r++){var k=d[r],t=(k.x-g)*(k.x-g)+(k.y-h)*(k.y-h);t<s&&(s=t,e.x=k.x,e.y=k.y)}z.xa(d)}else if(p.type===nf)b=q.x-m,n=Ne(b,q.y-m,q.x+q.width+m,q.y+q.height+m,g,h,k,l,e);else if(p.type===of)a:if(b=q.copy().bg(m, +m),0===b.width)n=Me(b.x,b.y,b.x,b.y+b.height,g,h,k,l,e);else if(0===b.height)n=Me(b.x,b.y,b.x+b.width,b.y,g,h,k,l,e);else{a=b.width/2;var v=b.height/2;d=b.x+a;b=b.y+v;c=9999;g!==k&&(c=(h-l)/(g-k));if(9999>Math.abs(c)){n=h-b-c*(g-d);if(0>a*a*c*c+v*v-n*n){e.x=NaN;e.y=NaN;n=!1;break a}m=Math.sqrt(a*a*c*c+v*v-n*n);k=(-(a*a*c*n)+a*v*m)/(v*v+a*a*c*c)+d;a=(-(a*a*c*n)-a*v*m)/(v*v+a*a*c*c)+d;l=c*(k-d)+n+b;b=c*(a-d)+n+b;d=Math.abs((g-k)*(g-k))+Math.abs((h-l)*(h-l));h=Math.abs((g-a)*(g-a))+Math.abs((h-b)*(h- +b));d<h?(e.x=k,e.y=l):(e.x=a,e.y=b)}else{k=v*v;l=g-d;k-=k/(a*a)*l*l;if(0>k){e.x=NaN;e.y=NaN;n=!1;break a}m=Math.sqrt(k);l=b+m;b-=m;d=Math.abs(l-h);h=Math.abs(b-h);d<h?(e.x=g,e.y=l):(e.x=g,e.y=b)}n=!0}else if(p.type===jf){var x=0,y=0,A=t=0,q=z.O(),r=k-g,s=l-h,s=r*r+s*s;e.x=k;e.y=l;for(r=0;r<p.cc.count;r++)for(var C=p.cc.o[r],L=C.Ab,x=C.Ha,y=C.Da,H=x,U=y,ea=0;ea<L.count;ea++){var W=L.o[ea],P=W.type,t=W.L,A=W.M,ba=!1;switch(P){case Ef:H=t;U=A;break;case qf:ba=yo(x,y,t,A,g,h,k,l,q);break;case Ff:var ba= +W.zc,P=W.Qc,Oa=W.Ch,sa=W.Dh,ba=Ke(x,y,ba,P,Oa,sa,t,A,g,h,k,l,.5,q);break;case Gf:ba=(x+2*W.zc)/3;P=(y+2*W.Qc)/3;Oa=(2*W.zc+t)/3;sa=(2*W.zc+t)/3;ba=Ke(x,y,ba,P,Oa,sa,t,A,g,h,k,l,.5,q);break;case Hf:case If:P=W.type===Hf?Jf(W,C):Kf(W,C,x,y);Oa=P.length;if(0===Oa){ba=yo(x,y,W.ra,W.za,g,h,k,l,q);break}for(A=0;A<Oa;A++)v=P[A],0===A&&yo(x,y,v[0],v[1],g,h,k,l,q)&&(t=zo(g,h,q,s,e),t<s&&(s=t,n=!0)),Ke(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],g,h,k,l,.5,q)&&(t=zo(g,h,q,s,e),t<s&&(s=t,n=!0));t=v[6];A=v[7];break; +default:z.k("Unknown Segment type: "+P)}x=t;y=A;ba&&(t=zo(g,h,q,s,e),t<s&&(s=t,n=!0));W.hx&&(t=H,A=U,yo(x,y,t,A,g,h,k,l,q)&&(t=zo(g,h,q,s,e),t<s&&(s=t,n=!0)))}g=c-a;h=d-b;b=Math.sqrt(g*g+h*h);0!==b&&(g/=b,h/=b);e.x-=g*m;e.y-=h*m;z.A(q)}else z.k("Unknown Geometry type: "+p.type);if(!n)return!1;this.transform.Cb(e);return!0};function zo(a,b,c,d,e){a=c.x-a;b=c.y-b;b=a*a+b*b;return b<d?(e.x=c.x,e.y=c.y,b):d} +function yo(a,b,c,d,e,g,h,k,l){var m=!1,n=(e-h)*(b-d)-(g-k)*(a-c);if(0===n)return!1;l.x=((e*k-g*h)*(a-c)-(e-h)*(a*d-b*c))/n;l.y=((e*k-g*h)*(b-d)-(g-k)*(a*d-b*c))/n;(a>c?a-c:c-a)<(b>d?b-d:d-b)?(e=b<d?b:d,a=b<d?d:b,(l.y>e||td(l.y,e))&&(l.y<a||td(l.y,a))&&(m=!0)):(e=a<c?a:c,a=a<c?c:a,(l.x>e||td(l.x,e))&&(l.x<a||td(l.x,a))&&(m=!0));return m} +X.prototype.containedInRect=X.prototype.Xm=function(a,b){if(void 0===b)return a.nk(this.W);var c=this.kb;null===c&&(uj(this,Infinity,Infinity),c=this.kb);var c=c.vb,d=this.ub/2,e=!1,g=z.O();g.n(c.x-d,c.y-d);a.Ma(b.Cb(g))&&(g.n(c.x-d,c.bottom+d),a.Ma(b.Cb(g))&&(g.n(c.right+d,c.bottom+d),a.Ma(b.Cb(g))&&(g.n(c.right+d,c.y-d),a.Ma(b.Cb(g))&&(e=!0))));z.A(g);return e}; +X.prototype.intersectsRect=X.prototype.Jg=function(a,b){if(this.Xm(a,b)||void 0===b&&(b=this.transform,a.nk(this.W)))return!0;var c=z.Hh();c.set(b);c.eA();var d=a.left,e=a.right,g=a.top,h=a.bottom,k=z.O();k.n(d,g);c.Cb(k);if(this.mk(k,!0))return z.A(k),!0;k.n(e,g);c.Cb(k);if(this.mk(k,!0))return z.A(k),!0;k.n(d,h);c.Cb(k);if(this.mk(k,!0))return z.A(k),!0;k.n(e,h);c.Cb(k);if(this.mk(k,!0))return z.A(k),!0;var l=z.O(),m=z.O();c.set(b);c.uA(this.transform);c.eA();l.x=e;l.y=g;l.transform(c);k.x=d;k.y= +g;k.transform(c);var n=!1;Ao(this,k,l,m)?n=!0:(k.x=e,k.y=h,k.transform(c),Ao(this,k,l,m)?n=!0:(l.x=d,l.y=h,l.transform(c),Ao(this,k,l,m)?n=!0:(k.x=d,k.y=g,k.transform(c),Ao(this,k,l,m)&&(n=!0))));z.A(k);z.jf(c);z.A(l);z.A(m);return n};function Ao(a,b,c,d){if(!a.xE(b,c,d))return!1;a=b.x;b=b.y;var e=c.x;c=c.y;var g=d.x;d=d.y;if(a===e){var h=0;a=0;b<c?(h=b,a=c):(h=c,a=b);return d>=h&&d<=a}a<e?(h=a,a=e):h=e;return g>=h&&g<=a} +X.prototype.rE=function(a,b,c){function d(a,b){for(var c=a.length,d=0;d<c;d+=2)if(b.jp(a[d],a[d+1])>e)return!0;return!1}if(c&&null!==this.fill&&this.mk(a,!0))return!0;var e=a.Af(b);b=e;1.5<this.ub&&(e=this.ub/2+Math.sqrt(e),e*=e);var g=this.kb;if(null===g&&(uj(this,Infinity,Infinity),g=this.kb,null===g))return!1;if(!c){var h=g.vb,k=h.x,l=h.y,m=h.x+h.width,h=h.y+h.height;if(vb(a.x,a.y,k,l)<=e&&vb(a.x,a.y,m,l)<=e&&vb(a.x,a.y,k,h)<=e&&vb(a.x,a.y,m,h)<=e)return!0}k=g.xc;l=g.Cc;m=g.zb;h=g.Gb;if(g.type=== +mf){if(c=ub(a.x,a.y,k,l,m,h),g=(k-m)*(a.x-m)+(l-h)*(a.y-h),c<=(0<=(m-k)*(a.x-k)+(h-l)*(a.y-l)&&0<=g?e:b))return!0}else{if(g.type===nf)return b=!1,c&&(b=ub(a.x,a.y,k,l,k,h)<=e||ub(a.x,a.y,k,l,m,l)<=e||ub(a.x,a.y,m,l,m,h)<=e||ub(a.x,a.y,k,h,m,h)<=e),b;if(g.type===of){b=a.x-(k+m)/2;var g=a.y-(l+h)/2,n=Math.abs(m-k)/2,p=Math.abs(h-l)/2;if(0===n||0===p)return c=ub(a.x,a.y,k,l,m,h),c<=e?!0:!1;if(c){if(a=gf(n,p,b,g),a*a<=e)return!0}else return vb(b,g,-n,0)>=e||vb(b,g,0,-p)>=e||vb(b,g,0,p)>=e||vb(b,g,n,0)>= +e?!1:!0}else if(g.type===jf){h=g.vb;k=h.x;l=h.y;m=h.x+h.width;h=h.y+h.height;if(a.x>m&&a.x<k&&a.y>h&&a.y<l&&ub(a.x,a.y,k,l,k,h)>e&&ub(a.x,a.y,k,l,m,l)>e&&ub(a.x,a.y,m,h,k,h)>e&&ub(a.x,a.y,m,h,m,l)>e)return!1;b=Math.sqrt(e);if(c){if(null===this.fill?Pf(g,a.x,a.y,b):g.Ma(a,b,!0))return!0}else{c=g.cc;for(b=0;b<c.count;b++){k=c.o[b];n=k.Ha;p=k.Da;if(a.jp(n,p)>e)return!1;l=k.Ab.o;m=l.length;for(h=0;h<m;h++){var q=l[h];switch(q.type){case Ef:case qf:n=q.L;p=q.M;if(a.jp(n,p)>e)return!1;break;case Ff:g=z.rb(); +we(n,p,q.zc,q.Qc,q.Ch,q.Dh,q.L,q.M,.8,g);n=d(g,a);z.xa(g);if(n)return!1;n=q.L;p=q.M;if(a.jp(n,p)>e)return!1;break;case Gf:g=z.rb();Je(n,p,q.zc,q.Qc,q.L,q.M,.8,g);n=d(g,a);z.xa(g);if(n)return!1;n=q.L;p=q.M;if(a.jp(n,p)>e)return!1;break;case Hf:case If:var r=q.type===Hf?Jf(q,k):Kf(q,k,n,p),s=r.length;if(0===s){n=q.ra;p=q.za;if(a.jp(n,p)>e)return!1;break}q=null;g=z.rb();for(b=0;b<s;b++)if(q=r[b],g.length=0,we(q[0],q[1],q[2],q[3],q[4],q[5],q[6],q[7],.8,g),d(g,a))return z.xa(g),!1;z.xa(g);null!==q&&(n= +q[6],p=q[7]);break;default:z.k("Unknown Segment type: "+q.type)}}}return!0}}}return!1};z.defineProperty(X,{wh:"geometry"},function(){return null!==this.kb?this.kb:this.Vf},function(a){var b=this.kb;if(b!==a){null!==a?(u&&z.l(a,hf,X,"geometry"),this.Vf=this.kb=a.freeze()):this.Vf=this.kb=null;var c=this.ca;null!==c&&(c.Rj=NaN);this.Q();this.j("geometry",b,a);0!==(this.ja&1024)&&(a=this.ca,null!==a&&Jm(this,a,"geometryString"))}}); +z.defineProperty(X,{KH:"geometryString"},function(){return null===this.wh?"":this.wh.toString()},function(a){a=sf(a);var b=a.normalize();this.wh=a;this.position=a=z.Tb(-b.x,-b.y);z.A(a)});z.defineProperty(X,{LE:"isGeometryPositioned"},function(){return this.ir},function(a){u&&z.g(a,"boolean",X,"isGeometryPositioned");var b=this.ir;b!==a&&(this.ir=a,this.Q(),this.j("isGeometryPositioned",b,a))});X.prototype.qe=function(){this.kb=null}; +z.defineProperty(X,{fill:"fill"},function(){return this.Ad},function(a){var b=this.Ad;b!==a&&(u&&null!==a&&z.ot(a,"Shape.fill"),a instanceof Da&&a.freeze(),this.Ad=a,this.ta(),this.j("fill",b,a))});z.defineProperty(X,{stroke:"stroke"},function(){return this.Kc},function(a){var b=this.Kc;b!==a&&(u&&null!==a&&z.ot(a,"Shape.stroke"),a instanceof Da&&a.freeze(),this.Kc=a,this.ta(),this.j("stroke",b,a))}); +z.defineProperty(X,{ub:"strokeWidth"},function(){return this.Oe},function(a){var b=this.Oe;if(b!==a)if(u&&z.p(a,X,"strokeWidth"),0<=a){this.Oe=a;this.Q();var c=this.ca;null!==c&&(c.Rj=NaN);this.j("strokeWidth",b,a)}else z.ka(a,"value >= 0",X,"strokeWidth:value")}); +z.defineProperty(X,{wL:"strokeCap"},function(){return this.Ro},function(a){var b=this.Ro;b!==a&&("string"!==typeof a||"butt"!==a&&"round"!==a&&"square"!==a?z.ka(a,'"butt", "round", or "square"',X,"strokeCap"):(this.Ro=a,this.ta(),this.j("strokeCap",b,a)))}); +z.defineProperty(X,{yL:"strokeJoin"},function(){return this.To},function(a){var b=this.To;b!==a&&("string"!==typeof a||"miter"!==a&&"bevel"!==a&&"round"!==a?z.ka(a,'"miter", "bevel", or "round"',X,"strokeJoin"):(this.To=a,this.ta(),this.j("strokeJoin",b,a)))}); +z.defineProperty(X,{zL:"strokeMiterLimit"},function(){return this.Jm},function(a){var b=this.Jm;if(b!==a)if(u&&z.p(a,X,"strokeMiterLimit"),1<=a){this.Jm=a;this.ta();var c=this.ca;null!==c&&(c.Rj=NaN);this.j("strokeMiterLimit",b,a)}else z.ka(a,"value >= 1",X,"strokeWidth:value")}); +z.defineProperty(X,{PF:"strokeDashArray"},function(){return this.So},function(a){var b=this.So;if(b!==a){null===a||Array.isArray(a)||z.ic(a,"Array",X,"strokeDashArray:value");if(null!==a){for(var c=a.length,d=0,e=0;e<c;e++){var g=a[e];"number"===typeof g&&0<=g&&isFinite(g)||z.k("strokeDashArray:value "+g+" at index "+e+" must be a positive number or zero.");d+=g}if(0===d){if(null===b)return;a=null}}this.So=a;this.ta();this.j("strokeDashArray",b,a)}}); +z.defineProperty(X,{xL:"strokeDashOffset"},function(){return this.we},function(a){var b=this.we;b!==a&&(u&&z.p(a,X,"strokeDashOffset"),0<=a&&(this.we=a,this.ta(),this.j("strokeDashOffset",b,a)))}); +z.defineProperty(X,{Hb:"figure"},function(){return this.eo},function(a){var b=this.eo;if(b!==a){u&&z.g(a,"string",X,"figure");var c=xo[a];"function"===typeof c?c=a:(c=xo[a.toLowerCase()])||z.k("Unknown Shape.figure: "+a);b!==c&&(a=this.ca,null!==a&&(a.Rj=NaN),this.eo=c,this.Vf=null,this.qe(),this.Q(),this.j("figure",b,c))}}); +z.defineProperty(X,{fq:"toArrow"},function(){return this.Xo},function(a){var b=this.Xo;!0===a?a="Standard":!1===a&&(a="");if(b!==a){u&&z.g(a,"string",X,"toArrow");var c=Bo(a);null===c?z.k("Unknown Shape.toArrow: "+a):b!==c&&(this.Xo=c,this.Vf=null,this.qe(),this.Q(),Co(this),this.j("toArrow",b,c))}}); +z.defineProperty(X,{Wz:"fromArrow"},function(){return this.jo},function(a){var b=this.jo;!0===a?a="Standard":!1===a&&(a="");if(b!==a){u&&z.g(a,"string",X,"fromArrow");var c=Bo(a);null===c?z.k("Unknown Shape.fromArrow: "+a):b!==c&&(this.jo=c,this.Vf=null,this.qe(),this.Q(),Co(this),this.j("fromArrow",b,c))}});function Co(a){var b=a.h;null!==b&&b.pa.qb||(a.pu=Do,"None"!==a.Xo?(a.De=-1,a.kk=ad):"None"!==a.jo&&(a.De=0,a.kk=new Q(1-ad.x,ad.y)))} +z.defineProperty(X,{C:"spot1"},function(){return this.ci},function(a){z.l(a,Q,X,"spot1");var b=this.ci;b.N(a)||(this.ci=a=a.V(),this.Q(),this.j("spot1",b,a))});z.defineProperty(X,{D:"spot2"},function(){return this.di},function(a){z.l(a,Q,X,"spot2");var b=this.di;b.N(a)||(this.di=a=a.V(),this.Q(),this.j("spot2",b,a))});z.defineProperty(X,{Ic:"parameter1"},function(){return this.bs},function(a){var b=this.bs;b!==a&&(this.bs=a,this.qe(),this.Q(),this.j("parameter1",b,a))}); +z.defineProperty(X,{gu:"parameter2"},function(){return this.cs},function(a){var b=this.cs;b!==a&&(this.cs=a,this.qe(),this.Q(),this.j("parameter2",b,a))});z.w(X,{Ga:"naturalBounds"},function(){if(null!==this.kb)return this.Wc.assign(this.kb.vb),this.Wc;var a=this.Aa;return new w(0,0,a.width,a.height)});z.defineProperty(X,{yx:"pathPattern"},function(){return this.es},function(a){var b=this.es;b!==a&&(u&&z.l(a,O,X,"pathPattern"),this.es=a,this.ta(),this.j("pathPattern",b,a))}); +z.defineProperty(X,{mL:"pathObject"},function(){return this.yx},function(a){this.yx=a});z.defineProperty(X,{Yz:"geometryStretch"},function(){return this.br},function(a){var b=this.br;b!==a&&(z.Ba(a,O,X,"geometryStretch"),this.br=a,this.j("geometryStretch",b,a))});z.defineProperty(X,{interval:"interval"},function(){return this.fr},function(a){var b=this.fr;u&&z.p(a,X,"interval");a=Math.floor(a);if(b!==a&&0<=a){this.fr=a;var c=this.h;null!==c&&this.T===c.tp&&hl(c);this.Q();this.j("interval",b,a)}}); +X.makeGeometry=function(a,b,c){var d=null;if("None"!==a.fq)d=ke[a.fq];else if("None"!==a.Wz)d=ke[a.Wz];else{var e=xo[a.Hb];"string"===typeof e&&(e=xo[e]);void 0===e&&z.k("Unknown Shape.figure: "+a.Hb);d=e(a,b,c);d.qo=b;d.oo=c}null===d&&(e=xo.Rectangle,"function"===typeof e&&(d=e(a,b,c)));return d};X.getFigureGenerators=function(){var a=new na("string","function"),b;for(b in xo)if(b!==b.toLowerCase()){var c=xo[b];"function"===typeof c&&a.add(b,c)}a.freeze();return a}; +X.defineFigureGenerator=function(a,b){z.g(a,"string",X,"defineFigureGenerator:name");"string"===typeof b?""!==b&&xo[b]||z.k("Shape.defineFigureGenerator synonym must not be empty or None or not a defined figure name: "+b):z.g(b,"function",X,"defineFigureGenerator:func");var c=a.toLowerCase();""!==a&&"none"!==c&&a!==c||z.k("Shape.defineFigureGenerator name must not be empty or None or all-lower-case: "+a);xo[a]=b;xo[c]=a}; +X.getArrowheadGeometries=function(){var a=new na("string",hf),b;for(b in ke)if(b!==b.toLowerCase()){var c=ke[b];c instanceof hf&&a.add(b,c)}a.freeze();return a}; +X.defineArrowheadGeometry=function(a,b){z.g(a,"string",X,"defineArrowheadGeometry:name");var c=null;"string"===typeof b?(z.g(b,"string",X,"defineArrowheadGeometry:pathstr"),c=sf(b,!1)):(z.l(b,hf,X,"defineArrowheadGeometry:pathstr"),c=b);var d=a.toLowerCase();""!==a&&"none"!==d&&a!==d||z.k("Shape.defineArrowheadGeometry name must not be empty or None or all-lower-case: "+a);ke[a]=c;ke[d]=a}; +function qa(){O.call(this);this.xe="";this.Kc="black";this.Ph="13px sans-serif";this.Lm="start";this.kr=!0;this.km=this.lm=!1;this.ml=Eo;this.Pm=Fo;this.Jv=this.Le=0;this.io=this.$y=this.az=null;this.Oj=new Go;this.Wq=!1;this.uf=this.ol=this.Us=null;this.bk=this.ak=0;this.Mi=Infinity;this.Ev=0}z.Qa(qa,O);z.ia("TextBlock",qa);var Ho=new ma,Io=0,Jo=new ma,Ko=0,Lo="...",Mo="",No=(new la(null)).zl;qa.getEllipsis=function(){return Lo};qa.setEllipsis=function(a){Lo=a;Jo=new ma;Ko=0}; +qa.prototype.cloneProtected=function(a){O.prototype.cloneProtected.call(this,a);a.xe=this.xe;a.Kc=this.Kc;a.Ph=this.Ph;a.Lm=this.Lm;a.kr=this.kr;a.lm=this.lm;a.km=this.km;a.ml=this.ml;a.Pm=this.Pm;a.Le=this.Le;a.Jv=this.Jv;a.az=this.az;a.$y=this.$y;a.io=this.io;a.Oj.tt(this.Oj);a.Wq=this.Wq;a.Us=this.Us;a.ol=this.ol;a.uf=this.uf;a.ak=this.ak;a.bk=this.bk;a.Mi=this.Mi;a.Ev=this.Ev}; +qa.prototype.toString=function(){return 22<this.xe.length?'TextBlock("'+this.xe.substring(0,20)+'"...)':'TextBlock("'+this.xe+'")'};var Oo;qa.None=Oo=z.s(qa,"None",0);var Po;qa.WrapFit=Po=z.s(qa,"WrapFit",1);var Fo;qa.WrapDesiredSize=Fo=z.s(qa,"WrapDesiredSize",2);var Eo;qa.OverflowClip=Eo=z.s(qa,"OverflowClip",0);var Qo;qa.OverflowEllipsis=Qo=z.s(qa,"OverflowEllipsis",1);qa.prototype.Q=function(){O.prototype.Q.call(this);this.$y=this.az=null}; +z.defineProperty(qa,{font:"font"},function(){return this.Ph},function(a){var b=this.Ph;b!==a&&(u&&(z.g(a,"string",qa,"font"),Ro(a)||z.k('Not a valid font: "'+a+'"')),this.Ph=a,this.io=null,this.Q(),this.j("font",b,a))});var Ro;qa.isValidFont=Ro=function(a){var b=No.font;if(a===b||"10px sans-serif"===a)return!0;No.font="10px sans-serif";var c;No.font=a;var d=No.font;if("10px sans-serif"!==d)return No.font=b,!0;No.font="19px serif";c=No.font;No.font=a;d=No.font;No.font=b;return d!==c}; +z.defineProperty(qa,{text:"text"},function(){return this.xe},function(a){var b=this.xe;a=null!==a&&void 0!==a?a.toString():"";b!==a&&(this.xe=a,this.Q(),this.j("text",b,a))});z.defineProperty(qa,{textAlign:"textAlign"},function(){return this.Lm},function(a){var b=this.Lm;b!==a&&(u&&z.g(a,"string",qa,"textAlign"),"start"===a||"end"===a||"left"===a||"right"===a||"center"===a?(this.Lm=a,this.ta(),this.j("textAlign",b,a)):z.ka(a,'"start", "end", "left", "right", or "center"',qa,"textAlign"))}); +z.w(qa,{Ga:"naturalBounds"},function(){if(!this.Wc.F()){var a=So(this,this.xe,this.Oj,999999).width,b=To(this,a,this.Oj),c=this.Aa;isNaN(c.width)||(a=c.width);isNaN(c.height)||(b=c.height);yb(this.Wc,a,b)}return this.Wc});z.defineProperty(qa,{mx:"isMultiline"},function(){return this.kr},function(a){var b=this.kr;b!==a&&(u&&z.g(a,"boolean",qa,"isMultiline"),this.kr=a,this.Q(),this.j("isMultiline",b,a))}); +z.defineProperty(qa,{JK:"isUnderline"},function(){return this.lm},function(a){var b=this.lm;b!==a&&(u&&z.g(a,"boolean",qa,"isUnderline"),this.lm=a,this.ta(),this.j("isUnderline",b,a))});z.defineProperty(qa,{IK:"isStrikethrough"},function(){return this.km},function(a){var b=this.km;b!==a&&(u&&z.g(a,"boolean",qa,"isStrikethrough"),this.km=a,this.ta(),this.j("isStrikethrough",b,a))}); +z.defineProperty(qa,{hG:"wrap"},function(){return this.Pm},function(a){var b=this.Pm;b!==a&&(u&&z.Ba(a,qa,qa,"wrap"),this.Pm=a,this.Q(),this.j("wrap",b,a))});z.defineProperty(qa,{overflow:"overflow"},function(){return this.ml},function(a){var b=this.ml;b!==a&&(u&&z.Ba(a,qa,qa,"overflow"),this.ml=a,this.Q(),this.j("overflow",b,a))}); +z.defineProperty(qa,{stroke:"stroke"},function(){return this.Kc},function(a){var b=this.Kc;b!==a&&(u&&null!==a&&z.ot(a,"TextBlock.stroke"),a instanceof Da&&a.freeze(),this.Kc=a,this.ta(),this.j("stroke",b,a))});z.w(qa,{rI:"lineCount"},function(){return this.Le});z.defineProperty(qa,{Sz:"editable"},function(){return this.Wq},function(a){var b=this.Wq;b!==a&&(u&&z.g(a,"boolean",qa,"editable"),this.Wq=a,this.j("editable",b,a))}); +z.defineProperty(qa,{RF:"textEditor"},function(){return this.Us},function(a){var b=this.Us;b!==a&&(a instanceof HTMLElement||z.k("textEditor must be an HTMLElement, not: "+a),this.Us=a,this.j("textEditor",b,a))});z.defineProperty(qa,{Uz:"errorFunction"},function(){return this.uf},function(a){var b=this.uf;b!==a&&(null!==a&&z.g(a,"function",qa,"errorFunction"),this.uf=a,this.j("errorFunction",b,a))}); +qa.prototype.ok=function(a,b){if(null!==this.Kc&&0!==this.xe.length&&null!==this.Ph){var c=this.Ga.width,d=Uo(this);a.textAlign=this.Lm;Vm(this,a,this.Kc,!0,!1);(this.lm||this.km)&&Vm(this,a,this.Kc,!1,!1);var e=this.Oj,g=0,h=!1,k=z.Tb(0,0);this.qh.Cb(k);var l=z.Tb(0,d);this.qh.Cb(l);var m=k.Af(l);z.A(k);z.A(l);k=b.scale;8>m*k*k&&(h=!0);b.gd!==a&&(h=!1);!1===b.ij("textGreeking")&&(h=!1);for(var m=b.mr,k=this.ak,l=this.bk,n=this.Le,p=0;p<n;p++){var q=e.sf[p],r=e.Je[p];q>c&&(q=c);var g=g+k,s=r,r=a, +t=g,v=c,x=d,y=0,A=this.Lm;"start"===A&&(A=m?"right":"left");"end"===A&&(A=m?"left":"right");h?("left"===A?y=0:"right"===A?y=v-q:"center"===A&&(y=(v-q)/2),r.fillRect(0+y,t+.25*x,q,1)):("left"===A?y=0:"right"===A?y=v:"center"===A&&(y=v/2),r.fillText(s,0+y,t+x-.25*x),s=x/20|0,0===s&&(s=1),"right"===A?y-=q:"center"===A&&(y-=q/2),this.lm&&(r.beginPath(),r.lineWidth=s,r.moveTo(0+y,t+x-.2*x),r.lineTo(0+y+q,t+x-.2*x),r.stroke()),this.km&&(r.beginPath(),r.lineWidth=s,t=t+x-x/2.2|0,0!==s%2&&(t+=.5),r.moveTo(0+ +y,t),r.lineTo(0+y+q,t),r.stroke()));g+=d+l}}}; +qa.prototype.Ip=function(a,b,c,d){this.Ev=a;var e=this.Oj;e.reset();var g=0,h=0;if(isNaN(this.Aa.width)){g=this.xe.replace(/\r\n/g,"\n").replace(/\r/g,"\n");if(0===g.length)g=0;else if(this.mx){for(var k=h=0,l=!1;!l;){var m=g.indexOf("\n",k);-1===m&&(m=g.length,l=!0);k=Vo(g.substr(k,m-k).replace(/^\s+|\s+$/g,""),this.Ph);k>h&&(h=k);k=m+1}g=h}else h=g.indexOf("\n",0),0<=h&&(g=g.substr(0,h)),g=k=Vo(g,this.Ph);g=Math.min(g,a/this.scale);g=Math.max(8,g)}else g=this.Aa.width;null!==this.T&&(g=Math.min(g, +this.T.Xe.width),g=Math.max(g,this.T.dg.width));h=To(this,g,e);m=h=isNaN(this.Aa.height)?Math.min(h,b/this.scale):this.Aa.height;if(0!==e.cf&&1!==e.Je.length&&this.ml===Qo&&(b=this.Ph,l=this.ml===Qo?Wo(b):0,k=this.ak+this.bk,k=Math.max(0,Uo(this)+k),m=Math.min(this.zI-1,Math.max(Math.floor(m/k+.01)-1,0)),!(m+1>=e.Je.length))){k=e.Je[m];for(a=Math.max(1,a-l);Vo(k,b)>a&&1<k.length;)k=k.substr(0,k.length-1);k+=Lo;a=Vo(k,b);e.Je[m]=k;e.Je=e.Je.slice(0,m+1);e.sf[m]=a;e.sf=e.sf.slice(0,m+1);e.$i=e.Je.length; +e.cf=Math.max(e.cf,a);this.Le=e.$i}if(this.hG===Po||isNaN(this.Aa.width))g=e.cf,isNaN(this.Aa.width)&&(g=Math.max(8,g));g=Math.max(c,g);h=Math.max(d,h);yb(this.Wc,g,h);Km(this,0,0,g,h)};qa.prototype.aj=function(a,b,c,d){Om(this,a,b,c,d)}; +function So(a,b,c,d){b=b.replace(/^\s+|\s+$/g,"");var e=0,g=0,h=0,k=a.Ph,g=a.ak+a.bk,l=Math.max(0,Uo(a)+g),h=a.ml===Qo?Wo(k):0;if(a.Le>=a.Mi)return new Ea(0,l);if(a.Pm===Oo){c.$i=1;g=Vo(b,k);if(0===h||g<=d)return c.cf=g,c.sf.push(c.cf),c.Je.push(b),new Ea(g,l);var m=Xo(b);b=b.substr(m.length);for(var n=Xo(b),g=Vo(m+n,k);0<n.length&&g<=d;)m+=n,b=b.substr(n.length),n=Xo(b),g=Vo((m+n).replace(/^\s+|\s+$/g,""),k);m+=n.replace(/^\s+|\s+$/g,"");for(d=Math.max(1,d-h);Vo(m,k)>d&&1<m.length;)m=m.substr(0, +m.length-1);m+=Lo;h=Vo(m,k);c.sf.push(h);c.cf=h;c.Je.push(m);return new Ea(h,l)}var p=0;0===b.length&&(p=1,c.sf.push(0),c.Je.push(b));for(;0<b.length;){m=Xo(b);for(b=b.substr(m.length);Vo(m,k)>d;){n=1;g=Vo(m.substr(0,n),k);for(h=0;g<=d;)n++,h=g,g=Vo(m.substr(0,n),k);1===n?(c.sf[a.Le+p]=g,e=Math.max(e,g)):(c.sf[a.Le+p]=h,e=Math.max(e,h));n--;1>n&&(n=1);c.Je[a.Le+p]=m.substr(0,n);p++;m=m.substr(n);if(a.Le+p>a.Mi)break}n=Xo(b);for(g=Vo(m+n,k);0<n.length&&g<=d;)m+=n,b=b.substr(n.length),n=Xo(b),g=Vo((m+ +n).replace(/^\s+|\s+$/g,""),k);m=m.replace(/^\s+|\s+$/g,"");if(""!==m&&(0===n.length?(c.sf.push(g),e=Math.max(e,g)):(h=Vo(m,k),c.sf.push(h),e=Math.max(e,h)),c.Je.push(m),p++,a.Le+p>a.Mi))break}c.$i=Math.min(a.Mi,p);c.cf=Math.max(c.cf,e);return new Ea(c.cf,l*c.$i)}function Xo(a){for(var b=a.length,c=0;c<b&&" "!==a.charAt(c);)c++;for(;c<b&&" "===a.charAt(c);)c++;return c>=b?a:a.substr(0,c)}function Vo(a,b){Mo!==b&&(Mo=No.font=b);return No.measureText(a).width} +function Uo(a){if(null!==a.io)return a.io;var b=a.Ph;Mo!==b&&(Mo=No.font=b);var c=0;void 0!==Ho[b]&&5E3>Io?c=Ho[b]:(c=1.3*No.measureText("M").width,Ho[b]=c,Io++);return a.io=c}function Wo(a){Mo!==a&&(Mo=No.font=a);var b=0;void 0!==Jo[a]&&5E3>Ko?b=Jo[a]:(b=No.measureText(Lo).width,Jo[a]=b,Ko++);return b} +function To(a,b,c){var d=a.xe.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),e=a.ak+a.bk,e=Math.max(0,Uo(a)+e);if(0===d.length)return c.cf=0,a.Le=1,e;if(!a.mx){var g=d.indexOf("\n",0);0<=g&&(d=d.substr(0,g))}for(var g=0,h=a.Le=0,k=-1,l=!1;!l;)k=d.indexOf("\n",h),-1===k&&(k=d.length,l=!0),h<=k&&(h=d.substr(h,k-h),a.Pm!==Oo?(c.$i=0,h=So(a,h,c,b),g+=h.height,a.Le+=c.$i):(So(a,h,c,b),g+=e,a.Le++),a.Le===a.Mi&&(l=!0)),h=k+1;return a.Jv=g} +z.defineProperty(qa,{XA:"textValidation"},function(){return this.ol},function(a){var b=this.ol;b!==a&&(null!==a&&z.g(a,"function",qa,"textValidation"),this.ol=a,this.j("textValidation",b,a))});z.defineProperty(qa,{tL:"spacingAbove"},function(){return this.ak},function(a){var b=this.ak;b!==a&&(u&&z.g(a,"number",qa,"spacingAbove"),this.ak=a,this.j("spacingAbove",b,a))}); +z.defineProperty(qa,{uL:"spacingBelow"},function(){return this.bk},function(a){var b=this.bk;b!==a&&(u&&z.g(a,"number",qa,"spacingBelow"),this.bk=a,this.j("spacingBelow",b,a))});z.defineProperty(qa,{zI:"maxLines"},function(){return this.Mi},function(a){var b=this.Mi;b!==a&&(u&&z.g(a,"number",qa,"maxLines"),a=Math.floor(a),0>=a&&z.ka(a,"> 0",qa,"maxLines"),this.Mi=a,this.j("maxLines",b,a),this.Q())});z.w(qa,{UK:"metrics"},function(){return this.Oj}); +function Go(){this.cf=this.$i=0;this.sf=[];this.Je=[]}Go.prototype.reset=function(){this.cf=this.$i=0;this.sf=[];this.Je=[]};Go.prototype.tt=function(a){this.$i=a.$i;this.cf=a.cf;this.sf=z.Al(a.sf);this.Je=z.Al(a.Je)};z.w(Go,{bK:"arrSize"},function(){return this.sf});z.w(Go,{cK:"arrText"},function(){return this.Je});z.w(Go,{TK:"maxLineWidth"},function(){return this.cf}); +function xk(){O.call(this);this.$e=null;this.Ns="";this.$j=ge;this.lo=lf;this.Uo=this.ck=this.uf=null;this.Sy=!1;this.fo=!0;this.Lo=null}z.Qa(xk,O);z.ia("Picture",xk);xk.prototype.cloneProtected=function(a){O.prototype.cloneProtected.call(this,a);a.element=this.$e;a.Ns=this.Ns;a.$j=this.$j.V();a.lo=this.lo;a.uf=this.uf;a.ck=this.ck;a.fo=this.fo;a.Lo=this.Lo};var Yo=new ma,Zo=0,rk=[]; +function $o(){var a=rk;if(0===a.length)for(var b=window.document.getElementsByTagName("canvas"),c=b.length,d=0;d<c;d++){var e=b[d];e.parentElement&&e.parentElement.Z&&a.push(e.parentElement.Z)}return a}var ap;xk.clearCache=ap=function(a){void 0===a&&(a="");z.g(a,"string",xk,"clearCache:url");""!==a?Yo[a]&&(delete Yo[a],Zo--):(Yo=new ma,Zo=0)};xk.prototype.toString=function(){return"Picture("+this.source+")#"+z.nd(this)}; +z.defineProperty(xk,{element:"element"},function(){return this.$e},function(a){var b=this.$e;if(b!==a){null===a||a instanceof HTMLImageElement||a instanceof HTMLVideoElement||a instanceof HTMLCanvasElement||z.k("Picture.element must be an instance of Image, Canvas, or Video, not: "+a);this.Sy=a instanceof HTMLCanvasElement;this.$e=a;if(null!==a)if(!0===a.complete||void 0===a.complete)a.rv instanceof Event&&null!==this.uf&&this.uf(this,a.rv),!0===a.Uy&&null!==this.ck&&this.ck(this,null),a.Uy=!0,this.Aa.F()|| +($k(this,!1),this.Q());else{var c=this;a.gC||(a.addEventListener("load",function(b){bp(a,b);c.Aa.F()||($k(c,!1),c.Q())}),a.addEventListener("error",function(b){cp(a,b)}),a.gC=!0)}this.j("element",b,a);this.ta()}}); +z.defineProperty(xk,{source:"source"},function(){return this.Ns},function(a){var b=this.Ns;if(b!==a){z.g(a,"string",xk,"source");this.Ns=a;var c=Yo,d=this.h;if(void 0!==c[a])var e=c[a].ap[0].source;else{30<Zo&&(ap(),c=Yo);var e=z.createElement("img"),g=this;e.addEventListener("load",function(a){bp(e,a);g.Aa.F()||($k(g,!1),g.Q())});e.addEventListener("error",function(a){cp(e,a)});e.gC=!0;e.src=a;var h=this.Lo;null!==h&&(e.crossOrigin=h(this));c[a]=new dp(e);Zo++}null!==d&&Vl(d,this);this.element=e; +null!==d&&Ul(d,this);this.Q();this.ta();this.j("source",b,a)}});function bp(a,b){a.Uy=!0;a.rv=!1;for(var c=null,d=$o(),e=d.length,g=0;g<e;g++){var h=d[g],k=h.Fo.na(a.src);if(null!==k)for(e=k.length,g=0;g<e;g++)c=k[g],h.SC.add(c),h.Ce(),null!==c.ck&&c.ck(c,b)}}function cp(a,b){a.rv=b;for(var c=null,d=$o(),e=d.length,g=0;g<e;g++)if(c=d[g].Fo.na(a.src),null!==c){for(var e=c.length,h=z.rb(),g=0;g<e;g++)h.push(c[g]);for(g=0;g<e;g++)c=h[g],null!==c.uf&&c.uf(c,b);z.xa(h)}} +z.defineProperty(xk,{sL:"sourceCrossOrigin"},function(){return this.Lo},function(a){if(this.Lo!==a&&(null!==a&&z.g(a,"function",xk,"sourceCrossOrigin"),this.Lo=a,null!==this.element)){var b=this.element.src;null===a&&"string"===typeof b?this.element.crossOrigin=null:null!==a&&(this.element.crossOrigin=a(this))}});z.defineProperty(xk,{tj:"sourceRect"},function(){return this.$j},function(a){var b=this.$j;b.N(a)||(z.l(a,w,xk,"sourceRect"),this.$j=a=a.V(),this.ta(),this.j("sourceRect",b,a))}); +z.defineProperty(xk,{WH:"imageStretch"},function(){return this.lo},function(a){var b=this.lo;b!==a&&(z.Ba(a,O,xk,"imageStretch"),this.lo=a,this.ta(),this.j("imageStretch",b,a))});z.defineProperty(xk,{Uz:"errorFunction"},function(){return this.uf},function(a){var b=this.uf;b!==a&&(null!==a&&z.g(a,"function",xk,"errorFunction"),this.uf=a,this.j("errorFunction",b,a))}); +z.defineProperty(xk,{CL:"successFunction"},function(){return this.ck},function(a){var b=this.ck;b!==a&&(null!==a&&z.g(a,"function",xk,"successFunction"),this.ck=a,this.j("successFunction",b,a))}); +xk.prototype.ok=function(a,b){var c=this.$e;if(null!==c){var d=c.src;null!==d&&""!==d||z.k('Element has no source ("src") attribute: '+c);if(!(c.rv instanceof Event)&&!0===c.Uy){var d=this.Ga,e=0,g=0,h=this.Sy,k=h?+c.width:c.naturalWidth,h=h?+c.height:c.naturalHeight;void 0===k&&c.videoWidth&&(k=c.videoWidth);void 0===h&&c.videoHeight&&(h=c.videoHeight);k=k||d.width;h=h||d.height;if(0!==k&&0!==h){var l=k,m=h;this.tj.F()&&(e=this.$j.x,g=this.$j.y,k=this.$j.width,h=this.$j.height);var n=k,p=h,q=this.lo; +switch(q){case cj:if(this.tj.F())break;e+=Math.max((n-d.width)/2,0);g+=Math.max((p-d.height)/2,0);k=Math.min(d.width,n);h=Math.min(d.height,p);break;case lf:n=d.width;p=d.height;break;case ej:case fj:var r=0;q===ej?(r=Math.min(d.height/p,d.width/n),n*=r,p*=r):q===fj&&(r=Math.max(d.height/p,d.width/n),n*=r,p*=r,e+=(n-d.width)/2/n*k,g+=(p-d.height)/2/p*h,k*=1/(n/d.width),h*=1/(p/d.height),n=d.width,p=d.height)}var q=this.hj()*b.scale,s=k*h/(n*q*p*q),r=Yo[this.source],q=null;if(void 0!==r&&16<s){2>r.ap.length&& +(ep(r,4,l,m),ep(r,16,l,m));for(var l=r.ap,m=l.length,q=l[0],t=0;t<m;t++)if(l[t].Rp*l[t].Rp<s)q=l[t];else break}if(!b.ao){if(null===this.Uo)if(null===this.$e)this.Uo=!1;else{l=(new la(null)).zl;l.drawImage(this.$e,0,0);try{l.getImageData(0,0,1,1).data[3]&&(this.Uo=!1),this.Uo=!1}catch(v){this.Uo=!0}}if(this.Uo)return}if(b.ij("pictureRatioOptimization")&&!b.Ty&&void 0!==r&&null!==q&&1!==q.Rp){a.save();r=q.Rp;try{a.drawImage(q.source,e/r,g/r,Math.min(q.source.width,k/r),Math.min(q.source.height,h/r), +Math.max((d.width-n)/2,0),Math.max((d.height-p)/2,0),Math.min(d.width,n),Math.min(d.height,p))}catch(x){u&&this.fo&&z.trace(x.toString()),this.fo=!1}a.restore()}else try{a.drawImage(c,e,g,k,h,Math.max((d.width-n)/2,0),Math.max((d.height-p)/2,0),Math.min(d.width,n),Math.min(d.height,p))}catch(y){u&&this.fo&&z.trace(y.toString()),this.fo=!1}}}}};z.w(xk,{Ga:"naturalBounds"},function(){return this.Wc}); +xk.prototype.Ip=function(a,b,c,d){var e=this.Aa,g=Nm(this,!0),h=this.$e,k=this.Sy;if(k||!this.Zy&&h&&h.complete)this.Zy=!0;null===h&&(isFinite(a)||(a=0),isFinite(b)||(b=0));isFinite(e.width)||g===lf||g===Dm?(isFinite(a)||(a=this.tj.F()?this.tj.width:k?+h.width:h.naturalWidth),c=0):null!==h&&!1!==this.Zy&&(a=this.tj.F()?this.tj.width:k?+h.width:h.naturalWidth);isFinite(e.height)||g===lf||g===Cm?(isFinite(b)||(b=this.tj.F()?this.tj.height:k?+h.height:h.naturalHeight),d=0):null!==h&&!1!==this.Zy&&(b= +this.tj.F()?this.tj.height:k?+h.height:h.naturalHeight);isFinite(e.width)&&(a=e.width);isFinite(e.height)&&(b=e.height);e=this.Xe;g=this.dg;c=Math.max(c,g.width);d=Math.max(d,g.height);a=Math.min(e.width,a);b=Math.min(e.height,b);a=Math.max(c,a);b=Math.max(d,b);null===h||h.complete||(isFinite(a)||(a=0),isFinite(b)||(b=0));yb(this.Wc,a,b);Km(this,0,0,a,b)};xk.prototype.aj=function(a,b,c,d){Om(this,a,b,c,d)};function dp(a){this.ap=[new fp(a,1)]} +function ep(a,b,c,d){var e=new la(null),g=e.zl,h=1/b;e.width=c/b;e.height=d/b;b=new fp(e.Kd,b);c=a.ap[a.ap.length-1];g.setTransform(h*c.Rp,0,0,h*c.Rp,0,0);g.drawImage(c.source,0,0);a.ap.push(b)}function fp(a,b){this.source=a;this.Rp=b}function Ga(){this.q=new hf;this.$b=null}f=Ga.prototype;f.reset=function(){this.q=new hf;this.$b=null}; +function R(a,b,c,d,e,g){null===a.q&&z.k("StreamGeometryContext has been closed");void 0!==e&&!0===e?(null===a.$b&&z.k("Need to call beginFigure first"),d=new Qf(Ef),d.L=b,d.M=c,a.$b.Ab.add(d)):(a.$b=new kf,a.$b.Ha=b,a.$b.Da=c,a.$b.Ot=d,a.q.cc.add(a.$b));void 0!==g&&(a.$b.ro=g)}function T(a){null===a.q&&z.k("StreamGeometryContext has been closed");null===a.$b&&z.k("Need to call beginFigure first");var b=a.$b.Ab.length;0<b&&a.$b.Ab.ea(b-1).close()} +function Bf(a){null===a.q&&z.k("StreamGeometryContext has been closed");null===a.$b&&z.k("Need to call beginFigure first");0<a.$b.Ab.length&&(a.$b.Ot=!0)}f.fb=function(a){null===this.q&&z.k("StreamGeometryContext has been closed");null===this.$b&&z.k("Need to call beginFigure first");this.$b.tk=a};f.moveTo=function(a,b,c){void 0===c&&(c=!1);null===this.q&&z.k("StreamGeometryContext has been closed");null===this.$b&&z.k("Need to call beginFigure first");var d=new Qf(Ef);d.L=a;d.M=b;c&&d.close();this.$b.Ab.add(d)}; +f.lineTo=function(a,b,c){void 0===c&&(c=!1);null===this.q&&z.k("StreamGeometryContext has been closed");null===this.$b&&z.k("Need to call beginFigure first");var d=new Qf(qf);d.L=a;d.M=b;c&&d.close();this.$b.Ab.add(d)};function S(a,b,c,d,e,g,h,k){void 0===k&&(k=!1);null===a.q&&z.k("StreamGeometryContext has been closed");null===a.$b&&z.k("Need to call beginFigure first");var l=new Qf(Ff);l.zc=b;l.Qc=c;l.Ch=d;l.Dh=e;l.L=g;l.M=h;k&&l.close();a.$b.Ab.add(l)} +function zf(a,b,c,d,e){var g;void 0===g&&(g=!1);null===a.q&&z.k("StreamGeometryContext has been closed");null===a.$b&&z.k("Need to call beginFigure first");var h=new Qf(Gf);h.zc=b;h.Qc=c;h.L=d;h.M=e;g&&h.close();a.$b.Ab.add(h)}f.arcTo=function(a,b,c,d,e,g,h){void 0===g&&(g=0);void 0===h&&(h=!1);null===this.q&&z.k("StreamGeometryContext has been closed");null===this.$b&&z.k("Need to call beginFigure first");var k=new Qf(Hf);k.Fe=a;k.Lf=b;k.ra=c;k.za=d;k.radiusX=e;k.radiusY=0!==g?g:e;h&&k.close();this.$b.Ab.add(k)}; +function Af(a,b,c,d,e,g,h,k){var l;void 0===l&&(l=!1);null===a.q&&z.k("StreamGeometryContext has been closed");null===a.$b&&z.k("Need to call beginFigure first");b=new Qf(If,h,k,b,c,d,e,g);l&&b.close();a.$b.Ab.add(b)}function gp(a){a=hp(a);var b=z.rb();b[0]=a[0];for(var c=1,d=1;d<a.length;)b[c]=a[d],b[c+1]=a[d],b[c+2]=a[d+1],d+=2,c+=3;z.xa(a);return b} +function hp(a){var b=ip(a),c=z.rb(),d=Math.floor(b.length/2),e=b.length-1;a=0===a%2?2:1;for(var g=0;g<e;g++){var h=b[g],k=b[g+1],l=b[(d+g-1)%e],m=b[(d+g+a)%e];c[2*g]=h;c[2*g+1]=Oe(h.x,h.y,l.x,l.y,k.x,k.y,m.x,m.y,new N)}c[c.length]=c[0];z.xa(b);return c}function ip(a){for(var b=z.rb(),c=1.5*Math.PI,d=0,e=0;e<a;e++)d=2*Math.PI/a*e+c,b[e]=new N(.5+.5*Math.cos(d),.5+.5*Math.sin(d));b.push(b[0]);return b} +var xo={None:"Rectangle",Rectangle:function(a,b,c){a=new hf;a.type=nf;a.Ha=0;a.Da=0;a.L=b;a.M=c;return a},Square:function(a,b,c){a=new hf;a.Xd=ej;a.type=nf;a.Ha=0;a.Da=0;a.L=Math.min(b,c);a.M=Math.min(b,c);return a},Ellipse:function(a,b,c){a=new hf;a.type=of;a.Ha=0;a.Da=0;a.L=b;a.M=c;a.C=he;a.D=ie;return a},Circle:function(a,b,c){a=new hf;a.Xd=ej;a.type=of;a.Ha=0;a.Da=0;a.L=Math.min(b,c);a.M=Math.min(b,c);a.C=he;a.D=ie;return a},Connector:"Ellipse",TriangleRight:function(a,b,c){a=new hf;var d=new kf, +e=new Qf;e.L=b;e.M=.5*c;d.Ab.add(e);b=new Qf;b.L=0;b.M=c;d.Ab.add(b.close());a.cc.add(d);a.C=new Q(0,.25);a.D=new Q(.5,.75);return a},TriangleDown:function(a,b,c){a=new hf;var d=new kf,e=new Qf;e.L=b;e.M=0;d.Ab.add(e);e=new Qf;e.L=.5*b;e.M=c;d.Ab.add(e.close());a.cc.add(d);a.C=new Q(.25,0);a.D=new Q(.75,.5);return a},TriangleLeft:function(a,b,c){a=new hf;var d=new kf;d.Ha=b;d.Da=c;var e=new Qf;e.L=0;e.M=.5*c;d.Ab.add(e);c=new Qf;c.L=b;c.M=0;d.Ab.add(c.close());a.cc.add(d);a.C=new Q(.5,.25);a.D=new Q(1, +.75);return a},TriangleUp:function(a,b,c){a=new hf;var d=new kf;d.Ha=b;d.Da=c;var e=new Qf;e.L=0;e.M=c;d.Ab.add(e);c=new Qf;c.L=.5*b;c.M=0;d.Ab.add(c.close());a.cc.add(d);a.C=new Q(.25,.5);a.D=new Q(.75,1);return a},Line1:function(a,b,c){a=new hf;a.type=mf;a.Ha=0;a.Da=0;a.L=b;a.M=c;return a},Line2:function(a,b,c){a=new hf;a.type=mf;a.Ha=b;a.Da=0;a.L=0;a.M=c;return a},MinusLine:"LineH",LineH:function(a,b,c){a=new hf;a.type=mf;a.Ha=0;a.Da=c/2;a.L=b;a.M=c/2;return a},LineV:function(a,b,c){a=new hf;a.type= +mf;a.Ha=b/2;a.Da=0;a.L=b/2;a.M=c;return a},BarH:"Rectangle",BarV:"Rectangle",Curve1:function(a,b,c){a=z.v();R(a,0,0,!1);S(a,Hd*b,0,1*b,(1-Hd)*c,b,c);b=a.q;z.u(a);return b},Curve2:function(a,b,c){a=z.v();R(a,0,0,!1);S(a,0,Hd*c,(1-Hd)*b,c,b,c);b=a.q;z.u(a);return b},Curve3:function(a,b,c){a=z.v();R(a,1*b,0,!1);S(a,1*b,Hd*c,Hd*b,1*c,0,1*c);b=a.q;z.u(a);return b},Curve4:function(a,b,c){a=z.v();R(a,1*b,0,!1);S(a,(1-Hd)*b,0,0,(1-Hd)*c,0,1*c);b=a.q;z.u(a);return b},Alternative:"Triangle",Merge:"Triangle", +Triangle:function(a,b,c){a=z.v();R(a,.5*b,0*c,!0);a.lineTo(0*b,1*c);a.lineTo(1*b,1*c,!0);b=a.q;b.C=new Q(.25,.5);b.D=new Q(.75,1);z.u(a);return b},Decision:"Diamond",Diamond:function(a,b,c){a=z.v();R(a,.5*b,0,!0);a.lineTo(0,.5*c);a.lineTo(.5*b,1*c);a.lineTo(1*b,.5*c,!0);b=a.q;b.C=new Q(.25,.25);b.D=new Q(.75,.75);z.u(a);return b},Pentagon:function(a,b,c){var d=ip(5);a=z.v();R(a,d[0].x*b,d[0].y*c,!0);for(var e=1;5>e;e++)a.lineTo(d[e].x*b,d[e].y*c);z.xa(d);T(a);b=a.q;b.C=new Q(.2,.22);b.D=new Q(.8, +.9);z.u(a);return b},DataTransmission:"Hexagon",Hexagon:function(a,b,c){var d=ip(6);a=z.v();R(a,d[0].x*b,d[0].y*c,!0);for(var e=1;6>e;e++)a.lineTo(d[e].x*b,d[e].y*c);z.xa(d);T(a);b=a.q;b.C=new Q(.07,.25);b.D=new Q(.93,.75);z.u(a);return b},Heptagon:function(a,b,c){var d=ip(7);a=z.v();R(a,d[0].x*b,d[0].y*c,!0);for(var e=1;7>e;e++)a.lineTo(d[e].x*b,d[e].y*c);z.xa(d);T(a);b=a.q;b.C=new Q(.2,.15);b.D=new Q(.8,.85);z.u(a);return b},Octagon:function(a,b,c){var d=ip(8);a=z.v();R(a,d[0].x*b,d[0].y*c,!0); +for(var e=1;8>e;e++)a.lineTo(d[e].x*b,d[e].y*c);z.xa(d);T(a);b=a.q;b.C=new Q(.15,.15);b.D=new Q(.85,.85);z.u(a);return b},Nonagon:function(a,b,c){var d=ip(9);a=z.v();R(a,d[0].x*b,d[0].y*c,!0);for(var e=1;9>e;e++)a.lineTo(d[e].x*b,d[e].y*c);z.xa(d);T(a);b=a.q;b.C=new Q(.17,.13);b.D=new Q(.82,.82);z.u(a);return b},Decagon:function(a,b,c){var d=ip(10);a=z.v();R(a,d[0].x*b,d[0].y*c,!0);for(var e=1;10>e;e++)a.lineTo(d[e].x*b,d[e].y*c);z.xa(d);T(a);b=a.q;b.C=new Q(.16,.16);b.D=new Q(.84,.84);z.u(a);return b}, +Dodecagon:function(a,b,c){var d=ip(12);a=z.v();R(a,d[0].x*b,d[0].y*c,!0);for(var e=1;12>e;e++)a.lineTo(d[e].x*b,d[e].y*c);z.xa(d);T(a);b=a.q;b.C=new Q(.16,.16);b.D=new Q(.84,.84);z.u(a);return b},FivePointedStar:function(a,b,c){var d=hp(5);a=z.v();R(a,d[0].x*b,d[0].y*c,!0);for(var e=1;10>e;e++)a.lineTo(d[e].x*b,d[e].y*c);z.xa(d);T(a);b=a.q;b.C=new Q(.312,.383);b.D=new Q(.693,.765);z.u(a);return b},SixPointedStar:function(a,b,c){var d=hp(6);a=z.v();R(a,d[0].x*b,d[0].y*c,!0);for(var e=1;12>e;e++)a.lineTo(d[e].x* +b,d[e].y*c);z.xa(d);T(a);b=a.q;b.C=new Q(.17,.251);b.D=new Q(.833,.755);z.u(a);return b},SevenPointedStar:function(a,b,c){var d=hp(7);a=z.v();R(a,d[0].x*b,d[0].y*c,!0);for(var e=1;14>e;e++)a.lineTo(d[e].x*b,d[e].y*c);z.xa(d);T(a);b=a.q;b.C=new Q(.363,.361);b.D=new Q(.641,.709);z.u(a);return b},EightPointedStar:function(a,b,c){var d=hp(8);a=z.v();R(a,d[0].x*b,d[0].y*c,!0);for(var e=1;16>e;e++)a.lineTo(d[e].x*b,d[e].y*c);z.xa(d);T(a);b=a.q;b.C=new Q(.252,.255);b.D=new Q(.75,.75);z.u(a);return b},NinePointedStar:function(a, +b,c){var d=hp(9);a=z.v();R(a,d[0].x*b,d[0].y*c,!0);for(var e=1;18>e;e++)a.lineTo(d[e].x*b,d[e].y*c);z.xa(d);T(a);b=a.q;b.C=new Q(.355,.361);b.D=new Q(.645,.651);z.u(a);return b},TenPointedStar:function(a,b,c){var d=hp(10);a=z.v();R(a,d[0].x*b,d[0].y*c,!0);for(var e=1;20>e;e++)a.lineTo(d[e].x*b,d[e].y*c);z.xa(d);T(a);b=a.q;b.C=new Q(.281,.261);b.D=new Q(.723,.748);z.u(a);return b},FivePointedBurst:function(a,b,c){var d=gp(5);a=z.v();R(a,d[0].x*b,d[0].y*c,!0);for(var e=1;e<d.length;e+=3)S(a,d[e].x* +b,d[e].y*c,d[e+1].x*b,d[e+1].y*c,d[e+2].x*b,d[e+2].y*c);z.xa(d);T(a);b=a.q;b.C=new Q(.312,.383);b.D=new Q(.693,.765);z.u(a);return b},SixPointedBurst:function(a,b,c){var d=gp(6);a=z.v();R(a,d[0].x*b,d[0].y*c,!0);for(var e=1;e<d.length;e+=3)S(a,d[e].x*b,d[e].y*c,d[e+1].x*b,d[e+1].y*c,d[e+2].x*b,d[e+2].y*c);z.xa(d);T(a);b=a.q;b.C=new Q(.17,.251);b.D=new Q(.833,.755);z.u(a);return b},SevenPointedBurst:function(a,b,c){var d=gp(7);a=z.v();R(a,d[0].x*b,d[0].y*c,!0);for(var e=1;e<d.length;e+=3)S(a,d[e].x* +b,d[e].y*c,d[e+1].x*b,d[e+1].y*c,d[e+2].x*b,d[e+2].y*c);z.xa(d);T(a);b=a.q;b.C=new Q(.363,.361);b.D=new Q(.641,.709);z.u(a);return b},EightPointedBurst:function(a,b,c){var d=gp(8);a=z.v();R(a,d[0].x*b,d[0].y*c,!0);for(var e=1;e<d.length;e+=3)S(a,d[e].x*b,d[e].y*c,d[e+1].x*b,d[e+1].y*c,d[e+2].x*b,d[e+2].y*c);z.xa(d);T(a);b=a.q;b.C=new Q(.252,.255);b.D=new Q(.75,.75);z.u(a);return b},NinePointedBurst:function(a,b,c){var d=gp(9);a=z.v();R(a,d[0].x*b,d[0].y*c,!0);for(var e=1;e<d.length;e+=3)S(a,d[e].x* +b,d[e].y*c,d[e+1].x*b,d[e+1].y*c,d[e+2].x*b,d[e+2].y*c);z.xa(d);T(a);b=a.q;b.C=new Q(.355,.361);b.D=new Q(.645,.651);z.u(a);return b},TenPointedBurst:function(a,b,c){var d=gp(10);a=z.v();R(a,d[0].x*b,d[0].y*c,!0);for(var e=1;e<d.length;e+=3)S(a,d[e].x*b,d[e].y*c,d[e+1].x*b,d[e+1].y*c,d[e+2].x*b,d[e+2].y*c);z.xa(d);T(a);b=a.q;b.C=new Q(.281,.261);b.D=new Q(.723,.748);z.u(a);return b},Cloud:function(a,b,c){a=z.v();R(a,.08034461*b,.1944299*c,!0);S(a,-.09239631*b,.07836421*c,.1406031*b,-.0542823*c,.2008615* +b,.05349299*c);S(a,.2450511*b,-.00697547*c,.3776197*b,-.01112067*c,.4338609*b,.074219*c);S(a,.4539471*b,0,.6066018*b,-.02526587*c,.6558228*b,.07004196*c);S(a,.6914277*b,-.01904177*c,.8921095*b,-.01220843*c,.8921095*b,.08370865*c);S(a,1.036446*b,.04105738*c,1.020377*b,.3022052*c,.9147671*b,.3194596*c);S(a,1.04448*b,.360238*c,.992256*b,.5219009*c,.9082935*b,.562044*c);S(a,1.032337*b,.5771781*c,1.018411*b,.8120651*c,.9212406*b,.8217117*c);S(a,1.028411*b,.9571472*c,.8556702*b,1.052487*c,.7592566*b,.9156953* +c);S(a,.7431877*b,1.009325*c,.5624123*b,1.021761*c,.5101666*b,.9310455*c);S(a,.4820677*b,1.031761*c,.3030112*b,1.002796*c,.2609328*b,.9344623*c);S(a,.2329994*b,1.01518*c,.03213784*b,1.01518*c,.08034461*b,.870098*c);S(a,-.02812061*b,.9032597*c,-.01205169*b,.6835638*c,.06829292*b,.6545475*c);S(a,-.01812061*b,.6089503*c,-.00606892*b,.4555777*c,.06427569*b,.4265613*c);S(a,-.01606892*b,.3892545*c,-.01205169*b,.1944299*c,.08034461*b,.1944299*c);T(a);b=a.q;b.C=new Q(.1,.1);b.D=new Q(.9,.9);z.u(a);return b}, +Gate:"Crescent",Crescent:function(a,b,c){a=z.v();R(a,0,0,!0);S(a,1*b,0,1*b,1*c,0,1*c);S(a,.5*b,.75*c,.5*b,.25*c,0,0);T(a);b=a.q;b.C=new Q(.511,.19);b.D=new Q(.776,.76);z.u(a);return b},FramedRectangle:function(a,b,c){var d=z.v(),e=a?a.Ic:NaN;a=a?a.gu:NaN;isNaN(e)&&(e=.1);isNaN(a)&&(a=.1);R(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c,!0);R(d,e*b,a*c,!1,!0);d.lineTo(e*b,(1-a)*c);d.lineTo((1-e)*b,(1-a)*c);d.lineTo((1-e)*b,a*c,!0);b=d.q;b.C=new Q(e,a);b.D=new Q(1-e,1-a);z.u(d);return b}, +Delay:"HalfEllipse",HalfEllipse:function(a,b,c){a=z.v();R(a,0,0,!0);S(a,Hd*b,0,1*b,(.5-Hd/2)*c,1*b,.5*c);S(a,1*b,(.5+Hd/2)*c,Hd*b,1*c,0,1*c);T(a);b=a.q;b.C=new Q(0,.2);b.D=new Q(.75,.8);z.u(a);return b},Heart:function(a,b,c){a=z.v();R(a,.5*b,1*c,!0);S(a,.1*b,.8*c,0,.5*c,0*b,.3*c);S(a,0*b,0,.45*b,0,.5*b,.3*c);S(a,.55*b,0,1*b,0,1*b,.3*c);S(a,b,.5*c,.9*b,.8*c,.5*b,1*c);T(a);b=a.q;b.C=new Q(.15,.29);b.D=new Q(.86,.68);z.u(a);return b},Spade:function(a,b,c){a=z.v();R(a,.5*b,0,!0);a.lineTo(.51*b,.01*c); +S(a,.6*b,.2*c,b,.25*c,b,.5*c);S(a,b,.8*c,.6*b,.8*c,.55*b,.7*c);S(a,.5*b,.75*c,.55*b,.95*c,.75*b,c);a.lineTo(.25*b,c);S(a,.45*b,.95*c,.5*b,.75*c,.45*b,.7*c);S(a,.4*b,.8*c,0,.8*c,0,.5*c);S(a,0,.25*c,.4*b,.2*c,.49*b,.01*c);T(a);b=a.q;b.C=new Q(.19,.26);b.D=new Q(.8,.68);z.u(a);return b},Club:function(a,b,c){a=z.v();R(a,.4*b,.6*c,!0);S(a,.5*b,.75*c,.45*b,.95*c,.15*b,1*c);a.lineTo(.85*b,c);S(a,.55*b,.95*c,.5*b,.75*c,.6*b,.6*c);var d=.2,e=.3,g=0,h=4*(Math.SQRT2-1)/3*d;S(a,(.5-d+e)*b,(.5+h+g)*c,(.5-h+e)* +b,(.5+d+g)*c,(.5+e)*b,(.5+d+g)*c);S(a,(.5+h+e)*b,(.5+d+g)*c,(.5+d+e)*b,(.5+h+g)*c,(.5+d+e)*b,(.5+g)*c);S(a,(.5+d+e)*b,(.5-h+g)*c,(.5+h+e)*b,(.5-d+g)*c,(.5+e)*b,(.5-d+g)*c);S(a,(.5-h+e)*b,(.5-d+g)*c,(.5-d+e+.05)*b,(.5-h+g-.02)*c,.65*b,.36771243*c);d=.2;e=0;g=-.3;h=4*(Math.SQRT2-1)/3*d;S(a,(.5+h+e)*b,(.5+d+g)*c,(.5+d+e)*b,(.5+h+g)*c,(.5+d+e)*b,(.5+g)*c);S(a,(.5+d+e)*b,(.5-h+g)*c,(.5+h+e)*b,(.5-d+g)*c,(.5+e)*b,(.5-d+g)*c);S(a,(.5-h+e)*b,(.5-d+g)*c,(.5-d+e)*b,(.5-h+g)*c,(.5-d+e)*b,(.5+g)*c);S(a,(.5-d+ +e)*b,(.5+h+g)*c,(.5-h+e)*b,(.5+d+g)*c,.35*b,.36771243*c);d=.2;e=-.3;g=0;h=4*(Math.SQRT2-1)/3*d;S(a,(.5+d+e-.05)*b,(.5-h+g-.02)*c,(.5+h+e)*b,(.5-d+g)*c,(.5+e)*b,(.5-d+g)*c);S(a,(.5-h+e)*b,(.5-d+g)*c,(.5-d+e)*b,(.5-h+g)*c,(.5-d+e)*b,(.5+g)*c);S(a,(.5-d+e)*b,(.5+h+g)*c,(.5-h+e)*b,(.5+d+g)*c,(.5+e)*b,(.5+d+g)*c);S(a,(.5+h+e)*b,(.5+d+g)*c,(.5+d+e)*b,(.5+h+g)*c,.4*b,.6*c);T(a);b=a.q;b.C=new Q(.06,.39);b.D=new Q(.93,.58);z.u(a);return b},Ring:function(a,b,c){a=z.v();var d=4*(Math.SQRT2-1)/3*.5;R(a,b,.5* +c,!0);S(a,b,(.5-d)*c,(.5+d)*b,0,.5*b,0);S(a,(.5-d)*b,0,0,(.5-d)*c,0,.5*c);S(a,0,(.5+d)*c,(.5-d)*b,c,.5*b,c);S(a,(.5+d)*b,c,b,(.5+d)*c,b,.5*c);d=4*(Math.SQRT2-1)/3*.4;R(a,.5*b,.1*c,!0,!0);S(a,(.5+d)*b,.1*c,.9*b,(.5-d)*c,.9*b,.5*c);S(a,.9*b,(.5+d)*c,(.5+d)*b,.9*c,.5*b,.9*c);S(a,(.5-d)*b,.9*c,.1*b,(.5+d)*c,.1*b,.5*c);S(a,.1*b,(.5-d)*c,(.5-d)*b,.1*c,.5*b,.1*c);b=a.q;b.C=new Q(.146,.146);b.D=new Q(.853,.853);b.Xd=ej;z.u(a);return b},YinYang:function(a,b,c){var d=.5;a=z.v();d=.5;R(a,.5*b,0,!0);a.arcTo(270, +180,.5*b,.5*b,.5*b);S(a,1*b,d*c,0,d*c,d*b,0,!0);var d=.1,e=.25;R(a,(.5+d)*b,e*c,!0,!0);a.arcTo(0,-360,.5*b,c*e,d*b);T(a);R(a,.5*b,0,!1);a.arcTo(270,-180,.5*b,.5*b,.5*b);a.fb(!1);e=.75;R(a,(.5+d)*b,e*c,!0);a.arcTo(0,360,.5*b,c*e,d*b);T(a);b=a.q;b.Xd=ej;z.u(a);return b},Peace:function(a,b,c){a=z.v();var d=4*(Math.SQRT2-1)/3*.5;R(a,b,.5*c,!0);S(a,b,(.5-d)*c,(.5+d)*b,0,.5*b,0);S(a,(.5-d)*b,0,0,(.5-d)*c,0,.5*c);S(a,0,(.5+d)*c,(.5-d)*b,c,.5*b,c);S(a,(.5+d)*b,c,b,(.5+d)*c,b,.5*c);d=4*(Math.SQRT2-1)/3*.4; +R(a,.5*b,.1*c,!0,!0);S(a,(.5+d)*b,.1*c,.9*b,(.5-d)*c,.9*b,.5*c);S(a,.9*b,(.5+d)*c,(.5+d)*b,.9*c,.5*b,.9*c);S(a,(.5-d)*b,.9*c,.1*b,(.5+d)*c,.1*b,.5*c);S(a,.1*b,(.5-d)*c,(.5-d)*b,.1*c,.5*b,.1*c);var d=.07,e=0,g=-.707*.11,h=4*(Math.SQRT2-1)/3*d;R(a,(.5+d+e)*b,(.5+g)*c,!0);S(a,(.5+d+e)*b,(.5-h+g)*c,(.5+h+e)*b,(.5-d+g)*c,(.5+e)*b,(.5-d+g)*c);S(a,(.5-h+e)*b,(.5-d+g)*c,(.5-d+e)*b,(.5-h+g)*c,(.5-d+e)*b,(.5+g)*c);S(a,(.5-d+e)*b,(.5+h+g)*c,(.5-h+e)*b,(.5+d+g)*c,(.5+e)*b,(.5+d+g)*c);S(a,(.5+h+e)*b,(.5+d+g)* +c,(.5+d+e)*b,(.5+h+g)*c,(.5+d+e)*b,(.5+g)*c);d=.07;e=-.707*.11;g=.707*.11;h=4*(Math.SQRT2-1)/3*d;R(a,(.5+d+e)*b,(.5+g)*c,!0);S(a,(.5+d+e)*b,(.5-h+g)*c,(.5+h+e)*b,(.5-d+g)*c,(.5+e)*b,(.5-d+g)*c);S(a,(.5-h+e)*b,(.5-d+g)*c,(.5-d+e)*b,(.5-h+g)*c,(.5-d+e)*b,(.5+g)*c);S(a,(.5-d+e)*b,(.5+h+g)*c,(.5-h+e)*b,(.5+d+g)*c,(.5+e)*b,(.5+d+g)*c);S(a,(.5+h+e)*b,(.5+d+g)*c,(.5+d+e)*b,(.5+h+g)*c,(.5+d+e)*b,(.5+g)*c);d=.07;e=.707*.11;g=.707*.11;h=4*(Math.SQRT2-1)/3*d;R(a,(.5+d+e)*b,(.5+g)*c,!0);S(a,(.5+d+e)*b,(.5-h+ +g)*c,(.5+h+e)*b,(.5-d+g)*c,(.5+e)*b,(.5-d+g)*c);S(a,(.5-h+e)*b,(.5-d+g)*c,(.5-d+e)*b,(.5-h+g)*c,(.5-d+e)*b,(.5+g)*c);S(a,(.5-d+e)*b,(.5+h+g)*c,(.5-h+e)*b,(.5+d+g)*c,(.5+e)*b,(.5+d+g)*c);S(a,(.5+h+e)*b,(.5+d+g)*c,(.5+d+e)*b,(.5+h+g)*c,(.5+d+e)*b,(.5+g)*c);b=a.q;b.C=new Q(.146,.146);b.D=new Q(.853,.853);b.Xd=ej;z.u(a);return b},NotAllowed:function(a,b,c){var d=.5*Hd,e=.5;a=z.v();R(a,.5*b,(.5-e)*c,!0);S(a,(.5-d)*b,(.5-e)*c,(.5-e)*b,(.5-d)*c,(.5-e)*b,.5*c);S(a,(.5-e)*b,(.5+d)*c,(.5-d)*b,(.5+e)*c,.5*b, +(.5+e)*c);S(a,(.5+d)*b,(.5+e)*c,(.5+e)*b,(.5+d)*c,(.5+e)*b,.5*c);S(a,(.5+e)*b,(.5-d)*c,(.5+d)*b,(.5-e)*c,.5*b,(.5-e)*c);var e=.4,d=.4*Hd,g=z.O(),h=z.O(),k=z.O(),l=z.O();xe(.5,.5-e,.5+d,.5-e,.5+e,.5-d,.5+e,.5,.42,g,h,k,l,l);var m=z.O(),n=z.O(),p=z.O();xe(.5,.5-e,.5+d,.5-e,.5+e,.5-d,.5+e,.5,.58,l,l,p,m,n);var q=z.O(),r=z.O(),s=z.O();xe(.5,.5+e,.5-d,.5+e,.5-e,.5+d,.5-e,.5,.42,q,r,s,l,l);var t=z.O(),v=z.O(),x=z.O();xe(.5,.5+e,.5-d,.5+e,.5-e,.5+d,.5-e,.5,.58,l,l,x,t,v);R(a,x.x*b,x.y*c,!0,!0);S(a,t.x*b, +t.y*c,v.x*b,v.y*c,(.5-e)*b,.5*c);S(a,(.5-e)*b,(.5-d)*c,(.5-d)*b,(.5-e)*c,.5*b,(.5-e)*c);S(a,g.x*b,g.y*c,h.x*b,h.y*c,k.x*b,k.y*c);a.lineTo(x.x*b,x.y*c);T(a);R(a,s.x*b,s.y*c,!0,!0);a.lineTo(p.x*b,p.y*c);S(a,m.x*b,m.y*c,n.x*b,n.y*c,(.5+e)*b,.5*c);S(a,(.5+e)*b,(.5+d)*c,(.5+d)*b,(.5+e)*c,.5*b,(.5+e)*c);S(a,q.x*b,q.y*c,r.x*b,r.y*c,s.x*b,s.y*c);T(a);z.A(g);z.A(h);z.A(k);z.A(l);z.A(m);z.A(n);z.A(p);z.A(q);z.A(r);z.A(s);z.A(t);z.A(v);z.A(x);b=a.q;z.u(a);b.Xd=ej;return b},Fragile:function(a,b,c){a=z.v();R(a, +0,0,!0);a.lineTo(.25*b,0);a.lineTo(.2*b,.15*c);a.lineTo(.3*b,.25*c);a.lineTo(.29*b,.33*c);a.lineTo(.35*b,.25*c);a.lineTo(.3*b,.15*c);a.lineTo(.4*b,0);a.lineTo(1*b,0);S(a,1*b,.25*c,.75*b,.5*c,.55*b,.5*c);a.lineTo(.55*b,.9*c);a.lineTo(.7*b,.9*c);a.lineTo(.7*b,1*c);a.lineTo(.3*b,1*c);a.lineTo(.3*b,.9*c);a.lineTo(.45*b,.9*c);a.lineTo(.45*b,.5*c);S(a,.25*b,.5*c,0,.25*c,0,0);T(a);b=a.q;b.C=new Q(.25,0);b.D=new Q(.75,.4);z.u(a);return b},HourGlass:function(a,b,c){a=z.v();R(a,.65*b,.5*c,!0);a.lineTo(1*b, +1*c);a.lineTo(0,1*c);a.lineTo(.35*b,.5*c);a.lineTo(0,0);a.lineTo(1*b,0);T(a);b=a.q;z.u(a);return b},Lightning:function(a,b,c){a=z.v();R(a,0*b,.55*c,!0);a.lineTo(.75*b,0);a.lineTo(.25*b,.45*c);a.lineTo(.9*b,.48*c);a.lineTo(.4*b,1*c);a.lineTo(.65*b,.55*c);T(a);b=a.q;z.u(a);return b},Parallelogram1:function(a,b,c){a=a?a.Ic:NaN;isNaN(a)&&(a=.1);var d=z.v();R(d,a*b,0,!0);d.lineTo(1*b,0);d.lineTo((1-a)*b,1*c);d.lineTo(0,1*c);T(d);b=d.q;b.C=new Q(a,0);b.D=new Q(1-a,1);z.u(d);return b},Input:"Output",Output:function(a, +b,c){a=z.v();R(a,0,1*c,!0);a.lineTo(.1*b,0);a.lineTo(1*b,0);a.lineTo(.9*b,1*c);T(a);b=a.q;b.C=new Q(.1,0);b.D=new Q(.9,1);z.u(a);return b},Parallelogram2:function(a,b,c){a=a?a.Ic:NaN;isNaN(a)&&(a=.25);var d=z.v();R(d,a*b,0,!0);d.lineTo(1*b,0);d.lineTo((1-a)*b,1*c);d.lineTo(0,1*c);T(d);b=d.q;b.C=new Q(a,0);b.D=new Q(1-a,1);z.u(d);return b},ThickCross:function(a,b,c){a=a?a.Ic:NaN;isNaN(a)&&(a=.25);var d=z.v();R(d,(.5-a/2)*b,0,!0);d.lineTo((.5+a/2)*b,0);d.lineTo((.5+a/2)*b,(.5-a/2)*c);d.lineTo(1*b,(.5- +a/2)*c);d.lineTo(1*b,(.5+a/2)*c);d.lineTo((.5+a/2)*b,(.5+a/2)*c);d.lineTo((.5+a/2)*b,1*c);d.lineTo((.5-a/2)*b,1*c);d.lineTo((.5-a/2)*b,(.5+a/2)*c);d.lineTo(0,(.5+a/2)*c);d.lineTo(0,(.5-a/2)*c);d.lineTo((.5-a/2)*b,(.5-a/2)*c);T(d);b=d.q;b.C=new Q(.5-a/2,.5-a/2);b.D=new Q(.5+a/2,.5+a/2);z.u(d);return b},ThickX:function(a,b,c){a=.25/Math.SQRT2;var d=z.v();R(d,.3*b,0,!0);d.lineTo(.5*b,.2*c);d.lineTo(.7*b,0);d.lineTo(1*b,.3*c);d.lineTo(.8*b,.5*c);d.lineTo(1*b,.7*c);d.lineTo(.7*b,1*c);d.lineTo(.5*b,.8* +c);d.lineTo(.3*b,1*c);d.lineTo(0,.7*c);d.lineTo(.2*b,.5*c);d.lineTo(0,.3*c);T(d);b=d.q;b.C=new Q(.5-a,.5-a);b.D=new Q(.5+a,.5+a);z.u(d);return b},ThinCross:function(a,b,c){var d=a?a.Ic:NaN;isNaN(d)&&(d=.1);a=z.v();R(a,(.5-d/2)*b,0,!0);a.lineTo((.5+d/2)*b,0);a.lineTo((.5+d/2)*b,(.5-d/2)*c);a.lineTo(1*b,(.5-d/2)*c);a.lineTo(1*b,(.5+d/2)*c);a.lineTo((.5+d/2)*b,(.5+d/2)*c);a.lineTo((.5+d/2)*b,1*c);a.lineTo((.5-d/2)*b,1*c);a.lineTo((.5-d/2)*b,(.5+d/2)*c);a.lineTo(0,(.5+d/2)*c);a.lineTo(0,(.5-d/2)*c);a.lineTo((.5- +d/2)*b,(.5-d/2)*c);T(a);b=a.q;z.u(a);return b},ThinX:function(a,b,c){a=z.v();R(a,.1*b,0,!0);a.lineTo(.5*b,.4*c);a.lineTo(.9*b,0);a.lineTo(1*b,.1*c);a.lineTo(.6*b,.5*c);a.lineTo(1*b,.9*c);a.lineTo(.9*b,1*c);a.lineTo(.5*b,.6*c);a.lineTo(.1*b,1*c);a.lineTo(0,.9*c);a.lineTo(.4*b,.5*c);a.lineTo(0,.1*c);T(a);b=a.q;z.u(a);return b},RightTriangle:function(a,b,c){a=z.v();R(a,0,0,!0);a.lineTo(1*b,1*c);a.lineTo(0,1*c);T(a);b=a.q;b.C=new Q(0,.5);b.D=new Q(.5,1);z.u(a);return b},RoundedIBeam:function(a,b,c){a= +z.v();R(a,0,0,!0);a.lineTo(1*b,0);S(a,.5*b,.25*c,.5*b,.75*c,1*b,1*c);a.lineTo(0,1*c);S(a,.5*b,.75*c,.5*b,.25*c,0,0);T(a);b=a.q;z.u(a);return b},RoundedRectangle:function(a,b,c){var d=a?a.Ic:NaN;isNaN(d)&&(d=5);d=Math.min(d,b/3);d=Math.min(d,c/3);a=d*Hd;var e=z.v();R(e,d,0,!0);e.lineTo(b-d,0);S(e,b-a,0,b,a,b,d);e.lineTo(b,c-d);S(e,b,c-a,b-a,c,b-d,c);e.lineTo(d,c);S(e,a,c,0,c-a,0,c-d);e.lineTo(0,d);S(e,0,a,a,0,d,0);T(e);b=e.q;1<a?(b.C=new Q(0,0,a,a),b.D=new Q(1,1,-a,-a)):(b.C=Zb,b.D=ic);z.u(e);return b}, +Border:function(a,b,c){var d=a?a.Ic:NaN;isNaN(d)&&(d=5);d=Math.min(d,b/3);d=Math.min(d,c/3);a=z.v();R(a,d,0,!0);a.lineTo(b-d,0);S(a,b-0,0,b,0,b,d);a.lineTo(b,c-d);S(a,b,c-0,b-0,c,b-d,c);a.lineTo(d,c);S(a,0,c,0,c-0,0,c-d);a.lineTo(0,d);S(a,0,0,0,0,d,0);T(a);b=a.q;b.C=Zb;b.D=ic;z.u(a);return b},SquareIBeam:function(a,b,c){var d=a?a.Ic:NaN;isNaN(d)&&(d=.2);a=z.v();R(a,0,0,!0);a.lineTo(1*b,0);a.lineTo(1*b,d*c);a.lineTo((.5+d/2)*b,d*c);a.lineTo((.5+d/2)*b,(1-d)*c);a.lineTo(1*b,(1-d)*c);a.lineTo(1*b,1* +c);a.lineTo(0,1*c);a.lineTo(0,(1-d)*c);a.lineTo((.5-d/2)*b,(1-d)*c);a.lineTo((.5-d/2)*b,d*c);a.lineTo(0,d*c);T(a);b=a.q;z.u(a);return b},Trapezoid:function(a,b,c){a=a?a.Ic:NaN;isNaN(a)&&(a=.2);var d=z.v();R(d,a*b,0,!0);d.lineTo((1-a)*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c);T(d);b=d.q;b.C=new Q(a,0);b.D=new Q(1-a,1);z.u(d);return b},ManualLoop:"ManualOperation",ManualOperation:function(a,b,c){var d=a?a.Ic:NaN;isNaN(d)&&(d=0);a=z.v();R(a,d,0,!0);a.lineTo(0,0);a.lineTo(1*b,0);a.lineTo(.9*b,1*c);a.lineTo(.1* +b,1*c);T(a);b=a.q;b.C=new Q(.1,0);b.D=new Q(.9,1);z.u(a);return b},GenderMale:function(a,b,c){a=z.v();var d=.4*Hd,e=.4,g=z.O(),h=z.O(),k=z.O(),l=z.O();R(a,(.5-e)*b,.5*c,!0);S(a,(.5-e)*b,(.5-d)*c,(.5-d)*b,(.5-e)*c,.5*b,(.5-e)*c);xe(.5,.5-e,.5+d,.5-e,.5+e,.5-d,.5+e,.5,.44,k,l,h,g,g);S(a,k.x*b,k.y*c,l.x*b,l.y*c,h.x*b,h.y*c);var m=z.Tb(h.x,h.y);xe(.5,.5-e,.5+d,.5-e,.5+e,.5-d,.5+e,.5,.56,g,g,h,k,l);var n=z.Tb(h.x,h.y);a.lineTo((.1*m.x+.855)*b,.1*m.y*c);a.lineTo(.85*b,.1*m.y*c);a.lineTo(.85*b,0);a.lineTo(1* +b,0);a.lineTo(1*b,.15*c);a.lineTo((.1*n.x+.9)*b,.15*c);a.lineTo((.1*n.x+.9)*b,(.1*n.y+.05*.9)*c);a.lineTo(n.x*b,n.y*c);S(a,k.x*b,k.y*c,l.x*b,l.y*c,(.5+e)*b,.5*c);S(a,(.5+e)*b,(.5+d)*c,(.5+d)*b,(.5+e)*c,.5*b,(.5+e)*c);S(a,(.5-d)*b,(.5+e)*c,(.5-e)*b,(.5+d)*c,(.5-e)*b,.5*c);e=.35;d=.35*Hd;R(a,.5*b,(.5-e)*c,!0,!0);S(a,(.5-d)*b,(.5-e)*c,(.5-e)*b,(.5-d)*c,(.5-e)*b,.5*c);S(a,(.5-e)*b,(.5+d)*c,(.5-d)*b,(.5+e)*c,.5*b,(.5+e)*c);S(a,(.5+d)*b,(.5+e)*c,(.5+e)*b,(.5+d)*c,(.5+e)*b,.5*c);S(a,(.5+e)*b,(.5-d)*c,(.5+ +d)*b,(.5-e)*c,.5*b,(.5-e)*c);R(a,(.5-e)*b,.5*c,!0);z.A(g);z.A(h);z.A(k);z.A(l);z.A(m);z.A(n);b=a.q;b.C=new Q(.202,.257);b.D=new Q(.692,.839);b.Xd=ej;z.u(a);return b},GenderFemale:function(a,b,c){a=z.v();var d=.375,e=0,g=-.125,h=4*(Math.SQRT2-1)/3*d;R(a,(.525+e)*b,(.5+d+g)*c,!0);S(a,(.5+h+e)*b,(.5+d+g)*c,(.5+d+e)*b,(.5+h+g)*c,(.5+d+e)*b,(.5+g)*c);S(a,(.5+d+e)*b,(.5-h+g)*c,(.5+h+e)*b,(.5-d+g)*c,(.5+e)*b,(.5-d+g)*c);S(a,(.5-h+e)*b,(.5-d+g)*c,(.5-d+e)*b,(.5-h+g)*c,(.5-d+e)*b,(.5+g)*c);S(a,(.5-d+e)*b, +(.5+h+g)*c,(.5-h+e)*b,(.5+d+g)*c,(.475+e)*b,(.5+d+g)*c);a.lineTo(.475*b,.85*c);a.lineTo(.425*b,.85*c);a.lineTo(.425*b,.9*c);a.lineTo(.475*b,.9*c);a.lineTo(.475*b,1*c);a.lineTo(.525*b,1*c);a.lineTo(.525*b,.9*c);a.lineTo(.575*b,.9*c);a.lineTo(.575*b,.85*c);a.lineTo(.525*b,.85*c);T(a);d=.325;e=0;g=-.125;h=4*(Math.SQRT2-1)/3*d;R(a,(.5+d+e)*b,(.5+g)*c,!0,!0);S(a,(.5+d+e)*b,(.5+h+g)*c,(.5+h+e)*b,(.5+d+g)*c,(.5+e)*b,(.5+d+g)*c);S(a,(.5-h+e)*b,(.5+d+g)*c,(.5-d+e)*b,(.5+h+g)*c,(.5-d+e)*b,(.5+g)*c);S(a,(.5- +d+e)*b,(.5-h+g)*c,(.5-h+e)*b,(.5-d+g)*c,(.5+e)*b,(.5-d+g)*c);S(a,(.5+h+e)*b,(.5-d+g)*c,(.5+d+e)*b,(.5-h+g)*c,(.5+d+e)*b,(.5+g)*c);R(a,(.525+e)*b,(.5+d+g)*c,!0);b=a.q;b.C=new Q(.232,.136);b.D=new Q(.782,.611);b.Xd=ej;z.u(a);return b},PlusLine:function(a,b,c){a=z.v();R(a,0,.5*c,!1);a.lineTo(1*b,.5*c);a.moveTo(.5*b,0);a.lineTo(.5*b,1*c);b=a.q;z.u(a);return b},XLine:function(a,b,c){a=z.v();R(a,0,1*c,!1);a.lineTo(1*b,0);a.moveTo(0,0);a.lineTo(1*b,1*c);b=a.q;z.u(a);return b},AsteriskLine:function(a,b,c){a= +z.v();var d=.2/Math.SQRT2;R(a,d*b,(1-d)*c,!1);a.lineTo((1-d)*b,d*c);a.moveTo(d*b,d*c);a.lineTo((1-d)*b,(1-d)*c);a.moveTo(0*b,.5*c);a.lineTo(1*b,.5*c);a.moveTo(.5*b,0*c);a.lineTo(.5*b,1*c);b=a.q;z.u(a);return b},CircleLine:function(a,b,c){var d=.5*Hd;a=z.v();R(a,1*b,.5*c,!1);S(a,1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);S(a,(.5-d)*b,1*c,0,(.5+d)*c,0,.5*c);S(a,0,(.5-d)*c,(.5-d)*b,0,.5*b,0);S(a,(.5+d)*b,0,1*b,(.5-d)*c,1*b,.5*c);b=a.q;b.C=new Q(.146,.146);b.D=new Q(.853,.853);b.Xd=ej;z.u(a);return b},Pie:function(a, +b,c){a=z.v();var d=4*(Math.SQRT2-1)/3*.5;R(a,(.5*Math.SQRT2/2+.5)*b,(.5-.5*Math.SQRT2/2)*c,!0);S(a,.7*b,0*c,.5*b,0*c,.5*b,0*c);S(a,(.5-d+0)*b,0*c,0*b,(.5-d+0)*c,0*b,.5*c);S(a,0*b,(.5+d+0)*c,(.5-d+0)*b,1*c,.5*b,1*c);S(a,(.5+d+0)*b,1*c,1*b,(.5+d+0)*c,1*b,.5*c);a.lineTo(.5*b,.5*c);T(a);b=a.q;z.u(a);return b},PiePiece:function(a,b,c){var d=Hd/Math.SQRT2*.5,e=Math.SQRT2/2,g=1-Math.SQRT2/2;a=z.v();R(a,b,c,!0);S(a,b,(1-d)*c,(e+d)*b,(g+d)*c,e*b,g*c);a.lineTo(0,c);T(a);b=a.q;z.u(a);return b},StopSign:function(a, +b,c){a=1/(Math.SQRT2+2);var d=z.v();R(d,a*b,0,!0);d.lineTo((1-a)*b,0);d.lineTo(1*b,a*c);d.lineTo(1*b,(1-a)*c);d.lineTo((1-a)*b,1*c);d.lineTo(a*b,1*c);d.lineTo(0,(1-a)*c);d.lineTo(0,a*c);T(d);b=d.q;b.C=new Q(a/2,a/2);b.D=new Q(1-a/2,1-a/2);z.u(d);return b},LogicImplies:function(a,b,c){var d=a?a.Ic:NaN;isNaN(d)&&(d=.2);a=z.v();R(a,(1-d)*b,0*c,!1);a.lineTo(1*b,.5*c);a.lineTo((1-d)*b,c);a.moveTo(0,.5*c);a.lineTo(b,.5*c);b=a.q;b.C=Zb;b.D=new Q(.8,.5);z.u(a);return b},LogicIff:function(a,b,c){var d=a?a.Ic: +NaN;isNaN(d)&&(d=.2);a=z.v();R(a,(1-d)*b,0*c,!1);a.lineTo(1*b,.5*c);a.lineTo((1-d)*b,c);a.moveTo(0,.5*c);a.lineTo(b,.5*c);a.moveTo(d*b,0);a.lineTo(0,.5*c);a.lineTo(d*b,c);b=a.q;b.C=new Q(.2,0);b.D=new Q(.8,.5);z.u(a);return b},LogicNot:function(a,b,c){a=z.v();R(a,0,0,!1);a.lineTo(1*b,0);a.lineTo(1*b,1*c);b=a.q;z.u(a);return b},LogicAnd:function(a,b,c){a=z.v();R(a,0,1*c,!1);a.lineTo(.5*b,0);a.lineTo(1*b,1*c);b=a.q;b.C=new Q(.25,.5);b.D=new Q(.75,1);z.u(a);return b},LogicOr:function(a,b,c){a=z.v(); +R(a,0,0,!1);a.lineTo(.5*b,1*c);a.lineTo(1*b,0);b=a.q;b.C=new Q(.219,0);b.D=new Q(.78,.409);z.u(a);return b},LogicXor:function(a,b,c){a=z.v();R(a,.5*b,0,!1);a.lineTo(.5*b,1*c);a.moveTo(0,.5*c);a.lineTo(1*b,.5*c);var d=.5*Hd;S(a,1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);S(a,(.5-d)*b,1*c,0,(.5+d)*c,0,.5*c);S(a,0,(.5-d)*c,(.5-d)*b,0,.5*b,0);S(a,(.5+d)*b,0,1*b,(.5-d)*c,1*b,.5*c);b=a.q;b.Xd=ej;z.u(a);return b},LogicTruth:function(a,b,c){a=z.v();R(a,0,0,!1);a.lineTo(1*b,0);a.moveTo(.5*b,0);a.lineTo(.5*b,1*c); +b=a.q;z.u(a);return b},LogicFalsity:function(a,b,c){a=z.v();R(a,0,1*c,!1);a.lineTo(1*b,1*c);a.moveTo(.5*b,1*c);a.lineTo(.5*b,0);b=a.q;z.u(a);return b},LogicThereExists:function(a,b,c){a=z.v();R(a,0,0,!1);a.lineTo(1*b,0);a.lineTo(1*b,.5*c);a.lineTo(0,.5*c);a.moveTo(1*b,.5*c);a.lineTo(1*b,1*c);a.lineTo(0,1*c);b=a.q;z.u(a);return b},LogicForAll:function(a,b,c){a=z.v();R(a,0,0,!1);a.lineTo(.5*b,1*c);a.lineTo(1*b,0);a.moveTo(.25*b,.5*c);a.lineTo(.75*b,.5*c);b=a.q;b.C=new Q(.25,0);b.D=new Q(.75,.5);z.u(a); +return b},LogicIsDefinedAs:function(a,b,c){a=z.v();R(a,0,0,!1);a.lineTo(b,0);a.moveTo(0,.5*c);a.lineTo(b,.5*c);a.moveTo(0,c);a.lineTo(b,c);b=a.q;b.C=new Q(.01,.01);b.D=new Q(.99,.49);z.u(a);return b},LogicIntersect:function(a,b,c){var d=.5*Hd;a=z.v();R(a,0,1*c,!1);a.lineTo(0,.5*c);S(a,0,(.5-d)*c,(.5-d)*b,0,.5*b,0);S(a,(.5+d)*b,0,1*b,(.5-d)*c,1*b,.5*c);a.lineTo(1*b,1*c);b=a.q;b.C=new Q(0,.5);b.D=ic;z.u(a);return b},LogicUnion:function(a,b,c){var d=.5*Hd;a=z.v();R(a,1*b,0,!1);a.lineTo(1*b,.5*c);S(a, +1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);S(a,(.5-d)*b,1*c,0,(.5+d)*c,0,.5*c);a.lineTo(0,0);b=a.q;b.C=Zb;b.D=new Q(1,.5);z.u(a);return b},Arrow:function(a,b,c){var d=a?a.Ic:NaN,e=a?a.gu:NaN;isNaN(d)&&(d=.3);isNaN(e)&&(e=.3);a=z.v();R(a,0,(.5-e/2)*c,!0);a.lineTo((1-d)*b,(.5-e/2)*c);a.lineTo((1-d)*b,0);a.lineTo(1*b,.5*c);a.lineTo((1-d)*b,1*c);a.lineTo((1-d)*b,(.5+e/2)*c);a.lineTo(0,(.5+e/2)*c);T(a);b=a.q;b.C=new Q(0,.5-e/2);d=Oe(0,.5+e/2,1,.5+e/2,1-d,1,1,.5,z.O());b.D=new Q(d.x,d.y);z.A(d);z.u(a);return b}, +ISOProcess:"Chevron",Chevron:function(a,b,c){a=z.v();R(a,0,0,!0);a.lineTo(.5*b,0);a.lineTo(1*b,.5*c);a.lineTo(.5*b,1*c);a.lineTo(0,1*c);a.lineTo(.5*b,.5*c);T(a);b=a.q;z.u(a);return b},DoubleArrow:function(a,b,c){a=z.v();R(a,0,0,!0);a.lineTo(.3*b,.214*c);a.lineTo(.3*b,0);a.lineTo(1*b,.5*c);a.lineTo(.3*b,1*c);a.lineTo(.3*b,.786*c);a.lineTo(0,1*c);T(a);R(a,.3*b,.214*c,!1);a.lineTo(.3*b,.786*c);a.fb(!1);b=a.q;z.u(a);return b},DoubleEndArrow:function(a,b,c){a=z.v();R(a,1*b,.5*c,!0);a.lineTo(.7*b,1*c); +a.lineTo(.7*b,.7*c);a.lineTo(.3*b,.7*c);a.lineTo(.3*b,1*c);a.lineTo(0,.5*c);a.lineTo(.3*b,0);a.lineTo(.3*b,.3*c);a.lineTo(.7*b,.3*c);a.lineTo(.7*b,0);T(a);b=a.q;c=Oe(0,.5,.3,0,0,.3,.3,.3,z.O());b.C=new Q(c.x,c.y);c=Oe(.7,1,1,.5,.7,.7,1,.7,c);b.D=new Q(c.x,c.y);z.A(c);z.u(a);return b},IBeamArrow:function(a,b,c){a=z.v();R(a,1*b,.5*c,!0);a.lineTo(.7*b,1*c);a.lineTo(.7*b,.7*c);a.lineTo(.2*b,.7*c);a.lineTo(.2*b,1*c);a.lineTo(0,1*c);a.lineTo(0,0);a.lineTo(.2*b,0);a.lineTo(.2*b,.3*c);a.lineTo(.7*b,.3*c); +a.lineTo(.7*b,0);T(a);b=a.q;b.C=new Q(0,.3);c=Oe(.7,1,1,.5,.7,.7,1,.7,z.O());b.D=new Q(c.x,c.y);z.A(c);z.u(a);return b},Pointer:function(a,b,c){a=z.v();R(a,1*b,.5*c,!0);a.lineTo(0,1*c);a.lineTo(.2*b,.5*c);a.lineTo(0,0);T(a);b=a.q;b.C=new Q(.2,.35);c=Oe(.2,.65,1,.65,0,1,1,.5,z.O());b.D=new Q(c.x,c.y);z.A(c);z.u(a);return b},RoundedPointer:function(a,b,c){a=z.v();R(a,1*b,.5*c,!0);a.lineTo(0,1*c);S(a,.5*b,.75*c,.5*b,.25*c,0,0);T(a);b=a.q;b.C=new Q(.4,.35);c=Oe(.2,.65,1,.65,0,1,1,.5,z.O());b.D=new Q(c.x, +c.y);z.A(c);z.u(a);return b},SplitEndArrow:function(a,b,c){a=z.v();R(a,1*b,.5*c,!0);a.lineTo(.7*b,1*c);a.lineTo(.7*b,.7*c);a.lineTo(0,.7*c);a.lineTo(.2*b,.5*c);a.lineTo(0,.3*c);a.lineTo(.7*b,.3*c);a.lineTo(.7*b,0);T(a);b=a.q;b.C=new Q(.2,.3);c=Oe(.7,1,1,.5,.7,.7,1,.7,z.O());b.D=new Q(c.x,c.y);z.A(c);z.u(a);return b},MessageToUser:"SquareArrow",SquareArrow:function(a,b,c){a=z.v();R(a,1*b,.5*c,!0);a.lineTo(.7*b,1*c);a.lineTo(0,1*c);a.lineTo(0,0);a.lineTo(.7*b,0);T(a);b=a.q;b.C=Zb;b.D=new Q(.7,1);z.u(a); +return b},Cone1:function(a,b,c){var d=.5*Hd,e=.1*Hd;a=z.v();R(a,0,.9*c,!0);a.lineTo(.5*b,0);a.lineTo(1*b,.9*c);S(a,1*b,(.9+e)*c,(.5+d)*b,1*c,.5*b,1*c);S(a,(.5-d)*b,1*c,0,(.9+e)*c,0,.9*c);T(a);b=a.q;b.C=new Q(.25,.5);b.D=new Q(.75,.97);z.u(a);return b},Cone2:function(a,b,c){a=z.v();R(a,0,.9*c,!0);S(a,(1-.85/.9)*b,1*c,.85/.9*b,1*c,1*b,.9*c);a.lineTo(.5*b,0);a.lineTo(0,.9*c);T(a);R(a,0,.9*c,!1);S(a,(1-.85/.9)*b,.8*c,.85/.9*b,.8*c,1*b,.9*c);a.fb(!1);b=a.q;b.C=new Q(.25,.5);b.D=new Q(.75,.82);z.u(a);return b}, +Cube1:function(a,b,c){a=z.v();R(a,.5*b,1*c,!0);a.lineTo(1*b,.85*c);a.lineTo(1*b,.15*c);a.lineTo(.5*b,0*c);a.lineTo(0*b,.15*c);a.lineTo(0*b,.85*c);T(a);R(a,.5*b,1*c,!1);a.lineTo(.5*b,.3*c);a.lineTo(0,.15*c);a.moveTo(.5*b,.3*c);a.lineTo(1*b,.15*c);a.fb(!1);b=a.q;b.C=new Q(0,.3);b.D=new Q(.5,.85);z.u(a);return b},Cube2:function(a,b,c){a=z.v();R(a,0,.3*c,!0);a.lineTo(0*b,1*c);a.lineTo(.7*b,c);a.lineTo(1*b,.7*c);a.lineTo(1*b,0*c);a.lineTo(.3*b,0*c);T(a);R(a,0,.3*c,!1);a.lineTo(.7*b,.3*c);a.lineTo(1*b, +0*c);a.moveTo(.7*b,.3*c);a.lineTo(.7*b,1*c);a.fb(!1);b=a.q;b.C=new Q(0,.3);b.D=new Q(.7,1);z.u(a);return b},MagneticData:"Cylinder1",Cylinder1:function(a,b,c){var d=.5*Hd,e=.1*Hd;a=z.v();R(a,0,.1*c,!0);S(a,0,(.1-e)*c,(.5-d)*b,0,.5*b,0);S(a,(.5+d)*b,0,1*b,(.1-e)*c,1*b,.1*c);a.lineTo(b,.9*c);S(a,1*b,(.9+e)*c,(.5+d)*b,1*c,.5*b,1*c);S(a,(.5-d)*b,1*c,0,(.9+e)*c,0,.9*c);a.lineTo(0,.1*c);R(a,0,.1*c,!1);S(a,0,(.1+e)*c,(.5-d)*b,.2*c,.5*b,.2*c);S(a,(.5+d)*b,.2*c,1*b,(.1+e)*c,1*b,.1*c);a.fb(!1);b=a.q;b.C=new Q(0, +.2);b.D=new Q(1,.9);z.u(a);return b},Cylinder2:function(a,b,c){var d=.5*Hd,e=.1*Hd;a=z.v();R(a,0,.9*c,!0);a.lineTo(0,.1*c);S(a,0,(.1-e)*c,(.5-d)*b,0,.5*b,0);S(a,(.5+d)*b,0,1*b,(.1-e)*c,1*b,.1*c);a.lineTo(1*b,.9*c);S(a,1*b,(.9+e)*c,(.5+d)*b,1*c,.5*b,1*c);S(a,(.5-d)*b,1*c,0,(.9+e)*c,0,.9*c);R(a,0,.9*c,!1);S(a,0,(.9-e)*c,(.5-d)*b,.8*c,.5*b,.8*c);S(a,(.5+d)*b,.8*c,1*b,(.9-e)*c,1*b,.9*c);a.fb(!1);b=a.q;b.C=new Q(0,.1);b.D=new Q(1,.8);z.u(a);return b},Cylinder3:function(a,b,c){var d=.1*Hd,e=.5*Hd;a=z.v(); +R(a,.1*b,0,!0);a.lineTo(.9*b,0);S(a,(.9+d)*b,0,1*b,(.5-e)*c,1*b,.5*c);S(a,1*b,(.5+e)*c,(.9+d)*b,1*c,.9*b,1*c);a.lineTo(.1*b,1*c);S(a,(.1-d)*b,1*c,0,(.5+e)*c,0,.5*c);S(a,0,(.5-e)*c,(.1-d)*b,0,.1*b,0);R(a,.1*b,0,!1);S(a,(.1+d)*b,0,.2*b,(.5-e)*c,.2*b,.5*c);S(a,.2*b,(.5+e)*c,(.1+d)*b,1*c,.1*b,1*c);a.fb(!1);b=a.q;b.C=new Q(.2,0);b.D=new Q(.9,1);z.u(a);return b},DirectData:"Cylinder4",Cylinder4:function(a,b,c){var d=.1*Hd,e=.5*Hd;a=z.v();R(a,.9*b,0,!0);S(a,(.9+d)*b,0,1*b,(.5-e)*c,1*b,.5*c);S(a,1*b,(.5+ +e)*c,(.9+d)*b,1*c,.9*b,1*c);a.lineTo(.1*b,1*c);S(a,(.1-d)*b,1*c,0,(.5+e)*c,0,.5*c);S(a,0,(.5-e)*c,(.1-d)*b,0,.1*b,0);a.lineTo(.9*b,0);R(a,.9*b,0,!1);S(a,(.9-d)*b,0,.8*b,(.5-e)*c,.8*b,.5*c);S(a,.8*b,(.5+e)*c,(.9-d)*b,1*c,.9*b,1*c);a.fb(!1);b=a.q;b.C=new Q(.1,0);b.D=new Q(.8,1);z.u(a);return b},Prism1:function(a,b,c){a=z.v();R(a,.25*b,.25*c,!0);a.lineTo(.75*b,0);a.lineTo(b,.5*c);a.lineTo(.5*b,c);a.lineTo(0,c);T(a);R(a,.25*b,.25*c,!1);a.lineTo(.5*b,c);a.fb(!1);b=a.q;b.C=new Q(.408,.172);b.D=new Q(.833, +.662);z.u(a);return b},Prism2:function(a,b,c){a=z.v();R(a,0,.25*c,!0);a.lineTo(.75*b,0);a.lineTo(1*b,.25*c);a.lineTo(.75*b,.75*c);a.lineTo(0,1*c);T(a);R(a,0,c,!1);a.lineTo(.25*b,.5*c);a.lineTo(b,.25*c);a.moveTo(0,.25*c);a.lineTo(.25*b,.5*c);a.fb(!1);b=a.q;b.C=new Q(.25,.5);b.D=new Q(.75,.75);z.u(a);return b},Pyramid1:function(a,b,c){a=z.v();R(a,.5*b,0,!0);a.lineTo(b,.75*c);a.lineTo(.5*b,1*c);a.lineTo(0,.75*c);T(a);R(a,.5*b,0,!1);a.lineTo(.5*b,1*c);a.fb(!1);b=a.q;b.C=new Q(.25,.367);b.D=new Q(.75, +.875);z.u(a);return b},Pyramid2:function(a,b,c){a=z.v();R(a,.5*b,0,!0);a.lineTo(b,.85*c);a.lineTo(.5*b,1*c);a.lineTo(0,.85*c);T(a);R(a,.5*b,0,!1);a.lineTo(.5*b,.7*c);a.lineTo(0,.85*c);a.moveTo(.5*b,.7*c);a.lineTo(1*b,.85*c);a.fb(!1);b=a.q;b.C=new Q(.25,.367);b.D=new Q(.75,.875);z.u(a);return b},Actor:function(a,b,c){var d=.2*Hd,e=.1*Hd,g=.5,h=.1;a=z.v();R(a,g*b,(h+.1)*c,!0);S(a,(g-d)*b,(h+.1)*c,(g-.2)*b,(h+e)*c,(g-.2)*b,h*c);S(a,(g-.2)*b,(h-e)*c,(g-d)*b,(h-.1)*c,g*b,(h-.1)*c);S(a,(g+d)*b,(h-.1)*c, +(g+.2)*b,(h-e)*c,(g+.2)*b,h*c);S(a,(g+.2)*b,(h+e)*c,(g+d)*b,(h+.1)*c,g*b,(h+.1)*c);d=.05;e=Hd*d;R(a,.5*b,.2*c,!0);a.lineTo(.95*b,.2*c);g=.95;h=.25;S(a,(g+e)*b,(h-d)*c,(g+d)*b,(h-e)*c,(g+d)*b,h*c);a.lineTo(1*b,.6*c);a.lineTo(.85*b,.6*c);a.lineTo(.85*b,.35*c);d=.025;e=Hd*d;g=.825;h=.35;S(a,(g+d)*b,(h-e)*c,(g+e)*b,(h-d)*c,g*b,(h-d)*c);S(a,(g-e)*b,(h-d)*c,(g-d)*b,(h-e)*c,(g-d)*b,h*c);a.lineTo(.8*b,1*c);a.lineTo(.55*b,1*c);a.lineTo(.55*b,.7*c);d=.05;e=Hd*d;g=.5;h=.7;S(a,(g+d)*b,(h-e)*c,(g+e)*b,(h-d)*c, +g*b,(h-d)*c);S(a,(g-e)*b,(h-d)*c,(g-d)*b,(h-e)*c,(g-d)*b,h*c);a.lineTo(.45*b,1*c);a.lineTo(.2*b,1*c);a.lineTo(.2*b,.35*c);d=.025;e=Hd*d;g=.175;h=.35;S(a,(g+d)*b,(h-e)*c,(g+e)*b,(h-d)*c,g*b,(h-d)*c);S(a,(g-e)*b,(h-d)*c,(g-d)*b,(h-e)*c,(g-d)*b,h*c);a.lineTo(.15*b,.6*c);a.lineTo(0*b,.6*c);a.lineTo(0*b,.25*c);d=.05;e=Hd*d;g=.05;h=.25;S(a,(g-d)*b,(h-e)*c,(g-e)*b,(h-d)*c,g*b,(h-d)*c);a.lineTo(.5*b,.2*c);b=a.q;b.C=new Q(.2,.2);b.D=new Q(.8,.65);z.u(a);return b},Card:function(a,b,c){a=z.v();R(a,1*b,0*c,!0); +a.lineTo(1*b,1*c);a.lineTo(0*b,1*c);a.lineTo(0*b,.2*c);a.lineTo(.2*b,0*c);T(a);b=a.q;b.C=new Q(0,.2);b.D=ic;z.u(a);return b},Collate:function(a,b,c){a=z.v();R(a,.5*b,.5*c,!0);a.lineTo(0,0);a.lineTo(1*b,0);a.lineTo(.5*b,.5*c);R(a,.5*b,.5*c,!0);a.lineTo(1*b,1*c);a.lineTo(0,1*c);a.lineTo(.5*b,.5*c);b=a.q;b.C=new Q(.25,0);b.D=new Q(.75,.25);z.u(a);return b},CreateRequest:function(a,b,c){a=a?a.Ic:NaN;isNaN(a)&&(a=.1);var d=z.v();R(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c);T(d);R(d,0, +a*c,!1);d.lineTo(1*b,a*c);d.moveTo(0,(1-a)*c);d.lineTo(1*b,(1-a)*c);d.fb(!1);b=d.q;b.C=new Q(0,a);b.D=new Q(1,1-a);z.u(d);return b},Database:function(a,b,c){a=z.v();var d=.5*Hd,e=.1*Hd;R(a,1*b,.1*c,!0);a.lineTo(1*b,.9*c);S(a,1*b,(.9+e)*c,(.5+d)*b,1*c,.5*b,1*c);S(a,(.5-d)*b,1*c,0,(.9+e)*c,0,.9*c);a.lineTo(0,.1*c);S(a,0,(.1-e)*c,(.5-d)*b,0,.5*b,0);S(a,(.5+d)*b,0,1*b,(.1-e)*c,1*b,.1*c);R(a,1*b,.1*c,!1);S(a,1*b,(.1+e)*c,(.5+d)*b,.2*c,.5*b,.2*c);S(a,(.5-d)*b,.2*c,0,(.1+e)*c,0,.1*c);a.moveTo(1*b,.2*c); +S(a,1*b,(.2+e)*c,(.5+d)*b,.3*c,.5*b,.3*c);S(a,(.5-d)*b,.3*c,0,(.2+e)*c,0,.2*c);a.moveTo(1*b,.3*c);S(a,1*b,(.3+e)*c,(.5+d)*b,.4*c,.5*b,.4*c);S(a,(.5-d)*b,.4*c,0,(.3+e)*c,0,.3*c);a.fb(!1);b=a.q;b.C=new Q(0,.4);b.D=new Q(1,.9);z.u(a);return b},StoredData:"DataStorage",DataStorage:function(a,b,c){a=z.v();R(a,0,0,!0);a.lineTo(.75*b,0);S(a,1*b,0,1*b,1*c,.75*b,1*c);a.lineTo(0,1*c);S(a,.25*b,.9*c,.25*b,.1*c,0,0);T(a);b=a.q;b.C=new Q(.226,0);b.D=new Q(.81,1);z.u(a);return b},DiskStorage:function(a,b,c){a= +z.v();var d=.5*Hd,e=.1*Hd;R(a,1*b,.1*c,!0);a.lineTo(1*b,.9*c);S(a,1*b,(.9+e)*c,(.5+d)*b,1*c,.5*b,1*c);S(a,(.5-d)*b,1*c,0,(.9+e)*c,0,.9*c);a.lineTo(0,.1*c);S(a,0,(.1-e)*c,(.5-d)*b,0,.5*b,0);S(a,(.5+d)*b,0,1*b,(.1-e)*c,1*b,.1*c);R(a,1*b,.1*c,!1);S(a,1*b,(.1+e)*c,(.5+d)*b,.2*c,.5*b,.2*c);S(a,(.5-d)*b,.2*c,0,(.1+e)*c,0,.1*c);a.moveTo(1*b,.2*c);S(a,1*b,(.2+e)*c,(.5+d)*b,.3*c,.5*b,.3*c);S(a,(.5-d)*b,.3*c,0,(.2+e)*c,0,.2*c);a.fb(!1);b=a.q;b.C=new Q(0,.3);b.D=new Q(1,.9);z.u(a);return b},Display:function(a, +b,c){a=z.v();R(a,.25*b,0,!0);a.lineTo(.75*b,0);S(a,1*b,0,1*b,1*c,.75*b,1*c);a.lineTo(.25*b,1*c);a.lineTo(0,.5*c);T(a);b=a.q;b.C=new Q(.25,0);b.D=new Q(.75,1);z.u(a);return b},DividedEvent:function(a,b,c){a=a?a.Ic:NaN;isNaN(a)?a=.2:.15>a&&(a=.15);var d=z.v(),e=.2*Hd;R(d,0,.2*c,!0);S(d,0,(.2-e)*c,(.2-e)*b,0,.2*b,0);d.lineTo(.8*b,0);S(d,(.8+e)*b,0,1*b,(.2-e)*c,1*b,.2*c);d.lineTo(1*b,.8*c);S(d,1*b,(.8+e)*c,(.8+e)*b,1*c,.8*b,1*c);d.lineTo(.2*b,1*c);S(d,(.2-e)*b,1*c,0,(.8+e)*c,0,.8*c);d.lineTo(0,.2*c); +R(d,0,a*c,!1);d.lineTo(1*b,a*c);d.fb(!1);b=d.q;b.C=new Q(0,a);b.D=new Q(1,1-a);z.u(d);return b},DividedProcess:function(a,b,c){a=a?a.Ic:NaN;if(isNaN(a)||.1>a)a=.1;var d=z.v();R(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c);T(d);R(d,0,a*c,!1);d.lineTo(1*b,a*c);d.fb(!1);b=d.q;b.C=new Q(0,a);b.D=ic;z.u(d);return b},Document:function(a,b,c){c/=.8;a=z.v();R(a,0,.7*c,!0);a.lineTo(0,0);a.lineTo(1*b,0);a.lineTo(1*b,.7*c);S(a,.5*b,.4*c,.5*b,1*c,0,.7*c);T(a);b=a.q;b.C=Zb;b.D=new Q(1,.6);z.u(a); +return b},ExternalOrganization:function(a,b,c){a=a?a.Ic:NaN;if(isNaN(a)||.2>a)a=.2;var d=z.v();R(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c);T(d);R(d,a*b,0,!1);d.lineTo(0,a*c);d.moveTo(1*b,a*c);d.lineTo((1-a)*b,0);d.moveTo(0,(1-a)*c);d.lineTo(a*b,1*c);d.moveTo((1-a)*b,1*c);d.lineTo(1*b,(1-a)*c);d.fb(!1);b=d.q;b.C=new Q(a/2,a/2);b.D=new Q(1-a/2,1-a/2);z.u(d);return b},ExternalProcess:function(a,b,c){a=z.v();R(a,.5*b,0,!0);a.lineTo(1*b,.5*c);a.lineTo(.5*b,1*c);a.lineTo(0,.5*c);T(a); +R(a,.1*b,.4*c,!1);a.lineTo(.1*b,.6*c);a.moveTo(.9*b,.6*c);a.lineTo(.9*b,.4*c);a.moveTo(.6*b,.1*c);a.lineTo(.4*b,.1*c);a.moveTo(.4*b,.9*c);a.lineTo(.6*b,.9*c);a.fb(!1);b=a.q;b.C=new Q(.25,.25);b.D=new Q(.75,.75);z.u(a);return b},File:function(a,b,c){a=z.v();R(a,0,0,!0);a.lineTo(.75*b,0);a.lineTo(1*b,.25*c);a.lineTo(1*b,1*c);a.lineTo(0,1*c);T(a);R(a,.75*b,0,!1);a.lineTo(.75*b,.25*c);a.lineTo(1*b,.25*c);a.fb(!1);b=a.q;b.C=new Q(0,.25);b.D=ic;z.u(a);return b},Interrupt:function(a,b,c){a=z.v();R(a,1*b, +.5*c,!0);a.lineTo(0,1*c);a.lineTo(0,0);a.lineTo(1*b,.5*c);R(a,1*b,.5*c,!1);a.lineTo(1*b,1*c);R(a,1*b,.5*c,!1);a.lineTo(1*b,0);b=a.q;b.C=new Q(0,.25);b.D=new Q(.5,.75);z.u(a);return b},InternalStorage:function(a,b,c){var d=a?a.Ic:NaN;a=a?a.gu:NaN;isNaN(d)&&(d=.1);isNaN(a)&&(a=.1);var e=z.v();R(e,0,0,!0);e.lineTo(1*b,0);e.lineTo(1*b,1*c);e.lineTo(0,1*c);T(e);R(e,d*b,0,!1);e.lineTo(d*b,1*c);e.moveTo(0,a*c);e.lineTo(1*b,a*c);e.fb(!1);b=e.q;b.C=new Q(d,a);b.D=ic;z.u(e);return b},Junction:function(a,b, +c){a=z.v();var d=1/Math.SQRT2,e=(1-1/Math.SQRT2)/2,g=.5*Hd;R(a,1*b,.5*c,!0);S(a,1*b,(.5+g)*c,(.5+g)*b,1*c,.5*b,1*c);S(a,(.5-g)*b,1*c,0,(.5+g)*c,0,.5*c);S(a,0,(.5-g)*c,(.5-g)*b,0,.5*b,0);S(a,(.5+g)*b,0,1*b,(.5-g)*c,1*b,.5*c);R(a,(e+d)*b,(e+d)*c,!1);a.lineTo(e*b,e*c);a.moveTo(e*b,(e+d)*c);a.lineTo((e+d)*b,e*c);a.fb(!1);b=a.q;b.Xd=ej;z.u(a);return b},LinedDocument:function(a,b,c){c/=.8;a=z.v();R(a,0,.7*c,!0);a.lineTo(0,0);a.lineTo(1*b,0);a.lineTo(1*b,.7*c);S(a,.5*b,.4*c,.5*b,1*c,0,.7*c);T(a);R(a,.1* +b,0,!1);a.lineTo(.1*b,.75*c);a.fb(!1);b=a.q;b.C=new Q(.1,0);b.D=new Q(1,.6);z.u(a);return b},LoopLimit:function(a,b,c){a=z.v();R(a,0,1*c,!0);a.lineTo(0,.25*c);a.lineTo(.25*b,0);a.lineTo(.75*b,0);a.lineTo(1*b,.25*c);a.lineTo(1*b,1*c);T(a);b=a.q;b.C=new Q(0,.25);b.D=ic;z.u(a);return b},SequentialData:"MagneticTape",MagneticTape:function(a,b,c){a=z.v();var d=.5*Hd;R(a,.5*b,1*c,!0);S(a,(.5-d)*b,1*c,0,(.5+d)*c,0,.5*c);S(a,0,(.5-d)*c,(.5-d)*b,0,.5*b,0);S(a,(.5+d)*b,0,1*b,(.5-d)*c,1*b,.5*c);S(a,1*b,(.5+ +d)*c,(.5+d)*b,.9*c,.6*b,.9*c);a.lineTo(1*b,.9*c);a.lineTo(1*b,1*c);a.lineTo(.5*b,1*c);b=a.q;b.C=new Q(.15,.15);b.D=new Q(.85,.8);z.u(a);return b},ManualInput:function(a,b,c){a=z.v();R(a,1*b,0,!0);a.lineTo(1*b,1*c);a.lineTo(0,1*c);a.lineTo(0,.25*c);T(a);b=a.q;b.C=new Q(0,.25);b.D=ic;z.u(a);return b},MessageFromUser:function(a,b,c){a=a?a.Ic:NaN;isNaN(a)&&(a=.7);var d=z.v();R(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(a*b,.5*c);d.lineTo(1*b,1*c);d.lineTo(0,1*c);T(d);b=d.q;b.C=Zb;b.D=new Q(a,1);z.u(d);return b}, +MicroformProcessing:function(a,b,c){a=a?a.Ic:NaN;isNaN(a)&&(a=.25);var d=z.v();R(d,0,0,!0);d.lineTo(.5*b,a*c);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(.5*b,(1-a)*c);d.lineTo(0,1*c);T(d);b=d.q;b.C=new Q(0,a);b.D=new Q(1,1-a);z.u(d);return b},MicroformRecording:function(a,b,c){a=z.v();R(a,0,0,!0);a.lineTo(.75*b,.25*c);a.lineTo(1*b,.15*c);a.lineTo(1*b,.85*c);a.lineTo(.75*b,.75*c);a.lineTo(0,1*c);T(a);b=a.q;b.C=new Q(0,.25);b.D=new Q(1,.75);z.u(a);return b},MultiDocument:function(a,b,c){c/=.8;a=z.v(); +R(a,b,0,!0);a.lineTo(b,.5*c);S(a,.96*b,.47*c,.93*b,.45*c,.9*b,.44*c);a.lineTo(.9*b,.6*c);S(a,.86*b,.57*c,.83*b,.55*c,.8*b,.54*c);a.lineTo(.8*b,.7*c);S(a,.4*b,.4*c,.4*b,1*c,0,.7*c);a.lineTo(0,.2*c);a.lineTo(.1*b,.2*c);a.lineTo(.1*b,.1*c);a.lineTo(.2*b,.1*c);a.lineTo(.2*b,0);T(a);R(a,.1*b,.2*c,!1);a.lineTo(.8*b,.2*c);a.lineTo(.8*b,.54*c);a.moveTo(.2*b,.1*c);a.lineTo(.9*b,.1*c);a.lineTo(.9*b,.44*c);a.fb(!1);b=a.q;b.C=new Q(0,.25);b.D=new Q(.8,.77);z.u(a);return b},MultiProcess:function(a,b,c){a=z.v(); +R(a,.1*b,.1*c,!0);a.lineTo(.2*b,.1*c);a.lineTo(.2*b,0);a.lineTo(1*b,0);a.lineTo(1*b,.8*c);a.lineTo(.9*b,.8*c);a.lineTo(.9*b,.9*c);a.lineTo(.8*b,.9*c);a.lineTo(.8*b,1*c);a.lineTo(0,1*c);a.lineTo(0,.2*c);a.lineTo(.1*b,.2*c);T(a);R(a,.2*b,.1*c,!1);a.lineTo(.9*b,.1*c);a.lineTo(.9*b,.8*c);a.moveTo(.1*b,.2*c);a.lineTo(.8*b,.2*c);a.lineTo(.8*b,.9*c);a.fb(!1);b=a.q;b.C=new Q(0,.2);b.D=new Q(.8,1);z.u(a);return b},OfflineStorage:function(a,b,c){a=a?a.Ic:NaN;isNaN(a)&&(a=.1);var d=1-a,e=z.v();R(e,0,0,!0);e.lineTo(1* +b,0);e.lineTo(.5*b,1*c);T(e);R(e,.5*a*b,a*c,!1);e.lineTo((1-.5*a)*b,a*c);e.fb(!1);b=e.q;b.C=new Q(d/4+.5*a,a);b.D=new Q(3*d/4+.5*a,a+.5*d);z.u(e);return b},OffPageConnector:function(a,b,c){a=z.v();R(a,0,0,!0);a.lineTo(.75*b,0);a.lineTo(1*b,.5*c);a.lineTo(.75*b,1*c);a.lineTo(0,1*c);T(a);b=a.q;b.C=Zb;b.D=new Q(.75,1);z.u(a);return b},Or:function(a,b,c){a=z.v();var d=.5*Hd;R(a,1*b,.5*c,!0);S(a,1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);S(a,(.5-d)*b,1*c,0,(.5+d)*c,0,.5*c);S(a,0,(.5-d)*c,(.5-d)*b,0,.5*b,0);S(a, +(.5+d)*b,0,1*b,(.5-d)*c,1*b,.5*c);R(a,1*b,.5*c,!1);a.lineTo(0,.5*c);a.moveTo(.5*b,1*c);a.lineTo(.5*b,0);a.fb(!1);b=a.q;b.Xd=ej;z.u(a);return b},PaperTape:function(a,b,c){c/=.8;a=z.v();R(a,0,.7*c,!0);a.lineTo(0,.3*c);S(a,.5*b,.6*c,.5*b,0,1*b,.3*c);a.lineTo(1*b,.7*c);S(a,.5*b,.4*c,.5*b,1*c,0,.7*c);T(a);b=a.q;b.C=new Q(0,.49);b.D=new Q(1,.75);z.u(a);return b},PrimitiveFromCall:function(a,b,c){var d=a?a.Ic:NaN;a=a?a.gu:NaN;isNaN(d)&&(d=.1);isNaN(a)&&(a=.3);var e=z.v();R(e,0,0,!0);e.lineTo(1*b,0);e.lineTo((1- +a)*b,.5*c);e.lineTo(1*b,1*c);e.lineTo(0,1*c);T(e);b=e.q;b.C=new Q(d,0);b.D=new Q(1-a,1);z.u(e);return b},PrimitiveToCall:function(a,b,c){var d=a?a.Ic:NaN;a=a?a.gu:NaN;isNaN(d)&&(d=.1);isNaN(a)&&(a=.3);var e=z.v();R(e,0,0,!0);e.lineTo((1-a)*b,0);e.lineTo(1*b,.5*c);e.lineTo((1-a)*b,1*c);e.lineTo(0,1*c);T(e);b=e.q;b.C=new Q(d,0);b.D=new Q(1-a,1);z.u(e);return b},Subroutine:"Procedure",Procedure:function(a,b,c){a=a?a.Ic:NaN;isNaN(a)&&(a=.1);var d=z.v();R(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0, +1*c);T(d);R(d,(1-a)*b,0,!1);d.lineTo((1-a)*b,1*c);d.moveTo(a*b,0);d.lineTo(a*b,1*c);d.fb(!1);b=d.q;b.C=new Q(a,0);b.D=new Q(1-a,1);z.u(d);return b},Process:function(a,b,c){a=a?a.Ic:NaN;isNaN(a)&&(a=.1);var d=z.v();R(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c);T(d);R(d,a*b,0,!1);d.lineTo(a*b,1*c);d.fb(!1);b=d.q;b.C=new Q(a,0);b.D=ic;z.u(d);return b},Sort:function(a,b,c){a=z.v();R(a,.5*b,0,!0);a.lineTo(1*b,.5*c);a.lineTo(.5*b,1*c);a.lineTo(0,.5*c);T(a);R(a,0,.5*c,!1);a.lineTo(1*b,.5* +c);a.fb(!1);b=a.q;b.C=new Q(.25,.25);b.D=new Q(.75,.5);z.u(a);return b},Start:function(a,b,c){a=z.v();R(a,.25*b,0,!0);R(a,.25*b,0,!0);a.arcTo(270,180,.75*b,.5*c,.25*b,.5*c);a.arcTo(90,180,.25*b,.5*c,.25*b,.5*c);R(a,.25*b,0,!1);a.lineTo(.25*b,1*c);a.moveTo(.75*b,0);a.lineTo(.75*b,1*c);a.fb(!1);b=a.q;b.C=new Q(.25,0);b.D=new Q(.75,1);z.u(a);return b},Terminator:function(a,b,c){a=z.v();R(a,.25*b,0,!0);a.arcTo(270,180,.75*b,.5*c,.25*b,.5*c);a.arcTo(90,180,.25*b,.5*c,.25*b,.5*c);b=a.q;b.C=new Q(.23,0); +b.D=new Q(.77,1);z.u(a);return b},TransmittalTape:function(a,b,c){a=a?a.Ic:NaN;isNaN(a)&&(a=.1);var d=z.v();R(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(.75*b,(1-a)*c);d.lineTo(0,(1-a)*c);T(d);b=d.q;b.C=Zb;b.D=new Q(1,1-a);z.u(d);return b},AndGate:function(a,b,c){a=z.v();var d=.5*Hd;R(a,0,0,!0);a.lineTo(.5*b,0);S(a,(.5+d)*b,0,1*b,(.5-d)*c,1*b,.5*c);S(a,1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);a.lineTo(0,1*c);T(a);b=a.q;b.C=Zb;b.D=new Q(.55,1);z.u(a);return b},Buffer:function(a,b,c){a=z.v();R(a, +0,0,!0);a.lineTo(1*b,.5*c);a.lineTo(0,1*c);T(a);b=a.q;b.C=new Q(0,.25);b.D=new Q(.5,.75);z.u(a);return b},Clock:function(a,b,c){a=z.v();var d=.5*Hd;R(a,1*b,.5*c,!0);S(a,1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);S(a,(.5-d)*b,1*c,0,(.5+d)*c,0,.5*c);S(a,0,(.5-d)*c,(.5-d)*b,0,.5*b,0);S(a,(.5+d)*b,0,1*b,(.5-d)*c,1*b,.5*c);R(a,1*b,.5*c,!1);a.lineTo(1*b,.5*c);R(a,.8*b,.75*c,!1);a.lineTo(.8*b,.25*c);a.lineTo(.6*b,.25*c);a.lineTo(.6*b,.75*c);a.lineTo(.4*b,.75*c);a.lineTo(.4*b,.25*c);a.lineTo(.2*b,.25*c);a.lineTo(.2* +b,.75*c);a.fb(!1);b=a.q;b.Xd=ej;z.u(a);return b},Ground:function(a,b,c){a=z.v();R(a,.5*b,0,!1);a.lineTo(.5*b,.4*c);a.moveTo(.2*b,.6*c);a.lineTo(.8*b,.6*c);a.moveTo(.3*b,.8*c);a.lineTo(.7*b,.8*c);a.moveTo(.4*b,1*c);a.lineTo(.6*b,1*c);b=a.q;z.u(a);return b},Inverter:function(a,b,c){a=z.v();var d=.1*Hd;R(a,.8*b,.5*c,!0);a.lineTo(0,1*c);a.lineTo(0,0);a.lineTo(.8*b,.5*c);R(a,1*b,.5*c,!0);S(a,1*b,(.5+d)*c,(.9+d)*b,.6*c,.9*b,.6*c);S(a,(.9-d)*b,.6*c,.8*b,(.5+d)*c,.8*b,.5*c);S(a,.8*b,(.5-d)*c,(.9-d)*b,.4* +c,.9*b,.4*c);S(a,(.9+d)*b,.4*c,1*b,(.5-d)*c,1*b,.5*c);b=a.q;b.C=new Q(0,.25);b.D=new Q(.4,.75);z.u(a);return b},NandGate:function(a,b,c){a=z.v();var d=.5*Hd,e=.4*Hd,g=.1*Hd;R(a,.8*b,.5*c,!0);S(a,.8*b,(.5+e)*c,(.4+d)*b,1*c,.4*b,1*c);a.lineTo(0,1*c);a.lineTo(0,0);a.lineTo(.4*b,0);S(a,(.4+d)*b,0,.8*b,(.5-e)*c,.8*b,.5*c);R(a,1*b,.5*c,!0);S(a,1*b,(.5+g)*c,(.9+g)*b,.6*c,.9*b,.6*c);S(a,(.9-g)*b,.6*c,.8*b,(.5+g)*c,.8*b,.5*c);S(a,.8*b,(.5-g)*c,(.9-g)*b,.4*c,.9*b,.4*c);S(a,(.9+g)*b,.4*c,1*b,(.5-g)*c,1*b,.5* +c);b=a.q;b.C=new Q(0,.05);b.D=new Q(.55,.95);z.u(a);return b},NorGate:function(a,b,c){a=z.v();var d=.5,e=Hd*d,g=0,h=.5;R(a,.8*b,.5*c,!0);S(a,.7*b,(h+e)*c,(g+e)*b,(h+d)*c,0,1*c);S(a,.25*b,.75*c,.25*b,.25*c,0,0);S(a,(g+e)*b,(h-d)*c,.7*b,(h-e)*c,.8*b,.5*c);d=.1;e=.1*Hd;g=.9;h=.5;R(a,(g-d)*b,h*c,!0);S(a,(g-d)*b,(h-e)*c,(g-e)*b,(h-d)*c,g*b,(h-d)*c);S(a,(g+e)*b,(h-d)*c,(g+d)*b,(h-e)*c,(g+d)*b,h*c);S(a,(g+d)*b,(h+e)*c,(g+e)*b,(h+d)*c,g*b,(h+d)*c);S(a,(g-e)*b,(h+d)*c,(g-d)*b,(h+e)*c,(g-d)*b,h*c);b=a.q;b.C= +new Q(.2,.25);b.D=new Q(.6,.75);z.u(a);return b},OrGate:function(a,b,c){a=z.v();var d=.5*Hd;R(a,0,0,!0);S(a,(0+d+d)*b,0*c,.8*b,(.5-d)*c,1*b,.5*c);S(a,.8*b,(.5+d)*c,(0+d+d)*b,1*c,0,1*c);S(a,.25*b,.75*c,.25*b,.25*c,0,0);T(a);b=a.q;b.C=new Q(.2,.25);b.D=new Q(.75,.75);z.u(a);return b},XnorGate:function(a,b,c){a=z.v();var d=.5,e=Hd*d,g=.2,h=.5;R(a,.1*b,0,!1);S(a,.35*b,.25*c,.35*b,.75*c,.1*b,1*c);R(a,.8*b,.5*c,!0);S(a,.7*b,(h+e)*c,(g+e)*b,(h+d)*c,.2*b,1*c);S(a,.45*b,.75*c,.45*b,.25*c,.2*b,0);S(a,(g+e)* +b,(h-d)*c,.7*b,(h-e)*c,.8*b,.5*c);d=.1;e=.1*Hd;g=.9;h=.5;R(a,(g-d)*b,h*c,!0);S(a,(g-d)*b,(h-e)*c,(g-e)*b,(h-d)*c,g*b,(h-d)*c);S(a,(g+e)*b,(h-d)*c,(g+d)*b,(h-e)*c,(g+d)*b,h*c);S(a,(g+d)*b,(h+e)*c,(g+e)*b,(h+d)*c,g*b,(h+d)*c);S(a,(g-e)*b,(h+d)*c,(g-d)*b,(h+e)*c,(g-d)*b,h*c);b=a.q;b.C=new Q(.4,.25);b.D=new Q(.65,.75);z.u(a);return b},XorGate:function(a,b,c){a=z.v();var d=.5*Hd;R(a,.1*b,0,!1);S(a,.35*b,.25*c,.35*b,.75*c,.1*b,1*c);R(a,.2*b,0,!0);S(a,(.2+d)*b,0*c,.9*b,(.5-d)*c,1*b,.5*c);S(a,.9*b,(.5+d)* +c,(.2+d)*b,1*c,.2*b,1*c);S(a,.45*b,.75*c,.45*b,.25*c,.2*b,0);T(a);b=a.q;b.C=new Q(.4,.25);b.D=new Q(.8,.75);z.u(a);return b},Capacitor:function(a,b,c){a=z.v();R(a,0,0,!1);a.lineTo(0,1*c);a.moveTo(1*b,0);a.lineTo(1*b,1*c);b=a.q;z.u(a);return b},Resistor:function(a,b,c){a=z.v();R(a,0,.5*c,!1);a.lineTo(.1*b,0);a.lineTo(.2*b,1*c);a.lineTo(.3*b,0);a.lineTo(.4*b,1*c);a.lineTo(.5*b,0);a.lineTo(.6*b,1*c);a.lineTo(.7*b,.5*c);b=a.q;z.u(a);return b},Inductor:function(a,b,c){a=z.v();var d=.1*Hd,e=.1;R(a,(e-.5* +d)*b,c,!1);S(a,(e-d)*b,c,(e-.1)*b,0,(e+.1)*b,0);e=.3;S(a,(e+.1)*b,0,(e+d)*b,c,e*b,c);S(a,(e-d)*b,c,(e-.1)*b,0,(e+.1)*b,0);e=.5;S(a,(e+.1)*b,0,(e+d)*b,c,e*b,c);S(a,(e-d)*b,c,(e-.1)*b,0,(e+.1)*b,0);e=.7;S(a,(e+.1)*b,0,(e+d)*b,c,e*b,c);S(a,(e-d)*b,c,(e-.1)*b,0,(e+.1)*b,0);e=.9;S(a,(e+.1)*b,0,(e+d)*b,c,(e+.5*d)*b,c);b=a.q;z.u(a);return b},ACvoltageSource:function(a,b,c){a=z.v();var d=.5*Hd;R(a,0*b,.5*c,!1);S(a,0*b,(.5-d)*c,(.5-d)*b,0*c,.5*b,0*c);S(a,(.5+d)*b,0*c,1*b,(.5-d)*c,1*b,.5*c);S(a,1*b,(.5+d)* +c,(.5+d)*b,1*c,.5*b,1*c);S(a,(.5-d)*b,1*c,0*b,(.5+d)*c,0*b,.5*c);a.moveTo(.1*b,.5*c);S(a,.5*b,0*c,.5*b,1*c,.9*b,.5*c);b=a.q;b.Xd=ej;z.u(a);return b},DCvoltageSource:function(a,b,c){a=z.v();R(a,0,.75*c,!1);a.lineTo(0,.25*c);a.moveTo(1*b,0);a.lineTo(1*b,1*c);b=a.q;z.u(a);return b},Diode:function(a,b,c){a=z.v();R(a,1*b,0,!1);a.lineTo(1*b,.5*c);a.lineTo(0,1*c);a.lineTo(0,0);a.lineTo(1*b,.5*c);a.lineTo(1*b,1*c);b=a.q;b.C=new Q(0,.25);b.D=new Q(.5,.75);z.u(a);return b},Wifi:function(a,b,c){var d=b,e=c; +b*=.38;c*=.6;a=z.v();var g=.8*Hd,h=.8,k=0,l=.5,d=(d-b)/2,e=(e-c)/2;R(a,k*b+d,(l+h)*c+e,!0);S(a,(k-g)*b+d,(l+h)*c+e,(k-h)*b+d,(l+g)*c+e,(k-h)*b+d,l*c+e);S(a,(k-h)*b+d,(l-g)*c+e,(k-g)*b+d,(l-h)*c+e,k*b+d,(l-h)*c+e);S(a,k*b+d,(l-h)*c+e,(k-h+.5*g)*b+d,(l-g)*c+e,(k-h+.5*g)*b+d,l*c+e);S(a,(k-h+.5*g)*b+d,(l+g)*c+e,k*b+d,(l+h)*c+e,k*b+d,(l+h)*c+e);T(a);g=.4*Hd;h=.4;k=.2;l=.5;R(a,k*b+d,(l+h)*c+e,!0);S(a,(k-g)*b+d,(l+h)*c+e,(k-h)*b+d,(l+g)*c+e,(k-h)*b+d,l*c+e);S(a,(k-h)*b+d,(l-g)*c+e,(k-g)*b+d,(l-h)*c+e,k* +b+d,(l-h)*c+e);S(a,k*b+d,(l-h)*c+e,(k-h+.5*g)*b+d,(l-g)*c+e,(k-h+.5*g)*b+d,l*c+e);S(a,(k-h+.5*g)*b+d,(l+g)*c+e,k*b+d,(l+h)*c+e,k*b+d,(l+h)*c+e);T(a);g=.2*Hd;h=.2;l=k=.5;R(a,(k-h)*b+d,l*c+e,!0);S(a,(k-h)*b+d,(l-g)*c+e,(k-g)*b+d,(l-h)*c+e,k*b+d,(l-h)*c+e);S(a,(k+g)*b+d,(l-h)*c+e,(k+h)*b+d,(l-g)*c+e,(k+h)*b+d,l*c+e);S(a,(k+h)*b+d,(l+g)*c+e,(k+g)*b+d,(l+h)*c+e,k*b+d,(l+h)*c+e);S(a,(k-g)*b+d,(l+h)*c+e,(k-h)*b+d,(l+g)*c+e,(k-h)*b+d,l*c+e);g=.4*Hd;h=.4;k=.8;l=.5;R(a,k*b+d,(l-h)*c+e,!0);S(a,(k+g)*b+d,(l- +h)*c+e,(k+h)*b+d,(l-g)*c+e,(k+h)*b+d,l*c+e);S(a,(k+h)*b+d,(l+g)*c+e,(k+g)*b+d,(l+h)*c+e,k*b+d,(l+h)*c+e);S(a,k*b+d,(l+h)*c+e,(k+h-.5*g)*b+d,(l+g)*c+e,(k+h-.5*g)*b+d,l*c+e);S(a,(k+h-.5*g)*b+d,(l-g)*c+e,k*b+d,(l-h)*c+e,k*b+d,(l-h)*c+e);T(a);g=.8*Hd;h=.8;k=1;l=.5;R(a,k*b+d,(l-h)*c+e,!0);S(a,(k+g)*b+d,(l-h)*c+e,(k+h)*b+d,(l-g)*c+e,(k+h)*b+d,l*c+e);S(a,(k+h)*b+d,(l+g)*c+e,(k+g)*b+d,(l+h)*c+e,k*b+d,(l+h)*c+e);S(a,k*b+d,(l+h)*c+e,(k+h-.5*g)*b+d,(l+g)*c+e,(k+h-.5*g)*b+d,l*c+e);S(a,(k+h-.5*g)*b+d,(l-g)*c+ +e,k*b+d,(l-h)*c+e,k*b+d,(l-h)*c+e);T(a);b=a.q;z.u(a);return b},Email:function(a,b,c){a=z.v();R(a,0,0,!0);a.lineTo(1*b,0);a.lineTo(1*b,1*c);a.lineTo(0,1*c);a.lineTo(0,0);T(a);R(a,0,0,!1);a.lineTo(.5*b,.6*c);a.lineTo(1*b,0);a.moveTo(0,1*c);a.lineTo(.45*b,.54*c);a.moveTo(1*b,1*c);a.lineTo(.55*b,.54*c);a.fb(!1);b=a.q;z.u(a);return b},Ethernet:function(a,b,c){a=z.v();R(a,.35*b,0,!0);a.lineTo(.65*b,0);a.lineTo(.65*b,.4*c);a.lineTo(.35*b,.4*c);a.lineTo(.35*b,0);T(a);R(a,.1*b,1*c,!0,!0);a.lineTo(.4*b,1*c); +a.lineTo(.4*b,.6*c);a.lineTo(.1*b,.6*c);a.lineTo(.1*b,1*c);T(a);R(a,.6*b,1*c,!0,!0);a.lineTo(.9*b,1*c);a.lineTo(.9*b,.6*c);a.lineTo(.6*b,.6*c);a.lineTo(.6*b,1*c);T(a);R(a,0,.5*c,!1);a.lineTo(1*b,.5*c);a.moveTo(.5*b,.5*c);a.lineTo(.5*b,.4*c);a.moveTo(.75*b,.5*c);a.lineTo(.75*b,.6*c);a.moveTo(.25*b,.5*c);a.lineTo(.25*b,.6*c);a.fb(!1);b=a.q;z.u(a);return b},Power:function(a,b,c){a=z.v();var d=.4*Hd,e=.4,g=z.O(),h=z.O(),k=z.O(),l=z.O();xe(.5,.5-e,.5+d,.5-e,.5+e,.5-d,.5+e,.5,.5,g,g,h,k,l);var m=z.Tb(h.x, +h.y);R(a,h.x*b,h.y*c,!0);S(a,k.x*b,k.y*c,l.x*b,l.y*c,(.5+e)*b,.5*c);S(a,(.5+e)*b,(.5+d)*c,(.5+d)*b,(.5+e)*c,.5*b,(.5+e)*c);S(a,(.5-d)*b,(.5+e)*c,(.5-e)*b,(.5+d)*c,(.5-e)*b,.5*c);xe(.5-e,.5,.5-e,.5-d,.5-d,.5-e,.5,.5-e,.5,k,l,h,g,g);S(a,k.x*b,k.y*c,l.x*b,l.y*c,h.x*b,h.y*c);d=.3*Hd;e=.3;xe(.5-e,.5,.5-e,.5-d,.5-d,.5-e,.5,.5-e,.5,k,l,h,g,g);a.lineTo(h.x*b,h.y*c);S(a,l.x*b,l.y*c,k.x*b,k.y*c,(.5-e)*b,.5*c);S(a,(.5-e)*b,(.5+d)*c,(.5-d)*b,(.5+e)*c,.5*b,(.5+e)*c);S(a,(.5+d)*b,(.5+e)*c,(.5+e)*b,(.5+d)*c,(.5+ +e)*b,.5*c);xe(.5,.5-e,.5+d,.5-e,.5+e,.5-d,.5+e,.5,.5,g,g,h,k,l);S(a,l.x*b,l.y*c,k.x*b,k.y*c,h.x*b,h.y*c);T(a);R(a,.45*b,0,!0);a.lineTo(.45*b,.5*c);a.lineTo(.55*b,.5*c);a.lineTo(.55*b,0);T(a);z.A(g);z.A(h);z.A(k);z.A(l);z.A(m);b=a.q;b.C=new Q(.25,.55);b.D=new Q(.75,.8);z.u(a);return b},Fallout:function(a,b,c){a=z.v();var d=.5*Hd;R(a,0*b,.5*c,!0);S(a,0*b,(.5-d)*c,(.5-d)*b,0*c,.5*b,0*c);S(a,(.5+d)*b,0*c,1*b,(.5-d)*c,1*b,.5*c);S(a,1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);S(a,(.5-d)*b,1*c,0*b,(.5+d)*c,0*b, +.5*c);var e=d=0;R(a,(.3+d)*b,(.8+e)*c,!0,!0);a.lineTo((.5+d)*b,(.5+e)*c);a.lineTo((.1+d)*b,(.5+e)*c);a.lineTo((.3+d)*b,(.8+e)*c);d=.4;e=0;T(a);R(a,(.3+d)*b,(.8+e)*c,!0,!0);a.lineTo((.5+d)*b,(.5+e)*c);a.lineTo((.1+d)*b,(.5+e)*c);a.lineTo((.3+d)*b,(.8+e)*c);d=.2;e=-.3;T(a);R(a,(.3+d)*b,(.8+e)*c,!0,!0);a.lineTo((.5+d)*b,(.5+e)*c);a.lineTo((.1+d)*b,(.5+e)*c);a.lineTo((.3+d)*b,(.8+e)*c);T(a);b=a.q;b.Xd=ej;z.u(a);return b},IrritationHazard:function(a,b,c){a=z.v();R(a,.2*b,0*c,!0);a.lineTo(.5*b,.3*c);a.lineTo(.8* +b,0*c);a.lineTo(1*b,.2*c);a.lineTo(.7*b,.5*c);a.lineTo(1*b,.8*c);a.lineTo(.8*b,1*c);a.lineTo(.5*b,.7*c);a.lineTo(.2*b,1*c);a.lineTo(0*b,.8*c);a.lineTo(.3*b,.5*c);a.lineTo(0*b,.2*c);T(a);b=a.q;b.C=new Q(.3,.3);b.D=new Q(.7,.7);z.u(a);return b},ElectricalHazard:function(a,b,c){a=z.v();R(a,.37*b,0*c,!0);a.lineTo(.5*b,.11*c);a.lineTo(.77*b,.04*c);a.lineTo(.33*b,.49*c);a.lineTo(1*b,.37*c);a.lineTo(.63*b,.86*c);a.lineTo(.77*b,.91*c);a.lineTo(.34*b,1*c);a.lineTo(.34*b,.78*c);a.lineTo(.44*b,.8*c);a.lineTo(.65* +b,.56*c);a.lineTo(0*b,.68*c);T(a);b=a.q;z.u(a);return b},FireHazard:function(a,b,c){a=z.v();R(a,.1*b,1*c,!0);S(a,-.25*b,.63*c,.45*b,.44*c,.29*b,0*c);S(a,.48*b,.17*c,.54*b,.35*c,.51*b,.42*c);S(a,.59*b,.29*c,.58*b,.28*c,.59*b,.18*c);S(a,.8*b,.34*c,.88*b,.43*c,.75*b,.6*c);S(a,.87*b,.48*c,.88*b,.43*c,.88*b,.31*c);S(a,1.17*b,.76*c,.82*b,.8*c,.9*b,1*c);T(a);b=a.q;b.C=new Q(.05,.645);b.D=new Q(.884,.908);z.u(a);return b},BpmnActivityLoop:function(a,b,c){a=z.v();var d=4*(Math.SQRT2-1)/3*.5;R(a,.65*b,1*c, +!1);S(a,(1-d+0)*b,1*c,1*b,(.5+d+0)*c,1*b,.5*c);S(a,1*b,(.5-d+0)*c,(.5+d+0)*b,0*c,.5*b,0*c);S(a,(.5-d+0)*b,0*c,0*b,(.5-d+0)*c,0*b,.5*c);S(a,0*b,(.5+d+0)*c,(.5-d+0)*b,1*c,.35*b,.98*c);a.moveTo(.25*b,.8*c);a.lineTo(.35*b,1*c);a.lineTo(.1*b,1*c);b=a.q;z.u(a);return b},BpmnActivityParallel:function(a,b,c){a=z.v();R(a,0,0,!1);a.lineTo(0,1*c);a.moveTo(.5*b,0);a.lineTo(.5*b,1*c);a.moveTo(1*b,0);a.lineTo(1*b,1*c);b=a.q;z.u(a);return b},BpmnActivitySequential:function(a,b,c){a=z.v();R(a,0,0,!1);a.lineTo(1* +b,0);a.moveTo(0,.5*c);a.lineTo(1*b,.5*c);a.moveTo(0,1*c);a.lineTo(1*b,1*c);b=a.q;z.u(a);return b},BpmnActivityAdHoc:function(a,b,c){a=z.v();R(a,0,0,!1);R(a,1*b,1*c,!1);R(a,0,.5*c,!1);S(a,.2*b,.35*c,.3*b,.35*c,.5*b,.5*c);S(a,.7*b,.65*c,.8*b,.65*c,1*b,.5*c);b=a.q;z.u(a);return b},BpmnActivityCompensation:function(a,b,c){a=z.v();R(a,0,.5*c,!0);a.lineTo(.5*b,0);a.lineTo(.5*b,.5*c);a.lineTo(1*b,1*c);a.lineTo(1*b,0);a.lineTo(.5*b,.5*c);a.lineTo(.5*b,1*c);T(a);b=a.q;z.u(a);return b},BpmnTaskMessage:function(a, +b,c){a=z.v();R(a,0,.2*c,!0);a.lineTo(1*b,.2*c);a.lineTo(1*b,.8*c);a.lineTo(0,.8*c);a.lineTo(0,.8*c);T(a);R(a,0,.2*c,!1);a.lineTo(.5*b,.5*c);a.lineTo(1*b,.2*c);a.fb(!1);b=a.q;z.u(a);return b},BpmnTaskScript:function(a,b,c){a=z.v();R(a,.7*b,1*c,!0);a.lineTo(.3*b,1*c);S(a,.6*b,.5*c,0,.5*c,.3*b,0);a.lineTo(.7*b,0);S(a,.4*b,.5*c,1*b,.5*c,.7*b,1*c);T(a);R(a,.45*b,.73*c,!1);a.lineTo(.7*b,.73*c);a.moveTo(.38*b,.5*c);a.lineTo(.63*b,.5*c);a.moveTo(.31*b,.27*c);a.lineTo(.56*b,.27*c);a.fb(!1);b=a.q;z.u(a);return b}, +BpmnTaskUser:function(a,b,c){a=z.v();R(a,0,0,!1);R(a,.335*b,(1-.555)*c,!0);a.lineTo(.335*b,.595*c);a.lineTo(.665*b,.595*c);a.lineTo(.665*b,(1-.555)*c);S(a,.88*b,.46*c,.98*b,.54*c,1*b,.68*c);a.lineTo(1*b,1*c);a.lineTo(0,1*c);a.lineTo(0,.68*c);S(a,.02*b,.54*c,.12*b,.46*c,.335*b,(1-.555)*c);a.lineTo(.365*b,.405*c);var d=.5-.285,e=Math.PI/4,g=4*(1-Math.cos(e))/(3*Math.sin(e)),e=g*d,g=g*d;S(a,(.5-(e+d)/2)*b,(d+(d+g)/2)*c,(.5-d)*b,(d+g)*c,(.5-d)*b,d*c);S(a,(.5-d)*b,(d-g)*c,(.5-e)*b,(d-d)*c,.5*b,(d-d)*c); +S(a,(.5+e)*b,(d-d)*c,(.5+d)*b,(d-g)*c,(.5+d)*b,d*c);S(a,(.5+d)*b,(d+g)*c,(.5+(e+d)/2)*b,(d+(d+g)/2)*c,.635*b,.405*c);a.lineTo(.635*b,.405*c);a.lineTo(.665*b,(1-.555)*c);a.lineTo(.665*b,.595*c);a.lineTo(.335*b,.595*c);R(a,.2*b,1*c,!1);a.lineTo(.2*b,.8*c);R(a,.8*b,1*c,!1);a.lineTo(.8*b,.8*c);b=a.q;z.u(a);return b},BpmnEventConditional:function(a,b,c){a=z.v();R(a,.1*b,0,!0);a.lineTo(.9*b,0);a.lineTo(.9*b,1*c);a.lineTo(.1*b,1*c);T(a);R(a,.2*b,.2*c,!1);a.lineTo(.8*b,.2*c);a.moveTo(.2*b,.4*c);a.lineTo(.8* +b,.4*c);a.moveTo(.2*b,.6*c);a.lineTo(.8*b,.6*c);a.moveTo(.2*b,.8*c);a.lineTo(.8*b,.8*c);a.fb(!1);b=a.q;z.u(a);return b},BpmnEventError:function(a,b,c){a=z.v();R(a,0,1*c,!0);a.lineTo(.33*b,0);a.lineTo(.66*b,.5*c);a.lineTo(1*b,0);a.lineTo(.66*b,1*c);a.lineTo(.33*b,.5*c);T(a);b=a.q;z.u(a);return b},BpmnEventEscalation:function(a,b,c){a=z.v();R(a,0,0,!1);R(a,1*b,1*c,!1);R(a,.1*b,1*c,!0);a.lineTo(.5*b,0);a.lineTo(.9*b,1*c);a.lineTo(.5*b,.5*c);T(a);b=a.q;z.u(a);return b},BpmnEventTimer:function(a,b,c){a= +z.v();var d=.5*Hd;R(a,1*b,.5*c,!0);S(a,1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);S(a,(.5-d)*b,1*c,0,(.5+d)*c,0,.5*c);S(a,0,(.5-d)*c,(.5-d)*b,0,.5*b,0);S(a,(.5+d)*b,0,1*b,(.5-d)*c,1*b,.5*c);R(a,.5*b,0,!1);a.lineTo(.5*b,.15*c);a.moveTo(.5*b,1*c);a.lineTo(.5*b,.85*c);a.moveTo(0,.5*c);a.lineTo(.15*b,.5*c);a.moveTo(1*b,.5*c);a.lineTo(.85*b,.5*c);a.moveTo(.5*b,.5*c);a.lineTo(.58*b,.1*c);a.moveTo(.5*b,.5*c);a.lineTo(.78*b,.54*c);a.fb(!1);b=a.q;b.Xd=ej;z.u(a);return b}},jp;for(jp in xo)xo[jp.toLowerCase()]=jp; +var kp={"":"",Standard:"F1 m 0,0 l 8,4 -8,4 2,-4 z",Backward:"F1 m 8,0 l -2,4 2,4 -8,-4 z",Triangle:"F1 m 0,0 l 8,4.62 -8,4.62 z",BackwardTriangle:"F1 m 8,4 l 0,4 -8,-4 8,-4 0,4 z",Boomerang:"F1 m 0,0 l 8,4 -8,4 4,-4 -4,-4 z",BackwardBoomerang:"F1 m 8,0 l -8,4 8,4 -4,-4 4,-4 z",SidewaysV:"m 0,0 l 8,4 -8,4 0,-1 6,-3 -6,-3 0,-1 z",BackwardV:"m 8,0 l -8,4 8,4 0,-1 -6,-3 6,-3 0,-1 z",OpenTriangle:"m 0,0 l 8,4 -8,4",BackwardOpenTriangle:"m 8,0 l -8,4 8,4",OpenTriangleLine:"m 0,0 l 8,4 -8,4 m 8.5,0 l 0,-8", +BackwardOpenTriangleLine:"m 8,0 l -8,4 8,4 m -8.5,0 l 0,-8",OpenTriangleTop:"m 0,0 l 8,4 m 0,4",BackwardOpenTriangleTop:"m 8,0 l -8,4 m 0,4",OpenTriangleBottom:"m 0,8 l 8,-4",BackwardOpenTriangleBottom:"m 0,4 l 8,4",HalfTriangleTop:"F1 m 0,0 l 0,4 8,0 z m 0,8",BackwardHalfTriangleTop:"F1 m 8,0 l 0,4 -8,0 z m 0,8",HalfTriangleBottom:"F1 m 0,4 l 0,4 8,-4 z",BackwardHalfTriangleBottom:"F1 m 8,4 l 0,4 -8,-4 z",ForwardSemiCircle:"m 4,0 b 270 180 0 4 4",BackwardSemiCircle:"m 4,8 b 90 180 0 -4 4",Feather:"m 0,0 l 3,4 -3,4", +BackwardFeather:"m 3,0 l -3,4 3,4",DoubleFeathers:"m 0,0 l 3,4 -3,4 m 3,-8 l 3,4 -3,4",BackwardDoubleFeathers:"m 3,0 l -3,4 3,4 m 3,-8 l -3,4 3,4",TripleFeathers:"m 0,0 l 3,4 -3,4 m 3,-8 l 3,4 -3,4 m 3,-8 l 3,4 -3,4",BackwardTripleFeathers:"m 3,0 l -3,4 3,4 m 3,-8 l -3,4 3,4 m 3,-8 l -3,4 3,4",ForwardSlash:"m 0,8 l 5,-8",BackSlash:"m 0,0 l 5,8",DoubleForwardSlash:"m 0,8 l 4,-8 m -2,8 l 4,-8",DoubleBackSlash:"m 0,0 l 4,8 m -2,-8 l 4,8",TripleForwardSlash:"m 0,8 l 4,-8 m -2,8 l 4,-8 m -2,8 l 4,-8", +TripleBackSlash:"m 0,0 l 4,8 m -2,-8 l 4,8 m -2,-8 l 4,8",Fork:"m 0,4 l 8,0 m -8,0 l 8,-4 m -8,4 l 8,4",BackwardFork:"m 8,4 l -8,0 m 8,0 l -8,-4 m 8,4 l -8,4",LineFork:"m 0,0 l 0,8 m 0,-4 l 8,0 m -8,0 l 8,-4 m -8,4 l 8,4",BackwardLineFork:"m 8,4 l -8,0 m 8,0 l -8,-4 m 8,4 l -8,4 m 8,-8 l 0,8",CircleFork:"F1 m 6,4 b 0 360 -3 0 3 z m 0,0 l 6,0 m -6,0 l 6,-4 m -6,4 l 6,4",BackwardCircleFork:"F1 m 0,4 l 6,0 m -6,-4 l 6,4 m -6,4 l 6,-4 m 6,0 b 0 360 -3 0 3",CircleLineFork:"F1 m 6,4 b 0 360 -3 0 3 z m 1,-4 l 0,8 m 0,-4 l 6,0 m -6,0 l 6,-4 m -6,4 l 6,4", +BackwardCircleLineFork:"F1 m 0,4 l 6,0 m -6,-4 l 6,4 m -6,4 l 6,-4 m 0,-4 l 0,8 m 7,-4 b 0 360 -3 0 3",Circle:"F1 m 8,4 b 0 360 -4 0 4 z",Block:"F1 m 0,0 l 0,8 8,0 0,-8 z",StretchedDiamond:"F1 m 0,3 l 5,-3 5,3 -5,3 -5,-3 z",Diamond:"F1 m 0,4 l 4,-4 4,4 -4,4 -4,-4 z",Chevron:"F1 m 0,0 l 5,0 3,4 -3,4 -5,0 3,-4 -3,-4 z",StretchedChevron:"F1 m 0,0 l 8,0 3,4 -3,4 -8,0 3,-4 -3,-4 z",NormalArrow:"F1 m 0,2 l 4,0 0,-2 4,4 -4,4 0,-2 -4,0 z",X:"m 0,0 l 8,8 m 0,-8 l -8,8",TailedNormalArrow:"F1 m 0,0 l 2,0 1,2 3,0 0,-2 2,4 -2,4 0,-2 -3,0 -1,2 -2,0 1,-4 -1,-4 z", +DoubleTriangle:"F1 m 0,0 l 4,4 -4,4 0,-8 z m 4,0 l 4,4 -4,4 0,-8 z",BigEndArrow:"F1 m 0,0 l 5,2 0,-2 3,4 -3,4 0,-2 -5,2 0,-8 z",ConcaveTailArrow:"F1 m 0,2 h 4 v -2 l 4,4 -4,4 v -2 h -4 l 2,-2 -2,-2 z",RoundedTriangle:"F1 m 0,1 a 1,1 0 0 1 1,-1 l 7,3 a 0.5,1 0 0 1 0,2 l -7,3 a 1,1 0 0 1 -1,-1 l 0,-6 z",SimpleArrow:"F1 m 1,2 l -1,-2 2,0 1,2 -1,2 -2,0 1,-2 5,0 0,-2 2,2 -2,2 0,-2 z",AccelerationArrow:"F1 m 0,0 l 0,8 0.2,0 0,-8 -0.2,0 z m 2,0 l 0,8 1,0 0,-8 -1,0 z m 3,0 l 2,0 2,4 -2,4 -2,0 0,-8 z",BoxArrow:"F1 m 0,0 l 4,0 0,2 2,0 0,-2 2,4 -2,4 0,-2 -2,0 0,2 -4,0 0,-8 z", +TriangleLine:"F1 m 8,4 l -8,-4 0,8 8,-4 z m 0.5,4 l 0,-8",CircleEndedArrow:"F1 m 10,4 l -2,-3 0,2 -2,0 0,2 2,0 0,2 2,-3 z m -4,0 b 0 360 -3 0 3 z",DynamicWidthArrow:"F1 m 0,3 l 2,0 2,-1 2,-2 2,4 -2,4 -2,-2 -2,-1 -2,0 0,-2 z",EquilibriumArrow:"m 0,3 l 8,0 -3,-3 m 3,5 l -8,0 3,3",FastForward:"F1 m 0,0 l 3.5,4 0,-4 3.5,4 0,-4 1,0 0,8 -1,0 0,-4 -3.5,4 0,-4 -3.5,4 0,-8 z",Kite:"F1 m 0,4 l 2,-4 6,4 -6,4 -2,-4 z",HalfArrowTop:"F1 m 0,0 l 4,4 4,0 -8,-4 z m 0,8",HalfArrowBottom:"F1 m 0,8 l 4,-4 4,0 -8,4 z", +OpposingDirectionDoubleArrow:"F1 m 0,4 l 2,-4 0,2 4,0 0,-2 2,4 -2,4 0,-2 -4,0 0,2 -2,-4 z",PartialDoubleTriangle:"F1 m 0,0 4,3 0,-3 4,4 -4,4 0,-3 -4,3 0,-8 z",LineCircle:"F1 m 0,0 l 0,8 m 7 -4 b 0 360 -3 0 3 z",DoubleLineCircle:"F1 m 0,0 l 0,8 m 2,-8 l 0,8 m 7 -4 b 0 360 -3 0 3 z",TripleLineCircle:"F1 m 0,0 l 0,8 m 2,-8 l 0,8 m 2,-8 l 0,8 m 7 -4 b 0 360 -3 0 3 z",CircleLine:"F1 m 6 4 b 0 360 -3 0 3 z m 1,-4 l 0,8",DiamondCircle:"F1 m 8,4 l -4,4 -4,-4 4,-4 4,4 m 8,0 b 0 360 -4 0 4 z",PlusCircle:"F1 m 8,4 b 0 360 -4 0 4 l -8 0 z m -4 -4 l 0 8", +OpenRightTriangleTop:"m 8,0 l 0,4 -8,0 m 0,4",OpenRightTriangleBottom:"m 8,8 l 0,-4 -8,0",Line:"m 0,0 l 0,8",DoubleLine:"m 0,0 l 0,8 m 2,0 l 0,-8",TripleLine:"m 0,0 l 0,8 m 2,0 l 0,-8 m 2,0 l 0,8",PentagonArrow:"F1 m 8,4 l -4,-4 -4,0 0,8 4,0 4,-4 z"}; +function Bo(a){if(null!==kp){for(var b in kp){var c=sf(kp[b],!1);ke[b]=c;b.toLowerCase()!==b&&(ke[b.toLowerCase()]=b)}kp=null}b=ke[a];if(void 0===b){b=a.toLowerCase();if("none"===b)return"None";b=ke[b]}return"string"===typeof b?b:b instanceof hf?a:null} +function D(a){0===arguments.length?I.call(this):I.call(this,a);this.U=311807;this.dl=this.ti="";this.ss=this.ps=this.Cs=this.xr=null;this.Es="";this.Xg=this.Ds=this.Gm=null;this.rs="";this.Ho=null;this.qs=fe;this.ts="";this.Io=null;this.xe="";this.Fv=this.Aq=this.Pk=null;this.Li=(new N(NaN,NaN)).freeze();this.Cr="";this.hl=null;this.Dr=Zb;this.Mr=Nd;this.Fr=Od;this.Tq=null;this.yr=lp;this.Im=Md;this.Hm="gray";this.Ag=4;this.AC=-1;this.et=NaN;this.nG=new w;this.jl=null;this.Rj=NaN}z.Qa(D,I); +z.ia("Part",D);D.prototype.cloneProtected=function(a){I.prototype.cloneProtected.call(this,a);a.U=this.U&-4097|49152;a.ti=this.ti;a.dl=this.dl;a.xr=this.xr;a.Cs=this.Cs;a.ps=this.ps;a.ss=this.ss;a.Es=this.Es;a.Ds=this.Ds;a.Xg=null;a.rs=this.rs;a.qs=this.qs.V();a.ts=this.ts;a.xe=this.xe;a.Aq=this.Aq;a.Li.assign(this.Li);a.Cr=this.Cr;a.Dr=this.Dr.V();a.Mr=this.Mr.V();a.Fr=this.Fr.V();a.Tq=this.Tq;a.yr=this.yr;a.Im=this.Im.V();a.Hm=this.Hm;a.Ag=this.Ag;a.et=this.et}; +D.prototype.ki=function(a){I.prototype.ki.call(this,a);a.Nl();a.Gm=null;a.Ho=null;a.Io=null;a.hl=null;a.jl=null};D.prototype.toString=function(){var a=z.kf(Object.getPrototypeOf(this))+"#"+z.nd(this);null!==this.data&&(a+="("+ka(this.data)+")");return a};D.LayoutNone=0;var wl;D.LayoutAdded=wl=1;var El;D.LayoutRemoved=El=2;D.LayoutShown=4;D.LayoutHidden=8;D.LayoutNodeSized=16;var hm;D.LayoutGroupLayout=hm=32;D.LayoutNodeReplaced=64;var lp;D.LayoutStandard=lp=wl|El|28|hm|64;D.LayoutAll=16777215; +D.prototype.sn=function(a,b,c,d,e,g,h){var k=this.h;null!==k&&(a===Wf&&"elements"===b?e instanceof I?xl(e,function(a){zl(k,a);yl(k,a)}):e instanceof xk&&Ul(k,e):a===Xf&&"elements"===b&&(e instanceof I?xl(e,function(a){Dl(k,a);Cl(k,a)}):e instanceof xk&&Vl(k,e)),k.Rc(a,b,c,d,e,g,h))};D.prototype.updateTargetBindings=D.prototype.Mb=function(a){I.prototype.Mb.call(this,a);if(null!==this.data){a=this.va.o;for(var b=a.length,c=0;c<b;c++){var d=a[c];d instanceof I&&xl(d,function(a){null!==a.data&&a.Mb()})}}}; +D.prototype.updateRelationshipsFromData=function(){var a=this.data;if(null!==a){var b=this.h;if(null!==b){var c=b.ha;if(c instanceof V){var d=c.en(a),b=b.GH(d),e=this.Va;b!==e&&(b=null!==e?c.pb(e.data):void 0,e=c.Pp,"function"===typeof e?e(a,b):a[e]=b,c.Mx(a,d))}}}};z.w(D,{Dw:"adornments"},function(){return null===this.Xg?Pa:this.Xg.UE});D.prototype.findAdornment=D.prototype.kp=function(a){u&&z.g(a,"string",D,"findAdornment:category");var b=this.Xg;return null===b?null:b.na(a)}; +D.prototype.addAdornment=D.prototype.rl=function(a,b){if(null!==b){u&&(z.g(a,"string",D,"addAdornment:category"),z.l(b,da,D,"addAdornment:ad"));var c=null,d=this.Xg;null!==d&&(c=d.na(a));if(c!==b){if(null!==c){var e=c.h;null!==e&&e.remove(c)}null===d&&(this.Xg=d=new na("string",da));b.ti!==a&&(b.nc=a);d.add(a,b);c=this.h;null!==c&&(c.add(b),b.data=this.data)}}}; +D.prototype.removeAdornment=D.prototype.sj=function(a){u&&z.g(a,"string",D,"removeAdornment:category");var b=this.Xg;if(null!==b){var c=b.na(a);if(null!==c){var d=c.h;null!==d&&d.remove(c)}b.remove(a);0===b.count&&(this.Xg=null)}};D.prototype.clearAdornments=D.prototype.pt=function(){var a=this.Xg;if(null!==a){for(var b=z.rb(),a=a.i;a.next();)b.push(a.key);for(var a=b.length,c=0;c<a;c++)this.sj(b[c]);z.xa(b)}}; +D.prototype.updateAdornments=function(){var a=this.h;if(null!==a){a:{if(this.jb&&this.FF){var b=this.un;if(!(null!==b&&this.W.F()&&this.isVisible()&&b.oj()&&b.W.F()))break a;var c=this.kp("Selection");if(null===c){c=this.fJ;null===c&&(c=this instanceof G?a.vI:this instanceof F?a.SH:a.LI);if(!(c instanceof da))break a;jh(c);c=c.copy();null!==c&&(c.nc="Selection",c.fc=b)}if(null!==c){var d=c.placeholder;if(null!==d){var e=b.hj(),g=0;b instanceof X&&(g=b.ub);var h=z.Xl();h.n((b.Ga.width+g)*e,(b.Ga.height+ +g)*e);d.Aa=h;z.qk(h)}c.angle=b.Kl();c.type!==Ni&&(d=z.O(),c.location=b.eb(Zb,d),z.A(d));this.rl("Selection",c);break a}}this.sj("Selection")}mp(this,a);for(a=this.Dw;a.next();)b=a.value,b.Mb(),b.Q()}};function mp(a,b){b.gb.Ye.each(function(b){b.isEnabled&&b.updateAdornments(a)});b.gb.updateAdornments(a)}z.w(D,{layer:"layer"},function(){return this.Fv});z.w(D,{h:"diagram"},function(){var a=this.Fv;return null!==a?a.h:null}); +z.defineProperty(D,{If:"layerName"},function(){return this.dl},function(a){var b=this.dl;if(b!==a){z.g(a,"string",D,"layerName");var c=this.h;if(null===c||null!==c.Gl(a)&&!c.lq)if(this.dl=a,null!==c&&c.yc(),this.j("layerName",b,a),b=this.layer,null!==b&&b.name!==a&&(c=b.h,null!==c&&(a=c.Gl(a),null!==a&&a!==b))){var d=b.Ve(-1,this,!0);0<=d&&c.Rc(Xf,"parts",b,this,null,d,!0);b.visible!==a.visible&&this.wd(a.visible);d=a.xp(99999999,this,!0);0<=d&&c.Rc(Wf,"parts",a,null,this,!0,d);d=this.Ut;if(null!== +d){var e=c.$a;c.$a=!0;d(this,b,a);c.$a=e}}}});z.defineProperty(D,{Ut:"layerChanged"},function(){return this.xr},function(a){var b=this.xr;b!==a&&(null!==a&&z.g(a,"function",D,"layerChanged"),this.xr=a,this.j("layerChanged",b,a))});z.defineProperty(D,{Dn:"zOrder"},function(){return this.et},function(a){var b=this.et;if(b!==a){z.g(a,"number",D,"zOrder");this.et=a;var c=this.layer;null!==c&&ok(c,-1,this);this.j("zOrder",b,a);a=this.h;null!==a&&a.ta()}}); +D.prototype.invalidateAdornments=D.prototype.ae=function(){var a=this.h;null!==a&&(Kk(a),0!==(this.U&16384)!==!0&&(this.U|=16384,a.Ce()))};function kk(a){0!==(a.U&16384)!==!1&&(a.updateAdornments(),a.U&=-16385)}function dn(a){if(!1===pl(a)){var b=a.h;null!==b&&(b.rg.add(a),a instanceof E&&!b.pa.qb&&a.mf(),b.Ce());np(a,!0);a.Gi()}}function op(a){if(!1!==pl(a)){var b=a.position,c=a.location;c.F()&&b.F()||pp(a,b,c);var c=a.Xb,d=c.copy();c.Wa();c.x=b.x;c.y=b.y;c.freeze();a.wx(d,c);np(a,!1)}} +z.w(D,{Zb:"locationObject"},function(){if(null===this.hl){var a=this.tx;""!==a?(a=this.oe(a),this.hl=null!==a?a:this):this.hl=this instanceof da?this.type!==Ni&&null!==this.placeholder?this.placeholder:this:this}return this.hl.visible?this.hl:this});z.defineProperty(D,{FI:"minLocation"},function(){return this.Mr},function(a){var b=this.Mr;b.N(a)||(u&&z.l(a,N,D,"minLocation"),this.Mr=a=a.V(),this.j("minLocation",b,a))}); +z.defineProperty(D,{AI:"maxLocation"},function(){return this.Fr},function(a){var b=this.Fr;b.N(a)||(u&&z.l(a,N,D,"maxLocation"),this.Fr=a=a.V(),this.j("maxLocation",b,a))});z.defineProperty(D,{tx:"locationObjectName"},function(){return this.Cr},function(a){var b=this.Cr;b!==a&&(u&&z.g(a,"string",D,"locationObjectName"),this.Cr=a,this.hl=null,Zm(this),this.j("locationObjectName",b,a))}); +z.defineProperty(D,{of:"locationSpot"},function(){return this.Dr},function(a){var b=this.Dr;b.N(a)||(u&&(z.l(a,Q,D,"locationSpot"),a.cd()||z.k("Part.locationSpot must be a specific Spot value, not: "+a)),this.Dr=a=a.V(),Zm(this),this.j("locationSpot",b,a))});D.prototype.move=function(a){this.position=a};D.prototype.moveTo=D.prototype.moveTo=function(a,b){var c=z.Tb(a,b);this.move(c);z.A(c)}; +D.prototype.isVisible=function(){if(!this.visible)return!1;var a=this.layer;if(null!==a&&!a.visible)return!1;a=this.h;if(null!==a&&(a=a.Ua,a.nf&&(a=a.xm.na(this),null!==a&&a.Dx)))return!0;a=this.Va;return null===a||a.se&&a.isVisible()?!0:!1};D.prototype.wd=function(a){var b=this.h;a?(this.I(4),this.ae(),null!==b&&b.rg.add(this)):(this.I(8),this.pt());this.Nl();null!==b&&(b.yc(),b.ta())}; +D.prototype.findObject=D.prototype.oe=function(a){if(this.name===a)return this;var b=this.jl;null===b&&(this.jl=b=new ma);if(void 0!==b[a])return b[a];for(var c=this.va.o,d=c.length,e=0;e<d;e++){var g=c[e];if(g.name===a)return b[a]=g;if(g instanceof I)if(null===g.Ji&&null===g.tg){if(g=g.oe(a),null!==g)return b[a]=g}else if(Sl(g)&&(g=g.va.first(),null!==g&&g.name===a))return b[a]=g}return b[a]=null}; +function qp(a,b,c,d){void 0===d&&(d=new N);c=c.Be()?ec:c;var e=b.Ga;d.n(e.width*c.x+c.offsetX,e.height*c.y+c.offsetY);if(null===b||b===a)return d;b.transform.Cb(d);for(b=b.T;null!==b&&b!==a;)b.transform.Cb(d),b=b.T;a.gl.Cb(d);d.offset(-a.ud.x,-a.ud.y);return d}D.prototype.ensureBounds=D.prototype.Bf=function(){uj(this,Infinity,Infinity);this.Lc()}; +function nk(a,b){var c=a.nG,d;isNaN(a.Rj)&&(a.Rj=oo(a));d=a.Rj;var e=2*d;if(!a.tk)return c.n(b.x-1-d,b.y-1-d,b.width+2+e,b.height+2+e),c;d=b.x;var e=b.y,g=b.width,h=b.height,k=a.shadowBlur,l=a.kJ,g=g+k,h=h+k;d-=k/2;e-=k/2;0<l.x?g+=l.x:(d+=l.x,g-=l.x);0<l.y?h+=l.y:(e+=l.y,h-=l.y);c.n(d-1,e-1,g+2,h+2);return c} +D.prototype.Lc=function(){this.Gi();if(!1===ol(this))op(this);else{var a=this.Xb,b=z.lg();b.assign(a);a.Wa();var c=jk(this);this.aj(0,0,this.ud.width,this.ud.height);var d=this.position;pp(this,d,this.location);a.x=d.x;a.y=d.y;a.freeze();this.wx(b,a);Pm(this,!1);b.N(a)?this.Jf(c):!this.be()||eb(b.width,a.width)&&eb(b.height,a.height)||0<=this.AC&&this.I(16);z.dc(b);np(this,!1)}}; +D.prototype.wx=function(a,b){var c=this.h;if(null!==c){var d=!1;if(!1===c.Jj&&a.F()){var e=c.ad,g=c.padding,h=e.x+g.left,k=e.y+g.top,l=e.width-2*g.right,e=e.height-2*g.bottom;a.x>h&&a.y>k&&a.right<l&&a.bottom<e&&b.x>h&&b.y>k&&b.right<l&&b.bottom<e&&(d=!0)}0!==(this.U&65536)!==!0&&a.N(b)||Al(this,d,c);c.ta();a.N(b)||this.Nl()}}; +z.defineProperty(D,{location:"location"},function(){return this.Li},function(a){var b=this.Li;if(!b.N(a)){u&&z.l(a,N,D,"location");a=a.V();var c;c=a;if(this instanceof G)c=!1;else{this.Li=c;if(!1===ol(this)){dn(this);var d=this.sb;if(d.F()){var e=d.copy();d.n(d.x+(c.x-b.x),d.y+(c.y-b.y));rp(this,this.h,d,e);this.j("position",e,d)}}c=!0}c&&this.j("location",b,a)}}); +D.prototype.QA=function(a,b){if(this instanceof G||!a.F())return!1;var c=this.h;if(null!==c&&(rp(this,c,a,b),!0===c.pa.qb))return!0;this.sb=a;c=this.Li;if(c.F()){var d=c.copy();c.n(c.x+(a.x-b.x),c.y+(a.y-b.y));this.j("location",d,c)}!1===pl(this)&&!1===ol(this)&&(dn(this),op(this));return!0};function rp(a,b,c,d){null===b||a instanceof da||(b=b.Ua,b.wc&&Xj(b,a,"position",d.copy(),c.copy(),!1))} +D.prototype.Ox=function(a,b){var c=this.Li,d=this.sb;pl(this)||ol(this)?c.n(NaN,NaN):c.n(c.x+a-d.x,c.y+b-d.y);d.n(a,b);dn(this)}; +function pp(a,b,c){var d=z.O(),e=a.of,g=a.Zb;e.Be()&&z.k("determineOffset: Part's locationSpot must be real: "+e.toString());var h=g.Ga,k=g instanceof X?g.ub:0;d.tu(0,0,h.width+k,h.height+k,e);if(g!==a)for(d.offset(-k/2,-k/2),g.transform.Cb(d),e=g.T;null!==e&&e!==a;)e.transform.Cb(d),e=e.T;a.gl.Cb(d);d.offset(-a.ud.x,-a.ud.y);e=a.h;c.F()?(g=b.x,h=b.y,b.n(c.x-d.x,c.y-d.y),null!==e&&(c=e.Ua,(k=c.Kj)||!c.wc||a instanceof da||Xj(c,a,"position",new N(g,h),b,!1),k||b.x===g&&b.y===h||(k=e.Bb,e.Bb=!0,a.j("position", +new N(g,h),b),e.Bb=k))):b.F()&&(g=c.copy(),c.n(b.x+d.x,b.y+d.y),c.N(g)||null===e||(k=e.Bb,e.Bb=!0,a.j("location",g,c),e.Bb=k));z.A(d);a.Gi()}function Al(a,b,c){Qm(a,!1);a instanceof E&&om(c,a);a.layer.Nc||b||c.yc();b=a.Xb;var d=c.xb;d.F()?(jk(a)?Gb(b,d)||a.Jf(!1):b.Jg(d)&&a.Jf(!0),a.updateAdornments()):c.Zk=!0}D.prototype.Ql=function(){return!0}; +function lk(a,b){var c=a.Xb;if(0!==c.width&&0!==c.height&&!isNaN(c.x)&&!isNaN(c.y)&&a.isVisible()){var d=a.transform;null!==a.uc&&(Vm(a,b,a.uc,!0,!0),b.fillRect(c.x,c.y,c.width,c.height));null===a.uc&&null===a.Nb&&(Vm(a,b,"rgba(0,0,0,0.4)",!0,!1),b.fillRect(c.x,c.y,c.width,c.height));null!==a.Nb&&(d.Pt()||b.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy),c=a.Ga,Vm(a,b,a.Nb,!0,!1),b.fillRect(0,0,c.width,c.height),d.Pt()||(c=1/(d.m11*d.m22-d.m12*d.m21),b.transform(d.m22*c,-d.m12*c,-d.m21*c,d.m11*c,c*(d.m21* +d.dy-d.m22*d.dx),c*(d.m12*d.dx-d.m11*d.dy))))}}D.prototype.be=function(){return!0}; +z.defineProperty(D,{nc:"category"},function(){return this.ti},function(a){var b=this.ti;if(b!==a){z.g(a,"string",D,"category");var c=this.h,d=this.data,e=null;if(null!==c&&null!==d&&!(this instanceof da)){var g=c.ha.pa;g.isEnabled&&!g.qb&&(e=this.clone(),e.va.$c(this.va))}this.ti=a;this.j("category",b,a);null===c||null===d||this instanceof da?(e=this.Xf,null!==e&&(a=e.Xg,null!==a&&a.remove(b),e.rl(this.nc,this))):(g=c.ha,g.pa.qb||(this instanceof G?(g instanceof V?g.HF(d,a):g instanceof qg&&g.iJ(d, +a),c=bm(c,a),null!==c&&(jh(c),c=c.copy(),null!==c&&sp(this,c,b,a))):(null!==g&&g.Kx(d,a),c=Zl(c,d,a),null!==c&&(jh(c),c=c.copy(),null===c||c instanceof G||(c.location=this.location,sp(this,c,b,a)))),null!==e&&(b=this.clone(),b.va.$c(this.va),this.j("self",e,b))))}});z.defineProperty(D,{self:"self"},function(){return this},function(a){sp(this,a,this.nc,a.nc)});var tp=!1; +function sp(a,b,c,d){b.constructor===a.constructor||tp||(tp=!0,z.trace('Should not change the class of the Part when changing category from "'+c+'" to "'+d+'"'),z.trace(" Old class: "+z.kf(a)+", new class: "+z.kf(b)+", part: "+a.toString()));a.pt();var e=a.data;c=a.If;var g=a.jb,h=a.yh,k=!0,l=!0,m=!1;if(a instanceof E)var n=a,k=n.nj,l=n.vd,m=n.Cu;b.ki(a);b.cloneProtected(a);a.ti=d;a.Q();a.ta();b=a.h;d=!0;null!==b&&(d=b.Bb,b.Bb=!0);a.fe=e;null!==e&&a.Mb();null!==b&&(b.Bb=d);e=a.If;e!==c&&(a.dl=c, +a.If=e);a instanceof E&&(n=a,n.nj=k,n.vd=l,n.Cu=m,n.be()&&n.I(64));a.jb=g;a.yh=h}D.prototype.canCopy=function(){if(!this.ZD)return!1;var a=this.layer;if(null===a)return!0;if(!a.lk)return!1;a=a.h;return null===a?!0:a.lk?!0:!1};D.prototype.canDelete=function(){if(!this.cE)return!1;var a=this.layer;if(null===a)return!0;if(!a.Rm)return!1;a=a.h;return null===a?!0:a.Rm?!0:!1}; +D.prototype.canEdit=function(){if(!this.QF)return!1;var a=this.layer;if(null===a)return!0;if(!a.Hw)return!1;a=a.h;return null===a?!0:a.Hw?!0:!1};D.prototype.canGroup=function(){if(!this.BE)return!1;var a=this.layer;if(null===a)return!0;if(!a.Ew)return!1;a=a.h;return null===a?!0:a.Ew?!0:!1};D.prototype.canMove=function(){if(!this.cF)return!1;var a=this.layer;if(null===a)return!0;if(!a.vl)return!1;a=a.h;return null===a?!0:a.vl?!0:!1}; +D.prototype.canReshape=function(){if(!this.rF)return!1;var a=this.layer;if(null===a)return!0;if(!a.Fw)return!1;a=a.h;return null===a?!0:a.Fw?!0:!1};D.prototype.canResize=function(){if(!this.sF)return!1;var a=this.layer;if(null===a)return!0;if(!a.mt)return!1;a=a.h;return null===a?!0:a.mt?!0:!1};D.prototype.canRotate=function(){if(!this.xF)return!1;var a=this.layer;if(null===a)return!0;if(!a.Gw)return!1;a=a.h;return null===a?!0:a.Gw?!0:!1}; +D.prototype.canSelect=function(){if(!this.wk)return!1;var a=this.layer;if(null===a)return!0;if(!a.xf)return!1;a=a.h;return null===a?!0:a.xf?!0:!1};z.defineProperty(D,{ZD:"copyable"},function(){return 0!==(this.U&1)},function(a){var b=0!==(this.U&1);b!==a&&(u&&z.g(a,"boolean",D,"copyable"),this.U^=1,this.j("copyable",b,a))}); +z.defineProperty(D,{cE:"deletable"},function(){return 0!==(this.U&2)},function(a){var b=0!==(this.U&2);b!==a&&(u&&z.g(a,"boolean",D,"deletable"),this.U^=2,this.j("deletable",b,a))});z.defineProperty(D,{QF:"textEditable"},function(){return 0!==(this.U&4)},function(a){var b=0!==(this.U&4);b!==a&&(u&&z.g(a,"boolean",D,"textEditable"),this.U^=4,this.j("textEditable",b,a),this.ae())}); +z.defineProperty(D,{BE:"groupable"},function(){return 0!==(this.U&8)},function(a){var b=0!==(this.U&8);b!==a&&(u&&z.g(a,"boolean",D,"groupable"),this.U^=8,this.j("groupable",b,a))});z.defineProperty(D,{cF:"movable"},function(){return 0!==(this.U&16)},function(a){var b=0!==(this.U&16);b!==a&&(u&&z.g(a,"boolean",D,"movable"),this.U^=16,this.j("movable",b,a))}); +z.defineProperty(D,{FF:"selectionAdorned"},function(){return 0!==(this.U&32)},function(a){var b=0!==(this.U&32);b!==a&&(u&&z.g(a,"boolean",D,"selectionAdorned"),this.U^=32,this.j("selectionAdorned",b,a),this.ae())});z.defineProperty(D,{kx:"isInDocumentBounds"},function(){return 0!==(this.U&64)},function(a){var b=0!==(this.U&64);if(b!==a){u&&z.g(a,"boolean",D,"isInDocumentBounds");this.U^=64;var c=this.h;null!==c&&c.yc();this.j("isInDocumentBounds",b,a)}}); +z.defineProperty(D,{iA:"isLayoutPositioned"},function(){return 0!==(this.U&128)},function(a){var b=0!==(this.U&128);b!==a&&(u&&z.g(a,"boolean",D,"isLayoutPositioned"),this.U^=128,this.j("isLayoutPositioned",b,a),this.I(a?4:8))});z.defineProperty(D,{wk:"selectable"},function(){return 0!==(this.U&256)},function(a){var b=0!==(this.U&256);b!==a&&(u&&z.g(a,"boolean",D,"selectable"),this.U^=256,this.j("selectable",b,a),this.ae())}); +z.defineProperty(D,{rF:"reshapable"},function(){return 0!==(this.U&512)},function(a){var b=0!==(this.U&512);b!==a&&(u&&z.g(a,"boolean",D,"reshapable"),this.U^=512,this.j("reshapable",b,a),this.ae())});z.defineProperty(D,{sF:"resizable"},function(){return 0!==(this.U&1024)},function(a){var b=0!==(this.U&1024);b!==a&&(u&&z.g(a,"boolean",D,"resizable"),this.U^=1024,this.j("resizable",b,a),this.ae())}); +z.defineProperty(D,{xF:"rotatable"},function(){return 0!==(this.U&2048)},function(a){var b=0!==(this.U&2048);b!==a&&(u&&z.g(a,"boolean",D,"rotatable"),this.U^=2048,this.j("rotatable",b,a),this.ae())}); +z.defineProperty(D,{jb:"isSelected"},function(){return 0!==(this.U&4096)},function(a){var b=0!==(this.U&4096);if(b!==a){u&&z.g(a,"boolean",D,"isSelected");var c=this.h;if(!a||this.canSelect()&&!(null!==c&&c.selection.count>=c.BI)){this.U^=4096;var d=!1;if(null!==c){d=c.Bb;c.Bb=!0;var e=c.selection;e.Wa();a?e.add(this):e.remove(this);e.freeze()}this.j("isSelected",b,a);this.ae();a=this.gJ;null!==a&&a(this);null!==c&&(c.Ce(),c.Bb=d)}}}); +z.defineProperty(D,{yh:"isHighlighted"},function(){return 0!==(this.U&524288)},function(a){var b=0!==(this.U&524288);if(b!==a){u&&z.g(a,"boolean",D,"isHighlighted");this.U^=524288;var c=this.h;null!==c&&(c=c.gn,c.Wa(),a?c.add(this):c.remove(this),c.freeze());this.j("isHighlighted",b,a);this.ta()}});z.defineProperty(D,{tk:"isShadowed"},function(){return 0!==(this.U&8192)},function(a){var b=0!==(this.U&8192);b!==a&&(u&&z.g(a,"boolean",D,"isShadowed"),this.U^=8192,this.j("isShadowed",b,a),this.ta())}); +function pl(a){return 0!==(a.U&32768)}function np(a,b){a.U=b?a.U|32768:a.U&-32769}function Qm(a,b){a.U=b?a.U|65536:a.U&-65537}function jk(a){return 0!==(a.U&131072)}D.prototype.Jf=function(a){this.U=a?this.U|131072:this.U&-131073};function up(a,b){a.U=b?a.U|1048576:a.U&-1048577}z.defineProperty(D,{HE:"isAnimated"},function(){return 0!==(this.U&262144)},function(a){var b=0!==(this.U&262144);b!==a&&(u&&z.g(a,"boolean",D,"isAnimated"),this.U^=262144,this.j("isAnimated",b,a))}); +z.defineProperty(D,{Jx:"selectionObjectName"},function(){return this.Es},function(a){var b=this.Es;b!==a&&(u&&z.g(a,"string",D,"selectionObjectName"),this.Es=a,this.Gm=null,this.j("selectionObjectName",b,a))});z.defineProperty(D,{fJ:"selectionAdornmentTemplate"},function(){return this.Cs},function(a){var b=this.Cs;b!==a&&(u&&z.l(a,da,D,"selectionAdornmentTemplate"),this instanceof G&&(a.type=Ni),this.Cs=a,this.j("selectionAdornmentTemplate",b,a))}); +z.w(D,{un:"selectionObject"},function(){if(null===this.Gm){var a=this.Jx;null!==a&&""!==a?(a=this.oe(a),this.Gm=null!==a?a:this):this instanceof G?(a=this.path,this.Gm=null!==a?a:this):this.Gm=this}return this.Gm});z.defineProperty(D,{gJ:"selectionChanged"},function(){return this.Ds},function(a){var b=this.Ds;b!==a&&(null!==a&&z.g(a,"function",D,"selectionChanged"),this.Ds=a,this.j("selectionChanged",b,a))}); +z.defineProperty(D,{tF:"resizeAdornmentTemplate"},function(){return this.ps},function(a){var b=this.ps;b!==a&&(u&&z.l(a,da,D,"resizeAdornmentTemplate"),this.ps=a,this.j("resizeAdornmentTemplate",b,a))});z.defineProperty(D,{vF:"resizeObjectName"},function(){return this.rs},function(a){var b=this.rs;b!==a&&(u&&z.g(a,"string",D,"resizeObjectName"),this.rs=a,this.Ho=null,this.j("resizeObjectName",b,a))}); +z.w(D,{uF:"resizeObject"},function(){if(null===this.Ho){var a=this.vF;null!==a&&""!==a?(a=this.oe(a),this.Ho=null!==a?a:this):this.Ho=this}return this.Ho});z.defineProperty(D,{YI:"resizeCellSize"},function(){return this.qs},function(a){var b=this.qs;b.N(a)||(u&&z.l(a,Ea,D,"resizeCellSize"),this.qs=a=a.V(),this.j("resizeCellSize",b,a))}); +z.defineProperty(D,{$I:"rotateAdornmentTemplate"},function(){return this.ss},function(a){var b=this.ss;b!==a&&(u&&z.l(a,da,D,"rotateAdornmentTemplate"),this.ss=a,this.j("rotateAdornmentTemplate",b,a))});z.defineProperty(D,{aJ:"rotateObjectName"},function(){return this.ts},function(a){var b=this.ts;b!==a&&(u&&z.g(a,"string",D,"rotateObjectName"),this.ts=a,this.Io=null,this.j("rotateObjectName",b,a))}); +z.w(D,{yF:"rotateObject"},function(){if(null===this.Io){var a=this.aJ;null!==a&&""!==a?(a=this.oe(a),this.Io=null!==a?a:this):this.Io=this}return this.Io});z.defineProperty(D,{text:"text"},function(){return this.xe},function(a){var b=this.xe;b!==a&&(u&&z.g(a,"string",D,"text"),this.xe=a,this.j("text",b,a))}); +z.defineProperty(D,{Va:"containingGroup"},function(){return this.Pk},function(a){if(this.be()){var b=this.Pk;if(b!==a){u&&null!==a&&z.l(a,F,D,"containingGroup");null===a||this!==a&&!a.mi(this)||(this===a&&z.k("Cannot make a Group a member of itself: "+this.toString()),z.k("Cannot make a Group indirectly contain itself: "+this.toString()+" already contains "+a.toString()));this.I(El);var c=this.h;null!==b?vp(b,this):this instanceof F&&null!==c&&c.pl.remove(this);this.Pk=a;null!==a?wp(a,this):this instanceof +F&&null!==c&&c.pl.add(this);this.I(wl);if(null!==c){var d=this.data,e=c.ha;null!==d&&e instanceof V&&e.Mx(d,e.pb(null!==a?a.data:null))}d=this.VD;null!==d&&(e=!0,null!==c&&(e=c.$a,c.$a=!0),d(this,b,a),null!==c&&(c.$a=e));if(this instanceof F)for(c=new K(D),hh(c,this,!0,0,!0),c=c.i;c.next();)if(d=c.value,d instanceof E)for(d=d.ee;d.next();)Xl(d.value);if(this instanceof E)for(d=this.ee;d.next();)Xl(d.value);this.j("containingGroup",b,a);null!==a&&(b=a.layer,null!==b&&ok(b,-1,a))}}else z.k("cannot set the Part.containingGroup of a Link or Adornment")}); +f=D.prototype;f.Nl=function(){var a=this.Va;null!==a&&(a.Q(),null!==a.Lb&&a.Lb.Q(),a.mf())};f.ta=function(){var a=this.h;null!==a&&!ol(this)&&!pl(this)&&this.isVisible()&&this.Xb.F()&&a.ta(nk(this,this.Xb))};f.Kt=function(a){a||(a=this.Pk,null!==a&&wp(a,this))};f.Lt=function(a){a||(a=this.Pk,null!==a&&vp(a,this))};f.bn=function(){var a=this.data;if(null!==a){var b=this.h;null!==b&&(b=b.ha,null!==b&&b.Fx(a))}}; +z.defineProperty(D,{VD:"containingGroupChanged"},function(){return this.Aq},function(a){var b=this.Aq;b!==a&&(null!==a&&z.g(a,"function",D,"containingGroupChanged"),this.Aq=a,this.j("containingGroupChanged",b,a))});D.prototype.findSubGraphLevel=function(){return xp(this,this)};function xp(a,b){var c=b.Va;return null!==c?1+xp(a,c):b instanceof E&&(c=b.Nd,null!==c)?xp(a,c):0}D.prototype.findTopLevelPart=function(){return yp(this,this)}; +function yp(a,b){var c=b.Va;return null!==c?yp(a,c):b instanceof E&&(c=b.Nd,null!==c)?yp(a,c):b}z.w(D,{Bp:"isTopLevel"},function(){return null!==this.Va||this instanceof E&&this.Df?!1:!0});D.prototype.isMemberOf=D.prototype.mi=function(a){return a instanceof F?zp(this,this,a):!1};function zp(a,b,c){if(b===c||null===c)return!1;var d=b.Va;return null===d||d!==c&&!zp(a,d,c)?b instanceof E&&(b=b.Nd,null!==b)?zp(a,b,c):!1:!0} +D.prototype.findCommonContainingGroup=D.prototype.CH=function(a){if(null===a)return null;u&&z.l(a,D,D,"findCommonContainingGroup:other");if(this===a)return this.Va;for(var b=this;null!==b;)b instanceof F&&up(b,!0),b=b.Va;for(var c=null,b=a;null!==b;){if(0!==(b.U&1048576)){c=b;break}b=b.Va}for(b=this;null!==b;)b instanceof F&&up(b,!1),b=b.Va;return c}; +z.defineProperty(D,{qI:"layoutConditions"},function(){return this.yr},function(a){var b=this.yr;b!==a&&(u&&z.g(a,"number",D,"layoutConditions"),this.yr=a,this.j("layoutConditions",b,a))});D.prototype.canLayout=function(){if(!this.iA||!this.isVisible())return!1;var a=this.layer;return null!==a&&a.Nc||this instanceof E&&this.Df?!1:!0}; +D.prototype.invalidateLayout=D.prototype.I=function(a){void 0===a&&(a=16777215);var b;this.iA&&0!==(a&this.qI)?(b=this.layer,null!==b&&b.Nc||this instanceof E&&this.Df?b=!1:(b=this.h,b=null!==b&&b.pa.qb?!1:!0)):b=!1;if(b)if(b=this.Pk,null!==b){var c=b.Sb;null!==c?c.I():b.I(a)}else a=this.h,null!==a&&(c=a.Sb,null!==c&&c.I())};function Bl(a){if(!a.isVisible())return!1;a=a.layer;return null!==a&&a.Nc?!1:!0} +z.defineProperty(D,{hE:"dragComputation"},function(){return this.Tq},function(a){var b=this.Tq;b!==a&&(null!==a&&z.g(a,"function",D,"dragComputation"),this.Tq=a,this.j("dragComputation",b,a))});z.defineProperty(D,{kJ:"shadowOffset"},function(){return this.Im},function(a){var b=this.Im;b.N(a)||(u&&z.l(a,N,D,"shadowOffset"),this.Im=a=a.V(),this.ta(),this.j("shadowOffset",b,a))}); +z.defineProperty(D,{shadowColor:"shadowColor"},function(){return this.Hm},function(a){var b=this.Hm;b!==a&&(u&&z.g(a,"string",D,"shadowColor"),this.Hm=a,this.ta(),this.j("shadowColor",b,a))});z.defineProperty(D,{shadowBlur:"shadowBlur"},function(){return this.Ag},function(a){var b=this.Ag;b!==a&&(u&&z.g(a,"number",D,"shadowBlur"),this.Ag=a,this.ta(),this.j("shadowBlur",b,a))}); +function da(a){0===arguments.length?D.call(this,hj):D.call(this,a);this.U&=-257;this.dl="Adornment";this.Lb=this.$g=this.Ib=null}z.Qa(da,D);z.ia("Adornment",da);da.prototype.toString=function(){var a=this.Xf;return"Adornment("+this.nc+")"+(null!==a?a.toString():"")};da.prototype.updateRelationshipsFromData=function(){}; +da.prototype.nn=function(a){var b=this.fc.ca,c=this.fc;if(b instanceof G&&c instanceof X){var d=b.path,c=d.wh;b.nn(a);c=d.wh;a=this.va.o;b=a.length;for(d=0;d<b;d++){var e=a[d];e.Ff&&e instanceof X&&(e.kb=c)}}};z.w(da,{placeholder:"placeholder"},function(){return this.Lb}); +z.defineProperty(da,{fc:"adornedObject"},function(){return this.Ib},function(a){u&&null!==a&&z.l(a,O,D,"adornedObject:value");var b=this.Xf,c=null;null!==a&&(c=a.ca);null===b||null!==a&&b===c||b.sj(this.nc);this.Ib=a;null!==c&&c.rl(this.nc,this)});z.w(da,{Xf:"adornedPart"},function(){var a=this.Ib;return null!==a?a.ca:null});da.prototype.Ql=function(){var a=this.Ib;if(null===a)return!0;a=a.ca;return null===a||!ol(a)};da.prototype.be=function(){return!1};z.w(da,{Va:"containingGroup"},function(){return null}); +da.prototype.sn=function(a,b,c,d,e,g,h){if(a===Wf&&"elements"===b)if(e instanceof bj){var k=e;null===this.Lb?this.Lb=k:this.Lb!==k&&z.k("Cannot insert a second Placeholder into the visual tree of an Adornment.")}else e instanceof I&&(k=e.zt(function(a){return a instanceof bj}),k instanceof bj&&(null===this.Lb?this.Lb=k:this.Lb!==k&&z.k("Cannot insert a second Placeholder into the visual tree of an Adornment.")));else a===Xf&&"elements"===b&&null!==this.Lb&&(d===this.Lb?this.Lb=null:d instanceof I&& +this.Lb.Pl(d)&&(this.Lb=null));D.prototype.sn.call(this,a,b,c,d,e,g,h)};da.prototype.updateAdornments=function(){};da.prototype.bn=function(){};function E(a){0===arguments.length?D.call(this,hj):D.call(this,a);this.mc=new J(G);this.vo=this.fl=this.Ar=this.zr=null;this.rr=!0;this.bt=!1;this.Ys=null;this.sq=this.sr=!0;this.tq=Ld;this.Dd=this.Jh=null;this.hs=Ap;this.ik=!1}z.Qa(E,D);z.ia("Node",E); +E.prototype.cloneProtected=function(a){D.prototype.cloneProtected.call(this,a);a.zr=this.zr;a.Ar=this.Ar;a.fl=this.fl;a.rr=this.rr;a.bt=this.bt;a.Ys=this.Ys;a.sr=this.sr;a.sq=this.sq;a.tq=this.tq.V();a.hs=this.hs};E.prototype.ki=function(a){D.prototype.ki.call(this,a);a.mf();a.Jh=this.Jh;a.Dd=null};var Bp;E.DirectionDefault=Bp=z.s(E,"DirectionDefault",0);E.DirectionAbsolute=z.s(E,"DirectionAbsolute",1);var Cp;E.DirectionRotatedNode=Cp=z.s(E,"DirectionRotatedNode",2);var Hm; +E.DirectionRotatedNodeOrthogonal=Hm=z.s(E,"DirectionRotatedNodeOrthogonal",3);E.SpreadingNone=z.s(E,"SpreadingNone",10);var Ap;E.SpreadingEvenly=Ap=z.s(E,"SpreadingEvenly",11);var Dp;E.SpreadingPacked=Dp=z.s(E,"SpreadingPacked",12);function Ep(a,b){null!==b&&(null===a.Jh&&(a.Jh=new K(yk)),a.Jh.add(b))} +function Fp(a,b,c,d){if(null===b||null===a.Jh)return null;for(var e=a.Jh.i;e.next();){var g=e.value;if(g.Op===a&&g.du===b&&g.zx===c&&g.Ax===d||g.Op===b&&g.du===a&&g.zx===d&&g.Ax===c)return g}return null}E.prototype.invalidateLinkBundle=function(a,b,c){if(void 0===b||null===b)b="";if(void 0===c||null===c)c="";a=Fp(this,a,b,c);null!==a&&a.zp()}; +E.prototype.sn=function(a,b,c,d,e,g,h){a===Wf&&"elements"===b?this.Dd=null:a===Xf&&"elements"===b&&(null===this.h?this.Dd=null:d instanceof O&&ko(this,d,function(a,b){en(a,b,!0)}));D.prototype.sn.call(this,a,b,c,d,e,g,h)};E.prototype.invalidateConnectedLinks=E.prototype.mf=function(a){void 0===a&&(a=null);for(var b=this.ee;b.next();){var c=b.value;null!==a&&a.contains(c)||(Gp(this,c.md),Gp(this,c.Qd),c.qc())}}; +function Gp(a,b){if(null!==b){var c=b.gs;null!==c&&c.zp();c=a.Va;null===c||c.se||Gp(c,c.Hl(""))}}E.prototype.Ql=function(){return!0};z.defineProperty(E,{SI:"portSpreading"},function(){return this.hs},function(a){var b=this.hs;b!==a&&(u&&z.Ba(a,E,E,"portSpreading"),this.hs=a,this.j("portSpreading",b,a),a=this.h,null!==a&&a.pa.qb||this.mf())}); +z.defineProperty(E,{ND:"avoidable"},function(){return this.sq},function(a){var b=this.sq;if(b!==a){u&&z.g(a,"boolean",E,"avoidable");this.sq=a;var c=this.h;null!==c&&om(c,this);this.j("avoidable",b,a)}});z.defineProperty(E,{VG:"avoidableMargin"},function(){return this.tq},function(a){"number"===typeof a?a=new Db(a):z.l(a,Db,E,"avoidableMargin");var b=this.tq;if(!b.N(a)){this.tq=a=a.V();var c=this.h;null!==c&&om(c,this);this.j("avoidableMargin",b,a)}}); +E.prototype.canAvoid=function(){return this.ND&&!this.Df};E.prototype.getAvoidableRect=function(a){a.set(this.W);a.Cw(this.VG);return a};E.prototype.findVisibleNode=function(){for(var a=this;null!==a&&!a.isVisible();)a=a.Va;return a}; +E.prototype.isVisible=function(){if(!D.prototype.isVisible.call(this))return!1;var a=!0,b=!0,c=this.h;if(null!==c){a=c.Ua;if(a.nf&&(a=a.xm.na(this),null!==a&&a.Dx))return!0;a=c.ce;b=c.aB===uk}if(b){if(c=this.Il(),null!==c&&!c.vd)return!1}else if(c=a?this.EH():this.FH(),0<c.count&&c.all(function(a){return!a.vd}))return!1;c=this.Nd;return null!==c?c.isVisible():!0};E.prototype.wd=function(a){D.prototype.wd.call(this,a);for(var b=this.ee;b.next();)b.value.wd(a)};z.w(E,{ee:"linksConnected"},function(){return this.mc.i}); +E.prototype.findLinksConnected=E.prototype.pE=function(a){void 0===a&&(a=null);if(null===a)return this.mc.i;u&&z.g(a,"string",E,"findLinksConnected:pid");var b=new Ta(this.mc),c=this;b.qn=function(b){return b.Y===c&&b.ag===a||b.da===c&&b.Vg===a};return b};E.prototype.findLinksOutOf=E.prototype.Zw=function(a){void 0===a&&(a=null);u&&null!==a&&z.g(a,"string",E,"findLinksOutOf:pid");var b=new Ta(this.mc),c=this;b.qn=function(b){return b.Y!==c?!1:null===a?!0:b.ag===a};return b}; +E.prototype.findLinksInto=E.prototype.Ig=function(a){void 0===a&&(a=null);u&&null!==a&&z.g(a,"string",E,"findLinksInto:pid");var b=new Ta(this.mc),c=this;b.qn=function(b){return b.da!==c?!1:null===a?!0:b.Vg===a};return b}; +E.prototype.findNodesConnected=E.prototype.qE=function(a){void 0===a&&(a=null);u&&null!==a&&z.g(a,"string",E,"findNodesConnected:pid");for(var b=null,c=null,d=this.mc.i;d.next();){var e=d.value;if(e.Y===this){if(null===a||e.ag===a)e=e.da,null!==b?b.add(e):null!==c&&c!==e?(b=new K(E),b.add(c),b.add(e)):c=e}else e.da!==this||null!==a&&e.Vg!==a||(e=e.Y,null!==b?b.add(e):null!==c&&c!==e?(b=new K(E),b.add(c),b.add(e)):c=e)}return null!==b?b.i:null!==c?new Ra(c):Pa}; +E.prototype.findNodesOutOf=E.prototype.FH=function(a){void 0===a&&(a=null);u&&null!==a&&z.g(a,"string",E,"findNodesOutOf:pid");for(var b=null,c=null,d=this.mc.i;d.next();){var e=d.value;e.Y!==this||null!==a&&e.ag!==a||(e=e.da,null!==b?b.add(e):null!==c&&c!==e?(b=new K(E),b.add(c),b.add(e)):c=e)}return null!==b?b.i:null!==c?new Ra(c):Pa}; +E.prototype.findNodesInto=E.prototype.EH=function(a){void 0===a&&(a=null);u&&null!==a&&z.g(a,"string",E,"findNodesInto:pid");for(var b=null,c=null,d=this.mc.i;d.next();){var e=d.value;e.da!==this||null!==a&&e.Vg!==a||(e=e.Y,null!==b?b.add(e):null!==c&&c!==e?(b=new K(E),b.add(c),b.add(e)):c=e)}return null!==b?b.i:null!==c?new Ra(c):Pa}; +E.prototype.findLinksBetween=function(a,b,c){void 0===b&&(b=null);void 0===c&&(c=null);u&&(z.l(a,E,E,"findLinksBetween:othernode"),null!==b&&z.g(b,"string",E,"findLinksBetween:pid"),null!==c&&z.g(c,"string",E,"findLinksBetween:otherpid"));var d=new Ta(this.mc),e=this;d.qn=function(d){return(d.Y!==e||d.da!==a||null!==b&&d.ag!==b||null!==c&&d.Vg!==c)&&(d.Y!==a||d.da!==e||null!==c&&d.ag!==c||null!==b&&d.Vg!==b)?!1:!0};return d}; +E.prototype.findLinksTo=function(a,b,c){void 0===b&&(b=null);void 0===c&&(c=null);u&&(z.l(a,E,E,"findLinksTo:othernode"),null!==b&&z.g(b,"string",E,"findLinksTo:pid"),null!==c&&z.g(c,"string",E,"findLinksTo:otherpid"));var d=new Ta(this.mc),e=this;d.qn=function(d){return d.Y!==e||d.da!==a||null!==b&&d.ag!==b||null!==c&&d.Vg===c?!1:!0};return d}; +z.defineProperty(E,{sI:"linkConnected"},function(){return this.zr},function(a){var b=this.zr;b!==a&&(null!==a&&z.g(a,"function",E,"linkConnected"),this.zr=a,this.j("linkConnected",b,a))});z.defineProperty(E,{tI:"linkDisconnected"},function(){return this.Ar},function(a){var b=this.Ar;b!==a&&(null!==a&&z.g(a,"function",E,"linkDisconnected"),this.Ar=a,this.j("linkDisconnected",b,a))}); +z.defineProperty(E,{qx:"linkValidation"},function(){return this.fl},function(a){var b=this.fl;b!==a&&(null!==a&&z.g(a,"function",E,"linkValidation"),this.fl=a,this.j("linkValidation",b,a))}); +function Hp(a,b,c){Gp(a,c);if(!a.mc.contains(b)){a.mc.add(b);var d=a.sI;if(null!==d){var e=!0,g=a.h;null!==g&&(e=g.$a,g.$a=!0);d(a,b,c);null!==g&&(g.$a=e)}b.Oc&&(c=b.Y,b=b.da,null!==c&&null!==b&&c!==b&&(d=!0,g=a.h,null!==g&&(d=g.ce),a=d?b:c,e=d?c:b,a.ik||(a.ik=e),!e.nj||null!==g&&g.pa.qb||(d?c===e&&(e.nj=!1):b===e&&(e.nj=!1))))}} +function Ip(a,b,c){Gp(a,c);if(a.mc.remove(b)){var d=a.tI,e=a.h;if(null!==d){var g=!0;null!==e&&(g=e.$a,e.$a=!0);d(a,b,c);null!==e&&(e.$a=g)}b.Oc&&(c=!0,null!==e&&(c=e.ce),a=c?b.da:b.Y,b=c?b.Y:b.da,null!==a&&(a.ik=!1),null===b||b.nj||(0===b.mc.count?(b.ik=null,null!==e&&e.pa.qb||(b.nj=!0)):im(b)))}} +function im(a){a.ik=!1;if(0!==a.mc.count){var b=!0,c=a.h;if(null===c||!c.pa.qb){null!==c&&(b=c.ce);for(c=a.mc.i;c.next();){var d=c.value;if(d.Oc)if(b){if(d.Y===a){a.nj=!1;return}}else if(d.da===a){a.nj=!1;return}}a.nj=!0}}} +E.prototype.updateRelationshipsFromData=function(){D.prototype.updateRelationshipsFromData.call(this);var a=this.data;if(null!==a){var b=this.h;if(null!==b){var c=b.ha;if(c instanceof qg){var d=c.fn(a),b=b.hf(d),e=this.Il();b!==e&&(b=null!==e?c.pb(e.data):void 0,e=c.Qp,"function"===typeof e?e(a,b):a[e]=b,c.Gh(a,d))}}}};E.prototype.Kt=function(a){D.prototype.Kt.call(this,a);a||(im(this),a=this.vo,null!==a&&Jp(a,this))}; +E.prototype.Lt=function(a){D.prototype.Lt.call(this,a);a||(a=this.vo,null!==a&&null!==a.Ke&&(a.Ke.remove(this),a.Q()))};E.prototype.bn=function(){if(0<this.mc.count){var a=this.h;if(null!==a)for(var b=a.wb.gE,c=this.mc.copy().i;c.next();){var d=c.value;b?a.remove(d):(d.Y===this&&(d.Y=null),d.da===this&&(d.da=null))}}this.Nd=null;D.prototype.bn.call(this)};z.w(E,{Df:"isLinkLabel"},function(){return null!==this.vo}); +z.defineProperty(E,{Nd:"labeledLink"},function(){return this.vo},function(a){var b=this.vo;if(b!==a){u&&null!==a&&z.l(a,G,E,"labeledLink");var c=this.h,d=this.data;if(null!==b&&(null!==b.Ke&&(b.Ke.remove(this),b.Q()),null!==c&&null!==d&&!c.pa.qb)){var e=b.data,g=c.ha;if(null!==e&&g instanceof V){var h=g.pb(d);void 0!==h&&g.mF(e,h)}}this.vo=a;null!==a&&(Jp(a,this),null===c||null===d||c.pa.qb||(e=a.data,g=c.ha,null!==e&&g instanceof V&&(h=g.pb(d),void 0!==h&&g.Az(e,h))));Zm(this);this.j("labeledLink", +b,a)}});E.prototype.findPort=E.prototype.Hl=function(a){u&&z.g(a,"string",E,"findPort:pid");if(null===this.Dd){if(""===a&&!1===this.Rh)return this;fn(this)}var b=this.Dd.na(a);return null!==b||""!==a&&(b=this.Dd.na(""),null!==b)?b:this};z.w(E,{port:"port"},function(){return this.Hl("")});z.w(E,{ports:"ports"},function(){null===this.Dd&&fn(this);return this.Dd.UE}); +function fn(a){null===a.Dd?a.Dd=new na("string",O):a.Dd.clear();ko(a,a,function(a,c){var d=c.yd;null!==d&&a.Dd.add(d,c)});0===a.Dd.count&&a.Dd.add("",a)}function en(a,b,c){var d=b.yd;if(null!==d&&(null!==a.Dd&&a.Dd.remove(d),b=a.h,null!==b&&c)){c=null;for(d=a.pE(d);d.next();)a=d.value,null===c&&(c=z.rb()),c.push(a);if(null!==c){for(d=0;d<c.length;d++)a=c[d],b.remove(a);z.xa(c)}}} +E.prototype.isInTreeOf=function(a){if(null===a||a===this)return!1;var b=!0,c=this.h;null!==c&&(b=c.ce);c=this;if(b)for(;c!==a;){for(var b=null,d=c.mc.i;d.next();){var e=d.value;if(e.Oc&&(b=e.Y,b!==c&&b!==this))break}if(b===this||null===b||b===c)return!1;c=b}else for(;c!==a;){b=null;for(d=c.mc.i;d.next()&&(e=d.value,!e.Oc||(b=e.da,b===c||b===this)););if(b===this||null===b||b===c)return!1;c=b}return!0}; +E.prototype.findTreeRoot=function(){var a=!0,b=this.h;null!==b&&(a=b.ce);b=this;if(a)for(;;){for(var a=null,c=b.mc.i;c.next();){var d=c.value;if(d.Oc&&(a=d.Y,a!==b&&a!==this))break}if(a===this)return this;if(null===a||a===b)return b;b=a}else for(;;){a=null;for(c=b.mc.i;c.next()&&(d=c.value,!d.Oc||(a=d.da,a===b||a===this)););if(a===this)return this;if(null===a||a===b)return b;b=a}}; +E.prototype.findCommonTreeParent=function(a){if(null===a)return null;u&&z.l(a,E,E,"findCommonTreeParent:other");if(this===a)return this;for(var b=this;null!==b;)up(b,!0),b=b.Il();for(var c=null,b=a;null!==b;){if(0!==(b.U&1048576)){c=b;break}b=b.Il()}for(b=this;null!==b;)up(b,!1),b=b.Il();return c}; +E.prototype.findTreeParentLink=E.prototype.op=function(){var a=!0,b=this.h;null!==b&&(a=b.ce);b=this.mc.i;if(a)for(;b.next();){if(a=b.value,a.Oc&&a.Y!==this)return a}else for(;b.next();)if(a=b.value,a.Oc&&a.da!==this)return a;return null}; +E.prototype.findTreeParentNode=E.prototype.Il=function(){var a=this.ik;if(null===a)return null;if(a instanceof E)return a;var b=!0,a=this.h;null!==a&&(b=a.ce);a=this.mc.i;if(b)for(;a.next();){if(b=a.value,b.Oc&&(b=b.Y,b!==this))return this.ik=b}else for(;a.next();)if(b=a.value,b.Oc&&(b=b.da,b!==this))return this.ik=b;return this.ik=null};E.prototype.findTreeParentChain=function(){function a(b,d){if(null!==b){d.add(b);var e=b.op();null!==e&&(d.add(e),a(b.Il(),d))}}var b=new K(D);a(this,b);return b}; +E.prototype.findTreeLevel=function(){return Kp(this,this)};function Kp(a,b){var c=b.Il();return null===c?0:1+Kp(a,c)}E.prototype.findTreeChildrenLinks=E.prototype.ax=function(){var a=!0,b=this.h;null!==b&&(a=b.ce);if(a){var a=new Ta(this.mc),c=this;a.qn=function(a){return a.Oc&&a.Y===c?!0:!1}}else a=new Ta(this.mc),c=this,a.qn=function(a){return a.Oc&&a.da===c?!0:!1};return a}; +E.prototype.findTreeChildrenNodes=E.prototype.sE=function(){var a=!0,b=this.h;null!==b&&(a=b.ce);var c=b=null,d=this.mc.i;if(a)for(;d.next();)a=d.value,a.Oc&&a.Y===this&&(a=a.da,null!==b?b.add(a):null!==c&&c!==a?(b=new J(E),b.add(c),b.add(a)):c=a);else for(;d.next();)a=d.value,a.Oc&&a.da===this&&(a=a.Y,null!==b?b.add(a):null!==c&&c!==a?(b=new J(E),b.add(c),b.add(a)):c=a);return null!==b?b.i:null!==c?new Ra(c):Pa}; +E.prototype.findTreeParts=function(a){void 0===a&&(a=Infinity);z.g(a,"number",E,"collapseTree:level");var b=new K(D);hh(b,this,!1,a,!0);return b};E.prototype.collapseTree=E.prototype.collapseTree=function(a){void 0===a&&(a=1);z.p(a,E,"collapseTree:level");1>a&&(a=1);var b=this.h;if(null!==b&&!b.xh){b.xh=!0;var c=new K(E);c.add(this);Lp(this,c,b.ce,a,b.Ua,this,b.aB===uk);b.xh=!1}}; +function Lp(a,b,c,d,e,g,h){if(1<d)for(var k=c?a.Zw():a.Ig();k.next();){var l=k.value;l.Oc&&(l=l.$z(a),null===l||l===a||b.contains(l)||(b.add(l),Lp(l,b,c,d-1,e,g,h)))}else Mp(a,b,c,e,g,h)}function Mp(a,b,c,d,e,g){for(var h=e===a?!0:a.vd,k=c?a.Zw():a.Ig();k.next();){var l=k.value;l.Oc&&(l=l.$z(a),null===l||l===a||b.contains(l)||(b.add(l),h&&(g&&gk(d,l,e),l.Nl(),l.wd(!1)),l.vd&&(l.Cu=l.vd,Mp(l,b,c,d,e,g))))}a.vd=!1} +E.prototype.expandTree=E.prototype.expandTree=function(a){void 0===a&&(a=2);z.p(a,E,"expandTree:level");2>a&&(a=2);var b=this.h;if(null!==b&&!b.xh){b.xh=!0;var c=new K(E);c.add(this);Np(this,c,b.ce,a,b.Ua,this,b.aB===uk);b.xh=!1}};function Np(a,b,c,d,e,g,h){for(var k=g===a?!1:a.vd,l=c?a.Zw():a.Ig();l.next();){var m=l.value;m.Oc&&(k||m.Dg||m.qc(),m=m.$z(a),null!==m&&m!==a&&!b.contains(m)&&(b.add(m),k||(m.wd(!0),m.Nl(),h&&fk(e,m,g)),2<d||m.Cu))&&(m.Cu=!1,Np(m,b,c,d-1,e,g,h))}a.vd=!0} +z.defineProperty(E,{vd:"isTreeExpanded"},function(){return this.rr},function(a){var b=this.rr;if(b!==a){u&&z.g(a,"boolean",E,"isTreeExpanded");this.rr=a;var c=this.h;this.j("isTreeExpanded",b,a);b=this.xJ;if(null!==b){var d=!0;null!==c&&(d=c.$a,c.$a=!0);b(this);null!==c&&(c.$a=d)}null!==c&&c.pa.qb?this.wd(a):a?this.expandTree():this.collapseTree()}}); +z.defineProperty(E,{Cu:"wasTreeExpanded"},function(){return this.bt},function(a){var b=this.bt;b!==a&&(u&&z.g(a,"boolean",E,"wasTreeExpanded"),this.bt=a,this.j("wasTreeExpanded",b,a))});z.defineProperty(E,{xJ:"treeExpandedChanged"},function(){return this.Ys},function(a){var b=this.Ys;b!==a&&(null!==a&&z.g(a,"function",E,"treeExpandedChanged"),this.Ys=a,this.j("treeExpandedChanged",b,a))}); +z.defineProperty(E,{nj:"isTreeLeaf"},function(){return this.sr},function(a){var b=this.sr;b!==a&&(u&&z.g(a,"boolean",E,"isTreeLeaf"),this.sr=a,this.j("isTreeLeaf",b,a))}); +function G(){D.call(this,Ni);this.qg=null;this.Qh="";this.Cg=this.ar=null;this.fi="";this.Xs=null;this.os=this.ns=this.ms=!1;this.tr=!0;this.mq=Qi;this.Fq=0;this.Iq=Qi;this.Jq=NaN;this.Cm=on;this.Ms=.5;this.Ke=null;this.Yc=(new J(N)).freeze();this.Jo=this.Me=null;this.Dg=!1;this.cw=null;this.nz=!1;this.$g=this.Yn=this.Un=this.si=this.Ei=this.kb=null;this.qz=new N;this.jD=this.hD=null;this.ty=!1;this.la=null}z.Qa(G,D);z.ia("Link",G); +G.prototype.cloneProtected=function(a){D.prototype.cloneProtected.call(this,a);a.Qh=this.Qh;a.ar=this.ar;a.fi=this.fi;a.Xs=this.Xs;a.ms=this.ms;a.ns=this.ns;a.os=this.os;a.tr=this.tr;a.mq=this.mq;a.Fq=this.Fq;a.Iq=this.Iq;a.Jq=this.Jq;a.Cm=this.Cm;a.Ms=this.Ms;null!==this.la&&(a.la=this.la.copy())};G.prototype.ki=function(a){D.prototype.ki.call(this,a);this.Qh=a.Qh;this.fi=a.fi;a.Me=null;a.qc();a.si=this.si};var on;G.Normal=on=z.s(G,"Normal",1);G.Orthogonal=z.s(G,"Orthogonal",2); +G.AvoidsNodes=z.s(G,"AvoidsNodes",6);var Op;G.AvoidsNodesStraight=Op=z.s(G,"AvoidsNodesStraight",7);var Qi;G.None=Qi=z.s(G,"None",0);var Xi;G.Bezier=Xi=z.s(G,"Bezier",9);var Pi;G.JumpGap=Pi=z.s(G,"JumpGap",10);var Oi;G.JumpOver=Oi=z.s(G,"JumpOver",11);var ln;G.End=ln=z.s(G,"End",17);var mn;G.Scale=mn=z.s(G,"Scale",18);var nn;G.Stretch=nn=z.s(G,"Stretch",19);var Do;G.OrientAlong=Do=z.s(G,"OrientAlong",21);var eo;G.OrientPlus90=eo=z.s(G,"OrientPlus90",22);var ho; +G.OrientMinus90=ho=z.s(G,"OrientMinus90",23);var Pp;G.OrientOpposite=Pp=z.s(G,"OrientOpposite",24);var Qp;G.OrientUpright=Qp=z.s(G,"OrientUpright",25);var fo;G.OrientPlus90Upright=fo=z.s(G,"OrientPlus90Upright",26);var io;G.OrientMinus90Upright=io=z.s(G,"OrientMinus90Upright",27);var jo;G.OrientUpright45=jo=z.s(G,"OrientUpright45",28);G.prototype.Ue=function(){null===this.la&&(this.la=new Gm)}; +G.prototype.Ql=function(){var a=this.Y;if(null!==a){var b=a.findVisibleNode();null!==b&&(a=b);if(ol(a)||pl(a))return!1}a=this.da;return null!==a&&(b=a.findVisibleNode(),null!==b&&(a=b),ol(a)||pl(a))?!1:!0};G.prototype.QA=function(){return!1};G.prototype.be=function(){return!1}; +G.prototype.computeAngle=function(a,b,c){a=0;switch(b){default:case Qi:a=0;break;case Do:a=c;break;case eo:a=c+90;break;case ho:a=c-90;break;case Pp:a=c+180;break;case Qp:a=df(c);90<a&&270>a&&(a-=180);break;case fo:a=df(c+90);90<a&&270>a&&(a-=180);break;case io:a=df(c-90);90<a&&270>a&&(a-=180);break;case jo:a=df(c);if(45<a&&135>a||225<a&&315>a)return 0;90<a&&270>a&&(a-=180)}return df(a)}; +z.defineProperty(G,{Y:"fromNode"},function(){return this.qg},function(a){var b=this.qg;if(b!==a){u&&null!==a&&z.l(a,E,G,"fromNode");var c=this.md;null!==b&&(this.Cg!==b&&Ip(b,this,c),Rp(this),this.I(El));this.qg=a;null!==a&&this.wd(a.isVisible());this.Ei=null;this.qc();var d=this.h;if(null!==d){var e=this.data,g=d.ha;if(null!==e)if(g instanceof V){var h=null!==a?a.data:null;g.Lx(e,g.pb(h))}else g instanceof qg&&(h=null!==a?a.data:null,d.ce?g.Gh(e,g.pb(h)):(null!==b&&g.Gh(b.data,void 0),g.Gh(h,g.pb(null!== +this.Cg?this.Cg.data:null))))}e=this.md;g=this.vE;null!==g&&(h=!0,null!==d&&(h=d.$a,d.$a=!0),g(this,c,e),null!==d&&(d.$a=h));null!==a&&(this.Cg!==a&&Hp(a,this,e),Sp(this),this.I(wl));this.j("fromNode",b,a);Xl(this)}}); +z.defineProperty(G,{ag:"fromPortId"},function(){return this.Qh},function(a){var b=this.Qh;if(b!==a){u&&z.g(a,"string",G,"fromPortId");var c=this.md;null!==c&&Gp(this.Y,c);Rp(this);this.Qh=a;var d=this.md;null!==d&&Gp(this.Y,d);var e=this.h;if(null!==e){var g=this.data,h=e.ha;null!==g&&h instanceof V&&h.OA(g,a)}c!==d&&(this.Ei=null,this.qc(),g=this.vE,null!==g&&(h=!0,null!==e&&(h=e.$a,e.$a=!0),g(this,c,d),null!==e&&(e.$a=h)));Sp(this);this.j("fromPortId",b,a)}}); +z.w(G,{md:"fromPort"},function(){var a=this.qg;return null===a?null:a.Hl(this.Qh)});z.defineProperty(G,{vE:"fromPortChanged"},function(){return this.ar},function(a){var b=this.ar;b!==a&&(null!==a&&z.g(a,"function",G,"fromPortChanged"),this.ar=a,this.j("fromPortChanged",b,a))}); +z.defineProperty(G,{da:"toNode"},function(){return this.Cg},function(a){var b=this.Cg;if(b!==a){u&&null!==a&&z.l(a,E,G,"toNode");var c=this.Qd;null!==b&&(this.qg!==b&&Ip(b,this,c),Rp(this),this.I(El));this.Cg=a;null!==a&&this.wd(a.isVisible());this.Ei=null;this.qc();var d=this.h;if(null!==d){var e=this.data,g=d.ha;if(null!==e)if(g instanceof V){var h=null!==a?a.data:null;g.Px(e,g.pb(h))}else g instanceof qg&&(h=null!==a?a.data:null,d.ce?(null!==b&&g.Gh(b.data,void 0),g.Gh(h,g.pb(null!==this.qg?this.qg.data: +null))):g.Gh(e,g.pb(h)))}e=this.Qd;g=this.TF;null!==g&&(h=!0,null!==d&&(h=d.$a,d.$a=!0),g(this,c,e),null!==d&&(d.$a=h));null!==a&&(this.qg!==a&&Hp(a,this,e),Sp(this),this.I(wl));this.j("toNode",b,a);Xl(this)}}); +z.defineProperty(G,{Vg:"toPortId"},function(){return this.fi},function(a){var b=this.fi;if(b!==a){u&&z.g(a,"string",G,"toPortId");var c=this.Qd;null!==c&&Gp(this.da,c);Rp(this);this.fi=a;var d=this.Qd;null!==d&&Gp(this.da,d);var e=this.h;if(null!==e){var g=this.data,h=e.ha;null!==g&&h instanceof V&&h.RA(g,a)}c!==d&&(this.Ei=null,this.qc(),g=this.TF,null!==g&&(h=!0,null!==e&&(h=e.$a,e.$a=!0),g(this,c,d),null!==e&&(e.$a=h)));Sp(this);this.j("toPortId",b,a)}}); +z.w(G,{Qd:"toPort"},function(){var a=this.Cg;return null===a?null:a.Hl(this.fi)});z.defineProperty(G,{TF:"toPortChanged"},function(){return this.Xs},function(a){var b=this.Xs;b!==a&&(null!==a&&z.g(a,"function",G,"toPortChanged"),this.Xs=a,this.j("toPortChanged",b,a))});z.defineProperty(G,{Db:"fromSpot"},function(){return null!==this.la?this.la.Hj:Pc},function(a){this.Ue();var b=this.la.Hj;b.N(a)||(u&&z.l(a,Q,G,"fromSpot"),a=a.V(),this.la.Hj=a,this.j("fromSpot",b,a),this.qc())}); +z.defineProperty(G,{Jl:"fromEndSegmentLength"},function(){return null!==this.la?this.la.Fj:NaN},function(a){this.Ue();var b=this.la.Fj;b!==a&&(u&&z.g(a,"number",G,"fromEndSegmentLength"),0>a&&z.ka(a,">= 0",G,"fromEndSegmentLength"),this.la.Fj=a,this.j("fromEndSegmentLength",b,a),this.qc())}); +z.defineProperty(G,{Ft:"fromEndSegmentDirection"},function(){return null!==this.la?this.la.Ej:Bp},function(a){this.Ue();var b=this.la.Ej;b!==a&&(u&&z.Ba(a,E,G,"fromEndSegmentDirection"),this.la.Ej=a,this.j("fromEndSegmentDirection",b,a),this.qc())});z.defineProperty(G,{Gt:"fromShortLength"},function(){return null!==this.la?this.la.Gj:NaN},function(a){this.Ue();var b=this.la.Gj;b!==a&&(u&&z.g(a,"number",G,"fromShortLength"),this.la.Gj=a,this.j("fromShortLength",b,a),this.qc())}); +z.defineProperty(G,{Eb:"toSpot"},function(){return null!==this.la?this.la.hk:Pc},function(a){this.Ue();var b=this.la.hk;b.N(a)||(u&&z.l(a,Q,G,"toSpot"),a=a.V(),this.la.hk=a,this.j("toSpot",b,a),this.qc())});z.defineProperty(G,{Yl:"toEndSegmentLength"},function(){return null!==this.la?this.la.fk:NaN},function(a){this.Ue();var b=this.la.fk;b!==a&&(u&&z.g(a,"number",G,"toEndSegmentLength"),0>a&&z.ka(a,">= 0",G,"toEndSegmentLength"),this.la.fk=a,this.j("toEndSegmentLength",b,a),this.qc())}); +z.defineProperty(G,{zu:"toEndSegmentDirection"},function(){return null!==this.la?this.la.ek:Bp},function(a){this.Ue();var b=this.la.ek;b!==a&&(u&&z.Ba(a,E,G,"toEndSegmentDirection"),this.la.ek=a,this.j("toEndSegmentDirection",b,a),this.qc())});z.defineProperty(G,{Au:"toShortLength"},function(){return null!==this.la?this.la.gk:NaN},function(a){this.Ue();var b=this.la.gk;b!==a&&(u&&z.g(a,"number",G,"toShortLength"),this.la.gk=a,this.j("toShortLength",b,a),this.qc())}); +function Xl(a){var b=a.Y,c=a.da;null!==b?null!==c?Tp(a,b.CH(c)):Tp(a,null):Tp(a,null)}function Tp(a,b){var c=a.Pk;if(c!==b){null!==c&&vp(c,a);a.Pk=b;null!==b&&wp(b,a);var d=a.VD;if(null!==d){var e=!0,g=a.h;null!==g&&(e=g.$a,g.$a=!0);d(a,c,b);null!==g&&(g.$a=e)}!a.Dg||a.hD!==c&&a.jD!==c||a.qc()}}G.prototype.Nl=function(){var a=this.Va;null!==a&&this.Y!==a&&this.da!==a&&a.Ow&&D.prototype.Nl.call(this)}; +G.prototype.getOtherNode=G.prototype.$z=function(a){u&&z.l(a,E,G,"getOtherNode:node");var b=this.Y;return a===b?this.da:b};G.prototype.getOtherPort=function(a){u&&z.l(a,O,G,"getOtherPort:port");var b=this.md;return a===b?this.Qd:b};z.w(G,{HK:"isLabeledLink"},function(){return null===this.Ke?!1:0<this.Ke.count});z.w(G,{Hf:"labelNodes"},function(){return null===this.Ke?Pa:this.Ke.i});function Jp(a,b){null===a.Ke&&(a.Ke=new K(E));a.Ke.add(b);a.Q()} +G.prototype.Kt=function(a){D.prototype.Kt.call(this,a);Up(this)&&Ri(this,this.W);a||(a=this.qg,null!==a&&Hp(a,this,this.md),a=this.Cg,null!==a&&Hp(a,this,this.Qd),Sp(this))};G.prototype.Lt=function(a){D.prototype.Lt.call(this,a);Up(this)&&Ri(this,this.W);a||(a=this.qg,null!==a&&Ip(a,this,this.md),a=this.Cg,null!==a&&Ip(a,this,this.Qd),Rp(this))}; +G.prototype.bn=function(){this.Dg=!0;if(null!==this.Ke){var a=this.h;if(null!==a)for(var b=this.Ke.copy().i;b.next();)a.remove(b.value)}b=this.data;null!==b&&(a=this.h,null!==a&&(a=a.ha,a instanceof V?a.Ex(b):a instanceof qg&&a.Gh(b,void 0)))}; +G.prototype.updateRelationshipsFromData=function(){var a=this.data;if(null!==a){var b=this.h;if(null!==b){var c=b.ha;if(c instanceof V){var d=c.Ll(a),e=b.hf(d),g=this.Y;e!==g&&(e=null!==g?c.pb(g.data):void 0,g=c.Ep,"function"===typeof g?g(a,e):a[g]=e,c.Lx(a,d));d=c.Ml(a);e=b.hf(d);g=this.da;e!==g&&(e=null!==g?c.pb(g.data):void 0,g=c.Gp,"function"===typeof g?g(a,e):a[g]=e,c.Px(a,d));var h=c.rk(a);if(0<h.length||0<this.Hf.count){if(1===h.length&&1===this.Hf.count&&(b=h[0],d=this.Hf.first(),c.pb(d.data)=== +b))return;var d=(new K).$c(h),k=new K;this.Hf.each(function(a){null!==a.data&&(a=c.pb(a.data),void 0!==a&&k.add(a))});b=k.copy();b.HA(d);d=d.copy();d.HA(k);if(0<b.count||0<d.count)h.length=0,k.each(function(a){h.push(a)}),b.each(function(b){c.mF(a,b)}),d.each(function(b){c.Az(a,b)})}}}}}; +G.prototype.move=function(a){var b=this.position,c=b.x;isNaN(c)&&(c=0);b=b.y;isNaN(b)&&(b=0);c=a.x-c;b=a.y-b;D.prototype.move.call(this,a);this.Rl(c,b);for(a=this.Hf;a.next();){var d=a.value,e=d.position;d.moveTo(e.x+c,e.y+b)}};z.defineProperty(G,{VI:"relinkableFrom"},function(){return this.ms},function(a){var b=this.ms;b!==a&&(u&&z.g(a,"boolean",G,"relinkableFrom"),this.ms=a,this.j("relinkableFrom",b,a),this.ae())}); +z.defineProperty(G,{WI:"relinkableTo"},function(){return this.ns},function(a){var b=this.ns;b!==a&&(u&&z.g(a,"boolean",G,"relinkableTo"),this.ns=a,this.j("relinkableTo",b,a),this.ae())});G.prototype.canRelinkFrom=function(){if(!this.VI)return!1;var a=this.layer;if(null===a)return!0;if(!a.Sm)return!1;a=a.h;return null===a||a.Sm?!0:!1};G.prototype.canRelinkTo=function(){if(!this.WI)return!1;var a=this.layer;if(null===a)return!0;if(!a.Sm)return!1;a=a.h;return null===a||a.Sm?!0:!1}; +z.defineProperty(G,{lu:"resegmentable"},function(){return this.os},function(a){var b=this.os;b!==a&&(u&&z.g(a,"boolean",G,"resegmentable"),this.os=a,this.j("resegmentable",b,a),this.ae())});z.defineProperty(G,{Oc:"isTreeLink"},function(){return this.tr},function(a){var b=this.tr;b!==a&&(u&&z.g(a,"boolean",G,"isTreeLink"),this.tr=a,this.j("isTreeLink",b,a),null!==this.Y&&im(this.Y),null!==this.da&&im(this.da))});z.w(G,{path:"path"},function(){var a=this.gf();return a instanceof X?a:null}); +z.w(G,{tn:"routeBounds"},function(){this.An();var a=new w;var b=Infinity,c=Infinity,d=this.sa;if(0===d)a.n(NaN,NaN,0,0);else{if(1===d)d=this.m(0),b=Math.min(d.x,b),c=Math.min(d.y,c),a.n(d.x,d.y,0,0);else if(2===d){var e=this.m(0),g=this.m(1),b=Math.min(e.x,g.x),c=Math.min(e.y,g.y);a.n(e.x,e.y,0,0);a.wj(g)}else if(this.computeCurve()===Xi&&3<=d&&!this.rc)if(e=this.m(0),b=e.x,c=e.y,a.n(b,c,0,0),3===d)d=this.m(1),b=Math.min(d.x,b),c=Math.min(d.y,c),g=this.m(2),b=Math.min(g.x,b),c=Math.min(g.y,c),ve(e.x, +e.y,d.x,d.y,d.x,d.y,g.x,g.y,.5,a);else for(var h=3;h<d;h+=3){var k=this.m(h-2);h+3>=d&&(h=d-1);var l=this.m(h-1),g=this.m(h);ve(e.x,e.y,k.x,k.y,l.x,l.y,g.x,g.y,.5,a);b=Math.min(g.x,b);c=Math.min(g.y,c);e=g}else for(e=this.m(0),g=this.m(1),b=Math.min(e.x,g.x),c=Math.min(e.y,g.y),a.n(e.x,e.y,0,0),a.wj(g),h=2;h<d;h++)e=this.m(h),b=Math.min(e.x,b),c=Math.min(e.y,c),a.wj(e);this.qz.n(b-a.x,c-a.y)}return this.cw=a});z.w(G,{aF:"midPoint"},function(){this.An();return this.computeMidPoint(new N)}); +G.prototype.computeMidPoint=function(a){var b=this.sa;if(0===b)return a.assign(ee),a;if(1===b)return a.assign(this.m(0)),a;if(2===b){var c=this.m(0),d=this.m(1);a.n((c.x+d.x)/2,(c.y+d.y)/2);return a}if(this.computeCurve()===Xi&&3<=b&&!this.rc){if(3===b)return this.m(1);var c=(b-1)/3|0,e=3*(c/2|0);if(1===c%2){var c=this.m(e),d=this.m(e+1),g=this.m(e+2),e=this.m(e+3),b=d.x,h=d.y,d=g.x,k=g.y,g=(b+d)/2,l=(h+k)/2,h=((c.y+h)/2+l)/2,k=(l+(k+e.y)/2)/2;a.x=(((c.x+b)/2+g)/2+(g+(d+e.x)/2)/2)/2;a.y=(h+k)/2}else a.assign(this.m(e)); +return a}e=0;g=z.rb();for(h=0;h<b-1;h++)c=0,c=this.m(h),d=this.m(h+1),td(c.x,d.x)?(c=d.y-c.y,0>c&&(c=-c)):td(c.y,d.y)?(c=d.x-c.x,0>c&&(c=-c)):c=Math.sqrt(c.Af(d)),g.push(c),e+=c;for(d=h=c=0;c<e/2&&h<b;){d=g[h];if(c+d>e/2)break;c+=d;h++}z.xa(g);b=this.m(h);g=this.m(h+1);b.x===g.x?b.y>g.y?a.n(b.x,b.y-(e/2-c)):a.n(b.x,b.y+(e/2-c)):b.y===g.y?b.x>g.x?a.n(b.x-(e/2-c),b.y):a.n(b.x+(e/2-c),b.y):(c=(e/2-c)/d,a.n(b.x+c*(g.x-b.x),b.y+c*(g.y-b.y)));return a};z.w(G,{$E:"midAngle"},function(){this.An();return this.computeMidAngle()}); +G.prototype.computeMidAngle=function(){var a=this.sa;if(2>a)return NaN;if(this.computeCurve()===Xi&&4<=a&&!this.rc){var b=(a-1)/3|0,c=3*(b/2|0);if(1===b%2){var c=Math.floor(c),b=this.m(c),d=this.m(c+1),a=this.m(c+2),c=this.m(c+3),e=d.x,d=d.y,g=a.x,a=a.y,h=(e+g)/2,k=(d+a)/2;return wb(((b.x+e)/2+h)/2,((b.y+d)/2+k)/2,(h+(g+c.x)/2)/2,(k+(a+c.y)/2)/2)}if(0<c&&c+1<a)return b=this.m(c-1),d=this.m(c+1),b.Ec(d)}c=a/2|0;if(0===a%2)return b=this.m(c-1),d=this.m(c),4<=a&&b.Mc(d)&&(b=this.m(c-2),a=this.m(c+1), +c=b.Af(d),e=d.Af(a),!(c>e+10))?e>c+10?d.Ec(a):b.Ec(a):b.Ec(d);b=this.m(c-1);d=this.m(c);a=this.m(c+1);c=b.Af(d);e=d.Af(a);return c>e+10?b.Ec(d):e>c+10?d.Ec(a):b.Ec(a)}; +z.defineProperty(G,{points:"points"},function(){return this.Yc},function(a){var b=this.Yc;if(b!==a){var c=null;if(Array.isArray(a)){var d=0===a.length%2;if(d)for(var e=0;e<a.length;e++)if("number"!==typeof a[e]||isNaN(a[e])){d=!1;break}if(d)for(c=new J(N),d=0;d<a.length/2;d++)e=(new N(a[2*d],a[2*d+1])).freeze(),c.add(e);else{for(var g=!0,d=0;d<a.length;d++)if(e=a[d],!z.Za(e)||"number"!==typeof e.x||isNaN(e.x)||"number"!==typeof e.y||isNaN(e.y)){g=!1;break}if(g)for(c=new J(N),d=0;d<a.length;d++)e= +a[d],c.add((new N(e.x,e.y)).freeze());else z.k("Link.points array must contain only an even number of numbers or objects with x and y properties, not: "+a)}}else if(a instanceof J)for(c=a.copy(),a=c.i;a.next();)a.value.freeze();else z.k("Link.points value is not an instance of List or Array: "+a);c.freeze();this.Yc=c;this.qe();this.Q();Vp(this);a=this.h;null!==a&&(a.jn||a.pa.qb||a.sx.add(this),a.Ua.wc&&(this.Jo=c));this.j("points",b,c)}});z.w(G,{sa:"pointsCount"},function(){return this.Yc.count}); +G.prototype.getPoint=G.prototype.m=function(a){return this.Yc.o[a]};G.prototype.setPoint=G.prototype.Kf=function(a,b){u&&(z.l(b,N,G,"setPoint"),b.F()||z.k("Link.setPoint called with a Point that does not have real numbers: "+b.toString()));null===this.Me&&z.k("Call Link.startRoute before modifying the points of the route.");this.Yc.Sg(a,b)}; +G.prototype.setPointAt=G.prototype.aa=function(a,b,c){u&&(z.p(b,G,"setPointAt:x"),z.p(c,G,"setPointAt:y"));null===this.Me&&z.k("Call Link.startRoute before modifying the points of the route.");this.Yc.Sg(a,new N(b,c))};G.prototype.insertPoint=function(a,b){u&&(z.l(b,N,G,"insertPoint"),b.F()||z.k("Link.insertPoint called with a Point that does not have real numbers: "+b.toString()));null===this.Me&&z.k("Call Link.startRoute before modifying the points of the route.");this.Yc.Ld(a,b)}; +G.prototype.insertPointAt=G.prototype.B=function(a,b,c){u&&(z.p(b,G,"insertPointAt:x"),z.p(c,G,"insertPointAt:y"));null===this.Me&&z.k("Call Link.startRoute before modifying the points of the route.");this.Yc.Ld(a,new N(b,c))};G.prototype.addPoint=G.prototype.hi=function(a){u&&(z.l(a,N,G,"addPoint"),a.F()||z.k("Link.addPoint called with a Point that does not have real numbers: "+a.toString()));null===this.Me&&z.k("Call Link.startRoute before modifying the points of the route.");this.Yc.add(a)}; +G.prototype.addPointAt=G.prototype.tl=function(a,b){u&&(z.p(a,G,"insertPointAt:x"),z.p(b,G,"insertPointAt:y"));null===this.Me&&z.k("Call Link.startRoute before modifying the points of the route.");this.Yc.add(new N(a,b))};G.prototype.removePoint=G.prototype.nF=function(a){null===this.Me&&z.k("Call Link.startRoute before modifying the points of the route.");this.Yc.dd(a)}; +G.prototype.clearPoints=G.prototype.ep=function(){null===this.Me&&z.k("Call Link.startRoute before modifying the points of the route.");this.Yc.clear()};G.prototype.movePoints=G.prototype.Rl=function(a,b){for(var c=new J(N),d=this.Yc.i;d.next();){var e=d.value;c.add((new N(e.x+a,e.y+b)).freeze())}c.freeze();d=this.Yc;this.Yc=c;this.Q();Vp(this);e=this.h;null!==e&&e.Ua.wc&&(this.Jo=c);this.j("points",d,c)};G.prototype.startRoute=G.prototype.Ul=function(){null===this.Me&&(this.Me=this.Yc,this.Yc=this.Yc.copy())}; +G.prototype.commitRoute=G.prototype.dj=function(){if(null!==this.Me){for(var a=this.Me,b=this.Yc,c=Infinity,d=Infinity,e=a.o,g=e.length,h=0;h<g;h++)var k=e[h],c=Math.min(k.x,c),d=Math.min(k.y,d);for(var l=Infinity,m=Infinity,n=b.o,p=n.length,h=0;h<p;h++)k=n[h],l=Math.min(k.x,l),m=Math.min(k.y,m),k.freeze();b.freeze();if(p===g)for(h=0;h<p;h++){if(g=e[h],k=n[h],g.x-c!==k.x-l||g.y-d!==k.y-m){this.Q();this.qe();break}}else this.Q(),this.qe();this.Me=null;c=this.h;null!==c&&c.Ua.wc&&(this.Jo=b);Vp(this); +this.j("points",a,b)}};G.prototype.rollbackRoute=G.prototype.ZI=function(){null!==this.Me&&(this.Yc=this.Me,this.Me=null)};function Vp(a){0===a.Yc.count?a.Dg=!1:(a.Dg=!0,a.Un=a.m(0).copy(),a.Yn=a.m(a.sa-1).copy(),Wp(a,!1))}G.prototype.invalidateRoute=G.prototype.qc=function(){if(!this.nz){var a=this.h;a&&(a.sx.contains(this)||a.pa.qb||a.Ua.jI&&!a.Ua.nf)||(a=this.path,null!==a&&(this.Dg=!1,this.Q(),a.Q()))}};z.defineProperty(G,{eq:"suspendsRouting"},function(){return this.nz},function(a){this.nz=a}); +G.prototype.updateRoute=G.prototype.An=function(){if(!this.Dg&&!this.ty){var a=!0;try{this.ty=!0,this.Ul(),a=this.computePoints()}finally{this.ty=!1,a?this.dj():this.ZI()}}}; +G.prototype.computePoints=function(){var a=this.h;if(null===a)return!1;var b=this.Y,c=null;null===b?(a.Dm||(a.dw=new X,a.dw.Aa=Pd,a.dw.ub=0,a.Dm=new E,a.Dm.add(a.dw),a.Dm.Bf()),this.Un&&(a.Dm.position=a.Dm.location=this.Un,a.Dm.Bf(),b=a.Dm,c=a.dw)):c=this.md;if(null!==c&&!b.isVisible()){var d=b.findVisibleNode();null!==d&&d!==b?(b=d,c=d.Hl("")):b=d}this.hD=b;if(null===b||!b.location.F())return!1;for(;!(null===c||c.W.F()&&c.oj());)c=c.T;if(null===c)return!1;var d=this.da,e=null;null===d?(a.Em||(a.ew= +new X,a.ew.Aa=Pd,a.ew.ub=0,a.Em=new E,a.Em.add(a.ew),a.Em.Bf()),this.Yn&&(a.Em.position=a.Em.location=this.Yn,a.Em.Bf(),d=a.Em,e=a.ew)):e=this.Qd;null===e||d.isVisible()||(a=d.findVisibleNode(),null!==a&&a!==d?(d=a,e=a.Hl("")):d=a);this.jD=d;if(null===d||!d.location.F())return!1;for(;!(null===e||e.W.F()&&e.oj());)e=e.T;if(null===e)return!1;var a=this.sa,g=Xp(this,c),h=Yp(this,e),k=c===e&&null!==c,l=this.rc,m=this.Se===Xi;this.Ei=k&&!l?m=!0:!1;var n=this.it===Qi||k;if(l||g!==Yb||h!==Yb||k){m=this.kj; +n&&(l&&m||k)&&this.ep();var p=k?this.computeCurviness():0,q=this.getLinkPoint(b,c,g,!0,l,d,e),r=0,s=0,t=0;if(l||g!==Yb||k){var v=this.computeEndSegmentLength(b,c,g,!0),t=this.getLinkDirection(b,c,q,g,!0,l,d,e);k&&(t-=l?90:30,0>p&&(t-=180));0>t?t+=360:360<=t&&(t-=360);k&&(v+=Math.abs(p));0===t?r=v:90===t?s=v:180===t?r=-v:270===t?s=-v:(r=v*Math.cos(t*Math.PI/180),s=v*Math.sin(t*Math.PI/180));if(g.Be()&&k){var x=c.eb(ec,z.O()),y=z.Tb(x.x+1E3*r,x.y+1E3*s);this.getLinkPointFromPoint(b,c,x,y,!0,q);z.A(x); +z.A(y)}}var v=this.getLinkPoint(d,e,h,!1,l,b,c),A=0,C=0,L=0;if(l||h!==Yb||k)x=this.computeEndSegmentLength(d,e,h,!1),L=this.getLinkDirection(d,e,v,h,!1,l,b,c),k&&(L+=l?0:30,0>p&&(L+=180)),0>L?L+=360:360<=L&&(L-=360),k&&(x+=Math.abs(p)),0===L?A=x:90===L?C=x:180===L?A=-x:270===L?C=-x:(A=x*Math.cos(L*Math.PI/180),C=x*Math.sin(L*Math.PI/180)),h.Be()&&k&&(x=e.eb(ec,z.O()),y=z.Tb(x.x+1E3*A,x.y+1E3*C),this.getLinkPointFromPoint(d,e,x,y,!1,v),z.A(x),z.A(y));e=q;if(l||g!==Yb||k)e=new N(q.x+r,q.y+s);c=v;if(l|| +h!==Yb||k)c=new N(v.x+A,v.y+C);!n&&!l&&g===Yb&&3<a&&this.adjustPoints(0,q,a-2,c)?this.Kf(a-1,v):!n&&!l&&h===Yb&&3<a&&this.adjustPoints(1,e,a-1,v)?this.Kf(0,q):!n&&!l&&4<a&&this.adjustPoints(1,e,a-2,c)?(this.Kf(0,q),this.Kf(a-1,v)):!n&&l&&6<=a&&!m&&this.adjustPoints(1,e,a-2,c)?(this.Kf(0,q),this.Kf(a-1,v)):(this.ep(),this.hi(q),(l||g!==Yb||k)&&this.hi(e),l&&this.addOrthoPoints(e,t,c,L,b,d),(l||h!==Yb||k)&&this.hi(c),this.hi(v))}else g=!1,!n&&3<=a&&(n=this.getLinkPoint(b,c,Yb,!0,!1,d,e),h=this.getLinkPoint(d, +e,Yb,!1,!1,b,c),g=this.adjustPoints(0,n,a-1,h))&&(n=this.getLinkPoint(b,c,Yb,!0,!1,d,e),h=this.getLinkPoint(d,e,Yb,!1,!1,b,c),this.adjustPoints(0,n,a-1,h)),g||(this.ep(),m?(a=this.getLinkPoint(b,c,Yb,!0,!1,d,e),n=this.getLinkPoint(d,e,Yb,!1,!1,b,c),g=n.x-a.x,h=n.y-a.y,k=this.computeCurviness(),m=l=0,q=a.x+g/3,t=a.y+h/3,r=q,s=t,eb(h,0)?s=0<g?s-k:s+k:(l=-g/h,m=Math.sqrt(k*k/(l*l+1)),0>k&&(m=-m),r=(0>h?-1:1)*m+q,s=l*(r-q)+t),q=a.x+2*g/3,t=a.y+2*h/3,v=q,A=t,eb(h,0)?A=0<g?A-k:A+k:(v=(0>h?-1:1)*m+q,A=l* +(v-q)+t),this.ep(),this.hi(a),this.tl(r,s),this.tl(v,A),this.hi(n),this.Kf(0,this.getLinkPoint(b,c,Yb,!0,!1,d,e)),this.Kf(3,this.getLinkPoint(d,e,Yb,!1,!1,b,c))):(a=d,d=this.getLinkPoint(b,c,Yb,!0,!1,a,e),e=this.getLinkPoint(a,e,Yb,!1,!1,b,c),this.hasCurviness()?(h=e.x-d.x,b=e.y-d.y,c=this.computeCurviness(),a=d.x+h/2,n=d.y+b/2,g=a,k=n,eb(b,0)?k=0<h?k-c:k+c:(h=-h/b,g=Math.sqrt(c*c/(h*h+1)),0>c&&(g=-g),g=(0>b?-1:1)*g+a,k=h*(g-a)+n),this.hi(d),this.tl(g,k)):this.hi(d),this.hi(e)));return!0}; +function Zp(a,b){Math.abs(b.x-a.x)>Math.abs(b.y-a.y)?(b.x=b.x>=a.x?a.x+9E9:a.x-9E9,b.y=a.y):(b.y=b.y>=a.y?a.y+9E9:a.y-9E9,b.x=a.x);return b} +G.prototype.getLinkPointFromPoint=function(a,b,c,d,e,g){void 0===g&&(g=new N);if(null===a||null===b)return g.assign(c),g;a.isVisible()||(e=a.findVisibleNode(),null!==e&&e!==a&&(b=e.port));var h=e=0,k=0,l=0;a=null;e=b.T;null===e||e.Wg()||(e=e.T);if(null===e)e=d.x,h=d.y,k=c.x,l=c.y;else{a=e.qh;e=1/(a.m11*a.m22-a.m12*a.m21);var k=a.m22*e,l=-a.m12*e,m=-a.m21*e,n=a.m11*e,p=e*(a.m21*a.dy-a.m22*a.dx),q=e*(a.m12*a.dx-a.m11*a.dy);e=d.x*k+d.y*m+p;h=d.x*l+d.y*n+q;k=c.x*k+c.y*m+p;l=c.x*l+c.y*n+q}b.sp(e,h,k,l, +g);null!==a&&g.transform(a);return g};function $p(a,b){var c=b.gs;null===c&&(c=new aq,c.port=b,c.Pc=b.ca,b.gs=c);return bq(c,a)} +G.prototype.getLinkPoint=function(a,b,c,d,e,g,h,k){void 0===k&&(k=new N);if(c.cd())return b.eb(c,k),k;if(c.lj()&&(c=$p(this,b),null!==c)){k.assign(c.Fp);if(e&&this.Hx===Op){var l=$p(this,h);if(null!==l&&c.$m<l.$m){c=z.O();var l=z.O(),m=new w(b.eb(Zb,c),b.eb(ic,l)),n=this.computeSpot(!d);a=this.getLinkPoint(g,h,n,!d,e,a,b,l);a.x>=m.x&&a.x<=m.x+m.width?k.x=a.x:a.y>=m.y&&a.y<=m.y+m.height&&(k.y=a.y);z.A(c);z.A(l)}}return k}g=b.eb(ec,z.O());l=c=null;this.sa>(e?6:2)?(l=d?this.m(1):this.m(this.sa-2),e&& +(l=Zp(g,l.copy()))):(c=z.O(),l=h.eb(ec,c),e&&(l=Zp(g,l)),z.A(c));this.getLinkPointFromPoint(a,b,g,l,d,k);z.A(g);return k}; +G.prototype.getLinkDirection=function(a,b,c,d,e,g,h,k){a:if(d.cd())c=d.x>d.y?d.x>1-d.y?0:d.x<1-d.y?270:315:d.x<d.y?d.x>1-d.y?90:d.x<1-d.y?180:135:.5>d.x?225:.5<d.x?45:0;else{if(d.lj()){var l=$p(this,b);if(null!==l)switch(l.te){case z.pd:c=270;break a;case z.Tc:c=180;break a;default:case z.fd:c=0;break a;case z.ed:c=90;break a}}var l=b.eb(ec,z.O()),m=null,n=null;this.sa>(g?6:2)?(n=e?this.m(1):this.m(this.sa-2),n=g?Zp(l,n.copy()):c):(m=z.O(),n=k.eb(ec,m),z.A(m));c=0;c=Math.abs(n.x-l.x)>Math.abs(n.y- +l.y)?n.x>=l.x?0:180:n.y>=l.y?90:270;z.A(l)}d.Be()&&h.mi(a)&&(c+=180,360<=c&&(c-=360));a=Bp;a=e?this.Ft:this.zu;a===Bp&&(a=e?b.Ft:b.zu);switch(a){case Cp:b=b.Kl();c+=b;360<=c&&(c-=360);break;case Bp:case Hm:b=b.Kl();if(0===b)break;45<=b&&135>b?c+=90:135<=b&&225>b?c+=180:225<=b&&315>b&&(c+=270);360<=c&&(c-=360)}return c}; +G.prototype.computeEndSegmentLength=function(a,b,c,d){if(null!==b&&c.lj()&&(a=$p(this,b),null!==a))return a.Vw;a=NaN;a=d?this.Jl:this.Yl;null!==b&&isNaN(a)&&(a=d?b.Jl:b.Yl);isNaN(a)&&(a=10);return a};G.prototype.computeSpot=function(a){return a?Xp(this,this.md):Yp(this,this.Qd)};function Xp(a,b){if(null===b)return ec;var c=a.Db;c.bd()&&(void 0===b&&(b=a.md),null!==b&&(c=b.Db));return c===Pc?Yb:c} +function Yp(a,b){if(null===b)return ec;var c=a.Eb;c.bd()&&(void 0===b&&(b=a.Qd),null!==b&&(c=b.Eb));return c===Pc?Yb:c}G.prototype.computeOtherPoint=function(a,b){var c=b.eb(ec),d;d=b.gs;d=null!==d?bq(d,this):null;null!==d&&(c=d.Fp);return c};G.prototype.computeShortLength=function(a){return a?cq(this):dq(this)};function cq(a){var b=a.Gt;isNaN(b)&&(a=a.md,null!==a&&(b=a.Gt));return isNaN(b)?0:b}function dq(a){var b=a.Au;isNaN(b)&&(a=a.Qd,null!==a&&(b=a.Au));return isNaN(b)?0:b} +G.prototype.pk=function(a,b,c,d,e,g){if(!1===this.jg)return!1;void 0===b&&(b=null);void 0===c&&(c=null);var h=g;void 0===g&&(h=z.Hh(),h.reset());h.multiply(this.transform);if(this.Xm(a,h))return po(this,b,c,e),void 0===g&&z.jf(h),!0;if(this.Jg(a,h)){var k=!1;if(!this.eh)for(var l=this.va.o,m=l.length;m--;){var n=l[m];if(n.visible||n===this.Zb){var p=n.W,q=this.Ga;if(!(p.x>q.width||p.y>q.height||0>p.x+p.width||0>p.y+p.height)){p=z.Hh();p.set(h);if(n instanceof I)k=n.pk(a,b,c,d,e,p);else if(this.path=== +n){var k=n,r=a,s=d,q=p;if(!1===k.jg)k=!1;else if(q.multiply(k.transform),s)b:{var t=r,v=q;if(k.Xm(t,v))k=!0;else{if(void 0===v&&(v=k.transform,t.nk(k.W))){k=!0;break b}var q=t.left,r=t.right,s=t.top,t=t.bottom,x=z.O(),y=z.O(),A=z.O(),C=z.Hh();C.set(v);C.uA(k.transform);C.eA();y.x=r;y.y=s;y.transform(C);x.x=q;x.y=s;x.transform(C);v=!1;Ao(k,x,y,A)?v=!0:(x.x=r,x.y=t,x.transform(C),Ao(k,x,y,A)?v=!0:(y.x=q,y.y=t,y.transform(C),Ao(k,x,y,A)?v=!0:(x.x=q,x.y=s,x.transform(C),Ao(k,x,y,A)&&(v=!0))));z.jf(C); +z.A(x);z.A(y);z.A(A);k=v}}else k=k.Xm(r,q)}else k=Mm(n,a,d,p);k&&(null!==b&&(n=b(n)),n&&(null===c||c(n))&&e.add(n));z.jf(p)}}}void 0===g&&z.jf(h);return k||null!==this.background||null!==this.wl}void 0===g&&z.jf(h);return!1};z.w(G,{rc:"isOrthogonal"},function(){return 2===(this.Cm.value&2)});z.w(G,{kj:"isAvoiding"},function(){return 4===(this.Cm.value&4)});G.prototype.computeCurve=function(){if(null===this.Ei){var a=this.md,b=this.rc;this.Ei=null!==a&&a===this.Qd&&!b}return this.Ei?Xi:this.Se}; +G.prototype.computeCorner=function(){if(this.Se===Xi)return 0;var a=this.Lz;if(isNaN(a)||0>a)a=10;return a};G.prototype.findMidLabel=function(){for(var a=this.path,b=this.va.o,c=b.length,d=0;d<c;d++){var e=b[d];if(e!==a&&!e.Ff&&(-Infinity===e.De||isNaN(e.De)))return e}for(a=this.Hf;a.next();)if(b=a.value,-Infinity===b.De||isNaN(b.De))return b;return null}; +G.prototype.computeSpacing=function(){if(!this.isVisible())return 0;var a;a=Math.max(14,this.computeThickness());var b=this.md,c=this.Qd;if(null!==b&&null!==c){var d=this.findMidLabel();if(null!==d){var e=d.Ga,g=d.margin,h=isNaN(e.width)?30:e.width*d.scale+g.left+g.right,e=isNaN(e.height)?14:e.height*d.scale+g.top+g.bottom,d=d.pu;d===Do||d===Qp||d===Pp?a=Math.max(a,e):d===ho||d===io||d===eo||d===fo?a=Math.max(a,h):(b=b.eb(ec).Ec(c.eb(ec))/180*Math.PI,a=Math.max(a,Math.abs(Math.sin(b)*h)+Math.abs(Math.cos(b)* +e)+1));this.Se===Xi&&(a*=1.333)}}return a};G.prototype.arrangeBundledLinks=function(a,b){if(b)for(var c=0;c<a.length;c++)a[c].qc()};G.prototype.computeCurviness=function(){var a=this.Rw;if(isNaN(a)){var a=16,b=this.si;if(null!==b){for(var c=z.rb(),d=0,e=b.links,g=0;g<e.length;g++){var h=e[g],h=h.computeSpacing();c.push(h);d+=h}d=-d/2;for(g=0;g<e.length;g++){h=e[g];if(h===this){a=d+c[g]/2;break}d+=c[g]}b.Op===this.Y&&(a=-a);z.xa(c)}}return a}; +G.prototype.computeThickness=function(){if(!this.isVisible())return 0;var a=this.path;return null!==a?Math.max(a.ub,1):1};G.prototype.hasCurviness=function(){return!isNaN(this.Rw)||null!==this.si}; +G.prototype.adjustPoints=function(a,b,c,d){var e=this.it;if(this.rc){if(e===mn)return!1;e===nn&&(e=ln)}switch(e){case mn:var g=this.m(a),h=this.m(c);if(!g.Mc(b)||!h.Mc(d)){var e=g.x,g=g.y,k=h.x-e,l=h.y-g,m=Math.sqrt(k*k+l*l);if(!td(m,0)){var n=0;td(k,0)?n=0>l?-Math.PI/2:Math.PI/2:(n=Math.atan(l/Math.abs(k)),0>k&&(n=Math.PI-n));var h=b.x,p=b.y,l=d.x-h,q=d.y-p,r=Math.sqrt(l*l+q*q),k=0;td(l,0)?k=0>q?-Math.PI/2:Math.PI/2:(k=Math.atan(q/Math.abs(l)),0>l&&(k=Math.PI-k));m=r/m;n=k-n;this.Kf(a,b);for(a+= +1;a<c;a++)b=this.m(a),k=b.x-e,l=b.y-g,b=Math.sqrt(k*k+l*l),td(b,0)||(q=0,td(k,0)?q=0>l?-Math.PI/2:Math.PI/2:(q=Math.atan(l/Math.abs(k)),0>k&&(q=Math.PI-q)),k=q+n,b*=m,this.aa(a,h+b*Math.cos(k),p+b*Math.sin(k)));this.Kf(c,d)}}return!0;case nn:g=this.m(a);p=this.m(c);if(!g.Mc(b)||!p.Mc(d)){var e=g.x,g=g.y,h=p.x,p=p.y,m=(h-e)*(h-e)+(p-g)*(p-g),k=b.x,n=b.y,l=d.x,q=d.y,r=0,s=1;0!==l-k?(r=(q-n)/(l-k),s=Math.sqrt(1+1/(r*r))):r=9E9;this.Kf(a,b);for(a+=1;a<c;a++){b=this.m(a);var t=b.x,v=b.y,x=.5;0!==m&&(x= +((e-t)*(e-h)+(g-v)*(g-p))/m);var y=e+x*(h-e),A=g+x*(p-g);b=Math.sqrt((t-y)*(t-y)+(v-A)*(v-A));v<r*(t-y)+A&&(b=-b);0<r&&(b=-b);t=k+x*(l-k);x=n+x*(q-n);0!==r?(b=t+b/s,this.aa(a,b,x-(b-t)/r)):this.aa(a,t,x+b)}this.Kf(c,d)}return!0;case ln:return this.rc&&(e=this.m(a),g=this.m(a+1),h=this.m(a+2),eb(e.y,g.y)?eb(g.x,h.x)?this.aa(a+1,g.x,b.y):eb(g.y,h.y)&&this.aa(a+1,b.x,g.y):eb(e.x,g.x)&&(eb(g.y,h.y)?this.aa(a+1,b.x,g.y):eb(g.x,h.x)&&this.aa(a+1,g.x,b.y)),e=this.m(c),g=this.m(c-1),h=this.m(c-2),eb(e.y, +g.y)?eb(g.x,h.x)?this.aa(c-1,g.x,d.y):eb(g.y,h.y)&&this.aa(c-1,d.x,g.y):eb(e.x,g.x)&&(eb(g.y,h.y)?this.aa(c-1,d.x,g.y):eb(g.x,h.x)&&this.aa(c-1,g.x,d.y))),this.Kf(a,b),this.Kf(c,d),!0;default:return!1}}; +G.prototype.addOrthoPoints=function(a,b,c,d,e,g){b=-45<=b&&45>b?0:45<=b&&135>b?90:135<=b&&225>b?180:270;d=-45<=d&&45>d?0:45<=d&&135>d?90:135<=d&&225>d?180:270;var h=e.W.copy(),k=g.W.copy();if(h.F()&&k.F()){h.bg(8,8);k.bg(8,8);h.wj(a);k.wj(c);var l,m;if(0===b)if(c.x>a.x||270===d&&c.y<a.y&&k.right>a.x||90===d&&c.y>a.y&&k.right>a.x)l=new N(c.x,a.y),m=new N(c.x,(a.y+c.y)/2),180===d?(l.x=this.computeMidOrthoPosition(a.x,c.x,!1),m.x=l.x,m.y=c.y):270===d&&c.y<a.y||90===d&&c.y>a.y?(l.x=a.x<k.left?this.computeMidOrthoPosition(a.x, +k.left,!1):a.x<k.right&&(270===d&&a.y<k.top||90===d&&a.y>k.bottom)?this.computeMidOrthoPosition(a.x,c.x,!1):k.right,m.x=l.x,m.y=c.y):0===d&&a.x<k.left&&a.y>k.top&&a.y<k.bottom&&(l.x=a.x,l.y=a.y<c.y?Math.min(c.y,k.top):Math.max(c.y,k.bottom),m.y=l.y);else{l=new N(a.x,c.y);m=new N((a.x+c.x)/2,c.y);if(180===d||90===d&&c.y<h.top||270===d&&c.y>h.bottom)180===d&&(k.Ma(a)||h.Ma(c))?l.y=this.computeMidOrthoPosition(a.y,c.y,!0):c.y<a.y&&(180===d||90===d)?l.y=this.computeMidOrthoPosition(h.top,Math.max(c.y, +k.bottom),!0):c.y>a.y&&(180===d||270===d)&&(l.y=this.computeMidOrthoPosition(h.bottom,Math.min(c.y,k.top),!0)),m.x=c.x,m.y=l.y;if(l.y>h.top&&l.y<h.bottom)if(c.x>=h.left&&c.x<=a.x||a.x<=k.right&&a.x>=c.x){if(90===d||270===d)l=new N(Math.max((a.x+c.x)/2,a.x),a.y),m=new N(l.x,c.y)}else l.y=270===d||(0===d||180===d)&&c.y<a.y?Math.min(c.y,0===d?h.top:Math.min(h.top,k.top)):Math.max(c.y,0===d?h.bottom:Math.max(h.bottom,k.bottom)),m.x=c.x,m.y=l.y}else if(180===b)if(c.x<a.x||270===d&&c.y<a.y&&k.left<a.x|| +90===d&&c.y>a.y&&k.left<a.x)l=new N(c.x,a.y),m=new N(c.x,(a.y+c.y)/2),0===d?(l.x=this.computeMidOrthoPosition(a.x,c.x,!1),m.x=l.x,m.y=c.y):270===d&&c.y<a.y||90===d&&c.y>a.y?(l.x=a.x>k.right?this.computeMidOrthoPosition(a.x,k.right,!1):a.x>k.left&&(270===d&&a.y<k.top||90===d&&a.y>k.bottom)?this.computeMidOrthoPosition(a.x,c.x,!1):k.left,m.x=l.x,m.y=c.y):180===d&&a.x>k.right&&a.y>k.top&&a.y<k.bottom&&(l.x=a.x,l.y=a.y<c.y?Math.min(c.y,k.top):Math.max(c.y,k.bottom),m.y=l.y);else{l=new N(a.x,c.y);m=new N((a.x+ +c.x)/2,c.y);if(0===d||90===d&&c.y<h.top||270===d&&c.y>h.bottom)0===d&&(k.Ma(a)||h.Ma(c))?l.y=this.computeMidOrthoPosition(a.y,c.y,!0):c.y<a.y&&(0===d||90===d)?l.y=this.computeMidOrthoPosition(h.top,Math.max(c.y,k.bottom),!0):c.y>a.y&&(0===d||270===d)&&(l.y=this.computeMidOrthoPosition(h.bottom,Math.min(c.y,k.top),!0)),m.x=c.x,m.y=l.y;if(l.y>h.top&&l.y<h.bottom)if(c.x<=h.right&&c.x>=a.x||a.x>=k.left&&a.x<=c.x){if(90===d||270===d)l=new N(Math.min((a.x+c.x)/2,a.x),a.y),m=new N(l.x,c.y)}else l.y=270=== +d||(0===d||180===d)&&c.y<a.y?Math.min(c.y,180===d?h.top:Math.min(h.top,k.top)):Math.max(c.y,180===d?h.bottom:Math.max(h.bottom,k.bottom)),m.x=c.x,m.y=l.y}else if(90===b)if(c.y>a.y||180===d&&c.x<a.x&&k.bottom>a.y||0===d&&c.x>a.x&&k.bottom>a.y)l=new N(a.x,c.y),m=new N((a.x+c.x)/2,c.y),270===d?(l.y=this.computeMidOrthoPosition(a.y,c.y,!0),m.x=c.x,m.y=l.y):180===d&&c.x<a.x||0===d&&c.x>a.x?(l.y=a.y<k.top?this.computeMidOrthoPosition(a.y,k.top,!0):a.y<k.bottom&&(180===d&&a.x<k.left||0===d&&a.x>k.right)? +this.computeMidOrthoPosition(a.y,c.y,!0):k.bottom,m.x=c.x,m.y=l.y):90===d&&a.y<k.top&&a.x>k.left&&a.x<k.right&&(l.x=a.x<c.x?Math.min(c.x,k.left):Math.max(c.x,k.right),l.y=a.y,m.x=l.x);else{l=new N(c.x,a.y);m=new N(c.x,(a.y+c.y)/2);if(270===d||0===d&&c.x<h.left||180===d&&c.x>h.right)270===d&&(k.Ma(a)||h.Ma(c))?l.x=this.computeMidOrthoPosition(a.x,c.x,!1):c.x<a.x&&(270===d||0===d)?l.x=this.computeMidOrthoPosition(h.left,Math.max(c.x,k.right),!1):c.x>a.x&&(270===d||180===d)&&(l.x=this.computeMidOrthoPosition(h.right, +Math.min(c.x,k.left),!1)),m.x=l.x,m.y=c.y;if(l.x>h.left&&l.x<h.right)if(c.y>=h.top&&c.y<=a.y||a.y<=k.bottom&&a.y>=c.y){if(0===d||180===d)l=new N(a.x,Math.max((a.y+c.y)/2,a.y)),m=new N(c.x,l.y)}else l.x=180===d||(90===d||270===d)&&c.x<a.x?Math.min(c.x,90===d?h.left:Math.min(h.left,k.left)):Math.max(c.x,90===d?h.right:Math.max(h.right,k.right)),m.x=l.x,m.y=c.y}else if(c.y<a.y||180===d&&c.x<a.x&&k.top<a.y||0===d&&c.x>a.x&&k.top<a.y)l=new N(a.x,c.y),m=new N((a.x+c.x)/2,c.y),90===d?(l.y=this.computeMidOrthoPosition(a.y, +c.y,!0),m.x=c.x,m.y=l.y):180===d&&c.x<a.x||0===d&&c.x>=a.x?(l.y=a.y>k.bottom?this.computeMidOrthoPosition(a.y,k.bottom,!0):a.y>k.top&&(180===d&&a.x<k.left||0===d&&a.x>k.right)?this.computeMidOrthoPosition(a.y,c.y,!0):k.top,m.x=c.x,m.y=l.y):270===d&&a.y>k.bottom&&a.x>k.left&&a.x<k.right&&(l.x=a.x<c.x?Math.min(c.x,k.left):Math.max(c.x,k.right),l.y=a.y,m.x=l.x);else{l=new N(c.x,a.y);m=new N(c.x,(a.y+c.y)/2);if(90===d||0===d&&c.x<h.left||180===d&&c.x>h.right)90===d&&(k.Ma(a)||h.Ma(c))?l.x=this.computeMidOrthoPosition(a.x, +c.x,!1):c.x<a.x&&(90===d||0===d)?l.x=this.computeMidOrthoPosition(h.left,Math.max(c.x,k.right),!1):c.x>a.x&&(90===d||180===d)&&(l.x=this.computeMidOrthoPosition(h.right,Math.min(c.x,k.left),!1)),m.x=l.x,m.y=c.y;if(l.x>h.left&&l.x<h.right)if(c.y<=h.bottom&&c.y>=a.y||a.y>=k.top&&a.y<=c.y){if(0===d||180===d)l=new N(a.x,Math.min((a.y+c.y)/2,a.y)),m=new N(c.x,l.y)}else l.x=180===d||(90===d||270===d)&&c.x<a.x?Math.min(c.x,270===d?h.left:Math.min(h.left,k.left)):Math.max(c.x,270===d?h.right:Math.max(h.right, +k.right)),m.x=l.x,m.y=c.y}var n=l,p=m;if(this.kj){var q=this.h,r;(r=null===q)||(q.Ua.nf?r=!1:(r=q.cb,r=r instanceof lh?!r.tw||r.cI:!0),r=!r);if(r||h.Ma(c)&&!g.mi(e)||k.Ma(a)&&!e.mi(g)||e===g||this.layer.Nc)a=!1;else if(e=ja(q,!0,this.Va,null),e.Dp(Math.min(a.x,n.x),Math.min(a.y,n.y),Math.abs(a.x-n.x),Math.abs(a.y-n.y))&&e.Dp(Math.min(n.x,p.x),Math.min(n.y,p.y),Math.abs(n.x-p.x),Math.abs(n.y-p.y))&&e.Dp(Math.min(p.x,c.x),Math.min(p.y,c.y),Math.abs(p.x-c.x),Math.abs(p.y-c.y)))a=!1;else if(h=h.copy().ri(k), +h.bg(2*e.dp,2*e.bp),eq(e,a,b,c,d,h),k=fq(e,c.x,c.y),e.abort||999999!==k||(mm(e),k=e.MF,h.bg(e.dp*k,e.bp*k),eq(e,a,b,c,d,h),k=fq(e,c.x,c.y)),e.abort||999999!==k||(mm(e),k=e.VE,h.bg(e.dp*k,e.bp*k),eq(e,a,b,c,d,h),k=fq(e,c.x,c.y)),!e.abort&&999999===k&&e.fG&&(mm(e),eq(e,a,b,c,d,e.vb),k=fq(e,c.x,c.y)),!e.abort&&999999>k&&0!==fq(e,c.x,c.y)){gq(this,e,c.x,c.y,d,!0);d=this.m(2);if(4>this.sa)0===b||180===b?(d.x=a.x,d.y=c.y):(d.x=c.x,d.y=a.y),this.aa(2,d.x,d.y),this.B(3,d.x,d.y);else if(c=this.m(3),0===b|| +180===b)eb(d.x,c.x)?(b=0===b?Math.max(d.x,a.x):Math.min(d.x,a.x),this.aa(2,b,a.y),this.aa(3,b,c.y)):eb(d.y,c.y)?(Math.abs(a.y-d.y)<=e.bp/2&&(this.aa(2,d.x,a.y),this.aa(3,c.x,a.y)),this.B(2,d.x,a.y)):this.aa(2,a.x,d.y);else if(90===b||270===b)eb(d.y,c.y)?(b=90===b?Math.max(d.y,a.y):Math.min(d.y,a.y),this.aa(2,a.x,b),this.aa(3,c.x,b)):eb(d.x,c.x)?(Math.abs(a.x-d.x)<=e.dp/2&&(this.aa(2,a.x,d.y),this.aa(3,a.x,c.y)),this.B(2,a.x,d.y)):this.aa(2,d.x,a.y);a=!0}else a=!1}else a=!1;a||(this.hi(l),this.hi(m))}}; +G.prototype.computeMidOrthoPosition=function(a,b){if(this.hasCurviness()){var c=this.computeCurviness();return(a+b)/2+c}return(a+b)/2};function $h(a){if(null===a.h||!a.kj)return!1;var b=a.points.o,c=b.length;if(4>c)return!1;a=ja(a.h,!0,a.Va,null);for(var d=1;d<c-2;d++){var e=b[d],g=b[d+1];if(!a.Dp(Math.min(e.x,g.x),Math.min(e.y,g.y),Math.abs(e.x-g.x),Math.abs(e.y-g.y)))return!0}return!1} +function gq(a,b,c,d,e,g){var h=b.dp,k=b.bp,l=fq(b,c,d),m=c,n=d;for(0===e?m+=h:90===e?n+=k:180===e?m-=h:n-=k;1<l&&fq(b,m,n)===l-1;)c=m,d=n,0===e?m+=h:90===e?n+=k:180===e?m-=h:n-=k,l-=1;if(g){if(1<l)if(180===e||0===e)c=Math.floor(c/h)*h+h/2;else if(90===e||270===e)d=Math.floor(d/k)*k+k/2}else c=Math.floor(c/h)*h+h/2,d=Math.floor(d/k)*k+k/2;1<l&&(g=e,m=c,n=d,0===e?(g=90,n+=k):90===e?(g=180,m-=h):180===e?(g=270,n-=k):270===e&&(g=0,m+=h),fq(b,m,n)===l-1?gq(a,b,m,n,g,!1):(m=c,n=d,0===e?(g=270,n-=k):90=== +e?(g=0,m+=h):180===e?(g=90,n+=k):270===e&&(g=180,m-=h),fq(b,m,n)===l-1&&gq(a,b,m,n,g,!1)));a.tl(c,d)}G.prototype.findClosestSegment=function(a){u&&z.l(a,N,G,"findClosestSegment:p");var b=a.x;a=a.y;for(var c=this.m(0),d=this.m(1),e=ub(b,a,c.x,c.y,d.x,d.y),g=0,h=1;h<this.sa-1;h++){var c=this.m(h+1),k=ub(b,a,d.x,d.y,c.x,c.y),d=c;k<e&&(g=h,e=k)}return g};G.prototype.invalidateGeometry=G.prototype.qe=function(){this.kb=null}; +z.w(G,{wh:"geometry"},function(){null===this.kb&&(this.An(),this.kb=this.makeGeometry());return this.kb});G.prototype.nn=function(a){if(!a){if(!1===this.Dg)return;a=this.gf();if(null!==this.kb&&(null===a||null!==a.wh))return}this.kb=this.makeGeometry();a=this.path;if(null!==a){a.kb=this.kb;for(var b=this.va.o,c=b.length,d=0;d<c;d++){var e=b[d];e!==a&&e.Ff&&e instanceof X&&(e.kb=this.kb)}}}; +G.prototype.makeGeometry=function(){var a=this.sa;if(2>a){var b=new hf(jf),c=new kf(0,0);b.cc.add(c);return b}var d=!1,b=this.h;null!==b&&Up(this)&&b.Sk.contains(this)&&null!==this.cw&&(d=!0);var c=b=0,e=this.m(0).copy(),g=e.copy(),b=this.Yc.o,h=this.computeCurve();if(h===Xi&&3<=a&&!td(this.cq,0))if(3===a)var k=this.m(1),b=Math.min(e.x,k.x),c=Math.min(e.y,k.y),k=this.m(2),b=Math.min(b,k.x),c=Math.min(c,k.y);else{if(this.rc)for(k=0;k<a;k++)c=b[k],g.x=Math.min(c.x,g.x),g.y=Math.min(c.y,g.y);else for(k= +3;k<a;k+=3)k+3>=a&&(k=a-1),b=this.m(k),g.x=Math.min(b.x,g.x),g.y=Math.min(b.y,g.y);b=g.x;c=g.y}else{for(k=0;k<a;k++)c=b[k],g.x=Math.min(c.x,g.x),g.y=Math.min(c.y,g.y);b=g.x;c=g.y}b-=this.qz.x;c-=this.qz.y;e.x-=b;e.y-=c;if(2===a){var l=this.m(1).copy();l.x-=b;l.y-=c;0!==cq(this)&&hq(this,e,!0,g);0!==dq(this)&&hq(this,l,!1,g);b=new hf(mf);b.Ha=e.x;b.Da=e.y;b.L=l.x;b.M=l.y}else{l=z.v();0!==cq(this)&&hq(this,e,!0,g);R(l,e.x,e.y,!1,!1);if(h===Xi&&3<=a&&!td(this.cq,0))if(3===a)k=this.m(1),a=k.x-b,d=k.y- +c,k=this.m(2).copy(),k.x-=b,k.y-=c,0!==dq(this)&&hq(this,k,!1,g),S(l,a,d,a,d,k.x,k.y);else if(this.rc){for(var g=new N(b,c),e=this.m(1).copy(),h=new N(b,c),a=new N(b,c),d=this.m(0),m=null,n=this.cq/3,k=1;k<this.sa-1;k++){var m=this.m(k),p=d,q=m,r=this.m(iq(this,m,k,!1));if(!td(p.x,q.x)||!td(q.x,r.x))if(!td(p.y,q.y)||!td(q.y,r.y)){var s=n,t=h,v=a;isNaN(s)&&(s=this.cq/3);var x=p.x,p=p.y,y=q.x,q=q.y,A=r.x,r=r.y,C=s*jq(x,p,y,q),s=s*jq(y,q,A,r);td(p,q)&&td(y,A)&&(y>x?r>q?(t.x=y-C,t.y=q-C,v.x=y+s,v.y=q+ +s):(t.x=y-C,t.y=q+C,v.x=y+s,v.y=q-s):r>q?(t.x=y+C,t.y=q-C,v.x=y-s,v.y=q+s):(t.x=y+C,t.y=q+C,v.x=y-s,v.y=q-s));td(x,y)&&td(q,r)&&(q>p?(A>y?(t.x=y-C,t.y=q-C,v.x=y+s):(t.x=y+C,t.y=q-C,v.x=y-s),v.y=q+s):(A>y?(t.x=y-C,t.y=q+C,v.x=y+s):(t.x=y+C,t.y=q+C,v.x=y-s),v.y=q-s));if(td(x,y)&&td(y,A)||td(p,q)&&td(q,r))x=.5*(x+A),p=.5*(p+r),t.x=x,t.y=p,v.x=x,v.y=p;1===k?(e.x=.5*(d.x+m.x),e.y=.5*(d.y+m.y)):2===k&&td(d.x,this.m(0).x)&&td(d.y,this.m(0).y)&&(e.x=.5*(d.x+m.x),e.y=.5*(d.y+m.y));S(l,e.x-b,e.y-c,h.x-b,h.y- +c,m.x-b,m.y-c);g.set(h);e.set(a);d=m}}k=d.x;d=d.y;g=this.m(this.sa-1);k=.5*(k+g.x);d=.5*(d+g.y);S(l,a.x-b,a.y-c,k-b,d-c,g.x-b,g.y-c)}else for(k=3;k<a;k+=3)d=this.m(k-2),k+3>=a&&(k=a-1),g=this.m(k-1),e=this.m(k),k===a-1&&0!==dq(this)&&(e=e.copy(),hq(this,e,!1,Id)),S(l,d.x-b,d.y-c,g.x-b,g.y-c,e.x-b,e.y-c);else{g=z.O();g.assign(this.m(0));for(k=1;k<a;){k=iq(this,g,k,1<k);t=this.m(k);if(k>=a-1){g!==t&&(0!==dq(this)&&(t=t.copy(),hq(this,t,!1,Id)),kq(this,l,-b,-c,g,t,d));break}k=iq(this,t,k+1,k<a-3);e= +l;h=-b;m=-c;n=g;v=this.m(k);x=g;p=d;eb(n.y,t.y)&&eb(t.x,v.x)?(s=this.computeCorner(),s=Math.min(s,Math.abs(t.x-n.x)/2),s=y=Math.min(s,Math.abs(v.y-t.y)/2),eb(s,0)?(kq(this,e,h,m,n,t,p),x.assign(t)):(q=t.x,A=t.y,r=q,C=A,q=t.x>n.x?t.x-s:t.x+s,C=v.y>t.y?t.y+y:t.y-y,kq(this,e,h,m,n,new N(q,A),p),zf(e,t.x+h,t.y+m,r+h,C+m),x.n(r,C))):eb(n.x,t.x)&&eb(t.y,v.y)?(s=this.computeCorner(),y=Math.min(s,Math.abs(t.y-n.y)/2),y=s=Math.min(y,Math.abs(v.x-t.x)/2),eb(s,0)?(kq(this,e,h,m,n,t,p),x.assign(t)):(q=t.x,C= +A=t.y,A=t.y>n.y?t.y-y:t.y+y,r=v.x>t.x?t.x+s:t.x-s,kq(this,e,h,m,n,new N(q,A),p),zf(e,t.x+h,t.y+m,r+h,C+m),x.n(r,C))):(kq(this,e,h,m,n,t,p),x.assign(t))}z.A(g)}b=l.q;z.u(l)}return b};function jq(a,b,c,d){a=c-a;if(isNaN(a)||Infinity===a||-Infinity===a)return NaN;0>a&&(a=-a);b=d-b;if(isNaN(b)||Infinity===b||-Infinity===b)return NaN;0>b&&(b=-b);return td(a,0)?b:td(b,0)?a:Math.sqrt(a*a+b*b)} +function hq(a,b,c,d){var e=a.sa;if(!(2>e))if(c){var g=a.m(1);c=g.x-d.x;d=g.y-d.y;g=jq(b.x,b.y,c,d);0!==g&&(e=2===e?.5*g:g,a=cq(a),a>e&&(a=e),c=a*(c-b.x)/g,a=a*(d-b.y)/g,b.x+=c,b.y+=a)}else g=a.m(e-2),c=g.x-d.x,d=g.y-d.y,g=jq(b.x,b.y,c,d),0!==g&&(e=2===e?.5*g:g,a=dq(a),a>e&&(a=e),c=a*(b.x-c)/g,a=a*(b.y-d)/g,b.x-=c,b.y-=a)} +function iq(a,b,c,d){for(var e=a.sa,g=b;td(b.x,g.x)&&td(b.y,g.y);){if(c>=e)return e-1;g=a.m(c++)}if(!td(b.x,g.x)&&!td(b.y,g.y))return c-1;for(var h=g;td(b.x,g.x)&&td(g.x,h.x)&&(!d||(b.y>=g.y?g.y>=h.y:g.y<=h.y))||td(b.y,g.y)&&td(g.y,h.y)&&(!d||(b.x>=g.x?g.x>=h.x:g.x<=h.x));){if(c>=e)return e-1;h=a.m(c++)}return c-2} +function kq(a,b,c,d,e,g,h){if(!h&&Up(a)){h=[];var k=0;a.isVisible()&&(k=lq(a,e,g,h));var l=e.x,l=e.y;if(0<k)if(eb(e.y,g.y))if(e.x<g.x)for(var m=0;m<k;){var n=Math.max(e.x,Math.min(h[m++]-5,g.x-10));b.lineTo(n+c,g.y+d);for(var l=n+c,p=Math.min(n+10,g.x);m<k;){var q=h[m];if(q<p+10)m++,p=Math.min(q+5,g.x);else break}q=(n+p)/2+c;q=g.y-10+d;n=p+c;p=g.y+d;a.Se===Pi?R(b,n,p,!1,!1):S(b,l,q,n,q,n,p)}else for(m=k-1;0<=m;){n=Math.min(e.x,Math.max(h[m--]+5,g.x+10));b.lineTo(n+c,g.y+d);l=n+c;for(p=Math.max(n- +10,g.x);0<=m;)if(q=h[m],q>p-10)m--,p=Math.max(q-5,g.x);else break;q=g.y-10+d;n=p+c;p=g.y+d;a.Se===Pi?R(b,n,p,!1,!1):S(b,l,q,n,q,n,p)}else if(eb(e.x,g.x))if(e.y<g.y)for(m=0;m<k;){n=Math.max(e.y,Math.min(h[m++]-5,g.y-10));b.lineTo(g.x+c,n+d);l=n+d;for(p=Math.min(n+10,g.y);m<k;)if(q=h[m],q<p+10)m++,p=Math.min(q+5,g.y);else break;q=g.x-10+c;n=g.x+c;p+=d;a.Se===Pi?R(b,n,p,!1,!1):S(b,q,l,q,p,n,p)}else for(m=k-1;0<=m;){n=Math.min(e.y,Math.max(h[m--]+5,g.y+10));b.lineTo(g.x+c,n+d);l=n+d;for(p=Math.max(n- +10,g.y);0<=m;)if(q=h[m],q>p-10)m--,p=Math.max(q-5,g.y);else break;q=g.x-10+c;n=g.x+c;p+=d;a.Se===Pi?R(b,n,p,!1,!1):S(b,q,l,q,p,n,p)}}b.lineTo(g.x+c,g.y+d)} +function lq(a,b,c,d){var e=a.h;if(null===e||b.N(c))return 0;for(e=e.ln;e.next();){var g=e.value;if(null!==g&&g.visible)for(var g=g.mb.o,h=g.length,k=0;k<h;k++){var l=g[k];if(l instanceof G){if(l===a)return 0<d.length&&d.sort(function(a,b){return a-b}),d.length;if(l.isVisible()&&Up(l)){var m=l.tn;m.F()&&a.tn.Jg(m)&&!a.usesSamePort(l)&&(m=l.path,null!==m&&m.oj()&&mq(b,c,d,l))}}}}0<d.length&&d.sort(function(a,b){return a-b});return d.length} +function mq(a,b,c,d){for(var e=eb(a.y,b.y),g=d.sa,h=d.m(0),k=z.O(),l=1;l<g;l++){var m=d.m(l);if(l<g-1){var n=d.m(l+1);if(h.y===m.y&&m.y===n.y){if(m.x>h.x&&n.x>m.x||m.x<h.x&&n.x<m.x)m=n,l++}else h.x===m.x&&m.x===n.x&&(m.y>h.y&&n.y>m.y||m.y<h.y&&n.y<m.y)&&(m=n,l++)}a:{var n=k,p=a.x,q=a.y,r=b.x,s=b.y,t=h.x,h=h.y,v=m.x,x=m.y;if(!eb(p,r)){if(eb(q,s)&&eb(t,v)&&Math.min(p,r)<t&&Math.max(p,r)>t&&Math.min(h,x)<q&&Math.max(h,x)>q&&!eb(h,x)){n.x=t;n.y=q;n=!0;break a}}else if(!eb(q,s)&&eb(h,x)&&Math.min(q,s)< +h&&Math.max(q,s)>h&&Math.min(t,v)<p&&Math.max(t,v)>p&&!eb(t,v)){n.x=p;n.y=h;n=!0;break a}n.x=0;n.y=0;n=!1}n&&(e?c.push(k.x):c.push(k.y));h=m}z.A(k)}z.w(G,{Ct:"firstPickIndex"},function(){return 2>=this.sa?0:this.rc||Xp(this)!==Yb?1:0});z.w(G,{px:"lastPickIndex"},function(){var a=this.sa;return 0===a?0:2>=a?a-1:this.rc||Yp(this)!==Yb?a-2:a-1});function Up(a){a=a.Se;return a===Oi||a===Pi}function Wp(a,b){if(b||Up(a)){var c=a.h;null===c||c.Sk.contains(a)||null===a.cw||c.Sk.add(a,a.cw)}} +function Ri(a,b){var c=a.layer;if(null!==c&&c.visible&&!c.Nc){var d=c.h;if(null!==d)for(var e=!1,d=d.ln;d.next();){var g=d.value;if(g.visible)if(g===c)for(var e=!0,h=!1,g=g.mb.o,k=g.length,l=0;l<k;l++){var m=g[l];m instanceof G&&(m===a?h=!0:h&&nq(a,m,b))}else if(e)for(g=g.mb.o,k=g.length,l=0;l<k;l++)m=g[l],m instanceof G&&nq(a,m,b)}}}function nq(a,b,c){if(null!==b&&null!==b.kb&&Up(b)){var d=b.tn;d.F()&&(a.tn.Jg(d)||c.Jg(d))&&(a.usesSamePort(b)||b.qe())}} +G.prototype.usesSamePort=function(a){var b=this.sa,c=a.sa;if(0<b&&0<c){var d=this.m(0),e=a.m(0);if(d.Mc(e))return!0;b=this.m(b-1);a=a.m(c-1);if(b.Mc(a)||d.Mc(a)||b.Mc(e))return!0}else if(this.Y===a.Y||this.da===a.da||this.Y===a.da||this.da===a.Y)return!0;return!1}; +G.prototype.isVisible=function(){if(!D.prototype.isVisible.call(this))return!1;var a=this.Va,b=!0,c=this.h;null!==c&&(b=c.ce);c=this.Y;if(null!==c){if(this.Oc&&b&&!c.vd)return!1;if(c===a)return!0;c=c.findVisibleNode();if(null===c||c===a)return!1}c=this.da;if(null!==c){if(this.Oc&&!b&&!c.vd)return!1;if(c===a)return!0;b=c.findVisibleNode();if(null===b||b===a)return!1}return!0};G.prototype.wd=function(a){D.prototype.wd.call(this,a);null!==this.si&&this.si.zp();if(null!==this.Ke)for(var b=this.Ke.i;b.next();)b.value.wd(a)}; +z.defineProperty(G,{it:"adjusting"},function(){return this.mq},function(a){var b=this.mq;b!==a&&(u&&z.Ba(a,G,G,"adjusting"),this.mq=a,this.j("adjusting",b,a))});z.defineProperty(G,{Lz:"corner"},function(){return this.Fq},function(a){var b=this.Fq;b!==a&&(u&&z.g(a,"number",G,"corner"),this.Fq=a,this.qe(),this.j("corner",b,a))}); +z.defineProperty(G,{Se:"curve"},function(){return this.Iq},function(a){var b=this.Iq;b!==a&&(u&&z.Ba(a,G,G,"curve"),this.Iq=a,this.qc(),this.qe(),Wp(this,b===Pi||b===Oi||a===Pi||a===Oi),this.j("curve",b,a))});z.defineProperty(G,{Rw:"curviness"},function(){return this.Jq},function(a){var b=this.Jq;b!==a&&(u&&z.g(a,"number",G,"curviness"),this.Jq=a,this.qc(),this.qe(),this.j("curviness",b,a))}); +z.defineProperty(G,{Hx:"routing"},function(){return this.Cm},function(a){var b=this.Cm;b!==a&&(u&&z.Ba(a,G,G,"routing"),this.Cm=a,this.Ei=null,this.qc(),Wp(this,2===(b.value&2)||2===(a.value&2)),this.j("routing",b,a))});z.defineProperty(G,{cq:"smoothness"},function(){return this.Ms},function(a){var b=this.Ms;b!==a&&(u&&z.g(a,"number",G,"smoothness"),this.Ms=a,this.qe(),this.j("smoothness",b,a))}); +function Sp(a){var b=a.qg;if(null!==b){var c=a.Cg;if(null!==c){var d=a.Qh;a=a.fi;for(var e=null,g=null,h=b.mc.o,k=h.length,l=0;l<k;l++){var m=h[l];if(m.qg===b&&m.Qh===d&&m.Cg===c&&m.fi===a||m.qg===c&&m.Qh===a&&m.Cg===b&&m.fi===d)null===g?g=m:(null===e&&(e=[],e.push(g)),e.push(m))}if(null!==e){g=Fp(b,c,d,a);null===g&&(g=new yk,g.Op=b,g.zx=d,g.du=c,g.Ax=a,Ep(b,g),Ep(c,g));g.links=e;for(l=0;l<e.length;l++)m=e[l],m.si=g;g.zp()}}}} +function Rp(a){var b=a.si;null!==b&&(a.si=null,a=b.links.indexOf(a),0<=a&&(z.ii(b.links,a),b.zp()))}function yk(){z.kc(this);this.zv=!1;this.Ax=this.du=this.zx=this.Op=null;this.links=[]}yk.prototype.zp=function(){if(!this.zv){var a=this.links;0<a.length&&(a=a[0].h,null!==a&&a.jC.add(this))}this.zv=!0}; +yk.prototype.cB=function(){if(this.zv){this.zv=!1;var a=this.links;if(0<a.length){var b=a[0],c=b.h;b.arrangeBundledLinks(a,null===c||c.jn);1===a.length&&(b.si=null,a.length=0)}0===a.length&&(a=this.Op,null!==this&&null!==a.Jh&&a.Jh.remove(this),a=this.du,null!==this&&null!==a.Jh&&a.Jh.remove(this))}};z.Yd(yk,{Op:!0,zx:!0,du:!0,Ax:!0,links:!0,spacing:!0}); +function km(){z.kc(this);this.TA=this.group=null;this.yp=!0;this.abort=!1;this.Tf=this.Sf=1;this.Hr=this.Gr=-1;this.zd=this.Rd=8;this.lc=null;this.fG=!1;this.MF=22;this.VE=111}z.Yd(km,{group:!0,TA:!0,yp:!0,abort:!0,fG:!0,MF:!0,VE:!0}); +km.prototype.initialize=function(a){if(!(0>=a.width||0>=a.height)){var b=a.y,c=a.x+a.width,d=a.y+a.height;this.Sf=Math.floor((a.x-this.Rd)/this.Rd)*this.Rd;this.Tf=Math.floor((b-this.zd)/this.zd)*this.zd;this.Gr=Math.ceil((c+2*this.Rd)/this.Rd)*this.Rd;this.Hr=Math.ceil((d+2*this.zd)/this.zd)*this.zd;a=1+(Math.ceil((this.Gr-this.Sf)/this.Rd)|0);b=1+(Math.ceil((this.Hr-this.Tf)/this.zd)|0);if(null===this.lc||this.Nm<a-1||this.Om<b-1){c=[];for(d=0;d<=a;d++){for(var e=[],g=0;g<=b;g++)e[g]=0;c[d]=e}this.lc= +c;this.Nm=a-1;this.Om=b-1}if(null!==this.lc)for(a=0;a<=this.Nm;a++)for(b=0;b<=this.Om;b++)this.lc[a][b]=999999}};z.w(km,{vb:null},function(){return new w(this.Sf,this.Tf,this.Gr-this.Sf,this.Hr-this.Tf)});z.defineProperty(km,{dp:null},function(){return this.Rd},function(a){0<a&&a!==this.Rd&&(this.Rd=a,this.initialize(this.vb))});z.defineProperty(km,{bp:null},function(){return this.zd},function(a){0<a&&a!==this.zd&&(this.zd=a,this.initialize(this.vb))}); +function oq(a,b,c){return a.Sf<=b&&b<=a.Gr&&a.Tf<=c&&c<=a.Hr}function fq(a,b,c){if(!oq(a,b,c))return 0;b-=a.Sf;b/=a.Rd;c-=a.Tf;c/=a.zd;return a.lc[b|0][c|0]}function nm(a,b,c){oq(a,b,c)&&(b-=a.Sf,b/=a.Rd,c-=a.Tf,c/=a.zd,a.lc[b|0][c|0]=0)}function mm(a){if(null!==a.lc)for(var b=0;b<=a.Nm;b++)for(var c=0;c<=a.Om;c++)1<=a.lc[b][c]&&(a.lc[b][c]|=999999)} +km.prototype.Dp=function(a,b,c,d){if(a>this.Gr||a+c<this.Sf||b>this.Hr||b+d<this.Tf)return!0;a=(a-this.Sf)/this.Rd|0;b=(b-this.Tf)/this.zd|0;c=Math.max(0,c)/this.Rd+1|0;var e=Math.max(0,d)/this.zd+1|0;0>a&&(c+=a,a=0);0>b&&(e+=b,b=0);if(0>c||0>e)return!0;d=Math.min(a+c-1,this.Nm)|0;for(c=Math.min(b+e-1,this.Om)|0;a<=d;a++)for(e=b;e<=c;e++)if(0===this.lc[a][e])return!1;return!0}; +function pq(a,b,c,d,e,g,h,k,l){if(!(b<g||b>h||c<k||c>l)){var m,n;m=b|0;n=c|0;var p=a.lc[m][n];if(1<=p&&999999>p)for(e?n+=d:m+=d,p+=1;g<=m&&m<=h&&k<=n&&n<=l&&!(p>=a.lc[m][n]);)a.lc[m][n]=p,p+=1,e?n+=d:m+=d;m=e?n:m;if(e)if(0<d)for(c+=d;c<m;c+=d)pq(a,b,c,1,!e,g,h,k,l),pq(a,b,c,-1,!e,g,h,k,l);else for(c+=d;c>m;c+=d)pq(a,b,c,1,!e,g,h,k,l),pq(a,b,c,-1,!e,g,h,k,l);else if(0<d)for(b+=d;b<m;b+=d)pq(a,b,c,1,!e,g,h,k,l),pq(a,b,c,-1,!e,g,h,k,l);else for(b+=d;b>m;b+=d)pq(a,b,c,1,!e,g,h,k,l),pq(a,b,c,-1,!e,g,h, +k,l)}}function qq(a,b,c,d,e,g,h,k,l,m,n){for(var p=b|0,q=c|0,r=a.lc[p][q];0===r&&p>k&&p<l&&q>m&&q<n;)if(h?q+=g:p+=g,r=a.lc[p][q],1>=Math.abs(p-d)&&1>=Math.abs(q-e))return a.abort=!0,0;p=b|0;q=c|0;r=a.lc[p][q];b=1;for(a.lc[p][q]=b;0===r&&p>k&&p<l&&q>m&&q<n;)h?q+=g:p+=g,r=a.lc[p][q],a.lc[p][q]=b,b+=1;return h?q:p} +function eq(a,b,c,d,e,g){if(null!==a.lc){a.abort=!1;var h=b.x,k=b.y;if(oq(a,h,k)){var h=h-a.Sf,h=h/a.Rd,k=k-a.Tf,k=k/a.zd,l=d.x,m=d.y;if(oq(a,l,m))if(l-=a.Sf,l/=a.Rd,m-=a.Tf,m/=a.zd,1>=Math.abs(h-l)&&1>=Math.abs(k-m))a.abort=!0;else{var n=g.x;b=g.y;d=g.x+g.width;var p=g.y+g.height,n=n-a.Sf,n=n/a.Rd;b-=a.Tf;b/=a.zd;d-=a.Sf;d/=a.Rd;p-=a.Tf;p/=a.zd;g=Math.max(0,Math.min(a.Nm,n|0));d=Math.min(a.Nm,Math.max(0,d|0));b=Math.max(0,Math.min(a.Om,b|0));var p=Math.min(a.Om,Math.max(0,p|0)),h=h|0,k=k|0,l=l|0, +m=m|0,n=h,q=k,r=0===c||90===c?1:-1;(c=90===c||270===c)?q=qq(a,h,k,l,m,r,c,g,d,b,p):n=qq(a,h,k,l,m,r,c,g,d,b,p);if(!a.abort){a:{c=0===e||90===e?1:-1;e=90===e||270===e;for(var r=l|0,s=m|0,t=a.lc[r][s];0===t&&r>g&&r<d&&s>b&&s<p;)if(e?s+=c:r+=c,t=a.lc[r][s],1>=Math.abs(r-h)&&1>=Math.abs(s-k)){a.abort=!0;break a}r=l|0;s=m|0;t=a.lc[r][s];for(a.lc[r][s]=999999;0===t&&r>g&&r<d&&s>b&&s<p;)e?s+=c:r+=c,t=a.lc[r][s],a.lc[r][s]=999999}a.abort||(pq(a,n,q,1,!1,g,d,b,p),pq(a,n,q,-1,!1,g,d,b,p),pq(a,n,q,1,!0,g,d, +b,p),pq(a,n,q,-1,!0,g,d,b,p))}}}}}function aq(){z.kc(this);this.port=this.Pc=null;this.gg=[];this.Np=!1}z.Yd(aq,{Pc:!0,port:!0,gg:!0,Np:!0});aq.prototype.toString=function(){for(var a=this.gg,b=this.Pc.toString()+" "+a.length.toString()+":",c=0;c<a.length;c++){var d=a[c];null!==d&&(b+="\n "+d.toString())}return b}; +function rq(a,b,c,d){b=b.offsetY;switch(b){case z.ed:return 90;case z.Tc:return 180;case z.pd:return 270;case z.fd:return 0}switch(b){case z.ed|z.pd:return 180<c?270:90;case z.Tc|z.fd:return 90<c&&270>=c?180:0}a=180*Math.atan2(a.height,a.width)/Math.PI;switch(b){case z.Tc|z.pd:return c>a&&c<=180+a?180:270;case z.pd|z.fd:return c>180-a&&c<=360-a?270:0;case z.fd|z.ed:return c>a&&c<=180+a?90:0;case z.ed|z.Tc:return c>180-a&&c<=360-a?180:90;case z.Tc|z.pd|z.fd:return 90<c&&c<=180+a?180:c>180+a&&c<=360- +a?270:0;case z.pd|z.fd|z.ed:return 180<c&&c<=360-a?270:c>a&&180>=c?90:0;case z.fd|z.ed|z.Tc:return c>a&&c<=180-a?90:c>180-a&&270>=c?180:0;case z.ed|z.Tc|z.pd:return c>180-a&&c<=180+a?180:c>180+a?270:90}d&&b!==(z.Tc|z.pd|z.fd|z.ed)&&(c-=15,0>c&&(c+=360));return c>a&&c<180-a?90:c>=180-a&&c<=180+a?180:c>180+a&&c<360-a?270:0}aq.prototype.zp=function(){this.gg.length=0}; +function bq(a,b){var c=a.gg;if(0===c.length){a:if(!a.Np){c=a.Np;a.Np=!0;var d,e=null,g=a.Pc,g=g instanceof F?g:null;if(null===g||g.se)d=a.Pc.pE(a.port.yd);else{if(!g.W.F()){a.Np=c;break a}e=g;d=e.oE()}var h=a.gg.length=0,k=a.port.eb(Zb,z.O()),l=a.port.eb(ic,z.O()),g=z.zk(k.x,k.y,0,0);g.wj(l);z.A(k);z.A(l);k=z.Tb(g.x+g.width/2,g.y+g.height/2);for(d=d.i;d.next();)if(l=d.value,l.isVisible()){var m=Yb,n=l.md===a.port||l.Y.mi(e),m=n?Xp(l,a.port):Yp(l,a.port);if(m.lj()&&(n=n?l.Qd:l.md,null!==n)){var p= +n.ca;if(null!==p){var n=l.computeOtherPoint(p,n),p=k.Ec(n),m=rq(g,m,p,l.rc),q=0;0===m?(q=z.fd,180<p&&(p-=360)):q=90===m?z.ed:180===m?z.Tc:z.pd;m=a.gg[h];void 0===m?(m=new sq(l,p,q),a.gg[h]=m):(m.link=l,m.angle=p,m.te=q);m.xx.set(n);h++}}}z.A(k);a.gg.sort(aq.prototype.KI);e=a.gg.length;k=-1;for(h=d=0;h<e;h++)m=a.gg[h],void 0!==m&&(m.te!==k&&(k=m.te,d=0),m.wp=d,d++);k=-1;d=0;for(h=e-1;0<=h;h--)m=a.gg[h],void 0!==m&&(m.te!==k&&(k=m.te,d=m.wp+1),m.$m=d);h=a.gg;n=a.port;e=a.Pc.SI;k=z.O();d=z.O();l=z.O(); +m=z.O();n.eb(Zb,k);n.eb(cc,d);n.eb(ic,l);n.eb(gc,m);var r=q=p=n=0;if(e===Dp)for(var s=0;s<h.length;s++){var t=h[s];if(null!==t){var v=t.link.computeThickness();switch(t.te){case z.ed:q+=v;break;case z.Tc:r+=v;break;case z.pd:n+=v;break;default:case z.fd:p+=v}}}for(var x=0,y=0,A=1,s=0;s<h.length;s++)if(t=h[s],null!==t){var C,L;if(x!==t.te){x=t.te;switch(x){case z.ed:C=l;L=m;break;case z.Tc:C=m;L=k;break;case z.pd:C=k;L=d;break;default:case z.fd:C=d,L=l}var H=L.x-C.x;L=L.y-C.y;switch(x){case z.ed:q> +Math.abs(H)?(A=Math.abs(H)/q,q=Math.abs(H)):A=1;break;case z.Tc:r>Math.abs(L)?(A=Math.abs(L)/r,r=Math.abs(L)):A=1;break;case z.pd:n>Math.abs(H)?(A=Math.abs(H)/n,n=Math.abs(H)):A=1;break;default:case z.fd:p>Math.abs(L)?(A=Math.abs(L)/p,p=Math.abs(L)):A=1}y=0}var U=t.Fp;if(e===Dp){v=t.link.computeThickness();v*=A;U.set(C);switch(x){case z.ed:U.x=C.x+H/2+q/2-y-v/2;break;case z.Tc:U.y=C.y+L/2+r/2-y-v/2;break;case z.pd:U.x=C.x+H/2-n/2+y+v/2;break;default:case z.fd:U.y=C.y+L/2-p/2+y+v/2}y+=v}else v=.5, +e===Ap&&(v=(t.wp+1)/(t.$m+1)),U.x=C.x+H*v,U.y=C.y+L*v}z.A(k);z.A(d);z.A(l);z.A(m);C=a.gg;for(H=0;H<C.length;H++)L=C[H],null!==L&&(L.Vw=a.computeEndSegmentLength(L));a.Np=c;z.dc(g)}c=a.gg}for(g=0;g<c.length;g++)if(C=c[g],null!==C&&C.link===b)return C;return null}aq.prototype.KI=function(a,b){return a===b?0:null===a?-1:null===b?1:a.te<b.te?-1:a.te>b.te?1:a.angle<b.angle?-1:a.angle>b.angle?1:0}; +aq.prototype.computeEndSegmentLength=function(a){var b=a.link,c=b.computeEndSegmentLength(this.Pc,this.port,Yb,b.md===this.port),d=a.wp;if(0>d)return c;var e=a.$m;if(1>=e||!b.rc)return c;var b=a.xx,g=a.Fp;if(a.te===z.Tc||a.te===z.ed)d=e-1-d;return((a=a.te===z.Tc||a.te===z.fd)?b.y<g.y:b.x<g.x)?c+8*d:(a?b.y===g.y:b.x===g.x)?c:c+8*(e-1-d)};function sq(a,b,c){this.link=a;this.angle=b;this.te=c;this.xx=new N;this.$m=this.wp=0;this.Fp=new N;this.Vw=0} +z.Yd(sq,{link:!0,angle:!0,te:!0,xx:!0,wp:!0,$m:!0,Fp:!0,Vw:!0});sq.prototype.toString=function(){return this.link.toString()+" "+this.angle.toString()+" "+this.te.toString()+":"+this.wp.toString()+"/"+this.$m.toString()+" "+this.Fp.toString()+" "+this.Vw.toString()+" "+this.xx.toString()};function Gm(){this.hk=this.Hj=Pc;this.fk=this.Fj=NaN;this.ek=this.Ej=Bp;this.gk=this.Gj=NaN} +Gm.prototype.copy=function(){var a=new Gm;a.Hj=this.Hj.V();a.hk=this.hk.V();a.Fj=this.Fj;a.fk=this.fk;a.Ej=this.Ej;a.ek=this.ek;a.Gj=this.Gj;a.gk=this.gk;return a};function F(a){0===arguments.length?E.call(this,hj):E.call(this,a);this.Jr=new K(D);this.vm=new K(F);this.il=this.Kr=this.Ir=null;this.$s=!1;this.pr=!0;this.at=!1;this.Lb=this.Qs=null;this.xq=!1;this.yq=!0;this.er=this.zq=!1;this.he=new yg;this.he.group=this;this.ez=!1}z.Qa(F,E);z.ia("Group",F); +F.prototype.cloneProtected=function(a){E.prototype.cloneProtected.call(this,a);a.Ir=this.Ir;a.Kr=this.Kr;a.il=this.il;a.$s=this.$s;a.pr=this.pr;a.at=this.at;a.Qs=this.Qs;var b=a.zt(function(a){return a instanceof bj});a.Lb=b instanceof bj?b:null;a.xq=this.xq;a.yq=this.yq;a.zq=this.zq;a.er=this.er;null!==this.he?(a.he=this.he.copy(),a.he.group=a):(null!==a.he&&(a.he.group=null),a.he=null)}; +F.prototype.ki=function(a){E.prototype.ki.call(this,a);var b=a.mp();for(a=a.Hc;a.next();){var c=a.value;c.Q();c.I(8);c.pt();if(c instanceof E)c.mf(b);else if(c instanceof G)for(c=c.Hf;c.next();)c.value.mf(b)}}; +F.prototype.sn=function(a,b,c,d,e,g,h){if(a===Wf&&"elements"===b)if(e instanceof bj){var k=e;null===this.Lb?this.Lb=k:this.Lb!==k&&z.k("Cannot insert a second Placeholder into the visual tree of a Group.")}else e instanceof I&&(k=e.zt(function(a){return a instanceof bj}),k instanceof bj&&(null===this.Lb?this.Lb=k:this.Lb!==k&&z.k("Cannot insert a second Placeholder into the visual tree of a Group.")));else a===Xf&&"elements"===b&&null!==this.Lb&&(d===this.Lb?this.Lb=null:d instanceof I&&this.Lb.Pl(d)&& +(this.Lb=null));E.prototype.sn.call(this,a,b,c,d,e,g,h)};F.prototype.aj=function(a,b,c,d){this.hl=this.Lb;I.prototype.aj.call(this,a,b,c,d)};F.prototype.Ql=function(){if(!E.prototype.Ql.call(this))return!1;for(var a=this.Hc;a.next();){var b=a.value;if(b instanceof E){if(b.isVisible()&&ol(b))return!1}else if(b instanceof G&&b.isVisible()&&ol(b)&&b.Y!==this&&b.da!==this)return!1}return!0};z.w(F,{placeholder:"placeholder"},function(){return this.Lb}); +z.defineProperty(F,{UD:"computesBoundsAfterDrag"},function(){return this.xq},function(a){var b=this.xq;b!==a&&(z.g(a,"boolean",F,"computesBoundsAfterDrag"),this.xq=a,this.j("computesBoundsAfterDrag",b,a))});z.defineProperty(F,{Ow:"computesBoundsIncludingLinks"},function(){return this.yq},function(a){z.g(a,"boolean",F,"computesBoundsIncludingLinks");var b=this.yq;b!==a&&(this.yq=a,this.j("computesBoundsIncludingLinks",b,a))}); +z.defineProperty(F,{fH:"computesBoundsIncludingLocation"},function(){return this.zq},function(a){z.g(a,"boolean",F,"computesBoundsIncludingLocation");var b=this.zq;b!==a&&(this.zq=a,this.j("computesBoundsIncludingLocation",b,a))});z.defineProperty(F,{TH:"handlesDragDropForMembers"},function(){return this.er},function(a){z.g(a,"boolean",F,"handlesDragDropForMembers");var b=this.er;b!==a&&(this.er=a,this.j("handlesDragDropForMembers",b,a))});z.w(F,{Hc:"memberParts"},function(){return this.Jr.i}); +function wp(a,b){if(a.Jr.add(b)){b instanceof F&&a.vm.add(b);var c=a.CI;if(null!==c){var d=!0,e=a.h;null!==e&&(d=e.$a,e.$a=!0);c(a,b);null!==e&&(e.$a=d)}a.isVisible()&&a.se||b.wd(!1)}b instanceof G&&!a.Ow||(c=a.Lb,null===c&&(c=a),c.Q())}function vp(a,b){if(a.Jr.remove(b)){b instanceof F&&a.vm.remove(b);var c=a.DI;if(null!==c){var d=!0,e=a.h;null!==e&&(d=e.$a,e.$a=!0);c(a,b);null!==e&&(e.$a=d)}a.isVisible()&&a.se||b.wd(!0)}b instanceof G&&!a.Ow||(c=a.Lb,null===c&&(c=a),c.Q())} +F.prototype.bn=function(){if(0<this.Jr.count){var a=this.h;if(null!==a)for(var b=this.Jr.copy().i;b.next();)a.remove(b.value)}E.prototype.bn.call(this)};z.defineProperty(F,{Sb:"layout"},function(){return this.he},function(a){var b=this.he;b!==a&&(null!==a&&z.l(a,yg,F,"layout"),null!==b&&(b.h=null,b.group=null),this.he=a,null!==a&&(a.h=this.h,a.group=this),this.j("layout",b,a))}); +z.defineProperty(F,{CI:"memberAdded"},function(){return this.Ir},function(a){var b=this.Ir;b!==a&&(null!==a&&z.g(a,"function",F,"memberAdded"),this.Ir=a,this.j("memberAdded",b,a))});z.defineProperty(F,{DI:"memberRemoved"},function(){return this.Kr},function(a){var b=this.Kr;b!==a&&(null!==a&&z.g(a,"function",F,"memberRemoved"),this.Kr=a,this.j("memberRemoved",b,a))}); +z.defineProperty(F,{pA:"memberValidation"},function(){return this.il},function(a){var b=this.il;b!==a&&(null!==a&&z.g(a,"function",F,"memberValidation"),this.il=a,this.j("memberValidation",b,a))});F.prototype.canAddMembers=function(a){var b=this.h;if(null===b)return!1;b=b.wb;for(a=nh(a).i;a.next();)if(!b.isValidMember(this,a.value))return!1;return!0}; +F.prototype.addMembers=function(a,b){var c=this.h;if(null===c)return!1;for(var c=c.wb,d=!0,e=nh(a).i;e.next();){var g=e.value;!b||c.isValidMember(this,g)?g.Va=this:d=!1}return d};z.defineProperty(F,{zJ:"ungroupable"},function(){return this.$s},function(a){var b=this.$s;b!==a&&(z.g(a,"boolean",F,"ungroupable"),this.$s=a,this.j("ungroupable",b,a))});F.prototype.canUngroup=function(){if(!this.zJ)return!1;var a=this.layer;if(null!==a&&!a.Iw)return!1;a=a.h;return null===a||a.Iw?!0:!1}; +F.prototype.mf=function(a){void 0===a&&(a=null);E.prototype.mf.call(this,a);for(var b=this.oE();b.next();){var c=b.value;if(null===a||!a.contains(c)){var d=c.Y;null!==d&&d!==this&&d.mi(this)&&!d.isVisible()?c.qc():(d=c.da,null!==d&&d!==this&&d.mi(this)&&!d.isVisible()&&c.qc())}}};F.prototype.findExternalLinksConnected=F.prototype.oE=function(){var a=this.mp();a.add(this);for(var b=new K(G),c=a.i;c.next();){var d=c.value;if(d instanceof E)for(d=d.ee;d.next();){var e=d.value;a.contains(e)||b.add(e)}}return b.i}; +F.prototype.findExternalNodesConnected=function(){var a=this.mp();a.add(this);for(var b=new K(E),c=a.i;c.next();){var d=c.value;if(d instanceof E)for(d=d.ee;d.next();){var e=d.value,g=e.Y;a.contains(g)&&g!==this||b.add(g);e=e.da;a.contains(e)&&e!==this||b.add(e)}}return b.i};F.prototype.findContainingGroupChain=function(){function a(b,d){null!==b&&(d.add(b),a(b.Va,d))}var b=new K(D);a(this,b);return b}; +F.prototype.findSubGraphParts=F.prototype.mp=function(){var a=new K(D);hh(a,this,!0,0,!0);a.remove(this);return a};F.prototype.wd=function(a){E.prototype.wd.call(this,a);for(var b=this.Hc;b.next();)b.value.wd(a)};F.prototype.collapseSubGraph=F.prototype.collapseSubGraph=function(){var a=this.h;if(null!==a&&!a.xh){a.xh=!0;var b=this.mp();tq(this,b,a.Ua,this);a.xh=!1}}; +function tq(a,b,c,d){for(var e=a.Hc;e.next();){var g=e.value;g.wd(!1);if(g instanceof F){var h=g;h.se&&(h.eB=h.se,tq(h,b,c,d))}if(g instanceof E)g.mf(b),gk(c,g,d);else if(g instanceof G)for(g=g.Hf;g.next();)g.value.mf(b)}a.se=!1}F.prototype.expandSubGraph=F.prototype.expandSubGraph=function(){var a=this.h;if(null!==a&&!a.xh){a.xh=!0;var b=this.mp();uq(this,b,a.Ua,this);a.xh=!1}}; +function uq(a,b,c,d){for(var e=a.Hc;e.next();){var g=e.value;g.wd(!0);if(g instanceof F){var h=g;h.eB&&(h.eB=!1,uq(h,b,c,d))}if(g instanceof E)g.mf(b),fk(c,g,d);else if(g instanceof G)for(g=g.Hf;g.next();)g.value.mf(b)}a.se=!0} +z.defineProperty(F,{se:"isSubGraphExpanded"},function(){return this.pr},function(a){var b=this.pr;if(b!==a){z.g(a,"boolean",F,"isSubGraphExpanded");this.pr=a;var c=this.h;this.j("isSubGraphExpanded",b,a);b=this.pJ;if(null!==b){var d=!0;null!==c&&(d=c.$a,c.$a=!0);b(this);null!==c&&(c.$a=d)}null!==c&&c.pa.qb?null!==this.Lb&&this.Lb.Q():a?this.expandSubGraph():this.collapseSubGraph()}}); +z.defineProperty(F,{eB:"wasSubGraphExpanded"},function(){return this.at},function(a){var b=this.at;b!==a&&(z.g(a,"boolean",F,"wasSubGraphExpanded"),this.at=a,this.j("wasSubGraphExpanded",b,a))});z.defineProperty(F,{pJ:"subGraphExpandedChanged"},function(){return this.Qs},function(a){var b=this.Qs;b!==a&&(null!==a&&z.g(a,"function",F,"subGraphExpandedChanged"),this.Qs=a,this.j("subGraphExpandedChanged",b,a))}); +F.prototype.move=function(a){var b=this.position,c=b.x;isNaN(c)&&(c=0);b=b.y;isNaN(b)&&(b=0);var c=a.x-c,b=a.y-b,d=z.Tb(c,b);E.prototype.move.call(this,a);for(a=this.mp().i;a.next();){var e=a.value;if(!(e instanceof G||e instanceof E&&e.Df)){var g=e.position,h=e.location;g.F()?(d.x=g.x+c,d.y=g.y+b,e.position=d):h.F()&&(d.x=h.x+c,d.y=h.y+b,e.location=d)}}for(a.reset();a.next();)e=a.value,e instanceof G&&(g=e.position,d.x=g.x+c,d.y=g.y+b,e.move(d));z.A(d)}; +function bj(){O.call(this);this.df=Kd;this.ws=new w(NaN,NaN,NaN,NaN)}z.Qa(bj,O);z.ia("Placeholder",bj);bj.prototype.cloneProtected=function(a){O.prototype.cloneProtected.call(this,a);a.df=this.df.V();a.ws=this.ws.copy()};bj.prototype.mk=function(a){if(null===this.background&&null===this.wl)return!1;var b=this.Ga;return Jb(0,0,b.width,b.height,a.x,a.y)}; +bj.prototype.Ip=function(){var a=this.ca;null!==a&&(a instanceof F||a instanceof da)||z.k("Placeholder is not inside a Group or Adornment.");if(a instanceof F){var b=this.computeBorder(this.ws),c=this.Wc;yb(c,b.width||0,b.height||0);Km(this,0,0,c.width,c.height);for(var c=a.Hc,d=!1;c.next();)if(c.value.isVisible()){d=!0;break}!d||isNaN(b.x)||isNaN(b.y)||(c=new N,c.ru(b,a.of),a.location=new N(c.x,c.y))}else{var b=this.Aa,c=this.Wc,d=this.padding,e=d.left+d.right,g=d.top+d.bottom;if(b.F())yb(c,b.width+ +e||0,b.height+g||0),Km(this,-d.left,-d.top,c.width,c.height);else{var h=a.fc,k=h.eb(Zb,z.O()),b=z.zk(k.x,k.y,0,0);b.wj(h.eb(ic,k));b.wj(h.eb(cc,k));b.wj(h.eb(gc,k));a.Li.n(b.x,b.y);yb(c,b.width+e||0,b.height+g||0);Km(this,-d.left,-d.top,c.width,c.height);z.A(k);z.dc(b)}}};bj.prototype.aj=function(a,b,c,d){var e=this.W;e.x=a;e.y=b;e.width=c;e.height=d}; +bj.prototype.computeBorder=function(a){var b=this.ca;if(b instanceof F){var c=b;if(c.UD&&this.ws.F()){var d=c.h;if(null!==d&&(d=d.cb,d instanceof lh&&!d.Uq&&null!==d.hc&&!d.hc.contains(c)))return a.assign(this.ws),a}}var c=z.lg(),d=this.computeMemberBounds(c),e=this.padding;a.n(d.x-e.left,d.y-e.top,d.width+e.left+e.right,d.height+e.top+e.bottom);z.dc(c);b instanceof F&&(c=b,c.fH&&c.location.F()&&a.wj(c.location));return a}; +bj.prototype.computeMemberBounds=function(a){if(!(this.ca instanceof F))return a.n(0,0,0,0),a;for(var b=this.ca,c=Infinity,d=Infinity,e=-Infinity,g=-Infinity,h=b.Hc;h.next();){var k=h.value;if(k.isVisible()){if(k instanceof G){var l=k;if(!b.Ow)continue;if(nl(l))continue;if(l.Y===b||l.da===b)continue}k=k.W;k.left<c&&(c=k.left);k.top<d&&(d=k.top);k.right>e&&(e=k.right);k.bottom>g&&(g=k.bottom)}}isFinite(c)&&isFinite(d)?a.n(c,d,e-c,g-d):(b=b.location,c=this.padding,a.n(b.x+c.left,b.y+c.top,0,0));return a}; +z.defineProperty(bj,{padding:"padding"},function(){return this.df},function(a){"number"===typeof a?((isNaN(a)||0>a)&&z.ka(a,">= 0",bj,"padding"),a=new Db(a)):(z.l(a,Db,bj,"padding"),(isNaN(a.left)||0>a.left)&&z.ka(a.left,">= 0",bj,"padding:value.left"),(isNaN(a.right)||0>a.right)&&z.ka(a.right,">= 0",bj,"padding:value.right"),(isNaN(a.top)||0>a.top)&&z.ka(a.top,">= 0",bj,"padding:value.top"),(isNaN(a.bottom)||0>a.bottom)&&z.ka(a.bottom,">= 0",bj,"padding:value.bottom"));var b=this.df;b.N(a)||(this.df= +a=a.V(),this.j("padding",b,a))});function yg(){0<arguments.length&&z.od(yg);z.kc(this);this.Qy=this.Z=null;this.Lj=this.lr=!0;this.ur=!1;this.pq=(new N(0,0)).freeze();this.nr=this.or=!0;this.VB="";this.to=!1;this.fz=null}z.ia("Layout",yg);yg.prototype.cloneProtected=function(a){a.lr=this.lr;a.Lj=this.Lj;a.ur=this.ur;a.pq.assign(this.pq);a.or=this.or;a.nr=this.nr;a.VB=this.VB;this.Lj||(a.to=!0)};yg.prototype.copy=function(){var a=new this.constructor;this.cloneProtected(a);return a}; +yg.prototype.toString=function(){var a=z.kf(Object.getPrototypeOf(this)),a=a+"(";null!==this.group&&(a+=" in "+this.group);null!==this.h&&(a+=" for "+this.h);return a+")"};z.defineProperty(yg,{h:"diagram"},function(){return this.Z},function(a){null!==a&&z.l(a,B,yg,"diagram");this.Z=a});z.defineProperty(yg,{group:"group"},function(){return this.Qy},function(a){this.Qy!==a&&(null!==a&&z.l(a,F,yg,"group"),this.Qy=a,null!==a&&(this.Z=a.h))}); +z.defineProperty(yg,{hI:"isOngoing"},function(){return this.lr},function(a){this.lr!==a&&(z.g(a,"boolean",yg,"isOngoing"),this.lr=a)});z.defineProperty(yg,{QE:"isInitial"},function(){return this.Lj},function(a){z.g(a,"boolean",yg,"isInitial");this.Lj=a;a||(this.to=!0)});z.defineProperty(yg,{nx:"isViewportSized"},function(){return this.ur},function(a){this.ur!==a&&(z.g(a,"boolean",yg,"isViewportSized"),(this.ur=a)&&this.I())}); +z.defineProperty(yg,{Rt:"isRouting"},function(){return this.or},function(a){this.or!==a&&(z.g(a,"boolean",yg,"isRouting"),this.or=a)});z.defineProperty(yg,{RE:"isRealtime"},function(){return this.nr},function(a){this.nr!==a&&(z.g(a,"boolean",yg,"isRealtime"),this.nr=a)});z.defineProperty(yg,{Gf:"isValidLayout"},function(){return this.to},function(a){this.to!==a&&(z.g(a,"boolean",yg,"isValidLayout"),this.to=a,a||(a=this.h,null!==a&&(a.Qu=!0)))}); +yg.prototype.invalidateLayout=yg.prototype.I=function(){if(this.to){var a=this.h;if(null!==a&&!a.pa.qb){var b=a.Ua;!b.so&&(b.nf&&b.pi(),this.hI&&a.jn||this.QE&&!a.jn)&&(this.Gf=!1,a.Ce())}}};z.defineProperty(yg,{network:"network"},function(){return this.fz},function(a){var b=this.fz;b!==a&&(null!==a&&z.l(a,wa,yg,"network"),null!==b&&(b.Sb=null),this.fz=a,null!==a&&(a.Sb=this))});yg.prototype.createNetwork=function(){return new wa}; +yg.prototype.makeNetwork=function(a){var b=this.createNetwork();b.Sb=this;a instanceof B?(b.jk(a.Mg,!0),b.jk(a.links,!0)):a instanceof F?b.jk(a.Hc):b.jk(a.i);return b};yg.prototype.updateParts=function(){var a=this.h;if(null===a&&null!==this.network)for(var b=this.network.vertexes.i;b.next();){var c=b.value.Pc;if(null!==c&&(a=c.h,null!==a))break}this.Gf=!0;try{null!==a&&a.Wb("Layout"),this.commitLayout()}finally{null!==a&&a.Jd("Layout")}}; +yg.prototype.commitLayout=function(){for(var a=this.network.vertexes.i;a.next();)a.value.commit();if(this.Rt)for(a=this.network.edges.i;a.next();)a.value.commit()}; +yg.prototype.doLayout=function(a){null===a&&z.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts");var b=new K(D);a instanceof B?(vq(this,b,a.Mg,!0,this.vA,!0,!1,!0),vq(this,b,a.oi,!0,this.vA,!0,!1,!0)):a instanceof F?vq(this,b,a.Hc,!1,this.vA,!0,!1,!0):b.$c(a.i);var c=b.count;if(0<c){a=this.h;null!==a&&a.Wb("Layout");for(var c=Math.ceil(Math.sqrt(c)),d=this.je.x,e=d,g=this.je.y,h=0,k=0,b=b.i;b.next();){var l=b.value;l.Bf();var m=l.Ia,n=m.width, +m=m.height;l.moveTo(e,g);l.ez=!1;e+=Math.max(n,50)+20;k=Math.max(k,Math.max(m,50));h>=c-1?(h=0,e=d,g+=k+20,k=0):h++}null!==a&&a.Jd("Layout")}this.Gf=!0};yg.prototype.vA=function(a){return!a.location.F()||a instanceof F&&a.ez?!0:!1}; +function vq(a,b,c,d,e,g,h,k){for(c=c.i;c.next();){var l=c.value;d&&!l.Bp||null!==e&&!e(l)||!l.canLayout()||(g&&l instanceof E?l.Df||(l instanceof F?null===l.Sb?vq(a,b,l.Hc,!1,e,g,h,k):b.add(l):b.add(l)):h&&l instanceof G?b.add(l):!k||!l.be()||l instanceof E||b.add(l))}} +yg.prototype.collectParts=yg.prototype.$G=function(a){var b=new K(D);a instanceof B?(vq(this,b,a.Mg,!0,null,!0,!0,!0),vq(this,b,a.links,!0,null,!0,!0,!0),vq(this,b,a.oi,!0,null,!0,!0,!0)):a instanceof F?vq(this,b,a.Hc,!1,null,!0,!0,!0):vq(this,b,a.i,!1,null,!0,!0,!0);return b};z.defineProperty(yg,{je:"arrangementOrigin"},function(){return this.pq},function(a){z.l(a,N,yg,"arrangementOrigin");this.pq.N(a)||(this.pq.assign(a),this.I())}); +yg.prototype.initialOrigin=function(a){var b=this.group;if(null!==b){var c=b.position.copy();(isNaN(c.x)||isNaN(c.y))&&c.set(a);b=b.placeholder;null!==b&&(c=b.eb(Zb),(isNaN(c.x)||isNaN(c.y))&&c.set(a),c.x+=b.padding.left,c.y+=b.padding.top);return c}return a};function wa(){z.kc(this);this.he=null;this.clear()}z.ia("LayoutNetwork",wa); +wa.prototype.clear=function(){if(this.vertexes)for(var a=this.vertexes.i;a.next();){var b=a.value;b.clear();b.network=null}if(this.edges)for(a=this.edges.i;a.next();)b=a.value,b.clear(),b.network=null;this.vertexes=new K(xa);this.edges=new K(ya);this.zA=new na(E,xa);this.lA=new na(G,ya)}; +wa.prototype.toString=function(a){void 0===a&&(a=0);var b="LayoutNetwork"+(null!==this.Sb?"("+this.Sb.toString()+")":"");if(0>=a)return b;b+=" vertexes: "+this.vertexes.count+" edges: "+this.edges.count;if(1<a){for(var c=this.vertexes.i;c.next();)b+="\n "+c.value.toString(a-1);for(c=this.edges.i;c.next();)b+="\n "+c.value.toString(a-1)}return b};z.defineProperty(wa,{Sb:"layout"},function(){return this.he},function(a){u&&null!==a&&z.l(a,yg,wa,"layout");this.he=a});wa.prototype.createVertex=function(){return new xa}; +wa.prototype.createEdge=function(){return new ya}; +wa.prototype.addParts=wa.prototype.jk=function(a,b,c){if(null!==a){void 0===b&&(b=!1);z.g(b,"boolean",wa,"addParts:toplevelonly");void 0===c&&(c=null);null===c&&(c=function(a){if(a instanceof E)return!a.Df;if(a instanceof G){var b=a.Y;if(null===b||b.Df)return!1;a=a.da;return null===a||a.Df?!1:!0}return!1});for(a=a.i;a.next();){var d=a.value;if(d instanceof E&&(!b||d.Bp)&&d.canLayout()&&c(d))if(d instanceof F&&null===d.Sb)this.jk(d.Hc,!1);else if(null===this.dn(d)){var e=this.createVertex();e.Pc=d; +this.ul(e)}}for(a.reset();a.next();)if(d=a.value,d instanceof G&&(!b||d.Bp)&&d.canLayout()&&c(d)&&null===this.Xw(d)){var g=d.Y,e=d.da;null!==g&&null!==e&&g!==e&&(g=this.findGroupVertex(g),e=this.findGroupVertex(e),null!==g&&null!==e&&this.Hp(g,e,d))}}};wa.prototype.findGroupVertex=function(a){if(null===a)return null;var b=a.findVisibleNode();if(null===b)return null;a=this.dn(b);if(null!==a)return a;for(b=b.Va;null!==b;){a=this.dn(b);if(null!==a)return a;b=b.Va}return null}; +wa.prototype.addVertex=wa.prototype.ul=function(a){if(null!==a){u&&z.l(a,xa,wa,"addVertex:vertex");this.vertexes.add(a);var b=a.Pc;null!==b&&this.zA.add(b,a);a.network=this}};wa.prototype.addNode=wa.prototype.ht=function(a){if(null===a)return null;u&&z.l(a,E,wa,"addNode:node");var b=this.dn(a);null===b&&(b=this.createVertex(),b.Pc=a,this.ul(b));return b}; +wa.prototype.deleteVertex=wa.prototype.fE=function(a){if(null!==a&&(u&&z.l(a,xa,wa,"deleteVertex:vertex"),wq(this,a))){for(var b=a.Ze,c=b.count-1;0<=c;c--){var d=b.ea(c);this.hp(d)}b=a.Te;for(c=b.count-1;0<=c;c--)d=b.ea(c),this.hp(d)}};function wq(a,b){if(null===b)return!1;var c=a.vertexes.remove(b);c&&(a.zA.remove(b.Pc),b.network=null);return c}wa.prototype.deleteNode=function(a){null!==a&&(u&&z.l(a,E,wa,"deleteNode:node"),a=this.dn(a),null!==a&&this.fE(a))}; +wa.prototype.findVertex=wa.prototype.dn=function(a){if(null===a)return null;u&&z.l(a,E,wa,"findVertex:node");return this.zA.na(a)};wa.prototype.addEdge=wa.prototype.Zo=function(a){if(null!==a){u&&z.l(a,ya,wa,"addEdge:edge");this.edges.add(a);var b=a.link;null!==b&&null===this.Xw(b)&&this.lA.add(b,a);b=a.toVertex;null!==b&&b.ED(a);b=a.fromVertex;null!==b&&b.DD(a);a.network=this}}; +wa.prototype.addLink=function(a){if(null===a)return null;u&&z.l(a,G,wa,"addLink:link");var b=a.Y,c=a.da,d=this.Xw(a);null===d?(d=this.createEdge(),d.link=a,null!==b&&(d.fromVertex=this.ht(b)),null!==c&&(d.toVertex=this.ht(c)),this.Zo(d)):(d.fromVertex=null!==b?this.ht(b):null,d.toVertex=null!==c?this.ht(c):null);return d};wa.prototype.deleteEdge=wa.prototype.hp=function(a){if(null!==a){u&&z.l(a,ya,wa,"deleteEdge:edge");var b=a.toVertex;null!==b&&b.eE(a);b=a.fromVertex;null!==b&&b.dE(a);xq(this,a)}}; +function xq(a,b){null!==b&&a.edges.remove(b)&&(a.lA.remove(b.link),b.network=null)}wa.prototype.deleteLink=function(a){null!==a&&(u&&z.l(a,G,wa,"deleteLink:link"),a=this.Xw(a),null!==a&&this.hp(a))};wa.prototype.findEdge=wa.prototype.Xw=function(a){if(null===a)return null;u&&z.l(a,G,wa,"findEdge:link");return this.lA.na(a)}; +wa.prototype.linkVertexes=wa.prototype.Hp=function(a,b,c){if(null===a||null===b)return null;u&&(z.l(a,xa,wa,"linkVertexes:fromVertex"),z.l(b,xa,wa,"linkVertexes:toVertex"),null!==c&&z.l(c,G,wa,"linkVertexes:link"));if(a.network===this&&b.network===this){var d=this.createEdge();d.link=c;d.fromVertex=a;d.toVertex=b;this.Zo(d);return d}return null}; +wa.prototype.reverseEdge=wa.prototype.Gx=function(a){if(null!==a){u&&z.l(a,ya,wa,"reverseEdge:edge");var b=a.fromVertex,c=a.toVertex;null!==b&&null!==c&&(b.dE(a),c.eE(a),a.Gx(),b.ED(a),c.DD(a))}};wa.prototype.deleteSelfEdges=wa.prototype.Tw=function(){for(var a=z.rb(),b=this.edges.i;b.next();){var c=b.value;c.fromVertex===c.toVertex&&a.push(c)}b=a.length;for(c=0;c<b;c++)this.hp(a[c]);z.xa(a)}; +wa.prototype.deleteArtificialVertexes=function(){for(var a=z.rb(),b=this.vertexes.i;b.next();){var c=b.value;null===c.Pc&&a.push(c)}c=a.length;for(b=0;b<c;b++)this.fE(a[b]);c=z.rb();for(b=this.edges.i;b.next();){var d=b.value;null===d.link&&c.push(d)}d=c.length;for(b=0;b<d;b++)this.hp(c[b]);z.xa(a);z.xa(c)};function yq(a){for(var b=z.rb(),c=a.edges.i;c.next();){var d=c.value;null!==d.fromVertex&&null!==d.toVertex||b.push(d)}c=b.length;for(d=0;d<c;d++)a.hp(b[d]);z.xa(b)} +wa.prototype.splitIntoSubNetworks=wa.prototype.oJ=function(){this.deleteArtificialVertexes();yq(this);this.Tw();for(var a=new J(wa),b=!0;b;)for(var b=!1,c=this.vertexes.i;c.next();){var d=c.value;if(0<d.Ze.count||0<d.Te.count){b=this.Sb.createNetwork();a.add(b);zq(this,b,d);b=!0;break}}a.sort(function(a,b){return null===a||null===b||a===b?0:b.vertexes.count-a.vertexes.count});return a}; +function zq(a,b,c){if(null!==c&&c.network!==b){wq(a,c);b.ul(c);for(var d=c.tc;d.next();){var e=d.value;e.network!==b&&(xq(a,e),b.Zo(e),zq(a,b,e.fromVertex))}for(d=c.pc;d.next();)c=d.value,c.network!==b&&(xq(a,c),b.Zo(c),zq(a,b,c.toVertex))}}wa.prototype.findAllParts=function(){for(var a=new K(D),b=this.vertexes.i;b.next();)a.add(b.value.Pc);for(b=this.edges.i;b.next();)a.add(b.value.link);return a}; +function xa(){z.kc(this);this.network=null;this.P=(new w(0,0,10,10)).freeze();this.S=(new N(5,5)).freeze();this.clear()}z.ia("LayoutVertex",xa);xa.prototype.clear=function(){this.Bd=this.fe=null;this.Ze=new J(ya);this.Te=new J(ya)}; +xa.prototype.toString=function(a){void 0===a&&(a=0);var b="LayoutVertex#"+z.nd(this);if(0<a&&(b+=null!==this.Pc?"("+this.Pc.toString()+")":"",1<a)){a="";for(var c=!0,d=this.Ze.i;d.next();){var e=d.value;c?c=!1:a+=",";a+=e.toString(0)}e="";c=!0;for(d=this.Te.i;d.next();){var g=d.value;c?c=!1:e+=",";e+=g.toString(0)}b+=" sources: "+a+" destinations: "+e}return b}; +z.defineProperty(xa,{data:"data"},function(){return this.fe},function(a){this.fe=a;if(null!==a){var b=a.bounds;a=b.x;var c=b.y,d=b.width,b=b.height;this.S.n(d/2,b/2);this.P.n(a,c,d,b)}}); +z.defineProperty(xa,{Pc:"node"},function(){return this.Bd},function(a){if(this.Bd!==a){u&&null!==a&&z.l(a,E,xa,"node");this.Bd=a;a.Bf();var b=a.W,c=b.x,d=b.y,e=b.width,b=b.height;isNaN(c)&&(c=0);isNaN(d)&&(d=0);this.P.n(c,d,e,b);if(!(a instanceof F)&&(a=a.Zb.eb(ec),a.F())){this.S.n(a.x-c,a.y-d);return}this.S.n(e/2,b/2)}});z.defineProperty(xa,{vb:"bounds"},function(){return this.P},function(a){this.P.N(a)||(u&&z.l(a,w,xa,"bounds"),this.P.assign(a))}); +z.defineProperty(xa,{focus:"focus"},function(){return this.S},function(a){this.S.N(a)||(u&&z.l(a,N,xa,"focus"),this.S.assign(a))});z.defineProperty(xa,{ra:"centerX"},function(){return this.P.x+this.S.x},function(a){var b=this.P;b.x+this.S.x!==a&&(u&&z.p(a,xa,"centerX"),b.Wa(),b.x=a-this.S.x,b.freeze())});z.defineProperty(xa,{za:"centerY"},function(){return this.P.y+this.S.y},function(a){var b=this.P;b.y+this.S.y!==a&&(u&&z.p(a,xa,"centerY"),b.Wa(),b.y=a-this.S.y,b.freeze())}); +z.defineProperty(xa,{Dt:"focusX"},function(){return this.S.x},function(a){var b=this.S;b.x!==a&&(b.Wa(),b.x=a,b.freeze())});z.defineProperty(xa,{Et:"focusY"},function(){return this.S.y},function(a){var b=this.S;b.y!==a&&(b.Wa(),b.y=a,b.freeze())});z.defineProperty(xa,{x:"x"},function(){return this.P.x},function(a){var b=this.P;b.x!==a&&(b.Wa(),b.x=a,b.freeze())});z.defineProperty(xa,{y:"y"},function(){return this.P.y},function(a){var b=this.P;b.y!==a&&(b.Wa(),b.y=a,b.freeze())}); +z.defineProperty(xa,{width:"width"},function(){return this.P.width},function(a){var b=this.P;b.width!==a&&(b.Wa(),b.width=a,b.freeze())});z.defineProperty(xa,{height:"height"},function(){return this.P.height},function(a){var b=this.P;b.height!==a&&(b.Wa(),b.height=a,b.freeze())}); +xa.prototype.commit=function(){var a=this.fe;if(null!==a){var b=this.vb,c=a.bounds;z.Za(c)?(c.x=b.x,c.y=b.y,c.width=b.width,c.height=b.height):a.bounds=b.copy()}else if(a=this.Pc,null!==a){b=this.vb;if(!(a instanceof F)){var c=a.W,d=a.Zb.eb(ec);if(c.F()&&d.F()){a.moveTo(b.x+this.Dt-(d.x-c.x),b.y+this.Et-(d.y-c.y));return}}a.moveTo(b.x,b.y)}};xa.prototype.addSourceEdge=xa.prototype.ED=function(a){null!==a&&(u&&z.l(a,ya,xa,"addSourceEdge:edge"),this.Ze.contains(a)||this.Ze.add(a))}; +xa.prototype.deleteSourceEdge=xa.prototype.eE=function(a){null!==a&&(u&&z.l(a,ya,xa,"deleteSourceEdge:edge"),this.Ze.remove(a))};xa.prototype.addDestinationEdge=xa.prototype.DD=function(a){null!==a&&(u&&z.l(a,ya,xa,"addDestinationEdge:edge"),this.Te.contains(a)||this.Te.add(a))};xa.prototype.deleteDestinationEdge=xa.prototype.dE=function(a){null!==a&&(u&&z.l(a,ya,xa,"deleteDestinationEdge:edge"),this.Te.remove(a))}; +z.w(xa,{nJ:"sourceVertexes"},function(){for(var a=new K(xa),b=this.tc;b.next();)a.add(b.value.fromVertex);return a.i});z.w(xa,{qH:"destinationVertexes"},function(){for(var a=new K(xa),b=this.pc;b.next();)a.add(b.value.toVertex);return a.i});z.w(xa,{vertexes:"vertexes"},function(){for(var a=new K(xa),b=this.tc;b.next();)a.add(b.value.fromVertex);for(b=this.pc;b.next();)a.add(b.value.toVertex);return a.i});z.w(xa,{tc:"sourceEdges"},function(){return this.Ze.i});z.w(xa,{pc:"destinationEdges"},function(){return this.Te.i}); +z.w(xa,{edges:"edges"},function(){for(var a=new J(ya),b=this.tc;b.next();)a.add(b.value);for(b=this.pc;b.next();)a.add(b.value);return a.i});z.w(xa,{BH:"edgesCount"},function(){return this.Ze.count+this.Te.count});var Aq;xa.standardComparer=Aq=function(a,b){u&&z.l(a,xa,xa,"standardComparer:m");u&&z.l(b,xa,xa,"standardComparer:n");var c=a.Bd,d=b.Bd;return c?d?(c=c.text,d=d.text,c<d?-1:c>d?1:0):1:null!==d?-1:0}; +xa.smartComparer=function(a,b){u&&z.l(a,xa,xa,"smartComparer:m");u&&z.l(b,xa,xa,"smartComparer:n");if(null!==a){if(null!==b){var c=a.Bd,d=b.Bd;if(null!==c){if(null!==d){for(var c=c.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/),d=d.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/),e=0;e<c.length;e++)if(""!==d[e]&&void 0!==d[e]){var g=parseFloat(c[e]),h=parseFloat(d[e]);if(isNaN(g)){if(!isNaN(h))return 1;if(0!==c[e].localeCompare(d[e]))return c[e].localeCompare(d[e])}else{if(isNaN(h))return-1; +if(0!==g-h)return g-h}}else if(""!==c[e])return 1;return""!==d[e]&&void 0!==d[e]?-1:0}return 1}return null!==d?-1:0}return 1}return null!==b?-1:0};function ya(){z.kc(this);this.network=null;this.clear()}z.ia("LayoutEdge",ya);ya.prototype.clear=function(){this.toVertex=this.fromVertex=this.link=this.data=null}; +ya.prototype.toString=function(a){void 0===a&&(a=0);var b="LayoutEdge#"+z.nd(this);0<a&&(b+=null!==this.link?"("+this.link.toString()+")":"",1<a&&(b+=" "+(this.fromVertex?this.fromVertex.toString():"null")+" --\x3e "+(this.toVertex?this.toVertex.toString():"null")));return b};ya.prototype.Gx=function(){var a=this.fromVertex;this.fromVertex=this.toVertex;this.toVertex=a};ya.prototype.commit=function(){}; +ya.prototype.getOtherVertex=ya.prototype.MH=function(a){u&&z.l(a,xa,ya,"getOtherVertex:v");return this.toVertex===a?this.fromVertex:this.fromVertex===a?this.toVertex:null};function um(){0<arguments.length&&z.od(um);yg.call(this);this.nx=!0;this.ct=this.dt=NaN;this.Aj=(new Ea(NaN,NaN)).freeze();this.bi=(new Ea(10,10)).freeze();this.Ie=wn;this.qd=un;this.ai=qn;this.Lh=Bq}z.Qa(um,yg);z.ia("GridLayout",um); +um.prototype.cloneProtected=function(a){yg.prototype.cloneProtected.call(this,a);a.dt=this.dt;a.ct=this.ct;a.Aj.assign(this.Aj);a.bi.assign(this.bi);a.Ie=this.Ie;a.qd=this.qd;a.ai=this.ai;a.Lh=this.Lh}; +um.prototype.doLayout=function(a){null===a&&z.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts");this.je=this.initialOrigin(this.je);var b=this.h;a=this.$G(a);for(var c=a.copy().i;c.next();){var d=c.value;if(d instanceof G){var e=d;if(null!==e.Y||null!==e.da){a.remove(e);continue}}d.Bf();if(d instanceof F)for(d=d.Hc;d.next();)a.remove(d.value)}e=a.jc();if(0!==e.length){switch(this.sorting){case tn:e.reverse();break;case qn:e.sort(this.comparer); +break;case rn:e.sort(this.comparer),e.reverse()}var g=this.DJ;isNaN(g)&&(g=0);var h=this.iG,h=isNaN(h)&&null!==b?Math.max(b.xb.width-b.padding.left-b.padding.right,0):Math.max(this.iG,0);0>=g&&0>=h&&(g=1);a=this.spacing.width;isFinite(a)||(a=0);c=this.spacing.height;isFinite(c)||(c=0);null!==b&&b.Wb("Layout");d=[];switch(this.alignment){case xn:var k=a,l=c,m=Math.max(this.cp.width,1);if(!isFinite(m))for(var n=m=0;n<e.length;n++)var p=e[n],q=p.Ia,m=Math.max(m,q.width);var m=Math.max(m+k,1),r=Math.max(this.cp.height, +1);if(!isFinite(r))for(n=r=0;n<e.length;n++)p=e[n],q=p.Ia,r=Math.max(r,q.height);for(var r=Math.max(r+l,1),s=this.Yf,t=this.je.x,v=t,x=this.je.y,y=0,A=0,n=0;n<e.length;n++){var p=e[n],q=p.Ia,C=Math.ceil((q.width+k)/m)*m,L=Math.ceil((q.height+l)/r)*r,H=0;switch(s){case vn:H=Math.abs(v-q.width);break;default:H=v+q.width}if(0<g&&y>g-1||0<h&&0<y&&H>h)d.push(new w(0,x,h+k,A)),y=0,v=t,x+=A,A=0;A=Math.max(A,L);L=0;switch(s){case vn:L=-q.width;break;default:L=0}p.moveTo(v+L,x);switch(s){case vn:v-=C;break; +default:v+=C}y++}d.push(new w(0,x,h+k,A));break;case wn:k=g;l=a;m=c;n=Math.max(this.cp.width,1);p=x=C=0;q=z.O();for(g=0;g<e.length;g++)r=e[g],s=r.Ia,t=qp(r,r.Zb,r.of,q),C=Math.max(C,t.x),x=Math.max(x,s.width-t.x),p=Math.max(p,t.y);v=this.Yf;switch(v){case vn:C+=l;break;default:x+=l}var n=isFinite(n)?Math.max(n+l,1):Math.max(C+x,1),U=x=this.je.x,y=this.je.y,A=0;h>=C&&(h-=C);for(var C=L=0,H=Math.max(this.cp.height,1),ea=p=0,W=!0,P=z.O(),g=0;g<e.length;g++){r=e[g];s=r.Ia;t=qp(r,r.Zb,r.of,q);if(0<A)switch(v){case vn:U= +(U-x-(s.width-t.x))/n;U=td(Math.round(U),U)?Math.round(U):Math.floor(U);U=U*n+x;break;default:U=(U-x+t.x)/n,U=td(Math.round(U),U)?Math.round(U):Math.ceil(U),U=U*n+x}else switch(v){case vn:L=U+t.x+s.width;break;default:L=U-t.x}var ba=0;switch(v){case vn:ba=-(U+t.x)+L;break;default:ba=U+s.width-t.x-L}if(0<k&&A>k-1||0<h&&0<A&&ba>h){d.push(new w(0,W?y-p:y,h+l,ea+p+m));for(U=0;U<A&&g!==A;U++){var ba=e[g-A+U],Oa=qp(ba,ba.Zb,ba.of,P);ba.moveTo(ba.position.x,ba.position.y+p-Oa.y)}ea+=m;y=W?y+ea:y+(ea+p); +A=ea=p=0;U=x;W=!1}U===x&&(C=v===vn?Math.max(C,s.width-t.x):Math.min(C,-t.x));p=Math.max(p,t.y);ea=Math.max(ea,s.height-t.y);isFinite(H)&&(ea=Math.max(ea,Math.max(s.height,H)-t.y));W?r.moveTo(U-t.x,y-t.y):r.moveTo(U-t.x,y);switch(v){case vn:U-=t.x+l;break;default:U+=s.width-t.x+l}A++}d.push(new w(0,y,h+l,(W?ea:ea+p)+m));for(U=0;U<A&&g!==A;U++)ba=e[g-A+U],Oa=qp(ba,ba.Zb,ba.of,q),ba.moveTo(ba.position.x,ba.position.y+p-Oa.y);z.A(q);z.A(P);if(v===vn)for(g=0;g<d.length;g++)e=d[g],e.width+=C,e.x-=C;else for(g= +0;g<d.length;g++)e=d[g],e.x>C&&(e.width+=e.x-C,e.x=C)}for(k=g=h=e=0;k<d.length;k++)l=d[k],e=Math.min(e,l.x),h=Math.min(h,l.y),g=Math.max(g,l.x+l.width);this.Yf===vn?this.commitLayers(d,new N(e+a/2-(g+e),h-c/2)):this.commitLayers(d,new N(e-a/2,h-c/2));null!==b&&b.Jd("Layout");this.Gf=!0}};um.prototype.commitLayers=function(){}; +z.defineProperty(um,{iG:"wrappingWidth"},function(){return this.dt},function(a){this.dt!==a&&(z.g(a,"number",um,"wrappingWidth"),0<a||isNaN(a))&&(this.dt=a,this.nx=isNaN(a),this.I())});z.defineProperty(um,{DJ:"wrappingColumn"},function(){return this.ct},function(a){this.ct!==a&&(z.g(a,"number",um,"wrappingColumn"),0<a||isNaN(a))&&(this.ct=a,this.I())});z.defineProperty(um,{cp:"cellSize"},function(){return this.Aj},function(a){z.l(a,Ea,um,"cellSize");this.Aj.N(a)||(this.Aj.assign(a),this.I())}); +z.defineProperty(um,{spacing:"spacing"},function(){return this.bi},function(a){z.l(a,Ea,um,"spacing");this.bi.N(a)||(this.bi.assign(a),this.I())});z.defineProperty(um,{alignment:"alignment"},function(){return this.Ie},function(a){this.Ie!==a&&(z.Ba(a,um,um,"alignment"),a===wn||a===xn)&&(this.Ie=a,this.I())});z.defineProperty(um,{Yf:"arrangement"},function(){return this.qd},function(a){this.qd!==a&&(z.Ba(a,um,um,"arrangement"),a===un||a===vn)&&(this.qd=a,this.I())}); +z.defineProperty(um,{sorting:"sorting"},function(){return this.ai},function(a){this.ai!==a&&(z.Ba(a,um,um,"sorting"),a===sn||a===tn||a===qn||a===rn)&&(this.ai=a,this.I())});z.defineProperty(um,{comparer:"comparer"},function(){return this.Lh},function(a){this.Lh!==a&&(z.g(a,"function",um,"comparer"),this.Lh=a,this.I())});var Bq;um.standardComparer=Bq=function(a,b){u&&z.l(a,D,um,"standardComparer:a");u&&z.l(b,D,um,"standardComparer:b");var c=a.text,d=b.text;return c<d?-1:c>d?1:0}; +um.smartComparer=function(a,b){u&&z.l(a,D,um,"standardComparer:a");u&&z.l(b,D,um,"standardComparer:b");if(null!==a){if(null!==b){for(var c=a.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/),d=b.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/),e=0;e<c.length;e++)if(""!==d[e]&&void 0!==d[e]){var g=parseFloat(c[e]),h=parseFloat(d[e]);if(isNaN(g)){if(!isNaN(h))return 1;if(0!==c[e].localeCompare(d[e]))return c[e].localeCompare(d[e])}else{if(isNaN(h))return-1; +if(0!==g-h)return g-h}}else if(""!==c[e])return 1;return""!==d[e]&&void 0!==d[e]?-1:0}return 1}return null!==b?-1:0};var xn;um.Position=xn=z.s(um,"Position",0);var wn;um.Location=wn=z.s(um,"Location",1);var un;um.LeftToRight=un=z.s(um,"LeftToRight",2);var vn;um.RightToLeft=vn=z.s(um,"RightToLeft",3);var sn;um.Forward=sn=z.s(um,"Forward",4);var tn;um.Reverse=tn=z.s(um,"Reverse",5);var qn;um.Ascending=qn=z.s(um,"Ascending",6);var rn;um.Descending=rn=z.s(um,"Descending",7); +function yn(){0<arguments.length&&z.od(yn);yg.call(this);this.Hy=this.bo=this.Ud=0;this.Vq=360;this.Gy=On;this.Tk=0;this.cC=On;this.Yu=this.Fg=this.sD=0;this.zw=new Cq;this.$u=this.ym=0;this.yG=600;this.js=NaN;this.rq=1;this.Ps=0;this.Rs=360;this.qd=On;this.fa=Kn;this.ai=Hn;this.Lh=Aq;this.bi=6;this.Yr=Rn}z.Qa(yn,yg);z.ia("CircularLayout",yn); +yn.prototype.cloneProtected=function(a){yg.prototype.cloneProtected.call(this,a);a.js=this.js;a.rq=this.rq;a.Ps=this.Ps;a.Rs=this.Rs;a.qd=this.qd;a.fa=this.fa;a.ai=this.ai;a.Lh=this.Lh;a.bi=this.bi;a.Yr=this.Yr};yn.prototype.createNetwork=function(){return new Dq}; +yn.prototype.doLayout=function(a){null===a&&z.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts");null===this.network&&(this.network=this.makeNetwork(a));a=this.network.vertexes;if(1>=a.count)1===a.count&&(a=a.first(),a.ra=0,a.za=0);else{var b=new J(Eq);b.$c(a.i);a=new J(Eq);var c=new J(Eq),d;d=this.sort(b);var e=this.Gy,g=this.cC,h=this.Ud,k=this.bo,l=this.Hy,m=this.Vq,b=this.Tk,n=this.sD,p=this.Fg,q=this.Yu,e=this.Yf,g=this.ux,h=this.TI;if(!isFinite(h)|| +0>=h)h=NaN;k=this.UG;if(!isFinite(k)||0>=k)k=1;l=this.Fe;isFinite(l)||(l=0);m=this.Lf;if(!isFinite(m)||360<m||1>m)m=360;b=this.spacing;isFinite(b)||(b=NaN);e===Pn&&g===Qn?e=On:e===Pn&&g!==Qn&&(g=Qn,e=this.Yf);if((this.direction===In||this.direction===Jn)&&this.sorting!==Hn){for(var r=0;!(r>=d.length);r+=2){a.add(d.ea(r));if(r+1>=d.length)break;c.add(d.ea(r+1))}this.direction===In?(this.Yf===Pn&&a.reverse(),d=new J(Eq),d.$c(a),d.$c(c)):(this.Yf===Pn&&c.reverse(),d=new J(Eq),d.$c(c),d.$c(a))}for(var s= +d.length,t=n=0,r=0;r<d.length;r++){var p=l+m*t*(this.direction===Kn?1:-1)/s,v=d.ea(r).diameter;isNaN(v)&&(v=Fq(d.ea(r),p));360>m&&(0===r||r===d.length-1)&&(v/=2);n+=v;t++}if(isNaN(h)||e===Pn){isNaN(b)&&(b=6);if(e!==On&&e!==Pn){v=-Infinity;for(r=0;r<s;r++){var q=d.ea(r),x=d.ea(r===s-1?0:r+1);isNaN(q.diameter)&&Fq(q,0);isNaN(x.diameter)&&Fq(x,0);v=Math.max(v,(q.diameter+x.diameter)/2)}q=v+b;e===Mn?(p=2*Math.PI/s,h=(v+b)/p):h=Gq(this,q*(360<=m?s:s-1),k,l*Math.PI/180,m*Math.PI/180)}else h=Gq(this,n+(360<= +m?s:s-1)*(e!==Pn?b:1.6*b),k,l*Math.PI/180,m*Math.PI/180);p=h*k}else if(p=h*k,t=Hq(this,h,p,l*Math.PI/180,m*Math.PI/180),isNaN(b)){if(e===On||e===Pn)b=(t-n)/(360<=m?s:s-1)}else if(e===On||e===Pn)r=(t-n)/(360<=m?s:s-1),r<b?(h=Gq(this,n+b*(360<=m?s:s-1),k,l*Math.PI/180,m*Math.PI/180),p=h*k):b=r;else{v=-Infinity;for(r=0;r<s;r++)q=d.ea(r),x=d.ea(r===s-1?0:r+1),isNaN(q.diameter)&&Fq(q,0),isNaN(x.diameter)&&Fq(x,0),v=Math.max(v,(q.diameter+x.diameter)/2);q=v+b;r=Gq(this,q*(360<=m?s:s-1),k,l*Math.PI/180, +m*Math.PI/180);r>h?(h=r,p=h*k):q=t/(360<=m?s:s-1)}this.Gy=e;this.cC=g;this.Ud=h;this.bo=k;this.Hy=l;this.Vq=m;this.Tk=b;this.sD=n;this.Fg=p;this.Yu=q;b=d;d=this.Gy;e=this.Ud;g=this.Hy;k=this.Vq;l=this.Tk;m=this.Fg;n=this.Yu;if(this.direction!==In&&this.direction!==Jn||d!==Pn)if(this.direction===In||this.direction===Jn){h=0;switch(d){case Nn:h=180*Iq(this,e,m,g,n)/Math.PI;break;case On:n=b=0;h=a.first();null!==h&&(b=Fq(h,Math.PI/2));h=c.first();null!==h&&(n=Fq(h,Math.PI/2));h=180*Iq(this,e,m,g,l+(b+ +n)/2)/Math.PI;break;case Mn:h=k/b.length}if(this.direction===In){switch(d){case Nn:Jq(this,a,g,Ln);break;case On:Kq(this,a,g,Ln);break;case Mn:Lq(this,a,k/2,g,Ln)}switch(d){case Nn:Jq(this,c,g+h,Kn);break;case On:Kq(this,c,g+h,Kn);break;case Mn:Lq(this,c,k/2,g+h,Kn)}}else{switch(d){case Nn:Jq(this,c,g,Ln);break;case On:Kq(this,c,g,Ln);break;case Mn:Lq(this,c,k/2,g,Ln)}switch(d){case Nn:Jq(this,a,g+h,Kn);break;case On:Kq(this,a,g+h,Kn);break;case Mn:Lq(this,a,k/2,g+h,Kn)}}}else switch(d){case Nn:Jq(this, +b,g,this.direction);break;case On:Kq(this,b,g,this.direction);break;case Mn:Lq(this,b,k,g,this.direction);break;case Pn:Mq(this,b,k,g,this.direction)}else Mq(this,b,k,g-k/2,Kn)}this.updateParts();this.network=null;this.Gf=!0}; +function Lq(a,b,c,d,e){var g=a.Vq,h=a.Ud;a=a.Fg;d=d*Math.PI/180;c=c*Math.PI/180;for(var k=b.length,l=0;l<k;l++){var m=d+(e===Kn?l*c/(360<=g?k:k-1):-(l*c)/k),n=b.ea(l),p=h*Math.tan(m)/a,p=Math.sqrt((h*h+a*a*p*p)/(1+p*p));n.ra=p*Math.cos(m);n.za=p*Math.sin(m);n.actualAngle=180*m/Math.PI}} +function Kq(a,b,c,d){var e=a.Ud,g=a.Fg,h=a.Tk;c=c*Math.PI/180;for(var k=b.length,l=0;l<k;l++){var m=b.ea(l),n=b.ea(l===k-1?0:l+1),p=g*Math.sin(c);m.ra=e*Math.cos(c);m.za=p;m.actualAngle=180*c/Math.PI;isNaN(m.diameter)&&Fq(m,0);isNaN(n.diameter)&&Fq(n,0);m=Iq(a,e,g,d===Kn?c:-c,(m.diameter+n.diameter)/2+h);c+=d===Kn?m:-m}} +function Jq(a,b,c,d){var e=a.Ud,g=a.Fg,h=a.Yu;c=c*Math.PI/180;for(var k=b.length,l=0;l<k;l++){var m=b.ea(l);m.ra=e*Math.cos(c);m.za=g*Math.sin(c);m.actualAngle=180*c/Math.PI;m=Iq(a,e,g,d===Kn?c:-c,h);c+=d===Kn?m:-m}}function Mq(a,b,c,d,e){var g=a.$u,g=a.Vq;a.ym=0;a.zw=new Cq;if(360>c){for(g=d+(e===Kn?g:-g);0>g;)g+=360;g%=360;180<g&&(g-=360);g*=Math.PI/180;a.$u=g;Nq(a,b,c,d,e)}else Oq(a,b,c,d,e);a.zw.commit(b)} +function Oq(a,b,c,d,e){var g=a.Ud,h=a.Tk,k=a.bo,l=g*Math.cos(d*Math.PI/180),m=a.Fg*Math.sin(d*Math.PI/180),n=b.jc();if(3===n.length)n[0].ra=g,n[0].za=0,n[1].ra=n[0].ra-n[0].width/2-n[1].width/2-h,n[1].y=n[0].y,n[2].ra=(n[0].ra+n[1].ra)/2,n[2].y=n[0].y-n[2].height-h;else if(4===n.length)n[0].ra=g,n[0].za=0,n[2].ra=-n[0].ra,n[2].za=n[0].za,n[1].ra=0,n[1].y=Math.min(n[0].y,n[2].y)-n[1].height-h,n[3].ra=0,n[3].y=Math.max(n[0].y+n[0].height+h,n[2].y+n[2].height+h);else{for(var g=z.O(),p=0;p<n.length;p++){n[p].ra= +l;n[p].za=m;if(p>=n.length-1)break;Pq(a,l,m,n,p,e,g)||Qq(a,l,m,n,p,e,g);l=g.x;m=g.y}z.A(g);a.ym++;if(!(23<a.ym)){var l=n[0].ra,m=n[0].za,g=n[n.length-1].ra,p=n[n.length-1].za,q=Math.abs(l-g)-((n[0].width+n[n.length-1].width)/2+h),r=Math.abs(m-p)-((n[0].height+n[n.length-1].height)/2+h),h=0;1>Math.abs(r)?Math.abs(l-g)<(n[0].width+n[n.length-1].width)/2&&(h=0):h=0<r?r:1>Math.abs(q)?0:q;q=!1;q=Math.abs(g)>Math.abs(p)?0<g!==m>p:0<p!==l<g;if(q=e===Kn?q:!q)h=-Math.abs(h),h=Math.min(h,-n[n.length-1].width), +h=Math.min(h,-n[n.length-1].height);a.zw.compare(h,n);1<Math.abs(h)&&(a.Ud=8>a.ym?a.Ud-h/(2*Math.PI):5>n.length&&10<h?a.Ud/2:a.Ud-(0<h?1.7:-2.3),a.Fg=a.Ud*k,Oq(a,b,c,d,e))}}} +function Nq(a,b,c,d,e){for(var g=a.Ud,h=a.Fg,k=a.bo,l=g*Math.cos(d*Math.PI/180),m=h*Math.sin(d*Math.PI/180),n=z.O(),p=b.jc(),q=0;q<p.length;q++){p[q].ra=l;p[q].za=m;if(q>=p.length-1)break;Pq(a,l,m,p,q,e,n)||Qq(a,l,m,p,q,e,n);l=n.x;m=n.y}z.A(n);a.ym++;if(!(23<a.ym)){l=Math.atan2(m,l);l=e===Kn?a.$u-l:l-a.$u;l=Math.abs(l)<Math.abs(l-2*Math.PI)?l:l-2*Math.PI;g=l*(g+h)/2;h=a.zw;if(Math.abs(g)<Math.abs(h.pp))for(h.pp=g,h.Cn=[],h.gq=[],l=0;l<p.length;l++)h.Cn[l]=p[l].vb.x,h.gq[l]=p[l].vb.y;1<Math.abs(g)&& +(a.Ud=8>a.ym?a.Ud-g/(2*Math.PI):a.Ud-(0<g?1.7:-2.3),a.Fg=a.Ud*k,Nq(a,b,c,d,e))}}function Pq(a,b,c,d,e,g,h){var k=a.Ud,l=a.Fg,m=0,n=0;a=(d[e].width+d[e+1].width)/2+a.Tk;var p=!1;if(0<=c!==(g===Kn)){if(m=b+a,m>k){m=b-a;if(m<-k)return h.x=m,h.y=n,!1;p=!0}}else if(m=b-a,m<-k){m=b+a;if(m>k)return h.x=m,h.y=n,!1;p=!0}n=Math.sqrt(1-Math.min(1,m*m/(k*k)))*l;0>c!==p&&(n=-n);if(Math.abs(c-n)>(d[e].height+d[e+1].height)/2)return h.x=m,h.y=n,!1;h.x=m;h.y=n;return!0} +function Qq(a,b,c,d,e,g,h){var k=a.Ud,l=a.Fg,m=0,n=0;a=(d[e].height+d[e+1].height)/2+a.Tk;d=!1;if(0<=b!==(g===Kn)){if(n=c-a,n<-l){n=c+a;if(n>l){h.x=m;h.y=n;return}d=!0}}else if(n=c+a,n>l){n=c-a;if(n<-l){h.x=m;h.y=n;return}d=!0}m=Math.sqrt(1-Math.min(1,n*n/(l*l)))*k;0>b!==d&&(m=-m);h.x=m;h.y=n}yn.prototype.commitLayout=function(){this.commitNodes();this.Rt&&this.commitLinks()}; +yn.prototype.commitNodes=function(){for(var a=this.JG,b=this.network.vertexes.i;b.next();){var c=b.value;c.x+=a.x;c.y+=a.y;c.commit()}};yn.prototype.commitLinks=function(){for(var a=this.network.edges.i;a.next();)a.value.commit()}; +function Hq(a,b,c,d,e){var g=a.yG;if(.001>Math.abs(a.bo-1))return void 0!==d&&void 0!==e?e*b:2*Math.PI*b;a=b>c?Math.sqrt(b*b-c*c)/b:Math.sqrt(c*c-b*b)/c;for(var h=0,k=0,k=void 0!==d&&void 0!==e?e/(g+1):Math.PI/(2*(g+1)),l=0,m=0;m<=g;m++)l=void 0!==d&&void 0!==e?d+m*e/g:m*Math.PI/(2*g),l=Math.sin(l),h+=Math.sqrt(1-a*a*l*l)*k;return void 0!==d&&void 0!==e?(b>c?b:c)*h:4*(b>c?b:c)*h}function Gq(a,b,c,d,e){var g=0,g=void 0!==d&&void 0!==e?Hq(a,1,c,d,e):Hq(a,1,c);return b/g} +function Iq(a,b,c,d,e){if(.001>Math.abs(a.bo-1))return e/b;var g=b>c?Math.sqrt(b*b-c*c)/b:Math.sqrt(c*c-b*b)/c,h=0;a=2*Math.PI/(700*a.network.vertexes.count);b>c&&(d+=Math.PI/2);for(var k=0;;k++){var l=Math.sin(d+k*a),h=h+(b>c?b:c)*Math.sqrt(1-g*g*l*l)*a;if(h>=e)return k*a}} +yn.prototype.sort=function(a){switch(this.sorting){case Fn:break;case Gn:a.reverse();break;case Cn:a.sort(this.comparer);break;case En:a.sort(this.comparer);a.reverse();break;case Hn:for(var b=[],c=0;c<a.length;c++)b.push(0);for(var d=new J(Eq),c=0;c<a.length;c++){var e=-1,g=-1;if(0===c)for(var h=0;h<a.length;h++){var k=a.ea(h).BH;k>e&&(e=k,g=h)}else for(h=0;h<a.length;h++)k=b[h],k>e&&(e=k,g=h);d.add(a.ea(g));b[g]=-1;g=a.ea(g);e=0;for(h=g.tc;h.next();)e=a.indexOf(h.value.fromVertex),0>e||0<=b[e]&& +b[e]++;for(g=g.pc;g.next();)e=a.indexOf(g.value.toVertex),0>e||0<=b[e]&&b[e]++}a=[];for(b=0;b<d.length;b++){h=d.ea(b);a[b]=[];for(var l=0,c=h.pc;c.next();)l=d.indexOf(c.value.toVertex),l!==b&&0>a[b].indexOf(l)&&a[b].push(l);for(c=h.tc;c.next();)l=d.indexOf(c.value.fromVertex),l!==b&&0>a[b].indexOf(l)&&a[b].push(l)}h=[];for(b=0;b<a.length;b++)h[b]=0;for(var c=[],k=[],m=[],e=[],g=new J(Eq),n=0,b=0;b<a.length;b++){var p=a[b].length;if(1===p)e.push(b);else if(0===p)g.add(d.ea(b));else{if(0===n)c.push(b); +else{for(var q=Infinity,r=Infinity,s=-1,t=[],p=0;p<c.length;p++)0>a[c[p]].indexOf(c[p===c.length-1?0:p+1])&&t.push(p===c.length-1?0:p+1);if(0===t.length)for(p=0;p<c.length;p++)t.push(p);for(p=0;p<t.length;p++){var v=t[p],x,l=a[b];x=k;for(var y=m,A=h,C=v,L=c,H=0,U=0;U<x.length;U++){var ea=A[x[U]],W=A[y[U]],P=0,ba=0;ea<W?(P=ea,ba=W):(P=W,ba=ea);if(P<C&&C<=ba)for(ea=0;ea<l.length;ea++)W=l[ea],0>L.indexOf(W)||P<A[W]&&A[W]<ba||P===A[W]||ba===A[W]||H++;else for(ea=0;ea<l.length;ea++)W=l[ea],0>L.indexOf(W)|| +P<A[W]&&A[W]<ba&&P!==A[W]&&ba!==A[W]&&H++}x=H;for(A=y=0;A<a[b].length;A++)l=c.indexOf(a[b][A]),0<=l&&(l=Math.abs(v-(l>=v?l+1:l)),y+=l<c.length+1-l?l:c.length+1-l);for(A=0;A<k.length;A++)l=h[k[A]],C=h[m[A]],l>=v&&l++,C>=v&&C++,l>C&&(L=C,C=l,l=L),C-l<(c.length+2)/2===(l<v&&v<=C)&&y++;if(x<q||x===q&&y<r)q=x,r=y,s=v}c.splice(s,0,b);for(p=0;p<c.length;p++)h[c[p]]=p;for(p=0;p<a[b].length;p++)q=a[b][p],0<=c.indexOf(q)&&(k.push(b),m.push(q))}n++}}k=!1;for(m=c.length;;){k=!0;for(h=0;h<e.length;h++)if(b=e[h], +n=a[b][0],l=c.indexOf(n),0<=l){for(r=p=0;r<a[n].length;r++)q=a[n][r],q=c.indexOf(q),0>q||q===l||(s=q>l?q-l:l-q,p+=q<l!==s>m-s?1:-1);c.splice(0>p?l:l+1,0,b);e.splice(h,1);h--}else k=!1;if(k)break;else c.push(e[0]),e.splice(0,1)}for(b=0;b<c.length;b++)l=c[b],g.add(d.ea(l));return g;default:z.k("Invalid sorting type.")}return a};z.defineProperty(yn,{TI:"radius"},function(){return this.js},function(a){this.js!==a&&(z.g(a,"number",yn,"radius"),0<a||isNaN(a))&&(this.js=a,this.I())}); +z.defineProperty(yn,{UG:"aspectRatio"},function(){return this.rq},function(a){this.rq!==a&&(z.g(a,"number",yn,"aspectRatio"),0<a&&(this.rq=a,this.I()))});z.defineProperty(yn,{Fe:"startAngle"},function(){return this.Ps},function(a){this.Ps!==a&&(z.g(a,"number",yn,"startAngle"),this.Ps=a,this.I())});z.defineProperty(yn,{Lf:"sweepAngle"},function(){return this.Rs},function(a){this.Rs!==a&&(z.g(a,"number",yn,"sweepAngle"),this.Rs=0<a&&360>=a?a:360,this.I())}); +z.defineProperty(yn,{Yf:"arrangement"},function(){return this.qd},function(a){this.qd!==a&&(z.Ba(a,yn,yn,"arrangement"),a===Pn||a===On||a===Nn||a===Mn)&&(this.qd=a,this.I())});z.defineProperty(yn,{direction:"direction"},function(){return this.fa},function(a){this.fa!==a&&(z.Ba(a,yn,yn,"direction"),a===Kn||a===Ln||a===In||a===Jn)&&(this.fa=a,this.I())}); +z.defineProperty(yn,{sorting:"sorting"},function(){return this.ai},function(a){this.ai!==a&&(z.Ba(a,yn,yn,"sorting"),a===Fn||a===Gn||a===Cn||En||a===Hn)&&(this.ai=a,this.I())});z.defineProperty(yn,{comparer:"comparer"},function(){return this.Lh},function(a){this.Lh!==a&&(z.g(a,"function",yn,"comparer"),this.Lh=a,this.I())});z.defineProperty(yn,{spacing:"spacing"},function(){return this.bi},function(a){this.bi!==a&&(z.g(a,"number",yn,"spacing"),this.bi=a,this.I())}); +z.defineProperty(yn,{ux:"nodeDiameterFormula"},function(){return this.Yr},function(a){this.Yr!==a&&(z.Ba(a,yn,yn,"nodeDiameterFormula"),a===Rn||a===Qn)&&(this.Yr=a,this.I())});z.w(yn,{KG:"actualXRadius"},function(){return this.Ud});z.w(yn,{LG:"actualYRadius"},function(){return this.Fg});z.w(yn,{GJ:"actualSpacing"},function(){return this.Tk});z.w(yn,{JG:"actualCenter"},function(){return isNaN(this.je.x)||isNaN(this.je.y)?new N(0,0):new N(this.je.x+this.KG,this.je.y+this.LG)});var On; +yn.ConstantSpacing=On=z.s(yn,"ConstantSpacing",0);var Nn;yn.ConstantDistance=Nn=z.s(yn,"ConstantDistance",1);var Mn;yn.ConstantAngle=Mn=z.s(yn,"ConstantAngle",2);var Pn;yn.Packed=Pn=z.s(yn,"Packed",3);var Kn;yn.Clockwise=Kn=z.s(yn,"Clockwise",4);var Ln;yn.Counterclockwise=Ln=z.s(yn,"Counterclockwise",5);var In;yn.BidirectionalLeft=In=z.s(yn,"BidirectionalLeft",6);var Jn;yn.BidirectionalRight=Jn=z.s(yn,"BidirectionalRight",7);var Fn;yn.Forwards=Fn=z.s(yn,"Forwards",8);var Gn; +yn.Reverse=Gn=z.s(yn,"Reverse",9);var Cn;yn.Ascending=Cn=z.s(yn,"Ascending",10);var En;yn.Descending=En=z.s(yn,"Descending",11);var Hn;yn.Optimized=Hn=z.s(yn,"Optimized",12);var Rn;yn.Pythagorean=Rn=z.s(yn,"Pythagorean",13);var Qn;yn.Circular=Qn=z.s(yn,"Circular",14);function Cq(){this.pp=-Infinity;this.gq=this.Cn=null} +Cq.prototype.compare=function(a,b){if(0<a&&0>this.pp||Math.abs(a)<Math.abs(this.pp)&&!(0>a&&0<this.pp)){this.pp=a;this.Cn=[];this.gq=[];for(var c=0;c<b.length;c++)this.Cn[c]=b[c].vb.x,this.gq[c]=b[c].vb.y}};Cq.prototype.commit=function(a){if(null!==this.Cn&&null!==this.gq)for(var b=0;b<this.Cn.length;b++){var c=a.ea(b);c.x=this.Cn[b];c.y=this.gq[b]}};function Dq(){wa.call(this)}z.Qa(Dq,wa);z.ia("CircularNetwork",Dq);Dq.prototype.createVertex=function(){return new Eq};Dq.prototype.createEdge=function(){return new Rq}; +function Eq(){xa.call(this);this.actualAngle=this.diameter=NaN}z.Qa(Eq,xa);z.ia("CircularVertex",Eq); +function Fq(a,b){var c=a.network;if(null===c)return NaN;c=c.Sb;if(null===c)return NaN;if(c.Yf===Pn)if(c.ux===Qn)a.diameter=Math.max(a.width,a.height);else{var c=Math.abs(Math.sin(b)),d=Math.abs(Math.cos(b));if(0===c)return a.width;if(0===d)return a.height;a.diameter=Math.min(a.height/c,a.width/d)}else a.diameter=c.ux===Qn?Math.max(a.width,a.height):Math.sqrt(a.width*a.width+a.height*a.height);return a.diameter}function Rq(){ya.call(this)}z.Qa(Rq,ya);z.ia("CircularEdge",Rq); +function Sq(){0<arguments.length&&z.od(Sq);yg.call(this);this.Eg=null;this.wr=0;this.mg=(new Ea(100,100)).freeze();this.qq=!1;this.$h=!0;this.Kh=!1;this.Bo=100;this.Xq=1;this.Sh=1E3;this.ks=Math;this.Xn=.05;this.Wn=50;this.Tn=150;this.Vn=0;this.Nq=10;this.Mq=5}z.Qa(Sq,yg);z.ia("ForceDirectedLayout",Sq); +Sq.prototype.cloneProtected=function(a){yg.prototype.cloneProtected.call(this,a);a.mg.assign(this.mg);a.qq=this.qq;a.$h=this.$h;a.Kh=this.Kh;a.Bo=this.Bo;a.Xq=this.Xq;a.Sh=this.Sh;a.ks=this.ks;a.Xn=this.Xn;a.Wn=this.Wn;a.Tn=this.Tn;a.Vn=this.Vn;a.Nq=this.Nq;a.Mq=this.Mq};Sq.prototype.createNetwork=function(){return new Tq}; +Sq.prototype.doLayout=function(a){null===a&&z.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts");null===this.network&&(this.network=this.makeNetwork(a));a=this.oA;if(0<this.network.vertexes.count){this.network.Tw();for(var b=this.network.vertexes.i;b.next();){var c=b.value;c.charge=this.electricalCharge(c);c.mass=this.gravitationalMass(c)}for(b=this.network.edges.i;b.next();)c=b.value,c.stiffness=this.springStiffness(c),c.length=this.springLength(c); +this.Cz();this.wr=0;if(this.needsClusterLayout()){b=this.network;for(c=b.oJ().i;c.next();){this.network=c.value;for(var d=this.network.vertexes.i;d.next();){var e=d.value;e.ig=e.vertexes.count;e.vk=1;e.Wm=null;e.Fh=null}Uq(this,0,a)}this.network=b;c.reset();u&&z.l(b,Tq,Sq,"arrangeConnectedGraphs:singletons");for(var d=this.KD,g=c.count,h=!0,k=e=0,l=z.rb(),m=0;m<g+b.vertexes.count+2;m++)l[m]=null;g=0;c.reset();for(var n=z.lg();c.next();)if(m=c.value,this.sh(m,n),h)h=!1,e=n.x+n.width/2,k=n.y+n.height/ +2,l[0]=new N(n.x+n.width+d.width,n.y),l[1]=new N(n.x,n.y+n.height+d.height),g=2;else{var p=Vq(l,g,e,k,n.width,n.height,d),q=l[p],r=new N(q.x+n.width+d.width,q.y),s=new N(q.x,q.y+n.height+d.height);p+1<g&&l.splice(p+1,0,null);l[p]=r;l[p+1]=s;g++;p=q.x-n.x;q=q.y-n.y;for(m=m.vertexes.i;m.next();)r=m.value,r.ra+=p,r.za+=q}z.dc(n);for(m=b.vertexes.i;m.next();)h=m.value,n=h.vb,2>g?(e=n.x+n.width/2,k=n.y+n.height/2,l[0]=new N(n.x+n.width+d.width,n.y),l[1]=new N(n.x,n.y+n.height+d.height),g=2):(p=Vq(l,g, +e,k,n.width,n.height,d),q=l[p],r=new N(q.x+n.width+d.width,q.y),s=new N(q.x,q.y+n.height+d.height),p+1<g&&l.splice(p+1,0,null),l[p]=r,l[p+1]=s,g++,h.ra=q.x+h.width/2,h.za=q.y+h.height/2);z.xa(l);for(c.reset();c.next();){d=c.value;for(e=d.vertexes.i;e.next();)b.ul(e.value);for(d=d.edges.i;d.next();)b.Zo(d.value)}}Wq(this,a);this.updateParts()}this.Bo=a;this.network=null;this.Gf=!0}; +Sq.prototype.needsClusterLayout=function(){if(3>this.network.vertexes.count)return!1;for(var a=0,b=0,c=this.network.vertexes.first().vb,d=this.network.vertexes.i;d.next();){if(d.value.vb.Jg(c)&&(a++,2<a))return!0;if(10<b)break;b++}return!1};Sq.prototype.sh=function(a,b){for(var c=!0,d=a.vertexes.i;d.next();){var e=d.value;c?(c=!1,b.set(e.vb)):b.ri(e.vb)}return b}; +function Xq(a,b,c){u&&(z.p(b,Sq,"computeClusterLayoutIterations:level"),z.p(c,Sq,"computeClusterLayoutIterations:maxiter"));return Math.max(Math.min(a.network.vertexes.count,c*(b+1)/11),10)} +function Uq(a,b,c){u&&(z.p(b,Sq,"layoutClusters:level"),z.p(c,Sq,"layoutClusters:maxiter"));if(gr(a,b)){var d=a.Sh;a.Sh*=1+1/(b+1);var e=mr(a,b),g=Math.max(0,Xq(a,b,c));a.oA+=g;Uq(a,b+1,c);Wq(a,g);nr(a,e,b);c=a.Eg;null===c?c=new J(or):c.clear();c.$c(e.vertexes);c.sort(function(a,b){return null===a||null===b||a===b?0:b.ig-a.ig});for(e=c.i;e.next();)pr(a,e.value,b);a.Sh=d}} +function gr(a,b){u&&z.p(b,Sq,"hasClusters:level");if(10<b||3>a.network.vertexes.count)return!1;null===a.Eg?a.Eg=new J(or):a.Eg.clear();a.Eg.$c(a.network.vertexes);var c=a.Eg;c.sort(function(a,b){return null===a||null===b||a===b?0:b.ig-a.ig});for(var d=c.count-1;0<=d&&1>=c.ea(d).ig;)d--;return 1<c.count-d} +function mr(a,b){u&&z.p(b,Sq,"pushSubNetwork:level");for(var c=a.network,d=new Tq,e=a.Eg.i;e.next();){var g=e.value;if(1<g.ig){d.ul(g);var h=new qr;h.Xx=g.ig;h.Yx=g.width;h.Wx=g.height;h.iB=g.S.x;h.jB=g.S.y;null===g.Fh&&(g.Fh=new J(qr));g.Fh.add(h);g.KA=g.Fh.count-1}else break}for(var k=c.edges.i;k.next();)if(e=k.value,e.fromVertex.network===d&&e.toVertex.network===d)d.Zo(e);else if(e.fromVertex.network===d){var l=e.fromVertex.Wm;null===l&&(l=new J(or),e.fromVertex.Wm=l);l.add(e.toVertex);e.fromVertex.ig--; +e.fromVertex.vk+=e.toVertex.vk}else e.toVertex.network===d&&(l=e.toVertex.Wm,null===l&&(l=new J(or),e.toVertex.Wm=l),l.add(e.fromVertex),e.toVertex.ig--,e.toVertex.vk+=e.fromVertex.vk);for(e=d.edges.i;e.next();)g=e.value,g.length*=Math.max(1,se((g.fromVertex.vk+g.toVertex.vk)/(4*b+1)));for(e=d.vertexes.i;e.next();)if(g=e.value,l=g.Wm,null!==l&&0<l.count&&(h=g.Fh.ea(g.Fh.count-1),h=h.Xx-g.ig,!(0>=h))){for(var m=0,n=0,p=l.count-h;p<l.count;p++){for(var q=l.ea(p),r=null,k=q.edges.i;k.next();){var s= +k.value;if(s.MH(q)===g){r=s;break}}null!==r&&(n+=r.length,m+=q.width*q.height)}l=g.ra;k=g.za;p=g.width;q=g.height;r=g.S;s=p*q;1>s&&(s=1);m=se((m+s+n*n*4/(h*h))/s);h=(m-1)*p/2;m=(m-1)*q/2;g.vb=new w(l-r.x-h,k-r.y-m,p+2*h,q+2*m);g.focus=new N(r.x+h,r.y+m)}a.network=d;return c} +function nr(a,b,c){u&&(z.l(b,Tq,Sq,"popNetwork:oldnet"),z.p(c,Sq,"popNetwork:level"));for(c=a.network.vertexes.i;c.next();){var d=c.value;d.network=b;if(null!==d.Fh){var e=d.Fh.ea(d.KA);d.ig=e.Xx;var g=e.iB,h=e.jB;d.vb=new w(d.ra-g,d.za-h,e.Yx,e.Wx);d.focus=new N(g,h);d.KA--}}for(c=a.network.edges.i;c.next();)c.value.network=b;a.network=b} +function pr(a,b,c){u&&(z.l(b,or,Sq,"surroundNode:oldnet"),z.p(c,Sq,"surroundNode:level"));var d=b.Wm;if(null!==d&&0!==d.count){c=b.ra;var e=b.za,g=b.width,h=b.height;null!==b.Fh&&0<b.Fh.count&&(h=b.Fh.ea(0),g=h.Yx,h=h.Wx);for(var g=se(g*g+h*h)/2,k=!1,l=h=0,m=0,n=b.vertexes.i;n.next();){var p=n.value;1>=p.ig?l++:(k=!0,m++,h+=Math.atan2(b.za-p.za,b.ra-p.ra))}if(0!==l)for(0<m&&(h/=m),m=b=0,b=k?2*Math.PI/(l+1):2*Math.PI/l,0===l%2&&(m=b/2),1<d.count&&d.sort(function(a,b){return null===a||null===b||a=== +b?0:b.width*b.height-a.width*a.height}),k=0===l%2?0:1,d=d.i;d.next();)if(l=d.value,!(1<l.ig||a.isFixed(l))){n=null;for(p=l.edges.i;p.next();){n=p.value;break}var p=l.width,q=l.height,p=se(p*p+q*q)/2,n=g+n.length+p,p=h+(b*(k/2>>1)+m)*(0===k%2?1:-1);l.ra=c+n*Math.cos(p);l.za=e+n*Math.sin(p);k++}}} +function Vq(a,b,c,d,e,g,h){var k=9E19,l=-1,m=0;a:for(;m<b;m++){var n=a[m],p=n.x-c,q=n.y-d,p=p*p+q*q;if(p<k){for(q=m-1;0<=q;q--)if(a[q].y>n.y&&a[q].x-n.x<e+h.width)continue a;for(q=m+1;q<b;q++)if(a[q].x>n.x&&a[q].y-n.y<g+h.height)continue a;l=m;k=p}}return l}Sq.prototype.Cz=function(){if(this.comments)for(var a=this.network.vertexes.i;a.next();)this.addComments(a.value)}; +Sq.prototype.addComments=function(a){var b=a.Pc;if(null!==b)for(b=b.qE();b.next();){var c=b.value;if("Comment"===c.nc&&c.isVisible()){var d=this.network.dn(c);null===d&&(d=this.network.ht(c));d.charge=this.mH;for(var c=null,e=d.pc;e.next();){var g=e.value;if(g.toVertex===a){c=g;break}}if(null===c)for(e=d.tc;e.next();)if(g=e.value,g.fromVertex===a){c=g;break}null===c&&(c=this.network.Hp(a,d,null));c.length=this.nH}}}; +function rr(a,b){u&&(z.l(a,or,Sq,"getNodeDistance:vertexA"),z.l(b,or,Sq,"getNodeDistance:vertexB"));var c=a.P,d=c.x,e=c.y,g=c.width,c=c.height,h=b.P,k=h.x,l=h.y,m=h.width,h=h.height;return d+g<k?e>l+h?(d=d+g-k,e=e-l-h,se(d*d+e*e)):e+c<l?(d=d+g-k,e=e+c-l,se(d*d+e*e)):k-(d+g):d>k+m?e>l+h?(d=d-k-m,e=e-l-h,se(d*d+e*e)):e+c<l?(d=d-k-m,e=e+c-l,se(d*d+e*e)):d-(k+m):e>l+h?e-(l+h):e+c<l?l-(e+c):.1} +function Wq(a,b){u&&z.p(b,Sq,"performIterations:num");a.Eg=null;for(var c=a.wr+b;a.wr<c&&(a.wr++,sr(a)););a.Eg=null} +function sr(a){null===a.Eg&&(a.Eg=new J(or),a.Eg.$c(a.network.vertexes));var b=a.Eg.o;if(0>=b.length)return!1;var c=b[0];c.forceX=0;c.forceY=0;for(var d=c.ra,e=d,g=c.za,h=g,c=1;c<b.length;c++){var k=b[c];k.forceX=0;k.forceY=0;var l=k.ra,k=k.za,d=Math.min(d,l),e=Math.max(e,l),g=Math.min(g,k),h=Math.max(h,k)}(g=e-d>h-g)?b.sort(function(a,b){return null===a||null===b||a===b?0:a.ra-b.ra}):b.sort(function(a,b){return null===a||null===b||a===b?0:a.za-b.za});for(var h=a.Sh,m=0,n=0,p=0,c=0;c<b.length;c++){var k= +b[c],l=k.P,q=k.S,d=l.x+q.x,l=l.y+q.y,n=k.charge*a.electricalFieldX(d,l),p=k.charge*a.electricalFieldY(d,l),n=n+k.mass*a.gravitationalFieldX(d,l),p=p+k.mass*a.gravitationalFieldY(d,l);k.forceX+=n;k.forceY+=p;for(q=c+1;q<b.length;q++)if(e=b[q],e!==k){var r=e.P,n=e.S,p=r.x+n.x,r=r.y+n.y;if(d-p>h||p-d>h){if(g)break}else if(l-r>h||r-l>h){if(!g)break}else{var s=rr(k,e);1>s?(n=a.Cx,null===n&&(a.Cx=n=new Ka(0)),m=n.random(),s=n.random(),d>p?(n=Math.abs(e.P.right-k.P.x),n=(1+n)*m):d<p?(n=Math.abs(e.P.x-k.P.right), +n=-(1+n)*m):(n=Math.max(e.width,k.width),n=(1+n)*m-n/2),l>r?(p=Math.abs(e.P.bottom-k.P.y),p=(1+p)*s):d<p?(p=Math.abs(e.P.y-k.P.bottom),p=-(1+p)*s):(p=Math.max(e.height,k.height),p=(1+p)*s-p/2)):(m=-(k.charge*e.charge)/(s*s),n=(p-d)/s*m,p=(r-l)/s*m);k.forceX+=n;k.forceY+=p;e.forceX-=n;e.forceY-=p}}}for(c=a.network.edges.i;c.next();)g=c.value,k=g.fromVertex,e=g.toVertex,l=k.P,q=k.S,d=l.x+q.x,l=l.y+q.y,r=e.P,n=e.S,p=r.x+n.x,r=r.y+n.y,s=rr(k,e),1>s?(n=a.Cx,null===n&&(a.Cx=n=new Ka(0)),m=n.random(),s= +n.random(),n=(d>p?1:-1)*(1+(e.width>k.width)?e.width:k.width)*m,p=(l>r?1:-1)*(1+(e.height>k.height)?e.height:k.height)*s):(m=g.stiffness*(s-g.length),n=(p-d)/s*m,p=(r-l)/s*m),k.forceX+=n,k.forceY+=p,e.forceX-=n,e.forceY-=p;c=0;d=Math.max(a.Sh/20,50);for(e=0;e<b.length;e++)k=b[e],a.isFixed(k)?a.moveFixedVertex(k):(g=k.forceX,h=k.forceY,g<-d?g=-d:g>d&&(g=d),h<-d?h=-d:h>d&&(h=d),k.ra+=g,k.za+=h,c=Math.max(c,g*g+h*h));return c>a.nE*a.nE}Sq.prototype.moveFixedVertex=function(){}; +Sq.prototype.commitLayout=function(){this.PA();this.commitNodes();this.Rt&&this.commitLinks()};Sq.prototype.PA=function(){if(this.aq)for(var a=this.network.edges.i;a.next();){var b=a.value.link;null!==b&&(b.Db=Pc,b.Eb=Pc)}};Sq.prototype.commitNodes=function(){var a=0,b=0;if(this.TG){var c=z.lg();this.sh(this.network,c);b=this.je;a=b.x-c.x;b=b.y-c.y;z.dc(c)}for(var c=z.lg(),d=this.network.vertexes.i;d.next();){var e=d.value;if(0!==a||0!==b)c.assign(e.vb),c.x+=a,c.y+=b,e.vb=c;e.commit()}z.dc(c)}; +Sq.prototype.commitLinks=function(){for(var a=this.network.edges.i;a.next();)a.value.commit()};Sq.prototype.springStiffness=function(a){a=a.stiffness;return isNaN(a)?this.Xn:a};Sq.prototype.springLength=function(a){a=a.length;return isNaN(a)?this.Wn:a};Sq.prototype.electricalCharge=function(a){a=a.charge;return isNaN(a)?this.Tn:a};Sq.prototype.electricalFieldX=function(){return 0};Sq.prototype.electricalFieldY=function(){return 0}; +Sq.prototype.gravitationalMass=function(a){a=a.mass;return isNaN(a)?this.Vn:a};Sq.prototype.gravitationalFieldX=function(){return 0};Sq.prototype.gravitationalFieldY=function(){return 0};Sq.prototype.isFixed=function(a){return a.isFixed};z.w(Sq,{gK:"currentIteration"},function(){return this.wr});z.defineProperty(Sq,{KD:"arrangementSpacing"},function(){return this.mg},function(a){z.l(a,Ea,Sq,"arrangementSpacing");this.mg.N(a)||(this.mg.assign(a),this.I())}); +z.defineProperty(Sq,{TG:"arrangesToOrigin"},function(){return this.qq},function(a){this.qq!==a&&(z.g(a,"boolean",Sq,"arrangesToOrigin"),this.qq=a,this.I())});z.defineProperty(Sq,{aq:"setsPortSpots"},function(){return this.$h},function(a){this.$h!==a&&(z.g(a,"boolean",Sq,"setsPortSpots"),this.$h=a,this.I())});z.defineProperty(Sq,{comments:"comments"},function(){return this.Kh},function(a){this.Kh!==a&&(z.g(a,"boolean",Sq,"comments"),this.Kh=a,this.I())}); +z.defineProperty(Sq,{oA:"maxIterations"},function(){return this.Bo},function(a){this.Bo!==a&&(z.g(a,"number",Sq,"maxIterations"),0<=a&&(this.Bo=a,this.I()))});z.defineProperty(Sq,{nE:"epsilonDistance"},function(){return this.Xq},function(a){this.Xq!==a&&(z.g(a,"number",Sq,"epsilonDistance"),0<a&&(this.Xq=a,this.I()))});z.defineProperty(Sq,{CK:"infinityDistance"},function(){return this.Sh},function(a){this.Sh!==a&&(z.g(a,"number",Sq,"infinityDistance"),1<a&&(this.Sh=a,this.I()))}); +z.defineProperty(Sq,{Cx:"randomNumberGenerator"},function(){return this.ks},function(a){this.ks!==a&&(null!==a&&"function"!==typeof a.random&&z.k('ForceDirectedLayout.randomNumberGenerator must have a "random()" function on it: '+a),this.ks=a)});z.defineProperty(Sq,{sK:"defaultSpringStiffness"},function(){return this.Xn},function(a){this.Xn!==a&&(z.g(a,"number",Sq,"defaultSpringStiffness"),this.Xn=a,this.I())}); +z.defineProperty(Sq,{rK:"defaultSpringLength"},function(){return this.Wn},function(a){this.Wn!==a&&(z.g(a,"number",Sq,"defaultSpringLength"),this.Wn=a,this.I())});z.defineProperty(Sq,{lK:"defaultElectricalCharge"},function(){return this.Tn},function(a){this.Tn!==a&&(z.g(a,"number",Sq,"defaultElectricalCharge"),this.Tn=a,this.I())});z.defineProperty(Sq,{mK:"defaultGravitationalMass"},function(){return this.Vn},function(a){this.Vn!==a&&(z.g(a,"number",Sq,"defaultGravitationalMass"),this.Vn=a,this.I())}); +z.defineProperty(Sq,{nH:"defaultCommentSpringLength"},function(){return this.Nq},function(a){this.Nq!==a&&(z.g(a,"number",Sq,"defaultCommentSpringLength"),this.Nq=a,this.I())});z.defineProperty(Sq,{mH:"defaultCommentElectricalCharge"},function(){return this.Mq},function(a){this.Mq!==a&&(z.g(a,"number",Sq,"defaultCommentElectricalCharge"),this.Mq=a,this.I())});function qr(){this.jB=this.iB=this.Wx=this.Yx=this.Xx=0}function Tq(){wa.call(this)}z.Qa(Tq,wa);z.ia("ForceDirectedNetwork",Tq); +Tq.prototype.createVertex=function(){return new or};Tq.prototype.createEdge=function(){return new tr};function or(){xa.call(this);this.isFixed=!1;this.mass=this.charge=NaN;this.vk=this.ig=this.forceY=this.forceX=0;this.Fh=this.Wm=null;this.KA=0}z.Qa(or,xa);z.ia("ForceDirectedVertex",or);function tr(){ya.call(this);this.length=this.stiffness=NaN}z.Qa(tr,ya);z.ia("ForceDirectedEdge",tr); +function pn(){0<arguments.length&&z.od(pn);yg.call(this);this.Td=this.pm=25;this.fa=0;this.Sn=ur;this.xo=vr;this.no=wr;this.nm=4;this.Fn=xr;this.Si=yr;this.$h=!0;this.Br=4;this.Kb=this.Iv=this.yb=-1;this.Rf=this.Lr=0;this.Rb=this.Pf=this.Qf=this.ug=this.ge=null;this.Ur=0;this.Tr=this.um=null;this.wg=0;this.Vr=null;this.sB=new N;this.ih=[];this.ih.length=100}z.Qa(pn,yg);z.ia("LayeredDigraphLayout",pn); +pn.prototype.cloneProtected=function(a){yg.prototype.cloneProtected.call(this,a);a.pm=this.pm;a.Td=this.Td;a.fa=this.fa;a.Sn=this.Sn;a.xo=this.xo;a.no=this.no;a.nm=this.nm;a.Fn=this.Fn;a.Si=this.Si;a.$h=this.$h;a.Br=this.Br};pn.prototype.createNetwork=function(){return new zr}; +pn.prototype.doLayout=function(a){null===a&&z.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts");null===this.network&&(this.network=this.makeNetwork(a));this.je=this.initialOrigin(this.je);this.Iv=-1;this.Rf=this.Lr=0;this.Vr=this.Tr=this.um=null;for(a=0;a<this.ih.length;a++)this.ih[a]=null;if(0<this.network.vertexes.count){this.network.Tw();for(a=this.network.edges.i;a.next();)a.value.rev=!1;switch(this.Sn){default:case Ar:var b=0,c=this.network.vertexes.count- +1;a=[];a.length=c+1;for(var d=this.network.vertexes.i;d.next();)d.value.valid=!0;for(;null!==Br(this.network);){for(d=Cr(this.network);null!==d;)a[c]=d,c--,d.valid=!1,d=Cr(this.network);for(d=Dr(this.network);null!==d;)a[b]=d,b++,d.valid=!1,d=Dr(this.network);for(var d=null,e=0,g=this.network.vertexes.i;g.next();){var h=g.value;if(h.valid){for(var k=0,l=h.pc;l.next();)l.value.toVertex.valid&&k++;for(var l=0,m=h.tc;m.next();)m.value.fromVertex.valid&&l++;if(null===d||e<k-l)d=h,e=k-l}}null!==d&&(a[b]= +d,b++,d.valid=!1)}for(b=0;b<this.network.vertexes.count;b++)a[b].index=b;for(a=this.network.edges.i;a.next();)b=a.value,b.fromVertex.index>b.toVertex.index&&(this.network.Gx(b),b.rev=!0);break;case ur:for(b=this.network.vertexes.i;b.next();)a=b.value,a.ip=-1,a.finish=-1;for(a=this.network.edges.i;a.next();)a.value.forest=!1;this.Ur=0;for(b.reset();b.next();)c=b.value,0===c.tc.count&&Er(this,c);for(b.reset();b.next();)c=b.value,-1===c.ip&&Er(this,c);for(a.reset();a.next();)b=a.value,b.forest||(c=b.fromVertex, +d=c.finish,e=b.toVertex,g=e.finish,e.ip<c.ip&&d<g&&(this.network.Gx(b),b.rev=!0))}for(a=this.network.vertexes.i;a.next();)a.value.layer=-1;this.yb=-1;this.assignLayers();for(a.reset();a.next();)this.yb=Math.max(this.yb,a.value.layer);a=[];for(c=this.network.edges.i;c.next();)b=c.value,b.valid=!1,a.push(b);for(c=0;c<a.length;c++)if(b=a[c],!b.valid&&(null!==b.fromVertex.Bd&&null!==b.toVertex.Bd||b.fromVertex.layer!==b.toVertex.layer)){l=h=k=g=0;e=b.fromVertex;d=b.toVertex;if(null!==b.link){k=b.link; +if(null===k)continue;var n=e.Bd,g=d.Bd;if(null===n||null===g)continue;var p=k.Y,h=k.da,q=k.md,l=k.Qd;b.rev&&(k=p,m=q,p=h,q=l,h=k,l=m);var r=e.S,k=b.toVertex.S,s=b.rev?d.P:e.P,m=z.O();s.F()?(qp(p,q,ec,m),m.F()||m.assign(r)):m.assign(r);n!==p&&s.F()&&p.isVisible()&&(n=e.P,n.F()&&(m.x+=s.x-n.x,m.y+=s.y-n.y));p=b.rev?e.P:d.P;n=z.O();p.F()?(qp(h,l,ec,n),n.F()||n.assign(k)):n.assign(k);g!==h&&p.F()&&h.isVisible()&&(g=d.P,g.F()&&(n.x+=p.x-g.x,n.y+=p.y-g.y));90===this.fa||270===this.fa?(g=Math.round((m.x- +r.x)/this.Td),h=m.x,k=Math.round((n.x-k.x)/this.Td),l=n.x):(g=Math.round((m.y-r.y)/this.Td),h=m.y,k=Math.round((n.y-k.y)/this.Td),l=n.y);z.A(m);z.A(n);b.portFromColOffset=g;b.portFromPos=h;b.portToColOffset=k;b.portToPos=l}else b.portFromColOffset=0,b.portFromPos=0,b.portToColOffset=0,b.portToPos=0;m=e.layer;r=d.layer;a:if(n=b,p=0,s=n.link,null!==s){var t=s.md,v=s.Qd;if(null!==t&&null!==v){var x=s.Y,q=s.da;if(null!==x&&null!==q){var y=t.Db,A=v.Eb;this.aq||(s.Db.bd()||(y=s.Db),s.Eb.bd()||(A=s.Eb)); +var C=s.rc,L=Fr(this,!0);if(y.bd()||y===Yb)y=L;var H=Fr(this,!1);if(A.bd()||A===Yb)A=H;if(y.lj()&&y.vp(H)&&A.lj()&&A.vp(L)){p=0;break a}L=s.getLinkPoint(x,t,y,!0,C,q,v,z.O());y=s.getLinkDirection(x,t,L,y,!0,C,q,v);z.A(L);y===Gr(this,n,!0)?p+=1:this.aq&&null!==x&&1===x.ports.count&&n.rev&&(p+=1);y=s.getLinkPoint(q,v,A,!1,C,x,t,z.O());s=s.getLinkDirection(q,v,y,A,!1,C,x,t);z.A(y);s===Gr(this,n,!1)?p+=2:this.aq&&null!==q&&1===q.ports.count&&n.rev&&(p+=2)}}}n=1===p||3===p?!0:!1;if(p=2===p||3===p?!0:!1)q= +this.network.createVertex(),q.Bd=null,q.Tm=1,q.layer=m,q.near=e,this.network.ul(q),e=this.network.Hp(e,q,b.link),e.valid=!1,e.rev=b.rev,e.portFromColOffset=g,e.portToColOffset=0,e.portFromPos=h,e.portToPos=0,e=q;s=1;n&&s--;if(m-r>s&&0<m){b.valid=!1;q=this.network.createVertex();q.Bd=null;q.Tm=2;q.layer=m-1;this.network.ul(q);e=this.network.Hp(e,q,b.link);e.valid=!0;e.rev=b.rev;e.portFromColOffset=p?0:g;e.portToColOffset=0;e.portFromPos=p?0:h;e.portToPos=0;e=q;for(m--;m-r>s&&0<m;)q=this.network.createVertex(), +q.Bd=null,q.Tm=3,q.layer=m-1,this.network.ul(q),e=this.network.Hp(e,q,b.link),e.valid=!0,e.rev=b.rev,e.portFromColOffset=0,e.portToColOffset=0,e.portFromPos=0,e.portToPos=0,e=q,m--;e=this.network.Hp(q,d,b.link);e.valid=!n;n&&(q.near=d);e.rev=b.rev;e.portFromColOffset=0;e.portToColOffset=k;e.portFromPos=0;e.portToPos=l}else b.valid=!0}b=this.ge=[];for(c=0;c<=this.yb;c++)b[c]=0;for(a=this.network.vertexes.i;a.next();)c=a.value,c.index=-1;this.initializeIndices();this.Iv=-1;for(c=this.Rf=this.Lr=0;c<= +this.yb;c++)b[c]>b[this.Rf]&&(this.Iv=b[c]-1,this.Rf=c),b[c]<b[this.Lr]&&(this.Lr=c);this.Vr=[];for(c=0;c<b.length;c++)this.Vr[c]=[];for(a.reset();a.next();)b=a.value,c=this.Vr[b.layer],c[b.index]=b;this.Kb=-1;for(a=0;a<=this.yb;a++){b=Hr(this,a);c=0;d=this.ge[a];for(e=0;e<d;e++)g=b[e],c+=this.nodeMinColumnSpace(g,!0),g.column=c,c+=1,c+=this.nodeMinColumnSpace(g,!1);this.Kb=Math.max(this.Kb,c-1);Ir(this,a,b)}this.reduceCrossings();this.straightenAndPack();this.updateParts()}this.network=null;this.Gf= +!0};pn.prototype.linkMinLength=function(){return 1};function Jr(a){var b=a.fromVertex.Bd;a=a.toVertex.Bd;return null===b&&null===a?8:null===b||null===a?4:1}pn.prototype.nodeMinLayerSpace=function(a,b){return null===a.Bd?0:90===this.fa||270===this.fa?b?a.S.y+10:a.P.height-a.S.y+10:b?a.S.x+10:a.P.width-a.S.x+10}; +pn.prototype.nodeMinColumnSpace=function(a,b){if(null===a.Bd)return 0;var c=b?a.xA:a.wA;if(null!==c)return c;c=this.fa;return 90===c||270===c?b?a.xA=a.S.x/this.Td+1|0:a.wA=(a.P.width-a.S.x)/this.Td+1|0:b?a.xA=a.S.y/this.Td+1|0:a.wA=(a.P.height-a.S.y)/this.Td+1|0};function Kr(a){null===a.um&&(a.um=[]);for(var b=0,c=a.network.vertexes.i;c.next();){var d=c.value;a.um[b]=d.layer;b++;a.um[b]=d.column;b++;a.um[b]=d.index;b++}return a.um} +function Lr(a,b){for(var c=0,d=a.network.vertexes.i;d.next();){var e=d.value;e.layer=b[c];c++;e.column=b[c];c++;e.index=b[c];c++}} +function Mr(a,b,c){u&&(z.p(b,pn,"crossingMatrix:unfixedLayer"),z.p(c,pn,"crossingMatrix:direction"));var d=Hr(a,b),e=a.ge[b];if(null===a.Tr||a.Tr.length<e*e)a.Tr=[];for(var g=a.Tr,h=0;h<e;h++){var k=0,l=d[h],m=l.near,n=0;if(null!==m&&m.layer===l.layer)if(n=m.index,n>h)for(var p=h+1;p<n;p++)l=d[p],l.near===m&&l.Tm===m.Tm||k++;else for(p=h-1;p>n;p--)l=d[p],l.near===m&&l.Tm===m.Tm||k++;var m=0,q,r=q=p=l=0,s,t=0,v=0;s=0;var x;if(0<=c)for(n=d[h].Ze,m=0;m<n.count;m++)if(q=n.o[m],q.valid&&q.fromVertex.layer!== +b)for(l=q.fromVertex.index,p=q.portToPos,q=q.portFromPos,r=m+1;r<n.count;r++)s=n.o[r],s.valid&&s.fromVertex.layer!==b&&(t=s.fromVertex.index,v=s.portToPos,s=s.portFromPos,p<v&&(l>t||l===t&&q>s)&&k++,v<p&&(t>l||t===l&&s>q)&&k++);if(0>=c)for(n=d[h].Te,m=0;m<n.count;m++)if(q=n.o[m],q.valid&&q.toVertex.layer!==b)for(l=q.toVertex.index,p=q.portToPos,q=q.portFromPos,r=m+1;r<n.count;r++)s=n.o[r],s.valid&&s.toVertex.layer!==b&&(t=s.toVertex.index,v=s.portToPos,s=s.portFromPos,q<s&&(l>t||l===t&&p>v)&&k++, +s<q&&(t>l||t===l&&v>p)&&k++);g[h*e+h]=k;for(n=h+1;n<e;n++){var y=0,A=0;if(0<=c)for(k=d[h].Ze,x=d[n].Ze,m=0;m<k.count;m++)if(q=k.o[m],q.valid&&q.fromVertex.layer!==b)for(l=q.fromVertex.index,q=q.portFromPos,r=0;r<x.count;r++)s=x.o[r],s.valid&&s.fromVertex.layer!==b&&(t=s.fromVertex.index,s=s.portFromPos,(l<t||l===t&&q<s)&&A++,(t<l||t===l&&s<q)&&y++);if(0>=c)for(k=d[h].Te,x=d[n].Te,m=0;m<k.count;m++)if(q=k.o[m],q.valid&&q.toVertex.layer!==b)for(l=q.toVertex.index,p=q.portToPos,r=0;r<x.count;r++)s=x.o[r], +s.valid&&s.toVertex.layer!==b&&(t=s.toVertex.index,v=s.portToPos,(l<t||l===t&&p<v)&&A++,(t<l||t===l&&v<p)&&y++);g[h*e+n]=y;g[n*e+h]=A}}Ir(a,b,d);return g}pn.prototype.countCrossings=function(){for(var a=0,b=0;b<=this.yb;b++)for(var c=Mr(this,b,1),d=this.ge[b],e=0;e<d;e++)for(var g=e;g<d;g++)a+=c[e*d+g];return a}; +function Nr(a){for(var b=0,c=0;c<=a.yb;c++){for(var d=a,e=c,g=Hr(d,e),h=d.ge[e],k=0,l=0;l<h;l++){var m=null,m=g[l].Te,n,p=0,q=0;if(null!==m)for(var r=0;r<m.count;r++)n=m.o[r],n.valid&&n.toVertex.layer!==e&&(p=n.fromVertex.column+n.portFromColOffset,q=n.toVertex.column+n.portToColOffset,k+=(Math.abs(p-q)+1)*Jr(n))}Ir(d,e,g);b+=k}return b} +pn.prototype.normalize=function(){var a=Infinity;this.Kb=-1;for(var b=this.network.vertexes.i;b.next();){var c=b.value,a=Math.min(a,c.column-this.nodeMinColumnSpace(c,!0));this.Kb=Math.max(this.Kb,c.column+this.nodeMinColumnSpace(c,!1))}for(b.reset();b.next();)b.value.column-=a;this.Kb-=a}; +function Or(a,b,c){u&&(z.p(b,pn,"barycenters:unfixedLayer"),z.p(c,pn,"barycenters:direction"));for(var d=Hr(a,b),e=a.ge[b],g=[],h=0;h<e;h++){var k=d[h],l=null;0>=c&&(l=k.Ze);var m=null;0<=c&&(m=k.Te);var n=0,p=0,q=k.near;null!==q&&q.layer===k.layer&&(n+=q.column-1,p++);if(null!==l)for(q=0;q<l.count;q++){var k=l.o[q],r=k.fromVertex;k.valid&&!k.rev&&r.layer!==b&&(n+=r.column,p++)}if(null!==m)for(l=0;l<m.count;l++)k=m.o[l],q=k.toVertex,k.valid&&!k.rev&&q.layer!==b&&(n+=q.column,p++);g[h]=0===p?-1:n/ +p}Ir(a,b,d);return g} +function Pr(a,b,c){u&&(z.p(b,pn,"medians:unfixedLayer"),z.p(c,pn,"medians:direction"));for(var d=Hr(a,b),e=a.ge[b],g=[],h=0;h<e;h++){var k=d[h],l=null;0>=c&&(l=k.Ze);var m=null;0<=c&&(m=k.Te);var n=0,p=[],q=k.near;null!==q&&q.layer===k.layer&&(p[n]=q.column-1,n++);if(null!==l)for(q=0;q<l.count;q++){var k=l.o[q],r=k.fromVertex;k.valid&&!k.rev&&r.layer!==b&&(p[n]=r.column+k.portFromColOffset,n++)}if(null!==m)for(l=0;l<m.count;l++)k=m.o[l],q=k.toVertex,k.valid&&!k.rev&&q.layer!==b&&(p[n]=q.column+k.portToColOffset, +n++);0===n?g[h]=-1:(p.sort(function(a,b){return a-b}),m=n>>1,g[h]=n&1?p[m]:p[m-1]+p[m]>>1)}Ir(a,b,d);return g}function Qr(a,b,c,d,e,g){if(b.component===d){b.component=c;var h=0,k=0;if(e)for(var l=b.pc;l.next();){var k=l.value,m=k.toVertex,h=b.layer-m.layer,k=a.linkMinLength(k);h===k&&Qr(a,m,c,d,e,g)}if(g)for(l=b.tc;l.next();)k=l.value,m=k.fromVertex,h=m.layer-b.layer,k=a.linkMinLength(k),h===k&&Qr(a,m,c,d,e,g)}} +function Rr(a,b,c,d,e,g){if(b.component===d){b.component=c;if(e)for(var h=b.pc;h.next();)Rr(a,h.value.toVertex,c,d,e,g);if(g)for(b=b.tc;b.next();)Rr(a,b.value.fromVertex,c,d,e,g)}}function Br(a){for(a=a.vertexes.i;a.next();){var b=a.value;if(b.valid)return b}return null}function Cr(a){for(a=a.vertexes.i;a.next();){var b=a.value;if(b.valid){for(var c=!0,d=b.pc;d.next();)if(d.value.toVertex.valid){c=!1;break}if(c)return b}}return null} +function Dr(a){for(a=a.vertexes.i;a.next();){var b=a.value;if(b.valid){for(var c=!0,d=b.tc;d.next();)if(d.value.fromVertex.valid){c=!1;break}if(c)return b}}return null}function Er(a,b){b.ip=a.Ur;a.Ur++;for(var c=b.pc;c.next();){var d=c.value,e=d.toVertex;-1===e.ip&&(d.forest=!0,Er(a,e))}b.finish=a.Ur;a.Ur++} +pn.prototype.assignLayers=function(){switch(this.xo){case Sr:Tr(this);break;case Ur:for(var a=0,b=this.network.vertexes.i;b.next();)a=Vr(this,b.value),this.yb=Math.max(a,this.yb);for(b.reset();b.next();)a=b.value,a.layer=this.yb-a.layer;break;default:case vr:Tr(this);for(b=this.network.vertexes.i;b.next();)b.value.valid=!1;for(b.reset();b.next();)a=b.value,0===a.tc.count&&Wr(this,a);a=Infinity;for(b.reset();b.next();)a=Math.min(a,b.value.layer);this.yb=-1;for(b.reset();b.next();){var c=b.value;c.layer-= +a;this.yb=Math.max(this.yb,c.layer)}}};function Tr(a){for(var b=a.network.vertexes.i;b.next();){var c=Xr(a,b.value);a.yb=Math.max(c,a.yb)}}function Xr(a,b){var c=0;if(-1===b.layer){for(var d=b.pc;d.next();)var e=d.value,g=e.toVertex,e=a.linkMinLength(e),c=Math.max(c,Xr(a,g)+e);b.layer=c}else c=b.layer;return c}function Vr(a,b){var c=0;if(-1===b.layer){for(var d=b.tc;d.next();)var e=d.value,g=e.fromVertex,e=a.linkMinLength(e),c=Math.max(c,Vr(a,g)+e);b.layer=c}else c=b.layer;return c} +function Wr(a,b){if(!b.valid){b.valid=!0;for(var c=b.pc;c.next();)Wr(a,c.value.toVertex);for(c=a.network.vertexes.i;c.next();)c.value.component=-1;for(var d=b.Ze.o,e=d.length,g=0;g<e;g++){var h=d[g],k=a.linkMinLength(h);h.fromVertex.layer-h.toVertex.layer>k&&Qr(a,h.fromVertex,0,-1,!0,!1)}for(Qr(a,b,1,-1,!0,!0);0!==b.component;){for(var k=0,d=Infinity,l=0,m=null,n=a.network.vertexes.i;n.next();){var p=n.value;if(1===p.component){for(var q=0,r=!1,s=p.Ze.o,e=s.length,g=0;g<e;g++){var h=s[g],t=h.fromVertex, +q=q+1;1!==t.component&&(k+=1,t=t.layer-p.layer,h=a.linkMinLength(h),d=Math.min(d,t-h))}h=p.Te.o;e=h.length;for(g=0;g<e;g++)s=h[g].toVertex,q-=1,1!==s.component?k-=1:r=!0;(null===m||q<l)&&!r&&(m=p,l=q)}}if(0<k){for(c.reset();c.next();)e=c.value,1===e.component&&(e.layer+=d);b.component=0}else m.component=0}for(c=a.network.vertexes.i;c.next();)c.value.component=-1;for(Qr(a,b,1,-1,!0,!1);0!==b.component;){g=0;e=Infinity;d=0;k=null;for(l=a.network.vertexes.i;l.next();)if(m=l.value,1===m.component){n= +0;p=!1;h=m.Ze.o;q=h.length;for(r=0;r<q;r++)s=h[r].fromVertex,n+=1,1!==s.component?g+=1:p=!0;h=m.Te.o;q=h.length;for(r=0;r<q;r++)s=h[r],t=s.toVertex,n-=1,1!==t.component&&(g-=1,t=m.layer-t.layer,s=a.linkMinLength(s),e=Math.min(e,t-s));(null===k||n>d)&&!p&&(k=m,d=n)}if(0>g){for(c.reset();c.next();)g=c.value,1===g.component&&(g.layer-=e);b.component=0}else k.component=0}}} +function Gr(a,b,c){return 90===a.fa?c&&!b.rev||!c&&b.rev?270:90:180===a.fa?c&&!b.rev||!c&&b.rev?0:180:270===a.fa?c&&!b.rev||!c&&b.rev?90:270:c&&!b.rev||!c&&b.rev?180:0} +pn.prototype.initializeIndices=function(){switch(this.no){default:case Yr:for(var a=this.network.vertexes.i;a.next();){var b=a.value,c=b.layer;b.index=this.ge[c];this.ge[c]++}break;case wr:a=this.network.vertexes.i;for(b=this.yb;0<=b;b--)for(a.reset();a.next();)c=a.value,c.layer===b&&-1===c.index&&Zr(this,c);break;case $r:for(a=this.network.vertexes.i,b=0;b<=this.yb;b++)for(a.reset();a.next();)c=a.value,c.layer===b&&-1===c.index&&as(this,c)}}; +function Zr(a,b){var c=b.layer;b.index=a.ge[c];a.ge[c]++;for(var c=b.Te.jc(),d=!0;d;)for(var d=!1,e=0;e<c.length-1;e++){var g=c[e],h=c[e+1];g.portFromColOffset>h.portFromColOffset&&(d=!0,c[e]=h,c[e+1]=g)}for(e=0;e<c.length;e++)d=c[e],d.valid&&(d=d.toVertex,-1===d.index&&Zr(a,d))} +function as(a,b){var c=b.layer;b.index=a.ge[c];a.ge[c]++;for(var c=b.Ze.jc(),d=!0,e=0;d;)for(d=!1,e=0;e<c.length-1;e++){var g=c[e],h=c[e+1];g.portToColOffset>h.portToColOffset&&(d=!0,c[e]=h,c[e+1]=g)}for(e=0;e<c.length;e++)d=c[e],d.valid&&(d=d.fromVertex,-1===d.index&&as(a,d))} +pn.prototype.reduceCrossings=function(){for(var a=this.countCrossings(),b=Kr(this),c=0,d=0,e=0,c=0;c<this.nm;c++){for(d=0;d<=this.yb;d++)bs(this,d,1),cs(this,d,1);e=this.countCrossings();e<a&&(a=e,b=Kr(this));for(d=this.yb;0<=d;d--)bs(this,d,-1),cs(this,d,-1);e=this.countCrossings();e<a&&(a=e,b=Kr(this))}Lr(this,b);for(c=0;c<this.nm;c++){for(d=0;d<=this.yb;d++)bs(this,d,0),cs(this,d,0);e=this.countCrossings();e<a&&(a=e,b=Kr(this));for(d=this.yb;0<=d;d--)bs(this,d,0),cs(this,d,0);e=this.countCrossings(); +e<a&&(a=e,b=Kr(this))}Lr(this,b);var g=!1,h=c=0,k=0,d=0;switch(this.Fn){case ds:break;case es:for(k=a+1;(d=this.countCrossings())<k;)for(k=d,c=this.yb;0<=c;c--)for(h=0;h<=c;h++){for(g=!0;g;)for(g=!1,d=c;d>=h;d--)g=cs(this,d,-1)||g;e=this.countCrossings();e>=a?Lr(this,b):(a=e,b=Kr(this));for(g=!0;g;)for(g=!1,d=c;d>=h;d--)g=cs(this,d,1)||g;e=this.countCrossings();e>=a?Lr(this,b):(a=e,b=Kr(this));for(g=!0;g;)for(g=!1,d=h;d<=c;d++)g=cs(this,d,1)||g;e>=a?Lr(this,b):(a=e,b=Kr(this));for(g=!0;g;)for(g=!1, +d=h;d<=c;d++)g=cs(this,d,-1)||g;e>=a?Lr(this,b):(a=e,b=Kr(this));for(g=!0;g;)for(g=!1,d=c;d>=h;d--)g=cs(this,d,0)||g;e>=a?Lr(this,b):(a=e,b=Kr(this));for(g=!0;g;)for(g=!1,d=h;d<=c;d++)g=cs(this,d,0)||g;e>=a?Lr(this,b):(a=e,b=Kr(this))}break;default:case xr:for(c=this.yb,h=0,k=a+1;(d=this.countCrossings())<k;){k=d;for(g=!0;g;)for(g=!1,d=c;d>=h;d--)g=cs(this,d,-1)||g;e=this.countCrossings();e>=a?Lr(this,b):(a=e,b=Kr(this));for(g=!0;g;)for(g=!1,d=c;d>=h;d--)g=cs(this,d,1)||g;e=this.countCrossings(); +e>=a?Lr(this,b):(a=e,b=Kr(this));for(g=!0;g;)for(g=!1,d=h;d<=c;d++)g=cs(this,d,1)||g;e>=a?Lr(this,b):(a=e,b=Kr(this));for(g=!0;g;)for(g=!1,d=h;d<=c;d++)g=cs(this,d,-1)||g;e>=a?Lr(this,b):(a=e,b=Kr(this));for(g=!0;g;)for(g=!1,d=c;d>=h;d--)g=cs(this,d,0)||g;e>=a?Lr(this,b):(a=e,b=Kr(this));for(g=!0;g;)for(g=!1,d=h;d<=c;d++)g=cs(this,d,0)||g;e>=a?Lr(this,b):(a=e,b=Kr(this))}}Lr(this,b)}; +function bs(a,b,c){u&&(z.p(b,pn,"medianBarycenterCrossingReduction:unfixedLayer"),z.p(c,pn,"medianBarycenterCrossingReduction:direction"));var d=0,e=Hr(a,b),g=a.ge[b],h=Pr(a,b,c);c=Or(a,b,c);for(d=0;d<g;d++)-1===c[d]&&(c[d]=e[d].column),-1===h[d]&&(h[d]=e[d].column);for(var k=!0,l;k;)for(k=!1,d=0;d<g-1;d++)if(h[d+1]<h[d]||h[d+1]===h[d]&&c[d+1]<c[d])k=!0,l=h[d],h[d]=h[d+1],h[d+1]=l,l=c[d],c[d]=c[d+1],c[d+1]=l,l=e[d],e[d]=e[d+1],e[d+1]=l;for(d=h=0;d<g;d++)l=e[d],l.index=d,h+=a.nodeMinColumnSpace(l, +!0),l.column=h,h+=1,h+=a.nodeMinColumnSpace(l,!1);Ir(a,b,e)} +function cs(a,b,c){var d=Hr(a,b),e=a.ge[b];c=Mr(a,b,c);var g=0,h;h=[];for(g=0;g<e;g++)h[g]=-1;var k;k=[];for(g=0;g<e;g++)k[g]=-1;for(var l=!1,m=!0;m;)for(m=!1,g=0;g<e-1;g++){var n=c[d[g].index*e+d[g+1].index],p=c[d[g+1].index*e+d[g].index],q=0,r=0,s=d[g].column,t=d[g+1].column,v=a.nodeMinColumnSpace(d[g],!0),x=a.nodeMinColumnSpace(d[g],!1),y=a.nodeMinColumnSpace(d[g+1],!0),A=a.nodeMinColumnSpace(d[g+1],!1),v=s-v+y,x=t-x+A,y=y=0,C=d[g].tc.i;for(C.reset();C.next();)if(A=C.value,A.valid&&A.fromVertex.layer=== +b){A=A.fromVertex;for(y=0;d[y]!==A;)y++;y<g&&(q+=2*(g-y),r+=2*(g+1-y));y===g+1&&(q+=1);y>g+1&&(q+=4*(y-g),r+=4*(y-(g+1)))}C=d[g].pc.i;for(C.reset();C.next();)if(A=C.value,A.valid&&A.toVertex.layer===b){A=A.toVertex;for(y=0;d[y]!==A;)y++;y===g+1&&(r+=1)}C=d[g+1].tc.i;for(C.reset();C.next();)if(A=C.value,A.valid&&A.fromVertex.layer===b){A=A.fromVertex;for(y=0;d[y]!==A;)y++;y<g&&(q+=2*(g+1-y),r+=2*(g-y));y===g&&(r+=1);y>g+1&&(q+=4*(y-(g+1)),r+=4*(y-g))}C=d[g+1].pc.i;for(C.reset();C.next();)if(A=C.value, +A.valid&&A.toVertex.layer===b){A=A.toVertex;for(y=0;d[y]!==A;)y++;y===g&&(q+=1)}var y=A=0,C=h[d[g].index],L=k[d[g].index],H=h[d[g+1].index],U=k[d[g+1].index];-1!==C&&(A+=Math.abs(C-s),y+=Math.abs(C-x));-1!==L&&(A+=Math.abs(L-s),y+=Math.abs(L-x));-1!==H&&(A+=Math.abs(H-t),y+=Math.abs(H-v));-1!==U&&(A+=Math.abs(U-t),y+=Math.abs(U-v));if(r<q-.5||r===q&&p<n-.5||r===q&&p===n&&y<A-.5)m=l=!0,d[g].column=x,d[g+1].column=v,n=d[g],d[g]=d[g+1],d[g+1]=n}for(g=0;g<e;g++)d[g].index=g;Ir(a,b,d);return l} +pn.prototype.straightenAndPack=function(){var a=0,b=!1,c=0!==(this.Si&fs),a=this.Si===yr;1E3<this.network.edges.count&&!a&&(c=!1);if(c){b=[];for(a=a=0;a<=this.yb;a++)b[a]=0;for(var d=0,e=this.network.vertexes.i;e.next();){var g=e.value,a=g.layer,d=g.column,g=this.nodeMinColumnSpace(g,!1);b[a]=Math.max(b[a],d+g)}for(e.reset();e.next();)g=e.value,a=g.layer,d=g.column,g.column=(8*(this.Kb-b[a])>>1)+8*d;this.Kb*=8}if(0!==(this.Si&gs))for(b=!0;b;){b=!1;for(a=this.Rf+1;a<=this.yb;a++)b=hs(this,a,1)||b; +for(a=this.Rf-1;0<=a;a--)b=hs(this,a,-1)||b;b=hs(this,this.Rf,0)||b}if(0!==(this.Si&is)){for(a=this.Rf+1;a<=this.yb;a++)js(this,a,1);for(a=this.Rf-1;0<=a;a--)js(this,a,-1);js(this,this.Rf,0)}c&&(ks(this,-1),ks(this,1));if(0!==(this.Si&gs))for(b=!0;b;){b=!1;b=hs(this,this.Rf,0)||b;for(a=this.Rf+1;a<=this.yb;a++)b=hs(this,a,0)||b;for(a=this.Rf-1;0<=a;a--)b=hs(this,a,0)||b}}; +function hs(a,b,c){u&&(z.p(b,pn,"bendStraighten:unfixedLayer"),z.p(c,pn,"bendStraighten:direction"));for(var d=!1;ls(a,b,c);)d=!0;return d} +function ls(a,b,c){u&&(z.p(b,pn,"shiftbendStraighten:unfixedLayer"),z.p(c,pn,"shiftbendStraighten:direction"));var d=0,e=Hr(a,b),g=a.ge[b],h=Or(a,b,-1);if(0<c)for(d=0;d<g;d++)h[d]=-1;var k=Or(a,b,1);if(0>c)for(d=0;d<g;d++)k[d]=-1;for(var l=!1,m=!0;m;)for(m=!1,d=0;d<g;d++){var n=e[d].column,p=a.nodeMinColumnSpace(e[d],!0),q=a.nodeMinColumnSpace(e[d],!1),r=0,r=0>d-1||n-e[d-1].column-1>p+a.nodeMinColumnSpace(e[d-1],!1)?n-1:n,p=0,p=d+1>=g||e[d+1].column-n-1>q+a.nodeMinColumnSpace(e[d+1],!0)?n+1:n,s=q= +0,t=0,v=0,x=0,y=0;if(0>=c)for(var A=e[d].tc.i;A.next();){var C=A.value;C.valid&&C.fromVertex.layer!==b&&(v=Jr(C),x=C.portFromColOffset,y=C.portToColOffset,C=C.fromVertex.column,q+=(Math.abs(n+y-(C+x))+1)*v,s+=(Math.abs(r+y-(C+x))+1)*v,t+=(Math.abs(p+y-(C+x))+1)*v)}if(0<=c)for(A=e[d].pc.i;A.next();)C=A.value,C.valid&&C.toVertex.layer!==b&&(v=Jr(C),x=C.portFromColOffset,y=C.portToColOffset,C=C.toVertex.column,q+=(Math.abs(n+x-(C+y))+1)*v,s+=(Math.abs(r+x-(C+y))+1)*v,t+=(Math.abs(p+x-(C+y))+1)*v);y= +x=v=0;A=h[e[d].index];C=k[e[d].index];-1!==A&&(v+=Math.abs(A-n),x+=Math.abs(A-r),y+=Math.abs(A-p));-1!==C&&(v+=Math.abs(C-n),x+=Math.abs(C-r),y+=Math.abs(C-p));if(s<q||s===q&&x<v)m=l=!0,e[d].column=r;else if(t<q||t===q&&y<v)m=l=!0,e[d].column=p}Ir(a,b,e);a.normalize();return l} +function js(a,b,c){u&&(z.p(b,pn,"medianStraighten:unfixedLayer"),z.p(c,pn,"medianStraighten:direction"));var d=0,e=Hr(a,b),g=a.ge[b],h=Pr(a,b,c);c=[];for(d=0;d<g;d++)c[d]=h[d];for(h=!0;h;)for(h=!1,d=0;d<g;d++){var k=e[d].column,l=a.nodeMinColumnSpace(e[d],!0),m=a.nodeMinColumnSpace(e[d],!1),n=0,p=0,q=0,q=p=0;-1===c[d]?0===d&&d===g-1?n=k:0===d?(p=e[d+1].column,n=p-k===m+a.nodeMinColumnSpace(e[d+1],!0)?k-1:k):d===g-1?(q=e[d-1].column,n=k-q===l+a.nodeMinColumnSpace(e[d-1],!1)?k+1:k):(q=e[d-1].column, +q=q+a.nodeMinColumnSpace(e[d-1],!1)+l+1,p=e[d+1].column,p=p-a.nodeMinColumnSpace(e[d+1],!0)-m-1,n=(q+p)/2|0):0===d&&d===g-1?n=c[d]:0===d?(p=e[d+1].column,p=p-a.nodeMinColumnSpace(e[d+1],!0)-m-1,n=Math.min(c[d],p)):d===g-1?(q=e[d-1].column,q=q+a.nodeMinColumnSpace(e[d-1],!1)+l+1,n=Math.max(c[d],q)):(q=e[d-1].column,q=q+a.nodeMinColumnSpace(e[d-1],!1)+l+1,p=e[d+1].column,p=p-a.nodeMinColumnSpace(e[d+1],!0)-m-1,q<c[d]&&c[d]<p?n=c[d]:q>=c[d]?n=q:p<=c[d]&&(n=p));n!==k&&(h=!0,e[d].column=n)}Ir(a,b,e);a.normalize()} +function ms(a,b){u&&(z.p(b,pn,"packAux:column"),z.p(1,pn,"packAux:direction"));for(var c=!0,d=a.network.vertexes.i;d.next();){var e=d.value,g=a.nodeMinColumnSpace(e,!0),h=a.nodeMinColumnSpace(e,!1);if(e.column-g<=b&&e.column+h>=b){c=!1;break}}e=!1;if(c)for(d.reset();d.next();)c=d.value,c.column>b&&(c.column-=1,e=!0);return e} +function ns(a,b){u&&(z.p(b,pn,"tightPackAux:column"),z.p(1,pn,"tightPackAux:direction"));for(var c=b,c=b+1,d=0,e=[],g=[],d=0;d<=a.yb;d++)e[d]=!1,g[d]=!1;for(var h=a.network.vertexes.i;h.next();){var d=h.value,k=d.column-a.nodeMinColumnSpace(d,!0),l=d.column+a.nodeMinColumnSpace(d,!1);k<=b&&l>=b&&(e[d.layer]=!0);k<=c&&l>=c&&(g[d.layer]=!0)}k=!0;c=!1;for(d=0;d<=a.yb;d++)k=k&&!(e[d]&&g[d]);if(k)for(h.reset();h.next();)e=h.value,e.column>b&&(e.column-=1,c=!0);return c} +function ks(a,b){u&&z.p(b,pn,"componentPack:direction");for(var c=0;c<=a.Kb;c++)for(;ms(a,c););a.normalize();for(c=0;c<a.Kb;c++)for(;ns(a,c););a.normalize();var c=0,d,e=0,g=0,h=0;if(0<b)for(c=0;c<=a.Kb;c++)for(d=Kr(a),e=Nr(a),g=e+1;e<g;)g=e,os(a,c,1),h=Nr(a),h>e?Lr(a,d):h<e&&(e=h,d=Kr(a));if(0>b)for(c=a.Kb;0<=c;c--)for(d=Kr(a),e=Nr(a),g=e+1;e<g;)g=e,os(a,c,-1),h=Nr(a),h>e?Lr(a,d):h<e&&(e=h,d=Kr(a));a.normalize()} +function os(a,b,c){a.wg=0;for(var d=a.network.vertexes.i;d.next();)d.value.component=-1;if(0<c)for(d.reset();d.next();){var e=d.value;e.column-a.nodeMinColumnSpace(e,!0)<=b&&(e.component=a.wg)}if(0>c)for(d.reset();d.next();)e=d.value,e.column+a.nodeMinColumnSpace(e,!1)>=b&&(e.component=a.wg);a.wg++;for(d.reset();d.next();)b=d.value,-1===b.component&&(Rr(a,b,a.wg,-1,!0,!0),a.wg++);var g=0;b=[];for(g=0;g<a.wg*a.wg;g++)b[g]=!1;e=[];for(g=0;g<(a.yb+1)*(a.Kb+1);g++)e[g]=-1;for(d.reset();d.next();)for(var g= +d.value,h=g.layer,k=Math.max(0,g.column-a.nodeMinColumnSpace(g,!0)),l=Math.min(a.Kb,g.column+a.nodeMinColumnSpace(g,!1));k<=l;k++)e[h*(a.Kb+1)+k]=g.component;for(g=0;g<=a.yb;g++){if(0<c)for(k=0;k<a.Kb;k++)-1!==e[g*(a.Kb+1)+k]&&-1!==e[g*(a.Kb+1)+k+1]&&e[g*(a.Kb+1)+k]!==e[g*(a.Kb+1)+k+1]&&(b[e[g*(a.Kb+1)+k]*a.wg+e[g*(a.Kb+1)+k+1]]=!0);if(0>c)for(k=a.Kb;0<k;k--)-1!==e[g*(a.Kb+1)+k]&&-1!==e[g*(a.Kb+1)+k-1]&&e[g*(a.Kb+1)+k]!==e[g*(a.Kb+1)+k-1]&&(b[e[g*(a.Kb+1)+k]*a.wg+e[g*(a.Kb+1)+k-1]]=!0)}e=[];for(g= +0;g<a.wg;g++)e[g]=!0;h=new J("number");h.add(0);for(l=0;0!==h.count;)if(l=h.o[h.count-1],h.dd(h.count-1),e[l])for(e[l]=!1,g=0;g<a.wg;g++)b[l*a.wg+g]&&h.Ld(0,g);if(0<c)for(d.reset();d.next();)a=d.value,e[a.component]&&(a.column-=1);if(0>c)for(d.reset();d.next();)c=d.value,e[c.component]&&(c.column+=1)} +pn.prototype.commitLayout=function(){if(this.aq)for(var a=Fr(this,!0),b=Fr(this,!1),c=this.network.edges.i;c.next();){var d=c.value.link;null!==d&&(d.Db=a,d.Eb=b)}this.commitNodes();this.Gz();this.Rt&&this.commitLinks()};function Fr(a,b){return 270===a.fa?b?Zc:bd:90===a.fa?b?bd:Zc:180===a.fa?b?$c:ad:b?ad:$c} +pn.prototype.commitNodes=function(){this.ug=[];this.Qf=[];this.Pf=[];this.Rb=[];for(var a=0;a<=this.yb;a++)this.ug[a]=0,this.Qf[a]=0,this.Pf[a]=0,this.Rb[a]=0;for(a=this.network.vertexes.i;a.next();){var b=a.value,c=b.layer;this.ug[c]=Math.max(this.ug[c],this.nodeMinLayerSpace(b,!0));this.Qf[c]=Math.max(this.Qf[c],this.nodeMinLayerSpace(b,!1))}for(var b=0,d=this.pm,c=0;c<=this.yb;c++){var e=d;0>=this.ug[c]+this.Qf[c]&&(e=0);0<c&&(b+=e/2);90===this.fa||0===this.fa?(b+=this.Qf[c],this.Pf[c]=b,b+=this.ug[c]): +(b+=this.ug[c],this.Pf[c]=b,b+=this.Qf[c]);c<this.yb&&(b+=e/2);this.Rb[c]=b}d=b;b=this.je;for(c=0;c<=this.yb;c++)270===this.fa?this.Pf[c]=b.y+this.Pf[c]:90===this.fa?(this.Pf[c]=b.y+d-this.Pf[c],this.Rb[c]=d-this.Rb[c]):180===this.fa?this.Pf[c]=b.x+this.Pf[c]:(this.Pf[c]=b.x+d-this.Pf[c],this.Rb[c]=d-this.Rb[c]);a.reset();for(d=e=Infinity;a.next();){var c=a.value,g=c.layer,h=c.column|0,k=0,l=0;270===this.fa||90===this.fa?(k=b.x+this.Td*h,l=this.Pf[g]):(k=this.Pf[g],l=b.y+this.Td*h);c.ra=k;c.za=l; +e=Math.min(c.x,e);d=Math.min(c.y,d)}e=b.x-e;b=b.y-d;this.sB=null!==this.group?new N(e,b):Id;for(a.reset();a.next();)c=a.value,null!==this.group&&(c.x+=e,c.y+=b),c.commit()}; +pn.prototype.Gz=function(){for(var a=0,b=this.pm,c=0;c<=this.yb;c++)a+=this.ug[c],a+=this.Qf[c];for(var a=a+this.yb*b,b=[],c=this.Td*this.Kb,d=this.yI;0<=d;d--)270===this.fa?0===d?b.push(new w(0,0,c,Math.abs(this.Rb[0]))):b.push(new w(0,this.Rb[d-1],c,Math.abs(this.Rb[d-1]-this.Rb[d]))):90===this.fa?0===d?b.push(new w(0,this.Rb[0],c,Math.abs(this.Rb[0]-a))):b.push(new w(0,this.Rb[d],c,Math.abs(this.Rb[d-1]-this.Rb[d]))):180===this.fa?0===d?b.push(new w(0,0,Math.abs(this.Rb[0]),c)):b.push(new w(this.Rb[d- +1],0,Math.abs(this.Rb[d-1]-this.Rb[d]),c)):0===d?b.push(new w(this.Rb[0],0,Math.abs(this.Rb[0]-a),c)):b.push(new w(this.Rb[d],0,Math.abs(this.Rb[d-1]-this.Rb[d]),c));this.commitLayers(b,this.sB)};pn.prototype.commitLayers=function(){}; +pn.prototype.commitLinks=function(){for(var a=this.network.edges.i,b;a.next();)b=a.value.link,null!==b&&(b.Ul(),b.ep(),b.dj());for(a.reset();a.next();)b=a.value.link,null!==b&&b.An();for(a.reset();a.next();){var c=a.value;b=c.link;if(null!==b){b.Ul();var d=b,e=d.Y,g=d.da,h=d.md,k=d.Qd;if(c.valid){if(b.Se===Xi&&4===b.sa){if(c.rev)var l=e,e=g,g=l,m=h,h=k,k=m;if(c.fromVertex.column===c.toVertex.column){var n=b.getLinkPoint(e,h,b.computeSpot(!0),!0,!1,g,k),p=b.getLinkPoint(g,k,b.computeSpot(!1),!1,!1, +e,h);n.F()||n.set(e.W.yl);p.F()||p.set(g.W.yl);b.ep();b.tl(n.x,n.y);b.tl((2*n.x+p.x)/3,(2*n.y+p.y)/3);b.tl((n.x+2*p.x)/3,(n.y+2*p.y)/3);b.tl(p.x,p.y)}else{var q=!1,r=!1;null!==h&&b.computeSpot(!0)===Yb&&(q=!0);null!==k&&b.computeSpot(!1)===Yb&&(r=!0);if(q||r){var s=b.m(0).x,t=b.m(0).y,v=b.m(1).x,x=b.m(1).y,y=b.m(2).x,A=b.m(2).y,C=b.m(3).x,L=b.m(3).y;if(q){90===this.fa||270===this.fa?(v=s,x=(t+L)/2):(v=(s+C)/2,x=t);b.aa(1,v,x);var H=b.getLinkPoint(e,h,b.computeSpot(!0),!0,!1,g,k);H.F()||H.set(e.W.yl); +b.aa(0,H.x,H.y)}r&&(90===this.fa||270===this.fa?(y=C,A=(t+L)/2):(y=(s+C)/2,A=L),b.aa(2,y,A),H=b.getLinkPoint(g,k,b.computeSpot(!1),!1,!1,e,h),H.F()||H.set(g.W.yl),b.aa(3,H.x,H.y))}}}b.dj()}else if(c.fromVertex.layer===c.toVertex.layer)b.dj();else{var U=!1,ea=!1,W=0,P=b.Ct+1;if(b.rc)ea=!0,W=b.sa,4<W&&b.points.removeRange(2,W-3);else if(b.Se===Xi)U=!0,W=b.sa,4<W&&b.points.removeRange(2,W-3),P=2;else{var W=b.sa,ba=b.computeSpot(!0)===Yb,Oa=b.computeSpot(!1)===Yb;2<W&&ba&&Oa?b.points.removeRange(1,W- +2):3<W&&ba&&!Oa?b.points.removeRange(1,W-3):3<W&&!ba&&Oa?b.points.removeRange(2,W-2):4<W&&!ba&&!Oa&&b.points.removeRange(2,W-3)}var sa=c.fromVertex,Na=c.toVertex,ua,Ha;if(c.rev){for(var Aa=0;null!==Na&&sa!==Na;){Ha=ua=null;for(var jc=Na.tc.i;jc.next();){var zd=jc.value;if(zd.link===c.link&&(ua=zd.fromVertex,Ha=zd.toVertex,null===ua.Bd))break}if(ua!==sa)if(rb=b.m(P-1).x,gb=b.m(P-1).y,oa=ua.ra,pa=ua.za,ea)180===this.fa||0===this.fa?2===P?(b.B(P++,rb,gb),b.B(P++,rb,pa)):(Ae=null!==Ha?Ha.za:gb,Ae!==pa&& +(sb=this.Rb[ua.layer-1],b.B(P++,sb,gb),b.B(P++,sb,pa))):2===P?(b.B(P++,rb,gb),b.B(P++,oa,gb)):(Cd=null!==Ha?Ha.ra:rb,Cd!==oa&&(sb=this.Rb[ua.layer-1],b.B(P++,rb,sb),b.B(P++,oa,sb)));else if(2===P)if(Xa=Math.max(10,this.ug[Na.layer]),Va=Math.max(10,this.Qf[Na.layer]),U)180===this.fa?oa<=Na.P.x?(Aa=Na.P.x,b.B(P++,Aa-Xa,pa),b.B(P++,Aa,pa),b.B(P++,Aa+Va,pa)):(b.B(P++,oa-Xa,pa),b.B(P++,oa,pa),b.B(P++,oa+Va,pa)):90===this.fa?pa>=Na.P.bottom?(Aa=Na.P.y+Na.P.height,b.B(P++,oa,Aa+Va),b.B(P++,oa,Aa),b.B(P++, +oa,Aa-Xa)):(b.B(P++,oa,pa+Va),b.B(P++,oa,pa),b.B(P++,oa,pa-Xa)):270===this.fa?pa<=Na.P.y?(Aa=Na.P.y,b.B(P++,oa,Aa-Xa),b.B(P++,oa,Aa),b.B(P++,oa,Aa+Va)):(b.B(P++,oa,pa-Xa),b.B(P++,oa,pa),b.B(P++,oa,pa+Va)):0===this.fa&&(oa>=Na.P.right?(Aa=Na.P.x+Na.P.width,b.B(P++,Aa+Va,pa),b.B(P++,Aa,pa),b.B(P++,Aa-Xa,pa)):(b.B(P++,oa+Va,pa),b.B(P++,oa,pa),b.B(P++,oa-Xa,pa)));else{b.B(P++,rb,gb);var Ad=0;if(180===this.fa||0===this.fa){if(180===this.fa?oa>=Na.P.right:oa<=Na.P.x)Ad=(0===this.fa?-Xa:Va)/2;b.B(P++,rb+ +Ad,pa)}else{if(270===this.fa?pa>=Na.P.bottom:pa<=Na.P.y)Ad=(90===this.fa?-Xa:Va)/2;b.B(P++,oa,gb+Ad)}b.B(P++,oa,pa)}else Xa=Math.max(10,this.ug[ua.layer]),Va=Math.max(10,this.Qf[ua.layer]),180===this.fa?(U&&b.B(P++,oa-Xa,pa),b.B(P++,oa,pa),U&&b.B(P++,oa+Va,pa)):90===this.fa?(U&&b.B(P++,oa,pa+Va),b.B(P++,oa,pa),U&&b.B(P++,oa,pa-Xa)):270===this.fa?(U&&b.B(P++,oa,pa-Xa),b.B(P++,oa,pa),U&&b.B(P++,oa,pa+Va)):(U&&b.B(P++,oa+Va,pa),b.B(P++,oa,pa),U&&b.B(P++,oa-Xa,pa));Na=ua}if(null===k||b.computeSpot(!1)!== +Yb||ea)if(rb=b.m(P-1).x,gb=b.m(P-1).y,oa=b.m(P).x,pa=b.m(P).y,ea){var Qe=this.Qf[sa.layer],ac=0;180===this.fa||0===this.fa?(ac=gb,ac>=sa.P.y&&ac<=sa.P.bottom&&(180===this.fa?oa>=sa.P.x:oa<=sa.P.right)&&(Aa=sa.ra+(180===this.fa?-Qe:Qe),ac=ac<sa.P.y+sa.P.height/2?sa.P.y-this.Td/2:sa.P.bottom+this.Td/2,b.B(P++,Aa,gb),b.B(P++,Aa,ac)),b.B(P++,oa,ac)):(ac=rb,ac>=sa.P.x&&ac<=sa.P.right&&(270===this.fa?pa>=sa.P.y:pa<=sa.P.bottom)&&(Aa=sa.za+(270===this.fa?-Qe:Qe),ac=ac<sa.P.x+sa.P.width/2?sa.P.x-this.Td/ +2:sa.P.right+this.Td/2,b.B(P++,rb,Aa),b.B(P++,ac,Aa)),b.B(P++,ac,pa));b.B(P++,oa,pa)}else if(U)Xa=Math.max(10,this.ug[sa.layer]),Va=Math.max(10,this.Qf[sa.layer]),180===this.fa&&oa>=sa.P.x?(Aa=sa.P.x+sa.P.width,b.aa(P-2,Aa,gb),b.aa(P-1,Aa+Va,gb)):90===this.fa&&pa<=sa.P.bottom?(Aa=sa.P.y,b.aa(P-2,rb,Aa),b.aa(P-1,rb,Aa-Xa)):270===this.fa&&pa>=sa.P.y?(Aa=sa.P.y+sa.P.height,b.aa(P-2,rb,Aa),b.aa(P-1,rb,Aa+Va)):0===this.fa&&oa<=sa.P.right&&(Aa=sa.P.x,b.aa(P-2,Aa,gb),b.aa(P-1,Aa-Xa,gb));else{Xa=Math.max(10, +this.ug[sa.layer]);Va=Math.max(10,this.Qf[sa.layer]);Ad=0;if(180===this.fa||0===this.fa){if(180===this.fa?oa<=sa.P.x:oa>=sa.P.right)Ad=(0===this.fa?Va:-Xa)/2;b.B(P++,oa+Ad,gb)}else{if(270===this.fa?pa<=sa.P.y:pa>=sa.P.bottom)Ad=(90===this.fa?Va:-Xa)/2;b.B(P++,rb,pa+Ad)}b.B(P++,oa,pa)}}else{for(;null!==sa&&sa!==Na;){Ha=ua=null;for(var Ng=sa.pc.i;Ng.next();){var Bd=Ng.value;if(Bd.link===c.link&&(ua=Bd.toVertex,Ha=Bd.fromVertex,null!==Ha.Bd&&(Ha=null),null===ua.Bd))break}var rb=0,gb=0,oa=0,pa=0,sb=0, +Xa=0,Va=0;if(ua!==Na)if(rb=b.m(P-1).x,gb=b.m(P-1).y,oa=ua.ra,pa=ua.za,ea)if(180===this.fa||0===this.fa){var Ae=null!==Ha?Ha.za:gb;Ae!==pa&&(sb=this.Rb[ua.layer],2===P&&(sb=0===this.fa?Math.max(sb,rb):Math.min(sb,rb)),b.B(P++,sb,gb),b.B(P++,sb,pa))}else{var Cd=null!==Ha?Ha.ra:rb;Cd!==oa&&(sb=this.Rb[ua.layer],2===P&&(sb=90===this.fa?Math.max(sb,gb):Math.min(sb,gb)),b.B(P++,rb,sb),b.B(P++,oa,sb))}else Xa=Math.max(10,this.ug[ua.layer]),Va=Math.max(10,this.Qf[ua.layer]),180===this.fa?(b.B(P++,oa+Va,pa), +U&&b.B(P++,oa,pa),b.B(P++,oa-Xa,pa)):90===this.fa?(b.B(P++,oa,pa-Xa),U&&b.B(P++,oa,pa),b.B(P++,oa,pa+Va)):270===this.fa?(b.B(P++,oa,pa+Va),U&&b.B(P++,oa,pa),b.B(P++,oa,pa-Xa)):(b.B(P++,oa-Xa,pa),U&&b.B(P++,oa,pa),b.B(P++,oa+Va,pa));sa=ua}ea&&(rb=b.m(P-1).x,gb=b.m(P-1).y,oa=b.m(P).x,pa=b.m(P).y,180===this.fa||0===this.fa?gb!==pa&&(sb=0===this.fa?Math.min(Math.max((oa+rb)/2,this.Rb[Na.layer]),oa):Math.max(Math.min((oa+rb)/2,this.Rb[Na.layer]),oa),b.B(P++,sb,gb),b.B(P++,sb,pa)):rb!==oa&&(sb=90===this.fa? +Math.min(Math.max((pa+gb)/2,this.Rb[Na.layer]),pa):Math.max(Math.min((pa+gb)/2,this.Rb[Na.layer]),pa),b.B(P++,rb,sb),b.B(P++,oa,sb)))}if(null!==d&&U){if(null!==h){if(b.computeSpot(!0)===Yb){var me=b.m(0),Rd=b.m(2);me.N(Rd)||b.aa(1,(me.x+Rd.x)/2,(me.y+Rd.y)/2)}H=b.getLinkPoint(e,h,Yb,!0,!1,g,k);H.F()||H.set(e.W.yl);b.aa(0,H.x,H.y)}null!==k&&(b.computeSpot(!1)===Yb&&(me=b.m(b.sa-1),Rd=b.m(b.sa-3),me.N(Rd)||b.aa(b.sa-2,(me.x+Rd.x)/2,(me.y+Rd.y)/2)),H=b.getLinkPoint(g,k,Yb,!1,!1,e,h),H.F()||H.set(g.W.yl), +b.aa(b.sa-1,H.x,H.y))}b.dj();c.commit()}}}for(var ne=new J(G),Og=this.network.edges.i;Og.next();){var fd=Og.value.link;null!==fd&&fd.rc&&!ne.contains(fd)&&ne.add(fd)}if(0<ne.count)if(90===this.fa||270===this.fa){for(var ti=0,Ab=new J(ps),Qb,gd,ph=ne.i;ph.next();){var Lb=ph.value;if(null!==Lb&&Lb.rc)for(var kb=2;kb<Lb.sa-3;kb++)if(Qb=Lb.m(kb),gd=Lb.m(kb+1),qs(Qb.y,gd.y)&&!qs(Qb.x,gd.x)){var cb=new ps;cb.layer=Math.floor(Qb.y/2);var Re=Lb.m(0),Sd=Lb.m(Lb.sa-1);cb.first=Re.x*Re.x+Re.y;cb.de=Sd.x*Sd.x+ +Sd.y;cb.Qe=Math.min(Qb.x,gd.x);cb.ke=Math.max(Qb.x,gd.x);cb.index=kb;cb.link=Lb;if(kb+2<Lb.sa){var Pg=Lb.m(kb-1),Qg=Lb.m(kb+2),kc=0;Pg.y<Qb.y?kc=Qg.y<Qb.y?3:Qb.x<gd.x?2:1:Pg.y>Qb.y&&(kc=Qg.y>Qb.y?0:gd.x<Qb.x?2:1);cb.qi=kc}Ab.add(cb)}}if(1<Ab.count){Ab.sort(this.CF);for(var lc=0;lc<Ab.count;){for(var oe=Ab.o[lc].layer,hd=lc+1;hd<Ab.count&&Ab.o[hd].layer===oe;)hd++;if(1<hd-lc)for(var mb=lc;mb<hd;){for(var Uc=Ab.o[mb].ke,Qa=lc+1;Qa<hd&&Ab.o[Qa].Qe<Uc;)Uc=Math.max(Uc,Ab.o[Qa].ke),Qa++;var nb=Qa-mb;if(1< +nb){Ab.dq(this.Ix,mb,mb+nb);for(var yc=1,Dd=Ab.o[mb].de,kb=mb;kb<Qa;kb++){var Mb=Ab.o[kb];Mb.de!==Dd&&(yc++,Dd=Mb.de)}Ab.dq(this.BF,mb,mb+nb);for(var pe=1,Dd=Ab.o[mb].first,kb=mb;kb<Qa;kb++)Mb=Ab.o[kb],Mb.first!==Dd&&(pe++,Dd=Mb.first);var tf=!0,Se=pe;yc<pe?(tf=!1,Se=yc,Dd=Ab.o[mb].de,Ab.dq(this.Ix,mb,mb+nb)):Dd=Ab.o[mb].first;for(var Mf=0,kb=mb;kb<Qa;kb++){Mb=Ab.o[kb];(tf?Mb.first:Mb.de)!==Dd&&(Mf++,Dd=tf?Mb.first:Mb.de);Lb=Mb.link;Qb=Lb.m(Mb.index);gd=Lb.m(Mb.index+1);var Ib=this.XE*(Mf-(Se-1)/ +2);if(!Lb.kj||rs(Qb.x,Qb.y+Ib,gd.x,gd.y+Ib))ti++,Lb.Ul(),Lb.aa(Mb.index,Qb.x,Qb.y+Ib),Lb.aa(Mb.index+1,gd.x,gd.y+Ib),Lb.dj()}}mb=Qa}lc=hd}}}else{for(var Be=0,Rb=new J(ps),Vb,Nb,Jc=ne.i;Jc.next();){var xb=Jc.value;if(null!==xb&&xb.rc)for(var Fb=2;Fb<xb.sa-3;Fb++)if(Vb=xb.m(Fb),Nb=xb.m(Fb+1),qs(Vb.x,Nb.x)&&!qs(Vb.y,Nb.y)){var Ob=new ps;Ob.layer=Math.floor(Vb.x/2);var Td=xb.m(0),Rg=xb.m(xb.sa-1);Ob.first=Td.x+Td.y*Td.y;Ob.de=Rg.x+Rg.y*Rg.y;Ob.Qe=Math.min(Vb.y,Nb.y);Ob.ke=Math.max(Vb.y,Nb.y);Ob.index= +Fb;Ob.link=xb;if(Fb+2<xb.sa){var qh=xb.m(Fb-1),rh=xb.m(Fb+2),Ce=0;qh.x<Vb.x?Ce=rh.x<Vb.x?3:Vb.y<Nb.y?2:1:qh.x>Vb.x&&(Ce=rh.x>Vb.x?0:Nb.y<Vb.y?2:1);Ob.qi=Ce}Rb.add(Ob)}}if(1<Rb.count){Rb.sort(this.CF);for(var Kc=0;Kc<Rb.count;){for(var De=Rb.o[Kc].layer,mc=Kc+1;mc<Rb.count&&Rb.o[mc].layer===De;)mc++;if(1<mc-Kc)for(var Bb=Kc;Bb<mc;){for(var Cb=Rb.o[Bb].ke,Lc=Kc+1;Lc<mc&&Rb.o[Lc].Qe<Cb;)Cb=Math.max(Cb,Rb.o[Lc].ke),Lc++;var Sg=Lc-Bb;if(1<Sg){Rb.dq(this.Ix,Bb,Bb+Sg);for(var Vc=1,Wc=Rb.o[Bb].de,Fb=Bb;Fb< +Lc;Fb++){var lb=Rb.o[Fb];lb.de!==Wc&&(Vc++,Wc=lb.de)}Rb.dq(this.BF,Bb,Bb+Sg);for(var Mc=1,Wc=Rb.o[Bb].first,Fb=Bb;Fb<Lc;Fb++)lb=Rb.o[Fb],lb.first!==Wc&&(Mc++,Wc=lb.first);var Ud=!0,Vd=Mc;Vc<Mc?(Ud=!1,Vd=Vc,Wc=Rb.o[Bb].de,Rb.dq(this.Ix,Bb,Bb+Sg)):Wc=Rb.o[Bb].first;for(var uf=0,Fb=Bb;Fb<Lc;Fb++){lb=Rb.o[Fb];(Ud?lb.first:lb.de)!==Wc&&(uf++,Wc=Ud?lb.first:lb.de);xb=lb.link;Vb=xb.m(lb.index);Nb=xb.m(lb.index+1);var Tg=this.XE*(uf-(Vd-1)/2);if(!xb.kj||rs(Vb.x+Tg,Vb.y,Nb.x+Tg,Nb.y))Be++,xb.Ul(),xb.aa(lb.index, +Vb.x+Tg,Vb.y),xb.aa(lb.index+1,Nb.x+Tg,Nb.y),xb.dj()}}Bb=Lc}Kc=mc}}}};pn.prototype.CF=function(a,b){return a instanceof ps&&b instanceof ps&&a!==b?a.layer<b.layer?-1:a.layer>b.layer?1:a.Qe<b.Qe?-1:a.Qe>b.Qe?1:a.ke<b.ke?-1:a.ke>b.ke?1:0:0};pn.prototype.BF=function(a,b){return a instanceof ps&&b instanceof ps&&a!==b?a.first<b.first?-1:a.first>b.first||a.qi<b.qi?1:a.qi>b.qi||a.Qe<b.Qe?-1:a.Qe>b.Qe?1:a.ke<b.ke?-1:a.ke>b.ke?1:0:0}; +pn.prototype.Ix=function(a,b){return a instanceof ps&&b instanceof ps&&a!==b?a.de<b.de?-1:a.de>b.de||a.qi<b.qi?1:a.qi>b.qi||a.Qe<b.Qe?-1:a.Qe>b.Qe?1:a.ke<b.ke?-1:a.ke>b.ke?1:0:0};function qs(a,b){u&&(z.p(a,pn,"isApprox:a"),z.p(b,pn,"isApprox:b"));var c=a-b;return-1<c&&1>c}function rs(a,b,c,d){u&&(z.p(a,pn,"isUnoccupied2:px"),z.p(b,pn,"isUnoccupied2:py"),z.p(c,pn,"isUnoccupied2:qx"),z.p(d,pn,"isUnoccupied2:qy"));return!0} +function Hr(a,b){var c,d=a.ge[b];if(d>=a.ih.length){c=[];for(var e=0;e<a.ih.length;e++)c[e]=a.ih[e];a.ih=c}void 0===a.ih[d]||null===a.ih[d]?c=[]:(c=a.ih[d],a.ih[d]=null);d=a.Vr[b];for(e=0;e<d.length;e++){var g=d[e];c[g.index]=g}return c}function Ir(a,b,c){a.ih[a.ge[b]]=c}z.defineProperty(pn,{layerSpacing:"layerSpacing"},function(){return this.pm},function(a){this.pm!==a&&(z.g(a,"number",pn,"layerSpacing"),0<=a&&(this.pm=a,this.I()))}); +z.defineProperty(pn,{dK:"columnSpacing"},function(){return this.Td},function(a){this.Td!==a&&(z.g(a,"number",pn,"columnSpacing"),0<a&&(this.Td=a,this.I()))});z.defineProperty(pn,{direction:"direction"},function(){return this.fa},function(a){this.fa!==a&&(z.g(a,"number",pn,"direction"),0===a||90===a||180===a||270===a?(this.fa=a,this.I()):z.k("LayeredDigraphLayout.direction must be 0, 90, 180, or 270"))}); +z.defineProperty(pn,{angle:"angle"},function(){return this.direction},function(a){this.direction=a});z.defineProperty(pn,{lH:"cycleRemoveOption"},function(){return this.Sn},function(a){this.Sn!==a&&(z.Ba(a,pn,pn,"cycleRemoveOption"),a===Ar||a===ur)&&(this.Sn=a,this.I())});z.defineProperty(pn,{pI:"layeringOption"},function(){return this.xo},function(a){this.xo!==a&&(z.Ba(a,pn,pn,"layeringOption"),a===vr||a===Sr||a===Ur)&&(this.xo=a,this.I())}); +z.defineProperty(pn,{aI:"initializeOption"},function(){return this.no},function(a){this.no!==a&&(z.Ba(a,pn,pn,"initializeOption"),a===wr||a===$r||a===Yr)&&(this.no=a,this.I())});z.defineProperty(pn,{MK:"iterations"},function(){return this.nm},function(a){this.nm!==a&&(z.p(a,zr,"iterations"),0<=a&&(this.nm=a,this.I()))});z.defineProperty(pn,{RG:"aggressiveOption"},function(){return this.Fn},function(a){this.Fn!==a&&(z.Ba(a,pn,pn,"aggressiveOption"),a===ds||a===xr||a===es)&&(this.Fn=a,this.I())}); +z.defineProperty(pn,{hL:"packOption"},function(){return this.Si},function(a){this.Si!==a&&(z.g(a,"number",pn,"packOption"),0<=a&&8>a&&(this.Si=a,this.I()))});z.defineProperty(pn,{aq:"setsPortSpots"},function(){return this.$h},function(a){this.$h!==a&&(z.g(a,"boolean",pn,"setsPortSpots"),this.$h=a,this.I())});z.defineProperty(pn,{XE:"linkSpacing"},function(){return this.Br},function(a){this.Br!==a&&(z.g(a,"number",pn,"linkSpacing"),0<=a&&(this.Br=a,this.I()))});z.w(pn,{yI:"maxLayer"},function(){return this.yb}); +z.w(pn,{RK:"maxIndex"},function(){return this.Iv});z.w(pn,{QK:"maxColumn"},function(){return this.Kb});z.w(pn,{WK:"minIndexLayer"},function(){return this.Lr});z.w(pn,{SK:"maxIndexLayer"},function(){return this.Rf});var ur;pn.CycleDepthFirst=ur=z.s(pn,"CycleDepthFirst",0);var Ar;pn.CycleGreedy=Ar=z.s(pn,"CycleGreedy",1);var vr;pn.LayerOptimalLinkLength=vr=z.s(pn,"LayerOptimalLinkLength",0);var Sr;pn.LayerLongestPathSink=Sr=z.s(pn,"LayerLongestPathSink",1);var Ur; +pn.LayerLongestPathSource=Ur=z.s(pn,"LayerLongestPathSource",2);var wr;pn.InitDepthFirstOut=wr=z.s(pn,"InitDepthFirstOut",0);var $r;pn.InitDepthFirstIn=$r=z.s(pn,"InitDepthFirstIn",1);var Yr;pn.InitNaive=Yr=z.s(pn,"InitNaive",2);var ds;pn.AggressiveNone=ds=z.s(pn,"AggressiveNone",0);var xr;pn.AggressiveLess=xr=z.s(pn,"AggressiveLess",1);var es;pn.AggressiveMore=es=z.s(pn,"AggressiveMore",2);pn.PackNone=0;var fs;pn.PackExpand=fs=1;var gs;pn.PackStraighten=gs=2;var is;pn.PackMedian=is=4;var yr; +pn.PackAll=yr=7;function ps(){this.index=this.ke=this.Qe=this.de=this.first=this.layer=0;this.link=null;this.qi=0}z.Yd(ps,{layer:!0,first:!0,de:!0,Qe:!0,ke:!0,index:!0,link:!0,qi:!0});function zr(){wa.call(this)}z.Qa(zr,wa);z.ia("LayeredDigraphNetwork",zr);zr.prototype.createVertex=function(){return new ss};zr.prototype.createEdge=function(){return new ts}; +function ss(){xa.call(this);this.index=this.column=this.layer=-1;this.component=NaN;this.near=null;this.valid=!1;this.finish=this.ip=NaN;this.Tm=0;this.wA=this.xA=null}z.Qa(ss,xa);z.ia("LayeredDigraphVertex",ss);function ts(){ya.call(this);this.forest=this.rev=this.valid=!1;this.portToPos=this.portFromPos=NaN;this.portToColOffset=this.portFromColOffset=0}z.Qa(ts,ya);z.ia("LayeredDigraphEdge",ts); +function Y(){0<arguments.length&&z.od(Y);yg.call(this);this.Fd=new K(Object);this.ds=us;this.Of=vs;this.Zs=ws;this.Gv=xs;this.qB=null;this.Kh=!0;this.qd=ys;this.mg=(new Ea(10,10)).freeze();this.wa=new zs;this.ya=new zs;this.oz=[]}z.Qa(Y,yg);z.ia("TreeLayout",Y);Y.prototype.cloneProtected=function(a){yg.prototype.cloneProtected.call(this,a);a.ds=this.ds;a.Zs=this.Zs;a.Gv=this.Gv;a.Kh=this.Kh;a.qd=this.qd;a.mg.assign(this.mg);a.wa.copyInheritedPropertiesFrom(this.wa);a.ya.copyInheritedPropertiesFrom(this.ya)}; +Y.prototype.createNetwork=function(){return new As};Y.prototype.makeNetwork=function(a){function b(a){if(a instanceof E)return!a.Df&&"Comment"!==a.nc;if(a instanceof G){var b=a.Y;if(null===b||b.Df||"Comment"===b.nc)return!1;a=a.da;return null===a||a.Df||"Comment"===a.nc?!1:!0}return!1}var c=this.createNetwork();c.Sb=this;a instanceof B?(c.jk(a.Mg,!0,b),c.jk(a.links,!0,b)):a instanceof F?c.jk(a.Hc,!1,b):c.jk(a.i,!1,b);return c}; +Y.prototype.doLayout=function(a){null===a&&z.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts");null===this.network&&(this.network=this.makeNetwork(a));this.Yf!==Bs&&(this.je=this.initialOrigin(this.je));var b=this.h;null===b&&a instanceof B&&(b=a);this.Of=this.path===us&&null!==b?b.ce?vs:Cs:this.path===us?vs:this.path;if(0<this.network.vertexes.count){this.network.Tw();for(a=this.network.vertexes.i;a.next();)b=a.value,b.initialized=!1,b.level= +0,b.parent=null,b.children=[];if(0<this.Fd.count){a=new K(zs);for(b=this.Fd.i;b.next();){var c=b.value;c instanceof E?(c=this.network.dn(c),null!==c&&a.add(c)):c instanceof zs&&a.add(c)}this.Fd=a}0===this.Fd.count&&this.findRoots();for(a=this.Fd.copy().i;a.next();)b=a.value,b.initialized||(b.initialized=!0,Ds(this,b));for(a=this.Fd.i;a.next();)b=a.value,b instanceof zs&&Es(this,b);for(a=this.Fd.i;a.next();)b=a.value,b instanceof zs&&Fs(this,b);for(a=this.Fd.i;a.next();)b=a.value,b instanceof zs&& +Gs(this,b);this.Cz();if(this.jA===Hs){c=[];for(a=this.network.vertexes.i;a.next();){var d=a.value,b=d.parent;null===b&&(b=d);var b=0===b.angle||180===b.angle,e=c[d.level];void 0===e&&(e=0);c[d.level]=Math.max(e,b?d.width:d.height)}for(d=0;d<c.length;d++)void 0===c[d]&&(c[d]=0);this.qB=c;for(a=this.network.vertexes.i;a.next();)d=a.value,b=d.parent,null===b&&(b=d),0===b.angle||180===b.angle?(180===b.angle&&(d.Dt+=c[d.level]-d.width),d.width=c[d.level]):(270===b.angle&&(d.Et+=c[d.level]-d.height),d.height= +c[d.level])}else if(this.jA===Is)for(a=this.network.vertexes.i;a.next();){c=a.value;b=0===c.angle||180===c.angle;e=-1;for(d=0;d<c.children.length;d++)var g=c.children[d],e=Math.max(e,b?g.width:g.height);if(0<=e)for(d=0;d<c.children.length;d++)g=c.children[d],b?(180===c.angle&&(g.Dt+=e-g.width),g.width=e):(270===c.angle&&(g.Et+=e-g.height),g.height=e)}for(a=this.Fd.i;a.next();)b=a.value,b instanceof zs&&this.layoutTree(b);this.arrangeTrees();this.updateParts()}this.network=null;this.Fd=new K(Object); +this.Gf=!0}; +Y.prototype.findRoots=function(){for(var a=this.network.vertexes.i;a.next();){var b=a.value;switch(this.Of){case vs:0===b.tc.count&&this.Fd.add(b);break;case Cs:0===b.pc.count&&this.Fd.add(b);break;default:z.k("Unhandled path value "+this.Of.toString())}}if(0===this.Fd.count){for(var a=999999,b=null,c=this.network.vertexes.i;c.next();){var d=c.value;switch(this.Of){case vs:d.tc.count<a&&(a=d.tc.count,b=d);break;case Cs:d.pc.count<a&&(a=d.pc.count,b=d);break;default:z.k("Unhandled path value "+this.Of.toString())}}null!== +b&&this.Fd.add(b)}}; +function Ds(a,b){if(null!==b){u&&z.l(b,zs,Y,"walkTree:v");switch(a.Of){case vs:if(0<b.pc.count){for(var c=new J(zs),d=b.qH;d.next();){var e=d.value;Js(a,b,e)&&c.add(e)}0<c.count&&(b.children=c.jc())}break;case Cs:if(0<b.tc.count){c=new J(zs);for(d=b.nJ;d.next();)e=d.value,Js(a,b,e)&&c.add(e);0<c.count&&(b.children=c.jc())}break;default:z.k("Unhandled path value"+a.Of.toString())}c=b.children;d=c.length;for(e=0;e<d;e++){var g=c[e];g.initialized=!0;g.level=b.level+1;g.parent=b;a.Fd.remove(g)}for(e=0;e< +d;e++)g=c[e],Ds(a,g)}}function Js(a,b,c){u&&z.l(b,zs,Y,"walkOK:v");u&&z.l(c,zs,Y,"walkOK:c");if(c.initialized){var d;if(null===b)d=!1;else{u&&z.l(c,zs,Y,"isAncestor:a");u&&z.l(b,zs,Y,"isAncestor:b");for(d=b.parent;null!==d&&d!==c;)d=d.parent;d=d===c}if(d||c.level>b.level)return!1;a.removeChild(c.parent,c)}return!0} +Y.prototype.removeChild=function(a,b){if(null!==a&&null!==b){u&&z.l(a,zs,Y,"removeChild:p");u&&z.l(b,zs,Y,"removeChild:c");for(var c=a.children,d=0,e=0;e<c.length;e++)c[e]===b&&d++;if(0<d){for(var d=Array(c.length-d),g=0,e=0;e<c.length;e++)c[e]!==b&&(d[g++]=c[e]);a.children=d}}}; +function Es(a,b){if(null!==b){u&&z.l(b,zs,Y,"initializeTree:v");a.initializeTreeVertexValues(b);b.alignment===Ks&&a.sortTreeVertexChildren(b);for(var c=0,d=b.Vm,e=0,g=b.children,h=g.length,k=0;k<h;k++){var l=g[k];Es(a,l);c+=l.descendantCount+1;d=Math.max(d,l.maxChildrenCount);e=Math.max(e,l.maxGenerationCount)}b.descendantCount=c;b.maxChildrenCount=d;b.maxGenerationCount=0<d?e+1:0}} +function Ls(a,b){u&&z.l(b,zs,Y,"mom:v");switch(a.Zs){default:case ws:return null!==b.parent?b.parent:a.wa;case Ms:return null===b.parent?a.wa:null===b.parent.parent?a.ya:b.parent;case Ns:return null!==b.parent?null!==b.parent.parent?b.parent.parent:a.ya:a.wa;case Os:var c=!0;if(0===b.Vm)c=!1;else for(var d=b.children,e=d.length,g=0;g<e;g++)if(0<d[g].Vm){c=!1;break}return c&&null!==b.parent?a.ya:null!==b.parent?b.parent:a.wa}} +Y.prototype.initializeTreeVertexValues=function(a){u&&z.l(a,zs,Y,"initializeTreeVertexValues:v");var b=Ls(this,a);a.copyInheritedPropertiesFrom(b);if(null!==a.parent&&a.parent.alignment===Ks){for(var b=a.angle,c=a.parent.children,d=0;d<c.length&&a!==c[d];)d++;0===d%2?d!==c.length-1&&(b=90===b?180:180===b?270:270===b?180:270):b=90===b?0:180===b?90:270===b?0:90;a.angle=b}a.initialized=!0}; +function Fs(a,b){if(null!==b){u&&z.l(b,zs,Y,"assignTree:v");a.assignTreeVertexValues(b);for(var c=b.children,d=c.length,e=0;e<d;e++)Fs(a,c[e])}}Y.prototype.assignTreeVertexValues=function(){};function Gs(a,b){if(null!==b){u&&z.l(b,zs,Y,"sortTree:v");b.alignment!==Ks&&a.sortTreeVertexChildren(b);for(var c=b.children,d=c.length,e=0;e<d;e++)Gs(a,c[e])}} +Y.prototype.sortTreeVertexChildren=function(a){u&&z.l(a,zs,Y,"sortTreeVertexChildren:v");switch(a.sorting){case Ps:break;case Qs:a.children.reverse();break;case Rs:a.children.sort(a.comparer);break;case Ss:a.children.sort(a.comparer);a.children.reverse();break;default:z.k("Unhandled sorting value "+a.sorting.toString())}};Y.prototype.Cz=function(){if(this.comments)for(var a=this.network.vertexes.i;a.next();)this.addComments(a.value)}; +Y.prototype.addComments=function(a){u&&z.l(a,zs,Y,"addComments:v");var b=a.angle,c=a.parent,d=0,e=Ts,e=!1;null!==c&&(d=c.angle,e=c.alignment,e=Us(e));var b=90===b||270===b,d=90===d||270===d,c=0===a.Vm,g=0,h=0,k=0,l=a.commentSpacing;if(null!==a.Pc)for(var m=a.Pc.qE();m.next();){var n=m.value;"Comment"===n.nc&&n.canLayout()&&(null===a.comments&&(a.comments=[]),a.comments.push(n),n.Bf(),n=n.Ia,b&&!c||!e&&!d&&c||e&&d&&c?(g=Math.max(g,n.width),h+=n.height+Math.abs(k)):(g+=n.width+Math.abs(k),h=Math.max(h, +n.height)),k=l)}null!==a.comments&&(b&&!c||!e&&!d&&c||e&&d&&c?(g+=Math.abs(a.commentMargin),h=Math.max(0,h-a.height)):(h+=Math.abs(a.commentMargin),g=Math.max(0,g-a.width)),e=z.zk(0,0,a.P.width+g,a.P.height+h),a.vb=e,z.dc(e))};function Us(a){return a===Vs||a===Ks||a===Ws||a===Xs}function Ys(a){return a===Vs||a===Ks} +function Zs(a){u&&z.l(a,zs,Y,"isLeftSideBus:v");var b=a.parent;if(null!==b){var c=b.alignment;if(Us(c)){if(Ys(c)){b=b.children;for(c=0;c<b.length&&a!==b[c];)c++;return 0===c%2}if(c===Ws)return!0}}return!1} +Y.prototype.layoutComments=function(a){u&&z.l(a,zs,Y,"layoutComments:v");if(null!==a.comments){var b=a.Pc.Ia,c=a.parent,d=a.angle,e=0,g=Ts,g=!1;null!==c&&(e=c.angle,g=c.alignment,g=Us(g));for(var c=90===d||270===d,d=90===e||270===e,h=0===a.Vm,k=Zs(a),l=0,m=a.comments,n=m.length,p=z.O(),q=0;q<n;q++){var r=m[q],s=r.Ia;if(c&&!h||!g&&!d&&h||g&&d&&h){if(135<e&&!g||d&&k)if(0<=a.commentMargin)for(p.n(a.P.x-a.commentMargin-s.width,a.P.y+l),r.move(p),r=r.Ig();r.next();){var t=r.value;t.Db=$c;t.Eb=ad}else for(p.n(a.P.x+ +2*a.S.x-a.commentMargin,a.P.y+l),r.move(p),r=r.Ig();r.next();)t=r.value,t.Db=ad,t.Eb=$c;else if(0<=a.commentMargin)for(p.n(a.P.x+2*a.S.x+a.commentMargin,a.P.y+l),r.move(p),r=r.Ig();r.next();)t=r.value,t.Db=ad,t.Eb=$c;else for(p.n(a.P.x+a.commentMargin-s.width,a.P.y+l),r.move(p),r=r.Ig();r.next();)t=r.value,t.Db=$c,t.Eb=ad;l=0<=a.commentSpacing?l+(s.height+a.commentSpacing):l+(a.commentSpacing-s.height)}else{if(135<e&&!g||!d&&k)if(0<=a.commentMargin)for(p.n(a.P.x+l,a.P.y-a.commentMargin-s.height), +r.move(p),r=r.Ig();r.next();)t=r.value,t.Db=Zc,t.Eb=bd;else for(p.n(a.P.x+l,a.P.y+2*a.S.y-a.commentMargin),r.move(p),r=r.Ig();r.next();)t=r.value,t.Db=bd,t.Eb=Zc;else if(0<=a.commentMargin)for(p.n(a.P.x+l,a.P.y+2*a.S.y+a.commentMargin),r.move(p),r=r.Ig();r.next();)t=r.value,t.Db=bd,t.Eb=Zc;else for(p.n(a.P.x+l,a.P.y+a.commentMargin-s.height),r.move(p),r=r.Ig();r.next();)t=r.value,t.Db=Zc,t.Eb=bd;l=0<=a.commentSpacing?l+(s.width+a.commentSpacing):l+(a.commentSpacing-s.width)}}z.A(p);b=l-a.commentSpacing- +(c?b.height:b.width);if(this.Of===vs)for(e=a.pc;e.next();)a=e.value.link,null===a||a.kj||(a.Jl=0<b?b:NaN);else for(e=a.tc;e.next();)a=e.value.link,null===a||a.kj||(a.Yl=0<b?b:NaN)}}; +Y.prototype.layoutTree=function(a){if(null!==a){u&&z.l(a,zs,Y,"layoutTree:v");for(var b=a.children,c=b.length,d=0;d<c;d++)this.layoutTree(b[d]);switch(a.compaction){case $s:at(this,a);break;case bt:if(a.alignment===Ks)at(this,a);else if(u&&z.l(a,zs,Y,"layoutTreeBlock:v"),0===a.Vm){var d=a.parent,b=!1,c=0,e=Ts;null!==d&&(c=d.angle,e=d.alignment,b=Us(e));d=Zs(a);a.qa.n(0,0);a.ob.n(a.width,a.height);null===a.parent||null===a.comments||(180!==c&&270!==c||b)&&!d?a.Ta.n(0,0):180===c&&!b||(90===c||270=== +c)&&d?a.Ta.n(a.width-2*a.S.x,0):a.Ta.n(0,a.height-2*a.S.y);a.Vt=null;a.mu=null}else{for(var g=ct(a),b=90===g||270===g,h=0,k=a.children,l=k.length,m=0;m<l;m++)var n=k[m],h=Math.max(h,b?n.ob.width:n.ob.height);var p=a.alignment,d=p===dt,q=p===et,r=Us(p),s=Math.max(0,a.breadthLimit),c=ft(a),t=a.nodeSpacing,v=gt(a),x=a.rowSpacing,y=0;if(d||q||a.Wp||a.Xp&&1===a.maxGenerationCount)y=Math.max(0,a.rowIndent);var d=a.width,e=a.height,A=0,C=0,L=0,H=null,U=null,ea=0,W=0,P=0,ba=0,Oa=0,sa=0,Na=0,ua=0,n=0;r&&!Ys(p)&& +135<g&&k.reverse();if(Ys(p))if(1<l)for(m=0;m<l;m++)0===m%2&&m!==l-1?ua=Math.max(ua,b?k[m].ob.width:k[m].ob.height):0!==m%2&&(n=Math.max(n,b?k[m].ob.width:k[m].ob.height));else 1===l&&(ua=b?k[0].ob.width:k[0].ob.height);if(r){switch(p){case Vs:W=135>g?ht(a,k,ua,A,C):it(a,k,ua,A,C);ua=W.x;A=W.width;C=W.height;break;case Ws:for(m=0;m<l;m++){var n=k[m],Ha=n.ob,H=0===sa?0:x;b?(n.qa.n(h-Ha.width,ba+H),A=Math.max(A,Ha.width),C=Math.max(C,ba+H+Ha.height),ba+=H+Ha.height):(n.qa.n(P+H,h-Ha.height),A=Math.max(A, +P+H+Ha.width),C=Math.max(C,Ha.height),P+=H+Ha.width);sa++}break;case Xs:for(m=0;m<l;m++)n=k[m],Ha=n.ob,H=0===sa?0:x,b?(n.qa.n(t/2+a.S.x,ba+H),A=Math.max(A,Ha.width),C=Math.max(C,ba+H+Ha.height),ba+=H+Ha.height):(n.qa.n(P+H,t/2+a.S.y),A=Math.max(A,P+H+Ha.width),C=Math.max(C,Ha.height),P+=H+Ha.width),sa++}H=jt(this,2);U=jt(this,2);b?(H[0].n(0,0),H[1].n(0,C),U[0].n(A,0)):(H[0].n(0,0),H[1].n(A,0),U[0].n(0,C));U[1].n(A,C)}else for(m=0;m<l;m++){n=k[m];Ha=n.ob;if(b){0<s&&0<sa&&P+t+Ha.width>s&&(P<h&&pt(a, +p,h-P,0,Na,m-1),Oa++,sa=0,Na=m,L=C,P=0,ba=135<g?-C-x:C+x);qt(this,n,0,ba);var Aa=0;if(0===sa){if(H=n.Vt,U=n.mu,ea=Ha.width,W=Ha.height,null===H||null===U||g!==ct(n))H=jt(this,2),U=jt(this,2),H[0].n(0,0),H[1].n(0,W),U[0].n(ea,0),U[1].n(ea,W)}else{var jc=z.rb(),W=rt(this,a,n,H,U,ea,W,jc),Aa=W.x,H=jc[0],U=jc[1],ea=W.width,W=W.height;z.xa(jc);P<Ha.width&&0>Aa&&(st(a,-Aa,0,Na,m-1),tt(H,-Aa,0),tt(U,-Aa,0),Aa=0)}n.qa.n(Aa,ba);A=Math.max(A,ea);C=Math.max(C,L+(0===Oa?0:x)+Ha.height);P=ea}else{0<s&&0<sa&&ba+ +t+Ha.height>s&&(ba<h&&pt(a,p,0,h-ba,Na,m-1),Oa++,sa=0,Na=m,L=A,ba=0,P=135<g?-A-x:A+x);qt(this,n,P,0);Aa=0;if(0===sa){if(H=n.Vt,U=n.mu,ea=Ha.width,W=Ha.height,null===H||null===U||g!==ct(n))H=jt(this,2),U=jt(this,2),H[0].n(0,0),H[1].n(ea,0),U[0].n(0,W),U[1].n(ea,W)}else jc=z.rb(),W=rt(this,a,n,H,U,ea,W,jc),Aa=W.x,H=jc[0],U=jc[1],ea=W.width,W=W.height,z.xa(jc),ba<Ha.height&&0>Aa&&(st(a,0,-Aa,Na,m-1),tt(H,0,-Aa),tt(U,0,-Aa),Aa=0);n.qa.n(P,Aa);C=Math.max(C,W);A=Math.max(A,L+(0===Oa?0:x)+Ha.width);ba=W}sa++}0< +Oa&&(b?(C+=Math.max(0,c),P<A&&pt(a,p,A-P,0,Na,l-1),0<y&&(q||st(a,y,0,0,l-1),A+=y)):(A+=Math.max(0,c),ba<C&&pt(a,p,0,C-ba,Na,l-1),0<y&&(q||st(a,0,y,0,l-1),C+=y)));q=h=0;switch(p){case ut:b?h+=A/2-a.S.x-v/2:q+=C/2-a.S.y-v/2;break;case Ts:0<Oa?b?h+=A/2-a.S.x-v/2:q+=C/2-a.S.y-v/2:b?(m=k[0].qa.x+k[0].Ta.x,ua=k[l-1].qa.x+k[l-1].Ta.x+2*k[l-1].S.x,h+=m+(ua-m)/2-a.S.x-v/2):(m=k[0].qa.y+k[0].Ta.y,ua=k[l-1].qa.y+k[l-1].Ta.y+2*k[l-1].S.y,q+=m+(ua-m)/2-a.S.y-v/2);break;case dt:b?(h-=v,A+=v):(q-=v,C+=v);break; +case et:b?(h+=A-a.width+v,A+=v):(q+=C-a.height+v,C+=v);break;case Vs:b?h=1<l?h+(ua+t/2-a.S.x):h+(k[0].S.x-a.S.x+k[0].Ta.x):q=1<l?q+(ua+t/2-a.S.y):q+(k[0].S.y-a.S.y+k[0].Ta.y);break;case Ws:b?h+=A+t/2-a.S.x:q+=C+t/2-a.S.y;break;case Xs:break;default:z.k("Unhandled alignment value "+p.toString())}for(m=0;m<l;m++)n=k[m],b?n.qa.n(n.qa.x+n.Ta.x-h,n.qa.y+(135<g?(r?-C:-n.ob.height)+n.Ta.y-c:e+c+n.Ta.y)):n.qa.n(n.qa.x+(135<g?(r?-A:-n.ob.width)+n.Ta.x-c:d+c+n.Ta.x),n.qa.y+n.Ta.y-q);l=k=0;r?b?(A=vt(a,A,h), +0>h&&(h=0),135<g&&(q+=C+c),C+=e+c,p===Xs&&(k+=t/2+a.S.x),l+=e+c):(135<g&&(h+=A+c),A+=d+c,C=wt(a,C,q),0>q&&(q=0),p===Xs&&(l+=t/2+a.S.y),k+=d+c):b?(null===a.comments?d>A&&(p=xt(p,d-A,0),k=p.x,l=p.y,A=d,h=0):A=vt(a,A,h),0>h&&(k-=h,h=0),135<g&&(q+=C+c),C=Math.max(Math.max(C,e),C+e+c),l+=e+c):(135<g&&(h+=A+c),A=Math.max(Math.max(A,d),A+d+c),null===a.comments?e>C&&(p=xt(p,0,e-C),k=p.x,l=p.y,C=e,q=0):C=wt(a,C,q),0>q&&(l-=q,q=0),k+=d+c);if(0<Oa)g=jt(this,4),p=jt(this,4),b?(g[2].n(0,e+c),g[3].n(g[2].x,C), +p[2].n(A,g[2].y),p[3].n(p[2].x,g[3].y)):(g[2].n(d+c,0),g[3].n(A,g[2].y),p[2].n(g[2].x,C),p[3].n(g[3].x,p[2].y));else{g=jt(this,H.length+2);p=jt(this,U.length+2);for(m=0;m<H.length;m++)r=H[m],g[m+2].n(r.x+k,r.y+l);for(m=0;m<U.length;m++)r=U[m],p[m+2].n(r.x+k,r.y+l)}b?(g[0].n(h,0),g[1].n(g[0].x,e),g[2].y<g[1].y&&(g[2].x>g[0].x?g[2].assign(g[1]):g[1].assign(g[2])),g[3].y<g[2].y&&(g[3].x>g[0].x?g[3].assign(g[2]):g[2].assign(g[3])),p[0].n(h+d,0),p[1].n(p[0].x,e),p[2].y<p[1].y&&(p[2].x<p[0].x?p[2].assign(p[1]): +p[1].assign(p[2])),p[3].y<p[2].y&&(p[3].x<p[0].x?p[3].assign(p[2]):p[2].assign(p[3])),g[2].y-=c/2,p[2].y-=c/2):(g[0].n(0,q),g[1].n(d,g[0].y),g[2].x<g[1].x&&(g[2].y>g[0].y?g[2].assign(g[1]):g[1].assign(g[2])),g[3].x<g[2].x&&(g[3].y>g[0].y?g[3].assign(g[2]):g[2].assign(g[3])),p[0].n(0,q+e),p[1].n(d,p[0].y),p[2].x<p[1].x&&(p[2].y<p[0].y?p[2].assign(p[1]):p[1].assign(p[2])),p[3].x<p[2].x&&(p[3].y<p[0].y?p[3].assign(p[2]):p[2].assign(p[3])),g[2].x-=c/2,p[2].x-=c/2);yt(this,H);yt(this,U);a.Vt=g;a.mu=p; +a.Ta.n(h,q);a.ob.n(A,C)}break;default:z.k("Unhandled compaction value "+a.compaction.toString())}}}; +function at(a,b){u&&z.l(b,zs,Y,"layoutTreeNone:v");if(0===b.Vm){var c=!1,d=0,e=Ts;null!==b.parent&&(d=b.parent.angle,e=b.parent.alignment,c=Us(e));e=Zs(b);b.qa.n(0,0);b.ob.n(b.width,b.height);null===b.parent||null===b.comments||(180!==d&&270!==d||c)&&!e?b.Ta.n(0,0):180===d&&!c||(90===d||270===d)&&e?b.Ta.n(b.width-2*b.S.x,0):b.Ta.n(0,b.height-2*b.S.y)}else{for(var c=ct(b),d=90===c||270===c,g=0,e=b.children,h=e.length,k=0;k<h;k++)var l=e[k],g=Math.max(g,d?l.ob.width:l.ob.height);var m=b.alignment,n= +m===dt,p=m===et,q=Us(m),r=Math.max(0,b.breadthLimit),s=ft(b),t=b.nodeSpacing,v=gt(b),x=n||p?0:v/2,y=b.rowSpacing,A=0;if(n||p||b.Wp||b.Xp&&1===b.maxGenerationCount)A=Math.max(0,b.rowIndent);var n=b.width,C=b.height,L=0,H=0,U=0,ea=0,W=0,P=0,ba=0,Oa=0,sa=0,Na=0;q&&!Ys(m)&&135<c&&e.reverse();if(Ys(m))if(1<h)for(k=0;k<h;k++){var l=e[k],ua=l.ob;0===k%2&&k!==h-1?sa=Math.max(sa,(d?ua.width:ua.height)+zt(l)-t):0!==k%2&&(Na=Math.max(Na,(d?ua.width:ua.height)+zt(l)-t))}else 1===h&&(sa=d?e[0].ob.width:e[0].ob.height); +if(q)switch(m){case Vs:case Ks:H=135>c?ht(b,e,sa,L,H):it(b,e,sa,L,H);sa=H.x;L=H.width;H=H.height;break;case Ws:for(k=0;k<h;k++)l=e[k],ua=l.ob,r=0===ba?0:y,d?(l.qa.n(g-ua.width,W+r),L=Math.max(L,ua.width),H=Math.max(H,W+r+ua.height),W+=r+ua.height):(l.qa.n(ea+r,g-ua.height),L=Math.max(L,ea+r+ua.width),H=Math.max(H,ua.height),ea+=r+ua.width),ba++;break;case Xs:for(g=0;g<h;g++)l=e[g],ua=l.ob,r=0===ba?0:y,d?(l.qa.n(t/2+b.S.x,W+r),L=Math.max(L,ua.width),H=Math.max(H,W+r+ua.height),W+=r+ua.height):(l.qa.n(ea+ +r,t/2+b.S.y),L=Math.max(L,ea+r+ua.width),H=Math.max(H,ua.height),ea+=r+ua.width),ba++}else for(k=0;k<h;k++)l=e[k],ua=l.ob,d?(0<r&&0<ba&&ea+t+ua.width>r&&(ea<g&&pt(b,m,g-ea,0,Oa,k-1),P++,ba=0,Oa=k,U=H,ea=0,W=135<c?-H-y:H+y),Na=0===ba?x:t,qt(a,l,0,W),l.qa.n(ea+Na,W),L=Math.max(L,ea+Na+ua.width),H=Math.max(H,U+(0===P?0:y)+ua.height),ea+=Na+ua.width):(0<r&&0<ba&&W+t+ua.height>r&&(W<g&&pt(b,m,0,g-W,Oa,k-1),P++,ba=0,Oa=k,U=L,W=0,ea=135<c?-L-y:L+y),Na=0===ba?x:t,qt(a,l,ea,0),l.qa.n(ea,W+Na),H=Math.max(H, +W+Na+ua.height),L=Math.max(L,U+(0===P?0:y)+ua.width),W+=Na+ua.height),ba++;0<P&&(d?(H+=Math.max(0,s),ea<L&&pt(b,m,L-ea,0,Oa,h-1),0<A&&(p||st(b,A,0,0,h-1),L+=A)):(L+=Math.max(0,s),W<H&&pt(b,m,0,H-W,Oa,h-1),0<A&&(p||st(b,0,A,0,h-1),H+=A)));A=p=0;switch(m){case ut:d?p+=L/2-b.S.x-v/2:A+=H/2-b.S.y-v/2;break;case Ts:0<P?d?p+=L/2-b.S.x-v/2:A+=H/2-b.S.y-v/2:d?(m=e[0].qa.x+e[0].Ta.x,t=e[h-1].qa.x+e[h-1].Ta.x+2*e[h-1].S.x,p+=m+(t-m)/2-b.S.x-v/2):(m=e[0].qa.y+e[0].Ta.y,t=e[h-1].qa.y+e[h-1].Ta.y+2*e[h-1].S.y, +A+=m+(t-m)/2-b.S.y-v/2);break;case dt:d?(p-=v,L+=v):(A-=v,H+=v);break;case et:d?(p+=L-b.width+v,L+=v):(A+=H-b.height+v,H+=v);break;case Vs:case Ks:d?p=1<h?p+(sa+t/2-b.S.x):p+(e[0].S.x-b.S.x+e[0].Ta.x):A=1<h?A+(sa+t/2-b.S.y):A+(e[0].S.y-b.S.y+e[0].Ta.y);break;case Ws:d?p+=L+t/2-b.S.x:A+=H+t/2-b.S.y;break;case Xs:break;default:z.k("Unhandled alignment value "+m.toString())}for(k=0;k<h;k++)l=e[k],d?l.qa.n(l.qa.x+l.Ta.x-p,l.qa.y+(135<c?(q?-H:-l.ob.height)+l.Ta.y-s:C+s+l.Ta.y)):l.qa.n(l.qa.x+(135<c?(q? +-L:-l.ob.width)+l.Ta.x-s:n+s+l.Ta.x),l.qa.y+l.Ta.y-A);d?(L=vt(b,L,p),0>p&&(p=0),135<c&&(A+=H+s),H+=C+s):(135<c&&(p+=L+s),L+=n+s,H=wt(b,H,A),0>A&&(A=0));b.Ta.n(p,A);b.ob.n(L,H)}} +function ht(a,b,c,d,e){u&&z.l(a,zs,Y,"layoutBusChildrenPosDir:v");var g=b.length;if(0===g)return new w(c,0,d,e);if(1===g){var h=b[0];d=h.ob.width;e=h.ob.height;return new w(c,0,d,e)}for(var k=a.nodeSpacing,l=a.rowSpacing,m=90===ct(a),n=0,p=0,q=0,r=0;r<g;r++)if(!(0!==r%2||1<g&&r===g-1)){var h=b[r],s=h.ob,t=0===n?0:l;if(m){var v=zt(h)-k;h.qa.n(c-(s.width+v),q+t);d=Math.max(d,s.width+v);e=Math.max(e,q+t+s.height);q+=t+s.height}else v=zt(h)-k,h.qa.n(p+t,c-(s.height+v)),e=Math.max(e,s.height+v),d=Math.max(d, +p+t+s.width),p+=t+s.width;n++}var n=0,x=p,y=q;m?(p=c+k,q=0):(p=0,q=c+k);for(r=0;r<g;r++)0!==r%2&&(h=b[r],s=h.ob,t=0===n?0:l,m?(v=zt(h)-k,h.qa.n(p+v,q+t),d=Math.max(d,p+s.width+v),e=Math.max(e,q+t+s.height),q+=t+s.height):(v=zt(h)-k,h.qa.n(p+t,q+v),d=Math.max(d,p+t+s.width),e=Math.max(e,q+s.height+v),p+=t+s.width),n++);1<g&&1===g%2&&(h=b[g-1],s=h.ob,b=At(h,m?Math.max(Math.abs(y),Math.abs(q)):Math.max(Math.abs(x),Math.abs(p))),m?(h.qa.n(c+k/2-h.S.x-h.Ta.x,e+b),m=c+k/2-h.S.x-h.Ta.x,d=Math.max(d,m+s.width), +0>m&&(d-=m),e=Math.max(e,Math.max(y,q)+b+s.height),0>h.qa.x&&(c=Bt(a,h.qa.x,!1,c,k))):(h.qa.n(d+b,c+k/2-h.S.y-h.Ta.y),d=Math.max(d,Math.max(x,p)+b+s.width),m=c+k/2-h.S.y-h.Ta.y,e=Math.max(e,m+s.height),0>m&&(e-=m),0>h.qa.y&&(c=Bt(a,h.qa.y,!0,c,k))));return new w(c,0,d,e)} +function it(a,b,c,d,e){u&&z.l(a,zs,Y,"layoutBusChildrenNegDir:v");var g=b.length;if(0===g)return new w(c,0,d,e);if(1===g){var h=b[0];d=h.ob.width;e=h.ob.height;return new w(c,0,d,e)}for(var k=a.nodeSpacing,l=a.rowSpacing,m=270===ct(a),n=0,p=0,q=0,r=0;r<g;r++)if(!(0!==r%2||1<g&&r===g-1)){var h=b[r],s=h.ob,t=0===n?0:l;if(m){var v=zt(h)-k,q=q-(t+s.height);h.qa.n(c-(s.width+v),q);d=Math.max(d,s.width+v);e=Math.max(e,Math.abs(q))}else v=zt(h)-k,p-=t+s.width,h.qa.n(p,c-(s.height+v)),e=Math.max(e,s.height+ +v),d=Math.max(d,Math.abs(p));n++}var n=0,x=p,y=q;m?(p=c+k,q=0):(p=0,q=c+k);for(r=0;r<g;r++)0!==r%2&&(h=b[r],s=h.ob,t=0===n?0:l,m?(v=zt(h)-k,q-=t+s.height,h.qa.n(p+v,q),d=Math.max(d,p+s.width+v),e=Math.max(e,Math.abs(q))):(v=zt(h)-k,p-=t+s.width,h.qa.n(p,q+v),e=Math.max(e,q+s.height+v),d=Math.max(d,Math.abs(p))),n++);1<g&&1===g%2&&(h=b[g-1],s=h.ob,l=At(h,m?Math.max(Math.abs(y),Math.abs(q)):Math.max(Math.abs(x),Math.abs(p))),m?(h.qa.n(c+k/2-h.S.x-h.Ta.x,-e-s.height-l),p=c+k/2-h.S.x-h.Ta.x,d=Math.max(d, +p+s.width),0>p&&(d-=p),e=Math.max(e,Math.abs(Math.min(y,q))+l+s.height),0>h.qa.x&&(c=Bt(a,h.qa.x,!1,c,k))):(h.qa.n(-d-s.width-l,c+k/2-h.S.y-h.Ta.y),d=Math.max(d,Math.abs(Math.min(x,p))+l+s.width),p=c+k/2-h.S.y-h.Ta.y,e=Math.max(e,p+s.height),0>p&&(e-=p),0>h.qa.y&&(c=Bt(a,h.qa.y,!0,c,k))));for(r=0;r<g;r++)h=b[r],m?h.qa.n(h.qa.x,h.qa.y+e):h.qa.n(h.qa.x+d,h.qa.y);return new w(c,0,d,e)}function zt(a){u&&z.l(a,zs,Y,"fixRelativePostions:child");return null===a.parent?0:a.parent.nodeSpacing} +function At(a){u&&z.l(a,zs,Y,"fixRelativePostions:lastchild");return null===a.parent?0:a.parent.rowSpacing}function Bt(a,b,c,d,e){u&&z.l(a,zs,Y,"fixRelativePostions:v");a=a.children;for(var g=a.length,h=0;h<g;h++)c?a[h].qa.n(a[h].qa.x,a[h].qa.y-b):a[h].qa.n(a[h].qa.x-b,a[h].qa.y);b=a[g-1];return Math.max(d,c?b.Ta.y+b.S.y-e/2:b.Ta.x+b.S.x-e/2)} +function vt(a,b,c){u&&z.l(a,zs,Y,"calculateSubwidth:v");switch(a.alignment){case Ts:case ut:var d=b;c+a.width>d&&(d=c+a.width);0>c&&(d-=c);return d;case dt:return a.width>b?a.width:b;case et:return 2*a.S.x>b?a.width:b+a.width-2*a.S.x;case Vs:case Ks:return d=Math.min(0,c),c=Math.max(b,c+a.width),Math.max(a.width,c-d);case Ws:return a.width-a.S.x+a.nodeSpacing/2+b;case Xs:return Math.max(a.width,a.S.x+a.nodeSpacing/2+b);default:return b}} +function wt(a,b,c){u&&z.l(a,zs,Y,"calculateSubheight:v");switch(a.alignment){case Ts:case ut:var d=b;c+a.height>d&&(d=c+a.height);0>c&&(d-=c);return d;case dt:return a.height>b?a.height:b;case et:return 2*a.S.y>b?a.height:b+a.height-2*a.S.y;case Vs:case Ks:return d=Math.min(0,c),c=Math.max(b,c+a.height),Math.max(a.height,c-d);case Ws:return a.height-a.S.y+a.nodeSpacing/2+b;case Xs:return Math.max(a.height,a.S.y+a.nodeSpacing/2+b);default:return b}} +function xt(a,b,c){u&&z.l(a,Ba,Y,"alignOffset:align");switch(a){case ut:b/=2;c/=2;break;case Ts:b/=2;c/=2;break;case dt:c=b=0;break;case et:break;default:z.k("Unhandled alignment value "+a.toString())}return new N(b,c)}function pt(a,b,c,d,e,g){u&&z.l(a,zs,Y,"shiftRelPosAlign:v");u&&z.l(b,Ba,Y,"shiftRelPosAlign:align");b=xt(b,c,d);st(a,b.x,b.y,e,g)}function st(a,b,c,d,e){u&&z.l(a,zs,Y,"shiftRelPos:v");if(0!==b||0!==c)for(a=a.children;d<=e;d++){var g=a[d].qa;g.x+=b;g.y+=c}} +function qt(a,b,c,d){u&&(z.l(b,zs,Y,"recordMidPoints:v"),z.g(c,"number",Y,"recordMidPoints:x"),z.g(d,"number",Y,"recordMidPoints:y"));var e=b.parent;switch(a.Of){case vs:for(a=b.tc;a.next();)b=a.value,b.fromVertex===e&&b.ls.n(c,d);break;case Cs:for(a=b.pc;a.next();)b=a.value,b.toVertex===e&&b.ls.n(c,d);break;default:z.k("Unhandled path value "+a.Of.toString())}}function tt(a,b,c){for(var d=0;d<a.length;d++){var e=a[d];e.x+=b;e.y+=c}} +function rt(a,b,c,d,e,g,h,k){u&&z.l(b,zs,Y,"mergeFringes:parent");u&&z.l(c,zs,Y,"mergeFringes:child");var l=ct(b),m=90===l||270===l,n=b.nodeSpacing;b=d;var p=e;d=g;e=h;var q=c.Vt,r=c.mu;h=c.ob;var s=m?Math.max(e,h.height):Math.max(d,h.width);if(null===q||l!==ct(c))q=jt(a,2),r=jt(a,2),m?(q[0].n(0,0),q[1].n(0,h.height),r[0].n(h.width,0),r[1].n(r[0].x,q[1].y)):(q[0].n(0,0),q[1].n(h.width,0),r[0].n(0,h.height),r[1].n(q[1].x,r[0].y));if(m){c=d;d=9999999;if(!(null===p||2>p.length||null===q||2>q.length))for(m= +l=0;l<p.length&&m<q.length;){e=p[l];var t=q[m];g=t.x;var v=t.y;g+=c;var x=e;l+1<p.length&&(x=p[l+1]);var y=t,t=y.x,y=y.y;m+1<q.length&&(y=q[m+1],t=y.x,y=y.y,t+=c);var A=d;e.y===v?A=g-e.x:e.y>v&&e.y<y?A=g+(e.y-v)/(y-v)*(t-g)-e.x:v>e.y&&v<x.y&&(A=g-(e.x+(v-e.y)/(x.y-e.y)*(x.x-e.x)));A<d&&(d=A);x.y<=e.y?l++:y<=v?m++:(x.y<=y&&l++,y<=x.y&&m++)}c-=d;c+=n;l=q;m=c;if(null===b||2>b.length||null===l||2>l.length)d=null;else{n=jt(a,b.length+l.length);for(d=g=e=0;g<l.length&&l[g].y<b[0].y;)v=l[g++],n[d++].n(v.x+ +m,v.y);for(;e<b.length;)v=b[e++],n[d++].n(v.x,v.y);for(e=b[b.length-1].y;g<l.length&&l[g].y<=e;)g++;for(;g<l.length&&l[g].y>e;)v=l[g++],n[d++].n(v.x+m,v.y);l=jt(a,d);for(e=0;e<d;e++)l[e].assign(n[e]);yt(a,n);d=l}g=r;v=c;if(null===p||2>p.length||null===g||2>g.length)e=null;else{n=jt(a,p.length+g.length);for(m=x=l=0;l<p.length&&p[l].y<g[0].y;)e=p[l++],n[m++].n(e.x,e.y);for(;x<g.length;)e=g[x++],n[m++].n(e.x+v,e.y);for(g=g[g.length-1].y;l<p.length&&p[l].y<=g;)l++;for(;l<p.length&&p[l].y>g;)e=p[l++], +n[m++].n(e.x,e.y);e=jt(a,m);for(l=0;l<m;l++)e[l].assign(n[l]);yt(a,n)}g=Math.max(0,c)+h.width;h=s}else{c=e;d=9999999;if(!(null===p||2>p.length||null===q||2>q.length))for(m=l=0;l<p.length&&m<q.length;)e=p[l],t=q[m],g=t.x,v=t.y,v+=c,x=e,l+1<p.length&&(x=p[l+1]),y=t,t=y.x,y=y.y,m+1<q.length&&(y=q[m+1],t=y.x,y=y.y,y+=c),A=d,e.x===g?A=v-e.y:e.x>g&&e.x<t?A=v+(e.x-g)/(t-g)*(y-v)-e.y:g>e.x&&g<x.x&&(A=v-(e.y+(g-e.x)/(x.x-e.x)*(x.y-e.y))),A<d&&(d=A),x.x<=e.x?l++:t<=g?m++:(x.x<=t&&l++,t<=x.x&&m++);c-=d;c+=n; +l=q;m=c;if(null===b||2>b.length||null===l||2>l.length)d=null;else{n=jt(a,b.length+l.length);for(d=g=e=0;g<l.length&&l[g].x<b[0].x;)v=l[g++],n[d++].n(v.x,v.y+m);for(;e<b.length;)v=b[e++],n[d++].n(v.x,v.y);for(e=b[b.length-1].x;g<l.length&&l[g].x<=e;)g++;for(;g<l.length&&l[g].x>e;)v=l[g++],n[d++].n(v.x,v.y+m);l=jt(a,d);for(e=0;e<d;e++)l[e].assign(n[e]);yt(a,n);d=l}g=r;v=c;if(null===p||2>p.length||null===g||2>g.length)e=null;else{n=jt(a,p.length+g.length);for(m=x=l=0;l<p.length&&p[l].x<g[0].x;)e=p[l++], +n[m++].n(e.x,e.y);for(;x<g.length;)e=g[x++],n[m++].n(e.x,e.y+v);for(g=g[g.length-1].x;l<p.length&&p[l].x<=g;)l++;for(;l<p.length&&p[l].x>g;)e=p[l++],n[m++].n(e.x,e.y);e=jt(a,m);for(l=0;l<m;l++)e[l].assign(n[l]);yt(a,n)}g=s;h=Math.max(0,c)+h.height}yt(a,b);yt(a,q);yt(a,p);yt(a,r);k[0]=d;k[1]=e;return new w(c,0,g,h)}function jt(a,b){var c=a.oz[b];if(void 0!==c&&(c=c.pop(),void 0!==c))return c;for(var c=[],d=0;d<b;d++)c[d]=new N;return c} +function yt(a,b){var c=b.length,d=a.oz[c];void 0===d&&(d=[],a.oz[c]=d);d.push(b)} +Y.prototype.arrangeTrees=function(){if(this.qd===Bs)for(var a=this.Fd.i;a.next();){var b=a.value;if(b instanceof zs){var c=b.Pc;if(null!==c){var d=c.position,c=d.x,d=d.y;isFinite(c)||(c=0);isFinite(d)||(d=0);Ct(this,b,c,d)}}}else{c=[];for(a=this.Fd.i;a.next();)b=a.value,b instanceof zs&&c.push(b);switch(this.sorting){case Ps:break;case Qs:c.reverse();break;case Rs:c.sort(this.comparer);break;case Ss:c.sort(this.comparer);c.reverse();break;default:z.k("Unhandled sorting value "+this.sorting.toString())}b= +this.je;a=b.x;b=b.y;for(d=0;d<c.length;d++){var e=c[d];Ct(this,e,a+e.Ta.x,b+e.Ta.y);switch(this.qd){case ys:b+=e.ob.height+this.mg.height;break;case Dt:a+=e.ob.width+this.mg.width;break;default:z.k("Unhandled arrangement value "+this.qd.toString())}}}};function Ct(a,b,c,d){if(null!==b){u&&z.l(b,zs,Y,"assignAbsolutePositions:v");b.x=c;b.y=d;b=b.children;for(var e=b.length,g=0;g<e;g++){var h=b[g];Ct(a,h,c+h.qa.x,d+h.qa.y)}}} +Y.prototype.commitLayout=function(){this.PA();this.commitNodes();this.Gz();this.Rt&&this.commitLinks()};Y.prototype.commitNodes=function(){for(var a=this.network.vertexes.i;a.next();)a.value.commit();for(a.reset();a.next();)this.layoutComments(a.value)}; +Y.prototype.Gz=function(){if(this.jA===Hs){for(var a=this.qB,b=[],c=null,d=this.network.vertexes.i;d.next();){var e=d.value;null===c?c=e.vb.copy():c.ri(e.vb);var g=b[e.level],g=void 0===g?ft(e):Math.max(g,ft(e));b[e.level]=g}for(d=0;d<b.length;d++)void 0===b[d]&&(b[d]=0);90===this.angle||270===this.angle?(c.bg(this.nodeSpacing/2,this.layerSpacing),e=new N(-this.nodeSpacing/2,-this.layerSpacing/2)):(c.bg(this.layerSpacing,this.nodeSpacing/2),e=new N(-this.layerSpacing/2,-this.nodeSpacing/2));var g= +[],c=90===this.angle||270===this.angle?c.width:c.height,h=0;if(180===this.angle||270===this.angle)for(d=0;d<a.length;d++)h+=a[d]+b[d];for(d=0;d<a.length;d++){var k=a[d]+b[d];270===this.angle?(h-=k,g.push(new w(0,h,c,k))):90===this.angle?(g.push(new w(0,h,c,k)),h+=k):180===this.angle?(h-=k,g.push(new w(h,0,k,c))):(g.push(new w(h,0,k,c)),h+=k)}this.commitLayers(g,e)}};Y.prototype.commitLayers=function(){};Y.prototype.commitLinks=function(){for(var a=this.network.edges.i;a.next();)a.value.commit()}; +Y.prototype.PA=function(){for(var a=this.Fd.i;a.next();){var b=a.value;b instanceof zs&&Et(this,b)}};function Et(a,b){if(null!==b){u&&z.l(b,zs,Y,"setPortSpotsTree:v");a.setPortSpots(b);for(var c=b.children,d=c.length,e=0;e<d;e++)Et(a,c[e])}} +Y.prototype.setPortSpots=function(a){u&&z.l(a,zs,Y,"setPortSpots:v");var b=a.alignment;if(Us(b)){u&&z.l(a,zs,Y,"setPortSpotsBus:v");u&&z.l(b,Ba,Y,"setPortSpots:align");var c=this.Of===vs,d=ct(a),e;switch(d){case 0:e=ad;break;case 90:e=bd;break;case 180:e=$c;break;default:e=Zc}var g=a.children,h=g.length;switch(b){case Vs:case Ks:for(b=0;b<h;b++){var k=g[b],k=(c?k.tc:k.pc).first();if(null!==k&&(k=k.link,null!==k)){var l=90===d||270===d?$c:Zc;if(1===h||b===h-1&&1===h%2)switch(d){case 0:l=$c;break;case 90:l= +Zc;break;case 180:l=ad;break;default:l=bd}else 0===b%2&&(l=90===d||270===d?ad:bd);c?(a.setsPortSpot&&(k.Db=e),a.setsChildPortSpot&&(k.Eb=l)):(a.setsPortSpot&&(k.Db=l),a.setsChildPortSpot&&(k.Eb=e))}}break;case Ws:l=90===d||270===d?ad:bd;for(d=c?a.pc:a.tc;d.next();)k=d.value.link,null!==k&&(c?(a.setsPortSpot&&(k.Db=e),a.setsChildPortSpot&&(k.Eb=l)):(a.setsPortSpot&&(k.Db=l),a.setsChildPortSpot&&(k.Eb=e)));break;case Xs:for(l=90===d||270===d?$c:Zc,d=c?a.pc:a.tc;d.next();)k=d.value.link,null!==k&&(c? +(a.setsPortSpot&&(k.Db=e),a.setsChildPortSpot&&(k.Eb=l)):(a.setsPortSpot&&(k.Db=l),a.setsChildPortSpot&&(k.Eb=e)))}}else if(c=ct(a),this.Of===vs)for(e=a.pc;e.next();){if(d=e.value.link,null!==d){if(a.setsPortSpot)if(a.portSpot.bd())switch(c){case 0:d.Db=ad;break;case 90:d.Db=bd;break;case 180:d.Db=$c;break;default:d.Db=Zc}else d.Db=a.portSpot;if(a.setsChildPortSpot)if(a.childPortSpot.bd())switch(c){case 0:d.Eb=$c;break;case 90:d.Eb=Zc;break;case 180:d.Eb=ad;break;default:d.Eb=bd}else d.Eb=a.childPortSpot}}else for(e= +a.tc;e.next();)if(d=e.value.link,null!==d){if(a.setsPortSpot)if(a.portSpot.bd())switch(c){case 0:d.Eb=ad;break;case 90:d.Eb=bd;break;case 180:d.Eb=$c;break;default:d.Eb=Zc}else d.Eb=a.portSpot;if(a.setsChildPortSpot)if(a.childPortSpot.bd())switch(c){case 0:d.Db=$c;break;case 90:d.Db=Zc;break;case 180:d.Db=ad;break;default:d.Db=bd}else d.Db=a.childPortSpot}};function ct(a){a=a.angle;return 45>=a?0:135>=a?90:225>=a?180:315>=a?270:0} +function ft(a){u&&z.l(a,zs,Y,"computeLayerSpacing:v");var b=ct(a),b=90===b||270===b,c=a.layerSpacing;if(0<a.layerSpacingParentOverlap)var d=Math.min(1,a.layerSpacingParentOverlap),c=c-(b?a.height*d:a.width*d);c<(b?-a.height:-a.width)&&(c=b?-a.height:-a.width);return c}function gt(a){u&&z.l(a,zs,Y,"computeNodeIndent:v");var b=ct(a),b=90===b||270===b,c=a.nodeIndent;if(0<a.nodeIndentPastParent)var d=Math.min(1,a.nodeIndentPastParent),c=c+(b?a.width*d:a.height*d);return c=Math.max(0,c)} +z.defineProperty(Y,{rL:"roots"},function(){return this.Fd},function(a){this.Fd!==a&&(z.l(a,K,Y,"roots"),this.Fd=a,this.I())});z.defineProperty(Y,{path:"path"},function(){return this.ds},function(a){this.ds!==a&&(z.Ba(a,Y,Y,"path"),this.ds=a,this.I())});z.defineProperty(Y,{yJ:"treeStyle"},function(){return this.Zs},function(a){this.qd!==a&&(z.Ba(a,Y,Y,"treeStyle"),a===ws||a===Ns||a===Os||a===Ms)&&(this.Zs=a,this.I())}); +z.defineProperty(Y,{jA:"layerStyle"},function(){return this.Gv},function(a){this.qd!==a&&(z.Ba(a,Y,Y,"layerStyle"),a===xs||a===Is||a===Hs)&&(this.Gv=a,this.I())});z.defineProperty(Y,{comments:"comments"},function(){return this.Kh},function(a){this.Kh!==a&&(z.g(a,"boolean",Y,"comments"),this.Kh=a,this.I())});z.defineProperty(Y,{Yf:"arrangement"},function(){return this.qd},function(a){this.qd!==a&&(z.Ba(a,Y,Y,"arrangement"),a===ys||a===Dt||a===Bs)&&(this.qd=a,this.I())}); +z.defineProperty(Y,{KD:"arrangementSpacing"},function(){return this.mg},function(a){z.l(a,Ea,Y,"arrangementSpacing");this.mg.N(a)||(this.mg.assign(a),this.I())});z.defineProperty(Y,{qL:"rootDefaults"},function(){return this.wa},function(a){this.wa!==a&&(z.l(a,zs,Y,"rootDefaults"),this.wa=a,this.I())});z.defineProperty(Y,{PJ:"alternateDefaults"},function(){return this.ya},function(a){this.ya!==a&&(z.l(a,zs,Y,"alternateDefaults"),this.ya=a,this.I())}); +z.defineProperty(Y,{sorting:"sorting"},function(){return this.wa.sorting},function(a){this.wa.sorting!==a&&(z.Ba(a,Y,Y,"sorting"),a===Ps||a===Qs||a===Rs||Ss)&&(this.wa.sorting=a,this.I())});z.defineProperty(Y,{comparer:"comparer"},function(){return this.wa.comparer},function(a){this.wa.comparer!==a&&(z.g(a,"function",Y,"comparer"),this.wa.comparer=a,this.I())}); +z.defineProperty(Y,{angle:"angle"},function(){return this.wa.angle},function(a){this.wa.angle!==a&&(z.g(a,"number",Y,"angle"),0===a||90===a||180===a||270===a?(this.wa.angle=a,this.I()):z.k("TreeLayout.angle must be 0, 90, 180, or 270"))});z.defineProperty(Y,{alignment:"alignment"},function(){return this.wa.alignment},function(a){this.wa.alignment!==a&&(z.Ba(a,Y,Y,"alignment"),this.wa.alignment=a,this.I())}); +z.defineProperty(Y,{nodeIndent:"nodeIndent"},function(){return this.wa.nodeIndent},function(a){this.wa.nodeIndent!==a&&(z.g(a,"number",Y,"nodeIndent"),0<=a&&(this.wa.nodeIndent=a,this.I()))});z.defineProperty(Y,{nodeIndentPastParent:"nodeIndentPastParent"},function(){return this.wa.nodeIndentPastParent},function(a){this.wa.nodeIndentPastParent!==a&&(z.g(a,"number",Y,"nodeIndentPastParent"),0<=a&&1>=a&&(this.wa.nodeIndentPastParent=a,this.I()))}); +z.defineProperty(Y,{nodeSpacing:"nodeSpacing"},function(){return this.wa.nodeSpacing},function(a){this.wa.nodeSpacing!==a&&(z.g(a,"number",Y,"nodeSpacing"),this.wa.nodeSpacing=a,this.I())});z.defineProperty(Y,{layerSpacing:"layerSpacing"},function(){return this.wa.layerSpacing},function(a){this.wa.layerSpacing!==a&&(z.g(a,"number",Y,"layerSpacing"),this.wa.layerSpacing=a,this.I())}); +z.defineProperty(Y,{layerSpacingParentOverlap:"layerSpacingParentOverlap"},function(){return this.wa.layerSpacingParentOverlap},function(a){this.wa.layerSpacingParentOverlap!==a&&(z.g(a,"number",Y,"layerSpacingParentOverlap"),0<=a&&1>=a&&(this.wa.layerSpacingParentOverlap=a,this.I()))});z.defineProperty(Y,{compaction:"compaction"},function(){return this.wa.compaction},function(a){this.wa.compaction!==a&&(z.Ba(a,Y,Y,"compaction"),a===$s||a===bt)&&(this.wa.compaction=a,this.I())}); +z.defineProperty(Y,{breadthLimit:"breadthLimit"},function(){return this.wa.breadthLimit},function(a){this.wa.breadthLimit!==a&&(z.g(a,"number",Y,"breadthLimit"),0<=a&&(this.wa.breadthLimit=a,this.I()))});z.defineProperty(Y,{rowSpacing:"rowSpacing"},function(){return this.wa.rowSpacing},function(a){this.wa.rowSpacing!==a&&(z.g(a,"number",Y,"rowSpacing"),this.wa.rowSpacing=a,this.I())}); +z.defineProperty(Y,{rowIndent:"rowIndent"},function(){return this.wa.rowIndent},function(a){this.wa.rowIndent!==a&&(z.g(a,"number",Y,"rowIndent"),0<=a&&(this.wa.rowIndent=a,this.I()))});z.defineProperty(Y,{commentSpacing:"commentSpacing"},function(){return this.wa.commentSpacing},function(a){this.wa.commentSpacing!==a&&(z.g(a,"number",Y,"commentSpacing"),this.wa.commentSpacing=a,this.I())}); +z.defineProperty(Y,{commentMargin:"commentMargin"},function(){return this.wa.commentMargin},function(a){this.wa.commentMargin!==a&&(z.g(a,"number",Y,"commentMargin"),this.wa.commentMargin=a,this.I())});z.defineProperty(Y,{setsPortSpot:"setsPortSpot"},function(){return this.wa.setsPortSpot},function(a){this.wa.setsPortSpot!==a&&(z.g(a,"boolean",Y,"setsPortSpot"),this.wa.setsPortSpot=a,this.I())}); +z.defineProperty(Y,{portSpot:"portSpot"},function(){return this.wa.portSpot},function(a){z.l(a,Q,Y,"portSpot");this.wa.portSpot.N(a)||(this.wa.portSpot=a,this.I())});z.defineProperty(Y,{setsChildPortSpot:"setsChildPortSpot"},function(){return this.wa.setsChildPortSpot},function(a){this.wa.setsChildPortSpot!==a&&(z.g(a,"boolean",Y,"setsChildPortSpot"),this.wa.setsChildPortSpot=a,this.I())}); +z.defineProperty(Y,{childPortSpot:"childPortSpot"},function(){return this.wa.childPortSpot},function(a){z.l(a,Q,Y,"childPortSpot");this.wa.childPortSpot.N(a)||(this.wa.childPortSpot=a,this.I())});z.defineProperty(Y,{$J:"alternateSorting"},function(){return this.ya.sorting},function(a){this.ya.sorting!==a&&(z.Ba(a,Y,Y,"alternateSorting"),a===Ps||a===Qs||a===Rs||Ss)&&(this.ya.sorting=a,this.I())}); +z.defineProperty(Y,{OJ:"alternateComparer"},function(){return this.ya.comparer},function(a){this.ya.comparer!==a&&(z.g(a,"function",Y,"alternateComparer"),this.ya.comparer=a,this.I())});z.defineProperty(Y,{IJ:"alternateAngle"},function(){return this.ya.angle},function(a){this.ya.angle!==a&&(z.g(a,"number",Y,"alternateAngle"),0===a||90===a||180===a||270===a)&&(this.ya.angle=a,this.I())}); +z.defineProperty(Y,{HJ:"alternateAlignment"},function(){return this.ya.alignment},function(a){this.ya.alignment!==a&&(z.Ba(a,Y,Y,"alternateAlignment"),this.ya.alignment=a,this.I())});z.defineProperty(Y,{SJ:"alternateNodeIndent"},function(){return this.ya.nodeIndent},function(a){this.ya.nodeIndent!==a&&(z.g(a,"number",Y,"alternateNodeIndent"),0<=a&&(this.ya.nodeIndent=a,this.I()))}); +z.defineProperty(Y,{TJ:"alternateNodeIndentPastParent"},function(){return this.ya.nodeIndentPastParent},function(a){this.ya.nodeIndentPastParent!==a&&(z.g(a,"number",Y,"alternateNodeIndentPastParent"),0<=a&&1>=a&&(this.ya.nodeIndentPastParent=a,this.I()))});z.defineProperty(Y,{UJ:"alternateNodeSpacing"},function(){return this.ya.nodeSpacing},function(a){this.ya.nodeSpacing!==a&&(z.g(a,"number",Y,"alternateNodeSpacing"),this.ya.nodeSpacing=a,this.I())}); +z.defineProperty(Y,{QJ:"alternateLayerSpacing"},function(){return this.ya.layerSpacing},function(a){this.ya.layerSpacing!==a&&(z.g(a,"number",Y,"alternateLayerSpacing"),this.ya.layerSpacing=a,this.I())});z.defineProperty(Y,{RJ:"alternateLayerSpacingParentOverlap"},function(){return this.ya.layerSpacingParentOverlap},function(a){this.ya.layerSpacingParentOverlap!==a&&(z.g(a,"number",Y,"alternateLayerSpacingParentOverlap"),0<=a&&1>=a&&(this.ya.layerSpacingParentOverlap=a,this.I()))}); +z.defineProperty(Y,{NJ:"alternateCompaction"},function(){return this.ya.compaction},function(a){this.ya.compaction!==a&&(z.Ba(a,Y,Y,"alternateCompaction"),a===$s||a===bt)&&(this.ya.compaction=a,this.I())});z.defineProperty(Y,{JJ:"alternateBreadthLimit"},function(){return this.ya.breadthLimit},function(a){this.ya.breadthLimit!==a&&(z.g(a,"number",Y,"alternateBreadthLimit"),0<=a&&(this.ya.breadthLimit=a,this.I()))}); +z.defineProperty(Y,{XJ:"alternateRowSpacing"},function(){return this.ya.rowSpacing},function(a){this.ya.rowSpacing!==a&&(z.g(a,"number",Y,"alternateRowSpacing"),this.ya.rowSpacing=a,this.I())});z.defineProperty(Y,{WJ:"alternateRowIndent"},function(){return this.ya.rowIndent},function(a){this.ya.rowIndent!==a&&(z.g(a,"number",Y,"alternateRowIndent"),0<=a&&(this.ya.rowIndent=a,this.I()))}); +z.defineProperty(Y,{MJ:"alternateCommentSpacing"},function(){return this.ya.commentSpacing},function(a){this.ya.commentSpacing!==a&&(z.g(a,"number",Y,"alternateCommentSpacing"),this.ya.commentSpacing=a,this.I())});z.defineProperty(Y,{LJ:"alternateCommentMargin"},function(){return this.ya.commentMargin},function(a){this.ya.commentMargin!==a&&(z.g(a,"number",Y,"alternateCommentMargin"),this.ya.commentMargin=a,this.I())}); +z.defineProperty(Y,{ZJ:"alternateSetsPortSpot"},function(){return this.ya.setsPortSpot},function(a){this.ya.setsPortSpot!==a&&(z.g(a,"boolean",Y,"alternateSetsPortSpot"),this.ya.setsPortSpot=a,this.I())});z.defineProperty(Y,{VJ:"alternatePortSpot"},function(){return this.ya.portSpot},function(a){z.l(a,Q,Y,"alternatePortSpot");this.ya.portSpot.N(a)||(this.ya.portSpot=a,this.I())}); +z.defineProperty(Y,{YJ:"alternateSetsChildPortSpot"},function(){return this.ya.setsChildPortSpot},function(a){this.ya.setsChildPortSpot!==a&&(z.g(a,"boolean",Y,"alternateSetsChildPortSpot"),this.ya.setsChildPortSpot=a,this.I())});z.defineProperty(Y,{KJ:"alternateChildPortSpot"},function(){return this.ya.childPortSpot},function(a){z.l(a,Q,Y,"alternateChildPortSpot");this.ya.childPortSpot.N(a)||(this.ya.childPortSpot=a,this.I())});var us;Y.PathDefault=us=z.s(Y,"PathDefault",-1);var vs; +Y.PathDestination=vs=z.s(Y,"PathDestination",0);var Cs;Y.PathSource=Cs=z.s(Y,"PathSource",1);var Ps;Y.SortingForwards=Ps=z.s(Y,"SortingForwards",10);var Qs;Y.SortingReverse=Qs=z.s(Y,"SortingReverse",11);var Rs;Y.SortingAscending=Rs=z.s(Y,"SortingAscending",12);var Ss;Y.SortingDescending=Ss=z.s(Y,"SortingDescending",13);var ut;Y.AlignmentCenterSubtrees=ut=z.s(Y,"AlignmentCenterSubtrees",20);var Ts;Y.AlignmentCenterChildren=Ts=z.s(Y,"AlignmentCenterChildren",21);var dt; +Y.AlignmentStart=dt=z.s(Y,"AlignmentStart",22);var et;Y.AlignmentEnd=et=z.s(Y,"AlignmentEnd",23);var Vs;Y.AlignmentBus=Vs=z.s(Y,"AlignmentBus",24);var Ks;Y.AlignmentBusBranching=Ks=z.s(Y,"AlignmentBusBranching",25);var Ws;Y.AlignmentTopLeftBus=Ws=z.s(Y,"AlignmentTopLeftBus",26);var Xs;Y.AlignmentBottomRightBus=Xs=z.s(Y,"AlignmentBottomRightBus",27);var $s;Y.CompactionNone=$s=z.s(Y,"CompactionNone",30);var bt;Y.CompactionBlock=bt=z.s(Y,"CompactionBlock",31);var ws; +Y.StyleLayered=ws=z.s(Y,"StyleLayered",40);var Os;Y.StyleLastParents=Os=z.s(Y,"StyleLastParents",41);var Ns;Y.StyleAlternating=Ns=z.s(Y,"StyleAlternating",42);var Ms;Y.StyleRootOnly=Ms=z.s(Y,"StyleRootOnly",43);var ys;Y.ArrangementVertical=ys=z.s(Y,"ArrangementVertical",50);var Dt;Y.ArrangementHorizontal=Dt=z.s(Y,"ArrangementHorizontal",51);var Bs;Y.ArrangementFixedRoots=Bs=z.s(Y,"ArrangementFixedRoots",52);var xs;Y.LayerIndividual=xs=z.s(Y,"LayerIndividual",60);var Is; +Y.LayerSiblings=Is=z.s(Y,"LayerSiblings",61);var Hs;Y.LayerUniform=Hs=z.s(Y,"LayerUniform",62);function As(){wa.call(this)}z.Qa(As,wa);z.ia("TreeNetwork",As);As.prototype.createVertex=function(){return new zs};As.prototype.createEdge=function(){return new Ft}; +function zs(){xa.call(this);this.initialized=!1;this.parent=null;this.children=[];this.maxGenerationCount=this.maxChildrenCount=this.descendantCount=this.level=0;this.comments=null;this.qa=new N(0,0);this.ob=new Ea(0,0);this.Ta=new N(0,0);this.Xp=this.Wp=this.cJ=!1;this.mu=this.Vt=null;this.sorting=Ps;this.comparer=Aq;this.angle=0;this.alignment=Ts;this.nodeIndentPastParent=this.nodeIndent=0;this.nodeSpacing=20;this.layerSpacing=50;this.layerSpacingParentOverlap=0;this.compaction=bt;this.breadthLimit= +0;this.rowSpacing=25;this.commentSpacing=this.rowIndent=10;this.commentMargin=20;this.setsPortSpot=!0;this.portSpot=Pc;this.setsChildPortSpot=!0;this.childPortSpot=Pc}z.Qa(zs,xa);z.ia("TreeVertex",zs); +zs.prototype.copyInheritedPropertiesFrom=function(a){null!==a&&(this.sorting=a.sorting,this.comparer=a.comparer,this.angle=a.angle,this.alignment=a.alignment,this.nodeIndent=a.nodeIndent,this.nodeIndentPastParent=a.nodeIndentPastParent,this.nodeSpacing=a.nodeSpacing,this.layerSpacing=a.layerSpacing,this.layerSpacingParentOverlap=a.layerSpacingParentOverlap,this.compaction=a.compaction,this.breadthLimit=a.breadthLimit,this.rowSpacing=a.rowSpacing,this.rowIndent=a.rowIndent,this.commentSpacing=a.commentSpacing, +this.commentMargin=a.commentMargin,this.setsPortSpot=a.setsPortSpot,this.portSpot=a.portSpot,this.setsChildPortSpot=a.setsChildPortSpot,this.childPortSpot=a.childPortSpot)};z.w(zs,{Vm:"childrenCount"},function(){return this.children.length});z.defineProperty(zs,{pL:"relativePosition"},function(){return this.qa},function(a){this.qa.set(a)});z.defineProperty(zs,{BL:"subtreeSize"},function(){return this.ob},function(a){this.ob.set(a)}); +z.defineProperty(zs,{AL:"subtreeOffset"},function(){return this.Ta},function(a){this.Ta.set(a)});function Ft(){ya.call(this);this.ls=new N(0,0)}z.Qa(Ft,ya);z.ia("TreeEdge",Ft); +Ft.prototype.commit=function(){var a=this.link;if(null!==a&&!a.kj){var b=this.network.Sb,c=null,d=null;switch(b.Of){case vs:c=this.fromVertex;d=this.toVertex;break;case Cs:c=this.toVertex;d=this.fromVertex;break;default:z.k("Unhandled path value "+b.Of.toString())}if(null!==c&&null!==d)if(b=this.ls,0!==b.x||0!==b.y||c.cJ){var d=c.vb,e=ct(c),g=ft(c),h=c.rowSpacing;a.An();var k=a.Se===Xi,l=a.rc,m=0,n,p;a.Ul();if(l||k){for(m=2;4<a.sa;)a.nF(2);n=a.m(1);p=a.m(2)}else{for(m=1;3<a.sa;)a.nF(1);n=a.m(0);p= +a.m(a.sa-1)}var q=a.m(a.sa-1),r=0;0===e?(c.alignment===et?(r=d.bottom+b.y,0===b.y&&n.y>q.y+c.rowIndent&&(r=Math.min(r,Math.max(n.y,r-gt(c))))):c.alignment===dt?(r=d.top+b.y,0===b.y&&n.y<q.y-c.rowIndent&&(r=Math.max(r,Math.min(n.y,r+gt(c))))):r=c.Wp||c.Xp&&1===c.maxGenerationCount?d.top-c.Ta.y+b.y:d.y+d.height/2+b.y,k?(a.B(m,n.x,r),m++,a.B(m,d.right+g,r),m++,a.B(m,d.right+g+(b.x-h)/3,r),m++,a.B(m,d.right+g+2*(b.x-h)/3,r),m++,a.B(m,d.right+g+(b.x-h),r),m++,a.B(m,p.x,r)):(l&&(a.B(m,d.right+g/2,n.y), +m++),a.B(m,d.right+g/2,r),m++,a.B(m,d.right+g+b.x-(l?h/2:h),r),m++,l&&a.B(m,a.m(m-1).x,p.y))):90===e?(c.alignment===et?(r=d.right+b.x,0===b.x&&n.x>q.x+c.rowIndent&&(r=Math.min(r,Math.max(n.x,r-gt(c))))):c.alignment===dt?(r=d.left+b.x,0===b.x&&n.x<q.x-c.rowIndent&&(r=Math.max(r,Math.min(n.x,r+gt(c))))):r=c.Wp||c.Xp&&1===c.maxGenerationCount?d.left-c.Ta.x+b.x:d.x+d.width/2+b.x,k?(a.B(m,r,n.y),m++,a.B(m,r,d.bottom+g),m++,a.B(m,r,d.bottom+g+(b.y-h)/3),m++,a.B(m,r,d.bottom+g+2*(b.y-h)/3),m++,a.B(m,r,d.bottom+ +g+(b.y-h)),m++,a.B(m,r,p.y)):(l&&(a.B(m,n.x,d.bottom+g/2),m++),a.B(m,r,d.bottom+g/2),m++,a.B(m,r,d.bottom+g+b.y-(l?h/2:h)),m++,l&&a.B(m,p.x,a.m(m-1).y))):180===e?(c.alignment===et?(r=d.bottom+b.y,0===b.y&&n.y>q.y+c.rowIndent&&(r=Math.min(r,Math.max(n.y,r-gt(c))))):c.alignment===dt?(r=d.top+b.y,0===b.y&&n.y<q.y-c.rowIndent&&(r=Math.max(r,Math.min(n.y,r+gt(c))))):r=c.Wp||c.Xp&&1===c.maxGenerationCount?d.top-c.Ta.y+b.y:d.y+d.height/2+b.y,k?(a.B(m,n.x,r),m++,a.B(m,d.left-g,r),m++,a.B(m,d.left-g+(b.x+ +h)/3,r),m++,a.B(m,d.left-g+2*(b.x+h)/3,r),m++,a.B(m,d.left-g+(b.x+h),r),m++,a.B(m,p.x,r)):(l&&(a.B(m,d.left-g/2,n.y),m++),a.B(m,d.left-g/2,r),m++,a.B(m,d.left-g+b.x+(l?h/2:h),r),m++,l&&a.B(m,a.m(m-1).x,p.y))):270===e?(c.alignment===et?(r=d.right+b.x,0===b.x&&n.x>q.x+c.rowIndent&&(r=Math.min(r,Math.max(n.x,r-gt(c))))):c.alignment===dt?(r=d.left+b.x,0===b.x&&n.x<q.x-c.rowIndent&&(r=Math.max(r,Math.min(n.x,r+gt(c))))):r=c.Wp||c.Xp&&1===c.maxGenerationCount?d.left-c.Ta.x+b.x:d.x+d.width/2+b.x,k?(a.B(m, +r,n.y),m++,a.B(m,r,d.top-g),m++,a.B(m,r,d.top-g+(b.y+h)/3),m++,a.B(m,r,d.top-g+2*(b.y+h)/3),m++,a.B(m,r,d.top-g+(b.y+h)),m++,a.B(m,r,p.y)):(l&&(a.B(m,n.x,d.top-g/2),m++),a.B(m,r,d.top-g/2),m++,a.B(m,r,d.top-g+b.y+(l?h/2:h)),m++,l&&a.B(m,p.x,a.m(m-1).y))):z.k("Invalid angle "+e);a.dj()}else e=c,g=d,u&&z.l(e,zs,Ft,"adjustRouteForAngleChange:parent"),u&&z.l(g,zs,Ft,"adjustRouteForAngleChange:child"),a=this.link,c=ct(e),c!==ct(g)&&(b=ft(e),d=e.vb,e=g.vb,0===c&&e.left-d.right<b+1||90===c&&e.top-d.bottom< +b+1||180===c&&d.left-e.right<b+1||270===c&&d.top-e.bottom<b+1||(a.An(),e=a.Se===Xi,g=a.rc,h=Us(this.fromVertex.alignment),a.Ul(),0===c?(c=d.right+b/2,e?4===a.sa&&(b=a.m(3).y,a.aa(1,c-20,a.m(1).y),a.B(2,c-20,b),a.B(3,c,b),a.B(4,c+20,b),a.aa(5,a.m(5).x,b)):g?h?a.aa(3,a.m(2).x,a.m(4).y):6===a.sa&&(a.aa(2,c,a.m(2).y),a.aa(3,c,a.m(3).y)):4===a.sa?a.B(2,c,a.m(2).y):3===a.sa?a.aa(1,c,a.m(2).y):2===a.sa&&a.B(1,c,a.m(1).y)):90===c?(b=d.bottom+b/2,e?4===a.sa&&(c=a.m(3).x,a.aa(1,a.m(1).x,b-20),a.B(2,c,b-20), +a.B(3,c,b),a.B(4,c,b+20),a.aa(5,c,a.m(5).y)):g?h?a.aa(3,a.m(2).x,a.m(4).y):6===a.sa&&(a.aa(2,a.m(2).x,b),a.aa(3,a.m(3).x,b)):4===a.sa?a.B(2,a.m(2).x,b):3===a.sa?a.aa(1,a.m(2).x,b):2===a.sa&&a.B(1,a.m(1).x,b)):180===c?(c=d.left-b/2,e?4===a.sa&&(b=a.m(3).y,a.aa(1,c+20,a.m(1).y),a.B(2,c+20,b),a.B(3,c,b),a.B(4,c-20,b),a.aa(5,a.m(5).x,b)):g?h?a.aa(3,a.m(2).x,a.m(4).y):6===a.sa&&(a.aa(2,c,a.m(2).y),a.aa(3,c,a.m(3).y)):4===a.sa?a.B(2,c,a.m(2).y):3===a.sa?a.aa(1,c,a.m(2).y):2===a.sa&&a.B(1,c,a.m(1).y)):270=== +c&&(b=d.top-b/2,e?4===a.sa&&(c=a.m(3).x,a.aa(1,a.m(1).x,b+20),a.B(2,c,b+20),a.B(3,c,b),a.B(4,c,b-20),a.aa(5,c,a.m(5).y)):g?h?a.aa(3,a.m(2).x,a.m(4).y):6===a.sa&&(a.aa(2,a.m(2).x,b),a.aa(3,a.m(3).x,b)):4===a.sa?a.B(2,a.m(2).x,b):3===a.sa?a.aa(1,a.m(2).x,b):2===a.sa&&a.B(1,a.m(1).x,b)),a.dj()))}};z.defineProperty(Ft,{oL:"relativePoint"},function(){return this.ls},function(a){this.ls.set(a)});function Gt(){O.call(this);this.$e=null}z.Qa(Gt,O); +Gt.prototype.cloneProtected=function(a){O.prototype.cloneProtected.call(this,a);a.element=this.$e.cloneNode(!0)};Gt.prototype.toString=function(){return"HTMLHost("+this.$e.toString()+")#"+z.nd(this)}; +Gt.prototype.ok=function(a,b){var c=this.$e;if(null!==c){var d=this.eb(ec);d.x-=this.W.width/2;d.y-=this.W.height/2;d.x-=this.W.x;d.y-=this.W.y;var d=b.$A(d),e=b.El;null===e||e.contains(c)||e.appendChild(c);e=this.transform;c.style.transform="matrix("+e.m11+","+e.m12+","+e.m21+","+e.m22+","+e.dx+","+e.dy+")";c.style.transformOrigin="0 0";e=d.y;c.style.left=d.x+"px";c.style.top=e+"px"}}; +Gt.prototype.Ip=function(a,b,c,d){var e=this.Aa;isFinite(e.width)&&(a=e.width);isFinite(e.height)&&(b=e.height);var e=this.Xe,g=this.dg;c=Math.max(c,g.width);d=Math.max(d,g.height);a=Math.min(e.width,a);b=Math.min(e.height,b);a=Math.max(c,a);b=Math.max(d,b);c=this.$e;null!==c&&(b=c.getBoundingClientRect(),a=b.width,b=b.height);yb(this.Wc,a,b);Km(this,0,0,a,b)};Gt.prototype.aj=function(a,b,c,d){Om(this,a,b,c,d)};z.w(Gt,{Ga:"naturalBounds"},function(){return this.Wc}); +z.defineProperty(Gt,{element:"element"},function(){return this.$e},function(a){var b=this.$e;b!==a&&(a instanceof HTMLElement||z.k("HTMLHost.element must be an instance of HTMLElement."),this.$e=a,a.className="HTMLHost",this.j("element",b,a),this.ta())});aa.version="1.6.21"; +window&&(window.module&&"object"===typeof window.module&&"object"===typeof window.module.exports?window.module.exports=aa:window.define&&"function"===typeof window.define&&window.define.amd?(window.go=aa,window.define(aa)):window.go=aa);"undefined"!==typeof module&&"object"===typeof module.exports&&(module.exports=aa); })(window); diff --git a/cyclone-web/vendor/gojs/go.js b/cyclone-web/vendor/gojs/go.js new file mode 100644 index 0000000000000000000000000000000000000000..32c39ff45efa277ff130ca5df8d8796be279840f --- /dev/null +++ b/cyclone-web/vendor/gojs/go.js @@ -0,0 +1,1982 @@ +/* + * GoJS v1.6.21 JavaScript Library for HTML Diagrams + * Northwoods Software, https://www.nwoods.com/ + * GoJS and Northwoods Software are registered trademarks of Northwoods Software Corporation. + * Copyright (C) 1998-2016 by Northwoods Software Corporation. All Rights Reserved. + * THIS SOFTWARE IS LICENSED. THE LICENSE AGREEMENT IS AT: https://gojs.net/1.6.21/doc/license.html. + */ +(function(window) { var g,ea={};if(!window.document||void 0===window.document.createElement("canvas").getContext)throw window.console&&window.console.log("The HTML Canvas element is not supported in this browser,or this browser is in Compatibility mode."),Error("The HTML Canvas element is not supported in this browser,or this browser is in Compatibility mode.");if(!Object.defineProperty)throw Error("GoJS requires a newer version of JavaScript"); +Function.prototype.bind||(Function.prototype.bind=function(a){function b(){return f.apply(a,e.concat(d.call(arguments)))}function c(){}var d=Array.prototype.slice,e=d.call(arguments,1),f=this;c.prototype=this.prototype;b.prototype=new c;return b}); +(function(){for(var a=0,b=["ms","moz","webkit","o"],c=0;c<b.length&&!window.requestAnimationFrame;++c)window.requestAnimationFrame=window[b[c]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[b[c]+"CancelAnimationFrame"]||window[b[c]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(b){var c=(new Date).getTime(),f=Math.max(8,16-(c-a)),h=window.setTimeout(function(){b(c+f)},f);a=c+f;return h});window.cancelAnimationFrame||(window.cancelAnimationFrame= +function(a){window.clearTimeout(a)})})();ea.Debug=null; +var v={dd:1,Nc:2,Xc:4,Wc:8,Pm:void 0!==window.navigator&&0<window.navigator.userAgent.indexOf("534.30")&&0<window.navigator.userAgent.indexOf("Android"),eE:void 0!==window.navigator&&0<window.navigator.userAgent.indexOf("MSIE 10.0"),fE:void 0!==window.navigator&&0<window.navigator.userAgent.indexOf("Trident/7"),TJ:void 0!==window.navigator&&0<window.navigator.userAgent.indexOf("Edge/"),bk:void 0!==window.navigator&&void 0!==window.navigator.platform&&0<=window.navigator.platform.toUpperCase().indexOf("MAC"), +gE:void 0!==window.navigator&&void 0!==window.navigator.platform&&null!==window.navigator.platform.match(/(iPhone|iPod|iPad)/i),xD:function(a,b,c){var d=-1;return function(){var e=this,f=arguments;-1!==d&&v.clearTimeout(d);d=v.setTimeout(function(){d=-1;c||a.apply(e,f)},b);c&&!d&&a.apply(e,f)}},setTimeout:function(a,b){return window.setTimeout(a,b)},clearTimeout:function(a){window.clearTimeout(a)},createElement:function(a){return window.document.createElement(a)},k:function(a){throw Error(a);},ka:function(a, +b){var c="The object is frozen, so its properties cannot be set: "+a.toString();void 0!==b&&(c+=" to value: "+b);v.k(c)},A:function(a,b,c,d){a instanceof b||(c=v.getTypeName(c),void 0!==d&&(c+="."+d),v.Cd(a,b,c))},j:function(a,b,c,d){typeof a!==b&&(c=v.getTypeName(c),void 0!==d&&(c+="."+d),v.Cd(a,b,c))},We:function(a,b,c){"number"===typeof a&&isFinite(a)||(b=v.getTypeName(b),void 0!==c&&(b+="."+c),v.k(b+" must be a real number type, and not NaN or Infinity: "+a))},pb:function(a,b,c,d){a instanceof +fa&&a.qe===b||(c=v.getTypeName(c),void 0!==d&&(c+="."+d),v.Cd(a,"a constant of class "+v.af(b),c))},uJ:function(a,b){"string"===typeof a?ga(a)||v.k('Color "'+a+'" is not a valid color string for '+b):a instanceof ha||v.k("Value for "+b+" must be a color string or a Brush, not "+a)},Cd:function(a,b,c,d){b=v.getTypeName(b);c=v.getTypeName(c);void 0!==d&&(c+="."+d);"string"===typeof a?v.k(c+" value is not an instance of "+b+': "'+a+'"'):v.k(c+" value is not an instance of "+b+": "+a)},va:function(a, +b,c,d){c=v.getTypeName(c);void 0!==d&&(c+="."+d);v.k(c+" is not in the range "+b+": "+a)},cd:function(a){v.k(v.af(a)+" constructor cannot take any arguments.")},La:function(a){v.k("Collection was modified during iteration: "+a.toString()+"\n Perhaps you should iterate over a copy of the collection,\n or you could collect items to be removed from the collection after the iteration.")},trace:function(a){window.console&&window.console.log(a)},Ta:function(a){return"object"===typeof a&&null!==a},isArray:function(a){return Array.isArray(a)|| +a instanceof NodeList||a instanceof HTMLCollection},rH:function(a){return Array.isArray(a)},cz:function(a,b,c){v.isArray(a)||v.Cd(a,"Array or NodeList or HTMLCollection",b,c)},Va:function(a){return a.length},fl:function(a){return Array.prototype.slice.call(a)},Qa:function(a,b){Array.isArray(a);return a[b]},kD:function(a,b,c){Array.isArray(a)?a[b]=c:v.k("Cannot replace an object in an HTMLCollection or NodeList at "+b)},bz:function(a,b){if(Array.isArray(a))return a.indexOf(b);for(var c=a.length,d= +0;d<c;d++)if(a[d]===b)return d;return-1},Oi:function(a,b,c){Array.isArray(a)?b>=a.length?a.push(c):a.splice(b,0,c):v.k("Cannot insert an object into an HTMLCollection or NodeList: "+c+" at "+b)},Uh:function(a,b){Array.isArray(a)?b>=a.length?a.pop():a.splice(b,1):v.k("Cannot remove an object from an HTMLCollection or NodeList at "+b)},Bx:[],L:function(){var a=v.Bx.pop();return void 0===a?new z:a},Mb:function(a,b){var c=v.Bx.pop();if(void 0===c)return new z(a,b);c.x=a;c.y=b;return c},v:function(a){v.Bx.push(a)}, +KA:[],Fl:function(){var a=v.KA.pop();return void 0===a?new ia:a},$j:function(a){v.KA.push(a)},Cx:[],ag:function(){var a=v.Cx.pop();return void 0===a?new A:a},hk:function(a,b,c,d){var e=v.Cx.pop();if(void 0===e)return new A(a,b,c,d);e.x=a;e.y=b;e.width=c;e.height=d;return e},Vb:function(a){v.Cx.push(a)},LA:[],rh:function(){var a=v.LA.pop();return void 0===a?new ja:a},$e:function(a){v.LA.push(a)},Dx:null,s:function(){var a=v.Dx;return null!==a?(v.Dx=null,a):new ma},q:function(a){a.reset();v.Dx=a},JA:[], +jb:function(){var a=v.JA.pop();return void 0===a?[]:a},sa:function(a){a.length=0;v.JA.push(a)},hj:Object.freeze([]),Jl:1,dc:function(a){a.__gohashid=v.Jl++},ot:function(a){var b=a.__gohashid;void 0===b&&(b=v.Jl++,a.__gohashid=b);return b},ld:function(a){return a.__gohashid},ea:function(a,b){b.Mx=a;ea[a]=b},Ja:function(a,b){function c(){}c.prototype=b.prototype;a.prototype=new c;a.prototype.constructor=a},Vh:function(a){a.QF=!0},defineProperty:function(a,b,c,d,e){v.j(a,"function","Util.defineProperty:classfunc"); +v.j(b,"object","Util.defineProperty:propobj");v.j(c,"function","Util.defineProperty:getter");v.j(d,"function","Util.defineProperty:setter");for(var f in b){b=b[f];c={get:c,set:d,enumerable:!0};if(void 0!==e)for(var h in e)c[h]=e[h];Object.defineProperty(a.prototype,f,c);e=Object.getOwnPropertyDescriptor(a.prototype,f);b&&e&&Object.defineProperty(a.prototype,b,e);break}},WI:!1,u:function(a,b,c,d){v.j(a,"function","Util.defineReadOnlyProperty:classfunc");v.j(b,"object","Util.defineReadOnlyProperty:propobj"); +v.j(c,"function","Util.defineReadOnlyProperty:getter");for(var e in b){var f=b[e];b={get:c,set:function(a){v.k('The property "'+f+'" is read-only and cannot be set to '+a)},enumerable:!0};if(void 0!==d)for(var h in d)b[h]=d[h];Object.defineProperty(a.prototype,e,b);d=Object.getOwnPropertyDescriptor(a.prototype,e);f&&d&&Object.defineProperty(a.prototype,f,d);break}},Kd:function(a,b){for(var c in b)b[c]=!0;a.prototype.MF=b},getTypeName:function(a){return void 0===a?"":"string"===typeof a?a:"function"=== +typeof a?v.af(a):null===a?"*":""},af:function(a){if("function"===typeof a){if(a.Mx)return a.Mx;if(a.name)return a.name;var b=a.toString(),c=b.indexOf("("),b=b.substring(9,c).trim();if(""!==b)return a.Mx=b}else if("object"===typeof a&&a.constructor)return v.af(a.constructor);return typeof a},p:function(a,b,c){v.j(a,"function","Util.defineEnumValue:classfunc");v.j(b,"string","Util.defineEnumValue:name");v.j(c,"number","Util.defineEnumValue:num");c=new fa(a,b,c);Object.freeze(c);a[b]=c;var d=a.ku;d instanceof +na||(d=new na("string",fa),a.ku=d);d.add(b,c);return c},qb:function(a,b){if(!a||!b)return null;var c=void 0;try{"function"===typeof b?c=b(a):"function"===typeof a.getAttribute?(c=a.getAttribute(b),null===c&&(c=void 0)):c=a[b]}catch(d){}return c},Ka:function(a,b,c){if(a&&b)try{"function"===typeof b?b(a,c):"function"===typeof a.setAttribute?a.setAttribute(b,c):a[b]=c}catch(d){}},Xt:function(a,b){v.j(a,"object","Setting properties requires Objects as arguments");v.j(b,"object","Setting properties requires Objects as arguments"); +var c=a instanceof D,d=a instanceof E,e;for(e in b){""===e&&v.k("Setting properties requires non-empty property names");var f=a,h=e;if(c||d){var k=e.indexOf(".");if(0<k){var l=e.substring(0,k);if(c)f=a.be(l);else if(f=a[l],void 0===f||null===f)f=a.Za[l];v.Ta(f)?h=e.substr(k+1):v.k("Unable to find object named: "+l+" in "+a.toString()+" when trying to set property: "+e)}}if("_"!==h[0]&&!v.WD(f,h))if(d&&"ModelChanged"===h){a.dG(b[h]);continue}else if(d&&"Changed"===h){a.wm(b[h]);continue}else if(d&& +v.WD(a.Za,h))f=a.Za;else if(d&&qa(a,h)){a.Xy(h,b[h]);continue}else if(a instanceof F&&"Changed"===h){a.wm(b[h]);continue}else v.k('Trying to set undefined property "'+h+'" on object: '+f.toString());f[h]=b[e];"_"===h[0]&&f instanceof G&&f.aG(h)}},WD:function(a,b){if(a.hasOwnProperty(b))return!0;for(var c=Object.getPrototypeOf(a);c&&c!==Function;){if(c.hasOwnProperty(b))return!0;var d=c.MF;if(d&&d[b])return!0;c=Object.getPrototypeOf(c)}return!1},eI:function(a){for(var b=[],c=0;256>c;c++)b[c]=c;for(var d= +0,e=0,c=0;256>c;c++)d=(d+b[c]+119)%256,e=b[c],b[c]=b[d],b[d]=e;for(var d=c=0,f="",h=0;h<a.length;h++)c=(c+1)%256,d=(d+b[c])%256,e=b[c],b[c]=b[d],b[d]=e,f+=String.fromCharCode(a.charCodeAt(h)^b[(b[c]+b[d])%256]);return f},fH:function(a){for(var b=[],c=0;256>c;c++)b["0123456789abcdef".charAt(c>>4)+"0123456789abcdef".charAt(c&15)]=String.fromCharCode(c);a.length%2&&(a="0"+a);for(var d=[],e=0,c=0;c<a.length;c+=2)d[e++]=b[a.substr(c,2)];a=d.join("");return""===a?"0":a},ug:function(a){return v.eI(v.fH(a))}, +Hl:null,adym:"7da71ca0ad381e90",vfo:"2be640fdb167",pG:"@COLOR1",qG:"@COLOR2"}; +v.Hl=function(){var a=window.document.createElement("canvas"),b=a.getContext("2d");b[v.ug("7ca11abfd022028846")]=v.ug("398c3597c01238");for(var c=["5da73c80a3330d854f9e5e671d6633","32ab5ff3b26f42dc0ed90f22422913b54ae6247590da4bb21c324ba3a84e385776","54a702f3e53909c447824c6706603faf4cfb236cdfda5de14c134ba1a95a2d4c7cc6f93c1387","74bf19bce72555874c86"],d=1;5>d;d++)b[v.ug("7ca11abfd7330390")](v.ug(c[d-1]),10,15*d+0);b[v.ug("7ca11abfd022028846")]=v.ug("39f046ebb36e4b");for(d=1;5>d;d++)b[v.ug("7ca11abfd7330390")](v.ug(c[d- +1]),10,15*d+0);if(4!==c.length||"5"!==c[0][0]||"7"!==c[3][0])v.p=function(a,b){var c=new fa(a,b,2);Object.freeze(c);a[b]=c;var d=a.ku;d instanceof na||(d=new na("string",fa),a.ku=d);d.add(b,c);return c};return a}();function fa(a,b,c){v.dc(this);this.ZA=a;this.Ob=b;this.VF=c}v.ea("EnumValue",fa);fa.prototype.toString=function(){return v.af(this.ZA)+"."+this.Ob};v.u(fa,{qe:"classType"},function(){return this.ZA});v.u(fa,{name:"name"},function(){return this.Ob});v.u(fa,{value:"value"},function(){return this.VF}); +var ra;fa.findName=ra=function(a,b){if(void 0===b||null===b||""===b)return null;v.j(a,"function","findName:classfunc");v.j(b,"string","EnumValue.findName:name");var c=a.ku;return c instanceof na?c.ja(b):null};function sa(){this.XA=[]}sa.prototype.toString=function(){return this.XA.join("")};sa.prototype.add=function(a){""!==a&&this.XA.push(a)};function ta(){} +function va(a){void 0===a&&(a=42);this.seed=a;this.xx=48271;this.ju=2147483647;this.IA=this.ju/this.xx;this.yF=this.ju%this.xx;this.xF=1/this.ju;this.random()}va.prototype.random=function(){var a=this.seed%this.IA*this.xx-this.seed/this.IA*this.yF;this.seed=0<a?a:a+this.ju;return this.seed*this.xF};function wa(){}v.u(wa,{i:"iterator"},function(){return this});wa.prototype.reset=wa.prototype.reset=function(){};wa.prototype.next=wa.prototype.hasNext=wa.prototype.next=function(){return!1}; +wa.prototype.first=wa.prototype.first=function(){return null};wa.prototype.any=function(){return!1};wa.prototype.all=function(){return!0};wa.prototype.each=function(){return this};wa.prototype.map=function(){return this};wa.prototype.filter=function(){return this};wa.prototype.concat=function(a){return a.i};v.u(wa,{count:"count"},function(){return 0});wa.prototype.Cf=function(){};wa.prototype.toString=function(){return"EmptyIterator"};var xa=new wa;function ya(a){this.key=-1;this.value=a} +v.Kd(ya,{key:!0,value:!0});v.u(ya,{i:"iterator"},function(){return this});ya.prototype.reset=ya.prototype.reset=function(){this.key=-1};ya.prototype.next=ya.prototype.hasNext=ya.prototype.next=function(){return-1===this.key?(this.key=0,!0):!1};ya.prototype.first=ya.prototype.first=function(){this.key=0;return this.value};ya.prototype.any=function(a){this.key=-1;return a(this.value)};ya.prototype.all=function(a){this.key=-1;return a(this.value)}; +ya.prototype.each=function(a){this.key=-1;a(this.value);return this};ya.prototype.map=function(a){return new ya(a(this.value))};ya.prototype.filter=function(a){return a(this.value)?new ya(this.value):xa};ya.prototype.concat=function(a){return new za(this,a.i)};v.u(ya,{count:"count"},function(){return 1});ya.prototype.Cf=function(){this.value=null};ya.prototype.toString=function(){return"SingletonIterator("+this.value+")"};function za(a,b){this.Hk=a;this.Ik=b;this.lu=!1}v.Kd(za,{key:!0,value:!0}); +v.u(za,{i:"iterator"},function(){return this});za.prototype.reset=za.prototype.reset=function(){this.Hk.reset();this.Ik.reset();this.lu=!1};za.prototype.next=za.prototype.hasNext=za.prototype.next=function(){if(!this.lu){var a=this.Hk;if(a.next())return this.key=a.key,this.value=a.value,!0;this.lu=!0}return this.lu&&(a=this.Ik,a.next())?(this.key=a.key,this.value=a.value,!0):!1};za.prototype.first=za.prototype.first=function(){this.reset();return this.next()?this.value:null}; +za.prototype.any=function(a){return this.Hk.any(a)||this.Ik.any(a)?!0:!1};za.prototype.all=function(a){return this.Hk.all(a)&&this.Ik.all(a)?!0:!1};za.prototype.each=function(a){this.Hk.each(a);this.Ik.each(a);return this};za.prototype.map=function(a){return new za(this.Hk.map(a),this.Ik.map(a))};za.prototype.filter=function(a){return new za(this.Hk.filter(a),this.Ik.filter(a))};za.prototype.concat=function(a){return new za(this,a.i)};v.u(za,{count:"count"},function(){return this.Hk.count+this.Ik.count}); +za.prototype.Cf=function(){this.value=this.key=null};za.prototype.toString=function(){return"ConcatIterator()"};function Aa(a){this.tc=a;this.Ih=null;this.reset()}v.Kd(Aa,{key:!0,value:!0});v.u(Aa,{i:"iterator"},function(){return this});v.defineProperty(Aa,{Wm:"predicate"},function(){return this.Ih},function(a){this.Ih=a});Aa.prototype.reset=Aa.prototype.reset=function(){var a=this.tc;a.Xb=null;this.eb=a.F;this.Oc=-1}; +Aa.prototype.next=Aa.prototype.hasNext=Aa.prototype.next=function(){var a=this.tc;if(a.F!==this.eb){if(0>this.key)return!1;v.La(a)}var a=a.n,b=a.length,c=++this.Oc,d=this.Ih;if(null!==d)for(;c<b;){var e=a[c];if(d(e))return this.key=this.Oc=c,this.value=e,!0;c++}else{if(c<b)return this.key=c,this.value=a[c],!0;this.Cf()}return!1}; +Aa.prototype.first=Aa.prototype.first=function(){var a=this.tc;this.eb=a.F;this.Oc=0;var a=a.n,b=a.length,c=this.Ih;if(null!==c){for(var d=0;d<b;){var e=a[d];if(c(e))return this.key=this.Oc=d,this.value=e;d++}return null}return 0<b?(e=a[0],this.key=0,this.value=e):null};Aa.prototype.any=function(a){var b=this.tc;b.Xb=null;var c=b.F;this.Oc=-1;for(var d=b.n,e=d.length,f=this.Ih,h=0;h<e;h++){var k=d[h];if(null===f||f(k)){if(a(k))return!0;b.F!==c&&v.La(b)}}return!1}; +Aa.prototype.all=function(a){var b=this.tc;b.Xb=null;var c=b.F;this.Oc=-1;for(var d=b.n,e=d.length,f=this.Ih,h=0;h<e;h++){var k=d[h];if(null===f||f(k)){if(!a(k))return!1;b.F!==c&&v.La(b)}}return!0};Aa.prototype.each=function(a){var b=this.tc;b.Xb=null;var c=b.F;this.Oc=-1;for(var d=b.n,e=d.length,f=this.Ih,h=0;h<e;h++){var k=d[h];if(null===f||f(k))a(k),b.F!==c&&v.La(b)}return this}; +Aa.prototype.map=function(a){var b=this.tc;b.Xb=null;var c=b.F;this.Oc=-1;for(var d=[],e=b.n,f=e.length,h=this.Ih,k=0;k<f;k++){var l=e[k];if(null===h||h(l))d.push(a(l)),b.F!==c&&v.La(b)}a=new I;a.n=d;a.Bc();return a.i};Aa.prototype.filter=function(a){var b=this.tc;b.Xb=null;var c=b.F;this.Oc=-1;for(var d=[],e=b.n,f=e.length,h=this.Ih,k=0;k<f;k++){var l=e[k];if(null===h||h(l))a(l)&&d.push(l),b.F!==c&&v.La(b)}a=new I(b.ia);a.n=d;a.Bc();return a.i}; +Aa.prototype.concat=function(a){this.tc.Xb=null;return new za(this,a.i)};v.u(Aa,{count:"count"},function(){var a=this.Ih;if(null!==a){for(var b=0,c=this.tc.n,d=c.length,e=0;e<d;e++)a(c[e])&&b++;return b}return this.tc.n.length});Aa.prototype.Cf=function(){this.key=-1;this.value=null;this.eb=-1;this.Ih=null;this.tc.Xb=this};Aa.prototype.toString=function(){return"ListIterator@"+this.Oc+"/"+this.tc.count};function Ba(a){this.tc=a;this.reset()}v.Kd(Ba,{key:!0,value:!0});v.u(Ba,{i:"iterator"},function(){return this}); +Ba.prototype.reset=Ba.prototype.reset=function(){var a=this.tc;a.wj=null;this.eb=a.F;this.Oc=a.n.length};Ba.prototype.next=Ba.prototype.hasNext=Ba.prototype.next=function(){var a=this.tc;if(a.F!==this.eb){if(0>this.key)return!1;v.La(a)}var b=--this.Oc;if(0<=b)return this.key=b,this.value=a.n[b],!0;this.Cf();return!1};Ba.prototype.first=Ba.prototype.first=function(){var a=this.tc;this.eb=a.F;var b=a.n;this.Oc=a=b.length-1;return 0<=a?(b=b[a],this.key=a,this.value=b):null}; +Ba.prototype.any=function(a){var b=this.tc;b.wj=null;var c=b.F,d=b.n,e=d.length;this.Oc=e;for(e-=1;0<=e;e--){if(a(d[e]))return!0;b.F!==c&&v.La(b)}return!1};Ba.prototype.all=function(a){var b=this.tc;b.wj=null;var c=b.F,d=b.n,e=d.length;this.Oc=e;for(e-=1;0<=e;e--){if(!a(d[e]))return!1;b.F!==c&&v.La(b)}return!0};Ba.prototype.each=function(a){var b=this.tc;b.wj=null;var c=b.F,d=b.n,e=d.length;this.Oc=e;for(e-=1;0<=e;e--)a(d[e]),b.F!==c&&v.La(b);return this}; +Ba.prototype.map=function(a){var b=this.tc;b.wj=null;var c=b.F,d=[],e=b.n,f=e.length;this.Oc=f;for(f-=1;0<=f;f--)d.push(a(e[f])),b.F!==c&&v.La(b);a=new I;a.n=d;a.Bc();return a.i};Ba.prototype.filter=function(a){var b=this.tc;b.wj=null;var c=b.F,d=[],e=b.n,f=e.length;this.Oc=f;for(f-=1;0<=f;f--){var h=e[f];a(h)&&d.push(h);b.F!==c&&v.La(b)}a=new I(b.ia);a.n=d;a.Bc();return a.i};Ba.prototype.concat=function(a){this.tc.wj=null;return new za(this,a.i)};v.u(Ba,{count:"count"},function(){return this.tc.n.length}); +Ba.prototype.Cf=function(){this.key=-1;this.value=null;this.eb=-1;this.tc.wj=this};Ba.prototype.toString=function(){return"ListIteratorBackwards("+this.Oc+"/"+this.tc.count+")"}; +function I(a){v.dc(this);this.D=!1;this.n=[];this.F=0;this.wj=this.Xb=null;void 0===a||null===a?this.ia=null:"string"===typeof a?"object"===a||"string"===a||"number"===a||"boolean"===a||"function"===a?this.ia=a:v.va(a,"the string 'object', 'number', 'string', 'boolean', or 'function'","List constructor: type"):"function"===typeof a?this.ia=a===Object?"object":a===String?"string":a===Number?"number":a===Boolean?"boolean":a===Function?"function":a:v.va(a,"null, a primitive type name, or a class type", +"List constructor: type")}v.ea("List",I);I.prototype.Bc=function(){var a=this.F;a++;999999999<a&&(a=0);this.F=a};I.prototype.freeze=I.prototype.freeze=function(){this.D=!0;return this};I.prototype.thaw=I.prototype.Oa=function(){this.D=!1;return this};I.prototype.toString=function(){return"List("+v.getTypeName(this.ia)+")#"+v.ld(this)};I.prototype.add=I.prototype.push=I.prototype.add=function(a){null!==a&&(this.D&&v.ka(this,a),this.n.push(a),this.Bc())}; +I.prototype.addAll=I.prototype.Tc=function(a){if(null===a)return this;this.D&&v.ka(this);var b=this.n;if(v.isArray(a))for(var c=v.Va(a),d=0;d<c;d++){var e=v.Qa(a,d);b.push(e)}else for(a=a.i;a.next();)e=a.value,b.push(e);this.Bc();return this};I.prototype.clear=I.prototype.clear=function(){this.D&&v.ka(this);this.n.length=0;this.Bc()};I.prototype.contains=I.prototype.has=I.prototype.contains=function(a){return null===a?!1:-1!==this.n.indexOf(a)}; +I.prototype.indexOf=I.prototype.indexOf=function(a){return null===a?-1:this.n.indexOf(a)};I.prototype.elt=I.prototype.get=I.prototype.da=function(a){var b=this.n;(0>a||a>=b.length)&&v.va(a,"0 <= i < length",I,"elt:i");return b[a]};I.prototype.setElt=I.prototype.set=I.prototype.Ig=function(a,b){var c=this.n;(0>a||a>=c.length)&&v.va(a,"0 <= i < length",I,"setElt:i");this.D&&v.ka(this,a);c[a]=b};I.prototype.first=I.prototype.first=function(){var a=this.n;return 0===a.length?null:a[0]}; +I.prototype.last=I.prototype.Qd=function(){var a=this.n,b=a.length;return 0<b?a[b-1]:null};I.prototype.pop=I.prototype.pop=function(){this.D&&v.ka(this);var a=this.n;return 0<a.length?a.pop():null};I.prototype.any=function(a){for(var b=this.n,c=this.F,d=b.length,e=0;e<d;e++){if(a(b[e]))return!0;this.F!==c&&v.La(this)}return!1};I.prototype.all=function(a){for(var b=this.n,c=this.F,d=b.length,e=0;e<d;e++){if(!a(b[e]))return!1;this.F!==c&&v.La(this)}return!0}; +I.prototype.each=function(a){for(var b=this.n,c=this.F,d=b.length,e=0;e<d;e++)a(b[e]),this.F!==c&&v.La(this);return this};I.prototype.map=function(a){for(var b=new I,c=[],d=this.n,e=this.F,f=d.length,h=0;h<f;h++)c.push(a(d[h])),this.F!==e&&v.La(this);b.n=c;b.Bc();return b};I.prototype.filter=function(a){for(var b=new I(this.ia),c=[],d=this.n,e=this.F,f=d.length,h=0;h<f;h++){var k=d[h];a(k)&&c.push(k);this.F!==e&&v.La(this)}b.n=c;b.Bc();return b};I.prototype.concat=function(a){return this.copy().Tc(a)}; +I.prototype.insertAt=I.prototype.yd=function(a,b){0>a&&v.va(a,">= 0",I,"insertAt:i");this.D&&v.ka(this,a);var c=this.n;a>=c.length?c.push(b):c.splice(a,0,b);this.Bc();return!0};I.prototype.remove=I.prototype["delete"]=I.prototype.remove=function(a){if(null===a)return!1;this.D&&v.ka(this,a);var b=this.n;a=b.indexOf(a);if(-1===a)return!1;a===b.length-1?b.pop():b.splice(a,1);this.Bc();return!0}; +I.prototype.removeAt=I.prototype.Vc=function(a){var b=this.n;(0>a||a>=b.length)&&v.va(a,"0 <= i < length",I,"removeAt:i");this.D&&v.ka(this,a);a===b.length-1?b.pop():b.splice(a,1);this.Bc()};I.prototype.removeRange=I.prototype.removeRange=function(a,b){var c=this.n;(0>a||a>=c.length)&&v.va(a,"0 <= from < length",I,"elt:from");(0>b||b>=c.length)&&v.va(b,"0 <= to < length",I,"elt:to");this.D&&v.ka(this,a);var d=c.slice((b||a)+1||c.length);c.length=0>a?c.length+a:a;c.push.apply(c,d);this.Bc()}; +I.prototype.copy=function(){var a=new I(this.ia),b=this.n;0<b.length&&(a.n=Array.prototype.slice.call(b));return a};I.prototype.toArray=I.prototype.cc=function(){for(var a=this.n,b=this.count,c=Array(b),d=0;d<b;d++)c[d]=a[d];return c};I.prototype.toSet=I.prototype.hF=function(){for(var a=new J(this.ia),b=this.n,c=this.count,d=0;d<c;d++)a.add(b[d]);return a};I.prototype.sort=I.prototype.sort=function(a){this.D&&v.ka(this);this.n.sort(a);this.Bc();return this}; +I.prototype.sortRange=I.prototype.Ip=function(a,b,c){var d=this.n,e=d.length;void 0===b&&(b=0);void 0===c&&(c=e);this.D&&v.ka(this);var f=c-b;if(1>=f)return this;(0>b||b>=e-1)&&v.va(b,"0 <= from < length",I,"sortRange:from");if(2===f)return c=d[b],e=d[b+1],0<a(c,e)&&(d[b]=e,d[b+1]=c,this.Bc()),this;if(0===b)if(c>=e)d.sort(a);else for(f=d.slice(0,c),f.sort(a),a=0;a<c;a++)d[a]=f[a];else if(c>=e)for(f=d.slice(b),f.sort(a),a=b;a<e;a++)d[a]=f[a-b];else for(f=d.slice(b,c),f.sort(a),a=b;a<c;a++)d[a]=f[a- +b];this.Bc();return this};I.prototype.reverse=I.prototype.reverse=function(){this.D&&v.ka(this);this.n.reverse();this.Bc();return this};v.u(I,{count:"count"},function(){return this.n.length});v.u(I,{size:"size"},function(){return this.n.length});v.u(I,{length:"length"},function(){return this.n.length});v.u(I,{i:"iterator"},function(){if(0>=this.n.length)return xa;var a=this.Xb;return null!==a?(a.reset(),a):new Aa(this)}); +v.u(I,{Rm:"iteratorBackwards"},function(){if(0>=this.n.length)return xa;var a=this.wj;return null!==a?(a.reset(),a):new Ba(this)});function Da(a){this.Kh=a;this.reset()}v.Kd(Da,{key:!0,value:!0});v.u(Da,{i:"iterator"},function(){return this});Da.prototype.reset=Da.prototype.reset=function(){var a=this.Kh;a.Xb=null;this.eb=a.F;this.cb=null}; +Da.prototype.next=Da.prototype.hasNext=Da.prototype.next=function(){var a=this.Kh;if(a.F!==this.eb){if(null===this.key)return!1;v.La(a)}var b=this.cb,b=null===b?a.Da:b.Ua;if(null!==b)return this.cb=b,this.value=b.value,this.key=b.key,!0;this.Cf();return!1};Da.prototype.first=Da.prototype.first=function(){var a=this.Kh;this.eb=a.F;a=a.Da;if(null!==a){this.cb=a;var b=a.value;this.key=a.key;return this.value=b}return null}; +Da.prototype.any=function(a){var b=this.Kh;b.Xb=null;var c=b.F;this.cb=null;for(var d=b.Da;null!==d;){if(a(d.value))return!0;b.F!==c&&v.La(b);d=d.Ua}return!1};Da.prototype.all=function(a){var b=this.Kh;b.Xb=null;var c=b.F;this.cb=null;for(var d=b.Da;null!==d;){if(!a(d.value))return!1;b.F!==c&&v.La(b);d=d.Ua}return!0};Da.prototype.each=function(a){var b=this.Kh;b.Xb=null;var c=b.F;this.cb=null;for(var d=b.Da;null!==d;)a(d.value),b.F!==c&&v.La(b),d=d.Ua;return this}; +Da.prototype.map=function(a){var b=this.Kh;b.Xb=null;for(var c=new I,d=b.F,e=b.Da;null!==e;)c.add(a(e.value)),b.F!==d&&v.La(b),e=e.Ua;return c.i};Da.prototype.filter=function(a){var b=this.Kh;b.Xb=null;for(var c=new I(b.ia),d=b.F,e=b.Da;null!==e;){var f=e.value;a(f)&&c.add(f);b.F!==d&&v.La(b);e=e.Ua}return c.i};Da.prototype.concat=function(a){this.Kh.Xb=null;return new za(this,a.i)};v.u(Da,{count:"count"},function(){return this.Kh.fd}); +Da.prototype.Cf=function(){this.value=this.key=null;this.eb=-1;this.Kh.Xb=this};Da.prototype.toString=function(){return null!==this.cb?"SetIterator@"+this.cb.value:"SetIterator"}; +function J(a){v.dc(this);this.D=!1;void 0===a||null===a?this.ia=null:"string"===typeof a?"object"===a||"string"===a||"number"===a?this.ia=a:v.va(a,"the string 'object', 'number' or 'string'","Set constructor: type"):"function"===typeof a?this.ia=a===Object?"object":a===String?"string":a===Number?"number":a:v.va(a,"null, a primitive type name, or a class type","Set constructor: type");this.gd={};this.fd=0;this.Xb=null;this.F=0;this.Fh=this.Da=null}v.ea("Set",J); +J.prototype.Bc=function(){var a=this.F;a++;999999999<a&&(a=0);this.F=a};J.prototype.freeze=J.prototype.freeze=function(){this.D=!0;return this};J.prototype.thaw=J.prototype.Oa=function(){this.D=!1;return this};J.prototype.toString=function(){return"Set("+v.getTypeName(this.ia)+")#"+v.ld(this)}; +J.prototype.add=J.prototype.add=function(a){if(null===a)return!1;this.D&&v.ka(this,a);var b=a;v.Ta(a)&&(b=v.ot(a));return void 0===this.gd[b]?(this.fd++,a=new Ea(a,a),this.gd[b]=a,b=this.Fh,null===b?this.Da=a:(a.lo=b,b.Ua=a),this.Fh=a,this.Bc(),!0):!1};J.prototype.addAll=J.prototype.Tc=function(a){if(null===a)return this;this.D&&v.ka(this);if(v.isArray(a))for(var b=v.Va(a),c=0;c<b;c++)this.add(v.Qa(a,c));else for(a=a.i;a.next();)this.add(a.value);return this}; +J.prototype.contains=J.prototype.has=J.prototype.contains=function(a){if(null===a)return!1;var b=a;return v.Ta(a)&&(b=v.ld(a),void 0===b)?!1:void 0!==this.gd[b]};J.prototype.containsAll=function(a){if(null===a)return!0;for(a=a.i;a.next();)if(!this.contains(a.value))return!1;return!0};J.prototype.containsAny=function(a){if(null===a)return!0;for(a=a.i;a.next();)if(this.contains(a.value))return!0;return!1};J.prototype.first=J.prototype.first=function(){var a=this.Da;return null===a?null:a.value}; +J.prototype.any=function(a){for(var b=this.F,c=this.Da;null!==c;){if(a(c.value))return!0;this.F!==b&&v.La(this);c=c.Ua}return!1};J.prototype.all=function(a){for(var b=this.F,c=this.Da;null!==c;){if(!a(c.value))return!1;this.F!==b&&v.La(this);c=c.Ua}return!0};J.prototype.each=function(a){for(var b=this.F,c=this.Da;null!==c;)a(c.value),this.F!==b&&v.La(this),c=c.Ua;return this};J.prototype.map=function(a){for(var b=new J,c=this.F,d=this.Da;null!==d;)b.add(a(d.value)),this.F!==c&&v.La(this),d=d.Ua;return b}; +J.prototype.filter=function(a){for(var b=new J(this.ia),c=this.F,d=this.Da;null!==d;){var e=d.value;a(e)&&b.add(e);this.F!==c&&v.La(this);d=d.Ua}return b};J.prototype.concat=function(a){return this.copy().Tc(a)}; +J.prototype.remove=J.prototype["delete"]=J.prototype.remove=function(a){if(null===a)return!1;this.D&&v.ka(this,a);var b=a;if(v.Ta(a)&&(b=v.ld(a),void 0===b))return!1;a=this.gd[b];if(void 0===a)return!1;var c=a.Ua,d=a.lo;null!==c&&(c.lo=d);null!==d&&(d.Ua=c);this.Da===a&&(this.Da=c);this.Fh===a&&(this.Fh=d);delete this.gd[b];this.fd--;this.Bc();return!0}; +J.prototype.removeAll=J.prototype.eA=function(a){if(null===a)return this;this.D&&v.ka(this);if(v.isArray(a))for(var b=v.Va(a),c=0;c<b;c++)this.remove(v.Qa(a,c));else for(a=a.i;a.next();)this.remove(a.value);return this};J.prototype.retainAll=function(a){if(null===a||0===this.count)return this;this.D&&v.ka(this);var b=new J(this.ia);b.Tc(a);a=[];for(var c=this.i;c.next();){var d=c.value;b.contains(d)||a.push(d)}this.eA(a);return this}; +J.prototype.clear=J.prototype.clear=function(){this.D&&v.ka(this);this.gd={};this.fd=0;this.Fh=this.Da=null;this.Bc()};J.prototype.copy=function(){var a=new J(this.ia),b=this.gd,c;for(c in b)a.add(b[c].value);return a};J.prototype.toArray=J.prototype.cc=function(){var a=Array(this.fd),b=this.gd,c=0,d;for(d in b)a[c]=b[d].value,c++;return a};J.prototype.toList=function(){var a=new I(this.ia),b=this.gd,c;for(c in b)a.add(b[c].value);return a};v.u(J,{count:"count"},function(){return this.fd}); +v.u(J,{size:"size"},function(){return this.fd});v.u(J,{i:"iterator"},function(){if(0>=this.fd)return xa;var a=this.Xb;return null!==a?(a.reset(),a):new Da(this)});function Ha(a){this.Ga=a;this.reset()}v.Kd(Ha,{key:!0,value:!0});v.u(Ha,{i:"iterator"},function(){return this});Ha.prototype.reset=Ha.prototype.reset=function(){this.eb=this.Ga.F;this.cb=null}; +Ha.prototype.next=Ha.prototype.hasNext=Ha.prototype.next=function(){var a=this.Ga;if(a.F!==this.eb){if(null===this.key)return!1;v.La(a)}var b=this.cb,b=null===b?a.Da:b.Ua;if(null!==b)return this.cb=b,this.value=this.key=a=b.key,!0;this.Cf();return!1};Ha.prototype.first=Ha.prototype.first=function(){var a=this.Ga;this.eb=a.F;a=a.Da;return null!==a?(this.cb=a,this.value=this.key=a=a.key):null}; +Ha.prototype.any=function(a){var b=this.Ga,c=b.F;this.cb=null;for(var d=b.Da;null!==d;){if(a(d.key))return!0;b.F!==c&&v.La(b);d=d.Ua}return!1};Ha.prototype.all=function(a){var b=this.Ga,c=b.F;this.cb=null;for(var d=b.Da;null!==d;){if(!a(d.key))return!1;b.F!==c&&v.La(b);d=d.Ua}return!0};Ha.prototype.each=function(a){var b=this.Ga,c=b.F;this.cb=null;for(var d=b.Da;null!==d;)a(d.key),b.F!==c&&v.La(b),d=d.Ua;return this}; +Ha.prototype.map=function(a){var b=this.Ga,c=b.F;this.cb=null;for(var d=new I,e=b.Da;null!==e;)d.add(a(e.key)),b.F!==c&&v.La(b),e=e.Ua;return d.i};Ha.prototype.filter=function(a){var b=this.Ga,c=b.F;this.cb=null;for(var d=new I(b.vi),e=b.Da;null!==e;){var f=e.key;a(f)&&d.add(f);b.F!==c&&v.La(b);e=e.Ua}return d.i};Ha.prototype.concat=function(a){return new za(this,a.i)};v.u(Ha,{count:"count"},function(){return this.Ga.fd});Ha.prototype.Cf=function(){this.value=this.key=null;this.eb=-1}; +Ha.prototype.toString=function(){return null!==this.cb?"MapKeySetIterator@"+this.cb.value:"MapKeySetIterator"};function Ja(a){v.dc(this);this.D=!0;this.Ga=a}v.Ja(Ja,J);Ja.prototype.freeze=function(){return this};Ja.prototype.Oa=function(){return this};Ja.prototype.toString=function(){return"MapKeySet("+this.Ga.toString()+")"};Ja.prototype.add=Ja.prototype.set=Ja.prototype.add=function(){v.k("This Set is read-only: "+this.toString());return!1}; +Ja.prototype.contains=Ja.prototype.has=Ja.prototype.contains=function(a){return this.Ga.contains(a)};Ja.prototype.remove=Ja.prototype["delete"]=Ja.prototype.remove=function(){v.k("This Set is read-only: "+this.toString());return!1};Ja.prototype.clear=Ja.prototype.clear=function(){v.k("This Set is read-only: "+this.toString())};Ja.prototype.first=Ja.prototype.first=function(){var a=this.Ga.Da;return null!==a?a.key:null}; +Ja.prototype.any=function(a){for(var b=this.Ga.Da;null!==b;){if(a(b.key))return!0;b=b.Ua}return!1};Ja.prototype.all=function(a){for(var b=this.Ga.Da;null!==b;){if(!a(b.key))return!1;b=b.Ua}return!0};Ja.prototype.each=function(a){for(var b=this.Ga.Da;null!==b;)a(b.key),b=b.Ua;return this};Ja.prototype.map=function(a){for(var b=new J,c=this.Ga.Da;null!==c;)b.add(a(c.key)),c=c.Ua;return b}; +Ja.prototype.filter=function(a){for(var b=new J(this.Ga.vi),c=this.Ga.Da;null!==c;){var d=c.key;a(d)&&b.add(d);c=c.Ua}return b};Ja.prototype.concat=function(a){return this.hF().Tc(a)};Ja.prototype.copy=function(){return new Ja(this.Ga)};Ja.prototype.toSet=Ja.prototype.hF=function(){var a=new J(this.Ga.vi),b=this.Ga.gd,c;for(c in b)a.add(b[c].key);return a};Ja.prototype.toArray=Ja.prototype.cc=function(){var a=this.Ga.gd,b=Array(this.Ga.fd),c=0,d;for(d in a)b[c]=a[d].key,c++;return b}; +Ja.prototype.toList=function(){var a=new I(this.ia),b=this.Ga.gd,c;for(c in b)a.add(b[c].key);return a};v.u(Ja,{count:"count"},function(){return this.Ga.fd});v.u(Ja,{size:"size"},function(){return this.Ga.fd});v.u(Ja,{i:"iterator"},function(){return 0>=this.Ga.fd?xa:new Ha(this.Ga)});function La(a){this.Ga=a;this.reset()}v.Kd(La,{key:!0,value:!0});v.u(La,{i:"iterator"},function(){return this});La.prototype.reset=La.prototype.reset=function(){var a=this.Ga;a.xj=null;this.eb=a.F;this.cb=null}; +La.prototype.next=La.prototype.hasNext=La.prototype.next=function(){var a=this.Ga;if(a.F!==this.eb){if(null===this.key)return!1;v.La(a)}var b=this.cb,b=null===b?a.Da:b.Ua;if(null!==b)return this.cb=b,this.value=b.value,this.key=b.key,!0;this.Cf();return!1};La.prototype.first=La.prototype.first=function(){var a=this.Ga;this.eb=a.F;a=a.Da;if(null!==a){this.cb=a;var b=a.value;this.key=a.key;return this.value=b}return null}; +La.prototype.any=function(a){var b=this.Ga;b.xj=null;var c=b.F;this.cb=null;for(var d=b.Da;null!==d;){if(a(d.value))return!0;b.F!==c&&v.La(b);d=d.Ua}return!1};La.prototype.all=function(a){var b=this.Ga;b.xj=null;var c=b.F;this.cb=null;for(var d=b.Da;null!==d;){if(!a(d.value))return!1;b.F!==c&&v.La(b);d=d.Ua}return!0};La.prototype.each=function(a){var b=this.Ga;b.xj=null;var c=b.F;this.cb=null;for(var d=b.Da;null!==d;)a(d.value),b.F!==c&&v.La(b),d=d.Ua;return this}; +La.prototype.map=function(a){var b=this.Ga;b.xj=null;var c=b.F;this.cb=null;for(var d=new I,e=b.Da;null!==e;)d.add(a(e.value)),b.F!==c&&v.La(b),e=e.Ua;return d.i};La.prototype.filter=function(a){var b=this.Ga;b.xj=null;var c=b.F;this.cb=null;for(var d=new I(b.vi),e=b.Da;null!==e;){var f=e.value;a(f)&&d.add(f);b.F!==c&&v.La(b);e=e.Ua}return d.i};La.prototype.concat=function(a){this.Ga.xj=null;return new za(this,a.i)};v.u(La,{count:"count"},function(){return this.Ga.fd}); +La.prototype.Cf=function(){this.value=this.key=null;this.eb=-1;this.Ga.xj=this};La.prototype.toString=function(){return null!==this.cb?"MapValueSetIterator@"+this.cb.value:"MapValueSetIterator"};function Ea(a,b){this.key=a;this.value=b;this.lo=this.Ua=null}v.Kd(Ea,{key:!0,value:!0});Ea.prototype.toString=function(){return"{"+this.key+":"+this.value+"}"};function Ma(a){this.Ga=a;this.reset()}v.Kd(Ma,{key:!0,value:!0});v.u(Ma,{i:"iterator"},function(){return this}); +Ma.prototype.reset=Ma.prototype.reset=function(){var a=this.Ga;a.Xb=null;this.eb=a.F;this.cb=null};Ma.prototype.next=Ma.prototype.hasNext=Ma.prototype.next=function(){var a=this.Ga;if(a.F!==this.eb){if(null===this.key)return!1;v.La(a)}var b=this.cb,b=null===b?a.Da:b.Ua;if(null!==b)return this.cb=b,this.key=b.key,this.value=b.value,!0;this.Cf();return!1}; +Ma.prototype.first=Ma.prototype.first=function(){var a=this.Ga;this.eb=a.F;a=a.Da;return null!==a?(this.cb=a,this.key=a.key,this.value=a.value,a):null};Ma.prototype.any=function(a){var b=this.Ga;b.Xb=null;var c=b.F;this.cb=null;for(var d=b.Da;null!==d;){if(a(d))return!0;b.F!==c&&v.La(b);d=d.Ua}return!1};Ma.prototype.all=function(a){var b=this.Ga;b.Xb=null;var c=b.F;this.cb=null;for(var d=b.Da;null!==d;){if(!a(d))return!1;b.F!==c&&v.La(b);d=d.Ua}return!0}; +Ma.prototype.each=function(a){var b=this.Ga;b.Xb=null;var c=b.F;this.cb=null;for(var d=b.Da;null!==d;)a(d),b.F!==c&&v.La(b),d=d.Ua;return this};Ma.prototype.map=function(a){var b=this.Ga;b.Xb=null;var c=b.F;this.cb=null;for(var d=new I,e=b.Da;null!==e;)d.add(a(e)),b.F!==c&&v.La(b),e=e.Ua;return d.i};Ma.prototype.filter=function(a){var b=this.Ga;b.Xb=null;var c=b.F;this.cb=null;for(var d=new I,e=b.Da;null!==e;)a(e)&&d.add(e),b.F!==c&&v.La(b),e=e.Ua;return d.i}; +Ma.prototype.concat=function(a){this.Ga.Xb=null;return new za(this,a.i)};v.u(Ma,{count:"count"},function(){return this.Ga.fd});Ma.prototype.Cf=function(){this.value=this.key=null;this.eb=-1;this.Ga.Xb=this};Ma.prototype.toString=function(){return null!==this.cb?"MapIterator@"+this.cb:"MapIterator"}; +function na(a,b){v.dc(this);this.D=!1;void 0===a||null===a?this.vi=null:"string"===typeof a?"object"===a||"string"===a||"number"===a?this.vi=a:v.va(a,"the string 'object', 'number' or 'string'","Map constructor: keytype"):"function"===typeof a?this.vi=a===Object?"object":a===String?"string":a===Number?"number":a:v.va(a,"null, a primitive type name, or a class type","Map constructor: keytype");void 0===b||null===b?this.Hs=null:"string"===typeof b?"object"===b||"string"===b||"boolean"===b||"number"=== +b||"function"===b?this.Hs=b:v.va(b,"the string 'object', 'number', 'string', 'boolean', or 'function'","Map constructor: valtype"):"function"===typeof b?this.Hs=b===Object?"object":b===String?"string":b===Number?"number":b===Boolean?"boolean":b===Function?"function":b:v.va(b,"null, a primitive type name, or a class type","Map constructor: valtype");this.gd={};this.fd=0;this.xj=this.Xb=null;this.F=0;this.Fh=this.Da=null}v.ea("Map",na); +na.prototype.Bc=function(){var a=this.F;a++;999999999<a&&(a=0);this.F=a};na.prototype.freeze=na.prototype.freeze=function(){this.D=!0;return this};na.prototype.thaw=na.prototype.Oa=function(){this.D=!1;return this};na.prototype.toString=function(){return"Map("+v.getTypeName(this.vi)+","+v.getTypeName(this.Hs)+")#"+v.ld(this)}; +na.prototype.add=na.prototype.set=na.prototype.add=function(a,b){this.D&&v.ka(this,a);var c=a;v.Ta(a)&&(c=v.ot(a));var d=this.gd[c];if(void 0===d)return this.fd++,d=new Ea(a,b),this.gd[c]=d,c=this.Fh,null===c?this.Da=d:(d.lo=c,c.Ua=d),this.Fh=d,this.Bc(),!0;d.value=b;return!1};na.prototype.addAll=na.prototype.Tc=function(a){if(null===a)return this;if(v.isArray(a))for(var b=v.Va(a),c=0;c<b;c++){var d=v.Qa(a,c);this.add(d.key,d.value)}else for(a=a.i;a.next();)this.add(a.key,a.value);return this}; +na.prototype.first=na.prototype.first=function(){return this.Da};na.prototype.any=function(a){for(var b=this.F,c=this.Da;null!==c;){if(a(c))return!0;this.F!==b&&v.La(this);c=c.Ua}return!1};na.prototype.all=function(a){for(var b=this.F,c=this.Da;null!==c;){if(!a(c))return!1;this.F!==b&&v.La(this);c=c.Ua}return!0};na.prototype.each=function(a){for(var b=this.F,c=this.Da;null!==c;)a(c),this.F!==b&&v.La(this),c=c.Ua;return this}; +na.prototype.map=function(a){for(var b=new na(this.vi),c=this.F,d=this.Da;null!==d;)b.add(d.key,a(d)),this.F!==c&&v.La(this),d=d.Ua;return b};na.prototype.filter=function(a){for(var b=new na(this.vi,this.Hs),c=this.F,d=this.Da;null!==d;)a(d)&&b.add(d.key,d.value),this.F!==c&&v.La(this),d=d.Ua;return b};na.prototype.concat=function(a){return this.copy().Tc(a)};na.prototype.contains=na.prototype.has=na.prototype.contains=function(a){var b=a;return v.Ta(a)&&(b=v.ld(a),void 0===b)?!1:void 0!==this.gd[b]}; +na.prototype.getValue=na.prototype.get=na.prototype.ja=function(a){var b=a;if(v.Ta(a)&&(b=v.ld(a),void 0===b))return null;a=this.gd[b];return void 0===a?null:a.value}; +na.prototype.remove=na.prototype["delete"]=na.prototype.remove=function(a){if(null===a)return!1;this.D&&v.ka(this,a);var b=a;if(v.Ta(a)&&(b=v.ld(a),void 0===b))return!1;a=this.gd[b];if(void 0===a)return!1;var c=a.Ua,d=a.lo;null!==c&&(c.lo=d);null!==d&&(d.Ua=c);this.Da===a&&(this.Da=c);this.Fh===a&&(this.Fh=d);delete this.gd[b];this.fd--;this.Bc();return!0};na.prototype.clear=na.prototype.clear=function(){this.D&&v.ka(this);this.gd={};this.fd=0;this.Fh=this.Da=null;this.Bc()}; +na.prototype.copy=function(){var a=new na(this.vi,this.Hs),b=this.gd,c;for(c in b){var d=b[c];a.add(d.key,d.value)}return a};na.prototype.toArray=na.prototype.cc=function(){var a=this.gd,b=Array(this.fd),c=0,d;for(d in a){var e=a[d];b[c]=new Ea(e.key,e.value);c++}return b};na.prototype.toKeySet=na.prototype.ej=function(){return new Ja(this)};v.u(na,{count:"count"},function(){return this.fd});v.u(na,{size:"size"},function(){return this.fd}); +v.u(na,{i:"iterator"},function(){if(0>=this.count)return xa;var a=this.Xb;return null!==a?(a.reset(),a):new Ma(this)});v.u(na,{nE:"iteratorKeys"},function(){return 0>=this.count?xa:new Ha(this)});v.u(na,{oE:"iteratorValues"},function(){if(0>=this.count)return xa;var a=this.xj;return null!==a?(a.reset(),a):new La(this)});function z(a,b){void 0===a?this.y=this.x=0:(this.x=a,this.y=b);this.D=!1}v.ea("Point",z);v.Vh(z);v.Kd(z,{x:!0,y:!0});z.prototype.assign=function(a){this.x=a.x;this.y=a.y}; +z.prototype.setTo=z.prototype.m=function(a,b){this.x=a;this.y=b;return this};z.prototype.set=z.prototype.set=function(a){this.Cb();this.x=a.x;this.y=a.y;return this};z.prototype.copy=function(){var a=new z;a.x=this.x;a.y=this.y;return a};g=z.prototype;g.Ea=function(){this.D=!0;Object.freeze(this);return this};g.S=function(){return Object.isFrozen(this)?this:this.copy().freeze()};g.freeze=function(){this.D=!0;return this}; +g.Oa=function(){Object.isFrozen(this)&&v.k("cannot thaw constant: "+this);this.D=!1;return this};g.Cb=function(a){if(this.D){var b="The Point is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);v.k(b)}};z.parse=function(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=0;""===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));for(var e=0;""===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));return new z(c,e)}return new z}; +z.stringify=function(a){return a instanceof z?a.x.toString()+" "+a.y.toString():a.toString()};z.prototype.toString=function(){return"Point("+this.x+","+this.y+")"};z.prototype.equals=z.prototype.K=function(a){return a instanceof z?this.x===a.x&&this.y===a.y:!1};z.prototype.equalTo=z.prototype.yw=function(a,b){return this.x===a&&this.y===b};z.prototype.equalsApprox=z.prototype.Fc=function(a){return K(this.x,a.x)&&K(this.y,a.y)}; +z.prototype.add=z.prototype.add=function(a){this.Cb();this.x+=a.x;this.y+=a.y;return this};z.prototype.subtract=z.prototype.du=function(a){this.Cb();this.x-=a.x;this.y-=a.y;return this};z.prototype.offset=z.prototype.offset=function(a,b){this.Cb();this.x+=a;this.y+=b;return this}; +z.prototype.rotate=z.prototype.rotate=function(a){this.Cb();if(0===a)return this;var b=this.x,c=this.y;if(0===b&&0===c)return this;var d=0,e=0;360<=a?a-=360:0>a&&(a+=360);90===a?(d=0,e=1):180===a?(d=-1,e=0):270===a?(d=0,e=-1):(a=a*Math.PI/180,d=Math.cos(a),e=Math.sin(a));this.x=d*b-e*c;this.y=e*b+d*c;return this};z.prototype.scale=z.prototype.scale=function(a,b){this.x*=a;this.y*=b;return this}; +z.prototype.distanceSquaredPoint=z.prototype.rf=function(a){var b=a.x-this.x;a=a.y-this.y;return b*b+a*a};z.prototype.distanceSquared=z.prototype.Ro=function(a,b){var c=a-this.x,d=b-this.y;return c*c+d*d};z.prototype.normalize=z.prototype.normalize=function(){this.Cb();var a=this.x,b=this.y,c=Math.sqrt(a*a+b*b);0<c&&(this.x=a/c,this.y=b/c);return this};z.prototype.directionPoint=z.prototype.xc=function(a){return Na(a.x-this.x,a.y-this.y)}; +z.prototype.direction=z.prototype.direction=function(a,b){return Na(a-this.x,b-this.y)};function Na(a,b){if(0===a)return 0<b?90:0>b?270:0;if(0===b)return 0<a?0:180;if(isNaN(a)||isNaN(b))return 0;var c=180*Math.atan(Math.abs(b/a))/Math.PI;0>a?c=0>b?c+180:180-c:0>b&&(c=360-c);return c}z.prototype.projectOntoLineSegment=function(a,b,c,d){Oa(a,b,c,d,this.x,this.y,this);return this};z.prototype.projectOntoLineSegmentPoint=function(a,b){Oa(a.x,a.y,b.x,b.y,this.x,this.y,this);return this}; +z.prototype.snapToGrid=function(a,b,c,d){Pa(this.x,this.y,a,b,c,d,this);return this};z.prototype.snapToGridPoint=function(a,b){Pa(this.x,this.y,a.x,a.y,b.width,b.height,this);return this};z.prototype.setRectSpot=z.prototype.Yt=function(a,b){this.Cb();this.x=a.x+b.x*a.width+b.offsetX;this.y=a.y+b.y*a.height+b.offsetY;return this};z.prototype.setSpot=z.prototype.$t=function(a,b,c,d,e){this.Cb();this.x=a+e.x*c+e.offsetX;this.y=b+e.y*d+e.offsetY;return this}; +z.prototype.transform=function(a){a.ub(this);return this};function Qa(a,b){b.Xh(a);return a}var Sa;z.distanceLineSegmentSquared=Sa=function(a,b,c,d,e,f){var h=e-c,k=f-d,l=h*h+k*k;c-=a;d-=b;var m=-c*h-d*k;if(0>=m||m>=l)return h=e-a,k=f-b,Math.min(c*c+d*d,h*h+k*k);a=h*d-k*c;return a*a/l};var Ta;z.distanceSquared=Ta=function(a,b,c,d){a=c-a;b=d-b;return a*a+b*b};var Va; +z.direction=Va=function(a,b,c,d){a=c-a;b=d-b;if(0===a)return 0<b?90:0>b?270:0;if(0===b)return 0<a?0:180;if(isNaN(a)||isNaN(b))return 0;d=180*Math.atan(Math.abs(b/a))/Math.PI;0>a?d=0>b?d+180:180-d:0>b&&(d=360-d);return d};z.prototype.isReal=z.prototype.G=function(){return isFinite(this.x)&&isFinite(this.y)};function ia(a,b){void 0===a?this.height=this.width=0:(this.width=a,this.height=b);this.D=!1}v.ea("Size",ia);v.Vh(ia);v.Kd(ia,{width:!0,height:!0}); +ia.prototype.assign=function(a){this.width=a.width;this.height=a.height};ia.prototype.setTo=ia.prototype.m=function(a,b){this.width=a;this.height=b;return this};ia.prototype.set=ia.prototype.set=function(a){this.Cb();this.width=a.width;this.height=a.height;return this};ia.prototype.copy=function(){var a=new ia;a.width=this.width;a.height=this.height;return a};g=ia.prototype;g.Ea=function(){this.D=!0;Object.freeze(this);return this};g.S=function(){return Object.isFrozen(this)?this:this.copy().freeze()}; +g.freeze=function(){this.D=!0;return this};g.Oa=function(){Object.isFrozen(this)&&v.k("cannot thaw constant: "+this);this.D=!1;return this};g.Cb=function(a){if(this.D){var b="The Size is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);v.k(b)}};ia.parse=function(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=0;""===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));for(var e=0;""===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));return new ia(c,e)}return new ia}; +ia.stringify=function(a){return a instanceof ia?a.width.toString()+" "+a.height.toString():a.toString()};ia.prototype.toString=function(){return"Size("+this.width+","+this.height+")"};ia.prototype.equals=ia.prototype.K=function(a){return a instanceof ia?this.width===a.width&&this.height===a.height:!1};ia.prototype.equalTo=ia.prototype.yw=function(a,b){return this.width===a&&this.height===b};ia.prototype.equalsApprox=ia.prototype.Fc=function(a){return K(this.width,a.width)&&K(this.height,a.height)}; +ia.prototype.isReal=ia.prototype.G=function(){return isFinite(this.width)&&isFinite(this.height)}; +function A(a,b,c,d){void 0===a?this.height=this.width=this.y=this.x=0:a instanceof z?b instanceof z?(this.x=Math.min(a.x,b.x),this.y=Math.min(a.y,b.y),this.width=Math.abs(a.x-b.x),this.height=Math.abs(a.y-b.y)):b instanceof ia?(this.x=a.x,this.y=a.y,this.width=b.width,this.height=b.height):v.k("Incorrect arguments supplied to Rect constructor"):(this.x=a,this.y=b,this.width=c,this.height=d);this.D=!1}v.ea("Rect",A);v.Vh(A);v.Kd(A,{x:!0,y:!0,width:!0,height:!0}); +A.prototype.assign=function(a){this.x=a.x;this.y=a.y;this.width=a.width;this.height=a.height};function Wa(a,b,c){a.width=b;a.height=c}A.prototype.setTo=A.prototype.m=function(a,b,c,d){this.x=a;this.y=b;this.width=c;this.height=d;return this};A.prototype.set=A.prototype.set=function(a){this.Cb();this.x=a.x;this.y=a.y;this.width=a.width;this.height=a.height;return this};A.prototype.setPoint=A.prototype.zf=function(a){this.Cb();this.x=a.x;this.y=a.y;return this}; +A.prototype.setSize=function(a){this.Cb();this.width=a.width;this.height=a.height;return this};A.prototype.copy=function(){var a=new A;a.x=this.x;a.y=this.y;a.width=this.width;a.height=this.height;return a};g=A.prototype;g.Ea=function(){this.D=!0;Object.freeze(this);return this};g.S=function(){return Object.isFrozen(this)?this:this.copy().freeze()};g.freeze=function(){this.D=!0;return this};g.Oa=function(){Object.isFrozen(this)&&v.k("cannot thaw constant: "+this);this.D=!1;return this}; +g.Cb=function(a){if(this.D){var b="The Rect is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);v.k(b)}};A.parse=function(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=0;""===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));for(var e=0;""===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));for(var f=0;""===a[b];)b++;(d=a[b++])&&(f=parseFloat(d));for(var h=0;""===a[b];)b++;(d=a[b++])&&(h=parseFloat(d));return new A(c,e,f,h)}return new A}; +A.stringify=function(a){return a instanceof A?a.x.toString()+" "+a.y.toString()+" "+a.width.toString()+" "+a.height.toString():a.toString()};A.prototype.toString=function(){return"Rect("+this.x+","+this.y+","+this.width+","+this.height+")"};A.prototype.equals=A.prototype.K=function(a){return a instanceof A?this.x===a.x&&this.y===a.y&&this.width===a.width&&this.height===a.height:!1};A.prototype.equalTo=A.prototype.yw=function(a,b,c,d){return this.x===a&&this.y===b&&this.width===c&&this.height===d}; +A.prototype.equalsApprox=A.prototype.Fc=function(a){return K(this.x,a.x)&&K(this.y,a.y)&&K(this.width,a.width)&&K(this.height,a.height)};A.prototype.containsPoint=A.prototype.Fa=function(a){return this.x<=a.x&&this.x+this.width>=a.x&&this.y<=a.y&&this.y+this.height>=a.y};A.prototype.containsRect=A.prototype.Xj=function(a){return this.x<=a.x&&a.x+a.width<=this.x+this.width&&this.y<=a.y&&a.y+a.height<=this.y+this.height}; +A.prototype.contains=A.prototype.contains=function(a,b,c,d){void 0===c&&(c=0);void 0===d&&(d=0);return this.x<=a&&a+c<=this.x+this.width&&this.y<=b&&b+d<=this.y+this.height};A.prototype.reset=function(){this.Cb();this.height=this.width=this.y=this.x=0};A.prototype.offset=A.prototype.offset=function(a,b){this.Cb();this.x+=a;this.y+=b;return this};A.prototype.inflate=A.prototype.Qf=function(a,b){return Xa(this,b,a,b,a)}; +A.prototype.addMargin=A.prototype.fw=function(a){return Xa(this,a.top,a.right,a.bottom,a.left)};A.prototype.subtractMargin=A.prototype.FI=function(a){return Xa(this,-a.top,-a.right,-a.bottom,-a.left)};A.prototype.grow=function(a,b,c,d){return Xa(this,a,b,c,d)};function Xa(a,b,c,d,e){a.Cb();var f=a.width;c+e<=-f?(a.x+=f/2,a.width=0):(a.x-=e,a.width+=c+e);c=a.height;b+d<=-c?(a.y+=c/2,a.height=0):(a.y-=b,a.height+=b+d);return a}A.prototype.intersectRect=function(a){return Ya(this,a.x,a.y,a.width,a.height)}; +A.prototype.intersect=function(a,b,c,d){return Ya(this,a,b,c,d)};function Ya(a,b,c,d,e){a.Cb();var f=Math.max(a.x,b),h=Math.max(a.y,c);b=Math.min(a.x+a.width,b+d);c=Math.min(a.y+a.height,c+e);a.x=f;a.y=h;a.width=Math.max(0,b-f);a.height=Math.max(0,c-h);return a}A.prototype.intersectsRect=A.prototype.yg=function(a){return this.YD(a.x,a.y,a.width,a.height)}; +A.prototype.intersects=A.prototype.YD=function(a,b,c,d){var e=this.width,f=this.x;if(Infinity!==e&&Infinity!==c&&(e+=f,c+=a,isNaN(c)||isNaN(e)||f>c||a>e))return!1;a=this.height;c=this.y;return Infinity!==a&&Infinity!==d&&(a+=c,d+=b,isNaN(d)||isNaN(a)||c>d||b>a)?!1:!0};function Za(a,b){var c=a.width,d=b.width+10+10,e=a.x,f=b.x-10;if(e>d+f||f>c+e)return!1;c=a.height;d=b.height+10+10;e=a.y;f=b.y-10;return e>d+f||f>c+e?!1:!0}A.prototype.unionPoint=A.prototype.fj=function(a){return $a(this,a.x,a.y,0,0)}; +A.prototype.unionRect=A.prototype.bi=function(a){return $a(this,a.x,a.y,a.width,a.height)};A.prototype.union=A.prototype.qF=function(a,b,c,d){this.Cb();void 0===c&&(c=0);void 0===d&&(d=0);return $a(this,a,b,c,d)};function $a(a,b,c,d,e){var f=Math.min(a.x,b),h=Math.min(a.y,c);b=Math.max(a.x+a.width,b+d);c=Math.max(a.y+a.height,c+e);a.x=f;a.y=h;a.width=b-f;a.height=c-h;return a} +A.prototype.setSpot=A.prototype.$t=function(a,b,c){this.Cb();this.x=a-c.offsetX-c.x*this.width;this.y=b-c.offsetY-c.y*this.height;return this};var bb;A.contains=bb=function(a,b,c,d,e,f,h,k){void 0===h&&(h=0);void 0===k&&(k=0);return a<=e&&e+h<=a+c&&b<=f&&f+k<=b+d};A.intersects=function(a,b,c,d,e,f,h,k){c+=a;h+=e;if(a>h||e>c)return!1;a=d+b;k+=f;return b>k||f>a?!1:!0};v.defineProperty(A,{left:"left"},function(){return this.x},function(a){this.Cb(a);this.x=a}); +v.defineProperty(A,{top:"top"},function(){return this.y},function(a){this.Cb(a);this.y=a});v.defineProperty(A,{right:"right"},function(){return this.x+this.width},function(a){this.Cb(a);this.x+=a-(this.x+this.width)});v.defineProperty(A,{bottom:"bottom"},function(){return this.y+this.height},function(a){this.Cb(a);this.y+=a-(this.y+this.height)});v.defineProperty(A,{position:"position"},function(){return new z(this.x,this.y)},function(a){this.Cb(a);this.x=a.x;this.y=a.y}); +v.defineProperty(A,{size:"size"},function(){return new ia(this.width,this.height)},function(a){this.Cb(a);this.width=a.width;this.height=a.height});v.defineProperty(A,{dl:"center"},function(){return new z(this.x+this.width/2,this.y+this.height/2)},function(a){this.Cb(a);this.x=a.x-this.width/2;this.y=a.y-this.height/2});v.defineProperty(A,{na:"centerX"},function(){return this.x+this.width/2},function(a){this.Cb(a);this.x=a-this.width/2}); +v.defineProperty(A,{ua:"centerY"},function(){return this.y+this.height/2},function(a){this.Cb(a);this.y=a-this.height/2});A.prototype.isReal=A.prototype.G=function(){return isFinite(this.x)&&isFinite(this.y)&&isFinite(this.width)&&isFinite(this.height)};A.prototype.isEmpty=function(){return 0===this.width&&0===this.height}; +function cb(a,b,c,d){void 0===a?this.left=this.bottom=this.right=this.top=0:void 0===b?this.left=this.bottom=this.right=this.top=a:void 0===c?(d=b,this.top=a,this.right=b,this.bottom=a,this.left=d):void 0!==d?(this.top=a,this.right=b,this.bottom=c,this.left=d):v.k("Invalid arguments to Margin constructor");this.D=!1}v.ea("Margin",cb);v.Vh(cb);v.Kd(cb,{top:!0,right:!0,bottom:!0,left:!0});cb.prototype.assign=function(a){this.top=a.top;this.right=a.right;this.bottom=a.bottom;this.left=a.left}; +cb.prototype.setTo=cb.prototype.m=function(a,b,c,d){this.Cb();this.top=a;this.right=b;this.bottom=c;this.left=d;return this};cb.prototype.set=cb.prototype.set=function(a){this.Cb();this.top=a.top;this.right=a.right;this.bottom=a.bottom;this.left=a.left;return this};cb.prototype.copy=function(){var a=new cb;a.top=this.top;a.right=this.right;a.bottom=this.bottom;a.left=this.left;return a};g=cb.prototype;g.Ea=function(){this.D=!0;Object.freeze(this);return this}; +g.S=function(){return Object.isFrozen(this)?this:this.copy().freeze()};g.freeze=function(){this.D=!0;return this};g.Oa=function(){Object.isFrozen(this)&&v.k("cannot thaw constant: "+this);this.D=!1;return this};g.Cb=function(a){if(this.D){var b="The Margin is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);v.k(b)}}; +cb.parse=function(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=NaN;""===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));if(isNaN(c))return new cb;for(var e=NaN;""===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));if(isNaN(e))return new cb(c);for(var f=NaN;""===a[b];)b++;(d=a[b++])&&(f=parseFloat(d));if(isNaN(f))return new cb(c,e);for(var h=NaN;""===a[b];)b++;(d=a[b++])&&(h=parseFloat(d));return isNaN(h)?new cb(c,e):new cb(c,e,f,h)}return new cb}; +cb.stringify=function(a){return a instanceof cb?a.top.toString()+" "+a.right.toString()+" "+a.bottom.toString()+" "+a.left.toString():a.toString()};cb.prototype.toString=function(){return"Margin("+this.top+","+this.right+","+this.bottom+","+this.left+")"};cb.prototype.equals=cb.prototype.K=function(a){return a instanceof cb?this.top===a.top&&this.right===a.right&&this.bottom===a.bottom&&this.left===a.left:!1}; +cb.prototype.equalTo=cb.prototype.yw=function(a,b,c,d){return this.top===a&&this.right===b&&this.bottom===c&&this.left===d};cb.prototype.equalsApprox=cb.prototype.Fc=function(a){return K(this.top,a.top)&&K(this.right,a.right)&&K(this.bottom,a.bottom)&&K(this.left,a.left)};cb.prototype.isReal=cb.prototype.G=function(){return isFinite(this.top)&&isFinite(this.right)&&isFinite(this.bottom)&&isFinite(this.left)};function ja(){this.m11=1;this.m21=this.m12=0;this.m22=1;this.dy=this.dx=0}v.Vh(ja); +v.Kd(ja,{m11:!0,m12:!0,m21:!0,m22:!0,dx:!0,dy:!0});ja.prototype.set=ja.prototype.set=function(a){this.m11=a.m11;this.m12=a.m12;this.m21=a.m21;this.m22=a.m22;this.dx=a.dx;this.dy=a.dy;return this};ja.prototype.copy=function(){var a=new ja;a.m11=this.m11;a.m12=this.m12;a.m21=this.m21;a.m22=this.m22;a.dx=this.dx;a.dy=this.dy;return a};ja.prototype.toString=function(){return"Transform("+this.m11+","+this.m12+","+this.m21+","+this.m22+","+this.dx+","+this.dy+")"}; +ja.prototype.equals=ja.prototype.K=function(a){return a instanceof ja?this.m11===a.m11&&this.m12===a.m12&&this.m21===a.m21&&this.m22===a.m22&&this.dx===a.dx&&this.dy===a.dy:!1};ja.prototype.isIdentity=ja.prototype.vt=function(){return 1===this.m11&&0===this.m12&&0===this.m21&&1===this.m22&&0===this.dx&&0===this.dy};ja.prototype.reset=ja.prototype.reset=function(){this.m11=1;this.m21=this.m12=0;this.m22=1;this.dy=this.dx=0;return this}; +ja.prototype.multiply=ja.prototype.multiply=function(a){var b=this.m12*a.m11+this.m22*a.m12,c=this.m11*a.m21+this.m21*a.m22,d=this.m12*a.m21+this.m22*a.m22,e=this.m11*a.dx+this.m21*a.dy+this.dx,f=this.m12*a.dx+this.m22*a.dy+this.dy;this.m11=this.m11*a.m11+this.m21*a.m12;this.m12=b;this.m21=c;this.m22=d;this.dx=e;this.dy=f;return this}; +ja.prototype.multiplyInverted=ja.prototype.wE=function(a){var b=1/(a.m11*a.m22-a.m12*a.m21),c=a.m22*b,d=-a.m12*b,e=-a.m21*b,f=a.m11*b,h=b*(a.m21*a.dy-a.m22*a.dx),k=b*(a.m12*a.dx-a.m11*a.dy);a=this.m12*c+this.m22*d;b=this.m11*e+this.m21*f;e=this.m12*e+this.m22*f;f=this.m11*h+this.m21*k+this.dx;h=this.m12*h+this.m22*k+this.dy;this.m11=this.m11*c+this.m21*d;this.m12=a;this.m21=b;this.m22=e;this.dx=f;this.dy=h;return this}; +ja.prototype.invert=ja.prototype.Cz=function(){var a=1/(this.m11*this.m22-this.m12*this.m21),b=-this.m12*a,c=-this.m21*a,d=this.m11*a,e=a*(this.m21*this.dy-this.m22*this.dx),f=a*(this.m12*this.dx-this.m11*this.dy);this.m11=this.m22*a;this.m12=b;this.m21=c;this.m22=d;this.dx=e;this.dy=f;return this}; +ja.prototype.rotate=ja.prototype.rotate=function(a,b,c){360<=a?a-=360:0>a&&(a+=360);if(0===a)return this;this.translate(b,c);var d=0,e=0;90===a?(d=0,e=1):180===a?(d=-1,e=0):270===a?(d=0,e=-1):(e=a*Math.PI/180,d=Math.cos(e),e=Math.sin(e));a=this.m12*d+this.m22*e;var f=this.m11*-e+this.m21*d,h=this.m12*-e+this.m22*d;this.m11=this.m11*d+this.m21*e;this.m12=a;this.m21=f;this.m22=h;this.translate(-b,-c);return this}; +ja.prototype.translate=ja.prototype.translate=function(a,b){this.dx+=this.m11*a+this.m21*b;this.dy+=this.m12*a+this.m22*b;return this};ja.prototype.scale=ja.prototype.scale=function(a,b){void 0===b&&(b=a);this.m11*=a;this.m12*=a;this.m21*=b;this.m22*=b;return this};ja.prototype.transformPoint=ja.prototype.ub=function(a){var b=a.x,c=a.y;a.x=b*this.m11+c*this.m21+this.dx;a.y=b*this.m12+c*this.m22+this.dy;return a}; +ja.prototype.invertedTransformPoint=ja.prototype.Xh=function(a){var b=1/(this.m11*this.m22-this.m12*this.m21),c=-this.m12*b,d=this.m11*b,e=b*(this.m12*this.dx-this.m11*this.dy),f=a.x,h=a.y;a.x=f*this.m22*b+h*-this.m21*b+b*(this.m21*this.dy-this.m22*this.dx);a.y=f*c+h*d+e;return a}; +ja.prototype.transformRect=ja.prototype.oF=function(a){var b=a.x,c=a.y,d=b+a.width,e=c+a.height,f=this.m11,h=this.m12,k=this.m21,l=this.m22,m=this.dx,n=this.dy,p=b*f+c*k+m,q=b*h+c*l+n,r=d*f+c*k+m,c=d*h+c*l+n,s=b*f+e*k+m,b=b*h+e*l+n,f=d*f+e*k+m,d=d*h+e*l+n,e=p,h=q,p=Math.min(p,r),e=Math.max(e,r),h=Math.min(h,c),q=Math.max(q,c),p=Math.min(p,s),e=Math.max(e,s),h=Math.min(h,b),q=Math.max(q,b),p=Math.min(p,f),e=Math.max(e,f),h=Math.min(h,d),q=Math.max(q,d);a.x=p;a.y=h;a.width=e-p;a.height=q-h;return a}; +function L(a,b,c,d){void 0===a?this.offsetY=this.offsetX=this.y=this.x=0:(void 0===b&&(b=0),void 0===c&&(c=0),void 0===d&&(d=0),this.x=a,this.y=b,this.offsetX=c,this.offsetY=d);this.D=!1}v.ea("Spot",L);v.Vh(L);v.Kd(L,{x:!0,y:!0,offsetX:!0,offsetY:!0});L.prototype.assign=function(a){this.x=a.x;this.y=a.y;this.offsetX=a.offsetX;this.offsetY=a.offsetY};L.prototype.setTo=L.prototype.m=function(a,b,c,d){this.Cb();this.x=a;this.y=b;this.offsetX=c;this.offsetY=d;return this}; +L.prototype.set=L.prototype.set=function(a){this.Cb();this.x=a.x;this.y=a.y;this.offsetX=a.offsetX;this.offsetY=a.offsetY;return this};L.prototype.copy=function(){var a=new L;a.x=this.x;a.y=this.y;a.offsetX=this.offsetX;a.offsetY=this.offsetY;return a};g=L.prototype;g.Ea=function(){this.D=!0;Object.freeze(this);return this};g.S=function(){return Object.isFrozen(this)?this:this.copy().freeze()};g.freeze=function(){this.D=!0;return this}; +g.Oa=function(){Object.isFrozen(this)&&v.k("cannot thaw constant: "+this);this.D=!1;return this};g.Cb=function(a){if(this.D){var b="The Spot is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);v.k(b)}};function db(a,b){a.x=NaN;a.y=NaN;a.offsetX=b;return a}var gb; +L.parse=gb=function(a){if("string"===typeof a){a=a.trim();if("None"===a)return qb;if("TopLeft"===a)return rb;if("Top"===a||"TopCenter"===a||"MiddleTop"===a)return sb;if("TopRight"===a)return tb;if("Left"===a||"LeftCenter"===a||"MiddleLeft"===a)return ub;if("Center"===a)return zb;if("Right"===a||"RightCenter"===a||"MiddleRight"===a)return Ab;if("BottomLeft"===a)return Cb;if("Bottom"===a||"BottomCenter"===a||"MiddleBottom"===a)return Db;if("BottomRight"===a)return Eb;if("TopSide"===a)return Fb;if("LeftSide"=== +a)return Gb;if("RightSide"===a)return Nb;if("BottomSide"===a)return Ob;if("TopBottomSides"===a)return Pb;if("LeftRightSides"===a)return Tb;if("TopLeftSides"===a)return Ub;if("TopRightSides"===a)return Vb;if("BottomLeftSides"===a)return Zb;if("BottomRightSides"===a)return $b;if("NotTopSide"===a)return ac;if("NotLeftSide"===a)return bc;if("NotRightSide"===a)return cc;if("NotBottomSide"===a)return dc;if("AllSides"===a)return ec;if("Default"===a)return fc;a=a.split(" ");for(var b=0,c=0;""===a[b];)b++; +var d=a[b++];void 0!==d&&0<d.length&&(c=parseFloat(d));for(var e=0;""===a[b];)b++;d=a[b++];void 0!==d&&0<d.length&&(e=parseFloat(d));for(var f=0;""===a[b];)b++;d=a[b++];void 0!==d&&0<d.length&&(f=parseFloat(d));for(var h=0;""===a[b];)b++;d=a[b++];void 0!==d&&0<d.length&&(h=parseFloat(d));return new L(c,e,f,h)}return new L};L.stringify=function(a){return a instanceof L?a.bd()?a.x.toString()+" "+a.y.toString()+" "+a.offsetX.toString()+" "+a.offsetY.toString():a.toString():a.toString()}; +L.prototype.toString=function(){return this.bd()?0===this.offsetX&&0===this.offsetY?"Spot("+this.x+","+this.y+")":"Spot("+this.x+","+this.y+","+this.offsetX+","+this.offsetY+")":this.K(qb)?"None":this.K(rb)?"TopLeft":this.K(sb)?"Top":this.K(tb)?"TopRight":this.K(ub)?"Left":this.K(zb)?"Center":this.K(Ab)?"Right":this.K(Cb)?"BottomLeft":this.K(Db)?"Bottom":this.K(Eb)?"BottomRight":this.K(Fb)?"TopSide":this.K(Gb)?"LeftSide":this.K(Nb)?"RightSide":this.K(Ob)?"BottomSide":this.K(Pb)?"TopBottomSides":this.K(Tb)? +"LeftRightSides":this.K(Ub)?"TopLeftSides":this.K(Vb)?"TopRightSides":this.K(Zb)?"BottomLeftSides":this.K($b)?"BottomRightSides":this.K(ac)?"NotTopSide":this.K(bc)?"NotLeftSide":this.K(cc)?"NotRightSide":this.K(dc)?"NotBottomSide":this.K(ec)?"AllSides":this.K(fc)?"Default":"None"};L.prototype.equals=L.prototype.K=function(a){return a instanceof L?(this.x===a.x||isNaN(this.x)&&isNaN(a.x))&&(this.y===a.y||isNaN(this.y)&&isNaN(a.y))&&this.offsetX===a.offsetX&&this.offsetY===a.offsetY:!1}; +L.prototype.opposite=function(){return new L(.5-(this.x-.5),.5-(this.y-.5),-this.offsetX,-this.offsetY)};L.prototype.includesSide=L.prototype.ap=function(a){if(!this.Wi())return!1;if(!a.Wi())if(a.K(nc))a=Gb;else if(a.K(pc))a=Nb;else if(a.K(qc))a=Fb;else if(a.K(rc))a=Ob;else return!1;a=a.offsetY;return(this.offsetY&a)===a};L.prototype.isSpot=L.prototype.bd=function(){return!isNaN(this.x)&&!isNaN(this.y)};L.prototype.isNoSpot=L.prototype.se=function(){return isNaN(this.x)||isNaN(this.y)}; +L.prototype.isSide=L.prototype.Wi=function(){return this.se()&&1===this.offsetX&&0!==this.offsetY};L.prototype.isDefault=L.prototype.Uc=function(){return isNaN(this.x)&&isNaN(this.y)&&-1===this.offsetX&&0===this.offsetY};var qb;L.None=qb=db(new L(0,0,0,0),0).Ea();var fc;L.Default=fc=db(new L(0,0,-1,0),-1).Ea();var rb;L.TopLeft=rb=(new L(0,0,0,0)).Ea();var sb;L.TopCenter=sb=(new L(.5,0,0,0)).Ea();var tb;L.TopRight=tb=(new L(1,0,0,0)).Ea();var ub;L.LeftCenter=ub=(new L(0,.5,0,0)).Ea();var zb; +L.Center=zb=(new L(.5,.5,0,0)).Ea();var Ab;L.RightCenter=Ab=(new L(1,.5,0,0)).Ea();var Cb;L.BottomLeft=Cb=(new L(0,1,0,0)).Ea();var Db;L.BottomCenter=Db=(new L(.5,1,0,0)).Ea();var Eb;L.BottomRight=Eb=(new L(1,1,0,0)).Ea();var sc;L.MiddleTop=sc=sb;var tc;L.MiddleLeft=tc=ub;var uc;L.MiddleRight=uc=Ab;var vc;L.MiddleBottom=vc=Db;var qc;L.Top=qc=sb;var nc;L.Left=nc=ub;var pc;L.Right=pc=Ab;var rc;L.Bottom=rc=Db;var Fb;L.TopSide=Fb=db(new L(0,0,1,v.dd),1).Ea();var Gb; +L.LeftSide=Gb=db(new L(0,0,1,v.Nc),1).Ea();var Nb;L.RightSide=Nb=db(new L(0,0,1,v.Xc),1).Ea();var Ob;L.BottomSide=Ob=db(new L(0,0,1,v.Wc),1).Ea();var Pb;L.TopBottomSides=Pb=db(new L(0,0,1,v.dd|v.Wc),1).Ea();var Tb;L.LeftRightSides=Tb=db(new L(0,0,1,v.Nc|v.Xc),1).Ea();var Ub;L.TopLeftSides=Ub=db(new L(0,0,1,v.dd|v.Nc),1).Ea();var Vb;L.TopRightSides=Vb=db(new L(0,0,1,v.dd|v.Xc),1).Ea();var Zb;L.BottomLeftSides=Zb=db(new L(0,0,1,v.Wc|v.Nc),1).Ea();var $b; +L.BottomRightSides=$b=db(new L(0,0,1,v.Wc|v.Xc),1).Ea();var ac;L.NotTopSide=ac=db(new L(0,0,1,v.Nc|v.Xc|v.Wc),1).Ea();var bc;L.NotLeftSide=bc=db(new L(0,0,1,v.dd|v.Xc|v.Wc),1).Ea();var cc;L.NotRightSide=cc=db(new L(0,0,1,v.dd|v.Nc|v.Wc),1).Ea();var dc;L.NotBottomSide=dc=db(new L(0,0,1,v.dd|v.Nc|v.Xc),1).Ea();var ec;L.AllSides=ec=db(new L(0,0,1,v.dd|v.Nc|v.Xc|v.Wc),1).Ea();function Ac(){this.ff=[1,0,0,1,0,0]} +Ac.prototype.copy=function(){var a=new Ac;a.ff[0]=this.ff[0];a.ff[1]=this.ff[1];a.ff[2]=this.ff[2];a.ff[3]=this.ff[3];a.ff[4]=this.ff[4];a.ff[5]=this.ff[5];return a};function Bc(a){this.type=a;this.r2=this.y2=this.x2=this.r1=this.y1=this.x1=0;this.pD=[];this.pattern=null}Bc.prototype.addColorStop=function(a,b){this.pD.push({offset:a,color:b})}; +function Cc(a,b,c){this.fillStyle="#000000";this.font="10px sans-serif";this.globalAlpha=1;this.lineCap="butt";this.Sm=0;this.lineJoin="miter";this.lineWidth=1;this.miterLimit=10;this.shadowBlur=0;this.shadowColor="rgba(0, 0, 0, 0)";this.shadowOffsetY=this.shadowOffsetX=0;this.strokeStyle="#000000";this.textAlign="start";this.pw=!1;this.og=this.os=this.ns=0;this.document=b||document;this.FD=c;this.Nw=null;this.path=[];this.Ri=new Ac;this.stack=[];this.tf=[];this.ww=a;this.YH="http://www.w3.org/2000/svg"; +this.width=this.ww.width;this.height=this.ww.height;this.Dl=Dc(this,"svg",{width:this.width+"px",height:this.height+"px",QK:"0 0 "+this.ww.width+" "+this.ww.height});this.Dl.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns","http://www.w3.org/2000/svg");this.Dl.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink");Ec(this,1,0,0,1,0,0);a=v.Jl++;b=Dc(this,"clipPath",{id:"mainClip"+a});b.appendChild(Dc(this,"rect",{x:0,y:0,width:this.width,height:this.height})); +this.Dl.appendChild(b);this.tf[0].setAttributeNS(null,"clip-path","url(#mainClip"+a+")")}g=Cc.prototype;g.arc=function(a,b,c,d,e,f){Fc(this,a,b,c,d,e,f)};g.beginPath=function(){this.path=[]};g.bezierCurveTo=function(a,b,c,d,e,f){this.path.push(["C",a,b,c,d,e,f])};g.clearRect=function(){};g.clip=function(){Gc(this,"clipPath",this.path,new Ac)};g.closePath=function(){this.path.push(["z"])};g.createLinearGradient=function(a,b,c,d){var e=new Bc("linear");e.x1=a;e.y1=b;e.x2=c;e.y2=d;return e}; +g.createPattern=function(a){var b=new Bc("pattern");b.pattern=a;return b};g.createRadialGradient=function(a,b,c,d,e,f){var h=new Bc("radial");h.x1=a;h.y1=b;h.r1=c;h.x2=d;h.y2=e;h.r2=f;return h}; +g.drawImage=function(a,b,c,d,e,f,h,k,l){var m="";a instanceof HTMLCanvasElement&&(m=a.toDataURL());a instanceof HTMLImageElement&&(m=a.src);m={x:0,y:0,width:a.naturalWidth,height:a.naturalHeight,href:m};m.preserveAspectRatio=Hc(d,k)&&Hc(e,l)?"xMidYMid slice":"none";var n="";k/=d;l/=e;if(0!==f||0!==h)n+=" translate("+f+", "+h+")";if(1!==k||1!==l)n+=" scale("+k+", "+l+")";if(0!==b||0!==c)n+=" translate("+-b+", "+-c+")";if(0!==b||0!==c||d!==a.naturalWidth||e!==a.naturalHeight)a="CLIP"+v.Jl++,f=Dc(this, +"clipPath",{id:a}),f.appendChild(Dc(this,"rect",{x:b,y:c,width:d,height:e})),this.Dl.appendChild(f),m["clip-path"]="url(#"+a+")";Oc(this,"image",m,this.Ri,n);this.addElement("image",m)};g.fill=function(){Gc(this,"fill",this.path,this.Ri)};g.vg=function(){this.pw?this.clip():this.fill()};g.fillRect=function(a,b,c,d){Pc(this,"fill",[a,b,c,d],this.Ri)}; +g.fillText=function(a,b,c){a=[a,b,c];b=this.textAlign;"left"===b?b="start":"right"===b?b="end":"center"===b&&(b="middle");b={x:a[1],y:a[2],style:"font: "+this.font,"text-anchor":b};Oc(this,"fill",b,this.Ri);this.addElement("text",b,a[0])};g.lineTo=function(a,b){this.path.push(["L",a,b])};g.moveTo=function(a,b){this.path.push(["M",a,b])};g.quadraticCurveTo=function(a,b,c,d){this.path.push(["Q",a,b,c,d])};g.rect=function(a,b,c,d){this.path.push(["M",a,b],["L",a+c,b],["L",a+c,b+d],["L",a,b+d],["z"])}; +g.restore=function(){this.Ri=this.stack.pop();this.path=this.stack.pop();var a=this.stack.pop();this.fillStyle=a.fillStyle;this.font=a.font;this.globalAlpha=a.globalAlpha;this.lineCap=a.lineCap;this.Sm=a.Sm;this.lineJoin=a.lineJoin;this.lineWidth=a.lineWidth;this.miterLimit=a.miterLimit;this.shadowBlur=a.shadowBlur;this.shadowColor=a.shadowColor;this.shadowOffsetX=a.shadowOffsetX;this.shadowOffsetY=a.shadowOffsetY;this.strokeStyle=a.strokeStyle;this.textAlign=a.textAlign}; +g.save=function(){this.stack.push({fillStyle:this.fillStyle,font:this.font,globalAlpha:this.globalAlpha,lineCap:this.lineCap,Sm:this.Sm,lineJoin:this.lineJoin,lineWidth:this.lineWidth,miterLimit:this.miterLimit,shadowBlur:this.shadowBlur,shadowColor:this.shadowColor,shadowOffsetX:this.shadowOffsetX,shadowOffsetY:this.shadowOffsetY,strokeStyle:this.strokeStyle,textAlign:this.textAlign});for(var a=[],b=0;b<this.path.length;b++)a.push(this.path[b]);this.stack.push(a);this.stack.push(this.Ri.copy())}; +g.setTransform=function(a,b,c,d,e,f){1===a&&0===b&&0===c&&1===d&&0===e&&0===f||Ec(this,a,b,c,d,e,f)};g.scale=function(){};g.stroke=function(){Gc(this,"stroke",this.path,this.Ri)};g.dj=function(){this.pn||this.stroke()};g.strokeRect=function(a,b,c,d){Pc(this,"stroke",[a,b,c,d],this.Ri)};function Dc(a,b,c,d){a=a.document.createElementNS(a.YH,b);if(v.Ta(c))for(var e in c)a.setAttributeNS("href"===e?"http://www.w3.org/1999/xlink":"",e,c[e]);void 0!==d&&(a.textContent=d);return a} +g.addElement=function(a,b,c){a=Dc(this,a,b,c);0<this.tf.length?this.tf[this.tf.length-1].appendChild(a):this.Dl.appendChild(a);return this.Nw=a}; +function Oc(a,b,c,d,e){1!==a.globalAlpha&&(c.opacity=a.globalAlpha);"fill"===b?(/^rgba\(/.test(a.fillStyle)?(a=/^\s*rgba\s*\(([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\)\s*$/i.exec(a.fillStyle),c.fill="rgb("+a[1]+","+a[2]+","+a[3]+")",c["fill-opacity"]=a[4]):c.fill=a.fillStyle instanceof Bc?Qc(a,a.fillStyle):a.fillStyle,c.stroke="none"):"stroke"===b&&(c.fill="none",/^rgba\(/.test(a.strokeStyle)?(b=/^\s*rgba\s*\(([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\)\s*$/i.exec(a.strokeStyle), +c.stroke="rgb("+b[1]+","+b[2]+","+b[3]+")",c["stroke-opacity"]=b[4]):c.stroke=a.strokeStyle instanceof Bc?Qc(a,a.strokeStyle):a.strokeStyle,c["stroke-width"]=a.lineWidth,c["stroke-linecap"]=a.lineCap,c["stroke-linejoin"]=a.lineJoin,c["stroke-miterlimit"]=a.miterLimit);d=d.ff;d="matrix("+d[0]+", "+d[1]+", "+d[2]+", "+d[3]+", "+d[4]+", "+d[5]+")";void 0!==e&&(d+=e);c.transform=d} +function Qc(a,b){var c="GRAD"+v.Jl++,d;if("linear"===b.type)d={x1:b.x1,x2:b.x2,y1:b.y1,y2:b.y2,id:c,gradientUnits:"userSpaceOnUse"},d=Dc(a,"linearGradient",d);else if("radial"===b.type)d={x1:b.x1,x2:b.x2,y1:b.y1,y2:b.y2,r1:b.r1,r2:b.r2,id:c},d=Dc(a,"radialGradient",d);else if("pattern"===b.type){var e=b.pattern;d={width:e.width,height:e.height,id:c,patternUnits:"userSpaceOnUse"};var f="";e instanceof HTMLCanvasElement&&(f=e.toDataURL());e instanceof HTMLImageElement&&(f=e.src);e={x:0,y:0,width:e.width, +height:e.height,href:f};d=Dc(a,"pattern",d);d.appendChild(Dc(a,"image",e))}else throw Error("invalid gradient");for(var e=b.pD,f=e.length,h=[],k=0;k<f;k++){var l=e[k],m=l.color,l={offset:l.offset,"stop-color":m};/^rgba\(/.test(m)&&(m=/^\s*rgba\s*\(([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\)\s*$/i.exec(m),l["stop-color"]="rgb("+m[1]+","+m[2]+","+m[3]+")",l["stop-opacity"]=m[4]);h.push(l)}h.sort(function(a,b){return a.offset>b.offset?1:-1});for(k=0;k<f;k++)d.appendChild(Dc(a,"stop", +h[k]));a.Dl.appendChild(d);return"url(#"+c+")"}function Pc(a,b,c,d){c={x:c[0],y:c[1],width:c[2],height:c[3]};Oc(a,b,c,d);a.addElement("rect",c)} +function Gc(a,b,c,d){for(var e=[],f=0;f<c.length;f++){var h=v.fl(c[f]),k=[h.shift()];if("A"===k[0])k.push(h.shift()+","+h.shift(),h.shift(),h.shift()+","+h.shift(),h.shift()+","+h.shift());else for(;h.length;)k.push(h.shift()+","+h.shift());e.push(k.join(" "))}c={d:e.join(" ")};Oc(a,b,c,d);"clipPath"===b?(b="CLIP"+v.Jl++,d=Dc(a,"clipPath",{id:b}),d.appendChild(Dc(a,"path",c)),a.Dl.appendChild(d),0<a.tf.length&&a.tf[a.tf.length-1].setAttributeNS(null,"clip-path","url(#"+b+")")):a.addElement("path", +c)}function Fc(a,b,c,d,e,f,h){var k=Math.abs(e-f);if(e!==f){var l=b+d*Math.cos(f);f=c+d*Math.sin(f);k>=2*Math.PI?(Fc(a,b,c,d,e,e+Math.PI,h),Fc(a,b,c,d,e+Math.PI,e+2*Math.PI,h),a.path.push(["M",l,f])):(b+=d*Math.cos(e),c+=d*Math.sin(e),k=180*k/Math.PI,e=h?0:1,h=180<=k===!!h?0:1,0!==a.path.length?a.path.push(["L",b,c]):a.path.push(["M",b,c]),a.path.push(["A",d,d,k,h,e,l,f]))}}function Ec(a,b,c,d,e,f,h){var k=new Ac;k.ff=[b,c,d,e,f,h];b={};Oc(a,"g",b,k);k=a.addElement("g",b);a.tf.push(k)} +g.Ya=function(){if(0!==this.shadowOffsetX||0!==this.shadowOffsetY||0!==this.shadowBlur){var a="SHADOW"+v.Jl++,b=this.addElement("filter",{id:a,x:"-100%",y:"-100%",width:"300%",height:"300%"},null),c,d,e,f,h;c=Dc(this,"feGaussianBlur",{"in":"SourceAlpha",result:"blur",GK:this.shadowBlur/2});d=Dc(this,"feFlood",{"in":"blur",result:"flood","flood-color":this.shadowColor});e=Dc(this,"feComposite",{"in":"flood",in2:"blur",operator:"in",result:"comp"});f=Dc(this,"feOffset",{"in":"comp",result:"offsetBlur", +dx:this.shadowOffsetX,dy:this.shadowOffsetY});h=Dc(this,"feMerge",{});h.appendChild(Dc(this,"feMergeNode",{"in":"offsetBlur"}));h.appendChild(Dc(this,"feMergeNode",{"in":"SourceGraphic"}));b.appendChild(c);b.appendChild(d);b.appendChild(e);b.appendChild(f);b.appendChild(h);0<this.tf.length&&this.tf[this.tf.length-1].setAttributeNS(null,"filter","url(#"+a+")")}};g.qA=function(a,b,c){this.ns=a;this.os=b;this.og=c};g.$m=function(){this.shadowBlur=this.shadowOffsetY=this.shadowOffsetX=0}; +g.an=function(){this.shadowOffsetX=this.ns;this.shadowOffsetY=this.os;this.shadowBlur=this.og};g.pz=function(){return!1};g.nz=function(){};function Rc(a,b){this.ownerDocument=void 0===b?document:b;var c=this.ownerDocument.createElement("canvas");c.tabIndex=0;this.xd=c;this.el=new Sc(c);c.W=a;Object.seal(this)}g=Rc.prototype;g.toDataURL=function(a,b){return this.xd.toDataURL(a,b)};g.getBoundingClientRect=function(){return this.xd.getBoundingClientRect()};g.focus=function(){return this.xd.focus()}; +g.addEventListener=function(a,b,c){this.xd.addEventListener(a,b,c)};g.removeEventListener=function(a,b,c){this.xd.removeEventListener(a,b,c)};v.defineProperty(Rc,{width:"width"},function(){return this.xd.width},function(a){this.xd.width=a});v.defineProperty(Rc,{height:"height"},function(){return this.xd.height},function(a){this.xd.height=a});v.defineProperty(Rc,{style:"style"},function(){return this.xd.style},function(a){this.xd.style=a}); +function Sc(a){a.getContext&&a.getContext("2d")||v.k("Browser does not support HTML Canvas Element");this.wa=a.getContext("2d");this.Jx=this.Lx=this.Kx="";this.pn=!1;this.og=this.os=this.ns=0;Object.seal(this)}v.defineProperty(Sc,{fillStyle:"fillStyle"},function(){return this.wa.fillStyle},function(a){this.Jx!==a&&(this.Jx=this.wa.fillStyle=a)});v.defineProperty(Sc,{font:"font"},function(){return this.wa.font},function(a){this.Kx!==a&&(this.Kx=this.wa.font=a)}); +v.defineProperty(Sc,{globalAlpha:"globalAlpha"},function(){return this.wa.globalAlpha},function(a){this.wa.globalAlpha=a});v.defineProperty(Sc,{lineCap:"lineCap"},function(){return this.wa.lineCap},function(a){this.wa.lineCap=a});v.defineProperty(Sc,{Sm:"lineDashOffset"},function(){return this.wa.Sm},function(a){this.wa.Sm=a});v.defineProperty(Sc,{lineJoin:"lineJoin"},function(){return this.wa.lineJoin},function(a){this.wa.lineJoin=a}); +v.defineProperty(Sc,{lineWidth:"lineWidth"},function(){return this.wa.lineWidth},function(a){this.wa.lineWidth=a});v.defineProperty(Sc,{miterLimit:"miterLimit"},function(){return this.wa.miterLimit},function(a){this.wa.miterLimit=a});v.defineProperty(Sc,{shadowBlur:"shadowBlur"},function(){return this.wa.shadowBlur},function(a){this.wa.shadowBlur=a});v.defineProperty(Sc,{shadowColor:"shadowColor"},function(){return this.wa.shadowColor},function(a){this.wa.shadowColor=a}); +v.defineProperty(Sc,{shadowOffsetX:"shadowOffsetX"},function(){return this.wa.shadowOffsetX},function(a){this.wa.shadowOffsetX=a});v.defineProperty(Sc,{shadowOffsetY:"shadowOffsetY"},function(){return this.wa.shadowOffsetY},function(a){this.wa.shadowOffsetY=a});v.defineProperty(Sc,{strokeStyle:"strokeStyle"},function(){return this.wa.strokeStyle},function(a){this.Lx!==a&&(this.Lx=this.wa.strokeStyle=a)}); +v.defineProperty(Sc,{textAlign:"textAlign"},function(){return this.wa.textAlign},function(a){this.wa.textAlign=a});v.defineProperty(Sc,{pt:"imageSmoothingEnabled"},function(){return this.wa.pt},function(a){this.wa.pt=a});g=Sc.prototype;g.arc=function(a,b,c,d,e,f){this.wa.arc(a,b,c,d,e,f)};g.beginPath=function(){this.wa.beginPath()};g.bezierCurveTo=function(a,b,c,d,e,f){this.wa.bezierCurveTo(a,b,c,d,e,f)};g.clearRect=function(a,b,c,d){this.wa.clearRect(a,b,c,d)};g.clip=function(){this.wa.clip()}; +g.closePath=function(){this.wa.closePath()};g.createLinearGradient=function(a,b,c,d){return this.wa.createLinearGradient(a,b,c,d)};g.createPattern=function(a,b){return this.wa.createPattern(a,b)};g.createRadialGradient=function(a,b,c,d,e,f){return this.wa.createRadialGradient(a,b,c,d,e,f)};g.drawImage=function(a,b,c,d,e,f,h,k,l){void 0===d?this.wa.drawImage(a,b,c):this.wa.drawImage(a,b,c,d,e,f,h,k,l)};g.fill=function(){this.wa.fill()};g.fillRect=function(a,b,c,d){this.wa.fillRect(a,b,c,d)}; +g.fillText=function(a,b,c){this.wa.fillText(a,b,c)};g.getImageData=function(a,b,c,d){return this.wa.getImageData(a,b,c,d)};g.lineTo=function(a,b){this.wa.lineTo(a,b)};g.measureText=function(a){return this.wa.measureText(a)};g.moveTo=function(a,b){this.wa.moveTo(a,b)};g.quadraticCurveTo=function(a,b,c,d){this.wa.quadraticCurveTo(a,b,c,d)};g.rect=function(a,b,c,d){this.wa.rect(a,b,c,d)};g.restore=function(){this.wa.restore()};Sc.prototype.rotate=function(a){this.wa.rotate(a)};g=Sc.prototype; +g.save=function(){this.wa.save()};g.setTransform=function(a,b,c,d,e,f){this.wa.setTransform(a,b,c,d,e,f)};g.scale=function(a,b){this.wa.scale(a,b)};g.stroke=function(){this.wa.stroke()};g.transform=function(a,b,c,d,e,f){1===a&&0===b&&0===c&&1===d&&0===e&&0===f||this.wa.transform(a,b,c,d,e,f)};g.translate=function(a,b){this.wa.translate(a,b)}; +g.vg=function(a){if(a instanceof ha&&a.type===Yc){var b=a.sn;a=a.Px;a>b?(this.scale(b/a,1),this.translate((a-b)/2,0)):b>a&&(this.scale(1,a/b),this.translate(0,(b-a)/2));this.pn?this.clip():this.fill();a>b?(this.translate(-(a-b)/2,0),this.scale(1/(b/a),1)):b>a&&(this.translate(0,-(b-a)/2),this.scale(1,1/(a/b)))}else this.pn?this.clip():this.fill()};g.dj=function(){this.pn||this.stroke()};v.defineProperty(Sc,{pw:"clipInsteadOfFill"},function(){return this.pn},function(a){this.pn=a});g=Sc.prototype; +g.qA=function(a,b,c){this.ns=a;this.os=b;this.og=c};g.$m=function(){this.shadowBlur=this.shadowOffsetY=this.shadowOffsetX=0};g.an=function(){this.shadowOffsetX=this.ns;this.shadowOffsetY=this.os;this.shadowBlur=this.og};g.pz=function(a,b){var c=this.wa;if(void 0!==c.setLineDash)c.setLineDash(a),c.lineDashOffset=b;else if(void 0!==c.webkitLineDash)c.webkitLineDash=a,c.webkitLineDashOffset=b;else if(void 0!==c.mozDash)c.mozDash=a,c.mozDashOffset=b;else return!1;return!0}; +g.nz=function(){var a=this.wa;void 0!==a.setLineDash?(a.setLineDash(v.hj),a.lineDashOffset=0):void 0!==a.webkitLineDash?(a.webkitLineDash=v.hj,a.webkitLineDashOffset=0):void 0!==a.mozDash&&(a.mozDash=null,a.mozDashOffset=0)};function Zc(a,b){b&&(a.Kx="");a.Lx="";a.Jx=""} +var $c=(Math.sqrt(2)-1)/3*4,ad=(new z(0,0)).Ea(),bd=(new A(0,0,0,0)).Ea(),cd=(new cb(0,0,0,0)).Ea(),ld=(new cb(2,2,2,2)).Ea(),md=(new z(6,6)).Ea(),nd=(new z(-Infinity,-Infinity)).Ea(),od=(new z(Infinity,Infinity)).Ea(),pd=(new ia(0,0)).Ea(),qd=(new ia(1,1)).Ea(),rd=(new ia(6,6)).Ea(),sd=(new ia(8,8)).Ea(),td=(new ia(10,10)).Ea(),Cd=(new ia(Infinity,Infinity)).Ea(),Dd=(new z(NaN,NaN)).Ea(),Ed=(new ia(NaN,NaN)).Ea(),Fd=(new A(NaN,NaN,NaN,NaN)).Ea(),Gd=(new L(.156,.156)).Ea(),Hd=(new L(.844,.844)).Ea(), +Id=new ta,Jd=new ta,Kd=null;function Ld(a){if(0>=a)return 0;var b=Kd;if(null===b){for(var b=[],c=0;2E3>=c;c++)b[c]=Math.sqrt(c);Kd=b}return 1>a?(c=1/a,2E3>=c?1/b[c|0]:Math.sqrt(a)):2E3>=a?b[a|0]:Math.sqrt(a)}function K(a,b){var c=a-b;return.5>c&&-.5<c}function Hc(a,b){var c=a-b;return 5E-8>c&&-5E-8<c} +function Md(a,b,c,d,e,f,h){0>=e&&(e=1E-6);var k=0,l=0,m=0,n=0;a<c?(l=a,k=c):(l=c,k=a);b<d?(n=b,m=d):(n=d,m=b);if(a===c)return n<=h&&h<=m&&a-e<=f&&f<=a+e;if(b===d)return l<=f&&f<=k&&b-e<=h&&h<=b+e;k+=e;l-=e;if(l<=f&&f<=k&&(m+=e,n-=e,n<=h&&h<=m))if(k-l>m-n)if(a-c>e||c-a>e){if(f=(d-b)/(c-a)*(f-a)+b,f-e<=h&&h<=f+e)return!0}else return!0;else if(b-d>e||d-b>e){if(h=(c-a)/(d-b)*(h-b)+a,h-e<=f&&f<=h+e)return!0}else return!0;return!1} +function Xd(a,b,c,d,e,f,h,k,l,m,n,p){if(Md(a,b,h,k,p,c,d)&&Md(a,b,h,k,p,e,f))return Md(a,b,h,k,p,m,n);var q=(a+c)/2,r=(b+d)/2,s=(c+e)/2,t=(d+f)/2;e=(e+h)/2;f=(f+k)/2;d=(q+s)/2;c=(r+t)/2;var s=(s+e)/2,t=(t+f)/2,u=(d+s)/2,x=(c+t)/2;return Xd(a,b,q,r,d,c,u,x,l,m,n,p)||Xd(u,x,s,t,e,f,h,k,l,m,n,p)} +function Yd(a,b,c,d,e,f,h,k,l,m){if(Md(a,b,h,k,l,c,d)&&Md(a,b,h,k,l,e,f))$a(m,a,b,0,0),$a(m,h,k,0,0);else{var n=(a+c)/2,p=(b+d)/2,q=(c+e)/2,r=(d+f)/2;e=(e+h)/2;f=(f+k)/2;d=(n+q)/2;c=(p+r)/2;var q=(q+e)/2,r=(r+f)/2,s=(d+q)/2,t=(c+r)/2;Yd(a,b,n,p,d,c,s,t,l,m);Yd(s,t,q,r,e,f,h,k,l,m)}} +function Zd(a,b,c,d,e,f,h,k,l,m){if(Md(a,b,h,k,l,c,d)&&Md(a,b,h,k,l,e,f))0===m.length&&(m.push(a),m.push(b)),m.push(h),m.push(k);else{var n=(a+c)/2,p=(b+d)/2,q=(c+e)/2,r=(d+f)/2;e=(e+h)/2;f=(f+k)/2;d=(n+q)/2;c=(p+r)/2;var q=(q+e)/2,r=(r+f)/2,s=(d+q)/2,t=(c+r)/2;Zd(a,b,n,p,d,c,s,t,l,m);Zd(s,t,q,r,e,f,h,k,l,m)}} +function $d(a,b,c,d,e,f,h,k,l,m,n,p,q,r){var s=1-l;a=a*s+c*l;b=b*s+d*l;c=c*s+e*l;d=d*s+f*l;e=e*s+h*l;f=f*s+k*l;k=a*s+c*l;h=b*s+d*l;c=c*s+e*l;d=d*s+f*l;m.x=a;m.y=b;n.x=k;n.y=h;p.x=k*s+c*l;p.y=h*s+d*l;q.x=c;q.y=d;r.x=e;r.y=f}function ae(a,b,c,d,e,f,h,k,l,m){if(Md(a,b,e,f,m,c,d))return Md(a,b,e,f,m,k,l);var n=(a+c)/2,p=(b+d)/2;c=(c+e)/2;d=(d+f)/2;var q=(n+c)/2,r=(p+d)/2;return ae(a,b,n,p,q,r,h,k,l,m)||ae(q,r,c,d,e,f,h,k,l,m)} +function be(a,b,c,d,e,f,h,k){if(Md(a,b,e,f,h,c,d))$a(k,a,b,0,0),$a(k,e,f,0,0);else{var l=(a+c)/2,m=(b+d)/2;c=(c+e)/2;d=(d+f)/2;var n=(l+c)/2,p=(m+d)/2;be(a,b,l,m,n,p,h,k);be(n,p,c,d,e,f,h,k)}}function ce(a,b,c,d,e,f,h,k){if(Md(a,b,e,f,h,c,d))0===k.length&&(k.push(a),k.push(b)),k.push(e),k.push(f);else{var l=(a+c)/2,m=(b+d)/2;c=(c+e)/2;d=(d+f)/2;var n=(l+c)/2,p=(m+d)/2;ce(a,b,l,m,n,p,h,k);ce(n,p,c,d,e,f,h,k)}} +function de(a,b,c,d,e,f,h,k,l,m,n,p,q,r){0>=q&&(q=1E-6);if(Md(a,b,h,k,q,c,d)&&Md(a,b,h,k,q,e,f)){var s=(a-h)*(m-p)-(b-k)*(l-n);if(0===s)return!1;q=((a*k-b*h)*(l-n)-(a-h)*(l*p-m*n))/s;s=((a*k-b*h)*(m-p)-(b-k)*(l*p-m*n))/s;if((l>n?l-n:n-l)<(m>p?m-p:p-m)){if(h=l=0,b<k?(l=b,h=k):(l=k,h=b),s<l||s>h)return!1}else if(a<h?l=a:(l=h,h=a),q<l||q>h)return!1;r.x=q;r.y=s;return!0}var s=(a+c)/2,t=(b+d)/2;c=(c+e)/2;d=(d+f)/2;e=(e+h)/2;f=(f+k)/2;var u=(s+c)/2,x=(t+d)/2;c=(c+e)/2;d=(d+f)/2;var w=(u+c)/2,y=(x+d)/2, +B=(n-l)*(n-l)+(p-m)*(p-m),H=!1;de(a,b,s,t,u,x,w,y,l,m,n,p,q,r)&&(b=(r.x-l)*(r.x-l)+(r.y-m)*(r.y-m),b<B&&(B=b,H=!0));a=r.x;s=r.y;de(w,y,c,d,e,f,h,k,l,m,n,p,q,r)&&(b=(r.x-l)*(r.x-l)+(r.y-m)*(r.y-m),b<B?H=!0:(r.x=a,r.y=s));return H} +function ee(a,b,c,d,e,f,h,k,l,m,n,p,q){var r=0;0>=q&&(q=1E-6);if(Md(a,b,h,k,q,c,d)&&Md(a,b,h,k,q,e,f)){q=(a-h)*(m-p)-(b-k)*(l-n);if(0===q)return r;var s=((a*k-b*h)*(l-n)-(a-h)*(l*p-m*n))/q,t=((a*k-b*h)*(m-p)-(b-k)*(l*p-m*n))/q;if(s>=n)return r;if((l>n?l-n:n-l)<(m>p?m-p:p-m)){if(a=l=0,b<k?(l=b,a=k):(l=k,a=b),t<l||t>a)return r}else if(a<h?(l=a,a=h):l=h,s<l||s>a)return r;0<q?r++:0>q&&r--}else{var s=(a+c)/2,t=(b+d)/2,u=(c+e)/2,x=(d+f)/2;e=(e+h)/2;f=(f+k)/2;d=(s+u)/2;c=(t+x)/2;var u=(u+e)/2,x=(x+f)/2, +w=(d+u)/2,y=(c+x)/2,r=r+ee(a,b,s,t,d,c,w,y,l,m,n,p,q),r=r+ee(w,y,u,x,e,f,h,k,l,m,n,p,q)}return r} +function Oa(a,b,c,d,e,f,h){if(Hc(a,c)){var k=0;c=0;b<d?(k=b,c=d):(k=d,c=b);d=f;if(d<k)return h.x=a,h.y=k,!1;if(d>c)return h.x=a,h.y=c,!1;h.x=a;h.y=d;return!0}if(Hc(b,d)){a<c?k=a:(k=c,c=a);d=e;if(d<k)return h.x=k,h.y=b,!1;if(d>c)return h.x=c,h.y=b,!1;h.x=d;h.y=b;return!0}k=((a-e)*(a-c)+(b-f)*(b-d))/((c-a)*(c-a)+(d-b)*(d-b));if(-5E-6>k)return h.x=a,h.y=b,!1;if(1.000005<k)return h.x=c,h.y=d,!1;h.x=a+k*(c-a);h.y=b+k*(d-b);return!0} +function fe(a,b,c,d,e,f,h,k,l){if(K(a,c)&&K(b,d))return l.x=a,l.y=b,!1;if(Hc(e,h)){if(Hc(a,c))return Oa(a,b,c,d,e,f,l),!1;f=(d-b)/(c-a)*(e-a)+b;return Oa(a,b,c,d,e,f,l)}k=(k-f)/(h-e);if(Hc(a,c)){f=k*(a-e)+f;c=h=0;b<d?(h=b,c=d):(h=d,c=b);if(f<h)return l.x=a,l.y=h,!1;if(f>c)return l.x=a,l.y=c,!1;l.x=a;l.y=f;return!0}h=(d-b)/(c-a);if(Hc(k,h))return Oa(a,b,c,d,e,f,l),!1;e=(h*a-k*e+f-b)/(h-k);if(Hc(h,0)){a<c?h=a:(h=c,c=a);if(e<h)return l.x=h,l.y=b,!1;if(e>c)return l.x=c,l.y=b,!1;l.x=e;l.y=b;return!0}f= +h*(e-a)+b;return Oa(a,b,c,d,e,f,l)}function ge(a,b,c,d,e,f,h,k,l){var m=1E21,n=a,p=b;if(fe(a,b,a,d,e,f,h,k,l)){var q=(l.x-e)*(l.x-e)+(l.y-f)*(l.y-f);q<m&&(m=q,n=l.x,p=l.y)}fe(c,b,c,d,e,f,h,k,l)&&(q=(l.x-e)*(l.x-e)+(l.y-f)*(l.y-f),q<m&&(m=q,n=l.x,p=l.y));fe(a,b,c,b,e,f,h,k,l)&&(q=(l.x-e)*(l.x-e)+(l.y-f)*(l.y-f),q<m&&(m=q,n=l.x,p=l.y));fe(a,d,c,d,e,f,h,k,l)&&(q=(l.x-e)*(l.x-e)+(l.y-f)*(l.y-f),q<m&&(m=q,n=l.x,p=l.y));l.x=n;l.y=p;return 1E21>m} +function he(a,b,c,d,e,f,h,k,l){c=a-c;var m=e-h,n=h=0;0===c||0===m?0===c?(k=(f-k)/m,h=a,n=k*h+(f-k*e)):(d=(b-d)/c,h=e,n=d*h+(b-d*a)):(d=(b-d)/c,k=(f-k)/m,a=b-d*a,h=(f-k*e-a)/(d-k),n=d*h+a);l.m(h,n);return l} +function oe(a,b,c){var d=b.x,e=b.y,f=c.x,h=c.y,k=a.left,l=a.right,m=a.top,n=a.bottom;return d===f?(f=a=0,e<h?(a=e,f=h):(a=h,f=e),k<=d&&d<=l&&a<=n&&f>=m):e===h?(d<f?a=d:(a=f,f=d),m<=e&&e<=n&&a<=l&&f>=k):a.Fa(b)||a.Fa(c)||pe(k,m,l,m,d,e,f,h)||pe(l,m,l,n,d,e,f,h)||pe(l,n,k,n,d,e,f,h)||pe(k,n,k,m,d,e,f,h)?!0:!1}function pe(a,b,c,d,e,f,h,k){return 0>=qe(a,b,c,d,e,f)*qe(a,b,c,d,h,k)&&0>=qe(e,f,h,k,a,b)*qe(e,f,h,k,c,d)} +function qe(a,b,c,d,e,f){c-=a;d-=b;a=e-a;b=f-b;f=a*d-b*c;0===f&&(f=a*c+b*d,0<f&&(f=(a-c)*c+(b-d)*d,0>f&&(f=0)));return 0>f?-1:0<f?1:0}function re(a){0>a&&(a+=360);360<=a&&(a-=360);return a} +function se(a,b,c,d){var e=Math.PI;d||(b*=e/180,c*=e/180);d=b<c?1:-1;var f=[],h=e/2,k=b;for(b=Math.min(2*e,Math.abs(c-b));1E-5<b;){c=k+d*Math.min(b,h);var e=(c-k)/2,l=a*Math.cos(e),m=a*Math.sin(e),n=-m,p=l*l+n*n,q=p+l*l+n*m,p=4/3*(Math.sqrt(2*p*q)-q)/(l*m-n*l),m=l-p*n,l=n+p*l,n=-l,p=e+k,e=Math.cos(p),p=Math.sin(p);f.push([0+a*Math.cos(k),0+a*Math.sin(k),0+m*e-l*p,0+m*p+l*e,0+m*e-n*p,0+m*p+n*e,0+a*Math.cos(c),0+a*Math.sin(c)]);b-=Math.abs(c-k);k=c}return f} +function Pa(a,b,c,d,e,f,h){c=Math.floor((a-c)/e)*e+c;d=Math.floor((b-d)/f)*f+d;var k=c;c+e-a<e/2&&(k=c+e);a=d;d+f-b<f/2&&(a=d+f);h.m(k,a)}function te(a,b){var c=Math.max(a,b),d=Math.min(a,b),e=1,f=1;do e=c%d,c=f=d,d=e;while(0<e);return f} +function ue(a,b,c,d){var e=0>c,f=0>d,h=0,k=h=0;a<b?(h=1,k=0):(h=0,k=1);var l=0,m=0,n=0,p=0,l=0===h?a:b,n=0===h?c:d;if(0===h?e:f)n=-n;h=k;m=0===h?a:b;p=0===h?c:d;if(0===h?e:f)p=-p;a=a=0;if(0<p)if(0<n){b=l*l;a=m*m;l*=n;c=m*p;d=-a+c;e=-a+Math.sqrt(l*l+c*c);m=d;for(f=0;9999999999>f;++f){m=.5*(d+e);if(m===d||m===e)break;k=l/(m+b);h=c/(m+a);k=k*k+h*h-1;if(0<k)d=m;else if(0>k)e=m;else break}n=b*n/(m+b)-n;p=a*p/(m+a)-p;a=Math.sqrt(n*n+p*p)}else a=Math.abs(p-m);else p=l*l-m*m,a=l*n,a<p?(p=a/p,a=m*Math.sqrt(Math.abs(1- +p*p)),n=l*p-n,a=Math.sqrt(n*n+a*a)):a=Math.abs(n-l);return a}function ve(a){1<arguments.length&&v.k("Geometry constructor can take at most one optional argument, the Geometry type.");v.dc(this);this.D=!1;void 0===a&&(a=Fe);this.ia=a;this.Bb=this.vb=this.Cc=this.vc=0;this.mj=new I(Ge);this.Su=this.mj.F;this.Cu=(new A).freeze();this.$a=!0;this.Oh=rb;this.Ph=Eb;this.Qn=this.Sn=NaN;this.ni=He}v.ea("Geometry",ve);v.Vh(ve); +ve.prototype.copy=function(){var a=new ve;a.ia=this.ia;a.vc=this.vc;a.Cc=this.Cc;a.vb=this.vb;a.Bb=this.Bb;for(var b=this.mj.n,c=b.length,d=a.mj,e=0;e<c;e++){var f=b[e].copy();d.add(f)}a.Su=this.Su;a.Cu.assign(this.Cu);a.$a=this.$a;a.Oh=this.Oh.S();a.Ph=this.Ph.S();a.Sn=this.Sn;a.Qn=this.Qn;a.ni=this.ni;return a};var Ie;ve.Line=Ie=v.p(ve,"Line",0);var Je;ve.Rectangle=Je=v.p(ve,"Rectangle",1);var Ke;ve.Ellipse=Ke=v.p(ve,"Ellipse",2);var Fe;ve.Path=Fe=v.p(ve,"Path",3); +ve.prototype.Ea=function(){this.freeze();Object.freeze(this);return this};ve.prototype.freeze=function(){this.D=!0;var a=this.Ub;a.freeze();for(var a=a.n,b=a.length,c=0;c<b;c++)a[c].freeze();return this};ve.prototype.Oa=function(){Object.isFrozen(this)&&v.k("cannot thaw constant: "+this);this.D=!1;var a=this.Ub;a.Oa();for(var a=a.n,b=a.length,c=0;c<b;c++)a[c].Oa();return this}; +ve.prototype.equalsApprox=ve.prototype.Fc=function(a){if(!(a instanceof ve))return!1;if(this.type!==a.type)return this.type===Ie&&a.type===Fe?Xe(this,a):a.type===Ie&&this.type===Fe?Xe(a,this):!1;if(this.type===Fe){var b=this.Ub.n;a=a.Ub.n;var c=b.length;if(c!==a.length)return!1;for(var d=0;d<c;d++)if(!b[d].Fc(a[d]))return!1;return!0}return K(this.Aa,a.Aa)&&K(this.xa,a.xa)&&K(this.I,a.I)&&K(this.J,a.J)}; +function Xe(a,b){if(a.type!==Ie||b.type!==Fe)return!1;if(1===b.Ub.count){var c=b.Ub.da(0);if(1===c.sb.count&&K(a.Aa,c.Aa)&&K(a.xa,c.xa)&&(c=c.sb.da(0),c.type===Ye&&K(a.I,c.I)&&K(a.J,c.J)))return!0}return!1}var Ze;ve.stringify=Ze=function(a){return a.toString()}; +ve.prototype.toString=function(a){void 0===a&&(a=-1);switch(this.type){case Ie:return 0>a?"M"+this.Aa.toString()+" "+this.xa.toString()+"L"+this.I.toString()+" "+this.J.toString():"M"+this.Aa.toFixed(a)+" "+this.xa.toFixed(a)+"L"+this.I.toFixed(a)+" "+this.J.toFixed(a);case Je:var b=new A(this.Aa,this.xa,0,0);b.qF(this.I,this.J,0,0);return 0>a?"M"+b.x.toString()+" "+b.y.toString()+"H"+b.right.toString()+"V"+b.bottom.toString()+"H"+b.left.toString()+"z":"M"+b.x.toFixed(a)+" "+b.y.toFixed(a)+"H"+b.right.toFixed(a)+ +"V"+b.bottom.toFixed(a)+"H"+b.left.toFixed(a)+"z";case Ke:b=new A(this.Aa,this.xa,0,0);b.qF(this.I,this.J,0,0);if(0>a){var c=b.left.toString()+" "+(b.y+b.height/2).toString(),d=b.right.toString()+" "+(b.y+b.height/2).toString();return"M"+c+"A"+(b.width/2).toString()+" "+(b.height/2).toString()+" 0 0 1 "+d+"A"+(b.width/2).toString()+" "+(b.height/2).toString()+" 0 0 1 "+c}c=b.left.toFixed(a)+" "+(b.y+b.height/2).toFixed(a);d=b.right.toFixed(a)+" "+(b.y+b.height/2).toFixed(a);return"M"+c+"A"+(b.width/ +2).toFixed(a)+" "+(b.height/2).toFixed(a)+" 0 0 1 "+d+"A"+(b.width/2).toFixed(a)+" "+(b.height/2).toFixed(a)+" 0 0 1 "+c;case Fe:for(var b="",c=this.Ub.n,d=c.length,e=0;e<d;e++){var f=c[e];0<e&&(b+=" x ");f.ut&&(b+="F ");b+=f.toString(a)}return b;default:return this.type.toString()}}; +ve.fillPath=function(a){"string"!==typeof a&&v.Cd(a,"string",ve,"fillPath:str");a=a.split(/[Xx]/);for(var b=a.length,c="",d=0;d<b;d++)var e=a[d],c=null!==e.match(/[Ff]/)?0===d?c+e:c+("X"+(" "===e[0]?"":" ")+e):c+((0===d?"":"X ")+"F"+(" "===e[0]?"":" ")+e);return c};var $e; +ve.parse=$e=function(a,b){function c(){return m>=t-1?!0:null!==l[m+1].match(/[A-Za-z]/)}function d(){m++;return l[m]}function e(){var a=new z(parseFloat(d()),parseFloat(d()));n===n.toLowerCase()&&(a.x=s.x+a.x,a.y=s.y+a.y);return a}function f(){return s=e()}function h(){return r=e()}function k(){return"c"!==p.toLowerCase()&&"s"!==p.toLowerCase()?s:new z(2*s.x-r.x,2*s.y-r.y)}void 0===b&&(b=!1);"string"!==typeof a&&v.Cd(a,"string",ve,"parse:str");a=a.replace(/,/gm," ");a=a.replace(/([UuBbMmZzLlHhVvCcSsQqTtAaFf])([UuBbMmZzLlHhVvCcSsQqTtAaFf])/gm, +"$1 $2");a=a.replace(/([UuBbMmZzLlHhVvCcSsQqTtAaFf])([UuBbMmZzLlHhVvCcSsQqTtAaFf])/gm,"$1 $2");a=a.replace(/([UuBbMmZzLlHhVvCcSsQqTtAaFf])([^\s])/gm,"$1 $2");a=a.replace(/([^\s])([UuBbMmZzLlHhVvCcSsQqTtAaFf])/gm,"$1 $2");a=a.replace(/([0-9])([+\-])/gm,"$1 $2");a=a.replace(/(\.[0-9]*)(\.)/gm,"$1 $2");a=a.replace(/([Aa](\s+[0-9]+){3})\s+([01])\s*([01])/gm,"$1 $3 $4 ");a=a.replace(/[\s\r\t\n]+/gm," ");a=a.replace(/^\s+|\s+$/g,"");for(var l=a.split(" "),m=-1,n="",p="",q=new z(0,0),r=new z(0,0),s=new z(0, +0),t=l.length,u=v.s(),x=!1,w=!1,y=!0;!(m>=t-1);)if(p=n,n=d(),""!==n)switch(n.toUpperCase()){case "X":y=!0;w=x=!1;break;case "M":var B=f();null===u.Rb||!0===y?(N(u,B.x,B.y,x,!1,!w),y=!1):u.moveTo(B.x,B.y);for(q=s;!c();)B=f(),u.lineTo(B.x,B.y);break;case "L":for(;!c();)B=f(),u.lineTo(B.x,B.y);break;case "H":for(;!c();)s=B=new z((n===n.toLowerCase()?s.x:0)+parseFloat(d()),s.y),u.lineTo(s.x,s.y);break;case "V":for(;!c();)s=B=new z(s.x,(n===n.toLowerCase()?s.y:0)+parseFloat(d())),u.lineTo(s.x,s.y);break; +case "C":for(;!c();){var H=e(),C=h(),B=f();O(u,H.x,H.y,C.x,C.y,B.x,B.y)}break;case "S":for(;!c();)H=k(),C=h(),B=f(),O(u,H.x,H.y,C.x,C.y,B.x,B.y);break;case "Q":for(;!c();)C=h(),B=f(),af(u,C.x,C.y,B.x,B.y);break;case "T":for(;!c();)r=C=k(),B=f(),af(u,C.x,C.y,B.x,B.y);break;case "B":for(;!c();){var B=parseFloat(d()),H=parseFloat(d()),C=parseFloat(d()),T=parseFloat(d()),ba=parseFloat(d()),U=ba,M=!1;c()||(U=parseFloat(d()),c()||(M=0!==parseFloat(d())));n===n.toLowerCase()&&(C+=s.x,T+=s.y);u.arcTo(B,H, +C,T,ba,U,M)}break;case "A":for(;!c();)H=Math.abs(parseFloat(d())),C=Math.abs(parseFloat(d())),T=parseFloat(d()),ba=!!parseFloat(d()),U=!!parseFloat(d()),B=f(),bf(u,H,C,T,ba,U,B.x,B.y);break;case "Z":B=u.o.Ub.n[u.o.Ub.length-1];P(u);s=q;break;case "F":B="";for(H=1;l[m+H];)if(null!==l[m+H].match(/[Uu]/))H++;else if(null===l[m+H].match(/[A-Za-z]/))H++;else{B=l[m+H];break}B.match(/[Mm]/)?x=!0:cf(u);break;case "U":B="";for(H=1;l[m+H];)if(null!==l[m+H].match(/[Ff]/))H++;else if(null===l[m+H].match(/[A-Za-z]/))H++; +else{B=l[m+H];break}B.match(/[Mm]/)?w=!0:u.Ya(!1)}q=u.o;v.q(u);if(b)for(u=q.Ub.i;u.next();)B=u.value,B.ut=!0;return q};function df(a,b){for(var c=a.length,d=v.L(),e=0;e<c;e++){var f=a[e];d.x=f[0];d.y=f[1];b.ub(d);f[0]=d.x;f[1]=d.y;d.x=f[2];d.y=f[3];b.ub(d);f[2]=d.x;f[3]=d.y;d.x=f[4];d.y=f[5];b.ub(d);f[4]=d.x;f[5]=d.y;d.x=f[6];d.y=f[7];b.ub(d);f[6]=d.x;f[7]=d.y}v.v(d)} +ve.prototype.Gz=function(){if(this.$a||this.Su!==this.Ub.F)return!0;for(var a=this.Ub.n,b=a.length,c=0;c<b;c++)if(a[c].Gz())return!0;return!1};ve.prototype.BA=function(){this.$a=!1;this.Su=this.Ub.F;for(var a=this.Ub.n,b=a.length,c=0;c<b;c++)a[c].BA()};ve.prototype.ah=function(){var a=this.Cu;a.Oa();isNaN(this.Sn)||isNaN(this.Qn)?a.m(0,0,0,0):a.m(0,0,this.Sn,this.Qn);ef(this,a,!1);$a(a,0,0,0,0);a.freeze()}; +ve.prototype.computeBoundsWithoutOrigin=ve.prototype.tG=function(){var a=new A;ef(this,a,!0);return a}; +function ef(a,b,c){switch(a.type){case Ie:case Je:case Ke:c?b.m(a.vc,a.Cc,0,0):$a(b,a.vc,a.Cc,0,0);$a(b,a.vb,a.Bb,0,0);break;case Fe:var d=a.Ub;a=d.n;for(var d=d.length,e=0;e<d;e++){var f=a[e];c&&0===e?b.m(f.Aa,f.xa,0,0):$a(b,f.Aa,f.xa,0,0);for(var h=f.sb.n,k=h.length,l=f.Aa,m=f.xa,n=0;n<k;n++){var p=h[n];switch(p.type){case Ye:case ff:l=p.I;m=p.J;$a(b,l,m,0,0);break;case gf:Yd(l,m,p.rc,p.Kc,p.mh,p.nh,p.I,p.J,.5,b);l=p.I;m=p.J;break;case hf:be(l,m,p.rc,p.Kc,p.I,p.J,.5,b);l=p.I;m=p.J;break;case jf:case kf:var q= +p.type===jf?lf(p,f):mf(p,f,l,m),r=q.length;if(0===r){l=p.na;m=p.ua;$a(b,l,m,0,0);break}for(var p=null,s=0;s<r;s++)p=q[s],Yd(p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7],.5,b);null!==p&&(l=p[6],m=p[7]);break;default:v.k("Unknown Segment type: "+p.type)}}}break;default:v.k("Unknown Geometry type: "+a.type)}}ve.prototype.normalize=ve.prototype.normalize=function(){this.D&&v.ka(this);var a=this.tG();this.offset(-a.x,-a.y);return new z(-a.x,-a.y)}; +ve.prototype.offset=ve.prototype.offset=function(a,b){this.D&&v.ka(this);this.transform(1,0,0,1,a,b);return this};ve.prototype.scale=ve.prototype.scale=function(a,b){this.D&&v.ka(this);this.transform(a,0,0,b,0,0);return this};ve.prototype.rotate=ve.prototype.rotate=function(a,b,c){this.D&&v.ka(this);void 0===b&&(b=0);void 0===c&&(c=0);var d=v.rh();d.reset();d.rotate(a,b,c);this.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy);v.$e(d);return this}; +ve.prototype.transform=ve.prototype.transform=function(a,b,c,d,e,f){var h=0,k=0;switch(this.type){case Ie:case Je:case Ke:h=this.vc;k=this.Cc;this.vc=h*a+k*c+e;this.Cc=h*b+k*d+f;h=this.vb;k=this.Bb;this.vb=h*a+k*c+e;this.Bb=h*b+k*d+f;break;case Fe:for(var l=this.Ub.n,m=l.length,n=0;n<m;n++){var p=l[n],h=p.Aa,k=p.xa;p.Aa=h*a+k*c+e;p.xa=h*b+k*d+f;for(var p=p.sb.n,q=p.length,r=0;r<q;r++){var s=p[r];switch(s.type){case Ye:case ff:h=s.I;k=s.J;s.I=h*a+k*c+e;s.J=h*b+k*d+f;break;case gf:h=s.rc;k=s.Kc;s.rc= +h*a+k*c+e;s.Kc=h*b+k*d+f;h=s.mh;k=s.nh;s.mh=h*a+k*c+e;s.nh=h*b+k*d+f;h=s.I;k=s.J;s.I=h*a+k*c+e;s.J=h*b+k*d+f;break;case hf:h=s.rc;k=s.Kc;s.rc=h*a+k*c+e;s.Kc=h*b+k*d+f;h=s.I;k=s.J;s.I=h*a+k*c+e;s.J=h*b+k*d+f;break;case jf:h=s.na;k=s.ua;s.na=h*a+k*c+e;s.ua=h*b+k*d+f;0!==b&&(h=180*Math.atan2(b,a)/Math.PI,0>h&&(h+=360),s.xe+=h);0>a&&(s.xe=180-s.xe,s.Af=-s.Af);0>d&&(s.xe=-s.xe,s.Af=-s.Af);s.radiusX*=Math.sqrt(a*a+c*c);void 0!==s.radiusY&&(s.radiusY*=Math.sqrt(b*b+d*d));break;case kf:h=s.I;k=s.J;s.I=h* +a+k*c+e;s.J=h*b+k*d+f;0!==b&&(h=180*Math.atan2(b,a)/Math.PI,0>h&&(h+=360),s.gj+=h);0>a&&(s.gj=180-s.gj,s.tl=!s.tl);0>d&&(s.gj=-s.gj,s.tl=!s.tl);s.radiusX*=Math.sqrt(a*a+c*c);s.radiusY*=Math.sqrt(b*b+d*d);break;default:v.k("Unknown Segment type: "+s.type)}}}}this.$a=!0;return this}; +ve.prototype.Fa=function(a,b,c,d){var e=a.x,f=a.y,h=this.mb.x-20;a=a.y;for(var k=0,l=0,m=0,n=0,p=0,q=0,r=this.Ub.n,s=r.length,t=0;t<s;t++){var u=r[t];if(u.ut){if(c&&u.Fa(e,f,b))return!0;for(var x=u.sb,l=u.Aa,m=u.xa,w=l,y=m,B=x.n,H=0;H<=x.length;H++){var C,T;H!==x.length?(C=B[H],T=C.type,p=C.I,q=C.J):(T=Ye,p=w,q=y);switch(T){case ff:n=nf(e,f,h,a,l,m,w,y);if(isNaN(n))return!0;k+=n;w=p;y=q;break;case Ye:n=nf(e,f,h,a,l,m,p,q);if(isNaN(n))return!0;k+=n;break;case gf:n=ee(l,m,C.rc,C.Kc,C.mh,C.nh,p,q,h, +a,e,f,.5);k+=n;break;case hf:n=ee(l,m,(l+2*C.rc)/3,(m+2*C.Kc)/3,(2*C.rc+p)/3,(2*C.Kc+q)/3,p,q,h,a,e,f,.5);k+=n;break;case jf:case kf:T=C.type===jf?lf(C,u):mf(C,u,l,m);var ba=T.length;if(0===ba){n=nf(e,f,h,a,l,m,C.na,C.ua);if(isNaN(n))return!0;k+=n;break}for(var U=null,M=0;M<ba;M++){U=T[M];if(0===M){n=nf(e,f,h,a,l,m,U[0],U[1]);if(isNaN(n))return!0;k+=n}n=ee(U[0],U[1],U[2],U[3],U[4],U[5],U[6],U[7],h,a,e,f,.5);k+=n}null!==U&&(p=U[6],q=U[7]);break;default:v.k("Unknown Segment type: "+C.type)}l=p;m=q}if(0!== +k)return!0;k=0}else if(u.Fa(e,f,d?b:b+2))return!0}return 0!==k};function nf(a,b,c,d,e,f,h,k){if(Md(e,f,h,k,.05,a,b))return NaN;var l=(a-c)*(f-k);if(0===l)return 0;var m=((a*d-b*c)*(e-h)-(a-c)*(e*k-f*h))/l;b=(a*d-b*c)*(f-k)/l;if(m>=a)return 0;if((e>h?e-h:h-e)<(f>k?f-k:k-f)){if(e=a=0,f<k?(a=f,e=k):(a=k,e=f),b<a||b>e)return 0}else if(e<h?(a=e,e=h):a=h,m<a||m>e)return 0;return 0<l?1:-1}function vf(a,b,c,d){a=a.Ub.n;for(var e=a.length,f=0;f<e;f++)if(a[f].Fa(b,c,d))return!0;return!1} +ve.prototype.getPointAlongPath=function(a){(0>a||1<a)&&v.va(a,"0 <= fraction <= 1",ve,"getPointAlongPath:fraction");var b=this.Ub.first(),c=v.jb(),d=[];d.push(b.Aa);d.push(b.xa);for(var e=b.Aa,f=b.xa,h=e,k=f,l=b.sb.n,m=l.length,n=0;n<m;n++){var p=l[n];switch(p.ia){case ff:c.push(d);d=[];d.push(p.I);d.push(p.J);e=p.I;f=p.J;h=e;k=f;break;case Ye:d.push(p.I);d.push(p.J);e=p.I;f=p.J;break;case gf:Zd(e,f,p.sd,p.Fe,p.Yg,p.ng,p.vb,p.Bb,.5,d);e=p.I;f=p.J;break;case hf:ce(e,f,p.sd,p.Fe,p.vb,p.Bb,.5,d);e=p.I; +f=p.J;break;case jf:var q=lf(p,b),r=q.length;if(0===r){d.push(p.na);d.push(p.ua);e=p.na;f=p.ua;break}for(var s=0;s<r;s++){var t=q[s];Zd(e,f,t[2],t[3],t[4],t[5],t[6],t[7],.5,d);e=t[6];f=t[7]}break;case kf:q=mf(p,b,e,f);r=q.length;for(s=0;s<r;s++)t=q[s],Zd(e,f,t[2],t[3],t[4],t[5],t[6],t[7],.5,d),e=t[6],f=t[7];break;default:v.k("Segment not of valid type")}p.Eh&&(d.push(h),d.push(k))}c.push(d);q=0;h=c.length;for(k=d=b=0;k<h;k++)for(l=c[k],m=l.length,n=0;n<m;n+=2)e=l[n],f=l[n+1],0!==n&&(p=Math.sqrt(Ta(b, +d,e,f)),q+=p),b=e,d=f;a*=q;for(k=q=0;k<h;k++)for(l=c[k],m=l.length,n=0;n<m;n++){e=l[n];f=l[n+1];if(0!==n){p=Math.sqrt(Ta(b,d,e,f));if(q+p>a)return n=(a-q)/p,v.sa(c),new z(b+(e-b)*n,d+(f-d)*n);q+=p}b=e;d=f}v.sa(c);return null};v.defineProperty(ve,{type:"type"},function(){return this.ia},function(a){this.ia!==a&&(this.D&&v.ka(this,a),this.ia=a,this.$a=!0)});v.defineProperty(ve,{Aa:"startX"},function(){return this.vc},function(a){this.vc!==a&&(this.D&&v.ka(this,a),this.vc=a,this.$a=!0)}); +v.defineProperty(ve,{xa:"startY"},function(){return this.Cc},function(a){this.Cc!==a&&(this.D&&v.ka(this,a),this.Cc=a,this.$a=!0)});v.defineProperty(ve,{I:"endX"},function(){return this.vb},function(a){this.vb!==a&&(this.D&&v.ka(this,a),this.vb=a,this.$a=!0)});v.defineProperty(ve,{J:"endY"},function(){return this.Bb},function(a){this.Bb!==a&&(this.D&&v.ka(this,a),this.Bb=a,this.$a=!0)}); +v.defineProperty(ve,{Ub:"figures"},function(){return this.mj},function(a){this.mj!==a&&(this.D&&v.ka(this,a),this.mj=a,this.$a=!0)});ve.prototype.add=ve.prototype.add=function(a){this.mj.add(a);return this};ve.prototype.setSpots=function(a,b,c,d,e,f,h,k){this.D&&v.ka(this);this.Oh=(new L(a,b,e,f)).freeze();this.Ph=(new L(c,d,h,k)).freeze();return this};v.defineProperty(ve,{B:"spot1"},function(){return this.Oh},function(a){this.D&&v.ka(this,a);this.Oh=a.S()}); +v.defineProperty(ve,{C:"spot2"},function(){return this.Ph},function(a){this.D&&v.ka(this,a);this.Ph=a.S()});v.defineProperty(ve,{Jd:"defaultStretch"},function(){return this.ni},function(a){this.D&&v.ka(this,a);this.ni=a});v.u(ve,{mb:"bounds"},function(){this.Gz()&&(this.BA(),this.ah());return this.Cu});function Ge(a,b,c,d){v.dc(this);this.D=!1;void 0===c&&(c=!0);this.Sl=c;void 0===d&&(d=!0);this.Tn=d;this.vc=void 0!==a?a:0;this.Cc=void 0!==b?b:0;this.po=new I(wf);this.Rv=this.po.F;this.$a=!0} +v.ea("PathFigure",Ge);v.Vh(Ge);Ge.prototype.copy=function(){var a=new Ge;a.Sl=this.Sl;a.Tn=this.Tn;a.vc=this.vc;a.Cc=this.Cc;for(var b=this.po.n,c=b.length,d=a.po,e=0;e<c;e++){var f=b[e].copy();d.add(f)}a.Rv=this.Rv;a.$a=this.$a;return a};Ge.prototype.equalsApprox=Ge.prototype.Fc=function(a){if(!(a instanceof Ge&&K(this.Aa,a.Aa)&&K(this.xa,a.xa)))return!1;var b=this.sb.n;a=a.sb.n;var c=b.length;if(c!==a.length)return!1;for(var d=0;d<c;d++)if(!b[d].Fc(a[d]))return!1;return!0};g=Ge.prototype; +g.toString=function(a){void 0===a&&(a=-1);for(var b=0>a?"M"+this.Aa.toString()+" "+this.xa.toString():"M"+this.Aa.toFixed(a)+" "+this.xa.toFixed(a),c=this.sb.n,d=c.length,e=0;e<d;e++)b+=" "+c[e].toString(a);return b};g.freeze=function(){this.D=!0;var a=this.sb;a.freeze();for(var b=a.n,a=a.length,c=0;c<a;c++)b[c].freeze();return this};g.Oa=function(){this.D=!1;var a=this.sb;a.Oa();for(var a=a.n,b=a.length,c=0;c<b;c++)a[c].Oa();return this}; +g.Gz=function(){if(this.$a)return!0;var a=this.sb;if(this.Rv!==a.F)return!0;for(var a=a.n,b=a.length,c=0;c<b;c++)if(a[c].$a)return!0;return!1};g.BA=function(){this.$a=!1;var a=this.sb;this.Rv=a.F;for(var a=a.n,b=a.length,c=0;c<b;c++){var d=a[c];d.$a=!1;d.cg=null}};v.defineProperty(Ge,{ut:"isFilled"},function(){return this.Sl},function(a){this.D&&v.ka(this,a);this.Sl=a});v.defineProperty(Ge,{wl:"isShadowed"},function(){return this.Tn},function(a){this.D&&v.ka(this,a);this.Tn=a}); +v.defineProperty(Ge,{Aa:"startX"},function(){return this.vc},function(a){this.D&&v.ka(this,a);this.vc=a;this.$a=!0});v.defineProperty(Ge,{xa:"startY"},function(){return this.Cc},function(a){this.D&&v.ka(this,a);this.Cc=a;this.$a=!0});v.defineProperty(Ge,{sb:"segments"},function(){return this.po},function(a){this.D&&v.ka(this,a);this.po=a;this.$a=!0});Ge.prototype.add=Ge.prototype.add=function(a){this.po.add(a);return this}; +Ge.prototype.Fa=function(a,b,c){for(var d=this.Aa,e=this.xa,f=d,h=e,k=this.sb.n,l=k.length,m=0;m<l;m++){var n=k[m];switch(n.type){case ff:f=n.I;h=n.J;d=n.I;e=n.J;break;case Ye:if(Md(d,e,n.I,n.J,c,a,b))return!0;d=n.I;e=n.J;break;case gf:if(Xd(d,e,n.rc,n.Kc,n.mh,n.nh,n.I,n.J,.5,a,b,c))return!0;d=n.I;e=n.J;break;case hf:if(ae(d,e,n.rc,n.Kc,n.I,n.J,.5,a,b,c))return!0;d=n.I;e=n.J;break;case jf:case kf:var p=n.type===jf?lf(n,this):mf(n,this,d,e),q=p.length;if(0===q){if(Md(d,e,n.na,n.ua,c,a,b))return!0; +d=n.na;e=n.ua;break}for(var r=null,s=0;s<q;s++)if(r=p[s],0===s&&Md(d,e,r[0],r[1],c,a,b)||Xd(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],.5,a,b,c))return!0;null!==r&&(d=r[6],e=r[7]);break;default:v.k("Unknown Segment type: "+n.type)}if(n.Hw&&(d!==f||e!==h)&&Md(d,e,f,h,c,a,b))return!0}return!1}; +function wf(a,b,c,d,e,f,h,k){v.dc(this);this.D=!1;void 0===a&&(a=Ye);this.ia=a;this.vb=void 0!==b?b:0;this.Bb=void 0!==c?c:0;void 0===d&&(d=0);void 0===e&&(e=0);void 0===f&&(f=0);void 0===h&&(h=0);a===kf?(a=f%360,0>a&&(a+=360),this.sd=a,this.Fe=0,this.Yg=Math.max(d,0),this.ng=Math.max(e,0),this.Yn="boolean"===typeof h?!!h:!1,this.qn=!!k):(this.sd=d,this.Fe=e,a===jf&&(f=Math.max(f,0)),this.Yg=f,"number"===typeof h?(a===jf&&(h=Math.max(h,0)),this.ng=h):this.ng=0,this.qn=this.Yn=!1);this.Eh=!1;this.$a= +!0;this.cg=null}v.ea("PathSegment",wf);v.Vh(wf);wf.prototype.copy=function(){var a=new wf;a.ia=this.ia;a.vb=this.vb;a.Bb=this.Bb;a.sd=this.sd;a.Fe=this.Fe;a.Yg=this.Yg;a.ng=this.ng;a.Yn=this.Yn;a.qn=this.qn;a.Eh=this.Eh;a.$a=this.$a;return a}; +wf.prototype.equalsApprox=wf.prototype.Fc=function(a){if(!(a instanceof wf)||this.type!==a.type||this.Hw!==a.Hw)return!1;switch(this.type){case ff:case Ye:return K(this.I,a.I)&&K(this.J,a.J);case gf:return K(this.I,a.I)&&K(this.J,a.J)&&K(this.rc,a.rc)&&K(this.Kc,a.Kc)&&K(this.mh,a.mh)&&K(this.nh,a.nh);case hf:return K(this.I,a.I)&&K(this.J,a.J)&&K(this.rc,a.rc)&&K(this.Kc,a.Kc);case jf:return K(this.xe,a.xe)&&K(this.Af,a.Af)&&K(this.na,a.na)&&K(this.ua,a.ua)&&K(this.radiusX,a.radiusX)&&K(this.radiusY, +a.radiusY);case kf:return this.tl===a.tl&&this.Kw===a.Kw&&K(this.gj,a.gj)&&K(this.I,a.I)&&K(this.J,a.J)&&K(this.radiusX,a.radiusX)&&K(this.radiusY,a.radiusY);default:return!1}}; +wf.prototype.toString=function(a){void 0===a&&(a=-1);var b="";switch(this.type){case ff:b=0>a?"M"+this.I.toString()+" "+this.J.toString():"M"+this.I.toFixed(a)+" "+this.J.toFixed(a);break;case Ye:b=0>a?"L"+this.I.toString()+" "+this.J.toString():"L"+this.I.toFixed(a)+" "+this.J.toFixed(a);break;case gf:b=0>a?"C"+this.rc.toString()+" "+this.Kc.toString()+" "+this.mh.toString()+" "+this.nh.toString()+" "+this.I.toString()+" "+this.J.toString():"C"+this.rc.toFixed(a)+" "+this.Kc.toFixed(a)+" "+this.mh.toFixed(a)+ +" "+this.nh.toFixed(a)+" "+this.I.toFixed(a)+" "+this.J.toFixed(a);break;case hf:b=0>a?"Q"+this.rc.toString()+" "+this.Kc.toString()+" "+this.I.toString()+" "+this.J.toString():"Q"+this.rc.toFixed(a)+" "+this.Kc.toFixed(a)+" "+this.I.toFixed(a)+" "+this.J.toFixed(a);break;case jf:b=0>a?"B"+this.xe.toString()+" "+this.Af.toString()+" "+this.na.toString()+" "+this.ua.toString()+" "+this.radiusX:"B"+this.xe.toFixed(a)+" "+this.Af.toFixed(a)+" "+this.na.toFixed(a)+" "+this.ua.toFixed(a)+" "+this.radiusX; +break;case kf:b=0>a?"A"+this.radiusX.toString()+" "+this.radiusY.toString()+" "+this.gj.toString()+" "+(this.Kw?1:0)+" "+(this.tl?1:0)+" "+this.I.toString()+" "+this.J.toString():"A"+this.radiusX.toFixed(a)+" "+this.radiusY.toFixed(a)+" "+this.gj.toFixed(a)+" "+(this.Kw?1:0)+" "+(this.tl?1:0)+" "+this.I.toFixed(a)+" "+this.J.toFixed(a);break;default:b=this.type.toString()}return b+(this.Eh?"z":"")};var ff;wf.Move=ff=v.p(wf,"Move",0);var Ye;wf.Line=Ye=v.p(wf,"Line",1);var gf; +wf.Bezier=gf=v.p(wf,"Bezier",2);var hf;wf.QuadraticBezier=hf=v.p(wf,"QuadraticBezier",3);var jf;wf.Arc=jf=v.p(wf,"Arc",4);var kf;wf.SvgArc=kf=v.p(wf,"SvgArc",4);wf.prototype.freeze=function(){this.D=!0;return this};wf.prototype.Oa=function(){this.D=!1;return this};wf.prototype.close=wf.prototype.close=function(){this.Eh=!0;return this}; +function lf(a,b){if(null!==a.cg&&!1===b.$a)return a.cg;var c=a.radiusX,d=a.radiusY;void 0===d&&(d=c);if(0===c||0===d)return a.cg=[],a.cg;var e=a.sd,f=a.Fe,h=se(c<d?c:d,a.xe,a.xe+a.Af,!1);if(c!==d){var k=v.rh();k.reset();c<d?k.scale(1,d/c):k.scale(c/d,1);df(h,k);v.$e(k)}c=h.length;for(d=0;d<c;d++)k=h[d],k[0]+=e,k[1]+=f,k[2]+=e,k[3]+=f,k[4]+=e,k[5]+=f,k[6]+=e,k[7]+=f;a.cg=h;return a.cg} +function mf(a,b,c,d){function e(a,b,c,d){return(a*d<b*c?-1:1)*Math.acos((a*c+b*d)/(Math.sqrt(a*a+b*b)*Math.sqrt(c*c+d*d)))}if(null!==a.cg&&!1===b.$a)return a.cg;b=a.Yg;var f=a.ng;if(0===b||0===f)return a.cg=[],a.cg;var h=Math.PI/180*a.sd,k=a.Yn,l=a.qn,m=a.vb,n=a.Bb,p=Math.cos(h),q=Math.sin(h),r=p*(c-m)/2+q*(d-n)/2,h=-q*(c-m)/2+p*(d-n)/2,s=r*r/(b*b)+h*h/(f*f);1<s&&(b*=Math.sqrt(s),f*=Math.sqrt(s));s=(k===l?-1:1)*Math.sqrt((b*b*f*f-b*b*h*h-f*f*r*r)/(b*b*h*h+f*f*r*r));isNaN(s)&&(s=0);k=s*b*h/f;s=s*-f* +r/b;isNaN(k)&&(k=0);isNaN(s)&&(s=0);c=(c+m)/2+p*k-q*s;d=(d+n)/2+q*k+p*s;n=e(1,0,(r-k)/b,(h-s)/f);p=(r-k)/b;m=(h-s)/f;r=(-r-k)/b;k=(-h-s)/f;h=e(p,m,r,k);r=(p*r+m*k)/(Math.sqrt(p*p+m*m)*Math.sqrt(r*r+k*k));-1>=r?h=Math.PI:1<=r&&(h=0);!l&&0<h&&(h-=2*Math.PI);l&&0>h&&(h+=2*Math.PI);l=b>f?1:b/f;r=b>f?f/b:1;b=se(b>f?b:f,n,n+h,!0);f=v.rh();f.reset();f.translate(c,d);f.rotate(a.sd,0,0);f.scale(l,r);df(b,f);v.$e(f);a.cg=b;return a.cg} +v.defineProperty(wf,{Hw:"isClosed"},function(){return this.Eh},function(a){this.Eh!==a&&(this.Eh=a,this.$a=!0)});v.defineProperty(wf,{type:"type"},function(){return this.ia},function(a){this.D&&v.ka(this,a);this.ia=a;this.$a=!0});v.defineProperty(wf,{I:"endX"},function(){return this.vb},function(a){this.D&&v.ka(this,a);this.vb=a;this.$a=!0});v.defineProperty(wf,{J:"endY"},function(){return this.Bb},function(a){this.D&&v.ka(this,a);this.Bb=a;this.$a=!0}); +v.defineProperty(wf,{rc:"point1X"},function(){return this.sd},function(a){this.D&&v.ka(this,a);this.sd=a;this.$a=!0});v.defineProperty(wf,{Kc:"point1Y"},function(){return this.Fe},function(a){this.D&&v.ka(this,a);this.Fe=a;this.$a=!0});v.defineProperty(wf,{mh:"point2X"},function(){return this.Yg},function(a){this.D&&v.ka(this,a);this.Yg=a;this.$a=!0});v.defineProperty(wf,{nh:"point2Y"},function(){return this.ng},function(a){this.D&&v.ka(this,a);this.ng=a;this.$a=!0}); +v.defineProperty(wf,{na:"centerX"},function(){return this.sd},function(a){this.D&&v.ka(this,a);this.sd=a;this.$a=!0});v.defineProperty(wf,{ua:"centerY"},function(){return this.Fe},function(a){this.D&&v.ka(this,a);this.Fe=a;this.$a=!0});v.defineProperty(wf,{radiusX:"radiusX"},function(){return this.Yg},function(a){0>a&&v.va(a,">= zero",wf,"radiusX");this.D&&v.ka(this,a);this.Yg=a;this.$a=!0}); +v.defineProperty(wf,{radiusY:"radiusY"},function(){return this.ng},function(a){0>a&&v.va(a,">= zero",wf,"radiusY");this.D&&v.ka(this,a);this.ng=a;this.$a=!0});v.defineProperty(wf,{xe:"startAngle"},function(){return this.vb},function(a){this.vb!==a&&(this.D&&v.ka(this,a),a%=360,0>a&&(a+=360),this.vb=a,this.$a=!0)});v.defineProperty(wf,{Af:"sweepAngle"},function(){return this.Bb},function(a){this.D&&v.ka(this,a);360<a&&(a=360);-360>a&&(a=-360);this.Bb=a;this.$a=!0}); +v.defineProperty(wf,{tl:"isClockwiseArc"},function(){return this.qn},function(a){this.D&&v.ka(this,a);this.qn=a;this.$a=!0});v.defineProperty(wf,{Kw:"isLargeArc"},function(){return this.Yn},function(a){this.D&&v.ka(this,a);this.Yn=a;this.$a=!0});v.defineProperty(wf,{gj:"xAxisRotation"},function(){return this.sd},function(a){a%=360;0>a&&(a+=360);this.D&&v.ka(this,a);this.sd=a;this.$a=!0}); +function xf(){this.W=null;this.Ty=(new z(0,0)).freeze();this.Xx=(new z(0,0)).freeze();this.yu=this.uv=0;this.zu=1;this.jv="";this.aw=this.Pu=!1;this.Lu=this.Bu=0;this.ij=this.Xu=this.gv=!1;this.Dq=null;this.Zv=0;this.pg=this.Yv=null}v.ea("InputEvent",xf); +xf.prototype.copy=function(){var a=new xf;a.W=this.W;a.Ty.assign(this.jf);a.Xx.assign(this.ca);a.uv=this.uv;a.yu=this.yu;a.zu=this.zu;a.jv=this.jv;a.Pu=this.Pu;a.aw=this.aw;a.Bu=this.Bu;a.Lu=this.Lu;a.gv=this.gv;a.Xu=this.Xu;a.ij=this.ij;a.Dq=this.Dq;a.Zv=this.Zv;a.Yv=this.Yv;a.pg=this.pg;return a}; +xf.prototype.toString=function(){var a="^";0!==this.od&&(a+="M:"+this.od);0!==this.button&&(a+="B:"+this.button);""!==this.key&&(a+="K:"+this.key);0!==this.Ge&&(a+="C:"+this.Ge);0!==this.il&&(a+="D:"+this.il);this.zc&&(a+="h");this.bubbles&&(a+="b");null!==this.ca&&(a+="@"+this.ca.toString());return a};v.defineProperty(xf,{g:"diagram"},function(){return this.W},function(a){this.W=a});v.defineProperty(xf,{jf:"viewPoint"},function(){return this.Ty},function(a){v.A(a,z,xf,"viewPoint");this.Ty.assign(a)}); +v.defineProperty(xf,{ca:"documentPoint"},function(){return this.Xx},function(a){v.A(a,z,xf,"documentPoint");this.Xx.assign(a)});v.defineProperty(xf,{od:"modifiers"},function(){return this.uv},function(a){this.uv=a});v.defineProperty(xf,{button:"button"},function(){return this.yu},function(a){this.yu=a;if(null===this.event)switch(a){case 0:this.buttons=1;break;case 1:this.buttons=4;break;case 2:this.buttons=2}}); +v.defineProperty(xf,{buttons:"buttons"},function(){return this.zu},function(a){this.zu=a});v.defineProperty(xf,{key:"key"},function(){return this.jv},function(a){this.jv=a});v.defineProperty(xf,{kl:"down"},function(){return this.Pu},function(a){this.Pu=a});v.defineProperty(xf,{up:"up"},function(){return this.aw},function(a){this.aw=a});v.defineProperty(xf,{Ge:"clickCount"},function(){return this.Bu},function(a){this.Bu=a}); +v.defineProperty(xf,{il:"delta"},function(){return this.Lu},function(a){this.Lu=a});v.defineProperty(xf,{wt:"isMultiTouch"},function(){return this.gv},function(a){this.gv=a});v.defineProperty(xf,{zc:"handled"},function(){return this.Xu},function(a){this.Xu=a});v.defineProperty(xf,{bubbles:"bubbles"},function(){return this.ij},function(a){this.ij=a});v.defineProperty(xf,{event:"event"},function(){return this.Dq},function(a){this.Dq=a}); +v.u(xf,{Xi:"isTouchEvent"},function(){var a=window.TouchEvent;return a&&this.event instanceof a?!0:(a=window.PointerEvent)&&this.event instanceof a&&"touch"===this.event.pointerType});v.u(xf,{bk:"isMac"},function(){return v.bk});v.defineProperty(xf,{timestamp:"timestamp"},function(){return this.Zv},function(a){this.Zv=a});v.defineProperty(xf,{Jg:"targetDiagram"},function(){return this.Yv},function(a){this.Yv=a}); +v.defineProperty(xf,{ye:"targetObject"},function(){return this.pg},function(a){this.pg=a});v.defineProperty(xf,{control:"control"},function(){return 0!==(this.od&1)},function(a){this.od=a?this.od|1:this.od&-2});v.defineProperty(xf,{shift:"shift"},function(){return 0!==(this.od&4)},function(a){this.od=a?this.od|4:this.od&-5});v.defineProperty(xf,{alt:"alt"},function(){return 0!==(this.od&2)},function(a){this.od=a?this.od|2:this.od&-3}); +v.defineProperty(xf,{Ft:"meta"},function(){return 0!==(this.od&8)},function(a){this.od=a?this.od|8:this.od&-9});v.defineProperty(xf,{left:"left"},function(){var a=this.event;return null!==a&&a instanceof MouseEvent&&("mousedown"===a.type||"mouseup"===a.type)?0===this.button:0!==(this.buttons&1)},function(a){this.buttons=a?this.buttons|1:this.buttons&-2}); +v.defineProperty(xf,{right:"right"},function(){var a=this.event;return null!==a&&a instanceof MouseEvent&&("mousedown"===a.type||"mouseup"===a.type)?2===this.button:0!==(this.buttons&2)},function(a){this.buttons=a?this.buttons|2:this.buttons&-3});v.defineProperty(xf,{iK:"middle"},function(){var a=this.event;return null!==a&&a instanceof MouseEvent&&("mousedown"===a.type||"mouseup"===a.type)?1===this.button:0!==(this.buttons&4)},function(a){this.buttons=a?this.buttons|4:this.buttons&-5}); +function yf(){this.W=null;this.Ob="";this.Dv=this.Wv=null;this.Au=!1}v.ea("DiagramEvent",yf);yf.prototype.copy=function(){var a=new yf;a.W=this.W;a.Ob=this.Ob;a.Wv=this.Wv;a.Dv=this.Dv;a.Au=this.Au;return a};yf.prototype.toString=function(){var a="*"+this.name;this.cancel&&(a+="x");null!==this.tA&&(a+=":"+this.tA.toString());null!==this.Zz&&(a+="("+this.Zz.toString()+")");return a};v.defineProperty(yf,{g:"diagram"},function(){return this.W},function(a){this.W=a}); +v.defineProperty(yf,{name:"name"},function(){return this.Ob},function(a){this.Ob=a});v.defineProperty(yf,{tA:"subject"},function(){return this.Wv},function(a){this.Wv=a});v.defineProperty(yf,{Zz:"parameter"},function(){return this.Dv},function(a){this.Dv=a});v.defineProperty(yf,{cancel:"cancel"},function(){return this.Au},function(a){this.Au=a});function zf(){this.aq=Af;this.jm=this.tv="";this.Br=this.Cr=this.Fr=this.Gr=this.Er=this.W=this.Vd=null}v.ea("ChangedEvent",zf);var Bf; +zf.Transaction=Bf=v.p(zf,"Transaction",-1);var Af;zf.Property=Af=v.p(zf,"Property",0);var Cf;zf.Insert=Cf=v.p(zf,"Insert",1);var Df;zf.Remove=Df=v.p(zf,"Remove",2);zf.prototype.clear=zf.prototype.clear=function(){this.Br=this.Cr=this.Fr=this.Gr=this.Er=this.W=this.Vd=null}; +zf.prototype.copy=function(){var a=new zf;a.aq=this.aq;a.tv=this.tv;a.jm=this.jm;a.Vd=this.Vd;a.W=this.W;a.Er=this.Er;var b=this.Gr;a.Gr=v.Ta(b)&&"function"===typeof b.S?b.S():b;b=this.Fr;a.Fr=v.Ta(b)&&"function"===typeof b.S?b.S():b;b=this.Cr;a.Cr=v.Ta(b)&&"function"===typeof b.S?b.S():b;b=this.Br;a.Br=v.Ta(b)&&"function"===typeof b.S?b.S():b;return a}; +zf.prototype.toString=function(){var a="",a=this.wc===Bf?a+"* ":this.wc===Af?a+(null!==this.ba?"!m":"!d"):a+((null!==this.ba?"!m":"!d")+this.wc);this.propertyName&&"string"===typeof this.propertyName&&(a+=" "+this.propertyName);this.hf&&this.hf!==this.propertyName&&(a+=" "+this.hf);a+=": ";this.wc===Bf?null!==this.oldValue&&(a+=" "+this.oldValue):(null!==this.object&&(a+=Ef(this.object)),null!==this.oldValue&&(a+=" old: "+Ef(this.oldValue)),null!==this.Cg&&(a+=" "+this.Cg),null!==this.newValue&& +(a+=" new: "+Ef(this.newValue)),null!==this.Ag&&(a+=" "+this.Ag));return a};zf.prototype.getValue=zf.prototype.ja=function(a){return a?this.oldValue:this.newValue};zf.prototype.getParam=function(a){return a?this.Cg:this.Ag};zf.prototype.canUndo=zf.prototype.canUndo=function(){return null!==this.ba||null!==this.g?!0:!1};zf.prototype.undo=zf.prototype.undo=function(){this.canUndo()&&(null!==this.ba?this.ba.Bm(this,!0):null!==this.g&&this.g.Bm(this,!0))}; +zf.prototype.canRedo=zf.prototype.canRedo=function(){return null!==this.ba||null!==this.g?!0:!1};zf.prototype.redo=zf.prototype.redo=function(){this.canRedo()&&(null!==this.ba?this.ba.Bm(this,!1):null!==this.g&&this.g.Bm(this,!1))};v.defineProperty(zf,{ba:"model"},function(){return this.Vd},function(a){this.Vd=a});v.defineProperty(zf,{g:"diagram"},function(){return this.W},function(a){this.W=a});v.defineProperty(zf,{wc:"change"},function(){return this.aq},function(a){this.aq=a}); +v.defineProperty(zf,{hf:"modelChange"},function(){return this.tv},function(a){this.tv=a});v.defineProperty(zf,{propertyName:"propertyName"},function(){return this.jm},function(a){this.jm=a});v.u(zf,{lE:"isTransactionFinished"},function(){return this.aq===Bf&&("CommittedTransaction"===this.jm||"FinishedUndo"===this.jm||"FinishedRedo"===this.jm)});v.defineProperty(zf,{object:"object"},function(){return this.Er},function(a){this.Er=a}); +v.defineProperty(zf,{oldValue:"oldValue"},function(){return this.Gr},function(a){this.Gr=a});v.defineProperty(zf,{Cg:"oldParam"},function(){return this.Fr},function(a){this.Fr=a});v.defineProperty(zf,{newValue:"newValue"},function(){return this.Cr},function(a){this.Cr=a});v.defineProperty(zf,{Ag:"newParam"},function(){return this.Br},function(a){this.Br=a}); +function F(a){1<arguments.length&&v.k("Model constructor can only take one optional argument, the Array of node data.");v.dc(this);this.pq=this.Ob="";this.ti=!1;this.Ay={};this.If=[];this.uc=new na(null,Object);this.Fj="key";this.vn=this.bo=null;this.hq=this.Eu=!1;this.Sp=null;this.em="category";this.oi=new na(null,J);this.zj=null;this.Ii=!1;this.Sy=null;this.la=new Ff;void 0!==a&&(this.Yf=a)}v.ea("Model",F); +F.prototype.cloneProtected=function(a){a.Ob=this.Ob;a.pq=this.pq;a.ti=this.ti;a.Fj=this.Fj;a.bo=this.bo;a.vn=this.vn;a.VI=this.Eu;a.hq=this.hq;a.Sp=this.Sp;a.em=this.em};F.prototype.copy=function(){var a=new this.constructor;this.cloneProtected(a);return a};F.prototype.clear=F.prototype.clear=function(){this.If=[];this.uc.clear();this.oi.clear();this.la.clear()};g=F.prototype; +g.toString=function(a){void 0===a&&(a=0);if(1<a)return this.wA();var b=(""!==this.name?this.name:"")+" Model";if(0<a){b+="\n node data:";a=this.Yf;for(var c=v.Va(a),d=0;d<c;d++)var e=v.Qa(a,d),b=b+(" "+this.gb(e)+":"+Ef(e))}return b}; +g.fn=function(){var a="";""!==this.name&&(a+=',\n "name": '+this.quote(this.name));""!==this.gl&&(a+=',\n "dataFormat": '+this.quote(this.gl));this.ab&&(a+=',\n "isReadOnly": '+this.ab);"key"!==this.yl&&"string"===typeof this.yl&&(a+=',\n "nodeKeyProperty": '+this.quote(this.yl));this.iz&&(a+=',\n "copiesArrays": true');this.hz&&(a+=',\n "copiesArrayObjects": true');"category"!==this.Vm&&"string"===typeof this.Vm&&(a+=',\n "nodeCategoryProperty": '+this.quote(this.Vm));return a}; +g.Nt=function(a){a.name&&(this.name=a.name);a.dataFormat&&(this.gl=a.dataFormat);a.isReadOnly&&(this.ab=a.isReadOnly);a.nodeKeyProperty&&(this.yl=a.nodeKeyProperty);a.copiesArrays&&(this.iz=a.copiesArrays);a.copiesArrayObjects&&(this.hz=a.copiesArrayObjects);a.nodeCategoryProperty&&(this.Vm=a.nodeCategoryProperty)};function Gf(a){return',\n "modelData": '+Hf(a,a.ck)}function If(a,b){var c=b.modelData;v.Ta(c)&&(a.Qt(c),a.ck=c)} +g.EA=function(){var a=this.ck,b=!1,c;for(c in a)if(!Mf(c,a[c])){b=!0;break}a="";b&&(a=Gf(this));return a+',\n "nodeDataArray": '+Nf(this,this.Yf,!0)};g.bA=function(a){If(this,a);a=a.nodeDataArray;v.isArray(a)&&(this.Qt(a),this.Yf=a)}; +function Of(a,b,c,d){if(b===c)return!0;if(typeof b!==typeof c||"function"===typeof b||"function"===typeof c)return!1;if(Array.isArray(b)&&Array.isArray(c)){if(d.ja(b)===c)return!0;d.add(b,c);if(b.length!==c.length)return!1;for(var e=0;e<b.length;e++)if(!Of(a,b[e],c[e],d))return!1;return!0}if(v.Ta(b)&&v.Ta(c)){if(d.ja(b)===c)return!0;d.add(b,c);for(e in b){var f=b[e];if(!Mf(e,f)){var h=c[e];if(void 0===h||!Of(a,f,h,d))return!1}}for(var k in c)if(h=c[k],!Mf(k,h)&&(f=b[k],void 0===f||!Of(a,f,h,d)))return!1; +return!0}return!1}function Pf(a,b,c){a[c]!==b[c]&&v.k("Model.computeJsonDifference: Model."+c+' is not the same in both models: "'+a[c]+'" and "'+b[c]+'"')} +g.FA=function(a){Pf(this,a,"nodeKeyProperty");this instanceof Qf&&Pf(this,a,"nodeParentKeyProperty");for(var b=new J,c=new J,d=(new J).Tc(this.uc.nE),e=new na,f=a.Yf,h=0;h<f.length;h++){var k=f[h],l=a.gb(k);if(void 0!==l){d.remove(l);var m=this.ae(l);null===m?(b.add(l),c.add(k)):Of(this,m,k,e)||c.add(k)}else this.Mz(k),l=this.gb(k),b.add(l),c.add(k)}f="";Of(this,this.ck,a.ck,e)||(f+=Gf(this));0<b.count&&(f+=this.Fx+Nf(this,b.cc(),!0));0<c.count&&(f+=this.NA+Nf(this,c.cc(),!0));0<d.count&&(f+=this.Hx+ +Nf(this,d.cc(),!0));return f};F.prototype.computeJsonDifference=F.prototype.computeJSONDifference=function(a,b){v.A(a,F,F,"computeJsonDifference:newmodel");void 0===b&&(b=this.constructor===F?"go.Model":this.constructor===Q?"go.GraphLinksModel":this.constructor===Qf?"go.TreeModel":v.af(this));return'{ "class": '+this.quote(b)+', "incremental": 1'+this.fn()+this.FA(a)+"}"};g=F.prototype;g.Fx=',\n "insertedNodeKeys": ';g.NA=',\n "modifiedNodeData": ';g.Hx=',\n "removedNodeKeys": '; +g.DA=function(a,b){var c=this,d=!1,e=new J,f=new J,h=new J;a.Of.each(function(a){a.ba===c&&("nodeDataArray"===a.hf?a.wc===Cf?e.add(a.newValue):a.wc===Df&&h.add(a.oldValue):c.Je(a.object)?f.add(a.object):c.ck===a.object&&a.wc===Af&&(d=!0))});var k=new J;e.each(function(a){k.add(c.gb(a));b||f.add(a)});var l=new J;h.each(function(a){l.add(c.gb(a));b&&f.add(a)});var m="";d&&(m+=Gf(this));0<k.count&&(m+=(b?this.Hx:this.Fx)+Nf(this,k.cc(),!0));0<f.count&&(m+=this.NA+Nf(this,f.cc(),!0));0<l.count&&(m+=(b? +this.Fx:this.Hx)+Nf(this,l.cc(),!0));return m}; +g.aA=function(a){If(this,a);var b=a.insertedNodeKeys;if(v.isArray(b))for(var c=v.Va(b),d=0;d<c;d++){var e=v.Qa(b,d),f=this.ae(e);null===f&&(f=this.copyNodeData({}),this.nx(f,e),this.Zk(f))}b=a.modifiedNodeData;if(v.isArray(b))for(c=v.Va(b),d=0;d<c;d++){var h=v.Qa(b,d),e=this.gb(h),f=this.ae(e);if(null!==f)for(var k in h)"__gohashid"!==k&&k!==this.yl&&this.setDataProperty(f,k,h[k])}a=a.removedNodeKeys;if(v.isArray(a))for(c=v.Va(a),d=0;d<c;d++)e=v.Qa(a,d),f=this.ae(e),null!==f&&this.gx(f)}; +F.prototype.toIncrementalJson=F.prototype.toIncrementalJSON=function(a,b){v.A(a,zf,F,"toIncrementalJson:e");a.wc!==Bf&&v.k("Model.toIncrementalJson argument is not a Transaction ChangedEvent:"+a.toString());var c=a.object;if(!(a.lE&&c instanceof Rf))return'{ "incremental": 0 }';void 0===b&&(b=this.constructor===F?"go.Model":this.constructor===Q?"go.GraphLinksModel":this.constructor===Qf?"go.TreeModel":v.af(this));return'{ "class": '+this.quote(b)+', "incremental": 1'+this.fn()+this.DA(c,"FinishedUndo"=== +a.propertyName)+"}"};F.prototype.toJson=F.prototype.toJSON=F.prototype.wA=function(a){void 0===a&&(a=this.constructor===F?"go.Model":this.constructor===Q?"go.GraphLinksModel":this.constructor===Qf?"go.TreeModel":v.af(this));return'{ "class": '+this.quote(a)+this.fn()+this.EA()+"}"}; +F.prototype.applyIncrementalJson=F.prototype.applyIncrementalJSON=function(a){var b=null;if("string"===typeof a)if(window.JSON&&window.JSON.parse)try{b=window.JSON.parse(a)}catch(c){}else v.trace("WARNING: no JSON.parse available");else"object"===typeof a?b=a:v.k("Unable to modify a Model from: "+a);var d=b.incremental;"number"!==typeof d&&v.k("Unable to apply non-incremental changes to Model: "+a);0!==d&&(this.Qb("applyIncrementalJson"),this.aA(b),this.wd("applyIncrementalJson"))}; +F.fromJson=F.fromJSON=function(a,b){void 0===b&&(b=null);null!==b&&v.A(b,F,F,"fromJson:model");var c=null;if("string"===typeof a)if(window.JSON&&window.JSON.parse)try{c=window.JSON.parse(a)}catch(d){}else v.trace("WARNING: no JSON.parse available");else"object"===typeof a?c=a:v.k("Unable to construct a Model from: "+a);if(null===b){var e;e=null;var f=c["class"];if("string"===typeof f)try{var h=null;0===f.indexOf("go.")?(f=f.substr(3),h=ea[f]):(h=ea[f],void 0===h&&(h=window[f]));"function"===typeof h&& +(e=new h)}catch(k){}null===e||e instanceof F?b=e:v.k("Unable to construct a Model of declared class: "+c["class"])}null===b&&(b=new Q);b.Nt(c);b.bA(c);return b}; +F.prototype.replaceJsonObjects=F.prototype.Qt=function(a){if(v.isArray(a))for(var b=v.Va(a),c=0;c<b;c++){var d=v.Qa(a,c);v.Ta(d)&&v.kD(a,c,this.Qt(d))}else if(v.Ta(a)){for(c in a)if(d=a[c],v.Ta(d)&&(d=this.Qt(d),a[c]=d,"points"===c&&Array.isArray(d))){for(var e=0===d.length%2,f=0;f<d.length;f++)if("number"!==typeof d[f]){e=!1;break}if(e){e=new I(z);for(f=0;f<d.length/2;f++)e.add(new z(d[2*f],d[2*f+1]));e.freeze();a[c]=e}}if("object"===typeof a){c=a;d=a["class"];if("NaN"===d)c=NaN;else if("Date"=== +d)c=new Date(a.value);else if("go.Point"===d)c=new z(Sf(a.x),Sf(a.y));else if("go.Size"===d)c=new ia(Sf(a.width),Sf(a.height));else if("go.Rect"===d)c=new A(Sf(a.x),Sf(a.y),Sf(a.width),Sf(a.height));else if("go.Margin"===d)c=new cb(Sf(a.top),Sf(a.right),Sf(a.bottom),Sf(a.left));else if("go.Spot"===d)c="string"===typeof a["enum"]?gb(a["enum"]):new L(Sf(a.x),Sf(a.y),Sf(a.offsetX),Sf(a.offsetY));else if("go.Brush"===d){if(c=new ha,c.type=ra(ha,a.type),"string"===typeof a.color&&(c.color=a.color),a.start instanceof +L&&(c.start=a.start),a.end instanceof L&&(c.end=a.end),"number"===typeof a.startRadius&&(c.cu=Sf(a.startRadius)),"number"===typeof a.endRadius&&(c.bt=Sf(a.endRadius)),a=a.colorStops,v.Ta(a))for(b in a)c.addColorStop(parseFloat(b),a[b])}else"go.Geometry"===d?(b=null,b="string"===typeof a.path?$e(a.path):new ve,b.type=ra(ve,a.type),"number"===typeof a.startX&&(b.Aa=Sf(a.startX)),"number"===typeof a.startY&&(b.xa=Sf(a.startY)),"number"===typeof a.endX&&(b.I=Sf(a.endX)),"number"===typeof a.endY&&(b.J= +Sf(a.endY)),a.spot1 instanceof L&&(b.B=a.spot1),a.spot2 instanceof L&&(b.C=a.spot2),c=b):"go.EnumValue"===d&&(b=a.classType,0===b.indexOf("go.")&&(b=b.substr(3)),c=ra(ea[b],a.name));a=c}}return a}; +F.prototype.quote=function(a){for(var b="",c=a.length,d=0;d<c;d++){var e=a[d];if('"'===e||"\\"===e)b+="\\"+e;else if("\b"===e)b+="\\b";else if("\f"===e)b+="\\f";else if("\n"===e)b+="\\n";else if("\r"===e)b+="\\r";else if("\t"===e)b+="\\t";else var f=a.charCodeAt(d),b=16>f?b+("\\u000"+a.charCodeAt(d).toString(16)):32>f?b+("\\u00"+a.charCodeAt(d).toString(16)):8232===f?b+"\\u2028":8233===f?b+"\\u2029":b+e}return'"'+b+'"'}; +F.prototype.writeJsonValue=F.prototype.iu=function(a){return void 0===a?"undefined":null===a?"null":!0===a?"true":!1===a?"false":"string"===typeof a?this.quote(a):"number"===typeof a?Infinity===a?"9e9999":-Infinity===a?"-9e9999":isNaN(a)?'{"class":"NaN"}':a.toString():a instanceof Date?'{"class":"Date", "value":"'+a.toJSON()+'"}':a instanceof Number?this.iu(a.valueOf()):v.isArray(a)?Nf(this,a):v.Ta(a)?Hf(this,a):"function"===typeof a?"null":a.toString()}; +function Nf(a,b,c){void 0===c&&(c=!1);var d=v.Va(b);if(0>=d)return"[]";var e=new sa;e.add("[ ");c&&1<d&&e.add("\n");for(var f=0;f<d;f++){var h=v.Qa(b,f);void 0!==h&&(0<f&&(e.add(","),c&&e.add("\n")),e.add(a.iu(h)))}c&&1<d&&e.add("\n");e.add(" ]");return e.toString()}function Mf(a,b){return void 0===b||"__gohashid"===a||"_"===a[0]||"function"===typeof b?!0:!1}function Tf(a){return isNaN(a)?"NaN":Infinity===a?"9e9999":-Infinity===a?"-9e9999":a} +function Hf(a,b){var c=b;if(c instanceof z){var d=c;b={"class":"go.Point",x:Tf(d.x),y:Tf(d.y)}}else if(c instanceof ia){var e=c;b={"class":"go.Size",width:Tf(e.width),height:Tf(e.height)}}else if(c instanceof A)b={"class":"go.Rect",x:Tf(c.x),y:Tf(c.y),width:Tf(c.width),height:Tf(c.height)};else if(c instanceof cb)b={"class":"go.Margin",top:Tf(c.top),right:Tf(c.right),bottom:Tf(c.bottom),left:Tf(c.left)};else if(c instanceof L)e=c,b=e.bd()?{"class":"go.Spot",x:Tf(e.x),y:Tf(e.y),offsetX:Tf(e.offsetX), +offsetY:Tf(e.offsetY)}:{"class":"go.Spot","enum":e.toString()};else if(c instanceof ha){b={"class":"go.Brush",type:c.type.name};if(c.type===Uf)b.color=c.color;else if(c.type===Vf||c.type===Yc)b.start=c.start,b.end=c.end,c.type===Yc&&(0!==c.cu&&(b.startRadius=Tf(c.cu)),isNaN(c.bt)||(b.endRadius=Tf(c.bt)));if(null!==c.Ys){for(var f={},h=c.Ys.i;h.next();)f[h.key]=h.value;b.colorStops=f}}else if(c instanceof ve)b={"class":"go.Geometry",type:c.type.name},0!==c.Aa&&(b.startX=Tf(c.Aa)),0!==c.xa&&(b.startY= +Tf(c.xa)),0!==c.I&&(b.endX=Tf(c.I)),0!==c.J&&(b.endY=Tf(c.J)),c.B.K(rb)||(b.spot1=c.B),c.C.K(Eb)||(b.spot2=c.C),c.type===Fe&&(b.path=Ze(c));else if(c instanceof fa)b={"class":"go.EnumValue",classType:v.af(c.qe),name:c.name};else if(c instanceof G||c instanceof E||c instanceof Wf||c instanceof F||c instanceof Xf||c instanceof Yf||c instanceof Zf||c instanceof $f||c instanceof Ff||c instanceof Rf)return v.trace("ERROR: trying to convert a GraphObject or Diagram or Model or Tool or Layout or UndoManager into JSON text: "+ +c.toString()),"{}";f="{";c=!0;for(d in b)if(e=v.qb(b,d),!Mf(d,e))if(c?c=!1:f+=", ",f+='"'+d+'":',"points"===d&&e instanceof I&&e.ia===z){h=e;e="[";for(h=h.i;h.next();){var k=h.value;1<e.length&&(e+=",");e+=a.iu(k.x);e+=",";e+=a.iu(k.y)}e+="]";f+=e}else f+=a.iu(e);return f+"}"}function Sf(a){return"number"===typeof a?a:"NaN"===a?NaN:"9e9999"===a?Infinity:"-9e9999"===a?-Infinity:parseFloat(a)} +v.defineProperty(F,{name:"name"},function(){return this.Ob},function(a){var b=this.Ob;b!==a&&(v.j(a,"string",F,"name"),this.Ob=a,this.h("name",b,a))});v.defineProperty(F,{gl:"dataFormat"},function(){return this.pq},function(a){var b=this.pq;b!==a&&(v.j(a,"string",F,"dataFormat"),this.pq=a,this.h("dataFormat",b,a))});v.defineProperty(F,{ab:"isReadOnly"},function(){return this.ti},function(a){var b=this.ti;b!==a&&(v.j(a,"boolean",F,"isReadOnly"),this.ti=a,this.h("isReadOnly",b,a))}); +v.defineProperty(F,{ck:"modelData"},function(){return this.Ay},function(a){var b=this.Ay;b!==a&&(v.j(a,"object",F,"modelData"),this.Ay=a,this.h("modelData",b,a),this.Hb(a))});F.prototype.addChangedListener=F.prototype.wm=function(a){v.j(a,"function",F,"addChangedListener:listener");null===this.zj&&(this.zj=new I("function"));this.zj.add(a)}; +F.prototype.removeChangedListener=F.prototype.Ot=function(a){v.j(a,"function",F,"removeChangedListener:listener");null!==this.zj&&(this.zj.remove(a),0===this.zj.count&&(this.zj=null))};F.prototype.nw=function(a){this.tb||this.la.VD(a);if(null!==this.zj){var b=this.zj,c=b.length;if(1===c)b=b.da(0),b(a);else if(0!==c)for(var d=b.cc(),e=0;e<c;e++)b=d[e],b(a)}};F.prototype.raiseChangedEvent=F.prototype.Lc=function(a,b,c,d,e,f,h){ag(this,"",a,b,c,d,e,f,h)}; +F.prototype.raiseChanged=F.prototype.h=function(a,b,c,d,e){ag(this,"",Af,a,this,b,c,d,e)};F.prototype.raiseDataChanged=F.prototype.$z=function(a,b,c,d,e,f){ag(this,"",Af,b,a,c,d,e,f)};function ag(a,b,c,d,e,f,h,k,l){void 0===k&&(k=null);void 0===l&&(l=null);var m=new zf;m.ba=a;m.wc=c;m.hf=b;m.propertyName=d;m.object=e;m.oldValue=f;m.Cg=k;m.newValue=h;m.Ag=l;a.nw(m)} +v.defineProperty(F,{la:"undoManager"},function(){return this.Sy},function(a){var b=this.Sy;b!==a&&(v.A(a,Ff,F,"undoManager"),null!==b&&b.hI(this),this.Sy=a,null!==a&&a.cG(this))});v.defineProperty(F,{tb:"skipsUndoManager"},function(){return this.Ii},function(a){v.j(a,"boolean",F,"skipsUndoManager");this.Ii=a}); +F.prototype.Bm=function(a,b){if(null!==a&&a.ba===this)if(a.wc===Af){var c=a.object,d=a.propertyName,e=a.ja(b);v.Ka(c,d,e)}else a.wc===Cf?"nodeDataArray"===a.hf?(c=a.newValue,v.Ta(c)&&(d=this.gb(c),void 0!==d&&(b?(v.Uh(this.If,a.Ag),this.uc.remove(d)):(v.Oi(this.If,a.Ag,c),this.uc.add(d,c))))):""===a.hf?(c=a.object,!v.isArray(c)&&a.propertyName&&(c=v.qb(a.object,a.propertyName)),v.isArray(c)&&(d=a.newValue,e=a.Ag,b?v.Uh(c,e):v.Oi(c,e,d))):v.k("unknown ChangedEvent.Insert object: "+a.toString()):a.wc=== +Df?"nodeDataArray"===a.hf?(c=a.oldValue,v.Ta(c)&&(d=this.gb(c),void 0!==d&&(b?(v.Oi(this.If,a.Cg,c),this.uc.add(d,c)):(v.Uh(this.If,a.Cg),this.uc.remove(d))))):""===a.hf?(c=a.object,!v.isArray(c)&&a.propertyName&&(c=v.qb(a.object,a.propertyName)),v.isArray(c)&&(d=a.oldValue,e=a.Cg,b?v.Oi(c,e,d):v.Uh(c,e))):v.k("unknown ChangedEvent.Remove object: "+a.toString()):a.wc!==Bf&&v.k("unknown ChangedEvent: "+a.toString())};F.prototype.startTransaction=F.prototype.Qb=function(a){return this.la.Qb(a)}; +F.prototype.commitTransaction=F.prototype.wd=function(a){return this.la.wd(a)};F.prototype.rollbackTransaction=F.prototype.zp=function(){return this.la.zp()};F.prototype.updateTargetBindings=F.prototype.Hb=function(a,b){void 0===b&&(b="");ag(this,"SourceChanged",Bf,b,a,null,null)}; +v.defineProperty(F,{yl:"nodeKeyProperty"},function(){return this.Fj},function(a){var b=this.Fj;b!==a&&(mg(a,F,"nodeKeyProperty"),""===a&&v.k("Model.nodeKeyProperty may not be the empty string"),0<this.uc.count&&v.k("Cannot set Model.nodeKeyProperty when there is existing node data"),this.Fj=a,this.h("nodeKeyProperty",b,a))});function mg(a,b,c){"string"!==typeof a&&"function"!==typeof a&&v.Cd(a,"string or function",b,c)} +F.prototype.getKeyForNodeData=F.prototype.gb=function(a){if(null!==a){var b=this.Fj;if(""!==b&&(b=v.qb(a,b),void 0!==b)){if(ng(b))return b;v.k("Key value for node data "+a+" is not a number or a string: "+b)}}}; +F.prototype.setKeyForNodeData=F.prototype.nx=function(a,b){void 0!==b&&null!==b&&ng(b)||v.Cd(b,"number or string",F,"setKeyForNodeData:key");if(null!==a){var c=this.Fj;if(""!==c)if(this.Je(a)){var d=v.qb(a,c);d!==b&&null===this.ae(b)&&(v.Ka(a,c,b),this.uc.remove(d),this.uc.add(b,a),ag(this,"nodeKey",Af,c,a,d,b),"string"===typeof c&&this.Hb(a,c),this.Pt(d,b))}else v.Ka(a,c,b)}}; +v.defineProperty(F,{bK:"makeUniqueKeyFunction"},function(){return this.bo},function(a){var b=this.bo;b!==a&&(null!==a&&v.j(a,"function",F,"makeUniqueKeyFunction"),this.bo=a,this.h("makeUniqueKeyFunction",b,a))});function ng(a){return"number"===typeof a||"string"===typeof a}F.prototype.containsNodeData=F.prototype.Je=function(a){var b=this.gb(a);return void 0===b?!1:this.uc.ja(b)===a}; +F.prototype.findNodeDataForKey=F.prototype.ae=function(a){null===a&&v.k("Model.findNodeDataForKey:key must not be null");return void 0!==a&&ng(a)?this.uc.ja(a):null}; +v.defineProperty(F,{Yf:"nodeDataArray"},function(){return this.If},function(a){var b=this.If;if(b!==a){v.cz(a,F,"nodeDataArray");this.uc.clear();this.zA();for(var c=v.Va(a),d=0;d<c;d++){var e=v.Qa(a,d);if(!v.Ta(e)){v.k("Model.nodeDataArray must only contain Objects, not: "+e);return}v.ot(e)}this.If=a;for(var f=new I(Object),d=0;d<c;d++){var e=v.Qa(a,d),h=this.gb(e);void 0===h?f.add(e):null!==this.uc.ja(h)?f.add(e):this.uc.add(h,e)}for(d=f.i;d.next();)e=d.value,this.Mz(e),f=this.gb(e),void 0!==f&& +this.uc.add(f,e);ag(this,"nodeDataArray",Af,"nodeDataArray",this,b,a);for(d=0;d<c;d++)e=v.Qa(a,d),this.yp(e),this.xp(e);this.oD();v.rH(a)||(this.ab=!0)}}); +F.prototype.makeNodeDataKeyUnique=F.prototype.Mz=function(a){if(null!==a){var b=this.Fj;if(""!==b){var c=this.gb(a);if(void 0===c||this.uc.contains(c)){var d=this.bo;if(null!==d&&(c=d(this,a),void 0!==c&&null!==c&&!this.uc.contains(c))){v.Ka(a,b,c);return}if("string"===typeof c){for(d=2;this.uc.contains(c+d);)d++;v.Ka(a,b,c+d)}else if(void 0===c||"number"===typeof c){for(d=-this.uc.count-1;this.uc.contains(d);)d--;v.Ka(a,b,d)}else v.k("Model.getKeyForNodeData returned something other than a string or a number: "+ +c)}}}};F.prototype.addNodeData=F.prototype.Zk=function(a){null!==a&&(v.ot(a),og(this,a,!0))};function og(a,b,c){var d=a.gb(b);if(void 0===d||a.uc.ja(d)!==b)if(a.Mz(b),d=a.gb(b),void 0===d)v.k("Model.makeNodeDataKeyUnique failed on "+b+". Data not added to Model.");else{a.uc.add(d,b);if(c){var e=v.Va(a.If);v.Oi(a.If,e,b)}ag(a,"nodeDataArray",Cf,"nodeDataArray",a,null,b,null,e);a.yp(b);a.xp(b)}} +F.prototype.addNodeDataCollection=function(a){if(v.isArray(a))for(var b=v.Va(a),c=0;c<b;c++)this.Zk(v.Qa(a,c));else for(a=a.i;a.next();)this.Zk(a.value)};F.prototype.removeNodeData=F.prototype.gx=function(a){null!==a&&pg(this,a,!0)};function pg(a,b,c){var d=a.gb(b);if(void 0!==d&&a.uc.contains(d)){a.uc.remove(d);if(c){var e=v.bz(a.If,b);if(0>e)return;v.Uh(a.If,e)}ag(a,"nodeDataArray",Df,"nodeDataArray",a,b,null,e,null);a.gu(b)}} +F.prototype.removeNodeDataCollection=function(a){if(v.isArray(a))for(var b=v.Va(a),c=0;c<b;c++)this.gx(v.Qa(a,c));else for(a=a.i;a.next();)this.gx(a.value)};g=F.prototype;g.Pt=function(a,b){var c=qg(this,a);c instanceof J&&this.oi.add(b,c)};g.zA=function(){};g.yp=function(){};g.xp=function(){};g.gu=function(){};function rg(a,b,c){if(void 0!==b){var d=a.oi.ja(b);null===d&&(d=new J(Object),a.oi.add(b,d));d.add(c)}} +function sg(a,b,c){if(void 0!==b){var d=a.oi.ja(b);d instanceof J&&(void 0===c||null===c?a.oi.remove(b):(d.remove(c),0===d.count&&a.oi.remove(b)))}}function qg(a,b){if(void 0===b)return null;var c=a.oi.ja(b);return c instanceof J?c:null}F.prototype.clearUnresolvedReferences=F.prototype.oD=function(a){void 0===a?this.oi.clear():this.oi.remove(a)}; +v.defineProperty(F,{xJ:"copyNodeDataFunction"},function(){return this.vn},function(a){var b=this.vn;b!==a&&(null!==a&&v.j(a,"function",F,"copyNodeDataFunction"),this.vn=a,this.h("copyNodeDataFunction",b,a))});v.defineProperty(F,{iz:"copiesArrays"},function(){return this.Eu},function(a){var b=this.Eu;b!==a&&(null!==a&&v.j(a,"boolean",F,"copiesArrays"),this.Eu=a,this.h("copiesArrays",b,a))}); +v.defineProperty(F,{hz:"copiesArrayObjects"},function(){return this.hq},function(a){var b=this.hq;b!==a&&(null!==a&&v.j(a,"boolean",F,"copiesArrayObjects"),this.hq=a,this.h("copiesArrayObjects",b,a))});F.prototype.copyNodeData=function(a){if(null===a)return null;var b=null,b=this.vn,b=null!==b?b(a,this):tg(this,a,!0);v.Ta(b)&&v.dc(b);return b}; +function tg(a,b,c){if(a.iz&&Array.isArray(b)){var d=[];for(c=0;c<b.length;c++){var e=tg(a,b[c],a.hz);d.push(e)}v.dc(d);return d}if(c&&v.Ta(b)){c=(c=b.constructor)?new c:{};for(d in b)if("__gohashid"!==d){var e=v.qb(b,d),f;f=e;f instanceof G||f instanceof E||f instanceof Wf||f instanceof ug||f instanceof vg||f instanceof Xf||f instanceof Yf||f instanceof Zf||f instanceof xf||f instanceof yf?("_"!==d[0]&&v.trace('Warning: found GraphObject or Diagram reference when copying model data on property "'+ +d+'" of data object: '+b.toString()+" \nModel data should not have any references to a Diagram or any part of a diagram, such as: "+f.toString()),f=!0):f=f instanceof F||f instanceof Ff||f instanceof Rf||f instanceof zf?!0:!1;f||(e=tg(a,e,!1));v.Ka(c,d,e)}v.dc(c);return c}return b instanceof z?b.copy():b instanceof ia?b.copy():b instanceof A?b.copy():b instanceof L?b.copy():b instanceof cb?b.copy():b} +v.defineProperty(F,{eG:"afterCopyFunction"},function(){return this.Sp},function(a){var b=this.Sp;b!==a&&(null!==a&&v.j(a,"function",F,"afterCopyFunction"),this.Sp=a,this.h("afterCopyFunction",b,a))});var wg=!1; +F.prototype.setDataProperty=function(a,b,c){if(this.Je(a))if(b===this.yl)this.nx(a,c);else{if(b===this.Vm){this.kx(a,c);return}}else!wg&&a instanceof G&&(wg=!0,v.trace('Model.setDataProperty is modifying a GraphObject, "'+a.toString()+'"'),v.trace(" Is that really your intent?"));var d=v.qb(a,b);d!==c&&(v.Ka(a,b,c),this.$z(a,b,d,c))};F.prototype.addArrayItem=function(a,b){this.nH(a,-1,b)}; +F.prototype.insertArrayItem=F.prototype.nH=function(a,b,c){a===this.If&&v.k("Model.insertArrayItem or Model.addArrayItem should not be called on the Model.nodeDataArray");0>b&&(b=v.Va(a));v.Oi(a,b,c);ag(this,"",Cf,"",a,null,c,null,b)};F.prototype.removeArrayItem=function(a,b){void 0===b&&(b=-1);a===this.If&&v.k("Model.removeArrayItem should not be called on the Model.nodeDataArray");-1===b&&(b=v.Va(a)-1);var c=v.Qa(a,b);v.Uh(a,b);ag(this,"",Df,"",a,c,null,b,null)}; +v.defineProperty(F,{Vm:"nodeCategoryProperty"},function(){return this.em},function(a){var b=this.em;b!==a&&(mg(a,F,"nodeCategoryProperty"),this.em=a,this.h("nodeCategoryProperty",b,a))});F.prototype.getCategoryForNodeData=F.prototype.wz=function(a){if(null===a)return"";var b=this.em;if(""===b)return"";b=v.qb(a,b);if(void 0===b)return"";if("string"===typeof b)return b;v.k("getCategoryForNodeData found a non-string category for "+a+": "+b);return""}; +F.prototype.setCategoryForNodeData=F.prototype.kx=function(a,b){v.j(b,"string",F,"setCategoryForNodeData:cat");if(null!==a){var c=this.em;if(""!==c)if(this.Je(a)){var d=v.qb(a,c);void 0===d&&(d="");d!==b&&(v.Ka(a,c,b),ag(this,"nodeCategory",Af,c,a,d,b))}else v.Ka(a,c,b)}}; +function Q(a,b){2<arguments.length&&v.k("GraphLinksModel constructor can only take two optional arguments, the Array of node data and the Array of link data.");F.call(this);this.Gf=[];this.$n=new J(Object);this.Yc=new na(null,Object);this.Mk="";this.Ll=this.un=this.co=null;this.Gh="from";this.Hh="to";this.bm=this.am="";this.$l="category";this.jg="";this.io="isGroup";this.Vg="group";this.iq=!1;void 0!==a&&(this.Yf=a);void 0!==b&&(this.zg=b)}v.Ja(Q,F);v.ea("GraphLinksModel",Q); +Q.prototype.cloneProtected=function(a){F.prototype.cloneProtected.call(this,a);a.Mk=this.Mk;a.co=this.co;a.un=this.un;a.Gh=this.Gh;a.Hh=this.Hh;a.am=this.am;a.bm=this.bm;a.$l=this.$l;a.jg=this.jg;a.io=this.io;a.Vg=this.Vg;a.iq=this.iq};Q.prototype.clear=Q.prototype.clear=function(){F.prototype.clear.call(this);this.Gf=[];this.Yc.clear();this.$n.clear()};g=Q.prototype; +g.toString=function(a){void 0===a&&(a=0);if(2<=a)return this.wA();var b=(""!==this.name?this.name:"")+" GraphLinksModel";if(0<a){b+="\n node data:";a=this.Yf;for(var c=v.Va(a),d=0,d=0;d<c;d++)var e=v.Qa(a,d),b=b+(" "+this.gb(e)+":"+Ef(e));b+="\n link data:";a=this.zg;c=v.Va(a);for(d=0;d<c;d++)e=v.Qa(a,d),b+=" "+this.pl(e)+"--\x3e"+this.ql(e)}return b}; +g.fn=function(){var a=F.prototype.fn.call(this),b="";"category"!==this.Bt&&"string"===typeof this.Bt&&(b+=',\n "linkCategoryProperty": '+this.quote(this.Bt));""!==this.$i&&"string"===typeof this.$i&&(b+=',\n "linkKeyProperty": '+this.quote(this.$i));"from"!==this.ip&&"string"===typeof this.ip&&(b+=',\n "linkFromKeyProperty": '+this.quote(this.ip));"to"!==this.kp&&"string"===typeof this.kp&&(b+=',\n "linkToKeyProperty": '+this.quote(this.kp));""!==this.Ct&&"string"===typeof this.Ct&&(b+=',\n "linkFromPortIdProperty": '+ +this.quote(this.Ct));""!==this.Et&&"string"===typeof this.Et&&(b+=',\n "linkToPortIdProperty": '+this.quote(this.Et));""!==this.Dt&&"string"===typeof this.Dt&&(b+=',\n "linkLabelKeysProperty": '+this.quote(this.Dt));"isGroup"!==this.Kt&&"string"===typeof this.Kt&&(b+=',\n "nodeIsGroupProperty": '+this.quote(this.Kt));"group"!==this.tp&&"string"===typeof this.tp&&(b+=',\n "nodeGroupKeyProperty": '+this.quote(this.tp));return a+b}; +g.Nt=function(a){F.prototype.Nt.call(this,a);a.linkKeyProperty&&(this.$i=a.linkKeyProperty);a.linkFromKeyProperty&&(this.ip=a.linkFromKeyProperty);a.linkToKeyProperty&&(this.kp=a.linkToKeyProperty);a.linkFromPortIdProperty&&(this.Ct=a.linkFromPortIdProperty);a.linkToPortIdProperty&&(this.Et=a.linkToPortIdProperty);a.linkCategoryProperty&&(this.Bt=a.linkCategoryProperty);a.linkLabelKeysProperty&&(this.Dt=a.linkLabelKeysProperty);a.nodeIsGroupProperty&&(this.Kt=a.nodeIsGroupProperty);a.nodeGroupKeyProperty&& +(this.tp=a.nodeGroupKeyProperty)};g.EA=function(){var a=F.prototype.EA.call(this),b=',\n "linkDataArray": '+Nf(this,this.zg,!0);return a+b};g.bA=function(a){F.prototype.bA.call(this,a);a=a.linkDataArray;v.isArray(a)&&(this.Qt(a),this.zg=a)}; +g.FA=function(a){a instanceof Q||v.k("Model.computeJsonDifference: newmodel must be a GraphLinksModel");""===this.$i&&v.k("GraphLinksModel.linkKeyProperty must not be an empty string for .computeJsonDifference() to succeed.");var b=F.prototype.FA.call(this,a);Pf(this,a,"linkKeyProperty");Pf(this,a,"linkFromKeyProperty");Pf(this,a,"linkToKeyProperty");Pf(this,a,"linkLabelKeysProperty");Pf(this,a,"nodeIsGroupProperty");Pf(this,a,"nodeGroupKeyProperty");for(var c=new J,d=new J,e=(new J).Tc(this.Yc.nE), +f=new na,h=a.zg,k=0;k<h.length;k++){var l=h[k],m=a.bf(l);if(void 0!==m){e.remove(m);var n=this.ft(m);null===n?(c.add(m),d.add(l)):Of(this,n,l,f)||d.add(l)}else this.Lz(l),m=this.bf(l),c.add(m),d.add(l)}a=b;0<c.count&&(a+=this.Ex+Nf(this,c.cc(),!0));0<d.count&&(a+=this.MA+Nf(this,d.cc(),!0));0<e.count&&(a+=this.Gx+Nf(this,e.cc(),!0));return a};g.Ex=',\n "insertedLinkKeys": ';g.MA=',\n "modifiedLinkData": ';g.Gx=',\n "removedLinkKeys": '; +g.DA=function(a,b){""===this.$i&&v.k("GraphLinksModel.linkKeyProperty must not be an empty string for .toIncrementalJson() to succeed.");var c=F.prototype.DA.call(this,a,b),d=this,e=new J,f=new J,h=new J;a.Of.each(function(a){a.ba===d&&("linkDataArray"===a.hf?a.wc===Cf?e.add(a.newValue):a.wc===Df&&h.add(a.oldValue):d.bh(a.object)&&f.add(a.object))});var k=new J;e.each(function(a){k.add(d.bf(a));b||f.add(a)});var l=new J;h.each(function(a){l.add(d.bf(a));b&&f.add(a)});0<k.count&&(c+=(b?this.Gx:this.Ex)+ +Nf(this,k.cc(),!0));0<f.count&&(c+=this.MA+Nf(this,f.cc(),!0));0<l.count&&(c+=(b?this.Ex:this.Gx)+Nf(this,l.cc(),!0));return c}; +g.aA=function(a){F.prototype.aA.call(this,a);var b=a.insertedLinkKeys;if(v.isArray(b))for(var c=v.Va(b),d=0;d<c;d++){var e=v.Qa(b,d),f=this.ft(e);null===f&&(f=this.rw({}),this.XE(f,e),this.Os(f))}b=a.modifiedLinkData;if(v.isArray(b))for(c=v.Va(b),d=0;d<c;d++){var h=v.Qa(b,d),e=this.bf(h),f=this.ft(e);if(null!==f)for(var k in h)"__gohashid"!==k&&k!==this.$i&&this.setDataProperty(f,k,h[k])}a=a.removedLinkKeys;if(v.isArray(a))for(c=v.Va(a),d=0;d<c;d++)e=v.Qa(a,d),f=this.ft(e),null!==f&&this.ex(f)}; +g.Bm=function(a,b){var c=null;if(a.wc===Cf){if("linkDataArray"===a.hf?c=this.Gf:"linkLabelKeys"===a.hf&&(c=this.ak(a.object)),v.isArray(c)){if(b)v.Uh(c,a.Ag),c===this.Gf&&(c=this.bf(a.newValue),void 0!==c&&this.Yc.remove(c));else if(v.Oi(c,a.Ag,a.newValue),c===this.Gf){var d=a.newValue,c=this.bf(d);void 0!==c&&this.Yc.add(c,d)}return}}else if(a.wc===Df&&("linkDataArray"===a.hf?c=this.Gf:"linkLabelKeys"===a.hf&&(c=this.ak(a.object)),v.isArray(c))){b?(v.Oi(c,a.Cg,a.oldValue),c===this.Gf&&(d=a.newValue, +c=this.bf(d),void 0!==c&&this.Yc.add(c,d))):(v.Uh(c,a.Cg),c===this.Gf&&(c=this.bf(a.newValue),void 0!==c&&this.Yc.remove(c)));return}F.prototype.Bm.call(this,a,b)};v.defineProperty(Q,{az:"archetypeNodeData"},function(){return this.Ll},function(a){var b=this.Ll;b!==a&&(null!==a&&v.A(a,Object,Q,"archetypeNodeData"),this.Ll=a,this.h("archetypeNodeData",b,a))});Q.prototype.Um=function(a){if(void 0!==a){var b=this.Ll;if(null!==b){var c=this.ae(a);null===c&&(c=this.copyNodeData(b),v.Ka(c,this.Fj,a),this.Zk(c))}return a}}; +v.defineProperty(Q,{ip:"linkFromKeyProperty"},function(){return this.Gh},function(a){var b=this.Gh;b!==a&&(mg(a,Q,"linkFromKeyProperty"),this.Gh=a,this.h("linkFromKeyProperty",b,a))});Q.prototype.getFromKeyForLinkData=Q.prototype.pl=function(a){if(null!==a){var b=this.Gh;if(""!==b&&(b=v.qb(a,b),void 0!==b)){if(ng(b))return b;v.k("FromKey value for link data "+a+" is not a number or a string: "+b)}}}; +Q.prototype.setFromKeyForLinkData=Q.prototype.lx=function(a,b){null===b&&(b=void 0);void 0===b||ng(b)||v.Cd(b,"number or string",Q,"setFromKeyForLinkData:key");if(null!==a){var c=this.Gh;if(""!==c)if(b=this.Um(b),this.bh(a)){var d=v.qb(a,c);d!==b&&(sg(this,d,a),v.Ka(a,c,b),null===this.ae(b)&&rg(this,b,a),ag(this,"linkFromKey",Af,c,a,d,b),"string"===typeof c&&this.Hb(a,c))}else v.Ka(a,c,b)}}; +v.defineProperty(Q,{kp:"linkToKeyProperty"},function(){return this.Hh},function(a){var b=this.Hh;b!==a&&(mg(a,Q,"linkToKeyProperty"),this.Hh=a,this.h("linkToKeyProperty",b,a))});Q.prototype.getToKeyForLinkData=Q.prototype.ql=function(a){if(null!==a){var b=this.Hh;if(""!==b&&(b=v.qb(a,b),void 0!==b)){if(ng(b))return b;v.k("ToKey value for link data "+a+" is not a number or a string: "+b)}}}; +Q.prototype.setToKeyForLinkData=Q.prototype.px=function(a,b){null===b&&(b=void 0);void 0===b||ng(b)||v.Cd(b,"number or string",Q,"setToKeyForLinkData:key");if(null!==a){var c=this.Hh;if(""!==c)if(b=this.Um(b),this.bh(a)){var d=v.qb(a,c);d!==b&&(sg(this,d,a),v.Ka(a,c,b),null===this.ae(b)&&rg(this,b,a),ag(this,"linkToKey",Af,c,a,d,b),"string"===typeof c&&this.Hb(a,c))}else v.Ka(a,c,b)}}; +v.defineProperty(Q,{Ct:"linkFromPortIdProperty"},function(){return this.am},function(a){var b=this.am;b!==a&&(mg(a,Q,"linkFromPortIdProperty"),this.am=a,this.h("linkFromPortIdProperty",b,a))});Q.prototype.getFromPortIdForLinkData=Q.prototype.WG=function(a){if(null===a)return"";var b=this.am;if(""===b)return"";a=v.qb(a,b);return void 0===a?"":a}; +Q.prototype.setFromPortIdForLinkData=Q.prototype.mA=function(a,b){v.j(b,"string",Q,"setFromPortIdForLinkData:portname");if(null!==a){var c=this.am;if(""!==c)if(this.bh(a)){var d=v.qb(a,c);void 0===d&&(d="");d!==b&&(v.Ka(a,c,b),ag(this,"linkFromPortId",Af,c,a,d,b),"string"===typeof c&&this.Hb(a,c))}else v.Ka(a,c,b)}};v.defineProperty(Q,{Et:"linkToPortIdProperty"},function(){return this.bm},function(a){var b=this.bm;b!==a&&(mg(a,Q,"linkToPortIdProperty"),this.bm=a,this.h("linkToPortIdProperty",b,a))}); +Q.prototype.getToPortIdForLinkData=Q.prototype.ZG=function(a){if(null===a)return"";var b=this.bm;if(""===b)return"";a=v.qb(a,b);return void 0===a?"":a};Q.prototype.setToPortIdForLinkData=Q.prototype.pA=function(a,b){v.j(b,"string",Q,"setToPortIdForLinkData:portname");if(null!==a){var c=this.bm;if(""!==c)if(this.bh(a)){var d=v.qb(a,c);void 0===d&&(d="");d!==b&&(v.Ka(a,c,b),ag(this,"linkToPortId",Af,c,a,d,b),"string"===typeof c&&this.Hb(a,c))}else v.Ka(a,c,b)}}; +v.defineProperty(Q,{Dt:"linkLabelKeysProperty"},function(){return this.jg},function(a){var b=this.jg;b!==a&&(mg(a,Q,"linkLabelKeysProperty"),this.jg=a,this.h("linkLabelKeysProperty",b,a))});Q.prototype.getLabelKeysForLinkData=Q.prototype.ak=function(a){if(null===a)return v.hj;var b=this.jg;if(""===b)return v.hj;a=v.qb(a,b);return void 0===a?v.hj:a}; +Q.prototype.setLabelKeysForLinkData=Q.prototype.YE=function(a,b){v.cz(b,Q,"setLabelKeysForLinkData:arr");if(null!==a){var c=this.jg;if(""!==c)if(this.bh(a)){var d=v.qb(a,c);void 0===d&&(d=v.hj);if(d!==b){for(var e=v.Va(d),f=0;f<e;f++){var h=v.Qa(d,f);sg(this,h,a)}v.Ka(a,c,b);e=v.Va(b);for(f=0;f<e;f++)h=v.Qa(b,f),null===this.ae(h)&&rg(this,h,a);ag(this,"linkLabelKeys",Af,c,a,d,b);"string"===typeof c&&this.Hb(a,c)}}else v.Ka(a,c,b)}}; +Q.prototype.addLabelKeyForLinkData=Q.prototype.Yy=function(a,b){if(null!==b&&void 0!==b&&(ng(b)||v.Cd(b,"number or string",Q,"addLabelKeyForLinkData:key"),null!==a)){var c=this.jg;if(""!==c){var d=v.qb(a,c);void 0===d?(c=[],c.push(b),this.YE(a,c)):v.isArray(d)?0<=v.bz(d,b)||(v.Oi(d,Infinity,b),this.bh(a)&&(null===this.ae(b)&&rg(this,b,a),ag(this,"linkLabelKeys",Cf,c,a,null,b))):v.k(c+" property is not an Array; cannot addLabelKeyForLinkData: "+a)}}}; +Q.prototype.removeLabelKeyForLinkData=Q.prototype.FE=function(a,b){if(null!==b&&void 0!==b&&(ng(b)||v.Cd(b,"number or string",Q,"removeLabelKeyForLinkData:key"),null!==a)){var c=this.jg;if(""!==c){var d=v.qb(a,c);if(v.isArray(d)){var e=v.bz(d,b);0>e||(v.Uh(d,e),this.bh(a)&&(sg(this,b,a),ag(this,"linkLabelKeys",Df,c,a,b,null)))}else void 0!==d&&v.k(c+" property is not an Array; cannot removeLabelKeyforLinkData: "+a)}}}; +v.defineProperty(Q,{zg:"linkDataArray"},function(){return this.Gf},function(a){var b=this.Gf;if(b!==a){v.cz(a,Q,"linkDataArray");this.Yc.clear();for(var c=v.Va(a),d=0;d<c;d++){var e=v.Qa(a,d);if(!v.Ta(e)){v.k("GraphLinksModel.linkDataArray must only contain Objects, not: "+e);return}v.ot(e)}this.Gf=a;if(""!==this.$i){for(var f=new I(Object),d=0;d<c;d++){var e=v.Qa(a,d),h=this.bf(e);void 0===h?f.add(e):null!==this.Yc.ja(h)?f.add(e):this.Yc.add(h,e)}for(d=f.i;d.next();)e=d.value,this.Lz(e),f=this.bf(e), +void 0!==f&&this.Yc.add(f,e)}f=new J(Object);for(d=0;d<c;d++)e=v.Qa(a,d),f.add(e);this.$n=f;ag(this,"linkDataArray",Af,"linkDataArray",this,b,a);for(d=0;d<c;d++)e=v.Qa(a,d),xg(this,e)}});v.defineProperty(Q,{$i:"linkKeyProperty"},function(){return this.Mk},function(a){var b=this.Mk;if(b!==a){mg(a,Q,"linkKeyProperty");this.Mk=a;this.Yc.clear();for(var c=v.Va(this.zg),d=0;d<c;d++){var e=v.Qa(this.zg,d),f=this.bf(e);void 0!==f&&this.Yc.add(f,e)}this.h("linkKeyProperty",b,a)}}); +Q.prototype.getKeyForLinkData=Q.prototype.bf=function(a){if(null!==a){var b=this.Mk;if(""!==b&&(b=v.qb(a,b),void 0!==b)){if(ng(b))return b;v.k("Key value for link data "+a+" is not a number or a string: "+b)}}}; +Q.prototype.setKeyForLinkData=Q.prototype.XE=function(a,b){void 0!==b&&null!==b&&ng(b)||v.Cd(b,"number or string",Q,"setKeyForLinkData:key");if(null!==a){var c=this.Mk;if(""!==c)if(this.bh(a)){var d=v.qb(a,c);d!==b&&null===this.ft(b)&&(v.Ka(a,c,b),this.Yc.remove(d),this.Yc.add(b,a),ag(this,"linkKey",Af,c,a,d,b),"string"===typeof c&&this.Hb(a,c))}else v.Ka(a,c,b)}}; +v.defineProperty(Q,{cK:"makeUniqueLinkKeyFunction"},function(){return this.co},function(a){var b=this.co;b!==a&&(null!==a&&v.j(a,"function",Q,"makeUniqueLinkKeyFunction"),this.co=a,this.h("makeUniqueLinkKeyFunction",b,a))});Q.prototype.findLinkDataForKey=Q.prototype.ft=function(a){null===a&&v.k("GraphLinksModel.findLinkDataForKey:key must not be null");return void 0!==a&&ng(a)?this.Yc.ja(a):null}; +Q.prototype.makeLinkDataKeyUnique=Q.prototype.Lz=function(a){if(null!==a){var b=this.Mk;if(""!==b){var c=this.bf(a);if(void 0===c||this.Yc.contains(c)){var d=this.co;if(null!==d&&(c=d(this,a),void 0!==c&&null!==c&&!this.Yc.contains(c))){v.Ka(a,b,c);return}if("string"===typeof c){for(d=2;this.Yc.contains(c+d);)d++;v.Ka(a,b,c+d)}else if(void 0===c||"number"===typeof c){for(d=-this.Yc.count-1;this.Yc.contains(d);)d--;v.Ka(a,b,d)}else v.k("GraphLinksModel.getKeyForLinkData returned something other than a string or a number: "+ +c)}}}};Q.prototype.containsLinkData=Q.prototype.bh=function(a){return null===a?!1:this.$n.contains(a)};Q.prototype.addLinkData=Q.prototype.Os=function(a){if(null!==a){if(void 0===v.ld(a))v.dc(a);else if(this.bh(a))return;yg(this,a,!0)}}; +function yg(a,b,c){if(""!==a.$i){var d=a.bf(b);if(void 0!==d&&a.Yc.ja(d)===b)return;a.Lz(b);d=a.bf(b);if(void 0===d){v.k("GraphLinksModel.makeLinkDataKeyUnique failed on "+b+". Data not added to model.");return}a.Yc.add(d,b)}a.$n.add(b);if(c){var e=v.Va(a.Gf);v.Oi(a.Gf,e,b)}ag(a,"linkDataArray",Cf,"linkDataArray",a,null,b,null,e);xg(a,b)}Q.prototype.addLinkDataCollection=function(a){if(v.isArray(a))for(var b=v.Va(a),c=0;c<b;c++)this.Os(v.Qa(a,c));else for(a=a.i;a.next();)this.Os(a.value)}; +Q.prototype.removeLinkData=Q.prototype.ex=function(a){null!==a&&zg(this,a,!0)};function zg(a,b,c){a.$n.remove(b);var d=a.bf(b);void 0!==d&&a.Yc.remove(d);if(c){var e=a.Gf.indexOf(b);if(0>e)return;v.Uh(a.Gf,e)}ag(a,"linkDataArray",Df,"linkDataArray",a,b,null,e,null);c=a.pl(b);sg(a,c,b);c=a.ql(b);sg(a,c,b);d=a.ak(b);if(v.isArray(d))for(var e=v.Va(d),f=0;f<e;f++)c=v.Qa(d,f),sg(a,c,b)} +Q.prototype.removeLinkDataCollection=function(a){if(v.isArray(a))for(var b=v.Va(a),c=0;c<b;c++)this.ex(v.Qa(a,c));else for(a=a.i;a.next();)this.ex(a.value)};function xg(a,b){var c=a.pl(b),c=a.Um(c);null===a.ae(c)&&rg(a,c,b);c=a.ql(b);c=a.Um(c);null===a.ae(c)&&rg(a,c,b);var d=a.ak(b);if(v.isArray(d))for(var e=v.Va(d),f=0;f<e;f++)c=v.Qa(d,f),null===a.ae(c)&&rg(a,c,b)} +v.defineProperty(Q,{wJ:"copyLinkDataFunction"},function(){return this.un},function(a){var b=this.un;b!==a&&(null!==a&&v.j(a,"function",Q,"copyLinkDataFunction"),this.un=a,this.h("copyLinkDataFunction",b,a))});Q.prototype.copyLinkData=Q.prototype.rw=function(a){if(null===a)return null;var b=null,b=this.un,b=null!==b?b(a,this):tg(this,a,!0);v.Ta(b)&&(v.dc(b),""!==this.Gh&&v.Ka(b,this.Gh,void 0),""!==this.Hh&&v.Ka(b,this.Hh,void 0),""!==this.jg&&v.Ka(b,this.jg,[]));return b}; +v.defineProperty(Q,{Kt:"nodeIsGroupProperty"},function(){return this.io},function(a){var b=this.io;b!==a&&(mg(a,Q,"nodeIsGroupProperty"),this.io=a,this.h("nodeIsGroupProperty",b,a))});Q.prototype.isGroupForNodeData=Q.prototype.Ez=function(a){if(null===a)return!1;var b=this.io;return""===b?!1:v.qb(a,b)?!0:!1};v.defineProperty(Q,{tp:"nodeGroupKeyProperty"},function(){return this.Vg},function(a){var b=this.Vg;b!==a&&(mg(a,Q,"nodeGroupKeyProperty"),this.Vg=a,this.h("nodeGroupKeyProperty",b,a))}); +v.defineProperty(Q,{Fm:"copiesGroupKeyOfNodeData"},function(){return this.iq},function(a){this.iq!==a&&(v.j(a,"boolean",Q,"copiesGroupKeyOfNodeData"),this.iq=a)});Q.prototype.getGroupKeyForNodeData=Q.prototype.Mm=function(a){if(null!==a){var b=this.Vg;if(""!==b&&(b=v.qb(a,b),void 0!==b)){if(ng(b))return b;v.k("GroupKey value for node data "+a+" is not a number or a string: "+b)}}}; +Q.prototype.setGroupKeyForNodeData=Q.prototype.mx=function(a,b){null===b&&(b=void 0);void 0===b||ng(b)||v.Cd(b,"number or string",Q,"setGroupKeyForNodeData:key");if(null!==a){var c=this.Vg;if(""!==c)if(this.Je(a)){var d=v.qb(a,c);d!==b&&(sg(this,d,a),v.Ka(a,c,b),null===this.ae(b)&&rg(this,b,a),ag(this,"nodeGroupKey",Af,c,a,d,b),"string"===typeof c&&this.Hb(a,c))}else v.Ka(a,c,b)}}; +Q.prototype.copyNodeData=function(a){if(null===a)return null;a=F.prototype.copyNodeData.call(this,a);this.Fm||""===this.Vg||void 0===v.qb(a,this.Vg)||v.Ka(a,this.Vg,void 0);return a}; +Q.prototype.setDataProperty=function(a,b,c){if(this.Je(a))if(b===this.yl)this.nx(a,c);else{if(b===this.Vm){this.kx(a,c);return}if(b===this.tp){this.mx(a,c);return}b===this.Kt&&v.k("GraphLinksModel.setDataProperty: property name must not be the nodeIsGroupProperty: "+b)}else if(this.bh(a)){if(b===this.ip){this.lx(a,c);return}if(b===this.kp){this.px(a,c);return}if(b===this.Ct){this.mA(a,c);return}if(b===this.Et){this.pA(a,c);return}if(b===this.$i){this.XE(a,c);return}if(b===this.Bt){this.WE(a,c);return}if(b=== +this.Dt){this.YE(a,c);return}}else!wg&&a instanceof G&&(wg=!0,v.trace('GraphLinksModel.setDataProperty is modifying a GraphObject, "'+a.toString()+'"'),v.trace(" Is that really your intent?"));var d=v.qb(a,b);d!==c&&(v.Ka(a,b,c),this.$z(a,b,d,c))};g=Q.prototype; +g.Pt=function(a,b){F.prototype.Pt.call(this,a,b);for(var c=this.uc.i;c.next();)this.gA(c.value,a,b);for(c=this.$n.i;c.next();){var d=c.value,e=a,f=b;if(this.pl(d)===e){var h=this.Gh;v.Ka(d,h,f);ag(this,"linkFromKey",Af,h,d,e,f);"string"===typeof h&&this.Hb(d,h)}this.ql(d)===e&&(h=this.Hh,v.Ka(d,h,f),ag(this,"linkToKey",Af,h,d,e,f),"string"===typeof h&&this.Hb(d,h));var k=this.ak(d);if(v.isArray(k))for(var l=v.Va(k),h=this.jg,m=0;m<l;m++)v.Qa(k,m)===e&&(v.kD(k,m,f),ag(this,"linkLabelKeys",Cf,h,d,e, +f))}};g.gA=function(a,b,c){if(this.Mm(a)===b){var d=this.Vg;v.Ka(a,d,c);ag(this,"nodeGroupKey",Af,d,a,b,c);"string"===typeof d&&this.Hb(a,d)}};g.zA=function(){F.prototype.zA.call(this);for(var a=this.zg,b=v.Va(a),c=0;c<b;c++){var d=v.Qa(a,c);xg(this,d)}}; +g.yp=function(a){F.prototype.yp.call(this,a);a=this.gb(a);var b=qg(this,a);if(null!==b){for(var c=new I(Object),b=b.i;b.next();){var d=b.value;if(this.Je(d)){if(this.Mm(d)===a){var e=this.Vg;ag(this,"nodeGroupKey",Af,e,d,a,a);"string"===typeof e&&this.Hb(d,e);c.add(d)}}else{this.pl(d)===a&&(e=this.Gh,ag(this,"linkFromKey",Af,e,d,a,a),"string"===typeof e&&this.Hb(d,e),c.add(d));this.ql(d)===a&&(e=this.Hh,ag(this,"linkToKey",Af,e,d,a,a),"string"===typeof e&&this.Hb(d,e),c.add(d));var f=this.ak(d);if(v.isArray(f))for(var h= +v.Va(f),e=this.jg,k=0;k<h;k++)v.Qa(f,k)===a&&(ag(this,"linkLabelKeys",Cf,e,d,a,a),c.add(d))}}for(c=c.i;c.next();)sg(this,a,c.value)}};g.xp=function(a){F.prototype.xp.call(this,a);var b=this.Mm(a);null===this.ae(b)&&rg(this,b,a)};g.gu=function(a){F.prototype.gu.call(this,a);var b=this.Mm(a);sg(this,b,a)};v.defineProperty(Q,{Bt:"linkCategoryProperty"},function(){return this.$l},function(a){var b=this.$l;b!==a&&(mg(a,Q,"linkCategoryProperty"),this.$l=a,this.h("linkCategoryProperty",b,a))}); +Q.prototype.getCategoryForLinkData=Q.prototype.Ew=function(a){if(null===a)return"";var b=this.$l;if(""===b)return"";b=v.qb(a,b);if(void 0===b)return"";if("string"===typeof b)return b;v.k("getCategoryForLinkData found a non-string category for "+a+": "+b);return""}; +Q.prototype.setCategoryForLinkData=Q.prototype.WE=function(a,b){v.j(b,"string",Q,"setCategoryForLinkData:cat");if(null!==a){var c=this.$l;if(""!==c)if(this.bh(a)){var d=v.qb(a,c);void 0===d&&(d="");d!==b&&(v.Ka(a,c,b),ag(this,"linkCategory",Af,c,a,d,b),"string"===typeof c&&this.Hb(a,c))}else v.Ka(a,c,b)}}; +function Qf(a){1<arguments.length&&v.k("TreeModel constructor can only take one optional argument, the Array of node data.");F.call(this);this.Wg="parent";this.jq=!1;this.hm="parentLinkCategory";void 0!==a&&(this.Yf=a)}v.Ja(Qf,F);v.ea("TreeModel",Qf);Qf.prototype.cloneProtected=function(a){F.prototype.cloneProtected.call(this,a);a.Wg=this.Wg;a.jq=this.jq;a.hm=this.hm}; +Qf.prototype.toString=function(a){void 0===a&&(a=0);if(2<=a)return this.wA();var b=(""!==this.name?this.name:"")+" TreeModel";if(0<a){b+="\n node data:";a=this.Yf;for(var c=v.Va(a),d=0;d<c;d++)var e=v.Qa(a,d),b=b+(" "+this.gb(e)+":"+Ef(e))}return b};Qf.prototype.fn=function(){var a=F.prototype.fn.call(this),b="";"parent"!==this.vp&&"string"===typeof this.vp&&(b+=',\n "nodeParentKeyProperty": '+this.quote(this.vp));return a+b}; +Qf.prototype.Nt=function(a){F.prototype.Nt.call(this,a);a.nodeParentKeyProperty&&(this.vp=a.nodeParentKeyProperty)};Qf.prototype.Um=function(a){return a};v.defineProperty(Qf,{vp:"nodeParentKeyProperty"},function(){return this.Wg},function(a){var b=this.Wg;b!==a&&(mg(a,Qf,"nodeParentKeyProperty"),this.Wg=a,this.h("nodeParentKeyProperty",b,a))}); +v.defineProperty(Qf,{Gm:"copiesParentKeyOfNodeData"},function(){return this.jq},function(a){this.jq!==a&&(v.j(a,"boolean",Qf,"copiesParentKeyOfNodeData"),this.jq=a)});Qf.prototype.getParentKeyForNodeData=Qf.prototype.Nm=function(a){if(null!==a){var b=this.Wg;if(""!==b&&(b=v.qb(a,b),void 0!==b)){if(ng(b))return b;v.k("ParentKey value for node data "+a+" is not a number or a string: "+b)}}}; +Qf.prototype.setParentKeyForNodeData=Qf.prototype.qh=function(a,b){null===b&&(b=void 0);void 0===b||ng(b)||v.Cd(b,"number or string",Qf,"setParentKeyForNodeData:key");if(null!==a){var c=this.Wg;if(""!==c)if(b=this.Um(b),this.Je(a)){var d=v.qb(a,c);d!==b&&(sg(this,d,a),v.Ka(a,c,b),null===this.ae(b)&&rg(this,b,a),ag(this,"nodeParentKey",Af,c,a,d,b),"string"===typeof c&&this.Hb(a,c))}else v.Ka(a,c,b)}}; +v.defineProperty(Qf,{wK:"parentLinkCategoryProperty"},function(){return this.hm},function(a){var b=this.hm;b!==a&&(mg(a,Qf,"parentLinkCategoryProperty"),this.hm=a,this.h("parentLinkCategoryProperty",b,a))});Qf.prototype.getParentLinkCategoryForNodeData=Qf.prototype.YG=function(a){if(null===a)return"";var b=this.hm;if(""===b)return"";b=v.qb(a,b);if(void 0===b)return"";if("string"===typeof b)return b;v.k("getParentLinkCategoryForNodeData found a non-string category for "+a+": "+b);return""}; +Qf.prototype.setParentLinkCategoryForNodeData=Qf.prototype.xI=function(a,b){v.j(b,"string",Qf,"setParentLinkCategoryForNodeData:cat");if(null!==a){var c=this.hm;if(""!==c)if(this.Je(a)){var d=v.qb(a,c);void 0===d&&(d="");d!==b&&(v.Ka(a,c,b),ag(this,"parentLinkCategory",Af,c,a,d,b),"string"===typeof c&&this.Hb(a,c))}else v.Ka(a,c,b)}}; +Qf.prototype.copyNodeData=function(a){if(null===a)return null;a=F.prototype.copyNodeData.call(this,a);this.Gm||""===this.Wg||void 0===v.qb(a,this.Wg)||v.Ka(a,this.Wg,void 0);return a}; +Qf.prototype.setDataProperty=function(a,b,c){if(this.Je(a))if(b===this.yl)this.nx(a,c);else{if(b===this.Vm){this.kx(a,c);return}if(b===this.vp){this.qh(a,c);return}}else!wg&&a instanceof G&&(wg=!0,v.trace('TreeModel.setDataProperty is modifying a GraphObject, "'+a.toString()+'"'),v.trace(" Is that really your intent?"));var d=v.qb(a,b);d!==c&&(v.Ka(a,b,c),this.$z(a,b,d,c))};g=Qf.prototype;g.Pt=function(a,b){F.prototype.Pt.call(this,a,b);for(var c=this.uc.i;c.next();)this.gA(c.value,a,b)}; +g.gA=function(a,b,c){if(this.Nm(a)===b){var d=this.Wg;v.Ka(a,d,c);ag(this,"nodeParentKey",Af,d,a,b,c);"string"===typeof d&&this.Hb(a,d)}};g.yp=function(a){F.prototype.yp.call(this,a);a=this.gb(a);var b=qg(this,a);if(null!==b){for(var c=new I(Object),b=b.i;b.next();){var d=b.value;if(this.Je(d)&&this.Nm(d)===a){var e=this.Wg;ag(this,"nodeParentKey",Af,e,d,a,a);"string"===typeof e&&this.Hb(d,e);c.add(d)}}for(c=c.i;c.next();)sg(this,a,c.value)}}; +g.xp=function(a){F.prototype.xp.call(this,a);var b=this.Nm(a),b=this.Um(b);null===this.ae(b)&&rg(this,b,a)};g.gu=function(a){F.prototype.gu.call(this,a);var b=this.Nm(a);sg(this,b,a)}; +function Ag(a,b,c){v.dc(this);this.D=!1;void 0===a?a="":v.j(a,"string",Ag,"constructor:targetprop");void 0===b?b=a:v.j(b,"string",Ag,"constructor:sourceprop");void 0===c?c=null:null!==c&&v.j(c,"function",Ag,"constructor:conv");this.GC=-1;this.pg=null;this.Bo=a;this.Ao=this.zs=0;this.Tv=null;this.Xq=!1;this.ro=b;this.gq=c;this.tr=Bg;this.$p=null}v.ea("Binding",Ag); +Ag.prototype.copy=function(){var a=new Ag;a.Bo=this.Bo;a.zs=this.zs;a.Ao=this.Ao;a.Tv=this.Tv;a.Xq=this.Xq;a.ro=this.ro;a.gq=this.gq;a.tr=this.tr;a.$p=this.$p;return a};var Bg;Ag.OneWay=Bg=v.p(Ag,"OneWay",1);var Cg;Ag.TwoWay=Cg=v.p(Ag,"TwoWay",2);Ag.parseEnum=function(a,b){v.j(a,"function",Ag,"parseEnum:ctor");v.pb(b,a,Ag,"parseEnum:defval");return function(c){c=ra(a,c);return null===c?b:c}};var Ef; +Ag.toString=Ef=function(a){var b=a;v.Ta(a)&&(a.text?b=a.text:a.name?b=a.name:void 0!==a.key?b=a.key:void 0!==a.id?b=a.id:a.constructor===Object&&(a.Text?b=a.Text:a.Name?b=a.Name:void 0!==a.Key?b=a.Key:void 0!==a.Id?b=a.Id:void 0!==a.ID&&(b=a.ID)));return void 0===b?"undefined":null===b?"null":b.toString()};Ag.prototype.toString=function(){return"Binding("+this.tx+":"+this.bF+(-1!==this.El?" "+this.El:"")+" "+this.mode.name+")"};Ag.prototype.freeze=function(){this.D=!0;return this}; +Ag.prototype.Oa=function(){this.D=!1;return this};v.defineProperty(Ag,{El:null},function(){return this.GC},function(a){this.D&&v.ka(this);v.j(a,"number",Ag,"targetId");this.GC=a});v.defineProperty(Ag,{tx:"targetProperty"},function(){return this.Bo},function(a){this.D&&v.ka(this);v.j(a,"string",Ag,"targetProperty");this.Bo=a});v.defineProperty(Ag,{bn:"sourceName"},function(){return this.Tv},function(a){this.D&&v.ka(this);null!==a&&v.j(a,"string",Ag,"sourceName");this.Tv=a;null!==a&&(this.Xq=!1)}); +v.defineProperty(Ag,{yt:"isToModel"},function(){return this.Xq},function(a){this.D&&v.ka(this);v.j(a,"boolean",Ag,"isToModel");this.Xq=a});v.defineProperty(Ag,{bF:"sourceProperty"},function(){return this.ro},function(a){this.D&&v.ka(this);v.j(a,"string",Ag,"sourceProperty");this.ro=a});v.defineProperty(Ag,{vG:"converter"},function(){return this.gq},function(a){this.D&&v.ka(this);null!==a&&v.j(a,"function",Ag,"converter");this.gq=a}); +v.defineProperty(Ag,{kG:"backConverter"},function(){return this.$p},function(a){this.D&&v.ka(this);null!==a&&v.j(a,"function",Ag,"backConverter");this.$p=a});v.defineProperty(Ag,{mode:"mode"},function(){return this.tr},function(a){this.D&&v.ka(this);v.pb(a,Ag,Ag,"mode");this.tr=a});Ag.prototype.makeTwoWay=Ag.prototype.IH=function(a){void 0===a&&(a=null);null!==a&&v.j(a,"function",Ag,"makeTwoWay");this.mode=Cg;this.kG=a;return this}; +Ag.prototype.ofObject=Ag.prototype.Tw=function(a){void 0===a&&(a="");this.bn=a;this.yt=!1;return this};Ag.prototype.ofModel=function(){this.bn=null;this.yt=!0;return this};Ag.prototype.ofData=function(){this.bn=null;this.yt=!1;return this};function Dg(a,b,c){a=a.bn;var d=null;return d=null===a||""===a?b:"."===a?c:".."===a?c.R:b.be(a)} +Ag.prototype.updateTarget=Ag.prototype.sF=function(a,b,c){var d=this.ro;if(void 0===c||""===d||d===c){c=this.Bo;var e=this.gq;if(null===e&&""===c)v.trace("Binding error: target property is the empty string: "+this.toString());else{var f=b;""!==d&&(f=v.qb(b,d));if(void 0!==f)if(null===e)""!==c&&v.Ka(a,c,f);else try{if(""!==c){var h=e(f,a);v.Ka(a,c,h)}else e(f,a)}catch(k){}}}}; +Ag.prototype.updateSource=Ag.prototype.ux=function(a,b,c,d){void 0===d&&(d=null);if(this.tr===Cg){var e=this.Bo;if(void 0===c||e===c){c=this.ro;var f=this.$p;if(null!==f||""!==c){var h=a;""!==e&&(h=v.qb(a,e));if(void 0!==h)if(a=null!==d?d.ba:null,null===f)null!==a?a.setDataProperty(b,c,h):v.Ka(b,c,h);else try{if(""!==c){var k=f(h,b,a);null!==a?a.setDataProperty(b,c,k):v.Ka(b,c,k)}else f(h,b,a)}catch(l){}}}}};function Rf(){this.zF=(new I(zf)).freeze();this.Ob="";this.NB=!1}v.ea("Transaction",Rf); +Rf.prototype.toString=function(a){var b="Transaction: "+this.name+" "+this.Of.count.toString()+(this.tt?"":", incomplete");if(void 0!==a&&0<a){a=this.Of.count;for(var c=0;c<a;c++){var d=this.Of.da(c);null!==d&&(b+="\n "+d.toString())}}return b};Rf.prototype.clear=Rf.prototype.clear=function(){var a=this.Of;a.Oa();for(var b=a.count-1;0<=b;b--){var c=a.da(b);null!==c&&c.clear()}a.clear();a.freeze()};Rf.prototype.canUndo=Rf.prototype.canUndo=function(){return this.tt}; +Rf.prototype.undo=Rf.prototype.undo=function(){if(this.canUndo())for(var a=this.Of.count-1;0<=a;a--){var b=this.Of.da(a);null!==b&&b.undo()}};Rf.prototype.canRedo=Rf.prototype.canRedo=function(){return this.tt};Rf.prototype.redo=Rf.prototype.redo=function(){if(this.canRedo())for(var a=this.Of.count,b=0;b<a;b++){var c=this.Of.da(b);null!==c&&c.redo()}};v.u(Rf,{Of:"changes"},function(){return this.zF});v.defineProperty(Rf,{name:"name"},function(){return this.Ob},function(a){this.Ob=a}); +v.defineProperty(Rf,{tt:"isComplete"},function(){return this.NB},function(a){this.NB=a});function Ff(){this.By=new J(F);this.Se=!1;this.DF=(new I(Rf)).freeze();this.Pg=-1;this.bC=999;this.ui=!1;this.Ku=null;this.Xk=0;this.YA=!1;this.Ug=(new I("string")).freeze();this.ho=new I("number");this.iy=!0;this.vy=!1}v.ea("UndoManager",Ff); +Ff.prototype.toString=function(a){for(var b="UndoManager "+this.Vi+"<"+this.history.count+"<="+this.sE,b=b+"[",c=this.xE.count,d=0;d<c;d++)0<d&&(b+=" "),b+=this.xE.da(d);b+="]";if(void 0!==a&&0<a)for(c=this.history.count,d=0;d<c;d++)b+="\n "+this.history.da(d).toString(a-1);return b}; +Ff.prototype.clear=Ff.prototype.clear=function(){var a=this.history;a.Oa();for(var b=a.count-1;0<=b;b--){var c=a.da(b);null!==c&&c.clear()}a.clear();this.Pg=-1;a.freeze();this.ui=!1;this.Ku=null;this.Xk=0;this.Ug.Oa();this.Ug.clear();this.Ug.freeze();this.ho.clear()};Ff.prototype.addModel=Ff.prototype.cG=function(a){this.By.add(a)};Ff.prototype.removeModel=Ff.prototype.hI=function(a){this.By.remove(a)}; +Ff.prototype.startTransaction=Ff.prototype.Qb=function(a){void 0===a&&(a="");null===a&&(a="");if(this.ib)return!1;!0===this.iy&&(this.iy=!1,this.Xk++,this.$c("StartingFirstTransaction",a,this.Qi),0<this.Xk&&this.Xk--);this.isEnabled&&(this.Ug.Oa(),this.Ug.add(a),this.Ug.freeze(),null===this.Qi?this.ho.add(0):this.ho.add(this.Qi.Of.count));this.Xk++;var b=1===this.th;b&&this.$c("StartedTransaction",a,this.Qi);return b}; +Ff.prototype.commitTransaction=Ff.prototype.wd=function(a){void 0===a&&(a="");return Eg(this,!0,a)};Ff.prototype.rollbackTransaction=Ff.prototype.zp=function(){return Eg(this,!1,"")}; +function Eg(a,b,c){if(a.ib)return!1;a.dz&&1>a.th&&v.trace("Ending transaction without having started a transaction: "+c);var d=1===a.th;d&&b&&a.isEnabled&&a.$c("CommittingTransaction",c,a.Qi);var e=0;if(0<a.th&&(a.Xk--,a.isEnabled)){var f=a.Ug.count;0<f&&(""===c&&(c=a.Ug.da(0)),a.Ug.Oa(),a.Ug.Vc(f-1),a.Ug.freeze());f=a.ho.count;0<f&&(e=a.ho.da(f-1),a.ho.Vc(f-1))}f=a.Qi;if(d){if(b){a.vy=!1;if(a.isEnabled&&null!==f){b=f;b.tt=!0;b.name=c;d=a.history;d.Oa();for(e=d.count-1;e>a.Vi;e--)f=d.da(e),null!== +f&&f.clear(),d.Vc(e),a.vy=!0;e=a.sE;0===e&&(e=1);0<e&&d.count>=e&&(f=d.da(0),null!==f&&f.clear(),d.Vc(0),a.Pg--);d.add(b);a.Pg++;d.freeze();f=b}a.$c("CommittedTransaction",c,f)}else{a.ui=!0;try{a.isEnabled&&null!==f&&(f.tt=!0,f.undo())}finally{a.$c("RolledBackTransaction",c,f),a.ui=!1}null!==f&&f.clear()}a.Ku=null;return!0}if(a.isEnabled&&!b&&null!==f){a=e;c=f.Of;for(b=c.count-1;b>=a;b--)d=c.da(b),null!==d&&d.undo(),c.Oa(),c.Vc(b);c.freeze()}return!1} +Ff.prototype.canUndo=Ff.prototype.canUndo=function(){if(!this.isEnabled||0<this.th||this.ib)return!1;var a=this.mF;return null!==a&&a.canUndo()?!0:!1};Ff.prototype.undo=Ff.prototype.undo=function(){if(this.canUndo()){var a=this.mF;try{this.$c("StartingUndo","Undo",a),this.ui=!0,this.Pg--,a.undo()}catch(b){v.trace("undo error: "+b.toString())}finally{this.ui=!1,this.$c("FinishedUndo","Undo",a)}}}; +Ff.prototype.canRedo=Ff.prototype.canRedo=function(){if(!this.isEnabled||0<this.th||this.ib)return!1;var a=this.lF;return null!==a&&a.canRedo()?!0:!1};Ff.prototype.redo=Ff.prototype.redo=function(){if(this.canRedo()){var a=this.lF;try{this.$c("StartingRedo","Redo",a),this.ui=!0,this.Pg++,a.redo()}catch(b){v.trace("redo error: "+b.toString())}finally{this.ui=!1,this.$c("FinishedRedo","Redo",a)}}}; +Ff.prototype.$c=function(a,b,c){void 0===c&&(c=null);var d=new zf;d.wc=Bf;d.propertyName=a;d.object=c;d.oldValue=b;for(a=this.RH;a.next();)b=a.value,d.ba=b,b.nw(d)};Ff.prototype.handleChanged=Ff.prototype.VD=function(a){if(this.isEnabled&&!this.ib&&!this.skipsEvent(a)){var b=this.Qi;null===b&&(this.Ku=b=new Rf);var c=a.copy(),b=b.Of;b.Oa();b.add(c);b.freeze();this.dz&&0>=this.th&&!this.iy&&(a=a.g,null!==a&&!1===a.Qm||v.trace("Change not within a transaction: "+c.toString()))}}; +Ff.prototype.skipsEvent=function(a){if(null===a||0>a.wc.value)return!0;a=a.object;if(a instanceof G){if(a=a.layer,null!==a&&a.Gc)return!0}else if(a instanceof Wf&&a.Gc)return!0;return!1};v.u(Ff,{RH:"models"},function(){return this.By.i});v.defineProperty(Ff,{isEnabled:"isEnabled"},function(){return this.Se},function(a){this.Se=a});v.u(Ff,{mF:"transactionToUndo"},function(){return 0<=this.Vi&&this.Vi<=this.history.count-1?this.history.da(this.Vi):null}); +v.u(Ff,{lF:"transactionToRedo"},function(){return this.Vi<this.history.count-1?this.history.da(this.Vi+1):null});v.u(Ff,{ib:"isUndoingRedoing"},function(){return this.ui});v.u(Ff,{history:"history"},function(){return this.DF});v.defineProperty(Ff,{sE:"maxHistoryLength"},function(){return this.bC},function(a){this.bC=a});v.u(Ff,{Vi:"historyIndex"},function(){return this.Pg});v.u(Ff,{Qi:"currentTransaction"},function(){return this.Ku});v.u(Ff,{th:"transactionLevel"},function(){return this.Xk}); +v.u(Ff,{hE:"isInTransaction"},function(){return 0<this.Xk});v.defineProperty(Ff,{dz:"checksTransactionLevel"},function(){return this.YA},function(a){this.YA=a});v.u(Ff,{xE:"nestedTransactionNames"},function(){return this.Ug});function Yf(){0<arguments.length&&v.cd(Yf);v.dc(this);this.W=null;this.aB=!1;this.uB=this.bB=!0;this.dB=this.eB=this.vB=this.fB=!1;this.Qk=this.QA=null;this.ZC=1.05;this.sB=1;this.wy=NaN;this.ZB=null;this.Wy=NaN;this.Vy=bd;this.Hi=null}v.ea("CommandHandler",Yf); +var Fg=null,Gg="";Yf.prototype.toString=function(){return"CommandHandler"};v.u(Yf,{g:"diagram"},function(){return this.W});Yf.prototype.Mc=function(a){this.W=a}; +Yf.prototype.doKeyDown=function(){var a=this.g;if(null!==a){var b=a.O,c=v.bk?b.Ft:b.control,d=b.shift,e=b.alt,f=b.key;!c||"C"!==f&&"Insert"!==f?c&&"X"===f||d&&"Del"===f?this.canCutSelection()&&this.cutSelection():c&&"V"===f||d&&"Insert"===f?this.canPasteSelection()&&this.pasteSelection():c&&"Y"===f||e&&d&&"Backspace"===f?this.canRedo()&&this.redo():c&&"Z"===f||e&&"Backspace"===f?this.canUndo()&&this.undo():"Del"===f||"Backspace"===f?this.canDeleteSelection()&&this.deleteSelection():c&&"A"===f?this.canSelectAll()&& +this.selectAll():"Esc"===f?this.canStopCommand()&&this.stopCommand():"Up"===f?a.pe&&(c?a.scroll("pixel","up"):a.scroll("line","up")):"Down"===f?a.pe&&(c?a.scroll("pixel","down"):a.scroll("line","down")):"Left"===f?a.oe&&(c?a.scroll("pixel","left"):a.scroll("line","left")):"Right"===f?a.oe&&(c?a.scroll("pixel","right"):a.scroll("line","right")):"PageUp"===f?d&&a.oe?a.scroll("page","left"):a.pe&&a.scroll("page","up"):"PageDown"===f?d&&a.oe?a.scroll("page","right"):a.pe&&a.scroll("page","down"):"Home"=== +f?c&&a.pe?a.scroll("document","up"):!c&&a.oe&&a.scroll("document","left"):"End"===f?c&&a.pe?a.scroll("document","down"):!c&&a.oe&&a.scroll("document","right"):" "===f?this.canScrollToPart()&&this.scrollToPart():"Subtract"===f?this.canDecreaseZoom()&&this.decreaseZoom():"Add"===f?this.canIncreaseZoom()&&this.increaseZoom():c&&"0"===f?this.canResetZoom()&&this.resetZoom():d&&"Z"===f?this.canZoomToFit()&&this.zoomToFit():c&&!d&&"G"===f?this.canGroupSelection()&&this.groupSelection():c&&d&&"G"===f?this.canUngroupSelection()&& +this.ungroupSelection():b.event&&113===b.event.which?this.canEditTextBlock()&&this.editTextBlock():b.event&&93===b.event.which?this.canShowContextMenu()&&this.showContextMenu():b.bubbles=!0:this.canCopySelection()&&this.copySelection()}};Yf.prototype.doKeyUp=function(){var a=this.g;null!==a&&(a.O.bubbles=!0)};Yf.prototype.stopCommand=function(){var a=this.g;if(null!==a){var b=a.Wa;b instanceof Hg&&a.of&&a.ow();null!==b&&b.doCancel()}};Yf.prototype.canStopCommand=function(){return!0}; +Yf.prototype.selectAll=function(){var a=this.g;if(null!==a){a.pa();try{a.$b="wait";a.Ba("ChangingSelection");for(var b=a.ek;b.next();)b.value.hb=!0;for(var c=a.Bg;c.next();)c.value.hb=!0;for(var d=a.links;d.next();)d.value.hb=!0}finally{a.Ba("ChangedSelection"),a.$b=""}}};Yf.prototype.canSelectAll=function(){var a=this.g;return null!==a&&a.of}; +Yf.prototype.deleteSelection=function(){var a=this.g;if(null!==a&&!a.Ba("SelectionDeleting",a.selection))try{a.$b="wait";a.Qb("Delete");a.Ba("ChangingSelection");for(var b=new J(R),c=a.selection.i;c.next();)Ig(b,c.value,!0,this.GG?Infinity:0,this.DD,function(a){return a.canDelete()});a.fA(b,!0);a.Ba("SelectionDeleted",b)}finally{a.Ba("ChangedSelection"),a.wd("Delete"),a.$b=""}};Yf.prototype.canDeleteSelection=function(){var a=this.g;return null===a||a.ab||a.vf||!a.xm||0===a.selection.count?!1:!0}; +function Ig(a,b,c,d,e,f){void 0===f&&(f=null);if(!(a.contains(b)||null!==f&&!f(b)||b instanceof Vg))if(a.add(b),b instanceof S){if(c&&b instanceof V)for(var h=b.Ic;h.next();)Ig(a,h.value,c,d,e,f);if(e)for(h=b.te;h.next();){var k=h.value;if(!a.contains(k)){var l=k.T,m=k.Z;null!==l&&a.contains(l)&&null!==m&&a.contains(m)?Ig(a,k,c,d,e,f):null!==l&&null!==m||Ig(a,k,c,d,e,f)}}if(1<d)for(b=b.MD();b.next();)Ig(a,b.value,c,d-1,e,f)}else if(b instanceof W)for(h=b.Sf;h.next();)Ig(a,h.value,c,d,e,f)} +Yf.prototype.Oo=function(a,b,c){var d=new na(R,R);for(a=a.i;a.next();)Wg(this,a.value,b,d,c);if(null!==b){c=b.ba;a=!1;null!==b.Za.$d&&(a=b.Za.$d.Si);for(var e=new J(W),f=new na(W,W),h=d.i;h.next();){var k=h.value;if(k instanceof W){var l=k;a||null!==l.T&&null!==l.Z||e.add(l)}else if(c instanceof Qf&&k instanceof S&&null!==k.data){var l=c,m=k,k=h.key,n=k.ml();null!==n&&(n=d.ja(n),null!==n?(l.qh(m.data,l.gb(n.data)),l=b.Pf(m.data),k=k.Vo(),null!==k&&null!==l&&f.add(k,l)):l.qh(m.data,void 0))}}0<e.count&& +b.fA(e,!1);if(0<f.count)for(c=f.i;c.next();)d.add(c.key,c.value)}if(null!==b&&(b=b.ba,c=b.eG,null!==c)){var p=new na;d.each(function(a){null!==a.key.data&&p.add(a.key.data,a.value.data)});c(p,b,this.g.ba)}for(b=d.i;b.next();)b.value.Hb();return d}; +function Wg(a,b,c,d,e){if(null===b||e&&!b.canCopy())return null;if(d.contains(b))return d.ja(b);var f=null,h=b.data;if(null!==h&&null!==c){var k=c.ba;b instanceof W?k instanceof Q&&(h=k.rw(h),v.Ta(h)&&(k.Os(h),f=c.Pf(h))):(h=k.copyNodeData(h),v.Ta(h)&&(k.Zk(h),f=c.eh(h)))}else Xg(b),f=b.copy(),null!==f&&(null!==c?c.add(f):null!==h&&a.wG&&(k=a.g.ba,h=f instanceof W&&k instanceof Q?k.rw(h):k.copyNodeData(h),v.Ta(h)&&(f.data=h)));if(!(f instanceof R))return null;f.hb=!1;f.hh=!1;d.add(b,f);if(b instanceof +S){for(h=b.te;h.next();){k=h.value;if(k.T===b){var l=d.ja(k);null!==l&&(l.T=f)}k.Z===b&&(l=d.ja(k),null!==l&&(l.Z=f))}if(b instanceof V&&f instanceof V)for(h=f,b=b.Ic;b.next();)k=Wg(a,b.value,c,d,e),k instanceof W||null===k||(k.Sa=h)}else if(b instanceof W)for(h=b.T,null!==h&&(h=d.ja(h),null!==h&&(f.T=h)),h=b.Z,null!==h&&(h=d.ja(h),null!==h&&(f.Z=h)),b=b.Sf;b.next();)h=Wg(a,b.value,c,d,e),null!==h&&(h.fe=f);return f} +Yf.prototype.copySelection=function(){var a=this.g;if(null!==a){for(var b=new J(R),a=a.selection.i;a.next();)Ig(b,a.value,!0,this.zG?Infinity:0,this.xG,function(a){return a.canCopy()});this.copyToClipboard(b)}};Yf.prototype.canCopySelection=function(){var a=this.g;return null!==a&&a.Vj&&a.Zy&&0!==a.selection.count?!0:!1};Yf.prototype.cutSelection=function(){this.copySelection();this.deleteSelection()}; +Yf.prototype.canCutSelection=function(){var a=this.g;return null!==a&&!a.ab&&!a.vf&&a.Vj&&a.xm&&a.Zy&&0!==a.selection.count?!0:!1};Yf.prototype.copyToClipboard=function(a){var b=this.g;if(null!==b){var c=null;if(null===a)Fg=null,Gg="";else{var c=b.ba,d=!1,e=!1,f=null;try{if(c instanceof Qf){var h=c,d=h.Gm;h.Gm=this.wD}c instanceof Q&&(h=c,e=h.Fm,h.Fm=this.vD);f=b.Oo(a,null,!0)}finally{c instanceof Qf&&(c.Gm=d),c instanceof Q&&(c.Fm=e),c=new I(R),c.Tc(f),Fg=c,Gg=b.ba.gl}}b.Ba("ClipboardChanged",c)}}; +Yf.prototype.pasteFromClipboard=function(){var a=new J(R),b=Fg;if(null===b)return a;var c=this.g;if(null===c||Gg!==c.ba.gl)return a;var d=c.ba,e=!1,f=!1,h=null;try{if(d instanceof Qf){var k=d,e=k.Gm;k.Gm=this.wD}d instanceof Q&&(k=d,f=k.Fm,k.Fm=this.vD);h=c.Oo(b,c,!1)}finally{for(d instanceof Qf&&(d.Gm=e),d instanceof Q&&(d.Fm=f),b=h.i;b.next();)c=b.value,d=b.key,c.location.G()||(d.location.G()?c.location=d.location:!c.position.G()&&d.position.G()&&(c.position=d.position)),a.add(c)}return a}; +Yf.prototype.pasteSelection=function(a){void 0===a&&(a=null);var b=this.g;if(null!==b)try{b.$b="wait";b.Qb("Paste");b.Ba("ChangingSelection");var c=this.pasteFromClipboard();0<c.count&&Yg(b);for(var d=c.i;d.next();)d.value.hb=!0;b.Ba("ChangedSelection");if(null!==a){var e=b.computePartsBounds(b.selection);if(e){var f=b.Za.$d;null===f&&(f=new Zg,f.Mc(b));var h=f.computeEffectiveCollection(b.selection);f.moveParts(h,new z(a.x-e.na,a.y-e.ua),!1)}}b.Ba("ClipboardPasted",c)}finally{b.wd("Paste"),b.$b= +""}};Yf.prototype.canPasteSelection=function(){var a=this.g;return null===a||a.ab||a.vf||!a.Ho||!a.Zy||null===Fg||Gg!==a.ba.gl?!1:!0};Yf.prototype.undo=function(){var a=this.g;null!==a&&a.la.undo()};Yf.prototype.canUndo=function(){var a=this.g;return null===a||a.ab||a.vf?!1:a.gD&&a.la.canUndo()};Yf.prototype.redo=function(){var a=this.g;null!==a&&a.la.redo()};Yf.prototype.canRedo=function(){var a=this.g;return null===a||a.ab||a.vf?!1:a.gD&&a.la.canRedo()}; +Yf.prototype.decreaseZoom=function(a){void 0===a&&(a=1/this.wx);v.We(a,Yf,"decreaseZoom:factor");var b=this.g;null!==b&&b.cl===$g&&(a*=b.scale,a<b.jh||a>b.ih||(b.scale=a))};Yf.prototype.canDecreaseZoom=function(a){void 0===a&&(a=1/this.wx);v.We(a,Yf,"canDecreaseZoom:factor");var b=this.g;if(null===b||b.cl!==$g)return!1;a*=b.scale;return a<b.jh||a>b.ih?!1:b.mw}; +Yf.prototype.increaseZoom=function(a){void 0===a&&(a=this.wx);v.We(a,Yf,"increaseZoom:factor");var b=this.g;null!==b&&b.cl===$g&&(a*=b.scale,a<b.jh||a>b.ih||(b.scale=a))};Yf.prototype.canIncreaseZoom=function(a){void 0===a&&(a=this.wx);v.We(a,Yf,"canIncreaseZoom:factor");var b=this.g;if(null===b||b.cl!==$g)return!1;a*=b.scale;return a<b.jh||a>b.ih?!1:b.mw};Yf.prototype.resetZoom=function(a){void 0===a&&(a=this.uw);v.We(a,Yf,"resetZoom:newscale");var b=this.g;null===b||a<b.jh||a>b.ih||(b.scale=a)}; +Yf.prototype.canResetZoom=function(a){void 0===a&&(a=this.uw);v.We(a,Yf,"canResetZoom:newscale");var b=this.g;return null===b||a<b.jh||a>b.ih?!1:b.mw};Yf.prototype.zoomToFit=function(){var a=this.g;if(null!==a){var b=a.scale,c=a.position;b===this.Wy&&!isNaN(this.wy)&&a.Zd.K(this.Vy)?(a.scale=this.wy,a.position=this.ZB,this.Wy=NaN,this.Vy=bd):(this.wy=b,this.ZB=c.copy(),a.zoomToFit(),this.Wy=a.scale,this.Vy=a.Zd.copy())}};Yf.prototype.canZoomToFit=function(){var a=this.g;return null===a?!1:a.mw}; +Yf.prototype.scrollToPart=function(a){void 0===a&&(a=null);null!==a&&v.A(a,R,Yf,"part");var b=this.g;if(null!==b){if(null===a){try{null!==this.Hi&&(this.Hi.next()?a=this.Hi.value:this.Hi=null)}catch(c){this.Hi=null}null===a&&(0<b.Om.count?this.Hi=b.Om.i:0<b.selection.count&&(this.Hi=b.selection.i),null!==this.Hi&&this.Hi.next()&&(a=this.Hi.value))}if(null!==a){var d=b.Na;d.Xm("Scroll To Part");var e=b.position.copy();b.lG(a.U);e.Fc(b.position)&&d.$h()}}}; +Yf.prototype.canScrollToPart=function(a){void 0===a&&(a=null);null!==a&&v.A(a,R,Yf,"part");a=this.g;return null===a||0===a.selection.count&&0===a.Om.count?!1:a.oe&&a.pe};Yf.prototype.collapseTree=function(a){void 0===a&&(a=null);var b=this.g;if(null!==b)try{b.Qb("Collapse Tree");b.Na.Xm("Collapse Tree");var c=new I(S);if(null!==a&&a.md)a.collapseTree(),c.add(a);else for(var d=b.selection.i;d.next();){var e=d.value;e instanceof S&&(a=e,a.md&&(a.collapseTree(),c.add(a)))}b.Ba("TreeCollapsed",c)}finally{b.wd("Collapse Tree")}}; +Yf.prototype.canCollapseTree=function(a){void 0===a&&(a=null);var b=this.g;if(null===b||b.ab)return!1;if(null!==a){if(!a.md)return!1;if(0<a.Dw().count)return!0}else for(a=b.selection.i;a.next();)if(b=a.value,b instanceof S&&b.md&&0<b.Dw().count)return!0;return!1}; +Yf.prototype.expandTree=function(a){void 0===a&&(a=null);var b=this.g;if(null!==b)try{b.Qb("Expand Tree");b.Na.Xm("Expand Tree");var c=new I(S);if(null===a||a.md)for(var d=b.selection.i;d.next();){var e=d.value;e instanceof S&&(a=e,a.md||(a.expandTree(),c.add(a)))}else a.expandTree(),c.add(a);b.Ba("TreeExpanded",c)}finally{b.wd("Expand Tree")}}; +Yf.prototype.canExpandTree=function(a){void 0===a&&(a=null);var b=this.g;if(null===b||b.ab)return!1;if(null!==a){if(a.md)return!1;if(0<a.Dw().count)return!0}else for(a=b.selection.i;a.next();)if(b=a.value,b instanceof S&&!b.md&&0<b.Dw().count)return!0;return!1}; +Yf.prototype.groupSelection=function(){var a=this.g;if(null!==a){var b=a.ba;if(b instanceof Q){var c=this.hD;if(null!==c){var d=null;try{a.$b="wait";a.Qb("Group");a.Ba("ChangingSelection");for(var e=new I(R),f=a.selection.i;f.next();){var h=f.value;h.Od()&&h.canGroup()&&e.add(h)}for(var k=new I(R),l=e.i;l.next();){for(var m=l.value,f=!1,n=e.i;n.next();)if(m.Yh(n.value)){f=!0;break}f||k.add(m)}if(0<k.count){var p=k.first().Sa;if(null!==p)for(;null!==p;){for(var e=!1,q=k.i;q.next();)if(!q.value.Yh(p)){e= +!0;break}if(e)p=p.Sa;else break}if(c instanceof V)Xg(c),d=c.copy(),null!==d&&a.add(d);else if(b.Ez(c)){var r=b.copyNodeData(c);v.Ta(r)&&(b.Zk(r),d=a.Cw(r))}if(null!==d){null!==p&&this.isValidMember(p,d)&&(d.Sa=p);for(var s=k.i;s.next();){var t=s.value;this.isValidMember(d,t)&&(t.Sa=d)}a.select(d)}}a.Ba("ChangedSelection");a.Ba("SelectionGrouped",d)}finally{a.wd("Group"),a.$b=""}}}}}; +Yf.prototype.canGroupSelection=function(){var a=this.g;if(null===a||a.ab||a.vf||!a.Ho||!a.hw||!(a.ba instanceof Q)||null===this.hD)return!1;for(a=a.selection.i;a.next();){var b=a.value;if(b.Od()&&b.canGroup())return!0}return!1};function ah(a){var b=v.jb();for(a=a.i;a.next();){var c=a.value;c instanceof W||b.push(c)}a=new J(R);for(var c=b.length,d=0;d<c;d++){for(var e=b[d],f=!0,h=0;h<c;h++)if(e.Yh(b[h])){f=!1;break}f&&a.add(e)}v.sa(b);return a} +Yf.prototype.isValidMember=function(a,b){if(null===b||a===b||b instanceof W)return!1;if(null!==a){if(a===b||a.Yh(b))return!1;var c=a.Oz;if(null!==c&&!c(a,b)||null===a.data&&null!==b.data||null!==a.data&&null===b.data)return!1}c=this.Oz;return null!==c?c(a,b):!0}; +Yf.prototype.ungroupSelection=function(a){void 0===a&&(a=null);var b=this.g;if(null!==b){var c=b.ba;if(c instanceof Q)try{b.$b="wait";b.Qb("Ungroup");b.Ba("ChangingSelection");var d=new I(V);if(null!==a)d.add(a);else for(var e=b.selection.i;e.next();){var f=e.value;f instanceof V&&(a=f,a.canUngroup()&&d.add(a))}if(0<d.count){b.ow();for(var h=d.i;h.next();){var k=h.value;k.expandSubGraph();var l=k.Sa,m=null!==l&&null!==l.data?c.gb(l.data):void 0,n=new I(R);n.Tc(k.Ic);for(var p=n.i;p.next();){var q= +p.value;q.hb=!0;if(!(q instanceof W)){var r=q.data;null!==r?c.mx(r,m):q.Sa=l}}b.remove(k)}}b.Ba("ChangedSelection");b.Ba("SelectionUngrouped",d,n)}finally{b.wd("Ungroup"),b.$b=""}}};Yf.prototype.canUngroupSelection=function(a){void 0===a&&(a=null);var b=this.g;if(null===b||b.ab||b.vf||!b.xm||!b.lw||!(b.ba instanceof Q))return!1;if(null!==a){if(a.canUngroup())return!0}else for(a=b.selection.i;a.next();)if(b=a.value,b instanceof V&&b.canUngroup())return!0;return!1}; +Yf.prototype.addTopLevelParts=function(a,b){for(var c=!0,d=ah(a).i;d.next();){var e=d.value;null!==e.Sa&&(!b||this.isValidMember(null,e)?e.Sa=null:c=!1)}return c}; +Yf.prototype.collapseSubGraph=function(a){void 0===a&&(a=null);var b=this.g;if(null!==b)try{b.Qb("Collapse SubGraph");b.Na.Xm("Collapse SubGraph");var c=new I(V);if(null!==a&&a.ee)a.collapseSubGraph(),c.add(a);else for(var d=b.selection.i;d.next();){var e=d.value;e instanceof V&&(a=e,a.ee&&(a.collapseSubGraph(),c.add(a)))}b.Ba("SubGraphCollapsed",c)}finally{b.wd("Collapse SubGraph")}}; +Yf.prototype.canCollapseSubGraph=function(a){void 0===a&&(a=null);var b=this.g;if(null===b||b.ab)return!1;if(null!==a)return a.ee?!0:!1;for(a=b.selection.i;a.next();)if(b=a.value,b instanceof V&&b.ee)return!0;return!1}; +Yf.prototype.expandSubGraph=function(a){void 0===a&&(a=null);var b=this.g;if(null!==b)try{b.Qb("Expand SubGraph");b.Na.Xm("Expand SubGraph");var c=new I(V);if(null===a||a.ee)for(var d=b.selection.i;d.next();){var e=d.value;e instanceof V&&(a=e,a.ee||(a.expandSubGraph(),c.add(a)))}else a.expandSubGraph(),c.add(a);b.Ba("SubGraphExpanded",c)}finally{b.wd("Expand SubGraph")}}; +Yf.prototype.canExpandSubGraph=function(a){void 0===a&&(a=null);var b=this.g;if(null===b||b.ab)return!1;if(null!==a)return a.ee?!1:!0;for(a=b.selection.i;a.next();)if(b=a.value,b instanceof V&&!b.ee)return!0;return!1}; +Yf.prototype.editTextBlock=function(a){void 0===a&&(a=null);null!==a&&v.A(a,bh,Yf,"editTextBlock");var b=this.g;if(null!==b){var c=b.Za.uA;if(null!==c){if(null===a){a=null;for(var d=b.selection.i;d.next();){var e=d.value;if(e.canEdit()){a=e;break}}if(null===a)return;a=a.dt(function(a){return a instanceof bh&&a.oz})}null!==a&&(b.Wa=null,c.ze=a,b.Wa=c)}}}; +Yf.prototype.canEditTextBlock=function(a){void 0===a&&(a=null);null!==a&&v.A(a,bh,Yf,"canEditTextBlock");var b=this.g;if(null===b||b.ab||b.vf||!b.kw||null===b.Za.uA)return!1;if(null!==a){if(a=a.Y,null!==a&&a.canEdit())return!0}else for(b=b.selection.i;b.next();)if(a=b.value,a.canEdit()&&(a=a.dt(function(a){return a instanceof bh&&a.oz}),null!==a))return!0;return!1}; +Yf.prototype.showContextMenu=function(a){var b=this.g;if(null!==b){var c=b.Za.gz;if(null!==c&&(void 0===a&&(a=0<b.selection.count?b.selection.first():b),a=c.findObjectWithContextMenu(a),null!==a)){var d=new xf,e=null;a instanceof G?e=a.Xa(zb):b.sH||(e=b.rb,e=new z(e.x+e.width/2,e.y+e.height/2));null!==e&&(d.g=b,d.jf=b.nF(e),d.ca=e,d.left=!1,d.right=!0,d.up=!0,b.O=d);b.Wa=c;ch(c,!1,a)}}}; +Yf.prototype.canShowContextMenu=function(a){var b=this.g;if(null===b)return!1;var c=b.Za.gz;if(null===c)return!1;void 0===a&&(a=0<b.selection.count?b.selection.first():b);return null===c.findObjectWithContextMenu(a)?!1:!0};v.defineProperty(Yf,{wG:"copiesClipboardData"},function(){return this.aB},function(a){v.j(a,"boolean",Yf,"copiesClipboardData");this.aB=a}); +v.defineProperty(Yf,{xG:"copiesConnectedLinks"},function(){return this.bB},function(a){v.j(a,"boolean",Yf,"copiesConnectedLinks");this.bB=a});v.defineProperty(Yf,{DD:"deletesConnectedLinks"},function(){return this.uB},function(a){v.j(a,"boolean",Yf,"deletesConnectedLinks");this.uB=a});v.defineProperty(Yf,{zG:"copiesTree"},function(){return this.fB},function(a){v.j(a,"boolean",Yf,"copiesTree");this.fB=a}); +v.defineProperty(Yf,{GG:"deletesTree"},function(){return this.vB},function(a){v.j(a,"boolean",Yf,"deletesTree");this.vB=a});v.defineProperty(Yf,{wD:"copiesParentKey"},function(){return this.eB},function(a){v.j(a,"boolean",Yf,"copiesParentKey");this.eB=a});v.defineProperty(Yf,{vD:"copiesGroupKey"},function(){return this.dB},function(a){v.j(a,"boolean",Yf,"copiesGroupKey");this.dB=a}); +v.defineProperty(Yf,{hD:"archetypeGroupData"},function(){return this.QA},function(a){null!==a&&v.A(a,Object,Yf,"archetypeGroupData");var b=this.g;null!==b&&(b=b.ba,b instanceof Q&&(a instanceof V||b.Ez(a)||v.k("CommandHandler.archetypeGroupData must be either a Group or a data object for which GraphLinksModel.isGroupForNodeData is true: "+a)));this.QA=a});v.defineProperty(Yf,{Oz:"memberValidation"},function(){return this.Qk},function(a){null!==a&&v.j(a,"function",Yf,"memberValidation");this.Qk=a}); +v.defineProperty(Yf,{uw:"defaultScale"},function(){return this.sB},function(a){v.We(a,Yf,"defaultScale");0<a||v.k("defaultScale must be larger than zero, not: "+a);this.sB=a});v.defineProperty(Yf,{wx:"zoomFactor"},function(){return this.ZC},function(a){v.We(a,Yf,"zoomFactor");1<a||v.k("zoomFactor must be larger than 1.0, not: "+a);this.ZC=a});function Xf(){0<arguments.length&&v.cd(Xf);v.dc(this);this.W=null;this.Ob="";this.Se=!0;this.LB=!1;this.VC=null;this.dw=-1}v.ea("Tool",Xf); +Xf.prototype.Mc=function(a){this.W=a};Xf.prototype.toString=function(){return""!==this.name?this.name+" Tool":v.af(Object.getPrototypeOf(this))};Xf.prototype.updateAdornments=function(){};Xf.prototype.canStart=function(){return this.isEnabled};Xf.prototype.doStart=function(){};Xf.prototype.doActivate=function(){this.qa=!0};Xf.prototype.doDeactivate=function(){this.qa=!1};Xf.prototype.doStop=function(){};Xf.prototype.doCancel=function(){this.stopTool()}; +Xf.prototype.stopTool=function(){var a=this.g;null!==a&&a.Wa===this&&(a.Wa=null,a.$b="")};Xf.prototype.doMouseDown=function(){!this.qa&&this.canStart()&&this.doActivate()};Xf.prototype.doMouseMove=function(){};Xf.prototype.doMouseUp=function(){this.stopTool()};Xf.prototype.doMouseWheel=function(){};Xf.prototype.canStartMultiTouch=function(){return!0}; +Xf.prototype.standardPinchZoomStart=function(){var a=this.g;if(null!==a){var b=a.O.event,c=null,d=null;if(void 0!==b.targetTouches){if(2>b.targetTouches.length)return;c=b.targetTouches[0];d=b.targetTouches[1]}else if(null!==a.Jf[0])c=a.Jf[0],d=a.Jf[1];else return;this.doCancel();if(a.Yo("hasGestureZoom")){a.jy=!0;a.kC=a.scale;var e=dh(a),f=c,h=f.clientX-e.x,c=f.clientY-e.y,f=d,d=f.clientX-e.x,f=f.clientY-e.y;v.v(e);e=d-h;c=f-c;a.DC=Math.sqrt(e*e+c*c);b.preventDefault();b.cancelBubble=!0}}}; +Xf.prototype.standardPinchZoomMove=function(){var a=this.g;if(null!==a){var b=a.O.event;this.doCancel();var c=null,d=null;if(void 0!==b.targetTouches){if(2>b.targetTouches.length)return;c=b.targetTouches[0];d=b.targetTouches[1]}else if(null!==a.Jf[0])c=a.Jf[0],d=a.Jf[1];else return;if(a.Yo("hasGestureZoom")&&a.jy){var e=dh(a),f=c,c=f.clientX-e.x,h=f.clientY-e.y,f=d,d=f.clientX-e.x,f=f.clientY-e.y;v.v(e);var e=d-c,k=f-h,e=Math.sqrt(e*e+k*k)/a.DC,c=new z((Math.min(d,c)+Math.max(d,c))/2,(Math.min(f, +h)+Math.max(f,h))/2),h=a.kC*e,d=a.nb;h!==a.scale&&d.canResetZoom(h)&&(e=a.Il,a.Il=c,d.resetZoom(h),a.Il=e);b.preventDefault();b.cancelBubble=!0}}};Xf.prototype.doKeyDown=function(){var a=this.g;null!==a&&"Esc"===a.O.key&&this.doCancel()};Xf.prototype.doKeyUp=function(){};Xf.prototype.startTransaction=Xf.prototype.Qb=function(a){void 0===a&&(a=this.name);this.Bf=null;var b=this.g;return null===b?!1:b.Qb(a)}; +Xf.prototype.stopTransaction=Xf.prototype.gk=function(){var a=this.g;return null===a?!1:null===this.Bf?a.zp():a.wd(this.Bf)}; +Xf.prototype.standardMouseSelect=function(){var a=this.g;if(null!==a&&a.of){var b=a.O,c=a.ht(b.ca,!1);if(null!==c)if(v.bk?b.Ft:b.control){a.Ba("ChangingSelection");for(b=c;null!==b&&!b.canSelect();)b=b.Sa;null!==b&&(b.hb=!b.hb);a.Ba("ChangedSelection")}else if(b.shift){if(!c.hb){a.Ba("ChangingSelection");for(b=c;null!==b&&!b.canSelect();)b=b.Sa;null!==b&&(b.hb=!0);a.Ba("ChangedSelection")}}else{if(!c.hb){for(b=c;null!==b&&!b.canSelect();)b=b.Sa;null!==b&&a.select(b)}}else!b.left||(v.bk?b.Ft:b.control)|| +b.shift||a.ow()}};Xf.prototype.standardMouseClick=function(a,b){void 0===a&&(a=null);void 0===b&&(b=function(a){return!a.layer.Gc});var c=this.g;if(null===c)return!1;var d=c.O,e=c.re(d.ca,a,b);d.ye=e;eh(e,d,c);return d.zc}; +function eh(a,b,c){b.zc=!1;var d=0;b.left?d=1===b.Ge?1:2===b.Ge?2:1:b.right&&1===b.Ge&&(d=3);var e="";if(null!==a){switch(d){case 1:e="ObjectSingleClicked";break;case 2:e="ObjectDoubleClicked";break;case 3:e="ObjectContextClicked"}0!==d&&c.Ba(e,a)}else{switch(d){case 1:e="BackgroundSingleClicked";break;case 2:e="BackgroundDoubleClicked";break;case 3:e="BackgroundContextClicked"}0!==d&&c.Ba(e)}if(null!==a)for(;null!==a;){c=null;switch(d){case 1:c=a.click;break;case 2:c=a.at?a.at:a.click;break;case 3:c= +a.fz}if(null!==c&&(c(b,a),b.zc))break;a=a.R}else{a=null;switch(d){case 1:a=c.click;break;case 2:a=c.at?c.at:c.click;break;case 3:a=c.fz}null!==a&&a(b)}} +Xf.prototype.standardMouseOver=function(){var a=this.g;if(null!==a){var b=a.O;if(null!==b.g&&!0!==a.Na.pc){var c=a.tb;a.tb=!0;var d=a.re(b.ca,null,null);b.ye=d;var e=!1;if(d!==a.wn){var f=a.wn,h=f;a.wn=d;this.doCurrentObjectChanged(f,d);for(b.zc=!1;null!==f;){var k=f.Ht;if(null!==k){if(d===f)break;if(null!==d&&d.ul(f))break;k(b,f,d);e=!0;if(b.zc)break}f=f.R}f=h;for(b.zc=!1;null!==d;){k=d.Gt;if(null!==k){if(f===d)break;if(null!==f&&f.ul(d))break;k(b,d,f);e=!0;if(b.zc)break}d=d.R}d=a.wn}if(null!==d){f= +d;for(k="";null!==f;){k=f.cursor;if(""!==k)break;f=f.R}a.$b=k;b.zc=!1;for(f=d;null!==f;){k=f.Sz;if(null!==k&&(k(b,f),e=!0,b.zc))break;f=f.R}}else a.$b="",k=a.Sz,null!==k&&(k(b),e=!0);e&&a.ue();a.tb=c}}};Xf.prototype.doCurrentObjectChanged=function(){}; +Xf.prototype.standardMouseWheel=function(){var a=this.g;if(null!==a){var b=a.O,c=b.il;if(0!==c&&a.Zd.G()){var d=a.nb,e=a.Za.It;if((e===fh&&!b.shift||e===gh&&b.control)&&(0<c?d.canIncreaseZoom():d.canDecreaseZoom()))e=a.Il,a.Il=b.jf,0<c?d.increaseZoom():d.decreaseZoom(),a.Il=e,b.bubbles=!1;else if(e===fh&&b.shift||e===gh&&!b.control){var d=a.position.copy(),e=0<c?c:-c,f=b.event.deltaX,h=b.event.deltaY;void 0===f||void 0===h||0===f&&0===h?!b.shift&&a.pe?(f=a.Ut,e=e/40*f,0<c?a.scroll("pixel","up",e): +a.scroll("pixel","down",e)):b.shift&&a.oe&&(f=a.Tt,e=e/40*f,0<c?a.scroll("pixel","left",e):a.scroll("pixel","right",e)):(0!==f&&a.oe&&(0<f?a.scroll("pixel","left",-f):a.scroll("pixel","right",f)),0!==h&&a.pe&&(0<h?a.scroll("pixel","up",-h):a.scroll("pixel","down",h)));a.position.K(d)||(b.bubbles=!1)}}}};Xf.prototype.standardWaitAfter=function(a,b){v.j(a,"number",Xf,"standardWaitAfter:delay");this.cancelWaitAfter();var c=this,d=b.copy();this.dw=v.setTimeout(function(){c.doWaitAfter(d)},a)}; +Xf.prototype.cancelWaitAfter=function(){-1!==this.dw&&v.clearTimeout(this.dw);this.dw=-1};Xf.prototype.doWaitAfter=function(){};Xf.prototype.findToolHandleAt=function(a,b){var c=this.g;if(null===c)return null;c=c.re(a,function(a){for(;null!==a&&!(a.R instanceof Vg);)a=a.R;return a});return null===c?null:c.R.fc===b?c:null}; +Xf.prototype.isBeyondDragSize=function(a,b){var c=this.g;if(null===c)return!1;void 0===a&&(a=c.yc.jf);void 0===b&&(b=c.O.jf);var d=c.Za.KG,e=d.width,d=d.height;c.yc.Xi&&(e+=6,d+=6);return Math.abs(b.x-a.x)>e||Math.abs(b.y-a.y)>d};v.u(Xf,{g:"diagram"},function(){return this.W});v.defineProperty(Xf,{name:"name"},function(){return this.Ob},function(a){v.j(a,"string",Xf,"name");this.Ob=a}); +v.defineProperty(Xf,{isEnabled:"isEnabled"},function(){return this.Se},function(a){v.j(a,"boolean",Xf,"isEnabled");this.Se=a});v.defineProperty(Xf,{qa:"isActive"},function(){return this.LB},function(a){v.j(a,"boolean",Xf,"isActive");this.LB=a});v.defineProperty(Xf,{Bf:"transactionResult"},function(){return this.VC},function(a){null!==a&&v.j(a,"string",Xf,"transactionResult");this.VC=a}); +function Zg(){0<arguments.length&&v.cd(Zg);Xf.call(this);this.name="Dragging";this.cB=this.PB=!0;this.Qq=this.BB=!1;this.UB=!0;this.ky=(new ia(NaN,NaN)).freeze();this.ly=rb;this.my=(new z(NaN,NaN)).freeze();this.AB=!1;this.yB=this.$A=this.zB=this.kB=this.Fi=null;this.zq=this.SB=!1;this.uo=new z(NaN,NaN);this.Uv=new z;this.Xv=!1;this.OB=!0;this.Fn=100;this.lj=[];this.CF=(new J(R)).freeze()}v.Ja(Zg,Xf);v.ea("DraggingTool",Zg); +v.defineProperty(Zg,{cE:"isCopyEnabled"},function(){return this.PB},function(a){v.j(a,"boolean",Zg,"isCopyEnabled");this.PB=a});v.defineProperty(Zg,{yG:"copiesEffectiveCollection"},function(){return this.cB},function(a){v.j(a,"boolean",Zg,"copiesEffectiveCollection");this.cB=a});v.defineProperty(Zg,{LG:"dragsTree"},function(){return this.BB},function(a){v.j(a,"boolean",Zg,"dragsTree");this.BB=a}); +v.defineProperty(Zg,{Jw:"isGridSnapEnabled"},function(){return this.Qq},function(a){v.j(a,"boolean",Zg,"isGridSnapEnabled");this.Qq=a});v.defineProperty(Zg,{oH:"isComplexRoutingRealtime"},function(){return this.OB},function(a){v.j(a,"boolean",Zg,"isComplexRoutingRealtime");this.OB=a});v.defineProperty(Zg,{qH:"isGridSnapRealtime"},function(){return this.UB},function(a){v.j(a,"boolean",Zg,"isGridSnapRealtime");this.UB=a}); +v.defineProperty(Zg,{UD:"gridSnapCellSize"},function(){return this.ky},function(a){v.A(a,ia,Zg,"gridSnapCellSize");this.ky.K(a)||(this.ky=a=a.S())});v.defineProperty(Zg,{$G:"gridSnapCellSpot"},function(){return this.ly},function(a){v.A(a,L,Zg,"gridSnapCellSpot");this.ly.K(a)||(this.ly=a=a.S())});v.defineProperty(Zg,{aH:"gridSnapOrigin"},function(){return this.my},function(a){v.A(a,z,Zg,"gridSnapOrigin");this.my.K(a)||(this.my=a=a.S())}); +v.defineProperty(Zg,{Si:"dragsLink"},function(){return this.AB},function(a){v.j(a,"boolean",Zg,"dragsLink");this.AB=a});v.defineProperty(Zg,{Im:"currentPart"},function(){return this.kB},function(a){null!==a&&v.A(a,R,Zg,"currentPart");this.kB=a});v.defineProperty(Zg,{gc:"copiedParts"},function(){return this.$A},function(a){this.$A=a});v.defineProperty(Zg,{ac:"draggedParts"},function(){return this.zB},function(a){this.zB=a}); +v.u(Zg,{LJ:"draggingParts"},function(){return null!==this.gc?this.gc.ej():null!==this.ac?this.ac.ej():this.CF});v.defineProperty(Zg,{ad:"draggedLink"},function(){return this.yB},function(a){null!==a&&v.A(a,W,Zg,"draggedLink");this.yB=a});v.defineProperty(Zg,{Iw:"isDragOutStarted"},function(){return this.SB},function(a){this.SB=a});v.defineProperty(Zg,{fk:"startPoint"},function(){return this.Uv},function(a){v.A(a,z,Zg,"startPoint");this.Uv.K(a)||(this.Uv=a=a.S())}); +v.defineProperty(Zg,{zD:"delay"},function(){return this.Fn},function(a){v.j(a,"number",Zg,"delay");this.Fn=a});Zg.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.g;if(null===a||a.ab&&!a.Ss||!a.bl&&!a.Vj&&!a.Ss||!a.of)return!1;var b=a.O;return!b.left||a.Wa!==this&&(!this.isBeyondDragSize()||b.Xi&&b.timestamp-a.yc.timestamp<this.Fn)?!1:null!==this.findDraggablePart()}; +Zg.prototype.findDraggablePart=function(){var a=this.g;if(null===a)return null;a=a.ht(a.yc.ca,!1);if(null===a)return null;for(;null!==a&&!a.canSelect();)a=a.Sa;return null!==a&&(a.canMove()||a.canCopy())?a:null};Zg.prototype.standardMouseSelect=function(){var a=this.g;if(null!==a&&a.of){var b=a.ht(a.yc.ca,!1);if(null!==b){for(;null!==b&&!b.canSelect();)b=b.Sa;this.Im=b;this.Im.hb||(a.Ba("ChangingSelection"),b=a.O,(v.bk?b.Ft:b.control)||b.shift||Yg(a),this.Im.hb=!0,a.Ba("ChangedSelection"))}}}; +Zg.prototype.doActivate=function(){var a=this.g;if(null!==a){null===this.Im&&this.standardMouseSelect();var b=this.Im;null!==b&&(b.canMove()||b.canCopy())&&(this.qa=!0,this.uo.set(a.position),hh(this,a.selection),this.lj.length=0,this.ac=this.computeEffectiveCollection(a.selection),a.bu=!0,ih(this,this.ac),this.Qb("Drag"),this.fk=a.yc.ca,a.Oe=!0,a.Ss&&(this.Iw=!0,this.zq=!1,jh=this,kh=this.g,this.doSimulatedDragOut()))}}; +function hh(a,b){if(a.Si){var c=a.g;null!==c&&c.ym&&(c.ba instanceof Q&&1===b.count&&b.first()instanceof W?(a.ad=b.first(),a.ad.canRelinkFrom()&&a.ad.canRelinkTo()&&a.ad.Vs(),a.Fi=c.Za.CE,null===a.Fi&&(a.Fi=new lh,a.Fi.Mc(c))):(a.ad=null,a.Fi=null))}} +Zg.prototype.computeEffectiveCollection=function(a){var b=null!==this.g&&this.g.Wa===this,c=new na(R);if(null===a)return c;for(var d=a.i;d.next();)vh(this,c,d.value,b);if(null!==this.ad&&this.Si)return c;for(d=a.i;d.next();)a=d.value,a instanceof W&&(b=a.T,null===b||c.contains(b)?(b=a.Z,null===b||c.contains(b)||c.remove(a)):c.remove(a));return c};function Dh(a){return void 0===a?new Eh(ad):new Eh(a.copy())} +function vh(a,b,c,d){if(!b.contains(c)&&(!d||c.canMove()||c.canCopy()))if(c instanceof S){b.add(c,Dh(c.location));if(c instanceof V)for(var e=c.Ic;e.next();)vh(a,b,e.value,d);for(e=c.te;e.next();){var f=e.value;if(!b.contains(f)){var h=f.T,k=f.Z;null!==h&&b.contains(h)&&null!==k&&b.contains(k)&&vh(a,b,f,d)}}if(a.LG)for(c=c.MD();c.next();)vh(a,b,c.value,d)}else if(c instanceof W)for(f=c,b.add(f,Dh()),e=f.Sf;e.next();)vh(a,b,e.value,d);else c instanceof Vg||b.add(c,Dh(c.location))} +Zg.prototype.doDeactivate=function(){this.qa=!1;var a=this.g;null!==a&&Fh(a);Gh(this);Hh(this,this.ac);this.ac=this.Im=null;this.zq=this.Iw=!1;if(0<Ih.count){for(var b=Ih.length,c=0;c<b;c++){var d=Ih.da(c);Jh(d);Kh(d);Gh(d);null!==d.g&&Fh(d.g)}Ih.clear()}Jh(this);this.uo.m(NaN,NaN);jh=kh=null;Kh(this);a.Oe=!1;a.$b="";a.bu=!1;this.gk()};function Gh(a){var b=a.g;if(null!==b){var c=b.tb;b.tb=!0;Lh(a,b.O,null);b.tb=c}a.lj.length=0} +function Mh(){var a=jh;Kh(a);Nh(a);var b=a.g;null!==b&&a.uo.G()&&(b.position=a.uo);null!==b&&Fh(b)}Zg.prototype.doCancel=function(){Kh(this);Nh(this);var a=this.g;null!==a&&this.uo.G()&&(a.position=this.uo);this.stopTool()};function ih(a,b){if(null!==b){a.Xv=!0;for(var c=b.i;c.next();){var d=c.key;d instanceof W&&(d.Jp=!0)}}}function Hh(a,b){if(null!==b){for(var c=b.i;c.next();){var d=c.key;d instanceof W&&(d.Jp=!1,d.sl&&Oh(d)&&d.ic())}a.Xv=!1}} +Zg.prototype.doKeyDown=function(){var a=this.g;null!==a&&(a=a.O,null!==a&&this.qa&&("Esc"===a.key?this.doCancel():this.doMouseMove()))};Zg.prototype.doKeyUp=function(){var a=this.g;null!==a&&null!==a.O&&this.qa&&this.doMouseMove()};function Ph(a,b){for(var c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,h=a.i;h.next();){var k=h.value;if(k.Od()&&k.isVisible()){var l=k.location,k=l.x,l=l.y;isNaN(k)||isNaN(l)||(k<c&&(c=k),l<d&&(d=l),k>e&&(e=k),l>f&&(f=l))}}Infinity===c?b.m(0,0,0,0):b.m(c,d,e-c,f-d)} +function Qh(a,b){if(null===a.gc){var c=a.g;if(!(null===c||b&&(c.ab||c.vf))&&null!==a.ac){var d=c.la;d.isEnabled&&d.hE?null!==d.Qi&&0<d.Qi.Of.count&&(c.la.zp(),c.Qb("Drag")):Nh(a);c.tb=!b;c.Qp=!b;a.fk=c.yc.ca;d=a.yG?a.ac.ej():c.selection;d=c.Oo(d,c,!0);for(c=d.i;c.next();)c.value.location=c.key.location;c=v.ag();Ph(d,c);v.Vb(c);for(var c=new na(R),e=a.ac.i;e.next();){var f=e.key;f.Od()&&f.canCopy()&&(f=d.ja(f),null!==f&&(f.sf(),c.add(f,Dh(f.location))))}for(d=d.i;d.next();)e=d.value,e instanceof W&& +e.canCopy()&&c.add(e,Dh());a.gc=c;hh(a,c.ej());null!==a.ad&&(c=a.ad,d=c.Zm,c.xl(a.fk.x-(d.x+d.width/2),a.fk.y-(d.y+d.height/2)))}}}function Kh(a){var b=a.g;if(null!==b){if(null!==a.gc&&(b.fA(a.gc.ej(),!1),a.gc=null,null!==a.ac))for(var c=a.ac.i;c.next();)c.key instanceof W&&(c.value.point=new z(0,0));b.tb=!1;b.Qp=!1;a.fk=b.yc.ca}}function Jh(a){if(null!==a.ad){if(a.Si&&null!==a.Fi){var b=a.Fi;b.g.remove(b.Ad);b.g.remove(b.Bd)}a.ad=null;a.Fi=null}} +function Rh(a,b,c){var d=a.g;if(null!==d){var e=a.fk,f=v.L();f.assign(d.O.ca);a.moveParts(b,f.du(e),c);v.v(f)}} +Zg.prototype.moveParts=function(a,b,c){if(null!==a&&(v.A(a,na,Zg,"moveParts:parts"),0!==a.count)){var d=v.L(),e=v.L();e.assign(b);isNaN(e.x)&&(e.x=0);isNaN(e.y)&&(e.y=0);(b=this.Xv)||ih(this,a);for(var f=new I(Sh),h=new I(Ea),k=a.i;k.next();){var l=k.key;if(l.Od()){var m=Th(this,l,a);if(null!==m)f.add(new Sh(l,k.value,m));else if(!c||l.canMove()){m=k.value.point;d.assign(m);var n=v.L(),p=this.computeMove(l,d.add(e),a,n);l.location=p;k.value.ZE=n.du(m);v.v(n)}}else k.key instanceof W&&h.add(k.cb)}for(c= +f.i;c.next();)f=c.value,m=f.info.point,d.assign(m),f.Jc.location=d.add(f.bH.ZE);c=v.L();m=v.L();for(h=h.i;h.next();)if(k=h.value,f=k.key,f instanceof W)if(f.Jp)l=f.T,n=f.Z,null!==this.ad&&this.Si?(k=k.value.point,a.add(f,Dh(e)),l=e.x-k.x,k=e.y-k.y,f.xl(l,k)):(null!==l&&(c.assign(l.location),p=a.ja(l),null!==p&&c.du(p.point)),null!==n&&(m.assign(n.location),p=a.ja(n),null!==p&&m.du(p.point)),null!==l&&null!==n?c.Fc(m)?(k=k.value.point,l=d,l.assign(c),l.du(k),a.add(f,Dh(c)),f.xl(l.x,l.y)):(f.Jp=!1, +f.ic()):(k=k.value.point,n=null!==l?c:null!==n?m:e,a.add(f,Dh(n)),l=n.x-k.x,k=n.y-k.y,f.xl(l,k)));else if(null===f.T||null===f.Z)k=k.value.point,a.add(f,Dh(e)),l=e.x-k.x,k=e.y-k.y,f.xl(l,k);v.v(d);v.v(e);v.v(c);v.v(m);b||Hh(this,a)}};function Th(a,b,c){b=b.Sa;if(null!==b){a=Th(a,b,c);if(null!==a)return a;a=c.ja(b);if(null!==a)return a}return null} +function Nh(a){if(null!==a.ac){for(var b=a.g,c=a.ac.i;c.next();){var d=c.key;d.Od()&&(d.location=c.value.point)}for(c=a.ac.i;c.next();)if(d=c.key,d instanceof W&&d.Jp){var e=c.value.point;a.ac.add(d,Dh());d.xl(-e.x,-e.y)}b.Uf()}} +Zg.prototype.computeMove=function(a,b,c,d){void 0===d&&(d=new z);d.assign(b);if(null===a)return d;void 0===c&&(c=null);var e=b;if(this.Jw&&(this.qH||null===c||this.g.O.up)&&(e=v.L(),c=e,c.assign(b),null!==a)){var f=this.g;if(null!==f){var h=f.$o,k=this.UD,f=k.width,k=k.height,l=this.aH,m=l.x,l=l.y,n=this.$G;if(null!==h){var p=h.Fw;isNaN(f)&&(f=p.width);isNaN(k)&&(k=p.height);h=h.TD;isNaN(m)&&(m=h.x);isNaN(l)&&(l=h.y)}h=v.Mb(0,0);h.$t(0,0,f,k,n);Pa(b.x,b.y,m+h.x,l+h.y,f,k,c);v.v(h)}}c=null!==a.ED? +a.ED(a,b,e):e;k=a.QH;f=k.x;isNaN(f)&&(f=a.location.x);k=k.y;isNaN(k)&&(k=a.location.y);h=a.LH;m=h.x;isNaN(m)&&(m=a.location.x);h=h.y;isNaN(h)&&(h=a.location.y);d.m(Math.max(f,Math.min(c.x,m)),Math.max(k,Math.min(c.y,h)));e!==b&&v.v(e);return d};function Uh(a,b){if(null===b)return!0;var c=b.Y;return null===c||c instanceof Vg||c.layer.Gc||a.ac&&a.ac.contains(c)||a.gc&&a.gc.contains(c)?!0:!1} +function Vh(a,b,c,d){var e=a.g;if(null!==e){a.Si&&(null!==a.ad&&(a.ad.T=null,a.ad.Z=null),Wh(a,!1));var f=Xh(e,b,null,function(b){return!Uh(a,b)}),h=e.O;h.ye=f;var k=e.tb,l=!1;try{e.tb=!0;l=Lh(a,h,f);if(!a.qa&&null===jh)return;if(null===f){var m=e.UH;null!==m&&(m(h),l=!0)}if(!a.qa&&null===jh)return;a.doDragOver(b,f);if(!a.qa&&null===jh)return}finally{e.tb=k,l&&e.Uf()}(e.oe||e.pe)&&(c||d)&&Yh(e,h.jf)}} +function Lh(a,b,c){var d=!1,e=a.lj.length,f=0<e?a.lj[0]:null;if(c===f)return!1;b.zc=!1;for(var h=0;h<e;h++){var k=a.lj[h],l=k.TH;if(null!==l&&(l(b,k,c),d=!0,b.zc))break}a.lj.length=0;if(!a.qa&&null===jh||null===c)return d;for(b.zc=!1;null!==c;)a.lj.push(c),c=Zh(c);e=a.lj.length;for(h=0;h<e&&(k=a.lj[h],l=k.SH,null===l||(l(b,k,f),d=!0,!b.zc));h++);return d}function Zh(a){var b=a.R;return null!==b?b:a instanceof R&&!(a instanceof V)&&(a=a.Sa,null!==a&&a.eH)?a:null} +function $h(a,b,c){var d=a.Fi;if(null===d)return null;var e=a.g.Km(b,d.AE,function(a){return d.findValidLinkablePort(a,c)});a=v.L();for(var f=Infinity,h=null,e=e.i;e.next();){var k=e.value;if(null!==k.Y){var l=k.Xa(zb,a),l=b.rf(l);l<f&&(h=k,f=l)}}v.v(a);return h} +function Wh(a,b){var c=a.ad;if(null!==c&&!(2>c.oa)){var d=a.g;if(null!==d&&!d.ab&&(d=a.Fi,null!==d)){var e=null,f=null;null===c.T&&(e=$h(a,c.l(0),!1),null!==e&&(f=e.Y));var h=null,k=null;null===c.Z&&(h=$h(a,c.l(c.oa-1),!0),null!==h&&(k=h.Y));d.isValidLink(f,e,k,h)?b?(c.zn=c.l(0).copy(),c.Dn=c.l(c.oa-1).copy(),c.Jp=!1,c.T=f,null!==e&&(c.xg=e.Rd),c.Z=k,null!==h&&(c.sh=h.Rd)):ai(d,f,e,k,h):ai(d,null,null,null,null)}}}Zg.prototype.doDragOver=function(){}; +function bi(a,b){var c=a.g;if(null!==c){a.Si&&Wh(a,!0);Gh(a);var d=Xh(c,b,null,function(b){return!Uh(a,b)}),e=c.O;e.ye=d;if(null!==d){e.zc=!1;for(var f=d;null!==f;){var h=f.Pz;if(null!==h&&(h(e,f),e.zc))break;f=Zh(f)}}else h=c.Pz,null!==h&&h(e);if(a.qa||null!==jh)if(a.doDropOnto(b,d),a.qa||null!==jh)for(d=c.selection.i;d.next();)e=d.value,e instanceof S&&ci(c,e.U)}}Zg.prototype.doDropOnto=function(){}; +Zg.prototype.doMouseMove=function(){if(this.qa){var a=this.g;if(null!==a&&null!==this.Im&&null!==this.ac){var b=!1,c=!1;this.mayCopy()?(b=!0,a.$b="copy",Qh(this,!1),ih(this,this.gc),Rh(this,this.gc,!1),Hh(this,this.gc)):this.mayMove()?(c=!0,a.$b="default",Kh(this),Rh(this,this.ac,!0)):this.mayDragOut()?(a.$b="no-drop",Qh(this,!1),Rh(this,this.gc,!1)):Kh(this);Vh(this,a.O.ca,c,b)}}}; +Zg.prototype.doMouseUp=function(){if(this.qa){var a=this.g;if(null!==a){var b=!1,c=this.mayCopy();c&&null!==this.gc?(Kh(this),Qh(this,!0),ih(this,this.gc),Rh(this,this.gc,!1),Hh(this,this.gc),null!==this.gc&&a.UE(this.gc.ej())):(b=!0,Kh(this),this.mayMove()&&(Rh(this,this.ac,!0),Vh(this,a.O.ca,!0,!1)));this.zq=!0;bi(this,a.O.ca);if(this.qa){this.gc=null;if(b&&null!==this.ac)for(b=this.ac.i;b.next();){var d=b.key;d instanceof S&&(d=d.Sa,null===d||null===d.placeholder||this.ac.contains(d)||d.sD&&d.N())}a.qc(); +Hh(this,this.ac);this.Bf=c?"Copy":"Move";a.Ba(c?"SelectionCopied":"SelectionMoved",a.selection)}this.stopTool()}}};Zg.prototype.mayCopy=function(){if(!this.cE)return!1;var a=this.g;if(null===a||a.ab||a.vf||!a.Ho||!a.Vj||(v.bk?!a.O.alt:!a.O.control))return!1;for(a=a.selection.i;a.next();){var b=a.value;if(b.Od()&&b.canCopy())return!0}return null!==this.ad&&this.Si&&this.ad.canCopy()?!0:!1}; +Zg.prototype.mayDragOut=function(){if(!this.cE)return!1;var a=this.g;if(null===a||!a.Ss||!a.Vj||a.bl)return!1;for(a=a.selection.i;a.next();){var b=a.value;if(b.Od()&&b.canCopy())return!0}return null!==this.ad&&this.Si&&this.ad.canCopy()?!0:!1};Zg.prototype.mayMove=function(){var a=this.g;if(null===a||a.ab||!a.bl)return!1;for(a=a.selection.i;a.next();){var b=a.value;if(b.Od()&&b.canMove())return!0}return null!==this.ad&&this.Si&&this.ad.canMove()?!0:!1};var Ih=new I(Zg),jh=null,kh=null; +Zg.prototype.mayDragIn=function(){var a=this.g;if(null===a||!a.fD||a.ab||a.vf||!a.Ho)return!1;var b=jh;return null===b||b.g.ba.gl!==a.ba.gl?!1:!0};Zg.prototype.doSimulatedDragEnter=function(){if(this.mayDragIn()){var a=this.g;a.Na.$h();di(a);a=jh;null!==a&&(a.g.$b="copy")}};Zg.prototype.doSimulatedDragLeave=function(){var a=jh;null!==a&&a.doSimulatedDragOut();this.doCancel()}; +Zg.prototype.doSimulatedDragOver=function(){var a=this.g;if(null!==a){var b=jh;null!==b&&null!==b.ac&&this.mayDragIn()&&(a.$b="copy",ei(this,b.ac.ej(),!1),Rh(this,this.gc,!1),Vh(this,a.O.ca,!1,!0))}}; +Zg.prototype.doSimulatedDrop=function(){var a=this.g;if(null!==a){var b=jh;if(null!==b){var c=b.g;b.zq=!0;Kh(this);this.mayDragIn()&&(this.Qb("Drop"),ei(this,b.ac.ej(),!0),Rh(this,this.gc,!1),null!==this.gc&&a.UE(this.gc.ej()),bi(this,a.O.ca),a.qc(),b=a.selection,null!==this.gc?this.Bf="ExternalCopy":b=new J(R),this.gc=null,a.focus(),a.Ba("ExternalObjectsDropped",b,c),this.gk())}}}; +function ei(a,b,c){if(null===a.gc){var d=a.g;if(null!==d&&!d.ab&&!d.vf){d.tb=!c;d.Qp=!c;a.fk=d.O.ca;d=d.Oo(b,d,!0);c=v.ag();Ph(b,c);var e=c.x+c.width/2,f=c.y+c.height/2;v.Vb(c);var h=a.Uv;c=new na(R);var k=v.L();for(b=b.i;b.next();){var l=b.value;if(l.Od()&&l.canCopy()){var m=l.location,l=d.ja(l);k.m(h.x-(e-m.x),h.y-(f-m.y));l.location=k;l.sf();c.add(l,Dh(k))}}v.v(k);for(d=d.i;d.next();)e=d.value,e instanceof W&&e.canCopy()&&c.add(e,Dh());a.gc=c;hh(a,c.ej());null!==a.ad&&(c=a.ad,d=c.Zm,c.xl(a.fk.x- +(d.x+d.width/2),a.fk.y-(d.y+d.height/2)))}}}Zg.prototype.doSimulatedDragOut=function(){var a=this.g;null!==a&&(this.mayCopy()||this.mayMove()?a.$b="":a.$b="no-drop")};function Eh(a){this.point=a;this.ZE=ad}v.ea("DraggingInfo",Eh);function Sh(a,b,c){this.Jc=a;this.info=b;this.bH=c} +function fi(){0<arguments.length&&v.cd(fi);Xf.call(this);this.uC=100;this.XB=!1;var a=new W,b=new Y;b.Rf=!0;b.stroke="blue";a.add(b);b=new Y;b.Kp="Standard";b.fill="blue";b.stroke="blue";a.add(b);a.Tf="Tool";this.NC=a;a=new S;b=new Y;b.Rd="";b.Ab="Rectangle";b.fill=null;b.stroke="magenta";b.lb=2;b.za=qd;a.add(b);a.Al=!1;a.Tf="Tool";this.LC=a;this.MC=b;a=new S;b=new Y;b.Rd="";b.Ab="Rectangle";b.fill=null;b.stroke="magenta";b.lb=2;b.za=qd;a.add(b);a.Al=!1;a.Tf="Tool";this.OC=a;this.PC=b;this.rC=this.qC= +this.mC=this.lC=this.nC=null;this.TB=!0;this.UF=new na(G,"boolean");this.vC=this.Nk=this.HC=null}v.Ja(fi,Xf);v.ea("LinkingBaseTool",fi);fi.prototype.doStop=function(){var a=this.g;null!==a&&Fh(a);this.Gg=this.Fg=this.Eg=this.Dg=this.kc=null;this.vx.clear();this.$f=null};v.defineProperty(fi,{AE:"portGravity"},function(){return this.uC},function(a){v.j(a,"number",fi,"portGravity");0<=a&&(this.uC=a)}); +v.defineProperty(fi,{gp:"isUnconnectedLinkValid"},function(){return this.XB},function(a){v.j(a,"boolean",fi,"isUnconnectedLinkValid");this.XB=a});v.defineProperty(fi,{Kg:"temporaryLink"},function(){return this.NC},function(a){v.A(a,W,fi,"temporaryLink");this.NC=a});v.defineProperty(fi,{Ad:"temporaryFromNode"},function(){return this.LC},function(a){v.A(a,S,fi,"temporaryFromNode");this.LC=a}); +v.defineProperty(fi,{cn:"temporaryFromPort"},function(){return this.MC},function(a){v.A(a,G,fi,"temporaryFromPort");this.MC=a});v.defineProperty(fi,{Bd:"temporaryToNode"},function(){return this.OC},function(a){v.A(a,S,fi,"temporaryToNode");this.OC=a});v.defineProperty(fi,{dn:"temporaryToPort"},function(){return this.PC},function(a){v.A(a,G,fi,"temporaryToPort");this.PC=a});v.defineProperty(fi,{kc:"originalLink"},function(){return this.nC},function(a){null!==a&&v.A(a,W,fi,"originalLink");this.nC=a}); +v.defineProperty(fi,{Dg:"originalFromNode"},function(){return this.lC},function(a){null!==a&&v.A(a,S,fi,"originalFromNode");this.lC=a});v.defineProperty(fi,{Eg:"originalFromPort"},function(){return this.mC},function(a){null!==a&&v.A(a,G,fi,"originalFromPort");this.mC=a});v.defineProperty(fi,{Fg:"originalToNode"},function(){return this.qC},function(a){null!==a&&v.A(a,S,fi,"originalToNode");this.qC=a}); +v.defineProperty(fi,{Gg:"originalToPort"},function(){return this.rC},function(a){null!==a&&v.A(a,G,fi,"originalToPort");this.rC=a});v.defineProperty(fi,{zd:"isForwards"},function(){return this.TB},function(a){v.j(a,"boolean",fi,"isForwards");this.TB=a});v.u(fi,{vx:"validPortsCache"},function(){return this.UF});v.defineProperty(fi,{$f:"targetPort"},function(){return this.HC},function(a){null!==a&&v.A(a,G,fi,"targetPort");this.HC=a}); +fi.prototype.copyPortProperties=function(a,b,c,d,e){if(null!==a&&null!==b&&null!==c&&null!==d){d.za=b.U.size;e?(d.yb=b.yb,d.Gl=b.Gl):(d.xb=b.xb,d.nl=b.nl);c.ef=zb;var f=v.L();c.location=b.Xa(zb,f);v.v(f);d.angle=b.ol();null!==this.Zw&&this.Zw(a,b,c,d,e)}};fi.prototype.setNoTargetPortProperties=function(a,b,c){null!==b&&(b.za=qd,b.xb=qb,b.yb=qb);null!==a&&(a.location=this.g.O.ca);null!==this.Zw&&this.Zw(null,null,a,b,c)};fi.prototype.doMouseDown=function(){this.qa&&this.doMouseMove()}; +fi.prototype.doMouseMove=function(){if(this.qa){var a=this.g;if(null!==a){this.$f=this.findTargetPort(this.zd);if(null!==this.$f){var b=this.$f.Y;if(b instanceof S){this.zd?this.copyPortProperties(b,this.$f,this.Bd,this.dn,!0):this.copyPortProperties(b,this.$f,this.Ad,this.cn,!1);return}}this.zd?this.setNoTargetPortProperties(this.Bd,this.dn,!0):this.setNoTargetPortProperties(this.Ad,this.cn,!1);(a.oe||a.pe)&&Yh(a,a.O.jf)}}}; +fi.prototype.findValidLinkablePort=function(a,b){if(null===a)return null;var c=a.Y;if(!(c instanceof S))return null;for(;null!==a;){var d=b?a.fF:a.OD;if(!0===d&&(null!==a.Rd||a instanceof S)&&(b?this.isValidTo(c,a):this.isValidFrom(c,a)))return a;if(!1===d)break;a=a.R}return null}; +fi.prototype.findTargetPort=function(a){var b=this.g,c=b.O.ca,d=this.AE;0>=d&&(d=.1);for(var e=this,f=b.Km(c,d,function(b){return e.findValidLinkablePort(b,a)},null,!0),d=Infinity,b=null,f=f.i;f.next();){var h=f.value,k=h.Y;if(k instanceof S){var l=h.Xa(zb,v.L()),m=c.x-l.x,n=c.y-l.y;v.v(l);l=m*m+n*n;l<d&&(m=this.vx.ja(h),null!==m?m&&(b=h,d=l):a&&this.isValidLink(this.Dg,this.Eg,k,h)||!a&&this.isValidLink(k,h,this.Fg,this.Gg)?(this.vx.add(h,!0),b=h,d=l):this.vx.add(h,!1))}}return null!==b&&(c=b.Y, +c instanceof S&&(null===c.layer||c.layer.Ts))?b:null};fi.prototype.isValidFrom=function(a,b){if(null===a||null===b)return this.gp;if(this.g.Wa===this&&(null!==a.layer&&!a.layer.Ts||!0!==b.OD))return!1;var c=b.uz;if(Infinity>c){if(null!==this.kc&&a===this.Dg&&b===this.Eg)return!0;var d=b.Rd;null===d&&(d="");if(a.Bw(d).count>=c)return!1}return!0}; +fi.prototype.isValidTo=function(a,b){if(null===a||null===b)return this.gp;if(this.g.Wa===this&&(null!==a.layer&&!a.layer.Ts||!0!==b.fF))return!1;var c=b.LI;if(Infinity>c){if(null!==this.kc&&a===this.Fg&&b===this.Gg)return!0;var d=b.Rd;null===d&&(d="");if(a.wg(d).count>=c)return!1}return!0};fi.prototype.isInSameNode=function(a,b){if(null===a||null===b)return!1;if(a===b)return!0;var c=a.Y,d=b.Y;return null!==c&&c===d}; +fi.prototype.isLinked=function(a,b){if(null===a||null===b)return!1;var c=a.Y;if(!(c instanceof S))return!1;var d=a.Rd;null===d&&(d="");var e=b.Y;if(!(e instanceof S))return!1;var f=b.Rd;null===f&&(f="");for(e=e.wg(f);e.next();)if(f=e.value,f.T===c&&f.xg===d)return!0;return!1}; +fi.prototype.isValidLink=function(a,b,c,d){if(!this.isValidFrom(a,b)||!this.isValidTo(c,d)||!(null===b||null===d||(b.UG&&d.KI||!this.isInSameNode(b,d))&&(b.TG&&d.JI||!this.isLinked(b,d)))||null!==this.kc&&(null!==a&&this.isLabelDependentOnLink(a,this.kc)||null!==c&&this.isLabelDependentOnLink(c,this.kc))||null!==a&&null!==c&&(null===a.data&&null!==c.data||null!==a.data&&null===c.data)||!this.isValidCycle(a,c,this.kc))return!1;if(null!==a){var e=a.Qw;if(null!==e&&!e(a,b,c,d,this.kc))return!1}if(null!== +c&&(e=c.Qw,null!==e&&!e(a,b,c,d,this.kc)))return!1;e=this.Qw;return null!==e?e(a,b,c,d,this.kc):!0};fi.prototype.isLabelDependentOnLink=function(a,b){if(null===a)return!1;var c=a.fe;if(null===c)return!1;if(c===b)return!0;var d=new J(S);d.add(a);return gi(this,c,b,d)};function gi(a,b,c,d){if(b===c)return!0;var e=b.T;if(null!==e&&e.uf&&(d.add(e),gi(a,e.fe,c,d)))return!0;b=b.Z;return null!==b&&b.uf&&(d.add(b),gi(a,b.fe,c,d))?!0:!1} +fi.prototype.isValidCycle=function(a,b,c){void 0===c&&(c=null);if(null===a||null===b)return this.gp;var d=this.g.SI;if(d!==hi){if(d===ii){if(null!==c&&!c.Hc)return!0;for(d=b.te;d.next();){var e=d.value;if(e!==c&&e.Hc&&e.Z===b)return!1}return!ji(this,a,b,c,!0)}if(d===ki){if(null!==c&&!c.Hc)return!0;for(d=a.te;d.next();)if(e=d.value,e!==c&&e.Hc&&e.T===a)return!1;return!ji(this,a,b,c,!0)}if(d===li)return a===b?a=!0:(d=new J(S),d.add(b),a=mi(this,d,a,b,c)),!a;if(d===ni)return!ji(this,a,b,c,!1);if(d=== +xi)return a===b?a=!0:(d=new J(S),d.add(b),a=yi(this,d,a,b,c)),!a}return!0};function ji(a,b,c,d,e){if(b===c)return!0;if(null===b||null===c)return!1;for(var f=b.te;f.next();){var h=f.value;if(h!==d&&(!e||h.Hc)&&h.Z===b&&(h=h.T,h!==b&&ji(a,h,c,d,e)))return!0}return!1}function mi(a,b,c,d,e){if(c===d)return!0;if(null===c||null===d||b.contains(c))return!1;b.add(c);for(var f=c.te;f.next();){var h=f.value;if(h!==e&&h.Z===c&&(h=h.T,h!==c&&mi(a,b,h,d,e)))return!0}return!1} +function yi(a,b,c,d,e){if(c===d)return!0;if(null===c||null===d||b.contains(c))return!1;b.add(c);for(var f=c.te;f.next();){var h=f.value;if(h!==e){var k=h.T,h=h.Z,k=k===c?h:k;if(k!==c&&yi(a,b,k,d,e))return!0}}return!1}v.defineProperty(fi,{Qw:"linkValidation"},function(){return this.Nk},function(a){null!==a&&v.j(a,"function",fi,"linkValidation");this.Nk=a});v.defineProperty(fi,{Zw:"portTargeted"},function(){return this.vC},function(a){null!==a&&v.j(a,"function",fi,"portTargeted");this.vC=a}); +function zi(){0<arguments.length&&v.cd(zi);fi.call(this);this.name="Linking";this.SA={};this.RA=null;this.aa=Ai;this.EC=null}v.Ja(zi,fi);v.ea("LinkingTool",zi);var Ai;zi.Either=Ai=v.p(zi,"Either",0);var Bi;zi.ForwardsOnly=Bi=v.p(zi,"ForwardsOnly",0);var Ci;zi.BackwardsOnly=Ci=v.p(zi,"BackwardsOnly",0);v.defineProperty(zi,{gG:"archetypeLinkData"},function(){return this.SA},function(a){null!==a&&v.A(a,Object,zi,"archetypeLinkData");a instanceof G&&v.A(a,W,zi,"archetypeLinkData");this.SA=a}); +v.defineProperty(zi,{iD:"archetypeLabelNodeData"},function(){return this.RA},function(a){null!==a&&v.A(a,Object,zi,"archetypeLabelNodeData");a instanceof G&&v.A(a,S,zi,"archetypeLabelNodeData");this.RA=a});v.defineProperty(zi,{direction:"direction"},function(){return this.aa},function(a){v.pb(a,zi,zi,"direction");this.aa=a});v.defineProperty(zi,{cF:"startObject"},function(){return this.EC},function(a){null!==a&&v.A(a,G,zi,"startObject");this.EC=a}); +zi.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.g;if(null===a||a.ab||a.vf||!a.Ts)return!1;var b=a.ba;return(b instanceof Q||b instanceof Qf)&&a.O.left&&(a.Wa===this||this.isBeyondDragSize())?null!==this.findLinkablePort():!1}; +zi.prototype.findLinkablePort=function(){var a=this.g;if(null===a)return null;var b=this.cF;null===b&&(b=a.re(a.yc.ca,null,null));if(null===b||!(b.Y instanceof S))return null;a=this.direction;if(a===Ai||a===Bi){var c=this.findValidLinkablePort(b,!1);if(null!==c)return this.zd=!0,c}if(a===Ai||a===Ci)if(c=this.findValidLinkablePort(b,!0),null!==c)return this.zd=!1,c;return null}; +zi.prototype.doActivate=function(){var a=this.g;if(null!==a){var b=this.findLinkablePort();null!==b&&(this.Qb(this.name),a.Oe=!0,a.$b="pointer",this.zd?(null===this.Bd||this.Bd.location.G()||(this.Bd.location=a.O.ca),this.Eg=b,b=this.Eg.Y,b instanceof S&&(this.Dg=b),this.copyPortProperties(this.Dg,this.Eg,this.Ad,this.cn,!1)):(null===this.Ad||this.Ad.location.G()||(this.Ad.location=a.O.ca),this.Gg=b,b=this.Gg.Y,b instanceof S&&(this.Fg=b),this.copyPortProperties(this.Fg,this.Gg,this.Bd,this.dn,!0)), +a.add(this.Ad),a.add(this.Bd),null!==this.Kg&&(null!==this.Ad&&(this.Kg.T=this.Ad),null!==this.Bd&&(this.Kg.Z=this.Bd),this.Kg.ic(),a.add(this.Kg)),this.qa=!0)}};zi.prototype.doDeactivate=function(){this.qa=!1;var a=this.g;null!==a&&(a.remove(this.Kg),a.remove(this.Ad),a.remove(this.Bd),a.Oe=!1,a.$b="",this.gk())};zi.prototype.doStop=function(){fi.prototype.doStop.call(this);this.cF=null}; +zi.prototype.doMouseUp=function(){if(this.qa){var a=this.g;if(null===a)return;var b=this.Bf=null,c=null,d=null,e=null,f=this.$f=this.findTargetPort(this.zd);if(null!==f){var h=f.Y;h instanceof S&&(this.zd?(null!==this.Dg&&(b=this.Dg,c=this.Eg),d=h,e=f):(b=h,c=f,null!==this.Fg&&(d=this.Fg,e=this.Gg)))}else this.zd?null!==this.Dg&&this.gp&&(b=this.Dg,c=this.Eg):null!==this.Fg&&this.gp&&(d=this.Fg,e=this.Gg);null!==b||null!==d?(h=this.insertLink(b,c,d,e),null!==h?(null===f&&(this.zd?h.Dn=a.O.ca.copy(): +h.zn=a.O.ca.copy()),a.of&&a.select(h),this.Bf=this.name,a.Ba("LinkDrawn",h)):(a.ba.oD(),this.doNoLink(b,c,d,e))):this.zd?this.doNoLink(this.Dg,this.Eg,null,null):this.doNoLink(null,null,this.Fg,this.Gg)}this.stopTool()}; +zi.prototype.insertLink=function(a,b,c,d){var e=this.g;if(null===e)return null;var f=e.ba;if(f instanceof Qf){var h=a;b=c;e.Pd||(h=c,b=a);if(null!==h&&null!==b)return f.qh(b.data,f.gb(h.data)),b.Vo()}else if(f instanceof Q)if(h="",null!==a&&(null===b&&(b=a),h=b.Rd,null===h&&(h="")),b="",null!==c&&(null===d&&(d=c),b=d.Rd,null===b&&(b="")),d=this.gG,d instanceof W){if(Xg(d),f=d.copy(),null!==f)return f.T=a,f.xg=h,f.Z=c,f.sh=b,e.add(f),a=this.iD,a instanceof S&&(Xg(a),a=a.copy(),null!==a&&(a.fe=f,e.add(a))), +f}else if(null!==d&&(d=f.rw(d),v.Ta(d)))return null!==a&&f.lx(d,f.gb(a.data)),f.mA(d,h),null!==c&&f.px(d,f.gb(c.data)),f.pA(d,b),f.Os(d),a=this.iD,null===a||a instanceof S||(a=f.copyNodeData(a),v.Ta(a)&&(f.Zk(a),a=f.gb(a),void 0!==a&&f.Yy(d,a))),f=e.Pf(d);return null};zi.prototype.doNoLink=function(){}; +function lh(){0<arguments.length&&v.cd(lh);fi.call(this);this.name="Relinking";var a=new Y;a.Ab="Diamond";a.za=sd;a.fill="lightblue";a.stroke="dodgerblue";a.cursor="pointer";a.ve=0;this.FB=a;a=new Y;a.Ab="Diamond";a.za=sd;a.fill="lightblue";a.stroke="dodgerblue";a.cursor="pointer";a.ve=-1;this.QC=a;this.Sb=null;this.oC=new A}v.Ja(lh,fi);v.ea("RelinkingTool",lh); +lh.prototype.updateAdornments=function(a){if(null!==a&&a instanceof W){var b="RelinkFrom",c=null;if(a.hb&&!this.g.ab){var d=a.Wt;null!==d&&a.canRelinkFrom()&&a.U.G()&&a.isVisible()&&d.U.G()&&d.Zi()&&(c=a.So(b),null===c&&(c=this.makeAdornment(d,!1),null!==c&&(c.fc=b),a.Yk(b,c)))}null===c&&a.bj(b);b="RelinkTo";c=null;a.hb&&!this.g.ab&&(d=a.Wt,null!==d&&a.canRelinkTo()&&a.U.G()&&a.isVisible()&&d.U.G()&&d.Zi()&&(c=a.So(b),null===c&&(c=this.makeAdornment(d,!0),null!==c&&(c.fc=b),a.Yk(b,c))));null===c&& +a.bj(b)}};lh.prototype.makeAdornment=function(a,b){var c=new Vg;c.type=Di;var d=b?this.II:this.SG;null!==d&&c.add(d.copy());c.Zb=a;return c};v.defineProperty(lh,{SG:"fromHandleArchetype"},function(){return this.FB},function(a){null!==a&&v.A(a,G,lh,"fromHandleArchetype");this.FB=a});v.defineProperty(lh,{II:"toHandleArchetype"},function(){return this.QC},function(a){null!==a&&v.A(a,G,lh,"toHandleArchetype");this.QC=a});v.u(lh,{handle:"handle"},function(){return this.Sb}); +lh.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.g;if(null===a||a.ab||a.vf||!a.ym)return!1;var b=a.ba;if(!(b instanceof Q||b instanceof Qf)||!a.O.left)return!1;b=this.findToolHandleAt(a.yc.ca,"RelinkFrom");null===b&&(b=this.findToolHandleAt(a.yc.ca,"RelinkTo"));return null!==b}; +lh.prototype.doActivate=function(){var a=this.g;if(null!==a){if(null===this.kc){var b=this.findToolHandleAt(a.yc.ca,"RelinkFrom");null===b&&(b=this.findToolHandleAt(a.yc.ca,"RelinkTo"));if(null===b)return;var c=b.Y;if(!(c instanceof Vg&&c.Mf instanceof W))return;this.Sb=b;this.zd=null===c||"RelinkTo"===c.fc;this.kc=c.Mf}this.Qb(this.name);a.Oe=!0;a.$b="pointer";this.Eg=this.kc.kd;this.Dg=this.kc.T;this.Gg=this.kc.Sd;this.Fg=this.kc.Z;this.oC.set(this.kc.U);null!==this.kc&&0<this.kc.oa&&(null===this.kc.T&& +(null!==this.cn&&(this.cn.za=pd),null!==this.Ad&&(this.Ad.location=this.kc.l(0))),null===this.kc.Z&&(null!==this.dn&&(this.dn.za=pd),null!==this.Bd&&(this.Bd.location=this.kc.l(this.kc.oa-1))));this.copyPortProperties(this.Dg,this.Eg,this.Ad,this.cn,!1);this.copyPortProperties(this.Fg,this.Gg,this.Bd,this.dn,!0);a.add(this.Ad);a.add(this.Bd);null!==this.Kg&&(null!==this.Ad&&(this.Kg.T=this.Ad),null!==this.Bd&&(this.Kg.Z=this.Bd),this.copyLinkProperties(this.kc,this.Kg),this.Kg.ic(),a.add(this.Kg)); +this.qa=!0}};lh.prototype.copyLinkProperties=function(a,b){if(null!==a&&null!==b){b.Qs=a.Qs;b.jz=a.jz;var c=a.Ke;if(c===Ei||c===Fi)c=Gi;b.Ke=c;b.tw=a.tw;b.ix=a.ix;b.Hp=a.Hp;b.xb=a.xb;b.nl=a.nl;b.lt=a.lt;b.mt=a.mt;b.yb=a.yb;b.Gl=a.Gl;b.eu=a.eu;b.fu=a.fu}};lh.prototype.doDeactivate=function(){this.qa=!1;var a=this.g;null!==a&&(a.remove(this.Kg),a.remove(this.Ad),a.remove(this.Bd),a.Oe=!1,a.$b="",this.gk())};lh.prototype.doStop=function(){fi.prototype.doStop.call(this);this.Sb=null}; +lh.prototype.doMouseUp=function(){if(this.qa){var a=this.g;if(null===a)return;this.Bf=null;var b=this.Dg,c=this.Eg,d=this.Fg,e=this.Gg,f=this.kc;this.$f=this.findTargetPort(this.zd);if(null!==this.$f){var h=this.$f.Y;h instanceof S&&(this.zd?(d=h,e=this.$f):(b=h,c=this.$f))}else this.gp?this.zd?e=d=null:c=b=null:f=null;null!==f?(this.reconnectLink(f,this.zd?d:b,this.zd?e:c,this.zd),null===this.$f&&(this.zd?f.Dn=a.O.ca.copy():f.zn=a.O.ca.copy(),f.ic()),a.of&&(f.hb=!0),this.Bf=this.name,a.Ba("LinkRelinked", +f,this.zd?this.Gg:this.Eg)):this.doNoRelink(this.kc,this.zd);Hi(this.kc,this.oC)}this.stopTool()};lh.prototype.reconnectLink=function(a,b,c,d){if(null===this.g)return!1;c=null!==c&&null!==c.Rd?c.Rd:"";d?(a.Z=b,a.sh=c):(a.T=b,a.xg=c);return!0};lh.prototype.doNoRelink=function(){};function ai(a,b,c,d,e){null!==b?(a.copyPortProperties(b,c,a.Ad,a.cn,!1),a.g.add(a.Ad)):a.g.remove(a.Ad);null!==d?(a.copyPortProperties(d,e,a.Bd,a.dn,!0),a.g.add(a.Bd)):a.g.remove(a.Bd)} +function Ii(){0<arguments.length&&v.cd(Ii);Xf.call(this);this.name="LinkReshaping";var a=new Y;a.Ab="Rectangle";a.za=rd;a.fill="lightblue";a.stroke="dodgerblue";this.Bk=a;a=new Y;a.Ab="Diamond";a.za=rd;a.fill="lightblue";a.stroke="dodgerblue";this.cC=a;this.wC=3;this.Ix=this.Sb=null;this.pC=new z;this.Av=null}v.Ja(Ii,Xf);v.ea("LinkReshapingTool",Ii);var Ji;Ii.None=Ji=v.p(Ii,"None",0);var Ki;Ii.Horizontal=Ki=v.p(Ii,"Horizontal",1);var Li;Ii.Vertical=Li=v.p(Ii,"Vertical",2);var Mi; +Ii.All=Mi=v.p(Ii,"All",3);Ii.prototype.getReshapingBehavior=Ii.prototype.SD=function(a){return a&&a.xC?a.xC:Ji};Ii.prototype.setReshapingBehavior=Ii.prototype.Zt=function(a,b){v.A(a,G,Ii,"setReshapingBehavior:obj");v.pb(b,Ii,Ii,"setReshapingBehavior:behavior");a.xC=b}; +Ii.prototype.updateAdornments=function(a){if(null!==a&&a instanceof W){if(a.hb&&!this.g.ab){var b=a.path;if(null!==b&&a.canReshape()&&a.U.G()&&a.isVisible()&&b.U.G()&&b.Zi()){var c=a.So(this.name);if(null===c||c.JF!==a.oa||c.WF!==a.Rt)c=this.makeAdornment(b),null!==c&&(c.JF=a.oa,c.WF=a.Rt,a.Yk(this.name,c));if(null!==c){c.location=a.position;return}}}a.bj(this.name)}}; +Ii.prototype.makeAdornment=function(a){var b=a.Y,c=b.oa,d=b.jc,e=null;if(null!==b.points&&1<c){e=new Vg;e.type=Di;var c=b.it,f=b.Ow,h=d?1:0;if(b.Rt&&b.Ke!==Ni)for(var k=c+h;k<f-h;k++){var l=this.makeResegmentHandle(a,k);null!==l&&(l.ve=k,l.jA=.5,l.uz=999,e.add(l))}for(k=c+1;k<f;k++)if(l=this.makeHandle(a,k),null!==l){l.ve=k;if(k!==c)if(k===c+1&&d){var h=b.l(c),m=b.l(c+1);K(h.x,m.x)&&K(h.y,m.y)&&(m=b.l(c-1));K(h.x,m.x)?(this.Zt(l,Li),l.cursor="n-resize"):K(h.y,m.y)&&(this.Zt(l,Ki),l.cursor="w-resize")}else k=== +f-1&&d?(h=b.l(f-1),m=b.l(f),K(h.x,m.x)&&K(h.y,m.y)&&(h=b.l(f+1)),K(h.x,m.x)?(this.Zt(l,Li),l.cursor="n-resize"):K(h.y,m.y)&&(this.Zt(l,Ki),l.cursor="w-resize")):k!==f&&(this.Zt(l,Mi),l.cursor="move");e.add(l)}e.fc=this.name;e.Zb=a}return e};Ii.prototype.makeHandle=function(){var a=this.nt;return null===a?null:a.copy()};v.defineProperty(Ii,{nt:"handleArchetype"},function(){return this.Bk},function(a){null!==a&&v.A(a,G,Ii,"handleArchetype");this.Bk=a}); +Ii.prototype.makeResegmentHandle=function(){var a=this.PH;return null===a?null:a.copy()};v.defineProperty(Ii,{PH:"midHandleArchetype"},function(){return this.cC},function(a){null!==a&&v.A(a,G,Ii,"midHandleArchetype");this.cC=a});v.u(Ii,{handle:"handle"},function(){return this.Sb});v.u(Ii,{Rs:"adornedLink"},function(){return this.Ix});Ii.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.g;return null!==a&&!a.ab&&a.iw&&a.O.left?null!==this.findToolHandleAt(a.yc.ca,this.name):!1}; +Ii.prototype.doActivate=function(){var a=this.g;if(null!==a&&(this.Sb=this.findToolHandleAt(a.yc.ca,this.name),null!==this.Sb)){var b=this.Sb.Y.Mf;if(b instanceof W){this.Ix=b;a.Oe=!0;this.Qb(this.name);if(b.Rt&&999===this.Sb.uz){var c=b.points.copy(),d=this.Sb.Xa(zb);c.yd(this.Sb.ve+1,d);b.jc&&c.yd(this.Sb.ve+1,d);b.points=c;b.Nd();this.Sb=this.findToolHandleAt(a.yc.ca,this.name);if(null===this.Sb){this.doDeactivate();return}}this.pC=b.l(this.Sb.ve);this.Av=b.points.copy();this.qa=!0}}}; +Ii.prototype.doDeactivate=function(){this.gk();this.Ix=this.Sb=null;var a=this.g;null!==a&&(a.Oe=!1);this.qa=!1};Ii.prototype.doCancel=function(){var a=this.Rs;null!==a&&(a.points=this.Av);this.stopTool()};Ii.prototype.doMouseMove=function(){var a=this.g;this.qa&&null!==a&&(a=this.computeReshape(a.O.ca),this.reshape(a))}; +Ii.prototype.doMouseUp=function(){var a=this.g;if(this.qa&&null!==a){var b=this.computeReshape(a.O.ca);this.reshape(b);b=this.Rs;if(null!==b&&b.Rt){var c=this.handle.ve,d=b.l(c-1),e=b.l(c),f=b.l(c+1);if(b.jc){if(c>b.it+1&&c<b.Ow-1){var h=b.l(c-2);if(Math.abs(d.x-e.x)<this.oh&&Math.abs(d.y-e.y)<this.oh&&(Oi(this,h,d,e,f,!0)||Oi(this,h,d,e,f,!1))){var k=b.points.copy();Oi(this,h,d,e,f,!0)?(k.Ig(c-2,new z(h.x,(f.y+h.y)/2)),k.Ig(c+1,new z(f.x,(f.y+h.y)/2))):(k.Ig(c-2,new z((f.x+h.x)/2,h.y)),k.Ig(c+1, +new z((f.x+h.x)/2,f.y)));k.Vc(c);k.Vc(c-1);b.points=k;b.Nd()}else h=b.l(c+2),Math.abs(e.x-f.x)<this.oh&&Math.abs(e.y-f.y)<this.oh&&(Oi(this,d,e,f,h,!0)||Oi(this,d,e,f,h,!1))&&(k=b.points.copy(),Oi(this,d,e,f,h,!0)?(k.Ig(c-1,new z(d.x,(d.y+h.y)/2)),k.Ig(c+2,new z(h.x,(d.y+h.y)/2))):(k.Ig(c-1,new z((d.x+h.x)/2,d.y)),k.Ig(c+2,new z((d.x+h.x)/2,h.y))),k.Vc(c+1),k.Vc(c),b.points=k,b.Nd())}}else h=v.L(),Oa(d.x,d.y,f.x,f.y,e.x,e.y,h)&&h.rf(e)<this.oh*this.oh&&(k=b.points.copy(),k.Vc(c),b.points=k,b.Nd()), +v.v(h)}a.qc();this.Bf=this.name;a.Ba("LinkReshaped",this.Rs,this.Av)}this.stopTool()};function Oi(a,b,c,d,e,f){return f?Math.abs(b.y-c.y)<a.oh&&Math.abs(c.y-d.y)<a.oh&&Math.abs(d.y-e.y)<a.oh:Math.abs(b.x-c.x)<a.oh&&Math.abs(c.x-d.x)<a.oh&&Math.abs(d.x-e.x)<a.oh}v.defineProperty(Ii,{oh:"resegmentingDistance"},function(){return this.wC},function(a){v.j(a,"number",Ii,"resegmentingDistance");this.wC=a}); +Ii.prototype.reshape=function(a){var b=this.Rs;b.Cl();var c=this.handle.ve,d=this.SD(this.handle);if(b.jc)if(c===b.it+1)c=b.it+1,d===Li?(b.V(c,b.l(c-1).x,a.y),b.V(c+1,b.l(c+2).x,a.y)):d===Ki&&(b.V(c,a.x,b.l(c-1).y),b.V(c+1,a.x,b.l(c+2).y));else if(c===b.Ow-1)c=b.Ow-1,d===Li?(b.V(c-1,b.l(c-2).x,a.y),b.V(c,b.l(c+1).x,a.y)):d===Ki&&(b.V(c-1,a.x,b.l(c-2).y),b.V(c,a.x,b.l(c+1).y));else{var d=c,e=b.l(d),f=b.l(d-1),h=b.l(d+1);K(f.x,e.x)&&K(e.y,h.y)?(K(f.x,b.l(d-2).x)&&!K(f.y,b.l(d-2).y)?(b.w(d,a.x,f.y), +c++,d++):b.V(d-1,a.x,f.y),K(h.y,b.l(d+2).y)&&!K(h.x,b.l(d+2).x)?b.w(d+1,h.x,a.y):b.V(d+1,h.x,a.y)):K(f.y,e.y)&&K(e.x,h.x)?(K(f.y,b.l(d-2).y)&&!K(f.x,b.l(d-2).x)?(b.w(d,f.x,a.y),c++,d++):b.V(d-1,f.x,a.y),K(h.x,b.l(d+2).x)&&!K(h.y,b.l(d+2).y)?b.w(d+1,a.x,h.y):b.V(d+1,a.x,h.y)):K(f.x,e.x)&&K(e.x,h.x)?(K(f.x,b.l(d-2).x)&&!K(f.y,b.l(d-2).y)?(b.w(d,a.x,f.y),c++,d++):b.V(d-1,a.x,f.y),K(h.x,b.l(d+2).x)&&!K(h.y,b.l(d+2).y)?b.w(d+1,a.x,h.y):b.V(d+1,a.x,h.y)):K(f.y,e.y)&&K(e.y,h.y)&&(K(f.y,b.l(d-2).y)&&!K(f.x, +b.l(d-2).x)?(b.w(d,f.x,a.y),c++,d++):b.V(d-1,f.x,a.y),K(h.y,b.l(d+2).y)&&!K(h.x,b.l(d+2).x)?b.w(d+1,h.x,a.y):b.V(d+1,h.x,a.y));b.V(c,a.x,a.y)}else b.V(c,a.x,a.y),1===c&&b.computeSpot(!0).se()&&(e=b.T,f=b.kd,null===e||e.isVisible()||(e=e.findVisibleNode(),e!==b.T&&(f=e.ll(""))),d=f.Xa(zb,v.L()),e=b.getLinkPointFromPoint(e,f,d,a,!0,v.L()),b.V(0,e.x,e.y),v.v(d),v.v(e)),c===b.oa-2&&b.computeSpot(!1).se()&&(c=b.Z,e=b.Sd,null===c||c.isVisible()||(c=c.findVisibleNode(),c!==b.Z&&(e=c.ll(""))),d=e.Xa(zb,v.L()), +e=b.getLinkPointFromPoint(c,e,d,a,!1,v.L()),b.V(b.oa-1,e.x,e.y),v.v(d),v.v(e));b.Pi()};Ii.prototype.computeReshape=function(a){var b=this.Rs,c=this.handle.ve;switch(this.SD(this.handle)){case Mi:return a;case Li:return b=b.l(c),new z(b.x,a.y);case Ki:return b=b.l(c),new z(a.x,b.y);default:case Ji:return b.l(c)}};v.u(Ii,{sK:"originalPoint"},function(){return this.pC});v.u(Ii,{tK:"originalPoints"},function(){return this.Av}); +function Pi(){0<arguments.length&&v.cd(Pi);Xf.call(this);this.name="Resizing";this.Dj=(new ia(1,1)).freeze();this.Bj=(new ia(9999,9999)).freeze();this.jj=(new ia(NaN,NaN)).freeze();this.Qq=!1;this.Db=null;var a=new Y;a.Uj=zb;a.Ab="Rectangle";a.za=rd;a.fill="lightblue";a.stroke="dodgerblue";a.lb=1;a.cursor="pointer";this.Bk=a;this.Sb=null;this.zv=new ia;this.Fy=new z;this.hy=new ia(0,0);this.gy=new ia(Infinity,Infinity);this.ey=new ia(1,1);this.iC=!0}v.Ja(Pi,Xf);v.ea("ResizingTool",Pi); +Pi.prototype.updateAdornments=function(a){if(!(null===a||a instanceof W)){if(a.hb&&!this.g.ab){var b=a.LE;if(null!==b&&a.canResize()&&a.U.G()&&a.isVisible()&&b.U.G()&&b.Zi()){var c=a.So(this.name);if(null===c||c.Zb!==b)c=this.makeAdornment(b);if(null!==c){var d=b.ol();c.angle=d;var e=b.Xa(c.ef,v.L()),f=b.Ti();c.location=e;v.v(e);e=c.placeholder;if(null!==e){var b=b.Ha,h=v.Fl();h.m(b.width*f,b.height*f);e.za=h;v.$j(h)}Qi(this,c,d);a.Yk(this.name,c);return}}}a.bj(this.name)}}; +Pi.prototype.makeAdornment=function(a){var b=null,b=a.Y.KE;if(null===b){b=new Vg;b.type=Ri;b.ef=zb;var c=new Si;c.Rf=!0;b.add(c);b.add(this.makeHandle(a,rb));b.add(this.makeHandle(a,tb));b.add(this.makeHandle(a,Eb));b.add(this.makeHandle(a,Cb));b.add(this.makeHandle(a,sc));b.add(this.makeHandle(a,uc));b.add(this.makeHandle(a,vc));b.add(this.makeHandle(a,tc))}else if(Xg(b),b=b.copy(),null===b)return null;b.fc=this.name;b.Zb=a;return b}; +Pi.prototype.makeHandle=function(a,b){var c=this.nt;if(null===c)return null;c=c.copy();c.alignment=b;return c}; +function Qi(a,b,c){if(null!==b)if(!b.alignment.Uc()&&""!==b.cursor)a:{a=b.alignment;a.se()&&(a=zb);if(0>=a.x)c=0>=a.y?c+225:1<=a.y?c+135:c+180;else if(1<=a.x)0>=a.y?c+=315:1<=a.y&&(c+=45);else if(0>=a.y)c+=270;else if(1<=a.y)c+=90;else break a;0>c?c+=360:360<=c&&(c-=360);b.cursor=22.5>c?"e-resize":67.5>c?"se-resize":112.5>c?"s-resize":157.5>c?"sw-resize":202.5>c?"w-resize":247.5>c?"nw-resize":292.5>c?"n-resize":337.5>c?"ne-resize":"e-resize"}else if(b instanceof D)for(b=b.elements;b.next();)Qi(a, +b.value,c)}v.defineProperty(Pi,{nt:"handleArchetype"},function(){return this.Bk},function(a){null!==a&&v.A(a,G,Pi,"handleArchetype");this.Bk=a});v.u(Pi,{handle:"handle"},function(){return this.Sb});v.defineProperty(Pi,{Zb:"adornedObject"},function(){return this.Db},function(a){null!==a&&v.A(a,G,Pi,"adornedObject");this.Db=a});Pi.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.g;return null!==a&&!a.ab&&a.Us&&a.O.left?null!==this.findToolHandleAt(a.yc.ca,this.name)?!0:!1:!1}; +Pi.prototype.doActivate=function(){var a=this.g;null!==a&&(this.Sb=this.findToolHandleAt(a.yc.ca,this.name),null!==this.Sb&&(this.Db=this.Sb.Y.Zb,this.Fy.set(this.Db.Y.location),this.zv.set(this.Db.za),this.ey=this.computeCellSize(),this.hy=this.computeMinSize(),this.gy=this.computeMaxSize(),a.Oe=!0,this.iC=a.Na.isEnabled,a.Na.isEnabled=!1,this.Qb(this.name),this.qa=!0))};Pi.prototype.doDeactivate=function(){var a=this.g;null!==a&&(this.gk(),this.Db=this.Sb=null,this.qa=a.Oe=!1,a.Na.isEnabled=this.iC)}; +Pi.prototype.doCancel=function(){this.Db.za=this.zv;this.Db.Y.location=this.Fy;this.stopTool()};Pi.prototype.doMouseMove=function(){var a=this.g;if(this.qa&&null!==a){var b=this.hy,c=this.gy,d=this.ey,e=this.Db.QD(a.O.ca,v.L()),f=Ti;this.Db instanceof Y&&(f=Ui(this.Db));b=this.computeResize(e,this.Sb.alignment,b,c,d,!(f===Vi||f===Wi||a.O.shift));this.resize(b);a.Uf();v.v(e)}}; +Pi.prototype.doMouseUp=function(){var a=this.g;if(this.qa&&null!==a){var b=this.hy,c=this.gy,d=this.ey,e=this.Db.QD(a.O.ca,v.L()),f=Ti;this.Db instanceof Y&&(f=Ui(this.Db));b=this.computeResize(e,this.Sb.alignment,b,c,d,!(f===Vi||f===Wi||a.O.shift));this.resize(b);v.v(e);a.qc();this.Bf=this.name;a.Ba("PartResized",this.Db,this.zv)}this.stopTool()}; +Pi.prototype.resize=function(a){if(null!==this.g){var b=this.Zb,c=b.Y,d=b.ol(),e=b.Ti(),f=Math.PI*d/180,h=Math.cos(f),f=Math.sin(f),k=0<d&&180>d?1:0,l=90<d&&270>d?1:0,d=180<d&&360>d?1:0,m=b.Ha.width,n=b.Ha.height;b.za=a.size;var p=c.position.copy();c.sf();m=b.Ha.width-m;n=b.Ha.height-n;if(0!==m||0!==n)0!==m&&(p.x+=e*((a.x+m*l)*h-(a.y+n*k)*f)),0!==n&&(p.y+=e*((a.x+m*d)*f+(a.y+n*l)*h)),c.move(p),c instanceof S&&c.cf()}}; +Pi.prototype.computeResize=function(a,b,c,d,e,f){b.se()&&(b=zb);var h=this.Zb.Ha,k=h.x,l=h.y,m=h.x+h.width,n=h.y+h.height,p=1;if(!f){var p=h.width,q=h.height;0>=p&&(p=1);0>=q&&(q=1);p=q/p}q=v.L();Pa(a.x,a.y,k,l,e.width,e.height,q);a=h.copy();0>=b.x?0>=b.y?(a.x=Math.max(q.x,m-d.width),a.x=Math.min(a.x,m-c.width),a.width=Math.max(m-a.x,c.width),a.y=Math.max(q.y,n-d.height),a.y=Math.min(a.y,n-c.height),a.height=Math.max(n-a.y,c.height),f||(b=a.height/a.width,p<b?(a.height=p*a.width,a.y=n-a.height):(a.width= +a.height/p,a.x=m-a.width))):1<=b.y?(a.x=Math.max(q.x,m-d.width),a.x=Math.min(a.x,m-c.width),a.width=Math.max(m-a.x,c.width),a.height=Math.max(Math.min(q.y-l,d.height),c.height),f||(b=a.height/a.width,p<b?a.height=p*a.width:(a.width=a.height/p,a.x=m-a.width))):(a.x=Math.max(q.x,m-d.width),a.x=Math.min(a.x,m-c.width),a.width=m-a.x,f||(a.height=p*a.width,a.y=l+.5*(n-l-a.height))):1<=b.x?0>=b.y?(a.width=Math.max(Math.min(q.x-k,d.width),c.width),a.y=Math.max(q.y,n-d.height),a.y=Math.min(a.y,n-c.height), +a.height=Math.max(n-a.y,c.height),f||(b=a.height/a.width,p<b?(a.height=p*a.width,a.y=n-a.height):a.width=a.height/p)):1<=b.y?(a.width=Math.max(Math.min(q.x-k,d.width),c.width),a.height=Math.max(Math.min(q.y-l,d.height),c.height),f||(b=a.height/a.width,p<b?a.height=p*a.width:a.width=a.height/p)):(a.width=Math.max(Math.min(q.x-k,d.width),c.width),f||(a.height=p*a.width,a.y=l+.5*(n-l-a.height))):0>=b.y?(a.y=Math.max(q.y,n-d.height),a.y=Math.min(a.y,n-c.height),a.height=n-a.y,f||(a.width=a.height/p,a.x= +k+.5*(m-k-a.width))):1<=b.y&&(a.height=Math.max(Math.min(q.y-l,d.height),c.height),f||(a.width=a.height/p,a.x=k+.5*(m-k-a.width)));v.v(q);return a};Pi.prototype.computeMinSize=function(){var a=this.Zb.kh.copy(),b=this.kh;!isNaN(b.width)&&b.width>a.width&&(a.width=b.width);!isNaN(b.height)&&b.height>a.height&&(a.height=b.height);return a}; +Pi.prototype.computeMaxSize=function(){var a=this.Zb.xf.copy(),b=this.xf;!isNaN(b.width)&&b.width<a.width&&(a.width=b.width);!isNaN(b.height)&&b.height<a.height&&(a.height=b.height);return a}; +Pi.prototype.computeCellSize=function(){var a=new ia(NaN,NaN),b=this.Zb.Y;if(null!==b){var c=b.kI;!isNaN(c.width)&&0<c.width&&(a.width=c.width);!isNaN(c.height)&&0<c.height&&(a.height=c.height)}c=this.Ko;isNaN(a.width)&&!isNaN(c.width)&&0<c.width&&(a.width=c.width);isNaN(a.height)&&!isNaN(c.height)&&0<c.height&&(a.height=c.height);b=this.g;(isNaN(a.width)||isNaN(a.height))&&b&&(c=b.Za.$d,null!==c&&c.Jw&&(c=c.UD,isNaN(a.width)&&!isNaN(c.width)&&0<c.width&&(a.width=c.width),isNaN(a.height)&&!isNaN(c.height)&& +0<c.height&&(a.height=c.height)),b=b.$o,null!==b&&b.visible&&this.Jw&&(c=b.Fw,isNaN(a.width)&&!isNaN(c.width)&&0<c.width&&(a.width=c.width),isNaN(a.height)&&!isNaN(c.height)&&0<c.height&&(a.height=c.height)));if(isNaN(a.width)||0===a.width||Infinity===a.width)a.width=1;if(isNaN(a.height)||0===a.height||Infinity===a.height)a.height=1;return a}; +v.defineProperty(Pi,{kh:"minSize"},function(){return this.Dj},function(a){v.A(a,ia,Pi,"minSize");if(!this.Dj.K(a)){var b=a.width;isNaN(b)&&(b=0);a=a.height;isNaN(a)&&(a=0);this.Dj.m(b,a)}});v.defineProperty(Pi,{xf:"maxSize"},function(){return this.Bj},function(a){v.A(a,ia,Pi,"maxSize");if(!this.Bj.K(a)){var b=a.width;isNaN(b)&&(b=Infinity);a=a.height;isNaN(a)&&(a=Infinity);this.Bj.m(b,a)}}); +v.defineProperty(Pi,{Ko:"cellSize"},function(){return this.jj},function(a){v.A(a,ia,Pi,"cellSize");this.jj.K(a)||this.jj.assign(a)});v.defineProperty(Pi,{Jw:"isGridSnapEnabled"},function(){return this.Qq},function(a){v.j(a,"boolean",Pi,"isGridSnapEnabled");this.Qq=a});v.u(Pi,{qK:"originalDesiredSize"},function(){return this.zv});v.u(Pi,{rK:"originalLocation"},function(){return this.Fy}); +function Xi(){0<arguments.length&&v.cd(Xi);Xf.call(this);this.name="Rotating";this.CC=45;this.BC=2;this.Db=null;var a=new Y;a.Ab="Ellipse";a.za=sd;a.fill="lightblue";a.stroke="dodgerblue";a.lb=1;a.cursor="pointer";this.Bk=a;this.Sb=null;this.yv=0;this.yC=new z}v.Ja(Xi,Xf);v.ea("RotatingTool",Xi); +Xi.prototype.updateAdornments=function(a){if(!(null===a||a instanceof W)){if(a.hb&&!this.g.ab){var b=a.OE;if(null!==b&&a.canRotate()&&a.U.G()&&a.isVisible()&&b.U.G()&&b.Zi()){var c=a.So(this.name);if(null===c||c.Zb!==b)c=this.makeAdornment(b);if(null!==c){c.angle=b.ol();var d=null,e=null;b===a||b===a.bc?(d=a.bc,e=a.ef):(d=b,e=zb);for(var f=d.Ha,e=v.Mb(f.width*e.x+e.offsetX,f.height*e.y+e.offsetY);null!==d&&d!==b;)d.transform.ub(e),d=d.R;var d=e.y,f=Math.max(e.x-b.Ha.width,0),h=v.L();c.location=b.Xa(new L(1, +0,50+f,d),h);v.v(h);v.v(e);a.Yk(this.name,c);return}}}a.bj(this.name)}};Xi.prototype.makeAdornment=function(a){var b=null,b=a.Y.nI;if(null===b){b=new Vg;b.type=Yi;b.ef=zb;var c=this.nt;null!==c&&b.add(c.copy())}else if(Xg(b),b=b.copy(),null===b)return null;b.fc=this.name;b.Zb=a;return b};v.defineProperty(Xi,{nt:"handleArchetype"},function(){return this.Bk},function(a){null!==a&&v.A(a,G,Xi,"handleArchetype");this.Bk=a});v.u(Xi,{handle:"handle"},function(){return this.Sb}); +v.defineProperty(Xi,{Zb:"adornedObject"},function(){return this.Db},function(a){null!==a&&v.A(a,G,Xi,"adornedObject");this.Db=a});Xi.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.g;return null!==a&&!a.ab&&a.jw&&a.O.left?null!==this.findToolHandleAt(a.yc.ca,this.name)?!0:!1:!1}; +Xi.prototype.doActivate=function(){var a=this.g;if(null!==a&&(this.Sb=this.findToolHandleAt(a.yc.ca,this.name),null!==this.Sb)){this.Db=this.Sb.Y.Zb;var b=this.Db.Y,c=b.bc;this.yC=this.Db===b||this.Db===c?c.Xa(b.ef):this.Db.Xa(zb);this.yv=this.Db.angle;a.Oe=!0;a.mz=!0;this.Qb(this.name);this.qa=!0}};Xi.prototype.doDeactivate=function(){var a=this.g;null!==a&&(this.gk(),this.Db=this.Sb=null,this.qa=a.Oe=!1)};Xi.prototype.doCancel=function(){var a=this.g;null!==a&&(a.mz=!1);this.rotate(this.yv);this.stopTool()}; +Xi.prototype.doMouseMove=function(){var a=this.g;this.qa&&null!==a&&(a=this.computeRotate(a.O.ca),this.rotate(a))};Xi.prototype.doMouseUp=function(){var a=this.g;if(this.qa&&null!==a){a.mz=!1;var b=this.computeRotate(a.O.ca);this.rotate(b);a.qc();this.Bf=this.name;a.Ba("PartRotated",this.Db,this.yv)}this.stopTool()};Xi.prototype.rotate=function(a){null!==this.Db&&(this.Db.angle=a)}; +Xi.prototype.computeRotate=function(a){a=this.yC.xc(a);var b=this.Db.R;null!==b&&(a-=b.ol(),360<=a?a-=360:0>a&&(a+=360));var b=Math.min(Math.abs(this.BI),180),c=Math.min(Math.abs(this.AI),b/2);!this.g.O.shift&&0<b&&0<c&&(a%b<c?a=Math.floor(a/b)*b:a%b>b-c&&(a=(Math.floor(a/b)+1)*b));360<=a?a-=360:0>a&&(a+=360);return a};v.defineProperty(Xi,{BI:"snapAngleMultiple"},function(){return this.CC},function(a){v.j(a,"number",Xi,"snapAngleMultiple");this.CC=a}); +v.defineProperty(Xi,{AI:"snapAngleEpsilon"},function(){return this.BC},function(a){v.j(a,"number",Xi,"snapAngleEpsilon");this.BC=a});v.u(Xi,{pK:"originalAngle"},function(){return this.yv});function Zi(){0<arguments.length&&v.cd(Zi);Xf.call(this);this.name="ClickSelecting"}v.Ja(Zi,Xf);v.ea("ClickSelectingTool",Zi);Zi.prototype.canStart=function(){return!this.isEnabled||null===this.g||this.isBeyondDragSize()?!1:!0}; +Zi.prototype.doMouseUp=function(){this.qa&&(this.standardMouseSelect(),!this.standardMouseClick()&&this.g.O.Xi&&this.g.Za.doToolTip());this.stopTool()};function $i(){0<arguments.length&&v.cd($i);Xf.call(this);this.name="Action";this.jn=null}v.Ja($i,Xf);v.ea("ActionTool",$i); +$i.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.g;if(null===a)return!1;var b=a.O,c=a.re(b.ca,function(a){for(;null!==a.R&&!a.Gw;)a=a.R;return a});if(null!==c){if(!c.Gw)return!1;this.jn=c;a.wn=a.re(b.ca,null,null);return!0}return!1};$i.prototype.doMouseDown=function(){if(this.qa){var a=this.g.O,b=this.jn;null!==b&&(a.ye=b,null!==b.aD&&b.aD(a,b))}else this.canStart()&&this.doActivate()}; +$i.prototype.doMouseMove=function(){if(this.qa){var a=this.g.O,b=this.jn;null!==b&&(a.ye=b,null!==b.bD&&b.bD(a,b))}};$i.prototype.doMouseUp=function(){if(this.qa){var a=this.g,b=a.O,c=this.jn;if(null===c)return;b.ye=c;null!==c.cD&&c.cD(b,c);this.isBeyondDragSize()||eh(c,b,a)}this.stopTool()};$i.prototype.doCancel=function(){var a=this.g;if(null!==a){var a=a.O,b=this.jn;if(null===b)return;a.ye=b;null!==b.$C&&b.$C(a,b)}this.stopTool()};$i.prototype.doStop=function(){this.jn=null}; +function aj(){0<arguments.length&&v.cd(aj);Xf.call(this);this.name="ClickCreating";this.Ll=null;this.RB=!0;this.EB=new z(0,0)}v.Ja(aj,Xf);v.ea("ClickCreatingTool",aj); +aj.prototype.canStart=function(){if(!this.isEnabled||null===this.az)return!1;var a=this.g;if(null===a||a.ab||a.vf||!a.Ho||!a.O.left||this.isBeyondDragSize())return!1;if(this.pH){if(1===a.O.Ge&&(this.EB=a.O.jf.copy()),2!==a.O.Ge||this.isBeyondDragSize(this.EB))return!1}else if(1!==a.O.Ge)return!1;return a.Wa!==this&&null!==a.ht(a.O.ca,!0)?!1:!0};aj.prototype.doMouseUp=function(){var a=this.g;this.qa&&null!==a&&this.insertPart(a.O.ca);this.stopTool()}; +aj.prototype.insertPart=function(a){var b=this.g;if(null===b)return null;var c=this.az;if(null===c)return null;this.Qb(this.name);var d=null;c instanceof R?c.Od()&&(Xg(c),d=c.copy(),null!==d&&b.add(d)):null!==c&&(c=b.ba.copyNodeData(c),v.Ta(c)&&(b.ba.Zk(c),d=b.eh(c)));null!==d&&(d.location=a,b.of&&b.select(d));b.qc();this.Bf=this.name;b.Ba("PartCreated",d);this.gk();return d}; +v.defineProperty(aj,{az:"archetypeNodeData"},function(){return this.Ll},function(a){null!==a&&v.A(a,Object,aj,"archetypeNodeData");this.Ll=a});v.defineProperty(aj,{pH:"isDoubleClick"},function(){return this.RB},function(a){v.j(a,"boolean",aj,"isDoubleClick");this.RB=a});function bj(a,b,c){this.text=a;this.qD=b;this.visible=c}function cj(){0<arguments.length&&v.cd(cj);Xf.call(this);this.name="ContextMenu";this.jB=this.Qx=this.gB=null;this.gC=new z;this.Sx=this.En=null;dj(this)}v.Ja(cj,Xf); +v.ea("ContextMenuTool",cj);v.yD=!1;v.Ws=null;v.Xs=null; +function dj(a){a.En=new Vg;a.RC=function(){a.stopTool()};if(!1===v.yD){var b=v.createElement("div"),c=v.createElement("div");b.style.cssText="top: 0px;z-index:300;position: fixed;display: none;text-align: center;left: 25%;width: 50%;background-color: #F5F5F5;padding: 16px;border: 16px solid #444;border-radius: 10px;margin-top: 10px";c.style.cssText="z-index:299;position: fixed;display: none;top: 0;left: 0;width: 100%;height: 100%;background-color: black;-moz-opacity: 0.8;opacity:.80;filter: alpha(opacity=80);";var d= +v.createElement("style");window.document.getElementsByTagName("head")[0].appendChild(d);d.sheet.insertRule(".defaultCXul { list-style: none; }",0);d.sheet.insertRule(".defaultCXli {font:700 1.5em Helvetica, Arial, sans-serif;position: relative;min-width: 60px; }",0);d.sheet.insertRule(".defaultCXa {color: #444;display: inline-block;padding: 4px;text-decoration: none;margin: 2px;border: 1px solid gray;border-radius: 10px; }",0);b.addEventListener("contextmenu",function(a){a.preventDefault();return!1}, +!1);b.addEventListener("selectstart",function(a){a.preventDefault();return!1},!1);c.addEventListener("contextmenu",function(a){a.preventDefault();return!1},!1);window.document.body&&(window.document.body.appendChild(b),window.document.body.appendChild(c));v.Xs=b;v.Ws=c;v.yD=!0}}cj.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.g;return null===a||this.isBeyondDragSize()||!a.O.right?!1:null!==this.En&&a.O.Xi||null!==this.findObjectWithContextMenu()?!0:!1}; +cj.prototype.doStart=function(){var a=this.g;null!==a&&this.gC.set(a.yc.ca)};cj.prototype.doStop=function(){this.hideDefaultContextMenu();this.hideContextMenu();this.lz=null}; +cj.prototype.findObjectWithContextMenu=function(a){void 0===a&&(a=null);var b=this.g;if(null===b)return null;var c=b.O,d=null;a instanceof E||(d=a instanceof G?a:b.re(c.ca,null,function(a){return!a.layer.Gc}));if(null!==d){for(a=d;null!==a;){if(null!==a.contextMenu)return a;a=a.R}if(null!==this.En&&b.O.Xi)return d.Y}else if(null!==b.contextMenu)return b;return null};cj.prototype.doActivate=function(){}; +cj.prototype.doMouseDown=function(){Xf.prototype.doMouseDown.call(this);null!==this.g&&this.g.Za.Pe.contains(this)&&ej(this)};cj.prototype.doMouseUp=function(){ej(this)};function ej(a){var b=a.g;if(null!==b)if(!a.qa)a.canStart()&&(ch(a,!0),a.qa||a.stopTool());else if(null!==a.pf){var c=b.re(b.O.ca,null,null);null!==c&&c.ul(a.pf)&&a.standardMouseClick(null,null);a.stopTool();a.canStart()&&(b.Wa=a,a.doMouseUp())}} +function ch(a,b,c){void 0===c&&(c=null);b&&a.standardMouseSelect();a.standardMouseClick()||(a.qa=!0,null===c&&(c=a.findObjectWithContextMenu()),null!==c?(b=c.contextMenu,null!==b?(a.lz=c instanceof G?c:null,a.showContextMenu(b,a.lz)):a.showDefaultContextMenu()):a.showDefaultContextMenu())}cj.prototype.doMouseMove=function(){this.qa&&this.g.Za.doMouseMove()}; +cj.prototype.showContextMenu=function(a,b){v.A(a,Vg,cj,"showContextMenu:contextmenu");null!==b&&v.A(b,G,cj,"showContextMenu:obj");var c=this.g;if(null!==c){a!==this.pf&&this.hideContextMenu();a.Tf="Tool";a.Al=!1;a.scale=1/c.scale;a.fc=this.name;null!==a.placeholder&&(a.placeholder.scale=c.scale);c.add(a);if(null!==b){var c=null,d=b.Uo();null!==d&&(c=d.data);a.Zb=b;a.data=c}else a.data=c.ba;a.sf();this.positionContextMenu(a,b);this.pf=a}}; +cj.prototype.positionContextMenu=function(a){if(null===a.placeholder){var b=this.g;if(null!==b){var c=b.O.ca.copy(),d=a.Ca,e=b.rb;b.O.Xi&&(c.x-=d.width);c.x+d.width>e.right&&(c.x-=d.width+5);c.x<e.x&&(c.x=e.x);c.y+d.height>e.bottom&&(c.y-=d.height+5);c.y<e.y&&(c.y=e.y);a.position=c}}};cj.prototype.hideContextMenu=function(){var a=this.g;null!==a&&null!==this.pf&&(a.remove(this.pf),null!==this.Qx&&this.Qx.bj(this.pf.fc),this.pf.data=null,this.pf=this.pf.Zb=null,this.standardMouseOver())}; +function fj(a){if(null===a.g)return null;a=new I(bj);a.add(new bj("Copy",function(a){a.nb.copySelection()},function(a){return a.nb.canCopySelection()}));a.add(new bj("Cut",function(a){a.nb.cutSelection()},function(a){return a.nb.canCutSelection()}));a.add(new bj("Delete",function(a){a.nb.deleteSelection()},function(a){return a.nb.canDeleteSelection()}));a.add(new bj("Paste",function(a){a.nb.pasteSelection(a.O.ca)},function(a){return a.nb.canPasteSelection()}));a.add(new bj("Select All",function(a){a.nb.selectAll()}, +function(a){return a.nb.canSelectAll()}));a.add(new bj("Undo",function(a){a.nb.undo()},function(a){return a.nb.canUndo()}));a.add(new bj("Redo",function(a){a.nb.redo()},function(a){return a.nb.canRedo()}));a.add(new bj("Scroll To Part",function(a){a.nb.scrollToPart()},function(a){return a.nb.canScrollToPart()}));a.add(new bj("Zoom To Fit",function(a){a.nb.zoomToFit()},function(a){return a.nb.canZoomToFit()}));a.add(new bj("Reset Zoom",function(a){a.nb.resetZoom()},function(a){return a.nb.canResetZoom()})); +a.add(new bj("Group Selection",function(a){a.nb.groupSelection()},function(a){return a.nb.canGroupSelection()}));a.add(new bj("Ungroup Selection",function(a){a.nb.ungroupSelection()},function(a){return a.nb.canUngroupSelection()}));a.add(new bj("Edit Text",function(a){a.nb.editTextBlock()},function(a){return a.nb.canEditTextBlock()}));return a} +cj.prototype.showDefaultContextMenu=function(){var a=this.g;if(null!==a){null===this.Sx&&(this.Sx=fj(this));this.En!==this.pf&&this.hideContextMenu();v.Xs.innerHTML="";v.Ws.addEventListener("click",this.RC,!1);var b=this,c=v.createElement("ul");c.className="defaultCXul";v.Xs.appendChild(c);c.innerHTML="";for(var d=this.Sx.i;d.next();){var e=d.value,f=e.text,h=e.visible;if("function"===typeof e.qD&&("function"!==typeof h||h(a))){h=v.createElement("li");h.className="defaultCXli";var k=v.createElement("a"); +k.className="defaultCXa";k.href="#";k.AF=e.qD;k.addEventListener("click",function(c){this.AF(a);b.stopTool();c.preventDefault();return!1},!1);k.textContent=f;h.appendChild(k);c.appendChild(h)}}v.Xs.style.display="block";v.Ws.style.display="block";this.pf=this.En}};cj.prototype.hideDefaultContextMenu=function(){null!==this.pf&&this.pf===this.En&&(v.Xs.style.display="none",v.Ws.style.display="none",v.Ws.removeEventListener("click",this.RC,!1),this.pf=null)}; +v.defineProperty(cj,{pf:"currentContextMenu"},function(){return this.gB},function(a){null!==a&&v.A(a,Vg,cj,"currentContextMenu");this.gB=a;this.Qx=null!==a?a.Mf:null});v.defineProperty(cj,{lz:"currentObject"},function(){return this.jB},function(a){null!==a&&v.A(a,G,cj,"currentObject");this.jB=a});v.u(cj,{kK:"mouseDownPoint"},function(){return this.gC}); +function gj(){0<arguments.length&&v.cd(gj);Xf.call(this);this.name="DragSelecting";this.Fn=175;this.WB=!1;var a=new R;a.Tf="Tool";a.Al=!1;var b=new Y;b.name="SHAPE";b.Ab="Rectangle";b.fill=null;b.stroke="magenta";a.add(b);this.Nl=a}v.Ja(gj,Xf);v.ea("DragSelectingTool",gj); +gj.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.g;if(null===a||!a.of)return!1;var b=a.O;return!b.left||a.Wa!==this&&(!this.isBeyondDragSize()||b.timestamp-a.yc.timestamp<this.zD||null!==a.ht(b.ca,!0))?!1:!0};gj.prototype.doActivate=function(){var a=this.g;null!==a&&(this.qa=!0,a.Oe=!0,a.tb=!0,a.add(this.$g),this.doMouseMove())};gj.prototype.doDeactivate=function(){var a=this.g;null!==a&&(a.remove(this.$g),a.tb=!1,this.qa=a.Oe=!1)}; +gj.prototype.doMouseMove=function(){if(null!==this.g&&this.qa&&null!==this.$g){var a=this.computeBoxBounds(),b=this.$g.be("SHAPE");null===b&&(b=this.$g.Ye());b.za=a.size;this.$g.position=a.position}};gj.prototype.doMouseUp=function(){if(this.qa){var a=this.g;a.remove(this.$g);try{a.$b="wait",this.selectInRect(this.computeBoxBounds())}finally{a.$b=""}}this.stopTool()};gj.prototype.computeBoxBounds=function(){var a=this.g;return null===a?new A(0,0,0,0):new A(a.yc.ca,a.O.ca)}; +gj.prototype.selectInRect=function(a){var b=this.g;if(null!==b){var c=b.O;b.Ba("ChangingSelection");a=b.Zj(a,null,function(a){return a instanceof R?a.canSelect():!1},this.uH);if(v.bk?c.Ft:c.control)if(c.shift)for(a=a.i;a.next();)c=a.value,c.hb&&(c.hb=!1);else for(a=a.i;a.next();)c=a.value,c.hb=!c.hb;else{if(!c.shift){for(var c=new I(R),d=b.selection.i;d.next();){var e=d.value;a.contains(e)||c.add(e)}for(c=c.i;c.next();)c.value.hb=!1}for(a=a.i;a.next();)c=a.value,c.hb||(c.hb=!0)}b.Ba("ChangedSelection")}}; +v.defineProperty(gj,{zD:"delay"},function(){return this.Fn},function(a){v.j(a,"number",gj,"delay");this.Fn=a});v.defineProperty(gj,{uH:"isPartialInclusion"},function(){return this.WB},function(a){v.j(a,"boolean",gj,"isPartialInclusion");this.WB=a});v.defineProperty(gj,{$g:"box"},function(){return this.Nl},function(a){null!==a&&v.A(a,R,gj,"box");this.Nl=a}); +function hj(){0<arguments.length&&v.cd(hj);Xf.call(this);this.name="Panning";this.Gy=new z;this.ij=!1;var a=this;this.FC=function(){window.document.removeEventListener("scroll",a.FC,!1);a.stopTool()}}v.Ja(hj,Xf);v.ea("PanningTool",hj);hj.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.g;return null===a||!a.oe&&!a.pe||!a.O.left||a.Wa!==this&&!this.isBeyondDragSize()?!1:!0}; +hj.prototype.doActivate=function(){var a=this.g;null!==a&&(this.ij?(a.O.bubbles=!0,window.document.addEventListener("scroll",this.FC,!1)):(a.$b="move",a.Oe=!0,this.Gy=a.position.copy()),this.qa=!0)};hj.prototype.doDeactivate=function(){var a=this.g;null!==a&&(a.$b="",this.qa=a.Oe=!1)};hj.prototype.doCancel=function(){var a=this.g;null!==a&&(a.position=this.Gy,a.Oe=!1);this.stopTool()};hj.prototype.doMouseMove=function(){this.move()};hj.prototype.doMouseUp=function(){this.move();this.stopTool()}; +hj.prototype.move=function(){var a=this.g;if(this.qa&&a)if(this.ij)a.O.bubbles=!0;else{var b=a.position,c=a.yc.ca,d=a.O.ca,e=b.x+c.x-d.x,c=b.y+c.y-d.y;a.oe||(e=b.x);a.pe||(c=b.y);a.position=new z(e,c)}};v.defineProperty(hj,{bubbles:"bubbles"},function(){return this.ij},function(a){v.j(a,"boolean",hj,"bubbles");this.ij=a});v.u(hj,{uK:"originalPosition"},function(){return this.Gy}); +function ij(){0<arguments.length&&v.cd(ij);Xf.call(this);this.name="TextEditing";this.mB=this.Qy=this.JC=null;this.vo=jj;this.Vk=null;this.eb=kj;this.Sk=null;this.dC=1;this.zC=!0;var a=v.createElement("textarea");a.QB=!0;this.tB=a;a.addEventListener("input",function(){var a=this.textEditingTool;if(null!==a&&void 0!==a&&null!==a.ze){var c=a.JC;c.text=this.value;var d=this.HI;lj(c,a.ze.kv,Infinity);this.style.width=20+c.Ca.width*d+"px";this.style.height=10+c.Ca.height*d+"px";this.rows=c.CH}},!1);a.addEventListener("keydown", +function(a){var c=a.which,d=this.textEditingTool;null!==d&&void 0!==d&&null!==d.ze&&(13===c?(!1===d.ze.Lw&&a.preventDefault(),d.acceptText(mj)):9===c?(d.acceptText(nj),a.preventDefault()):27===c&&(d.doCancel(),null!==d.g&&d.g.focus()))},!1);a.addEventListener("focus",function(a){var c=this.textEditingTool;null!==c&&void 0!==c&&c.doFocus(a)},!1);a.addEventListener("blur",function(a){var c=this.textEditingTool;null!==c&&void 0!==c&&c.doBlur(a)},!1)}v.ea("TextEditingTool",ij);v.Ja(ij,Xf);var oj; +ij.LostFocus=oj=v.p(ij,"LostFocus",0);var pj;ij.MouseDown=pj=v.p(ij,"MouseDown",1);var nj;ij.Tab=nj=v.p(ij,"Tab",2);var mj;ij.Enter=mj=v.p(ij,"Enter",3);ij.SingleClick=v.p(ij,"SingleClick",0);var jj;ij.SingleClickSelected=jj=v.p(ij,"SingleClickSelected",1);var kj=v.p(ij,"StateNone",0),qj=v.p(ij,"StateActive",1),rj=v.p(ij,"StateEditing",2),sj=v.p(ij,"StateEditing2",3),tj=v.p(ij,"StateValidating",4),uj=v.p(ij,"StateValidated",5); +v.defineProperty(ij,{ze:"textBlock"},function(){return this.Qy},function(a){null!==a&&v.A(a,bh,ij,"textBlock");this.Qy=a});v.defineProperty(ij,{qf:"currentTextEditor"},function(){return this.mB},function(a){this.mB=a});v.defineProperty(ij,{EG:"defaultTextEditor"},function(){return this.tB},function(a){v.A(a,Element,ij,"defaultTextEditor");this.tB=a});v.defineProperty(ij,{sA:"starting"},function(){return this.vo},function(a){v.pb(a,ij,ij,"starting");this.vo=a}); +ij.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.g;if(null===a||a.ab||!a.O.left||this.isBeyondDragSize())return!1;a=a.re(a.O.ca,null,function(a){return a instanceof bh});if(null===a||!a.oz||!a.Y.canEdit())return!1;a=a.Y;return null===a||this.sA===jj&&!a.hb?!1:!0};ij.prototype.doStart=function(){this.qa||null===this.ze||this.doActivate()}; +ij.prototype.doActivate=function(){if(!this.qa){var a=this.g;if(null!==a){var b=this.ze;null===b&&(b=a.re(a.O.ca,function(a){return a instanceof bh?a:null}));if(null!==b&&(this.ze=b,null!==b.Y)){this.qa=!0;this.eb=qj;var c=this.EG,d=!1;null!==b.eF&&(c=b.eF);null===c||c.QB||(d=!0);this.JC=this.ze.copy();var e=new A(this.ze.Xa(rb),this.ze.Xa(Eb));a.sI(e);if(c.QB){var f=b.Xa(zb),h=a.position,k=a.scale,l=b.Ti()*k;l<this.vE&&(l=this.vE);var e=b.Ha.width*l,m=b.Ha.height*l,n=(f.x-h.x)*k,f=(f.y-h.y)*k;c.value= +b.text;a.jl.style.font=b.font;c.style.font="inherit";c.style.fontSize=100*l+"%";c.style.lineHeight="normal";c.style.width=e+6+"px";c.style.height=m+2+"px";c.style.left=(n-e/2|0)-1+"px";c.style.top=(f-m/2|0)-1+"px";c.style.textAlign=b.textAlign;c.style.margin="0";c.style.padding="1px";c.style.border="0";c.style.outline="none";c.style["white-space"]="pre-wrap";c.style.overflow="hidden"}a.jl.appendChild(c);c.style.position="absolute";c.style.zIndex=100;c.className="start";c.textEditingTool=this;c.HI= +l;if(d&&"function"===typeof c.onActivate)c.onActivate();this.qf=c;"function"===typeof c.focus&&c.focus();"function"===typeof c.select&&this.lA&&(c.select(),c.setSelectionRange(0,9999))}}}};ij.prototype.doCancel=function(){null!==this.Sk&&(this.qf.style.border=this.Sk,this.Sk=null);this.stopTool()};ij.prototype.doMouseUp=function(){!this.qa&&this.canStart()&&this.doActivate()};ij.prototype.doMouseDown=function(){this.qa&&this.acceptText(pj)}; +ij.prototype.acceptText=function(a){switch(a){case pj:if(this.eb===uj||this.eb===sj)"function"===typeof this.qf.focus&&this.qf.focus();else if(this.eb===qj||this.eb===rj)this.eb=tj,Dj(this);break;case oj:case mj:case nj:if(mj===a&&!0===this.Qy.Lw)break;if(this.eb===qj||this.eb===rj)this.eb=tj,Dj(this)}}; +function Dj(a){if(null!==a.ze&&null!==a.qf){var b=a.ze,c=a.ze.text,d=a.qf.value,e="",e="function"===typeof d?d():d;if(!a.isValidText(a.ze,c,e)){a.eb=rj;null!==b.qz&&b.qz(a,c,e);null===a.Sk&&(a.Sk=a.qf.style.border,a.qf.style.border="3px solid red");"function"===typeof a.qf.focus&&a.qf.focus();return}a.Qb(a.name);a.eb=uj;c!==e&&(a.ze.text=e);a.Bf=a.name;b=a.g;null!==b&&b.Ba("TextEdited",a.ze,c);a.gk();a.stopTool();null!==b&&b.focus()}null!==a.Sk&&(a.qf.style.border=a.Sk,a.Sk=null)} +ij.prototype.doDeactivate=function(){var a=this.g;if(null!==a){this.eb=kj;this.ze=null;if(null!==this.qf){var b=this.qf;if("function"===typeof b.onDeactivate)b.onDeactivate();null!==b&&a.jl.removeChild(b)}this.qa=!1}};ij.prototype.doFocus=function(){var a=this.qf;null!==a&&(this.eb===qj?this.eb=rj:this.eb===uj?this.eb=sj:this.eb===sj&&(this.eb=rj),"function"===typeof a.select&&this.lA&&(a.select(),a.setSelectionRange(0,9999)))}; +ij.prototype.doBlur=function(){var a=this.qf;null!==a&&("function"===typeof a.focus&&a.focus(),"function"===typeof a.select&&this.lA&&(a.select(),a.setSelectionRange(0,9999)))};ij.prototype.isValidText=function(a,b,c){v.A(a,bh,ij,"isValidText:textblock");var d=this.vA;if(null!==d&&!d(a,b,c))return!1;d=a.vA;return null===d||d(a,b,c)?!0:!1};v.defineProperty(ij,{vA:"textValidation"},function(){return this.Vk},function(a){null!==a&&v.j(a,"function",ij,"textValidation");this.Vk=a}); +v.defineProperty(ij,{vE:"minimumEditorScale"},function(){return this.dC},function(a){null!==a&&v.j(a,"number",ij,"minimumEditorScale");this.dC=a});v.defineProperty(ij,{lA:"selectsTextOnActivate"},function(){return this.zC},function(a){null!==a&&v.j(a,"boolean",ij,"selectsTextOnActivate");this.zC=a}); +function Hg(){Xf.call(this);this.name="ToolManager";this.FF=new I(Xf);this.GF=new I(Xf);this.HF=new I(Xf);this.IB=this.JB=850;this.xB=(new ia(2,2)).Ea();this.SC=5E3;this.hC=gh;this.GB=Ej;this.Ju=this.nB=null;this.um=-1}v.Ja(Hg,Xf);v.ea("ToolManager",Hg);var gh;Hg.WheelScroll=gh=v.p(Hg,"WheelScroll",0);var fh;Hg.WheelZoom=fh=v.p(Hg,"WheelZoom",1);Hg.WheelNone=v.p(Hg,"WheelNone",2);var Ej;Hg.GestureZoom=Ej=v.p(Hg,"GestureZoom",3);var Fj;Hg.GestureCancel=Fj=v.p(Hg,"GestureCancel",4);var Gj; +Hg.GestureNone=Gj=v.p(Hg,"GestureNone",5);v.defineProperty(Hg,{It:"mouseWheelBehavior"},function(){return this.hC},function(a){v.pb(a,Hg,Hg,"mouseWheelBehavior");this.hC=a});v.defineProperty(Hg,{Xo:"gestureBehavior"},function(){return this.GB},function(a){v.pb(a,Hg,Hg,"gestureBehavior");this.GB=a}); +Hg.prototype.initializeStandardTools=function(){this.XF=new $i;this.CE=new lh;this.FH=new Ii;this.NE=new Pi;this.pI=new Xi;this.rE=new zi;this.$d=new Zg;this.JG=new gj;this.ZH=new hj;this.gz=new cj;this.uA=new ij;this.mG=new aj;this.nG=new Zi};Hg.prototype.updateAdornments=function(a){var b=this.dh;if(null!==b&&this.Ju===a){var c=b.Zb;(null!==a?c.Y===a:null===c)?this.showToolTip(b,c):this.hideToolTip()}}; +Hg.prototype.doMouseDown=function(){var a=this.g;if(null!==a){var b=a.O;b.Xi&&this.Xo===Fj&&(b.bubbles=!1);if(b.wt){if(this.Xo===Gj){b.bubbles=!0;return}if(this.Xo===Fj)return;if(a.Wa.canStartMultiTouch()){a.Wa.standardPinchZoomStart();return}}var c=a.la;c.dz&&0!==c.th&&v.trace("WARNING: In ToolManager.doMouseDown: UndoManager.transactionLevel is not zero");for(var c=this.Pe.length,d=0;d<c;d++){var e=this.Pe.da(d);null===e.g&&e.Mc(this.g);if(e.canStart()){a.doFocus();a.Wa=e;a.Wa===e&&(e.qa||e.doActivate(), +e.doMouseDown());return}}1===a.O.button&&(this.It===gh?this.It=fh:this.It===fh&&(this.It=gh));this.doActivate();this.standardWaitAfter(this.XD,b)}}; +Hg.prototype.doMouseMove=function(){var a=this.g;if(null!==a){var b=a.O;if(b.wt){if(this.Xo===Gj){b.bubbles=!0;return}if(this.Xo===Fj)return;if(a.Wa.canStartMultiTouch()){a.Wa.standardPinchZoomMove();return}}if(this.qa)for(var c=this.Vf.length,d=0;d<c;d++){var e=this.Vf.da(d);null===e.g&&e.Mc(this.g);if(e.canStart()){a.doFocus();a.Wa=e;a.Wa===e&&(e.qa||e.doActivate(),e.doMouseMove());return}}Hj(this,a);null===b.event||"mousemove"!==b.event.type&&b.event.cancelable||(b.bubbles=!0)}}; +function Hj(a,b){a.standardMouseOver();a.isBeyondDragSize()&&a.standardWaitAfter(a.qa?a.XD:a.gH,b.O)}Hg.prototype.doCurrentObjectChanged=function(a,b){var c=this.dh;null===c||null!==b&&(b===c||b.ul(c))||this.hideToolTip()};Hg.prototype.doWaitAfter=function(a){var b=this.g;null!==b&&b.zb&&(this.doMouseHover(),this.qa||this.doToolTip(),a.Xi&&!b.O.zc&&(a=a.copy(),a.button=2,a.buttons=2,b.O=a,b.ys=!0,b.doMouseUp()))}; +Hg.prototype.doMouseHover=function(){var a=this.g;if(null!==a){var b=a.O;null===b.ye&&(b.ye=a.re(b.ca,null,null));var c=b.ye;if(null!==c)for(b.zc=!1;null!==c;){a=this.qa?c.Qz:c.Rz;if(null!==a&&(a(b,c),b.zc))break;c=c.R}else a=this.qa?a.Qz:a.Rz,null!==a&&a(b)}}; +Hg.prototype.doToolTip=function(){var a=this.g;if(null!==a){var b=a.O;null===b.ye&&(b.ye=a.re(b.ca,null,null));b=b.ye;if(null!==b){if(b!==this.dh&&!b.ul(this.dh)){for(;null!==b;){a=b.xA;if(null!==a){this.showToolTip(a,b);return}b=b.R}this.hideToolTip()}}else a=a.xA,null!==a?this.showToolTip(a,null):this.hideToolTip()}}; +Hg.prototype.showToolTip=function(a,b){v.A(a,Vg,Hg,"showToolTip:tooltip");null!==b&&v.A(b,G,Hg,"showToolTip:obj");var c=this.g;if(null!==c){a!==this.dh&&this.hideToolTip();a.Tf="Tool";a.Al=!1;a.scale=1/c.scale;a.fc="ToolTip";null!==a.placeholder&&(a.placeholder.scale=c.scale);c.add(a);if(null!==b){var c=null,d=b.Uo();null!==d&&(c=d.data);a.Zb=b;a.data=c}else a.data=c.ba;a.sf();this.positionToolTip(a,b);this.dh=a;-1!==this.um&&(v.clearTimeout(this.um),this.um=-1);c=this.MI;if(0<c&&Infinity!==c){var e= +this;this.um=v.setTimeout(function(){e.hideToolTip()},c)}}};Hg.prototype.positionToolTip=function(a){if(null===a.placeholder){var b=this.g;if(null!==b){var c=b.O.ca.copy(),d=a.Ca,e=b.rb;b.O.Xi&&(c.x-=d.width);c.x+d.width>e.right&&(c.x-=d.width+5);c.x<e.x&&(c.x=e.x);c.y=c.y+20+d.height>e.bottom?c.y-(d.height+5):c.y+20;c.y<e.y&&(c.y=e.y);a.position=c}}}; +Hg.prototype.hideToolTip=function(){-1!==this.um&&(v.clearTimeout(this.um),this.um=-1);var a=this.g;null!==a&&null!==this.dh&&(a.remove(this.dh),null!==this.Ju&&this.Ju.bj(this.dh.fc),this.dh.data=null,this.dh=this.dh.Zb=null)};v.defineProperty(Hg,{dh:"currentToolTip"},function(){return this.nB},function(a){null!==a&&v.A(a,Vg,Hg,"currentToolTip");this.nB=a;this.Ju=null!==a?a.Mf:null}); +Hg.prototype.doMouseUp=function(){this.cancelWaitAfter();var a=this.g;if(null!==a){if(this.qa)for(var b=this.Wf.length,c=0;c<b;c++){var d=this.Wf.da(c);null===d.g&&d.Mc(this.g);if(d.canStart()){a.doFocus();a.Wa=d;a.Wa===d&&(d.qa||d.doActivate(),d.doMouseUp());return}}a.doFocus();this.doDeactivate()}};Hg.prototype.doMouseWheel=function(){this.standardMouseWheel()};Hg.prototype.doKeyDown=function(){var a=this.g;null!==a&&a.nb.doKeyDown()};Hg.prototype.doKeyUp=function(){var a=this.g;null!==a&&a.nb.doKeyUp()}; +Hg.prototype.doCancel=function(){null!==jh&&jh.doCancel();Xf.prototype.doCancel.call(this)};Hg.prototype.findTool=function(a){v.j(a,"string",Hg,"findTool:name");for(var b=this.Pe.length,c=0;c<b;c++){var d=this.Pe.da(c);if(d.name===a)return d}b=this.Vf.length;for(c=0;c<b;c++)if(d=this.Vf.da(c),d.name===a)return d;b=this.Wf.length;for(c=0;c<b;c++)if(d=this.Wf.da(c),d.name===a)return d;return null}; +Hg.prototype.replaceTool=function(a,b){v.j(a,"string",Hg,"replaceTool:name");null!==b&&(v.A(b,Xf,Hg,"replaceTool:newtool"),b.g&&b.g!==this.g&&v.k("Cannot share tools between Diagrams: "+b.toString()),b.Mc(this.g));for(var c=this.Pe.length,d=0;d<c;d++){var e=this.Pe.da(d);if(e.name===a)return null!==b?this.Pe.Ig(d,b):this.Pe.Vc(d),e}c=this.Vf.length;for(d=0;d<c;d++)if(e=this.Vf.da(d),e.name===a)return null!==b?this.Vf.Ig(d,b):this.Vf.Vc(d),e;c=this.Wf.length;for(d=0;d<c;d++)if(e=this.Wf.da(d),e.name=== +a)return null!==b?this.Wf.Ig(d,b):this.Wf.Vc(d),e;return null};function Ij(a,b,c,d){v.j(b,"string",Hg,"replaceStandardTool:name");v.A(d,I,Hg,"replaceStandardTool:list");null!==c&&(v.A(c,Xf,Hg,"replaceStandardTool:newtool"),c.g&&c.g!==a.g&&v.k("Cannot share tools between Diagrams: "+c.toString()),c.name=b,c.Mc(a.g));a.findTool(b)?a.replaceTool(b,c):null!==c&&d.add(c)}v.u(Hg,{Pe:"mouseDownTools"},function(){return this.FF});v.u(Hg,{Vf:"mouseMoveTools"},function(){return this.GF}); +v.u(Hg,{Wf:"mouseUpTools"},function(){return this.HF});v.defineProperty(Hg,{gH:"hoverDelay"},function(){return this.JB},function(a){v.j(a,"number",Hg,"hoverDelay");this.JB=a});v.defineProperty(Hg,{XD:"holdDelay"},function(){return this.IB},function(a){v.j(a,"number",Hg,"holdDelay");this.IB=a});v.defineProperty(Hg,{KG:"dragSize"},function(){return this.xB},function(a){v.A(a,ia,Hg,"dragSize");this.xB=a.S()}); +v.defineProperty(Hg,{MI:"toolTipDuration"},function(){return this.SC},function(a){v.j(a,"number",Hg,"toolTipDuration");this.SC=a});v.defineProperty(Hg,{XF:"actionTool"},function(){return this.findTool("Action")},function(a){Ij(this,"Action",a,this.Pe)});v.defineProperty(Hg,{CE:"relinkingTool"},function(){return this.findTool("Relinking")},function(a){Ij(this,"Relinking",a,this.Pe)}); +v.defineProperty(Hg,{FH:"linkReshapingTool"},function(){return this.findTool("LinkReshaping")},function(a){Ij(this,"LinkReshaping",a,this.Pe)});v.defineProperty(Hg,{NE:"resizingTool"},function(){return this.findTool("Resizing")},function(a){Ij(this,"Resizing",a,this.Pe)});v.defineProperty(Hg,{pI:"rotatingTool"},function(){return this.findTool("Rotating")},function(a){Ij(this,"Rotating",a,this.Pe)}); +v.defineProperty(Hg,{rE:"linkingTool"},function(){return this.findTool("Linking")},function(a){Ij(this,"Linking",a,this.Vf)});v.defineProperty(Hg,{$d:"draggingTool"},function(){return this.findTool("Dragging")},function(a){Ij(this,"Dragging",a,this.Vf)});v.defineProperty(Hg,{JG:"dragSelectingTool"},function(){return this.findTool("DragSelecting")},function(a){Ij(this,"DragSelecting",a,this.Vf)}); +v.defineProperty(Hg,{ZH:"panningTool"},function(){return this.findTool("Panning")},function(a){Ij(this,"Panning",a,this.Vf)});v.defineProperty(Hg,{gz:"contextMenuTool"},function(){return this.findTool("ContextMenu")},function(a){Ij(this,"ContextMenu",a,this.Wf)});v.defineProperty(Hg,{uA:"textEditingTool"},function(){return this.findTool("TextEditing")},function(a){Ij(this,"TextEditing",a,this.Wf)}); +v.defineProperty(Hg,{mG:"clickCreatingTool"},function(){return this.findTool("ClickCreating")},function(a){Ij(this,"ClickCreating",a,this.Wf)});v.defineProperty(Hg,{nG:"clickSelectingTool"},function(){return this.findTool("ClickSelecting")},function(a){Ij(this,"ClickSelecting",a,this.Wf)}); +function vg(){this.oB=Jj;this.uq=this.vq=this.W=null;this.ln=this.wq=this.xq=0;this.mn=this.pc=this.Un=this.tj=!1;this.uj=this.Se=!0;this.Iu=this.Hu=this.iB=null;this.hB=0;this.vo=null;this.uu=new J("string");this.$x=600;this.LF=new z(0,0);this.WA=this.VA=this.WC=!1;this.fm=new na(G,Kj)}v.ea("AnimationManager",vg);vg.prototype.Mc=function(a){this.W=a};function Jj(a,b,c,d){a/=d/2;return 1>a?c/2*a*a+b:-c/2*(--a*(a-2)-1)+b} +v.defineProperty(vg,{sA:"starting"},function(){return this.vo},function(a){this.vo!==a&&(null!==a&&v.j(a,"function",vg,"starting"),this.vo=a)});v.u(vg,{rJ:"animationReasons"},function(){return this.uu});vg.prototype.prepareAutomaticAnimation=vg.prototype.Xm=function(a){if(this.Se&&(this.uj||this.W.Qm)){this.uu.add(a);var b=this.sA;if(null===b||b(this,a))this.tj&&this.$h(),this.pc=!0}}; +function Lj(a){if(a.Se&&(a.uu.clear(),a.pc))if(!a.mn)a.pc=!1;else if(0===a.ln){var b=+new Date;a.ln=b;requestAnimationFrame(function(){if(!1!==a.pc&&!a.tj&&a.ln===b){var c=a.W;c.Ui("temporaryPixelRatio")&&(c.Nj=1);Mj(c);a.pc=!1;c.Ba("AnimationStarting");Nj(a,b)}})}} +function Oj(a,b,c,d,e,f){if(!(!a.pc||"position"===c&&d.K(e)||b instanceof R&&!b.$D)){var h=a.fm;if(h.contains(b)){var h=h.ja(b),k=h.start,l=h.end;void 0===k[c]&&(k[c]=Pj(d));h.sw&&void 0!==l[c]?h.ct[c]=Pj(e):(f||(h.ct[c]=Pj(e)),l[c]=Pj(e));f&&0===c.indexOf("position:")&&(h.ct.location=Pj(b.location))}else k=new ta,l=new ta,k[c]=Pj(d),l[c]=Pj(e),d=l,e=k.position,e instanceof z&&!e.G()&&a.uu.contains("Expand SubGraph")&&e.assign(d.position),k=new Kj(k,l,f),f&&0===c.indexOf("position:")&&(k.ct.location= +Pj(b.location)),h.add(b,k);a.mn=!0}}function Pj(a){return a instanceof z?a.copy():a instanceof ia?a.copy():a} +function Nj(a,b){var c;function d(){if(!1!==f.tj&&f.ln===b){var a=+new Date,c=a>s?m:a-r;Qj(f);Rj(f,e,q,h,c,m);f.Hu&&f.Hu();di(e);Sj(f);a>s?Tj(f):requestAnimationFrame(d)}}void 0===c&&(c=new ta);var e=a.W;if(null!==e){a.tj=!0;var f=a,h=c.NJ||a.oB,k=c.nK||null,l=c.oK||null,m=c.duration||a.$x,n=a.LF;for(c=a.fm.i;c.next();){var p=c.value.start.position;p instanceof z&&(p.G()||p.assign(n))}a.iB=h;a.Hu=k;a.Iu=l;a.hB=m;a.lB=a.fm;var q=a.lB;for(c=q.i;c.next();)k=c.value.end,k["position:placeholder"]&&(l= +k["position:placeholder"],n=l.Xa(rb),n.x+=l.padding.left,n.y+=l.padding.top,k["position:placeholder"]=n);Qj(a);Rj(a,e,q,h,0,m);di(a.W);Sj(a);var r=+new Date,s=r+m;f.ln===b&&requestAnimationFrame(function(){d()})}} +var Uj={opacity:function(a,b,c,d,e,f){a.opacity=d(e,b,c-b,f)},position:function(a,b,c,d,e,f){e!==f?a.ox(d(e,b.x,c.x-b.x,f),d(e,b.y,c.y-b.y,f)):a.position=new z(d(e,b.x,c.x-b.x,f),d(e,b.y,c.y-b.y,f))},"position:node":function(a,b,c,d,e,f){var h=a.U,k=c.U;c=k.x+k.width/2-h.width/2;h=k.y+k.height/2-h.height/2;e!==f?a.ox(d(e,b.x,c-b.x,f),d(e,b.y,h-b.y,f)):a.position=new z(d(e,b.x,c-b.x,f),d(e,b.y,h-b.y,f))},"position:placeholder":function(a,b,c,d,e,f){e!==f?a.ox(d(e,b.x,c.x-b.x,f),d(e,b.y,c.y-b.y,f)): +a.position=new z(d(e,b.x,c.x-b.x,f),d(e,b.y,c.y-b.y,f))},scale:function(a,b,c,d,e,f){a.scale=d(e,b,c-b,f)},visible:function(a,b,c,d,e,f){a.visible=e!==f?b:c}};function Qj(a){if(!a.Un){var b=a.W;a.WC=b.tb;a.VA=b.we;a.WA=b.bu;b.tb=!0;b.we=!0;b.bu=!0;a.Un=!0}}function Sj(a){var b=a.W;b.tb=a.WC;b.we=a.VA;b.bu=a.WA;a.Un=!1} +function Rj(a,b,c,d,e,f){for(c=c.i;c.next();){var h=c.key,k=c.value,l=k.start,k=k.end,m;for(m in k)if(("position"!==m||!k["position:placeholder"]&&!k["position:node"])&&void 0!==Uj[m])Uj[m](h,l[m],k[m],d,e,f)}d=b.Dz;b.Dz=!0;m=a.oB;0!==a.xq&&0!==a.wq&&(c=a.xq,b.Tb=m(e,c,a.wq-c,f));null!==a.vq&&null!==a.uq&&(c=a.vq,a=a.uq,b.kb=new z(m(e,c.x,a.x-c.x,f),m(e,c.y,a.y-c.y,f)));b.Dz=d}vg.prototype.stopAnimation=vg.prototype.$h=function(){!0===this.pc&&(this.pc=!1,this.mn&&this.W.ue());this.tj&&this.Se&&Tj(this)}; +function Tj(a){a.tj=!1;a.ln=0;a.mn=!1;a.vq=null;a.uq=null;a.xq=0;a.wq=0;Qj(a);for(var b=a.W,c=a.iB,d=a.hB,e=a.lB.i;e.next();){var f=e.key,h=e.value,k=h.start,l=h.end,m=h.ct,n;for(n in l)if(void 0!==Uj[n]){var p=n;!h.sw||"position:node"!==p&&"position:placeholder"!==p||(p="position");Uj[p](f,k[n],void 0!==m[n]?m[n]:h.sw?k[n]:l[n],c,d,d)}h.sw&&void 0!==m.location&&(f.location=m.location);h.bx&&f.nd(!1)}for(c=a.W.links;c.next();)d=c.value,null!==d.oo&&(d.points=d.oo,d.oo=null);b.Rw.clear();b.Nj=null; +b.qc();b.pa();b.Uf();Vj(b);Sj(a);a.fm=new na(G,Kj);a.Iu&&a.Iu();a.Iu=null;a.Hu=null;b.Ba("AnimationFinished");b.ue()}function Wj(a,b,c){var d=b.U,e=c.U,f=null;c instanceof V&&(f=c.placeholder);null!==f?(d=f.Xa(rb),d.x+=f.padding.left,d.y+=f.padding.top,Oj(a,b,"position",d,b.position,!1)):Oj(a,b,"position",new z(e.x+e.width/2-d.width/2,e.y+e.height/2-d.height/2),b.position,!1);Oj(a,b,"scale",.01,b.scale,!1);if(b instanceof V)for(b=b.Ic;b.next();)f=b.value,f instanceof S&&Wj(a,f,c)} +function Xj(a,b,c){if(b.isVisible()){var d=null;c instanceof V&&(d=c.placeholder);null!==d?Oj(a,b,"position:placeholder",b.position,d,!0):Oj(a,b,"position:node",b.position,c,!0);Oj(a,b,"scale",b.scale,.01,!0);a.pc&&(d=a.fm,d.contains(b)&&(d.ja(b).bx=!0));if(b instanceof V)for(b=b.Ic;b.next();)d=b.value,d instanceof S&&Xj(a,d,c)}}function Yj(a,b,c){a.pc&&(null===a.vq&&b.G()&&null===a.uq&&(a.vq=b.copy()),a.uq=c.copy(),a.mn=!0)} +function Zj(a,b,c){a.pc&&a.W.Qm&&(0===a.xq&&0===a.wq&&(a.xq=b),a.wq=c,a.mn=!0)}v.defineProperty(vg,{isEnabled:"isEnabled"},function(){return this.Se},function(a){v.j(a,"boolean",vg,"isEnabled");this.Se=a});v.defineProperty(vg,{duration:"duration"},function(){return this.$x},function(a){v.j(a,"number",vg,"duration");1>a&&v.va(a,">= 1",vg,"duration");this.$x=a});v.u(vg,{df:"isAnimating"},function(){return this.tj});v.u(vg,{vH:"isTicking"},function(){return this.Un}); +v.defineProperty(vg,{iE:"isInitial"},function(){return this.uj},function(a){v.j(a,"boolean",vg,"isInitial");this.uj=a});function Kj(a,b,c){this.start=a;this.end=b;this.ct=new ta;this.sw=c;this.bx=!1}function Wf(){0<arguments.length&&v.cd(Wf);v.dc(this);this.W=null;this.wb=new I(R);this.Ob="";this.Rc=1;this.uy=!1;this.Uk=this.Uy=this.rk=this.qk=this.pk=this.ok=this.mk=this.nk=this.lk=this.tk=this.kk=this.sk=this.jk=this.ik=!0;this.oy=!1;this.Bv=[]}v.ea("Layer",Wf); +Wf.prototype.Mc=function(a){this.W=a}; +Wf.prototype.toString=function(a){void 0===a&&(a=0);var b='Layer "'+this.name+'"';if(0>=a)return b;for(var c=0,d=0,e=0,f=0,h=0,k=this.wb.i;k.next();){var l=k.value;l instanceof V?e++:l instanceof S?d++:l instanceof W?f++:l instanceof Vg?h++:c++}k="";0<c&&(k+=c+" Parts ");0<d&&(k+=d+" Nodes ");0<e&&(k+=e+" Groups ");0<f&&(k+=f+" Links ");0<h&&(k+=h+" Adornments ");if(1<a)for(a=this.wb.i;a.next();)c=a.value,k+="\n "+c.toString(),d=c.data,null!==d&&v.ld(d)&&(k+=" #"+v.ld(d)),c instanceof S?k+=" "+ +Ef(d):c instanceof W&&(k+=" "+Ef(c.T)+" "+Ef(c.Z));return b+" "+this.wb.count+": "+k};Wf.prototype.findObjectAt=Wf.prototype.re=function(a,b,c){void 0===b&&(b=null);void 0===c&&(c=null);if(!1===this.Uk)return null;var d=!1;this.g.rb.Fa(a)&&(d=!0);for(var e=v.L(),f=this.wb.n,h=f.length;h--;){var k=f[h];if((!0!==d||!1!==ak(k))&&k.isVisible()&&(e.assign(a),Qa(e,k.Zg),k=k.re(e,b,c),null!==k&&(null!==b&&(k=b(k)),null!==k&&(null===c||c(k)))))return v.v(e),k}v.v(e);return null}; +Wf.prototype.findObjectsAt=Wf.prototype.gt=function(a,b,c,d){void 0===b&&(b=null);void 0===c&&(c=null);d instanceof I||d instanceof J||(d=new J(G));if(!1===this.Uk)return d;var e=!1;this.g.rb.Fa(a)&&(e=!0);for(var f=v.L(),h=this.wb.n,k=h.length;k--;){var l=h[k];!0===e&&!1===ak(l)||!l.isVisible()||(f.assign(a),Qa(f,l.Zg),l.gt(f,b,c,d)&&(null!==b&&(l=b(l)),null===l||null!==c&&!c(l)||d.add(l)))}v.v(f);return d}; +Wf.prototype.findObjectsIn=Wf.prototype.Zj=function(a,b,c,d,e){void 0===b&&(b=null);void 0===c&&(c=null);void 0===d&&(d=!1);e instanceof I||e instanceof J||(e=new J(G));if(!1===this.Uk)return e;var f=!1;this.g.rb.Xj(a)&&(f=!0);for(var h=this.wb.n,k=h.length;k--;){var l=h[k];(!0!==f||!1!==ak(l))&&l.isVisible()&&l.Zj(a,b,c,d,e)&&(null!==b&&(l=b(l)),null===l||null!==c&&!c(l)||e.add(l))}return e}; +Wf.prototype.rz=function(a,b,c,d,e,f,h){if(!1===this.Uk)return e;for(var k=this.wb.n,l=k.length;l--;){var m=k[l];(!0!==h||!1!==ak(m))&&f(m)&&m.isVisible()&&m.Zj(a,b,c,d,e)&&(null!==b&&(m=b(m)),null===m||null!==c&&!c(m)||e.add(m))}return e}; +Wf.prototype.findObjectsNear=Wf.prototype.Km=function(a,b,c,d,e,f){void 0===c&&(c=null);void 0===d&&(d=null);void 0===e&&(e=!0);if(!1!==e&&!0!==e){if(e instanceof I||e instanceof J)f=e;e=!0}f instanceof I||f instanceof J||(f=new J(G));if(!1===this.Uk)return f;var h=!1;this.g.rb.Fa(a)&&(h=!0);for(var k=v.L(),l=v.L(),m=this.wb.n,n=m.length;n--;){var p=m[n];!0===h&&!1===ak(p)||!p.isVisible()||(k.assign(a),Qa(k,p.Zg),l.m(a.x+b,a.y),Qa(l,p.Zg),p.Km(k,l,c,d,e,f)&&(null!==c&&(p=c(p)),null===p||null!==d&& +!d(p)||f.add(p)))}v.v(k);v.v(l);return f};g=Wf.prototype;g.yf=function(a,b){if(this.visible){var c;c=void 0===b?a.rb:b;for(var d=this.wb.n,e=d.length,f=0;f<e;f++){var h=d[f];h.aC=f;if(!(h instanceof W&&!1===h.rg)){if(h instanceof Vg){var k=h;if(null!==k.Mf)continue}if(Za(h.U,c))for(h.yf(!0),bk(h),h=h.gw;h.next();)k=h.value,lj(k,Infinity,Infinity),k.Ec(),k.yf(!0);else h.yf(!1),null!==h.gw&&0<h.gw.count&&bk(h)}}}}; +g.Xe=function(a,b,c){if(this.visible&&0!==this.Rc&&(void 0===c&&(c=!0),c||!this.Gc)){c=this.wb.n;var d=c.length;if(0!==d){1!==this.Rc&&(a.globalAlpha=this.Rc);var e=this.Bv;e.length=0;for(var f=b.scale,h=0;h<d;h++){var k=c[h];if(ak(k)){if(k instanceof W){var l=k;l.jc&&e.push(l);if(!1===l.rg)continue}l=k.U;1<l.width*f||1<l.height*f?k.Xe(a,b):ck(k,a)}}a.globalAlpha=1}}}; +function dk(a,b,c,d){if(a.visible&&0!==a.Rc){1!==a.Rc&&(b.globalAlpha=a.Rc);var e=a.Bv;e.length=0;var f=c.scale;a=a.wb.n;for(var h=a.length,k=d.length,l=0;l<h;l++){var m=a[l];if(ak(m)){if(m instanceof W){var n=m;n.jc&&e.push(n);if(!1===n.rg)continue}var n=ek(m,m.U),p;a:{p=n;for(var q=d,r=k,s=2/f,t=4/f,u=0;u<r;u++){var x=q[u];if(0!==x.width&&0!==x.height&&p.YD(x.x-s,x.y-s,x.width+t,x.height+t)){p=!0;break a}}p=!1}p&&(1<n.width*f||1<n.height*f?m.Xe(b,c):ck(m,b))}}b.globalAlpha=1}} +g.h=function(a,b,c,d,e){var f=this.g;null!==f&&f.Lc(Af,a,this,b,c,d,e)};g.cp=function(a,b,c){var d=this.wb;b.lv=this;if(a>=d.count)a=d.count;else if(d.da(a)===b)return-1;d.yd(a,b);b.qt(c);d=this.g;null!==d&&(c?d.pa():d.cp(b));fk(this,a,b);return a}; +g.Ne=function(a,b,c){if(!c&&b.layer!==this&&null!==b.layer)return b.layer.Ne(a,b,c);var d=this.wb;if(0>a||a>=d.length){if(a=d.indexOf(b),0>a)return-1}else if(d.da(a)!==b&&(a=d.indexOf(b),0>a))return-1;b.rt(c);d.Vc(a);d=this.g;null!==d&&(c?d.pa():d.Ne(b));b.lv=null;return a}; +function fk(a,b,c){b=gk(a,b,c);if(c instanceof V&&null!==c&&isNaN(c.hn)){if(0!==c.Ic.count){for(var d=-1,e=a.wb.n,f=e.length,h=0;h<f;h++){var k=e[h];if(k===c&&(b=h,0<=d))break;if(0>d&&k.Sa===c&&(d=h,0<=b))break}!(0>d)&&d<b&&(e=a.wb,e.Vc(b),e.yd(d,c))}c=c.Sa;null!==c&&fk(a,-1,c)}} +function gk(a,b,c){var d=c.hn;if(isNaN(d))return b;a=a.wb;var e=a.count;if(1>=e)return b;0>b&&(b=a.indexOf(c));if(0>b)return-1;for(var f=b-1,h=NaN;0<=f;){h=a.da(f).hn;if(!isNaN(h))break;f--}for(var k=b+1,l=NaN;k<e;){l=a.da(k).hn;if(!isNaN(l))break;k++}if(!isNaN(h)&&h>d)for(;;){if(-1===f||h<=d){f++;if(f===b)break;a.Vc(b);a.yd(f,c);return f}for(h=NaN;0<=--f&&(h=a.da(f).hn,isNaN(h)););}else if(!isNaN(l)&&l<d)for(;;){if(k===e||l>=d){k--;if(k===b)break;a.Vc(b);a.yd(k,c);return k}for(l=NaN;++k<e&&(l=a.da(k).hn, +isNaN(l)););}return b}g.clear=function(){for(var a=this.wb.cc(),b=a.length,c=0;c<b;c++)a[c].yf(!1),this.Ne(-1,a[c],!1)};v.u(Wf,{ek:"parts"},function(){return this.wb.i});v.u(Wf,{xK:"partsBackwards"},function(){return this.wb.Rm});v.u(Wf,{g:"diagram"},function(){return this.W}); +v.defineProperty(Wf,{name:"name"},function(){return this.Ob},function(a){v.j(a,"string",Wf,"name");var b=this.Ob;if(b!==a){var c=this.g;if(null!==c)for(""===b&&v.k("Cannot rename default Layer to: "+a),c=c.Pw;c.next();)c.value.name===a&&v.k("Layer.name is already present in this diagram: "+a);this.Ob=a;this.h("name",b,a);for(a=this.wb.i;a.next();)a.value.Tf=this.Ob}}); +v.defineProperty(Wf,{opacity:"opacity"},function(){return this.Rc},function(a){var b=this.Rc;b!==a&&(v.j(a,"number",Wf,"opacity"),(0>a||1<a)&&v.va(a,"0 <= value <= 1",Wf,"opacity"),this.Rc=a,this.h("opacity",b,a),a=this.g,null!==a&&a.pa())});v.defineProperty(Wf,{Gc:"isTemporary"},function(){return this.uy},function(a){var b=this.uy;b!==a&&(v.j(a,"boolean",Wf,"isTemporary"),this.uy=a,this.h("isTemporary",b,a))}); +v.defineProperty(Wf,{visible:"visible"},function(){return this.Uy},function(a){var b=this.Uy;if(b!==a){v.j(a,"boolean",Wf,"visible");this.Uy=a;this.h("visible",b,a);for(b=this.wb.i;b.next();)b.value.nd(a);a=this.g;null!==a&&a.pa()}});v.defineProperty(Wf,{Hg:"pickable"},function(){return this.Uk},function(a){var b=this.Uk;b!==a&&(v.j(a,"boolean",Wf,"pickable"),this.Uk=a,this.h("pickable",b,a))}); +v.defineProperty(Wf,{aE:"isBoundsIncluded"},function(){return this.oy},function(a){this.oy!==a&&(this.oy=a,null!==this.g&&this.g.qc())});v.defineProperty(Wf,{Vj:"allowCopy"},function(){return this.ik},function(a){var b=this.ik;b!==a&&(v.j(a,"boolean",Wf,"allowCopy"),this.ik=a,this.h("allowCopy",b,a))});v.defineProperty(Wf,{xm:"allowDelete"},function(){return this.jk},function(a){var b=this.jk;b!==a&&(v.j(a,"boolean",Wf,"allowDelete"),this.jk=a,this.h("allowDelete",b,a))}); +v.defineProperty(Wf,{kw:"allowTextEdit"},function(){return this.sk},function(a){var b=this.sk;b!==a&&(v.j(a,"boolean",Wf,"allowTextEdit"),this.sk=a,this.h("allowTextEdit",b,a))});v.defineProperty(Wf,{hw:"allowGroup"},function(){return this.kk},function(a){var b=this.kk;b!==a&&(v.j(a,"boolean",Wf,"allowGroup"),this.kk=a,this.h("allowGroup",b,a))}); +v.defineProperty(Wf,{lw:"allowUngroup"},function(){return this.tk},function(a){var b=this.tk;b!==a&&(v.j(a,"boolean",Wf,"allowUngroup"),this.tk=a,this.h("allowUngroup",b,a))});v.defineProperty(Wf,{Ts:"allowLink"},function(){return this.lk},function(a){var b=this.lk;b!==a&&(v.j(a,"boolean",Wf,"allowLink"),this.lk=a,this.h("allowLink",b,a))}); +v.defineProperty(Wf,{ym:"allowRelink"},function(){return this.nk},function(a){var b=this.nk;b!==a&&(v.j(a,"boolean",Wf,"allowRelink"),this.nk=a,this.h("allowRelink",b,a))});v.defineProperty(Wf,{bl:"allowMove"},function(){return this.mk},function(a){var b=this.mk;b!==a&&(v.j(a,"boolean",Wf,"allowMove"),this.mk=a,this.h("allowMove",b,a))}); +v.defineProperty(Wf,{iw:"allowReshape"},function(){return this.ok},function(a){var b=this.ok;b!==a&&(v.j(a,"boolean",Wf,"allowReshape"),this.ok=a,this.h("allowReshape",b,a))});v.defineProperty(Wf,{Us:"allowResize"},function(){return this.pk},function(a){var b=this.pk;b!==a&&(v.j(a,"boolean",Wf,"allowResize"),this.pk=a,this.h("allowResize",b,a))}); +v.defineProperty(Wf,{jw:"allowRotate"},function(){return this.qk},function(a){var b=this.qk;b!==a&&(v.j(a,"boolean",Wf,"allowRotate"),this.qk=a,this.h("allowRotate",b,a))});v.defineProperty(Wf,{of:"allowSelect"},function(){return this.rk},function(a){var b=this.rk;b!==a&&(v.j(a,"boolean",Wf,"allowSelect"),this.rk=a,this.h("allowSelect",b,a))}); +function E(a){function b(){window.document.removeEventListener("DOMContentLoaded",b,!1);hk(c)}1<arguments.length&&v.k("Diagram constructor can only take one optional argument, the DIV HTML element or its id.");v.dc(this);ik=[];this.Pc=!0;this.PA=new vg;this.PA.Mc(this);this.vd=17;this.Tq=!1;this.Hy="default";var c=this;null!==window.document.body?hk(this):window.document.addEventListener("DOMContentLoaded",b,!1);this.Yb=new I(Wf);this.Jb=this.Eb=0;this.Hj=this.Kb=this.lf=this.zb=null;this.JE();this.Rn= +null;this.IE();this.kb=(new z(NaN,NaN)).freeze();this.Tb=1;this.cv=(new z(NaN,NaN)).freeze();this.dv=NaN;this.sv=1E-4;this.qv=100;this.ne=new ja;this.ew=(new z(NaN,NaN)).freeze();this.Uu=(new A(NaN,NaN,NaN,NaN)).freeze();this.Nv=(new cb(0,0,0,0)).freeze();this.Ov=jk;this.Kv=this.Gv=null;this.Ml=$g;this.tn=fc;this.Ek=$g;this.On=fc;this.ev=this.bv=rb;this.ke=!0;this.Nq=!1;this.fg=new J(G);this.yk=new na(W,A);this.Gn=!0;this.UA=250;this.nn=-1;this.xu=(new cb(16,16,16,16)).freeze();this.Mu=this.Lf=!1; +this.Kn=!0;this.ri=new xf;this.Sc=new xf;this.Nb=new xf;this.Sg=this.fi=null;this.ys=!1;this.Vx=this.Wx=null;kk(this);this.jo=new J(S);this.Wk=new J(V);this.ao=new J(W);this.wb=new J(R);this.iv=!0;this.$v=lk;this.MB=!1;this.bw=hi;this.Rx=this.Tx=this.Ry=null;this.Gu="";this.tq="auto";this.ki=this.Ji=this.zi=this.vv=this.Ai=this.Bi=this.Ci=this.ji=this.pi=this.gi=null;this.Cy=!1;this.tC={};this.Fv=0;this.Jf=[null,null];this.Nx=null;this.Qp=this.Ux=this.Ly=this.AC=this.Ii=!1;this.YB=!0;this.qy=this.Gd= +!1;this.Vd=null;var d=this;this.eC=function(a){if(a.ba===d.ba&&d.Ra){d.Ra=!1;try{var b=a.wc;""===a.hf&&b===Af&&mk(d,a.object,a.propertyName)}finally{d.Ra=!0}}};this.fC=function(a){nk(d,a)};this.YC=!0;this.Pg=-2;this.li=new na(Object,R);this.xk=new na(Object,W);this.Wl=new na(Object,Array);this.ko=new na("string",Array);this.sC=new I(ok);this.ti=!1;this.jk=this.ik=this.mu=this.Se=!0;this.ou=this.nu=!1;this.tu=this.ru=this.rk=this.qk=this.pk=this.ok=this.mk=this.nk=this.lk=this.qu=this.tk=this.kk=this.sk= +!0;this.Tl=this.VB=!1;this.su=this.pu=this.$u=this.Zu=!0;this.Qv=this.Mv=16;this.Iy=this.Lv=!1;this.cs=this.Pv=null;this.Jy=this.Ky=0;this.Ue=(new cb(5)).freeze();this.Sv=(new J(R)).freeze();this.rv=999999999;this.av=(new J(R)).freeze();this.Fk=this.Rl=this.sj=!0;this.Ck=this.rj=!1;this.Ud=null;this.vu=!0;this.Rg=!1;this.EF=new J(W);this.KB=new J(pk);this.td=null;this.kC=1;this.jy=!1;this.DC=0;this.XC=(new A(NaN,NaN,NaN,NaN)).freeze();this.Nu=(new A(NaN,NaN,NaN,NaN)).freeze();this.Cv=new J(qk);rk(this); +this.nv=this.Wu=this.wv=this.qB=this.pB=this.rB=this.yj=this.Ak=this.Di=null;sk(this);this.hd=null;this.Vu=!1;this.wn=null;this.Za=new Hg;this.Za.initializeStandardTools();this.Wa=this.$s=this.Za;this.nb=new Yf;this.ba=new Q;this.Ii=!0;this.Pb=new Zf;this.Ii=!1;this.CB=this.Yx=null;this.rd=1;this.Nj=null;this.Dk=new tk;void 0!==a&&uk(this,a);this.Jk=1;this.Yl=0;this.$B=new z;this.UC=500;this.wu=new z;this.qs=null;this.Pc=this.Gk=!1}v.ea("Diagram",E); +function sk(a){a.Di=new na("string",R);var b=new S,c=new bh;c.bind(new Ag("text","",Ef));b.add(c);a.rB=b;a.Di.add("",b);b=new S;c=new bh;c.stroke="brown";c.bind(new Ag("text","",Ef));b.add(c);a.Di.add("Comment",b);b=new S;b.Al=!1;b.mD=!1;c=new Y;c.Ab="Ellipse";c.fill="black";c.stroke=null;c.za=(new ia(3,3)).Ea();b.add(c);a.Di.add("LinkLabel",b);a.Ak=new na("string",V);b=new V;b.kA="GROUPPANEL";b.type=vk;c=new bh;c.font="bold 12pt sans-serif";c.bind(new Ag("text","",Ef));b.add(c);c=new D(wk);c.name= +"GROUPPANEL";var d=new Y;d.Ab="Rectangle";d.fill="rgba(128,128,128,0.2)";d.stroke="black";c.add(d);d=new Si;d.padding=(new cb(5,5,5,5)).Ea();c.add(d);b.add(c);a.pB=b;a.Ak.add("",b);a.yj=new na("string",W);b=new W;c=new Y;c.Rf=!0;b.add(c);c=new Y;c.Kp="Standard";c.fill="black";c.stroke=null;c.lb=0;b.add(c);a.qB=b;a.yj.add("",b);b=new W;c=new Y;c.Rf=!0;c.stroke="brown";b.add(c);a.yj.add("Comment",b);b=new Vg;b.type=wk;c=new Y;c.fill=null;c.stroke="dodgerblue";c.lb=3;b.add(c);c=new Si;c.margin=(new cb(1.5, +1.5,1.5,1.5)).Ea();b.add(c);a.wv=b;a.Wu=b;b=new Vg;b.type=Di;c=new Y;c.Rf=!0;c.fill=null;c.stroke="dodgerblue";c.lb=3;b.add(c);a.nv=b} +function hk(a){var b=v.createElement("p");b.style.width="100%";b.style.height="200px";b.style.boxSizing="content-box";var c=v.createElement("div");c.style.position="absolute";c.style.visibility="hidden";c.style.width="200px";c.style.height="150px";c.style.overflow="hidden";c.style.boxSizing="content-box";c.appendChild(b);window.document.body.appendChild(c);var d=b.offsetWidth;c.style.overflow="scroll";b=b.offsetWidth;d===b&&(b=c.clientWidth);window.document.body.removeChild(c);c=d-b;0!==c||v.gE|| +(c=11);a.vd=c;c=v.createElement("div");c.dir="rtl";c.style.cssText="font-size: 14px; width: 1px; height: 1px; position: absolute; top: -1000px; overflow: scroll;";c.textContent="A";window.document.body.appendChild(c);d="reverse";0<c.scrollLeft?d="default":(c.scrollLeft=1,0===c.scrollLeft&&(d="negative"));window.document.body.removeChild(c);a.Hy=d} +E.prototype.toString=function(a){void 0===a&&(a=0);var b="";this.id&&(b=this.id);this.jl&&this.jl.id&&(b=this.jl.id);b='Diagram "'+b+'"';if(0>=a)return b;for(var c=this.Yb.i;c.next();)b+="\n "+c.value.toString(a-1);return b};E.fromDiv=function(a){var b=a;"string"===typeof a&&(b=window.document.getElementById(a));return b instanceof HTMLDivElement&&b.W instanceof E?b.W:null}; +v.defineProperty(E,{jl:"div"},function(){return this.Kb},function(a){null!==a&&v.A(a,HTMLDivElement,E,"div");if(this.Kb!==a){ik=[];var b=this.Kb;null!==b?(b.W=void 0,b.innerHTML="",null!==this.zb&&(this.zb.removeEventListener("touchstart",this.kF,!1),this.zb.removeEventListener("touchmove",this.jF,!1),this.zb.removeEventListener("touchend",this.iF,!1),this.zb.xd.W=null),b=this.Za,null!==b&&(b.Pe.each(function(a){a.cancelWaitAfter()}),b.Vf.each(function(a){a.cancelWaitAfter()}),b.Wf.each(function(a){a.cancelWaitAfter()})), +b.cancelWaitAfter(),this.Wa.doCancel(),this.lf=this.zb=null,window.removeEventListener("resize",this.uF,!1),window.removeEventListener("mousemove",this.op,!0),window.removeEventListener("mousedown",this.np,!0),window.removeEventListener("mouseup",this.qp,!0),window.removeEventListener("mousewheel",this.lh,!0),window.removeEventListener("DOMMouseScroll",this.lh,!0),window.removeEventListener("mouseout",this.pp,!0)):this.Rg=!1;this.Kb=null;if(null!==a){if(b=a.W)b.jl=null;uk(this,a);this.ax()}}}); +function xk(a){var b=a.zb;b.addEventListener("touchstart",a.kF,!1);b.addEventListener("touchmove",a.jF,!1);b.addEventListener("touchend",a.iF,!1);b.addEventListener("mousemove",a.op,!1);b.addEventListener("mousedown",a.np,!1);b.addEventListener("mouseup",a.qp,!1);b.addEventListener("mousewheel",a.lh,!1);b.addEventListener("DOMMouseScroll",a.lh,!1);b.addEventListener("mouseout",a.pp,!1);b.addEventListener("keydown",a.yH,!1);b.addEventListener("keyup",a.zH,!1);b.addEventListener("selectstart",function(a){a.preventDefault(); +return!1},!1);b.addEventListener("contextmenu",function(a){a.preventDefault();return!1},!1);b.addEventListener("gesturechange",function(b){a.Za.Xo===Fj&&b.preventDefault()},!1);b.addEventListener("pointerdown",a.$H,!1);b.addEventListener("pointermove",a.bI,!1);b.addEventListener("pointerleave",a.aI,!1);window.addEventListener("resize",a.uF,!1)}E.prototype.computePixelRatio=function(){return null!==this.Nj?this.Nj:this.IF};E.prototype.doMouseMove=function(){this.Wa.doMouseMove()}; +E.prototype.doMouseDown=function(){this.Wa.doMouseDown()};E.prototype.doMouseUp=function(){this.Wa.doMouseUp()};E.prototype.doMouseWheel=function(){this.Wa.doMouseWheel()};E.prototype.doKeyDown=function(){this.Wa.doKeyDown()};E.prototype.doKeyUp=function(){this.Wa.doKeyUp()};E.prototype.doFocus=function(){this.focus()};E.prototype.focus=E.prototype.focus=function(){this.zb&&this.zb.focus()}; +function Mj(a){if(null!==a.zb){var b=a.Kb;if(0!==b.clientWidth&&0!==b.clientHeight){var c=a.Ck?a.vd:0,d=a.rj?a.vd:0,e=a.rd;a.rd=a.computePixelRatio();a.rd!==e&&(a.Nq=!0,a.ue());if(b.clientWidth!==a.Eb+c||b.clientHeight!==a.Jb+d)a.Rl=!0,a.ke=!0,b=a.Pb,null!==b&&b.Mw&&a.cl===$g&&b.H(),a.Gd||a.ue()}}} +function rk(a){var b=new Wf;b.name="Background";a.Ns(b);b=new Wf;b.name="";a.Ns(b);b=new Wf;b.name="Foreground";a.Ns(b);b=new Wf;b.name="Adornment";b.Gc=!0;a.Ns(b);b=new Wf;b.name="Tool";b.Gc=!0;b.aE=!0;a.Ns(b);b=new Wf;b.name="Grid";b.of=!1;b.Hg=!1;b.Gc=!0;a.bG(b,a.et("Background"))} +function yk(a){a.hd=new D(zk);a.hd.name="GRID";var b=new Y;b.Ab="LineH";b.stroke="lightgray";b.lb=.5;b.interval=1;a.hd.add(b);b=new Y;b.Ab="LineH";b.stroke="gray";b.lb=.5;b.interval=5;a.hd.add(b);b=new Y;b.Ab="LineH";b.stroke="gray";b.lb=1;b.interval=10;a.hd.add(b);b=new Y;b.Ab="LineV";b.stroke="lightgray";b.lb=.5;b.interval=1;a.hd.add(b);b=new Y;b.Ab="LineV";b.stroke="gray";b.lb=.5;b.interval=5;a.hd.add(b);b=new Y;b.Ab="LineV";b.stroke="gray";b.lb=1;b.interval=10;a.hd.add(b);b=new R;b.add(a.hd); +b.Tf="Grid";b.hn=0;b.Fz=!1;b.$D=!1;b.Hg=!1;b.Kz="GRID";a.add(b);a.wb.remove(b);a.hd.visible=!1}E.prototype.KF=function(){this.W.isEnabled?this.W.IG(this):Ak(this.W)};E.prototype.jC=function(a){this.W.isEnabled?(this.W.Iy=!0,this.W.Ky=a.target.scrollTop,this.W.Jy=a.target.scrollLeft):Ak(this.W)}; +E.prototype.diagramScroll=E.prototype.IG=function(a){if(this.Iy&&null!==this.zb){this.Lv=!0;var b=this.Zd,c=this.rb,d=b.width,e=c.width,f=b.height,h=c.height,k=b.right,l=c.right,m=b.bottom,n=c.bottom,p=b.x,q=c.x,b=b.y,c=c.y,r=this.scale,s;s=a.scrollLeft;if(this.Tq)switch(this.Hy){case "negative":s=s+a.scrollWidth-a.clientWidth;break;case "reverse":s=a.scrollWidth-s-a.clientWidth}var t=s;e<d||h<f?(s=v.Mb(this.position.x,this.position.y),this.oe&&this.Jy!==t&&(s.x=t/r+p,this.Jy=t),this.pe&&this.Ky!== +a.scrollTop&&(s.y=a.scrollTop/r+b,this.Ky=a.scrollTop),this.position=s,v.v(s),this.Rl=this.Lv=!1):(s=v.L(),a.OF&&this.oe&&(p<q&&(this.position=s.m(t+p,this.position.y)),k>l&&(this.position=s.m(-(this.Pv.scrollWidth-this.Eb)+t-this.Eb/r+k,this.position.y))),a.PF&&this.pe&&(b<c&&(this.position=s.m(this.position.x,a.scrollTop+b)),m>n&&(this.position=s.m(this.position.x,-(this.Pv.scrollHeight-this.Jb)+a.scrollTop-this.Jb/r+m))),v.v(s),Bk(this),this.Rl=this.Lv=!1,b=this.Zd,c=this.rb,k=b.right,l=c.right, +m=b.bottom,n=c.bottom,p=b.x,q=c.x,b=b.y,c=c.y,e>=d&&p>=q&&k<=l&&(this.cs.style.width="1px"),h>=f&&b>=c&&m<=n&&(this.cs.style.height="1px"))}};E.prototype.computeBounds=E.prototype.ah=function(){0<this.fg.count&&Ck(this);return Dk(this)}; +function Dk(a){if(a.ND.G()){var b=a.ND.copy();b.fw(a.padding);return b}for(var c=!0,d=a.Yb.n,e=d.length,f=0;f<e;f++){var h=d[f];if(h.visible&&(!h.Gc||h.aE))for(var h=h.wb.n,k=h.length,l=0;l<k;l++){var m=h[l];m.Fz&&m.isVisible()&&(m=m.U,m.G()&&(c?(c=!1,b=m.copy()):b.bi(m)))}}c&&(b=new A(0,0,0,0));b.fw(a.padding);return b} +E.prototype.computePartsBounds=function(a){var b=null;for(a=a.i;a.next();){var c=a.value;c instanceof W||(c.sf(),null===b?b=c.U.copy():b.bi(c.U))}return null===b?new A(NaN,NaN,0,0):b}; +function Ek(a,b){if((b||a.Rg)&&!a.Pc&&null!==a.zb&&!a.Na.df&&a.Zd.G()){a.Pc=!0;var c=a.Ml;b&&a.Ek!==$g&&(c=a.Ek);var d=c!==$g?Fk(a,c):a.scale,c=a.rb.copy(),e=a.Eb/d,f=a.Jb/d,h=null,k=a.Na;k.pc&&(h=a.kb.copy());a.position.Oa();var l=a.tn;b&&!l.bd()&&a.On.bd()&&(l=a.On);Gk(a,a.kb,a.Zd,e,f,l,b);a.position.freeze();null!==h&&Yj(k,h,a.kb);a.scale=d;a.Pc=!1;d=a.rb;d.Fc(c)||a.Lt(c,d)}} +function Fk(a,b){var c=a.nb.uw;if(null===a.zb)return c;a.sj&&Hk(a,a.ah());var d=a.Zd;if(!d.G())return c;var e=d.width,d=d.height,f=a.Eb,h=a.Jb,k=f/e,l=h/d;return b===Ik?(e=Math.min(l,k),e>c&&(e=c),e<a.jh&&(e=a.jh),e>a.ih&&(e=a.ih),e):b===Jk?(e=l>k?(h-a.vd)/d:(f-a.vd)/e,e>c&&(e=c),e<a.jh&&(e=a.jh),e>a.ih&&(e=a.ih),e):a.scale}E.prototype.zoomToFit=E.prototype.zoomToFit=function(){this.scale=Fk(this,Ik)}; +E.prototype.zoomToRect=function(a,b){void 0===b&&(b=Ik);var c=a.width,d=a.height;if(!(0===c||0===d||isNaN(c)&&isNaN(d))){var e=1;if(b===Ik||b===Jk)if(isNaN(c))e=this.rb.height*this.scale/d;else if(isNaN(d))e=this.rb.width*this.scale/c;else var e=this.Eb,f=this.Jb,e=b===Jk?f/d>e/c?(f-(this.rj?this.vd:0))/d:(e-(this.Ck?this.vd:0))/c:Math.min(f/d,e/c);this.scale=e;this.position=new z(a.x,a.y)}};v.defineProperty(E,{Dz:null},function(){return this.Pc},function(a){this.Pc=a}); +E.prototype.alignDocument=function(a,b){this.sj&&Hk(this,this.ah());var c=this.Zd,d=this.rb;this.position=new z(c.x+(a.x*c.width+a.offsetX)-(b.x*d.width-b.offsetX),c.y+(a.y*c.height+a.offsetY)-(b.y*d.height-b.offsetY))}; +function Gk(a,b,c,d,e,f,h){var k=b.x,l=b.y;if(h||a.iA===jk)f.bd()&&(d>c.width&&(k=c.x+(f.x*c.width+f.offsetX)-(f.x*d-f.offsetX)),e>c.height&&(l=c.y+(f.y*c.height+f.offsetY)-(f.y*e-f.offsetY))),f=a.QE,h=d-c.width,d<c.width+f.left+f.right?(k=Math.min(k+d/2,c.right+Math.max(h,f.right)-d/2),k=Math.max(k,c.left-Math.max(h,f.left)+d/2),k-=d/2):k>c.left?k=c.left:k<c.right-d&&(k=c.right-d),d=e-c.height,e<c.height+f.top+f.bottom?(l=Math.min(l+e/2,c.bottom+Math.max(d,f.bottom)-e/2),l=Math.max(l,c.top-Math.max(d, +f.top)+e/2),l-=e/2):l>c.top?l=c.top:l<c.bottom-e&&(l=c.bottom-e);b.x=isFinite(k)?k:-a.padding.left;b.y=isFinite(l)?l:-a.padding.top;null!==a.BE&&(a=a.BE(a,b),b.x=a.x,b.y=a.y)}E.prototype.findPartAt=E.prototype.ht=function(a,b){var c=b?Xh(this,a,function(a){return a.Y},function(a){return a.canSelect()}):Xh(this,a,function(a){return a.Y});return c instanceof R?c:null}; +E.prototype.findObjectAt=E.prototype.re=function(a,b,c){void 0===b&&(b=null);void 0===c&&(c=null);Ck(this);for(var d=this.Yb.Rm;d.next();){var e=d.value;if(e.visible&&(e=e.re(a,b,c),null!==e))return e}return null};function Xh(a,b,c,d){void 0===c&&(c=null);void 0===d&&(d=null);Ck(a);for(a=a.Yb.Rm;a.next();){var e=a.value;if(e.visible&&!e.Gc&&(e=e.re(b,c,d),null!==e))return e}return null} +E.prototype.findObjectsAt=E.prototype.gt=function(a,b,c,d){void 0===b&&(b=null);void 0===c&&(c=null);d instanceof I||d instanceof J||(d=new J(G));Ck(this);for(var e=this.Yb.Rm;e.next();){var f=e.value;f.visible&&f.gt(a,b,c,d)}return d};E.prototype.findObjectsIn=E.prototype.Zj=function(a,b,c,d,e){void 0===b&&(b=null);void 0===c&&(c=null);void 0===d&&(d=!1);e instanceof I||e instanceof J||(e=new J(G));Ck(this);for(var f=this.Yb.Rm;f.next();){var h=f.value;h.visible&&h.Zj(a,b,c,d,e)}return e}; +E.prototype.rz=function(a,b,c,d,e,f){var h=new J(G);Ck(this);for(var k=this.Yb.Rm;k.next();){var l=k.value;l.visible&&l.rz(a,b,c,d,h,e,f)}return h};E.prototype.findObjectsNear=E.prototype.Km=function(a,b,c,d,e,f){void 0===c&&(c=null);void 0===d&&(d=null);void 0===e&&(e=!0);if(!1!==e&&!0!==e){if(e instanceof I||e instanceof J)f=e;e=!0}f instanceof I||f instanceof J||(f=new J(G));Ck(this);for(var h=this.Yb.Rm;h.next();){var k=h.value;k.visible&&k.Km(a,b,c,d,e,f)}return f}; +E.prototype.acceptEvent=function(a){var b=this.Sc;this.Sc=this.Nb;this.Nb=b;Kk(this,this,a,b,a instanceof MouseEvent);return b}; +function Kk(a,b,c,d,e){d.g=b;d.event=c;e?Lk(a,c,d):(d.jf=b.Nb.jf,d.ca=b.Nb.ca);a=0;c.ctrlKey&&(a+=1);c.altKey&&(a+=2);c.shiftKey&&(a+=4);c.metaKey&&(a+=8);d.od=a;d.button=c.button;c.buttons&&(d.buttons=c.buttons);v.bk&&0===c.button&&c.ctrlKey&&(d.button=2);d.kl=!1;d.up=!1;d.Ge=1;d.il=0;d.zc=!1;d.bubbles=!1;d.timestamp=Date.now();d.wt=!1;d.Jg=c.target.W?c.target.W:null;d.ye=null} +function Mk(a,b,c,d,e){d.g=a;Lk(a,c,d);d.od=0;d.button=0;d.buttons=1;d.kl=!0;d.up=!1;d.Ge=1;d.il=0;d.zc=!1;d.bubbles=!0;d.event=b;d.timestamp=Date.now();d.wt=e;d.Jg=b.target.W?b.target.W:null;d.ye=null;a.ri=d.copy();jh=null} +function Nk(a,b,c,d,e){var f=null;d.g=a;null!==c?((f=window.document.elementFromPoint(c.clientX,c.clientY))&&f.W?f=f.W:(c=b.changedTouches[0],f=a),d.Jg=f,Lk(a,c,d)):null!==a.Sc?(d.ca=a.Sc.ca,d.jf=a.Sc.jf,d.Jg=a.Sc.Jg):null!==a.ri&&(d.ca=a.ri.ca,d.jf=a.ri.jf,d.Jg=a.ri.Jg);d.od=0;d.button=0;d.buttons=1;d.kl=!1;d.up=!1;d.Ge=1;d.il=0;d.zc=!1;d.bubbles=!1;d.event=b;d.timestamp=Date.now();d.wt=e;d.ye=null} +function Ok(a,b){if(a.bubbles)return!0;void 0!==b.stopPropagation&&b.stopPropagation();(void 0===b.touches||2>b.touches.length)&&b.preventDefault();b.cancelBubble=!0;return!1} +E.prototype.yH=function(a){if(!this.W.isEnabled)return!1;var b=this.W.Nb;Kk(this.W,this.W,a,b,!1);b.key=String.fromCharCode(a.which);b.kl=!0;switch(a.which){case 8:b.key="Backspace";break;case 33:b.key="PageUp";break;case 34:b.key="PageDown";break;case 35:b.key="End";break;case 36:b.key="Home";break;case 37:b.key="Left";break;case 38:b.key="Up";break;case 39:b.key="Right";break;case 40:b.key="Down";break;case 45:b.key="Insert";break;case 46:b.key="Del";break;case 48:b.key="0";break;case 187:case 61:case 107:b.key= +"Add";break;case 189:case 173:case 109:b.key="Subtract";break;case 27:b.key="Esc"}this.W.doKeyDown();return 187!==a.which&&189!==a.which&&48!==a.which&&107!==a.which&&109!==a.which&&61!==a.which&&173!==a.which||!0!==a.ctrlKey?Ok(b,a):(a.cancelBubble=!0,a.preventDefault(),a.stopPropagation(),!1)}; +E.prototype.zH=function(a){if(!this.W.isEnabled)return!1;var b=this.W.Nb;Kk(this.W,this.W,a,b,!1);b.key=String.fromCharCode(a.which);b.up=!0;switch(a.which){case 8:b.key="Backspace";break;case 33:b.key="PageUp";break;case 34:b.key="PageDown";break;case 35:b.key="End";break;case 36:b.key="Home";break;case 37:b.key="Left";break;case 38:b.key="Up";break;case 39:b.key="Right";break;case 40:b.key="Down";break;case 45:b.key="Insert";break;case 46:b.key="Del";break;case 93:a.preventDefault()}this.W.doKeyUp(); +return Ok(b,a)};E.prototype.Iq=function(a){var b=this.zb;if(null===b)return new z(0,0);var c=this.Eb,d=this.Jb,b=b.getBoundingClientRect(),c=a.clientX-c/b.width*b.left;a=a.clientY-d/b.height*b.top;return null!==this.ne?(a=new z(c,a),Qa(a,this.ne),a):new z(c,a)};function Lk(a,b,c){var d=a.zb,e=a.Eb,f=a.Jb,h=0,k=0;null!==d&&(d=d.getBoundingClientRect(),h=b.clientX-e/d.width*d.left,k=b.clientY-f/d.height*d.top);c.jf.m(h,k);null!==a.ne?(b=v.Mb(h,k),a.ne.Xh(b),c.ca.assign(b),v.v(b)):c.ca.m(h,k)} +E.prototype.invalidateDocumentBounds=E.prototype.qc=function(){this.sj||(this.sj=!0,this.ue(!0))};function Vj(a){a.Gd||Ck(a);a.sj&&Hk(a,a.ah())}E.prototype.redraw=E.prototype.ax=function(){this.Pc||this.Gd||(this.pa(),Pk(this),Bk(this),this.qc(),this.Uf())};E.prototype.isUpdateRequested=function(){return this.Lf};E.prototype.delayInitialization=function(a){void 0===a&&(a=null);var b=this.Na,c=b.isEnabled;b.$h();b.isEnabled=!1;di(this);this.Rg=!1;b.isEnabled=c;null!==a&&v.setTimeout(a,1)}; +E.prototype.requestUpdate=E.prototype.ue=function(a){void 0===a&&(a=!1);if(!0!==this.Lf&&!(this.Pc||!1===a&&this.Gd)){this.Lf=!0;var b=this;requestAnimationFrame(function(){b.Lf&&b.Uf()})}};E.prototype.maybeUpdate=E.prototype.Uf=function(){if(!this.Kn||this.Lf)this.Kn&&(this.Kn=!1),di(this)};function Qk(a,b){a.Na.df||a.Pc||!a.Rl||Ak(a)||(b&&Ck(a),Ek(a,!1))} +function di(a){if(!a.Gd&&(a.Lf=!1,null!==a.Kb)){a.Gd=!0;var b=a.Na,c=a.sC;if(!b.Un&&0!==c.length){for(var d=c.n,e=d.length,f=0;f<e;f++){var h=d[f];Sk(h,!1);h.N()}c.clear()}c=a.KB;0<c.count&&(c.each(function(a){a.AA()}),c.clear());d=c=!1;b.df&&(d=!0,c=a.tb,a.tb=!0);b.pc||Mj(a);Qk(a,!1);null!==a.hd&&(a.hd.visible&&!a.Vu&&($k(a),a.Vu=!0),!a.hd.visible&&a.Vu&&(a.Vu=!1));Ck(a);e=!1;if(!a.Rg||a.vu)a.Rg?al(a,!a.Mu):(a.Qb("Initial Layout"),!1===b.isEnabled&&b.$h(),al(a,!1)),e=!0;a.Mu=!1;Ck(a);a.Ly||b.df|| +Vj(a);Qk(a,!0);e&&(a.Rg||bl(a),a.Ba("LayoutCompleted"));Ck(a);e&&!a.Rg&&(a.Rg=!0,a.wd("Initial Layout"),a.tb||a.la.clear(),v.setTimeout(function(){a.Zh=!1},1));cl(a);Lj(b);a.Xe();d&&(a.tb=c);a.Gd=!1}}v.u(E,{Qm:null},function(){return this.Rg}); +function bl(a){var b=a.Yb.n;a.yf(b,b.length,a);a.Ek!==$g?a.scale=Fk(a,a.Ek):a.Ml!==$g?a.scale=Fk(a,a.Ml):(b=a.kH,isFinite(b)&&0<b&&(a.scale=b));b=a.jH;if(b.G())a.position=b;else{b=v.L();b.Yt(a.Zd,a.iH);var c=a.rb,c=v.hk(0,0,c.width,c.height),d=v.L();d.Yt(c,a.lH);d.m(b.x-d.x,b.y-d.y);a.position=d;v.Vb(c);v.v(d);v.v(b);Pk(a);Qk(a,!0);Ek(a,!0)}a.Ba("InitialLayoutCompleted");$k(a)} +function Ck(a){if((a.Gd||!a.Na.df)&&0!==a.fg.count)for(var b=0;23>b;b++){var c=a.fg.i;if(null===c||0===a.fg.count)break;a.fg=new J(G);a.AA(c,a.fg)}} +E.prototype.AA=function(a,b){for(a.reset();a.next();){var c=a.value;!c.Od()||c instanceof V||!c.isVisible()||(c.vl()?(lj(c,Infinity,Infinity),c.Ec()):b.add(c))}for(a.reset();a.next();)c=a.value,c instanceof V&&c.isVisible()&&el(this,c);for(a.reset();a.next();)c=a.value,c instanceof W&&c.isVisible()&&(c.vl()?(lj(c,Infinity,Infinity),c.Ec()):b.add(c));for(a.reset();a.next();)c=a.value,c instanceof Vg&&c.isVisible()&&(c.vl()?(lj(c,Infinity,Infinity),c.Ec()):b.add(c))}; +function el(a,b){for(var c=v.jb(),d=v.jb(),e=b.Ic;e.next();){var f=e.value;f.isVisible()&&(f instanceof V?(fl(f)||gl(f)||hl(f))&&el(a,f):f instanceof W?f.T===b||f.Z===b?d.push(f):c.push(f):(lj(f,Infinity,Infinity),f.Ec()))}for(var e=c.length,h=0;h<e;h++)f=c[h],lj(f,Infinity,Infinity),f.Ec();v.sa(c);lj(b,Infinity,Infinity);b.Ec();e=d.length;for(h=0;h<e;h++)f=d[h],lj(f,Infinity,Infinity),f.Ec();v.sa(d)}E.prototype.yf=function(a,b,c,d){var e=this.Na;if(this.Fk||e.df)for(e=0;e<b;e++)a[e].yf(c,d)}; +E.prototype.Xe=function(a,b){void 0===a&&(a=this.lf);void 0===b&&(b=null);null===this.Kb&&v.k("No div specified");var c=this.zb;null===c&&v.k("No canvas specified");var d=this.Na;if(!d.pc&&(il(this),"0"!==this.Kb.style.opacity)){var e=a!==this.lf,f=this.Yb.n,h=f.length,k=this;this.yf(f,h,k);if(e)Zc(a,!0),Bk(this);else if(!this.ke&&null===b&&!d.tj)return;var h=this.kb,l=this.Tb,m=Math.round(h.x*l)/l,n=Math.round(h.y*l)/l,d=this.ne;d.reset();1!==l&&d.scale(l);0===h.x&&0===h.y||d.translate(-m,-n);l= +this.rd;v.Pm?(c.width=c.width,Zc(a,!0),a.scale(l,l)):(a.setTransform(1,0,0,1,0,0),a.scale(l,l),a.clearRect(0,0,this.Eb,this.Jb));a.setTransform(1,0,0,1,0,0);a.scale(l,l);a.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy);c=null!==b?function(c){var d=a,e=b;if(c.visible&&0!==c.Rc){var f=c.wb.n,h=f.length;if(0!==h){1!==c.Rc&&(d.globalAlpha=c.Rc);c=c.Bv;c.length=0;for(var l=k.scale,m=0;m<h;m++){var n=f[m];if(ak(n)&&!e.contains(n)){if(n instanceof W){var y=n;y.jc&&c.push(y);if(!1===y.rg)continue}y=n.U;1<y.width* +l||1<y.height*l?n.Xe(d,k):ck(n,d)}}d.globalAlpha=1}}}:function(b){b.Xe(a,k)};jl(this,a);h=f.length;for(m=0;m<h;m++)a.setTransform(1,0,0,1,0,0),a.scale(l,l),a.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy),c(f[m]);this.Dk?this.Dk.Hl(this)&&this.Zx():this.Iq=function(){return new z(0,0)};e?(Zc(this.lf,!0),Bk(this)):this.ke=this.Fk=!1}}; +function kl(a,b,c,d,e){null===a.Kb&&v.k("No div specified");var f=a.zb;null===f&&v.k("No canvas specified");if(!a.Na.pc){var h=a.lf;if(a.ke){il(a);var k=a.rd;v.Pm?(f.width=f.width,Zc(h,!0)):(h.setTransform(1,0,0,1,0,0),h.clearRect(0,0,a.Eb*k,a.Jb*k));h.pt=!1;h.drawImage(a.Yx.xd,0<d?0:Math.round(-d),0<e?0:Math.round(-e));e=a.kb;var f=a.Tb,l=Math.round(e.x*f)/f,m=Math.round(e.y*f)/f;d=a.ne;d.reset();1!==f&&d.scale(f);0===e.x&&0===e.y||d.translate(-l,-m);h.save();h.beginPath();e=c.length;for(f=0;f<e;f++)l= +c[f],0!==l.width&&0!==l.height&&h.rect(Math.floor(l.x),Math.floor(l.y),Math.ceil(l.width),Math.ceil(l.height));h.clip();h.setTransform(1,0,0,1,0,0);h.scale(k,k);h.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy);c=a.Yb.n;e=c.length;a.yf(c,e,a);jl(a,h);for(f=0;f<e;f++)dk(c[f],h,a,b);h.restore();Zc(h,!0);a.Dk?a.Dk.Hl(a)&&a.Zx():a.Iq=function(){return new z(0,0)};a.Fk=!1;a.ke=!1;a.dA()}}} +function ll(a,b,c,d,e,f,h,k,l,m){null===a.Kb&&v.k("No div specified");null===a.zb&&v.k("No canvas specified");void 0===h&&(h=null);void 0===k&&(k=null);void 0===l&&(l=!1);void 0===m&&(m=!1);il(a);Zc(a.lf,!0);Bk(a);a.qy=!0;var n=new A(f.x,f.y,d.width/e,d.height/e),p=n.copy();p.fw(c);$k(a,p);Ck(a);var p=a.Yb.n,q=p.length;a.yf(p,q,a,n);n=a.rd;b.setTransform(1,0,0,1,0,0);b.scale(n,n);b.clearRect(0,0,d.width,d.height);null!==k&&""!==k&&(b.fillStyle=k,b.fillRect(0,0,d.width,d.height));d=v.rh();d.reset(); +d.translate(c.left,c.top);d.scale(e);0===f.x&&0===f.y||d.translate(-f.x,-f.y);b.setTransform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy);v.$e(d);jl(a,b);if(null!==h){var r=new J(G);c=h.i;for(c.reset();c.next();)e=c.value,!1===m&&"Grid"===e.layer.name||null===e||r.add(e);c=function(c){var d=l;if(c.visible&&0!==c.Rc&&(void 0===d&&(d=!0),d||!c.Gc)){var d=c.wb.n,e=d.length;if(0!==e){1!==c.Rc&&(b.globalAlpha=c.Rc);c=c.Bv;c.length=0;for(var f=a.scale,h=0;h<e;h++){var k=d[h];if(ak(k)&&r.contains(k)){if(k instanceof +W){var m=k;m.jc&&c.push(m);if(!1===m.rg)continue}m=k.U;1<m.width*f||1<m.height*f?k.Xe(b,a):ck(k,b)}}b.globalAlpha=1}}}}else if(!l&&m){var s=a.$o.Y,t=s.layer;c=function(c){c===t?s.Xe(b,a):c.Xe(b,a,l,m)}}else c=function(c){c.Xe(b,a,l,m)};for(e=0;e<q;e++)c(p[e]);a.qy=!1;a.Dk?a.Dk.Hl(a)&&a.Zx():a.Iq=function(){return new z(0,0)};Zc(a.lf,!0);Bk(a);a.yf(p,q,a);$k(a)}E.prototype.getRenderingHint=E.prototype.Ui=function(a){return this.Hj[a]}; +E.prototype.setRenderingHint=E.prototype.yI=function(a,b){this.Hj[a]=b;this.ax()};E.prototype.resetRenderingHints=E.prototype.JE=function(){this.Hj=new ta;this.Hj.drawShadows=!0;this.Hj.textGreeking=!0;this.Hj.viewportOptimizations=v.gE?!1:!0;this.Hj.temporaryPixelRatio=!0;this.Hj.pictureRatioOptimization=!0};function jl(a,b){var c=a.Hj;if(null!==c){if(void 0!==c.imageSmoothingEnabled){var d=!!c.imageSmoothingEnabled;b.pt=d;b.lK=d}c=c.defaultFont;void 0!==c&&null!==c&&(b.font=c)}} +E.prototype.getInputOption=E.prototype.Yo=function(a){return this.Rn[a]};E.prototype.setInputOption=function(a,b){this.Rn[a]=b};E.prototype.resetInputOptions=E.prototype.IE=function(){this.Rn=new ta;this.Rn.extraTouchArea=10;this.Rn.extraTouchThreshold=10;this.Rn.hasGestureZoom=!0};E.prototype.setProperties=function(a){v.Xt(this,a)};function cl(a){if(0===a.la.th&&0!==a.yk.count){for(;0<a.yk.count;){var b=a.yk;a.yk=new na(W,A);for(b=b.i;b.next();){var c=b.key;Hi(c,b.value);c.ce()}}a.pa()}} +E.prototype.pa=function(a){void 0===a&&(a=null);if(null===a)this.ke=!0,this.ue();else{var b=this.rb;null!==a&&a.G()&&b.yg(a)&&(this.ke=!0,this.ue())}for(b=this.Cv.i;b.next();)b.value.pa(a)}; +E.prototype.ZD=function(a,b){if(!0!==this.ke){this.ke=!0;var c=!0===this.Ui("temporaryPixelRatio");if(!0===this.Ui("viewportOptimizations")&&this.iA!==ml&&this.QE.yw(0,0,0,0)&&b.width===a.width&&b.height===a.height){var d=this.scale,e=v.ag(),f=Math.max(a.x,b.x),h=Math.max(a.y,b.y),k=Math.min(a.x+a.width,b.x+b.width),l=Math.min(a.y+a.height,b.y+b.height);e.x=f;e.y=h;e.width=Math.max(0,k-f)*d;e.height=Math.max(0,l-h)*d;if(0<e.width&&0<e.height){if(!this.Gd&&(this.Lf=!1,null!==this.Kb)){this.Gd=!0;cl(this); +this.Zd.G()||Hk(this,this.ah());var m=this.zb;if(null!==m){var n=this.rd,h=this.Eb*n,k=this.Jb*n,f=this.scale*n,d=Math.round(Math.round(b.x*f)-Math.round(a.x*f)),f=Math.round(Math.round(b.y*f)-Math.round(a.y*f)),l=this.Yx,p=this.CB;l.width!==h&&(l.width=h);l.height!==k&&(l.height=k);p.clearRect(0,0,h,k);var l=190*this.rd,q=70*this.rd,r=Math.max(d,0),s=Math.max(f,0),t=Math.floor(h-r),u=Math.floor(k-s);p.pt=!1;p.drawImage(m.xd,r,s,t,u,0,0,t,u);this.Dk.Hl(this)&&p.clearRect(0,0,l,q);var m=v.jb(),p=v.jb(), +u=Math.abs(d),t=Math.abs(f),x=0===r?0:h-u,r=v.Mb(x,0),u=v.Mb(u+x,k);p.push(new A(Math.min(r.x,u.x),Math.min(r.y,u.y),Math.abs(r.x-u.x),Math.abs(r.y-u.y)));var w=this.ne;w.reset();w.scale(n,n);1!==this.Tb&&w.scale(this.Tb);n=this.kb;(0!==n.x||0!==n.y)&&isFinite(n.x)&&isFinite(n.y)&&w.translate(-n.x,-n.y);Qa(r,w);Qa(u,w);m.push(new A(Math.min(r.x,u.x),Math.min(r.y,u.y),Math.abs(r.x-u.x),Math.abs(r.y-u.y)));x=0===s?0:k-t;r.m(0,x);u.m(h,t+x);p.push(new A(Math.min(r.x,u.x),Math.min(r.y,u.y),Math.abs(r.x- +u.x),Math.abs(r.y-u.y)));Qa(r,w);Qa(u,w);m.push(new A(Math.min(r.x,u.x),Math.min(r.y,u.y),Math.abs(r.x-u.x),Math.abs(r.y-u.y)));this.Dk.Hl(this)&&(h=0<d?0:-d,k=0<f?0:-f,r.m(h,k),u.m(l+h,q+k),p.push(new A(Math.min(r.x,u.x),Math.min(r.y,u.y),Math.abs(r.x-u.x),Math.abs(r.y-u.y))),Qa(r,w),Qa(u,w),m.push(new A(Math.min(r.x,u.x),Math.min(r.y,u.y),Math.abs(r.x-u.x),Math.abs(r.y-u.y))));v.v(r);v.v(u);Qk(this,!1);kl(this,m,p,d,f);v.sa(m);v.sa(p);this.Gd=!1}}}else this.Uf();v.Vb(e);c&&(this.Nj=1,this.Uf(), +this.Nj=null,this.dA())}else c?(this.Nj=1,this.Uf(),this.Nj=null,this.dA()):this.Uf()}};function Pk(a){!1===a.Rl&&(a.Rl=!0)}function Bk(a){!1===a.Fk&&(a.Fk=!0)}function il(a){!1!==a.Nq&&(a.Nq=!1,nl(a,a.Eb,a.Jb))}function nl(a,b,c){var d=a.zb,e=a.rd,f=b*e,e=c*e;if(d.width!==f||d.height!==e)d.width=f,d.height=e,d.style.width=b+"px",d.style.height=c+"px",a.ke=!0,Zc(a.lf,!0)}function dh(a){var b=a.Eb,c=a.Jb;a=a.zb.getBoundingClientRect();return v.Mb(b/a.width*a.left,c/a.height*a.top)} +function Ak(a){var b=a.zb;if(null===b)return!0;var c=a.Kb,d=a.Eb,e=a.Jb,f=a.XC.copy();if(!f.G())return!0;var h=!1,k=a.Ck?a.vd:0,l=a.rj?a.vd:0,m=c.clientWidth||d+k,c=c.clientHeight||e+l;if(m!==d+k||c!==e+l)a.Ck=!1,a.rj=!1,l=k=0,a.Eb=m,a.Jb=c,h=a.Nq=!0;a.Rl=!1;var n=a.rb,p=a.Zd,m=p.width,c=p.height,q=n.width,r=n.height,s=p.x,t=n.x,u=p.right,x=n.right+k,w=p.y,y=n.y,p=p.bottom,n=n.bottom+l,B="1px",H="1px",C=a.scale;a.iA===jk&&m<q+k&&c<r+l||(a.zz&&a.oe&&(B=1,s+1<t&&(B=Math.max((t-s)*C+a.Eb,B)),u>x+1&& +(B=Math.max((u-x)*C+a.Eb,B)),q+k+1<m&&(B=Math.max((m-q+k)*C+a.Eb,B)),B+="px"),a.Az&&a.pe&&(H=1,w+1<y&&(H=Math.max((y-w)*C+a.Jb,H)),p>n+1&&(H=Math.max((p-n)*C+a.Jb,H)),r+l+1<c&&(H=Math.max((c-r+l)*C+a.Jb,H)),H+="px"));k="1px"!==B;l="1px"!==H;k&&l||!k&&!l||(l&&(x-=a.vd),k&&(n-=a.vd),a.zz&&a.oe&&(B=1,s+1<t&&(B=Math.max((t-s)*C+a.Eb,B)),u>x+1&&(B=Math.max((u-x)*C+a.Eb,B)),q+1<m&&(B=Math.max((m-q)*C+a.Eb,B)),B+="px"),k="1px"!==B,l=k!==a.rj?a.Jb-a.vd:a.Jb,a.Az&&a.pe&&(H=1,w+1<y&&(H=Math.max((y-w)*C+l,H)), +p>n+1&&(H=Math.max((p-n)*C+l,H)),r+1<c&&(H=Math.max((c-r)*C+l,H)),H+="px"),l="1px"!==H);if(a.Lv&&k===a.rj&&l===a.Ck)return d===a.Eb&&e===a.Jb||a.Uf(),!1;k!==a.rj&&(a.Jb="1px"===B?a.Jb+a.vd:Math.max(a.Jb-a.vd,1),h=!0);a.rj=k;a.cs.style.width=B;l!==a.Ck&&(a.Eb="1px"===H?a.Eb+a.vd:Math.max(a.Eb-a.vd,1),h=!0,a.Tq&&(k=v.L(),l?(b.style.left=a.vd+"px",a.position=k.m(a.kb.x+a.vd/a.scale,a.kb.y)):(b.style.left="0px",a.position=k.m(a.kb.x-a.vd/a.scale,a.kb.y)),v.v(k)));a.Ck=l;a.cs.style.height=H;b=a.Pv;k=b.scrollLeft; +a.zz&&a.oe&&(q+1<m?k=(a.position.x-s)*C:s+1<t?k=b.scrollWidth-b.clientWidth:u>x+1&&(k=a.position.x*C));if(a.Tq)switch(a.Hy){case "negative":k=-(b.scrollWidth-k-b.clientWidth);break;case "reverse":k=b.scrollWidth-k-b.clientWidth}b.scrollLeft=k;a.Az&&a.pe&&(r+1<c?b.scrollTop=(a.position.y-w)*C:w+1<y?b.scrollTop=b.scrollHeight-b.clientHeight:p>n+1&&(b.scrollTop=a.position.y*C));h&&(a.Nq=!0);m=a.Eb;c=a.Jb;b.style.width=m+(a.Ck?a.vd:0)+"px";b.style.height=c+(a.rj?a.vd:0)+"px";a.Iy=!1;return d!==m||e!== +c||a.Na.pc?(n=a.rb,a.Lt(f,n,h),!1):!0} +E.prototype.add=E.prototype.add=function(a){v.A(a,R,E,"add:part");var b=a.g;if(b!==this){null!==b&&v.k("Cannot add part "+a.toString()+" to "+this.toString()+". It is already a part of "+b.toString());this.Qp&&(a.Kk="Tool");var c=a.Tf,b=this.et(c);null===b&&(b=this.et(""));null===b&&v.k('Cannot add a Part when unable find a Layer named "'+c+'" and there is no default Layer');a.layer!==b&&(c=b.cp(99999999,a,a.g===this),0<=c&&this.Lc(Cf,"parts",b,null,a,null,c),b.Gc||this.qc(),a.H(ol),c=a.zt,null!== +c&&c(a,null,b))}}; +E.prototype.cp=function(a){if(a instanceof S){if(this.jo.add(a),a instanceof V){var b=a.Sa;null===b?this.Wk.add(a):b.fo.add(a);b=a.Pb;null!==b&&(b.g=this)}}else a instanceof W?this.ao.add(a):a instanceof Vg||this.wb.add(a);var c=this;pl(a,function(a){ql(c,a)});a.Gb&&a.N();b=a.data;null!==b&&(a instanceof Vg||(a instanceof W?this.xk.add(b,a):this.li.add(b,a)),pl(a,function(a){rl(c,a)}));!0!==gl(a)&&!0!==hl(a)||this.fg.add(a);sl(a,!0,this);tl(a)?(a.U.G()&&this.pa(ek(a,a.U)),this.qc()):a.isVisible()&& +a.U.G()&&this.pa(ek(a,a.U));this.ue()}; +E.prototype.Ne=function(a){a.Vs();if(a instanceof S){if(this.jo.remove(a),a instanceof V){var b=a.Sa;null===b?this.Wk.remove(a):b.fo.remove(a);b=a.Pb;null!==b&&(b.g=null)}}else a instanceof W?this.ao.remove(a):a instanceof Vg||this.wb.remove(a);var c=this;pl(a,function(a){ul(c,a)});b=a.data;null!==b&&(a instanceof Vg||(a instanceof W?this.xk.remove(b):this.li.remove(b)),pl(a,function(a){vl(c,a)}));this.fg.remove(a);tl(a)?(a.U.G()&&this.pa(ek(a,a.U)),this.qc()):a.isVisible()&&a.U.G()&&this.pa(ek(a, +a.U));this.ue()};E.prototype.remove=E.prototype.remove=function(a){v.A(a,R,E,"remove:part");a.hb=!1;a.hh=!1;var b=a.layer;if(null!==b&&b.g===this){a.H(wl);a.Jm();var c=b.Ne(-1,a,!1);0<=c&&this.Lc(Df,"parts",b,a,null,c,null);c=a.zt;null!==c&&c(a,b,null)}};E.prototype.removeParts=E.prototype.fA=function(a,b){if(v.isArray(a))for(var c=v.Va(a),d=0;d<c;d++){var e=v.Qa(a,d);b&&!e.canDelete()||this.remove(e)}else for(e=new J(R),e.Tc(a),c=e.i;c.next();)e=c.value,b&&!e.canDelete()||this.remove(e)}; +E.prototype.copyParts=E.prototype.Oo=function(a,b,c){return this.nb.Oo(a,b,c)};E.prototype.moveParts=E.prototype.moveParts=function(a,b,c){v.A(b,z,E,"moveParts:offset");var d=this.Za;if(null!==d){d=d.$d;null===d&&(d=new Zg,d.Mc(this));var e=new na(R,Object);if(null!==a)a=a.i;else{for(a=this.ek;a.next();)vh(d,e,a.value,c);for(a=this.Bg;a.next();)vh(d,e,a.value,c);a=this.links}for(;a.next();)vh(d,e,a.value,c);d.moveParts(e,b,c)}}; +function xl(a,b,c){v.A(b,Wf,E,"addLayer:layer");null!==b.g&&b.g!==a&&v.k("Cannot share a Layer with another Diagram: "+b+" of "+b.g);null===c?null!==b.g&&v.k("Cannot add an existing Layer to this Diagram again: "+b):(v.A(c,Wf,E,"addLayer:existingLayer"),c.g!==a&&v.k("Existing Layer must be in this Diagram: "+c+" not in "+c.g),b===c&&v.k("Cannot move a Layer before or after itself: "+b));if(b.g!==a){b=b.name;a=a.Yb;c=a.count;for(var d=0;d<c;d++)a.da(d).name===b&&v.k("Cannot add Layer with the name '"+ +b+"'; a Layer with the same name is already present in this Diagram.")}}E.prototype.addLayer=E.prototype.Ns=function(a){xl(this,a,null);a.Mc(this);var b=this.Yb,c=b.count-1;if(!a.Gc)for(;0<=c&&b.da(c).Gc;)c--;b.yd(c+1,a);null!==this.Vd&&this.Lc(Cf,"layers",this,null,a,null,c+1);this.pa();this.qc()}; +E.prototype.addLayerBefore=E.prototype.bG=function(a,b){xl(this,a,b);a.Mc(this);var c=this.Yb,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.Vd&&this.Lc(Df,"layers",this,a,null,d,null));for(var e=c.count,f=0;f<e;f++)if(c.da(f)===b){c.yd(f,a);break}null!==this.Vd&&this.Lc(Cf,"layers",this,null,a,null,f);this.pa();0>d&&this.qc()}; +E.prototype.addLayerAfter=function(a,b){xl(this,a,b);a.Mc(this);var c=this.Yb,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.Vd&&this.Lc(Df,"layers",this,a,null,d,null));for(var e=c.count,f=0;f<e;f++)if(c.da(f)===b){c.yd(f+1,a);break}null!==this.Vd&&this.Lc(Cf,"layers",this,null,a,null,f+1);this.pa();0>d&&this.qc()}; +E.prototype.removeLayer=function(a){v.A(a,Wf,E,"removeLayer:layer");a.g!==this&&v.k("Cannot remove a Layer from another Diagram: "+a+" of "+a.g);if(""!==a.name){var b=this.Yb,c=b.indexOf(a);if(b.remove(a)){for(b=a.wb.copy().i;b.next();){var d=b.value,e=d.Tf;d.Tf=e!==a.name?e:""}null!==this.Vd&&this.Lc(Df,"layers",this,a,null,c,null);this.pa();this.qc()}}};E.prototype.findLayer=E.prototype.et=function(a){for(var b=this.Pw;b.next();){var c=b.value;if(c.name===a)return c}return null}; +E.prototype.addModelChangedListener=E.prototype.dG=function(a){v.j(a,"function",E,"addModelChangedListener:listener");null===this.Sg&&(this.Sg=new I("function"));this.Sg.add(a);this.ba.wm(a)};E.prototype.removeModelChangedListener=function(a){v.j(a,"function",E,"removeModelChangedListener:listener");null!==this.Sg&&(this.Sg.remove(a),0===this.Sg.count&&(this.Sg=null));this.ba.Ot(a)}; +E.prototype.addChangedListener=E.prototype.wm=function(a){v.j(a,"function",E,"addChangedListener:listener");null===this.fi&&(this.fi=new I("function"));this.fi.add(a)};E.prototype.removeChangedListener=E.prototype.Ot=function(a){v.j(a,"function",E,"removeChangedListener:listener");null!==this.fi&&(this.fi.remove(a),0===this.fi.count&&(this.fi=null))}; +E.prototype.nw=function(a){this.tb||this.la.VD(a);a.wc!==Bf&&(this.Zh=!0);if(null!==this.fi){var b=this.fi,c=b.length;if(1===c)b=b.da(0),b(a);else if(0!==c)for(var d=b.cc(),e=0;e<c;e++)b=d[e],b(a)}};E.prototype.raiseChangedEvent=E.prototype.Lc=function(a,b,c,d,e,f,h){void 0===f&&(f=null);void 0===h&&(h=null);var k=new zf;k.g=this;k.wc=a;k.propertyName=b;k.object=c;k.oldValue=d;k.Cg=f;k.newValue=e;k.Ag=h;this.nw(k)}; +E.prototype.raiseChanged=E.prototype.h=function(a,b,c,d,e){this.Lc(Af,a,this,b,c,d,e)};v.u(E,{Na:"animationManager"},function(){return this.PA});v.u(E,{la:"undoManager"},function(){return this.Vd.la});v.defineProperty(E,{tb:"skipsUndoManager"},function(){return this.Ii},function(a){v.j(a,"boolean",E,"skipsUndoManager");this.Ii=a;this.Vd.Ii=a});v.defineProperty(E,{mz:"delaysLayout"},function(){return this.Ux},function(a){this.Ux=a}); +E.prototype.Bm=function(a,b){if(null!==a&&a.g===this){var c=this.we;try{this.we=!0;var d=a.wc,e;if(d===Af){var f=a.object,h=a.propertyName,k=a.ja(b);v.Ka(f,h,k);if(f instanceof G){var l,m=f.Y;null!==m&&m.Nd()}this.Zh=!0}else if(d===Cf){var n=a.object,p=a.Ag,f=a.newValue;if(n instanceof D)if("number"===typeof p&&f instanceof G){l=f;var q=n;b?q.Ne(p):q.yd(p,l);m=n.Y;null!==m&&m.Nd()}else{if("number"===typeof p&&f instanceof ug){var r=f,q=n;b?r.de?q.HE(p):q.DE(p):(e=r.de?q.Md(r.index):q.Ld(r.index), +e.Zs(r))}}else if(n instanceof Wf){var s=!0===a.Cg;if("number"===typeof p&&f instanceof R){var m=f,t=n;b?(m.Nd(),t.Ne(s?p:-1,m,s)):t.cp(p,m,s)}}else if(n instanceof E){if("number"===typeof p&&f instanceof Wf){var u=f;b?this.Yb.Vc(p):(d=u,d.Mc(this),this.Yb.yd(p,d))}}else v.k("unknown ChangedEvent.Insert object: "+a.toString());this.Zh=!0}else d===Df?(n=a.object,p=a.Cg,f=a.oldValue,n instanceof D?"number"===typeof p&&f instanceof G?(q=n,b?q.yd(p,f):q.Ne(p)):"number"===typeof p&&f instanceof ug&&(r= +f,q=n,b?(e=r.de?q.Md(r.index):q.Ld(r.index),e.Zs(r)):r.de?q.HE(p):q.DE(p)):n instanceof Wf?(s=!0===a.Ag,"number"===typeof p&&f instanceof R&&(m=f,t=n,b?t.cp(p,m,s):(m.Nd(),t.Ne(s?p:-1,m,s)))):n instanceof E?"number"===typeof p&&f instanceof Wf&&(u=f,b?(d=u,d.Mc(this),this.Yb.yd(p,d)):this.Yb.Vc(p)):v.k("unknown ChangedEvent.Remove object: "+a.toString()),this.Zh=!0):d!==Bf&&v.k("unknown ChangedEvent: "+a.toString())}finally{this.we=c}}};E.prototype.startTransaction=E.prototype.Qb=function(a){return this.la.Qb(a)}; +E.prototype.commitTransaction=E.prototype.wd=function(a){return this.la.wd(a)};E.prototype.rollbackTransaction=E.prototype.zp=function(){return this.la.zp()};E.prototype.updateAllTargetBindings=E.prototype.rF=function(a){void 0===a&&(a="");for(var b=this.ek;b.next();)b.value.Hb(a);for(b=this.Bg;b.next();)b.value.Hb(a);for(b=this.links;b.next();)b.value.Hb(a)}; +E.prototype.updateAllRelationshipsFromData=E.prototype.RI=function(){if(0<arguments.length){for(var a=this.ba,b=new J,c=a.Yf,d=0;d<c.length;d++){var e=c[d];b.add(e)}var f=[];this.Bg.each(function(a){null===a.data||b.contains(a.data)||f.push(a.data)});this.ek.each(function(a){null===a.data||b.contains(a.data)||f.push(a.data)});f.forEach(function(b){pg(a,b,!1)});for(d=0;d<c.length;d++){var e=c[d],h=this.eh(e);null===h&&og(a,e,!1)}if(a instanceof Q){for(var k=new J,c=a.zg,d=0;d<c.length;d++)e=c[d],k.add(e); +var l=[];this.links.each(function(a){null===a.data||k.contains(a.data)||l.push(a.data)});l.forEach(function(b){zg(a,b,!1)});for(d=0;d<c.length;d++)e=c[d],h=this.Pf(e),null===h&&yg(a,e,!1)}}for(d=this.ek;d.next();)h=d.value,h.updateRelationshipsFromData();for(d=this.Bg;d.next();)d.value.updateRelationshipsFromData();for(d=this.links;d.next();)h=d.value,h.updateRelationshipsFromData()}; +function yl(a,b,c){if(a.Pc||a.Gd)a.Tb=c,c=a.Na,c.pc&&Zj(c,b,a.Tb);else if(a.Pc=!0,null===a.zb)a.Tb=c;else{var d=a.rb.copy(),e=a.Eb,f=a.Jb;d.width=a.Eb/b;d.height=a.Jb/b;var h=a.Il.x,k=a.Il.y,l=a.uD;isNaN(h)&&(l.Wi()?l.ap(Gb)?h=0:l.ap(Nb)&&(h=e-1):h=l.bd()?l.x*(e-1):e/2);isNaN(k)&&(l.Wi()?l.ap(Fb)?k=0:l.ap(Ob)&&(k=f-1):k=l.bd()?l.y*(f-1):f/2);null!==a.PE&&(c=a.PE(a,c));c<a.jh&&(c=a.jh);c>a.ih&&(c=a.ih);e=v.Mb(a.kb.x+h/b-h/c,a.kb.y+k/b-k/c);a.position=e;v.v(e);a.Tb=c;a.Lt(d,a.rb);a.Pc=!1;Ek(a,!1);c= +a.Na;c.pc&&Zj(c,b,a.Tb);a.pa();Pk(a)}}E.prototype.Lt=function(a,b,c){if(!a.K(b)){void 0===c&&(c=!1);c||Pk(this);Bk(this);var d=this.Pb;null===d||!d.Mw||this.cl!==$g||c||a.width===b.width&&a.height===b.height||d.H();d=this.Wa;!0===this.Tl&&d instanceof Hg&&(this.O.ca=this.pF(this.O.jf),Hj(d,this));this.Pc||this.ZD(a,b);$k(this);this.Ba("ViewportBoundsChanged",c?v.hj:null,a)}}; +function $k(a,b){void 0===b&&(b=null);var c=a.hd;if(null!==c&&c.visible){for(var d=v.Fl(),e=1,f=1,h=c.ya.n,k=h.length,l=0;l<k;l++){var m=h[l],n=m.interval;2>n||(zl(m.Ab)?f=f*n/te(f,n):e=e*n/te(e,n))}h=c.Fw;d.m(f*h.width,e*h.height);h=f=l=k=0;if(null!==b)k=b.width,l=b.height,f=b.x,h=b.y;else{e=v.ag();f=a.rb;e.m(f.x,f.y,f.width,f.height);for(h=a.Cv.i;h.next();)f=h.value.rb,f.G()&&$a(e,f.x,f.y,f.width,f.height);if(!e.G()){v.Vb(e);return}k=e.width;l=e.height;f=e.x;h=e.y;v.Vb(e)}c.width=k+2*d.width;c.height= +l+2*d.height;e=v.L();Pa(f,h,0,0,d.width,d.height,e);e.offset(-d.width,-d.height);v.$j(d);c.Y.location=e;v.v(e)}}E.prototype.clearSelection=E.prototype.ow=function(){var a=0<this.selection.count;a&&this.Ba("ChangingSelection");Yg(this);a&&this.Ba("ChangedSelection")};function Yg(a){a=a.selection;if(0<a.count){for(var b=a.cc(),c=b.length,d=0;d<c;d++)b[d].hb=!1;a.Oa();a.clear();a.freeze()}} +E.prototype.select=E.prototype.select=function(a){null!==a&&(v.A(a,R,E,"select:part"),a.layer.g===this&&(!a.hb||1<this.selection.count)&&(this.Ba("ChangingSelection"),Yg(this),a.hb=!0,this.Ba("ChangedSelection")))}; +E.prototype.selectCollection=E.prototype.UE=function(a){this.Ba("ChangingSelection");Yg(this);if(v.isArray(a))for(var b=v.Va(a),c=0;c<b;c++){var d=v.Qa(a,c);d instanceof R||v.k("Diagram.selectCollection given something that is not a Part: "+d);d.hb=!0}else for(a=a.i;a.next();)d=a.value,d instanceof R||v.k("Diagram.selectCollection given something that is not a Part: "+d),d.hb=!0;this.Ba("ChangedSelection")}; +E.prototype.clearHighlighteds=E.prototype.nD=function(){var a=this.Om;if(0<a.count){for(var b=a.cc(),c=b.length,d=0;d<c;d++)b[d].hh=!1;a.Oa();a.clear();a.freeze()}};E.prototype.highlight=function(a){null!==a&&a.layer.g===this&&(v.A(a,R,E,"highlight:part"),!a.hh||1<this.Om.count)&&(this.nD(),a.hh=!0)}; +E.prototype.highlightCollection=function(a){this.nD();if(v.isArray(a))for(var b=v.Va(a),c=0;c<b;c++){var d=v.Qa(a,c);d instanceof R||v.k("Diagram.highlightCollection given something that is not a Part: "+d);d.hh=!0}else for(a=a.i;a.next();)d=a.value,d instanceof R||v.k("Diagram.highlightCollection given something that is not a Part: "+d),d.hh=!0}; +E.prototype.scroll=E.prototype.scroll=function(a,b,c){void 0===c&&(c=1);var d="up"===b||"down"===b,e=0;if("pixel"===a)e=c;else if("line"===a)e=c*(d?this.Ut:this.Tt);else if("page"===a)a=d?this.rb.height:this.rb.width,a*=this.scale,0!==a&&(e=Math.max(a-(d?this.Ut:this.Tt),0),e*=c);else{if("document"===a){e=this.Zd;d=this.rb;c=v.L();"up"===b?this.position=c.m(d.x,e.y):"left"===b?this.position=c.m(e.x,d.y):"down"===b?this.position=c.m(d.x,e.bottom-d.height):"right"===b&&(this.position=c.m(e.right-d.width, +d.y));v.v(c);return}v.k("scrolling unit must be 'pixel', 'line', 'page', or 'document', not: "+a)}e/=this.scale;c=this.position.copy();"up"===b?c.y=this.position.y-e:"down"===b?c.y=this.position.y+e:"left"===b?c.x=this.position.x-e:"right"===b?c.x=this.position.x+e:v.k("scrolling direction must be 'up', 'down', 'left', or 'right', not: "+b);this.position=c};E.prototype.scrollToRect=E.prototype.sI=function(a){var b=this.rb;b.Xj(a)||(a=a.dl,a.x-=b.width/2,a.y-=b.height/2,this.position=a)}; +E.prototype.centerRect=E.prototype.lG=function(a){var b=this.rb;a=a.dl;a.x-=b.width/2;a.y-=b.height/2;this.position=a};E.prototype.transformDocToView=E.prototype.nF=function(a){var b=this.ne;b.reset();1!==this.Tb&&b.scale(this.Tb);var c=this.kb;(0!==c.x||0!==c.y)&&isFinite(c.x)&&isFinite(c.y)&&b.translate(-c.x,-c.y);return a.copy().transform(this.ne)}; +E.prototype.transformViewToDoc=E.prototype.pF=function(a){var b=this.ne;b.reset();1!==this.Tb&&b.scale(this.Tb);var c=this.kb;(0!==c.x||0!==c.y)&&isFinite(c.x)&&isFinite(c.y)&&b.translate(-c.x,-c.y);return Qa(a.copy(),this.ne)};var $g;E.None=$g=v.p(E,"None",0);var Ik;E.Uniform=Ik=v.p(E,"Uniform",1);var Jk;E.UniformToFill=Jk=v.p(E,"UniformToFill",2);var hi;E.CycleAll=hi=v.p(E,"CycleAll",10);var li;E.CycleNotDirected=li=v.p(E,"CycleNotDirected",11);var ni; +E.CycleNotDirectedFast=ni=v.p(E,"CycleNotDirectedFast",12);var xi;E.CycleNotUndirected=xi=v.p(E,"CycleNotUndirected",13);var ii;E.CycleDestinationTree=ii=v.p(E,"CycleDestinationTree",14);var ki;E.CycleSourceTree=ki=v.p(E,"CycleSourceTree",15);var jk;E.DocumentScroll=jk=v.p(E,"DocumentScroll",1);var ml;E.InfiniteScroll=ml=v.p(E,"InfiniteScroll",2);var lk;E.TreeParentCollapsed=lk=v.p(E,"TreeParentCollapsed",1);E.AllParentsCollapsed=v.p(E,"AllParentsCollapsed",2); +v.defineProperty(E,{SI:"validCycle"},function(){return this.bw},function(a){var b=this.bw;b!==a&&(v.pb(a,E,E,"validCycle"),this.bw=a,this.h("validCycle",b,a))});v.u(E,{Pw:"layers"},function(){return this.Yb.i});v.defineProperty(E,{vf:"isModelReadOnly"},function(){var a=this.Vd;return null===a?!1:a.ab},function(a){var b=this.Vd;null!==b&&(b.ab=a)}); +v.defineProperty(E,{ab:"isReadOnly"},function(){return this.ti},function(a){var b=this.ti;b!==a&&(v.j(a,"boolean",E,"isReadOnly"),this.ti=a,this.h("isReadOnly",b,a))});v.defineProperty(E,{isEnabled:"isEnabled"},function(){return this.Se},function(a){var b=this.Se;b!==a&&(v.j(a,"boolean",E,"isEnabled"),this.Se=a,this.h("isEnabled",b,a))}); +v.defineProperty(E,{Zy:"allowClipboard"},function(){return this.mu},function(a){var b=this.mu;b!==a&&(v.j(a,"boolean",E,"allowClipboard"),this.mu=a,this.h("allowClipboard",b,a))});v.defineProperty(E,{Vj:"allowCopy"},function(){return this.ik},function(a){var b=this.ik;b!==a&&(v.j(a,"boolean",E,"allowCopy"),this.ik=a,this.h("allowCopy",b,a))}); +v.defineProperty(E,{xm:"allowDelete"},function(){return this.jk},function(a){var b=this.jk;b!==a&&(v.j(a,"boolean",E,"allowDelete"),this.jk=a,this.h("allowDelete",b,a))});v.defineProperty(E,{Ss:"allowDragOut"},function(){return this.nu},function(a){var b=this.nu;b!==a&&(v.j(a,"boolean",E,"allowDragOut"),this.nu=a,this.h("allowDragOut",b,a))}); +v.defineProperty(E,{fD:"allowDrop"},function(){return this.ou},function(a){var b=this.ou;b!==a&&(v.j(a,"boolean",E,"allowDrop"),this.ou=a,this.h("allowDrop",b,a))});v.defineProperty(E,{kw:"allowTextEdit"},function(){return this.sk},function(a){var b=this.sk;b!==a&&(v.j(a,"boolean",E,"allowTextEdit"),this.sk=a,this.h("allowTextEdit",b,a))}); +v.defineProperty(E,{hw:"allowGroup"},function(){return this.kk},function(a){var b=this.kk;b!==a&&(v.j(a,"boolean",E,"allowGroup"),this.kk=a,this.h("allowGroup",b,a))});v.defineProperty(E,{lw:"allowUngroup"},function(){return this.tk},function(a){var b=this.tk;b!==a&&(v.j(a,"boolean",E,"allowUngroup"),this.tk=a,this.h("allowUngroup",b,a))}); +v.defineProperty(E,{Ho:"allowInsert"},function(){return this.qu},function(a){var b=this.qu;b!==a&&(v.j(a,"boolean",E,"allowInsert"),this.qu=a,this.h("allowInsert",b,a))});v.defineProperty(E,{Ts:"allowLink"},function(){return this.lk},function(a){var b=this.lk;b!==a&&(v.j(a,"boolean",E,"allowLink"),this.lk=a,this.h("allowLink",b,a))}); +v.defineProperty(E,{ym:"allowRelink"},function(){return this.nk},function(a){var b=this.nk;b!==a&&(v.j(a,"boolean",E,"allowRelink"),this.nk=a,this.h("allowRelink",b,a))});v.defineProperty(E,{bl:"allowMove"},function(){return this.mk},function(a){var b=this.mk;b!==a&&(v.j(a,"boolean",E,"allowMove"),this.mk=a,this.h("allowMove",b,a))}); +v.defineProperty(E,{iw:"allowReshape"},function(){return this.ok},function(a){var b=this.ok;b!==a&&(v.j(a,"boolean",E,"allowReshape"),this.ok=a,this.h("allowReshape",b,a))});v.defineProperty(E,{Us:"allowResize"},function(){return this.pk},function(a){var b=this.pk;b!==a&&(v.j(a,"boolean",E,"allowResize"),this.pk=a,this.h("allowResize",b,a))}); +v.defineProperty(E,{jw:"allowRotate"},function(){return this.qk},function(a){var b=this.qk;b!==a&&(v.j(a,"boolean",E,"allowRotate"),this.qk=a,this.h("allowRotate",b,a))});v.defineProperty(E,{of:"allowSelect"},function(){return this.rk},function(a){var b=this.rk;b!==a&&(v.j(a,"boolean",E,"allowSelect"),this.rk=a,this.h("allowSelect",b,a))}); +v.defineProperty(E,{gD:"allowUndo"},function(){return this.ru},function(a){var b=this.ru;b!==a&&(v.j(a,"boolean",E,"allowUndo"),this.ru=a,this.h("allowUndo",b,a))});v.defineProperty(E,{mw:"allowZoom"},function(){return this.tu},function(a){var b=this.tu;b!==a&&(v.j(a,"boolean",E,"allowZoom"),this.tu=a,this.h("allowZoom",b,a))}); +v.defineProperty(E,{Az:"hasVerticalScrollbar"},function(){return this.$u},function(a){var b=this.$u;b!==a&&(v.j(a,"boolean",E,"hasVerticalScrollbar"),this.$u=a,Pk(this),this.pa(),this.h("hasVerticalScrollbar",b,a),Ek(this,!1))});v.defineProperty(E,{zz:"hasHorizontalScrollbar"},function(){return this.Zu},function(a){var b=this.Zu;b!==a&&(v.j(a,"boolean",E,"hasHorizontalScrollbar"),this.Zu=a,Pk(this),this.pa(),this.h("hasHorizontalScrollbar",b,a),Ek(this,!1))}); +v.defineProperty(E,{oe:"allowHorizontalScroll"},function(){return this.pu},function(a){var b=this.pu;b!==a&&(v.j(a,"boolean",E,"allowHorizontalScroll"),this.pu=a,this.h("allowHorizontalScroll",b,a),Ek(this,!1))});v.defineProperty(E,{pe:"allowVerticalScroll"},function(){return this.su},function(a){var b=this.su;b!==a&&(v.j(a,"boolean",E,"allowVerticalScroll"),this.su=a,this.h("allowVerticalScroll",b,a),Ek(this,!1))}); +v.defineProperty(E,{Tt:"scrollHorizontalLineChange"},function(){return this.Mv},function(a){var b=this.Mv;b!==a&&(v.j(a,"number",E,"scrollHorizontalLineChange"),0>a&&v.va(a,">= 0",E,"scrollHorizontalLineChange"),this.Mv=a,this.h("scrollHorizontalLineChange",b,a))}); +v.defineProperty(E,{Ut:"scrollVerticalLineChange"},function(){return this.Qv},function(a){var b=this.Qv;b!==a&&(v.j(a,"number",E,"scrollVerticalLineChange"),0>a&&v.va(a,">= 0",E,"scrollVerticalLineChange"),this.Qv=a,this.h("scrollVerticalLineChange",b,a))});v.defineProperty(E,{O:"lastInput"},function(){return this.Nb},function(a){this.Nb=a});v.defineProperty(E,{yc:"firstInput"},function(){return this.ri},function(a){this.ri=a}); +v.defineProperty(E,{$b:"currentCursor"},function(){return this.Gu},function(a){""===a&&(a=this.tq);this.Gu!==a&&(v.j(a,"string",E,"currentCursor"),null!==this.zb&&(this.Gu=a,this.zb.style.cursor=a,this.Kb.style.cursor=a))});v.defineProperty(E,{CJ:"defaultCursor"},function(){return this.tq},function(a){""===a&&(a="auto");var b=this.tq;b!==a&&(v.j(a,"string",E,"defaultCursor"),this.tq=a,this.h("defaultCursor",b,a))}); +v.defineProperty(E,{click:"click"},function(){return this.gi},function(a){var b=this.gi;b!==a&&(null!==a&&v.j(a,"function",E,"click"),this.gi=a,this.h("click",b,a))});v.defineProperty(E,{at:"doubleClick"},function(){return this.pi},function(a){var b=this.pi;b!==a&&(null!==a&&v.j(a,"function",E,"doubleClick"),this.pi=a,this.h("doubleClick",b,a))}); +v.defineProperty(E,{fz:"contextClick"},function(){return this.ji},function(a){var b=this.ji;b!==a&&(null!==a&&v.j(a,"function",E,"contextClick"),this.ji=a,this.h("contextClick",b,a))});v.defineProperty(E,{Sz:"mouseOver"},function(){return this.Ci},function(a){var b=this.Ci;b!==a&&(null!==a&&v.j(a,"function",E,"mouseOver"),this.Ci=a,this.h("mouseOver",b,a))}); +v.defineProperty(E,{Rz:"mouseHover"},function(){return this.Bi},function(a){var b=this.Bi;b!==a&&(null!==a&&v.j(a,"function",E,"mouseHover"),this.Bi=a,this.h("mouseHover",b,a))});v.defineProperty(E,{Qz:"mouseHold"},function(){return this.Ai},function(a){var b=this.Ai;b!==a&&(null!==a&&v.j(a,"function",E,"mouseHold"),this.Ai=a,this.h("mouseHold",b,a))}); +v.defineProperty(E,{UH:"mouseDragOver"},function(){return this.vv},function(a){var b=this.vv;b!==a&&(null!==a&&v.j(a,"function",E,"mouseDragOver"),this.vv=a,this.h("mouseDragOver",b,a))});v.defineProperty(E,{Pz:"mouseDrop"},function(){return this.zi},function(a){var b=this.zi;b!==a&&(null!==a&&v.j(a,"function",E,"mouseDrop"),this.zi=a,this.h("mouseDrop",b,a))}); +v.defineProperty(E,{xA:"toolTip"},function(){return this.Ji},function(a){var b=this.Ji;b!==a&&(null!==a&&v.A(a,Vg,E,"toolTip"),this.Ji=a,this.h("toolTip",b,a))});v.defineProperty(E,{contextMenu:"contextMenu"},function(){return this.ki},function(a){var b=this.ki;b!==a&&(null!==a&&v.A(a,Vg,E,"contextMenu"),this.ki=a,this.h("contextMenu",b,a))}); +v.defineProperty(E,{nb:"commandHandler"},function(){return this.Nx},function(a){var b=this.Nx;b!==a&&(v.A(a,Yf,E,"commandHandler"),null!==a.g&&v.k("Cannot share CommandHandlers between Diagrams: "+a.toString()),null!==b&&b.Mc(null),this.Nx=a,a.Mc(this))});v.defineProperty(E,{Za:"toolManager"},function(){return this.Ry},function(a){var b=this.Ry;b!==a&&(v.A(a,Hg,E,"toolManager"),null!==a.g&&v.k("Cannot share ToolManagers between Diagrams: "+a.toString()),null!==b&&b.Mc(null),this.Ry=a,a.Mc(this))}); +v.defineProperty(E,{$s:"defaultTool"},function(){return this.Tx},function(a){var b=this.Tx;b!==a&&(v.A(a,Xf,E,"defaultTool"),this.Tx=a,this.Wa===b&&(this.Wa=a))});v.defineProperty(E,{Wa:"currentTool"},function(){return this.Rx},function(a){var b=this.Rx;null!==b&&(b.qa&&b.doDeactivate(),b.cancelWaitAfter(),b.doStop());null===a&&(a=this.$s);null!==a&&(v.A(a,Xf,E,"currentTool"),this.Rx=a,a.Mc(this),a.doStart())});v.u(E,{selection:"selection"},function(){return this.Sv}); +v.defineProperty(E,{MH:"maxSelectionCount"},function(){return this.rv},function(a){var b=this.rv;if(b!==a)if(v.j(a,"number",E,"maxSelectionCount"),0<=a&&!isNaN(a)){if(this.rv=a,this.h("maxSelectionCount",b,a),!this.la.ib&&(a=this.selection.count-a,0<a)){this.Ba("ChangingSelection");for(var b=this.selection.cc(),c=0;c<a;c++)b[c].hb=!1;this.Ba("ChangedSelection")}}else v.va(a,">= 0",E,"maxSelectionCount")}); +v.defineProperty(E,{XH:"nodeSelectionAdornmentTemplate"},function(){return this.wv},function(a){var b=this.wv;b!==a&&(v.A(a,Vg,E,"nodeSelectionAdornmentTemplate"),this.wv=a,this.h("nodeSelectionAdornmentTemplate",b,a))});v.defineProperty(E,{cH:"groupSelectionAdornmentTemplate"},function(){return this.Wu},function(a){var b=this.Wu;b!==a&&(v.A(a,Vg,E,"groupSelectionAdornmentTemplate"),this.Wu=a,this.h("groupSelectionAdornmentTemplate",b,a))}); +v.defineProperty(E,{GH:"linkSelectionAdornmentTemplate"},function(){return this.nv},function(a){var b=this.nv;b!==a&&(v.A(a,Vg,E,"linkSelectionAdornmentTemplate"),this.nv=a,this.h("linkSelectionAdornmentTemplate",b,a))});v.u(E,{Om:"highlighteds"},function(){return this.av}); +v.defineProperty(E,{Zh:"isModified"},function(){var a=this.la;return a.isEnabled?null!==a.Qi?!0:this.ty&&this.Pg!==a.Vi:this.ty},function(a){if(this.ty!==a){v.j(a,"boolean",E,"isModified");this.ty=a;var b=this.la;!a&&b.isEnabled&&(this.Pg=b.Vi);a||Al(this)}});function Al(a){var b=a.Zh;a.YC!==b&&(a.YC=b,a.Ba("Modified"))} +v.defineProperty(E,{ba:"model"},function(){return this.Vd},function(a){var b=this.Vd;if(b!==a){v.A(a,F,E,"model");this.Wa.doCancel();null!==b&&b.la!==a.la&&b.la.hE&&v.k("Do not replace a Diagram.model while a transaction is in progress.");this.Na.$h();this.ow();this.Rg=!1;this.Kn=!0;this.Pg=-2;this.Lf=!1;var c=this.Gd;this.Gd=!0;this.Na.Xm("Model");null!==b&&(null!==this.Sg&&this.Sg.each(function(a){b.Ot(a)}),b.Ot(this.fC),b instanceof Q&&Bl(this,b.zg),Bl(this,b.Yf));this.Vd=a;a.wm(this.eC);Cl(this, +a.Yf);a instanceof Q&&Dl(this,a.zg);a.Ot(this.eC);a.wm(this.fC);null!==this.Sg&&this.Sg.each(function(b){a.wm(b)});this.Gd=c;this.Pc||this.pa();null!==b&&(a.la.isEnabled=b.la.isEnabled)}});v.defineProperty(E,{Ra:null},function(){return this.YB},function(a){this.YB=a});v.u(E,{Rw:null},function(){return this.EF}); +function nk(a,b){if(b.ba===a.ba){var c=b.wc,d=b.propertyName;if(c===Bf&&"S"===d[0])if("StartingFirstTransaction"===d)c=a.Za,c.Pe.each(function(b){b.Mc(a)}),c.Vf.each(function(b){b.Mc(a)}),c.Wf.each(function(b){b.Mc(a)}),a.Gd||a.Rg||(a.Mu=!0,a.Kn&&(a.Lf=!0));else if("StartingUndo"===d||"StartingRedo"===d){var e=a.Na;e.df&&!a.tb&&e.$h();a.Ba("ChangingSelection")}else"StartedTransaction"===d&&(e=a.Na,e.df&&!a.tb&&e.$h());else if(a.Ra){a.Ra=!1;try{var f=b.hf;if(""!==f)if(c===Af){if("linkFromKey"===f){var h= +b.object,k=a.Pf(h);if(null!==k){var l=b.newValue,m=a.Ze(l);k.T=m}}else if("linkToKey"===f)h=b.object,k=a.Pf(h),null!==k&&(l=b.newValue,m=a.Ze(l),k.Z=m);else if("linkFromPortId"===f){if(h=b.object,k=a.Pf(h),null!==k){var n=b.newValue;"string"===typeof n&&(k.xg=n)}}else if("linkToPortId"===f)h=b.object,k=a.Pf(h),null!==k&&(n=b.newValue,"string"===typeof n&&(k.sh=n));else if("nodeGroupKey"===f){var h=b.object,p=a.eh(h);if(null!==p){var q=b.newValue;if(void 0!==q){var r=a.Ze(q);p.Sa=r instanceof V?r: +null}else p.Sa=null}}else if("linkLabelKeys"===f){if(h=b.object,k=a.Pf(h),null!==k){var s=b.oldValue,t=b.newValue;if(v.isArray(s))for(var u=v.Va(s),x=0;x<u;x++){var w=v.Qa(s,x),m=a.Ze(w);null!==m&&(m.fe=null)}if(v.isArray(t))for(u=v.Va(t),x=0;x<u;x++)w=v.Qa(t,x),m=a.Ze(w),null!==m&&(m.fe=k)}}else if("nodeParentKey"===f){var y=b.object,B=a.Ze(b.newValue),H=a.Cw(y);if(null!==H){var C=H.Vo();null!==C?null===B?a.remove(C):a.Pd?C.T=B:C.Z=B:El(a,B,H)}}else if("parentLinkCategory"===f){var y=b.object,H= +a.Cw(y),T=b.newValue;null!==H&&"string"===typeof T&&(C=H.Vo(),null!==C&&(C.fc=T))}else if("nodeCategory"===f){var h=b.object,ba=a.eh(h),T=b.newValue;null!==ba&&"string"===typeof T&&(ba.fc=T)}else if("linkCategory"===f){var h=b.object,U=a.Pf(h),T=b.newValue;null!==U&&"string"===typeof T&&(U.fc=T)}else if("nodeDataArray"===f){var M=b.oldValue;Bl(a,M);var aa=b.newValue;Cl(a,aa)}else"linkDataArray"===f&&(M=b.oldValue,Bl(a,M),aa=b.newValue,Dl(a,aa));a.Zh=!0}else c===Cf?(aa=b.newValue,"nodeDataArray"=== +f&&v.Ta(aa)?Fl(a,aa):"linkDataArray"===f&&v.Ta(aa)?Gl(a,aa):"linkLabelKeys"===f&&ng(aa)&&(k=a.Pf(b.object),m=a.Ze(aa),null!==k&&null!==m&&(m.fe=k)),a.Zh=!0):c===Df?(M=b.oldValue,"nodeDataArray"===f&&v.Ta(M)?Hl(a,M):"linkDataArray"===f&&v.Ta(M)?Hl(a,M):"linkLabelKeys"===f&&ng(M)&&(m=a.Ze(M),null!==m&&(m.fe=null)),a.Zh=!0):c===Bf&&("SourceChanged"===f?null!==b.object?mk(a,b.object,b.propertyName):(a.RI(),a.rF()):"ModelDisplaced"===f&&a.zl());else if(c===Af){var Ia=b.propertyName,h=b.object;if(h===a.ba){if("nodeKeyProperty"=== +Ia||"nodeCategoryProperty"===Ia||"linkFromKeyProperty"===Ia||"linkToKeyProperty"===Ia||"linkFromPortIdProperty"===Ia||"linkToPortIdProperty"===Ia||"linkLabelKeysProperty"===Ia||"nodeIsGroupProperty"===Ia||"nodeGroupKeyProperty"===Ia||"nodeParentKeyProperty"===Ia||"linkCategoryProperty"===Ia)a.la.ib||a.zl()}else mk(a,h,Ia);a.Zh=!0}else if(c===Cf||c===Df)Il(a,b),a.Zh=!0;else if(c===Bf){if("FinishedUndo"===d||"FinishedRedo"===d)a.la.ui=!0,a.Ba("ChangedSelection"),Ck(a),a.la.ui=!1;e=a.Na;"RolledBackTransaction"=== +d&&e.$h();a.Mu=!0;a.Uf();0===a.la.th&&Lj(e);"CommittedTransaction"===d&&a.la.vy&&(a.Pg=Math.min(a.Pg,a.la.Vi-1));var oa=b.lE;oa&&(Al(a),a.Rw.clear());!a.Cy&&oa&&(a.Cy=!0,v.setTimeout(function(){a.Wa.standardMouseOver();a.Cy=!1},10))}}finally{a.Ra=!0}}}} +function mk(a,b,c){if("string"===typeof c){var d=a.eh(b);if(null!==d)d.Hb(c),a.ba instanceof Qf&&(d=a.Pf(b),null!==d&&d.Hb(c));else{for(var d=null,e=a.Wl.i;e.next();){for(var f=e.value,h=0;h<f.length;h++){var k=f[h].OG(b);null!==k&&(null===d&&(d=v.jb()),d.push(k))}if(null!==d)break}if(null!==d){for(e=0;e<d.length;e++)d[e].Hb(c);v.sa(d)}}b===a.ba.ck&&a.rF(c)}}v.defineProperty(E,{we:"skipsModelSourceBindings"},function(){return this.AC},function(a){this.AC=a}); +v.defineProperty(E,{bu:null},function(){return this.Ly},function(a){this.Ly=a});function Il(a,b){var c=b.wc===Cf,d=c?b.Ag:b.Cg,e=c?b.newValue:b.oldValue,f=a.Wl.ja(b.object);if(Array.isArray(f))for(var h=0;h<f.length;h++){var k=f[h];if(c)Jl(k,e,d);else{var l=d;if(!(0>l)){var m=l;Kl(k)&&m++;k.Ne(m);Ll(k,m,l)}}}}function rl(a,b){var c=b.vj;if(v.isArray(c)){var d=a.Wl.ja(c);if(null===d)d=[],d.push(b),a.Wl.add(c,d);else{for(c=0;c<d.length;c++)if(d[c]===b)return;d.push(b)}}} +function vl(a,b){var c=b.vj;if(v.isArray(c)){var d=a.Wl.ja(c);if(null!==d)for(var e=0;e<d.length;e++)if(d[e]===b){d.splice(e,1);0===d.length&&a.Wl.remove(c);break}}}function ql(a,b){for(var c=b.ya.n,d=c.length,e=0;e<d;e++){var f=c[e];f instanceof ok&&Ml(a,f)}}function Ml(a,b){var c=b.element;if(null!==c&&c instanceof HTMLImageElement){var c=c.src,d=a.ko.ja(c);if(null===d)d=[],d.push(b),a.ko.add(c,d);else{for(c=0;c<d.length;c++)if(d[c]===b)return;d.push(b)}}} +function ul(a,b){for(var c=b.ya.n,d=c.length,e=0;e<d;e++){var f=c[e];f instanceof ok&&Nl(a,f)}}function Nl(a,b){var c=b.element;if(null!==c&&c instanceof HTMLImageElement){var c=c.src,d=a.ko.ja(c);if(null!==d)for(var e=0;e<d.length;e++)if(d[e]===b){d.splice(e,1);0===d.length&&a.ko.remove(c);break}}} +E.prototype.clear=E.prototype.clear=function(){var a=null;null!==this.hd&&(a=this.hd.Y);this.ba.clear();for(var b=this.Yb.length,c=0;c<b;c++)this.Yb.n[c].clear();this.fg.clear();this.yk.clear();this.jo.clear();this.Wk.clear();this.ao.clear();this.wb.clear();this.li.clear();this.xk.clear();this.Wl.clear();this.Sv.Oa();this.Sv.clear();this.Sv.freeze();this.av.Oa();this.av.clear();this.av.freeze();Fg=this.wn=null;Gg="";this.Nu=(new A(NaN,NaN,NaN,NaN)).freeze();null!==a&&(this.add(a),this.wb.remove(a)); +this.pa()}; +E.prototype.reset=E.prototype.reset=function(){this.Pc=!0;this.clear();this.Yb=new I(Wf);this.JE();this.IE();this.kb=(new z(NaN,NaN)).freeze();this.Tb=1;this.cv=(new z(NaN,NaN)).freeze();this.dv=NaN;this.sv=1E-4;this.qv=100;this.ew=(new z(NaN,NaN)).freeze();this.Uu=(new A(NaN,NaN,NaN,NaN)).freeze();this.Nv=(new cb(0,0,0,0)).freeze();this.Ov=jk;this.Kv=this.Gv=null;this.Ml=$g;this.tn=fc;this.Ek=$g;this.On=fc;this.ev=this.bv=rb;this.UA=250;this.xu=(new cb(16,16,16,16)).freeze();this.iv=!0;this.$v=lk; +this.bw=hi;this.tq="auto";this.ki=this.Ji=this.zi=this.vv=this.Ai=this.Bi=this.Ci=this.ji=this.pi=this.gi=null;this.ti=!1;this.jk=this.ik=this.mu=this.Se=!0;this.ou=this.nu=!1;this.su=this.pu=this.$u=this.Zu=this.tu=this.ru=this.rk=this.qk=this.pk=this.ok=this.mk=this.nk=this.lk=this.qu=this.tk=this.kk=this.sk=!0;this.Qv=this.Mv=16;this.Ue=(new cb(5)).freeze();this.rv=999999999;this.Ud=null;sk(this);this.hd=null;this.Za=new Hg;this.Za.initializeStandardTools();this.Wa=this.$s=this.Za;this.nb=new Yf; +this.Ii=!0;rk(this);this.Pb=new Zf;this.Ii=!1;this.ba=new Q;this.Rg=!1;this.Kn=!0;this.Pc=this.Lf=!1;this.pa();this.Sg=this.fi=null;kk(this);this.Gu=""}; +E.prototype.rebuildParts=E.prototype.zl=function(){for(var a=this.Wz.i;a.next();){var b=a.value,c=a.key;(!b.Od()||b instanceof V)&&v.k('Invalid node template in Diagram.nodeTemplateMap: template for "'+c+'" must be a Node or a simple Part, not a Group or Link: '+b)}for(a=this.yz.i;a.next();)b=a.value,c=a.key,b instanceof V||v.k('Invalid group template in Diagram.groupTemplateMap: template for "'+c+'" must be a Group, not a normal Node or Link: '+b);for(a=this.Iz.i;a.next();)b=a.value,c=a.key,b instanceof +W||v.k('Invalid link template in Diagram.linkTemplateMap: template for "'+c+'" must be a Link, not a normal Node or simple Part: '+b);a=v.jb();for(b=this.selection.i;b.next();)(c=b.value.data)&&a.push(c);for(var b=v.jb(),d=this.Om.i;d.next();)(c=d.value.data)&&b.push(c);c=v.jb();for(d=this.Bg.i;d.next();){var e=d.value;null!==e.data&&(c.push(e.data),c.push(e.location))}for(d=this.links.i;d.next();)e=d.value,null!==e.data&&(c.push(e.data),c.push(e.location));for(d=this.ek.i;d.next();)e=d.value,null!== +e.data&&(c.push(e.data),c.push(e.location));d=this.ba;d instanceof Q&&Bl(this,d.zg);Bl(this,d.Yf);Cl(this,d.Yf);d instanceof Q&&Dl(this,d.zg);for(d=0;d<a.length;d++)e=this.eh(a[d]),null!==e&&(e.hb=!0);for(d=0;d<b.length;d++)e=this.eh(b[d]),null!==e&&(e.hh=!0);for(d=0;d<c.length;d+=2)e=this.eh(c[d]),null!==e&&(e.location=c[d+1]);v.sa(a);v.sa(b);v.sa(c)}; +function Cl(a,b){if(null!==b){for(var c=a.ba,d=v.Va(b),e=0;e<d;e++){var f=v.Qa(b,e);c.Je(f)?Fl(a,f,!1):c instanceof Q&&Gl(a,f)}if(c instanceof Q||c instanceof Qf){for(e=0;e<d;e++)f=v.Qa(b,e),c.Je(f)&&Ol(a,f);if(c instanceof Q)for(c=a.links;c.next();)Pl(c.value)}Ql(a,!1)}} +function Fl(a,b,c){if(void 0!==b&&null!==b&&!a.la.ib&&!a.li.contains(b)){void 0===c&&(c=!0);var d=a.wz(b),e=Rl(a,b,d);if(null!==e&&(Xg(e),e=e.copy(),null!==e)){var f=a.we;a.we=!0;e.ei=d;e.je=b;a.add(e);e.je=null;e.data=b;c&&Ol(a,b);a.we=f}}}E.prototype.wz=function(a){return this.ba.wz(a)};var Sl=!1,Tl=!1; +function Rl(a,b,c){var d=!1,e=a.ba;e instanceof Q&&(d=e.Ez(b));d?(b=a.yz.ja(c),null===b&&(b=a.yz.ja(""),null===b&&(Tl||(Tl=!0,v.trace('No Group template found for category "'+c+'"'),v.trace(" Using default group template")),b=a.pB))):(b=a.Wz.ja(c),null===b&&(b=a.Wz.ja(""),null===b&&(Sl||(Sl=!0,v.trace('No Node template found for category "'+c+'"'),v.trace(" Using default node template")),b=a.rB)));return b} +function Ol(a,b){var c=a.ba;if(c instanceof Q||c instanceof Qf){var d=c.gb(b);if(void 0!==d){var e=qg(c,d),f=a.eh(b);if(null!==e&&null!==f){for(e=e.i;e.next();){var h=e.value;if(c instanceof Q){var k=c;if(k.Je(h)){if(f instanceof V&&k.Mm(h)===d){var l=f,h=a.eh(h);null!==h&&(h.Sa=l)}}else{var m=a.Pf(h);if(null!==m&&f instanceof S&&(l=f,k.pl(h)===d&&(m.T=l),k.ql(h)===d&&(m.Z=l),h=k.ak(h),v.isArray(h)))for(k=0;k<v.Va(h);k++)if(v.Qa(h,k)===d){l.fe=m;break}}}else c instanceof Qf&&(m=c,m.Je(h)&&f instanceof +S&&(l=f,m.Nm(h)===d&&(h=a.Cw(h),El(a,l,h))))}sg(c,d)}c instanceof Q?(c=c.Mm(b),void 0!==c&&(c=a.Ze(c),c instanceof V&&(f.Sa=c))):c instanceof Qf&&(c=c.Nm(b),void 0!==c&&f instanceof S&&(l=f,f=a.Ze(c),El(a,f,l)))}}} +function El(a,b,c){if(null!==b&&null!==c){var d=a.Za.rE,e=b,f=c;if(a.Pd)for(b=f.te;b.next();){if(b.value.Z===f)return}else for(e=c,f=b,b=e.te;b.next();)if(b.value.T===e)return;if(null===d||!ji(d,e,f,null,!0))if(d=a.Ew(c.data),b=Ul(a,d),null!==b&&(Xg(b),b=b.copy(),null!==b)){var h=a.we;a.we=!0;b.ei=d;b.je=c.data;b.T=e;b.Z=f;a.add(b);b.je=null;b.data=c.data;a.we=h}}}function Dl(a,b){if(null!==b){for(var c=v.Va(b),d=0;d<c;d++){var e=v.Qa(b,d);Gl(a,e)}Ql(a,!1)}} +function Gl(a,b){if(void 0!==b&&null!==b&&!a.la.ib&&!a.xk.contains(b)){var c=a.Ew(b),d=Ul(a,c);if(null!==d&&(Xg(d),d=d.copy(),null!==d)){var e=a.we;a.we=!0;d.ei=c;d.je=b;var c=a.ba,f=c.WG(b);""!==f&&(d.xg=f);f=c.pl(b);void 0!==f&&(f=a.Ze(f),f instanceof S&&(d.T=f));f=c.ZG(b);""!==f&&(d.sh=f);f=c.ql(b);void 0!==f&&(f=a.Ze(f),f instanceof S&&(d.Z=f));c=c.ak(b);if(v.isArray(c))for(var f=v.Va(c),h=0;h<f;h++){var k=v.Qa(c,h),k=a.Ze(k);null!==k&&(k.fe=d)}a.add(d);d.je=null;d.data=b;a.we=e}}} +E.prototype.Ew=function(a){var b=this.ba,c="";b instanceof Q?c=b.Ew(a):b instanceof Qf&&(c=b.YG(a));return c};var Vl=!1;function Ul(a,b){var c=a.Iz.ja(b);null===c&&(c=a.Iz.ja(""),null===c&&(Vl||(Vl=!0,v.trace('No Link template found for category "'+b+'"'),v.trace(" Using default link template")),c=a.qB));return c}function Bl(a,b){for(var c=v.Va(b),d=0;d<c;d++){var e=v.Qa(b,d);Hl(a,e)}} +function Hl(a,b){if(void 0!==b&&null!==b){var c=a.eh(b);if(null!==c){c.hb=!1;c.hh=!1;var d=c.layer;if(null!==d&&d.g===a){var e=a.ba;if(e instanceof Q&&c instanceof S){var f=c,h=e.gb(f.data);if(void 0!==h){for(var k=f.te;k.next();)rg(e,h,k.value.data);f.uf&&(k=f.fe,null!==k&&rg(e,h,k.data));if(f instanceof V)for(f=f.Ic;f.next();)k=f.value.data,e.Je(k)&&rg(e,h,k)}}else if(e instanceof Qf&&c instanceof S){f=c;k=a.Pf(f.data);if(null!==k){k.hb=!1;k.hh=!1;var l=k.layer;if(null!==l){var m=l.Ne(-1,k,!1); +0<=m&&a.Lc(Df,"parts",l,k,null,m,null);m=k.zt;null!==m&&m(k,l,null)}}k=a.Pd;for(f=f.te;f.next();)l=f.value,l=(k?l.Z:l.T).data,e.Je(l)&&rg(e,h,l)}e=d.Ne(-1,c,!1);0<=e&&a.Lc(Df,"parts",d,c,null,e,null);e=c.zt;null!==e&&e(c,d,null)}}}}E.prototype.findPartForKey=E.prototype.RG=function(a){if(null===a||void 0===a)return null;a=this.ba.ae(a);return null===a?null:this.li.ja(a)}; +E.prototype.findNodeForKey=E.prototype.Ze=function(a){if(null===a||void 0===a)return null;a=this.ba.ae(a);if(null===a)return null;a=this.li.ja(a);return a instanceof S?a:null};E.prototype.findPartForData=E.prototype.eh=function(a){if(null===a)return null;var b=this.li.ja(a);return null!==b?b:b=this.xk.ja(a)};E.prototype.findNodeForData=E.prototype.Cw=function(a){if(null===a)return null;a=this.li.ja(a);return a instanceof S?a:null}; +E.prototype.findLinkForData=E.prototype.Pf=function(a){return null===a?null:this.xk.ja(a)};E.prototype.findNodesByExample=function(a){for(var b=new J,c=this.jo.i;c.next();){var d=c.value,e=d.data;if(null!==e)for(var f=0;f<arguments.length;f++){var h=arguments[f];if(v.Ta(h)&&Wl(this,e,h)){b.add(d);break}}}return b.i}; +E.prototype.findLinksByExample=function(a){for(var b=new J,c=this.ao.i;c.next();){var d=c.value,e=d.data;if(null!==e)for(var f=0;f<arguments.length;f++){var h=arguments[f];if(v.Ta(h)&&Wl(this,e,h)){b.add(d);break}}}return b.i};function Wl(a,b,c){for(var d in c){var e=b[d],f=c[d];if(v.isArray(f)){if(!v.isArray(e)||e.length<f.length)return!1;for(var h=0;h<e.length;h++){var k=e[h],l=f[h];if(void 0!==l&&!Xl(a,k,l))return!1}}else if(!Xl(a,e,f))return!1}return!0} +function Xl(a,b,c){if("function"===typeof c){if(!c(b))return!1}else if(c instanceof RegExp){if(!b||!c.test(b.toString()))return!1}else if(v.Ta(b)&&v.Ta(c)){if(!Wl(a,b,c))return!1}else if(b!==c)return!1;return!0}v.defineProperty(E,{mK:"nodeTemplate"},function(){return this.Di.ja("")},function(a){var b=this.Di.ja("");b!==a&&(v.A(a,R,E,"nodeTemplate"),this.Di.add("",a),this.h("nodeTemplate",b,a),this.la.ib||this.zl())}); +v.defineProperty(E,{Wz:"nodeTemplateMap"},function(){return this.Di},function(a){var b=this.Di;b!==a&&(v.A(a,na,E,"nodeTemplateMap"),this.Di=a,this.h("nodeTemplateMap",b,a),this.la.ib||this.zl())});v.defineProperty(E,{OJ:"groupTemplate"},function(){return this.Ak.ja("")},function(a){var b=this.Ak.ja("");b!==a&&(v.A(a,V,E,"groupTemplate"),this.Ak.add("",a),this.h("groupTemplate",b,a),this.la.ib||this.zl())}); +v.defineProperty(E,{yz:"groupTemplateMap"},function(){return this.Ak},function(a){var b=this.Ak;b!==a&&(v.A(a,na,E,"groupTemplateMap"),this.Ak=a,this.h("groupTemplateMap",b,a),this.la.ib||this.zl())});v.defineProperty(E,{aK:"linkTemplate"},function(){return this.yj.ja("")},function(a){var b=this.yj.ja("");b!==a&&(v.A(a,W,E,"linkTemplate"),this.yj.add("",a),this.h("linkTemplate",b,a),this.la.ib||this.zl())}); +v.defineProperty(E,{Iz:"linkTemplateMap"},function(){return this.yj},function(a){var b=this.yj;b!==a&&(v.A(a,na,E,"linkTemplateMap"),this.yj=a,this.h("linkTemplateMap",b,a),this.la.ib||this.zl())});v.defineProperty(E,{sH:null},function(){return this.Tl},function(a){this.Tl=a}); +v.defineProperty(E,{Oe:"isMouseCaptured"},function(){return this.VB},function(a){var b=this.zb;null!==b&&(a?(this.O.bubbles=!1,b.removeEventListener("mousemove",this.op,!1),b.removeEventListener("mousedown",this.np,!1),b.removeEventListener("mouseup",this.qp,!1),b.removeEventListener("mousewheel",this.lh,!1),b.removeEventListener("DOMMouseScroll",this.lh,!1),b.removeEventListener("mouseout",this.pp,!1),window.addEventListener("mousemove",this.op,!0),window.addEventListener("mousedown",this.np,!0), +window.addEventListener("mouseup",this.qp,!0),window.addEventListener("mousewheel",this.lh,!0),window.addEventListener("DOMMouseScroll",this.lh,!0),window.addEventListener("mouseout",this.pp,!0),window.addEventListener("selectstart",this.preventDefault,!1)):(window.removeEventListener("mousemove",this.op,!0),window.removeEventListener("mousedown",this.np,!0),window.removeEventListener("mouseup",this.qp,!0),window.removeEventListener("mousewheel",this.lh,!0),window.removeEventListener("DOMMouseScroll", +this.lh,!0),window.removeEventListener("mouseout",this.pp,!0),window.removeEventListener("selectstart",this.preventDefault,!1),b.addEventListener("mousemove",this.op,!1),b.addEventListener("mousedown",this.np,!1),b.addEventListener("mouseup",this.qp,!1),b.addEventListener("mousewheel",this.lh,!1),b.addEventListener("DOMMouseScroll",this.lh,!1),b.addEventListener("mouseout",this.pp,!1)),this.VB=a)}); +v.defineProperty(E,{position:"position"},function(){return this.kb},function(a){var b=this.kb;if(!b.K(a)){v.A(a,z,E,"position");var c=this.rb.copy();a=a.copy();if(!this.Pc&&null!==this.zb){this.Pc=!0;var d=this.scale;Gk(this,a,this.Zd,this.Eb/d,this.Jb/d,this.tn,!1);this.Pc=!1}this.kb=a.S();a=this.Na;a.pc&&Yj(a,b,this.kb);this.Pc||this.Lt(c,this.rb)}});v.defineProperty(E,{jH:"initialPosition"},function(){return this.cv},function(a){this.cv.K(a)||(v.A(a,z,E,"initialPosition"),this.cv=a.S())}); +v.defineProperty(E,{kH:"initialScale"},function(){return this.dv},function(a){this.dv!==a&&(v.j(a,"number",E,"initialScale"),this.dv=a)});v.defineProperty(E,{$o:"grid"},function(){null===this.hd&&yk(this);return this.hd},function(a){var b=this.hd;if(b!==a){null===b&&(yk(this),b=this.hd);v.A(a,D,E,"grid");a.type!==zk&&v.k("Diagram.grid must be a Panel of type Panel.Grid");var c=b.R;null!==c&&c.remove(b);this.hd=a;a.name="GRID";null!==c&&c.add(a);$k(this);this.pa();this.h("grid",b,a)}}); +v.u(E,{rb:"viewportBounds"},function(){var a=this.XC;if(null===this.zb)return a;var b=this.kb,c=this.Tb;a.m(b.x,b.y,Math.max(this.Eb,0)/c,Math.max(this.Jb,0)/c);return a});v.defineProperty(E,{ND:"fixedBounds"},function(){return this.Uu},function(a){var b=this.Uu;b.K(a)||(v.A(a,A,E,"fixedBounds"),-Infinity!==a.width&&Infinity!==a.height&&-Infinity!==a.height||v.k("fixedBounds width/height must not be Infinity"),this.Uu=a=a.S(),this.qc(),this.h("fixedBounds",b,a))}); +v.defineProperty(E,{QE:"scrollMargin"},function(){return this.Nv},function(a){"number"===typeof a?a=new cb(a):v.A(a,cb,E,"scrollMargin");var b=this.Nv;b.K(a)||(this.Nv=a=a.S(),this.qc(),this.h("scrollMargin",b,a))});v.defineProperty(E,{iA:"scrollMode"},function(){return this.Ov},function(a){var b=this.Ov;b!==a&&(v.pb(a,E,E,"scrollMode"),this.Ov=a,a===jk&&Ek(this,!1),this.h("scrollMode",b,a))}); +v.defineProperty(E,{BE:"positionComputation"},function(){return this.Gv},function(a){var b=this.Gv;b!==a&&(null!==a&&v.j(a,"function",E,"positionComputation"),this.Gv=a,Ek(this,!1),this.h("positionComputation",b,a))});v.defineProperty(E,{PE:"scaleComputation"},function(){return this.Kv},function(a){var b=this.Kv;b!==a&&(null!==a&&v.j(a,"function",E,"scaleComputation"),this.Kv=a,yl(this,this.scale,this.scale),this.h("scaleComputation",b,a))});v.u(E,{Zd:"documentBounds"},function(){return this.Nu}); +function Hk(a,b){a.sj=!1;var c=a.Nu;c.K(b)||(b=b.S(),a.Nu=b,Ek(a,!1),a.Ba("DocumentBoundsChanged",null,c.copy()),Pk(a))}v.defineProperty(E,{scale:"scale"},function(){return this.Tb},function(a){var b=this.Tb;v.We(a,E,"scale");b!==a&&yl(this,b,a)});v.defineProperty(E,{cl:"autoScale"},function(){return this.Ml},function(a){var b=this.Ml;b!==a&&(v.pb(a,E,E,"autoScale"),this.Ml=a,this.h("autoScale",b,a),a!==$g&&Ek(this,!1))}); +v.defineProperty(E,{QJ:"initialAutoScale"},function(){return this.Ek},function(a){var b=this.Ek;b!==a&&(v.pb(a,E,E,"initialAutoScale"),this.Ek=a,this.h("initialAutoScale",b,a))});v.defineProperty(E,{lH:"initialViewportSpot"},function(){return this.ev},function(a){var b=this.ev;b!==a&&(v.A(a,L,E,"initialViewportSpot"),a.bd()||v.k("initialViewportSpot must be a specific Spot: "+a),this.ev=a,this.h("initialViewportSpot",b,a))}); +v.defineProperty(E,{iH:"initialDocumentSpot"},function(){return this.bv},function(a){var b=this.bv;b!==a&&(v.A(a,L,E,"initialDocumentSpot"),a.bd()||v.k("initialViewportSpot must be a specific Spot: "+a),this.bv=a,this.h("initialDocumentSpot",b,a))});v.defineProperty(E,{jh:"minScale"},function(){return this.sv},function(a){v.We(a,E,"minScale");var b=this.sv;b!==a&&(0<a?(this.sv=a,this.h("minScale",b,a),a>this.scale&&(this.scale=a)):v.va(a,"> 0",E,"minScale"))}); +v.defineProperty(E,{ih:"maxScale"},function(){return this.qv},function(a){v.We(a,E,"maxScale");var b=this.qv;b!==a&&(0<a?(this.qv=a,this.h("maxScale",b,a),a<this.scale&&(this.scale=a)):v.va(a,"> 0",E,"maxScale"))});v.defineProperty(E,{Il:"zoomPoint"},function(){return this.ew},function(a){this.ew.K(a)||(v.A(a,z,E,"zoomPoint"),this.ew=a=a.S())}); +v.defineProperty(E,{uD:"contentAlignment"},function(){return this.tn},function(a){var b=this.tn;b.K(a)||(v.A(a,L,E,"contentAlignment"),this.tn=a=a.S(),this.h("contentAlignment",b,a),Ek(this,!1))});v.defineProperty(E,{RJ:"initialContentAlignment"},function(){return this.On},function(a){var b=this.On;b.K(a)||(v.A(a,L,E,"initialContentAlignment"),this.On=a=a.S(),this.h("initialContentAlignment",b,a))}); +v.defineProperty(E,{padding:"padding"},function(){return this.Ue},function(a){"number"===typeof a?a=new cb(a):v.A(a,cb,E,"padding");var b=this.Ue;b.K(a)||(this.Ue=a=a.S(),this.qc(),this.h("padding",b,a))});v.u(E,{Bg:"nodes"},function(){return this.jo.i});v.u(E,{links:"links"},function(){return this.ao.i});v.u(E,{ek:"parts"},function(){return this.wb.i}); +E.prototype.findTopLevelNodesAndLinks=function(){for(var a=new J(R),b=this.jo.i;b.next();){var c=b.value;c.fp&&a.add(c)}for(b=this.ao.i;b.next();)c=b.value,c.fp&&a.add(c);return a.i};E.prototype.findTopLevelGroups=function(){return this.Wk.i};v.defineProperty(E,{Pb:"layout"},function(){return this.Ud},function(a){var b=this.Ud;b!==a&&(v.A(a,Zf,E,"layout"),null!==b&&(b.g=null,b.group=null),this.Ud=a,a.g=this,a.group=null,this.vu=!0,this.h("layout",b,a),this.ue())}); +E.prototype.layoutDiagram=function(a){Ck(this);a&&Ql(this,!0);al(this,!1)};function Ql(a,b){for(var c=a.Wk.i;c.next();)Yl(a,c.value,b);null!==a.Pb&&(b?a.Pb.wf=!1:a.Pb.H())}function Yl(a,b,c){if(null!==b){for(var d=b.fo.i;d.next();)Yl(a,d.value,c);null!==b.Pb&&(c?b.Pb.wf=!1:b.Pb.H())}} +function al(a,b){if(!a.Ux){var c=a.Pb,d=a.Ra;a.Ra=!0;try{a.Qb("Layout");var e=a.Na;1!==a.la.th||e.df||e.pc||e.Xm("Layout");for(var f=a.Wk.i;f.next();)Zl(a,f.value,b);c.wf||b&&!c.kE&&1!==a.la.th||(c.doLayout(a),Ck(a),c.wf=!0)}finally{a.wd("Layout"),a.vu=!c.wf,a.Ra=d}}}function Zl(a,b,c){if(null!==b){for(var d=b.fo.i;d.next();)Zl(a,d.value,c);d=b.Pb;null===d||d.wf||c&&!d.kE||(b.Dy=!b.location.G(),d.doLayout(b),b.H($l),d.wf=!0,el(a,b))}} +v.defineProperty(E,{Pd:"isTreePathToChildren"},function(){return this.iv},function(a){var b=this.iv;if(b!==a&&(v.j(a,"boolean",E,"isTreePathToChildren"),this.iv=a,this.h("isTreePathToChildren",b,a),!this.la.ib))for(a=this.Bg;a.next();)am(a.value)});E.prototype.findTreeRoots=function(){for(var a=new I(S),b=this.Bg;b.next();){var c=b.value;c.fp&&null===c.Vo()&&a.add(c)}return a.i}; +v.defineProperty(E,{yA:"treeCollapsePolicy"},function(){return this.$v},function(a){var b=this.$v;b!==a&&(v.pb(a,E,E,"treeCollapsePolicy"),this.$v=a,this.h("treeCollapsePolicy",b,a))});v.defineProperty(E,{gh:null},function(){return this.MB},function(a){this.MB=a}); +function kk(a){function b(a){var b=a.toLowerCase(),h=new I("function");c.add(a,h);c.add(b,h);d.add(a,a);d.add(b,a)}var c=new na("string",I),d=new na("string","string");b("AnimationStarting");b("AnimationFinished");b("BackgroundSingleClicked");b("BackgroundDoubleClicked");b("BackgroundContextClicked");b("ClipboardChanged");b("ClipboardPasted");b("DocumentBoundsChanged");b("ExternalObjectsDropped");b("InitialLayoutCompleted");b("LayoutCompleted");b("LinkDrawn");b("LinkRelinked");b("LinkReshaped");b("Modified"); +b("ObjectSingleClicked");b("ObjectDoubleClicked");b("ObjectContextClicked");b("PartCreated");b("PartResized");b("PartRotated");b("SelectionMoved");b("SelectionCopied");b("SelectionDeleting");b("SelectionDeleted");b("SelectionGrouped");b("SelectionUngrouped");b("ChangingSelection");b("ChangedSelection");b("SubGraphCollapsed");b("SubGraphExpanded");b("TextEdited");b("TreeCollapsed");b("TreeExpanded");b("ViewportBoundsChanged");a.Wx=c;a.Vx=d} +function qa(a,b){var c=a.Vx.ja(b);return null!==c?c:a.Vx.ja(b.toLowerCase())}function bm(a,b){var c=a.Wx.ja(b);if(null!==c)return c;c=a.Wx.ja(b.toLowerCase());if(null!==c)return c;v.k("Unknown DiagramEvent name: "+b);return null}E.prototype.addDiagramListener=E.prototype.Xy=function(a,b){v.j(a,"string",E,"addDiagramListener:name");v.j(b,"function",E,"addDiagramListener:listener");var c=bm(this,a);null!==c&&c.add(b)}; +E.prototype.removeDiagramListener=E.prototype.EE=function(a,b){v.j(a,"string",E,"removeDiagramListener:name");v.j(b,"function",E,"addDiagramListener:listener");var c=bm(this,a);null!==c&&c.remove(b)};E.prototype.raiseDiagramEvent=E.prototype.Ba=function(a,b,c){var d=bm(this,a),e=new yf;e.g=this;e.name=qa(this,a);void 0!==b&&(e.tA=b);void 0!==c&&(e.Zz=c);a=d.length;if(1===a)d=d.da(0),d(e);else if(0!==a)for(b=d.cc(),c=0;c<a;c++)d=b[c],d(e);return e.cancel}; +function ci(a,b){var c=!1;a.rb.Xj(b)&&(c=!0);c=a.rz(b,function(a){return a.Y},function(a){return a instanceof W},!0,function(a){return a instanceof W},c);if(0!==c.count)for(c=c.i;c.next();){var d=c.value;d.sl&&d.ic()}}E.prototype.isUnoccupied=E.prototype.hp=function(a,b){void 0===b&&(b=null);return cm(this,!1,null,b).hp(a.x,a.y,a.width,a.height)}; +function cm(a,b,c,d){null===a.td&&(a.td=new dm);if(a.td.st||a.td.group!==c||a.td.rA!==d){if(null===c){b=a.sj?Dk(a):a.Zd.copy();b.Qf(100,100);a.td.initialize(b);b=v.ag();for(var e=a.Bg;e.next();){var f=e.value,h=f.layer;null!==h&&h.visible&&!h.Gc&&em(a,f,d,b)}}else for(c.U.G()||c.sf(),b=c.U.copy(),b.Qf(20,20),a.td.initialize(b),b=v.ag(),e=c.Ic;e.next();)f=e.value,f instanceof S&&em(a,f,d,b);v.Vb(b);a.td.group=c;a.td.rA=d;a.td.st=!1}else b&&fm(a.td);return a.td} +function em(a,b,c,d){if(b!==c)if(b.isVisible()&&b.canAvoid()){c=b.getAvoidableRect(d);d=a.td.Lo;b=a.td.Jo;for(var e=c.x+c.width,f=c.y+c.height,h=c.x;h<e;h+=d){for(var k=c.y;k<f;k+=b)gm(a.td,h,k);gm(a.td,h,f)}for(k=c.y;k<f;k+=b)gm(a.td,e,k);gm(a.td,e,f)}else if(b instanceof V)for(b=b.Ic;b.next();)e=b.value,e instanceof S&&em(a,e,c,d)}function hm(a,b){null===a.td||a.td.st||null!==b&&!b.canAvoid()||(a.td.st=!0)} +E.prototype.simulatedMouseMove=E.prototype.qx=function(a,b,c){if(null!==jh){var d=jh.g;c instanceof E||(c=null);var e=kh;c!==e&&(null!==e&&e!==d&&null!==e.Za.$d&&(Fh(e),jh.Iw=!1,e.Za.$d.doSimulatedDragLeave()),kh=c,null!==c&&c!==d&&null!==c.Za.$d&&(Mh(),e=c.Za.$d,Ih.contains(e)||Ih.add(e),c.Za.$d.doSimulatedDragEnter()));if(null===c||c===d||!c.fD||c.ab||!c.Ho)return!1;d=c.Za.$d;null!==d&&(null!==a?b=c.Iq(a):null===b&&(b=new z),c.Nb.ca=b,c.Nb.kl=!1,c.Nb.up=!1,d.doSimulatedDragOver());return!0}return!1}; +E.prototype.simulatedMouseUp=E.prototype.$E=function(a,b,c,d){if(null!==jh){null===d&&(d=b);b=kh;var e=jh.g;if(d!==b){if(null!==b&&b!==e&&null!==b.Za.$d)return Fh(b),jh.Iw=!1,b.Za.$d.doSimulatedDragLeave(),!1;kh=d;null!==d&&null!==d.Za.$d&&(Mh(),b=d.Za.$d,Ih.contains(b)||Ih.add(b),d.Za.$d.doSimulatedDragEnter())}if(null===d)return jh.doCancel(),!0;if(d!==this)return null!==a&&(c=d.Iq(a)),d.Nb.ca=c,d.Nb.kl=!1,d.Nb.up=!0,a=d.Za.$d,null!==a&&a.doSimulatedDrop(),a=jh,null!==a&&(d=a.mayCopy(),a.Bf=d?"Copy": +"Move",a.stopTool()),!0}return!1};v.defineProperty(E,{lD:"autoScrollRegion"},function(){return this.xu},function(a){"number"===typeof a?a=new cb(a):v.A(a,cb,E,"autoScrollRegion");var b=this.xu;b.K(a)||(this.xu=a=a.S(),this.qc(),this.h("autoScrollRegion",b,a))});function Yh(a,b){a.wu.assign(b);im(a,a.wu).Fc(a.position)?Fh(a):jm(a)} +function jm(a){-1===a.nn&&(a.nn=v.setTimeout(function(){if(-1!==a.nn){Fh(a);var b=a.O.event;if(null!==b){var c=im(a,a.wu);c.Fc(a.position)||(a.position=c,a.O.ca=a.pF(a.wu),a.qx(b,null,b.target.W)||a.doMouseMove(),a.sj=!0,Hk(a,a.ah()),a.ke=!0,a.Uf(),jm(a))}}},a.UA))}function Fh(a){-1!==a.nn&&(v.clearTimeout(a.nn),a.nn=-1)} +function im(a,b){var c=a.position,d=a.lD;if(0>=d.top&&0>=d.left&&0>=d.right&&0>=d.bottom)return c;var e=a.rb,f=a.scale,e=v.hk(0,0,e.width*f,e.height*f),h=v.Mb(0,0);if(b.x>=e.x&&b.x<e.x+d.left){var k=Math.max(a.Tt,1),k=k|0;h.x-=k;b.x<e.x+d.left/2&&(h.x-=k);b.x<e.x+d.left/4&&(h.x-=4*k)}else b.x<=e.x+e.width&&b.x>e.x+e.width-d.right&&(k=Math.max(a.Tt,1),k|=0,h.x+=k,b.x>e.x+e.width-d.right/2&&(h.x+=k),b.x>e.x+e.width-d.right/4&&(h.x+=4*k));b.y>=e.y&&b.y<e.y+d.top?(k=Math.max(a.Ut,1),k|=0,h.y-=k,b.y<e.y+ +d.top/2&&(h.y-=k),b.y<e.y+d.top/4&&(h.y-=4*k)):b.y<=e.y+e.height&&b.y>e.y+e.height-d.bottom&&(k=Math.max(a.Ut,1),k|=0,h.y+=k,b.y>e.y+e.height-d.bottom/2&&(h.y+=k),b.y>e.y+e.height-d.bottom/4&&(h.y+=4*k));h.Fc(ad)||(c=new z(c.x+h.x/f,c.y+h.y/f));v.Vb(e);v.v(h);return c}E.prototype.makeSVG=E.prototype.makeSvg=function(a){void 0===a&&(a=new ta);a.context="svg";a=km(this,a);return null!==a?a.Dl:null}; +E.prototype.makeImage=function(a){void 0===a&&(a=new ta);var b=(a.document||document).createElement("img");b.src=this.HH(a);return b};E.prototype.makeImageData=E.prototype.HH=function(a){void 0===a&&(a=new ta);var b=km(this,a);return null!==b?b.toDataURL(a.type,a.details):""};var lm=!1; +function km(a,b){a.Na.$h();a.Uf();if(null===a.zb)return null;"object"!==typeof b&&v.k("properties argument must be an Object.");var c=!1,d=b.size||null,e=b.scale||null;void 0!==b.scale&&isNaN(b.scale)&&(e="NaN");var f=b.maxSize;void 0===b.maxSize&&(c=!0,f="svg"===b.context?new ia(Infinity,Infinity):new ia(2E3,2E3));var h=b.position||null,k=b.parts||null,l=void 0===b.padding?1:b.padding,m=b.background||null,n=b.omitTemporary;void 0===n&&(n=!0);var p=b.document||document,q=b.elementFinished||null,r= +b.showTemporary;void 0===r&&(r=!n);n=b.showGrid;void 0===n&&(n=r);null!==d&&isNaN(d.width)&&isNaN(d.height)&&(d=null);"number"===typeof l?l=new cb(l):l instanceof cb||(l=new cb(0));l.left=Math.max(l.left,0);l.right=Math.max(l.right,0);l.top=Math.max(l.top,0);l.bottom=Math.max(l.bottom,0);a.Gn=!1;Zc(a.lf,!0);var s=new Rc(null,p),t=s.el,u=s;if(!(d||e||k||h))return s.width=a.Eb+Math.ceil(l.left+l.right),s.height=a.Jb+Math.ceil(l.top+l.bottom),"svg"===b.context&&(t=u=new Cc(s.xd,p,q),t instanceof Cc&& +(a.Gn=!0)),ll(a,t,l,new ia(s.width,s.height),a.Tb,a.kb,k,m,r,n),a.Gn=!0,u;var x=a.nb.uw,w=new z(0,0),y=a.Zd.copy();y.FI(a.padding);if(r)for(var B=!0,B=a.Yb.n,H=B.length,C=0;C<H;C++){var T=B[C];if(T.visible&&T.Gc)for(var ba=T.wb.n,T=ba.length,U=0;U<T;U++){var M=ba[U];M.Fz&&M.isVisible()&&(M=M.U,M.G()&&y.bi(M))}}w.x=y.x;w.y=y.y;if(null!==k){var aa,B=!0,ba=k.i;for(ba.reset();ba.next();)H=ba.value,H instanceof R&&(M=H,T=M.layer,null!==T&&!T.visible||null!==T&&!r&&T.Gc||!M.isVisible()||(M=M.U,M.G()&&(B? +(B=!1,aa=M.copy()):aa.bi(M))));B&&(aa=new A(0,0,0,0));y.width=aa.width;y.height=aa.height;w.x=aa.x;w.y=aa.y}null!==h&&h.G()&&(w=h,e||(e=x));B=ba=0;null!==l&&(ba=l.left+l.right,B=l.top+l.bottom);C=H=0;null!==d&&(H=d.width,C=d.height,isFinite(H)&&(H=Math.max(0,H-ba)),isFinite(C)&&(C=Math.max(0,C-B)));aa=h=0;null!==d&&null!==e?("NaN"===e&&(e=x),d.G()?(h=H,aa=C):isNaN(C)?(h=H,aa=y.height*e):(h=y.width*e,aa=C)):null!==d?d.G()?(e=Math.min(H/y.width,C/y.height),h=H,aa=C):isNaN(C)?(e=H/y.width,h=H,aa=y.height* +e):(e=C/y.height,h=y.width*e,aa=C):null!==e?"NaN"===e&&f.G()?(e=Math.min((f.width-ba)/y.width,(f.height-B)/y.height),e>x?(e=x,h=y.width,aa=y.height):(h=f.width,aa=f.height)):(h=y.width*e,aa=y.height*e):(e=x,h=y.width,aa=y.height);null!==l?(h+=ba,aa+=B):l=new cb(0);null!==f&&(d=f.width,f=f.height,"svg"!==b.context&&c&&!lm&&(h>d||aa>f)&&(v.trace("Diagram.makeImage(data): Diagram width or height is larger than the default max size. ("+Math.ceil(h)+"x"+Math.ceil(aa)+" vs 2000x2000) Consider increasing the max size."), +lm=!0),isNaN(d)&&(d=2E3),isNaN(f)&&(f=2E3),isFinite(d)&&(h=Math.min(h,d)),isFinite(f)&&(aa=Math.min(aa,f)));s.width=Math.ceil(h);s.height=Math.ceil(aa);"svg"===b.context&&(t=u=new Cc(s.xd,p,q),t instanceof Cc&&(a.Gn=!0));ll(a,t,l,new ia(Math.ceil(h),Math.ceil(aa)),e,w,k,m,r,n);a.Gn=!0;return u}E.inherit=function(a,b){v.j(a,"function",E,"inherit");v.j(b,"function",E,"inherit");b.QF&&v.k("Cannot inherit from "+v.af(b));v.Ja(a,b)}; +function tk(){this.TF="63ad05bbe23a1786468a4c741b6d2";this.dg=this.TF===this._tk?!0:null} +tk.prototype.Hl=function(a){a.lf.setTransform(a.rd,0,0,a.rd,0,0);if(null===this.dg)a:{var b="f",c=window[v.ug("76a715b2f73f148a")][v.ug("72ba13b5")];a=v.ug;if(window[a("7da7")]&&window[a("7da7")][a("76a115b6ed251eaf4692")]){this.dg=!0;var d=window[a("7da7")][a("76a115b6ed251eaf4692")],d=a(d).split(a("39e9")),e=a(d[1]).split("."),f=v[a("6cae19")].split(".");if(e[0]>f[0]||e[0]===f[0]&&e[1]>=f[1]){e=c[a("76ad18b4f73e")];for(f=c[a("73a612b6fb191d")](a("35e7"))+2;f<e;f++)b+=c[f];c=b[a("73a612b6fb191d")](a(d[2])); +0>c&&a(d[2])!==a("7da71ca0ad381e90")&&(c=b[a("73a612b6fb191d")](a("76a715b2ef3e149757")));0>c&&(c=b[a("73a612b6fb191d")](a("76a715b2ef3e149757")));this.dg=!(0<=c&&c<b[a("73a612b6fb191d")](a("35")))}}else{if(a("77bb5bb2f32603de")===window[a("76a715b2f73f148a")][a("6aba19a7ec351488")])try{this.dg=!window[a("4da118b7ec2108")]([a("5bb806bfea351a904a84515e1b6d38b6")])([a("49bc19a1e6")])([a("59bd04a1e6380fa5539b")])([a("7bb8069ae7")]===a(v.adym));if(!1===this.dg)break a;this.dg=!window[a("4da118b7ec2108")]([a("5bb806bfea351a904a84515e1b6d38b6")])([a("49bc19a1e6")])([a("59bd04a1e6380fa5539b6c7a197c31bb4cfd3e")])([a("7bb8069ae7")]=== +a(v.adym));if(!1===this.dg)break a}catch(h){}e=c[a("76ad18b4f73e")];for(f=c[a("73a612b6fb191d")](a("35e7"))+2;f<e;f++)b+=c[f];c=b[a("73a612b6fb191d")](a(v.adym));0>c&&a(v.adym)!==a("7da71ca0ad381e90")&&(c=b[a("73a612b6fb191d")](a("76a715b2ef3e149757")));if(this.dg=false)b=window.document[a("79ba13b2f7333e8846865a7d00")]("div"),c=a("02cncncn"),"."===c[0]&&(c=c[a("69bd14a0f724128a44")](1)),b[a("79a417a0f0181a8946")]=c,window.document[a("78a712aa")]?(window.document[a("78a712aa")][a("7bb806b6ed32388c4a875b")](b), +c=window[a("7dad0290ec3b0b91578e5b40007031bf")](b)[a("7dad0283f1390b81519f4645156528bf")](a("78a704b7e62456904c9b12701b6532a8")),window.document[a("78a712aa")][a("68ad1bbcf533388c4a875b")](b),c&&-1!==c.indexOf(a(v.pG))&&-1!==c.indexOf(a(v.qG))&&(this.dg=!1)):(this.dg=null,this.dg=!1)}}return 0<this.dg&&this!==this.RF?!0:!1};tk.prototype.t=function(){this.RF=null}; +function uk(a,b){void 0!==b&&null!==b||v.k("Diagram setup requires an argument DIV.");null!==a.Kb&&v.k("Diagram has already completed setup.");"string"===typeof b?a.Kb=window.document.getElementById(b):b instanceof HTMLDivElement?a.Kb=b:v.k("No DIV or DIV id supplied: "+b);null===a.Kb&&v.k("Invalid DIV id; could not get element with id: "+b);void 0!==a.Kb.W&&v.k("Invalid div id; div already has a Diagram associated with it.");"static"===window.getComputedStyle(a.Kb,null).position&&(a.Kb.style.position= +"relative");a.Kb.style["-webkit-tap-highlight-color"]="rgba(255, 255, 255, 0)";a.Kb.style["-ms-touch-action"]="none";a.Kb.innerHTML="";a.Kb.W=a;var c=new Rc(a);c.xd.innerHTML="This text is displayed if your browser does not support the Canvas HTML element.";void 0!==c.style&&(c.style.position="absolute",c.style.top="0px",c.style.left="0px","rtl"===window.getComputedStyle(a.Kb,null).getPropertyValue("direction")&&(a.Tq=!0),c.style.zIndex="2",c.style.PK="none",c.style.webkitUserSelect="none",c.style.MozUserSelect= +"none");a.Eb=a.Kb.clientWidth||1;a.Jb=a.Kb.clientHeight||1;a.zb=c;a.lf=c.el;var d=a.lf;a.IF=(window.devicePixelRatio||1)/(d.webkitBackingStorePixelRatio||d.mozBackingStorePixelRatio||d.msBackingStorePixelRatio||d.oBackingStorePixelRatio||d.backingStorePixelRatio||1);a.rd=a.computePixelRatio();nl(a,a.Eb,a.Jb);a.Zx=d[v.ug("7eba17a4ca3b1a8346")][v.ug("78a118b7")](d,v.Hl,4,4);a.Kb.insertBefore(c.xd,a.Kb.firstChild);c=new Rc(null);c.width=1;c.height=1;a.Yx=c;a.CB=c.el;var c=v.createElement("div"),e=v.createElement("div"); +c.style.position="absolute";c.style.overflow="auto";c.style.width=a.Eb+"px";c.style.height=a.Jb+"px";c.style.zIndex="1";e.style.position="absolute";e.style.width="1px";e.style.height="1px";a.Kb.appendChild(c);c.appendChild(e);c.onscroll=a.KF;c.onmousedown=a.jC;c.ontouchstart=a.jC;c.W=a;c.OF=!0;c.PF=!0;a.Pv=c;a.cs=e;a.dA=v.xD(function(){a.Nj=null;a.pa()},300,!1);a.uF=v.xD(function(){Mj(a)},250,!1);a.preventDefault=function(a){a.preventDefault();return!1};a.op=function(b){if(a.isEnabled){a.Tl=!0;var c= +a.Sc;v.Pm&&c.Xi?(b.preventDefault(),b.simulated=!0,a.qs=b):(a.Sc=a.Nb,a.Nb=c,Kk(a,a,b,c,!0),a.qx(b,null,b.target.W)||(a.doMouseMove(),a.Wa.isBeyondDragSize()&&(a.Jk=0),Ok(c,b)))}};a.np=function(b){if(a.isEnabled){a.Tl=!0;var c=a.Sc;if(v.Pm&&null!==a.qs)a.qs=b,b.preventDefault();else if(v.Pm&&400>b.timeStamp-a.Yl)b.preventDefault();else if(a.Gk)b.preventDefault();else{a.Sc=a.Nb;a.Nb=c;Kk(a,a,b,c,!0);c.kl=!0;c.Ge=b.detail;if(v.eE||v.fE)b.timeStamp-a.Yl<a.UC&&!a.Wa.isBeyondDragSize()?a.Jk++:a.Jk=1,a.Yl= +b.timeStamp,c.Ge=a.Jk;a.ri=c;!0===c.Dq.simulated?(b.preventDefault(),b.simulated=!0):(jh=null,a.doMouseDown(),a.ri=a.ri.copy(),1===b.button?b.preventDefault():Ok(c,b))}}};a.qp=function(b){if(a.isEnabled)if(a.Gk&&2===b.button)b.preventDefault();else if(a.Gk&&0===b.button&&(a.Gk=!1),a.ys)b.preventDefault();else{a.Tl=!0;var c=a.Sc;if(v.Pm){if(400>b.timeStamp-a.Yl){b.preventDefault();return}a.Yl=b.timeStamp}if(v.Pm&&null!==a.qs)a.qs=null,b.preventDefault();else{a.Sc=a.Nb;a.Nb=c;Kk(a,a,b,c,!0);c.up=!0; +c.Ge=b.detail;if(v.eE||v.fE)c.Ge=a.Jk;c.bubbles=b.bubbles;b.target.W&&(c.Jg=b.target.W);a.$E(b,null,new z,c.Jg)||(a.doMouseUp(),Fh(a),Ok(c,b))}}};a.lh=function(b){if(a.isEnabled){var c=a.Sc;a.Sc=a.Nb;a.Nb=c;Kk(a,a,b,c,!0);c.bubbles=!0;c.il=void 0!==b.wheelDelta?b.wheelDelta:-40*b.detail;a.doMouseWheel();Ok(c,b)}};a.pp=function(){if(a.isEnabled){a.Tl=!1;var b=a.Wa;b.cancelWaitAfter();b instanceof Hg&&b.hideToolTip()}};a.kF=function(b){if(a.isEnabled){a.ys=!1;a.Gk=!0;var c=a.Sc;a.Sc=a.Nb;a.Nb=c;Mk(a, +b,b.targetTouches[0],c,1<b.touches.length);a.doMouseDown();Ok(c,b)}};a.jF=function(b){if(a.isEnabled){var c=a.Sc;a.Sc=a.Nb;a.Nb=c;var d=null;0<b.changedTouches.length?d=b.changedTouches[0]:0<b.targetTouches.length&&(d=b.targetTouches[0]);Nk(a,b,d,c,1<b.touches.length);a.qx(d?d:b,null,c.Jg)||a.doMouseMove();Ok(c,b)}};a.iF=function(b){if(a.isEnabled)if(a.ys)b.preventDefault();else{var c=a.Sc;a.Sc=a.Nb;a.Nb=c;if(1<b.touches.length)a.Yo("hasGestureZoom")&&(a.jy=!1);else{var d=null,e=null;0<b.changedTouches.length? +e=b.changedTouches[0]:0<b.targetTouches.length&&(e=b.targetTouches[0]);c.g=a;c.Ge=1;if(null!==e){d=window.document.elementFromPoint(e.clientX,e.clientY);null!==d&&d.W instanceof E&&d.W!==a&&Lk(d.W,e,c);Lk(a,b.changedTouches[0],c);var m=e.screenX,n=e.screenY,p=a.$B;b.timeStamp-a.Yl<a.UC&&!(25<Math.abs(p.x-m)||25<Math.abs(p.y-n))?a.Jk++:a.Jk=1;c.Ge=a.Jk;a.Yl=b.timeStamp;a.$B.m(m,n)}c.od=0;c.button=0;c.buttons=1;c.kl=!1;c.up=!0;c.il=0;c.zc=!1;c.bubbles=!1;c.event=b;c.timestamp=Date.now();c.Jg=null=== +d?b.target.W:d.W?d.W:null;c.ye=null;a.$E(e?e:b,null,new z,c.Jg)||a.doMouseUp();Ok(c,b);a.Gk=!1}}};a.$H=function(b){if("touch"===b.pointerType){var c=a.tC;void 0===c[b.pointerId]&&(a.Fv++,c[b.pointerId]=b);a.Jf[0]=null;a.Jf[1]=null;for(var d in c)if(null===a.Jf[0])a.Jf[0]=c[d];else if(null===a.Jf[1]){a.Jf[1]=c[d];break}a.isEnabled&&(a.ys=!1,a.Gk=!0,c=a.Sc,a.Sc=a.Nb,a.Nb=c,Mk(a,b,b,c,1<a.Fv),a.doMouseDown(),Ok(c,b))}};a.bI=function(b){if("touch"===b.pointerType&&!(2>a.Fv)){var c=a.Jf;c[0].pointerId=== +b.pointerId&&(c[0]=b);c[1].pointerId===b.pointerId&&(c[1]=b);a.isEnabled&&(c=a.Sc,a.Sc=a.Nb,a.Nb=c,Nk(a,b,b,c,!0),a.qx(b,null,c.Jg)||(a.doMouseMove(),Ok(c,b)))}};a.aI=function(b){if("touch"===b.pointerType){var c=a.tC;void 0!==c[b.pointerId]&&(a.Fv--,delete c[b.pointerId],c=a.Jf,null!==c[0]&&c[0].pointerId===b.pointerId&&(c[0]=null),null!==c[1]&&c[1].pointerId===b.pointerId&&(c[1]=null))}};Zc(d,!0);xk(a)} +function mm(a){1<arguments.length&&v.k("Palette constructor can only take one optional argument, the DIV HTML element or its id.");E.call(this,a);this.Ss=!0;this.bl=!1;this.ab=!0;this.uD=sb;this.Pb=new nm}v.Ja(mm,E);v.ea("Palette",mm); +function qk(a){1<arguments.length&&v.k("Overview constructor can only take one optional argument, the DIV HTML element or its id.");E.call(this,a);this.Na.isEnabled=!1;this.Pc=!0;this.Gj=null;this.Qu=!0;this.yI("drawShadows",!1);var b=new R,c=new Y;c.stroke="magenta";c.lb=2;c.fill="transparent";c.name="BOXSHAPE";b.Al=!0;b.kA="BOXSHAPE";b.Kz="BOXSHAPE";b.ME="BOXSHAPE";b.cursor="move";b.add(c);this.Nl=b;c=new Vg;c.type=Ri;c.ef=zb;var d=new Si;d.Rf=!0;c.add(d);d=new Y;d.Uj=zb;d.Ab="Rectangle";d.za=new ia(64, +64);d.cursor="se-resize";d.alignment=Eb;c.add(d);b.KE=c;this.xm=this.Vj=!1;this.of=this.Us=!0;this.lD=0;this.Oy=new Rc(null);this.SF=this.Oy.el;this.Za.$d=new om;this.Za.NE=new pm;var e=this;this.click=function(){var a=e.Gj;if(null!==a){var b=a.rb,c=e.O.ca;a.position=new z(c.x-b.width/2,c.y-b.height/2)}};this.zE=function(){qm(e)};this.yE=function(){null!==e.Gj&&(e.qc(),e.pa())};this.cl=Ik;this.Pc=!1}v.Ja(qk,E);v.ea("Overview",qk); +function rm(a){a.Pc||a.Gd||!1!==a.Lf||(a.Lf=!0,requestAnimationFrame(function(){if(a.Lf&&!a.Gd&&(a.Lf=!1,null!==a.Kb)){a.Gd=!0;Ck(a);a.Zd.G()||Hk(a,a.ah());null===a.Kb&&v.k("No div specified");null===a.zb&&v.k("No canvas specified");if(a.ke){var b=a.Gj;if(null!==b&&!b.Na.df&&!b.Na.pc){var b=a.lf,c=a.Oy;b.setTransform(1,0,0,1,0,0);b.clearRect(0,0,a.zb.width,a.zb.height);b.drawImage(c.xd,0,0);c=a.ne;c.reset();1!==a.scale&&c.scale(a.scale);0===a.position.x&&0===a.position.y||c.translate(-a.position.x, +-a.position.y);b.scale(a.rd,a.rd);b.transform(c.m11,c.m12,c.m21,c.m22,c.dx,c.dy);for(var c=a.Yb.n,d=c.length,e=0;e<d;e++)c[e].Xe(b,a);a.Fk=!1;a.ke=!1}}a.Gd=!1}}))}qk.prototype.computePixelRatio=function(){return 1}; +qk.prototype.Xe=function(){null===this.Kb&&v.k("No div specified");null===this.zb&&v.k("No canvas specified");if(this.ke){var a=this.Gj;if(null!==a&&!a.Na.df){il(this);var b=a.$o;(null!==b&&b.visible&&isNaN(b.width)||isNaN(b.height))&&$k(a);var c=this.zb,b=this.lf,d=this.Oy,e=this.SF;d.width=c.width;d.height=c.height;Zc(b,!0);b.setTransform(1,0,0,1,0,0);b.clearRect(0,0,c.width,c.height);d=this.ne;d.reset();1!==this.scale&&d.scale(this.scale);0===this.position.x&&0===this.position.y||d.translate(-this.position.x, +-this.position.y);b.scale(this.rd,this.rd);b.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy);for(var d=this.Qu,f=this.rb,h=a.Yb.n,k=h.length,a=0;a<k;a++){var l=h[a],m=b,n=f,p=d;if(l.visible&&0!==l.Rc&&(void 0===p&&(p=!0),p||!l.Gc)){1!==l.Rc&&(m.globalAlpha=l.Rc);for(var p=this.scale,l=l.wb.n,q=l.length,r=0;r<q;r++){var s=l[r],t=s.U;t.yg(n)&&(1<t.width*p||1<t.height*p?s.Xe(m,this):ck(s,m))}m.globalAlpha=1}}e.drawImage(c.xd,0,0);c=this.Yb.n;e=c.length;for(a=0;a<e;a++)c[a].Xe(b,this);this.ke=this.Fk=!1}}}; +v.defineProperty(qk,{Yz:"observed"},function(){return this.Gj},function(a){var b=this.Gj;null!==a&&v.A(a,E,qk,"observed");a instanceof qk&&v.k("Overview.observed Diagram may not be an Overview itself: "+a);b!==a&&(null!==b&&(this.remove(this.$g),b.EE("ViewportBoundsChanged",this.zE),b.EE("DocumentBoundsChanged",this.yE),b.Cv.remove(this)),this.Gj=a,null!==a&&(a.Xy("ViewportBoundsChanged",this.zE),a.Xy("DocumentBoundsChanged",this.yE),a.Cv.add(this),this.add(this.$g),qm(this)),this.qc(),this.h("observed", +b,a))});v.defineProperty(qk,{$g:"box"},function(){return this.Nl},function(a){var b=this.Nl;b!==a&&(this.Nl=a,this.remove(b),this.add(this.Nl),qm(this),this.h("box",b,a))});v.defineProperty(qk,{MJ:"drawsTemporaryLayers"},function(){return this.Qu},function(a){this.Qu!==a&&(this.Qu=a,this.ax())}); +function qm(a){var b=a.$g;if(null!==b){var c=a.Gj;if(null!==c){a.ke=!0;var c=c.rb,d=b.Wt,e=v.Fl();e.m(c.width,c.height);d.za=e;v.$j(e);a=2/a.scale;d instanceof Y&&(d.lb=a);b.location=new z(c.x-a/2,c.y-a/2)}}}qk.prototype.ah=function(){var a=this.Gj;return null===a?bd:a.Zd};qk.prototype.ZD=function(){!0!==this.ke&&(this.ke=!0,rm(this))};qk.prototype.Lt=function(a){this.Pc||(Bk(this),this.pa(),Pk(this),this.qc(),qm(this),this.Ba("ViewportBoundsChanged",null,a))}; +function om(){Zg.call(this);this.Rk=null}v.Ja(om,Zg);om.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.g;if(null===a||!a.bl||!a.of)return!1;var b=a.Yz;if(null===b)return!1;if(null===this.findDraggablePart()){var c=b.rb;this.Rk=new z(c.width/2,c.height/2);a=a.yc.ca;b.position=new z(a.x-this.Rk.x,a.y-this.Rk.y)}return!0};om.prototype.doActivate=function(){this.Rk=null;Zg.prototype.doActivate.call(this)}; +om.prototype.moveParts=function(){var a=this.g,b=a.Yz;if(null!==b){var c=a.$g;if(null!==c){if(null===this.Rk){var d=a.yc.ca,c=c.location;this.Rk=new z(d.x-c.x,d.y-c.y)}a=a.O.ca;b.position=new z(a.x-this.Rk.x,a.y-this.Rk.y)}}};function pm(){Pi.call(this)}v.Ja(pm,Pi);pm.prototype.resize=function(a){var b=this.g.Yz;if(null!==b){var c=b.rb.copy();b.position=a.position;(c.width!==a.width||c.height!==a.height)&&0<a.width&&0<a.height&&(b.scale=Math.min(c.width/a.width,c.height/a.height))}}; +function ha(a){1<arguments.length&&v.k("Brush constructor can take at most one optional argument, the Brush type.");v.dc(this);this.D=!1;void 0===a?(this.ia=Uf,this.rn="black"):"string"===typeof a?(this.ia=Uf,this.rn=a):(this.ia=a,this.rn="black");var b=this.ia;b===Vf?(this.to=sb,this.In=Db):this.In=b===Yc?this.to=zb:this.to=qb;this.Vv=0;this.Ru=NaN;this.Og=this.Ev=this.Ng=null;this.Px=this.sn=0}v.ea("Brush",ha);var Uf;ha.Solid=Uf=v.p(ha,"Solid",0);var Vf;ha.Linear=Vf=v.p(ha,"Linear",1);var Yc; +ha.Radial=Yc=v.p(ha,"Radial",2);var sm;ha.Pattern=sm=v.p(ha,"Pattern",4);ha.prototype.copy=function(){var a=new ha;a.ia=this.ia;a.rn=this.rn;a.to=this.to.S();a.In=this.In.S();a.Vv=this.Vv;a.Ru=this.Ru;null!==this.Ng&&(a.Ng=this.Ng.copy());a.Ev=this.Ev;return a};ha.prototype.Ea=function(){this.freeze();Object.freeze(this);return this};ha.prototype.freeze=function(){this.D=!0;null!==this.Ng&&this.Ng.freeze();return this}; +ha.prototype.Oa=function(){Object.isFrozen(this)&&v.k("cannot thaw constant: "+this);this.D=!1;null!==this.Ng&&this.Ng.Oa();return this};ha.prototype.toString=function(){var a="Brush(";if(this.type===Uf)a+=this.color;else if(a=this.type===Vf?a+"Linear ":this.type===Yc?a+"Radial ":this.type===sm?a+"Pattern ":a+"(unknown) ",a+=this.start+" "+this.end,null!==this.Ys)for(var b=this.Ys.i;b.next();)a+=" "+b.key+":"+b.value;return a+")"}; +ha.prototype.addColorStop=ha.prototype.addColorStop=function(a,b){this.D&&v.ka(this);("number"!==typeof a||!isFinite(a)||1<a||0>a)&&v.va(a,"0 <= loc <= 1",ha,"addColorStop:loc");v.j(b,"string",ha,"addColorStop:color");null===this.Ng&&(this.Ng=new na("number","string"));this.Ng.add(a,b);this.ia===Uf&&(this.type=Vf);this.Og=null}; +v.defineProperty(ha,{type:"type"},function(){return this.ia},function(a){this.D&&v.ka(this,a);v.pb(a,ha,ha,"type");this.ia=a;this.start.se()&&(a===Vf?this.start=sb:a===Yc&&(this.start=zb));this.end.se()&&(a===Vf?this.end=Db:a===Yc&&(this.end=zb));this.Og=null});v.defineProperty(ha,{color:"color"},function(){return this.rn},function(a){this.D&&v.ka(this,a);this.rn=a;this.Og=null}); +v.defineProperty(ha,{start:"start"},function(){return this.to},function(a){this.D&&v.ka(this,a);v.A(a,L,ha,"start");this.to=a.S();this.Og=null});v.defineProperty(ha,{end:"end"},function(){return this.In},function(a){this.D&&v.ka(this,a);v.A(a,L,ha,"end");this.In=a.S();this.Og=null});v.defineProperty(ha,{cu:"startRadius"},function(){return this.Vv},function(a){this.D&&v.ka(this,a);v.We(a,ha,"startRadius");0>a&&v.va(a,">= zero",ha,"startRadius");this.Vv=a;this.Og=null}); +v.defineProperty(ha,{bt:"endRadius"},function(){return this.Ru},function(a){this.D&&v.ka(this,a);v.We(a,ha,"endRadius");0>a&&v.va(a,">= zero",ha,"endRadius");this.Ru=a;this.Og=null});v.defineProperty(ha,{Ys:"colorStops"},function(){return this.Ng},function(a){this.D&&v.ka(this,a);this.Ng=a;this.Og=null});v.defineProperty(ha,{pattern:"pattern"},function(){return this.Ev},function(a){this.D&&v.ka(this,a);this.Ev=a;this.Og=null}); +ha.randomColor=function(a,b){void 0===a&&(a=128);void 0===b&&(b=Math.max(a,255));var c=Math.abs(b-a),d=Math.floor(a+Math.random()*c).toString(16),e=Math.floor(a+Math.random()*c).toString(16),c=Math.floor(a+Math.random()*c).toString(16);2>d.length&&(d="0"+d);2>e.length&&(e="0"+e);2>c.length&&(c="0"+c);return"#"+d+e+c};var tm=(new Rc(null)).el,ga; +ha.isValidColor=ga=function(a){if("black"===a)return!0;if(""===a)return!1;tm.fillStyle="#000000";var b=tm.fillStyle;tm.fillStyle=a;if(tm.fillStyle!==b)return!0;tm.fillStyle="#FFFFFF";b=tm.fillStyle;tm.fillStyle=a;return tm.fillStyle!==b}; +function G(){v.dc(this);this.fa=30723;this.Rc=1;this.Xg=null;this.Ob="";this.nc=this.Ib=null;this.kb=(new z(NaN,NaN)).freeze();this.mf=Ed;this.Dj=pd;this.Bj=Cd;this.ne=new ja;this.Up=new ja;this.Ok=new ja;this.Tb=this.Ou=1;this.Kl=0;this.Qh=um;this.kr=cd;this.jd=(new A(NaN,NaN,NaN,NaN)).freeze();this.mc=(new A(NaN,NaN,NaN,NaN)).freeze();this.Qc=(new A(0,0,NaN,NaN)).freeze();this.Bs=this.Eq=this.ga=this.Lr=this.Mr=null;this.Cs=this.Fq=Infinity;this.Tp=this.Ae=fc;this.$r=0;this.Gi=1;this.bq=0;this.ii= +1;this.us=null;this.es=-Infinity;this.ds=0;this.fs=ad;this.gs=Gi;this.mq="";this.sc=this.ha=null;this.on=-1;this.im=this.ps=this.hi=this.wk=this.so=null}v.Vh(G);v.ea("GraphObject",G); +G.prototype.cloneProtected=function(a){a.fa=this.fa|6144;a.Rc=this.Rc;a.Ob=this.Ob;a.Ib=this.Ib;a.nc=this.nc;a.kb.assign(this.kb);a.mf=this.mf.S();a.Dj=this.Dj.S();a.Bj=this.Bj.S();a.Ok=this.Ok.copy();a.Tb=this.Tb;a.Kl=this.Kl;a.Qh=this.Qh;a.kr=this.kr.S();a.jd.assign(this.jd);a.mc.assign(this.mc);a.Qc.assign(this.Qc);a.Lr=this.Lr;null!==this.ga&&(a.ga=this.ga.copy());a.Eq=this.Eq;a.Bs=this.Bs;a.Fq=this.Fq;a.Cs=this.Cs;a.Ae=this.Ae.S();a.Tp=this.Tp.S();a.$r=this.$r;a.Gi=this.Gi;a.bq=this.bq;a.ii= +this.ii;a.us=this.us;a.es=this.es;a.ds=this.ds;a.fs=this.fs.S();a.gs=this.gs;a.mq=this.mq;null!==this.ha&&(a.ha=this.ha.copy());a.sc=this.sc;a.on=this.on;null!==this.wk&&(a.wk=v.fl(this.wk));null!==this.hi&&(a.hi=this.hi.copy());a.ps=this.ps};G.prototype.addCopyProperty=G.prototype.aG=function(a){var b=this.wk;if(v.isArray(b))for(var c=0;c<b.length;c++){if(b[c]===a)return}else this.wk=b=[];b.push(a)};G.prototype.Wh=function(a){a.Mr=null;a.im=null;a.N()}; +G.prototype.clone=function(){var a=new this.constructor;this.cloneProtected(a);if(null!==this.wk)for(var b=0;b<this.wk.length;b++){var c=this.wk[b];a[c]=this[c]}return a};G.prototype.copy=function(){return this.clone()};G.prototype.toString=function(){return v.af(Object.getPrototypeOf(this))+"#"+v.ld(this)};var Ti;G.None=Ti=v.p(G,"None",0);var um;G.Default=um=v.p(G,"Default",0);var vm;G.Vertical=vm=v.p(G,"Vertical",4);var wm;G.Horizontal=wm=v.p(G,"Horizontal",5);var He;G.Fill=He=v.p(G,"Fill",3);var Vi; +G.Uniform=Vi=v.p(G,"Uniform",1);var Wi;G.UniformToFill=Wi=v.p(G,"UniformToFill",2);function xm(a){null===a.ha&&(a.ha=new ym)}G.prototype.Me=function(){if(null===this.ga){var a=new zm;a.qj=qb;a.Rj=qb;a.oj=10;a.Pj=10;a.nj=Am;a.Oj=Am;a.pj=0;a.Qj=0;this.ga=a}}; +function Bm(a,b,c,d,e,f,h){var k=.001,l=f.length;a.moveTo(b,c);d-=b;k=e-c;0===d&&(d=.001);e=k/d;for(var m=Math.sqrt(d*d+k*k),n=0,p=!0,q=0===h?!1:!0;.1<=m;){if(q){k=f[n++%l];for(k-=h;0>k;)k+=f[n++%l],p=!p;q=!1}else k=f[n++%l];k>m&&(k=m);var r=Math.sqrt(k*k/(1+e*e));0>d&&(r=-r);b+=r;c+=e*r;p?a.lineTo(b,c):a.moveTo(b,c);m-=k;p=!p}}G.prototype.raiseChangedEvent=G.prototype.Lc=function(a,b,c,d,e,f,h){var k=this.Y;null!==k&&(k.Ym(a,b,c,d,e,f,h),0!==(this.fa&1024)&&c===this&&a===Af&&Cm(this,k,b))}; +function Cm(a,b,c){var d=a.Uo();if(null!==d)for(var e=a.sc.i;e.next();){var f=e.value,h=null;if(null!==f.bn){h=Dg(f,d,a);if(null===h)continue;f.ux(a,h,c,null)}else if(f.yt){var k=b.g;null===k||k.we||f.ux(a,k.ba.ck,c,k)}else{var l=d.data;if(null===l)continue;k=b.g;null===k||k.we||f.ux(a,l,c,k)}null!==h&&(k=d.Aw(f.El),null!==k&&f.sF(k,h,c))}}G.prototype.Aw=function(a){return this.on===a?this:null};G.prototype.raiseChanged=G.prototype.h=function(a,b,c){this.Lc(Af,a,this,b,c)}; +function Dm(a,b,c,d,e){var f=a.jd,h=a.Ok;h.reset();Em(a,h,b,c,d,e);a.Ok=h;f.x=b;f.y=c;f.width=d;f.height=e;h.vt()||h.oF(f)}function Fm(a,b,c,d){if(!1===a.Hg)return!1;d.multiply(a.transform);return c?a.yg(b,d):a.Em(b,d)} +G.prototype.LD=function(a,b,c){if(!1===this.Hg)return!1;var d=this.Ha;b=a.rf(b);var e=!1;c&&(e=Sa(a.x,a.y,0,0,0,d.height)<b||Sa(a.x,a.y,0,d.height,d.width,d.height)<b||Sa(a.x,a.y,d.width,d.height,d.width,0)<b||Sa(a.x,a.y,d.width,0,0,0)<b);c||(e=Sa(a.x,a.y,0,0,0,d.height)<b&&Sa(a.x,a.y,0,d.height,d.width,d.height)<b&&Sa(a.x,a.y,d.width,d.height,d.width,0)<b&&Sa(a.x,a.y,d.width,0,0,0)<b);return e};G.prototype.Lg=function(){return!0}; +G.prototype.containsPoint=G.prototype.Fa=function(a){var b=v.L();b.assign(a);this.transform.ub(b);var c=this.U;if(!c.G())return v.v(b),!1;var d=this.g;if(null!==d&&d.Gk){var e=d.Yo("extraTouchThreshold"),f=d.Yo("extraTouchArea"),h=f/2,k=this.Ha,d=this.Ti()*d.scale,l=1/d;if(k.width*d<e&&k.height*d<e)return a=bb(c.x-h*l,c.y-h*l,c.width+f*l,c.height+f*l,b.x,b.y),v.v(b),a}if(this instanceof Vg||this instanceof Y?bb(c.x-5,c.y-5,c.width+10,c.height+10,b.x,b.y):c.Fa(b))return e=!1,e=this.hi&&!this.hi.Fa(b)? +!1:null!==this.nc&&c.Fa(b)?!0:null!==this.Ib&&this.Qc.Fa(a)?!0:this.Wj(a),v.v(b),e;v.v(b);return!1};G.prototype.Wj=function(a){var b=this.Ha;return bb(0,0,b.width,b.height,a.x,a.y)};G.prototype.containsRect=G.prototype.Xj=function(a){if(0===this.angle)return this.U.Xj(a);var b=this.Ha,b=v.hk(0,0,b.width,b.height),c=this.transform,d=!1,e=v.Mb(a.x,a.y);b.Fa(c.Xh(e))&&(e.m(a.x,a.bottom),b.Fa(c.Xh(e))&&(e.m(a.right,a.bottom),b.Fa(c.Xh(e))&&(e.m(a.right,a.y),b.Fa(c.Xh(e))&&(d=!0))));v.v(e);v.Vb(b);return d}; +G.prototype.containedInRect=G.prototype.Em=function(a,b){if(void 0===b)return a.Xj(this.U);var c=this.Ha,d=!1,e=v.Mb(0,0);a.Fa(b.ub(e))&&(e.m(0,c.height),a.Fa(b.ub(e))&&(e.m(c.width,c.height),a.Fa(b.ub(e))&&(e.m(c.width,0),a.Fa(b.ub(e))&&(d=!0))));v.v(e);return d}; +G.prototype.intersectsRect=G.prototype.yg=function(a,b){if(void 0===b&&(b=this.transform,0===this.angle))return a.yg(this.U);var c=this.Ha,d=b,e=v.Mb(0,0),f=v.Mb(0,c.height),h=v.Mb(c.width,c.height),k=v.Mb(c.width,0),l=!1;if(a.Fa(d.ub(e))||a.Fa(d.ub(f))||a.Fa(d.ub(h))||a.Fa(d.ub(k)))l=!0;else{var c=v.hk(0,0,c.width,c.height),m=v.Mb(a.x,a.y);c.Fa(d.Xh(m))?l=!0:(m.m(a.x,a.bottom),c.Fa(d.Xh(m))?l=!0:(m.m(a.right,a.bottom),c.Fa(d.Xh(m))?l=!0:(m.m(a.right,a.y),c.Fa(d.Xh(m))&&(l=!0))));v.v(m);v.Vb(c);!l&& +(oe(a,e,f)||oe(a,f,h)||oe(a,h,k)||oe(a,k,e))&&(l=!0)}v.v(e);v.v(f);v.v(h);v.v(k);return l};G.prototype.getDocumentPoint=G.prototype.Xa=function(a,b){void 0===b&&(b=new z);a.se()&&v.k("getDocumentPoint:s Spot must be specific: "+a.toString());var c=this.Ha;b.m(a.x*c.width+a.offsetX,a.y*c.height+a.offsetY);this.Zg.ub(b);return b};G.prototype.getDocumentAngle=G.prototype.ol=function(){var a;a=this.Zg;1===a.m11&&0===a.m12?a=0:(a=180*Math.atan2(a.m12,a.m11)/Math.PI,0>a&&(a+=360));return a}; +G.prototype.getDocumentScale=G.prototype.Ti=function(){if(0!==(this.fa&4096)===!1)return this.Ou;var a=this.Tb;return null!==this.R?a*this.R.Ti():a};G.prototype.getLocalPoint=G.prototype.QD=function(a,b){void 0===b&&(b=new z);b.assign(a);this.Zg.Xh(b);return b};G.prototype.getNearestIntersectionPoint=G.prototype.RD=function(a,b,c){return this.Zo(a.x,a.y,b.x,b.y,c)};g=G.prototype; +g.Zo=function(a,b,c,d,e){var f=this.transform,h=1/(f.m11*f.m22-f.m12*f.m21),k=f.m22*h,l=-f.m12*h,m=-f.m21*h,n=f.m11*h,p=h*(f.m21*f.dy-f.m22*f.dx),q=h*(f.m12*f.dx-f.m11*f.dy);if(null!==this.zm)return f=this.U,ge(f.left,f.top,f.right,f.bottom,a,b,c,d,e);h=a*k+b*m+p;a=a*l+b*n+q;b=c*k+d*m+p;c=c*l+d*n+q;e.m(0,0);d=this.Ha;c=ge(0,0,d.width,d.height,h,a,b,c,e);e.transform(f);return c}; +function lj(a,b,c,d,e){if(!1!==fl(a)){var f=a.margin,h=f.right+f.left,f=f.top+f.bottom;b=Math.max(b-h,0);c=Math.max(c-f,0);e=e||0;d=Math.max((d||0)-h,0);e=Math.max(e-f,0);var h=a.angle,f=0,f=a.za,k=0;a.lb&&(k=a.lb);90===h||270===h?(b=isFinite(f.height)?f.height+k:b,c=isFinite(f.width)?f.width+k:c):(b=isFinite(f.width)?f.width+k:b,c=isFinite(f.height)?f.height+k:c);var f=d||0,k=e||0,l=a instanceof D;switch(Gm(a,!0)){case Ti:k=f=0;l&&(c=b=Infinity);break;case He:isFinite(b)&&b>d&&(f=b);isFinite(c)&& +c>e&&(k=c);break;case wm:isFinite(b)&&b>d&&(f=b);k=0;l&&(c=Infinity);break;case vm:isFinite(c)&&c>e&&(k=c),f=0,l&&(b=Infinity)}var l=a.xf,m=a.kh;f>l.width&&m.width<l.width&&(f=l.width);k>l.height&&m.height<l.height&&(k=l.height);d=Math.max(f/a.scale,m.width);e=Math.max(k/a.scale,m.height);l.width<d&&(d=Math.min(m.width,d));l.height<e&&(e=Math.min(m.height,e));b=Math.min(l.width,b);c=Math.min(l.height,c);b=Math.max(d,b);c=Math.max(e,c);if(90===h||270===h)f=b,b=c,c=f,f=d,d=e,e=f;a.jd.Oa();a.mp(b,c, +d,e);a.jd.freeze();a.jd.G()||v.k("Non-real measuredBounds has been set. Object "+a+", measuredBounds: "+a.jd.toString());Sk(a,!1)}} +g.Ec=function(a,b,c,d,e){this.si();var f=v.ag();f.assign(this.mc);this.mc.Oa();if(!1===gl(this)){var h=this.mc;h.x=a;h.y=b;h.width=c;h.height=d}else this.Ni(a,b,c,d);this.mc.freeze();this.hi=void 0===e?null:e;c=!1;void 0!==e?c=!0:null!==this.R&&(e=this.R.Qc,d=this.Ca,null!==this.zm&&(d=this.mc),c=b+d.height,d=a+d.width,c=!(0<=a+.05&&d<=e.width+.05&&0<=b+.05&&c<=e.height+.05),this instanceof bh&&(a=this.Qc,this.pv>a.height||this.Lk.Te>a.width))&&(c=!0);this.fa=c?this.fa|256:this.fa&-257;this.mc.G()|| +v.k("Non-real actualBounds has been set. Object "+this+", actualBounds: "+this.mc.toString());this.Uw(f,this.mc);v.Vb(f)};g.Ni=function(){}; +function Hm(a,b,c,d,e){var f=a.U;f.x=b;f.y=c;f.width=d;f.height=e;if(!a.za.G()){f=a.jd;c=a.margin;b=c.right+c.left;var h=c.top+c.bottom;c=f.width+b;f=f.height+h;d+=b;e+=h;b=Gm(a,!0);c===d&&f===e&&(b=Ti);switch(b){case Ti:if(c>d||f>e)Sk(a,!0),lj(a,c>d?d:c,f>e?e:f);break;case He:Sk(a,!0);lj(a,d,e,0,0);break;case wm:Sk(a,!0);lj(a,d,f,0,0);break;case vm:Sk(a,!0),lj(a,c,e,0,0)}}} +g.Uw=function(a,b){Im(this,!1);var c=this.Y;if(null!==c&&null!==c.g){var d=this.Y;null!==d&&(d.Wt!==this&&d.LE!==this&&d.OE!==this||Jm(d,!0));this.pa();a.K(b)||(c.rl(),this.xv(c))}};g.xv=function(a){null!==this.Rd&&Jm(a,!0)};v.defineProperty(G,{Gp:"shadowVisible"},function(){return this.ps},function(a){var b=this.ps;b!==a&&(this.ps=a,this.h("shadowVisible",b,a))}); +G.prototype.Xe=function(a,b){if(this.visible){var c=this.mc;if(0!==c.width&&0!==c.height&&!isNaN(c.x)&&!isNaN(c.y)){var d=this.opacity,e=1;if(1!==d){if(0===d)return;e=a.globalAlpha;a.globalAlpha=e*d}if(a instanceof Cc)a:{if(this.visible){var f=null,h=a.Nw;if(this instanceof D&&(this.type===Km||this.type===Lm))Mm(this,a,b);else{var k=this.mc;if(0!==k.width&&0!==k.height&&!isNaN(k.x)&&!isNaN(k.y)){var l=this.transform,m=this.R;0!==(this.fa&4096)===!0&&Nm(this);var c=0!==(this.fa&256),n=!1;this instanceof +bh&&(a.font=this.font);if(c){n=m.Lg()?m.Ha:m.U;if(null!==this.hi)var p=this.hi,q=p.x,r=p.y,s=p.width,p=p.height;else q=Math.max(k.x,n.x),r=Math.max(k.y,n.y),s=Math.min(k.right,n.right)-q,p=Math.min(k.bottom,n.bottom)-r;if(q>k.width+k.x||k.x>n.width+n.x||r>k.height+k.y||k.y>n.height+n.y)break a;n=!0;Ec(a,1,0,0,1,0,0);a.save();a.beginPath();a.rect(q,r,s,p);a.clip()}q=!1;if(this instanceof R){var t=this,q=!0;if(!t.isVisible())break a}a.Ri.ff=[1,0,0,1,0,0];r=!1;q&&this.wl&&b.Ui("drawShadows")&&(s=this.qm, +a.qA(s.x*b.scale*b.rd,s.y*b.scale*b.rd,t.og),a.an(),a.shadowColor=t.pm);t=!1;this.Y&&b.Ui("drawShadows")&&(t=this.Y.wl);!0===this.Gp?(a.an(),!1===r&&t&&(Ec(a,1,0,0,1,0,0),a.Ya(),r=!0)):!1===this.Gp&&a.$m();null!==this.nc&&(Om(this,a,this.nc,!0,!0),!1===r&&t&&(Ec(a,1,0,0,1,0,0),a.Ya(),r=!0),this.nc instanceof ha&&this.nc.type===Yc?(a.beginPath(),a.rect(k.x,k.y,k.width,k.height),a.vg(this.nc)):a.fillRect(k.x,k.y,k.width,k.height));this instanceof D?Ec(a,l.m11,l.m12,l.m21,l.m22,l.dx,l.dy):a.Ri.ff=[l.m11, +l.m12,l.m21,l.m22,l.dx,l.dy];if(null!==this.Ib){!1===r&&t&&(Ec(a,1,0,0,1,0,0),a.Ya(),r=!0);var p=this.Ha,l=k=0,s=p.width,p=p.height,u=0;this instanceof Y&&(p=this.bb.mb,k=p.x,l=p.y,s=p.width,p=p.height,u=this.Rh);Om(this,a,this.Ib,!0,!1);this.Ib instanceof ha&&this.Ib.type===Yc?(a.beginPath(),a.rect(k-u/2,l-u/2,s+u,p+u),a.vg(this.Ib)):a.fillRect(k-u/2,l-u/2,s+u,p+u)}t&&(null!==this.Ib||null!==this.nc||null!==m&&0!==(m.fa&512)||null!==m&&(m.type===wk||m.type===Ri)&&m.Ye()!==this)?(Pm(this,!0),null=== +this.Gp&&a.$m()):Pm(this,!1);this.Yj(a,b);t&&0!==(this.fa&512)===!0&&a.an();q&&t&&a.$m();c&&(a.restore(),n&&a.tf.pop());this instanceof D&&(f=a.tf.pop());!0===r&&a.tf.pop();null!==a.FD&&(null===f&&(h===a.Nw?(Ec(a,1,0,0,1,0,0),f=a.tf.pop()):f=a.Nw),a.FD(this,f))}}}}else{if(this instanceof D&&(this.type===Km||this.type===Lm)){Mm(this,a,b);1!==d&&(a.globalAlpha=e);return}this instanceof W&&this.Tm(!1);f=this.transform;h=this.R;0!==(this.fa&4096)===!0&&Nm(this);m=0!==(this.fa&256);this instanceof bh&& +(a.font=this.font);if(m){n=h.Lg()?h.Ha:h.U;null!==this.hi?(t=this.hi,k=t.x,l=t.y,q=t.width,t=t.height):(k=Math.max(c.x,n.x),l=Math.max(c.y,n.y),q=Math.min(c.right,n.right)-k,t=Math.min(c.bottom,n.bottom)-l);if(k>c.width+c.x||c.x>n.width+n.x||l>c.height+c.y||c.y>n.height+n.y){1!==d&&(a.globalAlpha=e);return}a.save();a.beginPath();a.rect(k,l,q,t);a.clip()}n=!1;if(this instanceof R){n=!0;if(!this.isVisible()){1!==d&&(a.globalAlpha=e);return}this.wl&&b.Ui("drawShadows")&&(k=this.qm,a.qA(k.x*b.scale*b.rd, +k.y*b.scale*b.rd,this.og),a.an(),a.shadowColor=this.pm)}k=!1;this.Y&&b.Ui("drawShadows")&&(k=this.Y.wl);!0===this.Gp?a.an():!1===this.Gp&&a.$m();null!==this.nc&&(Om(this,a,this.nc,!0,!0),this.nc instanceof ha&&this.nc.type===Yc?(a.beginPath(),a.rect(c.x,c.y,c.width,c.height),a.vg(this.nc)):a.fillRect(c.x,c.y,c.width,c.height));f.vt()||a.transform(f.m11,f.m12,f.m21,f.m22,f.dx,f.dy);null!==this.Ib&&(t=this.Ha,l=c=0,q=t.width,t=t.height,r=0,this instanceof Y&&(t=this.bb.mb,c=t.x,l=t.y,q=t.width,t=t.height, +r=this.Rh),Om(this,a,this.Ib,!0,!1),this.Ib instanceof ha&&this.Ib.type===Yc?(a.beginPath(),a.rect(c-r/2,l-r/2,q+r,t+r),a.vg(this.Ib)):a.fillRect(c-r/2,l-r/2,q+r,t+r));k&&(null!==this.Ib||null!==this.nc||null!==h&&0!==(h.fa&512)||null!==h&&(h.type===wk||h.type===Ri)&&h.Ye()!==this)?(Pm(this,!0),null===this.Gp&&a.$m()):Pm(this,!1);this.Yj(a,b);k&&0!==(this.fa&512)===!0&&a.an();n&&k&&a.$m();m?(a.restore(),this instanceof D?Zc(a,!0):Zc(a,!1)):f.vt()||(h=1/(f.m11*f.m22-f.m12*f.m21),a.transform(f.m22* +h,-f.m12*h,-f.m21*h,f.m11*h,h*(f.m21*f.dy-f.m22*f.dx),h*(f.m12*f.dx-f.m11*f.dy)))}1!==d&&(a.globalAlpha=e)}}}; +function Mm(a,b,c){var d=a.mc;0===d.width||0===d.height||isNaN(d.x)||isNaN(d.y)||(null!==a.nc&&(Om(a,b,a.nc,!0,!0),a.nc instanceof ha&&a.nc.type===Yc?(b.beginPath(),b.rect(d.x,d.y,d.width,d.height),b.vg(a.nc)):b.fillRect(d.x,d.y,d.width,d.height)),null!==a.Ib&&(Om(a,b,a.Ib,!0,!1),a.Ib instanceof ha&&a.Ib.type===Yc?(b.beginPath(),b.rect(d.x,d.y,d.width,d.height),b.vg(a.Ib)):b.fillRect(d.x,d.y,d.width,d.height)),a.Yj(b,c))}G.prototype.Yj=function(){}; +function Om(a,b,c,d,e){if(null!==c){var f=1,h=1;if("string"===typeof c)d?b.fillStyle=c:b.strokeStyle=c;else if(c.type===Uf)d?b.fillStyle=c.color:b.strokeStyle=c.color;else{var k,h=a.Ha,f=h.width,h=h.height;if(e)var l=a.U,f=l.width,h=l.height;var m=b instanceof Sc;if(m&&c.Og&&(c.type===sm||c.sn===f&&c.Px===h))k=c.Og;else{var n=l=0,p=0,q=0,r=0,s=0,s=r=0;e&&(l=a.U,f=l.width,h=l.height,r=l.x,s=l.y);l=c.start.x*f+c.start.offsetX;n=c.start.y*h+c.start.offsetY;p=c.end.x*f+c.end.offsetX;q=c.end.y*h+c.end.offsetY; +l+=r;p+=r;n+=s;q+=s;if(c.type===Vf)k=b.createLinearGradient(l,n,p,q);else if(c.type===Yc)s=isNaN(c.bt)?Math.max(f,h)/2:c.bt,isNaN(c.cu)?(r=0,s=Math.max(f,h)/2):r=c.cu,k=b.createRadialGradient(l,n,r,p,q,s);else if(c.type===sm)try{k=b.createPattern(c.pattern,"repeat")}catch(t){k=null}else v.Cd(c.type,"Brush type");if(c.type!==sm&&(e=c.Ys,null!==e))for(e=e.i;e.next();)k.addColorStop(e.key,e.value);if(m&&(c.Og=k,null!==k&&(c.sn=f,c.Px=h),null===k&&c.type===sm&&-1!==c.sn)){c.sn=-1;var u=a.g;null!==u&& +-1===c.sn&&v.setTimeout(function(){u.ax()},600)}}d?b.fillStyle=k:b.strokeStyle=k}}}G.prototype.isContainedBy=G.prototype.ul=function(a){if(a instanceof D)a:{if(this!==a&&null!==a)for(var b=this.R;null!==b;){if(b===a){a=!0;break a}b=b.R}a=!1}else a=!1;return a};G.prototype.isVisibleObject=G.prototype.Zi=function(){if(!this.visible)return!1;var a=this.R;return null!==a?a.Zi():!0}; +function Nm(a){if(0!==(a.fa&2048)===!0){var b=a.ne;b.reset();if(!a.mc.G()||!a.jd.G()){Qm(a,!1);return}b.translate(a.mc.x,a.mc.y);b.translate(-a.Ca.x,-a.Ca.y);var c=a.Ha;Em(a,b,c.x,c.y,c.width,c.height);Qm(a,!1);Rm(a,!0)}0!==(a.fa&4096)===!0&&(b=a.R,null===b?(a.Up.set(a.ne),a.Ou=a.scale,Rm(a,!1)):null!==b.Zg&&(c=a.Up,c.reset(),b.Lg()?c.multiply(b.Up):null!==b.R&&c.multiply(b.R.Up),c.multiply(a.ne),a.Ou=a.scale*b.Ou,Rm(a,!1)))} +function Em(a,b,c,d,e,f){1!==a.scale&&b.scale(a.scale);if(0!==a.angle){var h=zb;a.ef&&a.ef.bd()&&(h=a.ef);var k=v.L();if(a instanceof R&&a.bc!==a)for(c=a.bc,d=c.Ha,k.$t(d.x,d.y,d.width,d.height,h),c.Ok.ub(k),k.offset(-c.Ca.x,-c.Ca.y),h=c.R;null!==h&&h!==a;)h.Ok.ub(k),k.offset(-h.Ca.x,-h.Ca.y),h=h.R;else k.$t(c,d,e,f,h);b.rotate(a.angle,k.x,k.y);v.v(k)}}g=G.prototype; +g.N=function(a){void 0===a&&(a=!1);if(!0!==fl(this)){Sk(this,!0);Im(this,!0);var b=this.R;null!==b?a||b.N():(a=this.g,null!==a&&(a.fg.add(this),this instanceof S&&(a.la.ib||this.cf(),null!==this.fe&&Sm(this.fe)),a.ue(!0)));if(this instanceof D){if(this.ia===wk||this.ia===Di)a=this.Ye(),null!==a&&a.N(!0);a=this.ya.n;for(var b=a.length,c=0;c<b;c++){var d=a[c];!0!==fl(d)&&(d.za.G()||(d instanceof Si||d instanceof D||d instanceof bh||Gm(d,!1)!==Ti)&&d.N(!0))}}}}; +g.ep=function(){!1===fl(this)&&(Sk(this,!0),Im(this,!0))};function Sm(a){if(!1===gl(a)){if(null!==a.R)a.R.N();else{var b=a.g;null!==b&&(b.fg.add(a),a instanceof S&&a.cf(),b.ue())}Im(a,!0)}}g.si=function(){0!==(this.fa&2048)===!1&&(Qm(this,!0),Rm(this,!0))};g.Bz=function(){Rm(this,!0)};g.pa=function(){var a=this.Y;null!==a&&a.pa()}; +function Gm(a,b){var c=a.stretch,d=a.R;if(null!==d&&d.ia===Tm)return Um(a,d.Md(a.Wb),d.Ld(a.column),b);if(null!==d&&d.ia===wk&&d.Ye()===a)return Vm(a,He,b);if(c===um){if(null!==d){if(d.ia===Ri&&d.Ye()===a)return Vm(a,He,b);c=d.Jd;return c===um?Vm(a,Ti,b):Vm(a,c,b)}return Vm(a,Ti,b)}return Vm(a,c,b)} +function Um(a,b,c,d){var e=a.stretch;if(e!==um)return Vm(a,e,d);var f=e=null;switch(b.stretch){case vm:f=!0;break;case He:f=!0}switch(c.stretch){case wm:e=!0;break;case He:e=!0}b=a.R.Jd;null===e&&(e=b===wm||b===He);null===f&&(f=b===vm||b===He);return!0===e&&!0===f?Vm(a,He,d):!0===e?Vm(a,wm,d):!0===f?Vm(a,vm,d):Vm(a,Ti,d)} +function Vm(a,b,c){if(c)return b;if(b===Ti)return Ti;c=a.za;if(c.G())return Ti;a=a.angle;if(!isNaN(c.width))if(90!==a&&270!==a){if(b===wm)return Ti;if(b===He)return vm}else{if(b===vm)return Ti;if(b===He)return wm}if(!isNaN(c.height))if(90!==a&&270!==a){if(b===vm)return Ti;if(b===He)return wm}else{if(b===wm)return Ti;if(b===He)return vm}return b} +v.defineProperty(G,{Vt:"segmentOrientation"},function(){return this.gs},function(a){var b=this.gs;b!==a&&(this.gs=a,this.N(),this.h("segmentOrientation",b,a),a===Gi&&(this.angle=0))});v.defineProperty(G,{ve:"segmentIndex"},function(){return this.es},function(a){a=Math.round(a);var b=this.es;b!==a&&(this.es=a,this.N(),this.h("segmentIndex",b,a))}); +v.defineProperty(G,{jA:"segmentFraction"},function(){return this.ds},function(a){isNaN(a)?a=0:0>a?a=0:1<a&&(a=1);var b=this.ds;b!==a&&(this.ds=a,this.N(),this.h("segmentFraction",b,a))});v.defineProperty(G,{TE:"segmentOffset"},function(){return this.fs},function(a){var b=this.fs;b.K(a)||(this.fs=a=a.S(),this.N(),this.h("segmentOffset",b,a))});v.defineProperty(G,{stretch:"stretch"},function(){return this.Qh},function(a){var b=this.Qh;b!==a&&(this.Qh=a,this.N(),this.h("stretch",b,a))}); +v.defineProperty(G,{name:"name"},function(){return this.Ob},function(a){var b=this.Ob;b!==a&&(this.Ob=a,null!==this.Y&&(this.Y.dm=null),this.h("name",b,a))});v.defineProperty(G,{opacity:"opacity"},function(){return this.Rc},function(a){var b=this.Rc;b!==a&&(v.j(a,"number",G,"opacity"),(0>a||1<a)&&v.va(a,"0 <= value <= 1",G,"opacity"),this.Rc=a,this.h("opacity",b,a),a=this.g,b=this.Y,null!==a&&null!==b&&a.pa(ek(b,b.U)))}); +v.defineProperty(G,{visible:"visible"},function(){return 0!==(this.fa&1)},function(a){var b=0!==(this.fa&1);b!==a&&(this.fa^=1,this.h("visible",b,a),b=this.R,null!==b?b.N():this instanceof R&&this.nd(a),this.pa(),Wm(this))});v.defineProperty(G,{Hg:"pickable"},function(){return 0!==(this.fa&2)},function(a){var b=0!==(this.fa&2);b!==a&&(this.fa^=2,this.h("pickable",b,a))}); +v.defineProperty(G,{TG:"fromLinkableDuplicates"},function(){return 0!==(this.fa&4)},function(a){var b=0!==(this.fa&4);b!==a&&(this.fa^=4,this.h("fromLinkableDuplicates",b,a))});v.defineProperty(G,{UG:"fromLinkableSelfNode"},function(){return 0!==(this.fa&8)},function(a){var b=0!==(this.fa&8);b!==a&&(this.fa^=8,this.h("fromLinkableSelfNode",b,a))}); +v.defineProperty(G,{JI:"toLinkableDuplicates"},function(){return 0!==(this.fa&16)},function(a){var b=0!==(this.fa&16);b!==a&&(this.fa^=16,this.h("toLinkableDuplicates",b,a))});v.defineProperty(G,{KI:"toLinkableSelfNode"},function(){return 0!==(this.fa&32)},function(a){var b=0!==(this.fa&32);b!==a&&(this.fa^=32,this.h("toLinkableSelfNode",b,a))}); +v.defineProperty(G,{Rf:"isPanelMain"},function(){return 0!==(this.fa&64)},function(a){var b=0!==(this.fa&64);b!==a&&(this.fa^=64,this.N(),this.h("isPanelMain",b,a))});v.defineProperty(G,{Gw:"isActionable"},function(){return 0!==(this.fa&128)},function(a){var b=0!==(this.fa&128);b!==a&&(this.fa^=128,this.h("isActionable",b,a))}); +v.defineProperty(G,{zm:"areaBackground"},function(){return this.nc},function(a){var b=this.nc;b!==a&&(a instanceof ha&&a.freeze(),this.nc=a,this.pa(),this.h("areaBackground",b,a))});v.defineProperty(G,{background:"background"},function(){return this.Ib},function(a){var b=this.Ib;b!==a&&(a instanceof ha&&a.freeze(),this.Ib=a,this.pa(),this.h("background",b,a))});function Pm(a,b){a.fa=b?a.fa|512:a.fa&-513}function Xm(a,b){a.fa=b?a.fa|1024:a.fa&-1025}function Qm(a,b){a.fa=b?a.fa|2048:a.fa&-2049} +function Rm(a,b){a.fa=b?a.fa|4096:a.fa&-4097}function fl(a){return 0!==(a.fa&8192)}function Sk(a,b){a.fa=b?a.fa|8192:a.fa&-8193}function gl(a){return 0!==(a.fa&16384)}function Im(a,b){a.fa=b?a.fa|16384:a.fa&-16385}v.u(G,{Y:"part"},function(){if(this instanceof R)return this;if(null!==this.im)return this.im;var a;for(a=this.R;a;){if(a instanceof R)return this.im=a;a=a.R}return null});v.u(G,{R:"panel"},function(){return this.Xg});G.prototype.Bl=function(a){this.Xg=a}; +v.u(G,{layer:"layer"},function(){var a=this.Y;return null!==a?a.layer:null},{configurable:!0});v.u(G,{g:"diagram"},function(){var a=this.Y;return null!==a?a.g:null},{configurable:!0});v.defineProperty(G,{position:"position"},function(){return this.kb},function(a){var b=this.kb;b.K(a)||(a=a.S(),this.oA(a,b)&&this.h("position",b,a))});G.prototype.oA=function(a){this.kb=a;Sm(this);this.si();return!0};G.prototype.ox=function(a,b){this.kb.m(a,b);Ym(this);this.si()};v.u(G,{U:"actualBounds"},function(){return this.mc}); +v.defineProperty(G,{scale:"scale"},function(){return this.Tb},function(a){var b=this.Tb;b!==a&&(0>=a&&v.k("GraphObject.scale for "+this+" must be greater than zero, not: "+a),this.Tb=a,this.si(),this.N(),this.h("scale",b,a))});v.defineProperty(G,{angle:"angle"},function(){return this.Kl},function(a){var b=this.Kl;b!==a&&(a%=360,0>a&&(a+=360),b!==a&&(this.Kl=a,this.N(),this.si(),this.h("angle",b,a)))}); +v.defineProperty(G,{za:"desiredSize"},function(){return this.mf},function(a){var b=a.width,c=a.height,d=this.mf,e=d.width,f=d.height;(e===b||isNaN(e)&&isNaN(b))&&(f===c||isNaN(f)&&isNaN(c))||(this.mf=a=a.S(),this.N(),this instanceof Y&&this.ce(),this.h("desiredSize",d,a),0!==(this.fa&1024)&&(a=this.Y,null!==a&&(Cm(this,a,"width"),Cm(this,a,"height"))))}); +v.defineProperty(G,{width:"width"},function(){return this.mf.width},function(a){if(this.mf.width!==a){var b=this.mf;this.mf=a=(new ia(a,this.mf.height)).freeze();this.N();this instanceof Y&&this.ce();this.h("desiredSize",b,a);b=this.Y;null!==b&&0!==(this.fa&1024)&&Cm(this,b,"width")}}); +v.defineProperty(G,{height:"height"},function(){return this.mf.height},function(a){if(this.mf.height!==a){var b=this.mf;this.mf=a=(new ia(this.mf.width,a)).freeze();this.N();this instanceof Y&&this.ce();this.h("desiredSize",b,a);b=this.Y;null!==b&&0!==(this.fa&1024)&&Cm(this,b,"height")}}); +v.defineProperty(G,{kh:"minSize"},function(){return this.Dj},function(a){var b=this.Dj;b.K(a)||(a=a.copy(),isNaN(a.width)&&(a.width=0),isNaN(a.height)&&(a.height=0),a.freeze(),this.Dj=a,this.N(),this.h("minSize",b,a))});v.defineProperty(G,{xf:"maxSize"},function(){return this.Bj},function(a){var b=this.Bj;b.K(a)||(a=a.copy(),isNaN(a.width)&&(a.width=Infinity),isNaN(a.height)&&(a.height=Infinity),a.freeze(),this.Bj=a,this.N(),this.h("maxSize",b,a))});v.u(G,{Ca:"measuredBounds"},function(){return this.jd}); +v.u(G,{Ha:"naturalBounds"},function(){return this.Qc},{configurable:!0});v.defineProperty(G,{margin:"margin"},function(){return this.kr},function(a){"number"===typeof a&&(a=new cb(a));var b=this.kr;b.K(a)||(this.kr=a=a.S(),this.N(),this.h("margin",b,a))});v.u(G,{transform:null},function(){0!==(this.fa&2048)===!0&&Nm(this);return this.ne});v.u(G,{Zg:null},function(){0!==(this.fa&4096)===!0&&Nm(this);return this.Up}); +v.defineProperty(G,{alignment:"alignment"},function(){return this.Ae},function(a){var b=this.Ae;b.K(a)||(a.se()&&!a.Uc()&&v.k("GraphObject.alignment for "+this+" must be a real Spot or Spot.Default, not: "+a),this.Ae=a=a.S(),Sm(this),this.h("alignment",b,a))});v.defineProperty(G,{column:"column"},function(){return this.bq},function(a){a=Math.round(a);var b=this.bq;b!==a&&(0>a&&v.va(a,">= 0",G,"column"),this.bq=a,this.N(),this.h("column",b,a))}); +v.defineProperty(G,{sG:"columnSpan"},function(){return this.ii},function(a){a=Math.round(a);var b=this.ii;b!==a&&(1>a&&v.va(a,">= 1",G,"columnSpan"),this.ii=a,this.N(),this.h("columnSpan",b,a))});v.defineProperty(G,{Wb:"row"},function(){return this.$r},function(a){a=Math.round(a);var b=this.$r;b!==a&&(0>a&&v.va(a,">= 0",G,"row"),this.$r=a,this.N(),this.h("row",b,a))}); +v.defineProperty(G,{rowSpan:"rowSpan"},function(){return this.Gi},function(a){a=Math.round(a);var b=this.Gi;b!==a&&(1>a&&v.va(a,">= 1",G,"rowSpan"),this.Gi=a,this.N(),this.h("rowSpan",b,a))});v.defineProperty(G,{sx:"spanAllocation"},function(){return this.us},function(a){var b=this.us;b!==a&&(null!==a&&v.j(a,"function",G,"spanAllocation"),this.us=a,this.h("spanAllocation",b,a))}); +v.defineProperty(G,{Uj:"alignmentFocus"},function(){return this.Tp},function(a){var b=this.Tp;b.K(a)||(!a.se()||a.Uc()||a.K(qb)&&this instanceof S||v.k("GraphObject.alignmentFocus must be a real Spot or Spot.Default, not: "+a),this.Tp=a=a.S(),this.N(),this.h("alignmentFocus",b,a))}); +v.defineProperty(G,{Rd:"portId"},function(){return this.Lr},function(a){var b=this.Lr;if(b!==a){var c=this.Y;null===c||c instanceof S||(v.k("Cannot set portID on a Link: "+a),c=null);null!==b&&null!==c&&Zm(c,this);this.Lr=a;if(null!==a&&c){c.Ch=!0;null===c.Wd&&$m(c);var d=this.Rd;null!==d&&c.Wd.add(d,this)}this.h("portId",b,a)}});function Wm(a){var b=a.Y;b instanceof S&&(a=a.g,null===a||a.la.ib||b.cf())} +v.defineProperty(G,{yb:"toSpot"},function(){return null!==this.ga?this.ga.Rj:qb},function(a){this.Me();var b=this.ga.Rj;b.K(a)||(a=a.S(),this.ga.Rj=a,this.h("toSpot",b,a),Wm(this))});v.defineProperty(G,{Gl:"toEndSegmentLength"},function(){return null!==this.ga?this.ga.Pj:10},function(a){this.Me();var b=this.ga.Pj;b!==a&&(0>a&&v.va(a,">= 0",G,"toEndSegmentLength"),this.ga.Pj=a,this.h("toEndSegmentLength",b,a),Wm(this))}); +v.defineProperty(G,{eu:"toEndSegmentDirection"},function(){return null!==this.ga?this.ga.Oj:Am},function(a){this.Me();var b=this.ga.Oj;b!==a&&(this.ga.Oj=a,this.h("toEndSegmentDirection",b,a),Wm(this))});v.defineProperty(G,{fu:"toShortLength"},function(){return null!==this.ga?this.ga.Qj:0},function(a){this.Me();var b=this.ga.Qj;b!==a&&(this.ga.Qj=a,this.h("toShortLength",b,a),Wm(this))}); +v.defineProperty(G,{fF:"toLinkable"},function(){return this.Bs},function(a){var b=this.Bs;b!==a&&(this.Bs=a,this.h("toLinkable",b,a))});v.defineProperty(G,{LI:"toMaxLinks"},function(){return this.Cs},function(a){var b=this.Cs;b!==a&&(0>a&&v.va(a,">= 0",G,"toMaxLinks"),this.Cs=a,this.h("toMaxLinks",b,a))});v.defineProperty(G,{xb:"fromSpot"},function(){return null!==this.ga?this.ga.qj:qb},function(a){this.Me();var b=this.ga.qj;b.K(a)||(a=a.S(),this.ga.qj=a,this.h("fromSpot",b,a),Wm(this))}); +v.defineProperty(G,{nl:"fromEndSegmentLength"},function(){return null!==this.ga?this.ga.oj:10},function(a){this.Me();var b=this.ga.oj;b!==a&&(0>a&&v.va(a,">= 0",G,"fromEndSegmentLength"),this.ga.oj=a,this.h("fromEndSegmentLength",b,a),Wm(this))});v.defineProperty(G,{lt:"fromEndSegmentDirection"},function(){return null!==this.ga?this.ga.nj:Am},function(a){this.Me();var b=this.ga.nj;b!==a&&(this.ga.nj=a,this.h("fromEndSegmentDirection",b,a),Wm(this))}); +v.defineProperty(G,{mt:"fromShortLength"},function(){return null!==this.ga?this.ga.pj:0},function(a){this.Me();var b=this.ga.pj;b!==a&&(this.ga.pj=a,this.h("fromShortLength",b,a),Wm(this))});v.defineProperty(G,{OD:"fromLinkable"},function(){return this.Eq},function(a){var b=this.Eq;b!==a&&(this.Eq=a,this.h("fromLinkable",b,a))}); +v.defineProperty(G,{uz:"fromMaxLinks"},function(){return this.Fq},function(a){var b=this.Fq;b!==a&&(0>a&&v.va(a,">= 0",G,"fromMaxLinks"),this.Fq=a,this.h("fromMaxLinks",b,a))});v.defineProperty(G,{cursor:"cursor"},function(){return this.mq},function(a){var b=this.mq;b!==a&&(v.j(a,"string",G,"cursor"),this.mq=a,this.h("cursor",b,a))}); +v.defineProperty(G,{click:"click"},function(){return null!==this.ha?this.ha.gi:null},function(a){xm(this);var b=this.ha.gi;b!==a&&(null!==a&&v.j(a,"function",G,"click"),this.ha.gi=a,this.h("click",b,a))});v.defineProperty(G,{at:"doubleClick"},function(){return null!==this.ha?this.ha.pi:null},function(a){xm(this);var b=this.ha.pi;b!==a&&(null!==a&&v.j(a,"function",G,"doubleClick"),this.ha.pi=a,this.h("doubleClick",b,a))}); +v.defineProperty(G,{fz:"contextClick"},function(){return null!==this.ha?this.ha.ji:null},function(a){xm(this);var b=this.ha.ji;b!==a&&(null!==a&&v.j(a,"function",G,"contextClick"),this.ha.ji=a,this.h("contextClick",b,a))});v.defineProperty(G,{Gt:"mouseEnter"},function(){return null!==this.ha?this.ha.wr:null},function(a){xm(this);var b=this.ha.wr;b!==a&&(null!==a&&v.j(a,"function",G,"mouseEnter"),this.ha.wr=a,this.h("mouseEnter",b,a))}); +v.defineProperty(G,{Ht:"mouseLeave"},function(){return null!==this.ha?this.ha.xr:null},function(a){xm(this);var b=this.ha.xr;b!==a&&(null!==a&&v.j(a,"function",G,"mouseLeave"),this.ha.xr=a,this.h("mouseLeave",b,a))});v.defineProperty(G,{Sz:"mouseOver"},function(){return null!==this.ha?this.ha.Ci:null},function(a){xm(this);var b=this.ha.Ci;b!==a&&(null!==a&&v.j(a,"function",G,"mouseOver"),this.ha.Ci=a,this.h("mouseOver",b,a))}); +v.defineProperty(G,{Rz:"mouseHover"},function(){return null!==this.ha?this.ha.Bi:null},function(a){xm(this);var b=this.ha.Bi;b!==a&&(null!==a&&v.j(a,"function",G,"mouseHover"),this.ha.Bi=a,this.h("mouseHover",b,a))});v.defineProperty(G,{Qz:"mouseHold"},function(){return null!==this.ha?this.ha.Ai:null},function(a){xm(this);var b=this.ha.Ai;b!==a&&(null!==a&&v.j(a,"function",G,"mouseHold"),this.ha.Ai=a,this.h("mouseHold",b,a))}); +v.defineProperty(G,{SH:"mouseDragEnter"},function(){return null!==this.ha?this.ha.ur:null},function(a){xm(this);var b=this.ha.ur;b!==a&&(null!==a&&v.j(a,"function",G,"mouseDragEnter"),this.ha.ur=a,this.h("mouseDragEnter",b,a))});v.defineProperty(G,{TH:"mouseDragLeave"},function(){return null!==this.ha?this.ha.vr:null},function(a){xm(this);var b=this.ha.vr;b!==a&&(null!==a&&v.j(a,"function",G,"mouseDragLeave"),this.ha.vr=a,this.h("mouseDragLeave",b,a))}); +v.defineProperty(G,{Pz:"mouseDrop"},function(){return null!==this.ha?this.ha.zi:null},function(a){xm(this);var b=this.ha.zi;b!==a&&(null!==a&&v.j(a,"function",G,"mouseDrop"),this.ha.zi=a,this.h("mouseDrop",b,a))});v.defineProperty(G,{aD:"actionDown"},function(){return null!==this.ha?this.ha.Np:null},function(a){xm(this);var b=this.ha.Np;b!==a&&(null!==a&&v.j(a,"function",G,"actionDown"),this.ha.Np=a,this.h("actionDown",b,a))}); +v.defineProperty(G,{bD:"actionMove"},function(){return null!==this.ha?this.ha.Op:null},function(a){xm(this);var b=this.ha.Op;b!==a&&(null!==a&&v.j(a,"function",G,"actionMove"),this.ha.Op=a,this.h("actionMove",b,a))});v.defineProperty(G,{cD:"actionUp"},function(){return null!==this.ha?this.ha.Pp:null},function(a){xm(this);var b=this.ha.Pp;b!==a&&(null!==a&&v.j(a,"function",G,"actionUp"),this.ha.Pp=a,this.h("actionUp",b,a))}); +v.defineProperty(G,{$C:"actionCancel"},function(){return null!==this.ha?this.ha.Mp:null},function(a){xm(this);var b=this.ha.Mp;b!==a&&(null!==a&&v.j(a,"function",G,"actionCancel"),this.ha.Mp=a,this.h("actionCancel",b,a))});v.defineProperty(G,{xA:"toolTip"},function(){return null!==this.ha?this.ha.Ji:null},function(a){xm(this);var b=this.ha.Ji;b!==a&&(null!==a&&v.A(a,Vg,G,"toolTip"),this.ha.Ji=a,this.h("toolTip",b,a))}); +v.defineProperty(G,{contextMenu:"contextMenu"},function(){return null!==this.ha?this.ha.ki:null},function(a){xm(this);var b=this.ha.ki;b!==a&&(null!==a&&v.A(a,Vg,G,"contextMenu"),this.ha.ki=a,this.h("contextMenu",b,a))});G.prototype.bind=G.prototype.bind=function(a){a.pg=this;var b=this.Uo();null!==b&&an(b)&&v.k("Cannot add a Binding to a template that has already been copied: "+a);null===this.sc&&(this.sc=new I(Ag));this.sc.add(a)}; +G.prototype.findTemplateBinder=G.prototype.Uo=function(){for(var a=this instanceof D?this:this.R;null!==a;){if(null!==a.uk)return a;a=a.R}return null};G.prototype.setProperties=function(a){v.Xt(this,a)};var bn; +G.make=bn=function(a,b){var c=arguments,d=null,e=null;if("function"===typeof a)e=a;else if("string"===typeof a){var f=cn.ja(a);"function"===typeof f?(c=v.fl(arguments),d=f(c)):e=ea[a]}null===d&&(void 0===e&&(d=window.$,void 0!==d&&void 0!==d.noop&&v.k("GraphObject.make failed to complete. Is it conflicting with another $ var? (such as jQuery)"),v.k("GraphObject.make failed to complete, it may be conflicting with another var.")),null!==e&&e.constructor||v.k("GraphObject.make requires a class function or class name, not: "+ +a),d=new e);f=1;if(d instanceof E&&1<c.length){var h=d,e=c[1];if("string"===typeof e||e instanceof HTMLDivElement)uk(h,e),f++}for(;f<c.length;f++)e=c[f],void 0===e?v.k("Undefined value at argument "+f+" for object being constructed by GraphObject.make: "+d):dn(d,e);return d}; +function dn(a,b){if("string"===typeof b)if(a instanceof bh)a.text=b;else if(a instanceof Y)a.Ab=b;else if(a instanceof ok)a.source=b;else if(a instanceof D){var c=ra(D,b);null!==c?a.type=c:v.k("Unknown Panel type as an argument to GraphObject.make: "+b)}else a instanceof ha?(c=ra(ha,b),null!==c?a.type=c:v.k("Unknown Brush type as an argument to GraphObject.make: "+b)):a instanceof ve?(c=ra(ve,b),null!==c?a.type=c:v.k("Unknown Geometry type as an argument to GraphObject.make: "+b)):a instanceof wf? +(c=ra(wf,b),null!==c?a.type=c:v.k("Unknown PathSegment type as an argument to GraphObject.make: "+b)):v.k("Unable to use a string as an argument to GraphObject.make: "+b);else if(b instanceof G)c=b,a instanceof D||v.k("A GraphObject can only be added to a Panel, not to: "+a),a.add(c);else if(b instanceof ug){var d=b,c=a,e;d.de&&c.getRowDefinition?e=c.getRowDefinition(d.index):!d.de&&c.getColumnDefinition?e=c.getColumnDefinition(d.index):v.k("A RowColumnDefinition can only be added to a Panel, not to: "+ +a);e.Zs(d)}else if(b instanceof fa)a instanceof W&&b.qe===W?2===(b.value&2)?a.ix=b:b===Ni||b===Fi||b===Ei?a.Ke=b:b===en||b===fn||b===gn?a.Qs=b:b!==hn&&b!==Gi&&v.k("Unknown Link enum value for a Link property: "+b):a instanceof D&&b.qe===D?a.type=b:a instanceof bh&&b.qe===bh?a.vF=b:a instanceof Y&&(b===Ti||b===Vi||b===Wi||b===um)?a.vz=b:a instanceof ok&&(b===Ti||b===Vi||b===Wi)?a.hH=b:a instanceof G&&b.qe===W?(c=a,0===b.name.indexOf("Orient")?c.Vt=b:v.k("Unknown Link enum value for GraphObject.segmentOrientation property: "+ +b)):a instanceof G&&b.qe===G?a.stretch=b:a instanceof ug&&b.qe===ug?a.au=b:a instanceof E&&b.qe===E?a.cl=b:a instanceof ha&&b.qe===ha?a.type=b:a instanceof ve&&b.qe===ve?a.type=b:a instanceof wf&&b.qe===wf?a.type=b:a instanceof Ag&&b.qe===Ag?a.mode=b:a instanceof zf&&b.qe===zf?a.wc=b:a instanceof Z&&b.qe===Z?0===b.name.indexOf("Alignment")?a.alignment=b:0===b.name.indexOf("Arrangement")?a.Nf=b:0===b.name.indexOf("Compaction")?a.compaction=b:0===b.name.indexOf("Path")?a.path=b:0===b.name.indexOf("Sorting")? +a.sorting=b:0===b.name.indexOf("Style")?a.OI=b:v.k("Unknown enum value: "+b):a instanceof jn&&b.qe===jn?0===b.name.indexOf("Aggressive")?a.fG=b:0===b.name.indexOf("Cycle")?a.BG=b:0===b.name.indexOf("Init")?a.mH=b:0===b.name.indexOf("Layer")?a.AH=b:v.k("Unknown enum value: "+b):a instanceof nm&&b.qe===nm?b===kn||b===ln||b===mn||b===nn?a.sorting=b:b===on||b===pn?a.Nf=b:b===qn||b===rn?a.alignment=b:v.k("Unknown enum value: "+b):a instanceof sn&&b.qe===sn?b===tn||b===xn||b===zn||b===An||b===Bn?a.sorting= +b:b===Cn||b===Dn||b===En||b===Fn?a.direction=b:b===Gn||b===Hn||b===In||b===Jn?a.Nf=b:b===Kn||b===Ln?a.Sw=b:v.k("Unknown enum value: "+b):v.k("No property to set for this enum value: "+b);else if(b instanceof Ag)a instanceof G?a.bind(b):a instanceof ug?a.bind(b):v.k("A Binding can only be applied to a GraphObject or RowColumnDefinition, not to: "+a);else if(b instanceof Ge)a instanceof ve?a.Ub.add(b):v.k("A PathFigure can only be added to a Geometry, not to: "+a);else if(b instanceof wf)a instanceof +Ge?a.sb.add(b):v.k("A PathSegment can only be added to a PathFigure, not to: "+a);else if(b instanceof Zf)a instanceof E?a.Pb=b:a instanceof V?a.Pb=b:v.k("A Layout can only be assigned to a Diagram or a Group, not to: "+a);else if(Array.isArray(b))for(c=0;c<b.length;c++)dn(a,b[c]);else if("object"===typeof b&&null!==b)if(a instanceof ha){e=new ta;for(c in b)d=parseFloat(c),isNaN(d)?e[c]=b[c]:a.addColorStop(d,b[c]);v.Xt(a,e)}else if(a instanceof ug){void 0!==b.row?(e=b.row,(void 0===e||null===e||Infinity=== +e||isNaN(e)||0>e)&&v.k("Must specify non-negative integer row for RowColumnDefinition "+b+", not: "+e),a.de=!0,a.index=e):void 0!==b.column&&(e=b.column,(void 0===e||null===e||Infinity===e||isNaN(e)||0>e)&&v.k("Must specify non-negative integer column for RowColumnDefinition "+b+", not: "+e),a.de=!1,a.index=e);e=new ta;for(c in b)"row"!==c&&"column"!==c&&(e[c]=b[c]);v.Xt(a,e)}else v.Xt(a,b);else v.k('Unknown initializer "'+b+'" for object being constructed by GraphObject.make: '+a)} +var cn=new na("string","function");G.getBuilders=function(){var a=new na("string","function"),b;for(b in cn)if(b!==b.toLowerCase()){var c=cn[b];"function"===typeof c&&a.add(b,c)}a.freeze();return a};var Mn;G.defineBuilder=Mn=function(a,b){v.j(a,"string",G,"defineBuilder:name");v.j(b,"function",G,"defineBuilder:func");var c=a.toLowerCase();""!==a&&"none"!==c&&a!==c||v.k("Shape.defineFigureGenerator name must not be empty or None or all-lower-case: "+a);cn.add(a,b)};var Nn; +G.takeBuilderArgument=Nn=function(a,b,c){void 0===c&&(c=null);var d=a[1];if("function"===typeof c?c(d):"string"===typeof d)return a.splice(1,1),d;if(void 0===b)throw Error("no "+("function"===typeof c?"satisfactory":"string")+" argument for GraphObject builder "+a[0]);return b}; +Mn("Button",function(){var a=new ha(Vf);a.addColorStop(0,"white");a.addColorStop(1,"lightgray");var b=new ha(Vf);b.addColorStop(0,"white");b.addColorStop(1,"dodgerblue");a=bn(D,wk,{Gw:!0},{_buttonFillNormal:a,_buttonStrokeNormal:"gray",_buttonFillOver:b,_buttonStrokeOver:"blue"},bn(Y,{name:"ButtonBorder",Ab:"Rectangle",B:new L(0,0,2.761423749153968,2.761423749153968),C:new L(1,1,-2.761423749153968,-2.761423749153968),fill:a,stroke:"gray"}));a.Gt=function(a,b){var e=b.be("ButtonBorder");if(e instanceof +Y){var f=b._buttonFillOver;b._buttonFillNormal=e.fill;e.fill=f;f=b._buttonStrokeOver;b._buttonStrokeNormal=e.stroke;e.stroke=f}};a.Ht=function(a,b){var e=b.be("ButtonBorder");e instanceof Y&&(e.fill=b._buttonFillNormal,e.stroke=b._buttonStrokeNormal)};return a}); +Mn("TreeExpanderButton",function(){var a=bn("Button",{_treeExpandedFigure:"MinusLine",_treeCollapsedFigure:"PlusLine"},bn(Y,{name:"ButtonIcon",Ab:"MinusLine",za:rd},(new Ag("figure","isTreeExpanded",function(a,c){var d=c.R;return a?d._treeExpandedFigure:d._treeCollapsedFigure})).Tw()),{visible:!1},(new Ag("visible","isTreeLeaf",function(a){return!a})).Tw());a.click=function(a,c){var d=c.Y;d instanceof Vg&&(d=d.Mf);if(d instanceof S){var e=d.g;if(null!==e){e=e.nb;if(d.md){if(!e.canCollapseTree(d))return}else if(!e.canExpandTree(d))return; +a.zc=!0;d.md?e.collapseTree(d):e.expandTree(d)}}};return a}); +Mn("SubGraphExpanderButton",function(){var a=bn("Button",{_subGraphExpandedFigure:"MinusLine",_subGraphCollapsedFigure:"PlusLine"},bn(Y,{name:"ButtonIcon",Ab:"MinusLine",za:rd},(new Ag("figure","isSubGraphExpanded",function(a,c){var d=c.R;return a?d._subGraphExpandedFigure:d._subGraphCollapsedFigure})).Tw()));a.click=function(a,c){var d=c.Y;d instanceof Vg&&(d=d.Mf);if(d instanceof V){var e=d.g;if(null!==e){e=e.nb;if(d.ee){if(!e.canCollapseSubGraph(d))return}else if(!e.canExpandSubGraph(d))return;a.zc= +!0;d.ee?e.collapseSubGraph(d):e.expandSubGraph(d)}}};return a});Mn("ContextMenuButton",function(){var a=bn("Button");a.stretch=wm;var b=a.be("ButtonBorder");b instanceof Y&&(b.Ab="Rectangle",b.B=new L(0,0,2,3),b.C=new L(1,1,-2,-2));return a}); +Mn("PanelExpanderButton",function(a){var b=Nn(a,"COLLAPSIBLE");a=bn("Button",bn(Y,"TriangleUp",{za:new ia(6,4)},(new Ag("figure","visible",function(a){return a?"TriangleUp":"TriangleDown"})).Tw(b)));var c=a.be("ButtonBorder");c instanceof Y&&(c.stroke=null,c.fill="transparent");a.click=function(a,c){var f=c.g;if(null!==f&&!f.ab){var h=c.Y.be(b);null!==h&&(f.Qb("Collapse/Expand Panel"),h.visible=!h.visible,f.wd("Collapse/Expand Panel"))}};return a}); +Mn("CheckBoxButton",function(a){var b=Nn(a);a=bn("Button",{"ButtonBorder.fill":"white","ButtonBorder.stroke":"gray",width:14,height:14},bn(Y,{name:"ButtonIcon",VG:"M0 4 L3 9 9 0",lb:2,stretch:He,vz:Vi,visible:!1},""!==b?(new Ag("visible",b)).IH():[]));a.click=function(a,d){if(!(a.g.ab||""!==b&&a.g.ba.ab)){a.zc=!0;var e=d.be("ButtonIcon");e.g.Qb("checkbox");e.visible=!e.visible;"function"===typeof d._doClick&&d._doClick(a,d);e.g.wd("checkbox")}};return a}); +Mn("CheckBox",function(a){a=Nn(a);a=bn("CheckBoxButton",a,{name:"Button",margin:new cb(0,1,0,0)});var b=bn(D,"Horizontal",a,{Gw:!0,margin:1,_buttonFillNormal:a._buttonFillNormal,_buttonStrokeNormal:a._buttonStrokeNormal,_buttonFillOver:a._buttonFillOver,_buttonStrokeOver:a._buttonStrokeOver,Gt:a.Gt,Ht:a.Ht,click:a.click,_buttonClick:a.click});a.Gt=null;a.Ht=null;a.click=null;return b}); +function ym(){this.ki=this.Ji=this.Mp=this.Pp=this.Op=this.Np=this.zi=this.vr=this.ur=this.Ai=this.Bi=this.Ci=this.xr=this.wr=this.ji=this.pi=this.gi=null}ym.prototype.copy=function(){var a=new ym;a.gi=this.gi;a.pi=this.pi;a.ji=this.ji;a.wr=this.wr;a.xr=this.xr;a.Ci=this.Ci;a.Bi=this.Bi;a.Ai=this.Ai;a.ur=this.ur;a.vr=this.vr;a.zi=this.zi;a.Np=this.Np;a.Op=this.Op;a.Pp=this.Pp;a.Mp=this.Mp;a.Ji=this.Ji;a.ki=this.ki;return a}; +function D(a){G.call(this);void 0===a?0===arguments.length?this.ia=Yi:v.k("invalid argument to Panel constructor: undefined"):(v.pb(a,D,D,"type"),this.ia=a);this.ya=new I(G);this.Ue=cd;this.Qg=!1;this.ia===zk&&(this.Qg=!0);this.Oq=!1;this.qq=fc;this.ni=um;this.ia===Tm&&On(this);this.Fo=Vi;this.Jq=td;this.Kq=ad;this.uk=this.je=null;this.br=NaN;this.hg=this.vj=null;this.Wn="category";this.gg=null;this.Li=new A(NaN,NaN,NaN,NaN);this.sm=null;this.Ch=!1;this.as=null}v.Ja(D,G);v.Vh(D);v.ea("Panel",D); +function On(a){a.kj=cd;a.zh=1;a.mi=null;a.Ql=null;a.yh=1;a.xh=null;a.Pl=null;a.Hd=[];a.Dd=[];a.nm=Pn;a.Ol=Pn;a.Ki=0;a.wi=0} +D.prototype.cloneProtected=function(a){G.prototype.cloneProtected.call(this,a);a.ia=this.ia;a.Ue=this.Ue.S();a.Qg=this.Qg;a.Oq=this.Oq;a.qq=this.qq.S();a.ni=this.ni;if(a.ia===Tm){a.kj=this.kj.S();a.zh=this.zh;a.mi=this.mi;a.Ql=this.Ql;a.yh=this.yh;a.xh=this.xh;a.Pl=this.Pl;var b=[];if(0<this.Hd.length)for(var c=this.Hd,d=c.length,e=0;e<d;e++)if(void 0!==c[e]){var f=c[e].copy();f.Bl(a);b[e]=f}a.Hd=b;b=[];if(0<this.Dd.length)for(c=this.Dd,d=c.length,e=0;e<d;e++)void 0!==c[e]&&(f=c[e].copy(),f.Bl(a), +b[e]=f);a.Dd=b;a.nm=this.nm;a.Ol=this.Ol;a.Ki=this.Ki;a.wi=this.wi}a.Fo=this.Fo;a.Jq=this.Jq.S();a.Kq=this.Kq.S();a.je=this.je;a.uk=this.uk;a.br=this.br;a.vj=this.vj;a.hg=this.hg;a.Wn=this.Wn;a.Li.assign(this.Li);a.Ch=this.Ch;null!==this.as&&(a.as=this.as)};D.prototype.Wh=function(a){G.prototype.Wh.call(this,a);a.ya=this.ya;for(var b=a.ya.n,c=b.length,d=0;d<c;d++)b[d].Xg=a;a.sm=null}; +D.prototype.copy=function(){var a=G.prototype.copy.call(this);if(null!==a){for(var b=this.ya.n,c=b.length,d=0;d<c;d++){var e=b[d].copy(),f=a;e.Bl(f);e.im=null;var h=f.ya,k=h.count;h.yd(k,e);h=f.Y;if(null!==h){h.dm=null;null!==e.Rd&&h instanceof S&&(h.Ch=!0);var l=f.g;null!==l&&l.la.ib||h.Lc(Cf,"elements",f,null,e,null,k)}}return a}return null};D.prototype.toString=function(){return"Panel("+this.type+")#"+v.ld(this)};var Yi;D.Position=Yi=v.p(D,"Position",0);D.Horizontal=v.p(D,"Horizontal",1);var vk; +D.Vertical=vk=v.p(D,"Vertical",2);var Ri;D.Spot=Ri=v.p(D,"Spot",3);var wk;D.Auto=wk=v.p(D,"Auto",4);var Tm;D.Table=Tm=v.p(D,"Table",5);D.Viewbox=v.p(D,"Viewbox",6);var Km;D.TableRow=Km=v.p(D,"TableRow",7);var Lm;D.TableColumn=Lm=v.p(D,"TableColumn",8);var Di;D.Link=Di=v.p(D,"Link",9);var zk;D.Grid=zk=v.p(D,"Grid",10); +v.defineProperty(D,{type:"type"},function(){return this.ia},function(a){var b=this.ia;b!==a&&(b!==Km&&b!==Lm||v.k("Cannot change Panel.type when it is already a TableRow or a TableColumn: "+a),this.ia=a,this.ia===zk?this.Qg=!0:this.ia===Tm&&On(this),this.N(),this.h("type",b,a))});v.u(D,{elements:"elements"},function(){return this.ya.i});v.u(D,{Ha:"naturalBounds"},function(){return this.Qc}); +v.defineProperty(D,{padding:"padding"},function(){return this.Ue},function(a){"number"===typeof a?(0>a&&v.va(a,">= 0",D,"padding"),a=new cb(a)):(v.A(a,cb,D,"padding"),0>a.left&&v.va(a.left,">= 0",D,"padding:value.left"),0>a.right&&v.va(a.right,">= 0",D,"padding:value.right"),0>a.top&&v.va(a.top,">= 0",D,"padding:value.top"),0>a.bottom&&v.va(a.bottom,">= 0",D,"padding:value.bottom"));var b=this.Ue;b.K(a)||(this.Ue=a=a.S(),this.N(),this.h("padding",b,a))}); +v.defineProperty(D,{hl:"defaultAlignment"},function(){return this.qq},function(a){var b=this.qq;b.K(a)||(this.qq=a=a.S(),this.N(),this.h("defaultAlignment",b,a))});v.defineProperty(D,{Jd:"defaultStretch"},function(){return this.ni},function(a){var b=this.ni;b!==a&&(v.pb(a,G,D,"defaultStretch"),this.ni=a,this.N(),this.h("defaultStretch",b,a))}); +v.defineProperty(D,{IJ:"defaultSeparatorPadding"},function(){return void 0===this.kj?cd:this.kj},function(a){if(void 0!==this.kj){"number"===typeof a&&(a=new cb(a));var b=this.kj;b.K(a)||(this.kj=a=a.S(),this.h("defaultSeparatorPadding",b,a))}}); +v.defineProperty(D,{GJ:"defaultRowSeparatorStroke"},function(){return void 0===this.mi?null:this.mi},function(a){var b=this.mi;b!==a&&(null===a||"string"===typeof a||a instanceof ha)&&(a instanceof ha&&a.freeze(),this.mi=a,this.h("defaultRowSeparatorStroke",b,a))});v.defineProperty(D,{HJ:"defaultRowSeparatorStrokeWidth"},function(){return void 0===this.zh?1:this.zh},function(a){if(void 0!==this.zh){var b=this.zh;b!==a&&isFinite(a)&&0<=a&&(this.zh=a,this.h("defaultRowSeparatorStrokeWidth",b,a))}}); +v.defineProperty(D,{FJ:"defaultRowSeparatorDashArray"},function(){return void 0===this.Ql?null:this.Ql},function(a){if(void 0!==this.Ql){var b=this.Ql;if(b!==a){null===a||Array.isArray(a)||v.Cd(a,"Array",D,"defaultRowSeparatorDashArray:value");if(null!==a){for(var c=a.length,d=0,e=0;e<c;e++){var f=a[e];"number"===typeof f&&0<=f&&isFinite(f)||v.k("defaultRowSeparatorDashArray value "+f+" at index "+e+" must be a positive number or zero.");d+=f}if(0===d){if(null===b)return;a=null}}this.Ql=a;this.pa(); +this.h("defaultRowSeparatorDashArray",b,a)}}});v.defineProperty(D,{AJ:"defaultColumnSeparatorStroke"},function(){return void 0===this.xh?null:this.xh},function(a){if(void 0!==this.xh){var b=this.xh;b!==a&&(null===a||"string"===typeof a||a instanceof ha)&&(a instanceof ha&&a.freeze(),this.xh=a,this.h("defaultColumnSeparatorStroke",b,a))}}); +v.defineProperty(D,{BJ:"defaultColumnSeparatorStrokeWidth"},function(){return void 0===this.yh?1:this.yh},function(a){if(void 0!==this.yh){var b=this.yh;b!==a&&isFinite(a)&&0<=a&&(this.yh=a,this.h("defaultColumnSeparatorStrokeWidth",b,a))}}); +v.defineProperty(D,{zJ:"defaultColumnSeparatorDashArray"},function(){return void 0===this.Pl?null:this.Pl},function(a){if(void 0!==this.Pl){var b=this.Pl;if(b!==a){null===a||Array.isArray(a)||v.Cd(a,"Array",D,"defaultColumnSeparatorDashArray:value");if(null!==a){for(var c=a.length,d=0,e=0;e<c;e++){var f=a[e];"number"===typeof f&&0<=f&&isFinite(f)||v.k("defaultColumnSeparatorDashArray value "+f+" at index "+e+" must be a positive number or zero.");d+=f}if(0===d){if(null===b)return;a=null}}this.Pl= +a;this.pa();this.h("defaultColumnSeparatorDashArray",b,a)}}});v.defineProperty(D,{RK:"viewboxStretch"},function(){return this.Fo},function(a){var b=this.Fo;b!==a&&(v.pb(a,G,D,"viewboxStretch"),this.Fo=a,this.h("viewboxStretch",b,a))}); +v.defineProperty(D,{Fw:"gridCellSize"},function(){return this.Jq},function(a){var b=this.Jq;b.K(a)||(v.A(a,ia,D,"gridCellSize"),a.G()&&0!==a.width&&0!==a.height||v.k("Invalid Panel.gridCellSize: "+a),this.Jq=a.S(),null!==this.g&&this===this.g.$o&&$k(this.g),this.pa(),this.h("gridCellSize",b,a))}); +v.defineProperty(D,{TD:"gridOrigin"},function(){return this.Kq},function(a){var b=this.Kq;b.K(a)||(v.A(a,z,D,"gridOrigin"),a.G()||v.k("Invalid Panel.gridOrigin: "+a),this.Kq=a.S(),null!==this.g&&$k(this.g),this.pa(),this.h("gridOrigin",b,a))});g=D.prototype;g.xv=function(a){G.prototype.xv.call(this,a);for(var b=this.ya.n,c=b.length,d=0;d<c;d++)b[d].xv(a)}; +g.Yj=function(a,b){if(this.ia===zk){var c=this.Ti()*b.scale;0>=c&&(c=1);var d=this.Fw,e=d.width,d=d.height,f=this.Ha,h=f.width,f=f.height,k=Math.ceil(h/e),l=Math.ceil(f/d),m=this.TD;a.save();a.beginPath();a.rect(0,0,h,f);a.clip();for(var n=[],p=this.ya.n,q=p.length,r=0;r<q;r++){var s=p[r],t=[];n.push(t);if(s.visible)for(var s=zl(s.Ab),u=r+1;u<q;u++){var x=p[u];x.visible&&zl(x.Ab)===s&&(x=x.interval,2<=x&&t.push(x))}}p=this.ya.n;q=p.length;for(r=0;r<q;r++){var w=p[r];if(w.visible&&(t=w.interval,!(2> +e*t*c))){var s=n[r],u=!1,y=!0,B=w.dF;null!==B&&(u=!0,y=a.pz(B,w.le));if("LineV"===w.Ab){a.lineWidth=w.lb;Om(this,a,w.stroke,!1,!1);a.beginPath();for(var H=x=Math.floor(-m.x/e);H<=x+k;H++){var C=H*e+m.x;0<=C&&C<h&&Qn(H,t,s)&&(u&&!y?Bm(a,C,0,C,f,B,w.le):(a.moveTo(C,0),a.lineTo(C,f)))}a.stroke()}else if("LineH"===w.Ab){a.lineWidth=w.lb;Om(this,a,w.stroke,!1,!1);a.beginPath();for(H=x=Math.floor(-m.y/d);H<=x+l;H++)C=H*d+m.y,0<=C&&C<=f&&Qn(H,t,s)&&(u&&!y?Bm(a,0,C,h,C,B,w.le):(a.moveTo(0,C),a.lineTo(h,C))); +a.stroke()}else if("BarV"===w.Ab)for(Om(this,a,w.fill,!0,!1),w=w.width,isNaN(w)&&(w=e),H=x=Math.floor(-m.x/e);H<=x+k;H++)C=H*e+m.x,0<=C&&C<h&&Qn(H,t,s)&&a.fillRect(C,0,w,f);else if("BarH"===w.Ab)for(Om(this,a,w.fill,!0,!1),w=w.height,isNaN(w)&&(w=d),H=x=Math.floor(-m.y/d);H<=x+l;H++)C=H*d+m.y,0<=C&&C<=f&&Qn(H,t,s)&&a.fillRect(0,C,h,w);u&&a.nz()}}a.restore();Zc(a,!1)}else{this.ia===Tm&&(a.lineCap="butt",Rn(this,a,!0,this.Hd,!0),Rn(this,a,!1,this.Dd,!0),Sn(this,a,!0,this.Hd),Sn(this,a,!1,this.Dd),Rn(this, +a,!0,this.Hd,!1),Rn(this,a,!1,this.Dd,!1));(c=this.bE)&&a.save();e=this.Ye();d=this.ya.n;h=d.length;for(f=0;f<h;f++)k=d[f],c&&k===e&&(a.pw=!0),k.Xe(a,b),c&&k===e&&(a.pw=!1);c&&(a.restore(),Zc(a,!0))}}; +function Sn(a,b,c,d){for(var e=d.length,f=a.U,h=c?a.Md(0):a.Ld(0),k=0;k<e;k++){var l=d[k];if(void 0!==l&&l!==h&&0!==l.Ia){if(c){if(l.position>f.height)continue}else if(l.position>f.width)continue;var m=l.Ep;isNaN(m)&&(m=c?a.zh:a.yh);var n=l.Dp;null===n&&(n=c?a.mi:a.xh);if(0!==m&&null!==n){Om(a,b,n,!1,!1);var n=!1,p=!0,q=l.wI;null!==q&&(n=!0,void 0!==b.setLineDash?(b.setLineDash(q),b.lineDashOffset=a.le):void 0!==b.webkitLineDash?(b.webkitLineDash=q,b.webkitLineDashOffset=a.le):void 0!==b.mozDash? +(b.mozDash=q,b.mozDashOffset=a.le):p=!1);b.beginPath();var r=l.position+m;c?r>f.height&&(m-=r-f.height):r>f.width&&(m-=r-f.width);l=l.position+m/2;b.lineWidth=m;r=a.padding;c?(l+=r.top,m=r.left,r=f.width-r.right,n&&!p?Bm(b,m,l,r,l,q,0):(b.moveTo(m,l),b.lineTo(r,l))):(l+=r.left,m=r.top,r=f.height-r.bottom,n&&!p?Bm(b,l,m,l,r,q,0):(b.moveTo(l,m),b.lineTo(l,r)));b.stroke();n&&(void 0!==b.setLineDash?(b.setLineDash(v.hj),b.lineDashOffset=0):void 0!==b.webkitLineDash?(b.webkitLineDash=v.hj,b.webkitLineDashOffset= +0):void 0!==b.mozDash&&(b.mozDash=null,b.mozDashOffset=0))}}}} +function Rn(a,b,c,d,e){for(var f=d.length,h=a.U,k=0;k<f;k++){var l=d[k];if(void 0!==l&&null!==l.background&&l.kz!==e&&0!==l.Ia){var m=c?h.height:h.width;if(!(l.position>m)){var n=l.Ie(),p=l.Ep;isNaN(p)&&(p=c?a.zh:a.yh);var q=l.Dp;null===q&&(q=c?a.mi:a.xh);null===q&&(p=0);n-=p;p=l.position+p;n+=l.Ia;p+n>m&&(n=m-p);0>=n||(m=a.padding,Om(a,b,l.background,!0,!1),c?b.fillRect(m.left,p+m.top,h.width-(m.left+m.right),n):b.fillRect(p+m.left,m.top,n,h.height-(m.top+m.bottom)))}}}} +function Qn(a,b,c){if(0!==a%b)return!1;b=c.length;for(var d=0;d<b;d++)if(0===a%c[d])return!1;return!0}function zl(a){return"LineV"===a||"BarV"===a} +g.Zo=function(a,b,c,d,e){var f=this.Lg(),h=this.transform,k=1/(h.m11*h.m22-h.m12*h.m21),l=h.m22*k,m=-h.m12*k,n=-h.m21*k,p=h.m11*k,q=k*(h.m21*h.dy-h.m22*h.dx),r=k*(h.m12*h.dx-h.m11*h.dy);if(null!==this.zm)return h=this.U,ge(h.left,h.top,h.right,h.bottom,a,b,c,d,e);if(null!==this.background)f=a*l+b*n+q,k=a*m+b*p+r,a=c*l+d*n+q,c=c*m+d*p+r,e.m(0,0),d=this.Ha,c=ge(0,0,d.width,d.height,f,k,a,c,e),e.transform(h);else{f||(l=1,n=m=0,p=1,r=q=0);k=a*l+b*n+q;a=a*m+b*p+r;l=c*l+d*n+q;d=c*m+d*p+r;e.m(l,d);m=(l- +k)*(l-k)+(d-a)*(d-a);c=!1;p=this.ya.n;r=p.length;n=v.L();for(q=0;q<r;q++)b=p[q],b.visible&&b.Zo(k,a,l,d,n)&&(c=!0,b=(k-n.x)*(k-n.x)+(a-n.y)*(a-n.y),b<m&&(m=b,e.set(n)));v.v(n);f&&e.transform(h)}return c};g.N=function(a){G.prototype.N.call(this,a);this.ia===wk&&(a=this.Ye(),null!==a&&a.N(!0));a=this.ya.n;for(var b=a.length,c=0;c<b;c++){var d=a[c];!0!==fl(d)&&(d.za.G()||(d instanceof Si||d instanceof D||d instanceof bh||Gm(d,!1)!==Ti)&&d.N(!0))}}; +g.ep=function(){if(!1===fl(this)){Sk(this,!0);Im(this,!0);for(var a=this.ya.n,b=a.length,c=0;c<b;c++)a[c].ep()}};g.si=function(){if(0!==(this.fa&2048)===!1){Qm(this,!0);Rm(this,!0);for(var a=this.ya.n,b=a.length,c=0;c<b;c++)a[c].Bz()}};g.Bz=function(){Rm(this,!0);for(var a=this.ya.n,b=a.length,c=0;c<b;c++)a[c].Bz()}; +g.mp=function(a,b,c,d){var e=this.Li;e.width=0;e.height=0;var f=this.za,h=this.kh;void 0===c&&(c=h.width,d=h.height);c=Math.max(c,h.width);d=Math.max(d,h.height);var k=this.xf;isNaN(f.width)||(a=Math.min(f.width,k.width));isNaN(f.height)||(b=Math.min(f.height,k.height));a=Math.max(c,a);b=Math.max(d,b);var l=this.padding;a=Math.max(a-l.left-l.right,0);b=Math.max(b-l.top-l.bottom,0);var m=this.ya.n;if(0!==m.length){var n=this.ia.Ob;switch(n){case "Position":var p=a,q=b,r=c,s=d,t=m.length;e.x=0;e.y= +0;e.width=0;for(var u=e.height=0;u<t;u++){var x=m[u];if(x.visible||x===this.bc){var w=x.margin,y=w.right+w.left,B=w.top+w.bottom;lj(x,p,q,r,s);var H=x.Ca,C=Math.max(H.width+y,0),T=Math.max(H.height+B,0),ba=x.position.x,U=x.position.y;isFinite(ba)||(ba=0);isFinite(U)||(U=0);if(x instanceof Y){var M=x;if(M.dE)var aa=M.lb/2,ba=ba-aa,U=U-aa}$a(e,ba,U,C,T)}}break;case "Vertical":for(var Ia=a,oa=c,Ga=m.length,pa=v.jb(),Ca=0;Ca<Ga;Ca++){var ua=m[Ca];if(ua.visible||ua===this.bc){var gc=Gm(ua,!1);if(gc!== +Ti&&gc!==vm)pa.push(ua);else{var ud=ua.margin,vd=ud.right+ud.left,Le=ud.top+ud.bottom;lj(ua,Ia,Infinity,oa,0);var Wb=ua.Ca,Jg=Math.max(Wb.width+vd,0),wd=Math.max(Wb.height+Le,0);e.width=Math.max(e.width,Jg);e.height+=wd}}}var ob=pa.length;if(0!==ob){this.za.width?Ia=Math.min(this.za.width,this.xf.width):0!==e.width&&(Ia=Math.min(e.width,this.xf.width));for(Ca=0;Ca<ob;Ca++)if(ua=pa[Ca],ua.visible||ua===this.bc)ud=ua.margin,vd=ud.right+ud.left,Le=ud.top+ud.bottom,lj(ua,Ia,Infinity,oa,0),Wb=ua.Ca,Jg= +Math.max(Wb.width+vd,0),wd=Math.max(Wb.height+Le,0),e.width=Math.max(e.width,Jg),e.height+=wd;v.sa(pa)}break;case "Horizontal":for(var eb=b,ka=d,la=m.length,pb=v.jb(),Ua=0;Ua<la;Ua++){var Ra=m[Ua];if(Ra.visible||Ra===this.bc){var we=Gm(Ra,!1);if(we!==Ti&&we!==wm)pb.push(Ra);else{var xd=Ra.margin,ie=xd.right+xd.left,Nd=xd.top+xd.bottom;lj(Ra,Infinity,eb,0,ka);var je=Ra.Ca,Kg=Math.max(je.width+ie,0),dd=Math.max(je.height+Nd,0);e.width+=Kg;e.height=Math.max(e.height,dd)}}}var oi=pb.length;if(0!==oi){this.za.height? +eb=Math.min(this.za.height,this.xf.height):0!==e.height&&(eb=Math.min(e.height,this.xf.height));for(Ua=0;Ua<oi;Ua++)if(Ra=pb[Ua],Ra.visible||Ra===this.bc)xd=Ra.margin,ie=xd.right+xd.left,Nd=xd.top+xd.bottom,lj(Ra,Infinity,eb,0,ka),je=Ra.Ca,Kg=Math.max(je.width+ie,0),dd=Math.max(je.height+Nd,0),e.width+=Kg,e.height=Math.max(e.height,dd);v.sa(pb)}break;case "Spot":a:{var vb=a,Xb=b,Od=c,mh=d,Jb=m.length,hb=this.Ye(),ab=hb.margin,Me=0,Pd=0,Lg=ab.right+ab.left,Mg=ab.top+ab.bottom;lj(hb,vb,Xb,Od,mh);var hc= +hb.Ca,ic=hc.width,ke=hc.height,ed=Math.max(ic+Lg,0),jb=Math.max(ke+Mg,0);e.x=-ab.left;e.y=-ab.top;e.width=ed;e.height=jb;for(var Tc=0;Tc<Jb;Tc++){var Ka=m[Tc];if(Ka!==hb&&(Ka.visible||Ka===this.bc)){ab=Ka.margin;Me=ab.right+ab.left;Pd=ab.top+ab.bottom;lj(Ka,vb,Xb,0,0);var hc=Ka.Ca,ed=Math.max(hc.width+Me,0),jb=Math.max(hc.height+Pd,0),kb=Ka.alignment;kb.Uc()&&(kb=this.hl);kb.bd()||(kb=zb);var wc=Ka.Uj;wc.Uc()&&(wc=zb);$a(e,kb.x*ic+kb.offsetX-(wc.x*hc.width-wc.offsetX)-ab.left,kb.y*ke+kb.offsetY-(wc.y* +hc.height-wc.offsetY)-ab.top,ed,jb)}}var yd=hb.stretch;yd===um&&(yd=Gm(hb,!1));switch(yd){case Ti:break a;case He:if(!isFinite(vb)&&!isFinite(Xb))break a;break;case wm:if(!isFinite(vb))break a;break;case vm:if(!isFinite(Xb))break a}hc=hb.Ca;ic=hc.width;ke=hc.height;ed=Math.max(ic+Lg,0);jb=Math.max(ke+Mg,0);ab=hb.margin;e.x=-ab.left;e.y=-ab.top;e.width=ed;e.height=jb;for(Tc=0;Tc<Jb;Tc++)Ka=m[Tc],Ka===hb||!Ka.visible&&Ka!==this.bc||(ab=Ka.margin,Me=ab.right+ab.left,Pd=ab.top+ab.bottom,hc=Ka.Ca,ed=Math.max(hc.width+ +Me,0),jb=Math.max(hc.height+Pd,0),kb=Ka.alignment,kb.Uc()&&(kb=this.hl),kb.bd()||(kb=zb),wc=Ka.Uj,wc.Uc()&&(wc=zb),$a(e,kb.x*ic+kb.offsetX-(wc.x*hc.width-wc.offsetX)-ab.left,kb.y*ke+kb.offsetY-(wc.y*hc.height-wc.offsetY)-ab.top,ed,jb))}break;case "Auto":var Hb=a,le=b,of=c,Ne=d,Jf=m.length,Kb=this.Ye(),xe=Kb.margin,Lb=xe.right+xe.left,jc=xe.top+xe.bottom;lj(Kb,Hb,le,of,Ne);var Qb=Kb.Ca,Ic=0;if(Kb instanceof Y)var wb=Kb,Ic=wb.lb*wb.scale;var Bb=Math.max(Qb.width+Lb,0),Ib=Math.max(Qb.height+jc,0),Qd= +Tn(Kb),Ng=Qd.x*Bb+Qd.offsetX,nh=Qd.y*Ib+Qd.offsetY,Qd=Un(Kb),oh=Qd.x*Bb+Qd.offsetX,ye=Qd.y*Ib+Qd.offsetY,Jc=Hb,ze=le;isFinite(Hb)&&(Jc=Math.max(Math.abs(Ng-oh)-Ic,0));isFinite(le)&&(ze=Math.max(Math.abs(nh-ye)-Ic,0));var kc=v.Fl();kc.m(0,0);for(var xb=0;xb<Jf;xb++){var yb=m[xb];if(yb!==Kb&&(yb.visible||yb===this.bc)){var xe=yb.margin,Kc=xe.right+xe.left,Og=xe.top+xe.bottom;lj(yb,Jc,ze,0,0);Qb=yb.Ca;Bb=Math.max(Qb.width+Kc,0);Ib=Math.max(Qb.height+Og,0);kc.m(Math.max(Bb,kc.width),Math.max(Ib,kc.height))}}if(1=== +Jf)e.width=Bb,e.height=Ib,v.$j(kc);else{var Uc=Tn(Kb),Vc=Un(Kb),ib=0,Lc=0;Vc.x!==Uc.x&&Vc.y!==Uc.y&&(ib=kc.width/Math.abs(Vc.x-Uc.x),Lc=kc.height/Math.abs(Vc.y-Uc.y));v.$j(kc);Ic=0;Kb instanceof Y&&(wb=Kb,Ic=wb.lb*wb.scale,Ui(wb)===Vi&&(ib=Lc=Math.max(ib,Lc)));var ib=ib+(Math.abs(Uc.offsetX)+Math.abs(Vc.offsetX)+Ic),Lc=Lc+(Math.abs(Uc.offsetY)+Math.abs(Vc.offsetY)+Ic),Rd=Kb.stretch;Rd===um&&(Rd=Gm(Kb,!1));switch(Rd){case Ti:Ne=of=0;break;case He:isFinite(Hb)&&(ib=Hb);isFinite(le)&&(Lc=le);break;case wm:isFinite(Hb)&& +(ib=Hb);Ne=0;break;case vm:of=0,isFinite(le)&&(Lc=le)}Kb instanceof Y&&!Kb.za.G()&&wb.ce();Kb.ep();lj(Kb,ib,Lc,of,Ne);e.width=Kb.Ca.width+Lb;e.height=Kb.Ca.height+jc}break;case "Table":for(var Sd=a,pf=b,pi=c,vj=d,Fa=m.length,Oe=v.jb(),me=v.jb(),da=0;da<Fa;da++){var ca=m[da],Pg=ca instanceof D?ca:null;if(null===Pg||Pg.type!==Km&&Pg.type!==Lm||!ca.visible)Oe.push(ca);else{me.push(ca);for(var ph=Pg.ya.n,qi=ph.length,xc=0;xc<qi;xc++){var ri=ph[xc];Pg.type===Km?ri.Wb=ca.Wb:Pg.type===Lm&&(ri.column=ca.column); +Oe.push(ri)}}}Fa=Oe.length;0===Fa&&(this.Md(0),this.Ld(0));for(var Yb=[],da=0;da<Fa;da++)ca=Oe[da],Sk(ca,!0),Im(ca,!0),Yb[ca.Wb]||(Yb[ca.Wb]=[]),Yb[ca.Wb][ca.column]||(Yb[ca.Wb][ca.column]=[]),Yb[ca.Wb][ca.column].push(ca);v.sa(Oe);for(var qh=v.jb(),fd=v.jb(),Ae=v.jb(),Mc={count:0},gd={count:0},yc=Sd,hd=pf,bg=this.Hd,Fa=bg.length,da=0;da<Fa;da++){var X=bg[da];void 0!==X&&(X.Ia=0)}bg=this.Dd;Fa=bg.length;for(da=0;da<Fa;da++)X=bg[da],void 0!==X&&(X.Ia=0);for(var Be=Yb.length,Pe=0,da=0;da<Be;da++)Yb[da]&& +(Pe=Math.max(Pe,Yb[da].length));for(var si=Math.min(this.Ki,Be-1),ti=Math.min(this.wi,Pe-1),Nc=0,Be=Yb.length,da=0;da<Be;da++)if(Yb[da])for(var Pe=Yb[da].length,lb=this.Md(da),xc=lb.Ia=0;xc<Pe;xc++)if(Yb[da][xc]){var mb=this.Ld(xc);void 0===qh[xc]&&(mb.Ia=0,qh[xc]=!0);for(var Rk=Yb[da][xc],cg=Rk.length,Qg=0;Qg<cg;Qg++)if(ca=Rk[Qg],ca.visible||ca===this.bc){var Rg=1<ca.Gi||1<ca.ii;Rg&&(da<si||xc<ti||fd.push(ca));var Rb=ca.margin,dg=Rb.right+Rb.left,eg=Rb.top+Rb.bottom,Wc=Um(ca,lb,mb,!1),Ce=ca.za,un= +!isNaN(Ce.height),ui=!isNaN(Ce.width)&&un;Rg||Wc===Ti||ui||da<si||xc<ti||(void 0!==Mc[xc]||Wc!==He&&Wc!==wm||(Mc[xc]=-1,Mc.count++),void 0!==gd[da]||Wc!==He&&Wc!==vm||(gd[da]=-1,gd.count++),Ae.push(ca));lj(ca,Infinity,Infinity,0,0);if(!(da<si||xc<ti)){var Qe=ca.Ca,Re=Math.max(Qe.width+dg,0),zd=Math.max(Qe.height+eg,0);if(1===ca.Gi&&(Wc===Ti||Wc===wm)){var X=this.Md(da),id=X.Ie(),Nc=Math.max(zd-X.Ia,0);Nc+id>hd&&(Nc=Math.max(hd-id,0));var rh=0===X.Ia;X.Ia+=Nc;hd=Math.max(hd-(Nc+(rh?id:0)),0)}1!==ca.ii|| +Wc!==Ti&&Wc!==vm||(X=this.Ld(xc),id=X.Ie(),Nc=Math.max(Re-X.Ia,0),Nc+id>yc&&(Nc=Math.max(yc-id,0)),rh=0===X.Ia,X.Ia+=Nc,yc=Math.max(yc-(Nc+(rh?id:0)),0));Rg&&ca.ep()}}}v.sa(qh);for(var Td=0,Ud=0,Fa=this.No,da=0;da<Fa;da++){var sh=this.Dd[da];void 0!==sh&&(Td+=sh.Pa,0!==sh.Pa&&(Td+=sh.Ie()))}Fa=this.Cp;for(da=0;da<Fa;da++){var th=this.Hd[da];void 0!==th&&(Ud+=th.Pa,0!==th.Pa&&(Ud+=th.Ie()))}for(var yc=Math.max(Sd-Td,0),jd=hd=Math.max(pf-Ud,0),Sg=yc,Fa=Ae.length,da=0;da<Fa;da++){var ca=Ae[da],lb=this.Md(ca.Wb), +mb=this.Ld(ca.column),qf=ca.Ca,Rb=ca.margin,dg=Rb.right+Rb.left,eg=Rb.top+Rb.bottom;Mc[ca.column]=0===mb.Ia&&void 0!==Mc[ca.column]?Math.max(qf.width+dg,Mc[ca.column]):null;gd[ca.Wb]=0===lb.Ia&&void 0!==gd[ca.Wb]?Math.max(qf.height+eg,gd[ca.Wb]):null}var lc=0,uh=0;for(da in gd)"count"!==da&&(lc+=gd[da]);for(da in Mc)"count"!==da&&(uh+=Mc[da]);for(var nb=v.Fl(),da=0;da<Fa;da++)if(ca=Ae[da],ca.visible||ca===this.bc){var lb=this.Md(ca.Wb),mb=this.Ld(ca.column),De=0;isFinite(mb.width)?De=mb.width:(De= +isFinite(yc)&&null!==Mc[ca.column]?0===uh?mb.Ia+yc:Mc[ca.column]/uh*Sg:null!==Mc[ca.column]?yc:mb.Ia||yc,De=Math.max(0,De-mb.Ie()));var Kf=0;isFinite(lb.height)?Kf=lb.height:(Kf=isFinite(hd)&&null!==gd[ca.Wb]?0===lc?lb.Ia+hd:gd[ca.Wb]/lc*jd:null!==gd[ca.Wb]?hd:lb.Ia||hd,Kf=Math.max(0,Kf-lb.Ie()));nb.m(Math.max(mb.aj,Math.min(De,mb.gf)),Math.max(lb.aj,Math.min(Kf,lb.gf)));Wc=Um(ca,lb,mb,!1);switch(Wc){case wm:nb.height=Math.max(nb.height,lb.Ia+hd);break;case vm:nb.width=Math.max(nb.width,mb.Ia+yc)}Rb= +ca.margin;dg=Rb.right+Rb.left;eg=Rb.top+Rb.bottom;ca.ep();lj(ca,nb.width,nb.height,mb.aj,lb.aj);Qe=ca.Ca;Re=Math.max(Qe.width+dg,0);zd=Math.max(Qe.height+eg,0);isFinite(yc)&&(Re=Math.min(Re,nb.width));isFinite(hd)&&(zd=Math.min(zd,nb.height));var rf=0,rf=lb.Ia;lb.Ia=Math.max(lb.Ia,zd);Nc=lb.Ia-rf;hd=Math.max(hd-Nc,0);rf=mb.Ia;mb.Ia=Math.max(mb.Ia,Re);Nc=mb.Ia-rf;yc=Math.max(yc-Nc,0)}v.sa(Ae);for(var Vd=v.Fl(),Fa=fd.length,da=0;da<Fa;da++)if(ca=fd[da],ca.visible||ca===this.bc){lb=this.Md(ca.Wb);mb= +this.Ld(ca.column);nb.m(Math.max(mb.aj,Math.min(Sd,mb.gf)),Math.max(lb.aj,Math.min(pf,lb.gf)));Wc=Um(ca,lb,mb,!1);switch(Wc){case He:0!==mb.Ia&&(nb.width=Math.min(nb.width,mb.Ia));0!==lb.Ia&&(nb.height=Math.min(nb.height,lb.Ia));break;case wm:0!==mb.Ia&&(nb.width=Math.min(nb.width,mb.Ia));break;case vm:0!==lb.Ia&&(nb.height=Math.min(nb.height,lb.Ia))}isFinite(mb.width)&&(nb.width=mb.width);isFinite(lb.height)&&(nb.height=lb.height);Vd.m(0,0);for(var fb=1;fb<ca.Gi&&!(ca.Wb+fb>=this.Cp);fb++)X=this.Md(ca.Wb+ +fb),Vd.height+=Math.max(X.aj,isNaN(X.Ve)?X.gf:Math.min(X.Ve,X.gf));for(fb=1;fb<ca.ii&&!(ca.column+fb>=this.No);fb++)X=this.Ld(ca.column+fb),Vd.width+=Math.max(X.aj,isNaN(X.Ve)?X.gf:Math.min(X.Ve,X.gf));nb.width+=Vd.width;nb.height+=Vd.height;Rb=ca.margin;dg=Rb.right+Rb.left;eg=Rb.top+Rb.bottom;lj(ca,nb.width,nb.height,pi,vj);for(var Qe=ca.Ca,Re=Math.max(Qe.width+dg,0),zd=Math.max(Qe.height+eg,0),Tg=0,fb=0;fb<ca.Gi&&!(ca.Wb+fb>=this.Cp);fb++)X=this.Md(ca.Wb+fb),Tg+=X.total||0;if(Tg<zd){var oc=zd-Tg, +zc=zd-Tg;if(null!==ca.sx)for(var Ad=ca.sx,fb=0;fb<ca.Gi&&!(0>=oc)&&!(ca.Wb+fb>=this.Cp);fb++){var X=this.Md(ca.Wb+fb),Mb=X.Pa||0,sf=Ad(ca,X,zc);X.Ia=Math.min(X.gf,Mb+sf);X.Pa!==Mb&&(oc-=X.Pa-Mb)}for(;0<oc;){Mb=X.Pa||0;isNaN(X.height)&&X.gf>Mb&&(X.Ia=Math.min(X.gf,Mb+oc),X.Pa!==Mb&&(oc-=X.Pa-Mb));if(0===X.index)break;X=this.Md(X.index-1)}}for(var Ee=0,fb=0;fb<ca.ii&&!(ca.column+fb>=this.No);fb++)X=this.Ld(ca.column+fb),Ee+=X.total||0;if(Ee<Re){oc=Re-Ee;zc=Re-Ee;if(null!==ca.sx)for(Ad=ca.sx,fb=0;fb< +ca.ii&&!(0>=oc)&&!(ca.column+fb>=this.No);fb++)X=this.Ld(ca.column+fb),Mb=X.Pa||0,sf=Ad(ca,X,zc),X.Ia=Math.min(X.gf,Mb+sf),X.Pa!==Mb&&(oc-=X.Pa-Mb);for(;0<oc;){Mb=X.Pa||0;isNaN(X.width)&&X.gf>Mb&&(X.Ia=Math.min(X.gf,Mb+oc),X.Pa!==Mb&&(oc-=X.Pa-Mb));if(0===X.index)break;X=this.Ld(X.index-1)}}}v.sa(fd);v.$j(Vd);v.$j(nb);for(var fg=0,gg=0,Wc=Gm(this,!0),tf=this.za,wj=this.xf,Wd=Ud=Td=0,Xc=0,Fa=this.No,da=0;da<Fa;da++)void 0!==this.Dd[da]&&(X=this.Ld(da),isFinite(X.width)?(Wd+=X.width,Wd+=X.Ie()):Vn(X)=== +Wn?(Wd+=X.Pa,Wd+=X.Ie()):0!==X.Pa&&(Td+=X.Pa,Td+=X.Ie()));var fg=isFinite(tf.width)?Math.min(tf.width,wj.width):Wc!==Ti&&isFinite(Sd)?Sd:Td,fg=Math.max(fg,this.kh.width),fg=Math.max(fg-Wd,0),wh=Math.max(fg/Td,1);isFinite(wh)||(wh=1);for(da=0;da<Fa;da++)void 0!==this.Dd[da]&&(X=this.Ld(da),isFinite(X.width)||Vn(X)===Wn||(X.Ia=X.Pa*wh),X.position=e.width,0!==X.Pa&&(e.width+=X.Pa,e.width+=X.Ie()));Fa=this.Cp;for(da=0;da<Fa;da++)void 0!==this.Hd[da]&&(X=this.Md(da),isFinite(X.height)?(Xc+=X.height,Xc+= +X.Ie()):Vn(X)===Wn?(Xc+=X.Pa,Xc+=X.Ie()):0!==X.Pa&&(Ud+=X.Pa,0!==X.Pa&&(Ud+=X.Ie())));var gg=isFinite(tf.height)?Math.min(tf.height,wj.height):Wc!==Ti&&isFinite(pf)?pf:Ud,gg=Math.max(gg,this.kh.height),gg=Math.max(gg-Xc,0),xh=Math.max(gg/Ud,1);isFinite(xh)||(xh=1);for(da=0;da<Fa;da++)void 0!==this.Hd[da]&&(X=this.Md(da),isFinite(X.height)||Vn(X)===Wn||(X.Ia=X.Pa*xh),X.position=e.height,0!==X.Pa&&(e.height+=X.Pa,0!==X.Pa&&(e.height+=X.Ie())));Fa=me.length;for(da=0;da<Fa;da++){var mc=me[da];mc.type=== +Km?(De=e.width,X=this.Md(mc.Wb),Kf=X.Ia):(X=this.Ld(mc.column),De=X.Ia,Kf=e.height);mc.jd.m(0,0,De,Kf);Sk(mc,!1);Yb[mc.Wb]||(Yb[mc.Wb]=[]);Yb[mc.Wb][mc.column]||(Yb[mc.Wb][mc.column]=[]);Yb[mc.Wb][mc.column].push(mc)}v.sa(me);this.as=Yb;break;case "Viewbox":var yh=a,Tk=b,Tq=c,Uq=d;1<m.length&&v.k("Viewbox Panel cannot contain more than one GraphObject.");var Se=m[0];Se.Tb=1;Se.ep();lj(Se,Infinity,Infinity,Tq,Uq);var xj=Se.Ca,Uk=Se.margin,Vq=Uk.right+Uk.left,Wq=Uk.top+Uk.bottom;if(isFinite(yh)||isFinite(Tk)){var dt= +Se.scale,Vk=xj.width,Wk=xj.height,Xq=Math.max(yh-Vq,0),Yq=Math.max(Tk-Wq,0),yj=1;this.Fo===Vi?0!==Vk&&0!==Wk&&(yj=Math.min(Xq/Vk,Yq/Wk)):0!==Vk&&0!==Wk&&(yj=Math.max(Xq/Vk,Yq/Wk));0===yj&&(yj=1E-4);Se.Tb*=yj;dt!==Se.scale&&(Sk(Se,!0),lj(Se,Infinity,Infinity,Tq,Uq))}xj=Se.Ca;e.width=isFinite(yh)?yh:Math.max(xj.width+Vq,0);e.height=isFinite(Tk)?Tk:Math.max(xj.height+Wq,0);break;case "Link":var Zq=m.length,hg=this instanceof Vg?this.Mf:this;if(hg instanceof W)if(0===Zq){var Xk=this.Qc;Wa(Xk,0,0);var ne= +this.Ca;ne.m(0,0,0,0)}else{var Yk=this instanceof Vg?null:hg.path,ig=hg.Zm,Te=this.Li;Te.assign(ig);Te.x=0;var Ug=Te.y=0,jg=hg.points,Ug=void 0!==this.oa?this.oa:jg.count;this instanceof Vg?this.Tm(!1):hg.Tm(!1);var $q=ig.width,ar=ig.height;this.xi.m(ig.x,ig.y);null===this.Mg&&(this.Mg=new I(A));this.Mg.clear();null!==Yk&&(Xn(Yk,$q,ar,this),ne=Yk.Ca,Te.bi(ne),this.Mg.add(ne));for(var kg=v.rh(),zj=v.L(),lg=v.L(),vn=0;vn<Zq;vn++){var Sb=m[vn];if(Sb!==Yk)if(Sb.Rf&&Sb instanceof Y)Xn(Sb,$q,ar,this),ne= +Sb.Ca,Te.bi(ne),this.Mg.add(ne);else if(2>Ug)lj(Sb,Infinity,Infinity),ne=Sb.Ca,Te.bi(ne),this.Mg.add(ne);else{var kd=Sb.ve,cr=Sb.jA,wn=Sb.Uj;wn.se()&&(wn=zb);var Lf=Sb.Vt,et=Sb.TE,Aj=0,Bj=0,Zk=0;if(kd<-Ug||kd>=Ug){var dr=hg.uE,uf=hg.tE;Lf!==Gi&&(Zk=hg.computeAngle(Sb,Lf,uf),Sb.Kl=Zk);Aj=dr.x-ig.x;Bj=dr.y-ig.y}else{var Bd,Ue;if(0<=kd)Bd=jg.da(kd),Ue=kd<Ug-1?jg.da(kd+1):Bd;else{var zh=Ug+kd;Bd=jg.da(zh);Ue=0<zh?jg.da(zh-1):Bd}if(Bd.Fc(Ue)){var Ah,Bh;0<=kd?(Ah=0<kd?jg.da(kd-1):Bd,Bh=kd<Ug-2?jg.da(kd+ +2):Ue):(Ah=zh<Ug-1?jg.da(zh+1):Bd,Bh=1<zh?jg.da(zh-2):Ue);var er=Ah.rf(Bd),fr=Ue.rf(Bh),uf=er>fr+10?0<=kd?Ah.xc(Bd):Bd.xc(Ah):fr>er+10?0<=kd?Ue.xc(Bh):Bh.xc(Ue):0<=kd?Ah.xc(Bh):Bh.xc(Ah)}else uf=0<=kd?Bd.xc(Ue):Ue.xc(Bd);Lf!==Gi&&(Zk=hg.computeAngle(Sb,Lf,uf),Sb.Kl=Zk);Aj=Bd.x+(Ue.x-Bd.x)*cr-ig.x;Bj=Bd.y+(Ue.y-Bd.y)*cr-ig.y}lj(Sb,Infinity,Infinity);var ne=Sb.Ca,Xk=Sb.Ha,Cj=0;Sb instanceof Y&&(Cj=Sb.lb);var Ch=Xk.width+Cj,vi=Xk.height+Cj;kg.reset();kg.translate(-ne.x,-ne.y);kg.scale(Sb.scale,Sb.scale); +kg.rotate(Lf===Gi?Sb.angle:uf,Ch/2,vi/2);Lf!==Yn&&Lf!==Zn||kg.rotate(90,Ch/2,vi/2);Lf!==$n&&Lf!==ao||kg.rotate(-90,Ch/2,vi/2);Lf===bo&&(45<uf&&135>uf||225<uf&&315>uf)&&kg.rotate(-uf,Ch/2,vi/2);var wi=new A(0,0,Ch,vi);zj.Yt(wi,wn);kg.ub(zj);var ft=-zj.x+Cj/2,gt=-zj.y+Cj/2;lg.assign(et);isNaN(lg.x)&&(lg.x=0<=kd?Ch/2+3:-(Ch/2+3));isNaN(lg.y)&&(lg.y=-(vi/2+3));lg.rotate(uf);Aj+=lg.x;Bj+=lg.y;wi.set(ne);wi.x=Aj+ft;wi.y=Bj+gt;this.Mg.add(wi);Te.bi(wi)}}if(this.Ce)for(var gr=this.Sf;gr.next();)lj(gr.value, +Infinity,Infinity);this.Li=Te;var yn=this.xi;yn.m(yn.x+Te.x,yn.y+Te.y);Wa(e,Te.width||0,Te.height||0);v.$e(kg);v.v(zj);v.v(lg)}break;case "Grid":break;case "TableRow":case "TableColumn":v.k(this.toString()+" is not an element of a Table Panel. TableRow and TableColumn Panels can only be elements of a Table Panel.");break;default:v.k("Unknown panel type: "+n)}}var Ve=e.width,We=e.height,dl=this.padding,ht=dl.top+dl.bottom,Ve=Ve+(dl.left+dl.right),We=We+ht;isFinite(f.width)&&(Ve=f.width);isFinite(f.height)&& +(We=f.height);Ve=Math.min(k.width,Ve);We=Math.min(k.height,We);Ve=Math.max(h.width,Ve);We=Math.max(h.height,We);Ve=Math.max(c,Ve);We=Math.max(d,We);e.width=Ve;e.height=We;Wa(this.Qc,Ve,We);Dm(this,0,0,Ve,We)};D.prototype.findMainElement=D.prototype.Ye=function(){if(null===this.sm){var a=this.ya.n,b=a.length;if(0===b)return null;for(var c=0;c<b;c++){var d=a[c];if(!0===d.Rf)return this.sm=d}this.sm=a[0]}return this.sm}; +D.prototype.Ni=function(a,b,c,d){var e=this.Li,f=this.ya.n,h=v.hk(0,0,0,0);if(0===f.length){var k=this.U;k.x=a;k.y=b;k.width=c;k.height=d}else{if(!this.za.G()){var l=Gm(this,!0),m=this.jd,n=m.width,p=m.height,q=this.margin,r=q.left+q.right,s=q.top+q.bottom;n===c&&p===d&&(l=Ti);switch(l){case Ti:if(n>c||p>d)this.N(),lj(this,n>c?c:n,p>d?d:p);break;case He:this.N(!0);lj(this,c+r,d+s,0,0);break;case wm:this.N(!0);lj(this,c+r,p+s,0,0);break;case vm:this.N(!0),lj(this,n+r,d+s,0,0)}}k=this.U;k.x=a;k.y=b; +k.width=c;k.height=d;var t=this.ia.Ob;switch(t){case "Position":for(var u=f.length,x=e.x-this.padding.left,w=e.y-this.padding.top,y=0;y<u;y++){var B=f[y],H=B.Ca,C=B.margin,T=B.position.x,ba=B.position.y;h.x=isNaN(T)?-x:T-x;h.y=isNaN(ba)?-w:ba-w;if(B instanceof Y){var U=B;if(U.dE){var M=U.lb/2;h.x-=M;h.y-=M}}h.x+=C.left;h.y+=C.top;h.width=H.width;h.height=H.height;B.visible&&B.Ec(h.x,h.y,h.width,h.height)}break;case "Vertical":for(var aa=f.length,Ia=this.padding.left,oa=this.padding.top,Ga=0;Ga<aa;Ga++){var pa= +Ia,Ca=f[Ga];if(Ca.visible){var ua=Ca.Ca,gc=Ca.margin,ud=gc.left+gc.right,vd=Ia+this.padding.right,Le=ua.width,Wb=Gm(Ca,!1);if(isNaN(Ca.za.width)&&Wb===He||Wb===wm)Le=Math.max(e.width-ud-vd,0);var Jg=Le+ud+vd,wd=Ca.alignment;wd.Uc()&&(wd=this.hl);wd.bd()||(wd=zb);Ca.Ec(pa+wd.offsetX+gc.left+(e.width*wd.x-Jg*wd.x),oa+wd.offsetY+gc.top,Le,ua.height);oa+=ua.height+gc.bottom+gc.top}}break;case "Horizontal":for(var ob=f.length,eb=this.padding.top,ka=this.padding.left,la=0;la<ob;la++){var pb=eb,Ua=f[la]; +if(Ua.visible){var Ra=Ua.Ca,we=Ua.margin,xd=we.top+we.bottom,ie=eb+this.padding.bottom,Nd=Ra.height,je=Gm(Ua,!1);if(isNaN(Ua.za.height)&&je===He||je===vm)Nd=Math.max(e.height-xd-ie,0);var Kg=Nd+xd+ie,dd=Ua.alignment;dd.Uc()&&(dd=this.hl);dd.bd()||(dd=zb);Ua.Ec(ka+dd.offsetX+we.left,pb+dd.offsetY+we.top+(e.height*dd.y-Kg*dd.y),Ra.width,Nd);ka+=Ra.width+we.left+we.right}}break;case "Spot":var oi=f.length,vb=this.Ye(),Xb=vb.Ca,Od=Xb.width,mh=Xb.height,Jb=this.padding,hb=Jb.left,ab=Jb.top;h.x=hb-e.x; +h.y=ab-e.y;vb.Ec(h.x,h.y,Od,mh);for(var Me=0;Me<oi;Me++){var Pd=f[Me];if(Pd!==vb){var Lg=Pd.Ca,Mg=Lg.width,hc=Lg.height,ic=Pd.alignment;ic.Uc()&&(ic=this.hl);ic.bd()||(ic=zb);var ke=Pd.Uj;ke.Uc()&&(ke=zb);h.x=ic.x*Od+ic.offsetX-(ke.x*Mg-ke.offsetX);h.y=ic.y*mh+ic.offsetY-(ke.y*hc-ke.offsetY);h.x-=e.x;h.y-=e.y;Pd.visible&&Pd.Ec(hb+h.x,ab+h.y,Mg,hc)}}break;case "Auto":var ed=f.length,jb=this.Ye(),Tc=jb.Ca,Ka=v.ag();Ka.m(0,0,1,1);var kb=jb.margin,wc=kb.left,yd=kb.top,Hb=this.padding,le=Hb.left,of=Hb.top; +h.x=wc;h.y=yd;h.width=Tc.width;h.height=Tc.height;jb.Ec(le+h.x,of+h.y,h.width,h.height);var Ne=Tn(jb),Jf=Un(jb),Kb=0+Ne.y*Tc.height+Ne.offsetY,xe=0+Jf.x*Tc.width+Jf.offsetX,Lb=0+Jf.y*Tc.height+Jf.offsetY;Ka.x=0+Ne.x*Tc.width+Ne.offsetX;Ka.y=Kb;$a(Ka,xe,Lb,0,0);Ka.x+=wc+le;Ka.y+=yd+of;for(var jc=0;jc<ed;jc++){var Qb=f[jc];if(Qb!==jb){var Ic=Qb.Ca,kb=Qb.margin,wb=Math.max(Ic.width+kb.right+kb.left,0),Bb=Math.max(Ic.height+kb.top+kb.bottom,0),Ib=Qb.alignment;Ib.Uc()&&(Ib=this.hl);Ib.bd()||(Ib=zb);h.x= +Ka.width*Ib.x+Ib.offsetX-wb*Ib.x+kb.left+Ka.x;h.y=Ka.height*Ib.y+Ib.offsetY-Bb*Ib.y+kb.top+Ka.y;h.width=Ka.width;h.height=Ka.height;Qb.visible&&(bb(Ka.x,Ka.y,Ka.width,Ka.height,h.x,h.y,Ic.width,Ic.height)?Qb.Ec(h.x,h.y,Ic.width,Ic.height):Qb.Ec(h.x,h.y,Ic.width,Ic.height,new A(Ka.x,Ka.y,Ka.width,Ka.height)))}}v.Vb(Ka);break;case "Table":for(var Qd=f.length,Ng=this.padding,nh=Ng.left,oh=Ng.top,ye=this.as,Jc=0,ze=0,kc=ye.length,xb=0,yb=0;yb<kc;yb++)ye[yb]&&(xb=Math.max(xb,ye[yb].length));for(var Kc= +Math.min(this.Ki,kc-1);Kc!==kc&&(void 0===this.Hd[Kc]||0===this.Hd[Kc].Pa);)Kc++;for(var Kc=Math.min(Kc,kc-1),Og=-this.Hd[Kc].kb,Uc=Math.min(this.wi,xb-1);Uc!==xb&&(void 0===this.Dd[Uc]||0===this.Dd[Uc].Pa);)Uc++;for(var Uc=Math.min(Uc,xb-1),Vc=-this.Dd[Uc].kb,ib=v.Fl(),yb=0;yb<kc;yb++)if(ye[yb]){var xb=ye[yb].length,Lc=this.Md(yb),ze=Lc.kb+Og+oh;0!==Lc.Pa&&(ze+=Lc.rD());for(var Rd=0;Rd<xb;Rd++)if(ye[yb][Rd]){var Sd=this.Ld(Rd),Jc=Sd.kb+Vc+nh;0!==Sd.Pa&&(Jc+=Sd.rD());for(var pf=ye[yb][Rd],pi=pf.length, +vj=0;vj<pi;vj++){var Fa=pf[vj],Oe=Fa.Ca,me=Fa instanceof D?Fa:null;if(null===me||me.type!==Km&&me.type!==Lm){ib.m(0,0);for(var da=1;da<Fa.rowSpan&&!(yb+da>=this.Cp);da++){var ca=this.Md(yb+da);ib.height+=ca.total}for(da=1;da<Fa.sG&&!(Rd+da>=this.No);da++){var Pg=this.Ld(Rd+da);ib.width+=Pg.total}var ph=Sd.Pa+ib.width,qi=Lc.Pa+ib.height;h.x=Jc;h.y=ze;h.width=ph;h.height=qi;var xc=Jc,ri=ze,Yb=ph,qh=qi;Jc+ph>e.width&&(Yb=Math.max(e.width-Jc,0));ze+qi>e.height&&(qh=Math.max(e.height-ze,0));var fd=Fa.alignment, +Ae=0,Mc=0,gd=0,yc=0;if(fd.Uc()){fd=this.hl;fd.bd()||(fd=zb);var Ae=fd.x,Mc=fd.y,gd=fd.offsetX,yc=fd.offsetY,hd=Sd.alignment,bg=Lc.alignment;hd.bd()&&(Ae=hd.x,gd=hd.offsetX);bg.bd()&&(Mc=bg.y,yc=bg.offsetY)}else Ae=fd.x,Mc=fd.y,gd=fd.offsetX,yc=fd.offsetY;if(isNaN(Ae)||isNaN(Mc))Mc=Ae=.5,yc=gd=0;var X=Oe.width,Be=Oe.height,Pe=Fa.margin,si=Pe.left+Pe.right,ti=Pe.top+Pe.bottom,Nc=Um(Fa,Lc,Sd,!1);!isNaN(Fa.za.width)||Nc!==He&&Nc!==wm||(X=Math.max(ph-si,0));!isNaN(Fa.za.height)||Nc!==He&&Nc!==vm||(Be= +Math.max(qi-ti,0));var lb=Fa.xf,mb=Fa.kh,X=Math.min(lb.width,X),Be=Math.min(lb.height,Be),X=Math.max(mb.width,X),Be=Math.max(mb.height,Be),Rk=Be+ti;h.x+=h.width*Ae-(X+si)*Ae+gd+Pe.left;h.y+=h.height*Mc-Rk*Mc+yc+Pe.top;Fa.visible&&(bb(xc,ri,Yb,qh,h.x,h.y,Oe.width,Oe.height)?Fa.Ec(h.x,h.y,X,Be):Fa.Ec(h.x,h.y,X,Be,new A(xc,ri,Yb,qh)))}else{Fa.si();Fa.mc.Oa();var cg=Fa.mc;cg.x=me.type===Km?nh:Jc;cg.y=me.type===Lm?oh:ze;cg.width=Oe.width;cg.height=Oe.height;Fa.mc.freeze();Im(Fa,!1)}}}}v.$j(ib);for(yb= +0;yb<Qd;yb++)Fa=f[yb],me=Fa instanceof D?Fa:null,null===me||me.type!==Km&&me.type!==Lm||(cg=Fa.mc,Fa.Qc.Oa(),Fa.Qc.m(0,0,cg.width,cg.height),Fa.Qc.freeze());break;case "Viewbox":var Qg=f[0],Rg=Qg.Ca,Rb=Qg.margin,dg=Rb.top+Rb.bottom,eg=Math.max(Rg.width+(Rb.right+Rb.left),0),Wc=Math.max(Rg.height+dg,0),Ce=Qg.alignment;Ce.Uc()&&(Ce=this.hl);Ce.bd()||(Ce=zb);h.x=e.width*Ce.x-eg*Ce.x+Ce.offsetX;h.y=e.height*Ce.y-Wc*Ce.y+Ce.offsetY;h.width=Rg.width;h.height=Rg.height;Qg.Ec(h.x,h.y,h.width,h.height);break; +case "Link":var un=f.length,ui=this instanceof Vg?this.Mf:this;if(ui instanceof W){var Qe=this instanceof Vg?null:ui.path;if(null!==this.Mg){var Re=this.Mg.n,zd=0;if(null!==Qe&&zd<this.Mg.count){var id=Re[zd];zd++;Qe.Ec(id.x-this.Li.x,id.y-this.Li.y,id.width,id.height)}for(var rh=0;rh<un;rh++){var Td=f[rh];Td!==Qe&&zd<this.Mg.count&&(id=Re[zd],zd++,Td.Ec(id.x-this.Li.x,id.y-this.Li.y,id.width,id.height))}}var Ud=ui.points,sh=Ud.count;if(2<=sh&&this.Ce)for(var th=this.Sf;th.next();){var jd=th.value, +Sg=sh,qf=Ud,lc=jd.ve,uh=jd.jA,nb=jd.Uj,De=jd.Vt,Kf=jd.TE,rf=0,Vd=0,fb=0;if(lc<-Sg||lc>=Sg){var Tg=this.uE,oc=this.tE;De!==Gi&&(fb=this.computeAngle(jd,De,oc),jd.angle=fb);rf=Tg.x;Vd=Tg.y}else{var zc=void 0,Ad=void 0;if(0<=lc)zc=qf.n[lc],Ad=lc<Sg-1?qf.n[lc+1]:zc;else var Mb=Sg+lc,zc=qf.n[Mb],Ad=0<Mb?qf.n[Mb-1]:zc;if(zc.Fc(Ad)){var sf=void 0,Ee=void 0;0<=lc?(sf=0<lc?qf.n[lc-1]:zc,Ee=lc<Sg-2?qf.n[lc+2]:Ad):(sf=Mb<Sg-1?qf.n[Mb+1]:zc,Ee=1<Mb?qf.n[Mb-2]:Ad);var fg=sf.rf(zc),gg=Ad.rf(Ee),oc=fg>gg+10?0<= +lc?sf.xc(zc):zc.xc(sf):gg>fg+10?0<=lc?Ad.xc(Ee):Ee.xc(Ad):0<=lc?sf.xc(Ee):Ee.xc(sf)}else oc=0<=lc?zc.xc(Ad):Ad.xc(zc);De!==Gi&&(fb=this.computeAngle(jd,De,oc),jd.angle=fb);rf=zc.x+(Ad.x-zc.x)*uh;Vd=zc.y+(Ad.y-zc.y)*uh}if(nb.K(qb))jd.location=new z(rf,Vd);else{nb.se()&&(nb=zb);var tf=v.rh();tf.reset();tf.scale(jd.scale,jd.scale);tf.rotate(jd.angle,0,0);var wj=jd.Ha,Wd=v.hk(0,0,wj.width,wj.height),Xc=v.L();Xc.Yt(Wd,nb);tf.ub(Xc);var wh=-Xc.x,xh=-Xc.y,mc=Kf.copy();isNaN(mc.x)&&(mc.x=0<=lc?Xc.x+3:-(Xc.x+ +3));isNaN(mc.y)&&(mc.y=-(Xc.y+3));mc.rotate(oc);rf+=mc.x;Vd+=mc.y;tf.oF(Wd);var wh=wh+Wd.x,xh=xh+Wd.y,yh=v.Mb(rf+wh,Vd+xh);jd.move(yh);v.v(yh);v.v(Xc);v.Vb(Wd);v.$e(tf)}}this instanceof Vg?this.Tm(!1):ui.Tm(!1)}break;case "Grid":break;case "TableRow":case "TableColumn":v.k(this.toString()+" is not an element of a Table Panel.TableRow and TableColumn panels can only be elements of a Table Panel.");break;default:v.k("Unknown panel type: "+t)}v.Vb(h)}}; +D.prototype.Wj=function(a){var b=this.Ha;if(bb(0,0,b.width,b.height,a.x,a.y)){for(var b=this.ya.n,c=b.length,d=v.Mb(0,0);c--;){var e=b[c];if(e.visible||e===this.bc)if(Qa(d.set(a),e.transform),e.Fa(d))return v.v(d),!0}v.v(d);return null===this.Ib&&null===this.nc?!1:!0}return!1};D.prototype.Aw=function(a){if(this.on===a)return this;for(var b=this.ya.n,c=b.length,d=0;d<c;d++){var e=b[d].Aw(a);if(null!==e)return e}return null}; +function co(a,b,c){c(a,b);if(b instanceof D){b=b.ya.n;for(var d=b.length,e=0;e<d;e++)co(a,b[e],c)}}function pl(a,b){eo(a,a,b)}function eo(a,b,c){c(b);b=b.ya.n;for(var d=b.length,e=0;e<d;e++){var f=b[e];f instanceof D&&eo(a,f,c)}}D.prototype.walkVisualTree=D.prototype.TI=function(a){fo(this,this,a)};function fo(a,b,c){c(b);if(b instanceof D){b=b.ya.n;for(var d=b.length,e=0;e<d;e++)fo(a,b[e],c)}}D.prototype.findInVisualTree=D.prototype.dt=function(a){return ho(this,this,a)}; +function ho(a,b,c){if(c(b))return b;if(b instanceof D){b=b.ya.n;for(var d=b.length,e=0;e<d;e++){var f=ho(a,b[e],c);if(null!==f)return f}}return null}D.prototype.findObject=D.prototype.be=function(a){if(this.name===a)return this;for(var b=this.ya.n,c=b.length,d=0;d<c;d++){var e=b[d];if(e.name===a)return e;if(e instanceof D)if(null===e.vj&&null===e.hg){if(e=e.be(a),null!==e)return e}else if(Kl(e)&&(e=e.ya.first(),null!==e&&(e=e.be(a),null!==e)))return e}return null}; +function io(a){a=a.ya.n;for(var b=a.length,c=0,d=0;d<b;d++){var e=a[d];if(e instanceof D)c=Math.max(c,io(e));else if(e instanceof Y){a:{if(null!==!e.Kf)switch(e.Jn){case "None":case "Square":case "Ellipse":case "Circle":case "LineH":case "LineV":case "FramedRectangle":case "RoundedRectangle":case "Line1":case "Line2":case "Border":case "Cube1":case "Cube2":case "Junction":case "Cylinder1":case "Cylinder2":case "Cylinder3":case "Cylinder4":case "PlusLine":case "XLine":case "ThinCross":case "ThickCross":e= +0;break a}e=e.Rh/2*e.rm*e.Ti()}c=Math.max(c,e)}}return c}g=D.prototype;g.Lg=function(){return!(this.type===Km||this.type===Lm)}; +g.re=function(a,b,c){if(!1===this.Hg)return null;void 0===b&&(b=null);void 0===c&&(c=null);if(gl(this))return null;var d=this.Ha,e=1/this.Ti(),f=this.Lg(),h=f?a:Qa(v.Mb(a.x,a.y),this.transform),k=this.g,l=10,m=5;null!==k&&(l=k.Yo("extraTouchArea"),m=l/2);if(bb(-(m*e),-(m*e),d.width+l*e,d.height+l*e,h.x,h.y)){if(!this.Qg){var e=this.ya.n,n=e.length,k=v.L(),m=(l=this.bE)?this.Ye():null;if(l&&(m.Lg()?Qa(k.set(a),m.transform):k.set(a),!m.Fa(k)))return v.v(k),f||v.v(h),null;for(;n--;){var p=e[n];if(p.visible|| +p===this.bc)if(p.Lg()?Qa(k.set(a),p.transform):k.set(a),!l||p!==m){var q=null;p instanceof D?q=p.re(k,b,c):!0===p.Hg&&p.Fa(k)&&(q=p);if(null!==q&&(null!==b&&(q=b(q)),null!==q&&(null===c||c(q))))return v.v(k),f||v.v(h),q}}v.v(k)}if(null===this.background&&null===this.zm)return f||v.v(h),null;a=bb(0,0,d.width,d.height,h.x,h.y)?this:null;f||v.v(h);return a}f||v.v(h);return null}; +g.gt=function(a,b,c,d){if(!1===this.Hg)return!1;void 0===b&&(b=null);void 0===c&&(c=null);d instanceof I||d instanceof J||(d=new I(G));var e=this.Ha,f=this.Lg(),h=f?a:Qa(v.Mb(a.x,a.y),this.transform);if(bb(0,0,e.width,e.height,h.x,h.y)){if(!this.Qg){for(var e=this.ya.n,k=e.length,l=v.L();k--;){var m=e[k];if(m.visible||m===this.bc){m.Lg()?Qa(l.set(a),m.transform):l.set(a);var n=m,m=m instanceof D?m:null;(null!==m?m.gt(l,b,c,d):n.Fa(l))&&!1!==n.Hg&&(null!==b&&(n=b(n)),null===n||null!==c&&!c(n)||d.add(n))}}v.v(l)}f|| +v.v(h);return null!==this.background||null!==this.zm}f||v.v(h);return!1}; +g.Zj=function(a,b,c,d,e,f){if(!1===this.Hg)return!1;void 0===b&&(b=null);void 0===c&&(c=null);var h=f;void 0===f&&(h=v.rh(),h.reset());h.multiply(this.transform);if(this.Em(a,h))return jo(this,b,c,e),void 0===f&&v.$e(h),!0;if(this.yg(a,h)){if(!this.Qg)for(var k=this.ya.n,l=k.length;l--;){var m=k[l];if(m.visible||m===this.bc){var n=m.U,p=this.Ha;if(!(n.x>p.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=m;m=m instanceof D?m:null;p=v.rh();p.set(h);if(null!==m?m.Zj(a,b,c,d,e,p):Fm(n,a,d,p))null!== +b&&(n=b(n)),null===n||null!==c&&!c(n)||e.add(n);v.$e(p)}}}void 0===f&&v.$e(h);return d}void 0===f&&v.$e(h);return!1};function jo(a,b,c,d){for(var e=a.ya.n,f=e.length;f--;){var h=e[f];if(h.visible){var k=h.U,l=a.Ha;k.x>l.width||k.y>l.height||0>k.x+k.width||0>k.y+k.height||(h instanceof D&&jo(h,b,c,d),null!==b&&(h=b(h)),null===h||null!==c&&!c(h)||d.add(h))}}} +g.Km=function(a,b,c,d,e,f){if(!1===this.Hg)return!1;void 0===c&&(c=null);void 0===d&&(d=null);var h=this.Ha,k=this.Lg(),l=k?a:Qa(v.Mb(a.x,a.y),this.transform),m=k?b:Qa(v.Mb(b.x,b.y),this.transform),n=l.rf(m),p=0<l.x&&l.x<h.width&&0<l.y&&l.y<h.height||Sa(l.x,l.y,0,0,0,h.height)<n||Sa(l.x,l.y,0,h.height,h.width,h.height)<n||Sa(l.x,l.y,h.width,h.height,h.width,0)<n||Sa(l.x,l.y,h.width,0,0,0)<n,h=0<l.x&&l.x<h.width&&0<l.y&&l.y<h.height&&Sa(l.x,l.y,0,0,0,h.height)<n&&Sa(l.x,l.y,0,h.height,h.width,h.height)< +n&&Sa(l.x,l.y,h.width,h.height,h.width,0)<n&&Sa(l.x,l.y,h.width,0,0,0)<n;k||(v.v(l),v.v(m));if(p){if(!this.Qg){k=v.L();l=v.L();m=this.ya.n;for(n=m.length;n--;){var q=m[n];if(q.visible||q===this.bc){var r=q.U,s=this.Ha;r.x>s.width||r.y>s.height||0>r.x+r.width||0>r.y+r.height||(q.Lg()?(r=q.transform,Qa(k.set(a),r),Qa(l.set(b),r)):(k.set(a),l.set(b)),r=q,q=q instanceof D?q:null,null!==q?!q.Km(k,l,c,d,e,f):!r.LD(k,l,e))||(null!==c&&(r=c(r)),null===r||null!==d&&!d(r)||f.add(r))}}v.v(k);v.v(l)}return e? +p:h}return!1};function Tn(a){var b=a.B;if(void 0===b||b===fc)b=null;null===b&&a instanceof Y&&(a=a.fh,null!==a&&(b=a.B));null===b&&(b=rb);return b}function Un(a){var b=a.C;if(void 0===b||b===fc)b=null;null===b&&a instanceof Y&&(a=a.fh,null!==a&&(b=a.C));null===b&&(b=Eb);return b}D.prototype.add=D.prototype.add=function(a){v.A(a,G,D,"add:element");this.yd(this.ya.count,a)};D.prototype.elt=D.prototype.da=function(a){return this.ya.da(a)}; +D.prototype.insertAt=D.prototype.yd=function(a,b){b instanceof R&&v.k("Cannot add a Part to a Panel: "+b);if(this===b||this.ul(b))this===b&&v.k("Cannot make a Panel contain itself: "+this.toString()),v.k("Cannot make a Panel indirectly contain itself: "+this.toString()+" already contains "+b.toString());var c=b.R;null!==c&&c!==this&&v.k("Cannot add a GraphObject that already belongs to another Panel to this Panel: "+b.toString()+", already contained by "+c.toString()+", cannot be shared by this Panel: "+ +this.toString());this.ia!==zk||b instanceof Y||v.k("Can only add Shapes to a Grid Panel, not: "+b);b.Bl(this);b.im=null;if(null!==this.mE){var d=b.data;null!==d&&"object"===typeof d&&(null===this.gg&&(this.gg=new na(Object,D)),this.gg.add(d,b))}var e=this.ya,d=-1;if(c===this){for(var f=-1,h=this.ya.n,k=h.length,l=0;l<k;l++)if(h[l]===b){f=l;break}if(-1!==f){if(f===a||f+1>=e.count&&a>=e.count)return;e.Vc(f);d=f}else v.k("element "+b.toString()+" has panel "+c.toString()+" but is not contained by it.")}if(0> +a||a>e.count)a=e.count;e.yd(a,b);this.N();b.N();null!==b.Rd?this.Ch=!0:b instanceof D&&!0===b.Ch&&(this.Ch=!0);c=this.Y;null!==c&&(c.dm=null,c.Aj=NaN,this.Ch&&c instanceof S&&(c.Ch=!0),c.Ch&&(c.Wd=null),e=this.g,null!==e&&e.la.ib||(-1!==d&&c.Lc(Df,"elements",this,b,null,d,null),c.Lc(Cf,"elements",this,null,b,null,a)))};D.prototype.remove=D.prototype.remove=function(a){v.A(a,G,D,"remove:element");for(var b=this.ya.n,c=b.length,d=-1,e=0;e<c;e++)if(b[e]===a){d=e;break}-1!==d&&this.Ne(d)}; +D.prototype.removeAt=D.prototype.Vc=function(a){0<=a&&this.Ne(a)};D.prototype.Ne=function(a){var b=this.ya,c=b.da(a);c.im=null;c.Bl(null);if(null!==this.gg){var d=c.data;"object"===typeof d&&this.gg.remove(d)}b.Vc(a);Sk(this,!1);this.N();this.sm===c&&(this.sm=null);b=this.Y;null!==b&&(b.dm=null,b.Aj=NaN,b.Nd(),d=this.g,null!==d&&d.la.ib||b.Lc(Df,"elements",this,c,null,a,null))};v.u(D,{Cp:"rowCount"},function(){return void 0===this.Hd?0:this.Hd.length}); +D.prototype.getRowDefinition=D.prototype.Md=function(a){0>a&&v.va(a,">= 0",D,"getRowDefinition:idx");a=Math.round(a);var b=this.Hd;if(void 0===b[a]){var c=new ug;c.Bl(this);c.de=!0;c.index=a;b[a]=c}return b[a]};D.prototype.removeRowDefinition=D.prototype.HE=function(a){0>a&&v.va(a,">= 0",D,"removeRowDefinition:idx");a=Math.round(a);var b=this.Hd;this.Lc(Df,"coldefs",this,b[a],null,a,null);b[a]&&delete b[a];this.N()};v.u(D,{No:"columnCount"},function(){return void 0===this.Dd?0:this.Dd.length}); +D.prototype.getColumnDefinition=D.prototype.Ld=function(a){0>a&&v.va(a,">= 0",D,"getColumnDefinition:idx");a=Math.round(a);var b=this.Dd;if(void 0===b[a]){var c=new ug;c.Bl(this);c.de=!1;c.index=a;b[a]=c}return b[a]};D.prototype.removeColumnDefinition=D.prototype.DE=function(a){0>a&&v.va(a,">= 0",D,"removeColumnDefinition:idx");a=Math.round(a);var b=this.Dd;this.Lc(Df,"coldefs",this,b[a],null,a,null);b[a]&&delete b[a];this.N()}; +v.defineProperty(D,{rI:"rowSizing"},function(){return void 0===this.nm?Pn:this.nm},function(a){if(void 0!==this.nm){var b=this.nm;b!==a&&(a!==Pn&&a!==Wn&&v.k("Panel.rowSizing must be RowColumnDefinition.ProportionalExtra or RowColumnDefinition.None, not: "+a),this.nm=a,this.N(),this.h("rowSizing",b,a))}}); +v.defineProperty(D,{rG:"columnSizing"},function(){return void 0===this.Ol?Pn:this.Ol},function(a){if(void 0!==this.Ol){var b=this.Ol;b!==a&&(a!==Pn&&a!==Wn&&v.k("Panel.columnSizing must be RowColumnDefinition.ProportionalExtra or RowColumnDefinition.None, not: "+a),this.Ol=a,this.N(),this.h("columnSizing",b,a))}}); +v.defineProperty(D,{OK:"topIndex"},function(){return void 0===this.Ki?0:this.Ki},function(a){if(void 0!==this.Ki){var b=this.Ki;b!==a&&((!isFinite(a)||0>a)&&v.k("Panel.topIndex must be greater than zero and a real number, not: "+a),this.Ki=a,this.N(),this.h("topIndex",b,a))}}); +v.defineProperty(D,{$J:"leftIndex"},function(){return void 0===this.wi?0:this.wi},function(a){if(void 0!==this.wi){var b=this.wi;b!==a&&((!isFinite(a)||0>a)&&v.k("Panel.leftIndex must be greater than zero and a real number, not: "+a),this.wi=a,this.N(),this.h("leftIndex",b,a))}});D.prototype.findRowForLocalY=function(a){if(0>a)return-1;if(this.type!==Tm)return NaN;for(var b=0,c=this.Hd,d=c.length,e=this.Ki;e<d;e++){var f=c[e];if(void 0!==f&&(b+=f.total,a<b))return e}return-1}; +D.prototype.findColumnForLocalX=function(a){if(0>a)return-1;if(this.type!==Tm)return NaN;for(var b=0,c=this.Dd,d=c.length,e=this.wi;e<d;e++){var f=c[e];if(void 0!==f&&(b+=f.total,a<b))return e}return-1}; +v.defineProperty(D,{data:"data"},function(){return this.je},function(a){var b=this.je;if(b!==a){var c=this instanceof R&&!(this instanceof Vg);c&&v.j(a,"object",D,"data");Xg(this);this.je=a;var d=this.g;null!==d&&(c?this instanceof W?(null!==b&&d.xk.remove(b),null!==a&&d.xk.add(a,this)):this instanceof R&&(null!==b&&d.li.remove(b),null!==a&&d.li.add(a,this)):(c=this.R,null!==c&&null!==c.gg&&(null!==b&&c.gg.remove(b),null!==a&&c.gg.add(a,this))));this.h("data",b,a);null!==d&&d.la.ib||null!==a&&this.Hb()}}); +v.defineProperty(D,{wH:"itemIndex"},function(){return this.br},function(a){var b=this.br;b!==a&&(this.br=a,this.h("itemIndex",b,a))});function an(a){a=a.uk;return null!==a&&a.D} +function Xg(a){var b=a.uk;if(null===b)null!==a.data&&v.k("Template cannot have .data be non-null: "+a),a.uk=b=new I(Ag);else if(b.D)return;var c=new I(G);co(a,a,function(a,d){var e=d.sc;if(null!==e)for(Xm(d,!1),e=e.i;e.next();){var f=e.value;f.mode===Cg&&Xm(d,!0);if(null!==f.bn){var h=Dg(f,a,d);null!==h&&(c.add(h),null===h.so&&(h.so=new I(Ag)),h.so.add(f))}b.add(f)}if(d instanceof D&&d.type===Tm){if(0<d.Hd.length)for(e=d.Hd,f=e.length,h=0;h<f;h++){var k=e[h];if(void 0!==k&&null!==k.sc)for(var l=k.sc.i;l.next();){var u= +l.value;u.pg=k;u.zs=2;u.Ao=k.index;b.add(u)}}if(0<d.Dd.length)for(e=d.Dd,f=e.length,h=0;h<f;h++)if(k=e[h],void 0!==k&&null!==k.sc)for(l=k.sc.i;l.next();)u=l.value,u.pg=k,u.zs=1,u.Ao=k.index,b.add(u)}});for(var d=c.i;d.next();){var e=d.value;if(null!==e.so){Xm(e,!0);for(var f=e.so.i;f.next();){var h=f.value;null===e.sc&&(e.sc=new I(Ag));e.sc.add(h)}}e.so=null}for(d=b.i;d.next();)if(e=d.value,f=e.pg,null!==f){e.pg=null;var k=e.tx,l=k.indexOf(".");0<l&&f instanceof D&&(h=k.substring(0,l),k=k.substr(l+ +1),l=f.be(h),null!==l?(f=l,e.tx=k):v.trace('Warning: unable to find GraphObject named "'+h+'" for Binding: '+e.toString()));f instanceof ug?(e.El=v.ld(f.R),f.R.on=e.El):(e.El=v.ld(f),f.on=e.El)}b.freeze();a instanceof R&&a.Od()&&(lj(a,Infinity,Infinity),a.Ec())}D.prototype.copyTemplate=function(){var a=this.copy();a.TI(function(a){a instanceof D&&(a.uk=null,a.je=null);var c=a.sc;null!==c&&(a.sc=null,c.each(function(c){a.bind(c.copy())}))});return a}; +D.prototype.updateTargetBindings=D.prototype.Hb=function(a){var b=this.uk;if(null!==b)for(void 0===a&&(a=""),b=b.i;b.next();){var c=b.value,d=c.bF;if(""===a||""===d||d===a)if(d=c.tx,null!==c.vG||""!==d){var d=this.data,e=c.bn;if(null!==e)d=""===e?this:"."===e?this:".."===e?this:this.be(e);else{var f=this.g;null!==f&&c.yt&&(d=f.ba.ck)}if(null!==d){var f=this,h=c.El;if(-1!==h){if(f=this.Aw(h),null===f)continue}else null!==c.pg&&(f=c.pg);"."===e?d=f:".."===e&&(d=f.R);e=c.zs;if(0!==e){if(!(f instanceof +D))continue;h=f;1===e?f=h.Ld(c.Ao):2===e&&(f=h.Md(c.Ao))}void 0!==f&&c.sF(f,d)}}}};v.defineProperty(D,{mE:"itemArray"},function(){return this.vj},function(a){var b=this.vj;if(b!==a){var c=this.g;null!==c&&null!==b&&vl(c,this);this.vj=a;null!==c&&null!==a&&rl(c,this);this.h("itemArray",b,a);null!==c&&c.la.ib||this.cA()}});function Kl(a){return a.type===Ri||a.type===wk||a.type===Di||a.type===Tm&&0<a.ya.length&&(a=a.ya.da(0),a.Rf&&a instanceof D&&(a.type===Km||a.type===Lm))?!0:!1} +D.prototype.rebuildItemElements=D.prototype.cA=function(){var a=0;for(Kl(this)&&(a=1);this.ya.length>a;)this.Ne(this.ya.length-1);a=this.mE;if(null!==a)for(var b=v.Va(a),c=0;c<b;c++)Jl(this,v.Qa(a,c),c)};D.prototype.findItemPanelForData=D.prototype.OG=function(a){if(void 0===a||null===a||null===this.gg)return null;v.j(a,"object",D,"findItemPanelForData");return this.gg.ja(a)}; +function Jl(a,b,c){if(!(void 0===b||null===b||0>c)){var d;d=ko(a,b);var e=a.xH,f=null;null!==e&&(f=e.ja(d));null===f&&(lo||(lo=!0,v.trace('No item template Panel found for category "'+d+'" on '+a),v.trace(" Using default item template."),d=new D,e=new bh,e.bind(new Ag("text","",Ef)),d.add(e),mo=d),f=mo);d=f;null!==d&&(Xg(d),d=d.copy(),"object"===typeof b&&(null===a.gg&&(a.gg=new na(Object,D)),a.gg.add(b,d)),e=c,Kl(a)&&e++,a.yd(e,d),Ll(a,e,c),d.je=null,d.data=b)}} +function Ll(a,b,c){for(a=a.ya;b<a.length;){var d=a.da(b);if(d instanceof D){var e=b,f=c;d.type===Km?d.Wb=e:d.type===Lm&&(d.column=e);d.wH=f}b++;c++}} +v.defineProperty(D,{YJ:"itemTemplate"},function(){return null===this.hg?null:this.hg.ja("")},function(a){if(null===this.hg){if(null===a)return;this.hg=new na("string",D)}var b=this.hg.ja("");b!==a&&(v.A(a,D,D,"itemTemplate"),(a instanceof R||a.Rf)&&v.k("Panel.itemTemplate must not be a Part or be Panel.isPanelMain: "+a),this.hg.add("",a),this.h("itemTemplate",b,a),a=this.g,null!==a&&a.la.ib||this.cA())}); +v.defineProperty(D,{xH:"itemTemplateMap"},function(){return this.hg},function(a){var b=this.hg;if(b!==a){v.A(a,na,D,"itemTemplateMap");for(var c=a.i;c.next();){var d=c.value;(d instanceof R||d.Rf)&&v.k("Template in Panel.itemTemplateMap must not be a Part or be Panel.isPanelMain: "+d)}this.hg=a;this.h("itemTemplateMap",b,a);a=this.g;null!==a&&a.la.ib||this.cA()}}); +v.defineProperty(D,{XJ:"itemCategoryProperty"},function(){return this.Wn},function(a){var b=this.Wn;b!==a&&("string"!==typeof a&&"function"!==typeof a&&v.Cd(a,"string or function",D,"itemCategoryProperty"),this.Wn=a,this.h("itemCategoryProperty",b,a))}); +function ko(a,b){if(null===b)return"";var c=a.Wn,d="";if("function"===typeof c)d=c(b);else if("string"===typeof c&&"object"===typeof b){if(""===c)return"";d=v.qb(b,c)}else return"";if(void 0===d)return"";if("string"===typeof d)return d;v.k("Panel.getCategoryForItemData found a non-string category for "+b+": "+d);return""}var lo=!1,mo=null;v.defineProperty(D,{SJ:"isAtomic"},function(){return this.Qg},function(a){var b=this.Qg;b!==a&&(v.j(a,"boolean",D,"isAtomic"),this.Qg=a,this.h("isAtomic",b,a))}); +v.defineProperty(D,{bE:"isClipping"},function(){return this.Oq},function(a){var b=this.Oq;b!==a&&(v.j(a,"boolean",D,"isClipping"),this.Oq=a,this.h("isClipping",b,a))});function ug(){v.dc(this);this.Xg=null;this.hv=!0;this.Oc=0;this.Ve=NaN;this.Ej=0;this.Cj=Infinity;this.Ae=fc;this.kb=this.Pa=0;this.sc=null;this.rs=no;this.Qh=um;this.ls=this.Ij=null;this.ms=NaN;this.Ib=this.Jh=null;this.lq=!1}v.ea("RowColumnDefinition",ug); +ug.prototype.copy=function(){var a=new ug;a.hv=this.hv;a.Oc=this.Oc;a.Ve=this.Ve;a.Ej=this.Ej;a.Cj=this.Cj;a.Ae=this.Ae;a.Pa=this.Pa;a.kb=this.kb;a.Qh=this.Qh;a.rs=this.rs;a.Ij=null===this.Ij?null:this.Ij.S();a.ls=this.ls;a.ms=this.ms;a.Jh=null;null!==this.Jh&&(a.Jh=v.fl(this.Jh));a.Ib=this.Ib;a.lq=this.lq;a.sc=this.sc;return a}; +ug.prototype.Zs=function(a){v.A(a,ug,ug,"copyFrom:pd");a.de?this.height=a.height:this.width=a.width;this.aj=a.aj;this.gf=a.gf;this.alignment=a.alignment;this.stretch=a.stretch;this.au=a.au;this.Ij=null===a.Ij?null:a.Ij.S();this.Dp=a.Dp;this.Ep=a.Ep;this.Jh=null;a.Jh&&(this.Jh=v.fl(a.Jh));this.background=a.background;this.kz=a.kz;this.sc=a.sc};ug.prototype.toString=function(){return"RowColumnDefinition "+(this.de?"(Row ":"(Column ")+this.index+") #"+v.ld(this)};var no; +ug.Default=no=v.p(ug,"Default",0);var Wn;ug.None=Wn=v.p(ug,"None",1);var Pn;ug.ProportionalExtra=Pn=v.p(ug,"ProportionalExtra",2);ug.prototype.Bl=function(a){this.Xg=a};ug.prototype.computeEffectiveSpacingTop=ug.prototype.rD=function(){var a=0;if(0!==this.index){var b=this.Xg,c=this.Dp;null===c&&null!==b&&(c=this.de?b.mi:b.xh);null!==c&&(a=this.Ep,isNaN(a)&&(a=null!==b?this.de?b.zh:b.yh:0))}b=this.VE;if(null===b)if(b=this.Xg,null!==b)b=b.kj;else return a;return a+(this.de?b.top:b.left)}; +ug.prototype.computeEffectiveSpacing=ug.prototype.Ie=function(){var a=0;if(0!==this.index){var b=this.Xg,c=this.Dp;null===c&&null!==b&&(c=this.de?b.mi:b.xh);null!==c&&(a=this.Ep,isNaN(a)&&(a=null!==b?this.de?b.zh:b.yh:0))}b=this.VE;if(null===b)if(b=this.Xg,null!==b)b=b.kj;else return a;return a+(this.de?b.top+b.bottom:b.left+b.right)}; +ug.prototype.$c=function(a,b,c,d,e){var f=this.Xg;if(null!==f&&(f.Lc(Af,a,this,b,c,d,e),null!==this.sc&&(b=f.g,null!==b&&!b.we&&(f=f.Uo(),null!==f&&(f=f.data,null!==f)))))for(c=this.sc.i;c.next();)c.value.ux(this,f,a,b)};v.u(ug,{R:"panel"},function(){return this.Xg});v.defineProperty(ug,{de:"isRow"},function(){return this.hv},function(a){this.hv=a});v.defineProperty(ug,{index:"index"},function(){return this.Oc},function(a){this.Oc=a}); +v.defineProperty(ug,{height:"height"},function(){return this.Ve},function(a){var b=this.Ve;b!==a&&(0>a&&v.va(a,">= 0",ug,"height"),this.Ve=a,this.Ia=this.Pa,null!==this.R&&this.R.N(),this.$c("height",b,a))});v.defineProperty(ug,{width:"width"},function(){return this.Ve},function(a){var b=this.Ve;b!==a&&(0>a&&v.va(a,">= 0",ug,"width"),this.Ve=a,this.Ia=this.Pa,null!==this.R&&this.R.N(),this.$c("width",b,a))}); +v.defineProperty(ug,{aj:"minimum"},function(){return this.Ej},function(a){var b=this.Ej;b!==a&&((0>a||!isFinite(a))&&v.va(a,">= 0",ug,"minimum"),this.Ej=a,this.Ia=this.Pa,null!==this.R&&this.R.N(),this.$c("minimum",b,a))});v.defineProperty(ug,{gf:"maximum"},function(){return this.Cj},function(a){var b=this.Cj;b!==a&&(0>a&&v.va(a,">= 0",ug,"maximum"),this.Cj=a,this.Ia=this.Pa,null!==this.R&&this.R.N(),this.$c("maximum",b,a))}); +v.defineProperty(ug,{alignment:"alignment"},function(){return this.Ae},function(a){var b=this.Ae;b.K(a)||(this.Ae=a.S(),null!==this.R&&this.R.N(),this.$c("alignment",b,a))});v.defineProperty(ug,{stretch:"stretch"},function(){return this.Qh},function(a){var b=this.Qh;b!==a&&(this.Qh=a,null!==this.R&&this.R.N(),this.$c("stretch",b,a))}); +v.defineProperty(ug,{VE:"separatorPadding"},function(){return this.Ij},function(a){"number"===typeof a&&(a=new cb(a));var b=this.Ij;null!==a&&null!==b&&b.K(a)||(null!==a&&(a=a.S()),this.Ij=a,null!==this.R&&this.R.N(),this.$c("separatorPadding",b,a))});v.defineProperty(ug,{Dp:"separatorStroke"},function(){return this.ls},function(a){var b=this.ls;b!==a&&(null===a||"string"===typeof a||a instanceof ha)&&(a instanceof ha&&a.freeze(),this.ls=a,null!==this.R&&this.R.N(),this.$c("separatorStroke",b,a))}); +v.defineProperty(ug,{Ep:"separatorStrokeWidth"},function(){return this.ms},function(a){var b=this.ms;b!==a&&(this.ms=a,null!==this.R&&this.R.N(),this.$c("separatorStrokeWidth",b,a))}); +v.defineProperty(ug,{wI:"separatorDashArray"},function(){return this.Jh},function(a){var b=this.Jh;if(b!==a){null===a||Array.isArray(a)||v.Cd(a,"Array",ug,"separatorDashArray:value");if(null!==a){for(var c=a.length,d=0,e=0;e<c;e++){var f=a[e];"number"===typeof f&&0<=f&&isFinite(f)||v.k("separatorDashArray value "+f+" at index "+e+" must be a positive number or zero.");d+=f}if(0===d){if(null===b)return;a=null}}this.Jh=a;null!==this.R&&this.R.pa();this.$c("separatorDashArray",b,a)}}); +v.defineProperty(ug,{background:"background"},function(){return this.Ib},function(a){var b=this.Ib;b!==a&&(null===a||"string"===typeof a||a instanceof ha)&&(a instanceof ha&&a.freeze(),this.Ib=a,null!==this.R&&this.R.pa(),this.$c("background",b,a))});v.defineProperty(ug,{kz:"coversSeparators"},function(){return this.lq},function(a){var b=this.lq;b!==a&&(v.j(a,"boolean",ug,"coversSeparators"),this.lq=a,null!==this.R&&this.R.pa(),this.$c("coversSeparators",b,a))}); +v.defineProperty(ug,{au:"sizing"},function(){return this.rs},function(a){var b=this.rs;b!==a&&(this.rs=a,null!==this.R&&this.R.N(),this.$c("sizing",b,a))});function Vn(a){if(a.au===no){var b=a.Xg;return a.de?b.rI:b.rG}return a.au}v.defineProperty(ug,{Ia:"actual"},function(){return this.Pa},function(a){this.Pa=isNaN(this.Ve)?Math.max(Math.min(this.Cj,a),this.Ej):Math.max(Math.min(this.Cj,this.Ve),this.Ej)}); +v.defineProperty(ug,{total:"total"},function(){return this.Pa+this.Ie()},function(a){this.Pa=isNaN(this.Ve)?Math.max(Math.min(this.Cj,a),this.Ej):Math.max(Math.min(this.Cj,this.Ve),this.Ej);this.Pa=Math.max(0,this.Pa-this.Ie())});v.defineProperty(ug,{position:"position"},function(){return this.kb},function(a){this.kb=a}); +ug.prototype.bind=ug.prototype.bind=function(a){a.pg=this;var b=this.R;if(null!==b){var c=b.Uo();null!==c&&an(c)&&v.k("Cannot add a Binding to a RowColumnDefinition that is already frozen: "+a+" on "+b)}null===this.sc&&(this.sc=new I(Ag));this.sc.add(a)}; +function Y(){G.call(this);this.Kf=this.bb=null;this.Jn="None";this.Hq=um;this.Dc=this.pd="black";this.Rh=1;this.wo="butt";this.yo="miter";this.rm=10;this.xo=null;this.le=0;this.Ph=this.Oh=fc;this.Ir=this.Hr=NaN;this.Pq=!1;this.Kr=null;this.Mn=this.Co="None";this.Mq=1}v.Ja(Y,G);v.ea("Shape",Y); +Y.prototype.cloneProtected=function(a){G.prototype.cloneProtected.call(this,a);a.bb=this.bb;a.Jn=this.Jn;a.Hq=this.Hq;a.Kf=this.Kf;a.pd=this.pd;a.Dc=this.Dc;a.Rh=this.Rh;a.wo=this.wo;a.yo=this.yo;a.rm=this.rm;null!==this.xo&&(a.xo=v.fl(this.xo));a.le=this.le;a.Oh=this.Oh.S();a.Ph=this.Ph.S();a.Hr=this.Hr;a.Ir=this.Ir;a.Pq=this.Pq;a.Kr=this.Kr;a.Co=this.Co;a.Mn=this.Mn;a.Mq=this.Mq};Y.prototype.toString=function(){return"Shape("+("None"!==this.Ab?this.Ab:"None"!==this.Kp?this.Kp:this.sz)+")#"+v.ld(this)}; +function oo(a,b,c,d){var e=c.length;if(!(4>e)){for(var f=d.Ca,h=Math.max(1,f.width),f=f.height,k=c[0],l=c[1],m=0,n=0,p=0,q=0,r=0,s=0,t=q=0,u=v.jb(),x=2;x<e;x+=2)m=c[x],n=c[x+1],p=m-k,q=n-l,0===p&&(p=.001),r=q/p,s=Math.atan2(q,p),q=Math.sqrt(p*p+q*q),u.push([p,s,r,q]),t+=q,k=m,l=n;k=c[0];l=c[1];p=d.Ca.width;d instanceof Y&&(p-=d.lb);1>p&&(p=1);for(var e=c=p,m=h/2,n=0===m?!1:!0,x=0,q=u[x],p=q[0],s=q[1],r=q[2],q=q[3],w=0;.1<=t;){0===w&&(n?(e=c,e-=m,t-=m,n=!1):e=c,0===e&&(e=1));if(e>t){v.sa(u);return}e> +q?(w=e-q,e=q):w=0;var y=Math.sqrt(e*e/(1+r*r));0>p&&(y=-y);k+=y;l+=r*y;a.translate(k,l);a.rotate(s);a.translate(-(h/2),-(f/2));0===w&&d.Yj(a,b);a.translate(h/2,f/2);a.rotate(-s);a.translate(-k,-l);t-=e;q-=e;if(0!==w){x++;if(x===u.length){v.sa(u);return}q=u[x];p=q[0];s=q[1];r=q[2];q=q[3];e=w}}v.sa(u)}} +Y.prototype.Yj=function(a,b){if(null!==this.Dc||null!==this.pd){null!==this.pd&&Om(this,a,this.pd,!0,!1);null!==this.Dc&&Om(this,a,this.Dc,!1,!1);var c=this.Rh;if(0===c){var d=this.Y;d instanceof Vg&&d.type===Di&&"Selection"===d.fc&&d.Zb instanceof Y&&d.Mf.Ye()===d.Zb&&(c=d.Zb.lb)}a.lineWidth=c;a.lineJoin=this.yo;a.lineCap=this.wo;a.miterLimit=this.rm;var e=!1;this.Y&&b.Ui("drawShadows")&&(e=this.Y.wl);var f=!0;null!==this.Dc&&null===this.pd&&(f=!1);var d=!1,h=!0,k=this.dF;null!==k&&(d=!0,h=a.pz(k, +this.le));var l=this.bb;if(null!==l){if(l.ia===Ie)a.beginPath(),d&&!h?Bm(a,l.vc,l.Cc,l.vb,l.Bb,k,this.le):(a.moveTo(l.vc,l.Cc),a.lineTo(l.vb,l.Bb)),null!==this.pd&&a.vg(this.pd),0!==c&&null!==this.Dc&&a.dj();else if(l.ia===Je){var m=l.vc,n=l.Cc,p=l.vb,q=l.Bb,l=Math.min(m,p),r=Math.min(n,q),m=Math.abs(p-m),n=Math.abs(q-n);null!==this.pd&&(a.beginPath(),a.rect(l,r,m,n),a.vg(this.pd));if(null!==this.Dc){var s=p=0,t=0;f&&e&&(p=a.shadowOffsetX,s=a.shadowOffsetY,t=a.shadowBlur,a.shadowOffsetX=0,a.shadowOffsetY= +0,a.shadowBlur=0);d&&!h?(h=v.jb(),h.push(l),h.push(r),h.push(l+m),h.push(r),h.push(l+m),h.push(r+n),h.push(l),h.push(r+n),h.push(l),h.push(r),a.beginPath(),po(a,h,k,this.le),a.dj(),v.sa(h)):0!==c&&(a.beginPath(),a.rect(l,r,m,n),a.dj());f&&e&&(a.shadowOffsetX=p,a.shadowOffsetY=s,a.shadowBlur=t)}}else if(l.ia===Ke)m=l.vc,n=l.Cc,p=l.vb,q=l.Bb,l=Math.abs(p-m)/2,r=Math.abs(q-n)/2,m=Math.min(m,p)+l,n=Math.min(n,q)+r,a.beginPath(),a.moveTo(m,n-r),a.bezierCurveTo(m+$c*l,n-r,m+l,n-$c*r,m+l,n),a.bezierCurveTo(m+ +l,n+$c*r,m+$c*l,n+r,m,n+r),a.bezierCurveTo(m-$c*l,n+r,m-l,n+$c*r,m-l,n),a.bezierCurveTo(m-l,n-$c*r,m-$c*l,n-r,m,n-r),a.closePath(),null!==this.pd&&a.vg(this.pd),d&&!h&&(h=v.jb(),Zd(m,n-r,m+$c*l,n-r,m+l,n-$c*r,m+l,n,.5,h),Zd(m+l,n,m+l,n+$c*r,m+$c*l,n+r,m,n+r,.5,h),Zd(m,n+r,m-$c*l,n+r,m-l,n+$c*r,m-l,n,.5,h),Zd(m-l,n,m-l,n-$c*r,m-$c*l,n-r,m,n-r,.5,h),a.beginPath(),po(a,h,k,this.le),v.sa(h)),0!==c&&null!==this.Dc&&(f&&e?(p=a.shadowOffsetX,s=a.shadowOffsetY,t=a.shadowBlur,a.shadowOffsetX=0,a.shadowOffsetY= +0,a.shadowBlur=0,a.dj(),a.shadowOffsetX=p,a.shadowOffsetY=s,a.shadowBlur=t):a.dj());else if(l.ia===Fe){r=l.mj;n=r.length;for(q=0;q<n;q++){m=r.n[q];a.beginPath();a.moveTo(m.Aa,m.xa);for(var p=m.sb.n,s=p.length,u=null,t=0;t<s;t++){var x=p[t];switch(x.ia){case ff:a.moveTo(x.I,x.J);break;case Ye:a.lineTo(x.I,x.J);break;case gf:a.bezierCurveTo(x.sd,x.Fe,x.Yg,x.ng,x.vb,x.Bb);break;case hf:a.quadraticCurveTo(x.sd,x.Fe,x.vb,x.Bb);break;case jf:if(x.radiusX===x.radiusY)u=Math.PI/180,a.arc(x.sd,x.Fe,x.radiusX, +x.xe*u,(x.xe+x.Af)*u,0>x.Af);else{var u=lf(x,m),w=u.length;if(0===w){a.lineTo(x.na,x.ua);break}for(var y=0;y<w;y++){var B=u[y];0===y&&a.lineTo(B[0],B[1]);a.bezierCurveTo(B[2],B[3],B[4],B[5],B[6],B[7])}}break;case kf:y=w=0;if(null!==u&&u.type===jf){u=lf(u,m);B=u.length;if(0===B){a.lineTo(x.na,x.ua);break}u=u[B-1]||null;null!==u&&(w=u[6],y=u[7])}else w=null!==u?u.I:m.Aa,y=null!==u?u.J:m.xa;u=mf(x,m,w,y);w=u.length;if(0===w){a.lineTo(x.na,x.ua);break}for(y=0;y<w;y++)B=u[y],a.bezierCurveTo(B[2],B[3], +B[4],B[5],B[6],B[7]);break;default:v.k("Segment not of valid type: "+x.ia)}x.Eh&&a.closePath();u=x}e?(t=s=p=0,m.Tn?(!0===m.Sl&&null!==this.pd?(a.vg(this.pd),f=!0):f=!1,0!==c&&null!==this.Dc&&(f&&(p=a.shadowOffsetX,s=a.shadowOffsetY,t=a.shadowBlur,a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0),d&&!h||a.dj(),f&&(a.shadowOffsetX=p,a.shadowOffsetY=s,a.shadowBlur=t))):(f&&(p=a.shadowOffsetX,s=a.shadowOffsetY,t=a.shadowBlur,a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0),!0===m.Sl&&null!==this.pd&& +a.vg(this.pd),0!==c&&null!==this.Dc&&(d&&!h||a.dj()),f&&(a.shadowOffsetX=p,a.shadowOffsetY=s,a.shadowBlur=t))):(!0===m.Sl&&null!==this.pd&&a.vg(this.pd),0===c||null===this.Dc||d&&!h||a.dj())}if(d&&!h)for(c=f,f=l.mj,h=f.length,l=0;l<h;l++){r=f.n[l];a.beginPath();n=v.jb();n.push(r.Aa);n.push(r.xa);q=r.Aa;m=r.xa;p=q;s=m;t=r.sb.n;x=t.length;for(u=0;u<x;u++){w=t[u];switch(w.ia){case ff:po(a,n,k,this.le);n.length=0;n.push(w.I);n.push(w.J);q=w.I;m=w.J;p=q;s=m;break;case Ye:n.push(w.I);n.push(w.J);q=w.I; +m=w.J;break;case gf:Zd(q,m,w.sd,w.Fe,w.Yg,w.ng,w.vb,w.Bb,.5,n);q=w.I;m=w.J;break;case hf:ce(q,m,w.sd,w.Fe,w.vb,w.Bb,.5,n);q=w.I;m=w.J;break;case jf:y=lf(w,r);B=y.length;if(0===B){n.push(w.na);n.push(w.ua);q=w.na;m=w.ua;break}for(var H=0;H<B;H++){var C=y[H];Zd(q,m,C[2],C[3],C[4],C[5],C[6],C[7],.5,n);q=C[6];m=C[7]}break;case kf:y=mf(w,r,q,m);B=y.length;if(0===B){n.push(w.na);n.push(w.ua);q=w.na;m=w.ua;break}for(H=0;H<B;H++)C=y[H],Zd(q,m,C[2],C[3],C[4],C[5],C[6],C[7],.5,n),q=C[6],m=C[7];break;default:v.k("Segment not of valid type: "+ +w.ia)}w.Eh&&(n.push(p),n.push(s),po(a,n,k,this.le))}po(a,n,k,this.le);v.sa(n);null!==this.Dc&&(q=n=r=0,c&&e&&(r=a.shadowOffsetX,n=a.shadowOffsetY,q=a.shadowBlur,a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0),a.dj(),c&&e&&(a.shadowOffsetX=r,a.shadowOffsetY=n,a.shadowBlur=q))}}d&&a.nz();if(null!==this.Ww){d=this.Ww;lj(d,Infinity,Infinity);k=d.Ca;d.Ec(0,0,k.width,k.height);c=this.fh;a.save();a.beginPath();k=v.jb();if(c.type===Ie)k.push(c.Aa),k.push(c.xa),k.push(c.I),k.push(c.J),oo(a,b,k,d);else if(c.type=== +Fe)for(h=c.Ub.i;h.next();){l=h.value;k.length=0;k.push(l.Aa);k.push(l.xa);f=l.Aa;r=l.xa;n=f;q=r;m=l.sb.n;p=m.length;for(s=0;s<p;s++){t=m[s];switch(t.ia){case ff:oo(a,b,k,d);k.length=0;k.push(t.I);k.push(t.J);f=t.I;r=t.J;n=f;q=r;break;case Ye:k.push(t.I);k.push(t.J);f=t.I;r=t.J;break;case gf:Zd(f,r,t.sd,t.Fe,t.Yg,t.ng,t.vb,t.Bb,.5,k);f=t.I;r=t.J;break;case hf:ce(f,r,t.sd,t.Fe,t.vb,t.Bb,.5,k);f=t.I;r=t.J;break;case jf:c=lf(t,l);e=c.length;if(0===e){k.push(t.na);k.push(t.ua);f=t.na;r=t.ua;break}for(x= +0;x<e;x++)u=c[x],Zd(f,r,u[2],u[3],u[4],u[5],u[6],u[7],.5,k),f=u[6],r=u[7];break;case kf:c=mf(t,l,f,r);e=c.length;if(0===e){k.push(t.na);k.push(t.ua);f=t.na;r=t.ua;break}for(x=0;x<e;x++)u=c[x],Zd(f,r,u[2],u[3],u[4],u[5],u[6],u[7],.5,k),f=u[6],r=u[7];break;default:v.k("Segment not of valid type: "+t.ia)}t.Eh&&(k.push(n),k.push(q),oo(a,b,k,d))}oo(a,b,k,d)}else if(c.type===Je)k.push(c.Aa),k.push(c.xa),k.push(c.I),k.push(c.xa),k.push(c.I),k.push(c.J),k.push(c.Aa),k.push(c.J),k.push(c.Aa),k.push(c.xa), +oo(a,b,k,d);else if(c.type===Ke){h=new Ge;h.Aa=c.I;h.xa=(c.xa+c.J)/2;f=new wf(jf);f.xe=0;f.Af=360;f.na=(c.Aa+c.I)/2;f.ua=(c.xa+c.J)/2;f.radiusX=Math.abs(c.Aa-c.I)/2;f.radiusY=Math.abs(c.xa-c.J)/2;h.add(f);c=lf(f,h);e=c.length;if(0===e)k.push(f.na),k.push(f.ua);else for(f=h.Aa,r=h.xa,x=0;x<e;x++)u=c[x],Zd(f,r,u[2],u[3],u[4],u[5],u[6],u[7],.5,k),f=u[6],r=u[7];oo(a,b,k,d)}v.sa(k);a.restore();Zc(a,!1)}}}}; +function po(a,b,c,d){var e=b.length;if(!(4>e)){var f=.001,h=c.length,k=b[0],l=b[1];if(4===e)Bm(a,k,l,b[2],b[3],c,d);else{a.moveTo(k,l);for(var m=f=0,n=0,p=0,q=0,r=p=0,s=v.jb(),t=2;t<e;t+=2)f=b[t],m=b[t+1],n=f-k,p=m-l,0===n&&(n=.001),q=p/n,p=Math.sqrt(n*n+p*p),s.push([n,q,p]),r+=p,k=f,l=m;k=b[0];l=b[1];b=0;for(var e=!0,f=c[b%h],m=0!==d,t=0,p=s[t],n=p[0],q=p[1],p=p[2],u=0;.1<=r;){0===u&&(f=c[b%h],b++,m&&(d%=f,f-=d,m=!1));f>r&&(f=r);f>p?(u=f-p,f=p):u=0;var x=Math.sqrt(f*f/(1+q*q));0>n&&(x=-x);k+=x;l+= +q*x;e?a.lineTo(k,l):a.moveTo(k,l);r-=f;p-=f;if(0!==u){t++;if(t===s.length){v.sa(s);return}p=s[t];n=p[0];q=p[1];p=p[2];f=u}else e=!e}v.sa(s)}}}Y.prototype.getDocumentPoint=Y.prototype.Xa=function(a,b){void 0===b&&(b=new z);a.se()&&v.k("getDocumentPoint Spot must be a real, specific Spot, not: "+a.toString());var c=this.Ha,d=this.lb;b.m(a.x*(c.width+d)-d/2+c.x+a.offsetX,a.y*(c.height+d)-d/2+c.y+a.offsetY);this.Zg.ub(b);return b}; +Y.prototype.Wj=function(a,b){var c=this.fh;if(null===c||null===this.fill&&null===this.stroke)return!1;var d=c.mb,e=this.lb/2;c.type!==Ie||b||(e+=2);var f=v.ag();f.assign(d);f.Qf(e+2,e+2);if(!f.Fa(a))return v.Vb(f),!1;d=e+1E-4;if(c.type===Ie){if(null===this.stroke)return!1;d=(c.I-c.Aa)*(a.x-c.Aa)+(c.J-c.xa)*(a.y-c.xa);if(0>(c.Aa-c.I)*(a.x-c.I)+(c.xa-c.J)*(a.y-c.J)||0>d)return!1;v.Vb(f);return Md(c.Aa,c.xa,c.I,c.J,e,a.x,a.y)}if(c.type===Je){var h=c.Aa,k=c.xa,l=c.I,m=c.J;f.x=Math.min(h,l);f.y=Math.min(k, +m);f.width=Math.abs(l-h);f.height=Math.abs(m-k);if(null===this.fill){f.Qf(-d,-d);if(f.Fa(a))return v.Vb(f),!1;f.Qf(d,d)}null!==this.stroke&&f.Qf(e,e);e=f.Fa(a);v.Vb(f);return e}if(c.type===Ke){var h=c.Aa,k=c.xa,l=c.I,m=c.J,c=Math.min(h,l),n=Math.min(k,m),h=Math.abs(l-h)/2,k=Math.abs(m-k)/2,c=a.x-(c+h),n=a.y-(n+k);if(null===this.fill){h-=d;k-=d;if(0>=h||0>=k||1>=c*c/(h*h)+n*n/(k*k))return v.Vb(f),!1;h+=d;k+=d}null!==this.stroke&&(h+=e,k+=e);v.Vb(f);return 0>=h||0>=k?!1:1>=c*c/(h*h)+n*n/(k*k)}if(c.type=== +Fe)return v.Vb(f),null===this.fill?vf(c,a.x,a.y,e):c.Fa(a,e,1<this.lb,b);v.k("Unknown Geometry type: "+c.type);return!1}; +Y.prototype.mp=function(a,b,c,d){var e=this.za,f=this.Rh;a=Math.max(a,0);b=Math.max(b,0);var h;if(null!==this.Kf)h=this.fh.mb;else{var k=this.Ab,l=Id[k];if(void 0===l){var m=qo[k];"string"===typeof m&&(m=qo[m]);"function"===typeof m?(l=m(null,100,100),Id[k]=l):v.k("Unsupported Figure: "+k)}h=l.mb}var k=h.width,l=h.height,m=h.width,n=h.height;switch(Gm(this,!0)){case Ti:d=c=0;break;case He:m=Math.max(a-f,0);n=Math.max(b-f,0);break;case wm:m=Math.max(a-f,0);d=0;break;case vm:c=0,n=Math.max(b-f,0)}isFinite(e.width)&& +(m=e.width);isFinite(e.height)&&(n=e.height);e=this.xf;h=this.kh;c=Math.max(c,h.width)-f;d=Math.max(d,h.height)-f;m=Math.min(e.width,m);n=Math.min(e.height,n);m=isFinite(m)?Math.max(c,m):Math.max(k,c);n=isFinite(n)?Math.max(d,n):Math.max(l,d);c=Ui(this);switch(c){case Ti:break;case He:k=m;l=n;break;case Vi:c=Math.min(m/k,n/l);isFinite(c)||(c=1);k*=c;l*=c;break;default:v.k(c+" is not a valid geometryStretch.")}if(null!==this.Kf)k=Math.max(k,.01),l=Math.max(l,.01),h=null!==this.Kf?this.Kf:this.bb,e= +k,d=l,c=h.copy(),h=h.mb,e/=h.width,d/=h.height,isFinite(e)||(e=1),isFinite(d)||(d=1),1===e&&1===d||c.scale(e,d),this.bb=c;else if(null===this.bb||this.bb.Sn!==a-f||this.bb.Qn!==b-f)this.bb=Y.makeGeometry(this,k,l);h=this.bb.mb;Infinity===a||Infinity===b?Dm(this,h.x-f/2,h.y-f/2,0===a&&0===k?0:h.width+f,0===b&&0===l?0:h.height+f):Dm(this,-(f/2),-(f/2),m+f,n+f)}; +function Xn(a,b,c,d){if(!1!==fl(a)){a.jd.Oa();var e=a.Rh;0===e&&d instanceof Vg&&d.type===Di&&d.Zb instanceof Y&&(e=d.Zb.lb);e*=a.Tb;d instanceof W&&null!==d.bb?(b=d.bb.mb,Dm(a,b.x-e/2,b.y-e/2,b.width+e,b.height+e)):Dm(a,-(e/2),-(e/2),b+e,c+e);a.jd.freeze();a.jd.G()||v.k("Non-real measuredBounds has been set. Object "+a+", measuredBounds: "+a.jd.toString());Sk(a,!1)}}function Ui(a){var b=a.vz;return null!==a.Kf?b===um?He:b:b===um?Id[a.Ab].Jd:b}Y.prototype.Ni=function(a,b,c,d){Hm(this,a,b,c,d)}; +Y.prototype.getNearestIntersectionPoint=Y.prototype.RD=function(a,b,c){return this.Zo(a.x,a.y,b.x,b.y,c)}; +Y.prototype.Zo=function(a,b,c,d,e){var f=this.transform,h=1/(f.m11*f.m22-f.m12*f.m21),k=f.m22*h,l=-f.m12*h,m=-f.m21*h,n=f.m11*h,p=h*(f.m21*f.dy-f.m22*f.dx),q=h*(f.m12*f.dx-f.m11*f.dy),f=a*k+b*m+p,h=a*l+b*n+q,k=c*k+d*m+p,l=c*l+d*n+q,m=this.lb/2,p=this.bb;null===p&&(lj(this,Infinity,Infinity),p=this.bb);q=p.mb;n=!1;if(p.type===Ie)if(1.5>=this.lb)n=fe(p.vc,p.Cc,p.vb,p.Bb,f,h,k,l,e);else{var r=0,s=0;p.vc===p.vb?(r=m,s=0):(b=(p.Bb-p.Cc)/(p.vb-p.vc),s=m/Math.sqrt(1+b*b),r=s*b);d=v.jb();b=new z;fe(p.vc+ +r,p.Cc+s,p.vb+r,p.Bb+s,f,h,k,l,b)&&d.push(b);b=new z;fe(p.vc-r,p.Cc-s,p.vb-r,p.Bb-s,f,h,k,l,b)&&d.push(b);b=new z;fe(p.vc+r,p.Cc+s,p.vc-r,p.Cc-s,f,h,k,l,b)&&d.push(b);b=new z;fe(p.vb+r,p.Bb+s,p.vb-r,p.Bb-s,f,h,k,l,b)&&d.push(b);b=d.length;if(0===b)return v.sa(d),!1;n=!0;s=Infinity;for(r=0;r<b;r++){var k=d[r],t=(k.x-f)*(k.x-f)+(k.y-h)*(k.y-h);t<s&&(s=t,e.x=k.x,e.y=k.y)}v.sa(d)}else if(p.type===Je)b=q.x-m,n=ge(b,q.y-m,q.x+q.width+m,q.y+q.height+m,f,h,k,l,e);else if(p.type===Ke)a:if(b=q.copy().Qf(m, +m),0===b.width)n=fe(b.x,b.y,b.x,b.y+b.height,f,h,k,l,e);else if(0===b.height)n=fe(b.x,b.y,b.x+b.width,b.y,f,h,k,l,e);else{a=b.width/2;var u=b.height/2;d=b.x+a;b=b.y+u;c=9999;f!==k&&(c=(h-l)/(f-k));if(9999>Math.abs(c)){n=h-b-c*(f-d);if(0>a*a*c*c+u*u-n*n){e.x=NaN;e.y=NaN;n=!1;break a}m=Math.sqrt(a*a*c*c+u*u-n*n);k=(-(a*a*c*n)+a*u*m)/(u*u+a*a*c*c)+d;a=(-(a*a*c*n)-a*u*m)/(u*u+a*a*c*c)+d;l=c*(k-d)+n+b;b=c*(a-d)+n+b;d=Math.abs((f-k)*(f-k))+Math.abs((h-l)*(h-l));h=Math.abs((f-a)*(f-a))+Math.abs((h-b)*(h- +b));d<h?(e.x=k,e.y=l):(e.x=a,e.y=b)}else{k=u*u;l=f-d;k-=k/(a*a)*l*l;if(0>k){e.x=NaN;e.y=NaN;n=!1;break a}m=Math.sqrt(k);l=b+m;b-=m;d=Math.abs(l-h);h=Math.abs(b-h);d<h?(e.x=f,e.y=l):(e.x=f,e.y=b)}n=!0}else if(p.type===Fe){var x=0,w=0,y=t=0,q=v.L(),r=k-f,s=l-h,s=r*r+s*s;e.x=k;e.y=l;for(r=0;r<p.Ub.count;r++)for(var B=p.Ub.n[r],H=B.sb,x=B.Aa,w=B.xa,C=x,T=w,ba=0;ba<H.count;ba++){var U=H.n[ba],M=U.type,t=U.I,y=U.J,aa=!1;switch(M){case ff:C=t;T=y;break;case Ye:aa=ro(x,w,t,y,f,h,k,l,q);break;case gf:var aa= +U.rc,M=U.Kc,Ia=U.mh,oa=U.nh,aa=de(x,w,aa,M,Ia,oa,t,y,f,h,k,l,.5,q);break;case hf:aa=(x+2*U.rc)/3;M=(w+2*U.Kc)/3;Ia=(2*U.rc+t)/3;oa=(2*U.rc+t)/3;aa=de(x,w,aa,M,Ia,oa,t,y,f,h,k,l,.5,q);break;case jf:case kf:M=U.type===jf?lf(U,B):mf(U,B,x,w);Ia=M.length;if(0===Ia){aa=ro(x,w,U.na,U.ua,f,h,k,l,q);break}for(y=0;y<Ia;y++)u=M[y],0===y&&ro(x,w,u[0],u[1],f,h,k,l,q)&&(t=so(f,h,q,s,e),t<s&&(s=t,n=!0)),de(u[0],u[1],u[2],u[3],u[4],u[5],u[6],u[7],f,h,k,l,.5,q)&&(t=so(f,h,q,s,e),t<s&&(s=t,n=!0));t=u[6];y=u[7];break; +default:v.k("Unknown Segment type: "+M)}x=t;w=y;aa&&(t=so(f,h,q,s,e),t<s&&(s=t,n=!0));U.Hw&&(t=C,y=T,ro(x,w,t,y,f,h,k,l,q)&&(t=so(f,h,q,s,e),t<s&&(s=t,n=!0)))}f=c-a;h=d-b;b=Math.sqrt(f*f+h*h);0!==b&&(f/=b,h/=b);e.x-=f*m;e.y-=h*m;v.v(q)}else v.k("Unknown Geometry type: "+p.type);if(!n)return!1;this.transform.ub(e);return!0};function so(a,b,c,d,e){a=c.x-a;b=c.y-b;b=a*a+b*b;return b<d?(e.x=c.x,e.y=c.y,b):d} +function ro(a,b,c,d,e,f,h,k,l){var m=!1,n=(e-h)*(b-d)-(f-k)*(a-c);if(0===n)return!1;l.x=((e*k-f*h)*(a-c)-(e-h)*(a*d-b*c))/n;l.y=((e*k-f*h)*(b-d)-(f-k)*(a*d-b*c))/n;(a>c?a-c:c-a)<(b>d?b-d:d-b)?(e=b<d?b:d,a=b<d?d:b,(l.y>e||Hc(l.y,e))&&(l.y<a||Hc(l.y,a))&&(m=!0)):(e=a<c?a:c,a=a<c?c:a,(l.x>e||Hc(l.x,e))&&(l.x<a||Hc(l.x,a))&&(m=!0));return m} +Y.prototype.containedInRect=Y.prototype.Em=function(a,b){if(void 0===b)return a.Xj(this.U);var c=this.bb;null===c&&(lj(this,Infinity,Infinity),c=this.bb);var c=c.mb,d=this.lb/2,e=!1,f=v.L();f.m(c.x-d,c.y-d);a.Fa(b.ub(f))&&(f.m(c.x-d,c.bottom+d),a.Fa(b.ub(f))&&(f.m(c.right+d,c.bottom+d),a.Fa(b.ub(f))&&(f.m(c.right+d,c.y-d),a.Fa(b.ub(f))&&(e=!0))));v.v(f);return e}; +Y.prototype.intersectsRect=Y.prototype.yg=function(a,b){if(this.Em(a,b)||void 0===b&&(b=this.transform,a.Xj(this.U)))return!0;var c=v.rh();c.set(b);c.Cz();var d=a.left,e=a.right,f=a.top,h=a.bottom,k=v.L();k.m(d,f);c.ub(k);if(this.Wj(k,!0))return v.v(k),!0;k.m(e,f);c.ub(k);if(this.Wj(k,!0))return v.v(k),!0;k.m(d,h);c.ub(k);if(this.Wj(k,!0))return v.v(k),!0;k.m(e,h);c.ub(k);if(this.Wj(k,!0))return v.v(k),!0;var l=v.L(),m=v.L();c.set(b);c.wE(this.transform);c.Cz();l.x=e;l.y=f;l.transform(c);k.x=d;k.y= +f;k.transform(c);var n=!1;to(this,k,l,m)?n=!0:(k.x=e,k.y=h,k.transform(c),to(this,k,l,m)?n=!0:(l.x=d,l.y=h,l.transform(c),to(this,k,l,m)?n=!0:(k.x=d,k.y=f,k.transform(c),to(this,k,l,m)&&(n=!0))));v.v(k);v.$e(c);v.v(l);v.v(m);return n};function to(a,b,c,d){if(!a.RD(b,c,d))return!1;a=b.x;b=b.y;var e=c.x;c=c.y;var f=d.x;d=d.y;if(a===e){var h=0;a=0;b<c?(h=b,a=c):(h=c,a=b);return d>=h&&d<=a}a<e?(h=a,a=e):h=e;return f>=h&&f<=a} +Y.prototype.LD=function(a,b,c){function d(a,b){for(var c=a.length,d=0;d<c;d+=2)if(b.Ro(a[d],a[d+1])>e)return!0;return!1}if(c&&null!==this.fill&&this.Wj(a,!0))return!0;var e=a.rf(b);b=e;1.5<this.lb&&(e=this.lb/2+Math.sqrt(e),e*=e);var f=this.bb;if(null===f&&(lj(this,Infinity,Infinity),f=this.bb,null===f))return!1;if(!c){var h=f.mb,k=h.x,l=h.y,m=h.x+h.width,h=h.y+h.height;if(Ta(a.x,a.y,k,l)<=e&&Ta(a.x,a.y,m,l)<=e&&Ta(a.x,a.y,k,h)<=e&&Ta(a.x,a.y,m,h)<=e)return!0}k=f.vc;l=f.Cc;m=f.vb;h=f.Bb;if(f.type=== +Ie){if(c=Sa(a.x,a.y,k,l,m,h),f=(k-m)*(a.x-m)+(l-h)*(a.y-h),c<=(0<=(m-k)*(a.x-k)+(h-l)*(a.y-l)&&0<=f?e:b))return!0}else{if(f.type===Je)return b=!1,c&&(b=Sa(a.x,a.y,k,l,k,h)<=e||Sa(a.x,a.y,k,l,m,l)<=e||Sa(a.x,a.y,m,l,m,h)<=e||Sa(a.x,a.y,k,h,m,h)<=e),b;if(f.type===Ke){b=a.x-(k+m)/2;var f=a.y-(l+h)/2,n=Math.abs(m-k)/2,p=Math.abs(h-l)/2;if(0===n||0===p)return c=Sa(a.x,a.y,k,l,m,h),c<=e?!0:!1;if(c){if(a=ue(n,p,b,f),a*a<=e)return!0}else return Ta(b,f,-n,0)>=e||Ta(b,f,0,-p)>=e||Ta(b,f,0,p)>=e||Ta(b,f,n,0)>= +e?!1:!0}else if(f.type===Fe){h=f.mb;k=h.x;l=h.y;m=h.x+h.width;h=h.y+h.height;if(a.x>m&&a.x<k&&a.y>h&&a.y<l&&Sa(a.x,a.y,k,l,k,h)>e&&Sa(a.x,a.y,k,l,m,l)>e&&Sa(a.x,a.y,m,h,k,h)>e&&Sa(a.x,a.y,m,h,m,l)>e)return!1;b=Math.sqrt(e);if(c){if(null===this.fill?vf(f,a.x,a.y,b):f.Fa(a,b,!0))return!0}else{c=f.Ub;for(b=0;b<c.count;b++){k=c.n[b];n=k.Aa;p=k.xa;if(a.Ro(n,p)>e)return!1;l=k.sb.n;m=l.length;for(h=0;h<m;h++){var q=l[h];switch(q.type){case ff:case Ye:n=q.I;p=q.J;if(a.Ro(n,p)>e)return!1;break;case gf:f=v.jb(); +Zd(n,p,q.rc,q.Kc,q.mh,q.nh,q.I,q.J,.8,f);n=d(f,a);v.sa(f);if(n)return!1;n=q.I;p=q.J;if(a.Ro(n,p)>e)return!1;break;case hf:f=v.jb();ce(n,p,q.rc,q.Kc,q.I,q.J,.8,f);n=d(f,a);v.sa(f);if(n)return!1;n=q.I;p=q.J;if(a.Ro(n,p)>e)return!1;break;case jf:case kf:var r=q.type===jf?lf(q,k):mf(q,k,n,p),s=r.length;if(0===s){n=q.na;p=q.ua;if(a.Ro(n,p)>e)return!1;break}q=null;f=v.jb();for(b=0;b<s;b++)if(q=r[b],f.length=0,Zd(q[0],q[1],q[2],q[3],q[4],q[5],q[6],q[7],.8,f),d(f,a))return v.sa(f),!1;v.sa(f);null!==q&&(n= +q[6],p=q[7]);break;default:v.k("Unknown Segment type: "+q.type)}}}return!0}}}return!1};v.defineProperty(Y,{fh:"geometry"},function(){return null!==this.bb?this.bb:this.Kf},function(a){var b=this.bb;if(b!==a){this.Kf=null!==a?this.bb=a.freeze():this.bb=null;var c=this.Y;null!==c&&(c.Aj=NaN);this.N();this.h("geometry",b,a);0!==(this.fa&1024)&&(a=this.Y,null!==a&&Cm(this,a,"geometryString"))}}); +v.defineProperty(Y,{VG:"geometryString"},function(){return null===this.fh?"":this.fh.toString()},function(a){a=$e(a);var b=a.normalize();this.fh=a;this.position=a=v.Mb(-b.x,-b.y);v.v(a)});v.defineProperty(Y,{dE:"isGeometryPositioned"},function(){return this.Pq},function(a){var b=this.Pq;b!==a&&(this.Pq=a,this.N(),this.h("isGeometryPositioned",b,a))});Y.prototype.ce=function(){this.bb=null}; +v.defineProperty(Y,{fill:"fill"},function(){return this.pd},function(a){var b=this.pd;b!==a&&(a instanceof ha&&a.freeze(),this.pd=a,this.pa(),this.h("fill",b,a))});v.defineProperty(Y,{stroke:"stroke"},function(){return this.Dc},function(a){var b=this.Dc;b!==a&&(a instanceof ha&&a.freeze(),this.Dc=a,this.pa(),this.h("stroke",b,a))}); +v.defineProperty(Y,{lb:"strokeWidth"},function(){return this.Rh},function(a){var b=this.Rh;if(b!==a)if(0<=a){this.Rh=a;this.N();var c=this.Y;null!==c&&(c.Aj=NaN);this.h("strokeWidth",b,a)}else v.va(a,"value >= 0",Y,"strokeWidth:value")});v.defineProperty(Y,{HK:"strokeCap"},function(){return this.wo},function(a){var b=this.wo;b!==a&&("string"!==typeof a||"butt"!==a&&"round"!==a&&"square"!==a?v.va(a,'"butt", "round", or "square"',Y,"strokeCap"):(this.wo=a,this.pa(),this.h("strokeCap",b,a)))}); +v.defineProperty(Y,{JK:"strokeJoin"},function(){return this.yo},function(a){var b=this.yo;b!==a&&("string"!==typeof a||"miter"!==a&&"bevel"!==a&&"round"!==a?v.va(a,'"miter", "bevel", or "round"',Y,"strokeJoin"):(this.yo=a,this.pa(),this.h("strokeJoin",b,a)))});v.defineProperty(Y,{KK:"strokeMiterLimit"},function(){return this.rm},function(a){var b=this.rm;if(b!==a)if(1<=a){this.rm=a;this.pa();var c=this.Y;null!==c&&(c.Aj=NaN);this.h("strokeMiterLimit",b,a)}else v.va(a,"value >= 1",Y,"strokeWidth:value")}); +v.defineProperty(Y,{dF:"strokeDashArray"},function(){return this.xo},function(a){var b=this.xo;if(b!==a){null===a||Array.isArray(a)||v.Cd(a,"Array",Y,"strokeDashArray:value");if(null!==a){for(var c=a.length,d=0,e=0;e<c;e++){var f=a[e];"number"===typeof f&&0<=f&&isFinite(f)||v.k("strokeDashArray:value "+f+" at index "+e+" must be a positive number or zero.");d+=f}if(0===d){if(null===b)return;a=null}}this.xo=a;this.pa();this.h("strokeDashArray",b,a)}}); +v.defineProperty(Y,{IK:"strokeDashOffset"},function(){return this.le},function(a){var b=this.le;b!==a&&0<=a&&(this.le=a,this.pa(),this.h("strokeDashOffset",b,a))});v.defineProperty(Y,{Ab:"figure"},function(){return this.Jn},function(a){var b=this.Jn;if(b!==a){var c=qo[a];"function"===typeof c?c=a:(c=qo[a.toLowerCase()])||v.k("Unknown Shape.figure: "+a);b!==c&&(a=this.Y,null!==a&&(a.Aj=NaN),this.Jn=c,this.Kf=null,this.ce(),this.N(),this.h("figure",b,c))}}); +v.defineProperty(Y,{Kp:"toArrow"},function(){return this.Co},function(a){var b=this.Co;!0===a?a="Standard":!1===a&&(a="");if(b!==a){var c=uo(a);null===c?v.k("Unknown Shape.toArrow: "+a):b!==c&&(this.Co=c,this.Kf=null,this.ce(),this.N(),vo(this),this.h("toArrow",b,c))}}); +v.defineProperty(Y,{sz:"fromArrow"},function(){return this.Mn},function(a){var b=this.Mn;!0===a?a="Standard":!1===a&&(a="");if(b!==a){var c=uo(a);null===c?v.k("Unknown Shape.fromArrow: "+a):b!==c&&(this.Mn=c,this.Kf=null,this.ce(),this.N(),vo(this),this.h("fromArrow",b,c))}});function vo(a){var b=a.g;null!==b&&b.la.ib||(a.Vt=wo,"None"!==a.Co?(a.ve=-1,a.Uj=uc):"None"!==a.Mn&&(a.ve=0,a.Uj=new L(1-uc.x,uc.y)))} +v.defineProperty(Y,{B:"spot1"},function(){return this.Oh},function(a){v.A(a,L,Y,"spot1");var b=this.Oh;b.K(a)||(this.Oh=a=a.S(),this.N(),this.h("spot1",b,a))});v.defineProperty(Y,{C:"spot2"},function(){return this.Ph},function(a){v.A(a,L,Y,"spot2");var b=this.Ph;b.K(a)||(this.Ph=a=a.S(),this.N(),this.h("spot2",b,a))});v.defineProperty(Y,{Ac:"parameter1"},function(){return this.Hr},function(a){var b=this.Hr;b!==a&&(this.Hr=a,this.ce(),this.N(),this.h("parameter1",b,a))}); +v.defineProperty(Y,{Mt:"parameter2"},function(){return this.Ir},function(a){var b=this.Ir;b!==a&&(this.Ir=a,this.ce(),this.N(),this.h("parameter2",b,a))});v.u(Y,{Ha:"naturalBounds"},function(){if(null!==this.bb)return this.Qc.assign(this.bb.mb),this.Qc;var a=this.za;return new A(0,0,a.width,a.height)});v.defineProperty(Y,{Ww:"pathPattern"},function(){return this.Kr},function(a){var b=this.Kr;b!==a&&(this.Kr=a,this.pa(),this.h("pathPattern",b,a))}); +v.defineProperty(Y,{yK:"pathObject"},function(){return this.Ww},function(a){this.Ww=a});v.defineProperty(Y,{vz:"geometryStretch"},function(){return this.Hq},function(a){var b=this.Hq;b!==a&&(v.pb(a,G,Y,"geometryStretch"),this.Hq=a,this.h("geometryStretch",b,a))});v.defineProperty(Y,{interval:"interval"},function(){return this.Mq},function(a){var b=this.Mq;a=Math.floor(a);if(b!==a&&0<=a){this.Mq=a;var c=this.g;null!==c&&this.R===c.$o&&$k(c);this.N();this.h("interval",b,a)}}); +Y.makeGeometry=function(a,b,c){var d=null;if("None"!==a.Kp)d=Jd[a.Kp];else if("None"!==a.sz)d=Jd[a.sz];else{var e=qo[a.Ab];"string"===typeof e&&(e=qo[e]);void 0===e&&v.k("Unknown Shape.figure: "+a.Ab);d=e(a,b,c);d.Sn=b;d.Qn=c}null===d&&(e=qo.Rectangle,"function"===typeof e&&(d=e(a,b,c)));return d};Y.getFigureGenerators=function(){var a=new na("string","function"),b;for(b in qo)if(b!==b.toLowerCase()){var c=qo[b];"function"===typeof c&&a.add(b,c)}a.freeze();return a}; +Y.defineFigureGenerator=function(a,b){v.j(a,"string",Y,"defineFigureGenerator:name");"string"===typeof b?""!==b&&qo[b]||v.k("Shape.defineFigureGenerator synonym must not be empty or None or not a defined figure name: "+b):v.j(b,"function",Y,"defineFigureGenerator:func");var c=a.toLowerCase();""!==a&&"none"!==c&&a!==c||v.k("Shape.defineFigureGenerator name must not be empty or None or all-lower-case: "+a);qo[a]=b;qo[c]=a}; +Y.getArrowheadGeometries=function(){var a=new na("string",ve),b;for(b in Jd)if(b!==b.toLowerCase()){var c=Jd[b];c instanceof ve&&a.add(b,c)}a.freeze();return a}; +Y.defineArrowheadGeometry=function(a,b){v.j(a,"string",Y,"defineArrowheadGeometry:name");var c=null;"string"===typeof b?(v.j(b,"string",Y,"defineArrowheadGeometry:pathstr"),c=$e(b,!1)):(v.A(b,ve,Y,"defineArrowheadGeometry:pathstr"),c=b);var d=a.toLowerCase();""!==a&&"none"!==d&&a!==d||v.k("Shape.defineArrowheadGeometry name must not be empty or None or all-lower-case: "+a);Jd[a]=c;Jd[d]=a}; +function bh(){G.call(this);this.me="";this.Dc="black";this.Ah="13px sans-serif";this.tm="start";this.Rq=!0;this.Ul=this.Vl=!1;this.Tk=xo;this.vm=yo;this.pv=this.De=0;this.Ln=this.yy=this.zy=null;this.Lk=new zo;this.Bq=!1;this.nf=this.Vk=this.As=null;this.Lj=this.Kj=0;this.yi=Infinity;this.kv=0}v.Ja(bh,G);v.ea("TextBlock",bh);var Ao=new ta,Bo=0,Co=new ta,Do=0,Eo="...",Fo="",Go=(new Rc(null)).el;bh.getEllipsis=function(){return Eo};bh.setEllipsis=function(a){Eo=a;Co=new ta;Do=0}; +bh.prototype.cloneProtected=function(a){G.prototype.cloneProtected.call(this,a);a.me=this.me;a.Dc=this.Dc;a.Ah=this.Ah;a.tm=this.tm;a.Rq=this.Rq;a.Vl=this.Vl;a.Ul=this.Ul;a.Tk=this.Tk;a.vm=this.vm;a.De=this.De;a.pv=this.pv;a.zy=this.zy;a.yy=this.yy;a.Ln=this.Ln;a.Lk.Zs(this.Lk);a.Bq=this.Bq;a.As=this.As;a.Vk=this.Vk;a.nf=this.nf;a.Kj=this.Kj;a.Lj=this.Lj;a.yi=this.yi;a.kv=this.kv}; +bh.prototype.toString=function(){return 22<this.me.length?'TextBlock("'+this.me.substring(0,20)+'"...)':'TextBlock("'+this.me+'")'};var Ho;bh.None=Ho=v.p(bh,"None",0);var Io;bh.WrapFit=Io=v.p(bh,"WrapFit",1);var yo;bh.WrapDesiredSize=yo=v.p(bh,"WrapDesiredSize",2);var xo;bh.OverflowClip=xo=v.p(bh,"OverflowClip",0);var Jo;bh.OverflowEllipsis=Jo=v.p(bh,"OverflowEllipsis",1);bh.prototype.N=function(){G.prototype.N.call(this);this.yy=this.zy=null}; +v.defineProperty(bh,{font:"font"},function(){return this.Ah},function(a){var b=this.Ah;b!==a&&(this.Ah=a,this.Ln=null,this.N(),this.h("font",b,a))});bh.isValidFont=function(a){var b=Go.font;if(a===b||"10px sans-serif"===a)return!0;Go.font="10px sans-serif";var c;Go.font=a;var d=Go.font;if("10px sans-serif"!==d)return Go.font=b,!0;Go.font="19px serif";c=Go.font;Go.font=a;d=Go.font;Go.font=b;return d!==c}; +v.defineProperty(bh,{text:"text"},function(){return this.me},function(a){var b=this.me;a=null!==a&&void 0!==a?a.toString():"";b!==a&&(this.me=a,this.N(),this.h("text",b,a))});v.defineProperty(bh,{textAlign:"textAlign"},function(){return this.tm},function(a){var b=this.tm;b!==a&&("start"===a||"end"===a||"left"===a||"right"===a||"center"===a?(this.tm=a,this.pa(),this.h("textAlign",b,a)):v.va(a,'"start", "end", "left", "right", or "center"',bh,"textAlign"))}); +v.u(bh,{Ha:"naturalBounds"},function(){if(!this.Qc.G()){var a=Ko(this,this.me,this.Lk,999999).width,b=Lo(this,a,this.Lk),c=this.za;isNaN(c.width)||(a=c.width);isNaN(c.height)||(b=c.height);Wa(this.Qc,a,b)}return this.Qc});v.defineProperty(bh,{Lw:"isMultiline"},function(){return this.Rq},function(a){var b=this.Rq;b!==a&&(this.Rq=a,this.N(),this.h("isMultiline",b,a))}); +v.defineProperty(bh,{WJ:"isUnderline"},function(){return this.Vl},function(a){var b=this.Vl;b!==a&&(this.Vl=a,this.pa(),this.h("isUnderline",b,a))});v.defineProperty(bh,{VJ:"isStrikethrough"},function(){return this.Ul},function(a){var b=this.Ul;b!==a&&(this.Ul=a,this.pa(),this.h("isStrikethrough",b,a))});v.defineProperty(bh,{vF:"wrap"},function(){return this.vm},function(a){var b=this.vm;b!==a&&(this.vm=a,this.N(),this.h("wrap",b,a))}); +v.defineProperty(bh,{overflow:"overflow"},function(){return this.Tk},function(a){var b=this.Tk;b!==a&&(this.Tk=a,this.N(),this.h("overflow",b,a))});v.defineProperty(bh,{stroke:"stroke"},function(){return this.Dc},function(a){var b=this.Dc;b!==a&&(a instanceof ha&&a.freeze(),this.Dc=a,this.pa(),this.h("stroke",b,a))});v.u(bh,{CH:"lineCount"},function(){return this.De});v.defineProperty(bh,{oz:"editable"},function(){return this.Bq},function(a){var b=this.Bq;b!==a&&(this.Bq=a,this.h("editable",b,a))}); +v.defineProperty(bh,{eF:"textEditor"},function(){return this.As},function(a){var b=this.As;b!==a&&(a instanceof HTMLElement||v.k("textEditor must be an HTMLElement, not: "+a),this.As=a,this.h("textEditor",b,a))});v.defineProperty(bh,{qz:"errorFunction"},function(){return this.nf},function(a){var b=this.nf;b!==a&&(null!==a&&v.j(a,"function",bh,"errorFunction"),this.nf=a,this.h("errorFunction",b,a))}); +bh.prototype.Yj=function(a,b){if(null!==this.Dc&&0!==this.me.length&&null!==this.Ah){var c=this.Ha.width,d=Mo(this);a.textAlign=this.tm;Om(this,a,this.Dc,!0,!1);(this.Vl||this.Ul)&&Om(this,a,this.Dc,!1,!1);var e=this.Lk,f=0,h=!1,k=v.Mb(0,0);this.Zg.ub(k);var l=v.Mb(0,d);this.Zg.ub(l);var m=k.rf(l);v.v(k);v.v(l);k=b.scale;8>m*k*k&&(h=!0);b.lf!==a&&(h=!1);!1===b.Ui("textGreeking")&&(h=!1);for(var m=b.Tq,k=this.Kj,l=this.Lj,n=this.De,p=0;p<n;p++){var q=e.kf[p],r=e.Be[p];q>c&&(q=c);var f=f+k,s=r,r=a, +t=f,u=c,x=d,w=0,y=this.tm;"start"===y&&(y=m?"right":"left");"end"===y&&(y=m?"left":"right");h?("left"===y?w=0:"right"===y?w=u-q:"center"===y&&(w=(u-q)/2),r.fillRect(0+w,t+.25*x,q,1)):("left"===y?w=0:"right"===y?w=u:"center"===y&&(w=u/2),r.fillText(s,0+w,t+x-.25*x),s=x/20|0,0===s&&(s=1),"right"===y?w-=q:"center"===y&&(w-=q/2),this.Vl&&(r.beginPath(),r.lineWidth=s,r.moveTo(0+w,t+x-.2*x),r.lineTo(0+w+q,t+x-.2*x),r.stroke()),this.Ul&&(r.beginPath(),r.lineWidth=s,t=t+x-x/2.2|0,0!==s%2&&(t+=.5),r.moveTo(0+ +w,t),r.lineTo(0+w+q,t),r.stroke()));f+=d+l}}}; +bh.prototype.mp=function(a,b,c,d){this.kv=a;var e=this.Lk;e.reset();var f=0,h=0;if(isNaN(this.za.width)){f=this.me.replace(/\r\n/g,"\n").replace(/\r/g,"\n");if(0===f.length)f=0;else if(this.Lw){for(var k=h=0,l=!1;!l;){var m=f.indexOf("\n",k);-1===m&&(m=f.length,l=!0);k=No(f.substr(k,m-k).replace(/^\s+|\s+$/g,""),this.Ah);k>h&&(h=k);k=m+1}f=h}else h=f.indexOf("\n",0),0<=h&&(f=f.substr(0,h)),f=k=No(f,this.Ah);f=Math.min(f,a/this.scale);f=Math.max(8,f)}else f=this.za.width;null!==this.R&&(f=Math.min(f, +this.R.xf.width),f=Math.max(f,this.R.kh.width));h=Lo(this,f,e);m=h=isNaN(this.za.height)?Math.min(h,b/this.scale):this.za.height;if(0!==e.Te&&1!==e.Be.length&&this.Tk===Jo&&(b=this.Ah,l=this.Tk===Jo?Oo(b):0,k=this.Kj+this.Lj,k=Math.max(0,Mo(this)+k),m=Math.min(this.KH-1,Math.max(Math.floor(m/k+.01)-1,0)),!(m+1>=e.Be.length))){k=e.Be[m];for(a=Math.max(1,a-l);No(k,b)>a&&1<k.length;)k=k.substr(0,k.length-1);k+=Eo;a=No(k,b);e.Be[m]=k;e.Be=e.Be.slice(0,m+1);e.kf[m]=a;e.kf=e.kf.slice(0,m+1);e.Mi=e.Be.length; +e.Te=Math.max(e.Te,a);this.De=e.Mi}if(this.vF===Io||isNaN(this.za.width))f=e.Te,isNaN(this.za.width)&&(f=Math.max(8,f));f=Math.max(c,f);h=Math.max(d,h);Wa(this.Qc,f,h);Dm(this,0,0,f,h)};bh.prototype.Ni=function(a,b,c,d){Hm(this,a,b,c,d)}; +function Ko(a,b,c,d){b=b.replace(/^\s+|\s+$/g,"");var e=0,f=0,h=0,k=a.Ah,f=a.Kj+a.Lj,l=Math.max(0,Mo(a)+f),h=a.Tk===Jo?Oo(k):0;if(a.De>=a.yi)return new ia(0,l);if(a.vm===Ho){c.Mi=1;f=No(b,k);if(0===h||f<=d)return c.Te=f,c.kf.push(c.Te),c.Be.push(b),new ia(f,l);var m=Po(b);b=b.substr(m.length);for(var n=Po(b),f=No(m+n,k);0<n.length&&f<=d;)m+=n,b=b.substr(n.length),n=Po(b),f=No((m+n).replace(/^\s+|\s+$/g,""),k);m+=n.replace(/^\s+|\s+$/g,"");for(d=Math.max(1,d-h);No(m,k)>d&&1<m.length;)m=m.substr(0, +m.length-1);m+=Eo;h=No(m,k);c.kf.push(h);c.Te=h;c.Be.push(m);return new ia(h,l)}var p=0;0===b.length&&(p=1,c.kf.push(0),c.Be.push(b));for(;0<b.length;){m=Po(b);for(b=b.substr(m.length);No(m,k)>d;){n=1;f=No(m.substr(0,n),k);for(h=0;f<=d;)n++,h=f,f=No(m.substr(0,n),k);1===n?(c.kf[a.De+p]=f,e=Math.max(e,f)):(c.kf[a.De+p]=h,e=Math.max(e,h));n--;1>n&&(n=1);c.Be[a.De+p]=m.substr(0,n);p++;m=m.substr(n);if(a.De+p>a.yi)break}n=Po(b);for(f=No(m+n,k);0<n.length&&f<=d;)m+=n,b=b.substr(n.length),n=Po(b),f=No((m+ +n).replace(/^\s+|\s+$/g,""),k);m=m.replace(/^\s+|\s+$/g,"");if(""!==m&&(0===n.length?(c.kf.push(f),e=Math.max(e,f)):(h=No(m,k),c.kf.push(h),e=Math.max(e,h)),c.Be.push(m),p++,a.De+p>a.yi))break}c.Mi=Math.min(a.yi,p);c.Te=Math.max(c.Te,e);return new ia(c.Te,l*c.Mi)}function Po(a){for(var b=a.length,c=0;c<b&&" "!==a.charAt(c);)c++;for(;c<b&&" "===a.charAt(c);)c++;return c>=b?a:a.substr(0,c)}function No(a,b){Fo!==b&&(Fo=Go.font=b);return Go.measureText(a).width} +function Mo(a){if(null!==a.Ln)return a.Ln;var b=a.Ah;Fo!==b&&(Fo=Go.font=b);var c=0;void 0!==Ao[b]&&5E3>Bo?c=Ao[b]:(c=1.3*Go.measureText("M").width,Ao[b]=c,Bo++);return a.Ln=c}function Oo(a){Fo!==a&&(Fo=Go.font=a);var b=0;void 0!==Co[a]&&5E3>Do?b=Co[a]:(b=Go.measureText(Eo).width,Co[a]=b,Do++);return b} +function Lo(a,b,c){var d=a.me.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),e=a.Kj+a.Lj,e=Math.max(0,Mo(a)+e);if(0===d.length)return c.Te=0,a.De=1,e;if(!a.Lw){var f=d.indexOf("\n",0);0<=f&&(d=d.substr(0,f))}for(var f=0,h=a.De=0,k=-1,l=!1;!l;)k=d.indexOf("\n",h),-1===k&&(k=d.length,l=!0),h<=k&&(h=d.substr(h,k-h),a.vm!==Ho?(c.Mi=0,h=Ko(a,h,c,b),f+=h.height,a.De+=c.Mi):(Ko(a,h,c,b),f+=e,a.De++),a.De===a.yi&&(l=!0)),h=k+1;return a.pv=f} +v.defineProperty(bh,{vA:"textValidation"},function(){return this.Vk},function(a){var b=this.Vk;b!==a&&(null!==a&&v.j(a,"function",bh,"textValidation"),this.Vk=a,this.h("textValidation",b,a))});v.defineProperty(bh,{EK:"spacingAbove"},function(){return this.Kj},function(a){var b=this.Kj;b!==a&&(this.Kj=a,this.h("spacingAbove",b,a))});v.defineProperty(bh,{FK:"spacingBelow"},function(){return this.Lj},function(a){var b=this.Lj;b!==a&&(this.Lj=a,this.h("spacingBelow",b,a))}); +v.defineProperty(bh,{KH:"maxLines"},function(){return this.yi},function(a){var b=this.yi;b!==a&&(a=Math.floor(a),0>=a&&v.va(a,"> 0",bh,"maxLines"),this.yi=a,this.h("maxLines",b,a),this.N())});v.u(bh,{hK:"metrics"},function(){return this.Lk});function zo(){this.Te=this.Mi=0;this.kf=[];this.Be=[]}zo.prototype.reset=function(){this.Te=this.Mi=0;this.kf=[];this.Be=[]};zo.prototype.Zs=function(a){this.Mi=a.Mi;this.Te=a.Te;this.kf=v.fl(a.kf);this.Be=v.fl(a.Be)};v.u(zo,{sJ:"arrSize"},function(){return this.kf}); +v.u(zo,{tJ:"arrText"},function(){return this.Be});v.u(zo,{gK:"maxLineWidth"},function(){return this.Te});function ok(){G.call(this);this.Re=null;this.ts="";this.Jj=Fd;this.Nn=He;this.zo=this.Mj=this.nf=null;this.py=!1;this.Tu=!0;this.qo=null}v.Ja(ok,G);v.ea("Picture",ok);ok.prototype.cloneProtected=function(a){G.prototype.cloneProtected.call(this,a);a.element=this.Re;a.ts=this.ts;a.Jj=this.Jj.S();a.Nn=this.Nn;a.nf=this.nf;a.Mj=this.Mj;a.Tu=this.Tu;a.qo=this.qo};var Qo=new ta,Ro=0,ik=[]; +function So(){var a=ik;if(0===a.length)for(var b=window.document.getElementsByTagName("canvas"),c=b.length,d=0;d<c;d++){var e=b[d];e.parentElement&&e.parentElement.W&&a.push(e.parentElement.W)}return a}var To;ok.clearCache=To=function(a){void 0===a&&(a="");v.j(a,"string",ok,"clearCache:url");""!==a?Qo[a]&&(delete Qo[a],Ro--):(Qo=new ta,Ro=0)};ok.prototype.toString=function(){return"Picture("+this.source+")#"+v.ld(this)}; +v.defineProperty(ok,{element:"element"},function(){return this.Re},function(a){var b=this.Re;if(b!==a){null===a||a instanceof HTMLImageElement||a instanceof HTMLVideoElement||a instanceof HTMLCanvasElement||v.k("Picture.element must be an instance of Image, Canvas, or Video, not: "+a);this.py=a instanceof HTMLCanvasElement;this.Re=a;if(null!==a)if(!0===a.complete||void 0===a.complete)a.Yu instanceof Event&&null!==this.nf&&this.nf(this,a.Yu),!0===a.sy&&null!==this.Mj&&this.Mj(this,null),a.sy=!0,this.za.G()|| +(Sk(this,!1),this.N());else{var c=this;a.HB||(a.addEventListener("load",function(b){Uo(a,b);c.za.G()||(Sk(c,!1),c.N())}),a.addEventListener("error",function(b){Vo(a,b)}),a.HB=!0)}this.h("element",b,a);this.pa()}}); +v.defineProperty(ok,{source:"source"},function(){return this.ts},function(a){var b=this.ts;if(b!==a){v.j(a,"string",ok,"source");this.ts=a;var c=Qo,d=this.g;if(void 0!==c[a])var e=c[a].Io[0].source;else{30<Ro&&(To(),c=Qo);var e=v.createElement("img"),f=this;e.addEventListener("load",function(a){Uo(e,a);f.za.G()||(Sk(f,!1),f.N())});e.addEventListener("error",function(a){Vo(e,a)});e.HB=!0;e.src=a;var h=this.qo;null!==h&&(e.crossOrigin=h(this));c[a]=new Wo(e);Ro++}null!==d&&Nl(d,this);this.element=e; +null!==d&&Ml(d,this);this.N();this.pa();this.h("source",b,a)}});function Uo(a,b){a.sy=!0;a.Yu=!1;for(var c=null,d=So(),e=d.length,f=0;f<e;f++){var h=d[f],k=h.ko.ja(a.src);if(null!==k)for(e=k.length,f=0;f<e;f++)c=k[f],h.sC.add(c),h.ue(),null!==c.Mj&&c.Mj(c,b)}}function Vo(a,b){a.Yu=b;for(var c=null,d=So(),e=d.length,f=0;f<e;f++)if(c=d[f].ko.ja(a.src),null!==c){for(var e=c.length,h=v.jb(),f=0;f<e;f++)h.push(c[f]);for(f=0;f<e;f++)c=h[f],null!==c.nf&&c.nf(c,b);v.sa(h)}} +v.defineProperty(ok,{DK:"sourceCrossOrigin"},function(){return this.qo},function(a){if(this.qo!==a&&(null!==a&&v.j(a,"function",ok,"sourceCrossOrigin"),this.qo=a,null!==this.element)){var b=this.element.src;null===a&&"string"===typeof b?this.element.crossOrigin=null:null!==a&&(this.element.crossOrigin=a(this))}});v.defineProperty(ok,{cj:"sourceRect"},function(){return this.Jj},function(a){var b=this.Jj;b.K(a)||(v.A(a,A,ok,"sourceRect"),this.Jj=a=a.S(),this.pa(),this.h("sourceRect",b,a))}); +v.defineProperty(ok,{hH:"imageStretch"},function(){return this.Nn},function(a){var b=this.Nn;b!==a&&(v.pb(a,G,ok,"imageStretch"),this.Nn=a,this.pa(),this.h("imageStretch",b,a))});v.defineProperty(ok,{qz:"errorFunction"},function(){return this.nf},function(a){var b=this.nf;b!==a&&(null!==a&&v.j(a,"function",ok,"errorFunction"),this.nf=a,this.h("errorFunction",b,a))}); +v.defineProperty(ok,{NK:"successFunction"},function(){return this.Mj},function(a){var b=this.Mj;b!==a&&(null!==a&&v.j(a,"function",ok,"successFunction"),this.Mj=a,this.h("successFunction",b,a))}); +ok.prototype.Yj=function(a,b){var c=this.Re;if(null!==c){var d=c.src;null!==d&&""!==d||v.k('Element has no source ("src") attribute: '+c);if(!(c.Yu instanceof Event)&&!0===c.sy){var d=this.Ha,e=0,f=0,h=this.py,k=h?+c.width:c.naturalWidth,h=h?+c.height:c.naturalHeight;void 0===k&&c.videoWidth&&(k=c.videoWidth);void 0===h&&c.videoHeight&&(h=c.videoHeight);k=k||d.width;h=h||d.height;if(0!==k&&0!==h){var l=k,m=h;this.cj.G()&&(e=this.Jj.x,f=this.Jj.y,k=this.Jj.width,h=this.Jj.height);var n=k,p=h,q=this.Nn; +switch(q){case Ti:if(this.cj.G())break;e+=Math.max((n-d.width)/2,0);f+=Math.max((p-d.height)/2,0);k=Math.min(d.width,n);h=Math.min(d.height,p);break;case He:n=d.width;p=d.height;break;case Vi:case Wi:var r=0;q===Vi?(r=Math.min(d.height/p,d.width/n),n*=r,p*=r):q===Wi&&(r=Math.max(d.height/p,d.width/n),n*=r,p*=r,e+=(n-d.width)/2/n*k,f+=(p-d.height)/2/p*h,k*=1/(n/d.width),h*=1/(p/d.height),n=d.width,p=d.height)}var q=this.Ti()*b.scale,s=k*h/(n*q*p*q),r=Qo[this.source],q=null;if(void 0!==r&&16<s){2>r.Io.length&& +(Xo(r,4,l,m),Xo(r,16,l,m));for(var l=r.Io,m=l.length,q=l[0],t=0;t<m;t++)if(l[t].wp*l[t].wp<s)q=l[t];else break}if(!b.Gn){if(null===this.zo)if(null===this.Re)this.zo=!1;else{l=(new Rc(null)).el;l.drawImage(this.Re,0,0);try{l.getImageData(0,0,1,1).data[3]&&(this.zo=!1),this.zo=!1}catch(u){this.zo=!0}}if(this.zo)return}if(b.Ui("pictureRatioOptimization")&&!b.qy&&void 0!==r&&null!==q&&1!==q.wp){a.save();r=q.wp;try{a.drawImage(q.source,e/r,f/r,Math.min(q.source.width,k/r),Math.min(q.source.height,h/r), +Math.max((d.width-n)/2,0),Math.max((d.height-p)/2,0),Math.min(d.width,n),Math.min(d.height,p))}catch(x){this.Tu=!1}a.restore()}else try{a.drawImage(c,e,f,k,h,Math.max((d.width-n)/2,0),Math.max((d.height-p)/2,0),Math.min(d.width,n),Math.min(d.height,p))}catch(w){this.Tu=!1}}}}};v.u(ok,{Ha:"naturalBounds"},function(){return this.Qc}); +ok.prototype.mp=function(a,b,c,d){var e=this.za,f=Gm(this,!0),h=this.Re,k=this.py;if(k||!this.xy&&h&&h.complete)this.xy=!0;null===h&&(isFinite(a)||(a=0),isFinite(b)||(b=0));isFinite(e.width)||f===He||f===wm?(isFinite(a)||(a=this.cj.G()?this.cj.width:k?+h.width:h.naturalWidth),c=0):null!==h&&!1!==this.xy&&(a=this.cj.G()?this.cj.width:k?+h.width:h.naturalWidth);isFinite(e.height)||f===He||f===vm?(isFinite(b)||(b=this.cj.G()?this.cj.height:k?+h.height:h.naturalHeight),d=0):null!==h&&!1!==this.xy&&(b= +this.cj.G()?this.cj.height:k?+h.height:h.naturalHeight);isFinite(e.width)&&(a=e.width);isFinite(e.height)&&(b=e.height);e=this.xf;f=this.kh;c=Math.max(c,f.width);d=Math.max(d,f.height);a=Math.min(e.width,a);b=Math.min(e.height,b);a=Math.max(c,a);b=Math.max(d,b);null===h||h.complete||(isFinite(a)||(a=0),isFinite(b)||(b=0));Wa(this.Qc,a,b);Dm(this,0,0,a,b)};ok.prototype.Ni=function(a,b,c,d){Hm(this,a,b,c,d)};function Wo(a){this.Io=[new Yo(a,1)]} +function Xo(a,b,c,d){var e=new Rc(null),f=e.el,h=1/b;e.width=c/b;e.height=d/b;b=new Yo(e.xd,b);c=a.Io[a.Io.length-1];f.setTransform(h*c.wp,0,0,h*c.wp,0,0);f.drawImage(c.source,0,0);a.Io.push(b)}function Yo(a,b){this.source=a;this.wp=b}function ma(){this.o=new ve;this.Rb=null}g=ma.prototype;g.reset=function(){this.o=new ve;this.Rb=null}; +function N(a,b,c,d,e,f){null===a.o&&v.k("StreamGeometryContext has been closed");void 0!==e&&!0===e?(null===a.Rb&&v.k("Need to call beginFigure first"),d=new wf(ff),d.I=b,d.J=c,a.Rb.sb.add(d)):(a.Rb=new Ge,a.Rb.Aa=b,a.Rb.xa=c,a.Rb.ut=d,a.o.Ub.add(a.Rb));void 0!==f&&(a.Rb.Tn=f)}function P(a){null===a.o&&v.k("StreamGeometryContext has been closed");null===a.Rb&&v.k("Need to call beginFigure first");var b=a.Rb.sb.length;0<b&&a.Rb.sb.da(b-1).close()} +function cf(a){null===a.o&&v.k("StreamGeometryContext has been closed");null===a.Rb&&v.k("Need to call beginFigure first");0<a.Rb.sb.length&&(a.Rb.ut=!0)}g.Ya=function(a){null===this.o&&v.k("StreamGeometryContext has been closed");null===this.Rb&&v.k("Need to call beginFigure first");this.Rb.wl=a};g.moveTo=function(a,b,c){void 0===c&&(c=!1);null===this.o&&v.k("StreamGeometryContext has been closed");null===this.Rb&&v.k("Need to call beginFigure first");var d=new wf(ff);d.I=a;d.J=b;c&&d.close();this.Rb.sb.add(d)}; +g.lineTo=function(a,b,c){void 0===c&&(c=!1);null===this.o&&v.k("StreamGeometryContext has been closed");null===this.Rb&&v.k("Need to call beginFigure first");var d=new wf(Ye);d.I=a;d.J=b;c&&d.close();this.Rb.sb.add(d)};function O(a,b,c,d,e,f,h,k){void 0===k&&(k=!1);null===a.o&&v.k("StreamGeometryContext has been closed");null===a.Rb&&v.k("Need to call beginFigure first");var l=new wf(gf);l.rc=b;l.Kc=c;l.mh=d;l.nh=e;l.I=f;l.J=h;k&&l.close();a.Rb.sb.add(l)} +function af(a,b,c,d,e){var f;void 0===f&&(f=!1);null===a.o&&v.k("StreamGeometryContext has been closed");null===a.Rb&&v.k("Need to call beginFigure first");var h=new wf(hf);h.rc=b;h.Kc=c;h.I=d;h.J=e;f&&h.close();a.Rb.sb.add(h)}g.arcTo=function(a,b,c,d,e,f,h){void 0===f&&(f=0);void 0===h&&(h=!1);null===this.o&&v.k("StreamGeometryContext has been closed");null===this.Rb&&v.k("Need to call beginFigure first");var k=new wf(jf);k.xe=a;k.Af=b;k.na=c;k.ua=d;k.radiusX=e;k.radiusY=0!==f?f:e;h&&k.close();this.Rb.sb.add(k)}; +function bf(a,b,c,d,e,f,h,k){var l;void 0===l&&(l=!1);null===a.o&&v.k("StreamGeometryContext has been closed");null===a.Rb&&v.k("Need to call beginFigure first");b=new wf(kf,h,k,b,c,d,e,f);l&&b.close();a.Rb.sb.add(b)}function Zo(a){a=$o(a);var b=v.jb();b[0]=a[0];for(var c=1,d=1;d<a.length;)b[c]=a[d],b[c+1]=a[d],b[c+2]=a[d+1],d+=2,c+=3;v.sa(a);return b} +function $o(a){var b=ap(a),c=v.jb(),d=Math.floor(b.length/2),e=b.length-1;a=0===a%2?2:1;for(var f=0;f<e;f++){var h=b[f],k=b[f+1],l=b[(d+f-1)%e],m=b[(d+f+a)%e];c[2*f]=h;c[2*f+1]=he(h.x,h.y,l.x,l.y,k.x,k.y,m.x,m.y,new z)}c[c.length]=c[0];v.sa(b);return c}function ap(a){for(var b=v.jb(),c=1.5*Math.PI,d=0,e=0;e<a;e++)d=2*Math.PI/a*e+c,b[e]=new z(.5+.5*Math.cos(d),.5+.5*Math.sin(d));b.push(b[0]);return b} +var qo={None:"Rectangle",Rectangle:function(a,b,c){a=new ve;a.type=Je;a.Aa=0;a.xa=0;a.I=b;a.J=c;return a},Square:function(a,b,c){a=new ve;a.Jd=Vi;a.type=Je;a.Aa=0;a.xa=0;a.I=Math.min(b,c);a.J=Math.min(b,c);return a},Ellipse:function(a,b,c){a=new ve;a.type=Ke;a.Aa=0;a.xa=0;a.I=b;a.J=c;a.B=Gd;a.C=Hd;return a},Circle:function(a,b,c){a=new ve;a.Jd=Vi;a.type=Ke;a.Aa=0;a.xa=0;a.I=Math.min(b,c);a.J=Math.min(b,c);a.B=Gd;a.C=Hd;return a},Connector:"Ellipse",TriangleRight:function(a,b,c){a=new ve;var d=new Ge, +e=new wf;e.I=b;e.J=.5*c;d.sb.add(e);b=new wf;b.I=0;b.J=c;d.sb.add(b.close());a.Ub.add(d);a.B=new L(0,.25);a.C=new L(.5,.75);return a},TriangleDown:function(a,b,c){a=new ve;var d=new Ge,e=new wf;e.I=b;e.J=0;d.sb.add(e);e=new wf;e.I=.5*b;e.J=c;d.sb.add(e.close());a.Ub.add(d);a.B=new L(.25,0);a.C=new L(.75,.5);return a},TriangleLeft:function(a,b,c){a=new ve;var d=new Ge;d.Aa=b;d.xa=c;var e=new wf;e.I=0;e.J=.5*c;d.sb.add(e);c=new wf;c.I=b;c.J=0;d.sb.add(c.close());a.Ub.add(d);a.B=new L(.5,.25);a.C=new L(1, +.75);return a},TriangleUp:function(a,b,c){a=new ve;var d=new Ge;d.Aa=b;d.xa=c;var e=new wf;e.I=0;e.J=c;d.sb.add(e);c=new wf;c.I=.5*b;c.J=0;d.sb.add(c.close());a.Ub.add(d);a.B=new L(.25,.5);a.C=new L(.75,1);return a},Line1:function(a,b,c){a=new ve;a.type=Ie;a.Aa=0;a.xa=0;a.I=b;a.J=c;return a},Line2:function(a,b,c){a=new ve;a.type=Ie;a.Aa=b;a.xa=0;a.I=0;a.J=c;return a},MinusLine:"LineH",LineH:function(a,b,c){a=new ve;a.type=Ie;a.Aa=0;a.xa=c/2;a.I=b;a.J=c/2;return a},LineV:function(a,b,c){a=new ve;a.type= +Ie;a.Aa=b/2;a.xa=0;a.I=b/2;a.J=c;return a},BarH:"Rectangle",BarV:"Rectangle",Curve1:function(a,b,c){a=v.s();N(a,0,0,!1);O(a,$c*b,0,1*b,(1-$c)*c,b,c);b=a.o;v.q(a);return b},Curve2:function(a,b,c){a=v.s();N(a,0,0,!1);O(a,0,$c*c,(1-$c)*b,c,b,c);b=a.o;v.q(a);return b},Curve3:function(a,b,c){a=v.s();N(a,1*b,0,!1);O(a,1*b,$c*c,$c*b,1*c,0,1*c);b=a.o;v.q(a);return b},Curve4:function(a,b,c){a=v.s();N(a,1*b,0,!1);O(a,(1-$c)*b,0,0,(1-$c)*c,0,1*c);b=a.o;v.q(a);return b},Alternative:"Triangle",Merge:"Triangle", +Triangle:function(a,b,c){a=v.s();N(a,.5*b,0*c,!0);a.lineTo(0*b,1*c);a.lineTo(1*b,1*c,!0);b=a.o;b.B=new L(.25,.5);b.C=new L(.75,1);v.q(a);return b},Decision:"Diamond",Diamond:function(a,b,c){a=v.s();N(a,.5*b,0,!0);a.lineTo(0,.5*c);a.lineTo(.5*b,1*c);a.lineTo(1*b,.5*c,!0);b=a.o;b.B=new L(.25,.25);b.C=new L(.75,.75);v.q(a);return b},Pentagon:function(a,b,c){var d=ap(5);a=v.s();N(a,d[0].x*b,d[0].y*c,!0);for(var e=1;5>e;e++)a.lineTo(d[e].x*b,d[e].y*c);v.sa(d);P(a);b=a.o;b.B=new L(.2,.22);b.C=new L(.8, +.9);v.q(a);return b},DataTransmission:"Hexagon",Hexagon:function(a,b,c){var d=ap(6);a=v.s();N(a,d[0].x*b,d[0].y*c,!0);for(var e=1;6>e;e++)a.lineTo(d[e].x*b,d[e].y*c);v.sa(d);P(a);b=a.o;b.B=new L(.07,.25);b.C=new L(.93,.75);v.q(a);return b},Heptagon:function(a,b,c){var d=ap(7);a=v.s();N(a,d[0].x*b,d[0].y*c,!0);for(var e=1;7>e;e++)a.lineTo(d[e].x*b,d[e].y*c);v.sa(d);P(a);b=a.o;b.B=new L(.2,.15);b.C=new L(.8,.85);v.q(a);return b},Octagon:function(a,b,c){var d=ap(8);a=v.s();N(a,d[0].x*b,d[0].y*c,!0); +for(var e=1;8>e;e++)a.lineTo(d[e].x*b,d[e].y*c);v.sa(d);P(a);b=a.o;b.B=new L(.15,.15);b.C=new L(.85,.85);v.q(a);return b},Nonagon:function(a,b,c){var d=ap(9);a=v.s();N(a,d[0].x*b,d[0].y*c,!0);for(var e=1;9>e;e++)a.lineTo(d[e].x*b,d[e].y*c);v.sa(d);P(a);b=a.o;b.B=new L(.17,.13);b.C=new L(.82,.82);v.q(a);return b},Decagon:function(a,b,c){var d=ap(10);a=v.s();N(a,d[0].x*b,d[0].y*c,!0);for(var e=1;10>e;e++)a.lineTo(d[e].x*b,d[e].y*c);v.sa(d);P(a);b=a.o;b.B=new L(.16,.16);b.C=new L(.84,.84);v.q(a);return b}, +Dodecagon:function(a,b,c){var d=ap(12);a=v.s();N(a,d[0].x*b,d[0].y*c,!0);for(var e=1;12>e;e++)a.lineTo(d[e].x*b,d[e].y*c);v.sa(d);P(a);b=a.o;b.B=new L(.16,.16);b.C=new L(.84,.84);v.q(a);return b},FivePointedStar:function(a,b,c){var d=$o(5);a=v.s();N(a,d[0].x*b,d[0].y*c,!0);for(var e=1;10>e;e++)a.lineTo(d[e].x*b,d[e].y*c);v.sa(d);P(a);b=a.o;b.B=new L(.312,.383);b.C=new L(.693,.765);v.q(a);return b},SixPointedStar:function(a,b,c){var d=$o(6);a=v.s();N(a,d[0].x*b,d[0].y*c,!0);for(var e=1;12>e;e++)a.lineTo(d[e].x* +b,d[e].y*c);v.sa(d);P(a);b=a.o;b.B=new L(.17,.251);b.C=new L(.833,.755);v.q(a);return b},SevenPointedStar:function(a,b,c){var d=$o(7);a=v.s();N(a,d[0].x*b,d[0].y*c,!0);for(var e=1;14>e;e++)a.lineTo(d[e].x*b,d[e].y*c);v.sa(d);P(a);b=a.o;b.B=new L(.363,.361);b.C=new L(.641,.709);v.q(a);return b},EightPointedStar:function(a,b,c){var d=$o(8);a=v.s();N(a,d[0].x*b,d[0].y*c,!0);for(var e=1;16>e;e++)a.lineTo(d[e].x*b,d[e].y*c);v.sa(d);P(a);b=a.o;b.B=new L(.252,.255);b.C=new L(.75,.75);v.q(a);return b},NinePointedStar:function(a, +b,c){var d=$o(9);a=v.s();N(a,d[0].x*b,d[0].y*c,!0);for(var e=1;18>e;e++)a.lineTo(d[e].x*b,d[e].y*c);v.sa(d);P(a);b=a.o;b.B=new L(.355,.361);b.C=new L(.645,.651);v.q(a);return b},TenPointedStar:function(a,b,c){var d=$o(10);a=v.s();N(a,d[0].x*b,d[0].y*c,!0);for(var e=1;20>e;e++)a.lineTo(d[e].x*b,d[e].y*c);v.sa(d);P(a);b=a.o;b.B=new L(.281,.261);b.C=new L(.723,.748);v.q(a);return b},FivePointedBurst:function(a,b,c){var d=Zo(5);a=v.s();N(a,d[0].x*b,d[0].y*c,!0);for(var e=1;e<d.length;e+=3)O(a,d[e].x* +b,d[e].y*c,d[e+1].x*b,d[e+1].y*c,d[e+2].x*b,d[e+2].y*c);v.sa(d);P(a);b=a.o;b.B=new L(.312,.383);b.C=new L(.693,.765);v.q(a);return b},SixPointedBurst:function(a,b,c){var d=Zo(6);a=v.s();N(a,d[0].x*b,d[0].y*c,!0);for(var e=1;e<d.length;e+=3)O(a,d[e].x*b,d[e].y*c,d[e+1].x*b,d[e+1].y*c,d[e+2].x*b,d[e+2].y*c);v.sa(d);P(a);b=a.o;b.B=new L(.17,.251);b.C=new L(.833,.755);v.q(a);return b},SevenPointedBurst:function(a,b,c){var d=Zo(7);a=v.s();N(a,d[0].x*b,d[0].y*c,!0);for(var e=1;e<d.length;e+=3)O(a,d[e].x* +b,d[e].y*c,d[e+1].x*b,d[e+1].y*c,d[e+2].x*b,d[e+2].y*c);v.sa(d);P(a);b=a.o;b.B=new L(.363,.361);b.C=new L(.641,.709);v.q(a);return b},EightPointedBurst:function(a,b,c){var d=Zo(8);a=v.s();N(a,d[0].x*b,d[0].y*c,!0);for(var e=1;e<d.length;e+=3)O(a,d[e].x*b,d[e].y*c,d[e+1].x*b,d[e+1].y*c,d[e+2].x*b,d[e+2].y*c);v.sa(d);P(a);b=a.o;b.B=new L(.252,.255);b.C=new L(.75,.75);v.q(a);return b},NinePointedBurst:function(a,b,c){var d=Zo(9);a=v.s();N(a,d[0].x*b,d[0].y*c,!0);for(var e=1;e<d.length;e+=3)O(a,d[e].x* +b,d[e].y*c,d[e+1].x*b,d[e+1].y*c,d[e+2].x*b,d[e+2].y*c);v.sa(d);P(a);b=a.o;b.B=new L(.355,.361);b.C=new L(.645,.651);v.q(a);return b},TenPointedBurst:function(a,b,c){var d=Zo(10);a=v.s();N(a,d[0].x*b,d[0].y*c,!0);for(var e=1;e<d.length;e+=3)O(a,d[e].x*b,d[e].y*c,d[e+1].x*b,d[e+1].y*c,d[e+2].x*b,d[e+2].y*c);v.sa(d);P(a);b=a.o;b.B=new L(.281,.261);b.C=new L(.723,.748);v.q(a);return b},Cloud:function(a,b,c){a=v.s();N(a,.08034461*b,.1944299*c,!0);O(a,-.09239631*b,.07836421*c,.1406031*b,-.0542823*c,.2008615* +b,.05349299*c);O(a,.2450511*b,-.00697547*c,.3776197*b,-.01112067*c,.4338609*b,.074219*c);O(a,.4539471*b,0,.6066018*b,-.02526587*c,.6558228*b,.07004196*c);O(a,.6914277*b,-.01904177*c,.8921095*b,-.01220843*c,.8921095*b,.08370865*c);O(a,1.036446*b,.04105738*c,1.020377*b,.3022052*c,.9147671*b,.3194596*c);O(a,1.04448*b,.360238*c,.992256*b,.5219009*c,.9082935*b,.562044*c);O(a,1.032337*b,.5771781*c,1.018411*b,.8120651*c,.9212406*b,.8217117*c);O(a,1.028411*b,.9571472*c,.8556702*b,1.052487*c,.7592566*b,.9156953* +c);O(a,.7431877*b,1.009325*c,.5624123*b,1.021761*c,.5101666*b,.9310455*c);O(a,.4820677*b,1.031761*c,.3030112*b,1.002796*c,.2609328*b,.9344623*c);O(a,.2329994*b,1.01518*c,.03213784*b,1.01518*c,.08034461*b,.870098*c);O(a,-.02812061*b,.9032597*c,-.01205169*b,.6835638*c,.06829292*b,.6545475*c);O(a,-.01812061*b,.6089503*c,-.00606892*b,.4555777*c,.06427569*b,.4265613*c);O(a,-.01606892*b,.3892545*c,-.01205169*b,.1944299*c,.08034461*b,.1944299*c);P(a);b=a.o;b.B=new L(.1,.1);b.C=new L(.9,.9);v.q(a);return b}, +Gate:"Crescent",Crescent:function(a,b,c){a=v.s();N(a,0,0,!0);O(a,1*b,0,1*b,1*c,0,1*c);O(a,.5*b,.75*c,.5*b,.25*c,0,0);P(a);b=a.o;b.B=new L(.511,.19);b.C=new L(.776,.76);v.q(a);return b},FramedRectangle:function(a,b,c){var d=v.s(),e=a?a.Ac:NaN;a=a?a.Mt:NaN;isNaN(e)&&(e=.1);isNaN(a)&&(a=.1);N(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c,!0);N(d,e*b,a*c,!1,!0);d.lineTo(e*b,(1-a)*c);d.lineTo((1-e)*b,(1-a)*c);d.lineTo((1-e)*b,a*c,!0);b=d.o;b.B=new L(e,a);b.C=new L(1-e,1-a);v.q(d);return b}, +Delay:"HalfEllipse",HalfEllipse:function(a,b,c){a=v.s();N(a,0,0,!0);O(a,$c*b,0,1*b,(.5-$c/2)*c,1*b,.5*c);O(a,1*b,(.5+$c/2)*c,$c*b,1*c,0,1*c);P(a);b=a.o;b.B=new L(0,.2);b.C=new L(.75,.8);v.q(a);return b},Heart:function(a,b,c){a=v.s();N(a,.5*b,1*c,!0);O(a,.1*b,.8*c,0,.5*c,0*b,.3*c);O(a,0*b,0,.45*b,0,.5*b,.3*c);O(a,.55*b,0,1*b,0,1*b,.3*c);O(a,b,.5*c,.9*b,.8*c,.5*b,1*c);P(a);b=a.o;b.B=new L(.15,.29);b.C=new L(.86,.68);v.q(a);return b},Spade:function(a,b,c){a=v.s();N(a,.5*b,0,!0);a.lineTo(.51*b,.01*c); +O(a,.6*b,.2*c,b,.25*c,b,.5*c);O(a,b,.8*c,.6*b,.8*c,.55*b,.7*c);O(a,.5*b,.75*c,.55*b,.95*c,.75*b,c);a.lineTo(.25*b,c);O(a,.45*b,.95*c,.5*b,.75*c,.45*b,.7*c);O(a,.4*b,.8*c,0,.8*c,0,.5*c);O(a,0,.25*c,.4*b,.2*c,.49*b,.01*c);P(a);b=a.o;b.B=new L(.19,.26);b.C=new L(.8,.68);v.q(a);return b},Club:function(a,b,c){a=v.s();N(a,.4*b,.6*c,!0);O(a,.5*b,.75*c,.45*b,.95*c,.15*b,1*c);a.lineTo(.85*b,c);O(a,.55*b,.95*c,.5*b,.75*c,.6*b,.6*c);var d=.2,e=.3,f=0,h=4*(Math.SQRT2-1)/3*d;O(a,(.5-d+e)*b,(.5+h+f)*c,(.5-h+e)* +b,(.5+d+f)*c,(.5+e)*b,(.5+d+f)*c);O(a,(.5+h+e)*b,(.5+d+f)*c,(.5+d+e)*b,(.5+h+f)*c,(.5+d+e)*b,(.5+f)*c);O(a,(.5+d+e)*b,(.5-h+f)*c,(.5+h+e)*b,(.5-d+f)*c,(.5+e)*b,(.5-d+f)*c);O(a,(.5-h+e)*b,(.5-d+f)*c,(.5-d+e+.05)*b,(.5-h+f-.02)*c,.65*b,.36771243*c);d=.2;e=0;f=-.3;h=4*(Math.SQRT2-1)/3*d;O(a,(.5+h+e)*b,(.5+d+f)*c,(.5+d+e)*b,(.5+h+f)*c,(.5+d+e)*b,(.5+f)*c);O(a,(.5+d+e)*b,(.5-h+f)*c,(.5+h+e)*b,(.5-d+f)*c,(.5+e)*b,(.5-d+f)*c);O(a,(.5-h+e)*b,(.5-d+f)*c,(.5-d+e)*b,(.5-h+f)*c,(.5-d+e)*b,(.5+f)*c);O(a,(.5-d+ +e)*b,(.5+h+f)*c,(.5-h+e)*b,(.5+d+f)*c,.35*b,.36771243*c);d=.2;e=-.3;f=0;h=4*(Math.SQRT2-1)/3*d;O(a,(.5+d+e-.05)*b,(.5-h+f-.02)*c,(.5+h+e)*b,(.5-d+f)*c,(.5+e)*b,(.5-d+f)*c);O(a,(.5-h+e)*b,(.5-d+f)*c,(.5-d+e)*b,(.5-h+f)*c,(.5-d+e)*b,(.5+f)*c);O(a,(.5-d+e)*b,(.5+h+f)*c,(.5-h+e)*b,(.5+d+f)*c,(.5+e)*b,(.5+d+f)*c);O(a,(.5+h+e)*b,(.5+d+f)*c,(.5+d+e)*b,(.5+h+f)*c,.4*b,.6*c);P(a);b=a.o;b.B=new L(.06,.39);b.C=new L(.93,.58);v.q(a);return b},Ring:function(a,b,c){a=v.s();var d=4*(Math.SQRT2-1)/3*.5;N(a,b,.5* +c,!0);O(a,b,(.5-d)*c,(.5+d)*b,0,.5*b,0);O(a,(.5-d)*b,0,0,(.5-d)*c,0,.5*c);O(a,0,(.5+d)*c,(.5-d)*b,c,.5*b,c);O(a,(.5+d)*b,c,b,(.5+d)*c,b,.5*c);d=4*(Math.SQRT2-1)/3*.4;N(a,.5*b,.1*c,!0,!0);O(a,(.5+d)*b,.1*c,.9*b,(.5-d)*c,.9*b,.5*c);O(a,.9*b,(.5+d)*c,(.5+d)*b,.9*c,.5*b,.9*c);O(a,(.5-d)*b,.9*c,.1*b,(.5+d)*c,.1*b,.5*c);O(a,.1*b,(.5-d)*c,(.5-d)*b,.1*c,.5*b,.1*c);b=a.o;b.B=new L(.146,.146);b.C=new L(.853,.853);b.Jd=Vi;v.q(a);return b},YinYang:function(a,b,c){var d=.5;a=v.s();d=.5;N(a,.5*b,0,!0);a.arcTo(270, +180,.5*b,.5*b,.5*b);O(a,1*b,d*c,0,d*c,d*b,0,!0);var d=.1,e=.25;N(a,(.5+d)*b,e*c,!0,!0);a.arcTo(0,-360,.5*b,c*e,d*b);P(a);N(a,.5*b,0,!1);a.arcTo(270,-180,.5*b,.5*b,.5*b);a.Ya(!1);e=.75;N(a,(.5+d)*b,e*c,!0);a.arcTo(0,360,.5*b,c*e,d*b);P(a);b=a.o;b.Jd=Vi;v.q(a);return b},Peace:function(a,b,c){a=v.s();var d=4*(Math.SQRT2-1)/3*.5;N(a,b,.5*c,!0);O(a,b,(.5-d)*c,(.5+d)*b,0,.5*b,0);O(a,(.5-d)*b,0,0,(.5-d)*c,0,.5*c);O(a,0,(.5+d)*c,(.5-d)*b,c,.5*b,c);O(a,(.5+d)*b,c,b,(.5+d)*c,b,.5*c);d=4*(Math.SQRT2-1)/3*.4; +N(a,.5*b,.1*c,!0,!0);O(a,(.5+d)*b,.1*c,.9*b,(.5-d)*c,.9*b,.5*c);O(a,.9*b,(.5+d)*c,(.5+d)*b,.9*c,.5*b,.9*c);O(a,(.5-d)*b,.9*c,.1*b,(.5+d)*c,.1*b,.5*c);O(a,.1*b,(.5-d)*c,(.5-d)*b,.1*c,.5*b,.1*c);var d=.07,e=0,f=-.707*.11,h=4*(Math.SQRT2-1)/3*d;N(a,(.5+d+e)*b,(.5+f)*c,!0);O(a,(.5+d+e)*b,(.5-h+f)*c,(.5+h+e)*b,(.5-d+f)*c,(.5+e)*b,(.5-d+f)*c);O(a,(.5-h+e)*b,(.5-d+f)*c,(.5-d+e)*b,(.5-h+f)*c,(.5-d+e)*b,(.5+f)*c);O(a,(.5-d+e)*b,(.5+h+f)*c,(.5-h+e)*b,(.5+d+f)*c,(.5+e)*b,(.5+d+f)*c);O(a,(.5+h+e)*b,(.5+d+f)* +c,(.5+d+e)*b,(.5+h+f)*c,(.5+d+e)*b,(.5+f)*c);d=.07;e=-.707*.11;f=.707*.11;h=4*(Math.SQRT2-1)/3*d;N(a,(.5+d+e)*b,(.5+f)*c,!0);O(a,(.5+d+e)*b,(.5-h+f)*c,(.5+h+e)*b,(.5-d+f)*c,(.5+e)*b,(.5-d+f)*c);O(a,(.5-h+e)*b,(.5-d+f)*c,(.5-d+e)*b,(.5-h+f)*c,(.5-d+e)*b,(.5+f)*c);O(a,(.5-d+e)*b,(.5+h+f)*c,(.5-h+e)*b,(.5+d+f)*c,(.5+e)*b,(.5+d+f)*c);O(a,(.5+h+e)*b,(.5+d+f)*c,(.5+d+e)*b,(.5+h+f)*c,(.5+d+e)*b,(.5+f)*c);d=.07;e=.707*.11;f=.707*.11;h=4*(Math.SQRT2-1)/3*d;N(a,(.5+d+e)*b,(.5+f)*c,!0);O(a,(.5+d+e)*b,(.5-h+ +f)*c,(.5+h+e)*b,(.5-d+f)*c,(.5+e)*b,(.5-d+f)*c);O(a,(.5-h+e)*b,(.5-d+f)*c,(.5-d+e)*b,(.5-h+f)*c,(.5-d+e)*b,(.5+f)*c);O(a,(.5-d+e)*b,(.5+h+f)*c,(.5-h+e)*b,(.5+d+f)*c,(.5+e)*b,(.5+d+f)*c);O(a,(.5+h+e)*b,(.5+d+f)*c,(.5+d+e)*b,(.5+h+f)*c,(.5+d+e)*b,(.5+f)*c);b=a.o;b.B=new L(.146,.146);b.C=new L(.853,.853);b.Jd=Vi;v.q(a);return b},NotAllowed:function(a,b,c){var d=.5*$c,e=.5;a=v.s();N(a,.5*b,(.5-e)*c,!0);O(a,(.5-d)*b,(.5-e)*c,(.5-e)*b,(.5-d)*c,(.5-e)*b,.5*c);O(a,(.5-e)*b,(.5+d)*c,(.5-d)*b,(.5+e)*c,.5*b, +(.5+e)*c);O(a,(.5+d)*b,(.5+e)*c,(.5+e)*b,(.5+d)*c,(.5+e)*b,.5*c);O(a,(.5+e)*b,(.5-d)*c,(.5+d)*b,(.5-e)*c,.5*b,(.5-e)*c);var e=.4,d=.4*$c,f=v.L(),h=v.L(),k=v.L(),l=v.L();$d(.5,.5-e,.5+d,.5-e,.5+e,.5-d,.5+e,.5,.42,f,h,k,l,l);var m=v.L(),n=v.L(),p=v.L();$d(.5,.5-e,.5+d,.5-e,.5+e,.5-d,.5+e,.5,.58,l,l,p,m,n);var q=v.L(),r=v.L(),s=v.L();$d(.5,.5+e,.5-d,.5+e,.5-e,.5+d,.5-e,.5,.42,q,r,s,l,l);var t=v.L(),u=v.L(),x=v.L();$d(.5,.5+e,.5-d,.5+e,.5-e,.5+d,.5-e,.5,.58,l,l,x,t,u);N(a,x.x*b,x.y*c,!0,!0);O(a,t.x*b, +t.y*c,u.x*b,u.y*c,(.5-e)*b,.5*c);O(a,(.5-e)*b,(.5-d)*c,(.5-d)*b,(.5-e)*c,.5*b,(.5-e)*c);O(a,f.x*b,f.y*c,h.x*b,h.y*c,k.x*b,k.y*c);a.lineTo(x.x*b,x.y*c);P(a);N(a,s.x*b,s.y*c,!0,!0);a.lineTo(p.x*b,p.y*c);O(a,m.x*b,m.y*c,n.x*b,n.y*c,(.5+e)*b,.5*c);O(a,(.5+e)*b,(.5+d)*c,(.5+d)*b,(.5+e)*c,.5*b,(.5+e)*c);O(a,q.x*b,q.y*c,r.x*b,r.y*c,s.x*b,s.y*c);P(a);v.v(f);v.v(h);v.v(k);v.v(l);v.v(m);v.v(n);v.v(p);v.v(q);v.v(r);v.v(s);v.v(t);v.v(u);v.v(x);b=a.o;v.q(a);b.Jd=Vi;return b},Fragile:function(a,b,c){a=v.s();N(a, +0,0,!0);a.lineTo(.25*b,0);a.lineTo(.2*b,.15*c);a.lineTo(.3*b,.25*c);a.lineTo(.29*b,.33*c);a.lineTo(.35*b,.25*c);a.lineTo(.3*b,.15*c);a.lineTo(.4*b,0);a.lineTo(1*b,0);O(a,1*b,.25*c,.75*b,.5*c,.55*b,.5*c);a.lineTo(.55*b,.9*c);a.lineTo(.7*b,.9*c);a.lineTo(.7*b,1*c);a.lineTo(.3*b,1*c);a.lineTo(.3*b,.9*c);a.lineTo(.45*b,.9*c);a.lineTo(.45*b,.5*c);O(a,.25*b,.5*c,0,.25*c,0,0);P(a);b=a.o;b.B=new L(.25,0);b.C=new L(.75,.4);v.q(a);return b},HourGlass:function(a,b,c){a=v.s();N(a,.65*b,.5*c,!0);a.lineTo(1*b, +1*c);a.lineTo(0,1*c);a.lineTo(.35*b,.5*c);a.lineTo(0,0);a.lineTo(1*b,0);P(a);b=a.o;v.q(a);return b},Lightning:function(a,b,c){a=v.s();N(a,0*b,.55*c,!0);a.lineTo(.75*b,0);a.lineTo(.25*b,.45*c);a.lineTo(.9*b,.48*c);a.lineTo(.4*b,1*c);a.lineTo(.65*b,.55*c);P(a);b=a.o;v.q(a);return b},Parallelogram1:function(a,b,c){a=a?a.Ac:NaN;isNaN(a)&&(a=.1);var d=v.s();N(d,a*b,0,!0);d.lineTo(1*b,0);d.lineTo((1-a)*b,1*c);d.lineTo(0,1*c);P(d);b=d.o;b.B=new L(a,0);b.C=new L(1-a,1);v.q(d);return b},Input:"Output",Output:function(a, +b,c){a=v.s();N(a,0,1*c,!0);a.lineTo(.1*b,0);a.lineTo(1*b,0);a.lineTo(.9*b,1*c);P(a);b=a.o;b.B=new L(.1,0);b.C=new L(.9,1);v.q(a);return b},Parallelogram2:function(a,b,c){a=a?a.Ac:NaN;isNaN(a)&&(a=.25);var d=v.s();N(d,a*b,0,!0);d.lineTo(1*b,0);d.lineTo((1-a)*b,1*c);d.lineTo(0,1*c);P(d);b=d.o;b.B=new L(a,0);b.C=new L(1-a,1);v.q(d);return b},ThickCross:function(a,b,c){a=a?a.Ac:NaN;isNaN(a)&&(a=.25);var d=v.s();N(d,(.5-a/2)*b,0,!0);d.lineTo((.5+a/2)*b,0);d.lineTo((.5+a/2)*b,(.5-a/2)*c);d.lineTo(1*b,(.5- +a/2)*c);d.lineTo(1*b,(.5+a/2)*c);d.lineTo((.5+a/2)*b,(.5+a/2)*c);d.lineTo((.5+a/2)*b,1*c);d.lineTo((.5-a/2)*b,1*c);d.lineTo((.5-a/2)*b,(.5+a/2)*c);d.lineTo(0,(.5+a/2)*c);d.lineTo(0,(.5-a/2)*c);d.lineTo((.5-a/2)*b,(.5-a/2)*c);P(d);b=d.o;b.B=new L(.5-a/2,.5-a/2);b.C=new L(.5+a/2,.5+a/2);v.q(d);return b},ThickX:function(a,b,c){a=.25/Math.SQRT2;var d=v.s();N(d,.3*b,0,!0);d.lineTo(.5*b,.2*c);d.lineTo(.7*b,0);d.lineTo(1*b,.3*c);d.lineTo(.8*b,.5*c);d.lineTo(1*b,.7*c);d.lineTo(.7*b,1*c);d.lineTo(.5*b,.8* +c);d.lineTo(.3*b,1*c);d.lineTo(0,.7*c);d.lineTo(.2*b,.5*c);d.lineTo(0,.3*c);P(d);b=d.o;b.B=new L(.5-a,.5-a);b.C=new L(.5+a,.5+a);v.q(d);return b},ThinCross:function(a,b,c){var d=a?a.Ac:NaN;isNaN(d)&&(d=.1);a=v.s();N(a,(.5-d/2)*b,0,!0);a.lineTo((.5+d/2)*b,0);a.lineTo((.5+d/2)*b,(.5-d/2)*c);a.lineTo(1*b,(.5-d/2)*c);a.lineTo(1*b,(.5+d/2)*c);a.lineTo((.5+d/2)*b,(.5+d/2)*c);a.lineTo((.5+d/2)*b,1*c);a.lineTo((.5-d/2)*b,1*c);a.lineTo((.5-d/2)*b,(.5+d/2)*c);a.lineTo(0,(.5+d/2)*c);a.lineTo(0,(.5-d/2)*c);a.lineTo((.5- +d/2)*b,(.5-d/2)*c);P(a);b=a.o;v.q(a);return b},ThinX:function(a,b,c){a=v.s();N(a,.1*b,0,!0);a.lineTo(.5*b,.4*c);a.lineTo(.9*b,0);a.lineTo(1*b,.1*c);a.lineTo(.6*b,.5*c);a.lineTo(1*b,.9*c);a.lineTo(.9*b,1*c);a.lineTo(.5*b,.6*c);a.lineTo(.1*b,1*c);a.lineTo(0,.9*c);a.lineTo(.4*b,.5*c);a.lineTo(0,.1*c);P(a);b=a.o;v.q(a);return b},RightTriangle:function(a,b,c){a=v.s();N(a,0,0,!0);a.lineTo(1*b,1*c);a.lineTo(0,1*c);P(a);b=a.o;b.B=new L(0,.5);b.C=new L(.5,1);v.q(a);return b},RoundedIBeam:function(a,b,c){a= +v.s();N(a,0,0,!0);a.lineTo(1*b,0);O(a,.5*b,.25*c,.5*b,.75*c,1*b,1*c);a.lineTo(0,1*c);O(a,.5*b,.75*c,.5*b,.25*c,0,0);P(a);b=a.o;v.q(a);return b},RoundedRectangle:function(a,b,c){var d=a?a.Ac:NaN;isNaN(d)&&(d=5);d=Math.min(d,b/3);d=Math.min(d,c/3);a=d*$c;var e=v.s();N(e,d,0,!0);e.lineTo(b-d,0);O(e,b-a,0,b,a,b,d);e.lineTo(b,c-d);O(e,b,c-a,b-a,c,b-d,c);e.lineTo(d,c);O(e,a,c,0,c-a,0,c-d);e.lineTo(0,d);O(e,0,a,a,0,d,0);P(e);b=e.o;1<a?(b.B=new L(0,0,a,a),b.C=new L(1,1,-a,-a)):(b.B=rb,b.C=Eb);v.q(e);return b}, +Border:function(a,b,c){var d=a?a.Ac:NaN;isNaN(d)&&(d=5);d=Math.min(d,b/3);d=Math.min(d,c/3);a=v.s();N(a,d,0,!0);a.lineTo(b-d,0);O(a,b-0,0,b,0,b,d);a.lineTo(b,c-d);O(a,b,c-0,b-0,c,b-d,c);a.lineTo(d,c);O(a,0,c,0,c-0,0,c-d);a.lineTo(0,d);O(a,0,0,0,0,d,0);P(a);b=a.o;b.B=rb;b.C=Eb;v.q(a);return b},SquareIBeam:function(a,b,c){var d=a?a.Ac:NaN;isNaN(d)&&(d=.2);a=v.s();N(a,0,0,!0);a.lineTo(1*b,0);a.lineTo(1*b,d*c);a.lineTo((.5+d/2)*b,d*c);a.lineTo((.5+d/2)*b,(1-d)*c);a.lineTo(1*b,(1-d)*c);a.lineTo(1*b,1* +c);a.lineTo(0,1*c);a.lineTo(0,(1-d)*c);a.lineTo((.5-d/2)*b,(1-d)*c);a.lineTo((.5-d/2)*b,d*c);a.lineTo(0,d*c);P(a);b=a.o;v.q(a);return b},Trapezoid:function(a,b,c){a=a?a.Ac:NaN;isNaN(a)&&(a=.2);var d=v.s();N(d,a*b,0,!0);d.lineTo((1-a)*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c);P(d);b=d.o;b.B=new L(a,0);b.C=new L(1-a,1);v.q(d);return b},ManualLoop:"ManualOperation",ManualOperation:function(a,b,c){var d=a?a.Ac:NaN;isNaN(d)&&(d=0);a=v.s();N(a,d,0,!0);a.lineTo(0,0);a.lineTo(1*b,0);a.lineTo(.9*b,1*c);a.lineTo(.1* +b,1*c);P(a);b=a.o;b.B=new L(.1,0);b.C=new L(.9,1);v.q(a);return b},GenderMale:function(a,b,c){a=v.s();var d=.4*$c,e=.4,f=v.L(),h=v.L(),k=v.L(),l=v.L();N(a,(.5-e)*b,.5*c,!0);O(a,(.5-e)*b,(.5-d)*c,(.5-d)*b,(.5-e)*c,.5*b,(.5-e)*c);$d(.5,.5-e,.5+d,.5-e,.5+e,.5-d,.5+e,.5,.44,k,l,h,f,f);O(a,k.x*b,k.y*c,l.x*b,l.y*c,h.x*b,h.y*c);var m=v.Mb(h.x,h.y);$d(.5,.5-e,.5+d,.5-e,.5+e,.5-d,.5+e,.5,.56,f,f,h,k,l);var n=v.Mb(h.x,h.y);a.lineTo((.1*m.x+.855)*b,.1*m.y*c);a.lineTo(.85*b,.1*m.y*c);a.lineTo(.85*b,0);a.lineTo(1* +b,0);a.lineTo(1*b,.15*c);a.lineTo((.1*n.x+.9)*b,.15*c);a.lineTo((.1*n.x+.9)*b,(.1*n.y+.05*.9)*c);a.lineTo(n.x*b,n.y*c);O(a,k.x*b,k.y*c,l.x*b,l.y*c,(.5+e)*b,.5*c);O(a,(.5+e)*b,(.5+d)*c,(.5+d)*b,(.5+e)*c,.5*b,(.5+e)*c);O(a,(.5-d)*b,(.5+e)*c,(.5-e)*b,(.5+d)*c,(.5-e)*b,.5*c);e=.35;d=.35*$c;N(a,.5*b,(.5-e)*c,!0,!0);O(a,(.5-d)*b,(.5-e)*c,(.5-e)*b,(.5-d)*c,(.5-e)*b,.5*c);O(a,(.5-e)*b,(.5+d)*c,(.5-d)*b,(.5+e)*c,.5*b,(.5+e)*c);O(a,(.5+d)*b,(.5+e)*c,(.5+e)*b,(.5+d)*c,(.5+e)*b,.5*c);O(a,(.5+e)*b,(.5-d)*c,(.5+ +d)*b,(.5-e)*c,.5*b,(.5-e)*c);N(a,(.5-e)*b,.5*c,!0);v.v(f);v.v(h);v.v(k);v.v(l);v.v(m);v.v(n);b=a.o;b.B=new L(.202,.257);b.C=new L(.692,.839);b.Jd=Vi;v.q(a);return b},GenderFemale:function(a,b,c){a=v.s();var d=.375,e=0,f=-.125,h=4*(Math.SQRT2-1)/3*d;N(a,(.525+e)*b,(.5+d+f)*c,!0);O(a,(.5+h+e)*b,(.5+d+f)*c,(.5+d+e)*b,(.5+h+f)*c,(.5+d+e)*b,(.5+f)*c);O(a,(.5+d+e)*b,(.5-h+f)*c,(.5+h+e)*b,(.5-d+f)*c,(.5+e)*b,(.5-d+f)*c);O(a,(.5-h+e)*b,(.5-d+f)*c,(.5-d+e)*b,(.5-h+f)*c,(.5-d+e)*b,(.5+f)*c);O(a,(.5-d+e)*b, +(.5+h+f)*c,(.5-h+e)*b,(.5+d+f)*c,(.475+e)*b,(.5+d+f)*c);a.lineTo(.475*b,.85*c);a.lineTo(.425*b,.85*c);a.lineTo(.425*b,.9*c);a.lineTo(.475*b,.9*c);a.lineTo(.475*b,1*c);a.lineTo(.525*b,1*c);a.lineTo(.525*b,.9*c);a.lineTo(.575*b,.9*c);a.lineTo(.575*b,.85*c);a.lineTo(.525*b,.85*c);P(a);d=.325;e=0;f=-.125;h=4*(Math.SQRT2-1)/3*d;N(a,(.5+d+e)*b,(.5+f)*c,!0,!0);O(a,(.5+d+e)*b,(.5+h+f)*c,(.5+h+e)*b,(.5+d+f)*c,(.5+e)*b,(.5+d+f)*c);O(a,(.5-h+e)*b,(.5+d+f)*c,(.5-d+e)*b,(.5+h+f)*c,(.5-d+e)*b,(.5+f)*c);O(a,(.5- +d+e)*b,(.5-h+f)*c,(.5-h+e)*b,(.5-d+f)*c,(.5+e)*b,(.5-d+f)*c);O(a,(.5+h+e)*b,(.5-d+f)*c,(.5+d+e)*b,(.5-h+f)*c,(.5+d+e)*b,(.5+f)*c);N(a,(.525+e)*b,(.5+d+f)*c,!0);b=a.o;b.B=new L(.232,.136);b.C=new L(.782,.611);b.Jd=Vi;v.q(a);return b},PlusLine:function(a,b,c){a=v.s();N(a,0,.5*c,!1);a.lineTo(1*b,.5*c);a.moveTo(.5*b,0);a.lineTo(.5*b,1*c);b=a.o;v.q(a);return b},XLine:function(a,b,c){a=v.s();N(a,0,1*c,!1);a.lineTo(1*b,0);a.moveTo(0,0);a.lineTo(1*b,1*c);b=a.o;v.q(a);return b},AsteriskLine:function(a,b,c){a= +v.s();var d=.2/Math.SQRT2;N(a,d*b,(1-d)*c,!1);a.lineTo((1-d)*b,d*c);a.moveTo(d*b,d*c);a.lineTo((1-d)*b,(1-d)*c);a.moveTo(0*b,.5*c);a.lineTo(1*b,.5*c);a.moveTo(.5*b,0*c);a.lineTo(.5*b,1*c);b=a.o;v.q(a);return b},CircleLine:function(a,b,c){var d=.5*$c;a=v.s();N(a,1*b,.5*c,!1);O(a,1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);O(a,(.5-d)*b,1*c,0,(.5+d)*c,0,.5*c);O(a,0,(.5-d)*c,(.5-d)*b,0,.5*b,0);O(a,(.5+d)*b,0,1*b,(.5-d)*c,1*b,.5*c);b=a.o;b.B=new L(.146,.146);b.C=new L(.853,.853);b.Jd=Vi;v.q(a);return b},Pie:function(a, +b,c){a=v.s();var d=4*(Math.SQRT2-1)/3*.5;N(a,(.5*Math.SQRT2/2+.5)*b,(.5-.5*Math.SQRT2/2)*c,!0);O(a,.7*b,0*c,.5*b,0*c,.5*b,0*c);O(a,(.5-d+0)*b,0*c,0*b,(.5-d+0)*c,0*b,.5*c);O(a,0*b,(.5+d+0)*c,(.5-d+0)*b,1*c,.5*b,1*c);O(a,(.5+d+0)*b,1*c,1*b,(.5+d+0)*c,1*b,.5*c);a.lineTo(.5*b,.5*c);P(a);b=a.o;v.q(a);return b},PiePiece:function(a,b,c){var d=$c/Math.SQRT2*.5,e=Math.SQRT2/2,f=1-Math.SQRT2/2;a=v.s();N(a,b,c,!0);O(a,b,(1-d)*c,(e+d)*b,(f+d)*c,e*b,f*c);a.lineTo(0,c);P(a);b=a.o;v.q(a);return b},StopSign:function(a, +b,c){a=1/(Math.SQRT2+2);var d=v.s();N(d,a*b,0,!0);d.lineTo((1-a)*b,0);d.lineTo(1*b,a*c);d.lineTo(1*b,(1-a)*c);d.lineTo((1-a)*b,1*c);d.lineTo(a*b,1*c);d.lineTo(0,(1-a)*c);d.lineTo(0,a*c);P(d);b=d.o;b.B=new L(a/2,a/2);b.C=new L(1-a/2,1-a/2);v.q(d);return b},LogicImplies:function(a,b,c){var d=a?a.Ac:NaN;isNaN(d)&&(d=.2);a=v.s();N(a,(1-d)*b,0*c,!1);a.lineTo(1*b,.5*c);a.lineTo((1-d)*b,c);a.moveTo(0,.5*c);a.lineTo(b,.5*c);b=a.o;b.B=rb;b.C=new L(.8,.5);v.q(a);return b},LogicIff:function(a,b,c){var d=a?a.Ac: +NaN;isNaN(d)&&(d=.2);a=v.s();N(a,(1-d)*b,0*c,!1);a.lineTo(1*b,.5*c);a.lineTo((1-d)*b,c);a.moveTo(0,.5*c);a.lineTo(b,.5*c);a.moveTo(d*b,0);a.lineTo(0,.5*c);a.lineTo(d*b,c);b=a.o;b.B=new L(.2,0);b.C=new L(.8,.5);v.q(a);return b},LogicNot:function(a,b,c){a=v.s();N(a,0,0,!1);a.lineTo(1*b,0);a.lineTo(1*b,1*c);b=a.o;v.q(a);return b},LogicAnd:function(a,b,c){a=v.s();N(a,0,1*c,!1);a.lineTo(.5*b,0);a.lineTo(1*b,1*c);b=a.o;b.B=new L(.25,.5);b.C=new L(.75,1);v.q(a);return b},LogicOr:function(a,b,c){a=v.s(); +N(a,0,0,!1);a.lineTo(.5*b,1*c);a.lineTo(1*b,0);b=a.o;b.B=new L(.219,0);b.C=new L(.78,.409);v.q(a);return b},LogicXor:function(a,b,c){a=v.s();N(a,.5*b,0,!1);a.lineTo(.5*b,1*c);a.moveTo(0,.5*c);a.lineTo(1*b,.5*c);var d=.5*$c;O(a,1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);O(a,(.5-d)*b,1*c,0,(.5+d)*c,0,.5*c);O(a,0,(.5-d)*c,(.5-d)*b,0,.5*b,0);O(a,(.5+d)*b,0,1*b,(.5-d)*c,1*b,.5*c);b=a.o;b.Jd=Vi;v.q(a);return b},LogicTruth:function(a,b,c){a=v.s();N(a,0,0,!1);a.lineTo(1*b,0);a.moveTo(.5*b,0);a.lineTo(.5*b,1*c); +b=a.o;v.q(a);return b},LogicFalsity:function(a,b,c){a=v.s();N(a,0,1*c,!1);a.lineTo(1*b,1*c);a.moveTo(.5*b,1*c);a.lineTo(.5*b,0);b=a.o;v.q(a);return b},LogicThereExists:function(a,b,c){a=v.s();N(a,0,0,!1);a.lineTo(1*b,0);a.lineTo(1*b,.5*c);a.lineTo(0,.5*c);a.moveTo(1*b,.5*c);a.lineTo(1*b,1*c);a.lineTo(0,1*c);b=a.o;v.q(a);return b},LogicForAll:function(a,b,c){a=v.s();N(a,0,0,!1);a.lineTo(.5*b,1*c);a.lineTo(1*b,0);a.moveTo(.25*b,.5*c);a.lineTo(.75*b,.5*c);b=a.o;b.B=new L(.25,0);b.C=new L(.75,.5);v.q(a); +return b},LogicIsDefinedAs:function(a,b,c){a=v.s();N(a,0,0,!1);a.lineTo(b,0);a.moveTo(0,.5*c);a.lineTo(b,.5*c);a.moveTo(0,c);a.lineTo(b,c);b=a.o;b.B=new L(.01,.01);b.C=new L(.99,.49);v.q(a);return b},LogicIntersect:function(a,b,c){var d=.5*$c;a=v.s();N(a,0,1*c,!1);a.lineTo(0,.5*c);O(a,0,(.5-d)*c,(.5-d)*b,0,.5*b,0);O(a,(.5+d)*b,0,1*b,(.5-d)*c,1*b,.5*c);a.lineTo(1*b,1*c);b=a.o;b.B=new L(0,.5);b.C=Eb;v.q(a);return b},LogicUnion:function(a,b,c){var d=.5*$c;a=v.s();N(a,1*b,0,!1);a.lineTo(1*b,.5*c);O(a, +1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);O(a,(.5-d)*b,1*c,0,(.5+d)*c,0,.5*c);a.lineTo(0,0);b=a.o;b.B=rb;b.C=new L(1,.5);v.q(a);return b},Arrow:function(a,b,c){var d=a?a.Ac:NaN,e=a?a.Mt:NaN;isNaN(d)&&(d=.3);isNaN(e)&&(e=.3);a=v.s();N(a,0,(.5-e/2)*c,!0);a.lineTo((1-d)*b,(.5-e/2)*c);a.lineTo((1-d)*b,0);a.lineTo(1*b,.5*c);a.lineTo((1-d)*b,1*c);a.lineTo((1-d)*b,(.5+e/2)*c);a.lineTo(0,(.5+e/2)*c);P(a);b=a.o;b.B=new L(0,.5-e/2);d=he(0,.5+e/2,1,.5+e/2,1-d,1,1,.5,v.L());b.C=new L(d.x,d.y);v.v(d);v.q(a);return b}, +ISOProcess:"Chevron",Chevron:function(a,b,c){a=v.s();N(a,0,0,!0);a.lineTo(.5*b,0);a.lineTo(1*b,.5*c);a.lineTo(.5*b,1*c);a.lineTo(0,1*c);a.lineTo(.5*b,.5*c);P(a);b=a.o;v.q(a);return b},DoubleArrow:function(a,b,c){a=v.s();N(a,0,0,!0);a.lineTo(.3*b,.214*c);a.lineTo(.3*b,0);a.lineTo(1*b,.5*c);a.lineTo(.3*b,1*c);a.lineTo(.3*b,.786*c);a.lineTo(0,1*c);P(a);N(a,.3*b,.214*c,!1);a.lineTo(.3*b,.786*c);a.Ya(!1);b=a.o;v.q(a);return b},DoubleEndArrow:function(a,b,c){a=v.s();N(a,1*b,.5*c,!0);a.lineTo(.7*b,1*c); +a.lineTo(.7*b,.7*c);a.lineTo(.3*b,.7*c);a.lineTo(.3*b,1*c);a.lineTo(0,.5*c);a.lineTo(.3*b,0);a.lineTo(.3*b,.3*c);a.lineTo(.7*b,.3*c);a.lineTo(.7*b,0);P(a);b=a.o;c=he(0,.5,.3,0,0,.3,.3,.3,v.L());b.B=new L(c.x,c.y);c=he(.7,1,1,.5,.7,.7,1,.7,c);b.C=new L(c.x,c.y);v.v(c);v.q(a);return b},IBeamArrow:function(a,b,c){a=v.s();N(a,1*b,.5*c,!0);a.lineTo(.7*b,1*c);a.lineTo(.7*b,.7*c);a.lineTo(.2*b,.7*c);a.lineTo(.2*b,1*c);a.lineTo(0,1*c);a.lineTo(0,0);a.lineTo(.2*b,0);a.lineTo(.2*b,.3*c);a.lineTo(.7*b,.3*c); +a.lineTo(.7*b,0);P(a);b=a.o;b.B=new L(0,.3);c=he(.7,1,1,.5,.7,.7,1,.7,v.L());b.C=new L(c.x,c.y);v.v(c);v.q(a);return b},Pointer:function(a,b,c){a=v.s();N(a,1*b,.5*c,!0);a.lineTo(0,1*c);a.lineTo(.2*b,.5*c);a.lineTo(0,0);P(a);b=a.o;b.B=new L(.2,.35);c=he(.2,.65,1,.65,0,1,1,.5,v.L());b.C=new L(c.x,c.y);v.v(c);v.q(a);return b},RoundedPointer:function(a,b,c){a=v.s();N(a,1*b,.5*c,!0);a.lineTo(0,1*c);O(a,.5*b,.75*c,.5*b,.25*c,0,0);P(a);b=a.o;b.B=new L(.4,.35);c=he(.2,.65,1,.65,0,1,1,.5,v.L());b.C=new L(c.x, +c.y);v.v(c);v.q(a);return b},SplitEndArrow:function(a,b,c){a=v.s();N(a,1*b,.5*c,!0);a.lineTo(.7*b,1*c);a.lineTo(.7*b,.7*c);a.lineTo(0,.7*c);a.lineTo(.2*b,.5*c);a.lineTo(0,.3*c);a.lineTo(.7*b,.3*c);a.lineTo(.7*b,0);P(a);b=a.o;b.B=new L(.2,.3);c=he(.7,1,1,.5,.7,.7,1,.7,v.L());b.C=new L(c.x,c.y);v.v(c);v.q(a);return b},MessageToUser:"SquareArrow",SquareArrow:function(a,b,c){a=v.s();N(a,1*b,.5*c,!0);a.lineTo(.7*b,1*c);a.lineTo(0,1*c);a.lineTo(0,0);a.lineTo(.7*b,0);P(a);b=a.o;b.B=rb;b.C=new L(.7,1);v.q(a); +return b},Cone1:function(a,b,c){var d=.5*$c,e=.1*$c;a=v.s();N(a,0,.9*c,!0);a.lineTo(.5*b,0);a.lineTo(1*b,.9*c);O(a,1*b,(.9+e)*c,(.5+d)*b,1*c,.5*b,1*c);O(a,(.5-d)*b,1*c,0,(.9+e)*c,0,.9*c);P(a);b=a.o;b.B=new L(.25,.5);b.C=new L(.75,.97);v.q(a);return b},Cone2:function(a,b,c){a=v.s();N(a,0,.9*c,!0);O(a,(1-.85/.9)*b,1*c,.85/.9*b,1*c,1*b,.9*c);a.lineTo(.5*b,0);a.lineTo(0,.9*c);P(a);N(a,0,.9*c,!1);O(a,(1-.85/.9)*b,.8*c,.85/.9*b,.8*c,1*b,.9*c);a.Ya(!1);b=a.o;b.B=new L(.25,.5);b.C=new L(.75,.82);v.q(a);return b}, +Cube1:function(a,b,c){a=v.s();N(a,.5*b,1*c,!0);a.lineTo(1*b,.85*c);a.lineTo(1*b,.15*c);a.lineTo(.5*b,0*c);a.lineTo(0*b,.15*c);a.lineTo(0*b,.85*c);P(a);N(a,.5*b,1*c,!1);a.lineTo(.5*b,.3*c);a.lineTo(0,.15*c);a.moveTo(.5*b,.3*c);a.lineTo(1*b,.15*c);a.Ya(!1);b=a.o;b.B=new L(0,.3);b.C=new L(.5,.85);v.q(a);return b},Cube2:function(a,b,c){a=v.s();N(a,0,.3*c,!0);a.lineTo(0*b,1*c);a.lineTo(.7*b,c);a.lineTo(1*b,.7*c);a.lineTo(1*b,0*c);a.lineTo(.3*b,0*c);P(a);N(a,0,.3*c,!1);a.lineTo(.7*b,.3*c);a.lineTo(1*b, +0*c);a.moveTo(.7*b,.3*c);a.lineTo(.7*b,1*c);a.Ya(!1);b=a.o;b.B=new L(0,.3);b.C=new L(.7,1);v.q(a);return b},MagneticData:"Cylinder1",Cylinder1:function(a,b,c){var d=.5*$c,e=.1*$c;a=v.s();N(a,0,.1*c,!0);O(a,0,(.1-e)*c,(.5-d)*b,0,.5*b,0);O(a,(.5+d)*b,0,1*b,(.1-e)*c,1*b,.1*c);a.lineTo(b,.9*c);O(a,1*b,(.9+e)*c,(.5+d)*b,1*c,.5*b,1*c);O(a,(.5-d)*b,1*c,0,(.9+e)*c,0,.9*c);a.lineTo(0,.1*c);N(a,0,.1*c,!1);O(a,0,(.1+e)*c,(.5-d)*b,.2*c,.5*b,.2*c);O(a,(.5+d)*b,.2*c,1*b,(.1+e)*c,1*b,.1*c);a.Ya(!1);b=a.o;b.B=new L(0, +.2);b.C=new L(1,.9);v.q(a);return b},Cylinder2:function(a,b,c){var d=.5*$c,e=.1*$c;a=v.s();N(a,0,.9*c,!0);a.lineTo(0,.1*c);O(a,0,(.1-e)*c,(.5-d)*b,0,.5*b,0);O(a,(.5+d)*b,0,1*b,(.1-e)*c,1*b,.1*c);a.lineTo(1*b,.9*c);O(a,1*b,(.9+e)*c,(.5+d)*b,1*c,.5*b,1*c);O(a,(.5-d)*b,1*c,0,(.9+e)*c,0,.9*c);N(a,0,.9*c,!1);O(a,0,(.9-e)*c,(.5-d)*b,.8*c,.5*b,.8*c);O(a,(.5+d)*b,.8*c,1*b,(.9-e)*c,1*b,.9*c);a.Ya(!1);b=a.o;b.B=new L(0,.1);b.C=new L(1,.8);v.q(a);return b},Cylinder3:function(a,b,c){var d=.1*$c,e=.5*$c;a=v.s(); +N(a,.1*b,0,!0);a.lineTo(.9*b,0);O(a,(.9+d)*b,0,1*b,(.5-e)*c,1*b,.5*c);O(a,1*b,(.5+e)*c,(.9+d)*b,1*c,.9*b,1*c);a.lineTo(.1*b,1*c);O(a,(.1-d)*b,1*c,0,(.5+e)*c,0,.5*c);O(a,0,(.5-e)*c,(.1-d)*b,0,.1*b,0);N(a,.1*b,0,!1);O(a,(.1+d)*b,0,.2*b,(.5-e)*c,.2*b,.5*c);O(a,.2*b,(.5+e)*c,(.1+d)*b,1*c,.1*b,1*c);a.Ya(!1);b=a.o;b.B=new L(.2,0);b.C=new L(.9,1);v.q(a);return b},DirectData:"Cylinder4",Cylinder4:function(a,b,c){var d=.1*$c,e=.5*$c;a=v.s();N(a,.9*b,0,!0);O(a,(.9+d)*b,0,1*b,(.5-e)*c,1*b,.5*c);O(a,1*b,(.5+ +e)*c,(.9+d)*b,1*c,.9*b,1*c);a.lineTo(.1*b,1*c);O(a,(.1-d)*b,1*c,0,(.5+e)*c,0,.5*c);O(a,0,(.5-e)*c,(.1-d)*b,0,.1*b,0);a.lineTo(.9*b,0);N(a,.9*b,0,!1);O(a,(.9-d)*b,0,.8*b,(.5-e)*c,.8*b,.5*c);O(a,.8*b,(.5+e)*c,(.9-d)*b,1*c,.9*b,1*c);a.Ya(!1);b=a.o;b.B=new L(.1,0);b.C=new L(.8,1);v.q(a);return b},Prism1:function(a,b,c){a=v.s();N(a,.25*b,.25*c,!0);a.lineTo(.75*b,0);a.lineTo(b,.5*c);a.lineTo(.5*b,c);a.lineTo(0,c);P(a);N(a,.25*b,.25*c,!1);a.lineTo(.5*b,c);a.Ya(!1);b=a.o;b.B=new L(.408,.172);b.C=new L(.833, +.662);v.q(a);return b},Prism2:function(a,b,c){a=v.s();N(a,0,.25*c,!0);a.lineTo(.75*b,0);a.lineTo(1*b,.25*c);a.lineTo(.75*b,.75*c);a.lineTo(0,1*c);P(a);N(a,0,c,!1);a.lineTo(.25*b,.5*c);a.lineTo(b,.25*c);a.moveTo(0,.25*c);a.lineTo(.25*b,.5*c);a.Ya(!1);b=a.o;b.B=new L(.25,.5);b.C=new L(.75,.75);v.q(a);return b},Pyramid1:function(a,b,c){a=v.s();N(a,.5*b,0,!0);a.lineTo(b,.75*c);a.lineTo(.5*b,1*c);a.lineTo(0,.75*c);P(a);N(a,.5*b,0,!1);a.lineTo(.5*b,1*c);a.Ya(!1);b=a.o;b.B=new L(.25,.367);b.C=new L(.75, +.875);v.q(a);return b},Pyramid2:function(a,b,c){a=v.s();N(a,.5*b,0,!0);a.lineTo(b,.85*c);a.lineTo(.5*b,1*c);a.lineTo(0,.85*c);P(a);N(a,.5*b,0,!1);a.lineTo(.5*b,.7*c);a.lineTo(0,.85*c);a.moveTo(.5*b,.7*c);a.lineTo(1*b,.85*c);a.Ya(!1);b=a.o;b.B=new L(.25,.367);b.C=new L(.75,.875);v.q(a);return b},Actor:function(a,b,c){var d=.2*$c,e=.1*$c,f=.5,h=.1;a=v.s();N(a,f*b,(h+.1)*c,!0);O(a,(f-d)*b,(h+.1)*c,(f-.2)*b,(h+e)*c,(f-.2)*b,h*c);O(a,(f-.2)*b,(h-e)*c,(f-d)*b,(h-.1)*c,f*b,(h-.1)*c);O(a,(f+d)*b,(h-.1)*c, +(f+.2)*b,(h-e)*c,(f+.2)*b,h*c);O(a,(f+.2)*b,(h+e)*c,(f+d)*b,(h+.1)*c,f*b,(h+.1)*c);d=.05;e=$c*d;N(a,.5*b,.2*c,!0);a.lineTo(.95*b,.2*c);f=.95;h=.25;O(a,(f+e)*b,(h-d)*c,(f+d)*b,(h-e)*c,(f+d)*b,h*c);a.lineTo(1*b,.6*c);a.lineTo(.85*b,.6*c);a.lineTo(.85*b,.35*c);d=.025;e=$c*d;f=.825;h=.35;O(a,(f+d)*b,(h-e)*c,(f+e)*b,(h-d)*c,f*b,(h-d)*c);O(a,(f-e)*b,(h-d)*c,(f-d)*b,(h-e)*c,(f-d)*b,h*c);a.lineTo(.8*b,1*c);a.lineTo(.55*b,1*c);a.lineTo(.55*b,.7*c);d=.05;e=$c*d;f=.5;h=.7;O(a,(f+d)*b,(h-e)*c,(f+e)*b,(h-d)*c, +f*b,(h-d)*c);O(a,(f-e)*b,(h-d)*c,(f-d)*b,(h-e)*c,(f-d)*b,h*c);a.lineTo(.45*b,1*c);a.lineTo(.2*b,1*c);a.lineTo(.2*b,.35*c);d=.025;e=$c*d;f=.175;h=.35;O(a,(f+d)*b,(h-e)*c,(f+e)*b,(h-d)*c,f*b,(h-d)*c);O(a,(f-e)*b,(h-d)*c,(f-d)*b,(h-e)*c,(f-d)*b,h*c);a.lineTo(.15*b,.6*c);a.lineTo(0*b,.6*c);a.lineTo(0*b,.25*c);d=.05;e=$c*d;f=.05;h=.25;O(a,(f-d)*b,(h-e)*c,(f-e)*b,(h-d)*c,f*b,(h-d)*c);a.lineTo(.5*b,.2*c);b=a.o;b.B=new L(.2,.2);b.C=new L(.8,.65);v.q(a);return b},Card:function(a,b,c){a=v.s();N(a,1*b,0*c,!0); +a.lineTo(1*b,1*c);a.lineTo(0*b,1*c);a.lineTo(0*b,.2*c);a.lineTo(.2*b,0*c);P(a);b=a.o;b.B=new L(0,.2);b.C=Eb;v.q(a);return b},Collate:function(a,b,c){a=v.s();N(a,.5*b,.5*c,!0);a.lineTo(0,0);a.lineTo(1*b,0);a.lineTo(.5*b,.5*c);N(a,.5*b,.5*c,!0);a.lineTo(1*b,1*c);a.lineTo(0,1*c);a.lineTo(.5*b,.5*c);b=a.o;b.B=new L(.25,0);b.C=new L(.75,.25);v.q(a);return b},CreateRequest:function(a,b,c){a=a?a.Ac:NaN;isNaN(a)&&(a=.1);var d=v.s();N(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c);P(d);N(d,0, +a*c,!1);d.lineTo(1*b,a*c);d.moveTo(0,(1-a)*c);d.lineTo(1*b,(1-a)*c);d.Ya(!1);b=d.o;b.B=new L(0,a);b.C=new L(1,1-a);v.q(d);return b},Database:function(a,b,c){a=v.s();var d=.5*$c,e=.1*$c;N(a,1*b,.1*c,!0);a.lineTo(1*b,.9*c);O(a,1*b,(.9+e)*c,(.5+d)*b,1*c,.5*b,1*c);O(a,(.5-d)*b,1*c,0,(.9+e)*c,0,.9*c);a.lineTo(0,.1*c);O(a,0,(.1-e)*c,(.5-d)*b,0,.5*b,0);O(a,(.5+d)*b,0,1*b,(.1-e)*c,1*b,.1*c);N(a,1*b,.1*c,!1);O(a,1*b,(.1+e)*c,(.5+d)*b,.2*c,.5*b,.2*c);O(a,(.5-d)*b,.2*c,0,(.1+e)*c,0,.1*c);a.moveTo(1*b,.2*c); +O(a,1*b,(.2+e)*c,(.5+d)*b,.3*c,.5*b,.3*c);O(a,(.5-d)*b,.3*c,0,(.2+e)*c,0,.2*c);a.moveTo(1*b,.3*c);O(a,1*b,(.3+e)*c,(.5+d)*b,.4*c,.5*b,.4*c);O(a,(.5-d)*b,.4*c,0,(.3+e)*c,0,.3*c);a.Ya(!1);b=a.o;b.B=new L(0,.4);b.C=new L(1,.9);v.q(a);return b},StoredData:"DataStorage",DataStorage:function(a,b,c){a=v.s();N(a,0,0,!0);a.lineTo(.75*b,0);O(a,1*b,0,1*b,1*c,.75*b,1*c);a.lineTo(0,1*c);O(a,.25*b,.9*c,.25*b,.1*c,0,0);P(a);b=a.o;b.B=new L(.226,0);b.C=new L(.81,1);v.q(a);return b},DiskStorage:function(a,b,c){a= +v.s();var d=.5*$c,e=.1*$c;N(a,1*b,.1*c,!0);a.lineTo(1*b,.9*c);O(a,1*b,(.9+e)*c,(.5+d)*b,1*c,.5*b,1*c);O(a,(.5-d)*b,1*c,0,(.9+e)*c,0,.9*c);a.lineTo(0,.1*c);O(a,0,(.1-e)*c,(.5-d)*b,0,.5*b,0);O(a,(.5+d)*b,0,1*b,(.1-e)*c,1*b,.1*c);N(a,1*b,.1*c,!1);O(a,1*b,(.1+e)*c,(.5+d)*b,.2*c,.5*b,.2*c);O(a,(.5-d)*b,.2*c,0,(.1+e)*c,0,.1*c);a.moveTo(1*b,.2*c);O(a,1*b,(.2+e)*c,(.5+d)*b,.3*c,.5*b,.3*c);O(a,(.5-d)*b,.3*c,0,(.2+e)*c,0,.2*c);a.Ya(!1);b=a.o;b.B=new L(0,.3);b.C=new L(1,.9);v.q(a);return b},Display:function(a, +b,c){a=v.s();N(a,.25*b,0,!0);a.lineTo(.75*b,0);O(a,1*b,0,1*b,1*c,.75*b,1*c);a.lineTo(.25*b,1*c);a.lineTo(0,.5*c);P(a);b=a.o;b.B=new L(.25,0);b.C=new L(.75,1);v.q(a);return b},DividedEvent:function(a,b,c){a=a?a.Ac:NaN;isNaN(a)?a=.2:.15>a&&(a=.15);var d=v.s(),e=.2*$c;N(d,0,.2*c,!0);O(d,0,(.2-e)*c,(.2-e)*b,0,.2*b,0);d.lineTo(.8*b,0);O(d,(.8+e)*b,0,1*b,(.2-e)*c,1*b,.2*c);d.lineTo(1*b,.8*c);O(d,1*b,(.8+e)*c,(.8+e)*b,1*c,.8*b,1*c);d.lineTo(.2*b,1*c);O(d,(.2-e)*b,1*c,0,(.8+e)*c,0,.8*c);d.lineTo(0,.2*c); +N(d,0,a*c,!1);d.lineTo(1*b,a*c);d.Ya(!1);b=d.o;b.B=new L(0,a);b.C=new L(1,1-a);v.q(d);return b},DividedProcess:function(a,b,c){a=a?a.Ac:NaN;if(isNaN(a)||.1>a)a=.1;var d=v.s();N(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c);P(d);N(d,0,a*c,!1);d.lineTo(1*b,a*c);d.Ya(!1);b=d.o;b.B=new L(0,a);b.C=Eb;v.q(d);return b},Document:function(a,b,c){c/=.8;a=v.s();N(a,0,.7*c,!0);a.lineTo(0,0);a.lineTo(1*b,0);a.lineTo(1*b,.7*c);O(a,.5*b,.4*c,.5*b,1*c,0,.7*c);P(a);b=a.o;b.B=rb;b.C=new L(1,.6);v.q(a); +return b},ExternalOrganization:function(a,b,c){a=a?a.Ac:NaN;if(isNaN(a)||.2>a)a=.2;var d=v.s();N(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c);P(d);N(d,a*b,0,!1);d.lineTo(0,a*c);d.moveTo(1*b,a*c);d.lineTo((1-a)*b,0);d.moveTo(0,(1-a)*c);d.lineTo(a*b,1*c);d.moveTo((1-a)*b,1*c);d.lineTo(1*b,(1-a)*c);d.Ya(!1);b=d.o;b.B=new L(a/2,a/2);b.C=new L(1-a/2,1-a/2);v.q(d);return b},ExternalProcess:function(a,b,c){a=v.s();N(a,.5*b,0,!0);a.lineTo(1*b,.5*c);a.lineTo(.5*b,1*c);a.lineTo(0,.5*c);P(a); +N(a,.1*b,.4*c,!1);a.lineTo(.1*b,.6*c);a.moveTo(.9*b,.6*c);a.lineTo(.9*b,.4*c);a.moveTo(.6*b,.1*c);a.lineTo(.4*b,.1*c);a.moveTo(.4*b,.9*c);a.lineTo(.6*b,.9*c);a.Ya(!1);b=a.o;b.B=new L(.25,.25);b.C=new L(.75,.75);v.q(a);return b},File:function(a,b,c){a=v.s();N(a,0,0,!0);a.lineTo(.75*b,0);a.lineTo(1*b,.25*c);a.lineTo(1*b,1*c);a.lineTo(0,1*c);P(a);N(a,.75*b,0,!1);a.lineTo(.75*b,.25*c);a.lineTo(1*b,.25*c);a.Ya(!1);b=a.o;b.B=new L(0,.25);b.C=Eb;v.q(a);return b},Interrupt:function(a,b,c){a=v.s();N(a,1*b, +.5*c,!0);a.lineTo(0,1*c);a.lineTo(0,0);a.lineTo(1*b,.5*c);N(a,1*b,.5*c,!1);a.lineTo(1*b,1*c);N(a,1*b,.5*c,!1);a.lineTo(1*b,0);b=a.o;b.B=new L(0,.25);b.C=new L(.5,.75);v.q(a);return b},InternalStorage:function(a,b,c){var d=a?a.Ac:NaN;a=a?a.Mt:NaN;isNaN(d)&&(d=.1);isNaN(a)&&(a=.1);var e=v.s();N(e,0,0,!0);e.lineTo(1*b,0);e.lineTo(1*b,1*c);e.lineTo(0,1*c);P(e);N(e,d*b,0,!1);e.lineTo(d*b,1*c);e.moveTo(0,a*c);e.lineTo(1*b,a*c);e.Ya(!1);b=e.o;b.B=new L(d,a);b.C=Eb;v.q(e);return b},Junction:function(a,b, +c){a=v.s();var d=1/Math.SQRT2,e=(1-1/Math.SQRT2)/2,f=.5*$c;N(a,1*b,.5*c,!0);O(a,1*b,(.5+f)*c,(.5+f)*b,1*c,.5*b,1*c);O(a,(.5-f)*b,1*c,0,(.5+f)*c,0,.5*c);O(a,0,(.5-f)*c,(.5-f)*b,0,.5*b,0);O(a,(.5+f)*b,0,1*b,(.5-f)*c,1*b,.5*c);N(a,(e+d)*b,(e+d)*c,!1);a.lineTo(e*b,e*c);a.moveTo(e*b,(e+d)*c);a.lineTo((e+d)*b,e*c);a.Ya(!1);b=a.o;b.Jd=Vi;v.q(a);return b},LinedDocument:function(a,b,c){c/=.8;a=v.s();N(a,0,.7*c,!0);a.lineTo(0,0);a.lineTo(1*b,0);a.lineTo(1*b,.7*c);O(a,.5*b,.4*c,.5*b,1*c,0,.7*c);P(a);N(a,.1* +b,0,!1);a.lineTo(.1*b,.75*c);a.Ya(!1);b=a.o;b.B=new L(.1,0);b.C=new L(1,.6);v.q(a);return b},LoopLimit:function(a,b,c){a=v.s();N(a,0,1*c,!0);a.lineTo(0,.25*c);a.lineTo(.25*b,0);a.lineTo(.75*b,0);a.lineTo(1*b,.25*c);a.lineTo(1*b,1*c);P(a);b=a.o;b.B=new L(0,.25);b.C=Eb;v.q(a);return b},SequentialData:"MagneticTape",MagneticTape:function(a,b,c){a=v.s();var d=.5*$c;N(a,.5*b,1*c,!0);O(a,(.5-d)*b,1*c,0,(.5+d)*c,0,.5*c);O(a,0,(.5-d)*c,(.5-d)*b,0,.5*b,0);O(a,(.5+d)*b,0,1*b,(.5-d)*c,1*b,.5*c);O(a,1*b,(.5+ +d)*c,(.5+d)*b,.9*c,.6*b,.9*c);a.lineTo(1*b,.9*c);a.lineTo(1*b,1*c);a.lineTo(.5*b,1*c);b=a.o;b.B=new L(.15,.15);b.C=new L(.85,.8);v.q(a);return b},ManualInput:function(a,b,c){a=v.s();N(a,1*b,0,!0);a.lineTo(1*b,1*c);a.lineTo(0,1*c);a.lineTo(0,.25*c);P(a);b=a.o;b.B=new L(0,.25);b.C=Eb;v.q(a);return b},MessageFromUser:function(a,b,c){a=a?a.Ac:NaN;isNaN(a)&&(a=.7);var d=v.s();N(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(a*b,.5*c);d.lineTo(1*b,1*c);d.lineTo(0,1*c);P(d);b=d.o;b.B=rb;b.C=new L(a,1);v.q(d);return b}, +MicroformProcessing:function(a,b,c){a=a?a.Ac:NaN;isNaN(a)&&(a=.25);var d=v.s();N(d,0,0,!0);d.lineTo(.5*b,a*c);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(.5*b,(1-a)*c);d.lineTo(0,1*c);P(d);b=d.o;b.B=new L(0,a);b.C=new L(1,1-a);v.q(d);return b},MicroformRecording:function(a,b,c){a=v.s();N(a,0,0,!0);a.lineTo(.75*b,.25*c);a.lineTo(1*b,.15*c);a.lineTo(1*b,.85*c);a.lineTo(.75*b,.75*c);a.lineTo(0,1*c);P(a);b=a.o;b.B=new L(0,.25);b.C=new L(1,.75);v.q(a);return b},MultiDocument:function(a,b,c){c/=.8;a=v.s(); +N(a,b,0,!0);a.lineTo(b,.5*c);O(a,.96*b,.47*c,.93*b,.45*c,.9*b,.44*c);a.lineTo(.9*b,.6*c);O(a,.86*b,.57*c,.83*b,.55*c,.8*b,.54*c);a.lineTo(.8*b,.7*c);O(a,.4*b,.4*c,.4*b,1*c,0,.7*c);a.lineTo(0,.2*c);a.lineTo(.1*b,.2*c);a.lineTo(.1*b,.1*c);a.lineTo(.2*b,.1*c);a.lineTo(.2*b,0);P(a);N(a,.1*b,.2*c,!1);a.lineTo(.8*b,.2*c);a.lineTo(.8*b,.54*c);a.moveTo(.2*b,.1*c);a.lineTo(.9*b,.1*c);a.lineTo(.9*b,.44*c);a.Ya(!1);b=a.o;b.B=new L(0,.25);b.C=new L(.8,.77);v.q(a);return b},MultiProcess:function(a,b,c){a=v.s(); +N(a,.1*b,.1*c,!0);a.lineTo(.2*b,.1*c);a.lineTo(.2*b,0);a.lineTo(1*b,0);a.lineTo(1*b,.8*c);a.lineTo(.9*b,.8*c);a.lineTo(.9*b,.9*c);a.lineTo(.8*b,.9*c);a.lineTo(.8*b,1*c);a.lineTo(0,1*c);a.lineTo(0,.2*c);a.lineTo(.1*b,.2*c);P(a);N(a,.2*b,.1*c,!1);a.lineTo(.9*b,.1*c);a.lineTo(.9*b,.8*c);a.moveTo(.1*b,.2*c);a.lineTo(.8*b,.2*c);a.lineTo(.8*b,.9*c);a.Ya(!1);b=a.o;b.B=new L(0,.2);b.C=new L(.8,1);v.q(a);return b},OfflineStorage:function(a,b,c){a=a?a.Ac:NaN;isNaN(a)&&(a=.1);var d=1-a,e=v.s();N(e,0,0,!0);e.lineTo(1* +b,0);e.lineTo(.5*b,1*c);P(e);N(e,.5*a*b,a*c,!1);e.lineTo((1-.5*a)*b,a*c);e.Ya(!1);b=e.o;b.B=new L(d/4+.5*a,a);b.C=new L(3*d/4+.5*a,a+.5*d);v.q(e);return b},OffPageConnector:function(a,b,c){a=v.s();N(a,0,0,!0);a.lineTo(.75*b,0);a.lineTo(1*b,.5*c);a.lineTo(.75*b,1*c);a.lineTo(0,1*c);P(a);b=a.o;b.B=rb;b.C=new L(.75,1);v.q(a);return b},Or:function(a,b,c){a=v.s();var d=.5*$c;N(a,1*b,.5*c,!0);O(a,1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);O(a,(.5-d)*b,1*c,0,(.5+d)*c,0,.5*c);O(a,0,(.5-d)*c,(.5-d)*b,0,.5*b,0);O(a, +(.5+d)*b,0,1*b,(.5-d)*c,1*b,.5*c);N(a,1*b,.5*c,!1);a.lineTo(0,.5*c);a.moveTo(.5*b,1*c);a.lineTo(.5*b,0);a.Ya(!1);b=a.o;b.Jd=Vi;v.q(a);return b},PaperTape:function(a,b,c){c/=.8;a=v.s();N(a,0,.7*c,!0);a.lineTo(0,.3*c);O(a,.5*b,.6*c,.5*b,0,1*b,.3*c);a.lineTo(1*b,.7*c);O(a,.5*b,.4*c,.5*b,1*c,0,.7*c);P(a);b=a.o;b.B=new L(0,.49);b.C=new L(1,.75);v.q(a);return b},PrimitiveFromCall:function(a,b,c){var d=a?a.Ac:NaN;a=a?a.Mt:NaN;isNaN(d)&&(d=.1);isNaN(a)&&(a=.3);var e=v.s();N(e,0,0,!0);e.lineTo(1*b,0);e.lineTo((1- +a)*b,.5*c);e.lineTo(1*b,1*c);e.lineTo(0,1*c);P(e);b=e.o;b.B=new L(d,0);b.C=new L(1-a,1);v.q(e);return b},PrimitiveToCall:function(a,b,c){var d=a?a.Ac:NaN;a=a?a.Mt:NaN;isNaN(d)&&(d=.1);isNaN(a)&&(a=.3);var e=v.s();N(e,0,0,!0);e.lineTo((1-a)*b,0);e.lineTo(1*b,.5*c);e.lineTo((1-a)*b,1*c);e.lineTo(0,1*c);P(e);b=e.o;b.B=new L(d,0);b.C=new L(1-a,1);v.q(e);return b},Subroutine:"Procedure",Procedure:function(a,b,c){a=a?a.Ac:NaN;isNaN(a)&&(a=.1);var d=v.s();N(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0, +1*c);P(d);N(d,(1-a)*b,0,!1);d.lineTo((1-a)*b,1*c);d.moveTo(a*b,0);d.lineTo(a*b,1*c);d.Ya(!1);b=d.o;b.B=new L(a,0);b.C=new L(1-a,1);v.q(d);return b},Process:function(a,b,c){a=a?a.Ac:NaN;isNaN(a)&&(a=.1);var d=v.s();N(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c);P(d);N(d,a*b,0,!1);d.lineTo(a*b,1*c);d.Ya(!1);b=d.o;b.B=new L(a,0);b.C=Eb;v.q(d);return b},Sort:function(a,b,c){a=v.s();N(a,.5*b,0,!0);a.lineTo(1*b,.5*c);a.lineTo(.5*b,1*c);a.lineTo(0,.5*c);P(a);N(a,0,.5*c,!1);a.lineTo(1*b,.5* +c);a.Ya(!1);b=a.o;b.B=new L(.25,.25);b.C=new L(.75,.5);v.q(a);return b},Start:function(a,b,c){a=v.s();N(a,.25*b,0,!0);N(a,.25*b,0,!0);a.arcTo(270,180,.75*b,.5*c,.25*b,.5*c);a.arcTo(90,180,.25*b,.5*c,.25*b,.5*c);N(a,.25*b,0,!1);a.lineTo(.25*b,1*c);a.moveTo(.75*b,0);a.lineTo(.75*b,1*c);a.Ya(!1);b=a.o;b.B=new L(.25,0);b.C=new L(.75,1);v.q(a);return b},Terminator:function(a,b,c){a=v.s();N(a,.25*b,0,!0);a.arcTo(270,180,.75*b,.5*c,.25*b,.5*c);a.arcTo(90,180,.25*b,.5*c,.25*b,.5*c);b=a.o;b.B=new L(.23,0); +b.C=new L(.77,1);v.q(a);return b},TransmittalTape:function(a,b,c){a=a?a.Ac:NaN;isNaN(a)&&(a=.1);var d=v.s();N(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(.75*b,(1-a)*c);d.lineTo(0,(1-a)*c);P(d);b=d.o;b.B=rb;b.C=new L(1,1-a);v.q(d);return b},AndGate:function(a,b,c){a=v.s();var d=.5*$c;N(a,0,0,!0);a.lineTo(.5*b,0);O(a,(.5+d)*b,0,1*b,(.5-d)*c,1*b,.5*c);O(a,1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);a.lineTo(0,1*c);P(a);b=a.o;b.B=rb;b.C=new L(.55,1);v.q(a);return b},Buffer:function(a,b,c){a=v.s();N(a, +0,0,!0);a.lineTo(1*b,.5*c);a.lineTo(0,1*c);P(a);b=a.o;b.B=new L(0,.25);b.C=new L(.5,.75);v.q(a);return b},Clock:function(a,b,c){a=v.s();var d=.5*$c;N(a,1*b,.5*c,!0);O(a,1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);O(a,(.5-d)*b,1*c,0,(.5+d)*c,0,.5*c);O(a,0,(.5-d)*c,(.5-d)*b,0,.5*b,0);O(a,(.5+d)*b,0,1*b,(.5-d)*c,1*b,.5*c);N(a,1*b,.5*c,!1);a.lineTo(1*b,.5*c);N(a,.8*b,.75*c,!1);a.lineTo(.8*b,.25*c);a.lineTo(.6*b,.25*c);a.lineTo(.6*b,.75*c);a.lineTo(.4*b,.75*c);a.lineTo(.4*b,.25*c);a.lineTo(.2*b,.25*c);a.lineTo(.2* +b,.75*c);a.Ya(!1);b=a.o;b.Jd=Vi;v.q(a);return b},Ground:function(a,b,c){a=v.s();N(a,.5*b,0,!1);a.lineTo(.5*b,.4*c);a.moveTo(.2*b,.6*c);a.lineTo(.8*b,.6*c);a.moveTo(.3*b,.8*c);a.lineTo(.7*b,.8*c);a.moveTo(.4*b,1*c);a.lineTo(.6*b,1*c);b=a.o;v.q(a);return b},Inverter:function(a,b,c){a=v.s();var d=.1*$c;N(a,.8*b,.5*c,!0);a.lineTo(0,1*c);a.lineTo(0,0);a.lineTo(.8*b,.5*c);N(a,1*b,.5*c,!0);O(a,1*b,(.5+d)*c,(.9+d)*b,.6*c,.9*b,.6*c);O(a,(.9-d)*b,.6*c,.8*b,(.5+d)*c,.8*b,.5*c);O(a,.8*b,(.5-d)*c,(.9-d)*b,.4* +c,.9*b,.4*c);O(a,(.9+d)*b,.4*c,1*b,(.5-d)*c,1*b,.5*c);b=a.o;b.B=new L(0,.25);b.C=new L(.4,.75);v.q(a);return b},NandGate:function(a,b,c){a=v.s();var d=.5*$c,e=.4*$c,f=.1*$c;N(a,.8*b,.5*c,!0);O(a,.8*b,(.5+e)*c,(.4+d)*b,1*c,.4*b,1*c);a.lineTo(0,1*c);a.lineTo(0,0);a.lineTo(.4*b,0);O(a,(.4+d)*b,0,.8*b,(.5-e)*c,.8*b,.5*c);N(a,1*b,.5*c,!0);O(a,1*b,(.5+f)*c,(.9+f)*b,.6*c,.9*b,.6*c);O(a,(.9-f)*b,.6*c,.8*b,(.5+f)*c,.8*b,.5*c);O(a,.8*b,(.5-f)*c,(.9-f)*b,.4*c,.9*b,.4*c);O(a,(.9+f)*b,.4*c,1*b,(.5-f)*c,1*b,.5* +c);b=a.o;b.B=new L(0,.05);b.C=new L(.55,.95);v.q(a);return b},NorGate:function(a,b,c){a=v.s();var d=.5,e=$c*d,f=0,h=.5;N(a,.8*b,.5*c,!0);O(a,.7*b,(h+e)*c,(f+e)*b,(h+d)*c,0,1*c);O(a,.25*b,.75*c,.25*b,.25*c,0,0);O(a,(f+e)*b,(h-d)*c,.7*b,(h-e)*c,.8*b,.5*c);d=.1;e=.1*$c;f=.9;h=.5;N(a,(f-d)*b,h*c,!0);O(a,(f-d)*b,(h-e)*c,(f-e)*b,(h-d)*c,f*b,(h-d)*c);O(a,(f+e)*b,(h-d)*c,(f+d)*b,(h-e)*c,(f+d)*b,h*c);O(a,(f+d)*b,(h+e)*c,(f+e)*b,(h+d)*c,f*b,(h+d)*c);O(a,(f-e)*b,(h+d)*c,(f-d)*b,(h+e)*c,(f-d)*b,h*c);b=a.o;b.B= +new L(.2,.25);b.C=new L(.6,.75);v.q(a);return b},OrGate:function(a,b,c){a=v.s();var d=.5*$c;N(a,0,0,!0);O(a,(0+d+d)*b,0*c,.8*b,(.5-d)*c,1*b,.5*c);O(a,.8*b,(.5+d)*c,(0+d+d)*b,1*c,0,1*c);O(a,.25*b,.75*c,.25*b,.25*c,0,0);P(a);b=a.o;b.B=new L(.2,.25);b.C=new L(.75,.75);v.q(a);return b},XnorGate:function(a,b,c){a=v.s();var d=.5,e=$c*d,f=.2,h=.5;N(a,.1*b,0,!1);O(a,.35*b,.25*c,.35*b,.75*c,.1*b,1*c);N(a,.8*b,.5*c,!0);O(a,.7*b,(h+e)*c,(f+e)*b,(h+d)*c,.2*b,1*c);O(a,.45*b,.75*c,.45*b,.25*c,.2*b,0);O(a,(f+e)* +b,(h-d)*c,.7*b,(h-e)*c,.8*b,.5*c);d=.1;e=.1*$c;f=.9;h=.5;N(a,(f-d)*b,h*c,!0);O(a,(f-d)*b,(h-e)*c,(f-e)*b,(h-d)*c,f*b,(h-d)*c);O(a,(f+e)*b,(h-d)*c,(f+d)*b,(h-e)*c,(f+d)*b,h*c);O(a,(f+d)*b,(h+e)*c,(f+e)*b,(h+d)*c,f*b,(h+d)*c);O(a,(f-e)*b,(h+d)*c,(f-d)*b,(h+e)*c,(f-d)*b,h*c);b=a.o;b.B=new L(.4,.25);b.C=new L(.65,.75);v.q(a);return b},XorGate:function(a,b,c){a=v.s();var d=.5*$c;N(a,.1*b,0,!1);O(a,.35*b,.25*c,.35*b,.75*c,.1*b,1*c);N(a,.2*b,0,!0);O(a,(.2+d)*b,0*c,.9*b,(.5-d)*c,1*b,.5*c);O(a,.9*b,(.5+d)* +c,(.2+d)*b,1*c,.2*b,1*c);O(a,.45*b,.75*c,.45*b,.25*c,.2*b,0);P(a);b=a.o;b.B=new L(.4,.25);b.C=new L(.8,.75);v.q(a);return b},Capacitor:function(a,b,c){a=v.s();N(a,0,0,!1);a.lineTo(0,1*c);a.moveTo(1*b,0);a.lineTo(1*b,1*c);b=a.o;v.q(a);return b},Resistor:function(a,b,c){a=v.s();N(a,0,.5*c,!1);a.lineTo(.1*b,0);a.lineTo(.2*b,1*c);a.lineTo(.3*b,0);a.lineTo(.4*b,1*c);a.lineTo(.5*b,0);a.lineTo(.6*b,1*c);a.lineTo(.7*b,.5*c);b=a.o;v.q(a);return b},Inductor:function(a,b,c){a=v.s();var d=.1*$c,e=.1;N(a,(e-.5* +d)*b,c,!1);O(a,(e-d)*b,c,(e-.1)*b,0,(e+.1)*b,0);e=.3;O(a,(e+.1)*b,0,(e+d)*b,c,e*b,c);O(a,(e-d)*b,c,(e-.1)*b,0,(e+.1)*b,0);e=.5;O(a,(e+.1)*b,0,(e+d)*b,c,e*b,c);O(a,(e-d)*b,c,(e-.1)*b,0,(e+.1)*b,0);e=.7;O(a,(e+.1)*b,0,(e+d)*b,c,e*b,c);O(a,(e-d)*b,c,(e-.1)*b,0,(e+.1)*b,0);e=.9;O(a,(e+.1)*b,0,(e+d)*b,c,(e+.5*d)*b,c);b=a.o;v.q(a);return b},ACvoltageSource:function(a,b,c){a=v.s();var d=.5*$c;N(a,0*b,.5*c,!1);O(a,0*b,(.5-d)*c,(.5-d)*b,0*c,.5*b,0*c);O(a,(.5+d)*b,0*c,1*b,(.5-d)*c,1*b,.5*c);O(a,1*b,(.5+d)* +c,(.5+d)*b,1*c,.5*b,1*c);O(a,(.5-d)*b,1*c,0*b,(.5+d)*c,0*b,.5*c);a.moveTo(.1*b,.5*c);O(a,.5*b,0*c,.5*b,1*c,.9*b,.5*c);b=a.o;b.Jd=Vi;v.q(a);return b},DCvoltageSource:function(a,b,c){a=v.s();N(a,0,.75*c,!1);a.lineTo(0,.25*c);a.moveTo(1*b,0);a.lineTo(1*b,1*c);b=a.o;v.q(a);return b},Diode:function(a,b,c){a=v.s();N(a,1*b,0,!1);a.lineTo(1*b,.5*c);a.lineTo(0,1*c);a.lineTo(0,0);a.lineTo(1*b,.5*c);a.lineTo(1*b,1*c);b=a.o;b.B=new L(0,.25);b.C=new L(.5,.75);v.q(a);return b},Wifi:function(a,b,c){var d=b,e=c; +b*=.38;c*=.6;a=v.s();var f=.8*$c,h=.8,k=0,l=.5,d=(d-b)/2,e=(e-c)/2;N(a,k*b+d,(l+h)*c+e,!0);O(a,(k-f)*b+d,(l+h)*c+e,(k-h)*b+d,(l+f)*c+e,(k-h)*b+d,l*c+e);O(a,(k-h)*b+d,(l-f)*c+e,(k-f)*b+d,(l-h)*c+e,k*b+d,(l-h)*c+e);O(a,k*b+d,(l-h)*c+e,(k-h+.5*f)*b+d,(l-f)*c+e,(k-h+.5*f)*b+d,l*c+e);O(a,(k-h+.5*f)*b+d,(l+f)*c+e,k*b+d,(l+h)*c+e,k*b+d,(l+h)*c+e);P(a);f=.4*$c;h=.4;k=.2;l=.5;N(a,k*b+d,(l+h)*c+e,!0);O(a,(k-f)*b+d,(l+h)*c+e,(k-h)*b+d,(l+f)*c+e,(k-h)*b+d,l*c+e);O(a,(k-h)*b+d,(l-f)*c+e,(k-f)*b+d,(l-h)*c+e,k* +b+d,(l-h)*c+e);O(a,k*b+d,(l-h)*c+e,(k-h+.5*f)*b+d,(l-f)*c+e,(k-h+.5*f)*b+d,l*c+e);O(a,(k-h+.5*f)*b+d,(l+f)*c+e,k*b+d,(l+h)*c+e,k*b+d,(l+h)*c+e);P(a);f=.2*$c;h=.2;l=k=.5;N(a,(k-h)*b+d,l*c+e,!0);O(a,(k-h)*b+d,(l-f)*c+e,(k-f)*b+d,(l-h)*c+e,k*b+d,(l-h)*c+e);O(a,(k+f)*b+d,(l-h)*c+e,(k+h)*b+d,(l-f)*c+e,(k+h)*b+d,l*c+e);O(a,(k+h)*b+d,(l+f)*c+e,(k+f)*b+d,(l+h)*c+e,k*b+d,(l+h)*c+e);O(a,(k-f)*b+d,(l+h)*c+e,(k-h)*b+d,(l+f)*c+e,(k-h)*b+d,l*c+e);f=.4*$c;h=.4;k=.8;l=.5;N(a,k*b+d,(l-h)*c+e,!0);O(a,(k+f)*b+d,(l- +h)*c+e,(k+h)*b+d,(l-f)*c+e,(k+h)*b+d,l*c+e);O(a,(k+h)*b+d,(l+f)*c+e,(k+f)*b+d,(l+h)*c+e,k*b+d,(l+h)*c+e);O(a,k*b+d,(l+h)*c+e,(k+h-.5*f)*b+d,(l+f)*c+e,(k+h-.5*f)*b+d,l*c+e);O(a,(k+h-.5*f)*b+d,(l-f)*c+e,k*b+d,(l-h)*c+e,k*b+d,(l-h)*c+e);P(a);f=.8*$c;h=.8;k=1;l=.5;N(a,k*b+d,(l-h)*c+e,!0);O(a,(k+f)*b+d,(l-h)*c+e,(k+h)*b+d,(l-f)*c+e,(k+h)*b+d,l*c+e);O(a,(k+h)*b+d,(l+f)*c+e,(k+f)*b+d,(l+h)*c+e,k*b+d,(l+h)*c+e);O(a,k*b+d,(l+h)*c+e,(k+h-.5*f)*b+d,(l+f)*c+e,(k+h-.5*f)*b+d,l*c+e);O(a,(k+h-.5*f)*b+d,(l-f)*c+ +e,k*b+d,(l-h)*c+e,k*b+d,(l-h)*c+e);P(a);b=a.o;v.q(a);return b},Email:function(a,b,c){a=v.s();N(a,0,0,!0);a.lineTo(1*b,0);a.lineTo(1*b,1*c);a.lineTo(0,1*c);a.lineTo(0,0);P(a);N(a,0,0,!1);a.lineTo(.5*b,.6*c);a.lineTo(1*b,0);a.moveTo(0,1*c);a.lineTo(.45*b,.54*c);a.moveTo(1*b,1*c);a.lineTo(.55*b,.54*c);a.Ya(!1);b=a.o;v.q(a);return b},Ethernet:function(a,b,c){a=v.s();N(a,.35*b,0,!0);a.lineTo(.65*b,0);a.lineTo(.65*b,.4*c);a.lineTo(.35*b,.4*c);a.lineTo(.35*b,0);P(a);N(a,.1*b,1*c,!0,!0);a.lineTo(.4*b,1*c); +a.lineTo(.4*b,.6*c);a.lineTo(.1*b,.6*c);a.lineTo(.1*b,1*c);P(a);N(a,.6*b,1*c,!0,!0);a.lineTo(.9*b,1*c);a.lineTo(.9*b,.6*c);a.lineTo(.6*b,.6*c);a.lineTo(.6*b,1*c);P(a);N(a,0,.5*c,!1);a.lineTo(1*b,.5*c);a.moveTo(.5*b,.5*c);a.lineTo(.5*b,.4*c);a.moveTo(.75*b,.5*c);a.lineTo(.75*b,.6*c);a.moveTo(.25*b,.5*c);a.lineTo(.25*b,.6*c);a.Ya(!1);b=a.o;v.q(a);return b},Power:function(a,b,c){a=v.s();var d=.4*$c,e=.4,f=v.L(),h=v.L(),k=v.L(),l=v.L();$d(.5,.5-e,.5+d,.5-e,.5+e,.5-d,.5+e,.5,.5,f,f,h,k,l);var m=v.Mb(h.x, +h.y);N(a,h.x*b,h.y*c,!0);O(a,k.x*b,k.y*c,l.x*b,l.y*c,(.5+e)*b,.5*c);O(a,(.5+e)*b,(.5+d)*c,(.5+d)*b,(.5+e)*c,.5*b,(.5+e)*c);O(a,(.5-d)*b,(.5+e)*c,(.5-e)*b,(.5+d)*c,(.5-e)*b,.5*c);$d(.5-e,.5,.5-e,.5-d,.5-d,.5-e,.5,.5-e,.5,k,l,h,f,f);O(a,k.x*b,k.y*c,l.x*b,l.y*c,h.x*b,h.y*c);d=.3*$c;e=.3;$d(.5-e,.5,.5-e,.5-d,.5-d,.5-e,.5,.5-e,.5,k,l,h,f,f);a.lineTo(h.x*b,h.y*c);O(a,l.x*b,l.y*c,k.x*b,k.y*c,(.5-e)*b,.5*c);O(a,(.5-e)*b,(.5+d)*c,(.5-d)*b,(.5+e)*c,.5*b,(.5+e)*c);O(a,(.5+d)*b,(.5+e)*c,(.5+e)*b,(.5+d)*c,(.5+ +e)*b,.5*c);$d(.5,.5-e,.5+d,.5-e,.5+e,.5-d,.5+e,.5,.5,f,f,h,k,l);O(a,l.x*b,l.y*c,k.x*b,k.y*c,h.x*b,h.y*c);P(a);N(a,.45*b,0,!0);a.lineTo(.45*b,.5*c);a.lineTo(.55*b,.5*c);a.lineTo(.55*b,0);P(a);v.v(f);v.v(h);v.v(k);v.v(l);v.v(m);b=a.o;b.B=new L(.25,.55);b.C=new L(.75,.8);v.q(a);return b},Fallout:function(a,b,c){a=v.s();var d=.5*$c;N(a,0*b,.5*c,!0);O(a,0*b,(.5-d)*c,(.5-d)*b,0*c,.5*b,0*c);O(a,(.5+d)*b,0*c,1*b,(.5-d)*c,1*b,.5*c);O(a,1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);O(a,(.5-d)*b,1*c,0*b,(.5+d)*c,0*b, +.5*c);var e=d=0;N(a,(.3+d)*b,(.8+e)*c,!0,!0);a.lineTo((.5+d)*b,(.5+e)*c);a.lineTo((.1+d)*b,(.5+e)*c);a.lineTo((.3+d)*b,(.8+e)*c);d=.4;e=0;P(a);N(a,(.3+d)*b,(.8+e)*c,!0,!0);a.lineTo((.5+d)*b,(.5+e)*c);a.lineTo((.1+d)*b,(.5+e)*c);a.lineTo((.3+d)*b,(.8+e)*c);d=.2;e=-.3;P(a);N(a,(.3+d)*b,(.8+e)*c,!0,!0);a.lineTo((.5+d)*b,(.5+e)*c);a.lineTo((.1+d)*b,(.5+e)*c);a.lineTo((.3+d)*b,(.8+e)*c);P(a);b=a.o;b.Jd=Vi;v.q(a);return b},IrritationHazard:function(a,b,c){a=v.s();N(a,.2*b,0*c,!0);a.lineTo(.5*b,.3*c);a.lineTo(.8* +b,0*c);a.lineTo(1*b,.2*c);a.lineTo(.7*b,.5*c);a.lineTo(1*b,.8*c);a.lineTo(.8*b,1*c);a.lineTo(.5*b,.7*c);a.lineTo(.2*b,1*c);a.lineTo(0*b,.8*c);a.lineTo(.3*b,.5*c);a.lineTo(0*b,.2*c);P(a);b=a.o;b.B=new L(.3,.3);b.C=new L(.7,.7);v.q(a);return b},ElectricalHazard:function(a,b,c){a=v.s();N(a,.37*b,0*c,!0);a.lineTo(.5*b,.11*c);a.lineTo(.77*b,.04*c);a.lineTo(.33*b,.49*c);a.lineTo(1*b,.37*c);a.lineTo(.63*b,.86*c);a.lineTo(.77*b,.91*c);a.lineTo(.34*b,1*c);a.lineTo(.34*b,.78*c);a.lineTo(.44*b,.8*c);a.lineTo(.65* +b,.56*c);a.lineTo(0*b,.68*c);P(a);b=a.o;v.q(a);return b},FireHazard:function(a,b,c){a=v.s();N(a,.1*b,1*c,!0);O(a,-.25*b,.63*c,.45*b,.44*c,.29*b,0*c);O(a,.48*b,.17*c,.54*b,.35*c,.51*b,.42*c);O(a,.59*b,.29*c,.58*b,.28*c,.59*b,.18*c);O(a,.8*b,.34*c,.88*b,.43*c,.75*b,.6*c);O(a,.87*b,.48*c,.88*b,.43*c,.88*b,.31*c);O(a,1.17*b,.76*c,.82*b,.8*c,.9*b,1*c);P(a);b=a.o;b.B=new L(.05,.645);b.C=new L(.884,.908);v.q(a);return b},BpmnActivityLoop:function(a,b,c){a=v.s();var d=4*(Math.SQRT2-1)/3*.5;N(a,.65*b,1*c, +!1);O(a,(1-d+0)*b,1*c,1*b,(.5+d+0)*c,1*b,.5*c);O(a,1*b,(.5-d+0)*c,(.5+d+0)*b,0*c,.5*b,0*c);O(a,(.5-d+0)*b,0*c,0*b,(.5-d+0)*c,0*b,.5*c);O(a,0*b,(.5+d+0)*c,(.5-d+0)*b,1*c,.35*b,.98*c);a.moveTo(.25*b,.8*c);a.lineTo(.35*b,1*c);a.lineTo(.1*b,1*c);b=a.o;v.q(a);return b},BpmnActivityParallel:function(a,b,c){a=v.s();N(a,0,0,!1);a.lineTo(0,1*c);a.moveTo(.5*b,0);a.lineTo(.5*b,1*c);a.moveTo(1*b,0);a.lineTo(1*b,1*c);b=a.o;v.q(a);return b},BpmnActivitySequential:function(a,b,c){a=v.s();N(a,0,0,!1);a.lineTo(1* +b,0);a.moveTo(0,.5*c);a.lineTo(1*b,.5*c);a.moveTo(0,1*c);a.lineTo(1*b,1*c);b=a.o;v.q(a);return b},BpmnActivityAdHoc:function(a,b,c){a=v.s();N(a,0,0,!1);N(a,1*b,1*c,!1);N(a,0,.5*c,!1);O(a,.2*b,.35*c,.3*b,.35*c,.5*b,.5*c);O(a,.7*b,.65*c,.8*b,.65*c,1*b,.5*c);b=a.o;v.q(a);return b},BpmnActivityCompensation:function(a,b,c){a=v.s();N(a,0,.5*c,!0);a.lineTo(.5*b,0);a.lineTo(.5*b,.5*c);a.lineTo(1*b,1*c);a.lineTo(1*b,0);a.lineTo(.5*b,.5*c);a.lineTo(.5*b,1*c);P(a);b=a.o;v.q(a);return b},BpmnTaskMessage:function(a, +b,c){a=v.s();N(a,0,.2*c,!0);a.lineTo(1*b,.2*c);a.lineTo(1*b,.8*c);a.lineTo(0,.8*c);a.lineTo(0,.8*c);P(a);N(a,0,.2*c,!1);a.lineTo(.5*b,.5*c);a.lineTo(1*b,.2*c);a.Ya(!1);b=a.o;v.q(a);return b},BpmnTaskScript:function(a,b,c){a=v.s();N(a,.7*b,1*c,!0);a.lineTo(.3*b,1*c);O(a,.6*b,.5*c,0,.5*c,.3*b,0);a.lineTo(.7*b,0);O(a,.4*b,.5*c,1*b,.5*c,.7*b,1*c);P(a);N(a,.45*b,.73*c,!1);a.lineTo(.7*b,.73*c);a.moveTo(.38*b,.5*c);a.lineTo(.63*b,.5*c);a.moveTo(.31*b,.27*c);a.lineTo(.56*b,.27*c);a.Ya(!1);b=a.o;v.q(a);return b}, +BpmnTaskUser:function(a,b,c){a=v.s();N(a,0,0,!1);N(a,.335*b,(1-.555)*c,!0);a.lineTo(.335*b,.595*c);a.lineTo(.665*b,.595*c);a.lineTo(.665*b,(1-.555)*c);O(a,.88*b,.46*c,.98*b,.54*c,1*b,.68*c);a.lineTo(1*b,1*c);a.lineTo(0,1*c);a.lineTo(0,.68*c);O(a,.02*b,.54*c,.12*b,.46*c,.335*b,(1-.555)*c);a.lineTo(.365*b,.405*c);var d=.5-.285,e=Math.PI/4,f=4*(1-Math.cos(e))/(3*Math.sin(e)),e=f*d,f=f*d;O(a,(.5-(e+d)/2)*b,(d+(d+f)/2)*c,(.5-d)*b,(d+f)*c,(.5-d)*b,d*c);O(a,(.5-d)*b,(d-f)*c,(.5-e)*b,(d-d)*c,.5*b,(d-d)*c); +O(a,(.5+e)*b,(d-d)*c,(.5+d)*b,(d-f)*c,(.5+d)*b,d*c);O(a,(.5+d)*b,(d+f)*c,(.5+(e+d)/2)*b,(d+(d+f)/2)*c,.635*b,.405*c);a.lineTo(.635*b,.405*c);a.lineTo(.665*b,(1-.555)*c);a.lineTo(.665*b,.595*c);a.lineTo(.335*b,.595*c);N(a,.2*b,1*c,!1);a.lineTo(.2*b,.8*c);N(a,.8*b,1*c,!1);a.lineTo(.8*b,.8*c);b=a.o;v.q(a);return b},BpmnEventConditional:function(a,b,c){a=v.s();N(a,.1*b,0,!0);a.lineTo(.9*b,0);a.lineTo(.9*b,1*c);a.lineTo(.1*b,1*c);P(a);N(a,.2*b,.2*c,!1);a.lineTo(.8*b,.2*c);a.moveTo(.2*b,.4*c);a.lineTo(.8* +b,.4*c);a.moveTo(.2*b,.6*c);a.lineTo(.8*b,.6*c);a.moveTo(.2*b,.8*c);a.lineTo(.8*b,.8*c);a.Ya(!1);b=a.o;v.q(a);return b},BpmnEventError:function(a,b,c){a=v.s();N(a,0,1*c,!0);a.lineTo(.33*b,0);a.lineTo(.66*b,.5*c);a.lineTo(1*b,0);a.lineTo(.66*b,1*c);a.lineTo(.33*b,.5*c);P(a);b=a.o;v.q(a);return b},BpmnEventEscalation:function(a,b,c){a=v.s();N(a,0,0,!1);N(a,1*b,1*c,!1);N(a,.1*b,1*c,!0);a.lineTo(.5*b,0);a.lineTo(.9*b,1*c);a.lineTo(.5*b,.5*c);P(a);b=a.o;v.q(a);return b},BpmnEventTimer:function(a,b,c){a= +v.s();var d=.5*$c;N(a,1*b,.5*c,!0);O(a,1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);O(a,(.5-d)*b,1*c,0,(.5+d)*c,0,.5*c);O(a,0,(.5-d)*c,(.5-d)*b,0,.5*b,0);O(a,(.5+d)*b,0,1*b,(.5-d)*c,1*b,.5*c);N(a,.5*b,0,!1);a.lineTo(.5*b,.15*c);a.moveTo(.5*b,1*c);a.lineTo(.5*b,.85*c);a.moveTo(0,.5*c);a.lineTo(.15*b,.5*c);a.moveTo(1*b,.5*c);a.lineTo(.85*b,.5*c);a.moveTo(.5*b,.5*c);a.lineTo(.58*b,.1*c);a.moveTo(.5*b,.5*c);a.lineTo(.78*b,.54*c);a.Ya(!1);b=a.o;b.Jd=Vi;v.q(a);return b}},bp;for(bp in qo)qo[bp.toLowerCase()]=bp; +var cp={"":"",Standard:"F1 m 0,0 l 8,4 -8,4 2,-4 z",Backward:"F1 m 8,0 l -2,4 2,4 -8,-4 z",Triangle:"F1 m 0,0 l 8,4.62 -8,4.62 z",BackwardTriangle:"F1 m 8,4 l 0,4 -8,-4 8,-4 0,4 z",Boomerang:"F1 m 0,0 l 8,4 -8,4 4,-4 -4,-4 z",BackwardBoomerang:"F1 m 8,0 l -8,4 8,4 -4,-4 4,-4 z",SidewaysV:"m 0,0 l 8,4 -8,4 0,-1 6,-3 -6,-3 0,-1 z",BackwardV:"m 8,0 l -8,4 8,4 0,-1 -6,-3 6,-3 0,-1 z",OpenTriangle:"m 0,0 l 8,4 -8,4",BackwardOpenTriangle:"m 8,0 l -8,4 8,4",OpenTriangleLine:"m 0,0 l 8,4 -8,4 m 8.5,0 l 0,-8", +BackwardOpenTriangleLine:"m 8,0 l -8,4 8,4 m -8.5,0 l 0,-8",OpenTriangleTop:"m 0,0 l 8,4 m 0,4",BackwardOpenTriangleTop:"m 8,0 l -8,4 m 0,4",OpenTriangleBottom:"m 0,8 l 8,-4",BackwardOpenTriangleBottom:"m 0,4 l 8,4",HalfTriangleTop:"F1 m 0,0 l 0,4 8,0 z m 0,8",BackwardHalfTriangleTop:"F1 m 8,0 l 0,4 -8,0 z m 0,8",HalfTriangleBottom:"F1 m 0,4 l 0,4 8,-4 z",BackwardHalfTriangleBottom:"F1 m 8,4 l 0,4 -8,-4 z",ForwardSemiCircle:"m 4,0 b 270 180 0 4 4",BackwardSemiCircle:"m 4,8 b 90 180 0 -4 4",Feather:"m 0,0 l 3,4 -3,4", +BackwardFeather:"m 3,0 l -3,4 3,4",DoubleFeathers:"m 0,0 l 3,4 -3,4 m 3,-8 l 3,4 -3,4",BackwardDoubleFeathers:"m 3,0 l -3,4 3,4 m 3,-8 l -3,4 3,4",TripleFeathers:"m 0,0 l 3,4 -3,4 m 3,-8 l 3,4 -3,4 m 3,-8 l 3,4 -3,4",BackwardTripleFeathers:"m 3,0 l -3,4 3,4 m 3,-8 l -3,4 3,4 m 3,-8 l -3,4 3,4",ForwardSlash:"m 0,8 l 5,-8",BackSlash:"m 0,0 l 5,8",DoubleForwardSlash:"m 0,8 l 4,-8 m -2,8 l 4,-8",DoubleBackSlash:"m 0,0 l 4,8 m -2,-8 l 4,8",TripleForwardSlash:"m 0,8 l 4,-8 m -2,8 l 4,-8 m -2,8 l 4,-8", +TripleBackSlash:"m 0,0 l 4,8 m -2,-8 l 4,8 m -2,-8 l 4,8",Fork:"m 0,4 l 8,0 m -8,0 l 8,-4 m -8,4 l 8,4",BackwardFork:"m 8,4 l -8,0 m 8,0 l -8,-4 m 8,4 l -8,4",LineFork:"m 0,0 l 0,8 m 0,-4 l 8,0 m -8,0 l 8,-4 m -8,4 l 8,4",BackwardLineFork:"m 8,4 l -8,0 m 8,0 l -8,-4 m 8,4 l -8,4 m 8,-8 l 0,8",CircleFork:"F1 m 6,4 b 0 360 -3 0 3 z m 0,0 l 6,0 m -6,0 l 6,-4 m -6,4 l 6,4",BackwardCircleFork:"F1 m 0,4 l 6,0 m -6,-4 l 6,4 m -6,4 l 6,-4 m 6,0 b 0 360 -3 0 3",CircleLineFork:"F1 m 6,4 b 0 360 -3 0 3 z m 1,-4 l 0,8 m 0,-4 l 6,0 m -6,0 l 6,-4 m -6,4 l 6,4", +BackwardCircleLineFork:"F1 m 0,4 l 6,0 m -6,-4 l 6,4 m -6,4 l 6,-4 m 0,-4 l 0,8 m 7,-4 b 0 360 -3 0 3",Circle:"F1 m 8,4 b 0 360 -4 0 4 z",Block:"F1 m 0,0 l 0,8 8,0 0,-8 z",StretchedDiamond:"F1 m 0,3 l 5,-3 5,3 -5,3 -5,-3 z",Diamond:"F1 m 0,4 l 4,-4 4,4 -4,4 -4,-4 z",Chevron:"F1 m 0,0 l 5,0 3,4 -3,4 -5,0 3,-4 -3,-4 z",StretchedChevron:"F1 m 0,0 l 8,0 3,4 -3,4 -8,0 3,-4 -3,-4 z",NormalArrow:"F1 m 0,2 l 4,0 0,-2 4,4 -4,4 0,-2 -4,0 z",X:"m 0,0 l 8,8 m 0,-8 l -8,8",TailedNormalArrow:"F1 m 0,0 l 2,0 1,2 3,0 0,-2 2,4 -2,4 0,-2 -3,0 -1,2 -2,0 1,-4 -1,-4 z", +DoubleTriangle:"F1 m 0,0 l 4,4 -4,4 0,-8 z m 4,0 l 4,4 -4,4 0,-8 z",BigEndArrow:"F1 m 0,0 l 5,2 0,-2 3,4 -3,4 0,-2 -5,2 0,-8 z",ConcaveTailArrow:"F1 m 0,2 h 4 v -2 l 4,4 -4,4 v -2 h -4 l 2,-2 -2,-2 z",RoundedTriangle:"F1 m 0,1 a 1,1 0 0 1 1,-1 l 7,3 a 0.5,1 0 0 1 0,2 l -7,3 a 1,1 0 0 1 -1,-1 l 0,-6 z",SimpleArrow:"F1 m 1,2 l -1,-2 2,0 1,2 -1,2 -2,0 1,-2 5,0 0,-2 2,2 -2,2 0,-2 z",AccelerationArrow:"F1 m 0,0 l 0,8 0.2,0 0,-8 -0.2,0 z m 2,0 l 0,8 1,0 0,-8 -1,0 z m 3,0 l 2,0 2,4 -2,4 -2,0 0,-8 z",BoxArrow:"F1 m 0,0 l 4,0 0,2 2,0 0,-2 2,4 -2,4 0,-2 -2,0 0,2 -4,0 0,-8 z", +TriangleLine:"F1 m 8,4 l -8,-4 0,8 8,-4 z m 0.5,4 l 0,-8",CircleEndedArrow:"F1 m 10,4 l -2,-3 0,2 -2,0 0,2 2,0 0,2 2,-3 z m -4,0 b 0 360 -3 0 3 z",DynamicWidthArrow:"F1 m 0,3 l 2,0 2,-1 2,-2 2,4 -2,4 -2,-2 -2,-1 -2,0 0,-2 z",EquilibriumArrow:"m 0,3 l 8,0 -3,-3 m 3,5 l -8,0 3,3",FastForward:"F1 m 0,0 l 3.5,4 0,-4 3.5,4 0,-4 1,0 0,8 -1,0 0,-4 -3.5,4 0,-4 -3.5,4 0,-8 z",Kite:"F1 m 0,4 l 2,-4 6,4 -6,4 -2,-4 z",HalfArrowTop:"F1 m 0,0 l 4,4 4,0 -8,-4 z m 0,8",HalfArrowBottom:"F1 m 0,8 l 4,-4 4,0 -8,4 z", +OpposingDirectionDoubleArrow:"F1 m 0,4 l 2,-4 0,2 4,0 0,-2 2,4 -2,4 0,-2 -4,0 0,2 -2,-4 z",PartialDoubleTriangle:"F1 m 0,0 4,3 0,-3 4,4 -4,4 0,-3 -4,3 0,-8 z",LineCircle:"F1 m 0,0 l 0,8 m 7 -4 b 0 360 -3 0 3 z",DoubleLineCircle:"F1 m 0,0 l 0,8 m 2,-8 l 0,8 m 7 -4 b 0 360 -3 0 3 z",TripleLineCircle:"F1 m 0,0 l 0,8 m 2,-8 l 0,8 m 2,-8 l 0,8 m 7 -4 b 0 360 -3 0 3 z",CircleLine:"F1 m 6 4 b 0 360 -3 0 3 z m 1,-4 l 0,8",DiamondCircle:"F1 m 8,4 l -4,4 -4,-4 4,-4 4,4 m 8,0 b 0 360 -4 0 4 z",PlusCircle:"F1 m 8,4 b 0 360 -4 0 4 l -8 0 z m -4 -4 l 0 8", +OpenRightTriangleTop:"m 8,0 l 0,4 -8,0 m 0,4",OpenRightTriangleBottom:"m 8,8 l 0,-4 -8,0",Line:"m 0,0 l 0,8",DoubleLine:"m 0,0 l 0,8 m 2,0 l 0,-8",TripleLine:"m 0,0 l 0,8 m 2,0 l 0,-8 m 2,0 l 0,8",PentagonArrow:"F1 m 8,4 l -4,-4 -4,0 0,8 4,0 4,-4 z"}; +function uo(a){if(null!==cp){for(var b in cp){var c=$e(cp[b],!1);Jd[b]=c;b.toLowerCase()!==b&&(Jd[b.toLowerCase()]=b)}cp=null}b=Jd[a];if(void 0===b){b=a.toLowerCase();if("none"===b)return"None";b=Jd[b]}return"string"===typeof b?b:b instanceof ve?a:null} +function R(a){0===arguments.length?D.call(this):D.call(this,a);this.Q=311807;this.Kk=this.ei="";this.Yr=this.Vr=this.hs=this.dr=null;this.ks="";this.ci=this.js=this.om=null;this.Xr="";this.mo=null;this.Wr=Ed;this.Zr="";this.no=null;this.me="";this.lv=this.fq=this.vk=null;this.xi=(new z(NaN,NaN)).freeze();this.ir="";this.Pk=null;this.jr=rb;this.sr=nd;this.lr=od;this.yq=null;this.er=dp;this.qm=md;this.pm="gray";this.og=4;this.aC=-1;this.Ms=NaN;this.BF=new A;this.dm=null;this.Aj=NaN}v.Ja(R,D); +v.ea("Part",R);R.prototype.cloneProtected=function(a){D.prototype.cloneProtected.call(this,a);a.Q=this.Q&-4097|49152;a.ei=this.ei;a.Kk=this.Kk;a.dr=this.dr;a.hs=this.hs;a.Vr=this.Vr;a.Yr=this.Yr;a.ks=this.ks;a.js=this.js;a.ci=null;a.Xr=this.Xr;a.Wr=this.Wr.S();a.Zr=this.Zr;a.me=this.me;a.fq=this.fq;a.xi.assign(this.xi);a.ir=this.ir;a.jr=this.jr.S();a.sr=this.sr.S();a.lr=this.lr.S();a.yq=this.yq;a.er=this.er;a.qm=this.qm.S();a.pm=this.pm;a.og=this.og;a.Ms=this.Ms}; +R.prototype.Wh=function(a){D.prototype.Wh.call(this,a);a.rl();a.om=null;a.mo=null;a.no=null;a.Pk=null;a.dm=null};R.prototype.toString=function(){var a=v.af(Object.getPrototypeOf(this))+"#"+v.ld(this);null!==this.data&&(a+="("+Ef(this.data)+")");return a};R.LayoutNone=0;var ol;R.LayoutAdded=ol=1;var wl;R.LayoutRemoved=wl=2;R.LayoutShown=4;R.LayoutHidden=8;R.LayoutNodeSized=16;var $l;R.LayoutGroupLayout=$l=32;R.LayoutNodeReplaced=64;var dp;R.LayoutStandard=dp=ol|wl|28|$l|64;R.LayoutAll=16777215; +R.prototype.Ym=function(a,b,c,d,e,f,h){var k=this.g;null!==k&&(a===Cf&&"elements"===b?e instanceof D?pl(e,function(a){rl(k,a);ql(k,a)}):e instanceof ok&&Ml(k,e):a===Df&&"elements"===b&&(e instanceof D?pl(e,function(a){vl(k,a);ul(k,a)}):e instanceof ok&&Nl(k,e)),k.Lc(a,b,c,d,e,f,h))};R.prototype.updateTargetBindings=R.prototype.Hb=function(a){D.prototype.Hb.call(this,a);if(null!==this.data){a=this.ya.n;for(var b=a.length,c=0;c<b;c++){var d=a[c];d instanceof D&&pl(d,function(a){null!==a.data&&a.Hb()})}}}; +R.prototype.updateRelationshipsFromData=function(){var a=this.data;if(null!==a){var b=this.g;if(null!==b){var c=b.ba;if(c instanceof Q){var d=c.Mm(a),b=b.RG(d),e=this.Sa;b!==e&&(b=null!==e?c.gb(e.data):void 0,e=c.tp,"function"===typeof e?e(a,b):a[e]=b,c.mx(a,d))}}}};v.u(R,{gw:"adornments"},function(){return null===this.ci?xa:this.ci.oE});R.prototype.findAdornment=R.prototype.So=function(a){var b=this.ci;return null===b?null:b.ja(a)}; +R.prototype.addAdornment=R.prototype.Yk=function(a,b){if(null!==b){var c=null,d=this.ci;null!==d&&(c=d.ja(a));if(c!==b){if(null!==c){var e=c.g;null!==e&&e.remove(c)}null===d&&(this.ci=d=new na("string",Vg));b.ei!==a&&(b.fc=a);d.add(a,b);c=this.g;null!==c&&(c.add(b),b.data=this.data)}}};R.prototype.removeAdornment=R.prototype.bj=function(a){var b=this.ci;if(null!==b){var c=b.ja(a);if(null!==c){var d=c.g;null!==d&&d.remove(c)}b.remove(a);0===b.count&&(this.ci=null)}}; +R.prototype.clearAdornments=R.prototype.Vs=function(){var a=this.ci;if(null!==a){for(var b=v.jb(),a=a.i;a.next();)b.push(a.key);for(var a=b.length,c=0;c<a;c++)this.bj(b[c]);v.sa(b)}}; +R.prototype.updateAdornments=function(){var a=this.g;if(null!==a){a:{if(this.hb&&this.tI){var b=this.Wt;if(!(null!==b&&this.U.G()&&this.isVisible()&&b.Zi()&&b.U.G()))break a;var c=this.So("Selection");if(null===c){c=this.uI;null===c&&(c=this instanceof W?a.GH:this instanceof V?a.cH:a.XH);if(!(c instanceof Vg))break a;Xg(c);c=c.copy();null!==c&&(c.fc="Selection",c.Zb=b)}if(null!==c){var d=c.placeholder;if(null!==d){var e=b.Ti(),f=0;b instanceof Y&&(f=b.lb);var h=v.Fl();h.m((b.Ha.width+f)*e,(b.Ha.height+ +f)*e);d.za=h;v.$j(h)}c.angle=b.ol();c.type!==Di&&(d=v.L(),c.location=b.Xa(rb,d),v.v(d));this.Yk("Selection",c);break a}}this.bj("Selection")}ep(this,a);for(a=this.gw;a.next();)b=a.value,b.Hb(),b.N()}};function ep(a,b){b.Za.Pe.each(function(b){b.isEnabled&&b.updateAdornments(a)});b.Za.updateAdornments(a)}v.u(R,{layer:"layer"},function(){return this.lv});v.u(R,{g:"diagram"},function(){var a=this.lv;return null!==a?a.g:null}); +v.defineProperty(R,{Tf:"layerName"},function(){return this.Kk},function(a){var b=this.Kk;if(b!==a){v.j(a,"string",R,"layerName");var c=this.g;if(null===c||null!==c.et(a)&&!c.Qp)if(this.Kk=a,null!==c&&c.qc(),this.h("layerName",b,a),b=this.layer,null!==b&&b.name!==a&&(c=b.g,null!==c&&(a=c.et(a),null!==a&&a!==b))){var d=b.Ne(-1,this,!0);0<=d&&c.Lc(Df,"parts",b,this,null,d,!0);b.visible!==a.visible&&this.nd(a.visible);d=a.cp(99999999,this,!0);0<=d&&c.Lc(Cf,"parts",a,null,this,!0,d);d=this.zt;if(null!== +d){var e=c.Ra;c.Ra=!0;d(this,b,a);c.Ra=e}}}});v.defineProperty(R,{zt:"layerChanged"},function(){return this.dr},function(a){var b=this.dr;b!==a&&(null!==a&&v.j(a,"function",R,"layerChanged"),this.dr=a,this.h("layerChanged",b,a))});v.defineProperty(R,{hn:"zOrder"},function(){return this.Ms},function(a){var b=this.Ms;if(b!==a){v.j(a,"number",R,"zOrder");this.Ms=a;var c=this.layer;null!==c&&fk(c,-1,this);this.h("zOrder",b,a);a=this.g;null!==a&&a.pa()}}); +R.prototype.invalidateAdornments=R.prototype.Nd=function(){var a=this.g;null!==a&&(Bk(a),0!==(this.Q&16384)!==!0&&(this.Q|=16384,a.ue()))};function bk(a){0!==(a.Q&16384)!==!1&&(a.updateAdornments(),a.Q&=-16385)}function Ym(a){if(!1===hl(a)){var b=a.g;null!==b&&(b.fg.add(a),a instanceof S&&!b.la.ib&&a.cf(),b.ue());fp(a,!0);a.si()}}function gp(a){if(!1!==hl(a)){var b=a.position,c=a.location;c.G()&&b.G()||hp(a,b,c);var c=a.mc,d=c.copy();c.Oa();c.x=b.x;c.y=b.y;c.freeze();a.Uw(d,c);fp(a,!1)}} +v.u(R,{bc:"locationObject"},function(){if(null===this.Pk){var a=this.Kz;""!==a?(a=this.be(a),this.Pk=null!==a?a:this):this.Pk=this instanceof Vg?this.type!==Di&&null!==this.placeholder?this.placeholder:this:this}return this.Pk.visible?this.Pk:this});v.defineProperty(R,{QH:"minLocation"},function(){return this.sr},function(a){var b=this.sr;b.K(a)||(this.sr=a=a.S(),this.h("minLocation",b,a))}); +v.defineProperty(R,{LH:"maxLocation"},function(){return this.lr},function(a){var b=this.lr;b.K(a)||(this.lr=a=a.S(),this.h("maxLocation",b,a))});v.defineProperty(R,{Kz:"locationObjectName"},function(){return this.ir},function(a){var b=this.ir;b!==a&&(this.ir=a,this.Pk=null,Sm(this),this.h("locationObjectName",b,a))});v.defineProperty(R,{ef:"locationSpot"},function(){return this.jr},function(a){var b=this.jr;b.K(a)||(this.jr=a=a.S(),Sm(this),this.h("locationSpot",b,a))}); +R.prototype.move=function(a){this.position=a};R.prototype.moveTo=R.prototype.moveTo=function(a,b){var c=v.Mb(a,b);this.move(c);v.v(c)};R.prototype.isVisible=function(){if(!this.visible)return!1;var a=this.layer;if(null!==a&&!a.visible)return!1;a=this.g;if(null!==a&&(a=a.Na,a.df&&(a=a.fm.ja(this),null!==a&&a.bx)))return!0;a=this.Sa;return null===a||a.ee&&a.isVisible()?!0:!1}; +R.prototype.nd=function(a){var b=this.g;a?(this.H(4),this.Nd(),null!==b&&b.fg.add(this)):(this.H(8),this.Vs());this.rl();null!==b&&(b.qc(),b.pa())}; +R.prototype.findObject=R.prototype.be=function(a){if(this.name===a)return this;var b=this.dm;null===b&&(this.dm=b=new ta);if(void 0!==b[a])return b[a];for(var c=this.ya.n,d=c.length,e=0;e<d;e++){var f=c[e];if(f.name===a)return b[a]=f;if(f instanceof D)if(null===f.vj&&null===f.hg){if(f=f.be(a),null!==f)return b[a]=f}else if(Kl(f)&&(f=f.ya.first(),null!==f&&f.name===a))return b[a]=f}return b[a]=null}; +function ip(a,b,c,d){void 0===d&&(d=new z);c=c.se()?zb:c;var e=b.Ha;d.m(e.width*c.x+c.offsetX,e.height*c.y+c.offsetY);if(null===b||b===a)return d;b.transform.ub(d);for(b=b.R;null!==b&&b!==a;)b.transform.ub(d),b=b.R;a.Ok.ub(d);d.offset(-a.jd.x,-a.jd.y);return d}R.prototype.ensureBounds=R.prototype.sf=function(){lj(this,Infinity,Infinity);this.Ec()}; +function ek(a,b){var c=a.BF,d;isNaN(a.Aj)&&(a.Aj=io(a));d=a.Aj;var e=2*d;if(!a.wl)return c.m(b.x-1-d,b.y-1-d,b.width+2+e,b.height+2+e),c;d=b.x;var e=b.y,f=b.width,h=b.height,k=a.shadowBlur,l=a.zI,f=f+k,h=h+k;d-=k/2;e-=k/2;0<l.x?f+=l.x:(d+=l.x,f-=l.x);0<l.y?h+=l.y:(e+=l.y,h-=l.y);c.m(d-1,e-1,f+2,h+2);return c} +R.prototype.Ec=function(){this.si();if(!1===gl(this))gp(this);else{var a=this.mc,b=v.ag();b.assign(a);a.Oa();var c=ak(this);this.Ni(0,0,this.jd.width,this.jd.height);var d=this.position;hp(this,d,this.location);a.x=d.x;a.y=d.y;a.freeze();this.Uw(b,a);Im(this,!1);b.K(a)?this.yf(c):!this.Od()||K(b.width,a.width)&&K(b.height,a.height)||0<=this.aC&&this.H(16);v.Vb(b);fp(this,!1)}}; +R.prototype.Uw=function(a,b){var c=this.g;if(null!==c){var d=!1;if(!1===c.sj&&a.G()){var e=c.Zd,f=c.padding,h=e.x+f.left,k=e.y+f.top,l=e.width-2*f.right,e=e.height-2*f.bottom;a.x>h&&a.y>k&&a.right<l&&a.bottom<e&&b.x>h&&b.y>k&&b.right<l&&b.bottom<e&&(d=!0)}0!==(this.Q&65536)!==!0&&a.K(b)||sl(this,d,c);c.pa();a.K(b)||this.rl()}}; +v.defineProperty(R,{location:"location"},function(){return this.xi},function(a){var b=this.xi;if(!b.K(a)){a=a.S();var c;c=a;if(this instanceof W)c=!1;else{this.xi=c;if(!1===gl(this)){Ym(this);var d=this.kb;if(d.G()){var e=d.copy();d.m(d.x+(c.x-b.x),d.y+(c.y-b.y));jp(this,this.g,d,e);this.h("position",e,d)}}c=!0}c&&this.h("location",b,a)}}); +R.prototype.oA=function(a,b){if(this instanceof W||!a.G())return!1;var c=this.g;if(null!==c&&(jp(this,c,a,b),!0===c.la.ib))return!0;this.kb=a;c=this.xi;if(c.G()){var d=c.copy();c.m(c.x+(a.x-b.x),c.y+(a.y-b.y));this.h("location",d,c)}!1===hl(this)&&!1===gl(this)&&(Ym(this),gp(this));return!0};function jp(a,b,c,d){null===b||a instanceof Vg||(b=b.Na,b.pc&&Oj(b,a,"position",d.copy(),c.copy(),!1))} +R.prototype.ox=function(a,b){var c=this.xi,d=this.kb;hl(this)||gl(this)?c.m(NaN,NaN):c.m(c.x+a-d.x,c.y+b-d.y);d.m(a,b);Ym(this)}; +function hp(a,b,c){var d=v.L(),e=a.ef,f=a.bc;e.se()&&v.k("determineOffset: Part's locationSpot must be real: "+e.toString());var h=f.Ha,k=f instanceof Y?f.lb:0;d.$t(0,0,h.width+k,h.height+k,e);if(f!==a)for(d.offset(-k/2,-k/2),f.transform.ub(d),e=f.R;null!==e&&e!==a;)e.transform.ub(d),e=e.R;a.Ok.ub(d);d.offset(-a.jd.x,-a.jd.y);e=a.g;c.G()?(f=b.x,h=b.y,b.m(c.x-d.x,c.y-d.y),null!==e&&(c=e.Na,(k=c.tj)||!c.pc||a instanceof Vg||Oj(c,a,"position",new z(f,h),b,!1),k||b.x===f&&b.y===h||(k=e.tb,e.tb=!0,a.h("position", +new z(f,h),b),e.tb=k))):b.G()&&(f=c.copy(),c.m(b.x+d.x,b.y+d.y),c.K(f)||null===e||(k=e.tb,e.tb=!0,a.h("location",f,c),e.tb=k));v.v(d);a.si()}function sl(a,b,c){Jm(a,!1);a instanceof S&&hm(c,a);a.layer.Gc||b||c.qc();b=a.mc;var d=c.rb;d.G()?(ak(a)?Za(b,d)||a.yf(!1):b.yg(d)&&a.yf(!0),a.updateAdornments()):c.Fk=!0}R.prototype.vl=function(){return!0}; +function ck(a,b){var c=a.mc;if(0!==c.width&&0!==c.height&&!isNaN(c.x)&&!isNaN(c.y)&&a.isVisible()){var d=a.transform;null!==a.nc&&(Om(a,b,a.nc,!0,!0),b.fillRect(c.x,c.y,c.width,c.height));null===a.nc&&null===a.Ib&&(Om(a,b,"rgba(0,0,0,0.4)",!0,!1),b.fillRect(c.x,c.y,c.width,c.height));null!==a.Ib&&(d.vt()||b.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy),c=a.Ha,Om(a,b,a.Ib,!0,!1),b.fillRect(0,0,c.width,c.height),d.vt()||(c=1/(d.m11*d.m22-d.m12*d.m21),b.transform(d.m22*c,-d.m12*c,-d.m21*c,d.m11*c,c*(d.m21* +d.dy-d.m22*d.dx),c*(d.m12*d.dx-d.m11*d.dy))))}}R.prototype.Od=function(){return!0}; +v.defineProperty(R,{fc:"category"},function(){return this.ei},function(a){var b=this.ei;if(b!==a){v.j(a,"string",R,"category");var c=this.g,d=this.data,e=null;if(null!==c&&null!==d&&!(this instanceof Vg)){var f=c.ba.la;f.isEnabled&&!f.ib&&(e=this.clone(),e.ya.Tc(this.ya))}this.ei=a;this.h("category",b,a);null===c||null===d||this instanceof Vg?(e=this.Mf,null!==e&&(a=e.ci,null!==a&&a.remove(b),e.Yk(this.fc,this))):(f=c.ba,f.la.ib||(this instanceof W?(f instanceof Q?f.WE(d,a):f instanceof Qf&&f.xI(d, +a),c=Ul(c,a),null!==c&&(Xg(c),c=c.copy(),null!==c&&kp(this,c,b,a))):(null!==f&&f.kx(d,a),c=Rl(c,d,a),null!==c&&(Xg(c),c=c.copy(),null===c||c instanceof W||(c.location=this.location,kp(this,c,b,a)))),null!==e&&(b=this.clone(),b.ya.Tc(this.ya),this.h("self",e,b))))}});v.defineProperty(R,{self:"self"},function(){return this},function(a){kp(this,a,this.fc,a.fc)});var lp=!1; +function kp(a,b,c,d){b.constructor===a.constructor||lp||(lp=!0,v.trace('Should not change the class of the Part when changing category from "'+c+'" to "'+d+'"'),v.trace(" Old class: "+v.af(a)+", new class: "+v.af(b)+", part: "+a.toString()));a.Vs();var e=a.data;c=a.Tf;var f=a.hb,h=a.hh,k=!0,l=!0,m=!1;if(a instanceof S)var n=a,k=n.Yi,l=n.md,m=n.hu;b.Wh(a);b.cloneProtected(a);a.ei=d;a.N();a.pa();b=a.g;d=!0;null!==b&&(d=b.tb,b.tb=!0);a.je=e;null!==e&&a.Hb();null!==b&&(b.tb=d);e=a.Tf;e!==c&&(a.Kk=c, +a.Tf=e);a instanceof S&&(n=a,n.Yi=k,n.md=l,n.hu=m,n.Od()&&n.H(64));a.hb=f;a.hh=h}R.prototype.canCopy=function(){if(!this.AG)return!1;var a=this.layer;if(null===a)return!0;if(!a.Vj)return!1;a=a.g;return null===a?!0:a.Vj?!0:!1};R.prototype.canDelete=function(){if(!this.FG)return!1;var a=this.layer;if(null===a)return!0;if(!a.xm)return!1;a=a.g;return null===a?!0:a.xm?!0:!1}; +R.prototype.canEdit=function(){if(!this.GI)return!1;var a=this.layer;if(null===a)return!0;if(!a.kw)return!1;a=a.g;return null===a?!0:a.kw?!0:!1};R.prototype.canGroup=function(){if(!this.dH)return!1;var a=this.layer;if(null===a)return!0;if(!a.hw)return!1;a=a.g;return null===a?!0:a.hw?!0:!1};R.prototype.canMove=function(){if(!this.VH)return!1;var a=this.layer;if(null===a)return!0;if(!a.bl)return!1;a=a.g;return null===a?!0:a.bl?!0:!1}; +R.prototype.canReshape=function(){if(!this.iI)return!1;var a=this.layer;if(null===a)return!0;if(!a.iw)return!1;a=a.g;return null===a?!0:a.iw?!0:!1};R.prototype.canResize=function(){if(!this.jI)return!1;var a=this.layer;if(null===a)return!0;if(!a.Us)return!1;a=a.g;return null===a?!0:a.Us?!0:!1};R.prototype.canRotate=function(){if(!this.mI)return!1;var a=this.layer;if(null===a)return!0;if(!a.jw)return!1;a=a.g;return null===a?!0:a.jw?!0:!1}; +R.prototype.canSelect=function(){if(!this.Al)return!1;var a=this.layer;if(null===a)return!0;if(!a.of)return!1;a=a.g;return null===a?!0:a.of?!0:!1};v.defineProperty(R,{AG:"copyable"},function(){return 0!==(this.Q&1)},function(a){var b=0!==(this.Q&1);b!==a&&(this.Q^=1,this.h("copyable",b,a))});v.defineProperty(R,{FG:"deletable"},function(){return 0!==(this.Q&2)},function(a){var b=0!==(this.Q&2);b!==a&&(this.Q^=2,this.h("deletable",b,a))}); +v.defineProperty(R,{GI:"textEditable"},function(){return 0!==(this.Q&4)},function(a){var b=0!==(this.Q&4);b!==a&&(this.Q^=4,this.h("textEditable",b,a),this.Nd())});v.defineProperty(R,{dH:"groupable"},function(){return 0!==(this.Q&8)},function(a){var b=0!==(this.Q&8);b!==a&&(this.Q^=8,this.h("groupable",b,a))});v.defineProperty(R,{VH:"movable"},function(){return 0!==(this.Q&16)},function(a){var b=0!==(this.Q&16);b!==a&&(this.Q^=16,this.h("movable",b,a))}); +v.defineProperty(R,{tI:"selectionAdorned"},function(){return 0!==(this.Q&32)},function(a){var b=0!==(this.Q&32);b!==a&&(this.Q^=32,this.h("selectionAdorned",b,a),this.Nd())});v.defineProperty(R,{Fz:"isInDocumentBounds"},function(){return 0!==(this.Q&64)},function(a){var b=0!==(this.Q&64);if(b!==a){this.Q^=64;var c=this.g;null!==c&&c.qc();this.h("isInDocumentBounds",b,a)}}); +v.defineProperty(R,{jE:"isLayoutPositioned"},function(){return 0!==(this.Q&128)},function(a){var b=0!==(this.Q&128);b!==a&&(this.Q^=128,this.h("isLayoutPositioned",b,a),this.H(a?4:8))});v.defineProperty(R,{Al:"selectable"},function(){return 0!==(this.Q&256)},function(a){var b=0!==(this.Q&256);b!==a&&(this.Q^=256,this.h("selectable",b,a),this.Nd())}); +v.defineProperty(R,{iI:"reshapable"},function(){return 0!==(this.Q&512)},function(a){var b=0!==(this.Q&512);b!==a&&(this.Q^=512,this.h("reshapable",b,a),this.Nd())});v.defineProperty(R,{jI:"resizable"},function(){return 0!==(this.Q&1024)},function(a){var b=0!==(this.Q&1024);b!==a&&(this.Q^=1024,this.h("resizable",b,a),this.Nd())});v.defineProperty(R,{mI:"rotatable"},function(){return 0!==(this.Q&2048)},function(a){var b=0!==(this.Q&2048);b!==a&&(this.Q^=2048,this.h("rotatable",b,a),this.Nd())}); +v.defineProperty(R,{hb:"isSelected"},function(){return 0!==(this.Q&4096)},function(a){var b=0!==(this.Q&4096);if(b!==a){var c=this.g;if(!a||this.canSelect()&&!(null!==c&&c.selection.count>=c.MH)){this.Q^=4096;var d=!1;if(null!==c){d=c.tb;c.tb=!0;var e=c.selection;e.Oa();a?e.add(this):e.remove(this);e.freeze()}this.h("isSelected",b,a);this.Nd();a=this.vI;null!==a&&a(this);null!==c&&(c.ue(),c.tb=d)}}}); +v.defineProperty(R,{hh:"isHighlighted"},function(){return 0!==(this.Q&524288)},function(a){var b=0!==(this.Q&524288);if(b!==a){this.Q^=524288;var c=this.g;null!==c&&(c=c.Om,c.Oa(),a?c.add(this):c.remove(this),c.freeze());this.h("isHighlighted",b,a);this.pa()}});v.defineProperty(R,{wl:"isShadowed"},function(){return 0!==(this.Q&8192)},function(a){var b=0!==(this.Q&8192);b!==a&&(this.Q^=8192,this.h("isShadowed",b,a),this.pa())});function hl(a){return 0!==(a.Q&32768)} +function fp(a,b){a.Q=b?a.Q|32768:a.Q&-32769}function Jm(a,b){a.Q=b?a.Q|65536:a.Q&-65537}function ak(a){return 0!==(a.Q&131072)}R.prototype.yf=function(a){this.Q=a?this.Q|131072:this.Q&-131073};function mp(a,b){a.Q=b?a.Q|1048576:a.Q&-1048577}v.defineProperty(R,{$D:"isAnimated"},function(){return 0!==(this.Q&262144)},function(a){var b=0!==(this.Q&262144);b!==a&&(this.Q^=262144,this.h("isAnimated",b,a))}); +v.defineProperty(R,{kA:"selectionObjectName"},function(){return this.ks},function(a){var b=this.ks;b!==a&&(this.ks=a,this.om=null,this.h("selectionObjectName",b,a))});v.defineProperty(R,{uI:"selectionAdornmentTemplate"},function(){return this.hs},function(a){var b=this.hs;b!==a&&(this instanceof W&&(a.type=Di),this.hs=a,this.h("selectionAdornmentTemplate",b,a))}); +v.u(R,{Wt:"selectionObject"},function(){if(null===this.om){var a=this.kA;null!==a&&""!==a?(a=this.be(a),this.om=null!==a?a:this):this instanceof W?(a=this.path,this.om=null!==a?a:this):this.om=this}return this.om});v.defineProperty(R,{vI:"selectionChanged"},function(){return this.js},function(a){var b=this.js;b!==a&&(null!==a&&v.j(a,"function",R,"selectionChanged"),this.js=a,this.h("selectionChanged",b,a))}); +v.defineProperty(R,{KE:"resizeAdornmentTemplate"},function(){return this.Vr},function(a){var b=this.Vr;b!==a&&(this.Vr=a,this.h("resizeAdornmentTemplate",b,a))});v.defineProperty(R,{ME:"resizeObjectName"},function(){return this.Xr},function(a){var b=this.Xr;b!==a&&(this.Xr=a,this.mo=null,this.h("resizeObjectName",b,a))});v.u(R,{LE:"resizeObject"},function(){if(null===this.mo){var a=this.ME;null!==a&&""!==a?(a=this.be(a),this.mo=null!==a?a:this):this.mo=this}return this.mo}); +v.defineProperty(R,{kI:"resizeCellSize"},function(){return this.Wr},function(a){var b=this.Wr;b.K(a)||(this.Wr=a=a.S(),this.h("resizeCellSize",b,a))});v.defineProperty(R,{nI:"rotateAdornmentTemplate"},function(){return this.Yr},function(a){var b=this.Yr;b!==a&&(this.Yr=a,this.h("rotateAdornmentTemplate",b,a))});v.defineProperty(R,{oI:"rotateObjectName"},function(){return this.Zr},function(a){var b=this.Zr;b!==a&&(this.Zr=a,this.no=null,this.h("rotateObjectName",b,a))}); +v.u(R,{OE:"rotateObject"},function(){if(null===this.no){var a=this.oI;null!==a&&""!==a?(a=this.be(a),this.no=null!==a?a:this):this.no=this}return this.no});v.defineProperty(R,{text:"text"},function(){return this.me},function(a){var b=this.me;b!==a&&(this.me=a,this.h("text",b,a))}); +v.defineProperty(R,{Sa:"containingGroup"},function(){return this.vk},function(a){if(this.Od()){var b=this.vk;if(b!==a){null===a||this!==a&&!a.Yh(this)||(this===a&&v.k("Cannot make a Group a member of itself: "+this.toString()),v.k("Cannot make a Group indirectly contain itself: "+this.toString()+" already contains "+a.toString()));this.H(wl);var c=this.g;null!==b?np(b,this):this instanceof V&&null!==c&&c.Wk.remove(this);this.vk=a;null!==a?op(a,this):this instanceof V&&null!==c&&c.Wk.add(this);this.H(ol); +if(null!==c){var d=this.data,e=c.ba;null!==d&&e instanceof Q&&e.mx(d,e.gb(null!==a?a.data:null))}d=this.tD;null!==d&&(e=!0,null!==c&&(e=c.Ra,c.Ra=!0),d(this,b,a),null!==c&&(c.Ra=e));if(this instanceof V)for(c=new J(R),Ig(c,this,!0,0,!0),c=c.i;c.next();)if(d=c.value,d instanceof S)for(d=d.te;d.next();)Pl(d.value);if(this instanceof S)for(d=this.te;d.next();)Pl(d.value);this.h("containingGroup",b,a);null!==a&&(b=a.layer,null!==b&&fk(b,-1,a))}}else v.k("cannot set the Part.containingGroup of a Link or Adornment")}); +g=R.prototype;g.rl=function(){var a=this.Sa;null!==a&&(a.N(),null!==a.Gb&&a.Gb.N(),a.cf())};g.pa=function(){var a=this.g;null!==a&&!gl(this)&&!hl(this)&&this.isVisible()&&this.mc.G()&&a.pa(ek(this,this.mc))};g.qt=function(a){a||(a=this.vk,null!==a&&op(a,this))};g.rt=function(a){a||(a=this.vk,null!==a&&np(a,this))};g.Jm=function(){var a=this.data;if(null!==a){var b=this.g;null!==b&&(b=b.ba,null!==b&&b.gx(a))}}; +v.defineProperty(R,{tD:"containingGroupChanged"},function(){return this.fq},function(a){var b=this.fq;b!==a&&(null!==a&&v.j(a,"function",R,"containingGroupChanged"),this.fq=a,this.h("containingGroupChanged",b,a))});R.prototype.findSubGraphLevel=function(){return pp(this,this)};function pp(a,b){var c=b.Sa;return null!==c?1+pp(a,c):b instanceof S&&(c=b.fe,null!==c)?pp(a,c):0}R.prototype.findTopLevelPart=function(){return qp(this,this)}; +function qp(a,b){var c=b.Sa;return null!==c?qp(a,c):b instanceof S&&(c=b.fe,null!==c)?qp(a,c):b}v.u(R,{fp:"isTopLevel"},function(){return null!==this.Sa||this instanceof S&&this.uf?!1:!0});R.prototype.isMemberOf=R.prototype.Yh=function(a){return a instanceof V?rp(this,this,a):!1};function rp(a,b,c){if(b===c||null===c)return!1;var d=b.Sa;return null===d||d!==c&&!rp(a,d,c)?b instanceof S&&(b=b.fe,null!==b)?rp(a,b,c):!1:!0} +R.prototype.findCommonContainingGroup=R.prototype.NG=function(a){if(null===a)return null;if(this===a)return this.Sa;for(var b=this;null!==b;)b instanceof V&&mp(b,!0),b=b.Sa;for(var c=null,b=a;null!==b;){if(0!==(b.Q&1048576)){c=b;break}b=b.Sa}for(b=this;null!==b;)b instanceof V&&mp(b,!1),b=b.Sa;return c};v.defineProperty(R,{BH:"layoutConditions"},function(){return this.er},function(a){var b=this.er;b!==a&&(this.er=a,this.h("layoutConditions",b,a))}); +R.prototype.canLayout=function(){if(!this.jE||!this.isVisible())return!1;var a=this.layer;return null!==a&&a.Gc||this instanceof S&&this.uf?!1:!0};R.prototype.invalidateLayout=R.prototype.H=function(a){void 0===a&&(a=16777215);var b;this.jE&&0!==(a&this.BH)?(b=this.layer,null!==b&&b.Gc||this instanceof S&&this.uf?b=!1:(b=this.g,b=null!==b&&b.la.ib?!1:!0)):b=!1;if(b)if(b=this.vk,null!==b){var c=b.Pb;null!==c?c.H():b.H(a)}else a=this.g,null!==a&&(c=a.Pb,null!==c&&c.H())}; +function tl(a){if(!a.isVisible())return!1;a=a.layer;return null!==a&&a.Gc?!1:!0}v.defineProperty(R,{ED:"dragComputation"},function(){return this.yq},function(a){var b=this.yq;b!==a&&(null!==a&&v.j(a,"function",R,"dragComputation"),this.yq=a,this.h("dragComputation",b,a))});v.defineProperty(R,{zI:"shadowOffset"},function(){return this.qm},function(a){var b=this.qm;b.K(a)||(this.qm=a=a.S(),this.pa(),this.h("shadowOffset",b,a))}); +v.defineProperty(R,{shadowColor:"shadowColor"},function(){return this.pm},function(a){var b=this.pm;b!==a&&(this.pm=a,this.pa(),this.h("shadowColor",b,a))});v.defineProperty(R,{shadowBlur:"shadowBlur"},function(){return this.og},function(a){var b=this.og;b!==a&&(this.og=a,this.pa(),this.h("shadowBlur",b,a))});function Vg(a){0===arguments.length?R.call(this,Yi):R.call(this,a);this.Q&=-257;this.Kk="Adornment";this.Gb=this.Mg=this.Db=null}v.Ja(Vg,R);v.ea("Adornment",Vg); +Vg.prototype.toString=function(){var a=this.Mf;return"Adornment("+this.fc+")"+(null!==a?a.toString():"")};Vg.prototype.updateRelationshipsFromData=function(){};Vg.prototype.Tm=function(a){var b=this.Zb.Y,c=this.Zb;if(b instanceof W&&c instanceof Y){var d=b.path,c=d.fh;b.Tm(a);c=d.fh;a=this.ya.n;b=a.length;for(d=0;d<b;d++){var e=a[d];e.Rf&&e instanceof Y&&(e.bb=c)}}};v.u(Vg,{placeholder:"placeholder"},function(){return this.Gb}); +v.defineProperty(Vg,{Zb:"adornedObject"},function(){return this.Db},function(a){var b=this.Mf,c=null;null!==a&&(c=a.Y);null===b||null!==a&&b===c||b.bj(this.fc);this.Db=a;null!==c&&c.Yk(this.fc,this)});v.u(Vg,{Mf:"adornedPart"},function(){var a=this.Db;return null!==a?a.Y:null});Vg.prototype.vl=function(){var a=this.Db;if(null===a)return!0;a=a.Y;return null===a||!gl(a)};Vg.prototype.Od=function(){return!1};v.u(Vg,{Sa:"containingGroup"},function(){return null}); +Vg.prototype.Ym=function(a,b,c,d,e,f,h){if(a===Cf&&"elements"===b)if(e instanceof Si){var k=e;null===this.Gb?this.Gb=k:this.Gb!==k&&v.k("Cannot insert a second Placeholder into the visual tree of an Adornment.")}else e instanceof D&&(k=e.dt(function(a){return a instanceof Si}),k instanceof Si&&(null===this.Gb?this.Gb=k:this.Gb!==k&&v.k("Cannot insert a second Placeholder into the visual tree of an Adornment.")));else a===Df&&"elements"===b&&null!==this.Gb&&(d===this.Gb?this.Gb=null:d instanceof D&& +this.Gb.ul(d)&&(this.Gb=null));R.prototype.Ym.call(this,a,b,c,d,e,f,h)};Vg.prototype.updateAdornments=function(){};Vg.prototype.Jm=function(){};function S(a){0===arguments.length?R.call(this,Yi):R.call(this,a);this.ec=new I(W);this.Xn=this.Nk=this.gr=this.fr=null;this.Yq=!0;this.Js=!1;this.Es=null;this.Yp=this.Zq=!0;this.Zp=ld;this.Wd=this.uh=null;this.Nr=sp;this.Sj=!1}v.Ja(S,R);v.ea("Node",S); +S.prototype.cloneProtected=function(a){R.prototype.cloneProtected.call(this,a);a.fr=this.fr;a.gr=this.gr;a.Nk=this.Nk;a.Yq=this.Yq;a.Js=this.Js;a.Es=this.Es;a.Zq=this.Zq;a.Yp=this.Yp;a.Zp=this.Zp.S();a.Nr=this.Nr};S.prototype.Wh=function(a){R.prototype.Wh.call(this,a);a.cf();a.uh=this.uh;a.Wd=null};var tp;S.DirectionDefault=tp=v.p(S,"DirectionDefault",0);S.DirectionAbsolute=v.p(S,"DirectionAbsolute",1);var up;S.DirectionRotatedNode=up=v.p(S,"DirectionRotatedNode",2);var Am; +S.DirectionRotatedNodeOrthogonal=Am=v.p(S,"DirectionRotatedNodeOrthogonal",3);S.SpreadingNone=v.p(S,"SpreadingNone",10);var sp;S.SpreadingEvenly=sp=v.p(S,"SpreadingEvenly",11);var vp;S.SpreadingPacked=vp=v.p(S,"SpreadingPacked",12);function wp(a,b){null!==b&&(null===a.uh&&(a.uh=new J(pk)),a.uh.add(b))} +function xp(a,b,c,d){if(null===b||null===a.uh)return null;for(var e=a.uh.i;e.next();){var f=e.value;if(f.sp===a&&f.Jt===b&&f.Xw===c&&f.Yw===d||f.sp===b&&f.Jt===a&&f.Xw===d&&f.Yw===c)return f}return null}S.prototype.invalidateLinkBundle=function(a,b,c){if(void 0===b||null===b)b="";if(void 0===c||null===c)c="";a=xp(this,a,b,c);null!==a&&a.dp()}; +S.prototype.Ym=function(a,b,c,d,e,f,h){a===Cf&&"elements"===b?this.Wd=null:a===Df&&"elements"===b&&(null===this.g?this.Wd=null:d instanceof G&&co(this,d,function(a,b){Zm(a,b,!0)}));R.prototype.Ym.call(this,a,b,c,d,e,f,h)};S.prototype.invalidateConnectedLinks=S.prototype.cf=function(a){void 0===a&&(a=null);for(var b=this.te;b.next();){var c=b.value;null!==a&&a.contains(c)||(yp(this,c.kd),yp(this,c.Sd),c.ic())}}; +function yp(a,b){if(null!==b){var c=b.Mr;null!==c&&c.dp();c=a.Sa;null===c||c.ee||yp(c,c.ll(""))}}S.prototype.vl=function(){return!0};v.defineProperty(S,{cI:"portSpreading"},function(){return this.Nr},function(a){var b=this.Nr;b!==a&&(this.Nr=a,this.h("portSpreading",b,a),a=this.g,null!==a&&a.la.ib||this.cf())});v.defineProperty(S,{mD:"avoidable"},function(){return this.Yp},function(a){var b=this.Yp;if(b!==a){this.Yp=a;var c=this.g;null!==c&&hm(c,this);this.h("avoidable",b,a)}}); +v.defineProperty(S,{jG:"avoidableMargin"},function(){return this.Zp},function(a){"number"===typeof a?a=new cb(a):v.A(a,cb,S,"avoidableMargin");var b=this.Zp;if(!b.K(a)){this.Zp=a=a.S();var c=this.g;null!==c&&hm(c,this);this.h("avoidableMargin",b,a)}});S.prototype.canAvoid=function(){return this.mD&&!this.uf};S.prototype.getAvoidableRect=function(a){a.set(this.U);a.fw(this.jG);return a};S.prototype.findVisibleNode=function(){for(var a=this;null!==a&&!a.isVisible();)a=a.Sa;return a}; +S.prototype.isVisible=function(){if(!R.prototype.isVisible.call(this))return!1;var a=!0,b=!0,c=this.g;if(null!==c){a=c.Na;if(a.df&&(a=a.fm.ja(this),null!==a&&a.bx))return!0;a=c.Pd;b=c.yA===lk}if(b){if(c=this.ml(),null!==c&&!c.md)return!1}else if(c=a?this.PG():this.QG(),0<c.count&&c.all(function(a){return!a.md}))return!1;c=this.fe;return null!==c?c.isVisible():!0};S.prototype.nd=function(a){R.prototype.nd.call(this,a);for(var b=this.te;b.next();)b.value.nd(a)};v.u(S,{te:"linksConnected"},function(){return this.ec.i}); +S.prototype.findLinksConnected=S.prototype.JD=function(a){void 0===a&&(a=null);if(null===a)return this.ec.i;var b=new Aa(this.ec),c=this;b.Wm=function(b){return b.T===c&&b.xg===a||b.Z===c&&b.sh===a};return b};S.prototype.findLinksOutOf=S.prototype.Bw=function(a){void 0===a&&(a=null);var b=new Aa(this.ec),c=this;b.Wm=function(b){return b.T!==c?!1:null===a?!0:b.xg===a};return b}; +S.prototype.findLinksInto=S.prototype.wg=function(a){void 0===a&&(a=null);var b=new Aa(this.ec),c=this;b.Wm=function(b){return b.Z!==c?!1:null===a?!0:b.sh===a};return b}; +S.prototype.findNodesConnected=S.prototype.KD=function(a){void 0===a&&(a=null);for(var b=null,c=null,d=this.ec.i;d.next();){var e=d.value;if(e.T===this){if(null===a||e.xg===a)e=e.Z,null!==b?b.add(e):null!==c&&c!==e?(b=new J(S),b.add(c),b.add(e)):c=e}else e.Z!==this||null!==a&&e.sh!==a||(e=e.T,null!==b?b.add(e):null!==c&&c!==e?(b=new J(S),b.add(c),b.add(e)):c=e)}return null!==b?b.i:null!==c?new ya(c):xa}; +S.prototype.findNodesOutOf=S.prototype.QG=function(a){void 0===a&&(a=null);for(var b=null,c=null,d=this.ec.i;d.next();){var e=d.value;e.T!==this||null!==a&&e.xg!==a||(e=e.Z,null!==b?b.add(e):null!==c&&c!==e?(b=new J(S),b.add(c),b.add(e)):c=e)}return null!==b?b.i:null!==c?new ya(c):xa}; +S.prototype.findNodesInto=S.prototype.PG=function(a){void 0===a&&(a=null);for(var b=null,c=null,d=this.ec.i;d.next();){var e=d.value;e.Z!==this||null!==a&&e.sh!==a||(e=e.T,null!==b?b.add(e):null!==c&&c!==e?(b=new J(S),b.add(c),b.add(e)):c=e)}return null!==b?b.i:null!==c?new ya(c):xa}; +S.prototype.findLinksBetween=function(a,b,c){void 0===b&&(b=null);void 0===c&&(c=null);var d=new Aa(this.ec),e=this;d.Wm=function(d){return(d.T!==e||d.Z!==a||null!==b&&d.xg!==b||null!==c&&d.sh!==c)&&(d.T!==a||d.Z!==e||null!==c&&d.xg!==c||null!==b&&d.sh!==b)?!1:!0};return d};S.prototype.findLinksTo=function(a,b,c){void 0===b&&(b=null);void 0===c&&(c=null);var d=new Aa(this.ec),e=this;d.Wm=function(d){return d.T!==e||d.Z!==a||null!==b&&d.xg!==b||null!==c&&d.sh===c?!1:!0};return d}; +v.defineProperty(S,{DH:"linkConnected"},function(){return this.fr},function(a){var b=this.fr;b!==a&&(null!==a&&v.j(a,"function",S,"linkConnected"),this.fr=a,this.h("linkConnected",b,a))});v.defineProperty(S,{EH:"linkDisconnected"},function(){return this.gr},function(a){var b=this.gr;b!==a&&(null!==a&&v.j(a,"function",S,"linkDisconnected"),this.gr=a,this.h("linkDisconnected",b,a))}); +v.defineProperty(S,{Qw:"linkValidation"},function(){return this.Nk},function(a){var b=this.Nk;b!==a&&(null!==a&&v.j(a,"function",S,"linkValidation"),this.Nk=a,this.h("linkValidation",b,a))}); +function zp(a,b,c){yp(a,c);if(!a.ec.contains(b)){a.ec.add(b);var d=a.DH;if(null!==d){var e=!0,f=a.g;null!==f&&(e=f.Ra,f.Ra=!0);d(a,b,c);null!==f&&(f.Ra=e)}b.Hc&&(c=b.T,b=b.Z,null!==c&&null!==b&&c!==b&&(d=!0,f=a.g,null!==f&&(d=f.Pd),a=d?b:c,e=d?c:b,a.Sj||(a.Sj=e),!e.Yi||null!==f&&f.la.ib||(d?c===e&&(e.Yi=!1):b===e&&(e.Yi=!1))))}} +function Ap(a,b,c){yp(a,c);if(a.ec.remove(b)){var d=a.EH,e=a.g;if(null!==d){var f=!0;null!==e&&(f=e.Ra,e.Ra=!0);d(a,b,c);null!==e&&(e.Ra=f)}b.Hc&&(c=!0,null!==e&&(c=e.Pd),a=c?b.Z:b.T,b=c?b.T:b.Z,null!==a&&(a.Sj=!1),null===b||b.Yi||(0===b.ec.count?(b.Sj=null,null!==e&&e.la.ib||(b.Yi=!0)):am(b)))}} +function am(a){a.Sj=!1;if(0!==a.ec.count){var b=!0,c=a.g;if(null===c||!c.la.ib){null!==c&&(b=c.Pd);for(c=a.ec.i;c.next();){var d=c.value;if(d.Hc)if(b){if(d.T===a){a.Yi=!1;return}}else if(d.Z===a){a.Yi=!1;return}}a.Yi=!0}}} +S.prototype.updateRelationshipsFromData=function(){R.prototype.updateRelationshipsFromData.call(this);var a=this.data;if(null!==a){var b=this.g;if(null!==b){var c=b.ba;if(c instanceof Qf){var d=c.Nm(a),b=b.Ze(d),e=this.ml();b!==e&&(b=null!==e?c.gb(e.data):void 0,e=c.vp,"function"===typeof e?e(a,b):a[e]=b,c.qh(a,d))}}}};S.prototype.qt=function(a){R.prototype.qt.call(this,a);a||(am(this),a=this.Xn,null!==a&&Bp(a,this))}; +S.prototype.rt=function(a){R.prototype.rt.call(this,a);a||(a=this.Xn,null!==a&&null!==a.Ce&&(a.Ce.remove(this),a.N()))};S.prototype.Jm=function(){if(0<this.ec.count){var a=this.g;if(null!==a)for(var b=a.nb.DD,c=this.ec.copy().i;c.next();){var d=c.value;b?a.remove(d):(d.T===this&&(d.T=null),d.Z===this&&(d.Z=null))}}this.fe=null;R.prototype.Jm.call(this)};v.u(S,{uf:"isLinkLabel"},function(){return null!==this.Xn}); +v.defineProperty(S,{fe:"labeledLink"},function(){return this.Xn},function(a){var b=this.Xn;if(b!==a){var c=this.g,d=this.data;if(null!==b&&(null!==b.Ce&&(b.Ce.remove(this),b.N()),null!==c&&null!==d&&!c.la.ib)){var e=b.data,f=c.ba;if(null!==e&&f instanceof Q){var h=f.gb(d);void 0!==h&&f.FE(e,h)}}this.Xn=a;null!==a&&(Bp(a,this),null===c||null===d||c.la.ib||(e=a.data,f=c.ba,null!==e&&f instanceof Q&&(h=f.gb(d),void 0!==h&&f.Yy(e,h))));Sm(this);this.h("labeledLink",b,a)}}); +S.prototype.findPort=S.prototype.ll=function(a){if(null===this.Wd){if(""===a&&!1===this.Ch)return this;$m(this)}var b=this.Wd.ja(a);return null!==b||""!==a&&(b=this.Wd.ja(""),null!==b)?b:this};v.u(S,{port:"port"},function(){return this.ll("")});v.u(S,{ports:"ports"},function(){null===this.Wd&&$m(this);return this.Wd.oE});function $m(a){null===a.Wd?a.Wd=new na("string",G):a.Wd.clear();co(a,a,function(a,c){var d=c.Rd;null!==d&&a.Wd.add(d,c)});0===a.Wd.count&&a.Wd.add("",a)} +function Zm(a,b,c){var d=b.Rd;if(null!==d&&(null!==a.Wd&&a.Wd.remove(d),b=a.g,null!==b&&c)){c=null;for(d=a.JD(d);d.next();)a=d.value,null===c&&(c=v.jb()),c.push(a);if(null!==c){for(d=0;d<c.length;d++)a=c[d],b.remove(a);v.sa(c)}}} +S.prototype.isInTreeOf=function(a){if(null===a||a===this)return!1;var b=!0,c=this.g;null!==c&&(b=c.Pd);c=this;if(b)for(;c!==a;){for(var b=null,d=c.ec.i;d.next();){var e=d.value;if(e.Hc&&(b=e.T,b!==c&&b!==this))break}if(b===this||null===b||b===c)return!1;c=b}else for(;c!==a;){b=null;for(d=c.ec.i;d.next()&&(e=d.value,!e.Hc||(b=e.Z,b===c||b===this)););if(b===this||null===b||b===c)return!1;c=b}return!0}; +S.prototype.findTreeRoot=function(){var a=!0,b=this.g;null!==b&&(a=b.Pd);b=this;if(a)for(;;){for(var a=null,c=b.ec.i;c.next();){var d=c.value;if(d.Hc&&(a=d.T,a!==b&&a!==this))break}if(a===this)return this;if(null===a||a===b)return b;b=a}else for(;;){a=null;for(c=b.ec.i;c.next()&&(d=c.value,!d.Hc||(a=d.Z,a===b||a===this)););if(a===this)return this;if(null===a||a===b)return b;b=a}}; +S.prototype.findCommonTreeParent=function(a){if(null===a)return null;if(this===a)return this;for(var b=this;null!==b;)mp(b,!0),b=b.ml();for(var c=null,b=a;null!==b;){if(0!==(b.Q&1048576)){c=b;break}b=b.ml()}for(b=this;null!==b;)mp(b,!1),b=b.ml();return c};S.prototype.findTreeParentLink=S.prototype.Vo=function(){var a=!0,b=this.g;null!==b&&(a=b.Pd);b=this.ec.i;if(a)for(;b.next();){if(a=b.value,a.Hc&&a.T!==this)return a}else for(;b.next();)if(a=b.value,a.Hc&&a.Z!==this)return a;return null}; +S.prototype.findTreeParentNode=S.prototype.ml=function(){var a=this.Sj;if(null===a)return null;if(a instanceof S)return a;var b=!0,a=this.g;null!==a&&(b=a.Pd);a=this.ec.i;if(b)for(;a.next();){if(b=a.value,b.Hc&&(b=b.T,b!==this))return this.Sj=b}else for(;a.next();)if(b=a.value,b.Hc&&(b=b.Z,b!==this))return this.Sj=b;return this.Sj=null};S.prototype.findTreeParentChain=function(){function a(b,d){if(null!==b){d.add(b);var e=b.Vo();null!==e&&(d.add(e),a(b.ml(),d))}}var b=new J(R);a(this,b);return b}; +S.prototype.findTreeLevel=function(){return Cp(this,this)};function Cp(a,b){var c=b.ml();return null===c?0:1+Cp(a,c)}S.prototype.findTreeChildrenLinks=S.prototype.Dw=function(){var a=!0,b=this.g;null!==b&&(a=b.Pd);if(a){var a=new Aa(this.ec),c=this;a.Wm=function(a){return a.Hc&&a.T===c?!0:!1}}else a=new Aa(this.ec),c=this,a.Wm=function(a){return a.Hc&&a.Z===c?!0:!1};return a}; +S.prototype.findTreeChildrenNodes=S.prototype.MD=function(){var a=!0,b=this.g;null!==b&&(a=b.Pd);var c=b=null,d=this.ec.i;if(a)for(;d.next();)a=d.value,a.Hc&&a.T===this&&(a=a.Z,null!==b?b.add(a):null!==c&&c!==a?(b=new I(S),b.add(c),b.add(a)):c=a);else for(;d.next();)a=d.value,a.Hc&&a.Z===this&&(a=a.T,null!==b?b.add(a):null!==c&&c!==a?(b=new I(S),b.add(c),b.add(a)):c=a);return null!==b?b.i:null!==c?new ya(c):xa}; +S.prototype.findTreeParts=function(a){void 0===a&&(a=Infinity);v.j(a,"number",S,"collapseTree:level");var b=new J(R);Ig(b,this,!1,a,!0);return b};S.prototype.collapseTree=S.prototype.collapseTree=function(a){void 0===a&&(a=1);v.We(a,S,"collapseTree:level");1>a&&(a=1);var b=this.g;if(null!==b&&!b.gh){b.gh=!0;var c=new J(S);c.add(this);Dp(this,c,b.Pd,a,b.Na,this,b.yA===lk);b.gh=!1}}; +function Dp(a,b,c,d,e,f,h){if(1<d)for(var k=c?a.Bw():a.wg();k.next();){var l=k.value;l.Hc&&(l=l.xz(a),null===l||l===a||b.contains(l)||(b.add(l),Dp(l,b,c,d-1,e,f,h)))}else Ep(a,b,c,e,f,h)}function Ep(a,b,c,d,e,f){for(var h=e===a?!0:a.md,k=c?a.Bw():a.wg();k.next();){var l=k.value;l.Hc&&(l=l.xz(a),null===l||l===a||b.contains(l)||(b.add(l),h&&(f&&Xj(d,l,e),l.rl(),l.nd(!1)),l.md&&(l.hu=l.md,Ep(l,b,c,d,e,f))))}a.md=!1} +S.prototype.expandTree=S.prototype.expandTree=function(a){void 0===a&&(a=2);v.We(a,S,"expandTree:level");2>a&&(a=2);var b=this.g;if(null!==b&&!b.gh){b.gh=!0;var c=new J(S);c.add(this);Fp(this,c,b.Pd,a,b.Na,this,b.yA===lk);b.gh=!1}};function Fp(a,b,c,d,e,f,h){for(var k=f===a?!1:a.md,l=c?a.Bw():a.wg();l.next();){var m=l.value;m.Hc&&(k||m.rg||m.ic(),m=m.xz(a),null!==m&&m!==a&&!b.contains(m)&&(b.add(m),k||(m.nd(!0),m.rl(),h&&Wj(e,m,f)),2<d||m.hu))&&(m.hu=!1,Fp(m,b,c,d-1,e,f,h))}a.md=!0} +v.defineProperty(S,{md:"isTreeExpanded"},function(){return this.Yq},function(a){var b=this.Yq;if(b!==a){this.Yq=a;var c=this.g;this.h("isTreeExpanded",b,a);b=this.NI;if(null!==b){var d=!0;null!==c&&(d=c.Ra,c.Ra=!0);b(this);null!==c&&(c.Ra=d)}null!==c&&c.la.ib?this.nd(a):a?this.expandTree():this.collapseTree()}});v.defineProperty(S,{hu:"wasTreeExpanded"},function(){return this.Js},function(a){var b=this.Js;b!==a&&(this.Js=a,this.h("wasTreeExpanded",b,a))}); +v.defineProperty(S,{NI:"treeExpandedChanged"},function(){return this.Es},function(a){var b=this.Es;b!==a&&(null!==a&&v.j(a,"function",S,"treeExpandedChanged"),this.Es=a,this.h("treeExpandedChanged",b,a))});v.defineProperty(S,{Yi:"isTreeLeaf"},function(){return this.Zq},function(a){var b=this.Zq;b!==a&&(this.Zq=a,this.h("isTreeLeaf",b,a))}); +function W(){R.call(this,Di);this.eg=null;this.Bh="";this.qg=this.Gq=null;this.Sh="";this.Ds=null;this.Ur=this.Tr=this.Sr=!1;this.$q=!0;this.Rp=Gi;this.kq=0;this.nq=Gi;this.oq=NaN;this.km=hn;this.ss=.5;this.Ce=null;this.Zc=(new I(z)).freeze();this.oo=this.Ee=null;this.rg=!1;this.Hv=null;this.My=!1;this.Mg=this.Dn=this.zn=this.di=this.qi=this.bb=null;this.Py=new z;this.KC=this.IC=null;this.Ox=!1;this.ga=null}v.Ja(W,R);v.ea("Link",W); +W.prototype.cloneProtected=function(a){R.prototype.cloneProtected.call(this,a);a.Bh=this.Bh;a.Gq=this.Gq;a.Sh=this.Sh;a.Ds=this.Ds;a.Sr=this.Sr;a.Tr=this.Tr;a.Ur=this.Ur;a.$q=this.$q;a.Rp=this.Rp;a.kq=this.kq;a.nq=this.nq;a.oq=this.oq;a.km=this.km;a.ss=this.ss;null!==this.ga&&(a.ga=this.ga.copy())};W.prototype.Wh=function(a){R.prototype.Wh.call(this,a);this.Bh=a.Bh;this.Sh=a.Sh;a.Ee=null;a.ic();a.di=this.di};var hn;W.Normal=hn=v.p(W,"Normal",1);W.Orthogonal=v.p(W,"Orthogonal",2); +W.AvoidsNodes=v.p(W,"AvoidsNodes",6);var Gp;W.AvoidsNodesStraight=Gp=v.p(W,"AvoidsNodesStraight",7);var Gi;W.None=Gi=v.p(W,"None",0);var Ni;W.Bezier=Ni=v.p(W,"Bezier",9);var Fi;W.JumpGap=Fi=v.p(W,"JumpGap",10);var Ei;W.JumpOver=Ei=v.p(W,"JumpOver",11);var en;W.End=en=v.p(W,"End",17);var fn;W.Scale=fn=v.p(W,"Scale",18);var gn;W.Stretch=gn=v.p(W,"Stretch",19);var wo;W.OrientAlong=wo=v.p(W,"OrientAlong",21);var Yn;W.OrientPlus90=Yn=v.p(W,"OrientPlus90",22);var $n; +W.OrientMinus90=$n=v.p(W,"OrientMinus90",23);var Hp;W.OrientOpposite=Hp=v.p(W,"OrientOpposite",24);var Ip;W.OrientUpright=Ip=v.p(W,"OrientUpright",25);var Zn;W.OrientPlus90Upright=Zn=v.p(W,"OrientPlus90Upright",26);var ao;W.OrientMinus90Upright=ao=v.p(W,"OrientMinus90Upright",27);var bo;W.OrientUpright45=bo=v.p(W,"OrientUpright45",28);W.prototype.Me=function(){null===this.ga&&(this.ga=new zm)}; +W.prototype.vl=function(){var a=this.T;if(null!==a){var b=a.findVisibleNode();null!==b&&(a=b);if(gl(a)||hl(a))return!1}a=this.Z;return null!==a&&(b=a.findVisibleNode(),null!==b&&(a=b),gl(a)||hl(a))?!1:!0};W.prototype.oA=function(){return!1};W.prototype.Od=function(){return!1}; +W.prototype.computeAngle=function(a,b,c){a=0;switch(b){default:case Gi:a=0;break;case wo:a=c;break;case Yn:a=c+90;break;case $n:a=c-90;break;case Hp:a=c+180;break;case Ip:a=re(c);90<a&&270>a&&(a-=180);break;case Zn:a=re(c+90);90<a&&270>a&&(a-=180);break;case ao:a=re(c-90);90<a&&270>a&&(a-=180);break;case bo:a=re(c);if(45<a&&135>a||225<a&&315>a)return 0;90<a&&270>a&&(a-=180)}return re(a)}; +v.defineProperty(W,{T:"fromNode"},function(){return this.eg},function(a){var b=this.eg;if(b!==a){var c=this.kd;null!==b&&(this.qg!==b&&Ap(b,this,c),Jp(this),this.H(wl));this.eg=a;null!==a&&this.nd(a.isVisible());this.qi=null;this.ic();var d=this.g;if(null!==d){var e=this.data,f=d.ba;if(null!==e)if(f instanceof Q){var h=null!==a?a.data:null;f.lx(e,f.gb(h))}else f instanceof Qf&&(h=null!==a?a.data:null,d.Pd?f.qh(e,f.gb(h)):(null!==b&&f.qh(b.data,void 0),f.qh(h,f.gb(null!==this.qg?this.qg.data:null))))}e= +this.kd;f=this.PD;null!==f&&(h=!0,null!==d&&(h=d.Ra,d.Ra=!0),f(this,c,e),null!==d&&(d.Ra=h));null!==a&&(this.qg!==a&&zp(a,this,e),Kp(this),this.H(ol));this.h("fromNode",b,a);Pl(this)}}); +v.defineProperty(W,{xg:"fromPortId"},function(){return this.Bh},function(a){var b=this.Bh;if(b!==a){var c=this.kd;null!==c&&yp(this.T,c);Jp(this);this.Bh=a;var d=this.kd;null!==d&&yp(this.T,d);var e=this.g;if(null!==e){var f=this.data,h=e.ba;null!==f&&h instanceof Q&&h.mA(f,a)}c!==d&&(this.qi=null,this.ic(),f=this.PD,null!==f&&(h=!0,null!==e&&(h=e.Ra,e.Ra=!0),f(this,c,d),null!==e&&(e.Ra=h)));Kp(this);this.h("fromPortId",b,a)}});v.u(W,{kd:"fromPort"},function(){var a=this.eg;return null===a?null:a.ll(this.Bh)}); +v.defineProperty(W,{PD:"fromPortChanged"},function(){return this.Gq},function(a){var b=this.Gq;b!==a&&(null!==a&&v.j(a,"function",W,"fromPortChanged"),this.Gq=a,this.h("fromPortChanged",b,a))}); +v.defineProperty(W,{Z:"toNode"},function(){return this.qg},function(a){var b=this.qg;if(b!==a){var c=this.Sd;null!==b&&(this.eg!==b&&Ap(b,this,c),Jp(this),this.H(wl));this.qg=a;null!==a&&this.nd(a.isVisible());this.qi=null;this.ic();var d=this.g;if(null!==d){var e=this.data,f=d.ba;if(null!==e)if(f instanceof Q){var h=null!==a?a.data:null;f.px(e,f.gb(h))}else f instanceof Qf&&(h=null!==a?a.data:null,d.Pd?(null!==b&&f.qh(b.data,void 0),f.qh(h,f.gb(null!==this.eg?this.eg.data:null))):f.qh(e,f.gb(h)))}e= +this.Sd;f=this.gF;null!==f&&(h=!0,null!==d&&(h=d.Ra,d.Ra=!0),f(this,c,e),null!==d&&(d.Ra=h));null!==a&&(this.eg!==a&&zp(a,this,e),Kp(this),this.H(ol));this.h("toNode",b,a);Pl(this)}}); +v.defineProperty(W,{sh:"toPortId"},function(){return this.Sh},function(a){var b=this.Sh;if(b!==a){var c=this.Sd;null!==c&&yp(this.Z,c);Jp(this);this.Sh=a;var d=this.Sd;null!==d&&yp(this.Z,d);var e=this.g;if(null!==e){var f=this.data,h=e.ba;null!==f&&h instanceof Q&&h.pA(f,a)}c!==d&&(this.qi=null,this.ic(),f=this.gF,null!==f&&(h=!0,null!==e&&(h=e.Ra,e.Ra=!0),f(this,c,d),null!==e&&(e.Ra=h)));Kp(this);this.h("toPortId",b,a)}});v.u(W,{Sd:"toPort"},function(){var a=this.qg;return null===a?null:a.ll(this.Sh)}); +v.defineProperty(W,{gF:"toPortChanged"},function(){return this.Ds},function(a){var b=this.Ds;b!==a&&(null!==a&&v.j(a,"function",W,"toPortChanged"),this.Ds=a,this.h("toPortChanged",b,a))});v.defineProperty(W,{xb:"fromSpot"},function(){return null!==this.ga?this.ga.qj:fc},function(a){this.Me();var b=this.ga.qj;b.K(a)||(a=a.S(),this.ga.qj=a,this.h("fromSpot",b,a),this.ic())}); +v.defineProperty(W,{nl:"fromEndSegmentLength"},function(){return null!==this.ga?this.ga.oj:NaN},function(a){this.Me();var b=this.ga.oj;b!==a&&(0>a&&v.va(a,">= 0",W,"fromEndSegmentLength"),this.ga.oj=a,this.h("fromEndSegmentLength",b,a),this.ic())});v.defineProperty(W,{lt:"fromEndSegmentDirection"},function(){return null!==this.ga?this.ga.nj:tp},function(a){this.Me();var b=this.ga.nj;b!==a&&(this.ga.nj=a,this.h("fromEndSegmentDirection",b,a),this.ic())}); +v.defineProperty(W,{mt:"fromShortLength"},function(){return null!==this.ga?this.ga.pj:NaN},function(a){this.Me();var b=this.ga.pj;b!==a&&(this.ga.pj=a,this.h("fromShortLength",b,a),this.ic())});v.defineProperty(W,{yb:"toSpot"},function(){return null!==this.ga?this.ga.Rj:fc},function(a){this.Me();var b=this.ga.Rj;b.K(a)||(a=a.S(),this.ga.Rj=a,this.h("toSpot",b,a),this.ic())}); +v.defineProperty(W,{Gl:"toEndSegmentLength"},function(){return null!==this.ga?this.ga.Pj:NaN},function(a){this.Me();var b=this.ga.Pj;b!==a&&(0>a&&v.va(a,">= 0",W,"toEndSegmentLength"),this.ga.Pj=a,this.h("toEndSegmentLength",b,a),this.ic())});v.defineProperty(W,{eu:"toEndSegmentDirection"},function(){return null!==this.ga?this.ga.Oj:tp},function(a){this.Me();var b=this.ga.Oj;b!==a&&(this.ga.Oj=a,this.h("toEndSegmentDirection",b,a),this.ic())}); +v.defineProperty(W,{fu:"toShortLength"},function(){return null!==this.ga?this.ga.Qj:NaN},function(a){this.Me();var b=this.ga.Qj;b!==a&&(this.ga.Qj=a,this.h("toShortLength",b,a),this.ic())});function Pl(a){var b=a.T,c=a.Z;null!==b?null!==c?Lp(a,b.NG(c)):Lp(a,null):Lp(a,null)}function Lp(a,b){var c=a.vk;if(c!==b){null!==c&&np(c,a);a.vk=b;null!==b&&op(b,a);var d=a.tD;if(null!==d){var e=!0,f=a.g;null!==f&&(e=f.Ra,f.Ra=!0);d(a,c,b);null!==f&&(f.Ra=e)}!a.rg||a.IC!==c&&a.KC!==c||a.ic()}} +W.prototype.rl=function(){var a=this.Sa;null!==a&&this.T!==a&&this.Z!==a&&a.qw&&R.prototype.rl.call(this)};W.prototype.getOtherNode=W.prototype.xz=function(a){var b=this.T;return a===b?this.Z:b};W.prototype.getOtherPort=function(a){var b=this.kd;return a===b?this.Sd:b};v.u(W,{UJ:"isLabeledLink"},function(){return null===this.Ce?!1:0<this.Ce.count});v.u(W,{Sf:"labelNodes"},function(){return null===this.Ce?xa:this.Ce.i});function Bp(a,b){null===a.Ce&&(a.Ce=new J(S));a.Ce.add(b);a.N()} +W.prototype.qt=function(a){R.prototype.qt.call(this,a);Mp(this)&&Hi(this,this.U);a||(a=this.eg,null!==a&&zp(a,this,this.kd),a=this.qg,null!==a&&zp(a,this,this.Sd),Kp(this))};W.prototype.rt=function(a){R.prototype.rt.call(this,a);Mp(this)&&Hi(this,this.U);a||(a=this.eg,null!==a&&Ap(a,this,this.kd),a=this.qg,null!==a&&Ap(a,this,this.Sd),Jp(this))}; +W.prototype.Jm=function(){this.rg=!0;if(null!==this.Ce){var a=this.g;if(null!==a)for(var b=this.Ce.copy().i;b.next();)a.remove(b.value)}b=this.data;null!==b&&(a=this.g,null!==a&&(a=a.ba,a instanceof Q?a.ex(b):a instanceof Qf&&a.qh(b,void 0)))}; +W.prototype.updateRelationshipsFromData=function(){var a=this.data;if(null!==a){var b=this.g;if(null!==b){var c=b.ba;if(c instanceof Q){var d=c.pl(a),e=b.Ze(d),f=this.T;e!==f&&(e=null!==f?c.gb(f.data):void 0,f=c.ip,"function"===typeof f?f(a,e):a[f]=e,c.lx(a,d));d=c.ql(a);e=b.Ze(d);f=this.Z;e!==f&&(e=null!==f?c.gb(f.data):void 0,f=c.kp,"function"===typeof f?f(a,e):a[f]=e,c.px(a,d));var h=c.ak(a);if(0<h.length||0<this.Sf.count){if(1===h.length&&1===this.Sf.count&&(b=h[0],d=this.Sf.first(),c.gb(d.data)=== +b))return;var d=(new J).Tc(h),k=new J;this.Sf.each(function(a){null!==a.data&&(a=c.gb(a.data),void 0!==a&&k.add(a))});b=k.copy();b.eA(d);d=d.copy();d.eA(k);if(0<b.count||0<d.count)h.length=0,k.each(function(a){h.push(a)}),b.each(function(b){c.FE(a,b)}),d.each(function(b){c.Yy(a,b)})}}}}}; +W.prototype.move=function(a){var b=this.position,c=b.x;isNaN(c)&&(c=0);b=b.y;isNaN(b)&&(b=0);c=a.x-c;b=a.y-b;R.prototype.move.call(this,a);this.xl(c,b);for(a=this.Sf;a.next();){var d=a.value,e=d.position;d.moveTo(e.x+c,e.y+b)}};v.defineProperty(W,{fI:"relinkableFrom"},function(){return this.Sr},function(a){var b=this.Sr;b!==a&&(this.Sr=a,this.h("relinkableFrom",b,a),this.Nd())}); +v.defineProperty(W,{gI:"relinkableTo"},function(){return this.Tr},function(a){var b=this.Tr;b!==a&&(this.Tr=a,this.h("relinkableTo",b,a),this.Nd())});W.prototype.canRelinkFrom=function(){if(!this.fI)return!1;var a=this.layer;if(null===a)return!0;if(!a.ym)return!1;a=a.g;return null===a||a.ym?!0:!1};W.prototype.canRelinkTo=function(){if(!this.gI)return!1;var a=this.layer;if(null===a)return!0;if(!a.ym)return!1;a=a.g;return null===a||a.ym?!0:!1}; +v.defineProperty(W,{Rt:"resegmentable"},function(){return this.Ur},function(a){var b=this.Ur;b!==a&&(this.Ur=a,this.h("resegmentable",b,a),this.Nd())});v.defineProperty(W,{Hc:"isTreeLink"},function(){return this.$q},function(a){var b=this.$q;b!==a&&(this.$q=a,this.h("isTreeLink",b,a),null!==this.T&&am(this.T),null!==this.Z&&am(this.Z))});v.u(W,{path:"path"},function(){var a=this.Ye();return a instanceof Y?a:null}); +v.u(W,{Zm:"routeBounds"},function(){this.en();var a=new A;var b=Infinity,c=Infinity,d=this.oa;if(0===d)a.m(NaN,NaN,0,0);else{if(1===d)d=this.l(0),b=Math.min(d.x,b),c=Math.min(d.y,c),a.m(d.x,d.y,0,0);else if(2===d){var e=this.l(0),f=this.l(1),b=Math.min(e.x,f.x),c=Math.min(e.y,f.y);a.m(e.x,e.y,0,0);a.fj(f)}else if(this.computeCurve()===Ni&&3<=d&&!this.jc)if(e=this.l(0),b=e.x,c=e.y,a.m(b,c,0,0),3===d)d=this.l(1),b=Math.min(d.x,b),c=Math.min(d.y,c),f=this.l(2),b=Math.min(f.x,b),c=Math.min(f.y,c),Yd(e.x, +e.y,d.x,d.y,d.x,d.y,f.x,f.y,.5,a);else for(var h=3;h<d;h+=3){var k=this.l(h-2);h+3>=d&&(h=d-1);var l=this.l(h-1),f=this.l(h);Yd(e.x,e.y,k.x,k.y,l.x,l.y,f.x,f.y,.5,a);b=Math.min(f.x,b);c=Math.min(f.y,c);e=f}else for(e=this.l(0),f=this.l(1),b=Math.min(e.x,f.x),c=Math.min(e.y,f.y),a.m(e.x,e.y,0,0),a.fj(f),h=2;h<d;h++)e=this.l(h),b=Math.min(e.x,b),c=Math.min(e.y,c),a.fj(e);this.Py.m(b-a.x,c-a.y)}return this.Hv=a});v.u(W,{uE:"midPoint"},function(){this.en();return this.computeMidPoint(new z)}); +W.prototype.computeMidPoint=function(a){var b=this.oa;if(0===b)return a.assign(Dd),a;if(1===b)return a.assign(this.l(0)),a;if(2===b){var c=this.l(0),d=this.l(1);a.m((c.x+d.x)/2,(c.y+d.y)/2);return a}if(this.computeCurve()===Ni&&3<=b&&!this.jc){if(3===b)return this.l(1);var c=(b-1)/3|0,e=3*(c/2|0);if(1===c%2){var c=this.l(e),d=this.l(e+1),f=this.l(e+2),e=this.l(e+3),b=d.x,h=d.y,d=f.x,k=f.y,f=(b+d)/2,l=(h+k)/2,h=((c.y+h)/2+l)/2,k=(l+(k+e.y)/2)/2;a.x=(((c.x+b)/2+f)/2+(f+(d+e.x)/2)/2)/2;a.y=(h+k)/2}else a.assign(this.l(e)); +return a}e=0;f=v.jb();for(h=0;h<b-1;h++)c=0,c=this.l(h),d=this.l(h+1),Hc(c.x,d.x)?(c=d.y-c.y,0>c&&(c=-c)):Hc(c.y,d.y)?(c=d.x-c.x,0>c&&(c=-c)):c=Math.sqrt(c.rf(d)),f.push(c),e+=c;for(d=h=c=0;c<e/2&&h<b;){d=f[h];if(c+d>e/2)break;c+=d;h++}v.sa(f);b=this.l(h);f=this.l(h+1);b.x===f.x?b.y>f.y?a.m(b.x,b.y-(e/2-c)):a.m(b.x,b.y+(e/2-c)):b.y===f.y?b.x>f.x?a.m(b.x-(e/2-c),b.y):a.m(b.x+(e/2-c),b.y):(c=(e/2-c)/d,a.m(b.x+c*(f.x-b.x),b.y+c*(f.y-b.y)));return a};v.u(W,{tE:"midAngle"},function(){this.en();return this.computeMidAngle()}); +W.prototype.computeMidAngle=function(){var a=this.oa;if(2>a)return NaN;if(this.computeCurve()===Ni&&4<=a&&!this.jc){var b=(a-1)/3|0,c=3*(b/2|0);if(1===b%2){var c=Math.floor(c),b=this.l(c),d=this.l(c+1),a=this.l(c+2),c=this.l(c+3),e=d.x,d=d.y,f=a.x,a=a.y,h=(e+f)/2,k=(d+a)/2;return Va(((b.x+e)/2+h)/2,((b.y+d)/2+k)/2,(h+(f+c.x)/2)/2,(k+(a+c.y)/2)/2)}if(0<c&&c+1<a)return b=this.l(c-1),d=this.l(c+1),b.xc(d)}c=a/2|0;if(0===a%2)return b=this.l(c-1),d=this.l(c),4<=a&&b.Fc(d)&&(b=this.l(c-2),a=this.l(c+1), +c=b.rf(d),e=d.rf(a),!(c>e+10))?e>c+10?d.xc(a):b.xc(a):b.xc(d);b=this.l(c-1);d=this.l(c);a=this.l(c+1);c=b.rf(d);e=d.rf(a);return c>e+10?b.xc(d):e>c+10?d.xc(a):b.xc(a)}; +v.defineProperty(W,{points:"points"},function(){return this.Zc},function(a){var b=this.Zc;if(b!==a){var c=null;if(Array.isArray(a)){var d=0===a.length%2;if(d)for(var e=0;e<a.length;e++)if("number"!==typeof a[e]||isNaN(a[e])){d=!1;break}if(d)for(c=new I(z),d=0;d<a.length/2;d++)e=(new z(a[2*d],a[2*d+1])).freeze(),c.add(e);else{for(var f=!0,d=0;d<a.length;d++)if(e=a[d],!v.Ta(e)||"number"!==typeof e.x||isNaN(e.x)||"number"!==typeof e.y||isNaN(e.y)){f=!1;break}if(f)for(c=new I(z),d=0;d<a.length;d++)e= +a[d],c.add((new z(e.x,e.y)).freeze());else v.k("Link.points array must contain only an even number of numbers or objects with x and y properties, not: "+a)}}else if(a instanceof I)for(c=a.copy(),a=c.i;a.next();)a.value.freeze();else v.k("Link.points value is not an instance of List or Array: "+a);c.freeze();this.Zc=c;this.ce();this.N();Np(this);a=this.g;null!==a&&(a.Qm||a.la.ib||a.Rw.add(this),a.Na.pc&&(this.oo=c));this.h("points",b,c)}});v.u(W,{oa:"pointsCount"},function(){return this.Zc.count}); +W.prototype.getPoint=W.prototype.l=function(a){return this.Zc.n[a]};W.prototype.setPoint=W.prototype.zf=function(a,b){null===this.Ee&&v.k("Call Link.startRoute before modifying the points of the route.");this.Zc.Ig(a,b)};W.prototype.setPointAt=W.prototype.V=function(a,b,c){null===this.Ee&&v.k("Call Link.startRoute before modifying the points of the route.");this.Zc.Ig(a,new z(b,c))}; +W.prototype.insertPoint=function(a,b){null===this.Ee&&v.k("Call Link.startRoute before modifying the points of the route.");this.Zc.yd(a,b)};W.prototype.insertPointAt=W.prototype.w=function(a,b,c){null===this.Ee&&v.k("Call Link.startRoute before modifying the points of the route.");this.Zc.yd(a,new z(b,c))};W.prototype.addPoint=W.prototype.Th=function(a){null===this.Ee&&v.k("Call Link.startRoute before modifying the points of the route.");this.Zc.add(a)}; +W.prototype.addPointAt=W.prototype.$k=function(a,b){null===this.Ee&&v.k("Call Link.startRoute before modifying the points of the route.");this.Zc.add(new z(a,b))};W.prototype.removePoint=W.prototype.GE=function(a){null===this.Ee&&v.k("Call Link.startRoute before modifying the points of the route.");this.Zc.Vc(a)};W.prototype.clearPoints=W.prototype.Mo=function(){null===this.Ee&&v.k("Call Link.startRoute before modifying the points of the route.");this.Zc.clear()}; +W.prototype.movePoints=W.prototype.xl=function(a,b){for(var c=new I(z),d=this.Zc.i;d.next();){var e=d.value;c.add((new z(e.x+a,e.y+b)).freeze())}c.freeze();d=this.Zc;this.Zc=c;this.N();Np(this);e=this.g;null!==e&&e.Na.pc&&(this.oo=c);this.h("points",d,c)};W.prototype.startRoute=W.prototype.Cl=function(){null===this.Ee&&(this.Ee=this.Zc,this.Zc=this.Zc.copy())}; +W.prototype.commitRoute=W.prototype.Pi=function(){if(null!==this.Ee){for(var a=this.Ee,b=this.Zc,c=Infinity,d=Infinity,e=a.n,f=e.length,h=0;h<f;h++)var k=e[h],c=Math.min(k.x,c),d=Math.min(k.y,d);for(var l=Infinity,m=Infinity,n=b.n,p=n.length,h=0;h<p;h++)k=n[h],l=Math.min(k.x,l),m=Math.min(k.y,m),k.freeze();b.freeze();if(p===f)for(h=0;h<p;h++){if(f=e[h],k=n[h],f.x-c!==k.x-l||f.y-d!==k.y-m){this.N();this.ce();break}}else this.N(),this.ce();this.Ee=null;c=this.g;null!==c&&c.Na.pc&&(this.oo=b);Np(this); +this.h("points",a,b)}};W.prototype.rollbackRoute=W.prototype.lI=function(){null!==this.Ee&&(this.Zc=this.Ee,this.Ee=null)};function Np(a){0===a.Zc.count?a.rg=!1:(a.rg=!0,a.zn=a.l(0).copy(),a.Dn=a.l(a.oa-1).copy(),Op(a,!1))}W.prototype.invalidateRoute=W.prototype.ic=function(){if(!this.My){var a=this.g;a&&(a.Rw.contains(this)||a.la.ib||a.Na.vH&&!a.Na.df)||(a=this.path,null!==a&&(this.rg=!1,this.N(),a.N()))}};v.defineProperty(W,{Jp:"suspendsRouting"},function(){return this.My},function(a){this.My=a}); +W.prototype.updateRoute=W.prototype.en=function(){if(!this.rg&&!this.Ox){var a=!0;try{this.Ox=!0,this.Cl(),a=this.computePoints()}finally{this.Ox=!1,a?this.Pi():this.lI()}}}; +W.prototype.computePoints=function(){var a=this.g;if(null===a)return!1;var b=this.T,c=null;null===b?(a.lm||(a.Iv=new Y,a.Iv.za=pd,a.Iv.lb=0,a.lm=new S,a.lm.add(a.Iv),a.lm.sf()),this.zn&&(a.lm.position=a.lm.location=this.zn,a.lm.sf(),b=a.lm,c=a.Iv)):c=this.kd;if(null!==c&&!b.isVisible()){var d=b.findVisibleNode();null!==d&&d!==b?(b=d,c=d.ll("")):b=d}this.IC=b;if(null===b||!b.location.G())return!1;for(;!(null===c||c.U.G()&&c.Zi());)c=c.R;if(null===c)return!1;var d=this.Z,e=null;null===d?(a.mm||(a.Jv= +new Y,a.Jv.za=pd,a.Jv.lb=0,a.mm=new S,a.mm.add(a.Jv),a.mm.sf()),this.Dn&&(a.mm.position=a.mm.location=this.Dn,a.mm.sf(),d=a.mm,e=a.Jv)):e=this.Sd;null===e||d.isVisible()||(a=d.findVisibleNode(),null!==a&&a!==d?(d=a,e=a.ll("")):d=a);this.KC=d;if(null===d||!d.location.G())return!1;for(;!(null===e||e.U.G()&&e.Zi());)e=e.R;if(null===e)return!1;var a=this.oa,f=Pp(this,c),h=Qp(this,e),k=c===e&&null!==c,l=this.jc,m=this.Ke===Ni;this.qi=k&&!l?m=!0:!1;var n=this.Qs===Gi||k;if(l||f!==qb||h!==qb||k){m=this.sl; +n&&(l&&m||k)&&this.Mo();var p=k?this.computeCurviness():0,q=this.getLinkPoint(b,c,f,!0,l,d,e),r=0,s=0,t=0;if(l||f!==qb||k){var u=this.computeEndSegmentLength(b,c,f,!0),t=this.getLinkDirection(b,c,q,f,!0,l,d,e);k&&(t-=l?90:30,0>p&&(t-=180));0>t?t+=360:360<=t&&(t-=360);k&&(u+=Math.abs(p));0===t?r=u:90===t?s=u:180===t?r=-u:270===t?s=-u:(r=u*Math.cos(t*Math.PI/180),s=u*Math.sin(t*Math.PI/180));if(f.se()&&k){var x=c.Xa(zb,v.L()),w=v.Mb(x.x+1E3*r,x.y+1E3*s);this.getLinkPointFromPoint(b,c,x,w,!0,q);v.v(x); +v.v(w)}}var u=this.getLinkPoint(d,e,h,!1,l,b,c),y=0,B=0,H=0;if(l||h!==qb||k)x=this.computeEndSegmentLength(d,e,h,!1),H=this.getLinkDirection(d,e,u,h,!1,l,b,c),k&&(H+=l?0:30,0>p&&(H+=180)),0>H?H+=360:360<=H&&(H-=360),k&&(x+=Math.abs(p)),0===H?y=x:90===H?B=x:180===H?y=-x:270===H?B=-x:(y=x*Math.cos(H*Math.PI/180),B=x*Math.sin(H*Math.PI/180)),h.se()&&k&&(x=e.Xa(zb,v.L()),w=v.Mb(x.x+1E3*y,x.y+1E3*B),this.getLinkPointFromPoint(d,e,x,w,!1,u),v.v(x),v.v(w));e=q;if(l||f!==qb||k)e=new z(q.x+r,q.y+s);c=u;if(l|| +h!==qb||k)c=new z(u.x+y,u.y+B);!n&&!l&&f===qb&&3<a&&this.adjustPoints(0,q,a-2,c)?this.zf(a-1,u):!n&&!l&&h===qb&&3<a&&this.adjustPoints(1,e,a-1,u)?this.zf(0,q):!n&&!l&&4<a&&this.adjustPoints(1,e,a-2,c)?(this.zf(0,q),this.zf(a-1,u)):!n&&l&&6<=a&&!m&&this.adjustPoints(1,e,a-2,c)?(this.zf(0,q),this.zf(a-1,u)):(this.Mo(),this.Th(q),(l||f!==qb||k)&&this.Th(e),l&&this.addOrthoPoints(e,t,c,H,b,d),(l||h!==qb||k)&&this.Th(c),this.Th(u))}else f=!1,!n&&3<=a&&(n=this.getLinkPoint(b,c,qb,!0,!1,d,e),h=this.getLinkPoint(d, +e,qb,!1,!1,b,c),f=this.adjustPoints(0,n,a-1,h))&&(n=this.getLinkPoint(b,c,qb,!0,!1,d,e),h=this.getLinkPoint(d,e,qb,!1,!1,b,c),this.adjustPoints(0,n,a-1,h)),f||(this.Mo(),m?(a=this.getLinkPoint(b,c,qb,!0,!1,d,e),n=this.getLinkPoint(d,e,qb,!1,!1,b,c),f=n.x-a.x,h=n.y-a.y,k=this.computeCurviness(),m=l=0,q=a.x+f/3,t=a.y+h/3,r=q,s=t,K(h,0)?s=0<f?s-k:s+k:(l=-f/h,m=Math.sqrt(k*k/(l*l+1)),0>k&&(m=-m),r=(0>h?-1:1)*m+q,s=l*(r-q)+t),q=a.x+2*f/3,t=a.y+2*h/3,u=q,y=t,K(h,0)?y=0<f?y-k:y+k:(u=(0>h?-1:1)*m+q,y=l*(u- +q)+t),this.Mo(),this.Th(a),this.$k(r,s),this.$k(u,y),this.Th(n),this.zf(0,this.getLinkPoint(b,c,qb,!0,!1,d,e)),this.zf(3,this.getLinkPoint(d,e,qb,!1,!1,b,c))):(a=d,d=this.getLinkPoint(b,c,qb,!0,!1,a,e),e=this.getLinkPoint(a,e,qb,!1,!1,b,c),this.hasCurviness()?(h=e.x-d.x,b=e.y-d.y,c=this.computeCurviness(),a=d.x+h/2,n=d.y+b/2,f=a,k=n,K(b,0)?k=0<h?k-c:k+c:(h=-h/b,f=Math.sqrt(c*c/(h*h+1)),0>c&&(f=-f),f=(0>b?-1:1)*f+a,k=h*(f-a)+n),this.Th(d),this.$k(f,k)):this.Th(d),this.Th(e)));return!0}; +function Rp(a,b){Math.abs(b.x-a.x)>Math.abs(b.y-a.y)?(b.x=b.x>=a.x?a.x+9E9:a.x-9E9,b.y=a.y):(b.y=b.y>=a.y?a.y+9E9:a.y-9E9,b.x=a.x);return b} +W.prototype.getLinkPointFromPoint=function(a,b,c,d,e,f){void 0===f&&(f=new z);if(null===a||null===b)return f.assign(c),f;a.isVisible()||(e=a.findVisibleNode(),null!==e&&e!==a&&(b=e.port));var h=e=0,k=0,l=0;a=null;e=b.R;null===e||e.Lg()||(e=e.R);if(null===e)e=d.x,h=d.y,k=c.x,l=c.y;else{a=e.Zg;e=1/(a.m11*a.m22-a.m12*a.m21);var k=a.m22*e,l=-a.m12*e,m=-a.m21*e,n=a.m11*e,p=e*(a.m21*a.dy-a.m22*a.dx),q=e*(a.m12*a.dx-a.m11*a.dy);e=d.x*k+d.y*m+p;h=d.x*l+d.y*n+q;k=c.x*k+c.y*m+p;l=c.x*l+c.y*n+q}b.Zo(e,h,k,l, +f);null!==a&&f.transform(a);return f};function Sp(a,b){var c=b.Mr;null===c&&(c=new Tp,c.port=b,c.Jc=b.Y,b.Mr=c);return Up(c,a)} +W.prototype.getLinkPoint=function(a,b,c,d,e,f,h,k){void 0===k&&(k=new z);if(c.bd())return b.Xa(c,k),k;if(c.Wi()&&(c=Sp(this,b),null!==c)){k.assign(c.jp);if(e&&this.ix===Gp){var l=Sp(this,h);if(null!==l&&c.Hm<l.Hm){c=v.L();var l=v.L(),m=new A(b.Xa(rb,c),b.Xa(Eb,l)),n=this.computeSpot(!d);a=this.getLinkPoint(f,h,n,!d,e,a,b,l);a.x>=m.x&&a.x<=m.x+m.width?k.x=a.x:a.y>=m.y&&a.y<=m.y+m.height&&(k.y=a.y);v.v(c);v.v(l)}}return k}f=b.Xa(zb,v.L());l=c=null;this.oa>(e?6:2)?(l=d?this.l(1):this.l(this.oa-2),e&& +(l=Rp(f,l.copy()))):(c=v.L(),l=h.Xa(zb,c),e&&(l=Rp(f,l)),v.v(c));this.getLinkPointFromPoint(a,b,f,l,d,k);v.v(f);return k}; +W.prototype.getLinkDirection=function(a,b,c,d,e,f,h,k){a:if(d.bd())c=d.x>d.y?d.x>1-d.y?0:d.x<1-d.y?270:315:d.x<d.y?d.x>1-d.y?90:d.x<1-d.y?180:135:.5>d.x?225:.5<d.x?45:0;else{if(d.Wi()){var l=Sp(this,b);if(null!==l)switch(l.ge){case v.dd:c=270;break a;case v.Nc:c=180;break a;default:case v.Xc:c=0;break a;case v.Wc:c=90;break a}}var l=b.Xa(zb,v.L()),m=null,n=null;this.oa>(f?6:2)?(n=e?this.l(1):this.l(this.oa-2),n=f?Rp(l,n.copy()):c):(m=v.L(),n=k.Xa(zb,m),v.v(m));c=0;c=Math.abs(n.x-l.x)>Math.abs(n.y- +l.y)?n.x>=l.x?0:180:n.y>=l.y?90:270;v.v(l)}d.se()&&h.Yh(a)&&(c+=180,360<=c&&(c-=360));a=tp;a=e?this.lt:this.eu;a===tp&&(a=e?b.lt:b.eu);switch(a){case up:b=b.ol();c+=b;360<=c&&(c-=360);break;case tp:case Am:b=b.ol();if(0===b)break;45<=b&&135>b?c+=90:135<=b&&225>b?c+=180:225<=b&&315>b&&(c+=270);360<=c&&(c-=360)}return c}; +W.prototype.computeEndSegmentLength=function(a,b,c,d){if(null!==b&&c.Wi()&&(a=Sp(this,b),null!==a))return a.xw;a=NaN;a=d?this.nl:this.Gl;null!==b&&isNaN(a)&&(a=d?b.nl:b.Gl);isNaN(a)&&(a=10);return a};W.prototype.computeSpot=function(a){return a?Pp(this,this.kd):Qp(this,this.Sd)};function Pp(a,b){if(null===b)return zb;var c=a.xb;c.Uc()&&(void 0===b&&(b=a.kd),null!==b&&(c=b.xb));return c===fc?qb:c} +function Qp(a,b){if(null===b)return zb;var c=a.yb;c.Uc()&&(void 0===b&&(b=a.Sd),null!==b&&(c=b.yb));return c===fc?qb:c}W.prototype.computeOtherPoint=function(a,b){var c=b.Xa(zb),d;d=b.Mr;d=null!==d?Up(d,this):null;null!==d&&(c=d.jp);return c};W.prototype.computeShortLength=function(a){return a?Vp(this):Wp(this)};function Vp(a){var b=a.mt;isNaN(b)&&(a=a.kd,null!==a&&(b=a.mt));return isNaN(b)?0:b}function Wp(a){var b=a.fu;isNaN(b)&&(a=a.Sd,null!==a&&(b=a.fu));return isNaN(b)?0:b} +W.prototype.Zj=function(a,b,c,d,e,f){if(!1===this.Hg)return!1;void 0===b&&(b=null);void 0===c&&(c=null);var h=f;void 0===f&&(h=v.rh(),h.reset());h.multiply(this.transform);if(this.Em(a,h))return jo(this,b,c,e),void 0===f&&v.$e(h),!0;if(this.yg(a,h)){var k=!1;if(!this.Qg)for(var l=this.ya.n,m=l.length;m--;){var n=l[m];if(n.visible||n===this.bc){var p=n.U,q=this.Ha;if(!(p.x>q.width||p.y>q.height||0>p.x+p.width||0>p.y+p.height)){p=v.rh();p.set(h);if(n instanceof D)k=n.Zj(a,b,c,d,e,p);else if(this.path=== +n){var k=n,r=a,s=d,q=p;if(!1===k.Hg)k=!1;else if(q.multiply(k.transform),s)b:{var t=r,u=q;if(k.Em(t,u))k=!0;else{if(void 0===u&&(u=k.transform,t.Xj(k.U))){k=!0;break b}var q=t.left,r=t.right,s=t.top,t=t.bottom,x=v.L(),w=v.L(),y=v.L(),B=v.rh();B.set(u);B.wE(k.transform);B.Cz();w.x=r;w.y=s;w.transform(B);x.x=q;x.y=s;x.transform(B);u=!1;to(k,x,w,y)?u=!0:(x.x=r,x.y=t,x.transform(B),to(k,x,w,y)?u=!0:(w.x=q,w.y=t,w.transform(B),to(k,x,w,y)?u=!0:(x.x=q,x.y=s,x.transform(B),to(k,x,w,y)&&(u=!0))));v.$e(B); +v.v(x);v.v(w);v.v(y);k=u}}else k=k.Em(r,q)}else k=Fm(n,a,d,p);k&&(null!==b&&(n=b(n)),n&&(null===c||c(n))&&e.add(n));v.$e(p)}}}void 0===f&&v.$e(h);return k||null!==this.background||null!==this.zm}void 0===f&&v.$e(h);return!1};v.u(W,{jc:"isOrthogonal"},function(){return 2===(this.km.value&2)});v.u(W,{sl:"isAvoiding"},function(){return 4===(this.km.value&4)});W.prototype.computeCurve=function(){if(null===this.qi){var a=this.kd,b=this.jc;this.qi=null!==a&&a===this.Sd&&!b}return this.qi?Ni:this.Ke}; +W.prototype.computeCorner=function(){if(this.Ke===Ni)return 0;var a=this.jz;if(isNaN(a)||0>a)a=10;return a};W.prototype.findMidLabel=function(){for(var a=this.path,b=this.ya.n,c=b.length,d=0;d<c;d++){var e=b[d];if(e!==a&&!e.Rf&&(-Infinity===e.ve||isNaN(e.ve)))return e}for(a=this.Sf;a.next();)if(b=a.value,-Infinity===b.ve||isNaN(b.ve))return b;return null}; +W.prototype.computeSpacing=function(){if(!this.isVisible())return 0;var a;a=Math.max(14,this.computeThickness());var b=this.kd,c=this.Sd;if(null!==b&&null!==c){var d=this.findMidLabel();if(null!==d){var e=d.Ha,f=d.margin,h=isNaN(e.width)?30:e.width*d.scale+f.left+f.right,e=isNaN(e.height)?14:e.height*d.scale+f.top+f.bottom,d=d.Vt;d===wo||d===Ip||d===Hp?a=Math.max(a,e):d===$n||d===ao||d===Yn||d===Zn?a=Math.max(a,h):(b=b.Xa(zb).xc(c.Xa(zb))/180*Math.PI,a=Math.max(a,Math.abs(Math.sin(b)*h)+Math.abs(Math.cos(b)* +e)+1));this.Ke===Ni&&(a*=1.333)}}return a};W.prototype.arrangeBundledLinks=function(a,b){if(b)for(var c=0;c<a.length;c++)a[c].ic()};W.prototype.computeCurviness=function(){var a=this.tw;if(isNaN(a)){var a=16,b=this.di;if(null!==b){for(var c=v.jb(),d=0,e=b.links,f=0;f<e.length;f++){var h=e[f],h=h.computeSpacing();c.push(h);d+=h}d=-d/2;for(f=0;f<e.length;f++){h=e[f];if(h===this){a=d+c[f]/2;break}d+=c[f]}b.sp===this.T&&(a=-a);v.sa(c)}}return a}; +W.prototype.computeThickness=function(){if(!this.isVisible())return 0;var a=this.path;return null!==a?Math.max(a.lb,1):1};W.prototype.hasCurviness=function(){return!isNaN(this.tw)||null!==this.di}; +W.prototype.adjustPoints=function(a,b,c,d){var e=this.Qs;if(this.jc){if(e===fn)return!1;e===gn&&(e=en)}switch(e){case fn:var f=this.l(a),h=this.l(c);if(!f.Fc(b)||!h.Fc(d)){var e=f.x,f=f.y,k=h.x-e,l=h.y-f,m=Math.sqrt(k*k+l*l);if(!Hc(m,0)){var n=0;Hc(k,0)?n=0>l?-Math.PI/2:Math.PI/2:(n=Math.atan(l/Math.abs(k)),0>k&&(n=Math.PI-n));var h=b.x,p=b.y,l=d.x-h,q=d.y-p,r=Math.sqrt(l*l+q*q),k=0;Hc(l,0)?k=0>q?-Math.PI/2:Math.PI/2:(k=Math.atan(q/Math.abs(l)),0>l&&(k=Math.PI-k));m=r/m;n=k-n;this.zf(a,b);for(a+= +1;a<c;a++)b=this.l(a),k=b.x-e,l=b.y-f,b=Math.sqrt(k*k+l*l),Hc(b,0)||(q=0,Hc(k,0)?q=0>l?-Math.PI/2:Math.PI/2:(q=Math.atan(l/Math.abs(k)),0>k&&(q=Math.PI-q)),k=q+n,b*=m,this.V(a,h+b*Math.cos(k),p+b*Math.sin(k)));this.zf(c,d)}}return!0;case gn:f=this.l(a);p=this.l(c);if(!f.Fc(b)||!p.Fc(d)){var e=f.x,f=f.y,h=p.x,p=p.y,m=(h-e)*(h-e)+(p-f)*(p-f),k=b.x,n=b.y,l=d.x,q=d.y,r=0,s=1;0!==l-k?(r=(q-n)/(l-k),s=Math.sqrt(1+1/(r*r))):r=9E9;this.zf(a,b);for(a+=1;a<c;a++){b=this.l(a);var t=b.x,u=b.y,x=.5;0!==m&&(x= +((e-t)*(e-h)+(f-u)*(f-p))/m);var w=e+x*(h-e),y=f+x*(p-f);b=Math.sqrt((t-w)*(t-w)+(u-y)*(u-y));u<r*(t-w)+y&&(b=-b);0<r&&(b=-b);t=k+x*(l-k);x=n+x*(q-n);0!==r?(b=t+b/s,this.V(a,b,x-(b-t)/r)):this.V(a,t,x+b)}this.zf(c,d)}return!0;case en:return this.jc&&(e=this.l(a),f=this.l(a+1),h=this.l(a+2),K(e.y,f.y)?K(f.x,h.x)?this.V(a+1,f.x,b.y):K(f.y,h.y)&&this.V(a+1,b.x,f.y):K(e.x,f.x)&&(K(f.y,h.y)?this.V(a+1,b.x,f.y):K(f.x,h.x)&&this.V(a+1,f.x,b.y)),e=this.l(c),f=this.l(c-1),h=this.l(c-2),K(e.y,f.y)?K(f.x,h.x)? +this.V(c-1,f.x,d.y):K(f.y,h.y)&&this.V(c-1,d.x,f.y):K(e.x,f.x)&&(K(f.y,h.y)?this.V(c-1,d.x,f.y):K(f.x,h.x)&&this.V(c-1,f.x,d.y))),this.zf(a,b),this.zf(c,d),!0;default:return!1}}; +W.prototype.addOrthoPoints=function(a,b,c,d,e,f){b=-45<=b&&45>b?0:45<=b&&135>b?90:135<=b&&225>b?180:270;d=-45<=d&&45>d?0:45<=d&&135>d?90:135<=d&&225>d?180:270;var h=e.U.copy(),k=f.U.copy();if(h.G()&&k.G()){h.Qf(8,8);k.Qf(8,8);h.fj(a);k.fj(c);var l,m;if(0===b)if(c.x>a.x||270===d&&c.y<a.y&&k.right>a.x||90===d&&c.y>a.y&&k.right>a.x)l=new z(c.x,a.y),m=new z(c.x,(a.y+c.y)/2),180===d?(l.x=this.computeMidOrthoPosition(a.x,c.x,!1),m.x=l.x,m.y=c.y):270===d&&c.y<a.y||90===d&&c.y>a.y?(l.x=a.x<k.left?this.computeMidOrthoPosition(a.x, +k.left,!1):a.x<k.right&&(270===d&&a.y<k.top||90===d&&a.y>k.bottom)?this.computeMidOrthoPosition(a.x,c.x,!1):k.right,m.x=l.x,m.y=c.y):0===d&&a.x<k.left&&a.y>k.top&&a.y<k.bottom&&(l.x=a.x,l.y=a.y<c.y?Math.min(c.y,k.top):Math.max(c.y,k.bottom),m.y=l.y);else{l=new z(a.x,c.y);m=new z((a.x+c.x)/2,c.y);if(180===d||90===d&&c.y<h.top||270===d&&c.y>h.bottom)180===d&&(k.Fa(a)||h.Fa(c))?l.y=this.computeMidOrthoPosition(a.y,c.y,!0):c.y<a.y&&(180===d||90===d)?l.y=this.computeMidOrthoPosition(h.top,Math.max(c.y, +k.bottom),!0):c.y>a.y&&(180===d||270===d)&&(l.y=this.computeMidOrthoPosition(h.bottom,Math.min(c.y,k.top),!0)),m.x=c.x,m.y=l.y;if(l.y>h.top&&l.y<h.bottom)if(c.x>=h.left&&c.x<=a.x||a.x<=k.right&&a.x>=c.x){if(90===d||270===d)l=new z(Math.max((a.x+c.x)/2,a.x),a.y),m=new z(l.x,c.y)}else l.y=270===d||(0===d||180===d)&&c.y<a.y?Math.min(c.y,0===d?h.top:Math.min(h.top,k.top)):Math.max(c.y,0===d?h.bottom:Math.max(h.bottom,k.bottom)),m.x=c.x,m.y=l.y}else if(180===b)if(c.x<a.x||270===d&&c.y<a.y&&k.left<a.x|| +90===d&&c.y>a.y&&k.left<a.x)l=new z(c.x,a.y),m=new z(c.x,(a.y+c.y)/2),0===d?(l.x=this.computeMidOrthoPosition(a.x,c.x,!1),m.x=l.x,m.y=c.y):270===d&&c.y<a.y||90===d&&c.y>a.y?(l.x=a.x>k.right?this.computeMidOrthoPosition(a.x,k.right,!1):a.x>k.left&&(270===d&&a.y<k.top||90===d&&a.y>k.bottom)?this.computeMidOrthoPosition(a.x,c.x,!1):k.left,m.x=l.x,m.y=c.y):180===d&&a.x>k.right&&a.y>k.top&&a.y<k.bottom&&(l.x=a.x,l.y=a.y<c.y?Math.min(c.y,k.top):Math.max(c.y,k.bottom),m.y=l.y);else{l=new z(a.x,c.y);m=new z((a.x+ +c.x)/2,c.y);if(0===d||90===d&&c.y<h.top||270===d&&c.y>h.bottom)0===d&&(k.Fa(a)||h.Fa(c))?l.y=this.computeMidOrthoPosition(a.y,c.y,!0):c.y<a.y&&(0===d||90===d)?l.y=this.computeMidOrthoPosition(h.top,Math.max(c.y,k.bottom),!0):c.y>a.y&&(0===d||270===d)&&(l.y=this.computeMidOrthoPosition(h.bottom,Math.min(c.y,k.top),!0)),m.x=c.x,m.y=l.y;if(l.y>h.top&&l.y<h.bottom)if(c.x<=h.right&&c.x>=a.x||a.x>=k.left&&a.x<=c.x){if(90===d||270===d)l=new z(Math.min((a.x+c.x)/2,a.x),a.y),m=new z(l.x,c.y)}else l.y=270=== +d||(0===d||180===d)&&c.y<a.y?Math.min(c.y,180===d?h.top:Math.min(h.top,k.top)):Math.max(c.y,180===d?h.bottom:Math.max(h.bottom,k.bottom)),m.x=c.x,m.y=l.y}else if(90===b)if(c.y>a.y||180===d&&c.x<a.x&&k.bottom>a.y||0===d&&c.x>a.x&&k.bottom>a.y)l=new z(a.x,c.y),m=new z((a.x+c.x)/2,c.y),270===d?(l.y=this.computeMidOrthoPosition(a.y,c.y,!0),m.x=c.x,m.y=l.y):180===d&&c.x<a.x||0===d&&c.x>a.x?(l.y=a.y<k.top?this.computeMidOrthoPosition(a.y,k.top,!0):a.y<k.bottom&&(180===d&&a.x<k.left||0===d&&a.x>k.right)? +this.computeMidOrthoPosition(a.y,c.y,!0):k.bottom,m.x=c.x,m.y=l.y):90===d&&a.y<k.top&&a.x>k.left&&a.x<k.right&&(l.x=a.x<c.x?Math.min(c.x,k.left):Math.max(c.x,k.right),l.y=a.y,m.x=l.x);else{l=new z(c.x,a.y);m=new z(c.x,(a.y+c.y)/2);if(270===d||0===d&&c.x<h.left||180===d&&c.x>h.right)270===d&&(k.Fa(a)||h.Fa(c))?l.x=this.computeMidOrthoPosition(a.x,c.x,!1):c.x<a.x&&(270===d||0===d)?l.x=this.computeMidOrthoPosition(h.left,Math.max(c.x,k.right),!1):c.x>a.x&&(270===d||180===d)&&(l.x=this.computeMidOrthoPosition(h.right, +Math.min(c.x,k.left),!1)),m.x=l.x,m.y=c.y;if(l.x>h.left&&l.x<h.right)if(c.y>=h.top&&c.y<=a.y||a.y<=k.bottom&&a.y>=c.y){if(0===d||180===d)l=new z(a.x,Math.max((a.y+c.y)/2,a.y)),m=new z(c.x,l.y)}else l.x=180===d||(90===d||270===d)&&c.x<a.x?Math.min(c.x,90===d?h.left:Math.min(h.left,k.left)):Math.max(c.x,90===d?h.right:Math.max(h.right,k.right)),m.x=l.x,m.y=c.y}else if(c.y<a.y||180===d&&c.x<a.x&&k.top<a.y||0===d&&c.x>a.x&&k.top<a.y)l=new z(a.x,c.y),m=new z((a.x+c.x)/2,c.y),90===d?(l.y=this.computeMidOrthoPosition(a.y, +c.y,!0),m.x=c.x,m.y=l.y):180===d&&c.x<a.x||0===d&&c.x>=a.x?(l.y=a.y>k.bottom?this.computeMidOrthoPosition(a.y,k.bottom,!0):a.y>k.top&&(180===d&&a.x<k.left||0===d&&a.x>k.right)?this.computeMidOrthoPosition(a.y,c.y,!0):k.top,m.x=c.x,m.y=l.y):270===d&&a.y>k.bottom&&a.x>k.left&&a.x<k.right&&(l.x=a.x<c.x?Math.min(c.x,k.left):Math.max(c.x,k.right),l.y=a.y,m.x=l.x);else{l=new z(c.x,a.y);m=new z(c.x,(a.y+c.y)/2);if(90===d||0===d&&c.x<h.left||180===d&&c.x>h.right)90===d&&(k.Fa(a)||h.Fa(c))?l.x=this.computeMidOrthoPosition(a.x, +c.x,!1):c.x<a.x&&(90===d||0===d)?l.x=this.computeMidOrthoPosition(h.left,Math.max(c.x,k.right),!1):c.x>a.x&&(90===d||180===d)&&(l.x=this.computeMidOrthoPosition(h.right,Math.min(c.x,k.left),!1)),m.x=l.x,m.y=c.y;if(l.x>h.left&&l.x<h.right)if(c.y<=h.bottom&&c.y>=a.y||a.y>=k.top&&a.y<=c.y){if(0===d||180===d)l=new z(a.x,Math.min((a.y+c.y)/2,a.y)),m=new z(c.x,l.y)}else l.x=180===d||(90===d||270===d)&&c.x<a.x?Math.min(c.x,270===d?h.left:Math.min(h.left,k.left)):Math.max(c.x,270===d?h.right:Math.max(h.right, +k.right)),m.x=l.x,m.y=c.y}var n=l,p=m;if(this.sl){var q=this.g,r;(r=null===q)||(q.Na.df?r=!1:(r=q.Wa,r=r instanceof Zg?!r.Xv||r.oH:!0),r=!r);if(r||h.Fa(c)&&!f.Yh(e)||k.Fa(a)&&!e.Yh(f)||e===f||this.layer.Gc)a=!1;else if(e=cm(q,!0,this.Sa,null),e.hp(Math.min(a.x,n.x),Math.min(a.y,n.y),Math.abs(a.x-n.x),Math.abs(a.y-n.y))&&e.hp(Math.min(n.x,p.x),Math.min(n.y,p.y),Math.abs(n.x-p.x),Math.abs(n.y-p.y))&&e.hp(Math.min(p.x,c.x),Math.min(p.y,c.y),Math.abs(p.x-c.x),Math.abs(p.y-c.y)))a=!1;else if(h=h.copy().bi(k), +h.Qf(2*e.Lo,2*e.Jo),Xp(e,a,b,c,d,h),k=Yp(e,c.x,c.y),e.abort||999999!==k||(fm(e),k=e.aF,h.Qf(e.Lo*k,e.Jo*k),Xp(e,a,b,c,d,h),k=Yp(e,c.x,c.y)),e.abort||999999!==k||(fm(e),k=e.pE,h.Qf(e.Lo*k,e.Jo*k),Xp(e,a,b,c,d,h),k=Yp(e,c.x,c.y)),!e.abort&&999999===k&&e.tF&&(fm(e),Xp(e,a,b,c,d,e.mb),k=Yp(e,c.x,c.y)),!e.abort&&999999>k&&0!==Yp(e,c.x,c.y)){Zp(this,e,c.x,c.y,d,!0);d=this.l(2);if(4>this.oa)0===b||180===b?(d.x=a.x,d.y=c.y):(d.x=c.x,d.y=a.y),this.V(2,d.x,d.y),this.w(3,d.x,d.y);else if(c=this.l(3),0===b|| +180===b)K(d.x,c.x)?(b=0===b?Math.max(d.x,a.x):Math.min(d.x,a.x),this.V(2,b,a.y),this.V(3,b,c.y)):K(d.y,c.y)?(Math.abs(a.y-d.y)<=e.Jo/2&&(this.V(2,d.x,a.y),this.V(3,c.x,a.y)),this.w(2,d.x,a.y)):this.V(2,a.x,d.y);else if(90===b||270===b)K(d.y,c.y)?(b=90===b?Math.max(d.y,a.y):Math.min(d.y,a.y),this.V(2,a.x,b),this.V(3,c.x,b)):K(d.x,c.x)?(Math.abs(a.x-d.x)<=e.Lo/2&&(this.V(2,a.x,d.y),this.V(3,a.x,c.y)),this.w(2,a.x,d.y)):this.V(2,d.x,a.y);a=!0}else a=!1}else a=!1;a||(this.Th(l),this.Th(m))}}; +W.prototype.computeMidOrthoPosition=function(a,b){if(this.hasCurviness()){var c=this.computeCurviness();return(a+b)/2+c}return(a+b)/2};function Oh(a){if(null===a.g||!a.sl)return!1;var b=a.points.n,c=b.length;if(4>c)return!1;a=cm(a.g,!0,a.Sa,null);for(var d=1;d<c-2;d++){var e=b[d],f=b[d+1];if(!a.hp(Math.min(e.x,f.x),Math.min(e.y,f.y),Math.abs(e.x-f.x),Math.abs(e.y-f.y)))return!0}return!1} +function Zp(a,b,c,d,e,f){var h=b.Lo,k=b.Jo,l=Yp(b,c,d),m=c,n=d;for(0===e?m+=h:90===e?n+=k:180===e?m-=h:n-=k;1<l&&Yp(b,m,n)===l-1;)c=m,d=n,0===e?m+=h:90===e?n+=k:180===e?m-=h:n-=k,l-=1;if(f){if(1<l)if(180===e||0===e)c=Math.floor(c/h)*h+h/2;else if(90===e||270===e)d=Math.floor(d/k)*k+k/2}else c=Math.floor(c/h)*h+h/2,d=Math.floor(d/k)*k+k/2;1<l&&(f=e,m=c,n=d,0===e?(f=90,n+=k):90===e?(f=180,m-=h):180===e?(f=270,n-=k):270===e&&(f=0,m+=h),Yp(b,m,n)===l-1?Zp(a,b,m,n,f,!1):(m=c,n=d,0===e?(f=270,n-=k):90=== +e?(f=0,m+=h):180===e?(f=90,n+=k):270===e&&(f=180,m-=h),Yp(b,m,n)===l-1&&Zp(a,b,m,n,f,!1)));a.$k(c,d)}W.prototype.findClosestSegment=function(a){var b=a.x;a=a.y;for(var c=this.l(0),d=this.l(1),e=Sa(b,a,c.x,c.y,d.x,d.y),f=0,h=1;h<this.oa-1;h++){var c=this.l(h+1),k=Sa(b,a,d.x,d.y,c.x,c.y),d=c;k<e&&(f=h,e=k)}return f};W.prototype.invalidateGeometry=W.prototype.ce=function(){this.bb=null};v.u(W,{fh:"geometry"},function(){null===this.bb&&(this.en(),this.bb=this.makeGeometry());return this.bb}); +W.prototype.Tm=function(a){if(!a){if(!1===this.rg)return;a=this.Ye();if(null!==this.bb&&(null===a||null!==a.fh))return}this.bb=this.makeGeometry();a=this.path;if(null!==a){a.bb=this.bb;for(var b=this.ya.n,c=b.length,d=0;d<c;d++){var e=b[d];e!==a&&e.Rf&&e instanceof Y&&(e.bb=this.bb)}}}; +W.prototype.makeGeometry=function(){var a=this.oa;if(2>a){var b=new ve(Fe),c=new Ge(0,0);b.Ub.add(c);return b}var d=!1,b=this.g;null!==b&&Mp(this)&&b.yk.contains(this)&&null!==this.Hv&&(d=!0);var c=b=0,e=this.l(0).copy(),f=e.copy(),b=this.Zc.n,h=this.computeCurve();if(h===Ni&&3<=a&&!Hc(this.Hp,0))if(3===a)var k=this.l(1),b=Math.min(e.x,k.x),c=Math.min(e.y,k.y),k=this.l(2),b=Math.min(b,k.x),c=Math.min(c,k.y);else{if(this.jc)for(k=0;k<a;k++)c=b[k],f.x=Math.min(c.x,f.x),f.y=Math.min(c.y,f.y);else for(k= +3;k<a;k+=3)k+3>=a&&(k=a-1),b=this.l(k),f.x=Math.min(b.x,f.x),f.y=Math.min(b.y,f.y);b=f.x;c=f.y}else{for(k=0;k<a;k++)c=b[k],f.x=Math.min(c.x,f.x),f.y=Math.min(c.y,f.y);b=f.x;c=f.y}b-=this.Py.x;c-=this.Py.y;e.x-=b;e.y-=c;if(2===a){var l=this.l(1).copy();l.x-=b;l.y-=c;0!==Vp(this)&&$p(this,e,!0,f);0!==Wp(this)&&$p(this,l,!1,f);b=new ve(Ie);b.Aa=e.x;b.xa=e.y;b.I=l.x;b.J=l.y}else{l=v.s();0!==Vp(this)&&$p(this,e,!0,f);N(l,e.x,e.y,!1,!1);if(h===Ni&&3<=a&&!Hc(this.Hp,0))if(3===a)k=this.l(1),a=k.x-b,d=k.y- +c,k=this.l(2).copy(),k.x-=b,k.y-=c,0!==Wp(this)&&$p(this,k,!1,f),O(l,a,d,a,d,k.x,k.y);else if(this.jc){for(var f=new z(b,c),e=this.l(1).copy(),h=new z(b,c),a=new z(b,c),d=this.l(0),m=null,n=this.Hp/3,k=1;k<this.oa-1;k++){var m=this.l(k),p=d,q=m,r=this.l(aq(this,m,k,!1));if(!Hc(p.x,q.x)||!Hc(q.x,r.x))if(!Hc(p.y,q.y)||!Hc(q.y,r.y)){var s=n,t=h,u=a;isNaN(s)&&(s=this.Hp/3);var x=p.x,p=p.y,w=q.x,q=q.y,y=r.x,r=r.y,B=s*bq(x,p,w,q),s=s*bq(w,q,y,r);Hc(p,q)&&Hc(w,y)&&(w>x?r>q?(t.x=w-B,t.y=q-B,u.x=w+s,u.y=q+ +s):(t.x=w-B,t.y=q+B,u.x=w+s,u.y=q-s):r>q?(t.x=w+B,t.y=q-B,u.x=w-s,u.y=q+s):(t.x=w+B,t.y=q+B,u.x=w-s,u.y=q-s));Hc(x,w)&&Hc(q,r)&&(q>p?(y>w?(t.x=w-B,t.y=q-B,u.x=w+s):(t.x=w+B,t.y=q-B,u.x=w-s),u.y=q+s):(y>w?(t.x=w-B,t.y=q+B,u.x=w+s):(t.x=w+B,t.y=q+B,u.x=w-s),u.y=q-s));if(Hc(x,w)&&Hc(w,y)||Hc(p,q)&&Hc(q,r))x=.5*(x+y),p=.5*(p+r),t.x=x,t.y=p,u.x=x,u.y=p;1===k?(e.x=.5*(d.x+m.x),e.y=.5*(d.y+m.y)):2===k&&Hc(d.x,this.l(0).x)&&Hc(d.y,this.l(0).y)&&(e.x=.5*(d.x+m.x),e.y=.5*(d.y+m.y));O(l,e.x-b,e.y-c,h.x-b,h.y- +c,m.x-b,m.y-c);f.set(h);e.set(a);d=m}}k=d.x;d=d.y;f=this.l(this.oa-1);k=.5*(k+f.x);d=.5*(d+f.y);O(l,a.x-b,a.y-c,k-b,d-c,f.x-b,f.y-c)}else for(k=3;k<a;k+=3)d=this.l(k-2),k+3>=a&&(k=a-1),f=this.l(k-1),e=this.l(k),k===a-1&&0!==Wp(this)&&(e=e.copy(),$p(this,e,!1,ad)),O(l,d.x-b,d.y-c,f.x-b,f.y-c,e.x-b,e.y-c);else{f=v.L();f.assign(this.l(0));for(k=1;k<a;){k=aq(this,f,k,1<k);t=this.l(k);if(k>=a-1){f!==t&&(0!==Wp(this)&&(t=t.copy(),$p(this,t,!1,ad)),cq(this,l,-b,-c,f,t,d));break}k=aq(this,t,k+1,k<a-3);e= +l;h=-b;m=-c;n=f;u=this.l(k);x=f;p=d;K(n.y,t.y)&&K(t.x,u.x)?(s=this.computeCorner(),s=Math.min(s,Math.abs(t.x-n.x)/2),s=w=Math.min(s,Math.abs(u.y-t.y)/2),K(s,0)?(cq(this,e,h,m,n,t,p),x.assign(t)):(q=t.x,y=t.y,r=q,B=y,q=t.x>n.x?t.x-s:t.x+s,B=u.y>t.y?t.y+w:t.y-w,cq(this,e,h,m,n,new z(q,y),p),af(e,t.x+h,t.y+m,r+h,B+m),x.m(r,B))):K(n.x,t.x)&&K(t.y,u.y)?(s=this.computeCorner(),w=Math.min(s,Math.abs(t.y-n.y)/2),w=s=Math.min(w,Math.abs(u.x-t.x)/2),K(s,0)?(cq(this,e,h,m,n,t,p),x.assign(t)):(q=t.x,B=y=t.y, +y=t.y>n.y?t.y-w:t.y+w,r=u.x>t.x?t.x+s:t.x-s,cq(this,e,h,m,n,new z(q,y),p),af(e,t.x+h,t.y+m,r+h,B+m),x.m(r,B))):(cq(this,e,h,m,n,t,p),x.assign(t))}v.v(f)}b=l.o;v.q(l)}return b};function bq(a,b,c,d){a=c-a;if(isNaN(a)||Infinity===a||-Infinity===a)return NaN;0>a&&(a=-a);b=d-b;if(isNaN(b)||Infinity===b||-Infinity===b)return NaN;0>b&&(b=-b);return Hc(a,0)?b:Hc(b,0)?a:Math.sqrt(a*a+b*b)} +function $p(a,b,c,d){var e=a.oa;if(!(2>e))if(c){var f=a.l(1);c=f.x-d.x;d=f.y-d.y;f=bq(b.x,b.y,c,d);0!==f&&(e=2===e?.5*f:f,a=Vp(a),a>e&&(a=e),c=a*(c-b.x)/f,a=a*(d-b.y)/f,b.x+=c,b.y+=a)}else f=a.l(e-2),c=f.x-d.x,d=f.y-d.y,f=bq(b.x,b.y,c,d),0!==f&&(e=2===e?.5*f:f,a=Wp(a),a>e&&(a=e),c=a*(b.x-c)/f,a=a*(b.y-d)/f,b.x-=c,b.y-=a)} +function aq(a,b,c,d){for(var e=a.oa,f=b;Hc(b.x,f.x)&&Hc(b.y,f.y);){if(c>=e)return e-1;f=a.l(c++)}if(!Hc(b.x,f.x)&&!Hc(b.y,f.y))return c-1;for(var h=f;Hc(b.x,f.x)&&Hc(f.x,h.x)&&(!d||(b.y>=f.y?f.y>=h.y:f.y<=h.y))||Hc(b.y,f.y)&&Hc(f.y,h.y)&&(!d||(b.x>=f.x?f.x>=h.x:f.x<=h.x));){if(c>=e)return e-1;h=a.l(c++)}return c-2} +function cq(a,b,c,d,e,f,h){if(!h&&Mp(a)){h=[];var k=0;a.isVisible()&&(k=dq(a,e,f,h));var l=e.x,l=e.y;if(0<k)if(K(e.y,f.y))if(e.x<f.x)for(var m=0;m<k;){var n=Math.max(e.x,Math.min(h[m++]-5,f.x-10));b.lineTo(n+c,f.y+d);for(var l=n+c,p=Math.min(n+10,f.x);m<k;){var q=h[m];if(q<p+10)m++,p=Math.min(q+5,f.x);else break}q=(n+p)/2+c;q=f.y-10+d;n=p+c;p=f.y+d;a.Ke===Fi?N(b,n,p,!1,!1):O(b,l,q,n,q,n,p)}else for(m=k-1;0<=m;){n=Math.min(e.x,Math.max(h[m--]+5,f.x+10));b.lineTo(n+c,f.y+d);l=n+c;for(p=Math.max(n-10, +f.x);0<=m;)if(q=h[m],q>p-10)m--,p=Math.max(q-5,f.x);else break;q=f.y-10+d;n=p+c;p=f.y+d;a.Ke===Fi?N(b,n,p,!1,!1):O(b,l,q,n,q,n,p)}else if(K(e.x,f.x))if(e.y<f.y)for(m=0;m<k;){n=Math.max(e.y,Math.min(h[m++]-5,f.y-10));b.lineTo(f.x+c,n+d);l=n+d;for(p=Math.min(n+10,f.y);m<k;)if(q=h[m],q<p+10)m++,p=Math.min(q+5,f.y);else break;q=f.x-10+c;n=f.x+c;p+=d;a.Ke===Fi?N(b,n,p,!1,!1):O(b,q,l,q,p,n,p)}else for(m=k-1;0<=m;){n=Math.min(e.y,Math.max(h[m--]+5,f.y+10));b.lineTo(f.x+c,n+d);l=n+d;for(p=Math.max(n-10,f.y);0<= +m;)if(q=h[m],q>p-10)m--,p=Math.max(q-5,f.y);else break;q=f.x-10+c;n=f.x+c;p+=d;a.Ke===Fi?N(b,n,p,!1,!1):O(b,q,l,q,p,n,p)}}b.lineTo(f.x+c,f.y+d)} +function dq(a,b,c,d){var e=a.g;if(null===e||b.K(c))return 0;for(e=e.Pw;e.next();){var f=e.value;if(null!==f&&f.visible)for(var f=f.wb.n,h=f.length,k=0;k<h;k++){var l=f[k];if(l instanceof W){if(l===a)return 0<d.length&&d.sort(function(a,b){return a-b}),d.length;if(l.isVisible()&&Mp(l)){var m=l.Zm;m.G()&&a.Zm.yg(m)&&!a.usesSamePort(l)&&(m=l.path,null!==m&&m.Zi()&&eq(b,c,d,l))}}}}0<d.length&&d.sort(function(a,b){return a-b});return d.length} +function eq(a,b,c,d){for(var e=K(a.y,b.y),f=d.oa,h=d.l(0),k=v.L(),l=1;l<f;l++){var m=d.l(l);if(l<f-1){var n=d.l(l+1);if(h.y===m.y&&m.y===n.y){if(m.x>h.x&&n.x>m.x||m.x<h.x&&n.x<m.x)m=n,l++}else h.x===m.x&&m.x===n.x&&(m.y>h.y&&n.y>m.y||m.y<h.y&&n.y<m.y)&&(m=n,l++)}a:{var n=k,p=a.x,q=a.y,r=b.x,s=b.y,t=h.x,h=h.y,u=m.x,x=m.y;if(!K(p,r)){if(K(q,s)&&K(t,u)&&Math.min(p,r)<t&&Math.max(p,r)>t&&Math.min(h,x)<q&&Math.max(h,x)>q&&!K(h,x)){n.x=t;n.y=q;n=!0;break a}}else if(!K(q,s)&&K(h,x)&&Math.min(q,s)<h&&Math.max(q, +s)>h&&Math.min(t,u)<p&&Math.max(t,u)>p&&!K(t,u)){n.x=p;n.y=h;n=!0;break a}n.x=0;n.y=0;n=!1}n&&(e?c.push(k.x):c.push(k.y));h=m}v.v(k)}v.u(W,{it:"firstPickIndex"},function(){return 2>=this.oa?0:this.jc||Pp(this)!==qb?1:0});v.u(W,{Ow:"lastPickIndex"},function(){var a=this.oa;return 0===a?0:2>=a?a-1:this.jc||Qp(this)!==qb?a-2:a-1});function Mp(a){a=a.Ke;return a===Ei||a===Fi}function Op(a,b){if(b||Mp(a)){var c=a.g;null===c||c.yk.contains(a)||null===a.Hv||c.yk.add(a,a.Hv)}} +function Hi(a,b){var c=a.layer;if(null!==c&&c.visible&&!c.Gc){var d=c.g;if(null!==d)for(var e=!1,d=d.Pw;d.next();){var f=d.value;if(f.visible)if(f===c)for(var e=!0,h=!1,f=f.wb.n,k=f.length,l=0;l<k;l++){var m=f[l];m instanceof W&&(m===a?h=!0:h&&fq(a,m,b))}else if(e)for(f=f.wb.n,k=f.length,l=0;l<k;l++)m=f[l],m instanceof W&&fq(a,m,b)}}}function fq(a,b,c){if(null!==b&&null!==b.bb&&Mp(b)){var d=b.Zm;d.G()&&(a.Zm.yg(d)||c.yg(d))&&(a.usesSamePort(b)||b.ce())}} +W.prototype.usesSamePort=function(a){var b=this.oa,c=a.oa;if(0<b&&0<c){var d=this.l(0),e=a.l(0);if(d.Fc(e))return!0;b=this.l(b-1);a=a.l(c-1);if(b.Fc(a)||d.Fc(a)||b.Fc(e))return!0}else if(this.T===a.T||this.Z===a.Z||this.T===a.Z||this.Z===a.T)return!0;return!1}; +W.prototype.isVisible=function(){if(!R.prototype.isVisible.call(this))return!1;var a=this.Sa,b=!0,c=this.g;null!==c&&(b=c.Pd);c=this.T;if(null!==c){if(this.Hc&&b&&!c.md)return!1;if(c===a)return!0;c=c.findVisibleNode();if(null===c||c===a)return!1}c=this.Z;if(null!==c){if(this.Hc&&!b&&!c.md)return!1;if(c===a)return!0;b=c.findVisibleNode();if(null===b||b===a)return!1}return!0};W.prototype.nd=function(a){R.prototype.nd.call(this,a);null!==this.di&&this.di.dp();if(null!==this.Ce)for(var b=this.Ce.i;b.next();)b.value.nd(a)}; +v.defineProperty(W,{Qs:"adjusting"},function(){return this.Rp},function(a){var b=this.Rp;b!==a&&(this.Rp=a,this.h("adjusting",b,a))});v.defineProperty(W,{jz:"corner"},function(){return this.kq},function(a){var b=this.kq;b!==a&&(this.kq=a,this.ce(),this.h("corner",b,a))});v.defineProperty(W,{Ke:"curve"},function(){return this.nq},function(a){var b=this.nq;b!==a&&(this.nq=a,this.ic(),this.ce(),Op(this,b===Fi||b===Ei||a===Fi||a===Ei),this.h("curve",b,a))}); +v.defineProperty(W,{tw:"curviness"},function(){return this.oq},function(a){var b=this.oq;b!==a&&(this.oq=a,this.ic(),this.ce(),this.h("curviness",b,a))});v.defineProperty(W,{ix:"routing"},function(){return this.km},function(a){var b=this.km;b!==a&&(this.km=a,this.qi=null,this.ic(),Op(this,2===(b.value&2)||2===(a.value&2)),this.h("routing",b,a))});v.defineProperty(W,{Hp:"smoothness"},function(){return this.ss},function(a){var b=this.ss;b!==a&&(this.ss=a,this.ce(),this.h("smoothness",b,a))}); +function Kp(a){var b=a.eg;if(null!==b){var c=a.qg;if(null!==c){var d=a.Bh;a=a.Sh;for(var e=null,f=null,h=b.ec.n,k=h.length,l=0;l<k;l++){var m=h[l];if(m.eg===b&&m.Bh===d&&m.qg===c&&m.Sh===a||m.eg===c&&m.Bh===a&&m.qg===b&&m.Sh===d)null===f?f=m:(null===e&&(e=[],e.push(f)),e.push(m))}if(null!==e){f=xp(b,c,d,a);null===f&&(f=new pk,f.sp=b,f.Xw=d,f.Jt=c,f.Yw=a,wp(b,f),wp(c,f));f.links=e;for(l=0;l<e.length;l++)m=e[l],m.di=f;f.dp()}}}} +function Jp(a){var b=a.di;null!==b&&(a.di=null,a=b.links.indexOf(a),0<=a&&(v.Uh(b.links,a),b.dp()))}function pk(){v.dc(this);this.fv=!1;this.Yw=this.Jt=this.Xw=this.sp=null;this.links=[]}pk.prototype.dp=function(){if(!this.fv){var a=this.links;0<a.length&&(a=a[0].g,null!==a&&a.KB.add(this))}this.fv=!0}; +pk.prototype.AA=function(){if(this.fv){this.fv=!1;var a=this.links;if(0<a.length){var b=a[0],c=b.g;b.arrangeBundledLinks(a,null===c||c.Qm);1===a.length&&(b.di=null,a.length=0)}0===a.length&&(a=this.sp,null!==this&&null!==a.uh&&a.uh.remove(this),a=this.Jt,null!==this&&null!==a.uh&&a.uh.remove(this))}};v.Kd(pk,{sp:!0,Xw:!0,Jt:!0,Yw:!0,links:!0,spacing:!0}); +function dm(){v.dc(this);this.rA=this.group=null;this.st=!0;this.abort=!1;this.lg=this.kg=1;this.nr=this.mr=-1;this.ie=this.he=8;this.oc=null;this.tF=!1;this.aF=22;this.pE=111}v.Kd(dm,{group:!0,rA:!0,st:!0,abort:!0,tF:!0,aF:!0,pE:!0}); +dm.prototype.initialize=function(a){if(!(0>=a.width||0>=a.height)){var b=a.y,c=a.x+a.width,d=a.y+a.height;this.kg=Math.floor((a.x-this.he)/this.he)*this.he;this.lg=Math.floor((b-this.ie)/this.ie)*this.ie;this.mr=Math.ceil((c+2*this.he)/this.he)*this.he;this.nr=Math.ceil((d+2*this.ie)/this.ie)*this.ie;a=1+(Math.ceil((this.mr-this.kg)/this.he)|0);b=1+(Math.ceil((this.nr-this.lg)/this.ie)|0);if(null===this.oc||this.Do<a-1||this.Eo<b-1){c=[];for(d=0;d<=a;d++){for(var e=[],f=0;f<=b;f++)e[f]=0;c[d]=e}this.oc= +c;this.Do=a-1;this.Eo=b-1}if(null!==this.oc)for(a=0;a<=this.Do;a++)for(b=0;b<=this.Eo;b++)this.oc[a][b]=999999}};v.u(dm,{mb:null},function(){return new A(this.kg,this.lg,this.mr-this.kg,this.nr-this.lg)});v.defineProperty(dm,{Lo:null},function(){return this.he},function(a){0<a&&a!==this.he&&(this.he=a,this.initialize(this.mb))});v.defineProperty(dm,{Jo:null},function(){return this.ie},function(a){0<a&&a!==this.ie&&(this.ie=a,this.initialize(this.mb))}); +function gq(a,b,c){return a.kg<=b&&b<=a.mr&&a.lg<=c&&c<=a.nr}function Yp(a,b,c){if(!gq(a,b,c))return 0;b-=a.kg;b/=a.he;c-=a.lg;c/=a.ie;return a.oc[b|0][c|0]}function gm(a,b,c){gq(a,b,c)&&(b-=a.kg,b/=a.he,c-=a.lg,c/=a.ie,a.oc[b|0][c|0]=0)}function fm(a){if(null!==a.oc)for(var b=0;b<=a.Do;b++)for(var c=0;c<=a.Eo;c++)1<=a.oc[b][c]&&(a.oc[b][c]|=999999)} +dm.prototype.hp=function(a,b,c,d){if(a>this.mr||a+c<this.kg||b>this.nr||b+d<this.lg)return!0;a=(a-this.kg)/this.he|0;b=(b-this.lg)/this.ie|0;c=Math.max(0,c)/this.he+1|0;var e=Math.max(0,d)/this.ie+1|0;0>a&&(c+=a,a=0);0>b&&(e+=b,b=0);if(0>c||0>e)return!0;d=Math.min(a+c-1,this.Do)|0;for(c=Math.min(b+e-1,this.Eo)|0;a<=d;a++)for(e=b;e<=c;e++)if(0===this.oc[a][e])return!1;return!0}; +function hq(a,b,c,d,e,f,h,k,l){if(!(b<f||b>h||c<k||c>l)){var m,n;m=b|0;n=c|0;var p=a.oc[m][n];if(1<=p&&999999>p)for(e?n+=d:m+=d,p+=1;f<=m&&m<=h&&k<=n&&n<=l&&!(p>=a.oc[m][n]);)a.oc[m][n]=p,p+=1,e?n+=d:m+=d;m=e?n:m;if(e)if(0<d)for(c+=d;c<m;c+=d)hq(a,b,c,1,!e,f,h,k,l),hq(a,b,c,-1,!e,f,h,k,l);else for(c+=d;c>m;c+=d)hq(a,b,c,1,!e,f,h,k,l),hq(a,b,c,-1,!e,f,h,k,l);else if(0<d)for(b+=d;b<m;b+=d)hq(a,b,c,1,!e,f,h,k,l),hq(a,b,c,-1,!e,f,h,k,l);else for(b+=d;b>m;b+=d)hq(a,b,c,1,!e,f,h,k,l),hq(a,b,c,-1,!e,f,h, +k,l)}}function iq(a,b,c,d,e,f,h,k,l,m,n){for(var p=b|0,q=c|0,r=a.oc[p][q];0===r&&p>k&&p<l&&q>m&&q<n;)if(h?q+=f:p+=f,r=a.oc[p][q],1>=Math.abs(p-d)&&1>=Math.abs(q-e))return a.abort=!0,0;p=b|0;q=c|0;r=a.oc[p][q];b=1;for(a.oc[p][q]=b;0===r&&p>k&&p<l&&q>m&&q<n;)h?q+=f:p+=f,r=a.oc[p][q],a.oc[p][q]=b,b+=1;return h?q:p} +function Xp(a,b,c,d,e,f){if(null!==a.oc){a.abort=!1;var h=b.x,k=b.y;if(gq(a,h,k)){var h=h-a.kg,h=h/a.he,k=k-a.lg,k=k/a.ie,l=d.x,m=d.y;if(gq(a,l,m))if(l-=a.kg,l/=a.he,m-=a.lg,m/=a.ie,1>=Math.abs(h-l)&&1>=Math.abs(k-m))a.abort=!0;else{var n=f.x;b=f.y;d=f.x+f.width;var p=f.y+f.height,n=n-a.kg,n=n/a.he;b-=a.lg;b/=a.ie;d-=a.kg;d/=a.he;p-=a.lg;p/=a.ie;f=Math.max(0,Math.min(a.Do,n|0));d=Math.min(a.Do,Math.max(0,d|0));b=Math.max(0,Math.min(a.Eo,b|0));var p=Math.min(a.Eo,Math.max(0,p|0)),h=h|0,k=k|0,l=l|0, +m=m|0,n=h,q=k,r=0===c||90===c?1:-1;(c=90===c||270===c)?q=iq(a,h,k,l,m,r,c,f,d,b,p):n=iq(a,h,k,l,m,r,c,f,d,b,p);if(!a.abort){a:{c=0===e||90===e?1:-1;e=90===e||270===e;for(var r=l|0,s=m|0,t=a.oc[r][s];0===t&&r>f&&r<d&&s>b&&s<p;)if(e?s+=c:r+=c,t=a.oc[r][s],1>=Math.abs(r-h)&&1>=Math.abs(s-k)){a.abort=!0;break a}r=l|0;s=m|0;t=a.oc[r][s];for(a.oc[r][s]=999999;0===t&&r>f&&r<d&&s>b&&s<p;)e?s+=c:r+=c,t=a.oc[r][s],a.oc[r][s]=999999}a.abort||(hq(a,n,q,1,!1,f,d,b,p),hq(a,n,q,-1,!1,f,d,b,p),hq(a,n,q,1,!0,f,d, +b,p),hq(a,n,q,-1,!0,f,d,b,p))}}}}}function Tp(){v.dc(this);this.port=this.Jc=null;this.Xf=[];this.rp=!1}v.Kd(Tp,{Jc:!0,port:!0,Xf:!0,rp:!0});Tp.prototype.toString=function(){for(var a=this.Xf,b=this.Jc.toString()+" "+a.length.toString()+":",c=0;c<a.length;c++){var d=a[c];null!==d&&(b+="\n "+d.toString())}return b}; +function jq(a,b,c,d){b=b.offsetY;switch(b){case v.Wc:return 90;case v.Nc:return 180;case v.dd:return 270;case v.Xc:return 0}switch(b){case v.Wc|v.dd:return 180<c?270:90;case v.Nc|v.Xc:return 90<c&&270>=c?180:0}a=180*Math.atan2(a.height,a.width)/Math.PI;switch(b){case v.Nc|v.dd:return c>a&&c<=180+a?180:270;case v.dd|v.Xc:return c>180-a&&c<=360-a?270:0;case v.Xc|v.Wc:return c>a&&c<=180+a?90:0;case v.Wc|v.Nc:return c>180-a&&c<=360-a?180:90;case v.Nc|v.dd|v.Xc:return 90<c&&c<=180+a?180:c>180+a&&c<=360- +a?270:0;case v.dd|v.Xc|v.Wc:return 180<c&&c<=360-a?270:c>a&&180>=c?90:0;case v.Xc|v.Wc|v.Nc:return c>a&&c<=180-a?90:c>180-a&&270>=c?180:0;case v.Wc|v.Nc|v.dd:return c>180-a&&c<=180+a?180:c>180+a?270:90}d&&b!==(v.Nc|v.dd|v.Xc|v.Wc)&&(c-=15,0>c&&(c+=360));return c>a&&c<180-a?90:c>=180-a&&c<=180+a?180:c>180+a&&c<360-a?270:0}Tp.prototype.dp=function(){this.Xf.length=0}; +function Up(a,b){var c=a.Xf;if(0===c.length){a:if(!a.rp){c=a.rp;a.rp=!0;var d,e=null,f=a.Jc,f=f instanceof V?f:null;if(null===f||f.ee)d=a.Jc.JD(a.port.Rd);else{if(!f.U.G()){a.rp=c;break a}e=f;d=e.HD()}var h=a.Xf.length=0,k=a.port.Xa(rb,v.L()),l=a.port.Xa(Eb,v.L()),f=v.hk(k.x,k.y,0,0);f.fj(l);v.v(k);v.v(l);k=v.Mb(f.x+f.width/2,f.y+f.height/2);for(d=d.i;d.next();)if(l=d.value,l.isVisible()){var m=qb,n=l.kd===a.port||l.T.Yh(e),m=n?Pp(l,a.port):Qp(l,a.port);if(m.Wi()&&(n=n?l.Sd:l.kd,null!==n)){var p= +n.Y;if(null!==p){var n=l.computeOtherPoint(p,n),p=k.xc(n),m=jq(f,m,p,l.jc),q=0;0===m?(q=v.Xc,180<p&&(p-=360)):q=90===m?v.Wc:180===m?v.Nc:v.dd;m=a.Xf[h];void 0===m?(m=new kq(l,p,q),a.Xf[h]=m):(m.link=l,m.angle=p,m.ge=q);m.Vw.set(n);h++}}}v.v(k);a.Xf.sort(Tp.prototype.WH);e=a.Xf.length;k=-1;for(h=d=0;h<e;h++)m=a.Xf[h],void 0!==m&&(m.ge!==k&&(k=m.ge,d=0),m.bp=d,d++);k=-1;d=0;for(h=e-1;0<=h;h--)m=a.Xf[h],void 0!==m&&(m.ge!==k&&(k=m.ge,d=m.bp+1),m.Hm=d);h=a.Xf;n=a.port;e=a.Jc.cI;k=v.L();d=v.L();l=v.L(); +m=v.L();n.Xa(rb,k);n.Xa(tb,d);n.Xa(Eb,l);n.Xa(Cb,m);var r=q=p=n=0;if(e===vp)for(var s=0;s<h.length;s++){var t=h[s];if(null!==t){var u=t.link.computeThickness();switch(t.ge){case v.Wc:q+=u;break;case v.Nc:r+=u;break;case v.dd:n+=u;break;default:case v.Xc:p+=u}}}for(var x=0,w=0,y=1,s=0;s<h.length;s++)if(t=h[s],null!==t){var B,H;if(x!==t.ge){x=t.ge;switch(x){case v.Wc:B=l;H=m;break;case v.Nc:B=m;H=k;break;case v.dd:B=k;H=d;break;default:case v.Xc:B=d,H=l}var C=H.x-B.x;H=H.y-B.y;switch(x){case v.Wc:q> +Math.abs(C)?(y=Math.abs(C)/q,q=Math.abs(C)):y=1;break;case v.Nc:r>Math.abs(H)?(y=Math.abs(H)/r,r=Math.abs(H)):y=1;break;case v.dd:n>Math.abs(C)?(y=Math.abs(C)/n,n=Math.abs(C)):y=1;break;default:case v.Xc:p>Math.abs(H)?(y=Math.abs(H)/p,p=Math.abs(H)):y=1}w=0}var T=t.jp;if(e===vp){u=t.link.computeThickness();u*=y;T.set(B);switch(x){case v.Wc:T.x=B.x+C/2+q/2-w-u/2;break;case v.Nc:T.y=B.y+H/2+r/2-w-u/2;break;case v.dd:T.x=B.x+C/2-n/2+w+u/2;break;default:case v.Xc:T.y=B.y+H/2-p/2+w+u/2}w+=u}else u=.5, +e===sp&&(u=(t.bp+1)/(t.Hm+1)),T.x=B.x+C*u,T.y=B.y+H*u}v.v(k);v.v(d);v.v(l);v.v(m);B=a.Xf;for(C=0;C<B.length;C++)H=B[C],null!==H&&(H.xw=a.computeEndSegmentLength(H));a.rp=c;v.Vb(f)}c=a.Xf}for(f=0;f<c.length;f++)if(B=c[f],null!==B&&B.link===b)return B;return null}Tp.prototype.WH=function(a,b){return a===b?0:null===a?-1:null===b?1:a.ge<b.ge?-1:a.ge>b.ge?1:a.angle<b.angle?-1:a.angle>b.angle?1:0}; +Tp.prototype.computeEndSegmentLength=function(a){var b=a.link,c=b.computeEndSegmentLength(this.Jc,this.port,qb,b.kd===this.port),d=a.bp;if(0>d)return c;var e=a.Hm;if(1>=e||!b.jc)return c;var b=a.Vw,f=a.jp;if(a.ge===v.Nc||a.ge===v.Wc)d=e-1-d;return((a=a.ge===v.Nc||a.ge===v.Xc)?b.y<f.y:b.x<f.x)?c+8*d:(a?b.y===f.y:b.x===f.x)?c:c+8*(e-1-d)};function kq(a,b,c){this.link=a;this.angle=b;this.ge=c;this.Vw=new z;this.Hm=this.bp=0;this.jp=new z;this.xw=0} +v.Kd(kq,{link:!0,angle:!0,ge:!0,Vw:!0,bp:!0,Hm:!0,jp:!0,xw:!0});kq.prototype.toString=function(){return this.link.toString()+" "+this.angle.toString()+" "+this.ge.toString()+":"+this.bp.toString()+"/"+this.Hm.toString()+" "+this.jp.toString()+" "+this.xw.toString()+" "+this.Vw.toString()};function zm(){this.Rj=this.qj=fc;this.Pj=this.oj=NaN;this.Oj=this.nj=tp;this.Qj=this.pj=NaN} +zm.prototype.copy=function(){var a=new zm;a.qj=this.qj.S();a.Rj=this.Rj.S();a.oj=this.oj;a.Pj=this.Pj;a.nj=this.nj;a.Oj=this.Oj;a.pj=this.pj;a.Qj=this.Qj;return a};function V(a){0===arguments.length?S.call(this,Yi):S.call(this,a);this.pr=new J(R);this.fo=new J(V);this.Qk=this.qr=this.or=null;this.Gs=!1;this.Wq=!0;this.Is=!1;this.Gb=this.ws=null;this.cq=!1;this.dq=!0;this.Lq=this.eq=!1;this.Ud=new Zf;this.Ud.group=this;this.Dy=!1}v.Ja(V,S);v.ea("Group",V); +V.prototype.cloneProtected=function(a){S.prototype.cloneProtected.call(this,a);a.or=this.or;a.qr=this.qr;a.Qk=this.Qk;a.Gs=this.Gs;a.Wq=this.Wq;a.Is=this.Is;a.ws=this.ws;var b=a.dt(function(a){return a instanceof Si});a.Gb=b instanceof Si?b:null;a.cq=this.cq;a.dq=this.dq;a.eq=this.eq;a.Lq=this.Lq;null!==this.Ud?(a.Ud=this.Ud.copy(),a.Ud.group=a):(null!==a.Ud&&(a.Ud.group=null),a.Ud=null)}; +V.prototype.Wh=function(a){S.prototype.Wh.call(this,a);var b=a.To();for(a=a.Ic;a.next();){var c=a.value;c.N();c.H(8);c.Vs();if(c instanceof S)c.cf(b);else if(c instanceof W)for(c=c.Sf;c.next();)c.value.cf(b)}}; +V.prototype.Ym=function(a,b,c,d,e,f,h){if(a===Cf&&"elements"===b)if(e instanceof Si){var k=e;null===this.Gb?this.Gb=k:this.Gb!==k&&v.k("Cannot insert a second Placeholder into the visual tree of a Group.")}else e instanceof D&&(k=e.dt(function(a){return a instanceof Si}),k instanceof Si&&(null===this.Gb?this.Gb=k:this.Gb!==k&&v.k("Cannot insert a second Placeholder into the visual tree of a Group.")));else a===Df&&"elements"===b&&null!==this.Gb&&(d===this.Gb?this.Gb=null:d instanceof D&&this.Gb.ul(d)&& +(this.Gb=null));S.prototype.Ym.call(this,a,b,c,d,e,f,h)};V.prototype.Ni=function(a,b,c,d){this.Pk=this.Gb;D.prototype.Ni.call(this,a,b,c,d)};V.prototype.vl=function(){if(!S.prototype.vl.call(this))return!1;for(var a=this.Ic;a.next();){var b=a.value;if(b instanceof S){if(b.isVisible()&&gl(b))return!1}else if(b instanceof W&&b.isVisible()&&gl(b)&&b.T!==this&&b.Z!==this)return!1}return!0};v.u(V,{placeholder:"placeholder"},function(){return this.Gb}); +v.defineProperty(V,{sD:"computesBoundsAfterDrag"},function(){return this.cq},function(a){var b=this.cq;b!==a&&(v.j(a,"boolean",V,"computesBoundsAfterDrag"),this.cq=a,this.h("computesBoundsAfterDrag",b,a))});v.defineProperty(V,{qw:"computesBoundsIncludingLinks"},function(){return this.dq},function(a){v.j(a,"boolean",V,"computesBoundsIncludingLinks");var b=this.dq;b!==a&&(this.dq=a,this.h("computesBoundsIncludingLinks",b,a))}); +v.defineProperty(V,{uG:"computesBoundsIncludingLocation"},function(){return this.eq},function(a){v.j(a,"boolean",V,"computesBoundsIncludingLocation");var b=this.eq;b!==a&&(this.eq=a,this.h("computesBoundsIncludingLocation",b,a))});v.defineProperty(V,{eH:"handlesDragDropForMembers"},function(){return this.Lq},function(a){v.j(a,"boolean",V,"handlesDragDropForMembers");var b=this.Lq;b!==a&&(this.Lq=a,this.h("handlesDragDropForMembers",b,a))});v.u(V,{Ic:"memberParts"},function(){return this.pr.i}); +function op(a,b){if(a.pr.add(b)){b instanceof V&&a.fo.add(b);var c=a.NH;if(null!==c){var d=!0,e=a.g;null!==e&&(d=e.Ra,e.Ra=!0);c(a,b);null!==e&&(e.Ra=d)}a.isVisible()&&a.ee||b.nd(!1)}b instanceof W&&!a.qw||(c=a.Gb,null===c&&(c=a),c.N())}function np(a,b){if(a.pr.remove(b)){b instanceof V&&a.fo.remove(b);var c=a.OH;if(null!==c){var d=!0,e=a.g;null!==e&&(d=e.Ra,e.Ra=!0);c(a,b);null!==e&&(e.Ra=d)}a.isVisible()&&a.ee||b.nd(!0)}b instanceof W&&!a.qw||(c=a.Gb,null===c&&(c=a),c.N())} +V.prototype.Jm=function(){if(0<this.pr.count){var a=this.g;if(null!==a)for(var b=this.pr.copy().i;b.next();)a.remove(b.value)}S.prototype.Jm.call(this)};v.defineProperty(V,{Pb:"layout"},function(){return this.Ud},function(a){var b=this.Ud;b!==a&&(null!==a&&v.A(a,Zf,V,"layout"),null!==b&&(b.g=null,b.group=null),this.Ud=a,null!==a&&(a.g=this.g,a.group=this),this.h("layout",b,a))}); +v.defineProperty(V,{NH:"memberAdded"},function(){return this.or},function(a){var b=this.or;b!==a&&(null!==a&&v.j(a,"function",V,"memberAdded"),this.or=a,this.h("memberAdded",b,a))});v.defineProperty(V,{OH:"memberRemoved"},function(){return this.qr},function(a){var b=this.qr;b!==a&&(null!==a&&v.j(a,"function",V,"memberRemoved"),this.qr=a,this.h("memberRemoved",b,a))}); +v.defineProperty(V,{Oz:"memberValidation"},function(){return this.Qk},function(a){var b=this.Qk;b!==a&&(null!==a&&v.j(a,"function",V,"memberValidation"),this.Qk=a,this.h("memberValidation",b,a))});V.prototype.canAddMembers=function(a){var b=this.g;if(null===b)return!1;b=b.nb;for(a=ah(a).i;a.next();)if(!b.isValidMember(this,a.value))return!1;return!0}; +V.prototype.addMembers=function(a,b){var c=this.g;if(null===c)return!1;for(var c=c.nb,d=!0,e=ah(a).i;e.next();){var f=e.value;!b||c.isValidMember(this,f)?f.Sa=this:d=!1}return d};v.defineProperty(V,{QI:"ungroupable"},function(){return this.Gs},function(a){var b=this.Gs;b!==a&&(v.j(a,"boolean",V,"ungroupable"),this.Gs=a,this.h("ungroupable",b,a))});V.prototype.canUngroup=function(){if(!this.QI)return!1;var a=this.layer;if(null!==a&&!a.lw)return!1;a=a.g;return null===a||a.lw?!0:!1}; +V.prototype.cf=function(a){void 0===a&&(a=null);S.prototype.cf.call(this,a);for(var b=this.HD();b.next();){var c=b.value;if(null===a||!a.contains(c)){var d=c.T;null!==d&&d!==this&&d.Yh(this)&&!d.isVisible()?c.ic():(d=c.Z,null!==d&&d!==this&&d.Yh(this)&&!d.isVisible()&&c.ic())}}};V.prototype.findExternalLinksConnected=V.prototype.HD=function(){var a=this.To();a.add(this);for(var b=new J(W),c=a.i;c.next();){var d=c.value;if(d instanceof S)for(d=d.te;d.next();){var e=d.value;a.contains(e)||b.add(e)}}return b.i}; +V.prototype.findExternalNodesConnected=function(){var a=this.To();a.add(this);for(var b=new J(S),c=a.i;c.next();){var d=c.value;if(d instanceof S)for(d=d.te;d.next();){var e=d.value,f=e.T;a.contains(f)&&f!==this||b.add(f);e=e.Z;a.contains(e)&&e!==this||b.add(e)}}return b.i};V.prototype.findContainingGroupChain=function(){function a(b,d){null!==b&&(d.add(b),a(b.Sa,d))}var b=new J(R);a(this,b);return b}; +V.prototype.findSubGraphParts=V.prototype.To=function(){var a=new J(R);Ig(a,this,!0,0,!0);a.remove(this);return a};V.prototype.nd=function(a){S.prototype.nd.call(this,a);for(var b=this.Ic;b.next();)b.value.nd(a)};V.prototype.collapseSubGraph=V.prototype.collapseSubGraph=function(){var a=this.g;if(null!==a&&!a.gh){a.gh=!0;var b=this.To();lq(this,b,a.Na,this);a.gh=!1}}; +function lq(a,b,c,d){for(var e=a.Ic;e.next();){var f=e.value;f.nd(!1);if(f instanceof V){var h=f;h.ee&&(h.CA=h.ee,lq(h,b,c,d))}if(f instanceof S)f.cf(b),Xj(c,f,d);else if(f instanceof W)for(f=f.Sf;f.next();)f.value.cf(b)}a.ee=!1}V.prototype.expandSubGraph=V.prototype.expandSubGraph=function(){var a=this.g;if(null!==a&&!a.gh){a.gh=!0;var b=this.To();mq(this,b,a.Na,this);a.gh=!1}}; +function mq(a,b,c,d){for(var e=a.Ic;e.next();){var f=e.value;f.nd(!0);if(f instanceof V){var h=f;h.CA&&(h.CA=!1,mq(h,b,c,d))}if(f instanceof S)f.cf(b),Wj(c,f,d);else if(f instanceof W)for(f=f.Sf;f.next();)f.value.cf(b)}a.ee=!0} +v.defineProperty(V,{ee:"isSubGraphExpanded"},function(){return this.Wq},function(a){var b=this.Wq;if(b!==a){v.j(a,"boolean",V,"isSubGraphExpanded");this.Wq=a;var c=this.g;this.h("isSubGraphExpanded",b,a);b=this.EI;if(null!==b){var d=!0;null!==c&&(d=c.Ra,c.Ra=!0);b(this);null!==c&&(c.Ra=d)}null!==c&&c.la.ib?null!==this.Gb&&this.Gb.N():a?this.expandSubGraph():this.collapseSubGraph()}}); +v.defineProperty(V,{CA:"wasSubGraphExpanded"},function(){return this.Is},function(a){var b=this.Is;b!==a&&(v.j(a,"boolean",V,"wasSubGraphExpanded"),this.Is=a,this.h("wasSubGraphExpanded",b,a))});v.defineProperty(V,{EI:"subGraphExpandedChanged"},function(){return this.ws},function(a){var b=this.ws;b!==a&&(null!==a&&v.j(a,"function",V,"subGraphExpandedChanged"),this.ws=a,this.h("subGraphExpandedChanged",b,a))}); +V.prototype.move=function(a){var b=this.position,c=b.x;isNaN(c)&&(c=0);b=b.y;isNaN(b)&&(b=0);var c=a.x-c,b=a.y-b,d=v.Mb(c,b);S.prototype.move.call(this,a);for(a=this.To().i;a.next();){var e=a.value;if(!(e instanceof W||e instanceof S&&e.uf)){var f=e.position,h=e.location;f.G()?(d.x=f.x+c,d.y=f.y+b,e.position=d):h.G()&&(d.x=h.x+c,d.y=h.y+b,e.location=d)}}for(a.reset();a.next();)e=a.value,e instanceof W&&(f=e.position,d.x=f.x+c,d.y=f.y+b,e.move(d));v.v(d)}; +function Si(){G.call(this);this.Ue=cd;this.bs=new A(NaN,NaN,NaN,NaN)}v.Ja(Si,G);v.ea("Placeholder",Si);Si.prototype.cloneProtected=function(a){G.prototype.cloneProtected.call(this,a);a.Ue=this.Ue.S();a.bs=this.bs.copy()};Si.prototype.Wj=function(a){if(null===this.background&&null===this.zm)return!1;var b=this.Ha;return bb(0,0,b.width,b.height,a.x,a.y)}; +Si.prototype.mp=function(){var a=this.Y;null!==a&&(a instanceof V||a instanceof Vg)||v.k("Placeholder is not inside a Group or Adornment.");if(a instanceof V){var b=this.computeBorder(this.bs),c=this.Qc;Wa(c,b.width||0,b.height||0);Dm(this,0,0,c.width,c.height);for(var c=a.Ic,d=!1;c.next();)if(c.value.isVisible()){d=!0;break}!d||isNaN(b.x)||isNaN(b.y)||(c=new z,c.Yt(b,a.ef),a.location=new z(c.x,c.y))}else{var b=this.za,c=this.Qc,d=this.padding,e=d.left+d.right,f=d.top+d.bottom;if(b.G())Wa(c,b.width+ +e||0,b.height+f||0),Dm(this,-d.left,-d.top,c.width,c.height);else{var h=a.Zb,k=h.Xa(rb,v.L()),b=v.hk(k.x,k.y,0,0);b.fj(h.Xa(Eb,k));b.fj(h.Xa(tb,k));b.fj(h.Xa(Cb,k));a.xi.m(b.x,b.y);Wa(c,b.width+e||0,b.height+f||0);Dm(this,-d.left,-d.top,c.width,c.height);v.v(k);v.Vb(b)}}};Si.prototype.Ni=function(a,b,c,d){var e=this.U;e.x=a;e.y=b;e.width=c;e.height=d}; +Si.prototype.computeBorder=function(a){var b=this.Y;if(b instanceof V){var c=b;if(c.sD&&this.bs.G()){var d=c.g;if(null!==d&&(d=d.Wa,d instanceof Zg&&!d.zq&&null!==d.ac&&!d.ac.contains(c)))return a.assign(this.bs),a}}var c=v.ag(),d=this.computeMemberBounds(c),e=this.padding;a.m(d.x-e.left,d.y-e.top,d.width+e.left+e.right,d.height+e.top+e.bottom);v.Vb(c);b instanceof V&&(c=b,c.uG&&c.location.G()&&a.fj(c.location));return a}; +Si.prototype.computeMemberBounds=function(a){if(!(this.Y instanceof V))return a.m(0,0,0,0),a;for(var b=this.Y,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,h=b.Ic;h.next();){var k=h.value;if(k.isVisible()){if(k instanceof W){var l=k;if(!b.qw)continue;if(fl(l))continue;if(l.T===b||l.Z===b)continue}k=k.U;k.left<c&&(c=k.left);k.top<d&&(d=k.top);k.right>e&&(e=k.right);k.bottom>f&&(f=k.bottom)}}isFinite(c)&&isFinite(d)?a.m(c,d,e-c,f-d):(b=b.location,c=this.padding,a.m(b.x+c.left,b.y+c.top,0,0));return a}; +v.defineProperty(Si,{padding:"padding"},function(){return this.Ue},function(a){"number"===typeof a?((isNaN(a)||0>a)&&v.va(a,">= 0",Si,"padding"),a=new cb(a)):(v.A(a,cb,Si,"padding"),(isNaN(a.left)||0>a.left)&&v.va(a.left,">= 0",Si,"padding:value.left"),(isNaN(a.right)||0>a.right)&&v.va(a.right,">= 0",Si,"padding:value.right"),(isNaN(a.top)||0>a.top)&&v.va(a.top,">= 0",Si,"padding:value.top"),(isNaN(a.bottom)||0>a.bottom)&&v.va(a.bottom,">= 0",Si,"padding:value.bottom"));var b=this.Ue;b.K(a)||(this.Ue= +a=a.S(),this.h("padding",b,a))});function Zf(){0<arguments.length&&v.cd(Zf);v.dc(this);this.ny=this.W=null;this.uj=this.Sq=!0;this.ar=!1;this.Vp=(new z(0,0)).freeze();this.Uq=this.Vq=!0;this.wB="";this.Vn=!1;this.Ey=null}v.ea("Layout",Zf);Zf.prototype.cloneProtected=function(a){a.Sq=this.Sq;a.uj=this.uj;a.ar=this.ar;a.Vp.assign(this.Vp);a.Vq=this.Vq;a.Uq=this.Uq;a.wB=this.wB;this.uj||(a.Vn=!0)};Zf.prototype.copy=function(){var a=new this.constructor;this.cloneProtected(a);return a}; +Zf.prototype.toString=function(){var a=v.af(Object.getPrototypeOf(this)),a=a+"(";null!==this.group&&(a+=" in "+this.group);null!==this.g&&(a+=" for "+this.g);return a+")"};v.defineProperty(Zf,{g:"diagram"},function(){return this.W},function(a){null!==a&&v.A(a,E,Zf,"diagram");this.W=a});v.defineProperty(Zf,{group:"group"},function(){return this.ny},function(a){this.ny!==a&&(null!==a&&v.A(a,V,Zf,"group"),this.ny=a,null!==a&&(this.W=a.g))}); +v.defineProperty(Zf,{tH:"isOngoing"},function(){return this.Sq},function(a){this.Sq!==a&&(v.j(a,"boolean",Zf,"isOngoing"),this.Sq=a)});v.defineProperty(Zf,{iE:"isInitial"},function(){return this.uj},function(a){v.j(a,"boolean",Zf,"isInitial");this.uj=a;a||(this.Vn=!0)});v.defineProperty(Zf,{Mw:"isViewportSized"},function(){return this.ar},function(a){this.ar!==a&&(v.j(a,"boolean",Zf,"isViewportSized"),(this.ar=a)&&this.H())}); +v.defineProperty(Zf,{xt:"isRouting"},function(){return this.Vq},function(a){this.Vq!==a&&(v.j(a,"boolean",Zf,"isRouting"),this.Vq=a)});v.defineProperty(Zf,{kE:"isRealtime"},function(){return this.Uq},function(a){this.Uq!==a&&(v.j(a,"boolean",Zf,"isRealtime"),this.Uq=a)});v.defineProperty(Zf,{wf:"isValidLayout"},function(){return this.Vn},function(a){this.Vn!==a&&(v.j(a,"boolean",Zf,"isValidLayout"),this.Vn=a,a||(a=this.g,null!==a&&(a.vu=!0)))}); +Zf.prototype.invalidateLayout=Zf.prototype.H=function(){if(this.Vn){var a=this.g;if(null!==a&&!a.la.ib){var b=a.Na;!b.Un&&(b.df&&b.$h(),this.tH&&a.Qm||this.iE&&!a.Qm)&&(this.wf=!1,a.ue())}}};v.defineProperty(Zf,{network:"network"},function(){return this.Ey},function(a){var b=this.Ey;b!==a&&(null!==a&&v.A(a,$f,Zf,"network"),null!==b&&(b.Pb=null),this.Ey=a,null!==a&&(a.Pb=this))});Zf.prototype.createNetwork=function(){return new $f}; +Zf.prototype.makeNetwork=function(a){var b=this.createNetwork();b.Pb=this;a instanceof E?(b.Tj(a.Bg,!0),b.Tj(a.links,!0)):a instanceof V?b.Tj(a.Ic):b.Tj(a.i);return b};Zf.prototype.updateParts=function(){var a=this.g;if(null===a&&null!==this.network)for(var b=this.network.vertexes.i;b.next();){var c=b.value.Jc;if(null!==c&&(a=c.g,null!==a))break}this.wf=!0;try{null!==a&&a.Qb("Layout"),this.commitLayout()}finally{null!==a&&a.wd("Layout")}}; +Zf.prototype.commitLayout=function(){for(var a=this.network.vertexes.i;a.next();)a.value.commit();if(this.xt)for(a=this.network.edges.i;a.next();)a.value.commit()}; +Zf.prototype.doLayout=function(a){null===a&&v.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts");var b=new J(R);a instanceof E?(nq(this,b,a.Bg,!0,this.Tz,!0,!1,!0),nq(this,b,a.ek,!0,this.Tz,!0,!1,!0)):a instanceof V?nq(this,b,a.Ic,!1,this.Tz,!0,!1,!0):b.Tc(a.i);var c=b.count;if(0<c){a=this.g;null!==a&&a.Qb("Layout");for(var c=Math.ceil(Math.sqrt(c)),d=this.Xd.x,e=d,f=this.Xd.y,h=0,k=0,b=b.i;b.next();){var l=b.value;l.sf();var m=l.Ca,n=m.width, +m=m.height;l.moveTo(e,f);l.Dy=!1;e+=Math.max(n,50)+20;k=Math.max(k,Math.max(m,50));h>=c-1?(h=0,e=d,f+=k+20,k=0):h++}null!==a&&a.wd("Layout")}this.wf=!0};Zf.prototype.Tz=function(a){return!a.location.G()||a instanceof V&&a.Dy?!0:!1}; +function nq(a,b,c,d,e,f,h,k){for(c=c.i;c.next();){var l=c.value;d&&!l.fp||null!==e&&!e(l)||!l.canLayout()||(f&&l instanceof S?l.uf||(l instanceof V?null===l.Pb?nq(a,b,l.Ic,!1,e,f,h,k):b.add(l):b.add(l)):h&&l instanceof W?b.add(l):!k||!l.Od()||l instanceof S||b.add(l))}} +Zf.prototype.collectParts=Zf.prototype.oG=function(a){var b=new J(R);a instanceof E?(nq(this,b,a.Bg,!0,null,!0,!0,!0),nq(this,b,a.links,!0,null,!0,!0,!0),nq(this,b,a.ek,!0,null,!0,!0,!0)):a instanceof V?nq(this,b,a.Ic,!1,null,!0,!0,!0):nq(this,b,a.i,!1,null,!0,!0,!0);return b};v.defineProperty(Zf,{Xd:"arrangementOrigin"},function(){return this.Vp},function(a){v.A(a,z,Zf,"arrangementOrigin");this.Vp.K(a)||(this.Vp.assign(a),this.H())}); +Zf.prototype.initialOrigin=function(a){var b=this.group;if(null!==b){var c=b.position.copy();(isNaN(c.x)||isNaN(c.y))&&c.set(a);b=b.placeholder;null!==b&&(c=b.Xa(rb),(isNaN(c.x)||isNaN(c.y))&&c.set(a),c.x+=b.padding.left,c.y+=b.padding.top);return c}return a};function $f(){v.dc(this);this.Ud=null;this.clear()}v.ea("LayoutNetwork",$f); +$f.prototype.clear=function(){if(this.vertexes)for(var a=this.vertexes.i;a.next();){var b=a.value;b.clear();b.network=null}if(this.edges)for(a=this.edges.i;a.next();)b=a.value,b.clear(),b.network=null;this.vertexes=new J(oq);this.edges=new J(pq);this.Xz=new na(S,oq);this.Jz=new na(W,pq)}; +$f.prototype.toString=function(a){void 0===a&&(a=0);var b="LayoutNetwork"+(null!==this.Pb?"("+this.Pb.toString()+")":"");if(0>=a)return b;b+=" vertexes: "+this.vertexes.count+" edges: "+this.edges.count;if(1<a){for(var c=this.vertexes.i;c.next();)b+="\n "+c.value.toString(a-1);for(c=this.edges.i;c.next();)b+="\n "+c.value.toString(a-1)}return b};v.defineProperty($f,{Pb:"layout"},function(){return this.Ud},function(a){this.Ud=a});$f.prototype.createVertex=function(){return new oq}; +$f.prototype.createEdge=function(){return new pq}; +$f.prototype.addParts=$f.prototype.Tj=function(a,b,c){if(null!==a){void 0===b&&(b=!1);v.j(b,"boolean",$f,"addParts:toplevelonly");void 0===c&&(c=null);null===c&&(c=function(a){if(a instanceof S)return!a.uf;if(a instanceof W){var b=a.T;if(null===b||b.uf)return!1;a=a.Z;return null===a||a.uf?!1:!0}return!1});for(a=a.i;a.next();){var d=a.value;if(d instanceof S&&(!b||d.fp)&&d.canLayout()&&c(d))if(d instanceof V&&null===d.Pb)this.Tj(d.Ic,!1);else if(null===this.Lm(d)){var e=this.createVertex();e.Jc=d; +this.al(e)}}for(a.reset();a.next();)if(d=a.value,d instanceof W&&(!b||d.fp)&&d.canLayout()&&c(d)&&null===this.zw(d)){var f=d.T,e=d.Z;null!==f&&null!==e&&f!==e&&(f=this.findGroupVertex(f),e=this.findGroupVertex(e),null!==f&&null!==e&&this.lp(f,e,d))}}};$f.prototype.findGroupVertex=function(a){if(null===a)return null;var b=a.findVisibleNode();if(null===b)return null;a=this.Lm(b);if(null!==a)return a;for(b=b.Sa;null!==b;){a=this.Lm(b);if(null!==a)return a;b=b.Sa}return null}; +$f.prototype.addVertex=$f.prototype.al=function(a){if(null!==a){this.vertexes.add(a);var b=a.Jc;null!==b&&this.Xz.add(b,a);a.network=this}};$f.prototype.addNode=$f.prototype.Ps=function(a){if(null===a)return null;var b=this.Lm(a);null===b&&(b=this.createVertex(),b.Jc=a,this.al(b));return b};$f.prototype.deleteVertex=$f.prototype.CD=function(a){if(null!==a&&qq(this,a)){for(var b=a.Qe,c=b.count-1;0<=c;c--){var d=b.da(c);this.Po(d)}b=a.Le;for(c=b.count-1;0<=c;c--)d=b.da(c),this.Po(d)}}; +function qq(a,b){if(null===b)return!1;var c=a.vertexes.remove(b);c&&(a.Xz.remove(b.Jc),b.network=null);return c}$f.prototype.deleteNode=function(a){null!==a&&(a=this.Lm(a),null!==a&&this.CD(a))};$f.prototype.findVertex=$f.prototype.Lm=function(a){return null===a?null:this.Xz.ja(a)};$f.prototype.addEdge=$f.prototype.Go=function(a){if(null!==a){this.edges.add(a);var b=a.link;null!==b&&null===this.zw(b)&&this.Jz.add(b,a);b=a.toVertex;null!==b&&b.eD(a);b=a.fromVertex;null!==b&&b.dD(a);a.network=this}}; +$f.prototype.addLink=function(a){if(null===a)return null;var b=a.T,c=a.Z,d=this.zw(a);null===d?(d=this.createEdge(),d.link=a,null!==b&&(d.fromVertex=this.Ps(b)),null!==c&&(d.toVertex=this.Ps(c)),this.Go(d)):(d.fromVertex=null!==b?this.Ps(b):null,d.toVertex=null!==c?this.Ps(c):null);return d};$f.prototype.deleteEdge=$f.prototype.Po=function(a){if(null!==a){var b=a.toVertex;null!==b&&b.BD(a);b=a.fromVertex;null!==b&&b.AD(a);rq(this,a)}}; +function rq(a,b){null!==b&&a.edges.remove(b)&&(a.Jz.remove(b.link),b.network=null)}$f.prototype.deleteLink=function(a){null!==a&&(a=this.zw(a),null!==a&&this.Po(a))};$f.prototype.findEdge=$f.prototype.zw=function(a){return null===a?null:this.Jz.ja(a)};$f.prototype.linkVertexes=$f.prototype.lp=function(a,b,c){if(null===a||null===b)return null;if(a.network===this&&b.network===this){var d=this.createEdge();d.link=c;d.fromVertex=a;d.toVertex=b;this.Go(d);return d}return null}; +$f.prototype.reverseEdge=$f.prototype.hx=function(a){if(null!==a){var b=a.fromVertex,c=a.toVertex;null!==b&&null!==c&&(b.AD(a),c.BD(a),a.hx(),b.eD(a),c.dD(a))}};$f.prototype.deleteSelfEdges=$f.prototype.vw=function(){for(var a=v.jb(),b=this.edges.i;b.next();){var c=b.value;c.fromVertex===c.toVertex&&a.push(c)}b=a.length;for(c=0;c<b;c++)this.Po(a[c]);v.sa(a)}; +$f.prototype.deleteArtificialVertexes=function(){for(var a=v.jb(),b=this.vertexes.i;b.next();){var c=b.value;null===c.Jc&&a.push(c)}c=a.length;for(b=0;b<c;b++)this.CD(a[b]);c=v.jb();for(b=this.edges.i;b.next();){var d=b.value;null===d.link&&c.push(d)}d=c.length;for(b=0;b<d;b++)this.Po(c[b]);v.sa(a);v.sa(c)};function sq(a){for(var b=v.jb(),c=a.edges.i;c.next();){var d=c.value;null!==d.fromVertex&&null!==d.toVertex||b.push(d)}c=b.length;for(d=0;d<c;d++)a.Po(b[d]);v.sa(b)} +$f.prototype.splitIntoSubNetworks=$f.prototype.DI=function(){this.deleteArtificialVertexes();sq(this);this.vw();for(var a=new I($f),b=!0;b;)for(var b=!1,c=this.vertexes.i;c.next();){var d=c.value;if(0<d.Qe.count||0<d.Le.count){b=this.Pb.createNetwork();a.add(b);tq(this,b,d);b=!0;break}}a.sort(function(a,b){return null===a||null===b||a===b?0:b.vertexes.count-a.vertexes.count});return a}; +function tq(a,b,c){if(null!==c&&c.network!==b){qq(a,c);b.al(c);for(var d=c.lc;d.next();){var e=d.value;e.network!==b&&(rq(a,e),b.Go(e),tq(a,b,e.fromVertex))}for(d=c.hc;d.next();)c=d.value,c.network!==b&&(rq(a,c),b.Go(c),tq(a,b,c.toVertex))}}$f.prototype.findAllParts=function(){for(var a=new J(R),b=this.vertexes.i;b.next();)a.add(b.value.Jc);for(b=this.edges.i;b.next();)a.add(b.value.link);return a}; +function oq(){v.dc(this);this.network=null;this.M=(new A(0,0,10,10)).freeze();this.P=(new z(5,5)).freeze();this.clear()}v.ea("LayoutVertex",oq);oq.prototype.clear=function(){this.qd=this.je=null;this.Qe=new I(pq);this.Le=new I(pq)}; +oq.prototype.toString=function(a){void 0===a&&(a=0);var b="LayoutVertex#"+v.ld(this);if(0<a&&(b+=null!==this.Jc?"("+this.Jc.toString()+")":"",1<a)){a="";for(var c=!0,d=this.Qe.i;d.next();){var e=d.value;c?c=!1:a+=",";a+=e.toString(0)}e="";c=!0;for(d=this.Le.i;d.next();){var f=d.value;c?c=!1:e+=",";e+=f.toString(0)}b+=" sources: "+a+" destinations: "+e}return b}; +v.defineProperty(oq,{data:"data"},function(){return this.je},function(a){this.je=a;if(null!==a){var b=a.bounds;a=b.x;var c=b.y,d=b.width,b=b.height;this.P.m(d/2,b/2);this.M.m(a,c,d,b)}});v.defineProperty(oq,{Jc:"node"},function(){return this.qd},function(a){if(this.qd!==a){this.qd=a;a.sf();var b=a.U,c=b.x,d=b.y,e=b.width,b=b.height;isNaN(c)&&(c=0);isNaN(d)&&(d=0);this.M.m(c,d,e,b);if(!(a instanceof V)&&(a=a.bc.Xa(zb),a.G())){this.P.m(a.x-c,a.y-d);return}this.P.m(e/2,b/2)}}); +v.defineProperty(oq,{mb:"bounds"},function(){return this.M},function(a){this.M.K(a)||this.M.assign(a)});v.defineProperty(oq,{focus:"focus"},function(){return this.P},function(a){this.P.K(a)||this.P.assign(a)});v.defineProperty(oq,{na:"centerX"},function(){return this.M.x+this.P.x},function(a){var b=this.M;b.x+this.P.x!==a&&(b.Oa(),b.x=a-this.P.x,b.freeze())});v.defineProperty(oq,{ua:"centerY"},function(){return this.M.y+this.P.y},function(a){var b=this.M;b.y+this.P.y!==a&&(b.Oa(),b.y=a-this.P.y,b.freeze())}); +v.defineProperty(oq,{jt:"focusX"},function(){return this.P.x},function(a){var b=this.P;b.x!==a&&(b.Oa(),b.x=a,b.freeze())});v.defineProperty(oq,{kt:"focusY"},function(){return this.P.y},function(a){var b=this.P;b.y!==a&&(b.Oa(),b.y=a,b.freeze())});v.defineProperty(oq,{x:"x"},function(){return this.M.x},function(a){var b=this.M;b.x!==a&&(b.Oa(),b.x=a,b.freeze())});v.defineProperty(oq,{y:"y"},function(){return this.M.y},function(a){var b=this.M;b.y!==a&&(b.Oa(),b.y=a,b.freeze())}); +v.defineProperty(oq,{width:"width"},function(){return this.M.width},function(a){var b=this.M;b.width!==a&&(b.Oa(),b.width=a,b.freeze())});v.defineProperty(oq,{height:"height"},function(){return this.M.height},function(a){var b=this.M;b.height!==a&&(b.Oa(),b.height=a,b.freeze())}); +oq.prototype.commit=function(){var a=this.je;if(null!==a){var b=this.mb,c=a.bounds;v.Ta(c)?(c.x=b.x,c.y=b.y,c.width=b.width,c.height=b.height):a.bounds=b.copy()}else if(a=this.Jc,null!==a){b=this.mb;if(!(a instanceof V)){var c=a.U,d=a.bc.Xa(zb);if(c.G()&&d.G()){a.moveTo(b.x+this.jt-(d.x-c.x),b.y+this.kt-(d.y-c.y));return}}a.moveTo(b.x,b.y)}};oq.prototype.addSourceEdge=oq.prototype.eD=function(a){null!==a&&(this.Qe.contains(a)||this.Qe.add(a))}; +oq.prototype.deleteSourceEdge=oq.prototype.BD=function(a){null!==a&&this.Qe.remove(a)};oq.prototype.addDestinationEdge=oq.prototype.dD=function(a){null!==a&&(this.Le.contains(a)||this.Le.add(a))};oq.prototype.deleteDestinationEdge=oq.prototype.AD=function(a){null!==a&&this.Le.remove(a)};v.u(oq,{CI:"sourceVertexes"},function(){for(var a=new J(oq),b=this.lc;b.next();)a.add(b.value.fromVertex);return a.i}); +v.u(oq,{HG:"destinationVertexes"},function(){for(var a=new J(oq),b=this.hc;b.next();)a.add(b.value.toVertex);return a.i});v.u(oq,{vertexes:"vertexes"},function(){for(var a=new J(oq),b=this.lc;b.next();)a.add(b.value.fromVertex);for(b=this.hc;b.next();)a.add(b.value.toVertex);return a.i});v.u(oq,{lc:"sourceEdges"},function(){return this.Qe.i});v.u(oq,{hc:"destinationEdges"},function(){return this.Le.i}); +v.u(oq,{edges:"edges"},function(){for(var a=new I(pq),b=this.lc;b.next();)a.add(b.value);for(b=this.hc;b.next();)a.add(b.value);return a.i});v.u(oq,{MG:"edgesCount"},function(){return this.Qe.count+this.Le.count});var uq;oq.standardComparer=uq=function(a,b){var c=a.qd,d=b.qd;return c?d?(c=c.text,d=d.text,c<d?-1:c>d?1:0):1:null!==d?-1:0}; +oq.smartComparer=function(a,b){if(null!==a){if(null!==b){var c=a.qd,d=b.qd;if(null!==c){if(null!==d){for(var c=c.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/),d=d.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/),e=0;e<c.length;e++)if(""!==d[e]&&void 0!==d[e]){var f=parseFloat(c[e]),h=parseFloat(d[e]);if(isNaN(f)){if(!isNaN(h))return 1;if(0!==c[e].localeCompare(d[e]))return c[e].localeCompare(d[e])}else{if(isNaN(h))return-1;if(0!==f-h)return f- +h}}else if(""!==c[e])return 1;return""!==d[e]&&void 0!==d[e]?-1:0}return 1}return null!==d?-1:0}return 1}return null!==b?-1:0};function pq(){v.dc(this);this.network=null;this.clear()}v.ea("LayoutEdge",pq);pq.prototype.clear=function(){this.toVertex=this.fromVertex=this.link=this.data=null}; +pq.prototype.toString=function(a){void 0===a&&(a=0);var b="LayoutEdge#"+v.ld(this);0<a&&(b+=null!==this.link?"("+this.link.toString()+")":"",1<a&&(b+=" "+(this.fromVertex?this.fromVertex.toString():"null")+" --\x3e "+(this.toVertex?this.toVertex.toString():"null")));return b};pq.prototype.hx=function(){var a=this.fromVertex;this.fromVertex=this.toVertex;this.toVertex=a};pq.prototype.commit=function(){}; +pq.prototype.getOtherVertex=pq.prototype.XG=function(a){return this.toVertex===a?this.fromVertex:this.fromVertex===a?this.toVertex:null};function nm(){0<arguments.length&&v.cd(nm);Zf.call(this);this.Mw=!0;this.Ks=this.Ls=NaN;this.jj=(new ia(NaN,NaN)).freeze();this.Nh=(new ia(10,10)).freeze();this.Ae=qn;this.ed=on;this.Mh=kn;this.wh=vq}v.Ja(nm,Zf);v.ea("GridLayout",nm); +nm.prototype.cloneProtected=function(a){Zf.prototype.cloneProtected.call(this,a);a.Ls=this.Ls;a.Ks=this.Ks;a.jj.assign(this.jj);a.Nh.assign(this.Nh);a.Ae=this.Ae;a.ed=this.ed;a.Mh=this.Mh;a.wh=this.wh}; +nm.prototype.doLayout=function(a){null===a&&v.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts");this.Xd=this.initialOrigin(this.Xd);var b=this.g;a=this.oG(a);for(var c=a.copy().i;c.next();){var d=c.value;if(d instanceof W){var e=d;if(null!==e.T||null!==e.Z){a.remove(e);continue}}d.sf();if(d instanceof V)for(d=d.Ic;d.next();)a.remove(d.value)}e=a.cc();if(0!==e.length){switch(this.sorting){case nn:e.reverse();break;case kn:e.sort(this.comparer); +break;case ln:e.sort(this.comparer),e.reverse()}var f=this.UI;isNaN(f)&&(f=0);var h=this.wF,h=isNaN(h)&&null!==b?Math.max(b.rb.width-b.padding.left-b.padding.right,0):Math.max(this.wF,0);0>=f&&0>=h&&(f=1);a=this.spacing.width;isFinite(a)||(a=0);c=this.spacing.height;isFinite(c)||(c=0);null!==b&&b.Qb("Layout");d=[];switch(this.alignment){case rn:var k=a,l=c,m=Math.max(this.Ko.width,1);if(!isFinite(m))for(var n=m=0;n<e.length;n++)var p=e[n],q=p.Ca,m=Math.max(m,q.width);var m=Math.max(m+k,1),r=Math.max(this.Ko.height, +1);if(!isFinite(r))for(n=r=0;n<e.length;n++)p=e[n],q=p.Ca,r=Math.max(r,q.height);for(var r=Math.max(r+l,1),s=this.Nf,t=this.Xd.x,u=t,x=this.Xd.y,w=0,y=0,n=0;n<e.length;n++){var p=e[n],q=p.Ca,B=Math.ceil((q.width+k)/m)*m,H=Math.ceil((q.height+l)/r)*r,C=0;switch(s){case pn:C=Math.abs(u-q.width);break;default:C=u+q.width}if(0<f&&w>f-1||0<h&&0<w&&C>h)d.push(new A(0,x,h+k,y)),w=0,u=t,x+=y,y=0;y=Math.max(y,H);H=0;switch(s){case pn:H=-q.width;break;default:H=0}p.moveTo(u+H,x);switch(s){case pn:u-=B;break; +default:u+=B}w++}d.push(new A(0,x,h+k,y));break;case qn:k=f;l=a;m=c;n=Math.max(this.Ko.width,1);p=x=B=0;q=v.L();for(f=0;f<e.length;f++)r=e[f],s=r.Ca,t=ip(r,r.bc,r.ef,q),B=Math.max(B,t.x),x=Math.max(x,s.width-t.x),p=Math.max(p,t.y);u=this.Nf;switch(u){case pn:B+=l;break;default:x+=l}var n=isFinite(n)?Math.max(n+l,1):Math.max(B+x,1),T=x=this.Xd.x,w=this.Xd.y,y=0;h>=B&&(h-=B);for(var B=H=0,C=Math.max(this.Ko.height,1),ba=p=0,U=!0,M=v.L(),f=0;f<e.length;f++){r=e[f];s=r.Ca;t=ip(r,r.bc,r.ef,q);if(0<y)switch(u){case pn:T= +(T-x-(s.width-t.x))/n;T=Hc(Math.round(T),T)?Math.round(T):Math.floor(T);T=T*n+x;break;default:T=(T-x+t.x)/n,T=Hc(Math.round(T),T)?Math.round(T):Math.ceil(T),T=T*n+x}else switch(u){case pn:H=T+t.x+s.width;break;default:H=T-t.x}var aa=0;switch(u){case pn:aa=-(T+t.x)+H;break;default:aa=T+s.width-t.x-H}if(0<k&&y>k-1||0<h&&0<y&&aa>h){d.push(new A(0,U?w-p:w,h+l,ba+p+m));for(T=0;T<y&&f!==y;T++){var aa=e[f-y+T],Ia=ip(aa,aa.bc,aa.ef,M);aa.moveTo(aa.position.x,aa.position.y+p-Ia.y)}ba+=m;w=U?w+ba:w+(ba+p); +y=ba=p=0;T=x;U=!1}T===x&&(B=u===pn?Math.max(B,s.width-t.x):Math.min(B,-t.x));p=Math.max(p,t.y);ba=Math.max(ba,s.height-t.y);isFinite(C)&&(ba=Math.max(ba,Math.max(s.height,C)-t.y));U?r.moveTo(T-t.x,w-t.y):r.moveTo(T-t.x,w);switch(u){case pn:T-=t.x+l;break;default:T+=s.width-t.x+l}y++}d.push(new A(0,w,h+l,(U?ba:ba+p)+m));for(T=0;T<y&&f!==y;T++)aa=e[f-y+T],Ia=ip(aa,aa.bc,aa.ef,q),aa.moveTo(aa.position.x,aa.position.y+p-Ia.y);v.v(q);v.v(M);if(u===pn)for(f=0;f<d.length;f++)e=d[f],e.width+=B,e.x-=B;else for(f= +0;f<d.length;f++)e=d[f],e.x>B&&(e.width+=e.x-B,e.x=B)}for(k=f=h=e=0;k<d.length;k++)l=d[k],e=Math.min(e,l.x),h=Math.min(h,l.y),f=Math.max(f,l.x+l.width);this.Nf===pn?this.commitLayers(d,new z(e+a/2-(f+e),h-c/2)):this.commitLayers(d,new z(e-a/2,h-c/2));null!==b&&b.wd("Layout");this.wf=!0}};nm.prototype.commitLayers=function(){}; +v.defineProperty(nm,{wF:"wrappingWidth"},function(){return this.Ls},function(a){this.Ls!==a&&(v.j(a,"number",nm,"wrappingWidth"),0<a||isNaN(a))&&(this.Ls=a,this.Mw=isNaN(a),this.H())});v.defineProperty(nm,{UI:"wrappingColumn"},function(){return this.Ks},function(a){this.Ks!==a&&(v.j(a,"number",nm,"wrappingColumn"),0<a||isNaN(a))&&(this.Ks=a,this.H())});v.defineProperty(nm,{Ko:"cellSize"},function(){return this.jj},function(a){v.A(a,ia,nm,"cellSize");this.jj.K(a)||(this.jj.assign(a),this.H())}); +v.defineProperty(nm,{spacing:"spacing"},function(){return this.Nh},function(a){v.A(a,ia,nm,"spacing");this.Nh.K(a)||(this.Nh.assign(a),this.H())});v.defineProperty(nm,{alignment:"alignment"},function(){return this.Ae},function(a){this.Ae!==a&&(v.pb(a,nm,nm,"alignment"),a===qn||a===rn)&&(this.Ae=a,this.H())});v.defineProperty(nm,{Nf:"arrangement"},function(){return this.ed},function(a){this.ed!==a&&(v.pb(a,nm,nm,"arrangement"),a===on||a===pn)&&(this.ed=a,this.H())}); +v.defineProperty(nm,{sorting:"sorting"},function(){return this.Mh},function(a){this.Mh!==a&&(v.pb(a,nm,nm,"sorting"),a===mn||a===nn||a===kn||a===ln)&&(this.Mh=a,this.H())});v.defineProperty(nm,{comparer:"comparer"},function(){return this.wh},function(a){this.wh!==a&&(v.j(a,"function",nm,"comparer"),this.wh=a,this.H())});var vq;nm.standardComparer=vq=function(a,b){var c=a.text,d=b.text;return c<d?-1:c>d?1:0}; +nm.smartComparer=function(a,b){if(null!==a){if(null!==b){for(var c=a.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/),d=b.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/),e=0;e<c.length;e++)if(""!==d[e]&&void 0!==d[e]){var f=parseFloat(c[e]),h=parseFloat(d[e]);if(isNaN(f)){if(!isNaN(h))return 1;if(0!==c[e].localeCompare(d[e]))return c[e].localeCompare(d[e])}else{if(isNaN(h))return-1;if(0!==f-h)return f-h}}else if(""!==c[e])return 1;return""!== +d[e]&&void 0!==d[e]?-1:0}return 1}return null!==b?-1:0};var rn;nm.Position=rn=v.p(nm,"Position",0);var qn;nm.Location=qn=v.p(nm,"Location",1);var on;nm.LeftToRight=on=v.p(nm,"LeftToRight",2);var pn;nm.RightToLeft=pn=v.p(nm,"RightToLeft",3);var mn;nm.Forward=mn=v.p(nm,"Forward",4);var nn;nm.Reverse=nn=v.p(nm,"Reverse",5);var kn;nm.Ascending=kn=v.p(nm,"Ascending",6);var ln;nm.Descending=ln=v.p(nm,"Descending",7); +function sn(){0<arguments.length&&v.cd(sn);Zf.call(this);this.by=this.Hn=this.Fd=0;this.Aq=360;this.ay=In;this.zk=0;this.DB=In;this.Du=this.tg=this.TC=0;this.cw=new wq;this.Fu=this.gm=0;this.NF=600;this.Pr=NaN;this.Xp=1;this.vs=0;this.xs=360;this.ed=In;this.aa=En;this.Mh=Bn;this.wh=uq;this.Nh=6;this.Dr=Ln}v.Ja(sn,Zf);v.ea("CircularLayout",sn); +sn.prototype.cloneProtected=function(a){Zf.prototype.cloneProtected.call(this,a);a.Pr=this.Pr;a.Xp=this.Xp;a.vs=this.vs;a.xs=this.xs;a.ed=this.ed;a.aa=this.aa;a.Mh=this.Mh;a.wh=this.wh;a.Nh=this.Nh;a.Dr=this.Dr};sn.prototype.createNetwork=function(){return new xq}; +sn.prototype.doLayout=function(a){null===a&&v.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts");null===this.network&&(this.network=this.makeNetwork(a));a=this.network.vertexes;if(1>=a.count)1===a.count&&(a=a.first(),a.na=0,a.ua=0);else{var b=new I(yq);b.Tc(a.i);a=new I(yq);var c=new I(yq),d;d=this.sort(b);var e=this.ay,f=this.DB,h=this.Fd,k=this.Hn,l=this.by,m=this.Aq,b=this.zk,n=this.TC,p=this.tg,q=this.Du,e=this.Nf,f=this.Sw,h=this.dI;if(!isFinite(h)|| +0>=h)h=NaN;k=this.iG;if(!isFinite(k)||0>=k)k=1;l=this.xe;isFinite(l)||(l=0);m=this.Af;if(!isFinite(m)||360<m||1>m)m=360;b=this.spacing;isFinite(b)||(b=NaN);e===Jn&&f===Kn?e=In:e===Jn&&f!==Kn&&(f=Kn,e=this.Nf);if((this.direction===Cn||this.direction===Dn)&&this.sorting!==Bn){for(var r=0;!(r>=d.length);r+=2){a.add(d.da(r));if(r+1>=d.length)break;c.add(d.da(r+1))}this.direction===Cn?(this.Nf===Jn&&a.reverse(),d=new I(yq),d.Tc(a),d.Tc(c)):(this.Nf===Jn&&c.reverse(),d=new I(yq),d.Tc(c),d.Tc(a))}for(var s= +d.length,t=n=0,r=0;r<d.length;r++){var p=l+m*t*(this.direction===En?1:-1)/s,u=d.da(r).diameter;isNaN(u)&&(u=zq(d.da(r),p));360>m&&(0===r||r===d.length-1)&&(u/=2);n+=u;t++}if(isNaN(h)||e===Jn){isNaN(b)&&(b=6);if(e!==In&&e!==Jn){u=-Infinity;for(r=0;r<s;r++){var q=d.da(r),x=d.da(r===s-1?0:r+1);isNaN(q.diameter)&&zq(q,0);isNaN(x.diameter)&&zq(x,0);u=Math.max(u,(q.diameter+x.diameter)/2)}q=u+b;e===Gn?(p=2*Math.PI/s,h=(u+b)/p):h=Aq(this,q*(360<=m?s:s-1),k,l*Math.PI/180,m*Math.PI/180)}else h=Aq(this,n+(360<= +m?s:s-1)*(e!==Jn?b:1.6*b),k,l*Math.PI/180,m*Math.PI/180);p=h*k}else if(p=h*k,t=Bq(this,h,p,l*Math.PI/180,m*Math.PI/180),isNaN(b)){if(e===In||e===Jn)b=(t-n)/(360<=m?s:s-1)}else if(e===In||e===Jn)r=(t-n)/(360<=m?s:s-1),r<b?(h=Aq(this,n+b*(360<=m?s:s-1),k,l*Math.PI/180,m*Math.PI/180),p=h*k):b=r;else{u=-Infinity;for(r=0;r<s;r++)q=d.da(r),x=d.da(r===s-1?0:r+1),isNaN(q.diameter)&&zq(q,0),isNaN(x.diameter)&&zq(x,0),u=Math.max(u,(q.diameter+x.diameter)/2);q=u+b;r=Aq(this,q*(360<=m?s:s-1),k,l*Math.PI/180, +m*Math.PI/180);r>h?(h=r,p=h*k):q=t/(360<=m?s:s-1)}this.ay=e;this.DB=f;this.Fd=h;this.Hn=k;this.by=l;this.Aq=m;this.zk=b;this.TC=n;this.tg=p;this.Du=q;b=d;d=this.ay;e=this.Fd;f=this.by;k=this.Aq;l=this.zk;m=this.tg;n=this.Du;if(this.direction!==Cn&&this.direction!==Dn||d!==Jn)if(this.direction===Cn||this.direction===Dn){h=0;switch(d){case Hn:h=180*Cq(this,e,m,f,n)/Math.PI;break;case In:n=b=0;h=a.first();null!==h&&(b=zq(h,Math.PI/2));h=c.first();null!==h&&(n=zq(h,Math.PI/2));h=180*Cq(this,e,m,f,l+(b+ +n)/2)/Math.PI;break;case Gn:h=k/b.length}if(this.direction===Cn){switch(d){case Hn:Dq(this,a,f,Fn);break;case In:Eq(this,a,f,Fn);break;case Gn:Fq(this,a,k/2,f,Fn)}switch(d){case Hn:Dq(this,c,f+h,En);break;case In:Eq(this,c,f+h,En);break;case Gn:Fq(this,c,k/2,f+h,En)}}else{switch(d){case Hn:Dq(this,c,f,Fn);break;case In:Eq(this,c,f,Fn);break;case Gn:Fq(this,c,k/2,f,Fn)}switch(d){case Hn:Dq(this,a,f+h,En);break;case In:Eq(this,a,f+h,En);break;case Gn:Fq(this,a,k/2,f+h,En)}}}else switch(d){case Hn:Dq(this, +b,f,this.direction);break;case In:Eq(this,b,f,this.direction);break;case Gn:Fq(this,b,k,f,this.direction);break;case Jn:Gq(this,b,k,f,this.direction)}else Gq(this,b,k,f-k/2,En)}this.updateParts();this.network=null;this.wf=!0}; +function Fq(a,b,c,d,e){var f=a.Aq,h=a.Fd;a=a.tg;d=d*Math.PI/180;c=c*Math.PI/180;for(var k=b.length,l=0;l<k;l++){var m=d+(e===En?l*c/(360<=f?k:k-1):-(l*c)/k),n=b.da(l),p=h*Math.tan(m)/a,p=Math.sqrt((h*h+a*a*p*p)/(1+p*p));n.na=p*Math.cos(m);n.ua=p*Math.sin(m);n.actualAngle=180*m/Math.PI}} +function Eq(a,b,c,d){var e=a.Fd,f=a.tg,h=a.zk;c=c*Math.PI/180;for(var k=b.length,l=0;l<k;l++){var m=b.da(l),n=b.da(l===k-1?0:l+1),p=f*Math.sin(c);m.na=e*Math.cos(c);m.ua=p;m.actualAngle=180*c/Math.PI;isNaN(m.diameter)&&zq(m,0);isNaN(n.diameter)&&zq(n,0);m=Cq(a,e,f,d===En?c:-c,(m.diameter+n.diameter)/2+h);c+=d===En?m:-m}} +function Dq(a,b,c,d){var e=a.Fd,f=a.tg,h=a.Du;c=c*Math.PI/180;for(var k=b.length,l=0;l<k;l++){var m=b.da(l);m.na=e*Math.cos(c);m.ua=f*Math.sin(c);m.actualAngle=180*c/Math.PI;m=Cq(a,e,f,d===En?c:-c,h);c+=d===En?m:-m}}function Gq(a,b,c,d,e){var f=a.Fu,f=a.Aq;a.gm=0;a.cw=new wq;if(360>c){for(f=d+(e===En?f:-f);0>f;)f+=360;f%=360;180<f&&(f-=360);f*=Math.PI/180;a.Fu=f;Hq(a,b,c,d,e)}else Iq(a,b,c,d,e);a.cw.commit(b)} +function Iq(a,b,c,d,e){var f=a.Fd,h=a.zk,k=a.Hn,l=f*Math.cos(d*Math.PI/180),m=a.tg*Math.sin(d*Math.PI/180),n=b.cc();if(3===n.length)n[0].na=f,n[0].ua=0,n[1].na=n[0].na-n[0].width/2-n[1].width/2-h,n[1].y=n[0].y,n[2].na=(n[0].na+n[1].na)/2,n[2].y=n[0].y-n[2].height-h;else if(4===n.length)n[0].na=f,n[0].ua=0,n[2].na=-n[0].na,n[2].ua=n[0].ua,n[1].na=0,n[1].y=Math.min(n[0].y,n[2].y)-n[1].height-h,n[3].na=0,n[3].y=Math.max(n[0].y+n[0].height+h,n[2].y+n[2].height+h);else{for(var f=v.L(),p=0;p<n.length;p++){n[p].na= +l;n[p].ua=m;if(p>=n.length-1)break;Jq(a,l,m,n,p,e,f)||Kq(a,l,m,n,p,e,f);l=f.x;m=f.y}v.v(f);a.gm++;if(!(23<a.gm)){var l=n[0].na,m=n[0].ua,f=n[n.length-1].na,p=n[n.length-1].ua,q=Math.abs(l-f)-((n[0].width+n[n.length-1].width)/2+h),r=Math.abs(m-p)-((n[0].height+n[n.length-1].height)/2+h),h=0;1>Math.abs(r)?Math.abs(l-f)<(n[0].width+n[n.length-1].width)/2&&(h=0):h=0<r?r:1>Math.abs(q)?0:q;q=!1;q=Math.abs(f)>Math.abs(p)?0<f!==m>p:0<p!==l<f;if(q=e===En?q:!q)h=-Math.abs(h),h=Math.min(h,-n[n.length-1].width), +h=Math.min(h,-n[n.length-1].height);a.cw.compare(h,n);1<Math.abs(h)&&(a.Fd=8>a.gm?a.Fd-h/(2*Math.PI):5>n.length&&10<h?a.Fd/2:a.Fd-(0<h?1.7:-2.3),a.tg=a.Fd*k,Iq(a,b,c,d,e))}}} +function Hq(a,b,c,d,e){for(var f=a.Fd,h=a.tg,k=a.Hn,l=f*Math.cos(d*Math.PI/180),m=h*Math.sin(d*Math.PI/180),n=v.L(),p=b.cc(),q=0;q<p.length;q++){p[q].na=l;p[q].ua=m;if(q>=p.length-1)break;Jq(a,l,m,p,q,e,n)||Kq(a,l,m,p,q,e,n);l=n.x;m=n.y}v.v(n);a.gm++;if(!(23<a.gm)){l=Math.atan2(m,l);l=e===En?a.Fu-l:l-a.Fu;l=Math.abs(l)<Math.abs(l-2*Math.PI)?l:l-2*Math.PI;f=l*(f+h)/2;h=a.cw;if(Math.abs(f)<Math.abs(h.Wo))for(h.Wo=f,h.gn=[],h.Lp=[],l=0;l<p.length;l++)h.gn[l]=p[l].mb.x,h.Lp[l]=p[l].mb.y;1<Math.abs(f)&& +(a.Fd=8>a.gm?a.Fd-f/(2*Math.PI):a.Fd-(0<f?1.7:-2.3),a.tg=a.Fd*k,Hq(a,b,c,d,e))}}function Jq(a,b,c,d,e,f,h){var k=a.Fd,l=a.tg,m=0,n=0;a=(d[e].width+d[e+1].width)/2+a.zk;var p=!1;if(0<=c!==(f===En)){if(m=b+a,m>k){m=b-a;if(m<-k)return h.x=m,h.y=n,!1;p=!0}}else if(m=b-a,m<-k){m=b+a;if(m>k)return h.x=m,h.y=n,!1;p=!0}n=Math.sqrt(1-Math.min(1,m*m/(k*k)))*l;0>c!==p&&(n=-n);if(Math.abs(c-n)>(d[e].height+d[e+1].height)/2)return h.x=m,h.y=n,!1;h.x=m;h.y=n;return!0} +function Kq(a,b,c,d,e,f,h){var k=a.Fd,l=a.tg,m=0,n=0;a=(d[e].height+d[e+1].height)/2+a.zk;d=!1;if(0<=b!==(f===En)){if(n=c-a,n<-l){n=c+a;if(n>l){h.x=m;h.y=n;return}d=!0}}else if(n=c+a,n>l){n=c-a;if(n<-l){h.x=m;h.y=n;return}d=!0}m=Math.sqrt(1-Math.min(1,n*n/(l*l)))*k;0>b!==d&&(m=-m);h.x=m;h.y=n}sn.prototype.commitLayout=function(){this.commitNodes();this.xt&&this.commitLinks()}; +sn.prototype.commitNodes=function(){for(var a=this.YF,b=this.network.vertexes.i;b.next();){var c=b.value;c.x+=a.x;c.y+=a.y;c.commit()}};sn.prototype.commitLinks=function(){for(var a=this.network.edges.i;a.next();)a.value.commit()}; +function Bq(a,b,c,d,e){var f=a.NF;if(.001>Math.abs(a.Hn-1))return void 0!==d&&void 0!==e?e*b:2*Math.PI*b;a=b>c?Math.sqrt(b*b-c*c)/b:Math.sqrt(c*c-b*b)/c;for(var h=0,k=0,k=void 0!==d&&void 0!==e?e/(f+1):Math.PI/(2*(f+1)),l=0,m=0;m<=f;m++)l=void 0!==d&&void 0!==e?d+m*e/f:m*Math.PI/(2*f),l=Math.sin(l),h+=Math.sqrt(1-a*a*l*l)*k;return void 0!==d&&void 0!==e?(b>c?b:c)*h:4*(b>c?b:c)*h}function Aq(a,b,c,d,e){var f=0,f=void 0!==d&&void 0!==e?Bq(a,1,c,d,e):Bq(a,1,c);return b/f} +function Cq(a,b,c,d,e){if(.001>Math.abs(a.Hn-1))return e/b;var f=b>c?Math.sqrt(b*b-c*c)/b:Math.sqrt(c*c-b*b)/c,h=0;a=2*Math.PI/(700*a.network.vertexes.count);b>c&&(d+=Math.PI/2);for(var k=0;;k++){var l=Math.sin(d+k*a),h=h+(b>c?b:c)*Math.sqrt(1-f*f*l*l)*a;if(h>=e)return k*a}} +sn.prototype.sort=function(a){switch(this.sorting){case zn:break;case An:a.reverse();break;case tn:a.sort(this.comparer);break;case xn:a.sort(this.comparer);a.reverse();break;case Bn:for(var b=[],c=0;c<a.length;c++)b.push(0);for(var d=new I(yq),c=0;c<a.length;c++){var e=-1,f=-1;if(0===c)for(var h=0;h<a.length;h++){var k=a.da(h).MG;k>e&&(e=k,f=h)}else for(h=0;h<a.length;h++)k=b[h],k>e&&(e=k,f=h);d.add(a.da(f));b[f]=-1;f=a.da(f);e=0;for(h=f.lc;h.next();)e=a.indexOf(h.value.fromVertex),0>e||0<=b[e]&& +b[e]++;for(f=f.hc;f.next();)e=a.indexOf(f.value.toVertex),0>e||0<=b[e]&&b[e]++}a=[];for(b=0;b<d.length;b++){h=d.da(b);a[b]=[];for(var l=0,c=h.hc;c.next();)l=d.indexOf(c.value.toVertex),l!==b&&0>a[b].indexOf(l)&&a[b].push(l);for(c=h.lc;c.next();)l=d.indexOf(c.value.fromVertex),l!==b&&0>a[b].indexOf(l)&&a[b].push(l)}h=[];for(b=0;b<a.length;b++)h[b]=0;for(var c=[],k=[],m=[],e=[],f=new I(yq),n=0,b=0;b<a.length;b++){var p=a[b].length;if(1===p)e.push(b);else if(0===p)f.add(d.da(b));else{if(0===n)c.push(b); +else{for(var q=Infinity,r=Infinity,s=-1,t=[],p=0;p<c.length;p++)0>a[c[p]].indexOf(c[p===c.length-1?0:p+1])&&t.push(p===c.length-1?0:p+1);if(0===t.length)for(p=0;p<c.length;p++)t.push(p);for(p=0;p<t.length;p++){var u=t[p],x,l=a[b];x=k;for(var w=m,y=h,B=u,H=c,C=0,T=0;T<x.length;T++){var ba=y[x[T]],U=y[w[T]],M=0,aa=0;ba<U?(M=ba,aa=U):(M=U,aa=ba);if(M<B&&B<=aa)for(ba=0;ba<l.length;ba++)U=l[ba],0>H.indexOf(U)||M<y[U]&&y[U]<aa||M===y[U]||aa===y[U]||C++;else for(ba=0;ba<l.length;ba++)U=l[ba],0>H.indexOf(U)|| +M<y[U]&&y[U]<aa&&M!==y[U]&&aa!==y[U]&&C++}x=C;for(y=w=0;y<a[b].length;y++)l=c.indexOf(a[b][y]),0<=l&&(l=Math.abs(u-(l>=u?l+1:l)),w+=l<c.length+1-l?l:c.length+1-l);for(y=0;y<k.length;y++)l=h[k[y]],B=h[m[y]],l>=u&&l++,B>=u&&B++,l>B&&(H=B,B=l,l=H),B-l<(c.length+2)/2===(l<u&&u<=B)&&w++;if(x<q||x===q&&w<r)q=x,r=w,s=u}c.splice(s,0,b);for(p=0;p<c.length;p++)h[c[p]]=p;for(p=0;p<a[b].length;p++)q=a[b][p],0<=c.indexOf(q)&&(k.push(b),m.push(q))}n++}}k=!1;for(m=c.length;;){k=!0;for(h=0;h<e.length;h++)if(b=e[h], +n=a[b][0],l=c.indexOf(n),0<=l){for(r=p=0;r<a[n].length;r++)q=a[n][r],q=c.indexOf(q),0>q||q===l||(s=q>l?q-l:l-q,p+=q<l!==s>m-s?1:-1);c.splice(0>p?l:l+1,0,b);e.splice(h,1);h--}else k=!1;if(k)break;else c.push(e[0]),e.splice(0,1)}for(b=0;b<c.length;b++)l=c[b],f.add(d.da(l));return f;default:v.k("Invalid sorting type.")}return a};v.defineProperty(sn,{dI:"radius"},function(){return this.Pr},function(a){this.Pr!==a&&(v.j(a,"number",sn,"radius"),0<a||isNaN(a))&&(this.Pr=a,this.H())}); +v.defineProperty(sn,{iG:"aspectRatio"},function(){return this.Xp},function(a){this.Xp!==a&&(v.j(a,"number",sn,"aspectRatio"),0<a&&(this.Xp=a,this.H()))});v.defineProperty(sn,{xe:"startAngle"},function(){return this.vs},function(a){this.vs!==a&&(v.j(a,"number",sn,"startAngle"),this.vs=a,this.H())});v.defineProperty(sn,{Af:"sweepAngle"},function(){return this.xs},function(a){this.xs!==a&&(v.j(a,"number",sn,"sweepAngle"),this.xs=0<a&&360>=a?a:360,this.H())}); +v.defineProperty(sn,{Nf:"arrangement"},function(){return this.ed},function(a){this.ed!==a&&(v.pb(a,sn,sn,"arrangement"),a===Jn||a===In||a===Hn||a===Gn)&&(this.ed=a,this.H())});v.defineProperty(sn,{direction:"direction"},function(){return this.aa},function(a){this.aa!==a&&(v.pb(a,sn,sn,"direction"),a===En||a===Fn||a===Cn||a===Dn)&&(this.aa=a,this.H())}); +v.defineProperty(sn,{sorting:"sorting"},function(){return this.Mh},function(a){this.Mh!==a&&(v.pb(a,sn,sn,"sorting"),a===zn||a===An||a===tn||xn||a===Bn)&&(this.Mh=a,this.H())});v.defineProperty(sn,{comparer:"comparer"},function(){return this.wh},function(a){this.wh!==a&&(v.j(a,"function",sn,"comparer"),this.wh=a,this.H())});v.defineProperty(sn,{spacing:"spacing"},function(){return this.Nh},function(a){this.Nh!==a&&(v.j(a,"number",sn,"spacing"),this.Nh=a,this.H())}); +v.defineProperty(sn,{Sw:"nodeDiameterFormula"},function(){return this.Dr},function(a){this.Dr!==a&&(v.pb(a,sn,sn,"nodeDiameterFormula"),a===Ln||a===Kn)&&(this.Dr=a,this.H())});v.u(sn,{ZF:"actualXRadius"},function(){return this.Fd});v.u(sn,{$F:"actualYRadius"},function(){return this.tg});v.u(sn,{XI:"actualSpacing"},function(){return this.zk});v.u(sn,{YF:"actualCenter"},function(){return isNaN(this.Xd.x)||isNaN(this.Xd.y)?new z(0,0):new z(this.Xd.x+this.ZF,this.Xd.y+this.$F)});var In; +sn.ConstantSpacing=In=v.p(sn,"ConstantSpacing",0);var Hn;sn.ConstantDistance=Hn=v.p(sn,"ConstantDistance",1);var Gn;sn.ConstantAngle=Gn=v.p(sn,"ConstantAngle",2);var Jn;sn.Packed=Jn=v.p(sn,"Packed",3);var En;sn.Clockwise=En=v.p(sn,"Clockwise",4);var Fn;sn.Counterclockwise=Fn=v.p(sn,"Counterclockwise",5);var Cn;sn.BidirectionalLeft=Cn=v.p(sn,"BidirectionalLeft",6);var Dn;sn.BidirectionalRight=Dn=v.p(sn,"BidirectionalRight",7);var zn;sn.Forwards=zn=v.p(sn,"Forwards",8);var An; +sn.Reverse=An=v.p(sn,"Reverse",9);var tn;sn.Ascending=tn=v.p(sn,"Ascending",10);var xn;sn.Descending=xn=v.p(sn,"Descending",11);var Bn;sn.Optimized=Bn=v.p(sn,"Optimized",12);var Ln;sn.Pythagorean=Ln=v.p(sn,"Pythagorean",13);var Kn;sn.Circular=Kn=v.p(sn,"Circular",14);function wq(){this.Wo=-Infinity;this.Lp=this.gn=null} +wq.prototype.compare=function(a,b){if(0<a&&0>this.Wo||Math.abs(a)<Math.abs(this.Wo)&&!(0>a&&0<this.Wo)){this.Wo=a;this.gn=[];this.Lp=[];for(var c=0;c<b.length;c++)this.gn[c]=b[c].mb.x,this.Lp[c]=b[c].mb.y}};wq.prototype.commit=function(a){if(null!==this.gn&&null!==this.Lp)for(var b=0;b<this.gn.length;b++){var c=a.da(b);c.x=this.gn[b];c.y=this.Lp[b]}};function xq(){$f.call(this)}v.Ja(xq,$f);v.ea("CircularNetwork",xq);xq.prototype.createVertex=function(){return new yq};xq.prototype.createEdge=function(){return new Lq}; +function yq(){oq.call(this);this.actualAngle=this.diameter=NaN}v.Ja(yq,oq);v.ea("CircularVertex",yq); +function zq(a,b){var c=a.network;if(null===c)return NaN;c=c.Pb;if(null===c)return NaN;if(c.Nf===Jn)if(c.Sw===Kn)a.diameter=Math.max(a.width,a.height);else{var c=Math.abs(Math.sin(b)),d=Math.abs(Math.cos(b));if(0===c)return a.width;if(0===d)return a.height;a.diameter=Math.min(a.height/c,a.width/d)}else a.diameter=c.Sw===Kn?Math.max(a.width,a.height):Math.sqrt(a.width*a.width+a.height*a.height);return a.diameter}function Lq(){pq.call(this)}v.Ja(Lq,pq);v.ea("CircularEdge",Lq); +function Mq(){0<arguments.length&&v.cd(Mq);Zf.call(this);this.sg=null;this.cr=0;this.bg=(new ia(100,100)).freeze();this.Wp=!1;this.Lh=!0;this.vh=!1;this.eo=100;this.Cq=1;this.Dh=1E3;this.Qr=Math;this.Cn=.05;this.Bn=50;this.yn=150;this.An=0;this.sq=10;this.rq=5}v.Ja(Mq,Zf);v.ea("ForceDirectedLayout",Mq); +Mq.prototype.cloneProtected=function(a){Zf.prototype.cloneProtected.call(this,a);a.bg.assign(this.bg);a.Wp=this.Wp;a.Lh=this.Lh;a.vh=this.vh;a.eo=this.eo;a.Cq=this.Cq;a.Dh=this.Dh;a.Qr=this.Qr;a.Cn=this.Cn;a.Bn=this.Bn;a.yn=this.yn;a.An=this.An;a.sq=this.sq;a.rq=this.rq};Mq.prototype.createNetwork=function(){return new Nq}; +Mq.prototype.doLayout=function(a){null===a&&v.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts");null===this.network&&(this.network=this.makeNetwork(a));a=this.Nz;if(0<this.network.vertexes.count){this.network.vw();for(var b=this.network.vertexes.i;b.next();){var c=b.value;c.charge=this.electricalCharge(c);c.mass=this.gravitationalMass(c)}for(b=this.network.edges.i;b.next();)c=b.value,c.stiffness=this.springStiffness(c),c.length=this.springLength(c); +this.$y();this.cr=0;if(this.needsClusterLayout()){b=this.network;for(c=b.DI().i;c.next();){this.network=c.value;for(var d=this.network.vertexes.i;d.next();){var e=d.value;e.Zf=e.vertexes.count;e.dk=1;e.Dm=null;e.ph=null}Oq(this,0,a)}this.network=b;c.reset();for(var d=this.jD,f=c.count,h=!0,k=e=0,l=v.jb(),m=0;m<f+b.vertexes.count+2;m++)l[m]=null;f=0;c.reset();for(var n=v.ag();c.next();)if(m=c.value,this.ah(m,n),h)h=!1,e=n.x+n.width/2,k=n.y+n.height/2,l[0]=new z(n.x+n.width+d.width,n.y),l[1]=new z(n.x, +n.y+n.height+d.height),f=2;else{var p=Pq(l,f,e,k,n.width,n.height,d),q=l[p],r=new z(q.x+n.width+d.width,q.y),s=new z(q.x,q.y+n.height+d.height);p+1<f&&l.splice(p+1,0,null);l[p]=r;l[p+1]=s;f++;p=q.x-n.x;q=q.y-n.y;for(m=m.vertexes.i;m.next();)r=m.value,r.na+=p,r.ua+=q}v.Vb(n);for(m=b.vertexes.i;m.next();)h=m.value,n=h.mb,2>f?(e=n.x+n.width/2,k=n.y+n.height/2,l[0]=new z(n.x+n.width+d.width,n.y),l[1]=new z(n.x,n.y+n.height+d.height),f=2):(p=Pq(l,f,e,k,n.width,n.height,d),q=l[p],r=new z(q.x+n.width+d.width, +q.y),s=new z(q.x,q.y+n.height+d.height),p+1<f&&l.splice(p+1,0,null),l[p]=r,l[p+1]=s,f++,h.na=q.x+h.width/2,h.ua=q.y+h.height/2);v.sa(l);for(c.reset();c.next();){d=c.value;for(e=d.vertexes.i;e.next();)b.al(e.value);for(d=d.edges.i;d.next();)b.Go(d.value)}}Qq(this,a);this.updateParts()}this.eo=a;this.network=null;this.wf=!0}; +Mq.prototype.needsClusterLayout=function(){if(3>this.network.vertexes.count)return!1;for(var a=0,b=0,c=this.network.vertexes.first().mb,d=this.network.vertexes.i;d.next();){if(d.value.mb.yg(c)&&(a++,2<a))return!0;if(10<b)break;b++}return!1};Mq.prototype.ah=function(a,b){for(var c=!0,d=a.vertexes.i;d.next();){var e=d.value;c?(c=!1,b.set(e.mb)):b.bi(e.mb)}return b}; +function Oq(a,b,c){if(Rq(a,b)){var d=a.Dh;a.Dh*=1+1/(b+1);var e=Sq(a,b),f=Math.max(0,Math.max(Math.min(a.network.vertexes.count,c*(b+1)/11),10));a.Nz+=f;Oq(a,b+1,c);Qq(a,f);br(a,e);b=a.sg;null===b?b=new I(hr):b.clear();b.Tc(e.vertexes);b.sort(function(a,b){return null===a||null===b||a===b?0:b.Zf-a.Zf});for(e=b.i;e.next();)ir(a,e.value);a.Dh=d}} +function Rq(a,b){if(10<b||3>a.network.vertexes.count)return!1;null===a.sg?a.sg=new I(hr):a.sg.clear();a.sg.Tc(a.network.vertexes);var c=a.sg;c.sort(function(a,b){return null===a||null===b||a===b?0:b.Zf-a.Zf});for(var d=c.count-1;0<=d&&1>=c.da(d).Zf;)d--;return 1<c.count-d} +function Sq(a,b){for(var c=a.network,d=new Nq,e=a.sg.i;e.next();){var f=e.value;if(1<f.Zf){d.al(f);var h=new jr;h.zx=f.Zf;h.Ax=f.width;h.yx=f.height;h.GA=f.P.x;h.HA=f.P.y;null===f.ph&&(f.ph=new I(jr));f.ph.add(h);f.hA=f.ph.count-1}else break}for(var k=c.edges.i;k.next();)if(e=k.value,e.fromVertex.network===d&&e.toVertex.network===d)d.Go(e);else if(e.fromVertex.network===d){var l=e.fromVertex.Dm;null===l&&(l=new I(hr),e.fromVertex.Dm=l);l.add(e.toVertex);e.fromVertex.Zf--;e.fromVertex.dk+=e.toVertex.dk}else e.toVertex.network=== +d&&(l=e.toVertex.Dm,null===l&&(l=new I(hr),e.toVertex.Dm=l),l.add(e.fromVertex),e.toVertex.Zf--,e.toVertex.dk+=e.fromVertex.dk);for(e=d.edges.i;e.next();)f=e.value,f.length*=Math.max(1,Ld((f.fromVertex.dk+f.toVertex.dk)/(4*b+1)));for(e=d.vertexes.i;e.next();)if(f=e.value,l=f.Dm,null!==l&&0<l.count&&(h=f.ph.da(f.ph.count-1),h=h.zx-f.Zf,!(0>=h))){for(var m=0,n=0,p=l.count-h;p<l.count;p++){for(var q=l.da(p),r=null,k=q.edges.i;k.next();){var s=k.value;if(s.XG(q)===f){r=s;break}}null!==r&&(n+=r.length, +m+=q.width*q.height)}l=f.na;k=f.ua;p=f.width;q=f.height;r=f.P;s=p*q;1>s&&(s=1);m=Ld((m+s+n*n*4/(h*h))/s);h=(m-1)*p/2;m=(m-1)*q/2;f.mb=new A(l-r.x-h,k-r.y-m,p+2*h,q+2*m);f.focus=new z(r.x+h,r.y+m)}a.network=d;return c}function br(a,b){for(var c=a.network.vertexes.i;c.next();){var d=c.value;d.network=b;if(null!==d.ph){var e=d.ph.da(d.hA);d.Zf=e.zx;var f=e.GA,h=e.HA;d.mb=new A(d.na-f,d.ua-h,e.Ax,e.yx);d.focus=new z(f,h);d.hA--}}for(c=a.network.edges.i;c.next();)c.value.network=b;a.network=b} +function ir(a,b){var c=b.Dm;if(null!==c&&0!==c.count){var d=b.na,e=b.ua,f=b.width,h=b.height;null!==b.ph&&0<b.ph.count&&(h=b.ph.da(0),f=h.Ax,h=h.yx);for(var f=Ld(f*f+h*h)/2,k=!1,l=h=0,m=0,n=b.vertexes.i;n.next();){var p=n.value;1>=p.Zf?l++:(k=!0,m++,h+=Math.atan2(b.ua-p.ua,b.na-p.na))}if(0!==l)for(0<m&&(h/=m),n=m=0,m=k?2*Math.PI/(l+1):2*Math.PI/l,0===l%2&&(n=m/2),1<c.count&&c.sort(function(a,b){return null===a||null===b||a===b?0:b.width*b.height-a.width*a.height}),k=0===l%2?0:1,c=c.i;c.next();)if(l= +c.value,!(1<l.Zf||a.isFixed(l))){for(var p=null,q=l.edges.i;q.next();){p=q.value;break}var q=l.width,r=l.height,q=Ld(q*q+r*r)/2,p=f+p.length+q,q=h+(m*(k/2>>1)+n)*(0===k%2?1:-1);l.na=d+p*Math.cos(q);l.ua=e+p*Math.sin(q);k++}}}function Pq(a,b,c,d,e,f,h){var k=9E19,l=-1,m=0;a:for(;m<b;m++){var n=a[m],p=n.x-c,q=n.y-d,p=p*p+q*q;if(p<k){for(q=m-1;0<=q;q--)if(a[q].y>n.y&&a[q].x-n.x<e+h.width)continue a;for(q=m+1;q<b;q++)if(a[q].x>n.x&&a[q].y-n.y<f+h.height)continue a;l=m;k=p}}return l} +Mq.prototype.$y=function(){if(this.comments)for(var a=this.network.vertexes.i;a.next();)this.addComments(a.value)}; +Mq.prototype.addComments=function(a){var b=a.Jc;if(null!==b)for(b=b.KD();b.next();){var c=b.value;if("Comment"===c.fc&&c.isVisible()){var d=this.network.Lm(c);null===d&&(d=this.network.Ps(c));d.charge=this.CG;for(var c=null,e=d.hc;e.next();){var f=e.value;if(f.toVertex===a){c=f;break}}if(null===c)for(e=d.lc;e.next();)if(f=e.value,f.fromVertex===a){c=f;break}null===c&&(c=this.network.lp(a,d,null));c.length=this.DG}}}; +function kr(a,b){var c=a.M,d=c.x,e=c.y,f=c.width,c=c.height,h=b.M,k=h.x,l=h.y,m=h.width,h=h.height;return d+f<k?e>l+h?(d=d+f-k,e=e-l-h,Ld(d*d+e*e)):e+c<l?(d=d+f-k,e=e+c-l,Ld(d*d+e*e)):k-(d+f):d>k+m?e>l+h?(d=d-k-m,e=e-l-h,Ld(d*d+e*e)):e+c<l?(d=d-k-m,e=e+c-l,Ld(d*d+e*e)):d-(k+m):e>l+h?e-(l+h):e+c<l?l-(e+c):.1}function Qq(a,b){a.sg=null;for(var c=a.cr+b;a.cr<c&&(a.cr++,lr(a)););a.sg=null} +function lr(a){null===a.sg&&(a.sg=new I(hr),a.sg.Tc(a.network.vertexes));var b=a.sg.n;if(0>=b.length)return!1;var c=b[0];c.forceX=0;c.forceY=0;for(var d=c.na,e=d,f=c.ua,h=f,c=1;c<b.length;c++){var k=b[c];k.forceX=0;k.forceY=0;var l=k.na,k=k.ua,d=Math.min(d,l),e=Math.max(e,l),f=Math.min(f,k),h=Math.max(h,k)}(f=e-d>h-f)?b.sort(function(a,b){return null===a||null===b||a===b?0:a.na-b.na}):b.sort(function(a,b){return null===a||null===b||a===b?0:a.ua-b.ua});for(var h=a.Dh,m=0,n=0,p=0,c=0;c<b.length;c++){var k= +b[c],l=k.M,q=k.P,d=l.x+q.x,l=l.y+q.y,n=k.charge*a.electricalFieldX(d,l),p=k.charge*a.electricalFieldY(d,l),n=n+k.mass*a.gravitationalFieldX(d,l),p=p+k.mass*a.gravitationalFieldY(d,l);k.forceX+=n;k.forceY+=p;for(q=c+1;q<b.length;q++)if(e=b[q],e!==k){var r=e.M,n=e.P,p=r.x+n.x,r=r.y+n.y;if(d-p>h||p-d>h){if(f)break}else if(l-r>h||r-l>h){if(!f)break}else{var s=kr(k,e);1>s?(n=a.$w,null===n&&(a.$w=n=new va(0)),m=n.random(),s=n.random(),d>p?(n=Math.abs(e.M.right-k.M.x),n=(1+n)*m):d<p?(n=Math.abs(e.M.x-k.M.right), +n=-(1+n)*m):(n=Math.max(e.width,k.width),n=(1+n)*m-n/2),l>r?(p=Math.abs(e.M.bottom-k.M.y),p=(1+p)*s):d<p?(p=Math.abs(e.M.y-k.M.bottom),p=-(1+p)*s):(p=Math.max(e.height,k.height),p=(1+p)*s-p/2)):(m=-(k.charge*e.charge)/(s*s),n=(p-d)/s*m,p=(r-l)/s*m);k.forceX+=n;k.forceY+=p;e.forceX-=n;e.forceY-=p}}}for(c=a.network.edges.i;c.next();)f=c.value,k=f.fromVertex,e=f.toVertex,l=k.M,q=k.P,d=l.x+q.x,l=l.y+q.y,r=e.M,n=e.P,p=r.x+n.x,r=r.y+n.y,s=kr(k,e),1>s?(n=a.$w,null===n&&(a.$w=n=new va(0)),m=n.random(),s= +n.random(),n=(d>p?1:-1)*(1+(e.width>k.width)?e.width:k.width)*m,p=(l>r?1:-1)*(1+(e.height>k.height)?e.height:k.height)*s):(m=f.stiffness*(s-f.length),n=(p-d)/s*m,p=(r-l)/s*m),k.forceX+=n,k.forceY+=p,e.forceX-=n,e.forceY-=p;c=0;d=Math.max(a.Dh/20,50);for(e=0;e<b.length;e++)k=b[e],a.isFixed(k)?a.moveFixedVertex(k):(f=k.forceX,h=k.forceY,f<-d?f=-d:f>d&&(f=d),h<-d?h=-d:h>d&&(h=d),k.na+=f,k.ua+=h,c=Math.max(c,f*f+h*h));return c>a.GD*a.GD}Mq.prototype.moveFixedVertex=function(){}; +Mq.prototype.commitLayout=function(){this.nA();this.commitNodes();this.xt&&this.commitLinks()};Mq.prototype.nA=function(){if(this.Fp)for(var a=this.network.edges.i;a.next();){var b=a.value.link;null!==b&&(b.xb=fc,b.yb=fc)}};Mq.prototype.commitNodes=function(){var a=0,b=0;if(this.hG){var c=v.ag();this.ah(this.network,c);b=this.Xd;a=b.x-c.x;b=b.y-c.y;v.Vb(c)}for(var c=v.ag(),d=this.network.vertexes.i;d.next();){var e=d.value;if(0!==a||0!==b)c.assign(e.mb),c.x+=a,c.y+=b,e.mb=c;e.commit()}v.Vb(c)}; +Mq.prototype.commitLinks=function(){for(var a=this.network.edges.i;a.next();)a.value.commit()};Mq.prototype.springStiffness=function(a){a=a.stiffness;return isNaN(a)?this.Cn:a};Mq.prototype.springLength=function(a){a=a.length;return isNaN(a)?this.Bn:a};Mq.prototype.electricalCharge=function(a){a=a.charge;return isNaN(a)?this.yn:a};Mq.prototype.electricalFieldX=function(){return 0};Mq.prototype.electricalFieldY=function(){return 0}; +Mq.prototype.gravitationalMass=function(a){a=a.mass;return isNaN(a)?this.An:a};Mq.prototype.gravitationalFieldX=function(){return 0};Mq.prototype.gravitationalFieldY=function(){return 0};Mq.prototype.isFixed=function(a){return a.isFixed};v.u(Mq,{yJ:"currentIteration"},function(){return this.cr});v.defineProperty(Mq,{jD:"arrangementSpacing"},function(){return this.bg},function(a){v.A(a,ia,Mq,"arrangementSpacing");this.bg.K(a)||(this.bg.assign(a),this.H())}); +v.defineProperty(Mq,{hG:"arrangesToOrigin"},function(){return this.Wp},function(a){this.Wp!==a&&(v.j(a,"boolean",Mq,"arrangesToOrigin"),this.Wp=a,this.H())});v.defineProperty(Mq,{Fp:"setsPortSpots"},function(){return this.Lh},function(a){this.Lh!==a&&(v.j(a,"boolean",Mq,"setsPortSpots"),this.Lh=a,this.H())});v.defineProperty(Mq,{comments:"comments"},function(){return this.vh},function(a){this.vh!==a&&(v.j(a,"boolean",Mq,"comments"),this.vh=a,this.H())}); +v.defineProperty(Mq,{Nz:"maxIterations"},function(){return this.eo},function(a){this.eo!==a&&(v.j(a,"number",Mq,"maxIterations"),0<=a&&(this.eo=a,this.H()))});v.defineProperty(Mq,{GD:"epsilonDistance"},function(){return this.Cq},function(a){this.Cq!==a&&(v.j(a,"number",Mq,"epsilonDistance"),0<a&&(this.Cq=a,this.H()))});v.defineProperty(Mq,{PJ:"infinityDistance"},function(){return this.Dh},function(a){this.Dh!==a&&(v.j(a,"number",Mq,"infinityDistance"),1<a&&(this.Dh=a,this.H()))}); +v.defineProperty(Mq,{$w:"randomNumberGenerator"},function(){return this.Qr},function(a){this.Qr!==a&&(null!==a&&"function"!==typeof a.random&&v.k('ForceDirectedLayout.randomNumberGenerator must have a "random()" function on it: '+a),this.Qr=a)});v.defineProperty(Mq,{KJ:"defaultSpringStiffness"},function(){return this.Cn},function(a){this.Cn!==a&&(v.j(a,"number",Mq,"defaultSpringStiffness"),this.Cn=a,this.H())}); +v.defineProperty(Mq,{JJ:"defaultSpringLength"},function(){return this.Bn},function(a){this.Bn!==a&&(v.j(a,"number",Mq,"defaultSpringLength"),this.Bn=a,this.H())});v.defineProperty(Mq,{DJ:"defaultElectricalCharge"},function(){return this.yn},function(a){this.yn!==a&&(v.j(a,"number",Mq,"defaultElectricalCharge"),this.yn=a,this.H())});v.defineProperty(Mq,{EJ:"defaultGravitationalMass"},function(){return this.An},function(a){this.An!==a&&(v.j(a,"number",Mq,"defaultGravitationalMass"),this.An=a,this.H())}); +v.defineProperty(Mq,{DG:"defaultCommentSpringLength"},function(){return this.sq},function(a){this.sq!==a&&(v.j(a,"number",Mq,"defaultCommentSpringLength"),this.sq=a,this.H())});v.defineProperty(Mq,{CG:"defaultCommentElectricalCharge"},function(){return this.rq},function(a){this.rq!==a&&(v.j(a,"number",Mq,"defaultCommentElectricalCharge"),this.rq=a,this.H())});function jr(){this.HA=this.GA=this.yx=this.Ax=this.zx=0}function Nq(){$f.call(this)}v.Ja(Nq,$f);v.ea("ForceDirectedNetwork",Nq); +Nq.prototype.createVertex=function(){return new hr};Nq.prototype.createEdge=function(){return new mr};function hr(){oq.call(this);this.isFixed=!1;this.mass=this.charge=NaN;this.dk=this.Zf=this.forceY=this.forceX=0;this.ph=this.Dm=null;this.hA=0}v.Ja(hr,oq);v.ea("ForceDirectedVertex",hr);function mr(){pq.call(this);this.length=this.stiffness=NaN}v.Ja(mr,pq);v.ea("ForceDirectedEdge",mr); +function jn(){0<arguments.length&&v.cd(jn);Zf.call(this);this.Ed=this.Zl=25;this.aa=0;this.xn=nr;this.Zn=or;this.Pn=pr;this.Xl=4;this.kn=qr;this.Ei=rr;this.Lh=!0;this.hr=4;this.Fb=this.ov=this.ob=-1;this.Hf=this.rr=0;this.Lb=this.Ef=this.Ff=this.ig=this.Td=null;this.zr=0;this.yr=this.cm=null;this.mg=0;this.Ar=null;this.TA=new z;this.Tg=[];this.Tg.length=100}v.Ja(jn,Zf);v.ea("LayeredDigraphLayout",jn); +jn.prototype.cloneProtected=function(a){Zf.prototype.cloneProtected.call(this,a);a.Zl=this.Zl;a.Ed=this.Ed;a.aa=this.aa;a.xn=this.xn;a.Zn=this.Zn;a.Pn=this.Pn;a.Xl=this.Xl;a.kn=this.kn;a.Ei=this.Ei;a.Lh=this.Lh;a.hr=this.hr};jn.prototype.createNetwork=function(){return new sr}; +jn.prototype.doLayout=function(a){null===a&&v.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts");null===this.network&&(this.network=this.makeNetwork(a));this.Xd=this.initialOrigin(this.Xd);this.ov=-1;this.Hf=this.rr=0;this.Ar=this.yr=this.cm=null;for(a=0;a<this.Tg.length;a++)this.Tg[a]=null;if(0<this.network.vertexes.count){this.network.vw();for(a=this.network.edges.i;a.next();)a.value.rev=!1;switch(this.xn){default:case tr:var b=0,c=this.network.vertexes.count- +1;a=[];a.length=c+1;for(var d=this.network.vertexes.i;d.next();)d.value.valid=!0;for(;null!==ur(this.network);){for(d=vr(this.network);null!==d;)a[c]=d,c--,d.valid=!1,d=vr(this.network);for(d=wr(this.network);null!==d;)a[b]=d,b++,d.valid=!1,d=wr(this.network);for(var d=null,e=0,f=this.network.vertexes.i;f.next();){var h=f.value;if(h.valid){for(var k=0,l=h.hc;l.next();)l.value.toVertex.valid&&k++;for(var l=0,m=h.lc;m.next();)m.value.fromVertex.valid&&l++;if(null===d||e<k-l)d=h,e=k-l}}null!==d&&(a[b]= +d,b++,d.valid=!1)}for(b=0;b<this.network.vertexes.count;b++)a[b].index=b;for(a=this.network.edges.i;a.next();)b=a.value,b.fromVertex.index>b.toVertex.index&&(this.network.hx(b),b.rev=!0);break;case nr:for(b=this.network.vertexes.i;b.next();)a=b.value,a.Qo=-1,a.finish=-1;for(a=this.network.edges.i;a.next();)a.value.forest=!1;this.zr=0;for(b.reset();b.next();)c=b.value,0===c.lc.count&&xr(this,c);for(b.reset();b.next();)c=b.value,-1===c.Qo&&xr(this,c);for(a.reset();a.next();)b=a.value,b.forest||(c=b.fromVertex, +d=c.finish,e=b.toVertex,f=e.finish,e.Qo<c.Qo&&d<f&&(this.network.hx(b),b.rev=!0))}for(a=this.network.vertexes.i;a.next();)a.value.layer=-1;this.ob=-1;this.assignLayers();for(a.reset();a.next();)this.ob=Math.max(this.ob,a.value.layer);a=[];for(c=this.network.edges.i;c.next();)b=c.value,b.valid=!1,a.push(b);for(c=0;c<a.length;c++)if(b=a[c],!b.valid&&(null!==b.fromVertex.qd&&null!==b.toVertex.qd||b.fromVertex.layer!==b.toVertex.layer)){l=h=k=f=0;e=b.fromVertex;d=b.toVertex;if(null!==b.link){k=b.link; +if(null===k)continue;var n=e.qd,f=d.qd;if(null===n||null===f)continue;var p=k.T,h=k.Z,q=k.kd,l=k.Sd;b.rev&&(k=p,m=q,p=h,q=l,h=k,l=m);var r=e.P,k=b.toVertex.P,s=b.rev?d.M:e.M,m=v.L();s.G()?(ip(p,q,zb,m),m.G()||m.assign(r)):m.assign(r);n!==p&&s.G()&&p.isVisible()&&(n=e.M,n.G()&&(m.x+=s.x-n.x,m.y+=s.y-n.y));p=b.rev?e.M:d.M;n=v.L();p.G()?(ip(h,l,zb,n),n.G()||n.assign(k)):n.assign(k);f!==h&&p.G()&&h.isVisible()&&(f=d.M,f.G()&&(n.x+=p.x-f.x,n.y+=p.y-f.y));90===this.aa||270===this.aa?(f=Math.round((m.x- +r.x)/this.Ed),h=m.x,k=Math.round((n.x-k.x)/this.Ed),l=n.x):(f=Math.round((m.y-r.y)/this.Ed),h=m.y,k=Math.round((n.y-k.y)/this.Ed),l=n.y);v.v(m);v.v(n);b.portFromColOffset=f;b.portFromPos=h;b.portToColOffset=k;b.portToPos=l}else b.portFromColOffset=0,b.portFromPos=0,b.portToColOffset=0,b.portToPos=0;m=e.layer;r=d.layer;a:if(n=b,p=0,s=n.link,null!==s){var t=s.kd,u=s.Sd;if(null!==t&&null!==u){var x=s.T,q=s.Z;if(null!==x&&null!==q){var w=t.xb,y=u.yb;this.Fp||(s.xb.Uc()||(w=s.xb),s.yb.Uc()||(y=s.yb)); +var B=s.jc,H=yr(this,!0);if(w.Uc()||w===qb)w=H;var C=yr(this,!1);if(y.Uc()||y===qb)y=C;if(w.Wi()&&w.ap(C)&&y.Wi()&&y.ap(H)){p=0;break a}H=s.getLinkPoint(x,t,w,!0,B,q,u,v.L());w=s.getLinkDirection(x,t,H,w,!0,B,q,u);v.v(H);w===zr(this,n,!0)?p+=1:this.Fp&&null!==x&&1===x.ports.count&&n.rev&&(p+=1);w=s.getLinkPoint(q,u,y,!1,B,x,t,v.L());s=s.getLinkDirection(q,u,w,y,!1,B,x,t);v.v(w);s===zr(this,n,!1)?p+=2:this.Fp&&null!==q&&1===q.ports.count&&n.rev&&(p+=2)}}}n=1===p||3===p?!0:!1;if(p=2===p||3===p?!0:!1)q= +this.network.createVertex(),q.qd=null,q.Am=1,q.layer=m,q.near=e,this.network.al(q),e=this.network.lp(e,q,b.link),e.valid=!1,e.rev=b.rev,e.portFromColOffset=f,e.portToColOffset=0,e.portFromPos=h,e.portToPos=0,e=q;s=1;n&&s--;if(m-r>s&&0<m){b.valid=!1;q=this.network.createVertex();q.qd=null;q.Am=2;q.layer=m-1;this.network.al(q);e=this.network.lp(e,q,b.link);e.valid=!0;e.rev=b.rev;e.portFromColOffset=p?0:f;e.portToColOffset=0;e.portFromPos=p?0:h;e.portToPos=0;e=q;for(m--;m-r>s&&0<m;)q=this.network.createVertex(), +q.qd=null,q.Am=3,q.layer=m-1,this.network.al(q),e=this.network.lp(e,q,b.link),e.valid=!0,e.rev=b.rev,e.portFromColOffset=0,e.portToColOffset=0,e.portFromPos=0,e.portToPos=0,e=q,m--;e=this.network.lp(q,d,b.link);e.valid=!n;n&&(q.near=d);e.rev=b.rev;e.portFromColOffset=0;e.portToColOffset=k;e.portFromPos=0;e.portToPos=l}else b.valid=!0}b=this.Td=[];for(c=0;c<=this.ob;c++)b[c]=0;for(a=this.network.vertexes.i;a.next();)c=a.value,c.index=-1;this.initializeIndices();this.ov=-1;for(c=this.Hf=this.rr=0;c<= +this.ob;c++)b[c]>b[this.Hf]&&(this.ov=b[c]-1,this.Hf=c),b[c]<b[this.rr]&&(this.rr=c);this.Ar=[];for(c=0;c<b.length;c++)this.Ar[c]=[];for(a.reset();a.next();)b=a.value,c=this.Ar[b.layer],c[b.index]=b;this.Fb=-1;for(a=0;a<=this.ob;a++){b=Ar(this,a);c=0;d=this.Td[a];for(e=0;e<d;e++)f=b[e],c+=this.nodeMinColumnSpace(f,!0),f.column=c,c+=1,c+=this.nodeMinColumnSpace(f,!1);this.Fb=Math.max(this.Fb,c-1);Br(this,a,b)}this.reduceCrossings();this.straightenAndPack();this.updateParts()}this.network=null;this.wf= +!0};jn.prototype.linkMinLength=function(){return 1};function Cr(a){var b=a.fromVertex.qd;a=a.toVertex.qd;return null===b&&null===a?8:null===b||null===a?4:1}jn.prototype.nodeMinLayerSpace=function(a,b){return null===a.qd?0:90===this.aa||270===this.aa?b?a.P.y+10:a.M.height-a.P.y+10:b?a.P.x+10:a.M.width-a.P.x+10}; +jn.prototype.nodeMinColumnSpace=function(a,b){if(null===a.qd)return 0;var c=b?a.Vz:a.Uz;if(null!==c)return c;c=this.aa;return 90===c||270===c?b?a.Vz=a.P.x/this.Ed+1|0:a.Uz=(a.M.width-a.P.x)/this.Ed+1|0:b?a.Vz=a.P.y/this.Ed+1|0:a.Uz=(a.M.height-a.P.y)/this.Ed+1|0};function Dr(a){null===a.cm&&(a.cm=[]);for(var b=0,c=a.network.vertexes.i;c.next();){var d=c.value;a.cm[b]=d.layer;b++;a.cm[b]=d.column;b++;a.cm[b]=d.index;b++}return a.cm} +function Er(a,b){for(var c=0,d=a.network.vertexes.i;d.next();){var e=d.value;e.layer=b[c];c++;e.column=b[c];c++;e.index=b[c];c++}} +function Fr(a,b,c){var d=Ar(a,b),e=a.Td[b];if(null===a.yr||a.yr.length<e*e)a.yr=[];for(var f=a.yr,h=0;h<e;h++){var k=0,l=d[h],m=l.near,n=0;if(null!==m&&m.layer===l.layer)if(n=m.index,n>h)for(var p=h+1;p<n;p++)l=d[p],l.near===m&&l.Am===m.Am||k++;else for(p=h-1;p>n;p--)l=d[p],l.near===m&&l.Am===m.Am||k++;var m=0,q,r=q=p=l=0,s,t=0,u=0;s=0;var x;if(0<=c)for(n=d[h].Qe,m=0;m<n.count;m++)if(q=n.n[m],q.valid&&q.fromVertex.layer!==b)for(l=q.fromVertex.index,p=q.portToPos,q=q.portFromPos,r=m+1;r<n.count;r++)s= +n.n[r],s.valid&&s.fromVertex.layer!==b&&(t=s.fromVertex.index,u=s.portToPos,s=s.portFromPos,p<u&&(l>t||l===t&&q>s)&&k++,u<p&&(t>l||t===l&&s>q)&&k++);if(0>=c)for(n=d[h].Le,m=0;m<n.count;m++)if(q=n.n[m],q.valid&&q.toVertex.layer!==b)for(l=q.toVertex.index,p=q.portToPos,q=q.portFromPos,r=m+1;r<n.count;r++)s=n.n[r],s.valid&&s.toVertex.layer!==b&&(t=s.toVertex.index,u=s.portToPos,s=s.portFromPos,q<s&&(l>t||l===t&&p>u)&&k++,s<q&&(t>l||t===l&&u>p)&&k++);f[h*e+h]=k;for(n=h+1;n<e;n++){var w=0,y=0;if(0<=c)for(k= +d[h].Qe,x=d[n].Qe,m=0;m<k.count;m++)if(q=k.n[m],q.valid&&q.fromVertex.layer!==b)for(l=q.fromVertex.index,q=q.portFromPos,r=0;r<x.count;r++)s=x.n[r],s.valid&&s.fromVertex.layer!==b&&(t=s.fromVertex.index,s=s.portFromPos,(l<t||l===t&&q<s)&&y++,(t<l||t===l&&s<q)&&w++);if(0>=c)for(k=d[h].Le,x=d[n].Le,m=0;m<k.count;m++)if(q=k.n[m],q.valid&&q.toVertex.layer!==b)for(l=q.toVertex.index,p=q.portToPos,r=0;r<x.count;r++)s=x.n[r],s.valid&&s.toVertex.layer!==b&&(t=s.toVertex.index,u=s.portToPos,(l<t||l===t&&p< +u)&&y++,(t<l||t===l&&u<p)&&w++);f[h*e+n]=w;f[n*e+h]=y}}Br(a,b,d);return f}jn.prototype.countCrossings=function(){for(var a=0,b=0;b<=this.ob;b++)for(var c=Fr(this,b,1),d=this.Td[b],e=0;e<d;e++)for(var f=e;f<d;f++)a+=c[e*d+f];return a}; +function Gr(a){for(var b=0,c=0;c<=a.ob;c++){for(var d=a,e=c,f=Ar(d,e),h=d.Td[e],k=0,l=0;l<h;l++){var m=null,m=f[l].Le,n,p=0,q=0;if(null!==m)for(var r=0;r<m.count;r++)n=m.n[r],n.valid&&n.toVertex.layer!==e&&(p=n.fromVertex.column+n.portFromColOffset,q=n.toVertex.column+n.portToColOffset,k+=(Math.abs(p-q)+1)*Cr(n))}Br(d,e,f);b+=k}return b} +jn.prototype.normalize=function(){var a=Infinity;this.Fb=-1;for(var b=this.network.vertexes.i;b.next();){var c=b.value,a=Math.min(a,c.column-this.nodeMinColumnSpace(c,!0));this.Fb=Math.max(this.Fb,c.column+this.nodeMinColumnSpace(c,!1))}for(b.reset();b.next();)b.value.column-=a;this.Fb-=a}; +function Hr(a,b,c){for(var d=Ar(a,b),e=a.Td[b],f=[],h=0;h<e;h++){var k=d[h],l=null;0>=c&&(l=k.Qe);var m=null;0<=c&&(m=k.Le);var n=0,p=0,q=k.near;null!==q&&q.layer===k.layer&&(n+=q.column-1,p++);if(null!==l)for(q=0;q<l.count;q++){var k=l.n[q],r=k.fromVertex;k.valid&&!k.rev&&r.layer!==b&&(n+=r.column,p++)}if(null!==m)for(l=0;l<m.count;l++)k=m.n[l],q=k.toVertex,k.valid&&!k.rev&&q.layer!==b&&(n+=q.column,p++);f[h]=0===p?-1:n/p}Br(a,b,d);return f} +function Ir(a,b,c){for(var d=Ar(a,b),e=a.Td[b],f=[],h=0;h<e;h++){var k=d[h],l=null;0>=c&&(l=k.Qe);var m=null;0<=c&&(m=k.Le);var n=0,p=[],q=k.near;null!==q&&q.layer===k.layer&&(p[n]=q.column-1,n++);if(null!==l)for(q=0;q<l.count;q++){var k=l.n[q],r=k.fromVertex;k.valid&&!k.rev&&r.layer!==b&&(p[n]=r.column+k.portFromColOffset,n++)}if(null!==m)for(l=0;l<m.count;l++)k=m.n[l],q=k.toVertex,k.valid&&!k.rev&&q.layer!==b&&(p[n]=q.column+k.portToColOffset,n++);0===n?f[h]=-1:(p.sort(function(a,b){return a-b}), +m=n>>1,f[h]=n&1?p[m]:p[m-1]+p[m]>>1)}Br(a,b,d);return f}function Jr(a,b,c,d,e,f){if(b.component===d){b.component=c;var h=0,k=0;if(e)for(var l=b.hc;l.next();){var k=l.value,m=k.toVertex,h=b.layer-m.layer,k=a.linkMinLength(k);h===k&&Jr(a,m,c,d,e,f)}if(f)for(l=b.lc;l.next();)k=l.value,m=k.fromVertex,h=m.layer-b.layer,k=a.linkMinLength(k),h===k&&Jr(a,m,c,d,e,f)}} +function Kr(a,b,c,d,e,f){if(b.component===d){b.component=c;if(e)for(var h=b.hc;h.next();)Kr(a,h.value.toVertex,c,d,e,f);if(f)for(b=b.lc;b.next();)Kr(a,b.value.fromVertex,c,d,e,f)}}function ur(a){for(a=a.vertexes.i;a.next();){var b=a.value;if(b.valid)return b}return null}function vr(a){for(a=a.vertexes.i;a.next();){var b=a.value;if(b.valid){for(var c=!0,d=b.hc;d.next();)if(d.value.toVertex.valid){c=!1;break}if(c)return b}}return null} +function wr(a){for(a=a.vertexes.i;a.next();){var b=a.value;if(b.valid){for(var c=!0,d=b.lc;d.next();)if(d.value.fromVertex.valid){c=!1;break}if(c)return b}}return null}function xr(a,b){b.Qo=a.zr;a.zr++;for(var c=b.hc;c.next();){var d=c.value,e=d.toVertex;-1===e.Qo&&(d.forest=!0,xr(a,e))}b.finish=a.zr;a.zr++} +jn.prototype.assignLayers=function(){switch(this.Zn){case Lr:Mr(this);break;case Nr:for(var a=0,b=this.network.vertexes.i;b.next();)a=Or(this,b.value),this.ob=Math.max(a,this.ob);for(b.reset();b.next();)a=b.value,a.layer=this.ob-a.layer;break;default:case or:Mr(this);for(b=this.network.vertexes.i;b.next();)b.value.valid=!1;for(b.reset();b.next();)a=b.value,0===a.lc.count&&Pr(this,a);a=Infinity;for(b.reset();b.next();)a=Math.min(a,b.value.layer);this.ob=-1;for(b.reset();b.next();){var c=b.value;c.layer-= +a;this.ob=Math.max(this.ob,c.layer)}}};function Mr(a){for(var b=a.network.vertexes.i;b.next();){var c=Qr(a,b.value);a.ob=Math.max(c,a.ob)}}function Qr(a,b){var c=0;if(-1===b.layer){for(var d=b.hc;d.next();)var e=d.value,f=e.toVertex,e=a.linkMinLength(e),c=Math.max(c,Qr(a,f)+e);b.layer=c}else c=b.layer;return c}function Or(a,b){var c=0;if(-1===b.layer){for(var d=b.lc;d.next();)var e=d.value,f=e.fromVertex,e=a.linkMinLength(e),c=Math.max(c,Or(a,f)+e);b.layer=c}else c=b.layer;return c} +function Pr(a,b){if(!b.valid){b.valid=!0;for(var c=b.hc;c.next();)Pr(a,c.value.toVertex);for(c=a.network.vertexes.i;c.next();)c.value.component=-1;for(var d=b.Qe.n,e=d.length,f=0;f<e;f++){var h=d[f],k=a.linkMinLength(h);h.fromVertex.layer-h.toVertex.layer>k&&Jr(a,h.fromVertex,0,-1,!0,!1)}for(Jr(a,b,1,-1,!0,!0);0!==b.component;){for(var k=0,d=Infinity,l=0,m=null,n=a.network.vertexes.i;n.next();){var p=n.value;if(1===p.component){for(var q=0,r=!1,s=p.Qe.n,e=s.length,f=0;f<e;f++){var h=s[f],t=h.fromVertex, +q=q+1;1!==t.component&&(k+=1,t=t.layer-p.layer,h=a.linkMinLength(h),d=Math.min(d,t-h))}h=p.Le.n;e=h.length;for(f=0;f<e;f++)s=h[f].toVertex,q-=1,1!==s.component?k-=1:r=!0;(null===m||q<l)&&!r&&(m=p,l=q)}}if(0<k){for(c.reset();c.next();)e=c.value,1===e.component&&(e.layer+=d);b.component=0}else m.component=0}for(c=a.network.vertexes.i;c.next();)c.value.component=-1;for(Jr(a,b,1,-1,!0,!1);0!==b.component;){f=0;e=Infinity;d=0;k=null;for(l=a.network.vertexes.i;l.next();)if(m=l.value,1===m.component){n= +0;p=!1;h=m.Qe.n;q=h.length;for(r=0;r<q;r++)s=h[r].fromVertex,n+=1,1!==s.component?f+=1:p=!0;h=m.Le.n;q=h.length;for(r=0;r<q;r++)s=h[r],t=s.toVertex,n-=1,1!==t.component&&(f-=1,t=m.layer-t.layer,s=a.linkMinLength(s),e=Math.min(e,t-s));(null===k||n>d)&&!p&&(k=m,d=n)}if(0>f){for(c.reset();c.next();)f=c.value,1===f.component&&(f.layer-=e);b.component=0}else k.component=0}}} +function zr(a,b,c){return 90===a.aa?c&&!b.rev||!c&&b.rev?270:90:180===a.aa?c&&!b.rev||!c&&b.rev?0:180:270===a.aa?c&&!b.rev||!c&&b.rev?90:270:c&&!b.rev||!c&&b.rev?180:0} +jn.prototype.initializeIndices=function(){switch(this.Pn){default:case Rr:for(var a=this.network.vertexes.i;a.next();){var b=a.value,c=b.layer;b.index=this.Td[c];this.Td[c]++}break;case pr:a=this.network.vertexes.i;for(b=this.ob;0<=b;b--)for(a.reset();a.next();)c=a.value,c.layer===b&&-1===c.index&&Sr(this,c);break;case Tr:for(a=this.network.vertexes.i,b=0;b<=this.ob;b++)for(a.reset();a.next();)c=a.value,c.layer===b&&-1===c.index&&Ur(this,c)}}; +function Sr(a,b){var c=b.layer;b.index=a.Td[c];a.Td[c]++;for(var c=b.Le.cc(),d=!0;d;)for(var d=!1,e=0;e<c.length-1;e++){var f=c[e],h=c[e+1];f.portFromColOffset>h.portFromColOffset&&(d=!0,c[e]=h,c[e+1]=f)}for(e=0;e<c.length;e++)d=c[e],d.valid&&(d=d.toVertex,-1===d.index&&Sr(a,d))} +function Ur(a,b){var c=b.layer;b.index=a.Td[c];a.Td[c]++;for(var c=b.Qe.cc(),d=!0,e=0;d;)for(d=!1,e=0;e<c.length-1;e++){var f=c[e],h=c[e+1];f.portToColOffset>h.portToColOffset&&(d=!0,c[e]=h,c[e+1]=f)}for(e=0;e<c.length;e++)d=c[e],d.valid&&(d=d.fromVertex,-1===d.index&&Ur(a,d))} +jn.prototype.reduceCrossings=function(){for(var a=this.countCrossings(),b=Dr(this),c=0,d=0,e=0,c=0;c<this.Xl;c++){for(d=0;d<=this.ob;d++)Vr(this,d,1),Wr(this,d,1);e=this.countCrossings();e<a&&(a=e,b=Dr(this));for(d=this.ob;0<=d;d--)Vr(this,d,-1),Wr(this,d,-1);e=this.countCrossings();e<a&&(a=e,b=Dr(this))}Er(this,b);for(c=0;c<this.Xl;c++){for(d=0;d<=this.ob;d++)Vr(this,d,0),Wr(this,d,0);e=this.countCrossings();e<a&&(a=e,b=Dr(this));for(d=this.ob;0<=d;d--)Vr(this,d,0),Wr(this,d,0);e=this.countCrossings(); +e<a&&(a=e,b=Dr(this))}Er(this,b);var f=!1,h=c=0,k=0,d=0;switch(this.kn){case Xr:break;case Yr:for(k=a+1;(d=this.countCrossings())<k;)for(k=d,c=this.ob;0<=c;c--)for(h=0;h<=c;h++){for(f=!0;f;)for(f=!1,d=c;d>=h;d--)f=Wr(this,d,-1)||f;e=this.countCrossings();e>=a?Er(this,b):(a=e,b=Dr(this));for(f=!0;f;)for(f=!1,d=c;d>=h;d--)f=Wr(this,d,1)||f;e=this.countCrossings();e>=a?Er(this,b):(a=e,b=Dr(this));for(f=!0;f;)for(f=!1,d=h;d<=c;d++)f=Wr(this,d,1)||f;e>=a?Er(this,b):(a=e,b=Dr(this));for(f=!0;f;)for(f=!1, +d=h;d<=c;d++)f=Wr(this,d,-1)||f;e>=a?Er(this,b):(a=e,b=Dr(this));for(f=!0;f;)for(f=!1,d=c;d>=h;d--)f=Wr(this,d,0)||f;e>=a?Er(this,b):(a=e,b=Dr(this));for(f=!0;f;)for(f=!1,d=h;d<=c;d++)f=Wr(this,d,0)||f;e>=a?Er(this,b):(a=e,b=Dr(this))}break;default:case qr:for(c=this.ob,h=0,k=a+1;(d=this.countCrossings())<k;){k=d;for(f=!0;f;)for(f=!1,d=c;d>=h;d--)f=Wr(this,d,-1)||f;e=this.countCrossings();e>=a?Er(this,b):(a=e,b=Dr(this));for(f=!0;f;)for(f=!1,d=c;d>=h;d--)f=Wr(this,d,1)||f;e=this.countCrossings(); +e>=a?Er(this,b):(a=e,b=Dr(this));for(f=!0;f;)for(f=!1,d=h;d<=c;d++)f=Wr(this,d,1)||f;e>=a?Er(this,b):(a=e,b=Dr(this));for(f=!0;f;)for(f=!1,d=h;d<=c;d++)f=Wr(this,d,-1)||f;e>=a?Er(this,b):(a=e,b=Dr(this));for(f=!0;f;)for(f=!1,d=c;d>=h;d--)f=Wr(this,d,0)||f;e>=a?Er(this,b):(a=e,b=Dr(this));for(f=!0;f;)for(f=!1,d=h;d<=c;d++)f=Wr(this,d,0)||f;e>=a?Er(this,b):(a=e,b=Dr(this))}}Er(this,b)}; +function Vr(a,b,c){var d=0,e=Ar(a,b),f=a.Td[b],h=Ir(a,b,c);c=Hr(a,b,c);for(d=0;d<f;d++)-1===c[d]&&(c[d]=e[d].column),-1===h[d]&&(h[d]=e[d].column);for(var k=!0,l;k;)for(k=!1,d=0;d<f-1;d++)if(h[d+1]<h[d]||h[d+1]===h[d]&&c[d+1]<c[d])k=!0,l=h[d],h[d]=h[d+1],h[d+1]=l,l=c[d],c[d]=c[d+1],c[d+1]=l,l=e[d],e[d]=e[d+1],e[d+1]=l;for(d=h=0;d<f;d++)l=e[d],l.index=d,h+=a.nodeMinColumnSpace(l,!0),l.column=h,h+=1,h+=a.nodeMinColumnSpace(l,!1);Br(a,b,e)} +function Wr(a,b,c){var d=Ar(a,b),e=a.Td[b];c=Fr(a,b,c);var f=0,h;h=[];for(f=0;f<e;f++)h[f]=-1;var k;k=[];for(f=0;f<e;f++)k[f]=-1;for(var l=!1,m=!0;m;)for(m=!1,f=0;f<e-1;f++){var n=c[d[f].index*e+d[f+1].index],p=c[d[f+1].index*e+d[f].index],q=0,r=0,s=d[f].column,t=d[f+1].column,u=a.nodeMinColumnSpace(d[f],!0),x=a.nodeMinColumnSpace(d[f],!1),w=a.nodeMinColumnSpace(d[f+1],!0),y=a.nodeMinColumnSpace(d[f+1],!1),u=s-u+w,x=t-x+y,w=w=0,B=d[f].lc.i;for(B.reset();B.next();)if(y=B.value,y.valid&&y.fromVertex.layer=== +b){y=y.fromVertex;for(w=0;d[w]!==y;)w++;w<f&&(q+=2*(f-w),r+=2*(f+1-w));w===f+1&&(q+=1);w>f+1&&(q+=4*(w-f),r+=4*(w-(f+1)))}B=d[f].hc.i;for(B.reset();B.next();)if(y=B.value,y.valid&&y.toVertex.layer===b){y=y.toVertex;for(w=0;d[w]!==y;)w++;w===f+1&&(r+=1)}B=d[f+1].lc.i;for(B.reset();B.next();)if(y=B.value,y.valid&&y.fromVertex.layer===b){y=y.fromVertex;for(w=0;d[w]!==y;)w++;w<f&&(q+=2*(f+1-w),r+=2*(f-w));w===f&&(r+=1);w>f+1&&(q+=4*(w-(f+1)),r+=4*(w-f))}B=d[f+1].hc.i;for(B.reset();B.next();)if(y=B.value, +y.valid&&y.toVertex.layer===b){y=y.toVertex;for(w=0;d[w]!==y;)w++;w===f&&(q+=1)}var w=y=0,B=h[d[f].index],H=k[d[f].index],C=h[d[f+1].index],T=k[d[f+1].index];-1!==B&&(y+=Math.abs(B-s),w+=Math.abs(B-x));-1!==H&&(y+=Math.abs(H-s),w+=Math.abs(H-x));-1!==C&&(y+=Math.abs(C-t),w+=Math.abs(C-u));-1!==T&&(y+=Math.abs(T-t),w+=Math.abs(T-u));if(r<q-.5||r===q&&p<n-.5||r===q&&p===n&&w<y-.5)m=l=!0,d[f].column=x,d[f+1].column=u,n=d[f],d[f]=d[f+1],d[f+1]=n}for(f=0;f<e;f++)d[f].index=f;Br(a,b,d);return l} +jn.prototype.straightenAndPack=function(){var a=0,b=!1,c=0!==(this.Ei&Zr),a=this.Ei===rr;1E3<this.network.edges.count&&!a&&(c=!1);if(c){b=[];for(a=a=0;a<=this.ob;a++)b[a]=0;for(var d=0,e=this.network.vertexes.i;e.next();){var f=e.value,a=f.layer,d=f.column,f=this.nodeMinColumnSpace(f,!1);b[a]=Math.max(b[a],d+f)}for(e.reset();e.next();)f=e.value,a=f.layer,d=f.column,f.column=(8*(this.Fb-b[a])>>1)+8*d;this.Fb*=8}if(0!==(this.Ei&$r))for(b=!0;b;){b=!1;for(a=this.Hf+1;a<=this.ob;a++)b=as(this,a,1)||b; +for(a=this.Hf-1;0<=a;a--)b=as(this,a,-1)||b;b=as(this,this.Hf,0)||b}if(0!==(this.Ei&bs)){for(a=this.Hf+1;a<=this.ob;a++)cs(this,a,1);for(a=this.Hf-1;0<=a;a--)cs(this,a,-1);cs(this,this.Hf,0)}c&&(ds(this,-1),ds(this,1));if(0!==(this.Ei&$r))for(b=!0;b;){b=!1;b=as(this,this.Hf,0)||b;for(a=this.Hf+1;a<=this.ob;a++)b=as(this,a,0)||b;for(a=this.Hf-1;0<=a;a--)b=as(this,a,0)||b}};function as(a,b,c){for(var d=!1;es(a,b,c);)d=!0;return d} +function es(a,b,c){var d=0,e=Ar(a,b),f=a.Td[b],h=Hr(a,b,-1);if(0<c)for(d=0;d<f;d++)h[d]=-1;var k=Hr(a,b,1);if(0>c)for(d=0;d<f;d++)k[d]=-1;for(var l=!1,m=!0;m;)for(m=!1,d=0;d<f;d++){var n=e[d].column,p=a.nodeMinColumnSpace(e[d],!0),q=a.nodeMinColumnSpace(e[d],!1),r=0,r=0>d-1||n-e[d-1].column-1>p+a.nodeMinColumnSpace(e[d-1],!1)?n-1:n,p=0,p=d+1>=f||e[d+1].column-n-1>q+a.nodeMinColumnSpace(e[d+1],!0)?n+1:n,s=q=0,t=0,u=0,x=0,w=0;if(0>=c)for(var y=e[d].lc.i;y.next();){var B=y.value;B.valid&&B.fromVertex.layer!== +b&&(u=Cr(B),x=B.portFromColOffset,w=B.portToColOffset,B=B.fromVertex.column,q+=(Math.abs(n+w-(B+x))+1)*u,s+=(Math.abs(r+w-(B+x))+1)*u,t+=(Math.abs(p+w-(B+x))+1)*u)}if(0<=c)for(y=e[d].hc.i;y.next();)B=y.value,B.valid&&B.toVertex.layer!==b&&(u=Cr(B),x=B.portFromColOffset,w=B.portToColOffset,B=B.toVertex.column,q+=(Math.abs(n+x-(B+w))+1)*u,s+=(Math.abs(r+x-(B+w))+1)*u,t+=(Math.abs(p+x-(B+w))+1)*u);w=x=u=0;y=h[e[d].index];B=k[e[d].index];-1!==y&&(u+=Math.abs(y-n),x+=Math.abs(y-r),w+=Math.abs(y-p));-1!== +B&&(u+=Math.abs(B-n),x+=Math.abs(B-r),w+=Math.abs(B-p));if(s<q||s===q&&x<u)m=l=!0,e[d].column=r;else if(t<q||t===q&&w<u)m=l=!0,e[d].column=p}Br(a,b,e);a.normalize();return l} +function cs(a,b,c){var d=0,e=Ar(a,b),f=a.Td[b],h=Ir(a,b,c);c=[];for(d=0;d<f;d++)c[d]=h[d];for(h=!0;h;)for(h=!1,d=0;d<f;d++){var k=e[d].column,l=a.nodeMinColumnSpace(e[d],!0),m=a.nodeMinColumnSpace(e[d],!1),n=0,p=0,q=0,q=p=0;-1===c[d]?0===d&&d===f-1?n=k:0===d?(p=e[d+1].column,n=p-k===m+a.nodeMinColumnSpace(e[d+1],!0)?k-1:k):d===f-1?(q=e[d-1].column,n=k-q===l+a.nodeMinColumnSpace(e[d-1],!1)?k+1:k):(q=e[d-1].column,q=q+a.nodeMinColumnSpace(e[d-1],!1)+l+1,p=e[d+1].column,p=p-a.nodeMinColumnSpace(e[d+ +1],!0)-m-1,n=(q+p)/2|0):0===d&&d===f-1?n=c[d]:0===d?(p=e[d+1].column,p=p-a.nodeMinColumnSpace(e[d+1],!0)-m-1,n=Math.min(c[d],p)):d===f-1?(q=e[d-1].column,q=q+a.nodeMinColumnSpace(e[d-1],!1)+l+1,n=Math.max(c[d],q)):(q=e[d-1].column,q=q+a.nodeMinColumnSpace(e[d-1],!1)+l+1,p=e[d+1].column,p=p-a.nodeMinColumnSpace(e[d+1],!0)-m-1,q<c[d]&&c[d]<p?n=c[d]:q>=c[d]?n=q:p<=c[d]&&(n=p));n!==k&&(h=!0,e[d].column=n)}Br(a,b,e);a.normalize()} +function fs(a,b){for(var c=!0,d=a.network.vertexes.i;d.next();){var e=d.value,f=a.nodeMinColumnSpace(e,!0),h=a.nodeMinColumnSpace(e,!1);if(e.column-f<=b&&e.column+h>=b){c=!1;break}}e=!1;if(c)for(d.reset();d.next();)c=d.value,c.column>b&&(c.column-=1,e=!0);return e} +function gs(a,b){for(var c=b,c=b+1,d=0,e=[],f=[],d=0;d<=a.ob;d++)e[d]=!1,f[d]=!1;for(var h=a.network.vertexes.i;h.next();){var d=h.value,k=d.column-a.nodeMinColumnSpace(d,!0),l=d.column+a.nodeMinColumnSpace(d,!1);k<=b&&l>=b&&(e[d.layer]=!0);k<=c&&l>=c&&(f[d.layer]=!0)}k=!0;c=!1;for(d=0;d<=a.ob;d++)k=k&&!(e[d]&&f[d]);if(k)for(h.reset();h.next();)e=h.value,e.column>b&&(e.column-=1,c=!0);return c} +function ds(a,b){for(var c=0;c<=a.Fb;c++)for(;fs(a,c););a.normalize();for(c=0;c<a.Fb;c++)for(;gs(a,c););a.normalize();var c=0,d,e=0,f=0,h=0;if(0<b)for(c=0;c<=a.Fb;c++)for(d=Dr(a),e=Gr(a),f=e+1;e<f;)f=e,hs(a,c,1),h=Gr(a),h>e?Er(a,d):h<e&&(e=h,d=Dr(a));if(0>b)for(c=a.Fb;0<=c;c--)for(d=Dr(a),e=Gr(a),f=e+1;e<f;)f=e,hs(a,c,-1),h=Gr(a),h>e?Er(a,d):h<e&&(e=h,d=Dr(a));a.normalize()} +function hs(a,b,c){a.mg=0;for(var d=a.network.vertexes.i;d.next();)d.value.component=-1;if(0<c)for(d.reset();d.next();){var e=d.value;e.column-a.nodeMinColumnSpace(e,!0)<=b&&(e.component=a.mg)}if(0>c)for(d.reset();d.next();)e=d.value,e.column+a.nodeMinColumnSpace(e,!1)>=b&&(e.component=a.mg);a.mg++;for(d.reset();d.next();)b=d.value,-1===b.component&&(Kr(a,b,a.mg,-1,!0,!0),a.mg++);var f=0;b=[];for(f=0;f<a.mg*a.mg;f++)b[f]=!1;e=[];for(f=0;f<(a.ob+1)*(a.Fb+1);f++)e[f]=-1;for(d.reset();d.next();)for(var f= +d.value,h=f.layer,k=Math.max(0,f.column-a.nodeMinColumnSpace(f,!0)),l=Math.min(a.Fb,f.column+a.nodeMinColumnSpace(f,!1));k<=l;k++)e[h*(a.Fb+1)+k]=f.component;for(f=0;f<=a.ob;f++){if(0<c)for(k=0;k<a.Fb;k++)-1!==e[f*(a.Fb+1)+k]&&-1!==e[f*(a.Fb+1)+k+1]&&e[f*(a.Fb+1)+k]!==e[f*(a.Fb+1)+k+1]&&(b[e[f*(a.Fb+1)+k]*a.mg+e[f*(a.Fb+1)+k+1]]=!0);if(0>c)for(k=a.Fb;0<k;k--)-1!==e[f*(a.Fb+1)+k]&&-1!==e[f*(a.Fb+1)+k-1]&&e[f*(a.Fb+1)+k]!==e[f*(a.Fb+1)+k-1]&&(b[e[f*(a.Fb+1)+k]*a.mg+e[f*(a.Fb+1)+k-1]]=!0)}e=[];for(f= +0;f<a.mg;f++)e[f]=!0;h=new I("number");h.add(0);for(l=0;0!==h.count;)if(l=h.n[h.count-1],h.Vc(h.count-1),e[l])for(e[l]=!1,f=0;f<a.mg;f++)b[l*a.mg+f]&&h.yd(0,f);if(0<c)for(d.reset();d.next();)a=d.value,e[a.component]&&(a.column-=1);if(0>c)for(d.reset();d.next();)c=d.value,e[c.component]&&(c.column+=1)} +jn.prototype.commitLayout=function(){if(this.Fp)for(var a=yr(this,!0),b=yr(this,!1),c=this.network.edges.i;c.next();){var d=c.value.link;null!==d&&(d.xb=a,d.yb=b)}this.commitNodes();this.ez();this.xt&&this.commitLinks()};function yr(a,b){return 270===a.aa?b?sc:vc:90===a.aa?b?vc:sc:180===a.aa?b?tc:uc:b?uc:tc} +jn.prototype.commitNodes=function(){this.ig=[];this.Ff=[];this.Ef=[];this.Lb=[];for(var a=0;a<=this.ob;a++)this.ig[a]=0,this.Ff[a]=0,this.Ef[a]=0,this.Lb[a]=0;for(a=this.network.vertexes.i;a.next();){var b=a.value,c=b.layer;this.ig[c]=Math.max(this.ig[c],this.nodeMinLayerSpace(b,!0));this.Ff[c]=Math.max(this.Ff[c],this.nodeMinLayerSpace(b,!1))}for(var b=0,d=this.Zl,c=0;c<=this.ob;c++){var e=d;0>=this.ig[c]+this.Ff[c]&&(e=0);0<c&&(b+=e/2);90===this.aa||0===this.aa?(b+=this.Ff[c],this.Ef[c]=b,b+=this.ig[c]): +(b+=this.ig[c],this.Ef[c]=b,b+=this.Ff[c]);c<this.ob&&(b+=e/2);this.Lb[c]=b}d=b;b=this.Xd;for(c=0;c<=this.ob;c++)270===this.aa?this.Ef[c]=b.y+this.Ef[c]:90===this.aa?(this.Ef[c]=b.y+d-this.Ef[c],this.Lb[c]=d-this.Lb[c]):180===this.aa?this.Ef[c]=b.x+this.Ef[c]:(this.Ef[c]=b.x+d-this.Ef[c],this.Lb[c]=d-this.Lb[c]);a.reset();for(d=e=Infinity;a.next();){var c=a.value,f=c.layer,h=c.column|0,k=0,l=0;270===this.aa||90===this.aa?(k=b.x+this.Ed*h,l=this.Ef[f]):(k=this.Ef[f],l=b.y+this.Ed*h);c.na=k;c.ua=l; +e=Math.min(c.x,e);d=Math.min(c.y,d)}e=b.x-e;b=b.y-d;this.TA=null!==this.group?new z(e,b):ad;for(a.reset();a.next();)c=a.value,null!==this.group&&(c.x+=e,c.y+=b),c.commit()}; +jn.prototype.ez=function(){for(var a=0,b=this.Zl,c=0;c<=this.ob;c++)a+=this.ig[c],a+=this.Ff[c];for(var a=a+this.ob*b,b=[],c=this.Ed*this.Fb,d=this.JH;0<=d;d--)270===this.aa?0===d?b.push(new A(0,0,c,Math.abs(this.Lb[0]))):b.push(new A(0,this.Lb[d-1],c,Math.abs(this.Lb[d-1]-this.Lb[d]))):90===this.aa?0===d?b.push(new A(0,this.Lb[0],c,Math.abs(this.Lb[0]-a))):b.push(new A(0,this.Lb[d],c,Math.abs(this.Lb[d-1]-this.Lb[d]))):180===this.aa?0===d?b.push(new A(0,0,Math.abs(this.Lb[0]),c)):b.push(new A(this.Lb[d- +1],0,Math.abs(this.Lb[d-1]-this.Lb[d]),c)):0===d?b.push(new A(this.Lb[0],0,Math.abs(this.Lb[0]-a),c)):b.push(new A(this.Lb[d],0,Math.abs(this.Lb[d-1]-this.Lb[d]),c));this.commitLayers(b,this.TA)};jn.prototype.commitLayers=function(){}; +jn.prototype.commitLinks=function(){for(var a=this.network.edges.i,b;a.next();)b=a.value.link,null!==b&&(b.Cl(),b.Mo(),b.Pi());for(a.reset();a.next();)b=a.value.link,null!==b&&b.en();for(a.reset();a.next();){var c=a.value;b=c.link;if(null!==b){b.Cl();var d=b,e=d.T,f=d.Z,h=d.kd,k=d.Sd;if(c.valid){if(b.Ke===Ni&&4===b.oa){if(c.rev)var l=e,e=f,f=l,m=h,h=k,k=m;if(c.fromVertex.column===c.toVertex.column){var n=b.getLinkPoint(e,h,b.computeSpot(!0),!0,!1,f,k),p=b.getLinkPoint(f,k,b.computeSpot(!1),!1,!1, +e,h);n.G()||n.set(e.U.dl);p.G()||p.set(f.U.dl);b.Mo();b.$k(n.x,n.y);b.$k((2*n.x+p.x)/3,(2*n.y+p.y)/3);b.$k((n.x+2*p.x)/3,(n.y+2*p.y)/3);b.$k(p.x,p.y)}else{var q=!1,r=!1;null!==h&&b.computeSpot(!0)===qb&&(q=!0);null!==k&&b.computeSpot(!1)===qb&&(r=!0);if(q||r){var s=b.l(0).x,t=b.l(0).y,u=b.l(1).x,x=b.l(1).y,w=b.l(2).x,y=b.l(2).y,B=b.l(3).x,H=b.l(3).y;if(q){90===this.aa||270===this.aa?(u=s,x=(t+H)/2):(u=(s+B)/2,x=t);b.V(1,u,x);var C=b.getLinkPoint(e,h,b.computeSpot(!0),!0,!1,f,k);C.G()||C.set(e.U.dl); +b.V(0,C.x,C.y)}r&&(90===this.aa||270===this.aa?(w=B,y=(t+H)/2):(w=(s+B)/2,y=H),b.V(2,w,y),C=b.getLinkPoint(f,k,b.computeSpot(!1),!1,!1,e,h),C.G()||C.set(f.U.dl),b.V(3,C.x,C.y))}}}b.Pi()}else if(c.fromVertex.layer===c.toVertex.layer)b.Pi();else{var T=!1,ba=!1,U=0,M=b.it+1;if(b.jc)ba=!0,U=b.oa,4<U&&b.points.removeRange(2,U-3);else if(b.Ke===Ni)T=!0,U=b.oa,4<U&&b.points.removeRange(2,U-3),M=2;else{var U=b.oa,aa=b.computeSpot(!0)===qb,Ia=b.computeSpot(!1)===qb;2<U&&aa&&Ia?b.points.removeRange(1,U-2): +3<U&&aa&&!Ia?b.points.removeRange(1,U-3):3<U&&!aa&&Ia?b.points.removeRange(2,U-2):4<U&&!aa&&!Ia&&b.points.removeRange(2,U-3)}var oa=c.fromVertex,Ga=c.toVertex,pa,Ca;if(c.rev){for(var ua=0;null!==Ga&&oa!==Ga;){Ca=pa=null;for(var gc=Ga.lc.i;gc.next();){var ud=gc.value;if(ud.link===c.link&&(pa=ud.fromVertex,Ca=ud.toVertex,null===pa.qd))break}if(pa!==oa)if(ob=b.l(M-1).x,eb=b.l(M-1).y,ka=pa.na,la=pa.ua,ba)180===this.aa||0===this.aa?2===M?(b.w(M++,ob,eb),b.w(M++,ob,la)):(we=null!==Ca?Ca.ua:eb,we!==la&& +(pb=this.Lb[pa.layer-1],b.w(M++,pb,eb),b.w(M++,pb,la))):2===M?(b.w(M++,ob,eb),b.w(M++,ka,eb)):(xd=null!==Ca?Ca.na:ob,xd!==ka&&(pb=this.Lb[pa.layer-1],b.w(M++,ob,pb),b.w(M++,ka,pb)));else if(2===M)if(Ua=Math.max(10,this.ig[Ga.layer]),Ra=Math.max(10,this.Ff[Ga.layer]),T)180===this.aa?ka<=Ga.M.x?(ua=Ga.M.x,b.w(M++,ua-Ua,la),b.w(M++,ua,la),b.w(M++,ua+Ra,la)):(b.w(M++,ka-Ua,la),b.w(M++,ka,la),b.w(M++,ka+Ra,la)):90===this.aa?la>=Ga.M.bottom?(ua=Ga.M.y+Ga.M.height,b.w(M++,ka,ua+Ra),b.w(M++,ka,ua),b.w(M++, +ka,ua-Ua)):(b.w(M++,ka,la+Ra),b.w(M++,ka,la),b.w(M++,ka,la-Ua)):270===this.aa?la<=Ga.M.y?(ua=Ga.M.y,b.w(M++,ka,ua-Ua),b.w(M++,ka,ua),b.w(M++,ka,ua+Ra)):(b.w(M++,ka,la-Ua),b.w(M++,ka,la),b.w(M++,ka,la+Ra)):0===this.aa&&(ka>=Ga.M.right?(ua=Ga.M.x+Ga.M.width,b.w(M++,ua+Ra,la),b.w(M++,ua,la),b.w(M++,ua-Ua,la)):(b.w(M++,ka+Ra,la),b.w(M++,ka,la),b.w(M++,ka-Ua,la)));else{b.w(M++,ob,eb);var vd=0;if(180===this.aa||0===this.aa){if(180===this.aa?ka>=Ga.M.right:ka<=Ga.M.x)vd=(0===this.aa?-Ua:Ra)/2;b.w(M++,ob+ +vd,la)}else{if(270===this.aa?la>=Ga.M.bottom:la<=Ga.M.y)vd=(90===this.aa?-Ua:Ra)/2;b.w(M++,ka,eb+vd)}b.w(M++,ka,la)}else Ua=Math.max(10,this.ig[pa.layer]),Ra=Math.max(10,this.Ff[pa.layer]),180===this.aa?(T&&b.w(M++,ka-Ua,la),b.w(M++,ka,la),T&&b.w(M++,ka+Ra,la)):90===this.aa?(T&&b.w(M++,ka,la+Ra),b.w(M++,ka,la),T&&b.w(M++,ka,la-Ua)):270===this.aa?(T&&b.w(M++,ka,la-Ua),b.w(M++,ka,la),T&&b.w(M++,ka,la+Ra)):(T&&b.w(M++,ka+Ra,la),b.w(M++,ka,la),T&&b.w(M++,ka-Ua,la));Ga=pa}if(null===k||b.computeSpot(!1)!== +qb||ba)if(ob=b.l(M-1).x,eb=b.l(M-1).y,ka=b.l(M).x,la=b.l(M).y,ba){var Le=this.Ff[oa.layer],Wb=0;180===this.aa||0===this.aa?(Wb=eb,Wb>=oa.M.y&&Wb<=oa.M.bottom&&(180===this.aa?ka>=oa.M.x:ka<=oa.M.right)&&(ua=oa.na+(180===this.aa?-Le:Le),Wb=Wb<oa.M.y+oa.M.height/2?oa.M.y-this.Ed/2:oa.M.bottom+this.Ed/2,b.w(M++,ua,eb),b.w(M++,ua,Wb)),b.w(M++,ka,Wb)):(Wb=ob,Wb>=oa.M.x&&Wb<=oa.M.right&&(270===this.aa?la>=oa.M.y:la<=oa.M.bottom)&&(ua=oa.ua+(270===this.aa?-Le:Le),Wb=Wb<oa.M.x+oa.M.width/2?oa.M.x-this.Ed/ +2:oa.M.right+this.Ed/2,b.w(M++,ob,ua),b.w(M++,Wb,ua)),b.w(M++,Wb,la));b.w(M++,ka,la)}else if(T)Ua=Math.max(10,this.ig[oa.layer]),Ra=Math.max(10,this.Ff[oa.layer]),180===this.aa&&ka>=oa.M.x?(ua=oa.M.x+oa.M.width,b.V(M-2,ua,eb),b.V(M-1,ua+Ra,eb)):90===this.aa&&la<=oa.M.bottom?(ua=oa.M.y,b.V(M-2,ob,ua),b.V(M-1,ob,ua-Ua)):270===this.aa&&la>=oa.M.y?(ua=oa.M.y+oa.M.height,b.V(M-2,ob,ua),b.V(M-1,ob,ua+Ra)):0===this.aa&&ka<=oa.M.right&&(ua=oa.M.x,b.V(M-2,ua,eb),b.V(M-1,ua-Ua,eb));else{Ua=Math.max(10,this.ig[oa.layer]); +Ra=Math.max(10,this.Ff[oa.layer]);vd=0;if(180===this.aa||0===this.aa){if(180===this.aa?ka<=oa.M.x:ka>=oa.M.right)vd=(0===this.aa?Ra:-Ua)/2;b.w(M++,ka+vd,eb)}else{if(270===this.aa?la<=oa.M.y:la>=oa.M.bottom)vd=(90===this.aa?Ra:-Ua)/2;b.w(M++,ob,la+vd)}b.w(M++,ka,la)}}else{for(;null!==oa&&oa!==Ga;){Ca=pa=null;for(var Jg=oa.hc.i;Jg.next();){var wd=Jg.value;if(wd.link===c.link&&(pa=wd.toVertex,Ca=wd.fromVertex,null!==Ca.qd&&(Ca=null),null===pa.qd))break}var ob=0,eb=0,ka=0,la=0,pb=0,Ua=0,Ra=0;if(pa!== +Ga)if(ob=b.l(M-1).x,eb=b.l(M-1).y,ka=pa.na,la=pa.ua,ba)if(180===this.aa||0===this.aa){var we=null!==Ca?Ca.ua:eb;we!==la&&(pb=this.Lb[pa.layer],2===M&&(pb=0===this.aa?Math.max(pb,ob):Math.min(pb,ob)),b.w(M++,pb,eb),b.w(M++,pb,la))}else{var xd=null!==Ca?Ca.na:ob;xd!==ka&&(pb=this.Lb[pa.layer],2===M&&(pb=90===this.aa?Math.max(pb,eb):Math.min(pb,eb)),b.w(M++,ob,pb),b.w(M++,ka,pb))}else Ua=Math.max(10,this.ig[pa.layer]),Ra=Math.max(10,this.Ff[pa.layer]),180===this.aa?(b.w(M++,ka+Ra,la),T&&b.w(M++,ka,la), +b.w(M++,ka-Ua,la)):90===this.aa?(b.w(M++,ka,la-Ua),T&&b.w(M++,ka,la),b.w(M++,ka,la+Ra)):270===this.aa?(b.w(M++,ka,la+Ra),T&&b.w(M++,ka,la),b.w(M++,ka,la-Ua)):(b.w(M++,ka-Ua,la),T&&b.w(M++,ka,la),b.w(M++,ka+Ra,la));oa=pa}ba&&(ob=b.l(M-1).x,eb=b.l(M-1).y,ka=b.l(M).x,la=b.l(M).y,180===this.aa||0===this.aa?eb!==la&&(pb=0===this.aa?Math.min(Math.max((ka+ob)/2,this.Lb[Ga.layer]),ka):Math.max(Math.min((ka+ob)/2,this.Lb[Ga.layer]),ka),b.w(M++,pb,eb),b.w(M++,pb,la)):ob!==ka&&(pb=90===this.aa?Math.min(Math.max((la+ +eb)/2,this.Lb[Ga.layer]),la):Math.max(Math.min((la+eb)/2,this.Lb[Ga.layer]),la),b.w(M++,ob,pb),b.w(M++,ka,pb)))}if(null!==d&&T){if(null!==h){if(b.computeSpot(!0)===qb){var ie=b.l(0),Nd=b.l(2);ie.K(Nd)||b.V(1,(ie.x+Nd.x)/2,(ie.y+Nd.y)/2)}C=b.getLinkPoint(e,h,qb,!0,!1,f,k);C.G()||C.set(e.U.dl);b.V(0,C.x,C.y)}null!==k&&(b.computeSpot(!1)===qb&&(ie=b.l(b.oa-1),Nd=b.l(b.oa-3),ie.K(Nd)||b.V(b.oa-2,(ie.x+Nd.x)/2,(ie.y+Nd.y)/2)),C=b.getLinkPoint(f,k,qb,!1,!1,e,h),C.G()||C.set(f.U.dl),b.V(b.oa-1,C.x,C.y))}b.Pi(); +c.commit()}}}for(var je=new I(W),Kg=this.network.edges.i;Kg.next();){var dd=Kg.value.link;null!==dd&&dd.jc&&!je.contains(dd)&&je.add(dd)}if(0<je.count)if(90===this.aa||270===this.aa){for(var oi=0,vb=new I(is),Xb,Od,mh=je.i;mh.next();){var Jb=mh.value;if(null!==Jb&&Jb.jc)for(var hb=2;hb<Jb.oa-3;hb++)if(Xb=Jb.l(hb),Od=Jb.l(hb+1),js(Xb.y,Od.y)&&!js(Xb.x,Od.x)){var ab=new is;ab.layer=Math.floor(Xb.y/2);var Me=Jb.l(0),Pd=Jb.l(Jb.oa-1);ab.first=Me.x*Me.x+Me.y;ab.Qd=Pd.x*Pd.x+Pd.y;ab.He=Math.min(Xb.x,Od.x); +ab.Yd=Math.max(Xb.x,Od.x);ab.index=hb;ab.link=Jb;if(hb+2<Jb.oa){var Lg=Jb.l(hb-1),Mg=Jb.l(hb+2),hc=0;Lg.y<Xb.y?hc=Mg.y<Xb.y?3:Xb.x<Od.x?2:1:Lg.y>Xb.y&&(hc=Mg.y>Xb.y?0:Od.x<Xb.x?2:1);ab.ai=hc}vb.add(ab)}}if(1<vb.count){vb.sort(this.SE);for(var ic=0;ic<vb.count;){for(var ke=vb.n[ic].layer,ed=ic+1;ed<vb.count&&vb.n[ed].layer===ke;)ed++;if(1<ed-ic)for(var jb=ic;jb<ed;){for(var Tc=vb.n[jb].Yd,Ka=ic+1;Ka<ed&&vb.n[Ka].He<Tc;)Tc=Math.max(Tc,vb.n[Ka].Yd),Ka++;var kb=Ka-jb;if(1<kb){vb.Ip(this.jx,jb,jb+kb); +for(var wc=1,yd=vb.n[jb].Qd,hb=jb;hb<Ka;hb++){var Hb=vb.n[hb];Hb.Qd!==yd&&(wc++,yd=Hb.Qd)}vb.Ip(this.RE,jb,jb+kb);for(var le=1,yd=vb.n[jb].first,hb=jb;hb<Ka;hb++)Hb=vb.n[hb],Hb.first!==yd&&(le++,yd=Hb.first);var of=!0,Ne=le;wc<le?(of=!1,Ne=wc,yd=vb.n[jb].Qd,vb.Ip(this.jx,jb,jb+kb)):yd=vb.n[jb].first;for(var Jf=0,hb=jb;hb<Ka;hb++){Hb=vb.n[hb];(of?Hb.first:Hb.Qd)!==yd&&(Jf++,yd=of?Hb.first:Hb.Qd);Jb=Hb.link;Xb=Jb.l(Hb.index);Od=Jb.l(Hb.index+1);var Kb=this.qE*(Jf-(Ne-1)/2);oi++;Jb.Cl();Jb.V(Hb.index, +Xb.x,Xb.y+Kb);Jb.V(Hb.index+1,Od.x,Od.y+Kb);Jb.Pi()}}jb=Ka}ic=ed}}}else{for(var xe=0,Lb=new I(is),jc,Qb,Ic=je.i;Ic.next();){var wb=Ic.value;if(null!==wb&&wb.jc)for(var Bb=2;Bb<wb.oa-3;Bb++)if(jc=wb.l(Bb),Qb=wb.l(Bb+1),js(jc.x,Qb.x)&&!js(jc.y,Qb.y)){var Ib=new is;Ib.layer=Math.floor(jc.x/2);var Qd=wb.l(0),Ng=wb.l(wb.oa-1);Ib.first=Qd.x+Qd.y*Qd.y;Ib.Qd=Ng.x+Ng.y*Ng.y;Ib.He=Math.min(jc.y,Qb.y);Ib.Yd=Math.max(jc.y,Qb.y);Ib.index=Bb;Ib.link=wb;if(Bb+2<wb.oa){var nh=wb.l(Bb-1),oh=wb.l(Bb+2),ye=0;nh.x<jc.x? +ye=oh.x<jc.x?3:jc.y<Qb.y?2:1:nh.x>jc.x&&(ye=oh.x>jc.x?0:Qb.y<jc.y?2:1);Ib.ai=ye}Lb.add(Ib)}}if(1<Lb.count){Lb.sort(this.SE);for(var Jc=0;Jc<Lb.count;){for(var ze=Lb.n[Jc].layer,kc=Jc+1;kc<Lb.count&&Lb.n[kc].layer===ze;)kc++;if(1<kc-Jc)for(var xb=Jc;xb<kc;){for(var yb=Lb.n[xb].Yd,Kc=Jc+1;Kc<kc&&Lb.n[Kc].He<yb;)yb=Math.max(yb,Lb.n[Kc].Yd),Kc++;var Og=Kc-xb;if(1<Og){Lb.Ip(this.jx,xb,xb+Og);for(var Uc=1,Vc=Lb.n[xb].Qd,Bb=xb;Bb<Kc;Bb++){var ib=Lb.n[Bb];ib.Qd!==Vc&&(Uc++,Vc=ib.Qd)}Lb.Ip(this.RE,xb,xb+Og); +for(var Lc=1,Vc=Lb.n[xb].first,Bb=xb;Bb<Kc;Bb++)ib=Lb.n[Bb],ib.first!==Vc&&(Lc++,Vc=ib.first);var Rd=!0,Sd=Lc;Uc<Lc?(Rd=!1,Sd=Uc,Vc=Lb.n[xb].Qd,Lb.Ip(this.jx,xb,xb+Og)):Vc=Lb.n[xb].first;for(var pf=0,Bb=xb;Bb<Kc;Bb++){ib=Lb.n[Bb];(Rd?ib.first:ib.Qd)!==Vc&&(pf++,Vc=Rd?ib.first:ib.Qd);wb=ib.link;jc=wb.l(ib.index);Qb=wb.l(ib.index+1);var pi=this.qE*(pf-(Sd-1)/2);xe++;wb.Cl();wb.V(ib.index,jc.x+pi,jc.y);wb.V(ib.index+1,Qb.x+pi,Qb.y);wb.Pi()}}xb=Kc}Jc=kc}}}}; +jn.prototype.SE=function(a,b){return a instanceof is&&b instanceof is&&a!==b?a.layer<b.layer?-1:a.layer>b.layer?1:a.He<b.He?-1:a.He>b.He?1:a.Yd<b.Yd?-1:a.Yd>b.Yd?1:0:0};jn.prototype.RE=function(a,b){return a instanceof is&&b instanceof is&&a!==b?a.first<b.first?-1:a.first>b.first||a.ai<b.ai?1:a.ai>b.ai||a.He<b.He?-1:a.He>b.He?1:a.Yd<b.Yd?-1:a.Yd>b.Yd?1:0:0}; +jn.prototype.jx=function(a,b){return a instanceof is&&b instanceof is&&a!==b?a.Qd<b.Qd?-1:a.Qd>b.Qd||a.ai<b.ai?1:a.ai>b.ai||a.He<b.He?-1:a.He>b.He?1:a.Yd<b.Yd?-1:a.Yd>b.Yd?1:0:0};function js(a,b){var c=a-b;return-1<c&&1>c}function Ar(a,b){var c,d=a.Td[b];if(d>=a.Tg.length){c=[];for(var e=0;e<a.Tg.length;e++)c[e]=a.Tg[e];a.Tg=c}void 0===a.Tg[d]||null===a.Tg[d]?c=[]:(c=a.Tg[d],a.Tg[d]=null);d=a.Ar[b];for(e=0;e<d.length;e++){var f=d[e];c[f.index]=f}return c}function Br(a,b,c){a.Tg[a.Td[b]]=c} +v.defineProperty(jn,{layerSpacing:"layerSpacing"},function(){return this.Zl},function(a){this.Zl!==a&&(v.j(a,"number",jn,"layerSpacing"),0<=a&&(this.Zl=a,this.H()))});v.defineProperty(jn,{vJ:"columnSpacing"},function(){return this.Ed},function(a){this.Ed!==a&&(v.j(a,"number",jn,"columnSpacing"),0<a&&(this.Ed=a,this.H()))}); +v.defineProperty(jn,{direction:"direction"},function(){return this.aa},function(a){this.aa!==a&&(v.j(a,"number",jn,"direction"),0===a||90===a||180===a||270===a?(this.aa=a,this.H()):v.k("LayeredDigraphLayout.direction must be 0, 90, 180, or 270"))});v.defineProperty(jn,{angle:"angle"},function(){return this.direction},function(a){this.direction=a}); +v.defineProperty(jn,{BG:"cycleRemoveOption"},function(){return this.xn},function(a){this.xn!==a&&(v.pb(a,jn,jn,"cycleRemoveOption"),a===tr||a===nr)&&(this.xn=a,this.H())});v.defineProperty(jn,{AH:"layeringOption"},function(){return this.Zn},function(a){this.Zn!==a&&(v.pb(a,jn,jn,"layeringOption"),a===or||a===Lr||a===Nr)&&(this.Zn=a,this.H())}); +v.defineProperty(jn,{mH:"initializeOption"},function(){return this.Pn},function(a){this.Pn!==a&&(v.pb(a,jn,jn,"initializeOption"),a===pr||a===Tr||a===Rr)&&(this.Pn=a,this.H())});v.defineProperty(jn,{ZJ:"iterations"},function(){return this.Xl},function(a){this.Xl!==a&&(v.We(a,sr,"iterations"),0<=a&&(this.Xl=a,this.H()))});v.defineProperty(jn,{fG:"aggressiveOption"},function(){return this.kn},function(a){this.kn!==a&&(v.pb(a,jn,jn,"aggressiveOption"),a===Xr||a===qr||a===Yr)&&(this.kn=a,this.H())}); +v.defineProperty(jn,{vK:"packOption"},function(){return this.Ei},function(a){this.Ei!==a&&(v.j(a,"number",jn,"packOption"),0<=a&&8>a&&(this.Ei=a,this.H()))});v.defineProperty(jn,{Fp:"setsPortSpots"},function(){return this.Lh},function(a){this.Lh!==a&&(v.j(a,"boolean",jn,"setsPortSpots"),this.Lh=a,this.H())});v.defineProperty(jn,{qE:"linkSpacing"},function(){return this.hr},function(a){this.hr!==a&&(v.j(a,"number",jn,"linkSpacing"),0<=a&&(this.hr=a,this.H()))});v.u(jn,{JH:"maxLayer"},function(){return this.ob}); +v.u(jn,{eK:"maxIndex"},function(){return this.ov});v.u(jn,{dK:"maxColumn"},function(){return this.Fb});v.u(jn,{jK:"minIndexLayer"},function(){return this.rr});v.u(jn,{fK:"maxIndexLayer"},function(){return this.Hf});var nr;jn.CycleDepthFirst=nr=v.p(jn,"CycleDepthFirst",0);var tr;jn.CycleGreedy=tr=v.p(jn,"CycleGreedy",1);var or;jn.LayerOptimalLinkLength=or=v.p(jn,"LayerOptimalLinkLength",0);var Lr;jn.LayerLongestPathSink=Lr=v.p(jn,"LayerLongestPathSink",1);var Nr; +jn.LayerLongestPathSource=Nr=v.p(jn,"LayerLongestPathSource",2);var pr;jn.InitDepthFirstOut=pr=v.p(jn,"InitDepthFirstOut",0);var Tr;jn.InitDepthFirstIn=Tr=v.p(jn,"InitDepthFirstIn",1);var Rr;jn.InitNaive=Rr=v.p(jn,"InitNaive",2);var Xr;jn.AggressiveNone=Xr=v.p(jn,"AggressiveNone",0);var qr;jn.AggressiveLess=qr=v.p(jn,"AggressiveLess",1);var Yr;jn.AggressiveMore=Yr=v.p(jn,"AggressiveMore",2);jn.PackNone=0;var Zr;jn.PackExpand=Zr=1;var $r;jn.PackStraighten=$r=2;var bs;jn.PackMedian=bs=4;var rr; +jn.PackAll=rr=7;function is(){this.index=this.Yd=this.He=this.Qd=this.first=this.layer=0;this.link=null;this.ai=0}v.Kd(is,{layer:!0,first:!0,Qd:!0,He:!0,Yd:!0,index:!0,link:!0,ai:!0});function sr(){$f.call(this)}v.Ja(sr,$f);v.ea("LayeredDigraphNetwork",sr);sr.prototype.createVertex=function(){return new ks};sr.prototype.createEdge=function(){return new ls}; +function ks(){oq.call(this);this.index=this.column=this.layer=-1;this.component=NaN;this.near=null;this.valid=!1;this.finish=this.Qo=NaN;this.Am=0;this.Uz=this.Vz=null}v.Ja(ks,oq);v.ea("LayeredDigraphVertex",ks);function ls(){pq.call(this);this.forest=this.rev=this.valid=!1;this.portToPos=this.portFromPos=NaN;this.portToColOffset=this.portFromColOffset=0}v.Ja(ls,pq);v.ea("LayeredDigraphEdge",ls); +function Z(){0<arguments.length&&v.cd(Z);Zf.call(this);this.ud=new J(Object);this.Jr=ms;this.Df=ns;this.Fs=os;this.mv=ps;this.OA=null;this.vh=!0;this.ed=qs;this.bg=(new ia(10,10)).freeze();this.ra=new rs;this.ta=new rs;this.Ny=[]}v.Ja(Z,Zf);v.ea("TreeLayout",Z);Z.prototype.cloneProtected=function(a){Zf.prototype.cloneProtected.call(this,a);a.Jr=this.Jr;a.Fs=this.Fs;a.mv=this.mv;a.vh=this.vh;a.ed=this.ed;a.bg.assign(this.bg);a.ra.copyInheritedPropertiesFrom(this.ra);a.ta.copyInheritedPropertiesFrom(this.ta)}; +Z.prototype.createNetwork=function(){return new ss};Z.prototype.makeNetwork=function(a){function b(a){if(a instanceof S)return!a.uf&&"Comment"!==a.fc;if(a instanceof W){var b=a.T;if(null===b||b.uf||"Comment"===b.fc)return!1;a=a.Z;return null===a||a.uf||"Comment"===a.fc?!1:!0}return!1}var c=this.createNetwork();c.Pb=this;a instanceof E?(c.Tj(a.Bg,!0,b),c.Tj(a.links,!0,b)):a instanceof V?c.Tj(a.Ic,!1,b):c.Tj(a.i,!1,b);return c}; +Z.prototype.doLayout=function(a){null===a&&v.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts");null===this.network&&(this.network=this.makeNetwork(a));this.Nf!==ts&&(this.Xd=this.initialOrigin(this.Xd));var b=this.g;null===b&&a instanceof E&&(b=a);this.Df=this.path===ms&&null!==b?b.Pd?ns:us:this.path===ms?ns:this.path;if(0<this.network.vertexes.count){this.network.vw();for(a=this.network.vertexes.i;a.next();)b=a.value,b.initialized=!1,b.level= +0,b.parent=null,b.children=[];if(0<this.ud.count){a=new J(rs);for(b=this.ud.i;b.next();){var c=b.value;c instanceof S?(c=this.network.Lm(c),null!==c&&a.add(c)):c instanceof rs&&a.add(c)}this.ud=a}0===this.ud.count&&this.findRoots();for(a=this.ud.copy().i;a.next();)b=a.value,b.initialized||(b.initialized=!0,vs(this,b));for(a=this.ud.i;a.next();)b=a.value,b instanceof rs&&ws(this,b);for(a=this.ud.i;a.next();)b=a.value,b instanceof rs&&xs(this,b);for(a=this.ud.i;a.next();)b=a.value,b instanceof rs&& +ys(this,b);this.$y();if(this.Hz===zs){c=[];for(a=this.network.vertexes.i;a.next();){var d=a.value,b=d.parent;null===b&&(b=d);var b=0===b.angle||180===b.angle,e=c[d.level];void 0===e&&(e=0);c[d.level]=Math.max(e,b?d.width:d.height)}for(d=0;d<c.length;d++)void 0===c[d]&&(c[d]=0);this.OA=c;for(a=this.network.vertexes.i;a.next();)d=a.value,b=d.parent,null===b&&(b=d),0===b.angle||180===b.angle?(180===b.angle&&(d.jt+=c[d.level]-d.width),d.width=c[d.level]):(270===b.angle&&(d.kt+=c[d.level]-d.height),d.height= +c[d.level])}else if(this.Hz===As)for(a=this.network.vertexes.i;a.next();){c=a.value;b=0===c.angle||180===c.angle;e=-1;for(d=0;d<c.children.length;d++)var f=c.children[d],e=Math.max(e,b?f.width:f.height);if(0<=e)for(d=0;d<c.children.length;d++)f=c.children[d],b?(180===c.angle&&(f.jt+=e-f.width),f.width=e):(270===c.angle&&(f.kt+=e-f.height),f.height=e)}for(a=this.ud.i;a.next();)b=a.value,b instanceof rs&&this.layoutTree(b);this.arrangeTrees();this.updateParts()}this.network=null;this.ud=new J(Object); +this.wf=!0}; +Z.prototype.findRoots=function(){for(var a=this.network.vertexes.i;a.next();){var b=a.value;switch(this.Df){case ns:0===b.lc.count&&this.ud.add(b);break;case us:0===b.hc.count&&this.ud.add(b);break;default:v.k("Unhandled path value "+this.Df.toString())}}if(0===this.ud.count){for(var a=999999,b=null,c=this.network.vertexes.i;c.next();){var d=c.value;switch(this.Df){case ns:d.lc.count<a&&(a=d.lc.count,b=d);break;case us:d.hc.count<a&&(a=d.hc.count,b=d);break;default:v.k("Unhandled path value "+this.Df.toString())}}null!== +b&&this.ud.add(b)}}; +function vs(a,b){if(null!==b){switch(a.Df){case ns:if(0<b.hc.count){for(var c=new I(rs),d=b.HG;d.next();){var e=d.value;Bs(a,b,e)&&c.add(e)}0<c.count&&(b.children=c.cc())}break;case us:if(0<b.lc.count){c=new I(rs);for(d=b.CI;d.next();)e=d.value,Bs(a,b,e)&&c.add(e);0<c.count&&(b.children=c.cc())}break;default:v.k("Unhandled path value"+a.Df.toString())}c=b.children;d=c.length;for(e=0;e<d;e++){var f=c[e];f.initialized=!0;f.level=b.level+1;f.parent=b;a.ud.remove(f)}for(e=0;e<d;e++)f=c[e],vs(a,f)}} +function Bs(a,b,c){if(c.initialized){var d;if(null===b)d=!1;else{for(d=b.parent;null!==d&&d!==c;)d=d.parent;d=d===c}if(d||c.level>b.level)return!1;a.removeChild(c.parent,c)}return!0}Z.prototype.removeChild=function(a,b){if(null!==a&&null!==b){for(var c=a.children,d=0,e=0;e<c.length;e++)c[e]===b&&d++;if(0<d){for(var d=Array(c.length-d),f=0,e=0;e<c.length;e++)c[e]!==b&&(d[f++]=c[e]);a.children=d}}}; +function ws(a,b){if(null!==b){a.initializeTreeVertexValues(b);b.alignment===Cs&&a.sortTreeVertexChildren(b);for(var c=0,d=b.Cm,e=0,f=b.children,h=f.length,k=0;k<h;k++){var l=f[k];ws(a,l);c+=l.descendantCount+1;d=Math.max(d,l.maxChildrenCount);e=Math.max(e,l.maxGenerationCount)}b.descendantCount=c;b.maxChildrenCount=d;b.maxGenerationCount=0<d?e+1:0}} +function Ds(a,b){switch(a.Fs){default:case os:return null!==b.parent?b.parent:a.ra;case Es:return null===b.parent?a.ra:null===b.parent.parent?a.ta:b.parent;case Fs:return null!==b.parent?null!==b.parent.parent?b.parent.parent:a.ta:a.ra;case Gs:var c=!0;if(0===b.Cm)c=!1;else for(var d=b.children,e=d.length,f=0;f<e;f++)if(0<d[f].Cm){c=!1;break}return c&&null!==b.parent?a.ta:null!==b.parent?b.parent:a.ra}} +Z.prototype.initializeTreeVertexValues=function(a){var b=Ds(this,a);a.copyInheritedPropertiesFrom(b);if(null!==a.parent&&a.parent.alignment===Cs){for(var b=a.angle,c=a.parent.children,d=0;d<c.length&&a!==c[d];)d++;0===d%2?d!==c.length-1&&(b=90===b?180:180===b?270:270===b?180:270):b=90===b?0:180===b?90:270===b?0:90;a.angle=b}a.initialized=!0};function xs(a,b){if(null!==b){a.assignTreeVertexValues(b);for(var c=b.children,d=c.length,e=0;e<d;e++)xs(a,c[e])}}Z.prototype.assignTreeVertexValues=function(){}; +function ys(a,b){if(null!==b){b.alignment!==Cs&&a.sortTreeVertexChildren(b);for(var c=b.children,d=c.length,e=0;e<d;e++)ys(a,c[e])}}Z.prototype.sortTreeVertexChildren=function(a){switch(a.sorting){case Hs:break;case Is:a.children.reverse();break;case Js:a.children.sort(a.comparer);break;case Ks:a.children.sort(a.comparer);a.children.reverse();break;default:v.k("Unhandled sorting value "+a.sorting.toString())}};Z.prototype.$y=function(){if(this.comments)for(var a=this.network.vertexes.i;a.next();)this.addComments(a.value)}; +Z.prototype.addComments=function(a){var b=a.angle,c=a.parent,d=0,e=Ls,e=!1;null!==c&&(d=c.angle,e=c.alignment,e=Ms(e));var b=90===b||270===b,d=90===d||270===d,c=0===a.Cm,f=0,h=0,k=0,l=a.commentSpacing;if(null!==a.Jc)for(var m=a.Jc.KD();m.next();){var n=m.value;"Comment"===n.fc&&n.canLayout()&&(null===a.comments&&(a.comments=[]),a.comments.push(n),n.sf(),n=n.Ca,b&&!c||!e&&!d&&c||e&&d&&c?(f=Math.max(f,n.width),h+=n.height+Math.abs(k)):(f+=n.width+Math.abs(k),h=Math.max(h,n.height)),k=l)}null!==a.comments&& +(b&&!c||!e&&!d&&c||e&&d&&c?(f+=Math.abs(a.commentMargin),h=Math.max(0,h-a.height)):(h+=Math.abs(a.commentMargin),f=Math.max(0,f-a.width)),e=v.hk(0,0,a.M.width+f,a.M.height+h),a.mb=e,v.Vb(e))};function Ms(a){return a===Ns||a===Cs||a===Os||a===Ps}function Qs(a){return a===Ns||a===Cs}function Rs(a){var b=a.parent;if(null!==b){var c=b.alignment;if(Ms(c)){if(Qs(c)){b=b.children;for(c=0;c<b.length&&a!==b[c];)c++;return 0===c%2}if(c===Os)return!0}}return!1} +Z.prototype.layoutComments=function(a){if(null!==a.comments){var b=a.Jc.Ca,c=a.parent,d=a.angle,e=0,f=Ls,f=!1;null!==c&&(e=c.angle,f=c.alignment,f=Ms(f));for(var c=90===d||270===d,d=90===e||270===e,h=0===a.Cm,k=Rs(a),l=0,m=a.comments,n=m.length,p=v.L(),q=0;q<n;q++){var r=m[q],s=r.Ca;if(c&&!h||!f&&!d&&h||f&&d&&h){if(135<e&&!f||d&&k)if(0<=a.commentMargin)for(p.m(a.M.x-a.commentMargin-s.width,a.M.y+l),r.move(p),r=r.wg();r.next();){var t=r.value;t.xb=tc;t.yb=uc}else for(p.m(a.M.x+2*a.P.x-a.commentMargin, +a.M.y+l),r.move(p),r=r.wg();r.next();)t=r.value,t.xb=uc,t.yb=tc;else if(0<=a.commentMargin)for(p.m(a.M.x+2*a.P.x+a.commentMargin,a.M.y+l),r.move(p),r=r.wg();r.next();)t=r.value,t.xb=uc,t.yb=tc;else for(p.m(a.M.x+a.commentMargin-s.width,a.M.y+l),r.move(p),r=r.wg();r.next();)t=r.value,t.xb=tc,t.yb=uc;l=0<=a.commentSpacing?l+(s.height+a.commentSpacing):l+(a.commentSpacing-s.height)}else{if(135<e&&!f||!d&&k)if(0<=a.commentMargin)for(p.m(a.M.x+l,a.M.y-a.commentMargin-s.height),r.move(p),r=r.wg();r.next();)t= +r.value,t.xb=sc,t.yb=vc;else for(p.m(a.M.x+l,a.M.y+2*a.P.y-a.commentMargin),r.move(p),r=r.wg();r.next();)t=r.value,t.xb=vc,t.yb=sc;else if(0<=a.commentMargin)for(p.m(a.M.x+l,a.M.y+2*a.P.y+a.commentMargin),r.move(p),r=r.wg();r.next();)t=r.value,t.xb=vc,t.yb=sc;else for(p.m(a.M.x+l,a.M.y+a.commentMargin-s.height),r.move(p),r=r.wg();r.next();)t=r.value,t.xb=sc,t.yb=vc;l=0<=a.commentSpacing?l+(s.width+a.commentSpacing):l+(a.commentSpacing-s.width)}}v.v(p);b=l-a.commentSpacing-(c?b.height:b.width);if(this.Df=== +ns)for(e=a.hc;e.next();)a=e.value.link,null===a||a.sl||(a.nl=0<b?b:NaN);else for(e=a.lc;e.next();)a=e.value.link,null===a||a.sl||(a.Gl=0<b?b:NaN)}}; +Z.prototype.layoutTree=function(a){if(null!==a){for(var b=a.children,c=b.length,d=0;d<c;d++)this.layoutTree(b[d]);switch(a.compaction){case Ss:Ts(this,a);break;case Us:if(a.alignment===Cs)Ts(this,a);else if(0===a.Cm){var d=a.parent,b=!1,c=0,e=Ls;null!==d&&(c=d.angle,e=d.alignment,b=Ms(e));d=Rs(a);a.ma.m(0,0);a.fb.m(a.width,a.height);null===a.parent||null===a.comments||(180!==c&&270!==c||b)&&!d?a.Ma.m(0,0):180===c&&!b||(90===c||270===c)&&d?a.Ma.m(a.width-2*a.P.x,0):a.Ma.m(0,a.height-2*a.P.y);a.At= +null;a.St=null}else{for(var f=Vs(a),b=90===f||270===f,h=0,k=a.children,l=k.length,m=0;m<l;m++)var n=k[m],h=Math.max(h,b?n.fb.width:n.fb.height);var p=a.alignment,d=p===Ws,q=p===Xs,r=Ms(p),s=Math.max(0,a.breadthLimit),c=Ys(a),t=a.nodeSpacing,u=Zs(a),x=a.rowSpacing,w=0;if(d||q||a.Ap||a.Bp&&1===a.maxGenerationCount)w=Math.max(0,a.rowIndent);var d=a.width,e=a.height,y=0,B=0,H=0,C=null,T=null,ba=0,U=0,M=0,aa=0,Ia=0,oa=0,Ga=0,pa=0,n=0;r&&!Qs(p)&&135<f&&k.reverse();if(Qs(p))if(1<l)for(m=0;m<l;m++)0===m% +2&&m!==l-1?pa=Math.max(pa,b?k[m].fb.width:k[m].fb.height):0!==m%2&&(n=Math.max(n,b?k[m].fb.width:k[m].fb.height));else 1===l&&(pa=b?k[0].fb.width:k[0].fb.height);if(r){switch(p){case Ns:U=135>f?$s(a,k,pa,y,B):at(a,k,pa,y,B);pa=U.x;y=U.width;B=U.height;break;case Os:for(m=0;m<l;m++){var n=k[m],Ca=n.fb,C=0===oa?0:x;b?(n.ma.m(h-Ca.width,aa+C),y=Math.max(y,Ca.width),B=Math.max(B,aa+C+Ca.height),aa+=C+Ca.height):(n.ma.m(M+C,h-Ca.height),y=Math.max(y,M+C+Ca.width),B=Math.max(B,Ca.height),M+=C+Ca.width); +oa++}break;case Ps:for(m=0;m<l;m++)n=k[m],Ca=n.fb,C=0===oa?0:x,b?(n.ma.m(t/2+a.P.x,aa+C),y=Math.max(y,Ca.width),B=Math.max(B,aa+C+Ca.height),aa+=C+Ca.height):(n.ma.m(M+C,t/2+a.P.y),y=Math.max(y,M+C+Ca.width),B=Math.max(B,Ca.height),M+=C+Ca.width),oa++}C=bt(this,2);T=bt(this,2);b?(C[0].m(0,0),C[1].m(0,B),T[0].m(y,0)):(C[0].m(0,0),C[1].m(y,0),T[0].m(0,B));T[1].m(y,B)}else for(m=0;m<l;m++){n=k[m];Ca=n.fb;if(b){0<s&&0<oa&&M+t+Ca.width>s&&(M<h&&ct(a,p,h-M,0,Ga,m-1),Ia++,oa=0,Ga=m,H=B,M=0,aa=135<f?-B-x: +B+x);it(this,n,0,aa);var ua=0;if(0===oa){if(C=n.At,T=n.St,ba=Ca.width,U=Ca.height,null===C||null===T||f!==Vs(n))C=bt(this,2),T=bt(this,2),C[0].m(0,0),C[1].m(0,U),T[0].m(ba,0),T[1].m(ba,U)}else{var gc=v.jb(),U=jt(this,a,n,C,T,ba,U,gc),ua=U.x,C=gc[0],T=gc[1],ba=U.width,U=U.height;v.sa(gc);M<Ca.width&&0>ua&&(kt(a,-ua,0,Ga,m-1),lt(C,-ua,0),lt(T,-ua,0),ua=0)}n.ma.m(ua,aa);y=Math.max(y,ba);B=Math.max(B,H+(0===Ia?0:x)+Ca.height);M=ba}else{0<s&&0<oa&&aa+t+Ca.height>s&&(aa<h&&ct(a,p,0,h-aa,Ga,m-1),Ia++,oa= +0,Ga=m,H=y,aa=0,M=135<f?-y-x:y+x);it(this,n,M,0);ua=0;if(0===oa){if(C=n.At,T=n.St,ba=Ca.width,U=Ca.height,null===C||null===T||f!==Vs(n))C=bt(this,2),T=bt(this,2),C[0].m(0,0),C[1].m(ba,0),T[0].m(0,U),T[1].m(ba,U)}else gc=v.jb(),U=jt(this,a,n,C,T,ba,U,gc),ua=U.x,C=gc[0],T=gc[1],ba=U.width,U=U.height,v.sa(gc),aa<Ca.height&&0>ua&&(kt(a,0,-ua,Ga,m-1),lt(C,0,-ua),lt(T,0,-ua),ua=0);n.ma.m(M,ua);B=Math.max(B,U);y=Math.max(y,H+(0===Ia?0:x)+Ca.width);aa=U}oa++}0<Ia&&(b?(B+=Math.max(0,c),M<y&&ct(a,p,y-M,0,Ga, +l-1),0<w&&(q||kt(a,w,0,0,l-1),y+=w)):(y+=Math.max(0,c),aa<B&&ct(a,p,0,B-aa,Ga,l-1),0<w&&(q||kt(a,0,w,0,l-1),B+=w)));q=h=0;switch(p){case mt:b?h+=y/2-a.P.x-u/2:q+=B/2-a.P.y-u/2;break;case Ls:0<Ia?b?h+=y/2-a.P.x-u/2:q+=B/2-a.P.y-u/2:b?(m=k[0].ma.x+k[0].Ma.x,pa=k[l-1].ma.x+k[l-1].Ma.x+2*k[l-1].P.x,h+=m+(pa-m)/2-a.P.x-u/2):(m=k[0].ma.y+k[0].Ma.y,pa=k[l-1].ma.y+k[l-1].Ma.y+2*k[l-1].P.y,q+=m+(pa-m)/2-a.P.y-u/2);break;case Ws:b?(h-=u,y+=u):(q-=u,B+=u);break;case Xs:b?(h+=y-a.width+u,y+=u):(q+=B-a.height+ +u,B+=u);break;case Ns:b?h=1<l?h+(pa+t/2-a.P.x):h+(k[0].P.x-a.P.x+k[0].Ma.x):q=1<l?q+(pa+t/2-a.P.y):q+(k[0].P.y-a.P.y+k[0].Ma.y);break;case Os:b?h+=y+t/2-a.P.x:q+=B+t/2-a.P.y;break;case Ps:break;default:v.k("Unhandled alignment value "+p.toString())}for(m=0;m<l;m++)n=k[m],b?n.ma.m(n.ma.x+n.Ma.x-h,n.ma.y+(135<f?(r?-B:-n.fb.height)+n.Ma.y-c:e+c+n.Ma.y)):n.ma.m(n.ma.x+(135<f?(r?-y:-n.fb.width)+n.Ma.x-c:d+c+n.Ma.x),n.ma.y+n.Ma.y-q);l=k=0;r?b?(y=nt(a,y,h),0>h&&(h=0),135<f&&(q+=B+c),B+=e+c,p===Ps&&(k+=t/ +2+a.P.x),l+=e+c):(135<f&&(h+=y+c),y+=d+c,B=ot(a,B,q),0>q&&(q=0),p===Ps&&(l+=t/2+a.P.y),k+=d+c):b?(null===a.comments?d>y&&(p=pt(p,d-y,0),k=p.x,l=p.y,y=d,h=0):y=nt(a,y,h),0>h&&(k-=h,h=0),135<f&&(q+=B+c),B=Math.max(Math.max(B,e),B+e+c),l+=e+c):(135<f&&(h+=y+c),y=Math.max(Math.max(y,d),y+d+c),null===a.comments?e>B&&(p=pt(p,0,e-B),k=p.x,l=p.y,B=e,q=0):B=ot(a,B,q),0>q&&(l-=q,q=0),k+=d+c);if(0<Ia)f=bt(this,4),p=bt(this,4),b?(f[2].m(0,e+c),f[3].m(f[2].x,B),p[2].m(y,f[2].y),p[3].m(p[2].x,f[3].y)):(f[2].m(d+ +c,0),f[3].m(y,f[2].y),p[2].m(f[2].x,B),p[3].m(f[3].x,p[2].y));else{f=bt(this,C.length+2);p=bt(this,T.length+2);for(m=0;m<C.length;m++)r=C[m],f[m+2].m(r.x+k,r.y+l);for(m=0;m<T.length;m++)r=T[m],p[m+2].m(r.x+k,r.y+l)}b?(f[0].m(h,0),f[1].m(f[0].x,e),f[2].y<f[1].y&&(f[2].x>f[0].x?f[2].assign(f[1]):f[1].assign(f[2])),f[3].y<f[2].y&&(f[3].x>f[0].x?f[3].assign(f[2]):f[2].assign(f[3])),p[0].m(h+d,0),p[1].m(p[0].x,e),p[2].y<p[1].y&&(p[2].x<p[0].x?p[2].assign(p[1]):p[1].assign(p[2])),p[3].y<p[2].y&&(p[3].x< +p[0].x?p[3].assign(p[2]):p[2].assign(p[3])),f[2].y-=c/2,p[2].y-=c/2):(f[0].m(0,q),f[1].m(d,f[0].y),f[2].x<f[1].x&&(f[2].y>f[0].y?f[2].assign(f[1]):f[1].assign(f[2])),f[3].x<f[2].x&&(f[3].y>f[0].y?f[3].assign(f[2]):f[2].assign(f[3])),p[0].m(0,q+e),p[1].m(d,p[0].y),p[2].x<p[1].x&&(p[2].y<p[0].y?p[2].assign(p[1]):p[1].assign(p[2])),p[3].x<p[2].x&&(p[3].y<p[0].y?p[3].assign(p[2]):p[2].assign(p[3])),f[2].x-=c/2,p[2].x-=c/2);qt(this,C);qt(this,T);a.At=f;a.St=p;a.Ma.m(h,q);a.fb.m(y,B)}break;default:v.k("Unhandled compaction value "+ +a.compaction.toString())}}}; +function Ts(a,b){if(0===b.Cm){var c=!1,d=0,e=Ls;null!==b.parent&&(d=b.parent.angle,e=b.parent.alignment,c=Ms(e));e=Rs(b);b.ma.m(0,0);b.fb.m(b.width,b.height);null===b.parent||null===b.comments||(180!==d&&270!==d||c)&&!e?b.Ma.m(0,0):180===d&&!c||(90===d||270===d)&&e?b.Ma.m(b.width-2*b.P.x,0):b.Ma.m(0,b.height-2*b.P.y)}else{for(var c=Vs(b),d=90===c||270===c,f=0,e=b.children,h=e.length,k=0;k<h;k++)var l=e[k],f=Math.max(f,d?l.fb.width:l.fb.height);var m=b.alignment,n=m===Ws,p=m===Xs,q=Ms(m),r=Math.max(0, +b.breadthLimit),s=Ys(b),t=b.nodeSpacing,u=Zs(b),x=n||p?0:u/2,w=b.rowSpacing,y=0;if(n||p||b.Ap||b.Bp&&1===b.maxGenerationCount)y=Math.max(0,b.rowIndent);var n=b.width,B=b.height,H=0,C=0,T=0,ba=0,U=0,M=0,aa=0,Ia=0,oa=0,Ga=0;q&&!Qs(m)&&135<c&&e.reverse();if(Qs(m))if(1<h)for(k=0;k<h;k++){var l=e[k],pa=l.fb;0===k%2&&k!==h-1?oa=Math.max(oa,(d?pa.width:pa.height)+rt(l)-t):0!==k%2&&(Ga=Math.max(Ga,(d?pa.width:pa.height)+rt(l)-t))}else 1===h&&(oa=d?e[0].fb.width:e[0].fb.height);if(q)switch(m){case Ns:case Cs:C= +135>c?$s(b,e,oa,H,C):at(b,e,oa,H,C);oa=C.x;H=C.width;C=C.height;break;case Os:for(k=0;k<h;k++)l=e[k],pa=l.fb,r=0===aa?0:w,d?(l.ma.m(f-pa.width,U+r),H=Math.max(H,pa.width),C=Math.max(C,U+r+pa.height),U+=r+pa.height):(l.ma.m(ba+r,f-pa.height),H=Math.max(H,ba+r+pa.width),C=Math.max(C,pa.height),ba+=r+pa.width),aa++;break;case Ps:for(f=0;f<h;f++)l=e[f],pa=l.fb,r=0===aa?0:w,d?(l.ma.m(t/2+b.P.x,U+r),H=Math.max(H,pa.width),C=Math.max(C,U+r+pa.height),U+=r+pa.height):(l.ma.m(ba+r,t/2+b.P.y),H=Math.max(H, +ba+r+pa.width),C=Math.max(C,pa.height),ba+=r+pa.width),aa++}else for(k=0;k<h;k++)l=e[k],pa=l.fb,d?(0<r&&0<aa&&ba+t+pa.width>r&&(ba<f&&ct(b,m,f-ba,0,Ia,k-1),M++,aa=0,Ia=k,T=C,ba=0,U=135<c?-C-w:C+w),Ga=0===aa?x:t,it(a,l,0,U),l.ma.m(ba+Ga,U),H=Math.max(H,ba+Ga+pa.width),C=Math.max(C,T+(0===M?0:w)+pa.height),ba+=Ga+pa.width):(0<r&&0<aa&&U+t+pa.height>r&&(U<f&&ct(b,m,0,f-U,Ia,k-1),M++,aa=0,Ia=k,T=H,U=0,ba=135<c?-H-w:H+w),Ga=0===aa?x:t,it(a,l,ba,0),l.ma.m(ba,U+Ga),C=Math.max(C,U+Ga+pa.height),H=Math.max(H, +T+(0===M?0:w)+pa.width),U+=Ga+pa.height),aa++;0<M&&(d?(C+=Math.max(0,s),ba<H&&ct(b,m,H-ba,0,Ia,h-1),0<y&&(p||kt(b,y,0,0,h-1),H+=y)):(H+=Math.max(0,s),U<C&&ct(b,m,0,C-U,Ia,h-1),0<y&&(p||kt(b,0,y,0,h-1),C+=y)));y=p=0;switch(m){case mt:d?p+=H/2-b.P.x-u/2:y+=C/2-b.P.y-u/2;break;case Ls:0<M?d?p+=H/2-b.P.x-u/2:y+=C/2-b.P.y-u/2:d?(m=e[0].ma.x+e[0].Ma.x,t=e[h-1].ma.x+e[h-1].Ma.x+2*e[h-1].P.x,p+=m+(t-m)/2-b.P.x-u/2):(m=e[0].ma.y+e[0].Ma.y,t=e[h-1].ma.y+e[h-1].Ma.y+2*e[h-1].P.y,y+=m+(t-m)/2-b.P.y-u/2);break; +case Ws:d?(p-=u,H+=u):(y-=u,C+=u);break;case Xs:d?(p+=H-b.width+u,H+=u):(y+=C-b.height+u,C+=u);break;case Ns:case Cs:d?p=1<h?p+(oa+t/2-b.P.x):p+(e[0].P.x-b.P.x+e[0].Ma.x):y=1<h?y+(oa+t/2-b.P.y):y+(e[0].P.y-b.P.y+e[0].Ma.y);break;case Os:d?p+=H+t/2-b.P.x:y+=C+t/2-b.P.y;break;case Ps:break;default:v.k("Unhandled alignment value "+m.toString())}for(k=0;k<h;k++)l=e[k],d?l.ma.m(l.ma.x+l.Ma.x-p,l.ma.y+(135<c?(q?-C:-l.fb.height)+l.Ma.y-s:B+s+l.Ma.y)):l.ma.m(l.ma.x+(135<c?(q?-H:-l.fb.width)+l.Ma.x-s:n+s+ +l.Ma.x),l.ma.y+l.Ma.y-y);d?(H=nt(b,H,p),0>p&&(p=0),135<c&&(y+=C+s),C+=B+s):(135<c&&(p+=H+s),H+=n+s,C=ot(b,C,y),0>y&&(y=0));b.Ma.m(p,y);b.fb.m(H,C)}} +function $s(a,b,c,d,e){var f=b.length;if(0===f)return new A(c,0,d,e);if(1===f){var h=b[0];d=h.fb.width;e=h.fb.height;return new A(c,0,d,e)}for(var k=a.nodeSpacing,l=a.rowSpacing,m=90===Vs(a),n=0,p=0,q=0,r=0;r<f;r++)if(!(0!==r%2||1<f&&r===f-1)){var h=b[r],s=h.fb,t=0===n?0:l;if(m){var u=rt(h)-k;h.ma.m(c-(s.width+u),q+t);d=Math.max(d,s.width+u);e=Math.max(e,q+t+s.height);q+=t+s.height}else u=rt(h)-k,h.ma.m(p+t,c-(s.height+u)),e=Math.max(e,s.height+u),d=Math.max(d,p+t+s.width),p+=t+s.width;n++}var n= +0,x=p,w=q;m?(p=c+k,q=0):(p=0,q=c+k);for(r=0;r<f;r++)0!==r%2&&(h=b[r],s=h.fb,t=0===n?0:l,m?(u=rt(h)-k,h.ma.m(p+u,q+t),d=Math.max(d,p+s.width+u),e=Math.max(e,q+t+s.height),q+=t+s.height):(u=rt(h)-k,h.ma.m(p+t,q+u),d=Math.max(d,p+t+s.width),e=Math.max(e,q+s.height+u),p+=t+s.width),n++);1<f&&1===f%2&&(h=b[f-1],s=h.fb,b=st(h,m?Math.max(Math.abs(w),Math.abs(q)):Math.max(Math.abs(x),Math.abs(p))),m?(h.ma.m(c+k/2-h.P.x-h.Ma.x,e+b),m=c+k/2-h.P.x-h.Ma.x,d=Math.max(d,m+s.width),0>m&&(d-=m),e=Math.max(e,Math.max(w, +q)+b+s.height),0>h.ma.x&&(c=tt(a,h.ma.x,!1,c,k))):(h.ma.m(d+b,c+k/2-h.P.y-h.Ma.y),d=Math.max(d,Math.max(x,p)+b+s.width),m=c+k/2-h.P.y-h.Ma.y,e=Math.max(e,m+s.height),0>m&&(e-=m),0>h.ma.y&&(c=tt(a,h.ma.y,!0,c,k))));return new A(c,0,d,e)} +function at(a,b,c,d,e){var f=b.length;if(0===f)return new A(c,0,d,e);if(1===f){var h=b[0];d=h.fb.width;e=h.fb.height;return new A(c,0,d,e)}for(var k=a.nodeSpacing,l=a.rowSpacing,m=270===Vs(a),n=0,p=0,q=0,r=0;r<f;r++)if(!(0!==r%2||1<f&&r===f-1)){var h=b[r],s=h.fb,t=0===n?0:l;if(m){var u=rt(h)-k,q=q-(t+s.height);h.ma.m(c-(s.width+u),q);d=Math.max(d,s.width+u);e=Math.max(e,Math.abs(q))}else u=rt(h)-k,p-=t+s.width,h.ma.m(p,c-(s.height+u)),e=Math.max(e,s.height+u),d=Math.max(d,Math.abs(p));n++}var n=0, +x=p,w=q;m?(p=c+k,q=0):(p=0,q=c+k);for(r=0;r<f;r++)0!==r%2&&(h=b[r],s=h.fb,t=0===n?0:l,m?(u=rt(h)-k,q-=t+s.height,h.ma.m(p+u,q),d=Math.max(d,p+s.width+u),e=Math.max(e,Math.abs(q))):(u=rt(h)-k,p-=t+s.width,h.ma.m(p,q+u),e=Math.max(e,q+s.height+u),d=Math.max(d,Math.abs(p))),n++);1<f&&1===f%2&&(h=b[f-1],s=h.fb,l=st(h,m?Math.max(Math.abs(w),Math.abs(q)):Math.max(Math.abs(x),Math.abs(p))),m?(h.ma.m(c+k/2-h.P.x-h.Ma.x,-e-s.height-l),p=c+k/2-h.P.x-h.Ma.x,d=Math.max(d,p+s.width),0>p&&(d-=p),e=Math.max(e,Math.abs(Math.min(w, +q))+l+s.height),0>h.ma.x&&(c=tt(a,h.ma.x,!1,c,k))):(h.ma.m(-d-s.width-l,c+k/2-h.P.y-h.Ma.y),d=Math.max(d,Math.abs(Math.min(x,p))+l+s.width),p=c+k/2-h.P.y-h.Ma.y,e=Math.max(e,p+s.height),0>p&&(e-=p),0>h.ma.y&&(c=tt(a,h.ma.y,!0,c,k))));for(r=0;r<f;r++)h=b[r],m?h.ma.m(h.ma.x,h.ma.y+e):h.ma.m(h.ma.x+d,h.ma.y);return new A(c,0,d,e)}function rt(a){return null===a.parent?0:a.parent.nodeSpacing}function st(a){return null===a.parent?0:a.parent.rowSpacing} +function tt(a,b,c,d,e){a=a.children;for(var f=a.length,h=0;h<f;h++)c?a[h].ma.m(a[h].ma.x,a[h].ma.y-b):a[h].ma.m(a[h].ma.x-b,a[h].ma.y);b=a[f-1];return Math.max(d,c?b.Ma.y+b.P.y-e/2:b.Ma.x+b.P.x-e/2)} +function nt(a,b,c){switch(a.alignment){case Ls:case mt:var d=b;c+a.width>d&&(d=c+a.width);0>c&&(d-=c);return d;case Ws:return a.width>b?a.width:b;case Xs:return 2*a.P.x>b?a.width:b+a.width-2*a.P.x;case Ns:case Cs:return d=Math.min(0,c),c=Math.max(b,c+a.width),Math.max(a.width,c-d);case Os:return a.width-a.P.x+a.nodeSpacing/2+b;case Ps:return Math.max(a.width,a.P.x+a.nodeSpacing/2+b);default:return b}} +function ot(a,b,c){switch(a.alignment){case Ls:case mt:var d=b;c+a.height>d&&(d=c+a.height);0>c&&(d-=c);return d;case Ws:return a.height>b?a.height:b;case Xs:return 2*a.P.y>b?a.height:b+a.height-2*a.P.y;case Ns:case Cs:return d=Math.min(0,c),c=Math.max(b,c+a.height),Math.max(a.height,c-d);case Os:return a.height-a.P.y+a.nodeSpacing/2+b;case Ps:return Math.max(a.height,a.P.y+a.nodeSpacing/2+b);default:return b}} +function pt(a,b,c){switch(a){case mt:b/=2;c/=2;break;case Ls:b/=2;c/=2;break;case Ws:c=b=0;break;case Xs:break;default:v.k("Unhandled alignment value "+a.toString())}return new z(b,c)}function ct(a,b,c,d,e,f){b=pt(b,c,d);kt(a,b.x,b.y,e,f)}function kt(a,b,c,d,e){if(0!==b||0!==c)for(a=a.children;d<=e;d++){var f=a[d].ma;f.x+=b;f.y+=c}} +function it(a,b,c,d){var e=b.parent;switch(a.Df){case ns:for(a=b.lc;a.next();)b=a.value,b.fromVertex===e&&b.Rr.m(c,d);break;case us:for(a=b.hc;a.next();)b=a.value,b.toVertex===e&&b.Rr.m(c,d);break;default:v.k("Unhandled path value "+a.Df.toString())}}function lt(a,b,c){for(var d=0;d<a.length;d++){var e=a[d];e.x+=b;e.y+=c}} +function jt(a,b,c,d,e,f,h,k){var l=Vs(b),m=90===l||270===l,n=b.nodeSpacing;b=d;var p=e;d=f;e=h;var q=c.At,r=c.St;h=c.fb;var s=m?Math.max(e,h.height):Math.max(d,h.width);if(null===q||l!==Vs(c))q=bt(a,2),r=bt(a,2),m?(q[0].m(0,0),q[1].m(0,h.height),r[0].m(h.width,0),r[1].m(r[0].x,q[1].y)):(q[0].m(0,0),q[1].m(h.width,0),r[0].m(0,h.height),r[1].m(q[1].x,r[0].y));if(m){c=d;d=9999999;if(!(null===p||2>p.length||null===q||2>q.length))for(m=l=0;l<p.length&&m<q.length;){e=p[l];var t=q[m];f=t.x;var u=t.y;f+= +c;var x=e;l+1<p.length&&(x=p[l+1]);var w=t,t=w.x,w=w.y;m+1<q.length&&(w=q[m+1],t=w.x,w=w.y,t+=c);var y=d;e.y===u?y=f-e.x:e.y>u&&e.y<w?y=f+(e.y-u)/(w-u)*(t-f)-e.x:u>e.y&&u<x.y&&(y=f-(e.x+(u-e.y)/(x.y-e.y)*(x.x-e.x)));y<d&&(d=y);x.y<=e.y?l++:w<=u?m++:(x.y<=w&&l++,w<=x.y&&m++)}c-=d;c+=n;l=q;m=c;if(null===b||2>b.length||null===l||2>l.length)d=null;else{n=bt(a,b.length+l.length);for(d=f=e=0;f<l.length&&l[f].y<b[0].y;)u=l[f++],n[d++].m(u.x+m,u.y);for(;e<b.length;)u=b[e++],n[d++].m(u.x,u.y);for(e=b[b.length- +1].y;f<l.length&&l[f].y<=e;)f++;for(;f<l.length&&l[f].y>e;)u=l[f++],n[d++].m(u.x+m,u.y);l=bt(a,d);for(e=0;e<d;e++)l[e].assign(n[e]);qt(a,n);d=l}f=r;u=c;if(null===p||2>p.length||null===f||2>f.length)e=null;else{n=bt(a,p.length+f.length);for(m=x=l=0;l<p.length&&p[l].y<f[0].y;)e=p[l++],n[m++].m(e.x,e.y);for(;x<f.length;)e=f[x++],n[m++].m(e.x+u,e.y);for(f=f[f.length-1].y;l<p.length&&p[l].y<=f;)l++;for(;l<p.length&&p[l].y>f;)e=p[l++],n[m++].m(e.x,e.y);e=bt(a,m);for(l=0;l<m;l++)e[l].assign(n[l]);qt(a,n)}f= +Math.max(0,c)+h.width;h=s}else{c=e;d=9999999;if(!(null===p||2>p.length||null===q||2>q.length))for(m=l=0;l<p.length&&m<q.length;)e=p[l],t=q[m],f=t.x,u=t.y,u+=c,x=e,l+1<p.length&&(x=p[l+1]),w=t,t=w.x,w=w.y,m+1<q.length&&(w=q[m+1],t=w.x,w=w.y,w+=c),y=d,e.x===f?y=u-e.y:e.x>f&&e.x<t?y=u+(e.x-f)/(t-f)*(w-u)-e.y:f>e.x&&f<x.x&&(y=u-(e.y+(f-e.x)/(x.x-e.x)*(x.y-e.y))),y<d&&(d=y),x.x<=e.x?l++:t<=f?m++:(x.x<=t&&l++,t<=x.x&&m++);c-=d;c+=n;l=q;m=c;if(null===b||2>b.length||null===l||2>l.length)d=null;else{n=bt(a, +b.length+l.length);for(d=f=e=0;f<l.length&&l[f].x<b[0].x;)u=l[f++],n[d++].m(u.x,u.y+m);for(;e<b.length;)u=b[e++],n[d++].m(u.x,u.y);for(e=b[b.length-1].x;f<l.length&&l[f].x<=e;)f++;for(;f<l.length&&l[f].x>e;)u=l[f++],n[d++].m(u.x,u.y+m);l=bt(a,d);for(e=0;e<d;e++)l[e].assign(n[e]);qt(a,n);d=l}f=r;u=c;if(null===p||2>p.length||null===f||2>f.length)e=null;else{n=bt(a,p.length+f.length);for(m=x=l=0;l<p.length&&p[l].x<f[0].x;)e=p[l++],n[m++].m(e.x,e.y);for(;x<f.length;)e=f[x++],n[m++].m(e.x,e.y+u);for(f= +f[f.length-1].x;l<p.length&&p[l].x<=f;)l++;for(;l<p.length&&p[l].x>f;)e=p[l++],n[m++].m(e.x,e.y);e=bt(a,m);for(l=0;l<m;l++)e[l].assign(n[l]);qt(a,n)}f=s;h=Math.max(0,c)+h.height}qt(a,b);qt(a,q);qt(a,p);qt(a,r);k[0]=d;k[1]=e;return new A(c,0,f,h)}function bt(a,b){var c=a.Ny[b];if(void 0!==c&&(c=c.pop(),void 0!==c))return c;for(var c=[],d=0;d<b;d++)c[d]=new z;return c}function qt(a,b){var c=b.length,d=a.Ny[c];void 0===d&&(d=[],a.Ny[c]=d);d.push(b)} +Z.prototype.arrangeTrees=function(){if(this.ed===ts)for(var a=this.ud.i;a.next();){var b=a.value;if(b instanceof rs){var c=b.Jc;if(null!==c){var d=c.position,c=d.x,d=d.y;isFinite(c)||(c=0);isFinite(d)||(d=0);ut(this,b,c,d)}}}else{c=[];for(a=this.ud.i;a.next();)b=a.value,b instanceof rs&&c.push(b);switch(this.sorting){case Hs:break;case Is:c.reverse();break;case Js:c.sort(this.comparer);break;case Ks:c.sort(this.comparer);c.reverse();break;default:v.k("Unhandled sorting value "+this.sorting.toString())}b= +this.Xd;a=b.x;b=b.y;for(d=0;d<c.length;d++){var e=c[d];ut(this,e,a+e.Ma.x,b+e.Ma.y);switch(this.ed){case qs:b+=e.fb.height+this.bg.height;break;case vt:a+=e.fb.width+this.bg.width;break;default:v.k("Unhandled arrangement value "+this.ed.toString())}}}};function ut(a,b,c,d){if(null!==b){b.x=c;b.y=d;b=b.children;for(var e=b.length,f=0;f<e;f++){var h=b[f];ut(a,h,c+h.ma.x,d+h.ma.y)}}}Z.prototype.commitLayout=function(){this.nA();this.commitNodes();this.ez();this.xt&&this.commitLinks()}; +Z.prototype.commitNodes=function(){for(var a=this.network.vertexes.i;a.next();)a.value.commit();for(a.reset();a.next();)this.layoutComments(a.value)}; +Z.prototype.ez=function(){if(this.Hz===zs){for(var a=this.OA,b=[],c=null,d=this.network.vertexes.i;d.next();){var e=d.value;null===c?c=e.mb.copy():c.bi(e.mb);var f=b[e.level],f=void 0===f?Ys(e):Math.max(f,Ys(e));b[e.level]=f}for(d=0;d<b.length;d++)void 0===b[d]&&(b[d]=0);90===this.angle||270===this.angle?(c.Qf(this.nodeSpacing/2,this.layerSpacing),e=new z(-this.nodeSpacing/2,-this.layerSpacing/2)):(c.Qf(this.layerSpacing,this.nodeSpacing/2),e=new z(-this.layerSpacing/2,-this.nodeSpacing/2));var f= +[],c=90===this.angle||270===this.angle?c.width:c.height,h=0;if(180===this.angle||270===this.angle)for(d=0;d<a.length;d++)h+=a[d]+b[d];for(d=0;d<a.length;d++){var k=a[d]+b[d];270===this.angle?(h-=k,f.push(new A(0,h,c,k))):90===this.angle?(f.push(new A(0,h,c,k)),h+=k):180===this.angle?(h-=k,f.push(new A(h,0,k,c))):(f.push(new A(h,0,k,c)),h+=k)}this.commitLayers(f,e)}};Z.prototype.commitLayers=function(){};Z.prototype.commitLinks=function(){for(var a=this.network.edges.i;a.next();)a.value.commit()}; +Z.prototype.nA=function(){for(var a=this.ud.i;a.next();){var b=a.value;b instanceof rs&&wt(this,b)}};function wt(a,b){if(null!==b){a.setPortSpots(b);for(var c=b.children,d=c.length,e=0;e<d;e++)wt(a,c[e])}} +Z.prototype.setPortSpots=function(a){var b=a.alignment;if(Ms(b)){var c=this.Df===ns,d=Vs(a),e;switch(d){case 0:e=uc;break;case 90:e=vc;break;case 180:e=tc;break;default:e=sc}var f=a.children,h=f.length;switch(b){case Ns:case Cs:for(b=0;b<h;b++){var k=f[b],k=(c?k.lc:k.hc).first();if(null!==k&&(k=k.link,null!==k)){var l=90===d||270===d?tc:sc;if(1===h||b===h-1&&1===h%2)switch(d){case 0:l=tc;break;case 90:l=sc;break;case 180:l=uc;break;default:l=vc}else 0===b%2&&(l=90===d||270===d?uc:vc);c?(a.setsPortSpot&& +(k.xb=e),a.setsChildPortSpot&&(k.yb=l)):(a.setsPortSpot&&(k.xb=l),a.setsChildPortSpot&&(k.yb=e))}}break;case Os:l=90===d||270===d?uc:vc;for(d=c?a.hc:a.lc;d.next();)k=d.value.link,null!==k&&(c?(a.setsPortSpot&&(k.xb=e),a.setsChildPortSpot&&(k.yb=l)):(a.setsPortSpot&&(k.xb=l),a.setsChildPortSpot&&(k.yb=e)));break;case Ps:for(l=90===d||270===d?tc:sc,d=c?a.hc:a.lc;d.next();)k=d.value.link,null!==k&&(c?(a.setsPortSpot&&(k.xb=e),a.setsChildPortSpot&&(k.yb=l)):(a.setsPortSpot&&(k.xb=l),a.setsChildPortSpot&& +(k.yb=e)))}}else if(c=Vs(a),this.Df===ns)for(e=a.hc;e.next();){if(d=e.value.link,null!==d){if(a.setsPortSpot)if(a.portSpot.Uc())switch(c){case 0:d.xb=uc;break;case 90:d.xb=vc;break;case 180:d.xb=tc;break;default:d.xb=sc}else d.xb=a.portSpot;if(a.setsChildPortSpot)if(a.childPortSpot.Uc())switch(c){case 0:d.yb=tc;break;case 90:d.yb=sc;break;case 180:d.yb=uc;break;default:d.yb=vc}else d.yb=a.childPortSpot}}else for(e=a.lc;e.next();)if(d=e.value.link,null!==d){if(a.setsPortSpot)if(a.portSpot.Uc())switch(c){case 0:d.yb= +uc;break;case 90:d.yb=vc;break;case 180:d.yb=tc;break;default:d.yb=sc}else d.yb=a.portSpot;if(a.setsChildPortSpot)if(a.childPortSpot.Uc())switch(c){case 0:d.xb=tc;break;case 90:d.xb=sc;break;case 180:d.xb=uc;break;default:d.xb=vc}else d.xb=a.childPortSpot}};function Vs(a){a=a.angle;return 45>=a?0:135>=a?90:225>=a?180:315>=a?270:0} +function Ys(a){var b=Vs(a),b=90===b||270===b,c=a.layerSpacing;if(0<a.layerSpacingParentOverlap)var d=Math.min(1,a.layerSpacingParentOverlap),c=c-(b?a.height*d:a.width*d);c<(b?-a.height:-a.width)&&(c=b?-a.height:-a.width);return c}function Zs(a){var b=Vs(a),b=90===b||270===b,c=a.nodeIndent;if(0<a.nodeIndentPastParent)var d=Math.min(1,a.nodeIndentPastParent),c=c+(b?a.width*d:a.height*d);return c=Math.max(0,c)} +v.defineProperty(Z,{CK:"roots"},function(){return this.ud},function(a){this.ud!==a&&(v.A(a,J,Z,"roots"),this.ud=a,this.H())});v.defineProperty(Z,{path:"path"},function(){return this.Jr},function(a){this.Jr!==a&&(v.pb(a,Z,Z,"path"),this.Jr=a,this.H())});v.defineProperty(Z,{OI:"treeStyle"},function(){return this.Fs},function(a){this.ed!==a&&(v.pb(a,Z,Z,"treeStyle"),a===os||a===Fs||a===Gs||a===Es)&&(this.Fs=a,this.H())}); +v.defineProperty(Z,{Hz:"layerStyle"},function(){return this.mv},function(a){this.ed!==a&&(v.pb(a,Z,Z,"layerStyle"),a===ps||a===As||a===zs)&&(this.mv=a,this.H())});v.defineProperty(Z,{comments:"comments"},function(){return this.vh},function(a){this.vh!==a&&(v.j(a,"boolean",Z,"comments"),this.vh=a,this.H())});v.defineProperty(Z,{Nf:"arrangement"},function(){return this.ed},function(a){this.ed!==a&&(v.pb(a,Z,Z,"arrangement"),a===qs||a===vt||a===ts)&&(this.ed=a,this.H())}); +v.defineProperty(Z,{jD:"arrangementSpacing"},function(){return this.bg},function(a){v.A(a,ia,Z,"arrangementSpacing");this.bg.K(a)||(this.bg.assign(a),this.H())});v.defineProperty(Z,{BK:"rootDefaults"},function(){return this.ra},function(a){this.ra!==a&&(v.A(a,rs,Z,"rootDefaults"),this.ra=a,this.H())});v.defineProperty(Z,{fJ:"alternateDefaults"},function(){return this.ta},function(a){this.ta!==a&&(v.A(a,rs,Z,"alternateDefaults"),this.ta=a,this.H())}); +v.defineProperty(Z,{sorting:"sorting"},function(){return this.ra.sorting},function(a){this.ra.sorting!==a&&(v.pb(a,Z,Z,"sorting"),a===Hs||a===Is||a===Js||Ks)&&(this.ra.sorting=a,this.H())});v.defineProperty(Z,{comparer:"comparer"},function(){return this.ra.comparer},function(a){this.ra.comparer!==a&&(v.j(a,"function",Z,"comparer"),this.ra.comparer=a,this.H())}); +v.defineProperty(Z,{angle:"angle"},function(){return this.ra.angle},function(a){this.ra.angle!==a&&(v.j(a,"number",Z,"angle"),0===a||90===a||180===a||270===a?(this.ra.angle=a,this.H()):v.k("TreeLayout.angle must be 0, 90, 180, or 270"))});v.defineProperty(Z,{alignment:"alignment"},function(){return this.ra.alignment},function(a){this.ra.alignment!==a&&(v.pb(a,Z,Z,"alignment"),this.ra.alignment=a,this.H())}); +v.defineProperty(Z,{nodeIndent:"nodeIndent"},function(){return this.ra.nodeIndent},function(a){this.ra.nodeIndent!==a&&(v.j(a,"number",Z,"nodeIndent"),0<=a&&(this.ra.nodeIndent=a,this.H()))});v.defineProperty(Z,{nodeIndentPastParent:"nodeIndentPastParent"},function(){return this.ra.nodeIndentPastParent},function(a){this.ra.nodeIndentPastParent!==a&&(v.j(a,"number",Z,"nodeIndentPastParent"),0<=a&&1>=a&&(this.ra.nodeIndentPastParent=a,this.H()))}); +v.defineProperty(Z,{nodeSpacing:"nodeSpacing"},function(){return this.ra.nodeSpacing},function(a){this.ra.nodeSpacing!==a&&(v.j(a,"number",Z,"nodeSpacing"),this.ra.nodeSpacing=a,this.H())});v.defineProperty(Z,{layerSpacing:"layerSpacing"},function(){return this.ra.layerSpacing},function(a){this.ra.layerSpacing!==a&&(v.j(a,"number",Z,"layerSpacing"),this.ra.layerSpacing=a,this.H())}); +v.defineProperty(Z,{layerSpacingParentOverlap:"layerSpacingParentOverlap"},function(){return this.ra.layerSpacingParentOverlap},function(a){this.ra.layerSpacingParentOverlap!==a&&(v.j(a,"number",Z,"layerSpacingParentOverlap"),0<=a&&1>=a&&(this.ra.layerSpacingParentOverlap=a,this.H()))});v.defineProperty(Z,{compaction:"compaction"},function(){return this.ra.compaction},function(a){this.ra.compaction!==a&&(v.pb(a,Z,Z,"compaction"),a===Ss||a===Us)&&(this.ra.compaction=a,this.H())}); +v.defineProperty(Z,{breadthLimit:"breadthLimit"},function(){return this.ra.breadthLimit},function(a){this.ra.breadthLimit!==a&&(v.j(a,"number",Z,"breadthLimit"),0<=a&&(this.ra.breadthLimit=a,this.H()))});v.defineProperty(Z,{rowSpacing:"rowSpacing"},function(){return this.ra.rowSpacing},function(a){this.ra.rowSpacing!==a&&(v.j(a,"number",Z,"rowSpacing"),this.ra.rowSpacing=a,this.H())}); +v.defineProperty(Z,{rowIndent:"rowIndent"},function(){return this.ra.rowIndent},function(a){this.ra.rowIndent!==a&&(v.j(a,"number",Z,"rowIndent"),0<=a&&(this.ra.rowIndent=a,this.H()))});v.defineProperty(Z,{commentSpacing:"commentSpacing"},function(){return this.ra.commentSpacing},function(a){this.ra.commentSpacing!==a&&(v.j(a,"number",Z,"commentSpacing"),this.ra.commentSpacing=a,this.H())}); +v.defineProperty(Z,{commentMargin:"commentMargin"},function(){return this.ra.commentMargin},function(a){this.ra.commentMargin!==a&&(v.j(a,"number",Z,"commentMargin"),this.ra.commentMargin=a,this.H())});v.defineProperty(Z,{setsPortSpot:"setsPortSpot"},function(){return this.ra.setsPortSpot},function(a){this.ra.setsPortSpot!==a&&(v.j(a,"boolean",Z,"setsPortSpot"),this.ra.setsPortSpot=a,this.H())}); +v.defineProperty(Z,{portSpot:"portSpot"},function(){return this.ra.portSpot},function(a){v.A(a,L,Z,"portSpot");this.ra.portSpot.K(a)||(this.ra.portSpot=a,this.H())});v.defineProperty(Z,{setsChildPortSpot:"setsChildPortSpot"},function(){return this.ra.setsChildPortSpot},function(a){this.ra.setsChildPortSpot!==a&&(v.j(a,"boolean",Z,"setsChildPortSpot"),this.ra.setsChildPortSpot=a,this.H())}); +v.defineProperty(Z,{childPortSpot:"childPortSpot"},function(){return this.ra.childPortSpot},function(a){v.A(a,L,Z,"childPortSpot");this.ra.childPortSpot.K(a)||(this.ra.childPortSpot=a,this.H())});v.defineProperty(Z,{qJ:"alternateSorting"},function(){return this.ta.sorting},function(a){this.ta.sorting!==a&&(v.pb(a,Z,Z,"alternateSorting"),a===Hs||a===Is||a===Js||Ks)&&(this.ta.sorting=a,this.H())}); +v.defineProperty(Z,{eJ:"alternateComparer"},function(){return this.ta.comparer},function(a){this.ta.comparer!==a&&(v.j(a,"function",Z,"alternateComparer"),this.ta.comparer=a,this.H())});v.defineProperty(Z,{ZI:"alternateAngle"},function(){return this.ta.angle},function(a){this.ta.angle!==a&&(v.j(a,"number",Z,"alternateAngle"),0===a||90===a||180===a||270===a)&&(this.ta.angle=a,this.H())}); +v.defineProperty(Z,{YI:"alternateAlignment"},function(){return this.ta.alignment},function(a){this.ta.alignment!==a&&(v.pb(a,Z,Z,"alternateAlignment"),this.ta.alignment=a,this.H())});v.defineProperty(Z,{iJ:"alternateNodeIndent"},function(){return this.ta.nodeIndent},function(a){this.ta.nodeIndent!==a&&(v.j(a,"number",Z,"alternateNodeIndent"),0<=a&&(this.ta.nodeIndent=a,this.H()))}); +v.defineProperty(Z,{jJ:"alternateNodeIndentPastParent"},function(){return this.ta.nodeIndentPastParent},function(a){this.ta.nodeIndentPastParent!==a&&(v.j(a,"number",Z,"alternateNodeIndentPastParent"),0<=a&&1>=a&&(this.ta.nodeIndentPastParent=a,this.H()))});v.defineProperty(Z,{kJ:"alternateNodeSpacing"},function(){return this.ta.nodeSpacing},function(a){this.ta.nodeSpacing!==a&&(v.j(a,"number",Z,"alternateNodeSpacing"),this.ta.nodeSpacing=a,this.H())}); +v.defineProperty(Z,{gJ:"alternateLayerSpacing"},function(){return this.ta.layerSpacing},function(a){this.ta.layerSpacing!==a&&(v.j(a,"number",Z,"alternateLayerSpacing"),this.ta.layerSpacing=a,this.H())});v.defineProperty(Z,{hJ:"alternateLayerSpacingParentOverlap"},function(){return this.ta.layerSpacingParentOverlap},function(a){this.ta.layerSpacingParentOverlap!==a&&(v.j(a,"number",Z,"alternateLayerSpacingParentOverlap"),0<=a&&1>=a&&(this.ta.layerSpacingParentOverlap=a,this.H()))}); +v.defineProperty(Z,{dJ:"alternateCompaction"},function(){return this.ta.compaction},function(a){this.ta.compaction!==a&&(v.pb(a,Z,Z,"alternateCompaction"),a===Ss||a===Us)&&(this.ta.compaction=a,this.H())});v.defineProperty(Z,{$I:"alternateBreadthLimit"},function(){return this.ta.breadthLimit},function(a){this.ta.breadthLimit!==a&&(v.j(a,"number",Z,"alternateBreadthLimit"),0<=a&&(this.ta.breadthLimit=a,this.H()))}); +v.defineProperty(Z,{nJ:"alternateRowSpacing"},function(){return this.ta.rowSpacing},function(a){this.ta.rowSpacing!==a&&(v.j(a,"number",Z,"alternateRowSpacing"),this.ta.rowSpacing=a,this.H())});v.defineProperty(Z,{mJ:"alternateRowIndent"},function(){return this.ta.rowIndent},function(a){this.ta.rowIndent!==a&&(v.j(a,"number",Z,"alternateRowIndent"),0<=a&&(this.ta.rowIndent=a,this.H()))}); +v.defineProperty(Z,{cJ:"alternateCommentSpacing"},function(){return this.ta.commentSpacing},function(a){this.ta.commentSpacing!==a&&(v.j(a,"number",Z,"alternateCommentSpacing"),this.ta.commentSpacing=a,this.H())});v.defineProperty(Z,{bJ:"alternateCommentMargin"},function(){return this.ta.commentMargin},function(a){this.ta.commentMargin!==a&&(v.j(a,"number",Z,"alternateCommentMargin"),this.ta.commentMargin=a,this.H())}); +v.defineProperty(Z,{pJ:"alternateSetsPortSpot"},function(){return this.ta.setsPortSpot},function(a){this.ta.setsPortSpot!==a&&(v.j(a,"boolean",Z,"alternateSetsPortSpot"),this.ta.setsPortSpot=a,this.H())});v.defineProperty(Z,{lJ:"alternatePortSpot"},function(){return this.ta.portSpot},function(a){v.A(a,L,Z,"alternatePortSpot");this.ta.portSpot.K(a)||(this.ta.portSpot=a,this.H())}); +v.defineProperty(Z,{oJ:"alternateSetsChildPortSpot"},function(){return this.ta.setsChildPortSpot},function(a){this.ta.setsChildPortSpot!==a&&(v.j(a,"boolean",Z,"alternateSetsChildPortSpot"),this.ta.setsChildPortSpot=a,this.H())});v.defineProperty(Z,{aJ:"alternateChildPortSpot"},function(){return this.ta.childPortSpot},function(a){v.A(a,L,Z,"alternateChildPortSpot");this.ta.childPortSpot.K(a)||(this.ta.childPortSpot=a,this.H())});var ms;Z.PathDefault=ms=v.p(Z,"PathDefault",-1);var ns; +Z.PathDestination=ns=v.p(Z,"PathDestination",0);var us;Z.PathSource=us=v.p(Z,"PathSource",1);var Hs;Z.SortingForwards=Hs=v.p(Z,"SortingForwards",10);var Is;Z.SortingReverse=Is=v.p(Z,"SortingReverse",11);var Js;Z.SortingAscending=Js=v.p(Z,"SortingAscending",12);var Ks;Z.SortingDescending=Ks=v.p(Z,"SortingDescending",13);var mt;Z.AlignmentCenterSubtrees=mt=v.p(Z,"AlignmentCenterSubtrees",20);var Ls;Z.AlignmentCenterChildren=Ls=v.p(Z,"AlignmentCenterChildren",21);var Ws; +Z.AlignmentStart=Ws=v.p(Z,"AlignmentStart",22);var Xs;Z.AlignmentEnd=Xs=v.p(Z,"AlignmentEnd",23);var Ns;Z.AlignmentBus=Ns=v.p(Z,"AlignmentBus",24);var Cs;Z.AlignmentBusBranching=Cs=v.p(Z,"AlignmentBusBranching",25);var Os;Z.AlignmentTopLeftBus=Os=v.p(Z,"AlignmentTopLeftBus",26);var Ps;Z.AlignmentBottomRightBus=Ps=v.p(Z,"AlignmentBottomRightBus",27);var Ss;Z.CompactionNone=Ss=v.p(Z,"CompactionNone",30);var Us;Z.CompactionBlock=Us=v.p(Z,"CompactionBlock",31);var os; +Z.StyleLayered=os=v.p(Z,"StyleLayered",40);var Gs;Z.StyleLastParents=Gs=v.p(Z,"StyleLastParents",41);var Fs;Z.StyleAlternating=Fs=v.p(Z,"StyleAlternating",42);var Es;Z.StyleRootOnly=Es=v.p(Z,"StyleRootOnly",43);var qs;Z.ArrangementVertical=qs=v.p(Z,"ArrangementVertical",50);var vt;Z.ArrangementHorizontal=vt=v.p(Z,"ArrangementHorizontal",51);var ts;Z.ArrangementFixedRoots=ts=v.p(Z,"ArrangementFixedRoots",52);var ps;Z.LayerIndividual=ps=v.p(Z,"LayerIndividual",60);var As; +Z.LayerSiblings=As=v.p(Z,"LayerSiblings",61);var zs;Z.LayerUniform=zs=v.p(Z,"LayerUniform",62);function ss(){$f.call(this)}v.Ja(ss,$f);v.ea("TreeNetwork",ss);ss.prototype.createVertex=function(){return new rs};ss.prototype.createEdge=function(){return new xt}; +function rs(){oq.call(this);this.initialized=!1;this.parent=null;this.children=[];this.maxGenerationCount=this.maxChildrenCount=this.descendantCount=this.level=0;this.comments=null;this.ma=new z(0,0);this.fb=new ia(0,0);this.Ma=new z(0,0);this.Bp=this.Ap=this.qI=!1;this.St=this.At=null;this.sorting=Hs;this.comparer=uq;this.angle=0;this.alignment=Ls;this.nodeIndentPastParent=this.nodeIndent=0;this.nodeSpacing=20;this.layerSpacing=50;this.layerSpacingParentOverlap=0;this.compaction=Us;this.breadthLimit= +0;this.rowSpacing=25;this.commentSpacing=this.rowIndent=10;this.commentMargin=20;this.setsPortSpot=!0;this.portSpot=fc;this.setsChildPortSpot=!0;this.childPortSpot=fc}v.Ja(rs,oq);v.ea("TreeVertex",rs); +rs.prototype.copyInheritedPropertiesFrom=function(a){null!==a&&(this.sorting=a.sorting,this.comparer=a.comparer,this.angle=a.angle,this.alignment=a.alignment,this.nodeIndent=a.nodeIndent,this.nodeIndentPastParent=a.nodeIndentPastParent,this.nodeSpacing=a.nodeSpacing,this.layerSpacing=a.layerSpacing,this.layerSpacingParentOverlap=a.layerSpacingParentOverlap,this.compaction=a.compaction,this.breadthLimit=a.breadthLimit,this.rowSpacing=a.rowSpacing,this.rowIndent=a.rowIndent,this.commentSpacing=a.commentSpacing, +this.commentMargin=a.commentMargin,this.setsPortSpot=a.setsPortSpot,this.portSpot=a.portSpot,this.setsChildPortSpot=a.setsChildPortSpot,this.childPortSpot=a.childPortSpot)};v.u(rs,{Cm:"childrenCount"},function(){return this.children.length});v.defineProperty(rs,{AK:"relativePosition"},function(){return this.ma},function(a){this.ma.set(a)});v.defineProperty(rs,{MK:"subtreeSize"},function(){return this.fb},function(a){this.fb.set(a)}); +v.defineProperty(rs,{LK:"subtreeOffset"},function(){return this.Ma},function(a){this.Ma.set(a)});function xt(){pq.call(this);this.Rr=new z(0,0)}v.Ja(xt,pq);v.ea("TreeEdge",xt); +xt.prototype.commit=function(){var a=this.link;if(null!==a&&!a.sl){var b=this.network.Pb,c=null,d=null;switch(b.Df){case ns:c=this.fromVertex;d=this.toVertex;break;case us:c=this.toVertex;d=this.fromVertex;break;default:v.k("Unhandled path value "+b.Df.toString())}if(null!==c&&null!==d)if(b=this.Rr,0!==b.x||0!==b.y||c.qI){var d=c.mb,e=Vs(c),f=Ys(c),h=c.rowSpacing;a.en();var k=a.Ke===Ni,l=a.jc,m=0,n,p;a.Cl();if(l||k){for(m=2;4<a.oa;)a.GE(2);n=a.l(1);p=a.l(2)}else{for(m=1;3<a.oa;)a.GE(1);n=a.l(0);p= +a.l(a.oa-1)}var q=a.l(a.oa-1),r=0;0===e?(c.alignment===Xs?(r=d.bottom+b.y,0===b.y&&n.y>q.y+c.rowIndent&&(r=Math.min(r,Math.max(n.y,r-Zs(c))))):c.alignment===Ws?(r=d.top+b.y,0===b.y&&n.y<q.y-c.rowIndent&&(r=Math.max(r,Math.min(n.y,r+Zs(c))))):r=c.Ap||c.Bp&&1===c.maxGenerationCount?d.top-c.Ma.y+b.y:d.y+d.height/2+b.y,k?(a.w(m,n.x,r),m++,a.w(m,d.right+f,r),m++,a.w(m,d.right+f+(b.x-h)/3,r),m++,a.w(m,d.right+f+2*(b.x-h)/3,r),m++,a.w(m,d.right+f+(b.x-h),r),m++,a.w(m,p.x,r)):(l&&(a.w(m,d.right+f/2,n.y), +m++),a.w(m,d.right+f/2,r),m++,a.w(m,d.right+f+b.x-(l?h/2:h),r),m++,l&&a.w(m,a.l(m-1).x,p.y))):90===e?(c.alignment===Xs?(r=d.right+b.x,0===b.x&&n.x>q.x+c.rowIndent&&(r=Math.min(r,Math.max(n.x,r-Zs(c))))):c.alignment===Ws?(r=d.left+b.x,0===b.x&&n.x<q.x-c.rowIndent&&(r=Math.max(r,Math.min(n.x,r+Zs(c))))):r=c.Ap||c.Bp&&1===c.maxGenerationCount?d.left-c.Ma.x+b.x:d.x+d.width/2+b.x,k?(a.w(m,r,n.y),m++,a.w(m,r,d.bottom+f),m++,a.w(m,r,d.bottom+f+(b.y-h)/3),m++,a.w(m,r,d.bottom+f+2*(b.y-h)/3),m++,a.w(m,r,d.bottom+ +f+(b.y-h)),m++,a.w(m,r,p.y)):(l&&(a.w(m,n.x,d.bottom+f/2),m++),a.w(m,r,d.bottom+f/2),m++,a.w(m,r,d.bottom+f+b.y-(l?h/2:h)),m++,l&&a.w(m,p.x,a.l(m-1).y))):180===e?(c.alignment===Xs?(r=d.bottom+b.y,0===b.y&&n.y>q.y+c.rowIndent&&(r=Math.min(r,Math.max(n.y,r-Zs(c))))):c.alignment===Ws?(r=d.top+b.y,0===b.y&&n.y<q.y-c.rowIndent&&(r=Math.max(r,Math.min(n.y,r+Zs(c))))):r=c.Ap||c.Bp&&1===c.maxGenerationCount?d.top-c.Ma.y+b.y:d.y+d.height/2+b.y,k?(a.w(m,n.x,r),m++,a.w(m,d.left-f,r),m++,a.w(m,d.left-f+(b.x+ +h)/3,r),m++,a.w(m,d.left-f+2*(b.x+h)/3,r),m++,a.w(m,d.left-f+(b.x+h),r),m++,a.w(m,p.x,r)):(l&&(a.w(m,d.left-f/2,n.y),m++),a.w(m,d.left-f/2,r),m++,a.w(m,d.left-f+b.x+(l?h/2:h),r),m++,l&&a.w(m,a.l(m-1).x,p.y))):270===e?(c.alignment===Xs?(r=d.right+b.x,0===b.x&&n.x>q.x+c.rowIndent&&(r=Math.min(r,Math.max(n.x,r-Zs(c))))):c.alignment===Ws?(r=d.left+b.x,0===b.x&&n.x<q.x-c.rowIndent&&(r=Math.max(r,Math.min(n.x,r+Zs(c))))):r=c.Ap||c.Bp&&1===c.maxGenerationCount?d.left-c.Ma.x+b.x:d.x+d.width/2+b.x,k?(a.w(m, +r,n.y),m++,a.w(m,r,d.top-f),m++,a.w(m,r,d.top-f+(b.y+h)/3),m++,a.w(m,r,d.top-f+2*(b.y+h)/3),m++,a.w(m,r,d.top-f+(b.y+h)),m++,a.w(m,r,p.y)):(l&&(a.w(m,n.x,d.top-f/2),m++),a.w(m,r,d.top-f/2),m++,a.w(m,r,d.top-f+b.y+(l?h/2:h)),m++,l&&a.w(m,p.x,a.l(m-1).y))):v.k("Invalid angle "+e);a.Pi()}else e=c,f=d,a=this.link,c=Vs(e),c!==Vs(f)&&(b=Ys(e),d=e.mb,e=f.mb,0===c&&e.left-d.right<b+1||90===c&&e.top-d.bottom<b+1||180===c&&d.left-e.right<b+1||270===c&&d.top-e.bottom<b+1||(a.en(),e=a.Ke===Ni,f=a.jc,h=Ms(this.fromVertex.alignment), +a.Cl(),0===c?(c=d.right+b/2,e?4===a.oa&&(b=a.l(3).y,a.V(1,c-20,a.l(1).y),a.w(2,c-20,b),a.w(3,c,b),a.w(4,c+20,b),a.V(5,a.l(5).x,b)):f?h?a.V(3,a.l(2).x,a.l(4).y):6===a.oa&&(a.V(2,c,a.l(2).y),a.V(3,c,a.l(3).y)):4===a.oa?a.w(2,c,a.l(2).y):3===a.oa?a.V(1,c,a.l(2).y):2===a.oa&&a.w(1,c,a.l(1).y)):90===c?(b=d.bottom+b/2,e?4===a.oa&&(c=a.l(3).x,a.V(1,a.l(1).x,b-20),a.w(2,c,b-20),a.w(3,c,b),a.w(4,c,b+20),a.V(5,c,a.l(5).y)):f?h?a.V(3,a.l(2).x,a.l(4).y):6===a.oa&&(a.V(2,a.l(2).x,b),a.V(3,a.l(3).x,b)):4===a.oa? +a.w(2,a.l(2).x,b):3===a.oa?a.V(1,a.l(2).x,b):2===a.oa&&a.w(1,a.l(1).x,b)):180===c?(c=d.left-b/2,e?4===a.oa&&(b=a.l(3).y,a.V(1,c+20,a.l(1).y),a.w(2,c+20,b),a.w(3,c,b),a.w(4,c-20,b),a.V(5,a.l(5).x,b)):f?h?a.V(3,a.l(2).x,a.l(4).y):6===a.oa&&(a.V(2,c,a.l(2).y),a.V(3,c,a.l(3).y)):4===a.oa?a.w(2,c,a.l(2).y):3===a.oa?a.V(1,c,a.l(2).y):2===a.oa&&a.w(1,c,a.l(1).y)):270===c&&(b=d.top-b/2,e?4===a.oa&&(c=a.l(3).x,a.V(1,a.l(1).x,b+20),a.w(2,c,b+20),a.w(3,c,b),a.w(4,c,b-20),a.V(5,c,a.l(5).y)):f?h?a.V(3,a.l(2).x, +a.l(4).y):6===a.oa&&(a.V(2,a.l(2).x,b),a.V(3,a.l(3).x,b)):4===a.oa?a.w(2,a.l(2).x,b):3===a.oa?a.V(1,a.l(2).x,b):2===a.oa&&a.w(1,a.l(1).x,b)),a.Pi()))}};v.defineProperty(xt,{zK:"relativePoint"},function(){return this.Rr},function(a){this.Rr.set(a)});function yt(){G.call(this);this.Re=null}v.Ja(yt,G);yt.prototype.cloneProtected=function(a){G.prototype.cloneProtected.call(this,a);a.element=this.Re.cloneNode(!0)};yt.prototype.toString=function(){return"HTMLHost("+this.Re.toString()+")#"+v.ld(this)}; +yt.prototype.Yj=function(a,b){var c=this.Re;if(null!==c){var d=this.Xa(zb);d.x-=this.U.width/2;d.y-=this.U.height/2;d.x-=this.U.x;d.y-=this.U.y;var d=b.nF(d),e=b.jl;null===e||e.contains(c)||e.appendChild(c);e=this.transform;c.style.transform="matrix("+e.m11+","+e.m12+","+e.m21+","+e.m22+","+e.dx+","+e.dy+")";c.style.transformOrigin="0 0";e=d.y;c.style.left=d.x+"px";c.style.top=e+"px"}}; +yt.prototype.mp=function(a,b,c,d){var e=this.za;isFinite(e.width)&&(a=e.width);isFinite(e.height)&&(b=e.height);var e=this.xf,f=this.kh;c=Math.max(c,f.width);d=Math.max(d,f.height);a=Math.min(e.width,a);b=Math.min(e.height,b);a=Math.max(c,a);b=Math.max(d,b);c=this.Re;null!==c&&(b=c.getBoundingClientRect(),a=b.width,b=b.height);Wa(this.Qc,a,b);Dm(this,0,0,a,b)};yt.prototype.Ni=function(a,b,c,d){Hm(this,a,b,c,d)};v.u(yt,{Ha:"naturalBounds"},function(){return this.Qc}); +v.defineProperty(yt,{element:"element"},function(){return this.Re},function(a){var b=this.Re;b!==a&&(a instanceof HTMLElement||v.k("HTMLHost.element must be an instance of HTMLElement."),this.Re=a,a.className="HTMLHost",this.h("element",b,a),this.pa())});ea.version="1.6.21"; +window&&(window.module&&"object"===typeof window.module&&"object"===typeof window.module.exports?window.module.exports=ea:window.define&&"function"===typeof window.define&&window.define.amd?(window.go=ea,window.define(ea)):window.go=ea);"undefined"!==typeof module&&"object"===typeof module.exports&&(module.exports=ea); })(window); diff --git a/cyclone-web/vendor/gojs/goJS.d.ts b/cyclone-web/vendor/gojs/goJS.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..d4f815d9b471ffde61cdc2035c18f7fdf0032227 --- /dev/null +++ b/cyclone-web/vendor/gojs/goJS.d.ts @@ -0,0 +1,9070 @@ +// Type definitions for GoJS v1.5.13 +// Project: http://gojs.net +// Definitions by: Northwoods Software <https://github.com/NorthwoodsSoftware> +// Definitions: https://github.com/NorthwoodsSoftware/GoJS + +/* Copyright (C) 1998-2016 by Northwoods Software Corporation. */ + +// TODO: TypeScript 1.5 destructuring + +declare module go { + /** A number in place of a Margin object is treated as a uniform Margin with that thickness */ + type MarginLike = Margin | number; + + /** A string in place of a Brush object is treated as a Solid Brush of that color. */ + type BrushLike = Brush | string; + + /** A Key is the type of the unique identifier managed by Models for each node data object. */ + type Key = string | number; + + /** Either name a property or get the value of a property from an object. */ + type PropertyAccessor = string | ((data: any, newval: any) => any); + + /** A constructor */ + type Constructor = new (...args: Array<any>) => Object; + + /** + * An adornment is a special kind of Part that is associated with another Part, + * the Adornment.adornedPart. + * Adornments are normally associated with a particular GraphObject in the adorned part -- + * that is the value of .adornedObject. + * However, the .adornedObject may be null, in which case the .adornedPart will also be null. + */ + class Adornment extends Part { + /** + * @param {EnumValue=} type if not supplied, the default Panel type is Panel.Position. + */ + constructor(type?: EnumValue); + + /**Gets or sets the GraphObject that is adorned.*/ + adornedObject: GraphObject; + + /**This read-only property returns the Part that contains the adorned object.*/ + adornedPart: Part; + + /**This read-only property returns a Placeholder that this Adornment may contain in its visual tree.*/ + placeholder: Placeholder; + } + + /** + * This class handles animations in a Diagram. Each Diagram has one, the Diagram.animationManager. + */ + class AnimationManager { + /**You do not normally need to create an instance of this class because one already exists as the Diagram.animationManager, which you can modify.*/ + constructor(); + + /**Gets or sets the duration for animations, in milliseconds. The default value is 600 milliseconds.*/ + duration: number; + + /**This read-only property is true when the AnimationManager is currently animating.*/ + isAnimating: boolean; + + /**Gets or sets whether this AnimationManager operates. The default value is true.*/ + isEnabled: boolean; + + /**This read-only property is true when the animation manager is in the middle of an animation tick.*/ + isTicking: boolean; + + /** + * Stops any running animation and updates the Diagram to its final state. + */ + stopAnimation(): void; + } + + /** + * The Diagram.commandHandler implements various + * commands such as CommandHandler.deleteSelection or CommandHandler.redo. + * The CommandHandler includes keyboard event handling to interpret + * key presses as commands. + */ + class CommandHandler { + /** + * The constructor produces a CommandHandler with the default key bindings. + */ + constructor(); + + /**Gets or sets a data object that is copied by .groupSelection when creating a new Group. The default value is null. The value must be an Object or null.*/ + archetypeGroupData: any; + + /**Gets or sets whether copySelection should also copy Links that connect with selected Nodes.*/ + copiesConnectedLinks: boolean; + + /**Gets or sets whether copySelection and copyToClipboard copy the node data property whose value is the containing group data's key. The default value is false.*/ + copiesGroupKey: boolean; + + /**Gets or sets whether copySelection and copyToClipboard copy the node data property whose value is the tree-parent node data's key. The default value is false.*/ + copiesParentKey: boolean; + + /**Gets or sets whether .copySelection should also copy subtrees. The default value is false.*/ + copiesTree: boolean; + + /**Gets or sets the Diagram.scale set by resetZoom. The default value is 1.0.*/ + defaultScale: number; + + /**Gets or sets whether .deleteSelection should also delete subtrees. The default value is false.*/ + deletesTree: boolean; + + /**This read-only property returns the Diagram that is using this CommandHandler.*/ + diagram: Diagram; + + /**Gets or sets the predicate that determines whether or not a node may become a member of a group. The default predicate is null, which is equivalent to simply returning true.*/ + memberValidation: (g: Group, p: Part) => boolean; + + /**Gets or sets the amount by which .decreaseZoom and .increaseZoom change the Diagram.scale. The default value is 1.05 (5%).*/ + zoomFactor: number; + + /** + * Make sure all of the unnested Parts in the given collection are removed from any containing Groups. + * @param {Iterable<Part>} coll a collection of Parts. + * @param {boolean=} check whether to call .isValidMember to confirm that changing the Part to be a top-level Part is valid. + */ + addTopLevelParts(coll: Iterable<Part>, check?: boolean): boolean; + + /** + * This predicate controls whether the user can collapse expanded Groups. + * @param {Group=} group if supplied, ignore the selection and consider collapsing this particular Group. + */ + canCollapseSubGraph(group?: Group): boolean; + + /** + * This predicate controls whether the user can collapse expanded subtrees of Nodes. + * @param {Node=} node if supplied, ignore the selection and consider collapsing this particular Node. + */ + canCollapseTree(node?: Node): boolean; + + /** + * This predicate controls whether or not the user can invoke the .copySelection command. + */ + canCopySelection(): boolean; + + /** + * This predicate controls whether or not the user can invoke the .cutSelection command. + */ + canCutSelection(): boolean; + + /** + * This predicate controls whether or not the user can invoke the .decreaseZoom command. + * @param {number=} factor This defaults to 1/.zoomFactor. The value should be less than one. + */ + canDecreaseZoom(factor?: number): boolean; + + /** + * This predicate controls whether or not the user can invoke the .deleteSelection command. + */ + canDeleteSelection(): boolean; + + /** + * This predicate controls whether or not the user can invoke the .editTextBlock command. + * @param {TextBlock=} textblock the TextBlock to consider editing. + */ + canEditTextBlock(textblock?: TextBlock): boolean; + + /** + * This predicate controls whether the user can expand collapsed Groups. + * @param {Group=} group if supplied, ignore the selection and consider expanding this particular Group. + */ + canExpandSubGraph(group?: Group): boolean; + + /** + * This predicate controls whether the user can expand collapsed subtrees of Nodes. + * @param {Node=} node if supplied, ignore the selection and consider expanding this particular Node. + */ + canExpandTree(node?: Node): boolean; + + /** + * This predicate controls whether or not the user can invoke the .groupSelection command. + */ + canGroupSelection(): boolean; + + /** + * This predicate controls whether or not the user can invoke the .increaseZoom command. + * @param {number=} factor This defaults to .zoomFactor. The value should be greater than one. + */ + canIncreaseZoom(factor?: number): boolean; + + /** + * This predicate controls whether or not the user can invoke the .pasteSelection command. + */ + canPasteSelection(): boolean; + + /** + * This predicate controls whether or not the user can invoke the .redo command. + */ + canRedo(): boolean; + + /** + * This predicate controls whether or not the user can invoke the .resetZoom command. + * @param {number=} newscale This defaults to 1. The value should be greater than zero. + */ + canResetZoom(newscale?: number): boolean; + + /** + * This predicate controls whether or not the user can invoke the .selectAll command. + */ + canSelectAll(): boolean; + + /** + * This predicate controls whether or not the user can invoke the .showContextMenu command. + * @param {GraphObject|Diagram=} obj a GraphObject or Diagram with a contextMenu defined. + * If none is given, this method will use the first selected object, or else the Diagram. + */ + canShowContextMenu(obj?: GraphObject | Diagram): boolean; + + /** + * This predicate controls whether the user may stop the current tool. + */ + canStopCommand(): boolean; + + /** + * This predicate controls whether or not the user can invoke the .undo command. + */ + canUndo(): boolean; + + /** + * This predicate controls whether or not the user can invoke the .ungroupSelection command. + * @param {Group=} group if supplied, ignore the selection and consider ungrouping this particular Group. + */ + canUngroupSelection(group?: Group): boolean; + + /** + * This predicate controls whether or not the user can invoke the .zoomToFit command. + */ + canZoomToFit(): boolean; + + /** + * Collapse all expanded selected Groups. + * @param {Group=} group if supplied, ignore the selection and collapse this particular Group. + */ + collapseSubGraph(group?: Group): void; + + /** + * Collapse all expanded selected Nodes. + * @param {Node=} node if supplied, ignore the selection and collapse this particular Node subtree. + */ + collapseTree(node?: Node): void; + + /** + * Copy the currently selected parts, Diagram.selection, from the Diagram into the clipboard. + */ + copySelection(): void; + + /** + * This makes a copy of the given collection of Parts and stores it in a static variable acting as the clipboard. + * @param {Iterable<Part>} coll A collection of Parts. + */ + copyToClipboard(coll: Iterable<Part>): void; + + /** + * Execute a .copySelection followed by a .deleteSelection. + */ + cutSelection(): void; + + /** + * Decrease the Diagram.scale by a given factor. + * @param {number=} factor This defaults to 1/.zoomFactor. The value should be less than one. + */ + decreaseZoom(factor?: number): void; + + /** + * Delete the currently selected parts from the diagram. + */ + deleteSelection(): void; + + /** + * This is called by tools to handle keyboard commands. + */ + doKeyDown(): void; + + /** + * This is called by tools to handle keyboard commands. + */ + doKeyUp(): void; + + /** + * Start in-place editing of a TextBlock in the selected Part. + * @param {TextBlock=} textblock the TextBlock to start editing. + */ + editTextBlock(textblock?: TextBlock): void; + + /** + * Expand all collapsed selected Groups. + * @param {Group=} group if supplied, ignore the selection and expand this particular Group. + */ + expandSubGraph(group?: Group): void; + + /** + * Expand all collapsed selected Nodes. + * @param {Node=} node if supplied, ignore the selection and collapse this particular Node subtree. + */ + expandTree(node?: Node): void; + + /** + * Add a copy of .archetypeGroupData and add it to the diagram's model to create a new Group and then add the selected Parts to that new group. + */ + groupSelection(): void; + + /** + * Increase the Diagram.scale by a given factor. + * @param {number=} factor This defaults to .zoomFactor. The value should be greater than one. + */ + increaseZoom(factor?: Number): void; + + /** + * This predicate is called to determine whether a Node may be added as a member of a Group. + * @param {Group} group this may be null if the node is being added as a top-level node. + * @param {Part} part a Part, usually a Node, possibly another Group, but not a Link or an Adornment. + */ + isValidMember(group: Group, part: Part): boolean; + + /** + * If the clipboard holds a collection of Parts, and if the Model.dataFormat matches that stored in the clipboard, this makes a copy of the clipboard's parts and adds the copies to this Diagram. + */ + pasteFromClipboard(): Set<Part>; + + /** + * Copy the contents of the clipboard into this diagram, and make those new parts the new selection. + * @param {Point=} pos Point at which to center the newly pasted parts; if not present the parts are not moved. + */ + pasteSelection(pos?: Point): void; + + /** + * Call UndoManager.redo. + */ + redo(): void; + + /** + * Set the Diagram.scale to a new scale value, by default 1. + * @param {number=} newscale This defaults to 1. The value should be greater than zero. + */ + resetZoom(newscale?: number): void; + + /** + * Select all of the selectable Parts in the diagram. + */ + selectAll(): void; + + /** + * Open the context menu of a given GraphObject. + * The given GraphObject must have a GraphObject.contextMenu + * defined in order to show anything. + * @param {GraphObject|Diagram=} obj a GraphObject or Diagram with a contextMenu defined. + * If none is given, this method will use the first selected object, or else the Diagram. + */ + showContextMenu(obj?: GraphObject | Diagram): void; + + /** + * Cancel the operation of the current tool. + */ + stopCommand(): void; + + /** + * Call UndoManager.undo. + */ + undo(): void; + + /** + * Remove the group from the diagram without removing its members from the diagram. + * @param {Group=} group if supplied, ignore the selection and consider ungrouping this particular Group. + */ + ungroupSelection(group?: Group): void; + + /** + * Change the Diagram.scale so that the Diagram.documentBounds fits within the viewport. + */ + zoomToFit(): void; + } + + /** + * A Diagram is associated with an HTML DIV element. Constructing a Diagram creates + * an HTML Canvas element which it places inside of the given DIV element, in addition to several helper divs. + * GoJS will manage the contents of this DIV, and the contents should not be modified otherwise, + * though the given DIV may be styled (background, border, etc) and positioned as needed. + */ + class Diagram { + /** + * Construct an empty Diagram for a particular DIV HTML element. + * @param {HTMLDivElement} div A reference to a DIV HTML element in the DOM. + * If no DIV is supplied one will be created in memory. The Diagram's Diagram.div property + * can then be set later on. + */ + constructor(div: HTMLDivElement); + + /** + * Construct an empty Diagram for a particular DIV HTML element. + * @param {string=} div The ID of a DIV element in the DOM. + * If no DIV identifier is supplied one will be created in memory. The Diagram's Diagram.div property + * can then be set later on. + */ + constructor(div?: string); + + /**Gets or sets whether the user may copy to or paste parts from the internal clipboard.*/ + allowClipboard: boolean; + + /**Gets or sets whether the user may copy objects.*/ + allowCopy: boolean; + + /**Gets or sets whether the user may delete objects from the Diagram.*/ + allowDelete: boolean; + + /**Gets or sets whether the user may start a drag-and-drop in this Diagram, possibly dropping in a different element.*/ + allowDragOut: boolean; + + /**Gets or sets whether the user may end a drag-and-drop operation in this Diagram.*/ + allowDrop: boolean; + + /**Gets or sets whether the user may group parts together.*/ + allowGroup: boolean; + + /**Gets or sets whether the user is allowed to use the horizontal scrollbar.*/ + allowHorizontalScroll: boolean; + + /**Gets or sets whether the user may add parts to the Diagram.*/ + allowInsert: boolean; + + /**Gets or sets whether the user may draw new links.*/ + allowLink: boolean; + + /**Gets or sets whether the user may move objects.*/ + allowMove: boolean; + + /**Gets or sets whether the user may reconnect existing links.*/ + allowRelink: boolean; + + /**Gets or sets whether the user may reshape parts.*/ + allowReshape: boolean; + + /**Gets or sets whether the user may resize parts.*/ + allowResize: boolean; + + /**Gets or sets whether the user may rotate parts.*/ + allowRotate: boolean; + + /**Gets or sets whether the user may select objects.*/ + allowSelect: boolean; + + /**Gets or sets whether the user may do in-place text editing.*/ + allowTextEdit: boolean; + + /**Gets or sets whether the user may undo or redo any changes.*/ + allowUndo: boolean; + + /**Gets or sets whether the user may ungroup existing groups.*/ + allowUngroup: boolean; + + /**Gets or sets whether the user is allowed to use the vertical scrollbar.*/ + allowVerticalScroll: boolean; + + /**Gets or sets whether the user may zoom into or out of the Diagram.*/ + allowZoom: boolean; + + /**This read-only property returns the AnimationManager for this Diagram.*/ + animationManager: AnimationManager; + + /**Gets or sets the autoScale of the Diagram, controlling whether or not the Diagram's bounds automatically scale to fit the view.*/ + autoScale: EnumValue; + + /**Gets or sets the Margin (or number for a uniform Margin) that describes the Diagram's autoScrollRegion.*/ + autoScrollRegion: MarginLike; + + /**Gets or sets the function to execute when the user single-primary-clicks on the background of the Diagram.*/ + click: (e: InputEvent) => void; + + /**Gets or sets the CommandHandler for this Diagram.*/ + commandHandler: CommandHandler; + + /**Gets or sets the content alignment Spot of this Diagram, to be used in determining how parts are positioned when the .viewportBounds width or height is smaller than the .documentBounds.*/ + contentAlignment: Spot; + + /**Gets or sets the function to execute when the user single-secondary-clicks on the background of the Diagram.*/ + contextClick: (e: InputEvent) => void; + + /**This Adornment is shown when the use context clicks in the background.*/ + contextMenu: Adornment; + + /**Gets or sets the current cursor for the Diagram, overriding the .defaultCursor.*/ + currentCursor: string; + + /**Gets or sets the current tool for this Diagram that handles all input events.*/ + currentTool: Tool; + + /**Gets or sets the cursor to be used for the Diagram when no GraphObject specifies a different cursor.*/ + defaultCursor: string; + + /**Gets or sets the default tool for this Diagram that becomes the current tool when the current tool stops.*/ + defaultTool: Tool; + + /**Gets or sets the Diagram's HTMLDivElement, via an HTML Element ID.*/ + div: HTMLDivElement; + + /**This read-only property returns the model-coordinate bounds of the Diagram.*/ + documentBounds: Rect; + + /**Gets or sets the function to execute when the user double-primary-clicks on the background of the Diagram.*/ + doubleClick: (e: InputEvent) => void; + + /**Gets or sets the most recent mouse-down InputEvent that occurred.*/ + firstInput: InputEvent; + + /**Gets or sets a fixed bounding rectangle to be returned by .documentBounds and .computeBounds.*/ + fixedBounds: Rect; + + /**Gets or sets the scrollMode of the Diagram.*/ + scrollMode: EnumValue; + + /**Gets or sets the Margin (or number for a uniform Margin) that describes a scrollable area that surrounds the document bounds, allowing the user to scroll into empty space.*/ + scrollMargin: MarginLike; + + /**Gets or sets the function used to determine the position that this Diagram can be scrolled or moved to.*/ + positionComputation: (d: Diagram, p: Point) => Point; + + /**Gets or sets the function used to determine the scale that this Diagram can be set to.*/ + scaleComputation: (d: Diagram, s: number) => number; + + /**Gets or sets a Panel of type Panel.Grid acting as the background grid extending across the whole viewport of this diagram.*/ + grid: Panel; + + /**Gets or sets the default selection Adornment template, used to adorn selected Groups.*/ + groupSelectionAdornmentTemplate: Adornment; + + /**Gets or sets the default Group template used as the archetype for group data that is added to the .model.*/ + groupTemplate: Group; + + /**Gets or sets a Map mapping template names to Groups.*/ + groupTemplateMap: Map<string,Group>; + + /**Gets or sets whether the Diagram has a horizontal Scrollbar.*/ + hasHorizontalScrollbar: boolean; + + /**Gets or sets whether the Diagram has a vertical Scrollbar.*/ + hasVerticalScrollbar: boolean; + + /**This read-only property returns the read-only collection of highlighted Parts.*/ + highlighteds: Set<Part>; + + /**Gets or sets the initialAutoScale of the Diagram.*/ + initialAutoScale: EnumValue; + + /**Gets or sets the initial content alignment Spot of this Diagram, to be used in determining how parts are positioned initially relative to the viewport.*/ + initialContentAlignment: Spot; + + /**Gets or sets the spot in the document's area that should be coincident with the .initialViewportSpot of the viewport when the document is first initialized.*/ + initialDocumentSpot: Spot; + + /**Gets or sets the initial coordinates of this Diagram in the viewport, eventually setting the .position.*/ + initialPosition: Point; + + /**Gets or sets the initial scale of this Diagram in the viewport, eventually setting the .scale.*/ + initialScale: number; + + /**Gets or sets the spot in the viewport that should be coincident with the .initialDocumentSpot of the document when the document is first initialized.*/ + initialViewportSpot: Spot; + + /**Gets or sets whether the user may interact with the Diagram.*/ + isEnabled: boolean; + + /**Gets or sets whether the Diagram's Diagram.model is Model.isReadOnly.*/ + isModelReadOnly: boolean; + + /**Gets or sets whether this Diagram's state has been modified.*/ + isModified: boolean; + + /**Gets or sets whether mouse events initiated within the Diagram will be captured.*/ + isMouseCaptured: boolean; + + /**Gets or sets whether the Diagram may be modified by the user, while still allowing the user to scroll, zoom, and select.*/ + isReadOnly: boolean; + + /**Gets or sets whether the Diagram tree structure is defined by links going from the parent node to their children, or vice-versa.*/ + isTreePathToChildren: boolean; + + /**Gets or sets the last InputEvent that occurred.*/ + lastInput: InputEvent; + + /**Gets an iterator for this Diagram's Layers.*/ + layers: Iterator<Layer>; + + /**Gets or sets the Layout used to position all of the top-level nodes and links in this Diagram.*/ + layout: Layout; + + /**Returns an iterator of all Links in the Diagram.*/ + links: Iterator<Link>; + + /**Gets or sets the default selection Adornment template, used to adorn selected Links.*/ + linkSelectionAdornmentTemplate: Adornment; + + /**Gets or sets the default Link template used as the archetype for link data that is added to the .model.*/ + linkTemplate: Link; + + /**Gets or sets a Map mapping template names to Links.*/ + linkTemplateMap: Map<string,Link>; + + /**Gets or sets the largest value that .scale may take.*/ + maxScale: number; + + /**Gets or sets the maximum number of selected objects.*/ + maxSelectionCount: number; + + /**Gets or sets the smallest value greater than zero that .scale may take.*/ + minScale: number; + + /**Gets or sets the Model holding data corresponding to the data-bound nodes and links of this Diagram.*/ + model: Model; + + /**Gets or sets the function to execute when the user is dragging the selection in the background of the Diagram during a DraggingTool drag-and-drop, not over any GraphObjects.*/ + mouseDragOver: (e: InputEvent) => void; + + /**Gets or sets the function to execute when the user drops the selection in the background of the Diagram at the end of a DraggingTool drag-and-drop, not onto any GraphObjects.*/ + mouseDrop: (e: InputEvent) => void; + + /**Gets or sets the function to execute when the user holds the mouse stationary in the background of the Diagram while holding down a button, not over any GraphObjects.*/ + mouseHold: (e: InputEvent) => void; + + /**Gets or sets the function to execute when the user holds the mouse stationary in the background of the Diagram without holding down any buttons, not over any GraphObjects.*/ + mouseHover: (e: InputEvent) => void; + + /**Gets or sets the function to execute when the user moves the mouse in the background of the Diagram without holding down any buttons, not over any GraphObjects.*/ + mouseOver: (e: InputEvent) => void; + + /**Returns an iterator of all Nodes and Groups in the Diagram.*/ + nodes: Iterator<Node>; + + /**Gets or sets the default selection Adornment template, used to adorn selected Parts other than Groups or Links.*/ + nodeSelectionAdornmentTemplate: Adornment; + + /**Gets or sets the default Node template used as the archetype for node data that is added to the .model.*/ + nodeTemplate: Part; + + /**Gets or sets a Map mapping template names to Parts.*/ + nodeTemplateMap: Map<string,Part>; + + /**Gets or sets the Margin (or number for a uniform Margin) that describes the Diagram's padding, which controls how much extra space there is around the area occupied by the document.*/ + padding: MarginLike; + + /**Returns an iterator of all Parts in the Diagram that are not Nodes or Links or Adornments.*/ + parts: Iterator<Part>; + + /**Gets or sets the coordinates of this Diagram in the viewport.*/ + position: Point; + + /**Gets or sets the scale transform of this Diagram.*/ + scale: number; + + /**Gets or sets the distance in screen pixels that the horizontal scrollbar will scroll when scrolling by a line.*/ + scrollHorizontalLineChange: number; + + /**Gets or sets the distance in screen pixels that the vertical scrollbar will scroll when scrolling by a line.*/ + scrollVerticalLineChange: number; + + /**This read-only property returns the read-only collection of selected Parts.*/ + selection: Set<Part>; + + /**Gets or sets whether ChangedEvents are not recorded by the UndoManager.*/ + skipsUndoManager: boolean; + + /**This read-only property returns the ToolManager for this Diagram.*/ + toolManager: ToolManager; + + /**This Adornment is shown when the mouse stays motionless in the background.*/ + toolTip: Adornment; + + /**This read-only property returns the UndoManager for this Diagram, which actually belongs to the .model.*/ + undoManager: UndoManager; + + /**Gets or sets what kinds of graphs this diagram allows the user to draw.*/ + validCycle: EnumValue; + + /**This read-only property returns the bounds of the portion of the Diagram that is viewable from its HTML Canvas.*/ + viewportBounds: Rect; + + /**Gets or sets the point, in viewport coordinates, where changes to the .scale will keep the focus in the document.*/ + zoomPoint: Point; + + /** + * Adds a Part to the Layer that matches the Part's Part.layerName, or else to the default layer, which is named with the empty string. + * @param {Part} part + */ + add(part: Part): void; + + /** + * Register an event handler that is called when there is a ChangedEvent. + * @param {function(ChangedEvent)} listener a function that takes a ChangedEvent as its argument. + */ + addChangedListener(listener: (e: ChangedEvent) => void ): void; + + /** + * Register an event handler that is called when there is a DiagramEvent of a given name. + * @param {string} name the name is normally capitalized, but this method uses case-insensitive comparison. + * @param {function(DiagramEvent)} listener a function that takes a DiagramEvent as its argument. + */ + addDiagramListener(name: string, listener: (e: DiagramEvent) => void ): void; + + /** + * Adds a Layer to the list of layers. + * @param {Layer} layer The Layer to add. + */ + addLayer(layer: Layer): void; + + /** + * Adds a layer to the list of layers after a specified layer. + * @param {Layer} layer The Layer to add. + * @param {Layer} existingLayer The layer to insert after. + */ + addLayerAfter(layer: Layer, existingLayer: Layer): void; + + /** + * Adds a layer to the list of layers before a specified layer. + * @param {Layer} layer The Layer to add. + * @param {Layer} existingLayer The layer to insert before. + */ + addLayerBefore(layer: Layer, existingLayer: Layer): void; + + /** + * Aligns the Diagram's .position based on a desired document Spot and viewport Spot. + * @param {Spot} documentspot + * @param {Spot} viewportspot + */ + alignDocument(documentspot: Spot, viewportspot: Spot): void; + + /** + * Modifies the .position to show a given Rect of the Diagram by centering the viewport on that Rect. + * @param {Rect} r + */ + centerRect(r: Rect): void; + + /** + * Removes all Parts from the Diagram, including unbound Parts and the background grid, and also clears out the Model and UndoManager. + */ + clear(): void; + + /** + * Remove highlights from all Parts. + */ + clearHighlighteds(): void; + + /** + * Deselect all selected Parts. + */ + clearSelection(): void; + + /** + * Commit the changes of the current transaction. + * This just calls UndoManager.commitTransaction. + * @param {string=} tname a descriptive name for the transaction. + */ + commitTransaction(tname?: string): boolean; + + /** + * This is called during a Diagram update to determine a new value for .documentBounds. + */ + computeBounds(): Rect; + + /** + * Find the union of the GraphObject.actualBounds of all of the Parts in the given collection. + * @param {Iterable<Part>} coll a collection of Parts. + */ + computePartsBounds(coll: Iterable<Part>): Rect; + + /** + * Make a copy of a collection of Parts and return them in a Map mapping each original Part to its copy. + * @param {Iterable<Part>} coll A List or a Set or Iterator of Parts. + * @param {Diagram} diagram The destination diagram; if null, the copied parts are not added to this diagram. + * @param {boolean} check Whether to check Part.canCopy on each part. + */ + copyParts(coll: Iterable<Part>, diagram: Diagram, check: boolean): void; + + /** + * Updates the diagram immediately, then resets initialization flags so that actions taken in the argument function will be considered part of Diagram initialization, and will participate in initial layouts, .initialAutoScale, .initialContentAlignment, etc. + * @param {function()|null=} func an optional function of actions to perform as part of another diagram initialization. + */ + delayInitialization(func?: () => void ): void; + + /** + * Finds a layer with a given name. + * @param {string} name + */ + findLayer(name: string): Layer; + + /** + * Look for a Link corresponding to a GraphLinksModel's link data object. + * @param {Object} linkdata + */ + findLinkForData(linkdata: Object): Link; + + /** + * Return a collection of Links that are bound to data whose properties have values + * that match those specified by the given example data. + * @param {...Object} examples + */ + findLinksByExample(...examples: Array<Object>): Iterator<Link>; + + /** + * Look for a Node or Group corresponding to a model's node data object. + * @param {Object} nodedata + */ + findNodeForData(nodedata: Object): Node; + + /** + * Look for a Node or Group corresponding to a model's node data object's unique key. + * @param {*} key a string or number. + */ + findNodeForKey(key: Key): Node; + + /** + * Return a collection of Nodes and Groups that are bound to data whose properties have values + * that match those specified by the given example data. + * @param {...Object} examples + */ + findNodesByExample(...examples: Array<Object>): Iterator<Node>; + + /** + * Find the front-most GraphObject at the given point in document coordinates. + * @param {Point} p A Point in document coordinates. + * @param {function(GraphObject):GraphObject | null=} navig A function taking a GraphObject and + * returning a GraphObject, defaulting to the identity. + * @param {function(GraphObject):boolean | null=} pred A function taking the GraphObject + * returned by navig and returning true if that object should be returned, + * defaulting to a predicate that always returns true. + */ + findObjectAt(p: Point, navig?: (obj: GraphObject) => GraphObject, pred?: (obj: GraphObject) => boolean): GraphObject; + + /** + * Return a collection of the GraphObjects at the given point in document coordinates. + * @param {Point} p A Point in document coordinates. + * @param {function(GraphObject):GraphObject | null=} navig A function taking a GraphObject and + * returning a GraphObject, defaulting to the identity. + * If this function returns null, the given GraphObject will not be included in the results. + * @param {function(GraphObject):boolean | null=} pred A function taking the GraphObject + * returned by navig and returning true if that object should be returned, + * defaulting to a predicate that always returns true. + * @param {List|Set=} coll An optional collection (List or Set) to add the results to. + */ + findObjectsAt(p: Point, navig?: (obj: GraphObject) => GraphObject, pred?: (obj: GraphObject) => boolean, coll?: List<GraphObject>): List<GraphObject>; + findObjectsAt(p: Point, navig?: (obj: GraphObject) => GraphObject, pred?: (obj: GraphObject) => boolean, coll?: Set<GraphObject>): Set<GraphObject>; + + /** + * Returns a collection of all GraphObjects that are inside or that intersect a given Rect in document coordinates. + * @param {Rect} r A Rect in document coordinates. + * @param {function(GraphObject):GraphObject | null=} navig A function taking a GraphObject and + * returning a GraphObject, defaulting to the identity. + * If this function returns null, the given GraphObject will not be included in the results. + * @param {function(GraphObject):boolean | null=} pred A function taking the GraphObject + * returned by navig and returning true if that object should be returned, + * defaulting to a predicate that always returns true. + * @param {boolean=} partialInclusion Whether an object can match if it merely intersects the rectangular area (true) or + * if it must be entirely inside the rectangular area (false). The default value is false. + * @param {List|Set=} coll An optional collection (List or Set) to add the results to. + */ + findObjectsIn(r: Rect, navig?: (obj: GraphObject) => GraphObject, pred?: (obj: GraphObject) => boolean, partialInclusion?: boolean, coll?: List<GraphObject>): List<GraphObject>; + findObjectsIn(r: Rect, navig?: (obj: GraphObject) => GraphObject, pred?: (obj: GraphObject) => boolean, partialInclusion?: boolean, coll?: Set<GraphObject>): Set<GraphObject>; + + /** + * Returns a collection of all GraphObjects that are within a certain distance of a given point in document coordinates. + * @param {Point} p A Point in document coordinates. + * @param {number} dist The distance from the point. + * @param {function(GraphObject):GraphObject | null=} navig A function taking a GraphObject and + * returning a GraphObject, defaulting to the identity. + * If this function returns null, the given GraphObject will not be included in the results. + * @param {function(GraphObject):boolean | null=} pred A function taking the GraphObject + * returned by navig and returning true if that object should be returned, + * defaulting to a predicate that always returns true. + * @param {boolean=} partialInclusion Whether an object can match if it merely intersects the circular area (true) or + * if it must be entirely inside the circular area (false). The default value is true. + * The default is true. + * @param {List|Set=} coll An optional collection (List or Set) to add the results to. + */ + findObjectsNear(p: Point, dist: number, navig?: (obj: GraphObject) => GraphObject, pred?: (obj: GraphObject) => boolean, partialInclusion?: boolean, coll?: List<GraphObject>): List<GraphObject>; + findObjectsNear(p: Point, dist: number, navig?: (obj: GraphObject) => GraphObject, pred?: (obj: GraphObject) => boolean, partialInclusion?: boolean, coll?: Set<GraphObject>): Set<GraphObject>; + + /** + * This convenience function finds the front-most Part that is at a given point and that might be selectable. + * @param {Point} p a Point in document coordinates. + * @param {boolean} selectable Whether to only consider parts that are Part.selectable. + */ + findPartAt(p: Point, selectable: boolean): Part; + + /** + * Look for a Part, Node, Group, or Link corresponding to a Model's data object. + * @param {Object} data + */ + findPartForData(data: Object): Part; + + /** + * Look for a Part or Node or Group corresponding to a model's data object's unique key. + * @param {*} key a string or number. + */ + findPartForKey(key: Key): Part; + + /** + * Returns an iterator of all Groups that are at top-level, in other words that are not themselves inside other Groups. + */ + findTopLevelGroups(): Iterator<Group>; + + /** + * Returns an iterator of all top-level Nodes that have no tree parents. + */ + findTreeRoots(): Iterator<Node>; + + /** + * Explicitly bring focus to the Diagram's canvas. + */ + focus(): void; + + /** + * This static function gets the Diagram that is attached to an HTML DIV element. + * @param {HTMLDivElement} div + */ + static fromDiv(div: HTMLDivElement): Diagram; + + /** + * Make the given part the only highlighted part. + * @param {Part} part + */ + highlight(part: Part): void; + + /** + * Highlight all of the Parts supplied in the given collection, and clear all other highlighted Parts. + * @param {Iterable<Part>|Array<Part>} coll an Iterable of Parts + */ + highlightCollection(coll: Iterable<Part> | Array<Part>): void; + + /** + * This static function declares that a class (constructor function) derives from another class -- but please note that most classes do not support inheritance. + * @param {Function} derivedclass + * @param {Function} baseclass + */ + static inherit(derivedclass: Constructor, baseclass: Constructor): void; + + /** + * Perform all invalid layouts. + * @param {boolean=} invalidateAll If true, this will explicitly set Layout.isValidLayout to false on each Layout in the diagram. + */ + layoutDiagram(invalidateAll?: boolean): void; + + /** + * Create an HTMLImageElement that contains a bitmap of the current Diagram. + * @param {Object=} properties For details see the argument description of .makeImageData. + */ + makeImage(properties?: Object): HTMLImageElement; + + /** + * Create a bitmap of the current Diagram encoded as a base64 string. + * @param {{ size: Size, + scale: number, + maxSize: Size, + position: Point, + parts: Iterable<Part>, + padding: (Margin|number), + showTemporary: boolean, + showGrid: boolean, + document: Document, + type: string, + details: * + }=} properties a JavaScript object detailing optional arguments for image creation, to be passed to makeImageData. + */ + makeImageData(properties?: Object): string; + + /** + * Create an SVGElement that contains a SVG rendering of the current Diagram. + * By default this method returns a snapshot of the visible diagram, but optional arguments give more options. + * @param {{ size: Size, + scale: number, + maxSize: Size, + position: Point, + parts: Iterable<Part>, + padding: (Margin|number), + showTemporary: boolean, + showGrid: boolean, + document: Document, + elementFinished: function(GraphObject, SVGElement), + details: * + }=} properties a JavaScript object detailing optional arguments for SVG creation. + * @return {SVGElement} + */ + makeSvg(properties?: Object): SVGElement; + + /** + * Move a collection of Parts in this Diagram by a given offset. + * @param {Iterable<Part>} coll A List or a Set or Iterator of Parts. + * @param {Point} offset the X and Y change to be made to each Part, in document coordinates. + * @param {boolean} check Whether to check Part.canMove on each part. + */ + moveParts(coll: Iterable<Part>, offset: Point, check: boolean): void; + + /** + * Remove all of the Parts created from model data and then create them again. + */ + rebuildParts(): void; + + /** + * Removes a Part from its Layer, provided the Layer is in this Diagram. + * @param {Part} part + */ + remove(part: Part): void; + + /** + * Unregister an event handler listener. + * @param {function(ChangedEvent)} listener a function that takes a ChangedEvent as its argument. + */ + removeChangedListener(listener: (e: ChangedEvent) => void ): void; + + /** + * Unregister a DiagramEvent handler. + * @param {string} name the name is normally capitalized, but this method uses case-insensitive comparison. + * @param {function(DiagramEvent)} listener a function that takes a DiagramEvent as its argument. + */ + removeDiagramListener(name: string, listener: (e: DiagramEvent) => void ): void; + + /** + * Removes the given layer from the list of layers. + * @param {Layer} layer + */ + removeLayer(layer: Layer): void; + + /** + * This method removes from this Diagram all of the Parts in a collection. + * @param {Iterable<Part>|Array<Part>} coll A List or Set or Iterator of Parts. + * @param {boolean} check Whether to check Part.canDelete on each part. + */ + removeParts(coll: Iterable<Part> | Array<Part>, check: boolean): void; + + /** + * Rollback the current transaction, undoing any recorded changes. + * This just calls UndoManager.rollbackTransaction. + */ + rollbackTransaction(): boolean; + + /** + * Scrolling function used by primarily by .commandHandler's CommandHandler.doKeyDown. + * @param {string} unit A string representing the unit of the scroll operation. Can be 'pixel', 'line', or 'page'. + * @param {string} dir The direction of the scroll operation. Can be 'up', 'down', 'left', or 'right'. + * @param {number=} dist An optional distance multiplier, for multiple pixels, lines, or pages. Default is 1. + */ + scroll(unit: string, dir: string, dist?: number): void; + + /** + * Modifies the .position to show a given Rect of the Diagram by centering the viewport on that Rect. + * @param {Rect} r + */ + scrollToRect(r: Rect): void; + + /** + * Make the given object the only selected object. + * @param {GraphObject} part a GraphObject that is already in a layer of this Diagram. + * If the value is null, this does nothing. + */ + select(part: Part): void; + + /** + * Select all of the Parts supplied in the given collection. + * @param {Iterable<Part>|Array<Part>} coll a List or Set of Parts to be selected. + */ + selectCollection(coll: Iterable<Part> | Array<Part>): void; + + /** + * This method sets a collection of properties according to the property/value pairs that have been set on the given Object, + * in the same manner as GraphObject.make does when constructing a Diagram with an argument that is a simple JavaScript Object. + */ + setProperties(props: Object): void; + + /** + * Begin a transaction, where the changes are held by a Transaction object in the UndoManager. + * This just calls UndoManager.startTransaction. + * @param {string=} tname a descriptive name for the transaction. + */ + startTransaction(tname?: string): boolean; + + /** + * Given a Point in document coordinates, return a new Point in viewport coordinates. + * @param {Point} p + */ + transformDocToView(p: Point): Point; + + /** + * Given a point in viewport coordinates, return a new point in document coordinates. + * @param {Point} p + */ + transformViewToDoc(p: Point): Point; + + /** + * Update all of the data-bound properties of Nodes and Links in this diagram. + */ + updateAllTargetBindings(): void; + + /** + * Update all of the references to nodes in case they had been modified in the model without + * properly notifying the model by calling GraphLinksModel.setGroupKeyForNodeData or + * GraphLinksModel.setToKeyForLinkData or other similar methods. + */ + updateAllRelationshipsFromData(): void; + + /** + * Scales the Diagram to uniformly fit into the viewport. + */ + zoomToFit(): void; + + /** + * Modifies the .scale and .position of the Diagram so that the viewport displays a given document-coordinates rectangle. + * @param {Rect} r rectangular bounds in document coordinates. + * @param {EnumValue=} scaling an optional value of either .Uniform (the default) or .UniformToFill. + */ + zoomToRect(r: Rect, scaling?: EnumValue): void; + + /**This value for Diagram.validCycle states that there are no restrictions on making cycles of links.*/ + static CycleAll: EnumValue; + + /**This value for Diagram.validCycle states that any number of destination links may go out of a node, but at most one source link may come into a node, and there are no directed cycles.*/ + static CycleDestinationTree: EnumValue; + + /**This value for Diagram.validCycle states that a valid link from a node will not produce a directed cycle in the graph.*/ + static CycleNotDirected: EnumValue; + + /**This value for Diagram.validCycle states that a valid link from a node will not produce an undirected cycle in the graph.*/ + static CycleNotUndirected: EnumValue; + + /**This value for Diagram.validCycle states that any number of source links may come into a node, but at most one destination link may go out of a node, and there are no directed cycles.*/ + static CycleSourceTree: EnumValue; + + /**The default autoScale type, used as the value of Diagram.autoScale: The Diagram does not attempt to scale its bounds to fit the view.*/ + static None: EnumValue; + + /**Diagrams with this autoScale type, used as the value of Diagram.autoScale, are scaled uniformly until the documentBounds fits in the view.*/ + static Uniform: EnumValue; + + /**Diagrams with this autoScale type, used as the value of Diagram.autoScale, are scaled uniformly until the documentBounds fits in the view.*/ + static UniformToFill: EnumValue; + + /**This value for Diagram.scrollMode states that the viewport constrains scrolling to the Diagram document bounds.*/ + static DocumentScroll: EnumValue; + + /**This value for Diagram.scrollMode states that the viewport does not constrain scrolling to the Diagram document bounds.*/ + static InfiniteScroll: EnumValue; + + getRenderingHint(name: string): any; // undocumented + setRenderingHint(name: string, val: any): void; // undocumented + getInputOption(name: string): any; // undocumented + setInputOption(name: string, val: any): void; // undocumented + maybeUpdate(): void; // undocumented + requestUpdate(): void; // undocumented + reset(): void; // undocumented + simulatedMouseMove(e: Event, modelpt: Point, overdiag?: Diagram): boolean; // undocumented + simulatedMouseUp(e: Event, other: Diagram, modelpt: Point, curdiag?: Diagram): boolean; // undocumented + } + + /** + * A DiagramEvent represents a more abstract event than an InputEvent. + * They are raised on the Diagram class. + * One can receive such events by registering a DiagramEvent listener on a Diagram + * by calling Diagram.addDiagramListener. + * Some DiagramEvents such as "ObjectSingleClicked" are normally + * associated with InputEvents. + * Some DiagramEvents such as "SelectionMoved" or "PartRotated" are associated with the + * results of Tool-handled gestures or CommandHandler actions. + * Some DiagramEvents are not necessarily associated with any input events at all, + * such as "ViewportBoundsChanged", which can happen due to programmatic + * changes to the Diagram.position and Diagram.scale properties. + */ + class DiagramEvent { + /** + * The DiagramEvent class constructor produces an empty DiagramEvent. + */ + constructor(); + + /**Gets or sets whether any default actions associated with this diagram event should be avoided or cancelled.*/ + cancel: boolean; + + /**This read-only property returns the diagram associated with the event.*/ + diagram: Diagram; + + /**Gets or sets the name of the kind of diagram event that this represents.*/ + name: string; + + /**Gets or sets an optional object that describes the change to the subject of the diagram event.*/ + parameter: any; + + /**Gets or sets an optional object that is the subject of the diagram event.*/ + subject: any; + } + + /** + * This is the abstract base class for all graphical objects. + */ + class GraphObject { + /** + * This is an abstract class, so you should not use this constructor. + */ + constructor(); + + /**Gets or sets the function to execute when the ActionTool is cancelled and this GraphObject's .isActionable is set to true.*/ + actionCancel: (e: InputEvent, obj: GraphObject) => void; + + /**Gets or sets the function to execute on a mouse-down event when this GraphObject's .isActionable is set to true.*/ + actionDown: (e: InputEvent, obj: GraphObject) => void; + + /**Gets or sets the function to execute on a mouse-move event when this GraphObject's .isActionable is set to true.*/ + actionMove: (e: InputEvent, obj: GraphObject) => void; + + /**Gets or sets the function to execute on a mouse-up event when this GraphObject's .isActionable is set to true.*/ + actionUp: (e: InputEvent, obj: GraphObject) => void; + + /**This read-only property returns the bounds of this GraphObject in container coordinates.*/ + actualBounds: Rect; + + /**Gets or sets the alignment Spot of this GraphObject used in Panel layouts, to determine where in the area allocated by the panel this object should be placed.*/ + alignment: Spot; + + /**Gets or sets the spot on this GraphObject to be used as the alignment point in Spot and Fixed Panels.*/ + alignmentFocus: Spot; + + /**Gets or sets the angle transform, in degrees, of this GraphObject.*/ + angle: number; + + /**Gets or sets the areaBackground Brush (or CSS color string) of this GraphObject.*/ + areaBackground: BrushLike; + + /**Gets or sets the background Brush (or CSS color string) of this GraphObject, filling the rectangle of this object's local coordinate space.*/ + background: BrushLike; + + /**Gets or sets the function to execute when the user single-primary-clicks on this object.*/ + click: (e: InputEvent, obj: GraphObject) => void; + + /**Gets or sets the column of this GraphObject if it is in a Table Panel.*/ + column: number; + + /**Gets or sets the number of columns spanned by this GraphObject if it is in a Table Panel.*/ + columnSpan: number; + + /**Gets or sets the function to execute when the user single-secondary-clicks on this object.*/ + contextClick: (e: InputEvent, obj: GraphObject) => void; + + /**This Adornment is shown upon a context click on this object.*/ + contextMenu: Adornment; + + /**Gets or sets the mouse cursor to use when the mouse is over this object with no mouse buttons pressed.*/ + cursor: string; + + /**Gets or sets the desired size of this GraphObject in local coordinates.*/ + desiredSize: Size; + + /**This read-only property returns the Diagram that this GraphObject is in, if it is.*/ + diagram: Diagram; + + /**Gets or sets the function to execute when the user double-primary-clicks on this object.*/ + doubleClick: (e: InputEvent, obj: GraphObject) => void; + + /**Gets or sets how the direction of the last segment of a link coming from this port is computed when the node is rotated.*/ + fromEndSegmentDirection: EnumValue; + + /**Gets or sets the length of the last segment of a link coming from this port.*/ + fromEndSegmentLength: number; + + /**Gets or sets whether the user may draw Links from this port. The value must be either a boolean or null.*/ + fromLinkable: boolean; + + /**Gets or sets whether the user may draw duplicate Links from this port.*/ + fromLinkableDuplicates: boolean; + + /**Gets or sets whether the user may draw Links that connect from this port's Node.*/ + fromLinkableSelfNode: boolean; + + /**Gets or sets the maximum number of links that may come out of this port.*/ + fromMaxLinks: number; + + /**Gets or sets how far the end segment of a link coming from this port stops short of the actual port.*/ + fromShortLength: number; + + /**Gets or sets where a link should connect from this port.*/ + fromSpot: Spot; + + /**Gets or sets the desired height of this GraphObject in local coordinates.*/ + height: number; + + /**This property determines whether or not this GraphObject's events occur before all other events, including selection.*/ + isActionable: boolean; + + /**Gets or sets whether a GraphObject is the "main" object for some types of Panel.*/ + isPanelMain: boolean; + + /**This read-only property returns the GraphObject's containing Layer, if there is any.*/ + layer: Layer; + + /**Gets or sets the size of empty area around this GraphObject, as a Margin (or number for a uniform Margin), in the containing Panel coordinates.*/ + margin: MarginLike; + + /**Gets or sets the maximum size of this GraphObject in container coordinates (either a Panel or the document).*/ + maxSize: Size; + + /**This read-only property returns the measuredBounds of the GraphObject in container coordinates (either a Panel or the document).*/ + measuredBounds: Rect; + + /**Gets or sets the minimum size of this GraphObject in container coordinates (either a Panel or the document).*/ + minSize: Size; + + /**Gets or sets the function to execute when the user moves the mouse into this stationary object during a DraggingTool drag.*/ + mouseDragEnter: (e: InputEvent, obj: GraphObject, prev: GraphObject) => void; + + /**Gets or sets the function to execute when the user moves the mouse out of this stationary object during a DraggingTool drag.*/ + mouseDragLeave: (e: InputEvent, obj: GraphObject, prev: GraphObject) => void; + + /**Gets or sets the function to execute when a user drops the selection on this object at the end of a DraggingTool drag.*/ + mouseDrop: (e: InputEvent, obj: GraphObject) => void; + + /**Gets or sets the function to execute when the user moves the mouse into this object without holding down any buttons.*/ + mouseEnter: (e: InputEvent, obj: GraphObject, prev: GraphObject) => void; + + /**Gets or sets the function to execute when the user holds the mouse stationary in the background of the diagram while holding down a button over this object.*/ + mouseHold: (e: InputEvent, obj: GraphObject) => void; + + /**Gets or sets the function to execute when the user holds the mouse stationary in the background of the diagram without holding down any buttons over this object.*/ + mouseHover: (e: InputEvent, obj: GraphObject) => void; + + /**Gets or sets the function to execute when the user moves the mouse into this object without holding down any buttons.*/ + mouseLeave: (e: InputEvent, obj: GraphObject, prev: GraphObject) => void; + + /**Gets or sets the function to execute when the user moves the mouse over this object without holding down any buttons.*/ + mouseOver: (e: InputEvent, obj: GraphObject) => void; + + /**Gets or sets the name for this object.*/ + name: string; + + /**This read-only property returns the natural bounding rectangle of this GraphObject in local coordinates, before any transformation by .scale or .angle, and before any resizing due to .minSize or .maxSize or .stretch.*/ + naturalBounds: Rect; + + /**Gets or sets the multiplicative opacity for this GraphObject and (if a Panel) all nested elements.*/ + opacity: number; + + /**This read-only property returns the GraphObject's containing Panel, or null if this object is not in a Panel.*/ + panel: Panel; + + /**This read-only property returns the Part containing this object, if any.*/ + part: Part; + + /**Gets or sets whether or not this GraphObject can be chosen by visual "find" methods such as Diagram.findObjectAt.*/ + pickable: boolean; + + /**Gets or sets an identifier for an object acting as a port on a Node.*/ + portId: string; + + /**Gets or sets the position of this GraphObject in container coordinates (either a Panel or the document).*/ + position: Point; + + /**Gets or sets the row of this GraphObject if it is in a Table Panel.*/ + row: number; + + /**Gets or sets the number of rows spanned by this GraphObject if it is in a Table Panel.*/ + rowSpan: number; + + /**Gets or sets the scale transform of this GraphObject.*/ + scale: number; + + /**Gets or sets the fractional distance along a segment of a GraphObject that is in a Link.*/ + segmentFraction: number; + + /**Gets or sets the segment index of a GraphObject that is in a Link.*/ + segmentIndex: number; + + /**Gets or sets the offset of a GraphObject that is in a Link from a point on a segment.*/ + segmentOffset: Point; + + /**Gets or sets the orientation of a GraphObject that is in a Link.*/ + segmentOrientation: EnumValue; + + /**Gets or sets the stretch of the GraphObject.*/ + stretch: EnumValue; + + /**Gets or sets how the direction of the last segment of a link going to this port is computed when the node is rotated.*/ + toEndSegmentDirection: EnumValue; + + /**Gets or sets the length of the last segment of a link going to this port.*/ + toEndSegmentLength: number; + + /**Gets or sets whether the user may draw Links to this port. The value must be either a boolean or null.*/ + toLinkable: boolean; + + /**Gets or sets whether the user may draw duplicate Links to this port.*/ + toLinkableDuplicates: boolean; + + /**Gets or sets whether the user may draw Links that connect to this port's Node.*/ + toLinkableSelfNode: boolean; + + /**Gets or sets the maximum number of links that may go into this port.*/ + toMaxLinks: number; + + /**This Adornment is shown when the mouse hovers over this object.*/ + toolTip: Adornment; + + /**Gets or sets how far the end segment of a link going to this port stops short of the actual port.*/ + toShortLength: number; + + /**Gets or sets where a link should connect to this port.*/ + toSpot: Spot; + + /**Gets or sets whether a GraphObject is visible.*/ + visible: boolean; + + /**Gets or sets the desired width of this GraphObject in local coordinates.*/ + width: number; + + /** + * Add a data-binding of a property on this GraphObject to a property on a data object. + * @param {Binding} binding + */ + bind(binding: Binding): void; + + /** + * Creates a deep copy of this GraphObject and returns it. + */ + copy(): GraphObject; + + /** + * This static function defines a named function that GraphObject.make can use to build objects. + * @param {string} name a capitalized name; must not be "" or "None" + * @param {function(Array<*>):Object} func + */ + static defineBuilder(name: string, func: (args: Array<any>) => Object): void; + + /** + * This static function returns the first argument from the arguments array passed + * to a {@link GraphObject.defineBuilder} function by {@link GraphObject.make}. + * By default this requires the first argument to be a string, + * but you can provide a predicate to determine whether the argument is suitable. + * @param {Array} args + * @param {*=} defval the default value to return if the argument is optional and not present as the first argument + * @param {function(*):boolean|null=} pred a predicate to determine the acceptability of the argument; + * the default predicate checks whether the argument is a string + * @return {*} + */ + static takeBuilderArgument(args: Array<any>, defval?: any, pred?: (any) => boolean): any; + + /** + * Returns the effective angle that the object is drawn at, in document coordinates. + */ + getDocumentAngle(): number; + + /** + * Returns the Point in document coordinates for a given Spot in this object's bounds. + * @param {Spot} s a real Spot describing a location relative to the GraphObject. + * @param {Point=} result an optional Point that is modified and returned. + */ + getDocumentPoint(s: Spot, result?: Point): Point; + + /** + * Returns the total scale that the object is drawn at, in document coordinates. + */ + getDocumentScale(): number; + + /** + * Given a Point in document coordinates, returns a new Point in local coordinates. + * @param {Point} p a Point in document coordinates. + * @param {Point=} result an optional Point that is modified and returned. + */ + getLocalPoint(p: Point, result?: Point): Point; + + /** + * This predicate is true if this object is an element, perhaps indirectly, of the given panel. + * @param {GraphObject} panel + * or if it is contained by another panel that is contained by the given panel, + * to any depth; false if the argument is null or is not a Panel. + */ + isContainedBy(panel: GraphObject): boolean; + + /** + * This predicate is true if this object is .visible and each of its visual containing panels are also visible. + */ + isVisibleObject(): boolean; + + /** + * This method sets a collection of properties according to the property/value pairs that have been set on the given Object, + * in the same manner as GraphObject.make does when constructing a GraphObject with an argument that is a simple JavaScript Object. + */ + setProperties(props: Object): void; + + /** + * This static function builds an object given its class and additional arguments providing initial properties or GraphObjects that become Panel elements. + * @param {function()|string} type a class function or the name of a class in the "go" namespace, + * or one of several predefined kinds of Panels: "Button", "TreeExpanderButton", + * "SubGraphExpanderButton", or "ContextMenuButton". + * @param {...*} initializers zero or more values that initialize the new object, + * typically an Object with properties whose values that get set on the new object, + * or a GraphObject that is added to a Panel, + * or a Binding for one of the new object's properties, + * or an EnumValue as the initial value of a single property of the new object that + * is recognized to take that value, + * or a string that is used as the value of a commonly set property. + */ + static make(type: Constructor | string, ...initializers: Array<any>): any; + + /**GraphObjects with this as the value of GraphObject.stretch are stretched depending on the context they are used.*/ + static Default: EnumValue; + + /**GraphObjects with this as the value of GraphObject.stretch are scaled in both directions so as to fit exactly in the given bounds; there is no clipping but the aspect ratio may change, causing the object to appear stretched.*/ + static Fill: EnumValue; + + /**GraphObjects with this as the value of GraphObject.stretch are scaled as much as possible in the x-axis*/ + static Horizontal: EnumValue; + + /**GraphObjects with this as the value of GraphObject.stretch are not automatically scaled to fit in the given bounds; there may be clipping in one or both directions.*/ + static None: EnumValue; + + /**Pictures with this as the value of Picture.imageStretch are drawn with equal scale in both directions to fit the arranged (actual) bounds.*/ + static Uniform: EnumValue; + + /**Pictures with this as the value of Picture.imageStretch are drawn with equal scale in both directions to fit the larger side of the image bounds.*/ + static UniformToFill: EnumValue; + + /**GraphObjects with this as the value of GraphObject.stretch are scaled as much as possible in the y-axis*/ + static Vertical: EnumValue; + + protected cloneProtected(copy: GraphObject): void; // undocumented + static fromSvg(svg: string): GraphObject; // undocumented + static fromSvg(svg: Document): GraphObject; // undocumented + static getBuilders(): Map<string,(args: Array<any>) => Object>; // undocumented + } + + /** + * This simple layout places all of the Parts in a grid-like arrangement, ordered, spaced apart, + * and wrapping as needed. It ignores any Links connecting the Nodes being laid out. + */ + class Group extends Node { + /** + * Constructs an empty Group with no visual elements and no member parts; normally a Group will have some visual elements surrounding a Placeholder. + * @param {EnumValue=} type if not supplied, the default Panel type is Panel.Position. + */ + constructor(type?: EnumValue); + + /**Gets or sets whether the size of the area of the Group's .placeholder should remain the same during a DraggingTool move until a drop occurs. The default value is false.*/ + computesBoundsAfterDrag: boolean; + + /**Gets or sets whether the bounds of a Group's Placeholder includes the bounds of member Links. The default value is true.*/ + computesBoundsIncludingLinks: boolean; + + /**Gets or sets whether the bounds of a Group's Placeholder includes the previous Group.location. The default value is false.*/ + computesBoundsIncludingLocation: boolean; + + /**Gets or sets whether drag-and-drop events may be bubbled up to this Group if not handled by member Parts.*/ + handlesDragDropForMembers: boolean; + + /**Gets or sets whether the subgraph contained by this group is expanded. The default value is true.*/ + isSubGraphExpanded: boolean; + + /**Gets or sets the Layout used to position all of the immediate member nodes and links in this group.*/ + layout: Layout; + + /**Gets or sets the function that is called after a member Part has been added to this Group.*/ + memberAdded: (a: Group, b: Part) => void; + + /**This read-only property returns an iterator over the member Parts of this Group.*/ + memberParts: Iterator<Part>; + + /**Gets or sets the function that is called after a member Part has been removed from this Group.*/ + memberRemoved: (a: Group, b: Part) => void; + + /**Gets or sets the predicate that determines whether or not a Part may become a member of this group.*/ + memberValidation: (a: Group, b: Part) => boolean; + + /**This read-only property returns a Placeholder that this group may contain in its visual tree.*/ + placeholder: Placeholder; + + /**Gets or sets the function that is called when .isSubGraphExpanded has changed value.*/ + subGraphExpandedChanged: (a: Group) => void; + + /**Gets or sets whether the user may ungroup this group.*/ + ungroupable: boolean; + + /**Gets or sets whether the subgraph starting at this group had been collapsed by a call to .expandSubGraph on the containing Group.*/ + wasSubGraphExpanded: boolean; + + /** + * Add the Parts in the given collection as members of this Group for those Parts for which CommandHandler.isValidMember returns true. + * @param {Iterable<Part>} coll + * @param {boolean=} check whether to call CommandHandler.isValidMember to confirm that it is valid to add the Part to be a member of this Group. + */ + addMembers(coll: Iterable<Part>, check?: boolean): boolean; + + /** + * See if the given collection of Parts contains non-Links all for which CommandHandler.isValidMember returns true. + * @param {Iterable<Part>} coll + */ + canAddMembers(coll: Iterable<Part>): boolean; + + /** + * This predicate returns true if .ungroupable is true, if the layer's Layer.allowUngroup is true, and if the diagram's Diagram.allowUngroup is true. + */ + canUngroup(): boolean; + + /** + * Hide each of the member nodes and links of this group, and recursively collapse any member groups. + */ + collapseSubGraph(): void; + + /** + * Show each member node and link, and perhaps recursively expand nested subgraphs. + */ + expandSubGraph(): void; + + /** + * Returns an iterator over all of the Links that connect with this group or any node contained by this group, + * in either direction, but that are not internal to this group. + */ + findExternalLinksConnected(): Iterator<Link>; + + /** + * Returns an iterator over all of the Nodes that are connected with this group or any node contained by this group, + * by a link in either direction, but that are not internal to this group. + */ + findExternalNodesConnected(): Iterator<Node>; + + /** + * Return a collection of Parts that are all of the nodes and links that are members of this group, including inside nested groups, but excluding this group itself. + */ + findSubGraphParts(): Set<Part>; + + /** + * Move this Group and all of its member parts, recursively. + * @param {Point} newpos a new Point in document coordinates. + */ + move(newpos: Point): void; + } + + /** + * An InputEvent represents a mouse or keyboard event. + * The principal properties hold information about a particular input event. + * These properties include the .documentPoint at which a mouse event + * occurred in document coordinates, + * the corresponding point in view/element coordinates, .viewPoint, + * the .key for keyboard events, + * and the .modifiers and .button at the time. + * Additional descriptive properties include .clickCount, .delta, + * .timestamp, and the source event .event (if available). + */ + class InputEvent { + /** + * The InputEvent class constructor produces an empty InputEvent. + */ + constructor(); + + /**Gets or sets whether the alt key is being held down.*/ + alt: boolean; + + /**Gets or sets whether the underlying .event is prevented from bubbling up the hierarchy of HTML elements outside of the Diagram and whether any default action is canceled.*/ + bubbles: boolean; + + /**Gets or sets the button that caused this event.*/ + button: number; + + /**Gets or sets whether this event represents a click or a double-click.*/ + clickCount: number; + + /**Gets or sets whether the control key is being held down.*/ + control: boolean; + + /**Gets or sets the amount of change associated with a mouse-wheel rotation.*/ + delta: number; + + /**This read-only property returns the source diagram associated with the event.*/ + diagram: Diagram; + + /**Gets or sets the point at which this input event occurred, in document coordinates.*/ + documentPoint: Point; + + /**Gets or sets whether the InputEvent represents a mouse-down or a key-down event.*/ + down: boolean; + + /**Gets or sets the platform's user-agent-supplied event for this event.*/ + event: Event; + + /**Gets or sets whether an InputEvent that applies to a GraphObject and bubbles up the chain of containing Panels is stopped from continuing up the chain.*/ + handled: boolean; + + /**This property is true when the InputEvent is caused by a touch event that registered more than one touch.*/ + isMultiTouch: boolean; + + /**This read-only property is true when the InputEvent is caused by a touch event.*/ + isTouchEvent: boolean; + + /**Gets or sets the key pressed or released as this event.*/ + key: string; + + /**Gets or sets whether the logical left mouse button is being held down.*/ + left: boolean; + + /**Gets or sets whether the meta key is being held down.*/ + meta: boolean; + + /**Gets or sets whether the logical middle mouse button is being held down.*/ + middle: boolean; + + /**Gets or sets the modifier keys that were used with the mouse or keyboard event.*/ + modifiers: number; + + /**Gets or sets whether the logical right mouse button is being held down.*/ + right: boolean; + + /**Gets or sets whether the shift key is being held down.*/ + shift: boolean; + + /**Gets or sets the diagram associated with the canvas that the event is currently targeting.*/ + targetDiagram: Diagram; + + /**Gets or sets the GraphObject that is at the current mouse point, if any.*/ + targetObject: GraphObject; + + /**Gets or sets the time at which the event occurred, in milliseconds.*/ + timestamp: number; + + /**Gets or sets whether the InputEvent represents a mouse-up or a key-up event.*/ + up: boolean; + + /**Gets or sets the point at which this input event occurred.*/ + viewPoint: Point; + + /** + * Make a copy of this InputEvent. + */ + copy(): InputEvent; + } + + /** + * Layers are how named collections of Parts are drawn in front or behind other collections of Parts in a Diagram. + * Layers can only contain Parts -- they cannot hold GraphObjects directly. + */ + class Layer { + /** + * This constructs an empty Layer; you should set the .name before adding the Layer to a Diagram. + */ + constructor(); + + /**Gets or sets whether the user may copy objects in this layer.*/ + allowCopy: boolean; + + /**Gets or sets whether the user may delete objects in this layer.*/ + allowDelete: boolean; + + /**Gets or sets whether the user may group parts together in this layer.*/ + allowGroup: boolean; + + /**Gets or sets whether the user may draw new links in this layer.*/ + allowLink: boolean; + + /**Gets or sets whether the user may move objects in this layer.*/ + allowMove: boolean; + + /**Gets or sets whether the user may reconnect existing links in this layer.*/ + allowRelink: boolean; + + /**Gets or sets whether the user may reshape parts in this layer.*/ + allowReshape: boolean; + + /**Gets or sets whether the user may resize parts in this layer.*/ + allowResize: boolean; + + /**Gets or sets whether the user may rotate parts in this layer.*/ + allowRotate: boolean; + + /**Gets or sets whether the user may select objects in this layer.*/ + allowSelect: boolean; + + /**Gets or sets whether the user may do in-place text editing in this layer.*/ + allowTextEdit: boolean; + + /**Gets or sets whether the user may ungroup existing groups in this layer.*/ + allowUngroup: boolean; + + /**This read-only property returns the Diagram that is using this Layer.*/ + diagram: Diagram; + + /**Gets or sets whether the objects in this layer are considered temporary.*/ + isTemporary: boolean; + + /**Gets or sets the name for this layer.*/ + name: string; + + /**Gets or sets the opacity for all parts in this layer.*/ + opacity: number; + + /**This read-only property returns an iterator for this Layer's Parts.*/ + parts: Iterator<Part>; + + /**This read-only property returns a backwards iterator for this Layer's Parts, for iterating over the parts in reverse order.*/ + partsBackwards: Iterator<Part>; + + /**Gets or sets whether methods such as .findObjectAt find any of the objects in this layer.*/ + pickable: boolean; + + /**Gets or sets whether the user may view any of the objects in this layer.*/ + visible: boolean; + + /** + * Find the front-most GraphObject in this layer at the given point in document coordinates. + * @param {Point} p A Point in document coordinates. + * @param {function(GraphObject):GraphObject | null=} navig A function taking a GraphObject and + * returning a GraphObject, defaulting to the identity. + * @param {function(GraphObject):boolean | null=} pred A function taking the GraphObject + * returned by navig and returning true if that object should be returned, + * defaulting to a predicate that always returns true. + */ + findObjectAt(p: Point, navig?: (obj: GraphObject) => GraphObject, pred?: (obj: GraphObject) => boolean): GraphObject; + + /** + * Return a collection of the GraphObjects of this layer at the given point in document coordinates. + * @param {Point} p A Point in document coordinates. + * @param {function(GraphObject):GraphObject | null=} navig A function taking a GraphObject and + * returning a GraphObject, defaulting to the identity. + * If this function returns null, the given GraphObject will not be included in the results. + * @param {function(GraphObject):boolean | null=} pred A function taking the GraphObject + * returned by navig and returning true if that object should be returned, + * defaulting to a predicate that always returns true. + * @param {List|Set=} coll An optional collection (List or Set) to add the results to. + */ + findObjectsAt(p: Point, navig?: (obj: GraphObject) => GraphObject, pred?: (obj: GraphObject) => boolean, coll?: List<GraphObject>): List<GraphObject>; + findObjectsAt(p: Point, navig?: (obj: GraphObject) => GraphObject, pred?: (obj: GraphObject) => boolean, coll?: Set<GraphObject>): Set<GraphObject>; + + /** + * Returns a collection of all GraphObjects that are inside or that intersect a given Rect in document coordinates. + * @param {Rect} r A Rect in document coordinates. + * @param {function(GraphObject):GraphObject | null=} navig A function taking a GraphObject and + * returning a GraphObject, defaulting to the identity. + * If this function returns null, the given GraphObject will not be included in the results. + * @param {function(GraphObject):boolean | null=} pred A function taking the GraphObject + * returned by navig and returning true if that object should be returned, + * defaulting to a predicate that always returns true. + * @param {boolean=} partialInclusion Whether an object can match if it merely intersects the rectangular area (true) or + * if it must be entirely inside the rectangular area (false). The default value is false. + * @param {List|Set=} coll An optional collection (List or Set) to add the results to. + */ + findObjectsIn(r: Rect, navig?: (obj: GraphObject) => GraphObject, pred?: (obj: GraphObject) => boolean, partialInclusion?: boolean, coll?: List<GraphObject>): List<GraphObject>; + findObjectsIn(r: Rect, navig?: (obj: GraphObject) => GraphObject, pred?: (obj: GraphObject) => boolean, partialInclusion?: boolean, coll?: Set<GraphObject>): Set<GraphObject>; + + /** + * Returns a collection of all GraphObjects that are within a certain distance of a given point in document coordinates. + * @param {Point} p A Point in document coordinates. + * @param {number} dist The distance from the point. + * @param {function(GraphObject):GraphObject | null=} navig A function taking a GraphObject and + * returning a GraphObject, defaulting to the identity. + * If this function returns null, the given GraphObject will not be included in the results. + * @param {function(GraphObject):boolean | null=} pred A function taking the GraphObject + * returned by navig and returning true if that object should be returned, + * defaulting to a predicate that always returns true. + * @param {boolean=} partialInclusion Whether an object can match if it merely intersects the circular area (true) or + * if it must be entirely inside the circular area (false). The default value is true. + * @param {List|Set=} coll An optional collection (List or Set) to add the results to. + */ + findObjectsNear(p: Point, dist: number, navig?: (obj: GraphObject) => GraphObject, pred?: (obj: GraphObject) => boolean, partialInclusion?: boolean, coll?: List<GraphObject>): List<GraphObject>; + findObjectsNear(p: Point, dist: number, navig?: (obj: GraphObject) => GraphObject, pred?: (obj: GraphObject) => boolean, partialInclusion?: boolean, coll?: Set<GraphObject>): Set<GraphObject>; + } + + /** + * A Link is a Part that connects Nodes. + * The link relationship is directional, going from Link.fromNode to Link.toNode. + * A link can connect to a specific port element in a node, as named by the Link.fromPortId + * and Link.toPortId properties. + */ + class Link extends Part { + /** + * Constructs an empty link that does not connect any nodes. + */ + constructor(); + + /**Gets or sets how the route is computed, including whether it uses the points of its old route to determine the new route.*/ + adjusting: EnumValue; + + /**Gets or sets how rounded the corners are for adjacent line segments when the .curve is .None .JumpGap, or .JumpOver and the two line segments are orthogonal to each other.*/ + corner: number; + + /**Gets or sets the way the path is generated from the route's points.*/ + curve: EnumValue; + + /**Gets or sets how far the control points are offset when the .curve is .Bezier or when there are multiple links between the same two ports.*/ + curviness: number; + + /**Gets or sets how the direction of the last segment is computed when the node is rotated.*/ + fromEndSegmentDirection: EnumValue; + + /**Gets or sets the length of the last segment.*/ + fromEndSegmentLength: number; + + /**Gets or sets the Node that this link comes from.*/ + fromNode: Node; + + /**This read-only property returns a GraphObject that is the "from" port that this link is connected from.*/ + fromPort: GraphObject; + + /**Gets or sets the function that is called after this Link changes which Node or port it connects from.*/ + fromPortChanged: (a: Link, b: GraphObject, c: GraphObject) => void; + + /**Gets or sets the identifier of the port that this link comes from.*/ + fromPortId: string; + + /**Gets or sets how far the end segment stops short of the actual port.*/ + fromShortLength: number; + + /**Gets or sets where this link should connect at the .fromPort.*/ + fromSpot: Spot; + + /**This read-only property returns the Geometry that is used by the .path, the link Shape based on the route points.*/ + geometry: Geometry; + + /**This read-only property is true when this Link has any label Nodes, Nodes that are owned by this Link and are arranged along its path.*/ + isLabeledLink: boolean; + + /**This read-only property true if .routing is a value that implies that the points of the route should be orthogonal, such that each point shares a common X or a common Y value with the immediately previous and next points.*/ + isOrthogonal: boolean; + + /**Gets or sets whether this Link is part of the tree for tree operations such as Node.findTreeChildrenNodes or Node.collapseTree.*/ + isTreeLink: boolean; + + /**This read-only property returns an iterator over the Nodes that act as labels on this Link.*/ + labelNodes: Iterator<Node>; + + /**This read-only property returns the angle of the path at the .midPoint.*/ + midAngle: number; + + /**This read-only property returns the point at the middle of the path.*/ + midPoint: Point; + + /**This read-only property returns the Shape representing the path of this Link.*/ + path: Shape; + + /**Gets or sets the List of Points in the route. Can also be set as an Array of numbers.*/ + points: List<Point>; + + /**This read-only property returns the number of points in the route.*/ + pointsCount: number; + + /**Gets or sets whether the user may reconnect an existing link at the "from" end.*/ + relinkableFrom: boolean; + + /**Gets or sets whether the user may reconnect an existing link at the "to" end.*/ + relinkableTo: boolean; + + /**Gets or sets whether the user may change the number of segments in this Link, if the link has straight segments.*/ + resegmentable: boolean; + + /**Gets or sets whether the link's path tries to avoid other nodes.*/ + routing: EnumValue; + + /**Gets or sets how far the control points are from the points of the route when .routing is .Orthogonal and .curve is .Bezier.*/ + smoothness: number; + + /**Gets or sets how far the control points are from the points of the route when .routing is .Orthogonal and .curve is .Bezier.*/ + toEndSegmentDirection: EnumValue; + + /**Gets or sets the length of the last segment.*/ + toEndSegmentLength: number; + + /**Gets or sets the Node that this link goes to.*/ + toNode: Node; + + /**This read-only property returns a GraphObject that is the "to" port that this link is connected to.*/ + toPort: GraphObject; + + /**Gets or sets the function that is called after this Link changes which Node or port it connects to.*/ + toPortChanged: (a: Link, b: GraphObject, c: GraphObject) => void; + + /**Gets or sets the identifier of the port that this link goes to.*/ + toPortId: string; + + /**Gets or sets how far the end segment stops short of the actual port.*/ + toShortLength: number; + + /**Gets or sets where this link should connect at the .toPort.*/ + toSpot: Spot; + + /** + * This predicate returns true if .relinkableFrom is true, if the layer's Layer.allowRelink is true, and if the diagram's Diagram.allowRelink is true. + */ + canRelinkFrom(): boolean; + + /** + * This predicate returns true if .relinkableTo is true, if the layer's Layer.allowRelink is true, and if the diagram's Diagram.allowRelink is true. + */ + canRelinkTo(): boolean; + + /** + * Find the index of the segment that is closest to a given point. + * @param {Point} p the Point, in document coordinates. + */ + findClosestSegment(p: Point): number; + + /** + * Compute the direction in which a link should go from a given connection point. + * @param {Node} node + * @param {GraphObject} port the GraphObject representing a port on the node. + * @param {Point} linkpoint the connection point, in document coordinates. + * @param {Spot} spot a Spot value describing where the link should connect. + * @param {boolean} from true if the link is coming out of the port; false if going to the port. + * @param {boolean} ortho whether the link should have orthogonal segments. + * @param {Node} othernode the node at the other end of the link. + * @param {GraphObject} otherport the GraphObject port at the other end of the link. + */ + getLinkDirection(node: Node, port: GraphObject, linkpoint: Point, spot: Spot, from: boolean, ortho: boolean, othernode: Node, otherport: GraphObject): number; + + /** + * Compute the point on a node/port at which the route of a link should end. + * @param {Node} node + * @param {GraphObject} port the GraphObject representing a port on the node. + * @param {Spot} spot a Spot value describing where the link should connect. + * @param {boolean} from true if the link is coming out of the port; false if going to the port. + * @param {boolean} ortho whether the link should have orthogonal segments. + * @param {Node} othernode the node at the other end of the link. + * @param {GraphObject} otherport the GraphObject port at the other end of the link. + * @param {Point=} result an optional Point that is modified and returned; otherwise it allocates and returns a new Point + */ + getLinkPoint(node: Node, port: GraphObject, spot: Spot, from: boolean, ortho: boolean, othernode: Node, otherport: GraphObject, result?: Point): Point; + + /** + * Compute the intersection point for the edge of a particular port GraphObject, given a point, when no particular spot or side has been specified. + * @param {Node} node + * @param {GraphObject} port the GraphObject representing a port on the node. + * @param {Point} focus the point in document coordinates to/from which the link should point, + * normally the center of the port. + * @param {Point} p often this point is far away from the node, to give a general direction, + * particularly an orthogonal one. + * @param {boolean} from true if the link is coming out of the port; false if going to the port. + * @param {Point=} result an optional Point that is modified and returned; otherwise it allocates and returns a new Point + */ + getLinkPointFromPoint(node: Node, port: GraphObject, focus: Point, p: Point, from: boolean, result?: Point): Point; + + /** + * Given a Node, return the node at the other end of this link. + * @param {Node} node + */ + getOtherNode(node: Node): Node; + + /** + * Given a GraphObject that is a "port", return the port at the other end of this link. + * @param {GraphObject} port + */ + getOtherPort(port: GraphObject): GraphObject; + + /** + * Gets a particular point of the route. + * @param {number} i The zero-based index of the desired point. + */ + getPoint(i: number): Point; + + /** + * Move this link to a new position. + * @param {Point} newpos + */ + move(newpos: Point): void; + + /**Used as a value for Link.routing: each segment is horizontal or vertical, but the route tries to avoid crossing over nodes.*/ + static AvoidsNodes: EnumValue; + + /**Used as a value for Link.curve, to indicate that the link path uses Bezier curve segments.*/ + static Bezier: EnumValue; + + /**Used as a value for Link.adjusting, to indicate that the link route computation should keep the intermediate points of the previous route, just modifying the first and/or last points; if the routing is orthogonal, it will only modify the first two and/or last two points.*/ + static End: EnumValue; + + /**Used as a value for Link.curve, to indicate that orthogonal link segments will be discontinuous where they cross over other orthogonal link segments that have a Link.curve or JumpOver or JumpGap.*/ + static JumpGap: EnumValue; + + /**Used as a value for Link.curve, to indicate that orthogonal link segments will veer around where they cross over other orthogonal link segments that have a Link.curve or JumpOver or JumpGap.*/ + static JumpOver: EnumValue; + + /**This is the default value for Link.curve and Link.adjusting, to indicate that the path geometry consists of straight line segments and to indicate that the link route computation does not depend on any previous route points; this can also be used as a value for GraphObject.segmentOrientation to indicate that the object is never rotated along the link route -- its angle is unchanged.*/ + static None: EnumValue; + + /**Used as the default value for Link.routing: the route goes fairly straight between ports.*/ + static Normal: EnumValue; + + /**This value for GraphObject.segmentOrientation results in the GraphObject turned to have the same angle as the route: the GraphObject's angle is always the same as the angle of the link's route at the segment where the GraphObject is attached; use this orientation for arrow heads.*/ + static OrientAlong: EnumValue; + + /**This value for GraphObject.segmentOrientation results in the GraphObject being turned counter-clockwise to be perpendicular to the route: the GraphObject's angle is always 90 degrees less than the angle of the link's route at the segment where the GraphObject is attached.*/ + static OrientMinus90: EnumValue; + + /**This value for GraphObject.segmentOrientation results in the GraphObject turned counter-clockwise to be perpendicular to the route, just like Link.OrientMinus90, but is never upside down: the GraphObject's angle always being 90 degrees less than the angle of the link's route at the segment where the GraphObject is attached; this is typically only used for TextBlocks or Panels that contain text.*/ + static OrientMinus90Upright: EnumValue; + + /**This value for GraphObject.segmentOrientation results in the GraphObject's angle always being 180 degrees opposite from the angle of the link's route at the segment where the GraphObject is attached.*/ + static OrientOpposite: EnumValue; + + /**This value for GraphObject.segmentOrientation results in the GraphObject is turned clockwise to be perpendicular to the route: the GraphObject's angle is always 90 degrees more than the angle of the link's route at the segment where the GraphObject is attached.*/ + static OrientPlus90: EnumValue; + + /**This value for GraphObject.segmentOrientation results in the GraphObject turned clockwise to be perpendicular to the route, just like Link.OrientPlus90, but is never upside down: the GraphObject's angle always being 90 degrees more than the angle of the link's route at the segment where the GraphObject is attached; this is typically only used for TextBlocks or Panels that contain text.*/ + static OrientPlus90Upright: EnumValue; + + /**This value for GraphObject.segmentOrientation results in the GraphObject turned to have the same angle as the route, just like Link.OrientAlong, but is never upside down: the GraphObject's angle always following the angle of the link's route at the segment where the GraphObject is attached; this is typically only used for TextBlocks or Panels that contain text.*/ + static OrientUpright: EnumValue; + + /**This value for GraphObject.segmentOrientation results in the GraphObject's angle always following the angle of the link's route at the segment where the GraphObject is attached, but never upside down and never angled more than +/- 45 degrees: when the route's angle is within 45 degrees of vertical (90 or 270 degrees), the GraphObject's angle is set to zero; this is typically only used for TextBlocks or Panels that contain text.*/ + static OrientUpright45: EnumValue; + + /**Used as a value for Link.routing: each segment is horizontal or vertical.*/ + static Orthogonal: EnumValue; + + /**Used as a value for Link.adjusting, to indicate that the link route computation should scale and rotate the intermediate points so that the link's shape looks approximately the same; if the routing is orthogonal, this value is treated as if it were Link.End.*/ + static Scale: EnumValue; + + /**Used as a value for Link.adjusting, to indicate that the link route computation should linearly interpolate the intermediate points so that the link's shape looks stretched; if the routing is orthogonal, this value is treated as if it were Link.End.*/ + static Stretch: EnumValue; + + routeBounds: Rect; // undocumented + protected computeEndSegmentLength(node: Node, port: GraphObject, spot: Spot, from: boolean): number; // undocumented + protected computeSpot(from: boolean): Spot; // undocumented + protected computeOtherPoint(othernode: Node, otherport: GraphObject): Point; // undocumented + protected computeShortLength(from: boolean): number; // undocumented + protected computeCurve(): EnumValue; // undocumented + protected computeCorner(): number; // undocumented + protected computeCurviness(): number; // undocumented + protected computeThickness(): number; // undocumented + hasCurviness(): boolean; // undocumented + invalidateRoute(): void; // undocumented + updateRoute(): void; // undocumented + protected computePoints(): boolean; // undocumented + clearPoints(): void; // undocumented + addPoint(p: Point): void; // undocumented + addPointAt(x: number, y: number): void; // undocumented + insertPoint(i: number, p: Point): void; // undocumented + insertPointAt(i: number, x: number, y: number): void; // undocumented + removePoint(i: number): void; // undocumented + setPoint(i: number, p: Point): void; // undocumented + setPointAt(i: number, x: number, y: number): void; // undocumented + invalidateGeometry(): void; // undocumented + makeGeometry(): Geometry; // undocumented + } + + /** + * A Node is a Part that may connect to other nodes with Links, + * or that may be a member of a Group. + * Group inherits from Node, + * enabling nodes to logically contain other nodes and links. + */ + class Node extends Part { + /** + * Constructs an empty Node. + * @param {EnumValue=} type if not supplied, the default Panel type is Panel.Position. + */ + constructor(type?: EnumValue); + + /**Gets or sets whether this Node is to be avoided by Links whose Link.routing is Link.AvoidsNodes.*/ + avoidable: boolean; + + /**Gets or sets the Margin (or number for a uniform Margin) around this Node in which avoidable links will not be routed.*/ + avoidableMargin: MarginLike; + + /**This read-only property is true when this Node is a label node for a Link.*/ + isLinkLabel: boolean; + + /**Gets or sets whether the subtree graph starting at this node is expanded.*/ + isTreeExpanded: boolean; + + /**Gets whether this node has no tree children.*/ + isTreeLeaf: boolean; + + /**Gets or sets the Link for which this Node is acting as a smart label.*/ + labeledLink: Link; + + /**Gets or sets the function that is called after a Link has been connected with this Node.*/ + linkConnected: (a: Node, b: Link, c: GraphObject) => void; + + /**Gets or sets the function that is called after a Link has been disconnected from this Node.*/ + linkDisconnected: (a: Node, b: Link, c: GraphObject) => void; + + /**Gets or sets a predicate that determines whether or not a Link may be connected with this node; any of the arguments may be null.*/ + linkValidation: (from: Node, fromPort: GraphObject, to: Node, toPort: GraphObject, link: Link) => boolean; + + /**This read-only property returns an iterator over all of the Links that are connected with this node.*/ + linksConnected: Iterator<Link>; + + /**This read-only property returns the primary GraphObject representing a port in this node.*/ + port: GraphObject; + + /**This read-only property returns an iterator over all of the GraphObjects in this node that act as ports.*/ + ports: Iterator<GraphObject>; + + /**Gets or sets how link points are computed when the port spot is a "side" spot.*/ + portSpreading: EnumValue; + + /**Gets or sets the function that is called when .isTreeExpanded has changed value.*/ + treeExpandedChanged: (node: Node) => void; + + /**Gets or sets whether the subtree graph starting at this node had been collapsed by a call to .expandTree on the parent node.*/ + wasTreeExpanded: boolean; + + /** + * Hide each child node and the connecting link, and recursively collapse each child node. + * @param {number=} level How many levels of the tree, starting at this node, to keep expanded if already expanded; + * the default is 1, hiding all tree children of this node. Values less than 1 are treated as 1. + */ + collapseTree(level?: number): void; + + /** + * Show each child node and the connecting link, and perhaps recursively expand their child nodes. + * @param {number=} level How many levels of the tree should be expanded; + * the default is 2, showing all tree children of this node and potentially more. + * Values less than 2 are treated as 2. + */ + expandTree(level?: number): void; + + /** + * Returns an iterator over all of the Links that go from this node to another node or vice-versa, perhaps limited to a given port id on this node and a port id on the other node. + * @param {Node} othernode + * @param {string|null=} pid A port identifier string; if null the link's portId is ignored and all links are included in the search. + * @param {string|null=} otherpid A port identifier string; if null the link's portId is ignored and all links are included in the search. + */ + findLinksBetween(othernode: Node, pid?: string, otherpid?: string): Iterator<Link>; + + /** + * Returns an iterator over all of the Links that connect with this node in either direction, perhaps limited to the given port id on this node. + * @param {string|null=} pid A port identifier string; if null the link's portId is ignored and all links are included in the search. + */ + findLinksConnected(pid?: string): Iterator<Link>; + + /** + * Returns an iterator over all of the Links that go into this node, perhaps limited to the given port id on this node. + * @param {string|null=} pid A port identifier string; if null the link's portId is ignored and all links are included in the search. + */ + findLinksInto(pid?: string): Iterator<Link>; + + /** + * Returns an iterator over all of the Links that come out of this node, perhaps limited to the given port id on this node. + * @param {string|null=} pid A port identifier string; if null the link's portId is ignored and all links are included in the search. + */ + findLinksOutOf(pid?: string): Iterator<Link>; + + /** + * Returns an iterator over all of the Links that go from this node to another node, perhaps limited to a given port id on this node and a port id on the other node. + * @param {Node} othernode + * @param {string|null=} pid A port identifier string; if null the link's portId is ignored and all links are included in the search. + * @param {string|null=} otherpid A port identifier string; if null the link's portId is ignored and all links are included in the search. + */ + findLinksTo(othernode: Node, pid?: string, otherpid?: string): Iterator<Link>; + + /** + * Returns an iterator over the Nodes that are connected with this node in either direction, perhaps limited to the given port id on this node. + * @param {string|null=} pid A port identifier string; if null the link's portId is ignored and all links are included in the search. + */ + findNodesConnected(pid?: string): Iterator<Node>; + + /** + * Returns an iterator over the Nodes that are connected with this node by links going into this node, perhaps limited to the given port id on this node. + * @param {string|null=} pid A port identifier string; if null the link's portId is ignored and all links are included in the search. + */ + findNodesInto(pid?: string): Iterator<Node>; + + /** + * Returns an iterator over the Nodes that are connected with this node by links coming out of this node, perhaps limited to the given port id on this node. + * @param {string|null=} pid A port identifier string; if null the link's portId is ignored and all links are included in the search. + */ + findNodesOutOf(pid?: string): Iterator<Node>; + + /** + * Find a GraphObject with a given GraphObject.portId. + * @param {string} pid + */ + findPort(pid: string): GraphObject; + + /** + * Returns an Iterator for the collection of Links that connect with the immediate tree children of this node. + */ + findTreeChildrenLinks(): Iterator<Link>; + + /** + * Returns an Iterator for the collection of Nodes that are the immediate tree children of this node. + */ + findTreeChildrenNodes(): Iterator<Node>; + + /** + * Return how deep this node is in a tree structure. + * For tree root nodes, this returns zero. + */ + findTreeLevel(): number; + + /** + * Returns the Link that connects with the tree parent Node of this node if the graph is tree-structured, if there is such a link and Link.isTreeLink is true. + */ + findTreeParentLink(): Link; + + /** + * Returns the Node that is the tree parent of this node if the graph is tree-structured, if there is a parent. + */ + findTreeParentNode(): Node; + + /** + * Return a collection of Parts including this Node, all of the Links going to child Nodes, and all of their tree child nodes and links. + * @param {number=} level How many levels of the tree, starting at this node, to include; + * the default is Infinity, including all tree children of this node. Values less than 1 are treated as 1. + */ + findTreeParts(level?: number): Set<Part>; + + /** + * Return the Node that is at the root of the tree that this node is in, perhaps this node itself. + */ + findTreeRoot(): Node; + + /** + * This predicate is true if this node is a child of the given Node, perhaps indirectly as a descendant. + * @param {Node} node the Node that might be a parent or ancestor of this node. + */ + isInTreeOf(node: Node): boolean; + + /**This value for GraphObject.fromEndSegmentDirection and GraphObject.toEndSegmentDirection indicates that the link's end segment angle stays the same even if the node is rotated.*/ + static DirectionAbsolute: EnumValue; + + /**This value for Link.fromEndSegmentDirection and Link.toEndSegmentDirection indicates that the real value is inherited from the corresponding connected port.*/ + static DirectionDefault: EnumValue; + + /**This value for GraphObject.fromEndSegmentDirection and GraphObject.toEndSegmentDirection indicates that the link's end segment angle is rotated to match the node's angle.*/ + static DirectionRotatedNode: EnumValue; + + /**This value for GraphObject.fromEndSegmentDirection and GraphObject.toEndSegmentDirection indicates that the link's end segment angle is rotated to match the node's angle, but only in increments of 90 degrees.*/ + static DirectionRotatedNodeOrthogonal: EnumValue; + + /**This value for Node.portSpreading indicates that links connecting with a port should be distributed evenly along the side(s) indicated by a Spot that is a "side" Spot.*/ + static SpreadingEvenly: EnumValue; + + /**This value for Node.portSpreading indicates that links connecting with a port should connect at a single point on the side(s) indicated by a Spot that is a "side" Spot.*/ + static SpreadingNone: EnumValue; + + /**This value for Node.portSpreading indicates that links connecting with a port should be packed together based on the link's shape's width on the side(s) indicated by a Spot that is a "side" Spot.*/ + static SpreadingPacked: EnumValue; + } + + /** + * An Overview is a Diagram that displays all of a different diagram, + * with a rectangular box showing the viewport displayed by that other diagram. + * All you need to do is set Overview.observed. + */ + class Overview extends Diagram { + /** + * @param {HTMLDivElement} div A reference to a DIV element in the DOM. + */ + constructor(div: HTMLDivElement); + /** + * @param {string} id A reference to a DIV by its ID as a string. + */ + constructor(id?: string); + + /**Gets or sets the rectangular Part that represents the viewport of the .observed Diagram.*/ + box: Part; + + /**Gets or sets whether this overview draws the temporary layers of the observed Diagram.*/ + drawsTemporaryLayers: boolean; + + /**Gets or sets the Diagram for which this Overview is displaying a model and showing its viewport into that model.*/ + observed: Diagram; + } + + /** + * Palette extends the Diagram class to allow objects to be dragged and placed onto other Diagrams. + * Its Diagram.layout is a GridLayout. + * The Palette is Diagram.isReadOnly but to support drag-and-drop its Diagram.allowDragOut is true. + */ + class Palette extends Diagram { + /** + * @param {HTMLDivElement} div A reference to a DIV in the DOM. + */ + constructor(div: HTMLDivElement); + /** + * @param {string} id A reference to a DIV by its ID as a string. + */ + constructor(id?: string); + } + + /** + * A Panel is a GraphObject that holds other GraphObjects as its elements. + * A Panel is responsible for sizing and positioning its elements. + * Every Panel has a .type and establishes its own coordinate system. The .type of a Panel + * determines how it will size and arrange its elements. + */ + class Panel extends GraphObject { + /** + * Constructs an empty Panel of the given .type. + * @param {EnumValue=} type If not supplied, the default Panel type is Panel.Position. + */ + constructor(type?: EnumValue); + + /**This read-only property returns the number of columns in this Panel if it is of .type Panel.Table.*/ + columnCount: number; + + /**Gets or sets how this Panel's columns deal with extra space if the Panel is of .type Panel.Table.*/ + columnSizing: EnumValue; + + /**Gets or sets the optional model data to which this panel is data-bound.*/ + data: any; + + /**Gets or sets the default alignment spot of this Panel, used as the alignment for an element when its GraphObject.alignment value is Spot.Default.*/ + defaultAlignment: Spot; + + /**Gets or sets the default dash array for a particular column's separator.*/ + defaultColumnSeparatorDashArray: Array<number>; + + /**Gets or sets the default Brush stroke (or CSS color string) for columns in a Table Panel provided a given column has a nonzero RowColumnDefinition.separatorStrokeWidth.*/ + defaultColumnSeparatorStroke: BrushLike; + + /**Gets or sets the default stroke width for a particular column's separator.*/ + defaultColumnSeparatorStrokeWidth: number; + + /**Gets or sets the default dash array for a particular row's separator.*/ + defaultRowSeparatorDashArray: Array<number>; + + /**Gets or sets the default Brush stroke (or CSS color string) for rows in a Table Panel provided a given row has a nonzero RowColumnDefinition.separatorStrokeWidth.*/ + defaultRowSeparatorStroke: BrushLike; + + /**Gets or sets the default stroke width for a particular row's separator.*/ + defaultRowSeparatorStrokeWidth: number; + + /**Gets or sets the additional padding for a particular row or column, a Margin (or number for a uniform Margin).*/ + defaultSeparatorPadding: MarginLike; + + /**Gets or sets the default stretch of this Panel, used as the stretch for an element when its GraphObject.stretch value is GraphObject.Default.*/ + defaultStretch: EnumValue; + + /**This read-only property returns an iterator over the collection of the GraphObjects that this panel manages.*/ + elements: Iterator<GraphObject>; + + /**Gets or sets the distance between lines in a .Grid panel.*/ + gridCellSize: Size; + + /**Gets or sets an origin point for the grid cells in a .Grid panel.*/ + gridOrigin: Point; + + /**Gets or sets a JavaScript Array of values or objects, each of which will be represented by a Panel as elements in this Panel.*/ + itemArray: Array<any>; + + /**Gets or sets the name of the item data property that returns a string describing that data's category, or a function that takes an item data object and returns that string; the default value is the name 'category'.*/ + itemCategoryProperty: PropertyAccessor; + + /**This read-only property returns the index of the item in the containing Panel's Panel.itemArray that this Panel represents.*/ + itemIndex: number; + + /**Gets or sets the default Panel template used as the archetype for item data that are in .itemArray.*/ + itemTemplate: Panel; + + /**Gets or sets a Map mapping template names to Panels.*/ + itemTemplateMap: Map<string,Panel>; + + /**Gets or sets the first column that this Panel of .type Panel.Table displays.*/ + leftIndex: number; + + /**Gets or sets the space between this Panel's border and its content, as a Margin (or number for a uniform Margin), depending on the type of panel.*/ + padding: MarginLike; + + /**This read-only property returns the number of row in this Panel if it is of .type Panel.Table.*/ + rowCount: number; + + /**Gets or sets how this Panel's rows deal with extra space if the Panel is of .type Panel.Table.*/ + rowSizing: EnumValue; + + /**Gets or sets the first row that this this Panel of .type Panel.Table displays.*/ + topIndex: number; + + /**Gets or sets the type of the Panel.*/ + type: EnumValue; + + /**Gets or sets how a .Viewbox panel will resize its content.*/ + viewboxStretch: EnumValue; + + /** + * Adds a GraphObject to the end of this Panel's list of elements, visually in front of all of the other elements. + * @param {GraphObject} element A GraphObject. + */ + add(element: GraphObject): void; + + /** + * Creates a deep copy of this Panel and returns it. + */ + copy(): Panel; + + /** + * Returns the GraphObject in this Panel's list of elements at the specified index. + * @param {number} idx a zero-based index + */ + elt(idx: number): GraphObject; + + /** + * Returns the cell at a given x-coordinate in local coordinates. + * @param {number} x + */ + findColumnForLocalX(x: number): number; + + /** + * Returns the first immediate child element with GraphObject.isPanelMain set to true, + * or if there is no such child element, just the first element. + */ + findMainElement(): GraphObject; + + /** + * Search the visual tree starting at this Panel for a GraphObject whose GraphObject.name is the given name. + * @param {string} name The name to search for, using a case-sensitive string comparison. + */ + findObject(name: string): GraphObject; + + /** + * Returns the row at a given y-coordinate in local coordinates. + * @param {number} y + */ + findRowForLocalY(y: number): number; + + /** + * Gets the RowColumnDefinition for a particular column in this Table Panel. + * @param {number} idx the non-negative zero-based integer column index. + */ + getColumnDefinition(idx: number): RowColumnDefinition; + + /** + * Gets the RowColumnDefinition for a particular row in this Table Panel. + * @param {number} idx the non-negative zero-based integer row index. + */ + getRowDefinition(idx: number): RowColumnDefinition; + + /** + * Adds a GraphObject to the Panel's list of elements at the specified index. + * @param {number} index + * @param {GraphObject} element A GraphObject. + */ + insertAt(index: number, element: GraphObject): void; + + /** + * Create and add new GraphObjects corresponding to and bound to the data in the .itemArray, after removing all existing elements from this Panel. + */ + rebuildItemElements(): void; + + /** + * Removes a GraphObject from this Panel's list of elements. + * @param {GraphObject} element A GraphObject. + */ + remove(element: GraphObject): void; + + /** + * Removes an GraphObject from this Panel's list of elements at the specified index. + * @param {number} idx + */ + removeAt(idx: number): void; + + /** + * Removes the RowColumnDefinition for a particular row in this Table Panel. + * @param {number} idx the non-negative zero-based integer row index. + */ + removeColumnDefinition(idx: number): void; + + /** + * Removes the RowColumnDefinition for a particular row in this Table Panel. + * @param {number} idx the non-negative zero-based integer row index. + */ + removeRowDefinition(idx: number): void; + + /** + * Re-evaluate all data bindings on this panel, in order to assign new property values to the GraphObjects in this visual tree based on this this object's .data property values. + * @param {string=} srcprop An optional source data property name: + * when provided, only evaluates those Bindings that use that particular property; + * when not provided or when it is the empty string, all bindings are evaluated. + */ + updateTargetBindings(srcprop?: string): void; + + /**This value for .type resizes the main element to fit around the other elements; the main element is the first GraphObject with GraphObject.isPanelMain set to true, or else the first GraphObject if none have that property set to true.*/ + static Auto: EnumValue; + + /**This value for .type is used to draw regular patterns of lines.*/ + static Grid: EnumValue; + + /**This value for .type lays out the elements horizontally with their GraphObject.alignment property dictating their alignment on the Y-axis.*/ + static Horizontal: EnumValue; + + /**This value for .type is used for Links and adornments that act as Links.*/ + static Link: EnumValue; + + /**The default .type arranges each element according to their GraphObject.position.*/ + static Position: EnumValue; + + /**This value for .type arranges GraphObjects about a main element using the GraphObject.alignment and GraphObject.alignmentFocus properties; the main element is the first GraphObject with GraphObject.isPanelMain set to true, or else the first GraphObject if none have that property set to true.*/ + static Spot: EnumValue; + + /**This value for .type arranges GraphObjects into rows and columns; set the GraphObject.row and GraphObject.column properties on each element.*/ + static Table: EnumValue; + + /**Organizational Panel type that is only valid inside of a Table panel.*/ + static TableColumn: EnumValue; + + /**Organizational Panel type that is only valid inside of a Table panel.*/ + static TableRow: EnumValue; + + /**This value for .type lays out the elements vertically with their GraphObject.alignment property dictating their alignment on the X-axis.*/ + static Vertical: EnumValue; + + /**This value for .type rescales a single GraphObject to fit inside the panel depending on the element's GraphObject.stretch property.*/ + static Viewbox: EnumValue; + } + + /** + * This is the base class for all user-manipulated top-level objects. + * Because it inherits from Panel, it is automatically a visual container + * of other GraphObjects. + * Because it thus also inherits from GraphObject, it also has properties such as + * GraphObject.actualBounds, GraphObject.contextMenu, and GraphObject.visible. + */ + class Part extends Panel { + /** + * The constructor builds an empty Part. + * @param {EnumValue=} type if not supplied, the default Panel type is Panel.Position. + */ + constructor(type?: EnumValue); + + /**This read-only property returns an iterator over all of the Adornments associated with this part.*/ + adornments: Iterator<Adornment>; + + /**Gets or sets the category of this part, typically used to distinguish different kinds of nodes or links.*/ + category: string; + + /**Gets or sets the Group of which this Part or Node is a member.*/ + containingGroup: Group; + + /**Gets or sets the function that is called after this Part has changed which Group it belongs to, if any.*/ + containingGroupChanged: (member: Part, oldgrp: Group, newgrp: Group) => void; + + /**Gets or sets whether the user may copy this part.*/ + copyable: boolean; + + /**Gets or sets whether the user may delete this part.*/ + deletable: boolean; + + /**This read-only property returns the Diagram that this Part is in.*/ + diagram: Diagram; + + /**Gets or sets the function used to determine the location that this Part can be dragged to.*/ + dragComputation: (part: Part, oldloc: Point, newloc: Point) => Point; + + /**Gets or sets whether the user may group this part to be a member of a new Group.*/ + groupable: boolean; + + /**Gets or sets whether this Part may be animated.*/ + isAnimated: boolean; + + /**Gets or sets whether this Part is highlighted.*/ + isHighlighted: boolean; + + /**Gets or sets whether this Part is part of the document bounds.*/ + isInDocumentBounds: boolean; + + /**Gets or sets whether a Layout positions this Node or routes this Link.*/ + isLayoutPositioned: boolean; + + /**Gets or sets whether this Part is selected.*/ + isSelected: boolean; + + /**Gets or sets whether this part will draw shadows.*/ + isShadowed: boolean; + + /**Gets whether this part is not member of any Group node nor is it a label node for a Link.*/ + isTopLevel: boolean; + + /**This read-only property returns the Layer that this Part is in.*/ + layer: Layer; + + /**Gets or sets the function to execute when this part changes layers.*/ + layerChanged: (part: Part, oldlayer: Layer, newlayer: Layer) => void; + + /**Gets or sets the layer name for this part.*/ + layerName: string; + + /**Gets or sets "Layout..." flags that control when the Layout that is responsible for this Part is invalidated.*/ + layoutConditions: number; + + /**Gets or sets the position of this part in document coordinates, based on the .locationSpot in this part's .locationObject.*/ + location: Point; + + /**This read-only property returns the GraphObject that determines the location of this Part.*/ + locationObject: GraphObject; + + /**Gets or sets the name of the GraphObject that provides the location of this Part.*/ + locationObjectName: string; + + /**Gets or sets the location Spot of this Node, the spot on the .locationObject that is used in positioning this part in the diagram.*/ + locationSpot: Spot; + + /**Gets or sets the maximum location of this Part to which the user may drag using the DraggingTool.*/ + maxLocation: Point; + + /**Gets or sets the minimum location of this Part to which the user may drag using the DraggingTool.*/ + minLocation: Point; + + /**Gets or sets whether the user may move this part.*/ + movable: boolean; + + /**Gets or sets whether the user may reshape this part.*/ + reshapable: boolean; + + /**Gets or sets whether the user may resize this part.*/ + resizable: boolean; + + /**Gets or sets the adornment template used to create a resize handle Adornment for this part.*/ + resizeAdornmentTemplate: Adornment; + + /**Gets or sets the width and height multiples used when resizing.*/ + resizeCellSize: Size; + + /**This read-only property returns the GraphObject that should get resize handles when this part is selected.*/ + resizeObject: GraphObject; + + /**Gets or sets the name of the GraphObject that should get a resize handle when this part is selected.*/ + resizeObjectName: string; + + /**Gets or sets whether the user may rotate this part.*/ + rotatable: boolean; + + /**Gets or sets the adornment template used to create a rotation handle Adornment for this part.*/ + rotateAdornmentTemplate: Adornment; + + /**This read-only property returns the GraphObject that should get rotate handles when this part is selected.*/ + rotateObject: GraphObject; + + /**Gets or sets the name of the GraphObject that should get a rotate handle when this part is selected.*/ + rotateObjectName: string; + + /**Gets or sets whether the user may select this part.*/ + selectable: boolean; + + /**Gets or sets whether a selection adornment is shown for this part when it is selected.*/ + selectionAdorned: boolean; + + /**Gets or sets the Adornment template used to create a selection handle for this Part.*/ + selectionAdornmentTemplate: Adornment; + + /**Gets or sets the function to execute when this part is selected or deselected.*/ + selectionChanged: (p: Part) => void; + + /**This read-only property returns the GraphObject that should get a selection handle when this part is selected.*/ + selectionObject: GraphObject; + + /**Gets or sets the name of the GraphObject that should get a selection handle when this part is selected.*/ + selectionObjectName: string; + + /**Gets or sets the numerical value that describes the shadow's blur.*/ + shadowBlur: number; + + /**Gets or sets the CSS string that describes a shadow color.*/ + shadowColor: string; + + /**Gets or sets the X and Y offset of this part's shadow.*/ + shadowOffset: Point; + + /**Gets or sets a text string that is associated with this part.*/ + text: string; + + /**Gets or sets whether the user may do in-place text editing on TextBlocks in this part that have TextBlock.editable set to true.*/ + textEditable: boolean; + + /** + * Associate an Adornment with this Part, perhaps replacing any existing adornment. + * @param {string} category a string identifying the kind or role of the given adornment for this Part. + * @param {Adornment} ad + */ + addAdornment(category: string, ad: Adornment): void; + + /** + * This predicate returns true if .copyable is true, if the layer's Layer.allowCopy is true, and if the diagram's Diagram.allowCopy is true. + */ + canCopy(): boolean; + + /** + * This predicate returns true if .deletable is true, if the layer's Layer.allowDelete is true, and if the diagram's Diagram.allowDelete is true. + */ + canDelete(): boolean; + + /** + * This predicate returns true if .textEditable is true, if the layer's Layer.allowTextEdit is true, and if the diagram's Diagram.allowTextEdit is true. + */ + canEdit(): boolean; + + /** + * This predicate returns true if .groupable is true, if the layer's Layer.allowGroup is true, and if the diagram's Diagram.allowGroup is true. + */ + canGroup(): boolean; + + /** + * This predicate is called by Layout implementations to decide whether this Part should be positioned and might affect the positioning of other Parts. + */ + canLayout(): boolean; + + /** + * This predicate returns true if .movable is true, if the layer's Layer.allowMove is true, and if the diagram's Diagram.allowMove is true. + */ + canMove(): boolean; + + /** + * This predicate returns true if .reshapable is true, if the layer's Layer.allowReshape is true, and if the diagram's Diagram.allowReshape is true. + */ + canReshape(): boolean; + + /** + * This predicate returns true if .resizable is true, if the layer's Layer.allowResize is true, and if the diagram's Diagram.allowResize is true. + */ + canResize(): boolean; + + /** + * This predicate returns true if .rotatable is true, if the layer's Layer.allowRotate is true, and if the diagram's Diagram.allowRotate is true. + */ + canRotate(): boolean; + + /** + * This predicate returns true if .selectable is true, if the layer's Layer.allowSelect is true, and if the diagram's Diagram.allowSelect is true. + */ + canSelect(): boolean; + + /** + * Remove all adornments associated with this part. + */ + clearAdornments(): void; + + /** + * Find an Adornment of a given category associated with this Part. + * @param {string} category + */ + findAdornment(category: string): Adornment; + + /** + * Find the Group that contains both this part and another one. + * @param {Part} other + */ + findCommonContainingGroup(other: Part): Group; + + /** + * Return how deep this part is in the hierarchy of nested Groups. + * For top level parts, i.e. isTopLevel, this returns zero. + */ + findSubGraphLevel(): number; + + /** + * Gets the top-level Part for this part, which is itself when .isTopLevel is true. + */ + findTopLevelPart(): Part; + + /** + * Invalidate the Layout that is responsible for positioning this Part. + * @param {number=} condition the reason that the layout should be invalidated -- + * some combination of "Layout..." flag values; + * if this argument is not supplied, any value of .layoutConditions other than Part.LayoutNone + * will allow the layout to be invalidated. + */ + invalidateLayout(condition?: number): void; + + /** + * This predicate is true if this part is a member of the given Part, perhaps indirectly. + * @param {Part} part + */ + isMemberOf(part: Part): boolean; + + /** + * This predicate is true if this Part can be seen. + */ + isVisible(): boolean; + + /** + * Move this part and any parts that are owned by this part to a new position. + * @param {Point} newpos a new Point in document coordinates. + */ + move(newpos: Point): void; + + /** + * Remove any Adornment of the given category that may be associated with this Part. + * @param {string} category a string identifying the kind or role of the given adornment for this Part. + */ + removeAdornment(category: string): void; + + /** + * This is responsible for creating any selection Adornment (if this Part .isSelected) and any tool adornments for this part.*/ + updateAdornments(): void; + + /** + * Re-evaluate all data bindings on this Part, in order to assign new property values to the GraphObjects in this visual tree based on this this object's .data property values. + * @param {string=} srcprop An optional source data property name: + * when provided, only evaluates those Bindings that use that particular property; + * when not provided or when it is the empty string, all bindings are evaluated. + */ + updateTargetBindings(srcprop?: string): void; + + /** + * Update all of the references to nodes in case they had been modified in the model without + * properly notifying the model by calling GraphLinksModel.setGroupKeyForNodeData or + * GraphLinksModel.setToKeyForLinkData or other similar methods. + */ + updateRelationshipsFromData(): void; + + /**This flag may be combined with other "Layout" flags as the value of the Part.layoutConditions property to indicate that when a Part is added to a Diagram or Group, it invalidates the Layout responsible for the Part.*/ + static LayoutAdded: number; + + /**This flag may be combined with other "Layout" flags as the value of the Part.layoutConditions property to indicate that when a Group has been laid out, it invalidates the Layout responsible for that Group; this flag is ignored for Parts that are not Groups.*/ + static LayoutGroupLayout: number; + + /**This flag may be combined with other "Layout" flags as the value of the Part.layoutConditions property to indicate that when a Part's GraphObject.visible becomes false, it invalidates the Layout responsible for the Part.*/ + static LayoutHidden: number; + + /**This flag may be combined with other "Layout" flags as the value of the Part.layoutConditions property to indicate that when a Node or simple Part's .category changes, it invalidates the Layout responsible for the Part; this flag is ignored for Parts that are Links.*/ + static LayoutNodeReplaced: number; + + /**This flag may be combined with other "Layout" flags as the value of the Part.layoutConditions property to indicate that when a Part's GraphObject.actualBounds changes size, it invalidates the Layout responsible for the Part; this flag is ignored for Parts that are Links.*/ + static LayoutNodeSized: number; + + /**This value may be used as the value of the Part.layoutConditions property to indicate that no operation on this Part causes invalidation of the Layout responsible for this Part.*/ + static LayoutNone: number; + + /**This flag may be combined with other "Layout" flags as the value of the Part.layoutConditions property to indicate that when a Part is removed from a Diagram or Group, it invalidates the Layout responsible for the Part.*/ + static LayoutRemoved: number; + + /**This flag may be combined with other "Layout" flags as the value of the Part.layoutConditions property to indicate that when a Part's GraphObject.visible becomes true, it invalidates the Layout responsible for the Part.*/ + static LayoutShown: number; + + /**This is the default value for the Part.layoutConditions property: the Layout responsible for the Part is invalidated when the Part is added or removed from the Diagram or Group or when it changes visibility or size or when a Group's layout has been performed.*/ + static LayoutStandard: number; + + ensureBounds(): void; // undocumented + moveTo(x: number, y: number): void; // undocumented + } + + /** + * A Picture is a GraphObject that shows an image, video-frame, or Canvas element. + * You can specify what to show by either setting the .source URL property + * to a URL string or the .element property to an HTMLImageElement, + * HTMLCanvasElement, or HTMLVideoElement. + */ + class Picture extends GraphObject { + /** + * The constructor creates a picture that shows nothing until the .source or .element is specified. + */ + constructor(); + + /**Gets or sets the Picture's HTML element, an Image or Video or Canvas element.*/ + element: HTMLElement; + + /**Gets or sets the function to call if an image fails to load.*/ + errorFunction: (pic: Picture, e: Event) => void; + + /**Gets or sets how the Picture's image is stretched within its bounding box.*/ + imageStretch: EnumValue; + + /**This read-only property returns the natural size of this picture as determined by its source's width and height.*/ + naturalBounds: Rect; + + /**Gets or sets the Picture's source URL, which can be any valid image (png, jpg, gif, etc) URL.*/ + source: string; + + /**Gets or sets a function that returns a value for image.crossOrigin, which is null by default.*/ + sourceCrossOrigin: (pic: Picture) => string; + + /**Gets or sets the rectangular area of the source image that this picture should display.*/ + sourceRect: Rect; + + static clearCache(url?: string): void; // undocumented + } + + /** + * If a Placeholder is in the visual tree of a Group, it represents the area of all of the member Parts of that Group. + * If a Placeholder is in the visual tree of an Adornment, it represents the area of the Adornment.adornedObject. + * It can only be used in the visual tree of a Group node or an Adornment. + * There can be at most one Placeholder in a Group or an Adornment. + */ + class Placeholder extends GraphObject { + /** + * The only common initialize of a Placeholder is to set its .padding. + */ + constructor(); + + /**Gets or sets the padding as a Margin (or number for a uniform Margin) around the members of the Group or around the Adornment.adornedObject GraphObject.*/ + padding: MarginLike; + } + + /** + * The RowColumnDefinition class describes constraints on a row or a column + * in a Panel of type Panel.Table. + * It also provides information about the actual layout after the + * Table Panel has been arranged. + */ + class RowColumnDefinition { + /** + * You do not need to use this constructor, because calls to Panel.getRowDefinition or Panel.getColumnDefinition will automatically create and remember a RowColumnDefinition for you. + */ + constructor(); + + /**This read-only property returns the usable row height or column width, after arrangement, that objects in this row or column can be placed within.*/ + actual: number; + + /**Gets or sets a default alignment for elements that are in this row or column.*/ + alignment: Spot; + + /**Gets or sets the background Brush (or CSS color string) for a particular row or column, which fills the entire span of the column, including any separatorPadding.*/ + background: BrushLike; + + /**Determines whether or not the background, if there is one, is in front of or behind the separators.*/ + coversSeparators: boolean; + + /**Gets or sets the row height.*/ + height: number; + + /**This read-only property returns which row or column this RowColumnDefinition describes in the .panel.*/ + index: number; + + /**This read-only property returns whether this describes a row or a column in the .panel.*/ + isRow: boolean; + + /**Gets or sets the maximum row height or column width.*/ + maximum: number; + + /**Gets or sets the minimum row height or column width.*/ + minimum: number; + + /**This read-only property returns the Panel that this row or column definition is in.*/ + panel: Panel; + + /**This read-only property returns the actual arranged row or column starting position, after arrangement.*/ + position: number; + + /**Gets or sets the dash array for dashing the spacing provided this row or column has a nonzero RowColumnDefinition.separatorStrokeWidth and non-null RowColumnDefinition.separatorStroke.*/ + separatorDashArray: Array<number>; + + /**Gets or sets the additional padding for a particular row or column, a Margin (or number for a uniform Margin).*/ + separatorPadding: MarginLike; + + /**Gets or sets the Brush (or CSS color string) for a particular row or column, provided that row or column has a nonzero RowColumnDefinition.separatorStrokeWidth.*/ + separatorStroke: BrushLike; + + /**Gets or sets the stroke width for a particular row or column's separator,*/ + separatorStrokeWidth: number; + + /**Gets or sets how this row or column deals with a Table Panel's extra space.*/ + sizing: EnumValue; + + /**Gets or sets the default stretch for elements that are in this row or column.*/ + stretch: EnumValue; + + /**This read-only property returns the total arranged row height or column width, after arrangement.*/ + total: number; + + /**Gets or sets the column width.*/ + width: number; + + /** + * Add a data-binding of a property on this object to a property on a data object. + * @param {Binding} binding + */ + bind(binding: Binding): void; + + /**The default .sizing, which resolves to RowColumnDefinition.None or else the Table Panel's rowSizing and columnSizing if present.*/ + static Default: EnumValue; + + /**The default .sizing if none is specified on the Table Panel's rowSizing and columnSizing.*/ + static None: EnumValue; + + /**If a Table Panel is larger than all the rows then this .sizing grants this row and any others with the same value the extra space, apportioned proportionally between them*/ + static ProportionalExtra: EnumValue; + + computeEffectiveSpacing(): number; // undocumented + computeEffectiveSpacingTop(): number; // undocumented + } + + /** + * A Shape is a GraphObject that shows a geometric figure. + * The Geometry determines what is drawn; + * the properties .fill and .stroke + * (and other stroke properties) determine how it is drawn. + */ + class Shape extends GraphObject { + /** + * A newly constructed Shape has a default .figure of "None", which constructs a rectangular geometry, and is filled and stroked with a black brush. + */ + constructor(); + + /**Gets or sets the figure name, used to construct a Geometry.*/ + figure: string; + + /**Gets or sets the Brush (or CSS color string) that describes the fill of the Shape.*/ + fill: BrushLike; + + /**Gets or sets the name of the kind of arrowhead that this shape should take when this shape is an element of a Link.*/ + fromArrow: string; + + /**Gets or sets the Shape's Geometry that defines the Shape's figure.*/ + geometry: Geometry; + + /**Gets or sets how the shape's geometry is proportionally created given its computed size.*/ + geometryStretch: EnumValue; + + /**When set, creates a Geometry and normalizes it from a given path string, then sets the Geometry on this Shape and offsets the GraphObject.position by an appropriate amount.*/ + geometryString: string; + + /**Gets or sets how frequently this shape should be drawn within a Grid Panel, in multiples of the Panel.gridCellSize.*/ + interval: number; + + /**Gets or sets the whether the .position denotes the panel coordinates of the geometry or of the stroked area.*/ + isGeometryPositioned: boolean; + + /**This read-only property returns the natural bounds of this Shape as determined by its .geometry's bounds.*/ + naturalBounds: Rect; + + /**Gets or sets a property for parameterizing the construction of a Geometry from a figure.*/ + parameter1: number; + + /**Gets or sets a property for parameterizing the construction of a Geometry from a figure.*/ + parameter2: number; + + /**Gets or sets the top-left Spot used by some Panels for determining where in the shape other objects may be placed.*/ + spot1: Spot; + + /**Gets or sets the bottom-right Spot used by some Panels for determining where in the shape other objects may be placed.*/ + spot2: Spot; + + /**Gets or sets the Brush (or CSS color string) that describes the stroke of the Shape.*/ + stroke: BrushLike; + + /**Gets or sets the style for the stroke's line cap.*/ + strokeCap: string; + + /**Gets or sets the dash array for creating dashed lines.*/ + strokeDashArray: Array<number>; + + /**Gets or sets the offset for dashed lines, used in the phase pattern.*/ + strokeDashOffset: number; + + /**Gets or sets the type of corner that will be drawn when two lines meet.*/ + strokeJoin: string; + + /**Gets or sets the style for the stroke's mitre limit ratio.*/ + strokeMiterLimit: number; + + /**Gets or sets a stroke's width.*/ + strokeWidth: number; + + /**Gets or sets the name of the kind of arrowhead that this shape should take when this shape is an element of a Link.*/ + toArrow: string; + + /** + * This static function returns a read-only Map of named geometry generators. + * @return {Map} the keys are figure names; the values are either synonymed names or generator functions + */ + static getFigureGenerators(): Map<string,(shape: Shape, width: number, height: number) => Geometry>; + + /** + * This static function defines a named figure geometry generator for Shapes. + * @param {string} name new figure name must start with an uppercase letter, and must not be "None" + * @param {function(Shape, number, number):Geometry} func returns a Geometry for the given Shape, width, and height + */ + static defineFigureGenerator(name: string, func: (shape: Shape, width: number, height: number) => Geometry): void; + /** + * This static function defines a synonym for a named figure geometry generator. + * @param {string} name the new figure name must start with an uppercase letter, and must not be "None" + * @param {string} synonym an existing figure name + */ + static defineFigureGenerator(name: string, synonym: string): void; + + /** + * This static function returns a read-only Map of named arrowhead geometries. + * @return {Map} the keys are arrowhead names; the values are Geometry objects + */ + static getArrowheadGeometries(): Map<string,Geometry>; + + /** + * This static function defines a named arrowhead geometry. + * @param {string} name the new arrowhead name must start with an uppercase letter, and must not be "None" + * @param {Geometry} geo the Geometry for the arrowhead + */ + static defineArrowheadGeometry(name: string, geo: Geometry): void; + /** + * This static function defines a named arrowhead geometry. + * @param {string} name the new arrowhead name must start with an uppercase letter, and must not be "None" + * @param {string} pathstr a geometry path string that will be passed to Geometry.parse + */ + static defineArrowheadGeometry(name: string, pathstr: string): void; + } + + /** + * A TextBlock is a GraphObject that displays a .text string in a given .font. + */ + class TextBlock extends GraphObject { + /** + * A newly constructed TextBlock has no string to show; if it did, it would draw the text, wrapping if needed, in the default font using a black stroke. + */ + constructor(); + + /**Gets or sets whether or not this TextBlock allows in-place editing of the .text string by the user with the help of the TextEditingTool.*/ + editable: boolean; + + /**Gets or sets the function to call if a text edit made with the TextEditingTool is invalid.*/ + errorFunction: (tool: TextEditingTool, oldstr: string, newstr: string) => void; + + /**Gets or sets the current font settings.*/ + font: string; + + /**Gets or sets whether or not the text allows or displays multiple lines or embedded newlines.*/ + isMultiline: boolean; + + /**Gets or sets whether or not the text has a strikethrough line (line-through).*/ + isStrikethrough: boolean; + + /**Gets or sets whether or not the text is underlined.*/ + isUnderline: boolean; + + /**This read-only property returns the total number of lines in this TextBlock, including lines created from returns and wrapping.*/ + lineCount: number; + + /**Gets or sets the maximum number of lines that this TextBlock may display.*/ + maxLines: number; + + /**This read-only property returns the natural bounds of this TextBlock in local coordinates, as determined by its .font and .text string.*/ + naturalBounds: Rect; + + /**Gets or sets how text that is too long to display should be handled.*/ + overflow: EnumValue; + + /**Gets or sets the Brush (or CSS color string) that describes the stroke (color) of the .font.*/ + stroke: BrushLike; + + /**Gets or sets the current text string.*/ + text: string; + + /**Gets or sets the current text alignment property.*/ + textAlign: string; + + /**Gets or sets the HTMLElement that this TextBlock uses as its text editor in the TextEditingTool.*/ + textEditor: HTMLElement; + + /**Gets or sets the predicate that determines whether or not a string of text is valid.*/ + textValidation: (tb: TextBlock, oldstr: string, newstr: string) => boolean; + + /**Gets or sets whether the text should be wrapped if it is too long to fit on one line.*/ + wrap: EnumValue; + + /**The TextBlock will not wrap its text.*/ + static None: EnumValue; + + /** Used as the default value for TextBlock.overflow: if the width is too small to display all text, the TextBlock will clip.*/ + static OverflowClip: EnumValue; + + /** Used as a value for TextBlock.overflow: if the width is too small to display all text, the TextBlock will display an ellipsis.*/ + static OverflowEllipsis: EnumValue; + + /**The TextBlock will wrap text and the width of the TextBlock will be the desiredSize's width, if any.*/ + static WrapDesiredSize: EnumValue; + + /**The TextBlock will wrap text, making the width of the TextBlock equal to the width of the longest line.*/ + static WrapFit: EnumValue; + + spacingAbove: number; // undocumented + spacingBelow: number; // undocumented + static isValidFont(font: string): boolean; // undocumented + static getEllipsis(): string; // undocumented + static setEllipsis(val: string): void; // undocumented + } + + + /** + * A Brush holds color information and describes how to draw the inside + * of a Shape or the stroke of a shape or a TextBlock or the + * background of any GraphObject. + * A Brush must not be modified once it has been assigned to a GraphObject, + * such as the Shape.fill or TextBlock.stroke + * or GraphObject.background. + * However, a Brush may be shared by multiple GraphObjects. + */ + class Brush { + /** + * Construct a Brush class of a given type. + * @param {EnumValue} type one of the values Brush.Solid, Brush.Linear, Brush.Radial, Brush.Pattern. + */ + constructor(type: EnumValue); + /** + * Construct a solid color Brush that holds the given color information. + * @param {string=} color a well-formed CSS string describing a solid color brush; if not supplied uses 'black'. + */ + constructor(color?: string); + + /**Gets or sets the color of a solid Brush.*/ + color: string; + + /**Gets or sets a Map holding all of the color stops used in this gradient, where the key is a number, the fractional distance between zero and one (inclusive), and where the corresponding value is a color string.*/ + colorStops: Map<number,string>; + + /**Gets or sets the ending location for a linear or radial gradient.*/ + end: Spot; + + /**Gets or sets the radius of a radial brush at the end location.*/ + endRadius: number; + + /**Gets or sets the pattern of a brush of type Brush.Pattern, an HTMLImageElement or HTMLCanvasElement or HTMLVideoElement.*/ + pattern: any; + + /**Gets or sets the starting location for a linear or radial gradient.*/ + start: Spot; + + /**Gets or sets the radius of a radial brush at the start location.*/ + startRadius: number; + + /**Gets or sets the type of brush.*/ + type: EnumValue; + + /** + * Specify a particular color at a particular fraction of the distance. + * If the .type is Brush.Solid, change the type to Brush.Linear. + * You should have a color stop at zero and a color stop at one. + * You should not have duplicate color stop values at the same fractional distance. + * @param {number} loc between zero and one, inclusive. + * @param {string} color a CSS color string + */ + addColorStop(loc: number, color: string): void; + + /** + * Create a copy of this Brush, with the same values. + */ + copy(): Brush; + + /** + * This static function can be used to generate a random color string. + * @param {number=} min a number between zero and 255, defaults to 128. + * @param {number=} max a number between zero and 255, defaults to 255. + */ + static randomColor(min?: number, max?: number): string; + + /**For linear gradient brushes, used as the value for Brush.type.*/ + static Linear: EnumValue; + + /**For pattern brushes, used as the value for Brush.type.*/ + static Pattern: EnumValue; + + /**For radial gradient brushes, used as the value for Brush.type.*/ + static Radial: EnumValue; + + /**For simple, solid color brushes, used as the value for Brush.type.*/ + static Solid: EnumValue; + + static isValidColor(color: string): boolean; // undocumented + } + + /** + * The Geometry class is used to define the "shape" of a Shape. + * A Geometry can be simple straight lines, rectangles, or ellipses. + * A Geometry can also be an arbitrarily complex path, consisting of a list of PathFigures. + * A Geometry must not be modified once it has been used by a Shape. + * However, a Geometry may be shared by multiple Shapes. + */ + class Geometry { + /** + * Construct an empty Geometry. + * The geometry type must be one of the following values: + * Geometry.Line, Geometry.Ellipse, Geometry.Rectangle, Geometry.Path. + * @param {EnumValue=} type If not supplied, the default Geometry type is Geometry.Path. + */ + constructor(type?: EnumValue); + + /**This read-only property returns a rectangle that contains all points within the Geometry.*/ + bounds: Rect; + + /**Gets or sets the Shape.geometryStretch value the Shape should use by default.*/ + defaultStretch: EnumValue; + + /**Gets or sets the ending X coordinate of the Geometry if it is of type .Line, .Rectangle, or .Ellipse.*/ + endX: number; + + /**Gets or sets the ending Y coordinate of the Geometry if it is of type .Line, .Rectangle, or .Ellipse.*/ + endY: number; + + /**Gets or sets the List of PathFigures that describes the content of the path for Geometries of type .Path.*/ + figures: List<PathFigure>; + + /**Gets or sets the spot to use when the Shape.spot1 value is Spot.Default.*/ + spot1: Spot; + + /**Gets or sets the spot to use when the Shape.spot2 value is Spot.Default.*/ + spot2: Spot; + + /**Gets or sets the starting X coordinate of the Geometry if it is of type .Line, .Rectangle, or .Ellipse.*/ + startX: number; + + /**Gets or sets the starting Y coordinate of the Geometry if it is of type .Line, .Rectangle, or .Ellipse.*/ + startY: number; + + /**Gets or sets the type of the Geometry.*/ + type: EnumValue; + + /** + * Add a PathFigure to the figures list. + * @param {PathFigure} figure a newly allocated unshared PathFigure that will become owned by this Geometry + * @return {Geometry} this + */ + add(figure: PathFigure): Geometry; + + /** + * Computes the Geometry's bounds without adding an origin point, and returns those bounds as a rect. + */ + computeBoundsWithoutOrigin(): Rect; + + /** + * Create a copy of this Geometry, with the same values and figures. + */ + copy(): Geometry; + + /** + * Given a SVG or GoJS path string, returns a congruent path string with each PathFigure filled. + * For instance, "M0 0 L22 22 L33 0" would become "F M0 0 L22 22 L33 0". + * @param {string} str + */ + static fillPath(str: string): string; + + /** + * Normalizes the Geometry points in place by ensuring the top-left bounds of the geometry lines up with (0, 0), returning the Point (x, y) amount it was shifted. + */ + normalize(): Point; + + /** + * Offsets the Geometry in place by a given (x, y) amount + * @param {number} x The x-axis offset factor. + * @param {number} y The y-axis offset factor. + * @return {Geometry} this + */ + offset(x: number, y: number): Geometry; + + /** + * Produce a Geometry from a string that uses an SVG-like compact path geometry syntax. + * @param {string} str + * @param {boolean=} filled whether figures should be filled. + * If true, all PathFigures in the string will be filled regardless of the presence + * of an "F" command or not. + * If false, all PathFigures will determine their own filled state by the presence of an "F" command or not. + * Default is false. + */ + static parse(str: string, filled?: boolean): Geometry; + + /** + * Rotates the Geometry in place by a given angle, with optional x and y values to rotate the geometry about. + * If no x and y value are giving, (0, 0) is used as the rotation point. + * @param {number} angle The angle to rotate by. + * @param {number=} x The optional X point to rotate the geometry about. If no point is given, this value is 0. + * @param {number=} y The optional Y point to rotate the geometry about. If no point is given, this value is 0. + * @return {Geometry} this + */ + rotate(angle: number, x?: number, y?: number): Geometry; + + /** + * Scales the Geometry in place by a given (x, y) scale factor + * @param {number} x The x-axis scale factor. + * @param {number} y The y-axis scale factor. + * @return {Geometry} this + */ + scale(x: number, y: number): Geometry; + + /** + * This static function can be used to write out a Geometry as a string + * that can be read by Geometry.parse. + * The string produced by this method is a superset of the SVG path + * string rules that contains some additional GoJS-specific tokens. + * See the <a href="../../intro/pictures.html">Introduction page on Geometry Parsing</a> for more details. + * @param {Geometry} val + */ + static stringify(val: Geometry): string; + + /**For drawing an ellipse fitting within a rectangle; a value for Geometry.type.*/ + static Ellipse: EnumValue; + + /**For drawing a simple straight line; a value for Geometry.type.*/ + static Line: EnumValue; + + /**For drawing a complex path made of a list of PathFigures; a value for Geometry.type.*/ + static Path: EnumValue; + + /**For drawing a rectangle; a value for Geometry.type.*/ + static Rectangle: EnumValue; + + equalsApprox(g: Geometry): boolean; // undocumented + } + + /** + * A Margin represents a band of space outside or inside a rectangular area, + * with possibly different values on each of the four sides. + */ + class Margin { + /** + * If zero arguments are supplied, zero is used for all four sides. + */ + constructor(); + /** + * If one argument is supplied, that number is used for all four sides. + * @param {number} m the margin for all four sides. + */ + constructor(m: number); + /** + * If two arguments are supplied, the top and bottom sides get the first value, + * and the left and right sides get the second value. + * @param {number} tb the margin for the top and bottom sides + * @param {number} rl the margin for the right and left sides + */ + constructor(tb: number, rl: number); + /** + * If there are four arguments, the numbers represent: top, right, bottom, left. + * @param {number} t the margin for the top side; + * if not supplied, all sides are zero. + * @param {number} r the margin for the right side; + * if not supplied, all sides have the value of the first argument. + * @param {number} b the margin for all bottom side; + * if not supplied, the top and bottom get the value of the first argument, + * and the right and left sides get the value of the second argument. + * @param {number} l the margin for the left side; + * must be supplied if the third argument was supplied. + */ + constructor(t: number, r: number, b: number, l: number); + + /**Gets or sets the bottom value of this margin.*/ + bottom: number; + + /**Gets or sets the left value of this margin.*/ + left: number; + + /**Gets or sets the right value of this margin.*/ + right: number; + + /**Gets or sets the top value of this margin.*/ + top: number; + + /** + * Create a copy of this Margin, with the same values. + */ + copy(): Margin; + + /** + * Indicates whether the given Margin is equal to this Margin. + * @param {Margin} m The Margin to compare to this Margin. + */ + equals(m: Margin): boolean; + + /** + * Indicates whether the given margin is equal to this Margin. + * @param {number} t top. + * @param {number} r right. + * @param {number} b bottom. + * @param {number} l left. + */ + equalTo(t: number, r: number, b: number, l: number): boolean; + + /** + * True if this Margin has values that are real numbers and not infinity. + */ + isReal(): boolean; + + /** + * This static function can be used to read in a Margin from a string that was produced by Margin.stringify. + * @param {string} str + */ + static parse(str: string): Margin; + + /** + * Modify this Margin so that its Top, Right, Bottom, and Left values are the same as the given Margin. + * @param {Margin} m the Margin whose values are to be copied + */ + set(m: Margin): Margin; + + /** + * Modify this Size with new Width and Height values. + * @param {number} w the width. + * @param {number} h the height. + */ + setTo(t: number, r: number, b: number, l: number): Margin; + + /** + * This static function can be used to write out a Margin as a string that can be read by Margin.parse. + * @param {Margin} val + */ + static stringify(val: Margin): string; + + equalsApprox(m: Margin): boolean; // undocumented + } + + /** + * A PathFigure represents a section of a Geometry. + * It is a single connected series of + * two-dimensional geometric PathSegments. + */ + class PathFigure { + /** + * Constructs an empty figure. + * The optional arguments specify the starting point of the figure. + * You'll want to add a new instance of a PathFigure to the + * Geometry.figures list of a Geometry. + * @param {number=} sx optional: the X coordinate of the start point (default is zero). + * @param {number=} sy optional: the Y coordinate of the start point (default is zero). + * @param {boolean=} filled optional: whether the figure is filled (default is true). + * @param {boolean=} shadowed optional: whether the figure may be drawn with a shadow (default is true). + */ + constructor(sx?: number, sy?: number, filled?: boolean, shadowed?: boolean); + + /**Gets or sets whether this PathFigure is drawn filled.*/ + isFilled: boolean; + + /**Gets or sets whether this PathFigure will render a shadow if one is defined.*/ + isShadowed: boolean; + + /**Gets or sets the List of PathSegments that define this PathFigure.*/ + segments: List<PathSegment>; + + /**Gets or sets the starting point X coordinate of the PathFigure.*/ + startX: number; + + /**Gets or sets the starting point Y coordinate of the PathFigure.*/ + startY: number; + + /** + * Add a PathSegment to the segments list. + * @param {PathSegment} segment a newly allocated unshared PathSegment that will become owned by this PathFigure + * @return {PathFigure} this + */ + add(segment: PathSegment): PathFigure; + + /** + * Create a copy of this PathFigure, with the same values and segments. + */ + copy(): PathFigure; + + equalsApprox(f: PathFigure): boolean; // undocumented + } + + /** + * A PathSegment represents a straight line or curved segment of a path between + * two or more points that are part of a PathFigure. + * A PathSegment must not be modified once its containing PathFigure's + * Geometry has been assigned to a Shape. + */ + class PathSegment { + /** + * Constructs a segment that goes nowhere unless you specify some Points. + * @param {EnumValue} type + * @param {number=} ex optional: the X coordinate of the end point. + * @param {number=} ey optional: the Y coordinate of the end point. + * @param {number=} x1 optional: the X coordinate of the first bezier control point. + * @param {number=} y1 optional: the Y coordinate of the first bezier control point. + * @param {number=} x2 optional: the X coordinate of the second cubic bezier control point. + * @param {number=} y2 optional: the Y coordinate of the second cubic bezier control point, + * or the large-arc-flag of an SvgArc. + * @param {boolean=} clockwise optional: whether an SvgArc goes clockwise or counterclockwise. + */ + constructor(type: EnumValue, ex?: number, ey?: number, x1?: number, y1?: number, x2?: number, y2?: number, clockwise?: boolean); + + /**Gets or sets the center X value of the Arc for a PathSegment of type .Arc.*/ + centerX: number; + + /**Gets or sets the center Y value of the Arc for a PathSegment of type .Arc.*/ + centerY: number; + + /**Gets or sets the X coordinate of the end point for all kinds of PathSegment.*/ + endX: number; + + /**Gets or sets the Y coordinate of the end point for all kinds of PathSegment.*/ + endY: number; + + /**Gets or sets the sweep-flag for a PathSegment of type .SvgArc.*/ + isClockwiseArc: boolean; + + /**Gets or sets whether the path is closed after this PathSegment.*/ + isClosed: boolean; + + /**Gets or sets the large-arc-flag for a PathSegment of type .SvgArc.*/ + isLargeArc: boolean; + + /**Gets or sets the X value of the first control point for a PathSegment of type .Bezier or .QuadraticBezier.*/ + point1X: number; + + /**Gets or sets the Y value of the first control point for a PathSegment of type .Bezier or .QuadraticBezier.*/ + point1Y: number; + + /**Gets or sets the X value of the second control point for a PathSegment of type cubic .Bezier.*/ + point2X: number; + + /**Gets or sets the Y value of the second control point for a PathSegment of type cubic .Bezier.*/ + point2Y: number; + + /**Gets or sets the X value of the radius for a PathSegment of type .Arc.*/ + radiusX: number; + + /**Gets or sets the Y value of the radius for a PathSegment of type .Arc.*/ + radiusY: number; + + /**Gets or sets the starting angle for a PathSegment of type .Arc.*/ + startAngle: number; + + /**Gets or sets the length of angle in degrees, or amount of arc to "sweep" for a PathSegment of type .Arc.*/ + sweepAngle: number; + + /**Gets or sets the type of the PathSegment.*/ + type: EnumValue; + + /**Gets or sets the X-axis rotation for a PathSegment of type .SvgArc.*/ + xAxisRotation: number; + + /** + * Closes the path after this PathSegment. + */ + close(): PathSegment; + + /** + * Makes a copy of this PathSegment. + */ + copy(): PathSegment; + + /**For drawing an arc segment, a value for PathSegment.type.*/ + static Arc: EnumValue; + + /**For drawing a cubic bezier segment, a value for PathSegment.type.*/ + static Bezier: EnumValue; + + /**For drawing a straight line segment, a value for PathSegment.type.*/ + static Line: EnumValue; + + /**For beginning a new subpath, a value for PathSegment.type.*/ + static Move: EnumValue; + + /**For drawing a quadratic bezier segment, a value for PathSegment.type.*/ + static QuadraticBezier: EnumValue; + + /**For drawing an SVG arc segment, a value for PathSegment.type.*/ + static SvgArc: EnumValue; + + equalsApprox(s: PathSegment): boolean; // undocumented + } + + /** + * A Point represents an x- and y-coordinate pair in two-dimensional space. + */ + class Point { + /** + * The default constructor produces the Point(0,0). + */ + constructor(); + + /** + * The two-argument constructor produces the Point(x, y). + * @param {number} x + * @param {number} y + */ + constructor(x: number, y: number); + + /**Gets or sets the x value of the Point.*/ + x: number; + + /**Gets or sets the y value of the Point.*/ + y: number; + + /** + * Modify this point so that is the sum of the current Point and the + * x and y co-ordinates of the given Point. + * @param {Point} p The Point to add to this Point. + */ + add(p: Point): Point; + + /** + * Create a copy of this Point, with the same values. + */ + copy(): Point; + + /** + * This static function returns the angle in degrees of the line from point P to point Q. + * @param {number} px + * @param {number} py + * @param {number} qx + * @param {number} qy + */ + static direction(px: number, py: number, qx: number, qy: number): number; + + /** + * Compute the angle from this Point to a given (px,py) point. + * However, if the point is the same as this Point, the direction is zero. + * @param {number} px + * @param {number} py + */ + direction(px: number, py: number): number; + + /** + * Compute the angle from this Point to a given Point. + * However, if the given Point is the same as this Point, the direction is zero. + * @param {Point} p the other Point to which to measure the relative angle. + */ + directionPoint(p: Point): number; + + /** + * This static function returns the square of the distance from the point P + * to the finite line segment from point A to point B. + * @param {number} px + * @param {number} py + * @param {number} ax + * @param {number} ay + * @param {number} bx + * @param {number} by + */ + static distanceLineSegmentSquared(px: number, py: number, ax: number, ay: number, bx: number, by: number): number; + + /** + * Returns the square of the distance from this point to a given point (px, py). + * @param {number} px + * @param {number} py + */ + distanceSquared(px: number, py: number): number; + + /** + * This static function returns the square of the distance from the point P to the point Q. + * @param {number} px + * @param {number} py + * @param {number} qx + * @param {number} qy + */ + static distanceSquared(px: number, py: number, qx: number, qy: number): number; + + /** + * Returns the square of the distance from this Point to a given Point. + * @param {Point} p the other Point to measure to. + */ + distanceSquaredPoint(p: Point): number; + + /** + * Indicates whether the given Point is equal to this Point. + * @param {Point} p The Point to compare to the current Point. + * false otherwise. + */ + equals(p: Point): boolean; + + /** + * Indicates whether the given point (x, y) is equal to this Point. + * @param {number} x + * @param {number} y + * false otherwise. + */ + equalTo(x: number, y: number): boolean; + + /** + * True if this Point has X and Y values that are real numbers and not infinity. + */ + isReal(): boolean; + + /** + * Modify this Point so that its X and Y values have been normalized to a unit length. + * However, if this Point is the origin (zero, zero), its length remains zero. + */ + normalize(): Point; + + /** + * Modify this point by shifting its values with the given DX and DY offsets. + * @param {number} dx + * @param {number} dy + */ + offset(dx: number, dy: number): Point; + + /** + * This static function can be used to read in a Point from a string that was produced by Point.stringify. + * @param {string} str + */ + static parse(str: string): Point; + + /** + * Modify this point to be the closest point to this point that is on a finite line segment given by (px,py) and (qx,qy). + * @param {number} px + * @param {number} py + * @param {number} qx + * @param {number} qy + */ + projectOntoLineSegment(px: number, py: number, qx: number, qy: number): Point; + + /** + * Modify this point to be the closest point to this point that is on a finite line segment given by P and Q. + * @param {Point} p + * @param {Point} q + */ + projectOntoLineSegmentPoint(p: Point, q: Point): Point; + + /** + * Modify this Point so that has been rotated about the origin by the given angle. + * @param {number} angle an angle in degrees. + */ + rotate(angle: number): Point; + + /** + * Modify this Point so that its X and Y values have been scaled by given factors along the X and Y axes. + * @param {number} sx + * @param {number} sy + */ + scale(sx: number, sy: number): Point; + + /** + * Modify this Point so that its X and Y values are the same as the given Point. + * @param {Point} p the given Point. + */ + set(p: Point): Point; + + /** + * Modify this Point so that its X and Y values correspond to a particular Spot + * in a given Rect. + * The result is meaningless if Spot.isNoSpot is true for the given Spot. + * @param {Rect} r the Rect for which we are finding the point. + * @param {Spot} spot the Spot; Spot.isSpot must be true for this Spot. + */ + setRectSpot(r: Rect, spot: Spot): Point; + + /** + * Modify this Point so that its X and Y values correspond to a particular Spot + * in a given rectangle. + * The result is meaningless if Spot.isNoSpot is true for the given Spot. + * @param {number} x The X coordinate of the Rect for which we are finding the point. + * @param {number} y The Y coordinate of the Rect for which we are finding the point. + * @param {number} w The Width of the Rect for which we are finding the point. + * @param {number} h The Height of the Rect for which we are finding the point. + * @param {Spot} spot the Spot; Spot.isSpot must be true for this Spot. + */ + setSpot(x: number, y: number, w: number, h: number, spot: Spot): Point; + + /** + * Modify this Point with new X and Y values. + * @param {number} x + * @param {number} y + */ + setTo(x: number, y: number): Point; + + /** + * Modify this point to be at the nearest point on an infinite grid, + * given the grid's origin and size of each grid cell. + * @param {number} originx + * @param {number} originy + * @param {number} cellwidth + * @param {number} cellheight + */ + snapToGrid(originx: number, originy: number, cellwidth: number, cellheight: number): Point; + + /** + * Modify this point to be at the nearest point on an infinite grid, + * given the grid's origin and size of each grid cell. + * @param {Point} origin + * @param {Size} cellsize + */ + snapToGridPoint(origin: Point, cellsize: Size): Point; + + /** + * This static function can be used to write out a Point as a string that can be read by Point.parse. + * @param {Point} val + */ + static stringify(val: Point): string; + + /** + * Modify this point so that is the difference of this Point and the + * x and y co-ordinates of the given Point. + * @param {Point} p The Point to subtract from the current Point. + */ + subtract(p: Point): Point; + + equalsApprox(p: Point): boolean; // undocumented + } + + /** + * A Rect describes a rectangular two-dimensional area as a top-left point (x and y values) + * and a size (width and height values). + */ + class Rect { + /** + * The default constructor (no argument) results in a Rect(0,0,0,0). + */ + constructor(); + + /** + * The constructor taking two Points produces a Rect that spans both points. + * @param {Point} tl Top-left Point + * @param {Point} br Bottom-right Point + */ + constructor(tl: Point, br: Point); + + /** + * The constructor taking a Point and a Size produces a Rect at that point with that size. + * @param {Point} tl Top-left Point + * @param {Point} sz Size + */ + constructor(tl: Point, sz: Size); + + /** + * The four-argument constructor takes four numbers for the x, y, width, height. + * @param {number} x Top-left x value. + * @param {number} y Top-left y value. + * @param {number} w Width to be used; must be non-negative. + * @param {number} h Height to be used; must be non-negative. + */ + constructor(x: number, y: number, w: number, h: number); + + /**Gets or sets the y-axis value of the bottom of the Rect.*/ + bottom: number; + + /**Gets or sets the Point at the center of this Rect.*/ + center: Point; + + /**Gets or sets the horizontal center X coordinate of the Rect.*/ + centerX: number; + + /**Gets or sets the vertical center Y coordinate of the Rect.*/ + centerY: number; + + /**Gets or sets the height of the Rect.*/ + height: number; + + /**Gets or sets the leftmost value of the Rect.*/ + left: number; + + /**Gets or sets the x- and y-axis position of the Rect as a Point.*/ + position: Point; + + /**Gets or sets the x-axis value of the right of the Rect.*/ + right: number; + + /**Gets or sets the width and height of the Rect as a Size.*/ + size: Size; + + /**Gets or sets the topmost value of the Rect.*/ + top: number; + + /**Gets or sets the width of the Rect.*/ + width: number; + + /**Gets or sets the top-left x coordinate of the Rect.*/ + x: number; + + /**Gets or sets the top-left y coordinate of the Rect.*/ + y: number; + + /** + * Modify this Rect by adding the given Margin to each side of the Rect. + * @param {Margin} m The Margin to add to the Rect. + */ + addMargin(m: Margin): Rect; + + /** + * Indicates whether this Rect contains the given Point/Rect. + * @param {number} x The X coordinate of the Point or Rect to include in the new bounds. + * @param {number} y The Y coordinate of the Point or Rect to include in the new bounds. + * @param {number=} w The Width of the Rect to include in the new bounds, defaults to zero. + * @param {number=} h The Height of the Rect to include in the new bounds, defaults to zero. + * false otherwise. + */ + contains(x: number, y: number, w?: number, h?: number): boolean; + + /** + * This static function indicates whether a Rect contains the given Point/Rect. + * @param {number} rx The X coordinate of a Rect. + * @param {number} ry The Y coordinate of a Rect. + * @param {number} rw The Width of a Rect. + * @param {number} rh The Height of a Rect. + * @param {number} x The X coordinate of the Point or Rect that might be in the bounds (RX, RY, RW, RH). + * @param {number} y The Y coordinate of the Point or Rect that might be in the bounds (RX, RY, RW, RH). + * @param {number=} w The Width of the Rect to include in the new bounds, defaults to zero. + * @param {number=} h The Height of the Rect to include in the new bounds, defaults to zero. + * false otherwise. + */ + static contains(rx: number, ry: number, rw: number, rh: number, x: number, y: number, w?: number, h?: number): boolean; + + /** + * Indicates whether this Rect contains the given Point. + * @param {Point} p The Point to check. + * false otherwise. + */ + containsPoint(p: Point): boolean; + + /** + * Indicates whether this Rect contains the given Rect. + * @param {Rect} r The Rect to check. + * false otherwise. + */ + containsRect(r: Rect): boolean; + + /** + * Create a copy of this Rect, with the same values. + */ + copy(): Rect; + + /** + * Indicates whether the given Rect is equal to the current Rect. + * @param {Rect} r The rectangle to compare to the current rectangle. + * and height. + */ + equals(r: Rect): boolean; + + /** + * Indicates whether the given Rect is equal to the current Rect. + * @param {number} x + * @param {number} y + * @param {number} w the width. + * @param {number} h the height. + */ + equalTo(x: number, y: number, w: number, h: number): boolean; + + /** + * Modifies this Rect by adding some distance to each side of the Rect. + * @param {number} t the amount to move the top side upwards; may be negative. + * @param {number} r the amount to move the right side rightwards; may be negative. + * @param {number} b the amount to move the bottom side downwards; may be negative. + * @param {number} l the amount to move the left side leftwards; may be negative. + */ + grow(t: number, r: number, b: number, l: number): Rect; + + /** + * Modify this Rect so that its width and height are changed on all four sides, + * equally on the left and right sides, and equally on the top and bottom sides. + * When the arguments are negative, this operation deflates this Rect, but not beyond zero. + * @param {number} w The additional width on each side, left and right; may be negative. + * @param {number} h The additional height on each side, top and bottom; may be negative. + */ + inflate(w: number, h: number): Rect; + + /** + * Modify this Rect so that it is the intersection of this Rect and the rectangle + * defined by x, y, w, h. + * @param {number} x + * @param {number} y + * @param {number} w + * @param {number} h + */ + intersect(x: number, y: number, w: number, h: number): Rect; + + /** + * Modify this Rect so that it is the intersection of this Rect and the given Rect. + * @param {Rect} r Rect to intersect with. + */ + intersectRect(r: Rect): Rect; + + /** + * This static function indicates whether a Rect partly or wholly overlaps the given Rect. + * @param {number} rx The X coordinate of a Rect. + * @param {number} ry The Y coordinate of a Rect. + * @param {number} rw The Width of a Rect. + * @param {number} rh The Height of a Rect. + * @param {number} x The X coordinate of the Point or Rect that might overlap the bounds (RX, RY, RW, RH). + * @param {number} y The Y coordinate of the Point or Rect that might overlap the bounds (RX, RY, RW, RH). + * @param {number} w + * @param {number} h + */ + static intersects(rx: number, ry: number, rw: number, rh: number, x: number, y: number, w: number, h: number): boolean; + + /** + * Determine if this Rect partly or wholly overlaps the rectangle + * defined by x, y, w, h. + * @param {number} x + * @param {number} y + * @param {number} w + * @param {number} h + */ + intersects(x: number, y: number, w: number, h: number): boolean; + + /** + * Determine if a given Rect is partly or wholly inside of this Rect. + * @param {Rect} r Rect to test intersection with. + */ + intersectsRect(r: Rect): boolean; + + /** + * True if this Rect has a Width and Height of zero. + */ + isEmpty(): boolean; + + /** + * True if this Rect has X, Y, Width, and Height values that are real numbers and not infinity. + */ + isReal(): boolean; + + /** + * Modify this Rect by shifting its values with the given DX and DY offsets. + * @param {number} dx + * @param {number} dy + */ + offset(dx: number, dy: number): Rect; + + /** + * This static function can be used to read in a Rect from a string that was produced by Rect.stringify. + * @param {string} str + */ + static parse(str: string): Rect; + + /** + * Modify this Rect so that its X, Y, Width, and Height values are the same as the given Rect. + * @param {Rect} r the given Rect. + */ + set(r: Rect): Rect; + + /** + * Modify this Rect so that its X and Y values are the same as the given Point. + * @param {Point} p the given Point. + */ + setPoint(p: Point): Rect; + + /** + * Modify this Rect so that its Width and Height values are the same as the given Size. + * @param {Size} s the given Size. + */ + setSize(s: Size): Rect; + + /** + * Modify this Rect so that a given Spot is at a given (x,y) point using this Rect's size. + * Return this rectangle for which the spot is at that point, without modifying the size. + * The result is meaningless if Spot.isNoSpot is true. + * @param {number} x the point where the spot should be. + * @param {number} y the point where the spot should be. + * @param {Spot} spot a Spot; Spot.isSpot must be true. + */ + setSpot(x: number, y: number, spot: Spot): Rect; + + /** + * Modify this Rect with new X, Y, Width, and Height values. + * @param {number} x + * @param {number} y + * @param {number} w the width. + * @param {number} h the height. + */ + setTo(x: number, y: number, w: number, h: number): Rect; + + /** + * This static function can be used to write out a Rect as a string that can be read by Rect.parse. + * @param {Rect} val + */ + static stringify(val: Rect): string; + + /** + * Modify this Rect by subtracting the given Margin from each side of the Rect. + * @param {Margin} m The Margin to subtract from the Rect. + */ + subtractMargin(m: Margin): Rect; + + /** + * Modify this Rect to be exactly big enough to contain both the original Rect and the given rectangular area. + * @param {number} x The X coordinate of the Point or Rect to include in the new bounds. + * @param {number} y The Y coordinate of the Point or Rect to include in the new bounds. + * @param {number=} w The Width of the Rect to include in the new bounds, defaults to zero. + * @param {number=} h The Height of the Rect to include in the new bounds, defaults to zero. + */ + union(x: number, y: number, w?: number, h?: number): Rect; + + /** + * Modify this Rect to be exactly big enough to contain both the original Rect and the given Point. + * @param {Point} p The Point to include in the new bounds. + */ + unionPoint(p: Point): Rect; + + /** + * Modify this Rect to be exactly big enough to contain this Rect and the given Rect. + * + * @param {Rect} r The Rect to include in the new bounds. + */ + unionRect(r: Rect): Rect; + + equalsApprox(r: Rect): boolean; // undocumented + } + + /** + * A Size describes a width and a height in two-dimensional coordinates. + * The width and height must both be non-negative. + */ + class Size { + /** + * The default constructor produces the Size(0,0). + */ + constructor(); + + /** + * The two-argument constructor produces the Size(w,h). + * @param {number} w this number must not be negative. + * @param {number} h this number must not be negative. + */ + constructor(w: number, h: number); + + /**Gets or sets the height value of the Size.*/ + height: number; + + /**Gets or sets the width value of the Size.*/ + width: number; + + /** + * Create a copy of this Size, with the same values. + */ + copy(): Size; + + /** + * Indicates whether the given Size is equal to the current Size. + * @param {Size} s The Size to compare to the current Size. + * false otherwise. + */ + equals(s: Size): boolean; + + /** + * Indicates whether the given size is equal to this Size. + * @param {number} w the width. + * @param {number} h the height. + * false otherwise. + */ + equalTo(w: number, h: number): boolean; + + /** + * True if this Size has Width and Height values that are real numbers and not infinity. + */ + isReal(): boolean; + + /** + * This static function can be used to read in a Size from a string that was produced by Size.stringify. + * @param {string} str + */ + static parse(str: string): Size; + + /** + * Modify this Size so that its Width and Height values are the same as the given Size. + * @param {Size} s the given Size. + */ + set(s: Size): Size; + + /** + * Modify this Size with new Width and Height values. + * @param {number} w the width. + * @param {number} h the height. + */ + setTo(w: number, h: number): Size; + + /** + * This static function can be used to write out a Size as a string that can be read by Size.parse. + * @param {Size} val + */ + static stringify(val: Size): string; + + equalsApprox(s: Size): boolean; // undocumented + } + + /** + * A Spot represents a relative point from(0, 0) to(1, 1) within the bounds of + * a rectangular area plus an absolute offset. + */ + class Spot { + /** + * The default constructor produces the Spot(0, 0, 0, 0), at the top-left corner. + */ + constructor(); + + /** + * The two-argument constructor produces the Spot(x, y), where X and Y are fractional distances, between zero and one. + * @param {number} x must be between zero and one, inclusive. + * @param {number} y must be between zero and one, inclusive. + */ + constructor(x: number, y: number); + + /** + * The four-argument constructor produces the Spot(x, y, offx, offy), where X and Y are fractional distances, between zero and one, and OFFX and OFFY are additional absolute offsets. + * @param {number} x must be between zero and one, inclusive. + * @param {number} y must be between zero and one, inclusive. + * @param {number} offx an offset along the X coordinates, may be negative. + * @param {number} offy an offset along the Y coordinates, may be negative. + */ + constructor(x: number, y: number, offx: number, offy: number); + + /**Gets or sets the offsetX value of the Spot.*/ + offsetX: number; + + /**Gets or sets the offsetY value of the Spot.*/ + offsetY: number; + + /**Gets or sets the x value of the Spot, a fractional value between zero and one.*/ + x: number; + + /**Gets or sets the y value of the Spot, a fractional value between zero and one.*/ + y: number; + + /** + * Create a copy of this Spot, with the same values. + */ + copy(): Spot; + + /** + * Two spots are equal if all four property values are the same. + * @param {Spot} spot The Spot to compare to the current Spot. + */ + equals(spot: Spot): boolean; + + /** + * This predicate is true if this Spot is a side that + * includes the side(s) given by the argument Spot. + * @param {Spot} side + */ + includesSide(side: Spot): boolean; + + /** + * True if this is a special spot referring to the default spot. + */ + isDefault(): boolean; + + /** + * True if this is an unspecific special spot, such as Spot.None or one of the sides. + */ + isNoSpot(): boolean; + + /** + * True if this is a special spot referring to one (or more) of the sides. + */ + isSide(): boolean; + + /** + * True if this is a specific spot, not a side nor Spot.None. + */ + isSpot(): boolean; + + /** + * Return a new spot that is opposite this spot. + */ + opposite(): Spot; + + /** + * This static function can be used to read in a Spot from a string that was produced by Spot.stringify. + * @param {string} str + */ + static parse(str: string): Spot; + + /** + * Modify this Spot so that its X, Y, OffsetX, and OffsetY values are the same as the given Spot. + * @param {Spot} s the given Spot. + */ + set(s: Spot): Spot; + + /** + * Modify this Spot with new X, Y, OffsetX, and OffsetY values. + * @param {number} x + * @param {number} y + * @param {number} offx + * @param {number} offy + */ + setTo(x: number, y: number, offx: number, offy: number): Spot; + + /** + * This static function can be used to write out a Spot as a string that can be read by Spot.parse. + * @param {Spot} val + */ + static stringify(val: Spot): string; + + /**The set of points on all sides of the bounding rectangle.*/ + static AllSides: Spot; + + /**A synonym for Spot.BottomCenter.*/ + static Bottom: Spot; + + /**The specific point at the middle of the bottom side of bounding rectangle.*/ + static BottomCenter: Spot; + + /**The specific point at the bottom-left corner of the bounding rectangle.*/ + static BottomLeft: Spot; + + /**The set of points at the left or bottom sides of the bounding rectangle.*/ + static BottomLeftSides: Spot; + + /**The specific point at the bottom-right corner of the bounding rectangle.*/ + static BottomRight: Spot; + + /**The set of points at the right or bottom sides of the bounding rectangle.*/ + static BottomRightSides: Spot; + + /**The set of points at the bottom side of the bounding rectangle.*/ + static BottomSide: Spot; + + /**The specific point at the very center of the bounding rectangle.*/ + static Center: Spot; + + /**Use this value to indicate that the real spot value is inherited from elsewhere.*/ + static Default: Spot; + + /**A synonym for Spot.LeftCenter.*/ + static Left: Spot; + + /**The specific point at the middle of the left side of bounding rectangle.*/ + static LeftCenter: Spot; + + /**The set of points at the left or right sides of the bounding rectangle.*/ + static LeftRightSides: Spot; + + /**The set of points at the left side of the bounding rectangle.*/ + static LeftSide: Spot; + + /**A synonym for Spot.BottomCenter.*/ + static MiddleBottom: Spot; + + /**A synonym for Spot.LeftCenter.*/ + static MiddleLeft: Spot; + + /**A synonym for Spot.RightCenter.*/ + static MiddleRight: Spot; + + /**A synonym for Spot.TopCenter.*/ + static MiddleTop: Spot; + + /**Use this Spot value to indicate no particular spot -- code looking for a particular point on an element will need to do their own calculations to determine the desired point depending on the circumstances.*/ + static None: Spot; + + /**The set of points on all sides of bounding rectangle except bottom side.*/ + static NotBottomSide: Spot; + + /**The set of points on all sides of the bounding rectangle except left side.*/ + static NotLeftSide: Spot; + + /**The set of points on all sides of the bounding rectangle except right side.*/ + static NotRightSide: Spot; + + /**The set of points on all sides of the bounding rectangle except top side.*/ + static NotTopSide: Spot; + + /**A synonym for Spot.RightCenter.*/ + static Right: Spot; + + /**The specific point at the middle of the right side of bounding rectangle.*/ + static RightCenter: Spot; + + /**The set of points at the right side of the bounding rectangle.*/ + static RightSide: Spot; + + /**A synonym for Spot.TopCenter.*/ + static Top: Spot; + + /**The set of points at the top or bottom sides of the bounding rectangle.*/ + static TopBottomSides: Spot; + + /**The specific point at the center of the top side of the bounding rectangle.*/ + static TopCenter: Spot; + + /**The specific point at the top-left corner of the bounding rectangle.*/ + static TopLeft: Spot; + + /**The set of points at the top or left sides of the bounding rectangle.*/ + static TopLeftSides: Spot; + + /**The specific point at the top-right corner of the bounding rectangle.*/ + static TopRight: Spot; + + /**The set of points at the top or right sides of the bounding rectangle.*/ + static TopRightSides: Spot; + + /**The set of points at the top side of the bounding rectangle.*/ + static TopSide: Spot; + } + + + /** + * A Binding describes how to automatically set a property on a GraphObject + * to a value of a property of data in the model. + * The target property name and the data source property name are strings. + * All name matching is case-sensitive. + */ + class Binding { + /** + * The constructor creates an empty one-way binding. + * @param {string=} targetprop A string naming the target property on the target object. + * If this is the empty string or not supplied, the whole GraphObject is used in the call to the conversion function, + * which should modify the GraphObject directly. + * @param {string=} sourceprop A string naming the source property on the bound data object. + * If this is the empty string, the whole Panel.data object is used. + * If this argument is not supplied, the source property is assumed to be the same as the target property. + * @param {function(*,*=) | null=} conv A function converting the data property value to the value to set the target property. + * If the function is null or not supplied, no conversion takes place. + */ + constructor(targetprop?: string, sourceprop?: string, conv?: (a: any, b: any) => any); + + /** + * Gets or sets a converter function to apply to the GraphObject property value + * in order to produce the value to set to a data property. + * This conversion function is only used in a TwoWay binding, + * when transferring a value from the target to the source. + * The default value is null -- no conversion takes place. + * Otherwise the value should be a function that takes one or two arguments + * and returns the desired value. + * However, the return value is ignored when the .sourceProperty + * is the empty string. + * The function is passed the value from the target + * (the first argument) and the source Panel.data object (the second argument). + * If the .sourceProperty is a property name, that property is set to + * the function's return value. + * If the .sourceProperty is the empty string, the function should + * modify the second argument, which will be the source data object. + */ + backConverter: (a: any, b: any) => any; + + /** + * Gets or sets a converter function to apply to the data property value + * in order to produce the value to set to the target property. + * This conversion function is used in both OneWay and TwoWay bindings, + * when transferring a value from the source to the target. + * The default value is null -- no conversion takes place. + * Otherwise the value should be a function that takes one or two arguments + * and returns the desired value. + * However, the return value is ignored when the .targetProperty + * is the empty string. + * The function is passed the value from the source + * (the first argument) and the target GraphObject (the second argument). + * If the .targetProperty is a property name, that property is set to + * the function's return value. + * If the .targetProperty is the empty string, the function should + * modify the second argument, which will be the target object. + */ + converter: (a: any, b: any) => any; + + /** + * Gets or sets the directions and frequency in which the binding may be evaluated. + * The default value is Binding.OneWay. + * Binding.TwoWay is the other choice. + * Use OneWay bindings to initialize GraphObject properties based on model data, + * or to modify GraphObject properties when the model data changes will a call to Model.setDataProperty. + * Use TwoWay bindings to keep model data in sync with changes to GraphObject properties. + * For efficiency, avoid TwoWay bindings on GraphObject properties that do not change value in your app. + * You should not have a TwoWay binding on a node data object's key property. + */ + mode: EnumValue; + + /** + * Gets or sets the name of the GraphObject that should act as a source object + * whose property should be gotten by this data binding. + * The default value is null, which uses the bound Panel.data as the source. + * If the value is a string, it should be the name of a GraphObject in the + * visual tree of the Panel that is bound to the data. + * Use the empty string to refer to the root panel. + */ + sourceName: string; + + /** + * Gets or sets the name of the property to get from the bound data object, + * the value of Panel.data. + * The default value is the empty string, which results in setting the target + * property to the whole data object, rather than to a property value of the data object. + */ + sourceProperty: string; + + /** + * Gets or sets the name of the property to be set on the target GraphObject. + * The default value is the empty string; you normally set this to be the name of a property. + */ + targetProperty: string; + + /** + * Modify this Binding to set its .mode to be Binding.TwoWay, and + * provide an optional conversion function to convert GraphObject property + * values back to data values. + * Use TwoWay bindings to keep model data in sync with changes to GraphObject properties. + * For efficiency, avoid TwoWay bindings on GraphObject properties that do not change value in your app. + * You should not have a TwoWay binding on a node data object's key property. + * @param {function(*,*=) | null=} backconv + */ + makeTwoWay(backconv?: (a: any, b: any) => any): Binding; + + /** + * Modify this Binding to set its .sourceName property so as to identify + * a GraphObject in the visual tree of the bound Panel. + * @param {string=} srcname the GraphObject.name of an element in the visual tree of the bound Panel; + * use an empty string to refer to the root panel of that visual tree. + */ + ofObject(srcname?: string): Binding; + + /** + * This static function can be used to create a function that parses + * a string into an enumerated value, given the class that the enumeration values + * are defined on and a default value if the string cannot be parsed successfully. + * The normal usage is to pass the result of this function as the conversion function of a Binding. + * This binding will try to parse the string that is the value of the bound data's "dataPropName" property. + * If it is a legitimate enumerated value defined on the Link class, the conversion + * function will return that value. + * If the bound data's "dataPropName" property is not present or has an unrecognized value, + * the Link.routing property gets the default value, Link.Normal. + * @param {function()} ctor the class constructor that defines the enumerated values that are being parsed. + * @param {EnumValue} defval the default enumerated value to return if it fails to parse the given string. + */ + static parseEnum(ctor: Constructor, defval: EnumValue): (a: string) => EnumValue; + + /** + * This static function can be used to convert an object to a string, + * looking for commonly defined data properties, such as "text", "name", "key", or "id". + * If none are found, this just calls toString() on it. + * @param {*} val + */ + static toString(val: any): string; + + /**This value for Binding.mode uses data source values and sets GraphObject properties.*/ + static OneWay: EnumValue; + + /**This value for Binding.mode uses data source values and GraphObject properties and keeps them in sync.*/ + static TwoWay: EnumValue; + + ofModel(): Binding; // undocumented + } + + /** + * A ChangedEvent represents a change to an object, typically a GraphObject, + * but also for model data, a Model, or a Diagram. + * The most common case is for remembering the name of a property + * and the before-and-after values for that property. + * You can listen for changed events on the model using Model.addChangedListener + * and on the Diagram using Diagram.addChangedListener. + */ + class ChangedEvent { + /** + * The ChangedEvent class constructor produces an empty ChangedEvent object. + */ + constructor(); + + /**Gets or sets the nature of change that occurred.*/ + change: EnumValue; + + /**Gets or sets the Diagram that was modified.*/ + diagram: Diagram; + + /**This read-only property is true when this ChangeEvent is of type ChangedEvent.Transaction and represents the end of a transactional change.*/ + isTransactionFinished: boolean; + + /**Gets or sets the Model or TreeModel or GraphLinksModel that was modified.*/ + model: Model; + + /**This read-only property returns the name of the model change, reflecting a change to model data in addition to a change to the model itself.*/ + modelChange: string; + + /**Gets or sets an optional value associated with the new value.*/ + newParam: any; + + /**Gets or sets the next or current value that the property has.*/ + newValue: any; + + /**Gets or sets the Object that was modified.*/ + object: any; + + /**Gets or sets an optional value associated with the old value.*/ + oldParam: any; + + /**Gets or sets the previous or old value that the property had.*/ + oldValue: any; + + /**Gets or sets the name of the property change.*/ + propertyName: PropertyAccessor; + + /** + * This predicate returns true if you can call redo(). + */ + canRedo(): boolean; + + /** + * This predicate returns true if you can call undo(). + */ + canUndo(): boolean; + + /** + * Forget any object references that this ChangedEvent may have. + */ + clear(): void; + + /** + * Make a copy of this ChangedEvent. + */ + copy(): ChangedEvent; + + /** + * This is a convenient method to get the right parameter value, depending on the value of undo, + * when implementing a state change as part of an undo or a redo. + * @param {boolean} undo If true, returns the oldParam, otherwise returns the newParam. + */ + getParam(undo: boolean): any; + + /** + * This is a convenient method to get the right value, depending on the value of undo, + * when implementing a state change as part of an undo or a redo. + * @param {boolean} undo If true, returns the oldValue, otherwise returns the newValue. + */ + getValue(undo: boolean): any; + + /** + * Re-perform this object change after an undo(). + */ + redo(): void; + + /** + * Reverse the effects of this object change. + */ + undo(): void; + + /**For inserting into collections, and used as the value for ChangedEvent.change.*/ + static Insert: EnumValue; + + /**For simple property changes, and used as the value for ChangedEvent.change.*/ + static Property: EnumValue; + + /**For removing from collections, and used as the value for ChangedEvent.change.*/ + static Remove: EnumValue; + + /**For informational events, such as transactions and undo/redo operations, and used as the value for ChangedEvent.change.*/ + static Transaction: EnumValue; + } + + /** + * GraphLinksModels support links between nodes and grouping nodes and links into subgraphs. + * GraphLinksModels hold node data and link data in separate arrays. + * Node data is normally represented in a Diagram by instances of Node, + * but they could be represented by simple Parts or by Groups. + * Link data should be represented by instances of Link. + */ + class GraphLinksModel extends Model { + /** + * This constructs an empty GraphLinksModel unless one provides arguments as the initial data array values for the Model.nodeDataArray and GraphLinksModel.linkDataArray properties. + * @param {Array<Object>=} nodedataarray an optional Array containing JavaScript objects to be represented by Nodes. + * @param {Array<Object>=} linkdataarray an optional Array containing JavaScript objects to be represented by Links. + */ + constructor(nodedataarray?: Array<Object>, linkdataarray?: Array<Object>); + + /** + * Gets or sets a data object that will be copied and added to the model as a new node data each time there + * is a link reference (either the "to" or the "from" of a link data) to a node key that does not yet exist in the model. + * The default value is null -- node data is not automatically copied and added to the model + * when there is an unresolved reference in a link data. + * The value must be an Object or null. + * When adding or modifying a link data if there is a "from" or "to" key value for which Model.findNodeDataForKey returns null, + * it will call Model.copyNodeData on this property value and Model.addNodeData on the result. + */ + archetypeNodeData: any; + + /** + * Gets or sets a function that makes a copy of a link data object. + * You may need to set this property in order to ensure that a copied Link is bound + * to data that does not share certain data structures between the original link data and the copied link data. + * The value may be null in order to cause .copyLinkData to make a shallow copy of a JavaScript Object. + * The default value is null. + */ + copyLinkDataFunction: (obj: Object, model: GraphLinksModel) => Object; + + /** + * Gets or sets the name of the data property that returns a string naming that data's category, + * or a function that takes a link data object and returns that category string; + * the default value is the name 'category'. + * This is used by the diagram to distinguish between different kinds of links. + * The name must not be null. + */ + linkCategoryProperty: PropertyAccessor; + + /**Gets or sets the array of link data objects that correspond to Links in the Diagram; the initial value is an empty Array.*/ + linkDataArray: Array<Object>; + + /** + * Gets or sets the name of the data property that returns + * the key of the node data that the link data is coming from, + * or a function that takes a link data object and returns that key; + * the default value is the name 'from'. + * The name must not be null. + * If the value is an empty string, + * .getFromKeyForLinkData will return undefined for all link data objects. + */ + linkFromKeyProperty: PropertyAccessor; + + /** + * Gets or sets the name of the data property that returns the optional parameter naming a "port" element on the node that the link data is connected from, + * or a function that takes a link data object and returns that string. + * The default value is the empty string indicating that one cannot distinguish + * different logical connection points for any links. + * The name must not be null. + */ + linkFromPortIdProperty: PropertyAccessor; + + /** + * Gets or sets the name of the data property that returns + * an array of keys of node data that are labels on that link data, + * or a function that takes a link data object and returns such an array; + * the default value is the empty string: ''. + * The name must not be null. + * If the value is an empty string, + * .getLabelKeysForLinkData will return an empty array for all link data objects. + * You will need to set this property in order to support nodes as link labels. + */ + linkLabelKeysProperty: PropertyAccessor; + + /** + * Gets or sets the name of the data property that returns + * the key of the node data that the link data is going to, + * or a function that takes a link data object and returns that key; + * the default value is the name 'to'. + * The name must not be null. + */ + linkToKeyProperty: PropertyAccessor; + + /** + * Gets or sets the name of the data property that returns + * the optional parameter naming a "port" element on the node that the link data is connected to, + * or a function that takes a link data object and returns that string. + * The default value is the empty string indicating that one cannot distinguish + * different logical connection points for any links. + * The name must not be null. + */ + linkToPortIdProperty: PropertyAccessor; + + /** + * Gets or sets the name of the property on node data that specifies + * the string or number key of the group data that "owns" that node data, + * or a function that takes a node data object and returns that group key. + * the default value is the name 'group'. + * The value must not be null. + */ + nodeGroupKeyProperty: PropertyAccessor; + + /** + * Gets or sets the name of the boolean property on node data that indicates + * whether the data should be represented as a group of nodes and links or + * as a simple node, + * or a function that takes a node data object and returns true or false; + * the default value is the name 'isGroup'. + * The value must not be null. + */ + nodeIsGroupProperty: PropertyAccessor; + + /** + * Adds a node key value that identifies a node data acting as a new label node on the given link data. + * This method only works if .linkLabelKeysProperty has been set to something other than an empty string. + * @param {Object} linkdata a JavaScript object representing a link. + * @param {string|number} key a number or string that is the key of the new label node. + */ + addLabelKeyForLinkData(linkdata: Object, key: Key): void; + + /** + * When you want to add a link to the diagram, call this method with a new data object. + * This will add that data to the .linkDataArray and + * notify all listeners that a new link data object has been inserted into the collection. + * Presumably the link data object will already have its "from" and "to" node key references set, + * but it is also possible to set them after the link data is in the model + * by calling .setFromKeyForLinkData and .setToKeyForLinkData. + * This operation does nothing if the link data is already part of this model's .linkDataArray. + * @param {Object} linkdata a JavaScript object representing a link. + */ + addLinkData(linkdata: Object): void; + + /** + * Add to this model all of the link data held in an Array or in an Iterable of link data objects. + * @param {Iterable<Object>|Array<Object>} coll a collection of link data objects to add to the .linkDataArray + */ + addLinkDataCollection(coll: Iterable<Object> | Array<Object>): void; + + /** + * Decide if a given link data is in this model. + * @param {Object} linkdata a JavaScript object representing a link. + */ + containsLinkData(linkdata: Object): boolean; + + /** + * Make a copy of a link data object. + * This uses the value of .copyLinkDataFunction to actually perform the copy, + * unless it is null, in which case this method just makes a shallow copy of the JavaScript Object. + * This does not modify the model -- the returned data object is not added to this model. + * This assumes that the data's constructor can be called with no arguments. + * This also makes sure there is no reference to either the "from" or the "to" node of the original data. + * @param {Object} linkdata a JavaScript object representing a link. + */ + copyLinkData(linkdata: Object): Object; + + /** + * Find the category of a given link data, a string naming the link template + * that the Diagram should use to represent the link data. + * @param {Object} linkdata a JavaScript object representing a link. + */ + getCategoryForLinkData(linkdata: Object): string; + + /** + * From a link data retrieve a value uniquely identifying the node data + * from which this link is connected. + * @param {Object} linkdata a JavaScript object representing a link. + */ + getFromKeyForLinkData(linkdata: Object): Key; + + /** + * From a link data retrieve a value identifying the port object of the node + * from which this link is connected. + * @param {Object} linkdata a JavaScript object representing a link. + */ + getFromPortIdForLinkData(linkdata: Object): string; + + /** + * If there is a container group for the given node data, return the group's key. + * @param {Object} nodedata a JavaScript object representing a node, group, or non-link. + */ + getGroupKeyForNodeData(nodedata: Object): Key; + + /** + * Gets an Array of node key values that identify node data acting as labels on the given link data. + * This method only works if .linkLabelKeysProperty has been set to something other than an empty string. + * @param {Object} linkdata a JavaScript object representing a link. + */ + getLabelKeysForLinkData(linkdata: Object): Array<Key>; + + /** + * From a link data retrieve a value uniquely identifying the node data + * to which this link is connected. + * @param {Object} linkdata a JavaScript object representing a link. + */ + getToKeyForLinkData(linkdata: Object): Key; + + /** + * From a link data retrieve a value identifying the port object of the node + * to which this link is connected. + * @param {Object} linkdata a JavaScript object representing a link. + */ + getToPortIdForLinkData(linkdata: Object): string; + + /** + * See if the given node data should be represented as a group or as a simple node. + * This value must not change as long as the node data is part of the model. + * At the current time there is no <code>setIsGroupForNodeData</code> method. + * @param {Object} nodedata a JavaScript object representing a node, group, or non-link. + */ + isGroupForNodeData(nodedata: Object): boolean; + + /** + * Removes a node key value that identifies a node data acting as a former label node on the given link data. + * Removing a reference to a node data from the collection of link label keys + * does not automatically remove any node data from the model. + * This method only works if .linkLabelKeysProperty has been set to something other than an empty string. + * @param {Object} linkdata a JavaScript object representing a link. + * @param {string|number} key a number or string that is the key of the label node being removed from the link. + */ + removeLabelKeyForLinkData(linkdata: Object, key: Key): void; + + /** + * When you want to remove a link from the diagram, call this method with an existing link data object. + * This will remove that data from the .linkDataArray and + * notify all listeners that a link data object has been removed from the collection. + * Removing a link data from a model does not automatically remove + * any associated label node data from the model. + * This operation does nothing if the link data is not present in the .linkDataArray. + * @param {Object} linkdata a JavaScript object representing a link. + */ + removeLinkData(linkdata: Object): void; + + /** + * Remove from this model all of the link data held in an Array or in an Iterable of link data objects. + * @param {Iterable<Object>|Array<Object>} coll a collection of link data objects to remove from the .linkDataArray + */ + removeLinkDataCollection(coll: Iterable<Object> | Array<Object>): void; + + /** + * Change the category of a given link data, a string naming the link template + * that the Diagram should use to represent the link data. + * Changing the link template for a link data will cause the existing Link + * to be removed from the Diagram and be replaced with a new Link + * created by copying the new link template and applying any data-bindings. + * @param {Object} linkdata a JavaScript object representing a link. + * @param {string} cat Must not be null. + */ + setCategoryForLinkData(linkdata: Object, cat: string): void; + + /** + * Change the node key that the given link data references as the + * source of the link. + * @param {Object} linkdata a JavaScript object representing a link. + * @param {string|number|undefined} key This may be undefined if + * the link should no longer come from any node. + */ + setFromKeyForLinkData(linkdata: Object, key: Key): void; + + /** + * Change the information that the given link data uses to identify the + * particular "port" that the link is coming from. + * @param {Object} linkdata a JavaScript object representing a link. + * @param {string} portname This may be the empty string if + * the link should no longer be associated with any particular "port". + */ + setFromPortIdForLinkData(linkdata: Object, portname: string): void; + + /** + * Change the container group for the given node data, given a key for the new group. + * @param {Object} nodedata a JavaScript object representing a node, group, or non-link. + * @param {string|number|undefined} key This may be undefined if there should be no containing group data. + */ + setGroupKeyForNodeData(nodedata: Object, key: Key): void; + + /** + * Replaces an Array of node key values that identify node data acting as labels on the given link data. + * This method only works if .linkLabelKeysProperty has been set to something other than an empty string. + * @param {Object} linkdata a JavaScript object representing a link. + * @param arr an Array of node keys; an empty Array if the property was not present. + */ + setLabelKeysForLinkData(linkdata: Object, arr: Array<Key>): void; + + /** + * Change the node key that the given link data references as the + * destination of the link. + * @param {Object} linkdata a JavaScript object representing a link. + * @param {string|number|undefined} key This may be undefined if + * the link should no longer go to any node. + */ + setToKeyForLinkData(linkdata: Object, key: Key): void; + + /** + * Change the information that the given link data uses to identify the + * particular "port" that the link is going to. + * @param {Object} linkdata a JavaScript object representing a link. + * @param {string} portname This may be the empty string if + * the link should no longer be associated with any particular "port". + */ + setToPortIdForLinkData(linkdata: Object, portname: string): void; + } + + /* + * Models hold the essential data of a diagram, describing the basic entities and their properties and relationships + * without specifying the appearance and behavior of the Nodes and Links and Groups that represent them visually. + * Models tend to hold only relatively simple data, making them easy to persist by serialization as JSON or XML formatted text. + */ + class Model { + /** + * You probably don't want to call this constructor, because this class does not support links (relationships between nodes) or groups (nodes and links and subgraphs as nodes): instead, create instances of a subclass such as GraphLinksModel or TreeModel. + * @param {Array<Object>=} nodedataarray an optional Array containing JavaScript objects to be represented by Parts. + */ + constructor(nodedataarray?: Array<Object>); + + /**Gets or sets whether the default behavior for copyNodeData makes copies of property values that are Arrays.*/ + copiesArrays: boolean; + + /**Gets or sets whether the default behavior for copyNodeData when copying Arrays also copies array items that are Objects.*/ + copiesArrayObjects: boolean; + + /**Gets or sets a function that makes a copy of a node data object; the default value is null, resulting in the standard behavior which is to make a shallow copy of the object.*/ + copyNodeDataFunction: (obj: Object, model: Model) => Object; + + /**Gets or sets the name of the format of the diagram data; the default value is the empty string.*/ + dataFormat: string; + + /**Gets or sets whether this model may be modified, such as adding nodes; by default this value is false.*/ + isReadOnly: boolean; + + /**Gets or sets a function that returns a unique id number or string for a node data object; the default value is null.*/ + makeUniqueKeyFunction: (model: Model, obj: Object) => Key; + + /**Gets a JavaScript Object that can hold programmer-defined property values for the model as a whole, rather than just for one node or one link; by default this is an object with no properties. The value must be an Object.*/ + modelData: any; + + /**Gets or sets the name of this model; the initial name is an empty string.*/ + name: string; + + /**Gets or sets the name of the node data property that returns a string naming that data's category, or a function that takes a node data object and returns the category name; the default value is the name 'category'.*/ + nodeCategoryProperty: PropertyAccessor; + + /**Gets or sets the array of node data objects that correspond to Nodes, Groups, or non-Link Parts in the Diagram; the initial value is an empty Array.*/ + nodeDataArray: Array<Object>; + + /**Gets or sets the name of the data property that returns a unique id number or string for each node data object, or a function taking a node data object and returning the key value; the default value is the name 'key'.*/ + nodeKeyProperty: PropertyAccessor; + + /**Gets or sets whether ChangedEvents are not recorded by the UndoManager; the initial and normal value is false.*/ + skipsUndoManager: boolean; + + /**Gets or sets the UndoManager for this Model; the default UndoManager has its UndoManager.isEnabled property set to false.*/ + undoManager: UndoManager; + + /** + * Add an item at the end of a data array that may be data bound by a Panel as its Panel.itemArray, + * in a manner that can be undone/redone and that automatically updates any bindings. + * This also calls .raiseChangedEvent to notify all listeners about the ChangedEvent.Insert. + * If you want to add a new node or part to the diagram, call .addNodeData. + * @param {Array<*>} arr an Array that is the value of some Panel's Panel.itemArray. + * @param {*} val the new value to be pushed onto the array. + */ + addArrayItem(arr: Array<any>, val: any): void; + + /** + * Register an event handler that is called when there is a ChangedEvent. + * This registration does not raise a ChangedEvent. + * @param {function(ChangedEvent)} listener a function that takes a ChangedEvent as its argument. + */ + addChangedListener(listener: (e: ChangedEvent) => void ): void; + + /** + * When you want to add a node or group to the diagram, + * call this method with a new data object. + * This will add that data to the .nodeDataArray and + * notify all listeners that a new node data object has been inserted into the collection. + * To remove a node from the diagram, you can remove its data object by calling .removeNodeData. + * To add or remove an object or value from an item array, call .insertArrayItem or .removeArrayItem. + * @param {Object} nodedata a JavaScript object representing a node, group, or non-link. + */ + addNodeData(nodedata: Object): void; + + /** + * Add to this model all of the node data held in an Array or in an Iterable of node data objects. + * @param {Iterable<Object>|Array<Object>} coll a collection of node data objects to add to the .nodeDataArray + */ + addNodeDataCollection(coll: Iterable<Object> | Array<Object>): void; + + /** + * Clear out all references to any model data. + * This also clears out the UndoManager, so this operation is not undoable. + * This method is called by Diagram.clear; it does not notify any Diagrams or other listeners. + * Instead of calling this method, you may prefer to set .nodeDataArray to an empty JavaScript Array. + * If this model is a GraphLinksModel, you would also want to set GraphLinksModel.linkDataArray to a separate empty JavaScript Array. + */ + clear(): void; + + /** + * Commit the changes of the current transaction. + * This just calls UndoManager.commitTransaction. + * @param {string=} tname a descriptive name for the transaction. + */ + commitTransaction(tname?: string): boolean; + + /** + * Decide if a given node data is in this model. + * @param {Object} nodedata a JavaScript object representing a node, group, or non-link. + */ + containsNodeData(nodedata: Object): boolean; + + /** + * Make a copy of a node data object. + * This uses the value of .copyNodeDataFunction to actually perform the copy, + * unless it is null, in which case this method just makes a shallow copy of the JavaScript Object. + * This does not modify the model -- the returned data object is not added to this model. + * This assumes that the data's constructor can be called with no arguments. + * @param {Object} nodedata a JavaScript object representing a node, group, or non-link. + */ + copyNodeData(nodedata: Object): Object; + + /** + * Given a number or string, find the node data in this model + * that uses the given value as its unique key. + * The return value will be an Object or null. + * @param {*} key a string or a number. + */ + findNodeDataForKey(key: Key): any; + + /** + * This static function parses a string in JSON format and constructs, initializes, and returns a model. + * Note that properties with values that are functions are not written out by .toJson, + * so reading in such a model will require constructing such a model, initializing its functional property values, + * and explicitly passing it in as the second argument. + * @param {string} s a String in JSON format containing all of the persistent properties of the model, or an Object already read from JSON text. + * @param {model=} model an optional model to be modified; if not supplied, it constructs and returns a new model whose name is specified by the "class" property. + */ + static fromJson(s: string | Object, model?: Model): Model; + + /** + * Find the category of a given node data, a string naming the node template + * or group template or part template + * that the Diagram should use to represent the node data. + * @param {Object} nodedata a JavaScript object representing a node, group, or non-link. + */ + getCategoryForNodeData(nodedata: Object): string; + + /** + * Given a node data object return its unique key: a number or a string. + * This returns undefined if there is no key value. + * It is possible to change the key for a node data object by calling .setKeyForNodeData. + * @param {Object} nodedata a JavaScript object representing a node, group, or non-link. + */ + getKeyForNodeData(nodedata: Object): Key; + + /** + * Add an item to a data array that may be data bound by a Panel as its Panel.itemArray, + * given a new data value and the index at which to insert the new value, in a manner that can be undone/redone and that automatically updates any bindings. + * This also calls .raiseChangedEvent to notify all listeners about the ChangedEvent.Insert. + * If you want to add a new node or part to the diagram, call .addNodeData. + * @param Array<*> arr an Array that is the value of some Panel's Panel.itemArray. + * @param {number} idx the zero-based array index where the new value will be inserted; use -1 to push the new value on the end of the array. + * @param {*} val the new value to be inserted into the array. + */ + insertArrayItem(arr: Array<any>, idx: number, val: any): void; + + /** + * This method is called when a node data object is added to the model to make sure that + * .getKeyForNodeData returns a unique key value. + * The key value should be unique within the set of data managed by this model: + * .nodeDataArray. + * If the key is already in use, this will assign an unused number to the + * .nodeKeyProperty property on the data. + * If you want to customize the way in which node data gets a unique key, + * you can set the .makeUniqueKeyFunction functional property. + * If the node data object is already in the model and you want to change its key value, + * call .setKeyForNodeData and give it a new unique key value. + * @param {Object} nodedata a JavaScript object representing a node, group, or non-link. + */ + makeNodeDataKeyUnique(nodedata: Object): void; + + /** + * Call this method to notify that the model or its objects have changed. + * This constructs a ChangedEvent and calls all Changed listeners. + * @param {EnumValue} change specifies the general nature of the change; typically the value is ChangedEvent.Property. + * @param {string|function(Object):*} propertyname names the property that was modified, or a function that takes an Object and returns the property value. + * @param {Object} obj the object that was modified, typically a GraphObject, Diagram, or a Model. + * @param {*} oldval the previous or older value. + * @param {*} newval the next or newer value. + * @param {*=} oldparam an optional value that helps describe the older value. + * @param {*=} newparam an optional value that helps describe the newer value. + */ + raiseChangedEvent(change: EnumValue, propertyname: PropertyAccessor, obj: Object, oldval: any, newval: any, oldparam?: any, newparam?: any): void; + + /** + * Call this method to notify about a data property having changed value. + * This constructs a ChangedEvent and calls all Changed listeners. + * You should call this method only if the property value actually changed. + * This method is called by .setDataProperty. + * @param {Object} data the data object whose property changed value. + * @param {string|function(Object):*} propertyname the name of the property, or a function that takes an Object and returns the property value. + * @param {*} oldval the previous or old value for the property. + * @param {*} newval the next or new value for the property. + * @param {*=} oldparam an optional value additionally describing the old value. + * @param {*=} newparam an optional value additionally describing the new value. + */ + raiseDataChanged(data: Object, propertyname: PropertyAccessor, oldval: any, newval: any, oldparam?: any, newparam?: any): void; + + /** + * Remove an item from a data array that may be data bound by a Panel as its Panel.itemArray, + * given the index at which to remove a data value, in a manner that can be undone/redone and that automatically updates any bindings. + * This also calls .raiseChangedEvent to notify all listeners about the ChangedEvent.Remove. + * If you want to remove a node from the diagram, call .removeNodeData. + * Note that there is no version of this method that takes an item value instead of an index into the array. + * Because item arrays may hold any JavaScript value, including numbers and strings, there may be duplicate entries with that value in the array. + * To avoid ambiguity, removing an item from an array requires an index. + * @param Array<*> arr an Array that is the value of some Panel's Panel.itemArray. + * @param {number=} idx the zero-based array index of the data item to be removed from the array; + * if not supplied it will remove the last item of the array. + */ + removeArrayItem(arr: Array<any>, idx?: number): void; + + /** + * Unregister an event handler listener. + * This deregistration does not raise a ChangedEvent. + * @param {function(ChangedEvent)} listener a function that takes a ChangedEvent as its argument. + */ + removeChangedListener(listener: (e: ChangedEvent) => void ): void; + + /** + * When you want to remove a node or group from the diagram, + * call this method with an existing data object. + * This will remove that data from the .nodeDataArray and + * notify all listeners that a node data object has been removed from the collection. + * Removing a node data from a model does not automatically remove + * any connected link data from the model. + * Removing a node data that represents a group does not automatically remove + * any member node data or link data from the model. + * To add a node to the diagram, you can add its data object by calling .addNodeData. + * To add or remove an object or value from an item array, call .insertArrayItem or .removeArrayItem. + * @param {Object} nodedata a JavaScript object representing a node, group, or non-link. + */ + removeNodeData(nodedata: Object): void; + + /** + * Remove from this model all of the node data held in an Array or in an Iterable of node data objects. + * @param {Iterable<Object>|Array<Object>} coll a collection of node data objects to remove from the .nodeDataArray + */ + removeNodeDataCollection(coll: Iterable<Object> | Array<Object>): void; + + /** + * Rollback the current transaction, undoing any recorded changes. + * This just calls UndoManager.rollbackTransaction. + */ + rollbackTransaction(): boolean; + + /** + * Change the category of a given node data, a string naming the node template + * or group template or part template + * that the Diagram should use to represent the node data. + * Changing the node template for a node data will cause the existing Node, Group, or Part + * to be replaced with a new Node, Group, or Part + * created by copying the new node template and applying any data-bindings. + * @param {Object} nodedata a JavaScript object representing a node, group, or non-link. + * @param {string} cat Must not be null. + */ + setCategoryForNodeData(nodedata: Object, cat: string): void; + + /** + * Change the value of some property of a node data, a link data, or an item data, given a string naming the property + * and the new value, in a manner that can be undone/redone and that automatically updates any bindings. + * This gets the old value of the property; if the value is the same as the new value, no side-effects occur. + * @param {Object} data a JavaScript object representing a Node, Link, Group, simple Part, or item in a Panel.itemArray. + * @param {string} propname a string that is not null or the empty string. + * @param {*} val the new value for the property. + */ + setDataProperty(data: Object, propname: string, val: any): void; + + /** + * Change the unique key of a given node data that is already in this model. + * The new key value must be unique -- i.e. not in use by another node data object. + * You can call .findNodeDataForKey to check if a proposed new key is already in use. + * This operation will check all data objects in the model and replace all references + * using the old key value with the new one. + * If this is called on a node data object that is not (yet) in this model, + * this unconditionally modifies the property to the new key value. + * @param {Object} nodedata a JavaScript object representing a node, group, or non-link. + * @param {string|number|undefined} key + */ + setKeyForNodeData(nodedata: Object, key: Key): void; + + /** + * Begin a transaction, where the changes are held by a Transaction object in the UndoManager. + * This just calls UndoManager.startTransaction. + * @param {string=} tname a descriptive name for the transaction. + */ + startTransaction(tname?: string): boolean; + + /** + * Generate a string representation of the persistent data in this model, in JSON format. + * Object properties that are not enumerable or whose names start with "_" are not written out. + * Functions are not able to be written in JSON format, so any properties that have function values + * will not be saved in the JSON string. + * There must not be any circular references within the model data. + * Any sharing of object references will be lost in the written JSON. + * Most object classes cannot be serialized into JSON without special knowledge and processing at both ends. + * The .toJson and Model.fromJson methods automatically do such processing for numbers that are NaN + * and for objects that are of class Point, Size, Rect, Margin, Spot, + * Brush (but not for brush patterns), and for Geometry. + * However, we recommend that you use Binding converters (static functions named "parse" and "stringify") + * to represent Points, Sizes, Rects, Margins, Spots, and Geometries as string values in your data, rather than as Objects. + * This makes the JSON text smaller and simpler and easier to read. + * @param {string=} classname The optional name of the model class to use in the output; + * for the standard models, this is their class name prefixed with "go.". + */ + toJson(classname?: string): string; + + /** + * Find a Part corresponding to the given data and + * call its Panel.updateTargetBindings method, in each Diagram + * that uses this Model. + * @param {Object} data The data object in this model that was modified. + * @param {string=} srcpropname If not present or the empty string, + * update all bindings on the target Part or item Panel; + * otherwise update only those bindings using this source property name. + */ + updateTargetBindings(data: Object, srcpropname?: string): void; + } + + /** + * A Transaction holds a list of ChangedEvents collected during a transaction, + * as the value of the read-only .changes property. + */ + class Transaction { + /** + * Construct an object holding an empty list of ChangedEvents and no .name. + */ + constructor(); + + /**This read-only property returns the list of ChangedEvents.*/ + changes: List<ChangedEvent>; + + /**Gets or sets whether we can add more ChangedEvents to this list of changes.*/ + isComplete: boolean; + + /**Gets or sets the transaction name for this collection of changes.*/ + name: string; + + /** + * This predicate returns true if you can call .redo, namely when .isComplete is true. + */ + canRedo(): boolean; + + /** + * This predicate returns true if you can call .undo, namely when .isComplete is true. + */ + canUndo(): boolean; + + /** + * Clear all of the saved changes. + */ + clear(): void; + + /** + * Re-perform these changes after an .undo. + */ + redo(): void; + + /** + * Undo all of the changes, in reverse order. + */ + undo(): void; + } + + /** + * TreeModels support tree-structured graphs of nodes and links. + * Each node can have at most one "tree parent"; cycles are not permitted. + * The reference to the parent node's key is a property of the child node data. + */ + class TreeModel extends Model { + /** + * This constructs an empty TreeModel unless one provides arguments as the initial data array values for the Model.nodeDataArray property. + * @param {Array<Object>=} nodedataarray an optional Array containing JavaScript objects to be represented by Nodes. + */ + constructor(nodedataarray?: Array<Object>); + + /** + * Gets or sets the name of the property on node data that specifies + * the string or number key of the node data that acts as the "parent" for this "child" node data, + * or a function that takes a node data object and returns that parent key; + * the default value is the name 'parent'. + * The value must not be null nor an empty string. + */ + nodeParentKeyProperty: PropertyAccessor; + + /** + * Gets or sets the name of the data property that returns a string describing that node data's parent link's category, + * or a function that takes a node data object and returns its parent link's category string; + * the default value is the name 'parentLinkCategory'. + * This is used by the diagram to distinguish between different kinds of links. + * The name must not be null. + */ + parentLinkCategoryProperty: PropertyAccessor; + + /** + * If there is a parent node for the given node data, return the parent's key. + * @param {Object} nodedata a JavaScript object representing a node. + */ + getParentKeyForNodeData(nodedata: Object): Key; + + /** + * Find the category for the parent link of a given child node data, a string naming the link template + * that the Diagram should use to represent the link. + * @param {Object} childdata a JavaScript object representing a node data. + */ + getParentLinkCategoryForNodeData(childdata: Object): string; + + /** + * Change the parent node for the given node data, given a key for the new parent, or undefined if there should be no parent. + * @param {Object} nodedata a JavaScript object representing a node. + * @param {string|number|undefined} key This may be undefined if there should be no parent node data. + */ + setParentKeyForNodeData(nodedata: Object, key: Key): void; + + /** + * Change the category for the parent link of a given child node data, a string naming the link template + * that the Diagram should use to represent the link. + * Changing the link template will cause any existing Link + * to be removed from the Diagram and replaced with a new Link + * created by copying the new link template and applying any data-bindings. + * @param {Object} childdata a JavaScript object representing a node data. + * @param {string} cat Must not be null. + */ + setParentLinkCategoryForNodeData(childdata: Object, cat: string): void; + } + + /** + * A Transaction holds a list of ChangedEvents collected during a transaction, + * as the value of the read-only .changes property. + */ + class UndoManager { + /** + * The constructor produces an empty UndoManager with no transaction history. + */ + constructor(); + + /**This read-only property returns the current Transaction for recording additional model change events.*/ + currentTransaction: Transaction; + + /**This read-only property returns the whole history, a list of all of the Transactions, each representing a transaction with some number of ChangedEvents.*/ + history: List<Transaction>; + + /**This read-only property returns the index into .history for the current undoable Transaction.*/ + hisotryIndex: number; + + /**Gets or sets whether this UndoManager records any changes.*/ + isEnabled: boolean; + + /**This property is true after the first call to .startTransaction and before a corresponding call to .commitTransaction or .rollbackTransaction.*/ + isInTransaction: boolean; + + /**This property is true during a call to .undo or .redo.*/ + isUndoingRedoing: boolean; + + /**Gets or sets the maximum number of transactions that this undo manager will remember.*/ + maxHistoryLength: number; + + /**This read-only property returns an iterator for all of the Models that this UndoManager is handling.*/ + models: Iterator<Model>; + + /**This read-only property returns a stack of ongoing transaction names.*/ + nestedTransactionNames: List<string>; + + /**This read-only property returns the current transaction level.*/ + transactionLevel: number; + + /**This read-only property returns the Transaction in the .history to be redone next.*/ + transactionToRedo: Transaction; + + /**This read-only property returns the Transaction in the .history to be undone next.*/ + transactionToUndo: Transaction; + + /** + * Make sure this UndoManager knows about a Model for which it may receive ChangedEvents when the given Model is changed. + * @param {Model} model + */ + addModel(model: Model): void; + + /** + * This predicate returns true if you can call .redo. + */ + canRedo(): boolean; + + /** + * This predicate returns true if you can call .undo. + */ + canUndo(): boolean; + + /** + * Clear all of the Transactions and clear all other state, including any ongoing transaction without rolling back. + */ + clear(): void; + + /** + * Commit the current transaction started by a call to .startTransaction. + * For convenience, this method is called by Model.commitTransaction and Diagram.commitTransaction. + * If this call stops a top-level transaction, + * we mark the .currentTransaction as complete (Transaction.isComplete), + * we add the Transaction to the .history list, + * and we return true. + * Committing a transaction when there have been some undos without corresponding + * redos will throw away the Transactions holding changes that happened + * after the current state, before adding the new Transaction to the + * .history list. + * @param {string=} tname a short string describing the transaction, defaulting to the name given at the call to startTransaction + */ + commitTransaction(tname?: string): boolean; + + /** + * Maybe record a ChangedEvent in the .currentTransaction. + * This calls .skipsEvent to see if this should ignore the change. + * If .skipsEvent returns false, this creates a copy of the ChangedEvent + * and adds it to the .currentTransaction. + * If there is no .currentTransaction, this first creates and remembers it. + * This method always ignores all changes while performing + * an .undo or .redo. + * This method is also a no-op if .isEnabled is false. + * @param {ChangedEvent} e a ChangedEvent. + */ + handleChanged(e: ChangedEvent): void; + + /** + * Re-perform this object change after an .undo. + */ + redo(): void; + + /** + * Inform this UndoManager that it will no longer be receiving ChangedEvents + * when the given Model is changed. + * The model will no longer receive notifications about transactions and undo or redo operations. + * You should not call this method during a transaction. + * If you call this method between transactions when there is a transaction history, + * you should be careful that there are no ChangedEvents referring to that model in any Transactions. + * @param {Model} model A Model that this UndoManager should no longer manage. + */ + removeModel(model: Model): void; + + /** + * Rollback the current transaction started by a call to .startTransaction, undoing any changes. + */ + rollbackTransaction(): boolean; + + /** + * This predicate is called by .handleChanged to decide if a ChangedEvent + * is not interesting enough to be remembered. + * Transactional events (of change type ChangedEvent.Transaction) are always skipped. + * Changed events for GraphObjects that are in Layer.isTemporary layers are also skipped. + * Sometimes changed events do not even get to .handleChanged because + * Model.skipsUndoManager or Diagram.skipsUndoManager is true. + * @param {ChangedEvent} e the ChangedEvent received by .handleChanged. + */ + skipsEvent(e: ChangedEvent): boolean; + + /** + * Begin a transaction, where the changes are held by a Transaction object + * as the value of .currentTransaction. + * You must call either .commitTransaction or .rollbackTransaction afterwards. + * For convenience, this method is called by Model.startTransaction and Diagram.startTransaction. + * Transactions can be nested. + * Starting or ending a nested transaction will return false. + * Nested transactions will share the same Transaction list of ChangedEvents. + * Starting a transaction will not necessarily cause .currentTransaction to be non-null. + * A Transaction object is usually only created by .handleChanged when a ChangedEvent first occurs. + * @param {string=} tname a short string describing the transaction. + */ + startTransaction(tname?: string): boolean; + + /** + * Reverse the effects of this object change. + */ + undo(): void; + + checksTransactionLevel: boolean; // undocumented + } + + + /** + * This layout positions nodes in a circular arrangement. + * This layout makes use of a LayoutNetwork of + * CircularVertexes and CircularEdges that normally + * correspond to the Nodes and Links of the Diagram. + */ + class CircularLayout extends Layout { + /** + * Constructs a CircularLayout with no Layout.network and with no owning Layout.diagram. + */ + constructor(); + + /**Returns the coordinates of the center of the laid-out ellipse.*/ + actualCenter: Point; + + /**This read-only property returns the effective spacing that may have been calculated by the layout.*/ + actualSpacing: number; + + /**This read-only property returns the effective X radius that may have been calculated by the layout.*/ + actualXRadius: number; + + /**This read-only property returns the effective Y radius that may have been calculated by the layout.*/ + actualYRadius: number; + + /**Gets or sets how the nodes are spaced.*/ + arrangement: EnumValue; + + /**Gets or sets the ratio of the arrangement's height to its width (1 for a circle, >1 for a vertically elongated ellipse).*/ + aspectRatio: number; + + /**Gets or sets the comparer which sorts the data when .sorting is set to CircularLayout.Ascending or CircularLayout.Descending.*/ + comparer: (a: CircularVertex, b: CircularVertex) => number; + + /**Gets or sets whether the nodes are arranged clockwise or counterclockwise.*/ + direction: EnumValue; + + /**Specifies how the diameter of nodes will be calculated.*/ + nodeDiameterFormula: EnumValue; + + /**Gets or sets the horizontal radius of the elliptical arrangement.*/ + radius: number; + + /**Gets or sets if and how the nodes are sorted.*/ + sorting: EnumValue; + + /**Gets or sets the distance between nodes (if .radius is NaN) or the minimum distance between nodes (if .radius is a number).*/ + spacing: number; + + /**Gets or sets the angle (in degrees, clockwise from the positive side of the X axis) of the first element.*/ + startAngle: number; + + /**Gets or sets the absolute angle (in degrees) between the first and last node.*/ + sweepAngle: number; + + /** + * Position each Node according to the Vertex position, and then position the Links. + */ + commitLayout(): void; + + /** + * Commit the position and routing of all edge links. + */ + commitLinks(): void; + + /** + * Commit the position of all vertex nodes. + */ + commitNodes(): void; + + /** + * Create a new LayoutNetwork of CircularVertexes and CircularEdges. + */ + createNetwork(): CircularNetwork; + + /** + * Assign the positions of the vertexes in the network. + * @param {Diagram | Group | Iterable<Part>} coll A Diagram or a Group or a collection of Parts. + */ + doLayout(coll: (Diagram | Group | Iterable<Part>)): void; + + /**Nodes are sorted using the .comparer, in ascending order; This value is used for CircularLayout.sorting.*/ + static Ascending: EnumValue; + + /**The ring is filled by alternating sides; the second node is counterclockwise from the first node; This value is used for CircularLayout.direction.*/ + static BidirectionalLeft: EnumValue; + + /**The ring is filled by alternating sides; the second node is clockwise from the first node; This value is used for CircularLayout.direction.*/ + static BidirectionalRight: EnumValue; + + /**The effective diameter is either the width or height of the node, whichever is larger; This will cause circular nodes to touch when CircularLayout.spacing is 0; This is ideal when the nodes are circular.*/ + static Circular: EnumValue; + + /**Rings are filled clockwise; This value is used for CircularLayout.direction.*/ + static Clockwise: EnumValue; + + /**The angular distance between the nodes is constant; This value is used for CircularLayout.arrangement.*/ + static ConstantAngle: EnumValue; + + /**The distance between the centers of the nodes is constant; This value is used for CircularLayout.arrangement.*/ + static ConstantDistance: EnumValue; + + /**The spacing between the idealized boundaries of the nodes is constant; This value is used for CircularLayout.arrangement.*/ + static ConstantSpacing: EnumValue; + + /**Rings are filled counterclockwise; This value is used for CircularLayout.direction.*/ + static Counterclockwise: EnumValue; + + /**Nodes are sorted using the .comparer, in reverse ascending (descending) order; This value is used for CircularLayout.sorting.*/ + static Descending: EnumValue; + + /**Nodes are arranged in the order given; This value is used for CircularLayout.sorting.*/ + static Forwards: EnumValue; + + /**Nodes are ordered to reduce link crossings; This value is used for CircularLayout.sorting.*/ + static Optimized: EnumValue; + + /**The vertices are arranged as close together as possible considering the CircularLayout.spacing, assuming the nodes are rectangular; This value is used for CircularLayout.arrangement.*/ + static Packed: EnumValue; + + /**The effective diameter is sqrt(width^2+height^2); The corners of square nodes will touch at 45 degrees when CircularLayout.spacing is 0; This value is used for CircularLayout.nodeDiameterFormula.*/ + static Pythagorean: EnumValue; + + /**Nodes are arranged in the reverse of the order given; This value is used for CircularLayout.sorting.*/ + static Reverse: EnumValue; + } + + class CircularNetwork extends LayoutNetwork { // undocumented + } + + /** This holds CircularLayout-specific information about Links.*/ + class CircularEdge extends LayoutEdge { + } + + /** This holds CircularLayout-specific information about Nodes.*/ + class CircularVertex extends LayoutVertex { + /**Gets or sets the value used as the vertex's angle.*/ + actualAngle: number; + + /**Gets or sets the value used as the vertex's diameter.*/ + diameter: number; + } + + /** + * Force-directed layout treats the graph as if it were a system of physical + * bodies with forces acting on them and between them. + * The algorithm seeks a configuration of the bodies with locally minimal energy, + * i.e. vertex positions such that the sum of the forces on each vertex is zero. + */ + class ForceDirectedLayout extends Layout { + /** + * Constructs a ForceDirectedLayout with no Layout.network and with no owning Layout.diagram. + */ + constructor(); + + /**Gets or sets the space between which the layout will position the connected graphs that together compose the network.*/ + arrangementSpacing: Size; + + /**Gets or sets whether .commitNodes should move all of the nodes so that the nodes all fit with the top-left corner at the Layout.arrangementOrigin.*/ + arrangesToOrigin: boolean; + + /**Gets or sets whether to call .addComments.*/ + comments: boolean; + + /**This read-only property returns the current iteration count, valid during a call to .doLayout.*/ + currentIteration: number; + + /**Gets or sets the default value computed by .electricalCharge.*/ + defaultCommentElectricalCharge: number; + + /**Gets or sets the default value computed by .springLength.*/ + defaultCommentSpringLength: number; + + /**Gets or sets the default value computed by .electricalCharge.*/ + defaultElectricalCharge: number; + + /**Gets or sets the default value computed by .gravitationalMass.*/ + defaultGravitationalMass: number; + + /**Gets or sets the default value computed by .springLength.*/ + defaultSpringLength: number; + + /**Gets or sets the default value computed by .springStiffness.*/ + defaultSpringStiffness: number; + + /**Gets or sets approximately how far a node must move in order for the iterations to continue.*/ + epsilonDistance: number; + + /**Gets or sets a threshold for the distance beyond which the electrical charge forces may be ignored.*/ + infinityDistance: number; + + /**Gets or sets the maximum number of iterations to perform when doing the force-directed auto layout.*/ + maxIterations: number; + + /**Gets or sets a random number generator with a random() method; set to null in order to use and reset an internal repeatable pseudo-random number generator.*/ + randomNumberGenerator: { random: () => number }; + + /**Gets or sets whether the fromSpot and the toSpot of every Link should be set to Spot.Default.*/ + setsPortSpots: boolean; + + /** + * Find associated objects to be positioned along with the vertex. + * @param {LayoutVertex} v + */ + addComments(v: ForceDirectedVertex): void; + + /** + * Position the Nodes according to the Vertex positions. + */ + commitLayout(): void; + + /** + * Commit the position and routing of all edge links. + */ + commitLinks(): void; + + /** + * Commit the position of all vertex nodes. + */ + commitNodes(): void; + + /** + * Create a new LayoutNetwork of ForceDirectedVertexes and ForceDirectedEdges. + */ + createNetwork(): ForceDirectedNetwork; + + /** + * Assign the positions of the vertexes in the network. + * @param {(Diagram | Group | Iterable<Part>)} coll A Diagram or a Group or a collection of Parts. + */ + doLayout(coll: (Diagram | Group | Iterable<Part>)): void; + + /** + * Returns the charge of the vertex, + * the value of ForceDirectedVertex.charge if it's a number, + * or else the value of .defaultElectricalCharge. + * @param {ForceDirectedVertex} v + */ + electricalCharge(v: ForceDirectedVertex): number; + + /** + * Returns the electrical field in the X direction acting on a vertex at the given point. + * + * Used to define an external electrical field at a point + * independent of the vertex charges. + * A vertex L is acted upon by a force in the X direction of magnitude + * @param {number} x + * @param {number} y + */ + electricalFieldX(x: number, y: number): number; + + /** + * Returns the electrical field in the Y direction acting on a vertex at the given point. + * + * Used to define an external electrical field at a point + * independent of the vertex charges. + * A vertex L is acted upon by a force in the Y direction of magnitude + * @param {number} x + * @param {number} y + */ + electricalFieldY(x: number, y: number): number; + + /** + * This returns the gravitational field in the X direction acting on a vertex at the given point. + * + * Used to define an external gravitational field at a point + * independent of the vertex masses. + * A vertex L is acted upon by a force in the X direction of magnitude + * @param {number} x + * @param {number} y + */ + gravitationalFieldX(x: number, y: number): number; + + /** + * This returns the gravitational field in the Y direction acting on a vertex at the given point. + * + * Used to define an external gravitational field at a point + * independent of the vertex masses. + * A vertex L is acted upon by a force in the Y direction of magnitude + * @param {number} x + * @param {number} y + */ + gravitationalFieldY(x: number, y: number): number; + + /** + * Returns the mass of the vertex, + * the value of ForceDirectedVertex.mass if it's a number, + * or else the value of .defaultGravitationalMass. + * @param {ForceDirectedVertex} v + */ + gravitationalMass(v: ForceDirectedVertex): number; + + /** + * This predicate returns true if the vertex should not be moved + * by the layout algorithm but still have an effect on nearby and connected vertexes. + * The default implementation returns ForceDirectedVertex.isFixed. + * @param {ForceDirectedVertex} v + */ + isFixed(v: ForceDirectedVertex): boolean; + + /** + * Maybe move a vertex that isFixed. + * This is called each iteration on each such vertex. + * By default this does nothing. + */ + moveFixedVertex(v: ForceDirectedVertex): void; + + /** + * Returns the length of the spring representing an edge. + * The two vertexes connected by the edge E are acted upon by a force of magnitude + * @param {ForceDirectedEdge} e + */ + springLength(e: ForceDirectedEdge): number; + + /** + * Returns the stiffness of the spring representing an edge. + * The two vertexes connected by the edge E are acted upon by a force of magnitude + * @param {ForceDirectedEdge} e + */ + springStiffness(e: ForceDirectedEdge): number; + } + + class ForceDirectedNetwork extends LayoutNetwork { // undocumented + } + + /** This holds ForceDirectedLayout-specific information about Links.*/ + class ForceDirectedEdge extends LayoutEdge { + /**Gets or sets the length of this edge.*/ + length: number; + + /**Gets or sets this edge's stiffness or resistence to compression or stretching.*/ + stiffness: number; + } + + /** This holds ForceDirectedLayout-specific information about Nodes.*/ + class ForceDirectedVertex extends LayoutVertex { + /**Gets or sets the electrical charge for this vertex.*/ + charge: number; + + /**Gets or sets the cumulative force on the vertex in the X direction.*/ + forceX: number; + + /**Gets or sets the cumulative force on the vertex in the Y direction.*/ + forceY: number; + + /**Gets or sets whether the vertex may be moved by any forces.*/ + isFixed: boolean; + + /**Gets or sets the gravitational mass for this vertex.*/ + mass: number; + } + + /** + * This simple layout places all of the Parts in a grid-like arrangement, ordered, spaced apart, + * and wrapping as needed. It ignores any Links connecting the Nodes being laid out. + */ + class GridLayout extends Layout { + /** + * This simple layout places all of the Parts in a grid-like arrangement, ordered, spaced apart, + * and wrapping as needed. It ignores any Links connecting the Nodes being laid out. + */ + constructor(); + + /**Gets or sets whether the Part.location or the position should be used to arrange each part.*/ + alignment: EnumValue; + + /**Gets or sets how to arrange the parts.*/ + arrangement: EnumValue; + + /**Gets or sets the minimum part size by which each part is positioned in the grid.*/ + cellSize: Size; + + /**Gets or sets the comparison function used to sort the parts.*/ + comparer: (a: Part, b: Part) => number; + + /**Gets or sets what order to place the parts.*/ + sorting: EnumValue; + + /**Gets or sets the minimum horizontal and vertical space between parts.*/ + spacing: Size; + + /**Gets or sets the maximum number of columns.*/ + wrappingColumn: number; + + /**Gets or sets the wrapping width.*/ + wrappingWidth: number; + + /** + * Assign the positions of the parts, ignoring any links. + * @param {(Diagram | Group | Iterable<Part>)} coll A Diagram or a Group or a collection of Parts. + */ + doLayout(coll: (Diagram | Group | Iterable<Part>)): void; + + /**Lay out each child according to the sort order given by GridLayout.comparer; This value is used for GridLayout.sorting.*/ + static Ascending: EnumValue; + + /**Lay out each child in reverse sort order given by GridLayout.comparer; This value is used for GridLayout.sorting.*/ + static Descending: EnumValue; + + /**Lay out each child in the order in which they were found; This value is used for GridLayout.sorting.*/ + static Forward: EnumValue; + + /**Fill each row from left to right; This value is used for GridLayout.arrangement.*/ + static LeftToRight: EnumValue; + + /**Position the part's Part.location at a grid point; This value is used for GridLayout.alignment.*/ + static Location: EnumValue; + + /**Position the top-left corner of each part at a grid point; This value is used for GridLayout.alignment.*/ + static Position: EnumValue; + + /**Lay out each child in reverse order from which they were found; This value is used for GridLayout.sorting.*/ + static Reverse: EnumValue; + + /**Fill each row from right to left; This value is used for GridLayout.arrangement.*/ + static RightToLeft: EnumValue; + } + + /** + * This arranges nodes into layers. + * The method uses a hierarchical approach + * for creating drawings of digraphs with nodes arranged in layers. + * The layout algorithm consists of four-major steps: Cycle Removal, + * Layer Assignment, Crossing Reduction, and Straightening and Packing. + */ + class LayeredDigraphLayout extends Layout { + /** + * Constructs a LayeredDigraphLayout with no Layout.network and with no owning Layout.diagram. + */ + constructor(); + + /**Gets or sets which aggressive option is being used to look for link crossings.*/ + aggressiveOption: EnumValue; + + /**Gets or sets the size of each column.*/ + columnSpacing: number; + + /**Gets or set which cycle removal option is used.*/ + cycleRemoveOption: EnumValue; + + /**Gets or sets the direction the graph grows towards.*/ + direction: number; + + /**Gets or sets which indices initialization option is being used.*/ + initializeOption: EnumValue; + + /**Gets or sets the number of iterations to be done.*/ + iterations: number; + + /**Gets or sets which layering option is being used.*/ + layeringOption: EnumValue; + + /**Gets or sets the size of each layer.*/ + layerSpacing: number; + + /**This read-only property returns the largest column value.*/ + maxColumn: number; + + /**This read-only property returns the largest index value.*/ + maxIndex: number; + + /**This read-only property returns the larges index layer.*/ + maxIndexLayer: number; + + /**This read-only property returns the largest layer value.*/ + maxLayer: number; + + /**This read-only property returns the smallest index layer.*/ + minIndexLayer: number; + + /**Gets or sets the options used by the straighten and pack function, The default value is LayeredDigraphLayout.PackAll.*/ + packOption: number; + + /**Gets or sets whether the FromSpot and ToSpot of each link should be set to values appropriate for the given value of LayeredDigraphLayout.direction.*/ + setsPortSpots: boolean; + + /** + * Assigns every vertex in the input network to a layer. + */ + assignLayers(): void; + + /** + * This overridable method is called by commitLayout + * to support custom arrangement of bands or labels across each layout layer. + * @param Array<*> layerRects an Array of Rects with the bounds of each of the "layers" + * @param {Point} offset the position of the top-left corner of the banded area relative to the coordinates given by the layerRects + */ + commitLayers(layerRects: Array<Rect>, offset: Point): void; + + /** + * Updates the physical location of "real" nodes and links to reflect the layout. + */ + commitLayout(): void; + + /** + * Routes the links. + */ + commitLinks(): void; + + /** + * Lays out the nodes. + */ + commitNodes(): void; + + /** + * Create a new LayoutNetwork of LayeredDigraphVertexes and LayeredDigraphEdges. + */ + createNetwork(): LayeredDigraphNetwork; + + /** + * Assign the positions of the vertexes in the network. + * @param {(Diagram | Group | Iterable<Part>)} coll A Diagram or a Group or a collection of Parts. + */ + doLayout(coll: (Diagram | Group | Iterable<Part>)): void; + + /**The faster, less aggressive, crossing reduction algorithm; a valid value for LayeredDigraphLayout.aggressiveOption.*/ + static AggressiveLess: EnumValue; + + /**The slower, more aggressive, crossing reduction algorithm, a valid value for LayeredDigraphLayout.aggressiveOption.*/ + static AggressiveMore: EnumValue; + + /**The fastest, but poorest, crossing reduction algorithm; a valid value for LayeredDigraphLayout.aggressiveOption.*/ + static AggressiveNone: EnumValue; + + /**Remove cycles using depth first cycle removal; a valid value of LayeredDigraphLayout.cycleRemoveOption.*/ + static CycleDepthFirst: EnumValue; + + /**Remove cycles using greedy cycle removal; a valid value of LayeredDigraphLayout.cycleRemoveOption.*/ + static CycleGreedy: EnumValue; + + /**Initialize using depth first in initialization; a valid value for LayeredDigraphLayout.initializeOption.*/ + static InitDepthFirstIn: EnumValue; + + /**Initialize using depth first out initialization; a valid value for LayeredDigraphLayout.initializeOption.*/ + static InitDepthFirstOut: EnumValue; + + /**Initialize using naive initialization; a valid value for LayeredDigraphLayout.initializeOption.*/ + static InitNaive: EnumValue; + + /**Assign layers using longest path sink layering; a valid value for LayeredDigraphLayout.layeringOption.*/ + static LayerLongestPathSink: EnumValue; + + /**Assign layers using longest path source layering; a valid value for LayeredDigraphLayout.layeringOption.*/ + static LayerLongestPathSource: EnumValue; + + /**Assign layers using optimal link length layering; A valid value for LayeredDigraphLayout.layeringOption.*/ + static LayerOptimalLinkLength: EnumValue; + + /**Enable all options for the LayeredDigraphLayout.packOption property; See also LayeredDigraphLayout.PackExpand, LayeredDigraphLayout.PackStraighten, and LayeredDigraphLayout.PackMedian.*/ + static PackAll: number; + + /**This option gives more chances for the packing algorithm to improve the network, but is very expensive in time for large networks; a valid value for LayeredDigraphLayout.packOption.*/ + static PackExpand: number; + + /**This option tries to have the packing algorithm center groups of nodes based on their relationships with nodes in other layers, a valid value for LayeredDigraphLayout.packOption.*/ + static PackMedian: number; + + /**Does minimal work in packing the nodes; a valid value for LayeredDigraphLayout.packOption.*/ + static PackNone: number; + + /**This option tries to have the packing algorithm straighten many of the links that cross layers, a valid value for LayeredDigraphLayout.packOption.*/ + static PackStraighten: number; + + linkSpacing: number; // undocumented + protected nodeMinLayerSpace(v: LayeredDigraphVertex, tl: boolean): number; // undocumented + protected nodeMinColumnSpace(v: LayeredDigraphVertex, tl: boolean): number; // undocumented + } + + class LayeredDigraphNetwork extends LayoutNetwork { // undocumented + } + + /** This holds LayeredDigraphLayout-specific information about Link s.*/ + class LayeredDigraphEdge extends LayoutEdge { + /**True if the link is part of the depth first forest.*/ + forest: boolean; + + /**Approximate column offset of the from port of the link from the from node column used in straightening.*/ + portFromColOffset: number; + + /**Location of the port at the from node of the link.*/ + portFromPos: number; + + /**Approximate column offset of the to port of the link from the to node column used in straightening.*/ + portToColOffset: number; + + /**Location of the port at the to node of the link.*/ + portToPos: number; + + /**True if the link was reversed during cycle removal.*/ + rev: boolean; + + /**True if the link is part of the proper digraph.*/ + valid: boolean; + } + + /** This holds LayeredDigraphLayout-specific information about Nodes.*/ + class LayeredDigraphVertex extends LayoutVertex { + /**The column to which the node is assigned.*/ + column: number; + + /**The connected component to which the node is assigned.*/ + component: number; + + /**The index to which the node is assigned.*/ + index: number; + + /**The layer to which the node is assigned.*/ + layer: number; + + /**Another LayeredDigraphVertex in the same layer that this node should be near.*/ + near: LayeredDigraphVertex; + } + + /** + * This is the base class for all of the predefined diagram layout implementations. + * They only arrange Parts (primarily Nodes and Links) in a Diagram, + * not to GraphObjects in Panels (i.e. panel layout). + */ + class Layout { + /** + * Create a minimal layout that only positions Nodes that do not have a location. + */ + constructor(); + + /**Gets or sets the top-left point for where the graph should be positioned when laid out.*/ + arrangementOrigin: Point; + + /**This read-only property returns the Diagram that owns this layout, if it is the value of Diagram.layout.*/ + diagram: Diagram; + + /**This read-only property returns the Group that uses this layout, if it is the value of a group's Group.layout.*/ + group: Group; + + /**Gets or sets whether this layout is performed on an initial layout.*/ + isInitial: boolean; + + /**Gets or sets whether this layout can be invalidated by .invalidateLayout.*/ + isOngoing: boolean; + + /**Gets or sets whether this layout be performed in real-time, before the end of a transaction.*/ + isRealtime: boolean; + + /**Gets or sets whether this layout routes Links.*/ + isRouting: boolean; + + /**Gets or sets whether this layout needs to be performed again.*/ + isValidLayout: boolean; + + /**Gets or sets whether this layout depends on the Diagram.viewportBounds's size.*/ + isViewportSized: boolean; + + /**Gets or sets the LayoutNetwork used by this Layout, if any.*/ + network: LayoutNetwork; + + /** + * When using a LayoutNetwork, commit changes to the diagram by setting Node positions and by routing the Links. + */ + commitLayout(): void; + + /** + * Creates a copy of this Layout and returns it. + */ + copy(): Layout; + + /** + * Create a new LayoutNetwork of LayoutVertexes and LayoutEdges. + */ + createNetwork(): LayoutNetwork; + + /** + * Position all of the nodes that do not have an assigned Part.location in the manner of a simple rectangular array. + * @param {(Diagram | Group | Iterable<Part>)} coll A Diagram or a Group or a collection of Parts. + */ + doLayout(coll: (Diagram | Group | Iterable<Part>)): void; + + /** + * If .isOngoing is true and if an initial layout has not yet been performed, set the .isValidLayout property to false, and ask to perform another layout in the near future. + */ + invalidateLayout(): void; + + /** + * Create and initialize a LayoutNetwork with the given nodes and links. + * @param {(Diagram | Group | Iterable<Part>)} coll A Diagram or a Group or a collection of Parts. + */ + makeNetwork(coll: (Diagram | Group | Iterable<Part>)): LayoutNetwork; + + /** + * When using a LayoutNetwork, update the "physical" node positionings and link routings. + */ + updateParts(): void; + + protected cloneProtected(copy: Layout): void; // undocumented + collectParts(coll: Iterable<Part>): void; // undocumented + } + + /** + * This provides an abstract view of a diagram as a + * network (graph) of vertexes and directed edges. + * The network contains vertexes and edges corresponding to Nodes and Links. + */ + class LayoutNetwork { + /** + * This constructs an empty network. + */ + constructor(); + + /**Gets a collection of all of the LayoutEdges in this network.*/ + edges: Set<LayoutEdge>; + + /**This read-only property returns the Layout that uses this network of LayoutVertexes and LayoutEdges.*/ + layout: Layout; + + /**Gets a collection of all of the LayoutVertexes in this network.*/ + vertexes: Set<LayoutVertex>; + + /** + * Adds a LayoutEdge to the network. + * @param {LayoutEdge} edge + */ + addEdge(edge: LayoutEdge): void; + + /** + * This convenience method makes sure there is a LayoutEdge in this network corresponding to a Link. + * @param {Link} link + * @param {Link} link + */ + addLink(link: Link): LayoutEdge; + + /** + * This convenience method makes sure there is a LayoutVertex in this network corresponding to a Node. + * @param {Node} node + */ + addNode(node: Node): LayoutVertex; + + /** + * Creates a network of LayoutVertexes and LayoutEdges corresponding to the given Nodes and Links. + * @param {Iterable<Part>} parts A collection of Nodes or Links. + * @param {boolean=} toplevelonly whether to skip Parts in the given collection that are contained by Groups; default is false. + * @param {function(Part):boolean|null=} pred optional predicate to apply to each Part -- + * if it returns false do not include Vertex or Edge in the network for that Part; + * default ignores link label nodes or links connecting with them + */ + addParts(parts: Iterable<Part>, toplevelonly?: boolean, pred?: (part: Part) => boolean): void; + + /** + * Adds a LayoutVertex to the network. + * @param {LayoutVertex} vertex + */ + addVertex(vertex: LayoutVertex): void; + + /** + * Allocate a new instance of LayoutEdge. + */ + createEdge(): LayoutEdge; + + /** + * Allocate a new instance of LayoutVertex. + */ + createVertex(): LayoutVertex; + + /** + * Deletes all vertexes and edges that have no Part associated with them. + */ + deleteArtificialVertexes(): void; + + /** + * Removes a LayoutEdge from the network. + * @param {LayoutEdge} edge + */ + deleteEdge(edge: LayoutEdge): void; + + /** + * This convenience method deletes from this network any LayoutEdge corresponding to a Link. + * @param {Link} link + */ + deleteLink(link: Link): void; + + /** + * This convenience method deletes any LayoutVertex corresponding to a Node. + * @param {Node} node + */ + deleteNode(node: Node): void; + + /** + * Deletes all LayoutEdges whose "to vertex" and "from vertex" are the same vertex. + */ + deleteSelfEdges(): void; + + /** + * Removes a LayoutVertex from the network. + * @param {LayoutVertex} vertex + */ + deleteVertex(vertex: LayoutVertex): void; + + /** + * Retrieve all of the Nodes and Links from the LayoutVertexes and LayoutEdges that are in this network. + */ + findAllParts(): Set<Part>; + + /** + * Returns the LayoutEdge that was constructed for the Link. + * @param {Link} link + */ + findEdge(link: Link): LayoutEdge; + + /** + * Returns the LayoutVertex that was constructed for the Node. + * @param {Node} node + */ + findVertex(node: Node): LayoutVertex; + + /** + * Links two vertexes already in the network and returns the created LayoutEdge. + * @param {LayoutVertex} fromVertex + * @param {LayoutVertex} toVertex + * @param {Link} link + */ + linkVertexes(fromVertex: LayoutVertex, toVertex: LayoutVertex, link: Link): LayoutEdge; + + /** + * Reverses the direction of a LayoutEdge in the network. + * @param {LayoutEdge} edge + */ + reverseEdge(edge: LayoutEdge): void; + + /** + * Modify this network by splitting it up into separate subnetworks, each of which has all of its vertexes connected to each other, but not to any vertexes in any other subnetworks. + */ + splitIntoSubNetworks(): List<LayoutNetwork>; + } + + /** An edge represents a link in a LayoutNetwork. It holds layout-specific data for the link. */ + class LayoutEdge { + /** + * This constructs an edge that does not know about any Link. + */ + constructor(); + + /**Gets or sets the LayoutVertex that this edge comes from.*/ + fromVertex: LayoutVertex; + + /**Gets or sets the Link associated with this edge, if any.*/ + link: Link; + + /**Gets or sets the LayoutNetwork that owns this edge.*/ + network: LayoutNetwork; + + /**Gets or sets the LayoutVertex that this edge goes to.*/ + toVertex: LayoutVertex; + + /** + * Commits the route of this edge to the corresponding Link, if any. + */ + commit(): void; + + /** + * Returns the edge's vertex at the other of this edge from the given vertex. + * @param {LayoutVertex} v + */ + getOtherVertex(v: LayoutVertex): void; + + data: any; // undocumented + } + + /** A vertex represents a node in a LayoutNetwork. It holds layout-specific data for the node. */ + class LayoutVertex { + /** + * This constructs a vertex that does not know about any Node. + */ + constructor(); + + /**Gets or sets the Bounds of this vertex, in document coordinates.*/ + bounds: Rect; + + /**Gets or sets the center Point.x of this vertex, in document coordinates.*/ + centerX: number; + + /**Gets or sets the center Point.y of this vertex, in document coordinates.*/ + centerY: number; + + /**Gets an iterator for all of the edges that go out of this vertex.*/ + destinationEdges: Iterator<LayoutEdge>; + + /**Gets an iterator for all of the vertexes that are connected with edges going out of this vertex.*/ + destinationVertexes: Iterator<LayoutVertex>; + + /**Gets an iterator for all of the edges that are connected with this vertex in either direction.*/ + edges: Iterator<LayoutEdge>; + + /**This read-only property returns the total number of edges that are connected with this vertex in either direction.*/ + edgesCount: number; + + /**Gets or sets the offset of the .centerX and .centerY from the .bounds position.*/ + focus: Point; + + /**Gets or sets the relative X position of the "center" point, the focus.*/ + focusX: number; + + /**Gets or sets the relative Y position of the "center" point, the focus.*/ + focusY: number; + + /**Gets or sets the height of this vertex.*/ + height: number; + + /**Gets or sets the LayoutNetwork that owns this vertex.*/ + network: LayoutNetwork; + + /**Gets or sets the Node associated with this vertex, if any.*/ + node: Node; + + /**Gets an iterator for all of the edges that come into this vertex.*/ + sourceEdges: Iterator<LayoutEdge>; + + /**Gets an iterator for all of the vertexes that are connected with edges coming into this vertex.*/ + sourceVertexes: Iterator<LayoutVertex>; + + /**Gets an iterator for all of the vertexes that are connected in either direction with this vertex.*/ + vertexes: Iterator<LayoutVertex>; + + /**Gets or sets the width of this vertex.*/ + width: number; + + /**Gets or sets the left point of this vertex.*/ + x: number; + + /**Gets or sets the top point of this vertex.*/ + y: number; + + /** + * Adds a LayoutEdge to the list of successors (the edge will be going out from this vertex). + * @param {LayoutEdge} edge + */ + addDestinationEdge(edge: LayoutEdge): void; + + /** + * Adds a LayoutEdge to the list of predecessors (the edge will be coming into this vertex). + * @param {LayoutEdge} edge + */ + addSourceEdge(edge: LayoutEdge): void; + + /** + * Moves the Node corresponding to this vertex so that its position is at the current .bounds point. + */ + commit(): void; + + /** + * Deletes a LayoutEdge from the list of successors (the edge was going out from this vertex). + * @param {LayoutEdge} edge + */ + deleteDestinationEdge(edge: LayoutEdge): void; + + /** + * Deletes a LayoutEdge from the list of predecessors (the edge was coming into this vertex). + * @param {LayoutEdge} edge + */ + deleteSourceEdge(edge: LayoutEdge): void; + + /** + * This static function is used to compare the Part.text values of the .nodes of the argument LayoutVertexes. + * @param {LayoutVertex} m + * @param {LayoutVertex} n + */ + static smartComparer(m: LayoutVertex, n: LayoutVertex): number; + + /** + * This static function is used to compare the Part.text values of the .nodes of the argument LayoutVertexes. + * @param {LayoutVertex} m + * @param {LayoutVertex} n + */ + static standardComparer(m: LayoutVertex, n: LayoutVertex): number; + + data: any; // undocumented + } + + /** + * This layout positions nodes in a tree-like arrangement. + */ + class TreeLayout extends Layout { + /** + * Constructs a TreeLayout with no Layout.network and with no owning Layout.diagram. + */ + constructor(); + + /**Gets or sets the default alignment of parents relative to their children.*/ + alignment: EnumValue; + + /**Gets or sets the default alignment of parents relative to their children.*/ + alternateAlignment: EnumValue; + + /**Gets or sets the default direction for tree growth.*/ + alternateAngle: number; + + /**Gets or sets a limit on how broad a tree should be.*/ + alternateBreadthLimit: number; + + /**Gets or sets the spot that children nodes' ports get as their ToSpot The default value is Spot.Default.*/ + alternateChildPortSpot: Spot; + + /**Gets or sets the distance between a node and its comments.*/ + alternateCommentMargin: number; + + /**Gets or sets the distance between comments.*/ + alternateCommentSpacing: number; + + /**Gets or sets how closely to pack the child nodes of a subtree.*/ + alternateCompaction: EnumValue; + + /**Gets or sets the default comparison function used for sorting.*/ + alternateComparer: (a: TreeVertex, b: TreeVertex) => number; + + /**Gets or sets the object holding the default values for alternate layer TreeVertexes, used when the .treeStyle is .StyleAlternating or .StyleLastParents.*/ + alternateDefaults: TreeVertex; + + /**Gets or sets the distance between a parent node and its children.*/ + alternateLayerSpacing: number; + + /**Gets or sets the fraction of the node's depth for which the children's layer starts overlapped with the parent's layer.*/ + alternateLayerSpacingParentOverlap: number; + + /**Gets or sets the default indentation of the first child.*/ + alternateNodeIndent: number; + + /**Gets or sets the fraction of this node's breadth is added to .nodeIndent to determine any spacing at the start of the children.*/ + alternateNodeIndentPastParent: number; + + /**Gets or sets the distance between child nodes.*/ + alternateNodeSpacing: number; + + /**Gets or sets the spot that this node's port gets as its FromSpot.*/ + alternatePortSpot: Spot; + + /**Gets or sets the default indentation of the first child of each row, if the .alignment is not a "Center" alignment.*/ + alternateRowIndent: number; + + /**Gets or sets the distance between rows of children.*/ + alternateRowSpacing: number; + + /**Gets or sets whether the TreeLayout should set the ToSpot for each child node port.*/ + alternateSetsChildPortSpot: boolean; + + /**Gets or sets whether the TreeLayout should set the FromSpot for this parent node port.*/ + alternateSetsPortSpot: boolean; + + /**Gets or sets the default Sorting policy.*/ + alternateSorting: EnumValue; + + /**Gets or sets the default direction for tree growth.*/ + angle: number; + + /**Gets or sets how .arrangeTrees should lay out the separate trees.*/ + arrangement: EnumValue; + + /**Gets or sets the space between which .arrangeTrees will position the trees.*/ + arrangementSpacing: Size; + + /**Gets or sets a limit on how broad a tree should be.*/ + breadthLimit: number; + + /**Gets or sets the spot that children nodes' ports get as their ToSpot.*/ + childPortSpot: Spot; + + /**Gets or sets the distance between a node and its comments.*/ + commentMargin: number; + + /**Gets or sets the distance between comments.*/ + commentSpacing: number; + + /**Gets or sets how closely to pack the child nodes of a subtree.*/ + compaction: EnumValue; + + /**Gets or sets whether to call .addComments.*/ + comments: boolean; + + /**Gets or sets the default comparison function used for sorting.*/ + comparer: (a: TreeVertex, b: TreeVertex) => number; + + /**Gets or sets the distance between a parent node and its children.*/ + layerSpacing: number; + + /**Gets or sets the fraction of the node's depth for which the children's layer starts overlapped with the parent's layer.*/ + layerSpacingParentOverlap: number; + + /**Gets or sets the manner in which the nodes are aligned in layers.*/ + layerStyle: EnumValue; + + /**Gets or sets the default indentation of the first child.*/ + nodeIndent: number; + + /**Gets or sets the fraction of this node's breadth is added to .nodeIndent to determine any spacing at the start of the children.*/ + nodeIndentPastParent: number; + + /**Gets or sets the distance between child nodes.*/ + nodeSpacing: number; + + /**Gets or sets how the tree should be constructed from the TreeEdges connecting TreeVertexes.*/ + path: EnumValue; + + /**Gets or sets the spot that this node's port gets as its FromSpot.*/ + portSpot: Spot; + + /**Gets or sets the object holding the default values for root TreeVertexes.*/ + rootDefaults: TreeVertex; + + /**Gets or sets the collection of root vertexes.*/ + roots: Set<TreeVertex|Node>; + + /**Gets or sets the default indentation of the first child of each row, if the .alignment is not a "Center" alignment.*/ + rowIndent: number; + + /**Gets or sets the distance between rows of children.*/ + rowSpacing: number; + + /**Gets or sets whether the TreeLayout should set the ToSpot for each child node port.*/ + setsChildPortSpot: boolean; + + /**Gets or sets whether the TreeLayout should set the FromSpot for this parent node port.*/ + setsPortSpot: boolean; + + /**Gets or sets the default Sorting policy.*/ + sorting: EnumValue; + + /**Gets or sets the Style for the resulting trees.*/ + treeStyle: EnumValue; + + /** + * Find associated objects to be positioned along with the TreeVertex. + * @param {LayoutVertex} v + */ + addComments(v: TreeVertex): void; + + /** + * Position each separate tree. + */ + arrangeTrees(): void; + + /** + * Assign final property values for a TreeVertex. + * @param {LayoutVertex} v + */ + assignTreeVertexValues(v: TreeVertex): void; + + /** + * This overridable method is called by commitLayout if layerStyle is LayerUniform + * to support custom arrangement of bands or labels across each layout layer. + * @param Array<*> layerRects an Array of Rects with the bounds of each of the "layers" + * @param {Point} offset the position of the top-left corner of the banded area relative to the coordinates given by the layerRects + */ + commitLayers(layerRects: Array<Rect>, offset: Point): void; + + /** + * Set the fromSpot and toSpot for each Vertex, position each Node according to the Vertex position, and then position the Links. + */ + commitLayout(): void; + + /** + * Commit the position and routing of all edge links. + */ + commitLinks(): void; + + /** + * Commit the position of all vertex nodes. + */ + commitNodes(): void; + + /** + * Create a new LayoutNetwork of TreeVertexes and TreeEdges. + */ + createNetwork(): TreeNetwork; + + /** + * Assign the positions of the vertexes in the network. + * @param {(Diagram | Group | Iterable<Part>)} coll A Diagram or a Group or a collection of Parts. + */ + doLayout(coll: (Diagram | Group | Iterable<Part>)): void; + + /** + * Assign initial property values for a TreeVertex. + * @param {LayoutVertex} v + */ + initializeTreeVertexValues(v: TreeVertex): void; + + /** + * Position and TreeVertex.comments around the vertex. + * @param {LayoutVertex} v + */ + layoutComments(v: TreeVertex): void; + + /**The children are positioned in a bus, only on the bottom or right side of the parent; This value is used for TreeLayout.alignment or TreeLayout.alternateAlignment.*/ + static AlignmentBottomRightBus: EnumValue; + + /**The children are positioned in a bus on both sides of an "aisle" where the links to them go, with the last odd child (if any) placed at the end of the aisle in the middle.*/ + static AlignmentBus: EnumValue; + + /**Like TreeLayout.AlignmentBus with the children arranged on both sides of an "aisle" with any last odd child placed at the end of the aisle, but the children get an TreeVertex.angle that depends on which side of the aisle they were placed.*/ + static AlignmentBusBranching: EnumValue; + + /**The parent is centered at the middle of the range of its immediate child nodes; This value is used for TreeLayout.alignment or TreeLayout.alternateAlignment.*/ + static AlignmentCenterChildren: EnumValue; + + /**The parent is centered at the middle of the range of its child subtrees; This value is used for TreeLayout.alignment or TreeLayout.alternateAlignment.*/ + static AlignmentCenterSubtrees: EnumValue; + + /**The parent is positioned near the last of its children; This value is used for TreeLayout.alignment or TreeLayout.alternateAlignment.*/ + static AlignmentEnd: EnumValue; + + /**The parent is positioned near the first of its children; This value is used for TreeLayout.alignment or TreeLayout.alternateAlignment.*/ + static AlignmentStart: EnumValue; + + /**The children are positioned in a bus, only on the top or left side of the parent; This value is used for TreeLayout.alignment or TreeLayout.alternateAlignment.*/ + static AlignmentTopLeftBus: EnumValue; + + /**Do not move each root node, but position all of their descendants relative to their root; This value is used for TreeLayout.arrangement.*/ + static ArrangementFixedRoots: EnumValue; + + /**Position each tree in a non-overlapping fashion by increasing X coordinates, starting at the Layout.arrangementOrigin; This value is used for TreeLayout.arrangement.*/ + static ArrangementHorizontal: EnumValue; + + /**Position each tree in a non-overlapping fashion by increasing Y coordinates, starting at the Layout.arrangementOrigin; This value is used for TreeLayout.arrangement.*/ + static ArrangementVertical: EnumValue; + + /**A simple fitting of subtrees; This value is used for TreeLayout.compaction or TreeLayout.alternateCompaction.*/ + static CompactionBlock: EnumValue; + + /**Only simple placement of children next to each other, as determined by their subtree breadth; This value is used for TreeLayout.compaction or TreeLayout.alternateCompaction.*/ + static CompactionNone: EnumValue; + + /**This default value for TreeLayout.layerStyle causes each node takes up only the depth that it needs.*/ + static LayerIndividual: EnumValue; + + /**This value for TreeLayout.layerStyle causes all of the children of a parent node take up the same amount of depth -- this typically causes all cousins to be aligned.*/ + static LayerSiblings: EnumValue; + + /**This value for TreeLayout.layerStyle causes all nodes with the same TreeVertex.level throughout the tree take up the same amount of depth.*/ + static LayerUniform: EnumValue; + + /**This value for TreeLayout.path causes the value of Diagram.isTreePathToChildren to effectively choose either TreeLayout.PathDestination (if true) or TreeLayout.PathSource (if false).*/ + static PathDefault: EnumValue; + + /**The children of a TreeVertex are its LayoutVertex.destinationVertexes, the collection of connected LayoutEdge.toVertexes; This value is used for TreeLayout.path.*/ + static PathDestination: EnumValue; + + /**The children of a TreeVertex are its LayoutVertex.sourceVertexes, the collection of connected LayoutEdge.fromVertexes; This value is used for TreeLayout.path.*/ + static PathSource: EnumValue; + + /**Lay out each child according to the sort order given by TreeVertex.comparer; This value is used for TreeLayout.sorting or TreeLayout.alternateSorting.*/ + static SortingAscending: EnumValue; + + /**Lay out each child in reverse sort order given by TreeVertex.comparer; This value is used for TreeLayout.sorting or TreeLayout.alternateSorting.*/ + static SortingDescending: EnumValue; + + /**Lay out each child in the order in which they were found; This value is used for TreeLayout.sorting or TreeLayout.alternateSorting.*/ + static SortingForwards: EnumValue; + + /**Lay out each child in reverse order from which they were found; This value is used for TreeLayout.sorting or TreeLayout.alternateSorting.*/ + static SortingReverse: EnumValue; + + /**Alternate layers of the tree have different properties, typically including the angle; This value is used for TreeLayout.treeStyle.*/ + static StyleAlternating: EnumValue; + + /**Just like the standard layered tree style, except that the nodes with children but no grandchildren have alternate properties; This value is used for TreeLayout.treeStyle.*/ + static StyleLastParents: EnumValue; + + /**The normal tree style, where all of the children of each TreeVertex are lined up horizontally or vertically; This value is used for TreeLayout.treeStyle.*/ + static StyleLayered: EnumValue; + + /**All of the nodes get the alternate properties, except the root node gets the default properties; This value is used for TreeLayout.treeStyle.*/ + static StyleRootOnly: EnumValue; + } + + class TreeNetwork extends LayoutNetwork { // undocumented + } + + /** This holds TreeLayout-specific information about Links.*/ + class TreeEdge extends LayoutEdge { + /**Gets or sets a Point, relative to the parent node, that may be useful in routing this link.*/ + relativePoint: Point; + + /** + * Commits the position of the Link and routes it. + */ + commit(): void; + } + + /** This holds TreeLayout-specific information about Nodes.*/ + class TreeVertex extends LayoutVertex { + /**Gets or sets how this parent node should be aligned relative to its children.*/ + alignment: EnumValue; + + /**Gets or sets the actual absolute angle at which this node should grow.*/ + angle: number; + + /**Gets or sets how broad a node and its descendants should be.*/ + breadthLimit: number; + + /**Gets or sets the spot that children nodes' ports get as their ToSpot, if .setsChildPortSpot is true and the node has only a single port.*/ + childPortSpot: Spot; + + /**Gets or sets the logical children for this node.*/ + children: Array<TreeVertex>; + + /**This read-only property returns the number of immediate children this node has.*/ + childrenCount: number; + + /**Gets or sets the space to leave between the node and the comments.*/ + commentMargin: number; + + /**Gets or sets an array of Nodes that will be positioned near this node.*/ + comments: Array<Node>; + + /**Gets or sets the space to leave between consecutive comments.*/ + commentSpacing: number; + + /**Gets or sets how the children of this node should be packed together.*/ + compaction: EnumValue; + + /**Gets or sets how the children should be sorted.*/ + comparer: (a: TreeVertex, b: TreeVertex) => number; + + /**Gets or sets the number of descendants this node has.*/ + descendantCount: number; + + /**Gets or sets whether this node has been initialized as part of TreeLayout.doLayout when building the tree structures.*/ + initialized: boolean; + + /**Gets or sets the distance between this node and its children.*/ + layerSpacing: number; + + /**Gets or sets the fraction of this node's depth that may overlap with the children's layer.*/ + layerSpacingParentOverlap: number; + + /**Gets or sets the number of single-parent ancestors this node has.*/ + level: number; + + /**Gets or sets the maximum number of children of any descendant of this node.*/ + maxChildrenCount: number; + + /**Gets or sets the maximum depth of the subtrees below this node.*/ + maxGenerationCount: number; + + /**Gets or sets the distance the first child should be indented.*/ + nodeIndent: number; + + /**Gets or sets whether the first child should be indented past the parent node's breadth.*/ + nodeIndentPastParent: number; + + /**Gets or sets the distance between child nodes.*/ + nodeSpacing: number; + + /**Gets or sets the logical parent for this node.*/ + parent: TreeVertex; + + /**Gets or sets the spot that this node's port gets as its FromSpot, if .setsPortSpot is true and the node has only a single port.*/ + portSpot: Spot; + + /**Gets or sets the position of this node relative to its parent node.*/ + relativePosition: Point; + + /**Gets or sets the distance the first child of each row should be indented.*/ + rowIndent: number; + + /**Gets or sets the distance between rows within one layer, all sharing the same parent.*/ + rowSpacing: number; + + /**Gets or sets whether the TreeLayout should set the ToSpot for each child node port.*/ + setsChildPortSpot: boolean; + + /**Gets or sets whether the TreeLayout should set the FromSpot for this parent node port.*/ + setsPortSpot: boolean; + + /**Gets or sets whether and in what order the children should be sorted.*/ + sorting: EnumValue; + + /**Gets or sets the offset of this parent node relative to its whole subtree.*/ + subtreeOffset: Point; + + /**Gets or sets the size of the subtree (including all descendants) parented by this node.*/ + subtreeSize: Size; + + /** + * Copy inherited properties from another TreeVertex to this one. + * @param {TreeVertex} copy + */ + copyInheritedPropertiesFrom(copy: TreeVertex): void; + } + + + /** + * The ActionTool is responsible for handling and dispatching mouse events on GraphObjects + * that have GraphObject.isActionable set to true. + * This is how one implements "controls", such as buttons or sliders or knobs, as GraphObjects + * that can be inside Parts without interfering with the standard tool behaviors. + */ + class ActionTool extends Tool { + /** + * You do not normally need to create an instance of this tool because one already exists as the ToolManager.actionTool. + */ + constructor(); + + /** + * This tool can run when there is a mouse-down on an object with GraphObject.isActionable true or if the object is within a Panel that "isActionable". + */ + canStart(): boolean; + + /** + * Call the GraphObject.actionCancel event if defined on the current object. + */ + doCancel(): void; + + /** + * If there is a GraphObject found with GraphObject.isActionable set to true, call that object's GraphObject.actionDown event, if it exists. + */ + doMouseDown(): void; + + /** + * If this tool is active call GraphObject.actionMove, if it exists, on the active object. + */ + doMouseMove(): void; + + /** + * Calls the GraphObject.actionUp event if defined, then effectively calls Tool.standardMouseClick to perform the normal click behaviors, and then stops this tool. + */ + doMouseUp(): void; + } + + /** + * The ClickCreatingTool lets the user create a node by clicking where they want the new node to be. + * By default a double-click is required to start this tool; + * set .isDoubleClick to false if you want a single-click to create a node. + */ + class ClickCreatingTool extends Tool { + /** + * You do not normally need to create an instance of this tool because one already exists as the ToolManager.clickCreatingTool, which you can modify. + */ + constructor(); + + /**Gets or sets a data object that will be copied and added to the diagram's model each time this tool executes. The value must be an Object or null.*/ + archetypeNodeData: any; + + /**Gets or sets whether a double click rather than a single-click is required to insert a new Part at the mouse-up point.*/ + isDoubleClick: boolean; + + /** + * This tool can run when the diagram is not read-only and supports creating new nodes, and when there has been a click (or double-click if .isDoubleClick is true) in the background of the diagram (not on a Part), and .archetypeNodeData is an object that can be copied and added to the model. + */ + canStart(): boolean; + + /** + * Upon a click, call .insertPart and stop this tool. + */ + doMouseUp(): void; + + /** + * Create a node by adding a copy of the .archetypeNodeData object to the diagram's model, assign its Part.location to be the given point, and select the new part. + * @param {Point} loc a Point in document coordinates. + */ + insertPart(loc: Point): Part; + } + + /** + * The ClickSelectingTool selects and deselects Parts when there is a click. + * It does this by calling Tool.standardMouseSelect. + * It is also responsible for handling and dispatching click events on GraphObjects + * by calling Tool.standardMouseClick. + */ + class ClickSelectingTool extends Tool { + /** + * You do not normally need to create an instance of this tool because one already exists as the ToolManager.clickSelectingTool. + */ + constructor(); + + /** + * This tool can run when there was a click. + */ + canStart(): boolean; + + /** + * Upon a click, this calls Tool.standardMouseSelect to change the Diagram.selection collection, then calls Tool.standardMouseClick to perform the normal click behaviors, and then stops this tool. + */ + doMouseUp(): void; + } + + /** + * The ContextMenuTool is used to create and show a context menu. + * It automatically disables any browser context menu. + */ + class ContextMenuTool extends Tool { + /** + * You do not normally need to create an instance of this tool because one already exists as the ToolManager.contextMenuTool, which you can modify. + */ + constructor(); + + /**Gets or sets the currently showing context menu, or null if there is none.*/ + currentContextMenu: Adornment; + + /**Gets or sets the GraphObject found at the mouse point that has a context menu.*/ + currentObject: GraphObject; + + /**This read-only property returns the original mouse-down point in document coordinates.*/ + mouseDownPoint: Point; + + /** + * Return true if it's a mouse right click that hasn't moved Tool.isBeyondDragSize and that is on a GraphObject with a GraphObject.contextMenu. + */ + canStart(): boolean; + + /** + * Do nothing, activation is special and relies on doMouseUp + */ + doActivate(): void; + + /** + * Handle mouse-enter, mouse-over, and mouse-leave events. + */ + doMouseMove(): void; + + /** + * If there is something found by .findObjectWithContextMenu, call .showContextMenu with that object's GraphObject.contextMenu or Diagram.contextMenu. + */ + doMouseUp(): void; + + /** + * Find a GraphObject at the current mouse point with a GraphObject.contextMenu, or return the Diagram if there is a Diagram.contextMenu. + */ + findObjectWithContextMenu(): GraphObject | Diagram; + + /** + * Hide any context menu. + */ + hideContextMenu(): void; + + /** + * Hide the default context menu. + */ + hideDefaultContextMenu(): void; + + /** + * This is called by .showContextMenu to position the context menu within the viewport. + * @param {Adornment} contextmenu + * @param {GraphObject} obj + */ + positionContextMenu(contextmenu: Adornment, obj: GraphObject): void; + + /** + * Show an Adornment as a context menu. + * @param {Adornment} contextmenu + * @param {GraphObject} obj + */ + showContextMenu(contextmenu: Adornment, obj: GraphObject): void; + + /** + * Show a series of HTML elements acting as a context menu. + */ + showDefaultContextMenu(): void; + } + + /** + * This helper structure for DraggingTool holds the original location Point. + */ + interface DraggingInfo { // undocumented + point: Point; + } + + /** + * The DraggingTool is used to move or copy selected parts with the mouse. + * Dragging the selection moves parts for which Part.canMove is true. + * If the user holds down the Control key, this tool will make a copy of the parts being dragged, + * for those parts for which Part.canCopy is true. + */ + class DraggingTool extends Tool { + /** + * You do not normally need to create an instance of this tool because one already exists as the ToolManager.draggingTool, which you can modify. + */ + constructor(); + + /**This read-only property returns the collection of Parts that this tool has copied.*/ + copiedParts: Map<Part,DraggingInfo>; + + /**Gets or sets whether for a copying operation the extended selection is copied or only the selected parts.*/ + copiesEffectiveCollection: boolean; + + /**This read-only property returns the Part found at the mouse point.*/ + currentPart: Part; + + /**On touch gestures only, this property gets or sets the time in milliseconds for which the mouse must be stationary before this tool can be started.*/ + delay: number; + + /**This read-only property returns the collection of Parts being dragged.*/ + draggedParts: Map<Part,DraggingInfo>; + + /**Gets or sets whether the user can drag a single Link, disconnecting it from its connected nodes and possibly connecting it to valid ports when the link is dropped.*/ + dragsLink: boolean; + + /**Gets or sets whether moving or copying a node also includes all of the node's tree children and their descendants, along with the links to those additional nodes.*/ + dragsTree: boolean; + + /**Gets or sets the size of the grid cell used when snapping during a drag if the value of .isGridSnapEnabled is true.*/ + gridSnapCellSize: Size; + + /**Gets or sets the Spot that specifies what point in the grid cell dragged parts snap to, if the value of .isGridSnapEnabled is true.*/ + gridSnapCellSpot: Spot; + + /**Gets or sets the snapping grid's origin point, in document coordinates, if the value of .isGridSnapEnabled is true.*/ + gridSnapOrigin: Point; + + /**Gets or sets whether for any internal copying operation is permitted by control-drag-and-drop.*/ + isCopyEnabled: boolean; + + /**Gets or sets whether the DraggingTool snaps objects to grid points.*/ + isGridSnapEnabled: boolean; + + /**Gets or sets whether the DraggingTool snaps objects to grid points during the drag.*/ + isGridSnapRealtime: boolean; + + /**Gets or sets the mouse point from which parts start to move.*/ + startPoint: Point; + + /** + * This tool can run if the diagram allows selection and moves/copies/dragging-out, if the mouse has moved far enough away to be a drag and not a click, and if .findDraggablePart has found a selectable part at the mouse-down point. + */ + canStart(): boolean; + + /** + * Find the actual collection of nodes and links to be moved or copied, given an initial collection. + * @param {Iterable<Part>} parts A Set or List of Parts. + */ + computeEffectiveCollection(parts: Iterable<Part>): Map<Part,DraggingInfo>; + + /** + * This method computes the new location for a Node or simple Part, given a new desired location and an optional Map of dragged parts, taking any grid-snapping into consideration, any Part.dragComputation function, and any Part.minLocation and Part.maxLocation. + * @param {Part} n + * @param {Point} newloc + * @param {Map=} draggedparts an optional Map mapping Parts to JavaScript Objects that have a "point" property remembering the original location of that Part. + * @param {Point=} result an optional Point that is modified and returned + */ + computeMove(n: Part, newloc: Point, draggedparts?: Map<Part,DraggingInfo>, result?: Point): Point; + + /** + * Start the dragging operation. + */ + doActivate(): void; + + /** + * Abort any dragging operation. + */ + doCancel(): void; + + /** + * Stop the dragging operation by stopping the transaction and cleaning up any temporary state. + */ + doDeactivate(): void; + + /** + * Perform any additional side-effects during a drag, whether an internal move or copy or an external drag, that may affect the existing non-moved object(s). + * @param {Point} pt a Point in document coordinates. + * @param {GraphObject} obj the GraphObject at the point, + * excluding what is being dragged or temporary objects; + * the argument may be null if the drag is occurring in the background of the diagram. + * Use GraphObject.part to get the Node or Part at the root of + * the visual tree of the stationary object. + */ + doDragOver(pt: Point, obj: GraphObject): void; + + /** + * Perform any additional side-effects after a drop, whether an internal move or copy or an external drop, that may affect the existing non-moved object(s). + * @param {Point} pt a Point in document coordinates. + * @param {GraphObject} obj the GraphObject where the drop occurred, + * excluding what was dropped or temporary objects; + * the argument may be null if the drop occurred in the background of the diagram. + * Use GraphObject.part to get the Node or Part at the root of + * the visual tree of the stationary object. + */ + doDropOnto(pt: Point, obj: GraphObject): void; + + /** + * Handle switching between copying and moving modes as the Control key is pressed or released. + */ + doKeyDown(): void; + + /** + * Handle switching between copying and moving modes as the Control key is pressed or released. + */ + doKeyUp(): void; + + /** + * Move the .draggedParts (or if copying, the .copiedParts) to follow the current mouse point. + */ + doMouseMove(): void; + + /** + * On a mouse-up finish moving or copying the effective selection. + */ + doMouseUp(): void; + + /** + * Return the selectable and movable/copyable Part at the mouse-down point. + */ + findDraggablePart(): Part; + + /** + * This predicate is true when the diagram allows objects to be copied and inserted, and some object in the selection is copyable, and the user is holding down the Control key. + */ + mayCopy(): boolean; + + /** + * This predicate is true when the diagram allows objects to be moved, and some object in the selection is movable. + */ + mayMove(): boolean; + + /** + Move a collection of Parts by a given offset. + * @param {Map} parts a Map mapping Parts to JavaScript Objects that have a "point" property remembering the original location of that Part. + * @param {Point} offset + * @param {boolean} check Whether to check Part.canMove on each part. + */ + moveParts(parts: Map<Part,DraggingInfo>, offset: Point, check: boolean): void; + + /** + * This override prevents the Control modifier unselecting an already selected part. + */ + standardMouseSelect(): void; + } + + /** + * The DragSelectingTool lets the user select multiple parts with a rectangular area. + * There is a temporary part, the .box, + * that shows the current area encompassed between the mouse-down + * point and the current mouse point. + * The default drag selection box is a blue rectangle. + * You can change the .box to customize its appearance -- see its documentation for an example. + */ + class DragSelectingTool extends Tool { + /** + * You do not normally need to create an instance of this tool because one already exists as the ToolManager.dragSelectingTool, which you can modify. + */ + constructor(); + + /**Gets or sets the Part used as the "rubber-band selection box" that is stretched to follow the mouse, as feedback for what area will be passed to .selectInRect upon a mouse-up.*/ + box: Part; + + /**Gets or sets the time in milliseconds for which the mouse must be stationary before this tool can be started.*/ + delay: number; + + /**Gets or sets whether a selectable Part may be only partly or must be completely enclosed by the rectangle given to .selectInRect.*/ + isPartialInclusion: boolean; + + /** + * This tool can run when the diagram allows selection, there has been delay of at least .delay milliseconds after the mouse-down before a mouse-move, there has been a mouse-drag far enough away not to be a click, and there is no selectable part at the mouse-down point. + */ + canStart(): boolean; + + /** + * This just returns a Rect stretching from the mouse-down point to the current mouse point. + */ + computeBoxBounds(): Rect; + + /** + * Capture the mouse and show the .box. + */ + doActivate(): void; + + /** + * Release the mouse and remove any .box. + */ + doDeactivate(): void; + + /** + * Update the .box's position and size according to the value of .computeBoxBounds. + */ + doMouseMove(): void; + + /** + * Call .selectInRect with the value of a call to .computeBoxBounds. + */ + doMouseUp(): void; + + /** + * This method is called to select some parts within the area of a given rectangle. + *@param {Rect} r + */ + selectInRect(r: Rect): void; + } + + /** + * This abstract class is the base class for the LinkingTool and RelinkingTool classes. + */ + class LinkingBaseTool extends Tool { + /** + * Don't construct this directly -- this is an abstract class. + */ + constructor(); + + /**Gets whether the linking operation is in the forwards direction, connecting from the "From" port to the "To" port.*/ + isForwards: boolean; + + /**Gets or sets whether it is valid to have partly or completely unconnected links.*/ + isUnconnectedLinkValid: boolean; + + /**Gets or sets a predicate that determines whether or not a new link between two ports would be valid.*/ + linkValidation: (fromNode: Node, fromPort: GraphObject, toNode: Node, toPort: GraphObject, link: Link) => boolean; + + /**Gets or sets the original Node from which the new link is being drawn or from which the .originalLink was connected when being relinked.*/ + originalFromNode: Node; + + /**Gets or sets the GraphObject that is the port in the .originalFromNode.*/ + originalFromPort: GraphObject; + + /**Gets or sets the original Link being reconnected by the RelinkingTool.*/ + originalLink: Link; + + /**Gets or sets the original Node to which the new link is being drawn or to which the .originalLink was connected when being relinked.*/ + originalToNode: Node; + + /**Gets or sets the GraphObject that is the port in the .originalToNode.*/ + originalToPort: GraphObject; + + /**Gets or sets the distance at which link snapping occurs.*/ + portGravity: number; + + /**Gets or sets a function that is called as the tool targets the nearest valid port.*/ + portTargeted: (realNode: Node, realPort: GraphObject, tempNode: Node, tempPort: GraphObject, toend: boolean) => void; + + /**Gets or sets a proposed GraphObject port for connecting a link.*/ + targetPort: GraphObject; + + /**Gets or sets the temporary Node at the "from" end of the .temporaryLink while the user is drawing or reconnecting a link.*/ + temporaryFromNode: Node; + + /**Gets or sets the GraphObject that is the port at the "from" end of the .temporaryLink while the user is drawing or reconnecting a link.*/ + temporaryFromPort: GraphObject; + + /**Gets or sets the temporary Link that is shown while the user is drawing or reconnecting a link.*/ + temporaryLink: Link; + + /**Gets or sets the temporary Node at the "to" end of the .temporaryLink while the user is drawing or reconnecting a link.*/ + temporaryToNode: Node; + + /**Gets or sets the GraphObject that is the port at the "to" end of the .temporaryLink while the user is drawing or reconnecting a link.*/ + temporaryToPort: GraphObject; + + /** + * Make a temporary port look and act like a real one. + * @param {Node} realnode + * @param {GraphObject} realport + * @param {Node} tempnode + * @param {GraphObject} tempport + * @param {boolean} toend + */ + copyPortProperties(realnode: Node, realport: GraphObject, tempnode: Node, tempport: GraphObject, toend: boolean): void; + + /** + * Mouse movement results in a temporary node moving to where a valid target port is located, or to where the mouse is if there is no valid target port nearby. + */ + doMouseMove(): void; + + /** + * Find a port with which the user could complete a valid link. + * @param {boolean} toend true if looking for a "to" port. + */ + findTargetPort(toend: boolean): GraphObject; + + /** + * This predicate is true if both argument ports are in the same Node. + * @param {GraphObject} fromport + * @param {GraphObject} toport + */ + isInSameNode(fromport: GraphObject, toport: GraphObject): boolean; + + /** + * This predicate is true if there is a link in the diagram going from the given port to the given port + * @param {GraphObject} fromport + * @param {GraphObject} toport. + */ + isLinked(fromport: GraphObject, toport: GraphObject): boolean; + + /** + * Checks whether a proposed link would be valid according to Diagram.validCycle. + * This does not distinguish between different ports on a node, so this method does not need to take port arguments. + * This is called by isValidLink. + * @param {Node} from + * @param {Node} to + * @param {Link} ignore may be null; this is useful during relinking to ignore the originalLink + * @return {boolean} + */ + isValidCycle(from: Node, to: Node, ignore: Link): boolean; + + /** + * This predicate is true if it is permissible to connect a link from a given node/port. + * @param {Node} fromnode + * @param {GraphObject} fromport + * False if the node is in a Layer that does not Layer.allowLink. + * False if the port's GraphObject.fromLinkable is either false or null. + * False if the number of links connected to the port would exceed the port's GraphObject.fromMaxLinks. + * Otherwise true. + */ + isValidFrom(fromnode: Node, fromport: GraphObject): boolean; + + /** + * This predicate should be true when it is logically valid to connect a new link from one node/port to another node/port. + * @param {Node} fromnode the "from" Node. + * @param {GraphObject} fromport the "from" GraphObject port. + * @param {Node} tonode the "to" Node. + * @param {GraphObject} toport the "to" GraphObject port. + * False if .isValidFrom is false for the "from" node/port. + * False if .isValidTo is false for the "to" node/port. + * False if .isInSameNode is true unless GraphObject.fromLinkableSelfNode + * and GraphObject.toLinkableSelfNode are true for the two ports. + * False if .isLinked is true unless GraphObject.fromLinkableDuplicates + * and GraphObject.toLinkableDuplicates are true for the two ports. + * False if trying to link to the link's own label node(s). + * If .linkValidation is a predicate and if it returns false, this predicate returns false. + * Otherwise this predicate is true. + */ + isValidLink(fromnode: Node, fromport: GraphObject, tonode: Node, toport: GraphObject): boolean; + + /** + * This predicate is true if it is permissible to connect a link to a given node/port. + * @param {Node} tonode + * @param {GraphObject} toport + * False if the node is in a Layer that does not Layer.allowLink. + * False if the port's GraphObject.toLinkable is either false or null. + * False if the number of links connected from the port would exceed the port's GraphObject.toMaxLinks. + * Otherwise true. + */ + isValidTo(tonode: Node, toport: GraphObject): boolean; + + /** + * Reset a temporary port's properties to neutral values when there is no target port. + * @param {Node} tempnode + * @param {GraphObject} tempport + * @param {boolean} toend + */ + setNoTargetPortProperties(tempnode: Node, tempport: GraphObject, toend: boolean): void; + } + + /** + * This abstract class is the base class for the LinkingTool and RelinkingTool classes. + * This class includes properties for defining and accessing any temporary nodes and temporary link + * that are used during any linking operation, as well as access to the existing diagram's nodes and link + * (if any) that are involved with the linking operation. + */ + class LinkingTool extends LinkingBaseTool { + /** + * You do not normally need to create an instance of this tool because one already exists as the ToolManager.linkingTool, which you can modify. + */ + constructor(); + + /**Gets or sets an optional node data object representing a link label, that is copied by .insertLink and added to the GraphLinksModel when creating a new Link. The value must be an Object or null.*/ + archetypeLabelNodeData: any; + + /**Gets or sets a data object that is copied by .insertLink and added to the GraphLinksModel when creating a new Link. The value must be an Object or null.*/ + archetypeLinkData: any; + + /**Gets or sets the direction in which new links may be drawn.*/ + direction: EnumValue; + + /**Gets or sets the GraphObject at which .findLinkablePort should start its search.*/ + startObject: GraphObject; + + /** + * This tool can run when the diagram allows linking, the model is modifiable, the left-button mouse drag has moved far enough away to not be a click, and when .findLinkablePort has returned a valid port. + */ + canStart(): boolean; + + /** + * Start the linking operation. + */ + doActivate(): void; + + /** + * Finishing the linking operation stops the transaction, releases the mouse, and resets the cursor. + */ + doDeactivate(): void; + + /** + * A mouse-up ends the linking operation; if there is a valid .targetPort nearby, this adds a new Link by calling .insertLink. + */ + doMouseUp(): void; + + /** + * Return the GraphObject at the mouse-down point, if it is part of a node and if it is valid to link with it. + */ + findLinkablePort(): GraphObject; + + /** + * Make a copy of the .archetypeLinkData, set its node and port properties, and add it to the model. + * @param {Node} fromnode + * @param {GraphObject} fromport + * @param {Node} tonode + * @param {GraphObject} toport + */ + insertLink(fromnode: Node, fromport: GraphObject, tonode: Node, toport: GraphObject): Link; + + /**This value for LinkingTool.direction indicates that users may draw new links backwards only.*/ + static BackwardsOnly: EnumValue; + + /**This value for LinkingTool.direction indicates that users may draw new links in either direction.*/ + static Either: EnumValue; + + /**This value for LinkingTool.direction indicates that users may draw new links forwards only.*/ + static ForwardsOnly: EnumValue; + } + + /** + * The LinkReshapingTool is used to interactively change the route of a Link. + * This tool makes use of an Adornment, shown when the adorned Link is selected, + * that includes some number of reshape handles. + * This tool conducts a transaction while the tool is active. + * A successful reshaping will result in a "LinkReshaped" DiagramEvent and a "LinkReshaping" transaction. + */ + class LinkReshapingTool extends Tool { + /** + * You do not normally need to create an instance of this tool because one already exists as the ToolManager.linkReshapingTool, which you can modify. + */ + constructor(); + + /**This read-only property returns the Link that is being routed manually.*/ + adornedLink: Link; + + /**This read-only property returns the GraphObject that is the tool handle being dragged by the user.*/ + handle: GraphObject; + + /**Gets or sets a small GraphObject that is copied as a reshape handle at each movable point in the selected link's route.*/ + handleArchetype: GraphObject; + + /**Gets or sets a small GraphObject that is copied as a resegment handle at each mid point in the selected Link's route.*/ + midHandleArchetype: GraphObject; + + /**This read-only property returns the Point that was the original location of the handle that is being dragged to reshape the Link.*/ + originalPoint: Point; + + /**This read-only property returns the List of Points that was the original route of the Link that is being reshaped.*/ + originalPoints: List<Point>; + + /** + * This tool may run when there is a mouse-down event on a reshape handle. + */ + canStart(): boolean; + + /** + * This is called by .doMouseMove and .doMouseUp to limit the input point before calling .reshape. + * @param {Point} p + */ + computeReshape(p: Point): Point; + + /** + * Start reshaping, if .findToolHandleAt finds a reshape handle at the mouse down point. + */ + doActivate(): void; + + /** + * Restore the link route to be the original points and stop this tool. + */ + doCancel(): void; + + /** + * This stops the current reshaping operation with the link route shaped the way it is. + */ + doDeactivate(): void; + + /** + * Call .reshape with a new point determined by the mouse to change the route of the .adornedLink. + */ + doMouseMove(): void; + + /** + * Reshape the route with a point based on the most recent mouse point by calling .reshape, and then raise a "LinkReshaped" DiagramEvent before stopping this tool. + */ + doMouseUp(): void; + + /** + * Get the permitted reshaping behavior for a particular reshape handle. + * @param {GraphObject} obj a reshape handle in the "LinkReshaping" Adornment. + */ + getReshapingBehavior(obj: GraphObject): EnumValue; + + /** + * Set the permitted reshaping behavior for a particular reshape handle. + * @param {GraphObject} obj a reshape handle in the "LinkReshaping" Adornment. + * @param {EnumValue} behavior one of LinkReshapingTool.All, .Vertical, .Horizontal, or .None + */ + setReshapingBehavior(obj: GraphObject, behavior: EnumValue): void; + + /** + * Change the route of the .adornedLink by moving the point corresponding to the current .handle to be at the given Point. + * @param {Point} newPoint + */ + reshape(newPoint: Point): void; + + /** + * Show an Adornment with reshape handles at each of the interesting points of the link's route, if the link is selected and visible and if Part.canReshape is true. + * @param {Part} part + */ + updateAdornments(part: Part): void; + + /**Allow dragging in any direction.*/ + static All: EnumValue; + + /**Allow only horizontal (left-and-right) dragging.*/ + static Horizontal: EnumValue; + + /**Disallow dragging.*/ + static None: EnumValue; + + /**Allow only vertical (up-and-down) dragging.*/ + static Vertical: EnumValue; + } + + /** + * The PanningTool supports manual panning, where the user can shift the + * Diagram.position by dragging the mouse. + */ + class PanningTool extends Tool { + /** + * You do not normally need to create an instance of this tool because one already exists as the ToolManager.panningTool. + */ + constructor(); + + /**Gets or sets whether panning actions will allow events to bubble instead of panning in the diagram.*/ + bubbles: boolean; + + /**This read-only property returns the Point that was the original value of Diagram.position when the panning operation started.*/ + originalPosition: Point; + + /** + * This tool can run when the diagram allows scrolling and the mouse has been dragged with the left button far enough away from the mouse-down point to avoid being a click. + */ + canStart(): boolean; + + /** + * Capture the mouse, change the diagram cursor, and remember the Diagram.position. + */ + doActivate(): void; + + /** + * Restore the Diagram.position to what it was when this tool activated. + */ + doCancel(): void; + + /** + * Release the mouse and restore the default diagram cursor. + */ + doDeactivate(): void; + + /** + * Modify the Diagram.position according to how much the mouse has moved. + */ + doMouseMove(): void; + + /** + * Modify the Diagram.position according to how much the mouse has moved. + */ + doMouseUp(): void; + } + + /** + * The RelinkingTool allows the user to reconnect an existing Link + * if the Link.relinkableTo and/or Link.relinkableFrom properties are true. + */ + class RelinkingTool extends LinkingBaseTool { + /** + * You do not normally need to create an instance of this tool because one already exists as the ToolManager.relinkingTool, which you can modify. + */ + constructor(); + + /**Gets or sets a small GraphObject that is copied as a relinking handle for the selected link path at the "from" end of the link.*/ + fromHandleArchetype: GraphObject; + + /**This read-only property returns the GraphObject that is the tool handle being dragged by the user.*/ + handle: GraphObject; + + /**Gets or sets a small GraphObject that is copied as a relinking handle for the selected link path at the "to" end of the link.*/ + toHandleArchetype: GraphObject; + + /** + * This tool can run when the diagram allows relinking, the model is modifiable, and there is a relink handle at the mouse-down point. + */ + canStart(): boolean; + + /** + * Make a temporary link look and act like the real Link being relinked. + * @param {Link} reallink + * @param {Link} templink + */ + copyLinkProperties(reallink: Link, templink: Link): void; + + /** + * Start the relinking operation. + */ + doActivate(): void; + + /** + * Finishing the linking operation stops the transaction, releases the mouse, and resets the cursor. + */ + doDeactivate(): void; + + /** + * A mouse-up ends the relinking operation; if there is a valid .targetPort nearby, this modifies the old link to connect with the target port. + */ + doMouseUp(): void; + + /** + * Modify an existing Link to connect to a new node and port. + * @param {Link} existinglink + * @param {Node} newnode the Node to connect to or from. + * @param {GraphObject} newport the GraphObject port to connect to or from. + * @param {boolean} toend If true, this modifies the link's "to" node and port; otherwise it modifies the "from" node and port. + */ + reconnectLink(existinglink: Link, newnode: Node, newport: GraphObject, toend: boolean): boolean; + + /** + * Show an Adornment for each end of the Link that the user may reconnect. + * @param {Part} part + */ + updateAdornments(part: Part): void; + } + + /** + * The ResizingTool is used to interactively change the size of a GraphObject + * in the selected Part or Node. + * This tool does not operate on Links. + */ + class ResizingTool extends Tool { + /** + * You do not normally need to create an instance of this tool because one already exists as the ToolManager.resizingTool, which you can modify. + */ + constructor(); + + /**This read-only property returns the GraphObject that is being resized.*/ + adornedObject: GraphObject; + + /**Gets or sets the width and height multiples with which the user must resize.*/ + cellSize: Size; + + /**This read-only property returns the GraphObject that is the tool handle being dragged by the user.*/ + handle: GraphObject; + + /**Gets or sets a small GraphObject that is copied as a resizing handle for the selected part.*/ + handleArchetype: GraphObject; + + /**Gets or sets whether the ResizingTool snaps object sizes to the diagram's background grid during the resize.*/ + isGridSnapEnabled: boolean; + + /**Gets or sets the maximum size to which the user can resize.*/ + maxSize: Size; + + /**Gets or sets the minimum size to which the user can resize.*/ + minSize: Size; + + /**This read-only property returns the Size that was the original value of the GraphObject.desiredSize of the element that is being resized.*/ + originalDesiredSize: Size; + + /**This read-only property returns the Point that was the original value of the Part.location of the Part that is being resized.*/ + originalLocation: Point; + + /** + * This tool may run when there is a mouse-down event on a resize handle, the diagram is not read-only and it allows resizing, the left mouse button is being used, and this tool's adornment's resize handle is at the current mouse point. + */ + canStart(): boolean; + + /** + * The size should be a multiple of the value returned by this method. + */ + computeCellSize(): Size; + + /** + * The effective maximum resizing size is the minimum of the .maxSize and the .adornedObject's GraphObject.maxSize. + */ + computeMaxSize(): Size; + + /** + * The effective minimum resizing size is the maximum of .minSize and the .adornedObject's GraphObject.minSize. + */ + computeMinSize(): Size; + + /** + * Given a Spot in the original bounds of the object being resized and a new Point, compute the new Rect. + * @param {Point} newPoint a Point in local coordinates. + * @param {Spot} spot the alignment spot of the handle being dragged. + * @param {Size} min the result of the call to .computeMinSize. + * @param {Size} max the result of the call to .computeMaxSize. + * @param {Size} cell the result of the call to .computeCellSize. + * @param {boolean} reshape true if the new size may change the aspect ratio from that of the natural bounds of the .adornedObject. + */ + computeResize(newPoint: Point, spot: Spot, min: Size, max: Size, cell: Size, reshape: boolean): Rect; + + /** + * Capture the mouse, remember the object's original bounds, and start a transaction.\ + */ + doActivate(): void; + + /** + * Restore the original GraphObject's size. + */ + doCancel(): void; + + /** + * Stop the current transaction and release the mouse. + */ + doDeactivate(): void; + + /** + * Call .resize with a new size determined by the current mouse point. + */ + doMouseMove(): void; + + /** + * Call .resize with the final bounds based on the most recent mouse point, commit the transaction, and raise the "PartResized" DiagramEvent. + */ + doMouseUp(): void; + + /** + * Change the size of the selected part's Part.resizeObject to have the given bounds. + * @param {Rect} newr + */ + resize(newr: Rect): void; + + /** + * Show an Adornment with the resize handles at points along the edge of the bounds of the selected Part's Part.resizeObject. + * @param {Part} part + */ + updateAdornments(part: Part): void; + } + + /** + * The RotatingTool is used to interactively change the GraphObject.angle of a GraphObject. + * This tool allows the user to rotate the Part.rotateObject of the selected Part. + * Normally this works with Parts or Nodes; it does not make sense for Links. + * The Part must be Part.rotatable, which is false by default. + */ + class RotatingTool extends Tool { + /** + * You do not normally need to create an instance of this tool because one already exists as the ToolManager.rotatingTool, which you can modify. + */ + constructor(); + + /**This read-only property returns the GraphObject that is being rotated.*/ + adornedObject: GraphObject; + + /**Gets or sets a small GraphObject that is copied as a rotation handle for the selected part.*/ + handle: GraphObject; + + /**Gets or sets a small GraphObject that is copied as a rotation handle for the selected part.*/ + handleArchetype: GraphObject; + + /**This read-only property returns the angle that was the original value of the GraphObject.angle of the GraphObject that is being rotated.*/ + originalAngle: number; + + /**Gets or sets the the closeness to a desired angle at which the angle is "snapped to".*/ + snapAngleEpsilon: number; + + /**Gets or sets the preferred angles for the selected object.*/ + snapAngleMultiple: number; + + /** + * This tool may run when there is a mouse-down event on a rotate handle, the diagram is not read-only and it allows rotation, the left mouse button is being used, and this tool's adornment's rotate handle is at the current mouse point. + */ + canStart(): boolean; + + /** + * Compute the new angle given a point. + * @param{Point} newPoint + */ + computeRotate(newPoint: Point): number; + + /** + * Capture the mouse, remember the original GraphObject.angle, and start a transaction. + */ + doActivate(): void; + + /** + * Restore the original GraphObject.angle of the adorned object. + */ + doCancel(): void; + + /** + * Stop the current transaction and release the mouse. + */ + doDeactivate(): void; + + /** + * Call .rotate with a new angle determined by the current mouse point. + */ + doMouseMove(): void; + + /** + * Call .rotate with an angle based on the most recent mouse point, commit the transaction, and raise the "PartRotated" DiagramEvent. + */ + doMouseUp(): void; + + /** + * Change the angle of the selected part's Part.rotateObject. + * @param {number} newangle + */ + rotate(newangle: number): void; + + /** + * Show an Adornment with a rotate handle at a point to the side of the adorned object if the part is selected and visible and if Part.canRotate() is true. + * @param {Part} part + */ + updateAdornments(part: Part): void; + } + + /** + * The TextEditingTool is used to let the user interactively edit text in place. + * You do not normally need to create an instance of this tool + * because one already exists as the ToolManager.clickSelectingTool. + */ + class TextEditingTool extends Tool { + /** + * You do not normally need to create an instance of this tool because one already exists as the ToolManager.textEditingTool, which you can modify. + */ + constructor(); + + /**Gets or sets the HTML element that edits the text.*/ + currentTextEditor: Element; + + /**Gets or sets the HTML element that edits the text.*/ + defaultTextEditor: Element; + + /**Gets or sets how user gestures can start in-place editing of text.*/ + starting: EnumValue; + + /**Gets or sets the TextBlock that is being edited.*/ + textBlock: TextBlock; + + /**Gets or sets the predicate that determines whether or not a string of text is valid.*/ + textValidation: (tb: TextBlock, oldstr: string, newstr: string) => boolean; + + /** + * Finish editing by trying to accept the new text. + * @param {EnumValue} reason The reason must be either TextEditingTool.LostFocus, + * TextEditingTool.MouseDown, TextEditingTool.Tab, or TextEditingTool.Enter. + */ + acceptText(reason: EnumValue): void; + + /** + * This may run when there is a mouse-click on a TextBlock for which the TextBlock.editable property is true in a Part that Part.isSelected. + */ + canStart(): boolean; + + /** + * Start editing the text for a TextBlock. + */ + doActivate(): void; + + /** + * Abort any text editing operation. + */ + doCancel(): void; + + /** + * Release the mouse. + */ + doDeactivate(): void; + + /** + * A click (mouse up) calls TextEditingTool.doActivate if this tool is not already active and if TextEditingTool.canStart returns true. + */ + doMouseDown(): void; + + /** + * A click (mouse up) calls TextEditingTool.doActivate if this tool is not already active and if TextEditingTool.canStart returns true. + */ + doMouseUp(): void; + + /** + * This calls TextEditingTool.doActivate if there is a TextBlock supplied. + */ + doStart(): void; + + /** + * This predicate checks any TextBlock.textValidation predicate and this tool's .textValidation predicate to make sure the TextBlock.text property may be set to the new string. + * @param {TextBlock} textblock the TextBlock that is being edited. + * @param {string} oldstr the previous string value. + * @param {string} newstr the proposed new string value. + */ + isValidText(textblock: TextBlock, oldstr: string, newstr: string): boolean; + + /**The user has typed ENTER.*/ + static Enter: EnumValue; + + /**The text editing control has lost focus.*/ + static LostFocus: EnumValue; + + /**The user has clicked somewhere else in the diagram.*/ + static MouseDown: EnumValue; + + /**A single click on a TextBlock with TextBlock.editable property set to true will start in-place editing.*/ + static SingleClick: EnumValue; + + /**A single click on a TextBlock with TextBlock.editable property set to true will start in-place editing, but only if the Part that the TextBlock is in is already selected.*/ + static SingleClickSelected: EnumValue; + + /**The user has typed TAB.*/ + static Tab: EnumValue; + } + + /** + * Tools handle mouse events and keyboard events. + * The currently running tool, Diagram.currentTool, receives all input events from the Diagram. + */ + class Tool { + /** + * Don't construct this directly -- this is an abstract class. + */ + constructor(); + + /**This read-only property returns the Diagram that owns this tool and for which this tool is handling input events.*/ + diagram: Diagram; + + /**Gets or sets whether this tool is started and is actively doing something.*/ + isActive: boolean; + + /**Gets or sets whether this tool can be started by a mouse event.*/ + isEnabled: boolean; + + /**Gets or sets the name of this tool.*/ + name: string; + + /**Gets or sets the name of the transaction to be committed by .stopTransaction; if null, the transaction will be rolled back.*/ + transactionResult: string; + + /** + * This is called to cancel any running "WaitAfter" timer. + */ + cancelWaitAfter(): void; + + /** + * This predicate is used by the ToolManager to decide if this tool can be started mode-lessly by mouse and touch events. + */ + canStart(): boolean; + + /** + * This predicate determines whether or not to allow pinch zooming from a multi-touch event. + */ + canStartMultiTouch(): boolean; + + /** + * This method is called by the diagram after setting Diagram.currentTool, to make the new tool active. + */ + doActivate(): void; + + /** + * The diagram will call this method when the user wishes to cancel the current tool's operation. + */ + doCancel(): void; + + /** + * This method is called by the diagram on the old tool when Diagram.currentTool is set to a new tool. + */ + doDeactivate(): void; + + /** + * The diagram will call this method upon a key down event. + */ + doKeyDown(): void; + + /** + * The diagram will call this method upon a key up event. + */ + doKeyUp(): void; + + /** + * The diagram will call this method upon a mouse down event. + */ + doMouseDown(): void; + + /** + * The diagram will call this method upon a mouse move event. + */ + doMouseMove(): void; + + /** + * The diagram will call this method upon a mouse up event. + */ + doMouseUp(): void; + + /** + * The diagram will call this method as the mouse wheel is rotated. + */ + doMouseWheel(): void; + + /** + * This method is called by the diagram when this tool becomes the current tool; you should not call this method. + */ + doStart(): void; + + /** + * This method is called by the diagram when this tool stops being the current tool; you should not call this method. + */ + doStop(): void; + + /** + * This is called a certain delay after a call to .standardWaitAfter if there has not been any call to .cancelWaitAfter. + */ + doWaitAfter(): void; + + /** + * This convenience function finds the front-most GraphObject that is at a given point and that is part of an Adornment that is of a given category. + * @param {Point} p a Point in document coordinates. + * @param {string} category the required Part.category of the Adornment. + */ + findToolHandleAt(p: Point, category: string): GraphObject; + + /** + * Return true when the last mouse point is far enough away from the first mouse down point to constitute a drag operation instead of just a potential click. + * @param {Point=} first Point in view coordinates, defaults to Diagram.firstInput's InputEvent.viewPoint. + * @param {Point=} last Point in view coordinates, defaults to Diagram.lastInput's InputEvent.viewPoint. + */ + isBeyondDragSize(first?: Point, last?: Point): boolean; + + /** + * Implement the standard behavior for mouse clicks, searching for and calling click handler functions on GraphObjects or on Diagram, and raising the corresponding DiagramEvent. + * @param {function(GraphObject):GraphObject | null=} navig An optional custom navigation + * function to find target objects. + * @param {function(GraphObject):boolean | null=} pred An optional custom predicate + */ + standardMouseClick(navig?: (obj: GraphObject) => GraphObject, pred?: (obj: GraphObject) => boolean): void; + + /** + * Implement the standard behavior for mouse enter, over, and leave events, where the mouse is moving but no button is pressed. + */ + standardMouseOver(): void; + + /** + * Implement the standard behavior for selecting parts with the mouse, depending on the control and shift modifier keys. + */ + standardMouseSelect(): void; + + /** + * Implement the standard behavior for mouse wheel events. + */ + standardMouseWheel(): void; + + /** + * Initiates pinch-zooming on multi-touch devices. + */ + standardPinchZoomStart(): void; + + /** + * Continues pinch-zooming (started by standardPinchZoomStart) on multi-touch devices. + */ + standardPinchZoomMove(): void; + + /** + * This is called to start a new timer to call .doWaitAfter after a given delay. + * @param {number} delay in milliseconds + */ + standardWaitAfter(delay: number): void; + + /** + * Call Diagram.startTransaction with the given transaction name. + * @param {string=} tname a description of the transaction + */ + startTransaction(tname?: string): boolean; + + /** + * If the Diagram.currentTool is this tool, stop this tool and start the Diagram.defaultTool by making it be the new current tool. + */ + stopTool(): void; + + /** + * If .transactionResult is null, call Diagram.rollbackTransaction, otherwise call Diagram.commitTransaction. + */ + stopTransaction(): boolean; + + /** + * The diagram asks each tool to update any adornments the tool might use for a given part. + * @param {Part} part + */ + updateAdornments(part: Part): void; + } + + /** + * This special Tool is responsible for managing all of the Diagram's + * mode-less tools. + */ + class ToolManager extends Tool { + /** + * You do not normally need to create an instance of this tool because one already exists as the Diagram.toolManager, which you can modify. + */ + constructor(); + + /**Gets or sets the mode-less ActionTool, normally one of the .mouseDownTools.*/ + actionTool: ActionTool; + + /**Gets or sets the mode-less ClickCreatingTool, normally one of the .mouseUpTools.*/ + clickCreatingTool: ClickCreatingTool; + + /**Gets or sets the mode-less ClickSelectingTool, normally one of the .mouseUpTools.*/ + clickSelectingTool: ClickSelectingTool; + + /**Gets or sets the mode-less ContextMenuTool, normally one of the .mouseUpTools.*/ + contextMenuTool: ContextMenuTool; + + /**This read-only property returns the currently showing tooltip, or null if there is none.*/ + currentToolTip: Adornment; + + /**Gets or sets the mode-less DraggingTool, normally one of the .mouseMoveTools.*/ + draggingTool: DraggingTool; + + /**Gets or sets the mode-less DragSelectingTool, normally one of the .mouseMoveTools.*/ + dragSelectingTool: DragSelectingTool; + + /**Gets or sets the distance in view coordinates within which a mouse down-and-up is considered a click and beyond which a mouse movement is considered a drag.*/ + dragSize: Size; + + /**Gets or sets the time between when the mouse stops moving and a hold event, in milliseconds.*/ + holdDelay: number; + + /**Gets or sets the time between when the mouse stops moving and a hover event, in milliseconds.*/ + hoverDelay: number; + + /**Gets or sets the mode-less LinkingTool, normally one of the .mouseMoveTools.*/ + linkingTool: LinkingTool; + + /**Gets or sets the mode-less LinkReshapingTool, normally one of the .mouseDownTools.*/ + linkReshapingTool: LinkReshapingTool; + + /**This read-only property returns the list of Tools that might be started upon a mouse-down event.*/ + mouseDownTools: List<Tool>; + + /**This read-only property returns the list of Tools that might be started upon a mouse-move event.*/ + mouseMoveTools: List<Tool>; + + /**This read-only property returns the list of Tools that might be started upon a mouse-up event.*/ + mouseUpTools: List<Tool>; + + /**Gets or sets the ToolManager's mouse wheel behavior.*/ + mouseWheelBehavior: EnumValue; + + /**Gets or sets the mode-less PanningTool, normally one of the .mouseMoveTools.*/ + panningTool: PanningTool; + + /**Gets or sets the mode-less RelinkingTool, normally one of the .mouseDownTools.*/ + relinkingTool: RelinkingTool; + + /**Gets or sets the mode-less ResizingTool, normally one of the .mouseDownTools.*/ + resizingTool: ResizingTool; + + /**Gets or sets the mode-less RotatingTool, normally one of the .mouseDownTools.*/ + rotatingTool: RotatingTool; + + /**Gets or sets the mode-less TextEditingTool, normally one of the .mouseUpTools.*/ + textEditingTool: TextEditingTool; + + /** + * This just calls CommandHandler.doKeyDown on the diagram's Diagram.commandHandler. + */ + doKeyDown(): void; + + /** + * This just calls CommandHandler.doKeyUp on the diagram's Diagram.commandHandler. + */ + doKeyUp(): void; + + /** + * Iterate over the .mouseDownTools list and start the first tool for which its Tool.canStart predicate returns true. + */ + doMouseDown(): void; + + /** + * Implement the standard behavior for mouse hover and mouse hold events, called by .doWaitAfter when the mouse has not moved for a period of time. + */ + doMouseHover(): void; + + /** + * Iterate over the .mouseMoveTools list and start the first tool for which its Tool.canStart predicate returns true. + */ + doMouseMove(): void; + + /** + * Iterate over the .mouseUpTools list and start the first tool for which its Tool.canStart predicate returns true. + */ + doMouseUp(): void; + + /** + * The diagram will call this method as the mouse wheel is rotated. + */ + doMouseWheel(): void; + + /** + * Implement the standard behavior for tooltips, called by .doWaitAfter when the mouse has not moved for a period of time. + */ + doToolTip(): void; + + /** + * Implement the standard behavior for when the mouse has not moved for a period of time. + */ + doWaitAfter(): void; + + /** + * Find a mouse tool of a given name. + * @param {string} name + */ + findTool(name: string): Tool; + + /** + * Hide any tooltip. + */ + hideToolTip(): void; + + /** + * Initialize the three mouse tool lists with instances of the standard tools. + */ + initializeStandardTools(): void; + + /** + * This is called by .showToolTip to position the part within the viewport. + * @param {Adornment} tooltip + * @param {GraphObject} obj The GraphObject getting the tooltip. + */ + positionToolTip(tooltip: Adornment, obj: GraphObject): void; + + /** + * Replace a mouse tool of a given name with a new tool. + * @param {string} name the type of tool, such as "Dragging" or "ClickSelecting". + * @param {Tool} newtool If null, any tool that the search finds will just be removed + * from the list in which it was found. + */ + replaceTool(name: string, newtool: Tool): Tool; + + /** + * Show a tooltip Adornment. + * @param {Adornment} tooltip + * @param {GraphObject} obj The GraphObject getting the tooltip; this is null if the tooltip is being shown for the diagram background. + */ + showToolTip(tooltip: Adornment, obj: GraphObject): void; + + /**This value for gestureBehavior indicates that the pointer/touch pinch gestures on the canvas intend to have no effect on the Diagram, but also no effect on the page.*/ + static GestureCancel: EnumValue; + + /**This value for gestureBehavior indicates that the pointer/touch pinch gestures on the canvas intend to have no effect on the Diagram, but will not be prevented, and may bubble up the page to have other effects (such as zooming the page).*/ + static GestureNone: EnumValue; + + /**This value for gestureBehavior indicates that the pointer/touch pinch gestures on the canvas intend to zoom the Diagram.*/ + static GestureZoom: EnumValue; + + /**This value for .mouseWheelBehavior indicates that the mouse wheel events are ignored, although scrolling or zooming by other means may still be allowed.*/ + static WheelNone: EnumValue; + + /**This default value for .mouseWheelBehavior indicates that mouse wheel events scroll the diagram.*/ + static WheelScroll: EnumValue; + + /**This value for .mouseWheelBehavior indicates that the mouse wheel events change the scale of the diagram.*/ + static WheelZoom: EnumValue; + } + + + /** + * This interface is implemented by the List, Set, and Map + * classes; it provides the .iterator read-only property that returns an Iterator. + */ + class Iterable<T> { + /*This is an interface and thus does not have a constructor.*/ + + /**Gets an Iterator that can iterate over the items in the collection.*/ + iterator: Iterator<T>; + } + + /** + * This interface defines properties and methods for iterating over a collection; + * it provides the .next predicate and the .value read-only property. + * Some Iterators also provide key property values along with each value. + */ + class Iterator<T> extends Iterable<T> { + /*This is an interface and thus does not have a constructor.*/ + + /**This read-only property returns the total number of items in the iterated collection.*/ + count: number; + + /**Returns itself, which is convenient for code that expects an Iterable instead of an Iterator.*/ + iterator: Iterator<T>; + + /**This read-only property returns the current index to the item in the collection, assuming .next has just returned true.*/ + key: any; + + /**This read-only property returns the current item in the collection, assuming .next has just returned true.*/ + value: T; + + /** + * This is true if all invocations of the given predicate on items in the collection are true. + * @param {(x: T) => boolean} pred + */ + all(pred: (x: T) => boolean): boolean; + + /** + * This is true if any invocation of the given predicate on items in the collection is true. + * @param {(x: T) => boolean} pred + */ + any(pred: (x: T) => boolean): boolean; + + /** + * Call the given function on each item in the collection. + * @param {(x: T) => void} func + */ + each(func: (x: T) => void ): void; + + /** + * Return the first item in the collection, or null if there is none. + */ + first(): T; + + /** + * Call this method to advance the iterator to the next item in the collection. + */ + next(): boolean; + + /** + * Start this iterator all over again. + */ + reset(): void; + } + + /** + * An ordered iterable collection. + * It optionally enforces the type of elements that may be added to the List. + */ + class List<T> { + /** + * This creates a List that checks the type of the values to be instances of a particular kind of Object. + * @param {function(...)} type this must be a class function/constructor. + */ + constructor(type: Constructor); + /** + * This creates a List that may check the types of the values. + * @param {string=} type if supplied, this must be one of: 'number', 'string', 'boolean', or 'function' for the value type. + */ + constructor(type?: string); + + /**This read-only property returns the length of the List.*/ + count: number; + + /**This read-only property returns the length of the List. ES6-like synonym for count.*/ + size: number; + + /**Gets an object that you can use for iterating over the List.*/ + iterator: Iterator<T>; + + /**Gets an object that you can use for iterating over the List in backwards order.*/ + iteratorBackwards: Iterator<T>; + + /**This read-only property returns the length of the List, a synonym for the .count property.*/ + length: number; + + /** + * Adds a given value to the end of the List. + * @param {*} val + */ + add(val: T): void; + + /** + * Adds all of the values of a collection (either an Iterable or an Array) to the end of this List. + * @param {Iterable<T>|Array<T>} coll + */ + addAll(coll: Iterable<T> | Array<T>): List<T>; + + /** + * This is true if all invocations of the given predicate on items in the collection are true. + * @param {(x: T) => boolean} pred + */ + all(pred: (x: T) => boolean): boolean; + + /** + * This is true if any invocation of the given predicate on items in the collection is true. + * @param {(x: T) => boolean} pred + */ + any(pred: (x: T) => boolean): boolean; + + /** + * Clears the List. + */ + clear(): void; + + /** + * Returns whether the given value is in this List. + * @param {*} val + */ + contains(val: T): boolean; + + /** + * Makes a shallow copy of this List. + */ + copy(): List<T>; + + /** + * Removes a given value (if found) from the List. ES6-like synonym for remove. + * @param {*} val + */ + delete(val: T): boolean; + + /** + * Call the given function on each item in the collection. + * @param {(x: T) => void} func + */ + each(func: (x: T) => void ): void; + + /** + * Returns the element at the given index. + * @param {number} i + */ + elt(i: number): T; + + /** + * Returns the first item in the list, or null if there is none. + */ + first(): T; + + /** + * Returns the element at the given index. ES6-like synonym for elt. + * @param {number} i + */ + get(i: number): T; + + /** + * Returns whether the given value is in this List. ES6-like synonym for contains. + * @param {*} val + */ + has(val: T): boolean; + + /** + * Returns the index of the given value if it is in this List. + * @param {*} val + */ + indexOf(val: T): number; + + /** + * Insert a value before the index i. + * @param {number} i + * @param {*} val + */ + insertAt(i: number, val: T): void; + + /** + * Returns the last item in the list, or null if there is none. + */ + last(): T; + + /** + * Returns the last item in the list and removes it from the list, or just return null if there is none. + */ + pop(): T; + + /** + * Add an item at the end of the list -- a synonym for add. + */ + push(val: T): void; + + /** + * Removes a given value (if found) from the List. + * @param {*} val + */ + remove(val: T): boolean; + + /** + * Removes a value at a given index from the List. + * @param {number} i + */ + removeAt(i: number): void; + + /** + * Removes a range of values from the List. + * @param {number} to + * @param {number} from + */ + removeRange(to: number, from: number): void; + + /** + * Reverse the order of items in this List. + */ + reverse(): List<T>; + + /** + * Set the element at the given index to a given value. ES6-like synonym for setElt. + * @param {number} i + * @param {*} val + */ + set(i: number, val: T): void; + + /** + * Set the element at the given index to a given value. + * @param {number} i + * @param {*} val + */ + setElt(i: number, val: T): void; + + /** + * Sort the List according to a comparison function. + * @param {function(*,*):number} sortfunc the same kind of function as passed to Array.sort + */ + sort(sortfunc: (a: T, b: T) => number): List<T>; + + /** + * Produces a JavaScript Array from the contents of this List. + */ + toArray(): Array<T>; + + /** + * Converts the List to a Set. + */ + toSet(): Set<T>; + } + + /** + * This is a structure used by Map to hold key-value pairs. + */ + interface KeyValuePair<K,V> { // undocumented + key: K; + value: V; + } + + /** + * An unordered iterable collection of key/value pairs that cannot contain two instances of the + * same key. + * It optionally enforces the type of the key and the type of the associated value. + */ + class Map<K,V> { + /** + * This creates a Map that may check the types of the keys and/or values. + * @param {function(...)} keytype if supplied, this must be a class function/constructor. + * @param {function(...)} valtype if supplied, this must be a class function/constructor. + */ + constructor(keytype: Constructor, valtype: Constructor); + /** + * This creates a Map that may check the types of the keys and/or values. + * @param {string=} keytype if supplied, this must be one of: 'number' or 'string' for the key type. + * @param {function(...)} valtype if supplied, this must be a class function/constructor. + */ + constructor(keytype: string, valtype: Constructor); + /** + * This creates a Map that may check the types of the keys and/or values. + * @param {function(...)} keytype if supplied, this must be a class function/constructor. + * @param {string} valtype if supplied, this must be one of: 'number', 'string', 'boolean', or 'function' for the value type. + */ + constructor(keytype: Constructor, valtype: string); + /** + * This creates a Map that may check the types of the keys and/or values. + * @param {string=} keytype if supplied, this must be one of: 'number' or 'string' for the key type. + * @param {string=} valtype if supplied, this must be one of: 'number', 'string', 'boolean', or 'function' for the value type. + */ + constructor(keytype?: string, valtype?: string); + + /**This read-only property returns the number of associations in the Map.*/ + count: number; + + /**Gets an object that you can use for iterating over the key-value pairs of the Map.*/ + iterator: Iterator<KeyValuePair<K,V>>; + + /**Gets an object that you can use for iterating over the keys in the Map.*/ + iteratorKeys: Iterator<K>; + + /**Gets an object that you can use for iterating over the values of the Map.*/ + iteratorValues: Iterator<V>; + + /**This read-only property returns the number of associations in the Map. ES6-like synonym for count.*/ + size: number; + + /** + * Adds a key-value association to the Map, or replaces the value associated with the key if the key was already present in the map. + * @param {*} key + * @param {*} val + */ + add(key: K, val: V): boolean; + + /** + * Adds all of the key-value pairs of another Map to this Map. + * @param {Map|Array} map + */ + addAll(map: Map<K, V> | Array<KeyValuePair<K, V>>): Map<K,V>; + + /** + * This is true if all invocations of the given predicate on key-value pairs in the collection are true. + * @param {(x: Object) => boolean} pred + */ + all(pred: (x: Object) => boolean): boolean; + + /** + * This is true if any invocation of the given predicate on key-value pairs in the collection is true. + * @param {(x: Object) => boolean} pred + */ + any(pred: (x: Object) => boolean): boolean; + + /** + * Clears the Map, removing all key-value associations. + */ + clear(): void; + + /** + * Returns whether the given key is in this Map. + * @param {*} key + */ + contains(key: K): boolean; + + /** + * Makes a shallow copy of this Map. + */ + copy(): Map<K,V>; + + /** + * Removes a key (if found) from the Map. ES6-like synonym for remove. + * @param {*} key + */ + delete(key: K): boolean; + + /** + * Call the given function on each key-value pair in the collection. + * @param {(x: Object) => void} func + */ + each(func: (x: KeyValuePair<K,V>) => void ): void; + + /** + * Returns the first key-value pair in the collection, or null if there is none. + */ + first(): KeyValuePair<K,V>; + + /** + * Returns the value associated with a key. ES6-like synonym for getValue. + * @param {*} key + */ + get(key: K): V; + + /** + * Returns the value associated with a key. + * @param {*} key + */ + getValue(key: K): V; + + /** + * Returns whether the given key is in this Map. ES6-like synonym for contains. + * @param {*} key + */ + has(key: K): boolean; + + /** + * Removes a key (if found) from the Map. + * @param {*} key + */ + remove(key: K): boolean; + + /** + * Adds a key-value association to the Map, or replaces the value associated with the key if the key was already present in the map. ES6-like synonym for add. + * @param {*} key + * @param {*} val + */ + set(key: K, val: V): boolean; + + /** + * Produces a JavaScript Array of key/value pair objects from the contents of this Map. + */ + toArray(): Array<KeyValuePair<K,V>>; + + /** + * Produces a Set that provides a read-only view onto the keys of this Map. + */ + toKeySet(): Set<K>; + } + + /** + * An unordered iterable collection that cannot contain two instances of the same kind of value. + * It optionally enforces the type of elements that may be added to the Set. + */ + class Set<T> { + /** + * This creates a Set that checks the type of the values. + * @param {function(...)} type this must be a class function/constructor. + */ + constructor(type: Constructor); + /** + * This creates a Set that may check the types of the values. + * @param {string=} type if supplied, this must be one of: 'number' or 'string' for the key type. + */ + constructor(type?: string); + + /**This read-only property returns the number of elements in the Set.*/ + count: number; + + /**Gets an object that you can use for iterating over the Set.*/ + iterator: Iterator<T>; + + /**This read-only property returns the number of elements in the Set. ES6-like synonym for count.*/ + size: number; + + /** + * Adds a given value to the Set, if not already present. + * @param {*} val + */ + add(val: T): boolean; + + /** + * Adds all of the values of a collection (either an Iterable or an Array) to this Set. + * @param {Iterable<T>|Array<T>} coll + */ + addAll(coll: Iterable<T> | Array<T>): Set<T>; + + /** + * This is true if all invocations of the given predicate on items in the collection are true. + * @param {(x: T) => boolean} pred + */ + all(pred: (x: T) => boolean): boolean; + + /** + * This is true if any invocation of the given predicate on items in the collection is true. + * @param {(x: T) => boolean} pred + */ + any(pred: (x: T) => boolean): boolean; + + /** + * Clears the Set. + */ + clear(): void; + + /** + * Returns whether the given value is in this Set. + * @param {*} val + */ + contains(val: T): boolean; + + /** + * Returns true if all of the values of a given collection are in this Set. + * @param {Iterable<T>} coll + */ + containsAll(coll: Iterable<T>): boolean; + + /** + * Returns true if any of the values of a given collection are in this Set. + * @param {Iterable<T>} coll + */ + containsAny(coll: Iterable<T>): boolean; + + /** + * Makes a shallow copy of this Set. + */ + copy(): Set<T>; + + /** + * Removes a value (if found) from the Set. ES6-like synonym for remove. + * @param {*} val + */ + delete(val: T): boolean; + + /** + * Call the given function on each item in the collection. + * @param {(x: T) => void} func + */ + each(func: (x: T) => void): void; + + /** + * Returns the first item in the collection, or null if there is none. + */ + first(): T; + + /** + * Returns whether the given value is in this Set. ES6-like synonym for contains. + * @param {*} val + */ + has(val: T): boolean; + + /** + * Removes a value (if found) from the Set. + * @param {*} val + */ + remove(val: T): boolean; + + /** + * Removes all of the values of a collection from this Set. + * @param {Iterable<T>} coll + */ + removeAll(coll: Iterable<T>): Set<T>; + + /** + * Removes all of the values of a collection from this Set. + * @param {Array<T>} coll + */ + removeAll(coll: Array<T>): Set<T>; + + /** + * Removes from this Set all items that are not in the given collection. + * @param {Iterable<T>} coll + */ + retainAll(coll: Iterable<T>): Set<T>; + + /** + * Produces a JavaScript Array from the contents of this Set. + */ + toArray(): Array<T>; + + /** + * Converts the Set to a List. + */ + toList(): List<T>; + } + + class EnumValue { // undocumented + //Rawr! + } +} //END go + +declare module "go" { + export = go; +} diff --git a/cyclone-web/vendor/iconfont/demo.css b/cyclone-web/vendor/iconfont/demo.css new file mode 100644 index 0000000000000000000000000000000000000000..3d9cbe76ad388b8e48eb2fb3482a04687050d55e --- /dev/null +++ b/cyclone-web/vendor/iconfont/demo.css @@ -0,0 +1,370 @@ +*{margin: 0;padding: 0;list-style: none;} +/* +KISSY CSS Reset +理念:1. reset 的目的不是清除浏览器的默认样式,这仅是部分工作。清除和重置是紧密不可分的。 +2. reset 的目的不是让默认样式在所有浏览器下一致,而是减少默认样式有可能带来的问题。 +3. reset 期望提供一套普适通用的基础样式。但没有银弹,推荐根据具体需求,裁剪和修改后再使用。 +特色:1. 适应中文;2. 基于最新主流浏览器。 +维护:玉伯<lifesinger@gmail.com>, 正淳<ragecarrier@gmail.com> + */ + +/** 清除内外边距 **/ +body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, /* structural elements 结构元素 */ +dl, dt, dd, ul, ol, li, /* list elements 列表元素 */ +pre, /* text formatting elements 文本格式元素 */ +form, fieldset, legend, button, input, textarea, /* form elements 表单元素 */ +th, td /* table elements 表格元素 */ { + margin: 0; + padding: 0; +} + +/** 设置默认字体 **/ +body, +button, input, select, textarea /* for ie */ { + font: 12px/1.5 tahoma, arial, \5b8b\4f53, sans-serif; +} +h1, h2, h3, h4, h5, h6 { font-size: 100%; } +address, cite, dfn, em, var { font-style: normal; } /* 将斜体扶正 */ +code, kbd, pre, samp { font-family: courier new, courier, monospace; } /* 统一等宽字体 */ +small { font-size: 12px; } /* 小于 12px 的中文很难阅读,让 small 正常化 */ + +/** 重置列表元素 **/ +ul, ol { list-style: none; } + +/** 重置文本格式元素 **/ +a { text-decoration: none; } +a:hover { text-decoration: underline; } + + +/** 重置表单元素 **/ +legend { color: #000; } /* for ie6 */ +fieldset, img { border: 0; } /* img 搭车:让链接里的 img 无边框 */ +button, input, select, textarea { font-size: 100%; } /* 使得表单元素在 ie 下能继承字体大小 */ +/* 注:optgroup 无法扶正 */ + +/** 重置表格元素 **/ +table { border-collapse: collapse; border-spacing: 0; } + +/* 清除浮动 */ +.ks-clear:after, .clear:after { + content: '\20'; + display: block; + height: 0; + clear: both; +} +.ks-clear, .clear { + *zoom: 1; +} + +.main { + padding: 30px 100px; +width: 960px; +margin: 0 auto; +} +.main h1{font-size:36px; color:#333; text-align:left;margin-bottom:30px; border-bottom: 1px solid #eee;} + +.helps{margin-top:40px;} +.helps pre{ + padding:20px; + margin:10px 0; + border:solid 1px #e7e1cd; + background-color: #fffdef; + overflow: auto; +} + +.icon_lists{ + width: 100% !important; + +} + +.icon_lists li{ + float:left; + width: 100px; + height:180px; + text-align: center; + list-style: none !important; +} +.icon_lists .icon{ + font-size: 42px; + line-height: 100px; + margin: 10px 0; + color:#333; + -webkit-transition: font-size 0.25s ease-out 0s; + -moz-transition: font-size 0.25s ease-out 0s; + transition: font-size 0.25s ease-out 0s; + +} +.icon_lists .icon:hover{ + font-size: 100px; +} + + + +.markdown { + color: #666; + font-size: 14px; + line-height: 1.8; +} + +.highlight { + line-height: 1.5; +} + +.markdown img { + vertical-align: middle; + max-width: 100%; +} + +.markdown h1 { + color: #404040; + font-weight: 500; + line-height: 40px; + margin-bottom: 24px; +} + +.markdown h2, +.markdown h3, +.markdown h4, +.markdown h5, +.markdown h6 { + color: #404040; + margin: 1.6em 0 0.6em 0; + font-weight: 500; + clear: both; +} + +.markdown h1 { + font-size: 28px; +} + +.markdown h2 { + font-size: 22px; +} + +.markdown h3 { + font-size: 16px; +} + +.markdown h4 { + font-size: 14px; +} + +.markdown h5 { + font-size: 12px; +} + +.markdown h6 { + font-size: 12px; +} + +.markdown hr { + height: 1px; + border: 0; + background: #e9e9e9; + margin: 16px 0; + clear: both; +} + +.markdown p, +.markdown pre { + margin: 1em 0; +} + +.markdown > p, +.markdown > blockquote, +.markdown > .highlight, +.markdown > ol, +.markdown > ul { + width: 80%; +} + +.markdown ul > li { + list-style: circle; +} + +.markdown > ul li, +.markdown blockquote ul > li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown > ul li p, +.markdown > ol li p { + margin: 0.6em 0; +} + +.markdown ol > li { + list-style: decimal; +} + +.markdown > ol li, +.markdown blockquote ol > li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown code { + margin: 0 3px; + padding: 0 5px; + background: #eee; + border-radius: 3px; +} + +.markdown pre { + border-radius: 6px; + background: #f7f7f7; + padding: 20px; +} + +.markdown pre code { + border: none; + background: #f7f7f7; + margin: 0; +} + +.markdown strong, +.markdown b { + font-weight: 600; +} + +.markdown > table { + border-collapse: collapse; + border-spacing: 0px; + empty-cells: show; + border: 1px solid #e9e9e9; + width: 95%; + margin-bottom: 24px; +} + +.markdown > table th { + white-space: nowrap; + color: #333; + font-weight: 600; + +} + +.markdown > table th, +.markdown > table td { + border: 1px solid #e9e9e9; + padding: 8px 16px; + text-align: left; +} + +.markdown > table th { + background: #F7F7F7; +} + +.markdown blockquote { + font-size: 90%; + color: #999; + border-left: 4px solid #e9e9e9; + padding-left: 0.8em; + margin: 1em 0; + font-style: italic; +} + +.markdown blockquote p { + margin: 0; +} + +.markdown .anchor { + opacity: 0; + transition: opacity 0.3s ease; + margin-left: 8px; +} + +.markdown .waiting { + color: #ccc; +} + +.markdown h1:hover .anchor, +.markdown h2:hover .anchor, +.markdown h3:hover .anchor, +.markdown h4:hover .anchor, +.markdown h5:hover .anchor, +.markdown h6:hover .anchor { + opacity: 1; + display: inline-block; +} + +.markdown > br, +.markdown > p > br { + clear: both; +} + + +.hljs { + display: block; + background: white; + padding: 0.5em; + color: #333333; + overflow-x: auto; +} + +.hljs-comment, +.hljs-meta { + color: #969896; +} + +.hljs-string, +.hljs-variable, +.hljs-template-variable, +.hljs-strong, +.hljs-emphasis, +.hljs-quote { + color: #df5000; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-type { + color: #a71d5d; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute { + color: #0086b3; +} + +.hljs-section, +.hljs-name { + color: #63a35c; +} + +.hljs-tag { + color: #333333; +} + +.hljs-title, +.hljs-attr, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #795da3; +} + +.hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.hljs-link { + text-decoration: underline; +} + +pre{ + background: #fff; +} + + + + + diff --git a/cyclone-web/vendor/iconfont/demo_fontclass.html b/cyclone-web/vendor/iconfont/demo_fontclass.html new file mode 100644 index 0000000000000000000000000000000000000000..f3b021bc1085727acf6d969b9a099b205ff083d8 --- /dev/null +++ b/cyclone-web/vendor/iconfont/demo_fontclass.html @@ -0,0 +1,202 @@ + +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"/> + <title>IconFont</title> + <link rel="stylesheet" href="demo.css"> + <link rel="stylesheet" href="iconfont.css"> +</head> +<body> + <div class="main markdown"> + <h1>IconFont 图标</h1> + <ul class="icon_lists clear"> + + <li> + <i class="icon iconfont icon-power"></i> + <div class="name">power</div> + <div class="fontclass">.icon-power</div> + </li> + + <li> + <i class="icon iconfont icon-alert"></i> + <div class="name">alert</div> + <div class="fontclass">.icon-alert</div> + </li> + + <li> + <i class="icon iconfont icon-artboard6"></i> + <div class="name">publishflow</div> + <div class="fontclass">.icon-artboard6</div> + </li> + + <li> + <i class="icon iconfont icon-relation"></i> + <div class="name">relation</div> + <div class="fontclass">.icon-relation</div> + </li> + + <li> + <i class="icon iconfont icon-appcenter"></i> + <div class="name">appcenter</div> + <div class="fontclass">.icon-appcenter</div> + </li> + + <li> + <i class="icon iconfont icon-approval"></i> + <div class="name">approval</div> + <div class="fontclass">.icon-approval</div> + </li> + + <li> + <i class="icon iconfont icon-dashbord"></i> + <div class="name">dashbord</div> + <div class="fontclass">.icon-dashbord</div> + </li> + + <li> + <i class="icon iconfont icon-beforeconf"></i> + <div class="name">beforeconf</div> + <div class="fontclass">.icon-beforeconf</div> + </li> + + <li> + <i class="icon iconfont icon-confmanagement"></i> + <div class="name">confmanagement</div> + <div class="fontclass">.icon-confmanagement</div> + </li> + + <li> + <i class="icon iconfont icon-implement"></i> + <div class="name">implement</div> + <div class="fontclass">.icon-implement</div> + </li> + + <li> + <i class="icon iconfont icon-idcstore"></i> + <div class="name">idcstore</div> + <div class="fontclass">.icon-idcstore</div> + </li> + + <li> + <i class="icon iconfont icon-logicarch"></i> + <div class="name">logicarch</div> + <div class="fontclass">.icon-logicarch</div> + </li> + + <li> + <i class="icon iconfont icon-info"></i> + <div class="name">info</div> + <div class="fontclass">.icon-info</div> + </li> + + <li> + <i class="icon iconfont icon-projectmanagement"></i> + <div class="name">projectmanagement</div> + <div class="fontclass">.icon-projectmanagement</div> + </li> + + <li> + <i class="icon iconfont icon-deployarch"></i> + <div class="name">deployarch</div> + <div class="fontclass">.icon-deployarch</div> + </li> + + <li> + <i class="icon iconfont icon-reportmanagement"></i> + <div class="name">reportmanagement</div> + <div class="fontclass">.icon-reportmanagement</div> + </li> + + <li> + <i class="icon iconfont icon-resoucepool"></i> + <div class="name">resoucepool</div> + <div class="fontclass">.icon-resoucepool</div> + </li> + + <li> + <i class="icon iconfont icon-sysmanagement"></i> + <div class="name">sysmanagement</div> + <div class="fontclass">.icon-sysmanagement</div> + </li> + + <li> + <i class="icon iconfont icon-routinginspection"></i> + <div class="name">routinginspection</div> + <div class="fontclass">.icon-routinginspection</div> + </li> + + <li> + <i class="icon iconfont icon-serviceflow"></i> + <div class="name">serviceflow</div> + <div class="fontclass">.icon-serviceflow</div> + </li> + + <li> + <i class="icon iconfont icon-serviceindex"></i> + <div class="name">serviceindex</div> + <div class="fontclass">.icon-serviceindex</div> + </li> + + <li> + <i class="icon iconfont icon-cloudboot"></i> + <div class="name">cloudboot</div> + <div class="fontclass">.icon-cloudboot</div> + </li> + + <li> + <i class="icon iconfont icon-service"></i> + <div class="name">service1</div> + <div class="fontclass">.icon-service</div> + </li> + + <li> + <i class="icon iconfont icon-service1"></i> + <div class="name">service4</div> + <div class="fontclass">.icon-service1</div> + </li> + + <li> + <i class="icon iconfont icon-service2"></i> + <div class="name">service3</div> + <div class="fontclass">.icon-service2</div> + </li> + + <li> + <i class="icon iconfont icon-service3"></i> + <div class="name">service2</div> + <div class="fontclass">.icon-service3</div> + </li> + + <li> + <i class="icon iconfont icon-service4"></i> + <div class="name">service5</div> + <div class="fontclass">.icon-service4</div> + </li> + + </ul> + + <h2 id="font-class-">font-class引用</h2> + <hr> + + <p>font-class是unicode使用方式的一种变种,主要是解决unicode书写不直观,语意不明确的问题。</p> + <p>与unicode使用方式相比,具有如下特点:</p> + <ul> + <li>兼容性良好,支持ie8+,及所有现代浏览器。</li> + <li>相比于unicode语意明确,书写更直观。可以很容易分辨这个icon是什么。</li> + <li>因为使用class来定义图标,所以当要替换图标时,只需要修改class里面的unicode引用。</li> + <li>不过因为本质上还是使用的字体,所以多色图标还是不支持的。</li> + </ul> + <p>使用步骤如下:</p> + <h3 id="-fontclass-">第一步:引入项目下面生成的fontclass代码:</h3> + + + <pre><code class="lang-js hljs javascript"><span class="hljs-comment">&lt;link rel="stylesheet" type="text/css" href="./iconfont.css"&gt;</span></code></pre> + <h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3> + <pre><code class="lang-css hljs">&lt;<span class="hljs-selector-tag">i</span> <span class="hljs-selector-tag">class</span>="<span class="hljs-selector-tag">iconfont</span> <span class="hljs-selector-tag">icon-xxx</span>"&gt;&lt;/<span class="hljs-selector-tag">i</span>&gt;</code></pre> + <blockquote> + <p>"iconfont"是你项目下的font-family。可以通过编辑项目查看,默认是"iconfont"。</p> + </blockquote> + </div> +</body> +</html> diff --git a/cyclone-web/vendor/iconfont/demo_symbol.html b/cyclone-web/vendor/iconfont/demo_symbol.html new file mode 100644 index 0000000000000000000000000000000000000000..fc89f71bfd8f6b5a1004e91d342b67bfe74d0a90 --- /dev/null +++ b/cyclone-web/vendor/iconfont/demo_symbol.html @@ -0,0 +1,279 @@ + +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"/> + <title>IconFont</title> + <link rel="stylesheet" href="demo.css"> + <script src="iconfont.js"></script> + + <style type="text/css"> + .icon { + /* 通过设置 font-size 来改变图标大小 */ + width: 1em; height: 1em; + /* 图标和文字相邻时,垂直对齐 */ + vertical-align: -0.15em; + /* 通过设置 color 来改变 SVG 的颜色/fill */ + fill: currentColor; + /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示 + normalize.css 中也包含这行 */ + overflow: hidden; + } + + </style> +</head> +<body> + <div class="main markdown"> + <h1>IconFont 图标</h1> + <ul class="icon_lists clear"> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-power"></use> + </svg> + <div class="name">power</div> + <div class="fontclass">#icon-power</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-alert"></use> + </svg> + <div class="name">alert</div> + <div class="fontclass">#icon-alert</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-artboard6"></use> + </svg> + <div class="name">publishflow</div> + <div class="fontclass">#icon-artboard6</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-relation"></use> + </svg> + <div class="name">relation</div> + <div class="fontclass">#icon-relation</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-appcenter"></use> + </svg> + <div class="name">appcenter</div> + <div class="fontclass">#icon-appcenter</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-approval"></use> + </svg> + <div class="name">approval</div> + <div class="fontclass">#icon-approval</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-dashbord"></use> + </svg> + <div class="name">dashbord</div> + <div class="fontclass">#icon-dashbord</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-beforeconf"></use> + </svg> + <div class="name">beforeconf</div> + <div class="fontclass">#icon-beforeconf</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-confmanagement"></use> + </svg> + <div class="name">confmanagement</div> + <div class="fontclass">#icon-confmanagement</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-implement"></use> + </svg> + <div class="name">implement</div> + <div class="fontclass">#icon-implement</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-idcstore"></use> + </svg> + <div class="name">idcstore</div> + <div class="fontclass">#icon-idcstore</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-logicarch"></use> + </svg> + <div class="name">logicarch</div> + <div class="fontclass">#icon-logicarch</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-info"></use> + </svg> + <div class="name">info</div> + <div class="fontclass">#icon-info</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-projectmanagement"></use> + </svg> + <div class="name">projectmanagement</div> + <div class="fontclass">#icon-projectmanagement</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-deployarch"></use> + </svg> + <div class="name">deployarch</div> + <div class="fontclass">#icon-deployarch</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-reportmanagement"></use> + </svg> + <div class="name">reportmanagement</div> + <div class="fontclass">#icon-reportmanagement</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-resoucepool"></use> + </svg> + <div class="name">resoucepool</div> + <div class="fontclass">#icon-resoucepool</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-sysmanagement"></use> + </svg> + <div class="name">sysmanagement</div> + <div class="fontclass">#icon-sysmanagement</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-routinginspection"></use> + </svg> + <div class="name">routinginspection</div> + <div class="fontclass">#icon-routinginspection</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-serviceflow"></use> + </svg> + <div class="name">serviceflow</div> + <div class="fontclass">#icon-serviceflow</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-serviceindex"></use> + </svg> + <div class="name">serviceindex</div> + <div class="fontclass">#icon-serviceindex</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-cloudboot"></use> + </svg> + <div class="name">cloudboot</div> + <div class="fontclass">#icon-cloudboot</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-service"></use> + </svg> + <div class="name">service1</div> + <div class="fontclass">#icon-service</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-service1"></use> + </svg> + <div class="name">service4</div> + <div class="fontclass">#icon-service1</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-service2"></use> + </svg> + <div class="name">service3</div> + <div class="fontclass">#icon-service2</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-service3"></use> + </svg> + <div class="name">service2</div> + <div class="fontclass">#icon-service3</div> + </li> + + <li> + <svg class="icon" aria-hidden="true"> + <use xlink:href="#icon-service4"></use> + </svg> + <div class="name">service5</div> + <div class="fontclass">#icon-service4</div> + </li> + + </ul> + + + <h2 id="symbol-">symbol引用</h2> + <hr> + + <p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a> + 这种用法其实是做了一个svg的集合,与另外两种相比具有如下特点:</p> + <ul> + <li>支持多色图标了,不再受单色限制。</li> + <li>通过一些技巧,支持像字体那样,通过<code>font-size</code>,<code>color</code>来调整样式。</li> + <li>兼容性较差,支持 ie9+,及现代浏览器。</li> + <li>浏览器渲染svg的性能一般,还不如png。</li> + </ul> + <p>使用步骤如下:</p> + <h3 id="-symbol-">第一步:引入项目下面生成的symbol代码:</h3> + <pre><code class="lang-js hljs javascript"><span class="hljs-comment">&lt;script src="./iconfont.js"&gt;&lt;/script&gt;</span></code></pre> + <h3 id="-css-">第二步:加入通用css代码(引入一次就行):</h3> + <pre><code class="lang-js hljs javascript">&lt;style type=<span class="hljs-string">"text/css"</span>&gt; +.icon { + width: <span class="hljs-number">1</span>em; height: <span class="hljs-number">1</span>em; + vertical-align: <span class="hljs-number">-0.15</span>em; + fill: currentColor; + overflow: hidden; +} +&lt;<span class="hljs-regexp">/style&gt;</span></code></pre> + <h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3> + <pre><code class="lang-js hljs javascript">&lt;svg <span class="hljs-class"><span class="hljs-keyword">class</span></span>=<span class="hljs-string">"icon"</span> aria-hidden=<span class="hljs-string">"true"</span>&gt;<span class="xml"><span class="hljs-tag"> + &lt;<span class="hljs-name">use</span> <span class="hljs-attr">xlink:href</span>=<span class="hljs-string">"#icon-xxx"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">use</span>&gt;</span> +</span>&lt;<span class="hljs-regexp">/svg&gt; + </span></code></pre> + </div> +</body> +</html> diff --git a/cyclone-web/vendor/iconfont/demo_unicode.html b/cyclone-web/vendor/iconfont/demo_unicode.html new file mode 100644 index 0000000000000000000000000000000000000000..7169bd6084e5d65608ce43649fbdde9bc84cad86 --- /dev/null +++ b/cyclone-web/vendor/iconfont/demo_unicode.html @@ -0,0 +1,240 @@ + +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"/> + <title>IconFont</title> + <link rel="stylesheet" href="demo.css"> + + <style type="text/css"> + + @font-face {font-family: "iconfont"; + src: url('iconfont.eot'); /* IE9*/ + src: url('iconfont.eot#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('iconfont.woff') format('woff'), /* chrome, firefox */ + url('iconfont.ttf') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ + url('iconfont.svg#iconfont') format('svg'); /* iOS 4.1- */ + } + + .iconfont { + font-family:"iconfont" !important; + font-size:16px; + font-style:normal; + -webkit-font-smoothing: antialiased; + -webkit-text-stroke-width: 0.2px; + -moz-osx-font-smoothing: grayscale; + } + + </style> +</head> +<body> + <div class="main markdown"> + <h1>IconFont 图标</h1> + <ul class="icon_lists clear"> + + <li> + <i class="icon iconfont">&#xe62c;</i> + <div class="name">power</div> + <div class="code">&amp;#xe62c;</div> + </li> + + <li> + <i class="icon iconfont">&#xe61c;</i> + <div class="name">alert</div> + <div class="code">&amp;#xe61c;</div> + </li> + + <li> + <i class="icon iconfont">&#xe60a;</i> + <div class="name">publishflow</div> + <div class="code">&amp;#xe60a;</div> + </li> + + <li> + <i class="icon iconfont">&#xe6d8;</i> + <div class="name">relation</div> + <div class="code">&amp;#xe6d8;</div> + </li> + + <li> + <i class="icon iconfont">&#xe792;</i> + <div class="name">appcenter</div> + <div class="code">&amp;#xe792;</div> + </li> + + <li> + <i class="icon iconfont">&#xe793;</i> + <div class="name">approval</div> + <div class="code">&amp;#xe793;</div> + </li> + + <li> + <i class="icon iconfont">&#xe794;</i> + <div class="name">dashbord</div> + <div class="code">&amp;#xe794;</div> + </li> + + <li> + <i class="icon iconfont">&#xe795;</i> + <div class="name">beforeconf</div> + <div class="code">&amp;#xe795;</div> + </li> + + <li> + <i class="icon iconfont">&#xe796;</i> + <div class="name">confmanagement</div> + <div class="code">&amp;#xe796;</div> + </li> + + <li> + <i class="icon iconfont">&#xe797;</i> + <div class="name">implement</div> + <div class="code">&amp;#xe797;</div> + </li> + + <li> + <i class="icon iconfont">&#xe798;</i> + <div class="name">idcstore</div> + <div class="code">&amp;#xe798;</div> + </li> + + <li> + <i class="icon iconfont">&#xe799;</i> + <div class="name">logicarch</div> + <div class="code">&amp;#xe799;</div> + </li> + + <li> + <i class="icon iconfont">&#xe79a;</i> + <div class="name">info</div> + <div class="code">&amp;#xe79a;</div> + </li> + + <li> + <i class="icon iconfont">&#xe79b;</i> + <div class="name">projectmanagement</div> + <div class="code">&amp;#xe79b;</div> + </li> + + <li> + <i class="icon iconfont">&#xe79c;</i> + <div class="name">deployarch</div> + <div class="code">&amp;#xe79c;</div> + </li> + + <li> + <i class="icon iconfont">&#xe79d;</i> + <div class="name">reportmanagement</div> + <div class="code">&amp;#xe79d;</div> + </li> + + <li> + <i class="icon iconfont">&#xe79e;</i> + <div class="name">resoucepool</div> + <div class="code">&amp;#xe79e;</div> + </li> + + <li> + <i class="icon iconfont">&#xe79f;</i> + <div class="name">sysmanagement</div> + <div class="code">&amp;#xe79f;</div> + </li> + + <li> + <i class="icon iconfont">&#xe7a0;</i> + <div class="name">routinginspection</div> + <div class="code">&amp;#xe7a0;</div> + </li> + + <li> + <i class="icon iconfont">&#xe7a1;</i> + <div class="name">serviceflow</div> + <div class="code">&amp;#xe7a1;</div> + </li> + + <li> + <i class="icon iconfont">&#xe7a2;</i> + <div class="name">serviceindex</div> + <div class="code">&amp;#xe7a2;</div> + </li> + + <li> + <i class="icon iconfont">&#xe603;</i> + <div class="name">cloudboot</div> + <div class="code">&amp;#xe603;</div> + </li> + + <li> + <i class="icon iconfont">&#xe7ab;</i> + <div class="name">service1</div> + <div class="code">&amp;#xe7ab;</div> + </li> + + <li> + <i class="icon iconfont">&#xe7ac;</i> + <div class="name">service4</div> + <div class="code">&amp;#xe7ac;</div> + </li> + + <li> + <i class="icon iconfont">&#xe7ad;</i> + <div class="name">service3</div> + <div class="code">&amp;#xe7ad;</div> + </li> + + <li> + <i class="icon iconfont">&#xe7ae;</i> + <div class="name">service2</div> + <div class="code">&amp;#xe7ae;</div> + </li> + + <li> + <i class="icon iconfont">&#xe7af;</i> + <div class="name">service5</div> + <div class="code">&amp;#xe7af;</div> + </li> + + </ul> + <h2 id="unicode-">unicode引用</h2> + <hr> + + <p>unicode是字体在网页端最原始的应用方式,特点是:</p> + <ul> + <li>兼容性最好,支持ie6+,及所有现代浏览器。</li> + <li>支持按字体的方式去动态调整图标大小,颜色等等。</li> + <li>但是因为是字体,所以不支持多色。只能使用平台里单色的图标,就算项目里有多色图标也会自动去色。</li> + </ul> + <blockquote> + <p>注意:新版iconfont支持多色图标,这些多色图标在unicode模式下将不能使用,如果有需求建议使用symbol的引用方式</p> + </blockquote> + <p>unicode使用步骤如下:</p> + <h3 id="-font-face">第一步:拷贝项目下面生成的font-face</h3> + <pre><code class="lang-js hljs javascript">@font-face { + font-family: <span class="hljs-string">'iconfont'</span>; + src: url(<span class="hljs-string">'iconfont.eot'</span>); + src: url(<span class="hljs-string">'iconfont.eot?#iefix'</span>) format(<span class="hljs-string">'embedded-opentype'</span>), + url(<span class="hljs-string">'iconfont.woff'</span>) format(<span class="hljs-string">'woff'</span>), + url(<span class="hljs-string">'iconfont.ttf'</span>) format(<span class="hljs-string">'truetype'</span>), + url(<span class="hljs-string">'iconfont.svg#iconfont'</span>) format(<span class="hljs-string">'svg'</span>); +} +</code></pre> + <h3 id="-iconfont-">第二步:定义使用iconfont的样式</h3> + <pre><code class="lang-js hljs javascript">.iconfont{ + font-family:<span class="hljs-string">"iconfont"</span> !important; + font-size:<span class="hljs-number">16</span>px;font-style:normal; + -webkit-font-smoothing: antialiased; + -webkit-text-stroke-width: <span class="hljs-number">0.2</span>px; + -moz-osx-font-smoothing: grayscale; +} +</code></pre> + <h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3> + <pre><code class="lang-js hljs javascript">&lt;i <span class="hljs-class"><span class="hljs-keyword">class</span></span>=<span class="hljs-string">"iconfont"</span>&gt;&amp;#x33;<span class="xml"><span class="hljs-tag">&lt;/<span class="hljs-name">i</span>&gt;</span></span></code></pre> + + <blockquote> + <p>"iconfont"是你项目下的font-family。可以通过编辑项目查看,默认是"iconfont"。</p> + </blockquote> + </div> + + +</body> +</html> diff --git a/cyclone-web/vendor/iconfont/iconfont.css b/cyclone-web/vendor/iconfont/iconfont.css new file mode 100644 index 0000000000000000000000000000000000000000..7a8a460b717d42b848251b3275b3b49798c62496 --- /dev/null +++ b/cyclone-web/vendor/iconfont/iconfont.css @@ -0,0 +1,71 @@ + +@font-face {font-family: "iconfont"; + src: url('iconfont.eot?t=1499063229568'); /* IE9*/ + src: url('iconfont.eot?t=1499063229568#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('iconfont.woff?t=1499063229568') format('woff'), /* chrome, firefox */ + url('iconfont.ttf?t=1499063229568') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ + url('iconfont.svg?t=1499063229568#iconfont') format('svg'); /* iOS 4.1- */ +} + +.iconfont { + font-family:"iconfont" !important; + font-size:16px; + font-style:normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-power:before { content: "\e62c"; } + +.icon-alert:before { content: "\e61c"; } + +.icon-artboard6:before { content: "\e60a"; } + +.icon-relation:before { content: "\e6d8"; } + +.icon-appcenter:before { content: "\e792"; } + +.icon-approval:before { content: "\e793"; } + +.icon-dashbord:before { content: "\e794"; } + +.icon-beforeconf:before { content: "\e795"; } + +.icon-confmanagement:before { content: "\e796"; } + +.icon-implement:before { content: "\e797"; } + +.icon-idcstore:before { content: "\e798"; } + +.icon-logicarch:before { content: "\e799"; } + +.icon-info:before { content: "\e79a"; } + +.icon-projectmanagement:before { content: "\e79b"; } + +.icon-deployarch:before { content: "\e79c"; } + +.icon-reportmanagement:before { content: "\e79d"; } + +.icon-resoucepool:before { content: "\e79e"; } + +.icon-sysmanagement:before { content: "\e79f"; } + +.icon-routinginspection:before { content: "\e7a0"; } + +.icon-serviceflow:before { content: "\e7a1"; } + +.icon-serviceindex:before { content: "\e7a2"; } + +.icon-cloudboot:before { content: "\e603"; } + +.icon-service:before { content: "\e7ab"; } + +.icon-service1:before { content: "\e7ac"; } + +.icon-service2:before { content: "\e7ad"; } + +.icon-service3:before { content: "\e7ae"; } + +.icon-service4:before { content: "\e7af"; } + diff --git a/cyclone-web/vendor/iconfont/iconfont.eot b/cyclone-web/vendor/iconfont/iconfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..4c4ac2c6c8aebfb101152f9acb8c13274e9fae04 Binary files /dev/null and b/cyclone-web/vendor/iconfont/iconfont.eot differ diff --git a/cyclone-web/vendor/iconfont/iconfont.js b/cyclone-web/vendor/iconfont/iconfont.js new file mode 100644 index 0000000000000000000000000000000000000000..29abd9357ed9ed65b7a3e40c23ca8838ce0704ee --- /dev/null +++ b/cyclone-web/vendor/iconfont/iconfont.js @@ -0,0 +1 @@ +(function(window){var svgSprite="<svg>"+""+'<symbol id="icon-power" viewBox="0 0 1024 1024">'+""+'<path d="M822.345143 176.128c-28.672-29.330286-74.898286-29.330286-103.497143 0-28.598857 29.330286-28.598857 77.092571 0 106.422857C774.144 339.529143 804.571429 415.085714 804.571429 495.396571s-30.427429 156.013714-85.723429 212.845714c-110.592 113.956571-303.177143 113.956571-413.696 0C249.856 651.264 219.428571 575.780571 219.428571 495.396571 219.428571 414.939429 249.856 339.382857 305.152 282.550857c28.525714-29.330286 28.525714-77.092571 0-106.422857-28.598857-29.330286-74.898286-29.330286-103.497143 0C118.784 261.412571 73.142857 374.857143 73.142857 495.396571c0 120.466286 45.641143 233.984 128.512 319.268571 82.944 85.284571 193.097143 132.315429 310.345143 132.315429 117.321143 0 227.401143-47.177143 310.345143-132.461714C905.216 729.6 950.857143 616.082286 950.857143 495.396571 950.857143 374.857143 905.216 261.412571 822.345143 176.128zM512 589.019429c40.448 0 73.142857-32.548571 73.142857-73.142857l0-438.857143c0-40.448-32.694857-73.142857-73.142857-73.142857-40.448 0-73.142857 32.694857-73.142857 73.142857l0 438.857143C438.857143 556.178286 471.552 589.019429 512 589.019429z" ></path>'+""+"</symbol>"+""+'<symbol id="icon-alert" viewBox="0 0 1024 1024">'+""+'<path d="M1008 886.336c0 23.216-8.192 40.88-24.48 53.024-16.352 12.16-36.432 18.288-60.176 18.288L100.672 957.648c-23.728 0-43.856-6.256-60.16-18.72C24.176 926.464 16 908.912 16 886.32c0-17.776 5.328-35.904 16.064-54.336l410.88-716.624c19.568-32.672 42.784-49.008 69.52-49.008 26.752 0 49.312 16.352 67.712 49.008l411.776 717.488C1002.656 851.936 1008 869.712 1008 886.336zM573.92 430.88l0-130.096-123.888 0 0 130.096c0 8.384 0.608 16.256 1.808 23.648 1.2 7.44 2.848 15.76 4.88 24.944 2.128 9.232 3.728 17.056 4.96 23.648l23.136 144.4 52.624 0 24.048-144.4c1.2-5.968 2.992-13.696 5.392-23.216 2.352-9.488 4.144-17.952 5.36-25.392C573.344 447.136 573.92 439.264 573.92 430.88zM555.696 819.936c12.112-12.16 18.224-26.88 18.224-44.096s-6.112-31.744-18.224-43.664c-12.176-11.84-26.944-17.84-44.16-17.84-16.64 0-31.04 5.936-43.232 17.84-12.192 11.904-18.304 26.432-18.304 43.664s6.112 31.936 18.304 44.096c12.192 12.224 26.592 18.288 43.232 18.288C528.768 838.224 543.536 832.16 555.696 819.936z" ></path>'+""+"</symbol>"+""+'<symbol id="icon-artboard6" viewBox="0 0 1024 1024">'+""+'<path d="M783.554 632.126l-149.714-87.34v190.176h-221.184l-29.743-30.172 356.716-325.024h93.618v-252.297h-249.231v116.875h-186.297c-4.391-49.165-27.733-92.483-62.997-122.845-31.749-27.377-72.348-44.463-117.212-44.463-100.27 0-181.903 82.383-181.903 183.633v3.175c0 22.549 4.643 43.891 11.984 63.836 25.852 69.744 91.924 119.86 169.919 119.86 44.863 0 85.462-17.15 117.212-44.781 23.028-20.007 41.163-45.479 52.142-75.078 3.954-10.544 7.089-21.47 9.162-32.838h187.99v84.924h81.132l-317.563 289.265-87.971-89.053-175.754 177.916 175.754 177.916 148.585-150.412h225.638v195.067l373.345-217.87-223.63-130.468zM349.471 263.843c0 10.735-1.569 21.025-3.954 30.997-2.446 10.162-6.149 19.754-10.793 28.837-0.627 1.397-1.38 2.668-2.133 4.001-22.463 41.161-65.382 69.362-115.077 69.362-49.822 0-92.677-28.267-115.142-69.362-10.415-19.056-16.879-40.589-16.879-63.836v-3.175c0-73.554 59.233-133.2 132.020-133.2 51.389 0 95.439 30.044 117.212 73.364 6.777 13.402 11.231 28.012 13.113 43.51 0.69 5.462 1.632 10.735 1.632 16.325v3.175zM684.666 785.394v-152.762l222.689 129.959-222.689 129.959v-107.155z" ></path>'+""+"</symbol>"+""+'<symbol id="icon-relation" viewBox="0 0 1024 1024">'+""+'<path d="M804.571429 0C680.228571 0 585.142857 95.085714 585.142857 219.428571c0 73.142857 36.571429 138.971429 95.085714 182.857143L555.885714 665.6C541.257143 658.285714 526.628571 658.285714 512 658.285714 468.114286 658.285714 431.542857 672.914286 402.285714 694.857143L277.942857 577.828571C285.257143 555.885714 292.571429 533.942857 292.571429 512c0-80.457143-65.828571-146.285714-146.285714-146.285714S0 431.542857 0 512c0 80.457143 65.828571 146.285714 146.285714 146.285714 29.257143 0 58.514286-7.314286 80.457143-21.942857l124.342857 117.028571c-14.628571 29.257143-29.257143 58.514286-29.257143 95.085714C329.142857 943.542857 409.6 1024 512 1024s182.857143-80.457143 182.857143-182.857143c0-58.514286-29.257143-109.714286-73.142857-146.285714l124.342857-263.314286C768 431.542857 782.628571 438.857143 804.571429 438.857143c124.342857 0 219.428571-95.085714 219.428571-219.428571S928.914286 0 804.571429 0z" ></path>'+""+"</symbol>"+""+'<symbol id="icon-appcenter" viewBox="0 0 1024 1024">'+""+'<path d="M118.857143 133.485714h283.428571v290.742857h-283.428571zM976.457143 288.914286l-239.542857-245.028572-239.542857 245.028572 239.542857 245.028571 239.542857-245.028571z m-239.542857-148.114286l146.285714 149.942857-146.285714 149.942857-146.285715-149.942857 146.285715-149.942857zM118.857143 612.571429h283.428571v290.742857h-283.428571zM594.285714 612.571429h283.428572v290.742857h-283.428572z" ></path>'+""+"</symbol>"+""+'<symbol id="icon-approval" viewBox="0 0 1024 1024">'+""+'<path d="M927.085714 640h-334.628571v-115.2c87.771429-32.914286 148.114286-117.028571 148.114286-213.942857 0-126.171429-102.4-230.4-230.4-230.4s-230.4 102.4-230.4 230.4c0 98.742857 62.171429 182.857143 148.114285 213.942857v115.2h-334.628571v133.485714h830.171428v-133.485714z m-535.771428-330.971429c0-65.828571 53.028571-120.685714 120.685714-120.685714 65.828571 0 120.685714 53.028571 120.685714 120.685714s-53.028571 120.685714-120.685714 120.685715c-65.828571 0-120.685714-54.857143-120.685714-120.685715zM96.914286 857.6h830.171428v45.714286h-830.171428z" ></path>'+""+"</symbol>"+""+'<symbol id="icon-dashbord" viewBox="0 0 1024 1024">'+""+'<path d="M897.828571 389.485714v-268.8h-285.257142l-91.428572-85.942857-482.742857 451.657143 12.8 12.8 12.8 12.8 9.142857 9.142857 12.8 12.8 12.8 12.8 47.542857-43.885714V974.628571h316.342857v-250.514285h120.685715V974.628571h316.342857v-469.942857l49.371428 47.542857 12.8-12.8 12.8-12.8 9.142858-9.142857 12.8-12.8 12.8-12.8-111.542858-102.4z m-82.285714 155.428572c0 1.828571 0 1.828571 0 0v343.771428h-153.6v-250.514285h-285.257143v250.514285h-153.6v-466.285714l296.228572-276.114286 296.228571 276.114286v122.514286z m-117.028571-341.942857h117.028571v109.714285l-117.028571-109.714285z" ></path>'+""+"</symbol>"+""+'<symbol id="icon-beforeconf" viewBox="0 0 1024 1024">'+""+'<path d="M433.371429 318.171429c65.828571 0 122.514286 42.057143 146.285714 100.571428h146.285714l122.514286-67.657143-71.314286-120.685714-113.371428 64-3.657143-5.485714c-18.285714-21.942857-36.571429-40.228571-58.514286-54.857143l-3.657143-3.657143 40.228572-142.628571-135.314286-32.914286-36.571429 128h-5.485714c-3.657143 0-7.314286 0-9.142857-1.828572-5.485714 0-10.971429-1.828571-14.628572-1.828571-16.457143 0-32.914286 1.828571-53.028571 5.485714l-5.485714 1.828572-69.485715-129.828572-118.857142 73.142857 62.171428 117.028572-5.485714 3.657143c-18.285714 14.628571-34.742857 34.742857-51.2 58.514285l-3.657143 3.657143-140.8-42.057143-32.914286 137.142858 124.342857 38.4v5.485714c0 3.657143 0 7.314286-1.828571 10.971428 0 5.485714-1.828571 9.142857-1.828571 14.628572 0 16.457143 1.828571 32.914286 5.485714 53.028571l1.828571 5.485715-128 71.314285 71.314286 120.685715 113.371429-64 3.657142 5.485714c18.285714 21.942857 36.571429 40.228571 58.514286 54.857143l3.657143 1.828571 80.457143-111.542857c-45.714286-29.257143-74.971429-78.628571-74.971429-137.142857 1.828571-87.771429 71.314286-159.085714 159.085715-159.085714z" ></path>'+""+'<path d="M793.6 512H457.142857v91.428571h473.6v-91.428571zM890.514286 676.571429H457.142857v91.428571h473.6v-91.428571h-31.085714zM720.457143 822.857143H457.142857v91.428571h473.6v-91.428571h-195.657143z" ></path>'+""+"</symbol>"+""+'<symbol id="icon-confmanagement" viewBox="0 0 1024 1024">'+""+'<path d="M970.971429 707.657143v-96.914286h-53.028572c-5.485714-32.914286-20.114286-62.171429-32.914286-85.942857l38.4-38.4-67.657142-67.657143-38.4 38.4c-23.771429-20.114286-53.028571-29.257143-85.942858-34.742857V371.2h-95.085714v53.028571c-29.257143 5.485714-56.685714 20.114286-85.942857 34.742858l-38.4-38.4-67.657143 67.657142 38.4 38.4c-14.628571 23.771429-29.257143 53.028571-32.914286 85.942858h-53.028571v96.914285h53.028571c5.485714 29.257143 20.114286 58.514286 32.914286 85.942857l-38.4 34.742858 67.657143 67.657142 38.4-38.4c23.771429 20.114286 53.028571 29.257143 85.942857 34.742858v53.028571h95.085714v-49.371429c29.257143-5.485714 56.685714-20.114286 85.942858-34.742857l38.4 38.4 67.657142-67.657143-38.4-38.4c14.628571-23.771429 29.257143-53.028571 32.914286-85.942857h53.028572z m-287.085715 96.914286c-76.8 0-144.457143-67.657143-144.457143-144.457143 0-82.285714 67.657143-144.457143 144.457143-144.457143 80.457143 0 144.457143 62.171429 144.457143 144.457143 0 76.8-62.171429 144.457143-144.457143 144.457143z" ></path>'+""+'<path d="M137.142857 142.628571h650.971429v232.228572h65.828571v-299.885714h-784.457143v815.542857h365.714286v-67.657143h-298.057143z" ></path>'+""+'<path d="M228.571429 268.8h466.285714v67.657143h-466.285714zM228.571429 446.171429h171.885714v67.657142h-171.885714zM228.571429 612.571429h109.714285v65.828571h-109.714285z" ></path>'+""+"</symbol>"+""+'<symbol id="icon-implement" viewBox="0 0 1024 1024">'+""+'<path d="M839.314286 700.342857c-47.542857-45.714286-104.228571-76.8-137.142857-76.8l-120.685715-100.571428 87.771429-84.114286c73.142857 31.085714 153.6 14.628571 210.285714-38.4 47.542857-53.028571 64-122.514286 47.542857-182.857143l-137.142857 129.828571-129.828571-122.514285 137.142857-129.828572c-64-14.628571-137.142857 0-184.685714 45.714286-56.685714 53.028571-73.142857 137.142857-40.228572 199.314286l-98.742857 93.257143-47.542857-40.228572-7.314286 7.314286-144.457143-137.142857-16.457143 10.971428 23.771429-18.285714-40.228571-53.028571-73.142858-53.028572-40.228571 38.4 56.685714 69.485714 47.542857 38.4 9.142858-7.314285 151.771428 137.142857-23.771428 23.771428 40.228571 45.714286-323.657143 307.2 96.914286 98.742857 318.171428-303.542857 100.571429 111.542857c-7.314286 31.085714 23.771429 91.428571 73.142857 146.285715 40.228571 38.4 89.6 60.342857 120.685714 69.485714l7.314286 7.314286v-7.314286c16.457143 0 32.914286 0 40.228572-7.314286l56.685714-53.028571c16.457143-7.314286 16.457143-23.771429 16.457143-45.714286-12.8-42.057143-36.571429-80.457143-76.8-118.857143z" ></path>'+""+"</symbol>"+""+'<symbol id="icon-idcstore" viewBox="0 0 1024 1024">'+""+'<path d="M958.171429 407.771429c0-5.485714-1.828571-10.971429-5.485715-16.457143l-1.828571-5.485715-106.057143-283.428571h-667.428571l-104.228572 279.771429c0 1.828571 0 1.828571-1.828571 3.657142v1.828572l-3.657143 10.971428c0 1.828571-1.828571 5.485714-1.828572 9.142858-3.657143 12.8-5.485714 23.771429-5.485714 34.742857 0 60.342857 34.742857 115.2 87.771429 135.314285v347.428572h733.257143V572.342857c47.542857-25.6 76.8-74.971429 76.8-129.828571 3.657143-12.8 1.828571-21.942857 0-34.742857z m-146.285715 438.857142h-590.628571v-263.314285c31.085714-5.485714 60.342857-21.942857 80.457143-45.714286 25.6 31.085714 64 47.542857 102.4 47.542857 40.228571 0 76.8-18.285714 102.4-47.542857 25.6 31.085714 64 47.542857 102.4 47.542857 40.228571 0 76.8-18.285714 102.4-47.542857 18.285714 21.942857 42.057143 36.571429 67.657143 43.885714h1.828571c3.657143 0 5.485714 1.828571 9.142857 1.828572h12.8V846.628571z m29.257143-340.114285c-3.657143 0-7.314286 1.828571-9.142857 1.828571h-9.142857c-3.657143 0-9.142857 0-12.8-1.828571-1.828571 0-3.657143-1.828571-5.485714-1.828572-1.828571 0-3.657143-1.828571-3.657143-1.828571h-1.828572c-23.771429-9.142857-40.228571-32.914286-42.057143-60.342857v-5.485715c0-9.142857-3.657143-20.114286-10.971428-25.6-7.314286-7.314286-14.628571-10.971429-25.6-10.971428-20.114286 0-34.742857 16.457143-34.742857 36.571428V442.514286c-1.828571 27.428571-18.285714 49.371429-42.057143 60.342857-1.828571 0-1.828571 0-3.657143 1.828571-3.657143 1.828571-7.314286 1.828571-9.142857 1.828572-3.657143 0-9.142857 1.828571-12.8 1.828571-3.657143 0-9.142857 0-12.8-1.828571-1.828571 0-3.657143-1.828571-5.485714-1.828572-1.828571 0-3.657143-1.828571-3.657143-1.828571h-1.828572c-23.771429-9.142857-40.228571-32.914286-42.057143-60.342857v-1.828572-3.657143c0-9.142857-3.657143-20.114286-10.971428-25.6-7.314286-7.314286-14.628571-10.971429-25.6-10.971428-20.114286 0-34.742857 16.457143-34.742857 36.571428V442.514286c-1.828571 27.428571-18.285714 49.371429-42.057143 60.342857-1.828571 0-1.828571 0-3.657143 1.828571-3.657143 1.828571-7.314286 1.828571-9.142857 1.828572-3.657143 0-9.142857 1.828571-12.8 1.828571-3.657143 0-9.142857 0-12.8-1.828571-1.828571 0-3.657143-1.828571-5.485714-1.828572-1.828571 0-3.657143-1.828571-5.485715-1.828571h-1.828571c-23.771429-9.142857-40.228571-32.914286-42.057143-60.342857v-5.485715c0-20.114286-14.628571-36.571429-34.742857-38.4-20.114286 0-34.742857 16.457143-34.742857 36.571429V440.685714c-1.828571 27.428571-18.285714 49.371429-42.057143 60.342857-1.828571 0-1.828571 0-3.657143 1.828572-3.657143 1.828571-5.485714 1.828571-9.142857 1.828571s-9.142857 1.828571-12.8 1.828572h-7.314286-7.314286c-32.914286-5.485714-54.857143-36.571429-54.857142-69.485715 0-7.314286 0-12.8 3.657142-20.114285v-1.828572-1.828571l89.6-239.542857h566.857143l87.771429 234.057143 1.828571 5.485714v3.657143c1.828571 7.314286 3.657143 12.8 3.657143 20.114285-3.657143 32.914286-23.771429 60.342857-51.2 69.485715z" ></path>'+""+"</symbol>"+""+'<symbol id="icon-logicarch" viewBox="0 0 1024 1024">'+""+'<path d="M921.6 685.714286h-47.542857V495.542857h-330.971429v-117.028571h129.828572v-303.542857h-334.628572v303.542857h138.971429v117.028571H146.285714V685.714286h-107.885714v268.8h281.6v-266.971429h-113.371429v16.457143-148.114286h608.914286v129.828572h-115.2v268.8h281.6v-268.8h-60.342857z m-663.771429 62.171428v146.285715h-160.914285v-146.285715h160.914285z m661.942858 146.285715h-160.914286v-146.285715h160.914286v146.285715z" ></path>'+""+"</symbol>"+""+'<symbol id="icon-info" viewBox="0 0 1024 1024">'+""+'<path d="M645.485714 769.828571c-38.4-9.142857-76.8 120.685714-133.485714 102.4h-9.142857c18.285714-186.514286 95.085714-352.914286 133.485714-539.428571h-9.142857c-76.8 27.428571-192 18.285714-266.971429 45.714286v18.285714c115.2 0 85.942857 65.828571 56.685715 138.971429-29.257143 102.4-76.8 223.085714-85.942857 307.2-9.142857 84.114286 47.542857 120.685714 106.057142 120.685714 76.8 0 142.628571-74.971429 171.885715-120.685714 9.142857 1.828571 74.971429-64 36.571428-73.142858zM597.942857 54.857143c-47.542857 0-95.085714 36.571429-95.085714 93.257143 0 45.714286 38.4 93.257143 95.085714 93.257143 47.542857 0 95.085714-36.571429 95.085714-93.257143 0-47.542857-47.542857-93.257143-95.085714-93.257143z" ></path>'+""+"</symbol>"+""+'<symbol id="icon-projectmanagement" viewBox="0 0 1024 1024">'+""+'<path d="M36.571429 652.8h237.714285v109.714286h-237.714285zM36.571429 367.542857v109.714286h307.2c1.828571-1.828571 3.657143-3.657143 3.657142-7.314286v-102.4h-310.857142zM36.571429 109.714286h731.428571v109.714285h-731.428571zM972.8 671.085714v-76.8l-89.6-14.628571c-5.485714-21.942857-12.8-42.057143-23.771429-60.342857l51.2-74.971429-53.028571-53.028571-73.142857 53.028571c-18.285714-10.971429-38.4-20.114286-60.342857-25.6l-14.628572-89.6h-74.971428l-14.628572 89.6c-21.942857 5.485714-42.057143 14.628571-60.342857 25.6l-73.142857-53.028571-49.371429 49.371428-3.657142 3.657143 3.657142 5.485714 47.542858 67.657143c-10.971429 18.285714-20.114286 38.4-25.6 60.342857l-87.771429 14.628572v76.8l87.771429 16.457143c5.485714 21.942857 14.628571 42.057143 25.6 60.342857l-51.2 73.142857 53.028571 54.857143 73.142857-53.028572c18.285714 10.971429 38.4 20.114286 60.342857 25.6l14.628572 89.6h74.971428l16.457143-89.6c21.942857-5.485714 40.228571-14.628571 58.514286-25.6l73.142857 53.028572 53.028571-54.857143-53.028571-74.971429c10.971429-18.285714 20.114286-38.4 23.771429-60.342857l91.428571-12.8z m-197.485714-18.285714c-9.142857 49.371429-51.2 87.771429-102.4 87.771429s-93.257143-38.4-102.4-87.771429c-1.828571-5.485714-1.828571-12.8-1.828572-20.114286 0-58.514286 47.542857-106.057143 104.228572-106.057143 58.514286 0 104.228571 47.542857 104.228571 106.057143 0 7.314286 0 14.628571-1.828571 20.114286z" ></path>'+""+"</symbol>"+""+'<symbol id="icon-deployarch" viewBox="0 0 1024 1024">'+""+'<path d="M394.971429 411.428571c78.628571-80.457143 78.628571-208.457143 0-288.914285s-206.628571-80.457143-285.257143 0c-78.628571 80.457143-78.628571 208.457143 0 288.914285 80.457143 80.457143 206.628571 80.457143 285.257143 0z m-248.685715-252.342857c58.514286-60.342857 153.6-60.342857 213.942857 0 58.514286 60.342857 58.514286 157.257143 0 215.771429-58.514286 60.342857-153.6 60.342857-213.942857 0-58.514286-58.514286-58.514286-155.428571 0-215.771429zM932.571429 411.428571c78.628571-80.457143 78.628571-208.457143 0-288.914285s-206.628571-80.457143-285.257143 0-78.628571 208.457143 0 288.914285c80.457143 80.457143 206.628571 80.457143 285.257143 0z m-212.114286-215.771428c38.4-40.228571 102.4-40.228571 142.628571 0 38.4 40.228571 38.4 104.228571 0 144.457143s-102.4 40.228571-142.628571 0-40.228571-104.228571 0-144.457143zM607.085714 943.542857h371.2v-376.685714h-371.2v376.685714z m71.314286-301.714286h226.742857v228.571429h-226.742857v-228.571429zM31.085714 757.028571l217.6 219.428572 217.6-219.428572-217.6-221.257142z" ></path>'+""+"</symbol>"+""+'<symbol id="icon-reportmanagement" viewBox="0 0 1024 1024">'+""+'<path d="M813.714286 616.228571h-215.771429v42.057143h215.771429zM813.714286 486.4h-215.771429v42.057143h215.771429zM813.714286 356.571429h-215.771429v42.057142h215.771429z" ></path>'+""+'<path d="M550.4 137.142857v-84.114286h-82.285714v84.114286H36.571429v131.657143h43.885714v517.485714h340.114286l-204.8 175.542857 34.742857 42.057143 256-206.628571h1.828571l256 206.628571 34.742857-42.057143-204.8-175.542857h347.428572v-517.485714h45.714285v-131.657143h-437.028571z m349.257143 605.257143l-778.971429 1.828571v-475.428571h778.971429v473.6z" ></path>'+""+'<path d="M363.885714 660.114286c78.628571 0 129.828571-58.514286 129.828572-131.657143h-129.828572v131.657143z" ></path>'+""+'<path d="M321.828571 616.228571v-133.485714h135.314286c0-69.485714-60.342857-140.8-138.971428-140.8s-142.628571 62.171429-142.628572 140.8c0 76.8 45.714286 133.485714 146.285714 133.485714z" ></path>'+""+"</symbol>"+""+'<symbol id="icon-resoucepool" viewBox="0 0 1024 1024">'+""+'<path d="M749.714286 460.8l-221.257143 128v256l221.257143 128 221.257143-128v-256l-221.257143-128z m0 64l138.971428 80.457143-140.8 80.457143-138.971428-80.457143 140.8-80.457143z m-27.428572 208.457143v160.914286l-138.971428-80.457143v-160.914286l138.971428 80.457143z m54.857143 160.914286v-160.914286l138.971429-80.457143v160.914286l-138.971429 80.457143zM38.4 588.8v256l221.257143 128 221.257143-128v-256l-221.257143-128-221.257143 128z m221.257143-64l138.971428 80.457143-140.8 80.457143-138.971428-80.457143 140.8-80.457143z m-25.6 208.457143v160.914286l-138.971429-80.457143v-160.914286l138.971429 80.457143z m53.028571 160.914286v-160.914286l138.971429-80.457143v160.914286l-138.971429 80.457143zM725.942857 171.885714l-221.257143-128-221.257143 128v256l221.257143 128 221.257143-128v-256z m-221.257143-64l138.971429 80.457143-140.8 80.457143-138.971429-80.457143 140.8-80.457143z m-25.6 208.457143v160.914286l-138.971428-80.457143v-160.914286l138.971428 80.457143z m53.028572 160.914286V316.342857l138.971428-80.457143v160.914286l-138.971428 80.457143z" ></path>'+""+"</symbol>"+""+'<symbol id="icon-sysmanagement" viewBox="0 0 1024 1024">'+""+'<path d="M402.285714 135.314286l-42.057143-82.285715H73.142857v817.371429h274.285714v-82.285714h-192v-568.685715h658.285715v106.057143h82.285714v-190.171428h-493.714286z m246.857143 674.742857c-93.257143 0-175.542857-80.457143-175.542857-175.542857 0-98.742857 82.285714-175.542857 175.542857-175.542857 98.742857 0 175.542857 74.971429 175.542857 175.542857-1.828571 93.257143-76.8 175.542857-175.542857 175.542857z m223.085714-323.657143l42.057143-42.057143-74.971428-74.971428-42.057143 42.057142c-27.428571-21.942857-58.514286-32.914286-96.914286-38.4V316.342857h-106.057143v58.514286c-32.914286 5.485714-64 21.942857-96.914285 38.4l-42.057143-42.057143-74.971429 74.971429 42.057143 42.057142c-16.457143 27.428571-32.914286 58.514286-38.4 95.085715h-58.514286v106.057143h58.514286c5.485714 32.914286 21.942857 64 38.4 95.085714l-42.057143 38.4 74.971429 73.142857 42.057143-42.057143c27.428571 21.942857 58.514286 32.914286 96.914285 38.4v58.514286h106.057143v-53.028572c32.914286-5.485714 64-21.942857 96.914286-38.4l42.057143 42.057143 74.971428-74.971428-42.057143-42.057143c16.457143-27.428571 32.914286-58.514286 38.4-95.085714h58.514286v-106.057143h-58.514286c-5.485714-38.4-21.942857-71.314286-38.4-96.914286z" ></path>'+""+"</symbol>"+""+'<symbol id="icon-routinginspection" viewBox="0 0 1024 1024">'+""+'<path d="M541.257143 857.6h-263.314286v73.142857h455.314286v-73.142857h-126.171429zM73.142857 91.428571v696.685715h872.228572v-696.685715H73.142857z m800.914286 621.714286h-729.6v-548.571428h729.6v548.571428z" ></path>'+""+'<path d="M457.142857 385.828571l122.514286 283.428572 111.542857-257.828572h106.057143v-74.971428h-151.771429l-65.828571 149.942857-115.2-265.142857-140.8 259.657143h-100.571429v74.971428h142.628572z" ></path>'+""+"</symbol>"+""+'<symbol id="icon-serviceflow" viewBox="0 0 1024 1024">'+""+'<path d="M106.057143 65.828571v248.685715h314.514286v-98.742857h480.914285v270.628571h-312.685714v-98.742857h-312.685714v98.742857H73.142857v371.2h554.057143v98.742857h312.685714v-246.857143h-312.685714v98.742857h-504.685714V535.771429h153.6v100.571428h312.685714V535.771429h362.057143v-369.371429h-530.285714v-100.571429z" ></path>'+""+"</symbol>"+""+'<symbol id="icon-serviceindex" viewBox="0 0 1024 1024">'+""+'<path d="M82.285714 760.685714h113.371429v115.2h-113.371429zM82.285714 462.628571h113.371429v115.2h-113.371429zM82.285714 146.285714h113.371429v115.2h-113.371429zM323.657143 760.685714h608.914286v115.2h-608.914286zM323.657143 146.285714h608.914286v115.2h-608.914286zM323.657143 462.628571h608.914286v115.2h-608.914286z" ></path>'+""+"</symbol>"+""+'<symbol id="icon-cloudboot" viewBox="0 0 1187 1024">'+""+'<path d="M1164.245 558.963c-10.829-109.594-96.537-191.309-205.171-194.035-13.824-0.346-17.549-3.725-17.894-18.048-1.344-92.583-36.787-170.534-104.602-232.819-157.939-144.691-412.032-90.893-497.741 105.869-8.103 18.701-17.894 24.154-36.787 25.536-139.008 10.868-247.373 129.024-248.717 277.786 0.691 36.749 10.137 79.642 30.336 119.808 9.485 19.085 28.416 28.263 47.616 24.192 18.892-3.763 33.754-21.12 34.752-40.857 0.346-9.869-2.688-18.739-7.066-27.571-16.551-35.405-22.963-72.537-16.551-110.976 12.48-71.155 52.301-121.536 119.808-145.728 68.506-24.499 131.597-10.56 186.624 38.477 21.581 19.392 46.848 19.046 64.435-0.346 17.894-20.083 14.861-46.311-6.758-66.048-36.337-33.328-81.976-57.078-132.58-66.935 44.184 12.484 42.84 8.721 47.525 0.234 43.546-81.408 111.052-126.336 202.483-126.989 92.813-0.346 163.354 43.238 205.517 126.989 39.821 79.987 32.409 158.976-15.514 234.202-15.514 24.499-11.136 51.417 10.445 65.703 22.272 14.285 48.96 6.451 64.474-19.046 11.482-18.739 23.271-37.824 30.029-58.906 4.032-12.288 11.789-15.36 22.617-16.012 48.231-3.379 87.398 14.323 114.394 54.797 26.304 39.514 29.683 82.406 8.755 125.952-9.101 19.431-23.616 34.061-40.128 47.692-10.17 8.146-16.627 20.563-16.627 34.489 0 10.575 3.724 20.279 9.93 27.876 14.76 18.66 41.794 23.077 60.34 8.446 61.44-49.383 93.811-112.358 86.016-193.728z" fill="#515151" ></path>'+""+'<path d="M246.024 760.179h679.296c26.649 0 34.406-7.488 34.406-34.061 0.346-38.477 0-76.915 0-115.737 0-26.534-7.411-34.023-34.406-34.023h-680.986c-24.652 0-32.409 7.795-32.409 31.987v117.428c0 26.572 7.757 34.406 34.099 34.406zM686.741 638.297c63.437-0.346 126.874-0.346 190.656 0 20.928 0 35.443 14.631 35.789 33.024 0.308 19.046-15.552 34.023-36.48 34.023-32.026 0.384-64.128 0-96.154 0h-92.851c-22.272 0-36.788-13.248-37.094-33.024-0.384-19.046 14.477-34.023 36.096-34.023zM512.597 633.191c18.893 0 35.789 16.666 35.789 35.712 0.346 18.432-17.203 36.096-35.443 36.48-18.548 0.308-34.752-16.358-35.097-36.096 0-20.429 15.206-35.751 34.752-36.096zM402.927 633.191c19.929-0.346 35.097 14.631 35.443 34.714 0.346 19.431-15.168 36.442-33.754 37.44-18.892 0.691-36.442-16.666-36.787-36.403-0.308-18.739 15.859-35.405 35.097-35.751zM293.602 633.191c19.2 0 35.443 16.013 35.443 35.405 0 19.737-17.203 37.094-36.096 36.749-18.586-0.308-34.099-17.357-34.099-36.749 0-20.083 15.168-35.405 34.752-35.405zM930.696 807.834h-689.395c-20.928 0-29.376 8.832-29.376 30.297v117.428c0 28.954 7.104 36.442 35.443 36.442h679.296c24.652 0 32.717-7.834 32.717-32.332 0.384-40.857 0.384-81.715 0-122.572 0.384-20.429-8.755-29.261-28.685-29.261zM293.602 936.857c-18.548 0-34.752-16.704-34.752-36.096-0.346-20.429 14.515-35.712 34.061-36.096 19.238-0.308 35.789 15.36 36.096 34.406 0.691 19.737-16.166 37.786-35.405 37.786zM403.272 936.857c-19.2 0-36.096-18.048-35.443-37.786 0.718-19.157 16.421-34.416 35.689-34.416 0.278 0 0.556 0.003 0.832 0.009 19.543 0.383 34.365 16.012 34.020 36.096-0.346 19.737-16.512 36.442-35.097 36.096zM513.288 936.857c-18.547 0.346-34.752-16.358-35.097-36.096-0.346-20.429 14.861-36.096 34.406-36.096 18.893 0 35.789 16.704 35.789 35.751 0.346 18.394-16.896 36.096-35.097 36.442zM873.672 937.203h-185.588c-22.963 0-37.786-13.977-37.786-34.406 0.346-19.392 15.168-33.024 37.44-33.024 62.438-0.308 124.877-0.308 187.277 0 22.963 0 38.477 14.976 37.824 34.406-0.384 19.392-16.205 33.024-39.168 33.024z" fill="#515151" ></path>'+""+"</symbol>"+""+'<symbol id="icon-service" viewBox="0 0 1024 1024">'+""+'<path d="M795.2 335.2c-56.8-100-163.2-163.2-280.8-163.2-148.8 0-276 101.6-312.8 243.2-108 15.2-190.4 108-190.4 220 0 123.2 100.8 223.2 224 223.2h519.2c144.8 0 264-118.4 264-263.2-0.8-131.2-96-241.6-223.2-260z m-40.8 475.2h-519.2c-96.8 0-176-79.2-176-175.2 0-83.2 58.4-152.8 136.8-169.6h48l6.4-44c33.6-118.4 140-201.6 264.8-201.6 104 0 196.8 58.4 244 148.8l5.6 11.2 12.8 1.6c108.8 11.2 192 103.2 192 213.6 0 117.6-96.8 215.2-215.2 215.2z" fill="#666666" ></path>'+""+"</symbol>"+""+'<symbol id="icon-service1" viewBox="0 0 1024 1024">'+""+'<path d="M422.4 460c-79.2 0-143.2 64-143.2 143.2s64 143.2 143.2 143.2 143.2-64 143.2-143.2-64-143.2-143.2-143.2z m0 242.4c-55.2 0-100-44.8-100-100s44.8-100 100-100 100 44.8 100 100-44.8 100-100 100z" fill="#7E7E7E" ></path>'+""+'<path d="M908.8 414.4l2.4-5.6 73.6-31.2v-84.8l-73.6-31.2-1.6-4.8c-3.2-8.8-5.6-15.2-8.8-20.8l-2.4-4.8 1.6-5.6 28-69.6-60-60-74.4 29.6-4.8-2.4c-7.2-3.2-13.6-5.6-20-8l-4.8-1.6-2.4-4.8-30.4-68.8h-84l-32 73.6-4.8 1.6c-6.4 2.4-12.8 4.8-19.2 8l-4.8 2.4-5.6-1.6-69.6-27.2-59.2 59.2 24.8 63.2h-109.6l-41.6 96-6.4 2.4c-8 2.4-16 6.4-24 10.4l-6.4 3.2-96.8-38.4-78.4 78.4 38.4 96.8-3.2 6.4c-4 8-7.2 16-10.4 24.8l-2.4 6.4-96 41.6v110.4l96 41.6 2.4 6.4c2.4 8 5.6 15.2 10.4 24l3.2 6.4-38.4 96.8 78.4 78.4 96.8-38.4 6.4 3.2c8 4 16 7.2 24.8 10.4l6.4 2.4 40.8 95.2h111.2l40.8-95.2 6.4-2.4c10.4-4 18.4-7.2 25.6-10.4l6.4-3.2 96 39.2 78.4-78.4-38.4-96 3.2-6.4c4-8.8 8-17.6 11.2-26.4l2.4-6.4 95.2-40v-110.4l63.2 25.6 60-60-29.6-74.4 2.4-4.8c1.6-7.2 4.8-13.6 7.2-20z m-151.2 213.6l-87.2 36.8-3.2 10.4c-4.8 17.6-12 34.4-20.8 50.4l-5.6 9.6 35.2 88-34.4 34.4-87.2-35.2-9.6 5.6c-15.2 8-32 15.2-50.4 20.8l-10.4 3.2-36.8 87.2h-48l-36.8-87.2-10.4-3.2c-17.6-5.6-34.4-12-49.6-20l-9.6-5.6-88 35.2-34.4-34.4 34.4-88-5.6-9.6c-8-15.2-15.2-32-20-48.8l-3.2-10.4-87.2-38.4v-48.8l87.2-38.4 3.2-10.4c5.6-17.6 12-33.6 20-48.8l5.6-9.6-34.4-88 34.4-34.4 88 35.2 9.6-5.6c15.2-8.8 32-15.2 48.8-20l10.4-3.2 38.4-87.2h48.8l37.6 87.2 10.4 3.2c17.6 5.6 34.4 12 49.6 20.8l9.6 5.6 87.2-35.2 34.4 34.4-35.2 88 5.6 9.6c8 15.2 15.2 32 20.8 50.4l3.2 10.4 87.2 36.8v47.2h-1.6z m129.6-121.6l-27.2 27.2-68-27.2-7.2 4c-8.8 4.8-18.4 9.6-29.6 12.8l-4 1.6-40.8-17.6-2.4-6.4c-4-10.4-7.2-19.2-10.4-25.6l-3.2-6.4 39.2-96-78.4-78.4-96 38.4-6.4-3.2c-8-4-16.8-7.2-25.6-10.4l-6.4-2.4-18.4-42.4 1.6-4.8c3.2-9.6 8-19.2 12-28l4-7.2-27.2-68.8 27.2-27.2 68.8 27.2 7.2-4c12-6.4 24.8-12 38.4-15.2l8-2.4 29.6-68h39.2l29.6 68 8 2.4c13.6 4 27.2 9.6 38.4 16l7.2 4 68-27.2 27.2 27.2-27.2 68 4 7.2c6.4 11.2 12 24.8 16 39.2l2.4 8 67.2 28.8v39.2l-68 28.8-2.4 8c-4 13.6-9.6 26.4-16 39.2l-4 7.2 25.6 66.4z" fill="#7E7E7E" ></path>'+""+"</symbol>"+""+'<symbol id="icon-service2" viewBox="0 0 1024 1024">'+""+'<path d="M900 696.8h-768c-52 0-68 27.2-68 62.4V904.8c0 52 26.4 63.2 68 63.2h768c42.4 0 68-20.8 68-62.4v-145.6c0-45.6-19.2-63.2-68-63.2z m23.2 229.6h-813.6v-187.2h813.6v187.2zM900 380h-768c-52 0-68 27.2-68 62.4v145.6c0 52 26.4 62.4 68 62.4h768c42.4 0 68-20.8 68-62.4v-145.6c0-44-19.2-62.4-68-62.4z m23.2 229.6h-813.6v-187.2h813.6v187.2zM900 64h-768c-52 0-68 27.2-68 62.4v145.6c0 52 26.4 62.4 68 62.4h768c42.4 0 68-20.8 68-62.4v-145.6c0-44.8-19.2-62.4-68-62.4z m23.2 228.8h-813.6v-187.2h813.6v187.2z" fill="#7E7E7E" ></path>'+""+'<path d="M717.6 528h76.8c5.6 0 9.6-4 9.6-8.8v-17.6c0-4.8-4.8-8.8-9.6-8.8h-76.8c-5.6 0-9.6 4-9.6 8.8v17.6c0 4.8 4 8.8 9.6 8.8zM227.2 756.8h38.4v36h-38.4zM717.6 793.6h76.8c5.6 0 9.6-4 9.6-8.8v-17.6c0-4.8-4.8-8.8-9.6-8.8h-76.8c-5.6 0-9.6 4-9.6 8.8v17.6c0 4.8 4 8.8 9.6 8.8zM457.6 491.2h38.4v36h-38.4zM457.6 756.8h38.4v36h-38.4zM304 756.8h38.4v36h-38.4zM380.8 756.8h38.4v36h-38.4zM380.8 224.8h38.4v36h-38.4zM380.8 491.2h38.4v36h-38.4zM457.6 224.8h38.4v36h-38.4zM227.2 224.8h38.4v36h-38.4zM304 224.8h38.4v36h-38.4zM304 491.2h38.4v36h-38.4zM227.2 491.2h38.4v36h-38.4zM717.6 261.6h76.8c5.6 0 9.6-4 9.6-8.8v-16.8c0-4.8-4.8-8.8-9.6-8.8h-76.8c-5.6 0-9.6 4-9.6 8.8v17.6c0 4.8 4 8 9.6 8z" fill="#7E7E7E" ></path>'+""+"</symbol>"+""+'<symbol id="icon-service3" viewBox="0 0 1024 1024">'+""+'<path d="M641.6 583.2h48.8c3.2 0 6.4-2.4 6.4-5.6v-11.2c0-3.2-2.4-5.6-6.4-5.6h-48.8c-3.2 0-6.4 2.4-6.4 5.6v11.2c0 2.4 2.4 5.6 6.4 5.6zM398.4 560h23.2v23.2h-23.2zM445.6 560h23.2v23.2h-23.2zM492 560.8h23.2v23.2h-23.2zM728.8 673.6h-408c-28 0-36.8 14.4-36.8 32.8v71.2c0 27.2 14.4 32.8 36.8 32.8h408c22.4 0 36.8-11.2 36.8-32.8v-71.2c-0.8-23.2-10.4-32.8-36.8-32.8z m4.8 104.8h-416v-72.8h416v72.8z" fill="#7E7E7E" ></path>'+""+'<path d="M641.6 755.2h48.8c3.2 0 6.4-2.4 6.4-5.6v-11.2c0-3.2-2.4-5.6-6.4-5.6h-48.8c-3.2 0-6.4 2.4-6.4 5.6v11.2c0 2.4 2.4 5.6 6.4 5.6zM398.4 732h23.2v23.2h-23.2zM492 732.8h23.2v23.2h-23.2zM445.6 732h23.2v23.2h-23.2zM352 732h23.2v23.2h-23.2zM398.4 388h23.2v23.2h-23.2zM352 560h23.2v23.2h-23.2zM352 388h23.2v23.2h-23.2z" fill="#7E7E7E" ></path>'+""+'<path d="M728.8 330.4h-408c-28 0-36.8 14.4-36.8 32.8v71.2c0 27.2 14.4 32.8 36.8 32.8h408c22.4 0 36.8-11.2 36.8-32.8v-71.2c-0.8-23.2-10.4-32.8-36.8-32.8z m4.8 104.8h-416v-72.8h416v72.8z" fill="#7E7E7E" ></path>'+""+'<path d="M846.4 400.8c0-4.8 0.8-9.6 0.8-14.4 0-138.4-112.8-250.4-252-250.4-86.4 0-162.4 43.2-208 109.6-14.4-3.2-28.8-5.6-44-5.6-104 0-188.8 84-188.8 188 0 16.8 2.4 33.6 7.2 49.6-88.8 24.8-153.6 104.8-153.6 200.8 0 115.2 93.6 208.8 209.6 208.8h545.6c139.2 0 252-112 252-250.4-0.8-108.8-71.2-201.6-168.8-236z m124 264.8c-0.8 4.8-0.8 8.8-2.4 13.6-0.8 3.2-1.6 6.4-2.4 8.8-0.8 4-1.6 7.2-3.2 11.2-1.6 4-2.4 8-4 11.2-0.8 2.4-1.6 5.6-3.2 8-1.6 4-4 8-5.6 12.8-0.8 1.6-1.6 4-3.2 5.6-2.4 4.8-5.6 9.6-8.8 14.4-0.8 0.8-0.8 2.4-1.6 3.2-3.2 4.8-7.2 9.6-10.4 13.6-0.8 0.8-0.8 1.6-1.6 2.4-4 4.8-8.8 9.6-12.8 14.4l-0.8 0.8c-37.6 37.6-90.4 60.8-148 60.8h-545.6c-92.8 0-168-75.2-168-167.2 0-8.8 0.8-17.6 2.4-26.4 0-1.6 0.8-3.2 0.8-4 1.6-8 4-16 6.4-24 0.8-1.6 0.8-2.4 1.6-4 3.2-8 6.4-15.2 10.4-23.2s9.6-15.2 14.4-21.6l0.8-0.8c5.6-7.2 11.2-12.8 17.6-19.2l0.8-0.8c20-18.4 44.8-31.2 72-38.4 12.8-3.2 26.4-4.8 40.8-4.8h6.4c-8.8-12.8-16.8-26.4-21.6-41.6-1.6-5.6-3.2-12-4-18.4 0-1.6-0.8-3.2-0.8-4-0.8-6.4-1.6-12.8-1.6-20 0-80.8 65.6-146.4 147.2-146.4 22.4 0 44 4.8 63.2 14.4 20-40.8 52.8-74.4 92.8-95.2 0.8-0.8 2.4-0.8 3.2-1.6l16.8-7.2c2.4-0.8 4-1.6 6.4-2.4 4.8-1.6 10.4-3.2 15.2-4.8 2.4-0.8 4.8-1.6 7.2-1.6 5.6-1.6 10.4-2.4 16-3.2 2.4 0 4.8-0.8 7.2-0.8 8-0.8 15.2-1.6 23.2-1.6 116 0 209.6 93.6 209.6 208.8 0 15.2-1.6 30.4-4.8 44.8 14.4 2.4 27.2 6.4 40.8 11.2 9.6 4 18.4 8 28 13.6 0 0 0.8 0 0.8 0.8 17.6 10.4 32.8 22.4 46.4 36.8l2.4 2.4c6.4 7.2 12.8 14.4 17.6 22.4l0.8 0.8c5.6 8 10.4 16 14.4 24l2.4 4.8c4 8 7.2 16.8 10.4 24.8 0 0.8 0 0.8 0.8 1.6 3.2 8.8 4.8 18.4 6.4 27.2 0 2.4 0.8 4.8 0.8 6.4 1.6 9.6 2.4 19.2 2.4 28.8 0 7.2 0 14.4-0.8 21.6-0.8 2.4-0.8 4.8-1.6 7.2z" fill="#7E7E7E" ></path>'+""+'<path d="M728.8 501.6h-408c-28 0-36.8 14.4-36.8 32.8v71.2c0 27.2 14.4 32.8 36.8 32.8h408c22.4 0 36.8-11.2 36.8-32.8v-71.2c-0.8-23.2-10.4-32.8-36.8-32.8z m4.8 104.8h-416v-72.8h416v72.8zM445.6 388h23.2v23.2h-23.2zM492 388.8h23.2v23.2h-23.2zM641.6 411.2h48.8c3.2 0 6.4-2.4 6.4-5.6v-11.2c0-3.2-2.4-5.6-6.4-5.6h-48.8c-3.2 0-6.4 2.4-6.4 5.6v11.2c0 2.4 2.4 5.6 6.4 5.6z" fill="#7E7E7E" ></path>'+""+"</symbol>"+""+'<symbol id="icon-service4" viewBox="0 0 1024 1024">'+""+'<path d="M390.4 648.8h205.6v68H390.4zM391.2 465.6h423.2v71.2H391.2zM222.4 465.6h74.4v71.2h-74.4zM222.4 648.8h74.4V720h-74.4z" fill="#7D7D7E" ></path>'+""+'<path d="M937.6 126.4H86.4c-16.8 0-30.4 13.6-30.4 29.6v736c0 16.8 13.6 29.6 30.4 29.6h452.8c16.8 0 30.4-13.6 30.4-29.6s-13.6-29.6-30.4-29.6H116V185.6h791.2v372c0 16.8 13.6 29.6 30.4 29.6s30.4-13.6 30.4-29.6V156c0-16.8-13.6-29.6-30.4-29.6z" fill="#7D7D7E" ></path>'+""+'<path d="M222.4 288.8h74.4V360h-74.4zM391.2 288.8h423.2V360H391.2zM942.4 671.2c-7.2 0-12.8 2.4-17.6 7.2l-0.8 0.8L740.8 856l-73.6-71.2c-4.8-4.8-11.2-7.2-18.4-7.2-13.6 0-25.6 11.2-25.6 24.8 0 6.4 3.2 12.8 7.2 17.6l73.6 71.2-0.8 0.8 36 34.4 0.8-0.8 0.8 0.8 36-34.4-0.8-0.8 184-177.6c4-4.8 7.2-10.4 7.2-16.8 0.8-14.4-10.4-25.6-24.8-25.6z" fill="#7D7D7E" ></path>'+""+"</symbol>"+""+"</svg>";var script=function(){var scripts=document.getElementsByTagName("script");return scripts[scripts.length-1]}();var shouldInjectCss=script.getAttribute("data-injectcss");var ready=function(fn){if(document.addEventListener){if(~["complete","loaded","interactive"].indexOf(document.readyState)){setTimeout(fn,0)}else{var loadFn=function(){document.removeEventListener("DOMContentLoaded",loadFn,false);fn()};document.addEventListener("DOMContentLoaded",loadFn,false)}}else if(document.attachEvent){IEContentLoaded(window,fn)}function IEContentLoaded(w,fn){var d=w.document,done=false,init=function(){if(!done){done=true;fn()}};var polling=function(){try{d.documentElement.doScroll("left")}catch(e){setTimeout(polling,50);return}init()};polling();d.onreadystatechange=function(){if(d.readyState=="complete"){d.onreadystatechange=null;init()}}}};var before=function(el,target){target.parentNode.insertBefore(el,target)};var prepend=function(el,target){if(target.firstChild){before(el,target.firstChild)}else{target.appendChild(el)}};function appendSvg(){var div,svg;div=document.createElement("div");div.innerHTML=svgSprite;svgSprite=null;svg=div.getElementsByTagName("svg")[0];if(svg){svg.setAttribute("aria-hidden","true");svg.style.position="absolute";svg.style.width=0;svg.style.height=0;svg.style.overflow="hidden";prepend(svg,document.body)}}if(shouldInjectCss&&!window.__iconfont__svg__cssinject__){window.__iconfont__svg__cssinject__=true;try{document.write("<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>")}catch(e){console&&console.log(e)}}ready(appendSvg)})(window) \ No newline at end of file diff --git a/cyclone-web/vendor/iconfont/iconfont.svg b/cyclone-web/vendor/iconfont/iconfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..7e8f7b887961fb034e4e2bd2b0bb0ffc1ac0085b --- /dev/null +++ b/cyclone-web/vendor/iconfont/iconfont.svg @@ -0,0 +1,133 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +Created by FontForge 20120731 at Mon Jul 3 14:27:09 2017 + By admin +</metadata> +<defs> +<font id="iconfont" horiz-adv-x="1024" > + <font-face + font-family="iconfont" + font-weight="500" + font-stretch="normal" + units-per-em="1024" + panose-1="2 0 6 3 0 0 0 0 0 0" + ascent="896" + descent="-128" + x-height="792" + bbox="0 -146 1165.12 896" + underline-thickness="0" + underline-position="0" + unicode-range="U+0078-E7AF" + /> +<missing-glyph + /> + <glyph glyph-name=".notdef" + /> + <glyph glyph-name=".notdef" + /> + <glyph glyph-name=".null" horiz-adv-x="0" + /> + <glyph glyph-name="nonmarkingreturn" horiz-adv-x="341" + /> + <glyph glyph-name="x" unicode="x" horiz-adv-x="1001" +d="M281 543q-27 -1 -53 -1h-83q-18 0 -36.5 -6t-32.5 -18.5t-23 -32t-9 -45.5v-76h912v41q0 16 -0.5 30t-0.5 18q0 13 -5 29t-17 29.5t-31.5 22.5t-49.5 9h-133v-97h-438v97zM955 310v-52q0 -23 0.5 -52t0.5 -58t-10.5 -47.5t-26 -30t-33 -16t-31.5 -4.5q-14 -1 -29.5 -0.5 +t-29.5 0.5h-32l-45 128h-439l-44 -128h-29h-34q-20 0 -45 1q-25 0 -41 9.5t-25.5 23t-13.5 29.5t-4 30v167h911zM163 247q-12 0 -21 -8.5t-9 -21.5t9 -21.5t21 -8.5q13 0 22 8.5t9 21.5t-9 21.5t-22 8.5zM316 123q-8 -26 -14 -48q-5 -19 -10.5 -37t-7.5 -25t-3 -15t1 -14.5 +t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q-5 19 -11 39h-368zM336 498v228q0 11 2.5 23t10 21.5t20.5 15.5t34 6h188q31 0 51.5 -14.5t20.5 -52.5v-227h-327z" /> + <glyph glyph-name="power" unicode="&#xe62c;" +d="M822 636q-21 22 -51.5 22t-52 -22t-21.5 -53.5t22 -53.5q86 -88 86 -212q0 -125 -86 -213q-54 -56 -130.5 -76t-153 0t-130.5 76q-86 88 -86 213q0 124 86 212q22 22 22 53.5t-21.5 53.5t-52 22t-51.5 -22q-62 -64 -95.5 -146.5t-33.5 -173t33.5 -173t95.5 -146.5 +t142 -98t168 -34t168 34t142 98t95.5 146.5t33.5 173t-33.5 173t-95.5 146.5zM512 223q30 0 51.5 21.5t21.5 51.5v439q0 30 -21.5 51.5t-51.5 21.5t-51.5 -21.5t-21.5 -51.5v-439q0 -30 21.5 -51.5t51.5 -21.5z" /> + <glyph glyph-name="alert" unicode="&#xe61c;" +d="M1008 -74q0 -35 -24.5 -53.5t-60.5 -18.5h-822q-36 0 -60.5 19t-24.5 53q0 26 16 54l411 717q29 49 69.5 49t67.5 -49l412 -718q16 -28 16 -53zM574 381v130h-124v-130q0 -12 2 -24q2 -10 5 -24q3 -13 5 -24l23 -145h52l24 145q2 9 5.5 23t5.5 25.5t2 23.5zM556 -8 +q18 18 18 44t-18.5 44t-43.5 18t-43.5 -18t-18.5 -44t18.5 -44t43.5 -18q26 0 44 18z" /> + <glyph glyph-name="artboard6" unicode="&#xe60a;" +d="M784 264l-150 87v-190h-221l-30 30l357 325h93v253h-249v-117h-186q-7 74 -63 123q-52 44 -117 44q-76 0 -129 -54t-53 -130v-3q0 -31 12 -64q19 -53 65.5 -86.5t104.5 -33.5q65 0 117 45q36 31 52 75q6 17 9 33h188v-85h81l-317 -289l-88 89l-176 -178l176 -178l148 151 +h226v-195l373 217zM349 632q0 -14 -3 -31q-4 -14 -11 -29q-1 -1 -2 -4q-18 -31 -48.5 -50t-67 -19t-67 19t-48.5 50q-17 31 -17 64v3q0 55 39 94.5t94 39.5q37 0 68.5 -20.5t48.5 -53.5q10 -20 13 -43q1 -13 1 -17v-3zM685 111v152l222 -130l-222 -130v108z" /> + <glyph glyph-name="relation" unicode="&#xe6d8;" +d="M804.5 896q-93.5 0 -156.5 -63t-63 -156q0 -54 25.5 -102t69.5 -81l-124 -264q-15 8 -44 8q-61 0 -110 -37l-124 117q15 44 15 66q0 60 -43 103t-103.5 43t-103.5 -43t-43 -103t43 -103t103 -43q48 0 81 22l124 -117q-29 -59 -29 -95q5 -73 59.5 -124.5t130.5 -51.5 +q77 0 130 53t53 130q0 85 -73 146l124 263q11 0 29.5 -3.5t29.5 -3.5q93 0 156 63t63 156.5t-63 156.5t-156.5 63z" /> + <glyph glyph-name="appcenter" unicode="&#xe792;" +d="M119 763h283v-291h-283v291zM976 607l-239 245l-240 -245l240 -245zM737 755l146 -150l-146 -150l-146 150zM119 283h283v-290h-283v290zM594 283h284v-290h-284v290z" /> + <glyph glyph-name="approval" unicode="&#xe793;" +d="M927 256h-335v115q67 25 108 83.5t41 130.5q0 95 -67.5 163t-163.5 68t-163 -67.5t-67 -163.5q0 -73 41 -131.5t107 -82.5v-115h-335v-133h830v133h4zM391 587q0 50 35.5 85.5t85.5 35.5t85.5 -35.5t35.5 -85.5q0 -51 -35 -86t-86 -35q-49 0 -85 36t-36 85zM97 38h830 +v-45h-830v45z" /> + <glyph glyph-name="dashbord" unicode="&#xe794;" +d="M898 507v268h-285l-92 86l-483 -451l13 -13l13 -13l9 -9l13 -13l13 -13l47 44v-472h317v251h120v-251h317v470l49 -47l13 13l13 12l9 10l13 12l12 13zM816 351v0v-344h-154v251h-285v-251h-154v467l296 276l297 -276v-123zM699 693h117v-110z" /> + <glyph glyph-name="beforeconf" unicode="&#xe795;" +d="M433 578q49 0 89 -28t58 -73h146l122 68l-71 121l-113 -64l-4 5q-30 36 -58 55l-4 4l40 142l-135 33l-37 -128h-5q-8 0 -9 2q-3 0 -8 1t-7 1q-23 0 -53 -6l-5 -2l-70 130l-119 -73l62 -117l-5 -4q-24 -19 -51 -58l-4 -4l-141 42l-33 -137l125 -38v-6q0 -7 -2 -11 +q0 -2 -1 -7t-1 -7q0 -23 5 -53l2 -6l-128 -71l72 -121l113 64l4 -5q29 -36 58 -55l4 -2l80 112q-35 22 -55 58t-20 79q2 66 48 112.5t111 46.5zM794 384h-337v-91h474v91h-137zM891 219h-434v-91h474v91h-31h-9zM720 73h-263v-91h474v91h-196h-15z" /> + <glyph glyph-name="confmanagement" unicode="&#xe796;" +d="M971 188v97h-53q-6 36 -33 86l38 39l-67 67l-39 -38q-30 25 -86 35v51h-95v-53q-26 -5 -86 -35l-38 38l-68 -67l39 -39q-29 -46 -33 -86h-53v-96h53q5 -26 33 -86l-39 -35l68 -68l38 39q30 -26 86 -35v-53h95v49q27 5 86 35l39 -38l67 67l-38 39q29 46 33 86h53v1z +M684 91q-58 0 -101.5 43.5t-43.5 101.5q0 61 43 102.5t102 41.5q61 0 102.5 -41.5t41.5 -102.5q0 -59 -41.5 -102t-102.5 -43zM137 753h651v-232h66v300h-785v-816h366v68h-298v680zM229 627h466v-67h-466v67zM229 450h171v-68h-171v68zM229 283h109v-65h-109v65z" /> + <glyph glyph-name="implement" unicode="&#xe797;" +d="M839 196q-35 34 -73.5 55t-63.5 21l-121 101l88 84q56 -23 112 -12.5t99 51.5q35 39 47.5 88.5t-0.5 93.5l-137 -129l-130 122l137 130q-49 11 -99.5 -0.5t-84.5 -45.5q-43 -39 -54 -96t13 -103l-98 -93l-48 40l-7 -7l-145 137l-16 -11l24 18l-41 53l-73 53l-40 -38 +l57 -70l47 -38l9 7l152 -137l-24 -24l41 -46l-324 -307l97 -98l318 303l101 -111q-6 -24 14.5 -64.5t58.5 -82.5q51 -49 120 -69l8 -8v8q33 0 40 7l57 53q11 5 13.5 15t2.5 31q-19 64 -77 119z" /> + <glyph glyph-name="idcstore" unicode="&#xe798;" +d="M958 488q0 8 -5 17l-2 5l-106 284h-668l-104 -280q0 -2 -2 -4v-2l-3 -11l-1 -3.5t-1 -5.5q-6 -19 -6 -35q0 -45 24.5 -82.5t63.5 -52.5v-347h733v353q36 19 56.5 53.5t20.5 75.5q3 12 0 35zM812 49h-591v264q49 8 81 45q39 -47 102 -47q61 0 103 47q39 -47 102 -47 +q61 0 102 47q27 -32 68 -43h2q2 0 4.5 -1t4.5 -1h13v-264h9zM841 389q-2 0 -5 -0.5t-4 -0.5h-9q-9 0 -13 1q-1 0 -3 1l-2 1l-4 2h-2q-18 7 -29.5 23.5t-12.5 36.5v6q0 17 -11 26q-11 11 -26 11q-14 0 -24 -11t-10 -26v-6q-3 -42 -42 -60q-2 0 -4 -2q-4 -2 -9 -2 +q-2 0 -6.5 -0.5t-6.5 -0.5q-9 0 -13 1q-1 0 -2.5 1t-2.5 1l-4 2h-2q-18 7 -29 23.5t-13 36.5v2v4q0 17 -11 26q-11 11 -25 11q-15 0 -25 -11t-10 -26v-6q-3 -42 -42 -60q-2 0 -4 -2q-3 -2 -9 -2q-2 0 -6.5 -0.5t-6.5 -0.5q-9 0 -13 1l-2 1t-3 1t-3 1t-3 1h-1 +q-18 7 -29.5 23.5t-12.5 36.5v6q0 15 -10 26t-25 12q-15 0 -25 -10.5t-10 -25.5v-6q-3 -42 -42 -60q-2 0 -4 -2q-3 -2 -9 -2q-2 0 -6.5 -1t-6.5 -1h-7h-7q-24 5 -39.5 25t-15.5 45q0 13 4 20v2v2l89 239h567l88 -234l2 -5v-4q3 -15 3 -20q-2 -25 -16 -44t-35 -26z" /> + <glyph glyph-name="logicarch" unicode="&#xe799;" +d="M922 210h-48v190h-331v117h130v304h-335v-304h139v-117h-331v-190h-108v-269h282v267h-113v-16v148h609v-130h-116v-269h282v269h-60zM258 148v-146h-161v146h161zM920 2h-161v146h161v-146z" /> + <glyph glyph-name="info" unicode="&#xe79a;" +d="M645 126q-12 3 -28.5 -14.5t-30.5 -40t-34.5 -38t-39.5 -9.5h-9q10 106 65 289.5t68 249.5h-9q-38 -13 -133.5 -22.5t-133.5 -23.5v-18q21 0 36.5 -2.5t24.5 -8.5t15 -12t6.5 -17.5t0 -19.5t-5 -23t-8 -24t-10.5 -26q-1 -4 -2 -6q-9 -32 -31.5 -100t-36.5 -118.5 +t-18 -88.5q-6 -59 25.5 -90t80.5 -31q51 0 97 38t75 83q8 -2 30 25q35 41 6 48zM598 841q-38 0 -66.5 -26t-28.5 -67q0 -36 27 -64.5t68 -28.5q37 0 66 26t29 67q0 35 -29.5 64t-65.5 29z" /> + <glyph glyph-name="projectmanagement" unicode="&#xe79b;" +d="M37 243h237v-110h-237v110zM37 528v-109h307q3 3 3 7v102h-310zM37 786h731v-109h-731v109zM973 225v77l-90 14q-9 36 -24 61l52 75l-53 53l-74 -53q-30 18 -60 25l-15 90h-74l-15 -90q-30 -7 -60 -25l-74 53l-49 -50l-4 -3l4 -6l48 -67q-18 -31 -26 -61l-88 -14v-77 +l88 -17q8 -30 26 -60l-52 -73l53 -55l74 53q30 -18 60 -26l15 -89h74l17 89q27 7 58 26l74 -53l53 55l-53 75q19 31 23 60zM775 243q-7 -37 -35.5 -62.5t-66.5 -25.5t-67 25.5t-35 62.5q-2 6 -2 20q0 44 30.5 75t73.5 31q44 0 74 -31t30 -75q0 -14 -2 -20z" /> + <glyph glyph-name="deployarch" unicode="&#xe79c;" +d="M395 484.5q59 60.5 59 144.5t-59 144.5t-142.5 60.5t-142.5 -60.5t-59 -144.5t59 -144q60 -61 143 -61t142 60.5zM146 737q44 45 106.5 45t107.5 -45q44 -45 44 -108.5t-44 -107.5q-44 -45 -106 -45t-108 45q-44 44 -44 107.5t44 108.5zM933 484.5q59 60.5 59 144.5 +t-59 144.5t-143 60.5t-143 -60.5t-59 -144.5t59 -144q61 -61 144 -61t142 60.5zM720 700q29 31 71 31t72 -31q29 -30 29 -72t-29 -72t-70.5 -30t-72 30t-30.5 72t30 72zM607 -48h371v377h-371v-377zM678 254h227v-228h-227v228zM31 139l218 -219l217 219l-217 221z" /> + <glyph glyph-name="reportmanagement" unicode="&#xe79d;" +d="M814 280h-216v-42h216v42zM814 410h-216v-42h216v42zM814 539h-216v-42h216v42zM550 759v84h-82v-84h-431v-132h43v-517h341l-205 -176l35 -42l256 207h1l256 -207l35 42l-205 176h348v517h45v132h-437zM900 154l-779 -2v475h779v-473zM364 236q58 0 94 38t36 94h-130 +v-132zM322 280v133h135q0 54 -41 97.5t-98 43.5q-59 0 -100.5 -41t-41.5 -100q0 -60 36.5 -96.5t109.5 -36.5z" /> + <glyph glyph-name="resoucepool" unicode="&#xe79e;" +d="M750 435l-222 -128v-256l222 -128l221 128v256zM750 371l139 -80l-141 -81l-139 81zM722 163v-161l-139 80v161zM777 2v161l139 80v-161zM38 307v-256l222 -128l221 128v256l-221 128zM260 371l139 -80l-141 -81l-139 81zM234 163v-161l-139 80v161zM287 2v161l139 80 +v-161zM726 724l-221 128l-222 -128v-256l222 -128l221 128v256zM505 788l139 -80l-141 -81l-139 81zM479 580v-161l-139 80v161zM532 419v161l139 80v-161z" /> + <glyph glyph-name="sysmanagement" unicode="&#xe79f;" +d="M402 761l-42 82h-287v-817h274v82h-192v569h659v-106h82v190h-494zM649 86q-70 0 -122.5 52t-52.5 123q0 74 52 125t123 51q75 0 125.5 -50t50.5 -126q-2 -71 -52.5 -123t-123.5 -52zM872 410l42 42l-75 75l-42 -42q-37 29 -97 38v57h-106v-59q-30 -5 -97 -38l-42 42 +l-75 -75l42 -42q-32 -54 -38 -95h-59v-106h59q5 -33 38 -95l-42 -39l75 -73l42 42q38 -30 97 -38v-59h106v53q31 5 97 39l42 -42l75 74l-42 43q32 53 39 95h58v106h-58q-7 47 -39 97z" /> + <glyph glyph-name="routinginspection" unicode="&#xe7a0;" +d="M541 38h-263v-73h455v73h-126h-66zM73 805v-697h872v697h-872zM874 183h-730v548h730v-548zM457 510l123 -283l111 258h106v75h-152l-65 -150l-116 265l-140 -260h-101v-75h143z" /> + <glyph glyph-name="serviceflow" unicode="&#xe7a1;" +d="M106 830v-249h315v99h480v-270h-312v98h-313v-98h-203v-372h554v-98h313v247h-313v-99h-504v272h153v-100h313v100h362v370h-530v100h-315z" /> + <glyph glyph-name="serviceindex" unicode="&#xe7a2;" +d="M82 135h114v-115h-114v115zM82 433h114v-115h-114v115zM82 750h114v-115h-114v115zM324 135h609v-115h-609v115zM324 750h609v-115h-609v115zM324 433h609v-115h-609v115z" /> + <glyph glyph-name="cloudboot" unicode="&#xe603;" horiz-adv-x="1187" +d="M1164 337q-8 82 -66 137t-139 57q-10 0 -14 3.5t-4 14.5q-2 139 -104 233q-58 53 -132.5 71.5t-144 4t-130 -62t-91.5 -119.5q-6 -14 -14 -19t-23 -6q-105 -9 -176.5 -88t-72.5 -190q1 -62 31 -120q7 -14 20 -20.5t27 -3.5t24 14.5t11 26.5q0 12 -7 27q-26 55 -17 111 +q20 110 120 146q103 36 187 -39q16 -14 33.5 -14t30.5 15q14 15 12 33t-18 33q-57 52 -133 67q34 -9 38.5 -8.5t8.5 7.5q68 127 203 127q141 1 205 -127q59 -117 -15 -234q-12 -18 -9 -36.5t19 -28.5q17 -11 35 -5.5t30 24.5q23 38 30 59q5 14 23 16q74 5 114 -55 +q40 -61 9 -126q-11 -24 -40 -48q-17 -13 -17 -34q0 -16 10 -28q11 -14 28.5 -17t31.5 8q97 78 86 194v0zM246 136h679q20 0 27.5 7t7.5 27v116q0 20 -7 27t-28 7h-681q-18 0 -25 -7t-7 -25v-118q0 -20 7 -27t27 -7zM687 258h190q16 0 26 -9.5t10 -23.5q0 -15 -10.5 -24.5 +t-25.5 -9.5q-15 -1 -31 -1t-35.5 0.5t-29.5 0.5h-93q-17 0 -27 9t-10 24q-1 14 9.5 24t26.5 10v0zM513 263q14 0 24.5 -11t10.5 -25q1 -14 -10 -25t-25 -11.5t-24.5 10.5t-10.5 26t10 25.5t25 10.5zM403 263q15 0 25 -10t10 -25q1 -14 -9 -25.5t-24 -11.5q-15 -1 -26 10 +t-11 26q0 14 10.5 25t24.5 11zM294 263q14 0 24.5 -10.5t10.5 -25.5q0 -14 -11 -25.5t-25 -10.5q-14 0 -24 11t-10 25q0 15 10 25.5t25 10.5zM931 88h-690q-15 0 -22 -7t-7 -23v-118q0 -21 7 -28.5t28 -7.5h680q18 0 25 7t7 25q1 62 0 123q1 29 -28 29v0zM294 -41 +q-14 0 -24.5 11t-10.5 25q0 15 9.5 25.5t24.5 10.5q14 1 25 -9.5t11 -24.5q1 -15 -10 -26.5t-25 -11.5zM403 -41q-14 0 -25 11.5t-10 26.5q0 14 10.5 24t25.5 10v0q15 0 25 -10.5t9 -25.5q0 -15 -10.5 -25.5t-24.5 -10.5v0zM513 -41q-14 0 -24.5 10.5t-10.5 25.5q0 16 10 26 +t25 10q14 0 24.5 -10.5t10.5 -24.5q1 -14 -10 -25.5t-25 -11.5v0zM874 -41h-186q-17 0 -27.5 9.5t-10.5 24.5q1 15 11 24t27 9q93 1 187 0q17 0 27.5 -9.5t10.5 -24.5t-11 -24t-28 -9z" /> + <glyph glyph-name="service" unicode="&#xe7ab;" +d="M795 561q-43 75 -118 119t-163 44q-111 0 -198 -68t-114 -175q-82 -12 -136.5 -74.5t-54.5 -145.5q0 -93 66 -158t158 -65h519q109 0 186.5 77t77.5 186q0 98 -63.5 172t-159.5 88zM754 86h-519q-72 0 -124 51.5t-52 123.5q0 62 39 109.5t98 59.5h48l6 44q26 90 99 146 +t166 56q78 0 143.5 -40.5t100.5 -108.5l6 -11l13 -2q81 -8 136.5 -69t55.5 -144q0 -89 -63.5 -152t-152.5 -63z" /> + <glyph glyph-name="service1" unicode="&#xe7ac;" +d="M422.5 436q-59.5 0 -101.5 -42t-42 -101.5t42 -101t101.5 -41.5t101.5 41.5t42 101t-42 101.5t-101.5 42zM422.5 194q-41.5 0 -71 29t-29.5 70.5t29.5 71t71 29.5t70.5 -29.5t29 -71t-29 -70.5t-70.5 -29zM909 482l2 5l74 31v85l-74 31l-1 5q-6 15 -9 21l-3 5l2 5l28 70 +l-60 60l-74 -30l-5 3q-7 3 -20 8l-5 1l-2 5l-31 69h-84l-32 -74l-5 -1q-12 -5 -19 -8l-5 -3l-5 2l-70 27l-59 -59l25 -63h-110l-41 -96l-7 -3q-8 -2 -24 -10l-6 -3l-97 38l-78 -78l38 -97l-3 -6q-5 -11 -11 -25l-2 -7l-96 -41v-111l96 -41l2 -7q4 -11 11 -24l3 -6l-38 -97 +l78 -78l97 38l6 -3q10 -5 25 -10l6 -3l41 -95h111l41 95l7 3q16 6 25 10l7 3l96 -39l78 78l-38 96l3 7q8 17 11 26l2 7l96 40v110l63 -26l60 60l-30 75l3 5q0 2 7 20zM758 268l-88 -37l-3 -10q-7 -25 -21 -51l-5 -9l35 -88l-34 -35l-88 36l-9 -6q-25 -13 -51 -21l-10 -3 +l-37 -87h-48l-37 87l-10 3q-29 10 -50 20l-9 6l-88 -35l-35 34l35 88l-6 10q-13 25 -20 48l-3 11l-87 38v49l87 38l3 11q9 27 20 49l6 9l-35 88l35 35l88 -36l9 6q21 12 49 20l11 3l38 87h49l37 -87l11 -3q30 -10 49 -21l10 -5l87 35l35 -35l-36 -88l6 -9q13 -25 21 -51 +l3 -10l87 -37v-47h-1zM887 390l-27 -28l-68 28l-7 -4q-17 -10 -30 -13l-4 -2l-41 18l-2 6q-8 21 -10 26l-4 6l40 96l-79 79l-96 -39l-6 3q-8 4 -26 11l-6 2l-19 43l2 4q2 6 12 28l4 8l-27 68l27 28l69 -28l7 4q21 11 38 16l8 2l30 68h39l30 -68l8 -2q21 -7 38 -16l7 -4 +l68 27l28 -27l-28 -68l4 -8q10 -17 16 -39l3 -8l67 -29v-39l-68 -29l-2 -8q-6 -17 -16 -39l-4 -7z" /> + <glyph glyph-name="service2" unicode="&#xe7ad;" +d="M900 199h-768q-68 0 -68 -62v-146q0 -36 17 -49.5t51 -13.5h768q32 0 50 16t18 46v146q0 34 -15.5 48.5t-52.5 14.5zM923 -30h-813v187h813v-187zM900 516h-768q-68 0 -68 -62v-146q0 -37 17 -49.5t51 -12.5h768q32 0 50 15.5t18 46.5v146q0 33 -16 47.5t-52 14.5z +M923 286h-813v188h813v-188zM900 832h-768q-68 0 -68 -62v-146q0 -37 17 -49.5t51 -12.5h768q32 0 50 15.5t18 46.5v146q0 33 -15.5 47.5t-52.5 14.5zM923 603h-813v187h813v-187zM718 368h76q10 0 10 9v17q0 4 -3 6.5t-7 2.5h-76q-10 0 -10 -9v-17q0 -9 10 -9zM227 139h39 +v-36h-39v36zM718 102h76q10 0 10 9v18q0 3 -3 6t-7 3h-76q-10 0 -10 -9v-18q0 -9 10 -9zM458 405h38v-36h-38v36zM458 139h38v-36h-38v36zM304 139h38v-36h-38v36zM381 139h38v-36h-38v36zM381 671h38v-36h-38v36zM381 405h38v-36h-38v36zM458 671h38v-36h-38v36zM227 671 +h39v-36h-39v36zM304 671h38v-36h-38v36zM304 405h38v-36h-38v36zM227 405h39v-36h-39v36zM718 634h76q10 0 10 9v17q0 4 -3 6.5t-7 2.5h-76q-10 0 -10 -9v-18q0 -8 10 -8z" /> + <glyph glyph-name="service3" unicode="&#xe7ae;" +d="M642 313h48q7 0 7 5v12q0 5 -7 5h-48q-7 0 -7 -5v-12q0 -5 7 -5zM398 336h24v-23h-24v23zM446 336h23v-23h-23v23zM492 335h23v-23h-23v23zM729 222h-408q-37 0 -37 -32v-72q0 -19 9 -25.5t28 -6.5h408q37 0 37 32v72q-1 17 -9.5 24.5t-27.5 7.5zM734 118h-416v72h416 +v-72zM642 141h48q7 0 7 5v12q0 5 -7 5h-48q-7 0 -7 -5v-12q0 -5 7 -5zM398 164h24v-23h-24v23zM492 163h23v-23h-23v23zM446 164h23v-23h-23v23zM352 164h23v-23h-23v23zM398 508h24v-23h-24v23zM352 336h23v-23h-23v23zM352 508h23v-23h-23v23zM729 566h-408q-37 0 -37 -33 +v-71q0 -20 9 -26.5t28 -6.5h408q37 0 37 33v71q-1 17 -9.5 25t-27.5 8zM734 461h-416v73h416v-73zM846 495q0 3 0.5 7.5t0.5 7.5q0 103 -73.5 176.5t-178.5 73.5q-64 0 -118.5 -29.5t-89.5 -80.5q-25 6 -44 6q-78 0 -133.5 -55t-55.5 -133q0 -26 8 -50q-68 -18 -111 -73.5 +t-43 -126.5q0 -87 61.5 -148t148.5 -61h545q105 0 178.5 73t73.5 177q0 81 -47 145.5t-122 90.5zM970 230q-2 -12 -2 -13q-2 -7 -2 -9q-2 -6 -4 -11q0 -2 -1.5 -6t-2.5 -5q-2 -7 -3 -8q0 -2 -2 -6t-3 -7q-3 -5 -4 -6q-2 -5 -8 -14q-1 -1 -1.5 -2l-0.5 -1q-2 -4 -10 -14 +q-1 0 -1.5 -1l-0.5 -1q-2 -3 -6.5 -7.5t-6.5 -7.5l-1 -1q-60 -60 -148 -60h-545q-70 0 -119 49t-49 118q0 13 2 26q0 1 0.5 2.5l0.5 1.5l6 24q1 1 1.5 2t0.5 2q5 12 10 23q4 8 15 22l1 1q5 7 17 19l1 1q30 27 72 38q19 5 41 5h6q-15 23 -21 42q-3 10 -4 18q0 1 -0.5 2.5 +l-0.5 1.5q-2 13 -2 20q0 61 43 103.5t104 42.5q35 0 64 -14q30 63 92 95q1 1 2 1t2 1l16 7q2 0 4 1t3 1q2 1 7.5 2.5t7.5 2.5q5 2 7 2q7 2 16 3q1 0 3.5 0.5t3.5 0.5q16 1 24 1q87 0 148 -61t61 -147q0 -24 -5 -45q18 -3 41 -11q17 -7 28 -14q1 0 1 -1q26 -15 46 -37l3 -2 +q13 -14 17 -22l1 -1q9 -12 15 -24l2 -5l10 -25q0 -1 1 -1q3 -8 7 -28v-3v-3q3 -14 3 -28.5t-1 -21.5q0 -2 -0.5 -4t-1.5 -4zM729 394h-408q-37 0 -37 -32v-72q0 -19 9 -25.5t28 -6.5h408q37 0 37 32v72q-1 17 -9.5 24.5t-27.5 7.5zM734 290h-416v72h416v-72zM446 508h23v-23 +h-23v23zM492 507h23v-23h-23v23zM642 485h48q7 0 7 5v12q0 5 -7 5h-48q-7 0 -7 -5v-12q0 -5 7 -5z" /> + <glyph glyph-name="service4" unicode="&#xe7af;" +d="M390 247h206v-68h-206v68zM391 430h423v-71h-423v71zM222 430h75v-71h-75v71zM222 247h75v-71h-75v71zM938 770h-852q-12 0 -21 -9t-9 -21v-736q0 -13 9 -21.5t21 -8.5h453q13 0 22 9t9 21t-9 21t-22 9h-423v676h791v-372q0 -12 9 -20.5t21.5 -8.5t21.5 8.5t9 20.5v402 +q0 13 -9 21.5t-21 8.5zM222 607h75v-71h-75v71zM391 607h423v-71h-423v71zM942 225q-10 0 -17 -7l-1 -1l-183 -177l-74 71q-7 7 -18 7q-10 0 -18 -7t-8 -17q0 -9 7 -18l74 -71l-1 -1l36 -34h1h1l36 34l-1 1l184 177q7 9 7 17q1 11 -6.5 18.5t-18.5 7.5z" /> + </font> +</defs></svg> diff --git a/cyclone-web/vendor/iconfont/iconfont.ttf b/cyclone-web/vendor/iconfont/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ed24fcad5ecca123c9ec2a740cff3ef5a6c196f3 Binary files /dev/null and b/cyclone-web/vendor/iconfont/iconfont.ttf differ diff --git a/cyclone-web/vendor/iconfont/iconfont.woff b/cyclone-web/vendor/iconfont/iconfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..e2766e209db799ea51fcd03fa00287cd6caa1fdd Binary files /dev/null and b/cyclone-web/vendor/iconfont/iconfont.woff differ diff --git a/cyclone-web/vendor/img/blueprint/icon_app.png b/cyclone-web/vendor/img/blueprint/icon_app.png new file mode 100644 index 0000000000000000000000000000000000000000..2331c69adef72142683c7c8aea83c371be9cb13e Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/icon_app.png differ diff --git a/cyclone-web/vendor/img/blueprint/icon_app_42.png b/cyclone-web/vendor/img/blueprint/icon_app_42.png new file mode 100644 index 0000000000000000000000000000000000000000..15227e7ecdf8771cc60ea92d72aa358a34b588b6 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/icon_app_42.png differ diff --git a/cyclone-web/vendor/img/blueprint/icon_application_42.png b/cyclone-web/vendor/img/blueprint/icon_application_42.png new file mode 100644 index 0000000000000000000000000000000000000000..348b70a274fa45f30c17e8bace04752ec0fce4cf Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/icon_application_42.png differ diff --git a/cyclone-web/vendor/img/blueprint/icon_db.png b/cyclone-web/vendor/img/blueprint/icon_db.png new file mode 100644 index 0000000000000000000000000000000000000000..688e4f859cda9e1d5dd8bfebda5621876e6fabcc Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/icon_db.png differ diff --git a/cyclone-web/vendor/img/blueprint/icon_db_42.png b/cyclone-web/vendor/img/blueprint/icon_db_42.png new file mode 100644 index 0000000000000000000000000000000000000000..7ce7bdceea1c7be5c7ee234be1bec817d5c1b604 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/icon_db_42.png differ diff --git a/cyclone-web/vendor/img/blueprint/icon_linux_42.png b/cyclone-web/vendor/img/blueprint/icon_linux_42.png new file mode 100644 index 0000000000000000000000000000000000000000..599f33deaa1829ef9d9fa5b3cadbc54683aa0055 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/icon_linux_42.png differ diff --git a/cyclone-web/vendor/img/blueprint/icon_pkg.jpg b/cyclone-web/vendor/img/blueprint/icon_pkg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0494c5a088c1d7d28364d483a2b294cdaddbd313 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/icon_pkg.jpg differ diff --git a/cyclone-web/vendor/img/blueprint/icon_service_42.png b/cyclone-web/vendor/img/blueprint/icon_service_42.png new file mode 100644 index 0000000000000000000000000000000000000000..6aefa32998e421b54e82e5a95d7ca88f06dc9502 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/icon_service_42.png differ diff --git a/cyclone-web/vendor/img/blueprint/icon_unix_42.png b/cyclone-web/vendor/img/blueprint/icon_unix_42.png new file mode 100644 index 0000000000000000000000000000000000000000..52881ab705ce34aa85f75ddcc315c9b8741e2fba Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/icon_unix_42.png differ diff --git a/cyclone-web/vendor/img/blueprint/icon_web.png b/cyclone-web/vendor/img/blueprint/icon_web.png new file mode 100644 index 0000000000000000000000000000000000000000..fb9bc7144d488d6da0189da3308078e9c6c6b1c1 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/icon_web.png differ diff --git a/cyclone-web/vendor/img/blueprint/icon_web_42.png b/cyclone-web/vendor/img/blueprint/icon_web_42.png new file mode 100644 index 0000000000000000000000000000000000000000..2919ac896171e03e06d907869af0b53cc90c35ed Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/icon_web_42.png differ diff --git a/cyclone-web/vendor/img/blueprint/icon_win_42.png b/cyclone-web/vendor/img/blueprint/icon_win_42.png new file mode 100644 index 0000000000000000000000000000000000000000..7d94dc7e7a81a8f548933dbf6e3c930d4672974e Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/icon_win_42.png differ diff --git a/cyclone-web/vendor/img/blueprint/icon_zoomin.png b/cyclone-web/vendor/img/blueprint/icon_zoomin.png new file mode 100644 index 0000000000000000000000000000000000000000..48e6b56304651383b41d471d31c4b11bf43e650e Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/icon_zoomin.png differ diff --git a/cyclone-web/vendor/img/blueprint/icon_zoomout.png b/cyclone-web/vendor/img/blueprint/icon_zoomout.png new file mode 100644 index 0000000000000000000000000000000000000000..58c303dceb2933ccb4cebd332a744cea0db8c676 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/icon_zoomout.png differ diff --git a/cyclone-web/vendor/img/blueprint/include.png b/cyclone-web/vendor/img/blueprint/include.png new file mode 100644 index 0000000000000000000000000000000000000000..57706afd241c7b85b67774e71ff43a05f3034a37 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/include.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic-new/app.png b/cyclone-web/vendor/img/blueprint/logic-new/app.png new file mode 100644 index 0000000000000000000000000000000000000000..a622b57222c8cf04c488d6ebab6cb676dfca198d Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic-new/app.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic-new/database-master-rac.png b/cyclone-web/vendor/img/blueprint/logic-new/database-master-rac.png new file mode 100644 index 0000000000000000000000000000000000000000..aa1b40b42e0ac37825254ccd3d143228b171456e Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic-new/database-master-rac.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic-new/database-master.png b/cyclone-web/vendor/img/blueprint/logic-new/database-master.png new file mode 100644 index 0000000000000000000000000000000000000000..36d5694101ba77f62db19d09dbb24d8b788c7782 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic-new/database-master.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic-new/database-merge-master-rac.png b/cyclone-web/vendor/img/blueprint/logic-new/database-merge-master-rac.png new file mode 100644 index 0000000000000000000000000000000000000000..df811a9ccc6b43ed2b5058b9834d66e138367ac9 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic-new/database-merge-master-rac.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic-new/database-merge-master.png b/cyclone-web/vendor/img/blueprint/logic-new/database-merge-master.png new file mode 100644 index 0000000000000000000000000000000000000000..7a7a5de16a029845163355f7fb2e78f290a696e1 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic-new/database-merge-master.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic-new/database-merge-slave.png b/cyclone-web/vendor/img/blueprint/logic-new/database-merge-slave.png new file mode 100644 index 0000000000000000000000000000000000000000..f1dec6e8228ce36622728f77cf89d03fb8b040ac Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic-new/database-merge-slave.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic-new/database-slave.png b/cyclone-web/vendor/img/blueprint/logic-new/database-slave.png new file mode 100644 index 0000000000000000000000000000000000000000..d02effc69dbced9f67937f700ef579983f6ad690 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic-new/database-slave.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic-new/inner-service.png b/cyclone-web/vendor/img/blueprint/logic-new/inner-service.png new file mode 100644 index 0000000000000000000000000000000000000000..23559661737a252c890e0efc59826b9cc0432c3a Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic-new/inner-service.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic-new/live-dpunit-master.png b/cyclone-web/vendor/img/blueprint/logic-new/live-dpunit-master.png new file mode 100644 index 0000000000000000000000000000000000000000..2e4268cfc9789b7a57183be72775b1d3d397b409 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic-new/live-dpunit-master.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic-new/no-mulit-live-dpunit-master-slave-slave.png b/cyclone-web/vendor/img/blueprint/logic-new/no-mulit-live-dpunit-master-slave-slave.png new file mode 100644 index 0000000000000000000000000000000000000000..f0764a01e318216456cef25ff01c84de5e68c3e2 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic-new/no-mulit-live-dpunit-master-slave-slave.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic-new/no-mulit-live-dpunit-master-slave.png b/cyclone-web/vendor/img/blueprint/logic-new/no-mulit-live-dpunit-master-slave.png new file mode 100644 index 0000000000000000000000000000000000000000..8d7a8af45f84142f836ce4906496dc7240d5805c Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic-new/no-mulit-live-dpunit-master-slave.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic-new/no-mulit-live-dpunit-slave.png b/cyclone-web/vendor/img/blueprint/logic-new/no-mulit-live-dpunit-slave.png new file mode 100644 index 0000000000000000000000000000000000000000..c25697b614f23d6718bb0991d5e2b28fefc7b1dc Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic-new/no-mulit-live-dpunit-slave.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic-new/outer-service.png b/cyclone-web/vendor/img/blueprint/logic-new/outer-service.png new file mode 100644 index 0000000000000000000000000000000000000000..fd1e822221107314c00e80342bd562b9b5bbb1e6 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic-new/outer-service.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic-new/server-icon.png b/cyclone-web/vendor/img/blueprint/logic-new/server-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a66a25e85118502d47b6d358d7f09bc8beb938d1 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic-new/server-icon.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic-new/share-storge-master.png b/cyclone-web/vendor/img/blueprint/logic-new/share-storge-master.png new file mode 100644 index 0000000000000000000000000000000000000000..ac3b86ad08151d05131b2515c8bfe978824e5def Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic-new/share-storge-master.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic-new/share-storge-slave.png b/cyclone-web/vendor/img/blueprint/logic-new/share-storge-slave.png new file mode 100644 index 0000000000000000000000000000000000000000..3dc8d6ef56c241ca5be787d03554844a931ff4c0 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic-new/share-storge-slave.png differ diff --git "a/cyclone-web/vendor/img/blueprint/logic-new/\351\200\232\350\277\207LB\350\256\277\351\227\256.png" "b/cyclone-web/vendor/img/blueprint/logic-new/\351\200\232\350\277\207LB\350\256\277\351\227\256.png" new file mode 100644 index 0000000000000000000000000000000000000000..0e83873f148270df0980208429905264406e64e4 Binary files /dev/null and "b/cyclone-web/vendor/img/blueprint/logic-new/\351\200\232\350\277\207LB\350\256\277\351\227\256.png" differ diff --git a/cyclone-web/vendor/img/blueprint/logic/app.png b/cyclone-web/vendor/img/blueprint/logic/app.png new file mode 100644 index 0000000000000000000000000000000000000000..90ac5da4db88319367cc8bfcabe7d964377fc5fb Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic/app.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic/appnode.png b/cyclone-web/vendor/img/blueprint/logic/appnode.png new file mode 100644 index 0000000000000000000000000000000000000000..4816e442f8aa8a73159a9f77a0553922c6540890 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic/appnode.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic/appservice.png b/cyclone-web/vendor/img/blueprint/logic/appservice.png new file mode 100644 index 0000000000000000000000000000000000000000..41deea7536eb093fb3dcf32824b0587708ec23d8 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic/appservice.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic/appservice_inner.png b/cyclone-web/vendor/img/blueprint/logic/appservice_inner.png new file mode 100644 index 0000000000000000000000000000000000000000..dcac25608a14fdd486e568e26c3be15fc25097ac Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic/appservice_inner.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic/appservice_out.png b/cyclone-web/vendor/img/blueprint/logic/appservice_out.png new file mode 100644 index 0000000000000000000000000000000000000000..30e99df5e1081a3a8627c2c6b8f9bf3b7c678fba Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic/appservice_out.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic/batchapp.png b/cyclone-web/vendor/img/blueprint/logic/batchapp.png new file mode 100644 index 0000000000000000000000000000000000000000..3e161f9954523481f16e178f1aa27434bd4056af Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic/batchapp.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic/batchnode.png b/cyclone-web/vendor/img/blueprint/logic/batchnode.png new file mode 100644 index 0000000000000000000000000000000000000000..844f10b3a67ca1a8460a58a553901c3422d75ff8 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic/batchnode.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic/cidefault.png b/cyclone-web/vendor/img/blueprint/logic/cidefault.png new file mode 100644 index 0000000000000000000000000000000000000000..786416f9a6deab3a97a239337bbeec4ee68dc805 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic/cidefault.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic/database.png b/cyclone-web/vendor/img/blueprint/logic/database.png new file mode 100644 index 0000000000000000000000000000000000000000..5d9ebc3403fa36747ca2221a6ac66d58a73bfc10 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic/database.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic/dbservice.png b/cyclone-web/vendor/img/blueprint/logic/dbservice.png new file mode 100644 index 0000000000000000000000000000000000000000..167173ecdc14270915ee94180a64b42ddd2caa7a Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic/dbservice.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic/externalservice.png b/cyclone-web/vendor/img/blueprint/logic/externalservice.png new file mode 100644 index 0000000000000000000000000000000000000000..43b9392951da695a566a29197593f268c05e2271 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic/externalservice.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic/firewall.png b/cyclone-web/vendor/img/blueprint/logic/firewall.png new file mode 100644 index 0000000000000000000000000000000000000000..f2b4ccac75ea4f8435f3a31480f34fc0699d5a7a Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic/firewall.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic/loadbalance.png b/cyclone-web/vendor/img/blueprint/logic/loadbalance.png new file mode 100644 index 0000000000000000000000000000000000000000..fd93200de1b2b9275f197295c6422c560ba8a1f5 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic/loadbalance.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic/logicnode.png b/cyclone-web/vendor/img/blueprint/logic/logicnode.png new file mode 100644 index 0000000000000000000000000000000000000000..d5d4eaec4c4bfb7f30556c2e11ea81a203281d39 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic/logicnode.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic/nat.png b/cyclone-web/vendor/img/blueprint/logic/nat.png new file mode 100644 index 0000000000000000000000000000000000000000..3a251abdbb1d9064a72541253161baae4cf9955a Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic/nat.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic/package.png b/cyclone-web/vendor/img/blueprint/logic/package.png new file mode 100644 index 0000000000000000000000000000000000000000..20b742a539102c39b28c1adbf7526c72fb886575 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic/package.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic/server.png b/cyclone-web/vendor/img/blueprint/logic/server.png new file mode 100644 index 0000000000000000000000000000000000000000..d5008638e6ed64514a353f933a329a992356a85f Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic/server.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic/servergroup.png b/cyclone-web/vendor/img/blueprint/logic/servergroup.png new file mode 100644 index 0000000000000000000000000000000000000000..ddbcf6f5104b163c080f6d6e282061c31344118d Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic/servergroup.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic/serverlinux.png b/cyclone-web/vendor/img/blueprint/logic/serverlinux.png new file mode 100644 index 0000000000000000000000000000000000000000..e6e0df92c5eb740abb1c7c2108998bfef0f5bce9 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic/serverlinux.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic/serverunix.png b/cyclone-web/vendor/img/blueprint/logic/serverunix.png new file mode 100644 index 0000000000000000000000000000000000000000..be8069fffd4438d54caa61d38cfe17e690da6d66 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic/serverunix.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic/serverwin.png b/cyclone-web/vendor/img/blueprint/logic/serverwin.png new file mode 100644 index 0000000000000000000000000000000000000000..80a41386354c3723186f9916e9606cddcbbbfea9 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic/serverwin.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic/serviceport.png b/cyclone-web/vendor/img/blueprint/logic/serviceport.png new file mode 100644 index 0000000000000000000000000000000000000000..270615fa0a2de73b1ba93a7b91fe4f4072fc7a76 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic/serviceport.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic/sharestorge.png b/cyclone-web/vendor/img/blueprint/logic/sharestorge.png new file mode 100644 index 0000000000000000000000000000000000000000..1cf498240dc534a199e3d47041c37782fa51d7fc Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic/sharestorge.png differ diff --git a/cyclone-web/vendor/img/blueprint/logic/webservice.png b/cyclone-web/vendor/img/blueprint/logic/webservice.png new file mode 100644 index 0000000000000000000000000000000000000000..58d56824384b92a777ab3ce6e1cafcb028e9ee12 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/logic/webservice.png differ diff --git a/cyclone-web/vendor/img/blueprint/relyon.png b/cyclone-web/vendor/img/blueprint/relyon.png new file mode 100644 index 0000000000000000000000000000000000000000..62e05593a2e5d01d63c6ff6ae889f91ecf04b2d5 Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/relyon.png differ diff --git a/cyclone-web/vendor/img/blueprint/txtonline.png b/cyclone-web/vendor/img/blueprint/txtonline.png new file mode 100644 index 0000000000000000000000000000000000000000..a9829a777202b95d9c422eb914217be8079a27fe Binary files /dev/null and b/cyclone-web/vendor/img/blueprint/txtonline.png differ diff --git a/cyclone-web/vendor/img/bpmn/graphy_dack.png b/cyclone-web/vendor/img/bpmn/graphy_dack.png new file mode 100644 index 0000000000000000000000000000000000000000..2f001798ff1dc283a38a94c9f558f1f862499f82 Binary files /dev/null and b/cyclone-web/vendor/img/bpmn/graphy_dack.png differ diff --git a/cyclone-web/vendor/jquery/jquery-3.2.1.min.js b/cyclone-web/vendor/jquery/jquery-3.2.1.min.js new file mode 100644 index 0000000000000000000000000000000000000000..644d35e274fd64ddaf6d12af813e820c424176a9 --- /dev/null +++ b/cyclone-web/vendor/jquery/jquery-3.2.1.min.js @@ -0,0 +1,4 @@ +/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(a,b){"use strict";"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){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.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||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=Array.isArray(d)))?(e?(e=!1,f=c&&Array.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},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?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;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;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=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={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.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=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$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("fieldset");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=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;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 function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(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 qa(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},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=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),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){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.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===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(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,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):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(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!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&&C.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.escape=function(a){return(a+"").replace(ba,ca)},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:V,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(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===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 V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.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(_,aa).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("(^|"+K+")"+a+"("+K+"|$)"))&&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(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},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,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/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=I(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(P,"$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(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).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:oa(!1),disabled:oa(!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 X.test(a.nodeName)},input:function(a){return W.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:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?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 ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,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=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[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 sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e);return!1}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}return!1}}function ua(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 va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(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?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(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}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};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=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return 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){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,N,e),g(f,c,O,e)):(f++,j.call(a,g(f,c,N,e),g(f,c,O,e),g(f,c,N,c.notifyWith))):(d!==N&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S), +a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;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},U=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function V(){this.expando=r.expando+V.uid++}V.uid=1,V.prototype={cache:function(a){var b=a[this.expando];return b||(b={},U(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){Array.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(L)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var W=new V,X=new V,Y=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Z=/[A-Z]/g;function $(a){return"true"===a||"false"!==a&&("null"===a?null:a===+a+""?+a:Y.test(a)?JSON.parse(a):a)}function _(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Z,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c=$(c)}catch(e){}X.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return X.hasData(a)||W.hasData(a)},data:function(a,b,c){return X.access(a,b,c)},removeData:function(a,b){X.remove(a,b)},_data:function(a,b,c){return W.access(a,b,c)},_removeData:function(a,b){W.remove(a,b)}}),r.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=X.get(f),1===f.nodeType&&!W.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),_(f,d,e[d])));W.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){X.set(this,a)}):T(this,function(b){var c;if(f&&void 0===b){if(c=X.get(f,a),void 0!==c)return c;if(c=_(f,a),void 0!==c)return c}else this.each(function(){X.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.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 W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.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=W.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var aa=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ba=new RegExp("^(?:([+-])=|)("+aa+")([a-z%]*)$","i"),ca=["Top","Right","Bottom","Left"],da=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},ea=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};function fa(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&ba.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var ga={};function ha(a){var b,c=a.ownerDocument,d=a.nodeName,e=ga[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),ga[d]=e,e)}function ia(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=W.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&da(d)&&(e[f]=ha(d))):"none"!==c&&(e[f]="none",W.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ia(this,!0)},hide:function(){return ia(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){da(this)?r(this).show():r(this).hide()})}});var ja=/^(?:checkbox|radio)$/i,ka=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={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,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c<d;c++)W.set(a[c],"globalEval",!b||W.get(b[c],"globalEval"))}var pa=/<|&#?\w+;/;function qa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(pa.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ka.exec(f)||["",""])[1].toLowerCase(),i=ma[h]||ma._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),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),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==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,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g,h=[],i=b.delegateCount,j=a.target;if(i&&j.nodeType&&!("click"===a.type&&a.button>=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c<i;c++)d=b[c],e=d.selector+" ",void 0===g[e]&&(g[e]=d.needsContext?r(e,this).index(j)>-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i<b.length&&h.push({elem:j,handlers:b.slice(i)}),h},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==xa()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===xa()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&B(this,"input"))return this.click(),!1},_default:function(a){return B(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?va:wa,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:wa,isPropagationStopped:wa,isImmediatePropagationStopped:wa,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=va,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=va,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=va,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.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,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(a){var b=a.button;return null==a.which&&sa.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&ta.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return ya(this,a,b,c,d)},one:function(a,b,c,d){return ya(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(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=wa),this.each(function(){r.event.remove(this,a,c,b)})}});var za=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/<script|<style|<link/i,Ba=/checked\s*(?:[^=]|=\s*.checked.)/i,Ca=/^true\/(.*)/,Da=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}X.hasData(a)&&(h=X.access(a),i=r.extend({},h),X.set(b,i))}}function Ia(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ja.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ja(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,na(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Ga),l=0;l<i;l++)j=h[l],la.test(j.type||"")&&!W.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Da,""),k))}return a}function Ka(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(na(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&oa(na(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(za,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d<e;d++)Ia(f[d],g[d]);if(b)if(c)for(f=f||na(a),g=g||na(h),d=0,e=f.length;d<e;d++)Ha(f[d],g[d]);else Ha(a,h);return g=na(h,"script"),g.length>0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.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 Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(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&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(na(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ja(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(na(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var La=/^margin/,Ma=new RegExp("^("+aa+")(?!px)[a-z%]+$","i"),Na=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",ra.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,ra.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Oa(a,b,c){var d,e,f,g,h=a.style;return c=c||Na(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&Ma.test(g)&&La.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 Pa(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Qa=/^(none|table(?!-c[ea]).+)/,Ra=/^--/,Sa={position:"absolute",visibility:"hidden",display:"block"},Ta={letterSpacing:"0",fontWeight:"400"},Ua=["Webkit","Moz","ms"],Va=d.createElement("div").style;function Wa(a){if(a in Va)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ua.length;while(c--)if(a=Ua[c]+b,a in Va)return a}function Xa(a){var b=r.cssProps[a];return b||(b=r.cssProps[a]=Wa(a)||a),b}function Ya(a,b,c){var d=ba.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Za(a,b,c,d,e){var f,g=0;for(f=c===(d?"border":"content")?4:"width"===b?1:0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+ca[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+ca[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+ca[f]+"Width",!0,e))):(g+=r.css(a,"padding"+ca[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+ca[f]+"Width",!0,e)));return g}function $a(a,b,c){var d,e=Na(a),f=Oa(a,b,e),g="border-box"===r.css(a,"boxSizing",!1,e);return Ma.test(f)?f:(d=g&&(o.boxSizingReliable()||f===a.style[b]),"auto"===f&&(f=a["offset"+b[0].toUpperCase()+b.slice(1)]),f=parseFloat(f)||0,f+Za(a,b,c||(g?"border":"content"),d,e)+"px")}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Oa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=Ra.test(b),j=a.style;return i||(b=Xa(h)),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:j[b]:(f=typeof c,"string"===f&&(e=ba.exec(c))&&e[1]&&(c=fa(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(j[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i?j.setProperty(b,c):j[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b),i=Ra.test(b);return i||(b=Xa(h)),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Oa(a,b,d)),"normal"===e&&b in Ta&&(e=Ta[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Qa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?$a(a,b,d):ea(a,Sa,function(){return $a(a,b,d)})},set:function(a,c,d){var e,f=d&&Na(a),g=d&&Za(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=ba.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Ya(a,c,g)}}}),r.cssHooks.marginLeft=Pa(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Oa(a,"marginLeft"))||a.getBoundingClientRect().left-ea(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+ca[d]+b]=f[d]||f[d-2]||f[0];return e}},La.test(a)||(r.cssHooks[a+b].set=Ya)}),r.fn.extend({css:function(a,b){return T(this,function(a,b,c){var d,e,f={},g=0;if(Array.isArray(b)){for(d=Na(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.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):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f<g;f++)if(d=e[f].call(c,b,a))return d}function ib(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&da(a),q=W.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],cb.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=W.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ia([a],!0),j=a.style.display||j,k=r.css(a,"display"),ia([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=W.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ia([a],!0),m.done(function(){p||ia([a]),W.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=hb(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function jb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],Array.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.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 kb(a,b,c){var d,e,f=0,g=kb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=ab||fb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;g<i;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),f<1&&i?c:(i||h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:ab||fb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.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;c<d;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jb(k,j.opts.specialEasing);f<g;f++)if(d=kb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,hb,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j}r.Animation=r.extend(kb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return fa(c.elem,a,ba.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(L);for(var c,d=0,e=a.length;d<e;d++)c=a[d],kb.tweeners[c]=kb.tweeners[c]||[],kb.tweeners[c].unshift(b)},prefilters:[ib],prefilter:function(a,b){b?kb.prefilters.unshift(a):kb.prefilters.push(a)}}),r.speed=function(a,b,c){var d=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off?d.duration=0:"number"!=typeof d.duration&&(d.duration in r.fx.speeds?d.duration=r.fx.speeds[d.duration]:d.duration=r.fx.speeds._default),null!=d.queue&&d.queue!==!0||(d.queue="fx"),d.old=d.complete,d.complete=function(){r.isFunction(d.old)&&d.old.call(this),d.queue&&r.dequeue(this,d.queue)},d},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(da).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=kb(this,r.extend({},a),f);(e||W.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=r.timers,g=W.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&db.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||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=W.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.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;b<g;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gb(b,!0),a,d,e)}}),r.each({slideDown:gb("show"),slideUp:gb("hide"),slideToggle:gb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(ab=r.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||r.fx.stop(),ab=void 0},r.fx.timer=function(a){r.timers.push(a),r.fx.start()},r.fx.interval=13,r.fx.start=function(){bb||(bb=!0,eb())},r.fx.stop=function(){bb=null},r.fx.speeds={slow:600,fast:200,_default:400},r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var lb,mb=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return T(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b), +null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.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){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d<i;d++)if(c=e[d],(c.selected||d===f)&&!c.disabled&&(!c.parentNode.disabled||!B(c.parentNode,"optgroup"))){if(b=r(c).val(),g)return b;h.push(b)}return h},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.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(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var 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(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.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 Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.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 Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(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}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(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}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,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":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(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 r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Tb=[],Ub=/(=)\?(?=&|$)|\?\?/;r.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Tb.pop()||r.expando+"_"+ub++;return this[a]=!0,a}}),r.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Ub.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ub.test(b.data)&&"data");if(h||"jsonp"===b.dataTypes[0])return e=b.jsonpCallback=r.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Ub,"$1"+e):b.jsonp!==!1&&(b.url+=(vb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||r.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?r(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Tb.push(e)),g&&r.isFunction(f)&&f(g[0]),g=f=void 0}),"script"}),o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=C.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=qa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=pb(a.slice(h)),a=a.slice(0,h)),r.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&r.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?r("<div>").append(r.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},r.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){r.fn[b]=function(a){return this.on(b,a)}}),r.expr.pseudos.animated=function(a){return r.grep(r.timers,function(b){return a===b.elem}).length},r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.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),r.isFunction(b)&&(b=b.call(a,c,r.extend({},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)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),b=f.ownerDocument,c=b.documentElement,e=b.defaultView,{top:d.top+e.pageYOffset-c.clientTop,left:d.left+e.pageXOffset-c.clientLeft}):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),B(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||ra})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return T(this,function(a,d,e){var f;return r.isWindow(a)?f=a:9===a.nodeType&&(f=a.defaultView),void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Pa(o.pixelPosition,function(a,c){if(c)return c=Oa(a,b),Ma.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return T(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({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)}}),r.holdReady=function(a){a?r.readyWait++:r.ready(!0)},r.isArray=Array.isArray,r.parseJSON=JSON.parse,r.nodeName=B,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var Vb=a.jQuery,Wb=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=Wb),b&&a.jQuery===r&&(a.jQuery=Vb),r},b||(a.jQuery=a.$=r),r}); diff --git a/cyclone-web/vendor/js-cookie/js.cookie.min.js b/cyclone-web/vendor/js-cookie/js.cookie.min.js new file mode 100644 index 0000000000000000000000000000000000000000..0b5427c8ae7d1b06fbdcaa5c42fdd81d3b8894c0 --- /dev/null +++ b/cyclone-web/vendor/js-cookie/js.cookie.min.js @@ -0,0 +1,8 @@ +/** + * Minified by jsDelivr using UglifyJS v3.3.25. + * Original file: /npm/js-cookie@2.2.0/src/js.cookie.js + * + * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files + */ +!function(e){var n=!1;if("function"==typeof define&&define.amd&&(define(e),n=!0),"object"==typeof exports&&(module.exports=e(),n=!0),!n){var o=window.Cookies,t=window.Cookies=e();t.noConflict=function(){return window.Cookies=o,t}}}(function(){function g(){for(var e=0,n={};e<arguments.length;e++){var o=arguments[e];for(var t in o)n[t]=o[t]}return n}return function e(l){function C(e,n,o){var t;if("undefined"!=typeof document){if(1<arguments.length){if("number"==typeof(o=g({path:"/"},C.defaults,o)).expires){var r=new Date;r.setMilliseconds(r.getMilliseconds()+864e5*o.expires),o.expires=r}o.expires=o.expires?o.expires.toUTCString():"";try{t=JSON.stringify(n),/^[\{\[]/.test(t)&&(n=t)}catch(e){}n=l.write?l.write(n,e):encodeURIComponent(String(n)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),e=(e=(e=encodeURIComponent(String(e))).replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent)).replace(/[\(\)]/g,escape);var i="";for(var c in o)o[c]&&(i+="; "+c,!0!==o[c]&&(i+="="+o[c]));return document.cookie=e+"="+n+i}e||(t={});for(var a=document.cookie?document.cookie.split("; "):[],s=/(%[0-9A-Z]{2})+/g,f=0;f<a.length;f++){var p=a[f].split("="),d=p.slice(1).join("=");this.json||'"'!==d.charAt(0)||(d=d.slice(1,-1));try{var u=p[0].replace(s,decodeURIComponent);if(d=l.read?l.read(d,u):l(d,u)||d.replace(s,decodeURIComponent),this.json)try{d=JSON.parse(d)}catch(e){}if(e===u){t=d;break}e||(t[u]=d)}catch(e){}}return t}}return(C.set=C).get=function(e){return C.call(C,e)},C.getJSON=function(){return C.apply({json:!0},[].slice.call(arguments))},C.defaults={},C.remove=function(e,n){C(e,"",g(n,{expires:-1}))},C.withConverter=e,C}(function(){})}); +//# sourceMappingURL=/sm/31d5cd1b58ce5e6231e4ea03a69b2801a53e76e98152bc29dc82a494ed0a1ee6.map \ No newline at end of file diff --git a/cyclone-web/vendor/jsurl/jsurl-2.5.0.min.js b/cyclone-web/vendor/jsurl/jsurl-2.5.0.min.js new file mode 100644 index 0000000000000000000000000000000000000000..1e0412758895fb73eff18d569bd781081ce71551 --- /dev/null +++ b/cyclone-web/vendor/jsurl/jsurl-2.5.0.min.js @@ -0,0 +1,199 @@ +(function() { + var url = (function() { + + function _t() { + return new RegExp(/(.*?)\.?([^\.]*?)\.(gl|com|net|org|biz|ws|in|me|co\.uk|co|org\.uk|ltd\.uk|plc\.uk|me\.uk|edu|mil|br\.com|cn\.com|eu\.com|hu\.com|no\.com|qc\.com|sa\.com|se\.com|se\.net|us\.com|uy\.com|ac|co\.ac|gv\.ac|or\.ac|ac\.ac|af|am|as|at|ac\.at|co\.at|gv\.at|or\.at|asn\.au|com\.au|edu\.au|org\.au|net\.au|id\.au|be|ac\.be|adm\.br|adv\.br|am\.br|arq\.br|art\.br|bio\.br|cng\.br|cnt\.br|com\.br|ecn\.br|eng\.br|esp\.br|etc\.br|eti\.br|fm\.br|fot\.br|fst\.br|g12\.br|gov\.br|ind\.br|inf\.br|jor\.br|lel\.br|med\.br|mil\.br|net\.br|nom\.br|ntr\.br|odo\.br|org\.br|ppg\.br|pro\.br|psc\.br|psi\.br|rec\.br|slg\.br|tmp\.br|tur\.br|tv\.br|vet\.br|zlg\.br|br|ab\.ca|bc\.ca|mb\.ca|nb\.ca|nf\.ca|ns\.ca|nt\.ca|on\.ca|pe\.ca|qc\.ca|sk\.ca|yk\.ca|ca|cc|ac\.cn|com\.cn|edu\.cn|gov\.cn|org\.cn|bj\.cn|sh\.cn|tj\.cn|cq\.cn|he\.cn|nm\.cn|ln\.cn|jl\.cn|hl\.cn|js\.cn|zj\.cn|ah\.cn|gd\.cn|gx\.cn|hi\.cn|sc\.cn|gz\.cn|yn\.cn|xz\.cn|sn\.cn|gs\.cn|qh\.cn|nx\.cn|xj\.cn|tw\.cn|hk\.cn|mo\.cn|cn|cx|cz|de|dk|fo|com\.ec|tm\.fr|com\.fr|asso\.fr|presse\.fr|fr|gf|gs|co\.il|net\.il|ac\.il|k12\.il|gov\.il|muni\.il|ac\.in|co\.in|org\.in|ernet\.in|gov\.in|net\.in|res\.in|is|it|ac\.jp|co\.jp|go\.jp|or\.jp|ne\.jp|ac\.kr|co\.kr|go\.kr|ne\.kr|nm\.kr|or\.kr|li|lt|lu|asso\.mc|tm\.mc|com\.mm|org\.mm|net\.mm|edu\.mm|gov\.mm|ms|nl|no|nu|pl|ro|org\.ro|store\.ro|tm\.ro|firm\.ro|www\.ro|arts\.ro|rec\.ro|info\.ro|nom\.ro|nt\.ro|se|si|com\.sg|org\.sg|net\.sg|gov\.sg|sk|st|tf|ac\.th|co\.th|go\.th|mi\.th|net\.th|or\.th|tm|to|com\.tr|edu\.tr|gov\.tr|k12\.tr|net\.tr|org\.tr|com\.tw|org\.tw|net\.tw|ac\.uk|uk\.com|uk\.net|gb\.com|gb\.net|vg|sh|kz|ch|info|ua|gov|name|pro|ie|hk|com\.hk|org\.hk|net\.hk|edu\.hk|us|tk|cd|by|ad|lv|eu\.lv|bz|es|jp|cl|ag|mobi|eu|co\.nz|org\.nz|net\.nz|maori\.nz|iwi\.nz|io|la|md|sc|sg|vc|tw|travel|my|se|tv|pt|com\.pt|edu\.pt|asia|fi|com\.ve|net\.ve|fi|org\.ve|web\.ve|info\.ve|co\.ve|tel|im|gr|ru|net\.ru|org\.ru|hr|com\.hr|ly|xyz)$/); + } + + function _d(s) { + return decodeURIComponent(s.replace(/\+/g, ' ')); + } + + function _i(arg, str) { + var sptr = arg.charAt(0), + split = str.split(sptr); + + if (sptr === arg) { return split; } + + arg = parseInt(arg.substring(1), 10); + + return split[arg < 0 ? split.length + arg : arg - 1]; + } + + function _f(arg, str) { + var sptr = arg.charAt(0), + split = str.split('&'), + field = [], + params = {}, + tmp = [], + arg2 = arg.substring(1); + + for (var i = 0, ii = split.length; i < ii; i++) { + field = split[i].match(/(.*?)=(.*)/); + + // TODO: regex should be able to handle this. + if ( ! field) { + field = [split[i], split[i], '']; + } + + if (field[1].replace(/\s/g, '') !== '') { + field[2] = _d(field[2] || ''); + + // If we have a match just return it right away. + if (arg2 === field[1]) { return field[2]; } + + // Check for array pattern. + tmp = field[1].match(/(.*)\[([0-9]+)\]/); + + if (tmp) { + params[tmp[1]] = params[tmp[1]] || []; + + params[tmp[1]][tmp[2]] = field[2]; + } + else { + params[field[1]] = field[2]; + } + } + } + + if (sptr === arg) { return params; } + + return params[arg2]; + } + + return function(arg, url) { + var _l = {}, tmp, tmp2; + + if (arg === 'tld?') { return _t(); } + + url = url || window.location.toString(); + + if ( ! arg) { return url; } + + arg = arg.toString(); + + if (tmp = url.match(/^mailto:([^\/].+)/)) { + _l.protocol = 'mailto'; + _l.email = tmp[1]; + } + else { + + // Ignore Hashbangs. + if (tmp = url.match(/(.*?)\/#\!(.*)/)) { + url = tmp[1] + tmp[2]; + } + + // Hash. + if (tmp = url.match(/(.*?)#(.*)/)) { + _l.hash = tmp[2]; + url = tmp[1]; + } + + // Return hash parts. + if (_l.hash && arg.match(/^#/)) { return _f(arg, _l.hash); } + + // Query + if (tmp = url.match(/(.*?)\?(.*)/)) { + _l.query = tmp[2]; + url = tmp[1]; + } + + // Return query parts. + if (_l.query && arg.match(/^\?/)) { return _f(arg, _l.query); } + + // Protocol. + if (tmp = url.match(/(.*?)\:?\/\/(.*)/)) { + _l.protocol = tmp[1].toLowerCase(); + url = tmp[2]; + } + + // Path. + if (tmp = url.match(/(.*?)(\/.*)/)) { + _l.path = tmp[2]; + url = tmp[1]; + } + + // Clean up path. + _l.path = (_l.path || '').replace(/^([^\/])/, '/$1'); + + // Return path parts. + if (arg.match(/^[\-0-9]+$/)) { arg = arg.replace(/^([^\/])/, '/$1'); } + if (arg.match(/^\//)) { return _i(arg, _l.path.substring(1)); } + + // File. + tmp = _i('/-1', _l.path.substring(1)); + + if (tmp && (tmp = tmp.match(/(.*?)\.([^.]+)$/))) { + _l.file = tmp[0]; + _l.filename = tmp[1]; + _l.fileext = tmp[2]; + } + + // Port. + if (tmp = url.match(/(.*)\:([0-9]+)$/)) { + _l.port = tmp[2]; + url = tmp[1]; + } + + // Auth. + if (tmp = url.match(/(.*?)@(.*)/)) { + _l.auth = tmp[1]; + url = tmp[2]; + } + + // User and pass. + if (_l.auth) { + tmp = _l.auth.match(/(.*)\:(.*)/); + + _l.user = tmp ? tmp[1] : _l.auth; + _l.pass = tmp ? tmp[2] : undefined; + } + + // Hostname. + _l.hostname = url.toLowerCase(); + + // Return hostname parts. + if (arg.charAt(0) === '.') { return _i(arg, _l.hostname); } + + // Domain, tld and sub domain. + if (_t()) { + tmp = _l.hostname.match(_t()); + + if (tmp) { + _l.tld = tmp[3]; + _l.domain = tmp[2] ? tmp[2] + '.' + tmp[3] : undefined; + _l.sub = tmp[1] || undefined; + } + } + + // Set port and protocol defaults if not set. + _l.port = _l.port || (_l.protocol === 'https' ? '443' : '80'); + _l.protocol = _l.protocol || (_l.port === '443' ? 'https' : 'http'); + } + + // Return arg. + if (arg in _l) { return _l[arg]; } + + // Return everything. + if (arg === '{}') { return _l; } + + // Default to undefined for no match. + return undefined; + }; + })(); + + if (typeof window.define === 'function' && window.define.amd) { + window.define('js-url', [], function () { + return url; + }); + } else { + if(typeof window.jQuery !== 'undefined') { + window.jQuery.extend({ + url: function(arg, url) { return window.url(arg, url); } + }); + } + + window.url = url; + } + +})(); diff --git a/cyclone-web/vendor/moment/moment.js b/cyclone-web/vendor/moment/moment.js new file mode 100644 index 0000000000000000000000000000000000000000..2a3358ff63f48df678e55ebed2929b3dd7af8e28 --- /dev/null +++ b/cyclone-web/vendor/moment/moment.js @@ -0,0 +1 @@ +!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 c(){return e.apply(null,arguments)}function o(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function u(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function l(e){return void 0===e}function d(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function h(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function f(e,t){var n,s=[];for(n=0;n<e.length;++n)s.push(t(e[n],n));return s}function m(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function _(e,t){for(var n in t)m(t,n)&&(e[n]=t[n]);return m(t,"toString")&&(e.toString=t.toString),m(t,"valueOf")&&(e.valueOf=t.valueOf),e}function y(e,t,n,s){return Ot(e,t,n,s,!0).utc()}function g(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 p(e){if(null==e._isValid){var t=g(e),n=i.call(t.parsedDateParts,function(e){return null!=e}),s=!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&&(s=s&&0===t.charsLeftOver&&0===t.unusedTokens.length&&void 0===t.bigHour),null!=Object.isFrozen&&Object.isFrozen(e))return s;e._isValid=s}return e._isValid}function v(e){var t=y(NaN);return null!=e?_(g(t),e):g(t).userInvalidated=!0,t}i=Array.prototype.some?Array.prototype.some:function(e){for(var t=Object(this),n=t.length>>>0,s=0;s<n;s++)if(s in t&&e.call(this,t[s],s,t))return!0;return!1};var r=c.momentProperties=[];function w(e,t){var n,s,i;if(l(t._isAMomentObject)||(e._isAMomentObject=t._isAMomentObject),l(t._i)||(e._i=t._i),l(t._f)||(e._f=t._f),l(t._l)||(e._l=t._l),l(t._strict)||(e._strict=t._strict),l(t._tzm)||(e._tzm=t._tzm),l(t._isUTC)||(e._isUTC=t._isUTC),l(t._offset)||(e._offset=t._offset),l(t._pf)||(e._pf=g(t)),l(t._locale)||(e._locale=t._locale),0<r.length)for(n=0;n<r.length;n++)l(i=t[s=r[n]])||(e[s]=i);return e}var t=!1;function M(e){w(this,e),this._d=new Date(null!=e._d?e._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===t&&(t=!0,c.updateOffset(this),t=!1)}function S(e){return e instanceof M||null!=e&&null!=e._isAMomentObject}function D(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function k(e){var t=+e,n=0;return 0!==t&&isFinite(t)&&(n=D(t)),n}function a(e,t,n){var s,i=Math.min(e.length,t.length),r=Math.abs(e.length-t.length),a=0;for(s=0;s<i;s++)(n&&e[s]!==t[s]||!n&&k(e[s])!==k(t[s]))&&a++;return a+r}function Y(e){!1===c.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+e)}function n(i,r){var a=!0;return _(function(){if(null!=c.deprecationHandler&&c.deprecationHandler(null,i),a){for(var e,t=[],n=0;n<arguments.length;n++){if(e="","object"==typeof arguments[n]){for(var s in e+="\n["+n+"] ",arguments[0])e+=s+": "+arguments[0][s]+", ";e=e.slice(0,-2)}else e=arguments[n];t.push(e)}Y(i+"\nArguments: "+Array.prototype.slice.call(t).join("")+"\n"+(new Error).stack),a=!1}return r.apply(this,arguments)},r)}var s,O={};function T(e,t){null!=c.deprecationHandler&&c.deprecationHandler(e,t),O[e]||(Y(t),O[e]=!0)}function x(e){return e instanceof Function||"[object Function]"===Object.prototype.toString.call(e)}function b(e,t){var n,s=_({},e);for(n in t)m(t,n)&&(u(e[n])&&u(t[n])?(s[n]={},_(s[n],e[n]),_(s[n],t[n])):null!=t[n]?s[n]=t[n]:delete s[n]);for(n in e)m(e,n)&&!m(t,n)&&u(e[n])&&(s[n]=_({},s[n]));return s}function P(e){null!=e&&this.set(e)}c.suppressDeprecationWarnings=!1,c.deprecationHandler=null,s=Object.keys?Object.keys:function(e){var t,n=[];for(t in e)m(e,t)&&n.push(t);return n};var W={};function H(e,t){var n=e.toLowerCase();W[n]=W[n+"s"]=W[t]=e}function R(e){return"string"==typeof e?W[e]||W[e.toLowerCase()]:void 0}function C(e){var t,n,s={};for(n in e)m(e,n)&&(t=R(n))&&(s[t]=e[n]);return s}var F={};function L(e,t){F[e]=t}function U(e,t,n){var s=""+Math.abs(e),i=t-s.length;return(0<=e?n?"+":"":"-")+Math.pow(10,Math.max(0,i)).toString().substr(1)+s}var N=/(\[[^\[]*\])|(\\)?([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,G=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,V={},E={};function I(e,t,n,s){var i=s;"string"==typeof s&&(i=function(){return this[s]()}),e&&(E[e]=i),t&&(E[t[0]]=function(){return U(i.apply(this,arguments),t[1],t[2])}),n&&(E[n]=function(){return this.localeData().ordinal(i.apply(this,arguments),e)})}function A(e,t){return e.isValid()?(t=j(t,e.localeData()),V[t]=V[t]||function(s){var e,i,t,r=s.match(N);for(e=0,i=r.length;e<i;e++)E[r[e]]?r[e]=E[r[e]]:r[e]=(t=r[e]).match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"");return function(e){var t,n="";for(t=0;t<i;t++)n+=x(r[t])?r[t].call(e,s):r[t];return n}}(t),V[t](e)):e.localeData().invalidDate()}function j(e,t){var n=5;function s(e){return t.longDateFormat(e)||e}for(G.lastIndex=0;0<=n&&G.test(e);)e=e.replace(G,s),G.lastIndex=0,n-=1;return e}var Z=/\d/,z=/\d\d/,$=/\d{3}/,q=/\d{4}/,J=/[+-]?\d{6}/,B=/\d\d?/,Q=/\d\d\d\d?/,X=/\d\d\d\d\d\d?/,K=/\d{1,3}/,ee=/\d{1,4}/,te=/[+-]?\d{1,6}/,ne=/\d+/,se=/[+-]?\d+/,ie=/Z|[+-]\d\d:?\d\d/gi,re=/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,oe={};function ue(e,n,s){oe[e]=x(n)?n:function(e,t){return e&&s?s:n}}function le(e,t){return m(oe,e)?oe[e](t._strict,t._locale):new RegExp(de(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(e,t,n,s,i){return t||n||s||i})))}function de(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var he={};function ce(e,n){var t,s=n;for("string"==typeof e&&(e=[e]),d(n)&&(s=function(e,t){t[n]=k(e)}),t=0;t<e.length;t++)he[e[t]]=s}function fe(e,i){ce(e,function(e,t,n,s){n._w=n._w||{},i(e,n._w,n,s)})}var me=0,_e=1,ye=2,ge=3,pe=4,ve=5,we=6,Me=7,Se=8;function De(e){return ke(e)?366:365}function ke(e){return e%4==0&&e%100!=0||e%400==0}I("Y",0,0,function(){var e=this.year();return e<=9999?""+e:"+"+e}),I(0,["YY",2],0,function(){return this.year()%100}),I(0,["YYYY",4],0,"year"),I(0,["YYYYY",5],0,"year"),I(0,["YYYYYY",6,!0],0,"year"),H("year","y"),L("year",1),ue("Y",se),ue("YY",B,z),ue("YYYY",ee,q),ue("YYYYY",te,J),ue("YYYYYY",te,J),ce(["YYYYY","YYYYYY"],me),ce("YYYY",function(e,t){t[me]=2===e.length?c.parseTwoDigitYear(e):k(e)}),ce("YY",function(e,t){t[me]=c.parseTwoDigitYear(e)}),ce("Y",function(e,t){t[me]=parseInt(e,10)}),c.parseTwoDigitYear=function(e){return k(e)+(68<k(e)?1900:2e3)};var Ye,Oe=Te("FullYear",!0);function Te(t,n){return function(e){return null!=e?(be(this,t,e),c.updateOffset(this,n),this):xe(this,t)}}function xe(e,t){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+t]():NaN}function be(e,t,n){e.isValid()&&!isNaN(n)&&("FullYear"===t&&ke(e.year())&&1===e.month()&&29===e.date()?e._d["set"+(e._isUTC?"UTC":"")+t](n,e.month(),Pe(n,e.month())):e._d["set"+(e._isUTC?"UTC":"")+t](n))}function Pe(e,t){if(isNaN(e)||isNaN(t))return NaN;var n,s=(t%(n=12)+n)%n;return e+=(t-s)/12,1===s?ke(e)?29:28:31-s%7%2}Ye=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},I("M",["MM",2],"Mo",function(){return this.month()+1}),I("MMM",0,0,function(e){return this.localeData().monthsShort(this,e)}),I("MMMM",0,0,function(e){return this.localeData().months(this,e)}),H("month","M"),L("month",8),ue("M",B),ue("MM",B,z),ue("MMM",function(e,t){return t.monthsShortRegex(e)}),ue("MMMM",function(e,t){return t.monthsRegex(e)}),ce(["M","MM"],function(e,t){t[_e]=k(e)-1}),ce(["MMM","MMMM"],function(e,t,n,s){var i=n._locale.monthsParse(e,s,n._strict);null!=i?t[_e]=i:g(n).invalidMonth=e});var We=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,He="January_February_March_April_May_June_July_August_September_October_November_December".split("_");var Re="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_");function Ce(e,t){var n;if(!e.isValid())return e;if("string"==typeof t)if(/^\d+$/.test(t))t=k(t);else if(!d(t=e.localeData().monthsParse(t)))return e;return n=Math.min(e.date(),Pe(e.year(),t)),e._d["set"+(e._isUTC?"UTC":"")+"Month"](t,n),e}function Fe(e){return null!=e?(Ce(this,e),c.updateOffset(this,!0),this):xe(this,"Month")}var Le=ae;var Ue=ae;function Ne(){function e(e,t){return t.length-e.length}var t,n,s=[],i=[],r=[];for(t=0;t<12;t++)n=y([2e3,t]),s.push(this.monthsShort(n,"")),i.push(this.months(n,"")),r.push(this.months(n,"")),r.push(this.monthsShort(n,""));for(s.sort(e),i.sort(e),r.sort(e),t=0;t<12;t++)s[t]=de(s[t]),i[t]=de(i[t]);for(t=0;t<24;t++)r[t]=de(r[t]);this._monthsRegex=new RegExp("^("+r.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+i.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+s.join("|")+")","i")}function Ge(e){var t=new Date(Date.UTC.apply(null,arguments));return e<100&&0<=e&&isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e),t}function Ve(e,t,n){var s=7+t-n;return-((7+Ge(e,0,s).getUTCDay()-t)%7)+s-1}function Ee(e,t,n,s,i){var r,a,o=1+7*(t-1)+(7+n-s)%7+Ve(e,s,i);return a=o<=0?De(r=e-1)+o:o>De(e)?(r=e+1,o-De(e)):(r=e,o),{year:r,dayOfYear:a}}function Ie(e,t,n){var s,i,r=Ve(e.year(),t,n),a=Math.floor((e.dayOfYear()-r-1)/7)+1;return a<1?s=a+Ae(i=e.year()-1,t,n):a>Ae(e.year(),t,n)?(s=a-Ae(e.year(),t,n),i=e.year()+1):(i=e.year(),s=a),{week:s,year:i}}function Ae(e,t,n){var s=Ve(e,t,n),i=Ve(e+1,t,n);return(De(e)-s+i)/7}I("w",["ww",2],"wo","week"),I("W",["WW",2],"Wo","isoWeek"),H("week","w"),H("isoWeek","W"),L("week",5),L("isoWeek",5),ue("w",B),ue("ww",B,z),ue("W",B),ue("WW",B,z),fe(["w","ww","W","WW"],function(e,t,n,s){t[s.substr(0,1)]=k(e)});I("d",0,"do","day"),I("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),I("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),I("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),I("e",0,0,"weekday"),I("E",0,0,"isoWeekday"),H("day","d"),H("weekday","e"),H("isoWeekday","E"),L("day",11),L("weekday",11),L("isoWeekday",11),ue("d",B),ue("e",B),ue("E",B),ue("dd",function(e,t){return t.weekdaysMinRegex(e)}),ue("ddd",function(e,t){return t.weekdaysShortRegex(e)}),ue("dddd",function(e,t){return t.weekdaysRegex(e)}),fe(["dd","ddd","dddd"],function(e,t,n,s){var i=n._locale.weekdaysParse(e,s,n._strict);null!=i?t.d=i:g(n).invalidWeekday=e}),fe(["d","e","E"],function(e,t,n,s){t[s]=k(e)});var je="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_");var Ze="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_");var ze="Su_Mo_Tu_We_Th_Fr_Sa".split("_");var $e=ae;var qe=ae;var Je=ae;function Be(){function e(e,t){return t.length-e.length}var t,n,s,i,r,a=[],o=[],u=[],l=[];for(t=0;t<7;t++)n=y([2e3,1]).day(t),s=this.weekdaysMin(n,""),i=this.weekdaysShort(n,""),r=this.weekdays(n,""),a.push(s),o.push(i),u.push(r),l.push(s),l.push(i),l.push(r);for(a.sort(e),o.sort(e),u.sort(e),l.sort(e),t=0;t<7;t++)o[t]=de(o[t]),u[t]=de(u[t]),l[t]=de(l[t]);this._weekdaysRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+o.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+a.join("|")+")","i")}function Qe(){return this.hours()%12||12}function Xe(e,t){I(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function Ke(e,t){return t._meridiemParse}I("H",["HH",2],0,"hour"),I("h",["hh",2],0,Qe),I("k",["kk",2],0,function(){return this.hours()||24}),I("hmm",0,0,function(){return""+Qe.apply(this)+U(this.minutes(),2)}),I("hmmss",0,0,function(){return""+Qe.apply(this)+U(this.minutes(),2)+U(this.seconds(),2)}),I("Hmm",0,0,function(){return""+this.hours()+U(this.minutes(),2)}),I("Hmmss",0,0,function(){return""+this.hours()+U(this.minutes(),2)+U(this.seconds(),2)}),Xe("a",!0),Xe("A",!1),H("hour","h"),L("hour",13),ue("a",Ke),ue("A",Ke),ue("H",B),ue("h",B),ue("k",B),ue("HH",B,z),ue("hh",B,z),ue("kk",B,z),ue("hmm",Q),ue("hmmss",X),ue("Hmm",Q),ue("Hmmss",X),ce(["H","HH"],ge),ce(["k","kk"],function(e,t,n){var s=k(e);t[ge]=24===s?0:s}),ce(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),ce(["h","hh"],function(e,t,n){t[ge]=k(e),g(n).bigHour=!0}),ce("hmm",function(e,t,n){var s=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s)),g(n).bigHour=!0}),ce("hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s,2)),t[ve]=k(e.substr(i)),g(n).bigHour=!0}),ce("Hmm",function(e,t,n){var s=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s))}),ce("Hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s,2)),t[ve]=k(e.substr(i))});var et,tt=Te("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:He,monthsShort:Re,week:{dow:0,doy:6},weekdays:je,weekdaysMin:ze,weekdaysShort:Ze,meridiemParse:/[ap]\.?m?\.?/i},st={},it={};function rt(e){return e?e.toLowerCase().replace("_","-"):e}function at(e){var t=null;if(!st[e]&&"undefined"!=typeof module&&module&&module.exports)try{t=et._abbr,require("./locale/"+e),ot(t)}catch(e){}return st[e]}function ot(e,t){var n;return e&&((n=l(t)?lt(e):ut(e,t))?et=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),et._abbr}function ut(e,t){if(null===t)return delete st[e],null;var n,s=nt;if(t.abbr=e,null!=st[e])T("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."),s=st[e]._config;else if(null!=t.parentLocale)if(null!=st[t.parentLocale])s=st[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;s=n._config}return st[e]=new P(b(s,t)),it[e]&&it[e].forEach(function(e){ut(e.name,e.config)}),ot(e),st[e]}function lt(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return et;if(!o(e)){if(t=at(e))return t;e=[e]}return function(e){for(var t,n,s,i,r=0;r<e.length;){for(t=(i=rt(e[r]).split("-")).length,n=(n=rt(e[r+1]))?n.split("-"):null;0<t;){if(s=at(i.slice(0,t).join("-")))return s;if(n&&n.length>=t&&a(i,n,!0)>=t-1)break;t--}r++}return et}(e)}function dt(e){var t,n=e._a;return n&&-2===g(e).overflow&&(t=n[_e]<0||11<n[_e]?_e:n[ye]<1||n[ye]>Pe(n[me],n[_e])?ye:n[ge]<0||24<n[ge]||24===n[ge]&&(0!==n[pe]||0!==n[ve]||0!==n[we])?ge:n[pe]<0||59<n[pe]?pe:n[ve]<0||59<n[ve]?ve:n[we]<0||999<n[we]?we:-1,g(e)._overflowDayOfYear&&(t<me||ye<t)&&(t=ye),g(e)._overflowWeeks&&-1===t&&(t=Me),g(e)._overflowWeekday&&-1===t&&(t=Se),g(e).overflow=t),e}function ht(e,t,n){return null!=e?e:null!=t?t:n}function ct(e){var t,n,s,i,r,a=[];if(!e._d){var o,u;for(o=e,u=new Date(c.now()),s=o._useUTC?[u.getUTCFullYear(),u.getUTCMonth(),u.getUTCDate()]:[u.getFullYear(),u.getMonth(),u.getDate()],e._w&&null==e._a[ye]&&null==e._a[_e]&&function(e){var t,n,s,i,r,a,o,u;if(null!=(t=e._w).GG||null!=t.W||null!=t.E)r=1,a=4,n=ht(t.GG,e._a[me],Ie(Tt(),1,4).year),s=ht(t.W,1),((i=ht(t.E,1))<1||7<i)&&(u=!0);else{r=e._locale._week.dow,a=e._locale._week.doy;var l=Ie(Tt(),r,a);n=ht(t.gg,e._a[me],l.year),s=ht(t.w,l.week),null!=t.d?((i=t.d)<0||6<i)&&(u=!0):null!=t.e?(i=t.e+r,(t.e<0||6<t.e)&&(u=!0)):i=r}s<1||s>Ae(n,r,a)?g(e)._overflowWeeks=!0:null!=u?g(e)._overflowWeekday=!0:(o=Ee(n,s,i,r,a),e._a[me]=o.year,e._dayOfYear=o.dayOfYear)}(e),null!=e._dayOfYear&&(r=ht(e._a[me],s[me]),(e._dayOfYear>De(r)||0===e._dayOfYear)&&(g(e)._overflowDayOfYear=!0),n=Ge(r,0,e._dayOfYear),e._a[_e]=n.getUTCMonth(),e._a[ye]=n.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=a[t]=s[t];for(;t<7;t++)e._a[t]=a[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[ge]&&0===e._a[pe]&&0===e._a[ve]&&0===e._a[we]&&(e._nextDay=!0,e._a[ge]=0),e._d=(e._useUTC?Ge:function(e,t,n,s,i,r,a){var o=new Date(e,t,n,s,i,r,a);return e<100&&0<=e&&isFinite(o.getFullYear())&&o.setFullYear(e),o}).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[ge]=24),e._w&&void 0!==e._w.d&&e._w.d!==i&&(g(e).weekdayMismatch=!0)}}var 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)?)?$/,mt=/^\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)?)?$/,_t=/Z|[+-]\d\d(?::?\d\d)?/,yt=[["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}/]],gt=[["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/]],pt=/^\/?Date\((\-?\d+)/i;function vt(e){var t,n,s,i,r,a,o=e._i,u=ft.exec(o)||mt.exec(o);if(u){for(g(e).iso=!0,t=0,n=yt.length;t<n;t++)if(yt[t][1].exec(u[1])){i=yt[t][0],s=!1!==yt[t][2];break}if(null==i)return void(e._isValid=!1);if(u[3]){for(t=0,n=gt.length;t<n;t++)if(gt[t][1].exec(u[3])){r=(u[2]||" ")+gt[t][0];break}if(null==r)return void(e._isValid=!1)}if(!s&&null!=r)return void(e._isValid=!1);if(u[4]){if(!_t.exec(u[4]))return void(e._isValid=!1);a="Z"}e._f=i+(r||"")+(a||""),kt(e)}else e._isValid=!1}var wt=/^(?:(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 Mt(e,t,n,s,i,r){var a=[function(e){var t=parseInt(e,10);{if(t<=49)return 2e3+t;if(t<=999)return 1900+t}return t}(e),Re.indexOf(t),parseInt(n,10),parseInt(s,10),parseInt(i,10)];return r&&a.push(parseInt(r,10)),a}var St={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function Dt(e){var t,n,s,i=wt.exec(e._i.replace(/\([^)]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").replace(/^\s\s*/,"").replace(/\s\s*$/,""));if(i){var r=Mt(i[4],i[3],i[2],i[5],i[6],i[7]);if(t=i[1],n=r,s=e,t&&Ze.indexOf(t)!==new Date(n[0],n[1],n[2]).getDay()&&(g(s).weekdayMismatch=!0,!(s._isValid=!1)))return;e._a=r,e._tzm=function(e,t,n){if(e)return St[e];if(t)return 0;var s=parseInt(n,10),i=s%100;return(s-i)/100*60+i}(i[8],i[9],i[10]),e._d=Ge.apply(null,e._a),e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),g(e).rfc2822=!0}else e._isValid=!1}function kt(e){if(e._f!==c.ISO_8601)if(e._f!==c.RFC_2822){e._a=[],g(e).empty=!0;var t,n,s,i,r,a,o,u,l=""+e._i,d=l.length,h=0;for(s=j(e._f,e._locale).match(N)||[],t=0;t<s.length;t++)i=s[t],(n=(l.match(le(i,e))||[])[0])&&(0<(r=l.substr(0,l.indexOf(n))).length&&g(e).unusedInput.push(r),l=l.slice(l.indexOf(n)+n.length),h+=n.length),E[i]?(n?g(e).empty=!1:g(e).unusedTokens.push(i),a=i,u=e,null!=(o=n)&&m(he,a)&&he[a](o,u._a,u,a)):e._strict&&!n&&g(e).unusedTokens.push(i);g(e).charsLeftOver=d-h,0<l.length&&g(e).unusedInput.push(l),e._a[ge]<=12&&!0===g(e).bigHour&&0<e._a[ge]&&(g(e).bigHour=void 0),g(e).parsedDateParts=e._a.slice(0),g(e).meridiem=e._meridiem,e._a[ge]=function(e,t,n){var s;if(null==n)return t;return null!=e.meridiemHour?e.meridiemHour(t,n):(null!=e.isPM&&((s=e.isPM(n))&&t<12&&(t+=12),s||12!==t||(t=0)),t)}(e._locale,e._a[ge],e._meridiem),ct(e),dt(e)}else Dt(e);else vt(e)}function Yt(e){var t,n,s,i,r=e._i,a=e._f;return e._locale=e._locale||lt(e._l),null===r||void 0===a&&""===r?v({nullInput:!0}):("string"==typeof r&&(e._i=r=e._locale.preparse(r)),S(r)?new M(dt(r)):(h(r)?e._d=r:o(a)?function(e){var t,n,s,i,r;if(0===e._f.length)return g(e).invalidFormat=!0,e._d=new Date(NaN);for(i=0;i<e._f.length;i++)r=0,t=w({},e),null!=e._useUTC&&(t._useUTC=e._useUTC),t._f=e._f[i],kt(t),p(t)&&(r+=g(t).charsLeftOver,r+=10*g(t).unusedTokens.length,g(t).score=r,(null==s||r<s)&&(s=r,n=t));_(e,n||t)}(e):a?kt(e):l(n=(t=e)._i)?t._d=new Date(c.now()):h(n)?t._d=new Date(n.valueOf()):"string"==typeof n?(s=t,null===(i=pt.exec(s._i))?(vt(s),!1===s._isValid&&(delete s._isValid,Dt(s),!1===s._isValid&&(delete s._isValid,c.createFromInputFallback(s)))):s._d=new Date(+i[1])):o(n)?(t._a=f(n.slice(0),function(e){return parseInt(e,10)}),ct(t)):u(n)?function(e){if(!e._d){var t=C(e._i);e._a=f([t.year,t.month,t.day||t.date,t.hour,t.minute,t.second,t.millisecond],function(e){return e&&parseInt(e,10)}),ct(e)}}(t):d(n)?t._d=new Date(n):c.createFromInputFallback(t),p(e)||(e._d=null),e))}function Ot(e,t,n,s,i){var r,a={};return!0!==n&&!1!==n||(s=n,n=void 0),(u(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)||o(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=s,(r=new M(dt(Yt(a))))._nextDay&&(r.add(1,"d"),r._nextDay=void 0),r}function Tt(e,t,n,s){return Ot(e,t,n,s,!1)}c.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":""))}),c.ISO_8601=function(){},c.RFC_2822=function(){};var xt=n("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var e=Tt.apply(null,arguments);return this.isValid()&&e.isValid()?e<this?this:e:v()}),bt=n("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var e=Tt.apply(null,arguments);return this.isValid()&&e.isValid()?this<e?this:e:v()});function Pt(e,t){var n,s;if(1===t.length&&o(t[0])&&(t=t[0]),!t.length)return Tt();for(n=t[0],s=1;s<t.length;++s)t[s].isValid()&&!t[s][e](n)||(n=t[s]);return n}var Wt=["year","quarter","month","week","day","hour","minute","second","millisecond"];function Ht(e){var t=C(e),n=t.year||0,s=t.quarter||0,i=t.month||0,r=t.week||t.isoWeek||0,a=t.day||0,o=t.hour||0,u=t.minute||0,l=t.second||0,d=t.millisecond||0;this._isValid=function(e){for(var t in e)if(-1===Ye.call(Wt,t)||null!=e[t]&&isNaN(e[t]))return!1;for(var n=!1,s=0;s<Wt.length;++s)if(e[Wt[s]]){if(n)return!1;parseFloat(e[Wt[s]])!==k(e[Wt[s]])&&(n=!0)}return!0}(t),this._milliseconds=+d+1e3*l+6e4*u+1e3*o*60*60,this._days=+a+7*r,this._months=+i+3*s+12*n,this._data={},this._locale=lt(),this._bubble()}function Rt(e){return e instanceof Ht}function Ct(e){return e<0?-1*Math.round(-1*e):Math.round(e)}function Ft(e,n){I(e,0,0,function(){var e=this.utcOffset(),t="+";return e<0&&(e=-e,t="-"),t+U(~~(e/60),2)+n+U(~~e%60,2)})}Ft("Z",":"),Ft("ZZ",""),ue("Z",re),ue("ZZ",re),ce(["Z","ZZ"],function(e,t,n){n._useUTC=!0,n._tzm=Ut(re,e)});var Lt=/([\+\-]|\d\d)/gi;function Ut(e,t){var n=(t||"").match(e);if(null===n)return null;var s=((n[n.length-1]||[])+"").match(Lt)||["-",0,0],i=60*s[1]+k(s[2]);return 0===i?0:"+"===s[0]?i:-i}function Nt(e,t){var n,s;return t._isUTC?(n=t.clone(),s=(S(e)||h(e)?e.valueOf():Tt(e).valueOf())-n.valueOf(),n._d.setTime(n._d.valueOf()+s),c.updateOffset(n,!1),n):Tt(e).local()}function Gt(e){return 15*-Math.round(e._d.getTimezoneOffset()/15)}function Vt(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}c.updateOffset=function(){};var Et=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,It=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function At(e,t){var n,s,i,r=e,a=null;return Rt(e)?r={ms:e._milliseconds,d:e._days,M:e._months}:d(e)?(r={},t?r[t]=e:r.milliseconds=e):(a=Et.exec(e))?(n="-"===a[1]?-1:1,r={y:0,d:k(a[ye])*n,h:k(a[ge])*n,m:k(a[pe])*n,s:k(a[ve])*n,ms:k(Ct(1e3*a[we]))*n}):(a=It.exec(e))?(n="-"===a[1]?-1:1,r={y:jt(a[2],n),M:jt(a[3],n),w:jt(a[4],n),d:jt(a[5],n),h:jt(a[6],n),m:jt(a[7],n),s:jt(a[8],n)}):null==r?r={}:"object"==typeof r&&("from"in r||"to"in r)&&(i=function(e,t){var n;if(!e.isValid()||!t.isValid())return{milliseconds:0,months:0};t=Nt(t,e),e.isBefore(t)?n=Zt(e,t):((n=Zt(t,e)).milliseconds=-n.milliseconds,n.months=-n.months);return n}(Tt(r.from),Tt(r.to)),(r={}).ms=i.milliseconds,r.M=i.months),s=new Ht(r),Rt(e)&&m(e,"_locale")&&(s._locale=e._locale),s}function jt(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 zt(s,i){return function(e,t){var n;return null===t||isNaN(+t)||(T(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),$t(this,At(e="string"==typeof e?+e:e,t),s),this}}function $t(e,t,n,s){var i=t._milliseconds,r=Ct(t._days),a=Ct(t._months);e.isValid()&&(s=null==s||s,a&&Ce(e,xe(e,"Month")+a*n),r&&be(e,"Date",xe(e,"Date")+r*n),i&&e._d.setTime(e._d.valueOf()+i*n),s&&c.updateOffset(e,r||a))}At.fn=Ht.prototype,At.invalid=function(){return At(NaN)};var qt=zt(1,"add"),Jt=zt(-1,"subtract");function Bt(e,t){var n=12*(t.year()-e.year())+(t.month()-e.month()),s=e.clone().add(n,"months");return-(n+(t-s<0?(t-s)/(s-e.clone().add(n-1,"months")):(t-s)/(e.clone().add(n+1,"months")-s)))||0}function Qt(e){var t;return void 0===e?this._locale._abbr:(null!=(t=lt(e))&&(this._locale=t),this)}c.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",c.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 Kt(){return this._locale}function en(e,t){I(0,[e,e.length],0,t)}function tn(e,t,n,s,i){var r;return null==e?Ie(this,s,i).year:((r=Ae(e,s,i))<t&&(t=r),function(e,t,n,s,i){var r=Ee(e,t,n,s,i),a=Ge(r.year,0,r.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}.call(this,e,t,n,s,i))}I(0,["gg",2],0,function(){return this.weekYear()%100}),I(0,["GG",2],0,function(){return this.isoWeekYear()%100}),en("gggg","weekYear"),en("ggggg","weekYear"),en("GGGG","isoWeekYear"),en("GGGGG","isoWeekYear"),H("weekYear","gg"),H("isoWeekYear","GG"),L("weekYear",1),L("isoWeekYear",1),ue("G",se),ue("g",se),ue("GG",B,z),ue("gg",B,z),ue("GGGG",ee,q),ue("gggg",ee,q),ue("GGGGG",te,J),ue("ggggg",te,J),fe(["gggg","ggggg","GGGG","GGGGG"],function(e,t,n,s){t[s.substr(0,2)]=k(e)}),fe(["gg","GG"],function(e,t,n,s){t[s]=c.parseTwoDigitYear(e)}),I("Q",0,"Qo","quarter"),H("quarter","Q"),L("quarter",7),ue("Q",Z),ce("Q",function(e,t){t[_e]=3*(k(e)-1)}),I("D",["DD",2],"Do","date"),H("date","D"),L("date",9),ue("D",B),ue("DD",B,z),ue("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient}),ce(["D","DD"],ye),ce("Do",function(e,t){t[ye]=k(e.match(B)[0])});var nn=Te("Date",!0);I("DDD",["DDDD",3],"DDDo","dayOfYear"),H("dayOfYear","DDD"),L("dayOfYear",4),ue("DDD",K),ue("DDDD",$),ce(["DDD","DDDD"],function(e,t,n){n._dayOfYear=k(e)}),I("m",["mm",2],0,"minute"),H("minute","m"),L("minute",14),ue("m",B),ue("mm",B,z),ce(["m","mm"],pe);var sn=Te("Minutes",!1);I("s",["ss",2],0,"second"),H("second","s"),L("second",15),ue("s",B),ue("ss",B,z),ce(["s","ss"],ve);var rn,an=Te("Seconds",!1);for(I("S",0,0,function(){return~~(this.millisecond()/100)}),I(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),I(0,["SSS",3],0,"millisecond"),I(0,["SSSS",4],0,function(){return 10*this.millisecond()}),I(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),I(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),I(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),I(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),I(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),H("millisecond","ms"),L("millisecond",16),ue("S",K,Z),ue("SS",K,z),ue("SSS",K,$),rn="SSSS";rn.length<=9;rn+="S")ue(rn,ne);function on(e,t){t[we]=k(1e3*("0."+e))}for(rn="S";rn.length<=9;rn+="S")ce(rn,on);var un=Te("Milliseconds",!1);I("z",0,0,"zoneAbbr"),I("zz",0,0,"zoneName");var ln=M.prototype;function dn(e){return e}ln.add=qt,ln.calendar=function(e,t){var n=e||Tt(),s=Nt(n,this).startOf("day"),i=c.calendarFormat(this,s)||"sameElse",r=t&&(x(t[i])?t[i].call(this,n):t[i]);return this.format(r||this.localeData().calendar(i,this,Tt(n)))},ln.clone=function(){return new M(this)},ln.diff=function(e,t,n){var s,i,r;if(!this.isValid())return NaN;if(!(s=Nt(e,this)).isValid())return NaN;switch(i=6e4*(s.utcOffset()-this.utcOffset()),t=R(t)){case"year":r=Bt(this,s)/12;break;case"month":r=Bt(this,s);break;case"quarter":r=Bt(this,s)/3;break;case"second":r=(this-s)/1e3;break;case"minute":r=(this-s)/6e4;break;case"hour":r=(this-s)/36e5;break;case"day":r=(this-s-i)/864e5;break;case"week":r=(this-s-i)/6048e5;break;default:r=this-s}return n?r:D(r)},ln.endOf=function(e){return void 0===(e=R(e))||"millisecond"===e?this:("date"===e&&(e="day"),this.startOf(e).add(1,"isoWeek"===e?"week":e).subtract(1,"ms"))},ln.format=function(e){e||(e=this.isUtc()?c.defaultFormatUtc:c.defaultFormat);var t=A(this,e);return this.localeData().postformat(t)},ln.from=function(e,t){return this.isValid()&&(S(e)&&e.isValid()||Tt(e).isValid())?At({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},ln.fromNow=function(e){return this.from(Tt(),e)},ln.to=function(e,t){return this.isValid()&&(S(e)&&e.isValid()||Tt(e).isValid())?At({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},ln.toNow=function(e){return this.to(Tt(),e)},ln.get=function(e){return x(this[e=R(e)])?this[e]():this},ln.invalidAt=function(){return g(this).overflow},ln.isAfter=function(e,t){var n=S(e)?e:Tt(e);return!(!this.isValid()||!n.isValid())&&("millisecond"===(t=R(t)||"millisecond")?this.valueOf()>n.valueOf():n.valueOf()<this.clone().startOf(t).valueOf())},ln.isBefore=function(e,t){var n=S(e)?e:Tt(e);return!(!this.isValid()||!n.isValid())&&("millisecond"===(t=R(t)||"millisecond")?this.valueOf()<n.valueOf():this.clone().endOf(t).valueOf()<n.valueOf())},ln.isBetween=function(e,t,n,s){var i=S(e)?e:Tt(e),r=S(t)?t:Tt(t);return!!(this.isValid()&&i.isValid()&&r.isValid())&&("("===(s=s||"()")[0]?this.isAfter(i,n):!this.isBefore(i,n))&&(")"===s[1]?this.isBefore(r,n):!this.isAfter(r,n))},ln.isSame=function(e,t){var n,s=S(e)?e:Tt(e);return!(!this.isValid()||!s.isValid())&&("millisecond"===(t=R(t)||"millisecond")?this.valueOf()===s.valueOf():(n=s.valueOf(),this.clone().startOf(t).valueOf()<=n&&n<=this.clone().endOf(t).valueOf()))},ln.isSameOrAfter=function(e,t){return this.isSame(e,t)||this.isAfter(e,t)},ln.isSameOrBefore=function(e,t){return this.isSame(e,t)||this.isBefore(e,t)},ln.isValid=function(){return p(this)},ln.lang=Xt,ln.locale=Qt,ln.localeData=Kt,ln.max=bt,ln.min=xt,ln.parsingFlags=function(){return _({},g(this))},ln.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:F[n]});return t.sort(function(e,t){return e.priority-t.priority}),t}(e=C(e)),s=0;s<n.length;s++)this[n[s].unit](e[n[s].unit]);else if(x(this[e=R(e)]))return this[e](t);return this},ln.startOf=function(e){switch(e=R(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},ln.subtract=Jt,ln.toArray=function(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]},ln.toObject=function(){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()}},ln.toDate=function(){return new Date(this.valueOf())},ln.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()?A(n,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):x(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",A(n,"Z")):A(n,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},ln.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+'("]',s=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",i=t+'[")]';return this.format(n+s+"-MM-DD[T]HH:mm:ss.SSS"+i)},ln.toJSON=function(){return this.isValid()?this.toISOString():null},ln.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},ln.unix=function(){return Math.floor(this.valueOf()/1e3)},ln.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},ln.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},ln.year=Oe,ln.isLeapYear=function(){return ke(this.year())},ln.weekYear=function(e){return tn.call(this,e,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},ln.isoWeekYear=function(e){return tn.call(this,e,this.isoWeek(),this.isoWeekday(),1,4)},ln.quarter=ln.quarters=function(e){return null==e?Math.ceil((this.month()+1)/3):this.month(3*(e-1)+this.month()%3)},ln.month=Fe,ln.daysInMonth=function(){return Pe(this.year(),this.month())},ln.week=ln.weeks=function(e){var t=this.localeData().week(this);return null==e?t:this.add(7*(e-t),"d")},ln.isoWeek=ln.isoWeeks=function(e){var t=Ie(this,1,4).week;return null==e?t:this.add(7*(e-t),"d")},ln.weeksInYear=function(){var e=this.localeData()._week;return Ae(this.year(),e.dow,e.doy)},ln.isoWeeksInYear=function(){return Ae(this.year(),1,4)},ln.date=nn,ln.day=ln.days=function(e){if(!this.isValid())return null!=e?this:NaN;var t,n,s=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-s,"d")):s},ln.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")},ln.isoWeekday=function(e){if(!this.isValid())return null!=e?this:NaN;if(null==e)return this.day()||7;var t,n,s=(t=e,n=this.localeData(),"string"==typeof t?n.weekdaysParse(t)%7||7:isNaN(t)?null:t);return this.day(this.day()%7?s:s-7)},ln.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")},ln.hour=ln.hours=tt,ln.minute=ln.minutes=sn,ln.second=ln.seconds=an,ln.millisecond=ln.milliseconds=un,ln.utcOffset=function(e,t,n){var s,i=this._offset||0;if(!this.isValid())return null!=e?this:NaN;if(null==e)return this._isUTC?i:Gt(this);if("string"==typeof e){if(null===(e=Ut(re,e)))return this}else Math.abs(e)<16&&!n&&(e*=60);return!this._isUTC&&t&&(s=Gt(this)),this._offset=e,this._isUTC=!0,null!=s&&this.add(s,"m"),i!==e&&(!t||this._changeInProgress?$t(this,At(e-i,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,c.updateOffset(this,!0),this._changeInProgress=null)),this},ln.utc=function(e){return this.utcOffset(0,e)},ln.local=function(e){return this._isUTC&&(this.utcOffset(0,e),this._isUTC=!1,e&&this.subtract(Gt(this),"m")),this},ln.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var e=Ut(ie,this._i);null!=e?this.utcOffset(e):this.utcOffset(0,!0)}return this},ln.hasAlignedHourOffset=function(e){return!!this.isValid()&&(e=e?Tt(e).utcOffset():0,(this.utcOffset()-e)%60==0)},ln.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},ln.isLocal=function(){return!!this.isValid()&&!this._isUTC},ln.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},ln.isUtc=Vt,ln.isUTC=Vt,ln.zoneAbbr=function(){return this._isUTC?"UTC":""},ln.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},ln.dates=n("dates accessor is deprecated. Use date instead.",nn),ln.months=n("months accessor is deprecated. Use month instead",Fe),ln.years=n("years accessor is deprecated. Use year instead",Oe),ln.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()}),ln.isDSTShifted=n("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!l(this._isDSTShifted))return this._isDSTShifted;var e={};if(w(e,this),(e=Yt(e))._a){var t=e._isUTC?y(e._a):Tt(e._a);this._isDSTShifted=this.isValid()&&0<a(e._a,t.toArray())}else this._isDSTShifted=!1;return this._isDSTShifted});var hn=P.prototype;function cn(e,t,n,s){var i=lt(),r=y().set(s,t);return i[n](r,e)}function fn(e,t,n){if(d(e)&&(t=e,e=void 0),e=e||"",null!=t)return cn(e,t,n,"month");var s,i=[];for(s=0;s<12;s++)i[s]=cn(e,s,n,"month");return i}function mn(e,t,n,s){t=("boolean"==typeof e?d(t)&&(n=t,t=void 0):(t=e,e=!1,d(n=t)&&(n=t,t=void 0)),t||"");var i,r=lt(),a=e?r._week.dow:0;if(null!=n)return cn(t,(n+a)%7,s,"day");var o=[];for(i=0;i<7;i++)o[i]=cn(t,(i+a)%7,s,"day");return o}hn.calendar=function(e,t,n){var s=this._calendar[e]||this._calendar.sameElse;return x(s)?s.call(t,n):s},hn.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])},hn.invalidDate=function(){return this._invalidDate},hn.ordinal=function(e){return this._ordinal.replace("%d",e)},hn.preparse=dn,hn.postformat=dn,hn.relativeTime=function(e,t,n,s){var i=this._relativeTime[n];return x(i)?i(e,t,n,s):i.replace(/%d/i,e)},hn.pastFuture=function(e,t){var n=this._relativeTime[0<e?"future":"past"];return x(n)?n(t):n.replace(/%s/i,t)},hn.set=function(e){var t,n;for(n in e)x(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)},hn.months=function(e,t){return e?o(this._months)?this._months[e.month()]:this._months[(this._months.isFormat||We).test(t)?"format":"standalone"][e.month()]:o(this._months)?this._months:this._months.standalone},hn.monthsShort=function(e,t){return e?o(this._monthsShort)?this._monthsShort[e.month()]:this._monthsShort[We.test(t)?"format":"standalone"][e.month()]:o(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},hn.monthsParse=function(e,t,n){var s,i,r;if(this._monthsParseExact)return function(e,t,n){var s,i,r,a=e.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],s=0;s<12;++s)r=y([2e3,s]),this._shortMonthsParse[s]=this.monthsShort(r,"").toLocaleLowerCase(),this._longMonthsParse[s]=this.months(r,"").toLocaleLowerCase();return n?"MMM"===t?-1!==(i=Ye.call(this._shortMonthsParse,a))?i:null:-1!==(i=Ye.call(this._longMonthsParse,a))?i:null:"MMM"===t?-1!==(i=Ye.call(this._shortMonthsParse,a))?i:-1!==(i=Ye.call(this._longMonthsParse,a))?i:null:-1!==(i=Ye.call(this._longMonthsParse,a))?i:-1!==(i=Ye.call(this._shortMonthsParse,a))?i:null}.call(this,e,t,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),s=0;s<12;s++){if(i=y([2e3,s]),n&&!this._longMonthsParse[s]&&(this._longMonthsParse[s]=new RegExp("^"+this.months(i,"").replace(".","")+"$","i"),this._shortMonthsParse[s]=new RegExp("^"+this.monthsShort(i,"").replace(".","")+"$","i")),n||this._monthsParse[s]||(r="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[s]=new RegExp(r.replace(".",""),"i")),n&&"MMMM"===t&&this._longMonthsParse[s].test(e))return s;if(n&&"MMM"===t&&this._shortMonthsParse[s].test(e))return s;if(!n&&this._monthsParse[s].test(e))return s}},hn.monthsRegex=function(e){return this._monthsParseExact?(m(this,"_monthsRegex")||Ne.call(this),e?this._monthsStrictRegex:this._monthsRegex):(m(this,"_monthsRegex")||(this._monthsRegex=Ue),this._monthsStrictRegex&&e?this._monthsStrictRegex:this._monthsRegex)},hn.monthsShortRegex=function(e){return this._monthsParseExact?(m(this,"_monthsRegex")||Ne.call(this),e?this._monthsShortStrictRegex:this._monthsShortRegex):(m(this,"_monthsShortRegex")||(this._monthsShortRegex=Le),this._monthsShortStrictRegex&&e?this._monthsShortStrictRegex:this._monthsShortRegex)},hn.week=function(e){return Ie(e,this._week.dow,this._week.doy).week},hn.firstDayOfYear=function(){return this._week.doy},hn.firstDayOfWeek=function(){return this._week.dow},hn.weekdays=function(e,t){return e?o(this._weekdays)?this._weekdays[e.day()]:this._weekdays[this._weekdays.isFormat.test(t)?"format":"standalone"][e.day()]:o(this._weekdays)?this._weekdays:this._weekdays.standalone},hn.weekdaysMin=function(e){return e?this._weekdaysMin[e.day()]:this._weekdaysMin},hn.weekdaysShort=function(e){return e?this._weekdaysShort[e.day()]:this._weekdaysShort},hn.weekdaysParse=function(e,t,n){var s,i,r;if(this._weekdaysParseExact)return function(e,t,n){var s,i,r,a=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],s=0;s<7;++s)r=y([2e3,1]).day(s),this._minWeekdaysParse[s]=this.weekdaysMin(r,"").toLocaleLowerCase(),this._shortWeekdaysParse[s]=this.weekdaysShort(r,"").toLocaleLowerCase(),this._weekdaysParse[s]=this.weekdays(r,"").toLocaleLowerCase();return n?"dddd"===t?-1!==(i=Ye.call(this._weekdaysParse,a))?i:null:"ddd"===t?-1!==(i=Ye.call(this._shortWeekdaysParse,a))?i:null:-1!==(i=Ye.call(this._minWeekdaysParse,a))?i:null:"dddd"===t?-1!==(i=Ye.call(this._weekdaysParse,a))?i:-1!==(i=Ye.call(this._shortWeekdaysParse,a))?i:-1!==(i=Ye.call(this._minWeekdaysParse,a))?i:null:"ddd"===t?-1!==(i=Ye.call(this._shortWeekdaysParse,a))?i:-1!==(i=Ye.call(this._weekdaysParse,a))?i:-1!==(i=Ye.call(this._minWeekdaysParse,a))?i:null:-1!==(i=Ye.call(this._minWeekdaysParse,a))?i:-1!==(i=Ye.call(this._weekdaysParse,a))?i:-1!==(i=Ye.call(this._shortWeekdaysParse,a))?i:null}.call(this,e,t,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),s=0;s<7;s++){if(i=y([2e3,1]).day(s),n&&!this._fullWeekdaysParse[s]&&(this._fullWeekdaysParse[s]=new RegExp("^"+this.weekdays(i,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[s]=new RegExp("^"+this.weekdaysShort(i,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[s]=new RegExp("^"+this.weekdaysMin(i,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[s]||(r="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[s]=new RegExp(r.replace(".",""),"i")),n&&"dddd"===t&&this._fullWeekdaysParse[s].test(e))return s;if(n&&"ddd"===t&&this._shortWeekdaysParse[s].test(e))return s;if(n&&"dd"===t&&this._minWeekdaysParse[s].test(e))return s;if(!n&&this._weekdaysParse[s].test(e))return s}},hn.weekdaysRegex=function(e){return this._weekdaysParseExact?(m(this,"_weekdaysRegex")||Be.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(m(this,"_weekdaysRegex")||(this._weekdaysRegex=$e),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)},hn.weekdaysShortRegex=function(e){return this._weekdaysParseExact?(m(this,"_weekdaysRegex")||Be.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(m(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=qe),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},hn.weekdaysMinRegex=function(e){return this._weekdaysParseExact?(m(this,"_weekdaysRegex")||Be.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(m(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Je),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},hn.isPM=function(e){return"p"===(e+"").toLowerCase().charAt(0)},hn.meridiem=function(e,t,n){return 11<e?n?"pm":"PM":n?"am":"AM"},ot("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10;return e+(1===k(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}}),c.lang=n("moment.lang is deprecated. Use moment.locale instead.",ot),c.langData=n("moment.langData is deprecated. Use moment.localeData instead.",lt);var _n=Math.abs;function yn(e,t,n,s){var i=At(t,n);return e._milliseconds+=s*i._milliseconds,e._days+=s*i._days,e._months+=s*i._months,e._bubble()}function gn(e){return e<0?Math.floor(e):Math.ceil(e)}function pn(e){return 4800*e/146097}function vn(e){return 146097*e/4800}function wn(e){return function(){return this.as(e)}}var Mn=wn("ms"),Sn=wn("s"),Dn=wn("m"),kn=wn("h"),Yn=wn("d"),On=wn("w"),Tn=wn("M"),xn=wn("y");function bn(e){return function(){return this.isValid()?this._data[e]:NaN}}var Pn=bn("milliseconds"),Wn=bn("seconds"),Hn=bn("minutes"),Rn=bn("hours"),Cn=bn("days"),Fn=bn("months"),Ln=bn("years");var Un=Math.round,Nn={ss:44,s:45,m:45,h:22,d:26,M:11};var Gn=Math.abs;function Vn(e){return(0<e)-(e<0)||+e}function En(){if(!this.isValid())return this.localeData().invalidDate();var e,t,n=Gn(this._milliseconds)/1e3,s=Gn(this._days),i=Gn(this._months);t=D((e=D(n/60))/60),n%=60,e%=60;var r=D(i/12),a=i%=12,o=s,u=t,l=e,d=n?n.toFixed(3).replace(/\.?0+$/,""):"",h=this.asSeconds();if(!h)return"P0D";var c=h<0?"-":"",f=Vn(this._months)!==Vn(h)?"-":"",m=Vn(this._days)!==Vn(h)?"-":"",_=Vn(this._milliseconds)!==Vn(h)?"-":"";return c+"P"+(r?f+r+"Y":"")+(a?f+a+"M":"")+(o?m+o+"D":"")+(u||l||d?"T":"")+(u?_+u+"H":"")+(l?_+l+"M":"")+(d?_+d+"S":"")}var In=Ht.prototype;return In.isValid=function(){return this._isValid},In.abs=function(){var e=this._data;return this._milliseconds=_n(this._milliseconds),this._days=_n(this._days),this._months=_n(this._months),e.milliseconds=_n(e.milliseconds),e.seconds=_n(e.seconds),e.minutes=_n(e.minutes),e.hours=_n(e.hours),e.months=_n(e.months),e.years=_n(e.years),this},In.add=function(e,t){return yn(this,e,t,1)},In.subtract=function(e,t){return yn(this,e,t,-1)},In.as=function(e){if(!this.isValid())return NaN;var t,n,s=this._milliseconds;if("month"===(e=R(e))||"year"===e)return t=this._days+s/864e5,n=this._months+pn(t),"month"===e?n:n/12;switch(t=this._days+Math.round(vn(this._months)),e){case"week":return t/7+s/6048e5;case"day":return t+s/864e5;case"hour":return 24*t+s/36e5;case"minute":return 1440*t+s/6e4;case"second":return 86400*t+s/1e3;case"millisecond":return Math.floor(864e5*t)+s;default:throw new Error("Unknown unit "+e)}},In.asMilliseconds=Mn,In.asSeconds=Sn,In.asMinutes=Dn,In.asHours=kn,In.asDays=Yn,In.asWeeks=On,In.asMonths=Tn,In.asYears=xn,In.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*k(this._months/12):NaN},In._bubble=function(){var e,t,n,s,i,r=this._milliseconds,a=this._days,o=this._months,u=this._data;return 0<=r&&0<=a&&0<=o||r<=0&&a<=0&&o<=0||(r+=864e5*gn(vn(o)+a),o=a=0),u.milliseconds=r%1e3,e=D(r/1e3),u.seconds=e%60,t=D(e/60),u.minutes=t%60,n=D(t/60),u.hours=n%24,o+=i=D(pn(a+=D(n/24))),a-=gn(vn(i)),s=D(o/12),o%=12,u.days=a,u.months=o,u.years=s,this},In.clone=function(){return At(this)},In.get=function(e){return e=R(e),this.isValid()?this[e+"s"]():NaN},In.milliseconds=Pn,In.seconds=Wn,In.minutes=Hn,In.hours=Rn,In.days=Cn,In.weeks=function(){return D(this.days()/7)},In.months=Fn,In.years=Ln,In.humanize=function(e){if(!this.isValid())return this.localeData().invalidDate();var t,n,s,i,r,a,o,u,l,d,h,c=this.localeData(),f=(n=!e,s=c,i=At(t=this).abs(),r=Un(i.as("s")),a=Un(i.as("m")),o=Un(i.as("h")),u=Un(i.as("d")),l=Un(i.as("M")),d=Un(i.as("y")),(h=r<=Nn.ss&&["s",r]||r<Nn.s&&["ss",r]||a<=1&&["m"]||a<Nn.m&&["mm",a]||o<=1&&["h"]||o<Nn.h&&["hh",o]||u<=1&&["d"]||u<Nn.d&&["dd",u]||l<=1&&["M"]||l<Nn.M&&["MM",l]||d<=1&&["y"]||["yy",d])[2]=n,h[3]=0<+t,h[4]=s,function(e,t,n,s,i){return i.relativeTime(t||1,!!n,e,s)}.apply(null,h));return e&&(f=c.pastFuture(+this,f)),c.postformat(f)},In.toISOString=En,In.toString=En,In.toJSON=En,In.locale=Qt,In.localeData=Kt,In.toIsoString=n("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",En),In.lang=Xt,I("X",0,0,"unix"),I("x",0,0,"valueOf"),ue("x",se),ue("X",/[+-]?\d+(\.\d{1,3})?/),ce("X",function(e,t,n){n._d=new Date(1e3*parseFloat(e,10))}),ce("x",function(e,t,n){n._d=new Date(k(e))}),c.version="2.23.0",e=Tt,c.fn=ln,c.min=function(){return Pt("isBefore",[].slice.call(arguments,0))},c.max=function(){return Pt("isAfter",[].slice.call(arguments,0))},c.now=function(){return Date.now?Date.now():+new Date},c.utc=y,c.unix=function(e){return Tt(1e3*e)},c.months=function(e,t){return fn(e,t,"months")},c.isDate=h,c.locale=ot,c.invalid=v,c.duration=At,c.isMoment=S,c.weekdays=function(e,t,n){return mn(e,t,n,"weekdays")},c.parseZone=function(){return Tt.apply(null,arguments).parseZone()},c.localeData=lt,c.isDuration=Rt,c.monthsShort=function(e,t){return fn(e,t,"monthsShort")},c.weekdaysMin=function(e,t,n){return mn(e,t,n,"weekdaysMin")},c.defineLocale=ut,c.updateLocale=function(e,t){if(null!=t){var n,s,i=nt;null!=(s=at(e))&&(i=s._config),(n=new P(t=b(i,t))).parentLocale=st[e],st[e]=n,ot(e)}else null!=st[e]&&(null!=st[e].parentLocale?st[e]=st[e].parentLocale:null!=st[e]&&delete st[e]);return st[e]},c.locales=function(){return s(st)},c.weekdaysShort=function(e,t,n){return mn(e,t,n,"weekdaysShort")},c.normalizeUnits=R,c.relativeTimeRounding=function(e){return void 0===e?Un:"function"==typeof e&&(Un=e,!0)},c.relativeTimeThreshold=function(e,t){return void 0!==Nn[e]&&(void 0===t?Nn[e]:(Nn[e]=t,"s"===e&&(Nn.ss=t-1),!0))},c.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"},c.prototype=ln,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}); \ No newline at end of file diff --git a/cyclone-web/vendor/polyfill/Intl.min.js b/cyclone-web/vendor/polyfill/Intl.min.js new file mode 100644 index 0000000000000000000000000000000000000000..e01d44c198a5bab54436767a6562bd120a1a5fca --- /dev/null +++ b/cyclone-web/vendor/polyfill/Intl.min.js @@ -0,0 +1,3 @@ +!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define(r):e.IntlPolyfill=r()}(this,function(){"use strict";function e(e){if("function"==typeof Math.log10)return Math.floor(Math.log10(e));var r=Math.round(Math.log(e)*Math.LOG10E);return r-(Number("1e"+r)>e)}function r(e){for(var t in e)(e instanceof r||Ue.call(e,t))&&Ke(this,t,{value:e[t],enumerable:!0,writable:!0,configurable:!0})}function t(){Ke(this,"length",{writable:!0,value:0}),arguments.length&&Ve.apply(this,We.call(arguments))}function n(){if(rr.disableRegExpRestore)return function(){};for(var e={lastMatch:RegExp.lastMatch||"",leftContext:RegExp.leftContext,multiline:RegExp.multiline,input:RegExp.input},r=!1,t=1;t<=9;t++)r=(e["$"+t]=RegExp["$"+t])||r;return function(){var t=/[.?*+^$[\]\\(){}|-]/g,n=e.lastMatch.replace(t,"\\$&"),o="";if(r)for(var i=1;i<=9;i++){var a=e["$"+i];a?(a=a.replace(t,"\\$&"),o+=n.substring(0,n.indexOf(a))+"(",n=a+")"+n.substring(n.indexOf(a)+a.length)):(o+="(",n=")"+n)}o+=n,o=o.replace(/((^|[^\\])((\\\\)*\\[()])+|[^()])+/g,function(e){return"[\\s\\S]{"+e.replace(/\\(.)/g,"$1").length+"}"});var l=new RegExp(o,e.multiline?"gm":"g");l.lastIndex=e.leftContext.length,l.exec(e.input)}}function o(e){if(null===e)throw new TypeError("Cannot convert null or undefined to object");return"object"===(void 0===e?"undefined":Ze.typeof(e))?e:Object(e)}function i(e){return"number"==typeof e?e:Number(e)}function a(e){var r=i(e);return isNaN(r)?0:0===r||-0===r||r===1/0||r===-1/0?r:r<0?-1*Math.floor(Math.abs(r)):Math.floor(Math.abs(r))}function l(e){var r=a(e);return r<=0?0:r===1/0?Math.pow(2,53)-1:Math.min(r,Math.pow(2,53)-1)}function s(e){return Ue.call(e,"__getInternalProperties")?e.__getInternalProperties(tr):He(null)}function u(e){ur=e}function c(e){for(var r=e.length;r--;){var t=e.charAt(r);t>="a"&&t<="z"&&(e=e.slice(0,r)+t.toUpperCase()+e.slice(r+1))}return e}function f(e){return!!ir.test(e)&&(!ar.test(e)&&!lr.test(e))}function g(e){var r=void 0,t=void 0;e=e.toLowerCase(),t=e.split("-");for(var n=1,o=t.length;n<o;n++)if(2===t[n].length)t[n]=t[n].toUpperCase();else if(4===t[n].length)t[n]=t[n].charAt(0).toUpperCase()+t[n].slice(1);else if(1===t[n].length&&"x"!==t[n])break;e=Je.call(t,"-"),(r=e.match(sr))&&r.length>1&&(r.sort(),e=e.replace(RegExp("(?:"+sr.source+")+","i"),Je.call(r,""))),Ue.call(cr.tags,e)&&(e=cr.tags[e]),t=e.split("-");for(var i=1,a=t.length;i<a;i++)Ue.call(cr.subtags,t[i])?t[i]=cr.subtags[t[i]]:Ue.call(cr.extLang,t[i])&&(t[i]=cr.extLang[t[i]][0],1===i&&cr.extLang[t[1]][1]===t[0]&&(t=We.call(t,i++),a-=1));return Je.call(t,"-")}function h(){return ur}function m(e){var r=String(e),t=c(r);return!1!==fr.test(t)}function v(e){if(void 0===e)return new t;var r=new t;e="string"==typeof e?[e]:e;for(var n=o(e),i=l(n.length),a=0;a<i;){var s=String(a);if(s in n){var u=n[s];if(null===u||"string"!=typeof u&&"object"!==(void 0===u?"undefined":Ze.typeof(u)))throw new TypeError("String or Object type expected");var c=String(u);if(!f(c))throw new RangeError("'"+c+"' is not a structurally valid language tag");c=g(c),-1===Ye.call(r,c)&&Ve.call(r,c)}a++}return r}function p(e,r){for(var t=r;t;){if(Ye.call(e,t)>-1)return t;var n=t.lastIndexOf("-");if(n<0)return;n>=2&&"-"===t.charAt(n-2)&&(n-=2),t=t.substring(0,n)}}function d(e,t){for(var n=0,o=t.length,i=void 0,a=void 0,l=void 0;n<o&&!i;)a=t[n],l=String(a).replace(gr,""),i=p(e,l),n++;var s=new r;if(void 0!==i){if(s["[[locale]]"]=i,String(a)!==String(l)){var u=a.match(gr)[0],c=a.indexOf("-u-");s["[[extension]]"]=u,s["[[extensionIndex]]"]=c}}else s["[[locale]]"]=h();return s}function y(e,r){return d(e,r)}function b(e){var r=e.length;if(0===r)return[];for(var t=[],n=!0,o=3,i=o,a=o;o<r;){if(45===e.codePointAt(o)){if(o-i==2){if(i-a>1){var l=e.substring(a,i-1);t.push(l)}var s=e.substring(i,o);t.push(s),a=o+1,n=!1}else if(!0===n){var u=e.substring(i,o);t.push(u),a=o+1}i=o+1}o+=1}if(r-i==2){if(i-a>1){var c=e.substring(a,i-1);t.push(c)}a=i}var f=e.substring(a,r);return t.push(f),t}function w(e,t,n,o,i){if(0===e.length)throw new ReferenceError("No locale data has been provided for this object yet.");var a=n["[[localeMatcher]]"],l=void 0;l="lookup"===a?d(e,t):y(e,t);var s=l["[[locale]]"],u=void 0,c=void 0;if(Ue.call(l,"[[extension]]")){u=b(l["[[extension]]"]),c=u.length}var f=new r;f["[[dataLocale]]"]=s;for(var h="-u",m=0,v=o.length;m<v;){var p=o[m],w=i[s],k=w[p],S=k[0],x="",j=Ye;if(void 0!==u){var z=j.call(u,p);if(-1!==z)if(z+1<c&&u[z+1].length>2){var D=u[z+1],F=j.call(k,D);-1!==F&&(S=D,x="-"+p+"-"+S)}else{var O=j(k,"true");-1!==O&&(S="true")}}if(Ue.call(n,"[["+p+"]]")){var N=n["[["+p+"]]"];-1!==j.call(k,N)&&N!==S&&(S=N,x="")}f["[["+p+"]]"]=S,h+=x,m++}if(h.length>2){var P=s.indexOf("-x-");if(-1===P)s+=h;else{s=s.substring(0,P)+h+s.substring(P)}s=g(s)}return f["[[locale]]"]=s,f}function k(e,r){for(var n=r.length,o=new t,i=0;i<n;){var a=r[i];void 0!==p(e,String(a).replace(gr,""))&&Ve.call(o,a),i++}return We.call(o)}function S(e,r){return k(e,r)}function x(e,t,n){var i=void 0,a=void 0;if(void 0!==n&&(n=new r(o(n)),void 0!==(i=n.localeMatcher)&&"lookup"!==(i=String(i))&&"best fit"!==i))throw new RangeError('matcher should be "lookup" or "best fit"');a=void 0===i||"best fit"===i?S(e,t):k(e,t);for(var l in a)Ue.call(a,l)&&Ke(a,l,{writable:!1,configurable:!1,value:a[l]});try{Ke(a,"length",{writable:!1})}catch(e){}return a}function j(e,r,t,n,o){var i=e[r];if(void 0!==i){if(i="boolean"===t?Boolean(i):"string"===t?String(i):i,void 0!==n&&-1===Ye.call(n,i))throw new RangeError("'"+i+"' is not an allowed value for `"+r+"`");return i}return o}function z(e,r,t,n,o){var i=e[r];if(void 0!==i){if(i=Number(i),isNaN(i)||i<t||i>n)throw new RangeError("Value is not a number or outside accepted range");return Math.floor(i)}return o}function D(e){for(var r=v(e),t=[],n=r.length,o=0;o<n;)t[o]=r[o],o++;return t}function F(){var e=arguments[0],r=arguments[1];return this&&this!==hr?N(o(this),e,r):new hr.NumberFormat(e,r)}function O(e,r,t){var n=z(r,"minimumIntegerDigits",1,21,1),o=z(r,"minimumFractionDigits",0,20,t),i=z(r,"maximumFractionDigits",o,20),a=r.minimumSignificantDigits,l=r.maximumSignificantDigits;e["[[minimumIntegerDigits]]"]=n,e["[[minimumFractionDigits]]"]=o,e["[[maximumFractionDigits]]"]=i,void 0===a&&void 0===l||(a=z(r,"minimumSignificantDigits",1,21,1),l=z(r,"maximumSignificantDigits",a,21,21),e["[[minimumSignificantDigits]]"]=a,e["[[maximumSignificantDigits]]"]=l)}function N(e,i,a){var l=s(e),u=n();if(!0===l["[[initializedIntlObject]]"])throw new TypeError("`this` object has already been initialized as an Intl object");Ke(e,"__getInternalProperties",{value:function(){if(arguments[0]===tr)return l}}),l["[[initializedIntlObject]]"]=!0;var c=v(i);a=void 0===a?{}:o(a);var f=new r,g=j(a,"localeMatcher","string",new t("lookup","best fit"),"best fit");f["[[localeMatcher]]"]=g;var h=rr.NumberFormat["[[localeData]]"],p=w(rr.NumberFormat["[[availableLocales]]"],c,f,rr.NumberFormat["[[relevantExtensionKeys]]"],h);l["[[locale]]"]=p["[[locale]]"],l["[[numberingSystem]]"]=p["[[nu]]"],l["[[dataLocale]]"]=p["[[dataLocale]]"];var d=p["[[dataLocale]]"],y=j(a,"style","string",new t("decimal","percent","currency"),"decimal");l["[[style]]"]=y;var b=j(a,"currency","string");if(void 0!==b&&!m(b))throw new RangeError("'"+b+"' is not a valid currency code");if("currency"===y&&void 0===b)throw new TypeError("Currency code is required when style is currency");var k=void 0;"currency"===y&&(b=b.toUpperCase(),l["[[currency]]"]=b,k=P(b));var S=j(a,"currencyDisplay","string",new t("code","symbol","name"),"symbol");"currency"===y&&(l["[[currencyDisplay]]"]=S),O(l,a,"currency"===y?k:0),void 0===l["[[maximumFractionDigits]]"]&&(l["[[maximumFractionDigits]]"]="currency"===y?Math.max(l["[[minimumFractionDigits]]"],k):"percent"===y?Math.max(l["[[minimumFractionDigits]]"],0):Math.max(l["[[minimumFractionDigits]]"],3));var x=j(a,"useGrouping","boolean",void 0,!0);l["[[useGrouping]]"]=x;var z=h[d],D=z.patterns,F=D[y];return l["[[positivePattern]]"]=F.positivePattern,l["[[negativePattern]]"]=F.negativePattern,l["[[boundFormat]]"]=void 0,l["[[initializedNumberFormat]]"]=!0,Be&&(e.format=E.call(e)),u(),e}function P(e){return void 0!==mr[e]?mr[e]:2}function E(){var e=null!==this&&"object"===Ze.typeof(this)&&s(this);if(!e||!e["[[initializedNumberFormat]]"])throw new TypeError("`this` value for format() is not an initialized Intl.NumberFormat object.");if(void 0===e["[[boundFormat]]"]){var r=function(e){return R(this,Number(e))},t=er.call(r,this);e["[[boundFormat]]"]=t}return e["[[boundFormat]]"]}function L(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0,r=null!==this&&"object"===Ze.typeof(this)&&s(this);if(!r||!r["[[initializedNumberFormat]]"])throw new TypeError("`this` value for formatToParts() is not an initialized Intl.NumberFormat object.");return _(this,Number(e))}function _(e,r){for(var t=I(e,r),n=[],o=0,i=0;t.length>i;i++){var a=t[i],l={};l.type=a["[[type]]"],l.value=a["[[value]]"],n[o]=l,o+=1}return n}function T(e,r){var t=s(e);return Ue.call(t,"[[minimumSignificantDigits]]")&&Ue.call(t,"[[maximumSignificantDigits]]")?M(r,t["[[minimumSignificantDigits]]"],t["[[maximumSignificantDigits]]"]):A(r,t["[[minimumIntegerDigits]]"],t["[[minimumFractionDigits]]"],t["[[maximumFractionDigits]]"])}function I(e,r){var n=s(e),o=n["[[dataLocale]]"],i=n["[[numberingSystem]]"],a=rr.NumberFormat["[[localeData]]"][o],l=a.symbols[i]||a.symbols.latn,u=void 0;!isNaN(r)&&r<0?(r=-r,u=n["[[negativePattern]]"]):u=n["[[positivePattern]]"];for(var c=new t,f=u.indexOf("{",0),g=0,h=0,m=u.length;f>-1&&f<m;){if(-1===(g=u.indexOf("}",f)))throw new Error;if(f>h){var v=u.substring(h,f);Ve.call(c,{"[[type]]":"literal","[[value]]":v})}var p=u.substring(f+1,g);if("number"===p)if(isNaN(r)){var d=l.nan;Ve.call(c,{"[[type]]":"nan","[[value]]":d})}else if(isFinite(r)){"percent"===n["[[style]]"]&&(r*=100);var y=T(e,r);vr[i]?function(){var e=vr[i];y=String(y).replace(/\d/g,function(r){return e[r]})}():y=String(y);var b=void 0,w=void 0,k=y.indexOf(".",0);if(k>0?(b=y.substring(0,k),w=y.substring(k+1,k.length)):(b=y,w=void 0),!0===n["[[useGrouping]]"]){var S=l.group,x=[],j=a.patterns.primaryGroupSize||3,z=a.patterns.secondaryGroupSize||j;if(b.length>j){var D=b.length-j,F=D%z,O=b.slice(0,F);for(O.length&&Ve.call(x,O);F<D;)Ve.call(x,b.slice(F,F+z)),F+=z;Ve.call(x,b.slice(D))}else Ve.call(x,b);if(0===x.length)throw new Error;for(;x.length;){var N=Qe.call(x);Ve.call(c,{"[[type]]":"integer","[[value]]":N}),x.length&&Ve.call(c,{"[[type]]":"group","[[value]]":S})}}else Ve.call(c,{"[[type]]":"integer","[[value]]":b});if(void 0!==w){var P=l.decimal;Ve.call(c,{"[[type]]":"decimal","[[value]]":P}),Ve.call(c,{"[[type]]":"fraction","[[value]]":w})}}else{var E=l.infinity;Ve.call(c,{"[[type]]":"infinity","[[value]]":E})}else if("plusSign"===p){var L=l.plusSign;Ve.call(c,{"[[type]]":"plusSign","[[value]]":L})}else if("minusSign"===p){var _=l.minusSign;Ve.call(c,{"[[type]]":"minusSign","[[value]]":_})}else if("percentSign"===p&&"percent"===n["[[style]]"]){var I=l.percentSign;Ve.call(c,{"[[type]]":"literal","[[value]]":I})}else if("currency"===p&&"currency"===n["[[style]]"]){var R=n["[[currency]]"],M=void 0;"code"===n["[[currencyDisplay]]"]?M=R:"symbol"===n["[[currencyDisplay]]"]?M=a.currencies[R]||R:"name"===n["[[currencyDisplay]]"]&&(M=R),Ve.call(c,{"[[type]]":"currency","[[value]]":M})}else{var A=u.substring(f,g);Ve.call(c,{"[[type]]":"literal","[[value]]":A})}h=g+1,f=u.indexOf("{",h)}if(h<m){var q=u.substring(h,m);Ve.call(c,{"[[type]]":"literal","[[value]]":q})}return c}function R(e,r){for(var t=I(e,r),n="",o=0;t.length>o;o++){n+=t[o]["[[value]]"]}return n}function M(r,t,n){var o=n,i=void 0,a=void 0;if(0===r)i=Je.call(Array(o+1),"0"),a=0;else{a=e(Math.abs(r));var l=Math.round(Math.exp(Math.abs(a-o+1)*Math.LN10));i=String(Math.round(a-o+1<0?r*l:r/l))}if(a>=o)return i+Je.call(Array(a-o+1+1),"0");if(a===o-1)return i;if(a>=0?i=i.slice(0,a+1)+"."+i.slice(a+1):a<0&&(i="0."+Je.call(Array(1-(a+1)),"0")+i),i.indexOf(".")>=0&&n>t){for(var s=n-t;s>0&&"0"===i.charAt(i.length-1);)i=i.slice(0,-1),s--;"."===i.charAt(i.length-1)&&(i=i.slice(0,-1))}return i}function A(e,r,t,n){var o=n,i=Math.pow(10,o)*e,a=0===i?"0":i.toFixed(0),l=void 0,s=(l=a.indexOf("e"))>-1?a.slice(l+1):0;s&&(a=a.slice(0,l).replace(".",""),a+=Je.call(Array(s-(a.length-1)+1),"0"));var u=void 0;if(0!==o){var c=a.length;if(c<=o){a=Je.call(Array(o+1-c+1),"0")+a,c=o+1}var f=a.substring(0,c-o);a=f+"."+a.substring(c-o,a.length),u=f.length}else u=a.length;for(var g=n-t;g>0&&"0"===a.slice(-1);)a=a.slice(0,-1),g--;if("."===a.slice(-1)&&(a=a.slice(0,-1)),u<r){a=Je.call(Array(r-u+1),"0")+a}return a}function q(e){for(var r=0;r<wr.length;r+=1)if(e.hasOwnProperty(wr[r]))return!1;return!0}function C(e){for(var r=0;r<br.length;r+=1)if(e.hasOwnProperty(br[r]))return!1;return!0}function G(e,r){for(var t={_:{}},n=0;n<br.length;n+=1)e[br[n]]&&(t[br[n]]=e[br[n]]),e._[br[n]]&&(t._[br[n]]=e._[br[n]]);for(var o=0;o<wr.length;o+=1)r[wr[o]]&&(t[wr[o]]=r[wr[o]]),r._[wr[o]]&&(t._[wr[o]]=r._[wr[o]]);return t}function Z(e){return e.pattern12=e.extendedPattern.replace(/'([^']*)'/g,function(e,r){return r||"'"}),e.pattern=e.pattern12.replace("{ampm}","").replace(dr,""),e}function $(e,r){switch(e.charAt(0)){case"G":return r.era=["short","short","short","long","narrow"][e.length-1],"{era}";case"y":case"Y":case"u":case"U":case"r":return r.year=2===e.length?"2-digit":"numeric","{year}";case"Q":case"q":return r.quarter=["numeric","2-digit","short","long","narrow"][e.length-1],"{quarter}";case"M":case"L":return r.month=["numeric","2-digit","short","long","narrow"][e.length-1],"{month}";case"w":return r.week=2===e.length?"2-digit":"numeric","{weekday}";case"W":return r.week="numeric","{weekday}";case"d":return r.day=2===e.length?"2-digit":"numeric","{day}";case"D":case"F":case"g":return r.day="numeric","{day}";case"E":return r.weekday=["short","short","short","long","narrow","short"][e.length-1],"{weekday}";case"e":return r.weekday=["numeric","2-digit","short","long","narrow","short"][e.length-1],"{weekday}";case"c":return r.weekday=["numeric",void 0,"short","long","narrow","short"][e.length-1],"{weekday}";case"a":case"b":case"B":return r.hour12=!0,"{ampm}";case"h":case"H":return r.hour=2===e.length?"2-digit":"numeric","{hour}";case"k":case"K":return r.hour12=!0,r.hour=2===e.length?"2-digit":"numeric","{hour}";case"m":return r.minute=2===e.length?"2-digit":"numeric","{minute}";case"s":return r.second=2===e.length?"2-digit":"numeric","{second}";case"S":case"A":return r.second="numeric","{second}";case"z":case"Z":case"O":case"v":case"V":case"X":case"x":return r.timeZoneName=e.length<4?"short":"long","{timeZoneName}"}}function B(e,r){if(!yr.test(r)){var t={originalPattern:r,_:{}};return t.extendedPattern=r.replace(pr,function(e){return $(e,t._)}),e.replace(pr,function(e){return $(e,t)}),Z(t)}}function U(e){var r=e.availableFormats,t=e.timeFormats,n=e.dateFormats,o=[],i=void 0,a=void 0,l=void 0,s=void 0,u=void 0,c=[],f=[];for(i in r)r.hasOwnProperty(i)&&(a=r[i],(l=B(i,a))&&(o.push(l),q(l)?f.push(l):C(l)&&c.push(l)));for(i in t)t.hasOwnProperty(i)&&(a=t[i],(l=B(i,a))&&(o.push(l),c.push(l)));for(i in n)n.hasOwnProperty(i)&&(a=n[i],(l=B(i,a))&&(o.push(l),f.push(l)));for(s=0;s<c.length;s+=1)for(u=0;u<f.length;u+=1)a="long"===f[u].month?f[u].weekday?e.full:e.long:"short"===f[u].month?e.medium:e.short,l=G(f[u],c[s]),l.originalPattern=a,l.extendedPattern=a.replace("{0}",c[s].extendedPattern).replace("{1}",f[u].extendedPattern).replace(/^[,\s]+|[,\s]+$/gi,""),o.push(Z(l));return o}function K(e,r){if(kr[e]&&kr[e][r]){var t;return t={originalPattern:kr[e][r],_:ke({},e,r),extendedPattern:"{"+e+"}"},ke(t,e,r),ke(t,"pattern12","{"+e+"}"),ke(t,"pattern","{"+e+"}"),t}}function Y(e,r,t,n,o){var i=e[r]&&e[r][t]?e[r][t]:e.gregory[t],a={narrow:["short","long"],short:["long","narrow"],long:["short","narrow"]},l=Ue.call(i,n)?i[n]:Ue.call(i,a[n][0])?i[a[n][0]]:i[a[n][1]];return null!==o?l[o]:l}function H(){var e=arguments[0],r=arguments[1];return this&&this!==hr?W(o(this),e,r):new hr.DateTimeFormat(e,r)}function W(e,o,i){var a=s(e),l=n();if(!0===a["[[initializedIntlObject]]"])throw new TypeError("`this` object has already been initialized as an Intl object");Ke(e,"__getInternalProperties",{value:function(){if(arguments[0]===tr)return a}}),a["[[initializedIntlObject]]"]=!0;var u=v(o);i=V(i,"any","date");var f=new r,g=j(i,"localeMatcher","string",new t("lookup","best fit"),"best fit");f["[[localeMatcher]]"]=g;var h=rr.DateTimeFormat,m=h["[[localeData]]"],p=w(h["[[availableLocales]]"],u,f,h["[[relevantExtensionKeys]]"],m);a["[[locale]]"]=p["[[locale]]"],a["[[calendar]]"]=p["[[ca]]"],a["[[numberingSystem]]"]=p["[[nu]]"],a["[[dataLocale]]"]=p["[[dataLocale]]"];var d=p["[[dataLocale]]"],y=i.timeZone;if(void 0!==y&&"UTC"!==(y=c(y)))throw new RangeError("timeZone is not supported.");a["[[timeZone]]"]=y,f=new r;for(var b in xr)if(Ue.call(xr,b)){var k=j(i,b,"string",xr[b]);f["[["+b+"]]"]=k}var S=void 0,x=m[d],z=X(x.formats);if(g=j(i,"formatMatcher","string",new t("basic","best fit"),"best fit"),x.formats=z,"basic"===g)S=J(f,z);else{var D=j(i,"hour12","boolean");f.hour12=void 0===D?x.hour12:D,S=Q(f,z)}for(var F in xr)if(Ue.call(xr,F)&&Ue.call(S,F)){var O=S[F];O=S._&&Ue.call(S._,F)?S._[F]:O,a["[["+F+"]]"]=O}var N=void 0,P=j(i,"hour12","boolean");if(a["[[hour]]"])if(P=void 0===P?x.hour12:P,a["[[hour12]]"]=P,!0===P){var E=x.hourNo0;a["[[hourNo0]]"]=E,N=S.pattern12}else N=S.pattern;else N=S.pattern;return a["[[pattern]]"]=N,a["[[boundFormat]]"]=void 0,a["[[initializedDateTimeFormat]]"]=!0,Be&&(e.format=ee.call(e)),l(),e}function X(e){return"[object Array]"===Object.prototype.toString.call(e)?e:U(e)}function V(e,t,n){if(void 0===e)e=null;else{var i=o(e);e=new r;for(var a in i)e[a]=i[a]}e=He(e);var l=!0;return"date"!==t&&"any"!==t||void 0===e.weekday&&void 0===e.year&&void 0===e.month&&void 0===e.day||(l=!1),"time"!==t&&"any"!==t||void 0===e.hour&&void 0===e.minute&&void 0===e.second||(l=!1),!l||"date"!==n&&"all"!==n||(e.year=e.month=e.day="numeric"),!l||"time"!==n&&"all"!==n||(e.hour=e.minute=e.second="numeric"),e}function J(e,r){for(var t=-1/0,n=void 0,o=0,i=r.length;o<i;){var a=r[o],l=0;for(var s in xr)if(Ue.call(xr,s)){var u=e["[["+s+"]]"],c=Ue.call(a,s)?a[s]:void 0;if(void 0===u&&void 0!==c)l-=20;else if(void 0!==u&&void 0===c)l-=120;else{var f=["2-digit","numeric","narrow","short","long"],g=Ye.call(f,u),h=Ye.call(f,c),m=Math.max(Math.min(h-g,2),-2);2===m?l-=6:1===m?l-=3:-1===m?l-=6:-2===m&&(l-=8)}}l>t&&(t=l,n=a),o++}return n}function Q(e,r){var t=[];for(var n in xr)Ue.call(xr,n)&&void 0!==e["[["+n+"]]"]&&t.push(n);if(1===t.length){var o=K(t[0],e["[["+t[0]+"]]"]);if(o)return o}for(var i=-1/0,a=void 0,l=0,s=r.length;l<s;){var u=r[l],c=0;for(var f in xr)if(Ue.call(xr,f)){var g=e["[["+f+"]]"],h=Ue.call(u,f)?u[f]:void 0,m=Ue.call(u._,f)?u._[f]:void 0;if(g!==m&&(c-=2),void 0===g&&void 0!==h)c-=20;else if(void 0!==g&&void 0===h)c-=120;else{var v=["2-digit","numeric","narrow","short","long"],p=Ye.call(v,g),d=Ye.call(v,h),y=Math.max(Math.min(d-p,2),-2);d<=1&&p>=2||d>=2&&p<=1?y>0?c-=6:y<0&&(c-=8):y>1?c-=3:y<-1&&(c-=6)}}u._.hour12!==e.hour12&&(c-=1),c>i&&(i=c,a=u),l++}return a}function ee(){var e=null!==this&&"object"===Ze.typeof(this)&&s(this);if(!e||!e["[[initializedDateTimeFormat]]"])throw new TypeError("`this` value for format() is not an initialized Intl.DateTimeFormat object.");if(void 0===e["[[boundFormat]]"]){var r=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0;return ne(this,void 0===e?Date.now():i(e))},t=er.call(r,this);e["[[boundFormat]]"]=t}return e["[[boundFormat]]"]}function re(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0,r=null!==this&&"object"===Ze.typeof(this)&&s(this);if(!r||!r["[[initializedDateTimeFormat]]"])throw new TypeError("`this` value for formatToParts() is not an initialized Intl.DateTimeFormat object.");return oe(this,void 0===e?Date.now():i(e))}function te(e,r){if(!isFinite(r))throw new RangeError("Invalid valid date passed to format");var o=e.__getInternalProperties(tr);n();for(var i=o["[[locale]]"],a=new hr.NumberFormat([i],{useGrouping:!1}),l=new hr.NumberFormat([i],{minimumIntegerDigits:2,useGrouping:!1}),s=ie(r,o["[[calendar]]"],o["[[timeZone]]"]),u=o["[[pattern]]"],c=new t,f=0,g=u.indexOf("{"),h=0,m=o["[[dataLocale]]"],v=rr.DateTimeFormat["[[localeData]]"][m].calendars,p=o["[[calendar]]"];-1!==g;){var d=void 0;if(-1===(h=u.indexOf("}",g)))throw new Error("Unclosed pattern");g>f&&Ve.call(c,{type:"literal",value:u.substring(f,g)});var y=u.substring(g+1,h);if(xr.hasOwnProperty(y)){var b=o["[["+y+"]]"],w=s["[["+y+"]]"];if("year"===y&&w<=0?w=1-w:"month"===y?w++:"hour"===y&&!0===o["[[hour12]]"]&&0===(w%=12)&&!0===o["[[hourNo0]]"]&&(w=12),"numeric"===b)d=R(a,w);else if("2-digit"===b)d=R(l,w),d.length>2&&(d=d.slice(-2));else if(b in Sr)switch(y){case"month":d=Y(v,p,"months",b,s["[["+y+"]]"]);break;case"weekday":try{d=Y(v,p,"days",b,s["[["+y+"]]"])}catch(e){throw new Error("Could not find weekday data for locale "+i)}break;case"timeZoneName":d="";break;case"era":try{d=Y(v,p,"eras",b,s["[["+y+"]]"])}catch(e){throw new Error("Could not find era data for locale "+i)}break;default:d=s["[["+y+"]]"]}Ve.call(c,{type:y,value:d})}else if("ampm"===y){var k=s["[[hour]]"];d=Y(v,p,"dayPeriods",k>11?"pm":"am",null),Ve.call(c,{type:"dayPeriod",value:d})}else Ve.call(c,{type:"literal",value:u.substring(g,h+1)});f=h+1,g=u.indexOf("{",f)}return h<u.length-1&&Ve.call(c,{type:"literal",value:u.substr(h+1)}),c}function ne(e,r){for(var t=te(e,r),n="",o=0;t.length>o;o++){n+=t[o].value}return n}function oe(e,r){for(var t=te(e,r),n=[],o=0;t.length>o;o++){var i=t[o];n.push({type:i.type,value:i.value})}return n}function ie(e,t,n){var o=new Date(e),i="get"+(n||"");return new r({"[[weekday]]":o[i+"Day"](),"[[era]]":+(o[i+"FullYear"]()>=0),"[[year]]":o[i+"FullYear"](),"[[month]]":o[i+"Month"](),"[[day]]":o[i+"Date"](),"[[hour]]":o[i+"Hours"](),"[[minute]]":o[i+"Minutes"](),"[[second]]":o[i+"Seconds"](),"[[inDST]]":!1})}function ae(){var e=arguments[0],r=arguments[1];return this&&this!==hr?le(o(this),e,r):new hr.PluralRules(e,r)}function le(e,n,i){var a=s(e);if(!0===a["[[InitializedIntlObject]]"])throw new TypeError("`this` object has already been initialized as an Intl object");Ke(e,"__getInternalProperties",{value:function(){if(arguments[0]===tr)return a}}),a["[[InitializedIntlObject]]"]=!0;var l=v(n);i=void 0===i?{}:o(i);var u=j(i,"type","string",new t("cardinal","ordinal"),"cardinal");a["[[type]]"]=u;var c=new r,f=j(i,"localeMatcher","string",new t("lookup","best fit"),"best fit");c["[[localeMatcher]]"]=f,O(rr,i,0),void 0===rr["[[maximumFractionDigits]]"]&&(rr["[[maximumFractionDigits]]"]=Math.max(rr["[[minimumFractionDigits]]"],3));var g=rr.PluralRules["[[localeData]]"],h=w(rr.PluralRules["[[availableLocales]]"],l,c,rr.PluralRules["[[relevantExtensionKeys]]"],g);return a["[[locale]]"]=h["[[locale]]"],a["[[InitializedPluralRules]]"]=!0,e}function se(e,r,t){for(var n=e;n;n=n.replace(/[-_]?[^-_]*$/,"")){var o=Dr[n];if(o)return o(t,"ordinal"===r)}return"other"}function ue(e,r){if(!Number.isFinite(r))return"other";var t=s(e);return se(t["[[locale]]"],t["[[type]]"],r)}function ce(e,r){if(!e.number)throw new Error("Object passed doesn't contain locale data for Intl.NumberFormat");var t=void 0,n=[r],o=r.split("-");for(o.length>2&&4===o[1].length&&Ve.call(n,o[0]+"-"+o[2]);t=Qe.call(n);)Ve.call(rr.NumberFormat["[[availableLocales]]"],t),rr.NumberFormat["[[localeData]]"][t]=e.number,e.date&&(e.date.nu=e.number.nu,Ve.call(rr.DateTimeFormat["[[availableLocales]]"],t),rr.DateTimeFormat["[[localeData]]"][t]=e.date);void 0===ur&&u(r)}var fe="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},ge=function(){var e="function"==typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103;return function(r,t,n,o){var i=r&&r.defaultProps,a=arguments.length-3;if(t||0===a||(t={}),t&&i)for(var l in i)void 0===t[l]&&(t[l]=i[l]);else t||(t=i||{});if(1===a)t.children=o;else if(a>1){for(var s=Array(a),u=0;u<a;u++)s[u]=arguments[u+3];t.children=s}return{$$typeof:e,type:r,key:void 0===n?null:""+n,ref:null,props:t,_owner:null}}}(),he=function(e){if("function"==typeof Symbol){if(Symbol.asyncIterator){var r=e[Symbol.asyncIterator];if(null!=r)return r.call(e)}if(Symbol.iterator)return e[Symbol.iterator]()}throw new TypeError("Object is not async iterable")},me=function(){function e(e){this.value=e}function r(r){function t(e,r){return new Promise(function(t,o){var l={key:e,arg:r,resolve:t,reject:o,next:null};a?a=a.next=l:(i=a=l,n(e,r))})}function n(t,i){try{var a=r[t](i),l=a.value;l instanceof e?Promise.resolve(l.value).then(function(e){n("next",e)},function(e){n("throw",e)}):o(a.done?"return":"normal",a.value)}catch(e){o("throw",e)}}function o(e,r){switch(e){case"return":i.resolve({value:r,done:!0});break;case"throw":i.reject(r);break;default:i.resolve({value:r,done:!1})}i=i.next,i?n(i.key,i.arg):a=null}var i,a;this._invoke=t,"function"!=typeof r.return&&(this.return=void 0)}return"function"==typeof Symbol&&Symbol.asyncIterator&&(r.prototype[Symbol.asyncIterator]=function(){return this}),r.prototype.next=function(e){return this._invoke("next",e)},r.prototype.throw=function(e){return this._invoke("throw",e)},r.prototype.return=function(e){return this._invoke("return",e)},{wrap:function(e){return function(){return new r(e.apply(this,arguments))}},await:function(r){return new e(r)}}}(),ve=function(e,r){function t(t,n){return o=!0,n=new Promise(function(r){r(e[t](n))}),{done:!1,value:r(n)}}var n={},o=!1;return"function"==typeof Symbol&&Symbol.iterator&&(n[Symbol.iterator]=function(){return this}),n.next=function(e){return o?(o=!1,e):t("next",e)},"function"==typeof e.throw&&(n.throw=function(e){if(o)throw o=!1,e;return t("throw",e)}),"function"==typeof e.return&&(n.return=function(e){return t("return",e)}),n},pe=function(e){return function(){var r=e.apply(this,arguments);return new Promise(function(e,t){function n(o,i){try{var a=r[o](i),l=a.value}catch(e){return void t(e)}if(!a.done)return Promise.resolve(l).then(function(e){n("next",e)},function(e){n("throw",e)});e(l)}return n("next")})}},de=function(e,r){if(!(e instanceof r))throw new TypeError("Cannot call a class as a function")},ye=function(){function e(e,r){for(var t=0;t<r.length;t++){var n=r[t];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(r,t,n){return t&&e(r.prototype,t),n&&e(r,n),r}}(),be=function(e,r){for(var t in r){var n=r[t];n.configurable=n.enumerable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,t,n)}return e},we=function(e,r){for(var t=Object.getOwnPropertyNames(r),n=0;n<t.length;n++){var o=t[n],i=Object.getOwnPropertyDescriptor(r,o);i&&i.configurable&&void 0===e[o]&&Object.defineProperty(e,o,i)}return e},ke=function(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e},Se=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},xe=function e(r,t,n){null===r&&(r=Function.prototype);var o=Object.getOwnPropertyDescriptor(r,t);if(void 0===o){var i=Object.getPrototypeOf(r);return null===i?void 0:e(i,t,n)}if("value"in o)return o.value;var a=o.get;if(void 0!==a)return a.call(n)},je=function(e,r){if("function"!=typeof r&&null!==r)throw new TypeError("Super expression must either be null or a function, not "+typeof r);e.prototype=Object.create(r&&r.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),r&&(Object.setPrototypeOf?Object.setPrototypeOf(e,r):e.__proto__=r)},ze=function(e,r){return null!=r&&"undefined"!=typeof Symbol&&r[Symbol.hasInstance]?r[Symbol.hasInstance](e):e instanceof r},De=function(e){return e&&e.__esModule?e:{default:e}},Fe=function(e){if(e&&e.__esModule)return e;var r={};if(null!=e)for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r[t]=e[t]);return r.default=e,r},Oe=function(e,r){if(e!==r)throw new TypeError("Cannot instantiate an arrow function")},Ne=function(e){if(null==e)throw new TypeError("Cannot destructure undefined")},Pe=function(e,r){var t={};for(var n in e)r.indexOf(n)>=0||Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t},Ee=function(e,r){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!r||"object"!=typeof r&&"function"!=typeof r?e:r},Le="undefined"==typeof global?self:global,_e=function e(r,t,n,o){var i=Object.getOwnPropertyDescriptor(r,t);if(void 0===i){var a=Object.getPrototypeOf(r);null!==a&&e(a,t,n,o)}else if("value"in i&&i.writable)i.value=n;else{var l=i.set;void 0!==l&&l.call(o,n)}return n},Te=function(){function e(e,r){var t=[],n=!0,o=!1,i=void 0;try{for(var a,l=e[Symbol.iterator]();!(n=(a=l.next()).done)&&(t.push(a.value),!r||t.length!==r);n=!0);}catch(e){o=!0,i=e}finally{try{!n&&l.return&&l.return()}finally{if(o)throw i}}return t}return function(r,t){if(Array.isArray(r))return r;if(Symbol.iterator in Object(r))return e(r,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),Ie=function(e,r){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e)){for(var t,n=[],o=e[Symbol.iterator]();!(t=o.next()).done&&(n.push(t.value),!r||n.length!==r););return n}throw new TypeError("Invalid attempt to destructure non-iterable instance")},Re=function(e,r){return Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(r)}}))},Me=function(e,r){return e.raw=r,e},Ae=function(e,r,t){if(e===t)throw new ReferenceError(r+" is not defined - temporal dead zone");return e},qe={},Ce=function(e){return Array.isArray(e)?e:Array.from(e)},Ge=function(e){if(Array.isArray(e)){for(var r=0,t=Array(e.length);r<e.length;r++)t[r]=e[r];return t}return Array.from(e)},Ze=Object.freeze({jsx:ge,asyncIterator:he,asyncGenerator:me,asyncGeneratorDelegate:ve,asyncToGenerator:pe,classCallCheck:de,createClass:ye,defineEnumerableProperties:be,defaults:we,defineProperty:ke,get:xe,inherits:je,interopRequireDefault:De,interopRequireWildcard:Fe,newArrowCheck:Oe,objectDestructuringEmpty:Ne,objectWithoutProperties:Pe,possibleConstructorReturn:Ee,selfGlobal:Le,set:_e,slicedToArray:Te,slicedToArrayLoose:Ie,taggedTemplateLiteral:Re,taggedTemplateLiteralLoose:Me,temporalRef:Ae,temporalUndefined:qe,toArray:Ce,toConsumableArray:Ge,typeof:fe,extends:Se,instanceof:ze}),$e=function(){var e=function(){};try{return Object.defineProperty(e,"a",{get:function(){return 1}}),Object.defineProperty(e,"prototype",{writable:!1}),1===e.a&&e.prototype instanceof Object}catch(e){return!1}}(),Be=!$e&&!Object.prototype.__defineGetter__,Ue=Object.prototype.hasOwnProperty,Ke=$e?Object.defineProperty:function(e,r,t){"get"in t&&e.__defineGetter__?e.__defineGetter__(r,t.get):(!Ue.call(e,r)||"value"in t)&&(e[r]=t.value)},Ye=Array.prototype.indexOf||function(e){var r=this;if(!r.length)return-1;for(var t=arguments[1]||0,n=r.length;t<n;t++)if(r[t]===e)return t;return-1},He=Object.create||function(e,r){function t(){}var n=void 0;t.prototype=e,n=new t;for(var o in r)Ue.call(r,o)&&Ke(n,o,r[o]);return n},We=Array.prototype.slice,Xe=Array.prototype.concat,Ve=Array.prototype.push,Je=Array.prototype.join,Qe=Array.prototype.shift,er=Function.prototype.bind||function(e){var r=this,t=We.call(arguments,1);return r.length,function(){return r.apply(e,Xe.call(t,We.call(arguments)))}},rr=He(null),tr=Math.random();r.prototype=He(null),t.prototype=He(null) +;var nr="(?:[a-z0-9]{5,8}|\\d[a-z0-9]{3})",or="[0-9a-wy-z](?:-[a-z0-9]{2,8})+",ir=RegExp("^(?:(?:[a-z]{2,3}(?:-[a-z]{3}(?:-[a-z]{3}){0,2})?|[a-z]{4}|[a-z]{5,8})(?:-[a-z]{4})?(?:-(?:[a-z]{2}|\\d{3}))?(?:-"+nr+")*(?:-"+or+")*(?:-x(?:-[a-z0-9]{1,8})+)?|x(?:-[a-z0-9]{1,8})+|(?:(?:en-GB-oed|i-(?:ami|bnn|default|enochian|hak|klingon|lux|mingo|navajo|pwn|tao|tay|tsu)|sgn-(?:BE-FR|BE-NL|CH-DE))|(?:art-lojban|cel-gaulish|no-bok|no-nyn|zh-(?:guoyu|hakka|min|min-nan|xiang))))$","i"),ar=RegExp("^(?!x).*?-("+nr+")-(?:\\w{4,8}-(?!x-))*\\1\\b","i"),lr=RegExp("^(?!x).*?-([0-9a-wy-z])-(?:\\w+-(?!x-))*\\1\\b","i"),sr=RegExp("-"+or,"ig"),ur=void 0,cr={tags:{"art-lojban":"jbo","i-ami":"ami","i-bnn":"bnn","i-hak":"hak","i-klingon":"tlh","i-lux":"lb","i-navajo":"nv","i-pwn":"pwn","i-tao":"tao","i-tay":"tay","i-tsu":"tsu","no-bok":"nb","no-nyn":"nn","sgn-BE-FR":"sfb","sgn-BE-NL":"vgt","sgn-CH-DE":"sgg","zh-guoyu":"cmn","zh-hakka":"hak","zh-min-nan":"nan","zh-xiang":"hsn","sgn-BR":"bzs","sgn-CO":"csn","sgn-DE":"gsg","sgn-DK":"dsl","sgn-ES":"ssp","sgn-FR":"fsl","sgn-GB":"bfi","sgn-GR":"gss","sgn-IE":"isg","sgn-IT":"ise","sgn-JP":"jsl","sgn-MX":"mfs","sgn-NI":"ncs","sgn-NL":"dse","sgn-NO":"nsl","sgn-PT":"psr","sgn-SE":"swl","sgn-US":"ase","sgn-ZA":"sfs","zh-cmn":"cmn","zh-cmn-Hans":"cmn-Hans","zh-cmn-Hant":"cmn-Hant","zh-gan":"gan","zh-wuu":"wuu","zh-yue":"yue"},subtags:{BU:"MM",DD:"DE",FX:"FR",TP:"TL",YD:"YE",ZR:"CD",heploc:"alalc97",in:"id",iw:"he",ji:"yi",jw:"jv",mo:"ro",ayx:"nun",bjd:"drl",ccq:"rki",cjr:"mom",cka:"cmr",cmk:"xch",drh:"khk",drw:"prs",gav:"dev",hrr:"jal",ibi:"opa",kgh:"kml",lcq:"ppr",mst:"mry",myt:"mry",sca:"hle",tie:"ras",tkk:"twm",tlw:"weo",tnf:"prs",ybd:"rki",yma:"lrr"},extLang:{aao:["aao","ar"],abh:["abh","ar"],abv:["abv","ar"],acm:["acm","ar"],acq:["acq","ar"],acw:["acw","ar"],acx:["acx","ar"],acy:["acy","ar"],adf:["adf","ar"],ads:["ads","sgn"],aeb:["aeb","ar"],aec:["aec","ar"],aed:["aed","sgn"],aen:["aen","sgn"],afb:["afb","ar"],afg:["afg","sgn"],ajp:["ajp","ar"],apc:["apc","ar"],apd:["apd","ar"],arb:["arb","ar"],arq:["arq","ar"],ars:["ars","ar"],ary:["ary","ar"],arz:["arz","ar"],ase:["ase","sgn"],asf:["asf","sgn"],asp:["asp","sgn"],asq:["asq","sgn"],asw:["asw","sgn"],auz:["auz","ar"],avl:["avl","ar"],ayh:["ayh","ar"],ayl:["ayl","ar"],ayn:["ayn","ar"],ayp:["ayp","ar"],bbz:["bbz","ar"],bfi:["bfi","sgn"],bfk:["bfk","sgn"],bjn:["bjn","ms"],bog:["bog","sgn"],bqn:["bqn","sgn"],bqy:["bqy","sgn"],btj:["btj","ms"],bve:["bve","ms"],bvl:["bvl","sgn"],bvu:["bvu","ms"],bzs:["bzs","sgn"],cdo:["cdo","zh"],cds:["cds","sgn"],cjy:["cjy","zh"],cmn:["cmn","zh"],coa:["coa","ms"],cpx:["cpx","zh"],csc:["csc","sgn"],csd:["csd","sgn"],cse:["cse","sgn"],csf:["csf","sgn"],csg:["csg","sgn"],csl:["csl","sgn"],csn:["csn","sgn"],csq:["csq","sgn"],csr:["csr","sgn"],czh:["czh","zh"],czo:["czo","zh"],doq:["doq","sgn"],dse:["dse","sgn"],dsl:["dsl","sgn"],dup:["dup","ms"],ecs:["ecs","sgn"],esl:["esl","sgn"],esn:["esn","sgn"],eso:["eso","sgn"],eth:["eth","sgn"],fcs:["fcs","sgn"],fse:["fse","sgn"],fsl:["fsl","sgn"],fss:["fss","sgn"],gan:["gan","zh"],gds:["gds","sgn"],gom:["gom","kok"],gse:["gse","sgn"],gsg:["gsg","sgn"],gsm:["gsm","sgn"],gss:["gss","sgn"],gus:["gus","sgn"],hab:["hab","sgn"],haf:["haf","sgn"],hak:["hak","zh"],hds:["hds","sgn"],hji:["hji","ms"],hks:["hks","sgn"],hos:["hos","sgn"],hps:["hps","sgn"],hsh:["hsh","sgn"],hsl:["hsl","sgn"],hsn:["hsn","zh"],icl:["icl","sgn"],ils:["ils","sgn"],inl:["inl","sgn"],ins:["ins","sgn"],ise:["ise","sgn"],isg:["isg","sgn"],isr:["isr","sgn"],jak:["jak","ms"],jax:["jax","ms"],jcs:["jcs","sgn"],jhs:["jhs","sgn"],jls:["jls","sgn"],jos:["jos","sgn"],jsl:["jsl","sgn"],jus:["jus","sgn"],kgi:["kgi","sgn"],knn:["knn","kok"],kvb:["kvb","ms"],kvk:["kvk","sgn"],kvr:["kvr","ms"],kxd:["kxd","ms"],lbs:["lbs","sgn"],lce:["lce","ms"],lcf:["lcf","ms"],liw:["liw","ms"],lls:["lls","sgn"],lsg:["lsg","sgn"],lsl:["lsl","sgn"],lso:["lso","sgn"],lsp:["lsp","sgn"],lst:["lst","sgn"],lsy:["lsy","sgn"],ltg:["ltg","lv"],lvs:["lvs","lv"],lzh:["lzh","zh"],max:["max","ms"],mdl:["mdl","sgn"],meo:["meo","ms"],mfa:["mfa","ms"],mfb:["mfb","ms"],mfs:["mfs","sgn"],min:["min","ms"],mnp:["mnp","zh"],mqg:["mqg","ms"],mre:["mre","sgn"],msd:["msd","sgn"],msi:["msi","ms"],msr:["msr","sgn"],mui:["mui","ms"],mzc:["mzc","sgn"],mzg:["mzg","sgn"],mzy:["mzy","sgn"],nan:["nan","zh"],nbs:["nbs","sgn"],ncs:["ncs","sgn"],nsi:["nsi","sgn"],nsl:["nsl","sgn"],nsp:["nsp","sgn"],nsr:["nsr","sgn"],nzs:["nzs","sgn"],okl:["okl","sgn"],orn:["orn","ms"],ors:["ors","ms"],pel:["pel","ms"],pga:["pga","ar"],pks:["pks","sgn"],prl:["prl","sgn"],prz:["prz","sgn"],psc:["psc","sgn"],psd:["psd","sgn"],pse:["pse","ms"],psg:["psg","sgn"],psl:["psl","sgn"],pso:["pso","sgn"],psp:["psp","sgn"],psr:["psr","sgn"],pys:["pys","sgn"],rms:["rms","sgn"],rsi:["rsi","sgn"],rsl:["rsl","sgn"],sdl:["sdl","sgn"],sfb:["sfb","sgn"],sfs:["sfs","sgn"],sgg:["sgg","sgn"],sgx:["sgx","sgn"],shu:["shu","ar"],slf:["slf","sgn"],sls:["sls","sgn"],sqk:["sqk","sgn"],sqs:["sqs","sgn"],ssh:["ssh","ar"],ssp:["ssp","sgn"],ssr:["ssr","sgn"],svk:["svk","sgn"],swc:["swc","sw"],swh:["swh","sw"],swl:["swl","sgn"],syy:["syy","sgn"],tmw:["tmw","ms"],tse:["tse","sgn"],tsm:["tsm","sgn"],tsq:["tsq","sgn"],tss:["tss","sgn"],tsy:["tsy","sgn"],tza:["tza","sgn"],ugn:["ugn","sgn"],ugy:["ugy","sgn"],ukl:["ukl","sgn"],uks:["uks","sgn"],urk:["urk","ms"],uzn:["uzn","uz"],uzs:["uzs","uz"],vgt:["vgt","sgn"],vkk:["vkk","ms"],vkt:["vkt","ms"],vsi:["vsi","sgn"],vsl:["vsl","sgn"],vsv:["vsv","sgn"],wuu:["wuu","zh"],xki:["xki","sgn"],xml:["xml","sgn"],xmm:["xmm","ms"],xms:["xms","sgn"],yds:["yds","sgn"],ysl:["ysl","sgn"],yue:["yue","zh"],zib:["zib","sgn"],zlm:["zlm","ms"],zmi:["zmi","ms"],zsl:["zsl","sgn"],zsm:["zsm","ms"]}},fr=/^[A-Z]{3}$/,gr=/-u(?:-[0-9a-z]{2,8})+/gi,hr={};Object.defineProperty(hr,"getCanonicalLocales",{enumerable:!1,configurable:!0,writable:!0,value:D});var mr={BHD:3,BYR:0,XOF:0,BIF:0,XAF:0,CLF:4,CLP:0,KMF:0,DJF:0,XPF:0,GNF:0,ISK:0,IQD:3,JPY:0,JOD:3,KRW:0,KWD:3,LYD:3,OMR:3,PYG:0,RWF:0,TND:3,UGX:0,UYI:0,VUV:0,VND:0};Ke(hr,"NumberFormat",{configurable:!0,writable:!0,value:F}),Ke(hr.NumberFormat,"prototype",{writable:!1}),rr.NumberFormat={"[[availableLocales]]":[],"[[relevantExtensionKeys]]":["nu"],"[[localeData]]":{}},Ke(hr.NumberFormat,"supportedLocalesOf",{configurable:!0,writable:!0,value:er.call(function(e){if(!Ue.call(this,"[[availableLocales]]"))throw new TypeError("supportedLocalesOf() is not a constructor");var r=n(),t=arguments[1],o=this["[[availableLocales]]"],i=v(e);return r(),x(o,i,t)},rr.NumberFormat)}),Ke(hr.NumberFormat.prototype,"format",{configurable:!0,get:E}),Object.defineProperty(hr.NumberFormat.prototype,"formatToParts",{configurable:!0,enumerable:!1,writable:!0,value:L});var vr={arab:["٠","١","٢","٣","٤","٥","٦","٧","٨","٩"],arabext:["۰","۱","۲","۳","۴","۵","۶","۷","۸","۹"],bali:["᭐","᭑","᭒","᭓","᭔","᭕","᭖","᭗","᭘","᭙"],beng:["০","১","২","৩","৪","৫","৬","৭","৮","৯"],deva:["०","१","२","३","४","५","६","७","८","९"],fullwide:["0","1","2","3","4","5","6","7","8","9"],gujr:["૦","૧","૨","૩","૪","૫","૬","૭","૮","૯"],guru:["੦","੧","੨","੩","੪","੫","੬","੭","੮","੯"],hanidec:["〇","一","二","三","四","五","六","七","八","九"],khmr:["០","១","២","៣","៤","៥","៦","៧","៨","៩"],knda:["೦","೧","೨","೩","೪","೫","೬","೭","೮","೯"],laoo:["໐","໑","໒","໓","໔","໕","໖","໗","໘","໙"],latn:["0","1","2","3","4","5","6","7","8","9"],limb:["᥆","᥇","᥈","᥉","᥊","᥋","᥌","᥍","᥎","᥏"],mlym:["൦","൧","൨","൩","൪","൫","൬","൭","൮","൯"],mong:["᠐","᠑","᠒","᠓","᠔","᠕","᠖","᠗","᠘","᠙"],mymr:["၀","၁","၂","၃","၄","၅","၆","၇","၈","၉"],orya:["୦","୧","୨","୩","୪","୫","୬","୭","୮","୯"],tamldec:["௦","௧","௨","௩","௪","௫","௬","௭","௮","௯"],telu:["౦","౧","౨","౩","౪","౫","౬","౭","౮","౯"],thai:["๐","๑","๒","๓","๔","๕","๖","๗","๘","๙"],tibt:["༠","༡","༢","༣","༤","༥","༦","༧","༨","༩"]};Ke(hr.NumberFormat.prototype,"resolvedOptions",{configurable:!0,writable:!0,value:function(){var e=void 0,t=new r,n=["locale","numberingSystem","style","currency","currencyDisplay","minimumIntegerDigits","minimumFractionDigits","maximumFractionDigits","minimumSignificantDigits","maximumSignificantDigits","useGrouping"],o=null!==this&&"object"===Ze.typeof(this)&&s(this);if(!o||!o["[[initializedNumberFormat]]"])throw new TypeError("`this` value for resolvedOptions() is not an initialized Intl.NumberFormat object.");for(var i=0,a=n.length;i<a;i++)Ue.call(o,e="[["+n[i]+"]]")&&(t[n[i]]={value:o[e],writable:!0,configurable:!0,enumerable:!0});return He({},t)}});var pr=/(?:[Eec]{1,6}|G{1,5}|[Qq]{1,5}|(?:[yYur]+|U{1,5})|[ML]{1,5}|d{1,2}|D{1,3}|F{1}|[abB]{1,5}|[hkHK]{1,2}|w{1,2}|W{1}|m{1,2}|s{1,2}|[zZOvVxX]{1,4})(?=([^']*'[^']*')*[^']*$)/g,dr=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,yr=/[rqQASjJgwWIQq]/,br=["era","year","month","day","weekday","quarter"],wr=["hour","minute","second","hour12","timeZoneName"],kr={second:{numeric:"s","2-digit":"ss"},minute:{numeric:"m","2-digit":"mm"},year:{numeric:"y","2-digit":"yy"},day:{numeric:"d","2-digit":"dd"},month:{numeric:"L","2-digit":"LL",narrow:"LLLLL",short:"LLL",long:"LLLL"},weekday:{narrow:"ccccc",short:"ccc",long:"cccc"}},Sr=He(null,{narrow:{},short:{},long:{}});Ke(hr,"DateTimeFormat",{configurable:!0,writable:!0,value:H}),Ke(H,"prototype",{writable:!1});var xr={weekday:["narrow","short","long"],era:["narrow","short","long"],year:["2-digit","numeric"],month:["2-digit","numeric","narrow","short","long"],day:["2-digit","numeric"],hour:["2-digit","numeric"],minute:["2-digit","numeric"],second:["2-digit","numeric"],timeZoneName:["short","long"]};rr.DateTimeFormat={"[[availableLocales]]":[],"[[relevantExtensionKeys]]":["ca","nu"],"[[localeData]]":{}},Ke(hr.DateTimeFormat,"supportedLocalesOf",{configurable:!0,writable:!0,value:er.call(function(e){if(!Ue.call(this,"[[availableLocales]]"))throw new TypeError("supportedLocalesOf() is not a constructor");var r=n(),t=arguments[1],o=this["[[availableLocales]]"],i=v(e);return r(),x(o,i,t)},rr.NumberFormat)}),Ke(hr.DateTimeFormat.prototype,"format",{configurable:!0,get:ee}),Object.defineProperty(hr.DateTimeFormat.prototype,"formatToParts",{enumerable:!1,writable:!0,configurable:!0,value:re}),Ke(hr.DateTimeFormat.prototype,"resolvedOptions",{writable:!0,configurable:!0,value:function(){var e=void 0,t=new r,n=["locale","calendar","numberingSystem","timeZone","hour12","weekday","era","year","month","day","hour","minute","second","timeZoneName"],o=null!==this&&"object"===Ze.typeof(this)&&s(this);if(!o||!o["[[initializedDateTimeFormat]]"])throw new TypeError("`this` value for resolvedOptions() is not an initialized Intl.DateTimeFormat object.");for(var i=0,a=n.length;i<a;i++)Ue.call(o,e="[["+n[i]+"]]")&&(t[n[i]]={value:o[e],writable:!0,configurable:!0,enumerable:!0});return He({},t)}});var jr=hr.__localeSensitiveProtos={Number:{},Date:{}};jr.Number.toLocaleString=function(){if("[object Number]"!==Object.prototype.toString.call(this))throw new TypeError("`this` value must be a number for Number.prototype.toLocaleString()");return R(new F(arguments[0],arguments[1]),this)},jr.Date.toLocaleString=function(){if("[object Date]"!==Object.prototype.toString.call(this))throw new TypeError("`this` value must be a Date instance for Date.prototype.toLocaleString()");var e=+this;if(isNaN(e))return"Invalid Date";var r=arguments[0],t=arguments[1];return t=V(t,"any","all"),ne(new H(r,t),e)},jr.Date.toLocaleDateString=function(){if("[object Date]"!==Object.prototype.toString.call(this))throw new TypeError("`this` value must be a Date instance for Date.prototype.toLocaleDateString()");var e=+this;if(isNaN(e))return"Invalid Date";var r=arguments[0],t=arguments[1];return t=V(t,"date","date"),ne(new H(r,t),e)},jr.Date.toLocaleTimeString=function(){if("[object Date]"!==Object.prototype.toString.call(this))throw new TypeError("`this` value must be a Date instance for Date.prototype.toLocaleTimeString()");var e=+this;if(isNaN(e))return"Invalid Date";var r=arguments[0],t=arguments[1];return t=V(t,"time","time"),ne(new H(r,t),e)};var zr=[function(e,r){return"other"},function(e,r){return r?"other":1==e?"one":"other"},function(e,r){return r?"other":0==e||1==e?"one":"other"},function(e,r){var t=String(e).split("."),n=!t[1];return r?"other":1==e&&n?"one":"other"}],Dr={af:zr[1],ak:zr[2],am:function(e,r){return r?"other":e>=0&&e<=1?"one":"other"},ar:function(e,r){var t=String(e).split("."),n=Number(t[0])==e,o=n&&t[0].slice(-2);return r?"other":0==e?"zero":1==e?"one":2==e?"two":o>=3&&o<=10?"few":o>=11&&o<=99?"many":"other"},ars:function(e,r){var t=String(e).split("."),n=Number(t[0])==e,o=n&&t[0].slice(-2);return r?"other":0==e?"zero":1==e?"one":2==e?"two":o>=3&&o<=10?"few":o>=11&&o<=99?"many":"other"},as:function(e,r){return r?1==e||5==e||7==e||8==e||9==e||10==e?"one":2==e||3==e?"two":4==e?"few":6==e?"many":"other":e>=0&&e<=1?"one":"other"},asa:zr[1],ast:zr[3],az:function(e,r){var t=String(e).split("."),n=t[0],o=n.slice(-1),i=n.slice(-2),a=n.slice(-3);return r?1==o||2==o||5==o||7==o||8==o||20==i||50==i||70==i||80==i?"one":3==o||4==o||100==a||200==a||300==a||400==a||500==a||600==a||700==a||800==a||900==a?"few":0==n||6==o||40==i||60==i||90==i?"many":"other":1==e?"one":"other"},be:function(e,r){var t=String(e).split("."),n=Number(t[0])==e,o=n&&t[0].slice(-1),i=n&&t[0].slice(-2);return r?2!=o&&3!=o||12==i||13==i?"other":"few":1==o&&11!=i?"one":o>=2&&o<=4&&(i<12||i>14)?"few":n&&0==o||o>=5&&o<=9||i>=11&&i<=14?"many":"other"},bem:zr[1],bez:zr[1],bg:zr[1],bh:zr[2],bm:zr[0],bn:function(e,r){return r?1==e||5==e||7==e||8==e||9==e||10==e?"one":2==e||3==e?"two":4==e?"few":6==e?"many":"other":e>=0&&e<=1?"one":"other"},bo:zr[0],br:function(e,r){var t=String(e).split("."),n=Number(t[0])==e,o=n&&t[0].slice(-1),i=n&&t[0].slice(-2),a=n&&t[0].slice(-6);return r?"other":1==o&&11!=i&&71!=i&&91!=i?"one":2==o&&12!=i&&72!=i&&92!=i?"two":(3==o||4==o||9==o)&&(i<10||i>19)&&(i<70||i>79)&&(i<90||i>99)?"few":0!=e&&n&&0==a?"many":"other"},brx:zr[1],bs:function(e,r){var t=String(e).split("."),n=t[0],o=t[1]||"",i=!t[1],a=n.slice(-1),l=n.slice(-2),s=o.slice(-1),u=o.slice(-2);return r?"other":i&&1==a&&11!=l||1==s&&11!=u?"one":i&&a>=2&&a<=4&&(l<12||l>14)||s>=2&&s<=4&&(u<12||u>14)?"few":"other"},ca:function(e,r){var t=String(e).split("."),n=!t[1];return r?1==e||3==e?"one":2==e?"two":4==e?"few":"other":1==e&&n?"one":"other"},ce:zr[1],cgg:zr[1],chr:zr[1],ckb:zr[1],cs:function(e,r){var t=String(e).split("."),n=t[0],o=!t[1];return r?"other":1==e&&o?"one":n>=2&&n<=4&&o?"few":o?"other":"many"},cy:function(e,r){return r?0==e||7==e||8==e||9==e?"zero":1==e?"one":2==e?"two":3==e||4==e?"few":5==e||6==e?"many":"other":0==e?"zero":1==e?"one":2==e?"two":3==e?"few":6==e?"many":"other"},da:function(e,r){var t=String(e).split("."),n=t[0],o=Number(t[0])==e;return r?"other":1!=e&&(o||0!=n&&1!=n)?"other":"one"},de:zr[3],dsb:function(e,r){var t=String(e).split("."),n=t[0],o=t[1]||"",i=!t[1],a=n.slice(-2),l=o.slice(-2);return r?"other":i&&1==a||1==l?"one":i&&2==a||2==l?"two":i&&(3==a||4==a)||3==l||4==l?"few":"other"},dv:zr[1],dz:zr[0],ee:zr[1],el:zr[1],en:function(e,r){var t=String(e).split("."),n=!t[1],o=Number(t[0])==e,i=o&&t[0].slice(-1),a=o&&t[0].slice(-2);return r?1==i&&11!=a?"one":2==i&&12!=a?"two":3==i&&13!=a?"few":"other":1==e&&n?"one":"other"},eo:zr[1],es:zr[1],et:zr[3],eu:zr[1],fa:function(e,r){return r?"other":e>=0&&e<=1?"one":"other"},ff:function(e,r){return r?"other":e>=0&&e<2?"one":"other"},fi:zr[3],fil:function(e,r){var t=String(e).split("."),n=t[0],o=t[1]||"",i=!t[1],a=n.slice(-1),l=o.slice(-1);return r?1==e?"one":"other":i&&(1==n||2==n||3==n)||i&&4!=a&&6!=a&&9!=a||!i&&4!=l&&6!=l&&9!=l?"one":"other"},fo:zr[1],fr:function(e,r){return r?1==e?"one":"other":e>=0&&e<2?"one":"other"},fur:zr[1],fy:zr[3],ga:function(e,r){var t=String(e).split("."),n=Number(t[0])==e;return r?1==e?"one":"other":1==e?"one":2==e?"two":n&&e>=3&&e<=6?"few":n&&e>=7&&e<=10?"many":"other"},gd:function(e,r){var t=String(e).split("."),n=Number(t[0])==e;return r?"other":1==e||11==e?"one":2==e||12==e?"two":n&&e>=3&&e<=10||n&&e>=13&&e<=19?"few":"other"},gl:zr[3],gsw:zr[1],gu:function(e,r){return r?1==e?"one":2==e||3==e?"two":4==e?"few":6==e?"many":"other":e>=0&&e<=1?"one":"other"},guw:zr[2],gv:function(e,r){var t=String(e).split("."),n=t[0],o=!t[1],i=n.slice(-1),a=n.slice(-2);return r?"other":o&&1==i?"one":o&&2==i?"two":!o||0!=a&&20!=a&&40!=a&&60!=a&&80!=a?o?"other":"many":"few"},ha:zr[1],haw:zr[1],he:function(e,r){var t=String(e).split("."),n=t[0],o=!t[1],i=Number(t[0])==e,a=i&&t[0].slice(-1);return r?"other":1==e&&o?"one":2==n&&o?"two":o&&(e<0||e>10)&&i&&0==a?"many":"other"},hi:function(e,r){return r?1==e?"one":2==e||3==e?"two":4==e?"few":6==e?"many":"other":e>=0&&e<=1?"one":"other"},hr:function(e,r){var t=String(e).split("."),n=t[0],o=t[1]||"",i=!t[1],a=n.slice(-1),l=n.slice(-2),s=o.slice(-1),u=o.slice(-2);return r?"other":i&&1==a&&11!=l||1==s&&11!=u?"one":i&&a>=2&&a<=4&&(l<12||l>14)||s>=2&&s<=4&&(u<12||u>14)?"few":"other"},hsb:function(e,r){var t=String(e).split("."),n=t[0],o=t[1]||"",i=!t[1],a=n.slice(-2),l=o.slice(-2);return r?"other":i&&1==a||1==l?"one":i&&2==a||2==l?"two":i&&(3==a||4==a)||3==l||4==l?"few":"other"},hu:function(e,r){return r?1==e||5==e?"one":"other":1==e?"one":"other"},hy:function(e,r){return r?1==e?"one":"other":e>=0&&e<2?"one":"other"},id:zr[0],ig:zr[0],ii:zr[0],in:zr[0],is:function(e,r){var t=String(e).split("."),n=t[0],o=Number(t[0])==e,i=n.slice(-1),a=n.slice(-2);return r?"other":o&&1==i&&11!=a||!o?"one":"other"},it:function(e,r){var t=String(e).split("."),n=!t[1];return r?11==e||8==e||80==e||800==e?"many":"other":1==e&&n?"one":"other"},iu:function(e,r){return r?"other":1==e?"one":2==e?"two":"other"},iw:function(e,r){var t=String(e).split("."),n=t[0],o=!t[1],i=Number(t[0])==e,a=i&&t[0].slice(-1);return r?"other":1==e&&o?"one":2==n&&o?"two":o&&(e<0||e>10)&&i&&0==a?"many":"other"},ja:zr[0],jbo:zr[0],jgo:zr[1],ji:zr[3],jmc:zr[1],jv:zr[0],jw:zr[0],ka:function(e,r){var t=String(e).split("."),n=t[0],o=n.slice(-2);return r?1==n?"one":0==n||o>=2&&o<=20||40==o||60==o||80==o?"many":"other":1==e?"one":"other"},kab:function(e,r){return r?"other":e>=0&&e<2?"one":"other"},kaj:zr[1],kcg:zr[1],kde:zr[0],kea:zr[0],kk:function(e,r){var t=String(e).split("."),n=Number(t[0])==e,o=n&&t[0].slice(-1);return r?6==o||9==o||n&&0==o&&0!=e?"many":"other":1==e?"one":"other"},kkj:zr[1],kl:zr[1],km:zr[0],kn:function(e,r){return r?"other":e>=0&&e<=1?"one":"other"},ko:zr[0],ks:zr[1],ksb:zr[1],ksh:function(e,r){return r?"other":0==e?"zero":1==e?"one":"other"},ku:zr[1],kw:function(e,r){return r?"other":1==e?"one":2==e?"two":"other"},ky:zr[1],lag:function(e,r){var t=String(e).split("."),n=t[0];return r?"other":0==e?"zero":0!=n&&1!=n||0==e?"other":"one"},lb:zr[1],lg:zr[1],lkt:zr[0],ln:zr[2],lo:function(e,r){return r&&1==e?"one":"other"},lt:function(e,r){var t=String(e).split("."),n=t[1]||"",o=Number(t[0])==e,i=o&&t[0].slice(-1),a=o&&t[0].slice(-2);return r?"other":1==i&&(a<11||a>19)?"one":i>=2&&i<=9&&(a<11||a>19)?"few":0!=n?"many":"other"},lv:function(e,r){var t=String(e).split("."),n=t[1]||"",o=n.length,i=Number(t[0])==e,a=i&&t[0].slice(-1),l=i&&t[0].slice(-2),s=n.slice(-2),u=n.slice(-1);return r?"other":i&&0==a||l>=11&&l<=19||2==o&&s>=11&&s<=19?"zero":1==a&&11!=l||2==o&&1==u&&11!=s||2!=o&&1==u?"one":"other"},mas:zr[1],mg:zr[2],mgo:zr[1],mk:function(e,r){var t=String(e).split("."),n=t[0],o=t[1]||"",i=!t[1],a=n.slice(-1),l=n.slice(-2),s=o.slice(-1);return r?1==a&&11!=l?"one":2==a&&12!=l?"two":7!=a&&8!=a||17==l||18==l?"other":"many":i&&1==a||1==s?"one":"other"},ml:zr[1],mn:zr[1],mo:function(e,r){var t=String(e).split("."),n=!t[1],o=Number(t[0])==e,i=o&&t[0].slice(-2);return r?1==e?"one":"other":1==e&&n?"one":!n||0==e||1!=e&&i>=1&&i<=19?"few":"other"},mr:function(e,r){return r?1==e?"one":2==e||3==e?"two":4==e?"few":"other":e>=0&&e<=1?"one":"other"},ms:function(e,r){return r&&1==e?"one":"other"},mt:function(e,r){var t=String(e).split("."),n=Number(t[0])==e,o=n&&t[0].slice(-2);return r?"other":1==e?"one":0==e||o>=2&&o<=10?"few":o>=11&&o<=19?"many":"other"},my:zr[0],nah:zr[1],naq:function(e,r){return r?"other":1==e?"one":2==e?"two":"other"},nb:zr[1],nd:zr[1],ne:function(e,r){var t=String(e).split("."),n=Number(t[0])==e;return r?n&&e>=1&&e<=4?"one":"other":1==e?"one":"other"},nl:zr[3],nn:zr[1],nnh:zr[1],no:zr[1],nqo:zr[0],nr:zr[1],nso:zr[2],ny:zr[1],nyn:zr[1],om:zr[1],or:zr[1],os:zr[1],pa:zr[2],pap:zr[1],pl:function(e,r){var t=String(e).split("."),n=t[0],o=!t[1],i=n.slice(-1),a=n.slice(-2);return r?"other":1==e&&o?"one":o&&i>=2&&i<=4&&(a<12||a>14)?"few":o&&1!=n&&(0==i||1==i)||o&&i>=5&&i<=9||o&&a>=12&&a<=14?"many":"other"},prg:function(e,r){var t=String(e).split("."),n=t[1]||"",o=n.length,i=Number(t[0])==e,a=i&&t[0].slice(-1),l=i&&t[0].slice(-2),s=n.slice(-2),u=n.slice(-1);return r?"other":i&&0==a||l>=11&&l<=19||2==o&&s>=11&&s<=19?"zero":1==a&&11!=l||2==o&&1==u&&11!=s||2!=o&&1==u?"one":"other"},ps:zr[1],pt:function(e,r){var t=String(e).split("."),n=Number(t[0])==e;return r?"other":n&&e>=0&&e<=2&&2!=e?"one":"other"},"pt-PT":zr[3],rm:zr[1],ro:function(e,r){var t=String(e).split("."),n=!t[1],o=Number(t[0])==e,i=o&&t[0].slice(-2);return r?1==e?"one":"other":1==e&&n?"one":!n||0==e||1!=e&&i>=1&&i<=19?"few":"other"},rof:zr[1],root:zr[0],ru:function(e,r){var t=String(e).split("."),n=t[0],o=!t[1],i=n.slice(-1),a=n.slice(-2);return r?"other":o&&1==i&&11!=a?"one":o&&i>=2&&i<=4&&(a<12||a>14)?"few":o&&0==i||o&&i>=5&&i<=9||o&&a>=11&&a<=14?"many":"other"},rwk:zr[1],sah:zr[0],saq:zr[1],sdh:zr[1],se:function(e,r){return r?"other":1==e?"one":2==e?"two":"other"},seh:zr[1],ses:zr[0],sg:zr[0],sh:function(e,r){var t=String(e).split("."),n=t[0],o=t[1]||"",i=!t[1],a=n.slice(-1),l=n.slice(-2),s=o.slice(-1),u=o.slice(-2);return r?"other":i&&1==a&&11!=l||1==s&&11!=u?"one":i&&a>=2&&a<=4&&(l<12||l>14)||s>=2&&s<=4&&(u<12||u>14)?"few":"other"},shi:function(e,r){var t=String(e).split("."),n=Number(t[0])==e;return r?"other":e>=0&&e<=1?"one":n&&e>=2&&e<=10?"few":"other"},si:function(e,r){var t=String(e).split("."),n=t[0],o=t[1]||"";return r?"other":0==e||1==e||0==n&&1==o?"one":"other"},sk:function(e,r){var t=String(e).split("."),n=t[0],o=!t[1];return r?"other":1==e&&o?"one":n>=2&&n<=4&&o?"few":o?"other":"many"},sl:function(e,r){var t=String(e).split("."),n=t[0],o=!t[1],i=n.slice(-2);return r?"other":o&&1==i?"one":o&&2==i?"two":o&&(3==i||4==i)||!o?"few":"other"},sma:function(e,r){return r?"other":1==e?"one":2==e?"two":"other"},smi:function(e,r){return r?"other":1==e?"one":2==e?"two":"other"},smj:function(e,r){return r?"other":1==e?"one":2==e?"two":"other"},smn:function(e,r){return r?"other":1==e?"one":2==e?"two":"other"},sms:function(e,r){return r?"other":1==e?"one":2==e?"two":"other"},sn:zr[1],so:zr[1],sq:function(e,r){var t=String(e).split("."),n=Number(t[0])==e,o=n&&t[0].slice(-1),i=n&&t[0].slice(-2);return r?1==e?"one":4==o&&14!=i?"many":"other":1==e?"one":"other"},sr:function(e,r){var t=String(e).split("."),n=t[0],o=t[1]||"",i=!t[1],a=n.slice(-1),l=n.slice(-2),s=o.slice(-1),u=o.slice(-2);return r?"other":i&&1==a&&11!=l||1==s&&11!=u?"one":i&&a>=2&&a<=4&&(l<12||l>14)||s>=2&&s<=4&&(u<12||u>14)?"few":"other"},ss:zr[1],ssy:zr[1],st:zr[1],sv:function(e,r){var t=String(e).split("."),n=!t[1],o=Number(t[0])==e,i=o&&t[0].slice(-1),a=o&&t[0].slice(-2);return r?1!=i&&2!=i||11==a||12==a?"other":"one":1==e&&n?"one":"other"},sw:zr[3],syr:zr[1],ta:zr[1],te:zr[1],teo:zr[1],th:zr[0],ti:zr[2],tig:zr[1],tk:zr[1],tl:function(e,r){var t=String(e).split("."),n=t[0],o=t[1]||"",i=!t[1],a=n.slice(-1),l=o.slice(-1);return r?1==e?"one":"other":i&&(1==n||2==n||3==n)||i&&4!=a&&6!=a&&9!=a||!i&&4!=l&&6!=l&&9!=l?"one":"other"},tn:zr[1],to:zr[0],tr:zr[1],ts:zr[1],tzm:function(e,r){var t=String(e).split("."),n=Number(t[0])==e;return r?"other":0==e||1==e||n&&e>=11&&e<=99?"one":"other"},ug:zr[1],uk:function(e,r){var t=String(e).split("."),n=t[0],o=!t[1],i=Number(t[0])==e,a=i&&t[0].slice(-1),l=i&&t[0].slice(-2),s=n.slice(-1),u=n.slice(-2);return r?3==a&&13!=l?"few":"other":o&&1==s&&11!=u?"one":o&&s>=2&&s<=4&&(u<12||u>14)?"few":o&&0==s||o&&s>=5&&s<=9||o&&u>=11&&u<=14?"many":"other"},ur:zr[3],uz:zr[1],ve:zr[1],vi:function(e,r){return r&&1==e?"one":"other"},vo:zr[1],vun:zr[1],wa:zr[2],wae:zr[1],wo:zr[0],xh:zr[1],xog:zr[1],yi:zr[3],yo:zr[0],yue:zr[0],zh:zr[0],zu:function(e,r){return r?"other":e>=0&&e<=1?"one":"other"}};if(Ke(hr,"PluralRules",{configurable:!0,writable:!0,value:ae}),Ke(ae,"prototype",{writable:!1}),rr.PluralRules={"[[availableLocales]]":Object.keys(Dr),"[[relevantExtensionKeys]]":[],"[[localeData]]":{}},Ke(hr.PluralRules,"supportedLocalesOf",{configurable:!0,writable:!0,value:er.call(function(e){if(!Ue.call(this,"[[availableLocales]]"))throw new TypeError("supportedLocalesOf() is not a constructor");var r=n(),t=arguments[1],o=this["[[availableLocales]]"],i=v(e);return r(),x(o,i,t)},rr.PluralRules)}),Ke(hr.PluralRules.prototype,"select",{configurable:!0,value:function(e){return ue(this,Number(e))}}),Ke(hr.PluralRules.prototype,"resolvedOptions",{configurable:!0,writable:!0,value:function(){var e=void 0,t=new r,n=["locale","type","minimumIntegerDigits","minimumFractionDigits","maximumFractionDigits","minimumSignificantDigits","maximumSignificantDigits"],o=null!==this&&"object"===Ze.typeof(this)&&s(this);if(!o||!o["[[InitializedPluralRules]]"])throw new TypeError("`this` value for resolvedOptions() is not an initialized Intl.PluralRules object.");for(var i=0,a=n.length;i<a;i++)Ue.call(o,e="[["+n[i]+"]]")&&(t[n[i]]={value:o[e],writable:!0,configurable:!0,enumerable:!0});return He({},t)}}),Ke(hr,"__applyLocaleSensitivePrototypes",{writable:!0,configurable:!0,value:function(){Ke(Number.prototype,"toLocaleString",{writable:!0,configurable:!0,value:jr.Number.toLocaleString}),Ke(Date.prototype,"toLocaleString",{writable:!0,configurable:!0,value:jr.Date.toLocaleString});for(var e in jr.Date)Ue.call(jr.Date,e)&&Ke(Date.prototype,e,{writable:!0,configurable:!0,value:jr.Date[e]})}}),Ke(hr,"__addLocaleData",{value:function(e){if(!f(e.locale))throw new Error('Invalid language tag "'+e.locale+'" when calling __addLocaleData("'+e.locale+'", ...) to register new locale data.');ce(e,e.locale)}}),Ke(hr,"__disableRegExpRestore",{value:function(){rr.disableRegExpRestore=!0}}),"undefined"==typeof Intl)try{window.Intl=hr,hr.__applyLocaleSensitivePrototypes()}catch(e){}return hr}); +//# sourceMappingURL=Intl.min.js.map diff --git a/cyclone-web/vendor/polyfill/console-shim-media.js b/cyclone-web/vendor/polyfill/console-shim-media.js new file mode 100644 index 0000000000000000000000000000000000000000..fbfca0cf292db0d2fda5e3c2eae504bafbdf42cd --- /dev/null +++ b/cyclone-web/vendor/polyfill/console-shim-media.js @@ -0,0 +1,68 @@ +// Console-polyfill. MIT license. +// https://github.com/paulmillr/console-polyfill +// Make it safe to do console.log() always. +(function(global) { + 'use strict'; + global.console = global.console || {}; + var con = global.console; + var prop, method; + var empty = {}; + var dummy = function() {}; + var properties = 'memory'.split(','); + var methods = ('assert,clear,count,debug,dir,dirxml,error,exception,group,' + + 'groupCollapsed,groupEnd,info,log,markTimeline,profile,profiles,profileEnd,' + + 'show,table,time,timeEnd,timeline,timelineEnd,timeStamp,trace,warn').split(','); + while (prop = properties.pop()) if (!con[prop]) con[prop] = empty; + while (method = methods.pop()) if (typeof con[method] !== 'function') con[method] = dummy; +})(typeof window === 'undefined' ? this : window); +// Using `this` for web workers while maintaining compatibility with browser +// targeted script loaders such as Browserify or Webpack where the only way to +// get to the global object is via `window`. +/*! + * https://github.com/es-shims/es5-shim + * @license es5-shim Copyright 2009-2015 by contributors, MIT License + * see https://github.com/es-shims/es5-shim/blob/v4.5.7/LICENSE + */ +(function(t,r){"use strict";if(typeof define==="function"&&define.amd){define(r)}else if(typeof exports==="object"){module.exports=r()}else{t.returnExports=r()}})(this,function(){var t=Array;var r=t.prototype;var e=Object;var n=e.prototype;var i=Function;var a=i.prototype;var o=String;var f=o.prototype;var u=Number;var l=u.prototype;var s=r.slice;var c=r.splice;var v=r.push;var h=r.unshift;var p=r.concat;var y=r.join;var d=a.call;var g=a.apply;var w=Math.max;var b=Math.min;var T=n.toString;var m=typeof Symbol==="function"&&typeof Symbol.toStringTag==="symbol";var D;var x=Function.prototype.toString,S=/^\s*class /,O=function isES6ClassFn(t){try{var r=x.call(t);var e=r.replace(/\/\/.*\n/g,"");var n=e.replace(/\/\*[.\s\S]*\*\//g,"");var i=n.replace(/\n/gm," ").replace(/ {2}/g," ");return S.test(i)}catch(a){return false}},E=function tryFunctionObject(t){try{if(O(t)){return false}x.call(t);return true}catch(r){return false}},j="[object Function]",I="[object GeneratorFunction]",D=function isCallable(t){if(!t){return false}if(typeof t!=="function"&&typeof t!=="object"){return false}if(m){return E(t)}if(O(t)){return false}var r=T.call(t);return r===j||r===I};var M;var U=RegExp.prototype.exec,F=function tryRegexExec(t){try{U.call(t);return true}catch(r){return false}},N="[object RegExp]";M=function isRegex(t){if(typeof t!=="object"){return false}return m?F(t):T.call(t)===N};var C;var k=String.prototype.valueOf,R=function tryStringObject(t){try{k.call(t);return true}catch(r){return false}},A="[object String]";C=function isString(t){if(typeof t==="string"){return true}if(typeof t!=="object"){return false}return m?R(t):T.call(t)===A};var P=e.defineProperty&&function(){try{var t={};e.defineProperty(t,"x",{enumerable:false,value:t});for(var r in t){return false}return t.x===t}catch(n){return false}}();var $=function(t){var r;if(P){r=function(t,r,n,i){if(!i&&r in t){return}e.defineProperty(t,r,{configurable:true,enumerable:false,writable:true,value:n})}}else{r=function(t,r,e,n){if(!n&&r in t){return}t[r]=e}}return function defineProperties(e,n,i){for(var a in n){if(t.call(n,a)){r(e,a,n[a],i)}}}}(n.hasOwnProperty);var J=function isPrimitive(t){var r=typeof t;return t===null||r!=="object"&&r!=="function"};var Y=u.isNaN||function(t){return t!==t};var Z={ToInteger:function ToInteger(t){var r=+t;if(Y(r)){r=0}else if(r!==0&&r!==1/0&&r!==-(1/0)){r=(r>0||-1)*Math.floor(Math.abs(r))}return r},ToPrimitive:function ToPrimitive(t){var r,e,n;if(J(t)){return t}e=t.valueOf;if(D(e)){r=e.call(t);if(J(r)){return r}}n=t.toString;if(D(n)){r=n.call(t);if(J(r)){return r}}throw new TypeError},ToObject:function(t){if(t==null){throw new TypeError("can't convert "+t+" to object")}return e(t)},ToUint32:function ToUint32(t){return t>>>0}};var z=function Empty(){};$(a,{bind:function bind(t){var r=this;if(!D(r)){throw new TypeError("Function.prototype.bind called on incompatible "+r)}var n=s.call(arguments,1);var a;var o=function(){if(this instanceof a){var i=g.call(r,this,p.call(n,s.call(arguments)));if(e(i)===i){return i}return this}else{return g.call(r,t,p.call(n,s.call(arguments)))}};var f=w(0,r.length-n.length);var u=[];for(var l=0;l<f;l++){v.call(u,"$"+l)}a=i("binder","return function ("+y.call(u,",")+"){ return binder.apply(this, arguments); }")(o);if(r.prototype){z.prototype=r.prototype;a.prototype=new z;z.prototype=null}return a}});var G=d.bind(n.hasOwnProperty);var B=d.bind(n.toString);var H=d.bind(s);var W=g.bind(s);var L=d.bind(f.slice);var X=d.bind(f.split);var q=d.bind(f.indexOf);var K=d.bind(v);var Q=d.bind(n.propertyIsEnumerable);var V=d.bind(r.sort);var _=t.isArray||function isArray(t){return B(t)==="[object Array]"};var tt=[].unshift(0)!==1;$(r,{unshift:function(){h.apply(this,arguments);return this.length}},tt);$(t,{isArray:_});var rt=e("a");var et=rt[0]!=="a"||!(0 in rt);var nt=function properlyBoxed(t){var r=true;var e=true;var n=false;if(t){try{t.call("foo",function(t,e,n){if(typeof n!=="object"){r=false}});t.call([1],function(){"use strict";e=typeof this==="string"},"x")}catch(i){n=true}}return!!t&&!n&&r&&e};$(r,{forEach:function forEach(t){var r=Z.ToObject(this);var e=et&&C(this)?X(this,""):r;var n=-1;var i=Z.ToUint32(e.length);var a;if(arguments.length>1){a=arguments[1]}if(!D(t)){throw new TypeError("Array.prototype.forEach callback must be a function")}while(++n<i){if(n in e){if(typeof a==="undefined"){t(e[n],n,r)}else{t.call(a,e[n],n,r)}}}}},!nt(r.forEach));$(r,{map:function map(r){var e=Z.ToObject(this);var n=et&&C(this)?X(this,""):e;var i=Z.ToUint32(n.length);var a=t(i);var o;if(arguments.length>1){o=arguments[1]}if(!D(r)){throw new TypeError("Array.prototype.map callback must be a function")}for(var f=0;f<i;f++){if(f in n){if(typeof o==="undefined"){a[f]=r(n[f],f,e)}else{a[f]=r.call(o,n[f],f,e)}}}return a}},!nt(r.map));$(r,{filter:function filter(t){var r=Z.ToObject(this);var e=et&&C(this)?X(this,""):r;var n=Z.ToUint32(e.length);var i=[];var a;var o;if(arguments.length>1){o=arguments[1]}if(!D(t)){throw new TypeError("Array.prototype.filter callback must be a function")}for(var f=0;f<n;f++){if(f in e){a=e[f];if(typeof o==="undefined"?t(a,f,r):t.call(o,a,f,r)){K(i,a)}}}return i}},!nt(r.filter));$(r,{every:function every(t){var r=Z.ToObject(this);var e=et&&C(this)?X(this,""):r;var n=Z.ToUint32(e.length);var i;if(arguments.length>1){i=arguments[1]}if(!D(t)){throw new TypeError("Array.prototype.every callback must be a function")}for(var a=0;a<n;a++){if(a in e&&!(typeof i==="undefined"?t(e[a],a,r):t.call(i,e[a],a,r))){return false}}return true}},!nt(r.every));$(r,{some:function some(t){var r=Z.ToObject(this);var e=et&&C(this)?X(this,""):r;var n=Z.ToUint32(e.length);var i;if(arguments.length>1){i=arguments[1]}if(!D(t)){throw new TypeError("Array.prototype.some callback must be a function")}for(var a=0;a<n;a++){if(a in e&&(typeof i==="undefined"?t(e[a],a,r):t.call(i,e[a],a,r))){return true}}return false}},!nt(r.some));var it=false;if(r.reduce){it=typeof r.reduce.call("es5",function(t,r,e,n){return n})==="object"}$(r,{reduce:function reduce(t){var r=Z.ToObject(this);var e=et&&C(this)?X(this,""):r;var n=Z.ToUint32(e.length);if(!D(t)){throw new TypeError("Array.prototype.reduce callback must be a function")}if(n===0&&arguments.length===1){throw new TypeError("reduce of empty array with no initial value")}var i=0;var a;if(arguments.length>=2){a=arguments[1]}else{do{if(i in e){a=e[i++];break}if(++i>=n){throw new TypeError("reduce of empty array with no initial value")}}while(true)}for(;i<n;i++){if(i in e){a=t(a,e[i],i,r)}}return a}},!it);var at=false;if(r.reduceRight){at=typeof r.reduceRight.call("es5",function(t,r,e,n){return n})==="object"}$(r,{reduceRight:function reduceRight(t){var r=Z.ToObject(this);var e=et&&C(this)?X(this,""):r;var n=Z.ToUint32(e.length);if(!D(t)){throw new TypeError("Array.prototype.reduceRight callback must be a function")}if(n===0&&arguments.length===1){throw new TypeError("reduceRight of empty array with no initial value")}var i;var a=n-1;if(arguments.length>=2){i=arguments[1]}else{do{if(a in e){i=e[a--];break}if(--a<0){throw new TypeError("reduceRight of empty array with no initial value")}}while(true)}if(a<0){return i}do{if(a in e){i=t(i,e[a],a,r)}}while(a--);return i}},!at);var ot=r.indexOf&&[0,1].indexOf(1,2)!==-1;$(r,{indexOf:function indexOf(t){var r=et&&C(this)?X(this,""):Z.ToObject(this);var e=Z.ToUint32(r.length);if(e===0){return-1}var n=0;if(arguments.length>1){n=Z.ToInteger(arguments[1])}n=n>=0?n:w(0,e+n);for(;n<e;n++){if(n in r&&r[n]===t){return n}}return-1}},ot);var ft=r.lastIndexOf&&[0,1].lastIndexOf(0,-3)!==-1;$(r,{lastIndexOf:function lastIndexOf(t){var r=et&&C(this)?X(this,""):Z.ToObject(this);var e=Z.ToUint32(r.length);if(e===0){return-1}var n=e-1;if(arguments.length>1){n=b(n,Z.ToInteger(arguments[1]))}n=n>=0?n:e-Math.abs(n);for(;n>=0;n--){if(n in r&&t===r[n]){return n}}return-1}},ft);var ut=function(){var t=[1,2];var r=t.splice();return t.length===2&&_(r)&&r.length===0}();$(r,{splice:function splice(t,r){if(arguments.length===0){return[]}else{return c.apply(this,arguments)}}},!ut);var lt=function(){var t={};r.splice.call(t,0,0,1);return t.length===1}();$(r,{splice:function splice(t,r){if(arguments.length===0){return[]}var e=arguments;this.length=w(Z.ToInteger(this.length),0);if(arguments.length>0&&typeof r!=="number"){e=H(arguments);if(e.length<2){K(e,this.length-t)}else{e[1]=Z.ToInteger(r)}}return c.apply(this,e)}},!lt);var st=function(){var r=new t(1e5);r[8]="x";r.splice(1,1);return r.indexOf("x")===7}();var ct=function(){var t=256;var r=[];r[t]="a";r.splice(t+1,0,"b");return r[t]==="a"}();$(r,{splice:function splice(t,r){var e=Z.ToObject(this);var n=[];var i=Z.ToUint32(e.length);var a=Z.ToInteger(t);var f=a<0?w(i+a,0):b(a,i);var u=b(w(Z.ToInteger(r),0),i-f);var l=0;var s;while(l<u){s=o(f+l);if(G(e,s)){n[l]=e[s]}l+=1}var c=H(arguments,2);var v=c.length;var h;if(v<u){l=f;var p=i-u;while(l<p){s=o(l+u);h=o(l+v);if(G(e,s)){e[h]=e[s]}else{delete e[h]}l+=1}l=i;var y=i-u+v;while(l>y){delete e[l-1];l-=1}}else if(v>u){l=i-u;while(l>f){s=o(l+u-1);h=o(l+v-1);if(G(e,s)){e[h]=e[s]}else{delete e[h]}l-=1}}l=f;for(var d=0;d<c.length;++d){e[l]=c[d];l+=1}e.length=i-u+v;return n}},!st||!ct);var vt=r.join;var ht;try{ht=Array.prototype.join.call("123",",")!=="1,2,3"}catch(pt){ht=true}if(ht){$(r,{join:function join(t){var r=typeof t==="undefined"?",":t;return vt.call(C(this)?X(this,""):this,r)}},ht)}var yt=[1,2].join(undefined)!=="1,2";if(yt){$(r,{join:function join(t){var r=typeof t==="undefined"?",":t;return vt.call(this,r)}},yt)}var dt=function push(t){var r=Z.ToObject(this);var e=Z.ToUint32(r.length);var n=0;while(n<arguments.length){r[e+n]=arguments[n];n+=1}r.length=e+n;return e+n};var gt=function(){var t={};var r=Array.prototype.push.call(t,undefined);return r!==1||t.length!==1||typeof t[0]!=="undefined"||!G(t,0)}();$(r,{push:function push(t){if(_(this)){return v.apply(this,arguments)}return dt.apply(this,arguments)}},gt);var wt=function(){var t=[];var r=t.push(undefined);return r!==1||t.length!==1||typeof t[0]!=="undefined"||!G(t,0)}();$(r,{push:dt},wt);$(r,{slice:function(t,r){var e=C(this)?X(this,""):this;return W(e,arguments)}},et);var bt=function(){try{[1,2].sort(null);[1,2].sort({});return true}catch(t){}return false}();var Tt=function(){try{[1,2].sort(/a/);return false}catch(t){}return true}();var mt=function(){try{[1,2].sort(undefined);return true}catch(t){}return false}();$(r,{sort:function sort(t){if(typeof t==="undefined"){return V(this)}if(!D(t)){throw new TypeError("Array.prototype.sort callback must be a function")}return V(this,t)}},bt||!mt||!Tt);var Dt=!{toString:null}.propertyIsEnumerable("toString");var xt=function(){}.propertyIsEnumerable("prototype");var St=!G("x","0");var Ot=function(t){var r=t.constructor;return r&&r.prototype===t};var Et={$window:true,$console:true,$parent:true,$self:true,$frame:true,$frames:true,$frameElement:true,$webkitIndexedDB:true,$webkitStorageInfo:true,$external:true};var jt=function(){if(typeof window==="undefined"){return false}for(var t in window){try{if(!Et["$"+t]&&G(window,t)&&window[t]!==null&&typeof window[t]==="object"){Ot(window[t])}}catch(r){return true}}return false}();var It=function(t){if(typeof window==="undefined"||!jt){return Ot(t)}try{return Ot(t)}catch(r){return false}};var Mt=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"];var Ut=Mt.length;var Ft=function isArguments(t){return B(t)==="[object Arguments]"};var Nt=function isArguments(t){return t!==null&&typeof t==="object"&&typeof t.length==="number"&&t.length>=0&&!_(t)&&D(t.callee)};var Ct=Ft(arguments)?Ft:Nt;$(e,{keys:function keys(t){var r=D(t);var e=Ct(t);var n=t!==null&&typeof t==="object";var i=n&&C(t);if(!n&&!r&&!e){throw new TypeError("Object.keys called on a non-object")}var a=[];var f=xt&&r;if(i&&St||e){for(var u=0;u<t.length;++u){K(a,o(u))}}if(!e){for(var l in t){if(!(f&&l==="prototype")&&G(t,l)){K(a,o(l))}}}if(Dt){var s=It(t);for(var c=0;c<Ut;c++){var v=Mt[c];if(!(s&&v==="constructor")&&G(t,v)){K(a,v)}}}return a}});var kt=e.keys&&function(){return e.keys(arguments).length===2}(1,2);var Rt=e.keys&&function(){var t=e.keys(arguments);return arguments.length!==1||t.length!==1||t[0]!==1}(1);var At=e.keys;$(e,{keys:function keys(t){if(Ct(t)){return At(H(t))}else{return At(t)}}},!kt||Rt);var Pt=new Date(-0xc782b5b342b24).getUTCMonth()!==0;var $t=new Date(-0x55d318d56a724);var Jt=new Date(14496624e5);var Yt=$t.toUTCString()!=="Mon, 01 Jan -45875 11:59:59 GMT";var Zt;var zt;var Gt=$t.getTimezoneOffset();if(Gt<-720){Zt=$t.toDateString()!=="Tue Jan 02 -45875";zt=!/^Thu Dec 10 2015 \d\d:\d\d:\d\d GMT[-\+]\d\d\d\d(?: |$)/.test(Jt.toString())}else{Zt=$t.toDateString()!=="Mon Jan 01 -45875";zt=!/^Wed Dec 09 2015 \d\d:\d\d:\d\d GMT[-\+]\d\d\d\d(?: |$)/.test(Jt.toString())}var Bt=d.bind(Date.prototype.getFullYear);var Ht=d.bind(Date.prototype.getMonth);var Wt=d.bind(Date.prototype.getDate);var Lt=d.bind(Date.prototype.getUTCFullYear);var Xt=d.bind(Date.prototype.getUTCMonth);var qt=d.bind(Date.prototype.getUTCDate);var Kt=d.bind(Date.prototype.getUTCDay);var Qt=d.bind(Date.prototype.getUTCHours);var Vt=d.bind(Date.prototype.getUTCMinutes);var _t=d.bind(Date.prototype.getUTCSeconds);var tr=d.bind(Date.prototype.getUTCMilliseconds);var rr=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];var er=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];var nr=function daysInMonth(t,r){return Wt(new Date(r,t,0))};$(Date.prototype,{getFullYear:function getFullYear(){if(!this||!(this instanceof Date)){throw new TypeError("this is not a Date object.")}var t=Bt(this);if(t<0&&Ht(this)>11){return t+1}return t},getMonth:function getMonth(){if(!this||!(this instanceof Date)){throw new TypeError("this is not a Date object.")}var t=Bt(this);var r=Ht(this);if(t<0&&r>11){return 0}return r},getDate:function getDate(){if(!this||!(this instanceof Date)){throw new TypeError("this is not a Date object.")}var t=Bt(this);var r=Ht(this);var e=Wt(this);if(t<0&&r>11){if(r===12){return e}var n=nr(0,t+1);return n-e+1}return e},getUTCFullYear:function getUTCFullYear(){if(!this||!(this instanceof Date)){throw new TypeError("this is not a Date object.")}var t=Lt(this);if(t<0&&Xt(this)>11){return t+1}return t},getUTCMonth:function getUTCMonth(){if(!this||!(this instanceof Date)){throw new TypeError("this is not a Date object.")}var t=Lt(this);var r=Xt(this);if(t<0&&r>11){return 0}return r},getUTCDate:function getUTCDate(){if(!this||!(this instanceof Date)){throw new TypeError("this is not a Date object.")}var t=Lt(this);var r=Xt(this);var e=qt(this);if(t<0&&r>11){if(r===12){return e}var n=nr(0,t+1);return n-e+1}return e}},Pt);$(Date.prototype,{toUTCString:function toUTCString(){if(!this||!(this instanceof Date)){throw new TypeError("this is not a Date object.")}var t=Kt(this);var r=qt(this);var e=Xt(this);var n=Lt(this);var i=Qt(this);var a=Vt(this);var o=_t(this);return rr[t]+", "+(r<10?"0"+r:r)+" "+er[e]+" "+n+" "+(i<10?"0"+i:i)+":"+(a<10?"0"+a:a)+":"+(o<10?"0"+o:o)+" GMT"}},Pt||Yt);$(Date.prototype,{toDateString:function toDateString(){if(!this||!(this instanceof Date)){throw new TypeError("this is not a Date object.")}var t=this.getDay();var r=this.getDate();var e=this.getMonth();var n=this.getFullYear();return rr[t]+" "+er[e]+" "+(r<10?"0"+r:r)+" "+n}},Pt||Zt);if(Pt||zt){Date.prototype.toString=function toString(){if(!this||!(this instanceof Date)){throw new TypeError("this is not a Date object.")}var t=this.getDay();var r=this.getDate();var e=this.getMonth();var n=this.getFullYear();var i=this.getHours();var a=this.getMinutes();var o=this.getSeconds();var f=this.getTimezoneOffset();var u=Math.floor(Math.abs(f)/60);var l=Math.floor(Math.abs(f)%60);return rr[t]+" "+er[e]+" "+(r<10?"0"+r:r)+" "+n+" "+(i<10?"0"+i:i)+":"+(a<10?"0"+a:a)+":"+(o<10?"0"+o:o)+" GMT"+(f>0?"-":"+")+(u<10?"0"+u:u)+(l<10?"0"+l:l)};if(P){e.defineProperty(Date.prototype,"toString",{configurable:true,enumerable:false,writable:true})}}var ir=-621987552e5;var ar="-000001";var or=Date.prototype.toISOString&&new Date(ir).toISOString().indexOf(ar)===-1;var fr=Date.prototype.toISOString&&new Date(-1).toISOString()!=="1969-12-31T23:59:59.999Z";var ur=d.bind(Date.prototype.getTime);$(Date.prototype,{toISOString:function toISOString(){if(!isFinite(this)||!isFinite(ur(this))){throw new RangeError("Date.prototype.toISOString called on non-finite value.")}var t=Lt(this);var r=Xt(this);t+=Math.floor(r/12);r=(r%12+12)%12;var e=[r+1,qt(this),Qt(this),Vt(this),_t(this)];t=(t<0?"-":t>9999?"+":"")+L("00000"+Math.abs(t),0<=t&&t<=9999?-4:-6);for(var n=0;n<e.length;++n){e[n]=L("00"+e[n],-2)}return t+"-"+H(e,0,2).join("-")+"T"+H(e,2).join(":")+"."+L("000"+tr(this),-3)+"Z"}},or||fr);var lr=function(){try{return Date.prototype.toJSON&&new Date(NaN).toJSON()===null&&new Date(ir).toJSON().indexOf(ar)!==-1&&Date.prototype.toJSON.call({toISOString:function(){return true}})}catch(t){return false}}();if(!lr){Date.prototype.toJSON=function toJSON(t){var r=e(this);var n=Z.ToPrimitive(r);if(typeof n==="number"&&!isFinite(n)){return null}var i=r.toISOString;if(!D(i)){throw new TypeError("toISOString property is not callable")}return i.call(r)}}var sr=Date.parse("+033658-09-27T01:46:40.000Z")===1e15;var cr=!isNaN(Date.parse("2012-04-04T24:00:00.500Z"))||!isNaN(Date.parse("2012-11-31T23:59:59.000Z"))||!isNaN(Date.parse("2012-12-31T23:59:60.000Z"));var vr=isNaN(Date.parse("2000-01-01T00:00:00.000Z"));if(vr||cr||!sr){var hr=Math.pow(2,31)-1;var pr=Y(new Date(1970,0,1,0,0,0,hr+1).getTime());Date=function(t){var r=function Date(e,n,i,a,f,u,l){var s=arguments.length;var c;if(this instanceof t){var v=u;var h=l;if(pr&&s>=7&&l>hr){var p=Math.floor(l/hr)*hr;var y=Math.floor(p/1e3);v+=y;h-=y*1e3}c=s===1&&o(e)===e?new t(r.parse(e)):s>=7?new t(e,n,i,a,f,v,h):s>=6?new t(e,n,i,a,f,v):s>=5?new t(e,n,i,a,f):s>=4?new t(e,n,i,a):s>=3?new t(e,n,i):s>=2?new t(e,n):s>=1?new t(e instanceof t?+e:e):new t}else{c=t.apply(this,arguments)}if(!J(c)){$(c,{constructor:r},true)}return c};var e=new RegExp("^"+"(\\d{4}|[+-]\\d{6})"+"(?:-(\\d{2})"+"(?:-(\\d{2})"+"(?:"+"T(\\d{2})"+":(\\d{2})"+"(?:"+":(\\d{2})"+"(?:(\\.\\d{1,}))?"+")?"+"("+"Z|"+"(?:"+"([-+])"+"(\\d{2})"+":(\\d{2})"+")"+")?)?)?)?"+"$");var n=[0,31,59,90,120,151,181,212,243,273,304,334,365];var i=function dayFromMonth(t,r){var e=r>1?1:0;return n[r]+Math.floor((t-1969+e)/4)-Math.floor((t-1901+e)/100)+Math.floor((t-1601+e)/400)+365*(t-1970)};var a=function toUTC(r){var e=0;var n=r;if(pr&&n>hr){var i=Math.floor(n/hr)*hr;var a=Math.floor(i/1e3);e+=a;n-=a*1e3}return u(new t(1970,0,1,0,0,e,n))};for(var f in t){if(G(t,f)){r[f]=t[f]}}$(r,{now:t.now,UTC:t.UTC},true);r.prototype=t.prototype;$(r.prototype,{constructor:r},true);var l=function parse(r){var n=e.exec(r);if(n){var o=u(n[1]),f=u(n[2]||1)-1,l=u(n[3]||1)-1,s=u(n[4]||0),c=u(n[5]||0),v=u(n[6]||0),h=Math.floor(u(n[7]||0)*1e3),p=Boolean(n[4]&&!n[8]),y=n[9]==="-"?1:-1,d=u(n[10]||0),g=u(n[11]||0),w;var b=c>0||v>0||h>0;if(s<(b?24:25)&&c<60&&v<60&&h<1e3&&f>-1&&f<12&&d<24&&g<60&&l>-1&&l<i(o,f+1)-i(o,f)){w=((i(o,f)+l)*24+s+d*y)*60;w=((w+c+g*y)*60+v)*1e3+h;if(p){w=a(w)}if(-864e13<=w&&w<=864e13){return w}}return NaN}return t.parse.apply(this,arguments)};$(r,{parse:l});return r}(Date)}if(!Date.now){Date.now=function now(){return(new Date).getTime()}}var yr=l.toFixed&&(8e-5.toFixed(3)!=="0.000"||.9.toFixed(0)!=="1"||1.255.toFixed(2)!=="1.25"||0xde0b6b3a7640080.toFixed(0)!=="1000000000000000128");var dr={base:1e7,size:6,data:[0,0,0,0,0,0],multiply:function multiply(t,r){var e=-1;var n=r;while(++e<dr.size){n+=t*dr.data[e];dr.data[e]=n%dr.base;n=Math.floor(n/dr.base)}},divide:function divide(t){var r=dr.size;var e=0;while(--r>=0){e+=dr.data[r];dr.data[r]=Math.floor(e/t);e=e%t*dr.base}},numToString:function numToString(){var t=dr.size;var r="";while(--t>=0){if(r!==""||t===0||dr.data[t]!==0){var e=o(dr.data[t]);if(r===""){r=e}else{r+=L("0000000",0,7-e.length)+e}}}return r},pow:function pow(t,r,e){return r===0?e:r%2===1?pow(t,r-1,e*t):pow(t*t,r/2,e)},log:function log(t){var r=0;var e=t;while(e>=4096){r+=12;e/=4096}while(e>=2){r+=1;e/=2}return r}};var gr=function toFixed(t){var r,e,n,i,a,f,l,s;r=u(t);r=Y(r)?0:Math.floor(r);if(r<0||r>20){throw new RangeError("Number.toFixed called with invalid number of decimals")}e=u(this);if(Y(e)){return"NaN"}if(e<=-1e21||e>=1e21){return o(e)}n="";if(e<0){n="-";e=-e}i="0";if(e>1e-21){a=dr.log(e*dr.pow(2,69,1))-69;f=a<0?e*dr.pow(2,-a,1):e/dr.pow(2,a,1);f*=4503599627370496;a=52-a;if(a>0){dr.multiply(0,f);l=r;while(l>=7){dr.multiply(1e7,0);l-=7}dr.multiply(dr.pow(10,l,1),0);l=a-1;while(l>=23){dr.divide(1<<23);l-=23}dr.divide(1<<l);dr.multiply(1,1);dr.divide(2);i=dr.numToString()}else{dr.multiply(0,f);dr.multiply(1<<-a,0);i=dr.numToString()+L("0.00000000000000000000",2,2+r)}}if(r>0){s=i.length;if(s<=r){i=n+L("0.0000000000000000000",0,r-s+2)+i}else{i=n+L(i,0,s-r)+"."+L(i,s-r)}}else{i=n+i}return i};$(l,{toFixed:gr},yr);var wr=function(){try{return 1..toPrecision(undefined)==="1"}catch(t){return true}}();var br=l.toPrecision;$(l,{toPrecision:function toPrecision(t){return typeof t==="undefined"?br.call(this):br.call(this,t)}},wr);if("ab".split(/(?:ab)*/).length!==2||".".split(/(.?)(.?)/).length!==4||"tesst".split(/(s)*/)[1]==="t"||"test".split(/(?:)/,-1).length!==4||"".split(/.?/).length||".".split(/()()/).length>1){(function(){var t=typeof/()??/.exec("")[1]==="undefined";var r=Math.pow(2,32)-1;f.split=function(e,n){var i=String(this);if(typeof e==="undefined"&&n===0){return[]}if(!M(e)){return X(this,e,n)}var a=[];var o=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),f=0,u,l,s,c;var h=new RegExp(e.source,o+"g");if(!t){u=new RegExp("^"+h.source+"$(?!\\s)",o)}var p=typeof n==="undefined"?r:Z.ToUint32(n);l=h.exec(i);while(l){s=l.index+l[0].length;if(s>f){K(a,L(i,f,l.index));if(!t&&l.length>1){l[0].replace(u,function(){for(var t=1;t<arguments.length-2;t++){if(typeof arguments[t]==="undefined"){l[t]=void 0}}})}if(l.length>1&&l.index<i.length){v.apply(a,H(l,1))}c=l[0].length;f=s;if(a.length>=p){break}}if(h.lastIndex===l.index){h.lastIndex++}l=h.exec(i)}if(f===i.length){if(c||!h.test("")){K(a,"")}}else{K(a,L(i,f))}return a.length>p?H(a,0,p):a}})()}else if("0".split(void 0,0).length){f.split=function split(t,r){if(typeof t==="undefined"&&r===0){return[]}return X(this,t,r)}}var Tr=f.replace;var mr=function(){var t=[];"x".replace(/x(.)?/g,function(r,e){K(t,e)});return t.length===1&&typeof t[0]==="undefined"}();if(!mr){f.replace=function replace(t,r){var e=D(r);var n=M(t)&&/\)[*?]/.test(t.source);if(!e||!n){return Tr.call(this,t,r)}else{var i=function(e){var n=arguments.length;var i=t.lastIndex;t.lastIndex=0;var a=t.exec(e)||[];t.lastIndex=i;K(a,arguments[n-2],arguments[n-1]);return r.apply(this,a)};return Tr.call(this,t,i)}}}var Dr=f.substr;var xr="".substr&&"0b".substr(-1)!=="b";$(f,{substr:function substr(t,r){var e=t;if(t<0){e=w(this.length+t,0)}return Dr.call(this,e,r)}},xr);var Sr=" \n\x0B\f\r \xa0\u1680\u180e\u2000\u2001\u2002\u2003"+"\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028"+"\u2029\ufeff";var Or="\u200b";var Er="["+Sr+"]";var jr=new RegExp("^"+Er+Er+"*");var Ir=new RegExp(Er+Er+"*$");var Mr=f.trim&&(Sr.trim()||!Or.trim());$(f,{trim:function trim(){if(typeof this==="undefined"||this===null){throw new TypeError("can't convert "+this+" to object")}return o(this).replace(jr,"").replace(Ir,"")}},Mr);var Ur=d.bind(String.prototype.trim);var Fr=f.lastIndexOf&&"abc\u3042\u3044".lastIndexOf("\u3042\u3044",2)!==-1;$(f,{lastIndexOf:function lastIndexOf(t){if(typeof this==="undefined"||this===null){throw new TypeError("can't convert "+this+" to object")}var r=o(this);var e=o(t);var n=arguments.length>1?u(arguments[1]):NaN;var i=Y(n)?Infinity:Z.ToInteger(n);var a=b(w(i,0),r.length);var f=e.length;var l=a+f;while(l>0){l=w(0,l-f);var s=q(L(r,l,a+f),e);if(s!==-1){return l+s}}return-1}},Fr);var Nr=f.lastIndexOf;$(f,{lastIndexOf:function lastIndexOf(t){return Nr.apply(this,arguments)}},f.lastIndexOf.length!==1);if(parseInt(Sr+"08")!==8||parseInt(Sr+"0x16")!==22){parseInt=function(t){var r=/^[\-+]?0[xX]/;return function parseInt(e,n){var i=Ur(e);var a=u(n)||(r.test(i)?16:10);return t(i,a)}}(parseInt)}if(1/parseFloat("-0")!==-Infinity){parseFloat=function(t){return function parseFloat(r){var e=Ur(r);var n=t(e);return n===0&&L(e,0,1)==="-"?-0:n}}(parseFloat)}if(String(new RangeError("test"))!=="RangeError: test"){var Cr=function toString(){if(typeof this==="undefined"||this===null){throw new TypeError("can't convert "+this+" to object")}var t=this.name;if(typeof t==="undefined"){t="Error"}else if(typeof t!=="string"){t=o(t)}var r=this.message;if(typeof r==="undefined"){r=""}else if(typeof r!=="string"){r=o(r)}if(!t){return r}if(!r){return t}return t+": "+r};Error.prototype.toString=Cr}if(P){var kr=function(t,r){if(Q(t,r)){var e=Object.getOwnPropertyDescriptor(t,r);e.enumerable=false;Object.defineProperty(t,r,e)}};kr(Error.prototype,"message");if(Error.prototype.message!==""){Error.prototype.message=""}kr(Error.prototype,"name")}if(String(/a/gim)!=="/a/gim"){var Rr=function toString(){var t="/"+this.source+"/";if(this.global){t+="g"}if(this.ignoreCase){t+="i"}if(this.multiline){t+="m"}return t};RegExp.prototype.toString=Rr}}); +//# sourceMappingURL=es5-shim.map +/*! + * https://github.com/es-shims/es5-shim + * @license es5-shim Copyright 2009-2015 by contributors, MIT License + * see https://github.com/es-shims/es5-shim/blob/v4.5.7/LICENSE + */ +(function(e,t){"use strict";if(typeof define==="function"&&define.amd){define(t)}else if(typeof exports==="object"){module.exports=t()}else{e.returnExports=t()}})(this,function(){var e=Function.call;var t=Object.prototype;var r=e.bind(t.hasOwnProperty);var n=e.bind(t.propertyIsEnumerable);var o=e.bind(t.toString);var i;var c;var f;var a;var l=r(t,"__defineGetter__");if(l){i=e.bind(t.__defineGetter__);c=e.bind(t.__defineSetter__);f=e.bind(t.__lookupGetter__);a=e.bind(t.__lookupSetter__)}if(!Object.getPrototypeOf){Object.getPrototypeOf=function getPrototypeOf(e){var r=e.__proto__;if(r||r===null){return r}else if(o(e.constructor)==="[object Function]"){return e.constructor.prototype}else if(e instanceof Object){return t}else{return null}}}var u=function doesGetOwnPropertyDescriptorWork(e){try{e.sentinel=0;return Object.getOwnPropertyDescriptor(e,"sentinel").value===0}catch(t){return false}};if(Object.defineProperty){var p=u({});var s=typeof document==="undefined"||u(document.createElement("div"));if(!s||!p){var b=Object.getOwnPropertyDescriptor}}if(!Object.getOwnPropertyDescriptor||b){var O="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function getOwnPropertyDescriptor(e,o){if(typeof e!=="object"&&typeof e!=="function"||e===null){throw new TypeError(O+e)}if(b){try{return b.call(Object,e,o)}catch(i){}}var c;if(!r(e,o)){return c}c={enumerable:n(e,o),configurable:true};if(l){var u=e.__proto__;var p=e!==t;if(p){e.__proto__=t}var s=f(e,o);var y=a(e,o);if(p){e.__proto__=u}if(s||y){if(s){c.get=s}if(y){c.set=y}return c}}c.value=e[o];c.writable=true;return c}}if(!Object.getOwnPropertyNames){Object.getOwnPropertyNames=function getOwnPropertyNames(e){return Object.keys(e)}}if(!Object.create){var y;var d=!({__proto__:null}instanceof Object);var j=function shouldUseActiveX(){if(!document.domain){return false}try{return!!new ActiveXObject("htmlfile")}catch(e){return false}};var v=function getEmptyViaActiveX(){var e;var t;t=new ActiveXObject("htmlfile");t.write("<script></script>");t.close();e=t.parentWindow.Object.prototype;t=null;return e};var _=function getEmptyViaIFrame(){var e=document.createElement("iframe");var t=document.body||document.documentElement;var r;e.style.display="none";t.appendChild(e);e.src="javascript:";r=e.contentWindow.Object.prototype;t.removeChild(e);e=null;return r};if(d||typeof document==="undefined"){y=function(){return{__proto__:null}}}else{y=function(){var e=j()?v():_();delete e.constructor;delete e.hasOwnProperty;delete e.propertyIsEnumerable;delete e.isPrototypeOf;delete e.toLocaleString;delete e.toString;delete e.valueOf;var t=function Empty(){};t.prototype=e;y=function(){return new t};return new t}}Object.create=function create(e,t){var r;var n=function Type(){};if(e===null){r=y()}else{if(typeof e!=="object"&&typeof e!=="function"){throw new TypeError("Object prototype may only be an Object or null")}n.prototype=e;r=new n;r.__proto__=e}if(t!==void 0){Object.defineProperties(r,t)}return r}}var w=function doesDefinePropertyWork(e){try{Object.defineProperty(e,"sentinel",{});return"sentinel"in e}catch(t){return false}};if(Object.defineProperty){var m=w({});var P=typeof document==="undefined"||w(document.createElement("div"));if(!m||!P){var E=Object.defineProperty,h=Object.defineProperties}}if(!Object.defineProperty||E){var g="Property description must be an object: ";var z="Object.defineProperty called on non-object: ";var T="getters & setters can not be defined on this javascript engine";Object.defineProperty=function defineProperty(e,r,n){if(typeof e!=="object"&&typeof e!=="function"||e===null){throw new TypeError(z+e)}if(typeof n!=="object"&&typeof n!=="function"||n===null){throw new TypeError(g+n)}if(E){try{return E.call(Object,e,r,n)}catch(o){}}if("value"in n){if(l&&(f(e,r)||a(e,r))){var u=e.__proto__;e.__proto__=t;delete e[r];e[r]=n.value;e.__proto__=u}else{e[r]=n.value}}else{if(!l&&("get"in n||"set"in n)){throw new TypeError(T)}if("get"in n){i(e,r,n.get)}if("set"in n){c(e,r,n.set)}}return e}}if(!Object.defineProperties||h){Object.defineProperties=function defineProperties(e,t){if(h){try{return h.call(Object,e,t)}catch(r){}}Object.keys(t).forEach(function(r){if(r!=="__proto__"){Object.defineProperty(e,r,t[r])}});return e}}if(!Object.seal){Object.seal=function seal(e){if(Object(e)!==e){throw new TypeError("Object.seal can only be called on Objects.")}return e}}if(!Object.freeze){Object.freeze=function freeze(e){if(Object(e)!==e){throw new TypeError("Object.freeze can only be called on Objects.")}return e}}try{Object.freeze(function(){})}catch(x){Object.freeze=function(e){return function freeze(t){if(typeof t==="function"){return t}else{return e(t)}}}(Object.freeze)}if(!Object.preventExtensions){Object.preventExtensions=function preventExtensions(e){if(Object(e)!==e){throw new TypeError("Object.preventExtensions can only be called on Objects.")}return e}}if(!Object.isSealed){Object.isSealed=function isSealed(e){if(Object(e)!==e){throw new TypeError("Object.isSealed can only be called on Objects.")}return false}}if(!Object.isFrozen){Object.isFrozen=function isFrozen(e){if(Object(e)!==e){throw new TypeError("Object.isFrozen can only be called on Objects.")}return false}}if(!Object.isExtensible){Object.isExtensible=function isExtensible(e){if(Object(e)!==e){throw new TypeError("Object.isExtensible can only be called on Objects.")}var t="";while(r(e,t)){t+="?"}e[t]=true;var n=r(e,t);delete e[t];return n}}}); +//# sourceMappingURL=es5-sham.map +/*! + * https://github.com/paulmillr/es6-shim + * @license es6-shim Copyright 2013-2016 by Paul Miller (http://paulmillr.com) + * and contributors, MIT License + * es6-sham: v0.35.1 + * see https://github.com/paulmillr/es6-shim/blob/0.35.1/LICENSE + * Details and documentation: + * https://github.com/paulmillr/es6-shim/ + */ +(function(t,e){if(typeof define==="function"&&define.amd){define(e)}else if(typeof exports==="object"){module.exports=e()}else{t.returnExports=e()}})(this,function(){"use strict";var t=new Function("return this;");var e=t();var r=e.Object;var n=Function.call.bind(Function.call);var o=Function.toString;var i=String.prototype.match;var f=function(t){try{t();return false}catch(e){return true}};var a=function(){return!f(function(){r.defineProperty({},"x",{get:function(){}})})};var u=!!r.defineProperty&&a();(function(){if(r.setPrototypeOf){return}var t=r.getOwnPropertyNames;var e=r.getOwnPropertyDescriptor;var n=r.create;var o=r.defineProperty;var i=r.getPrototypeOf;var f=r.prototype;var a=function(r,n){t(n).forEach(function(t){o(r,t,e(n,t))});return r};var u=function(t,e){return a(n(e),t)};var c,s;try{c=e(f,"__proto__").set;c.call({},null);s=function(t,e){c.call(t,e);return t}}catch(l){c={__proto__:null};if(c instanceof r){s=u}else{c.__proto__=f;if(c instanceof r){s=function(t,e){t.__proto__=e;return t}}else{s=function(t,e){if(i(t)){t.__proto__=e;return t}else{return u(t,e)}}}}}r.setPrototypeOf=s})();if(u&&function foo(){}.name!=="foo"){r.defineProperty(Function.prototype,"name",{configurable:true,enumerable:false,get:function(){var t=n(o,this);var e=n(i,t,/\s*function\s+([^\(\s]*)\s*/);var f=e&&e[1];r.defineProperty(this,"name",{configurable:true,enumerable:false,writable:false,value:f});return f}})}}); +//# sourceMappingURL=es6-sham.map +/*! + * https://github.com/paulmillr/es6-shim + * @license es6-shim Copyright 2013-2016 by Paul Miller (http://paulmillr.com) + * and contributors, MIT License + * es6-shim: v0.35.1 + * see https://github.com/paulmillr/es6-shim/blob/0.35.1/LICENSE + * Details and documentation: + * https://github.com/paulmillr/es6-shim/ + */ +(function(e,t){if(typeof define==="function"&&define.amd){define(t)}else if(typeof exports==="object"){module.exports=t()}else{e.returnExports=t()}})(this,function(){"use strict";var e=Function.call.bind(Function.apply);var t=Function.call.bind(Function.call);var r=Array.isArray;var n=Object.keys;var o=function notThunker(t){return function notThunk(){return!e(t,this,arguments)}};var i=function(e){try{e();return false}catch(t){return true}};var a=function valueOrFalseIfThrows(e){try{return e()}catch(t){return false}};var u=o(i);var f=function(){return!i(function(){Object.defineProperty({},"x",{get:function(){}})})};var s=!!Object.defineProperty&&f();var c=function foo(){}.name==="foo";var l=Function.call.bind(Array.prototype.forEach);var p=Function.call.bind(Array.prototype.reduce);var v=Function.call.bind(Array.prototype.filter);var y=Function.call.bind(Array.prototype.some);var h=function(e,t,r,n){if(!n&&t in e){return}if(s){Object.defineProperty(e,t,{configurable:true,enumerable:false,writable:true,value:r})}else{e[t]=r}};var b=function(e,t,r){l(n(t),function(n){var o=t[n];h(e,n,o,!!r)})};var g=Function.call.bind(Object.prototype.toString);var d=typeof/abc/==="function"?function IsCallableSlow(e){return typeof e==="function"&&g(e)==="[object Function]"}:function IsCallableFast(e){return typeof e==="function"};var O={getter:function(e,t,r){if(!s){throw new TypeError("getters require true ES5 support")}Object.defineProperty(e,t,{configurable:true,enumerable:false,get:r})},proxy:function(e,t,r){if(!s){throw new TypeError("getters require true ES5 support")}var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,{configurable:n.configurable,enumerable:n.enumerable,get:function getKey(){return e[t]},set:function setKey(r){e[t]=r}})},redefine:function(e,t,r){if(s){var n=Object.getOwnPropertyDescriptor(e,t);n.value=r;Object.defineProperty(e,t,n)}else{e[t]=r}},defineByDescriptor:function(e,t,r){if(s){Object.defineProperty(e,t,r)}else if("value"in r){e[t]=r.value}},preserveToString:function(e,t){if(t&&d(t.toString)){h(e,"toString",t.toString.bind(t),true)}}};var m=Object.create||function(e,t){var r=function Prototype(){};r.prototype=e;var o=new r;if(typeof t!=="undefined"){n(t).forEach(function(e){O.defineByDescriptor(o,e,t[e])})}return o};var w=function(e,t){if(!Object.setPrototypeOf){return false}return a(function(){var r=function Subclass(t){var r=new e(t);Object.setPrototypeOf(r,Subclass.prototype);return r};Object.setPrototypeOf(r,e);r.prototype=m(e.prototype,{constructor:{value:r}});return t(r)})};var j=function(){if(typeof self!=="undefined"){return self}if(typeof window!=="undefined"){return window}if(typeof global!=="undefined"){return global}throw new Error("unable to locate global object")};var S=j();var T=S.isFinite;var I=Function.call.bind(String.prototype.indexOf);var E=Function.apply.bind(Array.prototype.indexOf);var P=Function.call.bind(Array.prototype.concat);var C=Function.call.bind(String.prototype.slice);var M=Function.call.bind(Array.prototype.push);var x=Function.apply.bind(Array.prototype.push);var N=Function.call.bind(Array.prototype.shift);var A=Math.max;var R=Math.min;var _=Math.floor;var k=Math.abs;var F=Math.exp;var L=Math.log;var D=Math.sqrt;var z=Function.call.bind(Object.prototype.hasOwnProperty);var q;var W=function(){};var G=S.Symbol||{};var H=G.species||"@@species";var V=Number.isNaN||function isNaN(e){return e!==e};var B=Number.isFinite||function isFinite(e){return typeof e==="number"&&T(e)};var $=d(Math.sign)?Math.sign:function sign(e){var t=Number(e);if(t===0){return t}if(V(t)){return t}return t<0?-1:1};var U=function isArguments(e){return g(e)==="[object Arguments]"};var J=function isArguments(e){return e!==null&&typeof e==="object"&&typeof e.length==="number"&&e.length>=0&&g(e)!=="[object Array]"&&g(e.callee)==="[object Function]"};var X=U(arguments)?U:J;var K={primitive:function(e){return e===null||typeof e!=="function"&&typeof e!=="object"},string:function(e){return g(e)==="[object String]"},regex:function(e){return g(e)==="[object RegExp]"},symbol:function(e){return typeof S.Symbol==="function"&&typeof e==="symbol"}};var Z=function overrideNative(e,t,r){var n=e[t];h(e,t,r,true);O.preserveToString(e[t],n)};var Y=typeof G==="function"&&typeof G["for"]==="function"&&K.symbol(G());var Q=K.symbol(G.iterator)?G.iterator:"_es6-shim iterator_";if(S.Set&&typeof(new S.Set)["@@iterator"]==="function"){Q="@@iterator"}if(!S.Reflect){h(S,"Reflect",{},true)}var ee=S.Reflect;var te=String;var re={Call:function Call(t,r){var n=arguments.length>2?arguments[2]:[];if(!re.IsCallable(t)){throw new TypeError(t+" is not a function")}return e(t,r,n)},RequireObjectCoercible:function(e,t){if(e==null){throw new TypeError(t||"Cannot call method on "+e)}return e},TypeIsObject:function(e){if(e===void 0||e===null||e===true||e===false){return false}return typeof e==="function"||typeof e==="object"},ToObject:function(e,t){return Object(re.RequireObjectCoercible(e,t))},IsCallable:d,IsConstructor:function(e){return re.IsCallable(e)},ToInt32:function(e){return re.ToNumber(e)>>0},ToUint32:function(e){return re.ToNumber(e)>>>0},ToNumber:function(e){if(g(e)==="[object Symbol]"){throw new TypeError("Cannot convert a Symbol value to a number")}return+e},ToInteger:function(e){var t=re.ToNumber(e);if(V(t)){return 0}if(t===0||!B(t)){return t}return(t>0?1:-1)*_(k(t))},ToLength:function(e){var t=re.ToInteger(e);if(t<=0){return 0}if(t>Number.MAX_SAFE_INTEGER){return Number.MAX_SAFE_INTEGER}return t},SameValue:function(e,t){if(e===t){if(e===0){return 1/e===1/t}return true}return V(e)&&V(t)},SameValueZero:function(e,t){return e===t||V(e)&&V(t)},IsIterable:function(e){return re.TypeIsObject(e)&&(typeof e[Q]!=="undefined"||X(e))},GetIterator:function(e){if(X(e)){return new q(e,"value")}var t=re.GetMethod(e,Q);if(!re.IsCallable(t)){throw new TypeError("value is not an iterable")}var r=re.Call(t,e);if(!re.TypeIsObject(r)){throw new TypeError("bad iterator")}return r},GetMethod:function(e,t){var r=re.ToObject(e)[t];if(r===void 0||r===null){return void 0}if(!re.IsCallable(r)){throw new TypeError("Method not callable: "+t)}return r},IteratorComplete:function(e){return!!e.done},IteratorClose:function(e,t){var r=re.GetMethod(e,"return");if(r===void 0){return}var n,o;try{n=re.Call(r,e)}catch(i){o=i}if(t){return}if(o){throw o}if(!re.TypeIsObject(n)){throw new TypeError("Iterator's return method returned a non-object.")}},IteratorNext:function(e){var t=arguments.length>1?e.next(arguments[1]):e.next();if(!re.TypeIsObject(t)){throw new TypeError("bad iterator")}return t},IteratorStep:function(e){var t=re.IteratorNext(e);var r=re.IteratorComplete(t);return r?false:t},Construct:function(e,t,r,n){var o=typeof r==="undefined"?e:r;if(!n&&ee.construct){return ee.construct(e,t,o)}var i=o.prototype;if(!re.TypeIsObject(i)){i=Object.prototype}var a=m(i);var u=re.Call(e,a,t);return re.TypeIsObject(u)?u:a},SpeciesConstructor:function(e,t){var r=e.constructor;if(r===void 0){return t}if(!re.TypeIsObject(r)){throw new TypeError("Bad constructor")}var n=r[H];if(n===void 0||n===null){return t}if(!re.IsConstructor(n)){throw new TypeError("Bad @@species")}return n},CreateHTML:function(e,t,r,n){var o=re.ToString(e);var i="<"+t;if(r!==""){var a=re.ToString(n);var u=a.replace(/"/g,"&quot;");i+=" "+r+'="'+u+'"'}var f=i+">";var s=f+o;return s+"</"+t+">"},IsRegExp:function IsRegExp(e){if(!re.TypeIsObject(e)){return false}var t=e[G.match];if(typeof t!=="undefined"){return!!t}return K.regex(e)},ToString:function ToString(e){return te(e)}};if(s&&Y){var ne=function defineWellKnownSymbol(e){if(K.symbol(G[e])){return G[e]}var t=G["for"]("Symbol."+e);Object.defineProperty(G,e,{configurable:false,enumerable:false,writable:false,value:t});return t};if(!K.symbol(G.search)){var oe=ne("search");var ie=String.prototype.search;h(RegExp.prototype,oe,function search(e){return re.Call(ie,e,[this])});var ae=function search(e){var t=re.RequireObjectCoercible(this);if(e!==null&&typeof e!=="undefined"){var r=re.GetMethod(e,oe);if(typeof r!=="undefined"){return re.Call(r,e,[t])}}return re.Call(ie,t,[re.ToString(e)])};Z(String.prototype,"search",ae)}if(!K.symbol(G.replace)){var ue=ne("replace");var fe=String.prototype.replace;h(RegExp.prototype,ue,function replace(e,t){return re.Call(fe,e,[this,t])});var se=function replace(e,t){var r=re.RequireObjectCoercible(this);if(e!==null&&typeof e!=="undefined"){var n=re.GetMethod(e,ue);if(typeof n!=="undefined"){return re.Call(n,e,[r,t])}}return re.Call(fe,r,[re.ToString(e),t])};Z(String.prototype,"replace",se)}if(!K.symbol(G.split)){var ce=ne("split");var le=String.prototype.split;h(RegExp.prototype,ce,function split(e,t){return re.Call(le,e,[this,t])});var pe=function split(e,t){var r=re.RequireObjectCoercible(this);if(e!==null&&typeof e!=="undefined"){var n=re.GetMethod(e,ce);if(typeof n!=="undefined"){return re.Call(n,e,[r,t])}}return re.Call(le,r,[re.ToString(e),t])};Z(String.prototype,"split",pe)}var ve=K.symbol(G.match);var ye=ve&&function(){var e={};e[G.match]=function(){return 42};return"a".match(e)!==42}();if(!ve||ye){var he=ne("match");var be=String.prototype.match;h(RegExp.prototype,he,function match(e){return re.Call(be,e,[this])});var ge=function match(e){var t=re.RequireObjectCoercible(this);if(e!==null&&typeof e!=="undefined"){var r=re.GetMethod(e,he);if(typeof r!=="undefined"){return re.Call(r,e,[t])}}return re.Call(be,t,[re.ToString(e)])};Z(String.prototype,"match",ge)}}var de=function wrapConstructor(e,t,r){O.preserveToString(t,e);if(Object.setPrototypeOf){Object.setPrototypeOf(e,t)}if(s){l(Object.getOwnPropertyNames(e),function(n){if(n in W||r[n]){return}O.proxy(e,n,t)})}else{l(Object.keys(e),function(n){if(n in W||r[n]){return}t[n]=e[n]})}t.prototype=e.prototype;O.redefine(e.prototype,"constructor",t)};var Oe=function(){return this};var me=function(e){if(s&&!z(e,H)){O.getter(e,H,Oe)}};var we=function(e,t){var r=t||function iterator(){return this};h(e,Q,r);if(!e[Q]&&K.symbol(Q)){e[Q]=r}};var je=function createDataProperty(e,t,r){if(s){Object.defineProperty(e,t,{configurable:true,enumerable:true,writable:true,value:r})}else{e[t]=r}};var Se=function createDataPropertyOrThrow(e,t,r){je(e,t,r);if(!re.SameValue(e[t],r)){throw new TypeError("property is nonconfigurable")}};var Te=function(e,t,r,n){if(!re.TypeIsObject(e)){throw new TypeError("Constructor requires `new`: "+t.name)}var o=t.prototype;if(!re.TypeIsObject(o)){o=r}var i=m(o);for(var a in n){if(z(n,a)){var u=n[a];h(i,a,u,true)}}return i};if(String.fromCodePoint&&String.fromCodePoint.length!==1){var Ie=String.fromCodePoint;Z(String,"fromCodePoint",function fromCodePoint(e){return re.Call(Ie,this,arguments)})}var Ee={fromCodePoint:function fromCodePoint(e){var t=[];var r;for(var n=0,o=arguments.length;n<o;n++){r=Number(arguments[n]);if(!re.SameValue(r,re.ToInteger(r))||r<0||r>1114111){throw new RangeError("Invalid code point "+r)}if(r<65536){M(t,String.fromCharCode(r))}else{r-=65536;M(t,String.fromCharCode((r>>10)+55296));M(t,String.fromCharCode(r%1024+56320))}}return t.join("")},raw:function raw(e){var t=re.ToObject(e,"bad callSite");var r=re.ToObject(t.raw,"bad raw value");var n=r.length;var o=re.ToLength(n);if(o<=0){return""}var i=[];var a=0;var u,f,s,c;while(a<o){u=re.ToString(a);s=re.ToString(r[u]);M(i,s);if(a+1>=o){break}f=a+1<arguments.length?arguments[a+1]:"";c=re.ToString(f);M(i,c);a+=1}return i.join("")}};if(String.raw&&String.raw({raw:{0:"x",1:"y",length:2}})!=="xy"){Z(String,"raw",Ee.raw)}b(String,Ee);var Pe=function repeat(e,t){if(t<1){return""}if(t%2){return repeat(e,t-1)+e}var r=repeat(e,t/2);return r+r};var Ce=Infinity;var Me={repeat:function repeat(e){var t=re.ToString(re.RequireObjectCoercible(this));var r=re.ToInteger(e);if(r<0||r>=Ce){throw new RangeError("repeat count must be less than infinity and not overflow maximum string size")}return Pe(t,r)},startsWith:function startsWith(e){var t=re.ToString(re.RequireObjectCoercible(this));if(re.IsRegExp(e)){throw new TypeError('Cannot call method "startsWith" with a regex')}var r=re.ToString(e);var n;if(arguments.length>1){n=arguments[1]}var o=A(re.ToInteger(n),0);return C(t,o,o+r.length)===r},endsWith:function endsWith(e){var t=re.ToString(re.RequireObjectCoercible(this));if(re.IsRegExp(e)){throw new TypeError('Cannot call method "endsWith" with a regex')}var r=re.ToString(e);var n=t.length;var o;if(arguments.length>1){o=arguments[1]}var i=typeof o==="undefined"?n:re.ToInteger(o);var a=R(A(i,0),n);return C(t,a-r.length,a)===r},includes:function includes(e){if(re.IsRegExp(e)){throw new TypeError('"includes" does not accept a RegExp')}var t=re.ToString(e);var r;if(arguments.length>1){r=arguments[1]}return I(this,t,r)!==-1},codePointAt:function codePointAt(e){var t=re.ToString(re.RequireObjectCoercible(this));var r=re.ToInteger(e);var n=t.length;if(r>=0&&r<n){var o=t.charCodeAt(r);var i=r+1===n;if(o<55296||o>56319||i){return o}var a=t.charCodeAt(r+1);if(a<56320||a>57343){return o}return(o-55296)*1024+(a-56320)+65536}}};if(String.prototype.includes&&"a".includes("a",Infinity)!==false){Z(String.prototype,"includes",Me.includes)}if(String.prototype.startsWith&&String.prototype.endsWith){var xe=i(function(){"/a/".startsWith(/a/)});var Ne=a(function(){return"abc".startsWith("a",Infinity)===false});if(!xe||!Ne){Z(String.prototype,"startsWith",Me.startsWith);Z(String.prototype,"endsWith",Me.endsWith)}}if(Y){var Ae=a(function(){var e=/a/;e[G.match]=false;return"/a/".startsWith(e)});if(!Ae){Z(String.prototype,"startsWith",Me.startsWith)}var Re=a(function(){var e=/a/;e[G.match]=false;return"/a/".endsWith(e)});if(!Re){Z(String.prototype,"endsWith",Me.endsWith)}var _e=a(function(){var e=/a/;e[G.match]=false;return"/a/".includes(e)});if(!_e){Z(String.prototype,"includes",Me.includes)}}b(String.prototype,Me);var ke=[" \n\x0B\f\r \xa0\u1680\u180e\u2000\u2001\u2002\u2003","\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028","\u2029\ufeff"].join("");var Fe=new RegExp("(^["+ke+"]+)|(["+ke+"]+$)","g");var Le=function trim(){return re.ToString(re.RequireObjectCoercible(this)).replace(Fe,"")};var De=["\x85","\u200b","\ufffe"].join("");var ze=new RegExp("["+De+"]","g");var qe=/^[\-+]0x[0-9a-f]+$/i;var We=De.trim().length!==De.length;h(String.prototype,"trim",Le,We);var Ge=function(e){return{value:e,done:arguments.length===0}};var He=function(e){re.RequireObjectCoercible(e);this._s=re.ToString(e);this._i=0};He.prototype.next=function(){var e=this._s;var t=this._i;if(typeof e==="undefined"||t>=e.length){this._s=void 0;return Ge()}var r=e.charCodeAt(t);var n,o;if(r<55296||r>56319||t+1===e.length){o=1}else{n=e.charCodeAt(t+1);o=n<56320||n>57343?1:2}this._i=t+o;return Ge(e.substr(t,o))};we(He.prototype);we(String.prototype,function(){return new He(this)});var Ve={from:function from(e){var r=this;var n;if(arguments.length>1){n=arguments[1]}var o,i;if(typeof n==="undefined"){o=false}else{if(!re.IsCallable(n)){throw new TypeError("Array.from: when provided, the second argument must be a function")}if(arguments.length>2){i=arguments[2]}o=true}var a=typeof(X(e)||re.GetMethod(e,Q))!=="undefined";var u,f,s;if(a){f=re.IsConstructor(r)?Object(new r):[];var c=re.GetIterator(e);var l,p;s=0;while(true){l=re.IteratorStep(c);if(l===false){break}p=l.value;try{if(o){p=typeof i==="undefined"?n(p,s):t(n,i,p,s)}f[s]=p}catch(v){re.IteratorClose(c,true);throw v}s+=1}u=s}else{var y=re.ToObject(e);u=re.ToLength(y.length);f=re.IsConstructor(r)?Object(new r(u)):new Array(u);var h;for(s=0;s<u;++s){h=y[s];if(o){h=typeof i==="undefined"?n(h,s):t(n,i,h,s)}Se(f,s,h)}}f.length=u;return f},of:function of(){var e=arguments.length;var t=this;var n=r(t)||!re.IsCallable(t)?new Array(e):re.Construct(t,[e]);for(var o=0;o<e;++o){Se(n,o,arguments[o])}n.length=e;return n}};b(Array,Ve);me(Array);q=function(e,t){this.i=0;this.array=e;this.kind=t};b(q.prototype,{next:function(){var e=this.i;var t=this.array;if(!(this instanceof q)){throw new TypeError("Not an ArrayIterator")}if(typeof t!=="undefined"){var r=re.ToLength(t.length);for(;e<r;e++){var n=this.kind;var o;if(n==="key"){o=e}else if(n==="value"){o=t[e]}else if(n==="entry"){o=[e,t[e]]}this.i=e+1;return Ge(o)}}this.array=void 0;return Ge()}});we(q.prototype);var Be=Array.of===Ve.of||function(){var e=function Foo(e){this.length=e};e.prototype=[];var t=Array.of.apply(e,[1,2]);return t instanceof e&&t.length===2}();if(!Be){Z(Array,"of",Ve.of)}var $e={copyWithin:function copyWithin(e,t){var r=re.ToObject(this);var n=re.ToLength(r.length);var o=re.ToInteger(e);var i=re.ToInteger(t);var a=o<0?A(n+o,0):R(o,n);var u=i<0?A(n+i,0):R(i,n);var f;if(arguments.length>2){f=arguments[2]}var s=typeof f==="undefined"?n:re.ToInteger(f);var c=s<0?A(n+s,0):R(s,n);var l=R(c-u,n-a);var p=1;if(u<a&&a<u+l){p=-1;u+=l-1;a+=l-1}while(l>0){if(u in r){r[a]=r[u]}else{delete r[a]}u+=p;a+=p;l-=1}return r},fill:function fill(e){var t;if(arguments.length>1){t=arguments[1]}var r;if(arguments.length>2){r=arguments[2]}var n=re.ToObject(this);var o=re.ToLength(n.length);t=re.ToInteger(typeof t==="undefined"?0:t);r=re.ToInteger(typeof r==="undefined"?o:r);var i=t<0?A(o+t,0):R(t,o);var a=r<0?o+r:r;for(var u=i;u<o&&u<a;++u){n[u]=e}return n},find:function find(e){var r=re.ToObject(this);var n=re.ToLength(r.length);if(!re.IsCallable(e)){throw new TypeError("Array#find: predicate must be a function")}var o=arguments.length>1?arguments[1]:null;for(var i=0,a;i<n;i++){a=r[i];if(o){if(t(e,o,a,i,r)){return a}}else if(e(a,i,r)){return a}}},findIndex:function findIndex(e){var r=re.ToObject(this);var n=re.ToLength(r.length);if(!re.IsCallable(e)){throw new TypeError("Array#findIndex: predicate must be a function")}var o=arguments.length>1?arguments[1]:null;for(var i=0;i<n;i++){if(o){if(t(e,o,r[i],i,r)){return i}}else if(e(r[i],i,r)){return i}}return-1},keys:function keys(){return new q(this,"key")},values:function values(){return new q(this,"value")},entries:function entries(){return new q(this,"entry")}};if(Array.prototype.keys&&!re.IsCallable([1].keys().next)){delete Array.prototype.keys}if(Array.prototype.entries&&!re.IsCallable([1].entries().next)){delete Array.prototype.entries}if(Array.prototype.keys&&Array.prototype.entries&&!Array.prototype.values&&Array.prototype[Q]){b(Array.prototype,{values:Array.prototype[Q]});if(K.symbol(G.unscopables)){Array.prototype[G.unscopables].values=true}}if(c&&Array.prototype.values&&Array.prototype.values.name!=="values"){var Ue=Array.prototype.values;Z(Array.prototype,"values",function values(){return re.Call(Ue,this,arguments)});h(Array.prototype,Q,Array.prototype.values,true)}b(Array.prototype,$e);if(1/[true].indexOf(true,-0)<0){h(Array.prototype,"indexOf",function indexOf(e){var t=E(this,arguments);if(t===0&&1/t<0){return 0}return t},true)}we(Array.prototype,function(){return this.values()});if(Object.getPrototypeOf){we(Object.getPrototypeOf([].values()))}var Je=function(){return a(function(){return Array.from({length:-1}).length===0})}();var Xe=function(){var e=Array.from([0].entries());return e.length===1&&r(e[0])&&e[0][0]===0&&e[0][1]===0}();if(!Je||!Xe){Z(Array,"from",Ve.from)}var Ke=function(){return a(function(){return Array.from([0],void 0)})}();if(!Ke){var Ze=Array.from;Z(Array,"from",function from(e){if(arguments.length>1&&typeof arguments[1]!=="undefined"){return re.Call(Ze,this,arguments)}else{return t(Ze,this,e)}})}var Ye=-(Math.pow(2,32)-1);var Qe=function(e,r){var n={length:Ye};n[r?(n.length>>>0)-1:0]=true;return a(function(){t(e,n,function(){throw new RangeError("should not reach here")},[]);return true})};if(!Qe(Array.prototype.forEach)){var et=Array.prototype.forEach;Z(Array.prototype,"forEach",function forEach(e){return re.Call(et,this.length>=0?this:[],arguments)},true)}if(!Qe(Array.prototype.map)){var tt=Array.prototype.map;Z(Array.prototype,"map",function map(e){return re.Call(tt,this.length>=0?this:[],arguments)},true)}if(!Qe(Array.prototype.filter)){var rt=Array.prototype.filter;Z(Array.prototype,"filter",function filter(e){return re.Call(rt,this.length>=0?this:[],arguments)},true)}if(!Qe(Array.prototype.some)){var nt=Array.prototype.some;Z(Array.prototype,"some",function some(e){return re.Call(nt,this.length>=0?this:[],arguments)},true)}if(!Qe(Array.prototype.every)){var ot=Array.prototype.every;Z(Array.prototype,"every",function every(e){return re.Call(ot,this.length>=0?this:[],arguments)},true)}if(!Qe(Array.prototype.reduce)){var it=Array.prototype.reduce;Z(Array.prototype,"reduce",function reduce(e){return re.Call(it,this.length>=0?this:[],arguments)},true)}if(!Qe(Array.prototype.reduceRight,true)){var at=Array.prototype.reduceRight;Z(Array.prototype,"reduceRight",function reduceRight(e){return re.Call(at,this.length>=0?this:[],arguments)},true)}var ut=Number("0o10")!==8;var ft=Number("0b10")!==2;var st=y(De,function(e){return Number(e+0+e)===0});if(ut||ft||st){var ct=Number;var lt=/^0b[01]+$/i;var pt=/^0o[0-7]+$/i;var vt=lt.test.bind(lt);var yt=pt.test.bind(pt);var ht=function(e){var t;if(typeof e.valueOf==="function"){t=e.valueOf();if(K.primitive(t)){return t}}if(typeof e.toString==="function"){t=e.toString();if(K.primitive(t)){return t}}throw new TypeError("No default value")};var bt=ze.test.bind(ze);var gt=qe.test.bind(qe);var dt=function(){var e=function Number(t){var r;if(arguments.length>0){r=K.primitive(t)?t:ht(t,"number")}else{r=0}if(typeof r==="string"){r=re.Call(Le,r);if(vt(r)){r=parseInt(C(r,2),2)}else if(yt(r)){r=parseInt(C(r,2),8)}else if(bt(r)||gt(r)){r=NaN}}var n=this;var o=a(function(){ct.prototype.valueOf.call(n);return true});if(n instanceof e&&!o){return new ct(r)}return ct(r)};return e}();de(ct,dt,{});b(dt,{NaN:ct.NaN,MAX_VALUE:ct.MAX_VALUE,MIN_VALUE:ct.MIN_VALUE,NEGATIVE_INFINITY:ct.NEGATIVE_INFINITY,POSITIVE_INFINITY:ct.POSITIVE_INFINITY});Number=dt;O.redefine(S,"Number",dt)}var Ot=Math.pow(2,53)-1;b(Number,{MAX_SAFE_INTEGER:Ot,MIN_SAFE_INTEGER:-Ot,EPSILON:2.220446049250313e-16,parseInt:S.parseInt,parseFloat:S.parseFloat,isFinite:B,isInteger:function isInteger(e){return B(e)&&re.ToInteger(e)===e},isSafeInteger:function isSafeInteger(e){return Number.isInteger(e)&&k(e)<=Number.MAX_SAFE_INTEGER},isNaN:V});h(Number,"parseInt",S.parseInt,Number.parseInt!==S.parseInt);if(![,1].find(function(e,t){return t===0})){Z(Array.prototype,"find",$e.find)}if([,1].findIndex(function(e,t){return t===0})!==0){Z(Array.prototype,"findIndex",$e.findIndex)}var mt=Function.bind.call(Function.bind,Object.prototype.propertyIsEnumerable);var wt=function ensureEnumerable(e,t){if(s&&mt(e,t)){Object.defineProperty(e,t,{enumerable:false})}};var jt=function sliceArgs(){var e=Number(this);var t=arguments.length;var r=t-e;var n=new Array(r<0?0:r);for(var o=e;o<t;++o){n[o-e]=arguments[o]}return n};var St=function assignTo(e){return function assignToSource(t,r){t[r]=e[r];return t}};var Tt=function(e,t){var r=n(Object(t));var o;if(re.IsCallable(Object.getOwnPropertySymbols)){o=v(Object.getOwnPropertySymbols(Object(t)),mt(t))}return p(P(r,o||[]),St(t),e)};var It={assign:function(e,t){var r=re.ToObject(e,"Cannot convert undefined or null to object");return p(re.Call(jt,1,arguments),Tt,r)},is:function is(e,t){return re.SameValue(e,t)}};var Et=Object.assign&&Object.preventExtensions&&function(){var e=Object.preventExtensions({1:2});try{Object.assign(e,"xy")}catch(t){return e[1]==="y"}}();if(Et){Z(Object,"assign",It.assign)}b(Object,It);if(s){var Pt={setPrototypeOf:function(e,r){var n;var o=function(e,t){if(!re.TypeIsObject(e)){throw new TypeError("cannot set prototype on a non-object")}if(!(t===null||re.TypeIsObject(t))){throw new TypeError("can only set prototype to an object or null"+t)}};var i=function(e,r){o(e,r);t(n,e,r);return e};try{n=e.getOwnPropertyDescriptor(e.prototype,r).set;t(n,{},null)}catch(a){if(e.prototype!=={}[r]){return}n=function(e){this[r]=e};i.polyfill=i(i({},null),e.prototype)instanceof e}return i}(Object,"__proto__")};b(Object,Pt)}if(Object.setPrototypeOf&&Object.getPrototypeOf&&Object.getPrototypeOf(Object.setPrototypeOf({},null))!==null&&Object.getPrototypeOf(Object.create(null))===null){(function(){var e=Object.create(null);var t=Object.getPrototypeOf;var r=Object.setPrototypeOf;Object.getPrototypeOf=function(r){var n=t(r);return n===e?null:n};Object.setPrototypeOf=function(t,n){var o=n===null?e:n;return r(t,o)};Object.setPrototypeOf.polyfill=false})()}var Ct=!i(function(){Object.keys("foo")});if(!Ct){var Mt=Object.keys;Z(Object,"keys",function keys(e){return Mt(re.ToObject(e))});n=Object.keys}var xt=i(function(){Object.keys(/a/g)});if(xt){var Nt=Object.keys;Z(Object,"keys",function keys(e){if(K.regex(e)){var t=[];for(var r in e){if(z(e,r)){M(t,r)}}return t}return Nt(e)});n=Object.keys}if(Object.getOwnPropertyNames){var At=!i(function(){Object.getOwnPropertyNames("foo")});if(!At){var Rt=typeof window==="object"?Object.getOwnPropertyNames(window):[];var _t=Object.getOwnPropertyNames;Z(Object,"getOwnPropertyNames",function getOwnPropertyNames(e){var t=re.ToObject(e);if(g(t)==="[object Window]"){try{return _t(t)}catch(r){return P([],Rt)}}return _t(t)})}}if(Object.getOwnPropertyDescriptor){var kt=!i(function(){Object.getOwnPropertyDescriptor("foo","bar")});if(!kt){var Ft=Object.getOwnPropertyDescriptor;Z(Object,"getOwnPropertyDescriptor",function getOwnPropertyDescriptor(e,t){return Ft(re.ToObject(e),t)})}}if(Object.seal){var Lt=!i(function(){Object.seal("foo")});if(!Lt){var Dt=Object.seal;Z(Object,"seal",function seal(e){if(!re.TypeIsObject(e)){return e}return Dt(e)})}}if(Object.isSealed){var zt=!i(function(){Object.isSealed("foo")});if(!zt){var qt=Object.isSealed;Z(Object,"isSealed",function isSealed(e){if(!re.TypeIsObject(e)){return true}return qt(e)})}}if(Object.freeze){var Wt=!i(function(){Object.freeze("foo")});if(!Wt){var Gt=Object.freeze;Z(Object,"freeze",function freeze(e){if(!re.TypeIsObject(e)){return e}return Gt(e)})}}if(Object.isFrozen){var Ht=!i(function(){Object.isFrozen("foo")});if(!Ht){var Vt=Object.isFrozen;Z(Object,"isFrozen",function isFrozen(e){if(!re.TypeIsObject(e)){return true}return Vt(e)})}}if(Object.preventExtensions){var Bt=!i(function(){Object.preventExtensions("foo")});if(!Bt){var $t=Object.preventExtensions;Z(Object,"preventExtensions",function preventExtensions(e){if(!re.TypeIsObject(e)){return e}return $t(e)})}}if(Object.isExtensible){var Ut=!i(function(){Object.isExtensible("foo")});if(!Ut){var Jt=Object.isExtensible;Z(Object,"isExtensible",function isExtensible(e){if(!re.TypeIsObject(e)){return false}return Jt(e)})}}if(Object.getPrototypeOf){var Xt=!i(function(){Object.getPrototypeOf("foo")});if(!Xt){var Kt=Object.getPrototypeOf;Z(Object,"getPrototypeOf",function getPrototypeOf(e){return Kt(re.ToObject(e))})}}var Zt=s&&function(){var e=Object.getOwnPropertyDescriptor(RegExp.prototype,"flags");return e&&re.IsCallable(e.get)}();if(s&&!Zt){var Yt=function flags(){if(!re.TypeIsObject(this)){throw new TypeError("Method called on incompatible type: must be an object.")}var e="";if(this.global){e+="g"}if(this.ignoreCase){e+="i"}if(this.multiline){e+="m"}if(this.unicode){e+="u"}if(this.sticky){e+="y"}return e};O.getter(RegExp.prototype,"flags",Yt)}var Qt=s&&a(function(){return String(new RegExp(/a/g,"i"))==="/a/i"});var er=Y&&s&&function(){var e=/./;e[G.match]=false;return RegExp(e)===e}();var tr=a(function(){return RegExp.prototype.toString.call({source:"abc"})==="/abc/"});var rr=tr&&a(function(){return RegExp.prototype.toString.call({source:"a",flags:"b"})==="/a/b"});if(!tr||!rr){var nr=RegExp.prototype.toString;h(RegExp.prototype,"toString",function toString(){var e=re.RequireObjectCoercible(this);if(K.regex(e)){return t(nr,e)}var r=te(e.source);var n=te(e.flags);return"/"+r+"/"+n},true);O.preserveToString(RegExp.prototype.toString,nr)}if(s&&(!Qt||er)){var or=Object.getOwnPropertyDescriptor(RegExp.prototype,"flags").get;var ir=Object.getOwnPropertyDescriptor(RegExp.prototype,"source")||{};var ar=function(){return this.source};var ur=re.IsCallable(ir.get)?ir.get:ar;var fr=RegExp;var sr=function(){return function RegExp(e,t){var r=re.IsRegExp(e);var n=this instanceof RegExp;if(!n&&r&&typeof t==="undefined"&&e.constructor===RegExp){return e}var o=e;var i=t;if(K.regex(e)){o=re.Call(ur,e);i=typeof t==="undefined"?re.Call(or,e):t;return new RegExp(o,i)}else if(r){o=e.source;i=typeof t==="undefined"?e.flags:t}return new fr(e,t)}}();de(fr,sr,{$input:true});RegExp=sr;O.redefine(S,"RegExp",sr)}if(s){var cr={input:"$_",lastMatch:"$&",lastParen:"$+",leftContext:"$`",rightContext:"$'"};l(n(cr),function(e){if(e in RegExp&&!(cr[e]in RegExp)){O.getter(RegExp,cr[e],function get(){return RegExp[e]})}})}me(RegExp);var lr=1/Number.EPSILON;var pr=function roundTiesToEven(e){return e+lr-lr};var vr=Math.pow(2,-23);var yr=Math.pow(2,127)*(2-vr);var hr=Math.pow(2,-126);var br=Math.E;var gr=Math.LOG2E;var dr=Math.LOG10E;var Or=Number.prototype.clz;delete Number.prototype.clz;var mr={acosh:function acosh(e){var t=Number(e);if(V(t)||e<1){return NaN}if(t===1){return 0}if(t===Infinity){return t}return L(t/br+D(t+1)*D(t-1)/br)+1},asinh:function asinh(e){var t=Number(e);if(t===0||!T(t)){return t}return t<0?-asinh(-t):L(t+D(t*t+1))},atanh:function atanh(e){var t=Number(e);if(V(t)||t<-1||t>1){return NaN}if(t===-1){return-Infinity}if(t===1){return Infinity}if(t===0){return t}return.5*L((1+t)/(1-t))},cbrt:function cbrt(e){var t=Number(e);if(t===0){return t}var r=t<0;var n;if(r){t=-t}if(t===Infinity){n=Infinity}else{n=F(L(t)/3);n=(t/(n*n)+2*n)/3}return r?-n:n},clz32:function clz32(e){var t=Number(e);var r=re.ToUint32(t);if(r===0){return 32}return Or?re.Call(Or,r):31-_(L(r+.5)*gr)},cosh:function cosh(e){var t=Number(e);if(t===0){return 1}if(V(t)){return NaN}if(!T(t)){return Infinity}if(t<0){t=-t}if(t>21){return F(t)/2}return(F(t)+F(-t))/2},expm1:function expm1(e){var t=Number(e);if(t===-Infinity){return-1}if(!T(t)||t===0){return t}if(k(t)>.5){return F(t)-1}var r=t;var n=0;var o=1;while(n+r!==n){n+=r;o+=1;r*=t/o}return n},hypot:function hypot(e,t){var r=0;var n=0;for(var o=0;o<arguments.length;++o){var i=k(Number(arguments[o]));if(n<i){r*=n/i*(n/i);r+=1;n=i}else{r+=i>0?i/n*(i/n):i}}return n===Infinity?Infinity:n*D(r)},log2:function log2(e){return L(e)*gr},log10:function log10(e){return L(e)*dr},log1p:function log1p(e){var t=Number(e);if(t<-1||V(t)){return NaN}if(t===0||t===Infinity){return t}if(t===-1){return-Infinity}return 1+t-1===0?t:t*(L(1+t)/(1+t-1))},sign:$,sinh:function sinh(e){var t=Number(e);if(!T(t)||t===0){return t}if(k(t)<1){return(Math.expm1(t)-Math.expm1(-t))/2}return(F(t-1)-F(-t-1))*br/2},tanh:function tanh(e){var t=Number(e);if(V(t)||t===0){return t}if(t>=20){return 1}if(t<=-20){return-1}return(Math.expm1(t)-Math.expm1(-t))/(F(t)+F(-t))},trunc:function trunc(e){var t=Number(e);return t<0?-_(-t):_(t)},imul:function imul(e,t){var r=re.ToUint32(e);var n=re.ToUint32(t);var o=r>>>16&65535;var i=r&65535;var a=n>>>16&65535;var u=n&65535;return i*u+(o*u+i*a<<16>>>0)|0},fround:function fround(e){var t=Number(e);if(t===0||t===Infinity||t===-Infinity||V(t)){return t}var r=$(t);var n=k(t);if(n<hr){return r*pr(n/hr/vr)*hr*vr}var o=(1+vr/Number.EPSILON)*n;var i=o-(o-n);if(i>yr||V(i)){return r*Infinity}return r*i}};b(Math,mr);h(Math,"log1p",mr.log1p,Math.log1p(-1e-17)!==-1e-17);h(Math,"asinh",mr.asinh,Math.asinh(-1e7)!==-Math.asinh(1e7));h(Math,"tanh",mr.tanh,Math.tanh(-2e-17)!==-2e-17);h(Math,"acosh",mr.acosh,Math.acosh(Number.MAX_VALUE)===Infinity);h(Math,"cbrt",mr.cbrt,Math.abs(1-Math.cbrt(1e-300)/1e-100)/Number.EPSILON>8);h(Math,"sinh",mr.sinh,Math.sinh(-2e-17)!==-2e-17);var wr=Math.expm1(10);h(Math,"expm1",mr.expm1,wr>22025.465794806718||wr<22025.465794806718);var jr=Math.round;var Sr=Math.round(.5-Number.EPSILON/4)===0&&Math.round(-.5+Number.EPSILON/3.99)===1;var Tr=lr+1;var Ir=2*lr-1;var Er=[Tr,Ir].every(function(e){return Math.round(e)===e});h(Math,"round",function round(e){var t=_(e);var r=t===-1?-0:t+1;return e-t<.5?t:r},!Sr||!Er);O.preserveToString(Math.round,jr);var Pr=Math.imul;if(Math.imul(4294967295,5)!==-5){Math.imul=mr.imul;O.preserveToString(Math.imul,Pr)}if(Math.imul.length!==2){Z(Math,"imul",function imul(e,t){return re.Call(Pr,Math,arguments); +})}var Cr=function(){var e=S.setTimeout;if(typeof e!=="function"&&typeof e!=="object"){return}re.IsPromise=function(e){if(!re.TypeIsObject(e)){return false}if(typeof e._promise==="undefined"){return false}return true};var r=function(e){if(!re.IsConstructor(e)){throw new TypeError("Bad promise constructor")}var t=this;var r=function(e,r){if(t.resolve!==void 0||t.reject!==void 0){throw new TypeError("Bad Promise implementation!")}t.resolve=e;t.reject=r};t.resolve=void 0;t.reject=void 0;t.promise=new e(r);if(!(re.IsCallable(t.resolve)&&re.IsCallable(t.reject))){throw new TypeError("Bad promise constructor")}};var n;if(typeof window!=="undefined"&&re.IsCallable(window.postMessage)){n=function(){var e=[];var t="zero-timeout-message";var r=function(r){M(e,r);window.postMessage(t,"*")};var n=function(r){if(r.source===window&&r.data===t){r.stopPropagation();if(e.length===0){return}var n=N(e);n()}};window.addEventListener("message",n,true);return r}}var o=function(){var e=S.Promise;var t=e&&e.resolve&&e.resolve();return t&&function(e){return t.then(e)}};var i=re.IsCallable(S.setImmediate)?S.setImmediate:typeof process==="object"&&process.nextTick?process.nextTick:o()||(re.IsCallable(n)?n():function(t){e(t,0)});var a=function(e){return e};var u=function(e){throw e};var f=0;var s=1;var c=2;var l=0;var p=1;var v=2;var y={};var h=function(e,t,r){i(function(){g(e,t,r)})};var g=function(e,t,r){var n,o;if(t===y){return e(r)}try{n=e(r);o=t.resolve}catch(i){n=i;o=t.reject}o(n)};var d=function(e,t){var r=e._promise;var n=r.reactionLength;if(n>0){h(r.fulfillReactionHandler0,r.reactionCapability0,t);r.fulfillReactionHandler0=void 0;r.rejectReactions0=void 0;r.reactionCapability0=void 0;if(n>1){for(var o=1,i=0;o<n;o++,i+=3){h(r[i+l],r[i+v],t);e[i+l]=void 0;e[i+p]=void 0;e[i+v]=void 0}}}r.result=t;r.state=s;r.reactionLength=0};var O=function(e,t){var r=e._promise;var n=r.reactionLength;if(n>0){h(r.rejectReactionHandler0,r.reactionCapability0,t);r.fulfillReactionHandler0=void 0;r.rejectReactions0=void 0;r.reactionCapability0=void 0;if(n>1){for(var o=1,i=0;o<n;o++,i+=3){h(r[i+p],r[i+v],t);e[i+l]=void 0;e[i+p]=void 0;e[i+v]=void 0}}}r.result=t;r.state=c;r.reactionLength=0};var m=function(e){var t=false;var r=function(r){var n;if(t){return}t=true;if(r===e){return O(e,new TypeError("Self resolution"))}if(!re.TypeIsObject(r)){return d(e,r)}try{n=r.then}catch(o){return O(e,o)}if(!re.IsCallable(n)){return d(e,r)}i(function(){j(e,r,n)})};var n=function(r){if(t){return}t=true;return O(e,r)};return{resolve:r,reject:n}};var w=function(e,r,n,o){if(e===I){t(e,r,n,o,y)}else{t(e,r,n,o)}};var j=function(e,t,r){var n=m(e);var o=n.resolve;var i=n.reject;try{w(r,t,o,i)}catch(a){i(a)}};var T,I;var E=function(){var e=function Promise(t){if(!(this instanceof e)){throw new TypeError('Constructor Promise requires "new"')}if(this&&this._promise){throw new TypeError("Bad construction")}if(!re.IsCallable(t)){throw new TypeError("not a valid resolver")}var r=Te(this,e,T,{_promise:{result:void 0,state:f,reactionLength:0,fulfillReactionHandler0:void 0,rejectReactionHandler0:void 0,reactionCapability0:void 0}});var n=m(r);var o=n.reject;try{t(n.resolve,o)}catch(i){o(i)}return r};return e}();T=E.prototype;var P=function(e,t,r,n){var o=false;return function(i){if(o){return}o=true;t[e]=i;if(--n.count===0){var a=r.resolve;a(t)}}};var C=function(e,t,r){var n=e.iterator;var o=[];var i={count:1};var a,u;var f=0;while(true){try{a=re.IteratorStep(n);if(a===false){e.done=true;break}u=a.value}catch(s){e.done=true;throw s}o[f]=void 0;var c=t.resolve(u);var l=P(f,o,r,i);i.count+=1;w(c.then,c,l,r.reject);f+=1}if(--i.count===0){var p=r.resolve;p(o)}return r.promise};var x=function(e,t,r){var n=e.iterator;var o,i,a;while(true){try{o=re.IteratorStep(n);if(o===false){e.done=true;break}i=o.value}catch(u){e.done=true;throw u}a=t.resolve(i);w(a.then,a,r.resolve,r.reject)}return r.promise};b(E,{all:function all(e){var t=this;if(!re.TypeIsObject(t)){throw new TypeError("Promise is not object")}var n=new r(t);var o,i;try{o=re.GetIterator(e);i={iterator:o,done:false};return C(i,t,n)}catch(a){var u=a;if(i&&!i.done){try{re.IteratorClose(o,true)}catch(f){u=f}}var s=n.reject;s(u);return n.promise}},race:function race(e){var t=this;if(!re.TypeIsObject(t)){throw new TypeError("Promise is not object")}var n=new r(t);var o,i;try{o=re.GetIterator(e);i={iterator:o,done:false};return x(i,t,n)}catch(a){var u=a;if(i&&!i.done){try{re.IteratorClose(o,true)}catch(f){u=f}}var s=n.reject;s(u);return n.promise}},reject:function reject(e){var t=this;if(!re.TypeIsObject(t)){throw new TypeError("Bad promise constructor")}var n=new r(t);var o=n.reject;o(e);return n.promise},resolve:function resolve(e){var t=this;if(!re.TypeIsObject(t)){throw new TypeError("Bad promise constructor")}if(re.IsPromise(e)){var n=e.constructor;if(n===t){return e}}var o=new r(t);var i=o.resolve;i(e);return o.promise}});b(T,{"catch":function(e){return this.then(null,e)},then:function then(e,t){var n=this;if(!re.IsPromise(n)){throw new TypeError("not a promise")}var o=re.SpeciesConstructor(n,E);var i;var b=arguments.length>2&&arguments[2]===y;if(b&&o===E){i=y}else{i=new r(o)}var g=re.IsCallable(e)?e:a;var d=re.IsCallable(t)?t:u;var O=n._promise;var m;if(O.state===f){if(O.reactionLength===0){O.fulfillReactionHandler0=g;O.rejectReactionHandler0=d;O.reactionCapability0=i}else{var w=3*(O.reactionLength-1);O[w+l]=g;O[w+p]=d;O[w+v]=i}O.reactionLength+=1}else if(O.state===s){m=O.result;h(g,i,m)}else if(O.state===c){m=O.result;h(d,i,m)}else{throw new TypeError("unexpected Promise state")}return i.promise}});y=new r(E);I=T.then;return E}();if(S.Promise){delete S.Promise.accept;delete S.Promise.defer;delete S.Promise.prototype.chain}if(typeof Cr==="function"){b(S,{Promise:Cr});var Mr=w(S.Promise,function(e){return e.resolve(42).then(function(){})instanceof e});var xr=!i(function(){S.Promise.reject(42).then(null,5).then(null,W)});var Nr=i(function(){S.Promise.call(3,W)});var Ar=function(e){var t=e.resolve(5);t.constructor={};var r=e.resolve(t);try{r.then(null,W).then(null,W)}catch(n){return true}return t===r}(S.Promise);var Rr=s&&function(){var e=0;var t=Object.defineProperty({},"then",{get:function(){e+=1}});Promise.resolve(t);return e===1}();var _r=function BadResolverPromise(e){var t=new Promise(e);e(3,function(){});this.then=t.then;this.constructor=BadResolverPromise};_r.prototype=Promise.prototype;_r.all=Promise.all;var kr=a(function(){return!!_r.all([1,2])});if(!Mr||!xr||!Nr||Ar||!Rr||kr){Promise=Cr;Z(S,"Promise",Cr)}if(Promise.all.length!==1){var Fr=Promise.all;Z(Promise,"all",function all(e){return re.Call(Fr,this,arguments)})}if(Promise.race.length!==1){var Lr=Promise.race;Z(Promise,"race",function race(e){return re.Call(Lr,this,arguments)})}if(Promise.resolve.length!==1){var Dr=Promise.resolve;Z(Promise,"resolve",function resolve(e){return re.Call(Dr,this,arguments)})}if(Promise.reject.length!==1){var zr=Promise.reject;Z(Promise,"reject",function reject(e){return re.Call(zr,this,arguments)})}wt(Promise,"all");wt(Promise,"race");wt(Promise,"resolve");wt(Promise,"reject");me(Promise)}var qr=function(e){var t=n(p(e,function(e,t){e[t]=true;return e},{}));return e.join(":")===t.join(":")};var Wr=qr(["z","a","bb"]);var Gr=qr(["z",1,"a","3",2]);if(s){var Hr=function fastkey(e){if(!Wr){return null}if(typeof e==="undefined"||e===null){return"^"+re.ToString(e)}else if(typeof e==="string"){return"$"+e}else if(typeof e==="number"){if(!Gr){return"n"+e}return e}else if(typeof e==="boolean"){return"b"+e}return null};var Vr=function emptyObject(){return Object.create?Object.create(null):{}};var Br=function addIterableToMap(e,n,o){if(r(o)||K.string(o)){l(o,function(e){if(!re.TypeIsObject(e)){throw new TypeError("Iterator value "+e+" is not an entry object")}n.set(e[0],e[1])})}else if(o instanceof e){t(e.prototype.forEach,o,function(e,t){n.set(t,e)})}else{var i,a;if(o!==null&&typeof o!=="undefined"){a=n.set;if(!re.IsCallable(a)){throw new TypeError("bad map")}i=re.GetIterator(o)}if(typeof i!=="undefined"){while(true){var u=re.IteratorStep(i);if(u===false){break}var f=u.value;try{if(!re.TypeIsObject(f)){throw new TypeError("Iterator value "+f+" is not an entry object")}t(a,n,f[0],f[1])}catch(s){re.IteratorClose(i,true);throw s}}}}};var $r=function addIterableToSet(e,n,o){if(r(o)||K.string(o)){l(o,function(e){n.add(e)})}else if(o instanceof e){t(e.prototype.forEach,o,function(e){n.add(e)})}else{var i,a;if(o!==null&&typeof o!=="undefined"){a=n.add;if(!re.IsCallable(a)){throw new TypeError("bad set")}i=re.GetIterator(o)}if(typeof i!=="undefined"){while(true){var u=re.IteratorStep(i);if(u===false){break}var f=u.value;try{t(a,n,f)}catch(s){re.IteratorClose(i,true);throw s}}}}};var Ur={Map:function(){var e={};var r=function MapEntry(e,t){this.key=e;this.value=t;this.next=null;this.prev=null};r.prototype.isRemoved=function isRemoved(){return this.key===e};var n=function isMap(e){return!!e._es6map};var o=function requireMapSlot(e,t){if(!re.TypeIsObject(e)||!n(e)){throw new TypeError("Method Map.prototype."+t+" called on incompatible receiver "+re.ToString(e))}};var i=function MapIterator(e,t){o(e,"[[MapIterator]]");this.head=e._head;this.i=this.head;this.kind=t};i.prototype={next:function next(){var e=this.i;var t=this.kind;var r=this.head;if(typeof this.i==="undefined"){return Ge()}while(e.isRemoved()&&e!==r){e=e.prev}var n;while(e.next!==r){e=e.next;if(!e.isRemoved()){if(t==="key"){n=e.key}else if(t==="value"){n=e.value}else{n=[e.key,e.value]}this.i=e;return Ge(n)}}this.i=void 0;return Ge()}};we(i.prototype);var a;var u=function Map(){if(!(this instanceof Map)){throw new TypeError('Constructor Map requires "new"')}if(this&&this._es6map){throw new TypeError("Bad construction")}var e=Te(this,Map,a,{_es6map:true,_head:null,_storage:Vr(),_size:0});var t=new r(null,null);t.next=t.prev=t;e._head=t;if(arguments.length>0){Br(Map,e,arguments[0])}return e};a=u.prototype;O.getter(a,"size",function(){if(typeof this._size==="undefined"){throw new TypeError("size method called on incompatible Map")}return this._size});b(a,{get:function get(e){o(this,"get");var t=Hr(e);if(t!==null){var r=this._storage[t];if(r){return r.value}else{return}}var n=this._head;var i=n;while((i=i.next)!==n){if(re.SameValueZero(i.key,e)){return i.value}}},has:function has(e){o(this,"has");var t=Hr(e);if(t!==null){return typeof this._storage[t]!=="undefined"}var r=this._head;var n=r;while((n=n.next)!==r){if(re.SameValueZero(n.key,e)){return true}}return false},set:function set(e,t){o(this,"set");var n=this._head;var i=n;var a;var u=Hr(e);if(u!==null){if(typeof this._storage[u]!=="undefined"){this._storage[u].value=t;return this}else{a=this._storage[u]=new r(e,t);i=n.prev}}while((i=i.next)!==n){if(re.SameValueZero(i.key,e)){i.value=t;return this}}a=a||new r(e,t);if(re.SameValue(-0,e)){a.key=+0}a.next=this._head;a.prev=this._head.prev;a.prev.next=a;a.next.prev=a;this._size+=1;return this},"delete":function(t){o(this,"delete");var r=this._head;var n=r;var i=Hr(t);if(i!==null){if(typeof this._storage[i]==="undefined"){return false}n=this._storage[i].prev;delete this._storage[i]}while((n=n.next)!==r){if(re.SameValueZero(n.key,t)){n.key=n.value=e;n.prev.next=n.next;n.next.prev=n.prev;this._size-=1;return true}}return false},clear:function clear(){o(this,"clear");this._size=0;this._storage=Vr();var t=this._head;var r=t;var n=r.next;while((r=n)!==t){r.key=r.value=e;n=r.next;r.next=r.prev=t}t.next=t.prev=t},keys:function keys(){o(this,"keys");return new i(this,"key")},values:function values(){o(this,"values");return new i(this,"value")},entries:function entries(){o(this,"entries");return new i(this,"key+value")},forEach:function forEach(e){o(this,"forEach");var r=arguments.length>1?arguments[1]:null;var n=this.entries();for(var i=n.next();!i.done;i=n.next()){if(r){t(e,r,i.value[1],i.value[0],this)}else{e(i.value[1],i.value[0],this)}}}});we(a,a.entries);return u}(),Set:function(){var e=function isSet(e){return e._es6set&&typeof e._storage!=="undefined"};var r=function requireSetSlot(t,r){if(!re.TypeIsObject(t)||!e(t)){throw new TypeError("Set.prototype."+r+" called on incompatible receiver "+re.ToString(t))}};var o;var i=function Set(){if(!(this instanceof Set)){throw new TypeError('Constructor Set requires "new"')}if(this&&this._es6set){throw new TypeError("Bad construction")}var e=Te(this,Set,o,{_es6set:true,"[[SetData]]":null,_storage:Vr()});if(!e._es6set){throw new TypeError("bad set")}if(arguments.length>0){$r(Set,e,arguments[0])}return e};o=i.prototype;var a=function(e){var t=e;if(t==="^null"){return null}else if(t==="^undefined"){return void 0}else{var r=t.charAt(0);if(r==="$"){return C(t,1)}else if(r==="n"){return+C(t,1)}else if(r==="b"){return t==="btrue"}}return+t};var u=function ensureMap(e){if(!e["[[SetData]]"]){var t=e["[[SetData]]"]=new Ur.Map;l(n(e._storage),function(e){var r=a(e);t.set(r,r)});e["[[SetData]]"]=t}e._storage=null};O.getter(i.prototype,"size",function(){r(this,"size");if(this._storage){return n(this._storage).length}u(this);return this["[[SetData]]"].size});b(i.prototype,{has:function has(e){r(this,"has");var t;if(this._storage&&(t=Hr(e))!==null){return!!this._storage[t]}u(this);return this["[[SetData]]"].has(e)},add:function add(e){r(this,"add");var t;if(this._storage&&(t=Hr(e))!==null){this._storage[t]=true;return this}u(this);this["[[SetData]]"].set(e,e);return this},"delete":function(e){r(this,"delete");var t;if(this._storage&&(t=Hr(e))!==null){var n=z(this._storage,t);return delete this._storage[t]&&n}u(this);return this["[[SetData]]"]["delete"](e)},clear:function clear(){r(this,"clear");if(this._storage){this._storage=Vr()}if(this["[[SetData]]"]){this["[[SetData]]"].clear()}},values:function values(){r(this,"values");u(this);return this["[[SetData]]"].values()},entries:function entries(){r(this,"entries");u(this);return this["[[SetData]]"].entries()},forEach:function forEach(e){r(this,"forEach");var n=arguments.length>1?arguments[1]:null;var o=this;u(o);this["[[SetData]]"].forEach(function(r,i){if(n){t(e,n,i,i,o)}else{e(i,i,o)}})}});h(i.prototype,"keys",i.prototype.values,true);we(i.prototype,i.prototype.values);return i}()};if(S.Map||S.Set){var Jr=a(function(){return new Map([[1,2]]).get(1)===2});if(!Jr){var Xr=S.Map;S.Map=function Map(){if(!(this instanceof Map)){throw new TypeError('Constructor Map requires "new"')}var e=new Xr;if(arguments.length>0){Br(Map,e,arguments[0])}delete e.constructor;Object.setPrototypeOf(e,S.Map.prototype);return e};S.Map.prototype=m(Xr.prototype);h(S.Map.prototype,"constructor",S.Map,true);O.preserveToString(S.Map,Xr)}var Kr=new Map;var Zr=function(){var e=new Map([[1,0],[2,0],[3,0],[4,0]]);e.set(-0,e);return e.get(0)===e&&e.get(-0)===e&&e.has(0)&&e.has(-0)}();var Yr=Kr.set(1,2)===Kr;if(!Zr||!Yr){var Qr=Map.prototype.set;Z(Map.prototype,"set",function set(e,r){t(Qr,this,e===0?0:e,r);return this})}if(!Zr){var en=Map.prototype.get;var tn=Map.prototype.has;b(Map.prototype,{get:function get(e){return t(en,this,e===0?0:e)},has:function has(e){return t(tn,this,e===0?0:e)}},true);O.preserveToString(Map.prototype.get,en);O.preserveToString(Map.prototype.has,tn)}var rn=new Set;var nn=function(e){e["delete"](0);e.add(-0);return!e.has(0)}(rn);var on=rn.add(1)===rn;if(!nn||!on){var an=Set.prototype.add;Set.prototype.add=function add(e){t(an,this,e===0?0:e);return this};O.preserveToString(Set.prototype.add,an)}if(!nn){var un=Set.prototype.has;Set.prototype.has=function has(e){return t(un,this,e===0?0:e)};O.preserveToString(Set.prototype.has,un);var fn=Set.prototype["delete"];Set.prototype["delete"]=function SetDelete(e){return t(fn,this,e===0?0:e)};O.preserveToString(Set.prototype["delete"],fn)}var sn=w(S.Map,function(e){var t=new e([]);t.set(42,42);return t instanceof e});var cn=Object.setPrototypeOf&&!sn;var ln=function(){try{return!(S.Map()instanceof S.Map)}catch(e){return e instanceof TypeError}}();if(S.Map.length!==0||cn||!ln){var pn=S.Map;S.Map=function Map(){if(!(this instanceof Map)){throw new TypeError('Constructor Map requires "new"')}var e=new pn;if(arguments.length>0){Br(Map,e,arguments[0])}delete e.constructor;Object.setPrototypeOf(e,Map.prototype);return e};S.Map.prototype=pn.prototype;h(S.Map.prototype,"constructor",S.Map,true);O.preserveToString(S.Map,pn)}var vn=w(S.Set,function(e){var t=new e([]);t.add(42,42);return t instanceof e});var yn=Object.setPrototypeOf&&!vn;var hn=function(){try{return!(S.Set()instanceof S.Set)}catch(e){return e instanceof TypeError}}();if(S.Set.length!==0||yn||!hn){var bn=S.Set;S.Set=function Set(){if(!(this instanceof Set)){throw new TypeError('Constructor Set requires "new"')}var e=new bn;if(arguments.length>0){$r(Set,e,arguments[0])}delete e.constructor;Object.setPrototypeOf(e,Set.prototype);return e};S.Set.prototype=bn.prototype;h(S.Set.prototype,"constructor",S.Set,true);O.preserveToString(S.Set,bn)}var gn=new S.Map;var dn=!a(function(){return gn.keys().next().done});if(typeof S.Map.prototype.clear!=="function"||(new S.Set).size!==0||gn.size!==0||typeof S.Map.prototype.keys!=="function"||typeof S.Set.prototype.keys!=="function"||typeof S.Map.prototype.forEach!=="function"||typeof S.Set.prototype.forEach!=="function"||u(S.Map)||u(S.Set)||typeof gn.keys().next!=="function"||dn||!sn){b(S,{Map:Ur.Map,Set:Ur.Set},true)}if(S.Set.prototype.keys!==S.Set.prototype.values){h(S.Set.prototype,"keys",S.Set.prototype.values,true)}we(Object.getPrototypeOf((new S.Map).keys()));we(Object.getPrototypeOf((new S.Set).keys()));if(c&&S.Set.prototype.has.name!=="has"){var On=S.Set.prototype.has;Z(S.Set.prototype,"has",function has(e){return t(On,this,e)})}}b(S,Ur);me(S.Map);me(S.Set)}var mn=function throwUnlessTargetIsObject(e){if(!re.TypeIsObject(e)){throw new TypeError("target must be an object")}};var wn={apply:function apply(){return re.Call(re.Call,null,arguments)},construct:function construct(e,t){if(!re.IsConstructor(e)){throw new TypeError("First argument must be a constructor.")}var r=arguments.length>2?arguments[2]:e;if(!re.IsConstructor(r)){throw new TypeError("new.target must be a constructor.")}return re.Construct(e,t,r,"internal")},deleteProperty:function deleteProperty(e,t){mn(e);if(s){var r=Object.getOwnPropertyDescriptor(e,t);if(r&&!r.configurable){return false}}return delete e[t]},has:function has(e,t){mn(e);return t in e}};if(Object.getOwnPropertyNames){Object.assign(wn,{ownKeys:function ownKeys(e){mn(e);var t=Object.getOwnPropertyNames(e);if(re.IsCallable(Object.getOwnPropertySymbols)){x(t,Object.getOwnPropertySymbols(e))}return t}})}var jn=function ConvertExceptionToBoolean(e){return!i(e)};if(Object.preventExtensions){Object.assign(wn,{isExtensible:function isExtensible(e){mn(e);return Object.isExtensible(e)},preventExtensions:function preventExtensions(e){mn(e);return jn(function(){Object.preventExtensions(e)})}})}if(s){var Sn=function get(e,t,r){var n=Object.getOwnPropertyDescriptor(e,t);if(!n){var o=Object.getPrototypeOf(e);if(o===null){return void 0}return Sn(o,t,r)}if("value"in n){return n.value}if(n.get){return re.Call(n.get,r)}return void 0};var Tn=function set(e,r,n,o){var i=Object.getOwnPropertyDescriptor(e,r);if(!i){var a=Object.getPrototypeOf(e);if(a!==null){return Tn(a,r,n,o)}i={value:void 0,writable:true,enumerable:true,configurable:true}}if("value"in i){if(!i.writable){return false}if(!re.TypeIsObject(o)){return false}var u=Object.getOwnPropertyDescriptor(o,r);if(u){return ee.defineProperty(o,r,{value:n})}else{return ee.defineProperty(o,r,{value:n,writable:true,enumerable:true,configurable:true})}}if(i.set){t(i.set,o,n);return true}return false};Object.assign(wn,{defineProperty:function defineProperty(e,t,r){mn(e);return jn(function(){Object.defineProperty(e,t,r)})},getOwnPropertyDescriptor:function getOwnPropertyDescriptor(e,t){mn(e);return Object.getOwnPropertyDescriptor(e,t)},get:function get(e,t){mn(e);var r=arguments.length>2?arguments[2]:e;return Sn(e,t,r)},set:function set(e,t,r){mn(e);var n=arguments.length>3?arguments[3]:e;return Tn(e,t,r,n)}})}if(Object.getPrototypeOf){var In=Object.getPrototypeOf;wn.getPrototypeOf=function getPrototypeOf(e){mn(e);return In(e)}}if(Object.setPrototypeOf&&wn.getPrototypeOf){var En=function(e,t){var r=t;while(r){if(e===r){return true}r=wn.getPrototypeOf(r)}return false};Object.assign(wn,{setPrototypeOf:function setPrototypeOf(e,t){mn(e);if(t!==null&&!re.TypeIsObject(t)){throw new TypeError("proto must be an object or null")}if(t===ee.getPrototypeOf(e)){return true}if(ee.isExtensible&&!ee.isExtensible(e)){return false}if(En(e,t)){return false}Object.setPrototypeOf(e,t);return true}})}var Pn=function(e,t){if(!re.IsCallable(S.Reflect[e])){h(S.Reflect,e,t)}else{var r=a(function(){S.Reflect[e](1);S.Reflect[e](NaN);S.Reflect[e](true);return true});if(r){Z(S.Reflect,e,t)}}};Object.keys(wn).forEach(function(e){Pn(e,wn[e])});var Cn=S.Reflect.getPrototypeOf;if(c&&Cn&&Cn.name!=="getPrototypeOf"){Z(S.Reflect,"getPrototypeOf",function getPrototypeOf(e){return t(Cn,S.Reflect,e)})}if(S.Reflect.setPrototypeOf){if(a(function(){S.Reflect.setPrototypeOf(1,{});return true})){Z(S.Reflect,"setPrototypeOf",wn.setPrototypeOf)}}if(S.Reflect.defineProperty){if(!a(function(){var e=!S.Reflect.defineProperty(1,"test",{value:1});var t=typeof Object.preventExtensions!=="function"||!S.Reflect.defineProperty(Object.preventExtensions({}),"test",{});return e&&t})){Z(S.Reflect,"defineProperty",wn.defineProperty)}}if(S.Reflect.construct){if(!a(function(){var e=function F(){};return S.Reflect.construct(function(){},[],e)instanceof e})){Z(S.Reflect,"construct",wn.construct)}}if(String(new Date(NaN))!=="Invalid Date"){var Mn=Date.prototype.toString;var xn=function toString(){var e=+this;if(e!==e){return"Invalid Date"}return re.Call(Mn,this)};Z(Date.prototype,"toString",xn)}var Nn={anchor:function anchor(e){return re.CreateHTML(this,"a","name",e)},big:function big(){return re.CreateHTML(this,"big","","")},blink:function blink(){return re.CreateHTML(this,"blink","","")},bold:function bold(){return re.CreateHTML(this,"b","","")},fixed:function fixed(){return re.CreateHTML(this,"tt","","")},fontcolor:function fontcolor(e){return re.CreateHTML(this,"font","color",e)},fontsize:function fontsize(e){return re.CreateHTML(this,"font","size",e)},italics:function italics(){return re.CreateHTML(this,"i","","")},link:function link(e){return re.CreateHTML(this,"a","href",e)},small:function small(){return re.CreateHTML(this,"small","","")},strike:function strike(){return re.CreateHTML(this,"strike","","")},sub:function sub(){return re.CreateHTML(this,"sub","","")},sup:function sub(){return re.CreateHTML(this,"sup","","")}};l(Object.keys(Nn),function(e){var r=String.prototype[e];var n=false;if(re.IsCallable(r)){var o=t(r,"",' " ');var i=P([],o.match(/"/g)).length;n=o!==o.toLowerCase()||i>2}else{n=true}if(n){Z(String.prototype,e,Nn[e])}});var An=function(){if(!Y){return false}var e=typeof JSON==="object"&&typeof JSON.stringify==="function"?JSON.stringify:null;if(!e){return false}if(typeof e(G())!=="undefined"){return true}if(e([G()])!=="[null]"){return true}var t={a:G()};t[G()]=true;if(e(t)!=="{}"){return true}return false}();var Rn=a(function(){if(!Y){return true}return JSON.stringify(Object(G()))==="{}"&&JSON.stringify([Object(G())])==="[{}]"});if(An||!Rn){var _n=JSON.stringify;Z(JSON,"stringify",function stringify(e){if(typeof e==="symbol"){return}var n;if(arguments.length>1){n=arguments[1]}var o=[e];if(!r(n)){var i=re.IsCallable(n)?n:null;var a=function(e,r){var n=i?t(i,this,e,r):r;if(typeof n!=="symbol"){if(K.symbol(n)){return St({})(n)}else{return n}}};o.push(a)}else{o.push(n)}if(arguments.length>2){o.push(arguments[2])}return _n.apply(this,o)})}return S}); +//# sourceMappingURL=es6-shim.map +/** +* @preserve HTML5 Shiv 3.7.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.2",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b)}(this,document);/* MediaMatch v.2.0.2 - Testing css media queries in Javascript. Authors & copyright (c) 2013: WebLinc, David Knight. */ + +window.matchMedia||(window.matchMedia=function(c){var a=c.document,w=a.documentElement,l=[],t=0,x="",h={},G=/\s*(only|not)?\s*(screen|print|[a-z\-]+)\s*(and)?\s*/i,H=/^\s*\(\s*(-[a-z]+-)?(min-|max-)?([a-z\-]+)\s*(:?\s*([0-9]+(\.[0-9]+)?|portrait|landscape)(px|em|dppx|dpcm|rem|%|in|cm|mm|ex|pt|pc|\/([0-9]+(\.[0-9]+)?))?)?\s*\)\s*$/,y=0,A=function(b){var z=-1!==b.indexOf(",")&&b.split(",")||[b],e=z.length-1,j=e,g=null,d=null,c="",a=0,l=!1,m="",f="",g=null,d=0,f=null,k="",p="",q="",n="",r="",k=!1;if(""=== +b)return!0;do{g=z[j-e];l=!1;if(d=g.match(G))c=d[0],a=d.index;if(!d||-1===g.substring(0,a).indexOf("(")&&(a||!d[3]&&c!==d.input))k=!1;else{f=g;l="not"===d[1];a||(m=d[2],f=g.substring(c.length));k=m===x||"all"===m||""===m;g=-1!==f.indexOf(" and ")&&f.split(" and ")||[f];d=g.length-1;if(k&&0<=d&&""!==f){do{f=g[d].match(H);if(!f||!h[f[3]]){k=!1;break}k=f[2];n=p=f[5];q=f[7];r=h[f[3]];q&&(n="px"===q?Number(p):"em"===q||"rem"===q?16*p:f[8]?(p/f[8]).toFixed(2):"dppx"===q?96*p:"dpcm"===q?0.3937*p:Number(p)); +k="min-"===k&&n?r>=n:"max-"===k&&n?r<=n:n?r===n:!!r;if(!k)break}while(d--)}if(k)break}}while(e--);return l?!k:k},B=function(){var b=c.innerWidth||w.clientWidth,a=c.innerHeight||w.clientHeight,e=c.screen.width,j=c.screen.height,g=c.screen.colorDepth,d=c.devicePixelRatio;h.width=b;h.height=a;h["aspect-ratio"]=(b/a).toFixed(2);h["device-width"]=e;h["device-height"]=j;h["device-aspect-ratio"]=(e/j).toFixed(2);h.color=g;h["color-index"]=Math.pow(2,g);h.orientation=a>=b?"portrait":"landscape";h.resolution= +d&&96*d||c.screen.deviceXDPI||96;h["device-pixel-ratio"]=d||1},C=function(){clearTimeout(y);y=setTimeout(function(){var b=null,a=t-1,e=a,j=!1;if(0<=a){B();do if(b=l[e-a])if((j=A(b.mql.media))&&!b.mql.matches||!j&&b.mql.matches)if(b.mql.matches=j,b.listeners)for(var j=0,g=b.listeners.length;j<g;j++)b.listeners[j]&&b.listeners[j].call(c,b.mql);while(a--)}},10)},D=a.getElementsByTagName("head")[0],a=a.createElement("style"),E=null,u="screen print speech projection handheld tv braille embossed tty".split(" "), +m=0,I=u.length,s="#mediamatchjs { position: relative; z-index: 0; }",v="",F=c.addEventListener||(v="on")&&c.attachEvent;a.type="text/css";a.id="mediamatchjs";D.appendChild(a);for(E=c.getComputedStyle&&c.getComputedStyle(a)||a.currentStyle;m<I;m++)s+="@media "+u[m]+" { #mediamatchjs { position: relative; z-index: "+m+" } }";a.styleSheet?a.styleSheet.cssText=s:a.textContent=s;x=u[1*E.zIndex||0];D.removeChild(a);B();F(v+"resize",C);F(v+"orientationchange",C);return function(a){var c=t,e={matches:!1, +media:a,addListener:function(a){l[c].listeners||(l[c].listeners=[]);a&&l[c].listeners.push(a)},removeListener:function(a){var b=l[c],d=0,e=0;if(b)for(e=b.listeners.length;d<e;d++)b.listeners[d]===a&&b.listeners.splice(d,1)}};if(""===a)return e.matches=!0,e;e.matches=A(a);t=l.push({mql:e,listeners:null});return e}}(window)); \ No newline at end of file diff --git a/cyclone-web/vendor/polyfill/ie-console-shim-media.js b/cyclone-web/vendor/polyfill/ie-console-shim-media.js new file mode 100644 index 0000000000000000000000000000000000000000..fbfca0cf292db0d2fda5e3c2eae504bafbdf42cd --- /dev/null +++ b/cyclone-web/vendor/polyfill/ie-console-shim-media.js @@ -0,0 +1,68 @@ +// Console-polyfill. MIT license. +// https://github.com/paulmillr/console-polyfill +// Make it safe to do console.log() always. +(function(global) { + 'use strict'; + global.console = global.console || {}; + var con = global.console; + var prop, method; + var empty = {}; + var dummy = function() {}; + var properties = 'memory'.split(','); + var methods = ('assert,clear,count,debug,dir,dirxml,error,exception,group,' + + 'groupCollapsed,groupEnd,info,log,markTimeline,profile,profiles,profileEnd,' + + 'show,table,time,timeEnd,timeline,timelineEnd,timeStamp,trace,warn').split(','); + while (prop = properties.pop()) if (!con[prop]) con[prop] = empty; + while (method = methods.pop()) if (typeof con[method] !== 'function') con[method] = dummy; +})(typeof window === 'undefined' ? this : window); +// Using `this` for web workers while maintaining compatibility with browser +// targeted script loaders such as Browserify or Webpack where the only way to +// get to the global object is via `window`. +/*! + * https://github.com/es-shims/es5-shim + * @license es5-shim Copyright 2009-2015 by contributors, MIT License + * see https://github.com/es-shims/es5-shim/blob/v4.5.7/LICENSE + */ +(function(t,r){"use strict";if(typeof define==="function"&&define.amd){define(r)}else if(typeof exports==="object"){module.exports=r()}else{t.returnExports=r()}})(this,function(){var t=Array;var r=t.prototype;var e=Object;var n=e.prototype;var i=Function;var a=i.prototype;var o=String;var f=o.prototype;var u=Number;var l=u.prototype;var s=r.slice;var c=r.splice;var v=r.push;var h=r.unshift;var p=r.concat;var y=r.join;var d=a.call;var g=a.apply;var w=Math.max;var b=Math.min;var T=n.toString;var m=typeof Symbol==="function"&&typeof Symbol.toStringTag==="symbol";var D;var x=Function.prototype.toString,S=/^\s*class /,O=function isES6ClassFn(t){try{var r=x.call(t);var e=r.replace(/\/\/.*\n/g,"");var n=e.replace(/\/\*[.\s\S]*\*\//g,"");var i=n.replace(/\n/gm," ").replace(/ {2}/g," ");return S.test(i)}catch(a){return false}},E=function tryFunctionObject(t){try{if(O(t)){return false}x.call(t);return true}catch(r){return false}},j="[object Function]",I="[object GeneratorFunction]",D=function isCallable(t){if(!t){return false}if(typeof t!=="function"&&typeof t!=="object"){return false}if(m){return E(t)}if(O(t)){return false}var r=T.call(t);return r===j||r===I};var M;var U=RegExp.prototype.exec,F=function tryRegexExec(t){try{U.call(t);return true}catch(r){return false}},N="[object RegExp]";M=function isRegex(t){if(typeof t!=="object"){return false}return m?F(t):T.call(t)===N};var C;var k=String.prototype.valueOf,R=function tryStringObject(t){try{k.call(t);return true}catch(r){return false}},A="[object String]";C=function isString(t){if(typeof t==="string"){return true}if(typeof t!=="object"){return false}return m?R(t):T.call(t)===A};var P=e.defineProperty&&function(){try{var t={};e.defineProperty(t,"x",{enumerable:false,value:t});for(var r in t){return false}return t.x===t}catch(n){return false}}();var $=function(t){var r;if(P){r=function(t,r,n,i){if(!i&&r in t){return}e.defineProperty(t,r,{configurable:true,enumerable:false,writable:true,value:n})}}else{r=function(t,r,e,n){if(!n&&r in t){return}t[r]=e}}return function defineProperties(e,n,i){for(var a in n){if(t.call(n,a)){r(e,a,n[a],i)}}}}(n.hasOwnProperty);var J=function isPrimitive(t){var r=typeof t;return t===null||r!=="object"&&r!=="function"};var Y=u.isNaN||function(t){return t!==t};var Z={ToInteger:function ToInteger(t){var r=+t;if(Y(r)){r=0}else if(r!==0&&r!==1/0&&r!==-(1/0)){r=(r>0||-1)*Math.floor(Math.abs(r))}return r},ToPrimitive:function ToPrimitive(t){var r,e,n;if(J(t)){return t}e=t.valueOf;if(D(e)){r=e.call(t);if(J(r)){return r}}n=t.toString;if(D(n)){r=n.call(t);if(J(r)){return r}}throw new TypeError},ToObject:function(t){if(t==null){throw new TypeError("can't convert "+t+" to object")}return e(t)},ToUint32:function ToUint32(t){return t>>>0}};var z=function Empty(){};$(a,{bind:function bind(t){var r=this;if(!D(r)){throw new TypeError("Function.prototype.bind called on incompatible "+r)}var n=s.call(arguments,1);var a;var o=function(){if(this instanceof a){var i=g.call(r,this,p.call(n,s.call(arguments)));if(e(i)===i){return i}return this}else{return g.call(r,t,p.call(n,s.call(arguments)))}};var f=w(0,r.length-n.length);var u=[];for(var l=0;l<f;l++){v.call(u,"$"+l)}a=i("binder","return function ("+y.call(u,",")+"){ return binder.apply(this, arguments); }")(o);if(r.prototype){z.prototype=r.prototype;a.prototype=new z;z.prototype=null}return a}});var G=d.bind(n.hasOwnProperty);var B=d.bind(n.toString);var H=d.bind(s);var W=g.bind(s);var L=d.bind(f.slice);var X=d.bind(f.split);var q=d.bind(f.indexOf);var K=d.bind(v);var Q=d.bind(n.propertyIsEnumerable);var V=d.bind(r.sort);var _=t.isArray||function isArray(t){return B(t)==="[object Array]"};var tt=[].unshift(0)!==1;$(r,{unshift:function(){h.apply(this,arguments);return this.length}},tt);$(t,{isArray:_});var rt=e("a");var et=rt[0]!=="a"||!(0 in rt);var nt=function properlyBoxed(t){var r=true;var e=true;var n=false;if(t){try{t.call("foo",function(t,e,n){if(typeof n!=="object"){r=false}});t.call([1],function(){"use strict";e=typeof this==="string"},"x")}catch(i){n=true}}return!!t&&!n&&r&&e};$(r,{forEach:function forEach(t){var r=Z.ToObject(this);var e=et&&C(this)?X(this,""):r;var n=-1;var i=Z.ToUint32(e.length);var a;if(arguments.length>1){a=arguments[1]}if(!D(t)){throw new TypeError("Array.prototype.forEach callback must be a function")}while(++n<i){if(n in e){if(typeof a==="undefined"){t(e[n],n,r)}else{t.call(a,e[n],n,r)}}}}},!nt(r.forEach));$(r,{map:function map(r){var e=Z.ToObject(this);var n=et&&C(this)?X(this,""):e;var i=Z.ToUint32(n.length);var a=t(i);var o;if(arguments.length>1){o=arguments[1]}if(!D(r)){throw new TypeError("Array.prototype.map callback must be a function")}for(var f=0;f<i;f++){if(f in n){if(typeof o==="undefined"){a[f]=r(n[f],f,e)}else{a[f]=r.call(o,n[f],f,e)}}}return a}},!nt(r.map));$(r,{filter:function filter(t){var r=Z.ToObject(this);var e=et&&C(this)?X(this,""):r;var n=Z.ToUint32(e.length);var i=[];var a;var o;if(arguments.length>1){o=arguments[1]}if(!D(t)){throw new TypeError("Array.prototype.filter callback must be a function")}for(var f=0;f<n;f++){if(f in e){a=e[f];if(typeof o==="undefined"?t(a,f,r):t.call(o,a,f,r)){K(i,a)}}}return i}},!nt(r.filter));$(r,{every:function every(t){var r=Z.ToObject(this);var e=et&&C(this)?X(this,""):r;var n=Z.ToUint32(e.length);var i;if(arguments.length>1){i=arguments[1]}if(!D(t)){throw new TypeError("Array.prototype.every callback must be a function")}for(var a=0;a<n;a++){if(a in e&&!(typeof i==="undefined"?t(e[a],a,r):t.call(i,e[a],a,r))){return false}}return true}},!nt(r.every));$(r,{some:function some(t){var r=Z.ToObject(this);var e=et&&C(this)?X(this,""):r;var n=Z.ToUint32(e.length);var i;if(arguments.length>1){i=arguments[1]}if(!D(t)){throw new TypeError("Array.prototype.some callback must be a function")}for(var a=0;a<n;a++){if(a in e&&(typeof i==="undefined"?t(e[a],a,r):t.call(i,e[a],a,r))){return true}}return false}},!nt(r.some));var it=false;if(r.reduce){it=typeof r.reduce.call("es5",function(t,r,e,n){return n})==="object"}$(r,{reduce:function reduce(t){var r=Z.ToObject(this);var e=et&&C(this)?X(this,""):r;var n=Z.ToUint32(e.length);if(!D(t)){throw new TypeError("Array.prototype.reduce callback must be a function")}if(n===0&&arguments.length===1){throw new TypeError("reduce of empty array with no initial value")}var i=0;var a;if(arguments.length>=2){a=arguments[1]}else{do{if(i in e){a=e[i++];break}if(++i>=n){throw new TypeError("reduce of empty array with no initial value")}}while(true)}for(;i<n;i++){if(i in e){a=t(a,e[i],i,r)}}return a}},!it);var at=false;if(r.reduceRight){at=typeof r.reduceRight.call("es5",function(t,r,e,n){return n})==="object"}$(r,{reduceRight:function reduceRight(t){var r=Z.ToObject(this);var e=et&&C(this)?X(this,""):r;var n=Z.ToUint32(e.length);if(!D(t)){throw new TypeError("Array.prototype.reduceRight callback must be a function")}if(n===0&&arguments.length===1){throw new TypeError("reduceRight of empty array with no initial value")}var i;var a=n-1;if(arguments.length>=2){i=arguments[1]}else{do{if(a in e){i=e[a--];break}if(--a<0){throw new TypeError("reduceRight of empty array with no initial value")}}while(true)}if(a<0){return i}do{if(a in e){i=t(i,e[a],a,r)}}while(a--);return i}},!at);var ot=r.indexOf&&[0,1].indexOf(1,2)!==-1;$(r,{indexOf:function indexOf(t){var r=et&&C(this)?X(this,""):Z.ToObject(this);var e=Z.ToUint32(r.length);if(e===0){return-1}var n=0;if(arguments.length>1){n=Z.ToInteger(arguments[1])}n=n>=0?n:w(0,e+n);for(;n<e;n++){if(n in r&&r[n]===t){return n}}return-1}},ot);var ft=r.lastIndexOf&&[0,1].lastIndexOf(0,-3)!==-1;$(r,{lastIndexOf:function lastIndexOf(t){var r=et&&C(this)?X(this,""):Z.ToObject(this);var e=Z.ToUint32(r.length);if(e===0){return-1}var n=e-1;if(arguments.length>1){n=b(n,Z.ToInteger(arguments[1]))}n=n>=0?n:e-Math.abs(n);for(;n>=0;n--){if(n in r&&t===r[n]){return n}}return-1}},ft);var ut=function(){var t=[1,2];var r=t.splice();return t.length===2&&_(r)&&r.length===0}();$(r,{splice:function splice(t,r){if(arguments.length===0){return[]}else{return c.apply(this,arguments)}}},!ut);var lt=function(){var t={};r.splice.call(t,0,0,1);return t.length===1}();$(r,{splice:function splice(t,r){if(arguments.length===0){return[]}var e=arguments;this.length=w(Z.ToInteger(this.length),0);if(arguments.length>0&&typeof r!=="number"){e=H(arguments);if(e.length<2){K(e,this.length-t)}else{e[1]=Z.ToInteger(r)}}return c.apply(this,e)}},!lt);var st=function(){var r=new t(1e5);r[8]="x";r.splice(1,1);return r.indexOf("x")===7}();var ct=function(){var t=256;var r=[];r[t]="a";r.splice(t+1,0,"b");return r[t]==="a"}();$(r,{splice:function splice(t,r){var e=Z.ToObject(this);var n=[];var i=Z.ToUint32(e.length);var a=Z.ToInteger(t);var f=a<0?w(i+a,0):b(a,i);var u=b(w(Z.ToInteger(r),0),i-f);var l=0;var s;while(l<u){s=o(f+l);if(G(e,s)){n[l]=e[s]}l+=1}var c=H(arguments,2);var v=c.length;var h;if(v<u){l=f;var p=i-u;while(l<p){s=o(l+u);h=o(l+v);if(G(e,s)){e[h]=e[s]}else{delete e[h]}l+=1}l=i;var y=i-u+v;while(l>y){delete e[l-1];l-=1}}else if(v>u){l=i-u;while(l>f){s=o(l+u-1);h=o(l+v-1);if(G(e,s)){e[h]=e[s]}else{delete e[h]}l-=1}}l=f;for(var d=0;d<c.length;++d){e[l]=c[d];l+=1}e.length=i-u+v;return n}},!st||!ct);var vt=r.join;var ht;try{ht=Array.prototype.join.call("123",",")!=="1,2,3"}catch(pt){ht=true}if(ht){$(r,{join:function join(t){var r=typeof t==="undefined"?",":t;return vt.call(C(this)?X(this,""):this,r)}},ht)}var yt=[1,2].join(undefined)!=="1,2";if(yt){$(r,{join:function join(t){var r=typeof t==="undefined"?",":t;return vt.call(this,r)}},yt)}var dt=function push(t){var r=Z.ToObject(this);var e=Z.ToUint32(r.length);var n=0;while(n<arguments.length){r[e+n]=arguments[n];n+=1}r.length=e+n;return e+n};var gt=function(){var t={};var r=Array.prototype.push.call(t,undefined);return r!==1||t.length!==1||typeof t[0]!=="undefined"||!G(t,0)}();$(r,{push:function push(t){if(_(this)){return v.apply(this,arguments)}return dt.apply(this,arguments)}},gt);var wt=function(){var t=[];var r=t.push(undefined);return r!==1||t.length!==1||typeof t[0]!=="undefined"||!G(t,0)}();$(r,{push:dt},wt);$(r,{slice:function(t,r){var e=C(this)?X(this,""):this;return W(e,arguments)}},et);var bt=function(){try{[1,2].sort(null);[1,2].sort({});return true}catch(t){}return false}();var Tt=function(){try{[1,2].sort(/a/);return false}catch(t){}return true}();var mt=function(){try{[1,2].sort(undefined);return true}catch(t){}return false}();$(r,{sort:function sort(t){if(typeof t==="undefined"){return V(this)}if(!D(t)){throw new TypeError("Array.prototype.sort callback must be a function")}return V(this,t)}},bt||!mt||!Tt);var Dt=!{toString:null}.propertyIsEnumerable("toString");var xt=function(){}.propertyIsEnumerable("prototype");var St=!G("x","0");var Ot=function(t){var r=t.constructor;return r&&r.prototype===t};var Et={$window:true,$console:true,$parent:true,$self:true,$frame:true,$frames:true,$frameElement:true,$webkitIndexedDB:true,$webkitStorageInfo:true,$external:true};var jt=function(){if(typeof window==="undefined"){return false}for(var t in window){try{if(!Et["$"+t]&&G(window,t)&&window[t]!==null&&typeof window[t]==="object"){Ot(window[t])}}catch(r){return true}}return false}();var It=function(t){if(typeof window==="undefined"||!jt){return Ot(t)}try{return Ot(t)}catch(r){return false}};var Mt=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"];var Ut=Mt.length;var Ft=function isArguments(t){return B(t)==="[object Arguments]"};var Nt=function isArguments(t){return t!==null&&typeof t==="object"&&typeof t.length==="number"&&t.length>=0&&!_(t)&&D(t.callee)};var Ct=Ft(arguments)?Ft:Nt;$(e,{keys:function keys(t){var r=D(t);var e=Ct(t);var n=t!==null&&typeof t==="object";var i=n&&C(t);if(!n&&!r&&!e){throw new TypeError("Object.keys called on a non-object")}var a=[];var f=xt&&r;if(i&&St||e){for(var u=0;u<t.length;++u){K(a,o(u))}}if(!e){for(var l in t){if(!(f&&l==="prototype")&&G(t,l)){K(a,o(l))}}}if(Dt){var s=It(t);for(var c=0;c<Ut;c++){var v=Mt[c];if(!(s&&v==="constructor")&&G(t,v)){K(a,v)}}}return a}});var kt=e.keys&&function(){return e.keys(arguments).length===2}(1,2);var Rt=e.keys&&function(){var t=e.keys(arguments);return arguments.length!==1||t.length!==1||t[0]!==1}(1);var At=e.keys;$(e,{keys:function keys(t){if(Ct(t)){return At(H(t))}else{return At(t)}}},!kt||Rt);var Pt=new Date(-0xc782b5b342b24).getUTCMonth()!==0;var $t=new Date(-0x55d318d56a724);var Jt=new Date(14496624e5);var Yt=$t.toUTCString()!=="Mon, 01 Jan -45875 11:59:59 GMT";var Zt;var zt;var Gt=$t.getTimezoneOffset();if(Gt<-720){Zt=$t.toDateString()!=="Tue Jan 02 -45875";zt=!/^Thu Dec 10 2015 \d\d:\d\d:\d\d GMT[-\+]\d\d\d\d(?: |$)/.test(Jt.toString())}else{Zt=$t.toDateString()!=="Mon Jan 01 -45875";zt=!/^Wed Dec 09 2015 \d\d:\d\d:\d\d GMT[-\+]\d\d\d\d(?: |$)/.test(Jt.toString())}var Bt=d.bind(Date.prototype.getFullYear);var Ht=d.bind(Date.prototype.getMonth);var Wt=d.bind(Date.prototype.getDate);var Lt=d.bind(Date.prototype.getUTCFullYear);var Xt=d.bind(Date.prototype.getUTCMonth);var qt=d.bind(Date.prototype.getUTCDate);var Kt=d.bind(Date.prototype.getUTCDay);var Qt=d.bind(Date.prototype.getUTCHours);var Vt=d.bind(Date.prototype.getUTCMinutes);var _t=d.bind(Date.prototype.getUTCSeconds);var tr=d.bind(Date.prototype.getUTCMilliseconds);var rr=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];var er=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];var nr=function daysInMonth(t,r){return Wt(new Date(r,t,0))};$(Date.prototype,{getFullYear:function getFullYear(){if(!this||!(this instanceof Date)){throw new TypeError("this is not a Date object.")}var t=Bt(this);if(t<0&&Ht(this)>11){return t+1}return t},getMonth:function getMonth(){if(!this||!(this instanceof Date)){throw new TypeError("this is not a Date object.")}var t=Bt(this);var r=Ht(this);if(t<0&&r>11){return 0}return r},getDate:function getDate(){if(!this||!(this instanceof Date)){throw new TypeError("this is not a Date object.")}var t=Bt(this);var r=Ht(this);var e=Wt(this);if(t<0&&r>11){if(r===12){return e}var n=nr(0,t+1);return n-e+1}return e},getUTCFullYear:function getUTCFullYear(){if(!this||!(this instanceof Date)){throw new TypeError("this is not a Date object.")}var t=Lt(this);if(t<0&&Xt(this)>11){return t+1}return t},getUTCMonth:function getUTCMonth(){if(!this||!(this instanceof Date)){throw new TypeError("this is not a Date object.")}var t=Lt(this);var r=Xt(this);if(t<0&&r>11){return 0}return r},getUTCDate:function getUTCDate(){if(!this||!(this instanceof Date)){throw new TypeError("this is not a Date object.")}var t=Lt(this);var r=Xt(this);var e=qt(this);if(t<0&&r>11){if(r===12){return e}var n=nr(0,t+1);return n-e+1}return e}},Pt);$(Date.prototype,{toUTCString:function toUTCString(){if(!this||!(this instanceof Date)){throw new TypeError("this is not a Date object.")}var t=Kt(this);var r=qt(this);var e=Xt(this);var n=Lt(this);var i=Qt(this);var a=Vt(this);var o=_t(this);return rr[t]+", "+(r<10?"0"+r:r)+" "+er[e]+" "+n+" "+(i<10?"0"+i:i)+":"+(a<10?"0"+a:a)+":"+(o<10?"0"+o:o)+" GMT"}},Pt||Yt);$(Date.prototype,{toDateString:function toDateString(){if(!this||!(this instanceof Date)){throw new TypeError("this is not a Date object.")}var t=this.getDay();var r=this.getDate();var e=this.getMonth();var n=this.getFullYear();return rr[t]+" "+er[e]+" "+(r<10?"0"+r:r)+" "+n}},Pt||Zt);if(Pt||zt){Date.prototype.toString=function toString(){if(!this||!(this instanceof Date)){throw new TypeError("this is not a Date object.")}var t=this.getDay();var r=this.getDate();var e=this.getMonth();var n=this.getFullYear();var i=this.getHours();var a=this.getMinutes();var o=this.getSeconds();var f=this.getTimezoneOffset();var u=Math.floor(Math.abs(f)/60);var l=Math.floor(Math.abs(f)%60);return rr[t]+" "+er[e]+" "+(r<10?"0"+r:r)+" "+n+" "+(i<10?"0"+i:i)+":"+(a<10?"0"+a:a)+":"+(o<10?"0"+o:o)+" GMT"+(f>0?"-":"+")+(u<10?"0"+u:u)+(l<10?"0"+l:l)};if(P){e.defineProperty(Date.prototype,"toString",{configurable:true,enumerable:false,writable:true})}}var ir=-621987552e5;var ar="-000001";var or=Date.prototype.toISOString&&new Date(ir).toISOString().indexOf(ar)===-1;var fr=Date.prototype.toISOString&&new Date(-1).toISOString()!=="1969-12-31T23:59:59.999Z";var ur=d.bind(Date.prototype.getTime);$(Date.prototype,{toISOString:function toISOString(){if(!isFinite(this)||!isFinite(ur(this))){throw new RangeError("Date.prototype.toISOString called on non-finite value.")}var t=Lt(this);var r=Xt(this);t+=Math.floor(r/12);r=(r%12+12)%12;var e=[r+1,qt(this),Qt(this),Vt(this),_t(this)];t=(t<0?"-":t>9999?"+":"")+L("00000"+Math.abs(t),0<=t&&t<=9999?-4:-6);for(var n=0;n<e.length;++n){e[n]=L("00"+e[n],-2)}return t+"-"+H(e,0,2).join("-")+"T"+H(e,2).join(":")+"."+L("000"+tr(this),-3)+"Z"}},or||fr);var lr=function(){try{return Date.prototype.toJSON&&new Date(NaN).toJSON()===null&&new Date(ir).toJSON().indexOf(ar)!==-1&&Date.prototype.toJSON.call({toISOString:function(){return true}})}catch(t){return false}}();if(!lr){Date.prototype.toJSON=function toJSON(t){var r=e(this);var n=Z.ToPrimitive(r);if(typeof n==="number"&&!isFinite(n)){return null}var i=r.toISOString;if(!D(i)){throw new TypeError("toISOString property is not callable")}return i.call(r)}}var sr=Date.parse("+033658-09-27T01:46:40.000Z")===1e15;var cr=!isNaN(Date.parse("2012-04-04T24:00:00.500Z"))||!isNaN(Date.parse("2012-11-31T23:59:59.000Z"))||!isNaN(Date.parse("2012-12-31T23:59:60.000Z"));var vr=isNaN(Date.parse("2000-01-01T00:00:00.000Z"));if(vr||cr||!sr){var hr=Math.pow(2,31)-1;var pr=Y(new Date(1970,0,1,0,0,0,hr+1).getTime());Date=function(t){var r=function Date(e,n,i,a,f,u,l){var s=arguments.length;var c;if(this instanceof t){var v=u;var h=l;if(pr&&s>=7&&l>hr){var p=Math.floor(l/hr)*hr;var y=Math.floor(p/1e3);v+=y;h-=y*1e3}c=s===1&&o(e)===e?new t(r.parse(e)):s>=7?new t(e,n,i,a,f,v,h):s>=6?new t(e,n,i,a,f,v):s>=5?new t(e,n,i,a,f):s>=4?new t(e,n,i,a):s>=3?new t(e,n,i):s>=2?new t(e,n):s>=1?new t(e instanceof t?+e:e):new t}else{c=t.apply(this,arguments)}if(!J(c)){$(c,{constructor:r},true)}return c};var e=new RegExp("^"+"(\\d{4}|[+-]\\d{6})"+"(?:-(\\d{2})"+"(?:-(\\d{2})"+"(?:"+"T(\\d{2})"+":(\\d{2})"+"(?:"+":(\\d{2})"+"(?:(\\.\\d{1,}))?"+")?"+"("+"Z|"+"(?:"+"([-+])"+"(\\d{2})"+":(\\d{2})"+")"+")?)?)?)?"+"$");var n=[0,31,59,90,120,151,181,212,243,273,304,334,365];var i=function dayFromMonth(t,r){var e=r>1?1:0;return n[r]+Math.floor((t-1969+e)/4)-Math.floor((t-1901+e)/100)+Math.floor((t-1601+e)/400)+365*(t-1970)};var a=function toUTC(r){var e=0;var n=r;if(pr&&n>hr){var i=Math.floor(n/hr)*hr;var a=Math.floor(i/1e3);e+=a;n-=a*1e3}return u(new t(1970,0,1,0,0,e,n))};for(var f in t){if(G(t,f)){r[f]=t[f]}}$(r,{now:t.now,UTC:t.UTC},true);r.prototype=t.prototype;$(r.prototype,{constructor:r},true);var l=function parse(r){var n=e.exec(r);if(n){var o=u(n[1]),f=u(n[2]||1)-1,l=u(n[3]||1)-1,s=u(n[4]||0),c=u(n[5]||0),v=u(n[6]||0),h=Math.floor(u(n[7]||0)*1e3),p=Boolean(n[4]&&!n[8]),y=n[9]==="-"?1:-1,d=u(n[10]||0),g=u(n[11]||0),w;var b=c>0||v>0||h>0;if(s<(b?24:25)&&c<60&&v<60&&h<1e3&&f>-1&&f<12&&d<24&&g<60&&l>-1&&l<i(o,f+1)-i(o,f)){w=((i(o,f)+l)*24+s+d*y)*60;w=((w+c+g*y)*60+v)*1e3+h;if(p){w=a(w)}if(-864e13<=w&&w<=864e13){return w}}return NaN}return t.parse.apply(this,arguments)};$(r,{parse:l});return r}(Date)}if(!Date.now){Date.now=function now(){return(new Date).getTime()}}var yr=l.toFixed&&(8e-5.toFixed(3)!=="0.000"||.9.toFixed(0)!=="1"||1.255.toFixed(2)!=="1.25"||0xde0b6b3a7640080.toFixed(0)!=="1000000000000000128");var dr={base:1e7,size:6,data:[0,0,0,0,0,0],multiply:function multiply(t,r){var e=-1;var n=r;while(++e<dr.size){n+=t*dr.data[e];dr.data[e]=n%dr.base;n=Math.floor(n/dr.base)}},divide:function divide(t){var r=dr.size;var e=0;while(--r>=0){e+=dr.data[r];dr.data[r]=Math.floor(e/t);e=e%t*dr.base}},numToString:function numToString(){var t=dr.size;var r="";while(--t>=0){if(r!==""||t===0||dr.data[t]!==0){var e=o(dr.data[t]);if(r===""){r=e}else{r+=L("0000000",0,7-e.length)+e}}}return r},pow:function pow(t,r,e){return r===0?e:r%2===1?pow(t,r-1,e*t):pow(t*t,r/2,e)},log:function log(t){var r=0;var e=t;while(e>=4096){r+=12;e/=4096}while(e>=2){r+=1;e/=2}return r}};var gr=function toFixed(t){var r,e,n,i,a,f,l,s;r=u(t);r=Y(r)?0:Math.floor(r);if(r<0||r>20){throw new RangeError("Number.toFixed called with invalid number of decimals")}e=u(this);if(Y(e)){return"NaN"}if(e<=-1e21||e>=1e21){return o(e)}n="";if(e<0){n="-";e=-e}i="0";if(e>1e-21){a=dr.log(e*dr.pow(2,69,1))-69;f=a<0?e*dr.pow(2,-a,1):e/dr.pow(2,a,1);f*=4503599627370496;a=52-a;if(a>0){dr.multiply(0,f);l=r;while(l>=7){dr.multiply(1e7,0);l-=7}dr.multiply(dr.pow(10,l,1),0);l=a-1;while(l>=23){dr.divide(1<<23);l-=23}dr.divide(1<<l);dr.multiply(1,1);dr.divide(2);i=dr.numToString()}else{dr.multiply(0,f);dr.multiply(1<<-a,0);i=dr.numToString()+L("0.00000000000000000000",2,2+r)}}if(r>0){s=i.length;if(s<=r){i=n+L("0.0000000000000000000",0,r-s+2)+i}else{i=n+L(i,0,s-r)+"."+L(i,s-r)}}else{i=n+i}return i};$(l,{toFixed:gr},yr);var wr=function(){try{return 1..toPrecision(undefined)==="1"}catch(t){return true}}();var br=l.toPrecision;$(l,{toPrecision:function toPrecision(t){return typeof t==="undefined"?br.call(this):br.call(this,t)}},wr);if("ab".split(/(?:ab)*/).length!==2||".".split(/(.?)(.?)/).length!==4||"tesst".split(/(s)*/)[1]==="t"||"test".split(/(?:)/,-1).length!==4||"".split(/.?/).length||".".split(/()()/).length>1){(function(){var t=typeof/()??/.exec("")[1]==="undefined";var r=Math.pow(2,32)-1;f.split=function(e,n){var i=String(this);if(typeof e==="undefined"&&n===0){return[]}if(!M(e)){return X(this,e,n)}var a=[];var o=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),f=0,u,l,s,c;var h=new RegExp(e.source,o+"g");if(!t){u=new RegExp("^"+h.source+"$(?!\\s)",o)}var p=typeof n==="undefined"?r:Z.ToUint32(n);l=h.exec(i);while(l){s=l.index+l[0].length;if(s>f){K(a,L(i,f,l.index));if(!t&&l.length>1){l[0].replace(u,function(){for(var t=1;t<arguments.length-2;t++){if(typeof arguments[t]==="undefined"){l[t]=void 0}}})}if(l.length>1&&l.index<i.length){v.apply(a,H(l,1))}c=l[0].length;f=s;if(a.length>=p){break}}if(h.lastIndex===l.index){h.lastIndex++}l=h.exec(i)}if(f===i.length){if(c||!h.test("")){K(a,"")}}else{K(a,L(i,f))}return a.length>p?H(a,0,p):a}})()}else if("0".split(void 0,0).length){f.split=function split(t,r){if(typeof t==="undefined"&&r===0){return[]}return X(this,t,r)}}var Tr=f.replace;var mr=function(){var t=[];"x".replace(/x(.)?/g,function(r,e){K(t,e)});return t.length===1&&typeof t[0]==="undefined"}();if(!mr){f.replace=function replace(t,r){var e=D(r);var n=M(t)&&/\)[*?]/.test(t.source);if(!e||!n){return Tr.call(this,t,r)}else{var i=function(e){var n=arguments.length;var i=t.lastIndex;t.lastIndex=0;var a=t.exec(e)||[];t.lastIndex=i;K(a,arguments[n-2],arguments[n-1]);return r.apply(this,a)};return Tr.call(this,t,i)}}}var Dr=f.substr;var xr="".substr&&"0b".substr(-1)!=="b";$(f,{substr:function substr(t,r){var e=t;if(t<0){e=w(this.length+t,0)}return Dr.call(this,e,r)}},xr);var Sr=" \n\x0B\f\r \xa0\u1680\u180e\u2000\u2001\u2002\u2003"+"\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028"+"\u2029\ufeff";var Or="\u200b";var Er="["+Sr+"]";var jr=new RegExp("^"+Er+Er+"*");var Ir=new RegExp(Er+Er+"*$");var Mr=f.trim&&(Sr.trim()||!Or.trim());$(f,{trim:function trim(){if(typeof this==="undefined"||this===null){throw new TypeError("can't convert "+this+" to object")}return o(this).replace(jr,"").replace(Ir,"")}},Mr);var Ur=d.bind(String.prototype.trim);var Fr=f.lastIndexOf&&"abc\u3042\u3044".lastIndexOf("\u3042\u3044",2)!==-1;$(f,{lastIndexOf:function lastIndexOf(t){if(typeof this==="undefined"||this===null){throw new TypeError("can't convert "+this+" to object")}var r=o(this);var e=o(t);var n=arguments.length>1?u(arguments[1]):NaN;var i=Y(n)?Infinity:Z.ToInteger(n);var a=b(w(i,0),r.length);var f=e.length;var l=a+f;while(l>0){l=w(0,l-f);var s=q(L(r,l,a+f),e);if(s!==-1){return l+s}}return-1}},Fr);var Nr=f.lastIndexOf;$(f,{lastIndexOf:function lastIndexOf(t){return Nr.apply(this,arguments)}},f.lastIndexOf.length!==1);if(parseInt(Sr+"08")!==8||parseInt(Sr+"0x16")!==22){parseInt=function(t){var r=/^[\-+]?0[xX]/;return function parseInt(e,n){var i=Ur(e);var a=u(n)||(r.test(i)?16:10);return t(i,a)}}(parseInt)}if(1/parseFloat("-0")!==-Infinity){parseFloat=function(t){return function parseFloat(r){var e=Ur(r);var n=t(e);return n===0&&L(e,0,1)==="-"?-0:n}}(parseFloat)}if(String(new RangeError("test"))!=="RangeError: test"){var Cr=function toString(){if(typeof this==="undefined"||this===null){throw new TypeError("can't convert "+this+" to object")}var t=this.name;if(typeof t==="undefined"){t="Error"}else if(typeof t!=="string"){t=o(t)}var r=this.message;if(typeof r==="undefined"){r=""}else if(typeof r!=="string"){r=o(r)}if(!t){return r}if(!r){return t}return t+": "+r};Error.prototype.toString=Cr}if(P){var kr=function(t,r){if(Q(t,r)){var e=Object.getOwnPropertyDescriptor(t,r);e.enumerable=false;Object.defineProperty(t,r,e)}};kr(Error.prototype,"message");if(Error.prototype.message!==""){Error.prototype.message=""}kr(Error.prototype,"name")}if(String(/a/gim)!=="/a/gim"){var Rr=function toString(){var t="/"+this.source+"/";if(this.global){t+="g"}if(this.ignoreCase){t+="i"}if(this.multiline){t+="m"}return t};RegExp.prototype.toString=Rr}}); +//# sourceMappingURL=es5-shim.map +/*! + * https://github.com/es-shims/es5-shim + * @license es5-shim Copyright 2009-2015 by contributors, MIT License + * see https://github.com/es-shims/es5-shim/blob/v4.5.7/LICENSE + */ +(function(e,t){"use strict";if(typeof define==="function"&&define.amd){define(t)}else if(typeof exports==="object"){module.exports=t()}else{e.returnExports=t()}})(this,function(){var e=Function.call;var t=Object.prototype;var r=e.bind(t.hasOwnProperty);var n=e.bind(t.propertyIsEnumerable);var o=e.bind(t.toString);var i;var c;var f;var a;var l=r(t,"__defineGetter__");if(l){i=e.bind(t.__defineGetter__);c=e.bind(t.__defineSetter__);f=e.bind(t.__lookupGetter__);a=e.bind(t.__lookupSetter__)}if(!Object.getPrototypeOf){Object.getPrototypeOf=function getPrototypeOf(e){var r=e.__proto__;if(r||r===null){return r}else if(o(e.constructor)==="[object Function]"){return e.constructor.prototype}else if(e instanceof Object){return t}else{return null}}}var u=function doesGetOwnPropertyDescriptorWork(e){try{e.sentinel=0;return Object.getOwnPropertyDescriptor(e,"sentinel").value===0}catch(t){return false}};if(Object.defineProperty){var p=u({});var s=typeof document==="undefined"||u(document.createElement("div"));if(!s||!p){var b=Object.getOwnPropertyDescriptor}}if(!Object.getOwnPropertyDescriptor||b){var O="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function getOwnPropertyDescriptor(e,o){if(typeof e!=="object"&&typeof e!=="function"||e===null){throw new TypeError(O+e)}if(b){try{return b.call(Object,e,o)}catch(i){}}var c;if(!r(e,o)){return c}c={enumerable:n(e,o),configurable:true};if(l){var u=e.__proto__;var p=e!==t;if(p){e.__proto__=t}var s=f(e,o);var y=a(e,o);if(p){e.__proto__=u}if(s||y){if(s){c.get=s}if(y){c.set=y}return c}}c.value=e[o];c.writable=true;return c}}if(!Object.getOwnPropertyNames){Object.getOwnPropertyNames=function getOwnPropertyNames(e){return Object.keys(e)}}if(!Object.create){var y;var d=!({__proto__:null}instanceof Object);var j=function shouldUseActiveX(){if(!document.domain){return false}try{return!!new ActiveXObject("htmlfile")}catch(e){return false}};var v=function getEmptyViaActiveX(){var e;var t;t=new ActiveXObject("htmlfile");t.write("<script></script>");t.close();e=t.parentWindow.Object.prototype;t=null;return e};var _=function getEmptyViaIFrame(){var e=document.createElement("iframe");var t=document.body||document.documentElement;var r;e.style.display="none";t.appendChild(e);e.src="javascript:";r=e.contentWindow.Object.prototype;t.removeChild(e);e=null;return r};if(d||typeof document==="undefined"){y=function(){return{__proto__:null}}}else{y=function(){var e=j()?v():_();delete e.constructor;delete e.hasOwnProperty;delete e.propertyIsEnumerable;delete e.isPrototypeOf;delete e.toLocaleString;delete e.toString;delete e.valueOf;var t=function Empty(){};t.prototype=e;y=function(){return new t};return new t}}Object.create=function create(e,t){var r;var n=function Type(){};if(e===null){r=y()}else{if(typeof e!=="object"&&typeof e!=="function"){throw new TypeError("Object prototype may only be an Object or null")}n.prototype=e;r=new n;r.__proto__=e}if(t!==void 0){Object.defineProperties(r,t)}return r}}var w=function doesDefinePropertyWork(e){try{Object.defineProperty(e,"sentinel",{});return"sentinel"in e}catch(t){return false}};if(Object.defineProperty){var m=w({});var P=typeof document==="undefined"||w(document.createElement("div"));if(!m||!P){var E=Object.defineProperty,h=Object.defineProperties}}if(!Object.defineProperty||E){var g="Property description must be an object: ";var z="Object.defineProperty called on non-object: ";var T="getters & setters can not be defined on this javascript engine";Object.defineProperty=function defineProperty(e,r,n){if(typeof e!=="object"&&typeof e!=="function"||e===null){throw new TypeError(z+e)}if(typeof n!=="object"&&typeof n!=="function"||n===null){throw new TypeError(g+n)}if(E){try{return E.call(Object,e,r,n)}catch(o){}}if("value"in n){if(l&&(f(e,r)||a(e,r))){var u=e.__proto__;e.__proto__=t;delete e[r];e[r]=n.value;e.__proto__=u}else{e[r]=n.value}}else{if(!l&&("get"in n||"set"in n)){throw new TypeError(T)}if("get"in n){i(e,r,n.get)}if("set"in n){c(e,r,n.set)}}return e}}if(!Object.defineProperties||h){Object.defineProperties=function defineProperties(e,t){if(h){try{return h.call(Object,e,t)}catch(r){}}Object.keys(t).forEach(function(r){if(r!=="__proto__"){Object.defineProperty(e,r,t[r])}});return e}}if(!Object.seal){Object.seal=function seal(e){if(Object(e)!==e){throw new TypeError("Object.seal can only be called on Objects.")}return e}}if(!Object.freeze){Object.freeze=function freeze(e){if(Object(e)!==e){throw new TypeError("Object.freeze can only be called on Objects.")}return e}}try{Object.freeze(function(){})}catch(x){Object.freeze=function(e){return function freeze(t){if(typeof t==="function"){return t}else{return e(t)}}}(Object.freeze)}if(!Object.preventExtensions){Object.preventExtensions=function preventExtensions(e){if(Object(e)!==e){throw new TypeError("Object.preventExtensions can only be called on Objects.")}return e}}if(!Object.isSealed){Object.isSealed=function isSealed(e){if(Object(e)!==e){throw new TypeError("Object.isSealed can only be called on Objects.")}return false}}if(!Object.isFrozen){Object.isFrozen=function isFrozen(e){if(Object(e)!==e){throw new TypeError("Object.isFrozen can only be called on Objects.")}return false}}if(!Object.isExtensible){Object.isExtensible=function isExtensible(e){if(Object(e)!==e){throw new TypeError("Object.isExtensible can only be called on Objects.")}var t="";while(r(e,t)){t+="?"}e[t]=true;var n=r(e,t);delete e[t];return n}}}); +//# sourceMappingURL=es5-sham.map +/*! + * https://github.com/paulmillr/es6-shim + * @license es6-shim Copyright 2013-2016 by Paul Miller (http://paulmillr.com) + * and contributors, MIT License + * es6-sham: v0.35.1 + * see https://github.com/paulmillr/es6-shim/blob/0.35.1/LICENSE + * Details and documentation: + * https://github.com/paulmillr/es6-shim/ + */ +(function(t,e){if(typeof define==="function"&&define.amd){define(e)}else if(typeof exports==="object"){module.exports=e()}else{t.returnExports=e()}})(this,function(){"use strict";var t=new Function("return this;");var e=t();var r=e.Object;var n=Function.call.bind(Function.call);var o=Function.toString;var i=String.prototype.match;var f=function(t){try{t();return false}catch(e){return true}};var a=function(){return!f(function(){r.defineProperty({},"x",{get:function(){}})})};var u=!!r.defineProperty&&a();(function(){if(r.setPrototypeOf){return}var t=r.getOwnPropertyNames;var e=r.getOwnPropertyDescriptor;var n=r.create;var o=r.defineProperty;var i=r.getPrototypeOf;var f=r.prototype;var a=function(r,n){t(n).forEach(function(t){o(r,t,e(n,t))});return r};var u=function(t,e){return a(n(e),t)};var c,s;try{c=e(f,"__proto__").set;c.call({},null);s=function(t,e){c.call(t,e);return t}}catch(l){c={__proto__:null};if(c instanceof r){s=u}else{c.__proto__=f;if(c instanceof r){s=function(t,e){t.__proto__=e;return t}}else{s=function(t,e){if(i(t)){t.__proto__=e;return t}else{return u(t,e)}}}}}r.setPrototypeOf=s})();if(u&&function foo(){}.name!=="foo"){r.defineProperty(Function.prototype,"name",{configurable:true,enumerable:false,get:function(){var t=n(o,this);var e=n(i,t,/\s*function\s+([^\(\s]*)\s*/);var f=e&&e[1];r.defineProperty(this,"name",{configurable:true,enumerable:false,writable:false,value:f});return f}})}}); +//# sourceMappingURL=es6-sham.map +/*! + * https://github.com/paulmillr/es6-shim + * @license es6-shim Copyright 2013-2016 by Paul Miller (http://paulmillr.com) + * and contributors, MIT License + * es6-shim: v0.35.1 + * see https://github.com/paulmillr/es6-shim/blob/0.35.1/LICENSE + * Details and documentation: + * https://github.com/paulmillr/es6-shim/ + */ +(function(e,t){if(typeof define==="function"&&define.amd){define(t)}else if(typeof exports==="object"){module.exports=t()}else{e.returnExports=t()}})(this,function(){"use strict";var e=Function.call.bind(Function.apply);var t=Function.call.bind(Function.call);var r=Array.isArray;var n=Object.keys;var o=function notThunker(t){return function notThunk(){return!e(t,this,arguments)}};var i=function(e){try{e();return false}catch(t){return true}};var a=function valueOrFalseIfThrows(e){try{return e()}catch(t){return false}};var u=o(i);var f=function(){return!i(function(){Object.defineProperty({},"x",{get:function(){}})})};var s=!!Object.defineProperty&&f();var c=function foo(){}.name==="foo";var l=Function.call.bind(Array.prototype.forEach);var p=Function.call.bind(Array.prototype.reduce);var v=Function.call.bind(Array.prototype.filter);var y=Function.call.bind(Array.prototype.some);var h=function(e,t,r,n){if(!n&&t in e){return}if(s){Object.defineProperty(e,t,{configurable:true,enumerable:false,writable:true,value:r})}else{e[t]=r}};var b=function(e,t,r){l(n(t),function(n){var o=t[n];h(e,n,o,!!r)})};var g=Function.call.bind(Object.prototype.toString);var d=typeof/abc/==="function"?function IsCallableSlow(e){return typeof e==="function"&&g(e)==="[object Function]"}:function IsCallableFast(e){return typeof e==="function"};var O={getter:function(e,t,r){if(!s){throw new TypeError("getters require true ES5 support")}Object.defineProperty(e,t,{configurable:true,enumerable:false,get:r})},proxy:function(e,t,r){if(!s){throw new TypeError("getters require true ES5 support")}var n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,{configurable:n.configurable,enumerable:n.enumerable,get:function getKey(){return e[t]},set:function setKey(r){e[t]=r}})},redefine:function(e,t,r){if(s){var n=Object.getOwnPropertyDescriptor(e,t);n.value=r;Object.defineProperty(e,t,n)}else{e[t]=r}},defineByDescriptor:function(e,t,r){if(s){Object.defineProperty(e,t,r)}else if("value"in r){e[t]=r.value}},preserveToString:function(e,t){if(t&&d(t.toString)){h(e,"toString",t.toString.bind(t),true)}}};var m=Object.create||function(e,t){var r=function Prototype(){};r.prototype=e;var o=new r;if(typeof t!=="undefined"){n(t).forEach(function(e){O.defineByDescriptor(o,e,t[e])})}return o};var w=function(e,t){if(!Object.setPrototypeOf){return false}return a(function(){var r=function Subclass(t){var r=new e(t);Object.setPrototypeOf(r,Subclass.prototype);return r};Object.setPrototypeOf(r,e);r.prototype=m(e.prototype,{constructor:{value:r}});return t(r)})};var j=function(){if(typeof self!=="undefined"){return self}if(typeof window!=="undefined"){return window}if(typeof global!=="undefined"){return global}throw new Error("unable to locate global object")};var S=j();var T=S.isFinite;var I=Function.call.bind(String.prototype.indexOf);var E=Function.apply.bind(Array.prototype.indexOf);var P=Function.call.bind(Array.prototype.concat);var C=Function.call.bind(String.prototype.slice);var M=Function.call.bind(Array.prototype.push);var x=Function.apply.bind(Array.prototype.push);var N=Function.call.bind(Array.prototype.shift);var A=Math.max;var R=Math.min;var _=Math.floor;var k=Math.abs;var F=Math.exp;var L=Math.log;var D=Math.sqrt;var z=Function.call.bind(Object.prototype.hasOwnProperty);var q;var W=function(){};var G=S.Symbol||{};var H=G.species||"@@species";var V=Number.isNaN||function isNaN(e){return e!==e};var B=Number.isFinite||function isFinite(e){return typeof e==="number"&&T(e)};var $=d(Math.sign)?Math.sign:function sign(e){var t=Number(e);if(t===0){return t}if(V(t)){return t}return t<0?-1:1};var U=function isArguments(e){return g(e)==="[object Arguments]"};var J=function isArguments(e){return e!==null&&typeof e==="object"&&typeof e.length==="number"&&e.length>=0&&g(e)!=="[object Array]"&&g(e.callee)==="[object Function]"};var X=U(arguments)?U:J;var K={primitive:function(e){return e===null||typeof e!=="function"&&typeof e!=="object"},string:function(e){return g(e)==="[object String]"},regex:function(e){return g(e)==="[object RegExp]"},symbol:function(e){return typeof S.Symbol==="function"&&typeof e==="symbol"}};var Z=function overrideNative(e,t,r){var n=e[t];h(e,t,r,true);O.preserveToString(e[t],n)};var Y=typeof G==="function"&&typeof G["for"]==="function"&&K.symbol(G());var Q=K.symbol(G.iterator)?G.iterator:"_es6-shim iterator_";if(S.Set&&typeof(new S.Set)["@@iterator"]==="function"){Q="@@iterator"}if(!S.Reflect){h(S,"Reflect",{},true)}var ee=S.Reflect;var te=String;var re={Call:function Call(t,r){var n=arguments.length>2?arguments[2]:[];if(!re.IsCallable(t)){throw new TypeError(t+" is not a function")}return e(t,r,n)},RequireObjectCoercible:function(e,t){if(e==null){throw new TypeError(t||"Cannot call method on "+e)}return e},TypeIsObject:function(e){if(e===void 0||e===null||e===true||e===false){return false}return typeof e==="function"||typeof e==="object"},ToObject:function(e,t){return Object(re.RequireObjectCoercible(e,t))},IsCallable:d,IsConstructor:function(e){return re.IsCallable(e)},ToInt32:function(e){return re.ToNumber(e)>>0},ToUint32:function(e){return re.ToNumber(e)>>>0},ToNumber:function(e){if(g(e)==="[object Symbol]"){throw new TypeError("Cannot convert a Symbol value to a number")}return+e},ToInteger:function(e){var t=re.ToNumber(e);if(V(t)){return 0}if(t===0||!B(t)){return t}return(t>0?1:-1)*_(k(t))},ToLength:function(e){var t=re.ToInteger(e);if(t<=0){return 0}if(t>Number.MAX_SAFE_INTEGER){return Number.MAX_SAFE_INTEGER}return t},SameValue:function(e,t){if(e===t){if(e===0){return 1/e===1/t}return true}return V(e)&&V(t)},SameValueZero:function(e,t){return e===t||V(e)&&V(t)},IsIterable:function(e){return re.TypeIsObject(e)&&(typeof e[Q]!=="undefined"||X(e))},GetIterator:function(e){if(X(e)){return new q(e,"value")}var t=re.GetMethod(e,Q);if(!re.IsCallable(t)){throw new TypeError("value is not an iterable")}var r=re.Call(t,e);if(!re.TypeIsObject(r)){throw new TypeError("bad iterator")}return r},GetMethod:function(e,t){var r=re.ToObject(e)[t];if(r===void 0||r===null){return void 0}if(!re.IsCallable(r)){throw new TypeError("Method not callable: "+t)}return r},IteratorComplete:function(e){return!!e.done},IteratorClose:function(e,t){var r=re.GetMethod(e,"return");if(r===void 0){return}var n,o;try{n=re.Call(r,e)}catch(i){o=i}if(t){return}if(o){throw o}if(!re.TypeIsObject(n)){throw new TypeError("Iterator's return method returned a non-object.")}},IteratorNext:function(e){var t=arguments.length>1?e.next(arguments[1]):e.next();if(!re.TypeIsObject(t)){throw new TypeError("bad iterator")}return t},IteratorStep:function(e){var t=re.IteratorNext(e);var r=re.IteratorComplete(t);return r?false:t},Construct:function(e,t,r,n){var o=typeof r==="undefined"?e:r;if(!n&&ee.construct){return ee.construct(e,t,o)}var i=o.prototype;if(!re.TypeIsObject(i)){i=Object.prototype}var a=m(i);var u=re.Call(e,a,t);return re.TypeIsObject(u)?u:a},SpeciesConstructor:function(e,t){var r=e.constructor;if(r===void 0){return t}if(!re.TypeIsObject(r)){throw new TypeError("Bad constructor")}var n=r[H];if(n===void 0||n===null){return t}if(!re.IsConstructor(n)){throw new TypeError("Bad @@species")}return n},CreateHTML:function(e,t,r,n){var o=re.ToString(e);var i="<"+t;if(r!==""){var a=re.ToString(n);var u=a.replace(/"/g,"&quot;");i+=" "+r+'="'+u+'"'}var f=i+">";var s=f+o;return s+"</"+t+">"},IsRegExp:function IsRegExp(e){if(!re.TypeIsObject(e)){return false}var t=e[G.match];if(typeof t!=="undefined"){return!!t}return K.regex(e)},ToString:function ToString(e){return te(e)}};if(s&&Y){var ne=function defineWellKnownSymbol(e){if(K.symbol(G[e])){return G[e]}var t=G["for"]("Symbol."+e);Object.defineProperty(G,e,{configurable:false,enumerable:false,writable:false,value:t});return t};if(!K.symbol(G.search)){var oe=ne("search");var ie=String.prototype.search;h(RegExp.prototype,oe,function search(e){return re.Call(ie,e,[this])});var ae=function search(e){var t=re.RequireObjectCoercible(this);if(e!==null&&typeof e!=="undefined"){var r=re.GetMethod(e,oe);if(typeof r!=="undefined"){return re.Call(r,e,[t])}}return re.Call(ie,t,[re.ToString(e)])};Z(String.prototype,"search",ae)}if(!K.symbol(G.replace)){var ue=ne("replace");var fe=String.prototype.replace;h(RegExp.prototype,ue,function replace(e,t){return re.Call(fe,e,[this,t])});var se=function replace(e,t){var r=re.RequireObjectCoercible(this);if(e!==null&&typeof e!=="undefined"){var n=re.GetMethod(e,ue);if(typeof n!=="undefined"){return re.Call(n,e,[r,t])}}return re.Call(fe,r,[re.ToString(e),t])};Z(String.prototype,"replace",se)}if(!K.symbol(G.split)){var ce=ne("split");var le=String.prototype.split;h(RegExp.prototype,ce,function split(e,t){return re.Call(le,e,[this,t])});var pe=function split(e,t){var r=re.RequireObjectCoercible(this);if(e!==null&&typeof e!=="undefined"){var n=re.GetMethod(e,ce);if(typeof n!=="undefined"){return re.Call(n,e,[r,t])}}return re.Call(le,r,[re.ToString(e),t])};Z(String.prototype,"split",pe)}var ve=K.symbol(G.match);var ye=ve&&function(){var e={};e[G.match]=function(){return 42};return"a".match(e)!==42}();if(!ve||ye){var he=ne("match");var be=String.prototype.match;h(RegExp.prototype,he,function match(e){return re.Call(be,e,[this])});var ge=function match(e){var t=re.RequireObjectCoercible(this);if(e!==null&&typeof e!=="undefined"){var r=re.GetMethod(e,he);if(typeof r!=="undefined"){return re.Call(r,e,[t])}}return re.Call(be,t,[re.ToString(e)])};Z(String.prototype,"match",ge)}}var de=function wrapConstructor(e,t,r){O.preserveToString(t,e);if(Object.setPrototypeOf){Object.setPrototypeOf(e,t)}if(s){l(Object.getOwnPropertyNames(e),function(n){if(n in W||r[n]){return}O.proxy(e,n,t)})}else{l(Object.keys(e),function(n){if(n in W||r[n]){return}t[n]=e[n]})}t.prototype=e.prototype;O.redefine(e.prototype,"constructor",t)};var Oe=function(){return this};var me=function(e){if(s&&!z(e,H)){O.getter(e,H,Oe)}};var we=function(e,t){var r=t||function iterator(){return this};h(e,Q,r);if(!e[Q]&&K.symbol(Q)){e[Q]=r}};var je=function createDataProperty(e,t,r){if(s){Object.defineProperty(e,t,{configurable:true,enumerable:true,writable:true,value:r})}else{e[t]=r}};var Se=function createDataPropertyOrThrow(e,t,r){je(e,t,r);if(!re.SameValue(e[t],r)){throw new TypeError("property is nonconfigurable")}};var Te=function(e,t,r,n){if(!re.TypeIsObject(e)){throw new TypeError("Constructor requires `new`: "+t.name)}var o=t.prototype;if(!re.TypeIsObject(o)){o=r}var i=m(o);for(var a in n){if(z(n,a)){var u=n[a];h(i,a,u,true)}}return i};if(String.fromCodePoint&&String.fromCodePoint.length!==1){var Ie=String.fromCodePoint;Z(String,"fromCodePoint",function fromCodePoint(e){return re.Call(Ie,this,arguments)})}var Ee={fromCodePoint:function fromCodePoint(e){var t=[];var r;for(var n=0,o=arguments.length;n<o;n++){r=Number(arguments[n]);if(!re.SameValue(r,re.ToInteger(r))||r<0||r>1114111){throw new RangeError("Invalid code point "+r)}if(r<65536){M(t,String.fromCharCode(r))}else{r-=65536;M(t,String.fromCharCode((r>>10)+55296));M(t,String.fromCharCode(r%1024+56320))}}return t.join("")},raw:function raw(e){var t=re.ToObject(e,"bad callSite");var r=re.ToObject(t.raw,"bad raw value");var n=r.length;var o=re.ToLength(n);if(o<=0){return""}var i=[];var a=0;var u,f,s,c;while(a<o){u=re.ToString(a);s=re.ToString(r[u]);M(i,s);if(a+1>=o){break}f=a+1<arguments.length?arguments[a+1]:"";c=re.ToString(f);M(i,c);a+=1}return i.join("")}};if(String.raw&&String.raw({raw:{0:"x",1:"y",length:2}})!=="xy"){Z(String,"raw",Ee.raw)}b(String,Ee);var Pe=function repeat(e,t){if(t<1){return""}if(t%2){return repeat(e,t-1)+e}var r=repeat(e,t/2);return r+r};var Ce=Infinity;var Me={repeat:function repeat(e){var t=re.ToString(re.RequireObjectCoercible(this));var r=re.ToInteger(e);if(r<0||r>=Ce){throw new RangeError("repeat count must be less than infinity and not overflow maximum string size")}return Pe(t,r)},startsWith:function startsWith(e){var t=re.ToString(re.RequireObjectCoercible(this));if(re.IsRegExp(e)){throw new TypeError('Cannot call method "startsWith" with a regex')}var r=re.ToString(e);var n;if(arguments.length>1){n=arguments[1]}var o=A(re.ToInteger(n),0);return C(t,o,o+r.length)===r},endsWith:function endsWith(e){var t=re.ToString(re.RequireObjectCoercible(this));if(re.IsRegExp(e)){throw new TypeError('Cannot call method "endsWith" with a regex')}var r=re.ToString(e);var n=t.length;var o;if(arguments.length>1){o=arguments[1]}var i=typeof o==="undefined"?n:re.ToInteger(o);var a=R(A(i,0),n);return C(t,a-r.length,a)===r},includes:function includes(e){if(re.IsRegExp(e)){throw new TypeError('"includes" does not accept a RegExp')}var t=re.ToString(e);var r;if(arguments.length>1){r=arguments[1]}return I(this,t,r)!==-1},codePointAt:function codePointAt(e){var t=re.ToString(re.RequireObjectCoercible(this));var r=re.ToInteger(e);var n=t.length;if(r>=0&&r<n){var o=t.charCodeAt(r);var i=r+1===n;if(o<55296||o>56319||i){return o}var a=t.charCodeAt(r+1);if(a<56320||a>57343){return o}return(o-55296)*1024+(a-56320)+65536}}};if(String.prototype.includes&&"a".includes("a",Infinity)!==false){Z(String.prototype,"includes",Me.includes)}if(String.prototype.startsWith&&String.prototype.endsWith){var xe=i(function(){"/a/".startsWith(/a/)});var Ne=a(function(){return"abc".startsWith("a",Infinity)===false});if(!xe||!Ne){Z(String.prototype,"startsWith",Me.startsWith);Z(String.prototype,"endsWith",Me.endsWith)}}if(Y){var Ae=a(function(){var e=/a/;e[G.match]=false;return"/a/".startsWith(e)});if(!Ae){Z(String.prototype,"startsWith",Me.startsWith)}var Re=a(function(){var e=/a/;e[G.match]=false;return"/a/".endsWith(e)});if(!Re){Z(String.prototype,"endsWith",Me.endsWith)}var _e=a(function(){var e=/a/;e[G.match]=false;return"/a/".includes(e)});if(!_e){Z(String.prototype,"includes",Me.includes)}}b(String.prototype,Me);var ke=[" \n\x0B\f\r \xa0\u1680\u180e\u2000\u2001\u2002\u2003","\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028","\u2029\ufeff"].join("");var Fe=new RegExp("(^["+ke+"]+)|(["+ke+"]+$)","g");var Le=function trim(){return re.ToString(re.RequireObjectCoercible(this)).replace(Fe,"")};var De=["\x85","\u200b","\ufffe"].join("");var ze=new RegExp("["+De+"]","g");var qe=/^[\-+]0x[0-9a-f]+$/i;var We=De.trim().length!==De.length;h(String.prototype,"trim",Le,We);var Ge=function(e){return{value:e,done:arguments.length===0}};var He=function(e){re.RequireObjectCoercible(e);this._s=re.ToString(e);this._i=0};He.prototype.next=function(){var e=this._s;var t=this._i;if(typeof e==="undefined"||t>=e.length){this._s=void 0;return Ge()}var r=e.charCodeAt(t);var n,o;if(r<55296||r>56319||t+1===e.length){o=1}else{n=e.charCodeAt(t+1);o=n<56320||n>57343?1:2}this._i=t+o;return Ge(e.substr(t,o))};we(He.prototype);we(String.prototype,function(){return new He(this)});var Ve={from:function from(e){var r=this;var n;if(arguments.length>1){n=arguments[1]}var o,i;if(typeof n==="undefined"){o=false}else{if(!re.IsCallable(n)){throw new TypeError("Array.from: when provided, the second argument must be a function")}if(arguments.length>2){i=arguments[2]}o=true}var a=typeof(X(e)||re.GetMethod(e,Q))!=="undefined";var u,f,s;if(a){f=re.IsConstructor(r)?Object(new r):[];var c=re.GetIterator(e);var l,p;s=0;while(true){l=re.IteratorStep(c);if(l===false){break}p=l.value;try{if(o){p=typeof i==="undefined"?n(p,s):t(n,i,p,s)}f[s]=p}catch(v){re.IteratorClose(c,true);throw v}s+=1}u=s}else{var y=re.ToObject(e);u=re.ToLength(y.length);f=re.IsConstructor(r)?Object(new r(u)):new Array(u);var h;for(s=0;s<u;++s){h=y[s];if(o){h=typeof i==="undefined"?n(h,s):t(n,i,h,s)}Se(f,s,h)}}f.length=u;return f},of:function of(){var e=arguments.length;var t=this;var n=r(t)||!re.IsCallable(t)?new Array(e):re.Construct(t,[e]);for(var o=0;o<e;++o){Se(n,o,arguments[o])}n.length=e;return n}};b(Array,Ve);me(Array);q=function(e,t){this.i=0;this.array=e;this.kind=t};b(q.prototype,{next:function(){var e=this.i;var t=this.array;if(!(this instanceof q)){throw new TypeError("Not an ArrayIterator")}if(typeof t!=="undefined"){var r=re.ToLength(t.length);for(;e<r;e++){var n=this.kind;var o;if(n==="key"){o=e}else if(n==="value"){o=t[e]}else if(n==="entry"){o=[e,t[e]]}this.i=e+1;return Ge(o)}}this.array=void 0;return Ge()}});we(q.prototype);var Be=Array.of===Ve.of||function(){var e=function Foo(e){this.length=e};e.prototype=[];var t=Array.of.apply(e,[1,2]);return t instanceof e&&t.length===2}();if(!Be){Z(Array,"of",Ve.of)}var $e={copyWithin:function copyWithin(e,t){var r=re.ToObject(this);var n=re.ToLength(r.length);var o=re.ToInteger(e);var i=re.ToInteger(t);var a=o<0?A(n+o,0):R(o,n);var u=i<0?A(n+i,0):R(i,n);var f;if(arguments.length>2){f=arguments[2]}var s=typeof f==="undefined"?n:re.ToInteger(f);var c=s<0?A(n+s,0):R(s,n);var l=R(c-u,n-a);var p=1;if(u<a&&a<u+l){p=-1;u+=l-1;a+=l-1}while(l>0){if(u in r){r[a]=r[u]}else{delete r[a]}u+=p;a+=p;l-=1}return r},fill:function fill(e){var t;if(arguments.length>1){t=arguments[1]}var r;if(arguments.length>2){r=arguments[2]}var n=re.ToObject(this);var o=re.ToLength(n.length);t=re.ToInteger(typeof t==="undefined"?0:t);r=re.ToInteger(typeof r==="undefined"?o:r);var i=t<0?A(o+t,0):R(t,o);var a=r<0?o+r:r;for(var u=i;u<o&&u<a;++u){n[u]=e}return n},find:function find(e){var r=re.ToObject(this);var n=re.ToLength(r.length);if(!re.IsCallable(e)){throw new TypeError("Array#find: predicate must be a function")}var o=arguments.length>1?arguments[1]:null;for(var i=0,a;i<n;i++){a=r[i];if(o){if(t(e,o,a,i,r)){return a}}else if(e(a,i,r)){return a}}},findIndex:function findIndex(e){var r=re.ToObject(this);var n=re.ToLength(r.length);if(!re.IsCallable(e)){throw new TypeError("Array#findIndex: predicate must be a function")}var o=arguments.length>1?arguments[1]:null;for(var i=0;i<n;i++){if(o){if(t(e,o,r[i],i,r)){return i}}else if(e(r[i],i,r)){return i}}return-1},keys:function keys(){return new q(this,"key")},values:function values(){return new q(this,"value")},entries:function entries(){return new q(this,"entry")}};if(Array.prototype.keys&&!re.IsCallable([1].keys().next)){delete Array.prototype.keys}if(Array.prototype.entries&&!re.IsCallable([1].entries().next)){delete Array.prototype.entries}if(Array.prototype.keys&&Array.prototype.entries&&!Array.prototype.values&&Array.prototype[Q]){b(Array.prototype,{values:Array.prototype[Q]});if(K.symbol(G.unscopables)){Array.prototype[G.unscopables].values=true}}if(c&&Array.prototype.values&&Array.prototype.values.name!=="values"){var Ue=Array.prototype.values;Z(Array.prototype,"values",function values(){return re.Call(Ue,this,arguments)});h(Array.prototype,Q,Array.prototype.values,true)}b(Array.prototype,$e);if(1/[true].indexOf(true,-0)<0){h(Array.prototype,"indexOf",function indexOf(e){var t=E(this,arguments);if(t===0&&1/t<0){return 0}return t},true)}we(Array.prototype,function(){return this.values()});if(Object.getPrototypeOf){we(Object.getPrototypeOf([].values()))}var Je=function(){return a(function(){return Array.from({length:-1}).length===0})}();var Xe=function(){var e=Array.from([0].entries());return e.length===1&&r(e[0])&&e[0][0]===0&&e[0][1]===0}();if(!Je||!Xe){Z(Array,"from",Ve.from)}var Ke=function(){return a(function(){return Array.from([0],void 0)})}();if(!Ke){var Ze=Array.from;Z(Array,"from",function from(e){if(arguments.length>1&&typeof arguments[1]!=="undefined"){return re.Call(Ze,this,arguments)}else{return t(Ze,this,e)}})}var Ye=-(Math.pow(2,32)-1);var Qe=function(e,r){var n={length:Ye};n[r?(n.length>>>0)-1:0]=true;return a(function(){t(e,n,function(){throw new RangeError("should not reach here")},[]);return true})};if(!Qe(Array.prototype.forEach)){var et=Array.prototype.forEach;Z(Array.prototype,"forEach",function forEach(e){return re.Call(et,this.length>=0?this:[],arguments)},true)}if(!Qe(Array.prototype.map)){var tt=Array.prototype.map;Z(Array.prototype,"map",function map(e){return re.Call(tt,this.length>=0?this:[],arguments)},true)}if(!Qe(Array.prototype.filter)){var rt=Array.prototype.filter;Z(Array.prototype,"filter",function filter(e){return re.Call(rt,this.length>=0?this:[],arguments)},true)}if(!Qe(Array.prototype.some)){var nt=Array.prototype.some;Z(Array.prototype,"some",function some(e){return re.Call(nt,this.length>=0?this:[],arguments)},true)}if(!Qe(Array.prototype.every)){var ot=Array.prototype.every;Z(Array.prototype,"every",function every(e){return re.Call(ot,this.length>=0?this:[],arguments)},true)}if(!Qe(Array.prototype.reduce)){var it=Array.prototype.reduce;Z(Array.prototype,"reduce",function reduce(e){return re.Call(it,this.length>=0?this:[],arguments)},true)}if(!Qe(Array.prototype.reduceRight,true)){var at=Array.prototype.reduceRight;Z(Array.prototype,"reduceRight",function reduceRight(e){return re.Call(at,this.length>=0?this:[],arguments)},true)}var ut=Number("0o10")!==8;var ft=Number("0b10")!==2;var st=y(De,function(e){return Number(e+0+e)===0});if(ut||ft||st){var ct=Number;var lt=/^0b[01]+$/i;var pt=/^0o[0-7]+$/i;var vt=lt.test.bind(lt);var yt=pt.test.bind(pt);var ht=function(e){var t;if(typeof e.valueOf==="function"){t=e.valueOf();if(K.primitive(t)){return t}}if(typeof e.toString==="function"){t=e.toString();if(K.primitive(t)){return t}}throw new TypeError("No default value")};var bt=ze.test.bind(ze);var gt=qe.test.bind(qe);var dt=function(){var e=function Number(t){var r;if(arguments.length>0){r=K.primitive(t)?t:ht(t,"number")}else{r=0}if(typeof r==="string"){r=re.Call(Le,r);if(vt(r)){r=parseInt(C(r,2),2)}else if(yt(r)){r=parseInt(C(r,2),8)}else if(bt(r)||gt(r)){r=NaN}}var n=this;var o=a(function(){ct.prototype.valueOf.call(n);return true});if(n instanceof e&&!o){return new ct(r)}return ct(r)};return e}();de(ct,dt,{});b(dt,{NaN:ct.NaN,MAX_VALUE:ct.MAX_VALUE,MIN_VALUE:ct.MIN_VALUE,NEGATIVE_INFINITY:ct.NEGATIVE_INFINITY,POSITIVE_INFINITY:ct.POSITIVE_INFINITY});Number=dt;O.redefine(S,"Number",dt)}var Ot=Math.pow(2,53)-1;b(Number,{MAX_SAFE_INTEGER:Ot,MIN_SAFE_INTEGER:-Ot,EPSILON:2.220446049250313e-16,parseInt:S.parseInt,parseFloat:S.parseFloat,isFinite:B,isInteger:function isInteger(e){return B(e)&&re.ToInteger(e)===e},isSafeInteger:function isSafeInteger(e){return Number.isInteger(e)&&k(e)<=Number.MAX_SAFE_INTEGER},isNaN:V});h(Number,"parseInt",S.parseInt,Number.parseInt!==S.parseInt);if(![,1].find(function(e,t){return t===0})){Z(Array.prototype,"find",$e.find)}if([,1].findIndex(function(e,t){return t===0})!==0){Z(Array.prototype,"findIndex",$e.findIndex)}var mt=Function.bind.call(Function.bind,Object.prototype.propertyIsEnumerable);var wt=function ensureEnumerable(e,t){if(s&&mt(e,t)){Object.defineProperty(e,t,{enumerable:false})}};var jt=function sliceArgs(){var e=Number(this);var t=arguments.length;var r=t-e;var n=new Array(r<0?0:r);for(var o=e;o<t;++o){n[o-e]=arguments[o]}return n};var St=function assignTo(e){return function assignToSource(t,r){t[r]=e[r];return t}};var Tt=function(e,t){var r=n(Object(t));var o;if(re.IsCallable(Object.getOwnPropertySymbols)){o=v(Object.getOwnPropertySymbols(Object(t)),mt(t))}return p(P(r,o||[]),St(t),e)};var It={assign:function(e,t){var r=re.ToObject(e,"Cannot convert undefined or null to object");return p(re.Call(jt,1,arguments),Tt,r)},is:function is(e,t){return re.SameValue(e,t)}};var Et=Object.assign&&Object.preventExtensions&&function(){var e=Object.preventExtensions({1:2});try{Object.assign(e,"xy")}catch(t){return e[1]==="y"}}();if(Et){Z(Object,"assign",It.assign)}b(Object,It);if(s){var Pt={setPrototypeOf:function(e,r){var n;var o=function(e,t){if(!re.TypeIsObject(e)){throw new TypeError("cannot set prototype on a non-object")}if(!(t===null||re.TypeIsObject(t))){throw new TypeError("can only set prototype to an object or null"+t)}};var i=function(e,r){o(e,r);t(n,e,r);return e};try{n=e.getOwnPropertyDescriptor(e.prototype,r).set;t(n,{},null)}catch(a){if(e.prototype!=={}[r]){return}n=function(e){this[r]=e};i.polyfill=i(i({},null),e.prototype)instanceof e}return i}(Object,"__proto__")};b(Object,Pt)}if(Object.setPrototypeOf&&Object.getPrototypeOf&&Object.getPrototypeOf(Object.setPrototypeOf({},null))!==null&&Object.getPrototypeOf(Object.create(null))===null){(function(){var e=Object.create(null);var t=Object.getPrototypeOf;var r=Object.setPrototypeOf;Object.getPrototypeOf=function(r){var n=t(r);return n===e?null:n};Object.setPrototypeOf=function(t,n){var o=n===null?e:n;return r(t,o)};Object.setPrototypeOf.polyfill=false})()}var Ct=!i(function(){Object.keys("foo")});if(!Ct){var Mt=Object.keys;Z(Object,"keys",function keys(e){return Mt(re.ToObject(e))});n=Object.keys}var xt=i(function(){Object.keys(/a/g)});if(xt){var Nt=Object.keys;Z(Object,"keys",function keys(e){if(K.regex(e)){var t=[];for(var r in e){if(z(e,r)){M(t,r)}}return t}return Nt(e)});n=Object.keys}if(Object.getOwnPropertyNames){var At=!i(function(){Object.getOwnPropertyNames("foo")});if(!At){var Rt=typeof window==="object"?Object.getOwnPropertyNames(window):[];var _t=Object.getOwnPropertyNames;Z(Object,"getOwnPropertyNames",function getOwnPropertyNames(e){var t=re.ToObject(e);if(g(t)==="[object Window]"){try{return _t(t)}catch(r){return P([],Rt)}}return _t(t)})}}if(Object.getOwnPropertyDescriptor){var kt=!i(function(){Object.getOwnPropertyDescriptor("foo","bar")});if(!kt){var Ft=Object.getOwnPropertyDescriptor;Z(Object,"getOwnPropertyDescriptor",function getOwnPropertyDescriptor(e,t){return Ft(re.ToObject(e),t)})}}if(Object.seal){var Lt=!i(function(){Object.seal("foo")});if(!Lt){var Dt=Object.seal;Z(Object,"seal",function seal(e){if(!re.TypeIsObject(e)){return e}return Dt(e)})}}if(Object.isSealed){var zt=!i(function(){Object.isSealed("foo")});if(!zt){var qt=Object.isSealed;Z(Object,"isSealed",function isSealed(e){if(!re.TypeIsObject(e)){return true}return qt(e)})}}if(Object.freeze){var Wt=!i(function(){Object.freeze("foo")});if(!Wt){var Gt=Object.freeze;Z(Object,"freeze",function freeze(e){if(!re.TypeIsObject(e)){return e}return Gt(e)})}}if(Object.isFrozen){var Ht=!i(function(){Object.isFrozen("foo")});if(!Ht){var Vt=Object.isFrozen;Z(Object,"isFrozen",function isFrozen(e){if(!re.TypeIsObject(e)){return true}return Vt(e)})}}if(Object.preventExtensions){var Bt=!i(function(){Object.preventExtensions("foo")});if(!Bt){var $t=Object.preventExtensions;Z(Object,"preventExtensions",function preventExtensions(e){if(!re.TypeIsObject(e)){return e}return $t(e)})}}if(Object.isExtensible){var Ut=!i(function(){Object.isExtensible("foo")});if(!Ut){var Jt=Object.isExtensible;Z(Object,"isExtensible",function isExtensible(e){if(!re.TypeIsObject(e)){return false}return Jt(e)})}}if(Object.getPrototypeOf){var Xt=!i(function(){Object.getPrototypeOf("foo")});if(!Xt){var Kt=Object.getPrototypeOf;Z(Object,"getPrototypeOf",function getPrototypeOf(e){return Kt(re.ToObject(e))})}}var Zt=s&&function(){var e=Object.getOwnPropertyDescriptor(RegExp.prototype,"flags");return e&&re.IsCallable(e.get)}();if(s&&!Zt){var Yt=function flags(){if(!re.TypeIsObject(this)){throw new TypeError("Method called on incompatible type: must be an object.")}var e="";if(this.global){e+="g"}if(this.ignoreCase){e+="i"}if(this.multiline){e+="m"}if(this.unicode){e+="u"}if(this.sticky){e+="y"}return e};O.getter(RegExp.prototype,"flags",Yt)}var Qt=s&&a(function(){return String(new RegExp(/a/g,"i"))==="/a/i"});var er=Y&&s&&function(){var e=/./;e[G.match]=false;return RegExp(e)===e}();var tr=a(function(){return RegExp.prototype.toString.call({source:"abc"})==="/abc/"});var rr=tr&&a(function(){return RegExp.prototype.toString.call({source:"a",flags:"b"})==="/a/b"});if(!tr||!rr){var nr=RegExp.prototype.toString;h(RegExp.prototype,"toString",function toString(){var e=re.RequireObjectCoercible(this);if(K.regex(e)){return t(nr,e)}var r=te(e.source);var n=te(e.flags);return"/"+r+"/"+n},true);O.preserveToString(RegExp.prototype.toString,nr)}if(s&&(!Qt||er)){var or=Object.getOwnPropertyDescriptor(RegExp.prototype,"flags").get;var ir=Object.getOwnPropertyDescriptor(RegExp.prototype,"source")||{};var ar=function(){return this.source};var ur=re.IsCallable(ir.get)?ir.get:ar;var fr=RegExp;var sr=function(){return function RegExp(e,t){var r=re.IsRegExp(e);var n=this instanceof RegExp;if(!n&&r&&typeof t==="undefined"&&e.constructor===RegExp){return e}var o=e;var i=t;if(K.regex(e)){o=re.Call(ur,e);i=typeof t==="undefined"?re.Call(or,e):t;return new RegExp(o,i)}else if(r){o=e.source;i=typeof t==="undefined"?e.flags:t}return new fr(e,t)}}();de(fr,sr,{$input:true});RegExp=sr;O.redefine(S,"RegExp",sr)}if(s){var cr={input:"$_",lastMatch:"$&",lastParen:"$+",leftContext:"$`",rightContext:"$'"};l(n(cr),function(e){if(e in RegExp&&!(cr[e]in RegExp)){O.getter(RegExp,cr[e],function get(){return RegExp[e]})}})}me(RegExp);var lr=1/Number.EPSILON;var pr=function roundTiesToEven(e){return e+lr-lr};var vr=Math.pow(2,-23);var yr=Math.pow(2,127)*(2-vr);var hr=Math.pow(2,-126);var br=Math.E;var gr=Math.LOG2E;var dr=Math.LOG10E;var Or=Number.prototype.clz;delete Number.prototype.clz;var mr={acosh:function acosh(e){var t=Number(e);if(V(t)||e<1){return NaN}if(t===1){return 0}if(t===Infinity){return t}return L(t/br+D(t+1)*D(t-1)/br)+1},asinh:function asinh(e){var t=Number(e);if(t===0||!T(t)){return t}return t<0?-asinh(-t):L(t+D(t*t+1))},atanh:function atanh(e){var t=Number(e);if(V(t)||t<-1||t>1){return NaN}if(t===-1){return-Infinity}if(t===1){return Infinity}if(t===0){return t}return.5*L((1+t)/(1-t))},cbrt:function cbrt(e){var t=Number(e);if(t===0){return t}var r=t<0;var n;if(r){t=-t}if(t===Infinity){n=Infinity}else{n=F(L(t)/3);n=(t/(n*n)+2*n)/3}return r?-n:n},clz32:function clz32(e){var t=Number(e);var r=re.ToUint32(t);if(r===0){return 32}return Or?re.Call(Or,r):31-_(L(r+.5)*gr)},cosh:function cosh(e){var t=Number(e);if(t===0){return 1}if(V(t)){return NaN}if(!T(t)){return Infinity}if(t<0){t=-t}if(t>21){return F(t)/2}return(F(t)+F(-t))/2},expm1:function expm1(e){var t=Number(e);if(t===-Infinity){return-1}if(!T(t)||t===0){return t}if(k(t)>.5){return F(t)-1}var r=t;var n=0;var o=1;while(n+r!==n){n+=r;o+=1;r*=t/o}return n},hypot:function hypot(e,t){var r=0;var n=0;for(var o=0;o<arguments.length;++o){var i=k(Number(arguments[o]));if(n<i){r*=n/i*(n/i);r+=1;n=i}else{r+=i>0?i/n*(i/n):i}}return n===Infinity?Infinity:n*D(r)},log2:function log2(e){return L(e)*gr},log10:function log10(e){return L(e)*dr},log1p:function log1p(e){var t=Number(e);if(t<-1||V(t)){return NaN}if(t===0||t===Infinity){return t}if(t===-1){return-Infinity}return 1+t-1===0?t:t*(L(1+t)/(1+t-1))},sign:$,sinh:function sinh(e){var t=Number(e);if(!T(t)||t===0){return t}if(k(t)<1){return(Math.expm1(t)-Math.expm1(-t))/2}return(F(t-1)-F(-t-1))*br/2},tanh:function tanh(e){var t=Number(e);if(V(t)||t===0){return t}if(t>=20){return 1}if(t<=-20){return-1}return(Math.expm1(t)-Math.expm1(-t))/(F(t)+F(-t))},trunc:function trunc(e){var t=Number(e);return t<0?-_(-t):_(t)},imul:function imul(e,t){var r=re.ToUint32(e);var n=re.ToUint32(t);var o=r>>>16&65535;var i=r&65535;var a=n>>>16&65535;var u=n&65535;return i*u+(o*u+i*a<<16>>>0)|0},fround:function fround(e){var t=Number(e);if(t===0||t===Infinity||t===-Infinity||V(t)){return t}var r=$(t);var n=k(t);if(n<hr){return r*pr(n/hr/vr)*hr*vr}var o=(1+vr/Number.EPSILON)*n;var i=o-(o-n);if(i>yr||V(i)){return r*Infinity}return r*i}};b(Math,mr);h(Math,"log1p",mr.log1p,Math.log1p(-1e-17)!==-1e-17);h(Math,"asinh",mr.asinh,Math.asinh(-1e7)!==-Math.asinh(1e7));h(Math,"tanh",mr.tanh,Math.tanh(-2e-17)!==-2e-17);h(Math,"acosh",mr.acosh,Math.acosh(Number.MAX_VALUE)===Infinity);h(Math,"cbrt",mr.cbrt,Math.abs(1-Math.cbrt(1e-300)/1e-100)/Number.EPSILON>8);h(Math,"sinh",mr.sinh,Math.sinh(-2e-17)!==-2e-17);var wr=Math.expm1(10);h(Math,"expm1",mr.expm1,wr>22025.465794806718||wr<22025.465794806718);var jr=Math.round;var Sr=Math.round(.5-Number.EPSILON/4)===0&&Math.round(-.5+Number.EPSILON/3.99)===1;var Tr=lr+1;var Ir=2*lr-1;var Er=[Tr,Ir].every(function(e){return Math.round(e)===e});h(Math,"round",function round(e){var t=_(e);var r=t===-1?-0:t+1;return e-t<.5?t:r},!Sr||!Er);O.preserveToString(Math.round,jr);var Pr=Math.imul;if(Math.imul(4294967295,5)!==-5){Math.imul=mr.imul;O.preserveToString(Math.imul,Pr)}if(Math.imul.length!==2){Z(Math,"imul",function imul(e,t){return re.Call(Pr,Math,arguments); +})}var Cr=function(){var e=S.setTimeout;if(typeof e!=="function"&&typeof e!=="object"){return}re.IsPromise=function(e){if(!re.TypeIsObject(e)){return false}if(typeof e._promise==="undefined"){return false}return true};var r=function(e){if(!re.IsConstructor(e)){throw new TypeError("Bad promise constructor")}var t=this;var r=function(e,r){if(t.resolve!==void 0||t.reject!==void 0){throw new TypeError("Bad Promise implementation!")}t.resolve=e;t.reject=r};t.resolve=void 0;t.reject=void 0;t.promise=new e(r);if(!(re.IsCallable(t.resolve)&&re.IsCallable(t.reject))){throw new TypeError("Bad promise constructor")}};var n;if(typeof window!=="undefined"&&re.IsCallable(window.postMessage)){n=function(){var e=[];var t="zero-timeout-message";var r=function(r){M(e,r);window.postMessage(t,"*")};var n=function(r){if(r.source===window&&r.data===t){r.stopPropagation();if(e.length===0){return}var n=N(e);n()}};window.addEventListener("message",n,true);return r}}var o=function(){var e=S.Promise;var t=e&&e.resolve&&e.resolve();return t&&function(e){return t.then(e)}};var i=re.IsCallable(S.setImmediate)?S.setImmediate:typeof process==="object"&&process.nextTick?process.nextTick:o()||(re.IsCallable(n)?n():function(t){e(t,0)});var a=function(e){return e};var u=function(e){throw e};var f=0;var s=1;var c=2;var l=0;var p=1;var v=2;var y={};var h=function(e,t,r){i(function(){g(e,t,r)})};var g=function(e,t,r){var n,o;if(t===y){return e(r)}try{n=e(r);o=t.resolve}catch(i){n=i;o=t.reject}o(n)};var d=function(e,t){var r=e._promise;var n=r.reactionLength;if(n>0){h(r.fulfillReactionHandler0,r.reactionCapability0,t);r.fulfillReactionHandler0=void 0;r.rejectReactions0=void 0;r.reactionCapability0=void 0;if(n>1){for(var o=1,i=0;o<n;o++,i+=3){h(r[i+l],r[i+v],t);e[i+l]=void 0;e[i+p]=void 0;e[i+v]=void 0}}}r.result=t;r.state=s;r.reactionLength=0};var O=function(e,t){var r=e._promise;var n=r.reactionLength;if(n>0){h(r.rejectReactionHandler0,r.reactionCapability0,t);r.fulfillReactionHandler0=void 0;r.rejectReactions0=void 0;r.reactionCapability0=void 0;if(n>1){for(var o=1,i=0;o<n;o++,i+=3){h(r[i+p],r[i+v],t);e[i+l]=void 0;e[i+p]=void 0;e[i+v]=void 0}}}r.result=t;r.state=c;r.reactionLength=0};var m=function(e){var t=false;var r=function(r){var n;if(t){return}t=true;if(r===e){return O(e,new TypeError("Self resolution"))}if(!re.TypeIsObject(r)){return d(e,r)}try{n=r.then}catch(o){return O(e,o)}if(!re.IsCallable(n)){return d(e,r)}i(function(){j(e,r,n)})};var n=function(r){if(t){return}t=true;return O(e,r)};return{resolve:r,reject:n}};var w=function(e,r,n,o){if(e===I){t(e,r,n,o,y)}else{t(e,r,n,o)}};var j=function(e,t,r){var n=m(e);var o=n.resolve;var i=n.reject;try{w(r,t,o,i)}catch(a){i(a)}};var T,I;var E=function(){var e=function Promise(t){if(!(this instanceof e)){throw new TypeError('Constructor Promise requires "new"')}if(this&&this._promise){throw new TypeError("Bad construction")}if(!re.IsCallable(t)){throw new TypeError("not a valid resolver")}var r=Te(this,e,T,{_promise:{result:void 0,state:f,reactionLength:0,fulfillReactionHandler0:void 0,rejectReactionHandler0:void 0,reactionCapability0:void 0}});var n=m(r);var o=n.reject;try{t(n.resolve,o)}catch(i){o(i)}return r};return e}();T=E.prototype;var P=function(e,t,r,n){var o=false;return function(i){if(o){return}o=true;t[e]=i;if(--n.count===0){var a=r.resolve;a(t)}}};var C=function(e,t,r){var n=e.iterator;var o=[];var i={count:1};var a,u;var f=0;while(true){try{a=re.IteratorStep(n);if(a===false){e.done=true;break}u=a.value}catch(s){e.done=true;throw s}o[f]=void 0;var c=t.resolve(u);var l=P(f,o,r,i);i.count+=1;w(c.then,c,l,r.reject);f+=1}if(--i.count===0){var p=r.resolve;p(o)}return r.promise};var x=function(e,t,r){var n=e.iterator;var o,i,a;while(true){try{o=re.IteratorStep(n);if(o===false){e.done=true;break}i=o.value}catch(u){e.done=true;throw u}a=t.resolve(i);w(a.then,a,r.resolve,r.reject)}return r.promise};b(E,{all:function all(e){var t=this;if(!re.TypeIsObject(t)){throw new TypeError("Promise is not object")}var n=new r(t);var o,i;try{o=re.GetIterator(e);i={iterator:o,done:false};return C(i,t,n)}catch(a){var u=a;if(i&&!i.done){try{re.IteratorClose(o,true)}catch(f){u=f}}var s=n.reject;s(u);return n.promise}},race:function race(e){var t=this;if(!re.TypeIsObject(t)){throw new TypeError("Promise is not object")}var n=new r(t);var o,i;try{o=re.GetIterator(e);i={iterator:o,done:false};return x(i,t,n)}catch(a){var u=a;if(i&&!i.done){try{re.IteratorClose(o,true)}catch(f){u=f}}var s=n.reject;s(u);return n.promise}},reject:function reject(e){var t=this;if(!re.TypeIsObject(t)){throw new TypeError("Bad promise constructor")}var n=new r(t);var o=n.reject;o(e);return n.promise},resolve:function resolve(e){var t=this;if(!re.TypeIsObject(t)){throw new TypeError("Bad promise constructor")}if(re.IsPromise(e)){var n=e.constructor;if(n===t){return e}}var o=new r(t);var i=o.resolve;i(e);return o.promise}});b(T,{"catch":function(e){return this.then(null,e)},then:function then(e,t){var n=this;if(!re.IsPromise(n)){throw new TypeError("not a promise")}var o=re.SpeciesConstructor(n,E);var i;var b=arguments.length>2&&arguments[2]===y;if(b&&o===E){i=y}else{i=new r(o)}var g=re.IsCallable(e)?e:a;var d=re.IsCallable(t)?t:u;var O=n._promise;var m;if(O.state===f){if(O.reactionLength===0){O.fulfillReactionHandler0=g;O.rejectReactionHandler0=d;O.reactionCapability0=i}else{var w=3*(O.reactionLength-1);O[w+l]=g;O[w+p]=d;O[w+v]=i}O.reactionLength+=1}else if(O.state===s){m=O.result;h(g,i,m)}else if(O.state===c){m=O.result;h(d,i,m)}else{throw new TypeError("unexpected Promise state")}return i.promise}});y=new r(E);I=T.then;return E}();if(S.Promise){delete S.Promise.accept;delete S.Promise.defer;delete S.Promise.prototype.chain}if(typeof Cr==="function"){b(S,{Promise:Cr});var Mr=w(S.Promise,function(e){return e.resolve(42).then(function(){})instanceof e});var xr=!i(function(){S.Promise.reject(42).then(null,5).then(null,W)});var Nr=i(function(){S.Promise.call(3,W)});var Ar=function(e){var t=e.resolve(5);t.constructor={};var r=e.resolve(t);try{r.then(null,W).then(null,W)}catch(n){return true}return t===r}(S.Promise);var Rr=s&&function(){var e=0;var t=Object.defineProperty({},"then",{get:function(){e+=1}});Promise.resolve(t);return e===1}();var _r=function BadResolverPromise(e){var t=new Promise(e);e(3,function(){});this.then=t.then;this.constructor=BadResolverPromise};_r.prototype=Promise.prototype;_r.all=Promise.all;var kr=a(function(){return!!_r.all([1,2])});if(!Mr||!xr||!Nr||Ar||!Rr||kr){Promise=Cr;Z(S,"Promise",Cr)}if(Promise.all.length!==1){var Fr=Promise.all;Z(Promise,"all",function all(e){return re.Call(Fr,this,arguments)})}if(Promise.race.length!==1){var Lr=Promise.race;Z(Promise,"race",function race(e){return re.Call(Lr,this,arguments)})}if(Promise.resolve.length!==1){var Dr=Promise.resolve;Z(Promise,"resolve",function resolve(e){return re.Call(Dr,this,arguments)})}if(Promise.reject.length!==1){var zr=Promise.reject;Z(Promise,"reject",function reject(e){return re.Call(zr,this,arguments)})}wt(Promise,"all");wt(Promise,"race");wt(Promise,"resolve");wt(Promise,"reject");me(Promise)}var qr=function(e){var t=n(p(e,function(e,t){e[t]=true;return e},{}));return e.join(":")===t.join(":")};var Wr=qr(["z","a","bb"]);var Gr=qr(["z",1,"a","3",2]);if(s){var Hr=function fastkey(e){if(!Wr){return null}if(typeof e==="undefined"||e===null){return"^"+re.ToString(e)}else if(typeof e==="string"){return"$"+e}else if(typeof e==="number"){if(!Gr){return"n"+e}return e}else if(typeof e==="boolean"){return"b"+e}return null};var Vr=function emptyObject(){return Object.create?Object.create(null):{}};var Br=function addIterableToMap(e,n,o){if(r(o)||K.string(o)){l(o,function(e){if(!re.TypeIsObject(e)){throw new TypeError("Iterator value "+e+" is not an entry object")}n.set(e[0],e[1])})}else if(o instanceof e){t(e.prototype.forEach,o,function(e,t){n.set(t,e)})}else{var i,a;if(o!==null&&typeof o!=="undefined"){a=n.set;if(!re.IsCallable(a)){throw new TypeError("bad map")}i=re.GetIterator(o)}if(typeof i!=="undefined"){while(true){var u=re.IteratorStep(i);if(u===false){break}var f=u.value;try{if(!re.TypeIsObject(f)){throw new TypeError("Iterator value "+f+" is not an entry object")}t(a,n,f[0],f[1])}catch(s){re.IteratorClose(i,true);throw s}}}}};var $r=function addIterableToSet(e,n,o){if(r(o)||K.string(o)){l(o,function(e){n.add(e)})}else if(o instanceof e){t(e.prototype.forEach,o,function(e){n.add(e)})}else{var i,a;if(o!==null&&typeof o!=="undefined"){a=n.add;if(!re.IsCallable(a)){throw new TypeError("bad set")}i=re.GetIterator(o)}if(typeof i!=="undefined"){while(true){var u=re.IteratorStep(i);if(u===false){break}var f=u.value;try{t(a,n,f)}catch(s){re.IteratorClose(i,true);throw s}}}}};var Ur={Map:function(){var e={};var r=function MapEntry(e,t){this.key=e;this.value=t;this.next=null;this.prev=null};r.prototype.isRemoved=function isRemoved(){return this.key===e};var n=function isMap(e){return!!e._es6map};var o=function requireMapSlot(e,t){if(!re.TypeIsObject(e)||!n(e)){throw new TypeError("Method Map.prototype."+t+" called on incompatible receiver "+re.ToString(e))}};var i=function MapIterator(e,t){o(e,"[[MapIterator]]");this.head=e._head;this.i=this.head;this.kind=t};i.prototype={next:function next(){var e=this.i;var t=this.kind;var r=this.head;if(typeof this.i==="undefined"){return Ge()}while(e.isRemoved()&&e!==r){e=e.prev}var n;while(e.next!==r){e=e.next;if(!e.isRemoved()){if(t==="key"){n=e.key}else if(t==="value"){n=e.value}else{n=[e.key,e.value]}this.i=e;return Ge(n)}}this.i=void 0;return Ge()}};we(i.prototype);var a;var u=function Map(){if(!(this instanceof Map)){throw new TypeError('Constructor Map requires "new"')}if(this&&this._es6map){throw new TypeError("Bad construction")}var e=Te(this,Map,a,{_es6map:true,_head:null,_storage:Vr(),_size:0});var t=new r(null,null);t.next=t.prev=t;e._head=t;if(arguments.length>0){Br(Map,e,arguments[0])}return e};a=u.prototype;O.getter(a,"size",function(){if(typeof this._size==="undefined"){throw new TypeError("size method called on incompatible Map")}return this._size});b(a,{get:function get(e){o(this,"get");var t=Hr(e);if(t!==null){var r=this._storage[t];if(r){return r.value}else{return}}var n=this._head;var i=n;while((i=i.next)!==n){if(re.SameValueZero(i.key,e)){return i.value}}},has:function has(e){o(this,"has");var t=Hr(e);if(t!==null){return typeof this._storage[t]!=="undefined"}var r=this._head;var n=r;while((n=n.next)!==r){if(re.SameValueZero(n.key,e)){return true}}return false},set:function set(e,t){o(this,"set");var n=this._head;var i=n;var a;var u=Hr(e);if(u!==null){if(typeof this._storage[u]!=="undefined"){this._storage[u].value=t;return this}else{a=this._storage[u]=new r(e,t);i=n.prev}}while((i=i.next)!==n){if(re.SameValueZero(i.key,e)){i.value=t;return this}}a=a||new r(e,t);if(re.SameValue(-0,e)){a.key=+0}a.next=this._head;a.prev=this._head.prev;a.prev.next=a;a.next.prev=a;this._size+=1;return this},"delete":function(t){o(this,"delete");var r=this._head;var n=r;var i=Hr(t);if(i!==null){if(typeof this._storage[i]==="undefined"){return false}n=this._storage[i].prev;delete this._storage[i]}while((n=n.next)!==r){if(re.SameValueZero(n.key,t)){n.key=n.value=e;n.prev.next=n.next;n.next.prev=n.prev;this._size-=1;return true}}return false},clear:function clear(){o(this,"clear");this._size=0;this._storage=Vr();var t=this._head;var r=t;var n=r.next;while((r=n)!==t){r.key=r.value=e;n=r.next;r.next=r.prev=t}t.next=t.prev=t},keys:function keys(){o(this,"keys");return new i(this,"key")},values:function values(){o(this,"values");return new i(this,"value")},entries:function entries(){o(this,"entries");return new i(this,"key+value")},forEach:function forEach(e){o(this,"forEach");var r=arguments.length>1?arguments[1]:null;var n=this.entries();for(var i=n.next();!i.done;i=n.next()){if(r){t(e,r,i.value[1],i.value[0],this)}else{e(i.value[1],i.value[0],this)}}}});we(a,a.entries);return u}(),Set:function(){var e=function isSet(e){return e._es6set&&typeof e._storage!=="undefined"};var r=function requireSetSlot(t,r){if(!re.TypeIsObject(t)||!e(t)){throw new TypeError("Set.prototype."+r+" called on incompatible receiver "+re.ToString(t))}};var o;var i=function Set(){if(!(this instanceof Set)){throw new TypeError('Constructor Set requires "new"')}if(this&&this._es6set){throw new TypeError("Bad construction")}var e=Te(this,Set,o,{_es6set:true,"[[SetData]]":null,_storage:Vr()});if(!e._es6set){throw new TypeError("bad set")}if(arguments.length>0){$r(Set,e,arguments[0])}return e};o=i.prototype;var a=function(e){var t=e;if(t==="^null"){return null}else if(t==="^undefined"){return void 0}else{var r=t.charAt(0);if(r==="$"){return C(t,1)}else if(r==="n"){return+C(t,1)}else if(r==="b"){return t==="btrue"}}return+t};var u=function ensureMap(e){if(!e["[[SetData]]"]){var t=e["[[SetData]]"]=new Ur.Map;l(n(e._storage),function(e){var r=a(e);t.set(r,r)});e["[[SetData]]"]=t}e._storage=null};O.getter(i.prototype,"size",function(){r(this,"size");if(this._storage){return n(this._storage).length}u(this);return this["[[SetData]]"].size});b(i.prototype,{has:function has(e){r(this,"has");var t;if(this._storage&&(t=Hr(e))!==null){return!!this._storage[t]}u(this);return this["[[SetData]]"].has(e)},add:function add(e){r(this,"add");var t;if(this._storage&&(t=Hr(e))!==null){this._storage[t]=true;return this}u(this);this["[[SetData]]"].set(e,e);return this},"delete":function(e){r(this,"delete");var t;if(this._storage&&(t=Hr(e))!==null){var n=z(this._storage,t);return delete this._storage[t]&&n}u(this);return this["[[SetData]]"]["delete"](e)},clear:function clear(){r(this,"clear");if(this._storage){this._storage=Vr()}if(this["[[SetData]]"]){this["[[SetData]]"].clear()}},values:function values(){r(this,"values");u(this);return this["[[SetData]]"].values()},entries:function entries(){r(this,"entries");u(this);return this["[[SetData]]"].entries()},forEach:function forEach(e){r(this,"forEach");var n=arguments.length>1?arguments[1]:null;var o=this;u(o);this["[[SetData]]"].forEach(function(r,i){if(n){t(e,n,i,i,o)}else{e(i,i,o)}})}});h(i.prototype,"keys",i.prototype.values,true);we(i.prototype,i.prototype.values);return i}()};if(S.Map||S.Set){var Jr=a(function(){return new Map([[1,2]]).get(1)===2});if(!Jr){var Xr=S.Map;S.Map=function Map(){if(!(this instanceof Map)){throw new TypeError('Constructor Map requires "new"')}var e=new Xr;if(arguments.length>0){Br(Map,e,arguments[0])}delete e.constructor;Object.setPrototypeOf(e,S.Map.prototype);return e};S.Map.prototype=m(Xr.prototype);h(S.Map.prototype,"constructor",S.Map,true);O.preserveToString(S.Map,Xr)}var Kr=new Map;var Zr=function(){var e=new Map([[1,0],[2,0],[3,0],[4,0]]);e.set(-0,e);return e.get(0)===e&&e.get(-0)===e&&e.has(0)&&e.has(-0)}();var Yr=Kr.set(1,2)===Kr;if(!Zr||!Yr){var Qr=Map.prototype.set;Z(Map.prototype,"set",function set(e,r){t(Qr,this,e===0?0:e,r);return this})}if(!Zr){var en=Map.prototype.get;var tn=Map.prototype.has;b(Map.prototype,{get:function get(e){return t(en,this,e===0?0:e)},has:function has(e){return t(tn,this,e===0?0:e)}},true);O.preserveToString(Map.prototype.get,en);O.preserveToString(Map.prototype.has,tn)}var rn=new Set;var nn=function(e){e["delete"](0);e.add(-0);return!e.has(0)}(rn);var on=rn.add(1)===rn;if(!nn||!on){var an=Set.prototype.add;Set.prototype.add=function add(e){t(an,this,e===0?0:e);return this};O.preserveToString(Set.prototype.add,an)}if(!nn){var un=Set.prototype.has;Set.prototype.has=function has(e){return t(un,this,e===0?0:e)};O.preserveToString(Set.prototype.has,un);var fn=Set.prototype["delete"];Set.prototype["delete"]=function SetDelete(e){return t(fn,this,e===0?0:e)};O.preserveToString(Set.prototype["delete"],fn)}var sn=w(S.Map,function(e){var t=new e([]);t.set(42,42);return t instanceof e});var cn=Object.setPrototypeOf&&!sn;var ln=function(){try{return!(S.Map()instanceof S.Map)}catch(e){return e instanceof TypeError}}();if(S.Map.length!==0||cn||!ln){var pn=S.Map;S.Map=function Map(){if(!(this instanceof Map)){throw new TypeError('Constructor Map requires "new"')}var e=new pn;if(arguments.length>0){Br(Map,e,arguments[0])}delete e.constructor;Object.setPrototypeOf(e,Map.prototype);return e};S.Map.prototype=pn.prototype;h(S.Map.prototype,"constructor",S.Map,true);O.preserveToString(S.Map,pn)}var vn=w(S.Set,function(e){var t=new e([]);t.add(42,42);return t instanceof e});var yn=Object.setPrototypeOf&&!vn;var hn=function(){try{return!(S.Set()instanceof S.Set)}catch(e){return e instanceof TypeError}}();if(S.Set.length!==0||yn||!hn){var bn=S.Set;S.Set=function Set(){if(!(this instanceof Set)){throw new TypeError('Constructor Set requires "new"')}var e=new bn;if(arguments.length>0){$r(Set,e,arguments[0])}delete e.constructor;Object.setPrototypeOf(e,Set.prototype);return e};S.Set.prototype=bn.prototype;h(S.Set.prototype,"constructor",S.Set,true);O.preserveToString(S.Set,bn)}var gn=new S.Map;var dn=!a(function(){return gn.keys().next().done});if(typeof S.Map.prototype.clear!=="function"||(new S.Set).size!==0||gn.size!==0||typeof S.Map.prototype.keys!=="function"||typeof S.Set.prototype.keys!=="function"||typeof S.Map.prototype.forEach!=="function"||typeof S.Set.prototype.forEach!=="function"||u(S.Map)||u(S.Set)||typeof gn.keys().next!=="function"||dn||!sn){b(S,{Map:Ur.Map,Set:Ur.Set},true)}if(S.Set.prototype.keys!==S.Set.prototype.values){h(S.Set.prototype,"keys",S.Set.prototype.values,true)}we(Object.getPrototypeOf((new S.Map).keys()));we(Object.getPrototypeOf((new S.Set).keys()));if(c&&S.Set.prototype.has.name!=="has"){var On=S.Set.prototype.has;Z(S.Set.prototype,"has",function has(e){return t(On,this,e)})}}b(S,Ur);me(S.Map);me(S.Set)}var mn=function throwUnlessTargetIsObject(e){if(!re.TypeIsObject(e)){throw new TypeError("target must be an object")}};var wn={apply:function apply(){return re.Call(re.Call,null,arguments)},construct:function construct(e,t){if(!re.IsConstructor(e)){throw new TypeError("First argument must be a constructor.")}var r=arguments.length>2?arguments[2]:e;if(!re.IsConstructor(r)){throw new TypeError("new.target must be a constructor.")}return re.Construct(e,t,r,"internal")},deleteProperty:function deleteProperty(e,t){mn(e);if(s){var r=Object.getOwnPropertyDescriptor(e,t);if(r&&!r.configurable){return false}}return delete e[t]},has:function has(e,t){mn(e);return t in e}};if(Object.getOwnPropertyNames){Object.assign(wn,{ownKeys:function ownKeys(e){mn(e);var t=Object.getOwnPropertyNames(e);if(re.IsCallable(Object.getOwnPropertySymbols)){x(t,Object.getOwnPropertySymbols(e))}return t}})}var jn=function ConvertExceptionToBoolean(e){return!i(e)};if(Object.preventExtensions){Object.assign(wn,{isExtensible:function isExtensible(e){mn(e);return Object.isExtensible(e)},preventExtensions:function preventExtensions(e){mn(e);return jn(function(){Object.preventExtensions(e)})}})}if(s){var Sn=function get(e,t,r){var n=Object.getOwnPropertyDescriptor(e,t);if(!n){var o=Object.getPrototypeOf(e);if(o===null){return void 0}return Sn(o,t,r)}if("value"in n){return n.value}if(n.get){return re.Call(n.get,r)}return void 0};var Tn=function set(e,r,n,o){var i=Object.getOwnPropertyDescriptor(e,r);if(!i){var a=Object.getPrototypeOf(e);if(a!==null){return Tn(a,r,n,o)}i={value:void 0,writable:true,enumerable:true,configurable:true}}if("value"in i){if(!i.writable){return false}if(!re.TypeIsObject(o)){return false}var u=Object.getOwnPropertyDescriptor(o,r);if(u){return ee.defineProperty(o,r,{value:n})}else{return ee.defineProperty(o,r,{value:n,writable:true,enumerable:true,configurable:true})}}if(i.set){t(i.set,o,n);return true}return false};Object.assign(wn,{defineProperty:function defineProperty(e,t,r){mn(e);return jn(function(){Object.defineProperty(e,t,r)})},getOwnPropertyDescriptor:function getOwnPropertyDescriptor(e,t){mn(e);return Object.getOwnPropertyDescriptor(e,t)},get:function get(e,t){mn(e);var r=arguments.length>2?arguments[2]:e;return Sn(e,t,r)},set:function set(e,t,r){mn(e);var n=arguments.length>3?arguments[3]:e;return Tn(e,t,r,n)}})}if(Object.getPrototypeOf){var In=Object.getPrototypeOf;wn.getPrototypeOf=function getPrototypeOf(e){mn(e);return In(e)}}if(Object.setPrototypeOf&&wn.getPrototypeOf){var En=function(e,t){var r=t;while(r){if(e===r){return true}r=wn.getPrototypeOf(r)}return false};Object.assign(wn,{setPrototypeOf:function setPrototypeOf(e,t){mn(e);if(t!==null&&!re.TypeIsObject(t)){throw new TypeError("proto must be an object or null")}if(t===ee.getPrototypeOf(e)){return true}if(ee.isExtensible&&!ee.isExtensible(e)){return false}if(En(e,t)){return false}Object.setPrototypeOf(e,t);return true}})}var Pn=function(e,t){if(!re.IsCallable(S.Reflect[e])){h(S.Reflect,e,t)}else{var r=a(function(){S.Reflect[e](1);S.Reflect[e](NaN);S.Reflect[e](true);return true});if(r){Z(S.Reflect,e,t)}}};Object.keys(wn).forEach(function(e){Pn(e,wn[e])});var Cn=S.Reflect.getPrototypeOf;if(c&&Cn&&Cn.name!=="getPrototypeOf"){Z(S.Reflect,"getPrototypeOf",function getPrototypeOf(e){return t(Cn,S.Reflect,e)})}if(S.Reflect.setPrototypeOf){if(a(function(){S.Reflect.setPrototypeOf(1,{});return true})){Z(S.Reflect,"setPrototypeOf",wn.setPrototypeOf)}}if(S.Reflect.defineProperty){if(!a(function(){var e=!S.Reflect.defineProperty(1,"test",{value:1});var t=typeof Object.preventExtensions!=="function"||!S.Reflect.defineProperty(Object.preventExtensions({}),"test",{});return e&&t})){Z(S.Reflect,"defineProperty",wn.defineProperty)}}if(S.Reflect.construct){if(!a(function(){var e=function F(){};return S.Reflect.construct(function(){},[],e)instanceof e})){Z(S.Reflect,"construct",wn.construct)}}if(String(new Date(NaN))!=="Invalid Date"){var Mn=Date.prototype.toString;var xn=function toString(){var e=+this;if(e!==e){return"Invalid Date"}return re.Call(Mn,this)};Z(Date.prototype,"toString",xn)}var Nn={anchor:function anchor(e){return re.CreateHTML(this,"a","name",e)},big:function big(){return re.CreateHTML(this,"big","","")},blink:function blink(){return re.CreateHTML(this,"blink","","")},bold:function bold(){return re.CreateHTML(this,"b","","")},fixed:function fixed(){return re.CreateHTML(this,"tt","","")},fontcolor:function fontcolor(e){return re.CreateHTML(this,"font","color",e)},fontsize:function fontsize(e){return re.CreateHTML(this,"font","size",e)},italics:function italics(){return re.CreateHTML(this,"i","","")},link:function link(e){return re.CreateHTML(this,"a","href",e)},small:function small(){return re.CreateHTML(this,"small","","")},strike:function strike(){return re.CreateHTML(this,"strike","","")},sub:function sub(){return re.CreateHTML(this,"sub","","")},sup:function sub(){return re.CreateHTML(this,"sup","","")}};l(Object.keys(Nn),function(e){var r=String.prototype[e];var n=false;if(re.IsCallable(r)){var o=t(r,"",' " ');var i=P([],o.match(/"/g)).length;n=o!==o.toLowerCase()||i>2}else{n=true}if(n){Z(String.prototype,e,Nn[e])}});var An=function(){if(!Y){return false}var e=typeof JSON==="object"&&typeof JSON.stringify==="function"?JSON.stringify:null;if(!e){return false}if(typeof e(G())!=="undefined"){return true}if(e([G()])!=="[null]"){return true}var t={a:G()};t[G()]=true;if(e(t)!=="{}"){return true}return false}();var Rn=a(function(){if(!Y){return true}return JSON.stringify(Object(G()))==="{}"&&JSON.stringify([Object(G())])==="[{}]"});if(An||!Rn){var _n=JSON.stringify;Z(JSON,"stringify",function stringify(e){if(typeof e==="symbol"){return}var n;if(arguments.length>1){n=arguments[1]}var o=[e];if(!r(n)){var i=re.IsCallable(n)?n:null;var a=function(e,r){var n=i?t(i,this,e,r):r;if(typeof n!=="symbol"){if(K.symbol(n)){return St({})(n)}else{return n}}};o.push(a)}else{o.push(n)}if(arguments.length>2){o.push(arguments[2])}return _n.apply(this,o)})}return S}); +//# sourceMappingURL=es6-shim.map +/** +* @preserve HTML5 Shiv 3.7.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.2",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b)}(this,document);/* MediaMatch v.2.0.2 - Testing css media queries in Javascript. Authors & copyright (c) 2013: WebLinc, David Knight. */ + +window.matchMedia||(window.matchMedia=function(c){var a=c.document,w=a.documentElement,l=[],t=0,x="",h={},G=/\s*(only|not)?\s*(screen|print|[a-z\-]+)\s*(and)?\s*/i,H=/^\s*\(\s*(-[a-z]+-)?(min-|max-)?([a-z\-]+)\s*(:?\s*([0-9]+(\.[0-9]+)?|portrait|landscape)(px|em|dppx|dpcm|rem|%|in|cm|mm|ex|pt|pc|\/([0-9]+(\.[0-9]+)?))?)?\s*\)\s*$/,y=0,A=function(b){var z=-1!==b.indexOf(",")&&b.split(",")||[b],e=z.length-1,j=e,g=null,d=null,c="",a=0,l=!1,m="",f="",g=null,d=0,f=null,k="",p="",q="",n="",r="",k=!1;if(""=== +b)return!0;do{g=z[j-e];l=!1;if(d=g.match(G))c=d[0],a=d.index;if(!d||-1===g.substring(0,a).indexOf("(")&&(a||!d[3]&&c!==d.input))k=!1;else{f=g;l="not"===d[1];a||(m=d[2],f=g.substring(c.length));k=m===x||"all"===m||""===m;g=-1!==f.indexOf(" and ")&&f.split(" and ")||[f];d=g.length-1;if(k&&0<=d&&""!==f){do{f=g[d].match(H);if(!f||!h[f[3]]){k=!1;break}k=f[2];n=p=f[5];q=f[7];r=h[f[3]];q&&(n="px"===q?Number(p):"em"===q||"rem"===q?16*p:f[8]?(p/f[8]).toFixed(2):"dppx"===q?96*p:"dpcm"===q?0.3937*p:Number(p)); +k="min-"===k&&n?r>=n:"max-"===k&&n?r<=n:n?r===n:!!r;if(!k)break}while(d--)}if(k)break}}while(e--);return l?!k:k},B=function(){var b=c.innerWidth||w.clientWidth,a=c.innerHeight||w.clientHeight,e=c.screen.width,j=c.screen.height,g=c.screen.colorDepth,d=c.devicePixelRatio;h.width=b;h.height=a;h["aspect-ratio"]=(b/a).toFixed(2);h["device-width"]=e;h["device-height"]=j;h["device-aspect-ratio"]=(e/j).toFixed(2);h.color=g;h["color-index"]=Math.pow(2,g);h.orientation=a>=b?"portrait":"landscape";h.resolution= +d&&96*d||c.screen.deviceXDPI||96;h["device-pixel-ratio"]=d||1},C=function(){clearTimeout(y);y=setTimeout(function(){var b=null,a=t-1,e=a,j=!1;if(0<=a){B();do if(b=l[e-a])if((j=A(b.mql.media))&&!b.mql.matches||!j&&b.mql.matches)if(b.mql.matches=j,b.listeners)for(var j=0,g=b.listeners.length;j<g;j++)b.listeners[j]&&b.listeners[j].call(c,b.mql);while(a--)}},10)},D=a.getElementsByTagName("head")[0],a=a.createElement("style"),E=null,u="screen print speech projection handheld tv braille embossed tty".split(" "), +m=0,I=u.length,s="#mediamatchjs { position: relative; z-index: 0; }",v="",F=c.addEventListener||(v="on")&&c.attachEvent;a.type="text/css";a.id="mediamatchjs";D.appendChild(a);for(E=c.getComputedStyle&&c.getComputedStyle(a)||a.currentStyle;m<I;m++)s+="@media "+u[m]+" { #mediamatchjs { position: relative; z-index: "+m+" } }";a.styleSheet?a.styleSheet.cssText=s:a.textContent=s;x=u[1*E.zIndex||0];D.removeChild(a);B();F(v+"resize",C);F(v+"orientationchange",C);return function(a){var c=t,e={matches:!1, +media:a,addListener:function(a){l[c].listeners||(l[c].listeners=[]);a&&l[c].listeners.push(a)},removeListener:function(a){var b=l[c],d=0,e=0;if(b)for(e=b.listeners.length;d<e;d++)b.listeners[d]===a&&b.listeners.splice(d,1)}};if(""===a)return e.matches=!0,e;e.matches=A(a);t=l.push({mql:e,listeners:null});return e}}(window)); \ No newline at end of file diff --git a/cyclone-web/vendor/polyfill/media.match.min.js b/cyclone-web/vendor/polyfill/media.match.min.js new file mode 100644 index 0000000000000000000000000000000000000000..e666b1216ff8aadbee7752300d4c0bbf2846f533 --- /dev/null +++ b/cyclone-web/vendor/polyfill/media.match.min.js @@ -0,0 +1,8 @@ +/*! MediaMatch v.2.0.2 - Testing css media queries in Javascript. Authors & copyright (c) 2013: WebLinc, David Knight. */ + +window.matchMedia||(window.matchMedia=function(c){var a=c.document,w=a.documentElement,l=[],t=0,x="",h={},G=/\s*(only|not)?\s*(screen|print|[a-z\-]+)\s*(and)?\s*/i,H=/^\s*\(\s*(-[a-z]+-)?(min-|max-)?([a-z\-]+)\s*(:?\s*([0-9]+(\.[0-9]+)?|portrait|landscape)(px|em|dppx|dpcm|rem|%|in|cm|mm|ex|pt|pc|\/([0-9]+(\.[0-9]+)?))?)?\s*\)\s*$/,y=0,A=function(b){var z=-1!==b.indexOf(",")&&b.split(",")||[b],e=z.length-1,j=e,g=null,d=null,c="",a=0,l=!1,m="",f="",g=null,d=0,f=null,k="",p="",q="",n="",r="",k=!1;if(""=== +b)return!0;do{g=z[j-e];l=!1;if(d=g.match(G))c=d[0],a=d.index;if(!d||-1===g.substring(0,a).indexOf("(")&&(a||!d[3]&&c!==d.input))k=!1;else{f=g;l="not"===d[1];a||(m=d[2],f=g.substring(c.length));k=m===x||"all"===m||""===m;g=-1!==f.indexOf(" and ")&&f.split(" and ")||[f];d=g.length-1;if(k&&0<=d&&""!==f){do{f=g[d].match(H);if(!f||!h[f[3]]){k=!1;break}k=f[2];n=p=f[5];q=f[7];r=h[f[3]];q&&(n="px"===q?Number(p):"em"===q||"rem"===q?16*p:f[8]?(p/f[8]).toFixed(2):"dppx"===q?96*p:"dpcm"===q?0.3937*p:Number(p)); +k="min-"===k&&n?r>=n:"max-"===k&&n?r<=n:n?r===n:!!r;if(!k)break}while(d--)}if(k)break}}while(e--);return l?!k:k},B=function(){var b=c.innerWidth||w.clientWidth,a=c.innerHeight||w.clientHeight,e=c.screen.width,j=c.screen.height,g=c.screen.colorDepth,d=c.devicePixelRatio;h.width=b;h.height=a;h["aspect-ratio"]=(b/a).toFixed(2);h["device-width"]=e;h["device-height"]=j;h["device-aspect-ratio"]=(e/j).toFixed(2);h.color=g;h["color-index"]=Math.pow(2,g);h.orientation=a>=b?"portrait":"landscape";h.resolution= +d&&96*d||c.screen.deviceXDPI||96;h["device-pixel-ratio"]=d||1},C=function(){clearTimeout(y);y=setTimeout(function(){var b=null,a=t-1,e=a,j=!1;if(0<=a){B();do if(b=l[e-a])if((j=A(b.mql.media))&&!b.mql.matches||!j&&b.mql.matches)if(b.mql.matches=j,b.listeners)for(var j=0,g=b.listeners.length;j<g;j++)b.listeners[j]&&b.listeners[j].call(c,b.mql);while(a--)}},10)},D=a.getElementsByTagName("head")[0],a=a.createElement("style"),E=null,u="screen print speech projection handheld tv braille embossed tty".split(" "), +m=0,I=u.length,s="#mediamatchjs { position: relative; z-index: 0; }",v="",F=c.addEventListener||(v="on")&&c.attachEvent;a.type="text/css";a.id="mediamatchjs";D.appendChild(a);for(E=c.getComputedStyle&&c.getComputedStyle(a)||a.currentStyle;m<I;m++)s+="@media "+u[m]+" { #mediamatchjs { position: relative; z-index: "+m+" } }";a.styleSheet?a.styleSheet.cssText=s:a.textContent=s;x=u[1*E.zIndex||0];D.removeChild(a);B();F(v+"resize",C);F(v+"orientationchange",C);return function(a){var c=t,e={matches:!1, +media:a,addListener:function(a){l[c].listeners||(l[c].listeners=[]);a&&l[c].listeners.push(a)},removeListener:function(a){var b=l[c],d=0,e=0;if(b)for(e=b.listeners.length;d<e;d++)b.listeners[d]===a&&b.listeners.splice(d,1)}};if(""===a)return e.matches=!0,e;e.matches=A(a);t=l.push({mql:e,listeners:null});return e}}(window)); \ No newline at end of file diff --git a/cyclone-web/vendor/react/react.min.js b/cyclone-web/vendor/react/react.min.js new file mode 100644 index 0000000000000000000000000000000000000000..d6a844b0ca78d0c50ba35b58f7c651d1511876d6 --- /dev/null +++ b/cyclone-web/vendor/react/react.min.js @@ -0,0 +1,12 @@ +/** + * React v15.5.4 + * + * Copyright 2013-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + * + */ +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.React=t()}}(function(){return function t(e,n,r){function o(u,a){if(!n[u]){if(!e[u]){var s="function"==typeof require&&require;if(!a&&s)return s(u,!0);if(i)return i(u,!0);var c=new Error("Cannot find module '"+u+"'");throw c.code="MODULE_NOT_FOUND",c}var l=n[u]={exports:{}};e[u][0].call(l.exports,function(t){var n=e[u][1][t];return o(n||t)},l,l.exports,t,e,n,r)}return n[u].exports}for(var i="function"==typeof require&&require,u=0;u<r.length;u++)o(r[u]);return o}({1:[function(t,e,n){"use strict";function r(t){var e={"=":"=0",":":"=2"};return"$"+(""+t).replace(/[=:]/g,function(t){return e[t]})}function o(t){var e={"=0":"=","=2":":"};return(""+("."===t[0]&&"$"===t[1]?t.substring(2):t.substring(1))).replace(/(=0|=2)/g,function(t){return e[t]})}var i={escape:r,unescape:o};e.exports=i},{}],2:[function(t,e,n){"use strict";var r=t(20),o=(t(24),function(t){var e=this;if(e.instancePool.length){var n=e.instancePool.pop();return e.call(n,t),n}return new e(t)}),i=function(t,e){var n=this;if(n.instancePool.length){var r=n.instancePool.pop();return n.call(r,t,e),r}return new n(t,e)},u=function(t,e,n){var r=this;if(r.instancePool.length){var o=r.instancePool.pop();return r.call(o,t,e,n),o}return new r(t,e,n)},a=function(t,e,n,r){var o=this;if(o.instancePool.length){var i=o.instancePool.pop();return o.call(i,t,e,n,r),i}return new o(t,e,n,r)},s=function(t){var e=this;t instanceof e||r("25"),t.destructor(),e.instancePool.length<e.poolSize&&e.instancePool.push(t)},c=o,l=function(t,e){var n=t;return n.instancePool=[],n.getPooled=e||c,n.poolSize||(n.poolSize=10),n.release=s,n},f={addPoolingTo:l,oneArgumentPooler:o,twoArgumentPooler:i,threeArgumentPooler:u,fourArgumentPooler:a};e.exports=f},{20:20,24:24}],3:[function(t,e,n){"use strict";var r=t(26),o=t(4),i=t(6),u=t(14),a=t(5),s=t(8),c=t(9),l=t(13),f=t(16),p=t(19),d=(t(25),c.createElement),y=c.createFactory,h=c.cloneElement,v=r,m={Children:{map:o.map,forEach:o.forEach,count:o.count,toArray:o.toArray,only:p},Component:i,PureComponent:u,createElement:d,cloneElement:h,isValidElement:c.isValidElement,PropTypes:l,createClass:a.createClass,createFactory:y,createMixin:function(t){return t},DOM:s,version:f,__spread:v};e.exports=m},{13:13,14:14,16:16,19:19,25:25,26:26,4:4,5:5,6:6,8:8,9:9}],4:[function(t,e,n){"use strict";function r(t){return(""+t).replace(E,"$&/")}function o(t,e){this.func=t,this.context=e,this.count=0}function i(t,e,n){var r=t.func,o=t.context;r.call(o,e,t.count++)}function u(t,e,n){if(null==t)return t;var r=o.getPooled(e,n);m(t,i,r),o.release(r)}function a(t,e,n,r){this.result=t,this.keyPrefix=e,this.func=n,this.context=r,this.count=0}function s(t,e,n){var o=t.result,i=t.keyPrefix,u=t.func,a=t.context,s=u.call(a,e,t.count++);Array.isArray(s)?c(s,o,n,v.thatReturnsArgument):null!=s&&(h.isValidElement(s)&&(s=h.cloneAndReplaceKey(s,i+(!s.key||e&&e.key===s.key?"":r(s.key)+"/")+n)),o.push(s))}function c(t,e,n,o,i){var u="";null!=n&&(u=r(n)+"/");var c=a.getPooled(e,u,o,i);m(t,s,c),a.release(c)}function l(t,e,n){if(null==t)return t;var r=[];return c(t,r,null,e,n),r}function f(t,e,n){return null}function p(t,e){return m(t,f,null)}function d(t){var e=[];return c(t,e,null,v.thatReturnsArgument),e}var y=t(2),h=t(9),v=t(22),m=t(21),b=y.twoArgumentPooler,g=y.fourArgumentPooler,E=/\/+/g;o.prototype.destructor=function(){this.func=null,this.context=null,this.count=0},y.addPoolingTo(o,b),a.prototype.destructor=function(){this.result=null,this.keyPrefix=null,this.func=null,this.context=null,this.count=0},y.addPoolingTo(a,g);var x={forEach:u,map:l,mapIntoWithKeyPrefixInternal:c,count:p,toArray:d};e.exports=x},{2:2,21:21,22:22,9:9}],5:[function(t,e,n){"use strict";function r(t){return t}function o(t,e){var n=E.hasOwnProperty(e)?E[e]:null;_.hasOwnProperty(e)&&"OVERRIDE_BASE"!==n&&p("73",e),t&&"DEFINE_MANY"!==n&&"DEFINE_MANY_MERGED"!==n&&p("74",e)}function i(t,e){if(e){"function"==typeof e&&p("75"),h.isValidElement(e)&&p("76");var n=t.prototype,r=n.__reactAutoBindPairs;e.hasOwnProperty(b)&&x.mixins(t,e.mixins);for(var i in e)if(e.hasOwnProperty(i)&&i!==b){var u=e[i],a=n.hasOwnProperty(i);if(o(a,i),x.hasOwnProperty(i))x[i](t,u);else{var l=E.hasOwnProperty(i),f="function"==typeof u,d=f&&!l&&!a&&!1!==e.autobind;if(d)r.push(i,u),n[i]=u;else if(a){var y=E[i];(!l||"DEFINE_MANY_MERGED"!==y&&"DEFINE_MANY"!==y)&&p("77",y,i),"DEFINE_MANY_MERGED"===y?n[i]=s(n[i],u):"DEFINE_MANY"===y&&(n[i]=c(n[i],u))}else n[i]=u}}}}function u(t,e){if(e)for(var n in e){var r=e[n];if(e.hasOwnProperty(n)){var o=n in x;o&&p("78",n);var i=n in t;i&&p("79",n),t[n]=r}}}function a(t,e){t&&e&&"object"==typeof t&&"object"==typeof e||p("80");for(var n in e)e.hasOwnProperty(n)&&(void 0!==t[n]&&p("81",n),t[n]=e[n]);return t}function s(t,e){return function(){var n=t.apply(this,arguments),r=e.apply(this,arguments);if(null==n)return r;if(null==r)return n;var o={};return a(o,n),a(o,r),o}}function c(t,e){return function(){t.apply(this,arguments),e.apply(this,arguments)}}function l(t,e){return e.bind(t)}function f(t){for(var e=t.__reactAutoBindPairs,n=0;n<e.length;n+=2){var r=e[n],o=e[n+1];t[r]=l(t,o)}}var p=t(20),d=t(26),y=t(6),h=t(9),v=(t(12),t(11)),m=t(23),b=(t(24),t(25),"mixins"),g=[],E={mixins:"DEFINE_MANY",statics:"DEFINE_MANY",propTypes:"DEFINE_MANY",contextTypes:"DEFINE_MANY",childContextTypes:"DEFINE_MANY",getDefaultProps:"DEFINE_MANY_MERGED",getInitialState:"DEFINE_MANY_MERGED",getChildContext:"DEFINE_MANY_MERGED",render:"DEFINE_ONCE",componentWillMount:"DEFINE_MANY",componentDidMount:"DEFINE_MANY",componentWillReceiveProps:"DEFINE_MANY",shouldComponentUpdate:"DEFINE_ONCE",componentWillUpdate:"DEFINE_MANY",componentDidUpdate:"DEFINE_MANY",componentWillUnmount:"DEFINE_MANY",updateComponent:"OVERRIDE_BASE"},x={displayName:function(t,e){t.displayName=e},mixins:function(t,e){if(e)for(var n=0;n<e.length;n++)i(t,e[n])},childContextTypes:function(t,e){t.childContextTypes=d({},t.childContextTypes,e)},contextTypes:function(t,e){t.contextTypes=d({},t.contextTypes,e)},getDefaultProps:function(t,e){t.getDefaultProps?t.getDefaultProps=s(t.getDefaultProps,e):t.getDefaultProps=e},propTypes:function(t,e){t.propTypes=d({},t.propTypes,e)},statics:function(t,e){u(t,e)},autobind:function(){}},_={replaceState:function(t,e){this.updater.enqueueReplaceState(this,t),e&&this.updater.enqueueCallback(this,e,"replaceState")},isMounted:function(){return this.updater.isMounted(this)}},P=function(){};d(P.prototype,y.prototype,_);var w={createClass:function(t){var e=r(function(t,n,r){this.__reactAutoBindPairs.length&&f(this),this.props=t,this.context=n,this.refs=m,this.updater=r||v,this.state=null;var o=this.getInitialState?this.getInitialState():null;("object"!=typeof o||Array.isArray(o))&&p("82",e.displayName||"ReactCompositeComponent"),this.state=o});e.prototype=new P,e.prototype.constructor=e,e.prototype.__reactAutoBindPairs=[],g.forEach(i.bind(null,e)),i(e,t),e.getDefaultProps&&(e.defaultProps=e.getDefaultProps()),e.prototype.render||p("83");for(var n in E)e.prototype[n]||(e.prototype[n]=null);return e},injection:{injectMixin:function(t){g.push(t)}}};e.exports=w},{11:11,12:12,20:20,23:23,24:24,25:25,26:26,6:6,9:9}],6:[function(t,e,n){"use strict";function r(t,e,n){this.props=t,this.context=e,this.refs=u,this.updater=n||i}var o=t(20),i=t(11),u=(t(17),t(23));t(24),t(25);r.prototype.isReactComponent={},r.prototype.setState=function(t,e){"object"!=typeof t&&"function"!=typeof t&&null!=t&&o("85"),this.updater.enqueueSetState(this,t),e&&this.updater.enqueueCallback(this,e,"setState")},r.prototype.forceUpdate=function(t){this.updater.enqueueForceUpdate(this),t&&this.updater.enqueueCallback(this,t,"forceUpdate")};e.exports=r},{11:11,17:17,20:20,23:23,24:24,25:25}],7:[function(t,e,n){"use strict";var r={current:null};e.exports=r},{}],8:[function(t,e,n){"use strict";var r=t(9),o=r.createFactory,i={a:o("a"),abbr:o("abbr"),address:o("address"),area:o("area"),article:o("article"),aside:o("aside"),audio:o("audio"),b:o("b"),base:o("base"),bdi:o("bdi"),bdo:o("bdo"),big:o("big"),blockquote:o("blockquote"),body:o("body"),br:o("br"),button:o("button"),canvas:o("canvas"),caption:o("caption"),cite:o("cite"),code:o("code"),col:o("col"),colgroup:o("colgroup"),data:o("data"),datalist:o("datalist"),dd:o("dd"),del:o("del"),details:o("details"),dfn:o("dfn"),dialog:o("dialog"),div:o("div"),dl:o("dl"),dt:o("dt"),em:o("em"),embed:o("embed"),fieldset:o("fieldset"),figcaption:o("figcaption"),figure:o("figure"),footer:o("footer"),form:o("form"),h1:o("h1"),h2:o("h2"),h3:o("h3"),h4:o("h4"),h5:o("h5"),h6:o("h6"),head:o("head"),header:o("header"),hgroup:o("hgroup"),hr:o("hr"),html:o("html"),i:o("i"),iframe:o("iframe"),img:o("img"),input:o("input"),ins:o("ins"),kbd:o("kbd"),keygen:o("keygen"),label:o("label"),legend:o("legend"),li:o("li"),link:o("link"),main:o("main"),map:o("map"),mark:o("mark"),menu:o("menu"),menuitem:o("menuitem"),meta:o("meta"),meter:o("meter"),nav:o("nav"),noscript:o("noscript"),object:o("object"),ol:o("ol"),optgroup:o("optgroup"),option:o("option"),output:o("output"),p:o("p"),param:o("param"),picture:o("picture"),pre:o("pre"),progress:o("progress"),q:o("q"),rp:o("rp"),rt:o("rt"),ruby:o("ruby"),s:o("s"),samp:o("samp"),script:o("script"),section:o("section"),select:o("select"),small:o("small"),source:o("source"),span:o("span"),strong:o("strong"),style:o("style"),sub:o("sub"),summary:o("summary"),sup:o("sup"),table:o("table"),tbody:o("tbody"),td:o("td"),textarea:o("textarea"),tfoot:o("tfoot"),th:o("th"),thead:o("thead"),time:o("time"),title:o("title"),tr:o("tr"),track:o("track"),u:o("u"),ul:o("ul"),var:o("var"),video:o("video"),wbr:o("wbr"),circle:o("circle"),clipPath:o("clipPath"),defs:o("defs"),ellipse:o("ellipse"),g:o("g"),image:o("image"),line:o("line"),linearGradient:o("linearGradient"),mask:o("mask"),path:o("path"),pattern:o("pattern"),polygon:o("polygon"),polyline:o("polyline"),radialGradient:o("radialGradient"),rect:o("rect"),stop:o("stop"),svg:o("svg"),text:o("text"),tspan:o("tspan")};e.exports=i},{9:9}],9:[function(t,e,n){"use strict";function r(t){return void 0!==t.ref}function o(t){return void 0!==t.key}var i=t(26),u=t(7),a=(t(25),t(17),Object.prototype.hasOwnProperty),s=t(10),c={key:!0,ref:!0,__self:!0,__source:!0},l=function(t,e,n,r,o,i,u){return{$$typeof:s,type:t,key:e,ref:n,props:u,_owner:i}};l.createElement=function(t,e,n){var i,s={},f=null,p=null;if(null!=e){r(e)&&(p=e.ref),o(e)&&(f=""+e.key),void 0===e.__self?null:e.__self,void 0===e.__source?null:e.__source;for(i in e)a.call(e,i)&&!c.hasOwnProperty(i)&&(s[i]=e[i])}var d=arguments.length-2;if(1===d)s.children=n;else if(d>1){for(var y=Array(d),h=0;h<d;h++)y[h]=arguments[h+2];s.children=y}if(t&&t.defaultProps){var v=t.defaultProps;for(i in v)void 0===s[i]&&(s[i]=v[i])}return l(t,f,p,0,0,u.current,s)},l.createFactory=function(t){var e=l.createElement.bind(null,t);return e.type=t,e},l.cloneAndReplaceKey=function(t,e){return l(t.type,e,t.ref,t._self,t._source,t._owner,t.props)},l.cloneElement=function(t,e,n){var s,f=i({},t.props),p=t.key,d=t.ref,y=(t._self,t._source,t._owner);if(null!=e){r(e)&&(d=e.ref,y=u.current),o(e)&&(p=""+e.key);var h;t.type&&t.type.defaultProps&&(h=t.type.defaultProps);for(s in e)a.call(e,s)&&!c.hasOwnProperty(s)&&(void 0===e[s]&&void 0!==h?f[s]=h[s]:f[s]=e[s])}var v=arguments.length-2;if(1===v)f.children=n;else if(v>1){for(var m=Array(v),b=0;b<v;b++)m[b]=arguments[b+2];f.children=m}return l(t.type,p,d,0,0,y,f)},l.isValidElement=function(t){return"object"==typeof t&&null!==t&&t.$$typeof===s},e.exports=l},{10:10,17:17,25:25,26:26,7:7}],10:[function(t,e,n){"use strict";var r="function"==typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103;e.exports=r},{}],11:[function(t,e,n){"use strict";var r=(t(25),{isMounted:function(t){return!1},enqueueCallback:function(t,e){},enqueueForceUpdate:function(t){},enqueueReplaceState:function(t,e){},enqueueSetState:function(t,e){}});e.exports=r},{25:25}],12:[function(t,e,n){"use strict";var r={};e.exports=r},{}],13:[function(t,e,n){"use strict";var r=t(9),o=r.isValidElement,i=t(28);e.exports=i(o)},{28:28,9:9}],14:[function(t,e,n){"use strict";function r(t,e,n){this.props=t,this.context=e,this.refs=s,this.updater=n||a}function o(){}var i=t(26),u=t(6),a=t(11),s=t(23);o.prototype=u.prototype,r.prototype=new o,r.prototype.constructor=r,i(r.prototype,u.prototype),r.prototype.isPureReactComponent=!0,e.exports=r},{11:11,23:23,26:26,6:6}],15:[function(t,e,n){"use strict";var r=t(26),o=t(3),i=r(o,{__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{ReactCurrentOwner:t(7)}});e.exports=i},{26:26,3:3,7:7}],16:[function(t,e,n){"use strict";e.exports="15.5.4"},{}],17:[function(t,e,n){"use strict";e.exports=!1},{}],18:[function(t,e,n){"use strict";function r(t){var e=t&&(o&&t[o]||t[i]);if("function"==typeof e)return e}var o="function"==typeof Symbol&&Symbol.iterator,i="@@iterator";e.exports=r},{}],19:[function(t,e,n){"use strict";function r(t){return i.isValidElement(t)||o("143"),t}var o=t(20),i=t(9);t(24);e.exports=r},{20:20,24:24,9:9}],20:[function(t,e,n){"use strict";function r(t){for(var e=arguments.length-1,n="Minified React error #"+t+"; visit http://facebook.github.io/react/docs/error-decoder.html?invariant="+t,r=0;r<e;r++)n+="&args[]="+encodeURIComponent(arguments[r+1]);n+=" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.";var o=new Error(n);throw o.name="Invariant Violation",o.framesToPop=1,o}e.exports=r},{}],21:[function(t,e,n){"use strict";function r(t,e){return t&&"object"==typeof t&&null!=t.key?c.escape(t.key):e.toString(36)}function o(t,e,n,i){var p=typeof t;if("undefined"!==p&&"boolean"!==p||(t=null),null===t||"string"===p||"number"===p||"object"===p&&t.$$typeof===a)return n(i,t,""===e?l+r(t,0):e),1;var d,y,h=0,v=""===e?l:e+f;if(Array.isArray(t))for(var m=0;m<t.length;m++)d=t[m],y=v+r(d,m),h+=o(d,y,n,i);else{var b=s(t);if(b){var g,E=b.call(t);if(b!==t.entries)for(var x=0;!(g=E.next()).done;)d=g.value,y=v+r(d,x++),h+=o(d,y,n,i);else for(;!(g=E.next()).done;){var _=g.value;_&&(d=_[1],y=v+c.escape(_[0])+f+r(d,0),h+=o(d,y,n,i))}}else if("object"===p){var P=String(t);u("31","[object Object]"===P?"object with keys {"+Object.keys(t).join(", ")+"}":P,"")}}return h}function i(t,e,n){return null==t?0:o(t,"",e,n)}var u=t(20),a=(t(7),t(10)),s=t(18),c=(t(24),t(1)),l=(t(25),"."),f=":";e.exports=i},{1:1,10:10,18:18,20:20,24:24,25:25,7:7}],22:[function(t,e,n){"use strict";function r(t){return function(){return t}}var o=function(){};o.thatReturns=r,o.thatReturnsFalse=r(!1),o.thatReturnsTrue=r(!0),o.thatReturnsNull=r(null),o.thatReturnsThis=function(){return this},o.thatReturnsArgument=function(t){return t},e.exports=o},{}],23:[function(t,e,n){"use strict";var r={};e.exports=r},{}],24:[function(t,e,n){"use strict";function r(t,e,n,r,i,u,a,s){if(o(e),!t){var c;if(void 0===e)c=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var l=[n,r,i,u,a,s],f=0;c=new Error(e.replace(/%s/g,function(){return l[f++]})),c.name="Invariant Violation"}throw c.framesToPop=1,c}}var o=function(t){};e.exports=r},{}],25:[function(t,e,n){"use strict";var r=t(22),o=r;e.exports=o},{22:22}],26:[function(t,e,n){"use strict";function r(t){if(null===t||void 0===t)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(t)}var o=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,u=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var t=new String("abc");if(t[5]="de","5"===Object.getOwnPropertyNames(t)[0])return!1;for(var e={},n=0;n<10;n++)e["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(e).map(function(t){return e[t]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(t){r[t]=t}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(t){return!1}}()?Object.assign:function(t,e){for(var n,a,s=r(t),c=1;c<arguments.length;c++){n=Object(arguments[c]);for(var l in n)i.call(n,l)&&(s[l]=n[l]);if(o){a=o(n);for(var f=0;f<a.length;f++)u.call(n,a[f])&&(s[a[f]]=n[a[f]])}}return s}},{}],27:[function(t,e,n){"use strict";function r(t,e,n,r,o){}e.exports=r},{24:24,25:25,30:30}],28:[function(t,e,n){"use strict";var r=t(29);e.exports=function(t){return r(t,!1)}},{29:29}],29:[function(t,e,n){"use strict";var r=t(22),o=t(24),i=(t(25),t(30)),u=t(27);e.exports=function(t,e){function n(t){var e=t&&(_&&t[_]||t[P]);if("function"==typeof e)return e}function a(t,e){return t===e?0!==t||1/t==1/e:t!==t&&e!==e}function s(t){this.message=t,this.stack=""}function c(t){function n(n,r,u,a,c,l,f){if(a=a||w,l=l||u,f!==i)if(e)o(!1,"Calling PropTypes validators directly is not supported by the `prop-types` package. Use `PropTypes.checkPropTypes()` to call them. Read more at http://fb.me/use-check-prop-types");else;return null==r[u]?n?new s(null===r[u]?"The "+c+" `"+l+"` is marked as required in `"+a+"`, but its value is `null`.":"The "+c+" `"+l+"` is marked as required in `"+a+"`, but its value is `undefined`."):null:t(r,u,a,c,l)}var r=n.bind(null,!1);return r.isRequired=n.bind(null,!0),r}function l(t){function e(e,n,r,o,i,u){var a=e[n];if(g(a)!==t)return new s("Invalid "+o+" `"+i+"` of type `"+E(a)+"` supplied to `"+r+"`, expected `"+t+"`.");return null}return c(e)}function f(t){function e(e,n,r,o,u){if("function"!=typeof t)return new s("Property `"+u+"` of component `"+r+"` has invalid PropType notation inside arrayOf.");var a=e[n];if(!Array.isArray(a)){return new s("Invalid "+o+" `"+u+"` of type `"+g(a)+"` supplied to `"+r+"`, expected an array.")}for(var c=0;c<a.length;c++){var l=t(a,c,r,o,u+"["+c+"]",i);if(l instanceof Error)return l}return null}return c(e)}function p(t){function e(e,n,r,o,i){if(!(e[n]instanceof t)){var u=t.name||w;return new s("Invalid "+o+" `"+i+"` of type `"+x(e[n])+"` supplied to `"+r+"`, expected instance of `"+u+"`.")}return null}return c(e)}function d(t){function e(e,n,r,o,i){for(var u=e[n],c=0;c<t.length;c++)if(a(u,t[c]))return null;return new s("Invalid "+o+" `"+i+"` of value `"+u+"` supplied to `"+r+"`, expected one of "+JSON.stringify(t)+".")}return Array.isArray(t)?c(e):r.thatReturnsNull}function y(t){function e(e,n,r,o,u){if("function"!=typeof t)return new s("Property `"+u+"` of component `"+r+"` has invalid PropType notation inside objectOf.");var a=e[n],c=g(a);if("object"!==c)return new s("Invalid "+o+" `"+u+"` of type `"+c+"` supplied to `"+r+"`, expected an object.");for(var l in a)if(a.hasOwnProperty(l)){var f=t(a,l,r,o,u+"."+l,i);if(f instanceof Error)return f}return null}return c(e)}function h(t){function e(e,n,r,o,u){for(var a=0;a<t.length;a++){if(null==(0,t[a])(e,n,r,o,u,i))return null}return new s("Invalid "+o+" `"+u+"` supplied to `"+r+"`.")}return Array.isArray(t)?c(e):r.thatReturnsNull}function v(t){function e(e,n,r,o,u){var a=e[n],c=g(a);if("object"!==c)return new s("Invalid "+o+" `"+u+"` of type `"+c+"` supplied to `"+r+"`, expected `object`.");for(var l in t){var f=t[l];if(f){var p=f(a,l,r,o,u+"."+l,i);if(p)return p}}return null}return c(e)}function m(e){switch(typeof e){case"number":case"string":case"undefined":return!0;case"boolean":return!e;case"object":if(Array.isArray(e))return e.every(m);if(null===e||t(e))return!0;var r=n(e);if(!r)return!1;var o,i=r.call(e);if(r!==e.entries){for(;!(o=i.next()).done;)if(!m(o.value))return!1}else for(;!(o=i.next()).done;){var u=o.value;if(u&&!m(u[1]))return!1}return!0;default:return!1}}function b(t,e){return"symbol"===t||("Symbol"===e["@@toStringTag"]||"function"==typeof Symbol&&e instanceof Symbol)}function g(t){var e=typeof t;return Array.isArray(t)?"array":t instanceof RegExp?"object":b(e,t)?"symbol":e}function E(t){var e=g(t);if("object"===e){if(t instanceof Date)return"date";if(t instanceof RegExp)return"regexp"}return e}function x(t){return t.constructor&&t.constructor.name?t.constructor.name:w}var _="function"==typeof Symbol&&Symbol.iterator,P="@@iterator",w="<<anonymous>>",N={array:l("array"),bool:l("boolean"),func:l("function"),number:l("number"),object:l("object"),string:l("string"),symbol:l("symbol"),any:function(){return c(r.thatReturnsNull)}(),arrayOf:f,element:function(){function e(e,n,r,o,i){var u=e[n];if(!t(u)){return new s("Invalid "+o+" `"+i+"` of type `"+g(u)+"` supplied to `"+r+"`, expected a single ReactElement.")}return null}return c(e)}(),instanceOf:p,node:function(){function t(t,e,n,r,o){return m(t[e])?null:new s("Invalid "+r+" `"+o+"` supplied to `"+n+"`, expected a ReactNode.")}return c(t)}(),objectOf:y,oneOf:d,oneOfType:h,shape:v};return s.prototype=Error.prototype,N.checkPropTypes=u,N.PropTypes=N,N}},{22:22,24:24,25:25,27:27,30:30}],30:[function(t,e,n){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},{}]},{},[15])(15)}); \ No newline at end of file diff --git a/cyclone-web/vendor/react/vendors.js b/cyclone-web/vendor/react/vendors.js new file mode 100644 index 0000000000000000000000000000000000000000..954aadd5920d5d1ef1100864ac3ebf16c4dd2fec --- /dev/null +++ b/cyclone-web/vendor/react/vendors.js @@ -0,0 +1,155 @@ +window.main=function(e){function t(a){if(r[a])return r[a].exports;var n=r[a]={i:a,l:!1,exports:{}};return e[a].call(n.exports,n,n.exports,t),n.l=!0,n.exports}var r={};return t.m=e,t.c=r,t.i=function(e){return e},t.d=function(e,r,a){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:a})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=469)}([function(e,t,r){"use strict";function a(e,t){K[e]=t}function n(e){if(null==e||"object"!=(void 0===e?"undefined":j(e)))return e;var t=e,r=V.call(e);if("[object Array]"===r){t=[];for(var a=0,o=e.length;a<o;a++)t[a]=n(e[a])}else if(H[r]){var i=e.constructor;if(e.constructor.from)t=i.from(e);else{t=new i(e.length);for(var a=0,o=e.length;a<o;a++)t[a]=n(e[a])}}else if(!B[r]&&!E(e)&&!S(e)){t={};for(var l in e)e.hasOwnProperty(l)&&(t[l]=n(e[l]))}return t}function o(e,t,r){if(!b(t)||!b(e))return r?n(t):e;for(var a in t)if(t.hasOwnProperty(a)){var i=e[a],l=t[a];!b(l)||!b(i)||x(l)||x(i)||S(l)||S(i)||L(l)||L(i)||E(l)||E(i)?!r&&a in e||(e[a]=n(t[a],!0)):o(i,l,r)}return e}function i(e,t){for(var r=e[0],a=1,n=e.length;a<n;a++)r=o(r,e[a],t);return r}function l(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);return e}function s(e,t,r){for(var a in t)t.hasOwnProperty(a)&&(r?null!=t[a]:null==e[a])&&(e[a]=t[a]);return e}function u(){return X||(X=J().getContext("2d")),X}function h(e,t){if(e){if(e.indexOf)return e.indexOf(t);for(var r=0,a=e.length;r<a;r++)if(e[r]===t)return r}return-1}function c(e,t){function r(){}var a=e.prototype;r.prototype=t.prototype,e.prototype=new r;for(var n in a)e.prototype[n]=a[n];e.prototype.constructor=e,e.superClass=t}function d(e,t,r){e="prototype"in e?e.prototype:e,t="prototype"in t?t.prototype:t,s(e,t,r)}function m(e){if(e)return"string"!=typeof e&&"number"==typeof e.length}function p(e,t,r){if(e&&t)if(e.forEach&&e.forEach===W)e.forEach(t,r);else if(e.length===+e.length)for(var a=0,n=e.length;a<n;a++)t.call(r,e[a],a,e);else for(var o in e)e.hasOwnProperty(o)&&t.call(r,e[o],o,e)}function f(e,t,r){if(e&&t){if(e.map&&e.map===Y)return e.map(t,r);for(var a=[],n=0,o=e.length;n<o;n++)a.push(t.call(r,e[n],n,e));return a}}function v(e,t,r,a){if(e&&t){if(e.reduce&&e.reduce===Z)return e.reduce(t,r,a);for(var n=0,o=e.length;n<o;n++)r=t.call(a,r,e[n],n,e);return r}}function y(e,t,r){if(e&&t){if(e.filter&&e.filter===U)return e.filter(t,r);for(var a=[],n=0,o=e.length;n<o;n++)t.call(r,e[n],n,e)&&a.push(e[n]);return a}}function g(e,t,r){if(e&&t)for(var a=0,n=e.length;a<n;a++)if(t.call(r,e[a],a,e))return e[a]}function _(e,t){var r=q.call(arguments,2);return function(){return e.apply(t,r.concat(q.call(arguments)))}}function T(e){var t=q.call(arguments,1);return function(){return e.apply(this,t.concat(q.call(arguments)))}}function x(e){return"[object Array]"===V.call(e)}function w(e){return"function"==typeof e}function N(e){return"[object String]"===V.call(e)}function b(e){var t=void 0===e?"undefined":j(e);return"function"===t||!!e&&"object"==t}function L(e){return!!B[V.call(e)]}function S(e){return"object"===(void 0===e?"undefined":j(e))&&"number"==typeof e.nodeType&&"object"===j(e.ownerDocument)}function k(e){return e!==e}function D(e){for(var t=0,r=arguments.length;t<r;t++)if(null!=arguments[t])return arguments[t]}function M(e,t){return null!=e?e:t}function A(e,t,r){return null!=e?e:null!=t?t:r}function I(){return Function.call.apply(q,arguments)}function z(e){if("number"==typeof e)return[e,e,e,e];var t=e.length;return 2===t?[e[0],e[1],e[0],e[1]]:3===t?[e[0],e[1],e[2],e[1]]:e}function C(e,t){if(!e)throw new Error(t)}function R(e){e[$]=!0}function E(e){return e[$]}function P(e){e&&p(e,function(e,t){this.set(t,e)},this)}function O(e){return new P(e)}function F(){}var j="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},B={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1,"[object CanvasPattern]":1,"[object Image]":1,"[object Canvas]":1},H={"[object Int8Array]":1,"[object Uint8Array]":1,"[object Uint8ClampedArray]":1,"[object Int16Array]":1,"[object Uint16Array]":1,"[object Int32Array]":1,"[object Uint32Array]":1,"[object Float32Array]":1,"[object Float64Array]":1},V=Object.prototype.toString,G=Array.prototype,W=G.forEach,U=G.filter,q=G.slice,Y=G.map,Z=G.reduce,K={},J=function(){return K.createCanvas()};K.createCanvas=function(){return document.createElement("canvas")};var X,$="__ec_primitive__";P.prototype={constructor:P,get:function(e){return this["_ec_"+e]},set:function(e,t){return this["_ec_"+e]=t,t},each:function(e,t){void 0!==t&&(e=_(e,t));for(var r in this)this.hasOwnProperty(r)&&e(this[r],r.slice(4))},removeKey:function(e){delete this["_ec_"+e]}},t.$override=a,t.clone=n,t.merge=o,t.mergeAll=i,t.extend=l,t.defaults=s,t.createCanvas=J,t.getContext=u,t.indexOf=h,t.inherits=c,t.mixin=d,t.isArrayLike=m,t.each=p,t.map=f,t.reduce=v,t.filter=y,t.find=g,t.bind=_,t.curry=T,t.isArray=x,t.isFunction=w,t.isString=N,t.isObject=b,t.isBuiltInObject=L,t.isDom=S,t.eqNaN=k,t.retrieve=D,t.retrieve2=M,t.retrieve3=A,t.slice=I,t.normalizeCssArray=z,t.assert=C,t.setAsPrimitive=R,t.isPrimitive=E,t.createHashMap=O,t.noop=F},function(e,t,r){"use strict";var a=r(6),n=r(42),o=r(30),i=r(31),l=r(43),s=function e(t,r,s){var u,h,c,d,m=t&e.F,p=t&e.G,f=t&e.S,v=t&e.P,y=t&e.B,g=p?a:f?a[r]||(a[r]={}):(a[r]||{}).prototype,_=p?n:n[r]||(n[r]={}),T=_.prototype||(_.prototype={});p&&(s=r);for(u in s)h=!m&&g&&void 0!==g[u],c=(h?g:s)[u],d=y&&h?l(c,a):v&&"function"==typeof c?l(Function.call,c):c,g&&i(g,u,c,t&e.U),_[u]!=c&&o(_,u,d),v&&T[u]!=c&&(T[u]=c)};a.core=n,s.F=1,s.G=2,s.S=4,s.P=8,s.B=16,s.W=32,s.U=64,s.R=128,e.exports=s},function(e,t,r){"use strict";function a(e){return function(t,r,a){t=t&&t.toLowerCase(),$.prototype[e].call(this,t,r,a)}}function n(){$.call(this)}function o(e,t,r){function a(e,t){return e.prio-t.prio}r=r||{},"string"==typeof t&&(t=Ce[t]),this.id,this.group,this._dom=e;var o=this._zr=Y.init(e,{renderer:r.renderer||"canvas",devicePixelRatio:r.devicePixelRatio,width:r.width,height:r.height});this._throttledZrFlush=ce(Z.bind(o.flush,o),17);var t=Z.clone(t);t&&ae(t,!0),this._theme=t,this._chartsViews=[],this._chartsMap={},this._componentsViews=[],this._componentsMap={},this._coordSysMgr=new te,this._api=x(this),$.call(this),this._messageCenter=new n,this._initEvents(),this.resize=Z.bind(this.resize,this),this._pendingActions=[],X(ze,a),X(Me,a),o.animation.on("frame",this._onframe,this),Z.setAsPrimitive(this)}function i(e,t,r){var a,n=this._model,o=this._coordSysMgr.getCoordinateSystems();t=ue.parseFinder(n,t);for(var i=0;i<o.length;i++){var l=o[i];if(l[e]&&null!=(a=l[e](n,t,r)))return a}}function l(e,t,r,a,n){function o(a){a&&a.__alive&&a[t]&&a[t](a.__model,i,e._api,r)}var i=e._model;if(!a)return void pe(e._componentsViews.concat(e._chartsViews),o);var l={};l[a+"Id"]=r[a+"Id"],l[a+"Index"]=r[a+"Index"],l[a+"Name"]=r[a+"Name"];var s={mainType:a,query:l};n&&(s.subType=n),i&&i.eachComponent(s,function(t,r){o(e["series"===a?"_chartsMap":"_componentsMap"][t.__viewId])},e)}function s(e,t){var r=e.type,a=e.escapeConnect,n=ke[r],o=n.actionInfo,i=(o.update||"update").split(":"),s=i.pop();i=null!=i[0]&&fe(i[0]),this[xe]=!0;var u=[e],h=!1;e.batch&&(h=!0,u=Z.map(e.batch,function(t){return t=Z.defaults(Z.extend({},t),e),t.batch=null,t}));var c,d=[],m="highlight"===r||"downplay"===r;pe(u,function(e){c=n.action(e,this._model,this._api),c=c||Z.extend({},e),c.type=o.event||c.type,d.push(c),m?l(this,s,e,"series"):i&&l(this,s,e,i.main,i.sub)},this),"none"===s||m||i||(this[we]?(Le.prepareAndUpdate.call(this,e),this[we]=!1):Le[s].call(this,e)),c=h?{type:o.event||r,escapeConnect:a,batch:d}:d[0],this[xe]=!1,!t&&this._messageCenter.trigger(c.type,c)}function u(e){for(var t=this._pendingActions;t.length;){var r=t.shift();s.call(this,r,e)}}function h(e){!e&&this.trigger("updated")}function c(e,t,r){var a=this._api;pe(this._componentsViews,function(n){var o=n.__model;n[e](o,t,a,r),T(o,n)},this),t.eachSeries(function(n,o){var i=this._chartsMap[n.__viewId];i[e](n,t,a,r),T(n,i),_(n,i)},this),g(this._zr,t),pe(Ie,function(e){e(t,a)})}function d(e,t){for(var r="component"===e,a=r?this._componentsViews:this._chartsViews,n=r?this._componentsMap:this._chartsMap,o=this._zr,i=0;i<a.length;i++)a[i].__alive=!1;t[r?"eachComponent":"eachSeries"](function(e,i){if(r){if("series"===e)return}else i=e;var l="_ec_"+i.id+"_"+i.type,s=n[l];if(!s){var u=fe(i.type),h=r?ie.getClass(u.main,u.sub):le.getClass(u.sub);if(!h)return;s=new h,s.init(t,this._api),n[l]=s,a.push(s),o.add(s.group)}i.__viewId=s.__id=l,s.__alive=!0,s.__model=i,s.group.__ecComponentInfo={mainType:i.mainType,index:i.componentIndex}},this);for(var i=0;i<a.length;){var l=a[i];l.__alive?i++:(o.remove(l.group),l.dispose(t,this._api),a.splice(i,1),delete n[l.__id],l.__id=l.group.__ecComponentInfo=null)}}function m(e,t){pe(Me,function(r){r.func(e,t)})}function p(e){var t={};e.eachSeries(function(e){var r=e.get("stack"),a=e.getData();if(r&&"list"===a.type){var n=t[r];t.hasOwnProperty(r)&&n&&(a.stackedOn=n),t[r]=a}})}function f(e,t){var r=this._api;pe(ze,function(a){a.isLayout&&a.func(e,r,t)})}function v(e,t,r){var a=this._api;e.clearColorPalette(),e.eachSeries(function(e){e.clearColorPalette()}),pe(ze,function(n){(!r||!n.isLayout)&&n.func(e,a,t)})}function y(e,t){var r=this._api;pe(this._componentsViews,function(a){var n=a.__model;a.render(n,e,r,t),T(n,a)},this),pe(this._chartsViews,function(e){e.__alive=!1},this),e.eachSeries(function(a,n){var o=this._chartsMap[a.__viewId];o.__alive=!0,o.render(a,e,r,t),o.group.silent=!!a.get("silent"),T(a,o),_(a,o)},this),g(this._zr,e),pe(this._chartsViews,function(t){t.__alive||t.remove(e,r)},this)}function g(e,t){var r=e.storage,a=0;r.traverse(function(e){e.isGroup||a++}),a>t.get("hoverLayerThreshold")&&!J.node&&r.traverse(function(e){e.isGroup||(e.useHoverLayer=!0)})}function _(e,t){var r=0;t.group.traverse(function(e){"group"===e.type||e.ignore||r++});var a=+e.get("progressive"),n=r>e.get("progressiveThreshold")&&a&&!J.node;n&&t.group.traverse(function(e){e.isGroup||(e.progressive=n?Math.floor(r++/a):-1,n&&e.stopAnimation(!0))});var o=e.get("blendMode")||null;t.group.traverse(function(e){e.isGroup||e.setStyle("blend",o)})}function T(e,t){var r=e.get("z"),a=e.get("zlevel");t.group.traverse(function(e){"group"!==e.type&&(null!=r&&(e.z=r),null!=a&&(e.zlevel=a))})}function x(e){var t=e._coordSysMgr;return Z.extend(new ee(e),{getCoordinateSystems:Z.bind(t.getCoordinateSystems,t),getComponentByElement:function(t){for(;t;){var r=t.__ecComponentInfo;if(null!=r)return e._model.getComponent(r.mainType,r.index);t=t.parent}}})}function w(e){function t(e,t){for(var a=0;a<e.length;a++)e[a][r]=t}var r="__connectUpdateStatus";Z.each(De,function(a,n){e._messageCenter.on(n,function(a){if(Pe[e.group]&&0!==e[r]){if(a&&a.escapeConnect)return;var n=e.makeActionFromEvent(a),o=[];Z.each(Ee,function(t){t!==e&&t.group===e.group&&o.push(t)}),t(o,0),pe(o,function(e){1!==e[r]&&e.dispatchAction(n)}),t(o,2)}})})}function N(e,t,r){var a=k(e);if(a)return a;var n=new o(e,t,r);return n.id="ec_"+Oe++,Ee[n.id]=n,e.setAttribute?e.setAttribute(je,n.id):e[je]=n.id,w(n),n}function b(e){if(Z.isArray(e)){var t=e;e=null,Z.each(t,function(t){null!=t.group&&(e=t.group)}),e=e||"g_"+Fe++,Z.each(t,function(t){t.group=e})}return Pe[e]=!0,e}function L(e){Pe[e]=!1}function S(e){"string"==typeof e?e=Ee[e]:e instanceof o||(e=k(e)),e instanceof o&&!e.isDisposed()&&e.dispose()}function k(e){var t;return t=e.getAttribute?e.getAttribute(je):e[je],Ee[t]}function D(e){return Ee[e]}function M(e,t){Ce[e]=t}function A(e){Ae.push(e)}function I(e,t){"function"==typeof e&&(t=e,e=ye),Me.push({prio:e,func:t})}function z(e){Ie.push(e)}function C(e,t,r){"function"==typeof t&&(r=t,t="");var a=Z.isObject(e)?e.type:[e,e={event:t}][0];e.event=(e.event||a).toLowerCase(),t=e.event,Z.assert(Ne.test(a)&&Ne.test(t)),ke[a]||(ke[a]={action:r,actionInfo:e}),De[t]=a}function R(e,t){te.register(e,t)}function E(e){var t=te.get(e);if(t)return t.getDimensionsInfo?t.getDimensionsInfo():t.dimensions.slice()}function P(e,t){"function"==typeof e&&(t=e,e=ge),ze.push({prio:e,func:t,isLayout:!0})}function O(e,t){"function"==typeof e&&(t=e,e=_e),ze.push({prio:e,func:t})}function F(e,t){Re[e]=t}function j(e){return ne.extend(e)}function B(e){return ie.extend(e)}function H(e){return oe.extend(e)}function V(e){return le.extend(e)}function G(e){Z.$override("createCanvas",e)}function W(e,t,r){t.geoJson&&!t.features&&(r=t.specialAreas,t=t.geoJson),"string"==typeof t&&(t="undefined"!=typeof JSON&&JSON.parse?JSON.parse(t):new Function("return ("+t+");")()),Be[e]={geoJson:t,specialAreas:r}}function U(e){return Be[e]}var q=r(9),Y=(q.__DEV__,r(194)),Z=r(0),K=r(63),J=r(25),X=r(275),$=r(98),Q=r(962),ee=r(726),te=r(53),re=r(963),ae=r(970),ne=r(24),oe=r(27),ie=r(252),le=r(72),se=r(3),ue=r(10),he=r(92),ce=he.throttle,de=r(977),me=r(961),pe=Z.each,fe=ne.parseClassType,ve={zrender:"3.7.4"},ye=1e3,ge=1e3,_e=3e3,Te={PROCESSOR:{FILTER:ye,STATISTIC:5e3},VISUAL:{LAYOUT:ge,GLOBAL:2e3,CHART:_e,COMPONENT:4e3,BRUSH:5e3}},xe="__flagInMainProcess",we="__optionUpdated",Ne=/^[a-zA-Z0-9_]+$/;n.prototype.on=a("on"),n.prototype.off=a("off"),n.prototype.one=a("one"),Z.mixin(n,$);var be=o.prototype;be._onframe=function(){if(this[we]){var e=this[we].silent;this[xe]=!0,Le.prepareAndUpdate.call(this),this[xe]=!1,this[we]=!1,u.call(this,e),h.call(this,e)}},be.getDom=function(){return this._dom},be.getZr=function(){return this._zr},be.setOption=function(e,t,r){var a;if(Z.isObject(t)&&(r=t.lazyUpdate,a=t.silent,t=t.notMerge),this[xe]=!0,!this._model||t){var n=new re(this._api),o=this._theme;(this._model=new Q(null,null,o,n)).init(null,null,o,n)}this._model.setOption(e,Ae),r?(this[we]={silent:a},this[xe]=!1):(Le.prepareAndUpdate.call(this),this._zr.flush(),this[we]=!1,this[xe]=!1,u.call(this,a),h.call(this,a))},be.setTheme=function(){console.log("ECharts#setTheme() is DEPRECATED in ECharts 3.0")},be.getModel=function(){return this._model},be.getOption=function(){return this._model&&this._model.getOption()},be.getWidth=function(){return this._zr.getWidth()},be.getHeight=function(){return this._zr.getHeight()},be.getDevicePixelRatio=function(){return this._zr.painter.dpr||window.devicePixelRatio||1},be.getRenderedCanvas=function(e){if(J.canvasSupported){e=e||{},e.pixelRatio=e.pixelRatio||1,e.backgroundColor=e.backgroundColor||this._model.get("backgroundColor");var t=this._zr,r=t.storage.getDisplayList();return Z.each(r,function(e){e.stopAnimation(!0)}),t.painter.getRenderedCanvas(e)}},be.getSvgDataUrl=function(){if(J.svgSupported){var e=this._zr,t=e.storage.getDisplayList();return Z.each(t,function(e){e.stopAnimation(!0)}),e.painter.pathToSvg()}},be.getDataURL=function(e){e=e||{};var t=e.excludeComponents,r=this._model,a=[],n=this;pe(t,function(e){r.eachComponent({mainType:e},function(e){var t=n._componentsMap[e.__viewId];t.group.ignore||(a.push(t),t.group.ignore=!0)})});var o="svg"===this._zr.painter.getType()?this.getSvgDataUrl():this.getRenderedCanvas(e).toDataURL("image/"+(e&&e.type||"png"));return pe(a,function(e){e.group.ignore=!1}),o},be.getConnectedDataURL=function(e){if(J.canvasSupported){var t=this.group,r=Math.min,a=Math.max;if(Pe[t]){var n=1/0,o=1/0,i=-1/0,l=-1/0,s=[],u=e&&e.pixelRatio||1;Z.each(Ee,function(u,h){if(u.group===t){var c=u.getRenderedCanvas(Z.clone(e)),d=u.getDom().getBoundingClientRect();n=r(d.left,n),o=r(d.top,o),i=a(d.right,i),l=a(d.bottom,l),s.push({dom:c,left:d.left,top:d.top})}}),n*=u,o*=u,i*=u,l*=u;var h=i-n,c=l-o,d=Z.createCanvas();d.width=h,d.height=c;var m=Y.init(d);return pe(s,function(e){var t=new se.Image({style:{x:e.left*u-n,y:e.top*u-o,image:e.dom}});m.add(t)}),m.refreshImmediately(),d.toDataURL("image/"+(e&&e.type||"png"))}return this.getDataURL(e)}},be.convertToPixel=Z.curry(i,"convertToPixel"),be.convertFromPixel=Z.curry(i,"convertFromPixel"),be.containPixel=function(e,t){var r,a=this._model;return e=ue.parseFinder(a,e),Z.each(e,function(e,a){a.indexOf("Models")>=0&&Z.each(e,function(e){var n=e.coordinateSystem;if(n&&n.containPoint)r|=!!n.containPoint(t);else if("seriesModels"===a){var o=this._chartsMap[e.__viewId];o&&o.containPoint&&(r|=o.containPoint(t,e))}},this)},this),!!r},be.getVisual=function(e,t){var r=this._model;e=ue.parseFinder(r,e,{defaultMainType:"series"});var a=e.seriesModel,n=a.getData(),o=e.hasOwnProperty("dataIndexInside")?e.dataIndexInside:e.hasOwnProperty("dataIndex")?n.indexOfRawIndex(e.dataIndex):null;return null!=o?n.getItemVisual(o,t):n.getVisual(t)},be.getViewOfComponentModel=function(e){return this._componentsMap[e.__viewId]},be.getViewOfSeriesModel=function(e){return this._chartsMap[e.__viewId]};var Le={update:function(e){var t=this._model,r=this._api,a=this._coordSysMgr,n=this._zr;if(t){t.restoreData(),a.create(this._model,this._api),m.call(this,t,r),p.call(this,t),a.update(t,r),v.call(this,t,e),y.call(this,t,e);var o=t.get("backgroundColor")||"transparent",i=n.painter;if(i.isSingleCanvas&&i.isSingleCanvas())n.configLayer(0,{clearColor:o});else{if(!J.canvasSupported){var l=K.parse(o);o=K.stringify(l,"rgb"),0===l[3]&&(o="transparent")}o.colorStops||o.image?(n.configLayer(0,{clearColor:o}),this.__hasGradientOrPatternBg=!0,this._dom.style.background="transparent"):(this.__hasGradientOrPatternBg&&n.configLayer(0,{clearColor:null}),this.__hasGradientOrPatternBg=!1,this._dom.style.background=o)}pe(Ie,function(e){e(t,r)})}},updateView:function(e){var t=this._model;t&&(t.eachSeries(function(e){e.getData().clearAllVisual()}),v.call(this,t,e),c.call(this,"updateView",t,e))},updateVisual:function(e){var t=this._model;t&&(t.eachSeries(function(e){e.getData().clearAllVisual()}),v.call(this,t,e,!0),c.call(this,"updateVisual",t,e))},updateLayout:function(e){var t=this._model;t&&(f.call(this,t,e),c.call(this,"updateLayout",t,e))},prepareAndUpdate:function(e){var t=this._model;d.call(this,"component",t),d.call(this,"chart",t),Le.update.call(this,e)}};be.resize=function(e){this[xe]=!0,this._zr.resize(e);var t=this._model&&this._model.resetOption("media");Le[t?"prepareAndUpdate":"update"].call(this),this._loadingFX&&this._loadingFX.resize(),this[xe]=!1;var r=e&&e.silent;u.call(this,r),h.call(this,r)},be.showLoading=function(e,t){if(Z.isObject(e)&&(t=e,e=""),e=e||"default",this.hideLoading(),Re[e]){var r=Re[e](this._api,t),a=this._zr;this._loadingFX=r,a.add(r)}},be.hideLoading=function(){this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null},be.makeActionFromEvent=function(e){var t=Z.extend({},e);return t.type=De[e.type],t},be.dispatchAction=function(e,t){if(Z.isObject(t)||(t={silent:!!t}),ke[e.type]&&this._model){if(this[xe])return void this._pendingActions.push(e);s.call(this,e,t.silent),t.flush?this._zr.flush(!0):!1!==t.flush&&J.browser.weChat&&this._throttledZrFlush(),u.call(this,t.silent),h.call(this,t.silent)}},be.on=a("on"),be.off=a("off"),be.one=a("one");var Se=["click","dblclick","mouseover","mouseout","mousemove","mousedown","mouseup","globalout","contextmenu"];be._initEvents=function(){pe(Se,function(e){this._zr.on(e,function(t){var r,a=this.getModel(),n=t.target;if("globalout"===e)r={};else if(n&&null!=n.dataIndex){var o=n.dataModel||a.getSeriesByIndex(n.seriesIndex);r=o&&o.getDataParams(n.dataIndex,n.dataType)||{}}else n&&n.eventData&&(r=Z.extend({},n.eventData));r&&(r.event=t,r.type=e,this.trigger(e,r))},this)},this),pe(De,function(e,t){this._messageCenter.on(t,function(e){this.trigger(t,e)},this)},this)},be.isDisposed=function(){return this._disposed},be.clear=function(){this.setOption({series:[]},!0)},be.dispose=function(){if(!this._disposed){this._disposed=!0;var e=this._api,t=this._model;pe(this._componentsViews,function(r){r.dispose(t,e)}),pe(this._chartsViews,function(r){r.dispose(t,e)}),this._zr.dispose(),delete Ee[this.id]}},Z.mixin(o,$);var ke={},De={},Me=[],Ae=[],Ie=[],ze=[],Ce={},Re={},Ee={},Pe={},Oe=new Date-0,Fe=new Date-0,je="_echarts_instance_",Be={},He=L;O(2e3,de),A(ae),F("default",me),C({type:"highlight",event:"highlight",update:"highlight"},Z.noop),C({type:"downplay",event:"downplay",update:"downplay"},Z.noop);var Ve={};t.version="3.8.5",t.dependencies=ve,t.PRIORITY=Te,t.init=N,t.connect=b,t.disConnect=L,t.disconnect=He,t.dispose=S,t.getInstanceByDom=k,t.getInstanceById=D,t.registerTheme=M,t.registerPreprocessor=A,t.registerProcessor=I,t.registerPostUpdate=z,t.registerAction=C,t.registerCoordinateSystem=R,t.getCoordinateSystemDimensions=E,t.registerLayout=P,t.registerVisual=O,t.registerLoading=F,t.extendComponentModel=j,t.extendComponentView=B,t.extendSeriesModel=H,t.extendChartView=V,t.setCanvasCreator=G,t.registerMap=W,t.getMap=U,t.dataTool=Ve;var Ge=r(375);!function(){for(var e in Ge)Ge.hasOwnProperty(e)&&(t[e]=Ge[e])}()},function(e,t,r){"use strict";function a(e){return J.extend(e)}function n(e,t){return q.extendFromString(e,t)}function o(e,t,r,a){var n=q.createFromString(e,t),o=n.getBoundingRect();return r&&("center"===a&&(r=l(r,o)),s(n,r)),n}function i(e,t,r){var a=new $({style:{image:e,x:t.x,y:t.y,width:t.width,height:t.height},onload:function(e){if("center"===r){var n={width:e.width,height:e.height};a.setStyle(l(t,n))}}});return a}function l(e,t){var r,a=t.width/t.height,n=e.height*a;return n<=e.width?r=e.height:(n=e.width,r=n/a),{x:e.x+e.width/2-n/2,y:e.y+e.height/2-r/2,width:n,height:r}}function s(e,t){if(e.applyTransform){var r=e.getBoundingRect(),a=r.calculateTransform(t);e.applyTransform(a)}}function u(e){var t=e.shape,r=e.style.lineWidth;return pe(2*t.x1)===pe(2*t.x2)&&(t.x1=t.x2=c(t.x1,r,!0)),pe(2*t.y1)===pe(2*t.y2)&&(t.y1=t.y2=c(t.y1,r,!0)),e}function h(e){var t=e.shape,r=e.style.lineWidth,a=t.x,n=t.y,o=t.width,i=t.height;return t.x=c(t.x,r,!0),t.y=c(t.y,r,!0),t.width=Math.max(c(a+o,r,!1)-t.x,0===o?0:1),t.height=Math.max(c(n+i,r,!1)-t.y,0===i?0:1),e}function c(e,t,r){var a=pe(2*e);return(a+pe(t))%2==0?a/2:(a+(r?1:-1))/2}function d(e){return null!=e&&"none"!=e}function m(e){return"string"==typeof e?Y.lift(e,-.1):e}function p(e){if(e.__hoverStlDirty){var t=e.style.stroke,r=e.style.fill,a=e.__hoverStl;a.fill=a.fill||(d(r)?m(r):null),a.stroke=a.stroke||(d(t)?m(t):null);var n={};for(var o in a)null!=a[o]&&(n[o]=e.style[o]);e.__normalStl=n,e.__hoverStlDirty=!1}}function f(e){if(!e.__isHover){if(p(e),e.useHoverLayer)e.__zr&&e.__zr.addHover(e,e.__hoverStl);else{var t=e.style,r=t.insideRollbackOpt;r&&C(t),t.extendFrom(e.__hoverStl),r&&(z(t,t.insideOriginalTextPosition,r),null==t.textFill&&(t.textFill=r.autoColor)),e.dirty(!1),e.z2+=1}e.__isHover=!0}}function v(e){if(e.__isHover){var t=e.__normalStl;e.useHoverLayer?e.__zr&&e.__zr.removeHover(e):(t&&e.setStyle(t),e.z2-=1),e.__isHover=!1}}function y(e){"group"===e.type?e.traverse(function(e){"group"!==e.type&&f(e)}):f(e)}function g(e){"group"===e.type?e.traverse(function(e){"group"!==e.type&&v(e)}):v(e)}function _(e,t){e.__hoverStl=e.hoverStyle||t||{},e.__hoverStlDirty=!0,e.__isHover&&p(e)}function T(e){this.__hoverSilentOnTouch&&e.zrByTouch||!this.__isEmphasis&&y(this)}function x(e){this.__hoverSilentOnTouch&&e.zrByTouch||!this.__isEmphasis&&g(this)}function w(){this.__isEmphasis=!0,y(this)}function N(){this.__isEmphasis=!1,g(this)}function b(e,t,r){e.__hoverSilentOnTouch=r&&r.hoverSilentOnTouch,"group"===e.type?e.traverse(function(e){"group"!==e.type&&_(e,t)}):_(e,t),e.on("mouseover",T).on("mouseout",x),e.on("emphasis",w).on("normal",N)}function L(e,t,r,a,n,o,i){n=n||ye;var l=n.labelFetcher,s=n.labelDataIndex,u=n.labelDimIndex,h=r.getShallow("show"),c=a.getShallow("show"),d=h||c?U.retrieve2(l?l.getFormattedLabel(s,"normal",null,u):null,n.defaultText):null,m=h?d:null,p=c?U.retrieve2(l?l.getFormattedLabel(s,"emphasis",null,u):null,d):null;null==m&&null==p||(S(e,r,o,n),S(t,a,i,n,!0)),e.text=m,t.text=p}function S(e,t,r,a,n){return D(e,t,a,n),r&&U.extend(e,r),e.host&&e.host.dirty&&e.host.dirty(!1),e}function k(e,t,r){var a,n={isRectText:!0};!1===r?a=!0:n.autoColor=r,D(e,t,n,a),e.host&&e.host.dirty&&e.host.dirty(!1)}function D(e,t,r,a){if(r=r||ye,r.isRectText){var n=t.getShallow("position")||(a?null:"inside");"outside"===n&&(n="top"),e.textPosition=n,e.textOffset=t.getShallow("offset");var o=t.getShallow("rotate");null!=o&&(o*=Math.PI/180),e.textRotation=o,e.textDistance=U.retrieve2(t.getShallow("distance"),a?null:5)}var i,l=t.ecModel,s=l&&l.option.textStyle,u=M(t);if(u){i={};for(var h in u)if(u.hasOwnProperty(h)){var c=t.getModel(["rich",h]);A(i[h]={},c,s,r,a)}}return e.rich=i,A(e,t,s,r,a,!0),r.forceRich&&!r.textStyle&&(r.textStyle={}),e}function M(e){for(var t;e&&e!==e.ecModel;){var r=(e.option||ye).rich;if(r){t=t||{};for(var a in r)r.hasOwnProperty(a)&&(t[a]=1)}e=e.parentModel}return t}function A(e,t,r,a,n,o){if(r=!n&&r||ye,e.textFill=I(t.getShallow("color"),a)||r.color,e.textStroke=I(t.getShallow("textBorderColor"),a)||r.textBorderColor,e.textStrokeWidth=U.retrieve2(t.getShallow("textBorderWidth"),r.textBorderWidth),!n){if(o){var i=e.textPosition;e.insideRollback=z(e,i,a),e.insideOriginalTextPosition=i,e.insideRollbackOpt=a}null==e.textFill&&(e.textFill=a.autoColor)}e.fontStyle=t.getShallow("fontStyle")||r.fontStyle,e.fontWeight=t.getShallow("fontWeight")||r.fontWeight,e.fontSize=t.getShallow("fontSize")||r.fontSize,e.fontFamily=t.getShallow("fontFamily")||r.fontFamily,e.textAlign=t.getShallow("align"),e.textVerticalAlign=t.getShallow("verticalAlign")||t.getShallow("baseline"),e.textLineHeight=t.getShallow("lineHeight"),e.textWidth=t.getShallow("width"),e.textHeight=t.getShallow("height"),e.textTag=t.getShallow("tag"),o&&a.disableBox||(e.textBackgroundColor=I(t.getShallow("backgroundColor"),a),e.textPadding=t.getShallow("padding"),e.textBorderColor=I(t.getShallow("borderColor"),a),e.textBorderWidth=t.getShallow("borderWidth"),e.textBorderRadius=t.getShallow("borderRadius"),e.textBoxShadowColor=t.getShallow("shadowColor"),e.textBoxShadowBlur=t.getShallow("shadowBlur"),e.textBoxShadowOffsetX=t.getShallow("shadowOffsetX"),e.textBoxShadowOffsetY=t.getShallow("shadowOffsetY")),e.textShadowColor=t.getShallow("textShadowColor")||r.textShadowColor,e.textShadowBlur=t.getShallow("textShadowBlur")||r.textShadowBlur,e.textShadowOffsetX=t.getShallow("textShadowOffsetX")||r.textShadowOffsetX,e.textShadowOffsetY=t.getShallow("textShadowOffsetY")||r.textShadowOffsetY}function I(e,t){return"auto"!==e?e:t&&t.autoColor?t.autoColor:null}function z(e,t,r){var a,n=r.useInsideStyle;return null==e.textFill&&!1!==n&&(!0===n||r.isRectText&&t&&"string"==typeof t&&t.indexOf("inside")>=0)&&(a={textFill:null,textStroke:e.textStroke,textStrokeWidth:e.textStrokeWidth},e.textFill="#fff",null==e.textStroke&&(e.textStroke=r.autoColor,null==e.textStrokeWidth&&(e.textStrokeWidth=2))),a}function C(e){var t=e.insideRollback;t&&(e.textFill=t.textFill,e.textStroke=t.textStroke,e.textStrokeWidth=t.textStrokeWidth)}function R(e,t){var r=t||t.getModel("textStyle");return[e.fontStyle||r&&r.getShallow("fontStyle")||"",e.fontWeight||r&&r.getShallow("fontWeight")||"",(e.fontSize||r&&r.getShallow("fontSize")||12)+"px",e.fontFamily||r&&r.getShallow("fontFamily")||"sans-serif"].join(" ")}function E(e,t,r,a,n,o){if("function"==typeof n&&(o=n,n=null),a&&a.isAnimationEnabled()){var i=e?"Update":"",l=a.getShallow("animationDuration"+i),s=a.getShallow("animationEasing"+i),u=a.getShallow("animationDelay"+i);"function"==typeof u&&(u=u(n,a.getAnimationDelayParams?a.getAnimationDelayParams(t,n):null)),"function"==typeof l&&(l=l(n)),l>0?t.animateTo(r,l,u||0,s,o,!!o):(t.stopAnimation(),t.attr(r),o&&o())}else t.stopAnimation(),t.attr(r),o&&o()}function P(e,t,r,a,n){E(!0,e,t,r,a,n)}function O(e,t,r,a,n){E(!1,e,t,r,a,n)}function F(e,t){for(var r=Z.identity([]);e&&e!==t;)Z.mul(r,e.getLocalTransform(),r),e=e.parent;return r}function j(e,t,r){return t&&!U.isArrayLike(t)&&(t=X.getLocalTransform(t)),r&&(t=Z.invert([],t)),K.applyTransform([],e,t)}function B(e,t,r){var a=0===t[4]||0===t[5]||0===t[0]?1:Math.abs(2*t[4]/t[0]),n=0===t[4]||0===t[5]||0===t[2]?1:Math.abs(2*t[4]/t[2]),o=["left"===e?-a:"right"===e?a:0,"top"===e?-n:"bottom"===e?n:0];return o=j(o,t,r),Math.abs(o[0])>Math.abs(o[1])?o[0]>0?"right":"left":o[1]>0?"bottom":"top"}function H(e,t,r,a){function n(e){var t={position:K.clone(e.position),rotation:e.rotation};return e.shape&&(t.shape=U.extend({},e.shape)),t}if(e&&t){var o=function(e){var t={};return e.traverse(function(e){!e.isGroup&&e.anid&&(t[e.anid]=e)}),t}(e);t.traverse(function(e){if(!e.isGroup&&e.anid){var t=o[e.anid];if(t){var a=n(e);e.attr(n(t)),P(e,a,r,e.dataIndex)}}})}}function V(e,t){return U.map(e,function(e){var r=e[0];r=fe(r,t.x),r=ve(r,t.x+t.width);var a=e[1];return a=fe(a,t.y),a=ve(a,t.y+t.height),[r,a]})}function G(e,t){var r=fe(e.x,t.x),a=ve(e.x+e.width,t.x+t.width),n=fe(e.y,t.y),o=ve(e.y+e.height,t.y+t.height);if(a>=r&&o>=n)return{x:r,y:n,width:a-r,height:o-n}}function W(e,t,r){t=U.extend({rectHover:!0},t);var a=t.style={strokeNoScale:!0};if(r=r||{x:-1,y:-1,width:2,height:2},e)return 0===e.indexOf("image://")?(a.image=e.slice(8),U.defaults(a,r),new $(t)):o(e.replace("path://",""),t,r,"center")}var U=r(0),q=r(1221),Y=r(63),Z=r(40),K=r(12),J=r(26),X=r(277),$=r(140);t.Image=$;var Q=r(190);t.Group=Q;var ee=r(141);t.Text=ee;var te=r(1208);t.Circle=te;var re=r(1214);t.Sector=re;var ae=r(1213);t.Ring=ae;var ne=r(1210);t.Polygon=ne;var oe=r(1211);t.Polyline=oe;var ie=r(1212);t.Rect=ie;var le=r(1209);t.Line=le;var se=r(1207);t.BezierCurve=se;var ue=r(1206);t.Arc=ue;var he=r(1202);t.CompoundPath=he;var ce=r(444);t.LinearGradient=ce;var de=r(1203);t.RadialGradient=de;var me=r(19);t.BoundingRect=me;var pe=Math.round,fe=Math.max,ve=Math.min,ye={},ge=q.mergePath;t.extendShape=a,t.extendPath=n,t.makePath=o,t.makeImage=i,t.mergePath=ge,t.resizePath=s,t.subPixelOptimizeLine=u,t.subPixelOptimizeRect=h,t.subPixelOptimize=c,t.setHoverStyle=b,t.setLabelStyle=L,t.setTextStyle=S,t.setText=k,t.getFont=R,t.updateProps=P,t.initProps=O,t.getTransform=F,t.applyTransform=j,t.transformDirection=B,t.groupTransition=H,t.clipPointsByRect=V,t.clipRectByRect=G,t.createIcon=W},function(e,t,r){"use strict";function a(e){return e.replace(/^\s+/,"").replace(/\s+$/,"")}function n(e,t,r,a){var n=t[1]-t[0],o=r[1]-r[0];if(0===n)return 0===o?r[0]:(r[0]+r[1])/2;if(a)if(n>0){if(e<=t[0])return r[0];if(e>=t[1])return r[1]}else{if(e>=t[0])return r[0];if(e<=t[1])return r[1]}else{if(e===t[0])return r[0];if(e===t[1])return r[1]}return(e-t[0])/n*o+r[0]}function o(e,t){switch(e){case"center":case"middle":e="50%";break;case"left":case"top":e="0%";break;case"right":case"bottom":e="100%"}return"string"==typeof e?a(e).match(/%$/)?parseFloat(e)/100*t:parseFloat(e):null==e?NaN:+e}function i(e,t,r){return null==t&&(t=10),t=Math.min(Math.max(0,t),20),e=(+e).toFixed(t),r?e:+e}function l(e){return e.sort(function(e,t){return e-t}),e}function s(e){if(e=+e,isNaN(e))return 0;for(var t=1,r=0;Math.round(e*t)/t!==e;)t*=10,r++;return r}function u(e){var t=e.toString(),r=t.indexOf("e");if(r>0){var a=+t.slice(r+1);return a<0?-a:0}var n=t.indexOf(".");return n<0?0:t.length-1-n}function h(e,t){var r=Math.log,a=Math.LN10,n=Math.floor(r(e[1]-e[0])/a),o=Math.round(r(Math.abs(t[1]-t[0]))/a),i=Math.min(Math.max(-n+o,0),20);return isFinite(i)?i:20}function c(e,t,r){if(!e[t])return 0;var a=T.reduce(e,function(e,t){return e+(isNaN(t)?0:t)},0);if(0===a)return 0;for(var n=Math.pow(10,r),o=T.map(e,function(e){return(isNaN(e)?0:e)/a*n*100}),i=100*n,l=T.map(o,function(e){return Math.floor(e)}),s=T.reduce(l,function(e,t){return e+t},0),u=T.map(o,function(e,t){return e-l[t]});s<i;){for(var h=Number.NEGATIVE_INFINITY,c=null,d=0,m=u.length;d<m;++d)u[d]>h&&(h=u[d],c=d);++l[c],u[c]=0,++s}return l[t]/n}function d(e){var t=2*Math.PI;return(e%t+t)%t}function m(e){return e>-x&&e<x}function p(e){if(e instanceof Date)return e;if("string"==typeof e){var t=w.exec(e);if(!t)return new Date(NaN);if(t[8]){var r=+t[4]||0;return"Z"!==t[8].toUpperCase()&&(r-=t[8].slice(0,3)),new Date(Date.UTC(+t[1],+(t[2]||1)-1,+t[3]||1,r,+(t[5]||0),+t[6]||0,+t[7]||0))}return new Date(+t[1],+(t[2]||1)-1,+t[3]||1,+t[4]||0,+(t[5]||0),+t[6]||0,+t[7]||0)}return null==e?new Date(NaN):new Date(Math.round(e))}function f(e){return Math.pow(10,v(e))}function v(e){return Math.floor(Math.log(e)/Math.LN10)}function y(e,t){var r,a=v(e),n=Math.pow(10,a),o=e/n;return r=t?o<1.5?1:o<2.5?2:o<4?3:o<7?5:10:o<1?1:o<2?2:o<3?3:o<5?5:10,e=r*n,a>=-20?+e.toFixed(a<0?-a:0):e}function g(e){function t(e,r,a){return e.interval[a]<r.interval[a]||e.interval[a]===r.interval[a]&&(e.close[a]-r.close[a]==(a?-1:1)||!a&&t(e,r,1))}e.sort(function(e,r){return t(e,r,0)?-1:1});for(var r=-1/0,a=1,n=0;n<e.length;){for(var o=e[n].interval,i=e[n].close,l=0;l<2;l++)o[l]<=r&&(o[l]=r,i[l]=l?1:1-a),r=o[l],a=i[l];o[0]===o[1]&&i[0]*i[1]!=1?e.splice(n,1):n++}return e}function _(e){return e-parseFloat(e)>=0}var T=r(0),x=1e-4,w=/^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d\d)(?::(\d\d)(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/;t.linearMap=n,t.parsePercent=o,t.round=i,t.asc=l,t.getPrecision=s,t.getPrecisionSafe=u,t.getPixelPrecision=h,t.getPercentWithPrecision=c,t.MAX_SAFE_INTEGER=9007199254740991,t.remRadian=d,t.isRadianAroundZero=m,t.parseDate=p,t.quantity=f,t.nice=y,t.reformIntervals=g,t.isNumeric=_},function(e,t,r){"use strict";var a=r(8);e.exports=function(e){if(!a(e))throw TypeError(e+" is not an object!");return e}},function(e,t,r){"use strict";var a=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=a)},function(e,t,r){"use strict";e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,r){"use strict";var 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.exports=function(e){return"object"===(void 0===e?"undefined":a(e))?null!==e:"function"==typeof e}},function(e,t,r){"use strict";(function(e){var r;"undefined"!=typeof window?r=window.__DEV__:void 0!==e&&(r=e.__DEV__),void 0===r&&(r=!0);var a=r;t.__DEV__=a}).call(t,r(61))},function(e,t,r){"use strict";function a(e){return e instanceof Array?e:null==e?[]:[e]}function n(e,t){if(e)for(var r=e.emphasis=e.emphasis||{},a=e.normal=e.normal||{},n=0,o=t.length;n<o;n++){var i=t[n];!r.hasOwnProperty(i)&&a.hasOwnProperty(i)&&(r[i]=a[i])}}function o(e){return e&&(null==e.value?e:e.value)}function i(e){return b(e)&&!(e instanceof Array)}function l(e,t){var r=t&&t.type;return"ordinal"===r?e:("time"===r&&"number"!=typeof e&&null!=e&&"-"!==e&&(e=+x.parseDate(e)),null==e||""===e?NaN:+e)}function s(e,t){var r=new w;return _.mixin(r,S),r.seriesIndex=t.seriesIndex,r.name=t.name||"",r.mainType=t.mainType,r.subType=t.subType,r.getData=function(){return e},r}function u(e,t){t=(t||[]).slice();var r=_.map(e||[],function(e,t){return{exist:e}});return N(t,function(e,a){if(b(e)){for(var n=0;n<r.length;n++)if(!r[n].option&&null!=e.id&&r[n].exist.id===e.id+"")return r[n].option=e,void(t[a]=null);for(var n=0;n<r.length;n++){var o=r[n].exist;if(!(r[n].option||null!=o.id&&null!=e.id||null==e.name||c(e)||c(o)||o.name!==e.name+""))return r[n].option=e,void(t[a]=null)}}}),N(t,function(e,t){if(b(e)){for(var a=0;a<r.length;a++){var n=r[a].exist;if(!r[a].option&&!c(n)&&null==e.id){r[a].option=e;break}}a>=r.length&&r.push({option:e})}}),r}function h(e){var t=_.createHashMap();N(e,function(e,r){var a=e.exist;a&&t.set(a.id,e)}),N(e,function(e,r){var a=e.option;_.assert(!a||null==a.id||!t.get(a.id)||t.get(a.id)===e,"id duplicates: "+(a&&a.id)),a&&null!=a.id&&t.set(a.id,e),!e.keyInfo&&(e.keyInfo={})}),N(e,function(e,r){var a=e.exist,n=e.option,o=e.keyInfo;if(b(n)){if(o.name=null!=n.name?n.name+"":a?a.name:"\0-",a)o.id=a.id;else if(null!=n.id)o.id=n.id+"";else{var i=0;do{o.id="\0"+o.name+"\0"+i++}while(t.get(o.id))}t.set(o.id,e)}})}function c(e){return b(e)&&e.id&&0===(e.id+"").indexOf("\0_ec_\0")}function d(e,t){function r(e,t,r){for(var n=0,o=e.length;n<o;n++)for(var i=e[n].seriesId,l=a(e[n].dataIndex),s=r&&r[i],u=0,h=l.length;u<h;u++){var c=l[u];s&&s[c]?s[c]=null:(t[i]||(t[i]={}))[c]=1}}function n(e,t){var r=[];for(var a in e)if(e.hasOwnProperty(a)&&null!=e[a])if(t)r.push(+a);else{var o=n(e[a],!0);o.length&&r.push({seriesId:a,dataIndex:o})}return r}var o={},i={};return r(e||[],o),r(t||[],i,o),[n(o),n(i)]}function m(e,t){return null!=t.dataIndexInside?t.dataIndexInside:null!=t.dataIndex?_.isArray(t.dataIndex)?_.map(t.dataIndex,function(t){return e.indexOfRawIndex(t)}):e.indexOfRawIndex(t.dataIndex):null!=t.name?_.isArray(t.name)?_.map(t.name,function(t){return e.indexOfName(t)}):e.indexOfName(t.name):void 0}function p(e,t,r){if(_.isString(t)){var a={};a[t+"Index"]=0,t=a}var n=r&&r.defaultMainType;!n||g(t,n+"Index")||g(t,n+"Id")||g(t,n+"Name")||(t[n+"Index"]=0);var o={};return N(t,function(a,n){var a=t[n];if("dataIndex"===n||"dataIndexInside"===n)return void(o[n]=a);var i=n.match(/^(\w+)(Index|Id|Name)$/)||[],l=i[1],s=(i[2]||"").toLowerCase();if(!(!l||!s||null==a||"index"===s&&"none"===a||r&&r.includeMainTypes&&_.indexOf(r.includeMainTypes,l)<0)){var u={mainType:l};"index"===s&&"all"===a||(u[s]=a);var h=e.queryComponents(u);o[l+"Models"]=h,o[l+"Model"]=h[0]}}),o}function f(e,t){var r=e.dimensions;t=e.getDimension(t);for(var a=0;a<r.length;a++){var n=e.getDimensionInfo(r[a]);if(n.name===t)return n.coordDim}}function v(e,t){var r=[];return N(e.dimensions,function(a){var n=e.getDimensionInfo(a);n.coordDim===t&&(r[n.coordDimIndex]=n.name)}),r}function y(e,t){var r=[];return N(e.dimensions,function(a){var n=e.getDimensionInfo(a),o=n.otherDims,i=o[t];null!=i&&!1!==i&&(r[i]=n.name)}),r}function g(e,t){return e&&e.hasOwnProperty(t)}var _=r(0),T=r(14),x=r(4),w=r(20),N=_.each,b=_.isObject,L=["fontStyle","fontWeight","fontSize","fontFamily","rich","tag","color","textBorderColor","textBorderWidth","width","height","lineHeight","align","verticalAlign","baseline","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","textShadowColor","textShadowBlur","textShadowOffsetX","textShadowOffsetY","backgroundColor","borderColor","borderWidth","borderRadius","padding"],S={getDataParams:function(e,t){var r=this.getData(t),a=this.getRawValue(e,t),n=r.getRawIndex(e),o=r.getName(e,!0),i=r.getRawDataItem(e),l=r.getItemVisual(e,"color");return{componentType:this.mainType,componentSubType:this.subType,seriesType:"series"===this.mainType?this.subType:null,seriesIndex:this.seriesIndex,seriesId:this.id,seriesName:this.name,name:o,dataIndex:n,data:i,dataType:t,value:a,color:l,marker:T.getTooltipMarker(l),$vars:["seriesName","name","value"]}},getFormattedLabel:function(e,t,r,a,n){t=t||"normal";var o=this.getData(r),i=o.getItemModel(e),l=this.getDataParams(e,r);null!=a&&l.value instanceof Array&&(l.value=l.value[a]);var s=i.get([n||"label",t,"formatter"]);return"function"==typeof s?(l.status=t,s(l)):"string"==typeof s?T.formatTpl(s,l):void 0},getRawValue:function(e,t){var r=this.getData(t),a=r.getRawDataItem(e);if(null!=a)return!b(a)||a instanceof Array?a:a.value},formatTooltip:_.noop},k=function(){var e=0;return function(){var t="\0__ec_prop_getter_"+e++;return function(e){return e[t]||(e[t]={})}}}();t.normalizeToArray=a,t.defaultEmphasis=n,t.TEXT_STYLE_OPTIONS=L,t.getDataItemValue=o,t.isDataItemOption=i,t.converDataValue=l,t.createDataFormatModel=s,t.dataFormatMixin=S,t.mappingToExists=u,t.makeIdAndName=h,t.isIdInner=c,t.compressBatches=d,t.queryDataIndex=m,t.makeGetter=k,t.parseFinder=p,t.dataDimToCoordDim=f,t.coordDimToDataDim=v,t.otherDimToDataDim=y},function(e,t,r){"use strict";function a(e,t,r,a,n){var o=0,i=0;null==a&&(a=1/0),null==n&&(n=1/0);var l=0;t.eachChild(function(s,u){var h,c,d=s.position,m=s.getBoundingRect(),p=t.childAt(u+1),f=p&&p.getBoundingRect();if("horizontal"===e){var v=m.width+(f?-f.x+m.x:0);h=o+v,h>a||s.newline?(o=0,h=v,i+=l+r,l=m.height):l=Math.max(l,m.height)}else{var y=m.height+(f?-f.y+m.y:0);c=i+y,c>n||s.newline?(o+=l+r,i=0,c=y,l=m.width):l=Math.max(l,m.width)}s.newline||(d[0]=o,d[1]=i,"horizontal"===e?o=h+r:i=c+r)})}function n(e,t,r){var a=t.width,n=t.height,o=p(e.x,a),i=p(e.y,n),l=p(e.x2,a),s=p(e.y2,n);return(isNaN(o)||isNaN(parseFloat(e.x)))&&(o=0),(isNaN(l)||isNaN(parseFloat(e.x2)))&&(l=a),(isNaN(i)||isNaN(parseFloat(e.y)))&&(i=0),(isNaN(s)||isNaN(parseFloat(e.y2)))&&(s=n),r=f.normalizeCssArray(r||0),{width:Math.max(l-o-r[1]-r[3],0),height:Math.max(s-i-r[0]-r[2],0)}}function o(e,t,r){r=f.normalizeCssArray(r||0);var a=t.width,n=t.height,o=p(e.left,a),i=p(e.top,n),l=p(e.right,a),s=p(e.bottom,n),u=p(e.width,a),h=p(e.height,n),c=r[2]+r[0],m=r[1]+r[3],v=e.aspect;switch(isNaN(u)&&(u=a-l-m-o),isNaN(h)&&(h=n-s-c-i),null!=v&&(isNaN(u)&&isNaN(h)&&(v>a/n?u=.8*a:h=.8*n),isNaN(u)&&(u=v*h),isNaN(h)&&(h=u/v)),isNaN(o)&&(o=a-l-u-m),isNaN(i)&&(i=n-s-h-c),e.left||e.right){case"center":o=a/2-u/2-r[3];break;case"right":o=a-u-m}switch(e.top||e.bottom){case"middle":case"center":i=n/2-h/2-r[0];break;case"bottom":i=n-h-c}o=o||0,i=i||0,isNaN(u)&&(u=a-m-o-(l||0)),isNaN(h)&&(h=n-c-i-(s||0));var y=new d(o+r[3],i+r[0],u,h);return y.margin=r,y}function i(e,t,r,a,n){var i=!n||!n.hv||n.hv[0],l=!n||!n.hv||n.hv[1],s=n&&n.boundingMode||"all";if(i||l){var u;if("raw"===s)u="group"===e.type?new d(0,0,+t.width||0,+t.height||0):e.getBoundingRect();else if(u=e.getBoundingRect(),e.needLocalTransform()){var h=e.getLocalTransform();u=u.clone(),u.applyTransform(h)}t=o(c.defaults({width:u.width,height:u.height},t),r,a);var m=e.position,p=i?t.x-u.x:0,f=l?t.y-u.y:0;e.attr("position","raw"===s?[p,f]:[m[0]+p,m[1]+f])}}function l(e,t){return null!=e[g[t][0]]||null!=e[g[t][1]]&&null!=e[g[t][2]]}function s(e,t,r){function a(r,a){var i={},s=0,u={},h=0;if(v(r,function(t){u[t]=e[t]}),v(r,function(e){n(t,e)&&(i[e]=u[e]=t[e]),o(i,e)&&s++,o(u,e)&&h++}),l[a])return o(t,r[1])?u[r[2]]=null:o(t,r[2])&&(u[r[1]]=null),u;if(2!==h&&s){if(s>=2)return i;for(var c=0;c<r.length;c++){var d=r[c];if(!n(i,d)&&n(e,d)){i[d]=e[d];break}}return i}return u}function n(e,t){return e.hasOwnProperty(t)}function o(e,t){return null!=e[t]&&"auto"!==e[t]}function i(e,t,r){v(e,function(e){t[e]=r[e]})}!c.isObject(r)&&(r={});var l=r.ignoreSize;!c.isArray(l)&&(l=[l,l]);var s=a(g[0],0),u=a(g[1],1);i(g[0],e,s),i(g[1],e,u)}function u(e){return h({},e)}function h(e,t){return t&&e&&v(y,function(r){t.hasOwnProperty(r)&&(e[r]=t[r])}),e}var c=r(0),d=r(19),m=r(4),p=m.parsePercent,f=r(14),v=c.each,y=["left","right","top","bottom","width","height"],g=[["width","left","right"],["height","top","bottom"]],_=a,T=c.curry(a,"vertical"),x=c.curry(a,"horizontal");t.LOCATION_PARAMS=y,t.HV_NAMES=g,t.box=_,t.vbox=T,t.hbox=x,t.getAvailableSize=n,t.getLayoutRect=o,t.positionElement=i,t.sizeCalculable=l,t.mergeLayoutParam=s,t.getLayoutParams=u,t.copyLayoutParams=h},function(e,t,r){"use strict";function a(e,t){var r=new b(2);return null==e&&(e=0),null==t&&(t=0),r[0]=e,r[1]=t,r}function n(e,t){return e[0]=t[0],e[1]=t[1],e}function o(e){var t=new b(2);return t[0]=e[0],t[1]=e[1],t}function i(e,t,r){return e[0]=t,e[1]=r,e}function l(e,t,r){return e[0]=t[0]+r[0],e[1]=t[1]+r[1],e}function s(e,t,r,a){return e[0]=t[0]+r[0]*a,e[1]=t[1]+r[1]*a,e}function u(e,t,r){return e[0]=t[0]-r[0],e[1]=t[1]-r[1],e}function h(e){return Math.sqrt(c(e))}function c(e){return e[0]*e[0]+e[1]*e[1]}function d(e,t,r){return e[0]=t[0]*r[0],e[1]=t[1]*r[1],e}function m(e,t,r){return e[0]=t[0]/r[0],e[1]=t[1]/r[1],e}function p(e,t){return e[0]*t[0]+e[1]*t[1]}function f(e,t,r){return e[0]=t[0]*r,e[1]=t[1]*r,e}function v(e,t){var r=h(t);return 0===r?(e[0]=0,e[1]=0):(e[0]=t[0]/r,e[1]=t[1]/r),e}function y(e,t){return Math.sqrt((e[0]-t[0])*(e[0]-t[0])+(e[1]-t[1])*(e[1]-t[1]))}function g(e,t){return(e[0]-t[0])*(e[0]-t[0])+(e[1]-t[1])*(e[1]-t[1])}function _(e,t){return e[0]=-t[0],e[1]=-t[1],e}function T(e,t,r,a){return e[0]=t[0]+a*(r[0]-t[0]),e[1]=t[1]+a*(r[1]-t[1]),e}function x(e,t,r){var a=t[0],n=t[1];return e[0]=r[0]*a+r[2]*n+r[4],e[1]=r[1]*a+r[3]*n+r[5],e}function w(e,t,r){return e[0]=Math.min(t[0],r[0]),e[1]=Math.min(t[1],r[1]),e}function N(e,t,r){return e[0]=Math.max(t[0],r[0]),e[1]=Math.max(t[1],r[1]),e}var b="undefined"==typeof Float32Array?Array:Float32Array,L=h,S=c,k=y,D=g;t.create=a,t.copy=n,t.clone=o,t.set=i,t.add=l,t.scaleAndAdd=s,t.sub=u,t.len=h,t.length=L,t.lenSquare=c,t.lengthSquare=S,t.mul=d,t.div=m,t.dot=p,t.scale=f,t.normalize=v,t.distance=y,t.dist=k,t.distanceSquare=g,t.distSquare=D,t.negate=_,t.lerp=T,t.applyTransform=x,t.min=w,t.max=N},function(e,t,r){"use strict";var a=r(158)("wks"),n=r(89),o=r(6).Symbol,i="function"==typeof o;(e.exports=function(e){return a[e]||(a[e]=i&&o[e]||(i?o:n)("Symbol."+e))}).store=a},function(e,t,r){"use strict";function a(e){return isNaN(e)?"-":(e=(e+"").split("."),e[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(e.length>1?"."+e[1]:""))}function n(e,t){return e=(e||"").toLowerCase().replace(/-(.)/g,function(e,t){return t.toUpperCase()}),t&&e&&(e=e.charAt(0).toUpperCase()+e.slice(1)),e}function o(e){return String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function i(e,t,r){c.isArray(t)||(t=[t]);var a=t.length;if(!a)return"";for(var n=t[0].$vars||[],i=0;i<n.length;i++){var l=f[i],s=v(l,0);e=e.replace(v(l),r?o(s):s)}for(var u=0;u<a;u++)for(var h=0;h<n.length;h++){var s=t[u][n[h]];e=e.replace(v(f[h],u),r?o(s):s)}return e}function l(e,t,r){return c.each(t,function(t,a){e=e.replace("{"+a+"}",r?o(t):t)}),e}function s(e,t){return e?'<span style="display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;background-color:'+o(e)+";"+(t||"")+'"></span>':""}function u(e,t,r){"week"!==e&&"month"!==e&&"quarter"!==e&&"half-year"!==e&&"year"!==e||(e="MM-dd\nyyyy");var a=m.parseDate(t),n=r?"UTC":"",o=a["get"+n+"FullYear"](),i=a["get"+n+"Month"]()+1,l=a["get"+n+"Date"](),s=a["get"+n+"Hours"](),u=a["get"+n+"Minutes"](),h=a["get"+n+"Seconds"]();return e=e.replace("MM",y(i)).replace("M",i).replace("yyyy",o).replace("yy",o%100).replace("dd",y(l)).replace("d",l).replace("hh",y(s)).replace("h",s).replace("mm",y(u)).replace("m",u).replace("ss",y(h)).replace("s",h)}function h(e){return e?e.charAt(0).toUpperCase()+e.substr(1):e}var c=r(0),d=r(54),m=r(4),p=c.normalizeCssArray,f=["a","b","c","d","e","f","g"],v=function(e,t){return"{"+e+(null==t?"":t)+"}"},y=function(e){return e<10?"0"+e:e},g=d.truncateText,_=d.getBoundingRect;t.addCommas=a,t.toCamelCase=n,t.normalizeCssArray=p,t.encodeHTML=o,t.formatTpl=i,t.formatTplSimple=l,t.getTooltipMarker=s,t.formatTime=u,t.capitalFirst=h,t.truncateText=g,t.getTextRect=_},function(e,t,r){"use strict";e.exports=r(1168)},function(e,t,r){"use strict";e.exports=!r(7)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t,r){"use strict";var a=r(5),n=r(302),o=r(52),i=Object.defineProperty;t.f=r(16)?Object.defineProperty:function(e,t,r){if(a(e),t=o(t,!0),a(r),n)try{return i(e,t,r)}catch(e){}if("get"in r||"set"in r)throw TypeError("Accessors not supported!");return"value"in r&&(e[t]=r.value),e}},function(e,t,r){"use strict";var a=r(51),n=Math.min;e.exports=function(e){return e>0?n(a(e),9007199254740991):0}},function(e,t,r){"use strict";function a(e,t,r,a){r<0&&(e+=r,r=-r),a<0&&(t+=a,a=-a),this.x=e,this.y=t,this.width=r,this.height=a}var n=r(12),o=r(40),i=n.applyTransform,l=Math.min,s=Math.max;a.prototype={constructor:a,union:function(e){var t=l(e.x,this.x),r=l(e.y,this.y);this.width=s(e.x+e.width,this.x+this.width)-t,this.height=s(e.y+e.height,this.y+this.height)-r,this.x=t,this.y=r},applyTransform:function(){var e=[],t=[],r=[],a=[];return function(n){if(n){e[0]=r[0]=this.x,e[1]=a[1]=this.y,t[0]=a[0]=this.x+this.width,t[1]=r[1]=this.y+this.height,i(e,e,n),i(t,t,n),i(r,r,n),i(a,a,n),this.x=l(e[0],t[0],r[0],a[0]),this.y=l(e[1],t[1],r[1],a[1]);var o=s(e[0],t[0],r[0],a[0]),u=s(e[1],t[1],r[1],a[1]);this.width=o-this.x,this.height=u-this.y}}}(),calculateTransform:function(e){var t=this,r=e.width/t.width,a=e.height/t.height,n=o.create();return o.translate(n,n,[-t.x,-t.y]),o.scale(n,n,[r,a]),o.translate(n,n,[e.x,e.y]),n},intersect:function(e){if(!e)return!1;e instanceof a||(e=a.create(e));var t=this,r=t.x,n=t.x+t.width,o=t.y,i=t.y+t.height,l=e.x,s=e.x+e.width,u=e.y,h=e.y+e.height;return!(n<l||s<r||i<u||h<o)},contain:function(e,t){var r=this;return e>=r.x&&e<=r.x+r.width&&t>=r.y&&t<=r.y+r.height},clone:function(){return new a(this.x,this.y,this.width,this.height)},copy:function(e){this.x=e.x,this.y=e.y,this.width=e.width,this.height=e.height},plain:function(){return{x:this.x,y:this.y,width:this.width,height:this.height}}},a.create=function(e){return new a(e.x,e.y,e.width,e.height)};var u=a;e.exports=u},function(e,t,r){"use strict";function a(e,t,r){this.parentModel=t,this.ecModel=r,this.option=e}function n(e,t,r){for(var a=0;a<t.length&&(!t[a]||null!=(e=e&&"object"===(void 0===e?"undefined":i(e))?e[t[a]]:null));a++);return null==e&&r&&(e=r.get(t)),e}function o(e,t){var r=u.get(e,"getParent");return r?r.call(e,t):e.parentModel}var i="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},l=r(0),s=r(25),u=r(58),h=r(968),c=r(965),d=r(969),m=r(967),p=l.mixin;a.prototype={constructor:a,init:null,mergeOption:function(e){l.merge(this.option,e,!0)},get:function(e,t){return null==e?this.option:n(this.option,this.parsePath(e),!t&&o(this,e))},getShallow:function(e,t){var r=this.option,a=null==r?r:r[e],n=!t&&o(this,e);return null==a&&n&&(a=n.getShallow(e)),a},getModel:function(e,t){var r,i=null==e?this.option:n(this.option,e=this.parsePath(e));return t=t||(r=o(this,e))&&r.getModel(e),new a(i,t,this.ecModel)},isEmpty:function(){return null==this.option},restoreData:function(){},clone:function(){return new(0,this.constructor)(l.clone(this.option))},setReadOnly:function(e){u.setReadOnly(this,e)},parsePath:function(e){return"string"==typeof e&&(e=e.split(".")),e},customizeGetParent:function(e){u.set(this,"getParent",e)},isAnimationEnabled:function(){if(!s.node){if(null!=this.option.animation)return!!this.option.animation;if(this.parentModel)return this.parentModel.isAnimationEnabled()}}},u.enableClassExtend(a),p(a,h),p(a,c),p(a,d),p(a,m);var f=a;e.exports=f},function(e,t,r){"use strict";"function"==typeof Symbol&&Symbol.iterator,e.exports=r(1115)()},function(e,t,r){"use strict";var a=r(49);e.exports=function(e){return Object(a(e))}},function(e,t,r){"use strict";(function(t){function a(e,t){u.each(v.concat(t.__wrappedMethods||[]),function(r){t.hasOwnProperty(r)&&(e[r]=t[r])}),e.__wrappedMethods=t.__wrappedMethods}function n(e){this._array=e||[]}function o(e){return u.isArray(e)||(e=[e]),e}function i(e,t){var r=e.dimensions,n=new y(u.map(r,e.getDimensionInfo,e),e.hostModel);a(n,e);for(var o=n._storage={},i=e._storage,l=0;l<r.length;l++){var s=r[l],h=i[s];u.indexOf(t,s)>=0?o[s]=new h.constructor(i[s].length):o[s]=i[s]}return n}var l="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},s=r(9),u=(s.__DEV__,r(0)),h=r(20),c=r(112),d=r(10),m=u.isObject,p="undefined"===("undefined"==typeof window?"undefined":l(window))?t:window,f={float:"undefined"===l(p.Float64Array)?Array:p.Float64Array,int:"undefined"===l(p.Int32Array)?Array:p.Int32Array,ordinal:Array,number:Array,time:Array},v=["stackedOn","hasItemOption","_nameList","_idList","_rawData"];n.prototype.pure=!1,n.prototype.count=function(){return this._array.length},n.prototype.getItem=function(e){return this._array[e]};var y=function(e,t){e=e||["x","y"];for(var r={},a=[],n=0;n<e.length;n++){var o,i={};"string"==typeof e[n]?(o=e[n],i={name:o,coordDim:o,coordDimIndex:0,stackable:!1,type:"number"}):(i=e[n],o=i.name,i.type=i.type||"number",i.coordDim||(i.coordDim=o,i.coordDimIndex=0)),i.otherDims=i.otherDims||{},a.push(o),r[o]=i}this.dimensions=a,this._dimensionInfos=r,this.hostModel=t,this.dataType,this.indices=[],this._storage={},this._nameList=[],this._idList=[],this._optionModels=[],this.stackedOn=null,this._visual={},this._layout={},this._itemVisuals=[],this._itemLayouts=[],this._graphicEls=[],this._rawData,this._extent},g=y.prototype;g.type="list",g.hasItemOption=!0,g.getDimension=function(e){return isNaN(e)||(e=this.dimensions[e]||e),e},g.getDimensionInfo=function(e){return u.clone(this._dimensionInfos[this.getDimension(e)])},g.initData=function(e,t,r){e=e||[],u.isArray(e)&&(e=new n(e)),this._rawData=e;var a,o=this._storage={},i=this.indices=[],l=this.dimensions,s=this._dimensionInfos,h=e.count(),c=[],m={};t=t||[];for(var p=0;p<l.length;p++){var v=s[l[p]];0===v.otherDims.itemName&&(a=p);var y=f[v.type];o[l[p]]=new y(h)}var g=this;r||(g.hasItemOption=!1),r=r||function(e,t,r,a){var n=d.getDataItemValue(e);return d.isDataItemOption(e)&&(g.hasItemOption=!0),d.converDataValue(n instanceof Array?n[a]:n,s[t])};for(var p=0;p<h;p++){for(var _=e.getItem(p),T=0;T<l.length;T++){var x=l[T];o[x][p]=r(_,x,p,T)}i.push(p)}for(var p=0;p<h;p++){var _=e.getItem(p);!t[p]&&_&&(null!=_.name?t[p]=_.name:null!=a&&(t[p]=o[l[a]][p]));var w=t[p]||"",N=_&&_.id;!N&&w&&(m[w]=m[w]||0,N=w,m[w]>0&&(N+="__ec__"+m[w]),m[w]++),N&&(c[p]=N)}this._nameList=t,this._idList=c},g.count=function(){return this.indices.length},g.get=function(e,t,r){var a=this._storage,n=this.indices[t];if(null==n||!a[e])return NaN;var o=a[e][n];if(r){var i=this._dimensionInfos[e];if(i&&i.stackable)for(var l=this.stackedOn;l;){var s=l.get(e,t);(o>=0&&s>0||o<=0&&s<0)&&(o+=s),l=l.stackedOn}}return o},g.getValues=function(e,t,r){var a=[];u.isArray(e)||(r=t,t=e,e=this.dimensions);for(var n=0,o=e.length;n<o;n++)a.push(this.get(e[n],t,r));return a},g.hasValue=function(e){for(var t=this.dimensions,r=this._dimensionInfos,a=0,n=t.length;a<n;a++)if("ordinal"!==r[t[a]].type&&isNaN(this.get(t[a],e)))return!1;return!0},g.getDataExtent=function(e,t,r){e=this.getDimension(e);var a=this._storage[e],n=this.getDimensionInfo(e);t=n&&n.stackable&&t;var o,i=(this._extent||(this._extent={}))[e+!!t];if(i)return i;if(a){for(var l=1/0,s=-1/0,u=0,h=this.count();u<h;u++)o=this.get(e,u,t),r&&!r(o,e,u)||(o<l&&(l=o),o>s&&(s=o));return this._extent[e+!!t]=[l,s]}return[1/0,-1/0]},g.getSum=function(e,t){var r=this._storage[e],a=0;if(r)for(var n=0,o=this.count();n<o;n++){var i=this.get(e,n,t);isNaN(i)||(a+=i)}return a},g.indexOf=function(e,t){var r=this._storage,a=r[e],n=this.indices;if(a)for(var o=0,i=n.length;o<i;o++){var l=n[o];if(a[l]===t)return o}return-1},g.indexOfName=function(e){for(var t=this.indices,r=this._nameList,a=0,n=t.length;a<n;a++)if(r[t[a]]===e)return a;return-1},g.indexOfRawIndex=function(e){var t=this.indices,r=t[e];if(null!=r&&r===e)return e;for(var a=0,n=t.length-1;a<=n;){var o=(a+n)/2|0;if(t[o]<e)a=o+1;else{if(!(t[o]>e))return o;n=o-1}}return-1},g.indicesOfNearest=function(e,t,r,a){var n=this._storage,o=n[e],i=[];if(!o)return i;null==a&&(a=1/0);for(var l=Number.MAX_VALUE,s=-1,u=0,h=this.count();u<h;u++){var c=t-this.get(e,u,r),d=Math.abs(c);c<=a&&d<=l&&((d<l||c>=0&&s<0)&&(l=d,s=c,i.length=0),i.push(u))}return i},g.getRawIndex=function(e){var t=this.indices[e];return null==t?-1:t},g.getRawDataItem=function(e){return this._rawData.getItem(this.getRawIndex(e))},g.getName=function(e){return this._nameList[this.indices[e]]||""},g.getId=function(e){return this._idList[this.indices[e]]||this.getRawIndex(e)+""},g.each=function(e,t,r,a){"function"==typeof e&&(a=r,r=t,t=e,e=[]),e=u.map(o(e),this.getDimension,this);var n=[],i=e.length,l=this.indices;a=a||this;for(var s=0;s<l.length;s++)switch(i){case 0:t.call(a,s);break;case 1:t.call(a,this.get(e[0],s,r),s);break;case 2:t.call(a,this.get(e[0],s,r),this.get(e[1],s,r),s);break;default:for(var h=0;h<i;h++)n[h]=this.get(e[h],s,r);n[h]=s,t.apply(a,n)}},g.filterSelf=function(e,t,r,a){"function"==typeof e&&(a=r,r=t,t=e,e=[]),e=u.map(o(e),this.getDimension,this);var n=[],i=[],l=e.length,s=this.indices;a=a||this;for(var h=0;h<s.length;h++){var c;if(l)if(1===l)c=t.call(a,this.get(e[0],h,r),h);else{for(var d=0;d<l;d++)i[d]=this.get(e[d],h,r);i[d]=h,c=t.apply(a,i)}else c=t.call(a,h);c&&n.push(s[h])}return this.indices=n,this._extent={},this},g.mapArray=function(e,t,r,a){"function"==typeof e&&(a=r,r=t,t=e,e=[]);var n=[];return this.each(e,function(){n.push(t&&t.apply(this,arguments))},r,a),n},g.map=function(e,t,r,a){e=u.map(o(e),this.getDimension,this);var n=i(this,e),l=n.indices=this.indices,s=n._storage,h=[];return this.each(e,function(){var r=arguments[arguments.length-1],a=t&&t.apply(this,arguments);if(null!=a){"number"==typeof a&&(h[0]=a,a=h);for(var n=0;n<a.length;n++){var o=e[n],i=s[o],u=l[r];i&&(i[u]=a[n])}}},r,a),n},g.downSample=function(e,t,r,a){for(var n=i(this,[e]),o=this._storage,l=n._storage,s=this.indices,u=n.indices=[],h=[],c=[],d=Math.floor(1/t),m=l[e],p=this.count(),f=0;f<o[e].length;f++)l[e][f]=o[e][f];for(var f=0;f<p;f+=d){d>p-f&&(d=p-f,h.length=d);for(var v=0;v<d;v++){var y=s[f+v];h[v]=m[y],c[v]=y}var g=r(h),y=c[a(h,g)||0];m[y]=g,u.push(y)}return n},g.getItemModel=function(e){var t=this.hostModel;return e=this.indices[e],new h(this._rawData.getItem(e),t,t&&t.ecModel)},g.diff=function(e){var t,r=this._idList,a=e&&e._idList;return new c(e?e.indices:[],this.indices,function(e){return null!=(t=a[e])?t:"e\0\0"+e},function(e){return null!=(t=r[e])?t:"e\0\0"+e})},g.getVisual=function(e){var t=this._visual;return t&&t[e]},g.setVisual=function(e,t){if(m(e))for(var r in e)e.hasOwnProperty(r)&&this.setVisual(r,e[r]);else this._visual=this._visual||{},this._visual[e]=t},g.setLayout=function(e,t){if(m(e))for(var r in e)e.hasOwnProperty(r)&&this.setLayout(r,e[r]);else this._layout[e]=t},g.getLayout=function(e){return this._layout[e]},g.getItemLayout=function(e){return this._itemLayouts[e]},g.setItemLayout=function(e,t,r){this._itemLayouts[e]=r?u.extend(this._itemLayouts[e]||{},t):t},g.clearItemLayouts=function(){this._itemLayouts.length=0},g.getItemVisual=function(e,t,r){var a=this._itemVisuals[e],n=a&&a[t];return null!=n||r?n:this.getVisual(t)},g.setItemVisual=function(e,t,r){var a=this._itemVisuals[e]||{};if(this._itemVisuals[e]=a,m(t))for(var n in t)t.hasOwnProperty(n)&&(a[n]=t[n]);else a[t]=r},g.clearAllVisual=function(){this._visual={},this._itemVisuals=[]};var _=function(e){e.seriesIndex=this.seriesIndex,e.dataIndex=this.dataIndex,e.dataType=this.dataType};g.setItemGraphicEl=function(e,t){var r=this.hostModel;t&&(t.dataIndex=e,t.dataType=this.dataType,t.seriesIndex=r&&r.seriesIndex,"group"===t.type&&t.traverse(_,t)),this._graphicEls[e]=t},g.getItemGraphicEl=function(e){return this._graphicEls[e]},g.eachItemGraphicEl=function(e,t){u.each(this._graphicEls,function(r,a){r&&e&&e.call(t,r,a)})},g.cloneShallow=function(){var e=u.map(this.dimensions,this.getDimensionInfo,this),t=new y(e,this.hostModel);return t._storage=this._storage,a(t,this),t.indices=this.indices.slice(),this._extent&&(t._extent=u.extend({},this._extent)),t},g.wrapMethod=function(e,t){var r=this[e];"function"==typeof r&&(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(e),this[e]=function(){var e=r.apply(this,arguments);return t.apply(this,[e].concat(u.slice(arguments)))})},g.TRANSFERABLE_METHODS=["cloneShallow","downSample","map"],g.CHANGABLE_METHODS=["filterSelf"];var T=y;e.exports=T}).call(t,r(61))},function(e,t,r){"use strict";function a(e){var t=[];return n.each(c.getClassesByMainType(e),function(e){h.apply(t,e.prototype.dependencies||[])}),n.map(t,function(e){return l.parseClassType(e).main})}var n=r(0),o=r(20),i=r(251),l=r(58),s=r(11),u=r(966),h=Array.prototype.push,c=o.extend({type:"component",id:"",name:"",mainType:"",subType:"",componentIndex:0,defaultOption:null,ecModel:null,dependentModels:[],uid:null,layoutMode:null,$constructor:function(e,t,r,a){o.call(this,e,t,r,a),this.uid=i.getUID("componentModel")},init:function(e,t,r,a){this.mergeDefaultAndTheme(e,r)},mergeDefaultAndTheme:function(e,t){var r=this.layoutMode,a=r?s.getLayoutParams(e):{},o=t.getTheme();n.merge(e,o.get(this.mainType)),n.merge(e,this.getDefaultOption()),r&&s.mergeLayoutParam(e,a,r)},mergeOption:function(e,t){n.merge(this.option,e,!0);var r=this.layoutMode;r&&s.mergeLayoutParam(this.option,e,r)},optionUpdated:function(e,t){},getDefaultOption:function(){if(!l.hasOwn(this,"__defaultOption")){for(var e=[],t=this.constructor;t;){var r=t.prototype.defaultOption;r&&e.push(r),t=t.superClass}for(var a={},o=e.length-1;o>=0;o--)a=n.merge(a,e[o],!0);l.set(this,"__defaultOption",a)}return l.get(this,"__defaultOption")},getReferringComponents:function(e){return this.ecModel.queryComponents({mainType:e,index:this.get(e+"Index",!0),id:this.get(e+"Id",!0)})}});l.enableClassManagement(c,{registerWhenExtend:!0}),i.enableSubTypeDefaulter(c),i.enableTopologicalTravel(c,a),n.mixin(c,u);var d=c;e.exports=d},function(e,t,r){"use strict";var a={};a="undefined"==typeof navigator?{browser:{},os:{},node:!0,canvasSupported:!0,svgSupported:!0}:function(e){var t={},r={},a=e.match(/Firefox\/([\d.]+)/),n=e.match(/MSIE\s([\d.]+)/)||e.match(/Trident\/.+?rv:(([\d.]+))/),o=e.match(/Edge\/([\d.]+)/),i=/micromessenger/i.test(e);return a&&(r.firefox=!0,r.version=a[1]),n&&(r.ie=!0,r.version=n[1]),o&&(r.edge=!0,r.version=o[1]),i&&(r.weChat=!0),{browser:r,os:t,node:!1,canvasSupported:!!document.createElement("canvas").getContext,svgSupported:"undefined"!=typeof SVGRect,touchEventsSupported:"ontouchstart"in window&&!r.ie&&!r.edge,pointerEventsSupported:"onpointerdown"in window&&(r.edge||r.ie&&r.version>=11)}}(navigator.userAgent);var n=a;e.exports=n},function(e,t,r){"use strict";function a(e){n.call(this,e),this.path=null}var n=r(191),o=r(0),i=r(121),l=r(1198),s=r(445),u=s.prototype.getCanvasPattern,h=Math.abs,c=new i(!0);a.prototype={constructor:a,type:"path",__dirtyPath:!0,strokeContainThreshold:5,brush:function(e,t){var r=this.style,a=this.path||c,n=r.hasStroke(),o=r.hasFill(),i=r.fill,l=r.stroke,s=o&&!!i.colorStops,h=n&&!!l.colorStops,d=o&&!!i.image,m=n&&!!l.image;if(r.bind(e,this,t),this.setTransform(e),this.__dirty){var p;s&&(p=p||this.getBoundingRect(),this._fillGradient=r.getGradient(e,i,p)),h&&(p=p||this.getBoundingRect(),this._strokeGradient=r.getGradient(e,l,p))}s?e.fillStyle=this._fillGradient:d&&(e.fillStyle=u.call(i,e)),h?e.strokeStyle=this._strokeGradient:m&&(e.strokeStyle=u.call(l,e));var f=r.lineDash,v=r.lineDashOffset,y=!!e.setLineDash,g=this.getGlobalScale();a.setScale(g[0],g[1]),this.__dirtyPath||f&&!y&&n?(a.beginPath(e),f&&!y&&(a.setLineDash(f),a.setLineDashOffset(v)),this.buildPath(a,this.shape,!1),this.path&&(this.__dirtyPath=!1)):(e.beginPath(),this.path.rebuildPath(e)),o&&a.fill(e),f&&y&&(e.setLineDash(f),e.lineDashOffset=v),n&&a.stroke(e),f&&y&&e.setLineDash([]),this.restoreTransform(e),null!=r.text&&this.drawRectText(e,this.getBoundingRect())},buildPath:function(e,t,r){},createPathProxy:function(){this.path=new i},getBoundingRect:function(){var e=this._rect,t=this.style,r=!e;if(r){var a=this.path;a||(a=this.path=new i),this.__dirtyPath&&(a.beginPath(),this.buildPath(a,this.shape,!1)),e=a.getBoundingRect()}if(this._rect=e,t.hasStroke()){var n=this._rectWithStroke||(this._rectWithStroke=e.clone());if(this.__dirty||r){n.copy(e);var o=t.lineWidth,l=t.strokeNoScale?this.getLineScale():1;t.hasFill()||(o=Math.max(o,this.strokeContainThreshold||4)),l>1e-10&&(n.width+=o/l,n.height+=o/l,n.x-=o/l/2,n.y-=o/l/2)}return n}return e},contain:function(e,t){var r=this.transformCoordToLocal(e,t),a=this.getBoundingRect(),n=this.style;if(e=r[0],t=r[1],a.contain(e,t)){var o=this.path.data;if(n.hasStroke()){var i=n.lineWidth,s=n.strokeNoScale?this.getLineScale():1;if(s>1e-10&&(n.hasFill()||(i=Math.max(i,this.strokeContainThreshold)),l.containStroke(o,i/s,e,t)))return!0}if(n.hasFill())return l.contain(o,e,t)}return!1},dirty:function(e){null==e&&(e=!0),e&&(this.__dirtyPath=e,this._rect=null),this.__dirty=!0,this.__zr&&this.__zr.refresh(),this.__clipTarget&&this.__clipTarget.dirty()},animateShape:function(e){return this.animate("shape",e)},attrKV:function(e,t){"shape"===e?(this.setShape(t),this.__dirtyPath=!0,this._rect=null):n.prototype.attrKV.call(this,e,t)},setShape:function(e,t){var r=this.shape;if(r){if(o.isObject(e))for(var a in e)e.hasOwnProperty(a)&&(r[a]=e[a]);else r[e]=t;this.dirty(!0)}return this},getLineScale:function(){var e=this.transform;return e&&h(e[0]-1)>1e-10&&h(e[3]-1)>1e-10?Math.sqrt(h(e[0]*e[3]-e[2]*e[1])):1}},a.extend=function(e){var t=function(t){a.call(this,t),e.style&&this.style.extendFrom(e.style,!1);var r=e.shape;if(r){this.shape=this.shape||{};var n=this.shape;for(var o in r)!n.hasOwnProperty(o)&&r.hasOwnProperty(o)&&(n[o]=r[o])}e.init&&e.init.call(this,t)};o.inherits(t,a);for(var r in e)"style"!==r&&"shape"!==r&&(t.prototype[r]=e[r]);return t},o.inherits(a,n);var d=a;e.exports=d},function(e,t,r){"use strict";var a=r(9),n=(a.__DEV__,r(0)),o=r(25),i=r(14),l=i.formatTime,s=i.encodeHTML,u=i.addCommas,h=i.getTooltipMarker,c=r(58),d=c.set,m=c.get,p=r(10),f=r(24),v=r(376),y=r(11),g=y.getLayoutParams,_=y.mergeLayoutParam,T=f.extend({type:"series.__base__",seriesIndex:0,coordinateSystem:null,defaultOption:null,legendDataProvider:null,visualColorAccessPath:"itemStyle.normal.color",layoutMode:null,init:function(e,t,r,a){this.seriesIndex=this.componentIndex,this.mergeDefaultAndTheme(e,r);var n=this.getInitialData(e,r);d(this,"dataBeforeProcessed",n),this.restoreData()},mergeDefaultAndTheme:function(e,t){var r=this.layoutMode,a=r?g(e):{},o=this.subType;f.hasClass(o)&&(o+="Series"),n.merge(e,t.getTheme().get(this.subType)),n.merge(e,this.getDefaultOption()),p.defaultEmphasis(e.label,["show"]),this.fillDataTextStyle(e.data),r&&_(e,a,r)},mergeOption:function(e,t){e=n.merge(this.option,e,!0),this.fillDataTextStyle(e.data);var r=this.layoutMode;r&&_(this.option,e,r);var a=this.getInitialData(e,t);a&&(d(this,"data",a),d(this,"dataBeforeProcessed",a.cloneShallow()))},fillDataTextStyle:function(e){if(e)for(var t=["show"],r=0;r<e.length;r++)e[r]&&e[r].label&&p.defaultEmphasis(e[r].label,t)},getInitialData:function(){},getData:function(e){var t=m(this,"data");return null==e?t:t.getLinkedData(e)},setData:function(e){d(this,"data",e)},getRawData:function(){return m(this,"dataBeforeProcessed")},coordDimToDataDim:function(e){return p.coordDimToDataDim(this.getData(),e)},dataDimToCoordDim:function(e){return p.dataDimToCoordDim(this.getData(),e)},getBaseAxis:function(){var e=this.coordinateSystem;return e&&e.getBaseAxis&&e.getBaseAxis()},formatTooltip:function(e,t,r){var a=m(this,"data"),o=this.getRawValue(e),i=n.isArray(o)?function(r){function o(e,r){var n=a.getDimensionInfo(r);if(n&&!1!==n.otherDims.tooltip){var o=n.type,c=(i?"- "+(n.tooltipName||n.name)+": ":"")+("ordinal"===o?e+"":"time"===o?t?"":l("yyyy/MM/dd hh:mm:ss",e):u(e));c&&h.push(s(c))}}var i=n.reduce(r,function(e,t,r){var n=a.getDimensionInfo(r);return e|=n&&!1!==n.tooltip&&null!=n.tooltipName},0),h=[],c=p.otherDimToDataDim(a,"tooltip");return c.length?n.each(c,function(t){o(a.get(t,e),t)}):n.each(r,o),(i?"<br/>":"")+h.join(i?"<br/>":", ")}(o):s(u(o)),c=a.getName(e),d=a.getItemVisual(e,"color");n.isObject(d)&&d.colorStops&&(d=(d.colorStops[0]||{}).color),d=d||"transparent";var f=h(d),v=this.name;return"\0-"===v&&(v=""),v=v?s(v)+(t?": ":"<br/>"):"",t?f+v+i:v+f+(c?s(c)+": "+i:i)},isAnimationEnabled:function(){if(o.node)return!1;var e=this.getShallow("animation");return e&&this.getData().count()>this.getShallow("animationThreshold")&&(e=!1),e},restoreData:function(){d(this,"data",m(this,"dataBeforeProcessed").cloneShallow())},getColorFromPalette:function(e,t){var r=this.ecModel,a=v.getColorFromPalette.call(this,e,t);return a||(a=r.getColorFromPalette(e,t)),a},getAxisTooltipData:null,getTooltipPosition:null});n.mixin(T,p.dataFormatMixin),n.mixin(T,v);var x=T;e.exports=x},function(e,t,r){"use strict";var a=function(e,t,r,a,n,o,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[r,a,n,o,i,l],h=0;s=new Error(t.replace(/%s/g,function(){return u[h++]})),s.name="Invariant Violation"}throw s.framesToPop=1,s}};e.exports=a},function(e,t,r){"use strict";e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t,r){"use strict";var a=r(17),n=r(85);e.exports=r(16)?function(e,t,r){return a.f(e,t,n(1,r))}:function(e,t,r){return e[t]=r,e}},function(e,t,r){"use strict";var a=r(6),n=r(30),o=r(33),i=r(89)("src"),l=Function.toString,s=(""+l).split("toString");r(42).inspectSource=function(e){return l.call(e)},(e.exports=function(e,t,r,l){var u="function"==typeof r;u&&(o(r,"name")||n(r,"name",t)),e[t]!==r&&(u&&(o(r,i)||n(r,i,e[t]?""+e[t]:s.join(String(t)))),e===a?e[t]=r:l?e[t]?e[t]=r:n(e,t,r):(delete e[t],n(e,t,r)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[i]||l.call(this)})},function(e,t,r){"use strict";var a=r(1),n=r(7),o=r(49),i=/"/g,l=function(e,t,r,a){var n=String(o(e)),l="<"+t;return""!==r&&(l+=" "+r+'="'+String(a).replace(i,"&quot;")+'"'),l+">"+n+"</"+t+">"};e.exports=function(e,t){var r={};r[e]=t(l),a(a.P+a.F*n(function(){var t=""[e]('"');return t!==t.toLowerCase()||t.split('"').length>3}),"String",r)}},function(e,t,r){"use strict";var a={}.hasOwnProperty;e.exports=function(e,t){return a.call(e,t)}},function(e,t,r){"use strict";var a=r(127),n=r(85),o=r(36),i=r(52),l=r(33),s=r(302),u=Object.getOwnPropertyDescriptor;t.f=r(16)?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 n(!a.f.call(e,t),e[t])}},function(e,t,r){"use strict";var a=r(33),n=r(22),o=r(227)("IE_PROTO"),i=Object.prototype;e.exports=Object.getPrototypeOf||function(e){return e=n(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,r){"use strict";var a=r(126),n=r(49);e.exports=function(e){return a(n(e))}},function(e,t,r){"use strict";function a(e,t){var r,a,n,o=e.type,i=t.getMin(),l=t.getMax(),s=null!=i,u=null!=l,h=e.getExtent();return"ordinal"===o?r=(t.get("data")||[]).length:(a=t.get("boundaryGap"),c.isArray(a)||(a=[a||0,a||0]),"boolean"==typeof a[0]&&(a=[0,0]),a[0]=v.parsePercent(a[0],1),a[1]=v.parsePercent(a[1],1),n=h[1]-h[0]||Math.abs(h[0])),null==i&&(i="ordinal"===o?r?0:NaN:h[0]-a[0]*n),null==l&&(l="ordinal"===o?r?r-1:NaN:h[1]+a[1]*n),"dataMin"===i?i=h[0]:"function"==typeof i&&(i=i({min:h[0],max:h[1]})),"dataMax"===l?l=h[1]:"function"==typeof l&&(l=l({min:h[0],max:h[1]})),(null==i||!isFinite(i))&&(i=NaN),(null==l||!isFinite(l))&&(l=NaN),e.setBlank(c.eqNaN(i)||c.eqNaN(l)),t.getNeedCrossZero()&&(i>0&&l>0&&!s&&(i=0),i<0&&l<0&&!u&&(l=0)),[i,l]}function n(e,t){var r=a(e,t),n=null!=t.getMin(),o=null!=t.getMax(),i=t.get("splitNumber");"log"===e.type&&(e.base=t.get("logBase"));var l=e.type;e.setExtent(r[0],r[1]),e.niceExtent({splitNumber:i,fixMin:n,fixMax:o,minInterval:"interval"===l||"time"===l?t.get("minInterval"):null,maxInterval:"interval"===l||"time"===l?t.get("maxInterval"):null});var s=t.get("interval");null!=s&&e.setInterval&&e.setInterval(s)}function o(e,t){if(t=t||e.get("type"))switch(t){case"category":return new m(e.getCategories(),[1/0,-1/0]);case"value":return new p;default:return(f.getClass(t)||p).create(e)}}function i(e){var t=e.scale.getExtent(),r=t[0],a=t[1];return!(r>0&&a>0||r<0&&a<0)}function l(e,t,r,a,n){var o,i=0,l=0,s=(a-n)/180*Math.PI,u=1;t.length>40&&(u=Math.floor(t.length/40));for(var h=0;h<e.length;h+=u){var c=e[h],m=d.getBoundingRect(t[h],r,"center","top");m.x+=c*Math.cos(s),m.y+=c*Math.sin(s),m.width*=1.3,m.height*=1.3,o?o.intersect(m)?(l++,i=Math.max(i,l)):(o.union(m),l=0):o=m.clone()}return 0===i&&u>1?u:(i+1)*u-1}function s(e,t){var r=e.scale,a=r.getTicksLabels(),n=r.getTicks();return"string"==typeof t?(t=function(e){return function(t){return e.replace("{value}",null!=t?t:"")}}(t),c.map(a,t)):"function"==typeof t?c.map(n,function(r,a){return t(u(e,r),a)},this):a}function u(e,t){return"category"===e.type?e.scale.getLabel(t):t}var h=r(9),c=(h.__DEV__,r(0)),d=r(54),m=r(974),p=r(170),f=r(171),v=r(4);r(975),r(973),t.getScaleExtent=a,t.niceScaleExtent=n,t.createScaleByModel=o,t.ifAxisCrossZero=i,t.getAxisLabelInterval=l,t.getFormattedLabels=s,t.getAxisRawValue=u},function(e,t,r){"use strict";function a(e,t){if("image"!==this.type){var r=this.style,a=this.shape;a&&"line"===a.symbolType?r.stroke=e:this.__isEmptyBrush?(r.stroke=e,r.fill=t||"#fff"):(r.fill&&(r.fill=e),r.stroke&&(r.stroke=e)),this.dirty(!1)}}function n(e,t,r,n,o,s,u){var h=0===e.indexOf("empty");h&&(e=e.substr(5,1).toLowerCase()+e.substr(6));var c;return c=0===e.indexOf("image://")?i.makeImage(e.slice(8),new l(t,r,n,o),u?"center":"cover"):0===e.indexOf("path://")?i.makePath(e.slice(7),{},new l(t,r,n,o),u?"center":"cover"):new f({shape:{symbolType:e,x:t,y:r,width:n,height:o}}),c.__isEmptyBrush=h,c.setColor=a,c.setColor(s),c}var o=r(0),i=r(3),l=r(19),s=i.extendShape({type:"triangle",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(e,t){var r=t.cx,a=t.cy,n=t.width/2,o=t.height/2;e.moveTo(r,a-o),e.lineTo(r+n,a+o),e.lineTo(r-n,a+o),e.closePath()}}),u=i.extendShape({type:"diamond",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(e,t){var r=t.cx,a=t.cy,n=t.width/2,o=t.height/2;e.moveTo(r,a-o),e.lineTo(r+n,a),e.lineTo(r,a+o),e.lineTo(r-n,a),e.closePath()}}),h=i.extendShape({type:"pin",shape:{x:0,y:0,width:0,height:0},buildPath:function(e,t){var r=t.x,a=t.y,n=t.width/5*3,o=Math.max(n,t.height),i=n/2,l=i*i/(o-i),s=a-o+i+l,u=Math.asin(l/i),h=Math.cos(u)*i,c=Math.sin(u),d=Math.cos(u),m=.6*i,p=.7*i;e.moveTo(r-h,s+l),e.arc(r,s,i,Math.PI-u,2*Math.PI+u),e.bezierCurveTo(r+h-c*m,s+l+d*m,r,a-p,r,a),e.bezierCurveTo(r,a-p,r-h+c*m,s+l+d*m,r-h,s+l),e.closePath()}}),c=i.extendShape({type:"arrow",shape:{x:0,y:0,width:0,height:0},buildPath:function(e,t){var r=t.height,a=t.width,n=t.x,o=t.y,i=a/3*2;e.moveTo(n,o),e.lineTo(n+i,o+r),e.lineTo(n,o+r/4*3),e.lineTo(n-i,o+r),e.lineTo(n,o),e.closePath()}}),d={line:i.Line,rect:i.Rect,roundRect:i.Rect,square:i.Rect,circle:i.Circle,diamond:u,pin:h,arrow:c,triangle:s},m={line:function(e,t,r,a,n){n.x1=e,n.y1=t+a/2,n.x2=e+r,n.y2=t+a/2},rect:function(e,t,r,a,n){n.x=e,n.y=t,n.width=r,n.height=a},roundRect:function(e,t,r,a,n){n.x=e,n.y=t,n.width=r,n.height=a,n.r=Math.min(r,a)/4},square:function(e,t,r,a,n){var o=Math.min(r,a);n.x=e,n.y=t,n.width=o,n.height=o},circle:function(e,t,r,a,n){n.cx=e+r/2,n.cy=t+a/2,n.r=Math.min(r,a)/2},diamond:function(e,t,r,a,n){n.cx=e+r/2,n.cy=t+a/2,n.width=r,n.height=a},pin:function(e,t,r,a,n){n.x=e+r/2,n.y=t+a/2,n.width=r,n.height=a},arrow:function(e,t,r,a,n){n.x=e+r/2,n.y=t+a/2,n.width=r,n.height=a},triangle:function(e,t,r,a,n){n.cx=e+r/2,n.cy=t+a/2,n.width=r,n.height=a}},p={};o.each(d,function(e,t){p[t]=new e});var f=i.extendShape({type:"symbol",shape:{symbolType:"",x:0,y:0,width:0,height:0},beforeBrush:function(){var e=this.style;"pin"===this.shape.symbolType&&"inside"===e.textPosition&&(e.textPosition=["50%","40%"],e.textAlign="center",e.textVerticalAlign="middle")},buildPath:function(e,t,r){var a=t.symbolType,n=p[a];"none"!==t.symbolType&&(n||(a="rect",n=p[a]),m[a](t.x,t.y,t.width,t.height,n.shape),n.buildPath(e,n.shape,r))}});t.createSymbol=n},function(e,t,r){"use strict";var a=Array.isArray;e.exports=a},function(e,t,r){"use strict";function a(){var e=new c(6);return n(e),e}function n(e){return e[0]=1,e[1]=0,e[2]=0,e[3]=1,e[4]=0,e[5]=0,e}function o(e,t){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}function i(e,t,r){var a=t[0]*r[0]+t[2]*r[1],n=t[1]*r[0]+t[3]*r[1],o=t[0]*r[2]+t[2]*r[3],i=t[1]*r[2]+t[3]*r[3],l=t[0]*r[4]+t[2]*r[5]+t[4],s=t[1]*r[4]+t[3]*r[5]+t[5];return e[0]=a,e[1]=n,e[2]=o,e[3]=i,e[4]=l,e[5]=s,e}function l(e,t,r){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4]+r[0],e[5]=t[5]+r[1],e}function s(e,t,r){var a=t[0],n=t[2],o=t[4],i=t[1],l=t[3],s=t[5],u=Math.sin(r),h=Math.cos(r);return e[0]=a*h+i*u,e[1]=-a*u+i*h,e[2]=n*h+l*u,e[3]=-n*u+h*l,e[4]=h*o+u*s,e[5]=h*s-u*o,e}function u(e,t,r){var a=r[0],n=r[1];return e[0]=t[0]*a,e[1]=t[1]*n,e[2]=t[2]*a,e[3]=t[3]*n,e[4]=t[4]*a,e[5]=t[5]*n,e}function h(e,t){var r=t[0],a=t[2],n=t[4],o=t[1],i=t[3],l=t[5],s=r*i-o*a;return s?(s=1/s,e[0]=i*s,e[1]=-o*s,e[2]=-a*s,e[3]=r*s,e[4]=(a*l-i*n)*s,e[5]=(o*n-r*l)*s,e):null}var c="undefined"==typeof Float32Array?Array:Float32Array;t.create=a,t.identity=n,t.copy=o,t.mul=i,t.translate=l,t.rotate=s,t.scale=u,t.invert=h},function(e,t,r){"use strict";var a={}.toString;e.exports=function(e){return a.call(e).slice(8,-1)}},function(e,t,r){"use strict";var a=e.exports={version:"2.5.7"};"number"==typeof __e&&(__e=a)},function(e,t,r){"use strict";var a=r(29);e.exports=function(e,t,r){if(a(e),void 0===t)return e;switch(r){case 1:return function(r){return e.call(t,r)};case 2:return function(r,a){return e.call(t,r,a)};case 3:return function(r,a,n){return e.call(t,r,a,n)}}return function(){return e.apply(t,arguments)}}},function(e,t,r){"use strict";var a=r(7);e.exports=function(e,t){return!!e&&a(function(){t?e.call(null,function(){},1):e.call(null)})}},function(e,t,r){"use strict";function a(e,t,r){function a(e,t,r){c[t]?e.otherDims[t]=r:(e.coordDim=t,e.coordDimIndex=r,v.set(t,!0))}function i(e,t,r){if(r||null!=t.get(e)){for(var a=0;null!=t.get(e+a);)a++;e+=a}return t.set(e,!0),e}t=t||[],r=r||{},e=(e||[]).slice();var m=(r.dimsDef||[]).slice(),p=o.createHashMap(r.encodeDef),f=o.createHashMap(),v=o.createHashMap(),y=[],g=r.dimCount;if(null==g){var _=n(t[0]);g=Math.max(o.isArray(_)&&_.length||1,e.length,m.length),s(e,function(e){var t=e.dimsDef;t&&(g=Math.max(g,t.length))})}for(var T=0;T<g;T++){var x=u(m[T])?{name:m[T]}:m[T]||{},w=x.name,N=y[T]={otherDims:{}};null!=w&&null==f.get(w)&&(N.name=N.tooltipName=w,f.set(w,T)),null!=x.type&&(N.type=x.type)}p.each(function(e,t){e=p.set(t,l(e).slice()),s(e,function(r,n){u(r)&&(r=f.get(r)),null!=r&&r<g&&(e[n]=r,a(y[r],t,n))})});var b=0;s(e,function(e,t){var r,e,n,i;u(e)?(r=e,e={}):(r=e.name,e=o.clone(e),n=e.dimsDef,i=e.otherDims,e.name=e.coordDim=e.coordDimIndex=e.dimsDef=e.otherDims=null);var c=l(p.get(r));if(!c.length)for(var d=0;d<(n&&n.length||1);d++){for(;b<y.length&&null!=y[b].coordDim;)b++;b<y.length&&c.push(b++)}s(c,function(t,o){var l=y[t];a(h(l,e),r,o),null==l.name&&n&&(l.name=l.tooltipName=n[o]),i&&h(l.otherDims,i)})});for(var L=r.extraPrefix||"value",S=0;S<g;S++){var N=y[S]=y[S]||{};null==N.coordDim&&(N.coordDim=i(L,v,r.extraFromZero),N.coordDimIndex=0,N.isExtraCoord=!0),null==N.name&&(N.name=i(N.coordDim,f)),null==N.type&&d(t,S)&&(N.type="ordinal")}return y}function n(e){return o.isArray(e)?e:o.isObject(e)?e.value:e}var o=r(0),i=r(10),l=i.normalizeToArray,s=o.each,u=o.isString,h=o.defaults,c={tooltip:1,label:1,itemName:1},d=a.guessOrdinal=function(e,t){for(var r=0,a=e.length;r<a;r++){var i=n(e[r]);if(!o.isArray(i))return!1;var i=i[t];if(null!=i&&isFinite(i)&&""!==i)return!1;if(u(i)&&"-"!==i)return!0}return!1},m=a;e.exports=m},function(e,t,r){"use strict";var a=e.exports={version:"2.5.7"};"number"==typeof __e&&(__e=a)},function(e,t,r){"use strict";var a=r(205)("wks"),n=r(146),o=r(64).Symbol,i="function"==typeof o;(e.exports=function(e){return a[e]||(a[e]=i&&o[e]||(i?o:n)("Symbol."+e))}).store=a},function(e,t,r){"use strict";var a=r(43),n=r(126),o=r(22),i=r(18),l=r(212);e.exports=function(e,t){var r=1==e,s=2==e,u=3==e,h=4==e,c=6==e,d=5==e||c,m=t||l;return function(t,l,p){for(var f,v,y=o(t),g=n(y),_=a(l,p,3),T=i(g.length),x=0,w=r?m(t,T):s?m(t,0):void 0;T>x;x++)if((d||x in g)&&(f=g[x],v=_(f,x,y),e))if(r)w[x]=v;else if(v)switch(e){case 3:return!0;case 5:return f;case 6:return x;case 2:w.push(f)}else if(h)return!1;return c?-1:u||h?h:w}}},function(e,t,r){"use strict";e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,r){"use strict";var a=r(1),n=r(42),o=r(7);e.exports=function(e,t){var r=(n.Object||{})[e]||Object[e],i={};i[e]=t(r),a(a.S+a.F*o(function(){r(1)}),"Object",i)}},function(e,t,r){"use strict";var a=Math.ceil,n=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?n:a)(e)}},function(e,t,r){"use strict";var a=r(8);e.exports=function(e,t){if(!a(e))return e;var r,n;if(t&&"function"==typeof(r=e.toString)&&!a(n=r.call(e)))return n;if("function"==typeof(r=e.valueOf)&&!a(n=r.call(e)))return n;if(!t&&"function"==typeof(r=e.toString)&&!a(n=r.call(e)))return n;throw TypeError("Can't convert object to primitive value")}},function(e,t,r){"use strict";function a(){this._coordinateSystems=[]}var n=r(0),o={};a.prototype={constructor:a,create:function(e,t){var r=[];n.each(o,function(a,n){var o=a.create(e,t);r=r.concat(o||[])}),this._coordinateSystems=r},update:function(e,t){n.each(this._coordinateSystems,function(r){r.update&&r.update(e,t)})},getCoordinateSystems:function(){return this._coordinateSystems.slice()}},a.register=function(e,t){o[e]=t},a.get=function(e){return o[e]};var i=a;e.exports=i},function(e,t,r){"use strict";function a(e,t){C[e]=t}function n(e,t){t=t||z;var r=e+":"+t;if(D[r])return D[r];for(var a=(e+"").split("\n"),n=0,o=0,i=a.length;o<i;o++)n=Math.max(v(a[o],t).width,n);return M>A&&(M=0,D={}),M++,D[r]=n,n}function o(e,t,r,a,n,o,s){return o?l(e,t,r,a,n,o,s):i(e,t,r,a,n,s)}function i(e,t,r,a,o,i){var l=y(e,t,o,i),h=n(e,t);o&&(h+=o[1]+o[3]);var c=l.outerHeight,d=s(0,h,r),m=u(0,c,a),p=new x(d,m,h,c);return p.lineHeight=l.lineHeight,p}function l(e,t,r,a,n,o,i){var l=g(e,{rich:o,truncate:i,font:t,textAlign:r,textPadding:n}),h=l.outerWidth,c=l.outerHeight,d=s(0,h,r),m=u(0,c,a);return new x(d,m,h,c)}function s(e,t,r){return"right"===r?e-=t:"center"===r&&(e-=t/2),e}function u(e,t,r){return"middle"===r?e-=t/2:"bottom"===r&&(e-=t),e}function h(e,t,r){var a=t.x,n=t.y,o=t.height,i=t.width,l=o/2,s="left",u="top";switch(e){case"left":a-=r,n+=l,s="right",u="middle";break;case"right":a+=r+i,n+=l,u="middle";break;case"top":a+=i/2,n-=r,s="center",u="bottom";break;case"bottom":a+=i/2,n+=o+r,s="center";break;case"inside":a+=i/2,n+=l,s="center",u="middle";break;case"insideLeft":a+=r,n+=l,u="middle";break;case"insideRight":a+=i-r,n+=l,s="right",u="middle";break;case"insideTop":a+=i/2,n+=r,s="center";break;case"insideBottom":a+=i/2,n+=o-r,s="center",u="bottom";break;case"insideTopLeft":a+=r,n+=r;break;case"insideTopRight":a+=i-r,n+=r,s="right";break;case"insideBottomLeft":a+=r,n+=o-r,u="bottom";break;case"insideBottomRight":a+=i-r,n+=o-r,s="right",u="bottom"}return{x:a,y:n,textAlign:s,textVerticalAlign:u}}function c(e,t,r,a,n){if(!t)return"";var o=(e+"").split("\n");n=d(t,r,a,n);for(var i=0,l=o.length;i<l;i++)o[i]=m(o[i],n);return o.join("\n")}function d(e,t,r,a){a=L({},a),a.font=t;var r=S(r,"...");a.maxIterations=S(a.maxIterations,2);var o=a.minChar=S(a.minChar,0);a.cnCharWidth=n("国",t);var i=a.ascCharWidth=n("a",t);a.placeholder=S(a.placeholder,"");for(var l=e=Math.max(0,e-1),s=0;s<o&&l>=i;s++)l-=i;var u=n(r);return u>l&&(r="",u=0),l=e-u,a.ellipsis=r,a.ellipsisWidth=u,a.contentWidth=l,a.containerWidth=e,a}function m(e,t){var r=t.containerWidth,a=t.font,o=t.contentWidth;if(!r)return"";var i=n(e,a);if(i<=r)return e;for(var l=0;;l++){if(i<=o||l>=t.maxIterations){e+=t.ellipsis;break}var s=0===l?p(e,o,t.ascCharWidth,t.cnCharWidth):i>0?Math.floor(e.length*o/i):0;e=e.substr(0,s),i=n(e,a)}return""===e&&(e=t.placeholder),e}function p(e,t,r,a){for(var n=0,o=0,i=e.length;o<i&&n<t;o++){var l=e.charCodeAt(o);n+=0<=l&&l<=127?r:a}return o}function f(e){return n("国",e)}function v(e,t){return C.measureText(e,t)}function y(e,t,r,a){null!=e&&(e+="");var n=f(t),o=e?e.split("\n"):[],i=o.length*n,l=i;if(r&&(l+=r[0]+r[2]),e&&a){var s=a.outerHeight,u=a.outerWidth;if(null!=s&&l>s)e="",o=[];else if(null!=u)for(var h=d(u-(r?r[1]+r[3]:0),t,a.ellipsis,{minChar:a.minChar,placeholder:a.placeholder}),c=0,p=o.length;c<p;c++)o[c]=m(o[c],h)}return{lines:o,height:i,outerHeight:l,lineHeight:n}}function g(e,t){var r={lines:[],width:0,height:0};if(null!=e&&(e+=""),!e)return r;for(var a,o=I.lastIndex=0;null!=(a=I.exec(e));){var i=a.index;i>o&&_(r,e.substring(o,i)),_(r,a[2],a[1]),o=I.lastIndex}o<e.length&&_(r,e.substring(o,e.length));var l=r.lines,s=0,u=0,h=[],d=t.textPadding,m=t.truncate,p=m&&m.outerWidth,v=m&&m.outerHeight;d&&(null!=p&&(p-=d[1]+d[3]),null!=v&&(v-=d[0]+d[2]));for(var y=0;y<l.length;y++){for(var g=l[y],T=0,x=0,N=0;N<g.tokens.length;N++){var b=g.tokens[N],L=b.styleName&&t.rich[b.styleName]||{},D=b.textPadding=L.textPadding,M=b.font=L.font||t.font,A=b.textHeight=S(L.textHeight,f(M));if(D&&(A+=D[0]+D[2]),b.height=A,b.lineHeight=k(L.textLineHeight,t.textLineHeight,A),b.textAlign=L&&L.textAlign||t.textAlign,b.textVerticalAlign=L&&L.textVerticalAlign||"middle",null!=v&&s+b.lineHeight>v)return{lines:[],width:0,height:0};b.textWidth=n(b.text,M);var z=L.textWidth,C=null==z||"auto"===z;if("string"==typeof z&&"%"===z.charAt(z.length-1))b.percentWidth=z,h.push(b),z=0;else{if(C){z=b.textWidth;var R=L.textBackgroundColor,E=R&&R.image;E&&(E=w.findExistImage(E),w.isImageReady(E)&&(z=Math.max(z,E.width*A/E.height)))}var P=D?D[1]+D[3]:0;z+=P;var O=null!=p?p-x:null;null!=O&&O<z&&(!C||O<P?(b.text="",b.textWidth=z=0):(b.text=c(b.text,O-P,M,m.ellipsis,{minChar:m.minChar}),b.textWidth=n(b.text,M),z=b.textWidth+P))}x+=b.width=z,L&&(T=Math.max(T,b.lineHeight))}g.width=x,g.lineHeight=T,s+=T,u=Math.max(u,x)}r.outerWidth=r.width=S(t.textWidth,u),r.outerHeight=r.height=S(t.textHeight,s),d&&(r.outerWidth+=d[1]+d[3],r.outerHeight+=d[0]+d[2]);for(var y=0;y<h.length;y++){var b=h[y],F=b.percentWidth;b.width=parseInt(F,10)/100*u}return r}function _(e,t,r){for(var a=""===t,n=t.split("\n"),o=e.lines,i=0;i<n.length;i++){var l=n[i],s={styleName:r,text:l,isLineHolder:!l&&!a};if(i)o.push({tokens:[s]});else{var u=(o[o.length-1]||(o[0]={tokens:[]})).tokens,h=u.length;1===h&&u[0].isLineHolder?u[0]=s:(l||!h||a)&&u.push(s)}}}function T(e){return(e.fontSize||e.fontFamily)&&[e.fontStyle,e.fontWeight,(e.fontSize||12)+"px",e.fontFamily||"sans-serif"].join(" ")||e.textFont||e.font}var x=r(19),w=r(276),N=r(0),b=N.getContext,L=N.extend,S=N.retrieve2,k=N.retrieve3,D={},M=0,A=5e3,I=/\{([a-zA-Z0-9_]+)\|([^}]*)\}/g,z="12px sans-serif",C={};C.measureText=function(e,t){var r=b();return r.font=t||z,r.measureText(e)},t.DEFAULT_FONT=z,t.$override=a,t.getWidth=n,t.getBoundingRect=o,t.adjustTextX=s,t.adjustTextY=u,t.adjustTextPositionOnRect=h,t.truncateText=c,t.getLineHeight=f,t.measureText=v,t.parsePlainText=y,t.parseRichText=g,t.makeFont=T},function(e,t,r){"use strict";var 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},n=r(323),o=r(1),i=r(158)("metadata"),l=i.store||(i.store=new(r(326))),s=function(e,t,r){var a=l.get(e);if(!a){if(!r)return;l.set(e,a=new n)}var o=a.get(t);if(!o){if(!r)return;a.set(t,o=new n)}return o},u=function(e,t,r){var a=s(t,r,!1);return void 0!==a&&a.has(e)},h=function(e,t,r){var a=s(t,r,!1);return void 0===a?void 0:a.get(e)},c=function(e,t,r,a){s(r,a,!0).set(e,t)},d=function(e,t){var r=s(e,t,!1),a=[];return r&&r.forEach(function(e,t){a.push(t)}),a},m=function(e){return void 0===e||"symbol"==(void 0===e?"undefined":a(e))?e:String(e)},p=function(e){o(o.S,"Reflect",e)};e.exports={store:l,map:s,has:u,get:h,set:c,keys:d,key:m,exp:p}},function(e,t,r){"use strict";var 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};if(r(16)){var n=r(67),o=r(6),i=r(7),l=r(1),s=r(160),u=r(233),h=r(43),c=r(80),d=r(85),m=r(30),p=r(86),f=r(51),v=r(18),y=r(321),g=r(88),_=r(52),T=r(33),x=r(125),w=r(8),N=r(22),b=r(219),L=r(82),S=r(35),k=r(83).f,D=r(235),M=r(89),A=r(13),I=r(48),z=r(147),C=r(159),R=r(236),E=r(107),P=r(153),O=r(87),F=r(211),j=r(294),B=r(17),H=r(34),V=B.f,G=H.f,W=o.RangeError,U=o.TypeError,q=o.Uint8Array,Y=Array.prototype,Z=u.ArrayBuffer,K=u.DataView,J=I(0),X=I(2),$=I(3),Q=I(4),ee=I(5),te=I(6),re=z(!0),ae=z(!1),ne=R.values,oe=R.keys,ie=R.entries,le=Y.lastIndexOf,se=Y.reduce,ue=Y.reduceRight,he=Y.join,ce=Y.sort,de=Y.slice,me=Y.toString,pe=Y.toLocaleString,fe=A("iterator"),ve=A("toStringTag"),ye=M("typed_constructor"),ge=M("def_constructor"),_e=s.CONSTR,Te=s.TYPED,xe=s.VIEW,we=I(1,function(e,t){return ke(C(e,e[ge]),t)}),Ne=i(function(){return 1===new q(new Uint16Array([1]).buffer)[0]}),be=!!q&&!!q.prototype.set&&i(function(){new q(1).set({})}),Le=function(e,t){var r=f(e);if(r<0||r%t)throw W("Wrong offset!");return r},Se=function(e){if(w(e)&&Te in e)return e;throw U(e+" is not a typed array!")},ke=function(e,t){if(!(w(e)&&ye in e))throw U("It is not a typed array constructor!");return new e(t)},De=function(e,t){return Me(C(e,e[ge]),t)},Me=function(e,t){for(var r=0,a=t.length,n=ke(e,a);a>r;)n[r]=t[r++];return n},Ae=function(e,t,r){V(e,t,{get:function(){return this._d[r]}})},Ie=function(e){var t,r,a,n,o,i,l=N(e),s=arguments.length,u=s>1?arguments[1]:void 0,c=void 0!==u,d=D(l);if(void 0!=d&&!b(d)){for(i=d.call(l),a=[],t=0;!(o=i.next()).done;t++)a.push(o.value);l=a}for(c&&s>2&&(u=h(u,arguments[2],2)),t=0,r=v(l.length),n=ke(this,r);r>t;t++)n[t]=c?u(l[t],t):l[t];return n},ze=function(){for(var e=0,t=arguments.length,r=ke(this,t);t>e;)r[e]=arguments[e++];return r},Ce=!!q&&i(function(){pe.call(new q(1))}),Re=function(){return pe.apply(Ce?de.call(Se(this)):Se(this),arguments)},Ee={copyWithin:function(e,t){return j.call(Se(this),e,t,arguments.length>2?arguments[2]:void 0)},every:function(e){return Q(Se(this),e,arguments.length>1?arguments[1]:void 0)},fill:function(e){return F.apply(Se(this),arguments)},filter:function(e){return De(this,X(Se(this),e,arguments.length>1?arguments[1]:void 0))},find:function(e){return ee(Se(this),e,arguments.length>1?arguments[1]:void 0)},findIndex:function(e){return te(Se(this),e,arguments.length>1?arguments[1]:void 0)},forEach:function(e){J(Se(this),e,arguments.length>1?arguments[1]:void 0)},indexOf:function(e){return ae(Se(this),e,arguments.length>1?arguments[1]:void 0)},includes:function(e){return re(Se(this),e,arguments.length>1?arguments[1]:void 0)},join:function(e){return he.apply(Se(this),arguments)},lastIndexOf:function(e){return le.apply(Se(this),arguments)},map:function(e){return we(Se(this),e,arguments.length>1?arguments[1]:void 0)},reduce:function(e){return se.apply(Se(this),arguments)},reduceRight:function(e){return ue.apply(Se(this),arguments)},reverse:function(){for(var e,t=this,r=Se(t).length,a=Math.floor(r/2),n=0;n<a;)e=t[n],t[n++]=t[--r],t[r]=e;return t},some:function(e){return $(Se(this),e,arguments.length>1?arguments[1]:void 0)},sort:function(e){return ce.call(Se(this),e)},subarray:function(e,t){var r=Se(this),a=r.length,n=g(e,a);return new(C(r,r[ge]))(r.buffer,r.byteOffset+n*r.BYTES_PER_ELEMENT,v((void 0===t?a:g(t,a))-n))}},Pe=function(e,t){return De(this,de.call(Se(this),e,t))},Oe=function(e){Se(this);var t=Le(arguments[1],1),r=this.length,a=N(e),n=v(a.length),o=0;if(n+t>r)throw W("Wrong length!");for(;o<n;)this[t+o]=a[o++]},Fe={entries:function(){return ie.call(Se(this))},keys:function(){return oe.call(Se(this))},values:function(){return ne.call(Se(this))}},je=function(e,t){return w(e)&&e[Te]&&"symbol"!=(void 0===t?"undefined":a(t))&&t in e&&String(+t)==String(t)},Be=function(e,t){return je(e,t=_(t,!0))?d(2,e[t]):G(e,t)},He=function(e,t,r){return!(je(e,t=_(t,!0))&&w(r)&&T(r,"value"))||T(r,"get")||T(r,"set")||r.configurable||T(r,"writable")&&!r.writable||T(r,"enumerable")&&!r.enumerable?V(e,t,r):(e[t]=r.value,e)};_e||(H.f=Be,B.f=He),l(l.S+l.F*!_e,"Object",{getOwnPropertyDescriptor:Be,defineProperty:He}),i(function(){me.call({})})&&(me=pe=function(){return he.call(this)});var Ve=p({},Ee);p(Ve,Fe),m(Ve,fe,Fe.values),p(Ve,{slice:Pe,set:Oe,constructor:function(){},toString:me,toLocaleString:Re}),Ae(Ve,"buffer","b"),Ae(Ve,"byteOffset","o"),Ae(Ve,"byteLength","l"),Ae(Ve,"length","e"),V(Ve,ve,{get:function(){return this[Te]}}),e.exports=function(e,t,r,a){a=!!a;var u=e+(a?"Clamped":"")+"Array",h="get"+e,d="set"+e,p=o[u],f=p||{},g=p&&S(p),_=!p||!s.ABV,T={},N=p&&p.prototype,b=function(e,r){var a=e._d;return a.v[h](r*t+a.o,Ne)},D=function(e,r,n){var o=e._d;a&&(n=(n=Math.round(n))<0?0:n>255?255:255&n),o.v[d](r*t+o.o,n,Ne)},M=function(e,t){V(e,t,{get:function(){return b(this,t)},set:function(e){return D(this,t,e)},enumerable:!0})};_?(p=r(function(e,r,a,n){c(e,p,u,"_d");var o,i,l,s,h=0,d=0;if(w(r)){if(!(r instanceof Z||"ArrayBuffer"==(s=x(r))||"SharedArrayBuffer"==s))return Te in r?Me(p,r):Ie.call(p,r);o=r,d=Le(a,t);var f=r.byteLength;if(void 0===n){if(f%t)throw W("Wrong length!");if((i=f-d)<0)throw W("Wrong length!")}else if((i=v(n)*t)+d>f)throw W("Wrong length!");l=i/t}else l=y(r),i=l*t,o=new Z(i);for(m(e,"_d",{b:o,o:d,l:i,e:l,v:new K(o)});h<l;)M(e,h++)}),N=p.prototype=L(Ve),m(N,"constructor",p)):i(function(){p(1)})&&i(function(){new p(-1)})&&P(function(e){new p,new p(null),new p(1.5),new p(e)},!0)||(p=r(function(e,r,a,n){c(e,p,u);var o;return w(r)?r instanceof Z||"ArrayBuffer"==(o=x(r))||"SharedArrayBuffer"==o?void 0!==n?new f(r,Le(a,t),n):void 0!==a?new f(r,Le(a,t)):new f(r):Te in r?Me(p,r):Ie.call(p,r):new f(y(r))}),J(g!==Function.prototype?k(f).concat(k(g)):k(f),function(e){e in p||m(p,e,f[e])}),p.prototype=N,n||(N.constructor=p));var A=N[fe],I=!!A&&("values"==A.name||void 0==A.name),z=Fe.values;m(p,ye,!0),m(N,Te,u),m(N,xe,!0),m(N,ge,p),(a?new p(1)[ve]==u:ve in N)||V(N,ve,{get:function(){return u}}),T[u]=p,l(l.G+l.W+l.F*(p!=f),T),l(l.S,u,{BYTES_PER_ELEMENT:t}),l(l.S+l.F*i(function(){f.of.call(p,1)}),u,{from:Ie,of:ze}),"BYTES_PER_ELEMENT"in N||m(N,"BYTES_PER_ELEMENT",t),l(l.P,u,Ee),O(u),l(l.P+l.F*be,u,{set:Oe}),l(l.P+l.F*!I,u,Fe),n||N.toString==me||(N.toString=me),l(l.P+l.F*i(function(){new p(1).slice()}),u,{slice:Pe}),l(l.P+l.F*(i(function(){return[1,2].toLocaleString()!=new p([1,2]).toLocaleString()})||!i(function(){N.toLocaleString.call([1,2])})),u,{toLocaleString:Re}),E[u]=I?A:z,n||I||m(N,fe,z)}}else e.exports=function(){}},function(e,t,r){"use strict";var a=r(15),n=r(722);if(void 0===a)throw Error("create-react-class could not find the React object. If you are using script tags, make sure that React is being loaded before create-react-class.");var o=(new a.Component).updater;e.exports=n(a.Component,a.isValidElement,o)},function(e,t,r){"use strict";function a(e,t,r){return e[y+t]=r}function n(e,t){return e[y+t]}function o(e,t){return e.hasOwnProperty(y+t)}function i(e){var t={main:"",sub:""};return e&&(e=e.split(f),t.main=e[0]||"",t.sub=e[1]||""),t}function l(e){p.assert(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(e),'componentType "'+e+'" illegal')}function s(e,t){e.$constructor=e,e.extend=function(e){var t=this,r=function(){e.$constructor?e.$constructor.apply(this,arguments):t.apply(this,arguments)};return p.extend(r.prototype,e),r.extend=this.extend,r.superCall=u,r.superApply=h,p.inherits(r,this),r.superClass=t,r}}function u(e,t){var r=p.slice(arguments,2);return this.superClass.prototype[t].apply(e,r)}function h(e,t,r){return this.superClass.prototype[t].apply(e,r)}function c(e,t){function r(e){var t=a[e.main];return t&&t[v]||(t=a[e.main]={},t[v]=!0),t}t=t||{};var a={};if(e.registerClass=function(e,t){if(t)if(l(t),t=i(t),t.sub){if(t.sub!==v){var n=r(t);n[t.sub]=e}}else a[t.main]=e;return e},e.getClass=function(e,t,r){var n=a[e];if(n&&n[v]&&(n=t?n[t]:null),r&&!n)throw new Error(t?"Component "+e+"."+(t||"")+" not exists. Load it first.":e+".type should be specified.");return n},e.getClassesByMainType=function(e){e=i(e);var t=[],r=a[e.main];return r&&r[v]?p.each(r,function(e,r){r!==v&&t.push(e)}):t.push(r),t},e.hasClass=function(e){return e=i(e),!!a[e.main]},e.getAllClassMainTypes=function(){var e=[];return p.each(a,function(t,r){e.push(r)}),e},e.hasSubTypes=function(e){e=i(e);var t=a[e.main];return t&&t[v]},e.parseClassType=i,t.registerWhenExtend){var n=e.extend;n&&(e.extend=function(t){var r=n.call(this,t);return e.registerClass(r,t.type)})}return e}function d(e,t){}var m=r(9),p=(m.__DEV__,r(0)),f=".",v="___EC__COMPONENT__CONTAINER___",y="\0ec_\0";t.set=a,t.get=n,t.hasOwn=o,t.parseClassType=i,t.enableClassExtend=s,t.enableClassManagement=c,t.setReadOnly=d},function(e,t,r){"use strict";var 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},n=r(394),o="object"==("undefined"==typeof self?"undefined":a(self))&&self&&self.Object===Object&&self,i=n||o||Function("return this")();e.exports=i},function(e,t,r){"use strict";function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t,r){if(!t(e))throw d("error","uncaught at check",r),new Error(r)}function o(e,t){var r=e.indexOf(t);r>=0&&e.splice(r,1)}function i(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],t=p({},e),r=new Promise(function(e,r){t.resolve=e,t.reject=r});return t.promise=r,t}function l(e){for(var t=[],r=0;r<e;r++)t.push(i());return t}function s(e){var t=arguments.length<=1||void 0===arguments[1]||arguments[1],r=void 0,a=new Promise(function(a){r=setTimeout(function(){return a(t)},e)});return a[g]=function(){return clearTimeout(r)},a}function u(){var e,t=!0,r=void 0,n=void 0;return e={},a(e,y,!0),a(e,"isRunning",function(){return t}),a(e,"result",function(){return r}),a(e,"error",function(){return n}),a(e,"setRunning",function(e){return t=e}),a(e,"setResult",function(e){return r=e}),a(e,"setError",function(e){return n=e}),e}function h(){var e=arguments.length<=0||void 0===arguments[0]?0:arguments[0];return function(){return++e}}function c(e){var t=arguments.length<=1||void 0===arguments[1]?x:arguments[1],r=arguments.length<=2||void 0===arguments[2]?"":arguments[2],a={name:r,next:e,throw:t,return:w};return"undefined"!=typeof Symbol&&(a[Symbol.iterator]=function(){return a}),a}function d(e,t,r){"undefined"==typeof window?console.log("redux-saga "+e+": "+t+"\n"+(r&&r.stack||r)):console[e].call(console,t,r)}var m="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};Object.defineProperty(t,"__esModule",{value:!0});var p=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},f="function"==typeof Symbol&&"symbol"===m(Symbol.iterator)?function(e){return void 0===e?"undefined":m(e)}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":void 0===e?"undefined":m(e)};t.check=n,t.remove=o,t.deferred=i,t.arrayOfDeffered=l,t.delay=s,t.createMockTask=u,t.autoInc=h,t.makeIterator=c,t.log=d;var v=t.sym=function(e){return"@@redux-saga/"+e},y=t.TASK=v("TASK"),g=(t.MATCH=v("MATCH"),t.CANCEL=v("cancelPromise")),_=t.konst=function(e){return function(){return e}},T=(t.kTrue=_(!0),t.kFalse=_(!1),t.noop=function(){},t.ident=function(e){return e},t.is={undef:function(e){return null===e||void 0===e},notUndef:function(e){return null!==e&&void 0!==e},func:function(e){return"function"==typeof e},number:function(e){return"number"==typeof e},array:Array.isArray,promise:function(e){return e&&T.func(e.then)},iterator:function(e){return e&&T.func(e.next)&&T.func(e.throw)},task:function(e){return e&&e[y]},take:function(e){return e&&T.func(e.take)},put:function(e){return e&&T.func(e.put)},observable:function(e){return e&&T.func(e.subscribe)},buffer:function(e){return e&&T.func(e.isEmpty)&&T.func(e.take)&&T.func(e.put)},pattern:function(e){return e&&("string"==typeof e||"symbol"===(void 0===e?"undefined":f(e))||T.func(e)||T.array(e))}}),x=function(e){throw e},w=function(e){return{value:e,done:!0}};t.internalErr=function(e){return new Error("\n redux-saga: Error checking hooks detected an inconsisten state. This is likely a bug\n in redux-saga code and not yours. Thanks for reporting this in the project's github repo.\n Error: "+e+"\n")}},function(e,t,r){"use strict";var a,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};a=function(){return this}();try{a=a||Function("return this")()||(0,eval)("this")}catch(e){"object"===("undefined"==typeof window?"undefined":n(window))&&(a=window)}e.exports=a},function(e,t,r){"use strict";function a(e){return e.getBoundingClientRect?e.getBoundingClientRect():{left:0,top:0}}function n(e,t,r,a){return r=r||{},a||!c.canvasSupported?o(e,t,r):c.browser.firefox&&null!=t.layerX&&t.layerX!==t.offsetX?(r.zrX=t.layerX,r.zrY=t.layerY):null!=t.offsetX?(r.zrX=t.offsetX,r.zrY=t.offsetY):o(e,t,r),r}function o(e,t,r){var n=a(e);r.zrX=t.clientX-n.left,r.zrY=t.clientY-n.top}function i(e,t,r){if(t=t||window.event,null!=t.zrX)return t;var a=t.type;if(a&&a.indexOf("touch")>=0){var o="touchend"!=a?t.targetTouches[0]:t.changedTouches[0];o&&n(e,o,t,r)}else n(e,t,t,r),t.zrDelta=t.wheelDelta?t.wheelDelta/120:-(t.detail||0)/3;var i=t.button;return null==t.which&&void 0!==i&&m.test(t.type)&&(t.which=1&i?1:2&i?3:4&i?2:0),t}function l(e,t,r){d?e.addEventListener(t,r):e.attachEvent("on"+t,r)}function s(e,t,r){d?e.removeEventListener(t,r):e.detachEvent("on"+t,r)}function u(e){return e.which>1}var h=r(98);t.Dispatcher=h;var c=r(25),d="undefined"!=typeof window&&!!window.addEventListener,m=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,p=d?function(e){e.preventDefault(),e.stopPropagation(),e.cancelBubble=!0}:function(e){e.returnValue=!1,e.cancelBubble=!0};t.clientToLocal=n,t.normalizeEvent=i,t.addEventListener=l,t.removeEventListener=s,t.stop=p,t.notLeftMouse=u},function(e,t,r){"use strict";function a(e){return e=Math.round(e),e<0?0:e>255?255:e}function n(e){return e=Math.round(e),e<0?0:e>360?360:e}function o(e){return e<0?0:e>1?1:e}function i(e){return a(e.length&&"%"===e.charAt(e.length-1)?parseFloat(e)/100*255:parseInt(e,10))}function l(e){return o(e.length&&"%"===e.charAt(e.length-1)?parseFloat(e)/100:parseFloat(e))}function s(e,t,r){return r<0?r+=1:r>1&&(r-=1),6*r<1?e+(t-e)*r*6:2*r<1?t:3*r<2?e+(t-e)*(2/3-r)*6:e}function u(e,t,r){return e+(t-e)*r}function h(e,t,r,a,n){return e[0]=t,e[1]=r,e[2]=a,e[3]=n,e}function c(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e}function d(e,t){S&&c(S,t),S=L.put(e,S||t.slice())}function m(e,t){if(e){t=t||[];var r=L.get(e);if(r)return c(t,r);e+="";var a=e.replace(/ /g,"").toLowerCase();if(a in b)return c(t,b[a]),d(e,t),t;if("#"!==a.charAt(0)){var n=a.indexOf("("),o=a.indexOf(")");if(-1!==n&&o+1===a.length){var s=a.substr(0,n),u=a.substr(n+1,o-(n+1)).split(","),m=1;switch(s){case"rgba":if(4!==u.length)return void h(t,0,0,0,1);m=l(u.pop());case"rgb":return 3!==u.length?void h(t,0,0,0,1):(h(t,i(u[0]),i(u[1]),i(u[2]),m),d(e,t),t);case"hsla":return 4!==u.length?void h(t,0,0,0,1):(u[3]=l(u[3]),p(u,t),d(e,t),t);case"hsl":return 3!==u.length?void h(t,0,0,0,1):(p(u,t),d(e,t),t);default:return}}h(t,0,0,0,1)}else{if(4===a.length){var f=parseInt(a.substr(1),16);return f>=0&&f<=4095?(h(t,(3840&f)>>4|(3840&f)>>8,240&f|(240&f)>>4,15&f|(15&f)<<4,1),d(e,t),t):void h(t,0,0,0,1)}if(7===a.length){var f=parseInt(a.substr(1),16);return f>=0&&f<=16777215?(h(t,(16711680&f)>>16,(65280&f)>>8,255&f,1),d(e,t),t):void h(t,0,0,0,1)}}}}function p(e,t){var r=(parseFloat(e[0])%360+360)%360/360,n=l(e[1]),o=l(e[2]),i=o<=.5?o*(n+1):o+n-o*n,u=2*o-i;return t=t||[],h(t,a(255*s(u,i,r+1/3)),a(255*s(u,i,r)),a(255*s(u,i,r-1/3)),1),4===e.length&&(t[3]=e[3]),t}function f(e){if(e){var t,r,a=e[0]/255,n=e[1]/255,o=e[2]/255,i=Math.min(a,n,o),l=Math.max(a,n,o),s=l-i,u=(l+i)/2;if(0===s)t=0,r=0;else{r=u<.5?s/(l+i):s/(2-l-i);var h=((l-a)/6+s/2)/s,c=((l-n)/6+s/2)/s,d=((l-o)/6+s/2)/s;a===l?t=d-c:n===l?t=1/3+h-d:o===l&&(t=2/3+c-h),t<0&&(t+=1),t>1&&(t-=1)}var m=[360*t,r,u];return null!=e[3]&&m.push(e[3]),m}}function v(e,t){var r=m(e);if(r){for(var a=0;a<3;a++)r[a]=t<0?r[a]*(1-t)|0:(255-r[a])*t+r[a]|0;return w(r,4===r.length?"rgba":"rgb")}}function y(e){var t=m(e);if(t)return((1<<24)+(t[0]<<16)+(t[1]<<8)+ +t[2]).toString(16).slice(1)}function g(e,t,r){if(t&&t.length&&e>=0&&e<=1){r=r||[];var n=e*(t.length-1),i=Math.floor(n),l=Math.ceil(n),s=t[i],h=t[l],c=n-i;return r[0]=a(u(s[0],h[0],c)),r[1]=a(u(s[1],h[1],c)),r[2]=a(u(s[2],h[2],c)),r[3]=o(u(s[3],h[3],c)),r}}function _(e,t,r){if(t&&t.length&&e>=0&&e<=1){var n=e*(t.length-1),i=Math.floor(n),l=Math.ceil(n),s=m(t[i]),h=m(t[l]),c=n-i,d=w([a(u(s[0],h[0],c)),a(u(s[1],h[1],c)),a(u(s[2],h[2],c)),o(u(s[3],h[3],c))],"rgba");return r?{color:d,leftIndex:i,rightIndex:l,value:n}:d}}function T(e,t,r,a){if(e=m(e))return e=f(e),null!=t&&(e[0]=n(t)),null!=r&&(e[1]=l(r)),null!=a&&(e[2]=l(a)),w(p(e),"rgba")}function x(e,t){if((e=m(e))&&null!=t)return e[3]=o(t),w(e,"rgba")}function w(e,t){if(e&&e.length){var r=e[0]+","+e[1]+","+e[2];return"rgba"!==t&&"hsva"!==t&&"hsla"!==t||(r+=","+e[3]),t+"("+r+")"}}var N=r(442),b={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]},L=new N(20),S=null,k=g,D=_;t.parse=m,t.lift=v,t.toHex=y,t.fastLerp=g,t.fastMapToColor=k,t.lerp=_,t.mapToColor=D,t.modifyHSL=T,t.modifyAlpha=x,t.stringify=w},function(e,t,r){"use strict";var a=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=a)},function(e,t,r){"use strict";var a=r(103),n=r(284),o=r(208),i=Object.defineProperty;t.f=r(77)?Object.defineProperty:function(e,t,r){if(a(e),t=o(t,!0),a(r),n)try{return i(e,t,r)}catch(e){}if("get"in r||"set"in r)throw TypeError("Accessors not supported!");return"value"in r&&(e[t]=r.value),e}},function(e,t,r){"use strict";var a=r(13)("unscopables"),n=Array.prototype;void 0==n[a]&&r(30)(n,a,{}),e.exports=function(e){n[a][e]=!0}},function(e,t,r){"use strict";e.exports=!1},function(e,t,r){"use strict";var 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},n=r(89)("meta"),o=r(8),i=r(33),l=r(17).f,s=0,u=Object.isExtensible||function(){return!0},h=!r(7)(function(){return u(Object.preventExtensions({}))}),c=function(e){l(e,n,{value:{i:"O"+ ++s,w:{}}})},d=function(e,t){if(!o(e))return"symbol"==(void 0===e?"undefined":a(e))?e:("string"==typeof e?"S":"P")+e;if(!i(e,n)){if(!u(e))return"F";if(!t)return"E";c(e)}return e[n].i},m=function(e,t){if(!i(e,n)){if(!u(e))return!0;if(!t)return!1;c(e)}return e[n].w},p=function(e){return h&&f.NEED&&u(e)&&!i(e,n)&&c(e),e},f=e.exports={KEY:n,NEED:!1,fastKey:d,getWeak:m,onFreeze:p}},function(e,t,r){"use strict";function a(e){for(var t=0;t<e.length&&null==e[t];)t++;return e[t]}function n(e){var t=a(e);return null!=t&&!h.isArray(p(t))}function o(e,t,r){e=e||[];var a=t.get("coordinateSystem"),o=g[a],i=y.get(a),l={encodeDef:t.get("encode"),dimsDef:t.get("dimensions")},u=o&&o(e,t,r,l),m=u&&u.dimensions;m||(m=i&&(i.getDimensionsInfo?i.getDimensionsInfo():i.dimensions.slice())||["x","y"],m=d(m,e,l));var _=u?u.categoryIndex:-1,T=new c(m,t),x=s(u,e),w={},N=_>=0&&n(e)?function(e,t,r,a){return v(e)&&(T.hasItemOption=!0),a===_?r:f(p(e),m[a])}:function(e,t,r,a){var n=p(e),o=f(n&&n[a],m[a]);v(e)&&(T.hasItemOption=!0);var i=u&&u.categoryAxesModels;return i&&i[t]&&"string"==typeof o&&(w[t]=w[t]||i[t].getCategories(),(o=h.indexOf(w[t],o))<0&&!isNaN(o)&&(o=+o)),o};return T.hasItemOption=!1,T.initData(e,x,N),T}function i(e){return"category"!==e&&"time"!==e}function l(e){return"category"===e?"ordinal":"time"===e?"time":"float"}function s(e,t){var r,a=[],n=e&&e.dimensions[e.categoryIndex];if(n&&(r=e.categoryAxesModels[n.name]),r){var o=r.getCategories();if(o){var i=t.length;if(h.isArray(t[0])&&t[0].length>1){a=[];for(var l=0;l<i;l++)a[l]=o[t[l][e.categoryIndex||0]]}else a=o.slice(0)}}return a}var u=r(9),h=(u.__DEV__,r(0)),c=r(23),d=r(45),m=r(10),p=m.getDataItemValue,f=m.converDataValue,v=m.isDataItemOption,y=r(53),g={cartesian2d:function(e,t,r,a){var n=h.map(["xAxis","yAxis"],function(e){return r.queryComponents({mainType:e,index:t.get(e+"Index"),id:t.get(e+"Id")})[0]}),o=n[0],s=n[1],u=o.get("type"),c=s.get("type"),m=[{name:"x",type:l(u),stackable:i(u)},{name:"y",type:l(c),stackable:i(c)}],p="category"===u,f="category"===c;m=d(m,e,a);var v={};return p&&(v.x=o),f&&(v.y=s),{dimensions:m,categoryIndex:p?0:f?1:-1,categoryAxesModels:v}},singleAxis:function(e,t,r,a){var n=r.queryComponents({mainType:"singleAxis",index:t.get("singleAxisIndex"),id:t.get("singleAxisId")})[0],o=n.get("type"),s="category"===o,u=[{name:"single",type:l(o),stackable:i(o)}];u=d(u,e,a);var h={};return s&&(h.single=n),{dimensions:u,categoryIndex:s?0:-1,categoryAxesModels:h}},polar:function(e,t,r,a){var n=r.queryComponents({mainType:"polar",index:t.get("polarIndex"),id:t.get("polarId")})[0],o=n.findAxisModel("angleAxis"),s=n.findAxisModel("radiusAxis"),u=s.get("type"),h=o.get("type"),c=[{name:"radius",type:l(u),stackable:i(u)},{name:"angle",type:l(h),stackable:i(h)}],m="category"===h,p="category"===u;c=d(c,e,a);var f={};return p&&(f.radius=s),m&&(f.angle=o),{dimensions:c,categoryIndex:m?1:p?0:-1,categoryAxesModels:f}},geo:function(e,t,r,a){return{dimensions:d([{name:"lng"},{name:"lat"}],e,a)}}},_=o;e.exports=_},function(e,t,r){"use strict";function a(e,t){o[e]=t}function n(e){return o[e]}var o={};t.register=a,t.get=n},function(e,t,r){"use strict";function a(e,t){var r=e[1]-e[0],a=t,n=r/a/2;e[0]+=n,e[1]-=n}var n=r(0),o=r(4),i=r(37),l=o.linearMap,s=[0,1],u=function(e,t,r){this.dim=e,this.scale=t,this._extent=r||[0,0],this.inverse=!1,this.onBand=!1,this._labelInterval};u.prototype={constructor:u,contain:function(e){var t=this._extent,r=Math.min(t[0],t[1]),a=Math.max(t[0],t[1]);return e>=r&&e<=a},containData:function(e){return this.contain(this.dataToCoord(e))},getExtent:function(){return this._extent.slice()},getPixelPrecision:function(e){return o.getPixelPrecision(e||this.scale.getExtent(),this._extent)},setExtent:function(e,t){var r=this._extent;r[0]=e,r[1]=t},dataToCoord:function(e,t){var r=this._extent,n=this.scale;return e=n.normalize(e),this.onBand&&"ordinal"===n.type&&(r=r.slice(),a(r,n.count())),l(e,s,r,t)},coordToData:function(e,t){var r=this._extent,n=this.scale;this.onBand&&"ordinal"===n.type&&(r=r.slice(),a(r,n.count()));var o=l(e,r,s,t);return this.scale.scale(o)},pointToData:function(e,t){},getTicksCoords:function(e){if(this.onBand&&!e){for(var t=this.getBands(),r=[],a=0;a<t.length;a++)r.push(t[a][0]);return t[a-1]&&r.push(t[a-1][1]),r}return n.map(this.scale.getTicks(),this.dataToCoord,this)},getLabelsCoords:function(){return n.map(this.scale.getTicks(),this.dataToCoord,this)},getBands:function(){for(var e=this.getExtent(),t=[],r=this.scale.count(),a=e[0],n=e[1],o=n-a,i=0;i<r;i++)t.push([o*i/r+a,o*(i+1)/r+a]);return t},getBandWidth:function(){var e=this._extent,t=this.scale.getExtent(),r=t[1]-t[0]+(this.onBand?1:0);0===r&&(r=1);var a=Math.abs(e[1]-e[0]);return Math.abs(a)/r},isHorizontal:null,getRotate:null,getLabelInterval:function(){var e=this._labelInterval;if(!e){var t=this.model,r=t.getModel("axisLabel");e=r.get("interval"),"category"!==this.type||null!=e&&"auto"!==e||(e=i.getAxisLabelInterval(n.map(this.scale.getTicks(),this.dataToCoord,this),t.getFormattedLabels(),r.getFont(),this.getRotate?this.getRotate():this.isHorizontal&&!this.isHorizontal()?90:0,r.get("rotate"))),this._labelInterval=e}return e}};var h=u;e.exports=h},function(e,t,r){"use strict";function a(){this.group=new l,this.uid=s.getUID("viewChart")}function n(e,t){if(e&&(e.trigger(t),"group"===e.type))for(var r=0;r<e.childCount();r++)n(e.childAt(r),t)}function o(e,t,r){var a=h.queryDataIndex(e,t);null!=a?i.each(h.normalizeToArray(a),function(t){n(e.getItemGraphicEl(t),r)}):e.eachItemGraphicEl(function(e){n(e,r)})}var i=r(0),l=r(190),s=r(251),u=r(58),h=r(10);a.prototype={type:"chart",init:function(e,t){},render:function(e,t,r,a){},highlight:function(e,t,r,a){o(e.getData(),a,"emphasis")},downplay:function(e,t,r,a){o(e.getData(),a,"normal")},remove:function(e,t){this.group.removeAll()},dispose:function(){}};var c=a.prototype;c.updateView=c.updateLayout=c.updateVisual=function(e,t,r,a){this.render(e,t,r,a)},u.enableClassExtend(a,["dispose"]),u.enableClassManagement(a,{registerWhenExtend:!0});var d=a;e.exports=d},function(e,t,r){"use strict";t.__esModule=!0,t.createPath=t.parsePath=t.getQueryStringValueFromPath=t.stripQueryStringValueFromPath=t.addQueryStringValueToPath=void 0;var a=r(95),n=(function(e){e&&e.__esModule}(a),t.addQueryStringValueToPath=function(e,t,r){var a=o(e),n=a.pathname,l=a.search,s=a.hash;return i({pathname:n,search:l+(-1===l.indexOf("?")?"?":"&")+t+"="+r,hash:s})},t.stripQueryStringValueFromPath=function(e,t){var r=o(e),a=r.pathname,n=r.search,l=r.hash;return i({pathname:a,search:n.replace(new RegExp("([?&])"+t+"=[a-zA-Z0-9]+(&?)"),function(e,t,r){return"?"===t?t:r}),hash:l})},t.getQueryStringValueFromPath=function(e,t){var r=o(e),a=r.search,n=a.match(new RegExp("[?&]"+t+"=([a-zA-Z0-9]+)"));return n&&n[1]},function(e){var t=e.match(/^(https?:)?\/\/[^\/]*/);return null==t?e:e.substring(t[0].length)}),o=t.parsePath=function(e){var t=n(e),r="",a="",o=t.indexOf("#");-1!==o&&(a=t.substring(o),t=t.substring(0,o));var i=t.indexOf("?");return-1!==i&&(r=t.substring(i),t=t.substring(0,i)),""===t&&(t="/"),{pathname:t,search:r,hash:a}},i=t.createPath=function(e){if(null==e||"string"==typeof e)return e;var t=e.basename,r=e.pathname,a=e.search,n=e.hash,o=(t||"")+r;return a&&"?"!==a&&(o+=a),n&&(o+=n),o}},function(e,t,r){"use strict";function a(e){return null==e||c.default.isValidElement(e)}function n(e){return a(e)||Array.isArray(e)&&e.every(a)}function o(e,t){return u({},e,t)}function i(e){var t=e.type,r=o(t.defaultProps,e.props);if(r.children){var a=l(r.children,r);a.length&&(r.childRoutes=a),delete r.children}return r}function l(e,t){var r=[];return c.default.Children.forEach(e,function(e){if(c.default.isValidElement(e))if(e.type.createRouteFromReactElement){var a=e.type.createRouteFromReactElement(e,t);a&&r.push(a)}else r.push(i(e))}),r}function s(e){return n(e)?e=l(e):e&&!Array.isArray(e)&&(e=[e]),e}t.__esModule=!0;var u=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e};t.isReactChildren=n,t.createRouteFromReactElement=i,t.createRoutesFromReactChildren=l,t.createRoutes=s;var h=r(15),c=function(e){return e&&e.__esModule?e:{default:e}}(h)},function(e,t,r){"use strict";function a(e){return e>-w&&e<w}function n(e){return e>w||e<-w}function o(e,t,r,a,n){var o=1-n;return o*o*(o*e+3*n*t)+n*n*(n*a+3*o*r)}function i(e,t,r,a,n){var o=1-n;return 3*(((t-e)*o+2*(r-t)*n)*o+(a-r)*n*n)}function l(e,t,r,n,o,i){var l=n+3*(t-r)-e,s=3*(r-2*t+e),u=3*(t-e),h=e-o,c=s*s-3*l*u,d=s*u-9*l*h,m=u*u-3*s*h,p=0;if(a(c)&&a(d))if(a(s))i[0]=0;else{var f=-u/s;f>=0&&f<=1&&(i[p++]=f)}else{var v=d*d-4*c*m;if(a(v)){var y=d/c,f=-s/l+y,g=-y/2;f>=0&&f<=1&&(i[p++]=f),g>=0&&g<=1&&(i[p++]=g)}else if(v>0){var _=x(v),w=c*s+1.5*l*(-d+_),N=c*s+1.5*l*(-d-_);w=w<0?-T(-w,L):T(w,L),N=N<0?-T(-N,L):T(N,L);var f=(-s-(w+N))/(3*l);f>=0&&f<=1&&(i[p++]=f)}else{var S=(2*c*s-3*l*d)/(2*x(c*c*c)),k=Math.acos(S)/3,D=x(c),M=Math.cos(k),f=(-s-2*D*M)/(3*l),g=(-s+D*(M+b*Math.sin(k)))/(3*l),A=(-s+D*(M-b*Math.sin(k)))/(3*l);f>=0&&f<=1&&(i[p++]=f),g>=0&&g<=1&&(i[p++]=g),A>=0&&A<=1&&(i[p++]=A)}}return p}function s(e,t,r,o,i){var l=6*r-12*t+6*e,s=9*t+3*o-3*e-9*r,u=3*t-3*e,h=0;if(a(s)){if(n(l)){var c=-u/l;c>=0&&c<=1&&(i[h++]=c)}}else{var d=l*l-4*s*u;if(a(d))i[0]=-l/(2*s);else if(d>0){var m=x(d),c=(-l+m)/(2*s),p=(-l-m)/(2*s);c>=0&&c<=1&&(i[h++]=c),p>=0&&p<=1&&(i[h++]=p)}}return h}function u(e,t,r,a,n,o){var i=(t-e)*n+e,l=(r-t)*n+t,s=(a-r)*n+r,u=(l-i)*n+i,h=(s-l)*n+l,c=(h-u)*n+u;o[0]=e,o[1]=i,o[2]=u,o[3]=c,o[4]=c,o[5]=h,o[6]=s,o[7]=a}function h(e,t,r,a,n,i,l,s,u,h,c){var d,m,p,f,v,y=.005,g=1/0;S[0]=u,S[1]=h;for(var T=0;T<1;T+=.05)k[0]=o(e,r,n,l,T),k[1]=o(t,a,i,s,T),(f=_(S,k))<g&&(d=T,g=f);g=1/0;for(var w=0;w<32&&!(y<N);w++)m=d-y,p=d+y,k[0]=o(e,r,n,l,m),k[1]=o(t,a,i,s,m),f=_(k,S),m>=0&&f<g?(d=m,g=f):(D[0]=o(e,r,n,l,p),D[1]=o(t,a,i,s,p),v=_(D,S),p<=1&&v<g?(d=p,g=v):y*=.5);return c&&(c[0]=o(e,r,n,l,d),c[1]=o(t,a,i,s,d)),x(g)}function c(e,t,r,a){var n=1-a;return n*(n*e+2*a*t)+a*a*r}function d(e,t,r,a){return 2*((1-a)*(t-e)+a*(r-t))}function m(e,t,r,o,i){var l=e-2*t+r,s=2*(t-e),u=e-o,h=0;if(a(l)){if(n(s)){var c=-u/s;c>=0&&c<=1&&(i[h++]=c)}}else{var d=s*s-4*l*u;if(a(d)){var c=-s/(2*l);c>=0&&c<=1&&(i[h++]=c)}else if(d>0){var m=x(d),c=(-s+m)/(2*l),p=(-s-m)/(2*l);c>=0&&c<=1&&(i[h++]=c),p>=0&&p<=1&&(i[h++]=p)}}return h}function p(e,t,r){var a=e+r-2*t;return 0===a?.5:(e-t)/a}function f(e,t,r,a,n){var o=(t-e)*a+e,i=(r-t)*a+t,l=(i-o)*a+o;n[0]=e,n[1]=o,n[2]=l,n[3]=l,n[4]=i,n[5]=r}function v(e,t,r,a,n,o,i,l,s){var u,h=.005,d=1/0;S[0]=i,S[1]=l;for(var m=0;m<1;m+=.05){k[0]=c(e,r,n,m),k[1]=c(t,a,o,m);var p=_(S,k);p<d&&(u=m,d=p)}d=1/0;for(var f=0;f<32&&!(h<N);f++){var v=u-h,y=u+h;k[0]=c(e,r,n,v),k[1]=c(t,a,o,v);var p=_(k,S);if(v>=0&&p<d)u=v,d=p;else{D[0]=c(e,r,n,y),D[1]=c(t,a,o,y);var g=_(D,S);y<=1&&g<d?(u=y,d=g):h*=.5}}return s&&(s[0]=c(e,r,n,u),s[1]=c(t,a,o,u)),x(d)}var y=r(12),g=y.create,_=y.distSquare,T=Math.pow,x=Math.sqrt,w=1e-8,N=1e-4,b=x(3),L=1/3,S=g(),k=g(),D=g();t.cubicAt=o,t.cubicDerivativeAt=i,t.cubicRootAt=l,t.cubicExtrema=s,t.cubicSubdivide=u,t.cubicProjectPoint=h,t.quadraticAt=c,t.quadraticDerivativeAt=d,t.quadraticRootAt=m,t.quadraticExtremum=p,t.quadraticSubdivide=f,t.quadraticProjectPoint=v},function(e,t,r){"use strict";t.__esModule=!0;var a=r(472),n=function(e){return e&&e.__esModule?e:{default:e}}(a);t.default=n.default||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e}},function(e,t,r){"use strict";e.exports=!r(122)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t,r){"use strict";var a=r(64),n=r(46),o=r(198),i=r(104),l=r(79),s=function e(t,r,s){var u,h,c,d=t&e.F,m=t&e.G,p=t&e.S,f=t&e.P,v=t&e.B,y=t&e.W,g=m?n:n[r]||(n[r]={}),_=g.prototype,T=m?a:p?a[r]:(a[r]||{}).prototype;m&&(s=r);for(u in s)(h=!d&&T&&void 0!==T[u])&&l(g,u)||(c=h?T[u]:s[u],g[u]=m&&"function"!=typeof T[u]?s[u]:v&&h?o(c,a):y&&T[u]==c?function(e){var t=function(t,r,a){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,r)}return new e(t,r,a)}return e.apply(this,arguments)};return t.prototype=e.prototype,t}(c):f&&"function"==typeof c?o(Function.call,c):c,f&&((g.virtual||(g.virtual={}))[u]=c,t&e.R&&_&&!_[u]&&i(_,u,c)))};s.F=1,s.G=2,s.S=4,s.P=8,s.B=16,s.W=32,s.U=64,s.R=128,e.exports=s},function(e,t,r){"use strict";var a={}.hasOwnProperty;e.exports=function(e,t){return a.call(e,t)}},function(e,t,r){"use strict";e.exports=function(e,t,r,a){if(!(e instanceof t)||void 0!==a&&a in e)throw TypeError(r+": incorrect invocation!");return e}},function(e,t,r){"use strict";var a=r(43),n=r(305),o=r(219),i=r(5),l=r(18),s=r(235),u={},h={},c=e.exports=function(e,t,r,c,d){var m,p,f,v,y=d?function(){return e}:s(e),g=a(r,c,t?2:1),_=0;if("function"!=typeof y)throw TypeError(e+" is not iterable!");if(o(y)){for(m=l(e.length);m>_;_++)if((v=t?g(i(p=e[_])[0],p[1]):g(e[_]))===u||v===h)return v}else for(f=y.call(e);!(p=f.next()).done;)if((v=n(f,g,p.value,t))===u||v===h)return v};c.BREAK=u,c.RETURN=h},function(e,t,r){"use strict";var a=r(5),n=r(311),o=r(215),i=r(227)("IE_PROTO"),l=function(){},s=function(){var e,t=r(214)("iframe"),a=o.length;for(t.style.display="none",r(217).appendChild(t),t.src="javascript:",e=t.contentWindow.document,e.open(),e.write("<script>document.F=Object<\/script>"),e.close(),s=e.F;a--;)delete s.prototype[o[a]];return s()};e.exports=Object.create||function(e,t){var r;return null!==e?(l.prototype=a(e),r=new l,l.prototype=null,r[i]=e):r=s(),void 0===t?r:n(r,t)}},function(e,t,r){"use strict";var a=r(313),n=r(215).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return a(e,n)}},function(e,t,r){"use strict";var a=r(313),n=r(215);e.exports=Object.keys||function(e){return a(e,n)}},function(e,t,r){"use strict";e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,r){"use strict";var a=r(31);e.exports=function(e,t,r){for(var n in t)a(e,n,t[n],r);return e}},function(e,t,r){"use strict";var a=r(6),n=r(17),o=r(16),i=r(13)("species");e.exports=function(e){var t=a[e];o&&t&&!t[i]&&n.f(t,i,{configurable:!0,get:function(){return this}})}},function(e,t,r){"use strict";var a=r(51),n=Math.max,o=Math.min;e.exports=function(e,t){return e=a(e),e<0?n(e+t,0):o(e,t)}},function(e,t,r){"use strict";var a=0,n=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++a+n).toString(36))}},function(e,t,r){"use strict";function a(e){var t={componentType:e.mainType};return t[e.mainType+"Index"]=e.componentIndex,t}function n(e,t,r,a){var n,o,i=w(r-e.rotation),l=a[0]>a[1],s="start"===t&&!l||"start"!==t&&l;return x(i-D/2)?(o=s?"bottom":"top",n="center"):x(i-1.5*D)?(o=s?"top":"bottom",n="center"):(o="middle",n=i<1.5*D&&i>D/2?s?"left":"right":s?"right":"left"),{rotation:i,textAlign:n,textVerticalAlign:o}}function o(e){var t=e.get("tooltip");return e.get("silent")||!(e.get("triggerEvent")||t&&t.show)}function i(e,t,r){var a=e.get("axisLabel.showMinLabel"),n=e.get("axisLabel.showMaxLabel");t=t||[],r=r||[];var o=t[0],i=t[1],u=t[t.length-1],h=t[t.length-2],c=r[0],d=r[1],m=r[r.length-1],p=r[r.length-2];!1===a?(l(o),l(c)):s(o,i)&&(a?(l(i),l(d)):(l(o),l(c))),!1===n?(l(u),l(m)):s(h,u)&&(n?(l(h),l(p)):(l(u),l(m)))}function l(e){e&&(e.ignore=!0)}function s(e,t,r){var a=e&&e.getBoundingRect().clone(),n=t&&t.getBoundingRect().clone();if(a&&n){var o=L.identity([]);return L.rotate(o,o,-e.rotation),a.applyTransform(L.mul([],o,e.getLocalTransform())),n.applyTransform(L.mul([],o,t.getLocalTransform())),a.intersect(n)}}function u(e){return"middle"===e||"center"===e}function h(e,t,r){var a=t.axis;if(t.get("axisTick.show")&&!a.scale.isBlank()){for(var n=t.getModel("axisTick"),o=n.getModel("lineStyle"),i=n.get("length"),l=C(n,r.labelInterval),s=a.getTicksCoords(n.get("alignWithLabel")),u=a.scale.getTicks(),h=t.get("axisLabel.showMinLabel"),c=t.get("axisLabel.showMaxLabel"),d=[],m=[],f=e._transform,v=[],y=s.length,_=0;_<y;_++)if(!z(a,_,l,y,h,c)){var T=s[_];d[0]=T,d[1]=0,m[0]=T,m[1]=r.tickDirection*i,f&&(k(d,d,f),k(m,m,f));var x=new g.Line(g.subPixelOptimizeLine({anid:"tick_"+u[_],shape:{x1:d[0],y1:d[1],x2:m[0],y2:m[1]},style:p(o.getLineStyle(),{stroke:t.get("axisLine.lineStyle.color")}),z2:2,silent:!0}));e.group.add(x),v.push(x)}return v}}function c(e,t,r){var n=t.axis;if(m(r.axisLabelShow,t.get("axisLabel.show"))&&!n.scale.isBlank()){var i=t.getModel("axisLabel"),l=i.get("margin"),s=n.scale.getTicks(),u=t.getFormattedLabels(),h=(m(r.labelRotate,i.get("rotate"))||0)*D/180,c=I(r.rotation,h,r.labelDirection),d=t.get("data"),p=[],f=o(t),y=t.get("triggerEvent"),T=t.get("axisLabel.showMinLabel"),x=t.get("axisLabel.showMaxLabel");return v(s,function(o,h){if(!z(n,h,r.labelInterval,s.length,T,x)){var m=i;d&&d[o]&&d[o].textStyle&&(m=new _(d[o].textStyle,i,t.ecModel));var v=m.getTextColor()||t.get("axisLine.lineStyle.color"),w=n.dataToCoord(o),N=[w,r.labelOffset+r.labelDirection*l],b=n.scale.getLabel(o),L=new g.Text({anid:"label_"+o,position:N,rotation:c.rotation,silent:f,z2:10});g.setTextStyle(L.style,m,{text:u[h],textAlign:m.getShallow("align",!0)||c.textAlign,textVerticalAlign:m.getShallow("verticalAlign",!0)||m.getShallow("baseline",!0)||c.textVerticalAlign,textFill:"function"==typeof v?v("category"===n.type?b:"value"===n.type?o+"":o,h):v}),y&&(L.eventData=a(t),L.eventData.targetType="axisLabel",L.eventData.value=b),e._dumbGroup.add(L),L.updateTransform(),p.push(L),e.group.add(L),L.decomposeTransform()}}),p}}var d=r(0),m=d.retrieve,p=d.defaults,f=d.extend,v=d.each,y=r(14),g=r(3),_=r(20),T=r(4),x=T.isRadianAroundZero,w=T.remRadian,N=r(38),b=N.createSymbol,L=r(40),S=r(12),k=S.applyTransform,D=Math.PI,M=function(e,t){this.opt=t,this.axisModel=e,p(t,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0}),this.group=new g.Group;var r=new g.Group({position:t.position.slice(),rotation:t.rotation});r.updateTransform(),this._transform=r.transform,this._dumbGroup=r};M.prototype={constructor:M,hasBuilder:function(e){return!!A[e]},add:function(e){A[e].call(this)},getGroup:function(){return this.group}};var A={axisLine:function(){var e=this.opt,t=this.axisModel;if(t.get("axisLine.show")){var r=this.axisModel.axis.getExtent(),a=this._transform,n=[r[0],0],o=[r[1],0];a&&(k(n,n,a),k(o,o,a));var i=f({lineCap:"round"},t.getModel("axisLine.lineStyle").getLineStyle());this.group.add(new g.Line(g.subPixelOptimizeLine({anid:"line",shape:{x1:n[0],y1:n[1],x2:o[0],y2:o[1]},style:i,strokeContainThreshold:e.strokeContainThreshold||5,silent:!0,z2:1})));var l=t.get("axisLine.symbol"),s=t.get("axisLine.symbolSize");if(null!=l){"string"==typeof l&&(l=[l,l]),"string"!=typeof s&&"number"!=typeof s||(s=[s,s]);var u=s[0],h=s[1];v([[e.rotation+Math.PI/2,n],[e.rotation-Math.PI/2,o]],function(e,t){if("none"!==l[t]&&null!=l[t]){var r=b(l[t],-u/2,-h/2,u,h,i.stroke,!0);r.attr({rotation:e[0],position:e[1],silent:!0}),this.group.add(r)}},this)}}},axisTickLabel:function(){var e=this.axisModel,t=this.opt,r=h(this,e,t);i(e,c(this,e,t),r)},axisName:function(){var e=this.opt,t=this.axisModel,r=m(e.axisName,t.get("name"));if(r){var i,l=t.get("nameLocation"),s=e.nameDirection,h=t.getModel("nameTextStyle"),c=t.get("nameGap")||0,d=this.axisModel.axis.getExtent(),p=d[0]>d[1]?-1:1,v=["start"===l?d[0]-p*c:"end"===l?d[1]+p*c:(d[0]+d[1])/2,u(l)?e.labelOffset+s*c:0],_=t.get("nameRotate");null!=_&&(_=_*D/180);var T;u(l)?i=I(e.rotation,null!=_?_:e.rotation,s):(i=n(e,l,_||0,d),null!=(T=e.axisNameAvailableWidth)&&(T=Math.abs(T/Math.sin(i.rotation)),!isFinite(T)&&(T=null)));var x=h.getFont(),w=t.get("nameTruncate",!0)||{},N=w.ellipsis,b=m(e.nameTruncateMaxWidth,w.maxWidth,T),L=null!=N&&null!=b?y.truncateText(r,b,x,N,{minChar:2,placeholder:w.placeholder}):r,S=t.get("tooltip",!0),k=t.mainType,M={componentType:k,name:r,$vars:["name"]};M[k+"Index"]=t.componentIndex;var A=new g.Text({anid:"name",__fullText:r,__truncatedText:L,position:v,rotation:i.rotation,silent:o(t),z2:1,tooltip:S&&S.show?f({content:r,formatter:function(){return r},formatterParams:M},S):null});g.setTextStyle(A.style,h,{text:L,textFont:x,textFill:h.getTextColor()||t.get("axisLine.lineStyle.color"),textAlign:i.textAlign,textVerticalAlign:i.textVerticalAlign}),t.get("triggerEvent")&&(A.eventData=a(t),A.eventData.targetType="axisName",A.eventData.name=r),this._dumbGroup.add(A),A.updateTransform(),this.group.add(A),A.decomposeTransform()}}},I=M.innerTextLayout=function(e,t,r){var a,n,o=w(t-e);return x(o)?(n=r>0?"top":"bottom",a="center"):x(o-D)?(n=r>0?"bottom":"top",a="center"):(n="middle",a=o>0&&o<D?r>0?"right":"left":r>0?"left":"right"),{rotation:o,textAlign:a,textVerticalAlign:n}},z=M.ifIgnoreOnTick=function(e,t,r,a,n,o){if(0===t&&n||t===a-1&&o)return!1;var i,l=e.scale;return"ordinal"===l.type&&("function"==typeof r?(i=l.getTicks()[t],!r(i,l.getLabel(i))):t%(r+1))},C=M.getInterval=function(e,t){var r=e.get("interval");return null!=r&&"auto"!=r||(r=t),r},R=M;e.exports=R},function(e,t,r){"use strict";function a(e,t,r,a,o,i){var u=s.getAxisPointerClass(e.axisPointerClass);if(u){var h=l.getAxisPointerModel(t);h?(e._axisPointer||(e._axisPointer=new u)).render(t,h,a,i):n(e,a)}}function n(e,t,r){var a=e._axisPointer;a&&a.dispose(t,r),e._axisPointer=null}var o=r(9),i=(o.__DEV__,r(2)),l=r(164),s=i.extendComponentView({type:"axis",_axisPointer:null,axisPointerClass:null,render:function(e,t,r,n){this.axisPointerClass&&l.fixValue(e),s.superApply(this,"render",arguments),a(this,e,t,r,n,!0)},updateAxisPointer:function(e,t,r,n,o){a(this,e,t,r,n,!1)},remove:function(e,t){var r=this._axisPointer;r&&r.remove(t),s.superApply(this,"remove",arguments)},dispose:function(e,t){n(this,t),s.superApply(this,"dispose",arguments)}}),u=[];s.registerAxisPointerClass=function(e,t){u[e]=t},s.getAxisPointerClass=function(e){return e&&u[e]};var h=s;e.exports=h},function(e,t,r){"use strict";function a(e,t,r){function a(){h=(new Date).getTime(),c=null,e.apply(i,l||[])}var n,o,i,l,s,u=0,h=0,c=null;t=t||0;var d=function(){n=(new Date).getTime(),i=this,l=arguments;var e=s||t,d=s||r;s=null,o=n-(d?u:h)-e,clearTimeout(c),d?c=setTimeout(a,e):o>=0?a():c=setTimeout(a,-o),u=n};return d.clear=function(){c&&(clearTimeout(c),c=null)},d.debounceNextCall=function(e){s=e},d}function n(e,t,r,n){var o=e[t];if(o){var u=o[i]||o,h=o[s];if(o[l]!==r||h!==n){if(null==r||!n)return e[t]=u;o=e[t]=a(u,r,"debounce"===n),o[i]=u,o[s]=n,o[l]=r}return o}}function o(e,t){var r=e[t];r&&r[i]&&(e[t]=r[i])}var i="\0__throttleOriginMethod",l="\0__throttleRate",s="\0__throttleType";t.throttle=a,t.createOrUpdate=n,t.clear=o},function(e,t,r){"use strict";function a(e){var t=e.pieceList;e.hasSpecialVisual=!1,f.each(t,function(t,r){t.originIndex=r,null!=t.visual&&(e.hasSpecialVisual=!0)})}function n(e){var t=e.categories,r=e.visual,a=e.categoryMap={};if(_(t,function(e,t){a[e]=t}),!f.isArray(r)){var n=[];f.isObject(r)?_(r,function(e,t){var r=a[t];n[null!=r?r:x]=e}):n[x]=r,r=m(e,n)}for(var o=t.length-1;o>=0;o--)null==r[o]&&(delete a[t[o]],t.pop())}function o(e,t){var r=e.visual,a=[];f.isObject(r)?_(r,function(e){a.push(e)}):null!=r&&a.push(r);var n={color:1,symbol:1};t||1!==a.length||n.hasOwnProperty(e.type)||(a[1]=a[0]),m(e,a)}function i(e){return{applyVisual:function(t,r,a){t=this.mapValueToVisual(t),a("color",e(r("color"),t))},_doMap:c([0,1])}}function l(e){var t=this.option.visual;return t[Math.round(g(e,[0,1],[0,t.length-1],!0))]||{}}function s(e){return function(t,r,a){a(e,this.mapValueToVisual(t))}}function u(e){var t=this.option.visual;return t[this.option.loop&&e!==x?e%t.length:e]}function h(){return this.option.visual[0]}function c(e){return{linear:function(t){return g(t,e,this.option.visual,!0)},category:u,piecewise:function(t,r){var a=d.call(this,r);return null==a&&(a=g(t,e,this.option.visual,!0)),a},fixed:h}}function d(e){var t=this.option,r=t.pieceList;if(t.hasSpecialVisual){var a=w.findPieceIndex(e,r),n=r[a];if(n&&n.visual)return n.visual[this.type]}}function m(e,t){return e.visual=t,"color"===e.type&&(e.parsedVisual=f.map(t,function(e){return v.parse(e)})),t}function p(e,t,r){return e?t<=r:t<r}var f=r(0),v=r(63),y=r(4),g=y.linearMap,_=f.each,T=f.isObject,x=-1,w=function(e){var t=e.mappingMethod,r=e.type,i=this.option=f.clone(e);this.type=r,this.mappingMethod=t,this._normalizeData=b[t];var l=N[r];this.applyVisual=l.applyVisual,this.getColorMapper=l.getColorMapper,this._doMap=l._doMap[t],"piecewise"===t?(o(i),a(i)):"category"===t?i.categories?n(i):o(i,!0):(f.assert("linear"!==t||i.dataExtent),o(i))};w.prototype={constructor:w,mapValueToVisual:function(e){var t=this._normalizeData(e);return this._doMap(t,e)},getNormalizer:function(){return f.bind(this._normalizeData,this)}};var N=w.visualHandlers={color:{applyVisual:s("color"),getColorMapper:function(){var e=this.option;return f.bind("category"===e.mappingMethod?function(e,t){return!t&&(e=this._normalizeData(e)),u.call(this,e)}:function(t,r,a){var n=!!a;return!r&&(t=this._normalizeData(t)),a=v.fastLerp(t,e.parsedVisual,a),n?a:v.stringify(a,"rgba")},this)},_doMap:{linear:function(e){return v.stringify(v.fastLerp(e,this.option.parsedVisual),"rgba")},category:u,piecewise:function(e,t){var r=d.call(this,t);return null==r&&(r=v.stringify(v.fastLerp(e,this.option.parsedVisual),"rgba")),r},fixed:h}},colorHue:i(function(e,t){return v.modifyHSL(e,t)}),colorSaturation:i(function(e,t){return v.modifyHSL(e,null,t)}),colorLightness:i(function(e,t){return v.modifyHSL(e,null,null,t)}),colorAlpha:i(function(e,t){return v.modifyAlpha(e,t)}),opacity:{applyVisual:s("opacity"),_doMap:c([0,1])},symbol:{applyVisual:function(e,t,r){var a=this.mapValueToVisual(e);if(f.isString(a))r("symbol",a);else if(T(a))for(var n in a)a.hasOwnProperty(n)&&r(n,a[n])},_doMap:{linear:l,category:u,piecewise:function(e,t){var r=d.call(this,t);return null==r&&(r=l.call(this,e)),r},fixed:h}},symbolSize:{applyVisual:s("symbolSize"),_doMap:c([0,1])}},b={linear:function(e){return g(e,this.option.dataExtent,[0,1],!0)},piecewise:function(e){var t=this.option.pieceList,r=w.findPieceIndex(e,t,!0);if(null!=r)return g(r,[0,t.length-1],[0,1],!0)},category:function(e){var t=this.option.categories?this.option.categoryMap[e]:e;return null==t?x:t},fixed:f.noop};w.listVisualTypes=function(){var e=[];return f.each(N,function(t,r){e.push(r)}),e},w.addVisualHandler=function(e,t){N[e]=t},w.isValidType=function(e){return N.hasOwnProperty(e)},w.eachVisual=function(e,t,r){f.isObject(e)?f.each(e,t,r):t.call(r,e)},w.mapVisual=function(e,t,r){var a,n=f.isArray(e)?[]:f.isObject(e)?{}:(a=!0,null);return w.eachVisual(e,function(e,o){var i=t.call(r,e,o);a?n=i:n[o]=i}),n},w.retrieveVisuals=function(e){var t,r={};return e&&_(N,function(a,n){e.hasOwnProperty(n)&&(r[n]=e[n],t=!0)}),t?r:null},w.prepareVisualTypes=function(e){if(T(e)){var t=[];_(e,function(e,r){t.push(r)}),e=t}else{if(!f.isArray(e))return[];e=e.slice()}return e.sort(function(e,t){return"color"===t&&"color"!==e&&0===e.indexOf("color")?1:-1}),e},w.dependsOn=function(e,t){return"color"===t?!(!e||0!==e.indexOf(t)):e===t},w.findPieceIndex=function(e,t,r){function a(t,r){var a=Math.abs(t-e);a<o&&(o=a,n=r)}for(var n,o=1/0,i=0,l=t.length;i<l;i++){var s=t[i].value;if(null!=s){if(s===e||"string"==typeof s&&s===e+"")return i;r&&a(s,i)}}for(var i=0,l=t.length;i<l;i++){var u=t[i],h=u.interval,c=u.close;if(h){if(h[0]===-1/0){if(p(c[1],e,h[1]))return i}else if(h[1]===1/0){if(p(c[0],h[0],e))return i}else if(p(c[0],h[0],e)&&p(c[1],e,h[1]))return i;r&&a(h[0],i),r&&a(h[1],i)}}if(r)return e===1/0?t.length-1:e===-1/0?0:n};var L=w;e.exports=L},function(e,t,r){"use strict";function a(e,t,r,a,n){a.eachRawSeriesByType(e,function(e){var n=e.getData(),o=e.get("symbol")||t,i=e.get("symbolSize");n.setVisual({legendSymbol:r||o,symbol:o,symbolSize:i}),a.isSeriesFiltered(e)||("function"==typeof i&&n.each(function(t){var r=e.getRawValue(t),a=e.getDataParams(t);n.setItemVisual(t,"symbolSize",i(r,a))}),n.each(function(e){var t=n.getItemModel(e),r=t.getShallow("symbol",!0),a=t.getShallow("symbolSize",!0);null!=r&&n.setItemVisual(e,"symbol",r),null!=a&&n.setItemVisual(e,"symbolSize",a)}))})}e.exports=a},function(e,t,r){"use strict";var a=function(){};e.exports=a},function(e,t,r){"use strict";function a(e){return null==e?void 0===e?s:l:u&&u in Object(e)?o(e):i(e)}var n=r(176),o=r(1055),i=r(1081),l="[object Null]",s="[object Undefined]",u=n?n.toStringTag:void 0;e.exports=a},function(e,t,r){"use strict";function a(e){return null!=e&&"object"==(void 0===e?"undefined":n(e))}var 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};e.exports=a},function(e,t,r){"use strict";var a=Array.prototype.slice,n=function(){this._$handlers={}};n.prototype={constructor:n,one:function(e,t,r){var a=this._$handlers;if(!t||!e)return this;a[e]||(a[e]=[]);for(var n=0;n<a[e].length;n++)if(a[e][n].h===t)return this;return a[e].push({h:t,one:!0,ctx:r||this}),this},on:function(e,t,r){var a=this._$handlers;if(!t||!e)return this;a[e]||(a[e]=[]);for(var n=0;n<a[e].length;n++)if(a[e][n].h===t)return this;return a[e].push({h:t,one:!1,ctx:r||this}),this},isSilent:function(e){var t=this._$handlers;return t[e]&&t[e].length},off:function(e,t){var r=this._$handlers;if(!e)return this._$handlers={},this;if(t){if(r[e]){for(var a=[],n=0,o=r[e].length;n<o;n++)r[e][n].h!=t&&a.push(r[e][n]);r[e]=a}r[e]&&0===r[e].length&&delete r[e]}else delete r[e];return this},trigger:function(e){if(this._$handlers[e]){var t=arguments,r=t.length;r>3&&(t=a.call(t,1));for(var n=this._$handlers[e],o=n.length,i=0;i<o;){switch(r){case 1:n[i].h.call(n[i].ctx);break;case 2:n[i].h.call(n[i].ctx,t[1]);break;case 3:n[i].h.call(n[i].ctx,t[1],t[2]);break;default:n[i].h.apply(n[i].ctx,t)}n[i].one?(n.splice(i,1),o--):i++}}return this},triggerWithContext:function(e){if(this._$handlers[e]){var t=arguments,r=t.length;r>4&&(t=a.call(t,1,t.length-1));for(var n=t[t.length-1],o=this._$handlers[e],i=o.length,l=0;l<i;){switch(r){case 1:o[l].h.call(n);break;case 2:o[l].h.call(n,t[1]);break;case 3:o[l].h.call(n,t[1],t[2]);break;default:o[l].h.apply(n,t)}o[l].one?(o.splice(l,1),i--):l++}}return this}};var o=n;e.exports=o},function(e,t,r){"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,r){"use strict";t.__esModule=!0;var a=r(281),n=function(e){return e&&e.__esModule?e:{default:e}}(a);t.default=function(){function e(e,t){for(var r=0;r<t.length;r++){var a=t[r];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),(0,n.default)(e,a.key,a)}}return function(t,r,a){return r&&e(t.prototype,r),a&&e(t,a),t}}()},function(e,t,r){"use strict";function a(e,t){for(var r=Object.getOwnPropertyNames(t),a=0;a<r.length;a++){var n=r[a],o=Object.getOwnPropertyDescriptor(t,n);o&&o.configurable&&void 0===e[n]&&Object.defineProperty(e,n,o)}return e}function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var o=r(474),i=n(o),l=r(473),s=n(l),u=r(196),h=n(u);t.default=function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+(void 0===t?"undefined":(0,h.default)(t)));e.prototype=(0,s.default)(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(i.default?(0,i.default)(e,t):a(e,t))}},function(e,t,r){"use strict";t.__esModule=!0;var a=r(196),n=function(e){return e&&e.__esModule?e:{default:e}}(a);t.default=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!==(void 0===t?"undefined":(0,n.default)(t))&&"function"!=typeof t?e:t}},function(e,t,r){"use strict";var a=r(105);e.exports=function(e){if(!a(e))throw TypeError(e+" is not an object!");return e}},function(e,t,r){"use strict";var a=r(65),n=r(124);e.exports=r(77)?function(e,t,r){return a.f(e,t,n(1,r))}:function(e,t,r){return e[t]=r,e}},function(e,t,r){"use strict";var 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.exports=function(e){return"object"===(void 0===e?"undefined":a(e))?null!==e:"function"==typeof e}},function(e,t,r){"use strict";var a=r(285),n=r(199);e.exports=function(e){return a(n(e))}},function(e,t,r){"use strict";e.exports={}},function(e,t,r){"use strict";var a=r(17).f,n=r(33),o=r(13)("toStringTag");e.exports=function(e,t,r){e&&!n(e=r?e:e.prototype,o)&&a(e,o,{configurable:!0,value:t})}},function(e,t,r){"use strict";var a=r(1),n=r(49),o=r(7),i=r(231),l="["+i+"]",s="​…",u=RegExp("^"+l+l+"*"),h=RegExp(l+l+"*$"),c=function(e,t,r){var n={},l=o(function(){return!!i[e]()||s[e]()!=s}),u=n[e]=l?t(d):i[e];r&&(n[r]=u),a(a.P+a.F*l,"String",n)},d=c.trim=function(e,t){return e=String(n(e)),1&t&&(e=e.replace(u,"")),2&t&&(e=e.replace(h,"")),e};e.exports=c},function(e,t,r){"use strict";var a=r(8);e.exports=function(e,t){if(!a(e)||e._t!==t)throw TypeError("Incompatible receiver, "+t+" required!");return e}},function(e,t,r){"use strict";function a(e){return n.isObject(e)&&null!=e.value?e.value:e+""}var n=r(0),o=r(37),i={getFormattedLabels:function(){return o.getFormattedLabels(this.axis,this.get("axisLabel.formatter"))},getCategories:function(){return"category"===this.get("type")&&n.map(this.get("data"),a)},getMin:function(e){var t=this.option,r=e||null==t.rangeStart?t.min:t.rangeStart;return this.axis&&null!=r&&"dataMin"!==r&&"function"!=typeof r&&!n.eqNaN(r)&&(r=this.axis.scale.parse(r)),r},getMax:function(e){var t=this.option,r=e||null==t.rangeEnd?t.max:t.rangeEnd;return this.axis&&null!=r&&"dataMax"!==r&&"function"!=typeof r&&!n.eqNaN(r)&&(r=this.axis.scale.parse(r)),r},getNeedCrossZero:function(){var e=this.option;return null==e.rangeStart&&null==e.rangeEnd&&!e.scale},getCoordSysModel:n.noop,setRange:function(e,t){this.option.rangeStart=e,this.option.rangeEnd=t},resetRange:function(){this.option.rangeStart=this.option.rangeEnd=null}};e.exports=i},function(e,t,r){"use strict";function a(e){return e}function n(e,t,r,n,o){this._old=e,this._new=t,this._oldKeyGetter=r||a,this._newKeyGetter=n||a,this.context=o}function o(e,t,r,a,n){for(var o=0;o<e.length;o++){var i="_ec_"+n[a](e[o],o),l=t[i];null==l?(r.push(i),t[i]=o):(l.length||(t[i]=l=[l]),l.push(o))}}n.prototype={constructor:n,add:function(e){return this._add=e,this},update:function(e){return this._update=e,this},remove:function(e){return this._remove=e,this},execute:function(){var e,t=this._old,r=this._new,a={},n={},i=[],l=[];for(o(t,a,i,"_oldKeyGetter",this),o(r,n,l,"_newKeyGetter",this),e=0;e<t.length;e++){var s=i[e],u=n[s];if(null!=u){var h=u.length;h?(1===h&&(n[s]=null),u=u.unshift()):n[s]=null,this._update&&this._update(u,e)}else this._remove&&this._remove(e)}for(var e=0;e<l.length;e++){var s=l[e];if(n.hasOwnProperty(s)){var u=n[s];if(null==u)continue;if(u.length)for(var c=0,h=u.length;c<h;c++)this._add&&this._add(u[c]);else this._add&&this._add(u)}}}};var i=n;e.exports=i},function(e,t,r){"use strict";var a={toolbox:{brush:{title:{rect:"矩形选择",polygon:"圈选",lineX:"横向选择",lineY:"纵向选择",keep:"保持选择",clear:"清除选择"}},dataView:{title:"数据视图",lang:["数据视图","关闭","刷新"]},dataZoom:{title:{zoom:"区域缩放",back:"区域缩放还原"}},magicType:{title:{line:"切换为折线图",bar:"切换为柱状图",stack:"切换为堆叠",tiled:"切换为平铺"}},restore:{title:"还原"},saveAsImage:{title:"保存为图片",lang:["右键另存为图片"]}}};e.exports=a},function(e,t,r){"use strict";function a(e){for(var t=0;t<e.length;t++)e[t][1]||(e[t][1]=e[t][0]);return function(t,r,a){for(var o={},i=0;i<e.length;i++){var l=e[i][1];if(!(r&&n.indexOf(r,l)>=0||a&&n.indexOf(a,l)<0)){var s=t.getShallow(l);null!=s&&(o[e[i][0]]=s)}}return o}}var n=r(0);e.exports=a},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}var 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.__esModule=!0,t.locationsAreEqual=t.statesAreEqual=t.createLocation=t.createQuery=void 0;var o="function"==typeof Symbol&&"symbol"===n(Symbol.iterator)?function(e){return void 0===e?"undefined":n(e)}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":void 0===e?"undefined":n(e)},i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},l=r(28),s=a(l),u=r(95),h=(a(u),r(73)),c=r(173),d=(t.createQuery=function(e){return i(Object.create(null),e)},t.createLocation=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"/",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:c.POP,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,a="string"==typeof e?(0,h.parsePath)(e):e;return{pathname:a.pathname||"/",search:a.search||"",hash:a.hash||"",state:a.state,action:t,key:r}},function(e){return"[object Date]"===Object.prototype.toString.call(e)}),m=t.statesAreEqual=function e(t,r){if(t===r)return!0;var a=void 0===t?"undefined":o(t);if(a!==(void 0===r?"undefined":o(r)))return!1;if("function"===a&&(0,s.default)(!1),"object"===a){if(d(t)&&d(r)&&(0,s.default)(!1),!Array.isArray(t)){var n=Object.keys(t),i=Object.keys(r);return n.length===i.length&&n.every(function(a){return e(t[a],r[a])})}return Array.isArray(r)&&t.length===r.length&&t.every(function(t,a){return e(t,r[a])})}return!1};t.locationsAreEqual=function(e,t){return e.key===t.key&&e.pathname===t.pathname&&e.search===t.search&&e.hash===t.hash&&m(e.state,t.state)}},function(e,t,r){"use strict";function a(e,t){var r=o(e,t);return n(r)?r:void 0}var n=r(1028),o=r(1057);e.exports=a},function(e,t,r){"use strict";function a(e){return null==e?"":n(e)}var n=r(1039);e.exports=a},function(e,t,r){"use strict";function a(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function n(e){for(var t="",r=[],n=[],o=void 0,i=0,l=/:([a-zA-Z_$][a-zA-Z0-9_$]*)|\*\*|\*|\(|\)|\\\(|\\\)/g;o=l.exec(e);)o.index!==i&&(n.push(e.slice(i,o.index)),t+=a(e.slice(i,o.index))),o[1]?(t+="([^/]+)",r.push(o[1])):"**"===o[0]?(t+="(.*)",r.push("splat")):"*"===o[0]?(t+="(.*?)",r.push("splat")):"("===o[0]?t+="(?:":")"===o[0]?t+=")?":"\\("===o[0]?t+="\\(":"\\)"===o[0]&&(t+="\\)"),n.push(o[0]),i=l.lastIndex;return i!==e.length&&(n.push(e.slice(i,e.length)),t+=a(e.slice(i,e.length))),{pattern:e,regexpSource:t,paramNames:r,tokens:n}}function o(e){return d[e]||(d[e]=n(e)),d[e]}function i(e,t){"/"!==e.charAt(0)&&(e="/"+e);var r=o(e),a=r.regexpSource,n=r.paramNames,i=r.tokens;"/"!==e.charAt(e.length-1)&&(a+="/?"),"*"===i[i.length-1]&&(a+="$");var l=t.match(new RegExp("^"+a,"i"));if(null==l)return null;var s=l[0],u=t.substr(s.length);if(u){if("/"!==s.charAt(s.length-1))return null;u="/"+u}return{remainingPathname:u,paramNames:n,paramValues:l.slice(1).map(function(e){return e&&decodeURIComponent(e)})}}function l(e){return o(e).paramNames}function s(e,t){var r=i(e,t);if(!r)return null;var a=r.paramNames,n=r.paramValues,o={};return a.forEach(function(e,t){o[e]=n[t]}),o}function u(e,t){t=t||{};for(var r=o(e),a=r.tokens,n=0,i="",l=0,s=[],u=void 0,h=void 0,d=void 0,m=0,p=a.length;m<p;++m)if("*"===(u=a[m])||"**"===u)d=Array.isArray(t.splat)?t.splat[l++]:t.splat,null!=d||n>0||(0,c.default)(!1),null!=d&&(i+=encodeURI(d));else if("("===u)s[n]="",n+=1;else if(")"===u){var f=s.pop();n-=1,n?s[n-1]+=f:i+=f}else if("\\("===u)i+="(";else if("\\)"===u)i+=")";else if(":"===u.charAt(0))if(h=u.substring(1),d=t[h],null!=d||n>0||(0,c.default)(!1),null==d){if(n){s[n-1]="";for(var v=a.indexOf(u),y=a.slice(v,a.length),g=-1,_=0;_<y.length;_++)if(")"==y[_]){g=_;break}g>0||(0,c.default)(!1),m=v+g-1}}else n?s[n-1]+=encodeURIComponent(d):i+=encodeURIComponent(d);else n?s[n-1]+=u:i+=u;return n<=0||(0,c.default)(!1),i.replace(/\/+/g,"/")}t.__esModule=!0,t.compilePattern=o,t.matchPattern=i,t.getParamNames=l,t.getParams=s,t.formatPattern=u;var h=r(28),c=function(e){return e&&e.__esModule?e:{default:e}}(h),d=Object.create(null)},function(e,t,r){"use strict";function a(e,t){if(-1!==t.indexOf("deprecated")){if(l[t])return;l[t]=!0}t="[react-router] "+t;for(var r=arguments.length,a=Array(r>2?r-2:0),n=2;n<r;n++)a[n-2]=arguments[n];i.default.apply(void 0,[e,t].concat(a))}function n(){l={}}t.__esModule=!0,t.default=a,t._resetWarned=n;var o=r(1167),i=function(e){return e&&e.__esModule?e:{default:e}}(o),l={}},function(e,t,r){"use strict";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,r){"use strict";var a=r(75),n=r(12),o=r(274),i=r(19),l=r(189),s=l.devicePixelRatio,u={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},h=[],c=[],d=[],m=[],p=Math.min,f=Math.max,v=Math.cos,y=Math.sin,g=Math.sqrt,_=Math.abs,T="undefined"!=typeof Float32Array,x=function(e){this._saveData=!e,this._saveData&&(this.data=[]),this._ctx=null};x.prototype={constructor:x,_xi:0,_yi:0,_x0:0,_y0:0,_ux:0,_uy:0,_len:0,_lineDash:null,_dashOffset:0,_dashIdx:0,_dashSum:0,setScale:function(e,t){this._ux=_(1/s/e)||0,this._uy=_(1/s/t)||0},getContext:function(){return this._ctx},beginPath:function(e){return this._ctx=e,e&&e.beginPath(),e&&(this.dpr=e.dpr),this._saveData&&(this._len=0),this._lineDash&&(this._lineDash=null,this._dashOffset=0),this},moveTo:function(e,t){return this.addData(u.M,e,t),this._ctx&&this._ctx.moveTo(e,t),this._x0=e,this._y0=t,this._xi=e,this._yi=t,this},lineTo:function(e,t){var r=_(e-this._xi)>this._ux||_(t-this._yi)>this._uy||this._len<5;return this.addData(u.L,e,t),this._ctx&&r&&(this._needsDash()?this._dashedLineTo(e,t):this._ctx.lineTo(e,t)),r&&(this._xi=e,this._yi=t),this},bezierCurveTo:function(e,t,r,a,n,o){return this.addData(u.C,e,t,r,a,n,o),this._ctx&&(this._needsDash()?this._dashedBezierTo(e,t,r,a,n,o):this._ctx.bezierCurveTo(e,t,r,a,n,o)),this._xi=n,this._yi=o,this},quadraticCurveTo:function(e,t,r,a){return this.addData(u.Q,e,t,r,a),this._ctx&&(this._needsDash()?this._dashedQuadraticTo(e,t,r,a):this._ctx.quadraticCurveTo(e,t,r,a)),this._xi=r,this._yi=a,this},arc:function(e,t,r,a,n,o){return this.addData(u.A,e,t,r,r,a,n-a,0,o?0:1),this._ctx&&this._ctx.arc(e,t,r,a,n,o),this._xi=v(n)*r+e,this._yi=y(n)*r+e,this},arcTo:function(e,t,r,a,n){return this._ctx&&this._ctx.arcTo(e,t,r,a,n),this},rect:function(e,t,r,a){return this._ctx&&this._ctx.rect(e,t,r,a),this.addData(u.R,e,t,r,a),this},closePath:function(){this.addData(u.Z);var e=this._ctx,t=this._x0,r=this._y0;return e&&(this._needsDash()&&this._dashedLineTo(t,r),e.closePath()),this._xi=t,this._yi=r,this},fill:function(e){e&&e.fill(),this.toStatic()},stroke:function(e){e&&e.stroke(),this.toStatic()},setLineDash:function(e){if(e instanceof Array){this._lineDash=e,this._dashIdx=0;for(var t=0,r=0;r<e.length;r++)t+=e[r];this._dashSum=t}return this},setLineDashOffset:function(e){return this._dashOffset=e,this},len:function(){return this._len},setData:function(e){var t=e.length;this.data&&this.data.length==t||!T||(this.data=new Float32Array(t));for(var r=0;r<t;r++)this.data[r]=e[r];this._len=t},appendPath:function(e){e instanceof Array||(e=[e]);for(var t=e.length,r=0,a=this._len,n=0;n<t;n++)r+=e[n].len();T&&this.data instanceof Float32Array&&(this.data=new Float32Array(a+r));for(var n=0;n<t;n++)for(var o=e[n].data,i=0;i<o.length;i++)this.data[a++]=o[i];this._len=a},addData:function(e){if(this._saveData){var t=this.data;this._len+arguments.length>t.length&&(this._expandData(),t=this.data);for(var r=0;r<arguments.length;r++)t[this._len++]=arguments[r];this._prevCmd=e}},_expandData:function(){if(!(this.data instanceof Array)){for(var e=[],t=0;t<this._len;t++)e[t]=this.data[t];this.data=e}},_needsDash:function(){return this._lineDash},_dashedLineTo:function(e,t){var r,a,n=this._dashSum,o=this._dashOffset,i=this._lineDash,l=this._ctx,s=this._xi,u=this._yi,h=e-s,c=t-u,d=g(h*h+c*c),m=s,v=u,y=i.length;for(h/=d,c/=d,o<0&&(o=n+o),o%=n,m-=o*h,v-=o*c;h>0&&m<=e||h<0&&m>=e||0==h&&(c>0&&v<=t||c<0&&v>=t);)a=this._dashIdx,r=i[a],m+=h*r,v+=c*r,this._dashIdx=(a+1)%y,h>0&&m<s||h<0&&m>s||c>0&&v<u||c<0&&v>u||l[a%2?"moveTo":"lineTo"](h>=0?p(m,e):f(m,e),c>=0?p(v,t):f(v,t));h=m-e,c=v-t,this._dashOffset=-g(h*h+c*c)},_dashedBezierTo:function(e,t,r,n,o,i){var l,s,u,h,c,d=this._dashSum,m=this._dashOffset,p=this._lineDash,f=this._ctx,v=this._xi,y=this._yi,_=a.cubicAt,T=0,x=this._dashIdx,w=p.length,N=0;for(m<0&&(m=d+m),m%=d,l=0;l<1;l+=.1)s=_(v,e,r,o,l+.1)-_(v,e,r,o,l),u=_(y,t,n,i,l+.1)-_(y,t,n,i,l),T+=g(s*s+u*u);for(;x<w&&!((N+=p[x])>m);x++);for(l=(N-m)/T;l<=1;)h=_(v,e,r,o,l),c=_(y,t,n,i,l),x%2?f.moveTo(h,c):f.lineTo(h,c),l+=p[x]/T,x=(x+1)%w;x%2!=0&&f.lineTo(o,i),s=o-h,u=i-c,this._dashOffset=-g(s*s+u*u)},_dashedQuadraticTo:function(e,t,r,a){var n=r,o=a;r=(r+2*e)/3,a=(a+2*t)/3,e=(this._xi+2*e)/3,t=(this._yi+2*t)/3,this._dashedBezierTo(e,t,r,a,n,o)},toStatic:function(){var e=this.data;e instanceof Array&&(e.length=this._len,T&&(this.data=new Float32Array(e)))},getBoundingRect:function(){h[0]=h[1]=d[0]=d[1]=Number.MAX_VALUE,c[0]=c[1]=m[0]=m[1]=-Number.MAX_VALUE;for(var e=this.data,t=0,r=0,a=0,l=0,s=0;s<e.length;){var p=e[s++];switch(1==s&&(t=e[s],r=e[s+1],a=t,l=r),p){case u.M:a=e[s++],l=e[s++],t=a,r=l,d[0]=a,d[1]=l,m[0]=a,m[1]=l;break;case u.L:o.fromLine(t,r,e[s],e[s+1],d,m),t=e[s++],r=e[s++];break;case u.C:o.fromCubic(t,r,e[s++],e[s++],e[s++],e[s++],e[s],e[s+1],d,m),t=e[s++],r=e[s++];break;case u.Q:o.fromQuadratic(t,r,e[s++],e[s++],e[s],e[s+1],d,m),t=e[s++],r=e[s++];break;case u.A:var f=e[s++],g=e[s++],_=e[s++],T=e[s++],x=e[s++],w=e[s++]+x,N=(e[s++],1-e[s++]);1==s&&(a=v(x)*_+f,l=y(x)*T+g),o.fromArc(f,g,_,T,x,w,N,d,m),t=v(w)*_+f,r=y(w)*T+g;break;case u.R:a=t=e[s++],l=r=e[s++];var b=e[s++],L=e[s++];o.fromLine(a,l,a+b,l+L,d,m);break;case u.Z:t=a,r=l}n.min(h,h,d),n.max(c,c,m)}return 0===s&&(h[0]=h[1]=c[0]=c[1]=0),new i(h[0],h[1],c[0]-h[0],c[1]-h[1])},rebuildPath:function(e){for(var t,r,a,n,o,i,l=this.data,s=this._ux,h=this._uy,c=this._len,d=0;d<c;){var m=l[d++];switch(1==d&&(a=l[d],n=l[d+1],t=a,r=n),m){case u.M:t=a=l[d++],r=n=l[d++],e.moveTo(a,n);break;case u.L:o=l[d++],i=l[d++],(_(o-a)>s||_(i-n)>h||d===c-1)&&(e.lineTo(o,i),a=o,n=i);break;case u.C:e.bezierCurveTo(l[d++],l[d++],l[d++],l[d++],l[d++],l[d++]),a=l[d-2],n=l[d-1];break;case u.Q:e.quadraticCurveTo(l[d++],l[d++],l[d++],l[d++]),a=l[d-2],n=l[d-1];break;case u.A:var p=l[d++],f=l[d++],g=l[d++],T=l[d++],x=l[d++],w=l[d++],N=l[d++],b=l[d++],L=g>T?g:T,S=g>T?1:g/T,k=g>T?T/g:1,D=Math.abs(g-T)>.001,M=x+w;D?(e.translate(p,f),e.rotate(N),e.scale(S,k),e.arc(0,0,L,x,M,1-b),e.scale(1/S,1/k),e.rotate(-N),e.translate(-p,-f)):e.arc(p,f,L,x,M,1-b),1==d&&(t=v(x)*g+p,r=y(x)*T+f),a=v(M)*g+p,n=y(M)*T+f;break;case u.R:t=a=l[d],r=n=l[d+1],e.rect(l[d++],l[d++],l[d++],l[d++]);break;case u.Z:e.closePath(),a=t,n=r}}}},x.CMD=u;var w=x;e.exports=w},function(e,t,r){"use strict";e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,r){"use strict";e.exports={}},function(e,t,r){"use strict";e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,r){"use strict";var a=r(41),n=r(13)("toStringTag"),o="Arguments"==a(function(){return arguments}()),i=function(e,t){try{return e[t]}catch(e){}};e.exports=function(e){var t,r,l;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(r=i(t=Object(e),n))?r:o?a(t):"Object"==(l=a(t))&&"function"==typeof t.callee?"Arguments":l}},function(e,t,r){"use strict";var a=r(41);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==a(e)?e.split(""):Object(e)}},function(e,t,r){"use strict";t.f={}.propertyIsEnumerable},function(e,t,r){"use strict";function a(e){this.group=new o.Group,this._symbolCtor=e||i}function n(e,t,r){var a=e.getItemLayout(t);return a&&!isNaN(a[0])&&!isNaN(a[1])&&!(r&&r(t))&&"none"!==e.getItemVisual(t,"symbol")}var o=r(3),i=r(162),l=a.prototype;l.updateData=function(e,t){var r=this.group,a=e.hostModel,i=this._data,l=this._symbolCtor,s={itemStyle:a.getModel("itemStyle.normal").getItemStyle(["color"]),hoverItemStyle:a.getModel("itemStyle.emphasis").getItemStyle(),symbolRotate:a.get("symbolRotate"),symbolOffset:a.get("symbolOffset"),hoverAnimation:a.get("hoverAnimation"),labelModel:a.getModel("label.normal"),hoverLabelModel:a.getModel("label.emphasis"),cursorStyle:a.get("cursor")};e.diff(i).add(function(a){var o=e.getItemLayout(a);if(n(e,a,t)){var i=new l(e,a,s);i.attr("position",o),e.setItemGraphicEl(a,i),r.add(i)}}).update(function(u,h){var c=i.getItemGraphicEl(h),d=e.getItemLayout(u);if(!n(e,u,t))return void r.remove(c);c?(c.updateData(e,u,s),o.updateProps(c,{position:d},a)):(c=new l(e,u),c.attr("position",d)),r.add(c),e.setItemGraphicEl(u,c)}).remove(function(e){var t=i.getItemGraphicEl(e);t&&t.fadeOut(function(){r.remove(t)})}).execute(),this._data=e},l.updateLayout=function(){var e=this._data;e&&e.eachItemGraphicEl(function(t,r){var a=e.getItemLayout(r);t.attr("position",a)})},l.remove=function(e){var t=this.group,r=this._data;r&&(e?r.eachItemGraphicEl(function(e){e.fadeOut(function(){t.remove(e)})}):t.removeAll())};var s=a;e.exports=s},function(e,t,r){"use strict";function a(e,t){if(e&&("treemapZoomToNode"===e.type||"treemapRootToNode"===e.type)){var r=t.getData().tree.root,a=e.targetNode;if(a&&r.contains(a))return{node:a};var n=e.targetNodeId;if(null!=n&&(a=r.getNodeById(n)))return{node:a}}}function n(e){for(var t=[];e;)(e=e.parentNode)&&t.push(e);return t.reverse()}function o(e,t){var r=n(e);return l.indexOf(r,t)>=0}function i(e,t){for(var r=[];e;){var a=e.dataIndex;r.push({name:e.name,dataIndex:a,value:t.getRawValue(a)}),e=e.parentNode}return r.reverse(),r}var l=r(0);t.retrieveTargetInfo=a,t.getPathToRoot=n,t.aboveViewRoot=o,t.wrapTreePathInfo=i},function(e,t,r){"use strict";var a=r(2),n=r(0),o=r(164),i=r(849);r(845),r(846),r(343),a.registerPreprocessor(function(e){if(e){(!e.axisPointer||0===e.axisPointer.length)&&(e.axisPointer={});var t=e.axisPointer.link;t&&!n.isArray(t)&&(e.axisPointer.link=[t])}}),a.registerProcessor(a.PRIORITY.PROCESSOR.STATISTIC,function(e,t){e.getComponent("axisPointer").coordSysAxesInfo=o.collect(e,t)}),a.registerAction({type:"updateAxisPointer",event:"updateAxisPointer",update:":updateAxisPointer"},i)},function(e,t,r){"use strict";function a(e){var t={};return d(["start","end","startValue","endValue","throttle"],function(r){e.hasOwnProperty(r)&&(t[r]=e[r])}),t}function n(e,t){var r=e._rangePropMode,a=e.get("rangeMode");d([["start","startValue"],["end","endValue"]],function(e,n){var o=null!=t[e[0]],i=null!=t[e[1]];o&&!i?r[n]="percent":!o&&i?r[n]="value":a?r[n]=a[n]:o&&(r[n]="percent")})}var o=r(9),i=(o.__DEV__,r(2)),l=r(0),s=r(25),u=r(10),h=r(240),c=r(860),d=l.each,m=h.eachAxisDim,p=i.extendComponentModel({type:"dataZoom",dependencies:["xAxis","yAxis","zAxis","radiusAxis","angleAxis","singleAxis","series"],defaultOption:{zlevel:0,z:4,orient:null,xAxisIndex:null,yAxisIndex:null,filterMode:"filter",throttle:null,start:0,end:100,startValue:null,endValue:null,minSpan:null,maxSpan:null,minValueSpan:null,maxValueSpan:null,rangeMode:null},init:function(e,t,r){this._dataIntervalByAxis={},this._dataInfo={},this._axisProxies={},this.textStyleModel,this._autoThrottle=!0,this._rangePropMode=["percent","percent"];var n=a(e);this.mergeDefaultAndTheme(e,r),this.doInit(n)},mergeOption:function(e){var t=a(e);l.merge(this.option,e,!0),this.doInit(t)},doInit:function(e){var t=this.option;s.canvasSupported||(t.realtime=!1),this._setDefaultThrottle(e),n(this,e),d([["start","startValue"],["end","endValue"]],function(e,r){"value"===this._rangePropMode[r]&&(t[e[0]]=null)},this),this.textStyleModel=this.getModel("textStyle"),this._resetTarget(),this._giveAxisProxies()},_giveAxisProxies:function(){var e=this._axisProxies;this.eachTargetAxis(function(t,r,a,n){var o=this.dependentModels[t.axis][r],i=o.__dzAxisProxy||(o.__dzAxisProxy=new c(t.name,r,this,n));e[t.name+"_"+r]=i},this)},_resetTarget:function(){var e=this.option,t=this._judgeAutoMode();m(function(t){var r=t.axisIndex;e[r]=u.normalizeToArray(e[r])},this),"axisIndex"===t?this._autoSetAxisIndex():"orient"===t&&this._autoSetOrient()},_judgeAutoMode:function(){var e=this.option,t=!1;m(function(r){null!=e[r.axisIndex]&&(t=!0)},this);var r=e.orient;return null==r&&t?"orient":t?void 0:(null==r&&(e.orient="horizontal"),"axisIndex")},_autoSetAxisIndex:function(){var e=!0,t=this.get("orient",!0),r=this.option,a=this.dependentModels;if(e){var n="vertical"===t?"y":"x";a[n+"Axis"].length?(r[n+"AxisIndex"]=[0],e=!1):d(a.singleAxis,function(a){e&&a.get("orient",!0)===t&&(r.singleAxisIndex=[a.componentIndex],e=!1)})}e&&m(function(t){if(e){var a=[],n=this.dependentModels[t.axis];if(n.length&&!a.length)for(var o=0,i=n.length;o<i;o++)"category"===n[o].get("type")&&a.push(o);r[t.axisIndex]=a,a.length&&(e=!1)}},this),e&&this.ecModel.eachSeries(function(e){this._isSeriesHasAllAxesTypeOf(e,"value")&&m(function(t){var a=r[t.axisIndex],n=e.get(t.axisIndex),o=e.get(t.axisId);n=e.ecModel.queryComponents({mainType:t.axis,index:n,id:o})[0].componentIndex,l.indexOf(a,n)<0&&a.push(n)})},this)},_autoSetOrient:function(){var e;this.eachTargetAxis(function(t){!e&&(e=t.name)},this),this.option.orient="y"===e?"vertical":"horizontal"},_isSeriesHasAllAxesTypeOf:function(e,t){var r=!0;return m(function(a){var n=e.get(a.axisIndex),o=this.dependentModels[a.axis][n];o&&o.get("type")===t||(r=!1)},this),r},_setDefaultThrottle:function(e){if(e.hasOwnProperty("throttle")&&(this._autoThrottle=!1),this._autoThrottle){var t=this.ecModel.option;this.option.throttle=t.animation&&t.animationDurationUpdate>0?100:20}},getFirstTargetAxisModel:function(){var e;return m(function(t){if(null==e){var r=this.get(t.axisIndex);r.length&&(e=this.dependentModels[t.axis][r[0]])}},this),e},eachTargetAxis:function(e,t){var r=this.ecModel;m(function(a){d(this.get(a.axisIndex),function(n){e.call(t,a,n,this,r)},this)},this)},getAxisProxy:function(e,t){return this._axisProxies[e+"_"+t]},getAxisModel:function(e,t){var r=this.getAxisProxy(e,t);return r&&r.getAxisModel()},setRawRange:function(e,t){var r=this.option;d([["start","startValue"],["end","endValue"]],function(t){null==e[t[0]]&&null==e[t[1]]||(r[t[0]]=e[t[0]],r[t[1]]=e[t[1]])},this),!t&&n(this,e)},getPercentRange:function(){var e=this.findRepresentativeAxisProxy();if(e)return e.getDataPercentWindow()},getValueRange:function(e,t){if(null!=e||null!=t)return this.getAxisProxy(e,t).getDataValueWindow();var r=this.findRepresentativeAxisProxy();return r?r.getDataValueWindow():void 0},findRepresentativeAxisProxy:function(e){if(e)return e.__dzAxisProxy;var t=this._axisProxies;for(var r in t)if(t.hasOwnProperty(r)&&t[r].hostedBy(this))return t[r];for(var r in t)if(t.hasOwnProperty(r)&&!t[r].hostedBy(this))return t[r]},getRangePropMode:function(){return this._rangePropMode.slice()}}),f=p;e.exports=f},function(e,t,r){"use strict";var a=r(252),n=a.extend({type:"dataZoom",render:function(e,t,r,a){this.dataZoomModel=e,this.ecModel=t,this.api=r},getTargetCoordInfo:function(){function e(e,t,r,a){for(var n,o=0;o<r.length;o++)if(r[o].model===e){n=r[o];break}n||r.push(n={model:e,axisModels:[],coordIndex:a}),n.axisModels.push(t)}var t=this.dataZoomModel,r=this.ecModel,a={};return t.eachTargetAxis(function(t,n){var o=r.getComponent(t.axis,n);if(o){var i=o.getCoordSysModel();i&&e(i,o,a[i.mainType]||(a[i.mainType]=[]),i.componentIndex)}},this),a}});e.exports=n},function(e,t,r){"use strict";var a=r(2),n=r(0),o=r(3);r(247),r(838),a.extendComponentView({type:"grid",render:function(e,t){this.group.removeAll(),e.get("show")&&this.group.add(new o.Rect({shape:e.coordinateSystem.getRect(),style:n.defaults({fill:e.get("backgroundColor")},e.getItemStyle()),silent:!0,z2:-1}))}}),a.registerPreprocessor(function(e){e.xAxis&&e.yAxis&&!e.grid&&(e.grid={})})},function(e,t,r){"use strict";function a(e,t,r,a,i,l){t[0]=o(t[0],r),t[1]=o(t[1],r),e=e||0;var s=r[1]-r[0];null!=i&&(i=o(i,[0,s])),null!=l&&(l=Math.max(l,null!=i?i:0)),"all"===a&&(i=l=Math.abs(t[1]-t[0]),a=0);var u=n(t,a);t[a]+=e;var h=i||0,c=r.slice();u.sign<0?c[0]+=h:c[1]-=h,t[a]=o(t[a],c);var d=n(t,a);null!=i&&(d.sign!==u.sign||d.span<i)&&(t[1-a]=t[a]+u.sign*i);var d=n(t,a);return null!=l&&d.span>l&&(t[1-a]=t[a]+d.sign*l),t}function n(e,t){var r=e[t]-e[1-t];return{span:Math.abs(r),sign:r>0?-1:r<0?1:t?-1:1}}function o(e,t){return Math.min(t[1],Math.max(t[0],e))}e.exports=a},function(e,t,r){"use strict";function a(e){if(!o(e))return!1;var t=n(e);return t==l||t==s||t==i||t==u}var n=r(96),o=r(183),i="[object AsyncFunction]",l="[object Function]",s="[object GeneratorFunction]",u="[object Proxy]";e.exports=a},function(e,t,r){"use strict";function a(e){return"symbol"==(void 0===e?"undefined":n(e))||i(e)&&o(e)==l}var 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},o=r(96),i=r(97),l="[object Symbol]";e.exports=a},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function n(e){var t=[];return v.default.Children.forEach(e,function(e){t.push(e)}),t}function o(e){return e||0===e?Array.isArray(e)?e:[e]:[]}function i(e,t){if(e===t||(0,g.default)(e,t))return!0;if(!e||!t)return!1;var r=!0;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(var a=0;a<e.length;a++){var n=e[a],o=t[a];for(var l in n)if(n[l]!==o[l])if("object"===p(n[l])&&"object"===p(o[l]))r=i(n[l],o[l]);else{if("function"!=typeof n[l]||"function"!=typeof o[l])return r=!1,!1;n[l].name!==o[l].name&&(r=!1)}}}var s=function(e,t){Object.keys(e).forEach(function(a){a in t||(r=!1),"object"===p(e[a])&&"object"===p(t[a])?r=i(e[a],t[a]):"function"==typeof e[a]&&"function"==typeof t[a]?e[a].name!==t[a].name&&(r=!1):e[a]!==t[a]&&(r=!1)})};return s(e,t),s(t,e),r}function l(e,t){var r=null;return e&&e.forEach(function(e){!r&&e&&e.key===t&&(r=e)}),r}function s(e,t){var r=[],a={},n=[],o=void 0;return e.forEach(function(e){e&&(l(t,e.key)?(n.length&&(a[e.key]=n,n=[]),o=e.key):e.key&&n.push(e))}),o||(r=r.concat(n)),t.forEach(function(e){e&&(a.hasOwnProperty(e.key)&&(r=r.concat(a[e.key])),r.push(e),e.key===o&&(r=r.concat(n)))}),r}function u(e,t,r){return"function"==typeof e?e({key:t,index:r}):e}function h(e){return e&&e.children}function c(e,t,r,a,n,o,i,l){if(_)return a;var s=/(?:Left|Right|Width|X)/i.test(r)||l;s="padding"===r||"marign"===r||s;var u=-1!==r.indexOf("border")||-1!==r.indexOf("translate")||"transformOrigin"===r?e:e.parentNode||document.body;u=i?document.body:u;var h=void 0,c=void 0;switch(n){case"%":h=parseFloat(a)/100*(s?u.clientWidth:u.clientHeight);break;case"vw":h=parseFloat(a)*document.body.clientWidth/100;break;case"vh":h=parseFloat(a)*document.body.clientHeight/100;break;case"em":h=parseFloat(a)*parseFloat(t.fontSize);break;case"rem":c=window.getComputedStyle(document.getElementsByTagName("html")[0]),h=parseFloat(a)*parseFloat(c.fontSize);break;default:h=parseFloat(a)}switch(o){case"%":h=h?100*h/(s?u.clientWidth:u.clientHeight):0;break;case"vw":h=parseFloat(a)/document.body.clientWidth*100;break;case"vh":h=parseFloat(a)/document.body.clientHeight*100;break;case"em":h=parseFloat(a)/parseFloat(t.fontSize);break;case"rem":c=c||window.getComputedStyle(document.getElementsByTagName("html")[0]),h=parseFloat(a)/parseFloat(c.fontSize)}return h}function d(e){if("string"==typeof e){if(e.charAt(0).match(/m/i)){var t=document.createElementNS("http://www.w3.org/2000/svg","path");return t.setAttributeNS(null,"d",e),t}return document.querySelector(e)}if(e.style)return e;throw new Error("Error while parsing the path")}function m(e){if("string"==typeof e)return e;var t=e.perspective,r=e.rotate,a=e.rotateX,n=e.rotateY,o=e.scaleX,i=e.scaleY,l=e.scaleZ,s=e.skewX,u=e.skewY,h="string"==typeof e.translateX?e.translateX:e.translateX+"px",c="string"==typeof e.translateY?e.translateY:e.translateY+"px",d="string"==typeof e.translateZ?e.translateZ:e.translateZ+"px",m=s||u?"skew("+s+"deg,"+u+"deg)":"",p=r?"rotate("+r+"deg)":"",f=1!==o||1!==i||1!==l?"scale3d("+o+","+i+","+l+")":"",v=a?"rotateX("+a+"deg)":"",y=n?"rotateY("+n+"deg)":"",g=t?"perspective("+t+"px)":"",_=f||p||v||y||m?"":"translate(0px, 0px)";return(g+" "+(e.translateZ?"translate3d("+h+","+c+","+d+")":(e.translateX||e.translateY)&&"translate("+h+","+c+")"||_)+" "+f+" "+p+" "+v+" "+y+" "+m).trim()}var p="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};Object.defineProperty(t,"__esModule",{value:!0}),t.windowIsUndefined=void 0,t.toArrayChildren=n,t.dataToArray=o,t.objectEqual=i,t.findChildInChildrenByKey=l,t.mergeChildren=s,t.transformArguments=u,t.getChildrenFromProps=h,t.startConvertToEndUnit=c,t.parsePath=d,t.getTransformValue=m;var f=r(15),v=a(f),y=r(725),g=a(y),_=t.windowIsUndefined=!("undefined"!=typeof window&&window.document&&window.document.createElement)},function(e,t,r){"use strict";function a(e,t,r){if(e[t])return new Error("<"+r+'> should not have a "'+t+'" prop')}t.__esModule=!0,t.routes=t.route=t.components=t.component=t.history=void 0,t.falsy=a;var n=r(21),o=(t.history=(0,n.shape)({listen:n.func.isRequired,push:n.func.isRequired,replace:n.func.isRequired,go:n.func.isRequired,goBack:n.func.isRequired,goForward:n.func.isRequired}),t.component=(0,n.oneOfType)([n.func,n.string])),i=(t.components=(0,n.oneOfType)([o,n.object]),t.route=(0,n.oneOfType)([n.object,n.element]));t.routes=(0,n.oneOfType)([i,(0,n.arrayOf)(i)])},function(e,t,r){"use strict";var a=r(189),n=a.debugMode,o=function(){};1===n?o=function(){for(var e in arguments)throw new Error(arguments[e])}:n>1&&(o=function(){for(var e in arguments)console.log(arguments[e])});var i=o;e.exports=i},function(e,t,r){"use strict";function a(e){n.call(this,e)}var n=r(191),o=r(19),i=r(0),l=r(276);a.prototype={constructor:a,type:"image",brush:function(e,t){var r=this.style,a=r.image;r.bind(e,this,t);var n=this._image=l.createOrUpdateImage(a,this._image,this,this.onload);if(n&&l.isImageReady(n)){var o=r.x||0,i=r.y||0,s=r.width,u=r.height,h=n.width/n.height;if(null==s&&null!=u?s=u*h:null==u&&null!=s?u=s/h:null==s&&null==u&&(s=n.width,u=n.height),this.setTransform(e),r.sWidth&&r.sHeight){var c=r.sx||0,d=r.sy||0;e.drawImage(n,c,d,r.sWidth,r.sHeight,o,i,s,u)}else if(r.sx&&r.sy){var c=r.sx,d=r.sy,m=s-c,p=u-d;e.drawImage(n,c,d,m,p,o,i,s,u)}else e.drawImage(n,o,i,s,u);this.restoreTransform(e),null!=r.text&&this.drawRectText(e,this.getBoundingRect())}},getBoundingRect:function(){var e=this.style;return this._rect||(this._rect=new o(e.x||0,e.y||0,e.width||0,e.height||0)),this._rect}},i.inherits(a,n);var s=a;e.exports=s},function(e,t,r){"use strict";var a=r(191),n=r(0),o=r(54),i=r(193),l=function(e){a.call(this,e)};l.prototype={constructor:l,type:"text",brush:function(e,t){var r=this.style;this.__dirty&&i.normalizeTextStyle(r,!0),r.fill=r.stroke=r.shadowBlur=r.shadowColor=r.shadowOffsetX=r.shadowOffsetY=null;var a=r.text;null!=a&&(a+=""),r.bind(e,this,t),i.needDrawText(a,r)&&(this.setTransform(e),i.renderText(this,e,a,r),this.restoreTransform(e))},getBoundingRect:function(){var e=this.style;if(this.__dirty&&i.normalizeTextStyle(e,!0),!this._rect){var t=e.text;null!=t?t+="":t="";var r=o.getBoundingRect(e.text+"",e.font,e.textAlign,e.textVerticalAlign,e.textPadding,e.rich);if(r.x+=e.x||0,r.y+=e.y||0,i.getStroke(e.textStroke,e.textStrokeWidth)){var a=e.textStrokeWidth;r.x-=a/2,r.y-=a/2,r.width+=a,r.height+=a}this._rect=r}return this._rect}},n.inherits(l,a);var s=l;e.exports=s},function(e,t,r){"use strict";function a(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(a)}catch(e){console.error(e)}}a(),e.exports=r(1129)},function(e,t,r){"use strict";e.exports=!0},function(e,t,r){"use strict";var a=r(289),n=r(200);e.exports=Object.keys||function(e){return a(e,n)}},function(e,t,r){"use strict";t.f={}.propertyIsEnumerable},function(e,t,r){"use strict";var a=0,n=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++a+n).toString(36))}},function(e,t,r){"use strict";var a=r(36),n=r(18),o=r(88);e.exports=function(e){return function(t,r,i){var l,s=a(t),u=n(s.length),h=o(i,u);if(e&&r!=r){for(;u>h;)if((l=s[h++])!=l)return!0}else for(;u>h;h++)if((e||h in s)&&s[h]===r)return e||h||0;return!e&&-1}}},function(e,t,r){"use strict";var a=r(6),n=r(1),o=r(31),i=r(86),l=r(68),s=r(81),u=r(80),h=r(8),c=r(7),d=r(153),m=r(108),p=r(218);e.exports=function(e,t,r,f,v,y){var g=a[e],_=g,T=v?"set":"add",x=_&&_.prototype,w={},N=function(e){var t=x[e];o(x,e,"delete"==e?function(e){return!(y&&!h(e))&&t.call(this,0===e?0:e)}:"has"==e?function(e){return!(y&&!h(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return y&&!h(e)?void 0:t.call(this,0===e?0:e)}:"add"==e?function(e){return t.call(this,0===e?0:e),this}:function(e,r){return t.call(this,0===e?0:e,r),this})};if("function"==typeof _&&(y||x.forEach&&!c(function(){(new _).entries().next()}))){var b=new _,L=b[T](y?{}:-0,1)!=b,S=c(function(){b.has(1)}),k=d(function(e){new _(e)}),D=!y&&c(function(){for(var e=new _,t=5;t--;)e[T](t,t);return!e.has(-0)});k||(_=t(function(t,r){u(t,_,e);var a=p(new g,t,_);return void 0!=r&&s(r,v,a[T],a),a}),_.prototype=x,x.constructor=_),(S||D)&&(N("delete"),N("has"),v&&N("get")),(D||L)&&N(T),y&&x.clear&&delete x.clear}else _=f.getConstructor(t,e,v,T),i(_.prototype,r),l.NEED=!0;return m(_,e),w[e]=_,n(n.G+n.W+n.F*(_!=g),w),y||f.setStrong(_,e,v),_}},function(e,t,r){"use strict";var a=r(30),n=r(31),o=r(7),i=r(49),l=r(13);e.exports=function(e,t,r){var s=l(e),u=r(i,s,""[e]),h=u[0],c=u[1];o(function(){var t={};return t[s]=function(){return 7},7!=""[e](t)})&&(n(String.prototype,e,h),a(RegExp.prototype,s,2==t?function(e,t){return c.call(e,this,t)}:function(e){return c.call(e,this)}))}},function(e,t,r){"use strict";var a=r(5);e.exports=function(){var e=a(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}},function(e,t,r){"use strict";var a=r(41);e.exports=Array.isArray||function(e){return"Array"==a(e)}},function(e,t,r){"use strict";var a=r(8),n=r(41),o=r(13)("match");e.exports=function(e){var t;return a(e)&&(void 0!==(t=e[o])?!!t:"RegExp"==n(e))}},function(e,t,r){"use strict";var a=r(13)("iterator"),n=!1;try{var o=[7][a]();o.return=function(){n=!0},Array.from(o,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!n)return!1;var r=!1;try{var o=[7],i=o[a]();i.next=function(){return{done:r=!0}},o[a]=function(){return i},e(o)}catch(e){}return r}},function(e,t,r){"use strict";e.exports=r(67)||!r(7)(function(){var e=Math.random();__defineSetter__.call(null,e,function(){}),delete r(6)[e]})},function(e,t,r){"use strict";t.f=Object.getOwnPropertySymbols},function(e,t,r){"use strict";var a=r(1),n=r(29),o=r(43),i=r(81);e.exports=function(e){a(a.S,e,{from:function(e){var t,r,a,l,s=arguments[1];return n(this),t=void 0!==s,t&&n(s),void 0==e?new this:(r=[],t?(a=0,l=o(s,arguments[2],2),i(e,!1,function(e){r.push(l(e,a++))})):i(e,!1,r.push,r),new this(r))}})}},function(e,t,r){"use strict";var a=r(1);e.exports=function(e){a(a.S,e,{of:function(){for(var e=arguments.length,t=new Array(e);e--;)t[e]=arguments[e];return new this(t)}})}},function(e,t,r){"use strict";var a=r(42),n=r(6),o=n["__core-js_shared__"]||(n["__core-js_shared__"]={});(e.exports=function(e,t){return o[e]||(o[e]=void 0!==t?t:{})})("versions",[]).push({version:a.version,mode:r(67)?"pure":"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})},function(e,t,r){"use strict";var a=r(5),n=r(29),o=r(13)("species");e.exports=function(e,t){var r,i=a(e).constructor;return void 0===i||void 0==(r=a(i)[o])?t:n(r)}},function(e,t,r){"use strict";for(var a,n=r(6),o=r(30),i=r(89),l=i("typed_array"),s=i("view"),u=!(!n.ArrayBuffer||!n.DataView),h=u,c=0,d="Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array".split(",");c<9;)(a=n[d[c++]])?(o(a.prototype,l,!0),o(a.prototype,s,!0)):h=!1;e.exports={ABV:u,CONSTR:h,TYPED:l,VIEW:s}},function(e,t,r){"use strict";var a=r(6),n=a.navigator;e.exports=n&&n.userAgent||""},function(e,t,r){"use strict";function a(e,t){var r=e.getItemVisual(t,"symbolSize");return r instanceof Array?r.slice():[+r,+r]}function n(e){return[e[0]/2,e[1]/2]}function o(e,t,r){h.Group.call(this),this.updateData(e,t,r)}function i(e,t){this.parent.drift(e,t)}var l=r(0),s=r(38),u=s.createSymbol,h=r(3),c=r(4),d=c.parsePercent,m=r(337),p=m.findLabelValueDim,f=o.prototype;f._createSymbol=function(e,t,r,a){this.removeAll();var o=t.getItemVisual(r,"color"),l=u(e,-1,-1,2,2,o);l.attr({z2:100,culling:!0,scale:n(a)}),l.drift=i,this._symbolType=e,this.add(l)},f.stopSymbolAnimation=function(e){this.childAt(0).stopAnimation(e)},f.getSymbolPath=function(){return this.childAt(0)},f.getScale=function(){return this.childAt(0).scale},f.highlight=function(){this.childAt(0).trigger("emphasis")},f.downplay=function(){this.childAt(0).trigger("normal")},f.setZ=function(e,t){var r=this.childAt(0);r.zlevel=e,r.z=t},f.setDraggable=function(e){var t=this.childAt(0);t.draggable=e,t.cursor=e?"move":"pointer"},f.updateData=function(e,t,r){this.silent=!1;var o=e.getItemVisual(t,"symbol")||"circle",i=e.hostModel,l=a(e,t),s=o!==this._symbolType;if(s)this._createSymbol(o,e,t,l);else{var u=this.childAt(0);u.silent=!1,h.updateProps(u,{scale:n(l)},i,t)}if(this._updateCommon(e,t,l,r),s){var u=this.childAt(0),c=r&&r.fadeIn,d={scale:u.scale.slice()};c&&(d.style={opacity:u.style.opacity}),u.scale=[0,0],c&&(u.style.opacity=0),h.initProps(u,d,i,t)}this._seriesModel=i};var v=["itemStyle","normal"],y=["itemStyle","emphasis"],g=["label","normal"],_=["label","emphasis"];f._updateCommon=function(e,t,r,a){var o=this.childAt(0),i=e.hostModel,s=e.getItemVisual(t,"color");"image"!==o.type&&o.useStyle({strokeNoScale:!0});var u=a&&a.itemStyle,c=a&&a.hoverItemStyle,m=a&&a.symbolRotate,f=a&&a.symbolOffset,T=a&&a.labelModel,x=a&&a.hoverLabelModel,w=a&&a.hoverAnimation,N=a&&a.cursorStyle;if(!a||e.hasItemOption){var b=a&&a.itemModel?a.itemModel:e.getItemModel(t);u=b.getModel(v).getItemStyle(["color"]),c=b.getModel(y).getItemStyle(),m=b.getShallow("symbolRotate"),f=b.getShallow("symbolOffset"),T=b.getModel(g),x=b.getModel(_),w=b.getShallow("hoverAnimation"),N=b.getShallow("cursor")}else c=l.extend({},c);var L=o.style;o.attr("rotation",(m||0)*Math.PI/180||0),f&&o.attr("position",[d(f[0],r[0]),d(f[1],r[1])]),N&&o.attr("cursor",N),o.setColor(s,a&&a.symbolInnerColor),o.setStyle(u);var S=e.getItemVisual(t,"opacity");null!=S&&(L.opacity=S);var k=a&&a.useNameLabel,D=!k&&p(e);(k||null!=D)&&h.setLabelStyle(L,c,T,x,{labelFetcher:i,labelDataIndex:t,defaultText:k?e.getName(t):e.get(D,t),isRectText:!0,autoColor:s}),o.off("mouseover").off("mouseout").off("emphasis").off("normal"),o.hoverStyle=c,h.setHoverStyle(o);var M=n(r);if(w&&i.isAnimationEnabled()){var A=function(){var e=M[1]/M[0];this.animateTo({scale:[Math.max(1.1*M[0],M[0]+3),Math.max(1.1*M[1],M[1]+3*e)]},400,"elasticOut")},I=function(){this.animateTo({scale:M},400,"elasticOut")};o.on("mouseover",A).on("mouseout",I).on("emphasis",A).on("normal",I)}},f.fadeOut=function(e,t){var r=this.childAt(0);this.silent=r.silent=!0,!(t&&t.keepLabel)&&(r.style.text=null),h.updateProps(r,{style:{opacity:0},scale:[0,0]},this._seriesModel,this.dataIndex,e)},l.inherits(o,h.Group);var T=o;e.exports=T},function(e,t,r){"use strict";var a=r(23),n=r(45),o=r(778),i=r(0),l={_baseAxisDim:null,getInitialData:function(e,t){var r,o,l=t.getComponent("xAxis",this.get("xAxisIndex")),s=t.getComponent("yAxis",this.get("yAxisIndex")),u=l.get("type"),h=s.get("type");"category"===u?(e.layout="horizontal",r=l.getCategories(),o=!0):"category"===h?(e.layout="vertical",r=s.getCategories(),o=!0):e.layout=e.layout||"horizontal";var c=["x","y"],d="horizontal"===e.layout?0:1,m=this._baseAxisDim=c[d],p=c[1-d],f=e.data;o&&i.each(f,function(e,t){e.value&&i.isArray(e.value)?e.value.unshift(t):i.isArray(e)&&e.unshift(t)});var v=this.defaultValueDimensions,y=[{name:m,otherDims:{tooltip:!1},dimsDef:["base"]},{name:p,dimsDef:v.slice()}];y=n(y,f,{encodeDef:this.get("encode"),dimsDef:this.get("dimensions"),dimCount:v.length+1});var g=new a(y,this);return g.initData(f,r?r.slice():null),g},getBaseAxis:function(){var e=this._baseAxisDim;return this.ecModel.getComponent(e+"Axis",this.get(e+"AxisIndex")).axis}},s={init:function(){var e=this._whiskerBoxDraw=new o(this.getStyleUpdater());this.group.add(e.group)},render:function(e,t,r){this._whiskerBoxDraw.updateData(e.getData())},remove:function(e){this._whiskerBoxDraw.remove()}};t.seriesModelMixin=l,t.viewMixin=s},function(e,t,r){"use strict";function a(e,t){var r={axesInfo:{},seriesInvolved:!1,coordSysAxesInfo:{},coordSysMap:{}};return n(r,e,t),r.seriesInvolved&&i(r,e),r}function n(e,t,r){var a=t.getComponent("tooltip"),n=t.getComponent("axisPointer"),i=n.get("link",!0)||[],s=[];v(r.getCoordinateSystems(),function(r){function u(a,u,h){var p=h.model.getModel("axisPointer",n),v=p.get("show");if(v&&("auto"!==v||a||d(p))){null==u&&(u=p.get("triggerTooltip")),p=a?o(h,f,n,t,a,u):p;var y=p.get("snap"),g=m(h.model),_=u||y||"category"===h.type,T=e.axesInfo[g]={key:g,axis:h,coordSys:r,axisPointerModel:p,triggerTooltip:u,involveSeries:_,snap:y,useHandle:d(p),seriesModels:[]};c[g]=T,e.seriesInvolved|=_;var x=l(i,h);if(null!=x){var w=s[x]||(s[x]={axesInfo:{}});w.axesInfo[g]=T,w.mapper=i[x].mapper,T.linkGroup=w}}}if(r.axisPointerEnabled){var h=m(r.model),c=e.coordSysAxesInfo[h]={};e.coordSysMap[h]=r;var p=r.model,f=p.getModel("tooltip",a);if(v(r.getAxes(),y(u,!1,null)),r.getTooltipAxes&&a&&f.get("show")){var g="axis"===f.get("trigger"),_="cross"===f.get("axisPointer.type"),T=r.getTooltipAxes(f.get("axisPointer.axis"));(g||_)&&v(T.baseAxes,y(u,!_||"cross",g)),_&&v(T.otherAxes,y(u,"cross",!1))}}})}function o(e,t,r,a,n,o){var i=t.getModel("axisPointer"),l={};v(["type","snap","lineStyle","shadowStyle","label","animation","animationDurationUpdate","animationEasingUpdate","z"],function(e){l[e]=p.clone(i.get(e))}),l.snap="category"!==e.type&&!!o,"cross"===i.get("type")&&(l.type="line");var s=l.label||(l.label={});if(null==s.show&&(s.show=!1),"cross"===n&&(s.show=!0,!o)){var u=l.lineStyle=i.get("crossStyle");u&&p.defaults(s,u.textStyle)}return e.model.getModel("axisPointer",new f(l,r,a))}function i(e,t){t.eachSeries(function(t){var r=t.coordinateSystem,a=t.get("tooltip.trigger",!0),n=t.get("tooltip.show",!0);r&&"none"!==a&&!1!==a&&"item"!==a&&!1!==n&&!1!==t.get("axisPointer.show",!0)&&v(e.coordSysAxesInfo[m(r.model)],function(e){var a=e.axis;r.getAxis(a.dim)===a&&(e.seriesModels.push(t),null==e.seriesDataCount&&(e.seriesDataCount=0),e.seriesDataCount+=t.getData().count())})},this)}function l(e,t){for(var r=t.model,a=t.dim,n=0;n<e.length;n++){var o=e[n]||{};if(s(o[a+"AxisId"],r.id)||s(o[a+"AxisIndex"],r.componentIndex)||s(o[a+"AxisName"],r.name))return n}}function s(e,t){return"all"===e||p.isArray(e)&&p.indexOf(e,t)>=0||e===t}function u(e){var t=h(e);if(t){var r=t.axisPointerModel,a=t.axis.scale,n=r.option,o=r.get("status"),i=r.get("value");null!=i&&(i=a.parse(i));var l=d(r);null==o&&(n.status=l?"show":"hide");var s=a.getExtent().slice();s[0]>s[1]&&s.reverse(),(null==i||i>s[1])&&(i=s[1]),i<s[0]&&(i=s[0]),n.value=i,l&&(n.status=t.axis.scale.isBlank()?"hide":"show")}}function h(e){var t=(e.ecModel.getComponent("axisPointer")||{}).coordSysAxesInfo;return t&&t.axesInfo[m(e)]}function c(e){var t=h(e);return t&&t.axisPointerModel}function d(e){return!!e.get("handle.show")}function m(e){return e.type+"||"+e.id}var p=r(0),f=r(20),v=p.each,y=p.curry;t.collect=a,t.fixValue=u,t.getAxisInfo=h,t.getAxisPointerModel=c,t.makeKey=m},function(e,t,r){"use strict";function a(e){var t,r=e.get("type"),a=e.getModel(r+"Style");return"line"===r?(t=a.getLineStyle(),t.fill=null):"shadow"===r&&(t=a.getAreaStyle(),t.stroke=null),t}function n(e,t,r,a,n){var l=r.get("value"),s=i(l,t.axis,t.ecModel,r.get("seriesDataIndices"),{precision:r.get("label.precision"),formatter:r.get("label.formatter")}),u=r.getModel("label"),h=f.normalizeCssArray(u.get("padding")||0),c=u.getFont(),d=p.getBoundingRect(s,c),m=n.position,v=d.width+h[1]+h[3],y=d.height+h[0]+h[2],g=n.align;"right"===g&&(m[0]-=v),"center"===g&&(m[0]-=v/2);var _=n.verticalAlign;"bottom"===_&&(m[1]-=y),"middle"===_&&(m[1]-=y/2),o(m,v,y,a);var T=u.get("backgroundColor");T&&"auto"!==T||(T=t.get("axisLine.lineStyle.color")),e.label={shape:{x:0,y:0,width:v,height:y,r:u.get("borderRadius")},position:m.slice(),style:{text:s,textFont:c,textFill:u.getTextColor(),textPosition:"inside",fill:T,stroke:u.get("borderColor")||"transparent",lineWidth:u.get("borderWidth")||0,shadowBlur:u.get("shadowBlur"),shadowColor:u.get("shadowColor"),shadowOffsetX:u.get("shadowOffsetX"),shadowOffsetY:u.get("shadowOffsetY")},z2:10}}function o(e,t,r,a){var n=a.getWidth(),o=a.getHeight();e[0]=Math.min(e[0]+t,n)-t,e[1]=Math.min(e[1]+r,o)-r,e[0]=Math.max(e[0],0),e[1]=Math.max(e[1],0)}function i(e,t,r,a,n){var o=t.scale.getLabel(e,{precision:n.precision}),i=n.formatter;if(i){var l={value:y.getAxisRawValue(t,e),seriesData:[]};d.each(a,function(e){var t=r.getSeriesByIndex(e.seriesIndex),a=e.dataIndexInside,n=t&&t.getDataParams(a);n&&l.seriesData.push(n)}),d.isString(i)?o=i.replace("{value}",o):d.isFunction(i)&&(o=i(l))}return o}function l(e,t,r){var a=v.create();return v.rotate(a,a,r.rotation),v.translate(a,a,r.position),m.applyTransform([e.dataToCoord(t),(r.labelOffset||0)+(r.labelDirection||1)*(r.labelMargin||0)],a)}function s(e,t,r,a,o,i){var s=g.innerTextLayout(r.rotation,0,r.labelDirection);r.labelMargin=o.get("label.margin"),n(t,a,o,i,{position:l(a.axis,e,r),align:s.textAlign,verticalAlign:s.textVerticalAlign})}function u(e,t,r){return r=r||0,{x1:e[r],y1:e[1-r],x2:t[r],y2:t[1-r]}}function h(e,t,r){return r=r||0,{x:e[r],y:e[1-r],width:t[r],height:t[1-r]}}function c(e,t,r,a,n,o){return{cx:e,cy:t,r0:r,r:a,startAngle:n,endAngle:o,clockwise:!0}}var d=r(0),m=r(3),p=r(54),f=r(14),v=r(40),y=r(37),g=r(90);t.buildElStyle=a,t.buildLabelElOption=n,t.getValueLabel=i,t.getTransformedPosition=l,t.buildCartesianSingleLabelElOption=s,t.makeLineShape=u,t.makeRectShape=h,t.makeSectorShape=c},function(e,t,r){"use strict";function a(e){this.pointerChecker,this._zr=e,this._opt={};var t=c.bind,r=t(n,this),a=t(o,this),u=t(i,this),h=t(l,this),m=t(s,this);d.call(this),this.setPointerChecker=function(e){this.pointerChecker=e},this.enable=function(t,n){this.disable(),this._opt=c.defaults(c.clone(n)||{},{zoomOnMouseWheel:!0,moveOnMouseMove:!0,preventDefaultMouseMove:!0}),null==t&&(t=!0),!0!==t&&"move"!==t&&"pan"!==t||(e.on("mousedown",r),e.on("mousemove",a),e.on("mouseup",u)),!0!==t&&"scale"!==t&&"zoom"!==t||(e.on("mousewheel",h),e.on("pinch",m))},this.disable=function(){e.off("mousedown",r),e.off("mousemove",a),e.off("mouseup",u),e.off("mousewheel",h),e.off("pinch",m)},this.dispose=this.disable,this.isDragging=function(){return this._dragging},this.isPinching=function(){return this._pinching}}function n(e){if(!(m.notLeftMouse(e)||e.target&&e.target.draggable)){var t=e.offsetX,r=e.offsetY;this.pointerChecker&&this.pointerChecker(e,t,r)&&(this._x=t,this._y=r,this._dragging=!0)}}function o(e){if(!m.notLeftMouse(e)&&h(this,"moveOnMouseMove",e)&&this._dragging&&"pinch"!==e.gestureEvent&&!p.isTaken(this._zr,"globalPan")){var t=e.offsetX,r=e.offsetY,a=this._x,n=this._y,o=t-a,i=r-n;this._x=t,this._y=r,this._opt.preventDefaultMouseMove&&m.stop(e.event),this.trigger("pan",o,i,a,n,t,r)}}function i(e){m.notLeftMouse(e)||(this._dragging=!1)}function l(e){if(h(this,"zoomOnMouseWheel",e)&&0!==e.wheelDelta){var t=e.wheelDelta>0?1.1:1/1.1;u.call(this,e,t,e.offsetX,e.offsetY)}}function s(e){if(!p.isTaken(this._zr,"globalPan")){var t=e.pinchScale>1?1.1:1/1.1;u.call(this,e,t,e.pinchX,e.pinchY)}}function u(e,t,r,a){this.pointerChecker&&this.pointerChecker(e,r,a)&&(m.stop(e.event),this.trigger("zoom",t,r,a))}function h(e,t,r){var a=e._opt[t];return a&&(!c.isString(a)||r.event[a+"Key"])}var c=r(0),d=r(98),m=r(62),p=r(353);c.mixin(a,d);var f=a;e.exports=f},function(e,t,r){"use strict";function a(e,t,r,a){n.each(h,function(i){t.extend({type:e+"Axis."+i,mergeDefaultAndTheme:function(t,a){var o=this.layoutMode,l=o?s(t):{},h=a.getTheme();n.merge(t,h.get(i+"Axis")),n.merge(t,this.getDefaultOption()),t.type=r(e,t),o&&u(t,l,o)},defaultOption:n.mergeAll([{},o[i+"Axis"],a],!0)})}),i.registerSubTypeDefaulter(e+"Axis",n.curry(r,e))}var n=r(0),o=r(368),i=r(24),l=r(11),s=l.getLayoutParams,u=l.mergeLayoutParam,h=["value","category","time","log"];e.exports=a},function(e,t,r){"use strict";function a(e,t){var r=e.get("boundingCoords");if(null!=r){var a=r[0],n=r[1];isNaN(a[0])||isNaN(a[1])||isNaN(n[0])||isNaN(n[1])||this.setBoundingRect(a[0],a[1],n[0]-a[0],n[1]-a[1])}var o,i=this.getBoundingRect(),l=e.get("layoutCenter"),s=e.get("layoutSize"),c=t.getWidth(),d=t.getHeight(),m=e.get("aspectScale")||.75,p=i.width/i.height*m,f=!1;l&&s&&(l=[h.parsePercent(l[0],c),h.parsePercent(l[1],d)],s=h.parsePercent(s,Math.min(c,d)),isNaN(l[0])||isNaN(l[1])||isNaN(s)||(f=!0));var v;if(f){var v={};p>1?(v.width=s,v.height=s/p):(v.height=s,v.width=s*p),v.y=l[1]-v.height/2,v.x=l[0]-v.width/2}else o=e.getBoxLayoutParams(),o.aspect=p,v=u.getLayoutRect(o,{width:c,height:d});this.setViewRect(v.x,v.y,v.width,v.height),this.setCenter(e.get("center")),this.setZoom(e.get("zoom"))}function n(e,t){l.each(t.get("geoCoord"),function(t,r){e.addGeoCoord(r,t)})}var o=r(9),i=(o.__DEV__,r(2)),l=r(0),s=r(932),u=r(11),h=r(4),c={dimensions:s.prototype.dimensions,create:function(e,t){var r=[];e.eachComponent("geo",function(e,o){var l=e.get("map"),u=i.getMap(l),h=new s(l+o,l,u&&u.geoJson,u&&u.specialAreas,e.get("nameMap"));h.zoomLimit=e.get("scaleLimit"),r.push(h),n(h,e),e.coordinateSystem=h,h.model=e,h.resize=a,h.resize(e,t)}),e.eachSeries(function(e){if("geo"===e.get("coordinateSystem")){var t=e.get("geoIndex")||0;e.coordinateSystem=r[t]}});var o={};return e.eachSeriesByType("map",function(e){if(!e.getHostGeoModel()){var t=e.getMapType();o[t]=o[t]||[],o[t].push(e)}}),l.each(o,function(e,o){var u=i.getMap(o),h=l.map(e,function(e){return e.get("nameMap")}),c=new s(o,o,u&&u.geoJson,u&&u.specialAreas,l.mergeAll(h));c.zoomLimit=l.retrieve.apply(null,l.map(e,function(e){return e.get("scaleLimit")})),r.push(c),c.resize=a,c.resize(e[0],t),l.each(e,function(e){e.coordinateSystem=c,n(c,e)})}),r},getFilledRegions:function(e,t,r){var a=(e||[]).slice();r=r||{};var n=i.getMap(t),o=n&&n.geoJson;if(!o)return e;for(var s=l.createHashMap(),u=o.features,h=0;h<a.length;h++)s.set(a[h].name,a[h]);for(var h=0;h<u.length;h++){var c=u[h].properties.name;s.get(c)||(r.hasOwnProperty(c)&&(c=r[c]),a.push({name:c}))}return a}};i.registerCoordinateSystem("geo",c);var d=c;e.exports=d},function(e,t,r){"use strict";function a(e,t){var r=t.findComponents({mainType:"legend"});r&&r.length&&t.eachSeriesByType(e,function(e){var t=e.getData();t.filterSelf(function(e){for(var a=t.getName(e),n=0;n<r.length;n++)if(!r[n].isSelected(a))return!1;return!0},this)},this)}e.exports=a},function(e,t,r){"use strict";var a=r(4),n=r(14),o=r(171),i=r(377),l=a.round,s=o.extend({type:"interval",_interval:0,_intervalPrecision:2,setExtent:function(e,t){var r=this._extent;isNaN(e)||(r[0]=parseFloat(e)),isNaN(t)||(r[1]=parseFloat(t))},unionExtent:function(e){var t=this._extent;e[0]<t[0]&&(t[0]=e[0]),e[1]>t[1]&&(t[1]=e[1]),s.prototype.setExtent.call(this,t[0],t[1])},getInterval:function(){return this._interval},setInterval:function(e){this._interval=e,this._niceExtent=this._extent.slice(),this._intervalPrecision=i.getIntervalPrecision(e)},getTicks:function(){return i.intervalScaleGetTicks(this._interval,this._extent,this._niceExtent,this._intervalPrecision)},getTicksLabels:function(){for(var e=[],t=this.getTicks(),r=0;r<t.length;r++)e.push(this.getLabel(t[r]));return e},getLabel:function(e,t){if(null==e)return"";var r=t&&t.precision;return null==r?r=a.getPrecisionSafe(e)||0:"auto"===r&&(r=this._intervalPrecision),e=l(e,r,!0),n.addCommas(e)},niceTicks:function(e,t,r){e=e||5;var a=this._extent,n=a[1]-a[0];if(isFinite(n)){n<0&&(n=-n,a.reverse());var o=i.intervalScaleNiceTicks(a,e,t,r);this._intervalPrecision=o.intervalPrecision,this._interval=o.interval,this._niceExtent=o.niceTickExtent}},niceExtent:function(e){var t=this._extent;if(t[0]===t[1])if(0!==t[0]){var r=t[0];e.fixMax?t[0]-=r/2:(t[1]+=r/2,t[0]-=r/2)}else t[1]=1;var a=t[1]-t[0];isFinite(a)||(t[0]=0,t[1]=1),this.niceTicks(e.splitNumber,e.minInterval,e.maxInterval);var n=this._interval;e.fixMin||(t[0]=l(Math.floor(t[0]/n)*n)),e.fixMax||(t[1]=l(Math.ceil(t[1]/n)*n))}});s.create=function(){return new s};var u=s;e.exports=u},function(e,t,r){"use strict";function a(e){this._setting=e||{},this._extent=[1/0,-1/0],this._interval=0,this.init&&this.init.apply(this,arguments)}var n=r(58);a.prototype.parse=function(e){return e},a.prototype.getSetting=function(e){return this._setting[e]},a.prototype.contain=function(e){var t=this._extent;return e>=t[0]&&e<=t[1]},a.prototype.normalize=function(e){var t=this._extent;return t[1]===t[0]?.5:(e-t[0])/(t[1]-t[0])},a.prototype.scale=function(e){var t=this._extent;return e*(t[1]-t[0])+t[0]},a.prototype.unionExtent=function(e){var t=this._extent;e[0]<t[0]&&(t[0]=e[0]),e[1]>t[1]&&(t[1]=e[1])},a.prototype.unionExtentFromData=function(e,t){this.unionExtent(e.getDataExtent(t,!0))},a.prototype.getExtent=function(){return this._extent.slice()},a.prototype.setExtent=function(e,t){var r=this._extent;isNaN(e)||(r[0]=e),isNaN(t)||(r[1]=t)},a.prototype.getTicksLabels=function(){for(var e=[],t=this.getTicks(),r=0;r<t.length;r++)e.push(this.getLabel(t[r]));return e},a.prototype.isBlank=function(){return this._isBlank},a.prototype.setBlank=function(e){this._isBlank=e},n.enableClassExtend(a),n.enableClassManagement(a,{registerWhenExtend:!0});var o=a;e.exports=o},function(e,t,r){"use strict";function a(e){if(e)for(var t in e)if(e.hasOwnProperty(t))return!0}function n(e,t,r){function a(){var e=function(){};return e.prototype.__hidden=e.prototype,new e}var n={};return u(t,function(t){var o=n[t]=a();u(e[t],function(e,a){if(s.isValidType(a)){var n={type:a,visual:e};r&&r(n,t),o[a]=new s(n),"opacity"===a&&(n=l.clone(n),n.type="colorAlpha",o.__hidden.__alphaForOpacity=new s(n))}})}),n}function o(e,t,r){var n;l.each(r,function(e){t.hasOwnProperty(e)&&a(t[e])&&(n=!0)}),n&&l.each(r,function(r){t.hasOwnProperty(r)&&a(t[r])?e[r]=l.clone(t[r]):delete e[r]})}function i(e,t,r,a,n,o){function i(e){return r.getItemVisual(d,e)}function u(e,t){r.setItemVisual(d,e,t)}function h(e,l){d=null==o?e:l;var s=r.getRawDataItem(d);if(!s||!1!==s.visualMap)for(var h=a.call(n,e),m=t[h],p=c[h],f=0,v=p.length;f<v;f++){var y=p[f];m[y]&&m[y].applyVisual(e,i,u)}}var c={};l.each(e,function(e){var r=s.prepareVisualTypes(t[e]);c[e]=r});var d;null==o?r.each(h,!0):r.each([o],h,!0)}var l=r(0),s=r(93),u=l.each;t.createVisualMappings=n,t.replaceVisualOption=o,t.applyVisual=i},function(e,t,r){"use strict";t.__esModule=!0,t.PUSH="PUSH",t.REPLACE="REPLACE",t.POP="POP"},function(e,t,r){"use strict";t.__esModule=!0,t.addEventListener=function(e,t,r){return e.addEventListener?e.addEventListener(t,r,!1):e.attachEvent("on"+t,r)},t.removeEventListener=function(e,t,r){return e.removeEventListener?e.removeEventListener(t,r,!1):e.detachEvent("on"+t,r)},t.supportsHistory=function(){var e=window.navigator.userAgent;return(-1===e.indexOf("Android 2.")&&-1===e.indexOf("Android 4.0")||-1===e.indexOf("Mobile Safari")||-1!==e.indexOf("Chrome")||-1!==e.indexOf("Windows Phone"))&&window.history&&"pushState"in window.history},t.supportsGoWithoutReloadUsingHash=function(){return-1===window.navigator.userAgent.indexOf("Firefox")},t.supportsPopstateOnHashchange=function(){return-1===window.navigator.userAgent.indexOf("Trident")},t.isExtraneousPopstateEvent=function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")}},function(e,t,r){"use strict";function a(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var a=e[t];this.set(a[0],a[1])}}var n=r(1067),o=r(1068),i=r(1069),l=r(1070),s=r(1071);a.prototype.clear=n,a.prototype.delete=o,a.prototype.get=i,a.prototype.has=l,a.prototype.set=s,e.exports=a},function(e,t,r){"use strict";var a=r(59),n=a.Symbol;e.exports=n},function(e,t,r){"use strict";function a(e,t){for(var r=e.length;r--;)if(n(e[r][0],t))return r;return-1}var n=r(403);e.exports=a},function(e,t,r){"use strict";function a(e,t){var r=e.__data__;return n(t)?r["string"==typeof t?"string":"hash"]:r.map}var n=r(1065);e.exports=a},function(e,t,r){"use strict";var a=r(116),n=a(Object,"create");e.exports=n},function(e,t,r){"use strict";function a(e){if("string"==typeof e||n(e))return e;var t=e+"";return"0"==t&&1/e==-o?"-0":t}var n=r(136),o=1/0;e.exports=a},function(e,t,r){"use strict";function a(e){return e}e.exports=a},function(e,t,r){"use strict";function a(e){return null!=e&&o(e.length)&&!n(e)}var n=r(135),o=r(264);e.exports=a},function(e,t,r){"use strict";function a(e){var t=void 0===e?"undefined":n(e);return null!=e&&("object"==t||"function"==t)}var 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};e.exports=a},function(e,t,r){"use strict";function a(e){if(!i(e)||n(e)!=l)return!1;var t=o(e);if(null===t)return!0;var r=c.call(t,"constructor")&&t.constructor;return"function"==typeof r&&r instanceof r&&h.call(r)==d}var n=r(96),o=r(1054),i=r(97),l="[object Object]",s=Function.prototype,u=Object.prototype,h=s.toString,c=u.hasOwnProperty,d=h.call(Object);e.exports=a},function(e,t,r){"use strict";function a(e){return i(e)?n(e):o(e)}var n=r(1012),o=r(391),i=r(182);e.exports=a},function(e,t,r){"use strict";function a(e){if(null===e||void 0===e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ +var n=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},o=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,l=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},r=0;r<10;r++)t["_"+String.fromCharCode(r)]=r;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var a={};return"abcdefghijklmnopqrst".split("").forEach(function(e){a[e]=e}),"abcdefghijklmnopqrst"===Object.keys(n({},a)).join("")}catch(e){return!1}}()?Object.assign:function(e,t){for(var r,n,s=a(e),u=1;u<arguments.length;u++){r=Object(arguments[u]);for(var h in r)i.call(r,h)&&(s[h]=r[h]);if(o){n=o(r);for(var c=0;c<n.length;c++)l.call(r,n[c])&&(s[n[c]]=r[n[c]])}}return s}},function(e,t,r){"use strict";function a(){function e(e){return r.push(e),function(){return(0,i.remove)(r,e)}}function t(e){for(var t=r.slice(),a=0,n=t.length;a<n;a++)t[a](e)}var r=[];return{subscribe:e,emit:t}}function n(e){function t(){if(o&&u.length)throw(0,i.internalErr)("Cannot have a closed channel with pending takers");if(u.length&&!e.isEmpty())throw(0,i.internalErr)("Cannot have pending takers with non empty buffer")}function r(r){if(t(),(0,i.check)(r,i.is.notUndef,c),!o)if(u.length)for(var a=0;a<u.length;a++){var n=u[a];if(!n[i.MATCH]||n[i.MATCH](r))return u.splice(a,1),n(r)}else e.put(r)}function a(r,a){t(),(0,i.check)(r,i.is.func,"channel.take's callback must be a function"),arguments.length>1&&((0,i.check)(a,i.is.func,"channel.take's matcher argument must be a function"),r[i.MATCH]=a),o&&e.isEmpty()?r(s):e.isEmpty()?(u.push(r),r.cancel=function(){return(0,i.remove)(u,r)}):r(e.take())}function n(){if(t(),!o&&(o=!0,u.length)){var e=u;u=[];for(var r=0,a=e.length;r<a;r++)e[r](s);u=[]}}var o=!1,u=[];return arguments.length>0?(0,i.check)(e,i.is.buffer,h):e=l.buffers.fixed(),{take:a,put:r,close:n,get __takers__(){return u},get __closed__(){return o}}}function o(e){var t=arguments.length<=1||void 0===arguments[1]?l.buffers.none():arguments[1],r=arguments[2];arguments.length>2&&(0,i.check)(r,i.is.func,"Invalid match function passed to eventChannel");var a=n(t),o=e(function(e){u(e)?a.close():r&&!r(e)||a.put(e)});if(!i.is.func(o))throw new Error("in eventChannel: subscribe should return a function to unsubscribe");return{take:a.take,close:function(){a.__closed__||(a.close(),o())}}}Object.defineProperty(t,"__esModule",{value:!0}),t.UNDEFINED_INPUT_ERROR=t.INVALID_BUFFER=t.isEnd=t.END=void 0,t.emitter=a,t.channel=n,t.eventChannel=o;var i=r(60),l=r(273),s=t.END={type:"@@redux-saga/CHANNEL_END"},u=t.isEnd=function(e){return e&&"@@redux-saga/CHANNEL_END"===e.type},h=t.INVALID_BUFFER="invalid buffer passed to channel factory function",c=t.UNDEFINED_INPUT_ERROR="Saga was provided with an undefined action"},function(e,t,r){"use strict";function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){if(arguments.length>=2)(0,T.check)(e,T.is.notUndef,"take(channel, pattern): channel is undefined"),(0,T.check)(e,T.is.take,"take(channel, pattern): argument "+String(e)+" is not a valid channel (channel argument must have a take method)"),(0,T.check)(t,T.is.notUndef,"take(channel, pattern): pattern is undefined"),(0,T.check)(t,T.is.pattern,"take(channel, pattern): argument "+String(t)+" is not a valid pattern (pattern must be String | Function: a => boolean | Array<String>)");else if(1===arguments.length)if((0,T.check)(e,T.is.notUndef,"take(patternOrChannel): undefined argument"),T.is.take(e))t="*";else{if(!T.is.pattern(e))throw new Error("take(patternOrChannel): argument "+String(e)+" is not valid channel or a valid pattern");t=e,e=null}else t="*";return C(w,{channel:e,pattern:t})}function o(){var e=n.apply(void 0,arguments);return e[w].maybe=!0,e}function i(e,t){return arguments.length>1?((0,T.check)(e,T.is.notUndef,"put(channel, action): argument channel is undefined"),(0,T.check)(e,T.is.put,"put(channel, action): argument "+e+" is not a valid channel (channel argument must have a put method)"),(0,T.check)(t,T.is.notUndef,"put(channel, action): argument action is undefined")):((0,T.check)(e,T.is.notUndef,"put(action): argument action is undefined"),t=e,e=null),C(N,{channel:e,action:t})}function l(e){return C(b,e)}function s(e,t,r){(0,T.check)(t,T.is.notUndef,e+": argument fn is undefined");var a=null;if(T.is.array(t)){var n=t,o=_(n,2);a=o[0],t=o[1]}else if(t.fn){var i=t;a=i.context,t=i.fn}return(0,T.check)(t,T.is.func,e+": argument "+t+" is not a function"),{context:a,fn:t,args:r}}function u(e){for(var t=arguments.length,r=Array(t>1?t-1:0),a=1;a<t;a++)r[a-1]=arguments[a];return C(L,s("call",e,r))}function h(e,t){var r=arguments.length<=2||void 0===arguments[2]?[]:arguments[2];return C(L,s("apply",{context:e,fn:t},r))}function c(e){for(var t=arguments.length,r=Array(t>1?t-1:0),a=1;a<t;a++)r[a-1]=arguments[a];return C(S,s("cps",e,r))}function d(e){for(var t=arguments.length,r=Array(t>1?t-1:0),a=1;a<t;a++)r[a-1]=arguments[a];return C(k,s("fork",e,r))}function m(e){for(var t=arguments.length,r=Array(t>1?t-1:0),a=1;a<t;a++)r[a-1]=arguments[a];var n=d.apply(void 0,[e].concat(r));return n[k].detached=!0,n}function p(e){if((0,T.check)(e,T.is.notUndef,"join(task): argument task is undefined"),!R(e))throw new Error("join(task): argument "+e+" is not a valid Task object \n(HINT: if you are getting this errors in tests, consider using createMockTask from redux-saga/utils)");return C(D,e)}function f(e){if((0,T.check)(e,T.is.notUndef,"cancel(task): argument task is undefined"),!R(e))throw new Error("cancel(task): argument "+e+" is not a valid Task object \n(HINT: if you are getting this errors in tests, consider using createMockTask from redux-saga/utils)");return C(M,e)}function v(e){for(var t=arguments.length,r=Array(t>1?t-1:0),a=1;a<t;a++)r[a-1]=arguments[a];return 0===arguments.length?e=T.ident:((0,T.check)(v,T.is.notUndef,"select(selector,[...]): argument selector is undefined"),(0,T.check)(e,T.is.func,"select(selector,[...]): argument "+e+" is not a function")),C(A,{selector:e,args:r})}function y(e,t){return(0,T.check)(e,T.is.notUndef,"actionChannel(pattern,...): argument pattern is undefined"),arguments.length>1&&((0,T.check)(t,T.is.notUndef,"actionChannel(pattern, buffer): argument buffer is undefined"),(0,T.check)(t,T.is.notUndef,"actionChannel(pattern, buffer): argument "+t+" is not a valid buffer")),C(I,{pattern:e,buffer:t})}function g(){return C(z,{})}Object.defineProperty(t,"__esModule",{value:!0}),t.asEffect=void 0;var _=function(){function e(e,t){var r=[],a=!0,n=!1,o=void 0;try{for(var i,l=e[Symbol.iterator]();!(a=(i=l.next()).done)&&(r.push(i.value),!t||r.length!==t);a=!0);}catch(e){n=!0,o=e}finally{try{!a&&l.return&&l.return()}finally{if(n)throw o}}return r}return function(t,r){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,r);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();t.take=n,t.takem=o,t.put=i,t.race=l,t.call=u,t.apply=h,t.cps=c,t.fork=d,t.spawn=m,t.join=p,t.cancel=f,t.select=v,t.actionChannel=y,t.cancelled=g;var T=r(60),x=(0,T.sym)("IO"),w="TAKE",N="PUT",b="RACE",L="CALL",S="CPS",k="FORK",D="JOIN",M="CANCEL",A="SELECT",I="ACTION_CHANNEL",z="CANCELLED",C=function(e,t){var r;return r={},a(r,x,!0),a(r,e,t),r};i.sync=function(){var e=i.apply(void 0,arguments);return e[N].sync=!0,e};var R=function(e){return e[T.TASK]};t.asEffect={take:function(e){return e&&e[x]&&e[w]},put:function(e){return e&&e[x]&&e[N]},race:function(e){return e&&e[x]&&e[b]},call:function(e){return e&&e[x]&&e[L]},cps:function(e){return e&&e[x]&&e[S]},fork:function(e){return e&&e[x]&&e[k]},join:function(e){return e&&e[x]&&e[D]},cancel:function(e){return e&&e[x]&&e[M]},select:function(e){return e&&e[x]&&e[A]},actionChannel:function(e){return e&&e[x]&&e[I]},cancelled:function(e){return e&&e[x]&&e[z]}}},function(e,t,r){"use strict";var a=1;"undefined"!=typeof window&&(a=Math.max(window.devicePixelRatio||1,1));var n=a;t.debugMode=0,t.devicePixelRatio=n},function(e,t,r){"use strict";var a=r(0),n=r(434),o=r(19),i=function(e){e=e||{},n.call(this,e);for(var t in e)e.hasOwnProperty(t)&&(this[t]=e[t]);this._children=[],this.__storage=null,this.__dirty=!0};i.prototype={constructor:i,isGroup:!0,type:"group",silent:!1,children:function(){return this._children.slice()},childAt:function(e){return this._children[e]},childOfName:function(e){for(var t=this._children,r=0;r<t.length;r++)if(t[r].name===e)return t[r]},childCount:function(){return this._children.length},add:function(e){return e&&e!==this&&e.parent!==this&&(this._children.push(e),this._doAdd(e)),this},addBefore:function(e,t){if(e&&e!==this&&e.parent!==this&&t&&t.parent===this){var r=this._children,a=r.indexOf(t);a>=0&&(r.splice(a,0,e),this._doAdd(e))}return this},_doAdd:function(e){e.parent&&e.parent.remove(e),e.parent=this;var t=this.__storage,r=this.__zr;t&&t!==e.__storage&&(t.addToStorage(e),e instanceof i&&e.addChildrenToStorage(t)),r&&r.refresh()},remove:function(e){var t=this.__zr,r=this.__storage,n=this._children,o=a.indexOf(n,e);return o<0?this:(n.splice(o,1),e.parent=null,r&&(r.delFromStorage(e),e instanceof i&&e.delChildrenFromStorage(r)),t&&t.refresh(),this)},removeAll:function(){var e,t,r=this._children,a=this.__storage;for(t=0;t<r.length;t++)e=r[t],a&&(a.delFromStorage(e),e instanceof i&&e.delChildrenFromStorage(a)),e.parent=null;return r.length=0,this},eachChild:function(e,t){for(var r=this._children,a=0;a<r.length;a++){var n=r[a];e.call(t,n,a)}return this},traverse:function(e,t){for(var r=0;r<this._children.length;r++){var a=this._children[r];e.call(t,a),"group"===a.type&&a.traverse(e,t)}return this},addChildrenToStorage:function(e){for(var t=0;t<this._children.length;t++){var r=this._children[t];e.addToStorage(r),r instanceof i&&r.addChildrenToStorage(e)}},delChildrenFromStorage:function(e){for(var t=0;t<this._children.length;t++){var r=this._children[t];e.delFromStorage(r),r instanceof i&&r.delChildrenFromStorage(e)}},dirty:function(){return this.__dirty=!0,this.__zr&&this.__zr.refresh(),this},getBoundingRect:function(e){for(var t=null,r=new o(0,0,0,0),a=e||this._children,n=[],i=0;i<a.length;i++){var l=a[i];if(!l.ignore&&!l.invisible){var s=l.getBoundingRect(),u=l.getLocalTransform(n);u?(r.copy(s),r.applyTransform(u),t=t||r.clone(),t.union(r)):(t=t||s.clone(),t.union(s))}}return t||r}},a.inherits(i,n);var l=i;e.exports=l},function(e,t,r){"use strict";function a(e){e=e||{},i.call(this,e);for(var t in e)e.hasOwnProperty(t)&&"style"!==t&&(this[t]=e[t]);this.style=new o(e.style,this),this._rect=null,this.__clipPaths=[]}var n=r(0),o=r(446),i=r(434),l=r(450);a.prototype={constructor:a,type:"displayable",__dirty:!0,invisible:!1,z:0,z2:0,zlevel:0,draggable:!1,dragging:!1,silent:!1,culling:!1,cursor:"pointer",rectHover:!1,progressive:-1,beforeBrush:function(e){},afterBrush:function(e){},brush:function(e,t){},getBoundingRect:function(){},contain:function(e,t){return this.rectContain(e,t)},traverse:function(e,t){e.call(t,this)},rectContain:function(e,t){var r=this.transformCoordToLocal(e,t);return this.getBoundingRect().contain(r[0],r[1])},dirty:function(){this.__dirty=!0,this._rect=null,this.__zr&&this.__zr.refresh()},animateStyle:function(e){return this.animate("style",e)},attrKV:function(e,t){"style"!==e?i.prototype.attrKV.call(this,e,t):this.style.set(t)},setStyle:function(e,t){return this.style.set(e,t),this.dirty(!1),this},useStyle:function(e){return this.style=new o(e,this),this.dirty(!1),this}},n.inherits(a,i),n.mixin(a,l);var s=a;e.exports=s},function(e,t,r){"use strict";var a=function(e){this.colorStops=e||[]};a.prototype={constructor:a,addColorStop:function(e,t){this.colorStops.push({offset:e,color:t})}};var n=a;e.exports=n},function(e,t,r){"use strict";function a(e){return n(e),b(e.rich,n),e}function n(e){if(e){e.font=D.makeFont(e);var t=e.textAlign;"middle"===t&&(t="center"),e.textAlign=null==t||I[t]?t:"left";var r=e.textVerticalAlign||e.textBaseline;"center"===r&&(r="middle"),e.textVerticalAlign=null==r||z[r]?r:"top",e.textPadding&&(e.textPadding=L(e.textPadding))}}function o(e,t,r,a,n){a.rich?l(e,t,r,a,n):i(e,t,r,a,n)}function i(e,t,r,a,n){var o=f(t,"font",a.font||D.DEFAULT_FONT),i=a.textPadding,l=e.__textCotentBlock;l&&!e.__dirty||(l=e.__textCotentBlock=D.parsePlainText(r,o,i,a.truncate));var s=l.outerHeight,h=l.lines,m=l.lineHeight,g=p(s,a,n),T=g.baseX,x=g.baseY,w=g.textAlign,N=g.textVerticalAlign;u(t,a,n,T,x);var b=D.adjustTextY(x,s,N),L=T,S=b,k=c(a);if(k||i){var M=D.getWidth(r,o),A=M;i&&(A+=i[1]+i[3]);var I=D.adjustTextX(T,A,w);k&&d(e,t,a,I,b,A,s),i&&(L=_(T,w,i),S+=i[0])}f(t,"textAlign",w||"left"),f(t,"textBaseline","middle"),f(t,"shadowBlur",a.textShadowBlur||0),f(t,"shadowColor",a.textShadowColor||"transparent"),f(t,"shadowOffsetX",a.textShadowOffsetX||0),f(t,"shadowOffsetY",a.textShadowOffsetY||0),S+=m/2;var z=a.textStrokeWidth,C=v(a.textStroke,z),R=y(a.textFill);C&&(f(t,"lineWidth",z),f(t,"strokeStyle",C)),R&&f(t,"fillStyle",R);for(var E=0;E<h.length;E++)C&&t.strokeText(h[E],L,S),R&&t.fillText(h[E],L,S),S+=m}function l(e,t,r,a,n){var o=e.__textCotentBlock;o&&!e.__dirty||(o=e.__textCotentBlock=D.parseRichText(r,a)),s(e,t,o,a,n)}function s(e,t,r,a,n){var o=r.width,i=r.outerWidth,l=r.outerHeight,s=a.textPadding,m=p(l,a,n),f=m.baseX,v=m.baseY,y=m.textAlign,g=m.textVerticalAlign;u(t,a,n,f,v);var _=D.adjustTextX(f,i,y),T=D.adjustTextY(v,l,g),x=_,w=T;s&&(x+=s[3],w+=s[0]);var N=x+o;c(a)&&d(e,t,a,_,T,i,l);for(var b=0;b<r.lines.length;b++){for(var L,S=r.lines[b],k=S.tokens,M=k.length,A=S.lineHeight,I=S.width,z=0,C=x,R=N,E=M-1;z<M&&(L=k[z],!L.textAlign||"left"===L.textAlign);)h(e,t,L,a,A,w,C,"left"),I-=L.width,C+=L.width,z++;for(;E>=0&&(L=k[E],"right"===L.textAlign);)h(e,t,L,a,A,w,R,"right"),I-=L.width,R-=L.width,E--;for(C+=(o-(C-x)-(N-R)-I)/2;z<=E;)L=k[z],h(e,t,L,a,A,w,C+L.width/2,"center"),C+=L.width,z++;w+=A}}function u(e,t,r,a,n){if(r&&t.textRotation){var o=t.textOrigin;"center"===o?(a=r.width/2+r.x,n=r.height/2+r.y):o&&(a=o[0]+r.x,n=o[1]+r.y),e.translate(a,n),e.rotate(-t.textRotation),e.translate(-a,-n)}}function h(e,t,r,a,n,o,i,l){var s=a.rich[r.styleName]||{},u=r.textVerticalAlign,h=o+n/2;"top"===u?h=o+r.height/2:"bottom"===u&&(h=o+n-r.height/2),!r.isLineHolder&&c(s)&&d(e,t,s,"right"===l?i-r.width:"center"===l?i-r.width/2:i,h-r.height/2,r.width,r.height);var m=r.textPadding;m&&(i=_(i,l,m),h-=r.height/2-m[2]-r.textHeight/2),f(t,"shadowBlur",N(s.textShadowBlur,a.textShadowBlur,0)),f(t,"shadowColor",s.textShadowColor||a.textShadowColor||"transparent"),f(t,"shadowOffsetX",N(s.textShadowOffsetX,a.textShadowOffsetX,0)),f(t,"shadowOffsetY",N(s.textShadowOffsetY,a.textShadowOffsetY,0)),f(t,"textAlign",l),f(t,"textBaseline","middle"),f(t,"font",r.font||D.DEFAULT_FONT);var p=v(s.textStroke||a.textStroke,T),g=y(s.textFill||a.textFill),T=w(s.textStrokeWidth,a.textStrokeWidth);p&&(f(t,"lineWidth",T),f(t,"strokeStyle",p),t.strokeText(r.text,i,h)),g&&(f(t,"fillStyle",g),t.fillText(r.text,i,h))}function c(e){return e.textBackgroundColor||e.textBorderWidth&&e.textBorderColor}function d(e,t,r,a,n,o,i){var l=r.textBackgroundColor,s=r.textBorderWidth,u=r.textBorderColor,h=S(l);if(f(t,"shadowBlur",r.textBoxShadowBlur||0),f(t,"shadowColor",r.textBoxShadowColor||"transparent"),f(t,"shadowOffsetX",r.textBoxShadowOffsetX||0),f(t,"shadowOffsetY",r.textBoxShadowOffsetY||0),h||s&&u){t.beginPath();var c=r.textBorderRadius;c?M.buildPath(t,{x:a,y:n,width:o,height:i,r:c}):t.rect(a,n,o,i),t.closePath()}if(h)f(t,"fillStyle",l),t.fill();else if(k(l)){var d=l.image;(d=A.createOrUpdateImage(d,null,e,m,l))&&A.isImageReady(d)&&t.drawImage(d,a,n,o,i)}s&&u&&(f(t,"lineWidth",s),f(t,"strokeStyle",u),t.stroke())}function m(e,t){t.image=e}function p(e,t,r){var a=t.x||0,n=t.y||0,o=t.textAlign,i=t.textVerticalAlign;if(r){var l=t.textPosition;if(l instanceof Array)a=r.x+g(l[0],r.width),n=r.y+g(l[1],r.height);else{var s=D.adjustTextPositionOnRect(l,r,t.textDistance);a=s.x,n=s.y,o=o||s.textAlign,i=i||s.textVerticalAlign}var u=t.textOffset;u&&(a+=u[0],n+=u[1])}return{baseX:a,baseY:n,textAlign:o,textVerticalAlign:i}}function f(e,t,r){return e[t]=r,e[t]}function v(e,t){return null==e||t<=0||"transparent"===e||"none"===e?null:e.image||e.colorStops?"#000":e}function y(e){return null==e||"none"===e?null:e.image||e.colorStops?"#000":e}function g(e,t){return"string"==typeof e?e.lastIndexOf("%")>=0?parseFloat(e)/100*t:parseFloat(e):e}function _(e,t,r){return"right"===t?e-r[1]:"center"===t?e+r[3]/2-r[1]/2:e+r[3]}function T(e,t){return null!=e&&(e||t.textBackgroundColor||t.textBorderWidth&&t.textBorderColor||t.textPadding)}var x=r(0),w=x.retrieve2,N=x.retrieve3,b=x.each,L=x.normalizeCssArray,S=x.isString,k=x.isObject,D=r(54),M=r(449),A=r(276),I={left:1,right:1,center:1},z={top:1,bottom:1,middle:1};t.normalizeTextStyle=a,t.renderText=o,t.getStroke=v,t.getFill=y,t.needDrawText=T},function(e,t,r){"use strict";function a(e,t){var r=new _(s(),e,t);return g[r.id]=r,r}function n(e){if(e)e.dispose();else{for(var t in g)g.hasOwnProperty(t)&&g[t].dispose();g={}}return this}function o(e){return g[e]}function i(e,t){y[e]=t}function l(e){delete g[e]}var s=r(443),u=r(25),h=r(0),c=r(1189),d=r(1192),m=r(1191),p=r(1193),f=r(1201),v=!u.canvasSupported,y={canvas:m},g={},_=function(e,t,r){r=r||{},this.dom=t,this.id=e;var a=this,n=new d,o=r.renderer;if(v){if(!y.vml)throw new Error("You need to require 'zrender/vml/vml' to support IE8");o="vml"}else o&&y[o]||(o="canvas");var i=new y[o](t,n,r);this.storage=n,this.painter=i;var l=u.node?null:new f(i.getViewportRoot());this.handler=new c(n,i,l,i.root),this.animation=new p({stage:{update:h.bind(this.flush,this)}}),this.animation.start(),this._needsRefresh;var s=n.delFromStorage,m=n.addToStorage;n.delFromStorage=function(e){s.call(n,e),e&&e.removeSelfFromZr(a)},n.addToStorage=function(e){m.call(n,e),e.addSelfToZr(a)}};_.prototype={constructor:_,getId:function(){return this.id},add:function(e){this.storage.addRoot(e),this._needsRefresh=!0},remove:function(e){this.storage.delRoot(e),this._needsRefresh=!0},configLayer:function(e,t){this.painter.configLayer(e,t),this._needsRefresh=!0},refreshImmediately:function(){this._needsRefresh=!1,this.painter.refresh(),this._needsRefresh=!1},refresh:function(){this._needsRefresh=!0},flush:function(){this._needsRefresh&&this.refreshImmediately(),this._needsRefreshHover&&this.refreshHoverImmediately()},addHover:function(e,t){this.painter.addHover&&(this.painter.addHover(e,t),this.refreshHover())},removeHover:function(e){this.painter.removeHover&&(this.painter.removeHover(e),this.refreshHover())},clearHover:function(){this.painter.clearHover&&(this.painter.clearHover(),this.refreshHover())},refreshHover:function(){this._needsRefreshHover=!0},refreshHoverImmediately:function(){this._needsRefreshHover=!1,this.painter.refreshHover&&this.painter.refreshHover()},resize:function(e){e=e||{},this.painter.resize(e.width,e.height),this.handler.resize()},clearAnimation:function(){this.animation.clear()},getWidth:function(){return this.painter.getWidth()},getHeight:function(){return this.painter.getHeight()},pathToImage:function(e,t){return this.painter.pathToImage(e,t)},setCursorStyle:function(e){this.handler.setCursorStyle(e)},findHover:function(e,t){return this.handler.findHover(e,t)},on:function(e,t,r){this.handler.on(e,t,r)},off:function(e,t){this.handler.off(e,t)},trigger:function(e,t){this.handler.trigger(e,t)},clear:function(){this.storage.delRoot(),this.painter.clear()},dispose:function(){this.animation.stop(),this.clear(),this.storage.dispose(),this.painter.dispose(),this.handler.dispose(),this.animation=this.storage=this.painter=this.handler=null,l(this.id)}},t.version="3.7.4",t.init=a,t.dispose=n,t.getInstance=o,t.registerPainter=i},function(e,t){(function(t){e.exports=t}).call(t,{})},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}var 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.__esModule=!0;var o=r(476),i=a(o),l=r(475),s=a(l),u="function"==typeof s.default&&"symbol"===n(i.default)?function(e){return void 0===e?"undefined":n(e)}:function(e){return e&&"function"==typeof s.default&&e.constructor===s.default&&e!==s.default.prototype?"symbol":void 0===e?"undefined":n(e)};t.default="function"==typeof s.default&&"symbol"===u(i.default)?function(e){return void 0===e?"undefined":u(e)}:function(e){return e&&"function"==typeof s.default&&e.constructor===s.default&&e!==s.default.prototype?"symbol":void 0===e?"undefined":u(e)}},function(e,t,r){"use strict";var a={}.toString;e.exports=function(e){return a.call(e).slice(8,-1)}},function(e,t,r){"use strict";var a=r(490);e.exports=function(e,t,r){if(a(e),void 0===t)return e;switch(r){case 1:return function(r){return e.call(t,r)};case 2:return function(r,a){return e.call(t,r,a)};case 3:return function(r,a,n){return e.call(t,r,a,n)}}return function(){return e.apply(t,arguments)}}},function(e,t,r){"use strict";e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,r){"use strict";e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t,r){"use strict";var a=r(103),n=r(505),o=r(200),i=r(204)("IE_PROTO"),l=function(){},s=function(){var e,t=r(283)("iframe"),a=o.length;for(t.style.display="none",r(496).appendChild(t),t.src="javascript:",e=t.contentWindow.document,e.open(),e.write("<script>document.F=Object<\/script>"),e.close(),s=e.F;a--;)delete s.prototype[o[a]];return s()};e.exports=Object.create||function(e,t){var r;return null!==e?(l.prototype=a(e),r=new l,l.prototype=null,r[i]=e):r=s(),void 0===t?r:n(r,t)}},function(e,t,r){"use strict";t.f=Object.getOwnPropertySymbols},function(e,t,r){"use strict";var a=r(65).f,n=r(79),o=r(47)("toStringTag");e.exports=function(e,t,r){e&&!n(e=r?e:e.prototype,o)&&a(e,o,{configurable:!0,value:t})}},function(e,t,r){"use strict";var a=r(205)("keys"),n=r(146);e.exports=function(e){return a[e]||(a[e]=n(e))}},function(e,t,r){"use strict";var a=r(46),n=r(64),o=n["__core-js_shared__"]||(n["__core-js_shared__"]={});(e.exports=function(e,t){return o[e]||(o[e]=void 0!==t?t:{})})("versions",[]).push({version:a.version,mode:r(143)?"pure":"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})},function(e,t,r){"use strict";var a=Math.ceil,n=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?n:a)(e)}},function(e,t,r){"use strict";var a=r(199);e.exports=function(e){return Object(a(e))}},function(e,t,r){"use strict";var a=r(105);e.exports=function(e,t){if(!a(e))return e;var r,n;if(t&&"function"==typeof(r=e.toString)&&!a(n=r.call(e)))return n;if("function"==typeof(r=e.valueOf)&&!a(n=r.call(e)))return n;if(!t&&"function"==typeof(r=e.toString)&&!a(n=r.call(e)))return n;throw TypeError("Can't convert object to primitive value")}},function(e,t,r){"use strict";var a=r(64),n=r(46),o=r(143),i=r(210),l=r(65).f;e.exports=function(e){var t=n.Symbol||(n.Symbol=o?{}:a.Symbol||{});"_"==e.charAt(0)||e in t||l(t,e,{value:i.f(e)})}},function(e,t,r){"use strict";t.f=r(47)},function(e,t,r){"use strict";var a=r(22),n=r(88),o=r(18);e.exports=function(e){for(var t=a(this),r=o(t.length),i=arguments.length,l=n(i>1?arguments[1]:void 0,r),s=i>2?arguments[2]:void 0,u=void 0===s?r:n(s,r);u>l;)t[l++]=e;return t}},function(e,t,r){"use strict";var a=r(523);e.exports=function(e,t){return new(a(e))(t)}},function(e,t,r){"use strict";var a=r(17),n=r(85);e.exports=function(e,t,r){t in e?a.f(e,t,n(0,r)):e[t]=r}},function(e,t,r){"use strict";var a=r(8),n=r(6).document,o=a(n)&&a(n.createElement);e.exports=function(e){return o?n.createElement(e):{}}},function(e,t,r){"use strict";e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t,r){"use strict";var a=r(13)("match");e.exports=function(e){var t=/./;try{"/./"[e](t)}catch(r){try{return t[a]=!1,!"/./"[e](t)}catch(e){}}return!0}},function(e,t,r){"use strict";var a=r(6).document;e.exports=a&&a.documentElement},function(e,t,r){"use strict";var a=r(8),n=r(226).set;e.exports=function(e,t,r){var o,i=t.constructor;return i!==r&&"function"==typeof i&&(o=i.prototype)!==r.prototype&&a(o)&&n&&n(e,o),e}},function(e,t,r){"use strict";var a=r(107),n=r(13)("iterator"),o=Array.prototype;e.exports=function(e){return void 0!==e&&(a.Array===e||o[n]===e)}},function(e,t,r){"use strict";var a=r(82),n=r(85),o=r(108),i={};r(30)(i,r(13)("iterator"),function(){return this}),e.exports=function(e,t,r){e.prototype=a(i,{next:n(1,r)}),o(e,t+" Iterator")}},function(e,t,r){"use strict";var a=r(67),n=r(1),o=r(31),i=r(30),l=r(107),s=r(220),u=r(108),h=r(35),c=r(13)("iterator"),d=!([].keys&&"next"in[].keys()),m=function(){return this};e.exports=function(e,t,r,p,f,v,y){s(r,t,p);var g,_,T,x=function(e){if(!d&&e in L)return L[e];switch(e){case"keys":case"values":return function(){return new r(this,e)}}return function(){return new r(this,e)}},w=t+" Iterator",N="values"==f,b=!1,L=e.prototype,S=L[c]||L["@@iterator"]||f&&L[f],k=S||x(f),D=f?N?x("entries"):k:void 0,M="Array"==t?L.entries||S:S;if(M&&(T=h(M.call(new e)))!==Object.prototype&&T.next&&(u(T,w,!0),a||"function"==typeof T[c]||i(T,c,m)),N&&S&&"values"!==S.name&&(b=!0,k=function(){return S.call(this)}),a&&!y||!d&&!b&&L[c]||i(L,c,k),l[t]=k,l[w]=m,f)if(g={values:N?k:x("values"),keys:v?k:x("keys"),entries:D},y)for(_ in g)_ in L||o(L,_,g[_]);else n(n.P+n.F*(d||b),t,g);return g}},function(e,t,r){"use strict";var a=Math.expm1;e.exports=!a||a(10)>22025.465794806718||a(10)<22025.465794806718||-2e-17!=a(-2e-17)?function(e){return 0==(e=+e)?e:e>-1e-6&&e<1e-6?e+e*e/2:Math.exp(e)-1}:a},function(e,t,r){"use strict";e.exports=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1}},function(e,t,r){"use strict";var a=r(6),n=r(232).set,o=a.MutationObserver||a.WebKitMutationObserver,i=a.process,l=a.Promise,s="process"==r(41)(i);e.exports=function(){var e,t,r,u=function(){var a,n;for(s&&(a=i.domain)&&a.exit();e;){n=e.fn,e=e.next;try{n()}catch(a){throw e?r():t=void 0,a}}t=void 0,a&&a.enter()};if(s)r=function(){i.nextTick(u)};else if(!o||a.navigator&&a.navigator.standalone)if(l&&l.resolve){var h=l.resolve(void 0);r=function(){h.then(u)}}else r=function(){n.call(a,u)};else{var c=!0,d=document.createTextNode("");new o(u).observe(d,{characterData:!0}),r=function(){d.data=c=!c}}return function(a){var n={fn:a,next:void 0};t&&(t.next=n),e||(e=n,r()),t=n}}},function(e,t,r){"use strict";function a(e){var t,r;this.promise=new e(function(e,a){if(void 0!==t||void 0!==r)throw TypeError("Bad Promise constructor");t=e,r=a}),this.resolve=n(t),this.reject=n(r)}var n=r(29);e.exports.f=function(e){return new a(e)}},function(e,t,r){"use strict";function a(e,t){for(var r=Object.getOwnPropertyNames(t),a=0;a<r.length;a++){var n=r[a],o=Object.getOwnPropertyDescriptor(t,n);o&&o.configurable&&void 0===e[n]&&Object.defineProperty(e,n,o)}return e}var n=r(8),o=r(5),i=function(e,t){if(o(e),!n(t)&&null!==t)throw TypeError(t+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,n){try{n=r(43)(Function.call,r(34).f(Object.prototype,"__proto__").set,2),n(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,r){return i(e,r),t?a(e,r):n(e,r),e}}({},!1):void 0),check:i}},function(e,t,r){"use strict";var a=r(158)("keys"),n=r(89);e.exports=function(e){return a[e]||(a[e]=n(e))}},function(e,t,r){"use strict";var a=r(51),n=r(49);e.exports=function(e){return function(t,r){var o,i,l=String(n(t)),s=a(r),u=l.length;return s<0||s>=u?e?"":void 0:(o=l.charCodeAt(s),o<55296||o>56319||s+1===u||(i=l.charCodeAt(s+1))<56320||i>57343?e?l.charAt(s):o:e?l.slice(s,s+2):i-56320+(o-55296<<10)+65536)}}},function(e,t,r){"use strict";var a=r(152),n=r(49);e.exports=function(e,t,r){if(a(t))throw TypeError("String#"+r+" doesn't accept regex!");return String(n(e))}},function(e,t,r){"use strict";var a=r(51),n=r(49);e.exports=function(e){var t=String(n(this)),r="",o=a(e);if(o<0||o==1/0)throw RangeError("Count can't be negative");for(;o>0;(o>>>=1)&&(t+=t))1&o&&(r+=t);return r}},function(e,t,r){"use strict";e.exports="\t\n\v\f\r   ᠎              \u2028\u2029\ufeff"},function(e,t,r){"use strict";var a,n,o,i=r(43),l=r(303),s=r(217),u=r(214),h=r(6),c=h.process,d=h.setImmediate,m=h.clearImmediate,p=h.MessageChannel,f=h.Dispatch,v=0,y={},g=function(){var e=+this;if(y.hasOwnProperty(e)){var t=y[e];delete y[e],t()}},_=function(e){g.call(e.data)};d&&m||(d=function(e){for(var t=[],r=1;arguments.length>r;)t.push(arguments[r++]);return y[++v]=function(){l("function"==typeof e?e:Function(e),t)},a(v),v},m=function(e){delete y[e]},"process"==r(41)(c)?a=function(e){c.nextTick(i(g,e,1))}:f&&f.now?a=function(e){f.now(i(g,e,1))}:p?(n=new p,o=n.port2,n.port1.onmessage=_,a=i(o.postMessage,o,1)):h.addEventListener&&"function"==typeof postMessage&&!h.importScripts?(a=function(e){h.postMessage(e+"","*")},h.addEventListener("message",_,!1)):a="onreadystatechange"in u("script")?function(e){s.appendChild(u("script")).onreadystatechange=function(){s.removeChild(this),g.call(e)}}:function(e){setTimeout(i(g,e,1),0)}),e.exports={set:d,clear:m}},function(e,t,r){"use strict";function a(e,t,r){var a,n,o,i=new Array(r),l=8*r-t-1,s=(1<<l)-1,u=s>>1,h=23===t?F(2,-24)-F(2,-77):0,c=0,d=e<0||0===e&&1/e<0?1:0;for(e=O(e),e!=e||e===E?(n=e!=e?1:0,a=s):(a=j(B(e)/H),e*(o=F(2,-a))<1&&(a--,o*=2),e+=a+u>=1?h/o:h*F(2,1-u),e*o>=2&&(a++,o/=2),a+u>=s?(n=0,a=s):a+u>=1?(n=(e*o-1)*F(2,t),a+=u):(n=e*F(2,u-1)*F(2,t),a=0));t>=8;i[c++]=255&n,n/=256,t-=8);for(a=a<<t|n,l+=t;l>0;i[c++]=255&a,a/=256,l-=8);return i[--c]|=128*d,i}function n(e,t,r){var a,n=8*r-t-1,o=(1<<n)-1,i=o>>1,l=n-7,s=r-1,u=e[s--],h=127&u;for(u>>=7;l>0;h=256*h+e[s],s--,l-=8);for(a=h&(1<<-l)-1,h>>=-l,l+=t;l>0;a=256*a+e[s],s--,l-=8);if(0===h)h=1-i;else{if(h===o)return a?NaN:u?-E:E;a+=F(2,t),h-=i}return(u?-1:1)*a*F(2,h-t)}function o(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]}function i(e){return[255&e]}function l(e){return[255&e,e>>8&255]}function s(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]}function u(e){return a(e,52,8)}function h(e){return a(e,23,4)}function c(e,t,r){S(e[M],t,{get:function(){return this[r]}})}function d(e,t,r,a){var n=+r,o=b(n);if(o+t>e[G])throw R(A);var i=e[V]._b,l=o+e[W],s=i.slice(l,l+t);return a?s:s.reverse()}function m(e,t,r,a,n,o){var i=+r,l=b(i);if(l+t>e[G])throw R(A);for(var s=e[V]._b,u=l+e[W],h=a(+n),c=0;c<t;c++)s[u+c]=h[o?c:t-c-1]}var p=r(6),f=r(16),v=r(67),y=r(160),g=r(30),_=r(86),T=r(7),x=r(80),w=r(51),N=r(18),b=r(321),L=r(83).f,S=r(17).f,k=r(211),D=r(108),M="prototype",A="Wrong index!",I=p.ArrayBuffer,z=p.DataView,C=p.Math,R=p.RangeError,E=p.Infinity,P=I,O=C.abs,F=C.pow,j=C.floor,B=C.log,H=C.LN2,V=f?"_b":"buffer",G=f?"_l":"byteLength",W=f?"_o":"byteOffset";if(y.ABV){if(!T(function(){I(1)})||!T(function(){new I(-1)})||T(function(){return new I,new I(1.5),new I(NaN),"ArrayBuffer"!=I.name})){I=function(e){return x(this,I),new P(b(e))};for(var U,q=I[M]=P[M],Y=L(P),Z=0;Y.length>Z;)(U=Y[Z++])in I||g(I,U,P[U]);v||(q.constructor=I)}var K=new z(new I(2)),J=z[M].setInt8;K.setInt8(0,2147483648),K.setInt8(1,2147483649),!K.getInt8(0)&&K.getInt8(1)||_(z[M],{setInt8:function(e,t){J.call(this,e,t<<24>>24)},setUint8:function(e,t){J.call(this,e,t<<24>>24)}},!0)}else I=function(e){x(this,I,"ArrayBuffer");var t=b(e);this._b=k.call(new Array(t),0),this[G]=t},z=function(e,t,r){x(this,z,"DataView"),x(e,I,"DataView");var a=e[G],n=w(t);if(n<0||n>a)throw R("Wrong offset!");if(r=void 0===r?a-n:N(r),n+r>a)throw R("Wrong length!");this[V]=e,this[W]=n,this[G]=r},f&&(c(I,"byteLength","_l"),c(z,"buffer","_b"),c(z,"byteLength","_l"),c(z,"byteOffset","_o")),_(z[M],{getInt8:function(e){return d(this,1,e)[0]<<24>>24},getUint8:function(e){return d(this,1,e)[0]},getInt16:function(e){var t=d(this,2,e,arguments[1]);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=d(this,2,e,arguments[1]);return t[1]<<8|t[0]},getInt32:function(e){return o(d(this,4,e,arguments[1]))},getUint32:function(e){return o(d(this,4,e,arguments[1]))>>>0},getFloat32:function(e){return n(d(this,4,e,arguments[1]),23,4)},getFloat64:function(e){return n(d(this,8,e,arguments[1]),52,8)},setInt8:function(e,t){m(this,1,e,i,t)},setUint8:function(e,t){m(this,1,e,i,t)},setInt16:function(e,t){m(this,2,e,l,t,arguments[2])},setUint16:function(e,t){m(this,2,e,l,t,arguments[2])},setInt32:function(e,t){m(this,4,e,s,t,arguments[2])},setUint32:function(e,t){m(this,4,e,s,t,arguments[2])},setFloat32:function(e,t){m(this,4,e,h,t,arguments[2])},setFloat64:function(e,t){m(this,8,e,u,t,arguments[2])}});D(I,"ArrayBuffer"),D(z,"DataView"),g(z[M],y.VIEW,!0),t.ArrayBuffer=I,t.DataView=z},function(e,t,r){"use strict";var a=r(6),n=r(42),o=r(67),i=r(322),l=r(17).f;e.exports=function(e){var t=n.Symbol||(n.Symbol=o?{}:a.Symbol||{});"_"==e.charAt(0)||e in t||l(t,e,{value:i.f(e)})}},function(e,t,r){"use strict";var a=r(125),n=r(13)("iterator"),o=r(107);e.exports=r(42).getIteratorMethod=function(e){if(void 0!=e)return e[n]||e["@@iterator"]||o[a(e)]}},function(e,t,r){"use strict";var a=r(66),n=r(306),o=r(107),i=r(36);e.exports=r(221)(Array,"Array",function(e,t){this._t=i(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,r=this._i++;return!e||r>=e.length?(this._t=void 0,n(1)):"keys"==t?n(0,r):"values"==t?n(0,e[r]):n(0,[r,e[r]])},"values"),o.Arguments=o.Array,a("keys"),a("values"),a("entries")},function(e,t,r){"use strict";function a(e){return"_"+e+"Type"}function n(e,t,r){var a=t.getItemVisual(r,"color"),n=t.getItemVisual(r,e),o=t.getItemVisual(r,e+"Size");if(n&&"none"!==n){u.isArray(o)||(o=[o,o]);var i=c.createSymbol(n,-o[0]/2,-o[1]/2,o[0],o[1],a);return i.name=e,i}}function o(e){var t=new d({name:"line"});return i(t.shape,e),t}function i(e,t){var r=t[0],a=t[1],n=t[2];e.x1=r[0],e.y1=r[1],e.x2=a[0],e.y2=a[1],e.percent=1,n?(e.cpx1=n[0],e.cpy1=n[1]):(e.cpx1=NaN,e.cpy1=NaN)}function l(){var e=this,t=e.childOfName("fromSymbol"),r=e.childOfName("toSymbol"),a=e.childOfName("label");if(t||r||!a.ignore){for(var n=1,o=this.parent;o;)o.scale&&(n/=o.scale[0]),o=o.parent;var i=e.childOfName("line");if(this.__dirty||i.__dirty){var l=i.shape.percent,s=i.pointAt(0),u=i.pointAt(l),c=h.sub([],u,s);if(h.normalize(c,c),t){t.attr("position",s);var d=i.tangentAt(0);t.attr("rotation",Math.PI/2-Math.atan2(d[1],d[0])),t.attr("scale",[n*l,n*l])}if(r){r.attr("position",u);var d=i.tangentAt(1);r.attr("rotation",-Math.PI/2-Math.atan2(d[1],d[0])),r.attr("scale",[n*l,n*l])}if(!a.ignore){a.attr("position",u);var m,p,f,v=5*n;if("end"===a.__position)m=[c[0]*v+u[0],c[1]*v+u[1]],p=c[0]>.8?"left":c[0]<-.8?"right":"center",f=c[1]>.8?"top":c[1]<-.8?"bottom":"middle";else if("middle"===a.__position){var y=l/2,d=i.tangentAt(y),g=[d[1],-d[0]],_=i.pointAt(y);g[1]>0&&(g[0]=-g[0],g[1]=-g[1]),m=[_[0]+g[0]*v,_[1]+g[1]*v],p="center",f="bottom";var T=-Math.atan2(d[1],d[0]);u[0]<s[0]&&(T=Math.PI+T),a.attr("rotation",T)}else m=[-c[0]*v+s[0],-c[1]*v+s[1]],p=c[0]>.8?"right":c[0]<-.8?"left":"center",f=c[1]>.8?"bottom":c[1]<-.8?"top":"middle";a.attr({style:{textVerticalAlign:a.__verticalAlign||f,textAlign:a.__textAlign||p},position:m,scale:[n,n]})}}}}function s(e,t,r){m.Group.call(this),this._createLine(e,t,r)}var u=r(0),h=r(12),c=r(38),d=r(777),m=r(3),p=r(4),f=p.round,v=["fromSymbol","toSymbol"],y=s.prototype;y.beforeUpdate=l,y._createLine=function(e,t,r){var i=e.hostModel,l=e.getItemLayout(t),s=o(l);s.shape.percent=0,m.initProps(s,{shape:{percent:1}},i,t),this.add(s);var h=new m.Text({name:"label"});this.add(h),u.each(v,function(r){var o=n(r,e,t);this.add(o),this[a(r)]=e.getItemVisual(t,r)},this),this._updateCommonStl(e,t,r)},y.updateData=function(e,t,r){var o=e.hostModel,l=this.childOfName("line"),s=e.getItemLayout(t),h={shape:{}};i(h.shape,s),m.updateProps(l,h,o,t),u.each(v,function(r){var o=e.getItemVisual(t,r),i=a(r);if(this[i]!==o){this.remove(this.childOfName(r));var l=n(r,e,t);this.add(l)}this[i]=o},this),this._updateCommonStl(e,t,r)},y._updateCommonStl=function(e,t,r){var a=e.hostModel,n=this.childOfName("line"),o=r&&r.lineStyle,i=r&&r.hoverLineStyle,l=r&&r.labelModel,s=r&&r.hoverLabelModel;if(!r||e.hasItemOption){var h=e.getItemModel(t);o=h.getModel("lineStyle.normal").getLineStyle(),i=h.getModel("lineStyle.emphasis").getLineStyle(),l=h.getModel("label.normal"),s=h.getModel("label.emphasis")}var c=e.getItemVisual(t,"color"),d=u.retrieve3(e.getItemVisual(t,"opacity"),o.opacity,1);n.useStyle(u.defaults({strokeNoScale:!0,fill:"none",stroke:c,opacity:d},o)),n.hoverStyle=i,u.each(v,function(e){var t=this.childOfName(e);t&&(t.setColor(c),t.setStyle({opacity:d}))},this);var p,y,g,_,T=l.getShallow("show"),x=s.getShallow("show"),w=this.childOfName("label");if(T||x){var N=a.getRawValue(t);y=null==N?y=e.getName(t):isFinite(N)?f(N):N,p=c||"#000",g=u.retrieve2(a.getFormattedLabel(t,"normal",e.dataType),y),_=u.retrieve2(a.getFormattedLabel(t,"emphasis",e.dataType),g)}if(T){var b=m.setTextStyle(w.style,l,{text:g},{autoColor:p});w.__textAlign=b.textAlign,w.__verticalAlign=b.textVerticalAlign,w.__position=l.get("position")||"middle"}else w.setStyle("text",null);w.hoverStyle=x?{text:_,textFill:s.getTextColor(!0),fontStyle:s.getShallow("fontStyle"),fontWeight:s.getShallow("fontWeight"),fontSize:s.getShallow("fontSize"),fontFamily:s.getShallow("fontFamily")}:{text:null},w.ignore=!T&&!x,m.setHoverStyle(this)},y.highlight=function(){this.trigger("emphasis")},y.downplay=function(){this.trigger("normal")},y.updateLayout=function(e,t){this.setLinePoints(e.getItemLayout(t))},y.setLinePoints=function(e){var t=this.childOfName("line");i(t.shape,e),t.dirty()},u.inherits(s,m.Group);var g=s;e.exports=g},function(e,t,r){"use strict";function a(e){return isNaN(e[0])||isNaN(e[1])}function n(e){return!a(e[0])&&!a(e[1])}function o(e){this._ctor=e||l,this.group=new i.Group}var i=r(3),l=r(237),s=o.prototype;s.updateData=function(e){var t=this._lineData,r=this.group,a=this._ctor,o=e.hostModel,i={lineStyle:o.getModel("lineStyle.normal").getLineStyle(),hoverLineStyle:o.getModel("lineStyle.emphasis").getLineStyle(),labelModel:o.getModel("label.normal"),hoverLabelModel:o.getModel("label.emphasis")};e.diff(t).add(function(t){if(n(e.getItemLayout(t))){var o=new a(e,t,i);e.setItemGraphicEl(t,o),r.add(o)}}).update(function(o,l){var s=t.getItemGraphicEl(l);if(!n(e.getItemLayout(o)))return void r.remove(s);s?s.updateData(e,o,i):s=new a(e,o,i),e.setItemGraphicEl(o,s),r.add(s)}).remove(function(e){r.remove(t.getItemGraphicEl(e))}).execute(),this._lineData=e},s.updateLayout=function(){var e=this._lineData;e.eachItemGraphicEl(function(t,r){t.updateLayout(e,r)},this)},s.remove=function(){this.group.removeAll()};var u=o;e.exports=u},function(e,t,r){"use strict";function a(){}function n(e,t,r,a){o(v(r).lastProp,a)||(v(r).lastProp=a,t?c.updateProps(r,a,e):(r.stopAnimation(),r.attr(a)))}function o(e,t){if(u.isObject(e)&&u.isObject(t)){var r=!0;return u.each(t,function(t,a){r=r&&o(e[a],t)}),!!r}return e===t}function i(e,t){e[t.get("label.show")?"show":"hide"]()}function l(e){return{position:e.position.slice(),rotation:e.rotation||0}}function s(e,t,r){var a=t.get("z"),n=t.get("zlevel");e&&e.traverse(function(e){"group"!==e.type&&(null!=a&&(e.z=a),null!=n&&(e.zlevel=n),e.silent=r)})}var u=r(0),h=r(58),c=r(3),d=r(164),m=r(62),p=r(92),f=r(10),v=f.makeGetter(),y=u.clone,g=u.bind;a.prototype={_group:null,_lastGraphicKey:null,_handle:null,_dragging:!1,_lastValue:null,_lastStatus:null,_payloadInfo:null,animationThreshold:15,render:function(e,t,r,a){var o=t.get("value"),i=t.get("status");if(this._axisModel=e,this._axisPointerModel=t,this._api=r,a||this._lastValue!==o||this._lastStatus!==i){this._lastValue=o,this._lastStatus=i;var l=this._group,h=this._handle;if(!i||"hide"===i)return l&&l.hide(),void(h&&h.hide());l&&l.show(),h&&h.show();var d={};this.makeElOption(d,o,e,t,r);var m=d.graphicKey;m!==this._lastGraphicKey&&this.clear(r),this._lastGraphicKey=m;var p=this._moveAnimation=this.determineAnimation(e,t);if(l){var f=u.curry(n,t,p);this.updatePointerEl(l,d,f,t),this.updateLabelEl(l,d,f,t)}else l=this._group=new c.Group,this.createPointerEl(l,d,e,t),this.createLabelEl(l,d,e,t),r.getZr().add(l);s(l,t,!0),this._renderHandle(o)}},remove:function(e){this.clear(e)},dispose:function(e){this.clear(e)},determineAnimation:function(e,t){var r=t.get("animation"),a=e.axis,n="category"===a.type,o=t.get("snap");if(!o&&!n)return!1;if("auto"===r||null==r){var i=this.animationThreshold;if(n&&a.getBandWidth()>i)return!0;if(o){var l=d.getAxisInfo(e).seriesDataCount,s=a.getExtent();return Math.abs(s[0]-s[1])/l>i}return!1}return!0===r},makeElOption:function(e,t,r,a,n){},createPointerEl:function(e,t,r,a){var n=t.pointer;if(n){var o=v(e).pointerEl=new c[n.type](y(t.pointer));e.add(o)}},createLabelEl:function(e,t,r,a){if(t.label){var n=v(e).labelEl=new c.Rect(y(t.label));e.add(n),i(n,a)}},updatePointerEl:function(e,t,r){var a=v(e).pointerEl;a&&(a.setStyle(t.pointer.style),r(a,{shape:t.pointer.shape}))},updateLabelEl:function(e,t,r,a){var n=v(e).labelEl;n&&(n.setStyle(t.label.style),r(n,{shape:t.label.shape,position:t.label.position}),i(n,a))},_renderHandle:function(e){if(!this._dragging&&this.updateHandleTransform){var t=this._axisPointerModel,r=this._api.getZr(),a=this._handle,n=t.getModel("handle"),o=t.get("status");if(!n.get("show")||!o||"hide"===o)return a&&r.remove(a),void(this._handle=null);var i;this._handle||(i=!0,a=this._handle=c.createIcon(n.get("icon"),{cursor:"move",draggable:!0,onmousemove:function(e){m.stop(e.event)},onmousedown:g(this._onHandleDragMove,this,0,0),drift:g(this._onHandleDragMove,this),ondragend:g(this._onHandleDragEnd,this)}),r.add(a)),s(a,t,!1);var l=["color","borderColor","borderWidth","opacity","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"];a.setStyle(n.getItemStyle(null,l));var h=n.get("size");u.isArray(h)||(h=[h,h]),a.attr("scale",[h[0]/2,h[1]/2]),p.createOrUpdate(this,"_doDispatchAxisPointer",n.get("throttle")||0,"fixRate"),this._moveHandleToValue(e,i)}},_moveHandleToValue:function(e,t){n(this._axisPointerModel,!t&&this._moveAnimation,this._handle,l(this.getHandleTransform(e,this._axisModel,this._axisPointerModel)))},_onHandleDragMove:function(e,t){var r=this._handle;if(r){this._dragging=!0;var a=this.updateHandleTransform(l(r),[e,t],this._axisModel,this._axisPointerModel);this._payloadInfo=a,r.stopAnimation(),r.attr(l(a)),v(r).lastProp=null,this._doDispatchAxisPointer()}},_doDispatchAxisPointer:function(){if(this._handle){var e=this._payloadInfo,t=this._axisModel;this._api.dispatchAction({type:"updateAxisPointer",x:e.cursorPoint[0],y:e.cursorPoint[1],tooltipOption:e.tooltipOption,axesInfo:[{axisDim:t.axis.dim,axisIndex:t.componentIndex}]})}},_onHandleDragEnd:function(e){if(this._dragging=!1,this._handle){var t=this._axisPointerModel.get("value");this._moveHandleToValue(t),this._api.dispatchAction({type:"hideTip"})}},getHandleTransform:null,updateHandleTransform:null,clear:function(e){this._lastValue=null,this._lastStatus=null;var t=e.getZr(),r=this._group,a=this._handle;t&&r&&(this._lastGraphicKey=null,r&&t.remove(r),a&&t.remove(a),this._group=null,this._handle=null,this._payloadInfo=null)},doClear:function(){},buildLabel:function(e,t,r){return r=r||0,{x:e[r],y:e[1-r],width:t[r],height:t[1-r]}}},a.prototype.constructor=a,h.enableClassExtend(a);var _=a;e.exports=_},function(e,t,r){"use strict";function a(e){return i.indexOf(u,e)>=0}function n(e,t){e=e.slice();var r=i.map(e,l.capitalFirst);t=(t||[]).slice();var a=i.map(t,l.capitalFirst);return function(n,o){i.each(e,function(e,i){for(var l={name:e,capital:r[i]},s=0;s<t.length;s++)l[t[s]]=e+a[s];n.call(o,l)})}}function o(e,t,r){function a(e,t){return i.indexOf(t.nodes,e)>=0}function n(e,a){var n=!1;return t(function(t){i.each(r(e,t)||[],function(e){a.records[t.name][e]&&(n=!0)})}),n}function o(e,a){a.nodes.push(e),t(function(t){i.each(r(e,t)||[],function(e){a.records[t.name][e]=!0})})}return function(r){function i(e){!a(e,l)&&n(e,l)&&(o(e,l),s=!0)}var l={nodes:[],records:{}};if(t(function(e){l.records[e.name]={}}),!r)return l;o(r,l);var s;do{s=!1,e(i)}while(s);return l}}var i=r(0),l=r(14),s=["x","y","z","radius","angle","single"],u=["cartesian2d","polar","singleAxis"],h=n(s,["axisIndex","axis","index","id"]);t.isCoordSupported=a,t.createNameEach=n,t.eachAxisDim=h,t.createLinkedNodesFinder=o},function(e,t,r){"use strict";function a(e){B.call(this),this._zr=e,this.group=new H.Group,this._brushType,this._brushOption,this._panels,this._track=[],this._dragging,this._covers=[],this._creatingCover,this._creatingPanel,this._enableGlobalPan,this._uid="brushController_"+ae++,this._handlers={},U(ne,function(e,t){this._handlers[t]=j.bind(e,this)},this)}function n(e,t){var r=e._zr;e._enableGlobalPan||V.take(r,Q,e._uid),U(e._handlers,function(e,t){r.on(t,e)}),e._brushType=t.brushType,e._brushOption=j.merge(j.clone(re),t,!0)}function o(e){var t=e._zr;V.release(t,Q,e._uid),U(e._handlers,function(e,r){t.off(r,e)}),e._brushType=e._brushOption=null}function i(e,t){var r=oe[t.brushType].createCover(e,t);return r.__brushOption=t,u(r,t),e.group.add(r),r}function l(e,t){var r=c(t);return r.endCreating&&(r.endCreating(e,t),u(t,t.__brushOption)),t}function s(e,t){var r=t.__brushOption;c(t).updateCoverShape(e,t,r.range,r)}function u(e,t){var r=t.z;null==r&&(r=J),e.traverse(function(e){e.z=r,e.z2=r})}function h(e,t){c(t).updateCommon(e,t),s(e,t)}function c(e){return oe[e.__brushOption.brushType]}function d(e,t,r){var a=e._panels;if(!a)return!0;var n,o=e._transform;return U(a,function(e){e.isTargetByCursor(t,r,o)&&(n=e)}),n}function m(e,t){var r=e._panels;if(!r)return!0;var a=t.__brushOption.panelId;return null==a||r[a]}function p(e){var t=e._covers,r=t.length;return U(t,function(t){e.group.remove(t)},e),t.length=0,!!r}function f(e,t){var r=q(e._covers,function(e){var t=e.__brushOption,r=j.clone(t.range);return{brushType:t.brushType,panelId:t.panelId,range:r}});e.trigger("brush",r,{isEnd:!!t.isEnd,removeOnClick:!!t.removeOnClick})}function v(e){var t=e._track;if(!t.length)return!1;var r=t[t.length-1],a=t[0],n=r[0]-a[0],o=r[1]-a[1];return K(n*n+o*o,.5)>X}function y(e){var t=e.length-1;return t<0&&(t=0),[e[0],e[t]]}function g(e,t,r,a){var n=new H.Group;return n.add(new H.Rect({name:"main",style:w(r),silent:!0,draggable:!0,cursor:"move",drift:W(e,t,n,"nswe"),ondragend:W(f,t,{isEnd:!0})})),U(a,function(r){n.add(new H.Rect({name:r,style:{opacity:0},draggable:!0,silent:!0,invisible:!0,drift:W(e,t,n,r),ondragend:W(f,t,{isEnd:!0})}))}),n}function _(e,t,r,a){var n=a.brushStyle.lineWidth||0,o=Z(n,$),i=r[0][0],l=r[1][0],s=i-n/2,u=l-n/2,h=r[0][1],c=r[1][1],d=h-o+n/2,m=c-o+n/2,p=h-i,f=c-l,v=p+n,y=f+n;x(e,t,"main",i,l,p,f),a.transformable&&(x(e,t,"w",s,u,o,y),x(e,t,"e",d,u,o,y),x(e,t,"n",s,u,v,o),x(e,t,"s",s,m,v,o),x(e,t,"nw",s,u,o,o),x(e,t,"ne",d,u,o,o),x(e,t,"sw",s,m,o,o),x(e,t,"se",d,m,o,o))}function T(e,t){var r=t.__brushOption,a=r.transformable,n=t.childAt(0);n.useStyle(w(r)),n.attr({silent:!a,cursor:a?"move":"default"}),U(["w","e","n","s","se","sw","ne","nw"],function(r){var n=t.childOfName(r),o=L(e,r);n&&n.attr({silent:!a,invisible:!a,cursor:a?te[o]+"-resize":null})})}function x(e,t,r,a,n,o,i){var l=t.childOfName(r);l&&l.setShape(A(M(e,t,[[a,n],[a+o,n+i]])))}function w(e){return j.defaults({strokeNoScale:!0},e.brushStyle)}function N(e,t,r,a){var n=[Y(e,r),Y(t,a)],o=[Z(e,r),Z(t,a)];return[[n[0],o[0]],[n[1],o[1]]]}function b(e){return H.getTransform(e.group)}function L(e,t){if(t.length>1){t=t.split("");var r=[L(e,t[0]),L(e,t[1])];return("e"===r[0]||"w"===r[0])&&r.reverse(),r.join("")}var a={w:"left",e:"right",n:"top",s:"bottom"},n={left:"w",right:"e",top:"n",bottom:"s"},r=H.transformDirection(a[t],b(e));return n[r]}function S(e,t,r,a,n,o,i,l){var s=a.__brushOption,u=e(s.range),c=D(r,o,i);U(n.split(""),function(e){var t=ee[e];u[t[0]][t[1]]+=c[t[0]]}),s.range=t(N(u[0][0],u[1][0],u[0][1],u[1][1])),h(r,a),f(r,{isEnd:!1})}function k(e,t,r,a,n){var o=t.__brushOption.range,i=D(e,r,a);U(o,function(e){e[0]+=i[0],e[1]+=i[1]}),h(e,t),f(e,{isEnd:!1})}function D(e,t,r){var a=e.group,n=a.transformCoordToLocal(t,r),o=a.transformCoordToLocal(0,0);return[n[0]-o[0],n[1]-o[1]]}function M(e,t,r){var a=m(e,t);return a&&!0!==a?a.clipPath(r,e._transform):j.clone(r)}function A(e){var t=Y(e[0][0],e[1][0]),r=Y(e[0][1],e[1][1]);return{x:t,y:r,width:Z(e[0][0],e[1][0])-t,height:Z(e[0][1],e[1][1])-r}}function I(e,t,r){if(e._brushType){var a=e._zr,n=e._covers,o=d(e,t,r);if(!e._dragging)for(var i=0;i<n.length;i++){var l=n[i].__brushOption;if(o&&(!0===o||l.panelId===o.panelId)&&oe[l.brushType].contain(n[i],r[0],r[1]))return}o&&a.setCursorStyle("crosshair")}}function z(e){var t=e.event;t.preventDefault&&t.preventDefault()}function C(e,t,r){return e.childOfName("main").contain(t,r)}function R(e,t,r,a){var n,o=e._creatingCover,u=e._creatingPanel,h=e._brushOption;if(e._track.push(r.slice()),v(e)||o){if(u&&!o){"single"===h.brushMode&&p(e);var c=j.clone(h);c.brushType=E(c.brushType,u),c.panelId=!0===u?null:u.panelId,o=e._creatingCover=i(e,c),e._covers.push(o)}if(o){var m=oe[E(e._brushType,u)];o.__brushOption.range=m.getCreatingRange(M(e,o,e._track)),a&&(l(e,o),m.updateCommon(e,o)),s(e,o),n={isEnd:a}}}else a&&"single"===h.brushMode&&h.removeOnClick&&d(e,t,r)&&p(e)&&(n={isEnd:a,removeOnClick:!0});return n}function E(e,t){return"auto"===e?t.defaultBrushType:e}function P(e){if(this._dragging){z(e);var t=this.group.transformCoordToLocal(e.offsetX,e.offsetY),r=R(this,e,t,!0);this._dragging=!1,this._track=[],this._creatingCover=null,r&&f(this,r)}}function O(e){return{createCover:function(t,r){return g(W(S,function(t){var r=[t,[0,100]];return e&&r.reverse(),r},function(t){return t[e]}),t,r,[["w","e"],["n","s"]][e])},getCreatingRange:function(t){var r=y(t);return[Y(r[0][e],r[1][e]),Z(r[0][e],r[1][e])]},updateCoverShape:function(t,r,a,n){var o,i=m(t,r);if(!0!==i&&i.getLinearBrushOtherExtent)o=i.getLinearBrushOtherExtent(e,t._transform);else{var l=t._zr;o=[0,[l.getWidth(),l.getHeight()][1-e]]}var s=[a,o];e&&s.reverse(),_(t,r,s,n)},updateCommon:T,contain:C}}var F=r(9),j=(F.__DEV__,r(0)),B=r(98),H=r(3),V=r(353),G=r(112),W=j.curry,U=j.each,q=j.map,Y=Math.min,Z=Math.max,K=Math.pow,J=1e4,X=6,$=6,Q="globalPan",ee={w:[0,0],e:[0,1],n:[1,0],s:[1,1]},te={w:"ew",e:"ew",n:"ns",s:"ns",ne:"nesw",sw:"nesw",nw:"nwse",se:"nwse"},re={brushStyle:{lineWidth:2,stroke:"rgba(0,0,0,0.3)",fill:"rgba(0,0,0,0.1)"},transformable:!0,brushMode:"single",removeOnClick:!1},ae=0;a.prototype={constructor:a,enableBrush:function(e){return this._brushType&&o(this),e.brushType&&n(this,e),this},setPanels:function(e){if(e&&e.length){var t=this._panels={};j.each(e,function(e){t[e.panelId]=j.clone(e)})}else this._panels=null;return this},mount:function(e){e=e||{},this._enableGlobalPan=e.enableGlobalPan;var t=this.group;return this._zr.add(t),t.attr({position:e.position||[0,0],rotation:e.rotation||0,scale:e.scale||[1,1]}),this._transform=t.getLocalTransform(),this},eachCover:function(e,t){U(this._covers,e,t)},updateCovers:function(e){function t(e,t){return(null!=e.id?e.id:o+t)+"-"+e.brushType}function r(e,r){return t(e.__brushOption,r)}function a(t,r){var a=e[t];if(null!=r&&s[r]===d)u[t]=s[r];else{var n=u[t]=null!=r?(s[r].__brushOption=a,s[r]):l(c,i(c,a));h(c,n)}}function n(e){s[e]!==d&&c.group.remove(s[e])}e=j.map(e,function(e){return j.merge(j.clone(re),e,!0)});var o="\0-brush-index-",s=this._covers,u=this._covers=[],c=this,d=this._creatingCover;return new G(s,e,r,t).add(a).update(a).remove(n).execute(),this},unmount:function(){return this.enableBrush(!1),p(this),this._zr.remove(this.group),this},dispose:function(){this.unmount(),this.off()}},j.mixin(a,B);var ne={mousedown:function(e){if(this._dragging)P.call(this,e);else if(!e.target||!e.target.draggable){z(e);var t=this.group.transformCoordToLocal(e.offsetX,e.offsetY);this._creatingCover=null;var r=this._creatingPanel=d(this,e,t);r&&(this._dragging=!0,this._track=[t.slice()])}},mousemove:function(e){var t=this.group.transformCoordToLocal(e.offsetX,e.offsetY);if(I(this,e,t),this._dragging){z(e);var r=R(this,e,t,!1);r&&f(this,r)}},mouseup:P},oe={lineX:O(0),lineY:O(1),rect:{createCover:function(e,t){return g(W(S,function(e){return e},function(e){return e}),e,t,["w","e","n","s","se","sw","ne","nw"])},getCreatingRange:function(e){var t=y(e);return N(t[1][0],t[1][1],t[0][0],t[0][1])},updateCoverShape:function(e,t,r,a){_(e,t,r,a)},updateCommon:T,contain:C},polygon:{createCover:function(e,t){var r=new H.Group;return r.add(new H.Polyline({name:"main",style:w(t),silent:!0})),r},getCreatingRange:function(e){return e},endCreating:function(e,t){t.remove(t.childAt(0)),t.add(new H.Polygon({name:"main",draggable:!0,drift:W(k,e,t),ondragend:W(f,e,{isEnd:!0})}))},updateCoverShape:function(e,t,r,a){t.childAt(0).setShape({points:M(e,t,r)})},updateCommon:T,contain:C}},ie=a;e.exports=ie},function(e,t,r){"use strict";function a(e,t,r){var a=t.getComponentByElement(e.topTarget),o=a&&a.coordinateSystem;return a&&a!==r&&!n[a.mainType]&&o&&o.model!==r}var n={axisPointer:1,tooltip:1,brush:1};t.onIrrelevantElement=a},function(e,t,r){"use strict";var a=r(0),n={updateSelectedMap:function(e){this._targetList=e.slice(),this._selectTargetMap=a.reduce(e||[],function(e,t){return e.set(t.name,t),e},a.createHashMap())},select:function(e,t){var r=null!=t?this._targetList[t]:this._selectTargetMap.get(e);"single"===this.get("selectedMode")&&this._selectTargetMap.each(function(e){e.selected=!1}),r&&(r.selected=!0)},unSelect:function(e,t){var r=null!=t?this._targetList[t]:this._selectTargetMap.get(e);r&&(r.selected=!1)},toggleSelected:function(e,t){var r=null!=t?this._targetList[t]:this._selectTargetMap.get(e);if(null!=r)return this[r.selected?"unSelect":"select"](e,t),r.selected},isSelected:function(e,t){var r=null!=t?this._targetList[t]:this._selectTargetMap.get(e);return r&&r.selected}};e.exports=n},function(e,t,r){"use strict";function a(e){s.defaultEmphasis(e.label,["show"])}var n=r(9),o=(n.__DEV__,r(2)),i=r(0),l=r(25),s=r(10),u=r(14),h=u.addCommas,c=u.encodeHTML,d=o.extendComponentModel({type:"marker",dependencies:["series","grid","polar","geo"],init:function(e,t,r,a){this.mergeDefaultAndTheme(e,r),this.mergeOption(e,r,a.createdBySelf,!0)},isAnimationEnabled:function(){if(l.node)return!1;var e=this.__hostSeries;return this.getShallow("animation")&&e&&e.isAnimationEnabled()},mergeOption:function(e,t,r,n){var o=this.constructor,l=this.mainType+"Model";r||t.eachSeries(function(e){var r=e.get(this.mainType),s=e[l];if(!r||!r.data)return void(e[l]=null);s?s.mergeOption(r,t,!0):(n&&a(r),i.each(r.data,function(e){e instanceof Array?(a(e[0]),a(e[1])):a(e)}),s=new o(r,this,t),i.extend(s,{mainType:this.mainType,seriesIndex:e.seriesIndex,name:e.name,createdBySelf:!0}),s.__hostSeries=e),e[l]=s},this)},formatTooltip:function(e){var t=this.getData(),r=this.getRawValue(e),a=i.isArray(r)?i.map(r,h).join(", "):h(r),n=t.getName(e),o=c(this.name);return(null!=r||n)&&(o+="<br />"),n&&(o+=c(n),null!=r&&(o+=" : ")),null!=r&&(o+=c(a)),o},getData:function(){return this._data},setData:function(e){this._data=e}});i.mixin(d,s.dataFormatMixin);var m=d;e.exports=m},function(e,t,r){"use strict";var a=r(2),n=r(0),o=a.extendComponentView({type:"marker",init:function(){this.markerGroupMap=n.createHashMap()},render:function(e,t,r){var a=this.markerGroupMap;a.each(function(e){e.__keep=!1});var n=this.type+"Model";t.eachSeries(function(e){var a=e[n];a&&this.renderSeries(e,a,t,r)},this),a.each(function(e){!e.__keep&&this.group.remove(e.group)},this)},renderSeries:function(){}});e.exports=o},function(e,t,r){"use strict";function a(e){return!(isNaN(parseFloat(e.x))&&isNaN(parseFloat(e.y)))}function n(e){return!isNaN(parseFloat(e.x))&&!isNaN(parseFloat(e.y))}function o(e,t,r){var a=-1;do{a=Math.max(m.getPrecision(e.get(t,r)),a),e=e.stackedOn}while(e);return a}function i(e,t,r,a,n,i){var l=[],s=c(t,a,e),u=t.indicesOfNearest(a,s,!0)[0];l[n]=t.get(r,u,!0),l[i]=t.get(a,u,!0);var h=o(t,a,u);return h=Math.min(h,20),h>=0&&(l[i]=+l[i].toFixed(h)),l}function l(e,t){var r=e.getData(),a=e.coordinateSystem;if(t&&!n(t)&&!d.isArray(t.coord)&&a){var o=a.dimensions,i=s(t,r,a,e);if(t=d.clone(t),t.type&&v[t.type]&&i.baseAxis&&i.valueAxis){var l=p(o,i.baseAxis.dim),u=p(o,i.valueAxis.dim);t.coord=v[t.type](r,i.baseDataDim,i.valueDataDim,l,u),t.value=t.coord[u]}else{for(var h=[null!=t.xAxis?t.xAxis:t.radiusAxis,null!=t.yAxis?t.yAxis:t.angleAxis],m=0;m<2;m++)if(v[h[m]]){var f=e.coordDimToDataDim(o[m])[0];h[m]=c(r,f,h[m])}t.coord=h}}return t}function s(e,t,r,a){var n={};return null!=e.valueIndex||null!=e.valueDim?(n.valueDataDim=null!=e.valueIndex?t.getDimension(e.valueIndex):e.valueDim,n.valueAxis=r.getAxis(a.dataDimToCoordDim(n.valueDataDim)),n.baseAxis=r.getOtherAxis(n.valueAxis),n.baseDataDim=a.coordDimToDataDim(n.baseAxis.dim)[0]):(n.baseAxis=a.getBaseAxis(),n.valueAxis=r.getOtherAxis(n.baseAxis),n.baseDataDim=a.coordDimToDataDim(n.baseAxis.dim)[0],n.valueDataDim=a.coordDimToDataDim(n.valueAxis.dim)[0]),n}function u(e,t){return!(e&&e.containData&&t.coord&&!a(t))||e.containData(t.coord)}function h(e,t,r,a){return a<2?e.coord&&e.coord[a]:e.value}function c(e,t,r){if("average"===r){var a=0,n=0;return e.each(t,function(e,t){isNaN(e)||(a+=e,n++)},!0),a/n}return e.getDataExtent(t,!0)["max"===r?1:0]}var d=r(0),m=r(4),p=d.indexOf,f=d.curry,v={min:f(i,"min"),max:f(i,"max"),average:f(i,"average")};t.dataTransform=l,t.getAxisInfo=s,t.dataFilter=u,t.dimValueGetter=h,t.numCalculate=c},function(e,t,r){"use strict";function a(e,t,r){return e.getCoordSysModel()===t}function n(e,t){var r=t*Math.PI/180,a=e.plain(),n=a.width,o=a.height,i=n*Math.cos(r)+o*Math.sin(r),l=n*Math.sin(r)+o*Math.cos(r);return new p(a.x,a.y,i,l)}function o(e){var t,r=e.model,a=r.getFormattedLabels(),o=r.getModel("axisLabel"),i=1,l=a.length;l>40&&(i=Math.ceil(l/40));for(var s=0;s<l;s+=i)if(!e.isLabelIgnored(s)){var u=o.getTextRect(a[s]),h=n(u,o.get("rotate")||0);t?t.union(h):t=h}return t}function i(e,t,r){this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this._initCartesian(e,t,r),this.model=e}function l(e,t,r){var a=e[t];if(r.onZero){var n=r.onZeroAxisIndex;if(null!=n){var o=a[n];return void(o&&s(o)&&(r.onZero=!1))}for(var i in a)if(a.hasOwnProperty(i)){var o=a[i];if(o&&!s(o)){n=+i;break}}null==n&&(r.onZero=!1),r.onZeroAxisIndex=n}}function s(e){return"category"===e.type||"time"===e.type||!w(e)}function u(e,t){var r=e.getExtent(),a=r[0]+r[1];e.toGlobalCoord="x"===e.dim?function(e){return e+t}:function(e){return a-e+t},e.toLocalCoord="x"===e.dim?function(e){return e-t}:function(e){return a-e+t}}function h(e,t){return m.map(L,function(t){return e.getReferringComponents(t)[0]})}function c(e){return"cartesian2d"===e.get("coordinateSystem")}var d=r(9),m=(d.__DEV__,r(0)),p=r(19),f=r(11),v=f.getLayoutRect,y=r(37),g=r(929),_=r(927),T=r(53);r(930);var x=m.each,w=y.ifAxisCrossZero,N=y.niceScaleExtent,b=i.prototype;b.type="grid",b.axisPointerEnabled=!0,b.getRect=function(){return this._rect},b.update=function(e,t){var r=this._axesMap;this._updateScale(e,this.model),x(r.x,function(e){N(e.scale,e.model)}),x(r.y,function(e){N(e.scale,e.model)}),x(r.x,function(e){l(r,"y",e)}),x(r.y,function(e){l(r,"x",e)}),this.resize(this.model,t)},b.resize=function(e,t,r){function a(){x(i,function(e){var t=e.isHorizontal(),r=t?[0,n.width]:[0,n.height],a=e.inverse?1:0;e.setExtent(r[a],r[1-a]),u(e,t?n.x:n.y)})}var n=v(e.getBoxLayoutParams(),{width:t.getWidth(),height:t.getHeight()});this._rect=n;var i=this._axesList;a(),!r&&e.get("containLabel")&&(x(i,function(e){if(!e.model.get("axisLabel.inside")){var t=o(e);if(t){var r=e.isHorizontal()?"height":"width",a=e.model.get("axisLabel.margin");n[r]-=t[r]+a,"top"===e.position?n.y+=t.height+a:"left"===e.position&&(n.x+=t.width+a)}}}),a())},b.getAxis=function(e,t){var r=this._axesMap[e];if(null!=r){if(null==t)for(var a in r)if(r.hasOwnProperty(a))return r[a];return r[t]}},b.getAxes=function(){return this._axesList.slice()},b.getCartesian=function(e,t){if(null!=e&&null!=t){var r="x"+e+"y"+t;return this._coordsMap[r]}m.isObject(e)&&(t=e.yAxisIndex,e=e.xAxisIndex);for(var a=0,n=this._coordsList;a<n.length;a++)if(n[a].getAxis("x").index===e||n[a].getAxis("y").index===t)return n[a]},b.getCartesians=function(){return this._coordsList.slice()},b.convertToPixel=function(e,t,r){var a=this._findConvertTarget(e,t);return a.cartesian?a.cartesian.dataToPoint(r):a.axis?a.axis.toGlobalCoord(a.axis.dataToCoord(r)):null},b.convertFromPixel=function(e,t,r){var a=this._findConvertTarget(e,t);return a.cartesian?a.cartesian.pointToData(r):a.axis?a.axis.coordToData(a.axis.toLocalCoord(r)):null},b._findConvertTarget=function(e,t){var r,a,n=t.seriesModel,o=t.xAxisModel||n&&n.getReferringComponents("xAxis")[0],i=t.yAxisModel||n&&n.getReferringComponents("yAxis")[0],l=t.gridModel,s=this._coordsList;if(n)r=n.coordinateSystem,m.indexOf(s,r)<0&&(r=null);else if(o&&i)r=this.getCartesian(o.componentIndex,i.componentIndex);else if(o)a=this.getAxis("x",o.componentIndex);else if(i)a=this.getAxis("y",i.componentIndex);else if(l){var u=l.coordinateSystem;u===this&&(r=this._coordsList[0])}return{cartesian:r,axis:a}},b.containPoint=function(e){var t=this._coordsList[0];if(t)return t.containPoint(e)},b._initCartesian=function(e,t,r){function n(r){return function(n,s){if(a(n,e,t)){var u=n.get("position");"x"===r?"top"!==u&&"bottom"!==u&&(u="bottom",o[u]&&(u="top"===u?"bottom":"top")):"left"!==u&&"right"!==u&&(u="left",o[u]&&(u="left"===u?"right":"left")),o[u]=!0;var h=new _(r,y.createScaleByModel(n),[0,0],n.get("type"),u),c="category"===h.type;h.onBand=c&&n.get("boundaryGap"),h.inverse=n.get("inverse"),h.onZero=n.get("axisLine.onZero"),h.onZeroAxisIndex=n.get("axisLine.onZeroAxisIndex"),n.axis=h,h.model=n,h.grid=this,h.index=s,this._axesList.push(h),i[r][s]=h,l[r]++}}}var o={left:!1,right:!1,top:!1,bottom:!1},i={x:{},y:{}},l={x:0,y:0};if(t.eachComponent("xAxis",n("x"),this),t.eachComponent("yAxis",n("y"),this),!l.x||!l.y)return this._axesMap={},void(this._axesList=[]);this._axesMap=i,x(i.x,function(t,r){x(i.y,function(a,n){var o="x"+r+"y"+n,i=new g(o);i.grid=this,i.model=e,this._coordsMap[o]=i,this._coordsList.push(i),i.addAxis(t),i.addAxis(a)},this)},this)},b._updateScale=function(e,t){function r(e,t,r){x(r.coordDimToDataDim(t.dim),function(r){t.scale.unionExtentFromData(e,r)})}m.each(this._axesList,function(e){e.scale.setExtent(1/0,-1/0)}),e.eachSeries(function(n){if(c(n)){var o=h(n,e),i=o[0],l=o[1];if(!a(i,t,e)||!a(l,t,e))return;var s=this.getCartesian(i.componentIndex,l.componentIndex),u=n.getData(),d=s.getAxis("x"),m=s.getAxis("y");"list"===u.type&&(r(u,d,n),r(u,m,n))}},this)},b.getTooltipAxes=function(e){var t=[],r=[];return x(this.getCartesians(),function(a){var n=null!=e&&"auto"!==e?a.getAxis(e):a.getBaseAxis(),o=a.getOtherAxis(n);m.indexOf(t,n)<0&&t.push(n),m.indexOf(r,o)<0&&r.push(o)}),{baseAxes:t,otherAxes:r}};var L=["xAxis","yAxis"];i.create=function(e,t){var r=[];return e.eachComponent("grid",function(a,n){var o=new i(a,e,t);o.name="grid_"+n,o.resize(a,t,!0),a.coordinateSystem=o,r.push(o)}),e.eachSeries(function(t){if(c(t)){var r=h(t,e),a=r[0],n=r[1],o=a.getCoordSysModel(),i=o.coordinateSystem;t.coordinateSystem=i.getCartesian(a.componentIndex,n.componentIndex)}}),r},i.dimensions=i.prototype.dimensions=g.prototype.dimensions,T.register("cartesian2d",i);var S=i;e.exports=S},function(e,t,r){"use strict";function a(e,t,r){var a=t.get("center"),n=r.getWidth(),o=r.getHeight();e.cx=u(a[0],n),e.cy=u(a[1],o);var i=e.getRadiusAxis(),l=Math.min(n,o)/2,s=u(t.get("radius"),l);i.inverse?i.setExtent(s,0):i.setExtent(0,s)}function n(e,t){var r=this,a=r.getAngleAxis(),n=r.getRadiusAxis();if(a.scale.setExtent(1/0,-1/0),n.scale.setExtent(1/0,-1/0),e.eachSeries(function(e){if(e.coordinateSystem===r){var t=e.getData();n.scale.unionExtentFromData(t,"radius"),a.scale.unionExtentFromData(t,"angle")}}),d(a.scale,a.model),d(n.scale,n.model),"category"===a.type&&!a.onBand){var o=a.getExtent(),i=360/a.scale.count();a.inverse?o[1]+=i:o[1]-=i,a.setExtent(o[0],o[1])}}function o(e,t){if(e.type=t.get("type"),e.scale=c(t),e.onBand=t.get("boundaryGap")&&"category"===e.type,e.inverse=t.get("inverse"),"angleAxis"===t.mainType){e.inverse^=t.get("clockwise");var r=t.get("startAngle");e.setExtent(r,r+(e.inverse?-360:360))}t.axis=e,e.model=t}var i=r(9),l=(i.__DEV__,r(0),r(946)),s=r(4),u=s.parsePercent,h=r(37),c=h.createScaleByModel,d=h.niceScaleExtent,m=r(53);r(947);var p={dimensions:l.prototype.dimensions,create:function(e,t){var r=[];return e.eachComponent("polar",function(e,i){var s=new l(i);s.update=n;var u=s.getRadiusAxis(),h=s.getAngleAxis(),c=e.findAxisModel("radiusAxis"),d=e.findAxisModel("angleAxis");o(u,c),o(h,d),a(s,e,t),r.push(s),e.coordinateSystem=s,s.model=e}),e.eachSeries(function(t){if("polar"===t.get("coordinateSystem")){var r=e.queryComponents({mainType:"polar",index:t.get("polarIndex"),id:t.get("polarId")})[0];t.coordinateSystem=r.coordinateSystem}}),r}};m.register("polar",p)},function(e,t,r){"use strict";function a(e){return e.get("stack")||d+e.seriesIndex}function n(e){return e.dim+e.index}function o(e,t){var r=[],a=e.axis;if("category"===a.type){for(var n=a.getBandWidth(),o=0;o<e.count;o++)r.push(u.defaults({bandWidth:n,axisKey:"axis0",stackId:d+o},e));for(var i=l(r,t),s=[],o=0;o<e.count;o++){var h=i.axis0[d+o];h.offsetCenter=h.offset+h.width/2,s.push(h)}return s}}function i(e,t){return l(u.map(e,function(e){var t=e.getData(),r=e.coordinateSystem,o=r.getBaseAxis(),i=o.getExtent(),l="category"===o.type?o.getBandWidth():Math.abs(i[1]-i[0])/t.count();return{bandWidth:l,barWidth:c(e.get("barWidth"),l),barMaxWidth:c(e.get("barMaxWidth"),l),barGap:e.get("barGap"),barCategoryGap:e.get("barCategoryGap"),axisKey:n(o),stackId:a(e)}}),t)}function l(e,t){var r={};u.each(e,function(e,t){var a=e.axisKey,n=e.bandWidth,o=r[a]||{bandWidth:n,remainedWidth:n,autoWidthCount:0,categoryGap:"20%",gap:"30%",stacks:{}},i=o.stacks;r[a]=o;var l=e.stackId;i[l]||o.autoWidthCount++,i[l]=i[l]||{width:0,maxWidth:0};var s=e.barWidth;s&&!i[l].width&&(i[l].width=s,s=Math.min(o.remainedWidth,s),o.remainedWidth-=s);var u=e.barMaxWidth;u&&(i[l].maxWidth=u);var h=e.barGap;null!=h&&(o.gap=h);var c=e.barCategoryGap;null!=c&&(o.categoryGap=c)});var a={};return u.each(r,function(e,t){a[t]={};var r=e.stacks,n=e.bandWidth,o=c(e.categoryGap,n),i=c(e.gap,1),l=e.remainedWidth,s=e.autoWidthCount,h=(l-o)/(s+(s-1)*i);h=Math.max(h,0),u.each(r,function(e,t){var r=e.maxWidth;r&&r<h&&(r=Math.min(r,l),e.width&&(r=Math.min(r,e.width)),l-=r,e.width=r,s--)}),h=(l-o)/(s+(s-1)*i),h=Math.max(h,0);var d,m=0;u.each(r,function(e,t){e.width||(e.width=h),d=e,m+=e.width*(1+i)}),d&&(m-=d.width*i);var p=-m/2;u.each(r,function(e,r){a[t][r]=a[t][r]||{offset:p,width:e.width},p+=e.width*(1+i)})}),a}function s(e,t,r){var o=i(u.filter(t.getSeriesByType(e),function(e){return!t.isSeriesFiltered(e)&&e.coordinateSystem&&"cartesian2d"===e.coordinateSystem.type})),l={},s={};t.eachSeriesByType(e,function(e){if("cartesian2d"===e.coordinateSystem.type){var t=e.getData(),r=e.coordinateSystem,i=r.getBaseAxis(),u=a(e),h=o[n(i)][u],c=h.offset,d=h.width,m=r.getOtherAxis(i),p=e.get("barMinHeight")||0,f=i.onZero?m.toGlobalCoord(m.dataToCoord(0)):m.getGlobalExtent()[0],v=[e.coordDimToDataDim("x")[0],e.coordDimToDataDim("y")[0]],y=t.mapArray(v,function(e,t){return r.dataToPoint([e,t])},!0);l[u]=l[u]||[],s[u]=s[u]||[],t.setLayout({offset:c,size:d}),t.each(e.coordDimToDataDim(m.dim)[0],function(e,r){if(!isNaN(e)){l[u][r]||(l[u][r]={p:f,n:f},s[u][r]={p:f,n:f});var a,n,o,i,h=e>=0?"p":"n",v=y[r],g=l[u][r][h],_=s[u][r][h];m.isHorizontal()?(a=g,n=v[1]+c,o=v[0]-_,i=d,s[u][r][h]+=o,Math.abs(o)<p&&(o=(o<0?-1:1)*p),l[u][r][h]+=o):(a=v[0]+c,n=g,o=d,i=v[1]-_,s[u][r][h]+=i,Math.abs(i)<p&&(i=(i<=0?-1:1)*p),l[u][r][h]+=i),t.setItemLayout(r,{x:a,y:n,width:o,height:i})}},!0)}},this)}var u=r(0),h=r(4),c=h.parsePercent,d="__ec_stack_";s.getLayoutOnAxis=o;var m=s;e.exports=m},function(e,t,r){"use strict";function a(e,t){t.eachSeriesByType(e,function(e){var t=e.getData(),r=e.coordinateSystem;if(r){for(var a=[],n=r.dimensions,o=0;o<n.length;o++)a.push(e.coordDimToDataDim(r.dimensions[o])[0]);1===a.length?t.each(a[0],function(e,a){t.setItemLayout(a,isNaN(e)?[NaN,NaN]:r.dataToPoint(e))}):2===a.length&&t.each(a,function(e,a,n){t.setItemLayout(n,isNaN(e)||isNaN(a)?[NaN,NaN]:r.dataToPoint([e,a]))},!0)}})}e.exports=a},function(e,t,r){"use strict";function a(e){return[e||"",u++,Math.random()].join(h)}function n(e){var t={};return e.registerSubTypeDefaulter=function(e,r){e=s(e),t[e.main]=r},e.determineSubType=function(r,a){var n=a.type;if(!n){var o=s(r).main;e.hasSubTypes(r)&&t[o]&&(n=t[o](a))}return n},e}function o(e,t){function r(e){var r={},o=[];return i.each(e,function(l){var s=a(r,l),u=s.originalDeps=t(l),h=n(u,e);s.entryCount=h.length,0===s.entryCount&&o.push(l),i.each(h,function(e){i.indexOf(s.predecessor,e)<0&&s.predecessor.push(e);var t=a(r,e);i.indexOf(t.successor,e)<0&&t.successor.push(l)})}),{graph:r,noEntryList:o}}function a(e,t){return e[t]||(e[t]={predecessor:[],successor:[]}),e[t]}function n(e,t){var r=[];return i.each(e,function(e){i.indexOf(t,e)>=0&&r.push(e)}),r}e.topologicalTravel=function(e,t,a,n){function o(e){0==--u[e].entryCount&&h.push(e)}function l(e){c[e]=!0,o(e)}if(e.length){var s=r(t),u=s.graph,h=s.noEntryList,c={};for(i.each(e,function(e){c[e]=!0});h.length;){var d=h.pop(),m=u[d],p=!!c[d];p&&(a.call(n,d,m.originalDeps.slice()),delete c[d]),i.each(m.successor,p?l:o)}i.each(c,function(){throw new Error("Circle dependency may exists")})}}}var i=r(0),l=r(58),s=l.parseClassType,u=0,h="_";t.getUID=a,t.enableSubTypeDefaulter=n,t.enableTopologicalTravel=o},function(e,t,r){"use strict";var a=r(190),n=r(251),o=r(58),i=function(){this.group=new a,this.uid=n.getUID("viewComponent")};i.prototype={constructor:i,init:function(e,t){},render:function(e,t,r,a){},dispose:function(){}};var l=i.prototype;l.updateView=l.updateLayout=l.updateVisual=function(e,t,r,a){},o.enableClassExtend(i),o.enableClassManagement(i,{registerWhenExtend:!0});var s=i;e.exports=s},function(e,t,r){"use strict";function a(e,t){var r={};t.eachRawSeriesByType(e,function(e){var a=e.getRawData(),n={};if(!t.isSeriesFiltered(e)){var o=e.getData();o.each(function(e){var t=o.getRawIndex(e);n[t]=e}),a.each(function(t){var i=n[t],l=null!=i&&o.getItemVisual(i,"color",!0);if(l)a.setItemVisual(t,"color",l);else{var s=a.getItemModel(t),u=s.get("itemStyle.normal.color")||e.getColorFromPalette(a.getName(t),r);a.setItemVisual(t,"color",u),null!=i&&o.setItemVisual(i,"color",u)}})}})}e.exports=a},function(e,t,r){"use strict";t.__esModule=!0,t.go=t.replaceLocation=t.pushLocation=t.startListener=t.getUserConfirmation=t.getCurrentLocation=void 0;var a=r(115),n=r(174),o=r(380),i=r(73),l=r(255),s=l.canUseDOM&&!(0,n.supportsPopstateOnHashchange)(),u=function(e){var t=e&&e.key;return(0,a.createLocation)({pathname:window.location.pathname,search:window.location.search,hash:window.location.hash,state:t?(0,o.readState)(t):void 0},void 0,t)},h=t.getCurrentLocation=function(){var e=void 0;try{e=window.history.state||{}}catch(t){e={}}return u(e)},c=(t.getUserConfirmation=function(e,t){return t(window.confirm(e))},t.startListener=function(e){var t=function(t){(0,n.isExtraneousPopstateEvent)(t)||e(u(t.state))};(0,n.addEventListener)(window,"popstate",t);var r=function(){return e(h())};return s&&(0,n.addEventListener)(window,"hashchange",r),function(){(0,n.removeEventListener)(window,"popstate",t),s&&(0,n.removeEventListener)(window,"hashchange",r)}},function(e,t){var r=e.state,a=e.key;void 0!==r&&(0,o.saveState)(a,r),t({key:a},(0,i.createPath)(e))});t.pushLocation=function(e){return c(e,function(e,t){return window.history.pushState(e,null,t)})},t.replaceLocation=function(e){return c(e,function(e,t){return window.history.replaceState(e,null,t)})},t.go=function(e){e&&window.history.go(e)}},function(e,t,r){"use strict";t.__esModule=!0,t.canUseDOM=!("undefined"==typeof window||!window.document||!window.document.createElement)},function(e,t,r){"use strict";t.__esModule=!0;var a=r(980),n=r(73),o=r(257),i=function(e){return e&&e.__esModule?e:{default:e}}(o),l=r(173),s=r(115),u=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.getCurrentLocation,r=e.getUserConfirmation,o=e.pushLocation,u=e.replaceLocation,h=e.go,c=e.keyLength,d=void 0,m=void 0,p=[],f=[],v=[],y=function(){return m&&m.action===l.POP?v.indexOf(m.key):d?v.indexOf(d.key):-1},g=function(e){var t=y();d=e,d.action===l.PUSH?v=[].concat(v.slice(0,t+1),[d.key]):d.action===l.REPLACE&&(v[t]=d.key),f.forEach(function(e){return e(d)})},_=function(e){return p.push(e),function(){return p=p.filter(function(t){return t!==e})}},T=function(e){return f.push(e),function(){return f=f.filter(function(t){return t!==e})}},x=function(e,t){(0,a.loopAsync)(p.length,function(t,r,a){(0,i.default)(p[t],e,function(e){return null!=e?a(e):r()})},function(e){r&&"string"==typeof e?r(e,function(e){return t(!1!==e)}):t(!1!==e)})},w=function(e){d&&(0,s.locationsAreEqual)(d,e)||m&&(0,s.locationsAreEqual)(m,e)||(m=e,x(e,function(t){if(m===e)if(m=null,t){if(e.action===l.PUSH){var r=(0,n.createPath)(d),a=(0,n.createPath)(e);a===r&&(0,s.statesAreEqual)(d.state,e.state)&&(e.action=l.REPLACE)}e.action===l.POP?g(e):e.action===l.PUSH?!1!==o(e)&&g(e):e.action===l.REPLACE&&!1!==u(e)&&g(e)}else if(d&&e.action===l.POP){var i=v.indexOf(d.key),c=v.indexOf(e.key);-1!==i&&-1!==c&&h(i-c)}}))},N=function(e){return w(M(e,l.PUSH))},b=function(e){return w(M(e,l.REPLACE))},L=function(){return h(-1)},S=function(){return h(1)},k=function(){return Math.random().toString(36).substr(2,c||6)},D=function(e){return(0,n.createPath)(e)},M=function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:k();return(0,s.createLocation)(e,t,r)};return{getCurrentLocation:t,listenBefore:_,listen:T,transitionTo:w,push:N,replace:b,go:h,goBack:L,goForward:S,createKey:k,createPath:n.createPath,createHref:D,createLocation:M}};t.default=u},function(e,t,r){"use strict";t.__esModule=!0;var a=r(95),n=(function(e){e&&e.__esModule}(a),function(e,t,r){var a=e(t,r);e.length<2&&r(a)});t.default=n},function(e,t,r){"use strict";function a(e,t,r){if("string"!=typeof t){if(c){var d=h(t);d&&d!==c&&a(e,d,r)}var m=l(t);s&&(m=m.concat(s(t)));for(var p=0;p<m.length;++p){var f=m[p];if(!(n[f]||o[f]||r&&r[f])){var v=u(t,f);try{i(e,f,v)}catch(e){}}}return e}return e}var n={childContextTypes:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i=Object.defineProperty,l=Object.getOwnPropertyNames,s=Object.getOwnPropertySymbols,u=Object.getOwnPropertyDescriptor,h=Object.getPrototypeOf,c=h&&h(Object);e.exports=a},function(e,t,r){"use strict";var a=r(116),n=r(59),o=a(n,"Map");e.exports=o},function(e,t,r){"use strict";function a(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var a=e[t];this.set(a[0],a[1])}}var n=r(1072),o=r(1073),i=r(1074),l=r(1075),s=r(1076);a.prototype.clear=n,a.prototype.delete=o,a.prototype.get=i,a.prototype.has=l,a.prototype.set=s,e.exports=a},function(e,t,r){"use strict";function a(e,t){if(o(e))return!1;var r=void 0===e?"undefined":n(e);return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=e&&!i(e))||s.test(e)||!l.test(e)||null!=t&&e in Object(t)}var 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},o=r(39),i=r(136),l=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,s=/^\w*$/;e.exports=a},function(e,t,r){"use strict";var a=r(1024),n=r(97),o=Object.prototype,i=o.hasOwnProperty,l=o.propertyIsEnumerable,s=a(function(){return arguments}())?a:function(e){return n(e)&&i.call(e,"callee")&&!l.call(e,"callee")};e.exports=s},function(e,t,r){"use strict";(function(e){var 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},n=r(59),o=r(1107),i="object"==a(t)&&t&&!t.nodeType&&t,l=i&&"object"==a(e)&&e&&!e.nodeType&&e,s=l&&l.exports===i,u=s?n.Buffer:void 0,h=u?u.isBuffer:void 0,c=h||o;e.exports=c}).call(t,r(120)(e))},function(e,t,r){"use strict";function a(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=n}var n=9007199254740991;e.exports=a},function(e,t,r){"use strict";function a(e){return"string"==typeof e||!o(e)&&i(e)&&n(e)==l}var n=r(96),o=r(39),i=r(97),l="[object String]";e.exports=a},function(e,t,r){"use strict";var a=r(1029),n=r(1040),o=r(1080),i=o&&o.isTypedArray,l=i?n(i):a;e.exports=l},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=function(){};a.prototype.push=function(e){this[e.prototype.name]=e},t.default=new a,e.exports=t.default},function(e,t,r){"use strict";function a(e){"undefined"!=typeof console&&"function"==typeof console.error&&console.error(e);try{throw new Error(e)}catch(e){}}t.__esModule=!0,t.default=a},function(e,t,r){"use strict";function a(e,t,r){function a(){if(i=!0,l)return void(u=[].concat(Array.prototype.slice.call(arguments)));r.apply(this,arguments)}function n(){if(!i&&(s=!0,!l)){for(l=!0;!i&&o<e&&s;)s=!1,t.call(this,o++,n,a);if(l=!1,i)return void r.apply(this,u);o>=e&&s&&(i=!0,r())}}var o=0,i=!1,l=!1,s=!1,u=void 0;n()}function n(e,t,r){function a(e,t,a){i||(t?(i=!0,r(t)):(o[e]=a,(i=++l===n)&&r(null,o)))}var n=e.length,o=[];if(0===n)return r(null,o);var i=!1,l=0;e.forEach(function(e,r){t(e,r,function(e,t){a(r,e,t)})})}t.__esModule=!0,t.loopAsync=a,t.mapAsync=n},function(e,t,r){"use strict";function a(e){return"@@contextSubscriber/"+e}function n(e){var t,r,n=a(e),o=n+"/listeners",i=n+"/eventIndex",l=n+"/subscribe";return r={childContextTypes:(t={},t[n]=s.isRequired,t),getChildContext:function(){var e;return e={},e[n]={eventIndex:this[i],subscribe:this[l]},e},componentWillMount:function(){this[o]=[],this[i]=0},componentWillReceiveProps:function(){this[i]++},componentDidUpdate:function(){var e=this;this[o].forEach(function(t){return t(e[i])})}},r[l]=function(e){var t=this;return this[o].push(e),function(){t[o]=t[o].filter(function(t){return t!==e})}},r}function o(e){var t,r,n=a(e),o=n+"/lastRenderedEventIndex",i=n+"/handleContextUpdate",l=n+"/unsubscribe";return r={contextTypes:(t={},t[n]=s,t),getInitialState:function(){var e;return this.context[n]?(e={},e[o]=this.context[n].eventIndex,e):{}},componentDidMount:function(){this.context[n]&&(this[l]=this.context[n].subscribe(this[i]))},componentWillReceiveProps:function(){var e;this.context[n]&&this.setState((e={},e[o]=this.context[n].eventIndex,e))},componentWillUnmount:function(){this[l]&&(this[l](),this[l]=null)}},r[i]=function(e){if(e!==this.state[o]){var t;this.setState((t={},t[o]=e,t))}},r}t.__esModule=!0,t.ContextProvider=n,t.ContextSubscriber=o;var i=r(21),l=function(e){return e&&e.__esModule?e:{default:e}}(i),s=l.default.shape({subscribe:l.default.func.isRequired,eventIndex:l.default.number.isRequired})},function(e,t,r){"use strict";t.__esModule=!0,t.locationShape=t.routerShape=void 0;var a=r(21);t.routerShape=(0,a.shape)({push:a.func.isRequired,replace:a.func.isRequired,go:a.func.isRequired,goBack:a.func.isRequired,goForward:a.func.isRequired,setRouteLeaveHook:a.func.isRequired,isActive:a.func.isRequired}),t.locationShape=(0,a.shape)({pathname:a.string.isRequired,search:a.string.isRequired,state:a.object,action:a.string.isRequired,key:a.string})},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}var 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.__esModule=!0;var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},i="function"==typeof Symbol&&"symbol"===n(Symbol.iterator)?function(e){return void 0===e?"undefined":n(e)}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":void 0===e?"undefined":n(e)},l=r(28),s=a(l),u=r(15),h=a(u),c=r(57),d=a(c),m=r(21),p=r(1161),f=a(p),v=r(270),y=r(74),g=(0,d.default)({displayName:"RouterContext",mixins:[(0,v.ContextProvider)("router")],propTypes:{router:m.object.isRequired,location:m.object.isRequired,routes:m.array.isRequired,params:m.object.isRequired,components:m.array.isRequired,createElement:m.func.isRequired},getDefaultProps:function(){return{createElement:h.default.createElement}},childContextTypes:{router:m.object.isRequired},getChildContext:function(){return{router:this.props.router}},createElement:function(e,t){return null==e?null:this.props.createElement(e,t)},render:function(){var e=this,t=this.props,r=t.location,a=t.routes,n=t.params,l=t.components,u=t.router,c=null;return l&&(c=l.reduceRight(function(t,l,s){if(null==l)return t;var h=a[s],c=(0,f.default)(h,n),d={location:r,params:n,route:h,router:u,routeParams:c,routes:a};if((0,y.isReactChildren)(t))d.children=t;else if(t)for(var m in t)Object.prototype.hasOwnProperty.call(t,m)&&(d[m]=t[m]);if("object"===(void 0===l?"undefined":i(l))){var p={};for(var v in l)Object.prototype.hasOwnProperty.call(l,v)&&(p[v]=e.createElement(l[v],o({key:v},d)));return p}return e.createElement(l,d)},c)),null===c||!1===c||h.default.isValidElement(c)||(0,s.default)(!1),c}});t.default=g,e.exports=t.default},function(e,t,r){"use strict";function a(){var e=arguments.length<=0||void 0===arguments[0]?10:arguments[0],t=arguments[1],r=new Array(e),a=0,n=0,s=0;return{isEmpty:function(){return 0==a},put:function(u){if(a<e)r[n]=u,n=(n+1)%e,a++;else switch(t){case i:throw new Error(o);case l:r[n]=u,n=(n+1)%e,s=n}},take:function(){if(0!=a){var t=r[s];return r[s]=null,a--,s=(s+1)%e,t}}}}Object.defineProperty(t,"__esModule",{value:!0}),t.buffers=t.BUFFER_OVERFLOW=void 0;var n=r(60),o=t.BUFFER_OVERFLOW="Channel's Buffer overflow!",i=1,l=3,s={isEmpty:n.kTrue,put:n.noop,take:n.noop};t.buffers={none:function(){return s},fixed:function(e){return a(e,i)},dropping:function(e){return a(e,2)},sliding:function(e){return a(e,l)}}},function(e,t,r){"use strict";function a(e,t,r){if(0!==e.length){var a,n=e[0],o=n[0],i=n[0],l=n[1],s=n[1];for(a=1;a<e.length;a++)n=e[a],o=h(o,n[0]),i=c(i,n[0]),l=h(l,n[1]),s=c(s,n[1]);t[0]=o,t[1]=l,r[0]=i,r[1]=s}}function n(e,t,r,a,n,o){n[0]=h(e,r),n[1]=h(t,a),o[0]=c(e,r),o[1]=c(t,a)}function o(e,t,r,a,n,o,i,l,s,d){var m,p=u.cubicExtrema,f=u.cubicAt,v=p(e,r,n,i,g);for(s[0]=1/0,s[1]=1/0,d[0]=-1/0,d[1]=-1/0,m=0;m<v;m++){var y=f(e,r,n,i,g[m]);s[0]=h(y,s[0]),d[0]=c(y,d[0])}for(v=p(t,a,o,l,_),m=0;m<v;m++){var T=f(t,a,o,l,_[m]);s[1]=h(T,s[1]),d[1]=c(T,d[1])}s[0]=h(e,s[0]),d[0]=c(e,d[0]),s[0]=h(i,s[0]),d[0]=c(i,d[0]),s[1]=h(t,s[1]),d[1]=c(t,d[1]),s[1]=h(l,s[1]),d[1]=c(l,d[1])}function i(e,t,r,a,n,o,i,l){var s=u.quadraticExtremum,d=u.quadraticAt,m=c(h(s(e,r,n),1),0),p=c(h(s(t,a,o),1),0),f=d(e,r,n,m),v=d(t,a,o,p);i[0]=h(e,n,f),i[1]=h(t,o,v),l[0]=c(e,n,f),l[1]=c(t,o,v)}function l(e,t,r,a,n,o,i,l,u){var h=s.min,c=s.max,g=Math.abs(n-o);if(g%p<1e-4&&g>1e-4)return l[0]=e-r,l[1]=t-a,u[0]=e+r,void(u[1]=t+a);if(f[0]=m(n)*r+e,f[1]=d(n)*a+t,v[0]=m(o)*r+e,v[1]=d(o)*a+t,h(l,f,v),c(u,f,v),n%=p,n<0&&(n+=p),o%=p,o<0&&(o+=p),n>o&&!i?o+=p:n<o&&i&&(n+=p),i){var _=o;o=n,n=_}for(var T=0;T<o;T+=Math.PI/2)T>n&&(y[0]=m(T)*r+e,y[1]=d(T)*a+t,h(l,y,l),c(u,y,u))}var s=r(12),u=r(75),h=Math.min,c=Math.max,d=Math.sin,m=Math.cos,p=2*Math.PI,f=s.create(),v=s.create(),y=s.create(),g=[],_=[];t.fromPoints=a,t.fromLine=n,t.fromCubic=o,t.fromQuadratic=i,t.fromArc=l},function(e,t,r){"use strict";function a(e){for(var t=0;e>=c;)t|=1&e,e>>=1;return e+t}function n(e,t,r,a){var n=t+1;if(n===r)return 1;if(a(e[n++],e[t])<0){for(;n<r&&a(e[n],e[n-1])<0;)n++;o(e,t,n)}else for(;n<r&&a(e[n],e[n-1])>=0;)n++;return n-t}function o(e,t,r){for(r--;t<r;){var a=e[t];e[t++]=e[r],e[r--]=a}}function i(e,t,r,a,n){for(a===t&&a++;a<r;a++){for(var o,i=e[a],l=t,s=a;l<s;)o=l+s>>>1,n(i,e[o])<0?s=o:l=o+1;var u=a-l;switch(u){case 3:e[l+3]=e[l+2];case 2:e[l+2]=e[l+1];case 1:e[l+1]=e[l];break;default:for(;u>0;)e[l+u]=e[l+u-1],u--}e[l]=i}}function l(e,t,r,a,n,o){var i=0,l=0,s=1;if(o(e,t[r+n])>0){for(l=a-n;s<l&&o(e,t[r+n+s])>0;)i=s,(s=1+(s<<1))<=0&&(s=l);s>l&&(s=l),i+=n,s+=n}else{for(l=n+1;s<l&&o(e,t[r+n-s])<=0;)i=s,(s=1+(s<<1))<=0&&(s=l);s>l&&(s=l);var u=i;i=n-s,s=n-u}for(i++;i<s;){var h=i+(s-i>>>1);o(e,t[r+h])>0?i=h+1:s=h}return s}function s(e,t,r,a,n,o){var i=0,l=0,s=1;if(o(e,t[r+n])<0){for(l=n+1;s<l&&o(e,t[r+n-s])<0;)i=s,(s=1+(s<<1))<=0&&(s=l);s>l&&(s=l);var u=i;i=n-s,s=n-u}else{for(l=a-n;s<l&&o(e,t[r+n+s])>=0;)i=s,(s=1+(s<<1))<=0&&(s=l);s>l&&(s=l),i+=n,s+=n}for(i++;i<s;){var h=i+(s-i>>>1);o(e,t[r+h])<0?s=h:i=h+1}return s}function u(e,t){function r(e,t){h[p]=e,c[p]=t,p+=1}function a(){for(;p>1;){var e=p-2;if(e>=1&&c[e-1]<=c[e]+c[e+1]||e>=2&&c[e-2]<=c[e]+c[e-1])c[e-1]<c[e+1]&&e--;else if(c[e]>c[e+1])break;o(e)}}function n(){for(;p>1;){var e=p-2;e>0&&c[e-1]<c[e+1]&&e--,o(e)}}function o(r){var a=h[r],n=c[r],o=h[r+1],d=c[r+1];c[r]=n+d,r===p-3&&(h[r+1]=h[r+2],c[r+1]=c[r+2]),p--;var m=s(e[o],e,a,n,0,t);a+=m,0!=(n-=m)&&0!==(d=l(e[a+n-1],e,o,d,d-1,t))&&(n<=d?i(a,n,o,d):u(a,n,o,d))}function i(r,a,n,o){var i=0;for(i=0;i<a;i++)f[i]=e[r+i];var u=0,h=n,c=r;if(e[c++]=e[h++],0!=--o){if(1===a){for(i=0;i<o;i++)e[c+i]=e[h+i];return void(e[c+o]=f[u])}for(var p,v,y,g=m;;){p=0,v=0,y=!1;do{if(t(e[h],f[u])<0){if(e[c++]=e[h++],v++,p=0,0==--o){y=!0;break}}else if(e[c++]=f[u++],p++,v=0,1==--a){y=!0;break}}while((p|v)<g);if(y)break;do{if(0!==(p=s(e[h],f,u,a,0,t))){for(i=0;i<p;i++)e[c+i]=f[u+i];if(c+=p,u+=p,(a-=p)<=1){y=!0;break}}if(e[c++]=e[h++],0==--o){y=!0;break}if(0!==(v=l(f[u],e,h,o,0,t))){for(i=0;i<v;i++)e[c+i]=e[h+i];if(c+=v,h+=v,0==(o-=v)){y=!0;break}}if(e[c++]=f[u++],1==--a){y=!0;break}g--}while(p>=d||v>=d);if(y)break;g<0&&(g=0),g+=2}if(m=g,m<1&&(m=1),1===a){for(i=0;i<o;i++)e[c+i]=e[h+i];e[c+o]=f[u]}else{if(0===a)throw new Error;for(i=0;i<a;i++)e[c+i]=f[u+i]}}else for(i=0;i<a;i++)e[c+i]=f[u+i]}function u(r,a,n,o){var i=0;for(i=0;i<o;i++)f[i]=e[n+i];var u=r+a-1,h=o-1,c=n+o-1,p=0,v=0;if(e[c--]=e[u--],0!=--a){if(1===o){for(c-=a,u-=a,v=c+1,p=u+1,i=a-1;i>=0;i--)e[v+i]=e[p+i];return void(e[c]=f[h])}for(var y=m;;){var g=0,_=0,T=!1;do{if(t(f[h],e[u])<0){if(e[c--]=e[u--],g++,_=0,0==--a){T=!0;break}}else if(e[c--]=f[h--],_++,g=0,1==--o){T=!0;break}}while((g|_)<y);if(T)break;do{if(0!=(g=a-s(f[h],e,r,a,a-1,t))){for(c-=g,u-=g,a-=g,v=c+1,p=u+1,i=g-1;i>=0;i--)e[v+i]=e[p+i];if(0===a){T=!0;break}}if(e[c--]=f[h--],1==--o){T=!0;break}if(0!=(_=o-l(e[u],f,0,o,o-1,t))){for(c-=_,h-=_,o-=_,v=c+1,p=h+1,i=0;i<_;i++)e[v+i]=f[p+i];if(o<=1){T=!0;break}}if(e[c--]=e[u--],0==--a){T=!0;break}y--}while(g>=d||_>=d);if(T)break;y<0&&(y=0),y+=2}if(m=y,m<1&&(m=1),1===o){for(c-=a,u-=a,v=c+1,p=u+1,i=a-1;i>=0;i--)e[v+i]=e[p+i];e[c]=f[h]}else{if(0===o)throw new Error;for(p=c-(o-1),i=0;i<o;i++)e[p+i]=f[i]}}else for(p=c-(o-1),i=0;i<o;i++)e[p+i]=f[i]}var h,c,m=d,p=0;e.length;var f=[];h=[],c=[],this.mergeRuns=a,this.forceMergeRuns=n,this.pushRun=r}function h(e,t,r,o){r||(r=0),o||(o=e.length);var l=o-r;if(!(l<2)){var s=0;if(l<c)return s=n(e,r,o,t),void i(e,r,o,r+s,t);var h=new u(e,t),d=a(l);do{if((s=n(e,r,o,t))<d){var m=l;m>d&&(m=d),i(e,r,r+m,r+s,t),s=m}h.pushRun(r,s),h.mergeRuns(),l-=s,r+=s}while(0!==l);h.forceMergeRuns()}}var c=32,d=7;e.exports=h},function(e,t,r){"use strict";function a(e){if("string"==typeof e){var t=s.get(e);return t&&t.image}return e}function n(e,t,r,a,n){if(e){if("string"==typeof e){if(t&&t.__zrImageSrc===e||!r)return t;var l=s.get(e),u={hostEl:r,cb:a,cbPayload:n};return l?(t=l.image,!i(t)&&l.pending.push(u)):(!t&&(t=new Image),t.onload=o,s.put(e,t.__cachedImgObj={image:t,pending:[u]}),t.src=t.__zrImageSrc=e),t}return e}return t}function o(){var e=this.__cachedImgObj;this.onload=this.__cachedImgObj=null;for(var t=0;t<e.pending.length;t++){var r=e.pending[t],a=r.cb;a&&a(this,r.cbPayload),r.hostEl.dirty()}e.pending.length=0}function i(e){return e&&e.width&&e.height}var l=r(442),s=new l(50);t.findExistImage=a,t.createOrUpdateImage=n,t.isImageReady=i},function(e,t,r){"use strict";function a(e){return e>l||e<-l}var n=r(40),o=r(12),i=n.identity,l=5e-5,s=function(e){e=e||{},e.position||(this.position=[0,0]),null==e.rotation&&(this.rotation=0),e.scale||(this.scale=[1,1]),this.origin=this.origin||null},u=s.prototype;u.transform=null,u.needLocalTransform=function(){return a(this.rotation)||a(this.position[0])||a(this.position[1])||a(this.scale[0]-1)||a(this.scale[1]-1)},u.updateTransform=function(){var e=this.parent,t=e&&e.transform,r=this.needLocalTransform(),a=this.transform;if(!r&&!t)return void(a&&i(a));a=a||n.create(),r?this.getLocalTransform(a):i(a),t&&(r?n.mul(a,e.transform,a):n.copy(a,e.transform)),this.transform=a,this.invTransform=this.invTransform||n.create(),n.invert(this.invTransform,a)},u.getLocalTransform=function(e){return s.getLocalTransform(this,e)},u.setTransform=function(e){var t=this.transform,r=e.dpr||1;t?e.setTransform(r*t[0],r*t[1],r*t[2],r*t[3],r*t[4],r*t[5]):e.setTransform(r,0,0,r,0,0)},u.restoreTransform=function(e){var t=e.dpr||1;e.setTransform(t,0,0,t,0,0)};var h=[];u.decomposeTransform=function(){if(this.transform){var e=this.parent,t=this.transform;e&&e.transform&&(n.mul(h,e.invTransform,t),t=h);var r=t[0]*t[0]+t[1]*t[1],o=t[2]*t[2]+t[3]*t[3],i=this.position,l=this.scale;a(r-1)&&(r=Math.sqrt(r)),a(o-1)&&(o=Math.sqrt(o)),t[0]<0&&(r=-r),t[3]<0&&(o=-o),i[0]=t[4],i[1]=t[5],l[0]=r,l[1]=o,this.rotation=Math.atan2(-t[1]/o,t[0]/r)}},u.getGlobalScale=function(){var e=this.transform;if(!e)return[1,1];var t=Math.sqrt(e[0]*e[0]+e[1]*e[1]),r=Math.sqrt(e[2]*e[2]+e[3]*e[3]);return e[0]<0&&(t=-t),e[3]<0&&(r=-r),[t,r]},u.transformCoordToLocal=function(e,t){var r=[e,t],a=this.invTransform;return a&&o.applyTransform(r,r,a),r},u.transformCoordToGlobal=function(e,t){var r=[e,t],a=this.transform;return a&&o.applyTransform(r,r,a),r},s.getLocalTransform=function(e,t){t=t||[],i(t);var r=e.origin,a=e.scale||[1,1],o=e.rotation||0,l=e.position||[0,0];return r&&(t[4]-=r[0],t[5]-=r[1]),n.scale(t,t,a),o&&n.rotate(t,t,o),r&&(t[4]+=r[0],t[5]+=r[1]),t[4]+=l[0],t[5]+=l[1],t};var c=s;e.exports=c},function(e,t,r){"use strict";function a(e){return document.createElementNS(n,e)}var n="http://www.w3.org/2000/svg";t.createElement=a},function(e,t,r){"use strict";function a(e){return N(1e4*e)/1e4}function n(e){return e<M&&e>-M}function o(e,t){var r=t?e.textFill:e.fill;return null!=r&&r!==w}function i(e,t){var r=t?e.textStroke:e.stroke;return null!=r&&r!==w}function l(e,t){t&&s(e,"transform","matrix("+x.call(t,",")+")")}function s(e,t,r){(!r||"linear"!==r.type&&"radial"!==r.type)&&e.setAttribute(t,r)}function u(e,t,r){e.setAttributeNS("http://www.w3.org/1999/xlink",t,r)}function h(e,t,r){if(o(t,r)){var a=r?t.textFill:t.fill;a="transparent"===a?w:a,"none"!==e.getAttribute("clip-path")&&a===w&&(a="rgba(0, 0, 0, 0.002)"),s(e,"fill",a),s(e,"fill-opacity",t.opacity)}else s(e,"fill",w);if(i(t,r)){var n=r?t.textStroke:t.stroke;n="transparent"===n?w:n,s(e,"stroke",n),s(e,"stroke-width",(r?t.textStrokeWidth:t.lineWidth)/(t.strokeNoScale?t.host.getLineScale():1)),s(e,"paint-order","stroke"),s(e,"stroke-opacity",t.opacity),t.lineDash?(s(e,"stroke-dasharray",t.lineDash.join(",")),s(e,"stroke-dashoffset",N(t.lineDashOffset||0))):s(e,"stroke-dasharray",""),t.lineCap&&s(e,"stroke-linecap",t.lineCap),t.lineJoin&&s(e,"stroke-linejoin",t.lineJoin),t.miterLimit&&s(e,"stroke-miterlimit",t.miterLimit)}else s(e,"stroke",w)}function c(e){for(var t=[],r=e.data,o=e.len(),i=0;i<o;){var l=r[i++],s="",u=0;switch(l){case T.M:s="M",u=2;break;case T.L:s="L",u=2;break;case T.Q:s="Q",u=4;break;case T.C:s="C",u=6;break;case T.A:var h=r[i++],c=r[i++],d=r[i++],m=r[i++],p=r[i++],f=r[i++],v=r[i++],y=r[i++],g=Math.abs(f),_=n(g%k)&&!n(g),x=!1;x=g>=k||!n(g)&&(f>-S&&f<0||f>S)==!!y;var w=a(h+d*L(p)),M=a(c+m*b(p));_&&(f=y?k-1e-4:1e-4-k,x=!0,9===i&&t.push("M",w,M));var A=a(h+d*L(p+f)),I=a(c+m*b(p+f));t.push("A",a(d),a(m),N(v*D),+x,+y,A,I);break;case T.Z:s="Z";break;case T.R:var A=a(r[i++]),I=a(r[i++]),z=a(r[i++]),C=a(r[i++]);t.push("M",A,I,"L",A+z,I,"L",A+z,I+C,"L",A,I+C,"L",A,I)}s&&t.push(s);for(var R=0;R<u;R++)t.push(a(r[i++]))}return t.join(" ")}function d(e){return"middle"===e?"middle":"bottom"===e?"baseline":"hanging"}var m=r(278),p=m.createElement,f=r(121),v=r(19),y=r(54),g=r(193),_=r(141),T=f.CMD,x=Array.prototype.join,w="none",N=Math.round,b=Math.sin,L=Math.cos,S=Math.PI,k=2*Math.PI,D=180/S,M=1e-4,A={};A.brush=function(e){var t=e.style,r=e.__svgEl;r||(r=p("path"),e.__svgEl=r),e.path||e.createPathProxy();var a=e.path;if(e.__dirtyPath){a.beginPath(),e.buildPath(a,e.shape),e.__dirtyPath=!1;var n=c(a);n.indexOf("NaN")<0&&s(r,"d",n)}h(r,t),l(r,e.transform),null!=t.text&&R(e,e.getBoundingRect())};var I={};I.brush=function(e){var t=e.style,r=t.image;if(r instanceof HTMLImageElement&&(r=r.src),r){var a=t.x||0,n=t.y||0,o=t.width,i=t.height,h=e.__svgEl;h||(h=p("image"),e.__svgEl=h),r!==e.__imageSrc&&(u(h,"href",r),e.__imageSrc=r),s(h,"width",o),s(h,"height",i),s(h,"x",a),s(h,"y",n),l(h,e.transform),null!=t.text&&R(e,e.getBoundingRect())}};var z={},C=new v,R=function(e,t,r){var a=e.style;e.__dirty&&g.normalizeTextStyle(a,!0);var n=a.text;if(null!=n){n+="";var o=e.__textSvgEl;if(o||(o=p("text"),e.__textSvgEl=o),h(o,a,!0),e instanceof _||e.style.transformText)l(o,e.transform);else if(e.transform)C.copy(t),C.applyTransform(e.transform),t=C;else{var i=e.transformCoordToGlobal(t.x,t.y);t.x=i[0],t.y=i[1]}var u,c,m=a.textPosition,f=a.textDistance,v=a.textAlign||"left";"number"==typeof a.fontSize&&(a.fontSize+="px");var T=a.font||[a.fontStyle||"",a.fontWeight||"",a.fontSize||"",a.fontFamily||""].join(" ")||y.DEFAULT_FONT,x=d(a.textVerticalAlign);r=y.getBoundingRect(n,T,v,x);var w=r.lineHeight;if(m instanceof Array)u=t.x+m[0],c=t.y+m[1];else{var N=y.adjustTextPositionOnRect(m,t,f);u=N.x,c=N.y,x=d(N.textVerticalAlign),v=N.textAlign}s(o,"alignment-baseline",x),T&&(o.style.font=T);var b=a.textPadding;s(o,"x",u),s(o,"y",c);var L=n.split("\n"),S=L.length,k=v;"left"===k?(k="start",b&&(u+=b[3])):"right"===k?(k="end",b&&(u-=b[1])):"center"===k&&(k="middle",b&&(u+=(b[3]-b[1])/2));var D=0;if("baseline"===x?(D=-r.height+w,b&&(D-=b[2])):"middle"===x?(D=(-r.height+w)/2,b&&(c+=(b[0]-b[2])/2)):b&&(D+=b[0]),e.__text!==n||e.__textFont!==T){var M=e.__tspanList||[];e.__tspanList=M;for(var A=0;A<S;A++){var I=M[A];I?I.innerHTML="":(I=M[A]=p("tspan"),o.appendChild(I),s(I,"alignment-baseline",x),s(I,"text-anchor",k)),s(I,"x",u),s(I,"y",c+A*w+D),I.appendChild(document.createTextNode(L[A]))}for(;A<M.length;A++)o.removeChild(M[A]);M.length=S,e.__text=n,e.__textFont=T}else if(e.__tspanList.length)for(var z=e.__tspanList.length,A=0;A<z;++A){var I=e.__tspanList[A];I&&(s(I,"x",u),s(I,"y",c+A*w+D))}}};z.drawRectText=R,z.brush=function(e){var t=e.style;null!=t.text&&(t.textPosition=[0,0],R(e,{x:t.x||0,y:t.y||0,width:0,height:0},e.getBoundingRect()))},t.path=A,t.image=I,t.text=z},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0,t.compose=t.applyMiddleware=t.bindActionCreators=t.combineReducers=t.createStore=void 0;var n=r(431),o=a(n),i=r(1181),l=a(i),s=r(1180),u=a(s),h=r(1179),c=a(h),d=r(430),m=a(d);a(r(432)),t.createStore=o.default,t.combineReducers=l.default,t.bindActionCreators=u.default,t.applyMiddleware=c.default,t.compose=m.default},function(e,t,r){"use strict";e.exports={default:r(486),__esModule:!0}},function(e,t,r){"use strict";t.__esModule=!0;var a=r(281),n=function(e){return e&&e.__esModule?e:{default:e}}(a);t.default=function(e,t,r){return t in e?(0,n.default)(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}},function(e,t,r){"use strict";var a=r(105),n=r(64).document,o=a(n)&&a(n.createElement);e.exports=function(e){return o?n.createElement(e):{}}},function(e,t,r){"use strict";e.exports=!r(77)&&!r(122)(function(){return 7!=Object.defineProperty(r(283)("div"),"a",{get:function(){return 7}}).a})},function(e,t,r){"use strict";var a=r(197);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==a(e)?e.split(""):Object(e)}},function(e,t,r){"use strict";var a=r(143),n=r(78),o=r(290),i=r(104),l=r(123),s=r(500),u=r(203),h=r(507),c=r(47)("iterator"),d=!([].keys&&"next"in[].keys()),m=function(){return this};e.exports=function(e,t,r,p,f,v,y){s(r,t,p);var g,_,T,x=function(e){if(!d&&e in L)return L[e];switch(e){case"keys":case"values":return function(){return new r(this,e)}}return function(){return new r(this,e)}},w=t+" Iterator",N="values"==f,b=!1,L=e.prototype,S=L[c]||L["@@iterator"]||f&&L[f],k=S||x(f),D=f?N?x("entries"):k:void 0,M="Array"==t?L.entries||S:S;if(M&&(T=h(M.call(new e)))!==Object.prototype&&T.next&&(u(T,w,!0),a||"function"==typeof T[c]||i(T,c,m)),N&&S&&"values"!==S.name&&(b=!0,k=function(){return S.call(this)}),a&&!y||!d&&!b&&L[c]||i(L,c,k),l[t]=k,l[w]=m,f)if(g={values:N?k:x("values"),keys:v?k:x("keys"),entries:D},y)for(_ in g)_ in L||o(L,_,g[_]);else n(n.P+n.F*(d||b),t,g);return g}},function(e,t,r){"use strict";var a=r(145),n=r(124),o=r(106),i=r(208),l=r(79),s=r(284),u=Object.getOwnPropertyDescriptor;t.f=r(77)?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 n(!a.f.call(e,t),e[t])}},function(e,t,r){"use strict";var a=r(289),n=r(200).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return a(e,n)}},function(e,t,r){"use strict";var a=r(79),n=r(106),o=r(492)(!1),i=r(204)("IE_PROTO");e.exports=function(e,t){var r,l=n(e),s=0,u=[];for(r in l)r!=i&&a(l,r)&&u.push(r);for(;t.length>s;)a(l,r=t[s++])&&(~o(u,r)||u.push(r));return u}},function(e,t,r){"use strict";e.exports=r(104)},function(e,t,r){"use strict";var a=r(206),n=Math.min;e.exports=function(e){return e>0?n(a(e),9007199254740991):0}},function(e,t,r){"use strict";var a=r(509)(!0);r(286)(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,r=this._i;return r>=t.length?{value:void 0,done:!0}:(e=a(t,r),this._i+=e.length,{value:e,done:!1})})},function(e,t,r){"use strict";var a=r(41);e.exports=function(e,t){if("number"!=typeof e&&"Number"!=a(e))throw TypeError(t);return+e}},function(e,t,r){"use strict";var a=r(22),n=r(88),o=r(18);e.exports=[].copyWithin||function(e,t){var r=a(this),i=o(r.length),l=n(e,i),s=n(t,i),u=arguments.length>2?arguments[2]:void 0,h=Math.min((void 0===u?i:n(u,i))-s,i-l),c=1;for(s<l&&l<s+h&&(c=-1,s+=h-1,l+=h-1);h-- >0;)s in r?r[l]=r[s]:delete r[l],l+=c,s+=c;return r}},function(e,t,r){"use strict";var a=r(81);e.exports=function(e,t){var r=[];return a(e,!1,r.push,r,t),r}},function(e,t,r){"use strict";var a=r(29),n=r(22),o=r(126),i=r(18);e.exports=function(e,t,r,l,s){a(t);var u=n(e),h=o(u),c=i(u.length),d=s?c-1:0,m=s?-1:1;if(r<2)for(;;){if(d in h){l=h[d],d+=m;break}if(d+=m,s?d<0:c<=d)throw TypeError("Reduce of empty array with no initial value")}for(;s?d>=0:c>d;d+=m)d in h&&(l=t(l,h[d],d,u));return l}},function(e,t,r){"use strict";var a=r(29),n=r(8),o=r(303),i=[].slice,l={},s=function(e,t,r){if(!(t in l)){for(var a=[],n=0;n<t;n++)a[n]="a["+n+"]";l[t]=Function("F,a","return new F("+a.join(",")+")")}return l[t](e,r)};e.exports=Function.bind||function(e){var t=a(this),r=i.call(arguments,1),l=function a(){var n=r.concat(i.call(arguments));return this instanceof a?s(t,n.length,n):o(t,n,e)};return n(t.prototype)&&(l.prototype=t.prototype),l}},function(e,t,r){"use strict";var a=r(17).f,n=r(82),o=r(86),i=r(43),l=r(80),s=r(81),u=r(221),h=r(306),c=r(87),d=r(16),m=r(68).fastKey,p=r(110),f=d?"_s":"size",v=function(e,t){var r,a=m(t);if("F"!==a)return e._i[a];for(r=e._f;r;r=r.n)if(r.k==t)return r};e.exports={getConstructor:function(e,t,r,u){var h=e(function(e,a){l(e,h,t,"_i"),e._t=t,e._i=n(null),e._f=void 0,e._l=void 0,e[f]=0,void 0!=a&&s(a,r,e[u],e)});return o(h.prototype,{clear:function(){for(var e=p(this,t),r=e._i,a=e._f;a;a=a.n)a.r=!0,a.p&&(a.p=a.p.n=void 0),delete r[a.i];e._f=e._l=void 0,e[f]=0},delete:function(e){var r=p(this,t),a=v(r,e);if(a){var n=a.n,o=a.p;delete r._i[a.i],a.r=!0,o&&(o.n=n),n&&(n.p=o),r._f==a&&(r._f=n),r._l==a&&(r._l=o),r[f]--}return!!a},forEach:function(e){p(this,t);for(var r,a=i(e,arguments.length>1?arguments[1]:void 0,3);r=r?r.n:this._f;)for(a(r.v,r.k,this);r&&r.r;)r=r.p},has:function(e){return!!v(p(this,t),e)}}),d&&a(h.prototype,"size",{get:function(){return p(this,t)[f]}}),h},def:function(e,t,r){var a,n,o=v(e,t);return o?o.v=r:(e._l=o={i:n=m(t,!0),k:t,v:r,p:a=e._l,n:void 0,r:!1},e._f||(e._f=o),a&&(a.n=o),e[f]++,"F"!==n&&(e._i[n]=o)),e},getEntry:v,setStrong:function(e,t,r){u(e,t,function(e,r){this._t=p(e,t),this._k=r,this._l=void 0},function(){for(var e=this,t=e._k,r=e._l;r&&r.r;)r=r.p;return e._t&&(e._l=r=r?r.n:e._t._f)?"keys"==t?h(0,r.k):"values"==t?h(0,r.v):h(0,[r.k,r.v]):(e._t=void 0,h(1))},r?"entries":"values",!r,!0),c(t)}}},function(e,t,r){"use strict";var a=r(125),n=r(295);e.exports=function(e){return function(){if(a(this)!=e)throw TypeError(e+"#toJSON isn't generic");return n(this)}}},function(e,t,r){"use strict";var a=r(86),n=r(68).getWeak,o=r(5),i=r(8),l=r(80),s=r(81),u=r(48),h=r(33),c=r(110),d=u(5),m=u(6),p=0,f=function(e){return e._l||(e._l=new v)},v=function(){this.a=[]},y=function(e,t){return d(e.a,function(e){return e[0]===t})};v.prototype={get:function(e){var t=y(this,e);if(t)return t[1]},has:function(e){return!!y(this,e)},set:function(e,t){var r=y(this,e);r?r[1]=t:this.a.push([e,t])},delete:function(e){var t=m(this.a,function(t){return t[0]===e});return~t&&this.a.splice(t,1),!!~t}},e.exports={getConstructor:function(e,t,r,o){var u=e(function(e,a){l(e,u,t,"_i"),e._t=t,e._i=p++,e._l=void 0,void 0!=a&&s(a,r,e[o],e)});return a(u.prototype,{delete:function(e){if(!i(e))return!1;var r=n(e);return!0===r?f(c(this,t)).delete(e):r&&h(r,this._i)&&delete r[this._i]},has:function(e){if(!i(e))return!1;var r=n(e);return!0===r?f(c(this,t)).has(e):r&&h(r,this._i)}}),u},def:function(e,t,r){var a=n(o(t),!0);return!0===a?f(e).set(t,r):a[e._i]=r,e},ufstore:f}},function(e,t,r){"use strict";function a(e,t,r,u,h,c,d,m){for(var p,f,v=h,y=0,g=!!d&&l(d,m,3);y<u;){if(y in r){if(p=g?g(r[y],y,t):r[y],f=!1,o(p)&&(f=p[s],f=void 0!==f?!!f:n(p)),f&&c>0)v=a(e,t,p,i(p.length),v,c-1)-1;else{if(v>=9007199254740991)throw TypeError();e[v]=p}v++}y++}return v}var n=r(151),o=r(8),i=r(18),l=r(43),s=r(13)("isConcatSpreadable");e.exports=a},function(e,t,r){"use strict";e.exports=!r(16)&&!r(7)(function(){return 7!=Object.defineProperty(r(214)("div"),"a",{get:function(){return 7}}).a})},function(e,t,r){"use strict";e.exports=function(e,t,r){var a=void 0===r;switch(t.length){case 0:return a?e():e.call(r);case 1:return a?e(t[0]):e.call(r,t[0]);case 2:return a?e(t[0],t[1]):e.call(r,t[0],t[1]);case 3:return a?e(t[0],t[1],t[2]):e.call(r,t[0],t[1],t[2]);case 4:return a?e(t[0],t[1],t[2],t[3]):e.call(r,t[0],t[1],t[2],t[3])}return e.apply(r,t)}},function(e,t,r){"use strict";var a=r(8),n=Math.floor;e.exports=function(e){return!a(e)&&isFinite(e)&&n(e)===e}},function(e,t,r){"use strict";var a=r(5);e.exports=function(e,t,r,n){try{return n?t(a(r)[0],r[1]):t(r)}catch(t){var o=e.return;throw void 0!==o&&a(o.call(e)),t}}},function(e,t,r){"use strict";e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t,r){"use strict";var a=r(223),n=Math.pow,o=n(2,-52),i=n(2,-23),l=n(2,127)*(2-i),s=n(2,-126),u=function(e){return e+1/o-1/o};e.exports=Math.fround||function(e){var t,r,n=Math.abs(e),h=a(e);return n<s?h*u(n/s/i)*s*i:(t=(1+i/o)*n,r=t-(t-n),r>l||r!=r?h*(1/0):h*r)}},function(e,t,r){"use strict";e.exports=Math.log1p||function(e){return(e=+e)>-1e-8&&e<1e-8?e-e*e/2:Math.log(1+e)}},function(e,t,r){"use strict";e.exports=Math.scale||function(e,t,r,a,n){return 0===arguments.length||e!=e||t!=t||r!=r||a!=a||n!=n?NaN:e===1/0||e===-1/0?e:(e-t)*(n-a)/(r-t)+a}},function(e,t,r){"use strict";var a=r(84),n=r(155),o=r(127),i=r(22),l=r(126),s=Object.assign;e.exports=!s||r(7)(function(){var e={},t={},r=Symbol(),a="abcdefghijklmnopqrst";return e[r]=7,a.split("").forEach(function(e){t[e]=e}),7!=s({},e)[r]||Object.keys(s({},t)).join("")!=a})?function(e,t){for(var r=i(e),s=arguments.length,u=1,h=n.f,c=o.f;s>u;)for(var d,m=l(arguments[u++]),p=h?a(m).concat(h(m)):a(m),f=p.length,v=0;f>v;)c.call(m,d=p[v++])&&(r[d]=m[d]);return r}:s},function(e,t,r){"use strict";var a=r(17),n=r(5),o=r(84);e.exports=r(16)?Object.defineProperties:function(e,t){n(e);for(var r,i=o(t),l=i.length,s=0;l>s;)a.f(e,r=i[s++],t[r]);return e}},function(e,t,r){"use strict";var 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},n=r(36),o=r(83).f,i={}.toString,l="object"==("undefined"==typeof window?"undefined":a(window))&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(e){try{return o(e)}catch(e){return l.slice()}};e.exports.f=function(e){return l&&"[object Window]"==i.call(e)?s(e):o(n(e))}},function(e,t,r){"use strict";var a=r(33),n=r(36),o=r(147)(!1),i=r(227)("IE_PROTO");e.exports=function(e,t){var r,l=n(e),s=0,u=[];for(r in l)r!=i&&a(l,r)&&u.push(r);for(;t.length>s;)a(l,r=t[s++])&&(~o(u,r)||u.push(r));return u}},function(e,t,r){"use strict";var a=r(84),n=r(36),o=r(127).f;e.exports=function(e){return function(t){for(var r,i=n(t),l=a(i),s=l.length,u=0,h=[];s>u;)o.call(i,r=l[u++])&&h.push(e?[r,i[r]]:i[r]);return h}}},function(e,t,r){"use strict";var a=r(83),n=r(155),o=r(5),i=r(6).Reflect;e.exports=i&&i.ownKeys||function(e){var t=a.f(o(e)),r=n.f;return r?t.concat(r(e)):t}},function(e,t,r){"use strict";var a=r(6).parseFloat,n=r(109).trim;e.exports=1/a(r(231)+"-0")!=-1/0?function(e){var t=n(String(e),3),r=a(t);return 0===r&&"-"==t.charAt(0)?-0:r}:a},function(e,t,r){"use strict";var a=r(6).parseInt,n=r(109).trim,o=r(231),i=/^[-+]?0[xX]/;e.exports=8!==a(o+"08")||22!==a(o+"0x16")?function(e,t){var r=n(String(e),3);return a(r,t>>>0||(i.test(r)?16:10))}:a},function(e,t,r){"use strict";e.exports=function(e){try{return{e:!1,v:e()}}catch(e){return{e:!0,v:e}}}},function(e,t,r){"use strict";var a=r(5),n=r(8),o=r(225);e.exports=function(e,t){if(a(e),n(t)&&t.constructor===e)return t;var r=o.f(e);return(0,r.resolve)(t),r.promise}},function(e,t,r){"use strict";var a=r(18),n=r(230),o=r(49);e.exports=function(e,t,r,i){var l=String(o(e)),s=l.length,u=void 0===r?" ":String(r),h=a(t);if(h<=s||""==u)return l;var c=h-s,d=n.call(u,Math.ceil(c/u.length));return d.length>c&&(d=d.slice(0,c)),i?d+l:l+d}},function(e,t,r){"use strict";var a=r(51),n=r(18);e.exports=function(e){if(void 0===e)return 0;var t=a(e),r=n(t);if(t!==r)throw RangeError("Wrong length!");return r}},function(e,t,r){"use strict";t.f=r(13)},function(e,t,r){"use strict";var a=r(298),n=r(110);e.exports=r(148)("Map",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{get:function(e){var t=a.getEntry(n(this,"Map"),e);return t&&t.v},set:function(e,t){return a.def(n(this,"Map"),0===e?0:e,t)}},a,!0)},function(e,t,r){"use strict";r(16)&&"g"!=/./g.flags&&r(17).f(RegExp.prototype,"flags",{configurable:!0,get:r(150)})},function(e,t,r){"use strict";var a=r(298),n=r(110);e.exports=r(148)("Set",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{add:function(e){return a.def(n(this,"Set"),e=0===e?0:e,e)}},a)},function(e,t,r){"use strict";var a,n=r(48)(0),o=r(31),i=r(68),l=r(310),s=r(300),u=r(8),h=r(7),c=r(110),d=i.getWeak,m=Object.isExtensible,p=s.ufstore,f={},v=function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},y={get:function(e){if(u(e)){var t=d(e);return!0===t?p(c(this,"WeakMap")).get(e):t?t[this._i]:void 0}},set:function(e,t){return s.def(c(this,"WeakMap"),e,t)}},g=e.exports=r(148)("WeakMap",v,y,s,!0,!0);h(function(){return 7!=(new g).set((Object.freeze||Object)(f),7).get(f)})&&(a=s.getConstructor(v,"WeakMap"),l(a.prototype,y),i.NEED=!0,n(["delete","has","get","set"],function(e){var t=g.prototype,r=t[e];o(t,e,function(t,n){if(u(t)&&!m(t)){this._f||(this._f=new a);var o=this._f[e](t,n);return"set"==e?this:o}return r.call(this,t,n)})}))},function(e,t,r){"use strict";function a(e,t){o.each(t,function(t){t.update="updateView",n.registerAction(t,function(r,a){var n={};return a.eachComponent({mainType:"series",subType:e,query:r},function(e){e[t.method]&&e[t.method](r.name,r.dataIndex);var a=e.getData();a.each(function(t){var r=a.getName(t);n[r]=e.isSelected(r)||!1})}),{name:r.name,selected:n}})})}var n=r(2),o=r(0);e.exports=a},function(e,t,r){"use strict";var a=r(2),n=r(0),o=r(329),i=o.updateCenterAndZoom;a.registerAction({type:"geoRoam",event:"geoRoam",update:"updateLayout"},function(e,t){var r=e.componentType||"series";t.eachComponent({mainType:r,query:e},function(t){var a=t.coordinateSystem;if("geo"===a.type){var o=i(a,e,t.get("scaleLimit"));t.setCenter&&t.setCenter(o.center),t.setZoom&&t.setZoom(o.zoom),"series"===r&&n.each(t.seriesGroup,function(e){e.setCenter(o.center),e.setZoom(o.zoom)})}})})},function(e,t,r){"use strict";function a(e,t,r){var a=e.getZoom(),n=e.getCenter(),o=t.zoom,i=e.dataToPoint(n);if(null!=t.dx&&null!=t.dy){i[0]-=t.dx,i[1]-=t.dy;var n=e.pointToData(i);e.setCenter(n)}if(null!=o){if(r){var l=r.min||0,s=r.max||1/0;o=Math.max(Math.min(a*o,s),l)/a}e.scale[0]*=o,e.scale[1]*=o;var u=e.position,h=(t.originX-u[0])*(o-1),c=(t.originY-u[1])*(o-1);u[0]-=h,u[1]-=c,e.updateTransform();var n=e.pointToData(i);e.setCenter(n),e.setZoom(o*a)}return{center:e.getCenter(),zoom:e.getZoom()}}t.updateCenterAndZoom=a},function(e,t,r){"use strict";var a=r(27),n=r(69),o=a.extend({type:"series.__base_bar__",getInitialData:function(e,t){return n(e.data,this,t)},getMarkerPosition:function(e){var t=this.coordinateSystem;if(t){var r=t.dataToPoint(e,!0),a=this.getData(),n=a.getLayout("offset"),o=a.getLayout("size");return r[t.getBaseAxis().isHorizontal()?0:1]+=n+o/2,r}return[NaN,NaN]},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,barMinHeight:0,barMinAngle:0,itemStyle:{}}});e.exports=o},function(e,t,r){"use strict";function a(e,t,r,a,i,l,s){var u=r.getModel("label.normal"),h=r.getModel("label.emphasis");o.setLabelStyle(e,t,u,h,{labelFetcher:i,labelDataIndex:l,defaultText:i.getRawValue(l),isRectText:!0,autoColor:a}),n(e),n(t)}function n(e,t){"outside"===e.textPosition&&(e.textPosition=t)}var o=r(3);t.setLabel=a},function(e,t,r){"use strict";function a(e){var t=e.coordinateSystem;if(!t||"view"===t.type){var r=t.getBoundingRect(),a=e.getData(),o=a.graph,i=0,l=a.getSum("value"),s=2*Math.PI/(l||a.count()),u=r.width/2+r.x,h=r.height/2+r.y,c=Math.min(r.width,r.height)/2;o.eachNode(function(e){var t=e.getValue("value");i+=s*(l?t:1)/2,e.setLayout([c*Math.cos(i)+u,c*Math.sin(i)+h]),i+=s*(l?t:1)/2}),a.setLayout({cx:u,cy:h}),o.eachEdge(function(e){var t,r=e.getModel().get("lineStyle.normal.curveness")||0,a=n.clone(e.node1.getLayout()),o=n.clone(e.node2.getLayout()),i=(a[0]+o[0])/2,l=(a[1]+o[1])/2;+r&&(r*=3,t=[u*r+i*(1-r),h*r+l*(1-r)]),e.setLayout([a,o,t])})}}var n=r(12);t.circularLayout=a},function(e,t,r){"use strict";function a(e){var t=e.coordinateSystem;if(!t||"view"===t.type){var r=e.getGraph();r.eachNode(function(e){var t=e.getModel();e.setLayout([+t.get("x"),+t.get("y")])}),n(r)}}function n(e){e.eachEdge(function(e){var t=e.getModel().get("lineStyle.normal.curveness")||0,r=o.clone(e.node1.getLayout()),a=o.clone(e.node2.getLayout()),n=[r,a];+t&&n.push([(r[0]+a[0])/2-(r[1]-a[1])*t,(r[1]+a[1])/2-(a[0]-r[0])*t]),e.setLayout(n)})}var o=r(12);t.simpleLayout=a,t.simpleLayoutEdge=n},function(e,t,r){"use strict";function a(e,t,r){n.Group.call(this),this.add(this.createLine(e,t,r)),this._updateEffectSymbol(e,t)}var n=r(3),o=r(237),i=r(0),l=r(38),s=l.createSymbol,u=r(12),h=r(75),c=a.prototype;c.createLine=function(e,t,r){return new o(e,t,r)},c._updateEffectSymbol=function(e,t){var r=e.getItemModel(t),a=r.getModel("effect"),n=a.get("symbolSize"),o=a.get("symbol");i.isArray(n)||(n=[n,n]);var l=a.get("color")||e.getItemVisual(t,"color"),u=this.childAt(1);this._symbolType!==o&&(this.remove(u),u=s(o,-.5,-.5,1,1,l),u.z2=100,u.culling=!0,this.add(u)),u&&(u.setStyle("shadowColor",l),u.setStyle(a.getItemStyle(["color"])),u.attr("scale",n),u.setColor(l),u.attr("scale",n),this._symbolType=o,this._updateEffectAnimation(e,a,t))},c._updateEffectAnimation=function(e,t,r){var a=this.childAt(1);if(a){var n=this,o=e.getItemLayout(r),l=1e3*t.get("period"),s=t.get("loop"),u=t.get("constantSpeed"),h=i.retrieve(t.get("delay"),function(t){return t/e.count()*l/3}),c="function"==typeof h;if(a.ignore=!0,this.updateAnimationPoints(a,o),u>0&&(l=this.getLineLength(a)/u*1e3),l!==this._period||s!==this._loop){a.stopAnimation();var d=h;c&&(d=h(r)),a.__t>0&&(d=-l*a.__t),a.__t=0;var m=a.animate("",s).when(l,{__t:1}).delay(d).during(function(){n.updateSymbolPosition(a)});s||m.done(function(){n.remove(a)}),m.start()}this._period=l,this._loop=s}},c.getLineLength=function(e){return u.dist(e.__p1,e.__cp1)+u.dist(e.__cp1,e.__p2)},c.updateAnimationPoints=function(e,t){e.__p1=t[0],e.__p2=t[1],e.__cp1=t[2]||[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2]},c.updateData=function(e,t,r){this.childAt(0).updateData(e,t,r),this._updateEffectSymbol(e,t)},c.updateSymbolPosition=function(e){var t=e.__p1,r=e.__p2,a=e.__cp1,n=e.__t,o=e.position,i=h.quadraticAt,l=h.quadraticDerivativeAt;o[0]=i(t[0],a[0],r[0],n),o[1]=i(t[1],a[1],r[1],n);var s=l(t[0],a[0],r[0],n),u=l(t[1],a[1],r[1],n);e.rotation=-Math.atan2(u,s)-Math.PI/2,e.ignore=!1},c.updateLayout=function(e,t){this.childAt(0).updateLayout(e,t);var r=e.getItemModel(t).getModel("effect");this._updateEffectAnimation(e,r,t)},i.inherits(a,n.Group);var d=a;e.exports=d},function(e,t,r){"use strict";function a(e,t,r){n.Group.call(this),this._createPolyline(e,t,r)}var n=r(3),o=r(0),i=a.prototype;i._createPolyline=function(e,t,r){var a=e.getItemLayout(t),o=new n.Polyline({shape:{points:a}});this.add(o),this._updateCommonStl(e,t,r)},i.updateData=function(e,t,r){var a=e.hostModel,o=this.childAt(0),i={shape:{points:e.getItemLayout(t)}};n.updateProps(o,i,a,t),this._updateCommonStl(e,t,r)},i._updateCommonStl=function(e,t,r){var a=this.childAt(0),i=e.getItemModel(t),l=e.getItemVisual(t,"color"),s=r&&r.lineStyle,u=r&&r.hoverLineStyle;r&&!e.hasItemOption||(s=i.getModel("lineStyle.normal").getLineStyle(),u=i.getModel("lineStyle.emphasis").getLineStyle()),a.useStyle(o.defaults({strokeNoScale:!0,fill:"none",stroke:l},s)),a.hoverStyle=u,n.setHoverStyle(this)},i.updateLayout=function(e,t){this.childAt(0).setShape("points",e.getItemLayout(t))},o.inherits(a,n.Group);var l=a;e.exports=l},function(e,t,r){"use strict";function a(e,t,r,a,c){for(var d=new i(a),m=0;m<e.length;m++)d.addNode(n.retrieve(e[m].id,e[m].name,m),m);for(var p=[],f=[],v=0,m=0;m<t.length;m++){var y=t[m],g=y.source,_=y.target;d.addEdge(g,_,v)&&(f.push(y),p.push(n.retrieve(y.id,g+" > "+_)),v++)}var T,x=r.get("coordinateSystem");if("cartesian2d"===x||"polar"===x)T=h(e,r,r.ecModel);else{var w=u.get(x),N=s((w&&"view"!==w.type?w.dimensions||[]:[]).concat(["value"]),e);T=new o(N,r),T.initData(e)}var b=new o(["value"],r);return b.initData(f,p),c&&c(T,b),l({mainData:T,struct:d,structAttr:"graph",datas:{node:T,edge:b},datasAttr:{node:"data",edge:"edgeData"}}),d.update(),d}var n=r(0),o=r(23),i=r(958),l=r(374),s=r(45),u=r(53),h=r(69);e.exports=a},function(e,t,r){"use strict";function a(e){var t,r=o(e,"label");if(r.length)t=r[0];else for(var a,n=e.dimensions.slice();n.length&&(t=n.pop(),"ordinal"===(a=e.getDimensionInfo(t).type)||"time"===a););return t}var n=r(10),o=n.otherDimToDataDim;t.findLabelValueDim=a},function(e,t,r){"use strict";function a(e){return isNaN(e[0])||isNaN(e[1])}function n(e,t,r,n,o,i,s,v,y,g,_){for(var T=0,x=r,w=0;w<n;w++){var N=t[x];if(x>=o||x<0)break;if(a(N)){if(_){x+=i;continue}break}if(x===r)e[i>0?"moveTo":"lineTo"](N[0],N[1]),d(p,N);else if(y>0){var b=x+i,L=t[b];if(_)for(;L&&a(t[b]);)b+=i,L=t[b];var S=.5,k=t[T],L=t[b];if(!L||a(L))d(f,N);else{a(L)&&!_&&(L=N),l.sub(m,L,k);var D,M;if("x"===g||"y"===g){var A="x"===g?0:1;D=Math.abs(N[A]-k[A]),M=Math.abs(N[A]-L[A])}else D=l.dist(N,k),M=l.dist(N,L);S=M/(M+D),c(f,N,m,-y*(1-S))}u(p,p,v),h(p,p,s),u(f,f,v),h(f,f,s),e.bezierCurveTo(p[0],p[1],f[0],f[1],N[0],N[1]),c(p,N,m,y*S)}else e.lineTo(N[0],N[1]);T=x,x+=i}return w}function o(e,t){var r=[1/0,1/0],a=[-1/0,-1/0];if(t)for(var n=0;n<e.length;n++){var o=e[n];o[0]<r[0]&&(r[0]=o[0]),o[1]<r[1]&&(r[1]=o[1]),o[0]>a[0]&&(a[0]=o[0]),o[1]>a[1]&&(a[1]=o[1])}return{min:t?r:a,max:t?a:r}}var i=r(26),l=r(12),s=r(447),u=l.min,h=l.max,c=l.scaleAndAdd,d=l.copy,m=[],p=[],f=[],v=i.extend({type:"ec-polyline",shape:{points:[],smooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},style:{fill:null,stroke:"#000"},brush:s(i.prototype.brush),buildPath:function(e,t){var r=t.points,i=0,l=r.length,s=o(r,t.smoothConstraint);if(t.connectNulls){for(;l>0&&a(r[l-1]);l--);for(;i<l&&a(r[i]);i++);}for(;i<l;)i+=n(e,r,i,l,l,1,s.min,s.max,t.smooth,t.smoothMonotone,t.connectNulls)+1}}),y=i.extend({type:"ec-polygon",shape:{points:[],stackedOnPoints:[],smooth:0,stackedOnSmooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},brush:s(i.prototype.brush),buildPath:function(e,t){var r=t.points,i=t.stackedOnPoints,l=0,s=r.length,u=t.smoothMonotone,h=o(r,t.smoothConstraint),c=o(i,t.smoothConstraint);if(t.connectNulls){for(;s>0&&a(r[s-1]);s--);for(;l<s&&a(r[l]);l++);}for(;l<s;){var d=n(e,r,l,s,s,1,h.min,h.max,t.smooth,u,t.connectNulls);n(e,i,l+d-1,d,s,-1,c.min,c.max,t.stackedOnSmooth,u,t.connectNulls),l+=d+1,e.closePath()}}});t.Polyline=v,t.Polygon=y},function(e,t,r){"use strict";function a(e,t){var r=m(e,t);e.layoutInfo=r;var a=e.get("layout"),n=0,l=0,p=null;"radial"===a?(n=2*Math.PI,l=Math.min(r.height,r.width)/2,p=c(function(e,t){return(e.parentNode===t.parentNode?1:2)/e.depth})):(n=r.width,l=r.height,p=c());var f=e.getData().tree.root,v=f.children[0];s(f),o(v,u,p),f.hierNode.modifier=-v.hierNode.prelim,i(v,h);var y=v,g=v,_=v;i(v,function(e){var t=e.getLayout().x;t<y.getLayout().x&&(y=e),t>g.getLayout().x&&(g=e),e.depth>_.depth&&(_=e)});var T=y===g?1:p(y,g)/2,x=T-y.getLayout().x,w=0,N=0,b=0,L=0;"radial"===a?(w=n/(g.getLayout().x+T+x),N=l/(_.depth-1||1),i(v,function(e){b=(e.getLayout().x+x)*w,L=(e.depth-1)*N;var t=d(b,L);e.setLayout({x:t.x,y:t.y,rawX:b,rawY:L},!0)})):"horizontal"===e.get("orient")?(N=l/(g.getLayout().x+T+x),w=n/(_.depth-1||1),i(v,function(e){L=(e.getLayout().x+x)*N,b=(e.depth-1)*w,e.setLayout({x:b,y:L},!0)})):(w=n/(g.getLayout().x+T+x),N=l/(_.depth-1||1),i(v,function(e){b=(e.getLayout().x+x)*w,L=(e.depth-1)*N,e.setLayout({x:b,y:L},!0)}))}var n=r(828),o=n.eachAfter,i=n.eachBefore,l=r(340),s=l.init,u=l.firstWalk,h=l.secondWalk,c=l.separation,d=l.radialCoordinate,m=l.getViewRect;e.exports=a},function(e,t,r){"use strict";function a(e){e.hierNode={defaultAncestor:null,ancestor:e,prelim:0,modifier:0,change:0,shift:0,i:0,thread:null};for(var t,r,a=[e];t=a.pop();)if(r=t.children,t.isExpand&&r.length)for(var n=r.length,o=n-1;o>=0;o--){var i=r[o];i.hierNode={defaultAncestor:null,ancestor:i,prelim:0,modifier:0,change:0,shift:0,i:o,thread:null},a.push(i)}}function n(e,t){var r=e.isExpand?e.children:[],a=e.parentNode.children,n=e.hierNode.i?a[e.hierNode.i-1]:null;if(r.length){u(e);var o=(r[0].hierNode.prelim+r[r.length-1].hierNode.prelim)/2;n?(e.hierNode.prelim=n.hierNode.prelim+t(e,n),e.hierNode.modifier=e.hierNode.prelim-o):e.hierNode.prelim=o}else n&&(e.hierNode.prelim=n.hierNode.prelim+t(e,n));e.parentNode.hierNode.defaultAncestor=h(e,n,e.parentNode.hierNode.defaultAncestor||a[0],t)}function o(e){var t=e.hierNode.prelim+e.parentNode.hierNode.modifier;e.setLayout({x:t},!0),e.hierNode.modifier+=e.parentNode.hierNode.modifier}function i(e){return arguments.length?e:f}function l(e,t){var r={};return e-=Math.PI/2,r.x=t*Math.cos(e),r.y=t*Math.sin(e),r}function s(e,t){return v.getLayoutRect(e.getBoxLayoutParams(),{width:t.getWidth(),height:t.getHeight()})}function u(e){for(var t=e.children,r=t.length,a=0,n=0;--r>=0;){var o=t[r];o.hierNode.prelim+=a,o.hierNode.modifier+=a,n+=o.hierNode.change,a+=o.hierNode.shift+n}}function h(e,t,r,a){if(t){for(var n=e,o=e,i=o.parentNode.children[0],l=t,s=n.hierNode.modifier,u=o.hierNode.modifier,h=i.hierNode.modifier,f=l.hierNode.modifier;l=c(l),o=d(o),l&&o;){n=c(n),i=d(i),n.hierNode.ancestor=e;var v=l.hierNode.prelim+f-o.hierNode.prelim-u+a(l,o);v>0&&(p(m(l,e,r),e,v),u+=v,s+=v),f+=l.hierNode.modifier,u+=o.hierNode.modifier,s+=n.hierNode.modifier,h+=i.hierNode.modifier}l&&!c(n)&&(n.hierNode.thread=l,n.hierNode.modifier+=f-s),o&&!d(i)&&(i.hierNode.thread=o,i.hierNode.modifier+=u-h,r=e)}return r}function c(e){var t=e.children;return t.length&&e.isExpand?t[t.length-1]:e.hierNode.thread}function d(e){var t=e.children;return t.length&&e.isExpand?t[0]:e.hierNode.thread}function m(e,t,r){return e.hierNode.ancestor.parentNode===t.parentNode?e.hierNode.ancestor:r}function p(e,t,r){var a=r/(t.hierNode.i-e.hierNode.i);t.hierNode.change-=a,t.hierNode.shift+=r,t.hierNode.modifier+=r,t.hierNode.prelim+=r,e.hierNode.change+=a}function f(e,t){return e.parentNode===t.parentNode?1:2}var v=r(11);t.init=a,t.firstWalk=n,t.secondWalk=o,t.separation=i,t.radialCoordinate=l,t.getViewRect=s},function(e,t,r){"use strict";function a(e,t,r){r=r||{};var a=e.coordinateSystem,o=t.axis,i={},l=o.position,s=o.onZero?"onZero":l,u=o.dim,h=a.getRect(),c=[h.x,h.x+h.width,h.y,h.y+h.height],d={left:0,right:1,top:0,bottom:1,onZero:2},m=t.get("offset")||0,p="x"===u?[c[2]-m,c[3]+m]:[c[0]-m,c[1]+m];if(o.onZero){var f=a.getAxis("x"===u?"y":"x",o.onZeroAxisIndex),v=f.toGlobalCoord(f.dataToCoord(0));p[d.onZero]=Math.max(Math.min(v,p[1]),p[0])}i.position=["y"===u?p[d[s]]:c[0],"x"===u?p[d[s]]:c[3]],i.rotation=Math.PI/2*("x"===u?0:1);var y={top:-1,bottom:1,left:-1,right:1};i.labelDirection=i.tickDirection=i.nameDirection=y[l],i.labelOffset=o.onZero?p[d[l]]-p[d.onZero]:0,t.get("axisTick.inside")&&(i.tickDirection=-i.tickDirection),n.retrieve(r.labelInside,t.get("axisLabel.inside"))&&(i.labelDirection=-i.labelDirection);var g=t.get("axisLabel.rotate");return i.labelRotate="top"===s?-g:g,i.labelInterval=o.getLabelInterval(),i.z2=1,i}var n=r(0);t.layout=a},function(e,t,r){"use strict";function a(e,t){t=t||{};var r=e.coordinateSystem,a=e.axis,o={},i=a.position,l=a.orient,s=r.getRect(),u=[s.x,s.x+s.width,s.y,s.y+s.height],h={horizontal:{top:u[2],bottom:u[3]},vertical:{left:u[0],right:u[1]}};o.position=["vertical"===l?h.vertical[i]:u[0],"horizontal"===l?h.horizontal[i]:u[3]];var c={horizontal:0,vertical:1};o.rotation=Math.PI/2*c[l];var d={top:-1,bottom:1,right:1,left:-1};o.labelDirection=o.tickDirection=o.nameDirection=d[i],e.get("axisTick.inside")&&(o.tickDirection=-o.tickDirection),n.retrieve(t.labelInside,e.get("axisLabel.inside"))&&(o.labelDirection=-o.labelDirection);var m=t.rotate;return null==m&&(m=e.get("axisLabel.rotate")),o.labelRotation="top"===i?-m:m,o.labelInterval=a.getLabelInterval(),o.z2=1,o}var n=r(0);t.layout=a},function(e,t,r){"use strict";function a(e,t){var r={};return r[t.dim+"AxisIndex"]=t.index,e.getCartesian(r)}function n(e){return"x"===e.dim?0:1}var o=r(3),i=r(239),l=r(165),s=r(341),u=r(91),h=i.extend({makeElOption:function(e,t,r,n,o){var i=r.axis,u=i.grid,h=n.get("type"),d=a(u,i).getOtherAxis(i).getGlobalExtent(),m=i.toGlobalCoord(i.dataToCoord(t,!0));if(h&&"none"!==h){var p=l.buildElStyle(n),f=c[h](i,m,d,p);f.style=p,e.graphicKey=f.type,e.pointer=f}var v=s.layout(u.model,r);l.buildCartesianSingleLabelElOption(t,e,v,r,n,o)},getHandleTransform:function(e,t,r){var a=s.layout(t.axis.grid.model,t,{labelInside:!1});return a.labelMargin=r.get("handle.margin"),{position:l.getTransformedPosition(t.axis,e,a),rotation:a.rotation+(a.labelDirection<0?Math.PI:0)}},updateHandleTransform:function(e,t,r,n){var o=r.axis,i=o.grid,l=o.getGlobalExtent(!0),s=a(i,o).getOtherAxis(o).getGlobalExtent(),u="x"===o.dim?0:1,h=e.position;h[u]+=t[u],h[u]=Math.min(l[1],h[u]),h[u]=Math.max(l[0],h[u]);var c=(s[1]+s[0])/2,d=[c,c];d[u]=h[u];var m=[{verticalAlign:"middle"},{align:"center"}];return{position:h,rotation:e.rotation,cursorPoint:d,tooltipOption:m[u]}}}),c={line:function(e,t,r,a){var i=l.makeLineShape([t,r[0]],[t,r[1]],n(e));return o.subPixelOptimizeLine({shape:i,style:a}),{type:"Line",shape:i}},shadow:function(e,t,r,a){var o=e.getBandWidth(),i=r[1]-r[0];return{type:"Rect",shape:l.makeRectShape([t-o/2,r[0]],[o,i],n(e))}}};u.registerAxisPointerClass("CartesianAxisPointer",h);var d=h;e.exports=d},function(e,t,r){"use strict";function a(e,t){var r,a=[],i=e.seriesIndex;if(null==i||!(r=t.getSeriesByIndex(i)))return{point:[]};var l=r.getData(),s=o.queryDataIndex(l,e);if(null==s||n.isArray(s))return{point:[]};var u=l.getItemGraphicEl(s),h=r.coordinateSystem;if(r.getTooltipPosition)a=r.getTooltipPosition(s)||[];else if(h&&h.dataToPoint)a=h.dataToPoint(l.getValues(n.map(h.dimensions,function(e){return r.coordDimToDataDim(e)[0]}),s,!0))||[];else if(u){var c=u.getBoundingRect().clone();c.applyTransform(u.transform),a=[c.x+c.width/2,c.y+c.height/2]}return{point:a,el:u}}var n=r(0),o=r(10);e.exports=a},function(e,t,r){"use strict";function a(e,t,r){if(!c.node){var a=t.getZr();m(a).records||(m(a).records={}),n(a,t),(m(a).records[e]||(m(a).records[e]={})).handler=r}}function n(e,t){function r(r,a){e.on(r,function(r){var n=s(t);p(m(e).records,function(e){e&&a(e,r,n.dispatchAction)}),o(n.pendings,t)})}m(e).initialized||(m(e).initialized=!0,r("click",h.curry(l,"click")),r("mousemove",h.curry(l,"mousemove")),r("globalout",i))}function o(e,t){var r,a=e.showTip.length,n=e.hideTip.length;a?r=e.showTip[a-1]:n&&(r=e.hideTip[n-1]),r&&(r.dispatchAction=null,t.dispatchAction(r))}function i(e,t,r){e.handler("leave",null,r)}function l(e,t,r,a){t.handler(e,r,a)}function s(e){var t={showTip:[],hideTip:[]};return{dispatchAction:function r(a){var n=t[a.type];n?n.push(a):(a.dispatchAction=r,e.dispatchAction(a))},pendings:t}}function u(e,t){if(!c.node){var r=t.getZr();(m(r).records||{})[e]&&(m(r).records[e]=null)}}var h=r(0),c=r(25),d=r(10),m=d.makeGetter(),p=h.each;t.register=a,t.unregister=u},function(e,t,r){"use strict";var a=r(2),n=r(0),o=r(240);a.registerAction("dataZoom",function(e,t){var r=o.createLinkedNodesFinder(n.bind(t.eachComponent,t,"dataZoom"),o.eachAxisDim,function(e,t){return e.get(t.axisIndex)}),a=[];t.eachComponent({mainType:"dataZoom",query:e},function(e,t){a.push.apply(a,r(e).nodes)}),n.each(a,function(t,r){t.setRawRange({start:e.start,end:e.end,startValue:e.startValue,endValue:e.endValue})})})},function(e,t,r){"use strict";function a(e,t,r){r.getAxisProxy(e.name,t).reset(r)}function n(e,t,r){r.getAxisProxy(e.name,t).filterData(r)}r(2).registerProcessor(function(e,t){e.eachComponent("dataZoom",function(e){e.eachTargetAxis(a),e.eachTargetAxis(n)}),e.eachComponent("dataZoom",function(e){var t=e.findRepresentativeAxisProxy(),r=t.getDataPercentWindow(),a=t.getDataValueWindow();e.setRawRange({start:r[0],end:r[1],startValue:a[0],endValue:a[1]},!0)})})},function(e,t,r){"use strict";function a(e,t){var r=l(e);u(t,function(t,a){for(var n=r.length-1;n>=0&&!r[n][a];n--);if(n<0){var o=e.queryComponents({mainType:"dataZoom",subType:"select",id:a})[0];if(o){var i=o.getPercentRange();r[0][a]={dataZoomId:a,start:i[0],end:i[1]}}}}),r.push(t)}function n(e){var t=l(e),r=t[t.length-1];t.length>1&&t.pop();var a={};return u(r,function(e,r){for(var n=t.length-1;n>=0;n--){var e=t[n][r];if(e){a[r]=e;break}}}),a}function o(e){e[h]=null}function i(e){return l(e).length}function l(e){var t=e[h];return t||(t=e[h]=[{}]),t}var s=r(0),u=s.each,h="\0_ec_hist_store";t.push=a,t.pop=n,t.clear=o,t.count=i},function(e,t,r){"use strict";r(24).registerSubTypeDefaulter("dataZoom",function(){return"slider"})},function(e,t,r){"use strict";function a(e,t,r){var a=this._targetInfoList=[],n={},i=o(t,e);f(x,function(e,t){(!r||!r.include||v(r.include,t)>=0)&&e(i,a,n)})}function n(e){return e[0]>e[1]&&e.reverse(),e}function o(e,t){return m.parseFinder(e,t,{includeMainTypes:_})}function i(e,t,r,a){var o=r.getAxis(["x","y"][e]),i=n(c.map([0,1],function(e){return t?o.coordToData(o.toLocalCoord(a[e])):o.toGlobalCoord(o.dataToCoord(a[e]))})),l=[];return l[e]=i,l[1-e]=[NaN,NaN],{values:i,xyMinMax:l}}function l(e,t,r,a){return[t[0]-a[e]*r[0],t[1]-a[e]*r[1]]}function s(e,t){var r=u(e),a=u(t),n=[r[0]/a[0],r[1]/a[1]];return isNaN(n[0])&&(n[0]=1),isNaN(n[1])&&(n[1]=1),n}function u(e){return e?[e[0][1]-e[0][0],e[1][1]-e[1][0]]:[NaN,NaN]}var h=r(9),c=(h.__DEV__,r(0)),d=r(3),m=r(10),p=r(352),f=c.each,v=c.indexOf,y=c.curry,g=["dataToPoint","pointToData"],_=["grid","xAxis","yAxis","geo","graph","polar","radiusAxis","angleAxis","bmap"],T=a.prototype;T.setOutputRanges=function(e,t){this.matchOutputRanges(e,t,function(e,t,r){if((e.coordRanges||(e.coordRanges=[])).push(t),!e.coordRange){e.coordRange=t;var a=b[e.brushType](0,r,t);e.__rangeOffset={offset:L[e.brushType](a.values,e.range,[1,1]),xyMinMax:a.xyMinMax}}})},T.matchOutputRanges=function(e,t,r){f(e,function(e){var a=this.findTargetInfo(e,t);a&&!0!==a&&c.each(a.coordSyses,function(a){var n=b[e.brushType](1,a,e.range);r(e,n.values,a,t)})},this)},T.setInputRanges=function(e,t){f(e,function(e){var r=this.findTargetInfo(e,t);if(e.range=e.range||[],r&&!0!==r){e.panelId=r.panelId;var a=b[e.brushType](0,r.coordSys,e.coordRange),n=e.__rangeOffset;e.range=n?L[e.brushType](a.values,n.offset,s(a.xyMinMax,n.xyMinMax)):a.values}},this)},T.makePanelOpts=function(e,t){return c.map(this._targetInfoList,function(r){var a=r.getPanelRect();return{panelId:r.panelId,defaultBrushType:t&&t(r),clipPath:p.makeRectPanelClipPath(a),isTargetByCursor:p.makeRectIsTargetByCursor(a,e,r.coordSysModel),getLinearBrushOtherExtent:p.makeLinearBrushOtherExtent(a)}})},T.controlSeries=function(e,t,r){var a=this.findTargetInfo(e,r);return!0===a||a&&v(a.coordSyses,t.coordinateSystem)>=0},T.findTargetInfo=function(e,t){for(var r=this._targetInfoList,a=o(t,e),n=0;n<r.length;n++){var i=r[n],l=e.panelId;if(l){if(i.panelId===l)return i}else for(var n=0;n<w.length;n++)if(w[n](a,i))return i}return!0};var x={grid:function(e,t){var r=e.xAxisModels,a=e.yAxisModels,n=e.gridModels,o=c.createHashMap(),i={},l={};(r||a||n)&&(f(r,function(e){var t=e.axis.grid.model;o.set(t.id,t),i[t.id]=!0}),f(a,function(e){var t=e.axis.grid.model;o.set(t.id,t),l[t.id]=!0}),f(n,function(e){o.set(e.id,e),i[e.id]=!0,l[e.id]=!0}),o.each(function(e){var n=e.coordinateSystem,o=[];f(n.getCartesians(),function(e,t){(v(r,e.getAxis("x").model)>=0||v(a,e.getAxis("y").model)>=0)&&o.push(e)}),t.push({panelId:"grid--"+e.id,gridModel:e,coordSysModel:e,coordSys:o[0],coordSyses:o,getPanelRect:N.grid,xAxisDeclared:i[e.id],yAxisDeclared:l[e.id]})}))},geo:function(e,t){f(e.geoModels,function(e){var r=e.coordinateSystem;t.push({panelId:"geo--"+e.id,geoModel:e,coordSysModel:e,coordSys:r,coordSyses:[r],getPanelRect:N.geo})})}},w=[function(e,t){var r=e.xAxisModel,a=e.yAxisModel,n=e.gridModel;return!n&&r&&(n=r.axis.grid.model),!n&&a&&(n=a.axis.grid.model),n&&n===t.gridModel},function(e,t){var r=e.geoModel;return r&&r===t.geoModel}],N={grid:function(){return this.coordSys.grid.getRect().clone()},geo:function(){var e=this.coordSys,t=e.getBoundingRect().clone();return t.applyTransform(d.getTransform(e)),t}},b={lineX:y(i,0),lineY:y(i,1),rect:function(e,t,r){var a=t[g[e]]([r[0][0],r[1][0]]),o=t[g[e]]([r[0][1],r[1][1]]),i=[n([a[0],o[0]]),n([a[1],o[1]])];return{values:i,xyMinMax:i}},polygon:function(e,t,r){var a=[[1/0,-1/0],[1/0,-1/0]];return{values:c.map(r,function(r){var n=t[g[e]](r);return a[0][0]=Math.min(a[0][0],n[0]),a[1][0]=Math.min(a[1][0],n[1]),a[0][1]=Math.max(a[0][1],n[0]),a[1][1]=Math.max(a[1][1],n[1]),n}),xyMinMax:a}}},L={lineX:y(l,0),lineY:y(l,1),rect:function(e,t,r){return[[e[0][0]-r[0]*t[0][0],e[0][1]-r[0]*t[0][1]],[e[1][0]-r[1]*t[1][0],e[1][1]-r[1]*t[1][1]]]},polygon:function(e,t,r){return c.map(e,function(e,a){return[e[0]-r[0]*t[a][0],e[1]-r[1]*t[a][1]]})}},S=a;e.exports=S},function(e,t,r){"use strict";function a(e,t){var r=e.getItemStyle(),a=e.get("areaColor");return null!=a&&(r.fill=a),r}function n(e,t,r,a,n){r.off("click"),r.off("mousedown"),t.get("selectedMode")&&(r.on("mousedown",function(){e._mouseDownFlag=!0}),r.on("click",function(i){if(e._mouseDownFlag){e._mouseDownFlag=!1;for(var s=i.target;!s.__regions;)s=s.parent;if(s){var u={type:("geo"===t.mainType?"geo":"map")+"ToggleSelect",batch:l.map(s.__regions,function(e){return{name:e.name,from:n.uid}})};u[t.mainType+"Id"]=t.id,a.dispatchAction(u),o(t,r)}}}))}function o(e,t){t.eachChild(function(t){l.each(t.__regions,function(r){t.trigger(e.isSelected(r.name)?"emphasis":"normal")})})}function i(e,t){var r=new d.Group;this._controller=new s(e.getZr()),this._controllerHost={target:t?r:null},this.group=r,this._updateGroup=t,this._mouseDownFlag}var l=r(0),s=r(166),u=r(355),h=r(242),c=h.onIrrelevantElement,d=r(3);i.prototype={constructor:i,draw:function(e,t,r,i,s){var u="geo"===e.mainType,h=e.getData&&e.getData();u&&t.eachComponent({mainType:"series",subType:"map"},function(t){h||t.getHostGeoModel()!==e||(h=t.getData())});var c=e.coordinateSystem,m=this.group,p=c.scale,f={position:c.position,scale:p};!m.childAt(0)||s?m.attr(f):d.updateProps(m,f,e),m.removeAll();var v=["itemStyle","normal"],y=["itemStyle","emphasis"],g=["label","normal"],_=["label","emphasis"],T=l.createHashMap();l.each(c.regions,function(t){var r=T.get(t.name)||T.set(t.name,new d.Group),n=new d.CompoundPath({shape:{paths:[]}});r.add(n);var o,i=e.getRegionModel(t.name)||e,s=i.getModel(v),c=i.getModel(y),f=a(s,p),x=a(c,p),w=i.getModel(g),N=i.getModel(_);if(h){o=h.indexOfName(t.name);var b=h.getItemVisual(o,"color",!0);b&&(f.fill=b)}l.each(t.geometries,function(e){if("polygon"===e.type){n.shape.paths.push(new d.Polygon({shape:{points:e.exterior}}));for(var t=0;t<(e.interiors?e.interiors.length:0);t++)n.shape.paths.push(new d.Polygon({shape:{points:e.interiors[t]}}))}}),n.setStyle(f),n.style.strokeNoScale=!0,n.culling=!0;var L=w.get("show"),S=N.get("show"),k=h&&isNaN(h.get("value",o)),D=h&&h.getItemLayout(o);if(u||k&&(L||S)||D&&D.showLabel){var M,A=u?t.name:o;(!h||o>=0)&&(M=e);var I=new d.Text({position:t.center.slice(),scale:[1/p[0],1/p[1]],z2:10,silent:!0});d.setLabelStyle(I.style,I.hoverStyle={},w,N,{labelFetcher:M,labelDataIndex:A,defaultText:t.name,useInsideStyle:!1},{textAlign:"center",textVerticalAlign:"middle"}),r.add(I)}if(h)h.setItemGraphicEl(o,r);else{var i=e.getRegionModel(t.name);n.eventData={componentType:"geo",geoIndex:e.componentIndex,name:t.name,region:i&&i.option||{}}}(r.__regions||(r.__regions=[])).push(t),d.setHoverStyle(r,x,{hoverSilentOnTouch:!!e.get("selectedMode")}),m.add(r)}),this._updateController(e,t,r),n(this,e,m,r,i),o(e,m)},remove:function(){this.group.removeAll(),this._controller.dispose(),this._controllerHost={}},_updateController:function(e,t,r){function a(){var t={type:"geoRoam",componentType:s};return t[s+"Id"]=e.id,t}var n=e.coordinateSystem,o=this._controller,i=this._controllerHost;i.zoomLimit=e.get("scaleLimit"),i.zoom=n.getZoom(),o.enable(e.get("roam")||!1);var s=e.mainType;o.off("pan").on("pan",function(e,t){this._mouseDownFlag=!1,u.updateViewOnPan(i,e,t),r.dispatchAction(l.extend(a(),{dx:e,dy:t}))},this),o.off("zoom").on("zoom",function(e,t,n){if(this._mouseDownFlag=!1,u.updateViewOnZoom(i,e,t,n),r.dispatchAction(l.extend(a(),{zoom:e,originX:t,originY:n})),this._updateGroup){var o=this.group,s=o.scale;o.traverse(function(e){"text"===e.type&&e.attr("scale",[1/s[0],1/s[1]])})}},this),o.setPointerChecker(function(t,a,o){return n.getViewRectAfterRoam().contain(a,o)&&!c(t,r,e)})}};var m=i;e.exports=m},function(e,t,r){"use strict";function a(e){return e=i(e),function(t,r){return h.clipPointsByRect(t,e)}}function n(e,t){return e=i(e),function(r){var a=null!=t?t:r,n=a?e.width:e.height,o=a?e.x:e.y;return[o,o+(n||0)]}}function o(e,t,r){return e=i(e),function(a,n,o){return e.contain(n[0],n[1])&&!u(a,t,r)}}function i(e){return l.create(e)}var l=r(19),s=r(242),u=s.onIrrelevantElement,h=r(3);t.makeRectPanelClipPath=a,t.makeLinearBrushOtherExtent=n,t.makeRectIsTargetByCursor=o},function(e,t,r){"use strict";function a(e,t,r){i(e)[t]=r}function n(e,t,r){var a=i(e);a[t]===r&&(a[t]=null)}function o(e,t){return!!i(e)[t]}function i(e){return e[s]||(e[s]={})}var l=r(2),s="\0_ec_interaction_mutex";l.registerAction({type:"takeGlobalCursor",event:"globalCursorTaken",update:"update"},function(){}),t.take=a,t.release=n,t.isTaken=o},function(e,t,r){"use strict";function a(e,t,r){var a=t.getBoxLayoutParams(),n=t.get("padding"),o={width:r.getWidth(),height:r.getHeight()},u=i(a,o,n);l(t.get("orient"),e,t.get("itemGap"),u.width,u.height),s(e,a,o,n)}function n(e,t){var r=u.normalizeCssArray(t.get("padding")),a=t.getItemStyle(["color","opacity"]);a.fill=t.get("backgroundColor");var e=new h.Rect({shape:{x:e.x-r[3],y:e.y-r[0],width:e.width+r[1]+r[3],height:e.height+r[0]+r[2],r:t.get("borderRadius")},style:a,silent:!0,z2:-1});return e}var o=r(11),i=o.getLayoutRect,l=o.box,s=o.positionElement,u=r(14),h=r(3);t.layout=a,t.makeBackground=n},function(e,t,r){"use strict";function a(e,t,r){var a=e.target,n=a.position;n[0]+=t,n[1]+=r,a.dirty()}function n(e,t,r,a){var n=e.target,o=e.zoomLimit,i=n.position,l=n.scale,s=e.zoom=e.zoom||1;if(s*=t,o){var u=o.min||0,h=o.max||1/0;s=Math.max(Math.min(h,s),u)}var c=s/e.zoom;e.zoom=s,i[0]-=(r-i[0])*(c-1),i[1]-=(a-i[1])*(c-1),l[0]*=c,l[1]*=c,n.dirty()}t.updateViewOnPan=a,t.updateViewOnZoom=n},function(e,t,r){"use strict";var a=r(2),n=r(0),o=r(20),i=a.extendComponentModel({type:"legend.plain",dependencies:["series"],layoutMode:{type:"box",ignoreSize:!0},init:function(e,t,r){this.mergeDefaultAndTheme(e,r),e.selected=e.selected||{}},mergeOption:function(e){i.superCall(this,"mergeOption",e)},optionUpdated:function(){this._updateData(this.ecModel);var e=this._data;if(e[0]&&"single"===this.get("selectedMode")){for(var t=!1,r=0;r<e.length;r++){var a=e[r].get("name");if(this.isSelected(a)){this.select(a),t=!0;break}}!t&&this.select(e[0].get("name"))}},_updateData:function(e){var t=n.map(this.get("data")||[],function(e){return"string"!=typeof e&&"number"!=typeof e||(e={name:e}),new o(e,this,this.ecModel)},this);this._data=t;var r=n.map(e.getSeries(),function(e){return e.name});e.eachSeries(function(e){if(e.legendDataProvider){var t=e.legendDataProvider();r=r.concat(t.mapArray(t.getName))}}),this._availableNames=r},getData:function(){return this._data},select:function(e){var t=this.option.selected;if("single"===this.get("selectedMode")){var r=this._data;n.each(r,function(e){t[e.get("name")]=!1})}t[e]=!0},unSelect:function(e){"single"!==this.get("selectedMode")&&(this.option.selected[e]=!1)},toggleSelected:function(e){var t=this.option.selected;t.hasOwnProperty(e)||(t[e]=!0),this[t[e]?"unSelect":"select"](e)},isSelected:function(e){var t=this.option.selected;return!(t.hasOwnProperty(e)&&!t[e])&&n.indexOf(this._availableNames,e)>=0},defaultOption:{zlevel:0,z:4,show:!0,orient:"horizontal",left:"center",top:0,align:"auto",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemGap:10,itemWidth:25,itemHeight:14,inactiveColor:"#ccc",textStyle:{color:"#333"},selectedMode:!0,tooltip:{show:!1}}}),l=i;e.exports=l},function(e,t,r){"use strict";function a(e,t){t.dispatchAction({type:"legendToggleSelect",name:e})}function n(e,t,r){var a=r.getZr().storage.getDisplayList()[0];a&&a.useHoverLayer||e.get("legendHoverLink")&&r.dispatchAction({type:"highlight",seriesName:e.name,name:t})}function o(e,t,r){var a=r.getZr().storage.getDisplayList()[0];a&&a.useHoverLayer||e.get("legendHoverLink")&&r.dispatchAction({type:"downplay",seriesName:e.name,name:t})}var i=r(9),l=(i.__DEV__,r(2)),s=r(0),u=r(38),h=u.createSymbol,c=r(3),d=r(354),m=d.makeBackground,p=r(11),f=s.curry,v=s.each,y=c.Group,g=l.extendComponentView({type:"legend.plain",newlineDisabled:!1,init:function(){this.group.add(this._contentGroup=new y),this._backgroundEl},getContentGroup:function(){return this._contentGroup},render:function(e,t,r){if(this.resetInner(),e.get("show",!0)){var a=e.get("align");a&&"auto"!==a||(a="right"===e.get("left")&&"vertical"===e.get("orient")?"right":"left"),this.renderInner(a,e,t,r);var n=e.getBoxLayoutParams(),o={width:r.getWidth(),height:r.getHeight()},i=e.get("padding"),l=p.getLayoutRect(n,o,i),u=this.layoutInner(e,a,l),h=p.getLayoutRect(s.defaults({width:u.width,height:u.height},n),o,i);this.group.attr("position",[h.x-u.x,h.y-u.y]),this.group.add(this._backgroundEl=m(u,e))}},resetInner:function(){this.getContentGroup().removeAll(),this._backgroundEl&&this.group.remove(this._backgroundEl)},renderInner:function(e,t,r,i){var l=this.getContentGroup(),u=s.createHashMap(),h=t.get("selectedMode");v(t.getData(),function(s,c){var d=s.get("name");if(!this.newlineDisabled&&(""===d||"\n"===d))return void l.add(new y({newline:!0}));var m=r.getSeriesByName(d)[0];if(!u.get(d))if(m){var p=m.getData(),v=p.getVisual("color");"function"==typeof v&&(v=v(m.getDataParams(0)));var g=p.getVisual("legendSymbol")||"roundRect",_=p.getVisual("symbol"),T=this._createItem(d,c,s,t,g,_,e,v,h);T.on("click",f(a,d,i)).on("mouseover",f(n,m,null,i)).on("mouseout",f(o,m,null,i)),u.set(d,!0)}else r.eachRawSeries(function(r){if(!u.get(d)&&r.legendDataProvider){var l=r.legendDataProvider(),m=l.indexOfName(d);if(m<0)return;var p=l.getItemVisual(m,"color");this._createItem(d,c,s,t,"roundRect",null,e,p,h).on("click",f(a,d,i)).on("mouseover",f(n,r,d,i)).on("mouseout",f(o,r,d,i)),u.set(d,!0)}},this)},this)},_createItem:function(e,t,r,a,n,o,i,l,u){var d=a.get("itemWidth"),m=a.get("itemHeight"),p=a.get("inactiveColor"),f=a.isSelected(e),v=new y,g=r.getModel("textStyle"),_=r.get("icon"),T=r.getModel("tooltip"),x=T.parentModel;if(n=_||n,v.add(h(n,0,0,d,m,f?l:p,!0)),!_&&o&&(o!==n||"none"==o)){var w=.8*m;"none"===o&&(o="circle"),v.add(h(o,(d-w)/2,(m-w)/2,w,w,f?l:p))}var N="left"===i?d+5:-5,b=i,L=a.get("formatter"),S=e;"string"==typeof L&&L?S=L.replace("{name}",null!=e?e:""):"function"==typeof L&&(S=L(e)),v.add(new c.Text({style:c.setTextStyle({},g,{text:S,x:N,y:m/2,textFill:f?g.getTextColor():p,textAlign:b,textVerticalAlign:"middle"})}));var k=new c.Rect({shape:v.getBoundingRect(),invisible:!0,tooltip:T.get("show")?s.extend({content:e,formatter:x.get("formatter",!0)||function(){return e},formatterParams:{componentType:"legend",legendIndex:a.componentIndex,name:e,$vars:["name"]}},T.option):null});return v.add(k),v.eachChild(function(e){e.silent=!0}),k.silent=!u,this.getContentGroup().add(v),c.setHoverStyle(v),v.__legendDataIndex=t,v},layoutInner:function(e,t,r){var a=this.getContentGroup();p.box(e.get("orient"),a,e.get("itemGap"),r.width,r.height);var n=a.getBoundingRect();return a.attr("position",[-n.x,-n.y]),this.group.getBoundingRect()}});e.exports=g},function(e,t,r){"use strict";function a(e,t){var r=e._model;return r.get("axisExpandable")&&r.get("axisExpandTriggerOn")===t}var n=r(2),o=r(0),i=r(92),l=r(943);r(372),r(942),r(889),n.extendComponentView({type:"parallel",render:function(e,t,r){this._model=e,this._api=r,this._handlers||(this._handlers={},o.each(s,function(e,t){r.getZr().on(t,this._handlers[t]=o.bind(e,this))},this)),i.createOrUpdate(this,"_throttledDispatchExpand",e.get("axisExpandRate"),"fixRate")},dispose:function(e,t){o.each(this._handlers,function(e,r){t.getZr().off(r,e)}),this._handlers=null},_throttledDispatchExpand:function(e){this._dispatchExpand(e)},_dispatchExpand:function(e){e&&this._api.dispatchAction(o.extend({type:"parallelAxisExpand"},e))}});var s={mousedown:function(e){a(this,"click")&&(this._mouseDownPoint=[e.offsetX,e.offsetY])},mouseup:function(e){var t=this._mouseDownPoint;if(a(this,"click")&&t){var r=[e.offsetX,e.offsetY];if(Math.pow(t[0]-r[0],2)+Math.pow(t[1]-r[1],2)>5)return;var n=this._model.coordinateSystem.getSlidedAxisExpandWindow([e.offsetX,e.offsetY]);"none"!==n.behavior&&this._dispatchExpand({axisExpandWindow:n.axisExpandWindow})}this._mouseDownPoint=null},mousemove:function(e){if(!this._mouseDownPoint&&a(this,"mousemove")){var t=this._model,r=t.coordinateSystem.getSlidedAxisExpandWindow([e.offsetX,e.offsetY]),n=r.behavior;"jump"===n&&this._throttledDispatchExpand.debounceNextCall(t.get("axisExpandDebounce")),this._throttledDispatchExpand("none"===n?null:{axisExpandWindow:r.axisExpandWindow,animation:"jump"===n&&null})}}};n.registerPreprocessor(l)},function(e,t,r){"use strict";var a=r(2);r(957),r(843),r(953),r(130),r(848),a.extendComponentView({type:"single"})},function(e,t,r){"use strict";var a=r(2),n=r(0),o=r(25),i=r(379),l=r(93),s=r(172),u=r(10),h=r(4),c=l.mapVisual,d=l.eachVisual,m=n.isArray,p=n.each,f=h.asc,v=h.linearMap,y=n.noop,g=["#f6efa6","#d88273","#bf444c"],_=a.extendComponentModel({type:"visualMap",dependencies:["series"],stateList:["inRange","outOfRange"],replacableOptionKeys:["inRange","outOfRange","target","controller","color"],dataBound:[-1/0,1/0],layoutMode:{type:"box",ignoreSize:!0},defaultOption:{show:!0,zlevel:0,z:4,seriesIndex:"all",min:0,max:200,dimension:null,inRange:null,outOfRange:null,left:0,right:null,top:null,bottom:0,itemWidth:null,itemHeight:null,inverse:!1,orient:"vertical",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",contentColor:"#5793f3",inactiveColor:"#aaa",borderWidth:0,padding:5,textGap:10,precision:0,color:null,formatter:null,text:null,textStyle:{color:"#333"}},init:function(e,t,r){this._dataExtent,this.targetVisuals={},this.controllerVisuals={},this.textStyleModel,this.itemSize,this.mergeDefaultAndTheme(e,r)},optionUpdated:function(e,t){var r=this.option;o.canvasSupported||(r.realtime=!1),!t&&s.replaceVisualOption(r,e,this.replacableOptionKeys),this.textStyleModel=this.getModel("textStyle"),this.resetItemSize(),this.completeVisualOption()},resetVisual:function(e){var t=this.stateList;e=n.bind(e,this),this.controllerVisuals=s.createVisualMappings(this.option.controller,t,e),this.targetVisuals=s.createVisualMappings(this.option.target,t,e)},getTargetSeriesIndices:function(){var e=this.option.seriesIndex,t=[];return null==e||"all"===e?this.ecModel.eachSeries(function(e,r){t.push(r)}):t=u.normalizeToArray(e),t},eachTargetSeries:function(e,t){n.each(this.getTargetSeriesIndices(),function(r){e.call(t,this.ecModel.getSeriesByIndex(r))},this)},isTargetSeries:function(e){var t=!1;return this.eachTargetSeries(function(r){r===e&&(t=!0)}),t},formatValueText:function(e,t,r){function a(e){return e===u[0]?"min":e===u[1]?"max":(+e).toFixed(Math.min(s,20))}var o,i,l=this.option,s=l.precision,u=this.dataBound,h=l.formatter;return r=r||["<",">"],n.isArray(e)&&(e=e.slice(),o=!0),i=t?e:o?[a(e[0]),a(e[1])]:a(e),n.isString(h)?h.replace("{value}",o?i[0]:i).replace("{value2}",o?i[1]:i):n.isFunction(h)?o?h(e[0],e[1]):h(e):o?e[0]===u[0]?r[0]+" "+i[1]:e[1]===u[1]?r[1]+" "+i[0]:i[0]+" - "+i[1]:i},resetExtent:function(){var e=this.option,t=f([e.min,e.max]);this._dataExtent=t},getDataDimension:function(e){var t=this.option.dimension;return null!=t?t:e.dimensions.length-1},getExtent:function(){return this._dataExtent.slice()},completeVisualOption:function(){function e(e){m(a.color)&&!e.inRange&&(e.inRange={color:a.color.slice().reverse()}),e.inRange=e.inRange||{color:g},p(this.stateList,function(t){var r=e[t];if(n.isString(r)){var a=i.get(r,"active",h);a?(e[t]={},e[t][r]=a):delete e[t]}},this)}function t(e,t,r){var a=e[t],n=e[r];a&&!n&&(n=e[r]={},p(a,function(e,t){if(l.isValidType(t)){var r=i.get(t,"inactive",h);null!=r&&(n[t]=r,"color"!==t||n.hasOwnProperty("opacity")||n.hasOwnProperty("colorAlpha")||(n.opacity=[0,0]))}}))}function r(e){var t=(e.inRange||{}).symbol||(e.outOfRange||{}).symbol,r=(e.inRange||{}).symbolSize||(e.outOfRange||{}).symbolSize,a=this.get("inactiveColor");p(this.stateList,function(o){var i=this.itemSize,l=e[o];l||(l=e[o]={color:h?a:[a]}),null==l.symbol&&(l.symbol=t&&n.clone(t)||(h?"roundRect":["roundRect"])),null==l.symbolSize&&(l.symbolSize=r&&n.clone(r)||(h?i[0]:[i[0],i[0]])),l.symbol=c(l.symbol,function(e){return"none"===e||"square"===e?"roundRect":e});var s=l.symbolSize;if(null!=s){var u=-1/0;d(s,function(e){e>u&&(u=e)}),l.symbolSize=c(s,function(e){return v(e,[0,u],[0,i[0]],!0)})}},this)}var a=this.option,o={inRange:a.inRange,outOfRange:a.outOfRange},s=a.target||(a.target={}),u=a.controller||(a.controller={});n.merge(s,o),n.merge(u,o);var h=this.isCategory();e.call(this,s),e.call(this,u),t.call(this,s,"inRange","outOfRange"),r.call(this,u)},resetItemSize:function(){this.itemSize=[parseFloat(this.get("itemWidth")),parseFloat(this.get("itemHeight"))]},isCategory:function(){return!!this.option.categories},setSelected:y,getValueState:y,getVisualMeta:y}),T=_;e.exports=T},function(e,t,r){"use strict";var a=r(2),n=r(0),o=r(3),i=r(14),l=r(11),s=r(93),u=a.extendComponentView({type:"visualMap",autoPositionValues:{left:1,right:1,top:1,bottom:1},init:function(e,t){this.ecModel=e,this.api=t,this.visualMapModel},render:function(e,t,r,a){if(this.visualMapModel=e,!1===e.get("show"))return void this.group.removeAll();this.doRender.apply(this,arguments)},renderBackground:function(e){var t=this.visualMapModel,r=i.normalizeCssArray(t.get("padding")||0),a=e.getBoundingRect();e.add(new o.Rect({z2:-1,silent:!0,shape:{x:a.x-r[3],y:a.y-r[0],width:a.width+r[3]+r[1],height:a.height+r[0]+r[2]},style:{fill:t.get("backgroundColor"),stroke:t.get("borderColor"),lineWidth:t.get("borderWidth")}}))},getControllerVisual:function(e,t,r){function a(e){return u[e]}function o(e,t){u[e]=t}r=r||{};var i=r.forceState,l=this.visualMapModel,u={};if("symbol"===t&&(u.symbol=l.get("itemSymbol")),"color"===t){var h=l.get("contentColor");u.color=h}var c=l.controllerVisuals[i||l.getValueState(e)],d=s.prepareVisualTypes(c);return n.each(d,function(n){var i=c[n];r.convertOpacityToAlpha&&"opacity"===n&&(n="colorAlpha",i=c.__alphaForOpacity),s.dependsOn(n,t)&&i&&i.applyVisual(e,a,o)}),u[t]},positionGroup:function(e){var t=this.visualMapModel,r=this.api;l.positionElement(e,t.getBoxLayoutParams(),{width:r.getWidth(),height:r.getHeight()})},doRender:n.noop});e.exports=u},function(e,t,r){"use strict";function a(e,t,r){var a=e.option,n=a.align;if(null!=n&&"auto"!==n)return n;for(var o={width:t.getWidth(),height:t.getHeight()},i="horizontal"===a.orient?1:0,s=[["left","right","width"],["top","bottom","height"]],u=s[i],h=[0,null,10],c={},d=0;d<3;d++)c[s[1-i][d]]=h[d],c[u[d]]=2===d?r[0]:a[u[d]];var m=[["x","width",3],["y","height",0]][i],p=l(c,o,a.padding);return u[(p.margin[m[2]]||0)+p[m[0]]+.5*p[m[1]]<.5*o[m[1]]?0:1]}function n(e){return o.each(e||[],function(t){null!=e.dataIndex&&(e.dataIndexInside=e.dataIndex,e.dataIndex=null)}),e}var o=r(0),i=r(11),l=i.getLayoutRect;t.getItemAlign=a,t.convertDataIndex=n},function(e,t,r){"use strict";function a(e){var t=e&&e.visualMap;o.isArray(t)||(t=t?[t]:[]),i(t,function(e){if(e){n(e,"splitList")&&!n(e,"pieces")&&(e.pieces=e.splitList,delete e.splitList);var t=e.pieces;t&&o.isArray(t)&&i(t,function(e){o.isObject(e)&&(n(e,"start")&&!n(e,"min")&&(e.min=e.start),n(e,"end")&&!n(e,"max")&&(e.max=e.end))})}})}function n(e,t){return e&&e.hasOwnProperty&&e.hasOwnProperty(t)}var o=r(0),i=o.each;e.exports=a},function(e,t,r){"use strict";r(24).registerSubTypeDefaulter("visualMap",function(e){return e.categories||(e.pieces?e.pieces.length>0:e.splitNumber>0)&&!e.calculable?"piecewise":"continuous"})},function(e,t,r){"use strict";function a(e,t){e.eachTargetSeries(function(t){var r=t.getData();s.applyVisual(e.stateList,e.targetVisuals,r,e.getValueState,e,e.getDataDimension(r))})}function n(e){e.eachSeries(function(t){var r=t.getData(),a=[];e.eachComponent("visualMap",function(e){if(e.isTargetSeries(t)){var n=e.getVisualMeta(l.bind(o,null,t,e))||{stops:[],outerColors:[]};n.dimension=e.getDataDimension(r),a.push(n)}}),t.getData().setVisual("visualMeta",a)})}function o(e,t,r,a){function n(e){return s[e]}function o(e,t){s[e]=t}for(var i=t.targetVisuals[a],l=u.prepareVisualTypes(i),s={color:e.getData().getVisual("color")},h=0,c=l.length;h<c;h++){var d=l[h],m=i["opacity"===d?"__alphaForOpacity":d];m&&m.applyVisual(r,n,o)}return s.color}var i=r(2),l=r(0),s=r(172),u=r(93);i.registerVisual(i.PRIORITY.VISUAL.COMPONENT,function(e){e.eachComponent("visualMap",function(t){a(t,e)}),n(e)})},function(e,t,r){"use strict";var a=r(2),n={type:"selectDataRange",event:"dataRangeSelected",update:"update"};a.registerAction(n,function(e,t){t.eachComponent({mainType:"visualMap",query:e},function(t){t.setSelected(e.selected)})})},function(e,t,r){"use strict";function a(){h.call(this)}function n(e){this.name=e,this.zoomLimit,h.call(this),this._roamTransform=new a,this._viewTransform=new a,this._center,this._zoom}function o(e,t,r,a){var n=r.seriesModel,o=n?n.coordinateSystem:null;return o===this?o[e](a):null}var i=r(0),l=r(12),s=r(40),u=r(19),h=r(277),c=l.applyTransform;i.mixin(a,h),n.prototype={constructor:n,type:"view",dimensions:["x","y"],setBoundingRect:function(e,t,r,a){return this._rect=new u(e,t,r,a),this._rect},getBoundingRect:function(){return this._rect},setViewRect:function(e,t,r,a){this.transformTo(e,t,r,a),this._viewRect=new u(e,t,r,a)},transformTo:function(e,t,r,a){var n=this.getBoundingRect(),o=this._viewTransform;o.transform=n.calculateTransform(new u(e,t,r,a)),o.decomposeTransform(),this._updateTransform()},setCenter:function(e){e&&(this._center=e,this._updateCenterAndZoom())},setZoom:function(e){e=e||1;var t=this.zoomLimit;t&&(null!=t.max&&(e=Math.min(t.max,e)),null!=t.min&&(e=Math.max(t.min,e))),this._zoom=e,this._updateCenterAndZoom()},getDefaultCenter:function(){var e=this.getBoundingRect();return[e.x+e.width/2,e.y+e.height/2]},getCenter:function(){return this._center||this.getDefaultCenter()},getZoom:function(){return this._zoom||1},getRoamTransform:function(){return this._roamTransform},_updateCenterAndZoom:function(){var e=this._viewTransform.getLocalTransform(),t=this._roamTransform,r=this.getDefaultCenter(),a=this.getCenter(),n=this.getZoom();a=l.applyTransform([],a,e),r=l.applyTransform([],r,e),t.origin=a,t.position=[r[0]-a[0],r[1]-a[1]],t.scale=[n,n],this._updateTransform()},_updateTransform:function(){var e=this._roamTransform,t=this._viewTransform;t.parent=e,e.updateTransform(),t.updateTransform(),t.transform&&s.copy(this.transform||(this.transform=[]),t.transform),this.transform?(this.invTransform=this.invTransform||[],s.invert(this.invTransform,this.transform)):this.invTransform=null,this.decomposeTransform()},getViewRect:function(){return this._viewRect},getViewRectAfterRoam:function(){var e=this.getBoundingRect().clone();return e.applyTransform(this.transform),e},dataToPoint:function(e){var t=this.transform;return t?c([],e,t):[e[0],e[1]]},pointToData:function(e){var t=this.invTransform;return t?c([],e,t):[e[0],e[1]]},convertToPixel:i.curry(o,"dataToPoint"),convertFromPixel:i.curry(o,"pointToData"),containPoint:function(e){return this.getViewRectAfterRoam().contain(e[0],e[1])}},i.mixin(n,h);var d=n;e.exports=d},function(e,t,r){"use strict";var a=r(0),n={show:!0,zlevel:0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,onZeroAxisIndex:null,lineStyle:{color:"#333",width:1,type:"solid"},symbol:["none","none"],symbolSize:[10,15]},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,fontSize:12},splitLine:{show:!0,lineStyle:{color:["#ccc"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.3)","rgba(200,200,200,0.3)"]}}},o={};o.categoryAxis=a.merge({boundaryGap:!0,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},n),o.valueAxis=a.merge({boundaryGap:[0,0],splitNumber:5},n),o.timeAxis=a.defaults({scale:!0,min:"dataMin",max:"dataMax"},o.valueAxis),o.logAxis=a.defaults({scale:!0,logBase:10},o.valueAxis);var i=o;e.exports=i},function(e,t,r){"use strict";function a(e,t){return t.type||(t.data?"category":"value")}var n=r(0),o=r(24),i=r(167),l=r(111),s=o.extend({type:"cartesian2dAxis",axis:null,init:function(){s.superApply(this,"init",arguments),this.resetRange()},mergeOption:function(){s.superApply(this,"mergeOption",arguments),this.resetRange()},restoreData:function(){s.superApply(this,"restoreData",arguments),this.resetRange()},getCoordSysModel:function(){return this.ecModel.queryComponents({mainType:"grid",index:this.option.gridIndex,id:this.option.gridId})[0]}});n.merge(s.prototype,l);var u={offset:0};i("x",s,a,u),i("y",s,a,u);var h=s;e.exports=h},function(e,t,r){"use strict";function a(e,t,r){if(this.name=e,this.geometries=t,r)r=[r[0],r[1]];else{var a=this.getBoundingRect();r=[a.x+a.width/2,a.y+a.height/2]}this.center=r}var n=r(19),o=r(274),i=r(12),l=r(438);a.prototype={constructor:a,properties:null,getBoundingRect:function(){var e=this._rect;if(e)return e;for(var t=Number.MAX_VALUE,r=[t,t],a=[-t,-t],l=[],s=[],u=this.geometries,h=0;h<u.length;h++)if("polygon"===u[h].type){var c=u[h].exterior;o.fromPoints(c,l,s),i.min(r,r,l),i.max(a,a,s)}return 0===h&&(r[0]=r[1]=a[0]=a[1]=0),this._rect=new n(r[0],r[1],a[0]-r[0],a[1]-r[1])},contain:function(e){var t=this.getBoundingRect(),r=this.geometries;if(!t.contain(e[0],e[1]))return!1;e:for(var a=0,n=r.length;a<n;a++)if("polygon"===r[a].type){var o=r[a].exterior,i=r[a].interiors;if(l.contain(o,e[0],e[1])){for(var s=0;s<(i?i.length:0);s++)if(l.contain(i[s]))continue e;return!0}}return!1},transformTo:function(e,t,r,a){var o=this.getBoundingRect(),l=o.width/o.height;r?a||(a=r/l):r=l*a;for(var s=new n(e,t,r,a),u=o.calculateTransform(s),h=this.geometries,c=0;c<h.length;c++)if("polygon"===h[c].type){for(var d=h[c].exterior,m=h[c].interiors,p=0;p<d.length;p++)i.applyTransform(d[p],d[p],u);for(var f=0;f<(m?m.length:0);f++)for(var p=0;p<m[f].length;p++)i.applyTransform(m[f][p],m[f][p],u)}o=this._rect,o.copy(s),this.center=[o.x+o.width/2,o.y+o.height/2]}};var s=a;e.exports=s},function(e,t,r){"use strict";function a(e){if(!e.UTF8Encoding)return e;var t=e.UTF8Scale;null==t&&(t=1024);for(var r=e.features,a=0;a<r.length;a++)for(var o=r[a],i=o.geometry,l=i.coordinates,s=i.encodeOffsets,u=0;u<l.length;u++){var h=l[u];if("Polygon"===i.type)l[u]=n(h,s[u],t);else if("MultiPolygon"===i.type)for(var c=0;c<h.length;c++){var d=h[c];h[c]=n(d,s[u][c],t)}}return e.UTF8Encoding=!1,e}function n(e,t,r){for(var a=[],n=t[0],o=t[1],i=0;i<e.length;i+=2){var l=e.charCodeAt(i)-64,s=e.charCodeAt(i+1)-64;l=l>>1^-(1&l),s=s>>1^-(1&s),l+=n,s+=o,n=l,o=s,a.push([l/r,s/r])}return a}function o(e){return a(e),i.map(i.filter(e.features,function(e){return e.geometry&&e.properties&&e.geometry.coordinates.length>0}),function(e){var t=e.properties,r=e.geometry,a=r.coordinates,n=[];"Polygon"===r.type&&n.push({type:"polygon",exterior:a[0],interiors:a.slice(1)}),"MultiPolygon"===r.type&&i.each(a,function(e){e[0]&&n.push({type:"polygon",exterior:e[0],interiors:e.slice(1)})});var o=new l(t.name,n,t.cp);return o.properties=t,o})}var i=r(0),l=r(370);e.exports=o},function(e,t,r){"use strict";function a(e,t){var r=[];return e.eachComponent("parallel",function(a,o){var i=new n(a,e,t);i.name="parallel_"+o,i.resize(a,t),a.coordinateSystem=i,i.model=a,r.push(i)}),e.eachSeries(function(t){if("parallel"===t.get("coordinateSystem")){var r=e.queryComponents({mainType:"parallel",index:t.get("parallelIndex"),id:t.get("parallelId")})[0];t.coordinateSystem=r.coordinateSystem}}),r}var n=r(940);r(53).register("parallel",{create:a})},function(e,t,r){"use strict";function a(e,t,r){this.root,this.data,this._nodes=[],this.hostModel=e,this.levelModels=o.map(t||[],function(t){return new i(t,e,e.ecModel)}),this.leavesModel=new i(r||{},e,e.ecModel)}function n(e,t){var r=t.children;e.parentNode!==t&&(r.push(e),e.parentNode=t)}var o=r(0),i=r(20),l=r(23),s=r(374),u=r(45),h=function(e,t){this.name=e||"",this.depth=0,this.height=0,this.parentNode=null,this.dataIndex=-1,this.children=[],this.viewChildren=[],this.hostTree=t};h.prototype={constructor:h,isRemoved:function(){return this.dataIndex<0},eachNode:function(e,t,r){"function"==typeof e&&(r=t,t=e,e=null),e=e||{},o.isString(e)&&(e={order:e});var a,n=e.order||"preorder",i=this[e.attr||"children"];"preorder"===n&&(a=t.call(r,this));for(var l=0;!a&&l<i.length;l++)i[l].eachNode(e,t,r);"postorder"===n&&t.call(r,this)},updateDepthAndHeight:function(e){var t=0;this.depth=e;for(var r=0;r<this.children.length;r++){var a=this.children[r];a.updateDepthAndHeight(e+1),a.height>t&&(t=a.height)}this.height=t+1},getNodeById:function(e){if(this.getId()===e)return this;for(var t=0,r=this.children,a=r.length;t<a;t++){var n=r[t].getNodeById(e);if(n)return n}},contains:function(e){if(e===this)return!0;for(var t=0,r=this.children,a=r.length;t<a;t++){var n=r[t].contains(e);if(n)return n}},getAncestors:function(e){for(var t=[],r=e?this:this.parentNode;r;)t.push(r),r=r.parentNode;return t.reverse(),t},getValue:function(e){var t=this.hostTree.data;return t.get(t.getDimension(e||"value"),this.dataIndex)},setLayout:function(e,t){this.dataIndex>=0&&this.hostTree.data.setItemLayout(this.dataIndex,e,t)},getLayout:function(){return this.hostTree.data.getItemLayout(this.dataIndex)},getModel:function(e){if(!(this.dataIndex<0)){var t,r=this.hostTree,a=r.data.getItemModel(this.dataIndex),n=this.getLevelModel();return n||0!==this.children.length&&(0===this.children.length||!1!==this.isExpand)||(t=this.getLeavesModel()),a.getModel(e,(n||t||r.hostModel).getModel(e))}},getLevelModel:function(){return(this.hostTree.levelModels||[])[this.depth]},getLeavesModel:function(){return this.hostTree.leavesModel},setVisual:function(e,t){this.dataIndex>=0&&this.hostTree.data.setItemVisual(this.dataIndex,e,t)},getVisual:function(e,t){return this.hostTree.data.getItemVisual(this.dataIndex,e,t)},getRawIndex:function(){return this.hostTree.data.getRawIndex(this.dataIndex)},getId:function(){return this.hostTree.data.getId(this.dataIndex)}},a.prototype={constructor:a,type:"tree",eachNode:function(e,t,r){this.root.eachNode(e,t,r)},getNodeByDataIndex:function(e){var t=this.data.getRawIndex(e);return this._nodes[t]},getNodeByName:function(e){return this.root.getNodeByName(e)},update:function(){for(var e=this.data,t=this._nodes,r=0,a=t.length;r<a;r++)t[r].dataIndex=-1;for(var r=0,a=e.count();r<a;r++)t[e.getRawIndex(r)].dataIndex=r},clearLayouts:function(){this.data.clearItemLayouts()}},a.createTree=function(e,t,r){function i(e,t){var r=e.value;m=Math.max(m,o.isArray(r)?r.length:1),d.push(e);var a=new h(e.name,c);t?n(a,t):c.root=a,c._nodes.push(a);var l=e.children;if(l)for(var s=0;s<l.length;s++)i(l[s],a)}var c=new a(t,r.levels,r.leaves),d=[],m=1;i(e),c.root.updateDepthAndHeight(0);var p=u([{name:"value"}],d,{dimCount:m}),f=new l(p,t);return f.initData(d),s({mainData:f,struct:c,structAttr:"tree"}),c.update(),c};var c=a;e.exports=c},function(e,t,r){"use strict";function a(e){var t=e.mainData,r=e.datas;r||(r={main:t},e.datasAttr={main:"data"}),e.datas=e.mainData=null,u(t,r,e),d(r,function(r){d(t.TRANSFERABLE_METHODS,function(t){r.wrapMethod(t,c.curry(n,e))})}),t.wrapMethod("cloneShallow",c.curry(i,e)),d(t.CHANGABLE_METHODS,function(r){t.wrapMethod(r,c.curry(o,e))}),c.assert(r[t.dataType]===t)}function n(e,t){if(s(this)){var r=c.extend({},this[m]);r[this.dataType]=t,u(t,r,e)}else h(t,this.dataType,this[p],e);return t}function o(e,t){return e.struct&&e.struct.update(this),t}function i(e,t){return d(t[m],function(r,a){r!==t&&h(r.cloneShallow(),a,t,e)}),t}function l(e){var t=this[p];return null==e||null==t?t:t[m][e]}function s(e){return e[p]===e}function u(e,t,r){e[m]={},d(t,function(t,a){h(t,a,e,r)})}function h(e,t,r,a){r[m][t]=e,e[p]=r,e.dataType=t,a.struct&&(e[a.structAttr]=a.struct,a.struct[a.datasAttr[t]]=e),e.getLinkedData=l}var c=r(0),d=c.each,m="\0__link_datas",p="\0__link_mainData",f=a;e.exports=f},function(e,t,r){"use strict";var a=r(194);t.zrender=a;var n=r(40);t.matrix=n;var o=r(12);t.vector=o;var i=r(0),l=r(63);t.color=l;var s=r(3);t.graphic=s;var u=r(4);t.number=u;var h=r(14);t.format=h;var c=r(92);c.throttle,t.throttle=c.throttle;var d=r(959);t.helper=d;var m=r(23);t.List=m;var p=r(20);t.Model=p;var f=r(71);t.Axis=f;var v=r(25);t.env=v;var y=r(371);t.parseGeoJson=y;var g={};i.each(["map","each","filter","indexOf","inherits","reduce","filter","bind","curry","isArray","isString","isObject","isFunction","extend","defaults","clone","merge"],function(e){g[e]=i[e]}),t.util=g},function(e,t,r){"use strict";var a=r(58),n=a.set,o=a.get,i={clearColorPalette:function(){n(this,"colorIdx",0),n(this,"colorNameMap",{})},getColorFromPalette:function(e,t){t=t||this;var r=o(t,"colorIdx")||0,a=o(t,"colorNameMap")||n(t,"colorNameMap",{});if(a.hasOwnProperty(e))return a[e];var i=this.get("color",!0)||[];if(i.length){var l=i[r];return e&&(a[e]=l),n(t,"colorIdx",(r+1)%i.length),l}}};e.exports=i},function(e,t,r){"use strict";function a(e,t,r,a){var o={},l=e[1]-e[0],h=o.interval=s.nice(l/t,!0);null!=r&&h<r&&(h=o.interval=r),null!=a&&h>a&&(h=o.interval=a);var c=o.intervalPrecision=n(h);return i(o.niceTickExtent=[u(Math.ceil(e[0]/h)*h,c),u(Math.floor(e[1]/h)*h,c)],e),o}function n(e){return s.getPrecisionSafe(e)+2}function o(e,t,r){e[t]=Math.max(Math.min(e[t],r[1]),r[0])}function i(e,t){!isFinite(e[0])&&(e[0]=t[0]),!isFinite(e[1])&&(e[1]=t[1]),o(e,0,t),o(e,1,t),e[0]>e[1]&&(e[0]=e[1])}function l(e,t,r,a){var n=[];if(!e)return n;t[0]<r[0]&&n.push(t[0]);for(var o=r[0];o<=r[1]&&(n.push(o),(o=u(o+e,a))!==n[n.length-1]);)if(n.length>1e4)return[];return t[1]>(n.length?n[n.length-1]:r[1])&&n.push(t[1]),n}var s=r(4),u=s.round;t.intervalScaleNiceTicks=a,t.getIntervalPrecision=n,t.fixExtent=i,t.intervalScaleGetTicks=l},function(e,t,r){"use strict";function a(){function e(t,a){if(a>=r.length)return t;for(var o=-1,i=t.length,l=r[a++],s={},u={};++o<i;){var h=l(t[o]),c=u[h];c?c.push(t[o]):u[h]=[t[o]]}return n.each(u,function(t,r){s[r]=e(t,a)}),s}function t(e,o){if(o>=r.length)return e;var i=[],l=a[o++];return n.each(e,function(e,r){i.push({key:r,values:t(e,o)})}),l?i.sort(function(e,t){return l(e.key,t.key)}):i}var r=[],a=[];return{key:function(e){return r.push(e),this},sortKeys:function(e){return a[r.length-1]=e,this},entries:function(r){return t(e(r,0),0)}}}var n=r(0);e.exports=a},function(e,t,r){"use strict";var a=r(0),n={get:function(e,t,r){var n=a.clone((o[e]||{})[t]);return r&&a.isArray(n)?n[n.length-1]:n}},o={color:{active:["#006edd","#e0ffff"],inactive:["rgba(0,0,0,0)"]},colorHue:{active:[0,360],inactive:[0,0]},colorSaturation:{active:[.3,1],inactive:[0,0]},colorLightness:{active:[.9,.5],inactive:[0,0]},colorAlpha:{active:[.3,1],inactive:[0,0]},opacity:{active:[.3,1],inactive:[0,0]},symbol:{active:["circle","roundRect","diamond"],inactive:["none"]},symbolSize:{active:[10,50],inactive:[0,0]}},i=n;e.exports=i},function(e,t,r){"use strict";t.__esModule=!0,t.readState=t.saveState=void 0;var a=r(95),n=(function(e){e&&e.__esModule}(a),{QuotaExceededError:!0,QUOTA_EXCEEDED_ERR:!0}),o={SecurityError:!0},i=function(e){return"@@History/"+e};t.saveState=function(e,t){if(window.sessionStorage)try{null==t?window.sessionStorage.removeItem(i(e)):window.sessionStorage.setItem(i(e),JSON.stringify(t))}catch(e){if(o[e.name])return;if(n[e.name]&&0===window.sessionStorage.length)return;throw e}},t.readState=function(e){var t=void 0;try{t=window.sessionStorage.getItem(i(e))}catch(e){if(o[e.name])return}if(t)try{return JSON.parse(t)}catch(e){}}},function(e,t,r){"use strict";t.__esModule=!0;var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},n=r(257),o=function(e){return e&&e.__esModule?e:{default:e}}(n),i=r(73),l=function(e){return function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=e(t),n=t.basename,l=function(e){return e?(n&&null==e.basename&&(0===e.pathname.toLowerCase().indexOf(n.toLowerCase())?(e.pathname=e.pathname.substring(n.length),e.basename=n,""===e.pathname&&(e.pathname="/")):e.basename=""),e):e},s=function(e){if(!n)return e;var t="string"==typeof e?(0,i.parsePath)(e):e,r=t.pathname,o="/"===n.slice(-1)?n:n+"/",l="/"===r.charAt(0)?r.slice(1):r;return a({},t,{pathname:o+l})};return a({},r,{getCurrentLocation:function(){return l(r.getCurrentLocation())},listenBefore:function(e){return r.listenBefore(function(t,r){return(0,o.default)(e,l(t),r)})},listen:function(e){return r.listen(function(t){return e(l(t))})},push:function(e){return r.push(s(e))},replace:function(e){return r.replace(s(e))},createPath:function(e){return r.createPath(s(e))},createHref:function(e){return r.createHref(s(e))},createLocation:function(e){for(var t=arguments.length,a=Array(t>1?t-1:0),n=1;n<t;n++)a[n-1]=arguments[n];return l(r.createLocation.apply(r,[s(e)].concat(a)))}})}};t.default=l},function(e,t,r){"use strict";t.__esModule=!0;var a=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},n=r(1117),o=r(257),i=function(e){return e&&e.__esModule?e:{default:e}}(o),l=r(115),s=r(73),u=function(e){return(0,n.stringify)(e).replace(/%20/g,"+")},h=n.parse,c=function(e){return function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=e(t),n=t.stringifyQuery,o=t.parseQueryString;"function"!=typeof n&&(n=u),"function"!=typeof o&&(o=h);var c=function(e){return e?(null==e.query&&(e.query=o(e.search.substring(1))),e):e},d=function(e,t){if(null==t)return e;var r="string"==typeof e?(0,s.parsePath)(e):e,o=n(t);return a({},r,{search:o?"?"+o:""})};return a({},r,{getCurrentLocation:function(){return c(r.getCurrentLocation())},listenBefore:function(e){return r.listenBefore(function(t,r){return(0,i.default)(e,c(t),r)})},listen:function(e){return r.listen(function(t){return e(c(t))})},push:function(e){return r.push(d(e,e.query))},replace:function(e){return r.replace(d(e,e.query))},createPath:function(e){return r.createPath(d(e,e.query))},createHref:function(e){return r.createHref(d(e,e.query))},createLocation:function(e){for(var t=arguments.length,a=Array(t>1?t-1:0),n=1;n<t;n++)a[n-1]=arguments[n];var o=r.createLocation.apply(r,[d(e,e.query)].concat(a));return e.query&&(o.query=(0,l.createQuery)(e.query)),c(o)}})}};t.default=c},function(e,t,r){"use strict";function a(e,t){t=t||{},i.isArray(e)&&(e=e.concat()),i.defineProperty(this,"_locale",{value:this._resolveLocale(e)}),i.defineProperty(this,"_options",{value:{style:this._resolveStyle(t.style),units:this._isValidUnits(t.units)&&t.units}}),i.defineProperty(this,"_locales",{value:e}),i.defineProperty(this,"_fields",{value:this._findFields(this._locale)}),i.defineProperty(this,"_messages",{value:i.objCreate(null)});var r=this;this.format=function(e,t){return r._format(e,t)}}var n=r(998),o=r(991),i=r(993);t.default=a;var l=["second","second-short","minute","minute-short","hour","hour-short","day","day-short","month","month-short","year","year-short"],s=["best fit","numeric"];i.defineProperty(a,"__localeData__",{value:i.objCreate(null)}),i.defineProperty(a,"__addLocaleData",{value:function(e){if(!e||!e.locale)throw new Error("Locale data provided to IntlRelativeFormat is missing a `locale` property value");a.__localeData__[e.locale.toLowerCase()]=e,n.default.__addLocaleData(e)}}),i.defineProperty(a,"defaultLocale",{enumerable:!0,writable:!0,value:void 0}),i.defineProperty(a,"thresholds",{enumerable:!0,value:{second:45,"second-short":45,minute:45,"minute-short":45,hour:22,"hour-short":22,day:26,"day-short":26,month:11,"month-short":11}}),a.prototype.resolvedOptions=function(){return{locale:this._locale,style:this._options.style,units:this._options.units}},a.prototype._compileMessage=function(e){var t,r=this._locales,a=(this._locale,this._fields[e]),o=a.relativeTime,i="",l="";for(t in o.future)o.future.hasOwnProperty(t)&&(i+=" "+t+" {"+o.future[t].replace("{0}","#")+"}");for(t in o.past)o.past.hasOwnProperty(t)&&(l+=" "+t+" {"+o.past[t].replace("{0}","#")+"}");var s="{when, select, future {{0, plural, "+i+"}}past {{0, plural, "+l+"}}}";return new n.default(s,r)},a.prototype._getMessage=function(e){var t=this._messages;return t[e]||(t[e]=this._compileMessage(e)),t[e]},a.prototype._getRelativeUnits=function(e,t){var r=this._fields[t];if(r.relative)return r.relative[e]},a.prototype._findFields=function(e){for(var t=a.__localeData__,r=t[e.toLowerCase()];r;){if(r.fields)return r.fields;r=r.parentLocale&&t[r.parentLocale.toLowerCase()]}throw new Error("Locale data added to IntlRelativeFormat is missing `fields` for :"+e)},a.prototype._format=function(e,t){var r=t&&void 0!==t.now?t.now:i.dateNow();if(void 0===e&&(e=r),!isFinite(r))throw new RangeError("The `now` option provided to IntlRelativeFormat#format() is not in valid range.");if(!isFinite(e))throw new RangeError("The date value provided to IntlRelativeFormat#format() is not in valid range.");var a=o.default(r,e),n=this._options.units||this._selectUnits(a),l=a[n];if("numeric"!==this._options.style){var s=this._getRelativeUnits(l,n);if(s)return s}return this._getMessage(n).format({0:Math.abs(l),when:l<0?"past":"future"})},a.prototype._isValidUnits=function(e){if(!e||i.arrIndexOf.call(l,e)>=0)return!0;if("string"==typeof e){var t=/s$/.test(e)&&e.substr(0,e.length-1);if(t&&i.arrIndexOf.call(l,t)>=0)throw new Error('"'+e+'" is not a valid IntlRelativeFormat `units` value, did you mean: '+t)}throw new Error('"'+e+'" is not a valid IntlRelativeFormat `units` value, it must be one of: "'+l.join('", "')+'"')},a.prototype._resolveLocale=function(e){"string"==typeof e&&(e=[e]),e=(e||[]).concat(a.defaultLocale);var t,r,n,o,i=a.__localeData__;for(t=0,r=e.length;t<r;t+=1)for(n=e[t].toLowerCase().split("-");n.length;){if(o=i[n.join("-")])return o.locale;n.pop()}var l=e.pop();throw new Error("No locale data has been added to IntlRelativeFormat for: "+e.join(", ")+", or the default locale: "+l)},a.prototype._resolveStyle=function(e){if(!e)return s[0];if(i.arrIndexOf.call(s,e)>=0)return e;throw new Error('"'+e+'" is not a valid IntlRelativeFormat `style` value, it must be one of: "'+s.join('", "')+'"')},a.prototype._selectUnits=function(e){var t,r,n,o=l.filter(function(e){return e.indexOf("-short")<1});for(t=0,r=o.length;t<r&&(n=o[t],!(Math.abs(e[n])<a.thresholds[n]));t+=1);return n}},function(e,t,r){"use strict";function a(e,t,r){var n="string"==typeof e?a.__parse(e):e;if(!n||"messageFormatPattern"!==n.type)throw new TypeError("A message must be provided as a String or AST.");r=this._mergeFormats(a.formats,r),o.defineProperty(this,"_locale",{value:this._resolveLocale(t)});var i=this._findPluralRuleFunction(this._locale),l=this._compilePattern(n,t,r,i),s=this;this.format=function(t){try{return s._format(l,t)}catch(t){throw t.variableId?new Error("The intl string context variable '"+t.variableId+"' was not provided to the string '"+e+"'"):t}}}var n=r(385),o=r(1001),i=r(999),l=r(996);t.default=a,o.defineProperty(a,"formats",{enumerable:!0,value:{number:{currency:{style:"currency"},percent:{style:"percent"}},date:{short:{month:"numeric",day:"numeric",year:"2-digit"},medium:{month:"short",day:"numeric",year:"numeric"},long:{month:"long",day:"numeric",year:"numeric"},full:{weekday:"long",month:"long",day:"numeric",year:"numeric"}},time:{short:{hour:"numeric",minute:"numeric"},medium:{hour:"numeric",minute:"numeric",second:"numeric"},long:{hour:"numeric",minute:"numeric",second:"numeric",timeZoneName:"short"},full:{hour:"numeric",minute:"numeric",second:"numeric",timeZoneName:"short"}}}}),o.defineProperty(a,"__localeData__",{value:o.objCreate(null)}),o.defineProperty(a,"__addLocaleData",{value:function(e){if(!e||!e.locale)throw new Error("Locale data provided to IntlMessageFormat is missing a `locale` property");a.__localeData__[e.locale.toLowerCase()]=e}}),o.defineProperty(a,"__parse",{value:l.default.parse}),o.defineProperty(a,"defaultLocale",{enumerable:!0,writable:!0,value:void 0}),a.prototype.resolvedOptions=function(){return{locale:this._locale}},a.prototype._compilePattern=function(e,t,r,a){return new i.default(t,r,a).compile(e)},a.prototype._findPluralRuleFunction=function(e){for(var t=a.__localeData__,r=t[e.toLowerCase()];r;){if(r.pluralRuleFunction)return r.pluralRuleFunction;r=r.parentLocale&&t[r.parentLocale.toLowerCase()]}throw new Error("Locale data added to IntlMessageFormat is missing a `pluralRuleFunction` for :"+e)},a.prototype._format=function(e,t){var r,a,o,i,l,s,u="";for(r=0,a=e.length;r<a;r+=1)if("string"!=typeof(o=e[r])){if(i=o.id,!t||!n.hop.call(t,i))throw s=new Error("A value must be provided for: "+i),s.variableId=i,s;l=t[i],o.options?u+=this._format(o.getOption(l),t):u+=o.format(l)}else u+=o;return u},a.prototype._mergeFormats=function(e,t){var r,a,i={};for(r in e)n.hop.call(e,r)&&(i[r]=a=o.objCreate(e[r]),t&&n.hop.call(t,r)&&n.extend(a,t[r]));return i},a.prototype._resolveLocale=function(e){"string"==typeof e&&(e=[e]),e=(e||[]).concat(a.defaultLocale);var t,r,n,o,i=a.__localeData__;for(t=0,r=e.length;t<r;t+=1)for(n=e[t].toLowerCase().split("-");n.length;){if(o=i[n.join("-")])return o.locale;n.pop()}var l=e.pop();throw new Error("No locale data has been added to IntlMessageFormat for: "+e.join(", ")+", or the default locale: "+l)}},function(e,t,r){"use strict";function a(e){var t,r,a,o,i=Array.prototype.slice.call(arguments,1);for(t=0,r=i.length;t<r;t+=1)if(a=i[t])for(o in a)n.call(a,o)&&(e[o]=a[o]);return e}t.extend=a;var n=Object.prototype.hasOwnProperty;t.hop=n},function(e,t,r){"use strict";function a(e){var t=this.__data__=new n(e);this.size=t.size}var n=r(175),o=r(1085),i=r(1086),l=r(1087),s=r(1088),u=r(1089);a.prototype.clear=o,a.prototype.delete=i,a.prototype.get=l,a.prototype.has=s,a.prototype.set=u,e.exports=a},function(e,t,r){"use strict";function a(e,t){for(var r=-1,a=null==e?0:e.length,n=Array(a);++r<a;)n[r]=t(e[r],r,e);return n}e.exports=a},function(e,t,r){"use strict";function a(e,t,r,a){var n=-1,o=null==e?0:e.length;for(a&&o&&(r=e[++n]);++n<o;)r=t(r,e[n],n,e);return r}e.exports=a},function(e,t,r){"use strict";function a(e,t){t=n(t,e);for(var r=0,a=t.length;null!=e&&r<a;)e=e[o(t[r++])];return r&&r==a?e:void 0}var n=r(392),o=r(180);e.exports=a},function(e,t,r){"use strict";function a(e,t,r,i,l){return e===t||(null==e||null==t||!o(e)&&!o(t)?e!==e&&t!==t:n(e,t,r,i,a,l))}var n=r(1025),o=r(97);e.exports=a},function(e,t,r){"use strict";function a(e){if(!n(e))return o(e);var t=[];for(var r in Object(e))l.call(e,r)&&"constructor"!=r&&t.push(r);return t}var n=r(398),o=r(1079),i=Object.prototype,l=i.hasOwnProperty;e.exports=a},function(e,t,r){"use strict";function a(e,t){return n(e)?e:o(e,t)?[e]:i(l(e))}var n=r(39),o=r(261),i=r(1092),l=r(117);e.exports=a},function(e,t,r){"use strict";function a(e,t,r,a,u,h){var c=r&l,d=e.length,m=t.length;if(d!=m&&!(c&&m>d))return!1;var p=h.get(e);if(p&&h.get(t))return p==t;var f=-1,v=!0,y=r&s?new n:void 0;for(h.set(e,t),h.set(t,e);++f<d;){var g=e[f],_=t[f];if(a)var T=c?a(_,g,f,t,e,h):a(g,_,f,e,t,h);if(void 0!==T){if(T)continue;v=!1;break}if(y){if(!o(t,function(e,t){if(!i(y,t)&&(g===e||u(g,e,r,a,h)))return y.push(t)})){v=!1;break}}else if(g!==_&&!u(g,_,r,a,h)){v=!1;break}}return h.delete(e),h.delete(t),v}var n=r(1008),o=r(1014),i=r(1042),l=1,s=2;e.exports=a},function(e,t,r){"use strict";(function(t){var r="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},a="object"==(void 0===t?"undefined":r(t))&&t&&t.Object===Object&&t;e.exports=a}).call(t,r(61))},function(e,t,r){"use strict";var a=r(1004),n=r(259),o=r(1006),i=r(1007),l=r(1010),s=r(96),u=r(402),h=u(a),c=u(n),d=u(o),m=u(i),p=u(l),f=s;(a&&"[object DataView]"!=f(new a(new ArrayBuffer(1)))||n&&"[object Map]"!=f(new n)||o&&"[object Promise]"!=f(o.resolve())||i&&"[object Set]"!=f(new i)||l&&"[object WeakMap]"!=f(new l))&&(f=function(e){var t=s(e),r="[object Object]"==t?e.constructor:void 0,a=r?u(r):"";if(a)switch(a){case h:return"[object DataView]";case c:return"[object Map]";case d:return"[object Promise]";case m:return"[object Set]";case p:return"[object WeakMap]"}return t}),e.exports=f},function(e,t,r){"use strict";function a(e){return n.test(e)}var n=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");e.exports=a},function(e,t,r){"use strict";function a(e,t){var r=void 0===e?"undefined":n(e);return!!(t=null==t?o:t)&&("number"==r||"symbol"!=r&&i.test(e))&&e>-1&&e%1==0&&e<t}var 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},o=9007199254740991,i=/^(?:0|[1-9]\d*)$/;e.exports=a},function(e,t,r){"use strict";function a(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||n)}var n=Object.prototype;e.exports=a},function(e,t,r){"use strict";function a(e){return e===e&&!n(e)}var n=r(183);e.exports=a},function(e,t,r){"use strict";function a(e,t){return function(r){return null!=r&&r[e]===t&&(void 0!==t||e in Object(r))}}e.exports=a},function(e,t,r){"use strict";function a(e,t){return function(r){return e(t(r))}}e.exports=a},function(e,t,r){"use strict";function a(e){if(null!=e){try{return o.call(e)}catch(e){}try{return e+""}catch(e){}}return""}var n=Function.prototype,o=n.toString;e.exports=a},function(e,t,r){"use strict";function a(e,t){return e===t||e!==e&&t!==t}e.exports=a},function(e,t,r){"use strict";function a(){throw new Error("setTimeout has not been defined")}function n(){throw new Error("clearTimeout has not been defined")}function o(e){if(c===setTimeout)return setTimeout(e,0);if((c===a||!c)&&setTimeout)return c=setTimeout,setTimeout(e,0);try{return c(e,0)}catch(t){try{return c.call(null,e,0)}catch(t){return c.call(this,e,0)}}}function i(e){if(d===clearTimeout)return clearTimeout(e);if((d===n||!d)&&clearTimeout)return d=clearTimeout,clearTimeout(e);try{return d(e)}catch(t){try{return d.call(null,e)}catch(t){return d.call(this,e)}}}function l(){v&&p&&(v=!1,p.length?f=p.concat(f):y=-1,f.length&&s())}function s(){if(!v){var e=o(l);v=!0;for(var t=f.length;t;){for(p=f,f=[];++y<t;)p&&p[y].run();y=-1,t=f.length}p=null,v=!1,i(e)}}function u(e,t){this.fun=e,this.array=t}function h(){}var c,d,m=e.exports={};!function(){try{c="function"==typeof setTimeout?setTimeout:a}catch(e){c=a}try{d="function"==typeof clearTimeout?clearTimeout:n}catch(e){d=n}}();var p,f=[],v=!1,y=-1;m.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var r=1;r<arguments.length;r++)t[r-1]=arguments[r];f.push(new u(e,t)),1!==f.length||v||o(s)},u.prototype.run=function(){this.fun.apply(null,this.array)},m.title="browser",m.browser=!0,m.env={},m.argv=[],m.version="",m.versions={},m.on=h,m.addListener=h,m.once=h,m.off=h,m.removeListener=h,m.removeAllListeners=h,m.emit=h,m.prependListener=h,m.prependOnceListener=h,m.listeners=function(e){return[]},m.binding=function(e){throw new Error("process.binding is not supported")},m.cwd=function(){return"/"},m.chdir=function(e){throw new Error("process.chdir is not supported")},m.umask=function(){return 0}},function(e,t,r){"use strict";(function(t){for(var a=r(1114),n="undefined"==typeof window?t:window,o=["moz","webkit"],i="AnimationFrame",l=n["request"+i],s=n["cancel"+i]||n["cancelRequest"+i],u=0;!l&&u<o.length;u++)l=n[o[u]+"Request"+i],s=n[o[u]+"Cancel"+i]||n[o[u]+"CancelRequest"+i];if(!l||!s){var h=0,c=0,d=[];l=function(e){if(0===d.length){var t=a(),r=Math.max(0,1e3/60-(t-h));h=r+t,setTimeout(function(){var e=d.slice(0);d.length=0;for(var t=0;t<e.length;t++)if(!e[t].cancelled)try{e[t].callback(h)}catch(e){setTimeout(function(){throw e},0)}},Math.round(r))}return d.push({handle:++c,callback:e,cancelled:!1}),c},s=function(e){for(var t=0;t<d.length;t++)d[t].handle===e&&(d[t].cancelled=!0)}}e.exports=function(e){return l.call(n,e)},e.exports.cancel=function(){s.apply(n,arguments)},e.exports.polyfill=function(e){e||(e=n),e.requestAnimationFrame=l,e.cancelAnimationFrame=s}}).call(t,r(61))},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a={isAppearSupported:function(e){return e.transitionName&&e.transitionAppear||e.animation.appear},isEnterSupported:function(e){return e.transitionName&&e.transitionEnter||e.animation.enter},isLeaveSupported:function(e){return e.transitionName&&e.transitionLeave||e.animation.leave},allowAppearCallback:function(e){return e.transitionAppear||e.animation.appear},allowEnterCallback:function(e){return e.transitionEnter||e.animation.enter},allowLeaveCallback:function(e){return e.transitionLeave||e.animation.leave}};t.default=a,e.exports=t.default},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function n(){}Object.defineProperty(t,"__esModule",{value:!0});var o=r(76),i=a(o),l=r(99),s=a(l),u=r(100),h=a(u),c=r(102),d=a(c),m=r(101),p=a(m),f=r(15),v=a(f),y=r(21),g=a(y),_=r(142),T=a(_),x=r(137),w=r(1125),N=a(w),b=r(409),L=a(b),S=Math.round(1e3/60),k=g.default.oneOfType([g.default.object,g.default.array]),D=function(e){function t(e){(0,s.default)(this,t);var r=(0,d.default)(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return M.call(r),r.rafID=-1,r.paused=e.paused,r.reverse=e.reverse,r.updateAnim=!1,r.forced={},r.setForcedJudg(e),r}return(0,p.default)(t,e),(0,h.default)(t,[{key:"componentDidMount",value:function(){this.dom=T.default.findDOMNode(this),this.dom&&"#text"!==this.dom.nodeName&&this.start()}},{key:"componentWillReceiveProps",value:function(e){if(!this.tween&&!this.dom)return void(this.updateAnim=!0);var t=e.animation,r=this.props.animation;(0,x.objectEqual)(r,t)||(e.resetStyle&&this.tween&&this.tween.resetDefaultStyle(),this.updateAnim=!0);var a=e.moment;"number"==typeof a&&a!==this.props.moment&&(this.tween&&!this.updateAnim?(this.startMoment=a,this.startFrame=L.default.frame,e.paused&&this.raf(),this.tween.progressTime>=this.tween.totalTime&&this.play()):this.updateAnim=!0),this.paused===e.paused&&this.reverse===e.reverse||(this.paused=e.paused,this.reverse=e.reverse,this.paused?this.cancelRequestAnimationFrame():this.reverse&&e.reverseDelay?(this.cancelRequestAnimationFrame(),L.default.timeout(this.restart,e.reverseDelay)):(this.tween&&(this.tween.resetAnimData(),this.tween.resetDefaultStyle()),this.updateAnim||this.restart())),(0,x.objectEqual)(this.props.style,e.style)||this.tween&&(this.tween.reStart(e.style),this.paused&&this.raf()),this.setForcedJudg(e)}},{key:"componentDidUpdate",value:function(){this.dom||(this.dom=T.default.findDOMNode(this)),this.updateAnim&&this.dom&&"#text"!==this.dom.nodeName&&(this.tween&&this.cancelRequestAnimationFrame(),this.start())}},{key:"componentWillUnmount",value:function(){this.cancelRequestAnimationFrame()}},{key:"render",value:function(){var e=(0,i.default)({},this.props);if(["animation","component","componentProps","reverseDelay","attr","paused","reverse","repeat","yoyo","moment","resetStyle","forcedJudg"].forEach(function(t){return delete e[t]}),e.style=(0,i.default)({},this.props.style),Object.keys(e.style).forEach(function(t){t.match(/filter/i)&&["Webkit","Moz","Ms","ms"].forEach(function(r){e.style[r+"Filter"]=e.style[t]})}),!this.props.component){if(!this.props.children)return this.props.children;var t=this.props.children.props,r=t.style,a=t.className,n=(0,i.default)({},r,e.style),o=e.className?e.className+" "+a:a;return v.default.cloneElement(this.props.children,{style:n,className:o})}return v.default.createElement(this.props.component,(0,i.default)({},e,this.props.componentProps))}}]),t}(f.Component);D.propTypes={component:g.default.any,componentProps:g.default.any,animation:k,children:g.default.any,style:g.default.object,paused:g.default.bool,reverse:g.default.bool,reverseDelay:g.default.number,yoyo:g.default.bool,repeat:g.default.number,moment:g.default.number,attr:g.default.string,onChange:g.default.func,resetStyle:g.default.bool,forcedJudg:g.default.object},D.defaultProps={component:"div",componentProps:{},reverseDelay:0,repeat:0,attr:"style",onChange:n};var M=function(){var e=this;this.setForcedJudg=function(t){Object.keys(e.forced).forEach(function(t){delete e[t],delete e.forced[t]}),t.forcedJudg&&Object.keys(t.forcedJudg).forEach(function(r){e[r]||(e[r]=t.forcedJudg[r],e.forced[r]=1)})},this.setDefalut=function(t){e.moment=t.moment||0,e.startMoment=t.moment||0,e.startFrame=L.default.frame},this.restart=function(){e.tween&&(e.startMoment=e.moment,e.startFrame=L.default.frame,e.tween.reverse=e.reverse,e.tween.reverseStartTime=e.startMoment,e.raf(),e.play())},this.start=function(){e.updateAnim=!1;var t=e.props;t.animation&&Object.keys(t.animation).length&&(e.setDefalut(t),e.tween=new N.default(e.dom,(0,x.dataToArray)(t.animation),{attr:t.attr}),e.tween.reverse=e.reverse,e.raf(),e.play())},this.play=function(){e.cancelRequestAnimationFrame(),e.paused||(e.rafID=L.default.add(e.raf))},this.frame=function(){var t=e.props.yoyo,r=e.props.repeat,a=-1===r?Number.MAX_VALUE:e.tween.totalTime*(r+1);r=r>=0?r:Number.MAX_VALUE;var n=(L.default.frame-e.startFrame)*S+e.startMoment;e.reverse&&(n=(e.startMoment||0)-(L.default.frame-e.startFrame)*S),n=n>a?a:n,n=n<=0?0:n;var o=Math.floor(n/e.tween.totalTime)||0;o=o>r?r:o;var l=n-e.tween.totalTime*o;l=l<S&&!e.reverse&&a>=S?0:l,r&&n&&n-e.tween.totalTime*o<S&&e.tween.frame(e.tween.totalTime*o),(n<e.moment&&!e.reverse||0!==r&&o&&l<=S)&&(e.tween.resetAnimData(),e.tween.resetDefaultStyle()),t&&o%2&&(l=e.tween.totalTime-l),e.tween.onChange=function(t){var r=(0,i.default)({},t,{timelineMode:""});e.moment===e.startMoment&&!e.reverse&&!t.index&&"onStart"===t.mode||e.reverse?r.timelineMode="onTimelineStart":n>=a&&!e.reverse||!n&&e.reverse?r.timelineMode="onTimelineComplete":o!==e.timelineRepeatNum?r.timelineMode="onTimelineRepeat":r.timelineMode="onTimelineUpdate",e.props.onChange(r)},e.moment=n,e.timelineRepeatNum=o,e.tween.frame(l)},this.raf=function(){var t=e.tween;if(e.frame(),t!==e.tween)return null;var r=e.props.repeat,a=-1===r?Number.MAX_VALUE:e.tween.totalTime*(r+1);return e.moment>=a&&!e.reverse||e.paused||e.reverse&&0===e.moment?e.cancelRequestAnimationFrame():null},this.cancelRequestAnimationFrame=function(){L.default.clear(e.rafID),e.rafID=-1}};D.isTweenOne=!0,t.default=D,e.exports=t.default},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=r(1187),n=function(e){return e&&e.__esModule?e:{default:e}}(a),o=r(137);n.default.path=function(e,t){var r=t||{};if(o.windowIsUndefined)return"linear";for(var a=(0,o.parsePath)(e),i=a.getTotalLength(),l=r.rect||100,s=r.lengthPixel||200,u=[],h=0;h<s-1;h++)u.push(a.getPointAtLength(i/(s-1)*h));return u.push(a.getPointAtLength(s)),function(e,t,r,o){var s=n.default.linear(e,t,r,o),h=l*s;return 1-(u.filter(function(e){return e.x>=h})[0]||a.getPointAtLength(s*i)).y/l}},t.default=n.default,e.exports=t.default},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=r(405),n=function(e){return e&&e.__esModule?e:{default:e}}(a),o=Date.now||function(){return(new Date).getTime()},i=function(){};i.prototype={tickFnArray:[],tickKeyObject:{},id:-1,tweenId:0,frame:0,perFrame:Math.round(1e3/60),elapsed:0,lastUpdate:o()};var l=i.prototype;l.add=function(e){var t="TweenOneTicker"+this.tweenId;return this.tweenId++,this.wake(t,e),t},l.wake=function(e,t){var r=this;this.tickKeyObject[e]=t,this.tickFnArray=Object.keys(this.tickKeyObject).map(function(e){return r.tickKeyObject[e]}),-1===this.id&&(this.id=(0,n.default)(this.tick))},l.clear=function(e){var t=this;delete this.tickKeyObject[e],this.tickFnArray=Object.keys(this.tickKeyObject).map(function(e){return t.tickKeyObject[e]})},l.sleep=function(){n.default.cancel(this.id),this.id=-1,this.frame=0};var s=new i;l.tick=function(e){if(s.elapsed=o()-s.lastUpdate,s.lastUpdate+=s.elapsed,s.frame?s.frame+=Math.round(s.elapsed/s.perFrame):s.frame++,s.tickFnArray.forEach(function(t){return t(e)}),!s.tickFnArray.length)return void s.sleep();s.id=(0,n.default)(s.tick)};var u=0;l.timeout=function(e,t){var r=this;if("function"!=typeof e)return console.warn("not function");var a="timeout"+Date.now()+"-"+u,n=this.frame;return this.wake(a,function(){(r.frame-n)*r.perFrame>=(t||0)&&(r.clear(a),e())}),u++,a};var h=0;l.interval=function(e,t){var r=this;if("function"!=typeof e)return console.warn("not function"),null;var a="interval"+Date.now()+"-"+h,n=this.frame;return this.wake(a,function(){(r.frame-n)*r.perFrame>=(t||0)&&(n=r.frame,e())}),h++,a},t.default=s,e.exports=t.default},function(e,t,r){"use strict";function a(e,t,r){var n="string"==typeof e?a.__parse(e):e;if(!n||"messageFormatPattern"!==n.type)throw new TypeError("A message must be provided as a String or AST.");r=this._mergeFormats(a.formats,r),o.defineProperty(this,"_locale",{value:this._resolveLocale(t)});var i=this._findPluralRuleFunction(this._locale),l=this._compilePattern(n,t,r,i),s=this;this.format=function(t){try{return s._format(l,t)}catch(t){throw t.variableId?new Error("The intl string context variable '"+t.variableId+"' was not provided to the string '"+e+"'"):t}}}var n=r(411),o=r(1136),i=r(1134),l=r(1131);t.default=a,o.defineProperty(a,"formats",{enumerable:!0,value:{number:{currency:{style:"currency"},percent:{style:"percent"}},date:{short:{month:"numeric",day:"numeric",year:"2-digit"},medium:{month:"short",day:"numeric",year:"numeric"},long:{month:"long",day:"numeric",year:"numeric"},full:{weekday:"long",month:"long",day:"numeric",year:"numeric"}},time:{short:{hour:"numeric",minute:"numeric"},medium:{hour:"numeric",minute:"numeric",second:"numeric"},long:{hour:"numeric",minute:"numeric",second:"numeric",timeZoneName:"short"},full:{hour:"numeric",minute:"numeric",second:"numeric",timeZoneName:"short"}}}}),o.defineProperty(a,"__localeData__",{value:o.objCreate(null)}),o.defineProperty(a,"__addLocaleData",{value:function(e){if(!e||!e.locale)throw new Error("Locale data provided to IntlMessageFormat is missing a `locale` property");a.__localeData__[e.locale.toLowerCase()]=e}}),o.defineProperty(a,"__parse",{value:l.default.parse}),o.defineProperty(a,"defaultLocale",{enumerable:!0,writable:!0,value:void 0}),a.prototype.resolvedOptions=function(){return{locale:this._locale}},a.prototype._compilePattern=function(e,t,r,a){return new i.default(t,r,a).compile(e)},a.prototype._findPluralRuleFunction=function(e){for(var t=a.__localeData__,r=t[e.toLowerCase()];r;){if(r.pluralRuleFunction)return r.pluralRuleFunction;r=r.parentLocale&&t[r.parentLocale.toLowerCase()]}throw new Error("Locale data added to IntlMessageFormat is missing a `pluralRuleFunction` for :"+e)},a.prototype._format=function(e,t){var r,a,o,i,l,s,u="";for(r=0,a=e.length;r<a;r+=1)if("string"!=typeof(o=e[r])){if(i=o.id,!t||!n.hop.call(t,i))throw s=new Error("A value must be provided for: "+i),s.variableId=i,s;l=t[i],o.options?u+=this._format(o.getOption(l),t):u+=o.format(l)}else u+=o;return u},a.prototype._mergeFormats=function(e,t){var r,a,i={};for(r in e)n.hop.call(e,r)&&(i[r]=a=o.objCreate(e[r]),t&&n.hop.call(t,r)&&n.extend(a,t[r]));return i},a.prototype._resolveLocale=function(e){"string"==typeof e&&(e=[e]),e=(e||[]).concat(a.defaultLocale);var t,r,n,o,i=a.__localeData__;for(t=0,r=e.length;t<r;t+=1)for(n=e[t].toLowerCase().split("-");n.length;){if(o=i[n.join("-")])return o.locale;n.pop()}var l=e.pop();throw new Error("No locale data has been added to IntlMessageFormat for: "+e.join(", ")+", or the default locale: "+l)}},function(e,t,r){"use strict";function a(e){var t,r,a,o,i=Array.prototype.slice.call(arguments,1);for(t=0,r=i.length;t<r;t+=1)if(a=i[t])for(o in a)n.call(a,o)&&(e[o]=a[o]);return e}t.extend=a;var n=Object.prototype.hasOwnProperty;t.hop=n},function(e,t,r){"use strict";function a(e,t){for(var r=Object.getOwnPropertyNames(t),a=0;a<r.length;a++){var n=r[a],o=Object.getOwnPropertyDescriptor(t,n);o&&o.configurable&&void 0===e[n]&&Object.defineProperty(e,n,o)}return e}function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!==(void 0===t?"undefined":d(t))&&"function"!=typeof t?e:t}function l(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":d(t)));e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):a(e,t))}function s(e,t){var r={};for(var a in e)t.indexOf(a)>=0||Object.prototype.hasOwnProperty.call(e,a)&&(r[a]=e[a]);return r}function u(){}function h(e,t){var r={run:function(a){try{var n=e(t.getState(),a);(n!==r.props||r.error)&&(r.shouldComponentUpdate=!0,r.props=n,r.error=null)}catch(e){r.shouldComponentUpdate=!0,r.error=e}}};return r}function c(e){var t,r,a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=a.getDisplayName,c=void 0===n?function(e){return"ConnectAdvanced("+e+")"}:n,d=a.methodName,p=void 0===d?"connectAdvanced":d,v=a.renderCountProp,_=void 0===v?void 0:v,b=a.shouldHandleStateChanges,L=void 0===b||b,S=a.storeKey,k=void 0===S?"store":S,D=a.withRef,M=void 0!==D&&D,A=s(a,["getDisplayName","methodName","renderCountProp","shouldHandleStateChanges","storeKey","withRef"]),I=k+"Subscription",z=w++,C=(t={},t[k]=x.storeShape,t[I]=x.subscriptionShape,t),R=(r={},r[I]=x.subscriptionShape,r);return function(t){(0,y.default)("function"==typeof t,"You must pass a component to the function returned by "+p+". Instead received "+JSON.stringify(t));var r=t.displayName||t.name||"Component",a=c(r),n=m({},A,{getDisplayName:c,methodName:p,renderCountProp:_,shouldHandleStateChanges:L,storeKey:k,withRef:M,displayName:a,wrappedComponentName:r,WrappedComponent:t}),s=function(r){function s(e,t){o(this,s);var n=i(this,r.call(this,e,t));return n.version=z,n.state={},n.renderCount=0,n.store=e[k]||t[k],n.propsMode=Boolean(e[k]),n.setWrappedInstance=n.setWrappedInstance.bind(n),(0,y.default)(n.store,'Could not find "'+k+'" in either the context or props of "'+a+'". Either wrap the root component in a <Provider>, or explicitly pass "'+k+'" as a prop to "'+a+'".'),n.initSelector(),n.initSubscription(),n}return l(s,r),s.prototype.getChildContext=function(){var e,t=this.propsMode?null:this.subscription;return e={},e[I]=t||this.context[I],e},s.prototype.componentDidMount=function(){L&&(this.subscription.trySubscribe(),this.selector.run(this.props),this.selector.shouldComponentUpdate&&this.forceUpdate())},s.prototype.componentWillReceiveProps=function(e){this.selector.run(e)},s.prototype.shouldComponentUpdate=function(){return this.selector.shouldComponentUpdate},s.prototype.componentWillUnmount=function(){this.subscription&&this.subscription.tryUnsubscribe(),this.subscription=null,this.notifyNestedSubs=u,this.store=null,this.selector.run=u,this.selector.shouldComponentUpdate=!1},s.prototype.getWrappedInstance=function(){return(0,y.default)(M,"To access the wrapped instance, you need to specify { withRef: true } in the options argument of the "+p+"() call."),this.wrappedInstance},s.prototype.setWrappedInstance=function(e){this.wrappedInstance=e},s.prototype.initSelector=function(){var t=e(this.store.dispatch,n);this.selector=h(t,this.store),this.selector.run(this.props)},s.prototype.initSubscription=function(){if(L){var e=(this.propsMode?this.props:this.context)[I];this.subscription=new T.default(this.store,e,this.onStateChange.bind(this)),this.notifyNestedSubs=this.subscription.notifyNestedSubs.bind(this.subscription)}},s.prototype.onStateChange=function(){this.selector.run(this.props),this.selector.shouldComponentUpdate?(this.componentDidUpdate=this.notifyNestedSubsOnComponentDidUpdate,this.setState(N)):this.notifyNestedSubs()},s.prototype.notifyNestedSubsOnComponentDidUpdate=function(){this.componentDidUpdate=void 0,this.notifyNestedSubs()},s.prototype.isSubscribed=function(){return Boolean(this.subscription)&&this.subscription.isSubscribed()},s.prototype.addExtraProps=function(e){if(!(M||_||this.propsMode&&this.subscription))return e;var t=m({},e);return M&&(t.ref=this.setWrappedInstance),_&&(t[_]=this.renderCount++),this.propsMode&&this.subscription&&(t[I]=this.subscription),t},s.prototype.render=function(){var e=this.selector;if(e.shouldComponentUpdate=!1,e.error)throw e.error;return(0,g.createElement)(t,this.addExtraProps(e.props))},s}(g.Component);return s.WrappedComponent=t,s.displayName=a,s.childContextTypes=R,s.contextTypes=C,s.propTypes=C,(0,f.default)(s,t)}}var d="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.__esModule=!0;var m=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e};t.default=c;var p=r(258),f=n(p),v=r(28),y=n(v),g=r(15),_=r(1147),T=n(_),x=r(414),w=0,N={}},function(e,t,r){"use strict";function a(e){return function(t,r){function a(){return n}var n=e(t,r);return a.dependsOnOwnProps=!1,a}}function n(e){return null!==e.dependsOnOwnProps&&void 0!==e.dependsOnOwnProps?Boolean(e.dependsOnOwnProps):1!==e.length}function o(e,t){return function(t,r){var a=(r.displayName,function(e,t){return a.dependsOnOwnProps?a.mapToProps(e,t):a.mapToProps(e)});return a.dependsOnOwnProps=!0,a.mapToProps=function(t,r){a.mapToProps=e,a.dependsOnOwnProps=n(e);var o=a(t,r);return"function"==typeof o&&(a.mapToProps=o,a.dependsOnOwnProps=n(o),o=a(t,r)),o},a}}t.__esModule=!0,t.wrapMapToPropsConstant=a,t.getDependsOnOwnProps=n,t.wrapMapToPropsFunc=o;var i=r(415);!function(e){e&&e.__esModule}(i)},function(e,t,r){"use strict";t.__esModule=!0,t.storeShape=t.subscriptionShape=void 0;var a=r(21),n=function(e){return e&&e.__esModule?e:{default:e}}(a);t.subscriptionShape=n.default.shape({trySubscribe:n.default.func.isRequired,tryUnsubscribe:n.default.func.isRequired,notifyNestedSubs:n.default.func.isRequired,isSubscribed:n.default.func.isRequired}),t.storeShape=n.default.shape({subscribe:n.default.func.isRequired,dispatch:n.default.func.isRequired,getState:n.default.func.isRequired})},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function n(e,t,r){(0,i.default)(e)||(0,s.default)(r+"() in "+t+" must return a plain object. Instead received "+e+".")}t.__esModule=!0,t.default=n;var o=r(184),i=a(o),l=r(268),s=a(l)},function(e,t,r){"use strict";function a(e){return function(){for(var t=arguments.length,r=Array(t),a=0;a<t;a++)r[a]=arguments[a];return{type:n,payload:{method:e,args:r}}}}Object.defineProperty(t,"__esModule",{value:!0});var n=t.CALL_HISTORY_METHOD="@@router/CALL_HISTORY_METHOD",o=t.push=a("push"),i=t.replace=a("replace"),l=t.go=a("go"),s=t.goBack=a("goBack"),u=t.goForward=a("goForward");t.routerActions={push:o,replace:i,go:l,goBack:s,goForward:u}},function(e,t,r){"use strict";function a(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:i,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=t.type,a=t.payload;return r===o?n({},e,{locationBeforeTransitions:a}):e}Object.defineProperty(t,"__esModule",{value:!0});var n=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e};t.routerReducer=a;var o=t.LOCATION_CHANGE="@@router/LOCATION_CHANGE",i={locationBeforeTransitions:null}},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function n(e,t){var r={};for(var a in e)t.indexOf(a)>=0||Object.prototype.hasOwnProperty.call(e,a)&&(r[a]=e[a]);return r}function o(e){return 0===e.button}function i(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function l(e){for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))return!1;return!0}function s(e,t){return"function"==typeof e?e(t.location):e}t.__esModule=!0;var u=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},h=r(15),c=a(h),d=r(57),m=a(d),p=r(21),f=r(28),v=a(f),y=r(271),g=r(270),_=(0,m.default)({displayName:"Link",mixins:[(0,g.ContextSubscriber)("router")],contextTypes:{router:y.routerShape},propTypes:{to:(0,p.oneOfType)([p.string,p.object,p.func]),activeStyle:p.object,activeClassName:p.string,onlyActiveOnIndex:p.bool.isRequired,onClick:p.func,target:p.string},getDefaultProps:function(){return{onlyActiveOnIndex:!1,style:{}}},handleClick:function(e){if(this.props.onClick&&this.props.onClick(e),!e.defaultPrevented){var t=this.context.router;t||(0,v.default)(!1),!i(e)&&o(e)&&(this.props.target||(e.preventDefault(),t.push(s(this.props.to,t))))}},render:function(){var e=this.props,t=e.to,r=e.activeClassName,a=e.activeStyle,o=e.onlyActiveOnIndex,i=n(e,["to","activeClassName","activeStyle","onlyActiveOnIndex"]),h=this.context.router;if(h){if(!t)return c.default.createElement("a",i);var d=s(t,h);i.href=h.createHref(d),(r||null!=a&&!l(a))&&h.isActive(d,o)&&(r&&(i.className?i.className+=" "+r:i.className=r),a&&(i.style=u({},i.style,a)))}return c.default.createElement("a",u({},i,{onClick:this.handleClick}))}});t.default=_,e.exports=t.default},function(e,t,r){"use strict";function a(e){return e&&"function"==typeof e.then}t.__esModule=!0,t.isPromise=a},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var n=r(57),o=a(n),i=r(21),l=r(28),s=a(l),u=r(74),h=r(118),c=r(138),d=(0,o.default)({displayName:"Redirect",statics:{createRouteFromReactElement:function(e){var t=(0,u.createRouteFromReactElement)(e);return t.from&&(t.path=t.from),t.onEnter=function(e,r){var a=e.location,n=e.params,o=void 0;if("/"===t.to.charAt(0))o=(0,h.formatPattern)(t.to,n);else if(t.to){var i=e.routes.indexOf(t),l=d.getRoutePattern(e.routes,i-1),s=l.replace(/\/*$/,"/")+t.to;o=(0,h.formatPattern)(s,n)}else o=a.pathname;r({pathname:o,query:t.query||a.query,state:t.state||a.state})},t},getRoutePattern:function(e,t){for(var r="",a=t;a>=0;a--){var n=e[a],o=n.path||"";if(r=o.replace(/\/*$/,"/")+r,0===o.indexOf("/"))break}return"/"+r}},propTypes:{path:i.string,from:i.string,to:i.string.isRequired,query:i.object,state:i.object,onEnter:c.falsy,children:c.falsy},render:function(){(0,s.default)(!1)}});t.default=d,e.exports=t.default},function(e,t,r){"use strict";function a(e,t,r){return n(o({},e,{setRouteLeaveHook:t.listenBeforeLeavingRoute,isActive:t.isActive}),r)}function n(e,t){var r=t.location,a=t.params,n=t.routes;return e.location=r,e.params=a,e.routes=n,e}t.__esModule=!0;var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e};t.createRouterObject=a,t.assignRouterState=n},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function n(e){var t=(0,h.default)(e),r=function(){return t};return(0,i.default)((0,s.default)(r))(e)}t.__esModule=!0,t.default=n;var o=r(382),i=a(o),l=r(381),s=a(l),u=r(985),h=a(u);e.exports=t.default},function(e,t,r){"use strict";function a(e){var t=void 0;return i&&(t=(0,o.default)(e)()),t}t.__esModule=!0,t.default=a;var n=r(425),o=function(e){return e&&e.__esModule?e:{default:e}}(n),i=!("undefined"==typeof window||!window.document||!window.document.createElement);e.exports=t.default},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function n(e){for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))return!0;return!1}function o(e,t){function r(t,r){return t=e.createLocation(t),(0,m.default)(t,r,_.location,_.routes,_.params)}function a(e,r){b&&b.location===e?o(b,r):(0,y.default)(t,e,function(t,a){t?r(t):a?o(i({},a,{location:e}),r):r()})}function o(e,t){function r(r,n){if(r||n)return a(r,n);(0,f.default)(e,function(r,a){r?t(r):t(null,null,_=i({},e,{components:a}))})}function a(e,r){e?t(e):t(null,r)}var n=(0,u.default)(_,e),o=n.leaveRoutes,l=n.changeRoutes,s=n.enterRoutes;N(o,_),o.filter(function(e){return-1===s.indexOf(e)}).forEach(p),w(l,_,e,function(t,n){if(t||n)return a(t,n);x(s,e,r)})}function l(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return e.__id__||t&&(e.__id__=L++)}function s(e){return e.map(function(e){return S[l(e)]}).filter(function(e){return e})}function h(e,r){(0,y.default)(t,e,function(t,a){if(null==a)return void r();b=i({},a,{location:e});for(var n=s((0,u.default)(_,b).leaveRoutes),o=void 0,l=0,h=n.length;null==o&&l<h;++l)o=n[l](e);r(o)})}function d(){if(_.routes){for(var e=s(_.routes),t=void 0,r=0,a=e.length;"string"!=typeof t&&r<a;++r)t=e[r]();return t}}function p(e){var t=l(e);t&&(delete S[t],n(S)||(k&&(k(),k=null),D&&(D(),D=null)))}function v(t,r){var a=!n(S),o=l(t,!0);return S[o]=r,a&&(k=e.listenBefore(h),e.listenBeforeUnload&&(D=e.listenBeforeUnload(d))),function(){p(t)}}function g(t){function r(r){_.location===r?t(null,_):a(r,function(r,a,n){r?t(r):a?e.replace(a):n&&t(null,n)})}var n=e.listen(r);return _.location?t(null,_):r(e.getCurrentLocation()),n}var _={},T=(0,c.default)(),x=T.runEnterHooks,w=T.runChangeHooks,N=T.runLeaveHooks,b=void 0,L=1,S=Object.create(null),k=void 0,D=void 0;return{isActive:r,match:a,listenBeforeLeavingRoute:v,listen:g}}t.__esModule=!0;var i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e};t.default=o;var l=r(119),s=(a(l),r(1159)),u=a(s),h=r(1156),c=a(h),d=r(1163),m=a(d),p=r(1160),f=a(p),v=r(1165),y=a(v);e.exports=t.default},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function n(e){return function(t){return(0,i.default)((0,s.default)(e))(t)}}t.__esModule=!0,t.default=n;var o=r(382),i=a(o),l=r(381),s=a(l);e.exports=t.default},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function n(e){return(0,s.default)(e)||(0,h.default)(e)||(0,v.default)(e)}function o(e){return!(0,d.default)(e)&&e.every(n)}function i(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];if(!o(t))throw new TypeError("Expected action types to be strings, symbols, or action creators");var a=t.map(p.default).join(y);return{toString:function(){return a}}}Object.defineProperty(t,"__esModule",{value:!0}),t.ACTION_TYPE_DELIMITER=void 0,t.default=i;var l=r(265),s=a(l),u=r(135),h=a(u),c=r(1101),d=a(c),m=r(117),p=a(m),f=r(136),v=a(f),y=t.ACTION_TYPE_DELIMITER="||"},function(e,t,r){"use strict";function a(e,t,r){var a="function"==typeof t?t:o.default,n=function(){var t=(arguments.length<=0?void 0:arguments[0])instanceof Error,n={type:e},o=t?arguments.length<=0?void 0:arguments[0]:a.apply(void 0,arguments);return null!==o&&void 0!==o&&(n.payload=o),t&&(n.error=!0),"function"==typeof r&&(n.meta=r.apply(void 0,arguments)),n};return n.toString=function(){return e.toString()},n}Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var n=r(181),o=function(e){return e&&e.__esModule?e:{default:e}}(n)},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function n(e,t,r){var a=e.toString().split(p.ACTION_TYPE_DELIMITER),n=(0,l.default)(t)?[t,t]:[t.next,t.throw].map(function(e){return(0,c.default)(e)?u.default:e}),i=o(n,2),s=i[0],h=i[1];return function(){var e=arguments.length<=0||void 0===arguments[0]?r:arguments[0],t=arguments[1];return(0,m.default)(a,t.type.toString())?(!0===t.error?h:s)(e,t):e}}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(e,t){var r=[],a=!0,n=!1,o=void 0;try{for(var i,l=e[Symbol.iterator]();!(a=(i=l.next()).done)&&(r.push(i.value),!t||r.length!==t);a=!0);}catch(e){n=!0,o=e}finally{try{!a&&l.return&&l.return()}finally{if(n)throw o}}return r}return function(t,r){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,r);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();t.default=n;var i=r(135),l=a(i),s=r(181),u=a(s),h=r(1102),c=a(h),d=r(1100),m=a(d),p=r(426)},function(e,t,r){"use strict";function a(e,t){for(var r in t){var a=t[r];a.configurable=a.enumerable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,r,a)}return e}function n(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t<e.length;t++)r[t]=e[t];return r}return Array.from(e)}function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e){return("*"===e?T.wildcard:u.is.array(e)?T.array:u.is.func(e)?T.predicate:T.default)(e)}function l(e,t,r){function a(e){o(),r(e,!0)}function n(e){i.push(e),e.cont=function(n,o){s||((0,u.remove)(i,e),e.cont=u.noop,o?a(n):(e===t&&(l=n),i.length||(s=!0,r(l))))}}function o(){s||(s=!0,i.forEach(function(e){e.cont=u.noop,e.cancel()}),i=[])}var i=[],l=void 0,s=!1;return n(t),{addTask:n,cancelAll:o,abort:a,getTasks:function(){return i},taskNames:function(){return i.map(function(e){return e.name})}}}function s(e){function t(){Z.isRunning&&!Z.isCancelled&&(Z.isCancelled=!0,h(_))}function r(){e._isRunning&&!e._isCancelled&&(e._isCancelled=!0,K.cancelAll(),T(_))}function h(t,r){if(!Z.isRunning)throw new Error("Trying to resume an already finished generator");try{var a=void 0;r?a=e.throw(t):t===_?(Z.isCancelled=!0,h.cancel(),a=u.is.func(e.return)?e.return(_):{done:!0,value:_}):a=t===g?u.is.func(e.return)?e.return():{done:!0}:e.next(t),a.done?(Z.isMainRunning=!1,Z.cont&&Z.cont(a.value)):x(a.value,B,"",h)}catch(e){Z.isCancelled&&U("error","uncaught at "+H,e.message),Z.isMainRunning=!1,Z.cont(e,!0)}}function T(t,r){e._isRunning=!1,q.close(),r?(t instanceof Error&&(t.sagaStack="at "+H+" \n "+(t.sagaStack||t.stack)),Y.cont||U("error","uncaught",t.sagaStack||t.stack),e._error=t,e._isAborted=!0,e._deferredEnd&&e._deferredEnd.reject(t)):(t===_&&f&&U("info",H+" has been cancelled",""),e._result=t,e._deferredEnd&&e._deferredEnd.resolve(t)),Y.cont&&Y.cont(t,r),Y.joiners.forEach(function(e){return e.cb(t,r)}),Y.joiners=null}function x(e,t){function r(e,t){i||(i=!0,n.cancel=u.noop,G&&(t?G.effectRejected(o,e):G.effectResolved(o,e)),n(e,t))}var a=arguments.length<=2||void 0===arguments[2]?"":arguments[2],n=arguments[3],o=y();G&&G.effectTriggered({effectId:o,parentEffectId:t,label:a,effect:e});var i=void 0;r.cancel=u.noop,n.cancel=function(){if(!i){i=!0;try{r.cancel()}catch(e){U("error","uncaught at "+H,e.message)}r.cancel=u.noop,G&&G.effectCancelled(o)}};var l=void 0;return u.is.promise(e)?w(e,r):u.is.iterator(e)?N(e,o,H,r):u.is.array(e)?I(e,o,r):u.is.notUndef(l=d.asEffect.take(e))?b(l,r):u.is.notUndef(l=d.asEffect.put(e))?L(l,r):u.is.notUndef(l=d.asEffect.race(e))?z(l,o,r):u.is.notUndef(l=d.asEffect.call(e))?S(l,o,r):u.is.notUndef(l=d.asEffect.cps(e))?k(l,r):u.is.notUndef(l=d.asEffect.fork(e))?D(l,o,r):u.is.notUndef(l=d.asEffect.join(e))?M(l,r):u.is.notUndef(l=d.asEffect.cancel(e))?A(l,r):u.is.notUndef(l=d.asEffect.select(e))?C(l,r):u.is.notUndef(l=d.asEffect.actionChannel(e))?R(l,r):u.is.notUndef(l=d.asEffect.cancelled(e))?E(l,r):r(e)}function w(e,t){var r=e[u.CANCEL];"function"==typeof r&&(t.cancel=r),e.then(t,function(e){return t(e,!0)})}function N(e,t,r,a){s(e,P,O,F,j,t,r,a)}function b(e,t){var r=e.channel,a=e.pattern,n=e.maybe;r=r||q;var o=function(e){return e instanceof Error?t(e,!0):t((0,m.isEnd)(e)&&!n?g:e)};try{r.take(o,i(a))}catch(e){return t(e,!0)}t.cancel=o.cancel}function L(e,t){var r=e.channel,a=e.action,n=e.sync;(0,c.default)(function(){var e=void 0;try{e=(r?r.put:O)(a)}catch(e){return t(e,!0)}if(!n||!u.is.promise(e))return t(e);w(e,t)})}function S(e,t,r){var a=e.context,n=e.fn,o=e.args,i=void 0;try{i=n.apply(a,o)}catch(e){return r(e,!0)}return u.is.promise(i)?w(i,r):u.is.iterator(i)?N(i,t,n.name,r):r(i)}function k(e,t){var r=e.context,a=e.fn,n=e.args;try{a.apply(r,n.concat(function(e,r){return u.is.undef(e)?t(r):t(e,!0)}))}catch(e){return t(e,!0)}}function D(e,t,r){var a=e.context,n=e.fn,o=e.args,i=e.detached,l=void 0,h=void 0,d=void 0;try{l=n.apply(a,o)}catch(e){h=e}d=u.is.iterator(l)?l:h?(0,u.makeIterator)(function(){throw h}):(0,u.makeIterator)(function(){var e=void 0,t={done:!1,value:l},r=function(e){return{done:!0,value:e}};return function(a){return e?r(a):(e=!0,t)}}()),c.default.suspend();var m=s(d,P,O,F,j,t,n.name,i?null:u.noop);i?r(m):d._isRunning?(K.addTask(m),r(m)):d._error?K.abort(d._error):r(m),c.default.flush()}function M(e,t){e.isRunning()?function(){var r={task:Y,cb:t};t.cancel=function(){return(0,u.remove)(e.joiners,r)},e.joiners.push(r)}():e.isAborted()?t(e.error(),!0):t(e.result())}function A(e,t){e.isRunning()&&e.cancel(),t()}function I(e,t,r){function a(){n===i.length&&(o=!0,r(i))}if(!e.length)return r([]);var n=0,o=void 0,i=Array(e.length),l=e.map(function(e,t){var l=function(e,l){o||(l||(0,m.isEnd)(e)||e===g||e===_?(r.cancel(),r(e,l)):(i[t]=e,n++,a()))};return l.cancel=u.noop,l});r.cancel=function(){o||(o=!0,l.forEach(function(e){return e.cancel()}))},e.forEach(function(e,r){return x(e,t,r,l[r])})}function z(e,t,r){var a=void 0,n=Object.keys(e),i={};n.forEach(function(e){var t=function(t,n){a||(n?(r.cancel(),r(t,!0)):(0,m.isEnd)(t)||t===g||t===_||(r.cancel(),a=!0,r(o({},e,t))))};t.cancel=u.noop,i[e]=t}),r.cancel=function(){a||(a=!0,n.forEach(function(e){return i[e].cancel()}))},n.forEach(function(r){return x(e[r],t,r,i[r])})}function C(e,t){var r=e.selector,a=e.args;try{var o=r.apply(void 0,[F()].concat(n(a)));t(o)}catch(e){t(e,!0)}}function R(e,t){var r=e.pattern,a=e.buffer,n=i(r);n.pattern=r,t((0,m.eventChannel)(P,a||p.buffers.fixed(),n))}function E(e,t){t(!!Z.isCancelled)}var P=arguments.length<=1||void 0===arguments[1]?function(){return u.noop}:arguments[1],O=arguments.length<=2||void 0===arguments[2]?u.noop:arguments[2],F=arguments.length<=3||void 0===arguments[3]?u.noop:arguments[3],j=arguments.length<=4||void 0===arguments[4]?{}:arguments[4],B=arguments.length<=5||void 0===arguments[5]?0:arguments[5],H=arguments.length<=6||void 0===arguments[6]?"anonymous":arguments[6],V=arguments[7];(0,u.check)(e,u.is.iterator,v);var G=j.sagaMonitor,W=j.logger,U=W||u.log,q=(0,m.eventChannel)(P);h.cancel=u.noop;var Y=function(e,t,n,i){var l,s,h;return n._deferredEnd=null,s={},o(s,u.TASK,!0),o(s,"id",e),o(s,"name",t),l="done",h={},h[l]=h[l]||{},h[l].get=function(){if(n._deferredEnd)return n._deferredEnd.promise;var e=(0,u.deferred)();return n._deferredEnd=e,n._isRunning||(n._error?e.reject(n._error):e.resolve(n._result)),e.promise},o(s,"cont",i),o(s,"joiners",[]),o(s,"cancel",r),o(s,"isRunning",function(){return n._isRunning}),o(s,"isCancelled",function(){return n._isCancelled}),o(s,"isAborted",function(){return n._isAborted}),o(s,"result",function(){return n._result}),o(s,"error",function(){return n._error}),a(s,h),s}(B,H,e,V),Z={name:H,cancel:t,isRunning:!0},K=l(H,Z,T);return V&&(V.cancel=r),e._isRunning=!0,h(),Y}Object.defineProperty(t,"__esModule",{value:!0}),t.TASK_CANCEL=t.CHANNEL_END=t.NOT_ITERATOR_ERROR=void 0,t.default=s;var u=r(60),h=r(1174),c=function(e){return e&&e.__esModule?e:{default:e}}(h),d=r(188),m=r(187),p=r(273),f=!1,v=t.NOT_ITERATOR_ERROR="proc first argument (Saga function result) must be an iterator",y=(0,u.autoInc)(),g=t.CHANNEL_END={toString:function(){return"@@redux-saga/CHANNEL_END"}},_=t.TASK_CANCEL={toString:function(){return"@@redux-saga/TASK_CANCEL"}},T={wildcard:function(){return u.kTrue},default:function(e){return function(t){return t.type===e}},array:function(e){return function(t){return e.some(function(e){return e===t.type})}},predicate:function(e){return function(t){return e(t)}}}},function(e,t,r){"use strict";function a(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];if(0===t.length)return function(e){return e};if(1===t.length)return t[0];var a=t[t.length-1],n=t.slice(0,-1);return function(){return n.reduceRight(function(e,t){return t(e)},a.apply(void 0,arguments))}}t.__esModule=!0,t.default=a},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function n(e,t,r){function a(){g===y&&(g=y.slice())}function i(){return v}function s(e){if("function"!=typeof e)throw new Error("Expected listener to be a function.");var t=!0;return a(),g.push(e),function(){if(t){t=!1,a();var r=g.indexOf(e);g.splice(r,1)}}}function c(e){if(!(0,l.default)(e))throw new Error("Actions must be plain objects. Use custom middleware for async actions.");if(void 0===e.type)throw new Error('Actions may not have an undefined "type" property. Have you misspelled a constant?');if(_)throw new Error("Reducers may not dispatch actions.");try{_=!0,v=f(v,e)}finally{_=!1}for(var t=y=g,r=0;r<t.length;r++)t[r]();return e}function d(e){if("function"!=typeof e)throw new Error("Expected the nextReducer to be a function.");f=e,c({type:h.INIT})}function m(){var e,t=s;return e={subscribe:function(e){function r(){e.next&&e.next(i())}if("object"!==(void 0===e?"undefined":o(e)))throw new TypeError("Expected the observer to be an object.");return r(),{unsubscribe:t(r)}}},e[u.default]=function(){return this},e}var p;if("function"==typeof t&&void 0===r&&(r=t,t=void 0),void 0!==r){if("function"!=typeof r)throw new Error("Expected the enhancer to be a function.");return r(n)(e,t)}if("function"!=typeof e)throw new Error("Expected the reducer to be a function.");var f=e,v=t,y=[],g=y,_=!1;return c({type:h.INIT}),p={dispatch:c,subscribe:s,getState:i,replaceReducer:d},p[u.default]=m,p}var o="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.__esModule=!0,t.ActionTypes=void 0,t.default=n;var i=r(184),l=a(i),s=r(1185),u=a(s),h=t.ActionTypes={INIT:"@@redux/INIT"}},function(e,t,r){"use strict";function a(e){"undefined"!=typeof console&&"function"==typeof console.error&&console.error(e);try{throw new Error(e)}catch(e){}}t.__esModule=!0,t.default=a},function(e,t,r){"use strict";function a(e,t){return e+t.charAt(0).toUpperCase()+t.substring(1)}function n(e,t){var r=t?Math.pow(10,t):L,a=0|e,n=e-a,o=e;if(n){var i=(n*r+(e<0?-.5:.5)|0)/r,l=0|i,s=i.toString();o=a+l+"."+s.substring(2,s.length)}return parseFloat(o)}function o(e){if("undefined"==typeof document)return null;var t=["WebKitCSS","MozCSS","DOM","MsCSS","MSCSS","OCSS","CSS"].filter(function(e){return e+"Matrix"in window});return t.length?new window[t[0]+"Matrix"](e):(console.warn("Browsers do not support matrix."),"")}function i(e){if("undefined"==typeof document)return null;var t=["O","Moz","ms","Ms","Webkit"];if("filter"!==e&&e in document.body.style)return e;var r=e.charAt(0).toUpperCase()+e.substr(1),a=t.filter(function(e){return""+e+r in document.body.style});return a[0]?""+a[0]+r:null}function l(e){var t=e;return t="x"===t?"translateX":t,t="y"===t?"translateY":t,t="z"===t?"translateZ":t}function s(e){var t=void 0,r=void 0,a=void 0,n=void 0,o=void 0,i=void 0,l=void 0,s=e,u=/(?:\d|\-\d|\.\d|\-\.\d)+/g;return s?"number"==typeof s?t=[s>>16,s>>8&255,255&s]:(","===s.charAt(s.length-1)&&(s=s.substr(0,s.length-1)),S[s]?t=S[s]:"#"===s.charAt(0)?(4===s.length&&(r=s.charAt(1),a=s.charAt(2),n=s.charAt(3),s="#"+r+r+a+a+n+n),s=parseInt(s.substr(1),16),t=[s>>16,s>>8&255,255&s]):"hsl"===s.substr(0,3)?(t=s.match(u),o=Number(t[0])%360/360,i=Number(t[1])/100,l=Number(t[2])/100,a=l<=.5?l*(i+1):l+i-l*i,r=2*l-a,t.length>3&&(t[3]=Number(t[3])),t[0]=k(o+1/3,r,a),t[1]=k(o,r,a),t[2]=k(o-1/3,r,a)):t=s.match(u)||S.transparent,t[0]=Number(t[0]),t[1]=Number(t[1]),t[2]=Number(t[2]),t.length>3&&(t[3]=Number(t[3]))):t=S.black,t}function u(e){if(!e)return[0,0,0,0,0,0,0];var t=void 0;if(e.indexOf("rgb")>=0){var r=e.match(/rgb+(?:a)?\((.*)\)/),a=e.replace(r[0],"").trim().split(/\s+/);(t=a.indexOf("inset"))>=0&&a.splice(t,1);var n=r[1].replace(/\s+/g,"").split(",");return 3===n.length&&n.push(1),a.concat(n,t>=0?["inset"]:[])}var o=e.split(/\s+/);(t=o.indexOf("inset"))>=0&&o.splice(t,1);var i=s(o[o.length-1]);return i[3]="number"==typeof i[3]?i[3]:1,o=o.splice(0,o.length-1),o.concat(i,t>=0?["inset"]:[])}function h(e){return(4===e.length?"rgba":"rgb")+"("+e.map(function(e,t){return t<3?Math.round(e):e}).join(",")+")"}function c(e){return M._lists.transformsBase.indexOf(e)>=0?"transform":e}function d(e){var t=c(e);return M.filter.indexOf(t)>=0?"filter":t}function m(e){if("none"===e||!e||""===e)return null;var t=e.replace(" ","").split(")").filter(function(e){return e}),r={};return t.forEach(function(e){var t=e.split("(");r[t[0]]=t[1]}),r}function p(e){var t=e.match(/(?:\-|\b)[\d\-\.e]+\b/gi),r={};return 6===t.length?(r.m11=parseFloat(t[0]),r.m12=parseFloat(t[1]),r.m13=0,r.m14=0,r.m21=parseFloat(t[2]),r.m22=parseFloat(t[3]),r.m23=0,r.m24=0,r.m31=0,r.m32=0,r.m33=1,r.m34=0,r.m41=parseFloat(t[4]),r.m42=parseFloat(t[5]),r.m43=0,r.m44=0):t.forEach(function(e,t){var a=t%4+1,n=Math.floor(t/4)+1;r["m"+n+a]=parseFloat(e)}),r}function f(e){var t=e&&"none"!==e&&""!==e?e:"matrix(1, 0, 0, 1, 0, 0)",r=p(t),a=r.m11,o=r.m12,i=r.m13,l=r.m14,s=r.m21,u=r.m22,h=r.m23,c=r.m24,d=r.m31,m=r.m32,f=r.m33,v=r.m34,y=r.m43,g=void 0,_=void 0,T=void 0,x={},w=Math.atan2(h,f),N=Math.tan(s),b=Math.tan(o),L=void 0,S=void 0;return x.rotateX=n(w*D)||0,w&&(L=Math.cos(-w),S=Math.sin(-w),g=s*L+d*S,_=u*L+m*S,T=h*L+f*S,d=s*-S+d*L,m=u*-S+m*L,f=h*-S+f*L,v=c*-S+v*L,s=g,u=_,h=T),w=Math.atan2(-i,f),x.rotateY=n(w*D)||0,w&&(L=Math.cos(-w),S=Math.sin(-w),g=a*L-d*S,_=o*L-m*S,T=i*L-f*S,m=o*S+m*L,f=i*S+f*L,v=l*S+v*L,a=g,o=_,i=T),w=Math.atan2(o,a),x.rotate=n(w*D)||0,w&&(L=Math.cos(w),S=Math.sin(w),g=a*L+o*S,_=s*L+u*S,T=d*L+m*S,o=o*L-a*S,u=u*L-s*S,m=m*L-d*S,a=g,s=_,d=T),x.rotateX&&Math.abs(x.rotateX)+Math.abs(x.rotate)>359.9&&(x.rotateX=x.rotate=0,x.rotateY=180-x.rotateY||0),x.scaleX=n(Math.sqrt(a*a+o*o+i*i)),x.scaleY=n(Math.sqrt(u*u+h*h)),x.scaleZ=n(Math.sqrt(d*d+m*m+f*f)),x.skewX=N===-b?0:N,x.skewY=b===-N?0:b,x.perspective=v?1/(v<0?-v:v):0,x.translateX=r.m41,x.translateY=r.m42,x.translateZ=y,x}function v(e,t){var r=void 0;return x[e]||"number"!=typeof t?"content"!==e||N.test(t)||(r="'"+t.replace(/'/g,"\\'")+"'"):r=" "+t+"px",r||t}function y(e,t){var r=t&&t.toString().replace(/[^a-z|%]/gi,""),a="";return e.indexOf("translate")>=0||e.indexOf("perspective")>=0||e.indexOf("blur")>=0?a="px":(e.indexOf("skew")>=0||e.indexOf("rotate")>=0)&&(a="deg"),r||a}function g(e,t,r){return e+"("+t+(r||"")+")"}function _(e,t){var r=null;return e&&e.forEach(function(e){if(!r){var a=e.split("(")[0],n=a in M.transformGroup&&t.substring(0,t.length-1).indexOf(a)>=0,o=t in M.transformGroup&&a.substring(0,a.length-1).indexOf(t)>=0,i=a in M.transformGroup&&t in M.transformGroup&&(a.substring(0,a.length-2)===t||t.substring(0,t.length-2)===a);(a===t||n||o||i)&&(r=e)}}),r}function T(e,t){if(!e||""===e)return t;if(!t||""===t)return e;var r=e.replace(/\s/g,"").split(")").filter(function(e){return""!==e&&e}).map(function(e){return e+")"});return t.replace(/\s/g,"").split(")").filter(function(e){return""!==e&&e}).forEach(function(e){var t=e.split("("),a=t[0],n=_(r,a);if(n){var o=r.indexOf(n);r[o]=e+")"}else r.push(e+")")}),r.forEach(function(e,t){e.indexOf("perspective")>=0&&t&&(r.splice(t,1),r.unshift(e))}),r.join(" ").trim()}Object.defineProperty(t,"__esModule",{value:!0}),t.toFixed=n,t.createMatrix=o,t.checkStyleName=i,t.getGsapType=l,t.parseColor=s,t.parseShadow=u,t.getColor=h,t.isTransform=c,t.isConvert=d,t.splitFilterToObject=m,t.getMatrix=p,t.getTransform=f,t.stylesToCss=v,t.getUnit=y,t.getValues=g,t.findStyleByName=_,t.mergeStyle=T;var x={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridRow:!0,gridColumn:!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},w=["Webkit","ms","Moz","O"];Object.keys(x).forEach(function(e){w.forEach(function(t){x[a(t,e)]=x[e]})});var N=/^(normal|none|(\b(url\([^)]*\)|chapter_counter|attr\([^)]*\)|(no-)?(open|close)-quote|inherit)((\b\s*)|$|\s+))+)$/,b=function(){return"undefined"!=typeof document&&!(!navigator||!(navigator.userAgent.indexOf("MSIE 8.0")>0||navigator.userAgent.indexOf("MSIE 9.0")>0))}(),L=1e5,S={aqua:[0,255,255],lime:[0,255,0],silver:[192,192,192],black:[0,0,0],maroon:[128,0,0],teal:[0,128,128],blue:[0,0,255],navy:[0,0,128],white:[255,255,255],fuchsia:[255,0,255],olive:[128,128,0],yellow:[255,255,0],orange:[255,165,0],gray:[128,128,128],purple:[128,0,128],green:[0,128,0],red:[255,0,0],pink:[255,192,203],cyan:[0,255,255],transparent:[255,255,255,0]},k=function(e,t,r){var a=e>1?e-1:e;a=e<0?e+1:a;var n=3*a<2?t+(r-t)*(2/3-a)*6:t,o=a<.5?r:n;return 255*(6*a<1?t+(r-t)*a*6:o)+.5|0},D=(Math.PI,180/Math.PI),M={_lists:{transformsBase:["translate","translateX","translateY","scale","scaleX","scaleY","skewX","skewY","rotateZ","rotate"],transforms3D:["translate3d","translateZ","scaleZ","rotateX","rotateY","perspective"]},transformGroup:{translate:1,translate3d:1,scale:1,scale3d:1,rotate:1,rotate3d:1},filter:["grayScale","sepia","hueRotate","invert","brightness","contrast","blur"],filterConvert:{grayScale:"grayscale",hueRotate:"hue-rotate"}};M._lists.transformsBase=b?M._lists.transformsBase:M._lists.transformsBase.concat(M._lists.transforms3D),t.default=M},function(e,t,r){"use strict";var a=r(443),n=r(98),o=r(277),i=r(1215),l=r(0),s=function(e){o.call(this,e),n.call(this,e),i.call(this,e),this.id=e.id||a()};s.prototype={type:"element",name:"",__zr:null,ignore:!1,clipPath:null,drift:function(e,t){switch(this.draggable){case"horizontal":t=0;break;case"vertical":e=0}var r=this.transform;r||(r=this.transform=[1,0,0,1,0,0]),r[4]+=e,r[5]+=t,this.decomposeTransform(),this.dirty(!1)},beforeUpdate:function(){},afterUpdate:function(){},update:function(){this.updateTransform()},traverse:function(e,t){},attrKV:function(e,t){if("position"===e||"scale"===e||"origin"===e){if(t){var r=this[e];r||(r=this[e]=[]),r[0]=t[0],r[1]=t[1]}}else this[e]=t},hide:function(){this.ignore=!0,this.__zr&&this.__zr.refresh()},show:function(){this.ignore=!1,this.__zr&&this.__zr.refresh()},attr:function(e,t){if("string"==typeof e)this.attrKV(e,t);else if(l.isObject(e))for(var r in e)e.hasOwnProperty(r)&&this.attrKV(r,e[r]);return this.dirty(!1),this},setClipPath:function(e){var t=this.__zr;t&&e.addSelfToZr(t),this.clipPath&&this.clipPath!==e&&this.removeClipPath(),this.clipPath=e,e.__zr=t,e.__clipTarget=this,this.dirty(!1)},removeClipPath:function(){var e=this.clipPath;e&&(e.__zr&&e.removeSelfFromZr(e.__zr),e.__zr=null,e.__clipTarget=null,this.clipPath=null,this.dirty(!1))},addSelfToZr:function(e){this.__zr=e;var t=this.animators;if(t)for(var r=0;r<t.length;r++)e.animation.addAnimator(t[r]);this.clipPath&&this.clipPath.addSelfToZr(e)},removeSelfFromZr:function(e){this.__zr=null;var t=this.animators;if(t)for(var r=0;r<t.length;r++)e.animation.removeAnimator(t[r]);this.clipPath&&this.clipPath.removeSelfFromZr(e)}},l.mixin(s,i),l.mixin(s,o),l.mixin(s,n);var u=s;e.exports=u},function(e,t,r){"use strict";function a(e,t){return e[t]}function n(e,t,r){e[t]=r}function o(e,t,r){return(t-e)*r+e}function i(e,t,r){return r>.5?t:e}function l(e,t,r,a,n){var i=e.length;if(1==n)for(var l=0;l<i;l++)a[l]=o(e[l],t[l],r);else for(var s=i&&e[0].length,l=0;l<i;l++)for(var u=0;u<s;u++)a[l][u]=o(e[l][u],t[l][u],r)}function s(e,t,r){var a=e.length,n=t.length;if(a!==n)if(a>n)e.length=n;else for(var o=a;o<n;o++)e.push(1===r?t[o]:T.call(t[o]));for(var i=e[0]&&e[0].length,o=0;o<e.length;o++)if(1===r)isNaN(e[o])&&(e[o]=t[o]);else for(var l=0;l<i;l++)isNaN(e[o][l])&&(e[o][l]=t[o][l])}function u(e,t,r){if(e===t)return!0;var a=e.length;if(a!==t.length)return!1;if(1===r){for(var n=0;n<a;n++)if(e[n]!==t[n])return!1}else for(var o=e[0].length,n=0;n<a;n++)for(var i=0;i<o;i++)if(e[n][i]!==t[n][i])return!1;return!0}function h(e,t,r,a,n,o,i,l,s){var u=e.length;if(1==s)for(var h=0;h<u;h++)l[h]=c(e[h],t[h],r[h],a[h],n,o,i);else for(var d=e[0].length,h=0;h<u;h++)for(var m=0;m<d;m++)l[h][m]=c(e[h][m],t[h][m],r[h][m],a[h][m],n,o,i)}function c(e,t,r,a,n,o,i){var l=.5*(r-e),s=.5*(a-t);return(2*(t-r)+l+s)*i+(-3*(t-r)-2*l-s)*o+l*n+t}function d(e){if(_(e)){var t=e.length;if(_(e[0])){for(var r=[],a=0;a<t;a++)r.push(T.call(e[a]));return r}return T.call(e)}return e}function m(e){return e[0]=Math.floor(e[0]),e[1]=Math.floor(e[1]),e[2]=Math.floor(e[2]),"rgba("+e.join(",")+")"}function p(e){var t=e[e.length-1].value;return _(t&&t[0])?2:1}function f(e,t,r,a,n,d){var f=e._getter,g=e._setter,T="spline"===t,x=a.length;if(x){var w,N=a[0].value,b=_(N),L=!1,S=!1,k=b?p(a):0;a.sort(function(e,t){return e.time-t.time}),w=a[x-1].time;for(var D=[],M=[],A=a[0].value,I=!0,z=0;z<x;z++){D.push(a[z].time/w);var C=a[z].value;if(b&&u(C,A,k)||!b&&C===A||(I=!1),A=C,"string"==typeof C){var R=y.parse(C);R?(C=R,L=!0):S=!0}M.push(C)}if(d||!I){for(var E=M[x-1],z=0;z<x-1;z++)b?s(M[z],E,k):!isNaN(M[z])||isNaN(E)||S||L||(M[z]=E);b&&s(f(e._target,n),E,k);var P,O,F,j,B,H,V=0,G=0;if(L)var W=[0,0,0,0];var U=function(e,t){var r;if(t<0)r=0;else if(t<G){for(P=Math.min(V+1,x-1),r=P;r>=0&&!(D[r]<=t);r--);r=Math.min(r,x-2)}else{for(r=V;r<x&&!(D[r]>t);r++);r=Math.min(r-1,x-2)}V=r,G=t;var a=D[r+1]-D[r];if(0!==a)if(O=(t-D[r])/a,T)if(j=M[r],F=M[0===r?r:r-1],B=M[r>x-2?x-1:r+1],H=M[r>x-3?x-1:r+2],b)h(F,j,B,H,O,O*O,O*O*O,f(e,n),k);else{var s;if(L)s=h(F,j,B,H,O,O*O,O*O*O,W,1),s=m(W);else{if(S)return i(j,B,O);s=c(F,j,B,H,O,O*O,O*O*O)}g(e,n,s)}else if(b)l(M[r],M[r+1],O,f(e,n),k);else{var s;if(L)l(M[r],M[r+1],O,W,1),s=m(W);else{if(S)return i(M[r],M[r+1],O);s=o(M[r],M[r+1],O)}g(e,n,s)}},q=new v({target:e._target,life:w,loop:e._loop,delay:e._delay,onframe:U,ondestroy:r});return t&&"spline"!==t&&(q.easing=t),q}}}var v=r(1194),y=r(63),g=r(0),_=g.isArrayLike,T=Array.prototype.slice,x=function(e,t,r,o){this._tracks={},this._target=e,this._loop=t||!1,this._getter=r||a,this._setter=o||n,this._clipCount=0,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[]};x.prototype={when:function(e,t){var r=this._tracks;for(var a in t)if(t.hasOwnProperty(a)){if(!r[a]){r[a]=[];var n=this._getter(this._target,a);if(null==n)continue;0!==e&&r[a].push({time:0,value:d(n)})}r[a].push({time:e,value:t[a]})}return this},during:function(e){return this._onframeList.push(e),this},pause:function(){for(var e=0;e<this._clipList.length;e++)this._clipList[e].pause();this._paused=!0},resume:function(){for(var e=0;e<this._clipList.length;e++)this._clipList[e].resume();this._paused=!1},isPaused:function(){return!!this._paused},_doneCallback:function(){this._tracks={},this._clipList.length=0;for(var e=this._doneList,t=e.length,r=0;r<t;r++)e[r].call(this)},start:function(e,t){var r,a=this,n=0,o=function(){--n||a._doneCallback()};for(var i in this._tracks)if(this._tracks.hasOwnProperty(i)){var l=f(this,e,o,this._tracks[i],i,t);l&&(this._clipList.push(l),n++,this.animation&&this.animation.addClip(l),r=l)}if(r){var s=r.onframe;r.onframe=function(e,t){s(e,t);for(var r=0;r<a._onframeList.length;r++)a._onframeList[r](e,t)}}return n||this._doneCallback(),this},stop:function(e){for(var t=this._clipList,r=this.animation,a=0;a<t.length;a++){var n=t[a];e&&n.onframe(this._target,1),r&&r.removeClip(n)}t.length=0},delay:function(e){return this._delay=e,this},done:function(e){return e&&this._doneList.push(e),this},getClips:function(){return this._clipList}};var w=x;e.exports=w},function(e,t,r){"use strict";var a="undefined"!=typeof window&&(window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.msRequestAnimationFrame&&window.msRequestAnimationFrame.bind(window)||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(e){setTimeout(e,16)};e.exports=a},function(e,t,r){"use strict";function a(e,t,r,a,n,o,i){if(0===n)return!1;var l=n,s=0,u=e;if(i>t+l&&i>a+l||i<t-l&&i<a-l||o>e+l&&o>r+l||o<e-l&&o<r-l)return!1;if(e===r)return Math.abs(o-e)<=l/2;s=(t-a)/(e-r),u=(e*a-r*t)/(e-r);var h=s*o-i+u;return h*h/(s*s+1)<=l/2*l/2}t.containStroke=a},function(e,t,r){"use strict";function a(e,t){return Math.abs(e-t)<i}function n(e,t,r){var n=0,i=e[0];if(!i)return!1;for(var l=1;l<e.length;l++){var s=e[l];n+=o(i[0],i[1],s[0],s[1],t,r),i=s}var u=e[0];return a(i[0],u[0])&&a(i[1],u[1])||(n+=o(i[0],i[1],u[0],u[1],t,r)),0!==n}var o=r(441),i=1e-8;t.contain=n},function(e,t,r){"use strict";function a(e,t,r,a,n,i,l,s,u){if(0===l)return!1;var h=l;return!(u>t+h&&u>a+h&&u>i+h||u<t-h&&u<a-h&&u<i-h||s>e+h&&s>r+h&&s>n+h||s<e-h&&s<r-h&&s<n-h)&&o(e,t,r,a,n,i,s,u,null)<=h/2}var n=r(75),o=n.quadraticProjectPoint;t.containStroke=a},function(e,t,r){"use strict";function a(e){return e%=n,e<0&&(e+=n),e}var n=2*Math.PI;t.normalizeRadian=a},function(e,t,r){"use strict";function a(e,t,r,a,n,o){if(o>t&&o>a||o<t&&o<a)return 0;if(a===t)return 0;var i=a<t?1:-1,l=(o-t)/(a-t);return 1!==l&&0!==l||(i=a<t?.5:-.5),l*(r-e)+e>n?i:0}e.exports=a},function(e,t,r){"use strict";var a=function(){this.head=null,this.tail=null,this._len=0},n=a.prototype;n.insert=function(e){var t=new o(e);return this.insertEntry(t),t},n.insertEntry=function(e){this.head?(this.tail.next=e,e.prev=this.tail,e.next=null,this.tail=e):this.head=this.tail=e,this._len++},n.remove=function(e){var t=e.prev,r=e.next;t?t.next=r:this.head=r,r?r.prev=t:this.tail=t,e.next=e.prev=null,this._len--},n.len=function(){return this._len},n.clear=function(){this.head=this.tail=null,this._len=0};var o=function(e){this.value=e,this.next,this.prev},i=function(e){this._list=new a,this._map={},this._maxSize=e||10,this._lastRemovedEntry=null},l=i.prototype;l.put=function(e,t){var r=this._list,a=this._map,n=null;if(null==a[e]){var i=r.len(),l=this._lastRemovedEntry;if(i>=this._maxSize&&i>0){var s=r.head;r.remove(s),delete a[s.key],n=s.value,this._lastRemovedEntry=s}l?l.value=t:l=new o(t),l.key=e,r.insertEntry(l),a[e]=l}return n},l.get=function(e){var t=this._map[e],r=this._list;if(null!=t)return t!==r.tail&&(r.remove(t),r.insertEntry(t)),t.value},l.clear=function(){this._list.clear(),this._map={}};var s=i;e.exports=s},function(e,t,r){"use strict";function a(){return n++}var n=2311;e.exports=a},function(e,t,r){"use strict";var a=r(0),n=r(192),o=function(e,t,r,a,o,i){this.x=null==e?0:e,this.y=null==t?0:t,this.x2=null==r?1:r,this.y2=null==a?0:a,this.type="linear",this.global=i||!1,n.call(this,o)};o.prototype={constructor:o},a.inherits(o,n);var i=o;e.exports=i},function(e,t,r){"use strict";var a=function(e,t){this.image=e,this.repeat=t,this.type="pattern"};a.prototype.getCanvasPattern=function(e){return e.createPattern(this.image,this.repeat||"repeat")};var n=a;e.exports=n},function(e,t,r){"use strict";function a(e,t,r){var a=null==t.x?0:t.x,n=null==t.x2?1:t.x2,o=null==t.y?0:t.y,i=null==t.y2?0:t.y2;return t.global||(a=a*r.width+r.x,n=n*r.width+r.x,o=o*r.height+r.y,i=i*r.height+r.y),e.createLinearGradient(a,o,n,i)}function n(e,t,r){var a=r.width,n=r.height,o=Math.min(a,n),i=null==t.x?.5:t.x,l=null==t.y?.5:t.y,s=null==t.r?.5:t.r;return t.global||(i=i*a+r.x,l=l*n+r.y,s*=o),e.createRadialGradient(i,l,0,i,l,s)}var o=[["shadowBlur",0],["shadowOffsetX",0],["shadowOffsetY",0],["shadowColor","#000"],["lineCap","butt"],["lineJoin","miter"],["miterLimit",10]],i=function(e,t){this.extendFrom(e,!1),this.host=t};i.prototype={constructor:i,host:null,fill:"#000",stroke:null,opacity:1,lineDash:null,lineDashOffset:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,lineWidth:1,strokeNoScale:!1,text:null,font:null,textFont:null,fontStyle:null,fontWeight:null,fontSize:null,fontFamily:null,textTag:null,textFill:"#000",textStroke:null,textWidth:null,textHeight:null,textStrokeWidth:0,textLineHeight:null,textPosition:"inside",textRect:null,textOffset:null,textAlign:null,textVerticalAlign:null,textDistance:5,textShadowColor:"transparent",textShadowBlur:0,textShadowOffsetX:0,textShadowOffsetY:0,textBoxShadowColor:"transparent",textBoxShadowBlur:0,textBoxShadowOffsetX:0,textBoxShadowOffsetY:0,transformText:!1,textRotation:0,textOrigin:null,textBackgroundColor:null,textBorderColor:null,textBorderWidth:0,textBorderRadius:0,textPadding:null,rich:null,truncate:null,blend:null,bind:function(e,t,r){for(var a=this,n=r&&r.style,i=!n,l=0;l<o.length;l++){var s=o[l],u=s[0];(i||a[u]!==n[u])&&(e[u]=a[u]||s[1])}if((i||a.fill!==n.fill)&&(e.fillStyle=a.fill),(i||a.stroke!==n.stroke)&&(e.strokeStyle=a.stroke),(i||a.opacity!==n.opacity)&&(e.globalAlpha=null==a.opacity?1:a.opacity),(i||a.blend!==n.blend)&&(e.globalCompositeOperation=a.blend||"source-over"),this.hasStroke()){var h=a.lineWidth;e.lineWidth=h/(this.strokeNoScale&&t&&t.getLineScale?t.getLineScale():1)}},hasFill:function(){var e=this.fill;return null!=e&&"none"!==e},hasStroke:function(){var e=this.stroke;return null!=e&&"none"!==e&&this.lineWidth>0},extendFrom:function(e,t){if(e)for(var r in e)!e.hasOwnProperty(r)||!0!==t&&(!1===t?this.hasOwnProperty(r):null==e[r])||(this[r]=e[r])},set:function(e,t){"string"==typeof e?this[e]=t:this.extendFrom(e,!0)},clone:function(){var e=new this.constructor;return e.extendFrom(this,!0),e},getGradient:function(e,t,r){for(var o="radial"===t.type?n:a,i=o(e,t,r),l=t.colorStops,s=0;s<l.length;s++)i.addColorStop(l[s].offset,l[s].color);return i}};for(var l=i.prototype,s=0;s<o.length;s++){var u=o[s];u[0]in l||(l[u[0]]=u[1])}i.getGradient=l.getGradient;var h=i;e.exports=h},function(e,t,r){"use strict";function a(e){return n.browser.ie&&n.browser.version>=11?function(){var t,r=this.__clipPaths,a=this.style;if(r)for(var n=0;n<r.length;n++){var i=r[n],l=i&&i.shape,s=i&&i.type;if(l&&("sector"===s&&l.startAngle===l.endAngle||"rect"===s&&(!l.width||!l.height))){for(var u=0;u<o.length;u++)o[u][2]=a[o[u][0]],a[o[u][0]]=o[u][1];t=!0;break}}if(e.apply(this,arguments),t)for(var u=0;u<o.length;u++)a[o[u][0]]=o[u][2]}:e}var n=r(25),o=[["shadowBlur",0],["shadowColor","#000"],["shadowOffsetX",0],["shadowOffsetY",0]];e.exports=a},function(e,t,r){"use strict";function a(e,t,r){var a=t.points,i=t.smooth;if(a&&a.length>=2){if(i&&"spline"!==i){var l=o(a,i,r,t.smoothConstraint);e.moveTo(a[0][0],a[0][1]);for(var s=a.length,u=0;u<(r?s:s-1);u++){var h=l[2*u],c=l[2*u+1],d=a[(u+1)%s];e.bezierCurveTo(h[0],h[1],c[0],c[1],d[0],d[1])}}else{"spline"===i&&(a=n(a,r)),e.moveTo(a[0][0],a[0][1]);for(var u=1,m=a.length;u<m;u++)e.lineTo(a[u][0],a[u][1])}r&&e.closePath()}}var n=r(1205),o=r(1204);t.buildPath=a},function(e,t,r){"use strict";function a(e,t){var r,a,n,o,i=t.x,l=t.y,s=t.width,u=t.height,h=t.r;s<0&&(i+=s,s=-s),u<0&&(l+=u,u=-u),"number"==typeof h?r=a=n=o=h:h instanceof Array?1===h.length?r=a=n=o=h[0]:2===h.length?(r=n=h[0],a=o=h[1]):3===h.length?(r=h[0],a=o=h[1],n=h[2]):(r=h[0],a=h[1],n=h[2],o=h[3]):r=a=n=o=0;var c;r+a>s&&(c=r+a,r*=s/c,a*=s/c),n+o>s&&(c=n+o,n*=s/c,o*=s/c),a+n>u&&(c=a+n,a*=u/c,n*=u/c),r+o>u&&(c=r+o,r*=u/c,o*=u/c),e.moveTo(i+r,l),e.lineTo(i+s-a,l),0!==a&&e.quadraticCurveTo(i+s,l,i+s,l+a),e.lineTo(i+s,l+u-n),0!==n&&e.quadraticCurveTo(i+s,l+u,i+s-n,l+u),e.lineTo(i+o,l+u),0!==o&&e.quadraticCurveTo(i,l+u,i,l+u-o),e.lineTo(i,l+r),0!==r&&e.quadraticCurveTo(i,l,i+r,l)}t.buildPath=a},function(e,t,r){"use strict";var a=r(193),n=r(19),o=new n,i=function(){};i.prototype={constructor:i,drawRectText:function(e,t){var r=this.style;t=r.textRect||t,this.__dirty&&a.normalizeTextStyle(r,!0);var n=r.text;if(null!=n&&(n+=""),a.needDrawText(n,r)){e.save();var i=this.transform;r.transformText?this.setTransform(e):i&&(o.copy(t),o.applyTransform(i),t=o),a.renderText(this,e,n,r,t),e.restore()}}};var l=i;e.exports=l},function(e,t,r){"use strict";function a(e,t,r){this._svgRoot=e,this._tagNames="string"==typeof t?[t]:t,this._markLabel=r,this.nextId=0}var n=r(278),o=n.createElement,i=r(0),l=r(26),s=r(140),u=r(141),h=r(279),c=h.path,d=h.image,m=h.text;a.prototype.createElement=o,a.prototype.getDefs=function(e){var t=this._svgRoot,r=this._svgRoot.getElementsByTagName("defs");return 0===r.length?e?(r=t.insertBefore(this.createElement("defs"),t.firstChild),r.contains||(r.contains=function(e){var t=r.children;if(!t)return!1;for(var a=t.length-1;a>=0;--a)if(t[a]===e)return!0;return!1}),r):null:r[0]},a.prototype.update=function(e,t){if(e){var r=this.getDefs(!1);if(e._dom&&r.contains(e._dom))"function"==typeof t&&t();else{var a=this.add(e);a&&(e._dom=a)}}},a.prototype.addDom=function(e){this.getDefs(!0).appendChild(e)},a.prototype.removeDom=function(e){this.getDefs(!1).removeChild(e._dom)},a.prototype.getDoms=function(){var e=this.getDefs(!1);if(!e)return[];var t=[];return i.each(this._tagNames,function(r){var a=e.getElementsByTagName(r);t=t.concat([].slice.call(a))}),t},a.prototype.markAllUnused=function(){var e=this.getDoms(),t=this;i.each(e,function(e){e[t._markLabel]="0"})},a.prototype.markUsed=function(e){e&&(e[this._markLabel]="1")},a.prototype.removeUnused=function(){var e=this.getDefs(!1);if(e){var t=this.getDoms(),r=this;i.each(t,function(t){"1"!==t[r._markLabel]&&e.removeChild(t)})}},a.prototype.getSvgProxy=function(e){return e instanceof l?c:e instanceof s?d:e instanceof u?m:c},a.prototype.getTextSvgElement=function(e){return e.__textSvgEl},a.prototype.getSvgElement=function(e){return e.__svgEl};var p=a;e.exports=p},function(e,t,r){"use strict";function a(e){return o(e)}function n(){if(!u&&h){u=!0;var e=h.styleSheets;e.length<31?h.createStyleSheet().addRule(".zrvml","behavior:url(#default#VML)"):e[0].addRule(".zrvml","behavior:url(#default#VML)")}}var o,i=r(25),l="urn:schemas-microsoft-com:vml",s="undefined"==typeof window?null:window,u=!1,h=s&&s.document;if(h&&!i.canvasSupported)try{!h.namespaces.zrvml&&h.namespaces.add("zrvml",l),o=function(e){return h.createElement("<zrvml:"+e+' class="zrvml">')}}catch(e){o=function(e){return h.createElement("<"+e+' xmlns="'+l+'" class="zrvml">')}}t.doc=h,t.createNode=a,t.initVML=n},function(e,t,r){"use strict";(function(e){function t(e,t,r){e[t]||Object[a](e,t,{writable:!0,configurable:!0,value:r})}if(r(721),r(470),r(482),e._babelPolyfill)throw new Error("only one instance of babel-polyfill is allowed");e._babelPolyfill=!0;var a="defineProperty";t(String.prototype,"padLeft","".padStart),t(String.prototype,"padRight","".padEnd),"pop,reverse,shift,keys,values,entries,indexOf,every,some,forEach,map,filter,find,findIndex,includes,join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill".split(",").forEach(function(e){[][e]&&t(Array,e,Function.call.bind([][e]))})}).call(t,r(61))},function(e,t,r){"use strict";var a=r(2);!function(){for(var e in a){if(null==a||!a.hasOwnProperty(e)||"default"===e||"__esModule"===e)return;t[e]=a[e]}}();var n=r(375);!function(){for(var e in n){if(null==n||!n.hasOwnProperty(e)||"default"===e||"__esModule"===e)return;t[e]=n[e]}}(),r(779),r(727),r(800),r(815),r(805),r(788),r(823),r(830),r(756),r(752),r(748),r(795),r(810),r(733),r(738),r(745),r(783),r(769),r(799),r(818),r(744),r(871),r(872),r(879),r(913),r(130),r(890),r(869),r(358),r(359),r(850),r(857),r(903),r(859),r(917),r(882),r(881),r(880),r(894),r(904),r(1225),r(1220)},function(e,t,r){"use strict";var a,n,o="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};!function(i,l){"object"===o(t)&&void 0!==e?e.exports=l():(a=l,void 0!==(n="function"==typeof a?a.call(t,r,t,e):a)&&(e.exports=n))}(0,function(){function e(e,t){t&&(e.prototype=Object.create(t.prototype)),e.prototype.constructor=e}function t(e){return i(e)?e:A(e)}function r(e){return l(e)?e:I(e)}function a(e){return s(e)?e:z(e)}function n(e){return i(e)&&!u(e)?e:C(e)}function i(e){return!(!e||!e[ur])}function l(e){return!(!e||!e[hr])}function s(e){return!(!e||!e[cr])}function u(e){return l(e)||s(e)}function h(e){return!(!e||!e[dr])}function c(e){return e.value=!1,e}function d(e){e&&(e.value=!0)}function m(){}function p(e,t){t=t||0;for(var r=Math.max(0,e.length-t),a=new Array(r),n=0;n<r;n++)a[n]=e[n+t];return a}function f(e){return void 0===e.size&&(e.size=e.__iterate(y)),e.size}function v(e,t){if("number"!=typeof t){var r=t>>>0;if(""+r!==t||4294967295===r)return NaN;t=r}return t<0?f(e)+t:t}function y(){return!0}function g(e,t,r){return(0===e||void 0!==r&&e<=-r)&&(void 0===t||void 0!==r&&t>=r)}function _(e,t){return x(e,t,0)}function T(e,t){return x(e,t,t)}function x(e,t,r){return void 0===e?r:e<0?Math.max(0,t+e):void 0===t?e:Math.min(t,e)}function w(e){this.next=e}function N(e,t,r,a){var n=0===e?t:1===e?r:[t,r];return a?a.value=n:a={value:n,done:!1},a}function b(){return{value:void 0,done:!0}}function L(e){return!!D(e)}function S(e){return e&&"function"==typeof e.next}function k(e){var t=D(e);return t&&t.call(e)}function D(e){var t=e&&(wr&&e[wr]||e[Nr]);if("function"==typeof t)return t}function M(e){return e&&"number"==typeof e.length}function A(e){return null===e||void 0===e?j():i(e)?e.toSeq():V(e)}function I(e){return null===e||void 0===e?j().toKeyedSeq():i(e)?l(e)?e.toSeq():e.fromEntrySeq():B(e)}function z(e){return null===e||void 0===e?j():i(e)?l(e)?e.entrySeq():e.toIndexedSeq():H(e)}function C(e){return(null===e||void 0===e?j():i(e)?l(e)?e.entrySeq():e:H(e)).toSetSeq()}function R(e){this._array=e,this.size=e.length}function E(e){var t=Object.keys(e);this._object=e,this._keys=t,this.size=t.length}function P(e){this._iterable=e,this.size=e.length||e.size}function O(e){this._iterator=e,this._iteratorCache=[]}function F(e){return!(!e||!e[Lr])}function j(){return Sr||(Sr=new R([]))}function B(e){var t=Array.isArray(e)?new R(e).fromEntrySeq():S(e)?new O(e).fromEntrySeq():L(e)?new P(e).fromEntrySeq():"object"===(void 0===e?"undefined":o(e))?new E(e):void 0;if(!t)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+e);return t}function H(e){var t=G(e);if(!t)throw new TypeError("Expected Array or iterable object of values: "+e);return t}function V(e){var t=G(e)||"object"===(void 0===e?"undefined":o(e))&&new E(e);if(!t)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+e);return t}function G(e){return M(e)?new R(e):S(e)?new O(e):L(e)?new P(e):void 0}function W(e,t,r,a){var n=e._cache;if(n){for(var o=n.length-1,i=0;i<=o;i++){var l=n[r?o-i:i];if(!1===t(l[1],a?l[0]:i,e))return i+1}return i}return e.__iterateUncached(t,r)}function U(e,t,r,a){var n=e._cache;if(n){var o=n.length-1,i=0;return new w(function(){var e=n[r?o-i:i];return i++>o?b():N(t,a?e[0]:i-1,e[1])})}return e.__iteratorUncached(t,r)}function q(e,t){return t?Y(t,e,"",{"":e}):Z(e)}function Y(e,t,r,a){return Array.isArray(t)?e.call(a,r,z(t).map(function(r,a){return Y(e,r,a,t)})):K(t)?e.call(a,r,I(t).map(function(r,a){return Y(e,r,a,t)})):t}function Z(e){return Array.isArray(e)?z(e).map(Z).toList():K(e)?I(e).map(Z).toMap():e}function K(e){return e&&(e.constructor===Object||void 0===e.constructor)}function J(e,t){if(e===t||e!==e&&t!==t)return!0;if(!e||!t)return!1;if("function"==typeof e.valueOf&&"function"==typeof t.valueOf){if(e=e.valueOf(),t=t.valueOf(),e===t||e!==e&&t!==t)return!0;if(!e||!t)return!1}return!("function"!=typeof e.equals||"function"!=typeof t.equals||!e.equals(t))}function X(e,t){if(e===t)return!0;if(!i(t)||void 0!==e.size&&void 0!==t.size&&e.size!==t.size||void 0!==e.__hash&&void 0!==t.__hash&&e.__hash!==t.__hash||l(e)!==l(t)||s(e)!==s(t)||h(e)!==h(t))return!1;if(0===e.size&&0===t.size)return!0;var r=!u(e);if(h(e)){var a=e.entries();return t.every(function(e,t){var n=a.next().value;return n&&J(n[1],e)&&(r||J(n[0],t))})&&a.next().done}var n=!1;if(void 0===e.size)if(void 0===t.size)"function"==typeof e.cacheResult&&e.cacheResult();else{n=!0;var o=e;e=t,t=o}var c=!0,d=t.__iterate(function(t,a){if(r?!e.has(t):n?!J(t,e.get(a,vr)):!J(e.get(a,vr),t))return c=!1,!1});return c&&e.size===d}function $(e,t){if(!(this instanceof $))return new $(e,t);if(this._value=e,this.size=void 0===t?1/0:Math.max(0,t),0===this.size){if(kr)return kr;kr=this}}function Q(e,t){if(!e)throw new Error(t)}function ee(e,t,r){if(!(this instanceof ee))return new ee(e,t,r);if(Q(0!==r,"Cannot step a Range by 0"),e=e||0,void 0===t&&(t=1/0),r=void 0===r?1:Math.abs(r),t<e&&(r=-r),this._start=e,this._end=t,this._step=r,this.size=Math.max(0,Math.ceil((t-e)/r-1)+1),0===this.size){if(Dr)return Dr;Dr=this}}function te(){throw TypeError("Abstract")}function re(){}function ae(){}function ne(){}function oe(e){return e>>>1&1073741824|3221225471&e}function ie(e){if(!1===e||null===e||void 0===e)return 0;if("function"==typeof e.valueOf&&(!1===(e=e.valueOf())||null===e||void 0===e))return 0;if(!0===e)return 1;var t=void 0===e?"undefined":o(e);if("number"===t){if(e!==e||e===1/0)return 0;var r=0|e;for(r!==e&&(r^=4294967295*e);e>4294967295;)e/=4294967295,r^=e;return oe(r)}if("string"===t)return e.length>Pr?le(e):se(e);if("function"==typeof e.hashCode)return e.hashCode();if("object"===t)return ue(e);if("function"==typeof e.toString)return se(e.toString());throw new Error("Value type "+t+" cannot be hashed.")}function le(e){var t=jr[e];return void 0===t&&(t=se(e),Fr===Or&&(Fr=0,jr={}),Fr++,jr[e]=t),t}function se(e){for(var t=0,r=0;r<e.length;r++)t=31*t+e.charCodeAt(r)|0;return oe(t)}function ue(e){var t;if(Cr&&void 0!==(t=Mr.get(e)))return t;if(void 0!==(t=e[Er]))return t;if(!zr){if(void 0!==(t=e.propertyIsEnumerable&&e.propertyIsEnumerable[Er]))return t;if(void 0!==(t=he(e)))return t}if(t=++Rr,1073741824&Rr&&(Rr=0),Cr)Mr.set(e,t);else{if(void 0!==Ir&&!1===Ir(e))throw new Error("Non-extensible objects are not allowed as keys.");if(zr)Object.defineProperty(e,Er,{enumerable:!1,configurable:!1,writable:!1,value:t});else if(void 0!==e.propertyIsEnumerable&&e.propertyIsEnumerable===e.constructor.prototype.propertyIsEnumerable)e.propertyIsEnumerable=function(){return this.constructor.prototype.propertyIsEnumerable.apply(this,arguments)},e.propertyIsEnumerable[Er]=t;else{if(void 0===e.nodeType)throw new Error("Unable to set a non-enumerable property on object.");e[Er]=t}}return t}function he(e){if(e&&e.nodeType>0)switch(e.nodeType){case 1:return e.uniqueID;case 9:return e.documentElement&&e.documentElement.uniqueID}}function ce(e){Q(e!==1/0,"Cannot perform this action with an infinite size.")}function de(e){return null===e||void 0===e?Ne():me(e)&&!h(e)?e:Ne().withMutations(function(t){var a=r(e);ce(a.size),a.forEach(function(e,r){return t.set(r,e)})})}function me(e){return!(!e||!e[Br])}function pe(e,t){this.ownerID=e,this.entries=t}function fe(e,t,r){this.ownerID=e,this.bitmap=t,this.nodes=r}function ve(e,t,r){this.ownerID=e,this.count=t,this.nodes=r}function ye(e,t,r){this.ownerID=e,this.keyHash=t,this.entries=r}function ge(e,t,r){this.ownerID=e,this.keyHash=t,this.entry=r}function _e(e,t,r){this._type=t,this._reverse=r,this._stack=e._root&&xe(e._root)}function Te(e,t){return N(e,t[0],t[1])}function xe(e,t){return{node:e,index:0,__prev:t}}function we(e,t,r,a){var n=Object.create(Hr);return n.size=e,n._root=t,n.__ownerID=r,n.__hash=a,n.__altered=!1,n}function Ne(){return Vr||(Vr=we(0))}function be(e,t,r){var a,n;if(e._root){var o=c(yr),i=c(gr);if(a=Le(e._root,e.__ownerID,0,void 0,t,r,o,i),!i.value)return e;n=e.size+(o.value?r===vr?-1:1:0)}else{if(r===vr)return e;n=1,a=new pe(e.__ownerID,[[t,r]])}return e.__ownerID?(e.size=n,e._root=a,e.__hash=void 0,e.__altered=!0,e):a?we(n,a):Ne()}function Le(e,t,r,a,n,o,i,l){return e?e.update(t,r,a,n,o,i,l):o===vr?e:(d(l),d(i),new ge(t,a,[n,o]))}function Se(e){return e.constructor===ge||e.constructor===ye}function ke(e,t,r,a,n){if(e.keyHash===a)return new ye(t,a,[e.entry,n]);var o,i=(0===r?e.keyHash:e.keyHash>>>r)&fr,l=(0===r?a:a>>>r)&fr;return new fe(t,1<<i|1<<l,i===l?[ke(e,t,r+mr,a,n)]:(o=new ge(t,a,n),i<l?[e,o]:[o,e]))}function De(e,t,r,a){e||(e=new m);for(var n=new ge(e,ie(r),[r,a]),o=0;o<t.length;o++){var i=t[o];n=n.update(e,0,void 0,i[0],i[1])}return n}function Me(e,t,r,a){for(var n=0,o=0,i=new Array(r),l=0,s=1,u=t.length;l<u;l++,s<<=1){var h=t[l];void 0!==h&&l!==a&&(n|=s,i[o++]=h)}return new fe(e,n,i)}function Ae(e,t,r,a,n){for(var o=0,i=new Array(pr),l=0;0!==r;l++,r>>>=1)i[l]=1&r?t[o++]:void 0;return i[a]=n,new ve(e,o+1,i)}function Ie(e,t,a){for(var n=[],o=0;o<a.length;o++){var l=a[o],s=r(l);i(l)||(s=s.map(function(e){return q(e)})),n.push(s)}return Re(e,t,n)}function ze(e,t,r){return e&&e.mergeDeep&&i(t)?e.mergeDeep(t):J(e,t)?e:t}function Ce(e){return function(t,r,a){if(t&&t.mergeDeepWith&&i(r))return t.mergeDeepWith(e,r);var n=e(t,r,a);return J(t,n)?t:n}}function Re(e,t,r){return r=r.filter(function(e){return 0!==e.size}),0===r.length?e:0!==e.size||e.__ownerID||1!==r.length?e.withMutations(function(e){for(var a=t?function(r,a){e.update(a,vr,function(e){return e===vr?r:t(e,r,a)})}:function(t,r){e.set(r,t)},n=0;n<r.length;n++)r[n].forEach(a)}):e.constructor(r[0])}function Ee(e,t,r,a){var n=e===vr,o=t.next();if(o.done){var i=n?r:e,l=a(i);return l===i?e:l}Q(n||e&&e.set,"invalid keyPath");var s=o.value,u=n?vr:e.get(s,vr),h=Ee(u,t,r,a);return h===u?e:h===vr?e.remove(s):(n?Ne():e).set(s,h)}function Pe(e){return e-=e>>1&1431655765,e=(858993459&e)+(e>>2&858993459),e=e+(e>>4)&252645135,e+=e>>8,127&(e+=e>>16)}function Oe(e,t,r,a){var n=a?e:p(e);return n[t]=r,n}function Fe(e,t,r,a){var n=e.length+1;if(a&&t+1===n)return e[t]=r,e;for(var o=new Array(n),i=0,l=0;l<n;l++)l===t?(o[l]=r,i=-1):o[l]=e[l+i];return o}function je(e,t,r){var a=e.length-1;if(r&&t===a)return e.pop(),e;for(var n=new Array(a),o=0,i=0;i<a;i++)i===t&&(o=1),n[i]=e[i+o];return n}function Be(e){var t=Ue();if(null===e||void 0===e)return t;if(He(e))return e;var r=a(e),n=r.size;return 0===n?t:(ce(n),n>0&&n<pr?We(0,n,mr,null,new Ve(r.toArray())):t.withMutations(function(e){e.setSize(n),r.forEach(function(t,r){return e.set(r,t)})}))}function He(e){return!(!e||!e[qr])}function Ve(e,t){this.array=e,this.ownerID=t}function Ge(e,t){function r(e,t,r){return 0===t?a(e,r):n(e,t,r)}function a(e,r){var a=r===l?s&&s.array:e&&e.array,n=r>o?0:o-r,u=i-r;return u>pr&&(u=pr),function(){if(n===u)return Kr;var e=t?--u:n++;return a&&a[e]}}function n(e,a,n){var l,s=e&&e.array,u=n>o?0:o-n>>a,h=1+(i-n>>a);return h>pr&&(h=pr),function(){for(;;){if(l){var e=l();if(e!==Kr)return e;l=null}if(u===h)return Kr;var o=t?--h:u++;l=r(s&&s[o],a-mr,n+(o<<a))}}}var o=e._origin,i=e._capacity,l=$e(i),s=e._tail;return r(e._root,e._level,0)}function We(e,t,r,a,n,o,i){var l=Object.create(Yr);return l.size=t-e,l._origin=e,l._capacity=t,l._level=r,l._root=a,l._tail=n,l.__ownerID=o,l.__hash=i,l.__altered=!1,l}function Ue(){return Zr||(Zr=We(0,0,mr))}function qe(e,t,r){if((t=v(e,t))!==t)return e;if(t>=e.size||t<0)return e.withMutations(function(e){t<0?Je(e,t).set(0,r):Je(e,0,t+1).set(t,r)});t+=e._origin;var a=e._tail,n=e._root,o=c(gr);return t>=$e(e._capacity)?a=Ye(a,e.__ownerID,0,t,r,o):n=Ye(n,e.__ownerID,e._level,t,r,o),o.value?e.__ownerID?(e._root=n,e._tail=a,e.__hash=void 0,e.__altered=!0,e):We(e._origin,e._capacity,e._level,n,a):e}function Ye(e,t,r,a,n,o){var i=a>>>r&fr,l=e&&i<e.array.length;if(!l&&void 0===n)return e;var s;if(r>0){var u=e&&e.array[i],h=Ye(u,t,r-mr,a,n,o);return h===u?e:(s=Ze(e,t),s.array[i]=h,s)}return l&&e.array[i]===n?e:(d(o),s=Ze(e,t),void 0===n&&i===s.array.length-1?s.array.pop():s.array[i]=n,s)}function Ze(e,t){return t&&e&&t===e.ownerID?e:new Ve(e?e.array.slice():[],t)}function Ke(e,t){if(t>=$e(e._capacity))return e._tail;if(t<1<<e._level+mr){for(var r=e._root,a=e._level;r&&a>0;)r=r.array[t>>>a&fr],a-=mr;return r}}function Je(e,t,r){void 0!==t&&(t|=0),void 0!==r&&(r|=0);var a=e.__ownerID||new m,n=e._origin,o=e._capacity,i=n+t,l=void 0===r?o:r<0?o+r:n+r;if(i===n&&l===o)return e;if(i>=l)return e.clear();for(var s=e._level,u=e._root,h=0;i+h<0;)u=new Ve(u&&u.array.length?[void 0,u]:[],a),s+=mr,h+=1<<s;h&&(i+=h,n+=h,l+=h,o+=h);for(var c=$e(o),d=$e(l);d>=1<<s+mr;)u=new Ve(u&&u.array.length?[u]:[],a),s+=mr;var p=e._tail,f=d<c?Ke(e,l-1):d>c?new Ve([],a):p;if(p&&d>c&&i<o&&p.array.length){u=Ze(u,a);for(var v=u,y=s;y>mr;y-=mr){var g=c>>>y&fr;v=v.array[g]=Ze(v.array[g],a)}v.array[c>>>mr&fr]=p}if(l<o&&(f=f&&f.removeAfter(a,0,l)),i>=d)i-=d,l-=d,s=mr,u=null,f=f&&f.removeBefore(a,0,i);else if(i>n||d<c){for(h=0;u;){var _=i>>>s&fr;if(_!==d>>>s&fr)break;_&&(h+=(1<<s)*_),s-=mr,u=u.array[_]}u&&i>n&&(u=u.removeBefore(a,s,i-h)),u&&d<c&&(u=u.removeAfter(a,s,d-h)),h&&(i-=h,l-=h)}return e.__ownerID?(e.size=l-i,e._origin=i,e._capacity=l,e._level=s,e._root=u,e._tail=f,e.__hash=void 0,e.__altered=!0,e):We(i,l,s,u,f)}function Xe(e,t,r){for(var n=[],o=0,l=0;l<r.length;l++){var s=r[l],u=a(s);u.size>o&&(o=u.size),i(s)||(u=u.map(function(e){return q(e)})),n.push(u)}return o>e.size&&(e=e.setSize(o)),Re(e,t,n)}function $e(e){return e<pr?0:e-1>>>mr<<mr}function Qe(e){return null===e||void 0===e?rt():et(e)?e:rt().withMutations(function(t){var a=r(e);ce(a.size),a.forEach(function(e,r){return t.set(r,e)})})}function et(e){return me(e)&&h(e)}function tt(e,t,r,a){var n=Object.create(Qe.prototype);return n.size=e?e.size:0,n._map=e,n._list=t,n.__ownerID=r,n.__hash=a,n}function rt(){return Jr||(Jr=tt(Ne(),Ue()))}function at(e,t,r){var a,n,o=e._map,i=e._list,l=o.get(t),s=void 0!==l;if(r===vr){if(!s)return e;i.size>=pr&&i.size>=2*o.size?(n=i.filter(function(e,t){return void 0!==e&&l!==t}),a=n.toKeyedSeq().map(function(e){return e[0]}).flip().toMap(),e.__ownerID&&(a.__ownerID=n.__ownerID=e.__ownerID)):(a=o.remove(t),n=l===i.size-1?i.pop():i.set(l,void 0))}else if(s){if(r===i.get(l)[1])return e;a=o,n=i.set(l,[t,r])}else a=o.set(t,i.size),n=i.set(i.size,[t,r]);return e.__ownerID?(e.size=a.size,e._map=a,e._list=n,e.__hash=void 0,e):tt(a,n)}function nt(e,t){this._iter=e,this._useKeys=t,this.size=e.size}function ot(e){this._iter=e,this.size=e.size}function it(e){this._iter=e,this.size=e.size}function lt(e){this._iter=e,this.size=e.size}function st(e){var t=Mt(e);return t._iter=e,t.size=e.size,t.flip=function(){return e},t.reverse=function(){var t=e.reverse.apply(this);return t.flip=function(){return e.reverse()},t},t.has=function(t){return e.includes(t)},t.includes=function(t){return e.has(t)},t.cacheResult=At,t.__iterateUncached=function(t,r){var a=this;return e.__iterate(function(e,r){return!1!==t(r,e,a)},r)},t.__iteratorUncached=function(t,r){if(t===xr){var a=e.__iterator(t,r);return new w(function(){var e=a.next();if(!e.done){var t=e.value[0];e.value[0]=e.value[1],e.value[1]=t}return e})}return e.__iterator(t===Tr?_r:Tr,r)},t}function ut(e,t,r){var a=Mt(e);return a.size=e.size,a.has=function(t){return e.has(t)},a.get=function(a,n){var o=e.get(a,vr);return o===vr?n:t.call(r,o,a,e)},a.__iterateUncached=function(a,n){var o=this;return e.__iterate(function(e,n,i){return!1!==a(t.call(r,e,n,i),n,o)},n)},a.__iteratorUncached=function(a,n){var o=e.__iterator(xr,n);return new w(function(){var n=o.next();if(n.done)return n;var i=n.value,l=i[0];return N(a,l,t.call(r,i[1],l,e),n)})},a}function ht(e,t){var r=Mt(e);return r._iter=e,r.size=e.size,r.reverse=function(){return e},e.flip&&(r.flip=function(){var t=st(e);return t.reverse=function(){return e.flip()},t}),r.get=function(r,a){return e.get(t?r:-1-r,a)},r.has=function(r){return e.has(t?r:-1-r)},r.includes=function(t){return e.includes(t)},r.cacheResult=At,r.__iterate=function(t,r){var a=this;return e.__iterate(function(e,r){return t(e,r,a)},!r)},r.__iterator=function(t,r){return e.__iterator(t,!r)},r}function ct(e,t,r,a){var n=Mt(e);return a&&(n.has=function(a){var n=e.get(a,vr);return n!==vr&&!!t.call(r,n,a,e)},n.get=function(a,n){var o=e.get(a,vr);return o!==vr&&t.call(r,o,a,e)?o:n}),n.__iterateUncached=function(n,o){var i=this,l=0;return e.__iterate(function(e,o,s){if(t.call(r,e,o,s))return l++,n(e,a?o:l-1,i)},o),l},n.__iteratorUncached=function(n,o){var i=e.__iterator(xr,o),l=0;return new w(function(){for(;;){var o=i.next();if(o.done)return o;var s=o.value,u=s[0],h=s[1];if(t.call(r,h,u,e))return N(n,a?u:l++,h,o)}})},n}function dt(e,t,r){var a=de().asMutable();return e.__iterate(function(n,o){a.update(t.call(r,n,o,e),0,function(e){return e+1})}),a.asImmutable()}function mt(e,t,r){var a=l(e),n=(h(e)?Qe():de()).asMutable();e.__iterate(function(o,i){n.update(t.call(r,o,i,e),function(e){return e=e||[],e.push(a?[i,o]:o),e})});var o=Dt(e);return n.map(function(t){return Lt(e,o(t))})}function pt(e,t,r,a){var n=e.size;if(void 0!==t&&(t|=0),void 0!==r&&(r===1/0?r=n:r|=0),g(t,r,n))return e;var o=_(t,n),i=T(r,n);if(o!==o||i!==i)return pt(e.toSeq().cacheResult(),t,r,a);var l,s=i-o;s===s&&(l=s<0?0:s);var u=Mt(e);return u.size=0===l?l:e.size&&l||void 0,!a&&F(e)&&l>=0&&(u.get=function(t,r){return t=v(this,t),t>=0&&t<l?e.get(t+o,r):r}),u.__iterateUncached=function(t,r){var n=this;if(0===l)return 0;if(r)return this.cacheResult().__iterate(t,r);var i=0,s=!0,u=0;return e.__iterate(function(e,r){if(!s||!(s=i++<o))return u++,!1!==t(e,a?r:u-1,n)&&u!==l}),u},u.__iteratorUncached=function(t,r){if(0!==l&&r)return this.cacheResult().__iterator(t,r);var n=0!==l&&e.__iterator(t,r),i=0,s=0;return new w(function(){for(;i++<o;)n.next();if(++s>l)return b();var e=n.next();return a||t===Tr?e:t===_r?N(t,s-1,void 0,e):N(t,s-1,e.value[1],e)})},u}function ft(e,t,r){var a=Mt(e);return a.__iterateUncached=function(a,n){var o=this;if(n)return this.cacheResult().__iterate(a,n);var i=0;return e.__iterate(function(e,n,l){return t.call(r,e,n,l)&&++i&&a(e,n,o)}),i},a.__iteratorUncached=function(a,n){var o=this;if(n)return this.cacheResult().__iterator(a,n);var i=e.__iterator(xr,n),l=!0;return new w(function(){if(!l)return b();var e=i.next();if(e.done)return e;var n=e.value,s=n[0],u=n[1];return t.call(r,u,s,o)?a===xr?e:N(a,s,u,e):(l=!1,b())})},a}function vt(e,t,r,a){var n=Mt(e);return n.__iterateUncached=function(n,o){var i=this;if(o)return this.cacheResult().__iterate(n,o);var l=!0,s=0;return e.__iterate(function(e,o,u){if(!l||!(l=t.call(r,e,o,u)))return s++,n(e,a?o:s-1,i)}),s},n.__iteratorUncached=function(n,o){var i=this;if(o)return this.cacheResult().__iterator(n,o);var l=e.__iterator(xr,o),s=!0,u=0;return new w(function(){var e,o,h;do{if(e=l.next(),e.done)return a||n===Tr?e:n===_r?N(n,u++,void 0,e):N(n,u++,e.value[1],e);var c=e.value;o=c[0],h=c[1],s&&(s=t.call(r,h,o,i))}while(s);return n===xr?e:N(n,o,h,e)})},n}function yt(e,t){var a=l(e),n=[e].concat(t).map(function(e){return i(e)?a&&(e=r(e)):e=a?B(e):H(Array.isArray(e)?e:[e]),e}).filter(function(e){return 0!==e.size});if(0===n.length)return e;if(1===n.length){var o=n[0];if(o===e||a&&l(o)||s(e)&&s(o))return o}var u=new R(n);return a?u=u.toKeyedSeq():s(e)||(u=u.toSetSeq()),u=u.flatten(!0),u.size=n.reduce(function(e,t){if(void 0!==e){var r=t.size;if(void 0!==r)return e+r}},0),u}function gt(e,t,r){var a=Mt(e);return a.__iterateUncached=function(a,n){function o(e,u){var h=this;e.__iterate(function(e,n){return(!t||u<t)&&i(e)?o(e,u+1):!1===a(e,r?n:l++,h)&&(s=!0),!s},n)}var l=0,s=!1;return o(e,0),l},a.__iteratorUncached=function(a,n){var o=e.__iterator(a,n),l=[],s=0;return new w(function(){for(;o;){var e=o.next();if(!1===e.done){var u=e.value;if(a===xr&&(u=u[1]),t&&!(l.length<t)||!i(u))return r?e:N(a,s++,u,e);l.push(o),o=u.__iterator(a,n)}else o=l.pop()}return b()})},a}function _t(e,t,r){var a=Dt(e);return e.toSeq().map(function(n,o){return a(t.call(r,n,o,e))}).flatten(!0)}function Tt(e,t){var r=Mt(e);return r.size=e.size&&2*e.size-1,r.__iterateUncached=function(r,a){var n=this,o=0;return e.__iterate(function(e,a){return(!o||!1!==r(t,o++,n))&&!1!==r(e,o++,n)},a),o},r.__iteratorUncached=function(r,a){var n,o=e.__iterator(Tr,a),i=0;return new w(function(){return(!n||i%2)&&(n=o.next(),n.done)?n:i%2?N(r,i++,t):N(r,i++,n.value,n)})},r}function xt(e,t,r){t||(t=It);var a=l(e),n=0,o=e.toSeq().map(function(t,a){return[a,t,n++,r?r(t,a,e):t]}).toArray();return o.sort(function(e,r){return t(e[3],r[3])||e[2]-r[2]}).forEach(a?function(e,t){o[t].length=2}:function(e,t){o[t]=e[1]}),a?I(o):s(e)?z(o):C(o)}function wt(e,t,r){if(t||(t=It),r){var a=e.toSeq().map(function(t,a){return[t,r(t,a,e)]}).reduce(function(e,r){return Nt(t,e[1],r[1])?r:e});return a&&a[0]}return e.reduce(function(e,r){return Nt(t,e,r)?r:e})}function Nt(e,t,r){var a=e(r,t);return 0===a&&r!==t&&(void 0===r||null===r||r!==r)||a>0}function bt(e,r,a){var n=Mt(e);return n.size=new R(a).map(function(e){return e.size}).min(),n.__iterate=function(e,t){for(var r,a=this.__iterator(Tr,t),n=0;!(r=a.next()).done&&!1!==e(r.value,n++,this););return n},n.__iteratorUncached=function(e,n){var o=a.map(function(e){return e=t(e),k(n?e.reverse():e)}),i=0,l=!1;return new w(function(){var t;return l||(t=o.map(function(e){return e.next()}),l=t.some(function(e){return e.done})),l?b():N(e,i++,r.apply(null,t.map(function(e){return e.value})))})},n}function Lt(e,t){return F(e)?t:e.constructor(t)}function St(e){if(e!==Object(e))throw new TypeError("Expected [K, V] tuple: "+e)}function kt(e){return ce(e.size),f(e)}function Dt(e){return l(e)?r:s(e)?a:n}function Mt(e){return Object.create((l(e)?I:s(e)?z:C).prototype)}function At(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):A.prototype.cacheResult.call(this)}function It(e,t){return e>t?1:e<t?-1:0}function zt(e){var r=k(e);if(!r){if(!M(e))throw new TypeError("Expected iterable or array-like: "+e);r=k(t(e))}return r}function Ct(e,t){var r,a=function(o){if(o instanceof a)return o;if(!(this instanceof a))return new a(o);if(!r){r=!0;var i=Object.keys(e);Pt(n,i),n.size=i.length,n._name=t,n._keys=i,n._defaultValues=e}this._map=de(o)},n=a.prototype=Object.create(Xr);return n.constructor=a,a}function Rt(e,t,r){var a=Object.create(Object.getPrototypeOf(e));return a._map=t,a.__ownerID=r,a}function Et(e){return e._name||e.constructor.name||"Record"}function Pt(e,t){try{t.forEach(Ot.bind(void 0,e))}catch(e){}}function Ot(e,t){Object.defineProperty(e,t,{get:function(){return this.get(t)},set:function(e){Q(this.__ownerID,"Cannot set on an immutable record."),this.set(t,e)}})}function Ft(e){return null===e||void 0===e?Vt():jt(e)&&!h(e)?e:Vt().withMutations(function(t){var r=n(e);ce(r.size),r.forEach(function(e){return t.add(e)})})}function jt(e){return!(!e||!e[$r])}function Bt(e,t){return e.__ownerID?(e.size=t.size,e._map=t,e):t===e._map?e:0===t.size?e.__empty():e.__make(t)}function Ht(e,t){var r=Object.create(Qr);return r.size=e?e.size:0,r._map=e,r.__ownerID=t,r}function Vt(){return ea||(ea=Ht(Ne()))}function Gt(e){return null===e||void 0===e?qt():Wt(e)?e:qt().withMutations(function(t){var r=n(e);ce(r.size),r.forEach(function(e){return t.add(e)})})}function Wt(e){return jt(e)&&h(e)}function Ut(e,t){var r=Object.create(ta);return r.size=e?e.size:0,r._map=e,r.__ownerID=t,r}function qt(){return ra||(ra=Ut(rt()))}function Yt(e){return null===e||void 0===e?Jt():Zt(e)?e:Jt().unshiftAll(e)}function Zt(e){return!(!e||!e[aa])}function Kt(e,t,r,a){var n=Object.create(na);return n.size=e,n._head=t,n.__ownerID=r,n.__hash=a,n.__altered=!1,n}function Jt(){return oa||(oa=Kt(0))}function Xt(e,t){var r=function(r){e.prototype[r]=t[r]};return Object.keys(t).forEach(r),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(t).forEach(r),e}function $t(e,t){return t}function Qt(e,t){return[t,e]}function er(e){return function(){return!e.apply(this,arguments)}}function tr(e){return function(){return-e.apply(this,arguments)}}function rr(e){return"string"==typeof e?JSON.stringify(e):String(e)}function ar(){return p(arguments)}function nr(e,t){return e<t?1:e>t?-1:0}function or(e){if(e.size===1/0)return 0;var t=h(e),r=l(e),a=t?1:0;return ir(e.__iterate(r?t?function(e,t){a=31*a+lr(ie(e),ie(t))|0}:function(e,t){a=a+lr(ie(e),ie(t))|0}:t?function(e){a=31*a+ie(e)|0}:function(e){a=a+ie(e)|0}),a)}function ir(e,t){return t=Ar(t,3432918353),t=Ar(t<<15|t>>>-15,461845907),t=Ar(t<<13|t>>>-13,5),t=(t+3864292196|0)^e,t=Ar(t^t>>>16,2246822507),t=Ar(t^t>>>13,3266489909),t=oe(t^t>>>16)}function lr(e,t){return e^t+2654435769+(e<<6)+(e>>2)|0}var sr=Array.prototype.slice;e(r,t),e(a,t),e(n,t),t.isIterable=i,t.isKeyed=l,t.isIndexed=s,t.isAssociative=u,t.isOrdered=h,t.Keyed=r,t.Indexed=a,t.Set=n;var ur="@@__IMMUTABLE_ITERABLE__@@",hr="@@__IMMUTABLE_KEYED__@@",cr="@@__IMMUTABLE_INDEXED__@@",dr="@@__IMMUTABLE_ORDERED__@@",mr=5,pr=1<<mr,fr=pr-1,vr={},yr={value:!1},gr={value:!1},_r=0,Tr=1,xr=2,wr="function"==typeof Symbol&&Symbol.iterator,Nr="@@iterator",br=wr||Nr;w.prototype.toString=function(){return"[Iterator]"},w.KEYS=_r,w.VALUES=Tr,w.ENTRIES=xr,w.prototype.inspect=w.prototype.toSource=function(){return this.toString()},w.prototype[br]=function(){return this},e(A,t),A.of=function(){return A(arguments)},A.prototype.toSeq=function(){return this},A.prototype.toString=function(){return this.__toString("Seq {","}")},A.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},A.prototype.__iterate=function(e,t){return W(this,e,t,!0)},A.prototype.__iterator=function(e,t){return U(this,e,t,!0)},e(I,A),I.prototype.toKeyedSeq=function(){return this},e(z,A),z.of=function(){return z(arguments)},z.prototype.toIndexedSeq=function(){return this},z.prototype.toString=function(){return this.__toString("Seq [","]")},z.prototype.__iterate=function(e,t){return W(this,e,t,!1)},z.prototype.__iterator=function(e,t){return U(this,e,t,!1)},e(C,A),C.of=function(){return C(arguments)},C.prototype.toSetSeq=function(){return this},A.isSeq=F,A.Keyed=I,A.Set=C,A.Indexed=z;var Lr="@@__IMMUTABLE_SEQ__@@";A.prototype[Lr]=!0,e(R,z),R.prototype.get=function(e,t){return this.has(e)?this._array[v(this,e)]:t},R.prototype.__iterate=function(e,t){for(var r=this._array,a=r.length-1,n=0;n<=a;n++)if(!1===e(r[t?a-n:n],n,this))return n+1;return n},R.prototype.__iterator=function(e,t){var r=this._array,a=r.length-1,n=0;return new w(function(){return n>a?b():N(e,n,r[t?a-n++:n++])})},e(E,I),E.prototype.get=function(e,t){return void 0===t||this.has(e)?this._object[e]:t},E.prototype.has=function(e){return this._object.hasOwnProperty(e)},E.prototype.__iterate=function(e,t){for(var r=this._object,a=this._keys,n=a.length-1,o=0;o<=n;o++){var i=a[t?n-o:o];if(!1===e(r[i],i,this))return o+1}return o},E.prototype.__iterator=function(e,t){var r=this._object,a=this._keys,n=a.length-1,o=0;return new w(function(){var i=a[t?n-o:o];return o++>n?b():N(e,i,r[i])})},E.prototype[dr]=!0,e(P,z),P.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);var r=this._iterable,a=k(r),n=0;if(S(a))for(var o;!(o=a.next()).done&&!1!==e(o.value,n++,this););return n},P.prototype.__iteratorUncached=function(e,t){if(t)return this.cacheResult().__iterator(e,t);var r=this._iterable,a=k(r);if(!S(a))return new w(b);var n=0;return new w(function(){var t=a.next();return t.done?t:N(e,n++,t.value)})},e(O,z),O.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);for(var r=this._iterator,a=this._iteratorCache,n=0;n<a.length;)if(!1===e(a[n],n++,this))return n;for(var o;!(o=r.next()).done;){var i=o.value;if(a[n]=i,!1===e(i,n++,this))break}return n},O.prototype.__iteratorUncached=function(e,t){if(t)return this.cacheResult().__iterator(e,t);var r=this._iterator,a=this._iteratorCache,n=0;return new w(function(){if(n>=a.length){var t=r.next();if(t.done)return t;a[n]=t.value}return N(e,n,a[n++])})};var Sr;e($,z),$.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},$.prototype.get=function(e,t){return this.has(e)?this._value:t},$.prototype.includes=function(e){return J(this._value,e)},$.prototype.slice=function(e,t){var r=this.size;return g(e,t,r)?this:new $(this._value,T(t,r)-_(e,r))},$.prototype.reverse=function(){return this},$.prototype.indexOf=function(e){return J(this._value,e)?0:-1},$.prototype.lastIndexOf=function(e){return J(this._value,e)?this.size:-1},$.prototype.__iterate=function(e,t){for(var r=0;r<this.size;r++)if(!1===e(this._value,r,this))return r+1;return r},$.prototype.__iterator=function(e,t){var r=this,a=0;return new w(function(){return a<r.size?N(e,a++,r._value):b()})},$.prototype.equals=function(e){return e instanceof $?J(this._value,e._value):X(e)};var kr;e(ee,z),ee.prototype.toString=function(){return 0===this.size?"Range []":"Range [ "+this._start+"..."+this._end+(1!==this._step?" by "+this._step:"")+" ]"},ee.prototype.get=function(e,t){return this.has(e)?this._start+v(this,e)*this._step:t},ee.prototype.includes=function(e){var t=(e-this._start)/this._step;return t>=0&&t<this.size&&t===Math.floor(t)},ee.prototype.slice=function(e,t){return g(e,t,this.size)?this:(e=_(e,this.size),t=T(t,this.size),t<=e?new ee(0,0):new ee(this.get(e,this._end),this.get(t,this._end),this._step))},ee.prototype.indexOf=function(e){var t=e-this._start;if(t%this._step==0){var r=t/this._step;if(r>=0&&r<this.size)return r}return-1},ee.prototype.lastIndexOf=function(e){return this.indexOf(e)},ee.prototype.__iterate=function(e,t){for(var r=this.size-1,a=this._step,n=t?this._start+r*a:this._start,o=0;o<=r;o++){if(!1===e(n,o,this))return o+1;n+=t?-a:a}return o},ee.prototype.__iterator=function(e,t){var r=this.size-1,a=this._step,n=t?this._start+r*a:this._start,o=0;return new w(function(){var i=n;return n+=t?-a:a,o>r?b():N(e,o++,i)})},ee.prototype.equals=function(e){return e instanceof ee?this._start===e._start&&this._end===e._end&&this._step===e._step:X(this,e)};var Dr;e(te,t),e(re,te),e(ae,te),e(ne,te),te.Keyed=re,te.Indexed=ae,te.Set=ne;var Mr,Ar="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function(e,t){e|=0,t|=0;var r=65535&e,a=65535&t;return r*a+((e>>>16)*a+r*(t>>>16)<<16>>>0)|0},Ir=Object.isExtensible,zr=function(){try{return Object.defineProperty({},"@",{}),!0}catch(e){return!1}}(),Cr="function"==typeof WeakMap;Cr&&(Mr=new WeakMap);var Rr=0,Er="__immutablehash__";"function"==typeof Symbol&&(Er=Symbol(Er));var Pr=16,Or=255,Fr=0,jr={};e(de,re),de.of=function(){var e=sr.call(arguments,0);return Ne().withMutations(function(t){for(var r=0;r<e.length;r+=2){if(r+1>=e.length)throw new Error("Missing value for key: "+e[r]);t.set(e[r],e[r+1])}})},de.prototype.toString=function(){return this.__toString("Map {","}")},de.prototype.get=function(e,t){return this._root?this._root.get(0,void 0,e,t):t},de.prototype.set=function(e,t){return be(this,e,t)},de.prototype.setIn=function(e,t){return this.updateIn(e,vr,function(){return t})},de.prototype.remove=function(e){return be(this,e,vr)},de.prototype.deleteIn=function(e){return this.updateIn(e,function(){return vr})},de.prototype.update=function(e,t,r){return 1===arguments.length?e(this):this.updateIn([e],t,r)},de.prototype.updateIn=function(e,t,r){r||(r=t,t=void 0);var a=Ee(this,zt(e),t,r);return a===vr?void 0:a},de.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):Ne()},de.prototype.merge=function(){return Ie(this,void 0,arguments)},de.prototype.mergeWith=function(e){return Ie(this,e,sr.call(arguments,1))},de.prototype.mergeIn=function(e){var t=sr.call(arguments,1);return this.updateIn(e,Ne(),function(e){return"function"==typeof e.merge?e.merge.apply(e,t):t[t.length-1]})},de.prototype.mergeDeep=function(){return Ie(this,ze,arguments)},de.prototype.mergeDeepWith=function(e){var t=sr.call(arguments,1);return Ie(this,Ce(e),t)},de.prototype.mergeDeepIn=function(e){var t=sr.call(arguments,1);return this.updateIn(e,Ne(),function(e){return"function"==typeof e.mergeDeep?e.mergeDeep.apply(e,t):t[t.length-1]})},de.prototype.sort=function(e){return Qe(xt(this,e))},de.prototype.sortBy=function(e,t){return Qe(xt(this,t,e))},de.prototype.withMutations=function(e){var t=this.asMutable();return e(t),t.wasAltered()?t.__ensureOwner(this.__ownerID):this},de.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new m)},de.prototype.asImmutable=function(){return this.__ensureOwner()},de.prototype.wasAltered=function(){return this.__altered},de.prototype.__iterator=function(e,t){return new _e(this,e,t)},de.prototype.__iterate=function(e,t){var r=this,a=0;return this._root&&this._root.iterate(function(t){return a++,e(t[1],t[0],r)},t),a},de.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?we(this.size,this._root,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},de.isMap=me;var Br="@@__IMMUTABLE_MAP__@@",Hr=de.prototype;Hr[Br]=!0,Hr.delete=Hr.remove,Hr.removeIn=Hr.deleteIn,pe.prototype.get=function(e,t,r,a){for(var n=this.entries,o=0,i=n.length;o<i;o++)if(J(r,n[o][0]))return n[o][1];return a},pe.prototype.update=function(e,t,r,a,n,o,i){for(var l=n===vr,s=this.entries,u=0,h=s.length;u<h&&!J(a,s[u][0]);u++);var c=u<h;if(c?s[u][1]===n:l)return this;if(d(i),(l||!c)&&d(o),!l||1!==s.length){if(!c&&!l&&s.length>=Gr)return De(e,s,a,n);var m=e&&e===this.ownerID,f=m?s:p(s);return c?l?u===h-1?f.pop():f[u]=f.pop():f[u]=[a,n]:f.push([a,n]),m?(this.entries=f,this):new pe(e,f)}},fe.prototype.get=function(e,t,r,a){void 0===t&&(t=ie(r));var n=1<<((0===e?t:t>>>e)&fr),o=this.bitmap;return 0==(o&n)?a:this.nodes[Pe(o&n-1)].get(e+mr,t,r,a)},fe.prototype.update=function(e,t,r,a,n,o,i){void 0===r&&(r=ie(a));var l=(0===t?r:r>>>t)&fr,s=1<<l,u=this.bitmap,h=0!=(u&s);if(!h&&n===vr)return this;var c=Pe(u&s-1),d=this.nodes,m=h?d[c]:void 0,p=Le(m,e,t+mr,r,a,n,o,i);if(p===m)return this;if(!h&&p&&d.length>=Wr)return Ae(e,d,u,l,p);if(h&&!p&&2===d.length&&Se(d[1^c]))return d[1^c];if(h&&p&&1===d.length&&Se(p))return p;var f=e&&e===this.ownerID,v=h?p?u:u^s:u|s,y=h?p?Oe(d,c,p,f):je(d,c,f):Fe(d,c,p,f);return f?(this.bitmap=v,this.nodes=y,this):new fe(e,v,y)},ve.prototype.get=function(e,t,r,a){void 0===t&&(t=ie(r));var n=(0===e?t:t>>>e)&fr,o=this.nodes[n];return o?o.get(e+mr,t,r,a):a},ve.prototype.update=function(e,t,r,a,n,o,i){void 0===r&&(r=ie(a));var l=(0===t?r:r>>>t)&fr,s=n===vr,u=this.nodes,h=u[l];if(s&&!h)return this;var c=Le(h,e,t+mr,r,a,n,o,i);if(c===h)return this;var d=this.count;if(h){if(!c&&--d<Ur)return Me(e,u,d,l)}else d++;var m=e&&e===this.ownerID,p=Oe(u,l,c,m);return m?(this.count=d,this.nodes=p,this):new ve(e,d,p)},ye.prototype.get=function(e,t,r,a){for(var n=this.entries,o=0,i=n.length;o<i;o++)if(J(r,n[o][0]))return n[o][1];return a},ye.prototype.update=function(e,t,r,a,n,o,i){void 0===r&&(r=ie(a));var l=n===vr;if(r!==this.keyHash)return l?this:(d(i),d(o),ke(this,e,t,r,[a,n]));for(var s=this.entries,u=0,h=s.length;u<h&&!J(a,s[u][0]);u++);var c=u<h;if(c?s[u][1]===n:l)return this;if(d(i),(l||!c)&&d(o),l&&2===h)return new ge(e,this.keyHash,s[1^u]);var m=e&&e===this.ownerID,f=m?s:p(s);return c?l?u===h-1?f.pop():f[u]=f.pop():f[u]=[a,n]:f.push([a,n]),m?(this.entries=f,this):new ye(e,this.keyHash,f)},ge.prototype.get=function(e,t,r,a){return J(r,this.entry[0])?this.entry[1]:a},ge.prototype.update=function(e,t,r,a,n,o,i){var l=n===vr,s=J(a,this.entry[0]);return(s?n===this.entry[1]:l)?this:(d(i),l?void d(o):s?e&&e===this.ownerID?(this.entry[1]=n,this):new ge(e,this.keyHash,[a,n]):(d(o),ke(this,e,t,ie(a),[a,n])))},pe.prototype.iterate=ye.prototype.iterate=function(e,t){for(var r=this.entries,a=0,n=r.length-1;a<=n;a++)if(!1===e(r[t?n-a:a]))return!1},fe.prototype.iterate=ve.prototype.iterate=function(e,t){for(var r=this.nodes,a=0,n=r.length-1;a<=n;a++){var o=r[t?n-a:a];if(o&&!1===o.iterate(e,t))return!1}},ge.prototype.iterate=function(e,t){return e(this.entry)},e(_e,w),_e.prototype.next=function(){for(var e=this._type,t=this._stack;t;){var r,a=t.node,n=t.index++;if(a.entry){if(0===n)return Te(e,a.entry)}else if(a.entries){if(r=a.entries.length-1,n<=r)return Te(e,a.entries[this._reverse?r-n:n])}else if(r=a.nodes.length-1,n<=r){var o=a.nodes[this._reverse?r-n:n];if(o){if(o.entry)return Te(e,o.entry);t=this._stack=xe(o,t)}continue}t=this._stack=this._stack.__prev}return b()};var Vr,Gr=pr/4,Wr=pr/2,Ur=pr/4;e(Be,ae),Be.of=function(){return this(arguments)},Be.prototype.toString=function(){return this.__toString("List [","]")},Be.prototype.get=function(e,t){if((e=v(this,e))>=0&&e<this.size){e+=this._origin;var r=Ke(this,e);return r&&r.array[e&fr]}return t},Be.prototype.set=function(e,t){return qe(this,e,t)},Be.prototype.remove=function(e){return this.has(e)?0===e?this.shift():e===this.size-1?this.pop():this.splice(e,1):this},Be.prototype.insert=function(e,t){return this.splice(e,0,t)},Be.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=this._origin=this._capacity=0,this._level=mr,this._root=this._tail=null,this.__hash=void 0,this.__altered=!0,this):Ue()},Be.prototype.push=function(){var e=arguments,t=this.size;return this.withMutations(function(r){Je(r,0,t+e.length);for(var a=0;a<e.length;a++)r.set(t+a,e[a])})},Be.prototype.pop=function(){return Je(this,0,-1)},Be.prototype.unshift=function(){var e=arguments;return this.withMutations(function(t){Je(t,-e.length);for(var r=0;r<e.length;r++)t.set(r,e[r])})},Be.prototype.shift=function(){return Je(this,1)},Be.prototype.merge=function(){return Xe(this,void 0,arguments)},Be.prototype.mergeWith=function(e){return Xe(this,e,sr.call(arguments,1))},Be.prototype.mergeDeep=function(){return Xe(this,ze,arguments)},Be.prototype.mergeDeepWith=function(e){var t=sr.call(arguments,1);return Xe(this,Ce(e),t)},Be.prototype.setSize=function(e){return Je(this,0,e)},Be.prototype.slice=function(e,t){var r=this.size;return g(e,t,r)?this:Je(this,_(e,r),T(t,r))},Be.prototype.__iterator=function(e,t){var r=0,a=Ge(this,t);return new w(function(){var t=a();return t===Kr?b():N(e,r++,t)})},Be.prototype.__iterate=function(e,t){for(var r,a=0,n=Ge(this,t);(r=n())!==Kr&&!1!==e(r,a++,this););return a},Be.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?We(this._origin,this._capacity,this._level,this._root,this._tail,e,this.__hash):(this.__ownerID=e,this)},Be.isList=He;var qr="@@__IMMUTABLE_LIST__@@",Yr=Be.prototype;Yr[qr]=!0,Yr.delete=Yr.remove,Yr.setIn=Hr.setIn,Yr.deleteIn=Yr.removeIn=Hr.removeIn,Yr.update=Hr.update,Yr.updateIn=Hr.updateIn,Yr.mergeIn=Hr.mergeIn,Yr.mergeDeepIn=Hr.mergeDeepIn,Yr.withMutations=Hr.withMutations,Yr.asMutable=Hr.asMutable,Yr.asImmutable=Hr.asImmutable,Yr.wasAltered=Hr.wasAltered,Ve.prototype.removeBefore=function(e,t,r){if(r===t?1<<t:0===this.array.length)return this;var a=r>>>t&fr;if(a>=this.array.length)return new Ve([],e);var n,o=0===a;if(t>0){var i=this.array[a];if((n=i&&i.removeBefore(e,t-mr,r))===i&&o)return this}if(o&&!n)return this;var l=Ze(this,e);if(!o)for(var s=0;s<a;s++)l.array[s]=void 0;return n&&(l.array[a]=n),l},Ve.prototype.removeAfter=function(e,t,r){if(r===(t?1<<t:0)||0===this.array.length)return this;var a=r-1>>>t&fr;if(a>=this.array.length)return this;var n;if(t>0){var o=this.array[a];if((n=o&&o.removeAfter(e,t-mr,r))===o&&a===this.array.length-1)return this}var i=Ze(this,e);return i.array.splice(a+1),n&&(i.array[a]=n),i};var Zr,Kr={};e(Qe,de),Qe.of=function(){return this(arguments)},Qe.prototype.toString=function(){return this.__toString("OrderedMap {","}")},Qe.prototype.get=function(e,t){var r=this._map.get(e);return void 0!==r?this._list.get(r)[1]:t},Qe.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._map.clear(),this._list.clear(),this):rt()},Qe.prototype.set=function(e,t){return at(this,e,t)},Qe.prototype.remove=function(e){return at(this,e,vr)},Qe.prototype.wasAltered=function(){return this._map.wasAltered()||this._list.wasAltered()},Qe.prototype.__iterate=function(e,t){var r=this;return this._list.__iterate(function(t){return t&&e(t[1],t[0],r)},t)},Qe.prototype.__iterator=function(e,t){return this._list.fromEntrySeq().__iterator(e,t)},Qe.prototype.__ensureOwner=function(e){if(e===this.__ownerID)return this;var t=this._map.__ensureOwner(e),r=this._list.__ensureOwner(e);return e?tt(t,r,e,this.__hash):(this.__ownerID=e,this._map=t,this._list=r,this)},Qe.isOrderedMap=et,Qe.prototype[dr]=!0,Qe.prototype.delete=Qe.prototype.remove;var Jr;e(nt,I),nt.prototype.get=function(e,t){return this._iter.get(e,t)},nt.prototype.has=function(e){return this._iter.has(e)},nt.prototype.valueSeq=function(){return this._iter.valueSeq()},nt.prototype.reverse=function(){var e=this,t=ht(this,!0);return this._useKeys||(t.valueSeq=function(){return e._iter.toSeq().reverse()}),t},nt.prototype.map=function(e,t){var r=this,a=ut(this,e,t);return this._useKeys||(a.valueSeq=function(){return r._iter.toSeq().map(e,t)}),a},nt.prototype.__iterate=function(e,t){var r,a=this;return this._iter.__iterate(this._useKeys?function(t,r){return e(t,r,a)}:(r=t?kt(this):0,function(n){return e(n,t?--r:r++,a)}),t)},nt.prototype.__iterator=function(e,t){if(this._useKeys)return this._iter.__iterator(e,t);var r=this._iter.__iterator(Tr,t),a=t?kt(this):0;return new w(function(){var n=r.next();return n.done?n:N(e,t?--a:a++,n.value,n)})},nt.prototype[dr]=!0,e(ot,z),ot.prototype.includes=function(e){return this._iter.includes(e)},ot.prototype.__iterate=function(e,t){var r=this,a=0;return this._iter.__iterate(function(t){return e(t,a++,r)},t)},ot.prototype.__iterator=function(e,t){var r=this._iter.__iterator(Tr,t),a=0;return new w(function(){var t=r.next();return t.done?t:N(e,a++,t.value,t)})},e(it,C),it.prototype.has=function(e){return this._iter.includes(e)},it.prototype.__iterate=function(e,t){var r=this;return this._iter.__iterate(function(t){return e(t,t,r)},t)},it.prototype.__iterator=function(e,t){var r=this._iter.__iterator(Tr,t);return new w(function(){var t=r.next();return t.done?t:N(e,t.value,t.value,t)})},e(lt,I),lt.prototype.entrySeq=function(){return this._iter.toSeq()},lt.prototype.__iterate=function(e,t){var r=this;return this._iter.__iterate(function(t){if(t){St(t);var a=i(t);return e(a?t.get(1):t[1],a?t.get(0):t[0],r)}},t)},lt.prototype.__iterator=function(e,t){var r=this._iter.__iterator(Tr,t);return new w(function(){for(;;){var t=r.next();if(t.done)return t;var a=t.value;if(a){St(a);var n=i(a);return N(e,n?a.get(0):a[0],n?a.get(1):a[1],t)}}})},ot.prototype.cacheResult=nt.prototype.cacheResult=it.prototype.cacheResult=lt.prototype.cacheResult=At,e(Ct,re),Ct.prototype.toString=function(){return this.__toString(Et(this)+" {","}")},Ct.prototype.has=function(e){return this._defaultValues.hasOwnProperty(e)},Ct.prototype.get=function(e,t){if(!this.has(e))return t;var r=this._defaultValues[e];return this._map?this._map.get(e,r):r},Ct.prototype.clear=function(){if(this.__ownerID)return this._map&&this._map.clear(),this;var e=this.constructor;return e._empty||(e._empty=Rt(this,Ne()))},Ct.prototype.set=function(e,t){if(!this.has(e))throw new Error('Cannot set unknown key "'+e+'" on '+Et(this));if(this._map&&!this._map.has(e)&&t===this._defaultValues[e])return this;var r=this._map&&this._map.set(e,t);return this.__ownerID||r===this._map?this:Rt(this,r)},Ct.prototype.remove=function(e){if(!this.has(e))return this;var t=this._map&&this._map.remove(e);return this.__ownerID||t===this._map?this:Rt(this,t)},Ct.prototype.wasAltered=function(){return this._map.wasAltered()},Ct.prototype.__iterator=function(e,t){var a=this;return r(this._defaultValues).map(function(e,t){return a.get(t)}).__iterator(e,t)},Ct.prototype.__iterate=function(e,t){var a=this;return r(this._defaultValues).map(function(e,t){return a.get(t)}).__iterate(e,t)},Ct.prototype.__ensureOwner=function(e){if(e===this.__ownerID)return this;var t=this._map&&this._map.__ensureOwner(e);return e?Rt(this,t,e):(this.__ownerID=e,this._map=t,this)};var Xr=Ct.prototype;Xr.delete=Xr.remove,Xr.deleteIn=Xr.removeIn=Hr.removeIn,Xr.merge=Hr.merge,Xr.mergeWith=Hr.mergeWith,Xr.mergeIn=Hr.mergeIn,Xr.mergeDeep=Hr.mergeDeep,Xr.mergeDeepWith=Hr.mergeDeepWith,Xr.mergeDeepIn=Hr.mergeDeepIn,Xr.setIn=Hr.setIn,Xr.update=Hr.update,Xr.updateIn=Hr.updateIn,Xr.withMutations=Hr.withMutations,Xr.asMutable=Hr.asMutable,Xr.asImmutable=Hr.asImmutable,e(Ft,ne),Ft.of=function(){return this(arguments)},Ft.fromKeys=function(e){return this(r(e).keySeq())},Ft.prototype.toString=function(){return this.__toString("Set {","}")},Ft.prototype.has=function(e){return this._map.has(e)},Ft.prototype.add=function(e){return Bt(this,this._map.set(e,!0))},Ft.prototype.remove=function(e){return Bt(this,this._map.remove(e))},Ft.prototype.clear=function(){return Bt(this,this._map.clear())},Ft.prototype.union=function(){var e=sr.call(arguments,0);return e=e.filter(function(e){return 0!==e.size}),0===e.length?this:0!==this.size||this.__ownerID||1!==e.length?this.withMutations(function(t){for(var r=0;r<e.length;r++)n(e[r]).forEach(function(e){return t.add(e)})}):this.constructor(e[0])},Ft.prototype.intersect=function(){var e=sr.call(arguments,0);if(0===e.length)return this;e=e.map(function(e){return n(e)});var t=this;return this.withMutations(function(r){t.forEach(function(t){e.every(function(e){return e.includes(t)})||r.remove(t)})})},Ft.prototype.subtract=function(){var e=sr.call(arguments,0);if(0===e.length)return this;e=e.map(function(e){return n(e)});var t=this;return this.withMutations(function(r){t.forEach(function(t){e.some(function(e){return e.includes(t)})&&r.remove(t)})})},Ft.prototype.merge=function(){return this.union.apply(this,arguments)},Ft.prototype.mergeWith=function(e){var t=sr.call(arguments,1);return this.union.apply(this,t)},Ft.prototype.sort=function(e){return Gt(xt(this,e))},Ft.prototype.sortBy=function(e,t){return Gt(xt(this,t,e))},Ft.prototype.wasAltered=function(){return this._map.wasAltered()},Ft.prototype.__iterate=function(e,t){var r=this;return this._map.__iterate(function(t,a){return e(a,a,r)},t)},Ft.prototype.__iterator=function(e,t){return this._map.map(function(e,t){return t}).__iterator(e,t)},Ft.prototype.__ensureOwner=function(e){if(e===this.__ownerID)return this;var t=this._map.__ensureOwner(e);return e?this.__make(t,e):(this.__ownerID=e,this._map=t,this)},Ft.isSet=jt;var $r="@@__IMMUTABLE_SET__@@",Qr=Ft.prototype;Qr[$r]=!0,Qr.delete=Qr.remove,Qr.mergeDeep=Qr.merge,Qr.mergeDeepWith=Qr.mergeWith,Qr.withMutations=Hr.withMutations,Qr.asMutable=Hr.asMutable,Qr.asImmutable=Hr.asImmutable,Qr.__empty=Vt,Qr.__make=Ht;var ea;e(Gt,Ft),Gt.of=function(){return this(arguments)},Gt.fromKeys=function(e){return this(r(e).keySeq())},Gt.prototype.toString=function(){return this.__toString("OrderedSet {","}")},Gt.isOrderedSet=Wt;var ta=Gt.prototype;ta[dr]=!0,ta.__empty=qt,ta.__make=Ut;var ra;e(Yt,ae),Yt.of=function(){return this(arguments)},Yt.prototype.toString=function(){return this.__toString("Stack [","]")},Yt.prototype.get=function(e,t){var r=this._head;for(e=v(this,e);r&&e--;)r=r.next;return r?r.value:t},Yt.prototype.peek=function(){return this._head&&this._head.value},Yt.prototype.push=function(){if(0===arguments.length)return this;for(var e=this.size+arguments.length,t=this._head,r=arguments.length-1;r>=0;r--)t={value:arguments[r],next:t};return this.__ownerID?(this.size=e,this._head=t,this.__hash=void 0,this.__altered=!0,this):Kt(e,t)},Yt.prototype.pushAll=function(e){if(e=a(e),0===e.size)return this;ce(e.size);var t=this.size,r=this._head;return e.reverse().forEach(function(e){t++,r={value:e,next:r}}),this.__ownerID?(this.size=t,this._head=r,this.__hash=void 0,this.__altered=!0,this):Kt(t,r)},Yt.prototype.pop=function(){return this.slice(1)},Yt.prototype.unshift=function(){return this.push.apply(this,arguments)},Yt.prototype.unshiftAll=function(e){return this.pushAll(e)},Yt.prototype.shift=function(){return this.pop.apply(this,arguments)},Yt.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):Jt()},Yt.prototype.slice=function(e,t){if(g(e,t,this.size))return this;var r=_(e,this.size);if(T(t,this.size)!==this.size)return ae.prototype.slice.call(this,e,t);for(var a=this.size-r,n=this._head;r--;)n=n.next;return this.__ownerID?(this.size=a,this._head=n,this.__hash=void 0,this.__altered=!0,this):Kt(a,n)},Yt.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?Kt(this.size,this._head,e,this.__hash):(this.__ownerID=e,this.__altered=!1,this)},Yt.prototype.__iterate=function(e,t){if(t)return this.reverse().__iterate(e);for(var r=0,a=this._head;a&&!1!==e(a.value,r++,this);)a=a.next;return r},Yt.prototype.__iterator=function(e,t){if(t)return this.reverse().__iterator(e);var r=0,a=this._head;return new w(function(){if(a){var t=a.value;return a=a.next,N(e,r++,t)}return b()})},Yt.isStack=Zt;var aa="@@__IMMUTABLE_STACK__@@",na=Yt.prototype;na[aa]=!0,na.withMutations=Hr.withMutations,na.asMutable=Hr.asMutable,na.asImmutable=Hr.asImmutable,na.wasAltered=Hr.wasAltered;var oa;t.Iterator=w,Xt(t,{toArray:function(){ce(this.size);var e=new Array(this.size||0);return this.valueSeq().__iterate(function(t,r){e[r]=t}),e},toIndexedSeq:function(){return new ot(this)},toJS:function(){return this.toSeq().map(function(e){return e&&"function"==typeof e.toJS?e.toJS():e}).__toJS()},toJSON:function(){return this.toSeq().map(function(e){return e&&"function"==typeof e.toJSON?e.toJSON():e}).__toJS()},toKeyedSeq:function(){return new nt(this,!0)},toMap:function(){return de(this.toKeyedSeq())},toObject:function(){ce(this.size);var e={};return this.__iterate(function(t,r){e[r]=t}),e},toOrderedMap:function(){return Qe(this.toKeyedSeq())},toOrderedSet:function(){return Gt(l(this)?this.valueSeq():this)},toSet:function(){return Ft(l(this)?this.valueSeq():this)},toSetSeq:function(){return new it(this)},toSeq:function(){return s(this)?this.toIndexedSeq():l(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return Yt(l(this)?this.valueSeq():this)},toList:function(){return Be(l(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(e,t){return 0===this.size?e+t:e+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+t},concat:function(){return Lt(this,yt(this,sr.call(arguments,0)))},includes:function(e){return this.some(function(t){return J(t,e)})},entries:function(){return this.__iterator(xr)},every:function(e,t){ce(this.size);var r=!0;return this.__iterate(function(a,n,o){if(!e.call(t,a,n,o))return r=!1,!1}),r},filter:function(e,t){return Lt(this,ct(this,e,t,!0))},find:function(e,t,r){var a=this.findEntry(e,t);return a?a[1]:r},forEach:function(e,t){return ce(this.size),this.__iterate(t?e.bind(t):e)},join:function(e){ce(this.size),e=void 0!==e?""+e:",";var t="",r=!0;return this.__iterate(function(a){r?r=!1:t+=e,t+=null!==a&&void 0!==a?a.toString():""}),t},keys:function(){return this.__iterator(_r)},map:function(e,t){return Lt(this,ut(this,e,t))},reduce:function(e,t,r){ce(this.size);var a,n;return arguments.length<2?n=!0:a=t,this.__iterate(function(t,o,i){n?(n=!1,a=t):a=e.call(r,a,t,o,i)}),a},reduceRight:function(e,t,r){var a=this.toKeyedSeq().reverse();return a.reduce.apply(a,arguments)},reverse:function(){return Lt(this,ht(this,!0))},slice:function(e,t){return Lt(this,pt(this,e,t,!0))},some:function(e,t){return!this.every(er(e),t)},sort:function(e){return Lt(this,xt(this,e))},values:function(){return this.__iterator(Tr)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some(function(){return!0})},count:function(e,t){return f(e?this.toSeq().filter(e,t):this)},countBy:function(e,t){return dt(this,e,t)},equals:function(e){return X(this,e)},entrySeq:function(){var e=this;if(e._cache)return new R(e._cache);var t=e.toSeq().map(Qt).toIndexedSeq();return t.fromEntrySeq=function(){return e.toSeq()},t},filterNot:function(e,t){return this.filter(er(e),t)},findEntry:function(e,t,r){var a=r;return this.__iterate(function(r,n,o){if(e.call(t,r,n,o))return a=[n,r],!1}),a},findKey:function(e,t){var r=this.findEntry(e,t);return r&&r[0]},findLast:function(e,t,r){return this.toKeyedSeq().reverse().find(e,t,r)},findLastEntry:function(e,t,r){return this.toKeyedSeq().reverse().findEntry(e,t,r)},findLastKey:function(e,t){return this.toKeyedSeq().reverse().findKey(e,t)},first:function(){return this.find(y)},flatMap:function(e,t){return Lt(this,_t(this,e,t))},flatten:function(e){return Lt(this,gt(this,e,!0))},fromEntrySeq:function(){return new lt(this)},get:function(e,t){return this.find(function(t,r){return J(r,e)},void 0,t)},getIn:function(e,t){for(var r,a=this,n=zt(e);!(r=n.next()).done;){var o=r.value;if((a=a&&a.get?a.get(o,vr):vr)===vr)return t}return a},groupBy:function(e,t){return mt(this,e,t)},has:function(e){return this.get(e,vr)!==vr},hasIn:function(e){return this.getIn(e,vr)!==vr},isSubset:function(e){return e="function"==typeof e.includes?e:t(e),this.every(function(t){return e.includes(t)})},isSuperset:function(e){return e="function"==typeof e.isSubset?e:t(e),e.isSubset(this)},keyOf:function(e){return this.findKey(function(t){return J(t,e)})},keySeq:function(){return this.toSeq().map($t).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(e){return this.toKeyedSeq().reverse().keyOf(e)},max:function(e){return wt(this,e)},maxBy:function(e,t){return wt(this,t,e)},min:function(e){return wt(this,e?tr(e):nr)},minBy:function(e,t){return wt(this,t?tr(t):nr,e)},rest:function(){return this.slice(1)},skip:function(e){return this.slice(Math.max(0,e))},skipLast:function(e){return Lt(this,this.toSeq().reverse().skip(e).reverse())},skipWhile:function(e,t){return Lt(this,vt(this,e,t,!0))},skipUntil:function(e,t){return this.skipWhile(er(e),t)},sortBy:function(e,t){return Lt(this,xt(this,t,e))},take:function(e){return this.slice(0,Math.max(0,e))},takeLast:function(e){return Lt(this,this.toSeq().reverse().take(e).reverse())},takeWhile:function(e,t){return Lt(this,ft(this,e,t))},takeUntil:function(e,t){return this.takeWhile(er(e),t)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=or(this))}});var ia=t.prototype;ia[ur]=!0,ia[br]=ia.values,ia.__toJS=ia.toArray,ia.__toStringMapper=rr,ia.inspect=ia.toSource=function(){return this.toString()},ia.chain=ia.flatMap,ia.contains=ia.includes,Xt(r,{flip:function(){return Lt(this,st(this))},mapEntries:function(e,t){var r=this,a=0;return Lt(this,this.toSeq().map(function(n,o){return e.call(t,[o,n],a++,r)}).fromEntrySeq())},mapKeys:function(e,t){var r=this;return Lt(this,this.toSeq().flip().map(function(a,n){return e.call(t,a,n,r)}).flip())}});var la=r.prototype;return la[hr]=!0,la[br]=ia.entries,la.__toJS=ia.toObject,la.__toStringMapper=function(e,t){return JSON.stringify(t)+": "+rr(e)},Xt(a,{toKeyedSeq:function(){return new nt(this,!1)},filter:function(e,t){return Lt(this,ct(this,e,t,!1))},findIndex:function(e,t){var r=this.findEntry(e,t);return r?r[0]:-1},indexOf:function(e){var t=this.keyOf(e);return void 0===t?-1:t},lastIndexOf:function(e){var t=this.lastKeyOf(e);return void 0===t?-1:t},reverse:function(){return Lt(this,ht(this,!1))},slice:function(e,t){return Lt(this,pt(this,e,t,!1))},splice:function(e,t){var r=arguments.length;if(t=Math.max(0|t,0),0===r||2===r&&!t)return this;e=_(e,e<0?this.count():this.size);var a=this.slice(0,e);return Lt(this,1===r?a:a.concat(p(arguments,2),this.slice(e+t)))},findLastIndex:function(e,t){var r=this.findLastEntry(e,t);return r?r[0]:-1},first:function(){return this.get(0)},flatten:function(e){return Lt(this,gt(this,e,!1))},get:function(e,t){return e=v(this,e),e<0||this.size===1/0||void 0!==this.size&&e>this.size?t:this.find(function(t,r){return r===e},void 0,t)},has:function(e){return(e=v(this,e))>=0&&(void 0!==this.size?this.size===1/0||e<this.size:-1!==this.indexOf(e))},interpose:function(e){return Lt(this,Tt(this,e))},interleave:function(){var e=[this].concat(p(arguments)),t=bt(this.toSeq(),z.of,e),r=t.flatten(!0);return t.size&&(r.size=t.size*e.length),Lt(this,r)},keySeq:function(){return ee(0,this.size)},last:function(){return this.get(-1)},skipWhile:function(e,t){return Lt(this,vt(this,e,t,!1))},zip:function(){return Lt(this,bt(this,ar,[this].concat(p(arguments))))},zipWith:function(e){var t=p(arguments);return t[0]=this,Lt(this,bt(this,e,t))}}),a.prototype[cr]=!0,a.prototype[dr]=!0,Xt(n,{get:function(e,t){return this.has(e)?e:t},includes:function(e){return this.has(e)},keySeq:function(){return this.valueSeq()}}),n.prototype.has=ia.includes,n.prototype.contains=n.prototype.includes,Xt(I,r.prototype),Xt(z,a.prototype),Xt(C,n.prototype),Xt(re,r.prototype),Xt(ae,a.prototype),Xt(ne,n.prototype),{Iterable:t,Seq:A,Collection:te,Map:de,OrderedMap:Qe,List:Be,Stack:Yt,Set:Ft,OrderedSet:Gt,Record:Ct,Range:ee,Repeat:$,is:J,fromJS:q}})},function(e,t,r){"use strict";var a,n,o="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};!function(i){var l=!1;if(a=i,void 0!==(n="function"==typeof a?a.call(t,r,t,e):a)&&(e.exports=n),l=!0,"object"===o(t)&&(e.exports=i(),l=!0),!l){var s=window.Cookies,u=window.Cookies=i();u.noConflict=function(){return window.Cookies=s,u}}}(function(){function e(){for(var e=0,t={};e<arguments.length;e++){var r=arguments[e];for(var a in r)t[a]=r[a]}return t}function t(r){function a(t,n,o){var i;if("undefined"!=typeof document){if(arguments.length>1){if(o=e({path:"/"},a.defaults,o),"number"==typeof o.expires){var l=new Date;l.setMilliseconds(l.getMilliseconds()+864e5*o.expires),o.expires=l}o.expires=o.expires?o.expires.toUTCString():"";try{i=JSON.stringify(n),/^[\{\[]/.test(i)&&(n=i)}catch(e){}n=r.write?r.write(n,t):encodeURIComponent(String(n)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),t=encodeURIComponent(String(t)),t=t.replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent),t=t.replace(/[\(\)]/g,escape);var s="";for(var u in o)o[u]&&(s+="; "+u,!0!==o[u]&&(s+="="+o[u]));return document.cookie=t+"="+n+s}t||(i={});for(var h=document.cookie?document.cookie.split("; "):[],c=/(%[0-9A-Z]{2})+/g,d=0;d<h.length;d++){var m=h[d].split("="),p=m.slice(1).join("=");this.json||'"'!==p.charAt(0)||(p=p.slice(1,-1));try{var f=m[0].replace(c,decodeURIComponent);if(p=r.read?r.read(p,f):r(p,f)||p.replace(c,decodeURIComponent),this.json)try{p=JSON.parse(p)}catch(e){}if(t===f){i=p;break}t||(i[f]=p)}catch(e){}}return i}}return a.set=a,a.get=function(e){return a.call(a,e)},a.getJSON=function(){return a.apply({json:!0},[].slice.call(arguments))},a.defaults={},a.remove=function(t,r){a(t,"",e(r,{expires:-1}))},a.withConverter=t,a}return t(function(){})})},function(e,t,r){"use strict";(function(e,a){var n,o="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};(function(){function i(e,t,r){switch(r.length){case 0:return e.call(t);case 1:return e.call(t,r[0]);case 2:return e.call(t,r[0],r[1]);case 3:return e.call(t,r[0],r[1],r[2])}return e.apply(t,r)}function l(e,t,r,a){for(var n=-1,o=null==e?0:e.length;++n<o;){var i=e[n];t(a,i,r(i),e)}return a}function s(e,t){for(var r=-1,a=null==e?0:e.length;++r<a&&!1!==t(e[r],r,e););return e}function u(e,t){for(var r=null==e?0:e.length;r--&&!1!==t(e[r],r,e););return e}function h(e,t){for(var r=-1,a=null==e?0:e.length;++r<a;)if(!t(e[r],r,e))return!1;return!0}function c(e,t){for(var r=-1,a=null==e?0:e.length,n=0,o=[];++r<a;){var i=e[r];t(i,r,e)&&(o[n++]=i)}return o}function d(e,t){return!!(null==e?0:e.length)&&N(e,t,0)>-1}function m(e,t,r){for(var a=-1,n=null==e?0:e.length;++a<n;)if(r(t,e[a]))return!0;return!1}function p(e,t){for(var r=-1,a=null==e?0:e.length,n=Array(a);++r<a;)n[r]=t(e[r],r,e);return n}function f(e,t){for(var r=-1,a=t.length,n=e.length;++r<a;)e[n+r]=t[r];return e}function v(e,t,r,a){var n=-1,o=null==e?0:e.length;for(a&&o&&(r=e[++n]);++n<o;)r=t(r,e[n],n,e);return r}function y(e,t,r,a){var n=null==e?0:e.length;for(a&&n&&(r=e[--n]);n--;)r=t(r,e[n],n,e);return r}function g(e,t){for(var r=-1,a=null==e?0:e.length;++r<a;)if(t(e[r],r,e))return!0;return!1}function _(e){return e.split("")}function T(e){return e.match(Ot)||[]}function x(e,t,r){var a;return r(e,function(e,r,n){if(t(e,r,n))return a=r,!1}),a}function w(e,t,r,a){for(var n=e.length,o=r+(a?1:-1);a?o--:++o<n;)if(t(e[o],o,e))return o;return-1}function N(e,t,r){return t===t?J(e,t,r):w(e,L,r)}function b(e,t,r,a){for(var n=r-1,o=e.length;++n<o;)if(a(e[n],t))return n;return-1}function L(e){return e!==e}function S(e,t){var r=null==e?0:e.length;return r?I(e,t)/r:Ce}function k(e){return function(t){return null==t?ae:t[e]}}function D(e){return function(t){return null==e?ae:e[t]}}function M(e,t,r,a,n){return n(e,function(e,n,o){r=a?(a=!1,e):t(r,e,n,o)}),r}function A(e,t){var r=e.length;for(e.sort(t);r--;)e[r]=e[r].value;return e}function I(e,t){for(var r,a=-1,n=e.length;++a<n;){var o=t(e[a]);o!==ae&&(r=r===ae?o:r+o)}return r}function z(e,t){for(var r=-1,a=Array(e);++r<e;)a[r]=t(r);return a}function C(e,t){return p(t,function(t){return[t,e[t]]})}function R(e){return function(t){return e(t)}}function E(e,t){return p(t,function(t){return e[t]})}function P(e,t){return e.has(t)}function O(e,t){for(var r=-1,a=e.length;++r<a&&N(t,e[r],0)>-1;);return r}function F(e,t){for(var r=e.length;r--&&N(t,e[r],0)>-1;);return r}function j(e,t){for(var r=e.length,a=0;r--;)e[r]===t&&++a;return a}function B(e){return"\\"+Nr[e]}function H(e,t){return null==e?ae:e[t]}function V(e){return pr.test(e)}function G(e){return fr.test(e)}function W(e){for(var t,r=[];!(t=e.next()).done;)r.push(t.value);return r}function U(e){var t=-1,r=Array(e.size);return e.forEach(function(e,a){r[++t]=[a,e]}),r}function q(e,t){return function(r){return e(t(r))}}function Y(e,t){for(var r=-1,a=e.length,n=0,o=[];++r<a;){var i=e[r];i!==t&&i!==se||(e[r]=se,o[n++]=r)}return o}function Z(e){var t=-1,r=Array(e.size);return e.forEach(function(e){r[++t]=e}),r}function K(e){var t=-1,r=Array(e.size);return e.forEach(function(e){r[++t]=[e,e]}),r}function J(e,t,r){for(var a=r-1,n=e.length;++a<n;)if(e[a]===t)return a;return-1}function X(e,t,r){for(var a=r+1;a--;)if(e[a]===t)return a;return a}function $(e){return V(e)?ee(e):Br(e)}function Q(e){return V(e)?te(e):_(e)}function ee(e){for(var t=dr.lastIndex=0;dr.test(e);)++t;return t}function te(e){return e.match(dr)||[]}function re(e){return e.match(mr)||[]}var ae,ne=200,oe="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",ie="Expected a function",le="__lodash_hash_undefined__",se="__lodash_placeholder__",ue=1,he=2,ce=4,de=1,me=2,pe=1,fe=2,ve=4,ye=8,ge=16,_e=32,Te=64,xe=128,we=256,Ne=512,be=30,Le="...",Se=800,ke=16,De=1,Me=2,Ae=1/0,Ie=9007199254740991,ze=1.7976931348623157e308,Ce=NaN,Re=4294967295,Ee=Re-1,Pe=Re>>>1,Oe=[["ary",xe],["bind",pe],["bindKey",fe],["curry",ye],["curryRight",ge],["flip",Ne],["partial",_e],["partialRight",Te],["rearg",we]],Fe="[object Arguments]",je="[object Array]",Be="[object AsyncFunction]",He="[object Boolean]",Ve="[object Date]",Ge="[object DOMException]",We="[object Error]",Ue="[object Function]",qe="[object GeneratorFunction]",Ye="[object Map]",Ze="[object Number]",Ke="[object Null]",Je="[object Object]",Xe="[object Proxy]",$e="[object RegExp]",Qe="[object Set]",et="[object String]",tt="[object Symbol]",rt="[object Undefined]",at="[object WeakMap]",nt="[object WeakSet]",ot="[object ArrayBuffer]",it="[object DataView]",lt="[object Float32Array]",st="[object Float64Array]",ut="[object Int8Array]",ht="[object Int16Array]",ct="[object Int32Array]",dt="[object Uint8Array]",mt="[object Uint8ClampedArray]",pt="[object Uint16Array]",ft="[object Uint32Array]",vt=/\b__p \+= '';/g,yt=/\b(__p \+=) '' \+/g,gt=/(__e\(.*?\)|\b__t\)) \+\n'';/g,_t=/&(?:amp|lt|gt|quot|#39);/g,Tt=/[&<>"']/g,xt=RegExp(_t.source),wt=RegExp(Tt.source),Nt=/<%-([\s\S]+?)%>/g,bt=/<%([\s\S]+?)%>/g,Lt=/<%=([\s\S]+?)%>/g,St=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,kt=/^\w*$/,Dt=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Mt=/[\\^$.*+?()[\]{}|]/g,At=RegExp(Mt.source),It=/^\s+|\s+$/g,zt=/^\s+/,Ct=/\s+$/,Rt=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Et=/\{\n\/\* \[wrapped with (.+)\] \*/,Pt=/,? & /,Ot=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Ft=/\\(\\)?/g,jt=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,Bt=/\w*$/,Ht=/^[-+]0x[0-9a-f]+$/i,Vt=/^0b[01]+$/i,Gt=/^\[object .+?Constructor\]$/,Wt=/^0o[0-7]+$/i,Ut=/^(?:0|[1-9]\d*)$/,qt=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Yt=/($^)/,Zt=/['\n\r\u2028\u2029\\]/g,Kt="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",Jt="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",Xt="["+Jt+"]",$t="["+Kt+"]",Qt="[a-z\\xdf-\\xf6\\xf8-\\xff]",er="\\ud83c[\\udffb-\\udfff]",tr="(?:\\ud83c[\\udde6-\\uddff]){2}",rr="[\\ud800-\\udbff][\\udc00-\\udfff]",ar="[A-Z\\xc0-\\xd6\\xd8-\\xde]",nr="(?:"+Qt+"|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])",or="(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?",ir="(?:\\u200d(?:"+["[^\\ud800-\\udfff]",tr,rr].join("|")+")[\\ufe0e\\ufe0f]?"+or+")*",lr="[\\ufe0e\\ufe0f]?"+or+ir,sr="(?:"+["[\\u2700-\\u27bf]",tr,rr].join("|")+")"+lr,ur="(?:"+["[^\\ud800-\\udfff]"+$t+"?",$t,tr,rr,"[\\ud800-\\udfff]"].join("|")+")",hr=RegExp("['’]","g"),cr=RegExp($t,"g"),dr=RegExp(er+"(?="+er+")|"+ur+lr,"g"),mr=RegExp([ar+"?"+Qt+"+(?:['’](?:d|ll|m|re|s|t|ve))?(?="+[Xt,ar,"$"].join("|")+")","(?:[A-Z\\xc0-\\xd6\\xd8-\\xde]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['’](?:D|LL|M|RE|S|T|VE))?(?="+[Xt,ar+nr,"$"].join("|")+")",ar+"?"+nr+"+(?:['’](?:d|ll|m|re|s|t|ve))?",ar+"+(?:['’](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])","\\d+",sr].join("|"),"g"),pr=RegExp("[\\u200d\\ud800-\\udfff"+Kt+"\\ufe0e\\ufe0f]"),fr=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,vr=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],yr=-1,gr={};gr[lt]=gr[st]=gr[ut]=gr[ht]=gr[ct]=gr[dt]=gr[mt]=gr[pt]=gr[ft]=!0,gr[Fe]=gr[je]=gr[ot]=gr[He]=gr[it]=gr[Ve]=gr[We]=gr[Ue]=gr[Ye]=gr[Ze]=gr[Je]=gr[$e]=gr[Qe]=gr[et]=gr[at]=!1;var _r={};_r[Fe]=_r[je]=_r[ot]=_r[it]=_r[He]=_r[Ve]=_r[lt]=_r[st]=_r[ut]=_r[ht]=_r[ct]=_r[Ye]=_r[Ze]=_r[Je]=_r[$e]=_r[Qe]=_r[et]=_r[tt]=_r[dt]=_r[mt]=_r[pt]=_r[ft]=!0,_r[We]=_r[Ue]=_r[at]=!1;var Tr={"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ā":"A","Ă":"A","Ą":"A","ā":"a","ă":"a","ą":"a","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","ć":"c","ĉ":"c","ċ":"c","č":"c","Ď":"D","Đ":"D","ď":"d","đ":"d","Ē":"E","Ĕ":"E","Ė":"E","Ę":"E","Ě":"E","ē":"e","ĕ":"e","ė":"e","ę":"e","ě":"e","Ĝ":"G","Ğ":"G","Ġ":"G","Ģ":"G","ĝ":"g","ğ":"g","ġ":"g","ģ":"g","Ĥ":"H","Ħ":"H","ĥ":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Į":"I","İ":"I","ĩ":"i","ī":"i","ĭ":"i","į":"i","ı":"i","Ĵ":"J","ĵ":"j","Ķ":"K","ķ":"k","ĸ":"k","Ĺ":"L","Ļ":"L","Ľ":"L","Ŀ":"L","Ł":"L","ĺ":"l","ļ":"l","ľ":"l","ŀ":"l","ł":"l","Ń":"N","Ņ":"N","Ň":"N","Ŋ":"N","ń":"n","ņ":"n","ň":"n","ŋ":"n","Ō":"O","Ŏ":"O","Ő":"O","ō":"o","ŏ":"o","ő":"o","Ŕ":"R","Ŗ":"R","Ř":"R","ŕ":"r","ŗ":"r","ř":"r","Ś":"S","Ŝ":"S","Ş":"S","Š":"S","ś":"s","ŝ":"s","ş":"s","š":"s","Ţ":"T","Ť":"T","Ŧ":"T","ţ":"t","ť":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Ů":"U","Ű":"U","Ų":"U","ũ":"u","ū":"u","ŭ":"u","ů":"u","ű":"u","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","Ż":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","IJ":"IJ","ij":"ij","Œ":"Oe","œ":"oe","ʼn":"'n","ſ":"s"},xr={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},wr={"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&#39;":"'"},Nr={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},br=parseFloat,Lr=parseInt,Sr="object"==(void 0===e?"undefined":o(e))&&e&&e.Object===Object&&e,kr="object"==("undefined"==typeof self?"undefined":o(self))&&self&&self.Object===Object&&self,Dr=Sr||kr||Function("return this")(),Mr="object"==o(t)&&t&&!t.nodeType&&t,Ar=Mr&&"object"==o(a)&&a&&!a.nodeType&&a,Ir=Ar&&Ar.exports===Mr,zr=Ir&&Sr.process,Cr=function(){try{return Ar&&Ar.require&&Ar.require("util").types||zr&&zr.binding&&zr.binding("util")}catch(e){}}(),Rr=Cr&&Cr.isArrayBuffer,Er=Cr&&Cr.isDate,Pr=Cr&&Cr.isMap,Or=Cr&&Cr.isRegExp,Fr=Cr&&Cr.isSet,jr=Cr&&Cr.isTypedArray,Br=k("length"),Hr=D(Tr),Vr=D(xr),Gr=D(wr),Wr=function e(t){function r(e){if(ts(e)&&!dd(e)&&!(e instanceof _)){if(e instanceof n)return e;if(dh.call(e,"__wrapped__"))return $o(e)}return new n(e)}function a(){}function n(e,t){this.__wrapped__=e,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=ae}function _(e){this.__wrapped__=e,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=Re,this.__views__=[]}function D(){var e=new _(this.__wrapped__);return e.__actions__=zn(this.__actions__),e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=zn(this.__iteratees__),e.__takeCount__=this.__takeCount__,e.__views__=zn(this.__views__),e}function J(){if(this.__filtered__){var e=new _(this);e.__dir__=-1,e.__filtered__=!0}else e=this.clone(),e.__dir__*=-1;return e}function ee(){var e=this.__wrapped__.value(),t=this.__dir__,r=dd(e),a=t<0,n=r?e.length:0,o=wo(0,n,this.__views__),i=o.start,l=o.end,s=l-i,u=a?l:i-1,h=this.__iteratees__,c=h.length,d=0,m=Vh(s,this.__takeCount__);if(!r||!a&&n==s&&m==s)return fn(e,this.__actions__);var p=[];e:for(;s--&&d<m;){u+=t;for(var f=-1,v=e[u];++f<c;){var y=h[f],g=y.iteratee,_=y.type,T=g(v);if(_==Me)v=T;else if(!T){if(_==De)continue e;break e}}p[d++]=v}return p}function te(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var a=e[t];this.set(a[0],a[1])}}function Ot(){this.__data__=$h?$h(null):{},this.size=0}function Kt(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}function Jt(e){var t=this.__data__;if($h){var r=t[e];return r===le?ae:r}return dh.call(t,e)?t[e]:ae}function Xt(e){var t=this.__data__;return $h?t[e]!==ae:dh.call(t,e)}function $t(e,t){var r=this.__data__;return this.size+=this.has(e)?0:1,r[e]=$h&&t===ae?le:t,this}function Qt(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var a=e[t];this.set(a[0],a[1])}}function er(){this.__data__=[],this.size=0}function tr(e){var t=this.__data__,r=qr(t,e);return!(r<0||(r==t.length-1?t.pop():Sh.call(t,r,1),--this.size,0))}function rr(e){var t=this.__data__,r=qr(t,e);return r<0?ae:t[r][1]}function ar(e){return qr(this.__data__,e)>-1}function nr(e,t){var r=this.__data__,a=qr(r,e);return a<0?(++this.size,r.push([e,t])):r[a][1]=t,this}function or(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var a=e[t];this.set(a[0],a[1])}}function ir(){this.size=0,this.__data__={hash:new te,map:new(Zh||Qt),string:new te}}function lr(e){var t=go(this,e).delete(e);return this.size-=t?1:0,t}function sr(e){return go(this,e).get(e)}function ur(e){return go(this,e).has(e)}function dr(e,t){var r=go(this,e),a=r.size;return r.set(e,t),this.size+=r.size==a?0:1,this}function mr(e){var t=-1,r=null==e?0:e.length;for(this.__data__=new or;++t<r;)this.add(e[t])}function pr(e){return this.__data__.set(e,le),this}function fr(e){return this.__data__.has(e)}function Tr(e){var t=this.__data__=new Qt(e);this.size=t.size}function xr(){this.__data__=new Qt,this.size=0}function wr(e){var t=this.__data__,r=t.delete(e);return this.size=t.size,r}function Nr(e){return this.__data__.get(e)}function Sr(e){return this.__data__.has(e)}function kr(e,t){var r=this.__data__;if(r instanceof Qt){var a=r.__data__;if(!Zh||a.length<ne-1)return a.push([e,t]),this.size=++r.size,this;r=this.__data__=new or(a)}return r.set(e,t),this.size=r.size,this}function Mr(e,t){var r=dd(e),a=!r&&cd(e),n=!r&&!a&&pd(e),o=!r&&!a&&!n&&_d(e),i=r||a||n||o,l=i?z(e.length,oh):[],s=l.length;for(var u in e)!t&&!dh.call(e,u)||i&&("length"==u||n&&("offset"==u||"parent"==u)||o&&("buffer"==u||"byteLength"==u||"byteOffset"==u)||Ao(u,s))||l.push(u);return l}function Ar(e){var t=e.length;return t?e[Ka(0,t-1)]:ae}function zr(e,t){return Zo(zn(e),$r(t,0,e.length))}function Cr(e){return Zo(zn(e))}function Br(e,t,r){(r===ae||Hl(e[t],r))&&(r!==ae||t in e)||Jr(e,t,r)}function Ur(e,t,r){var a=e[t];dh.call(e,t)&&Hl(a,r)&&(r!==ae||t in e)||Jr(e,t,r)}function qr(e,t){for(var r=e.length;r--;)if(Hl(e[r][0],t))return r;return-1}function Yr(e,t,r,a){return hc(e,function(e,n,o){t(a,e,r(e),o)}),a}function Zr(e,t){return e&&Cn(t,Ps(t),e)}function Kr(e,t){return e&&Cn(t,Os(t),e)}function Jr(e,t,r){"__proto__"==t&&Ah?Ah(e,t,{configurable:!0,enumerable:!0,value:r,writable:!0}):e[t]=r}function Xr(e,t){for(var r=-1,a=t.length,n=$u(a),o=null==e;++r<a;)n[r]=o?ae:Cs(e,t[r]);return n}function $r(e,t,r){return e===e&&(r!==ae&&(e=e<=r?e:r),t!==ae&&(e=e>=t?e:t)),e}function Qr(e,t,r,a,n,o){var i,l=t&ue,u=t&he,h=t&ce;if(r&&(i=n?r(e,a,n,o):r(e)),i!==ae)return i;if(!es(e))return e;var c=dd(e);if(c){if(i=Lo(e),!l)return zn(e,i)}else{var d=wc(e),m=d==Ue||d==qe;if(pd(e))return wn(e,l);if(d==Je||d==Fe||m&&!n){if(i=u||m?{}:So(e),!l)return u?En(e,Kr(i,e)):Rn(e,Zr(i,e))}else{if(!_r[d])return n?e:{};i=ko(e,d,l)}}o||(o=new Tr);var p=o.get(e);if(p)return p;if(o.set(e,i),gd(e))return e.forEach(function(a){i.add(Qr(a,t,r,a,e,o))}),i;if(vd(e))return e.forEach(function(a,n){i.set(n,Qr(a,t,r,n,e,o))}),i;var f=h?u?po:mo:u?Os:Ps,v=c?ae:f(e);return s(v||e,function(a,n){v&&(n=a,a=e[n]),Ur(i,n,Qr(a,t,r,n,e,o))}),i}function ea(e){var t=Ps(e);return function(r){return ta(r,e,t)}}function ta(e,t,r){var a=r.length;if(null==e)return!a;for(e=ah(e);a--;){var n=r[a],o=t[n],i=e[n];if(i===ae&&!(n in e)||!o(i))return!1}return!0}function ra(e,t,r){if("function"!=typeof e)throw new ih(ie);return Lc(function(){e.apply(ae,r)},t)}function aa(e,t,r,a){var n=-1,o=d,i=!0,l=e.length,s=[],u=t.length;if(!l)return s;r&&(t=p(t,R(r))),a?(o=m,i=!1):t.length>=ne&&(o=P,i=!1,t=new mr(t));e:for(;++n<l;){var h=e[n],c=null==r?h:r(h);if(h=a||0!==h?h:0,i&&c===c){for(var f=u;f--;)if(t[f]===c)continue e;s.push(h)}else o(t,c,a)||s.push(h)}return s}function na(e,t){var r=!0;return hc(e,function(e,a,n){return r=!!t(e,a,n)}),r}function oa(e,t,r){for(var a=-1,n=e.length;++a<n;){var o=e[a],i=t(o);if(null!=i&&(l===ae?i===i&&!ds(i):r(i,l)))var l=i,s=o}return s}function ia(e,t,r,a){var n=e.length;for(r=gs(r),r<0&&(r=-r>n?0:n+r),a=a===ae||a>n?n:gs(a),a<0&&(a+=n),a=r>a?0:_s(a);r<a;)e[r++]=t;return e}function la(e,t){var r=[];return hc(e,function(e,a,n){t(e,a,n)&&r.push(e)}),r}function sa(e,t,r,a,n){var o=-1,i=e.length;for(r||(r=Mo),n||(n=[]);++o<i;){var l=e[o];t>0&&r(l)?t>1?sa(l,t-1,r,a,n):f(n,l):a||(n[n.length]=l)}return n}function ua(e,t){return e&&dc(e,t,Ps)}function ha(e,t){return e&&mc(e,t,Ps)}function ca(e,t){return c(t,function(t){return Xl(e[t])})}function da(e,t){t=Tn(t,e);for(var r=0,a=t.length;null!=e&&r<a;)e=e[Ko(t[r++])];return r&&r==a?e:ae}function ma(e,t,r){var a=t(e);return dd(e)?a:f(a,r(e))}function pa(e){return null==e?e===ae?rt:Ke:Mh&&Mh in ah(e)?xo(e):Ho(e)}function fa(e,t){return e>t}function va(e,t){return null!=e&&dh.call(e,t)}function ya(e,t){return null!=e&&t in ah(e)}function ga(e,t,r){return e>=Vh(t,r)&&e<Hh(t,r)}function _a(e,t,r){for(var a=r?m:d,n=e[0].length,o=e.length,i=o,l=$u(o),s=1/0,u=[];i--;){var h=e[i];i&&t&&(h=p(h,R(t))),s=Vh(h.length,s),l[i]=!r&&(t||n>=120&&h.length>=120)?new mr(i&&h):ae}h=e[0];var c=-1,f=l[0];e:for(;++c<n&&u.length<s;){var v=h[c],y=t?t(v):v;if(v=r||0!==v?v:0,!(f?P(f,y):a(u,y,r))){for(i=o;--i;){var g=l[i];if(!(g?P(g,y):a(e[i],y,r)))continue e}f&&f.push(y),u.push(v)}}return u}function Ta(e,t,r,a){return ua(e,function(e,n,o){t(a,r(e),n,o)}),a}function xa(e,t,r){t=Tn(t,e),e=Go(e,t);var a=null==e?e:e[Ko(yi(t))];return null==a?ae:i(a,e,r)}function wa(e){return ts(e)&&pa(e)==Fe}function Na(e){return ts(e)&&pa(e)==ot}function ba(e){return ts(e)&&pa(e)==Ve}function La(e,t,r,a,n){return e===t||(null==e||null==t||!ts(e)&&!ts(t)?e!==e&&t!==t:Sa(e,t,r,a,La,n))}function Sa(e,t,r,a,n,o){var i=dd(e),l=dd(t),s=i?je:wc(e),u=l?je:wc(t);s=s==Fe?Je:s,u=u==Fe?Je:u;var h=s==Je,c=u==Je,d=s==u;if(d&&pd(e)){if(!pd(t))return!1;i=!0,h=!1}if(d&&!h)return o||(o=new Tr),i||_d(e)?so(e,t,r,a,n,o):uo(e,t,s,r,a,n,o);if(!(r&de)){var m=h&&dh.call(e,"__wrapped__"),p=c&&dh.call(t,"__wrapped__");if(m||p){var f=m?e.value():e,v=p?t.value():t;return o||(o=new Tr),n(f,v,r,a,o)}}return!!d&&(o||(o=new Tr),ho(e,t,r,a,n,o))}function ka(e){return ts(e)&&wc(e)==Ye}function Da(e,t,r,a){var n=r.length,o=n,i=!a;if(null==e)return!o;for(e=ah(e);n--;){var l=r[n];if(i&&l[2]?l[1]!==e[l[0]]:!(l[0]in e))return!1}for(;++n<o;){l=r[n];var s=l[0],u=e[s],h=l[1];if(i&&l[2]){if(u===ae&&!(s in e))return!1}else{var c=new Tr;if(a)var d=a(u,h,s,e,t,c);if(!(d===ae?La(h,u,de|me,a,c):d))return!1}}return!0}function Ma(e){return!(!es(e)||Eo(e))&&(Xl(e)?gh:Gt).test(Jo(e))}function Aa(e){return ts(e)&&pa(e)==$e}function Ia(e){return ts(e)&&wc(e)==Qe}function za(e){return ts(e)&&Ql(e.length)&&!!gr[pa(e)]}function Ca(e){return"function"==typeof e?e:null==e?Su:"object"==(void 0===e?"undefined":o(e))?dd(e)?ja(e[0],e[1]):Fa(e):Ru(e)}function Ra(e){if(!Po(e))return Bh(e);var t=[];for(var r in ah(e))dh.call(e,r)&&"constructor"!=r&&t.push(r);return t}function Ea(e){if(!es(e))return Bo(e);var t=Po(e),r=[];for(var a in e)("constructor"!=a||!t&&dh.call(e,a))&&r.push(a);return r}function Pa(e,t){return e<t}function Oa(e,t){var r=-1,a=Vl(e)?$u(e.length):[];return hc(e,function(e,n,o){a[++r]=t(e,n,o)}),a}function Fa(e){var t=_o(e);return 1==t.length&&t[0][2]?Fo(t[0][0],t[0][1]):function(r){return r===e||Da(r,e,t)}}function ja(e,t){return zo(e)&&Oo(t)?Fo(Ko(e),t):function(r){var a=Cs(r,e);return a===ae&&a===t?Es(r,e):La(t,a,de|me)}}function Ba(e,t,r,a,n){e!==t&&dc(t,function(o,i){if(es(o))n||(n=new Tr),Ha(e,t,i,r,Ba,a,n);else{var l=a?a(Uo(e,i),o,i+"",e,t,n):ae;l===ae&&(l=o),Br(e,i,l)}},Os)}function Ha(e,t,r,a,n,o,i){var l=Uo(e,r),s=Uo(t,r),u=i.get(s);if(u)return void Br(e,r,u);var h=o?o(l,s,r+"",e,t,i):ae,c=h===ae;if(c){var d=dd(s),m=!d&&pd(s),p=!d&&!m&&_d(s);h=s,d||m||p?dd(l)?h=l:Gl(l)?h=zn(l):m?(c=!1,h=wn(s,!0)):p?(c=!1,h=kn(s,!0)):h=[]:us(s)||cd(s)?(h=l,cd(l)?h=xs(l):es(l)&&!Xl(l)||(h=So(s))):c=!1}c&&(i.set(s,h),n(h,s,a,o,i),i.delete(s)),Br(e,r,h)}function Va(e,t){var r=e.length;if(r)return t+=t<0?r:0,Ao(t,r)?e[t]:ae}function Ga(e,t,r){var a=-1;return t=p(t.length?t:[Su],R(yo())),A(Oa(e,function(e,r,n){return{criteria:p(t,function(t){return t(e)}),index:++a,value:e}}),function(e,t){return Mn(e,t,r)})}function Wa(e,t){return Ua(e,t,function(t,r){return Es(e,r)})}function Ua(e,t,r){for(var a=-1,n=t.length,o={};++a<n;){var i=t[a],l=da(e,i);r(l,i)&&tn(o,Tn(i,e),l)}return o}function qa(e){return function(t){return da(t,e)}}function Ya(e,t,r,a){var n=a?b:N,o=-1,i=t.length,l=e;for(e===t&&(t=zn(t)),r&&(l=p(e,R(r)));++o<i;)for(var s=0,u=t[o],h=r?r(u):u;(s=n(l,h,s,a))>-1;)l!==e&&Sh.call(l,s,1),Sh.call(e,s,1);return e}function Za(e,t){for(var r=e?t.length:0,a=r-1;r--;){var n=t[r];if(r==a||n!==o){var o=n;Ao(n)?Sh.call(e,n,1):dn(e,n)}}return e}function Ka(e,t){return e+Eh(Uh()*(t-e+1))}function Ja(e,t,r,a){for(var n=-1,o=Hh(Rh((t-e)/(r||1)),0),i=$u(o);o--;)i[a?o:++n]=e,e+=r;return i}function Xa(e,t){var r="";if(!e||t<1||t>Ie)return r;do{t%2&&(r+=e),(t=Eh(t/2))&&(e+=e)}while(t);return r}function $a(e,t){return Sc(Vo(e,t,Su),e+"")}function Qa(e){return Ar(Ks(e))}function en(e,t){var r=Ks(e);return Zo(r,$r(t,0,r.length))}function tn(e,t,r,a){if(!es(e))return e;t=Tn(t,e);for(var n=-1,o=t.length,i=o-1,l=e;null!=l&&++n<o;){var s=Ko(t[n]),u=r;if(n!=i){var h=l[s];(u=a?a(h,s,l):ae)===ae&&(u=es(h)?h:Ao(t[n+1])?[]:{})}Ur(l,s,u),l=l[s]}return e}function rn(e){return Zo(Ks(e))}function an(e,t,r){var a=-1,n=e.length;t<0&&(t=-t>n?0:n+t),r=r>n?n:r,r<0&&(r+=n),n=t>r?0:r-t>>>0,t>>>=0;for(var o=$u(n);++a<n;)o[a]=e[a+t];return o}function nn(e,t){var r;return hc(e,function(e,a,n){return!(r=t(e,a,n))}),!!r}function on(e,t,r){var a=0,n=null==e?a:e.length;if("number"==typeof t&&t===t&&n<=Pe){for(;a<n;){var o=a+n>>>1,i=e[o];null!==i&&!ds(i)&&(r?i<=t:i<t)?a=o+1:n=o}return n}return ln(e,t,Su,r)}function ln(e,t,r,a){t=r(t);for(var n=0,o=null==e?0:e.length,i=t!==t,l=null===t,s=ds(t),u=t===ae;n<o;){var h=Eh((n+o)/2),c=r(e[h]),d=c!==ae,m=null===c,p=c===c,f=ds(c);if(i)var v=a||p;else v=u?p&&(a||d):l?p&&d&&(a||!m):s?p&&d&&!m&&(a||!f):!m&&!f&&(a?c<=t:c<t);v?n=h+1:o=h}return Vh(o,Ee)}function sn(e,t){for(var r=-1,a=e.length,n=0,o=[];++r<a;){var i=e[r],l=t?t(i):i;if(!r||!Hl(l,s)){var s=l;o[n++]=0===i?0:i}}return o}function un(e){return"number"==typeof e?e:ds(e)?Ce:+e}function hn(e){if("string"==typeof e)return e;if(dd(e))return p(e,hn)+"";if(ds(e))return sc?sc.call(e):"";var t=e+"";return"0"==t&&1/e==-Ae?"-0":t}function cn(e,t,r){var a=-1,n=d,o=e.length,i=!0,l=[],s=l;if(r)i=!1,n=m;else if(o>=ne){var u=t?null:gc(e);if(u)return Z(u);i=!1,n=P,s=new mr}else s=t?[]:l;e:for(;++a<o;){var h=e[a],c=t?t(h):h;if(h=r||0!==h?h:0,i&&c===c){for(var p=s.length;p--;)if(s[p]===c)continue e;t&&s.push(c),l.push(h)}else n(s,c,r)||(s!==l&&s.push(c),l.push(h))}return l}function dn(e,t){return t=Tn(t,e),null==(e=Go(e,t))||delete e[Ko(yi(t))]}function mn(e,t,r,a){return tn(e,t,r(da(e,t)),a)}function pn(e,t,r,a){for(var n=e.length,o=a?n:-1;(a?o--:++o<n)&&t(e[o],o,e););return r?an(e,a?0:o,a?o+1:n):an(e,a?o+1:0,a?n:o)}function fn(e,t){var r=e;return r instanceof _&&(r=r.value()),v(t,function(e,t){return t.func.apply(t.thisArg,f([e],t.args))},r)}function vn(e,t,r){var a=e.length;if(a<2)return a?cn(e[0]):[];for(var n=-1,o=$u(a);++n<a;)for(var i=e[n],l=-1;++l<a;)l!=n&&(o[n]=aa(o[n]||i,e[l],t,r));return cn(sa(o,1),t,r)}function yn(e,t,r){for(var a=-1,n=e.length,o=t.length,i={};++a<n;){var l=a<o?t[a]:ae;r(i,e[a],l)}return i}function gn(e){return Gl(e)?e:[]}function _n(e){return"function"==typeof e?e:Su}function Tn(e,t){return dd(e)?e:zo(e,t)?[e]:kc(Ns(e))}function xn(e,t,r){var a=e.length;return r=r===ae?a:r,!t&&r>=a?e:an(e,t,r)}function wn(e,t){if(t)return e.slice();var r=e.length,a=wh?wh(r):new e.constructor(r);return e.copy(a),a}function Nn(e){var t=new e.constructor(e.byteLength);return new xh(t).set(new xh(e)),t}function bn(e,t){var r=t?Nn(e.buffer):e.buffer;return new e.constructor(r,e.byteOffset,e.byteLength)}function Ln(e){var t=new e.constructor(e.source,Bt.exec(e));return t.lastIndex=e.lastIndex,t}function Sn(e){return lc?ah(lc.call(e)):{}}function kn(e,t){var r=t?Nn(e.buffer):e.buffer;return new e.constructor(r,e.byteOffset,e.length)}function Dn(e,t){if(e!==t){var r=e!==ae,a=null===e,n=e===e,o=ds(e),i=t!==ae,l=null===t,s=t===t,u=ds(t);if(!l&&!u&&!o&&e>t||o&&i&&s&&!l&&!u||a&&i&&s||!r&&s||!n)return 1;if(!a&&!o&&!u&&e<t||u&&r&&n&&!a&&!o||l&&r&&n||!i&&n||!s)return-1}return 0}function Mn(e,t,r){for(var a=-1,n=e.criteria,o=t.criteria,i=n.length,l=r.length;++a<i;){var s=Dn(n[a],o[a]);if(s)return a>=l?s:s*("desc"==r[a]?-1:1)}return e.index-t.index}function An(e,t,r,a){for(var n=-1,o=e.length,i=r.length,l=-1,s=t.length,u=Hh(o-i,0),h=$u(s+u),c=!a;++l<s;)h[l]=t[l];for(;++n<i;)(c||n<o)&&(h[r[n]]=e[n]);for(;u--;)h[l++]=e[n++];return h}function In(e,t,r,a){for(var n=-1,o=e.length,i=-1,l=r.length,s=-1,u=t.length,h=Hh(o-l,0),c=$u(h+u),d=!a;++n<h;)c[n]=e[n];for(var m=n;++s<u;)c[m+s]=t[s];for(;++i<l;)(d||n<o)&&(c[m+r[i]]=e[n++]);return c}function zn(e,t){var r=-1,a=e.length;for(t||(t=$u(a));++r<a;)t[r]=e[r];return t}function Cn(e,t,r,a){var n=!r;r||(r={});for(var o=-1,i=t.length;++o<i;){var l=t[o],s=a?a(r[l],e[l],l,r,e):ae;s===ae&&(s=e[l]),n?Jr(r,l,s):Ur(r,l,s)}return r}function Rn(e,t){return Cn(e,Tc(e),t)}function En(e,t){return Cn(e,xc(e),t)}function Pn(e,t){return function(r,a){var n=dd(r)?l:Yr,o=t?t():{};return n(r,e,yo(a,2),o)}}function On(e){return $a(function(t,r){var a=-1,n=r.length,o=n>1?r[n-1]:ae,i=n>2?r[2]:ae;for(o=e.length>3&&"function"==typeof o?(n--,o):ae,i&&Io(r[0],r[1],i)&&(o=n<3?ae:o,n=1),t=ah(t);++a<n;){var l=r[a];l&&e(t,l,a,o)}return t})}function Fn(e,t){return function(r,a){if(null==r)return r;if(!Vl(r))return e(r,a);for(var n=r.length,o=t?n:-1,i=ah(r);(t?o--:++o<n)&&!1!==a(i[o],o,i););return r}}function jn(e){return function(t,r,a){for(var n=-1,o=ah(t),i=a(t),l=i.length;l--;){var s=i[e?l:++n];if(!1===r(o[s],s,o))break}return t}}function Bn(e,t,r){function a(){return(this&&this!==Dr&&this instanceof a?o:e).apply(n?r:this,arguments)}var n=t&pe,o=Gn(e);return a}function Hn(e){return function(t){t=Ns(t);var r=V(t)?Q(t):ae,a=r?r[0]:t.charAt(0),n=r?xn(r,1).join(""):t.slice(1);return a[e]()+n}}function Vn(e){return function(t){return v(xu(tu(t).replace(hr,"")),e,"")}}function Gn(e){return function(){var t=arguments;switch(t.length){case 0:return new e;case 1:return new e(t[0]);case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[1],t[2]);case 4:return new e(t[0],t[1],t[2],t[3]);case 5:return new e(t[0],t[1],t[2],t[3],t[4]);case 6:return new e(t[0],t[1],t[2],t[3],t[4],t[5]);case 7:return new e(t[0],t[1],t[2],t[3],t[4],t[5],t[6])}var r=uc(e.prototype),a=e.apply(r,t);return es(a)?a:r}}function Wn(e,t,r){function a(){for(var o=arguments.length,l=$u(o),s=o,u=vo(a);s--;)l[s]=arguments[s];var h=o<3&&l[0]!==u&&l[o-1]!==u?[]:Y(l,u);return(o-=h.length)<r?to(e,t,Yn,a.placeholder,ae,l,h,ae,ae,r-o):i(this&&this!==Dr&&this instanceof a?n:e,this,l)}var n=Gn(e);return a}function Un(e){return function(t,r,a){var n=ah(t);if(!Vl(t)){var o=yo(r,3);t=Ps(t),r=function(e){return o(n[e],e,n)}}var i=e(t,r,a);return i>-1?n[o?t[i]:i]:ae}}function qn(e){return co(function(t){var r=t.length,a=r,o=n.prototype.thru;for(e&&t.reverse();a--;){var i=t[a];if("function"!=typeof i)throw new ih(ie);if(o&&!l&&"wrapper"==fo(i))var l=new n([],!0)}for(a=l?a:r;++a<r;){i=t[a];var s=fo(i),u="wrapper"==s?_c(i):ae;l=u&&Ro(u[0])&&u[1]==(xe|ye|_e|we)&&!u[4].length&&1==u[9]?l[fo(u[0])].apply(l,u[3]):1==i.length&&Ro(i)?l[s]():l.thru(i)}return function(){var e=arguments,a=e[0];if(l&&1==e.length&&dd(a))return l.plant(a).value();for(var n=0,o=r?t[n].apply(this,e):a;++n<r;)o=t[n].call(this,o);return o}})}function Yn(e,t,r,a,n,o,i,l,s,u){function h(){for(var y=arguments.length,g=$u(y),_=y;_--;)g[_]=arguments[_];if(p)var T=vo(h),x=j(g,T);if(a&&(g=An(g,a,n,p)),o&&(g=In(g,o,i,p)),y-=x,p&&y<u){var w=Y(g,T);return to(e,t,Yn,h.placeholder,r,g,w,l,s,u-y)}var N=d?r:this,b=m?N[e]:e;return y=g.length,l?g=Wo(g,l):f&&y>1&&g.reverse(),c&&s<y&&(g.length=s),this&&this!==Dr&&this instanceof h&&(b=v||Gn(b)),b.apply(N,g)}var c=t&xe,d=t&pe,m=t&fe,p=t&(ye|ge),f=t&Ne,v=m?ae:Gn(e);return h}function Zn(e,t){return function(r,a){return Ta(r,e,t(a),{})}}function Kn(e,t){return function(r,a){var n;if(r===ae&&a===ae)return t;if(r!==ae&&(n=r),a!==ae){if(n===ae)return a;"string"==typeof r||"string"==typeof a?(r=hn(r),a=hn(a)):(r=un(r),a=un(a)),n=e(r,a)}return n}}function Jn(e){return co(function(t){return t=p(t,R(yo())),$a(function(r){var a=this;return e(t,function(e){return i(e,a,r)})})})}function Xn(e,t){t=t===ae?" ":hn(t);var r=t.length;if(r<2)return r?Xa(t,e):t;var a=Xa(t,Rh(e/$(t)));return V(t)?xn(Q(a),0,e).join(""):a.slice(0,e)}function $n(e,t,r,a){function n(){for(var t=-1,s=arguments.length,u=-1,h=a.length,c=$u(h+s),d=this&&this!==Dr&&this instanceof n?l:e;++u<h;)c[u]=a[u];for(;s--;)c[u++]=arguments[++t];return i(d,o?r:this,c)}var o=t&pe,l=Gn(e);return n}function Qn(e){return function(t,r,a){return a&&"number"!=typeof a&&Io(t,r,a)&&(r=a=ae),t=ys(t),r===ae?(r=t,t=0):r=ys(r),a=a===ae?t<r?1:-1:ys(a),Ja(t,r,a,e)}}function eo(e){return function(t,r){return"string"==typeof t&&"string"==typeof r||(t=Ts(t),r=Ts(r)),e(t,r)}}function to(e,t,r,a,n,o,i,l,s,u){var h=t&ye,c=h?i:ae,d=h?ae:i,m=h?o:ae,p=h?ae:o;t|=h?_e:Te,(t&=~(h?Te:_e))&ve||(t&=~(pe|fe));var f=[e,t,n,m,c,p,d,l,s,u],v=r.apply(ae,f);return Ro(e)&&bc(v,f),v.placeholder=a,qo(v,e,t)}function ro(e){var t=rh[e];return function(e,r){if(e=Ts(e),r=null==r?0:Vh(gs(r),292)){var a=(Ns(e)+"e").split("e");return a=(Ns(t(a[0]+"e"+(+a[1]+r)))+"e").split("e"),+(a[0]+"e"+(+a[1]-r))}return t(e)}}function ao(e){return function(t){var r=wc(t);return r==Ye?U(t):r==Qe?K(t):C(t,e(t))}}function no(e,t,r,a,n,o,i,l){var s=t&fe;if(!s&&"function"!=typeof e)throw new ih(ie);var u=a?a.length:0;if(u||(t&=~(_e|Te),a=n=ae),i=i===ae?i:Hh(gs(i),0),l=l===ae?l:gs(l),u-=n?n.length:0,t&Te){var h=a,c=n;a=n=ae}var d=s?ae:_c(e),m=[e,t,r,a,n,h,c,o,i,l];if(d&&jo(m,d),e=m[0],t=m[1],r=m[2],a=m[3],n=m[4],l=m[9]=m[9]===ae?s?0:e.length:Hh(m[9]-u,0),!l&&t&(ye|ge)&&(t&=~(ye|ge)),t&&t!=pe)p=t==ye||t==ge?Wn(e,t,l):t!=_e&&t!=(pe|_e)||n.length?Yn.apply(ae,m):$n(e,t,r,a);else var p=Bn(e,t,r);return qo((d?pc:bc)(p,m),e,t)}function oo(e,t,r,a){return e===ae||Hl(e,uh[r])&&!dh.call(a,r)?t:e}function io(e,t,r,a,n,o){return es(e)&&es(t)&&(o.set(t,e),Ba(e,t,ae,io,o),o.delete(t)),e}function lo(e){return us(e)?ae:e}function so(e,t,r,a,n,o){var i=r&de,l=e.length,s=t.length;if(l!=s&&!(i&&s>l))return!1;var u=o.get(e);if(u&&o.get(t))return u==t;var h=-1,c=!0,d=r&me?new mr:ae;for(o.set(e,t),o.set(t,e);++h<l;){var m=e[h],p=t[h];if(a)var f=i?a(p,m,h,t,e,o):a(m,p,h,e,t,o);if(f!==ae){if(f)continue;c=!1;break}if(d){if(!g(t,function(e,t){if(!P(d,t)&&(m===e||n(m,e,r,a,o)))return d.push(t)})){c=!1;break}}else if(m!==p&&!n(m,p,r,a,o)){c=!1;break}}return o.delete(e),o.delete(t),c}function uo(e,t,r,a,n,o,i){switch(r){case it:if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case ot:return!(e.byteLength!=t.byteLength||!o(new xh(e),new xh(t)));case He:case Ve:case Ze:return Hl(+e,+t);case We:return e.name==t.name&&e.message==t.message;case $e:case et:return e==t+"";case Ye:var l=U;case Qe:var s=a&de;if(l||(l=Z),e.size!=t.size&&!s)return!1;var u=i.get(e);if(u)return u==t;a|=me,i.set(e,t);var h=so(l(e),l(t),a,n,o,i);return i.delete(e),h;case tt:if(lc)return lc.call(e)==lc.call(t)}return!1}function ho(e,t,r,a,n,o){var i=r&de,l=mo(e),s=l.length;if(s!=mo(t).length&&!i)return!1;for(var u=s;u--;){var h=l[u];if(!(i?h in t:dh.call(t,h)))return!1}var c=o.get(e);if(c&&o.get(t))return c==t;var d=!0;o.set(e,t),o.set(t,e);for(var m=i;++u<s;){h=l[u];var p=e[h],f=t[h];if(a)var v=i?a(f,p,h,t,e,o):a(p,f,h,e,t,o);if(!(v===ae?p===f||n(p,f,r,a,o):v)){d=!1;break}m||(m="constructor"==h)}if(d&&!m){var y=e.constructor,g=t.constructor;y!=g&&"constructor"in e&&"constructor"in t&&!("function"==typeof y&&y instanceof y&&"function"==typeof g&&g instanceof g)&&(d=!1)}return o.delete(e),o.delete(t),d}function co(e){return Sc(Vo(e,ae,ui),e+"")}function mo(e){return ma(e,Ps,Tc)}function po(e){return ma(e,Os,xc)}function fo(e){for(var t=e.name+"",r=ec[t],a=dh.call(ec,t)?r.length:0;a--;){var n=r[a],o=n.func;if(null==o||o==e)return n.name}return t}function vo(e){return(dh.call(r,"placeholder")?r:e).placeholder}function yo(){var e=r.iteratee||ku;return e=e===ku?Ca:e,arguments.length?e(arguments[0],arguments[1]):e}function go(e,t){var r=e.__data__;return Co(t)?r["string"==typeof t?"string":"hash"]:r.map}function _o(e){for(var t=Ps(e),r=t.length;r--;){var a=t[r],n=e[a];t[r]=[a,n,Oo(n)]}return t}function To(e,t){var r=H(e,t);return Ma(r)?r:ae}function xo(e){var t=dh.call(e,Mh),r=e[Mh];try{e[Mh]=ae;var a=!0}catch(e){}var n=fh.call(e);return a&&(t?e[Mh]=r:delete e[Mh]),n}function wo(e,t,r){for(var a=-1,n=r.length;++a<n;){var o=r[a],i=o.size;switch(o.type){case"drop":e+=i;break;case"dropRight":t-=i;break;case"take":t=Vh(t,e+i);break;case"takeRight":e=Hh(e,t-i)}}return{start:e,end:t}}function No(e){var t=e.match(Et);return t?t[1].split(Pt):[]}function bo(e,t,r){t=Tn(t,e);for(var a=-1,n=t.length,o=!1;++a<n;){var i=Ko(t[a]);if(!(o=null!=e&&r(e,i)))break;e=e[i]}return o||++a!=n?o:!!(n=null==e?0:e.length)&&Ql(n)&&Ao(i,n)&&(dd(e)||cd(e))}function Lo(e){var t=e.length,r=new e.constructor(t);return t&&"string"==typeof e[0]&&dh.call(e,"index")&&(r.index=e.index,r.input=e.input),r}function So(e){return"function"!=typeof e.constructor||Po(e)?{}:uc(Nh(e))}function ko(e,t,r){var a=e.constructor;switch(t){case ot:return Nn(e);case He:case Ve:return new a(+e);case it:return bn(e,r);case lt:case st:case ut:case ht:case ct:case dt:case mt:case pt:case ft:return kn(e,r);case Ye:return new a;case Ze:case et:return new a(e);case $e:return Ln(e);case Qe:return new a;case tt:return Sn(e)}}function Do(e,t){var r=t.length;if(!r)return e;var a=r-1;return t[a]=(r>1?"& ":"")+t[a],t=t.join(r>2?", ":" "),e.replace(Rt,"{\n/* [wrapped with "+t+"] */\n")}function Mo(e){return dd(e)||cd(e)||!!(kh&&e&&e[kh])}function Ao(e,t){var r=void 0===e?"undefined":o(e);return!!(t=null==t?Ie:t)&&("number"==r||"symbol"!=r&&Ut.test(e))&&e>-1&&e%1==0&&e<t}function Io(e,t,r){if(!es(r))return!1;var a=void 0===t?"undefined":o(t);return!!("number"==a?Vl(r)&&Ao(t,r.length):"string"==a&&t in r)&&Hl(r[t],e)}function zo(e,t){if(dd(e))return!1;var r=void 0===e?"undefined":o(e);return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=e&&!ds(e))||kt.test(e)||!St.test(e)||null!=t&&e in ah(t)}function Co(e){var t=void 0===e?"undefined":o(e);return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e}function Ro(e){var t=fo(e),a=r[t];if("function"!=typeof a||!(t in _.prototype))return!1;if(e===a)return!0;var n=_c(a);return!!n&&e===n[0]}function Eo(e){return!!ph&&ph in e}function Po(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||uh)}function Oo(e){return e===e&&!es(e)}function Fo(e,t){return function(r){return null!=r&&r[e]===t&&(t!==ae||e in ah(r))}}function jo(e,t){var r=e[1],a=t[1],n=r|a,o=n<(pe|fe|xe),i=a==xe&&r==ye||a==xe&&r==we&&e[7].length<=t[8]||a==(xe|we)&&t[7].length<=t[8]&&r==ye;if(!o&&!i)return e;a&pe&&(e[2]=t[2],n|=r&pe?0:ve);var l=t[3];if(l){var s=e[3];e[3]=s?An(s,l,t[4]):l,e[4]=s?Y(e[3],se):t[4]}return l=t[5],l&&(s=e[5],e[5]=s?In(s,l,t[6]):l,e[6]=s?Y(e[5],se):t[6]),l=t[7],l&&(e[7]=l),a&xe&&(e[8]=null==e[8]?t[8]:Vh(e[8],t[8])),null==e[9]&&(e[9]=t[9]),e[0]=t[0],e[1]=n,e}function Bo(e){var t=[];if(null!=e)for(var r in ah(e))t.push(r);return t}function Ho(e){return fh.call(e)}function Vo(e,t,r){return t=Hh(t===ae?e.length-1:t,0),function(){for(var a=arguments,n=-1,o=Hh(a.length-t,0),l=$u(o);++n<o;)l[n]=a[t+n];n=-1;for(var s=$u(t+1);++n<t;)s[n]=a[n];return s[t]=r(l),i(e,this,s)}}function Go(e,t){return t.length<2?e:da(e,an(t,0,-1))}function Wo(e,t){for(var r=e.length,a=Vh(t.length,r),n=zn(e);a--;){var o=t[a];e[a]=Ao(o,r)?n[o]:ae}return e}function Uo(e,t){if("__proto__"!=t)return e[t]}function qo(e,t,r){var a=t+"";return Sc(e,Do(a,Xo(No(a),r)))}function Yo(e){var t=0,r=0;return function(){var a=Gh(),n=ke-(a-r);if(r=a,n>0){if(++t>=Se)return arguments[0]}else t=0;return e.apply(ae,arguments)}}function Zo(e,t){var r=-1,a=e.length,n=a-1;for(t=t===ae?a:t;++r<t;){var o=Ka(r,n),i=e[o];e[o]=e[r],e[r]=i}return e.length=t,e}function Ko(e){if("string"==typeof e||ds(e))return e;var t=e+"";return"0"==t&&1/e==-Ae?"-0":t}function Jo(e){if(null!=e){try{return ch.call(e)}catch(e){}try{return e+""}catch(e){}}return""}function Xo(e,t){return s(Oe,function(r){var a="_."+r[0];t&r[1]&&!d(e,a)&&e.push(a)}),e.sort()}function $o(e){if(e instanceof _)return e.clone();var t=new n(e.__wrapped__,e.__chain__);return t.__actions__=zn(e.__actions__),t.__index__=e.__index__,t.__values__=e.__values__,t}function Qo(e,t,r){t=(r?Io(e,t,r):t===ae)?1:Hh(gs(t),0);var a=null==e?0:e.length;if(!a||t<1)return[];for(var n=0,o=0,i=$u(Rh(a/t));n<a;)i[o++]=an(e,n,n+=t);return i}function ei(e){for(var t=-1,r=null==e?0:e.length,a=0,n=[];++t<r;){var o=e[t];o&&(n[a++]=o)}return n}function ti(){var e=arguments.length;if(!e)return[];for(var t=$u(e-1),r=arguments[0],a=e;a--;)t[a-1]=arguments[a];return f(dd(r)?zn(r):[r],sa(t,1))}function ri(e,t,r){var a=null==e?0:e.length;return a?(t=r||t===ae?1:gs(t),an(e,t<0?0:t,a)):[]}function ai(e,t,r){var a=null==e?0:e.length;return a?(t=r||t===ae?1:gs(t),t=a-t,an(e,0,t<0?0:t)):[]}function ni(e,t){return e&&e.length?pn(e,yo(t,3),!0,!0):[]}function oi(e,t){return e&&e.length?pn(e,yo(t,3),!0):[]}function ii(e,t,r,a){var n=null==e?0:e.length;return n?(r&&"number"!=typeof r&&Io(e,t,r)&&(r=0,a=n),ia(e,t,r,a)):[]}function li(e,t,r){var a=null==e?0:e.length;if(!a)return-1;var n=null==r?0:gs(r);return n<0&&(n=Hh(a+n,0)),w(e,yo(t,3),n)}function si(e,t,r){var a=null==e?0:e.length;if(!a)return-1;var n=a-1;return r!==ae&&(n=gs(r),n=r<0?Hh(a+n,0):Vh(n,a-1)),w(e,yo(t,3),n,!0)}function ui(e){return(null==e?0:e.length)?sa(e,1):[]}function hi(e){return(null==e?0:e.length)?sa(e,Ae):[]}function ci(e,t){return(null==e?0:e.length)?(t=t===ae?1:gs(t),sa(e,t)):[]}function di(e){for(var t=-1,r=null==e?0:e.length,a={};++t<r;){var n=e[t];a[n[0]]=n[1]}return a}function mi(e){return e&&e.length?e[0]:ae}function pi(e,t,r){var a=null==e?0:e.length;if(!a)return-1;var n=null==r?0:gs(r);return n<0&&(n=Hh(a+n,0)),N(e,t,n)}function fi(e){return(null==e?0:e.length)?an(e,0,-1):[]}function vi(e,t){return null==e?"":jh.call(e,t)}function yi(e){var t=null==e?0:e.length;return t?e[t-1]:ae}function gi(e,t,r){var a=null==e?0:e.length;if(!a)return-1;var n=a;return r!==ae&&(n=gs(r),n=n<0?Hh(a+n,0):Vh(n,a-1)),t===t?X(e,t,n):w(e,L,n,!0)}function _i(e,t){return e&&e.length?Va(e,gs(t)):ae}function Ti(e,t){return e&&e.length&&t&&t.length?Ya(e,t):e}function xi(e,t,r){return e&&e.length&&t&&t.length?Ya(e,t,yo(r,2)):e}function wi(e,t,r){return e&&e.length&&t&&t.length?Ya(e,t,ae,r):e}function Ni(e,t){var r=[];if(!e||!e.length)return r;var a=-1,n=[],o=e.length;for(t=yo(t,3);++a<o;){var i=e[a];t(i,a,e)&&(r.push(i),n.push(a))}return Za(e,n),r}function bi(e){return null==e?e:qh.call(e)}function Li(e,t,r){var a=null==e?0:e.length;return a?(r&&"number"!=typeof r&&Io(e,t,r)?(t=0,r=a):(t=null==t?0:gs(t),r=r===ae?a:gs(r)),an(e,t,r)):[]}function Si(e,t){return on(e,t)}function ki(e,t,r){return ln(e,t,yo(r,2))}function Di(e,t){var r=null==e?0:e.length;if(r){var a=on(e,t);if(a<r&&Hl(e[a],t))return a}return-1}function Mi(e,t){return on(e,t,!0)}function Ai(e,t,r){return ln(e,t,yo(r,2),!0)}function Ii(e,t){if(null==e?0:e.length){var r=on(e,t,!0)-1;if(Hl(e[r],t))return r}return-1}function zi(e){return e&&e.length?sn(e):[]}function Ci(e,t){return e&&e.length?sn(e,yo(t,2)):[]}function Ri(e){var t=null==e?0:e.length;return t?an(e,1,t):[]}function Ei(e,t,r){return e&&e.length?(t=r||t===ae?1:gs(t),an(e,0,t<0?0:t)):[]}function Pi(e,t,r){var a=null==e?0:e.length;return a?(t=r||t===ae?1:gs(t),t=a-t,an(e,t<0?0:t,a)):[]}function Oi(e,t){return e&&e.length?pn(e,yo(t,3),!1,!0):[]}function Fi(e,t){return e&&e.length?pn(e,yo(t,3)):[]}function ji(e){return e&&e.length?cn(e):[]}function Bi(e,t){return e&&e.length?cn(e,yo(t,2)):[]}function Hi(e,t){return t="function"==typeof t?t:ae,e&&e.length?cn(e,ae,t):[]}function Vi(e){if(!e||!e.length)return[];var t=0;return e=c(e,function(e){if(Gl(e))return t=Hh(e.length,t),!0}),z(t,function(t){return p(e,k(t))})}function Gi(e,t){if(!e||!e.length)return[];var r=Vi(e);return null==t?r:p(r,function(e){return i(t,ae,e)})}function Wi(e,t){return yn(e||[],t||[],Ur)}function Ui(e,t){return yn(e||[],t||[],tn)}function qi(e){var t=r(e);return t.__chain__=!0,t}function Yi(e,t){return t(e),e}function Zi(e,t){return t(e)}function Ki(){return qi(this)}function Ji(){return new n(this.value(),this.__chain__)}function Xi(){this.__values__===ae&&(this.__values__=vs(this.value()));var e=this.__index__>=this.__values__.length;return{done:e,value:e?ae:this.__values__[this.__index__++]}}function $i(){return this}function Qi(e){for(var t,r=this;r instanceof a;){var n=$o(r);n.__index__=0,n.__values__=ae,t?o.__wrapped__=n:t=n;var o=n;r=r.__wrapped__}return o.__wrapped__=e,t}function el(){var e=this.__wrapped__;if(e instanceof _){var t=e;return this.__actions__.length&&(t=new _(this)),t=t.reverse(),t.__actions__.push({func:Zi,args:[bi],thisArg:ae}),new n(t,this.__chain__)}return this.thru(bi)}function tl(){return fn(this.__wrapped__,this.__actions__)}function rl(e,t,r){var a=dd(e)?h:na;return r&&Io(e,t,r)&&(t=ae),a(e,yo(t,3))}function al(e,t){return(dd(e)?c:la)(e,yo(t,3))}function nl(e,t){return sa(hl(e,t),1)}function ol(e,t){return sa(hl(e,t),Ae)}function il(e,t,r){return r=r===ae?1:gs(r),sa(hl(e,t),r)}function ll(e,t){return(dd(e)?s:hc)(e,yo(t,3))}function sl(e,t){return(dd(e)?u:cc)(e,yo(t,3))}function ul(e,t,r,a){e=Vl(e)?e:Ks(e),r=r&&!a?gs(r):0;var n=e.length;return r<0&&(r=Hh(n+r,0)),cs(e)?r<=n&&e.indexOf(t,r)>-1:!!n&&N(e,t,r)>-1}function hl(e,t){return(dd(e)?p:Oa)(e,yo(t,3))}function cl(e,t,r,a){return null==e?[]:(dd(t)||(t=null==t?[]:[t]),r=a?ae:r,dd(r)||(r=null==r?[]:[r]),Ga(e,t,r))}function dl(e,t,r){var a=dd(e)?v:M,n=arguments.length<3;return a(e,yo(t,4),r,n,hc)}function ml(e,t,r){var a=dd(e)?y:M,n=arguments.length<3;return a(e,yo(t,4),r,n,cc)}function pl(e,t){return(dd(e)?c:la)(e,Dl(yo(t,3)))}function fl(e){return(dd(e)?Ar:Qa)(e)}function vl(e,t,r){return t=(r?Io(e,t,r):t===ae)?1:gs(t),(dd(e)?zr:en)(e,t)}function yl(e){return(dd(e)?Cr:rn)(e)}function gl(e){if(null==e)return 0;if(Vl(e))return cs(e)?$(e):e.length;var t=wc(e);return t==Ye||t==Qe?e.size:Ra(e).length}function _l(e,t,r){var a=dd(e)?g:nn;return r&&Io(e,t,r)&&(t=ae),a(e,yo(t,3))}function Tl(e,t){if("function"!=typeof t)throw new ih(ie);return e=gs(e),function(){if(--e<1)return t.apply(this,arguments)}}function xl(e,t,r){return t=r?ae:t,t=e&&null==t?e.length:t,no(e,xe,ae,ae,ae,ae,t)}function wl(e,t){var r;if("function"!=typeof t)throw new ih(ie);return e=gs(e),function(){return--e>0&&(r=t.apply(this,arguments)),e<=1&&(t=ae),r}}function Nl(e,t,r){t=r?ae:t;var a=no(e,ye,ae,ae,ae,ae,ae,t);return a.placeholder=Nl.placeholder,a}function bl(e,t,r){t=r?ae:t;var a=no(e,ge,ae,ae,ae,ae,ae,t);return a.placeholder=bl.placeholder,a}function Ll(e,t,r){function a(t){var r=d,a=m;return d=m=ae,g=t,f=e.apply(a,r)}function n(e){return g=e,v=Lc(l,t),_?a(e):f}function o(e){var r=e-y,a=e-g,n=t-r;return T?Vh(n,p-a):n}function i(e){var r=e-y,a=e-g;return y===ae||r>=t||r<0||T&&a>=p}function l(){var e=ed();if(i(e))return s(e);v=Lc(l,o(e))}function s(e){return v=ae,x&&d?a(e):(d=m=ae,f)}function u(){v!==ae&&yc(v),g=0,d=y=m=v=ae}function h(){return v===ae?f:s(ed())}function c(){var e=ed(),r=i(e);if(d=arguments,m=this,y=e,r){if(v===ae)return n(y);if(T)return v=Lc(l,t),a(y)}return v===ae&&(v=Lc(l,t)),f}var d,m,p,f,v,y,g=0,_=!1,T=!1,x=!0;if("function"!=typeof e)throw new ih(ie);return t=Ts(t)||0,es(r)&&(_=!!r.leading,T="maxWait"in r,p=T?Hh(Ts(r.maxWait)||0,t):p,x="trailing"in r?!!r.trailing:x),c.cancel=u,c.flush=h,c}function Sl(e){return no(e,Ne)}function kl(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new ih(ie);var r=function r(){var a=arguments,n=t?t.apply(this,a):a[0],o=r.cache;if(o.has(n))return o.get(n);var i=e.apply(this,a);return r.cache=o.set(n,i)||o,i};return r.cache=new(kl.Cache||or),r}function Dl(e){if("function"!=typeof e)throw new ih(ie);return function(){var t=arguments;switch(t.length){case 0:return!e.call(this);case 1:return!e.call(this,t[0]);case 2:return!e.call(this,t[0],t[1]);case 3:return!e.call(this,t[0],t[1],t[2])}return!e.apply(this,t)}}function Ml(e){return wl(2,e)}function Al(e,t){if("function"!=typeof e)throw new ih(ie);return t=t===ae?t:gs(t),$a(e,t)}function Il(e,t){if("function"!=typeof e)throw new ih(ie);return t=null==t?0:Hh(gs(t),0),$a(function(r){var a=r[t],n=xn(r,0,t);return a&&f(n,a),i(e,this,n)})}function zl(e,t,r){var a=!0,n=!0;if("function"!=typeof e)throw new ih(ie);return es(r)&&(a="leading"in r?!!r.leading:a,n="trailing"in r?!!r.trailing:n),Ll(e,t,{leading:a,maxWait:t,trailing:n})}function Cl(e){return xl(e,1)}function Rl(e,t){return id(_n(t),e)}function El(){if(!arguments.length)return[];var e=arguments[0];return dd(e)?e:[e]}function Pl(e){return Qr(e,ce)}function Ol(e,t){return t="function"==typeof t?t:ae,Qr(e,ce,t)}function Fl(e){return Qr(e,ue|ce)}function jl(e,t){return t="function"==typeof t?t:ae,Qr(e,ue|ce,t)}function Bl(e,t){return null==t||ta(e,t,Ps(t))}function Hl(e,t){return e===t||e!==e&&t!==t}function Vl(e){return null!=e&&Ql(e.length)&&!Xl(e)}function Gl(e){return ts(e)&&Vl(e)}function Wl(e){return!0===e||!1===e||ts(e)&&pa(e)==He}function Ul(e){return ts(e)&&1===e.nodeType&&!us(e)}function ql(e){if(null==e)return!0;if(Vl(e)&&(dd(e)||"string"==typeof e||"function"==typeof e.splice||pd(e)||_d(e)||cd(e)))return!e.length;var t=wc(e);if(t==Ye||t==Qe)return!e.size;if(Po(e))return!Ra(e).length;for(var r in e)if(dh.call(e,r))return!1;return!0}function Yl(e,t){return La(e,t)}function Zl(e,t,r){r="function"==typeof r?r:ae;var a=r?r(e,t):ae;return a===ae?La(e,t,ae,r):!!a}function Kl(e){if(!ts(e))return!1;var t=pa(e);return t==We||t==Ge||"string"==typeof e.message&&"string"==typeof e.name&&!us(e)}function Jl(e){return"number"==typeof e&&Fh(e)}function Xl(e){if(!es(e))return!1;var t=pa(e);return t==Ue||t==qe||t==Be||t==Xe}function $l(e){return"number"==typeof e&&e==gs(e)}function Ql(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=Ie}function es(e){var t=void 0===e?"undefined":o(e);return null!=e&&("object"==t||"function"==t)}function ts(e){return null!=e&&"object"==(void 0===e?"undefined":o(e))}function rs(e,t){return e===t||Da(e,t,_o(t))}function as(e,t,r){return r="function"==typeof r?r:ae,Da(e,t,_o(t),r)}function ns(e){return ss(e)&&e!=+e}function os(e){if(Nc(e))throw new eh(oe);return Ma(e)}function is(e){return null===e}function ls(e){return null==e}function ss(e){return"number"==typeof e||ts(e)&&pa(e)==Ze}function us(e){if(!ts(e)||pa(e)!=Je)return!1;var t=Nh(e);if(null===t)return!0;var r=dh.call(t,"constructor")&&t.constructor;return"function"==typeof r&&r instanceof r&&ch.call(r)==vh}function hs(e){return $l(e)&&e>=-Ie&&e<=Ie}function cs(e){return"string"==typeof e||!dd(e)&&ts(e)&&pa(e)==et}function ds(e){return"symbol"==(void 0===e?"undefined":o(e))||ts(e)&&pa(e)==tt}function ms(e){return e===ae}function ps(e){return ts(e)&&wc(e)==at}function fs(e){return ts(e)&&pa(e)==nt}function vs(e){if(!e)return[];if(Vl(e))return cs(e)?Q(e):zn(e);if(Dh&&e[Dh])return W(e[Dh]());var t=wc(e);return(t==Ye?U:t==Qe?Z:Ks)(e)}function ys(e){return e?(e=Ts(e))===Ae||e===-Ae?(e<0?-1:1)*ze:e===e?e:0:0===e?e:0}function gs(e){var t=ys(e),r=t%1;return t===t?r?t-r:t:0}function _s(e){return e?$r(gs(e),0,Re):0}function Ts(e){if("number"==typeof e)return e;if(ds(e))return Ce;if(es(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=es(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(It,"");var r=Vt.test(e);return r||Wt.test(e)?Lr(e.slice(2),r?2:8):Ht.test(e)?Ce:+e}function xs(e){return Cn(e,Os(e))}function ws(e){return e?$r(gs(e),-Ie,Ie):0===e?e:0}function Ns(e){return null==e?"":hn(e)}function bs(e,t){var r=uc(e);return null==t?r:Zr(r,t)}function Ls(e,t){return x(e,yo(t,3),ua)}function Ss(e,t){return x(e,yo(t,3),ha)}function ks(e,t){return null==e?e:dc(e,yo(t,3),Os)}function Ds(e,t){return null==e?e:mc(e,yo(t,3),Os)}function Ms(e,t){return e&&ua(e,yo(t,3))}function As(e,t){return e&&ha(e,yo(t,3))}function Is(e){return null==e?[]:ca(e,Ps(e))}function zs(e){return null==e?[]:ca(e,Os(e))}function Cs(e,t,r){var a=null==e?ae:da(e,t);return a===ae?r:a}function Rs(e,t){return null!=e&&bo(e,t,va)}function Es(e,t){return null!=e&&bo(e,t,ya)}function Ps(e){return Vl(e)?Mr(e):Ra(e)}function Os(e){return Vl(e)?Mr(e,!0):Ea(e)}function Fs(e,t){var r={};return t=yo(t,3),ua(e,function(e,a,n){Jr(r,t(e,a,n),e)}),r}function js(e,t){var r={};return t=yo(t,3),ua(e,function(e,a,n){Jr(r,a,t(e,a,n))}),r}function Bs(e,t){return Hs(e,Dl(yo(t)))}function Hs(e,t){if(null==e)return{};var r=p(po(e),function(e){return[e]});return t=yo(t),Ua(e,r,function(e,r){return t(e,r[0])})}function Vs(e,t,r){t=Tn(t,e);var a=-1,n=t.length;for(n||(n=1,e=ae);++a<n;){var o=null==e?ae:e[Ko(t[a])];o===ae&&(a=n,o=r),e=Xl(o)?o.call(e):o}return e}function Gs(e,t,r){return null==e?e:tn(e,t,r)}function Ws(e,t,r,a){return a="function"==typeof a?a:ae,null==e?e:tn(e,t,r,a)}function Us(e,t,r){var a=dd(e),n=a||pd(e)||_d(e);if(t=yo(t,4),null==r){var o=e&&e.constructor;r=n?a?new o:[]:es(e)&&Xl(o)?uc(Nh(e)):{}}return(n?s:ua)(e,function(e,a,n){return t(r,e,a,n)}),r}function qs(e,t){return null==e||dn(e,t)}function Ys(e,t,r){return null==e?e:mn(e,t,_n(r))}function Zs(e,t,r,a){return a="function"==typeof a?a:ae,null==e?e:mn(e,t,_n(r),a)}function Ks(e){return null==e?[]:E(e,Ps(e))}function Js(e){return null==e?[]:E(e,Os(e))}function Xs(e,t,r){return r===ae&&(r=t,t=ae),r!==ae&&(r=Ts(r),r=r===r?r:0),t!==ae&&(t=Ts(t),t=t===t?t:0),$r(Ts(e),t,r)}function $s(e,t,r){return t=ys(t),r===ae?(r=t,t=0):r=ys(r),e=Ts(e),ga(e,t,r)}function Qs(e,t,r){if(r&&"boolean"!=typeof r&&Io(e,t,r)&&(t=r=ae),r===ae&&("boolean"==typeof t?(r=t,t=ae):"boolean"==typeof e&&(r=e,e=ae)),e===ae&&t===ae?(e=0,t=1):(e=ys(e),t===ae?(t=e,e=0):t=ys(t)),e>t){var a=e;e=t,t=a}if(r||e%1||t%1){var n=Uh();return Vh(e+n*(t-e+br("1e-"+((n+"").length-1))),t)}return Ka(e,t)}function eu(e){return Ud(Ns(e).toLowerCase())}function tu(e){return(e=Ns(e))&&e.replace(qt,Hr).replace(cr,"")}function ru(e,t,r){e=Ns(e),t=hn(t);var a=e.length;r=r===ae?a:$r(gs(r),0,a);var n=r;return(r-=t.length)>=0&&e.slice(r,n)==t}function au(e){return e=Ns(e),e&&wt.test(e)?e.replace(Tt,Vr):e}function nu(e){return e=Ns(e),e&&At.test(e)?e.replace(Mt,"\\$&"):e}function ou(e,t,r){e=Ns(e),t=gs(t);var a=t?$(e):0;if(!t||a>=t)return e;var n=(t-a)/2;return Xn(Eh(n),r)+e+Xn(Rh(n),r)}function iu(e,t,r){e=Ns(e),t=gs(t);var a=t?$(e):0;return t&&a<t?e+Xn(t-a,r):e}function lu(e,t,r){e=Ns(e),t=gs(t);var a=t?$(e):0;return t&&a<t?Xn(t-a,r)+e:e}function su(e,t,r){return r||null==t?t=0:t&&(t=+t),Wh(Ns(e).replace(zt,""),t||0)}function uu(e,t,r){return t=(r?Io(e,t,r):t===ae)?1:gs(t),Xa(Ns(e),t)}function hu(){var e=arguments,t=Ns(e[0]);return e.length<3?t:t.replace(e[1],e[2])}function cu(e,t,r){return r&&"number"!=typeof r&&Io(e,t,r)&&(t=r=ae),(r=r===ae?Re:r>>>0)?(e=Ns(e),e&&("string"==typeof t||null!=t&&!yd(t))&&!(t=hn(t))&&V(e)?xn(Q(e),0,r):e.split(t,r)):[]}function du(e,t,r){return e=Ns(e),r=null==r?0:$r(gs(r),0,e.length),t=hn(t),e.slice(r,r+t.length)==t}function mu(e,t,a){var n=r.templateSettings;a&&Io(e,t,a)&&(t=ae),e=Ns(e),t=bd({},t,n,oo);var o,i,l=bd({},t.imports,n.imports,oo),s=Ps(l),u=E(l,s),h=0,c=t.interpolate||Yt,d="__p += '",m=nh((t.escape||Yt).source+"|"+c.source+"|"+(c===Lt?jt:Yt).source+"|"+(t.evaluate||Yt).source+"|$","g"),p="//# sourceURL="+("sourceURL"in t?t.sourceURL:"lodash.templateSources["+ ++yr+"]")+"\n";e.replace(m,function(t,r,a,n,l,s){return a||(a=n),d+=e.slice(h,s).replace(Zt,B),r&&(o=!0,d+="' +\n__e("+r+") +\n'"),l&&(i=!0,d+="';\n"+l+";\n__p += '"),a&&(d+="' +\n((__t = ("+a+")) == null ? '' : __t) +\n'"),h=s+t.length,t}),d+="';\n";var f=t.variable;f||(d="with (obj) {\n"+d+"\n}\n"),d=(i?d.replace(vt,""):d).replace(yt,"$1").replace(gt,"$1;"),d="function("+(f||"obj")+") {\n"+(f?"":"obj || (obj = {});\n")+"var __t, __p = ''"+(o?", __e = _.escape":"")+(i?", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n":";\n")+d+"return __p\n}";var v=qd(function(){return th(s,p+"return "+d).apply(ae,u)});if(v.source=d,Kl(v))throw v;return v}function pu(e){return Ns(e).toLowerCase()}function fu(e){return Ns(e).toUpperCase()}function vu(e,t,r){if((e=Ns(e))&&(r||t===ae))return e.replace(It,"");if(!e||!(t=hn(t)))return e;var a=Q(e),n=Q(t);return xn(a,O(a,n),F(a,n)+1).join("")}function yu(e,t,r){if((e=Ns(e))&&(r||t===ae))return e.replace(Ct,"");if(!e||!(t=hn(t)))return e;var a=Q(e);return xn(a,0,F(a,Q(t))+1).join("")}function gu(e,t,r){if((e=Ns(e))&&(r||t===ae))return e.replace(zt,"");if(!e||!(t=hn(t)))return e;var a=Q(e);return xn(a,O(a,Q(t))).join("")}function _u(e,t){var r=be,a=Le;if(es(t)){var n="separator"in t?t.separator:n;r="length"in t?gs(t.length):r,a="omission"in t?hn(t.omission):a}e=Ns(e);var o=e.length;if(V(e)){var i=Q(e);o=i.length}if(r>=o)return e;var l=r-$(a);if(l<1)return a;var s=i?xn(i,0,l).join(""):e.slice(0,l);if(n===ae)return s+a;if(i&&(l+=s.length-l),yd(n)){if(e.slice(l).search(n)){var u,h=s;for(n.global||(n=nh(n.source,Ns(Bt.exec(n))+"g")),n.lastIndex=0;u=n.exec(h);)var c=u.index;s=s.slice(0,c===ae?l:c)}}else if(e.indexOf(hn(n),l)!=l){var d=s.lastIndexOf(n);d>-1&&(s=s.slice(0,d))}return s+a}function Tu(e){return e=Ns(e),e&&xt.test(e)?e.replace(_t,Gr):e}function xu(e,t,r){return e=Ns(e),t=r?ae:t,t===ae?G(e)?re(e):T(e):e.match(t)||[]}function wu(e){var t=null==e?0:e.length,r=yo();return e=t?p(e,function(e){if("function"!=typeof e[1])throw new ih(ie);return[r(e[0]),e[1]]}):[],$a(function(r){for(var a=-1;++a<t;){var n=e[a];if(i(n[0],this,r))return i(n[1],this,r)}})}function Nu(e){return ea(Qr(e,ue))}function bu(e){return function(){return e}}function Lu(e,t){return null==e||e!==e?t:e}function Su(e){return e}function ku(e){return Ca("function"==typeof e?e:Qr(e,ue))}function Du(e){return Fa(Qr(e,ue))}function Mu(e,t){return ja(e,Qr(t,ue))}function Au(e,t,r){var a=Ps(t),n=ca(t,a);null!=r||es(t)&&(n.length||!a.length)||(r=t,t=e,e=this,n=ca(t,Ps(t)));var o=!(es(r)&&"chain"in r&&!r.chain),i=Xl(e);return s(n,function(r){var a=t[r];e[r]=a,i&&(e.prototype[r]=function(){var t=this.__chain__;if(o||t){var r=e(this.__wrapped__);return(r.__actions__=zn(this.__actions__)).push({func:a,args:arguments,thisArg:e}),r.__chain__=t,r}return a.apply(e,f([this.value()],arguments))})}),e}function Iu(){return Dr._===this&&(Dr._=yh),this}function zu(){}function Cu(e){return e=gs(e),$a(function(t){return Va(t,e)})}function Ru(e){return zo(e)?k(Ko(e)):qa(e)}function Eu(e){return function(t){return null==e?ae:da(e,t)}}function Pu(){return[]}function Ou(){return!1}function Fu(){return{}}function ju(){return""}function Bu(){return!0}function Hu(e,t){if((e=gs(e))<1||e>Ie)return[];var r=Re,a=Vh(e,Re);t=yo(t),e-=Re;for(var n=z(a,t);++r<e;)t(r);return n}function Vu(e){return dd(e)?p(e,Ko):ds(e)?[e]:zn(kc(Ns(e)))}function Gu(e){var t=++mh;return Ns(e)+t}function Wu(e){return e&&e.length?oa(e,Su,fa):ae}function Uu(e,t){return e&&e.length?oa(e,yo(t,2),fa):ae}function qu(e){return S(e,Su)}function Yu(e,t){return S(e,yo(t,2))}function Zu(e){return e&&e.length?oa(e,Su,Pa):ae}function Ku(e,t){return e&&e.length?oa(e,yo(t,2),Pa):ae}function Ju(e){return e&&e.length?I(e,Su):0}function Xu(e,t){return e&&e.length?I(e,yo(t,2)):0}t=null==t?Dr:Wr.defaults(Dr.Object(),t,Wr.pick(Dr,vr));var $u=t.Array,Qu=t.Date,eh=t.Error,th=t.Function,rh=t.Math,ah=t.Object,nh=t.RegExp,oh=t.String,ih=t.TypeError,lh=$u.prototype,sh=th.prototype,uh=ah.prototype,hh=t["__core-js_shared__"],ch=sh.toString,dh=uh.hasOwnProperty,mh=0,ph=function(){var e=/[^.]+$/.exec(hh&&hh.keys&&hh.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}(),fh=uh.toString,vh=ch.call(ah),yh=Dr._,gh=nh("^"+ch.call(dh).replace(Mt,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),_h=Ir?t.Buffer:ae,Th=t.Symbol,xh=t.Uint8Array,wh=_h?_h.allocUnsafe:ae,Nh=q(ah.getPrototypeOf,ah),bh=ah.create,Lh=uh.propertyIsEnumerable,Sh=lh.splice,kh=Th?Th.isConcatSpreadable:ae,Dh=Th?Th.iterator:ae,Mh=Th?Th.toStringTag:ae,Ah=function(){try{var e=To(ah,"defineProperty");return e({},"",{}),e}catch(e){}}(),Ih=t.clearTimeout!==Dr.clearTimeout&&t.clearTimeout,zh=Qu&&Qu.now!==Dr.Date.now&&Qu.now,Ch=t.setTimeout!==Dr.setTimeout&&t.setTimeout,Rh=rh.ceil,Eh=rh.floor,Ph=ah.getOwnPropertySymbols,Oh=_h?_h.isBuffer:ae,Fh=t.isFinite,jh=lh.join,Bh=q(ah.keys,ah),Hh=rh.max,Vh=rh.min,Gh=Qu.now,Wh=t.parseInt,Uh=rh.random,qh=lh.reverse,Yh=To(t,"DataView"),Zh=To(t,"Map"),Kh=To(t,"Promise"),Jh=To(t,"Set"),Xh=To(t,"WeakMap"),$h=To(ah,"create"),Qh=Xh&&new Xh,ec={},tc=Jo(Yh),rc=Jo(Zh),ac=Jo(Kh),nc=Jo(Jh),oc=Jo(Xh),ic=Th?Th.prototype:ae,lc=ic?ic.valueOf:ae,sc=ic?ic.toString:ae,uc=function(){function e(){}return function(t){if(!es(t))return{};if(bh)return bh(t);e.prototype=t;var r=new e;return e.prototype=ae,r}}();r.templateSettings={escape:Nt,evaluate:bt,interpolate:Lt,variable:"",imports:{_:r}},r.prototype=a.prototype,r.prototype.constructor=r,n.prototype=uc(a.prototype),n.prototype.constructor=n,_.prototype=uc(a.prototype),_.prototype.constructor=_,te.prototype.clear=Ot,te.prototype.delete=Kt,te.prototype.get=Jt,te.prototype.has=Xt,te.prototype.set=$t,Qt.prototype.clear=er,Qt.prototype.delete=tr,Qt.prototype.get=rr,Qt.prototype.has=ar,Qt.prototype.set=nr,or.prototype.clear=ir,or.prototype.delete=lr,or.prototype.get=sr,or.prototype.has=ur,or.prototype.set=dr,mr.prototype.add=mr.prototype.push=pr,mr.prototype.has=fr,Tr.prototype.clear=xr,Tr.prototype.delete=wr,Tr.prototype.get=Nr,Tr.prototype.has=Sr,Tr.prototype.set=kr;var hc=Fn(ua),cc=Fn(ha,!0),dc=jn(),mc=jn(!0),pc=Qh?function(e,t){return Qh.set(e,t),e}:Su,fc=Ah?function(e,t){return Ah(e,"toString",{configurable:!0,enumerable:!1,value:bu(t),writable:!0})}:Su,vc=$a,yc=Ih||function(e){return Dr.clearTimeout(e)},gc=Jh&&1/Z(new Jh([,-0]))[1]==Ae?function(e){return new Jh(e)}:zu,_c=Qh?function(e){return Qh.get(e)}:zu,Tc=Ph?function(e){return null==e?[]:(e=ah(e),c(Ph(e),function(t){return Lh.call(e,t)}))}:Pu,xc=Ph?function(e){for(var t=[];e;)f(t,Tc(e)),e=Nh(e);return t}:Pu,wc=pa;(Yh&&wc(new Yh(new ArrayBuffer(1)))!=it||Zh&&wc(new Zh)!=Ye||Kh&&"[object Promise]"!=wc(Kh.resolve())||Jh&&wc(new Jh)!=Qe||Xh&&wc(new Xh)!=at)&&(wc=function(e){var t=pa(e),r=t==Je?e.constructor:ae,a=r?Jo(r):"";if(a)switch(a){case tc:return it;case rc:return Ye;case ac:return"[object Promise]";case nc:return Qe;case oc:return at}return t});var Nc=hh?Xl:Ou,bc=Yo(pc),Lc=Ch||function(e,t){return Dr.setTimeout(e,t)},Sc=Yo(fc),kc=function(e){var t=kl(e,function(e){return 500===r.size&&r.clear(),e}),r=t.cache;return t}(function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(""),e.replace(Dt,function(e,r,a,n){t.push(a?n.replace(Ft,"$1"):r||e)}),t}),Dc=$a(function(e,t){return Gl(e)?aa(e,sa(t,1,Gl,!0)):[]}),Mc=$a(function(e,t){var r=yi(t);return Gl(r)&&(r=ae),Gl(e)?aa(e,sa(t,1,Gl,!0),yo(r,2)):[]}),Ac=$a(function(e,t){var r=yi(t);return Gl(r)&&(r=ae),Gl(e)?aa(e,sa(t,1,Gl,!0),ae,r):[]}),Ic=$a(function(e){var t=p(e,gn);return t.length&&t[0]===e[0]?_a(t):[]}),zc=$a(function(e){var t=yi(e),r=p(e,gn);return t===yi(r)?t=ae:r.pop(),r.length&&r[0]===e[0]?_a(r,yo(t,2)):[]}),Cc=$a(function(e){var t=yi(e),r=p(e,gn);return t="function"==typeof t?t:ae,t&&r.pop(),r.length&&r[0]===e[0]?_a(r,ae,t):[]}),Rc=$a(Ti),Ec=co(function(e,t){var r=null==e?0:e.length,a=Xr(e,t);return Za(e,p(t,function(e){return Ao(e,r)?+e:e}).sort(Dn)),a}),Pc=$a(function(e){return cn(sa(e,1,Gl,!0))}),Oc=$a(function(e){var t=yi(e);return Gl(t)&&(t=ae),cn(sa(e,1,Gl,!0),yo(t,2))}),Fc=$a(function(e){var t=yi(e);return t="function"==typeof t?t:ae,cn(sa(e,1,Gl,!0),ae,t)}),jc=$a(function(e,t){return Gl(e)?aa(e,t):[]}),Bc=$a(function(e){return vn(c(e,Gl))}),Hc=$a(function(e){var t=yi(e);return Gl(t)&&(t=ae),vn(c(e,Gl),yo(t,2))}),Vc=$a(function(e){var t=yi(e);return t="function"==typeof t?t:ae,vn(c(e,Gl),ae,t)}),Gc=$a(Vi),Wc=$a(function(e){var t=e.length,r=t>1?e[t-1]:ae;return r="function"==typeof r?(e.pop(),r):ae,Gi(e,r)}),Uc=co(function(e){var t=e.length,r=t?e[0]:0,a=this.__wrapped__,o=function(t){return Xr(t,e)};return!(t>1||this.__actions__.length)&&a instanceof _&&Ao(r)?(a=a.slice(r,+r+(t?1:0)),a.__actions__.push({func:Zi,args:[o],thisArg:ae}),new n(a,this.__chain__).thru(function(e){return t&&!e.length&&e.push(ae),e})):this.thru(o)}),qc=Pn(function(e,t,r){dh.call(e,r)?++e[r]:Jr(e,r,1)}),Yc=Un(li),Zc=Un(si),Kc=Pn(function(e,t,r){dh.call(e,r)?e[r].push(t):Jr(e,r,[t])}),Jc=$a(function(e,t,r){var a=-1,n="function"==typeof t,o=Vl(e)?$u(e.length):[];return hc(e,function(e){o[++a]=n?i(t,e,r):xa(e,t,r)}),o}),Xc=Pn(function(e,t,r){Jr(e,r,t)}),$c=Pn(function(e,t,r){e[r?0:1].push(t)},function(){return[[],[]]}),Qc=$a(function(e,t){if(null==e)return[];var r=t.length;return r>1&&Io(e,t[0],t[1])?t=[]:r>2&&Io(t[0],t[1],t[2])&&(t=[t[0]]),Ga(e,sa(t,1),[])}),ed=zh||function(){return Dr.Date.now()},td=$a(function(e,t,r){var a=pe;if(r.length){var n=Y(r,vo(td));a|=_e}return no(e,a,t,r,n)}),rd=$a(function(e,t,r){var a=pe|fe;if(r.length){var n=Y(r,vo(rd));a|=_e}return no(t,a,e,r,n)}),ad=$a(function(e,t){return ra(e,1,t)}),nd=$a(function(e,t,r){return ra(e,Ts(t)||0,r)});kl.Cache=or;var od=vc(function(e,t){t=1==t.length&&dd(t[0])?p(t[0],R(yo())):p(sa(t,1),R(yo()));var r=t.length;return $a(function(a){for(var n=-1,o=Vh(a.length,r);++n<o;)a[n]=t[n].call(this,a[n]);return i(e,this,a)})}),id=$a(function(e,t){var r=Y(t,vo(id));return no(e,_e,ae,t,r)}),ld=$a(function(e,t){var r=Y(t,vo(ld));return no(e,Te,ae,t,r)}),sd=co(function(e,t){return no(e,we,ae,ae,ae,t)}),ud=eo(fa),hd=eo(function(e,t){return e>=t}),cd=wa(function(){return arguments}())?wa:function(e){return ts(e)&&dh.call(e,"callee")&&!Lh.call(e,"callee")},dd=$u.isArray,md=Rr?R(Rr):Na,pd=Oh||Ou,fd=Er?R(Er):ba,vd=Pr?R(Pr):ka,yd=Or?R(Or):Aa,gd=Fr?R(Fr):Ia,_d=jr?R(jr):za,Td=eo(Pa),xd=eo(function(e,t){return e<=t}),wd=On(function(e,t){if(Po(t)||Vl(t))return void Cn(t,Ps(t),e);for(var r in t)dh.call(t,r)&&Ur(e,r,t[r])}),Nd=On(function(e,t){Cn(t,Os(t),e)}),bd=On(function(e,t,r,a){Cn(t,Os(t),e,a)}),Ld=On(function(e,t,r,a){Cn(t,Ps(t),e,a)}),Sd=co(Xr),kd=$a(function(e,t){e=ah(e);var r=-1,a=t.length,n=a>2?t[2]:ae;for(n&&Io(t[0],t[1],n)&&(a=1);++r<a;)for(var o=t[r],i=Os(o),l=-1,s=i.length;++l<s;){var u=i[l],h=e[u];(h===ae||Hl(h,uh[u])&&!dh.call(e,u))&&(e[u]=o[u])}return e}),Dd=$a(function(e){return e.push(ae,io),i(Cd,ae,e)}),Md=Zn(function(e,t,r){null!=t&&"function"!=typeof t.toString&&(t=fh.call(t)),e[t]=r},bu(Su)),Ad=Zn(function(e,t,r){null!=t&&"function"!=typeof t.toString&&(t=fh.call(t)),dh.call(e,t)?e[t].push(r):e[t]=[r]},yo),Id=$a(xa),zd=On(function(e,t,r){Ba(e,t,r)}),Cd=On(function(e,t,r,a){Ba(e,t,r,a)}),Rd=co(function(e,t){var r={};if(null==e)return r;var a=!1;t=p(t,function(t){return t=Tn(t,e),a||(a=t.length>1),t}),Cn(e,po(e),r),a&&(r=Qr(r,ue|he|ce,lo));for(var n=t.length;n--;)dn(r,t[n]);return r}),Ed=co(function(e,t){return null==e?{}:Wa(e,t)}),Pd=ao(Ps),Od=ao(Os),Fd=Vn(function(e,t,r){return t=t.toLowerCase(),e+(r?eu(t):t)}),jd=Vn(function(e,t,r){return e+(r?"-":"")+t.toLowerCase()}),Bd=Vn(function(e,t,r){return e+(r?" ":"")+t.toLowerCase()}),Hd=Hn("toLowerCase"),Vd=Vn(function(e,t,r){return e+(r?"_":"")+t.toLowerCase()}),Gd=Vn(function(e,t,r){return e+(r?" ":"")+Ud(t)}),Wd=Vn(function(e,t,r){return e+(r?" ":"")+t.toUpperCase()}),Ud=Hn("toUpperCase"),qd=$a(function(e,t){try{return i(e,ae,t)}catch(e){return Kl(e)?e:new eh(e)}}),Yd=co(function(e,t){return s(t,function(t){t=Ko(t),Jr(e,t,td(e[t],e))}),e}),Zd=qn(),Kd=qn(!0),Jd=$a(function(e,t){return function(r){return xa(r,e,t)}}),Xd=$a(function(e,t){return function(r){return xa(e,r,t)}}),$d=Jn(p),Qd=Jn(h),em=Jn(g),tm=Qn(),rm=Qn(!0),am=Kn(function(e,t){return e+t},0),nm=ro("ceil"),om=Kn(function(e,t){return e/t},1),im=ro("floor"),lm=Kn(function(e,t){return e*t},1),sm=ro("round"),um=Kn(function(e,t){return e-t},0);return r.after=Tl,r.ary=xl,r.assign=wd,r.assignIn=Nd,r.assignInWith=bd,r.assignWith=Ld,r.at=Sd,r.before=wl,r.bind=td,r.bindAll=Yd,r.bindKey=rd,r.castArray=El,r.chain=qi,r.chunk=Qo,r.compact=ei,r.concat=ti,r.cond=wu,r.conforms=Nu,r.constant=bu,r.countBy=qc,r.create=bs,r.curry=Nl,r.curryRight=bl,r.debounce=Ll,r.defaults=kd,r.defaultsDeep=Dd,r.defer=ad,r.delay=nd,r.difference=Dc,r.differenceBy=Mc,r.differenceWith=Ac,r.drop=ri,r.dropRight=ai,r.dropRightWhile=ni,r.dropWhile=oi,r.fill=ii,r.filter=al,r.flatMap=nl,r.flatMapDeep=ol,r.flatMapDepth=il,r.flatten=ui,r.flattenDeep=hi,r.flattenDepth=ci,r.flip=Sl,r.flow=Zd,r.flowRight=Kd,r.fromPairs=di,r.functions=Is,r.functionsIn=zs,r.groupBy=Kc,r.initial=fi,r.intersection=Ic,r.intersectionBy=zc,r.intersectionWith=Cc,r.invert=Md,r.invertBy=Ad,r.invokeMap=Jc,r.iteratee=ku,r.keyBy=Xc,r.keys=Ps,r.keysIn=Os,r.map=hl,r.mapKeys=Fs,r.mapValues=js,r.matches=Du,r.matchesProperty=Mu,r.memoize=kl,r.merge=zd,r.mergeWith=Cd,r.method=Jd,r.methodOf=Xd,r.mixin=Au,r.negate=Dl,r.nthArg=Cu,r.omit=Rd,r.omitBy=Bs,r.once=Ml,r.orderBy=cl,r.over=$d,r.overArgs=od,r.overEvery=Qd,r.overSome=em,r.partial=id,r.partialRight=ld,r.partition=$c,r.pick=Ed,r.pickBy=Hs,r.property=Ru,r.propertyOf=Eu,r.pull=Rc,r.pullAll=Ti,r.pullAllBy=xi,r.pullAllWith=wi,r.pullAt=Ec,r.range=tm,r.rangeRight=rm,r.rearg=sd,r.reject=pl,r.remove=Ni,r.rest=Al,r.reverse=bi,r.sampleSize=vl,r.set=Gs,r.setWith=Ws,r.shuffle=yl,r.slice=Li,r.sortBy=Qc,r.sortedUniq=zi,r.sortedUniqBy=Ci,r.split=cu,r.spread=Il,r.tail=Ri,r.take=Ei,r.takeRight=Pi,r.takeRightWhile=Oi,r.takeWhile=Fi,r.tap=Yi,r.throttle=zl,r.thru=Zi,r.toArray=vs,r.toPairs=Pd,r.toPairsIn=Od,r.toPath=Vu,r.toPlainObject=xs,r.transform=Us,r.unary=Cl,r.union=Pc,r.unionBy=Oc,r.unionWith=Fc,r.uniq=ji,r.uniqBy=Bi,r.uniqWith=Hi,r.unset=qs,r.unzip=Vi,r.unzipWith=Gi,r.update=Ys,r.updateWith=Zs,r.values=Ks,r.valuesIn=Js,r.without=jc,r.words=xu,r.wrap=Rl,r.xor=Bc,r.xorBy=Hc,r.xorWith=Vc,r.zip=Gc,r.zipObject=Wi,r.zipObjectDeep=Ui,r.zipWith=Wc,r.entries=Pd,r.entriesIn=Od,r.extend=Nd,r.extendWith=bd,Au(r,r),r.add=am,r.attempt=qd,r.camelCase=Fd,r.capitalize=eu,r.ceil=nm,r.clamp=Xs,r.clone=Pl,r.cloneDeep=Fl,r.cloneDeepWith=jl,r.cloneWith=Ol,r.conformsTo=Bl,r.deburr=tu,r.defaultTo=Lu,r.divide=om,r.endsWith=ru,r.eq=Hl,r.escape=au,r.escapeRegExp=nu,r.every=rl,r.find=Yc,r.findIndex=li,r.findKey=Ls,r.findLast=Zc,r.findLastIndex=si,r.findLastKey=Ss,r.floor=im,r.forEach=ll,r.forEachRight=sl,r.forIn=ks,r.forInRight=Ds,r.forOwn=Ms,r.forOwnRight=As,r.get=Cs,r.gt=ud,r.gte=hd,r.has=Rs,r.hasIn=Es,r.head=mi,r.identity=Su,r.includes=ul,r.indexOf=pi,r.inRange=$s,r.invoke=Id,r.isArguments=cd,r.isArray=dd,r.isArrayBuffer=md,r.isArrayLike=Vl,r.isArrayLikeObject=Gl,r.isBoolean=Wl,r.isBuffer=pd,r.isDate=fd,r.isElement=Ul,r.isEmpty=ql,r.isEqual=Yl,r.isEqualWith=Zl,r.isError=Kl,r.isFinite=Jl,r.isFunction=Xl,r.isInteger=$l,r.isLength=Ql,r.isMap=vd,r.isMatch=rs,r.isMatchWith=as,r.isNaN=ns,r.isNative=os,r.isNil=ls,r.isNull=is,r.isNumber=ss,r.isObject=es,r.isObjectLike=ts,r.isPlainObject=us,r.isRegExp=yd,r.isSafeInteger=hs,r.isSet=gd,r.isString=cs,r.isSymbol=ds,r.isTypedArray=_d,r.isUndefined=ms,r.isWeakMap=ps,r.isWeakSet=fs,r.join=vi,r.kebabCase=jd,r.last=yi,r.lastIndexOf=gi,r.lowerCase=Bd,r.lowerFirst=Hd,r.lt=Td,r.lte=xd,r.max=Wu,r.maxBy=Uu,r.mean=qu,r.meanBy=Yu,r.min=Zu,r.minBy=Ku,r.stubArray=Pu,r.stubFalse=Ou,r.stubObject=Fu,r.stubString=ju,r.stubTrue=Bu,r.multiply=lm,r.nth=_i,r.noConflict=Iu,r.noop=zu,r.now=ed,r.pad=ou,r.padEnd=iu,r.padStart=lu,r.parseInt=su,r.random=Qs,r.reduce=dl,r.reduceRight=ml,r.repeat=uu,r.replace=hu,r.result=Vs,r.round=sm,r.runInContext=e,r.sample=fl,r.size=gl,r.snakeCase=Vd,r.some=_l,r.sortedIndex=Si,r.sortedIndexBy=ki,r.sortedIndexOf=Di,r.sortedLastIndex=Mi,r.sortedLastIndexBy=Ai,r.sortedLastIndexOf=Ii,r.startCase=Gd,r.startsWith=du,r.subtract=um,r.sum=Ju,r.sumBy=Xu,r.template=mu,r.times=Hu,r.toFinite=ys,r.toInteger=gs,r.toLength=_s,r.toLower=pu,r.toNumber=Ts,r.toSafeInteger=ws,r.toString=Ns,r.toUpper=fu,r.trim=vu,r.trimEnd=yu,r.trimStart=gu,r.truncate=_u,r.unescape=Tu,r.uniqueId=Gu,r.upperCase=Wd,r.upperFirst=Ud,r.each=ll,r.eachRight=sl,r.first=mi,Au(r,function(){var e={};return ua(r,function(t,a){dh.call(r.prototype,a)||(e[a]=t)}),e}(),{chain:!1}),r.VERSION="4.17.11",s(["bind","bindKey","curry","curryRight","partial","partialRight"],function(e){r[e].placeholder=r}),s(["drop","take"],function(e,t){_.prototype[e]=function(r){r=r===ae?1:Hh(gs(r),0);var a=this.__filtered__&&!t?new _(this):this.clone();return a.__filtered__?a.__takeCount__=Vh(r,a.__takeCount__):a.__views__.push({size:Vh(r,Re),type:e+(a.__dir__<0?"Right":"")}),a},_.prototype[e+"Right"]=function(t){return this.reverse()[e](t).reverse()}}),s(["filter","map","takeWhile"],function(e,t){var r=t+1,a=r==De||3==r;_.prototype[e]=function(e){var t=this.clone();return t.__iteratees__.push({iteratee:yo(e,3),type:r}),t.__filtered__=t.__filtered__||a,t}}),s(["head","last"],function(e,t){var r="take"+(t?"Right":"");_.prototype[e]=function(){return this[r](1).value()[0]}}),s(["initial","tail"],function(e,t){var r="drop"+(t?"":"Right");_.prototype[e]=function(){return this.__filtered__?new _(this):this[r](1)}}),_.prototype.compact=function(){return this.filter(Su)},_.prototype.find=function(e){return this.filter(e).head()},_.prototype.findLast=function(e){return this.reverse().find(e)},_.prototype.invokeMap=$a(function(e,t){return"function"==typeof e?new _(this):this.map(function(r){return xa(r,e,t)})}),_.prototype.reject=function(e){return this.filter(Dl(yo(e)))},_.prototype.slice=function(e,t){e=gs(e);var r=this;return r.__filtered__&&(e>0||t<0)?new _(r):(e<0?r=r.takeRight(-e):e&&(r=r.drop(e)),t!==ae&&(t=gs(t),r=t<0?r.dropRight(-t):r.take(t-e)),r)},_.prototype.takeRightWhile=function(e){return this.reverse().takeWhile(e).reverse()},_.prototype.toArray=function(){return this.take(Re)},ua(_.prototype,function(e,t){var a=/^(?:filter|find|map|reject)|While$/.test(t),o=/^(?:head|last)$/.test(t),i=r[o?"take"+("last"==t?"Right":""):t],l=o||/^find/.test(t);i&&(r.prototype[t]=function(){var t=this.__wrapped__,s=o?[1]:arguments,u=t instanceof _,h=s[0],c=u||dd(t),d=function(e){var t=i.apply(r,f([e],s));return o&&m?t[0]:t};c&&a&&"function"==typeof h&&1!=h.length&&(u=c=!1);var m=this.__chain__,p=!!this.__actions__.length,v=l&&!m,y=u&&!p;if(!l&&c){t=y?t:new _(this);var g=e.apply(t,s);return g.__actions__.push({func:Zi,args:[d],thisArg:ae}),new n(g,m)}return v&&y?e.apply(this,s):(g=this.thru(d),v?o?g.value()[0]:g.value():g)})}),s(["pop","push","shift","sort","splice","unshift"],function(e){var t=lh[e],a=/^(?:push|sort|unshift)$/.test(e)?"tap":"thru",n=/^(?:pop|shift)$/.test(e);r.prototype[e]=function(){var e=arguments;if(n&&!this.__chain__){var r=this.value();return t.apply(dd(r)?r:[],e)}return this[a](function(r){return t.apply(dd(r)?r:[],e)})}}),ua(_.prototype,function(e,t){var a=r[t];if(a){var n=a.name+"";(ec[n]||(ec[n]=[])).push({name:t,func:a})}}),ec[Yn(ae,fe).name]=[{name:"wrapper",func:ae}],_.prototype.clone=D,_.prototype.reverse=J,_.prototype.value=ee,r.prototype.at=Uc,r.prototype.chain=Ki,r.prototype.commit=Ji,r.prototype.next=Xi,r.prototype.plant=Qi,r.prototype.reverse=el,r.prototype.toJSON=r.prototype.valueOf=r.prototype.value=tl,r.prototype.first=r.prototype.head,Dh&&(r.prototype[Dh]=$i),r}();"object"==o(r(195))&&r(195)?(Dr._=Wr,(n=function(){return Wr}.call(t,r,t,a))!==ae&&(a.exports=n)):Ar?((Ar.exports=Wr)._=Wr,Mr._=Wr):Dr._=Wr}).call(void 0)}).call(t,r(61),r(120)(e))},function(e,t,r){"use strict";(function(e){var r,a,n,o="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};!function(i,l){"object"===o(e)&&"object"===o(e.exports)?e.exports=l():(a=[],r=l,void 0!==(n="function"==typeof r?r.apply(t,a):r)&&(e.exports=n))}(0,function(){function e(e,t){return null!=e&&Object.prototype.hasOwnProperty.call(e,t)}function t(t){if(!t)return!0;if(u(t)&&0===t.length)return!0;if("string"!=typeof t){for(var r in t)if(e(t,r))return!1;return!0}return!1}function r(e){return s.call(e)}function a(e){return"object"===(void 0===e?"undefined":o(e))&&"[object Object]"===r(e)}function n(e){return"boolean"==typeof e||"[object Boolean]"===r(e)}function i(e){var t=parseInt(e);return t.toString()===e?t:e}function l(r){function o(t,a){return r.includeInheritedProps||"number"==typeof a&&Array.isArray(t)||e(t,a)}function l(e,t){if(o(e,t))return e[t]}function s(e,t,r,a){if("number"==typeof t&&(t=[t]),!t||0===t.length)return e;if("string"==typeof t)return s(e,t.split(".").map(i),r,a);var n=t[0],o=l(e,n);return 1===t.length?(void 0!==o&&a||(e[n]=r),o):(void 0===o&&("number"==typeof t[1]?e[n]=[]:e[n]={}),s(e[n],t.slice(1),r,a))}r=r||{};var h=function e(t){return Object.keys(e).reduce(function(r,a){return"create"===a?r:("function"==typeof e[a]&&(r[a]=e[a].bind(e,t)),r)},{})};return h.has=function(t,a){if("number"==typeof a?a=[a]:"string"==typeof a&&(a=a.split(".")),!a||0===a.length)return!!t;for(var n=0;n<a.length;n++){var o=i(a[n]);if(!("number"==typeof o&&u(t)&&o<t.length||(r.includeInheritedProps?o in Object(t):e(t,o))))return!1;t=t[o]}return!0},h.ensureExists=function(e,t,r){return s(e,t,r,!0)},h.set=function(e,t,r,a){return s(e,t,r,a)},h.insert=function(e,t,r,a){var n=h.get(e,t);a=~~a,u(n)||(n=[],h.set(e,t,n)),n.splice(a,0,r)},h.empty=function(e,r){if(!t(r)&&null!=e){var i,l;if(i=h.get(e,r)){if("string"==typeof i)return h.set(e,r,"");if(n(i))return h.set(e,r,!1);if("number"==typeof i)return h.set(e,r,0);if(u(i))i.length=0;else{if(!a(i))return h.set(e,r,null);for(l in i)o(i,l)&&delete i[l]}}}},h.push=function(e,t){var r=h.get(e,t);u(r)||(r=[],h.set(e,t,r)),r.push.apply(r,Array.prototype.slice.call(arguments,2))},h.coalesce=function(e,t,r){for(var a,n=0,o=t.length;n<o;n++)if(void 0!==(a=h.get(e,t[n])))return a;return r},h.get=function(e,t,r){if("number"==typeof t&&(t=[t]),!t||0===t.length)return e;if(null==e)return r;if("string"==typeof t)return h.get(e,t.split("."),r);var a=i(t[0]),n=l(e,a);return void 0===n?r:1===t.length?n:h.get(e[a],t.slice(1),r)},h.del=function(e,r){if("number"==typeof r&&(r=[r]),null==e)return e;if(t(r))return e;if("string"==typeof r)return h.del(e,r.split("."));var a=i(r[0]);return o(e,a)?1!==r.length?h.del(e[a],r.slice(1)):(u(e)?e.splice(a,1):delete e[a],e):e},h}var s=Object.prototype.toString,u=Array.isArray||function(e){return"[object Array]"===s.call(e)},h=l();return h.create=l,h.withInheritedProps=l({includeInheritedProps:!0}),h})}).call(t,r(120)(e))},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function n(e){var t=e.children;return _.default.isValidElement(t)&&!t.key?_.default.cloneElement(t,{key:M}):t}function o(){}Object.defineProperty(t,"__esModule",{value:!0});var i=r(76),l=a(i),s=r(282),u=a(s),h=r(99),c=a(h),d=r(100),m=a(d),p=r(102),f=a(p),v=r(101),y=a(v),g=r(15),_=a(g),T=r(21),x=a(T),w=r(1120),N=r(1118),b=a(N),L=r(1119),S=a(L),k=r(406),D=a(k),M="rc_animate_"+Date.now(),A=function(e){function t(e){(0,c.default)(this,t);var r=(0,f.default)(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return I.call(r),r.currentlyAnimatingKeys={},r.keysToEnter=[],r.keysToLeave=[],r.state={children:(0,w.toArrayChildren)(n(e))},r.childrenRefs={},r}return(0,y.default)(t,e),(0,m.default)(t,[{key:"componentDidMount",value:function(){var e=this,t=this.props.showProp,r=this.state.children;t&&(r=r.filter(function(e){return!!e.props[t]})),r.forEach(function(t){t&&e.performAppear(t.key)})}},{key:"componentWillReceiveProps",value:function(e){var t=this;this.nextProps=e;var r=(0,w.toArrayChildren)(n(e)),a=this.props;a.exclusive&&Object.keys(this.currentlyAnimatingKeys).forEach(function(e){t.stop(e)});var o=a.showProp,i=this.currentlyAnimatingKeys,l=a.exclusive?(0,w.toArrayChildren)(n(a)):this.state.children,s=[];o?(l.forEach(function(e){var t=e&&(0,w.findChildInChildrenByKey)(r,e.key),a=void 0;(a=t&&t.props[o]||!e.props[o]?t:_.default.cloneElement(t||e,(0,u.default)({},o,!0)))&&s.push(a)}),r.forEach(function(e){e&&(0,w.findChildInChildrenByKey)(l,e.key)||s.push(e)})):s=(0,w.mergeChildren)(l,r),this.setState({children:s}),r.forEach(function(e){var r=e&&e.key;if(!e||!i[r]){var a=e&&(0,w.findChildInChildrenByKey)(l,r);if(o){var n=e.props[o];a?!(0,w.findShownChildInChildrenByKey)(l,r,o)&&n&&t.keysToEnter.push(r):n&&t.keysToEnter.push(r)}else a||t.keysToEnter.push(r)}}),l.forEach(function(e){var a=e&&e.key;if(!e||!i[a]){var n=e&&(0,w.findChildInChildrenByKey)(r,a);if(o){var l=e.props[o];n?!(0,w.findShownChildInChildrenByKey)(r,a,o)&&l&&t.keysToLeave.push(a):l&&t.keysToLeave.push(a)}else n||t.keysToLeave.push(a)}})}},{key:"componentDidUpdate",value:function(){var e=this.keysToEnter;this.keysToEnter=[],e.forEach(this.performEnter);var t=this.keysToLeave;this.keysToLeave=[],t.forEach(this.performLeave)}},{key:"isValidChildByKey",value:function(e,t){var r=this.props.showProp;return r?(0,w.findShownChildInChildrenByKey)(e,t,r):(0,w.findChildInChildrenByKey)(e,t)}},{key:"stop",value:function(e){delete this.currentlyAnimatingKeys[e];var t=this.childrenRefs[e];t&&t.stop()}},{key:"render",value:function(){var e=this,t=this.props;this.nextProps=t;var r=this.state.children,a=null;r&&(a=r.map(function(r){if(null===r||void 0===r)return r;if(!r.key)throw new Error("must set key for <rc-animate> children");return _.default.createElement(b.default,{key:r.key,ref:function(t){e.childrenRefs[r.key]=t},animation:t.animation,transitionName:t.transitionName,transitionEnter:t.transitionEnter,transitionAppear:t.transitionAppear,transitionLeave:t.transitionLeave},r)}));var n=t.component;if(n){var o=t;return"string"==typeof n&&(o=(0,l.default)({className:t.className,style:t.style},t.componentProps)),_.default.createElement(n,o,a)}return a[0]||null}}]),t}(_.default.Component);A.isAnimate=!0,A.CSSMotion=S.default,A.propTypes={component:x.default.any,componentProps:x.default.object,animation:x.default.object,transitionName:x.default.oneOfType([x.default.string,x.default.object]),transitionEnter:x.default.bool,transitionAppear:x.default.bool,exclusive:x.default.bool,transitionLeave:x.default.bool,onEnd:x.default.func,onEnter:x.default.func,onLeave:x.default.func,onAppear:x.default.func,showProp:x.default.string,children:x.default.node},A.defaultProps={animation:{},component:"span",componentProps:{},transitionEnter:!0,transitionLeave:!0,transitionAppear:!1,onEnd:o,onEnter:o,onLeave:o,onAppear:o};var I=function(){var e=this;this.performEnter=function(t){e.childrenRefs[t]&&(e.currentlyAnimatingKeys[t]=!0,e.childrenRefs[t].componentWillEnter(e.handleDoneAdding.bind(e,t,"enter")))},this.performAppear=function(t){e.childrenRefs[t]&&(e.currentlyAnimatingKeys[t]=!0,e.childrenRefs[t].componentWillAppear(e.handleDoneAdding.bind(e,t,"appear")))},this.handleDoneAdding=function(t,r){var a=e.props;if(delete e.currentlyAnimatingKeys[t],!a.exclusive||a===e.nextProps){var o=(0,w.toArrayChildren)(n(a));e.isValidChildByKey(o,t)?"appear"===r?D.default.allowAppearCallback(a)&&(a.onAppear(t),a.onEnd(t,!0)):D.default.allowEnterCallback(a)&&(a.onEnter(t),a.onEnd(t,!0)):e.performLeave(t)}},this.performLeave=function(t){e.childrenRefs[t]&&(e.currentlyAnimatingKeys[t]=!0,e.childrenRefs[t].componentWillLeave(e.handleDoneLeaving.bind(e,t)))},this.handleDoneLeaving=function(t){var r=e.props;if(delete e.currentlyAnimatingKeys[t],!r.exclusive||r===e.nextProps){var a=(0,w.toArrayChildren)(n(r));if(e.isValidChildByKey(a,t))e.performEnter(t);else{var o=function(){D.default.allowLeaveCallback(r)&&(r.onLeave(t),r.onEnd(t,!1))};(0,w.isSameChildren)(e.state.children,a,r.showProp)?o():e.setState({children:a},o)}}}};t.default=A,e.exports=t.default},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=r(1122),n=function(e){return e&&e.__esModule?e:{default:e}}(a);t.default=n.default,e.exports=t.default},function(e,t,r){"use strict";function a(e,t){for(var r=Object.getOwnPropertyNames(t),a=0;a<r.length;a++){var n=r[a],o=Object.getOwnPropertyDescriptor(t,n);o&&o.configurable&&void 0===e[n]&&Object.defineProperty(e,n,o)}return e}function n(e){return e&&"object"===(void 0===e?"undefined":z(e))&&"default"in e?e.default:e}function o(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];(Array.isArray(e)?e:[e]).forEach(function(e){e&&e.locale&&(R.__addLocaleData(e),E.__addLocaleData(e))})}function i(e){for(var t=(e||"").split("-");t.length>0;){if(l(t.join("-")))return!0;t.pop()}return!1}function l(e){var t=e&&e.toLowerCase();return!(!R.__localeData__[t]||!E.__localeData__[t])}function s(e){return(""+e).replace(Te,function(e){return _e[e]})}function u(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return t.reduce(function(t,a){return e.hasOwnProperty(a)?t[a]=e[a]:r.hasOwnProperty(a)&&(t[a]=r[a]),t},{})}function h(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.intl;B(t,"[React Intl] Could not find required `intl` object. <IntlProvider> needs to exist in the component ancestry.")}function c(e,t){if(e===t)return!0;if("object"!==(void 0===e?"undefined":G(e))||null===e||"object"!==(void 0===t?"undefined":G(t))||null===t)return!1;var r=Object.keys(e),a=Object.keys(t);if(r.length!==a.length)return!1;for(var n=Object.prototype.hasOwnProperty.bind(t),o=0;o<r.length;o++)if(!n(r[o])||e[r[o]]!==t[r[o]])return!1;return!0}function d(e,t,r){var a=e.props,n=e.state,o=e.context,i=void 0===o?{}:o,l=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},s=i.intl,h=void 0===s?{}:s,d=l.intl,m=void 0===d?{}:d;return!c(t,a)||!c(r,n)||!(m===h||c(u(m,ge),u(h,ge)))}function m(e,t){return"[React Intl] "+e+(t?"\n"+t:"")}function p(e){}function f(e){return e.displayName||e.name||"Component"}function v(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=t.intlPropName,a=void 0===r?"intl":r,n=t.withRef,o=void 0!==n&&n,i=function(t){function r(e,t){W(this,r);var a=J(this,(r.__proto__||Object.getPrototypeOf(r)).call(this,e,t));return h(t),a}return Z(r,t),U(r,[{key:"getWrappedInstance",value:function(){return B(o,"[React Intl] To access the wrapped instance, the `{withRef: true}` option must be set when calling: `injectIntl()`"),this.refs.wrappedInstance}},{key:"render",value:function(){return F.createElement(e,Y({},this.props,q({},a,this.context.intl),{ref:o?"wrappedInstance":null}))}}]),r}(O.Component);return i.displayName="InjectIntl("+f(e)+")",i.contextTypes={intl:me},i.WrappedComponent=e,j(i,e)}function y(e){return e}function g(e){return R.prototype._resolveLocale(e)}function _(e){return R.prototype._findPluralRuleFunction(e)}function T(e){var t=E.thresholds;t.second=e.second,t.minute=e.minute,t.hour=e.hour,t.day=e.day,t.month=e.month,t["second-short"]=e["second-short"],t["minute-short"]=e["minute-short"],t["hour-short"]=e["hour-short"],t["day-short"]=e["day-short"],t["month-short"]=e["month-short"]}function x(e,t,r,a){var n=e&&e[t]&&e[t][r];if(n)return n;a(m("No "+t+" format named: "+r))}function w(e,t,r){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=e.locale,o=e.formats,i=e.timeZone,l=a.format,s=e.onError||p,h=new Date(r),c=Y({},i&&{timeZone:i},l&&x(o,"date",l,s)),d=u(a,we,c);try{return t.getDateTimeFormat(n,d).format(h)}catch(e){s(m("Error formatting date.",e))}return String(h)}function N(e,t,r){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=e.locale,o=e.formats,i=e.timeZone,l=a.format,s=e.onError||p,h=new Date(r),c=Y({},i&&{timeZone:i},l&&x(o,"time",l,s)),d=u(a,we,c);d.hour||d.minute||d.second||(d=Y({},d,{hour:"numeric",minute:"numeric"}));try{return t.getDateTimeFormat(n,d).format(h)}catch(e){s(m("Error formatting time.",e))}return String(h)}function b(e,t,r){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=e.locale,o=e.formats,i=a.format,l=e.onError||p,s=new Date(r),h=new Date(a.now),c=i&&x(o,"relative",i,l),d=u(a,be,c),f=Y({},E.thresholds);T(Se);try{return t.getRelativeFormat(n,d).format(s,{now:isFinite(h)?h:t.now()})}catch(e){l(m("Error formatting relative time.",e))}finally{T(f)}return String(s)}function L(e,t,r){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=e.locale,o=e.formats,i=a.format,l=e.onError||p,s=i&&x(o,"number",i,l),h=u(a,Ne,s);try{return t.getNumberFormat(n,h).format(r)}catch(e){l(m("Error formatting number.",e))}return String(r)}function S(e,t,r){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=e.locale,o=u(a,Le),i=e.onError||p;try{return t.getPluralFormat(n,o).format(r)}catch(e){i(m("Error formatting plural.",e))}return"other"}function k(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=e.locale,o=e.formats,i=e.messages,l=e.defaultLocale,s=e.defaultFormats,u=r.id,h=r.defaultMessage;B(u,"[React Intl] An `id` must be provided to format a message.");var c=i&&i[u];if(!(Object.keys(a).length>0))return c||h||u;var d=void 0,f=e.onError||p;if(c)try{d=t.getMessageFormat(c,n,o).format(a)}catch(e){f(m('Error formatting message: "'+u+'" for locale: "'+n+'"'+(h?", using default message as fallback.":""),e))}else(!h||n&&n.toLowerCase()!==l.toLowerCase())&&f(m('Missing message: "'+u+'" for locale: "'+n+'"'+(h?", using default message as fallback.":"")));if(!d&&h)try{d=t.getMessageFormat(h,l,s).format(a)}catch(e){f(m('Error formatting the default message for: "'+u+'"',e))}return d||f(m('Cannot format message: "'+u+'", using message '+(c||h?"source":"id")+" as fallback.")),d||c||h||u}function D(e,t,r){var a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return k(e,t,r,Object.keys(a).reduce(function(e,t){var r=a[t];return e[t]="string"==typeof r?s(r):r,e},{}))}function M(e){var t=Math.abs(e);return t<Ee?"second":t<Pe?"minute":t<Oe?"hour":"day"}function A(e){switch(e){case"second":return Re;case"minute":return Ee;case"hour":return Pe;case"day":return Oe;default:return Fe}}function I(e,t){if(e===t)return!0;var r=new Date(e).getTime(),a=new Date(t).getTime();return isFinite(r)&&isFinite(a)&&r===a}var z="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};Object.defineProperty(t,"__esModule",{value:!0});var C=n(r(1130)),R=n(r(1133)),E=n(r(990)),P=n(r(21)),O=r(15),F=n(O),j=n(r(258)),B=n(r(28)),H=n(r(987)),V={locale:"en",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1],n=Number(r[0])==e,o=n&&r[0].slice(-1),i=n&&r[0].slice(-2);return t?1==o&&11!=i?"one":2==o&&12!=i?"two":3==o&&13!=i?"few":"other":1==e&&a?"one":"other"},fields:{year:{displayName:"year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"in {0} year",other:"in {0} years"},past:{one:"{0} year ago",other:"{0} years ago"}}},month:{displayName:"month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"in {0} month",other:"in {0} months"},past:{one:"{0} month ago",other:"{0} months ago"}}},day:{displayName:"day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{one:"in {0} day",other:"in {0} days"},past:{one:"{0} day ago",other:"{0} days ago"}}},hour:{displayName:"hour",relative:{0:"this hour"},relativeTime:{future:{one:"in {0} hour",other:"in {0} hours"},past:{one:"{0} hour ago",other:"{0} hours ago"}}},minute:{displayName:"minute",relative:{0:"this minute"},relativeTime:{future:{one:"in {0} minute",other:"in {0} minutes"},past:{one:"{0} minute ago",other:"{0} minutes ago"}}},second:{displayName:"second",relative:{0:"now"},relativeTime:{future:{one:"in {0} second",other:"in {0} seconds"},past:{one:"{0} second ago",other:"{0} seconds ago"}}}}},G="function"==typeof Symbol&&"symbol"===z(Symbol.iterator)?function(e){return void 0===e?"undefined":z(e)}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":void 0===e?"undefined":z(e)},W=(function(){function e(e){this.value=e}function t(t){function r(e,t){return new Promise(function(r,n){var l={key:e,arg:t,resolve:r,reject:n,next:null};i?i=i.next=l:(o=i=l,a(e,t))})}function a(r,o){try{var i=t[r](o),l=i.value;l instanceof e?Promise.resolve(l.value).then(function(e){a("next",e)},function(e){a("throw",e)}):n(i.done?"return":"normal",i.value)}catch(e){n("throw",e)}}function n(e,t){switch(e){case"return":o.resolve({value:t,done:!0});break;case"throw":o.reject(t);break;default:o.resolve({value:t,done:!1})}o=o.next,o?a(o.key,o.arg):i=null}var o,i;this._invoke=r,"function"!=typeof t.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(t.prototype[Symbol.asyncIterator]=function(){return this}),t.prototype.next=function(e){return this._invoke("next",e)},t.prototype.throw=function(e){return this._invoke("throw",e)},t.prototype.return=function(e){return this._invoke("return",e)}}(),function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}),U=function(){function e(e,t){for(var r=0;r<t.length;r++){var a=t[r];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(t,r,a){return r&&e(t.prototype,r),a&&e(t,a),t}}(),q=function(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e},Y=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},Z=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":z(t)));e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):a(e,t))},K=function(e,t){var r={};for(var a in e)t.indexOf(a)>=0||Object.prototype.hasOwnProperty.call(e,a)&&(r[a]=e[a]);return r},J=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!==(void 0===t?"undefined":z(t))&&"function"!=typeof t?e:t},X=function(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t<e.length;t++)r[t]=e[t];return r}return Array.from(e)},$=P.bool,Q=P.number,ee=P.string,te=P.func,re=P.object,ae=P.oneOf,ne=P.shape,oe=P.any,ie=P.oneOfType,le=ae(["best fit","lookup"]),se=ae(["narrow","short","long"]),ue=ae(["numeric","2-digit"]),he=te.isRequired,ce={locale:ee,timeZone:ee,formats:re,messages:re,textComponent:oe,defaultLocale:ee,defaultFormats:re},de={formatDate:he,formatTime:he,formatRelative:he,formatNumber:he,formatPlural:he,formatMessage:he,formatHTMLMessage:he},me=ne(Y({},ce,de,{formatters:re,now:he})),pe=(ee.isRequired,ie([ee,re]),{localeMatcher:le,formatMatcher:ae(["basic","best fit"]),timeZone:ee,hour12:$,weekday:se,era:se,year:ue,month:ae(["numeric","2-digit","narrow","short","long"]),day:ue,hour:ue,minute:ue,second:ue,timeZoneName:ae(["short","long"])}),fe={localeMatcher:le,style:ae(["decimal","currency","percent"]),currency:ee,currencyDisplay:ae(["symbol","code","name"]),useGrouping:$,minimumIntegerDigits:Q,minimumFractionDigits:Q,maximumFractionDigits:Q,minimumSignificantDigits:Q,maximumSignificantDigits:Q},ve={style:ae(["best fit","numeric"]),units:ae(["second","minute","hour","day","month","year","second-short","minute-short","hour-short","day-short","month-short","year-short"])},ye={style:ae(["cardinal","ordinal"])},ge=Object.keys(ce),_e={"&":"&amp;",">":"&gt;","<":"&lt;",'"':"&quot;","'":"&#x27;"},Te=/[&><"']/g,xe=function e(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};W(this,e);var a="ordinal"===r.style,n=_(g(t));this.format=function(e){return n(e,a)}},we=Object.keys(pe),Ne=Object.keys(fe),be=Object.keys(ve),Le=Object.keys(ye),Se={second:60,minute:60,hour:24,day:30,month:12},ke=Object.freeze({formatDate:w,formatTime:N,formatRelative:b,formatNumber:L,formatPlural:S,formatMessage:k,formatHTMLMessage:D}),De=Object.keys(ce),Me=Object.keys(de),Ae={formats:{},messages:{},timeZone:null,textComponent:"span",defaultLocale:"en",defaultFormats:{},onError:p},Ie=function(e){function t(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};W(this,t);var a=J(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,r));B("undefined"!=typeof Intl,"[React Intl] The `Intl` APIs must be available in the runtime, and do not appear to be built-in. An `Intl` polyfill should be loaded.\nSee: http://formatjs.io/guides/runtime-environments/");var n=r.intl,o=void 0;o=isFinite(e.initialNow)?Number(e.initialNow):n?n.now():Date.now();var i=n||{},l=i.formatters,s=void 0===l?{getDateTimeFormat:H(Intl.DateTimeFormat),getNumberFormat:H(Intl.NumberFormat),getMessageFormat:H(R),getRelativeFormat:H(E),getPluralFormat:H(xe)}:l;return a.state=Y({},s,{now:function(){return a._didDisplay?Date.now():o}}),a}return Z(t,e),U(t,[{key:"getConfig",value:function(){var e=this.context.intl,t=u(this.props,De,e);for(var r in Ae)void 0===t[r]&&(t[r]=Ae[r]);if(!i(t.locale)){var a=t,n=a.locale,o=a.defaultLocale,l=a.defaultFormats;(0,a.onError)(m('Missing locale data for locale: "'+n+'". Using default locale: "'+o+'" as fallback.')),t=Y({},t,{locale:o,formats:l,messages:Ae.messages})}return t}},{key:"getBoundFormatFns",value:function(e,t){return Me.reduce(function(r,a){return r[a]=ke[a].bind(null,e,t),r},{})}},{key:"getChildContext",value:function(){var e=this.getConfig(),t=this.getBoundFormatFns(e,this.state),r=this.state,a=r.now,n=K(r,["now"]);return{intl:Y({},e,t,{formatters:n,now:a})}}},{key:"shouldComponentUpdate",value:function(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return d.apply(void 0,[this].concat(t))}},{key:"componentDidMount",value:function(){this._didDisplay=!0}},{key:"render",value:function(){return O.Children.only(this.props.children)}}]),t}(O.Component);Ie.displayName="IntlProvider",Ie.contextTypes={intl:me},Ie.childContextTypes={intl:me.isRequired};var ze=function(e){function t(e,r){W(this,t);var a=J(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,r));return h(r),a}return Z(t,e),U(t,[{key:"shouldComponentUpdate",value:function(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return d.apply(void 0,[this].concat(t))}},{key:"render",value:function(){var e=this.context.intl,t=e.formatDate,r=e.textComponent,a=this.props,n=a.value,o=a.children,i=t(n,this.props);return"function"==typeof o?o(i):F.createElement(r,null,i)}}]),t}(O.Component);ze.displayName="FormattedDate",ze.contextTypes={intl:me};var Ce=function(e){function t(e,r){W(this,t);var a=J(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,r));return h(r),a}return Z(t,e),U(t,[{key:"shouldComponentUpdate",value:function(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return d.apply(void 0,[this].concat(t))}},{key:"render",value:function(){var e=this.context.intl,t=e.formatTime,r=e.textComponent,a=this.props,n=a.value,o=a.children,i=t(n,this.props);return"function"==typeof o?o(i):F.createElement(r,null,i)}}]),t}(O.Component);Ce.displayName="FormattedTime",Ce.contextTypes={intl:me};var Re=1e3,Ee=6e4,Pe=36e5,Oe=864e5,Fe=2147483647,je=function(e){function t(e,r){W(this,t);var a=J(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,r));h(r);var n=isFinite(e.initialNow)?Number(e.initialNow):r.intl.now();return a.state={now:n},a}return Z(t,e),U(t,[{key:"scheduleNextUpdate",value:function(e,t){var r=this;clearTimeout(this._timer);var a=e.value,n=e.units,o=e.updateInterval,i=new Date(a).getTime();if(o&&isFinite(i)){var l=i-t.now,s=A(n||M(l)),u=Math.abs(l%s),h=l<0?Math.max(o,s-u):Math.max(o,u);this._timer=setTimeout(function(){r.setState({now:r.context.intl.now()})},h)}}},{key:"componentDidMount",value:function(){this.scheduleNextUpdate(this.props,this.state)}},{key:"componentWillReceiveProps",value:function(e){I(e.value,this.props.value)||this.setState({now:this.context.intl.now()})}},{key:"shouldComponentUpdate",value:function(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return d.apply(void 0,[this].concat(t))}},{key:"componentWillUpdate",value:function(e,t){this.scheduleNextUpdate(e,t)}},{key:"componentWillUnmount",value:function(){clearTimeout(this._timer)}},{key:"render",value:function(){var e=this.context.intl,t=e.formatRelative,r=e.textComponent,a=this.props,n=a.value,o=a.children,i=t(n,Y({},this.props,this.state));return"function"==typeof o?o(i):F.createElement(r,null,i)}}]),t}(O.Component);je.displayName="FormattedRelative",je.contextTypes={intl:me},je.defaultProps={updateInterval:1e4};var Be=function(e){function t(e,r){W(this,t);var a=J(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,r));return h(r),a}return Z(t,e),U(t,[{key:"shouldComponentUpdate",value:function(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return d.apply(void 0,[this].concat(t))}},{key:"render",value:function(){var e=this.context.intl,t=e.formatNumber,r=e.textComponent,a=this.props,n=a.value,o=a.children,i=t(n,this.props);return"function"==typeof o?o(i):F.createElement(r,null,i)}}]),t}(O.Component);Be.displayName="FormattedNumber",Be.contextTypes={intl:me};var He=function(e){function t(e,r){W(this,t);var a=J(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,r));return h(r),a}return Z(t,e),U(t,[{key:"shouldComponentUpdate",value:function(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return d.apply(void 0,[this].concat(t))}},{key:"render",value:function(){var e=this.context.intl,t=e.formatPlural,r=e.textComponent,a=this.props,n=a.value,o=a.other,i=a.children,l=t(n,this.props),s=this.props[l]||o;return"function"==typeof i?i(s):F.createElement(r,null,s)}}]),t}(O.Component);He.displayName="FormattedPlural",He.contextTypes={intl:me},He.defaultProps={style:"cardinal"};var Ve=function(e,t){return k({},{getMessageFormat:H(R)},e,t)},Ge=function(e){function t(e,r){W(this,t);var a=J(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,r));return e.defaultMessage||h(r),a}return Z(t,e),U(t,[{key:"shouldComponentUpdate",value:function(e){var t=this.props.values;if(!c(e.values,t))return!0;for(var r=Y({},e,{values:t}),a=arguments.length,n=Array(a>1?a-1:0),o=1;o<a;o++)n[o-1]=arguments[o];return d.apply(void 0,[this,r].concat(n))}},{key:"render",value:function(){var e=this.context.intl||{},t=e.formatMessage,r=void 0===t?Ve:t,a=e.textComponent,n=void 0===a?"span":a,o=this.props,i=o.id,l=o.description,s=o.defaultMessage,u=o.values,h=o.tagName,c=void 0===h?n:h,d=o.children,m=void 0,p=void 0,f=void 0;if(u&&Object.keys(u).length>0){var v=Math.floor(1099511627776*Math.random()).toString(16),y=function(){var e=0;return function(){return"ELEMENT-"+v+"-"+(e+=1)}}();m="@__"+v+"__@",p={},f={},Object.keys(u).forEach(function(e){var t=u[e];if(O.isValidElement(t)){var r=y();p[e]=m+r+m,f[r]=t}else p[e]=t})}var g={id:i,description:l,defaultMessage:s},_=r(g,p||u),T=void 0;return T=f&&Object.keys(f).length>0?_.split(m).filter(function(e){return!!e}).map(function(e){return f[e]||e}):[_],"function"==typeof d?d.apply(void 0,X(T)):O.createElement.apply(void 0,[c,null].concat(X(T)))}}]),t}(O.Component);Ge.displayName="FormattedMessage",Ge.contextTypes={intl:me},Ge.defaultProps={values:{}};var We=function(e){function t(e,r){W(this,t);var a=J(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,r));return h(r),a}return Z(t,e),U(t,[{key:"shouldComponentUpdate",value:function(e){var t=this.props.values;if(!c(e.values,t))return!0;for(var r=Y({},e,{values:t}),a=arguments.length,n=Array(a>1?a-1:0),o=1;o<a;o++)n[o-1]=arguments[o];return d.apply(void 0,[this,r].concat(n))}},{key:"render",value:function(){var e=this.context.intl,t=e.formatHTMLMessage,r=e.textComponent,a=this.props,n=a.id,o=a.description,i=a.defaultMessage,l=a.values,s=a.tagName,u=void 0===s?r:s,h=a.children,c={id:n,description:o,defaultMessage:i},d=t(c,l);if("function"==typeof h)return h(d);var m={__html:d};return F.createElement(u,{dangerouslySetInnerHTML:m})}}]),t}(O.Component);We.displayName="FormattedHTMLMessage",We.contextTypes={intl:me},We.defaultProps={values:{}},o(V),o(C),t.addLocaleData=o,t.intlShape=me,t.injectIntl=v,t.defineMessages=y,t.IntlProvider=Ie,t.FormattedDate=ze,t.FormattedTime=Ce,t.FormattedRelative=je,t.FormattedNumber=Be,t.FormattedPlural=He,t.FormattedMessage=Ge,t.FormattedHTMLMessage=We},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0,t.connect=t.connectAdvanced=t.createProvider=t.Provider=void 0;var n=r(1140),o=a(n),i=r(412),l=a(i),s=r(1141),u=a(s);t.Provider=o.default,t.createProvider=n.createProvider,t.connectAdvanced=l.default,t.connect=u.default},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}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 n=r(417);Object.defineProperty(t,"LOCATION_CHANGE",{enumerable:!0,get:function(){return n.LOCATION_CHANGE}}),Object.defineProperty(t,"routerReducer",{enumerable:!0,get:function(){return n.routerReducer}});var o=r(416);Object.defineProperty(t,"CALL_HISTORY_METHOD",{enumerable:!0,get:function(){return o.CALL_HISTORY_METHOD}}),Object.defineProperty(t,"push",{enumerable:!0,get:function(){return o.push}}),Object.defineProperty(t,"replace",{enumerable:!0,get:function(){return o.replace}}),Object.defineProperty(t,"go",{enumerable:!0,get:function(){return o.go}}),Object.defineProperty(t,"goBack",{enumerable:!0,get:function(){return o.goBack}}),Object.defineProperty(t,"goForward",{enumerable:!0,get:function(){return o.goForward}}),Object.defineProperty(t,"routerActions",{enumerable:!0,get:function(){return o.routerActions}});var i=r(1150),l=a(i),s=r(1149),u=a(s);t.syncHistoryWithStore=l.default,t.routerMiddleware=u.default},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0,t.createMemoryHistory=t.hashHistory=t.browserHistory=t.applyRouterMiddleware=t.formatPattern=t.useRouterHistory=t.match=t.routerShape=t.locationShape=t.RouterContext=t.createRoutes=t.Route=t.Redirect=t.IndexRoute=t.IndexRedirect=t.withRouter=t.IndexLink=t.Link=t.Router=void 0;var n=r(74);Object.defineProperty(t,"createRoutes",{enumerable:!0,get:function(){return n.createRoutes}});var o=r(271);Object.defineProperty(t,"locationShape",{enumerable:!0,get:function(){return o.locationShape}}),Object.defineProperty(t,"routerShape",{enumerable:!0,get:function(){return o.routerShape}});var i=r(118);Object.defineProperty(t,"formatPattern",{enumerable:!0,get:function(){return i.formatPattern}});var l=r(1155),s=a(l),u=r(418),h=a(u),c=r(1151),d=a(c),m=r(1166),p=a(m),f=r(1152),v=a(f),y=r(1153),g=a(y),_=r(420),T=a(_),x=r(1154),w=a(x),N=r(272),b=a(N),L=r(1164),S=a(L),k=r(425),D=a(k),M=r(1157),A=a(M),I=r(1158),z=a(I),C=r(1162),R=a(C),E=r(422),P=a(E);t.Router=s.default,t.Link=h.default,t.IndexLink=d.default,t.withRouter=p.default,t.IndexRedirect=v.default,t.IndexRoute=g.default,t.Redirect=T.default,t.Route=w.default,t.RouterContext=b.default,t.match=S.default,t.useRouterHistory=D.default,t.applyRouterMiddleware=A.default,t.browserHistory=z.default,t.hashHistory=R.default,t.createMemoryHistory=P.default},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.combineActions=t.handleActions=t.handleAction=t.createActions=t.createAction=void 0;var n=r(427),o=a(n),i=r(428),l=a(i),s=r(1171),u=a(s),h=r(426),c=a(h),d=r(1170),m=a(d);t.createAction=o.default,t.createActions=m.default,t.handleAction=l.default,t.handleActions=u.default,t.combineActions=c.default},function(e,t,r){"use strict";function a(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}Object.defineProperty(t,"__esModule",{value:!0}),t.utils=t.effects=t.CANCEL=t.delay=t.takeLatest=t.takeEvery=t.buffers=t.channel=t.eventChannel=t.END=t.runSaga=void 0;var n=r(1176);Object.defineProperty(t,"runSaga",{enumerable:!0,get:function(){return n.runSaga}});var o=r(187);Object.defineProperty(t,"END",{enumerable:!0,get:function(){return o.END}}),Object.defineProperty(t,"eventChannel",{enumerable:!0,get:function(){return o.eventChannel}}),Object.defineProperty(t,"channel",{enumerable:!0,get:function(){return o.channel}});var i=r(273);Object.defineProperty(t,"buffers",{enumerable:!0,get:function(){return i.buffers}});var l=r(1177);Object.defineProperty(t,"takeEvery",{enumerable:!0,get:function(){return l.takeEvery}}),Object.defineProperty(t,"takeLatest",{enumerable:!0,get:function(){return l.takeLatest}});var s=r(60);Object.defineProperty(t,"delay",{enumerable:!0,get:function(){return s.delay}}),Object.defineProperty(t,"CANCEL",{enumerable:!0,get:function(){return s.CANCEL}});var u=r(1175),h=function(e){return e&&e.__esModule?e:{default:e}}(u),c=r(1173),d=a(c),m=r(1178),p=a(m);t.default=h.default,t.effects=d,t.utils=p},function(e,t,r){"use strict";function a(e){return function(t){var r=t.dispatch,a=t.getState;return function(t){return function(n){return"function"==typeof n?n(r,a,e):t(n)}}}}t.__esModule=!0;var n=a();n.withExtraArgument=a,t.default=n},function(e,t,r){"use strict";function a(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t<e.length;t++)r[t]=e[t];return r}return Array.from(e)}function n(e,t){return e===t}function o(e){var t=arguments.length<=1||void 0===arguments[1]?n:arguments[1],r=null,a=null;return function(){for(var n=arguments.length,o=Array(n),i=0;i<n;i++)o[i]=arguments[i];return null!==r&&r.length===o.length&&o.every(function(e,a){return t(e,r[a])})||(a=e.apply(void 0,o)),r=o,a}}function i(e){var t=Array.isArray(e[0])?e[0]:e;if(!t.every(function(e){return"function"==typeof e})){var r=t.map(function(e){return void 0===e?"undefined":u(e)}).join(", ");throw new Error("Selector creators expect all input-selectors to be functions, instead received the following types: ["+r+"]")}return t}function l(e){for(var t=arguments.length,r=Array(t>1?t-1:0),n=1;n<t;n++)r[n-1]=arguments[n];return function(){for(var t=arguments.length,n=Array(t),o=0;o<t;o++)n[o]=arguments[o];var l=0,s=n.pop(),u=i(n),h=e.apply(void 0,[function(){return l++,s.apply(void 0,arguments)}].concat(r)),c=function(e,t){for(var r=arguments.length,n=Array(r>2?r-2:0),o=2;o<r;o++)n[o-2]=arguments[o];var i=u.map(function(r){return r.apply(void 0,[e,t].concat(n))});return h.apply(void 0,a(i))};return c.resultFunc=s,c.recomputations=function(){return l},c.resetRecomputations=function(){return l=0},c}}function s(e){var t=arguments.length<=1||void 0===arguments[1]?h:arguments[1];if("object"!==(void 0===e?"undefined":u(e)))throw new Error("createStructuredSelector expects first argument to be an object where each property is a selector, instead received a "+(void 0===e?"undefined":u(e)));var r=Object.keys(e);return t(r.map(function(t){return e[t]}),function(){for(var e=arguments.length,t=Array(e),a=0;a<e;a++)t[a]=arguments[a];return t.reduce(function(e,t,a){return e[r[a]]=t,e},{})})}var u="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.__esModule=!0,t.defaultMemoize=o,t.createSelectorCreator=l,t.createStructuredSelector=s;var h=t.createSelector=l(o)},function(e,t,r){"use strict";function a(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}r(453);var n=r(15),o=a(n),i=r(142),l=a(i),s=r(462),u=a(s),h=r(464),c=a(h),d=r(455),m=a(d),p=r(463),f=a(p),v=r(466),y=a(v),g=r(467),_=a(g),T=r(280),x=a(T),w=r(456),N=a(w),b=r(458),L=a(b),S=r(457),k=a(S),D=r(465),M=a(D),A=r(461),I=a(A),z=r(468),C=a(z),R=r(460),E=a(R),P=r(454),O=a(P),F=r(459),j=a(F),B={React:o,ReactDOM:l,ReactRedux:u,ReactRouter:c,Immutable:m,ReactRouterRedux:f,ReduxSaga:y,ReduxThunk:_,Redux:x,JsCookie:N,ObjectPath:L,lodash:k,ReduxActions:M,ReactIntl:I,Reselect:C,RcQueueAnim:E,echarts:O,rcAnimate:j};Object.keys(B).forEach(function(e){window[e]=B[e]})},function(e,t,r){"use strict";(function(e,t,r){function a(e,t){for(var r=Object.getOwnPropertyNames(t),a=0;a<r.length;a++){var n=r[a],o=Object.getOwnPropertyDescriptor(t,n);o&&o.configurable&&void 0===e[n]&&Object.defineProperty(e,n,o)}return e}var 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};!function(e){function o(e,t,r,a){var n=t&&t.prototype instanceof l?t:l,o=Object.create(n.prototype),i=new v(a||[]);return o._invoke=m(e,r,i),o}function i(e,t,r){try{return{type:"normal",arg:e.call(t,r)}}catch(e){return{type:"throw",arg:e}}}function l(){}function s(){}function u(){}function h(e){["next","throw","return"].forEach(function(t){e[t]=function(e){return this._invoke(t,e)}})}function c(e){this.arg=e}function d(e){function t(r,a,n,o){var l=i(e[r],e,a);if("throw"!==l.type){var s=l.arg,u=s.value;return u instanceof c?Promise.resolve(u.arg).then(function(e){t("next",e,n,o)},function(e){t("throw",e,n,o)}):Promise.resolve(u).then(function(e){s.value=e,n(s)},o)}o(l.arg)}function a(e,r){function a(){return new Promise(function(a,n){t(e,r,a,n)})}return o=o?o.then(a,a):a()}"object"===(void 0===r?"undefined":n(r))&&r.domain&&(t=r.domain.bind(t));var o;this._invoke=a}function m(e,t,r){var a=S;return function(n,o){if(a===D)throw new Error("Generator is already running");if(a===M){if("throw"===n)throw o;return g()}for(;;){var l=r.delegate;if(l){if("return"===n||"throw"===n&&l.iterator[n]===_){r.delegate=null;var s=l.iterator.return;if(s){var u=i(s,l.iterator,o);if("throw"===u.type){n="throw",o=u.arg;continue}}if("return"===n)continue}var u=i(l.iterator[n],l.iterator,o);if("throw"===u.type){r.delegate=null,n="throw",o=u.arg;continue}n="next",o=_;var h=u.arg;if(!h.done)return a=k,h;r[l.resultName]=h.value,r.next=l.nextLoc,r.delegate=null}if("next"===n)r.sent=r._sent=o;else if("throw"===n){if(a===S)throw a=M,o;r.dispatchException(o)&&(n="next",o=_)}else"return"===n&&r.abrupt("return",o);a=D;var u=i(e,t,r);if("normal"===u.type){a=r.done?M:k;var h={value:u.arg,done:r.done};if(u.arg!==A)return h;r.delegate&&"next"===n&&(o=_)}else"throw"===u.type&&(a=M,n="throw",o=u.arg)}}}function p(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function f(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function v(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(p,this),this.reset(!0)}function y(e){if(e){var t=e[w];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var r=-1,a=function t(){for(;++r<e.length;)if(T.call(e,r))return t.value=e[r],t.done=!1,t;return t.value=_,t.done=!0,t};return a.next=a}}return{next:g}}function g(){return{value:_,done:!0}}var _,T=Object.prototype.hasOwnProperty,x="function"==typeof Symbol?Symbol:{},w=x.iterator||"@@iterator",N=x.toStringTag||"@@toStringTag",b="object"===n(t),L=e.regeneratorRuntime;if(L)return void(b&&(t.exports=L));L=e.regeneratorRuntime=b?t.exports:{},L.wrap=o;var S="suspendedStart",k="suspendedYield",D="executing",M="completed",A={},I=u.prototype=l.prototype;s.prototype=I.constructor=u,u.constructor=s,u[N]=s.displayName="GeneratorFunction",L.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===s||"GeneratorFunction"===(t.displayName||t.name))},L.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,u):(a(e,u),N in e||(e[N]="GeneratorFunction")),e.prototype=Object.create(I),e},L.awrap=function(e){return new c(e)},h(d.prototype),L.async=function(e,t,r,a){var n=new d(o(e,t,r,a));return L.isGeneratorFunction(t)?n:n.next().then(function(e){return e.done?e.value:n.next()})},h(I),I[w]=function(){return this},I[N]="Generator",I.toString=function(){return"[object Generator]"},L.keys=function(e){var t=[];for(var r in e)t.push(r);return t.reverse(),function r(){for(;t.length;){var a=t.pop();if(a in e)return r.value=a,r.done=!1,r}return r.done=!0,r}},L.values=y,v.prototype={constructor:v,reset:function(e){if(this.prev=0,this.next=0,this.sent=this._sent=_,this.done=!1,this.delegate=null,this.tryEntries.forEach(f),!e)for(var t in this)"t"===t.charAt(0)&&T.call(this,t)&&!isNaN(+t.slice(1))&&(this[t]=_)},stop:function(){this.done=!0;var e=this.tryEntries[0],t=e.completion;if("throw"===t.type)throw t.arg;return this.rval},dispatchException:function(e){function t(t,a){return o.type="throw",o.arg=e,r.next=t,!!a}if(this.done)throw e;for(var r=this,a=this.tryEntries.length-1;a>=0;--a){var n=this.tryEntries[a],o=n.completion;if("root"===n.tryLoc)return t("end");if(n.tryLoc<=this.prev){var i=T.call(n,"catchLoc"),l=T.call(n,"finallyLoc");if(i&&l){if(this.prev<n.catchLoc)return t(n.catchLoc,!0);if(this.prev<n.finallyLoc)return t(n.finallyLoc)}else if(i){if(this.prev<n.catchLoc)return t(n.catchLoc,!0)}else{if(!l)throw new Error("try statement without catch or finally");if(this.prev<n.finallyLoc)return t(n.finallyLoc)}}}},abrupt:function(e,t){for(var r=this.tryEntries.length-1;r>=0;--r){var a=this.tryEntries[r];if(a.tryLoc<=this.prev&&T.call(a,"finallyLoc")&&this.prev<a.finallyLoc){var n=a;break}}n&&("break"===e||"continue"===e)&&n.tryLoc<=t&&t<=n.finallyLoc&&(n=null);var o=n?n.completion:{};return o.type=e,o.arg=t,n?this.next=n.finallyLoc:this.complete(o),A},complete:function(e,t){if("throw"===e.type)throw e.arg;"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=e.arg,this.next="end"):"normal"===e.type&&t&&(this.next=t)},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),f(r),A}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var a=r.completion;if("throw"===a.type){var n=a.arg;f(r)}return n}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,r){return this.delegate={iterator:y(e),resultName:t,nextLoc:r},A}}}("object"===(void 0===e?"undefined":n(e))?e:"object"===("undefined"==typeof window?"undefined":n(window))?window:"object"===("undefined"==typeof self?"undefined":n(self))?self:void 0)}).call(t,r(61),r(120)(e),r(404))},function(e,t,r){"use strict";e.exports={default:r(483),__esModule:!0}},function(e,t,r){"use strict";e.exports={default:r(484),__esModule:!0}},function(e,t,r){"use strict";e.exports={default:r(485),__esModule:!0}},function(e,t,r){"use strict";e.exports={default:r(487),__esModule:!0}},function(e,t,r){"use strict";e.exports={default:r(488),__esModule:!0}},function(e,t,r){"use strict";e.exports={default:r(489),__esModule:!0}},function(e,t,r){"use strict";t.__esModule=!0,t.default=function(e,t){var r={};for(var a in e)t.indexOf(a)>=0||Object.prototype.hasOwnProperty.call(e,a)&&(r[a]=e[a]);return r}},function(e,t,r){"use strict";t.__esModule=!0;var a=r(471),n=function(e){return e&&e.__esModule?e:{default:e}}(a);t.default=function(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t<e.length;t++)r[t]=e[t];return r}return(0,n.default)(e)}},function(e,t,r){"use strict";var a,n,o="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};/*! + Copyright (c) 2017 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/classnames +*/ +!function(){function i(){for(var e=[],t=0;t<arguments.length;t++){var r=arguments[t];if(r){var a=void 0===r?"undefined":o(r);if("string"===a||"number"===a)e.push(r);else if(Array.isArray(r)&&r.length){var n=i.apply(null,r);n&&e.push(n)}else if("object"===a)for(var s in r)l.call(r,s)&&r[s]&&e.push(s)}}return e.join(" ")}var l={}.hasOwnProperty;void 0!==e&&e.exports?(i.default=i,e.exports=i):"object"===o(r(195))&&r(195)?(a=[],void 0!==(n=function(){return i}.apply(t,a))&&(e.exports=n)):window.classNames=i}()},function(e,t,r){"use strict";function a(e){if(!e||!e.nodeType)throw new Error("A DOM element reference is required");this.el=e,this.list=e.classList}try{var n=r(986)}catch(e){var n=r(481)}var o=/\s+/,i=Object.prototype.toString;e.exports=function(e){return new a(e)},a.prototype.add=function(e){if(this.list)return this.list.add(e),this;var t=this.array();return~n(t,e)||t.push(e),this.el.className=t.join(" "),this},a.prototype.remove=function(e){if("[object RegExp]"==i.call(e))return this.removeMatching(e);if(this.list)return this.list.remove(e),this;var t=this.array(),r=n(t,e);return~r&&t.splice(r,1),this.el.className=t.join(" "),this},a.prototype.removeMatching=function(e){for(var t=this.array(),r=0;r<t.length;r++)e.test(t[r])&&this.remove(t[r]);return this},a.prototype.toggle=function(e,t){return this.list?(void 0!==t?t!==this.list.toggle(e,t)&&this.list.toggle(e):this.list.toggle(e),this):(void 0!==t?t?this.add(e):this.remove(e):this.has(e)?this.remove(e):this.add(e),this)},a.prototype.array=function(){var e=this.el.getAttribute("class")||"",t=e.replace(/^\s+|\s+$/g,""),r=t.split(o);return""===r[0]&&r.shift(),r},a.prototype.has=a.prototype.contains=function(e){return this.list?this.list.contains(e):!!~n(this.array(),e)}},function(e,t,r){"use strict";e.exports=function(e,t){if(e.indexOf)return e.indexOf(t);for(var r=0;r<e.length;++r)if(e[r]===t)return r;return-1}},function(e,t,r){"use strict";r(529),e.exports=r(42).RegExp.escape},function(e,t,r){"use strict";r(292),r(512),e.exports=r(46).Array.from},function(e,t,r){"use strict";r(514),e.exports=r(46).Object.assign},function(e,t,r){"use strict";r(515);var a=r(46).Object;e.exports=function(e,t){return a.create(e,t)}},function(e,t,r){"use strict";r(516);var a=r(46).Object;e.exports=function(e,t,r){return a.defineProperty(e,t,r)}},function(e,t,r){"use strict";r(517),e.exports=r(46).Object.setPrototypeOf},function(e,t,r){"use strict";r(519),r(518),r(520),r(521),e.exports=r(46).Symbol},function(e,t,r){"use strict";r(292),r(522),e.exports=r(210).f("iterator")},function(e,t,r){"use strict";e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t,r){"use strict";e.exports=function(){}},function(e,t,r){"use strict";var a=r(106),n=r(291),o=r(510);e.exports=function(e){return function(t,r,i){var l,s=a(t),u=n(s.length),h=o(i,u);if(e&&r!=r){for(;u>h;)if((l=s[h++])!=l)return!0}else for(;u>h;h++)if((e||h in s)&&s[h]===r)return e||h||0;return!e&&-1}}},function(e,t,r){"use strict";var a=r(197),n=r(47)("toStringTag"),o="Arguments"==a(function(){return arguments}()),i=function(e,t){try{return e[t]}catch(e){}};e.exports=function(e){var t,r,l;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(r=i(t=Object(e),n))?r:o?a(t):"Object"==(l=a(t))&&"function"==typeof t.callee?"Arguments":l}},function(e,t,r){"use strict";var a=r(65),n=r(124);e.exports=function(e,t,r){t in e?a.f(e,t,n(0,r)):e[t]=r}},function(e,t,r){"use strict";var a=r(144),n=r(202),o=r(145);e.exports=function(e){var t=a(e),r=n.f;if(r)for(var i,l=r(e),s=o.f,u=0;l.length>u;)s.call(e,i=l[u++])&&t.push(i);return t}},function(e,t,r){"use strict";var a=r(64).document;e.exports=a&&a.documentElement},function(e,t,r){"use strict";var a=r(123),n=r(47)("iterator"),o=Array.prototype;e.exports=function(e){return void 0!==e&&(a.Array===e||o[n]===e)}},function(e,t,r){"use strict";var a=r(197);e.exports=Array.isArray||function(e){return"Array"==a(e)}},function(e,t,r){"use strict";var a=r(103);e.exports=function(e,t,r,n){try{return n?t(a(r)[0],r[1]):t(r)}catch(t){var o=e.return;throw void 0!==o&&a(o.call(e)),t}}},function(e,t,r){"use strict";var a=r(201),n=r(124),o=r(203),i={};r(104)(i,r(47)("iterator"),function(){return this}),e.exports=function(e,t,r){e.prototype=a(i,{next:n(1,r)}),o(e,t+" Iterator")}},function(e,t,r){"use strict";var a=r(47)("iterator"),n=!1;try{var o=[7][a]();o.return=function(){n=!0},Array.from(o,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!n)return!1;var r=!1;try{var o=[7],i=o[a]();i.next=function(){return{done:r=!0}},o[a]=function(){return i},e(o)}catch(e){}return r}},function(e,t,r){"use strict";e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t,r){"use strict";var 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},n=r(146)("meta"),o=r(105),i=r(79),l=r(65).f,s=0,u=Object.isExtensible||function(){return!0},h=!r(122)(function(){return u(Object.preventExtensions({}))}),c=function(e){l(e,n,{value:{i:"O"+ ++s,w:{}}})},d=function(e,t){if(!o(e))return"symbol"==(void 0===e?"undefined":a(e))?e:("string"==typeof e?"S":"P")+e;if(!i(e,n)){if(!u(e))return"F";if(!t)return"E";c(e)}return e[n].i},m=function(e,t){if(!i(e,n)){if(!u(e))return!0;if(!t)return!1;c(e)}return e[n].w},p=function(e){return h&&f.NEED&&u(e)&&!i(e,n)&&c(e),e},f=e.exports={KEY:n,NEED:!1,fastKey:d,getWeak:m,onFreeze:p}},function(e,t,r){"use strict";var a=r(144),n=r(202),o=r(145),i=r(207),l=r(285),s=Object.assign;e.exports=!s||r(122)(function(){var e={},t={},r=Symbol(),a="abcdefghijklmnopqrst";return e[r]=7,a.split("").forEach(function(e){t[e]=e}),7!=s({},e)[r]||Object.keys(s({},t)).join("")!=a})?function(e,t){for(var r=i(e),s=arguments.length,u=1,h=n.f,c=o.f;s>u;)for(var d,m=l(arguments[u++]),p=h?a(m).concat(h(m)):a(m),f=p.length,v=0;f>v;)c.call(m,d=p[v++])&&(r[d]=m[d]);return r}:s},function(e,t,r){"use strict";var a=r(65),n=r(103),o=r(144);e.exports=r(77)?Object.defineProperties:function(e,t){n(e);for(var r,i=o(t),l=i.length,s=0;l>s;)a.f(e,r=i[s++],t[r]);return e}},function(e,t,r){"use strict";var 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},n=r(106),o=r(288).f,i={}.toString,l="object"==("undefined"==typeof window?"undefined":a(window))&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(e){try{return o(e)}catch(e){return l.slice()}};e.exports.f=function(e){return l&&"[object Window]"==i.call(e)?s(e):o(n(e))}},function(e,t,r){"use strict";var a=r(79),n=r(207),o=r(204)("IE_PROTO"),i=Object.prototype;e.exports=Object.getPrototypeOf||function(e){return e=n(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,r){"use strict";function a(e,t){for(var r=Object.getOwnPropertyNames(t),a=0;a<r.length;a++){var n=r[a],o=Object.getOwnPropertyDescriptor(t,n);o&&o.configurable&&void 0===e[n]&&Object.defineProperty(e,n,o)}return e}var n=r(105),o=r(103),i=function(e,t){if(o(e),!n(t)&&null!==t)throw TypeError(t+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,t,n){try{n=r(198)(Function.call,r(287).f(Object.prototype,"__proto__").set,2),n(e,[]),t=!(e instanceof Array)}catch(e){t=!0}return function(e,r){return i(e,r),t?a(e,r):n(e,r),e}}({},!1):void 0),check:i}},function(e,t,r){"use strict";var a=r(206),n=r(199);e.exports=function(e){return function(t,r){var o,i,l=String(n(t)),s=a(r),u=l.length;return s<0||s>=u?e?"":void 0:(o=l.charCodeAt(s),o<55296||o>56319||s+1===u||(i=l.charCodeAt(s+1))<56320||i>57343?e?l.charAt(s):o:e?l.slice(s,s+2):i-56320+(o-55296<<10)+65536)}}},function(e,t,r){"use strict";var a=r(206),n=Math.max,o=Math.min;e.exports=function(e,t){return e=a(e),e<0?n(e+t,0):o(e,t)}},function(e,t,r){"use strict";var a=r(493),n=r(47)("iterator"),o=r(123);e.exports=r(46).getIteratorMethod=function(e){if(void 0!=e)return e[n]||e["@@iterator"]||o[a(e)]}},function(e,t,r){"use strict";var a=r(198),n=r(78),o=r(207),i=r(499),l=r(497),s=r(291),u=r(494),h=r(511);n(n.S+n.F*!r(501)(function(e){Array.from(e)}),"Array",{from:function(e){var t,r,n,c,d=o(e),m="function"==typeof this?this:Array,p=arguments.length,f=p>1?arguments[1]:void 0,v=void 0!==f,y=0,g=h(d);if(v&&(f=a(f,p>2?arguments[2]:void 0,2)),void 0==g||m==Array&&l(g))for(t=s(d.length),r=new m(t);t>y;y++)u(r,y,v?f(d[y],y):d[y]);else for(c=g.call(d),r=new m;!(n=c.next()).done;y++)u(r,y,v?i(c,f,[n.value,y],!0):n.value);return r.length=y,r}})},function(e,t,r){"use strict";var a=r(491),n=r(502),o=r(123),i=r(106);e.exports=r(286)(Array,"Array",function(e,t){this._t=i(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,r=this._i++;return!e||r>=e.length?(this._t=void 0,n(1)):"keys"==t?n(0,r):"values"==t?n(0,e[r]):n(0,[r,e[r]])},"values"),o.Arguments=o.Array,a("keys"),a("values"),a("entries")},function(e,t,r){"use strict";var a=r(78);a(a.S+a.F,"Object",{assign:r(504)})},function(e,t,r){"use strict";var a=r(78);a(a.S,"Object",{create:r(201)})},function(e,t,r){"use strict";var a=r(78);a(a.S+a.F*!r(77),"Object",{defineProperty:r(65).f})},function(e,t,r){"use strict";var a=r(78);a(a.S,"Object",{setPrototypeOf:r(508).set})},function(e,t,r){"use strict"},function(e,t,r){"use strict";var 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},n=r(64),o=r(79),i=r(77),l=r(78),s=r(290),u=r(503).KEY,h=r(122),c=r(205),d=r(203),m=r(146),p=r(47),f=r(210),v=r(209),y=r(495),g=r(498),_=r(103),T=r(105),x=r(106),w=r(208),N=r(124),b=r(201),L=r(506),S=r(287),k=r(65),D=r(144),M=S.f,A=k.f,I=L.f,z=n.Symbol,C=n.JSON,R=C&&C.stringify,E=p("_hidden"),P=p("toPrimitive"),O={}.propertyIsEnumerable,F=c("symbol-registry"),j=c("symbols"),B=c("op-symbols"),H=Object.prototype,V="function"==typeof z,G=n.QObject,W=!G||!G.prototype||!G.prototype.findChild,U=i&&h(function(){return 7!=b(A({},"a",{get:function(){return A(this,"a",{value:7}).a}})).a})?function(e,t,r){var a=M(H,t);a&&delete H[t],A(e,t,r),a&&e!==H&&A(H,t,a)}:A,q=function(e){var t=j[e]=b(z.prototype);return t._k=e,t},Y=V&&"symbol"==a(z.iterator)?function(e){return"symbol"==(void 0===e?"undefined":a(e))}:function(e){return e instanceof z},Z=function(e,t,r){return e===H&&Z(B,t,r),_(e),t=w(t,!0),_(r),o(j,t)?(r.enumerable?(o(e,E)&&e[E][t]&&(e[E][t]=!1),r=b(r,{enumerable:N(0,!1)})):(o(e,E)||A(e,E,N(1,{})),e[E][t]=!0),U(e,t,r)):A(e,t,r)},K=function(e,t){_(e);for(var r,a=y(t=x(t)),n=0,o=a.length;o>n;)Z(e,r=a[n++],t[r]);return e},J=function(e,t){return void 0===t?b(e):K(b(e),t)},X=function(e){var t=O.call(this,e=w(e,!0));return!(this===H&&o(j,e)&&!o(B,e))&&(!(t||!o(this,e)||!o(j,e)||o(this,E)&&this[E][e])||t)},$=function(e,t){if(e=x(e),t=w(t,!0),e!==H||!o(j,t)||o(B,t)){var r=M(e,t);return!r||!o(j,t)||o(e,E)&&e[E][t]||(r.enumerable=!0),r}},Q=function(e){for(var t,r=I(x(e)),a=[],n=0;r.length>n;)o(j,t=r[n++])||t==E||t==u||a.push(t);return a},ee=function(e){for(var t,r=e===H,a=I(r?B:x(e)),n=[],i=0;a.length>i;)!o(j,t=a[i++])||r&&!o(H,t)||n.push(j[t]);return n};V||(z=function(){if(this instanceof z)throw TypeError("Symbol is not a constructor!");var e=m(arguments.length>0?arguments[0]:void 0),t=function t(r){this===H&&t.call(B,r),o(this,E)&&o(this[E],e)&&(this[E][e]=!1),U(this,e,N(1,r))};return i&&W&&U(H,e,{configurable:!0,set:t}),q(e)},s(z.prototype,"toString",function(){return this._k}),S.f=$,k.f=Z,r(288).f=L.f=Q,r(145).f=X,r(202).f=ee,i&&!r(143)&&s(H,"propertyIsEnumerable",X,!0),f.f=function(e){return q(p(e))}),l(l.G+l.W+l.F*!V,{Symbol:z});for(var te="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),re=0;te.length>re;)p(te[re++]);for(var ae=D(p.store),ne=0;ae.length>ne;)v(ae[ne++]);l(l.S+l.F*!V,"Symbol",{for:function(e){return o(F,e+="")?F[e]:F[e]=z(e)},keyFor:function(e){if(!Y(e))throw TypeError(e+" is not a symbol!");for(var t in F)if(F[t]===e)return t},useSetter:function(){W=!0},useSimple:function(){W=!1}}),l(l.S+l.F*!V,"Object",{create:J,defineProperty:Z,defineProperties:K,getOwnPropertyDescriptor:$,getOwnPropertyNames:Q,getOwnPropertySymbols:ee}),C&&l(l.S+l.F*(!V||h(function(){var e=z();return"[null]"!=R([e])||"{}"!=R({a:e})||"{}"!=R(Object(e))})),"JSON",{stringify:function(e){for(var t,r,a=[e],n=1;arguments.length>n;)a.push(arguments[n++]);if(r=t=a[1],(T(t)||void 0!==e)&&!Y(e))return g(t)||(t=function(e,t){if("function"==typeof r&&(t=r.call(this,e,t)),!Y(t))return t}),a[1]=t,R.apply(C,a)}}),z.prototype[P]||r(104)(z.prototype,P,z.prototype.valueOf),d(z,"Symbol"),d(Math,"Math",!0),d(n.JSON,"JSON",!0)},function(e,t,r){"use strict";r(209)("asyncIterator")},function(e,t,r){"use strict";r(209)("observable")},function(e,t,r){"use strict";r(513);for(var a=r(64),n=r(104),o=r(123),i=r(47)("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],h=a[u],c=h&&h.prototype;c&&!c[i]&&n(c,i,u),o[u]=o.Array}},function(e,t,r){"use strict";var a=r(8),n=r(151),o=r(13)("species");e.exports=function(e){var t;return n(e)&&(t=e.constructor,"function"!=typeof t||t!==Array&&!n(t.prototype)||(t=void 0),a(t)&&null===(t=t[o])&&(t=void 0)),void 0===t?Array:t}},function(e,t,r){"use strict";var a=r(7),n=Date.prototype.getTime,o=Date.prototype.toISOString,i=function(e){return e>9?e:"0"+e};e.exports=a(function(){return"0385-07-25T07:06:39.999Z"!=o.call(new Date(-5e13-1))})||!a(function(){o.call(new Date(NaN))})?function(){if(!isFinite(n.call(this)))throw RangeError("Invalid time value");var e=this,t=e.getUTCFullYear(),r=e.getUTCMilliseconds(),a=t<0?"-":t>9999?"+":"";return a+("00000"+Math.abs(t)).slice(a?-6:-4)+"-"+i(e.getUTCMonth()+1)+"-"+i(e.getUTCDate())+"T"+i(e.getUTCHours())+":"+i(e.getUTCMinutes())+":"+i(e.getUTCSeconds())+"."+(r>99?r:"0"+i(r))+"Z"}:o},function(e,t,r){"use strict";var a=r(5),n=r(52);e.exports=function(e){if("string"!==e&&"number"!==e&&"default"!==e)throw TypeError("Incorrect hint");return n(a(this),"number"!=e)}},function(e,t,r){"use strict";var a=r(84),n=r(155),o=r(127);e.exports=function(e){var t=a(e),r=n.f;if(r)for(var i,l=r(e),s=o.f,u=0;l.length>u;)s.call(e,i=l[u++])&&t.push(i);return t}},function(e,t,r){"use strict";e.exports=function(e,t){var r=t===Object(t)?function(e){return t[e]}:t;return function(t){return String(t).replace(e,r)}}},function(e,t,r){"use strict";e.exports=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}},function(e,t,r){"use strict";var a=r(1),n=r(527)(/[\\^$*+?.()|[\]{}]/g,"\\$&");a(a.S,"RegExp",{escape:function(e){return n(e)}})},function(e,t,r){"use strict";var a=r(1);a(a.P,"Array",{copyWithin:r(294)}),r(66)("copyWithin")},function(e,t,r){"use strict";var a=r(1),n=r(48)(4);a(a.P+a.F*!r(44)([].every,!0),"Array",{every:function(e){return n(this,e,arguments[1])}})},function(e,t,r){"use strict";var a=r(1);a(a.P,"Array",{fill:r(211)}),r(66)("fill")},function(e,t,r){"use strict";var a=r(1),n=r(48)(2);a(a.P+a.F*!r(44)([].filter,!0),"Array",{filter:function(e){return n(this,e,arguments[1])}})},function(e,t,r){"use strict";var a=r(1),n=r(48)(6),o="findIndex",i=!0;o in[]&&Array(1)[o](function(){i=!1}),a(a.P+a.F*i,"Array",{findIndex:function(e){return n(this,e,arguments.length>1?arguments[1]:void 0)}}),r(66)(o)},function(e,t,r){"use strict";var a=r(1),n=r(48)(5),o=!0;"find"in[]&&Array(1).find(function(){o=!1}),a(a.P+a.F*o,"Array",{find:function(e){return n(this,e,arguments.length>1?arguments[1]:void 0)}}),r(66)("find")},function(e,t,r){"use strict";var a=r(1),n=r(48)(0),o=r(44)([].forEach,!0);a(a.P+a.F*!o,"Array",{forEach:function(e){return n(this,e,arguments[1])}})},function(e,t,r){"use strict";var a=r(43),n=r(1),o=r(22),i=r(305),l=r(219),s=r(18),u=r(213),h=r(235);n(n.S+n.F*!r(153)(function(e){Array.from(e)}),"Array",{from:function(e){var t,r,n,c,d=o(e),m="function"==typeof this?this:Array,p=arguments.length,f=p>1?arguments[1]:void 0,v=void 0!==f,y=0,g=h(d);if(v&&(f=a(f,p>2?arguments[2]:void 0,2)),void 0==g||m==Array&&l(g))for(t=s(d.length),r=new m(t);t>y;y++)u(r,y,v?f(d[y],y):d[y]);else for(c=g.call(d),r=new m;!(n=c.next()).done;y++)u(r,y,v?i(c,f,[n.value,y],!0):n.value);return r.length=y,r}})},function(e,t,r){"use strict";var a=r(1),n=r(147)(!1),o=[].indexOf,i=!!o&&1/[1].indexOf(1,-0)<0;a(a.P+a.F*(i||!r(44)(o)),"Array",{indexOf:function(e){return i?o.apply(this,arguments)||0:n(this,e,arguments[1])}})},function(e,t,r){"use strict";var a=r(1);a(a.S,"Array",{isArray:r(151)})},function(e,t,r){"use strict";var a=r(1),n=r(36),o=[].join;a(a.P+a.F*(r(126)!=Object||!r(44)(o)),"Array",{join:function(e){return o.call(n(this),void 0===e?",":e)}})},function(e,t,r){"use strict";var a=r(1),n=r(36),o=r(51),i=r(18),l=[].lastIndexOf,s=!!l&&1/[1].lastIndexOf(1,-0)<0;a(a.P+a.F*(s||!r(44)(l)),"Array",{lastIndexOf:function(e){if(s)return l.apply(this,arguments)||0;var t=n(this),r=i(t.length),a=r-1;for(arguments.length>1&&(a=Math.min(a,o(arguments[1]))),a<0&&(a=r+a);a>=0;a--)if(a in t&&t[a]===e)return a||0;return-1}})},function(e,t,r){"use strict";var a=r(1),n=r(48)(1);a(a.P+a.F*!r(44)([].map,!0),"Array",{map:function(e){return n(this,e,arguments[1])}})},function(e,t,r){"use strict";var a=r(1),n=r(213);a(a.S+a.F*r(7)(function(){function e(){}return!(Array.of.call(e)instanceof e)}),"Array",{of:function(){for(var e=0,t=arguments.length,r=new("function"==typeof this?this:Array)(t);t>e;)n(r,e,arguments[e++]);return r.length=t,r}})},function(e,t,r){"use strict";var a=r(1),n=r(296);a(a.P+a.F*!r(44)([].reduceRight,!0),"Array",{reduceRight:function(e){return n(this,e,arguments.length,arguments[1],!0)}})},function(e,t,r){"use strict";var a=r(1),n=r(296);a(a.P+a.F*!r(44)([].reduce,!0),"Array",{reduce:function(e){return n(this,e,arguments.length,arguments[1],!1)}})},function(e,t,r){"use strict";var a=r(1),n=r(217),o=r(41),i=r(88),l=r(18),s=[].slice;a(a.P+a.F*r(7)(function(){n&&s.call(n)}),"Array",{slice:function(e,t){var r=l(this.length),a=o(this);if(t=void 0===t?r:t,"Array"==a)return s.call(this,e,t);for(var n=i(e,r),u=i(t,r),h=l(u-n),c=new Array(h),d=0;d<h;d++)c[d]="String"==a?this.charAt(n+d):this[n+d];return c}})},function(e,t,r){"use strict";var a=r(1),n=r(48)(3);a(a.P+a.F*!r(44)([].some,!0),"Array",{some:function(e){return n(this,e,arguments[1])}})},function(e,t,r){"use strict";var a=r(1),n=r(29),o=r(22),i=r(7),l=[].sort,s=[1,2,3];a(a.P+a.F*(i(function(){s.sort(void 0)})||!i(function(){s.sort(null)})||!r(44)(l)),"Array",{sort:function(e){return void 0===e?l.call(o(this)):l.call(o(this),n(e))}})},function(e,t,r){"use strict";r(87)("Array")},function(e,t,r){"use strict";var a=r(1);a(a.S,"Date",{now:function(){return(new Date).getTime()}})},function(e,t,r){"use strict";var a=r(1),n=r(524);a(a.P+a.F*(Date.prototype.toISOString!==n),"Date",{toISOString:n})},function(e,t,r){"use strict";var a=r(1),n=r(22),o=r(52);a(a.P+a.F*r(7)(function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})}),"Date",{toJSON:function(e){var t=n(this),r=o(t);return"number"!=typeof r||isFinite(r)?t.toISOString():null}})},function(e,t,r){"use strict";var a=r(13)("toPrimitive"),n=Date.prototype;a in n||r(30)(n,a,r(525))},function(e,t,r){"use strict";var a=Date.prototype,n=a.toString,o=a.getTime;new Date(NaN)+""!="Invalid Date"&&r(31)(a,"toString",function(){var e=o.call(this);return e===e?n.call(this):"Invalid Date"})},function(e,t,r){"use strict";var a=r(1);a(a.P,"Function",{bind:r(297)})},function(e,t,r){"use strict";var a=r(8),n=r(35),o=r(13)("hasInstance"),i=Function.prototype;o in i||r(17).f(i,o,{value:function(e){if("function"!=typeof this||!a(e))return!1;if(!a(this.prototype))return e instanceof this;for(;e=n(e);)if(this.prototype===e)return!0;return!1}})},function(e,t,r){"use strict";var a=r(17).f,n=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in n||r(16)&&a(n,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(e){return""}}})},function(e,t,r){"use strict";var a=r(1),n=r(308),o=Math.sqrt,i=Math.acosh;a(a.S+a.F*!(i&&710==Math.floor(i(Number.MAX_VALUE))&&i(1/0)==1/0),"Math",{acosh:function(e){return(e=+e)<1?NaN:e>94906265.62425156?Math.log(e)+Math.LN2:n(e-1+o(e-1)*o(e+1))}})},function(e,t,r){"use strict";function a(e){return isFinite(e=+e)&&0!=e?e<0?-a(-e):Math.log(e+Math.sqrt(e*e+1)):e}var n=r(1),o=Math.asinh;n(n.S+n.F*!(o&&1/o(0)>0),"Math",{asinh:a})},function(e,t,r){"use strict";var a=r(1),n=Math.atanh;a(a.S+a.F*!(n&&1/n(-0)<0),"Math",{atanh:function(e){return 0==(e=+e)?e:Math.log((1+e)/(1-e))/2}})},function(e,t,r){"use strict";var a=r(1),n=r(223);a(a.S,"Math",{cbrt:function(e){return n(e=+e)*Math.pow(Math.abs(e),1/3)}})},function(e,t,r){"use strict";var a=r(1);a(a.S,"Math",{clz32:function(e){return(e>>>=0)?31-Math.floor(Math.log(e+.5)*Math.LOG2E):32}})},function(e,t,r){"use strict";var a=r(1),n=Math.exp;a(a.S,"Math",{cosh:function(e){return(n(e=+e)+n(-e))/2}})},function(e,t,r){"use strict";var a=r(1),n=r(222);a(a.S+a.F*(n!=Math.expm1),"Math",{expm1:n})},function(e,t,r){"use strict";var a=r(1);a(a.S,"Math",{fround:r(307)})},function(e,t,r){"use strict";var a=r(1),n=Math.abs;a(a.S,"Math",{hypot:function(e,t){for(var r,a,o=0,i=0,l=arguments.length,s=0;i<l;)r=n(arguments[i++]),s<r?(a=s/r,o=o*a*a+1,s=r):r>0?(a=r/s,o+=a*a):o+=r;return s===1/0?1/0:s*Math.sqrt(o)}})},function(e,t,r){"use strict";var a=r(1),n=Math.imul;a(a.S+a.F*r(7)(function(){return-5!=n(4294967295,5)||2!=n.length}),"Math",{imul:function(e,t){var r=+e,a=+t,n=65535&r,o=65535&a;return 0|n*o+((65535&r>>>16)*o+n*(65535&a>>>16)<<16>>>0)}})},function(e,t,r){"use strict";var a=r(1);a(a.S,"Math",{log10:function(e){return Math.log(e)*Math.LOG10E}})},function(e,t,r){"use strict";var a=r(1);a(a.S,"Math",{log1p:r(308)})},function(e,t,r){"use strict";var a=r(1);a(a.S,"Math",{log2:function(e){return Math.log(e)/Math.LN2}})},function(e,t,r){"use strict";var a=r(1);a(a.S,"Math",{sign:r(223)})},function(e,t,r){"use strict";var a=r(1),n=r(222),o=Math.exp;a(a.S+a.F*r(7)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(e){return Math.abs(e=+e)<1?(n(e)-n(-e))/2:(o(e-1)-o(-e-1))*(Math.E/2)}})},function(e,t,r){"use strict";var a=r(1),n=r(222),o=Math.exp;a(a.S,"Math",{tanh:function(e){var t=n(e=+e),r=n(-e);return t==1/0?1:r==1/0?-1:(t-r)/(o(e)+o(-e))}})},function(e,t,r){"use strict";var a=r(1);a(a.S,"Math",{trunc:function(e){return(e>0?Math.floor:Math.ceil)(e)}})},function(e,t,r){"use strict";var a=r(6),n=r(33),o=r(41),i=r(218),l=r(52),s=r(7),u=r(83).f,h=r(34).f,c=r(17).f,d=r(109).trim,m=a.Number,p=m,f=m.prototype,v="Number"==o(r(82)(f)),y="trim"in String.prototype,g=function(e){var t=l(e,!1);if("string"==typeof t&&t.length>2){t=y?t.trim():d(t,3);var r,a,n,o=t.charCodeAt(0);if(43===o||45===o){if(88===(r=t.charCodeAt(2))||120===r)return NaN}else if(48===o){switch(t.charCodeAt(1)){case 66:case 98:a=2,n=49;break;case 79:case 111:a=8,n=55;break;default:return+t}for(var i,s=t.slice(2),u=0,h=s.length;u<h;u++)if((i=s.charCodeAt(u))<48||i>n)return NaN;return parseInt(s,a)}}return+t};if(!m(" 0o1")||!m("0b1")||m("+0x1")){m=function(e){var t=arguments.length<1?0:e,r=this;return r instanceof m&&(v?s(function(){f.valueOf.call(r)}):"Number"!=o(r))?i(new p(g(t)),r,m):g(t)};for(var _,T=r(16)?u(p):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),x=0;T.length>x;x++)n(p,_=T[x])&&!n(m,_)&&c(m,_,h(p,_));m.prototype=f,f.constructor=m,r(31)(a,"Number",m)}},function(e,t,r){"use strict";var a=r(1);a(a.S,"Number",{EPSILON:Math.pow(2,-52)})},function(e,t,r){"use strict";var a=r(1),n=r(6).isFinite;a(a.S,"Number",{isFinite:function(e){return"number"==typeof e&&n(e)}})},function(e,t,r){"use strict";var a=r(1);a(a.S,"Number",{isInteger:r(304)})},function(e,t,r){"use strict";var a=r(1);a(a.S,"Number",{isNaN:function(e){return e!=e}})},function(e,t,r){"use strict";var a=r(1),n=r(304),o=Math.abs;a(a.S,"Number",{isSafeInteger:function(e){return n(e)&&o(e)<=9007199254740991}})},function(e,t,r){"use strict";var a=r(1);a(a.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},function(e,t,r){"use strict";var a=r(1);a(a.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},function(e,t,r){"use strict";var a=r(1),n=r(316);a(a.S+a.F*(Number.parseFloat!=n),"Number",{parseFloat:n})},function(e,t,r){"use strict";var a=r(1),n=r(317);a(a.S+a.F*(Number.parseInt!=n),"Number",{parseInt:n})},function(e,t,r){"use strict";var a=r(1),n=r(51),o=r(293),i=r(230),l=1..toFixed,s=Math.floor,u=[0,0,0,0,0,0],h="Number.toFixed: incorrect invocation!",c=function(e,t){for(var r=-1,a=t;++r<6;)a+=e*u[r],u[r]=a%1e7,a=s(a/1e7)},d=function(e){for(var t=6,r=0;--t>=0;)r+=u[t],u[t]=s(r/e),r=r%e*1e7},m=function(){for(var e=6,t="";--e>=0;)if(""!==t||0===e||0!==u[e]){var r=String(u[e]);t=""===t?r:t+i.call("0",7-r.length)+r}return t},p=function e(t,r,a){return 0===r?a:r%2==1?e(t,r-1,a*t):e(t*t,r/2,a)},f=function(e){for(var t=0,r=e;r>=4096;)t+=12,r/=4096;for(;r>=2;)t+=1,r/=2;return t};a(a.P+a.F*(!!l&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!r(7)(function(){l.call({})})),"Number",{toFixed:function(e){var t,r,a,l,s=o(this,h),u=n(e),v="",y="0";if(u<0||u>20)throw RangeError(h);if(s!=s)return"NaN";if(s<=-1e21||s>=1e21)return String(s);if(s<0&&(v="-",s=-s),s>1e-21)if(t=f(s*p(2,69,1))-69,r=t<0?s*p(2,-t,1):s/p(2,t,1),r*=4503599627370496,(t=52-t)>0){for(c(0,r),a=u;a>=7;)c(1e7,0),a-=7;for(c(p(10,a,1),0),a=t-1;a>=23;)d(1<<23),a-=23;d(1<<a),c(1,1),d(2),y=m()}else c(0,r),c(1<<-t,0),y=m()+i.call("0",u);return u>0?(l=y.length,y=v+(l<=u?"0."+i.call("0",u-l)+y:y.slice(0,l-u)+"."+y.slice(l-u))):y=v+y,y}})},function(e,t,r){"use strict";var a=r(1),n=r(7),o=r(293),i=1..toPrecision;a(a.P+a.F*(n(function(){return"1"!==i.call(1,void 0)})||!n(function(){i.call({})})),"Number",{toPrecision:function(e){var t=o(this,"Number#toPrecision: incorrect invocation!");return void 0===e?i.call(t):i.call(t,e)}})},function(e,t,r){"use strict";var a=r(1);a(a.S+a.F,"Object",{assign:r(310)})},function(e,t,r){"use strict";var a=r(1);a(a.S,"Object",{create:r(82)})},function(e,t,r){"use strict";var a=r(1);a(a.S+a.F*!r(16),"Object",{defineProperties:r(311)})},function(e,t,r){"use strict";var a=r(1);a(a.S+a.F*!r(16),"Object",{defineProperty:r(17).f})},function(e,t,r){"use strict";var a=r(8),n=r(68).onFreeze;r(50)("freeze",function(e){return function(t){return e&&a(t)?e(n(t)):t}})},function(e,t,r){"use strict";var a=r(36),n=r(34).f;r(50)("getOwnPropertyDescriptor",function(){return function(e,t){return n(a(e),t)}})},function(e,t,r){"use strict";r(50)("getOwnPropertyNames",function(){return r(312).f})},function(e,t,r){"use strict";var a=r(22),n=r(35);r(50)("getPrototypeOf",function(){return function(e){return n(a(e))}})},function(e,t,r){"use strict";var a=r(8);r(50)("isExtensible",function(e){return function(t){return!!a(t)&&(!e||e(t))}})},function(e,t,r){"use strict";var a=r(8);r(50)("isFrozen",function(e){return function(t){return!a(t)||!!e&&e(t)}})},function(e,t,r){"use strict";var a=r(8);r(50)("isSealed",function(e){return function(t){return!a(t)||!!e&&e(t)}})},function(e,t,r){"use strict";var a=r(1);a(a.S,"Object",{is:r(528)})},function(e,t,r){"use strict";var a=r(22),n=r(84);r(50)("keys",function(){return function(e){return n(a(e))}})},function(e,t,r){"use strict";var a=r(8),n=r(68).onFreeze;r(50)("preventExtensions",function(e){return function(t){return e&&a(t)?e(n(t)):t}})},function(e,t,r){"use strict";var a=r(8),n=r(68).onFreeze;r(50)("seal",function(e){return function(t){return e&&a(t)?e(n(t)):t}})},function(e,t,r){"use strict";var a=r(1);a(a.S,"Object",{setPrototypeOf:r(226).set})},function(e,t,r){"use strict";var a=r(125),n={};n[r(13)("toStringTag")]="z",n+""!="[object z]"&&r(31)(Object.prototype,"toString",function(){return"[object "+a(this)+"]"},!0)},function(e,t,r){"use strict";var a=r(1),n=r(316);a(a.G+a.F*(parseFloat!=n),{parseFloat:n})},function(e,t,r){"use strict";var a=r(1),n=r(317);a(a.G+a.F*(parseInt!=n),{parseInt:n})},function(e,t,r){"use strict";var a,n,o,i,l=r(67),s=r(6),u=r(43),h=r(125),c=r(1),d=r(8),m=r(29),p=r(80),f=r(81),v=r(159),y=r(232).set,g=r(224)(),_=r(225),T=r(318),x=r(161),w=r(319),N=s.TypeError,b=s.process,L=b&&b.versions,S=L&&L.v8||"",k=s.Promise,D="process"==h(b),M=function(){},A=n=_.f,I=!!function(){try{var e=k.resolve(1),t=(e.constructor={})[r(13)("species")]=function(e){e(M,M)};return(D||"function"==typeof PromiseRejectionEvent)&&e.then(M)instanceof t&&0!==S.indexOf("6.6")&&-1===x.indexOf("Chrome/66")}catch(e){}}(),z=function(e){var t;return!(!d(e)||"function"!=typeof(t=e.then))&&t},C=function(e,t){if(!e._n){e._n=!0;var r=e._c;g(function(){for(var a=e._v,n=1==e._s,o=0;r.length>o;)!function(t){var r,o,i,l=n?t.ok:t.fail,s=t.resolve,u=t.reject,h=t.domain;try{l?(n||(2==e._h&&P(e),e._h=1),!0===l?r=a:(h&&h.enter(),r=l(a),h&&(h.exit(),i=!0)),r===t.promise?u(N("Promise-chain cycle")):(o=z(r))?o.call(r,s,u):s(r)):u(a)}catch(e){h&&!i&&h.exit(),u(e)}}(r[o++]);e._c=[],e._n=!1,t&&!e._h&&R(e)})}},R=function(e){y.call(s,function(){var t,r,a,n=e._v,o=E(e);if(o&&(t=T(function(){D?b.emit("unhandledRejection",n,e):(r=s.onunhandledrejection)?r({promise:e,reason:n}):(a=s.console)&&a.error&&a.error("Unhandled promise rejection",n)}),e._h=D||E(e)?2:1),e._a=void 0,o&&t.e)throw t.v})},E=function(e){return 1!==e._h&&0===(e._a||e._c).length},P=function(e){y.call(s,function(){var t;D?b.emit("rejectionHandled",e):(t=s.onrejectionhandled)&&t({promise:e,reason:e._v})})},O=function(e){var t=this;t._d||(t._d=!0,t=t._w||t,t._v=e,t._s=2,t._a||(t._a=t._c.slice()),C(t,!0))},F=function e(t){var r,a=this;if(!a._d){a._d=!0,a=a._w||a;try{if(a===t)throw N("Promise can't be resolved itself");(r=z(t))?g(function(){var n={_w:a,_d:!1};try{r.call(t,u(e,n,1),u(O,n,1))}catch(e){O.call(n,e)}}):(a._v=t,a._s=1,C(a,!1))}catch(e){O.call({_w:a,_d:!1},e)}}};I||(k=function(e){p(this,k,"Promise","_h"),m(e),a.call(this);try{e(u(F,this,1),u(O,this,1))}catch(e){O.call(this,e)}},a=function(e){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1},a.prototype=r(86)(k.prototype,{then:function(e,t){var r=A(v(this,k));return r.ok="function"!=typeof e||e,r.fail="function"==typeof t&&t,r.domain=D?b.domain:void 0,this._c.push(r),this._a&&this._a.push(r),this._s&&C(this,!1),r.promise},catch:function(e){return this.then(void 0,e)}}),o=function(){var e=new a;this.promise=e,this.resolve=u(F,e,1),this.reject=u(O,e,1)},_.f=A=function(e){return e===k||e===i?new o(e):n(e)}),c(c.G+c.W+c.F*!I,{Promise:k}),r(108)(k,"Promise"),r(87)("Promise"),i=r(42).Promise,c(c.S+c.F*!I,"Promise",{reject:function(e){var t=A(this);return(0,t.reject)(e),t.promise}}),c(c.S+c.F*(l||!I),"Promise",{resolve:function(e){return w(l&&this===i?k:this,e)}}),c(c.S+c.F*!(I&&r(153)(function(e){k.all(e).catch(M)})),"Promise",{all:function(e){var t=this,r=A(t),a=r.resolve,n=r.reject,o=T(function(){var r=[],o=0,i=1;f(e,!1,function(e){var l=o++,s=!1;r.push(void 0),i++,t.resolve(e).then(function(e){s||(s=!0,r[l]=e,--i||a(r))},n)}),--i||a(r)});return o.e&&n(o.v),r.promise},race:function(e){var t=this,r=A(t),a=r.reject,n=T(function(){f(e,!1,function(e){t.resolve(e).then(r.resolve,a)})});return n.e&&a(n.v),r.promise}})},function(e,t,r){"use strict";var a=r(1),n=r(29),o=r(5),i=(r(6).Reflect||{}).apply,l=Function.apply;a(a.S+a.F*!r(7)(function(){i(function(){})}),"Reflect",{apply:function(e,t,r){var a=n(e),s=o(r);return i?i(a,t,s):l.call(a,t,s)}})},function(e,t,r){"use strict";var a=r(1),n=r(82),o=r(29),i=r(5),l=r(8),s=r(7),u=r(297),h=(r(6).Reflect||{}).construct,c=s(function(){function e(){}return!(h(function(){},[],e)instanceof e)}),d=!s(function(){h(function(){})});a(a.S+a.F*(c||d),"Reflect",{construct:function(e,t){o(e),i(t);var r=arguments.length<3?e:o(arguments[2]);if(d&&!c)return h(e,t,r);if(e==r){switch(t.length){case 0:return new e;case 1:return new e(t[0]);case 2:return new e(t[0],t[1]);case 3:return new e(t[0],t[1],t[2]);case 4:return new e(t[0],t[1],t[2],t[3])}var a=[null];return a.push.apply(a,t),new(u.apply(e,a))}var s=r.prototype,m=n(l(s)?s:Object.prototype),p=Function.apply.call(e,m,t);return l(p)?p:m}})},function(e,t,r){"use strict";var a=r(17),n=r(1),o=r(5),i=r(52);n(n.S+n.F*r(7)(function(){Reflect.defineProperty(a.f({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(e,t,r){o(e),t=i(t,!0),o(r);try{return a.f(e,t,r),!0}catch(e){return!1}}})},function(e,t,r){"use strict";var a=r(1),n=r(34).f,o=r(5);a(a.S,"Reflect",{deleteProperty:function(e,t){var r=n(o(e),t);return!(r&&!r.configurable)&&delete e[t]}})},function(e,t,r){"use strict";var a=r(1),n=r(5),o=function(e){this._t=n(e),this._i=0;var t,r=this._k=[];for(t in e)r.push(t)};r(220)(o,"Object",function(){var e,t=this,r=t._k;do{if(t._i>=r.length)return{value:void 0,done:!0}}while(!((e=r[t._i++])in t._t));return{value:e,done:!1}}),a(a.S,"Reflect",{enumerate:function(e){return new o(e)}})},function(e,t,r){"use strict";var a=r(34),n=r(1),o=r(5);n(n.S,"Reflect",{getOwnPropertyDescriptor:function(e,t){return a.f(o(e),t)}})},function(e,t,r){"use strict";var a=r(1),n=r(35),o=r(5);a(a.S,"Reflect",{getPrototypeOf:function(e){return n(o(e))}})},function(e,t,r){"use strict";function a(e,t){var r,l,h=arguments.length<3?e:arguments[2];return u(e)===h?e[t]:(r=n.f(e,t))?i(r,"value")?r.value:void 0!==r.get?r.get.call(h):void 0:s(l=o(e))?a(l,t,h):void 0}var n=r(34),o=r(35),i=r(33),l=r(1),s=r(8),u=r(5);l(l.S,"Reflect",{get:a})},function(e,t,r){"use strict";var a=r(1);a(a.S,"Reflect",{has:function(e,t){return t in e}})},function(e,t,r){"use strict";var a=r(1),n=r(5),o=Object.isExtensible;a(a.S,"Reflect",{isExtensible:function(e){return n(e),!o||o(e)}})},function(e,t,r){"use strict";var a=r(1);a(a.S,"Reflect",{ownKeys:r(315)})},function(e,t,r){"use strict";var a=r(1),n=r(5),o=Object.preventExtensions;a(a.S,"Reflect",{preventExtensions:function(e){n(e);try{return o&&o(e),!0}catch(e){return!1}}})},function(e,t,r){"use strict";var a=r(1),n=r(226);n&&a(a.S,"Reflect",{setPrototypeOf:function(e,t){n.check(e,t);try{return n.set(e,t),!0}catch(e){return!1}}})},function(e,t,r){"use strict";function a(e,t,r){var s,d,m=arguments.length<4?e:arguments[3],p=o.f(h(e),t);if(!p){if(c(d=i(e)))return a(d,t,r,m);p=u(0)}if(l(p,"value")){if(!1===p.writable||!c(m))return!1;if(s=o.f(m,t)){if(s.get||s.set||!1===s.writable)return!1;s.value=r,n.f(m,t,s)}else n.f(m,t,u(0,r));return!0}return void 0!==p.set&&(p.set.call(m,r),!0)}var n=r(17),o=r(34),i=r(35),l=r(33),s=r(1),u=r(85),h=r(5),c=r(8);s(s.S,"Reflect",{set:a})},function(e,t,r){"use strict";var a=r(6),n=r(218),o=r(17).f,i=r(83).f,l=r(152),s=r(150),u=a.RegExp,h=u,c=u.prototype,d=/a/g,m=/a/g,p=new u(d)!==d;if(r(16)&&(!p||r(7)(function(){return m[r(13)("match")]=!1,u(d)!=d||u(m)==m||"/a/i"!=u(d,"i")}))){u=function(e,t){var r=this instanceof u,a=l(e),o=void 0===t;return!r&&a&&e.constructor===u&&o?e:n(p?new h(a&&!o?e.source:e,t):h((a=e instanceof u)?e.source:e,a&&o?s.call(e):t),r?this:c,u)};for(var f=i(h),v=0;f.length>v;)!function(e){e in u||o(u,e,{configurable:!0,get:function(){return h[e]},set:function(t){h[e]=t}})}(f[v++]);c.constructor=u,u.prototype=c,r(31)(a,"RegExp",u)}r(87)("RegExp")},function(e,t,r){"use strict";r(149)("match",1,function(e,t,r){return[function(r){var a=e(this),n=void 0==r?void 0:r[t];return void 0!==n?n.call(r,a):new RegExp(r)[t](String(a))},r]})},function(e,t,r){"use strict";r(149)("replace",2,function(e,t,r){return[function(a,n){var o=e(this),i=void 0==a?void 0:a[t];return void 0!==i?i.call(a,o,n):r.call(String(o),a,n)},r]})},function(e,t,r){"use strict";r(149)("search",1,function(e,t,r){return[function(r){var a=e(this),n=void 0==r?void 0:r[t];return void 0!==n?n.call(r,a):new RegExp(r)[t](String(a))},r]})},function(e,t,r){"use strict";r(149)("split",2,function(e,t,a){var n=r(152),o=a,i=[].push,l="length";if("c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1)[l]||2!="ab".split(/(?:ab)*/)[l]||4!=".".split(/(.?)(.?)/)[l]||".".split(/()()/)[l]>1||"".split(/.?/)[l]){var s=void 0===/()??/.exec("")[1];a=function(e,t){var r=String(this);if(void 0===e&&0===t)return[];if(!n(e))return o.call(r,e,t);var a,u,h,c,d,m=[],p=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),f=0,v=void 0===t?4294967295:t>>>0,y=new RegExp(e.source,p+"g");for(s||(a=new RegExp("^"+y.source+"$(?!\\s)",p));(u=y.exec(r))&&!((h=u.index+u[0][l])>f&&(m.push(r.slice(f,u.index)),!s&&u[l]>1&&u[0].replace(a,function(){for(d=1;d<arguments[l]-2;d++)void 0===arguments[d]&&(u[d]=void 0)}),u[l]>1&&u.index<r[l]&&i.apply(m,u.slice(1)),c=u[0][l],f=h,m[l]>=v));)y.lastIndex===u.index&&y.lastIndex++;return f===r[l]?!c&&y.test("")||m.push(""):m.push(r.slice(f)),m[l]>v?m.slice(0,v):m}}else"0".split(void 0,0)[l]&&(a=function(e,t){return void 0===e&&0===t?[]:o.call(this,e,t)});return[function(r,n){var o=e(this),i=void 0==r?void 0:r[t];return void 0!==i?i.call(r,o,n):a.call(String(o),r,n)},a]})},function(e,t,r){"use strict";r(324);var a=r(5),n=r(150),o=r(16),i=/./.toString,l=function(e){r(31)(RegExp.prototype,"toString",e,!0)};r(7)(function(){return"/a/b"!=i.call({source:"a",flags:"b"})})?l(function(){var e=a(this);return"/".concat(e.source,"/","flags"in e?e.flags:!o&&e instanceof RegExp?n.call(e):void 0)}):"toString"!=i.name&&l(function(){return i.call(this)})},function(e,t,r){"use strict";r(32)("anchor",function(e){return function(t){return e(this,"a","name",t)}})},function(e,t,r){"use strict";r(32)("big",function(e){return function(){return e(this,"big","","")}})},function(e,t,r){"use strict";r(32)("blink",function(e){return function(){return e(this,"blink","","")}})},function(e,t,r){"use strict";r(32)("bold",function(e){return function(){return e(this,"b","","")}})},function(e,t,r){"use strict";var a=r(1),n=r(228)(!1);a(a.P,"String",{codePointAt:function(e){return n(this,e)}})},function(e,t,r){"use strict";var a=r(1),n=r(18),o=r(229),i="".endsWith;a(a.P+a.F*r(216)("endsWith"),"String",{endsWith:function(e){var t=o(this,e,"endsWith"),r=arguments.length>1?arguments[1]:void 0,a=n(t.length),l=void 0===r?a:Math.min(n(r),a),s=String(e);return i?i.call(t,s,l):t.slice(l-s.length,l)===s}})},function(e,t,r){"use strict";r(32)("fixed",function(e){return function(){return e(this,"tt","","")}})},function(e,t,r){"use strict";r(32)("fontcolor",function(e){return function(t){return e(this,"font","color",t)}})},function(e,t,r){"use strict";r(32)("fontsize",function(e){return function(t){return e(this,"font","size",t)}})},function(e,t,r){"use strict";var a=r(1),n=r(88),o=String.fromCharCode,i=String.fromCodePoint;a(a.S+a.F*(!!i&&1!=i.length),"String",{fromCodePoint:function(e){for(var t,r=[],a=arguments.length,i=0;a>i;){if(t=+arguments[i++],n(t,1114111)!==t)throw RangeError(t+" is not a valid code point");r.push(t<65536?o(t):o(55296+((t-=65536)>>10),t%1024+56320))}return r.join("")}})},function(e,t,r){"use strict";var a=r(1),n=r(229);a(a.P+a.F*r(216)("includes"),"String",{includes:function(e){return!!~n(this,e,"includes").indexOf(e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,r){"use strict";r(32)("italics",function(e){return function(){return e(this,"i","","")}})},function(e,t,r){"use strict";var a=r(228)(!0);r(221)(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,r=this._i;return r>=t.length?{value:void 0,done:!0}:(e=a(t,r),this._i+=e.length,{value:e,done:!1})})},function(e,t,r){"use strict";r(32)("link",function(e){return function(t){return e(this,"a","href",t)}})},function(e,t,r){"use strict";var a=r(1),n=r(36),o=r(18);a(a.S,"String",{raw:function(e){for(var t=n(e.raw),r=o(t.length),a=arguments.length,i=[],l=0;r>l;)i.push(String(t[l++])),l<a&&i.push(String(arguments[l]));return i.join("")}})},function(e,t,r){"use strict";var a=r(1);a(a.P,"String",{repeat:r(230)})},function(e,t,r){"use strict";r(32)("small",function(e){return function(){return e(this,"small","","")}})},function(e,t,r){"use strict";var a=r(1),n=r(18),o=r(229),i="".startsWith;a(a.P+a.F*r(216)("startsWith"),"String",{startsWith:function(e){var t=o(this,e,"startsWith"),r=n(Math.min(arguments.length>1?arguments[1]:void 0,t.length)),a=String(e);return i?i.call(t,a,r):t.slice(r,r+a.length)===a}})},function(e,t,r){"use strict";r(32)("strike",function(e){return function(){return e(this,"strike","","")}})},function(e,t,r){"use strict";r(32)("sub",function(e){return function(){return e(this,"sub","","")}})},function(e,t,r){"use strict";r(32)("sup",function(e){return function(){return e(this,"sup","","")}})},function(e,t,r){"use strict";r(109)("trim",function(e){return function(){return e(this,3)}})},function(e,t,r){"use strict";var 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},n=r(6),o=r(33),i=r(16),l=r(1),s=r(31),u=r(68).KEY,h=r(7),c=r(158),d=r(108),m=r(89),p=r(13),f=r(322),v=r(234),y=r(526),g=r(151),_=r(5),T=r(8),x=r(36),w=r(52),N=r(85),b=r(82),L=r(312),S=r(34),k=r(17),D=r(84),M=S.f,A=k.f,I=L.f,z=n.Symbol,C=n.JSON,R=C&&C.stringify,E=p("_hidden"),P=p("toPrimitive"),O={}.propertyIsEnumerable,F=c("symbol-registry"),j=c("symbols"),B=c("op-symbols"),H=Object.prototype,V="function"==typeof z,G=n.QObject,W=!G||!G.prototype||!G.prototype.findChild,U=i&&h(function(){return 7!=b(A({},"a",{get:function(){return A(this,"a",{value:7}).a}})).a})?function(e,t,r){var a=M(H,t);a&&delete H[t],A(e,t,r),a&&e!==H&&A(H,t,a)}:A,q=function(e){var t=j[e]=b(z.prototype);return t._k=e,t},Y=V&&"symbol"==a(z.iterator)?function(e){return"symbol"==(void 0===e?"undefined":a(e))}:function(e){return e instanceof z},Z=function(e,t,r){return e===H&&Z(B,t,r),_(e),t=w(t,!0),_(r),o(j,t)?(r.enumerable?(o(e,E)&&e[E][t]&&(e[E][t]=!1),r=b(r,{enumerable:N(0,!1)})):(o(e,E)||A(e,E,N(1,{})),e[E][t]=!0),U(e,t,r)):A(e,t,r)},K=function(e,t){_(e);for(var r,a=y(t=x(t)),n=0,o=a.length;o>n;)Z(e,r=a[n++],t[r]);return e},J=function(e,t){return void 0===t?b(e):K(b(e),t)},X=function(e){var t=O.call(this,e=w(e,!0));return!(this===H&&o(j,e)&&!o(B,e))&&(!(t||!o(this,e)||!o(j,e)||o(this,E)&&this[E][e])||t)},$=function(e,t){if(e=x(e),t=w(t,!0),e!==H||!o(j,t)||o(B,t)){var r=M(e,t);return!r||!o(j,t)||o(e,E)&&e[E][t]||(r.enumerable=!0),r}},Q=function(e){for(var t,r=I(x(e)),a=[],n=0;r.length>n;)o(j,t=r[n++])||t==E||t==u||a.push(t);return a},ee=function(e){for(var t,r=e===H,a=I(r?B:x(e)),n=[],i=0;a.length>i;)!o(j,t=a[i++])||r&&!o(H,t)||n.push(j[t]);return n};V||(z=function(){if(this instanceof z)throw TypeError("Symbol is not a constructor!");var e=m(arguments.length>0?arguments[0]:void 0),t=function t(r){this===H&&t.call(B,r),o(this,E)&&o(this[E],e)&&(this[E][e]=!1),U(this,e,N(1,r))};return i&&W&&U(H,e,{configurable:!0,set:t}),q(e)},s(z.prototype,"toString",function(){return this._k}),S.f=$,k.f=Z,r(83).f=L.f=Q,r(127).f=X,r(155).f=ee,i&&!r(67)&&s(H,"propertyIsEnumerable",X,!0),f.f=function(e){return q(p(e))}),l(l.G+l.W+l.F*!V,{Symbol:z});for(var te="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),re=0;te.length>re;)p(te[re++]);for(var ae=D(p.store),ne=0;ae.length>ne;)v(ae[ne++]);l(l.S+l.F*!V,"Symbol",{for:function(e){return o(F,e+="")?F[e]:F[e]=z(e)},keyFor:function(e){if(!Y(e))throw TypeError(e+" is not a symbol!");for(var t in F)if(F[t]===e)return t},useSetter:function(){W=!0},useSimple:function(){W=!1}}),l(l.S+l.F*!V,"Object",{create:J,defineProperty:Z,defineProperties:K,getOwnPropertyDescriptor:$,getOwnPropertyNames:Q,getOwnPropertySymbols:ee}),C&&l(l.S+l.F*(!V||h(function(){var e=z();return"[null]"!=R([e])||"{}"!=R({a:e})||"{}"!=R(Object(e))})),"JSON",{stringify:function(e){for(var t,r,a=[e],n=1;arguments.length>n;)a.push(arguments[n++]);if(r=t=a[1],(T(t)||void 0!==e)&&!Y(e))return g(t)||(t=function(e,t){if("function"==typeof r&&(t=r.call(this,e,t)),!Y(t))return t}),a[1]=t,R.apply(C,a)}}),z.prototype[P]||r(30)(z.prototype,P,z.prototype.valueOf),d(z,"Symbol"),d(Math,"Math",!0),d(n.JSON,"JSON",!0)},function(e,t,r){"use strict";var a=r(1),n=r(160),o=r(233),i=r(5),l=r(88),s=r(18),u=r(8),h=r(6).ArrayBuffer,c=r(159),d=o.ArrayBuffer,m=o.DataView,p=n.ABV&&h.isView,f=d.prototype.slice,v=n.VIEW;a(a.G+a.W+a.F*(h!==d),{ArrayBuffer:d}),a(a.S+a.F*!n.CONSTR,"ArrayBuffer",{isView:function(e){return p&&p(e)||u(e)&&v in e}}),a(a.P+a.U+a.F*r(7)(function(){return!new d(2).slice(1,void 0).byteLength}),"ArrayBuffer",{slice:function(e,t){if(void 0!==f&&void 0===t)return f.call(i(this),e);for(var r=i(this).byteLength,a=l(e,r),n=l(void 0===t?r:t,r),o=new(c(this,d))(s(n-a)),u=new m(this),h=new m(o),p=0;a<n;)h.setUint8(p++,u.getUint8(a++));return o}}),r(87)("ArrayBuffer")},function(e,t,r){"use strict";var a=r(1);a(a.G+a.W+a.F*!r(160).ABV,{DataView:r(233).DataView})},function(e,t,r){"use strict";r(56)("Float32",4,function(e){return function(t,r,a){return e(this,t,r,a)}})},function(e,t,r){"use strict";r(56)("Float64",8,function(e){return function(t,r,a){return e(this,t,r,a)}})},function(e,t,r){"use strict";r(56)("Int16",2,function(e){return function(t,r,a){return e(this,t,r,a)}})},function(e,t,r){"use strict";r(56)("Int32",4,function(e){return function(t,r,a){return e(this,t,r,a)}})},function(e,t,r){"use strict";r(56)("Int8",1,function(e){return function(t,r,a){return e(this,t,r,a)}})},function(e,t,r){"use strict";r(56)("Uint16",2,function(e){return function(t,r,a){return e(this,t,r,a)}})},function(e,t,r){"use strict";r(56)("Uint32",4,function(e){return function(t,r,a){return e(this,t,r,a)}})},function(e,t,r){"use strict";r(56)("Uint8",1,function(e){return function(t,r,a){return e(this,t,r,a)}})},function(e,t,r){"use strict";r(56)("Uint8",1,function(e){return function(t,r,a){return e(this,t,r,a)}},!0)},function(e,t,r){"use strict";var a=r(300),n=r(110);r(148)("WeakSet",function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{add:function(e){return a.def(n(this,"WeakSet"),e,!0)}},a,!1,!0)},function(e,t,r){"use strict";var a=r(1),n=r(301),o=r(22),i=r(18),l=r(29),s=r(212);a(a.P,"Array",{flatMap:function(e){var t,r,a=o(this);return l(e),t=i(a.length),r=s(a,0),n(r,a,a,t,0,1,e,arguments[1]),r}}),r(66)("flatMap")},function(e,t,r){"use strict";var a=r(1),n=r(301),o=r(22),i=r(18),l=r(51),s=r(212);a(a.P,"Array",{flatten:function(){var e=arguments[0],t=o(this),r=i(t.length),a=s(t,0);return n(a,t,t,r,0,void 0===e?1:l(e)),a}}),r(66)("flatten")},function(e,t,r){"use strict";var a=r(1),n=r(147)(!0);a(a.P,"Array",{includes:function(e){return n(this,e,arguments.length>1?arguments[1]:void 0)}}),r(66)("includes")},function(e,t,r){"use strict";var a=r(1),n=r(224)(),o=r(6).process,i="process"==r(41)(o);a(a.G,{asap:function(e){var t=i&&o.domain;n(t?t.bind(e):e)}})},function(e,t,r){"use strict";var a=r(1),n=r(41);a(a.S,"Error",{isError:function(e){return"Error"===n(e)}})},function(e,t,r){"use strict";var a=r(1);a(a.G,{global:r(6)})},function(e,t,r){"use strict";r(156)("Map")},function(e,t,r){"use strict";r(157)("Map")},function(e,t,r){"use strict";var a=r(1);a(a.P+a.R,"Map",{toJSON:r(299)("Map")})},function(e,t,r){"use strict";var a=r(1);a(a.S,"Math",{clamp:function(e,t,r){return Math.min(r,Math.max(t,e))}})},function(e,t,r){"use strict";var a=r(1);a(a.S,"Math",{DEG_PER_RAD:Math.PI/180})},function(e,t,r){"use strict";var a=r(1),n=180/Math.PI;a(a.S,"Math",{degrees:function(e){return e*n}})},function(e,t,r){"use strict";var a=r(1),n=r(309),o=r(307);a(a.S,"Math",{fscale:function(e,t,r,a,i){return o(n(e,t,r,a,i))}})},function(e,t,r){"use strict";var a=r(1);a(a.S,"Math",{iaddh:function(e,t,r,a){var n=e>>>0,o=t>>>0,i=r>>>0;return o+(a>>>0)+((n&i|(n|i)&~(n+i>>>0))>>>31)|0}})},function(e,t,r){"use strict";var a=r(1);a(a.S,"Math",{imulh:function(e,t){var r=+e,a=+t,n=65535&r,o=65535&a,i=r>>16,l=a>>16,s=(i*o>>>0)+(n*o>>>16);return i*l+(s>>16)+((n*l>>>0)+(65535&s)>>16)}})},function(e,t,r){"use strict";var a=r(1);a(a.S,"Math",{isubh:function(e,t,r,a){var n=e>>>0,o=t>>>0,i=r>>>0;return o-(a>>>0)-((~n&i|~(n^i)&n-i>>>0)>>>31)|0}})},function(e,t,r){"use strict";var a=r(1);a(a.S,"Math",{RAD_PER_DEG:180/Math.PI})},function(e,t,r){"use strict";var a=r(1),n=Math.PI/180;a(a.S,"Math",{radians:function(e){return e*n}})},function(e,t,r){"use strict";var a=r(1);a(a.S,"Math",{scale:r(309)})},function(e,t,r){"use strict";var a=r(1);a(a.S,"Math",{signbit:function(e){return(e=+e)!=e?e:0==e?1/e==1/0:e>0}})},function(e,t,r){"use strict";var a=r(1);a(a.S,"Math",{umulh:function(e,t){var r=+e,a=+t,n=65535&r,o=65535&a,i=r>>>16,l=a>>>16,s=(i*o>>>0)+(n*o>>>16);return i*l+(s>>>16)+((n*l>>>0)+(65535&s)>>>16)}})},function(e,t,r){"use strict";var a=r(1),n=r(22),o=r(29),i=r(17);r(16)&&a(a.P+r(154),"Object",{__defineGetter__:function(e,t){i.f(n(this),e,{get:o(t),enumerable:!0,configurable:!0})}})},function(e,t,r){"use strict";var a=r(1),n=r(22),o=r(29),i=r(17);r(16)&&a(a.P+r(154),"Object",{__defineSetter__:function(e,t){i.f(n(this),e,{set:o(t),enumerable:!0,configurable:!0})}})},function(e,t,r){"use strict";var a=r(1),n=r(314)(!0);a(a.S,"Object",{entries:function(e){return n(e)}})},function(e,t,r){"use strict";var a=r(1),n=r(315),o=r(36),i=r(34),l=r(213);a(a.S,"Object",{getOwnPropertyDescriptors:function(e){for(var t,r,a=o(e),s=i.f,u=n(a),h={},c=0;u.length>c;)void 0!==(r=s(a,t=u[c++]))&&l(h,t,r);return h}})},function(e,t,r){"use strict";var a=r(1),n=r(22),o=r(52),i=r(35),l=r(34).f;r(16)&&a(a.P+r(154),"Object",{__lookupGetter__:function(e){var t,r=n(this),a=o(e,!0);do{if(t=l(r,a))return t.get}while(r=i(r))}})},function(e,t,r){"use strict";var a=r(1),n=r(22),o=r(52),i=r(35),l=r(34).f;r(16)&&a(a.P+r(154),"Object",{__lookupSetter__:function(e){var t,r=n(this),a=o(e,!0);do{if(t=l(r,a))return t.set}while(r=i(r))}})},function(e,t,r){"use strict";var a=r(1),n=r(314)(!1);a(a.S,"Object",{values:function(e){return n(e)}})},function(e,t,r){"use strict";var a=r(1),n=r(6),o=r(42),i=r(224)(),l=r(13)("observable"),s=r(29),u=r(5),h=r(80),c=r(86),d=r(30),m=r(81),p=m.RETURN,f=function(e){return null==e?void 0:s(e)},v=function(e){var t=e._c;t&&(e._c=void 0,t())},y=function(e){return void 0===e._o},g=function(e){y(e)||(e._o=void 0,v(e))},_=function(e,t){u(e),this._c=void 0,this._o=e,e=new T(this);try{var r=t(e),a=r;null!=r&&("function"==typeof r.unsubscribe?r=function(){a.unsubscribe()}:s(r),this._c=r)}catch(t){return void e.error(t)}y(this)&&v(this)};_.prototype=c({},{unsubscribe:function(){g(this)}});var T=function(e){this._s=e};T.prototype=c({},{next:function(e){var t=this._s;if(!y(t)){var r=t._o;try{var a=f(r.next);if(a)return a.call(r,e)}catch(e){try{g(t)}finally{throw e}}}},error:function(e){var t=this._s;if(y(t))throw e;var r=t._o;t._o=void 0;try{var a=f(r.error);if(!a)throw e;e=a.call(r,e)}catch(e){try{v(t)}finally{throw e}}return v(t),e},complete:function(e){var t=this._s;if(!y(t)){var r=t._o;t._o=void 0;try{var a=f(r.complete);e=a?a.call(r,e):void 0}catch(e){try{v(t)}finally{throw e}}return v(t),e}}});var x=function(e){h(this,x,"Observable","_f")._f=s(e)};c(x.prototype,{subscribe:function(e){return new _(e,this._f)},forEach:function(e){var t=this;return new(o.Promise||n.Promise)(function(r,a){s(e);var n=t.subscribe({next:function(t){try{return e(t)}catch(e){a(e),n.unsubscribe()}},error:a,complete:r})})}}),c(x,{from:function(e){var t="function"==typeof this?this:x,r=f(u(e)[l]);if(r){var a=u(r.call(e));return a.constructor===t?a:new t(function(e){return a.subscribe(e)})}return new t(function(t){var r=!1;return i(function(){if(!r){try{if(m(e,!1,function(e){if(t.next(e),r)return p})===p)return}catch(e){if(r)throw e;return void t.error(e)}t.complete()}}),function(){r=!0}})},of:function(){for(var e=0,t=arguments.length,r=new Array(t);e<t;)r[e]=arguments[e++];return new("function"==typeof this?this:x)(function(e){var t=!1;return i(function(){if(!t){for(var a=0;a<r.length;++a)if(e.next(r[a]),t)return;e.complete()}}),function(){t=!0}})}}),d(x.prototype,l,function(){return this}),a(a.G,{Observable:x}),r(87)("Observable")},function(e,t,r){"use strict";var a=r(1),n=r(42),o=r(6),i=r(159),l=r(319);a(a.P+a.R,"Promise",{finally:function(e){var t=i(this,n.Promise||o.Promise),r="function"==typeof e;return this.then(r?function(r){return l(t,e()).then(function(){return r})}:e,r?function(r){return l(t,e()).then(function(){throw r})}:e)}})},function(e,t,r){"use strict";var a=r(1),n=r(225),o=r(318);a(a.S,"Promise",{try:function(e){var t=n.f(this),r=o(e);return(r.e?t.reject:t.resolve)(r.v),t.promise}})},function(e,t,r){"use strict";var a=r(55),n=r(5),o=a.key,i=a.set;a.exp({defineMetadata:function(e,t,r,a){i(e,t,n(r),o(a))}})},function(e,t,r){"use strict";var a=r(55),n=r(5),o=a.key,i=a.map,l=a.store;a.exp({deleteMetadata:function(e,t){var r=arguments.length<3?void 0:o(arguments[2]),a=i(n(t),r,!1);if(void 0===a||!a.delete(e))return!1;if(a.size)return!0;var s=l.get(t);return s.delete(r),!!s.size||l.delete(t)}})},function(e,t,r){"use strict";var a=r(325),n=r(295),o=r(55),i=r(5),l=r(35),s=o.keys,u=o.key,h=function e(t,r){var o=s(t,r),i=l(t);if(null===i)return o;var u=e(i,r);return u.length?o.length?n(new a(o.concat(u))):u:o};o.exp({getMetadataKeys:function(e){return h(i(e),arguments.length<2?void 0:u(arguments[1]))}})},function(e,t,r){"use strict";var a=r(55),n=r(5),o=r(35),i=a.has,l=a.get,s=a.key,u=function e(t,r,a){if(i(t,r,a))return l(t,r,a);var n=o(r);return null!==n?e(t,n,a):void 0};a.exp({getMetadata:function(e,t){return u(e,n(t),arguments.length<3?void 0:s(arguments[2]))}})},function(e,t,r){"use strict";var a=r(55),n=r(5),o=a.keys,i=a.key;a.exp({getOwnMetadataKeys:function(e){return o(n(e),arguments.length<2?void 0:i(arguments[1]))}})},function(e,t,r){"use strict";var a=r(55),n=r(5),o=a.get,i=a.key;a.exp({getOwnMetadata:function(e,t){return o(e,n(t),arguments.length<3?void 0:i(arguments[2]))}})},function(e,t,r){"use strict";var a=r(55),n=r(5),o=r(35),i=a.has,l=a.key,s=function e(t,r,a){if(i(t,r,a))return!0;var n=o(r);return null!==n&&e(t,n,a)};a.exp({hasMetadata:function(e,t){return s(e,n(t),arguments.length<3?void 0:l(arguments[2]))}})},function(e,t,r){"use strict";var a=r(55),n=r(5),o=a.has,i=a.key;a.exp({hasOwnMetadata:function(e,t){return o(e,n(t),arguments.length<3?void 0:i(arguments[2]))}})},function(e,t,r){"use strict";var a=r(55),n=r(5),o=r(29),i=a.key,l=a.set;a.exp({metadata:function(e,t){return function(r,a){l(e,t,(void 0!==a?n:o)(r),i(a))}}})},function(e,t,r){"use strict";r(156)("Set")},function(e,t,r){"use strict";r(157)("Set")},function(e,t,r){"use strict";var a=r(1);a(a.P+a.R,"Set",{toJSON:r(299)("Set")})},function(e,t,r){"use strict";var a=r(1),n=r(228)(!0);a(a.P,"String",{at:function(e){return n(this,e)}})},function(e,t,r){"use strict";var a=r(1),n=r(49),o=r(18),i=r(152),l=r(150),s=RegExp.prototype,u=function(e,t){this._r=e,this._s=t};r(220)(u,"RegExp String",function(){var e=this._r.exec(this._s);return{value:e,done:null===e}}),a(a.P,"String",{matchAll:function(e){if(n(this),!i(e))throw TypeError(e+" is not a regexp!");var t=String(this),r="flags"in s?String(e.flags):l.call(e),a=new RegExp(e.source,~r.indexOf("g")?r:"g"+r);return a.lastIndex=o(e.lastIndex),new u(a,t)}})},function(e,t,r){"use strict";var a=r(1),n=r(320),o=r(161);a(a.P+a.F*/Version\/10\.\d+(\.\d+)? Safari\//.test(o),"String",{padEnd:function(e){return n(this,e,arguments.length>1?arguments[1]:void 0,!1)}})},function(e,t,r){"use strict";var a=r(1),n=r(320),o=r(161);a(a.P+a.F*/Version\/10\.\d+(\.\d+)? Safari\//.test(o),"String",{padStart:function(e){return n(this,e,arguments.length>1?arguments[1]:void 0,!0)}})},function(e,t,r){"use strict";r(109)("trimLeft",function(e){return function(){return e(this,1)}},"trimStart")},function(e,t,r){"use strict";r(109)("trimRight",function(e){return function(){return e(this,2)}},"trimEnd")},function(e,t,r){"use strict";r(234)("asyncIterator")},function(e,t,r){"use strict";r(234)("observable")},function(e,t,r){"use strict";var a=r(1);a(a.S,"System",{global:r(6)})},function(e,t,r){"use strict";r(156)("WeakMap")},function(e,t,r){"use strict";r(157)("WeakMap")},function(e,t,r){"use strict";r(156)("WeakSet")},function(e,t,r){"use strict";r(157)("WeakSet")},function(e,t,r){"use strict";for(var a=r(236),n=r(84),o=r(31),i=r(6),l=r(30),s=r(107),u=r(13),h=u("iterator"),c=u("toStringTag"),d=s.Array,m={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},p=n(m),f=0;f<p.length;f++){var v,y=p[f],g=m[y],_=i[y],T=_&&_.prototype;if(T&&(T[h]||l(T,h,d),T[c]||l(T,c,y),s[y]=d,g))for(v in a)T[v]||o(T,v,a[v],!0)}},function(e,t,r){"use strict";var a=r(1),n=r(232);a(a.G+a.B,{setImmediate:n.set,clearImmediate:n.clear})},function(e,t,r){"use strict";var a=r(6),n=r(1),o=r(161),i=[].slice,l=/MSIE .\./.test(o),s=function(e){return function(t,r){var a=arguments.length>2,n=!!a&&i.call(arguments,2);return e(a?function(){("function"==typeof t?t:Function(t)).apply(this,n)}:t,r)}};n(n.G+n.B+n.F*l,{setTimeout:s(a.setTimeout),setInterval:s(a.setInterval)})},function(e,t,r){"use strict";r(649),r(588),r(590),r(589),r(592),r(594),r(599),r(593),r(591),r(601),r(600),r(596),r(597),r(595),r(587),r(598),r(602),r(603),r(555),r(557),r(556),r(605),r(604),r(575),r(585),r(586),r(576),r(577),r(578),r(579),r(580),r(581),r(582),r(583),r(584),r(558),r(559),r(560),r(561),r(562),r(563),r(564),r(565),r(566),r(567),r(568),r(569),r(570),r(571),r(572),r(573),r(574),r(636),r(641),r(648),r(639),r(631),r(632),r(637),r(642),r(644),r(627),r(628),r(629),r(630),r(633),r(634),r(635),r(638),r(640),r(643),r(645),r(646),r(647),r(550),r(552),r(551),r(554),r(553),r(539),r(537),r(543),r(540),r(546),r(548),r(536),r(542),r(533),r(547),r(531),r(545),r(544),r(538),r(541),r(530),r(532),r(535),r(534),r(549),r(236),r(621),r(626),r(324),r(622),r(623),r(624),r(625),r(606),r(323),r(325),r(326),r(661),r(650),r(651),r(656),r(659),r(660),r(654),r(657),r(655),r(658),r(652),r(653),r(607),r(608),r(609),r(610),r(611),r(614),r(612),r(613),r(615),r(616),r(617),r(618),r(620),r(619),r(664),r(662),r(663),r(705),r(708),r(707),r(709),r(710),r(706),r(711),r(712),r(686),r(689),r(685),r(683),r(684),r(687),r(688),r(670),r(704),r(669),r(703),r(715),r(717),r(668),r(702),r(714),r(716),r(667),r(713),r(666),r(671),r(672),r(673),r(674),r(675),r(677),r(676),r(678),r(679),r(680),r(682),r(681),r(691),r(692),r(693),r(694),r(696),r(695),r(698),r(697),r(699),r(700),r(701),r(665),r(690),r(720),r(719),r(718),e.exports=r(42)},function(e,t,r){"use strict";function a(e){return e}function n(e,t,r){function n(e,t){var r=_.hasOwnProperty(t)?_[t]:null;b.hasOwnProperty(t)&&s("OVERRIDE_BASE"===r,"ReactClassInterface: You are attempting to override `%s` from your class specification. Ensure that your method names do not overlap with React methods.",t),e&&s("DEFINE_MANY"===r||"DEFINE_MANY_MERGED"===r,"ReactClassInterface: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.",t)}function h(e,r){if(r){s("function"!=typeof r,"ReactClass: You're attempting to use a component class or function as a mixin. Instead, just use a regular object."),s(!t(r),"ReactClass: You're attempting to use a component as a mixin. Instead, just use a regular object.");var a=e.prototype,o=a.__reactAutoBindPairs;r.hasOwnProperty(u)&&x.mixins(e,r.mixins);for(var i in r)if(r.hasOwnProperty(i)&&i!==u){var l=r[i],h=a.hasOwnProperty(i);if(n(h,i),x.hasOwnProperty(i))x[i](e,l);else{var c=_.hasOwnProperty(i),d="function"==typeof l,f=d&&!c&&!h&&!1!==r.autobind;if(f)o.push(i,l),a[i]=l;else if(h){var v=_[i];s(c&&("DEFINE_MANY_MERGED"===v||"DEFINE_MANY"===v),"ReactClass: Unexpected spec policy %s for key %s when mixing in component specs.",v,i),"DEFINE_MANY_MERGED"===v?a[i]=m(a[i],l):"DEFINE_MANY"===v&&(a[i]=p(a[i],l))}else a[i]=l}}}}function c(e,t){if(t)for(var r in t){var a=t[r];if(t.hasOwnProperty(r)){var n=r in x;s(!n,'ReactClass: You are attempting to define a reserved property, `%s`, that shouldn\'t be on the "statics" key. Define it as an instance property instead; it will still be accessible on the constructor.',r);var o=r in e;if(o){var i=T.hasOwnProperty(r)?T[r]:null;return s("DEFINE_MANY_MERGED"===i,"ReactClass: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.",r),void(e[r]=m(e[r],a))}e[r]=a}}}function d(e,t){s(e&&t&&"object"===(void 0===e?"undefined":o(e))&&"object"===(void 0===t?"undefined":o(t)),"mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.");for(var r in t)t.hasOwnProperty(r)&&(s(void 0===e[r],"mergeIntoWithNoDuplicateKeys(): Tried to merge two objects with the same key: `%s`. This conflict may be due to a mixin; in particular, this may be caused by two getInitialState() or getDefaultProps() methods returning objects with clashing keys.",r),e[r]=t[r]);return e}function m(e,t){return function(){var r=e.apply(this,arguments),a=t.apply(this,arguments);if(null==r)return a;if(null==a)return r;var n={};return d(n,r),d(n,a),n}}function p(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}function f(e,t){return t.bind(e)}function v(e){for(var t=e.__reactAutoBindPairs,r=0;r<t.length;r+=2){var a=t[r],n=t[r+1];e[a]=f(e,n)}}function y(e){var t=a(function(e,a,n){this.__reactAutoBindPairs.length&&v(this),this.props=e,this.context=a,this.refs=l,this.updater=n||r,this.state=null;var i=this.getInitialState?this.getInitialState():null;s("object"===(void 0===i?"undefined":o(i))&&!Array.isArray(i),"%s.getInitialState(): must return an object or null",t.displayName||"ReactCompositeComponent"),this.state=i});t.prototype=new L,t.prototype.constructor=t,t.prototype.__reactAutoBindPairs=[],g.forEach(h.bind(null,t)),h(t,w),h(t,e),h(t,N),t.getDefaultProps&&(t.defaultProps=t.getDefaultProps()),s(t.prototype.render,"createClass(...): Class specification must implement a `render` method.");for(var n in _)t.prototype[n]||(t.prototype[n]=null);return t}var g=[],_={mixins:"DEFINE_MANY",statics:"DEFINE_MANY",propTypes:"DEFINE_MANY",contextTypes:"DEFINE_MANY",childContextTypes:"DEFINE_MANY",getDefaultProps:"DEFINE_MANY_MERGED",getInitialState:"DEFINE_MANY_MERGED",getChildContext:"DEFINE_MANY_MERGED",render:"DEFINE_ONCE",componentWillMount:"DEFINE_MANY",componentDidMount:"DEFINE_MANY",componentWillReceiveProps:"DEFINE_MANY",shouldComponentUpdate:"DEFINE_ONCE",componentWillUpdate:"DEFINE_MANY",componentDidUpdate:"DEFINE_MANY",componentWillUnmount:"DEFINE_MANY",UNSAFE_componentWillMount:"DEFINE_MANY",UNSAFE_componentWillReceiveProps:"DEFINE_MANY",UNSAFE_componentWillUpdate:"DEFINE_MANY",updateComponent:"OVERRIDE_BASE"},T={getDerivedStateFromProps:"DEFINE_MANY_MERGED"},x={displayName:function(e,t){e.displayName=t},mixins:function(e,t){if(t)for(var r=0;r<t.length;r++)h(e,t[r])},childContextTypes:function(e,t){e.childContextTypes=i({},e.childContextTypes,t)},contextTypes:function(e,t){e.contextTypes=i({},e.contextTypes,t)},getDefaultProps:function(e,t){e.getDefaultProps?e.getDefaultProps=m(e.getDefaultProps,t):e.getDefaultProps=t},propTypes:function(e,t){e.propTypes=i({},e.propTypes,t)},statics:function(e,t){c(e,t)},autobind:function(){}},w={componentDidMount:function(){this.__isMounted=!0}},N={componentWillUnmount:function(){this.__isMounted=!1}},b={replaceState:function(e,t){this.updater.enqueueReplaceState(this,e,t)},isMounted:function(){return!!this.__isMounted}},L=function(){};return i(L.prototype,e.prototype,b),y}var o="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},i=r(186),l=r(978),s=r(979),u="mixins";e.exports=n},function(e,t,r){"use strict";function a(e,t,r){e.addEventListener(t,r,!1)}function n(e,t,r){e.removeEventListener(t,r,!1)}Object.defineProperty(t,"__esModule",{value:!0});var o={transitionend:{transition:"transitionend",WebkitTransition:"webkitTransitionEnd",MozTransition:"mozTransitionEnd",OTransition:"oTransitionEnd",msTransition:"MSTransitionEnd"},animationend:{animation:"animationend",WebkitAnimation:"webkitAnimationEnd",MozAnimation:"mozAnimationEnd",OAnimation:"oAnimationEnd",msAnimation:"MSAnimationEnd"}},i=[];"undefined"!=typeof window&&"undefined"!=typeof document&&function(){var e=document.createElement("div"),t=e.style;"AnimationEvent"in window||delete o.animationend.animation,"TransitionEvent"in window||delete o.transitionend.transition;for(var r in o)if(o.hasOwnProperty(r)){var a=o[r];for(var n in a)if(n in t){i.push(a[n]);break}}}();var l={addEndEventListener:function(e,t){if(0===i.length)return void window.setTimeout(t,0);i.forEach(function(r){a(e,r,t)})},endEvents:i,removeEndEventListener:function(e,t){0!==i.length&&i.forEach(function(r){n(e,r,t)})}};t.default=l,e.exports=t.default},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function n(e,t){for(var r=window.getComputedStyle(e,null),a="",n=0;n<f.length&&!(a=r.getPropertyValue(f[n]+t));n++);return a}function o(e){if(m){var t=parseFloat(n(e,"transition-delay"))||0,r=parseFloat(n(e,"transition-duration"))||0,a=parseFloat(n(e,"animation-delay"))||0,o=parseFloat(n(e,"animation-duration"))||0,i=Math.max(r+t,o+a);e.rcEndAnimTimeout=setTimeout(function(){e.rcEndAnimTimeout=null,e.rcEndListener&&e.rcEndListener()},1e3*i+200)}}function i(e){e.rcEndAnimTimeout&&(clearTimeout(e.rcEndAnimTimeout),e.rcEndAnimTimeout=null)}Object.defineProperty(t,"__esModule",{value:!0}),t.isCssAnimationSupported=void 0;var l=r(196),s=a(l),u=r(723),h=a(u),c=r(480),d=a(c),m=0!==h.default.endEvents.length,p=["Webkit","Moz","O","ms"],f=["-webkit-","-moz-","-o-","ms-",""],v=function(e,t,r){var a="object"===(void 0===t?"undefined":(0,s.default)(t)),n=a?t.name:t,l=a?t.active:t+"-active",u=r,c=void 0,m=void 0,p=(0,d.default)(e);return r&&"[object Object]"===Object.prototype.toString.call(r)&&(u=r.end,c=r.start,m=r.active),e.rcEndListener&&e.rcEndListener(),e.rcEndListener=function(t){t&&t.target!==e||(e.rcAnimTimeout&&(clearTimeout(e.rcAnimTimeout),e.rcAnimTimeout=null),i(e),p.remove(n),p.remove(l),h.default.removeEndEventListener(e,e.rcEndListener),e.rcEndListener=null,u&&u())},h.default.addEndEventListener(e,e.rcEndListener),c&&c(),p.add(n),e.rcAnimTimeout=setTimeout(function(){e.rcAnimTimeout=null,p.add(l),m&&setTimeout(m,0),o(e)},30),{stop:function(){e.rcEndListener&&e.rcEndListener()}}};v.style=function(e,t,r){e.rcEndListener&&e.rcEndListener(),e.rcEndListener=function(t){t&&t.target!==e||(e.rcAnimTimeout&&(clearTimeout(e.rcAnimTimeout),e.rcAnimTimeout=null),i(e),h.default.removeEndEventListener(e,e.rcEndListener),e.rcEndListener=null,r&&r())},h.default.addEndEventListener(e,e.rcEndListener),e.rcAnimTimeout=setTimeout(function(){for(var r in t)t.hasOwnProperty(r)&&(e.style[r]=t[r]);e.rcAnimTimeout=null,o(e)},0)},v.setTransition=function(e,t,r){var a=t,n=r;void 0===r&&(n=a,a=""),a=a||"",p.forEach(function(t){e.style[t+"Transition"+a]=n})},v.isCssAnimationSupported=m,t.isCssAnimationSupported=m,t.default=v},function(e,t,r){"use strict";function a(){this._key="chai/deep-eql__"+Math.random()+Date.now()}/*! + * Check to see if the MemoizeMap has recorded a result of the two operands + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {MemoizeMap} memoizeMap + * @returns {Boolean|null} result +*/ +function n(e,t,r){if(!r||T(e)||T(t))return null;var a=r.get(e);if(a){var n=a.get(t);if("boolean"==typeof n)return n}return null}/*! + * Set the result of the equality into the MemoizeMap + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {MemoizeMap} memoizeMap + * @param {Boolean} result +*/ +function o(e,t,r,a){if(r&&!T(e)&&!T(t)){var n=r.get(e);n?n.set(t,a):(n=new N,n.set(t,a),r.set(e,n))}}function i(e,t,r){if(r&&r.comparator)return s(e,t,r);var a=l(e,t);return null!==a?a:s(e,t,r)}function l(e,t){return e===t?0!==e||1/e==1/t:e!==e&&t!==t||!T(e)&&!T(t)&&null}/*! + * The main logic of the `deepEqual` function. + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {Object} [options] (optional) Additional options + * @param {Array} [options.comparator] (optional) Override default algorithm, determining custom equality. + * @param {Array} [options.memoize] (optional) Provide a custom memoization object which will cache the results of + complex objects for a speed boost. By passing `false` you can disable memoization, but this will cause circular + references to blow the stack. + * @return {Boolean} equal match +*/ +function s(e,t,r){r=r||{},r.memoize=!1!==r.memoize&&(r.memoize||new N);var a=r&&r.comparator,i=n(e,t,r.memoize);if(null!==i)return i;var s=n(t,e,r.memoize);if(null!==s)return s;if(a){var h=a(e,t);if(!1===h||!0===h)return o(e,t,r.memoize,h),h;var c=l(e,t);if(null!==c)return c}var d=w(e);if(d!==w(t))return o(e,t,r.memoize,!1),!1;o(e,t,r.memoize,!0);var m=u(e,t,d,r);return o(e,t,r.memoize,m),m}function u(e,t,r,a){switch(r){case"String":case"Number":case"Boolean":case"Date":return i(e.valueOf(),t.valueOf());case"Promise":case"Symbol":case"function":case"WeakMap":case"WeakSet":case"Error":return e===t;case"Arguments":case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"Array":return d(e,t,a);case"RegExp":return h(e,t);case"Generator":return m(e,t,a);case"DataView":return d(new Uint8Array(e.buffer),new Uint8Array(t.buffer),a);case"ArrayBuffer":return d(new Uint8Array(e),new Uint8Array(t),a);case"Set":case"Map":return c(e,t,a);default:return _(e,t,a)}}/*! + * Compare two Regular Expressions for equality. + * + * @param {RegExp} leftHandOperand + * @param {RegExp} rightHandOperand + * @return {Boolean} result + */ +function h(e,t){return e.toString()===t.toString()}/*! + * Compare two Sets/Maps for equality. Faster than other equality functions. + * + * @param {Set} leftHandOperand + * @param {Set} rightHandOperand + * @param {Object} [options] (Optional) + * @return {Boolean} result + */ +function c(e,t,r){if(e.size!==t.size)return!1;if(0===e.size)return!0;var a=[],n=[];return e.forEach(function(e,t){a.push([e,t])}),t.forEach(function(e,t){n.push([e,t])}),d(a.sort(),n.sort(),r)}/*! + * Simple equality for flat iterable objects such as Arrays, TypedArrays or Node.js buffers. + * + * @param {Iterable} leftHandOperand + * @param {Iterable} rightHandOperand + * @param {Object} [options] (Optional) + * @return {Boolean} result + */ +function d(e,t,r){var a=e.length;if(a!==t.length)return!1;if(0===a)return!0;for(var n=-1;++n<a;)if(!1===i(e[n],t[n],r))return!1;return!0}/*! + * Simple equality for generator objects such as those returned by generator functions. + * + * @param {Iterable} leftHandOperand + * @param {Iterable} rightHandOperand + * @param {Object} [options] (Optional) + * @return {Boolean} result + */ +function m(e,t,r){return d(v(e),v(t),r)}/*! + * Determine if the given object has an @@iterator function. + * + * @param {Object} target + * @return {Boolean} `true` if the object has an @@iterator function. + */ +function p(e){return"undefined"!=typeof Symbol&&"object"===(void 0===e?"undefined":x(e))&&void 0!==Symbol.iterator&&"function"==typeof e[Symbol.iterator]}/*! + * Gets all iterator entries from the given Object. If the Object has no @@iterator function, returns an empty array. + * This will consume the iterator - which could have side effects depending on the @@iterator implementation. + * + * @param {Object} target + * @returns {Array} an array of entries from the @@iterator function + */ +function f(e){if(p(e))try{return v(e[Symbol.iterator]())}catch(e){return[]}return[]}/*! + * Gets all entries from a Generator. This will consume the generator - which could have side effects. + * + * @param {Generator} target + * @returns {Array} an array of entries from the Generator. + */ +function v(e){for(var t=e.next(),r=[t.value];!1===t.done;)t=e.next(),r.push(t.value);return r}/*! + * Gets all own and inherited enumerable keys from a target. + * + * @param {Object} target + * @returns {Array} an array of own and inherited enumerable keys from the target. + */ +function y(e){var t=[];for(var r in e)t.push(r);return t}/*! + * Determines if two objects have matching values, given a set of keys. Defers to deepEqual for the equality check of + * each key. If any value of the given key is not equal, the function will return false (early). + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {Array} keys An array of keys to compare the values of leftHandOperand and rightHandOperand against + * @param {Object} [options] (Optional) + * @return {Boolean} result + */ +function g(e,t,r,a){var n=r.length;if(0===n)return!0;for(var o=0;o<n;o+=1)if(!1===i(e[r[o]],t[r[o]],a))return!1;return!0}/*! + * Recursively check the equality of two Objects. Once basic sameness has been established it will defer to `deepEqual` + * for each enumerable key in the object. + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {Object} [options] (Optional) + * @return {Boolean} result + */ +function _(e,t,r){var a=y(e),n=y(t);if(a.length&&a.length===n.length)return a.sort(),n.sort(),!1!==d(a,n)&&g(e,t,a,r);var o=f(e),i=f(t);return o.length&&o.length===i.length?(o.sort(),i.sort(),d(o,i,r)):0===a.length&&0===o.length&&0===n.length&&0===i.length}/*! + * Returns true if the argument is a primitive. + * + * This intentionally returns true for all objects that can be compared by reference, + * including functions and symbols. + * + * @param {Mixed} value + * @return {Boolean} result + */ +function T(e){return null===e||"object"!==(void 0===e?"undefined":x(e))}/*! + * deep-eql + * Copyright(c) 2013 Jake Luer <jake@alogicalparadox.com> + * MIT Licensed + */ +var x="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},w=r(1188);a.prototype={get:function(e){return e[this._key]},set:function(e,t){Object.isExtensible(e)&&Object.defineProperty(e,this._key,{value:t,configurable:!0})}};var N="function"==typeof WeakMap?WeakMap:a;/*! + * Primary Export + */ +e.exports=i,e.exports.MemoizeMap=N},function(e,t,r){"use strict";function a(e){n.each(o,function(t){this[t]=n.bind(e[t],e)},this)}var n=r(0),o=["getDom","getZr","getWidth","getHeight","getDevicePixelRatio","dispatchAction","isDisposed","on","off","getDataURL","getConnectedDataURL","getModel","getOption","getViewOfComponentModel","getViewOfSeriesModel"],i=a;e.exports=i},function(e,t,r){"use strict";var a=r(2),n=r(0),o=r(249);r(247),r(728),r(729),r(133),a.registerLayout(n.curry(o,"bar")),a.registerVisual(function(e){e.eachSeriesByType("bar",function(e){e.getData().setVisual("legendSymbol","roundRect")})})},function(e,t,r){"use strict";var a=r(330),n=a.extend({type:"series.bar",dependencies:["grid","polar"],brushSelector:"rect"});e.exports=n},function(e,t,r){"use strict";function a(e,t,r){r.style.text=null,h.updateProps(r,{shape:{width:0}},t,e,function(){r.parent&&r.parent.remove(r)})}function n(e,t,r){r.style.text=null,h.updateProps(r,{shape:{r:r.shape.r0}},t,e,function(){r.parent&&r.parent.remove(r)})}function o(e,t,r,a,n,o,i,l){var s=t.getItemVisual(r,"color"),c=t.getItemVisual(r,"opacity"),m=a.getModel("itemStyle.normal"),p=a.getModel("itemStyle.emphasis").getBarItemStyle();l||e.setShape("r",m.get("barBorderRadius")||0),e.useStyle(u.defaults({fill:s,opacity:c},m.getBarItemStyle()));var f=a.getShallow("cursor");f&&e.attr("cursor",f);var v=i?n.height>0?"bottom":"top":n.width>0?"left":"right";l||d(e.style,p,a,s,o,r,v),h.setHoverStyle(e,p)}function i(e,t){var r=e.get(f)||0;return Math.min(r,Math.abs(t.width),Math.abs(t.height))}var l=r(9),s=(l.__DEV__,r(2)),u=r(0),h=r(3),c=r(331),d=c.setLabel,m=r(20),p=r(732),f=["itemStyle","normal","barBorderWidth"];u.extend(m.prototype,p);var v=s.extendChartView({type:"bar",render:function(e,t,r){var a=e.get("coordinateSystem");return"cartesian2d"!==a&&"polar"!==a||this._render(e,t,r),this.group},dispose:u.noop,_render:function(e,t,r){var i,l=this.group,s=e.getData(),u=this._data,c=e.coordinateSystem,d=c.getBaseAxis();"cartesian2d"===c.type?i=d.isHorizontal():"polar"===c.type&&(i="angle"===d.dim);var m=e.isAnimationEnabled()?e:null;s.diff(u).add(function(t){if(s.hasValue(t)){var r=s.getItemModel(t),a=g[c.type](s,t,r),n=y[c.type](s,t,r,a,i,m);s.setItemGraphicEl(t,n),l.add(n),o(n,s,t,r,a,e,i,"polar"===c.type)}}).update(function(t,r){var a=u.getItemGraphicEl(r);if(!s.hasValue(t))return void l.remove(a);var n=s.getItemModel(t),d=g[c.type](s,t,n);a?h.updateProps(a,{shape:d},m,t):a=y[c.type](s,t,n,d,i,m,!0),s.setItemGraphicEl(t,a),l.add(a),o(a,s,t,n,d,e,i,"polar"===c.type)}).remove(function(e){var t=u.getItemGraphicEl(e);"cartesian2d"===c.type?t&&a(e,m,t):t&&n(e,m,t)}).execute(),this._data=s},remove:function(e,t){var r=this.group,o=this._data;e.get("animation")?o&&o.eachItemGraphicEl(function(t){"sector"===t.type?n(t.dataIndex,e,t):a(t.dataIndex,e,t)}):r.removeAll()}}),y={cartesian2d:function(e,t,r,a,n,o,i){var l=new h.Rect({shape:u.extend({},a)});if(o){var s=l.shape,c=n?"height":"width",d={};s[c]=0,d[c]=a[c],h[i?"updateProps":"initProps"](l,{shape:d},o,t)}return l},polar:function(e,t,r,a,n,o,i){var l=new h.Sector({shape:u.extend({},a)});if(o){var s=l.shape,c=n?"r":"endAngle",d={};s[c]=n?0:a.startAngle,d[c]=a[c],h[i?"updateProps":"initProps"](l,{shape:d},o,t)}return l}},g={cartesian2d:function(e,t,r){var a=e.getItemLayout(t),n=i(r,a),o=a.width>0?1:-1,l=a.height>0?1:-1;return{x:a.x+o*n/2,y:a.y+l*n/2,width:a.width-o*n,height:a.height-l*n}},polar:function(e,t,r){var a=e.getItemLayout(t);return{cx:a.cx,cy:a.cy,r0:a.r0,r:a.r,startAngle:a.startAngle,endAngle:a.endAngle}}};e.exports=v},function(e,t,r){"use strict";var a=r(330),n=a.extend({type:"series.pictorialBar",dependencies:["grid"],defaultOption:{symbol:"circle",symbolSize:null,symbolRotate:null,symbolPosition:null,symbolOffset:null,symbolMargin:null,symbolRepeat:!1,symbolRepeatDirection:"end",symbolClip:!1,symbolBoundingData:null,symbolPatternSize:400,barGap:"-100%",progressive:0,hoverAnimation:!1},getInitialData:function(e){return e.stack=null,n.superApply(this,"getInitialData",arguments)}}),o=n;e.exports=o},function(e,t,r){"use strict";function a(e,t,r,a){var o=e.getItemLayout(t),u=r.get("symbolRepeat"),h=r.get("symbolClip"),c=r.get("symbolPosition")||"start",d=r.get("symbolRotate"),m=(d||0)*Math.PI/180||0,p=r.get("symbolPatternSize")||2,f=r.isAnimationEnabled(),v={dataIndex:t,layout:o,itemModel:r,symbolType:e.getItemVisual(t,"symbol")||"circle",color:e.getItemVisual(t,"color"),symbolClip:h,symbolRepeat:u,symbolRepeatDirection:r.get("symbolRepeatDirection"),symbolPatternSize:p,rotation:m,animationModel:f?r:null,hoverAnimation:f&&r.get("hoverAnimation"),z2:r.getShallow("z",!0)||0};n(r,u,o,a,v),i(e,t,o,u,h,v.boundingLength,v.pxSign,p,a,v),l(r,v.symbolScale,m,a,v);var y=v.symbolSize,g=r.get("symbolOffset");return k.isArray(g)&&(g=[z(g[0],y[0]),z(g[1],y[1])]),s(r,y,o,u,h,g,c,v.valueLineWidth,v.boundingLength,v.repeatCutLength,a,v),v}function n(e,t,r,a,n){var i,l=a.valueDim,s=e.get("symbolBoundingData"),u=a.coordSys.getOtherAxis(a.coordSys.getBaseAxis()),h=u.toGlobalCoord(u.dataToCoord(0)),c=1-+(r[l.wh]<=0);if(k.isArray(s)){var d=[o(u,s[0])-h,o(u,s[1])-h];d[1]<d[0]&&d.reverse(),i=d[c]}else i=null!=s?o(u,s)-h:t?a.coordSysExtent[l.index][c]-h:r[l.wh];n.boundingLength=i,t&&(n.repeatCutLength=r[l.wh]),n.pxSign=i>0?1:i<0?-1:0}function o(e,t){return e.toGlobalCoord(e.dataToCoord(e.scale.parse(t)))}function i(e,t,r,a,n,o,i,l,s,u){var h=s.valueDim,c=s.categoryDim,d=Math.abs(r[c.wh]),m=e.getItemVisual(t,"symbolSize");k.isArray(m)?m=m.slice():(null==m&&(m="100%"),m=[m,m]),m[c.index]=z(m[c.index],d),m[h.index]=z(m[h.index],a?d:Math.abs(o)),u.symbolSize=m,(u.symbolScale=[m[0]/l,m[1]/l])[h.index]*=(s.isHorizontal?-1:1)*i}function l(e,t,r,a,n){var o=e.get(P)||0;o&&(F.attr({scale:t.slice(),rotation:r}),F.updateTransform(),o/=F.getLineScale(),o*=t[a.valueDim.index]),n.valueLineWidth=o}function s(e,t,r,a,n,o,i,l,s,u,h,c){var d=h.categoryDim,m=h.valueDim,p=c.pxSign,f=Math.max(t[m.index]+l,0),v=f;if(a){var y=Math.abs(s),g=k.retrieve(e.get("symbolMargin"),"15%")+"",_=!1;g.lastIndexOf("!")===g.length-1&&(_=!0,g=g.slice(0,g.length-1)),g=z(g,t[m.index]);var T=Math.max(f+2*g,0),x=_?0:2*g,w=C(a),N=w?a:L((y+x)/T);g=(y-N*f)/2/(_?N:N-1),T=f+2*g,x=_?0:2*g,w||"fixed"===a||(N=u?L((Math.abs(u)+x)/T):0),v=N*T-x,c.repeatTimes=N,c.symbolMargin=g}var b=p*(v/2),S=c.pathPosition=[];S[d.index]=r[d.wh]/2,S[m.index]="start"===i?b:"end"===i?s-b:s/2,o&&(S[0]+=o[0],S[1]+=o[1]);var D=c.bundlePosition=[];D[d.index]=r[d.xy],D[m.index]=r[m.xy];var M=c.barRectShape=k.extend({},r);M[m.wh]=p*Math.max(Math.abs(r[m.wh]),Math.abs(S[m.index]+b)),M[d.wh]=r[d.wh];var A=c.clipShape={};A[d.xy]=-r[d.xy],A[d.wh]=h.ecSize[d.wh],A[m.xy]=0,A[m.wh]=r[m.wh]}function u(e){var t=e.symbolPatternSize,r=A(e.symbolType,-t/2,-t/2,t,t,e.color);return r.attr({culling:!0}),"image"!==r.type&&r.setStyle({strokeNoScale:!0}),r}function h(e,t,r,a){function n(e){var t=c.slice(),a=r.pxSign,n=e;return("start"===r.symbolRepeatDirection?a>0:a<0)&&(n=m-1-e),t[d.index]=f*(n-m/2+.5)+c[d.index],{position:t,scale:r.symbolScale.slice(),rotation:r.rotation}}function o(){w(e,function(e){e.trigger("emphasis")})}function i(){w(e,function(e){e.trigger("normal")})}var l=e.__pictorialBundle,s=r.symbolSize,h=r.valueLineWidth,c=r.pathPosition,d=t.valueDim,m=r.repeatTimes||0,p=0,f=s[t.valueDim.index]+h+2*r.symbolMargin;for(w(e,function(e){e.__pictorialAnimationIndex=p,e.__pictorialRepeatTimes=m,p<m?N(e,null,n(p),r,a):N(e,null,{scale:[0,0]},r,a,function(){l.remove(e)}),y(e,r),p++});p<m;p++){var v=u(r);v.__pictorialAnimationIndex=p,v.__pictorialRepeatTimes=m,l.add(v);var g=n(p);N(v,{position:g.position,scale:[0,0]},{scale:g.scale,rotation:g.rotation},r,a),v.on("mouseover",o).on("mouseout",i),y(v,r)}}function c(e,t,r,a){function n(){this.trigger("emphasis")}function o(){this.trigger("normal")}var i=e.__pictorialBundle,l=e.__pictorialMainPath;l?N(l,null,{position:r.pathPosition.slice(),scale:r.symbolScale.slice(),rotation:r.rotation},r,a):(l=e.__pictorialMainPath=u(r),i.add(l),N(l,{position:r.pathPosition.slice(),scale:[0,0],rotation:r.rotation},{scale:r.symbolScale.slice()},r,a),l.on("mouseover",n).on("mouseout",o)),y(l,r)}function d(e,t,r){var a=k.extend({},t.barRectShape),n=e.__pictorialBarRect;n?N(n,null,{shape:a},t,r):(n=e.__pictorialBarRect=new D.Rect({z2:2,shape:a,silent:!0,style:{stroke:"transparent",fill:"transparent",lineWidth:0}}),e.add(n))}function m(e,t,r,a){if(r.symbolClip){var n=e.__pictorialClipPath,o=k.extend({},r.clipShape),i=t.valueDim,l=r.animationModel,s=r.dataIndex;if(n)D.updateProps(n,{shape:o},l,s);else{o[i.wh]=0,n=new D.Rect({shape:o}),e.__pictorialBundle.setClipPath(n),e.__pictorialClipPath=n;var u={};u[i.wh]=r.clipShape[i.wh],D[a?"updateProps":"initProps"](n,{shape:u},l,s)}}}function p(e,t){var r=e.getItemModel(t);return r.getAnimationDelayParams=f,r.isAnimationEnabled=v,r}function f(e){return{index:e.__pictorialAnimationIndex,count:e.__pictorialRepeatTimes}}function v(){return this.parentModel.isAnimationEnabled()&&!!this.getShallow("animation")}function y(e,t){e.off("emphasis").off("normal");var r=t.symbolScale.slice();t.hoverAnimation&&e.on("emphasis",function(){this.animateTo({scale:[1.1*r[0],1.1*r[1]]},400,"elasticOut")}).on("normal",function(){this.animateTo({scale:r.slice()},400,"elasticOut")})}function g(e,t,r,a){var n=new D.Group,o=new D.Group;return n.add(o),n.__pictorialBundle=o,o.attr("position",r.bundlePosition.slice()),r.symbolRepeat?h(n,t,r):c(n,t,r),d(n,r,a),m(n,t,r,a),n.__pictorialShapeStr=x(e,r),n.__pictorialSymbolMeta=r,n}function _(e,t,r){var a=r.animationModel,n=r.dataIndex,o=e.__pictorialBundle;D.updateProps(o,{position:r.bundlePosition.slice()},a,n),r.symbolRepeat?h(e,t,r,!0):c(e,t,r,!0),d(e,r,!0),m(e,t,r,!0)}function T(e,t,r,a){var n=a.__pictorialBarRect;n&&(n.style.text=null);var o=[];w(a,function(e){o.push(e)}),a.__pictorialMainPath&&o.push(a.__pictorialMainPath),a.__pictorialClipPath&&(r=null),k.each(o,function(e){D.updateProps(e,{scale:[0,0]},r,t,function(){a.parent&&a.parent.remove(a)})}),e.setItemGraphicEl(t,null)}function x(e,t){return[e.getItemVisual(t.dataIndex,"symbol")||"none",!!t.symbolRepeat,!!t.symbolClip].join(":")}function w(e,t,r){k.each(e.__pictorialBundle.children(),function(a){a!==e.__pictorialBarRect&&t.call(r,a)})}function N(e,t,r,a,n,o){t&&e.attr(t),a.symbolClip&&!n?r&&e.attr(r):r&&D[n?"updateProps":"initProps"](e,r,a.animationModel,a.dataIndex,o)}function b(e,t,r){var a=r.color,n=r.dataIndex,o=r.itemModel,i=o.getModel("itemStyle.normal").getItemStyle(["color"]),l=o.getModel("itemStyle.emphasis").getItemStyle(),s=o.getShallow("cursor");w(e,function(e){e.setColor(a),e.setStyle(k.defaults({fill:a,opacity:r.opacity},i)),D.setHoverStyle(e,l),s&&(e.cursor=s),e.z2=r.z2});var u={},h=t.valueDim.posDesc[+(r.boundingLength>0)],c=e.__pictorialBarRect;E(c.style,u,o,a,t.seriesModel,n,h),D.setHoverStyle(c,u)}function L(e){var t=Math.round(e);return Math.abs(e-t)<1e-4?t:Math.ceil(e)}var S=r(2),k=r(0),D=r(3),M=r(38),A=M.createSymbol,I=r(4),z=I.parsePercent,C=I.isNumeric,R=r(331),E=R.setLabel,P=["itemStyle","normal","borderWidth"],O=[{xy:"x",wh:"width",index:0,posDesc:["left","right"]},{xy:"y",wh:"height",index:1,posDesc:["top","bottom"]}],F=new D.Circle,j=S.extendChartView({type:"pictorialBar",render:function(e,t,r){var n=this.group,o=e.getData(),i=this._data,l=e.coordinateSystem,s=l.getBaseAxis(),u=!!s.isHorizontal(),h=l.grid.getRect(),c={ecSize:{width:r.getWidth(),height:r.getHeight()},seriesModel:e,coordSys:l,coordSysExtent:[[h.x,h.x+h.width],[h.y,h.y+h.height]],isHorizontal:u,valueDim:O[+u],categoryDim:O[1-u]};return o.diff(i).add(function(e){if(o.hasValue(e)){var t=p(o,e),r=a(o,e,t,c),i=g(o,c,r);o.setItemGraphicEl(e,i),n.add(i),b(i,c,r)}}).update(function(e,t){var r=i.getItemGraphicEl(t);if(!o.hasValue(e))return void n.remove(r);var l=p(o,e),s=a(o,e,l,c),u=x(o,s);r&&u!==r.__pictorialShapeStr&&(n.remove(r),o.setItemGraphicEl(e,null),r=null),r?_(r,c,s):r=g(o,c,s,!0),o.setItemGraphicEl(e,r),r.__pictorialSymbolMeta=s,n.add(r),b(r,c,s)}).remove(function(e){var t=i.getItemGraphicEl(e);t&&T(i,e,t.__pictorialSymbolMeta.animationModel,t)}).execute(),this._data=o,this.group},dispose:k.noop,remove:function(e,t){var r=this.group,a=this._data;e.get("animation")?a&&a.eachItemGraphicEl(function(t){T(a,t.dataIndex,e,t)}):r.removeAll()}}),B=j;e.exports=B},function(e,t,r){"use strict";var a=r(114),n=a([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["stroke","barBorderColor"],["lineWidth","barBorderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]),o={getBarItemStyle:function(e){var t=n(this,e);if(this.getBorderLineDash){var r=this.getBorderLineDash();r&&(t.lineDash=r)}return t}};e.exports=o},function(e,t,r){"use strict";var a=r(2);r(734),r(735);var n=r(737),o=r(736);a.registerVisual(n),a.registerLayout(o)},function(e,t,r){"use strict";var a=r(0),n=r(27),o=r(163),i=o.seriesModelMixin,l=n.extend({type:"series.boxplot",dependencies:["xAxis","yAxis","grid"],defaultValueDimensions:["min","Q1","median","Q3","max"],dimensions:null,defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,hoverAnimation:!0,layout:null,boxWidth:[7,50],itemStyle:{normal:{color:"#fff",borderWidth:1},emphasis:{borderWidth:2,shadowBlur:5,shadowOffsetX:2,shadowOffsetY:2,shadowColor:"rgba(0,0,0,0.4)"}},animationEasing:"elasticOut",animationDuration:800}});a.mixin(l,i,!0);var s=l;e.exports=s},function(e,t,r){"use strict";function a(e,t,r){var a=t.getItemModel(r),n=a.getModel(h),o=t.getItemVisual(r,"color"),l=n.getItemStyle(["borderColor"]),s=e.childAt(e.whiskerIndex);s.style.set(l),s.style.stroke=o,s.dirty();var u=e.childAt(e.bodyIndex);u.style.set(l),u.style.stroke=o,u.dirty();var d=a.getModel(c).getItemStyle();i.setHoverStyle(e,d)}var n=r(0),o=r(72),i=r(3),l=r(163),s=l.viewMixin,u=o.extend({type:"boxplot",getStyleUpdater:function(){return a},dispose:n.noop});n.mixin(u,s,!0);var h=["itemStyle","normal"],c=["itemStyle","emphasis"],d=u;e.exports=d},function(e,t,r){"use strict";function a(e){var t=n(e);h(t,function(e){var t=e.seriesModels;t.length&&(o(e),h(t,function(t,r){i(t,e.boxOffsetList[r],e.boxWidthList[r])}))})}function n(e){var t=[],r=[];return e.eachSeriesByType("boxplot",function(e){var a=e.getBaseAxis(),n=l.indexOf(r,a);n<0&&(n=r.length,r[n]=a,t[n]={axis:a,seriesModels:[]}),t[n].seriesModels.push(e)}),t}function o(e){var t,r,a=e.axis,n=e.seriesModels,o=n.length,i=e.boxWidthList=[],s=e.boxOffsetList=[],c=[];if("category"===a.type)r=a.getBandWidth();else{var d=0;h(n,function(e){d=Math.max(d,e.getData().count())}),t=a.getExtent(),Math.abs(t[1]-t[0])}h(n,function(e){var t=e.get("boxWidth");l.isArray(t)||(t=[t,t]),c.push([u(t[0],r)||0,u(t[1],r)||0])});var m=.8*r-2,p=m/o*.3,f=(m-p*(o-1))/o,v=f/2-m/2;h(n,function(e,t){s.push(v),v+=p+f,i.push(Math.min(Math.max(f,c[t][0]),c[t][1]))})}function i(e,t,r){var a,n=e.coordinateSystem,o=e.getData(),i=r/2,s=e.get("layout"),u="horizontal"===s?0:1,h=1-u,c=["x","y"],d=[];l.each(o.dimensions,function(e){var t=o.getDimensionInfo(e),r=t.coordDim;r===c[h]?d.push(e):r===c[u]&&(a=e)}),null==a||d.length<5||o.each([a].concat(d),function(){function e(e){var r=[];r[u]=c,r[h]=e;var a;return isNaN(c)||isNaN(e)?a=[NaN,NaN]:(a=n.dataToPoint(r),a[u]+=t),a}function r(e,t){var r=e.slice(),a=e.slice();r[u]+=i,a[u]-=i,t?g.push(r,a):g.push(a,r)}function a(e){var t=[e.slice(),e.slice()];t[0][u]-=i,t[1][u]+=i,y.push(t)}var l=arguments,c=l[0],m=l[d.length+1],p=e(l[3]),f=e(l[1]),v=e(l[5]),y=[[f,e(l[2])],[v,e(l[4])]];a(f),a(v),a(p);var g=[];r(y[0][1],0),r(y[1][1],1),o.setItemLayout(m,{chartLayout:s,initBaseline:p[h],median:p,bodyEnds:g,whiskerEnds:y})})}var l=r(0),s=r(4),u=s.parsePercent,h=l.each;e.exports=a},function(e,t,r){"use strict";function a(e,t){var r=e.get("color");e.eachRawSeriesByType("boxplot",function(t){var a=r[t.seriesIndex%r.length],o=t.getData();o.setVisual({legendSymbol:"roundRect",color:t.get(n)||a}),e.isSeriesFiltered(t)||o.each(function(e){var t=o.getItemModel(e);o.setItemVisual(e,{color:t.get(n,!0)})})})}var n=["itemStyle","normal","borderColor"];e.exports=a},function(e,t,r){"use strict";var a=r(2);r(739),r(740);var n=r(743),o=r(742),i=r(741);a.registerPreprocessor(n),a.registerVisual(o),a.registerLayout(i)},function(e,t,r){"use strict";var a=r(0),n=r(27),o=r(163),i=o.seriesModelMixin,l=n.extend({type:"series.candlestick",dependencies:["xAxis","yAxis","grid"],defaultValueDimensions:["open","close","lowest","highest"],dimensions:null,defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,hoverAnimation:!0,layout:null,itemStyle:{normal:{color:"#c23531",color0:"#314656",borderWidth:1,borderColor:"#c23531",borderColor0:"#314656"},emphasis:{borderWidth:2}},barMaxWidth:null,barMinWidth:null,barWidth:null,animationUpdate:!1,animationEasing:"linear",animationDuration:300},getShadowDim:function(){return"open"},brushSelector:function(e,t,r){var a=t.getItemLayout(e);return r.rect(a.brushRect)}});a.mixin(l,i,!0);var s=l;e.exports=s},function(e,t,r){"use strict";function a(e,t,r){var a=t.getItemModel(r),n=a.getModel(h),o=t.getItemVisual(r,"color"),l=t.getItemVisual(r,"borderColor")||o,s=n.getItemStyle(["color","color0","borderColor","borderColor0"]),u=e.childAt(e.whiskerIndex);u.useStyle(s),u.style.stroke=l;var d=e.childAt(e.bodyIndex);d.useStyle(s),d.style.fill=o,d.style.stroke=l;var m=a.getModel(c).getItemStyle();i.setHoverStyle(e,m)}var n=r(0),o=r(72),i=r(3),l=r(163),s=l.viewMixin,u=o.extend({type:"candlestick",getStyleUpdater:function(){return a},dispose:n.noop});n.mixin(u,s,!0);var h=["itemStyle","normal"],c=["itemStyle","emphasis"],d=u;e.exports=d},function(e,t,r){"use strict";function a(e){e.eachSeriesByType("candlestick",function(e){var t,r=e.coordinateSystem,a=e.getData(),i=n(e,a),l=e.get("layout"),s="horizontal"===l?0:1,h=1-s,c=["x","y"],d=[];if(o.each(a.dimensions,function(e){var r=a.getDimensionInfo(e),n=r.coordDim;n===c[h]?d.push(e):n===c[s]&&(t=e)}),!(null==t||d.length<4)){var m=0;a.each([t].concat(d),function(){function e(e){var t=[];return t[s]=c,t[h]=e,isNaN(c)||isNaN(e)?[NaN,NaN]:r.dataToPoint(t)}function t(e,t){var r=e.slice(),a=e.slice();r[s]=u(r[s]+i/2,1,!1),a[s]=u(a[s]-i/2,1,!0),t?S.push(r,a):S.push(a,r)}function n(e){return e[s]=u(e[s],1),e}var o=arguments,c=o[0],p=o[d.length+1],f=o[1],v=o[2],y=o[3],g=o[4],_=Math.min(f,v),T=Math.max(f,v),x=e(_),w=e(T),N=e(y),b=e(g),L=[[n(b),n(w)],[n(N),n(x)]],S=[];t(w,0),t(x,1);var k;k=f>v?-1:f<v?1:m>0?a.getItemModel(m-1).get()[2]<=v?1:-1:1,a.setItemLayout(p,{chartLayout:l,sign:k,initBaseline:f>v?w[h]:x[h],bodyEnds:S,whiskerEnds:L,brushRect:function(){var t=e(Math.min(f,v,y,g)),r=e(Math.max(f,v,y,g));return t[s]-=i/2,r[s]-=i/2,{x:t[0],y:t[1],width:h?i:r[0]-t[0],height:h?r[1]-t[1]:i}}()}),++m},!0)}})}function n(e,t){var r,a=e.getBaseAxis(),n="category"===a.type?a.getBandWidth():(r=a.getExtent(),Math.abs(r[1]-r[0])/t.count()),o=l(h(e.get("barMaxWidth"),n),n),i=l(h(e.get("barMinWidth"),1),n),s=e.get("barWidth");return null!=s?l(s,n):Math.max(Math.min(n/2,o),i)}var o=r(0),i=r(4),l=i.parsePercent,s=r(3),u=s.subPixelOptimize,h=o.retrieve2;e.exports=a},function(e,t,r){"use strict";function a(e,t){e.eachRawSeriesByType("candlestick",function(t){var r=t.getData();r.setVisual({legendSymbol:"roundRect"}),e.isSeriesFiltered(t)||r.each(function(e){var t=r.getItemModel(e),a=r.getItemLayout(e).sign;r.setItemVisual(e,{color:t.get(a>0?i:l),borderColor:t.get(a>0?n:o)})})})}var n=["itemStyle","normal","borderColor"],o=["itemStyle","normal","borderColor0"],i=["itemStyle","normal","color"],l=["itemStyle","normal","color0"];e.exports=a},function(e,t,r){"use strict";function a(e){e&&n.isArray(e.series)&&n.each(e.series,function(e){n.isObject(e)&&"k"===e.type&&(e.type="candlestick")})}var n=r(0);e.exports=a},function(e,t,r){"use strict";function a(e){var t,r=e.type;if("path"===r){var a=e.shape;t=y.makePath(a.pathData,null,{x:a.x||0,y:a.y||0,width:a.width||0,height:a.height||0},"center"),t.__customPathData=e.pathData}else if("image"===r)t=new y.Image({}),t.__customImagePath=e.style.image;else if("text"===r)t=new y.Text({}),t.__customText=e.style.text;else{var n=y[r.charAt(0).toUpperCase()+r.slice(1)];t=new n}return t.__customGraphicType=r,t.name=e.name,t}function n(e,t,r,a,n,i){var l={},s=r.style||{};if(r.shape&&(l.shape=v.clone(r.shape)),r.position&&(l.position=r.position.slice()),r.scale&&(l.scale=r.scale.slice()),r.origin&&(l.origin=r.origin.slice()),r.rotation&&(l.rotation=r.rotation),"image"===e.type&&r.style){var u=l.style={};v.each(["x","y","width","height"],function(t){o(t,u,s,e.style,i)})}if("text"===e.type&&r.style){var u=l.style={};v.each(["x","y"],function(t){o(t,u,s,e.style,i)}),!s.hasOwnProperty("textFill")&&s.fill&&(s.textFill=s.fill),!s.hasOwnProperty("textStroke")&&s.stroke&&(s.textStroke=s.stroke)}if("group"!==e.type&&(e.useStyle(s),i)){e.style.opacity=0;var h=s.opacity;null==h&&(h=1),y.initProps(e,{style:{opacity:h}},a,t)}i?e.attr(l):y.updateProps(e,l,a,t),e.attr({z2:r.z2||0,silent:r.silent}),!1!==r.styleEmphasis&&y.setHoverStyle(e,r.styleEmphasis)}function o(e,t,r,a,n){null==r[e]||n||(t[e]=r[e],r[e]=a[e])}function i(e,t,r,a){function n(e){null==e&&(e=g),z&&(T=t.getItemModel(e),w=T.getModel(A),N=T.getModel(I),b=_(t),L=t.getItemVisual(e,"color"),z=!1)}function o(e,r){return null==r&&(r=g),t.get(t.getDimension(e||0),r)}function i(r,a){null==a&&(a=g),n(a);var o=T.getModel(D).getItemStyle();null!=L&&(o.fill=L);var i=t.getItemVisual(a,"opacity");return null!=i&&(o.opacity=i),null!=b&&(y.setTextStyle(o,w,null,{autoColor:L,isRectText:!0}),o.text=w.getShallow("show")?v.retrieve2(e.getFormattedLabel(a,"normal"),t.get(b,a)):null),r&&v.extend(o,r),o}function s(r,a){null==a&&(a=g),n(a);var o=T.getModel(M).getItemStyle();return null!=b&&(y.setTextStyle(o,N,null,{isRectText:!0},!0),o.text=N.getShallow("show")?v.retrieve3(e.getFormattedLabel(a,"emphasis"),e.getFormattedLabel(a,"normal"),t.get(b,a)):null),r&&v.extend(o,r),o}function u(e,r){return null==r&&(r=g),t.getItemVisual(r,e)}function h(e){if(p.getBaseAxis){var t=p.getBaseAxis();return x.getLayoutOnAxis(v.defaults({axis:t},e),a)}}function c(){return r.getCurrentSeriesIndices()}function d(e){return y.getFont(e,r)}var m=e.get("renderItem"),p=e.coordinateSystem,f={};p&&(f=p.prepareCustoms?p.prepareCustoms():C[p.type](p));var g,T,w,N,b,L,S=v.defaults({getWidth:a.getWidth,getHeight:a.getHeight,getZr:a.getZr,getDevicePixelRatio:a.getDevicePixelRatio,value:o,style:i,styleEmphasis:s,visual:u,barLayout:h,currentSeriesIndices:c,font:d},f.api||{}),k={context:{},seriesId:e.id,seriesName:e.name,seriesIndex:e.seriesIndex,coordSys:f.coordSys,dataInsideLength:t.count(),encode:l(e.getData())},z=!0;return function(e){return g=e,z=!0,m&&m(v.defaults({dataIndexInside:e,dataIndex:t.getRawIndex(e)},k),S)||{}}}function l(e){var t={};return v.each(e.dimensions,function(r,a){var n=e.getDimensionInfo(r);if(!n.isExtraCoord){var o=n.coordDim;(t[o]=t[o]||[])[n.coordDimIndex]=a}}),t}function s(e,t,r,a,n,o){(e=u(e,t,r,a,n,o))&&o.setItemGraphicEl(t,e)}function u(e,t,r,o,i,l){var s=r.type;if(!e||s===e.__customGraphicType||"path"===s&&r.pathData===e.__customPathData||"image"===s&&r.style.image===e.__customImagePath||"text"===s&&r.style.text===e.__customText||(i.remove(e),e=null),null!=s){var c=!e;if(!e&&(e=a(r)),n(e,t,r,o,l,c),"group"===s){var d=e.children()||[],m=r.children||[];if(r.diffChildrenByName)h({oldChildren:d,newChildren:m,dataIndex:t,animatableModel:o,group:e,data:l});else{for(var p=0;p<m.length;p++)u(e.childAt(p),t,m[p],o,e,l);for(;p<d.length;p++)d[p]&&e.remove(d[p])}}return i.add(e),e}}function h(e){new w(e.oldChildren,e.newChildren,c,c,e).add(d).update(d).remove(m).execute()}function c(e,t){var r=e&&e.name;return null!=r?r:z+t}function d(e,t){var r=this.context,a=null!=e?r.newChildren[e]:null;u(null!=t?r.oldChildren[t]:null,r.dataIndex,a,r.animatableModel,r.group,r.data)}function m(e){var t=this.context,r=t.oldChildren[e];r&&t.group.remove(r)}var p=r(9),f=(p.__DEV__,r(2)),v=r(0),y=r(3),g=r(337),_=g.findLabelValueDim,T=r(69),x=r(249),w=r(112),N=r(931),b=r(938),L=r(956),S=r(949),k=r(926),D=["itemStyle","normal"],M=["itemStyle","emphasis"],A=["label","normal"],I=["label","emphasis"],z="e\0\0",C={cartesian2d:N,geo:b,singleAxis:L,polar:S,calendar:k};f.extendSeriesModel({type:"series.custom",dependencies:["grid","polar","geo","singleAxis","calendar"],defaultOption:{coordinateSystem:"cartesian2d",zlevel:0,z:2,legendHoverLink:!0},getInitialData:function(e,t){return T(e.data,this,t)}}),f.extendChartView({type:"custom",_data:null,render:function(e,t,r){var a=this._data,n=e.getData(),o=this.group,l=i(e,n,t,r);n.diff(a).add(function(t){n.hasValue(t)&&s(null,t,l(t),e,o,n)}).update(function(t,r){var i=a.getItemGraphicEl(r);n.hasValue(t)?s(i,t,l(t),e,o,n):i&&o.remove(i)}).remove(function(e){var t=a.getItemGraphicEl(e);t&&o.remove(t)}).execute(),this._data=n},dispose:v.noop})},function(e,t,r){"use strict";var a=r(2),n=r(0);r(746),r(747);var o=r(94),i=r(250);a.registerVisual(n.curry(o,"effectScatter","circle",null)),a.registerLayout(n.curry(i,"effectScatter"))},function(e,t,r){"use strict";var a=r(69),n=r(27),o=n.extend({type:"series.effectScatter",dependencies:["grid","polar"],getInitialData:function(e,t){return a(e.data,this,t)},brushSelector:"point",defaultOption:{coordinateSystem:"cartesian2d",zlevel:0,z:2,legendHoverLink:!0,effectType:"ripple",progressive:0,showEffectOn:"render",rippleEffect:{period:4,scale:2.5,brushType:"fill"},symbolSize:10}});e.exports=o},function(e,t,r){"use strict";var a=r(2),n=r(128),o=r(774),i=a.extendChartView({type:"effectScatter",init:function(){this._symbolDraw=new n(o)},render:function(e,t,r){var a=e.getData(),n=this._symbolDraw;n.updateData(a),this.group.add(n.group)},updateLayout:function(){this._symbolDraw.updateLayout()},remove:function(e,t){this._symbolDraw&&this._symbolDraw.remove(t)},dispose:function(){}});e.exports=i},function(e,t,r){"use strict";var a=r(2),n=r(0);r(749),r(750);var o=r(253),i=r(751),l=r(169);a.registerVisual(n.curry(o,"funnel")),a.registerLayout(i),a.registerProcessor(n.curry(l,"funnel"))},function(e,t,r){"use strict";var a=r(2),n=r(23),o=r(10),i=o.defaultEmphasis,l=r(45),s=a.extendSeriesModel({type:"series.funnel",init:function(e){s.superApply(this,"init",arguments),this.legendDataProvider=function(){return this.getRawData()},this._defaultLabelLine(e)},getInitialData:function(e,t){var r=l(["value"],e.data),a=new n(r,this);return a.initData(e.data),a},_defaultLabelLine:function(e){i(e.labelLine,["show"]);var t=e.labelLine.normal,r=e.labelLine.emphasis;t.show=t.show&&e.label.normal.show,r.show=r.show&&e.label.emphasis.show},getDataParams:function(e){var t=this.getData(),r=s.superCall(this,"getDataParams",e),a=t.getSum("value");return r.percent=a?+(t.get("value",e)/a*100).toFixed(2):0,r.$vars.push("percent"),r},defaultOption:{zlevel:0,z:2,legendHoverLink:!0,left:80,top:60,right:80,bottom:60,minSize:"0%",maxSize:"100%",sort:"descending",gap:0,funnelAlign:"center",label:{normal:{show:!0,position:"outer"},emphasis:{show:!0}},labelLine:{normal:{show:!0,length:20,lineStyle:{width:1,type:"solid"}},emphasis:{}},itemStyle:{normal:{borderColor:"#fff",borderWidth:1},emphasis:{}}}}),u=s;e.exports=u},function(e,t,r){"use strict";function a(e,t){function r(){i.ignore=i.hoverIgnore,l.ignore=l.hoverIgnore}function a(){i.ignore=i.normalIgnore,l.ignore=l.normalIgnore}n.Group.call(this);var o=new n.Polygon,i=new n.Polyline,l=new n.Text;this.add(o),this.add(i),this.add(l),this.updateData(e,t,!0),this.on("emphasis",r).on("normal",a).on("mouseover",r).on("mouseout",a)}var n=r(3),o=r(0),i=r(72),l=a.prototype,s=["itemStyle","normal","opacity"];l.updateData=function(e,t,r){var a=this.childAt(0),i=e.hostModel,l=e.getItemModel(t),u=e.getItemLayout(t),h=e.getItemModel(t).get(s);h=null==h?1:h,a.useStyle({}),r?(a.setShape({points:u.points}),a.setStyle({opacity:0}),n.initProps(a,{style:{opacity:h}},i,t)):n.updateProps(a,{style:{opacity:h},shape:{points:u.points}},i,t);var c=l.getModel("itemStyle"),d=e.getItemVisual(t,"color");a.setStyle(o.defaults({lineJoin:"round",fill:d},c.getModel("normal").getItemStyle(["opacity"]))),a.hoverStyle=c.getModel("emphasis").getItemStyle(),this._updateLabel(e,t),n.setHoverStyle(this)},l._updateLabel=function(e,t){var r=this.childAt(1),a=this.childAt(2),o=e.hostModel,i=e.getItemModel(t),l=e.getItemLayout(t),s=l.label,u=e.getItemVisual(t,"color");n.updateProps(r,{shape:{points:s.linePoints||s.linePoints}},o,t),n.updateProps(a,{style:{x:s.x,y:s.y}},o,t),a.attr({rotation:s.rotation,origin:[s.x,s.y],z2:10});var h=i.getModel("label.normal"),c=i.getModel("label.emphasis"),d=i.getModel("labelLine.normal"),m=i.getModel("labelLine.emphasis"),u=e.getItemVisual(t,"color");n.setLabelStyle(a.style,a.hoverStyle={},h,c,{labelFetcher:e.hostModel,labelDataIndex:t,defaultText:e.getName(t),autoColor:u,useInsideStyle:!!s.inside},{textAlign:s.textAlign,textVerticalAlign:s.verticalAlign}),a.ignore=a.normalIgnore=!h.get("show"),a.hoverIgnore=!c.get("show"),r.ignore=r.normalIgnore=!d.get("show"),r.hoverIgnore=!m.get("show"),r.setStyle({stroke:u}),r.setStyle(d.getModel("lineStyle").getLineStyle()),r.hoverStyle=m.getModel("lineStyle").getLineStyle()},o.inherits(a,n.Group);var u=i.extend({type:"funnel",render:function(e,t,r){var n=e.getData(),o=this._data,i=this.group;n.diff(o).add(function(e){var t=new a(n,e);n.setItemGraphicEl(e,t),i.add(t)}).update(function(e,t){var r=o.getItemGraphicEl(t);r.updateData(n,e),i.add(r),n.setItemGraphicEl(e,r)}).remove(function(e){var t=o.getItemGraphicEl(e);i.remove(t)}).execute(),this._data=n},remove:function(){this.group.removeAll(),this._data=null},dispose:function(){}}),h=u;e.exports=h},function(e,t,r){"use strict";function a(e,t){return l.getLayoutRect(e.getBoxLayoutParams(),{width:t.getWidth(),height:t.getHeight()})}function n(e,t){for(var r=e.mapArray("value",function(e){return e}),a=[],n="ascending"===t,o=0,i=e.count();o<i;o++)a[o]=o;return"function"==typeof t?a.sort(t):"none"!==t&&a.sort(function(e,t){return n?r[e]-r[t]:r[t]-r[e]}),a}function o(e){e.each(function(t){var r,a,n,o,i=e.getItemModel(t),l=i.getModel("label.normal"),s=l.get("position"),u=i.getModel("labelLine.normal"),h=e.getItemLayout(t),c=h.points,d="inner"===s||"inside"===s||"center"===s;if(d)a=(c[0][0]+c[1][0]+c[2][0]+c[3][0])/4,n=(c[0][1]+c[1][1]+c[2][1]+c[3][1])/4,r="center",o=[[a,n],[a,n]];else{var m,p,f,v=u.get("length");"left"===s?(m=(c[3][0]+c[0][0])/2,p=(c[3][1]+c[0][1])/2,f=m-v,a=f-5,r="right"):(m=(c[1][0]+c[2][0])/2,p=(c[1][1]+c[2][1])/2,f=m+v,a=f+5,r="left");var y=p;o=[[m,p],[f,y]],n=y}h.label={linePoints:o,x:a,y:n,verticalAlign:"middle",textAlign:r,inside:d}})}function i(e,t,r){e.eachSeriesByType("funnel",function(e){var r=e.getData(),i=e.get("sort"),l=a(e,t),s=n(r,i),c=[u(e.get("minSize"),l.width),u(e.get("maxSize"),l.width)],d=r.getDataExtent("value"),m=e.get("min"),p=e.get("max");null==m&&(m=Math.min(d[0],0)),null==p&&(p=d[1]);var f=e.get("funnelAlign"),v=e.get("gap"),y=(l.height-v*(r.count()-1))/r.count(),g=l.y,_=function(e,t){var a,n=r.get("value",e)||0,o=h(n,[m,p],c,!0);switch(f){case"left":a=l.x;break;case"center":a=l.x+(l.width-o)/2;break;case"right":a=l.x+l.width-o}return[[a,t],[a+o,t]]};"ascending"===i&&(y=-y,v=-v,g+=l.height,s=s.reverse());for(var T=0;T<s.length;T++){var x=s[T],w=s[T+1],N=_(x,g),b=_(w,g+y);g+=y+v,r.setItemLayout(x,{points:N.concat(b.slice().reverse())})}o(r)})}var l=r(11),s=r(4),u=s.parsePercent,h=s.linearMap;e.exports=i},function(e,t,r){"use strict";r(753),r(754)},function(e,t,r){"use strict";var a=r(23),n=r(27),o=r(0),i=n.extend({type:"series.gauge",getInitialData:function(e,t){var r=new a(["value"],this),n=e.data||[];return o.isArray(n)||(n=[n]),r.initData(n),r},defaultOption:{zlevel:0,z:2,center:["50%","50%"],legendHoverLink:!0,radius:"75%",startAngle:225,endAngle:-45,clockwise:!0,min:0,max:100,splitNumber:10,axisLine:{show:!0,lineStyle:{color:[[.2,"#91c7ae"],[.8,"#63869e"],[1,"#c23531"]],width:30}},splitLine:{show:!0,length:30,lineStyle:{color:"#eee",width:2,type:"solid"}},axisTick:{show:!0,splitNumber:5,length:8,lineStyle:{color:"#eee",width:1,type:"solid"}},axisLabel:{show:!0,distance:5,color:"auto"},pointer:{show:!0,length:"80%",width:8},itemStyle:{normal:{color:"auto"}},title:{show:!0,offsetCenter:[0,"-40%"],color:"#333",fontSize:15},detail:{show:!0,backgroundColor:"rgba(0,0,0,0)",borderWidth:0,borderColor:"#ccc",width:100,height:null,padding:[5,10],offsetCenter:[0,"40%"],color:"auto",fontSize:30}}}),l=i;e.exports=l},function(e,t,r){"use strict";function a(e,t){var r=e.get("center"),a=t.getWidth(),n=t.getHeight(),o=Math.min(a,n);return{cx:u(r[0],t.getWidth()),cy:u(r[1],t.getHeight()),r:u(e.get("radius"),o/2)}}function n(e,t){return t&&("string"==typeof t?e=t.replace("{value}",null!=e?e:""):"function"==typeof t&&(e=t(e))),e}var o=r(755),i=r(3),l=r(72),s=r(4),u=s.parsePercent,h=s.round,c=s.linearMap,d=2*Math.PI,m=l.extend({type:"gauge",render:function(e,t,r){this.group.removeAll();var n=e.get("axisLine.lineStyle.color"),o=a(e,r);this._renderMain(e,t,r,n,o)},dispose:function(){},_renderMain:function(e,t,r,a,n){for(var o=this.group,l=e.getModel("axisLine"),s=l.getModel("lineStyle"),u=e.get("clockwise"),h=-e.get("startAngle")/180*Math.PI,c=-e.get("endAngle")/180*Math.PI,m=(c-h)%d,p=h,f=s.get("width"),v=0;v<a.length;v++){var y=Math.min(Math.max(a[v][0],0),1),c=h+m*y,g=new i.Sector({shape:{startAngle:p,endAngle:c,cx:n.cx,cy:n.cy,clockwise:u,r0:n.r-f,r:n.r},silent:!0});g.setStyle({fill:a[v][1]}),g.setStyle(s.getLineStyle(["color","borderWidth","borderColor"])),o.add(g),p=c}var _=function(e){if(e<=0)return a[0][1];for(var t=0;t<a.length;t++)if(a[t][0]>=e&&(0===t?0:a[t-1][0])<e)return a[t][1];return a[t-1][1]};if(!u){var T=h;h=c,c=T}this._renderTicks(e,t,r,_,n,h,c,u),this._renderPointer(e,t,r,_,n,h,c,u),this._renderTitle(e,t,r,_,n),this._renderDetail(e,t,r,_,n)},_renderTicks:function(e,t,r,a,o,l,s,c){for(var d=this.group,m=o.cx,p=o.cy,f=o.r,v=+e.get("min"),y=+e.get("max"),g=e.getModel("splitLine"),_=e.getModel("axisTick"),T=e.getModel("axisLabel"),x=e.get("splitNumber"),w=_.get("splitNumber"),N=u(g.get("length"),f),b=u(_.get("length"),f),L=l,S=(s-l)/x,k=S/w,D=g.getModel("lineStyle").getLineStyle(),M=_.getModel("lineStyle").getLineStyle(),A=0;A<=x;A++){var I=Math.cos(L),z=Math.sin(L);if(g.get("show")){var C=new i.Line({shape:{x1:I*f+m,y1:z*f+p,x2:I*(f-N)+m,y2:z*(f-N)+p},style:D,silent:!0});"auto"===D.stroke&&C.setStyle({stroke:a(A/x)}),d.add(C)}if(T.get("show")){var R=n(h(A/x*(y-v)+v),T.get("formatter")),E=T.get("distance"),P=a(A/x);d.add(new i.Text({style:i.setTextStyle({},T,{text:R,x:I*(f-N-E)+m,y:z*(f-N-E)+p,textVerticalAlign:z<-.4?"top":z>.4?"bottom":"middle",textAlign:I<-.4?"left":I>.4?"right":"center"},{autoColor:P}),silent:!0}))}if(_.get("show")&&A!==x){for(var O=0;O<=w;O++){var I=Math.cos(L),z=Math.sin(L),F=new i.Line({shape:{x1:I*f+m,y1:z*f+p,x2:I*(f-b)+m,y2:z*(f-b)+p},silent:!0,style:M});"auto"===M.stroke&&F.setStyle({stroke:a((A+O/w)/x)}),d.add(F),L+=k}L-=k}else L+=S}},_renderPointer:function(e,t,r,a,n,l,s,h){var d=this.group,m=this._data;if(!e.get("pointer.show"))return void(m&&m.eachItemGraphicEl(function(e){d.remove(e)}));var p=[+e.get("min"),+e.get("max")],f=[l,s],v=e.getData();v.diff(m).add(function(t){var r=new o({shape:{angle:l}});i.initProps(r,{shape:{angle:c(v.get("value",t),p,f,!0)}},e),d.add(r),v.setItemGraphicEl(t,r)}).update(function(t,r){var a=m.getItemGraphicEl(r);i.updateProps(a,{shape:{angle:c(v.get("value",t),p,f,!0)}},e),d.add(a),v.setItemGraphicEl(t,a)}).remove(function(e){var t=m.getItemGraphicEl(e);d.remove(t)}).execute(),v.eachItemGraphicEl(function(e,t){var r=v.getItemModel(t),o=r.getModel("pointer");e.setShape({x:n.cx,y:n.cy,width:u(o.get("width"),n.r),r:u(o.get("length"),n.r)}),e.useStyle(r.getModel("itemStyle.normal").getItemStyle()),"auto"===e.style.fill&&e.setStyle("fill",a(c(v.get("value",t),p,[0,1],!0))),i.setHoverStyle(e,r.getModel("itemStyle.emphasis").getItemStyle())}),this._data=v},_renderTitle:function(e,t,r,a,n){var o=e.getModel("title");if(o.get("show")){var l=o.get("offsetCenter"),s=n.cx+u(l[0],n.r),h=n.cy+u(l[1],n.r),d=+e.get("min"),m=+e.get("max"),p=e.getData().get("value",0),f=a(c(p,[d,m],[0,1],!0));this.group.add(new i.Text({silent:!0,style:i.setTextStyle({},o,{x:s,y:h,text:e.getData().getName(0),textAlign:"center",textVerticalAlign:"middle"},{autoColor:f,forceRich:!0})}))}},_renderDetail:function(e,t,r,a,o){var l=e.getModel("detail"),s=+e.get("min"),h=+e.get("max");if(l.get("show")){var d=l.get("offsetCenter"),m=o.cx+u(d[0],o.r),p=o.cy+u(d[1],o.r),f=u(l.get("width"),o.r),v=u(l.get("height"),o.r),y=e.getData().get("value",0),g=a(c(y,[s,h],[0,1],!0));this.group.add(new i.Text({silent:!0,style:i.setTextStyle({},l,{x:m,y:p,text:n(y,l.get("formatter")),textWidth:isNaN(f)?null:f,textHeight:isNaN(v)?null:v,textAlign:"center",textVerticalAlign:"middle"},{autoColor:g,forceRich:!0})}))}}}),p=m;e.exports=p},function(e,t,r){"use strict";var a=r(26),n=a.extend({type:"echartsGaugePointer",shape:{angle:0,width:10,r:10,x:0,y:0},buildPath:function(e,t){var r=Math.cos,a=Math.sin,n=t.r,o=t.width,i=t.angle,l=t.x-r(i)*o*(o>=n/3?1:2),s=t.y-a(i)*o*(o>=n/3?1:2);i=t.angle-Math.PI/2,e.moveTo(l,s),e.lineTo(t.x+r(i)*o,t.y+a(i)*o),e.lineTo(t.x+r(t.angle)*n,t.y+a(t.angle)*n),e.lineTo(t.x-r(i)*o,t.y-a(i)*o),e.lineTo(l,s)}});e.exports=n},function(e,t,r){"use strict";var a=r(2),n=r(0);r(757),r(758),r(767);var o=r(760),i=r(94),l=r(761),s=r(764),u=r(768),h=r(762),c=r(766),d=r(763);a.registerProcessor(o),a.registerVisual(n.curry(i,"graph","circle",null)),a.registerVisual(l),a.registerVisual(s),a.registerLayout(u),a.registerLayout(h),a.registerLayout(c),a.registerCoordinateSystem("graphView",{create:d})},function(e,t,r){"use strict";var a=r(2),n=r(23),o=r(0),i=r(10),l=i.defaultEmphasis,s=r(20),u=r(14),h=u.encodeHTML,c=r(336),d=a.extendSeriesModel({type:"series.graph",init:function(e){d.superApply(this,"init",arguments),this.legendDataProvider=function(){return this._categoriesData},this.fillDataTextStyle(e.edges||e.links),this._updateCategoriesData()},mergeOption:function(e){d.superApply(this,"mergeOption",arguments),this.fillDataTextStyle(e.edges||e.links),this._updateCategoriesData()},mergeDefaultAndTheme:function(e){d.superApply(this,"mergeDefaultAndTheme",arguments),l(e.edgeLabel,["show"])},getInitialData:function(e,t){function r(e,r){function a(e){return e=this.parsePath(e),e&&"label"===e[0]?i:this.parentModel}e.wrapMethod("getItemModel",function(e){var t=o._categoriesModels,r=e.getShallow("category"),a=t[r];return a&&(a.parentModel=e.parentModel,e.parentModel=a),e});var n=o.getModel("edgeLabel"),i=new s({label:n.option},n.parentModel,t);r.wrapMethod("getItemModel",function(e){return e.customizeGetParent(a),e})}var a=e.edges||e.links||[],n=e.data||e.nodes||[],o=this;if(n&&a)return c(n,a,this,!0,r).data},getGraph:function(){return this.getData().graph},getEdgeData:function(){return this.getGraph().edgeData},getCategoriesData:function(){return this._categoriesData},formatTooltip:function(e,t,r){if("edge"===r){var a=this.getData(),n=this.getDataParams(e,r),o=a.graph.getEdgeByIndex(e),i=a.getName(o.node1.dataIndex),l=a.getName(o.node2.dataIndex),s=[];return null!=i&&s.push(i),null!=l&&s.push(l),s=h(s.join(" > ")),n.value&&(s+=" : "+h(n.value)),s}return d.superApply(this,"formatTooltip",arguments)},_updateCategoriesData:function(){var e=o.map(this.option.categories||[],function(e){return null!=e.value?e:o.extend({value:0},e)}),t=new n(["value"],this);t.initData(e),this._categoriesData=t,this._categoriesModels=t.mapArray(function(e){return t.getItemModel(e,!0)})},setZoom:function(e){this.option.zoom=e},setCenter:function(e){this.option.center=e},isAnimationEnabled:function(){return d.superCall(this,"isAnimationEnabled")&&!("force"===this.get("layout")&&this.get("force.layoutAnimation"))},defaultOption:{zlevel:0,z:2,coordinateSystem:"view",legendHoverLink:!0,hoverAnimation:!0,layout:null,focusNodeAdjacency:!1,circular:{rotateLabel:!1},force:{initLayout:null,repulsion:[0,50],gravity:.1,edgeLength:30,layoutAnimation:!0},left:"center",top:"center",symbol:"circle",symbolSize:10,edgeSymbol:["none","none"],edgeSymbolSize:10,edgeLabel:{normal:{position:"middle"},emphasis:{}},draggable:!1,roam:!1,center:null,zoom:1,nodeScaleRatio:.6,label:{normal:{show:!1,formatter:"{b}"},emphasis:{show:!0}},itemStyle:{normal:{},emphasis:{}},lineStyle:{normal:{color:"#aaa",width:1,curveness:0,opacity:.5},emphasis:{}}}}),m=d;e.exports=m},function(e,t,r){"use strict";function a(e,t){return e.getVisual("opacity")||e.getModel().get(t)}function n(e,t,r){var n=e.getGraphicEl(),o=a(e,t);null!=r&&(null==o&&(o=1),o*=r),n.downplay&&n.downplay(),n.traverse(function(e){"group"!==e.type&&e.setStyle("opacity",o)})}function o(e,t){var r=a(e,t),n=e.getGraphicEl();n.highlight&&n.highlight(),n.traverse(function(e){"group"!==e.type&&e.setStyle("opacity",r)})}var i=r(2),l=r(0),s=r(128),u=r(238),h=r(166),c=r(355),d=r(242),m=d.onIrrelevantElement,p=r(3),f=r(759),v=["itemStyle","normal","opacity"],y=["lineStyle","normal","opacity"],g=i.extendChartView({type:"graph",init:function(e,t){var r=new s,a=new u,n=this.group;this._controller=new h(t.getZr()),this._controllerHost={target:n},n.add(r.group),n.add(a.group),this._symbolDraw=r,this._lineDraw=a,this._firstRender=!0},render:function(e,t,r){var a=e.coordinateSystem;this._model=e,this._nodeScaleRatio=e.get("nodeScaleRatio");var n=this._symbolDraw,o=this._lineDraw,i=this.group;if("view"===a.type){var l={position:a.position,scale:a.scale};this._firstRender?i.attr(l):p.updateProps(i,l,e)}f(e.getGraph(),this._getNodeGlobalScale(e));var s=e.getData();n.updateData(s);var u=e.getEdgeData();o.updateData(u),this._updateNodeAndLinkScale(),this._updateController(e,t,r),clearTimeout(this._layoutTimeout);var h=e.forceLayout,c=e.get("force.layoutAnimation");h&&this._startForceLayoutIteration(h,c),s.eachItemGraphicEl(function(t,a){var n=s.getItemModel(a);t.off("drag").off("dragend");var o=s.getItemModel(a).get("draggable");o&&t.on("drag",function(){h&&(h.warmUp(),!this._layouting&&this._startForceLayoutIteration(h,c),h.setFixed(a),s.setItemLayout(a,t.position))},this).on("dragend",function(){h&&h.setUnfixed(a)},this),t.setDraggable(o&&h),t.off("mouseover",t.__focusNodeAdjacency),t.off("mouseout",t.__unfocusNodeAdjacency),n.get("focusNodeAdjacency")&&(t.on("mouseover",t.__focusNodeAdjacency=function(){r.dispatchAction({type:"focusNodeAdjacency",seriesId:e.id,dataIndex:t.dataIndex})}),t.on("mouseout",t.__unfocusNodeAdjacency=function(){r.dispatchAction({type:"unfocusNodeAdjacency",seriesId:e.id})}))},this),s.graph.eachEdge(function(t){var a=t.getGraphicEl();a.off("mouseover",a.__focusNodeAdjacency),a.off("mouseout",a.__unfocusNodeAdjacency),t.getModel().get("focusNodeAdjacency")&&(a.on("mouseover",a.__focusNodeAdjacency=function(){r.dispatchAction({type:"focusNodeAdjacency",seriesId:e.id,edgeDataIndex:t.dataIndex})}),a.on("mouseout",a.__unfocusNodeAdjacency=function(){r.dispatchAction({type:"unfocusNodeAdjacency",seriesId:e.id})}))});var d="circular"===e.get("layout")&&e.get("circular.rotateLabel"),m=s.getLayout("cx"),v=s.getLayout("cy");s.eachItemGraphicEl(function(e,t){var r=e.getSymbolPath();if(d){var a=s.getItemLayout(t),n=Math.atan2(a[1]-v,a[0]-m);n<0&&(n=2*Math.PI+n);var o=a[0]<m;o&&(n-=Math.PI);var i=o?"left":"right";r.setStyle({textRotation:-n,textPosition:i,textOrigin:"center"}),r.hoverStyle&&(r.hoverStyle.textPosition=i)}else r.setStyle({textRotation:0})}),this._firstRender=!1},dispose:function(){this._controller&&this._controller.dispose(),this._controllerHost={}},focusNodeAdjacency:function(e,t,r,a){var i=this._model.getData(),s=i.graph,u=a.dataIndex,h=a.edgeDataIndex,c=s.getNodeByIndex(u),d=s.getEdgeByIndex(h);(c||d)&&(s.eachNode(function(e){n(e,v,.1)}),s.eachEdge(function(e){n(e,y,.1)}),c&&(o(c,v),l.each(c.edges,function(e){e.dataIndex<0||(o(e,y),o(e.node1,v),o(e.node2,v))})),d&&(o(d,y),o(d.node1,v),o(d.node2,v)))},unfocusNodeAdjacency:function(e,t,r,a){var o=this._model.getData().graph;o.eachNode(function(e){n(e,v)}),o.eachEdge(function(e){n(e,y)})},_startForceLayoutIteration:function(e,t){var r=this;!function a(){e.step(function(e){r.updateLayout(r._model),(r._layouting=!e)&&(t?r._layoutTimeout=setTimeout(a,16):a())})}()},_updateController:function(e,t,r){var a=this._controller,n=this._controllerHost,o=this.group;if(a.setPointerChecker(function(t,a,n){var i=o.getBoundingRect();return i.applyTransform(o.transform),i.contain(a,n)&&!m(t,r,e)}),"view"!==e.coordinateSystem.type)return void a.disable();a.enable(e.get("roam")),n.zoomLimit=e.get("scaleLimit"),n.zoom=e.coordinateSystem.getZoom(),a.off("pan").off("zoom").on("pan",function(t,a){c.updateViewOnPan(n,t,a),r.dispatchAction({seriesId:e.id,type:"graphRoam",dx:t,dy:a})}).on("zoom",function(t,a,o){c.updateViewOnZoom(n,t,a,o),r.dispatchAction({seriesId:e.id,type:"graphRoam",zoom:t,originX:a,originY:o}),this._updateNodeAndLinkScale(),f(e.getGraph(),this._getNodeGlobalScale(e)),this._lineDraw.updateLayout()},this)},_updateNodeAndLinkScale:function(){var e=this._model,t=e.getData(),r=this._getNodeGlobalScale(e),a=[r,r];t.eachItemGraphicEl(function(e,t){e.attr("scale",a)})},_getNodeGlobalScale:function(e){var t=e.coordinateSystem;if("view"!==t.type)return 1;var r=this._nodeScaleRatio,a=t.scale,n=a&&a[0]||1;return((t.getZoom()-1)*r+1)/n},updateLayout:function(e){f(e.getGraph(),this._getNodeGlobalScale(e)),this._symbolDraw.updateLayout(),this._lineDraw.updateLayout()},remove:function(e,t){this._symbolDraw&&this._symbolDraw.remove(),this._lineDraw&&this._lineDraw.remove()}});e.exports=g},function(e,t,r){"use strict";function a(e,t,r){for(var a,n=e[0],o=e[1],i=e[2],m=1/0,p=r*r,f=.1,v=.1;v<=.9;v+=.1){l[0]=h(n[0],o[0],i[0],v),l[1]=h(n[1],o[1],i[1],v);var y=d(c(l,t)-p);y<m&&(m=y,a=v)}for(var g=0;g<32;g++){var _=a+f;s[0]=h(n[0],o[0],i[0],a),s[1]=h(n[1],o[1],i[1],a),u[0]=h(n[0],o[0],i[0],_),u[1]=h(n[1],o[1],i[1],_);var y=c(s,t)-p;if(d(y)<.01)break;var T=c(u,t)-p;f/=2,y<0?T>=0?a+=f:a-=f:T>=0?a-=f:a+=f}return a}function n(e,t){function r(e){var t=e.getVisual("symbolSize");return t instanceof Array&&(t=(t[0]+t[1])/2),t}var n=[],l=o.quadraticSubdivide,s=[[],[],[]],u=[[],[]],h=[];t/=2,e.eachEdge(function(e,o){var c=e.getLayout(),d=e.getVisual("fromSymbol"),m=e.getVisual("toSymbol");c.__original||(c.__original=[i.clone(c[0]),i.clone(c[1])],c[2]&&c.__original.push(i.clone(c[2])));var p=c.__original;if(null!=c[2]){if(i.copy(s[0],p[0]),i.copy(s[1],p[2]),i.copy(s[2],p[1]),d&&"none"!=d){var f=r(e.node1),v=a(s,p[0],f*t);l(s[0][0],s[1][0],s[2][0],v,n),s[0][0]=n[3],s[1][0]=n[4],l(s[0][1],s[1][1],s[2][1],v,n),s[0][1]=n[3],s[1][1]=n[4]}if(m&&"none"!=m){var f=r(e.node2),v=a(s,p[1],f*t);l(s[0][0],s[1][0],s[2][0],v,n),s[1][0]=n[1],s[2][0]=n[2],l(s[0][1],s[1][1],s[2][1],v,n),s[1][1]=n[1],s[2][1]=n[2]}i.copy(c[0],s[0]),i.copy(c[1],s[2]),i.copy(c[2],s[1])}else{if(i.copy(u[0],p[0]),i.copy(u[1],p[1]),i.sub(h,u[1],u[0]),i.normalize(h,h),d&&"none"!=d){var f=r(e.node1);i.scaleAndAdd(u[0],u[0],h,f*t)}if(m&&"none"!=m){var f=r(e.node2);i.scaleAndAdd(u[1],u[1],h,-f*t)}i.copy(c[0],u[0]),i.copy(c[1],u[1])}})}var o=r(75),i=r(12),l=[],s=[],u=[],h=o.quadraticAt,c=i.distSquare,d=Math.abs;e.exports=n},function(e,t,r){"use strict";function a(e){var t=e.findComponents({mainType:"legend"});t&&t.length&&e.eachSeriesByType("graph",function(e){var r=e.getCategoriesData(),a=e.getGraph(),n=a.data,o=r.mapArray(r.getName);n.filterSelf(function(e){var r=n.getItemModel(e),a=r.getShallow("category");if(null!=a){"number"==typeof a&&(a=o[a]);for(var i=0;i<t.length;i++)if(!t[i].isSelected(a))return!1}return!0})},this)}e.exports=a},function(e,t,r){"use strict";function a(e){var t={};e.eachSeriesByType("graph",function(e){var r=e.getCategoriesData(),a=e.getData(),n={};r.each(function(a){var o=r.getName(a);n["ec-"+o]=a;var i=r.getItemModel(a),l=i.get("itemStyle.normal.color")||e.getColorFromPalette(o,t);r.setItemVisual(a,"color",l)}),r.count()&&a.each(function(e){var t=a.getItemModel(e),o=t.getShallow("category");null!=o&&("string"==typeof o&&(o=n["ec-"+o]),a.getItemVisual(e,"color",!0)||a.setItemVisual(e,"color",r.getItemVisual(o,"color")))})})}e.exports=a},function(e,t,r){"use strict";function a(e){e.eachSeriesByType("graph",function(e){"circular"===e.get("layout")&&o(e)})}var n=r(332),o=n.circularLayout;e.exports=a},function(e,t,r){"use strict";function a(e,t,r){var a=e.getBoxLayoutParams();return a.aspect=r,l(a,{width:t.getWidth(),height:t.getHeight()})}function n(e,t){var r=[];return e.eachSeriesByType("graph",function(e){var n=e.get("coordinateSystem");if(!n||"view"===n){var i=e.getData(),l=i.mapArray(function(e){var t=i.getItemModel(e);return[+t.get("x"),+t.get("y")]}),u=[],h=[];s.fromPoints(l,u,h),h[0]-u[0]==0&&(h[0]+=1,u[0]-=1),h[1]-u[1]==0&&(h[1]+=1,u[1]-=1);var c=(h[0]-u[0])/(h[1]-u[1]),d=a(e,t,c);isNaN(c)&&(u=[d.x,d.y],h=[d.x+d.width,d.y+d.height]);var m=h[0]-u[0],p=h[1]-u[1],f=d.width,v=d.height,y=e.coordinateSystem=new o;y.zoomLimit=e.get("scaleLimit"),y.setBoundingRect(u[0],u[1],m,p),y.setViewRect(d.x,d.y,f,v),y.setCenter(e.get("center")),y.setZoom(e.get("zoom")),r.push(y)}}),r}var o=r(367),i=r(11),l=i.getLayoutRect,s=r(274);e.exports=n},function(e,t,r){"use strict";function a(e){return e instanceof Array||(e=[e,e]),e}function n(e){e.eachSeriesByType("graph",function(e){var t=e.getGraph(),r=e.getEdgeData(),n=a(e.get("edgeSymbol")),o=a(e.get("edgeSymbolSize")),i="lineStyle.normal.color".split("."),l="lineStyle.normal.opacity".split(".");r.setVisual("fromSymbol",n&&n[0]),r.setVisual("toSymbol",n&&n[1]),r.setVisual("fromSymbolSize",o&&o[0]),r.setVisual("toSymbolSize",o&&o[1]),r.setVisual("color",e.get(i)),r.setVisual("opacity",e.get(l)),r.each(function(e){var n=r.getItemModel(e),o=t.getEdgeByIndex(e),s=a(n.getShallow("symbol",!0)),u=a(n.getShallow("symbolSize",!0)),h=n.get(i),c=n.get(l);switch(h){case"source":h=o.node1.getVisual("color");break;case"target":h=o.node2.getVisual("color")}s[0]&&o.setVisual("fromSymbol",s[0]),s[1]&&o.setVisual("toSymbol",s[1]),u[0]&&o.setVisual("fromSymbolSize",u[0]),u[1]&&o.setVisual("toSymbolSize",u[1]),o.setVisual("color",h),o.setVisual("opacity",c)})})}e.exports=n},function(e,t,r){"use strict";function a(e,t,r){for(var a=r.rect,i=a.width,l=a.height,s=[a.x+i/2,a.y+l/2],u=null==r.gravity?.1:r.gravity,h=0;h<e.length;h++){var c=e[h];c.p||(c.p=n.create(i*(Math.random()-.5)+s[0],l*(Math.random()-.5)+s[1])),c.pp=n.clone(c.p),c.edges=null}var d=.6;return{warmUp:function(){d=.5},setFixed:function(t){e[t].fixed=!0},setUnfixed:function(t){e[t].fixed=!1},step:function(r){for(var a=[],i=e.length,l=0;l<t.length;l++){var h=t[l],c=h.n1,m=h.n2;n.sub(a,m.p,c.p);var p=n.len(a)-h.d,f=m.w/(c.w+m.w);isNaN(f)&&(f=0),n.normalize(a,a),!c.fixed&&o(c.p,c.p,a,f*p*d),!m.fixed&&o(m.p,m.p,a,-(1-f)*p*d)}for(var l=0;l<i;l++){var v=e[l];v.fixed||(n.sub(a,s,v.p),o(v.p,v.p,a,u*d))}for(var l=0;l<i;l++)for(var c=e[l],y=l+1;y<i;y++){var m=e[y];n.sub(a,m.p,c.p);var p=n.len(a);0===p&&(n.set(a,Math.random()-.5,Math.random()-.5),p=1);var g=(c.rep+m.rep)/p/p;!c.fixed&&o(c.pp,c.pp,a,g),!m.fixed&&o(m.pp,m.pp,a,-g)}for(var _=[],l=0;l<i;l++){var v=e[l];v.fixed||(n.sub(_,v.p,v.pp),o(v.p,v.p,_,d),n.copy(v.pp,v.p))}d*=.992,r&&r(e,t,d<.01)}}}var n=r(12),o=n.scaleAndAdd;t.forceLayout=a},function(e,t,r){"use strict";function a(e){e.eachSeriesByType("graph",function(e){var t=e.coordinateSystem;if(!t||"view"===t.type)if("force"===e.get("layout")){var r=e.preservedPoints||{},a=e.getGraph(),n=a.data,i=a.edgeData,s=e.getModel("force"),h=s.get("initLayout");e.preservedPoints?n.each(function(e){var t=n.getId(e);n.setItemLayout(e,r[t]||[NaN,NaN])}):h&&"none"!==h?"circular"===h&&u(e):l(e);var p=n.getDataExtent("value"),f=i.getDataExtent("value"),v=s.get("repulsion"),y=s.get("edgeLength");m.isArray(v)||(v=[v,v]),m.isArray(y)||(y=[y,y]),y=[y[1],y[0]];var g=n.mapArray("value",function(e,t){var r=n.getItemLayout(t),a=c(e,p,v);return isNaN(a)&&(a=(v[0]+v[1])/2),{w:a,rep:a,fixed:n.getItemModel(t).get("fixed"),p:!r||isNaN(r[0])||isNaN(r[1])?null:r}}),_=i.mapArray("value",function(e,t){var r=a.getEdgeByIndex(t),n=c(e,f,y);return isNaN(n)&&(n=(y[0]+y[1])/2),{n1:g[r.node1.dataIndex],n2:g[r.node2.dataIndex],d:n,curveness:r.getModel().get("lineStyle.normal.curveness")||0}}),t=e.coordinateSystem,T=t.getBoundingRect(),x=o(g,_,{rect:T,gravity:s.get("gravity")}),w=x.step;x.step=function(e){for(var t=0,o=g.length;t<o;t++)g[t].fixed&&d.copy(g[t].p,a.getNodeByIndex(t).getLayout());w(function(t,o,i){for(var l=0,s=t.length;l<s;l++)t[l].fixed||a.getNodeByIndex(l).setLayout(t[l].p),r[n.getId(l)]=t[l].p;for(var l=0,s=o.length;l<s;l++){var u=o[l],h=a.getEdgeByIndex(l),c=u.n1.p,m=u.n2.p,p=h.getLayout();p=p?p.slice():[],p[0]=p[0]||[],p[1]=p[1]||[],d.copy(p[0],c),d.copy(p[1],m),+u.curveness&&(p[2]=[(c[0]+m[0])/2-(c[1]-m[1])*u.curveness,(c[1]+m[1])/2-(m[0]-c[0])*u.curveness]),h.setLayout(p)}e&&e(i)})},e.forceLayout=x,e.preservedPoints=r,x.step()}else e.forceLayout=null})}var n=r(765),o=n.forceLayout,i=r(333),l=i.simpleLayout,s=r(332),u=s.circularLayout,h=r(4),c=h.linearMap,d=r(12),m=r(0);e.exports=a},function(e,t,r){"use strict";var a=r(2),n=r(329),o=n.updateCenterAndZoom,i={type:"graphRoam",event:"graphRoam",update:"none"};a.registerAction(i,function(e,t){t.eachComponent({mainType:"series",query:e},function(t){var r=t.coordinateSystem,a=o(r,e);t.setCenter&&t.setCenter(a.center),t.setZoom&&t.setZoom(a.zoom)})}),a.registerAction({type:"focusNodeAdjacency",event:"focusNodeAdjacency",update:"series.graph:focusNodeAdjacency"},function(){}),a.registerAction({type:"unfocusNodeAdjacency",event:"unfocusNodeAdjacency",update:"series.graph:unfocusNodeAdjacency"},function(){})},function(e,t,r){"use strict";function a(e,t){e.eachSeriesByType("graph",function(e){var t=e.get("layout"),r=e.coordinateSystem;if(r&&"view"!==r.type){var a=e.getData(),n=r.dimensions;a.each(n,function(){for(var e,t=arguments,o=[],i=0;i<n.length;i++)isNaN(t[i])||(e=!0),o.push(t[i]);var l=t[t.length-1];e?a.setItemLayout(l,r.dataToPoint(o)):a.setItemLayout(l,[NaN,NaN])}),i(a.graph)}else t&&"none"!==t||o(e)})}var n=r(333),o=n.simpleLayout,i=n.simpleLayoutEdge;e.exports=a},function(e,t,r){"use strict";r(771),r(772)},function(e,t,r){"use strict";function a(){var e=n.createCanvas();this.canvas=e,this.blurSize=30,this.pointSize=20,this.maxOpacity=1,this.minOpacity=0,this._gradientPixels={}}var n=r(0);a.prototype={update:function(e,t,r,a,n,o){var i=this._getBrush(),l=this._getGradient(e,n,"inRange"),s=this._getGradient(e,n,"outOfRange"),u=this.pointSize+this.blurSize,h=this.canvas,c=h.getContext("2d"),d=e.length;h.width=t,h.height=r;for(var m=0;m<d;++m){var p=e[m],f=p[0],v=p[1],y=p[2],g=a(y);c.globalAlpha=g,c.drawImage(i,f-u,v-u)}if(!h.width||!h.height)return h;for(var _=c.getImageData(0,0,h.width,h.height),T=_.data,x=0,w=T.length,N=this.minOpacity,b=this.maxOpacity,L=b-N;x<w;){var g=T[x+3]/256,S=4*Math.floor(255*g);if(g>0){var k=o(g)?l:s;g>0&&(g=g*L+N),T[x++]=k[S],T[x++]=k[S+1],T[x++]=k[S+2],T[x++]=k[S+3]*g*256}else x+=4}return c.putImageData(_,0,0),h},_getBrush:function(){var e=this._brushCanvas||(this._brushCanvas=n.createCanvas()),t=this.pointSize+this.blurSize,r=2*t;e.width=r,e.height=r;var a=e.getContext("2d");return a.clearRect(0,0,r,r),a.shadowOffsetX=r,a.shadowBlur=this.blurSize,a.shadowColor="#000",a.beginPath(),a.arc(-t,t,this.pointSize,0,2*Math.PI,!0),a.closePath(),a.fill(),e},_getGradient:function(e,t,r){for(var a=this._gradientPixels,n=a[r]||(a[r]=new Uint8ClampedArray(1024)),o=[0,0,0,0],i=0,l=0;l<256;l++)t[r](l/255,!0,o),n[i++]=o[0],n[i++]=o[1],n[i++]=o[2],n[i++]=o[3];return n}};var o=a;e.exports=o},function(e,t,r){"use strict";var a=r(27),n=r(69),o=a.extend({type:"series.heatmap",getInitialData:function(e,t){return n(e.data,this,t)},defaultOption:{coordinateSystem:"cartesian2d",zlevel:0,z:2,geoIndex:0,blurSize:30,pointSize:20,maxOpacity:1,minOpacity:0}});e.exports=o},function(e,t,r){"use strict";function a(e,t,r){var a=e[1]-e[0];t=h.map(t,function(t){return{interval:[(t.interval[0]-e[0])/a,(t.interval[1]-e[0])/a]}});var n=t.length,o=0;return function(e){for(var a=o;a<n;a++){var i=t[a].interval;if(i[0]<=e&&e<=i[1]){o=a;break}}if(a===n)for(var a=o-1;a>=0;a--){var i=t[a].interval;if(i[0]<=e&&e<=i[1]){o=a;break}}return a>=0&&a<n&&r[a]}}function n(e,t){var r=e[1]-e[0];return t=[(t[0]-e[0])/r,(t[1]-e[0])/r],function(e){return e>=t[0]&&e<=t[1]}}function o(e){var t=e.dimensions;return"lng"===t[0]&&"lat"===t[1]}var i=r(9),l=(i.__DEV__,r(2)),s=r(3),u=r(770),h=r(0),c=l.extendChartView({type:"heatmap",render:function(e,t,r){var a;t.eachComponent("visualMap",function(t){t.eachTargetSeries(function(r){r===e&&(a=t)})}),this.group.removeAll();var n=e.coordinateSystem;"cartesian2d"===n.type||"calendar"===n.type?this._renderOnCartesianAndCalendar(n,e,r):o(n)&&this._renderOnGeo(n,e,a,r)},dispose:function(){},_renderOnCartesianAndCalendar:function(e,t,r){if("cartesian2d"===e.type)var a=e.getAxis("x"),n=e.getAxis("y"),o=a.getBandWidth(),i=n.getBandWidth();var l=this.group,u=t.getData(),c=t.getModel("itemStyle.normal").getItemStyle(["color"]),d=t.getModel("itemStyle.emphasis").getItemStyle(),m=t.getModel("label.normal"),p=t.getModel("label.emphasis"),f=e.type,v="cartesian2d"===f?[t.coordDimToDataDim("x")[0],t.coordDimToDataDim("y")[0],t.coordDimToDataDim("value")[0]]:[t.coordDimToDataDim("time")[0],t.coordDimToDataDim("value")[0]];u.each(function(r){var a;if("cartesian2d"===f){if(isNaN(u.get(v[2],r)))return;var n=e.dataToPoint([u.get(v[0],r),u.get(v[1],r)]);a=new s.Rect({shape:{x:n[0]-o/2,y:n[1]-i/2,width:o,height:i},style:{fill:u.getItemVisual(r,"color"),opacity:u.getItemVisual(r,"opacity")}})}else{if(isNaN(u.get(v[1],r)))return;a=new s.Rect({z2:1,shape:e.dataToRect([u.get(v[0],r)]).contentShape,style:{fill:u.getItemVisual(r,"color"),opacity:u.getItemVisual(r,"opacity")}})}var y=u.getItemModel(r);u.hasItemOption&&(c=y.getModel("itemStyle.normal").getItemStyle(["color"]),d=y.getModel("itemStyle.emphasis").getItemStyle(),m=y.getModel("label.normal"),p=y.getModel("label.emphasis"));var g=t.getRawValue(r),_="-";g&&null!=g[2]&&(_=g[2]),s.setLabelStyle(c,d,m,p,{labelFetcher:t,labelDataIndex:r,defaultText:_,isRectText:!0}),a.setStyle(c),s.setHoverStyle(a,u.hasItemOption?d:h.extend({},d)),l.add(a),u.setItemGraphicEl(r,a)})},_renderOnGeo:function(e,t,r,o){var i=r.targetVisuals.inRange,l=r.targetVisuals.outOfRange,h=t.getData(),c=this._hmLayer||this._hmLayer||new u;c.blurSize=t.get("blurSize"),c.pointSize=t.get("pointSize"),c.minOpacity=t.get("minOpacity"),c.maxOpacity=t.get("maxOpacity");var d=e.getViewRect().clone(),m=e.getRoamTransform().transform;d.applyTransform(m);var p=Math.max(d.x,0),f=Math.max(d.y,0),v=Math.min(d.width+d.x,o.getWidth()),y=Math.min(d.height+d.y,o.getHeight()),g=v-p,_=y-f,T=h.mapArray(["lng","lat","value"],function(t,r,a){var n=e.dataToPoint([t,r]);return n[0]-=p,n[1]-=f,n.push(a),n}),x=r.getExtent(),w="visualMap.continuous"===r.type?n(x,r.option.range):a(x,r.getPieceList(),r.option.selected);c.update(T,g,_,i.color.getNormalizer(),{inRange:i.color.getColorMapper(),outOfRange:l.color.getColorMapper()},w);var N=new s.Image({style:{width:g,height:_,x:p,y:f,image:c.canvas},silent:!0});this.group.add(N)}});e.exports=c},function(e,t,r){"use strict";function a(e,t,r){i.call(this,e,t,r),this._lastFrame=0,this._lastFramePercent=0}var n=r(335),o=r(0),i=r(334),l=r(12),s=a.prototype;s.createLine=function(e,t,r){return new n(e,t,r)},s.updateAnimationPoints=function(e,t){this._points=t;for(var r=[0],a=0,n=1;n<t.length;n++){var o=t[n-1],i=t[n];a+=l.dist(o,i),r.push(a)}if(0!==a){for(var n=0;n<r.length;n++)r[n]/=a;this._offsets=r,this._length=a}},s.getLineLength=function(e){return this._length},s.updateSymbolPosition=function(e){var t=e.__t,r=this._points,a=this._offsets,n=r.length;if(a){var o,i=this._lastFrame;if(t<this._lastFramePercent){var s=Math.min(i+1,n-1);for(o=s;o>=0&&!(a[o]<=t);o--);o=Math.min(o,n-2)}else{for(var o=i;o<n&&!(a[o]>t);o++);o=Math.min(o-1,n-2)}l.lerp(e.position,r[o],r[o+1],(t-a[o])/(a[o+1]-a[o]));var u=r[o+1][0]-r[o][0],h=r[o+1][1]-r[o][1];e.rotation=-Math.atan2(h,u)-Math.PI/2,this._lastFrame=o,this._lastFramePercent=t,e.ignore=!1}},o.inherits(a,i);var u=a;e.exports=u},function(e,t,r){"use strict";function a(e){return i.isArray(e)||(e=[+e,+e]),e}function n(e,t){e.eachChild(function(e){e.attr({z:t.z,zlevel:t.zlevel,style:{stroke:"stroke"===t.brushType?t.color:null,fill:"fill"===t.brushType?t.color:null}})})}function o(e,t){h.call(this);var r=new m(e,t),a=new h;this.add(r),this.add(a),a.beforeUpdate=function(){this.attr(r.getScale())},this.updateData(e,t)}var i=r(0),l=r(38),s=l.createSymbol,u=r(3),h=u.Group,c=r(4),d=c.parsePercent,m=r(162),p=o.prototype;p.stopEffectAnimation=function(){this.childAt(1).removeAll()},p.startEffectAnimation=function(e){for(var t=e.symbolType,r=e.color,a=this.childAt(1),o=0;o<3;o++){var i=s(t,-1,-1,2,2,r);i.attr({style:{strokeNoScale:!0},z2:99,silent:!0,scale:[.5,.5]});var l=-o/3*e.period+e.effectOffset;i.animate("",!0).when(e.period,{scale:[e.rippleScale/2,e.rippleScale/2]}).delay(l).start(),i.animateStyle(!0).when(e.period,{opacity:0}).delay(l).start(),a.add(i)}n(a,e)},p.updateEffectAnimation=function(e){for(var t=this._effectCfg,r=this.childAt(1),a=["symbolType","period","rippleScale"],o=0;o<a.length;o++){var i=a[o];if(t[i]!==e[i])return this.stopEffectAnimation(),void this.startEffectAnimation(e)}n(r,e)},p.highlight=function(){this.trigger("emphasis")},p.downplay=function(){this.trigger("normal")},p.updateData=function(e,t){var r=e.hostModel;this.childAt(0).updateData(e,t);var n=this.childAt(1),o=e.getItemModel(t),i=e.getItemVisual(t,"symbol"),l=a(e.getItemVisual(t,"symbolSize")),s=e.getItemVisual(t,"color");n.attr("scale",l),n.traverse(function(e){e.attr({fill:s})});var u=o.getShallow("symbolOffset");if(u){var h=n.position;h[0]=d(u[0],l[0]),h[1]=d(u[1],l[1])}n.rotation=(o.getShallow("symbolRotate")||0)*Math.PI/180||0;var c={};if(c.showEffectOn=r.get("showEffectOn"),c.rippleScale=o.get("rippleEffect.scale"),c.brushType=o.get("rippleEffect.brushType"),c.period=1e3*o.get("rippleEffect.period"),c.effectOffset=t/e.count(),c.z=o.getShallow("z")||0,c.zlevel=o.getShallow("zlevel")||0,c.symbolType=i,c.color=s,this.off("mouseover").off("mouseout").off("emphasis").off("normal"),"render"===c.showEffectOn)this._effectCfg?this.updateEffectAnimation(c):this.startEffectAnimation(c),this._effectCfg=c;else{this._effectCfg=null,this.stopEffectAnimation();var m=this.childAt(0),p=function(){m.highlight(),"render"!==c.showEffectOn&&this.startEffectAnimation(c)},f=function(){m.downplay(),"render"!==c.showEffectOn&&this.stopEffectAnimation()};this.on("mouseover",p,this).on("mouseout",f,this).on("emphasis",p,this).on("normal",f,this)}this._effectCfg=c},p.fadeOut=function(e){this.off("mouseover").off("mouseout").off("emphasis").off("normal"),e&&e()},i.inherits(o,h);var f=o;e.exports=f},function(e,t,r){"use strict";function a(){this.group=new n.Group,this._lineEl=new l}var n=r(3),o=r(437),i=r(439),l=n.extendShape({shape:{polyline:!1,segs:[]},buildPath:function(e,t){for(var r=t.segs,a=t.polyline,n=0;n<r.length;n++){var o=r[n];if(a){e.moveTo(o[0][0],o[0][1]);for(var i=1;i<o.length;i++)e.lineTo(o[i][0],o[i][1])}else e.moveTo(o[0][0],o[0][1]),o.length>2?e.quadraticCurveTo(o[2][0],o[2][1],o[1][0],o[1][1]):e.lineTo(o[1][0],o[1][1])}},findDataIndex:function(e,t){for(var r=this.shape,a=r.segs,n=r.polyline,l=Math.max(this.style.lineWidth,1),s=0;s<a.length;s++){var u=a[s];if(n){for(var h=1;h<u.length;h++)if(o.containStroke(u[h-1][0],u[h-1][1],u[h][0],u[h][1],l,e,t))return s}else if(u.length>2){if(i.containStroke(u[0][0],u[0][1],u[2][0],u[2][1],u[1][0],u[1][1],l,e,t))return s}else if(o.containStroke(u[0][0],u[0][1],u[1][0],u[1][1],l,e,t))return s}return-1}}),s=a.prototype;s.updateData=function(e){this.group.removeAll();var t=this._lineEl,r=e.hostModel;t.setShape({segs:e.mapArray(e.getItemLayout),polyline:r.get("polyline")}),t.useStyle(r.getModel("lineStyle.normal").getLineStyle());var a=e.getVisual("color");a&&t.setStyle("stroke",a),t.setStyle("fill"),t.seriesIndex=r.seriesIndex,t.on("mousemove",function(e){t.dataIndex=null;var r=t.findDataIndex(e.offsetX,e.offsetY);r>0&&(t.dataIndex=r)}),this.group.add(t)},s.updateLayout=function(e){var t=e.getData();this._lineEl.setShape({segs:t.mapArray(t.getItemLayout)})},s.remove=function(){this.group.removeAll()};var u=a;e.exports=u},function(e,t,r){"use strict";function a(){this.group=new n.Group,this._symbolEl=new l({})}var n=r(3),o=r(38),i=o.createSymbol,l=n.extendShape({shape:{points:null,sizes:null},symbolProxy:null,buildPath:function(e,t){for(var r=t.points,a=t.sizes,n=this.symbolProxy,o=n.shape,i=0;i<r.length;i++){var l=r[i];if(!isNaN(l[0])&&!isNaN(l[1])){var s=a[i];s[0]<4?e.rect(l[0]-s[0]/2,l[1]-s[1]/2,s[0],s[1]):(o.x=l[0]-s[0]/2,o.y=l[1]-s[1]/2,o.width=s[0],o.height=s[1],n.buildPath(e,o,!0))}}},findDataIndex:function(e,t){for(var r=this.shape,a=r.points,n=r.sizes,o=a.length-1;o>=0;o--){var i=a[o],l=n[o],s=i[0]-l[0]/2,u=i[1]-l[1]/2;if(e>=s&&t>=u&&e<=s+l[0]&&t<=u+l[1])return o}return-1}}),s=a.prototype;s.updateData=function(e){this.group.removeAll();var t=this._symbolEl,r=e.hostModel;t.setShape({points:e.mapArray(e.getItemLayout),sizes:e.mapArray(function(t){var r=e.getItemVisual(t,"symbolSize");return r instanceof Array||(r=[r,r]),r})}),t.symbolProxy=i(e.getVisual("symbol"),0,0,0,0),t.setColor=t.symbolProxy.setColor,t.useStyle(r.getModel("itemStyle.normal").getItemStyle(["color"]));var a=e.getVisual("color");a&&t.setColor(a),t.seriesIndex=r.seriesIndex,t.on("mousemove",function(e){t.dataIndex=null;var r=t.findDataIndex(e.offsetX,e.offsetY);r>=0&&(t.dataIndex=r)}),this.group.add(t)},s.updateLayout=function(e){var t=e.getData();this._symbolEl.setShape({points:t.mapArray(t.getItemLayout)})},s.remove=function(){this.group.removeAll()};var u=a;e.exports=u},function(e,t,r){"use strict";function a(e){return isNaN(+e.cpx1)||isNaN(+e.cpy1)}var n=r(3),o=r(12),i=n.Line.prototype,l=n.BezierCurve.prototype,s=n.extendShape({type:"ec-line",style:{stroke:"#000",fill:null},shape:{x1:0,y1:0,x2:0,y2:0,percent:1,cpx1:null,cpy1:null},buildPath:function(e,t){(a(t)?i:l).buildPath(e,t)},pointAt:function(e){return a(this.shape)?i.pointAt.call(this,e):l.pointAt.call(this,e)},tangentAt:function(e){var t=this.shape,r=a(t)?[t.x2-t.x1,t.y2-t.y1]:l.tangentAt.call(this,e);return o.normalize(r,r)}});e.exports=s},function(e,t,r){"use strict";function a(e,t,r,a){s.Group.call(this),this.bodyIndex,this.whiskerIndex,this.styleUpdater=r,this._createContent(e,t,a),this.updateData(e,t,a),this._seriesModel}function n(e,t,r){return l.map(e,function(e){return e=e.slice(),e[t]=r.initBaseline,e})}function o(e){var t={};return l.each(e,function(e,r){t["ends"+r]=e}),t}function i(e){this.group=new s.Group,this.styleUpdater=e}var l=r(0),s=r(3),u=r(26),h=u.extend({type:"whiskerInBox",shape:{},buildPath:function(e,t){for(var r in t)if(t.hasOwnProperty(r)&&0===r.indexOf("ends")){var a=t[r];e.moveTo(a[0][0],a[0][1]),e.lineTo(a[1][0],a[1][1])}}}),c=a.prototype;c._createContent=function(e,t,r){var a=e.getItemLayout(t),i="horizontal"===a.chartLayout?1:0,u=0;this.add(new s.Polygon({shape:{points:r?n(a.bodyEnds,i,a):a.bodyEnds},style:{strokeNoScale:!0},z2:100})),this.bodyIndex=u++;var c=l.map(a.whiskerEnds,function(e){return r?n(e,i,a):e});this.add(new h({shape:o(c),style:{strokeNoScale:!0},z2:100})),this.whiskerIndex=u++},c.updateData=function(e,t,r){var a=this._seriesModel=e.hostModel,n=e.getItemLayout(t),i=s[r?"initProps":"updateProps"];i(this.childAt(this.bodyIndex),{shape:{points:n.bodyEnds}},a,t),i(this.childAt(this.whiskerIndex),{shape:o(n.whiskerEnds)},a,t),this.styleUpdater.call(null,this,e,t)},l.inherits(a,s.Group);var d=i.prototype;d.updateData=function(e){var t=this.group,r=this._data,n=this.styleUpdater;e.diff(r).add(function(r){if(e.hasValue(r)){var o=new a(e,r,n,!0);e.setItemGraphicEl(r,o),t.add(o)}}).update(function(o,i){var l=r.getItemGraphicEl(i);if(!e.hasValue(o))return void t.remove(l);l?l.updateData(e,o):l=new a(e,o,n),t.add(l),e.setItemGraphicEl(o,l)}).remove(function(e){var a=r.getItemGraphicEl(e);a&&t.remove(a)}).execute(),this._data=e},d.remove=function(){var e=this.group,t=this._data;this._data=null,t&&t.eachItemGraphicEl(function(t){t&&e.remove(t)})};var m=i;e.exports=m},function(e,t,r){"use strict";var a=r(2),n=r(0);r(780),r(781);var o=r(94),i=r(250),l=r(972);r(133),a.registerVisual(n.curry(o,"line","circle","line")),a.registerLayout(n.curry(i,"line")),a.registerProcessor(a.PRIORITY.PROCESSOR.STATISTIC,n.curry(l,"line"))},function(e,t,r){"use strict";var a=r(9),n=(a.__DEV__,r(69)),o=r(27),i=o.extend({type:"series.line",dependencies:["grid","polar"],getInitialData:function(e,t){return n(e.data,this,t)},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,hoverAnimation:!0,clipOverflow:!0,label:{normal:{position:"top"}},lineStyle:{normal:{width:2,type:"solid"}},step:!1,smooth:!1,smoothMonotone:null,symbol:"emptyCircle",symbolSize:4,symbolRotate:null,showSymbol:!0,showAllSymbol:!1,connectNulls:!1,sampling:"none",animationEasing:"linear",progressive:0,hoverLayerThreshold:1/0}});e.exports=i},function(e,t,r){"use strict";function a(e,t){if(e.length===t.length){for(var r=0;r<e.length;r++){var a=e[r],n=t[r];if(a[0]!==n[0]||a[1]!==n[1])return}return!0}}function n(e){return"number"==typeof e?e:e?.3:0}function o(e){var t=e.getGlobalExtent();if(e.onBand){var r=e.getBandWidth()/2-1,a=t[1]>t[0]?1:-1;t[0]+=a*r,t[1]-=a*r}return t}function i(e){return e>=0?1:-1}function l(e,t){var r=e.getBaseAxis(),a=e.getOtherAxis(r),n=0;if(!r.onZero){var o=a.scale.getExtent();o[0]>0?n=o[0]:o[1]<0&&(n=o[1])}var l=a.dim,s="x"===l||"radius"===l?1:0;return t.mapArray([l],function(a,o){for(var u,h=t.stackedOn;h&&i(h.get(l,o))===i(a);){u=h;break}var c=[];return c[s]=t.get(r.dim,o),c[1-s]=u?u.get(l,o,!0):n,e.dataToPoint(c)},!0)}function s(e,t,r){var a=o(e.getAxis("x")),n=o(e.getAxis("y")),i=e.getBaseAxis().isHorizontal(),l=Math.min(a[0],a[1]),s=Math.min(n[0],n[1]),u=Math.max(a[0],a[1])-l,h=Math.max(n[0],n[1])-s,c=r.get("lineStyle.normal.width")||2,d=r.get("clipOverflow")?c/2:Math.max(u,h);i?(s-=d,h+=2*d):(l-=d,u+=2*d);var m=new g.Rect({shape:{x:l,y:s,width:u,height:h}});return t&&(m.shape[i?"width":"height"]=0,g.initProps(m,{shape:{width:u,height:h}},r)),m}function u(e,t,r){var a=e.getAngleAxis(),n=e.getRadiusAxis(),o=n.getExtent(),i=a.getExtent(),l=Math.PI/180,s=new g.Sector({shape:{cx:e.cx,cy:e.cy,r0:o[0],r:o[1],startAngle:-i[0]*l,endAngle:-i[1]*l,clockwise:a.inverse}});return t&&(s.shape.endAngle=-i[0]*l,g.initProps(s,{shape:{endAngle:-i[1]*l}},r)),s}function h(e,t,r){return"polar"===e.type?u(e,t,r):s(e,t,r)}function c(e,t,r){for(var a=t.getBaseAxis(),n="x"===a.dim||"radius"===a.dim?0:1,o=[],i=0;i<e.length-1;i++){var l=e[i+1],s=e[i];o.push(s);var u=[];switch(r){case"end":u[n]=l[n],u[1-n]=s[1-n],o.push(u);break;case"middle":var h=(s[n]+l[n])/2,c=[];u[n]=c[n]=h,u[1-n]=s[1-n],c[1-n]=l[1-n],o.push(u),o.push(c);break;default:u[n]=s[n],u[1-n]=l[1-n],o.push(u)}}return e[i]&&o.push(e[i]),o}function d(e,t){var r=e.getVisual("visualMeta");if(r&&r.length&&e.count()){for(var a,n=r.length-1;n>=0;n--)if(r[n].dimension<2){a=r[n];break}if(a&&"cartesian2d"===t.type){var o=a.dimension,i=e.dimensions[o],l=t.getAxis(i),s=p.map(a.stops,function(e){return{coord:l.toGlobalCoord(l.dataToCoord(e.value)),color:e.color}}),u=s.length,h=a.outerColors.slice();u&&s[0].coord>s[u-1].coord&&(s.reverse(),h.reverse());var c=s[0].coord-10,d=s[u-1].coord+10,m=d-c;if(m<.001)return"transparent";p.each(s,function(e){e.offset=(e.coord-c)/m}),s.push({offset:u?s[u-1].offset:.5,color:h[1]||"transparent"}),s.unshift({offset:u?s[0].offset:.5,color:h[0]||"transparent"});var f=new g.LinearGradient(0,0,0,0,s,!0);return f[i]=c,f[i+"2"]=d,f}}}var m=r(9),p=(m.__DEV__,r(0)),f=r(128),v=r(162),y=r(782),g=r(3),_=r(10),T=r(338),x=T.Polyline,w=T.Polygon,N=r(72),b=N.extend({type:"line",init:function(){var e=new g.Group,t=new f;this.group.add(t.group),this._symbolDraw=t,this._lineGroup=e},render:function(e,t,r){var o=e.coordinateSystem,i=this.group,s=e.getData(),u=e.getModel("lineStyle.normal"),m=e.getModel("areaStyle.normal"),f=s.mapArray(s.getItemLayout,!0),v="polar"===o.type,y=this._coordSys,g=this._symbolDraw,_=this._polyline,T=this._polygon,x=this._lineGroup,w=e.get("animation"),N=!m.isEmpty(),b=l(o,s),L=e.get("showSymbol"),S=L&&!v&&!e.get("showAllSymbol")&&this._getSymbolIgnoreFunc(s,o),k=this._data;k&&k.eachItemGraphicEl(function(e,t){e.__temp&&(i.remove(e),k.setItemGraphicEl(t,null))}),L||g.remove(),i.add(x);var D=!v&&e.get("step");_&&y.type===o.type&&D===this._step?(N&&!T?T=this._newPolygon(f,b,o,w):T&&!N&&(x.remove(T),T=this._polygon=null),x.setClipPath(h(o,!1,e)),L&&g.updateData(s,S),s.eachItemGraphicEl(function(e){e.stopAnimation(!0)}),a(this._stackedOnPoints,b)&&a(this._points,f)||(w?this._updateAnimation(s,b,o,r,D):(D&&(f=c(f,o,D),b=c(b,o,D)),_.setShape({points:f}),T&&T.setShape({points:f,stackedOnPoints:b})))):(L&&g.updateData(s,S),D&&(f=c(f,o,D),b=c(b,o,D)),_=this._newPolyline(f,o,w),N&&(T=this._newPolygon(f,b,o,w)),x.setClipPath(h(o,!0,e)));var M=d(s,o)||s.getVisual("color");_.useStyle(p.defaults(u.getLineStyle(),{fill:"none",stroke:M,lineJoin:"bevel"}));var A=e.get("smooth");if(A=n(e.get("smooth")),_.setShape({smooth:A,smoothMonotone:e.get("smoothMonotone"),connectNulls:e.get("connectNulls")}),T){var I=s.stackedOn,z=0;T.useStyle(p.defaults(m.getAreaStyle(),{fill:M,opacity:.7,lineJoin:"bevel"})),I&&(z=n(I.hostModel.get("smooth"))),T.setShape({smooth:A,stackedOnSmooth:z,smoothMonotone:e.get("smoothMonotone"),connectNulls:e.get("connectNulls")})}this._data=s,this._coordSys=o,this._stackedOnPoints=b,this._points=f,this._step=D},dispose:function(){},highlight:function(e,t,r,a){var n=e.getData(),o=_.queryDataIndex(n,a);if(!(o instanceof Array)&&null!=o&&o>=0){var i=n.getItemGraphicEl(o);if(!i){var l=n.getItemLayout(o);if(!l)return;i=new v(n,o),i.position=l,i.setZ(e.get("zlevel"),e.get("z")),i.ignore=isNaN(l[0])||isNaN(l[1]),i.__temp=!0,n.setItemGraphicEl(o,i),i.stopSymbolAnimation(!0),this.group.add(i)}i.highlight()}else N.prototype.highlight.call(this,e,t,r,a)},downplay:function(e,t,r,a){var n=e.getData(),o=_.queryDataIndex(n,a);if(null!=o&&o>=0){var i=n.getItemGraphicEl(o);i&&(i.__temp?(n.setItemGraphicEl(o,null),this.group.remove(i)):i.downplay())}else N.prototype.downplay.call(this,e,t,r,a)},_newPolyline:function(e){var t=this._polyline;return t&&this._lineGroup.remove(t),t=new x({shape:{points:e},silent:!0,z2:10}),this._lineGroup.add(t),this._polyline=t,t},_newPolygon:function(e,t){var r=this._polygon;return r&&this._lineGroup.remove(r),r=new w({shape:{points:e,stackedOnPoints:t},silent:!0}),this._lineGroup.add(r),this._polygon=r,r},_getSymbolIgnoreFunc:function(e,t){var r=t.getAxesByScale("ordinal")[0];if(r&&r.isLabelIgnored)return p.bind(r.isLabelIgnored,r)},_updateAnimation:function(e,t,r,a,n){var o=this._polyline,i=this._polygon,l=e.hostModel,s=y(this._data,e,this._stackedOnPoints,t,this._coordSys,r),u=s.current,h=s.stackedOnCurrent,d=s.next,m=s.stackedOnNext;n&&(u=c(s.current,r,n),h=c(s.stackedOnCurrent,r,n),d=c(s.next,r,n),m=c(s.stackedOnNext,r,n)),o.shape.__points=s.current,o.shape.points=u,g.updateProps(o,{shape:{points:d}},l),i&&(i.setShape({points:u,stackedOnPoints:h}),g.updateProps(i,{shape:{points:d,stackedOnPoints:m}},l));for(var p=[],f=s.status,v=0;v<f.length;v++)if("="===f[v].cmd){var _=e.getItemGraphicEl(f[v].idx1);_&&p.push({el:_,ptIdx:v})}o.animators&&o.animators.length&&o.animators[0].during(function(){for(var e=0;e<p.length;e++)p[e].el.attr("position",o.shape.__points[p[e].ptIdx])})},remove:function(e){var t=this.group,r=this._data;this._lineGroup.removeAll(),this._symbolDraw.remove(!0),r&&r.eachItemGraphicEl(function(e,a){e.__temp&&(t.remove(e),r.setItemGraphicEl(a,null))}),this._polyline=this._polygon=this._coordSys=this._points=this._stackedOnPoints=this._data=null}});e.exports=b},function(e,t,r){"use strict";function a(e){return e>=0?1:-1}function n(e,t,r){for(var n,o=e.getBaseAxis(),i=e.getOtherAxis(o),l=o.onZero?0:i.scale.getExtent()[0],s=i.dim,u="x"===s||"radius"===s?1:0,h=t.stackedOn,c=t.get(s,r);h&&a(h.get(s,r))===a(c);){n=h;break}var d=[];return d[u]=t.get(o.dim,r),d[1-u]=n?n.get(s,r,!0):l,e.dataToPoint(d)}function o(e,t){var r=[];return t.diff(e).add(function(e){r.push({cmd:"+",idx:e})}).update(function(e,t){r.push({cmd:"=",idx:t,idx1:e})}).remove(function(e){r.push({cmd:"-",idx:e})}).execute(),r}function i(e,t,r,a,i,l){for(var s=o(e,t),u=[],h=[],c=[],d=[],m=[],p=[],f=[],v=l.dimensions,y=0;y<s.length;y++){var g=s[y],_=!0;switch(g.cmd){case"=":var T=e.getItemLayout(g.idx),x=t.getItemLayout(g.idx1);(isNaN(T[0])||isNaN(T[1]))&&(T=x.slice()),u.push(T),h.push(x),c.push(r[g.idx]),d.push(a[g.idx1]),f.push(t.getRawIndex(g.idx1));break;case"+":var w=g.idx;u.push(i.dataToPoint([t.get(v[0],w,!0),t.get(v[1],w,!0)])),h.push(t.getItemLayout(w).slice()),c.push(n(i,t,w)),d.push(a[w]),f.push(t.getRawIndex(w));break;case"-":var w=g.idx,N=e.getRawIndex(w);N!==w?(u.push(e.getItemLayout(w)),h.push(l.dataToPoint([e.get(v[0],w,!0),e.get(v[1],w,!0)])),c.push(r[w]),d.push(n(l,e,w)),f.push(N)):_=!1}_&&(m.push(g),p.push(p.length))}p.sort(function(e,t){return f[e]-f[t]});for(var b=[],L=[],S=[],k=[],D=[],y=0;y<p.length;y++){var w=p[y];b[y]=u[w],L[y]=h[w],S[y]=c[w],k[y]=d[w],D[y]=m[w]}return{current:b,next:L,stackedOnCurrent:S,stackedOnNext:k,status:D}}e.exports=i},function(e,t,r){"use strict";var a=r(2);r(784),r(785);var n=r(786),o=r(787);a.registerLayout(n),a.registerVisual(o)},function(e,t,r){"use strict";function a(e){var t=e.data;t&&t[0]&&t[0][0]&&t[0][0].coord&&(e.data=l.map(t,function(e){var t=[e[0].coord,e[1].coord],r={coords:t};return e[0].name&&(r.fromName=e[0].name),e[1].name&&(r.toName=e[1].name),l.mergeAll([r,e[0],e[1]])}))}var n=r(9),o=(n.__DEV__,r(27)),i=r(23),l=r(0),s=r(14),u=s.encodeHTML,h=(r(53),o.extend({type:"series.lines",dependencies:["grid","polar"],visualColorAccessPath:"lineStyle.normal.color",init:function(e){a(e),h.superApply(this,"init",arguments)},mergeOption:function(e){a(e),h.superApply(this,"mergeOption",arguments)},getInitialData:function(e,t){var r=new i(["value"],this);return r.hasItemOption=!1,r.initData(e.data,[],function(e,t,a,n){if(e instanceof Array)return NaN;r.hasItemOption=!0;var o=e.value;return null!=o?o instanceof Array?o[n]:o:void 0}),r},formatTooltip:function(e){var t=this.getData(),r=t.getItemModel(e),a=r.get("name");if(a)return a;var n=r.get("fromName"),o=r.get("toName"),i=[];return null!=n&&i.push(n),null!=o&&i.push(o),u(i.join(" > "))},defaultOption:{coordinateSystem:"geo",zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,xAxisIndex:0,yAxisIndex:0,symbol:["none","none"],symbolSize:[10,10],geoIndex:0,effect:{show:!1,period:4,constantSpeed:0,symbol:"circle",symbolSize:3,loop:!0,trailLength:.2},large:!1,largeThreshold:2e3,polyline:!1,label:{normal:{show:!1,position:"end"}},lineStyle:{normal:{opacity:.5}}}})),c=h;e.exports=c},function(e,t,r){"use strict";var a=r(9),n=(a.__DEV__,r(2)),o=r(238),i=r(334),l=r(237),s=r(335),u=r(773),h=r(775),c=n.extendChartView({type:"lines",init:function(){},render:function(e,t,r){var a=e.getData(),n=this._lineDraw,c=e.get("effect.show"),d=e.get("polyline"),m=e.get("large")&&a.count()>=e.get("largeThreshold");c===this._hasEffet&&d===this._isPolyline&&m===this._isLarge||(n&&n.remove(),n=this._lineDraw=m?new h:new o(d?c?u:s:c?i:l),this._hasEffet=c,this._isPolyline=d,this._isLarge=m);var p=e.get("zlevel"),f=e.get("effect.trailLength"),v=r.getZr(),y="svg"===v.painter.getType();y||v.painter.getLayer(p).clear(!0),null==this._lastZlevel||y||v.configLayer(this._lastZlevel,{motionBlur:!1}),c&&f&&(y||v.configLayer(p,{motionBlur:!0,lastFrameAlpha:Math.max(Math.min(f/10+.9,1),0)})),this.group.add(n.group),n.updateData(a),this._lastZlevel=p},updateLayout:function(e,t,r){this._lineDraw.updateLayout(e);var a=r.getZr();"svg"===a.painter.getType()||a.painter.getLayer(this._lastZlevel).clear(!0)},remove:function(e,t){this._lineDraw&&this._lineDraw.remove(t,!0);var r=t.getZr();"svg"===r.painter.getType()||r.painter.getLayer(this._lastZlevel).clear(!0)},dispose:function(){}});e.exports=c},function(e,t,r){"use strict";function a(e){e.eachSeriesByType("lines",function(e){var t=e.coordinateSystem,r=e.getData();r.each(function(a){var n=r.getItemModel(a),o=n.option instanceof Array?n.option:n.get("coords"),i=[];if(e.get("polyline"))for(var l=0;l<o.length;l++)i.push(t.dataToPoint(o[l]));else{i[0]=t.dataToPoint(o[0]),i[1]=t.dataToPoint(o[1]);var s=n.get("lineStyle.normal.curveness");+s&&(i[2]=[(i[0][0]+i[1][0])/2-(i[0][1]-i[1][1])*s,(i[0][1]+i[1][1])/2-(i[1][0]-i[0][0])*s])}r.setItemLayout(a,i)})})}r(9).__DEV__,e.exports=a},function(e,t,r){"use strict";function a(e){return e instanceof Array||(e=[e,e]),e}function n(e){e.eachSeriesByType("lines",function(e){var t=e.getData(),r=a(e.get("symbol")),n=a(e.get("symbolSize")),o="lineStyle.normal.opacity".split(".");t.setVisual("fromSymbol",r&&r[0]),t.setVisual("toSymbol",r&&r[1]),t.setVisual("fromSymbolSize",n&&n[0]),t.setVisual("toSymbolSize",n&&n[1]),t.setVisual("opacity",e.get(o)),t.each(function(e){var r=t.getItemModel(e),n=a(r.getShallow("symbol",!0)),i=a(r.getShallow("symbolSize",!0)),l=r.get(o);n[0]&&t.setItemVisual(e,"fromSymbol",n[0]),n[1]&&t.setItemVisual(e,"toSymbol",n[1]),i[0]&&t.setItemVisual(e,"fromSymbolSize",i[0]),i[1]&&t.setItemVisual(e,"toSymbolSize",i[1]),t.setItemVisual(e,"opacity",l)})})}e.exports=n},function(e,t,r){"use strict";var a=r(2);r(789),r(790),r(328),r(168);var n=r(793),o=r(794),i=r(792),l=r(791),s=r(327);a.registerLayout(n),a.registerVisual(o),a.registerProcessor(a.PRIORITY.PROCESSOR.STATISTIC,i),a.registerPreprocessor(l),s("map",[{type:"mapToggleSelect",event:"mapselectchanged",method:"toggleSelected"},{type:"mapSelect",event:"mapselected",method:"select"},{type:"mapUnSelect",event:"mapunselected",method:"unSelect"}])},function(e,t,r){"use strict";var a=r(0),n=r(23),o=r(27),i=r(45),l=r(14),s=l.encodeHTML,u=l.addCommas,h=r(243),c=r(168),d=o.extend({type:"series.map",dependencies:["geo"],layoutMode:"box",needsDrawMap:!1,seriesGroup:[],init:function(e){this._fillOption(e,this.getMapType()),d.superApply(this,"init",arguments),this.updateSelectedMap(e.data)},getInitialData:function(e){var t=i(["value"],e.data||[]),r=new n(t,this);return r.initData(e.data),r},mergeOption:function(e){this._fillOption(e,this.getMapType()),d.superApply(this,"mergeOption",arguments),this.updateSelectedMap(this.option.data)},getHostGeoModel:function(){var e=this.option.geoIndex;return null!=e?this.dependentModels.geo[e]:null},getMapType:function(){return(this.getHostGeoModel()||this).option.map},_fillOption:function(e,t){e.data=c.getFilledRegions(e.data,t,e.nameMap)},getRawValue:function(e){return this.getData().get("value",e)},getRegionModel:function(e){var t=this.getData();return t.getItemModel(t.indexOfName(e))},formatTooltip:function(e){for(var t=this.getData(),r=u(this.getRawValue(e)),a=t.getName(e),n=this.seriesGroup,o=[],i=0;i<n.length;i++){var l=n[i].originalData.indexOfName(a);isNaN(n[i].originalData.get("value",l))||o.push(s(n[i].name))}return o.join(", ")+"<br />"+s(a+" : "+r)},getTooltipPosition:function(e){if(null!=e){var t=this.getData().getName(e),r=this.coordinateSystem,a=r.getRegion(t);return a&&r.dataToPoint(a.center)}},setZoom:function(e){this.option.zoom=e},setCenter:function(e){this.option.center=e},defaultOption:{zlevel:0,z:2,coordinateSystem:"geo",map:"",left:"center",top:"center",aspectScale:.75,showLegendSymbol:!0,dataRangeHoverLink:!0,boundingCoords:null,center:null,zoom:1,scaleLimit:null,label:{normal:{show:!1,color:"#000"},emphasis:{show:!0,color:"rgb(100,0,0)"}},itemStyle:{normal:{borderWidth:.5,borderColor:"#444",areaColor:"#eee"},emphasis:{areaColor:"rgba(255,215,0,0.8)"}}}});a.mixin(d,h);var m=d;e.exports=m},function(e,t,r){"use strict";var a=r(2),n=r(0),o=r(3),i=r(351),l=a.extendChartView({type:"map",render:function(e,t,r,a){if(!a||"mapToggleSelect"!==a.type||a.from!==this.uid){var n=this.group;if(n.removeAll(),!e.getHostGeoModel()){if(a&&"geoRoam"===a.type&&"series"===a.componentType&&a.seriesId===e.id){var o=this._mapDraw;o&&n.add(o.group)}else if(e.needsDrawMap){var o=this._mapDraw||new i(r,!0);n.add(o.group),o.draw(e,t,r,this,a),this._mapDraw=o}else this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null;e.get("showLegendSymbol")&&t.getComponent("legend")&&this._renderSymbols(e,t,r)}}},remove:function(){this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null,this.group.removeAll()},dispose:function(){this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null},_renderSymbols:function(e,t,r){var a=e.originalData,i=this.group;a.each("value",function(t,r){if(!isNaN(t)){var l=a.getItemLayout(r);if(l&&l.point){var s=l.point,u=l.offset,h=new o.Circle({style:{fill:e.getData().getVisual("color")},shape:{cx:s[0]+9*u,cy:s[1],r:3},silent:!0,z2:u?8:10});if(!u){var c=e.mainSeries.getData(),d=a.getName(r),m=c.indexOfName(d),p=a.getItemModel(r),f=p.getModel("label.normal"),v=p.getModel("label.emphasis"),y=c.getItemGraphicEl(m),g=n.retrieve2(e.getFormattedLabel(r,"normal"),d),_=n.retrieve2(e.getFormattedLabel(r,"emphasis"),g),T=function(){var e=o.setTextStyle({},v,{text:v.get("show")?_:null},{isRectText:!0,useInsideStyle:!1},!0);h.style.extendFrom(e),h.__mapOriginalZ2=h.z2,h.z2+=1},x=function(){o.setTextStyle(h.style,f,{text:f.get("show")?g:null,textPosition:f.getShallow("position")||"bottom"},{isRectText:!0,useInsideStyle:!1}),null!=h.__mapOriginalZ2&&(h.z2=h.__mapOriginalZ2,h.__mapOriginalZ2=null)};y.on("mouseover",T).on("mouseout",x).on("emphasis",T).on("normal",x),x()}i.add(h)}}})}});e.exports=l},function(e,t,r){"use strict";function a(e){var t=[];n.each(e.series,function(e){e&&"map"===e.type&&(t.push(e),e.map=e.map||e.mapType,n.defaults(e,e.mapLocation))})}var n=r(0);e.exports=a},function(e,t,r){"use strict";function a(e,t){var r={},a=["value"];return o.each(e,function(e){e.each(a,function(t,a){var n="ec-"+e.getName(a);r[n]=r[n]||[],isNaN(t)||r[n].push(t)})}),e[0].map(a,function(a,n){for(var o="ec-"+e[0].getName(n),i=0,l=1/0,s=-1/0,u=r[o].length,h=0;h<u;h++)l=Math.min(l,r[o][h]),s=Math.max(s,r[o][h]),i+=r[o][h];var c;return c="min"===t?l:"max"===t?s:"average"===t?i/u:i,0===u?NaN:c})}function n(e){var t={};e.eachSeriesByType("map",function(e){var r=e.getHostGeoModel(),a=r?"o"+r.id:"i"+e.getMapType();(t[a]=t[a]||[]).push(e)}),o.each(t,function(e,t){for(var r=a(o.map(e,function(e){return e.getData()}),e[0].get("mapValueCalculation")),n=0;n<e.length;n++)e[n].originalData=e[n].getData();for(var n=0;n<e.length;n++)e[n].seriesGroup=e,e[n].needsDrawMap=0===n&&!e[n].getHostGeoModel(),e[n].setData(r.cloneShallow()),e[n].mainSeries=e[0]})}var o=r(0);e.exports=n},function(e,t,r){"use strict";function a(e){var t={};e.eachSeriesByType("map",function(r){var a=r.getMapType();if(!r.getHostGeoModel()&&!t[a]){var o={};n.each(r.seriesGroup,function(t){var r=t.coordinateSystem,a=t.originalData;t.get("showLegendSymbol")&&e.getComponent("legend")&&a.each("value",function(e,t){var n=a.getName(t),i=r.getRegion(n);if(i&&!isNaN(e)){var l=o[n]||0,s=r.dataToPoint(i.center);o[n]=l+1,a.setItemLayout(t,{point:s,offset:l})}})});var i=r.getData();i.each(function(e){var t=i.getName(e),r=i.getItemLayout(e)||{};r.showLabel=!o[t],i.setItemLayout(e,r)}),t[a]=!0}})}var n=r(0);e.exports=a},function(e,t,r){"use strict";function a(e){e.eachSeriesByType("map",function(e){var t=e.get("color"),r=e.getModel("itemStyle.normal"),a=r.get("areaColor"),n=r.get("color")||t[e.seriesIndex%t.length];e.getData().setVisual({areaColor:a,color:n})})}e.exports=a},function(e,t,r){"use strict";var a=r(2);r(358),r(796),r(797);var n=r(798);a.registerVisual(n)},function(e,t,r){"use strict";function a(e,t,r){var a=e.get("data"),o=n(t);a&&a.length&&l.each(r,function(e){if(e){var t=l.indexOf(a,e[o]);e[o]=t>=0?t:NaN}})}function n(e){return+e.replace("dim","")}function o(e,t){var r=0;l.each(e,function(e){var t=n(e);t>r&&(r=t)});var a=t[0];a&&a.length-1>r&&(r=a.length-1);for(var o=[],i=0;i<=r;i++)o.push("dim"+i);return o}var i=r(23),l=r(0),s=r(27),u=r(45),h=s.extend({type:"series.parallel",dependencies:["parallel"],visualColorAccessPath:"lineStyle.normal.color",getInitialData:function(e,t){var r=t.getComponent("parallel",this.get("parallelIndex")),n=r.parallelAxisIndex,s=e.data,h=r.dimensions,c=o(h,s),d=l.map(c,function(e,r){var o=l.indexOf(h,e),i=o>=0&&t.getComponent("parallelAxis",n[o]);return i&&"category"===i.get("type")?(a(i,e,s),{name:e,type:"ordinal"}):o<0&&u.guessOrdinal(s,r)?{name:e,type:"ordinal"}:e}),m=new i(d,this);return m.initData(s),this.option.progressive&&(this.option.animation=!1),m},getRawIndicesByActiveState:function(e){var t=this.coordinateSystem,r=this.getData(),a=[];return t.eachActiveState(r,function(t,n){e===t&&a.push(r.getRawIndex(n))}),a},defaultOption:{zlevel:0,z:2,coordinateSystem:"parallel",parallelIndex:0,label:{normal:{show:!1},emphasis:{show:!1}},inactiveOpacity:.05,activeOpacity:1,lineStyle:{normal:{width:1,opacity:.45,type:"solid"}},progressive:!1,smooth:!1,animationEasing:"linear"}});e.exports=h},function(e,t,r){"use strict";function a(e,t,r){var a=e.model,n=e.getRect(),o=new s.Rect({shape:{x:n.x,y:n.y,width:n.width,height:n.height}}),i="horizontal"===a.get("layout")?"width":"height";return o.setShape(i,0),s.initProps(o,{shape:{width:n.width,height:n.height}},t,r),o}function n(e,t,r,a){for(var n=[],o=0;o<r.length;o++){var i=r[o],s=e.get(i,t);l(s,a.getAxis(i).type)||n.push(a.dataToPoint(s,i))}return n}function o(e,t,r,a,o){var i=n(e,r,a,o),l=new s.Polyline({shape:{points:i},silent:!0,z2:10});t.add(l),e.setItemGraphicEl(r,l)}function i(e,t){var r=e.hostModel.getModel("lineStyle.normal"),a=r.getLineStyle();e.eachItemGraphicEl(function(n,o){if(e.hasItemOption){var i=e.getItemModel(o),l=i.getModel("lineStyle.normal",r);a=l.getLineStyle(["color","stroke"])}n.useStyle(u.extend(a,{fill:null,stroke:e.getItemVisual(o,"color"),opacity:e.getItemVisual(o,"opacity")})),n.shape.smooth=t})}function l(e,t){return"category"===t?null==e:null==e||isNaN(e)}var s=r(3),u=r(0),h=r(72),c=h.extend({type:"parallel",init:function(){this._dataGroup=new s.Group,this.group.add(this._dataGroup),this._data},render:function(e,t,r,a){this._renderForNormal(e,a)},dispose:function(){},_renderForNormal:function(e,t){function r(e){o(c,h,e,p,m)}function l(r,a){var o=d.getItemGraphicEl(a),i=n(c,r,p,m);c.setItemGraphicEl(r,o);var l=t&&!1===t.animation?null:e;s.updateProps(o,{shape:{points:i}},l,r)}function u(e){var t=d.getItemGraphicEl(e);h.remove(t)}var h=this._dataGroup,c=e.getData(),d=this._data,m=e.coordinateSystem,p=m.dimensions,f=e.option,v=f.smooth?.3:null;if(c.diff(d).add(r).update(l).remove(u).execute(),i(c,v),!this._data){var y=a(m,e,function(){setTimeout(function(){h.removeClipPath()})});h.setClipPath(y)}this._data=c},remove:function(){this._dataGroup&&this._dataGroup.removeAll(),this._data=null}}),d=c;e.exports=d},function(e,t,r){"use strict";function a(e){e.eachSeriesByType("parallel",function(t){var r=t.getModel("itemStyle.normal"),a=t.getModel("lineStyle.normal"),o=e.get("color"),i=a.get("color")||r.get("color")||o[t.seriesIndex%o.length],l=t.get("inactiveOpacity"),s=t.get("activeOpacity"),u=t.getModel("lineStyle.normal").getLineStyle(),h=t.coordinateSystem,c=t.getData(),d={normal:u.opacity,active:s,inactive:l};h.eachActiveState(c,function(e,t){var r=c.getItemModel(t),a=d[e];if("normal"===e){var o=r.get(n,!0);null!=o&&(a=o)}c.setItemVisual(t,"opacity",a)}),c.setVisual("color",i)})}var n=["lineStyle","normal","opacity"];e.exports=a},function(e,t,r){"use strict";var a=r(2),n=r(0);r(247),r(730),r(731);var o=r(249),i=r(94);r(133),a.registerLayout(n.curry(o,"pictorialBar")),a.registerVisual(n.curry(i,"pictorialBar","roundRect",null))},function(e,t,r){"use strict";var a=r(2),n=r(0);r(801),r(802);var o=r(327),i=r(253),l=r(804),s=r(169);o("pie",[{type:"pieToggleSelect",event:"pieselectchanged",method:"toggleSelected"},{type:"pieSelect",event:"pieselected",method:"select"},{type:"pieUnSelect",event:"pieunselected",method:"unSelect"}]),a.registerVisual(n.curry(i,"pie")),a.registerLayout(n.curry(l,"pie")),a.registerProcessor(n.curry(s,"pie"))},function(e,t,r){"use strict";var a=r(2),n=r(23),o=r(0),i=r(10),l=r(4),s=l.getPercentWithPrecision,u=r(45),h=r(243),c=a.extendSeriesModel({type:"series.pie",init:function(e){c.superApply(this,"init",arguments),this.legendDataProvider=function(){return this.getRawData()},this.updateSelectedMap(e.data),this._defaultLabelLine(e)},mergeOption:function(e){c.superCall(this,"mergeOption",e),this.updateSelectedMap(this.option.data)},getInitialData:function(e,t){var r=u(["value"],e.data),a=new n(r,this);return a.initData(e.data),a},getDataParams:function(e){var t=this.getData(),r=c.superCall(this,"getDataParams",e),a=[];return t.each("value",function(e){a.push(e)}),r.percent=s(a,e,t.hostModel.get("percentPrecision")),r.$vars.push("percent"),r},_defaultLabelLine:function(e){i.defaultEmphasis(e.labelLine,["show"]);var t=e.labelLine.normal,r=e.labelLine.emphasis;t.show=t.show&&e.label.normal.show,r.show=r.show&&e.label.emphasis.show},defaultOption:{zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,center:["50%","50%"],radius:[0,"75%"],clockwise:!0,startAngle:90,minAngle:0,selectedOffset:10,hoverOffset:10,avoidLabelOverlap:!0,percentPrecision:2,stillShowZeroSum:!0,label:{normal:{rotate:!1,show:!0,position:"outer"},emphasis:{}},labelLine:{normal:{show:!0,length:15,length2:15,smooth:!1,lineStyle:{width:1,type:"solid"}}},itemStyle:{normal:{borderWidth:1},emphasis:{}},animationType:"expansion",animationEasing:"cubicOut",data:[]}});o.mixin(c,h);var d=c;e.exports=d},function(e,t,r){"use strict";function a(e,t,r,a){var o=t.getData(),i=this.dataIndex,l=o.getName(i),s=t.get("selectedOffset");a.dispatchAction({type:"pieToggleSelect",from:e,name:l,seriesId:t.id}),o.each(function(e){n(o.getItemGraphicEl(e),o.getItemLayout(e),t.isSelected(o.getName(e)),s,r)})}function n(e,t,r,a,n){var o=(t.startAngle+t.endAngle)/2,i=Math.cos(o),l=Math.sin(o),s=r?a:0,u=[i*s,l*s];n?e.animate().when(200,{position:u}).start("bounceOut"):e.attr("position",u)}function o(e,t){function r(){o.ignore=o.hoverIgnore,i.ignore=i.hoverIgnore}function a(){o.ignore=o.normalIgnore,i.ignore=i.normalIgnore}l.Group.call(this);var n=new l.Sector({z2:2}),o=new l.Polyline,i=new l.Text;this.add(n),this.add(o),this.add(i),this.updateData(e,t,!0),this.on("emphasis",r).on("normal",a).on("mouseover",r).on("mouseout",a)}var i=r(0),l=r(3),s=r(72),u=o.prototype;u.updateData=function(e,t,r){function a(){s.stopAnimation(!0),s.animateTo({shape:{r:c.r+u.get("hoverOffset")}},300,"elasticOut")}function o(){s.stopAnimation(!0),s.animateTo({shape:{r:c.r}},300,"elasticOut")}var s=this.childAt(0),u=e.hostModel,h=e.getItemModel(t),c=e.getItemLayout(t),d=i.extend({},c);d.label=null,r?(s.setShape(d),"scale"===u.getShallow("animationType")?(s.shape.r=c.r0,l.initProps(s,{shape:{r:c.r}},u,t)):(s.shape.endAngle=c.startAngle,l.updateProps(s,{shape:{endAngle:c.endAngle}},u,t))):l.updateProps(s,{shape:d},u,t);var m=h.getModel("itemStyle"),p=e.getItemVisual(t,"color");s.useStyle(i.defaults({lineJoin:"bevel",fill:p},m.getModel("normal").getItemStyle())),s.hoverStyle=m.getModel("emphasis").getItemStyle();var f=h.getShallow("cursor");f&&s.attr("cursor",f),n(this,e.getItemLayout(t),h.get("selected"),u.get("selectedOffset"),u.get("animation")),s.off("mouseover").off("mouseout").off("emphasis").off("normal"),h.get("hoverAnimation")&&u.isAnimationEnabled()&&s.on("mouseover",a).on("mouseout",o).on("emphasis",a).on("normal",o),this._updateLabel(e,t),l.setHoverStyle(this)},u._updateLabel=function(e,t){var r=this.childAt(1),a=this.childAt(2),n=e.hostModel,o=e.getItemModel(t),i=e.getItemLayout(t),s=i.label,u=e.getItemVisual(t,"color");l.updateProps(r,{shape:{points:s.linePoints||[[s.x,s.y],[s.x,s.y],[s.x,s.y]]}},n,t),l.updateProps(a,{style:{x:s.x,y:s.y}},n,t),a.attr({rotation:s.rotation,origin:[s.x,s.y],z2:10});var h=o.getModel("label.normal"),c=o.getModel("label.emphasis"),d=o.getModel("labelLine.normal"),m=o.getModel("labelLine.emphasis"),u=e.getItemVisual(t,"color");l.setLabelStyle(a.style,a.hoverStyle={},h,c,{labelFetcher:e.hostModel,labelDataIndex:t,defaultText:e.getName(t),autoColor:u,useInsideStyle:!!s.inside},{textAlign:s.textAlign,textVerticalAlign:s.verticalAlign,opacity:e.getItemVisual(t,"opacity")}),a.ignore=a.normalIgnore=!h.get("show"),a.hoverIgnore=!c.get("show"),r.ignore=r.normalIgnore=!d.get("show"),r.hoverIgnore=!m.get("show"),r.setStyle({stroke:u,opacity:e.getItemVisual(t,"opacity")}),r.setStyle(d.getModel("lineStyle").getLineStyle()),r.hoverStyle=m.getModel("lineStyle").getLineStyle();var p=d.get("smooth");p&&!0===p&&(p=.4),r.setShape({smooth:p})},i.inherits(o,l.Group);var h=s.extend({type:"pie",init:function(){var e=new l.Group;this._sectorGroup=e},render:function(e,t,r,n){if(!n||n.from!==this.uid){var l=e.getData(),s=this._data,u=this.group,h=t.get("animation"),c=!s,d=e.get("animationType"),m=i.curry(a,this.uid,e,h,r),p=e.get("selectedMode");if(l.diff(s).add(function(e){var t=new o(l,e);c&&"scale"!==d&&t.eachChild(function(e){e.stopAnimation(!0)}),p&&t.on("click",m),l.setItemGraphicEl(e,t),u.add(t)}).update(function(e,t){var r=s.getItemGraphicEl(t);r.updateData(l,e),r.off("click"),p&&r.on("click",m),u.add(r),l.setItemGraphicEl(e,r)}).remove(function(e){var t=s.getItemGraphicEl(e);u.remove(t)}).execute(),h&&c&&l.count()>0&&"scale"!==d){var f=l.getItemLayout(0),v=Math.max(r.getWidth(),r.getHeight())/2,y=i.bind(u.removeClipPath,u);u.setClipPath(this._createClipPath(f.cx,f.cy,v,f.startAngle,f.clockwise,y,e))}this._data=l}},dispose:function(){},_createClipPath:function(e,t,r,a,n,o,i){var s=new l.Sector({shape:{cx:e,cy:t,r0:0,r:r,startAngle:a,endAngle:a,clockwise:n}});return l.initProps(s,{shape:{endAngle:a+(n?1:-1)*Math.PI*2}},i,o),s},containPoint:function(e,t){var r=t.getData(),a=r.getItemLayout(0);if(a){var n=e[0]-a.cx,o=e[1]-a.cy,i=Math.sqrt(n*n+o*o);return i<=a.r&&i>=a.r0}}}),c=h;e.exports=c},function(e,t,r){"use strict";function a(e,t,r,a,n,o,i){function l(t,r){for(var a=t;a>=0&&(e[a].y-=r,!(a>0&&e[a].y>e[a-1].y+e[a-1].height));a--);}function s(e,t,r,a,n,o){for(var i=t?Number.MAX_VALUE:0,l=0,s=e.length;l<s;l++)if("center"!==e[l].position){var u=Math.abs(e[l].y-a),h=e[l].len,c=e[l].len2,d=u<n+h?Math.sqrt((n+h+c)*(n+h+c)-u*u):Math.abs(e[l].x-r);t&&d>=i&&(d=i-10),!t&&d<=i&&(d=i+10),e[l].x=r+d*o,i=d}}e.sort(function(e,t){return e.y-t.y});for(var u,h=0,c=e.length,d=[],m=[],p=0;p<c;p++)u=e[p].y-h,u<0&&function(t,r,a,n){for(var o=t;o<r;o++)if(e[o].y+=a,o>t&&o+1<r&&e[o+1].y>e[o].y+e[o].height)return void l(o,a/2);l(r-1,a/2)}(p,c,-u),h=e[p].y+e[p].height;i-h<0&&l(c-1,h-i);for(var p=0;p<c;p++)e[p].y>=r?m.push(e[p]):d.push(e[p]);s(d,!1,t,r,a,n),s(m,!0,t,r,a,n)}function n(e,t,r,n,o,i){for(var l=[],s=[],u=0;u<e.length;u++)e[u].x<t?l.push(e[u]):s.push(e[u]);a(s,t,r,n,1,o,i),a(l,t,r,n,-1,o,i);for(var u=0;u<e.length;u++){var h=e[u].linePoints;if(h){var c=h[1][0]-h[2][0];e[u].x<t?h[2][0]=e[u].x+3:h[2][0]=e[u].x-3,h[1][1]=h[2][1]=e[u].y,h[1][0]=h[2][0]+c}}}function o(e,t,r,a){var o,l,s=e.getData(),u=[],h=!1;s.each(function(r){var a,n,c,d,m=s.getItemLayout(r),p=s.getItemModel(r),f=p.getModel("label.normal"),v=f.get("position")||p.get("label.emphasis.position"),y=p.getModel("labelLine.normal"),g=y.get("length"),_=y.get("length2"),T=(m.startAngle+m.endAngle)/2,x=Math.cos(T),w=Math.sin(T);o=m.cx,l=m.cy;var N="inside"===v||"inner"===v;if("center"===v)a=m.cx,n=m.cy,d="center";else{var b=(N?(m.r+m.r0)/2*x:m.r*x)+o,L=(N?(m.r+m.r0)/2*w:m.r*w)+l;if(a=b+3*x,n=L+3*w,!N){var S=b+x*(g+t-m.r),k=L+w*(g+t-m.r),D=S+(x<0?-1:1)*_,M=k;a=D+(x<0?-5:5),n=M,c=[[b,L],[S,k],[D,M]]}d=N?"center":x>0?"left":"right"}var A=f.getFont(),I=f.get("rotate")?x<0?-T+Math.PI:-T:0,z=e.getFormattedLabel(r,"normal")||s.getName(r),C=i.getBoundingRect(z,A,d,"top");h=!!I,m.label={x:a,y:n,position:v,height:C.height,len:g,len2:_,linePoints:c,textAlign:d,verticalAlign:"middle",rotation:I,inside:N},N||u.push(m.label)}),!h&&e.get("avoidLabelOverlap")&&n(u,o,l,t,r,a)}var i=r(54);e.exports=o},function(e,t,r){"use strict";function a(e,t,r,a){t.eachSeriesByType(e,function(e){var t=e.get("center"),a=e.get("radius");s.isArray(a)||(a=[0,a]),s.isArray(t)||(t=[t,t]);var n=r.getWidth(),c=r.getHeight(),d=Math.min(n,c),m=o(t[0],n),p=o(t[1],c),f=o(a[0],d/2),v=o(a[1],d/2),y=e.getData(),g=-e.get("startAngle")*h,_=e.get("minAngle")*h,T=0;y.each("value",function(e){!isNaN(e)&&T++});var x=y.getSum("value"),w=Math.PI/(x||T)*2,N=e.get("clockwise"),b=e.get("roseType"),L=e.get("stillShowZeroSum"),S=y.getDataExtent("value");S[0]=0;var k=u,D=0,M=g,A=N?1:-1;if(y.each("value",function(e,t){var r;if(isNaN(e))return void y.setItemLayout(t,{angle:NaN,startAngle:NaN,endAngle:NaN,clockwise:N,cx:m,cy:p,r0:f,r:b?NaN:v});r="area"!==b?0===x&&L?w:e*w:u/T,r<_?(r=_,k-=_):D+=e;var a=M+A*r;y.setItemLayout(t,{angle:r,startAngle:M,endAngle:a,clockwise:N,cx:m,cy:p,r0:f,r:b?i(e,S,[f,v]):v}),M=a},!0),k<u&&T)if(k<=.001){var I=u/T;y.each("value",function(e,t){if(!isNaN(e)){var r=y.getItemLayout(t);r.angle=I,r.startAngle=g+A*t*I,r.endAngle=g+A*(t+1)*I}})}else w=k/D,M=g,y.each("value",function(e,t){if(!isNaN(e)){var r=y.getItemLayout(t),a=r.angle===_?_:e*w;r.startAngle=M,r.endAngle=M+A*a,M+=A*a}});l(e,v,n,c)})}var n=r(4),o=n.parsePercent,i=n.linearMap,l=r(803),s=r(0),u=2*Math.PI,h=Math.PI/180;e.exports=a},function(e,t,r){"use strict";var a=r(2),n=r(0);r(891),r(806),r(807);var o=r(253),i=r(94),l=r(809),s=r(169),u=r(808);a.registerVisual(n.curry(o,"radar")),a.registerVisual(n.curry(i,"radar","circle",null)),a.registerLayout(l),a.registerProcessor(n.curry(s,"radar")),a.registerPreprocessor(u)},function(e,t,r){"use strict";var a=r(27),n=r(23),o=r(45),i=r(0),l=r(14),s=l.encodeHTML,u=a.extend({type:"series.radar",dependencies:["radar"],init:function(e){u.superApply(this,"init",arguments),this.legendDataProvider=function(){return this.getRawData()}},getInitialData:function(e,t){var r=e.data||[],a=o([],r,{extraPrefix:"indicator_",extraFromZero:!0}),i=new n(a,this);return i.initData(r),i},formatTooltip:function(e){var t=this.getRawValue(e),r=this.coordinateSystem,a=r.getIndicatorAxes(),n=this.getData().getName(e);return s(""===n?this.name:n)+"<br/>"+i.map(a,function(e,r){return s(e.name+" : "+t[r])}).join("<br />")},defaultOption:{zlevel:0,z:2,coordinateSystem:"radar",legendHoverLink:!0,radarIndex:0,lineStyle:{normal:{width:2,type:"solid"}},label:{normal:{position:"top"}},symbol:"emptyCircle",symbolSize:4}}),h=u;e.exports=h},function(e,t,r){"use strict";function a(e){return i.isArray(e)||(e=[+e,+e]),e}var n=r(2),o=r(3),i=r(0),l=r(38),s=n.extendChartView({type:"radar",render:function(e,t,r){function n(e,t){var r=e.getItemVisual(t,"symbol")||"circle",n=e.getItemVisual(t,"color");if("none"!==r){var o=a(e.getItemVisual(t,"symbolSize")),i=l.createSymbol(r,-1,-1,2,2,n);return i.attr({style:{strokeNoScale:!0},z2:100,scale:[o[0]/2,o[1]/2]}),i}}function s(t,r,a,i,l,s){a.removeAll();for(var u=0;u<r.length-1;u++){var h=n(i,l);h&&(h.__dimIdx=u,t[u]?(h.attr("position",t[u]),o[s?"initProps":"updateProps"](h,{position:r[u]},e,l)):h.attr("position",r[u]),a.add(h))}}function u(e){return i.map(e,function(e){return[h.cx,h.cy]})}var h=e.coordinateSystem,c=this.group,d=e.getData(),m=this._data;d.diff(m).add(function(t){var r=d.getItemLayout(t);if(r){var a=new o.Polygon,n=new o.Polyline,i={shape:{points:r}};a.shape.points=u(r),n.shape.points=u(r),o.initProps(a,i,e,t),o.initProps(n,i,e,t);var l=new o.Group,h=new o.Group;l.add(n),l.add(a),l.add(h),s(n.shape.points,r,h,d,t,!0),d.setItemGraphicEl(t,l)}}).update(function(t,r){var a=m.getItemGraphicEl(r),n=a.childAt(0),i=a.childAt(1),l=a.childAt(2),u={shape:{points:d.getItemLayout(t)}};u.shape.points&&(s(n.shape.points,u.shape.points,l,d,t,!1),o.updateProps(n,u,e),o.updateProps(i,u,e),d.setItemGraphicEl(t,a))}).remove(function(e){c.remove(m.getItemGraphicEl(e))}).execute(),d.eachItemGraphicEl(function(e,t){function r(){s.attr("ignore",v)}function a(){s.attr("ignore",f)}var n=d.getItemModel(t),l=e.childAt(0),s=e.childAt(1),u=e.childAt(2),h=d.getItemVisual(t,"color");c.add(e),l.useStyle(i.defaults(n.getModel("lineStyle.normal").getLineStyle(),{fill:"none",stroke:h})),l.hoverStyle=n.getModel("lineStyle.emphasis").getLineStyle();var m=n.getModel("areaStyle.normal"),p=n.getModel("areaStyle.emphasis"),f=m.isEmpty()&&m.parentModel.isEmpty(),v=p.isEmpty()&&p.parentModel.isEmpty();v=v&&f,s.ignore=f,s.useStyle(i.defaults(m.getAreaStyle(),{fill:h,opacity:.7})),s.hoverStyle=p.getAreaStyle();var y=n.getModel("itemStyle.normal").getItemStyle(["color"]),g=n.getModel("itemStyle.emphasis").getItemStyle(),_=n.getModel("label.normal"),T=n.getModel("label.emphasis");u.eachChild(function(e){e.setStyle(y),e.hoverStyle=i.clone(g),o.setLabelStyle(e.style,e.hoverStyle,_,T,{labelFetcher:d.hostModel,labelDataIndex:t,labelDimIndex:e.__dimIdx,defaultText:d.get(d.dimensions[e.__dimIdx],t),autoColor:h,isRectText:!0})}),e.off("mouseover").off("mouseout").off("normal").off("emphasis"),e.on("emphasis",r).on("mouseover",r).on("normal",a).on("mouseout",a),o.setHoverStyle(e)}),this._data=d},remove:function(){this.group.removeAll(),this._data=null},dispose:function(){}});e.exports=s},function(e,t,r){"use strict";function a(e){var t=e.polar;if(t){n.isArray(t)||(t=[t]);var r=[];n.each(t,function(t,a){t.indicator?(t.type&&!t.shape&&(t.shape=t.type),e.radar=e.radar||[],n.isArray(e.radar)||(e.radar=[e.radar]),e.radar.push(t)):r.push(t)}),e.polar=r}n.each(e.series,function(e){e&&"radar"===e.type&&e.polarIndex&&(e.radarIndex=e.polarIndex)})}var n=r(0);e.exports=a},function(e,t,r){"use strict";function a(e){e.eachSeriesByType("radar",function(e){function t(e,t){a[t]=a[t]||[],a[t][o]=n.dataToPoint(e,o)}var r=e.getData(),a=[],n=e.coordinateSystem;if(n){for(var o=0;o<n.getIndicatorAxes().length;o++){var i=r.dimensions[o];r.each(i,t)}r.each(function(e){a[e][0]&&a[e].push(a[e][0].slice()),r.setItemLayout(e,a[e])})}})}e.exports=a},function(e,t,r){"use strict";var a=r(2);r(811),r(812);var n=r(813),o=r(814);a.registerLayout(n),a.registerVisual(o)},function(e,t,r){"use strict";var a=r(27),n=r(336),o=r(14),i=o.encodeHTML,l=a.extend({type:"series.sankey",layoutInfo:null,getInitialData:function(e){var t=e.edges||e.links,r=e.data||e.nodes;if(r&&t)return n(r,t,this,!0).data},getGraph:function(){return this.getData().graph},getEdgeData:function(){return this.getGraph().edgeData},formatTooltip:function(e,t,r){if("edge"===r){var a=this.getDataParams(e,r),n=a.data,o=n.source+" -- "+n.target;return a.value&&(o+=" : "+a.value),i(o)}return l.superCall(this,"formatTooltip",e,t)},defaultOption:{zlevel:0,z:2,coordinateSystem:"view",layout:null,left:"5%",top:"5%",right:"20%",bottom:"5%",nodeWidth:20,nodeGap:8,layoutIterations:32,label:{normal:{show:!0,position:"right",color:"#000",fontSize:12},emphasis:{show:!0}},itemStyle:{normal:{borderWidth:1,borderColor:"#333"}},lineStyle:{normal:{color:"#314656",opacity:.2,curveness:.5},emphasis:{opacity:.6}},animationEasing:"linear",animationDuration:1e3}}),s=l;e.exports=s},function(e,t,r){"use strict";function a(e,t,r){var a=new n.Rect({shape:{x:e.x-10,y:e.y-10,width:0,height:e.height+20}});return n.initProps(a,{shape:{width:e.width+20,height:e.height+20}},t,r),a}var n=r(3),o=r(2),i=n.extendShape({shape:{x1:0,y1:0,x2:0,y2:0,cpx1:0,cpy1:0,cpx2:0,cpy2:0,extent:0},buildPath:function(e,t){var r=t.extent/2;e.moveTo(t.x1,t.y1-r),e.bezierCurveTo(t.cpx1,t.cpy1-r,t.cpx2,t.cpy2-r,t.x2,t.y2-r),e.lineTo(t.x2,t.y2+r),e.bezierCurveTo(t.cpx2,t.cpy2+r,t.cpx1,t.cpy1+r,t.x1,t.y1+r),e.closePath()}}),l=o.extendChartView({type:"sankey",_model:null,render:function(e,t,r){var o=e.getGraph(),l=this.group,s=e.layoutInfo,u=e.getData(),h=e.getData("edge");this._model=e,l.removeAll(),l.attr("position",[s.x,s.y]),o.eachEdge(function(t){var r=new i;r.dataIndex=t.dataIndex,r.seriesIndex=e.seriesIndex,r.dataType="edge";var a=t.getModel("lineStyle.normal"),o=a.get("curveness"),s=t.node1.getLayout(),u=t.node2.getLayout(),c=t.getLayout();r.shape.extent=Math.max(1,c.dy);var d=s.x+s.dx,m=s.y+c.sy+c.dy/2,p=u.x,f=u.y+c.ty+c.dy/2,v=d*(1-o)+p*o,y=m,g=d*o+p*(1-o),_=f;switch(r.setShape({x1:d,y1:m,x2:p,y2:f,cpx1:v,cpy1:y,cpx2:g,cpy2:_}),r.setStyle(a.getItemStyle()),r.style.fill){case"source":r.style.fill=t.node1.getVisual("color");break;case"target":r.style.fill=t.node2.getVisual("color")}n.setHoverStyle(r,t.getModel("lineStyle.emphasis").getItemStyle()),l.add(r),h.setItemGraphicEl(t.dataIndex,r)}),o.eachNode(function(t){var r=t.getLayout(),a=t.getModel(),o=a.getModel("label.normal"),i=a.getModel("label.emphasis"),s=new n.Rect({shape:{x:r.x,y:r.y,width:t.getLayout().dx,height:t.getLayout().dy},style:a.getModel("itemStyle.normal").getItemStyle()}),h=t.getModel("itemStyle.emphasis").getItemStyle();n.setLabelStyle(s.style,h,o,i,{labelFetcher:e,labelDataIndex:t.dataIndex,defaultText:t.id,isRectText:!0}),s.setStyle("fill",t.getVisual("color")),n.setHoverStyle(s,h),l.add(s),u.setItemGraphicEl(t.dataIndex,s),s.dataType="node"}),!this._data&&e.get("animation")&&l.setClipPath(a(l.getBoundingRect(),e,function(){l.removeClipPath()})),this._data=e.getData()},dispose:function(){}});e.exports=l},function(e,t,r){"use strict";function a(e,t,r){e.eachSeriesByType("sankey",function(e){var r=e.get("nodeWidth"),a=e.get("nodeGap"),l=n(e,t);e.layoutInfo=l;var s=l.width,u=l.height,h=e.getGraph(),c=h.nodes,d=h.edges;i(c),o(c,d,r,a,s,u,0!==k.filter(c,function(e){return 0===e.getLayout().value}).length?0:e.get("layoutIterations"))})}function n(e,t){return L.getLayoutRect(e.getBoxLayoutParams(),{width:t.getWidth(),height:t.getHeight()})}function o(e,t,r,a,n,o,i){l(e,r,n),h(e,t,o,a,i),y(e)}function i(e){k.each(e,function(e){var t=T(e.outEdges,b),r=T(e.inEdges,b),a=Math.max(t,r);e.setLayout({value:a},!0)})}function l(e,t,r){for(var a=e,n=null,o=0,i=0;a.length;){n=[];for(var l=0,h=a.length;l<h;l++){var c=a[l];c.setLayout({x:o},!0),c.setLayout({dx:t},!0);for(var d=0,m=c.outEdges.length;d<m;d++)n.push(c.outEdges[d].node2)}a=n,++o}s(e,o),i=(r-t)/(o-1),u(e,i)}function s(e,t){k.each(e,function(e){e.outEdges.length||e.setLayout({x:t-1},!0)})}function u(e,t){k.each(e,function(e){var r=e.getLayout().x*t;e.setLayout({x:r},!0)})}function h(e,t,r,a,n){var o=S().key(function(e){return e.getLayout().x}).sortKeys(N).entries(e).map(function(e){return e.values});c(e,o,t,r,a),d(o,a,r);for(var i=1;n>0;n--)i*=.99,m(o,i),d(o,a,r),f(o,i),d(o,a,r)}function c(e,t,r,a,n){var o=[];k.each(t,function(e){var t=e.length,r=0;k.each(e,function(e){r+=e.getLayout().value});var i=(a-(t-1)*n)/r;o.push(i)}),o.sort(function(e,t){return e-t});var i=o[0];k.each(t,function(e){k.each(e,function(e,t){e.setLayout({y:t},!0);var r=e.getLayout().value*i;e.setLayout({dy:r},!0)})}),k.each(r,function(e){var t=+e.getValue()*i;e.setLayout({dy:t},!0)})}function d(e,t,r){k.each(e,function(e){var a,n,o,i=0,l=e.length;for(e.sort(w),o=0;o<l;o++){if(a=e[o],(n=i-a.getLayout().y)>0){var s=a.getLayout().y+n;a.setLayout({y:s},!0)}i=a.getLayout().y+a.getLayout().dy+t}if((n=i-t-r)>0){var s=a.getLayout().y-n;for(a.setLayout({y:s},!0),i=a.getLayout().y,o=l-2;o>=0;--o)a=e[o],n=a.getLayout().y+a.getLayout().dy+t-i,n>0&&(s=a.getLayout().y-n,a.setLayout({y:s},!0)),i=a.getLayout().y}})}function m(e,t){k.each(e.slice().reverse(),function(e){k.each(e,function(e){if(e.outEdges.length){var r=T(e.outEdges,p)/T(e.outEdges,b),a=e.getLayout().y+(r-x(e))*t;e.setLayout({y:a},!0)}})})}function p(e){return x(e.node2)*e.getValue()}function f(e,t){k.each(e,function(e){k.each(e,function(e){if(e.inEdges.length){var r=T(e.inEdges,v)/T(e.inEdges,b),a=e.getLayout().y+(r-x(e))*t;e.setLayout({y:a},!0)}})})}function v(e){return x(e.node1)*e.getValue()}function y(e){k.each(e,function(e){e.outEdges.sort(g),e.inEdges.sort(_)}),k.each(e,function(e){var t=0,r=0;k.each(e.outEdges,function(e){e.setLayout({sy:t},!0),t+=e.getLayout().dy}),k.each(e.inEdges,function(e){e.setLayout({ty:r},!0),r+=e.getLayout().dy})})}function g(e,t){return e.node2.getLayout().y-t.node2.getLayout().y}function _(e,t){return e.node1.getLayout().y-t.node1.getLayout().y}function T(e,t){for(var r=0,a=e.length,n=-1;++n<a;){var o=+t.call(e,e[n],n);isNaN(o)||(r+=o)}return r}function x(e){return e.getLayout().y+e.getLayout().dy/2}function w(e,t){return e.getLayout().y-t.getLayout().y}function N(e,t){return e<t?-1:e>t?1:e===t?0:NaN}function b(e){return e.getValue()}var L=r(11),S=r(378),k=r(0);e.exports=a},function(e,t,r){"use strict";function a(e,t){e.eachSeriesByType("sankey",function(e){var t=e.getGraph(),r=t.nodes;r.sort(function(e,t){return e.getLayout().value-t.getLayout().value});var a=r[0].getLayout().value,i=r[r.length-1].getLayout().value;o.each(r,function(t){var r=new n({type:"color",mappingMethod:"linear",dataExtent:[a,i],visual:e.get("color")}),o=r.mapValueToVisual(t.getLayout().value);t.setVisual("color",o);var l=t.getModel(),s=l.get("itemStyle.normal.color");null!=s&&t.setVisual("color",s)})})}var n=r(93),o=r(0);e.exports=a},function(e,t,r){"use strict";var a=r(2),n=r(0);r(816),r(817);var o=r(94),i=r(250);r(133),a.registerVisual(n.curry(o,"scatter","circle",null)),a.registerLayout(n.curry(i,"scatter"))},function(e,t,r){"use strict";var a=r(69),n=r(27),o=n.extend({type:"series.scatter",dependencies:["grid","polar","geo","singleAxis","calendar"],getInitialData:function(e,t){return a(e.data,this,t)},brushSelector:"point",defaultOption:{coordinateSystem:"cartesian2d",zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,symbolSize:10,large:!1,largeThreshold:2e3,itemStyle:{normal:{opacity:.8}}}});e.exports=o},function(e,t,r){"use strict";var a=r(2),n=r(128),o=r(776);a.extendChartView({type:"scatter",init:function(){this._normalSymbolDraw=new n,this._largeSymbolDraw=new o},render:function(e,t,r){var a=e.getData(),n=this._largeSymbolDraw,o=this._normalSymbolDraw,i=this.group,l=e.get("large")&&a.count()>e.get("largeThreshold")?n:o;this._symbolDraw=l,l.updateData(a),i.add(l.group),i.remove(l===n?o.group:n.group)},updateLayout:function(e){this._symbolDraw.updateLayout(e)},remove:function(e,t){this._symbolDraw&&this._symbolDraw.remove(t,!0)},dispose:function(){}})},function(e,t,r){"use strict";var a=r(2),n=r(0);r(359),r(819),r(820);var o=r(821),i=r(822),l=r(169);a.registerLayout(o),a.registerVisual(i),a.registerProcessor(n.curry(l,"themeRiver"))},function(e,t,r){"use strict";var a=r(45),n=r(27),o=r(23),i=r(0),l=r(14),s=l.encodeHTML,u=r(378),h=n.extend({type:"series.themeRiver",dependencies:["singleAxis"],nameMap:null,init:function(e){h.superApply(this,"init",arguments),this.legendDataProvider=function(){return this.getRawData()}},fixData:function(e){for(var t=e.length,r=u().key(function(e){return e[2]}).entries(e),a=i.map(r,function(e){return{name:e.key,dataList:e.values}}),n=a.length,o=-1,l=-1,s=0;s<n;++s){var h=a[s].dataList.length;h>o&&(o=h,l=s)}for(var c=0;c<n;++c)if(c!==l)for(var d=a[c].name,m=0;m<o;++m){for(var p=a[l].dataList[m][0],f=a[c].dataList.length,v=-1,y=0;y<f;++y){var g=a[c].dataList[y][0];if(g===p){v=y;break}}-1===v&&(e[t]=[],e[t][0]=p,e[t][1]=0,e[t][2]=d,t++)}return e},getInitialData:function(e,t){var r=[],n=t.queryComponents({mainType:"singleAxis",index:this.get("singleAxisIndex"),id:this.get("singleAxisId")})[0],l=n.get("type");r=[{name:"time",type:"category"===l?"ordinal":"time"===l?"time":"float"},{name:"value",type:"float"},{name:"name",type:"ordinal"}];for(var s=i.filter(e.data,function(e){return void 0!==e[2]}),u=this.fixData(s||[]),h=[],c=this.nameMap=i.createHashMap(),d=0,m=0;m<u.length;++m)h.push(u[m][2]),c.get(u[m][2])||(c.set(u[m][2],d),d++);r=a(r,u);var p=new o(r,this);return p.initData(u,h),p},coordDimToDataDim:function(e){return["time"]},getLayerSeries:function(){function e(e,r){return t.get("time",e)-t.get("time",r)}for(var t=this.getData(),r=t.count(),a=[],n=0;n<r;++n)a[n]=n;for(var o=u().key(function(e){return t.get("name",e)}).entries(a),l=i.map(o,function(e){return{name:e.key,indices:e.values}}),s=0;s<l.length;++s)l[s].indices.sort(e);return l},getAxisTooltipData:function(e,t,r){i.isArray(e)||(e=e?[e]:[]);for(var a,n=this.getData(),o=this.getLayerSeries(),l=[],s=o.length,u=0;u<s;++u){for(var h=Number.MAX_VALUE,c=-1,d=o[u].indices.length,m=0;m<d;++m){var p=n.get(e[0],o[u].indices[m]),f=Math.abs(p-t);f<=h&&(a=p,h=f,c=o[u].indices[m])}l.push(c)}return{dataIndices:l,nestestValue:a}},formatTooltip:function(e){var t=this.getData(),r=t.get("name",e),a=t.get("value",e);return(isNaN(a)||null==a)&&(a="-"),s(r+" : "+a)},defaultOption:{zlevel:0,z:2,coordinateSystem:"singleAxis",boundaryGap:["10%","10%"],singleAxisIndex:0,animationEasing:"linear",label:{normal:{margin:4,textAlign:"right",show:!0,position:"left",color:"#000",fontSize:11},emphasis:{show:!0}}}}),c=h;e.exports=c},function(e,t,r){"use strict";function a(e,t,r){var a=new l.Rect({shape:{x:e.x-10,y:e.y-10,width:0,height:e.height+20}});return l.initProps(a,{shape:{width:e.width+20,height:e.height+20}},t,r),a}var n=r(2),o=r(338),i=o.Polygon,l=r(3),s=r(0),u=s.bind,h=s.extend,c=r(112),d=n.extendChartView({type:"themeRiver",init:function(){this._layers=[]},render:function(e,t,r){function n(e){return e.name}function o(t,r,n){var o=this._layers;if("remove"===t)return void d.remove(o[r]);for(var u,c=[],p=[],f=m[r].indices,v=0;v<f.length;v++){var y=s.getItemLayout(f[v]),_=y.x,T=y.y0,x=y.y;c.push([_,T]),p.push([_,T+x]),u=s.getItemVisual(f[v],"color")}var w,N,b=s.getItemLayout(f[0]),L=s.getItemModel(f[v-1]),S=L.getModel("label.normal"),k=S.get("margin");if("add"===t){var D=g[r]=new l.Group;w=new i({shape:{points:c,stackedOnPoints:p,smooth:.4,stackedOnSmooth:.4,smoothConstraint:!1},z2:0}),N=new l.Text({style:{x:b.x-k,y:b.y0+b.y/2}}),D.add(w),D.add(N),d.add(D),w.setClipPath(a(w.getBoundingRect(),e,function(){w.removeClipPath()}))}else{var D=o[n];w=D.childAt(0),N=D.childAt(1),d.add(D),g[r]=D,l.updateProps(w,{shape:{points:c,stackedOnPoints:p}},e),l.updateProps(N,{style:{x:b.x-k,y:b.y0+b.y/2}},e)}var M=L.getModel("itemStyle.emphasis"),A=L.getModel("itemStyle.normal");l.setTextStyle(N.style,S,{text:S.get("show")?e.getFormattedLabel(f[v-1],"normal")||s.getName(f[v-1]):null,textVerticalAlign:"middle"}),w.setStyle(h({fill:u},A.getItemStyle(["color"]))),l.setHoverStyle(w,M.getItemStyle())}var s=e.getData(),d=this.group,m=e.getLayerSeries(),p=s.getLayout("layoutInfo"),f=p.rect,v=p.boundaryGap;d.attr("position",[0,f.y+v[0]]);var y=new c(this._layersSeries||[],m,n,n),g={};y.add(u(o,this,"add")).update(u(o,this,"update")).remove(u(o,this,"remove")).execute(),this._layersSeries=m,this._layers=g},dispose:function(){}});e.exports=d},function(e,t,r){"use strict";function a(e,t){e.eachSeriesByType("themeRiver",function(e){var t=e.getData(),r=e.coordinateSystem,a={},o=r.getRect();a.rect=o;var i=e.get("boundaryGap"),s=r.getAxis();a.boundaryGap=i,"horizontal"===s.orient?(i[0]=l.parsePercent(i[0],o.height),i[1]=l.parsePercent(i[1],o.height),n(t,e,o.height-i[0]-i[1])):(i[0]=l.parsePercent(i[0],o.width),i[1]=l.parsePercent(i[1],o.width),n(t,e,o.width-i[0]-i[1])),t.setLayout("layoutInfo",a)})}function n(e,t,r){if(e.count())for(var a,n=t.coordinateSystem,l=t.getLayerSeries(),s=i.map(l,function(t){return i.map(t.indices,function(t){var r=n.dataToPoint(e.get("time",t));return r[1]=e.get("value",t),r})}),u=o(s),h=u.y0,c=r/u.max,d=l.length,m=l[0].indices.length,p=0;p<m;++p){a=h[p]*c,e.setItemLayout(l[0].indices[p],{layerIndex:0,x:s[0][p][0],y0:a,y:s[0][p][1]*c});for(var f=1;f<d;++f)a+=s[f-1][p][1]*c,e.setItemLayout(l[f].indices[p],{layerIndex:f,x:s[f][p][0],y0:a,y:s[f][p][1]*c})}}function o(e){for(var t,r=e.length,a=e[0].length,n=[],o=[],i=0,l={},s=0;s<a;++s){for(var u=0,t=0;u<r;++u)t+=e[u][s][1];t>i&&(i=t),n.push(t)}for(var h=0;h<a;++h)o[h]=(i-n[h])/2;i=0;for(var c=0;c<a;++c){var d=n[c]+o[c];d>i&&(i=d)}return l.y0=o,l.max=i,l}var i=r(0),l=r(4);e.exports=a},function(e,t,r){"use strict";function a(e){e.eachSeriesByType("themeRiver",function(e){var t=e.getData(),r=e.getRawData(),a=e.get("color"),n=o();t.each(function(e){n.set(t.getRawIndex(e),e)}),r.each(function(o){var i=r.getName(o),l=a[(e.nameMap.get(i)-1)%a.length];r.setItemVisual(o,"color",l);var s=n.get(o);null!=s&&t.setItemVisual(s,"color",l)})})}var n=r(0),o=n.createHashMap;e.exports=a},function(e,t,r){"use strict";var a=r(2),n=r(0);r(824),r(825),r(829);var o=r(94),i=r(826),l=r(827);a.registerVisual(n.curry(o,"tree","circle",null)),a.registerLayout(i),a.registerLayout(l)},function(e,t,r){"use strict";var a=r(27),n=r(373),o=r(14),i=o.encodeHTML,l=a.extend({type:"series.tree",layoutInfo:null,layoutMode:"box",getInitialData:function(e){var t={name:e.name,children:e.data},r=e.leaves||{},a={};a.leaves=r;var o=n.createTree(t,this,a),i=0;o.eachNode("preorder",function(e){e.depth>i&&(i=e.depth)});var l=e.expandAndCollapse,s=l&&e.initialTreeDepth>=0?e.initialTreeDepth:i;return o.root.eachNode("preorder",function(e){var t=e.hostTree.data.getRawDataItem(e.dataIndex);e.isExpand=t&&null!=t.collapsed?!t.collapsed:e.depth<=s}),o.data},formatTooltip:function(e){for(var t=this.getData().tree,r=t.root.children[0],a=t.getNodeByDataIndex(e),n=a.getValue(),o=a.name;a&&a!==r;)o=a.parentNode.name+"."+o,a=a.parentNode;return i(o+(isNaN(n)||null==n?"":" : "+n))},defaultOption:{zlevel:0,z:2,left:"12%",top:"12%",right:"12%",bottom:"12%",layout:"orthogonal",orient:"horizontal",symbol:"emptyCircle",symbolSize:7,expandAndCollapse:!0,initialTreeDepth:2,lineStyle:{normal:{color:"#ccc",width:1.5,curveness:.5}},itemStyle:{normal:{color:"lightsteelblue",borderColor:"#c23531",borderWidth:1.5}},label:{normal:{show:!0,color:"#555"}},leaves:{label:{normal:{show:!0}}},animationEasing:"linear",animationDuration:700,animationDurationUpdate:1e3}});e.exports=l},function(e,t,r){"use strict";function a(e,t){var r=e.getItemLayout(t);return r&&!isNaN(r.x)&&!isNaN(r.y)&&"none"!==e.getItemVisual(t,"symbol")}function n(e,t,r){return r.itemModel=t,r.itemStyle=t.getModel("itemStyle.normal").getItemStyle(),r.hoverItemStyle=t.getModel("itemStyle.emphasis").getItemStyle(),r.lineStyle=t.getModel("lineStyle.normal").getLineStyle(),r.labelModel=t.getModel("label.normal"),r.hoverLabelModel=t.getModel("label.emphasis"),!1===e.isExpand&&0!==e.children.length?r.symbolInnerColor=r.itemStyle.fill:r.symbolInnerColor="#fff",r}function o(e,t,r,a,o,i){var c=!r,d=e.tree.getNodeByDataIndex(t),m=d.getModel(),i=n(d,m,i),p=e.tree.root,f=d.parentNode===p?d:d.parentNode||d,v=e.getItemGraphicEl(f.dataIndex),y=f.getLayout(),g=v?{x:v.position[0],y:v.position[1],rawX:v.__radialOldRawX,rawY:v.__radialOldRawY}:y,_=d.getLayout();c?(r=new h(e,t,i),r.attr("position",[g.x,g.y])):r.updateData(e,t,i),r.__radialOldRawX=r.__radialRawX,r.__radialOldRawY=r.__radialRawY,r.__radialRawX=_.rawX,r.__radialRawY=_.rawY,a.add(r),e.setItemGraphicEl(t,r),u.updateProps(r,{position:[_.x,_.y]},o);var T=r.getSymbolPath();if("radial"===i.layout){var x,w,N=p.children[0],b=N.getLayout(),L=N.children.length;if(_.x===b.x&&!0===d.isExpand){var S={};S.x=(N.children[0].getLayout().x+N.children[L-1].getLayout().x)/2,S.y=(N.children[0].getLayout().y+N.children[L-1].getLayout().y)/2,x=Math.atan2(S.y-b.y,S.x-b.x),x<0&&(x=2*Math.PI+x),(w=S.x<b.x)&&(x-=Math.PI)}else x=Math.atan2(_.y-b.y,_.x-b.x),x<0&&(x=2*Math.PI+x),0===d.children.length||0!==d.children.length&&!1===d.isExpand?(w=_.x<b.x)&&(x-=Math.PI):(w=_.x>b.x)||(x-=Math.PI);var k=w?"left":"right";T.setStyle({textPosition:k,textRotation:-x,textOrigin:"center",verticalAlign:"middle"})}if(d.parentNode&&d.parentNode!==p){var D=r.__edge;D||(D=r.__edge=new u.BezierCurve({shape:l(i,g,g),style:s.defaults({opacity:0},i.lineStyle)})),u.updateProps(D,{shape:l(i,y,_),style:{opacity:1}},o),a.add(D)}}function i(e,t,r,a,o,i){for(var s,h=e.tree.getNodeByDataIndex(t),c=e.tree.root,d=h.getModel(),i=n(h,d,i),m=h.parentNode===c?h:h.parentNode||h;null==(s=m.getLayout());)m=m.parentNode===c?m:m.parentNode||m;u.updateProps(r,{position:[s.x+1,s.y+1]},o,function(){a.remove(r),e.setItemGraphicEl(t,null)}),r.fadeOut(null,{keepLabel:!0});var p=r.__edge;p&&u.updateProps(p,{shape:l(i,s,s),style:{opacity:0}},o,function(){a.remove(p)})}function l(e,t,r){var a,n,o,i,l=e.orient;if("radial"===e.layout){var s=t.rawX,u=t.rawY,h=r.rawX,c=r.rawY,m=d(s,u),p=d(s,u+(c-u)*e.curvature),f=d(h,c+(u-c)*e.curvature),v=d(h,c);return{x1:m.x,y1:m.y,x2:v.x,y2:v.y,cpx1:p.x,cpy1:p.y,cpx2:f.x,cpy2:f.y}}var s=t.x,u=t.y,h=r.x,c=r.y;return"horizontal"===l&&(a=s+(h-s)*e.curvature,n=u,o=h+(s-h)*e.curvature,i=c),"vertical"===l&&(a=s,n=u+(c-u)*e.curvature,o=h,i=c+(u-c)*e.curvature),{x1:s,y1:u,x2:h,y2:c,cpx1:a,cpy1:n,cpx2:o,cpy2:i}}var s=r(0),u=r(3),h=r(162),c=r(340),d=c.radialCoordinate,m=r(2),p=m.extendChartView({type:"tree",init:function(e,t){this._oldTree,this._mainGroup=new u.Group,this.group.add(this._mainGroup)},render:function(e,t,r,n){var l=e.getData(),s=e.layoutInfo,u=this._mainGroup,h=e.get("layout");"radial"===h?u.attr("position",[s.x+s.width/2,s.y+s.height/2]):u.attr("position",[s.x,s.y]);var c=this._data,d={expandAndCollapse:e.get("expandAndCollapse"),layout:h,orient:e.get("orient"),curvature:e.get("lineStyle.normal.curveness"),symbolRotate:e.get("symbolRotate"),symbolOffset:e.get("symbolOffset"),hoverAnimation:e.get("hoverAnimation"),useNameLabel:!0,fadeIn:!0};l.diff(c).add(function(t){a(l,t)&&o(l,t,null,u,e,d)}).update(function(t,r){var n=c.getItemGraphicEl(r);if(!a(l,t))return void(n&&i(l,t,n,u,e,d));o(l,t,n,u,e,d)}).remove(function(t){var r=c.getItemGraphicEl(t);i(l,t,r,u,e,d)}).execute(),!0===d.expandAndCollapse&&l.eachItemGraphicEl(function(t,a){t.off("click").on("click",function(){r.dispatchAction({type:"treeExpandAndCollapse",seriesId:e.id,dataIndex:a})})}),this._data=l},dispose:function(){},remove:function(){this._mainGroup.removeAll(),this._data=null}});e.exports=p},function(e,t,r){"use strict";function a(e,t){e.eachSeriesByType("tree",function(e){n(e,t)})}var n=r(339);e.exports=a},function(e,t,r){"use strict";function a(e,t){e.eachSeriesByType("tree",function(e){n(e,t)})}var n=r(339);e.exports=a},function(e,t,r){"use strict";function a(e,t,r){for(var a,n=[e],o=[];a=n.pop();)if(o.push(a),a.isExpand){var i=a.children;if(i.length)for(var l=0;l<i.length;l++)n.push(i[l])}for(;a=o.pop();)t(a,r)}function n(e,t){for(var r,a=[e];r=a.pop();)if(t(r),r.isExpand){var n=r.children;if(n.length)for(var o=n.length-1;o>=0;o--)a.push(n[o])}}t.eachAfter=a,t.eachBefore=n},function(e,t,r){"use strict";r(2).registerAction({type:"treeExpandAndCollapse",event:"treeExpandAndCollapse",update:"update"},function(e,t){t.eachComponent({mainType:"series",subType:"tree",query:e},function(t){var r=e.dataIndex,a=t.getData().tree,n=a.getNodeByDataIndex(r);n.isExpand=!n.isExpand})})},function(e,t,r){"use strict";var a=r(2);r(832),r(833),r(834);var n=r(836),o=r(835);a.registerVisual(n),a.registerLayout(o)},function(e,t,r){"use strict";function a(e){this.group=new i.Group,e.add(this.group)}function n(e,t,r,a,n,o){var i=[[n?e:e-c,t],[e+r,t],[e+r,t+a],[n?e:e-c,t+a]];return!o&&i.splice(2,0,[e+r+c,t+a/2]),!n&&i.push([e,t+a/2]),i}function o(e,t,r){e.eventData={componentType:"series",componentSubType:"treemap",seriesIndex:t.componentIndex,seriesName:t.name,seriesType:"treemap",selfType:"breadcrumb",nodeData:{dataIndex:r&&r.dataIndex,name:r&&r.name},treePathInfo:r&&h(r,t)}}var i=r(3),l=r(11),s=r(0),u=r(129),h=u.wrapTreePathInfo,c=5;a.prototype={constructor:a,render:function(e,t,r,a){var n=e.getModel("breadcrumb"),o=this.group;if(o.removeAll(),n.get("show")&&r){var i=n.getModel("itemStyle.normal"),s=i.getModel("textStyle"),u={pos:{left:n.get("left"),right:n.get("right"),top:n.get("top"),bottom:n.get("bottom")},box:{width:t.getWidth(),height:t.getHeight()},emptyItemWidth:n.get("emptyItemWidth"),totalWidth:0,renderList:[]};this._prepare(r,u,s),this._renderContent(e,u,i,s,a),l.positionElement(o,u.pos,u.box)}},_prepare:function(e,t,r){for(var a=e;a;a=a.parentNode){var n=a.getModel().get("name"),o=r.getTextRect(n),i=Math.max(o.width+16,t.emptyItemWidth);t.totalWidth+=i+8,t.renderList.push({node:a,text:n,width:i})}},_renderContent:function(e,t,r,a,u){for(var h=0,c=t.emptyItemWidth,d=e.get("breadcrumb.height"),m=l.getAvailableSize(t.pos,t.box),p=t.totalWidth,f=t.renderList,v=f.length-1;v>=0;v--){var y=f[v],g=y.node,_=y.width,T=y.text;p>m.width&&(p-=_-c,_=c,T=null);var x=new i.Polygon({shape:{points:n(h,0,_,d,v===f.length-1,0===v)},style:s.defaults(r.getItemStyle(),{lineJoin:"bevel",text:T,textFill:a.getTextColor(),textFont:a.getFont()}),z:10,onclick:s.curry(u,g)});this.group.add(x),o(x,e,g),h+=_+8}},remove:function(){this.group.removeAll()}};var d=a;e.exports=d},function(e,t,r){"use strict";function a(e){var t=0;o.each(e.children,function(e){a(e);var r=e.value;o.isArray(r)&&(r=r[0]),t+=r});var r=e.value;o.isArray(r)&&(r=r[0]),(null==r||isNaN(r))&&(r=t),r<0&&(r=0),o.isArray(e.value)?e.value[0]=r:e.value=r}function n(e,t){var r=t.get("color");if(r){e=e||[];var a;return o.each(e,function(e){var t=new s(e),r=t.get("color");(t.get("itemStyle.normal.color")||r&&"none"!==r)&&(a=!0)}),a||((e[0]||(e[0]={})).color=r.slice()),e}}var o=r(0),i=r(27),l=r(373),s=r(20),u=r(14),h=u.encodeHTML,c=u.addCommas,d=r(129),m=d.wrapTreePathInfo,p=i.extend({type:"series.treemap",layoutMode:"box",dependencies:["grid","polar"],_viewRoot:null,defaultOption:{progressive:0,hoverLayerThreshold:1/0,left:"center",top:"middle",right:null,bottom:null,width:"80%",height:"80%",sort:!0,clipWindow:"origin",squareRatio:.5*(1+Math.sqrt(5)),leafDepth:null,drillDownIcon:"▶",zoomToNodeRatio:.1024,roam:!0,nodeClick:"zoomToNode",animation:!0,animationDurationUpdate:900,animationEasing:"quinticInOut",breadcrumb:{show:!0,height:22,left:"center",top:"bottom",emptyItemWidth:25,itemStyle:{normal:{color:"rgba(0,0,0,0.7)",borderColor:"rgba(255,255,255,0.7)",borderWidth:1,shadowColor:"rgba(150,150,150,1)",shadowBlur:3,shadowOffsetX:0,shadowOffsetY:0,textStyle:{color:"#fff"}},emphasis:{textStyle:{}}}},label:{normal:{show:!0,distance:0,padding:5,position:"inside",color:"#fff",ellipsis:!0}},upperLabel:{normal:{show:!1,position:[0,"50%"],height:20,color:"#fff",ellipsis:!0,verticalAlign:"middle"},emphasis:{show:!0,position:[0,"50%"],color:"#fff",ellipsis:!0,verticalAlign:"middle"}},itemStyle:{normal:{color:null,colorAlpha:null,colorSaturation:null,borderWidth:0,gapWidth:0,borderColor:"#fff",borderColorSaturation:null},emphasis:{}},visualDimension:0,visualMin:null,visualMax:null,color:[],colorAlpha:null,colorSaturation:null,colorMappingBy:"index",visibleMin:10,childrenVisibleMin:null,levels:[]},getInitialData:function(e,t){var r={name:e.name,children:e.data};a(r);var o=e.levels||[];o=e.levels=n(o,t);var i={};return i.levels=o,l.createTree(r,this,i).data},optionUpdated:function(){this.resetViewRoot()},formatTooltip:function(e){var t=this.getData(),r=this.getRawValue(e),a=c(o.isArray(r)?r[0]:r),n=t.getName(e);return h(n+": "+a)},getDataParams:function(e){var t=i.prototype.getDataParams.apply(this,arguments),r=this.getData().tree.getNodeByDataIndex(e);return t.treePathInfo=m(r,this),t},setLayoutInfo:function(e){this.layoutInfo=this.layoutInfo||{},o.extend(this.layoutInfo,e)},mapIdToIndex:function(e){var t=this._idIndexMap;t||(t=this._idIndexMap=o.createHashMap(),this._idIndexMapCount=0);var r=t.get(e);return null==r&&t.set(e,r=this._idIndexMapCount++),r},getViewRoot:function(){return this._viewRoot},resetViewRoot:function(e){e?this._viewRoot=e:e=this._viewRoot;var t=this.getData().tree.root;e&&(e===t||t.contains(e))||(this._viewRoot=t)}});e.exports=p},function(e,t,r){"use strict";function a(){return{nodeGroup:[],background:[],content:[]}}function n(e,t,r,a,n,i,u,h,c,d){function m(e,t){z?!e.invisible&&i.push(e):(t(),e.__tmWillVisible||(e.invisible=!1))}function p(t,r,a,n,o,i){var h=u.getModel(),c=l.retrieve(e.getFormattedLabel(u.dataIndex,"normal",null,null,i?"upperLabel":"label"),h.get("name"));if(!i&&T.isLeafRoot){var d=e.get("drillDownIcon",!0);c=d?d+" "+c:c}var m=h.getModel(i?N:x),p=h.getModel(i?b:w),f=m.getShallow("show");s.setLabelStyle(t,r,m,p,{defaultText:f?c:null,autoColor:a,isRectText:!0}),i&&(t.textRect=l.clone(i)),t.truncate=f&&m.get("ellipsis")?{outerWidth:n,outerHeight:o,minChar:2}:null}function f(e,a,i,l){var s=null!=R&&r[e][R],u=n[e];return s?(r[e][R]=null,v(u,s,e)):z||(s=new a({z:o(i,l)}),s.__tmDepth=i,s.__tmStorageName=e,y(u,s,e)),t[e][C]=s}function v(e,t,r){(e[C]={}).old="nodeGroup"===r?t.position.slice():l.extend({},t.shape)}function y(e,t,r){var o=e[C]={},i=u.parentNode;if(i&&(!a||"drillDown"===a.direction)){var l=0,s=0,h=n.background[i.getRawIndex()];!a&&h&&h.old&&(l=h.old.width,s=h.old.height),o.old="nodeGroup"===r?[0,s]:{x:l,y:s,width:0,height:0}}o.fadein="nodeGroup"!==r}if(u){var T=u.getLayout();if(T&&T.isInView){var L=T.width,A=T.height,I=T.borderWidth,z=T.invisible,C=u.getRawIndex(),R=h&&h.getRawIndex(),E=u.viewChildren,P=T.upperHeight,O=E&&E.length,F=u.getModel("itemStyle.normal"),j=u.getModel("itemStyle.emphasis"),B=f("nodeGroup",g);if(B){if(c.add(B),B.attr("position",[T.x||0,T.y||0]),B.__tmNodeWidth=L,B.__tmNodeHeight=A,T.isAboveViewRoot)return B;var H=f("background",_,d,S);if(H&&function(t,r,a){r.dataIndex=u.dataIndex,r.seriesIndex=e.seriesIndex,r.setShape({x:0,y:0,width:L,height:A});var n=u.getVisual("borderColor",!0),o=j.get("borderColor");m(r,function(){var e=M(F);e.fill=n;var t=D(j);if(t.fill=o,a){var i=L-2*I;p(e,t,n,i,P,{x:I,y:0,width:i,height:P})}else e.text=t.text=null;r.setStyle(e),s.setHoverStyle(r,t)}),t.add(r)}(B,H,O&&T.upperHeight),!O){var V=f("content",_,d,k);V&&function(t,r){r.dataIndex=u.dataIndex,r.seriesIndex=e.seriesIndex;var a=Math.max(L-2*I,0),n=Math.max(A-2*I,0);r.culling=!0,r.setShape({x:I,y:I,width:a,height:n});var o=u.getVisual("color",!0);m(r,function(){var e=M(F);e.fill=o;var t=D(j);p(e,t,o,a,n),r.setStyle(e),s.setHoverStyle(r,t)}),t.add(r)}(B,V)}return B}}}}function o(e,t){var r=e*L+t;return(r-1)/r}var i=r(2),l=r(0),s=r(3),u=r(112),h=r(129),c=r(831),d=r(166),m=r(19),p=r(40),f=r(976),v=r(114),y=l.bind,g=s.Group,_=s.Rect,T=l.each,x=["label","normal"],w=["label","emphasis"],N=["upperLabel","normal"],b=["upperLabel","emphasis"],L=10,S=1,k=2,D=v([["fill","color"],["stroke","strokeColor"],["lineWidth","strokeWidth"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]),M=function(e){var t=D(e);return t.stroke=t.fill=t.lineWidth=null,t},A=i.extendChartView({type:"treemap",init:function(e,t){this._containerGroup,this._storage=a(),this._oldTree,this._breadcrumb,this._controller,this._state="ready"},render:function(e,t,r,a){var n=t.findComponents({mainType:"series",subType:"treemap",query:a});if(!(l.indexOf(n,e)<0)){this.seriesModel=e,this.api=r,this.ecModel=t;var o=h.retrieveTargetInfo(a,e),i=a&&a.type,s=e.layoutInfo,u=!this._oldTree,c=this._storage,d="treemapRootToNode"===i&&o&&c?{rootNodeGroup:c.nodeGroup[o.node.getRawIndex()],direction:a.direction}:null,m=this._giveContainerGroup(s),p=this._doRender(m,e,d);u||i&&"treemapZoomToNode"!==i&&"treemapRootToNode"!==i?p.renderFinally():this._doAnimation(m,p,e,d),this._resetController(r),this._renderBreadcrumb(e,r,o)}},_giveContainerGroup:function(e){var t=this._containerGroup;return t||(t=this._containerGroup=new g,this._initEvents(t),this.group.add(t)),t.attr("position",[e.x,e.y]),t},_doRender:function(e,t,r){function o(e,t,r,a,n){function i(e){return e.getId()}function s(i,l){var s=null!=i?e[i]:null,u=null!=l?t[l]:null,h=f(s,u,r,n);h&&o(s&&s.viewChildren||[],u&&u.viewChildren||[],h,a,n+1)}a?(t=e,T(e,function(e,t){!e.isRemoved()&&s(t,t)})):new u(t,e,i,i).add(s).update(s).remove(l.curry(s,null)).execute()}function i(){T(v,function(e){T(e,function(e){e.parent&&e.parent.remove(e)})}),T(p,function(e){e.invisible=!0,e.dirty()})}var s=t.getData().tree,h=this._oldTree,c=a(),d=a(),m=this._storage,p=[],f=l.curry(n,t,d,m,r,c,p);o(s.root?[s.root]:[],h&&h.root?[h.root]:[],e,s===h||!h,0);var v=function(e){var t=a();return e&&T(e,function(e,r){var a=t[r];T(e,function(e){e&&(a.push(e),e.__tmWillDelete=1)})}),t}(m);return this._oldTree=s,this._storage=d,{lastsForAnimation:c,willDeleteEls:v,renderFinally:i}},_doAnimation:function(e,t,r,a){if(r.get("animation")){var n=r.get("animationDurationUpdate"),o=r.get("animationEasing"),i=f.createWrap();T(t.willDeleteEls,function(e,t){T(e,function(e,r){if(!e.invisible){var l,s=e.parent;if(a&&"drillDown"===a.direction)l=s===a.rootNodeGroup?{shape:{x:0,y:0,width:s.__tmNodeWidth,height:s.__tmNodeHeight},style:{opacity:0}}:{style:{opacity:0}};else{var u=0,h=0;s.__tmWillDelete||(u=s.__tmNodeWidth/2,h=s.__tmNodeHeight/2),l="nodeGroup"===t?{position:[u,h],style:{opacity:0}}:{shape:{x:u,y:h,width:0,height:0},style:{opacity:0}}}l&&i.add(e,l,n,o)}})}),T(this._storage,function(e,r){T(e,function(e,a){var s=t.lastsForAnimation[r][a],u={};s&&("nodeGroup"===r?s.old&&(u.position=e.position.slice(),e.attr("position",s.old)):(s.old&&(u.shape=l.extend({},e.shape),e.setShape(s.old)),s.fadein?(e.setStyle("opacity",0),u.style={opacity:1}):1!==e.style.opacity&&(u.style={opacity:1})),i.add(e,u,n,o))})},this),this._state="animating",i.done(y(function(){this._state="ready",t.renderFinally()},this)).start()}},_resetController:function(e){var t=this._controller;t||(t=this._controller=new d(e.getZr()),t.enable(this.seriesModel.get("roam")),t.on("pan",y(this._onPan,this)),t.on("zoom",y(this._onZoom,this)));var r=new m(0,0,e.getWidth(),e.getHeight());t.setPointerChecker(function(e,t,a){return r.contain(t,a)})},_clearController:function(){var e=this._controller;e&&(e.dispose(),e=null)},_onPan:function(e,t){if("animating"!==this._state&&(Math.abs(e)>3||Math.abs(t)>3)){var r=this.seriesModel.getData().tree.root;if(!r)return;var a=r.getLayout();if(!a)return;this.api.dispatchAction({type:"treemapMove",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:a.x+e,y:a.y+t,width:a.width,height:a.height}})}},_onZoom:function(e,t,r){if("animating"!==this._state){var a=this.seriesModel.getData().tree.root;if(!a)return;var n=a.getLayout();if(!n)return;var o=new m(n.x,n.y,n.width,n.height),i=this.seriesModel.layoutInfo;t-=i.x,r-=i.y;var l=p.create();p.translate(l,l,[-t,-r]),p.scale(l,l,[e,e]),p.translate(l,l,[t,r]),o.applyTransform(l),this.api.dispatchAction({type:"treemapRender",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:o.x,y:o.y,width:o.width,height:o.height}})}},_initEvents:function(e){e.on("click",function(e){if("ready"===this._state){var t=this.seriesModel.get("nodeClick",!0);if(t){var r=this.findTarget(e.offsetX,e.offsetY);if(r){var a=r.node;if(a.getLayout().isLeafRoot)this._rootToNode(r);else if("zoomToNode"===t)this._zoomToNode(r);else if("link"===t){var n=a.hostTree.data.getItemModel(a.dataIndex),o=n.get("link",!0),i=n.get("target",!0)||"blank";o&&window.open(o,i)}}}}},this)},_renderBreadcrumb:function(e,t,r){function a(t){"animating"!==this._state&&(h.aboveViewRoot(e.getViewRoot(),t)?this._rootToNode({node:t}):this._zoomToNode({node:t}))}r||(r=null!=e.get("leafDepth",!0)?{node:e.getViewRoot()}:this.findTarget(t.getWidth()/2,t.getHeight()/2))||(r={node:e.getData().tree.root}),(this._breadcrumb||(this._breadcrumb=new c(this.group))).render(e,t,r.node,y(a,this))},remove:function(){this._clearController(),this._containerGroup&&this._containerGroup.removeAll(),this._storage=a(),this._state="ready",this._breadcrumb&&this._breadcrumb.remove()},dispose:function(){this._clearController()},_zoomToNode:function(e){this.api.dispatchAction({type:"treemapZoomToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:e.node})},_rootToNode:function(e){this.api.dispatchAction({type:"treemapRootToNode",from:this.uid,seriesId:this.seriesModel.id,targetNode:e.node})},findTarget:function(e,t){var r;return this.seriesModel.getViewRoot().eachNode({attr:"viewChildren",order:"preorder"},function(a){var n=this._storage.background[a.getRawIndex()];if(n){var o=n.transformCoordToLocal(e,t),i=n.shape;if(!(i.x<=o[0]&&o[0]<=i.x+i.width&&i.y<=o[1]&&o[1]<=i.y+i.height))return!1;r={node:a,offsetX:o[0],offsetY:o[1]}}},this),r}});e.exports=A},function(e,t,r){"use strict";for(var a=r(2),n=r(129),o=function(){},i=["treemapZoomToNode","treemapRender","treemapMove"],l=0;l<i.length;l++)a.registerAction({type:i[l],update:"updateView"},o);a.registerAction({type:"treemapRootToNode",update:"updateView"},function(e,t){function r(t,r){var a=n.retrieveTargetInfo(e,t);if(a){var o=t.getViewRoot();o&&(e.direction=n.aboveViewRoot(o,a.node)?"rollUp":"drillDown"),t.resetViewRoot(a.node)}}t.eachComponent({mainType:"series",subType:"treemap",query:e},r)})},function(e,t,r){"use strict";function a(e,t,r){var a={mainType:"series",subType:"treemap",query:r};e.eachComponent(a,function(e){var a=t.getWidth(),o=t.getHeight(),i=e.option,l=T.getLayoutRect(e.getBoxLayoutParams(),{width:t.getWidth(),height:t.getHeight()}),s=i.size||[],u=g(b(l.width,s[0]),a),h=g(b(l.height,s[1]),o),p=r&&r.type,y=x.retrieveTargetInfo(r,e),_="treemapRender"===p||"treemapMove"===p?r.rootRect:null,w=e.getViewRoot(),N=x.getPathToRoot(w);if("treemapMove"!==p){var S="treemapZoomToNode"===p?c(e,y,w,u,h):_?[_.width,_.height]:[u,h],k=i.sort;k&&"asc"!==k&&"desc"!==k&&(k="desc");var D={squareRatio:i.squareRatio,sort:k,leafDepth:i.leafDepth};w.hostTree.clearLayouts();var M={x:0,y:0,width:S[0],height:S[1],area:S[0]*S[1]};w.setLayout(M),n(w,D,!1,0);var M=w.getLayout();L(N,function(e,t){var r=(N[t+1]||w).getValue();e.setLayout(f.extend({dataExtent:[r,r],borderWidth:0,upperHeight:0},M))})}var A=e.getData().tree.root;A.setLayout(d(l,_,y),!0),e.setLayoutInfo(l),m(A,new v(-l.x,-l.y,a,o),N,w,0)})}function n(e,t,r,a){var i,l;if(!e.isRemoved()){var s=e.getLayout();i=s.width,l=s.height;var c=e.getModel(),d=c.get(S),m=c.get(k)/2,f=p(c),v=Math.max(d,f),y=d-m,g=v-m,c=e.getModel();e.setLayout({borderWidth:d,upperHeight:v,upperLabelHeight:f},!0),i=w(i-2*y,0),l=w(l-y-g,0);var _=i*l,T=o(e,c,_,t,r,a);if(T.length){var x={x:y,y:g,width:i,height:l},b=N(i,l),L=1/0,D=[];D.area=0;for(var M=0,A=T.length;M<A;){var I=T[M];D.push(I),D.area+=I.getLayout().area;var z=u(D,b,t.squareRatio);z<=L?(M++,L=z):(D.area-=D.pop().getLayout().area,h(D,b,x,m,!1),b=N(x.width,x.height),D.length=D.area=0,L=1/0)}if(D.length&&h(D,b,x,m,!0),!r){var C=c.get("childrenVisibleMin");null!=C&&_<C&&(r=!0)}for(var M=0,A=T.length;M<A;M++)n(T[M],t,r,a+1)}}}function o(e,t,r,a,n,o){var u=e.children||[],h=a.sort;"asc"!==h&&"desc"!==h&&(h=null);var c=null!=a.leafDepth&&a.leafDepth<=o;if(n&&!c)return e.viewChildren=[];u=f.filter(u,function(e){return!e.isRemoved()}),l(u,h);var d=s(t,u,h);if(0===d.sum)return e.viewChildren=[];if(d.sum=i(t,r,d.sum,h,u),0===d.sum)return e.viewChildren=[];for(var m=0,p=u.length;m<p;m++){var v=u[m].getValue()/d.sum*r;u[m].setLayout({area:v})}return c&&(u.length&&e.setLayout({isLeafRoot:!0},!0),u.length=0),e.viewChildren=u,e.setLayout({dataExtent:d.dataExtent},!0),u}function i(e,t,r,a,n){if(!a)return r;for(var o=e.get("visibleMin"),i=n.length,l=i,s=i-1;s>=0;s--){var u=n["asc"===a?i-s-1:s].getValue();u/r*t<o&&(l=s,r-=u)}return"asc"===a?n.splice(0,i-l):n.splice(l,i-l),r}function l(e,t){return t&&e.sort(function(e,r){var a="asc"===t?e.getValue()-r.getValue():r.getValue()-e.getValue();return 0===a?"asc"===t?e.dataIndex-r.dataIndex:r.dataIndex-e.dataIndex:a}),e}function s(e,t,r){for(var a=0,n=0,o=t.length;n<o;n++)a+=t[n].getValue();var i,l=e.get("visualDimension");if(t&&t.length)if("value"===l&&r)i=[t[t.length-1].getValue(),t[0].getValue()],"asc"===r&&i.reverse();else{var i=[1/0,-1/0];L(t,function(e){var t=e.getValue(l);t<i[0]&&(i[0]=t),t>i[1]&&(i[1]=t)})}else i=[NaN,NaN];return{sum:a,dataExtent:i}}function u(e,t,r){for(var a,n=0,o=1/0,i=0,l=e.length;i<l;i++)(a=e[i].getLayout().area)&&(a<o&&(o=a),a>n&&(n=a));var s=e.area*e.area,u=t*t*r;return s?w(u*n/s,s/(u*o)):1/0}function h(e,t,r,a,n){var o=t===r.width?0:1,i=1-o,l=["x","y"],s=["width","height"],u=r[l[o]],h=t?e.area/t:0;(n||h>r[s[i]])&&(h=r[s[i]]);for(var c=0,d=e.length;c<d;c++){var m=e[c],p={},f=h?m.getLayout().area/h:0,v=p[s[i]]=w(h-2*a,0),y=r[l[o]]+r[s[o]]-u,g=c===d-1||y<f?y:f,_=p[s[o]]=w(g-2*a,0);p[l[i]]=r[l[i]]+N(a,v/2),p[l[o]]=u+N(a,_/2),u+=g,m.setLayout(p,!0)}r[l[i]]+=h,r[s[i]]-=h}function c(e,t,r,a,n){var o=(t||{}).node,i=[a,n];if(!o||o===r)return i;for(var l,s=a*n,u=s*e.option.zoomToNodeRatio;l=o.parentNode;){for(var h=0,c=l.children,d=0,m=c.length;d<m;d++)h+=c[d].getValue();var f=o.getValue();if(0===f)return i;u*=h/f;var v=l.getModel(),y=v.get(S);u+=4*y*y+(3*y+Math.max(y,p(v)))*Math.pow(u,.5),u>_&&(u=_),o=l}u<s&&(u=s);var g=Math.pow(u/s,.5);return[a*g,n*g]}function d(e,t,r){if(t)return{x:t.x,y:t.y};var a={x:0,y:0};if(!r)return a;var n=r.node,o=n.getLayout();if(!o)return a;for(var i=[o.width/2,o.height/2],l=n;l;){var s=l.getLayout();i[0]+=s.x,i[1]+=s.y,l=l.parentNode}return{x:e.width/2-i[0],y:e.height/2-i[1]}}function m(e,t,r,a,n){var o=e.getLayout(),i=r[n],l=i&&i===e;if(!(i&&!l||n===r.length&&e!==a)){e.setLayout({isInView:!0,invisible:!l&&!t.intersect(o),isAboveViewRoot:l},!0);var s=new v(t.x-o.x,t.y-o.y,t.width,t.height);L(e.viewChildren||[],function(e){m(e,s,r,a,n+1)})}}function p(e){return e.get(D)?e.get(M):0}var f=r(0),v=r(19),y=r(4),g=y.parsePercent,_=y.MAX_SAFE_INTEGER,T=r(11),x=r(129),w=Math.max,N=Math.min,b=f.retrieve,L=f.each,S=["itemStyle","normal","borderWidth"],k=["itemStyle","normal","gapWidth"],D=["upperLabel","normal","show"],M=["upperLabel","normal","height"];e.exports=a},function(e,t,r){"use strict";function a(e,t,r){var a={mainType:"series",subType:"treemap",query:r};e.eachComponent(a,function(e){var t=e.getData().tree,r=t.root,a=e.getModel(v);r.isRemoved()||n(r,{},p.map(t.levelModels,function(e){return e?e.get(v):null}),a,e.getViewRoot().getAncestors(),e)})}function n(e,t,r,a,s,h){var d=e.getModel(),m=e.getLayout();if(m&&!m.invisible&&m.isInView){var f,y=e.getModel(v),g=r[e.depth],_=o(y,t,g,a),T=y.get("borderColor"),x=y.get("borderColorSaturation");null!=x&&(f=i(_),T=l(x,f)),e.setVisual("borderColor",T);var w=e.viewChildren;if(w&&w.length){var N=u(e,d,m,y,_,w);p.each(w,function(e,t){(e.depth>=s.length||e===s[e.depth])&&n(e,c(d,_,e,t,N,h),r,a,s,h)})}else f=i(_),e.setVisual("color",f)}}function o(e,t,r,a){var n=p.extend({},t);return p.each(["color","colorAlpha","colorSaturation"],function(o){var i=e.get(o,!0);null==i&&r&&(i=r[o]),null==i&&(i=t[o]),null==i&&(i=a.get(o)),null!=i&&(n[o]=i)}),n}function i(e){var t=s(e,"color");if(t){var r=s(e,"colorAlpha"),a=s(e,"colorSaturation");return a&&(t=m.modifyHSL(t,null,null,a)),r&&(t=m.modifyAlpha(t,r)),t}}function l(e,t){return null!=t?m.modifyHSL(t,null,null,e):null}function s(e,t){var r=e[t];if(null!=r&&"none"!==r)return r}function u(e,t,r,a,n,o){if(o&&o.length){var i=h(t,"color")||null!=n.color&&"none"!==n.color&&(h(t,"colorAlpha")||h(t,"colorSaturation"));if(i){var l=t.get("visualMin"),s=t.get("visualMax"),u=r.dataExtent.slice();null!=l&&l<u[0]&&(u[0]=l),null!=s&&s>u[1]&&(u[1]=s);var c=t.get("colorMappingBy"),m={type:i.name,dataExtent:u,visual:i.range};"color"!==m.type||"index"!==c&&"id"!==c?m.mappingMethod="linear":(m.mappingMethod="category",m.loop=!0);var p=new d(m);return p.__drColorMappingBy=c,p}}}function h(e,t){var r=e.get(t);return f(r)&&r.length?{name:t,range:r}:null}function c(e,t,r,a,n,o){var i=p.extend({},t);if(n){var l=n.type,s="color"===l&&n.__drColorMappingBy,u="index"===s?a:"id"===s?o.mapIdToIndex(r.getId()):r.getValue(e.get("visualDimension"));i[l]=n.mapValueToVisual(u)}return i}var d=r(93),m=r(63),p=r(0),f=p.isArray,v="itemStyle.normal";e.exports=a},function(e,t,r){"use strict";r(248),r(839)},function(e,t,r){"use strict";r(369),r(840)},function(e,t,r){"use strict";function a(e,t,r){t[1]>t[0]&&(t=t.slice().reverse());var a=e.coordToPoint([t[0],r]),n=e.coordToPoint([t[1],r]);return{x1:a[0],y1:a[1],x2:n[0],y2:n[1]}}function n(e){return e.getRadiusAxis().inverse?0:1}var o=r(0),i=r(3),l=r(20),s=r(91),u=["axisLine","axisLabel","axisTick","splitLine","splitArea"],h=s.extend({type:"angleAxis",axisPointerClass:"PolarAxisPointer",render:function(e,t){if(this.group.removeAll(),e.get("show")){var r=e.axis,a=r.polar,n=a.getRadiusAxis().getExtent(),i=r.getTicksCoords();"category"!==r.type&&i.pop(),o.each(u,function(t){!e.get(t+".show")||r.scale.isBlank()&&"axisLine"!==t||this["_"+t](e,a,i,n)},this)}},_axisLine:function(e,t,r,a){var o=e.getModel("axisLine.lineStyle"),l=new i.Circle({shape:{cx:t.cx,cy:t.cy,r:a[n(t)]},style:o.getLineStyle(),z2:1,silent:!0});l.style.fill=null,this.group.add(l)},_axisTick:function(e,t,r,l){var s=e.getModel("axisTick"),u=(s.get("inside")?-1:1)*s.get("length"),h=l[n(t)],c=o.map(r,function(e){return new i.Line({shape:a(t,[h,h+u],e)})});this.group.add(i.mergePath(c,{style:o.defaults(s.getModel("lineStyle").getLineStyle(),{stroke:e.get("axisLine.lineStyle.color")})}))},_axisLabel:function(e,t,r,a){for(var o=e.axis,s=e.get("data"),u=e.getModel("axisLabel"),h=e.getFormattedLabels(),c=u.get("margin"),d=o.getLabelsCoords(),m=0;m<r.length;m++){var p=a[n(t)],f=t.coordToPoint([p+c,d[m]]),v=t.cx,y=t.cy,g=Math.abs(f[0]-v)/p<.3?"center":f[0]>v?"left":"right",_=Math.abs(f[1]-y)/p<.3?"middle":f[1]>y?"top":"bottom";s&&s[m]&&s[m].textStyle&&(u=new l(s[m].textStyle,u,u.ecModel));var T=new i.Text({silent:!0});this.group.add(T),i.setTextStyle(T.style,u,{x:f[0],y:f[1],textFill:u.getTextColor()||e.get("axisLine.lineStyle.color"),text:h[m],textAlign:g,textVerticalAlign:_})}},_splitLine:function(e,t,r,n){var l=e.getModel("splitLine"),s=l.getModel("lineStyle"),u=s.get("color"),h=0;u=u instanceof Array?u:[u];for(var c=[],d=0;d<r.length;d++){var m=h++%u.length;c[m]=c[m]||[],c[m].push(new i.Line({shape:a(t,n,r[d])}))}for(var d=0;d<c.length;d++)this.group.add(i.mergePath(c[d],{style:o.defaults({stroke:u[d%u.length]},s.getLineStyle()),silent:!0,z:e.get("z")}))},_splitArea:function(e,t,r,a){var n=e.getModel("splitArea"),l=n.getModel("areaStyle"),s=l.get("color"),u=0;s=s instanceof Array?s:[s];for(var h=[],c=Math.PI/180,d=-r[0]*c,m=Math.min(a[0],a[1]),p=Math.max(a[0],a[1]),f=e.get("clockwise"),v=1;v<r.length;v++){var y=u++%s.length;h[y]=h[y]||[],h[y].push(new i.Sector({shape:{cx:t.cx,cy:t.cy,r0:m,r:p,startAngle:d,endAngle:-r[v]*c,clockwise:f},silent:!0})),d=-r[v]*c}for(var v=0;v<h.length;v++)this.group.add(i.mergePath(h[v],{style:o.defaults({fill:s[v%s.length]},l.getAreaStyle()),silent:!0}))}});e.exports=h},function(e,t,r){"use strict";var a=r(0),n=r(3),o=r(90),i=r(91),l=r(341),s=o.ifIgnoreOnTick,u=o.getInterval,h=["axisLine","axisTickLabel","axisName"],c=["splitArea","splitLine"],d=i.extend({type:"cartesianAxis",axisPointerClass:"CartesianAxisPointer",render:function(e,t,r,i){this.group.removeAll();var s=this._axisGroup;if(this._axisGroup=new n.Group,this.group.add(this._axisGroup),e.get("show")){var u=e.getCoordSysModel(),m=l.layout(u,e),p=new o(e,m);a.each(h,p.add,p),this._axisGroup.add(p.getGroup()),a.each(c,function(t){e.get(t+".show")&&this["_"+t](e,u,m.labelInterval)},this),n.groupTransition(s,this._axisGroup,e),d.superCall(this,"render",e,t,r,i)}},_splitLine:function(e,t,r){var o=e.axis;if(!o.scale.isBlank()){var i=e.getModel("splitLine"),l=i.getModel("lineStyle"),h=l.get("color"),c=u(i,r);h=a.isArray(h)?h:[h];for(var d=t.coordinateSystem.getRect(),m=o.isHorizontal(),p=0,f=o.getTicksCoords(),v=o.scale.getTicks(),y=e.get("axisLabel.showMinLabel"),g=e.get("axisLabel.showMaxLabel"),_=[],T=[],x=l.getLineStyle(),w=0;w<f.length;w++)if(!s(o,w,c,f.length,y,g)){var N=o.toGlobalCoord(f[w]);m?(_[0]=N,_[1]=d.y,T[0]=N,T[1]=d.y+d.height):(_[0]=d.x,_[1]=N,T[0]=d.x+d.width,T[1]=N);var b=p++%h.length;this._axisGroup.add(new n.Line(n.subPixelOptimizeLine({anid:"line_"+v[w],shape:{x1:_[0],y1:_[1],x2:T[0],y2:T[1]},style:a.defaults({stroke:h[b]},x),silent:!0})))}}},_splitArea:function(e,t,r){var o=e.axis;if(!o.scale.isBlank()){var i=e.getModel("splitArea"),l=i.getModel("areaStyle"),h=l.get("color"),c=t.coordinateSystem.getRect(),d=o.getTicksCoords(),m=o.scale.getTicks(),p=o.toGlobalCoord(d[0]),f=o.toGlobalCoord(d[0]),v=0,y=u(i,r),g=l.getAreaStyle();h=a.isArray(h)?h:[h];for(var _=e.get("axisLabel.showMinLabel"),T=e.get("axisLabel.showMaxLabel"),x=1;x<d.length;x++)if(!s(o,x,y,d.length,_,T)){var w,N,b,L,S=o.toGlobalCoord(d[x]);o.isHorizontal()?(w=p,N=c.y,b=S-w,L=c.height):(w=c.x,N=f,b=c.width,L=S-N);var k=v++%h.length;this._axisGroup.add(new n.Rect({anid:"area_"+m[x],shape:{x:w,y:N,width:b,height:L},style:a.defaults({fill:h[k]},g),silent:!0})),p=w+b,f=N+L}}}});d.extend({type:"xAxis"}),d.extend({type:"yAxis"})},function(e,t,r){"use strict";function a(e,t,r){return r&&"axisAreaSelect"===r.type&&t.findComponents({mainType:"parallelAxis",query:r})[0]===e}function n(e){var t=e.axis;return l.map(e.activeIntervals,function(e){return{brushType:"lineX",panelId:"pl",range:[t.dataToCoord(e[0],!0),t.dataToCoord(e[1],!0)]}})}function o(e,t){return t.getComponent("parallel",e.get("parallelIndex"))}var i=r(2),l=r(0),s=r(90),u=r(241),h=r(352),c=r(3),d=["axisLine","axisTickLabel","axisName"],m=i.extendComponentView({type:"parallelAxis",init:function(e,t){m.superApply(this,"init",arguments),(this._brushController=new u(t.getZr())).on("brush",l.bind(this._onBrush,this))},render:function(e,t,r,n){if(!a(e,t,n)){this.axisModel=e,this.api=r,this.group.removeAll();var i=this._axisGroup;if(this._axisGroup=new c.Group,this.group.add(this._axisGroup),e.get("show")){var u=o(e,t),h=u.coordinateSystem,m=e.getAreaSelectStyle(),p=m.width,f=e.axis.dim,v=h.getAxisLayout(f),y=l.extend({strokeContainThreshold:p},v),g=new s(e,y);l.each(d,g.add,g),this._axisGroup.add(g.getGroup()),this._refreshBrushController(y,m,e,u,p,r);var _=n&&!1===n.animation?null:e;c.groupTransition(i,this._axisGroup,_)}}},updateVisual:function(e,t,r,a){this._brushController&&this._brushController.updateCovers(n(e))},_refreshBrushController:function(e,t,r,a,o,i){var l=r.axis.getExtent(),s=l[1]-l[0],u=Math.min(30,.1*Math.abs(s)),d=c.BoundingRect.create({x:l[0],y:-o/2,width:s,height:o});d.x-=u,d.width+=2*u,this._brushController.mount({enableGlobalPan:!0,rotation:e.rotation,position:e.position}).setPanels([{panelId:"pl",clipPath:h.makeRectPanelClipPath(d),isTargetByCursor:h.makeRectIsTargetByCursor(d,i,a),getLinearBrushOtherExtent:h.makeLinearBrushOtherExtent(d,0)}]).enableBrush({brushType:"lineX",brushStyle:t,removeOnClick:!0}).updateCovers(n(r))},_onBrush:function(e,t){var r=this.axisModel,a=r.axis,n=l.map(e,function(e){return[a.coordToData(e.range[0],!0),a.coordToData(e.range[1],!0)]});(!r.option.realtime===t.isEnd||t.removeOnClick)&&this.api.dispatchAction({type:"axisAreaSelect",parallelAxisId:r.id,intervals:n})},dispose:function(){this._brushController.dispose()}}),p=m;e.exports=p},function(e,t,r){"use strict";function a(e,t,r){return{position:[e.cx,e.cy],rotation:r/180*Math.PI,labelDirection:-1,tickDirection:-1,nameDirection:1,labelRotate:t.getModel("axisLabel").get("rotate"),z2:1}}var n=r(0),o=r(3),i=r(90),l=r(91),s=["axisLine","axisTickLabel","axisName"],u=["splitLine","splitArea"],h=l.extend({type:"radiusAxis",axisPointerClass:"PolarAxisPointer",render:function(e,t){if(this.group.removeAll(),e.get("show")){var r=e.axis,o=r.polar,l=o.getAngleAxis(),h=r.getTicksCoords(),c=l.getExtent()[0],d=r.getExtent(),m=a(o,e,c),p=new i(e,m);n.each(s,p.add,p),this.group.add(p.getGroup()),n.each(u,function(t){e.get(t+".show")&&!r.scale.isBlank()&&this["_"+t](e,o,c,d,h)},this)}},_splitLine:function(e,t,r,a,i){var l=e.getModel("splitLine"),s=l.getModel("lineStyle"),u=s.get("color"),h=0;u=u instanceof Array?u:[u];for(var c=[],d=0;d<i.length;d++){var m=h++%u.length;c[m]=c[m]||[],c[m].push(new o.Circle({shape:{cx:t.cx,cy:t.cy,r:i[d]},silent:!0}))}for(var d=0;d<c.length;d++)this.group.add(o.mergePath(c[d],{style:n.defaults({stroke:u[d%u.length],fill:null},s.getLineStyle()),silent:!0}))},_splitArea:function(e,t,r,a,i){var l=e.getModel("splitArea"),s=l.getModel("areaStyle"),u=s.get("color"),h=0;u=u instanceof Array?u:[u];for(var c=[],d=i[0],m=1;m<i.length;m++){var p=h++%u.length;c[p]=c[p]||[],c[p].push(new o.Sector({shape:{cx:t.cx,cy:t.cy,r0:d,r:i[m],startAngle:0,endAngle:2*Math.PI},silent:!0})),d=i[m]}for(var m=0;m<c.length;m++)this.group.add(o.mergePath(c[m],{style:n.defaults({fill:u[m%u.length]},s.getAreaStyle()),silent:!0}))}});e.exports=h},function(e,t,r){"use strict";var a=r(0),n=r(90),o=r(3),i=r(342),l=r(91),s=n.getInterval,u=n.ifIgnoreOnTick,h=["axisLine","axisTickLabel","axisName"],c=l.extend({type:"singleAxis",axisPointerClass:"SingleAxisPointer",render:function(e,t,r,o){var l=this.group;l.removeAll();var s=i.layout(e),u=new n(e,s);a.each(h,u.add,u),l.add(u.getGroup()),e.get("splitLine.show")&&this._splitLine(e,s.labelInterval),c.superCall(this,"render",e,t,r,o)},_splitLine:function(e,t){var r=e.axis;if(!r.scale.isBlank()){var a=e.getModel("splitLine"),n=a.getModel("lineStyle"),i=n.get("width"),l=n.get("color"),h=s(a,t);l=l instanceof Array?l:[l];for(var c=e.coordinateSystem.getRect(),d=r.isHorizontal(),m=[],p=0,f=r.getTicksCoords(),v=[],y=[],g=e.get("axisLabel.showMinLabel"),_=e.get("axisLabel.showMaxLabel"),T=0;T<f.length;++T)if(!u(r,T,h,f.length,g,_)){var x=r.toGlobalCoord(f[T]);d?(v[0]=x,v[1]=c.y,y[0]=x,y[1]=c.y+c.height):(v[0]=c.x,v[1]=x,y[0]=c.x+c.width,y[1]=x);var w=p++%l.length;m[w]=m[w]||[],m[w].push(new o.Line(o.subPixelOptimizeLine({shape:{x1:v[0],y1:v[1],x2:y[0],y2:y[1]},style:{lineWidth:i},silent:!0})))}for(var T=0;T<m.length;++T)this.group.add(o.mergePath(m[T],{style:{stroke:l[T%l.length],lineDash:n.getLineDash(i),lineWidth:i},silent:!0}))}}}),d=c;e.exports=d},function(e,t,r){"use strict";var a=r(2),n={type:"axisAreaSelect",event:"axisAreaSelected",update:"updateVisual"};a.registerAction(n,function(e,t){t.eachComponent({mainType:"parallelAxis",query:e},function(t){t.axis.model.setActiveIntervals(e.intervals)})}),a.registerAction("parallelAxisExpand",function(e,t){t.eachComponent({mainType:"parallel",query:e},function(t){t.setAxisExpand(e)})})},function(e,t,r){"use strict";var a=r(2),n=a.extendComponentModel({type:"axisPointer",coordSysAxesInfo:null,defaultOption:{show:"auto",triggerOn:null,zlevel:0,z:50,type:"line",snap:!1,triggerTooltip:!0,value:null,status:null,link:[],animation:null,animationDurationUpdate:200,lineStyle:{color:"#aaa",width:1,type:"solid"},shadowStyle:{color:"rgba(150,150,150,0.3)"},label:{show:!0,formatter:null,precision:"auto",margin:3,color:"#fff",padding:[5,7,5,7],backgroundColor:"auto",borderColor:null,borderWidth:0,shadowBlur:3,shadowColor:"#aaa"},handle:{show:!1,icon:"M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z",size:45,margin:50,color:"#333",shadowBlur:3,shadowColor:"#aaa",shadowOffsetX:0,shadowOffsetY:2,throttle:40}}}),o=n;e.exports=o},function(e,t,r){"use strict";var a=r(2),n=r(345),o=a.extendComponentView({type:"axisPointer",render:function(e,t,r){var a=t.getComponent("tooltip"),o=e.get("triggerOn")||a&&a.get("triggerOn")||"mousemove|click";n.register("axisPointer",r,function(e,t,r){"none"!==o&&("leave"===e||o.indexOf(e)>=0)&&r({type:"updateAxisPointer",currTrigger:e,x:t&&t.offsetX,y:t&&t.offsetY})})},remove:function(e,t){n.unregister(t.getZr(),"axisPointer"),o.superApply(this._model,"remove",arguments)},dispose:function(e,t){n.unregister("axisPointer",t),o.superApply(this._model,"dispose",arguments)}}),i=o;e.exports=i},function(e,t,r){"use strict";function a(e,t,r,a,n){var o=t.axis,l=o.dataToCoord(e),h=a.getAngleAxis().getExtent()[0];h=h/180*Math.PI;var c,d,m,p=a.getRadiusAxis().getExtent();if("radius"===o.dim){var f=s.create();s.rotate(f,f,h),s.translate(f,f,[a.cx,a.cy]),c=i.applyTransform([l,-n],f);var v=t.getModel("axisLabel").get("rotate")||0,y=u.innerTextLayout(h,v*Math.PI/180,-1);d=y.textAlign,m=y.textVerticalAlign}else{var g=p[1];c=a.coordToPoint([g+n,l]);var _=a.cx,T=a.cy;d=Math.abs(c[0]-_)/g<.3?"center":c[0]>_?"left":"right",m=Math.abs(c[1]-T)/g<.3?"middle":c[1]>T?"top":"bottom"}return{position:c,align:d,verticalAlign:m}}var n=r(14),o=r(239),i=r(3),l=r(165),s=r(40),u=r(90),h=r(91),c=o.extend({makeElOption:function(e,t,r,o,i){var s=r.axis;"angle"===s.dim&&(this.animationThreshold=Math.PI/18);var u,h=s.polar,c=h.getOtherAxis(s),m=c.getExtent();u=s["dataTo"+n.capitalFirst(s.dim)](t);var p=o.get("type");if(p&&"none"!==p){var f=l.buildElStyle(o),v=d[p](s,h,u,m,f);v.style=f,e.graphicKey=v.type,e.pointer=v}var y=o.get("label.margin"),g=a(t,r,o,h,y);l.buildLabelElOption(e,r,o,i,g)}}),d={line:function(e,t,r,a,n){return"angle"===e.dim?{type:"Line",shape:l.makeLineShape(t.coordToPoint([a[0],r]),t.coordToPoint([a[1],r]))}:{type:"Circle",shape:{cx:t.cx,cy:t.cy,r:r}}},shadow:function(e,t,r,a,n){var o=e.getBandWidth(),i=Math.PI/180;return"angle"===e.dim?{type:"Sector",shape:l.makeSectorShape(t.cx,t.cy,a[0],a[1],(-r-o/2)*i,(o/2-r)*i)}:{type:"Sector",shape:l.makeSectorShape(t.cx,t.cy,r-o/2,r+o/2,0,2*Math.PI)}}};h.registerAxisPointerClass("PolarAxisPointer",c);var m=c;e.exports=m},function(e,t,r){"use strict";function a(e){return e.isHorizontal()?0:1}function n(e,t){var r=e.getRect();return[r[h[t]],r[h[t]]+r[c[t]]]}var o=r(3),i=r(239),l=r(165),s=r(342),u=r(91),h=["x","y"],c=["width","height"],d=i.extend({makeElOption:function(e,t,r,o,i){var u=r.axis,h=u.coordinateSystem,c=n(h,1-a(u)),d=h.dataToPoint(t)[0],p=o.get("type");if(p&&"none"!==p){var f=l.buildElStyle(o),v=m[p](u,d,c,f);v.style=f,e.graphicKey=v.type,e.pointer=v}var y=s.layout(r);l.buildCartesianSingleLabelElOption(t,e,y,r,o,i)},getHandleTransform:function(e,t,r){var a=s.layout(t,{labelInside:!1});return a.labelMargin=r.get("handle.margin"),{position:l.getTransformedPosition(t.axis,e,a),rotation:a.rotation+(a.labelDirection<0?Math.PI:0)}},updateHandleTransform:function(e,t,r,o){var i=r.axis,l=i.coordinateSystem,s=a(i),u=n(l,s),h=e.position;h[s]+=t[s],h[s]=Math.min(u[1],h[s]),h[s]=Math.max(u[0],h[s]);var c=n(l,1-s),d=(c[1]+c[0])/2,m=[d,d];return m[s]=h[s],{position:h,rotation:e.rotation,cursorPoint:m,tooltipOption:{verticalAlign:"middle"}}}}),m={line:function(e,t,r,n){var i=l.makeLineShape([t,r[0]],[t,r[1]],a(e));return o.subPixelOptimizeLine({shape:i,style:n}),{type:"Line",shape:i}},shadow:function(e,t,r,n){var o=e.getBandWidth(),i=r[1]-r[0];return{type:"Rect",shape:l.makeRectShape([t-o/2,r[0]],[o,i],a(e))}}};u.registerAxisPointerClass("SingleAxisPointer",d);var p=d;e.exports=p},function(e,t,r){"use strict";function a(e,t,r){var a=e.currTrigger,o=[e.x,e.y],f=e,v=e.dispatchAction||p.bind(r.dispatchAction,r),T=t.getComponent("axisPointer").coordSysAxesInfo;if(T){m(o)&&(o=y({seriesIndex:f.seriesIndex,dataIndex:f.dataIndex},t).point);var x=m(o),w=f.axesInfo,N=T.axesInfo,b="leave"===a||m(o),L={},S={},k={list:[],map:{}},D={showPointer:_(i,S),showTooltip:_(l,k)};g(T.coordSysMap,function(e,t){var r=x||e.containPoint(o);g(T.coordSysAxesInfo[t],function(e,t){var a=e.axis,i=c(w,e);if(!b&&r&&(!w||i)){var l=i&&i.value;null!=l||x||(l=a.pointToData(o)),null!=l&&n(e,l,D,!1,L)}})});var M={};return g(N,function(e,t){var r=e.linkGroup;r&&!S[t]&&g(r.axesInfo,function(t,a){var n=S[a];if(t!==e&&n){var o=n.value;r.mapper&&(o=e.axis.scale.parse(r.mapper(o,d(t),d(e)))),M[e.key]=o}})}),g(M,function(e,t){n(N[t],e,D,!0,L)}),s(S,N,L),u(k,o,e,v),h(N,v,r),L}}function n(e,t,r,a,n){var i=e.axis;if(!i.scale.isBlank()&&i.containData(t)){if(!e.involveSeries)return void r.showPointer(e,t);var l=o(t,e),s=l.payloadBatch,u=l.snapToValue;s[0]&&null==n.seriesIndex&&p.extend(n,s[0]),!a&&e.snap&&i.containData(u)&&null!=u&&(t=u),r.showPointer(e,t,s,n),r.showTooltip(e,l,u)}}function o(e,t){var r=t.axis,a=r.dim,n=e,o=[],i=Number.MAX_VALUE,l=-1;return g(t.seriesModels,function(t,s){var u,h,c=t.coordDimToDataDim(a);if(t.getAxisTooltipData){var d=t.getAxisTooltipData(c,e,r);h=d.dataIndices,u=d.nestestValue}else{if(h=t.getData().indicesOfNearest(c[0],e,!1,"category"===r.type?.5:null),!h.length)return;u=t.getData().get(c[0],h[0])}if(null!=u&&isFinite(u)){var m=e-u,p=Math.abs(m);p<=i&&((p<i||m>=0&&l<0)&&(i=p,l=m,n=u,o.length=0),g(h,function(e){o.push({seriesIndex:t.seriesIndex,dataIndexInside:e,dataIndex:t.getData().getRawIndex(e)})}))}}),{payloadBatch:o,snapToValue:n}}function i(e,t,r,a){e[t.key]={value:r,payloadBatch:a}}function l(e,t,r,a){var n=r.payloadBatch,o=t.axis,i=o.model,l=t.axisPointerModel;if(t.triggerTooltip&&n.length){var s=t.coordSys.model,u=v.makeKey(s),h=e.map[u];h||(h=e.map[u]={coordSysId:s.id,coordSysIndex:s.componentIndex,coordSysType:s.type,coordSysMainType:s.mainType,dataByAxis:[]},e.list.push(h)),h.dataByAxis.push({axisDim:o.dim,axisIndex:i.componentIndex,axisType:i.type,axisId:i.id,value:a,valueLabelOpt:{precision:l.get("label.precision"),formatter:l.get("label.formatter")},seriesDataIndices:n.slice()})}}function s(e,t,r){var a=r.axesInfo=[];g(t,function(t,r){var n=t.axisPointerModel.option,o=e[r];o?(!t.useHandle&&(n.status="show"),n.value=o.value,n.seriesDataIndices=(o.payloadBatch||[]).slice()):!t.useHandle&&(n.status="hide"),"show"===n.status&&a.push({axisDim:t.axis.dim,axisIndex:t.axis.model.componentIndex,value:n.value})})}function u(e,t,r,a){if(m(t)||!e.list.length)return void a({type:"hideTip"});var n=((e.list[0].dataByAxis[0]||{}).seriesDataIndices||[])[0]||{};a({type:"showTip",escapeConnect:!0,x:t[0],y:t[1],tooltipOption:r.tooltipOption,position:r.position,dataIndexInside:n.dataIndexInside,dataIndex:n.dataIndex,seriesIndex:n.seriesIndex,dataByCoordSys:e.list})}function h(e,t,r){var a=r.getZr(),n=T(a).axisPointerLastHighlights||{},o=T(a).axisPointerLastHighlights={};g(e,function(e,t){var r=e.axisPointerModel.option;"show"===r.status&&g(r.seriesDataIndices,function(e){var t=e.seriesIndex+" | "+e.dataIndex;o[t]=e})});var i=[],l=[];p.each(n,function(e,t){!o[t]&&l.push(e)}),p.each(o,function(e,t){!n[t]&&i.push(e)}),l.length&&r.dispatchAction({type:"downplay",escapeConnect:!0,batch:l}),i.length&&r.dispatchAction({type:"highlight",escapeConnect:!0,batch:i})}function c(e,t){for(var r=0;r<(e||[]).length;r++){var a=e[r];if(t.axis.dim===a.axisDim&&t.axis.model.componentIndex===a.axisIndex)return a}}function d(e){var t=e.axis.model,r={},a=r.axisDim=e.axis.dim;return r.axisIndex=r[a+"AxisIndex"]=t.componentIndex,r.axisName=r[a+"AxisName"]=t.name,r.axisId=r[a+"AxisId"]=t.id,r}function m(e){return!e||null==e[0]||isNaN(e[0])||null==e[1]||isNaN(e[1])}var p=r(0),f=r(10),v=r(164),y=r(344),g=p.each,_=p.curry,T=f.makeGetter();e.exports=a},function(e,t,r){"use strict";var a=r(2),n=r(854);r(856),r(851),r(852),r(853),r(907),a.registerPreprocessor(n)},function(e,t,r){"use strict";function a(e,t){return i.merge({brushType:e.brushType,brushMode:e.brushMode,transformable:e.transformable,brushStyle:new s(e.brushStyle).getItemStyle(),removeOnClick:e.removeOnClick,z:e.z},t,!0)}var n=r(9),o=(n.__DEV__,r(2)),i=r(0),l=r(172),s=r(20),u=["#ddd"],h=o.extendComponentModel({type:"brush",dependencies:["geo","grid","xAxis","yAxis","parallel","series"],defaultOption:{toolbox:null,brushLink:null,seriesIndex:"all",geoIndex:null,xAxisIndex:null,yAxisIndex:null,brushType:"rect",brushMode:"single",transformable:!0,brushStyle:{borderWidth:1,color:"rgba(120,140,180,0.3)",borderColor:"rgba(120,140,180,0.8)"},throttleType:"fixRate",throttleDelay:0,removeOnClick:!0,z:1e4},areas:[],brushType:null,brushOption:{},coordInfoList:[],optionUpdated:function(e,t){var r=this.option;!t&&l.replaceVisualOption(r,e,["inBrush","outOfBrush"]),r.inBrush=r.inBrush||{},r.outOfBrush=r.outOfBrush||{color:u}},setAreas:function(e){e&&(this.areas=i.map(e,function(e){return a(this.option,e)},this))},setBrushOption:function(e){this.brushOption=a(this.option,e),this.brushType=this.brushOption.brushType}}),c=h;e.exports=c},function(e,t,r){"use strict";function a(e,t,r,a){(!a||a.$from!==e.id)&&this._brushController.setPanels(e.brushTargetManager.makePanelOpts(r)).enableBrush(e.brushOption).updateCovers(e.areas.slice())}var n=r(2),o=r(0),i=r(241),l=n.extendComponentView({type:"brush",init:function(e,t){this.ecModel=e,this.api=t,this.model,(this._brushController=new i(t.getZr())).on("brush",o.bind(this._onBrush,this)).mount()},render:function(e){return this.model=e,a.apply(this,arguments)},updateView:a,updateLayout:a,updateVisual:a,dispose:function(){this._brushController.dispose()},_onBrush:function(e,t){var r=this.model.id;this.model.brushTargetManager.setOutputRanges(e,this.ecModel),(!t.isEnd||t.removeOnClick)&&this.api.dispatchAction({type:"brush",brushId:r,areas:o.clone(e),$from:r})}});e.exports=l},function(e,t,r){"use strict";var a=r(2);a.registerAction({type:"brush",event:"brush",update:"updateView"},function(e,t){t.eachComponent({mainType:"brush",query:e},function(t){t.setAreas(e.areas)})}),a.registerAction({type:"brushSelect",event:"brushSelected",update:"none"},function(){})},function(e,t,r){"use strict";function a(e,t){var r=e&&e.brush;if(o.isArray(r)||(r=r?[r]:[]),r.length){var a=[];o.each(r,function(e){var t=e.hasOwnProperty("toolbox")?e.toolbox:[];t instanceof Array&&(a=a.concat(t))});var l=e&&e.toolbox;o.isArray(l)&&(l=l[0]),l||(l={feature:{}},e.toolbox=[l]);var s=l.feature||(l.feature={}),u=s.brush||(s.brush={}),h=u.type||(u.type=[]);h.push.apply(h,a),n(h),t&&!h.length&&h.push.apply(h,i)}}function n(e){var t={};o.each(e,function(e){t[e]=1}),e.length=0,o.each(t,function(t,r){e.push(r)})}var o=r(0),i=["rect","polygon","keep","clear"];e.exports=a},function(e,t,r){"use strict";function a(e){var t=["x","y"],r=["width","height"];return{point:function(t,r,a){if(t){var o=a.range;return n(t[e],o)}},rect:function(a,o,i){if(a){var l=i.range,s=[a[t[e]],a[t[e]]+a[r[e]]];return s[1]<s[0]&&s.reverse(),n(s[0],l)||n(s[1],l)||n(l[0],s)||n(l[1],s)}}}}function n(e,t){return t[0]<=e&&e<=t[1]}function o(e,t,r,a,n){for(var o=0,l=n[n.length-1];o<n.length;o++){var s=n[o];if(i(e,t,r,a,s[0],s[1],l[0],l[1]))return!0;l=s}}function i(e,t,r,a,n,o,i,u){var h=s(r-e,n-i,a-t,o-u);if(l(h))return!1;var c=s(n-e,n-i,o-t,o-u)/h;if(c<0||c>1)return!1;var d=s(r-e,n-e,a-t,o-t)/h;return!(d<0||d>1)}function l(e){return e<=1e-6&&e>=-1e-6}function s(e,t,r,a){return e*a-t*r}var u=r(438),h=r(19),c={lineX:a(0),lineY:a(1),rect:{point:function(e,t,r){return e&&r.boundingRect.contain(e[0],e[1])},rect:function(e,t,r){return e&&r.boundingRect.intersect(e)}},polygon:{point:function(e,t,r){return e&&r.boundingRect.contain(e[0],e[1])&&u.contain(r.range,e[0],e[1])},rect:function(e,t,r){var a=r.range;if(!e||a.length<=1)return!1;var n=e.x,i=e.y,l=e.width,s=e.height,c=a[0];return!!(u.contain(a,n,i)||u.contain(a,n+l,i)||u.contain(a,n,i+s)||u.contain(a,n+l,i+s)||h.create(e).contain(c[0],c[1])||o(n,i,n+l,i,a)||o(n,i,n,i+s,a)||o(n+l,i,n+l,i+s,a)||o(n,i+s,n+l,i+s,a))||void 0}}},d=c;e.exports=d},function(e,t,r){"use strict";function a(e,t,r,a,o){if(o){var i=e.getZr();i[_]||(i[g]||(i[g]=n),f.createOrUpdate(i,g,r,t)(e,a))}}function n(e,t){if(!e.isDisposed()){var r=e.getZr();r[_]=!0,e.dispatchAction({type:"brushSelect",batch:t}),r[_]=!1}}function o(e,t,r,a){for(var n=0,o=t.length;n<o;n++){var i=t[n];if(e[i.brushType](a,r,i.selectors,i))return!0}}function i(e){var t=e.brushSelector;if(c.isString(t)){var r=[];return c.each(p,function(e,a){r[a]=function(r,a,n,o){var i=a.getItemLayout(r);return e[t](i,n,o)}}),r}if(c.isFunction(t)){var a={};return c.each(p,function(e,r){a[r]=t}),a}return t}function l(e,t){var r=e.option.seriesIndex;return null!=r&&"all"!==r&&(c.isArray(r)?c.indexOf(r,t)<0:t!==r)}function s(e){var t=e.selectors={};return c.each(p[e.brushType],function(r,a){t[a]=function(a){return r(a,t,e)}}),e}function u(e){return new d(e[0][0],e[1][0],e[0][1]-e[0][0],e[1][1]-e[1][0])}var h=r(2),c=r(0),d=r(19),m=r(172),p=r(855),f=r(92),v=r(350),y=["inBrush","outOfBrush"],g="__ecBrushSelect",_="__ecInBrushSelectEvent",T=h.PRIORITY.VISUAL.BRUSH;h.registerLayout(T,function(e,t,r){e.eachComponent({mainType:"brush"},function(t){r&&"takeGlobalCursor"===r.type&&t.setBrushOption("brush"===r.key?r.brushOption:{brushType:!1}),(t.brushTargetManager=new v(t.option,e)).setInputRanges(t.areas,e)})}),h.registerVisual(T,function(e,t,r){var n,u,h=[];e.eachComponent({mainType:"brush"},function(t,r){function a(e){return"all"===_||T[e]}function d(e){return!!e.length}function p(e,t){var r=e.coordinateSystem;b|=r.hasAxisBrushed(),a(t)&&r.eachActiveState(e.getData(),function(e,t){"active"===e&&(w[t]=1)})}function f(r,n,s){var u=i(r);if(u&&!l(t,n)&&(c.each(L,function(a){u[a.brushType]&&t.brushTargetManager.controlSeries(a,r,e)&&s.push(a),b|=d(s)}),a(n)&&d(s))){var h=r.getData();h.each(function(e){o(u,s,h,e)&&(w[e]=1)})}}var v={brushId:t.id,brushIndex:r,brushName:t.name,areas:c.clone(t.areas),selected:[]};h.push(v);var g=t.option,_=g.brushLink,T=[],w=[],N=[],b=0;r||(n=g.throttleType,u=g.throttleDelay);var L=c.map(t.areas,function(e){return s(c.defaults({boundingRect:x[e.brushType](e)},e))}),S=m.createVisualMappings(t.option,y,function(e){e.mappingMethod="fixed"});c.isArray(_)&&c.each(_,function(e){T[e]=1}),e.eachSeries(function(e,t){var r=N[t]=[];"parallel"===e.subType?p(e,t):f(e,t,r)}),e.eachSeries(function(e,t){var r={seriesId:e.id,seriesIndex:t,seriesName:e.name,dataIndex:[]};v.selected.push(r);var n=i(e),l=N[t],s=e.getData(),u=a(t)?function(e){return w[e]?(r.dataIndex.push(s.getRawIndex(e)),"inBrush"):"outOfBrush"}:function(e){return o(n,l,s,e)?(r.dataIndex.push(s.getRawIndex(e)),"inBrush"):"outOfBrush"};(a(t)?b:d(l))&&m.applyVisual(y,S,s,u)})}),a(t,n,u,h,r)});var x={lineX:c.noop,lineY:c.noop,rect:function(e){return u(e.range)},polygon:function(e){for(var t,r=e.range,a=0,n=r.length;a<n;a++){t=t||[[1/0,-1/0],[1/0,-1/0]];var o=r[a];o[0]<t[0][0]&&(t[0][0]=o[0]),o[0]>t[0][1]&&(t[0][1]=o[0]),o[1]<t[1][0]&&(t[1][0]=o[1]),o[1]>t[1][1]&&(t[1][1]=o[1])}return t&&u(t)}}},function(e,t,r){"use strict";r(924),r(925),r(858)},function(e,t,r){"use strict";var a=r(2),n=r(0),o=r(3),i=r(14),l=r(4),s={EN:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],CN:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]},u={EN:["S","M","T","W","T","F","S"],CN:["日","一","二","三","四","五","六"]},h=a.extendComponentView({type:"calendar",_tlpoints:null,_blpoints:null,_firstDayOfMonth:null,_firstDayPoints:null,render:function(e,t,r){var a=this.group;a.removeAll();var n=e.coordinateSystem,o=n.getRangeInfo(),i=n.getOrient();this._renderDayRect(e,o,a),this._renderLines(e,o,i,a),this._renderYearText(e,o,i,a),this._renderMonthText(e,i,a),this._renderWeekText(e,o,i,a)},_renderDayRect:function(e,t,r){for(var a=e.coordinateSystem,n=e.getModel("itemStyle.normal").getItemStyle(),i=a.getCellWidth(),l=a.getCellHeight(),s=t.start.time;s<=t.end.time;s=a.getNextNDay(s,1).time){var u=a.dataToRect([s],!1).tl,h=new o.Rect({shape:{x:u[0],y:u[1],width:i,height:l},cursor:"default",style:n});r.add(h)}},_renderLines:function(e,t,r,a){function n(t){o._firstDayOfMonth.push(i.getDateInfo(t)),o._firstDayPoints.push(i.dataToRect([t],!1).tl);var n=o._getLinePointsOfOneWeek(e,t,r);o._tlpoints.push(n[0]),o._blpoints.push(n[n.length-1]),s&&o._drawSplitline(n,l,a)}var o=this,i=e.coordinateSystem,l=e.getModel("splitLine.lineStyle").getLineStyle(),s=e.get("splitLine.show"),u=l.lineWidth;this._tlpoints=[],this._blpoints=[],this._firstDayOfMonth=[],this._firstDayPoints=[];for(var h=t.start,c=0;h.time<=t.end.time;c++){n(h.formatedDate),0===c&&(h=i.getDateInfo(t.start.y+"-"+t.start.m));var d=h.date;d.setMonth(d.getMonth()+1),h=i.getDateInfo(d)}n(i.getNextNDay(t.end.time,1).formatedDate),s&&this._drawSplitline(o._getEdgesPoints(o._tlpoints,u,r),l,a),s&&this._drawSplitline(o._getEdgesPoints(o._blpoints,u,r),l,a)},_getEdgesPoints:function(e,t,r){var a=[e[0].slice(),e[e.length-1].slice()],n="horizontal"===r?0:1;return a[0][n]=a[0][n]-t/2,a[1][n]=a[1][n]+t/2,a},_drawSplitline:function(e,t,r){var a=new o.Polyline({z2:20,shape:{points:e},style:t});r.add(a)},_getLinePointsOfOneWeek:function(e,t,r){var a=e.coordinateSystem;t=a.getDateInfo(t);for(var n=[],o=0;o<7;o++){var i=a.getNextNDay(t.time,o),l=a.dataToRect([i.time],!1);n[2*i.day]=l.tl,n[2*i.day+1]=l["horizontal"===r?"bl":"tr"]}return n},_formatterLabel:function(e,t){return"string"==typeof e&&e?i.formatTplSimple(e,t):"function"==typeof e?e(t):t.nameMap},_yearTextPositionControl:function(e,t,r,a,n){t=t.slice();var o=["center","bottom"];"bottom"===a?(t[1]+=n,o=["center","top"]):"left"===a?t[0]-=n:"right"===a?(t[0]+=n,o=["center","top"]):t[1]-=n;var i=0;return"left"!==a&&"right"!==a||(i=Math.PI/2),{rotation:i,position:t,style:{textAlign:o[0],textVerticalAlign:o[1]}}},_renderYearText:function(e,t,r,a){var n=e.getModel("yearLabel");if(n.get("show")){var i=n.get("margin"),l=n.get("position");l||(l="horizontal"!==r?"top":"left");var s=[this._tlpoints[this._tlpoints.length-1],this._blpoints[0]],u=(s[0][0]+s[1][0])/2,h=(s[0][1]+s[1][1])/2,c="horizontal"===r?0:1,d={top:[u,s[c][1]],bottom:[u,s[1-c][1]],left:[s[1-c][0],h],right:[s[c][0],h]},m=t.start.y;+t.end.y>+t.start.y&&(m=m+"-"+t.end.y);var p=n.get("formatter"),f={start:t.start.y,end:t.end.y,nameMap:m},v=this._formatterLabel(p,f),y=new o.Text({z2:30});o.setTextStyle(y.style,n,{text:v}),y.attr(this._yearTextPositionControl(y,d[l],r,l,i)),a.add(y)}},_monthTextPositionControl:function(e,t,r,a,n){var o="left",i="top",l=e[0],s=e[1];return"horizontal"===r?(s+=n,t&&(o="center"),"start"===a&&(i="bottom")):(l+=n,t&&(i="middle"),"start"===a&&(o="right")),{x:l,y:s,textAlign:o,textVerticalAlign:i}},_renderMonthText:function(e,t,r){var a=e.getModel("monthLabel");if(a.get("show")){var i=a.get("nameMap"),l=a.get("margin"),u=a.get("position"),h=a.get("align"),c=[this._tlpoints,this._blpoints];n.isString(i)&&(i=s[i.toUpperCase()]||[]);var d="start"===u?0:1,m="horizontal"===t?0:1;l="start"===u?-l:l;for(var p="center"===h,f=0;f<c[d].length-1;f++){var v=c[d][f].slice(),y=this._firstDayOfMonth[f];if(p){var g=this._firstDayPoints[f];v[m]=(g[m]+c[0][f+1][m])/2}var _=a.get("formatter"),T=i[+y.m-1],x={yyyy:y.y,yy:(y.y+"").slice(2),MM:y.m,M:+y.m,nameMap:T},w=this._formatterLabel(_,x),N=new o.Text({z2:30});n.extend(o.setTextStyle(N.style,a,{text:w}),this._monthTextPositionControl(v,p,t,u,l)),r.add(N)}}},_weekTextPositionControl:function(e,t,r,a,n){var o="center",i="middle",l=e[0],s=e[1],u="start"===r;return"horizontal"===t?(l=l+a+(u?1:-1)*n[0]/2,o=u?"right":"left"):(s=s+a+(u?1:-1)*n[1]/2,i=u?"bottom":"top"),{x:l,y:s,textAlign:o,textVerticalAlign:i}},_renderWeekText:function(e,t,r,a){var i=e.getModel("dayLabel");if(i.get("show")){var s=e.coordinateSystem,h=i.get("position"),c=i.get("nameMap"),d=i.get("margin"),m=s.getFirstDayOfWeek();n.isString(c)&&(c=u[c.toUpperCase()]||[]);var p=s.getNextNDay(t.end.time,7-t.lweek).time,f=[s.getCellWidth(),s.getCellHeight()];d=l.parsePercent(d,f["horizontal"===r?0:1]),"start"===h&&(p=s.getNextNDay(t.start.time,-(7+t.fweek)).time,d=-d);for(var v=0;v<7;v++){var y=s.getNextNDay(p,v),g=s.dataToRect([y.time],!1).center,_=v;_=Math.abs((v+m)%7);var T=new o.Text({z2:30});n.extend(o.setTextStyle(T.style,i,{text:c[_]}),this._weekTextPositionControl(g,r,h,d,f)),a.add(T)}}}});e.exports=h},function(e,t,r){"use strict";r(349),r(131),r(132),r(865),r(866),r(861),r(862),r(347),r(346)},function(e,t,r){"use strict";function a(e,t,r){var a=[1/0,-1/0];return h(r,function(e){var r=e.getData();r&&h(e.coordDimToDataDim(t),function(e){var t=r.getDataExtent(e);t[0]<a[0]&&(a[0]=t[0]),t[1]>a[1]&&(a[1]=t[1])})}),a[1]<a[0]&&(a=[NaN,NaN]),n(e,a),a}function n(e,t){var r=e.getAxisModel(),a=r.getMin(!0),n="category"===r.get("type"),o=n&&(r.get("data")||[]).length;null!=a&&"dataMin"!==a&&"function"!=typeof a?t[0]=a:n&&(t[0]=o>0?0:NaN);var i=r.getMax(!0);return null!=i&&"dataMax"!==i&&"function"!=typeof i?t[1]=i:n&&(t[1]=o>0?o-1:NaN),r.get("scale",!0)||(t[0]>0&&(t[0]=0),t[1]<0&&(t[1]=0)),t}function o(e,t){var r=e.getAxisModel(),a=e._percentWindow,n=e._valueWindow;if(a){var o=s.getPixelPrecision(n,[0,500]);o=Math.min(o,20);var i=t||0===a[0]&&100===a[1];r.setRange(i?null:+n[0].toFixed(o),i?null:+n[1].toFixed(o))}}function i(e){var t=e._minMaxSpan={},r=e._dataZoomModel;h(["min","max"],function(a){t[a+"Span"]=r.get(a+"Span");var n=r.get(a+"ValueSpan");if(null!=n&&(t[a+"ValueSpan"]=n,null!=(n=e.getAxisModel().axis.scale.parse(n)))){var o=e._dataExtent;t[a+"Span"]=s.linearMap(o[0]+n,o,[0,100],!0)}})}var l=r(0),s=r(4),u=r(240),h=l.each,c=s.asc,d=function(e,t,r,a){this._dimName=e,this._axisIndex=t,this._valueWindow,this._percentWindow,this._dataExtent,this._minMaxSpan,this.ecModel=a,this._dataZoomModel=r};d.prototype={constructor:d,hostedBy:function(e){return this._dataZoomModel===e},getDataValueWindow:function(){return this._valueWindow.slice()},getDataPercentWindow:function(){return this._percentWindow.slice()},getTargetSeriesModels:function(){var e=[],t=this.ecModel;return t.eachSeries(function(r){if(u.isCoordSupported(r.get("coordinateSystem"))){var a=this._dimName,n=t.queryComponents({mainType:a+"Axis",index:r.get(a+"AxisIndex"),id:r.get(a+"AxisId")})[0];this._axisIndex===(n&&n.componentIndex)&&e.push(r)}},this),e},getAxisModel:function(){return this.ecModel.getComponent(this._dimName+"Axis",this._axisIndex)},getOtherAxisModel:function(){var e,t,r=this._dimName,a=this.ecModel,n=this.getAxisModel();"x"===r||"y"===r?(t="gridIndex",e="x"===r?"y":"x"):(t="polarIndex",e="angle"===r?"radius":"angle");var o;return a.eachComponent(e+"Axis",function(e){(e.get(t)||0)===(n.get(t)||0)&&(o=e)}),o},getMinMaxSpan:function(){return l.clone(this._minMaxSpan)},calculateDataWindow:function(e){var t=this._dataExtent,r=this.getAxisModel(),a=r.axis.scale,n=this._dataZoomModel.getRangePropMode(),o=[0,100],i=[e.start,e.end],l=[];return h(["startValue","endValue"],function(t){l.push(null!=e[t]?a.parse(e[t]):null)}),h([0,1],function(e){var r=l[e],u=i[e];"percent"===n[e]?(null==u&&(u=o[e]),r=a.parse(s.linearMap(u,o,t,!0))):u=s.linearMap(r,t,o,!0),l[e]=r,i[e]=u}),{valueWindow:c(l),percentWindow:c(i)}},reset:function(e){if(e===this._dataZoomModel){this._dataExtent=a(this,this._dimName,this.getTargetSeriesModels());var t=this.calculateDataWindow(e.option);this._valueWindow=t.valueWindow,this._percentWindow=t.percentWindow,i(this),o(this)}},restore:function(e){e===this._dataZoomModel&&(this._valueWindow=this._percentWindow=null,o(this,!0))},filterData:function(e){function t(e){return e>=o[0]&&e<=o[1]}if(e===this._dataZoomModel){var r=this._dimName,a=this.getTargetSeriesModels(),n=e.get("filterMode"),o=this._valueWindow;if("none"!==n){var i=this.getOtherAxisModel();e.get("$fromToolbox")&&i&&"category"===i.get("type")&&(n="empty"),h(a,function(e){var a=e.getData(),i=e.coordDimToDataDim(r);"weakFilter"===n?a&&a.filterSelf(function(e){for(var t,r,n,l=0;l<i.length;l++){var s=a.get(i[l],e),u=!isNaN(s),h=s<o[0],c=s>o[1];if(u&&!h&&!c)return!0;u&&(n=!0),h&&(t=!0),c&&(r=!0)}return n&&t&&r}):a&&h(i,function(r){"empty"===n?e.setData(a.map(r,function(e){return t(e)?e:NaN})):a.filterSelf(r,t)})})}}}};var m=d;e.exports=m},function(e,t,r){"use strict";var a=r(131),n=a.extend({type:"dataZoom.inside",defaultOption:{disabled:!1,zoomLock:!1,zoomOnMouseWheel:!0,moveOnMouseMove:!0,preventDefaultMouseMove:!0}});e.exports=n},function(e,t,r){"use strict";var a=r(0),n=r(132),o=r(134),i=r(867),l=a.bind,s=n.extend({type:"dataZoom.inside",init:function(e,t){this._range},render:function(e,t,r,n){s.superApply(this,"render",arguments),i.shouldRecordRange(n,e.id)&&(this._range=e.getPercentRange()),a.each(this.getTargetCoordInfo(),function(t,n){var o=a.map(t,function(e){return i.generateCoordId(e.model)});a.each(t,function(t){var a=t.model,s=e.option;i.register(r,{coordId:i.generateCoordId(a),allCoordIds:o,containsPoint:function(e,t,r){return a.coordinateSystem.containPoint([t,r])},dataZoomId:e.id,throttleRate:e.get("throttle",!0),panGetRange:l(this._onPan,this,t,n),zoomGetRange:l(this._onZoom,this,t,n),zoomLock:s.zoomLock,disabled:s.disabled,roamControllerOpt:{zoomOnMouseWheel:s.zoomOnMouseWheel,moveOnMouseMove:s.moveOnMouseMove,preventDefaultMouseMove:s.preventDefaultMouseMove}})},this)},this)},dispose:function(){i.unregister(this.api,this.dataZoomModel.id),s.superApply(this,"dispose",arguments),this._range=null},_onPan:function(e,t,r,a,n,i,l,s,h){var c=this._range.slice(),d=e.axisModels[0];if(d){var m=u[t]([i,l],[s,h],d,r,e),p=m.signal*(c[1]-c[0])*m.pixel/m.pixelLength;return o(p,c,[0,100],"all"),this._range=c}},_onZoom:function(e,t,r,a,n,i){var l=this._range.slice(),s=e.axisModels[0];if(s){var h=u[t](null,[n,i],s,r,e),c=(h.signal>0?h.pixelStart+h.pixelLength-h.pixel:h.pixel-h.pixelStart)/h.pixelLength*(l[1]-l[0])+l[0];a=Math.max(1/a,0),l[0]=(l[0]-c)*a+c,l[1]=(l[1]-c)*a+c;var d=this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();return o(0,l,[0,100],0,d.minSpan,d.maxSpan),this._range=l}}}),u={grid:function(e,t,r,a,n){var o=r.axis,i={},l=n.model.coordinateSystem.getRect();return e=e||[0,0],"x"===o.dim?(i.pixel=t[0]-e[0],i.pixelLength=l.width,i.pixelStart=l.x,i.signal=o.inverse?1:-1):(i.pixel=t[1]-e[1],i.pixelLength=l.height,i.pixelStart=l.y,i.signal=o.inverse?-1:1),i},polar:function(e,t,r,a,n){var o=r.axis,i={},l=n.model.coordinateSystem,s=l.getRadiusAxis().getExtent(),u=l.getAngleAxis().getExtent();return e=e?l.pointToCoord(e):[0,0],t=l.pointToCoord(t),"radiusAxis"===r.mainType?(i.pixel=t[0]-e[0],i.pixelLength=s[1]-s[0],i.pixelStart=s[0],i.signal=o.inverse?1:-1):(i.pixel=t[1]-e[1],i.pixelLength=u[1]-u[0],i.pixelStart=u[0],i.signal=o.inverse?-1:1),i},singleAxis:function(e,t,r,a,n){var o=r.axis,i=n.model.coordinateSystem.getRect(),l={};return e=e||[0,0],"horizontal"===o.orient?(l.pixel=t[0]-e[0],l.pixelLength=i.width,l.pixelStart=i.x,l.signal=o.inverse?1:-1):(l.pixel=t[1]-e[1],l.pixelLength=i.height,l.pixelStart=i.y,l.signal=o.inverse?-1:1),l}},h=s;e.exports=h},function(e,t,r){"use strict";var a=r(131),n=a.extend({type:"dataZoom.select"});e.exports=n},function(e,t,r){"use strict";var a=r(132),n=a.extend({type:"dataZoom.select"});e.exports=n},function(e,t,r){"use strict";var a=r(131),n=a.extend({type:"dataZoom.slider",layoutMode:"box",defaultOption:{show:!0,right:"ph",top:"ph",width:"ph",height:"ph",left:null,bottom:null,backgroundColor:"rgba(47,69,84,0)",dataBackground:{lineStyle:{color:"#2f4554",width:.5,opacity:.3},areaStyle:{color:"rgba(47,69,84,0.3)",opacity:.3}},borderColor:"#ddd",fillerColor:"rgba(167,183,204,0.4)",handleIcon:"M8.2,13.6V3.9H6.3v9.7H3.1v14.9h3.3v9.7h1.8v-9.7h3.3V13.6H8.2z M9.7,24.4H4.8v-1.4h4.9V24.4z M9.7,19.1H4.8v-1.4h4.9V19.1z",handleSize:"100%",handleStyle:{color:"#a7b7cc"},labelPrecision:null,labelFormatter:null,showDetail:!0,showDataShadow:"auto",realtime:!0,zoomLock:!1,textStyle:{color:"#333"}}}),o=n;e.exports=o},function(e,t,r){"use strict";function a(e){return{x:"y",y:"x",radius:"angle",angle:"radius"}[e]}function n(e){return"vertical"===e?"ns-resize":"ew-resize"}var o=r(0),i=r(62),l=r(3),s=r(92),u=r(132),h=r(4),c=r(11),d=r(134),m=l.Rect,p=h.linearMap,f=h.asc,v=o.bind,y=o.each,g="horizontal",_=5,T=["line","bar","candlestick","scatter"],x=u.extend({type:"dataZoom.slider",init:function(e,t){this._displayables={},this._orient,this._range,this._handleEnds,this._size,this._handleWidth,this._handleHeight,this._location,this._dragging,this._dataShadowInfo,this.api=t},render:function(e,t,r,a){if(x.superApply(this,"render",arguments),s.createOrUpdate(this,"_dispatchZoomAction",this.dataZoomModel.get("throttle"),"fixRate"),this._orient=e.get("orient"),!1===this.dataZoomModel.get("show"))return void this.group.removeAll();a&&"dataZoom"===a.type&&a.from===this.uid||this._buildView(),this._updateView()},remove:function(){x.superApply(this,"remove",arguments),s.clear(this,"_dispatchZoomAction")},dispose:function(){x.superApply(this,"dispose",arguments),s.clear(this,"_dispatchZoomAction")},_buildView:function(){var e=this.group;e.removeAll(),this._resetLocation(),this._resetInterval();var t=this._displayables.barGroup=new l.Group;this._renderBackground(),this._renderHandle(),this._renderDataShadow(),e.add(t),this._positionGroup()},_resetLocation:function(){var e=this.dataZoomModel,t=this.api,r=this._findCoordRect(),a={width:t.getWidth(),height:t.getHeight()},n=this._orient===g?{right:a.width-r.x-r.width,top:a.height-30-7,width:r.width,height:30}:{right:7,top:r.y,width:30,height:r.height},i=c.getLayoutParams(e.option);o.each(["right","top","width","height"],function(e){"ph"===i[e]&&(i[e]=n[e])});var l=c.getLayoutRect(i,a,e.padding);this._location={x:l.x,y:l.y},this._size=[l.width,l.height],"vertical"===this._orient&&this._size.reverse()},_positionGroup:function(){var e=this.group,t=this._location,r=this._orient,a=this.dataZoomModel.getFirstTargetAxisModel(),n=a&&a.get("inverse"),o=this._displayables.barGroup,i=(this._dataShadowInfo||{}).otherAxisInverse;o.attr(r!==g||n?r===g&&n?{scale:i?[-1,1]:[-1,-1]}:"vertical"!==r||n?{scale:i?[-1,-1]:[-1,1],rotation:Math.PI/2}:{scale:i?[1,-1]:[1,1],rotation:Math.PI/2}:{scale:i?[1,1]:[1,-1]});var l=e.getBoundingRect([o]);e.attr("position",[t.x-l.x,t.y-l.y])},_getViewExtent:function(){return[0,this._size[0]]},_renderBackground:function(){var e=this.dataZoomModel,t=this._size,r=this._displayables.barGroup;r.add(new m({silent:!0,shape:{x:0,y:0,width:t[0],height:t[1]},style:{fill:e.get("backgroundColor")},z2:-40})),r.add(new m({shape:{x:0,y:0,width:t[0],height:t[1]},style:{fill:"transparent"},z2:0,onclick:o.bind(this._onClickPanelClick,this)}))},_renderDataShadow:function(){var e=this._dataShadowInfo=this._prepareDataShadowInfo();if(e){var t=this._size,r=e.series,a=r.getRawData(),n=r.getShadowDim?r.getShadowDim():e.otherDim;if(null!=n){var i=a.getDataExtent(n),s=.3*(i[1]-i[0]);i=[i[0]-s,i[1]+s];var u,h=[0,t[1]],c=[0,t[0]],d=[[t[0],0],[0,0]],m=[],f=c[1]/(a.count()-1),v=0,y=Math.round(a.count()/t[0]);a.each([n],function(e,t){if(y>0&&t%y)return void(v+=f);var r=null==e||isNaN(e)||""===e,a=r?0:p(e,i,h,!0);r&&!u&&t?(d.push([d[d.length-1][0],0]),m.push([m[m.length-1][0],0])):!r&&u&&(d.push([v,0]),m.push([v,0])),d.push([v,a]),m.push([v,a]),v+=f,u=r});var g=this.dataZoomModel;this._displayables.barGroup.add(new l.Polygon({shape:{points:d},style:o.defaults({fill:g.get("dataBackgroundColor")},g.getModel("dataBackground.areaStyle").getAreaStyle()),silent:!0,z2:-20})),this._displayables.barGroup.add(new l.Polyline({shape:{points:m},style:g.getModel("dataBackground.lineStyle").getLineStyle(),silent:!0,z2:-19}))}}},_prepareDataShadowInfo:function(){var e=this.dataZoomModel,t=e.get("showDataShadow");if(!1!==t){var r,n=this.ecModel;return e.eachTargetAxis(function(i,l){var s=e.getAxisProxy(i.name,l).getTargetSeriesModels();o.each(s,function(e){if(!(r||!0!==t&&o.indexOf(T,e.get("type"))<0)){var s,u=n.getComponent(i.axis,l).axis,h=a(i.name),c=e.coordinateSystem;null!=h&&c.getOtherAxis&&(s=c.getOtherAxis(u).inverse),r={thisAxis:u,series:e,thisDim:i.name,otherDim:h,otherAxisInverse:s}}},this)},this),r}},_renderHandle:function(){var e=this._displayables,t=e.handles=[],r=e.handleLabels=[],a=this._displayables.barGroup,o=this._size,s=this.dataZoomModel;a.add(e.filler=new m({draggable:!0,cursor:n(this._orient),drift:v(this._onDragMove,this,"all"),onmousemove:function(e){i.stop(e.event)},ondragstart:v(this._showDataInfo,this,!0),ondragend:v(this._onDragEnd,this),onmouseover:v(this._showDataInfo,this,!0),onmouseout:v(this._showDataInfo,this,!1),style:{fill:s.get("fillerColor"),textPosition:"inside"}})),a.add(new m(l.subPixelOptimizeRect({silent:!0,shape:{x:0,y:0,width:o[0],height:o[1]},style:{stroke:s.get("dataBackgroundColor")||s.get("borderColor"),lineWidth:1,fill:"rgba(0,0,0,0)"}}))),y([0,1],function(e){var o=l.createIcon(s.get("handleIcon"),{cursor:n(this._orient),draggable:!0,drift:v(this._onDragMove,this,e),onmousemove:function(e){i.stop(e.event)},ondragend:v(this._onDragEnd,this),onmouseover:v(this._showDataInfo,this,!0),onmouseout:v(this._showDataInfo,this,!1)},{x:-1,y:0,width:2,height:2}),u=o.getBoundingRect();this._handleHeight=h.parsePercent(s.get("handleSize"),this._size[1]),this._handleWidth=u.width/u.height*this._handleHeight,o.setStyle(s.getModel("handleStyle").getItemStyle());var c=s.get("handleColor");null!=c&&(o.style.fill=c),a.add(t[e]=o);var d=s.textStyleModel;this.group.add(r[e]=new l.Text({silent:!0,invisible:!0,style:{x:0,y:0,text:"",textVerticalAlign:"middle",textAlign:"center",textFill:d.getTextColor(),textFont:d.getFont()},z2:10}))},this)},_resetInterval:function(){var e=this._range=this.dataZoomModel.getPercentRange(),t=this._getViewExtent();this._handleEnds=[p(e[0],[0,100],t,!0),p(e[1],[0,100],t,!0)]},_updateInterval:function(e,t){var r=this.dataZoomModel,a=this._handleEnds,n=this._getViewExtent(),o=r.findRepresentativeAxisProxy().getMinMaxSpan(),i=[0,100];d(t,a,n,r.get("zoomLock")?"all":e,null!=o.minSpan?p(o.minSpan,i,n,!0):null,null!=o.maxSpan?p(o.maxSpan,i,n,!0):null),this._range=f([p(a[0],n,i,!0),p(a[1],n,i,!0)])},_updateView:function(e){var t=this._displayables,r=this._handleEnds,a=f(r.slice()),n=this._size;y([0,1],function(e){var a=t.handles[e],o=this._handleHeight;a.attr({scale:[o/2,o/2],position:[r[e],n[1]/2-o/2]})},this),t.filler.setShape({x:a[0],y:0,width:a[1]-a[0],height:n[1]}),this._updateDataInfo(e)},_updateDataInfo:function(e){function t(e){var t=l.getTransform(a.handles[e].parent,this.group),r=l.transformDirection(0===e?"right":"left",t),s=this._handleWidth/2+_,u=l.applyTransform([d[e]+(0===e?-s:s),this._size[1]/2],t);n[e].setStyle({x:u[0],y:u[1],textVerticalAlign:o===g?"middle":r,textAlign:o===g?r:"center",text:i[e]})}var r=this.dataZoomModel,a=this._displayables,n=a.handleLabels,o=this._orient,i=["",""];if(r.get("showDetail")){var s=r.findRepresentativeAxisProxy();if(s){var u=s.getAxisModel().axis,h=this._range,c=e?s.calculateDataWindow({start:h[0],end:h[1]}).valueWindow:s.getDataValueWindow();i=[this._formatLabel(c[0],u),this._formatLabel(c[1],u)]}}var d=f(this._handleEnds.slice());t.call(this,0),t.call(this,1)},_formatLabel:function(e,t){var r=this.dataZoomModel,a=r.get("labelFormatter"),n=r.get("labelPrecision");null!=n&&"auto"!==n||(n=t.getPixelPrecision());var i=null==e||isNaN(e)?"":"category"===t.type||"time"===t.type?t.scale.getLabel(Math.round(e)):e.toFixed(Math.min(n,20));return o.isFunction(a)?a(e,i):o.isString(a)?a.replace("{value}",i):i},_showDataInfo:function(e){e=this._dragging||e;var t=this._displayables.handleLabels;t[0].attr("invisible",!e),t[1].attr("invisible",!e)},_onDragMove:function(e,t,r){this._dragging=!0;var a=this._displayables.barGroup.getLocalTransform(),n=l.applyTransform([t,r],a,!0);this._updateInterval(e,n[0]);var o=this.dataZoomModel.get("realtime");this._updateView(!o),o&&o&&this._dispatchZoomAction()},_onDragEnd:function(){this._dragging=!1,this._showDataInfo(!1),this._dispatchZoomAction()},_onClickPanelClick:function(e){var t=this._size,r=this._displayables.barGroup.transformCoordToLocal(e.offsetX,e.offsetY);if(!(r[0]<0||r[0]>t[0]||r[1]<0||r[1]>t[1])){var a=this._handleEnds,n=(a[0]+a[1])/2;this._updateInterval("all",r[0]-n),this._updateView(),this._dispatchZoomAction()}},_dispatchZoomAction:function(){var e=this._range;this.api.dispatchAction({type:"dataZoom",from:this.uid,dataZoomId:this.dataZoomModel.id,start:e[0],end:e[1]})},_findCoordRect:function(){var e;if(y(this.getTargetCoordInfo(),function(t){if(!e&&t.length){var r=t[0].model.coordinateSystem;e=r.getRect&&r.getRect()}}),!e){var t=this.api.getWidth(),r=this.api.getHeight();e={x:.2*t,y:.2*r,width:.6*t,height:.6*r}}return e}}),w=x;e.exports=w},function(e,t,r){"use strict";function a(e,t){var r=l(e),a=t.dataZoomId,n=t.coordId;f.each(r,function(e,r){var o=e.dataZoomInfos;o[a]&&f.indexOf(t.allCoordIds,n)<0&&(delete o[a],e.count--)}),u(r);var o=r[n];o||(o=r[n]={coordId:n,dataZoomInfos:{},count:0},o.controller=s(e,o),o.dispatchAction=f.curry(m,e)),!o.dataZoomInfos[a]&&o.count++,o.dataZoomInfos[a]=t;var i=p(o.dataZoomInfos);o.controller.enable(i.controlType,i.opt),o.controller.setPointerChecker(t.containsPoint),y.createOrUpdate(o,"dispatchAction",t.throttleRate,"fixRate")}function n(e,t){var r=l(e);f.each(r,function(e){e.controller.dispose();var r=e.dataZoomInfos;r[t]&&(delete r[t],e.count--)}),u(r)}function o(e,t){if(e&&"dataZoom"===e.type&&e.batch)for(var r=0,a=e.batch.length;r<a;r++)if(e.batch[r].dataZoomId===t)return!1;return!0}function i(e){return e.type+"\0_"+e.id}function l(e){var t=e.getZr();return t[_]||(t[_]={})}function s(e,t){var r=new v(e.getZr());return r.on("pan",g(h,t)),r.on("zoom",g(c,t)),r}function u(e){f.each(e,function(t,r){t.count||(t.controller.dispose(),delete e[r])})}function h(e,t,r,a,n,o,i){d(e,function(l){return l.panGetRange(e.controller,t,r,a,n,o,i)})}function c(e,t,r,a){d(e,function(n){return n.zoomGetRange(e.controller,t,r,a)})}function d(e,t){var r=[];f.each(e.dataZoomInfos,function(e){var a=t(e);!e.disabled&&a&&r.push({dataZoomId:e.dataZoomId,start:a[0],end:a[1]})}),e.dispatchAction(r)}function m(e,t){e.dispatchAction({type:"dataZoom",batch:t})}function p(e){var t,r={},a={true:2,move:1,false:0,undefined:-1};return f.each(e,function(e){var n=!e.disabled&&(!e.zoomLock||"move");a[n]>a[t]&&(t=n),f.extend(r,e.roamControllerOpt)}),{controlType:t,opt:r}}var f=r(0),v=r(166),y=r(92),g=f.curry,_="\0_ec_dataZoom_roams";t.register=a,t.unregister=n,t.shouldRecordRange=o,t.generateCoordId=i},function(e,t,r){"use strict";r(349),r(131),r(132),r(863),r(864),r(347),r(346)},function(e,t,r){"use strict";function a(e,t){t.update="updateView",n.registerAction(t,function(t,r){var a={};return r.eachComponent({mainType:"geo",query:t},function(r){r[e](t.name);var n=r.coordinateSystem;o.each(n.regions,function(e){a[e.name]=r.isSelected(e.name)||!1})}),{selected:a,name:t.name}})}var n=r(2),o=r(0);r(933),r(168),r(870),r(328),a("toggleSelected",{type:"geoToggleSelect",event:"geoselectchanged"}),a("select",{type:"geoSelect",event:"geoselected"}),a("unSelect",{type:"geoUnSelect",event:"geounselected"})},function(e,t,r){"use strict";var a=r(351),n=r(2),o=n.extendComponentView({type:"geo",init:function(e,t){var r=new a(t,!0);this._mapDraw=r,this.group.add(r.group)},render:function(e,t,r,a){if(!a||"geoToggleSelect"!==a.type||a.from!==this.uid){var n=this._mapDraw;e.get("show")?n.draw(e,t,r,this,a):this._mapDraw.group.removeAll(),this.group.silent=e.get("silent")}},dispose:function(){this._mapDraw&&this._mapDraw.remove()}});e.exports=o},function(e,t,r){"use strict";function a(e,t,r,a){var n=r.type,o=p[n.charAt(0).toUpperCase()+n.slice(1)],i=new o(r);t.add(i),a.set(e,i),i.__ecGraphicId=e}function n(e,t){var r=e&&e.parent;r&&("group"===e.type&&e.traverse(function(e){n(e,t)}),t.removeKey(e.__ecGraphicId),r.remove(e))}function o(e){return e=d.extend({},e),d.each(["id","parentId","$action","hv","bounding"].concat(f.LOCATION_PARAMS),function(t){delete e[t]}),e}function i(e,t){var r;return d.each(t,function(t){null!=e[t]&&"auto"!==e[t]&&(r=!0)}),r}function l(e,t){var r=e.exist;if(t.id=e.keyInfo.id,!t.type&&r&&(t.type=r.type),null==t.parentId){var a=t.parentOption;a?t.parentId=a.id:r&&(t.parentId=r.parentId)}t.parentOption=null}function s(e,t,r){var a=d.extend({},r),n=e[t],o=r.$action||"merge";"merge"===o?n?(d.merge(n,a,!0),f.mergeLayoutParam(n,a,{ignoreSize:!0}),f.copyLayoutParams(r,n)):e[t]=a:"replace"===o?e[t]=a:"remove"===o&&n&&(e[t]=null)}function u(e,t){e&&(e.hv=t.hv=[i(t,["left","right"]),i(t,["top","bottom"])],"group"===e.type&&(null==e.width&&(e.width=t.width=0),null==e.height&&(e.height=t.height=0)))}var h=r(9),c=(h.__DEV__,r(2)),d=r(0),m=r(10),p=r(3),f=r(11);c.registerPreprocessor(function(e){var t=e.graphic;d.isArray(t)?t[0]&&t[0].elements?e.graphic=[e.graphic[0]]:e.graphic=[{elements:t}]:t&&!t.elements&&(e.graphic=[{elements:[t]}])});var v=c.extendComponentModel({type:"graphic",defaultOption:{elements:[],parentId:null},_elOptionsToUpdate:null,mergeOption:function(e){var t=this.option.elements;this.option.elements=null,v.superApply(this,"mergeOption",arguments),this.option.elements=t},optionUpdated:function(e,t){var r=this.option,a=(t?r:e).elements,n=r.elements=t?[]:r.elements,o=[];this._flatten(a,o);var i=m.mappingToExists(n,o);m.makeIdAndName(i);var h=this._elOptionsToUpdate=[];d.each(i,function(e,t){var r=e.option;r&&(h.push(r),l(e,r),s(n,t,r),u(n[t],r))},this);for(var c=n.length-1;c>=0;c--)null==n[c]?n.splice(c,1):delete n[c].$action},_flatten:function(e,t,r){d.each(e,function(e){if(e){r&&(e.parentOption=r),t.push(e);var a=e.children;"group"===e.type&&a&&this._flatten(a,t,e),delete e.children}},this)},useElOptionsToUpdate:function(){var e=this._elOptionsToUpdate;return this._elOptionsToUpdate=null,e}});c.extendComponentView({type:"graphic",init:function(e,t){this._elMap=d.createHashMap(),this._lastGraphicModel},render:function(e,t,r){e!==this._lastGraphicModel&&this._clear(),this._lastGraphicModel=e,this._updateElements(e,r),this._relocate(e,r)},_updateElements:function(e,t){var r=e.useElOptionsToUpdate();if(r){var i=this._elMap,l=this.group;d.each(r,function(e){var t=e.$action,r=e.id,s=i.get(r),u=e.parentId,h=null!=u?i.get(u):l;if("text"===e.type){var c=e.style;e.hv&&e.hv[1]&&(c.textVerticalAlign=c.textBaseline=null),!c.hasOwnProperty("textFill")&&c.fill&&(c.textFill=c.fill),!c.hasOwnProperty("textStroke")&&c.stroke&&(c.textStroke=c.stroke)}var d=o(e);t&&"merge"!==t?"replace"===t?(n(s,i),a(r,h,d,i)):"remove"===t&&n(s,i):s?s.attr(d):a(r,h,d,i);var m=i.get(r);m&&(m.__ecGraphicWidth=e.width,m.__ecGraphicHeight=e.height)})}},_relocate:function(e,t){for(var r=e.option.elements,a=this.group,n=this._elMap,o=r.length-1;o>=0;o--){var i=r[o],l=n.get(i.id);if(l){var s=l.parent,u=s===a?{width:t.getWidth(),height:t.getHeight()}:{width:s.__ecGraphicWidth||0,height:s.__ecGraphicHeight||0};f.positionElement(l,i,u,null,{hv:i.hv,boundingMode:i.bounding})}}},_clear:function(){var e=this._elMap;e.each(function(t){n(t,e)}),this._elMap=d.createHashMap()},dispose:function(){this._clear()}})},function(e,t,r){"use strict";r(133),r(343),r(130)},function(e,t,r){"use strict";var a=r(2);r(356),r(876),r(357);var n=r(877),o=r(24);a.registerProcessor(n),o.registerSubTypeDefaulter("legend",function(){return"plain"})},function(e,t,r){"use strict";function a(e,t,r){var a=e.getOrient(),n=[1,1];n[a.index]=0,i(t,r,{type:"box",ignoreSize:n})}var n=r(356),o=r(11),i=o.mergeLayoutParam,l=o.getLayoutParams,s=n.extend({type:"legend.scroll",setScrollDataIndex:function(e){this.option.scrollDataIndex=e},defaultOption:{scrollDataIndex:0,pageButtonItemGap:5,pageButtonGap:null,pageButtonPosition:"end",pageFormatter:"{current}/{total}",pageIcons:{horizontal:["M0,0L12,-10L12,10z","M0,0L-12,-10L-12,10z"],vertical:["M0,0L20,0L10,-20z","M0,0L20,0L10,20z"]},pageIconColor:"#2f4554",pageIconInactiveColor:"#aaa",pageIconSize:15,pageTextStyle:{color:"#333"},animationDurationUpdate:800},init:function(e,t,r,n){var o=l(e);s.superCall(this,"init",e,t,r,n),a(this,e,o)},mergeOption:function(e,t){s.superCall(this,"mergeOption",e,t),a(this,this.option,e)},getOrient:function(){return"vertical"===this.get("orient")?{index:1,name:"vertical"}:{index:0,name:"horizontal"}}}),u=s;e.exports=u},function(e,t,r){"use strict";var a=r(0),n=r(3),o=r(11),i=r(357),l=n.Group,s=["width","height"],u=["x","y"],h=i.extend({type:"legend.scroll",newlineDisabled:!0,init:function(){h.superCall(this,"init"),this._currentIndex=0,this.group.add(this._containerGroup=new l),this._containerGroup.add(this.getContentGroup()),this.group.add(this._controllerGroup=new l),this._showController},resetInner:function(){h.superCall(this,"resetInner"),this._controllerGroup.removeAll(),this._containerGroup.removeClipPath(),this._containerGroup.__rectSize=null},renderInner:function(e,t,r,o){function i(e,r){var i=e+"DataIndex",h=n.createIcon(t.get("pageIcons",!0)[t.getOrient().name][r],{onclick:a.bind(l._pageGo,l,i,t,o)},{x:-u[0]/2,y:-u[1]/2,width:u[0],height:u[1]});h.name=e,s.add(h)}var l=this;h.superCall(this,"renderInner",e,t,r,o);var s=this._controllerGroup,u=t.get("pageIconSize",!0);a.isArray(u)||(u=[u,u]),i("pagePrev",0);var c=t.getModel("pageTextStyle");s.add(new n.Text({name:"pageText",style:{textFill:c.getTextColor(),font:c.getFont(),textVerticalAlign:"middle",textAlign:"center"},silent:!0})),i("pageNext",1)},layoutInner:function(e,t,r){var i=this.getContentGroup(),l=this._containerGroup,h=this._controllerGroup,c=e.getOrient().index,d=s[c],m=s[1-c],p=u[1-c];o.box(e.get("orient"),i,e.get("itemGap"),c?r.width:null,c?null:r.height),o.box("horizontal",h,e.get("pageButtonItemGap",!0));var f=i.getBoundingRect(),v=h.getBoundingRect(),y=this._showController=f[d]>r[d],g=[-f.x,-f.y];g[c]=i.position[c];var _=[0,0],T=[-v.x,-v.y],x=a.retrieve2(e.get("pageButtonGap",!0),e.get("itemGap",!0));y&&("end"===e.get("pageButtonPosition",!0)?T[c]+=r[d]-v[d]:_[c]+=v[d]+x),T[1-c]+=f[m]/2-v[m]/2,i.attr("position",g),l.attr("position",_),h.attr("position",T);var w=this.group.getBoundingRect(),w={x:0,y:0};if(w[d]=y?r[d]:f[d],w[m]=Math.max(f[m],v[m]),w[p]=Math.min(0,v[p]+T[1-c]),l.__rectSize=r[d],y){var N={x:0,y:0};N[d]=Math.max(r[d]-v[d]-x,0),N[m]=w[m],l.setClipPath(new n.Rect({shape:N})),l.__rectSize=N[d]}else h.eachChild(function(e){e.attr({invisible:!0,silent:!0})});var b=this._getPageInfo(e);return null!=b.pageIndex&&n.updateProps(i,{position:b.contentPosition},!!y&&e),this._updatePageInfoView(e,b),w},_pageGo:function(e,t,r){var a=this._getPageInfo(t)[e];null!=a&&r.dispatchAction({type:"legendScroll",scrollDataIndex:a,legendId:t.id})},_updatePageInfoView:function(e,t){var r=this._controllerGroup;a.each(["pagePrev","pageNext"],function(a){var n=null!=t[a+"DataIndex"],o=r.childOfName(a);o&&(o.setStyle("fill",n?e.get("pageIconColor",!0):e.get("pageIconInactiveColor",!0)),o.cursor=n?"pointer":"default")});var n=r.childOfName("pageText"),o=e.get("pageFormatter"),i=t.pageIndex,l=null!=i?i+1:0,s=t.pageCount;n&&o&&n.setStyle("text",a.isString(o)?o.replace("{current}",l).replace("{total}",s):o({current:l,total:s}))},_getPageInfo:function(e){function t(e){var t=e.getBoundingRect().clone();return t[f]+=e.position[d],t}var r,a,n,o,i=e.get("scrollDataIndex",!0),l=this.getContentGroup(),h=l.getBoundingRect(),c=this._containerGroup.__rectSize,d=e.getOrient().index,m=s[d],p=s[1-d],f=u[d],v=l.position.slice();this._showController?l.eachChild(function(e){e.__legendDataIndex===i&&(o=e)}):o=l.childAt(0);var y=c?Math.ceil(h[m]/c):0;if(o){var g=o.getBoundingRect(),_=o.position[d]+g[f];v[d]=-_-h[f],r=Math.floor(y*(_+g[f]+c/2)/h[m]),r=h[m]&&y?Math.max(0,Math.min(y-1,r)):-1;var T={x:0,y:0};T[m]=c,T[p]=h[p],T[f]=-v[d]-h[f];var x,w=l.children();if(l.eachChild(function(e,r){var a=t(e);a.intersect(T)&&(null==x&&(x=r),n=e.__legendDataIndex),r===w.length-1&&a[f]+a[m]<=T[f]+T[m]&&(n=null)}),null!=x){var N=w[x],b=t(N);if(T[f]=b[f]+b[m]-T[m],x<=0&&b[f]>=T[f])a=null;else{for(;x>0&&t(w[x-1]).intersect(T);)x--;a=w[x].__legendDataIndex}}}return{contentPosition:v,pageIndex:r,pageCount:y,pagePrevDataIndex:a,pageNextDataIndex:n}}}),c=h;e.exports=c},function(e,t,r){"use strict";function a(e,t,r){var a,n={},i="toggleSelected"===e;return r.eachComponent("legend",function(r){i&&null!=a?r[a?"select":"unSelect"](t.name):(r[e](t.name),a=r.isSelected(t.name));var l=r.getData();o.each(l,function(e){var t=e.get("name");if("\n"!==t&&""!==t){var a=r.isSelected(t);n.hasOwnProperty(t)?n[t]=n[t]&&a:n[t]=a}})}),{name:t.name,selected:n}}var n=r(2),o=r(0);n.registerAction("legendToggleSelect","legendselectchanged",o.curry(a,"toggleSelected")),n.registerAction("legendSelect","legendselected",o.curry(a,"select")),n.registerAction("legendUnSelect","legendunselected",o.curry(a,"unSelect"))},function(e,t,r){"use strict";function a(e){var t=e.findComponents({mainType:"legend"});t&&t.length&&e.filterSeries(function(e){for(var r=0;r<t.length;r++)if(!t[r].isSelected(e.name))return!1;return!0})}e.exports=a},function(e,t,r){"use strict";r(2).registerAction("legendScroll","legendscroll",function(e,t){var r=e.scrollDataIndex;null!=r&&t.eachComponent({mainType:"legend",subType:"scroll",query:e},function(e){e.setScrollDataIndex(r)})})},function(e,t,r){"use strict";r(873),r(874),r(875),r(878)},function(e,t,r){"use strict";var a=r(2);r(883),r(884),a.registerPreprocessor(function(e){e.markArea=e.markArea||{}})},function(e,t,r){"use strict";var a=r(2);r(885),r(886),a.registerPreprocessor(function(e){e.markLine=e.markLine||{}})},function(e,t,r){"use strict";var a=r(2);r(887),r(888),a.registerPreprocessor(function(e){e.markPoint=e.markPoint||{}})},function(e,t,r){"use strict";var a=r(244),n=a.extend({type:"markArea",defaultOption:{zlevel:0,z:1,tooltip:{trigger:"item"},animation:!1,label:{normal:{show:!0,position:"top"},emphasis:{show:!0,position:"top"}},itemStyle:{normal:{borderWidth:0}}}});e.exports=n},function(e,t,r){"use strict";function a(e){return!isNaN(e)&&!isFinite(e)}function n(e,t,r,n){var o=1-e;return a(t[o])&&a(r[o])}function o(e,t){var r=t.coord[0],a=t.coord[1];return!("cartesian2d"!==e.type||!r||!a||!n(1,r,a,e)&&!n(0,r,a,e))||m.dataFilter(e,{coord:r,x:t.x0,y:t.y0})||m.dataFilter(e,{coord:a,x:t.x1,y:t.y1})}function i(e,t,r,n,o){var i,l=n.coordinateSystem,s=e.getItemModel(t),u=c.parsePercent(s.get(r[0]),o.getWidth()),h=c.parsePercent(s.get(r[1]),o.getHeight());if(isNaN(u)||isNaN(h)){if(n.getMarkerPosition)i=n.getMarkerPosition(e.getValues(r,t));else{var d=e.get(r[0],t),m=e.get(r[1],t);i=l.dataToPoint([d,m],!0)}if("cartesian2d"===l.type){var p=l.getAxis("x"),f=l.getAxis("y"),d=e.get(r[0],t),m=e.get(r[1],t);a(d)?i[0]=p.toGlobalCoord(p.getExtent()["x0"===r[0]?0:1]):a(m)&&(i[1]=f.toGlobalCoord(f.getExtent()["y0"===r[1]?0:1]))}isNaN(u)||(i[0]=u),isNaN(h)||(i[1]=h)}else i=[u,h];return i}function l(e,t,r){var a,n,i=["x0","y0","x1","y1"];e?(a=s.map(e&&e.dimensions,function(e){var r=t.getData().getDimensionInfo(t.coordDimToDataDim(e)[0])||{};return r.name=e,r}),n=new h(s.map(i,function(e,t){return{name:e,type:a[t%2].type}}),r)):(a=[{name:"value",type:"float"}],n=new h(a,r));var l=s.map(r.get("data"),s.curry(f,t,e,r));e&&(l=s.filter(l,s.curry(o,e)));var u=e?function(e,t,r,a){return e.coord[Math.floor(a/2)][a%2]}:function(e){return e.value};return n.initData(l,null,u),n.hasItemOption=!0,n}var s=r(0),u=r(63),h=r(23),c=r(4),d=r(3),m=r(246),p=r(245),f=function(e,t,r,a){var n=m.dataTransform(e,a[0]),o=m.dataTransform(e,a[1]),i=s.retrieve,l=n.coord,u=o.coord;l[0]=i(l[0],-1/0),l[1]=i(l[1],-1/0),u[0]=i(u[0],1/0),u[1]=i(u[1],1/0);var h=s.mergeAll([{},n,o]);return h.coord=[n.coord,o.coord],h.x0=n.x,h.y0=n.y,h.x1=o.x,h.y1=o.y,h},v=[["x0","y0"],["x1","y0"],["x1","y1"],["x0","y1"]];p.extend({type:"markArea",updateLayout:function(e,t,r){t.eachSeries(function(e){var t=e.markAreaModel;if(t){var a=t.getData();a.each(function(t){var n=s.map(v,function(n){return i(a,t,n,e,r)});a.setItemLayout(t,n),a.getItemGraphicEl(t).setShape("points",n)})}},this)},renderSeries:function(e,t,r,a){var n=e.coordinateSystem,o=e.name,h=e.getData(),c=this.markerGroupMap,m=c.get(o)||c.set(o,{group:new d.Group});this.group.add(m.group),m.__keep=!0;var p=l(n,e,t);t.setData(p),p.each(function(t){p.setItemLayout(t,s.map(v,function(r){return i(p,t,r,e,a)})),p.setItemVisual(t,{color:h.getVisual("color")})}),p.diff(m.__data).add(function(e){var t=new d.Polygon({shape:{points:p.getItemLayout(e)}});p.setItemGraphicEl(e,t),m.group.add(t)}).update(function(e,r){var a=m.__data.getItemGraphicEl(r);d.updateProps(a,{shape:{points:p.getItemLayout(e)}},t,e),m.group.add(a),p.setItemGraphicEl(e,a)}).remove(function(e){var t=m.__data.getItemGraphicEl(e);m.group.remove(t)}).execute(),p.eachItemGraphicEl(function(e,r){var a=p.getItemModel(r),n=a.getModel("label.normal"),o=a.getModel("label.emphasis"),i=p.getItemVisual(r,"color");e.useStyle(s.defaults(a.getModel("itemStyle.normal").getItemStyle(),{fill:u.modifyAlpha(i,.4),stroke:i})),e.hoverStyle=a.getModel("itemStyle.emphasis").getItemStyle(),d.setLabelStyle(e.style,e.hoverStyle,n,o,{labelFetcher:t,labelDataIndex:r,defaultText:p.getName(r)||"",isRectText:!0,autoColor:i}),d.setHoverStyle(e,{}),e.dataModel=t}),m.__data=p,m.group.silent=t.get("silent")||e.get("silent")}})},function(e,t,r){"use strict";var a=r(244),n=a.extend({type:"markLine",defaultOption:{zlevel:0,z:5,symbol:["circle","arrow"],symbolSize:[8,16],precision:2,tooltip:{trigger:"item"},label:{normal:{show:!0,position:"end"},emphasis:{show:!0}},lineStyle:{normal:{type:"dashed"},emphasis:{width:3}},animationEasing:"linear"}});e.exports=n},function(e,t,r){"use strict";function a(e){return!isNaN(e)&&!isFinite(e)}function n(e,t,r,n){var o=1-e,i=n.dimensions[e];return a(t[o])&&a(r[o])&&t[e]===r[e]&&n.getAxis(i).containData(t[e])}function o(e,t){if("cartesian2d"===e.type){var r=t[0].coord,a=t[1].coord;if(r&&a&&(n(1,r,a,e)||n(0,r,a,e)))return!0}return c.dataFilter(e,t[0])&&c.dataFilter(e,t[1])}function i(e,t,r,n,o){var i,l=n.coordinateSystem,s=e.getItemModel(t),u=h.parsePercent(s.get("x"),o.getWidth()),c=h.parsePercent(s.get("y"),o.getHeight());if(isNaN(u)||isNaN(c)){if(n.getMarkerPosition)i=n.getMarkerPosition(e.getValues(e.dimensions,t));else{var d=l.dimensions,m=e.get(d[0],t),p=e.get(d[1],t);i=l.dataToPoint([m,p])}if("cartesian2d"===l.type){var f=l.getAxis("x"),v=l.getAxis("y"),d=l.dimensions;a(e.get(d[0],t))?i[0]=f.toGlobalCoord(f.getExtent()[r?0:1]):a(e.get(d[1],t))&&(i[1]=v.toGlobalCoord(v.getExtent()[r?0:1]))}isNaN(u)||(i[0]=u),isNaN(c)||(i[1]=c)}else i=[u,c];e.setItemLayout(t,i)}function l(e,t,r){var a;a=e?s.map(e&&e.dimensions,function(e){var r=t.getData().getDimensionInfo(t.coordDimToDataDim(e)[0])||{};return r.name=e,r}):[{name:"value",type:"float"}];var n=new u(a,r),i=new u(a,r),l=new u([],r),h=s.map(r.get("data"),s.curry(p,t,e,r));e&&(h=s.filter(h,s.curry(o,e)));var d=e?c.dimValueGetter:function(e){return e.value};return n.initData(s.map(h,function(e){return e[0]}),null,d),i.initData(s.map(h,function(e){return e[1]}),null,d),l.initData(s.map(h,function(e){return e[2]})),l.hasItemOption=!0,{from:n,to:i,line:l}}var s=r(0),u=r(23),h=r(4),c=r(246),d=r(238),m=r(245),p=function(e,t,r,a){var n=e.getData(),o=a.type;if(!s.isArray(a)&&("min"===o||"max"===o||"average"===o||null!=a.xAxis||null!=a.yAxis)){var i,l;if(null!=a.yAxis||null!=a.xAxis)i=null!=a.yAxis?"y":"x",t.getAxis(i),l=s.retrieve(a.yAxis,a.xAxis);else{var u=c.getAxisInfo(a,n,t,e);i=u.valueDataDim,u.valueAxis,l=c.numCalculate(n,i,o)}var h="x"===i?0:1,d=1-h,m=s.clone(a),p={};m.type=null,m.coord=[],p.coord=[],m.coord[d]=-1/0,p.coord[d]=1/0;var f=r.get("precision");f>=0&&"number"==typeof l&&(l=+l.toFixed(Math.min(f,20))),m.coord[h]=p.coord[h]=l,a=[m,p,{type:o,valueIndex:a.valueIndex,value:l}]}return a=[c.dataTransform(e,a[0]),c.dataTransform(e,a[1]),s.extend({},a[2])],a[2].type=a[2].type||"",s.merge(a[2],a[0]),s.merge(a[2],a[1]),a},f=m.extend({type:"markLine",updateLayout:function(e,t,r){t.eachSeries(function(e){var t=e.markLineModel;if(t){var a=t.getData(),n=t.__from,o=t.__to;n.each(function(t){i(n,t,!0,e,r),i(o,t,!1,e,r)}),a.each(function(e){a.setItemLayout(e,[n.getItemLayout(e),o.getItemLayout(e)])}),this.markerGroupMap.get(e.id).updateLayout()}},this)},renderSeries:function(e,t,r,a){function n(t,r,n){var o=t.getItemModel(r);i(t,r,n,e,a),t.setItemVisual(r,{symbolSize:o.get("symbolSize")||_[n?0:1],symbol:o.get("symbol",!0)||g[n?0:1],color:o.get("itemStyle.normal.color")||h.getVisual("color")})}var o=e.coordinateSystem,u=e.id,h=e.getData(),c=this.markerGroupMap,m=c.get(u)||c.set(u,new d);this.group.add(m.group);var p=l(o,e,t),f=p.from,v=p.to,y=p.line;t.__from=f,t.__to=v,t.setData(y);var g=t.get("symbol"),_=t.get("symbolSize");s.isArray(g)||(g=[g,g]),"number"==typeof _&&(_=[_,_]),p.from.each(function(e){n(f,e,!0),n(v,e,!1)}),y.each(function(e){var t=y.getItemModel(e).get("lineStyle.normal.color");y.setItemVisual(e,{color:t||f.getItemVisual(e,"color")}),y.setItemLayout(e,[f.getItemLayout(e),v.getItemLayout(e)]),y.setItemVisual(e,{fromSymbolSize:f.getItemVisual(e,"symbolSize"),fromSymbol:f.getItemVisual(e,"symbol"),toSymbolSize:v.getItemVisual(e,"symbolSize"),toSymbol:v.getItemVisual(e,"symbol")})}),m.updateData(y),p.line.eachItemGraphicEl(function(e,r){e.traverse(function(e){e.dataModel=t})}),m.__keep=!0,m.group.silent=t.get("silent")||e.get("silent")}});e.exports=f},function(e,t,r){"use strict";var a=r(244),n=a.extend({type:"markPoint",defaultOption:{zlevel:0,z:5,symbol:"pin",symbolSize:50,tooltip:{trigger:"item"},label:{normal:{show:!0,position:"inside"},emphasis:{show:!0}},itemStyle:{normal:{borderWidth:2}}}});e.exports=n},function(e,t,r){"use strict";function a(e,t,r){var a=t.coordinateSystem;e.each(function(n){var o,i=e.getItemModel(n),s=l.parsePercent(i.get("x"),r.getWidth()),u=l.parsePercent(i.get("y"),r.getHeight());if(isNaN(s)||isNaN(u)){if(t.getMarkerPosition)o=t.getMarkerPosition(e.getValues(e.dimensions,n));else if(a){var h=e.get(a.dimensions[0],n),c=e.get(a.dimensions[1],n);o=a.dataToPoint([h,c])}}else o=[s,u];isNaN(s)||(o[0]=s),isNaN(u)||(o[1]=u),e.setItemLayout(n,o)})}function n(e,t,r){var a;a=e?o.map(e&&e.dimensions,function(e){var r=t.getData().getDimensionInfo(t.coordDimToDataDim(e)[0])||{};return r.name=e,r}):[{name:"value",type:"float"}];var n=new s(a,r),i=o.map(r.get("data"),o.curry(u.dataTransform,t));return e&&(i=o.filter(i,o.curry(u.dataFilter,e))),n.initData(i,null,e?u.dimValueGetter:function(e){return e.value}),n}var o=r(0),i=r(128),l=r(4),s=r(23),u=r(246),h=r(245),c=h.extend({type:"markPoint",updateLayout:function(e,t,r){t.eachSeries(function(e){var t=e.markPointModel;t&&(a(t.getData(),e,r),this.markerGroupMap.get(e.id).updateLayout(t))},this)},renderSeries:function(e,t,r,o){var l=e.coordinateSystem,s=e.id,u=e.getData(),h=this.markerGroupMap,c=h.get(s)||h.set(s,new i),d=n(l,e,t);t.setData(d),a(t.getData(),e,o),d.each(function(e){var r=d.getItemModel(e),a=r.getShallow("symbolSize");"function"==typeof a&&(a=a(t.getRawValue(e),t.getDataParams(e))),d.setItemVisual(e,{symbolSize:a,color:r.get("itemStyle.normal.color")||u.getVisual("color"),symbol:r.getShallow("symbol")})}),c.updateData(d),this.group.add(c.group),d.eachItemGraphicEl(function(e){e.traverse(function(e){e.dataModel=t})}),c.__keep=!0,c.group.silent=t.get("silent")||e.get("silent")}});e.exports=c},function(e,t,r){"use strict";r(372),r(844),r(841)},function(e,t,r){"use strict";var a=r(2),n=r(0),o=r(960);r(248),r(837),r(893),r(130),r(847),a.registerLayout(n.curry(o,"bar")),a.extendComponentView({type:"polar"})},function(e,t,r){"use strict";r(951),r(952),r(892)},function(e,t,r){"use strict";var a=r(9),n=(a.__DEV__,r(2)),o=r(0),i=r(90),l=r(3),s=["axisLine","axisTickLabel","axisName"],u=n.extendComponentView({type:"radar",render:function(e,t,r){this.group.removeAll(),this._buildAxes(e),this._buildSplitLineAndArea(e)},_buildAxes:function(e){var t=e.coordinateSystem,r=t.getIndicatorAxes(),a=o.map(r,function(e){return new i(e.model,{position:[t.cx,t.cy],rotation:e.angle,labelDirection:-1,tickDirection:-1,nameDirection:1})});o.each(a,function(e){o.each(s,e.add,e),this.group.add(e.getGroup())},this)},_buildSplitLineAndArea:function(e){function t(e,t,r){var a=r%t.length;return e[a]=e[a]||[],a}var r=e.coordinateSystem,a=r.getIndicatorAxes();if(a.length){var n=e.get("shape"),i=e.getModel("splitLine"),s=e.getModel("splitArea"),u=i.getModel("lineStyle"),h=s.getModel("areaStyle"),c=i.get("show"),d=s.get("show"),m=u.get("color"),p=h.get("color");m=o.isArray(m)?m:[m],p=o.isArray(p)?p:[p];var f=[],v=[];if("circle"===n)for(var y=a[0].getTicksCoords(),g=r.cx,_=r.cy,T=0;T<y.length;T++){if(c){var x=t(f,m,T);f[x].push(new l.Circle({shape:{cx:g,cy:_,r:y[T]}}))}if(d&&T<y.length-1){var x=t(v,p,T);v[x].push(new l.Ring({shape:{cx:g,cy:_,r0:y[T],r:y[T+1]}}))}}else for(var w,N=o.map(a,function(e,t){var a=e.getTicksCoords();return w=null==w?a.length-1:Math.min(a.length-1,w),o.map(a,function(e){return r.coordToPoint(e,t)})}),b=[],T=0;T<=w;T++){for(var L=[],S=0;S<a.length;S++)L.push(N[S][T]);if(L[0]&&L.push(L[0].slice()),c){var x=t(f,m,T);f[x].push(new l.Polyline({shape:{points:L}}))}if(d&&b){var x=t(v,p,T-1);v[x].push(new l.Polygon({shape:{points:L.concat(b)}}))}b=L.slice().reverse()}var k=u.getLineStyle(),D=h.getAreaStyle();o.each(v,function(e,t){this.group.add(l.mergePath(e,{style:o.defaults({stroke:"none",fill:p[t%p.length]},D),silent:!0}))},this),o.each(f,function(e,t){this.group.add(l.mergePath(e,{style:o.defaults({fill:"none",stroke:m[t%m.length]},k),silent:!0}))},this)}}});e.exports=u},function(e,t,r){"use strict";r(248),r(842)},function(e,t,r){"use strict";var a=r(2),n=r(900);r(902),r(901),r(895),r(896),a.registerPreprocessor(n)},function(e,t,r){"use strict";var a=r(0),n=r(898),o=r(10),i=n.extend({type:"timeline.slider",defaultOption:{backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,orient:"horizontal",inverse:!1,tooltip:{trigger:"item"},symbol:"emptyCircle",symbolSize:10,lineStyle:{show:!0,width:2,color:"#304654"},label:{position:"auto",normal:{show:!0,interval:"auto",rotate:0,color:"#304654"},emphasis:{show:!0,color:"#c23531"}},itemStyle:{normal:{color:"#304654",borderWidth:1},emphasis:{color:"#c23531"}},checkpointStyle:{symbol:"circle",symbolSize:13,color:"#c23531",borderWidth:5,borderColor:"rgba(194,53,49, 0.5)",animation:!0,animationDuration:300,animationEasing:"quinticInOut"},controlStyle:{show:!0,showPlayBtn:!0,showPrevBtn:!0,showNextBtn:!0,itemSize:22,itemGap:12,position:"left",playIcon:"path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z",stopIcon:"path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z",nextIcon:"path://M18.6,50.8l22.5-22.5c0.2-0.2,0.3-0.4,0.3-0.7c0-0.3-0.1-0.5-0.3-0.7L18.7,4.4c-0.1-0.1-0.2-0.3-0.2-0.5 c0-0.4,0.3-0.8,0.8-0.8c0.2,0,0.5,0.1,0.6,0.3l23.5,23.5l0,0c0.2,0.2,0.3,0.4,0.3,0.7c0,0.3-0.1,0.5-0.3,0.7l-0.1,0.1L19.7,52 c-0.1,0.1-0.3,0.2-0.5,0.2c-0.4,0-0.8-0.3-0.8-0.8C18.4,51.2,18.5,51,18.6,50.8z",prevIcon:"path://M43,52.8L20.4,30.3c-0.2-0.2-0.3-0.4-0.3-0.7c0-0.3,0.1-0.5,0.3-0.7L42.9,6.4c0.1-0.1,0.2-0.3,0.2-0.5 c0-0.4-0.3-0.8-0.8-0.8c-0.2,0-0.5,0.1-0.6,0.3L18.3,28.8l0,0c-0.2,0.2-0.3,0.4-0.3,0.7c0,0.3,0.1,0.5,0.3,0.7l0.1,0.1L41.9,54 c0.1,0.1,0.3,0.2,0.5,0.2c0.4,0,0.8-0.3,0.8-0.8C43.2,53.2,43.1,53,43,52.8z",normal:{color:"#304654",borderColor:"#304654",borderWidth:1},emphasis:{color:"#c23531",borderColor:"#c23531",borderWidth:2}},data:[]}});a.mixin(i,o.dataFormatMixin);var l=i;e.exports=l},function(e,t,r){"use strict";function a(e,t){return c.getLayoutRect(e.getBoxLayoutParams(),{width:t.getWidth(),height:t.getHeight()},e.get("padding"))}function n(e,t,r,a){return h.makePath(e.get(t).replace(/^path:\/\//,""),l.clone(a||{}),new s(r[0],r[1],r[2],r[3]),"center")}function o(e,t,r,a,n,o){var i=t.get("color");if(n)n.setColor(i),r.add(n),o&&o.onUpdate(n);else{var s=e.get("symbol");n=f(s,-1,-1,2,2,i),n.setStyle("strokeNoScale",!0),r.add(n),o&&o.onCreate(n)}var u=t.getItemStyle(["color","symbol","symbolSize"]);n.setStyle(u),a=l.merge({rectHover:!0,z2:100},a,!0);var h=e.get("symbolSize");h=h instanceof Array?h.slice():[+h,+h],h[0]/=2,h[1]/=2,a.scale=h;var c=e.get("symbolOffset");if(c){var d=a.position=a.position||[0,0];d[0]+=y.parsePercent(c[0],h[0]),d[1]+=y.parsePercent(c[1],h[1])}var m=e.get("symbolRotate");return a.rotation=(m||0)*Math.PI/180||0,n.attr(a),n.updateTransform(),n}function i(e,t,r,a,n){if(!e.dragging){var o=a.getModel("checkpointStyle"),i=r.dataToCoord(a.getData().get(["value"],t));n||!o.get("animation",!0)?e.attr({position:[i,0]}):(e.stopAnimation(!0),e.animateTo({position:[i,0]},o.get("animationDuration",!0),o.get("animationEasing",!0)))}}var l=r(0),s=r(19),u=r(40),h=r(3),c=r(11),d=r(899),m=r(897),p=r(38),f=p.createSymbol,v=r(37),y=r(4),g=r(14),_=g.encodeHTML,T=l.bind,x=l.each,w=Math.PI,N=d.extend({type:"timeline.slider",init:function(e,t){this.api=t,this._axis,this._viewRect,this._timer,this._currentPointer,this._mainGroup,this._labelGroup},render:function(e,t,r,a){if(this.model=e,this.api=r,this.ecModel=t,this.group.removeAll(),e.get("show",!0)){var n=this._layout(e,r),o=this._createGroup("mainGroup"),i=this._createGroup("labelGroup"),l=this._axis=this._createAxis(n,e);e.formatTooltip=function(e){return _(l.scale.getLabel(e))},x(["AxisLine","AxisTick","Control","CurrentPointer"],function(t){this["_render"+t](n,o,l,e)},this),this._renderAxisLabel(n,i,l,e),this._position(n,e)}this._doPlayStop()},remove:function(){this._clearTimer(),this.group.removeAll()},dispose:function(){this._clearTimer()},_layout:function(e,t){var r=e.get("label.normal.position"),n=e.get("orient"),o=a(e,t);null==r||"auto"===r?r="horizontal"===n?o.y+o.height/2<t.getHeight()/2?"-":"+":o.x+o.width/2<t.getWidth()/2?"+":"-":isNaN(r)&&(r={horizontal:{top:"-",bottom:"+"},vertical:{left:"-",right:"+"}}[n][r]);var i={horizontal:"center",vertical:r>=0||"+"===r?"left":"right"},l={horizontal:r>=0||"+"===r?"top":"bottom",vertical:"middle"},s={horizontal:0,vertical:w/2},u="vertical"===n?o.height:o.width,h=e.getModel("controlStyle"),c=h.get("show"),d=c?h.get("itemSize"):0,m=c?h.get("itemGap"):0,p=d+m,f=e.get("label.normal.rotate")||0;f=f*w/180;var v,y,g,_,T=h.get("position",!0),c=h.get("show",!0),x=c&&h.get("showPlayBtn",!0),N=c&&h.get("showPrevBtn",!0),b=c&&h.get("showNextBtn",!0),L=0,S=u;return"left"===T||"bottom"===T?(x&&(v=[0,0],L+=p),N&&(y=[L,0],L+=p),b&&(g=[S-d,0],S-=p)):(x&&(v=[S-d,0],S-=p),N&&(y=[0,0],L+=p),b&&(g=[S-d,0],S-=p)),_=[L,S],e.get("inverse")&&_.reverse(),{viewRect:o,mainLength:u,orient:n,rotation:s[n],labelRotation:f,labelPosOpt:r,labelAlign:e.get("label.normal.align")||i[n],labelBaseline:e.get("label.normal.verticalAlign")||e.get("label.normal.baseline")||l[n],playPosition:v,prevBtnPosition:y,nextBtnPosition:g,axisExtent:_,controlSize:d,controlGap:m}},_position:function(e,t){function r(e){var t=e.position;e.origin=[d[0][0]-t[0],d[1][0]-t[1]]}function a(e){return[[e.x,e.x+e.width],[e.y,e.y+e.height]]}function n(e,t,r,a,n){e[a]+=r[a][n]-t[a][n]}var o=this._mainGroup,i=this._labelGroup,l=e.viewRect;if("vertical"===e.orient){var s=u.create(),h=l.x,c=l.y+l.height;u.translate(s,s,[-h,-c]),u.rotate(s,s,-w/2),u.translate(s,s,[h,c]),l=l.clone(),l.applyTransform(s)}var d=a(l),m=a(o.getBoundingRect()),p=a(i.getBoundingRect()),f=o.position,v=i.position;v[0]=f[0]=d[0][0];var y=e.labelPosOpt;if(isNaN(y)){var g="+"===y?0:1;n(f,m,d,1,g),n(v,p,d,1,1-g)}else{var g=y>=0?0:1;n(f,m,d,1,g),v[1]=f[1]+y}o.attr("position",f),i.attr("position",v),o.rotation=i.rotation=e.rotation,r(o),r(i)},_createAxis:function(e,t){var r=t.getData(),a=t.get("axisType"),n=v.createScaleByModel(t,a),o=r.getDataExtent("value");n.setExtent(o[0],o[1]),this._customizeScale(n,r),n.niceTicks();var i=new m("value",n,e.axisExtent,a);return i.model=t,i},_customizeScale:function(e,t){e.getTicks=function(){return t.mapArray(["value"],function(e){return e})},e.getTicksLabels=function(){return l.map(this.getTicks(),e.getLabel,e)}},_createGroup:function(e){var t=this["_"+e]=new h.Group;return this.group.add(t),t},_renderAxisLine:function(e,t,r,a){var n=r.getExtent();a.get("lineStyle.show")&&t.add(new h.Line({shape:{x1:n[0],y1:0,x2:n[1],y2:0},style:l.extend({lineCap:"round"},a.getModel("lineStyle").getLineStyle()),silent:!0,z2:1}))},_renderAxisTick:function(e,t,r,a){var n=a.getData(),i=r.scale.getTicks();x(i,function(e,i){var l=r.dataToCoord(e),s=n.getItemModel(i),u=s.getModel("itemStyle.normal"),c=s.getModel("itemStyle.emphasis"),d={position:[l,0],onclick:T(this._changeTimeline,this,i)},m=o(s,u,t,d);h.setHoverStyle(m,c.getItemStyle()),s.get("tooltip")?(m.dataIndex=i,m.dataModel=a):m.dataIndex=m.dataModel=null},this)},_renderAxisLabel:function(e,t,r,a){var n=a.getModel("label.normal");if(n.get("show")){var o=a.getData(),i=r.scale.getTicks(),l=v.getFormattedLabels(r,n.get("formatter")),s=r.getLabelInterval();x(i,function(a,n){if(!r.isLabelIgnored(n,s)){var i=o.getItemModel(n),u=i.getModel("label.normal"),c=i.getModel("label.emphasis"),d=r.dataToCoord(a),m=new h.Text({position:[d,0],rotation:e.labelRotation-e.rotation,onclick:T(this._changeTimeline,this,n),silent:!1});h.setTextStyle(m.style,u,{text:l[n],textAlign:e.labelAlign,textVerticalAlign:e.labelBaseline}),t.add(m),h.setHoverStyle(m,h.setTextStyle({},c))}},this)}},_renderControl:function(e,t,r,a){function o(e,r,o,d){if(e){var m={position:e,origin:[i/2,0],rotation:d?-l:0,rectHover:!0,style:s,onclick:o},p=n(a,r,c,m);t.add(p),h.setHoverStyle(p,u)}}var i=e.controlSize,l=e.rotation,s=a.getModel("controlStyle.normal").getItemStyle(),u=a.getModel("controlStyle.emphasis").getItemStyle(),c=[0,-i/2,i,i],d=a.getPlayState(),m=a.get("inverse",!0);o(e.nextBtnPosition,"controlStyle.nextIcon",T(this._changeTimeline,this,m?"-":"+")),o(e.prevBtnPosition,"controlStyle.prevIcon",T(this._changeTimeline,this,m?"+":"-")),o(e.playPosition,"controlStyle."+(d?"stopIcon":"playIcon"),T(this._handlePlayClick,this,!d),!0)},_renderCurrentPointer:function(e,t,r,a){var n=a.getData(),l=a.getCurrentIndex(),s=n.getItemModel(l).getModel("checkpointStyle"),u=this,h={onCreate:function(e){e.draggable=!0,e.drift=T(u._handlePointerDrag,u),e.ondragend=T(u._handlePointerDragend,u),i(e,l,r,a,!0)},onUpdate:function(e){i(e,l,r,a)}};this._currentPointer=o(s,s,this._mainGroup,{},this._currentPointer,h)},_handlePlayClick:function(e){this._clearTimer(),this.api.dispatchAction({type:"timelinePlayChange",playState:e,from:this.uid})},_handlePointerDrag:function(e,t,r){this._clearTimer(),this._pointerChangeTimeline([r.offsetX,r.offsetY])},_handlePointerDragend:function(e){this._pointerChangeTimeline([e.offsetX,e.offsetY],!0)},_pointerChangeTimeline:function(e,t){var r=this._toAxisCoord(e)[0],a=this._axis,n=y.asc(a.getExtent().slice());r>n[1]&&(r=n[1]),r<n[0]&&(r=n[0]),this._currentPointer.position[0]=r,this._currentPointer.dirty();var o=this._findNearestTick(r),i=this.model;(t||o!==i.getCurrentIndex()&&i.get("realtime"))&&this._changeTimeline(o)},_doPlayStop:function(){function e(){var e=this.model;this._changeTimeline(e.getCurrentIndex()+(e.get("rewind",!0)?-1:1))}this._clearTimer(),this.model.getPlayState()&&(this._timer=setTimeout(T(e,this),this.model.get("playInterval")))},_toAxisCoord:function(e){var t=this._mainGroup.getLocalTransform();return h.applyTransform(e,t,!0)},_findNearestTick:function(e){var t,r=this.model.getData(),a=1/0,n=this._axis;return r.each(["value"],function(r,o){var i=n.dataToCoord(r),l=Math.abs(i-e);l<a&&(a=l,t=o)}),t},_clearTimer:function(){this._timer&&(clearTimeout(this._timer),this._timer=null)},_changeTimeline:function(e){var t=this.model.getCurrentIndex();"+"===e?e=t+1:"-"===e&&(e=t-1),this.api.dispatchAction({type:"timelineChange",currentIndex:e,from:this.uid})}});e.exports=N},function(e,t,r){"use strict";var a=r(0),n=r(71),o=r(37),i=function(e,t,r,a){n.call(this,e,t,r),this.type=a||"value",this._autoLabelInterval,this.model=null};i.prototype={constructor:i,getLabelInterval:function(){var e=this.model,t=e.getModel("label.normal"),r=t.get("interval");if(null!=r&&"auto"!=r)return r;var r=this._autoLabelInterval;return r||(r=this._autoLabelInterval=o.getAxisLabelInterval(a.map(this.scale.getTicks(),this.dataToCoord,this),o.getFormattedLabels(this,t.get("formatter")),t.getFont(),"horizontal"===e.get("orient")?0:90,t.get("rotate"))),r},isLabelIgnored:function(e){if("category"===this.type){var t=this.getLabelInterval();return"function"==typeof t&&!t(e,this.scale.getLabel(e))||e%(t+1)}}},a.inherits(i,n);var l=i;e.exports=l},function(e,t,r){"use strict";var a=r(0),n=r(24),o=r(23),i=r(10),l=n.extend({type:"timeline",layoutMode:"box",defaultOption:{zlevel:0,z:4,show:!0,axisType:"time",realtime:!0,left:"20%",top:null,right:"20%",bottom:0,width:null,height:40,padding:5,controlPosition:"left",autoPlay:!1,rewind:!1,loop:!0,playInterval:2e3,currentIndex:0,itemStyle:{normal:{},emphasis:{}},label:{normal:{color:"#000"},emphasis:{}},data:[]},init:function(e,t,r){this._data,this._names,this.mergeDefaultAndTheme(e,r),this._initData()},mergeOption:function(e){l.superApply(this,"mergeOption",arguments),this._initData()},setCurrentIndex:function(e){null==e&&(e=this.option.currentIndex);var t=this._data.count();this.option.loop?e=(e%t+t)%t:(e>=t&&(e=t-1),e<0&&(e=0)),this.option.currentIndex=e},getCurrentIndex:function(){return this.option.currentIndex},isIndexMax:function(){return this.getCurrentIndex()>=this._data.count()-1},setPlayState:function(e){this.option.autoPlay=!!e},getPlayState:function(){return!!this.option.autoPlay},_initData:function(){var e=this.option,t=e.data||[],r=e.axisType,n=this._names=[];if("category"===r){var l=[];a.each(t,function(e,t){var r,o=i.getDataItemValue(e);a.isObject(e)?(r=a.clone(e),r.value=t):r=t,l.push(r),a.isString(o)||null!=o&&!isNaN(o)||(o=""),n.push(o+"")}),t=l}var s={category:"ordinal",time:"time"}[r]||"number";(this._data=new o([{name:"value",type:s}],this)).initData(t,n)},getData:function(){return this._data},getCategories:function(){if("category"===this.get("axisType"))return this._names.slice()}}),s=l;e.exports=s},function(e,t,r){"use strict";var a=r(252),n=a.extend({type:"timeline"});e.exports=n},function(e,t,r){"use strict";function a(e){var t=e&&e.timeline;l.isArray(t)||(t=t?[t]:[]),l.each(t,function(e){e&&n(e)})}function n(e){var t=e.type,r={number:"value",time:"time"};if(r[t]&&(e.axisType=r[t],delete e.type),o(e),i(e,"controlPosition")){var a=e.controlStyle||(e.controlStyle={});i(a,"position")||(a.position=e.controlPosition),"none"!==a.position||i(a,"show")||(a.show=!1,delete a.position),delete e.controlPosition}l.each(e.data||[],function(e){l.isObject(e)&&!l.isArray(e)&&(!i(e,"value")&&i(e,"name")&&(e.value=e.name),o(e))})}function o(e){var t=e.itemStyle||(e.itemStyle={}),r=t.emphasis||(t.emphasis={}),a=e.label||e.label||{},n=a.normal||(a.normal={}),o={normal:1,emphasis:1};l.each(a,function(e,t){o[t]||i(n,t)||(n[t]=e)}),r.label&&!i(a,"emphasis")&&(a.emphasis=r.label,delete r.label)}function i(e,t){return e.hasOwnProperty(t)}var l=r(0);e.exports=a},function(e,t,r){"use strict";var a=r(2),n=r(0);a.registerAction({type:"timelineChange",event:"timelineChanged",update:"prepareAndUpdate"},function(e,t){var r=t.getComponent("timeline");return r&&null!=e.currentIndex&&(r.setCurrentIndex(e.currentIndex),!r.get("loop",!0)&&r.isIndexMax()&&r.setPlayState(!1)),t.resetOption("timeline"),n.defaults({currentIndex:r.option.currentIndex},e)}),a.registerAction({type:"timelinePlayChange",event:"timelinePlayChanged",update:"update"},function(e,t){var r=t.getComponent("timeline");r&&null!=e.playState&&r.setPlayState(e.playState)})},function(e,t,r){"use strict";r(24).registerSubTypeDefaulter("timeline",function(){return"slider"})},function(e,t,r){"use strict";var a=r(2),n=r(3),o=r(11),i=o.getLayoutRect;a.extendComponentModel({type:"title",layoutMode:{type:"box",ignoreSize:!0},defaultOption:{zlevel:0,z:6,show:!0,text:"",target:"blank",subtext:"",subtarget:"blank",left:0,top:0,backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,textStyle:{fontSize:18,fontWeight:"bolder",color:"#333"},subtextStyle:{color:"#aaa"}}}),a.extendComponentView({type:"title",render:function(e,t,r){if(this.group.removeAll(),e.get("show")){var a=this.group,o=e.getModel("textStyle"),l=e.getModel("subtextStyle"),s=e.get("textAlign"),u=e.get("textBaseline"),h=new n.Text({style:n.setTextStyle({},o,{text:e.get("text"),textFill:o.getTextColor()},{disableBox:!0}),z2:10}),c=h.getBoundingRect(),d=e.get("subtext"),m=new n.Text({style:n.setTextStyle({},l,{text:d,textFill:l.getTextColor(),y:c.height+e.get("itemGap"),textVerticalAlign:"top"},{disableBox:!0}),z2:10}),p=e.get("link"),f=e.get("sublink");h.silent=!p,m.silent=!f,p&&h.on("click",function(){window.open(p,"_"+e.get("target"))}),f&&m.on("click",function(){window.open(f,"_"+e.get("subtarget"))}),a.add(h),d&&a.add(m);var v=a.getBoundingRect(),y=e.getBoxLayoutParams();y.width=v.width,y.height=v.height;var g=i(y,{width:r.getWidth(),height:r.getHeight()},e.get("padding"));s||(s=e.get("left")||e.get("right"),"middle"===s&&(s="center"),"right"===s?g.x+=g.width:"center"===s&&(g.x+=g.width/2)),u||(u=e.get("top")||e.get("bottom"),"center"===u&&(u="middle"),"bottom"===u?g.y+=g.height:"middle"===u&&(g.y+=g.height/2),u=u||"top"),a.attr("position",[g.x,g.y]);var _={textAlign:s,textVerticalAlign:u};h.setStyle(_),m.setStyle(_),v=a.getBoundingRect();var T=g.margin,x=e.getItemStyle(["color","opacity"]);x.fill=e.get("backgroundColor");var w=new n.Rect({shape:{x:v.x-T[3],y:v.y-T[0],width:v.width+T[1]+T[3],height:v.height+T[0]+T[2],r:e.get("borderRadius")},style:x,silent:!0});n.subPixelOptimizeRect(w),a.add(w)}}})},function(e,t,r){"use strict";r(905),r(906),r(912),r(910),r(908),r(909),r(911)},function(e,t,r){"use strict";var a=r(2),n=r(0),o=r(70),i=a.extendComponentModel({type:"toolbox",layoutMode:{type:"box",ignoreSize:!0},mergeDefaultAndTheme:function(e){i.superApply(this,"mergeDefaultAndTheme",arguments),n.each(this.option.feature,function(e,t){var r=o.get(t);r&&n.merge(e,r.defaultOption)})},defaultOption:{show:!0,z:6,zlevel:0,orient:"horizontal",left:"right",top:"top",backgroundColor:"transparent",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemSize:15,itemGap:8,showTitle:!0,iconStyle:{normal:{borderColor:"#666",color:"none"},emphasis:{borderColor:"#3E98C5"}}}}),l=i;e.exports=l},function(e,t,r){"use strict";function a(e){return 0===e.indexOf("my")}var n=r(2),o=r(0),i=r(54),l=r(70),s=r(3),u=r(20),h=r(112),c=r(354),d=n.extendComponentView({type:"toolbox",render:function(e,t,r,n){function d(o,i){var s,h=g[o],c=g[i],d=v[h],p=new u(d,e,e.ecModel);if(h&&!c){if(a(h))s={model:p,onclick:p.option.onclick,featureName:h};else{var f=l.get(h);if(!f)return;s=new f(p,t,r)}y[h]=s}else{if(!(s=y[c]))return;s.model=p,s.ecModel=t,s.api=r}return!h&&c?void(s.dispose&&s.dispose(t,r)):!p.get("show")||s.unusable?void(s.remove&&s.remove(t,r)):(m(p,s,h),p.setIconStatus=function(e,t){var r=this.option,a=this.iconPaths;r.iconStatus=r.iconStatus||{},r.iconStatus[e]=t,a[e]&&a[e].trigger(t)},void(s.render&&s.render(p,t,r,n)))}function m(a,n,i){var l=a.getModel("iconStyle"),u=n.getIcons?n.getIcons():a.get("icon"),h=a.get("title")||{};if("string"==typeof u){var c=u,d=h;u={},h={},u[i]=c,h[i]=d}var m=a.iconPaths={};o.each(u,function(i,u){var c=s.createIcon(i,{},{x:-f/2,y:-f/2,width:f,height:f});c.setStyle(l.getModel("normal").getItemStyle()),c.hoverStyle=l.getModel("emphasis").getItemStyle(),s.setHoverStyle(c),e.get("showTitle")&&(c.__title=h[u],c.on("mouseover",function(){var e=l.getModel("emphasis").getItemStyle();c.setStyle({text:h[u],textPosition:e.textPosition||"bottom",textFill:e.fill||e.stroke||"#000",textAlign:e.textAlign||"center"})}).on("mouseout",function(){c.setStyle({textFill:null})})),c.trigger(a.get("iconStatus."+u)||"normal"),p.add(c),c.on("click",o.bind(n.onclick,n,t,r,u)),m[u]=c})}var p=this.group;if(p.removeAll(),e.get("show")){var f=+e.get("itemSize"),v=e.get("feature")||{},y=this._features||(this._features={}),g=[];o.each(v,function(e,t){g.push(t)}),new h(this._featureNames||[],g).add(d).update(d).remove(o.curry(d,null)).execute(),this._featureNames=g,c.layout(p,e,r),p.add(c.makeBackground(p.getBoundingRect(),e)),p.eachChild(function(e){var t=e.__title,a=e.hoverStyle;if(a&&t){var n=i.getBoundingRect(t,i.makeFont(a)),o=e.position[0]+p.position[0],l=e.position[1]+p.position[1]+f,s=!1;l+n.height>r.getHeight()&&(a.textPosition="top",s=!0);var u=s?-5-n.height:f+8;o+n.width/2>r.getWidth()?(a.textPosition=["100%",u],a.textAlign="right"):o-n.width/2<0&&(a.textPosition=[0,u],a.textAlign="left")}})}},updateView:function(e,t,r,a){o.each(this._features,function(e){e.updateView&&e.updateView(e.model,t,r,a)})},updateLayout:function(e,t,r,a){o.each(this._features,function(e){e.updateLayout&&e.updateLayout(e.model,t,r,a)})},remove:function(e,t){o.each(this._features,function(r){r.remove&&r.remove(e,t)}),this.group.removeAll()},dispose:function(e,t){o.each(this._features,function(r){r.dispose&&r.dispose(e,t)})}});e.exports=d},function(e,t,r){"use strict";function a(e,t,r){this.model=e,this.ecModel=t,this.api=r,this._brushType,this._brushMode}var n=r(0),o=r(70),i=r(113),l=i.toolbox.brush;a.defaultOption={show:!0,type:["rect","polygon","lineX","lineY","keep","clear"],icon:{rect:"M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13",polygon:"M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2",lineX:"M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4",lineY:"M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4",keep:"M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z",clear:"M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2"},title:n.clone(l.title)};var s=a.prototype;s.render=s.updateView=s.updateLayout=function(e,t,r){var a,o,i;t.eachComponent({mainType:"brush"},function(e){a=e.brushType,o=e.brushOption.brushMode||"single",i|=e.areas.length}),this._brushType=a,this._brushMode=o,n.each(e.get("type",!0),function(t){e.setIconStatus(t,("keep"===t?"multiple"===o:"clear"===t?i:t===a)?"emphasis":"normal")})},s.getIcons=function(){var e=this.model,t=e.get("icon",!0),r={};return n.each(e.get("type",!0),function(e){t[e]&&(r[e]=t[e])}),r},s.onclick=function(e,t,r){var a=this._brushType,n=this._brushMode;"clear"===r?(t.dispatchAction({type:"axisAreaSelect",intervals:[]}),t.dispatchAction({type:"brush",command:"clear",areas:[]})):t.dispatchAction({type:"takeGlobalCursor",key:"brush",brushOption:{brushType:"keep"===r?a:a!==r&&r,brushMode:"keep"===r?"multiple"===n?"single":"multiple":n}})},o.register("brush",a);var u=a;e.exports=u},function(e,t,r){"use strict";function a(e){var t={},r=[],a=[];return e.eachRawSeries(function(e){var n=e.coordinateSystem;if(!n||"cartesian2d"!==n.type&&"polar"!==n.type)r.push(e);else{var o=n.getBaseAxis();if("category"===o.type){var i=o.dim+"_"+o.index;t[i]||(t[i]={categoryAxis:o,valueAxis:n.getOtherAxis(o),series:[]},a.push({axisDim:o.dim,axisIndex:o.index})),t[i].series.push(e)}else r.push(e)}}),{seriesGroupByCategoryAxis:t,other:r,meta:a}}function n(e){var t=[];return f.each(e,function(e,r){var a=e.categoryAxis,n=e.valueAxis,o=n.dim,i=[" "].concat(f.map(e.series,function(e){return e.name})),l=[a.model.getCategories()];f.each(e.series,function(e){l.push(e.getRawData().mapArray(o,function(e){return e}))});for(var s=[i.join(x)],u=0;u<l[0].length;u++){for(var h=[],c=0;c<l.length;c++)h.push(l[c][u]);s.push(h.join(x))}t.push(s.join("\n"))}),t.join("\n\n"+T+"\n\n")}function o(e){return f.map(e,function(e){var t=e.getRawData(),r=[e.name],a=[];return t.each(t.dimensions,function(){for(var e=arguments.length,n=arguments[e-1],o=t.getName(n),i=0;i<e-1;i++)a[i]=arguments[i];r.push((o?o+x:"")+a.join(x))}),r.join("\n")}).join("\n\n"+T+"\n\n")}function i(e){var t=a(e);return{value:f.filter([n(t.seriesGroupByCategoryAxis),o(t.other)],function(e){return e.replace(/[\n\t\s]/g,"")}).join("\n\n"+T+"\n\n"),meta:t.meta}}function l(e){return e.replace(/^\s\s*/,"").replace(/\s\s*$/,"")}function s(e){if(e.slice(0,e.indexOf("\n")).indexOf(x)>=0)return!0}function u(e){for(var t=e.split(/\n+/g),r=l(t.shift()).split(w),a=[],n=f.map(r,function(e){return{name:e,data:[]}}),o=0;o<t.length;o++){var i=l(t[o]).split(w);a.push(i.shift());for(var s=0;s<i.length;s++)n[s]&&(n[s].data[o]=i[s])}return{series:n,categories:a}}function h(e){for(var t=e.split(/\n+/g),r=l(t.shift()),a=[],n=0;n<t.length;n++){var o,i=l(t[n]).split(w),s="",u=!1;isNaN(i[0])?(u=!0,s=i[0],i=i.slice(1),a[n]={name:s,value:[]},o=a[n].value):o=a[n]=[];for(var h=0;h<i.length;h++)o.push(+i[h]);1===o.length&&(u?a[n].value=o[0]:a[n]=o[0])}return{name:r,data:a}}function c(e,t){var r=e.split(new RegExp("\n*"+T+"\n*","g")),a={series:[]};return f.each(r,function(e,r){if(s(e)){var n=u(e),o=t[r],i=o.axisDim+"Axis";o&&(a[i]=a[i]||[],a[i][o.axisIndex]={data:n.categories},a.series=a.series.concat(n.series))}else{var n=h(e);a.series.push(n)}}),a}function d(e){this._dom=null,this.model=e}function m(e,t){return f.map(e,function(e,r){var a=t&&t[r];return f.isObject(a)&&!f.isArray(a)?(f.isObject(e)&&!f.isArray(e)&&(e=e.value),f.defaults({value:e},a)):e})}var p=r(2),f=r(0),v=r(62),y=r(113),g=r(70),_=y.toolbox.dataView,T=new Array(60).join("-"),x="\t",w=new RegExp("["+x+"]+","g");d.defaultOption={show:!0,readOnly:!1,optionToContent:null,contentToOption:null,icon:"M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28",title:f.clone(_.title),lang:f.clone(_.lang),backgroundColor:"#fff",textColor:"#000",textareaColor:"#fff",textareaBorderColor:"#333",buttonColor:"#c23531",buttonTextColor:"#fff"},d.prototype.onclick=function(e,t){function r(){a.removeChild(o),b._dom=null}var a=t.getDom(),n=this.model;this._dom&&a.removeChild(this._dom);var o=document.createElement("div");o.style.cssText="position:absolute;left:5px;top:5px;bottom:5px;right:5px;",o.style.backgroundColor=n.get("backgroundColor")||"#fff";var l=document.createElement("h4"),s=n.get("lang")||[];l.innerHTML=s[0]||n.get("title"),l.style.cssText="margin: 10px 20px;",l.style.color=n.get("textColor");var u=document.createElement("div"),h=document.createElement("textarea");u.style.cssText="display:block;width:100%;overflow:auto;";var d=n.get("optionToContent"),m=n.get("contentToOption"),p=i(e);if("function"==typeof d){var y=d(t.getOption());"string"==typeof y?u.innerHTML=y:f.isDom(y)&&u.appendChild(y)}else u.appendChild(h),h.readOnly=n.get("readOnly"),h.style.cssText="width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;",h.style.color=n.get("textColor"),h.style.borderColor=n.get("textareaBorderColor"),h.style.backgroundColor=n.get("textareaColor"),h.value=p.value;var g=p.meta,_=document.createElement("div");_.style.cssText="position:absolute;bottom:0;left:0;right:0;";var T="float:right;margin-right:20px;border:none;cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px",w=document.createElement("div"),N=document.createElement("div");T+=";background-color:"+n.get("buttonColor"),T+=";color:"+n.get("buttonTextColor");var b=this;v.addEventListener(w,"click",r),v.addEventListener(N,"click",function(){var e;try{e="function"==typeof m?m(u,t.getOption()):c(h.value,g)}catch(e){throw r(),new Error("Data view format error "+e)}e&&t.dispatchAction({type:"changeDataView",newOption:e}),r()}),w.innerHTML=s[1],N.innerHTML=s[2],N.style.cssText=T,w.style.cssText=T,!n.get("readOnly")&&_.appendChild(N),_.appendChild(w),v.addEventListener(h,"keydown",function(e){if(9===(e.keyCode||e.which)){var t=this.value,r=this.selectionStart,a=this.selectionEnd;this.value=t.substring(0,r)+x+t.substring(a),this.selectionStart=this.selectionEnd=r+1,v.stop(e)}}),o.appendChild(l),o.appendChild(u),o.appendChild(_),u.style.height=a.clientHeight-80+"px",a.appendChild(o),this._dom=o},d.prototype.remove=function(e,t){this._dom&&t.getDom().removeChild(this._dom)},d.prototype.dispose=function(e,t){this.remove(e,t)},g.register("dataView",d),p.registerAction({type:"changeDataView",event:"dataViewChanged",update:"prepareAndUpdate"},function(e,t){var r=[];f.each(e.newOption.series,function(e){var a=t.getSeriesByName(e.name)[0];if(a){var n=a.get("data");r.push({name:e.name,data:m(e.data,n)})}else r.push(f.extend({type:"scatter"},e))}),t.mergeOption(f.defaults({series:r},e.newOption))});var N=d;e.exports=N},function(e,t,r){"use strict";function a(e,t,r){(this._brushController=new u(r.getZr())).on("brush",s.bind(this._onBrush,this)).mount(),this._isZoomActive}function n(e){var t={};return s.each(["xAxisIndex","yAxisIndex"],function(r){t[r]=e[r],null==t[r]&&(t[r]="all"),(!1===t[r]||"none"===t[r])&&(t[r]=[])}),t}function o(e,t){e.setIconStatus("back",c.count(t)>1?"emphasis":"normal")}function i(e,t,r,a,o){var i=r._isZoomActive;a&&"takeGlobalCursor"===a.type&&(i="dataZoomSelect"===a.key&&a.dataZoomSelectActive),r._isZoomActive=i,e.setIconStatus("zoom",i?"emphasis":"normal");var l=new h(n(e.option),t,{include:["grid"]});r._brushController.setPanels(l.makePanelOpts(o,function(e){return e.xAxisDeclared&&!e.yAxisDeclared?"lineX":!e.xAxisDeclared&&e.yAxisDeclared?"lineY":"rect"})).enableBrush(!!i&&{brushType:"auto",brushStyle:{lineWidth:0,fill:"rgba(0,0,0,0.2)"}})}var l=r(2),s=r(0),u=r(241),h=r(350),c=r(348),d=r(134),m=r(113),p=r(70);r(868);var f=m.toolbox.dataZoom,v=s.each,y="\0_ec_\0toolbox-dataZoom_";a.defaultOption={show:!0,icon:{zoom:"M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1",back:"M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26"},title:s.clone(f.title)};var g=a.prototype;g.render=function(e,t,r,a){this.model=e,this.ecModel=t,this.api=r,i(e,t,this,a,r),o(e,t)},g.onclick=function(e,t,r){_[r].call(this)},g.remove=function(e,t){this._brushController.unmount()},g.dispose=function(e,t){this._brushController.dispose()};var _={zoom:function(){var e=!this._isZoomActive;this.api.dispatchAction({type:"takeGlobalCursor",key:"dataZoomSelect",dataZoomSelectActive:e})},back:function(){this._dispatchZoomAction(c.pop(this.ecModel))}};g._onBrush=function(e,t){function r(e,t,r){var n=t.getAxis(e),l=n.model,s=a(e,l,i),u=s.findRepresentativeAxisProxy(l).getMinMaxSpan();null==u.minValueSpan&&null==u.maxValueSpan||(r=d(0,r.slice(),n.scale.getExtent(),0,u.minValueSpan,u.maxValueSpan)),s&&(o[s.id]={dataZoomId:s.id,startValue:r[0],endValue:r[1]})}function a(e,t,r){var a;return r.eachComponent({mainType:"dataZoom",subType:"select"},function(r){r.getAxisModel(e,t.componentIndex)&&(a=r)}),a}if(t.isEnd&&e.length){var o={},i=this.ecModel;this._brushController.updateCovers([]),new h(n(this.model.option),i,{include:["grid"]}).matchOutputRanges(e,i,function(e,t,a){if("cartesian2d"===a.type){var n=e.brushType;"rect"===n?(r("x",a,t[0]),r("y",a,t[1])):r({lineX:"x",lineY:"y"}[n],a,t)}}),c.push(i,o),this._dispatchZoomAction(o)}},g._dispatchZoomAction=function(e){var t=[];v(e,function(e,r){t.push(s.clone(e))}),t.length&&this.api.dispatchAction({type:"dataZoom",from:this.uid,batch:t})},p.register("dataZoom",a),l.registerPreprocessor(function(e){function t(e,t){if(t){var n=e+"Index",o=t[n];null==o||"all"==o||s.isArray(o)||(o=!1===o||"none"===o?[]:[o]),r(e,function(t,r){if(null==o||"all"==o||-1!==s.indexOf(o,r)){var i={type:"select",$fromToolbox:!0,id:y+e+r};i[n]=r,a.push(i)}})}}function r(t,r){var a=e[t];s.isArray(a)||(a=a?[a]:[]),v(a,r)}if(e){var a=e.dataZoom||(e.dataZoom=[]);s.isArray(a)||(e.dataZoom=a=[a]);var n=e.toolbox;if(n&&(s.isArray(n)&&(n=n[0]),n&&n.feature)){var o=n.feature.dataZoom;t("xAxis",o),t("yAxis",o)}}});var T=a;e.exports=T},function(e,t,r){"use strict";function a(e){this.model=e}var n=r(2),o=r(0),i=r(113),l=r(70),s=i.toolbox.magicType;a.defaultOption={show:!0,type:[],icon:{line:"M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4",bar:"M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7",stack:"M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z",tiled:"M2.3,2.2h22.8V25H2.3V2.2z M35,2.2h22.8V25H35V2.2zM2.3,35h22.8v22.8H2.3V35z M35,35h22.8v22.8H35V35z"},title:o.clone(s.title),option:{},seriesIndex:{}};var u=a.prototype;u.getIcons=function(){var e=this.model,t=e.get("icon"),r={};return o.each(e.get("type"),function(e){t[e]&&(r[e]=t[e])}),r};var h={line:function(e,t,r,a){if("bar"===e)return o.merge({id:t,type:"line",data:r.get("data"),stack:r.get("stack"),markPoint:r.get("markPoint"),markLine:r.get("markLine")},a.get("option.line")||{},!0)},bar:function(e,t,r,a){if("line"===e)return o.merge({id:t,type:"bar",data:r.get("data"),stack:r.get("stack"),markPoint:r.get("markPoint"),markLine:r.get("markLine")},a.get("option.bar")||{},!0)},stack:function(e,t,r,a){if("line"===e||"bar"===e)return o.merge({id:t,stack:"__ec_magicType_stack__"},a.get("option.stack")||{},!0)},tiled:function(e,t,r,a){if("line"===e||"bar"===e)return o.merge({id:t,stack:""},a.get("option.tiled")||{},!0)}},c=[["line","bar"],["stack","tiled"]];u.onclick=function(e,t,r){var a=this.model,n=a.get("seriesIndex."+r);if(h[r]){var i={series:[]},l=function(t){var n=t.subType,l=t.id,s=h[r](n,l,t,a);s&&(o.defaults(s,t.option),i.series.push(s));var u=t.coordinateSystem;if(u&&"cartesian2d"===u.type&&("line"===r||"bar"===r)){var c=u.getAxesByScale("ordinal")[0];if(c){var d=c.dim,m=d+"Axis",p=e.queryComponents({mainType:m,index:t.get(name+"Index"),id:t.get(name+"Id")})[0],f=p.componentIndex;i[m]=i[m]||[];for(var v=0;v<=f;v++)i[m][f]=i[m][f]||{};i[m][f].boundaryGap="bar"===r}}};o.each(c,function(e){o.indexOf(e,r)>=0&&o.each(e,function(e){a.setIconStatus(e,"normal")})}),a.setIconStatus(r,"emphasis"),e.eachComponent({mainType:"series",query:null==n?null:{seriesIndex:n}},l),t.dispatchAction({type:"changeMagicType",currentType:r,newOption:i})}},n.registerAction({type:"changeMagicType",event:"magicTypeChanged",update:"prepareAndUpdate"},function(e,t){t.mergeOption(e.newOption)}),l.register("magicType",a);var d=a;e.exports=d},function(e,t,r){"use strict";function a(e){this.model=e}var n=r(2),o=r(348),i=r(113),l=r(70),s=i.toolbox.restore;a.defaultOption={show:!0,icon:"M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5",title:s.title},a.prototype.onclick=function(e,t,r){o.clear(e),t.dispatchAction({type:"restore",from:this.uid})},l.register("restore",a),n.registerAction({type:"restore",event:"restore",update:"prepareAndUpdate"},function(e,t){t.resetOption("recreate")});var u=a;e.exports=u},function(e,t,r){"use strict";function a(e){this.model=e}var n=r(25),o=r(113),i=r(70),l=o.toolbox.saveAsImage;a.defaultOption={show:!0,icon:"M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0",title:l.title,type:"png",name:"",excludeComponents:["toolbox"],pixelRatio:1,lang:l.lang.slice()},a.prototype.unusable=!n.canvasSupported,a.prototype.onclick=function(e,t){var r=this.model,a=r.get("name")||e.get("title.0.text")||"echarts",o=document.createElement("a"),i=r.get("type",!0)||"png";o.download=a+"."+i,o.target="_blank";var l=t.getConnectedDataURL({type:i,backgroundColor:r.get("backgroundColor",!0)||e.get("backgroundColor")||"#fff",excludeComponents:r.get("excludeComponents"),pixelRatio:r.get("pixelRatio")});if(o.href=l,"function"!=typeof MouseEvent||n.browser.ie||n.browser.edge)if(window.navigator.msSaveOrOpenBlob){for(var s=atob(l.split(",")[1]),u=s.length,h=new Uint8Array(u);u--;)h[u]=s.charCodeAt(u);var c=new Blob([h]);window.navigator.msSaveOrOpenBlob(c,a+"."+i)}else{var d=r.get("lang"),m='<body style="margin:0;"><img src="'+l+'" style="max-width:100%;" title="'+(d&&d[0]||"")+'" /></body>',p=window.open();p.document.write(m)}else{var f=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!1});o.dispatchEvent(f)}},i.register("saveAsImage",a);var s=a;e.exports=s},function(e,t,r){"use strict";var a=r(2);r(130),r(915),r(916),a.registerAction({type:"showTip",event:"showTip",update:"tooltip:manuallyShowTip"},function(){}),a.registerAction({type:"hideTip",event:"hideTip",update:"tooltip:manuallyHideTip"},function(){})},function(e,t,r){"use strict";function a(e){var t="left "+e+"s cubic-bezier(0.23, 1, 0.32, 1),top "+e+"s cubic-bezier(0.23, 1, 0.32, 1)";return l.map(p,function(e){return e+"transition:"+t}).join(";")}function n(e){var t=[],r=e.get("fontSize"),a=e.getTextColor();return a&&t.push("color:"+a),t.push("font:"+e.getFont()),r&&t.push("line-height:"+Math.round(3*r/2)+"px"),d(["decoration","align"],function(r){var a=e.get(r);a&&t.push("text-"+r+":"+a)}),t.join(";")}function o(e){var t=[],r=e.get("transitionDuration"),o=e.get("backgroundColor"),i=e.getModel("textStyle"),l=e.get("padding");return r&&t.push(a(r)),o&&(h.canvasSupported?t.push("background-Color:"+o):(t.push("background-Color:#"+s.toHex(o)),t.push("filter:alpha(opacity=70)"))),d(["width","color","radius"],function(r){var a="border-"+r,n=m(a),o=e.get(n);null!=o&&t.push(a+":"+o+("color"===r?"":"px"))}),t.push(n(i)),null!=l&&t.push("padding:"+c.normalizeCssArray(l).join("px ")+"px"),t.join(";")+";"}function i(e,t){var r=document.createElement("div"),a=this._zr=t.getZr();this.el=r,this._x=t.getWidth()/2,this._y=t.getHeight()/2,e.appendChild(r),this._container=e,this._show=!1,this._hideTimeout;var n=this;r.onmouseenter=function(){n._enterable&&(clearTimeout(n._hideTimeout),n._show=!0),n._inContent=!0},r.onmousemove=function(t){if(t=t||window.event,!n._enterable){var r=a.handler;u.normalizeEvent(e,t,!0),r.dispatch("mousemove",t)}},r.onmouseleave=function(){n._enterable&&n._show&&n.hideLater(n._hideDelay),n._inContent=!1}}var l=r(0),s=r(63),u=r(62),h=r(25),c=r(14),d=l.each,m=c.toCamelCase,p=["","-webkit-","-moz-","-o-"];i.prototype={constructor:i,_enterable:!0,update:function(){var e=this._container,t=e.currentStyle||document.defaultView.getComputedStyle(e),r=e.style;"absolute"!==r.position&&"absolute"!==t.position&&(r.position="relative")},show:function(e){clearTimeout(this._hideTimeout);var t=this.el;t.style.cssText="position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;"+o(e)+";left:"+this._x+"px;top:"+this._y+"px;"+(e.get("extraCssText")||""),t.style.display=t.innerHTML?"block":"none",this._show=!0},setContent:function(e){this.el.innerHTML=null==e?"":e},setEnterable:function(e){this._enterable=e},getSize:function(){var e=this.el;return[e.clientWidth,e.clientHeight]},moveTo:function(e,t){var r,a=this._zr;a&&a.painter&&(r=a.painter.getViewportRootOffset())&&(e+=r.offsetLeft,t+=r.offsetTop);var n=this.el.style;n.left=e+"px",n.top=t+"px",this._x=e,this._y=t},hide:function(){this.el.style.display="none",this._show=!1},hideLater:function(e){!this._show||this._inContent&&this._enterable||(e?(this._hideDelay=e,this._show=!1,this._hideTimeout=setTimeout(l.bind(this.hide,this),e)):this.hide())},isShow:function(){return this._show}};var f=i;e.exports=f},function(e,t,r){"use strict";var a=r(2),n=a.extendComponentModel({type:"tooltip",dependencies:["axisPointer"],defaultOption:{zlevel:0,z:8,show:!0,showContent:!0,trigger:"item",triggerOn:"mousemove|click",alwaysShowContent:!1,displayMode:"single",confine:!1,showDelay:0,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:"rgba(50,50,50,0.7)",borderColor:"#333",borderRadius:4,borderWidth:0,padding:5,extraCssText:"",axisPointer:{type:"line",axis:"auto",animation:"auto",animationDurationUpdate:200,animationEasingUpdate:"exponentialOut",crossStyle:{color:"#999",width:1,type:"dashed",textStyle:{}}},textStyle:{color:"#fff",fontSize:14}}});e.exports=n},function(e,t,r){"use strict";function a(e){for(var t=e.pop();e.length;){var r=e.pop();r&&(r instanceof _&&(r=r.get("tooltip",!0)),"string"==typeof r&&(r={formatter:r}),t=new _(r,t,t.ecModel))}return t}function n(e,t){return e.dispatchAction||c.bind(t.dispatchAction,t)}function o(e,t,r,a,n,o,i){var s=l(r),u=s.width,h=s.height;return null!=o&&(e+u+o>a?e-=u+o:e+=o),null!=i&&(t+h+i>n?t-=h+i:t+=i),[e,t]}function i(e,t,r,a,n){var o=l(r),i=o.width,s=o.height;return e=Math.min(e+i,a)-i,t=Math.min(t+s,n)-s,e=Math.max(e,0),t=Math.max(t,0),[e,t]}function l(e){var t=e.clientWidth,r=e.clientHeight;if(document.defaultView&&document.defaultView.getComputedStyle){var a=document.defaultView.getComputedStyle(e);a&&(t+=parseInt(a.paddingLeft,10)+parseInt(a.paddingRight,10)+parseInt(a.borderLeftWidth,10)+parseInt(a.borderRightWidth,10),r+=parseInt(a.paddingTop,10)+parseInt(a.paddingBottom,10)+parseInt(a.borderTopWidth,10)+parseInt(a.borderBottomWidth,10))}return{width:t,height:r}}function s(e,t,r){var a=r[0],n=r[1],o=0,i=0,l=t.width,s=t.height;switch(e){case"inside":o=t.x+l/2-a/2,i=t.y+s/2-n/2;break;case"top":o=t.x+l/2-a/2,i=t.y-n-5;break;case"bottom":o=t.x+l/2-a/2,i=t.y+s+5;break;case"left":o=t.x-a-5,i=t.y+s/2-n/2;break;case"right":o=t.x+l+5,i=t.y+s/2-n/2}return[o,i]}function u(e){return"center"===e||"middle"===e}var h=r(2),c=r(0),d=r(25),m=r(914),p=r(14),f=r(4),v=r(3),y=r(344),g=r(11),_=r(20),T=r(345),x=r(37),w=r(165),N=c.bind,b=c.each,L=f.parsePercent,S=new v.Rect({shape:{x:-1,y:-1,width:2,height:2}}),k=h.extendComponentView({type:"tooltip",init:function(e,t){if(!d.node){var r=new m(t.getDom(),t);this._tooltipContent=r}},render:function(e,t,r){if(!d.node){this.group.removeAll(),this._tooltipModel=e,this._ecModel=t,this._api=r,this._lastDataByCoordSys=null,this._alwaysShowContent=e.get("alwaysShowContent");var a=this._tooltipContent;a.update(),a.setEnterable(e.get("enterable")),this._initGlobalListener(),this._keepShow()}},_initGlobalListener:function(){var e=this._tooltipModel,t=e.get("triggerOn");T.register("itemTooltip",this._api,N(function(e,r,a){"none"!==t&&(t.indexOf(e)>=0?this._tryShow(r,a):"leave"===e&&this._hide(a))},this))},_keepShow:function(){var e=this._tooltipModel,t=this._ecModel,r=this._api;if(null!=this._lastX&&null!=this._lastY&&"none"!==e.get("triggerOn")){var a=this;clearTimeout(this._refreshUpdateTimeout),this._refreshUpdateTimeout=setTimeout(function(){a.manuallyShowTip(e,t,r,{x:a._lastX,y:a._lastY})})}},manuallyShowTip:function(e,t,r,a){if(a.from!==this.uid&&!d.node){var o=n(a,r);this._ticket="";var i=a.dataByCoordSys;if(a.tooltip&&null!=a.x&&null!=a.y){var l=S;l.position=[a.x,a.y],l.update(),l.tooltip=a.tooltip,this._tryShow({offsetX:a.x,offsetY:a.y,target:l},o)}else if(i)this._tryShow({offsetX:a.x,offsetY:a.y,position:a.position,event:{},dataByCoordSys:a.dataByCoordSys,tooltipOption:a.tooltipOption},o);else if(null!=a.seriesIndex){if(this._manuallyAxisShowTip(e,t,r,a))return;var s=y(a,t),u=s.point[0],h=s.point[1];null!=u&&null!=h&&this._tryShow({offsetX:u,offsetY:h,position:a.position,target:s.el,event:{}},o)}else null!=a.x&&null!=a.y&&(r.dispatchAction({type:"updateAxisPointer",x:a.x,y:a.y}),this._tryShow({offsetX:a.x,offsetY:a.y,position:a.position,target:r.getZr().findHover(a.x,a.y).target,event:{}},o))}},manuallyHideTip:function(e,t,r,a){var o=this._tooltipContent;this._alwaysShowContent||o.hideLater(this._tooltipModel.get("hideDelay")),this._lastX=this._lastY=null,a.from!==this.uid&&this._hide(n(a,r))},_manuallyAxisShowTip:function(e,t,r,n){var o=n.seriesIndex,i=n.dataIndex,l=t.getComponent("axisPointer").coordSysAxesInfo;if(null!=o&&null!=i&&null!=l){var s=t.getSeriesByIndex(o);if(s){var u=s.getData(),e=a([u.getItemModel(i),s,(s.coordinateSystem||{}).model,e]);if("axis"===e.get("trigger"))return r.dispatchAction({type:"updateAxisPointer",seriesIndex:o,dataIndex:i,position:n.position}),!0}}},_tryShow:function(e,t){var r=e.target;if(this._tooltipModel){this._lastX=e.offsetX,this._lastY=e.offsetY;var a=e.dataByCoordSys;a&&a.length?this._showAxisTooltip(a,e):r&&null!=r.dataIndex?(this._lastDataByCoordSys=null,this._showSeriesItemTooltip(e,r,t)):r&&r.tooltip?(this._lastDataByCoordSys=null,this._showComponentItemTooltip(e,r,t)):(this._lastDataByCoordSys=null,this._hide(t))}},_showOrMove:function(e,t){var r=e.get("showDelay");t=c.bind(t,this),clearTimeout(this._showTimout),r>0?this._showTimout=setTimeout(t,r):t()},_showAxisTooltip:function(e,t){var r=this._ecModel,n=this._tooltipModel,o=[t.offsetX,t.offsetY],i=[],l=[],s=a([t.tooltipOption,n]);b(e,function(e){b(e.dataByAxis,function(e){var t=r.getComponent(e.axisDim+"Axis",e.axisIndex),a=e.value,n=[];if(t&&null!=a){var o=w.getValueLabel(a,t.axis,r,e.seriesDataIndices,e.valueLabelOpt);c.each(e.seriesDataIndices,function(i){var s=r.getSeriesByIndex(i.seriesIndex),u=i.dataIndexInside,h=s&&s.getDataParams(u);h.axisDim=e.axisDim,h.axisIndex=e.axisIndex,h.axisType=e.axisType,h.axisId=e.axisId,h.axisValue=x.getAxisRawValue(t.axis,a),h.axisValueLabel=o,h&&(l.push(h),n.push(s.formatTooltip(u,!0)))});var s=o;i.push((s?p.encodeHTML(s)+"<br />":"")+n.join("<br />"))}})},this),i.reverse(),i=i.join("<br /><br />");var u=t.position;this._showOrMove(s,function(){this._updateContentNotChangedOnAxis(e)?this._updatePosition(s,u,o[0],o[1],this._tooltipContent,l):this._showTooltipContent(s,i,l,Math.random(),o[0],o[1],u)})},_showSeriesItemTooltip:function(e,t,r){var n=this._ecModel,o=t.seriesIndex,i=n.getSeriesByIndex(o),l=t.dataModel||i,s=t.dataIndex,u=t.dataType,h=l.getData(),c=a([h.getItemModel(s),l,i&&(i.coordinateSystem||{}).model,this._tooltipModel]),d=c.get("trigger");if(null==d||"item"===d){var m=l.getDataParams(s,u),p=l.formatTooltip(s,!1,u),f="item_"+l.name+"_"+s;this._showOrMove(c,function(){this._showTooltipContent(c,p,m,f,e.offsetX,e.offsetY,e.position,e.target)}),r({type:"showTip",dataIndexInside:s,dataIndex:h.getRawIndex(s),seriesIndex:o,from:this.uid})}},_showComponentItemTooltip:function(e,t,r){var a=t.tooltip;if("string"==typeof a){var n=a;a={content:n,formatter:n}}var o=new _(a,this._tooltipModel,this._ecModel),i=o.get("content"),l=Math.random();this._showOrMove(o,function(){this._showTooltipContent(o,i,o.get("formatterParams")||{},l,e.offsetX,e.offsetY,e.position,t)}),r({type:"showTip",from:this.uid})},_showTooltipContent:function(e,t,r,a,n,o,i,l){if(this._ticket="",e.get("showContent")&&e.get("show")){var s=this._tooltipContent,u=e.get("formatter");i=i||e.get("position");var h=t;if(u&&"string"==typeof u)h=p.formatTpl(u,r,!0);else if("function"==typeof u){var c=N(function(t,a){t===this._ticket&&(s.setContent(a),this._updatePosition(e,i,n,o,s,r,l))},this);this._ticket=a,h=u(r,a,c)}s.setContent(h),s.show(e),this._updatePosition(e,i,n,o,s,r,l)}},_updatePosition:function(e,t,r,a,n,l,h){var d=this._api.getWidth(),m=this._api.getHeight();t=t||e.get("position");var p=n.getSize(),f=e.get("align"),v=e.get("verticalAlign"),y=h&&h.getBoundingRect().clone();if(h&&y.applyTransform(h.transform),"function"==typeof t&&(t=t([r,a],l,n.el,y,{viewSize:[d,m],contentSize:p.slice()})),c.isArray(t))r=L(t[0],d),a=L(t[1],m);else if(c.isObject(t)){t.width=p[0],t.height=p[1];var _=g.getLayoutRect(t,{width:d,height:m});r=_.x,a=_.y,f=null,v=null}else if("string"==typeof t&&h){var T=s(t,y,p);r=T[0],a=T[1]}else{var T=o(r,a,n.el,d,m,f?null:20,v?null:20);r=T[0],a=T[1]}if(f&&(r-=u(f)?p[0]/2:"right"===f?p[0]:0),v&&(a-=u(v)?p[1]/2:"bottom"===v?p[1]:0),e.get("confine")){var T=i(r,a,n.el,d,m);r=T[0],a=T[1]}n.moveTo(r,a)},_updateContentNotChangedOnAxis:function(e){var t=this._lastDataByCoordSys,r=!!t&&t.length===e.length;return r&&b(t,function(t,a){var n=t.dataByAxis||{},o=e[a]||{},i=o.dataByAxis||[];(r&=n.length===i.length)&&b(n,function(e,t){var a=i[t]||{},n=e.seriesDataIndices||[],o=a.seriesDataIndices||[];(r&=e.value===a.value&&e.axisType===a.axisType&&e.axisId===a.axisId&&n.length===o.length)&&b(n,function(e,t){var a=o[t];r&=e.seriesIndex===a.seriesIndex&&e.dataIndex===a.dataIndex})})}),this._lastDataByCoordSys=e,!!r},_hide:function(e){this._lastDataByCoordSys=null,e({type:"hideTip",from:this.uid})},dispose:function(e,t){d.node||(this._tooltipContent.hide(),T.unregister("itemTooltip",t))}});e.exports=k},function(e,t,r){"use strict";r(922),r(923)},function(e,t,r){"use strict";function a(e,t,r){if(r[0]===r[1])return r.slice();for(var a=(r[1]-r[0])/200,n=r[0],o=[],i=0;i<=200&&n<r[1];i++)o.push(n),n+=a;return o.push(r[1]),o}var n=r(0),o=r(360),i=r(4),l=[20,140],s=o.extend({type:"visualMap.continuous",defaultOption:{align:"auto",calculable:!1,range:null,realtime:!0,itemHeight:null,itemWidth:null,hoverLink:!0,hoverLinkDataSize:null,hoverLinkOnHandle:null},optionUpdated:function(e,t){s.superApply(this,"optionUpdated",arguments),this.resetExtent(),this.resetVisual(function(e){e.mappingMethod="linear",e.dataExtent=this.getExtent()}),this._resetRange()},resetItemSize:function(){s.superApply(this,"resetItemSize",arguments);var e=this.itemSize;"horizontal"===this._orient&&e.reverse(),(null==e[0]||isNaN(e[0]))&&(e[0]=l[0]),(null==e[1]||isNaN(e[1]))&&(e[1]=l[1])},_resetRange:function(){var e=this.getExtent(),t=this.option.range;!t||t.auto?(e.auto=1,this.option.range=e):n.isArray(t)&&(t[0]>t[1]&&t.reverse(),t[0]=Math.max(t[0],e[0]),t[1]=Math.min(t[1],e[1]))},completeVisualOption:function(){o.prototype.completeVisualOption.apply(this,arguments),n.each(this.stateList,function(e){var t=this.option.controller[e].symbolSize;t&&t[0]!==t[1]&&(t[0]=0)},this)},setSelected:function(e){this.option.range=e.slice(),this._resetRange()},getSelected:function(){var e=this.getExtent(),t=i.asc((this.get("range")||[]).slice());return t[0]>e[1]&&(t[0]=e[1]),t[1]>e[1]&&(t[1]=e[1]),t[0]<e[0]&&(t[0]=e[0]),t[1]<e[0]&&(t[1]=e[0]),t},getValueState:function(e){var t=this.option.range,r=this.getExtent();return(t[0]<=r[0]||t[0]<=e)&&(t[1]>=r[1]||e<=t[1])?"inRange":"outOfRange"},findTargetDataIndices:function(e){var t=[];return this.eachTargetSeries(function(r){var a=[],n=r.getData();n.each(this.getDataDimension(n),function(t,r){e[0]<=t&&t<=e[1]&&a.push(r)},!0,this),t.push({seriesId:r.id,dataIndex:a})},this),t},getVisualMeta:function(e){function t(t,r){o.push({value:t,color:e(t,r)})}for(var r=a(this,"outOfRange",this.getExtent()),n=a(this,"inRange",this.option.range.slice()),o=[],i=0,l=0,s=n.length,u=r.length;l<u&&(!n.length||r[l]<=n[0]);l++)r[l]<n[i]&&t(r[l],"outOfRange");for(var h=1;i<s;i++,h=0)h&&o.length&&t(n[i],"outOfRange"),t(n[i],"inRange");for(var h=1;l<u;l++)(!n.length||n[n.length-1]<r[l])&&(h&&(o.length&&t(o[o.length-1].value,"outOfRange"),h=0),t(r[l],"outOfRange"));var c=o.length;return{stops:o,outerColors:[c?o[0].color:"transparent",c?o[c-1].color:"transparent"]}}}),u=s;e.exports=u},function(e,t,r){"use strict";function a(e,t,r,a){return new m.Polygon({shape:{points:e},draggable:!!r,cursor:t,drift:r,onmousemove:function(e){c.stop(e.event)},ondragend:a})}function n(e,t){return 0===e?[[0,0],[t,0],[t,-t]]:[[0,0],[t,0],[t,t]]}function o(e,t,r,a){return e?[[0,-T(t,x(r,0))],[N,0],[0,T(t,x(a-r,0))]]:[[0,0],[5,-5],[5,5]]}function i(e,t,r){var a=w/2,n=e.get("hoverLinkDataSize");return n&&(a=g(n,t,r,!0)/2),a}function l(e){var t=e.get("hoverLinkOnHandle");return!!(null==t?e.get("realtime"):t)}function s(e){return"vertical"===e?"ns-resize":"ew-resize"}var u=r(0),h=r(444),c=r(62),d=r(361),m=r(3),p=r(4),f=r(134),v=r(362),y=r(10),g=p.linearMap,_=u.each,T=Math.min,x=Math.max,w=12,N=6,b=d.extend({type:"visualMap.continuous",init:function(){b.superApply(this,"init",arguments),this._shapes={},this._dataInterval=[],this._handleEnds=[],this._orient,this._useHandle,this._hoverLinkDataIndices=[],this._dragging,this._hovering},doRender:function(e,t,r,a){a&&"selectDataRange"===a.type&&a.from===this.uid||this._buildView()},_buildView:function(){this.group.removeAll();var e=this.visualMapModel,t=this.group;this._orient=e.get("orient"),this._useHandle=e.get("calculable"),this._resetInterval(),this._renderBar(t);var r=e.get("text");this._renderEndsText(t,r,0),this._renderEndsText(t,r,1),this._updateView(!0),this.renderBackground(t),this._updateView(),this._enableHoverLinkToSeries(),this._enableHoverLinkFromSeries(),this.positionGroup(t)},_renderEndsText:function(e,t,r){if(t){var a=t[1-r];a=null!=a?a+"":"";var n=this.visualMapModel,o=n.get("textGap"),i=n.itemSize,l=this._shapes.barGroup,s=this._applyTransform([i[0]/2,0===r?-o:i[1]+o],l),u=this._applyTransform(0===r?"bottom":"top",l),h=this._orient,c=this.visualMapModel.textStyleModel;this.group.add(new m.Text({style:{x:s[0],y:s[1],textVerticalAlign:"horizontal"===h?"middle":u,textAlign:"horizontal"===h?u:"center",text:a,textFont:c.getFont(),textFill:c.getTextColor()}}))}},_renderBar:function(e){var t=this.visualMapModel,r=this._shapes,n=t.itemSize,o=this._orient,i=this._useHandle,l=v.getItemAlign(t,this.api,n),h=r.barGroup=this._createBarGroup(l);h.add(r.outOfRange=a()),h.add(r.inRange=a(null,i?s(this._orient):null,u.bind(this._dragHandle,this,"all",!1),u.bind(this._dragHandle,this,"all",!0)));var c=t.textStyleModel.getTextRect("国"),d=x(c.width,c.height);i&&(r.handleThumbs=[],r.handleLabels=[],r.handleLabelPoints=[],this._createHandle(h,0,n,d,o,l),this._createHandle(h,1,n,d,o,l)),this._createIndicator(h,n,d,o),e.add(h)},_createHandle:function(e,t,r,o,i){var l=u.bind(this._dragHandle,this,t,!1),h=u.bind(this._dragHandle,this,t,!0),d=a(n(t,o),s(this._orient),l,h);d.position[0]=r[0],e.add(d);var p=this.visualMapModel.textStyleModel,f=new m.Text({draggable:!0,drift:l,onmousemove:function(e){c.stop(e.event)},ondragend:h,style:{x:0,y:0,text:"",textFont:p.getFont(),textFill:p.getTextColor()}});this.group.add(f);var v=["horizontal"===i?o/2:1.5*o,"horizontal"===i?0===t?-1.5*o:1.5*o:0===t?-o/2:o/2],y=this._shapes;y.handleThumbs[t]=d,y.handleLabelPoints[t]=v,y.handleLabels[t]=f},_createIndicator:function(e,t,r,n){var o=a([[0,0]],"move");o.position[0]=t[0],o.attr({invisible:!0,silent:!0}),e.add(o);var i=this.visualMapModel.textStyleModel,l=new m.Text({silent:!0,invisible:!0,style:{x:0,y:0,text:"",textFont:i.getFont(),textFill:i.getTextColor()}});this.group.add(l);var s=["horizontal"===n?r/2:N+3,0],u=this._shapes;u.indicator=o,u.indicatorLabel=l,u.indicatorLabelPoint=s},_dragHandle:function(e,t,r,a){if(this._useHandle){if(this._dragging=!t,!t){var n=this._applyTransform([r,a],this._shapes.barGroup,!0);this._updateInterval(e,n[1]),this._updateView()}t===!this.visualMapModel.get("realtime")&&this.api.dispatchAction({type:"selectDataRange",from:this.uid,visualMapId:this.visualMapModel.id,selected:this._dataInterval.slice()}),t?!this._hovering&&this._clearHoverLinkToSeries():l(this.visualMapModel)&&this._doHoverLinkToSeries(this._handleEnds[e],!1)}},_resetInterval:function(){var e=this.visualMapModel,t=this._dataInterval=e.getSelected(),r=e.getExtent(),a=[0,e.itemSize[1]];this._handleEnds=[g(t[0],r,a,!0),g(t[1],r,a,!0)]},_updateInterval:function(e,t){t=t||0;var r=this.visualMapModel,a=this._handleEnds,n=[0,r.itemSize[1]];f(t,a,n,e,0);var o=r.getExtent();this._dataInterval=[g(a[0],n,o,!0),g(a[1],n,o,!0)]},_updateView:function(e){var t=this.visualMapModel,r=t.getExtent(),a=this._shapes,n=[0,t.itemSize[1]],o=e?n:this._handleEnds,i=this._createBarVisual(this._dataInterval,r,o,"inRange"),l=this._createBarVisual(r,r,n,"outOfRange");a.inRange.setStyle({fill:i.barColor,opacity:i.opacity}).setShape("points",i.barPoints),a.outOfRange.setStyle({fill:l.barColor,opacity:l.opacity}).setShape("points",l.barPoints),this._updateHandle(o,i)},_createBarVisual:function(e,t,r,a){var n={forceState:a,convertOpacityToAlpha:!0},o=this._makeColorGradient(e,n),i=[this.getControllerVisual(e[0],"symbolSize",n),this.getControllerVisual(e[1],"symbolSize",n)],l=this._createBarPoints(r,i);return{barColor:new h(0,0,0,1,o),barPoints:l,handlesColor:[o[0].color,o[o.length-1].color]}},_makeColorGradient:function(e,t){var r=[],a=(e[1]-e[0])/100;r.push({color:this.getControllerVisual(e[0],"color",t),offset:0});for(var n=1;n<100;n++){var o=e[0]+a*n;if(o>e[1])break;r.push({color:this.getControllerVisual(o,"color",t),offset:n/100})}return r.push({color:this.getControllerVisual(e[1],"color",t),offset:1}),r},_createBarPoints:function(e,t){var r=this.visualMapModel.itemSize;return[[r[0]-t[0],e[0]],[r[0],e[0]],[r[0],e[1]],[r[0]-t[1],e[1]]]},_createBarGroup:function(e){var t=this._orient,r=this.visualMapModel.get("inverse");return new m.Group("horizontal"!==t||r?"horizontal"===t&&r?{scale:"bottom"===e?[-1,1]:[1,1],rotation:-Math.PI/2}:"vertical"!==t||r?{scale:"left"===e?[1,1]:[-1,1]}:{scale:"left"===e?[1,-1]:[-1,-1]}:{scale:"bottom"===e?[1,1]:[-1,1],rotation:Math.PI/2})},_updateHandle:function(e,t){if(this._useHandle){var r=this._shapes,a=this.visualMapModel,n=r.handleThumbs,o=r.handleLabels;_([0,1],function(i){var l=n[i];l.setStyle("fill",t.handlesColor[i]),l.position[1]=e[i];var s=m.applyTransform(r.handleLabelPoints[i],m.getTransform(l,this.group));o[i].setStyle({x:s[0],y:s[1],text:a.formatValueText(this._dataInterval[i]),textVerticalAlign:"middle",textAlign:this._applyTransform("horizontal"===this._orient?0===i?"bottom":"top":"left",r.barGroup)})},this)}},_showIndicator:function(e,t,r,a){var n=this.visualMapModel,i=n.getExtent(),l=n.itemSize,s=[0,l[1]],u=g(e,i,s,!0),h=this._shapes,c=h.indicator;if(c){c.position[1]=u,c.attr("invisible",!1),c.setShape("points",o(!!r,a,u,l[1]));var d={convertOpacityToAlpha:!0},p=this.getControllerVisual(e,"color",d);c.setStyle("fill",p);var f=m.applyTransform(h.indicatorLabelPoint,m.getTransform(c,this.group)),v=h.indicatorLabel;v.attr("invisible",!1);var y=this._applyTransform("left",h.barGroup),_=this._orient;v.setStyle({text:(r||"")+n.formatValueText(t),textVerticalAlign:"horizontal"===_?y:"middle",textAlign:"horizontal"===_?"center":y,x:f[0],y:f[1]})}},_enableHoverLinkToSeries:function(){var e=this;this._shapes.barGroup.on("mousemove",function(t){if(e._hovering=!0,!e._dragging){var r=e.visualMapModel.itemSize,a=e._applyTransform([t.offsetX,t.offsetY],e._shapes.barGroup,!0,!0);a[1]=T(x(0,a[1]),r[1]),e._doHoverLinkToSeries(a[1],0<=a[0]&&a[0]<=r[0])}}).on("mouseout",function(){e._hovering=!1,!e._dragging&&e._clearHoverLinkToSeries()})},_enableHoverLinkFromSeries:function(){var e=this.api.getZr();this.visualMapModel.option.hoverLink?(e.on("mouseover",this._hoverLinkFromSeriesMouseOver,this),e.on("mouseout",this._hideIndicator,this)):this._clearHoverLinkFromSeries()},_doHoverLinkToSeries:function(e,t){var r=this.visualMapModel,a=r.itemSize;if(r.option.hoverLink){var n=[0,a[1]],o=r.getExtent();e=T(x(n[0],e),n[1]);var s=i(r,o,n),u=[e-s,e+s],h=g(e,n,o,!0),c=[g(u[0],n,o,!0),g(u[1],n,o,!0)];u[0]<n[0]&&(c[0]=-1/0),u[1]>n[1]&&(c[1]=1/0),t&&(c[0]===-1/0?this._showIndicator(h,c[1],"< ",s):c[1]===1/0?this._showIndicator(h,c[0],"> ",s):this._showIndicator(h,h,"≈ ",s));var d=this._hoverLinkDataIndices,m=[];(t||l(r))&&(m=this._hoverLinkDataIndices=r.findTargetDataIndices(c));var p=y.compressBatches(d,m);this._dispatchHighDown("downplay",v.convertDataIndex(p[0])),this._dispatchHighDown("highlight",v.convertDataIndex(p[1]))}},_hoverLinkFromSeriesMouseOver:function(e){var t=e.target,r=this.visualMapModel;if(t&&null!=t.dataIndex){var a=this.ecModel.getSeriesByIndex(t.seriesIndex);if(r.isTargetSeries(a)){var n=a.getData(t.dataType),o=n.getDimension(r.getDataDimension(n)),i=n.get(o,t.dataIndex,!0);isNaN(i)||this._showIndicator(i,i)}}},_hideIndicator:function(){var e=this._shapes;e.indicator&&e.indicator.attr("invisible",!0),e.indicatorLabel&&e.indicatorLabel.attr("invisible",!0)},_clearHoverLinkToSeries:function(){this._hideIndicator();var e=this._hoverLinkDataIndices;this._dispatchHighDown("downplay",v.convertDataIndex(e)),e.length=0},_clearHoverLinkFromSeries:function(){this._hideIndicator();var e=this.api.getZr();e.off("mouseover",this._hoverLinkFromSeriesMouseOver),e.off("mouseout",this._hideIndicator)},_applyTransform:function(e,t,r,a){var n=m.getTransform(t,a?null:this.group);return m[u.isArray(e)?"applyTransform":"transformDirection"](e,n,r)},_dispatchHighDown:function(e,t){t&&t.length&&this.api.dispatchAction({type:e,batch:t})},dispose:function(){this._clearHoverLinkFromSeries(),this._clearHoverLinkToSeries()},remove:function(){this._clearHoverLinkFromSeries(),this._clearHoverLinkToSeries()}}),L=b;e.exports=L},function(e,t,r){"use strict";function a(e,t){var r=e.inverse;("vertical"===e.orient?!r:r)&&t.reverse()}var n=r(9),o=(n.__DEV__,r(0)),i=r(360),l=r(93),s=r(379),u=r(4),h=u.reformIntervals,c=i.extend({type:"visualMap.piecewise",defaultOption:{selected:null,minOpen:!1,maxOpen:!1,align:"auto",itemWidth:20,itemHeight:14,itemSymbol:"roundRect",pieceList:null,categories:null,splitNumber:5,selectedMode:"multiple",itemGap:10,hoverLink:!0,showLabel:null},optionUpdated:function(e,t){c.superApply(this,"optionUpdated",arguments),this._pieceList=[],this.resetExtent();var r=this._mode=this._determineMode();d[this._mode].call(this),this._resetSelected(e,t);var a=this.option.categories;this.resetVisual(function(e,t){"categories"===r?(e.mappingMethod="category",e.categories=o.clone(a)):(e.dataExtent=this.getExtent(),e.mappingMethod="piecewise",e.pieceList=o.map(this._pieceList,function(e){var e=o.clone(e);return"inRange"!==t&&(e.visual=null),e}))})},completeVisualOption:function(){function e(e,t,r){return e&&e[t]&&(o.isObject(e[t])?e[t].hasOwnProperty(r):e[t]===r)}var t=this.option,r={},a=l.listVisualTypes(),n=this.isCategory();o.each(t.pieces,function(e){o.each(a,function(t){e.hasOwnProperty(t)&&(r[t]=1)})}),o.each(r,function(r,a){var i=0;o.each(this.stateList,function(r){i|=e(t,r,a)||e(t.target,r,a)},this),!i&&o.each(this.stateList,function(e){(t[e]||(t[e]={}))[a]=s.get(a,"inRange"===e?"active":"inactive",n)})},this),i.prototype.completeVisualOption.apply(this,arguments)},_resetSelected:function(e,t){var r=this.option,a=this._pieceList,n=(t?r:e).selected||{};if(r.selected=n,o.each(a,function(e,t){var r=this.getSelectedMapKey(e);n.hasOwnProperty(r)||(n[r]=!0)},this),"single"===r.selectedMode){var i=!1;o.each(a,function(e,t){var r=this.getSelectedMapKey(e);n[r]&&(i?n[r]=!1:i=!0)},this)}},getSelectedMapKey:function(e){return"categories"===this._mode?e.value+"":e.index+""},getPieceList:function(){return this._pieceList},_determineMode:function(){var e=this.option;return e.pieces&&e.pieces.length>0?"pieces":this.option.categories?"categories":"splitNumber"},setSelected:function(e){this.option.selected=o.clone(e)},getValueState:function(e){var t=l.findPieceIndex(e,this._pieceList);return null!=t&&this.option.selected[this.getSelectedMapKey(this._pieceList[t])]?"inRange":"outOfRange"},findTargetDataIndices:function(e){var t=[];return this.eachTargetSeries(function(r){var a=[],n=r.getData();n.each(this.getDataDimension(n),function(t,r){l.findPieceIndex(t,this._pieceList)===e&&a.push(r)},!0,this),t.push({seriesId:r.id,dataIndex:a})},this),t},getRepresentValue:function(e){var t;if(this.isCategory())t=e.value;else if(null!=e.value)t=e.value;else{var r=e.interval||[];t=r[0]===-1/0&&r[1]===1/0?0:(r[0]+r[1])/2}return t},getVisualMeta:function(e){function t(t,o){var i=n.getRepresentValue({interval:t});o||(o=n.getValueState(i));var l=e(i,o);t[0]===-1/0?a[0]=l:t[1]===1/0?a[1]=l:r.push({value:t[0],color:l},{value:t[1],color:l})}if(!this.isCategory()){var r=[],a=[],n=this,i=this._pieceList.slice();if(i.length){var l=i[0].interval[0];l!==-1/0&&i.unshift({interval:[-1/0,l]}),(l=i[i.length-1].interval[1])!==1/0&&i.push({interval:[l,1/0]})}else i.push({interval:[-1/0,1/0]});var s=-1/0;return o.each(i,function(e){var r=e.interval;r&&(r[0]>s&&t([s,r[0]],"outOfRange"),t(r.slice()),s=r[1])},this),{stops:r,outerColors:a}}}}),d={splitNumber:function(){var e=this.option,t=this._pieceList,r=Math.min(e.precision,20),a=this.getExtent(),n=e.splitNumber;n=Math.max(parseInt(n,10),1),e.splitNumber=n;for(var i=(a[1]-a[0])/n;+i.toFixed(r)!==i&&r<5;)r++;e.precision=r,i=+i.toFixed(r);var l=0;e.minOpen&&t.push({index:l++,interval:[-1/0,a[0]],close:[0,0]});for(var s=a[0],u=l+n;l<u;s+=i){var c=l===n-1?a[1]:s+i;t.push({index:l++,interval:[s,c],close:[1,1]})}e.maxOpen&&t.push({index:l++,interval:[a[1],1/0],close:[0,0]}),h(t),o.each(t,function(e){e.text=this.formatValueText(e.interval)},this)},categories:function(){var e=this.option;o.each(e.categories,function(e){this._pieceList.push({text:this.formatValueText(e,!0),value:e})},this),a(e,this._pieceList)},pieces:function(){var e=this.option,t=this._pieceList;o.each(e.pieces,function(e,r){o.isObject(e)||(e={value:e});var a={text:"",index:r};if(null!=e.label&&(a.text=e.label),e.hasOwnProperty("value")){var n=a.value=e.value;a.interval=[n,n],a.close=[1,1]}else{for(var i=a.interval=[],s=a.close=[0,0],u=[1,0,1],h=[-1/0,1/0],c=[],d=0;d<2;d++){for(var m=[["gte","gt","min"],["lte","lt","max"]][d],p=0;p<3&&null==i[d];p++)i[d]=e[m[p]],s[d]=u[p],c[d]=2===p;null==i[d]&&(i[d]=h[d])}c[0]&&i[1]===1/0&&(s[0]=0),c[1]&&i[0]===-1/0&&(s[1]=0),i[0]===i[1]&&s[0]&&s[1]&&(a.value=i[0])}a.visual=l.retrieveVisuals(e),t.push(a)},this),a(e,t),h(t),o.each(t,function(e){var t=e.close,r=[["<","≤"][t[1]],[">","≥"][t[0]]];e.text=e.text||this.formatValueText(null!=e.value?e.value:e.interval,!1,r)},this)}},m=c;e.exports=m},function(e,t,r){"use strict";var a=r(0),n=r(361),o=r(3),i=r(38),l=i.createSymbol,s=r(11),u=r(362),h=n.extend({type:"visualMap.piecewise",doRender:function(){function e(e){var i=e.piece,s=new o.Group;s.onclick=a.bind(this._onItemClick,this,i),this._enableHoverLink(s,e.indexInModelPieceList);var d=r.getRepresentValue(i);if(this._createItemSymbol(s,d,[0,0,c[0],c[1]]),p){var m=this.visualMapModel.getValueState(d);s.add(new o.Text({style:{x:"right"===h?-n:c[0]+n,y:c[1]/2,text:i.text,textVerticalAlign:"middle",textAlign:h,textFont:l,textFill:u,opacity:"outOfRange"===m?.5:1}}))}t.add(s)}var t=this.group;t.removeAll();var r=this.visualMapModel,n=r.get("textGap"),i=r.textStyleModel,l=i.getFont(),u=i.getTextColor(),h=this._getItemAlign(),c=r.itemSize,d=this._getViewData(),m=d.endsText,p=a.retrieve(r.get("showLabel",!0),!m);m&&this._renderEndsText(t,m[0],c,p,h),a.each(d.viewPieceList,e,this),m&&this._renderEndsText(t,m[1],c,p,h),s.box(r.get("orient"),t,r.get("itemGap")),this.renderBackground(t),this.positionGroup(t)},_enableHoverLink:function(e,t){function r(e){var r=this.visualMapModel;r.option.hoverLink&&this.api.dispatchAction({type:e,batch:u.convertDataIndex(r.findTargetDataIndices(t))})}e.on("mouseover",a.bind(r,this,"highlight")).on("mouseout",a.bind(r,this,"downplay"))},_getItemAlign:function(){var e=this.visualMapModel,t=e.option;if("vertical"===t.orient)return u.getItemAlign(e,this.api,e.itemSize);var r=t.align;return r&&"auto"!==r||(r="left"),r},_renderEndsText:function(e,t,r,a,n){if(t){var i=new o.Group,l=this.visualMapModel.textStyleModel;i.add(new o.Text({style:{x:a?"right"===n?r[0]:0:r[0]/2,y:r[1]/2,textVerticalAlign:"middle",textAlign:a?n:"center",text:t,textFont:l.getFont(),textFill:l.getTextColor()}})),e.add(i)}},_getViewData:function(){var e=this.visualMapModel,t=a.map(e.getPieceList(),function(e,t){return{piece:e,indexInModelPieceList:t}}),r=e.get("text"),n=e.get("orient"),o=e.get("inverse");return("horizontal"===n?o:!o)?t.reverse():r&&(r=r.slice().reverse()),{viewPieceList:t,endsText:r}},_createItemSymbol:function(e,t,r){e.add(l(this.getControllerVisual(t,"symbol"),r[0],r[1],r[2],r[3],this.getControllerVisual(t,"color")))},_onItemClick:function(e){var t=this.visualMapModel,r=t.option,n=a.clone(r.selected),o=t.getSelectedMapKey(e);"single"===r.selectedMode?(n[o]=!0,a.each(n,function(e,t){n[t]=t===o})):n[o]=!n[o],this.api.dispatchAction({type:"selectDataRange",from:this.uid,visualMapId:this.visualMapModel.id,selected:n})}}),c=h;e.exports=c},function(e,t,r){"use strict";var a=r(2),n=r(363);r(364),r(365),r(918),r(919),r(366),a.registerPreprocessor(n)},function(e,t,r){"use strict";var a=r(2),n=r(363);r(364),r(365),r(920),r(921),r(366),a.registerPreprocessor(n)},function(e,t,r){"use strict";function a(e,t,r){this._model=e}function n(e,t,r,a){var n=r.calendarModel,o=r.seriesModel,i=n?n.coordinateSystem:o?o.coordinateSystem:null;return i===this?i[e](a):null}var o=r(0),i=r(11),l=r(4),s=r(53);a.prototype={constructor:a,type:"calendar",dimensions:["time","value"],getDimensionsInfo:function(){return[{name:"time",type:"time"}]},getRangeInfo:function(){return this._rangeInfo},getModel:function(){return this._model},getRect:function(){return this._rect},getCellWidth:function(){return this._sw},getCellHeight:function(){return this._sh},getOrient:function(){return this._orient},getFirstDayOfWeek:function(){return this._firstDayOfWeek},getDateInfo:function(e){e=l.parseDate(e);var t=e.getFullYear(),r=e.getMonth()+1;r=r<10?"0"+r:r;var a=e.getDate();a=a<10?"0"+a:a;var n=e.getDay();return n=Math.abs((n+7-this.getFirstDayOfWeek())%7),{y:t,m:r,d:a,day:n,time:e.getTime(),formatedDate:t+"-"+r+"-"+a,date:e}},getNextNDay:function(e,t){return 0===(t=t||0)?this.getDateInfo(e):(e=new Date(this.getDateInfo(e).time),e.setDate(e.getDate()+t),this.getDateInfo(e))},update:function(e,t){function r(e,t){return null!=e[t]&&"auto"!==e[t]}this._firstDayOfWeek=+this._model.getModel("dayLabel").get("firstDay"),this._orient=this._model.get("orient"),this._lineWidth=this._model.getModel("itemStyle.normal").getItemStyle().lineWidth||0,this._rangeInfo=this._getRangeInfo(this._initRangeOption());var a=this._rangeInfo.weeks||1,n=["width","height"],l=this._model.get("cellSize").slice(),s=this._model.getBoxLayoutParams(),u="horizontal"===this._orient?[a,7]:[7,a];o.each([0,1],function(e){r(l,e)&&(s[n[e]]=l[e]*u[e])});var h={width:t.getWidth(),height:t.getHeight()},c=this._rect=i.getLayoutRect(s,h);o.each([0,1],function(e){r(l,e)||(l[e]=c[n[e]]/u[e])}),this._sw=l[0],this._sh=l[1]},dataToPoint:function(e,t){o.isArray(e)&&(e=e[0]),null==t&&(t=!0);var r=this.getDateInfo(e),a=this._rangeInfo,n=r.formatedDate;if(t&&!(r.time>=a.start.time&&r.time<=a.end.time))return[NaN,NaN];var i=r.day,l=this._getRangeInfo([a.start.time,n]).nthWeek;return"vertical"===this._orient?[this._rect.x+i*this._sw+this._sw/2,this._rect.y+l*this._sh+this._sh/2]:[this._rect.x+l*this._sw+this._sw/2,this._rect.y+i*this._sh+this._sh/2]},pointToData:function(e){var t=this.pointToDate(e);return t&&t.time},dataToRect:function(e,t){var r=this.dataToPoint(e,t);return{contentShape:{x:r[0]-(this._sw-this._lineWidth)/2,y:r[1]-(this._sh-this._lineWidth)/2,width:this._sw-this._lineWidth,height:this._sh-this._lineWidth},center:r,tl:[r[0]-this._sw/2,r[1]-this._sh/2],tr:[r[0]+this._sw/2,r[1]-this._sh/2],br:[r[0]+this._sw/2,r[1]+this._sh/2],bl:[r[0]-this._sw/2,r[1]+this._sh/2]}},pointToDate:function(e){var t=Math.floor((e[0]-this._rect.x)/this._sw)+1,r=Math.floor((e[1]-this._rect.y)/this._sh)+1,a=this._rangeInfo.range;return"vertical"===this._orient?this._getDateByWeeksAndDay(r,t-1,a):this._getDateByWeeksAndDay(t,r-1,a)},convertToPixel:o.curry(n,"dataToPoint"),convertFromPixel:o.curry(n,"pointToData"),_initRangeOption:function(){var e=this._model.get("range"),t=e;if(o.isArray(t)&&1===t.length&&(t=t[0]),/^\d{4}$/.test(t)&&(e=[t+"-01-01",t+"-12-31"]),/^\d{4}[\/|-]\d{1,2}$/.test(t)){var r=this.getDateInfo(t),a=r.date;a.setMonth(a.getMonth()+1);var n=this.getNextNDay(a,-1);e=[r.formatedDate,n.formatedDate]}/^\d{4}[\/|-]\d{1,2}[\/|-]\d{1,2}$/.test(t)&&(e=[t,t]);var i=this._getRangeInfo(e);return i.start.time>i.end.time&&e.reverse(),e},_getRangeInfo:function(e){e=[this.getDateInfo(e[0]),this.getDateInfo(e[1])];var t;e[0].time>e[1].time&&(t=!0,e.reverse());var r=Math.floor(e[1].time/864e5)-Math.floor(e[0].time/864e5)+1,a=new Date(e[0].time),n=a.getDate(),o=e[1].date.getDate();if(a.setDate(n+r-1),a.getDate()!==o)for(var i=a.getTime()-e[1].time>0?1:-1;a.getDate()!==o&&(a.getTime()-e[1].time)*i>0;)r-=i,a.setDate(n+r-1);var l=Math.floor((r+e[0].day+6)/7),s=t?1-l:l-1;return t&&e.reverse(),{range:[e[0].formatedDate,e[1].formatedDate],start:e[0],end:e[1],allDay:r,weeks:l,nthWeek:s,fweek:e[0].day,lweek:e[1].day}},_getDateByWeeksAndDay:function(e,t,r){var a=this._getRangeInfo(r);if(e>a.weeks||0===e&&t<a.fweek||e===a.weeks&&t>a.lweek)return!1;var n=7*(e-1)-a.fweek+t,o=new Date(a.start.time);return o.setDate(a.start.d+n),this.getDateInfo(o)}},a.dimensions=a.prototype.dimensions,a.getDimensionsInfo=a.prototype.getDimensionsInfo,a.create=function(e,t){var r=[];return e.eachComponent("calendar",function(n){var o=new a(n,e,t);r.push(o),n.coordinateSystem=o}),e.eachSeries(function(e){"calendar"===e.get("coordinateSystem")&&(e.coordinateSystem=r[e.get("calendarIndex")||0])}),r},s.register("calendar",a);var u=a;e.exports=u},function(e,t,r){"use strict";function a(e,t){var r=e.cellSize;n.isArray(r)?1===r.length&&(r[1]=r[0]):r=e.cellSize=[r,r];var a=n.map([0,1],function(e){return s(t,e)&&(r[e]="auto"),null!=r[e]&&"auto"!==r[e]});u(e,t,{type:"box",ignoreSize:a})}var n=r(0),o=r(24),i=r(11),l=i.getLayoutParams,s=i.sizeCalculable,u=i.mergeLayoutParam,h=o.extend({type:"calendar",coordinateSystem:null,defaultOption:{zlevel:0,z:2,left:80,top:60,cellSize:20,orient:"horizontal",splitLine:{show:!0,lineStyle:{color:"#000",width:1,type:"solid"}},itemStyle:{normal:{color:"#fff",borderWidth:1,borderColor:"#ccc"}},dayLabel:{show:!0,firstDay:0,position:"start",margin:"50%",nameMap:"en",color:"#000"},monthLabel:{show:!0,position:"start",margin:5,align:"center",nameMap:"en",formatter:null,color:"#000"},yearLabel:{show:!0,position:null,margin:30,formatter:null,color:"#ccc",fontFamily:"sans-serif",fontWeight:"bolder",fontSize:20}},init:function(e,t,r,n){var o=l(e);h.superApply(this,"init",arguments),a(e,o)},mergeOption:function(e,t){h.superApply(this,"mergeOption",arguments),a(this.option,e)}}),c=h;e.exports=c},function(e,t,r){"use strict";function a(e){var t=e.getRect(),r=e.getRangeInfo();return{coordSys:{type:"calendar",x:t.x,y:t.y,width:t.width,height:t.height,cellWidth:e.getCellWidth(),cellHeight:e.getCellHeight(),rangeInfo:{start:r.start,end:r.end,weeks:r.weeks,dayCount:r.allDay}},api:{coord:n.bind(e.dataToPoint,e)}}}var n=r(0);e.exports=a},function(e,t,r){"use strict";var a=r(0),n=r(71),o=function(e,t,r,a,o){n.call(this,e,t,r),this.type=a||"value",this.position=o||"bottom"};o.prototype={constructor:o,index:0,onZero:!1,model:null,isHorizontal:function(){var e=this.position;return"top"===e||"bottom"===e},getGlobalExtent:function(e){var t=this.getExtent();return t[0]=this.toGlobalCoord(t[0]),t[1]=this.toGlobalCoord(t[1]),e&&t[0]>t[1]&&t.reverse(),t},getOtherAxis:function(){this.grid.getOtherAxis()},isLabelIgnored:function(e){if("category"===this.type){var t=this.getLabelInterval();return"function"==typeof t&&!t(e,this.scale.getLabel(e))||e%(t+1)}},pointToData:function(e,t){return this.coordToData(this.toLocalCoord(e["x"===this.dim?0:1]),t)},toLocalCoord:null,toGlobalCoord:null},a.inherits(o,n);var i=o;e.exports=i},function(e,t,r){"use strict";function a(e){return this._axes[e]}var n=r(0),o=function(e){this._axes={},this._dimList=[],this.name=e||""};o.prototype={constructor:o,type:"cartesian",getAxis:function(e){return this._axes[e]},getAxes:function(){return n.map(this._dimList,a,this)},getAxesByScale:function(e){return e=e.toLowerCase(),n.filter(this.getAxes(),function(t){return t.scale.type===e})},addAxis:function(e){var t=e.dim;this._axes[t]=e,this._dimList.push(t)},dataToCoord:function(e){return this._dataCoordConvert(e,"dataToCoord")},coordToData:function(e){return this._dataCoordConvert(e,"coordToData")},_dataCoordConvert:function(e,t){for(var r=this._dimList,a=e instanceof Array?[]:{},n=0;n<r.length;n++){var o=r[n],i=this._axes[o];a[o]=i[t](e[o])}return a}};var i=o;e.exports=i},function(e,t,r){"use strict";function a(e){o.call(this,e)}var n=r(0),o=r(928);a.prototype={constructor:a,type:"cartesian2d",dimensions:["x","y"],getBaseAxis:function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAxis("x")},containPoint:function(e){var t=this.getAxis("x"),r=this.getAxis("y");return t.contain(t.toLocalCoord(e[0]))&&r.contain(r.toLocalCoord(e[1]))},containData:function(e){return this.getAxis("x").containData(e[0])&&this.getAxis("y").containData(e[1])},dataToPoint:function(e,t){var r=this.getAxis("x"),a=this.getAxis("y");return[r.toGlobalCoord(r.dataToCoord(e[0],t)),a.toGlobalCoord(a.dataToCoord(e[1],t))]},pointToData:function(e,t){var r=this.getAxis("x"),a=this.getAxis("y");return[r.coordToData(r.toLocalCoord(e[0]),t),a.coordToData(a.toLocalCoord(e[1]),t)]},getOtherAxis:function(e){return this.getAxis("x"===e.dim?"y":"x")}},n.inherits(a,o);var i=a;e.exports=i},function(e,t,r){"use strict";r(369);var a=r(24),n=a.extend({type:"grid",dependencies:["xAxis","yAxis"],layoutMode:"box",coordinateSystem:null,defaultOption:{show:!1,zlevel:0,z:0,left:"10%",top:60,right:"10%",bottom:60,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"}});e.exports=n},function(e,t,r){"use strict";function a(e,t){return t=t||[0,0],o.map(["x","y"],function(r,a){var n=this.getAxis(r),o=t[a],i=e[a]/2;return"category"===n.type?n.getBandWidth():Math.abs(n.dataToCoord(o-i)-n.dataToCoord(o+i))},this)}function n(e){var t=e.grid.getRect();return{coordSys:{type:"cartesian2d",x:t.x,y:t.y,width:t.width,height:t.height},api:{coord:o.bind(e.dataToPoint,e),size:o.bind(a,e)}}}var o=r(0);e.exports=n},function(e,t,r){"use strict";function a(e,t,r,a,n){s.call(this,e),this.map=t,this._nameCoordMap=o.createHashMap(),this.loadGeoJson(r,a,n)}function n(e,t,r,a){var n=r.geoModel,o=r.seriesModel,i=n?n.coordinateSystem:o?o.coordinateSystem||(o.getReferringComponents("geo")[0]||{}).coordinateSystem:null;return i===this?i[e](a):null}var o=r(0),i=r(19),l=r(371),s=r(367),u=r(936),h=r(937),c=r(935),d=r(934),m=[u,h,c,d];a.prototype={constructor:a,type:"geo",dimensions:["lng","lat"],containCoord:function(e){for(var t=this.regions,r=0;r<t.length;r++)if(t[r].contain(e))return!0;return!1},loadGeoJson:function(e,t,r){try{this.regions=e?l(e):[]}catch(e){throw"Invalid geoJson format\n"+e.message}t=t||{},r=r||{};for(var a=this.regions,n=o.createHashMap(),i=0;i<a.length;i++){var s=a[i].name;s=r.hasOwnProperty(s)?r[s]:s,a[i].name=s,n.set(s,a[i]),this.addGeoCoord(s,a[i].center);var u=t[s];u&&a[i].transformTo(u.left,u.top,u.width,u.height)}this._regionsMap=n,this._rect=null,o.each(m,function(e){e(this)},this)},transformTo:function(e,t,r,a){var n=this.getBoundingRect();n=n.clone(),n.y=-n.y-n.height;var o=this._viewTransform;o.transform=n.calculateTransform(new i(e,t,r,a)),o.decomposeTransform();var l=o.scale;l[1]=-l[1],o.updateTransform(),this._updateTransform()},getRegion:function(e){return this._regionsMap.get(e)},getRegionByCoord:function(e){for(var t=this.regions,r=0;r<t.length;r++)if(t[r].contain(e))return t[r]},addGeoCoord:function(e,t){this._nameCoordMap.set(e,t)},getGeoCoord:function(e){return this._nameCoordMap.get(e)},getBoundingRect:function(){if(this._rect)return this._rect;for(var e,t=this.regions,r=0;r<t.length;r++){var a=t[r].getBoundingRect();e=e||a.clone(),e.union(a)}return this._rect=e||new i(0,0,0,0)},dataToPoint:function(e){if("string"==typeof e&&(e=this.getGeoCoord(e)),e)return s.prototype.dataToPoint.call(this,e)},convertToPixel:o.curry(n,"dataToPoint"),convertFromPixel:o.curry(n,"pointToData")},o.mixin(a,s);var p=a;e.exports=p},function(e,t,r){"use strict";var a=r(0),n=r(10),o=r(24),i=r(20),l=r(243),s=r(168),u=o.extend({type:"geo",coordinateSystem:null,layoutMode:"box",init:function(e){o.prototype.init.apply(this,arguments),n.defaultEmphasis(e.label,["show"])},optionUpdated:function(){var e=this.option,t=this;e.regions=s.getFilledRegions(e.regions,e.map,e.nameMap),this._optionModelMap=a.reduce(e.regions||[],function(e,r){return r.name&&e.set(r.name,new i(r,t)),e},a.createHashMap()),this.updateSelectedMap(e.regions)},defaultOption:{zlevel:0,z:0,show:!0,left:"center",top:"center",aspectScale:.75,silent:!1,map:"",boundingCoords:null,center:null,zoom:1,scaleLimit:null,label:{normal:{show:!1,color:"#000"},emphasis:{show:!0,color:"rgb(100,0,0)"}},itemStyle:{normal:{borderWidth:.5,borderColor:"#444",color:"#eee"},emphasis:{color:"rgba(255,215,0,0.8)"}},regions:[]},getRegionModel:function(e){return this._optionModelMap.get(e)||new i(null,this,this.ecModel)},getFormattedLabel:function(e,t){var r=this.getRegionModel(e),a=r.get("label."+t+".formatter"),n={name:e};return"function"==typeof a?(n.status=t,a(n)):"string"==typeof a?a.replace("{a}",null!=e?e:""):void 0},setZoom:function(e){this.option.zoom=e},setCenter:function(e){this.option.center=e}});a.mixin(u,l);var h=u;e.exports=h},function(e,t,r){"use strict";function a(e){if("china"===e.map)for(var t=0,r=e.regions.length;t<r;++t)"台湾"===e.regions[t].name&&e.regions[t].geometries.push({type:"polygon",exterior:n[0]})}var n=[[[123.45165252685547,25.73527164402261],[123.49731445312499,25.73527164402261],[123.49731445312499,25.750734064600884],[123.45165252685547,25.750734064600884],[123.45165252685547,25.73527164402261]]];e.exports=a},function(e,t,r){"use strict";function a(e){n.each(e.regions,function(e){var t=o[e.name];if(t){var r=e.center;r[0]=t[0],r[1]=t[1]}})}var n=r(0),o={Russia:[100,60],"United States":[-99,38],"United States of America":[-99,38]};e.exports=a},function(e,t,r){"use strict";function a(e){"china"===e.map&&e.regions.push(new o("南海诸岛",n.map(l,function(e){return{type:"polygon",exterior:e}}),i))}for(var n=r(0),o=r(370),i=[126,25],l=[[[0,3.5],[7,11.2],[15,11.9],[30,7],[42,.7],[52,.7],[56,7.7],[59,.7],[64,.7],[64,0],[5,0],[0,3.5]],[[13,16.1],[19,14.7],[16,21.7],[11,23.1],[13,16.1]],[[12,32.2],[14,38.5],[15,38.5],[13,32.2],[12,32.2]],[[16,47.6],[12,53.2],[13,53.2],[18,47.6],[16,47.6]],[[6,64.4],[8,70],[9,70],[8,64.4],[6,64.4]],[[23,82.6],[29,79.8],[30,79.8],[25,82.6],[23,82.6]],[[37,70.7],[43,62.3],[44,62.3],[39,70.7],[37,70.7]],[[48,51.1],[51,45.5],[53,45.5],[50,51.1],[48,51.1]],[[51,35],[51,28.7],[53,28.7],[53,35],[51,35]],[[52,22.4],[55,17.5],[56,17.5],[53,22.4],[52,22.4]],[[58,12.6],[62,7],[63,7],[60,12.6],[58,12.6]],[[0,3.5],[0,93.1],[64,93.1],[64,0],[63,0],[63,92.4],[1,92.4],[1,3.5],[0,3.5]]],s=0;s<l.length;s++)for(var u=0;u<l[s].length;u++)l[s][u][0]/=10.5,l[s][u][1]/=-14,l[s][u][0]+=i[0],l[s][u][1]+=i[1];e.exports=a},function(e,t,r){"use strict";function a(e){n.each(e.regions,function(e){var t=o[e.name];if(t){var r=e.center;r[0]+=t[0]/10.5,r[1]+=-t[1]/14}})}var n=r(0),o={"南海诸岛":[32,80],"广东":[0,-10],"香港":[10,5],"澳门":[-10,10],"天津":[5,5]};e.exports=a},function(e,t,r){"use strict";function a(e,t){return t=t||[0,0],o.map([0,1],function(r){var a=t[r],n=e[r]/2,o=[],i=[];return o[r]=a-n,i[r]=a+n,o[1-r]=i[1-r]=t[1-r],Math.abs(this.dataToPoint(o)[r]-this.dataToPoint(i)[r])},this)}function n(e){var t=e.getBoundingRect();return{coordSys:{type:"geo",x:t.x,y:t.y,width:t.width,height:t.height},api:{coord:o.bind(e.dataToPoint,e),size:o.bind(a,e)}}}var o=r(0);e.exports=n},function(e,t,r){"use strict";function a(e,t){return t.type||(t.data?"category":"value")}var n=r(0),o=r(24),i=r(114),l=r(167),s=r(4),u=r(111),h=o.extend({type:"baseParallelAxis",axis:null,activeIntervals:[],getAreaSelectStyle:function(){return i([["fill","color"],["lineWidth","borderWidth"],["stroke","borderColor"],["width","width"],["opacity","opacity"]])(this.getModel("areaSelectStyle"))},setActiveIntervals:function(e){var t=this.activeIntervals=n.clone(e);if(t)for(var r=t.length-1;r>=0;r--)s.asc(t[r])},getActiveState:function(e){var t=this.activeIntervals;if(!t.length)return"normal";if(null==e)return"inactive";for(var r=0,a=t.length;r<a;r++)if(t[r][0]<=e&&e<=t[r][1])return"active";return"inactive"}}),c={type:"value",dim:null,areaSelectStyle:{width:20,borderWidth:1,borderColor:"rgba(160,197,232)",color:"rgba(160,197,232)",opacity:.3},realtime:!0,z:10};n.merge(h.prototype,u),l("parallel",h,a,c);var d=h;e.exports=d},function(e,t,r){"use strict";function a(e,t,r){this._axesMap=l.createHashMap(),this._axesLayout={},this.dimensions=e.dimensions,this._rect,this._model=e,this._init(e,t,r)}function n(e,t){return v(y(e,t[0]),t[1])}function o(e,t){var r=t.layoutLength/(t.axisCount-1);return{position:r*e,axisNameAvailableWidth:r,axisLabelShow:!0}}function i(e,t){var r,a,n=t.layoutLength,o=t.axisExpandWidth,i=t.axisCount,l=t.axisCollapseWidth,s=t.winInnerIndices,u=l,h=!1;return e<s[0]?(r=e*l,a=l):e<=s[1]?(r=t.axisExpandWindow0Pos+e*o-t.axisExpandWindow[0],u=o,h=!0):(r=n-(i-1-e)*l,a=l),{position:r,axisNameAvailableWidth:u,axisLabelShow:h,nameTruncateMaxWidth:a}}var l=r(0),s=r(40),u=r(11),h=r(37),c=r(941),d=r(3),m=r(4),p=r(134),f=l.each,v=Math.min,y=Math.max,g=Math.floor,_=Math.ceil,T=m.round,x=Math.PI;a.prototype={type:"parallel",constructor:a,_init:function(e,t,r){var a=e.dimensions,n=e.parallelAxisIndex;f(a,function(e,r){var a=n[r],o=t.getComponent("parallelAxis",a),i=this._axesMap.set(e,new c(e,h.createScaleByModel(o),[0,0],o.get("type"),a)),l="category"===i.type;i.onBand=l&&o.get("boundaryGap"),i.inverse=o.get("inverse"),o.axis=i,i.model=o,i.coordinateSystem=o.coordinateSystem=this},this)},update:function(e,t){this._updateAxesFromSeries(this._model,e)},containPoint:function(e){var t=this._makeLayoutInfo(),r=t.axisBase,a=t.layoutBase,n=t.pixelDimIndex,o=e[1-n],i=e[n];return o>=r&&o<=r+t.axisLength&&i>=a&&i<=a+t.layoutLength},getModel:function(){return this._model},_updateAxesFromSeries:function(e,t){t.eachSeries(function(r){if(e.contains(r,t)){var a=r.getData();f(this.dimensions,function(e){var t=this._axesMap.get(e);t.scale.unionExtentFromData(a,e),h.niceScaleExtent(t.scale,t.model)},this)}},this)},resize:function(e,t){this._rect=u.getLayoutRect(e.getBoxLayoutParams(),{width:t.getWidth(),height:t.getHeight()}),this._layoutAxes()},getRect:function(){return this._rect},_makeLayoutInfo:function(){var e,t=this._model,r=this._rect,a=["x","y"],o=["width","height"],i=t.get("layout"),l="horizontal"===i?0:1,s=r[o[l]],u=[0,s],h=this.dimensions.length,c=n(t.get("axisExpandWidth"),u),d=n(t.get("axisExpandCount")||0,[0,h]),m=t.get("axisExpandable")&&h>3&&h>d&&d>1&&c>0&&s>0,p=t.get("axisExpandWindow");p?(e=n(p[1]-p[0],u),p[1]=p[0]+e):(e=n(c*(d-1),u),p=[c*(t.get("axisExpandCenter")||g(h/2))-e/2],p[1]=p[0]+e);var f=(s-e)/(h-d);f<3&&(f=0);var v=[g(T(p[0]/c,1))+1,_(T(p[1]/c,1))-1],y=f/c*p[0];return{layout:i,pixelDimIndex:l,layoutBase:r[a[l]],layoutLength:s,axisBase:r[a[1-l]],axisLength:r[o[1-l]],axisExpandable:m,axisExpandWidth:c,axisCollapseWidth:f,axisExpandWindow:p,axisCount:h,winInnerIndices:v,axisExpandWindow0Pos:y}},_layoutAxes:function(){var e=this._rect,t=this._axesMap,r=this.dimensions,a=this._makeLayoutInfo(),n=a.layout;t.each(function(e){var t=[0,a.axisLength],r=e.inverse?1:0;e.setExtent(t[r],t[1-r])}),f(r,function(r,l){var u=(a.axisExpandable?i:o)(l,a),h={horizontal:{x:u.position,y:a.axisLength},vertical:{x:0,y:u.position}},c={horizontal:x/2,vertical:0},d=[h[n].x+e.x,h[n].y+e.y],m=c[n],p=s.create();s.rotate(p,p,m),s.translate(p,p,d),this._axesLayout[r]={position:d,rotation:m,transform:p,axisNameAvailableWidth:u.axisNameAvailableWidth,axisLabelShow:u.axisLabelShow,nameTruncateMaxWidth:u.nameTruncateMaxWidth,tickDirection:1,labelDirection:1,labelInterval:t.get(r).getLabelInterval()}},this)},getAxis:function(e){return this._axesMap.get(e)},dataToPoint:function(e,t){return this.axisCoordToPoint(this._axesMap.get(t).dataToCoord(e),t)},eachActiveState:function(e,t,r){for(var a=this.dimensions,n=this._axesMap,o=this.hasAxisBrushed(),i=0,l=e.count();i<l;i++){var s,u=e.getValues(a,i);if(o){s="active";for(var h=0,c=a.length;h<c;h++){var d=a[h];if("inactive"===n.get(d).model.getActiveState(u[h],h)){s="inactive";break}}}else s="normal";t.call(r,s,i)}},hasAxisBrushed:function(){for(var e=this.dimensions,t=this._axesMap,r=!1,a=0,n=e.length;a<n;a++)"normal"!==t.get(e[a]).model.getActiveState()&&(r=!0);return r},axisCoordToPoint:function(e,t){var r=this._axesLayout[t];return d.applyTransform([e,0],r.transform)},getAxisLayout:function(e){return l.clone(this._axesLayout[e])},getSlidedAxisExpandWindow:function(e){var t=this._makeLayoutInfo(),r=t.pixelDimIndex,a=t.axisExpandWindow.slice(),n=a[1]-a[0],o=[0,t.axisExpandWidth*(t.axisCount-1)];if(!this.containPoint(e))return{behavior:"none",axisExpandWindow:a};var i,l=e[r]-t.layoutBase-t.axisExpandWindow0Pos,s="slide",u=t.axisCollapseWidth,h=this._model.get("axisExpandSlideTriggerArea"),c=null!=h[0];if(u)c&&u&&l<n*h[0]?(s="jump",i=l-n*h[2]):c&&u&&l>n*(1-h[0])?(s="jump",i=l-n*(1-h[2])):(i=l-n*h[1])>=0&&(i=l-n*(1-h[1]))<=0&&(i=0),i*=t.axisExpandWidth/u,i?p(i,a,o,"all"):s="none";else{var n=a[1]-a[0];a=[y(0,o[1]*l/n-n/2)],a[1]=v(o[1],a[0]+n),a[0]=a[1]-n}return{axisExpandWindow:a,behavior:s}}};var w=a;e.exports=w},function(e,t,r){"use strict";var a=r(0),n=r(71),o=function(e,t,r,a,o){n.call(this,e,t,r),this.type=a||"value",this.axisIndex=o};o.prototype={constructor:o,model:null,isHorizontal:function(){return"horizontal"!==this.coordinateSystem.getModel().get("layout")}},a.inherits(o,n);var i=o;e.exports=i},function(e,t,r){"use strict";var a=r(0),n=r(24);r(939);var o=n.extend({type:"parallel",dependencies:["parallelAxis"],coordinateSystem:null,dimensions:null,parallelAxisIndex:null,layoutMode:"box",defaultOption:{zlevel:0,z:0,left:80,top:60,right:80,bottom:60,layout:"horizontal",axisExpandable:!1,axisExpandCenter:null,axisExpandCount:0,axisExpandWidth:50,axisExpandRate:17,axisExpandDebounce:50,axisExpandSlideTriggerArea:[-.15,.05,.4],axisExpandTriggerOn:"click",parallelAxisDefault:null},init:function(){n.prototype.init.apply(this,arguments),this.mergeOption({})},mergeOption:function(e){var t=this.option;e&&a.merge(t,e,!0),this._initDimensions()},contains:function(e,t){var r=e.get("parallelIndex");return null!=r&&t.getComponent("parallel",r)===this},setAxisExpand:function(e){a.each(["axisExpandable","axisExpandCenter","axisExpandCount","axisExpandWidth","axisExpandWindow"],function(t){e.hasOwnProperty(t)&&(this.option[t]=e[t])},this)},_initDimensions:function(){var e=this.dimensions=[],t=this.parallelAxisIndex=[],r=a.filter(this.dependentModels.parallelAxis,function(e){return(e.get("parallelIndex")||0)===this.componentIndex},this);a.each(r,function(r){e.push("dim"+r.get("dim")),t.push(r.componentIndex)})}});e.exports=o},function(e,t,r){"use strict";function a(e){n(e),o(e)}function n(e){if(!e.parallel){var t=!1;i.each(e.series,function(e){e&&"parallel"===e.type&&(t=!0)}),t&&(e.parallel=[{}])}}function o(e){var t=l.normalizeToArray(e.parallelAxis);i.each(t,function(t){if(i.isObject(t)){var r=t.parallelIndex||0,a=l.normalizeToArray(e.parallel)[r];a&&a.parallelAxisDefault&&i.merge(t,a.parallelAxisDefault,!1)}})}var i=r(0),l=r(10);e.exports=a},function(e,t,r){"use strict";function a(e,t){t=t||[0,360],o.call(this,"angle",e,t),this.type="category"}var n=r(0),o=r(71);a.prototype={constructor:a,pointToData:function(e,t){return this.polar.pointToData(e,t)["radius"===this.dim?0:1]},dataToAngle:o.prototype.dataToCoord,angleToData:o.prototype.coordToData},n.inherits(a,o);var i=a;e.exports=i},function(e,t,r){"use strict";function a(e,t){return t.type||(t.data?"category":"value")}var n=r(0),o=r(24),i=r(167),l=r(111),s=o.extend({type:"polarAxis",axis:null,getCoordSysModel:function(){return this.ecModel.queryComponents({mainType:"polar",index:this.option.polarIndex,id:this.option.polarId})[0]}});n.merge(s.prototype,l);var u={angle:{startAngle:90,clockwise:!0,splitNumber:12,axisLabel:{rotate:!1}},radius:{splitNumber:5}};i("angle",s,a,u.angle),i("radius",s,a,u.radius)},function(e,t,r){"use strict";var a=r(948),n=r(944),o=function(e){this.name=e||"",this.cx=0,this.cy=0,this._radiusAxis=new a,this._angleAxis=new n,this._radiusAxis.polar=this._angleAxis.polar=this};o.prototype={type:"polar",axisPointerEnabled:!0,constructor:o,dimensions:["radius","angle"],model:null,containPoint:function(e){var t=this.pointToCoord(e);return this._radiusAxis.contain(t[0])&&this._angleAxis.contain(t[1])},containData:function(e){return this._radiusAxis.containData(e[0])&&this._angleAxis.containData(e[1])},getAxis:function(e){return this["_"+e+"Axis"]},getAxes:function(){return[this._radiusAxis,this._angleAxis]},getAxesByScale:function(e){var t=[],r=this._angleAxis,a=this._radiusAxis;return r.scale.type===e&&t.push(r),a.scale.type===e&&t.push(a),t},getAngleAxis:function(){return this._angleAxis},getRadiusAxis:function(){return this._radiusAxis},getOtherAxis:function(e){var t=this._angleAxis;return e===t?this._radiusAxis:t},getBaseAxis:function(){return this.getAxesByScale("ordinal")[0]||this.getAxesByScale("time")[0]||this.getAngleAxis()},getTooltipAxes:function(e){var t=null!=e&&"auto"!==e?this.getAxis(e):this.getBaseAxis();return{baseAxes:[t],otherAxes:[this.getOtherAxis(t)]}},dataToPoint:function(e,t){return this.coordToPoint([this._radiusAxis.dataToRadius(e[0],t),this._angleAxis.dataToAngle(e[1],t)])},pointToData:function(e,t){var r=this.pointToCoord(e);return[this._radiusAxis.radiusToData(r[0],t),this._angleAxis.angleToData(r[1],t)]},pointToCoord:function(e){var t=e[0]-this.cx,r=e[1]-this.cy,a=this.getAngleAxis(),n=a.getExtent(),o=Math.min(n[0],n[1]),i=Math.max(n[0],n[1]);a.inverse?o=i-360:i=o+360;var l=Math.sqrt(t*t+r*r);t/=l,r/=l;for(var s=Math.atan2(-r,t)/Math.PI*180,u=s<o?1:-1;s<o||s>i;)s+=360*u;return[l,s]},coordToPoint:function(e){var t=e[0],r=e[1]/180*Math.PI;return[Math.cos(r)*t+this.cx,-Math.sin(r)*t+this.cy]}};var i=o;e.exports=i},function(e,t,r){"use strict";var a=r(2);r(945);var n=a.extendComponentModel({type:"polar",dependencies:["polarAxis","angleAxis"],coordinateSystem:null,findAxisModel:function(e){var t;return this.ecModel.eachComponent(e,function(e){e.getCoordSysModel()===this&&(t=e)},this),t},defaultOption:{zlevel:0,z:0,center:["50%","50%"],radius:"80%"}});e.exports=n},function(e,t,r){"use strict";function a(e,t){o.call(this,"radius",e,t),this.type="category"}var n=r(0),o=r(71);a.prototype={constructor:a,pointToData:function(e,t){return this.polar.pointToData(e,t)["radius"===this.dim?0:1]},dataToRadius:o.prototype.dataToCoord,radiusToData:o.prototype.coordToData},n.inherits(a,o);var i=a;e.exports=i},function(e,t,r){"use strict";function a(e,t){return o.map(["Radius","Angle"],function(r,a){var n=this["get"+r+"Axis"](),o=t[a],i=e[a]/2,l="dataTo"+r,s="category"===n.type?n.getBandWidth():Math.abs(n[l](o-i)-n[l](o+i));return"Angle"===r&&(s=s*Math.PI/180),s},this)}function n(e){var t=e.getRadiusAxis(),r=e.getAngleAxis(),n=t.getExtent();return n[0]>n[1]&&n.reverse(),{coordSys:{type:"polar",cx:e.cx,cy:e.cy,r:n[1],r0:n[0]},api:{coord:o.bind(function(a){var n=t.dataToRadius(a[0]),o=r.dataToAngle(a[1]),i=e.coordToPoint([n,o]);return i.push(n,o*Math.PI/180),i}),size:o.bind(a,e)}}}var o=r(0);e.exports=n},function(e,t,r){"use strict";function a(e,t,r){o.call(this,e,t,r),this.type="value",this.angle=0,this.name="",this.model}var n=r(0),o=r(71);n.inherits(a,o);var i=a;e.exports=i},function(e,t,r){"use strict";function a(e,t,r){this._model=e,this.dimensions=[],this._indicatorAxes=n.map(e.getIndicatorModels(),function(e,t){var r="indicator_"+t,a=new o(r,new i);return a.name=e.get("name"),a.model=e,e.axis=a,this.dimensions.push(r),a},this),this.resize(e,r),this.cx,this.cy,this.r,this.startAngle}var n=r(0),o=r(950),i=r(170),l=r(4),s=r(37),u=s.getScaleExtent,h=s.niceScaleExtent,c=r(53);a.prototype.getIndicatorAxes=function(){return this._indicatorAxes},a.prototype.dataToPoint=function(e,t){var r=this._indicatorAxes[t];return this.coordToPoint(r.dataToCoord(e),t)},a.prototype.coordToPoint=function(e,t){var r=this._indicatorAxes[t],a=r.angle;return[this.cx+e*Math.cos(a),this.cy-e*Math.sin(a)]},a.prototype.pointToData=function(e){var t=e[0]-this.cx,r=e[1]-this.cy,a=Math.sqrt(t*t+r*r);t/=a,r/=a;for(var n,o=Math.atan2(-r,t),i=1/0,l=-1,s=0;s<this._indicatorAxes.length;s++){var u=this._indicatorAxes[s],h=Math.abs(o-u.angle);h<i&&(n=u,l=s,i=h)}return[l,+(n&&n.coodToData(a))]},a.prototype.resize=function(e,t){var r=e.get("center"),a=t.getWidth(),o=t.getHeight(),i=Math.min(a,o)/2;this.cx=l.parsePercent(r[0],a),this.cy=l.parsePercent(r[1],o),this.startAngle=e.get("startAngle")*Math.PI/180,this.r=l.parsePercent(e.get("radius"),i),n.each(this._indicatorAxes,function(e,t){e.setExtent(0,this.r);var r=this.startAngle+t*Math.PI*2/this._indicatorAxes.length;r=Math.atan2(Math.sin(r),Math.cos(r)),e.angle=r},this)},a.prototype.update=function(e,t){function r(e){var t=Math.pow(10,Math.floor(Math.log(e)/Math.LN10)),r=e/t;return 2===r?r=5:r*=2,r*t}var a=this._indicatorAxes,o=this._model;n.each(a,function(e){e.scale.setExtent(1/0,-1/0)}),e.eachSeriesByType("radar",function(t,r){if("radar"===t.get("coordinateSystem")&&e.getComponent("radar",t.get("radarIndex"))===o){var i=t.getData();n.each(a,function(e){e.scale.unionExtentFromData(i,e.dim)})}},this);var i=o.get("splitNumber");n.each(a,function(e,t){var a=u(e.scale,e.model);h(e.scale,e.model);var n=e.model,o=e.scale,s=n.getMin(),c=n.getMax(),d=o.getInterval();if(null!=s&&null!=c)o.setExtent(+s,+c),o.setInterval((c-s)/i);else if(null!=s){var m;do{m=s+d*i,o.setExtent(+s,m),o.setInterval(d),d=r(d)}while(m<a[1]&&isFinite(m)&&isFinite(a[1]))}else if(null!=c){var p;do{p=c-d*i,o.setExtent(p,+c),o.setInterval(d),d=r(d)}while(p>a[0]&&isFinite(p)&&isFinite(a[0]))}else{var f=o.getTicks().length-1;f>i&&(d=r(d));var v=Math.round((a[0]+a[1])/2/d)*d,y=Math.round(i/2);o.setExtent(l.round(v-y*d),l.round(v+(i-y)*d)),o.setInterval(d)}})},a.dimensions=[],a.create=function(e,t){var r=[];return e.eachComponent("radar",function(n){var o=new a(n,e,t);r.push(o),n.coordinateSystem=o}),e.eachSeriesByType("radar",function(e){"radar"===e.get("coordinateSystem")&&(e.coordinateSystem=r[e.get("radarIndex")||0])}),r},c.register("radar",a);var d=a;e.exports=d},function(e,t,r){"use strict";function a(e,t){return o.defaults({show:t},e)}var n=r(2),o=r(0),i=r(368),l=r(20),s=r(111),u=i.valueAxis,h=n.extendComponentModel({type:"radar",optionUpdated:function(){var e=this.get("boundaryGap"),t=this.get("splitNumber"),r=this.get("scale"),a=this.get("axisLine"),n=this.get("axisTick"),i=this.get("axisLabel"),u=this.get("name"),h=this.get("name.show"),c=this.get("name.formatter"),d=this.get("nameGap"),m=this.get("triggerEvent"),p=o.map(this.get("indicator")||[],function(p){null!=p.max&&p.max>0&&!p.min?p.min=0:null!=p.min&&p.min<0&&!p.max&&(p.max=0);var f=u;if(null!=p.color&&(f=o.defaults({color:p.color},u)),p=o.merge(o.clone(p),{boundaryGap:e,splitNumber:t,scale:r,axisLine:a,axisTick:n,axisLabel:i,name:p.text,nameLocation:"end",nameGap:d,nameTextStyle:f,triggerEvent:m},!1),h||(p.name=""),"string"==typeof c){var v=p.name;p.name=c.replace("{value}",null!=v?v:"")}else"function"==typeof c&&(p.name=c(p.name,p));var y=o.extend(new l(p,null,this.ecModel),s);return y.mainType="radar",y.componentIndex=this.componentIndex,y},this);this.getIndicatorModels=function(){return p}},defaultOption:{zlevel:0,z:0,center:["50%","50%"],radius:"75%",startAngle:90,name:{show:!0},boundaryGap:[0,0],splitNumber:5,nameGap:15,scale:!1,shape:"polygon",axisLine:o.merge({lineStyle:{color:"#bbb"}},u.axisLine),axisLabel:a(u.axisLabel,!1),axisTick:a(u.axisTick,!1),splitLine:a(u.splitLine,!0),splitArea:a(u.splitArea,!0),indicator:[]}}),c=h;e.exports=c},function(e,t,r){"use strict";function a(e,t){return t.type||(t.data?"category":"value")}var n=r(0),o=r(24),i=r(167),l=r(111),s=o.extend({type:"singleAxis",layoutMode:"box",axis:null,coordinateSystem:null,getCoordSysModel:function(){return this}}),u={left:"5%",top:"5%",right:"5%",bottom:"5%",type:"value",position:"bottom",orient:"horizontal",axisLine:{show:!0,lineStyle:{width:2,type:"solid"}},tooltip:{show:!0},axisTick:{show:!0,length:6,lineStyle:{width:2}},axisLabel:{show:!0,interval:"auto"},splitLine:{show:!0,lineStyle:{type:"dashed",opacity:.2}}};n.merge(s.prototype,l),i("single",s,a,u);var h=s;e.exports=h},function(e,t,r){"use strict";function a(e,t,r){this.dimension="single",this.dimensions=["single"],this._axis=null,this._rect,this._init(e,t,r),this.model=e}var n=r(955),o=r(37),i=r(11),l=i.getLayoutRect;a.prototype={type:"singleAxis",axisPointerEnabled:!0,constructor:a,_init:function(e,t,r){var a=this.dimension,i=new n(a,o.createScaleByModel(e),[0,0],e.get("type"),e.get("position")),l="category"===i.type;i.onBand=l&&e.get("boundaryGap"),i.inverse=e.get("inverse"),i.orient=e.get("orient"),e.axis=i,i.model=e,i.coordinateSystem=this,this._axis=i},update:function(e,t){e.eachSeries(function(e){if(e.coordinateSystem===this){var t=e.getData(),r=this.dimension;this._axis.scale.unionExtentFromData(t,e.coordDimToDataDim(r)),o.niceScaleExtent(this._axis.scale,this._axis.model)}},this)},resize:function(e,t){this._rect=l({left:e.get("left"),top:e.get("top"),right:e.get("right"),bottom:e.get("bottom"),width:e.get("width"),height:e.get("height")},{width:t.getWidth(),height:t.getHeight()}),this._adjustAxis()},getRect:function(){return this._rect},_adjustAxis:function(){var e=this._rect,t=this._axis,r=t.isHorizontal(),a=r?[0,e.width]:[0,e.height],n=t.reverse?1:0;t.setExtent(a[n],a[1-n]),this._updateAxisTransform(t,r?e.x:e.y)},_updateAxisTransform:function(e,t){var r=e.getExtent(),a=r[0]+r[1],n=e.isHorizontal();e.toGlobalCoord=n?function(e){return e+t}:function(e){return a-e+t},e.toLocalCoord=n?function(e){return e-t}:function(e){return a-e+t}},getAxis:function(){return this._axis},getBaseAxis:function(){return this._axis},getAxes:function(){return[this._axis]},getTooltipAxes:function(){return{baseAxes:[this.getAxis()]}},containPoint:function(e){var t=this.getRect(),r=this.getAxis();return"horizontal"===r.orient?r.contain(r.toLocalCoord(e[0]))&&e[1]>=t.y&&e[1]<=t.y+t.height:r.contain(r.toLocalCoord(e[1]))&&e[0]>=t.y&&e[0]<=t.y+t.height},pointToData:function(e){var t=this.getAxis();return[t.coordToData(t.toLocalCoord(e["horizontal"===t.orient?0:1]))]},dataToPoint:function(e){var t=this.getAxis(),r=this.getRect(),a=[],n="horizontal"===t.orient?0:1;return e instanceof Array&&(e=e[0]),a[n]=t.toGlobalCoord(t.dataToCoord(+e)),a[1-n]=0===n?r.y+r.height/2:r.x+r.width/2,a}};var s=a;e.exports=s},function(e,t,r){"use strict";var a=r(0),n=r(71),o=function(e,t,r,a,o){n.call(this,e,t,r),this.type=a||"value",this.position=o||"bottom",this.orient=null,this._labelInterval=null};o.prototype={constructor:o,model:null,isHorizontal:function(){var e=this.position;return"top"===e||"bottom"===e},pointToData:function(e,t){return this.coordinateSystem.pointToData(e,t)[0]},toGlobalCoord:null,toLocalCoord:null},a.inherits(o,n);var i=o;e.exports=i},function(e,t,r){"use strict";function a(e,t){var r=this.getAxis(),a=t instanceof Array?t[0]:t,n=(e instanceof Array?e[0]:e)/2;return"category"===r.type?r.getBandWidth():Math.abs(r.dataToCoord(a-n)-r.dataToCoord(a+n))}function n(e){var t=e.getRect();return{coordSys:{type:"singleAxis",x:t.x,y:t.y,width:t.width,height:t.height},api:{coord:o.bind(e.dataToPoint,e),size:o.bind(a,e)}}}var o=r(0);e.exports=n},function(e,t,r){"use strict";function a(e,t){var r=[];return e.eachComponent("singleAxis",function(a,o){var i=new n(a,e,t);i.name="single_"+o,i.resize(a,t),a.coordinateSystem=i,r.push(i)}),e.eachSeries(function(t){if("singleAxis"===t.get("coordinateSystem")){var r=e.queryComponents({mainType:"singleAxis",index:t.get("singleAxisIndex"),id:t.get("singleAxisId")})[0];t.coordinateSystem=r&&r.coordinateSystem}}),r}var n=r(954);r(53).register("single",{create:a,dimensions:n.prototype.dimensions})},function(e,t,r){"use strict";function a(e){return"_EC_"+e}function n(e,t){this.id=null==e?"":e,this.inEdges=[],this.outEdges=[],this.edges=[],this.hostGraph,this.dataIndex=null==t?-1:t}function o(e,t,r){this.node1=e,this.node2=t,this.dataIndex=null==r?-1:r}var i=r(9),l=(i.__DEV__,r(0)),s=function(e){this._directed=e||!1,this.nodes=[],this.edges=[],this._nodesMap={},this._edgesMap={},this.data,this.edgeData},u=s.prototype;u.type="graph",u.isDirected=function(){return this._directed},u.addNode=function(e,t){e=e||""+t;var r=this._nodesMap;if(!r[a(e)]){var o=new n(e,t);return o.hostGraph=this,this.nodes.push(o),r[a(e)]=o,o}},u.getNodeByIndex=function(e){var t=this.data.getRawIndex(e);return this.nodes[t]},u.getNodeById=function(e){return this._nodesMap[a(e)]},u.addEdge=function(e,t,r){var i=this._nodesMap,l=this._edgesMap;if("number"==typeof e&&(e=this.nodes[e]),"number"==typeof t&&(t=this.nodes[t]),e instanceof n||(e=i[a(e)]),t instanceof n||(t=i[a(t)]),e&&t){var s=e.id+"-"+t.id;if(!l[s]){var u=new o(e,t,r);return u.hostGraph=this,this._directed&&(e.outEdges.push(u),t.inEdges.push(u)),e.edges.push(u),e!==t&&t.edges.push(u),this.edges.push(u),l[s]=u,u}}},u.getEdgeByIndex=function(e){var t=this.edgeData.getRawIndex(e);return this.edges[t]},u.getEdge=function(e,t){e instanceof n&&(e=e.id),t instanceof n&&(t=t.id);var r=this._edgesMap;return this._directed?r[e+"-"+t]:r[e+"-"+t]||r[t+"-"+e]},u.eachNode=function(e,t){for(var r=this.nodes,a=r.length,n=0;n<a;n++)r[n].dataIndex>=0&&e.call(t,r[n],n)},u.eachEdge=function(e,t){for(var r=this.edges,a=r.length,n=0;n<a;n++)r[n].dataIndex>=0&&r[n].node1.dataIndex>=0&&r[n].node2.dataIndex>=0&&e.call(t,r[n],n)},u.breadthFirstTraverse=function(e,t,r,o){if(t instanceof n||(t=this._nodesMap[a(t)]),t){for(var i="out"===r?"outEdges":"in"===r?"inEdges":"edges",l=0;l<this.nodes.length;l++)this.nodes[l].__visited=!1;if(!e.call(o,t,null))for(var s=[t];s.length;)for(var u=s.shift(),h=u[i],l=0;l<h.length;l++){var c=h[l],d=c.node1===u?c.node2:c.node1;if(!d.__visited){if(e.call(o,d,u))return;s.push(d),d.__visited=!0}}}},u.update=function(){for(var e=this.data,t=this.edgeData,r=this.nodes,a=this.edges,n=0,o=r.length;n<o;n++)r[n].dataIndex=-1;for(var n=0,o=e.count();n<o;n++)r[e.getRawIndex(n)].dataIndex=n;t.filterSelf(function(e){var r=a[t.getRawIndex(e)];return r.node1.dataIndex>=0&&r.node2.dataIndex>=0});for(var n=0,o=a.length;n<o;n++)a[n].dataIndex=-1;for(var n=0,o=t.count();n<o;n++)a[t.getRawIndex(n)].dataIndex=n},u.clone=function(){for(var e=new s(this._directed),t=this.nodes,r=this.edges,a=0;a<t.length;a++)e.addNode(t[a].id,t[a].dataIndex);for(var a=0;a<r.length;a++){var n=r[a];e.addEdge(n.node1.id,n.node2.id,n.dataIndex)}return e},n.prototype={constructor:n,degree:function(){return this.edges.length},inDegree:function(){return this.inEdges.length},outDegree:function(){return this.outEdges.length},getModel:function(e){if(!(this.dataIndex<0))return this.hostGraph.data.getItemModel(this.dataIndex).getModel(e)}},o.prototype.getModel=function(e){if(!(this.dataIndex<0))return this.hostGraph.edgeData.getItemModel(this.dataIndex).getModel(e)};var h=function(e,t){return{getValue:function(r){var a=this[e][t];return a.get(a.getDimension(r||"value"),this.dataIndex)},setVisual:function(r,a){this.dataIndex>=0&&this[e][t].setItemVisual(this.dataIndex,r,a)},getVisual:function(r,a){return this[e][t].getItemVisual(this.dataIndex,r,a)},setLayout:function(r,a){this.dataIndex>=0&&this[e][t].setItemLayout(this.dataIndex,r,a)},getLayout:function(){return this[e][t].getItemLayout(this.dataIndex)},getGraphicEl:function(){return this[e][t].getItemGraphicEl(this.dataIndex)},getRawIndex:function(){return this[e][t].getRawIndex(this.dataIndex)}}};l.mixin(n,h("hostGraph","data")),l.mixin(o,h("hostGraph","edgeData")),s.Node=n,s.Edge=o;var c=s;e.exports=c},function(e,t,r){"use strict";function a(e){var t=e.get("data");return l(t,e,e.ecModel)}function n(e,t){var r=t;t instanceof h||(r=new h(t),i.mixin(r,u));var a=s.createScaleByModel(r);return a.setExtent(e[0],e[1]),s.niceScaleExtent(a,r),a}function o(e){i.mixin(e,u)}var i=r(0),l=r(69),s=r(37),u=r(111),h=r(20),c=r(45);t.completeDimensions=c;var d=r(38);t.createSymbol=d.createSymbol,t.createList=a,t.createScale=n,t.mixinAxisModelCommonMethods=o},function(e,t,r){"use strict";function a(e){return e.get("stack")||"__ec_stack_"+e.seriesIndex}function n(e){return e.dim}function o(e,t,r){var o=r.getWidth(),s=r.getHeight(),h={},c={},d=i(l.filter(t.getSeriesByType(e),function(e){return!t.isSeriesFiltered(e)&&e.coordinateSystem&&"polar"===e.coordinateSystem.type}));t.eachSeriesByType(e,function(e){if("polar"===e.coordinateSystem.type){var t=e.getData(),r=e.coordinateSystem,i=r.getAngleAxis(),l=r.getBaseAxis(),m=a(e),p=d[n(l)][m],f=p.offset,v=p.width,y=r.getOtherAxis(l),g=e.get("center")||["50%","50%"],_=u(g[0],o),T=u(g[1],s),x=e.get("barMinHeight")||0,w=e.get("barMinAngle")||0,N=y.getExtent()[0],b=y.model.get("max"),L=y.model.get("min"),S=[e.coordDimToDataDim("radius")[0],e.coordDimToDataDim("angle")[0]],k=t.mapArray(S,function(e,t){return r.dataToPoint([e,t])},!0);h[m]=h[m]||[],c[m]=c[m]||[],t.each(e.coordDimToDataDim(y.dim)[0],function(e,a){if(!isNaN(e)){h[m][a]||(h[m][a]={p:N,n:N},c[m][a]={p:N,n:N});var n,o,l,s,u=e>=0?"p":"n",d=r.pointToCoord(k[a]),p=c[m][a][u];if("radius"===y.dim)n=p,o=d[0],l=(-d[1]+f)*Math.PI/180,s=l+v*Math.PI/180,Math.abs(o)<x&&(o=n+(o<0?-1:1)*x),c[m][a][u]=o;else{n=d[0]+f,o=n+v,null!=b&&(e=Math.min(e,b)),null!=L&&(e=Math.max(e,L));var g=i.dataToAngle(e);Math.abs(g-p)<w&&(g=p-(e<0?-1:1)*w),l=-p*Math.PI/180,s=-g*Math.PI/180;var S=i.getExtent(),D=g;D===S[0]&&e>0?D=S[1]:D===S[1]&&e<0&&(D=S[0]),c[m][a][u]=D}t.setItemLayout(a,{cx:_,cy:T,r0:n,r:o,startAngle:l,endAngle:s})}},!0)}},this)}function i(e,t){var r={};l.each(e,function(e,t){var o=e.getData(),i=e.coordinateSystem,l=i.getBaseAxis(),s=l.getExtent(),h="category"===l.type?l.getBandWidth():Math.abs(s[1]-s[0])/o.count(),c=r[n(l)]||{bandWidth:h,remainedWidth:h,autoWidthCount:0,categoryGap:"20%",gap:"30%",stacks:{}},d=c.stacks;r[n(l)]=c;var m=a(e);d[m]||c.autoWidthCount++,d[m]=d[m]||{width:0,maxWidth:0};var p=u(e.get("barWidth"),h),f=u(e.get("barMaxWidth"),h),v=e.get("barGap"),y=e.get("barCategoryGap");p&&!d[m].width&&(p=Math.min(c.remainedWidth,p),d[m].width=p,c.remainedWidth-=p),f&&(d[m].maxWidth=f),null!=v&&(c.gap=v),null!=y&&(c.categoryGap=y)});var o={};return l.each(r,function(e,t){o[t]={};var r=e.stacks,a=e.bandWidth,n=u(e.categoryGap,a),i=u(e.gap,1),s=e.remainedWidth,h=e.autoWidthCount,c=(s-n)/(h+(h-1)*i);c=Math.max(c,0),l.each(r,function(e,t){var r=e.maxWidth;r&&r<c&&(r=Math.min(r,s),e.width&&(r=Math.min(r,e.width)),s-=r,e.width=r,h--)}),c=(s-n)/(h+(h-1)*i),c=Math.max(c,0);var d,m=0;l.each(r,function(e,t){e.width||(e.width=c),d=e,m+=e.width*(1+i)}),d&&(m-=d.width*i);var p=-m/2;l.each(r,function(e,r){o[t][r]=o[t][r]||{offset:p,width:e.width},p+=e.width*(1+i)})}),o}var l=r(0),s=r(4),u=s.parsePercent,h=o;e.exports=h},function(e,t,r){"use strict";function a(e,t){t=t||{},n.defaults(t,{text:"loading",color:"#c23531",textColor:"#000",maskColor:"rgba(255, 255, 255, 0.8)",zlevel:0});var r=new o.Rect({style:{fill:t.maskColor},zlevel:t.zlevel,z:1e4}),a=new o.Arc({shape:{startAngle:-i/2,endAngle:-i/2+.1,r:10},style:{stroke:t.color,lineCap:"round",lineWidth:5},zlevel:t.zlevel,z:10001}),l=new o.Rect({style:{fill:"none",text:t.text,textPosition:"right",textDistance:10,textFill:t.textColor},zlevel:t.zlevel,z:10001});a.animateShape(!0).when(1e3,{endAngle:3*i/2}).start("circularInOut"),a.animateShape(!0).when(1e3,{startAngle:3*i/2}).delay(300).start("circularInOut");var s=new o.Group;return s.add(a),s.add(l),s.add(r),s.resize=function(){var t=e.getWidth()/2,n=e.getHeight()/2;a.setShape({cx:t,cy:n});var o=a.shape.r;l.setShape({x:t-o,y:n-o,width:2*o,height:2*o}),r.setShape({x:0,y:0,width:e.getWidth(),height:e.getHeight()})},s.resize(),s}var n=r(0),o=r(3),i=Math.PI;e.exports=a},function(e,t,r){"use strict";function a(e,t){c.each(t,function(t,r){p.hasClass(r)||("object"===(void 0===t?"undefined":u(t))?e[r]=e[r]?c.merge(e[r],t,!1):c.clone(t):null==e[r]&&(e[r]=t))})}function n(e){e=e,this.option={},this.option[N]=1,this._componentsMap=c.createHashMap({series:[]}),this._seriesIndices=null,a(e,this._theme.option),c.merge(e,f,!1),this.mergeOption(e)}function o(e,t){c.isArray(t)||(t=t?[t]:[]);var r={};return y(t,function(t){r[t]=(e.get(t)||[]).slice()}),r}function i(e,t,r){return t.type?t.type:r?r.subType:p.determineSubType(e,t)}function l(e){return _(e,function(e){return e.componentIndex})||[]}function s(e,t){return t.hasOwnProperty("subType")?g(e,function(e){return e.subType===t.subType}):e}var u="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},h=r(9),c=(h.__DEV__,r(0)),d=r(10),m=r(20),p=r(24),f=r(964),v=r(376),y=c.each,g=c.filter,_=c.map,T=c.isArray,x=c.indexOf,w=c.isObject,N="\0_ec_inner",b=m.extend({constructor:b,init:function(e,t,r,a){r=r||{},this.option=null,this._theme=new m(r),this._optionManager=a},setOption:function(e,t){c.assert(!(N in e),"please use chart.getOption()"),this._optionManager.setOption(e,t),this.resetOption(null)},resetOption:function(e){var t=!1,r=this._optionManager;if(!e||"recreate"===e){var a=r.mountOption("recreate"===e);this.option&&"recreate"!==e?(this.restoreData(),this.mergeOption(a)):n.call(this,a),t=!0}if("timeline"!==e&&"media"!==e||this.restoreData(),!e||"recreate"===e||"timeline"===e){var o=r.getTimelineOption(this);o&&(this.mergeOption(o),t=!0)}if(!e||"recreate"===e||"media"===e){var i=r.getMediaOption(this,this._api);i.length&&y(i,function(e){this.mergeOption(e,t=!0)},this)}return t},mergeOption:function(e){function t(t,n){var s=d.normalizeToArray(e[t]),u=d.mappingToExists(a.get(t),s);d.makeIdAndName(u),y(u,function(e,r){var a=e.option;w(a)&&(e.keyInfo.mainType=t,e.keyInfo.subType=i(t,a,e.exist))});var h=o(a,n);r[t]=[],a.set(t,[]),y(u,function(e,n){var o=e.exist,i=e.option;if(c.assert(w(i)||o,"Empty component definition"),i){var l=p.getClass(t,e.keyInfo.subType,!0);if(o&&o instanceof l)o.name=e.keyInfo.name,o.mergeOption(i,this),o.optionUpdated(i,!1);else{var s=c.extend({dependentModels:h,componentIndex:n},e.keyInfo);o=new l(i,this,this,s),c.extend(o,s),o.init(i,this,this,s),o.optionUpdated(null,!0)}}else o.mergeOption({},this),o.optionUpdated({},!1);a.get(t)[n]=o,r[t][n]=o.option},this),"series"===t&&(this._seriesIndices=l(a.get("series")))}var r=this.option,a=this._componentsMap,n=[];y(e,function(e,t){null!=e&&(p.hasClass(t)?n.push(t):r[t]=null==r[t]?c.clone(e):c.merge(r[t],e,!0))}),p.topologicalTravel(n,p.getAllClassMainTypes(),t,this),this._seriesIndices=this._seriesIndices||[]},getOption:function(){var e=c.clone(this.option);return y(e,function(t,r){if(p.hasClass(r)){for(var t=d.normalizeToArray(t),a=t.length-1;a>=0;a--)d.isIdInner(t[a])&&t.splice(a,1);e[r]=t}}),delete e[N],e},getTheme:function(){return this._theme},getComponent:function(e,t){var r=this._componentsMap.get(e);if(r)return r[t||0]},queryComponents:function(e){var t=e.mainType;if(!t)return[];var r=e.index,a=e.id,n=e.name,o=this._componentsMap.get(t);if(!o||!o.length)return[];var i;if(null!=r)T(r)||(r=[r]),i=g(_(r,function(e){return o[e]}),function(e){return!!e});else if(null!=a){var l=T(a);i=g(o,function(e){return l&&x(a,e.id)>=0||!l&&e.id===a})}else if(null!=n){var u=T(n);i=g(o,function(e){return u&&x(n,e.name)>=0||!u&&e.name===n})}else i=o.slice();return s(i,e)},findComponents:function(e){var t=e.query,r=e.mainType,a=function(e){var t=r+"Index",a=r+"Id",n=r+"Name";return!e||null==e[t]&&null==e[a]&&null==e[n]?null:{mainType:r,index:e[t],id:e[a],name:e[n]}}(t),n=a?this.queryComponents(a):this._componentsMap.get(r);return function(t){return e.filter?g(t,e.filter):t}(s(n,e))},eachComponent:function(e,t,r){var a=this._componentsMap;if("function"==typeof e)r=t,t=e,a.each(function(e,a){y(e,function(e,n){t.call(r,a,e,n)})});else if(c.isString(e))y(a.get(e),t,r);else if(w(e)){var n=this.findComponents(e);y(n,t,r)}},getSeriesByName:function(e){var t=this._componentsMap.get("series");return g(t,function(t){return t.name===e})},getSeriesByIndex:function(e){return this._componentsMap.get("series")[e]},getSeriesByType:function(e){var t=this._componentsMap.get("series");return g(t,function(t){return t.subType===e})},getSeries:function(){return this._componentsMap.get("series").slice()},eachSeries:function(e,t){y(this._seriesIndices,function(r){var a=this._componentsMap.get("series")[r];e.call(t,a,r)},this)},eachRawSeries:function(e,t){y(this._componentsMap.get("series"),e,t)},eachSeriesByType:function(e,t,r){y(this._seriesIndices,function(a){var n=this._componentsMap.get("series")[a];n.subType===e&&t.call(r,n,a)},this)},eachRawSeriesByType:function(e,t,r){return y(this.getSeriesByType(e),t,r)},isSeriesFiltered:function(e){return c.indexOf(this._seriesIndices,e.componentIndex)<0},getCurrentSeriesIndices:function(){return(this._seriesIndices||[]).slice()},filterSeries:function(e,t){var r=g(this._componentsMap.get("series"),e,t);this._seriesIndices=l(r)},restoreData:function(){var e=this._componentsMap;this._seriesIndices=l(e.get("series"));var t=[];e.each(function(e,r){t.push(r)}),p.topologicalTravel(t,p.getAllClassMainTypes(),function(t,r){y(e.get(t),function(e){e.restoreData()})})}});c.mixin(b,v);var L=b;e.exports=L},function(e,t,r){"use strict";function a(e){this._api=e,this._timelineOptions=[],this._mediaList=[],this._mediaDefault,this._currentMediaIndices=[],this._optionBackup,this._newBaseOption}function n(e,t,r){var a,n,o=[],i=[],l=e.timeline;if(e.baseOption&&(n=e.baseOption),(l||e.options)&&(n=n||{},o=(e.options||[]).slice()),e.media){n=n||{};var s=e.media;d(s,function(e){e&&e.option&&(e.query?i.push(e):a||(a=e))})}return n||(n=e),n.timeline||(n.timeline=l),d([n].concat(o).concat(u.map(i,function(e){return e.option})),function(e){d(t,function(t){t(e,r)})}),{baseOption:n,timelineOptions:o,mediaDefault:a,mediaList:i}}function o(e,t,r){var a={width:t,height:r,aspectratio:t/r},n=!0;return u.each(e,function(e,t){var r=t.match(v);if(r&&r[1]&&r[2]){var o=r[1],l=r[2].toLowerCase();i(a[l],e,o)||(n=!1)}}),n}function i(e,t,r){return"min"===r?e>=t:"max"===r?e<=t:e===t}function l(e,t){return e.join(",")===t.join(",")}function s(e,t){t=t||{},d(t,function(t,r){if(null!=t){var a=e[r];if(c.hasClass(r)){t=h.normalizeToArray(t),a=h.normalizeToArray(a);var n=h.mappingToExists(a,t);e[r]=p(n,function(e){return e.option&&e.exist?f(e.exist,e.option,!0):e.exist||e.option})}else e[r]=f(a,t,!0)}})}var u=r(0),h=r(10),c=r(24),d=u.each,m=u.clone,p=u.map,f=u.merge,v=/^(min|max)?(.+)$/;a.prototype={constructor:a,setOption:function(e,t){e=m(e,!0);var r=this._optionBackup,a=n.call(this,e,t,!r);this._newBaseOption=a.baseOption,r?(s(r.baseOption,a.baseOption),a.timelineOptions.length&&(r.timelineOptions=a.timelineOptions),a.mediaList.length&&(r.mediaList=a.mediaList),a.mediaDefault&&(r.mediaDefault=a.mediaDefault)):this._optionBackup=a},mountOption:function(e){var t=this._optionBackup;return this._timelineOptions=p(t.timelineOptions,m),this._mediaList=p(t.mediaList,m),this._mediaDefault=m(t.mediaDefault),this._currentMediaIndices=[],m(e?t.baseOption:this._newBaseOption)},getTimelineOption:function(e){var t,r=this._timelineOptions;if(r.length){var a=e.getComponent("timeline");a&&(t=m(r[a.getCurrentIndex()],!0))}return t},getMediaOption:function(e){var t=this._api.getWidth(),r=this._api.getHeight(),a=this._mediaList,n=this._mediaDefault,i=[],s=[];if(!a.length&&!n)return s;for(var u=0,h=a.length;u<h;u++)o(a[u].query,t,r)&&i.push(u);return!i.length&&n&&(i=[-1]),i.length&&!l(i,this._currentMediaIndices)&&(s=p(i,function(e){return m(-1===e?n.option:a[e].option)})),this._currentMediaIndices=i,s}};var y=a;e.exports=y},function(e,t,r){"use strict";var a="";"undefined"!=typeof navigator&&(a=navigator.platform||"");var n={color:["#c23531","#2f4554","#61a0a8","#d48265","#91c7ae","#749f83","#ca8622","#bda29a","#6e7074","#546570","#c4ccd3"],textStyle:{fontFamily:a.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},blendMode:null,animation:"auto",animationDuration:1e3,animationDurationUpdate:300,animationEasing:"exponentialOut",animationEasingUpdate:"cubicOut",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3,useUTC:!1};e.exports=n},function(e,t,r){"use strict";var a=r(114),n=a([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]]),o={getAreaStyle:function(e,t){return n(this,e,t)}};e.exports=o},function(e,t,r){"use strict";var a={getBoxLayoutParams:function(){return{left:this.get("left"),top:this.get("top"),right:this.get("right"),bottom:this.get("bottom"),width:this.get("width"),height:this.get("height")}}};e.exports=a},function(e,t,r){"use strict";var a=r(114),n=a([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"],["textPosition"],["textAlign"]]),o={getItemStyle:function(e,t){var r=n(this,e,t),a=this.getBorderLineDash();return a&&(r.lineDash=a),r},getBorderLineDash:function(){var e=this.get("borderType");return"solid"===e||null==e?null:"dashed"===e?[5,5]:[1,1]}};e.exports=o},function(e,t,r){"use strict";var a=r(114),n=a([["lineWidth","width"],["stroke","color"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]),o={getLineStyle:function(e){var t=n(this,e),r=this.getLineDash(t.lineWidth);return r&&(t.lineDash=r),t},getLineDash:function(e){null==e&&(e=1);var t=this.get("type"),r=Math.max(e,2),a=4*e;return"solid"===t||null==t?null:"dashed"===t?[a,a]:[r,r]}};e.exports=o},function(e,t,r){"use strict";var a=r(54),n=r(3),o=["textStyle","color"],i={getTextColor:function(e){var t=this.ecModel;return this.getShallow("color")||(!e&&t?t.get(o):null)},getFont:function(){return n.getFont({fontStyle:this.getShallow("fontStyle"),fontWeight:this.getShallow("fontWeight"),fontSize:this.getShallow("fontSize"),fontFamily:this.getShallow("fontFamily")},this.ecModel)},getTextRect:function(e){return a.getBoundingRect(e,this.getFont(),this.getShallow("align"),this.getShallow("verticalAlign")||this.getShallow("baseline"),this.getShallow("padding"),this.getShallow("rich"),this.getShallow("truncateText"))}};e.exports=i},function(e,t,r){"use strict";function a(e,t){t=t.split(",");for(var r=e,a=0;a<t.length&&null!=(r=r&&r[t[a]]);a++);return r}function n(e,t,r,a){t=t.split(",");for(var n,o=e,i=0;i<t.length-1;i++)n=t[i],null==o[n]&&(o[n]={}),o=o[n];(a||null==o[t[i]])&&(o[t[i]]=r)}function o(e){s(p,function(t){t[0]in e&&!(t[1]in e)&&(e[t[1]]=e[t[0]])})}function i(e,t){c(e,t),e.series=m(e.series),s(e.series,function(e){if(h(e)){var t=e.type;if("pie"!==t&&"gauge"!==t||null!=e.clockWise&&(e.clockwise=e.clockWise),"gauge"===t){var r=a(e,"pointer.color");null!=r&&n(e,"itemStyle.normal.color",r)}for(var i=0;i<v.length;i++)if(v[i]===e.type){o(e);break}}}),e.dataRange&&(e.visualMap=e.dataRange),s(f,function(t){var r=e[t];r&&(u(r)||(r=[r]),s(r,function(e){o(e)}))})}var l=r(0),s=l.each,u=l.isArray,h=l.isObject,c=r(971),d=r(10),m=d.normalizeToArray,p=[["x","left"],["y","top"],["x2","right"],["y2","bottom"]],f=["grid","geo","parallel","legend","toolbox","title","visualMap","dataZoom","timeline"],v=["bar","boxplot","candlestick","chord","effectScatter","funnel","gauge","lines","graph","heatmap","line","map","parallel","pie","radar","sankey","scatter","treemap"];e.exports=i},function(e,t,r){"use strict";function a(e){var t=e&&e.itemStyle;if(t)for(var r=0,a=p.length;r<a;r++){var n=p[r],o=t.normal,i=t.emphasis;o&&o[n]&&(e[n]=e[n]||{},e[n].normal?h.merge(e[n].normal,o[n]):e[n].normal=o[n],o[n]=null),i&&i[n]&&(e[n]=e[n]||{},e[n].emphasis?h.merge(e[n].emphasis,i[n]):e[n].emphasis=i[n],i[n]=null)}}function n(e,t){var r=m(e)&&e[t],a=m(r)&&r.textStyle;if(a)for(var n=0,o=c.TEXT_STYLE_OPTIONS.length;n<o;n++){var t=c.TEXT_STYLE_OPTIONS[n];a.hasOwnProperty(t)&&(r[t]=a[t])}}function o(e){m(e)&&(n(e,"normal"),n(e,"emphasis"))}function i(e){if(m(e)){a(e),o(e.label),o(e.upperLabel),o(e.edgeLabel);var t=e.markPoint;a(t),o(t&&t.label);var r=e.markLine;a(e.markLine),o(r&&r.label);var i=e.markArea;o(i&&i.label),n(e,"axisLabel"),n(e,"title"),n(e,"detail");var l=e.data;if(l)for(var s=0;s<l.length;s++)a(l[s]),o(l[s]&&l[s].label);var t=e.markPoint;if(t&&t.data)for(var u=t.data,s=0;s<u.length;s++)a(u[s]),o(u[s]&&u[s].label);var r=e.markLine;if(r&&r.data)for(var c=r.data,s=0;s<c.length;s++)h.isArray(c[s])?(a(c[s][0]),o(c[s][0]&&c[s][0].label),a(c[s][1]),o(c[s][1]&&c[s][1].label)):(a(c[s]),o(c[s]&&c[s].label))}}function l(e){return h.isArray(e)?e:e?[e]:[]}function s(e){return(h.isArray(e)?e[0]:e)||{}}function u(e,t){d(l(e.series),function(e){m(e)&&i(e)});var r=["xAxis","yAxis","radiusAxis","angleAxis","singleAxis","parallelAxis","radar"];t&&r.push("valueAxis","categoryAxis","logAxis","timeAxis"),d(r,function(t){d(l(e[t]),function(e){e&&(n(e,"axisLabel"),n(e.axisPointer,"label"))})}),d(l(e.parallel),function(e){var t=e&&e.parallelAxisDefault;n(t,"axisLabel"),n(t&&t.axisPointer,"label")}),d(l(e.calendar),function(e){n(e,"dayLabel"),n(e,"monthLabel"),n(e,"yearLabel")}),d(l(e.radar),function(e){n(e,"name")}),d(l(e.geo),function(e){m(e)&&(o(e.label),d(l(e.regions),function(e){o(e.label)}))}),o(s(e.timeline).label),n(s(e.axisPointer),"label"),n(s(e.tooltip).axisPointer,"label")}var h=r(0),c=r(10),d=h.each,m=h.isObject,p=["areaStyle","lineStyle","nodeStyle","linkStyle","chordStyle","label","labelLine"];e.exports=u},function(e,t,r){"use strict";function a(e,t,r){t.eachSeriesByType(e,function(e){var t=e.getData(),r=e.get("sampling"),a=e.coordinateSystem;if("cartesian2d"===a.type&&r){var i=a.getBaseAxis(),l=a.getOtherAxis(i),s=i.getExtent(),u=s[1]-s[0],h=Math.round(t.count()/u);if(h>1){var c;"string"==typeof r?c=n[r]:"function"==typeof r&&(c=r),c&&(t=t.downSample(l.dim,1/h,c,o),e.setData(t))}}},this)}var n={average:function(e){for(var t=0,r=0,a=0;a<e.length;a++)isNaN(e[a])||(t+=e[a],r++);return 0===r?NaN:t/r},sum:function(e){for(var t=0,r=0;r<e.length;r++)t+=e[r]||0;return t},max:function(e){for(var t=-1/0,r=0;r<e.length;r++)e[r]>t&&(t=e[r]);return t},min:function(e){for(var t=1/0,r=0;r<e.length;r++)e[r]<t&&(t=e[r]);return t},nearest:function(e){return e[0]}},o=function(e,t){return Math.round(e.length/2)};e.exports=a},function(e,t,r){"use strict";function a(e,t){return c(e,h(t))}var n=r(0),o=r(171),i=r(4),l=r(170),s=o.prototype,u=l.prototype,h=i.getPrecisionSafe,c=i.round,d=Math.floor,m=Math.ceil,p=Math.pow,f=Math.log,v=o.extend({type:"log",base:10,$constructor:function(){o.apply(this,arguments),this._originalScale=new l},getTicks:function(){var e=this._originalScale,t=this._extent,r=e.getExtent();return n.map(u.getTicks.call(this),function(n){var o=i.round(p(this.base,n));return o=n===t[0]&&e.__fixMin?a(o,r[0]):o,o=n===t[1]&&e.__fixMax?a(o,r[1]):o},this)},getLabel:u.getLabel,scale:function(e){return e=s.scale.call(this,e),p(this.base,e)},setExtent:function(e,t){var r=this.base;e=f(e)/f(r),t=f(t)/f(r),u.setExtent.call(this,e,t)},getExtent:function(){var e=this.base,t=s.getExtent.call(this);t[0]=p(e,t[0]),t[1]=p(e,t[1]);var r=this._originalScale,n=r.getExtent();return r.__fixMin&&(t[0]=a(t[0],n[0])),r.__fixMax&&(t[1]=a(t[1],n[1])),t},unionExtent:function(e){this._originalScale.unionExtent(e);var t=this.base;e[0]=f(e[0])/f(t),e[1]=f(e[1])/f(t),s.unionExtent.call(this,e)},unionExtentFromData:function(e,t){this.unionExtent(e.getDataExtent(t,!0,function(e){return e>0}))},niceTicks:function(e){e=e||10;var t=this._extent,r=t[1]-t[0];if(!(r===1/0||r<=0)){var a=i.quantity(r),n=e/r*a;for(n<=.5&&(a*=10);!isNaN(a)&&Math.abs(a)<1&&Math.abs(a)>0;)a*=10;var o=[i.round(m(t[0]/a)*a),i.round(d(t[1]/a)*a)];this._interval=a,this._niceExtent=o}},niceExtent:function(e){u.niceExtent.call(this,e);var t=this._originalScale;t.__fixMin=e.fixMin,t.__fixMax=e.fixMax}});n.each(["contain","normalize"],function(e){v.prototype[e]=function(t){return t=f(t)/f(this.base),s[e].call(this,t)}}),v.create=function(){return new v};var y=v;e.exports=y},function(e,t,r){"use strict";var a=r(0),n=r(171),o=n.prototype,i=n.extend({type:"ordinal",init:function(e,t){this._data=e,this._extent=t||[0,e.length-1]},parse:function(e){return"string"==typeof e?a.indexOf(this._data,e):Math.round(e)},contain:function(e){return e=this.parse(e),o.contain.call(this,e)&&null!=this._data[e]},normalize:function(e){return o.normalize.call(this,this.parse(e))},scale:function(e){return Math.round(o.scale.call(this,e))},getTicks:function(){for(var e=[],t=this._extent,r=t[0];r<=t[1];)e.push(r),r++;return e},getLabel:function(e){return this._data[e]},count:function(){return this._extent[1]-this._extent[0]+1},unionExtentFromData:function(e,t){this.unionExtent(e.getDataExtent(t,!1))},niceTicks:a.noop,niceExtent:a.noop});i.create=function(){return new i};var l=i;e.exports=l},function(e,t,r){"use strict";var a=r(0),n=r(4),o=r(14),i=r(377),l=r(170),s=l.prototype,u=Math.ceil,h=Math.floor,c=function(e,t,r,a){for(;r<a;){var n=r+a>>>1;e[n][1]<t?r=n+1:a=n}return r},d=l.extend({type:"time",getLabel:function(e){var t=this._stepLvl,r=new Date(e);return o.formatTime(t[0],r,this.getSetting("useUTC"))},niceExtent:function(e){var t=this._extent;if(t[0]===t[1]&&(t[0]-=864e5,t[1]+=864e5),t[1]===-1/0&&t[0]===1/0){var r=new Date;t[1]=+new Date(r.getFullYear(),r.getMonth(),r.getDate()),t[0]=t[1]-864e5}this.niceTicks(e.splitNumber,e.minInterval,e.maxInterval);var a=this._interval;e.fixMin||(t[0]=n.round(h(t[0]/a)*a)),e.fixMax||(t[1]=n.round(u(t[1]/a)*a))},niceTicks:function(e,t,r){e=e||10;var a=this._extent,o=a[1]-a[0],l=o/e;null!=t&&l<t&&(l=t),null!=r&&l>r&&(l=r);var s=m.length,d=c(m,l,0,s),p=m[Math.min(d,s-1)],f=p[1];if("year"===p[0]){var v=o/f;f*=n.nice(v/e,!0)}var y=this.getSetting("useUTC")?0:60*new Date(+a[0]||+a[1]).getTimezoneOffset()*1e3,g=[Math.round(u((a[0]-y)/f)*f+y),Math.round(h((a[1]-y)/f)*f+y)];i.fixExtent(g,a),this._stepLvl=p,this._interval=f,this._niceExtent=g},parse:function(e){return+n.parseDate(e)}});a.each(["contain","normalize"],function(e){d.prototype[e]=function(t){return s[e].call(this,this.parse(t))}});var m=[["hh:mm:ss",1e3],["hh:mm:ss",5e3],["hh:mm:ss",1e4],["hh:mm:ss",15e3],["hh:mm:ss",3e4],["hh:mm\nMM-dd",6e4],["hh:mm\nMM-dd",3e5],["hh:mm\nMM-dd",6e5],["hh:mm\nMM-dd",9e5],["hh:mm\nMM-dd",18e5],["hh:mm\nMM-dd",36e5],["hh:mm\nMM-dd",72e5],["hh:mm\nMM-dd",216e5],["hh:mm\nMM-dd",432e5],["MM-dd\nyyyy",864e5],["MM-dd\nyyyy",1728e5],["MM-dd\nyyyy",2592e5],["MM-dd\nyyyy",3456e5],["MM-dd\nyyyy",432e6],["MM-dd\nyyyy",5184e5],["week",6048e5],["MM-dd\nyyyy",864e6],["week",12096e5],["week",18144e5],["month",26784e5],["week",36288e5],["month",53568e5],["week",36288e5],["quarter",8208e6],["month",107136e5],["month",13392e6],["half-year",16416e6],["month",214272e5],["month",26784e6],["year",32832e6]];d.create=function(e){return new d({useUTC:e.ecModel.get("useUTC")})};var p=d;e.exports=p},function(e,t,r){"use strict";function a(){var e,t=[],r={};return{add:function(e,a,o,i,l){return n.isString(i)&&(l=i,i=0),!r[e.id]&&(r[e.id]=1,t.push({el:e,target:a,time:o,delay:i,easing:l}),!0)},done:function(t){return e=t,this},start:function(){function a(){--n||(t.length=0,r={},e&&e())}for(var n=t.length,o=0,i=t.length;o<i;o++){var l=t[o];l.el.animateTo(l.target,l.time,l.delay,l.easing,a)}return this}}}var n=r(0);t.createWrap=a},function(e,t,r){"use strict";function a(e){function t(t){var r=(t.visualColorAccessPath||"itemStyle.normal.color").split("."),a=t.getData(),o=t.get(r)||t.getColorFromPalette(t.get("name"));a.setVisual("color",o),e.isSeriesFiltered(t)||("function"!=typeof o||o instanceof n||a.each(function(e){a.setItemVisual(e,"color",o(t.getDataParams(e)))}),a.each(function(e){var t=a.getItemModel(e),n=t.get(r,!0);null!=n&&a.setItemVisual(e,"color",n)}))}e.eachRawSeries(t)}var n=r(192);e.exports=a},function(e,t,r){"use strict";var a={};e.exports=a},function(e,t,r){"use strict";function a(e,t,r,a,o,i,l,s){if(n(t),!e){var u;if(void 0===t)u=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var h=[r,a,o,i,l,s],c=0;u=new Error(t.replace(/%s/g,function(){return h[c++]})),u.name="Invariant Violation"}throw u.framesToPop=1,u}}var n=function(e){};e.exports=a},function(e,t,r){"use strict";t.__esModule=!0,t.loopAsync=function(e,t,r){var a=0,n=!1,o=!1,i=!1,l=void 0,s=function(){for(var e=arguments.length,t=Array(e),a=0;a<e;a++)t[a]=arguments[a];if(n=!0,o)return void(l=t);r.apply(void 0,t)};!function u(){if(!n&&(i=!0,!o)){for(o=!0;!n&&a<e&&i;)i=!1,t(a++,u,s);if(o=!1,n)return void r.apply(void 0,l);a>=e&&i&&(n=!0,r())}}()}},function(e,t,r){"use strict";t.__esModule=!0,t.replaceLocation=t.pushLocation=t.startListener=t.getCurrentLocation=t.go=t.getUserConfirmation=void 0;var a=r(254);Object.defineProperty(t,"getUserConfirmation",{enumerable:!0,get:function(){return a.getUserConfirmation}}),Object.defineProperty(t,"go",{enumerable:!0,get:function(){return a.go}});var n=r(95),o=(function(e){e&&e.__esModule}(n),r(115)),i=r(174),l=r(380),s=r(73),u=function(){var e=window.location.href,t=e.indexOf("#");return-1===t?"":e.substring(t+1)},h=function(e){return window.location.hash=e},c=function(e){var t=window.location.href.indexOf("#");window.location.replace(window.location.href.slice(0,t>=0?t:0)+"#"+e)},d=t.getCurrentLocation=function(e,t){var r=e.decodePath(u()),a=(0,s.getQueryStringValueFromPath)(r,t),n=void 0;a&&(r=(0,s.stripQueryStringValueFromPath)(r,t),n=(0,l.readState)(a));var i=(0,s.parsePath)(r);return i.state=n,(0,o.createLocation)(i,void 0,a)},m=void 0,p=(t.startListener=function(e,t,r){var a=function(){var a=u(),n=t.encodePath(a);if(a!==n)c(n);else{var o=d(t,r);if(m&&o.key&&m.key===o.key)return;m=o,e(o)}},n=u(),o=t.encodePath(n);return n!==o&&c(o),(0,i.addEventListener)(window,"hashchange",a),function(){return(0,i.removeEventListener)(window,"hashchange",a)}},function(e,t,r,a){var n=e.state,o=e.key,i=t.encodePath((0,s.createPath)(e));void 0!==n&&(i=(0,s.addQueryStringValueToPath)(i,r,o),(0,l.saveState)(o,n)),m=e,a(i)});t.pushLocation=function(e,t,r){return p(e,t,r,function(e){u()!==e&&h(e)})},t.replaceLocation=function(e,t,r){return p(e,t,r,function(e){u()!==e&&c(e)})}},function(e,t,r){"use strict";t.__esModule=!0,t.replaceLocation=t.pushLocation=t.getCurrentLocation=t.go=t.getUserConfirmation=void 0;var a=r(254);Object.defineProperty(t,"getUserConfirmation",{enumerable:!0,get:function(){return a.getUserConfirmation}}),Object.defineProperty(t,"go",{enumerable:!0,get:function(){return a.go}});var n=r(115),o=r(73);t.getCurrentLocation=function(){return(0,n.createLocation)(window.location)},t.pushLocation=function(e){return window.location.href=(0,o.createPath)(e),!1},t.replaceLocation=function(e){return window.location.replace((0,o.createPath)(e)),!1}},function(e,t,r){"use strict";function a(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}function n(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},i=r(28),l=n(i),s=r(255),u=r(254),h=a(u),c=r(982),d=a(c),m=r(174),p=r(256),f=n(p),v=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};s.canUseDOM||(0,l.default)(!1);var t=e.forceRefresh||!(0,m.supportsHistory)(),r=t?d:h,a=r.getUserConfirmation,n=r.getCurrentLocation,i=r.pushLocation,u=r.replaceLocation,c=r.go,p=(0,f.default)(o({getUserConfirmation:a},e,{getCurrentLocation:n,pushLocation:i,replaceLocation:u,go:c})),v=0,y=void 0,g=function(e,t){1==++v&&(y=h.startListener(p.transitionTo));var r=t?p.listenBefore(e):p.listen(e);return function(){r(),0==--v&&y()}};return o({},p,{listenBefore:function(e){return g(e,!0)},listen:function(e){return g(e,!1)}})};t.default=v},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var n=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},o=r(95),i=(a(o),r(28)),l=a(i),s=r(255),u=r(174),h=r(981),c=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}(h),d=r(256),m=a(d),p=function(e){return"/"===e.charAt(0)?e:"/"+e},f={hashbang:{encodePath:function(e){return"!"===e.charAt(0)?e:"!"+e},decodePath:function(e){return"!"===e.charAt(0)?e.substring(1):e}},noslash:{encodePath:function(e){return"/"===e.charAt(0)?e.substring(1):e},decodePath:p},slash:{encodePath:p,decodePath:p}},v=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};s.canUseDOM||(0,l.default)(!1);var t=e.queryKey,r=e.hashType;"string"!=typeof t&&(t="_k"),null==r&&(r="slash"),r in f||(r="slash");var a=f[r],o=c.getUserConfirmation,i=function(){return c.getCurrentLocation(a,t)},h=function(e){return c.pushLocation(e,a,t)},d=function(e){return c.replaceLocation(e,a,t)},p=(0,m.default)(n({getUserConfirmation:o},e,{getCurrentLocation:i,pushLocation:h,replaceLocation:d,go:c.go})),v=0,y=void 0,g=function(e,r){1==++v&&(y=c.startListener(p.transitionTo,a,t));var n=r?p.listenBefore(e):p.listen(e);return function(){n(),0==--v&&y()}},_=function(e){return g(e,!0)},T=function(e){return g(e,!1)};return(0,u.supportsGoWithoutReloadUsingHash)(),n({},p,{listenBefore:_,listen:T,go:function(e){p.go(e)},createHref:function(e){return"#"+a.encodePath(p.createHref(e))}})};t.default=v},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var n=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},o=r(95),i=(a(o),r(28)),l=a(i),s=r(115),u=r(73),h=r(256),c=a(h),d=r(173),m=function(e){return e.filter(function(e){return e.state}).reduce(function(e,t){return e[t.key]=t.state,e},{})},p=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};Array.isArray(e)?e={entries:e}:"string"==typeof e&&(e={entries:[e]});var t=function(){var e=f[v],t=(0,u.createPath)(e),r=void 0,a=void 0;e.key&&(r=e.key,a=_(r));var o=(0,u.parsePath)(t);return(0,s.createLocation)(n({},o,{state:a}),void 0,r)},r=function(e){var t=v+e;return t>=0&&t<f.length},a=function(e){if(e&&r(e)){v+=e;var a=t();h.transitionTo(n({},a,{action:d.POP}))}},o=function(e){v+=1,v<f.length&&f.splice(v),f.push(e),g(e.key,e.state)},i=function(e){f[v]=e,g(e.key,e.state)},h=(0,c.default)(n({},e,{getCurrentLocation:t,pushLocation:o,replaceLocation:i,go:a})),p=e,f=p.entries,v=p.current;"string"==typeof f?f=[f]:Array.isArray(f)||(f=["/"]),f=f.map(function(e){return(0,s.createLocation)(e)}),null==v?v=f.length-1:v>=0&&v<f.length||(0,l.default)(!1);var y=m(f),g=function(e,t){return y[e]=t},_=function(e){return y[e]};return n({},h,{canGo:r})};t.default=p},function(e,t,r){"use strict";var a=[].indexOf;e.exports=function(e,t){if(a)return e.indexOf(t);for(var r=0;r<e.length;++r)if(e[r]===t)return r;return-1}},function(e,t,r){"use strict";t=e.exports=r(989).default,t.default=t},function(e,t,r){"use strict";var a=Function.prototype.bind||function(e){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var t=Array.prototype.slice.call(arguments,1),r=this,a=function(){},n=function(){return r.apply(this instanceof a?this:e,t.concat(Array.prototype.slice.call(arguments)))};return this.prototype&&(a.prototype=this.prototype),n.prototype=new a,n},n=Object.prototype.hasOwnProperty,o=function(){try{return!!Object.defineProperty({},"a",{})}catch(e){return!1}}(),i=(!o&&Object.prototype.__defineGetter__,o?Object.defineProperty:function(e,t,r){"get"in r&&e.__defineGetter__?e.__defineGetter__(t,r.get):(!n.call(e,t)||"value"in r)&&(e[t]=r.value)}),l=Object.create||function(e,t){function r(){}var a,o;r.prototype=e,a=new r;for(o in t)n.call(t,o)&&i(a,o,t[o]);return a};t.bind=a,t.defineProperty=i,t.objCreate=l},function(e,t,r){"use strict";function a(e){var t=l.objCreate(null);return function(){var r=Array.prototype.slice.call(arguments),a=n(r),o=a&&t[a];return o||(o=new(l.bind.apply(e,[null].concat(r))),a&&(t[a]=o)),o}}function n(e){if("undefined"!=typeof JSON){var t,r,a,n=[];for(t=0,r=e.length;t<r;t+=1)a=e[t],a&&"object"===(void 0===a?"undefined":i(a))?n.push(o(a)):n.push(a);return JSON.stringify(n)}}function o(e){var t,r,a,n,o=[],i=[];for(t in e)e.hasOwnProperty(t)&&i.push(t);var l=i.sort();for(r=0,a=l.length;r<a;r+=1)t=l[r],n={},n[t]=e[t],o[r]=n;return o}var i="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},l=r(988);t.default=a},function(e,t,r){"use strict";var a=r(995).default;r(994),t=e.exports=a,t.default=t},function(e,t,r){"use strict";function a(e){return 400*e/146097}var n=Math.round;t.default=function(e,t){e=+e,t=+t;var r=n(t-e),o=n(r/1e3),i=n(o/60),l=n(i/60),s=n(l/24),u=n(s/7),h=a(s),c=n(12*h),d=n(h);return{millisecond:r,second:o,"second-short":o,minute:i,"minute-short":i,hour:l,"hour-short":l,day:s,"day-short":s,week:u,"week-short":u,month:c,"month-short":c,year:d,"year-short":d}}},function(e,t,r){"use strict";t.default={locale:"en",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1],n=Number(r[0])==e,o=n&&r[0].slice(-1),i=n&&r[0].slice(-2);return t?1==o&&11!=i?"one":2==o&&12!=i?"two":3==o&&13!=i?"few":"other":1==e&&a?"one":"other"},fields:{year:{displayName:"year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"in {0} year",other:"in {0} years"},past:{one:"{0} year ago",other:"{0} years ago"}}},"year-short":{displayName:"yr.",relative:{0:"this yr.",1:"next yr.","-1":"last yr."},relativeTime:{future:{one:"in {0} yr.",other:"in {0} yr."},past:{one:"{0} yr. ago",other:"{0} yr. ago"}}},month:{displayName:"month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"in {0} month",other:"in {0} months"},past:{one:"{0} month ago",other:"{0} months ago"}}},"month-short":{displayName:"mo.",relative:{0:"this mo.",1:"next mo.","-1":"last mo."},relativeTime:{future:{one:"in {0} mo.",other:"in {0} mo."},past:{one:"{0} mo. ago",other:"{0} mo. ago"}}},day:{displayName:"day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{one:"in {0} day",other:"in {0} days"},past:{one:"{0} day ago",other:"{0} days ago"}}},"day-short":{displayName:"day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{one:"in {0} day",other:"in {0} days"},past:{one:"{0} day ago",other:"{0} days ago"}}},hour:{displayName:"hour",relative:{0:"this hour"},relativeTime:{future:{one:"in {0} hour",other:"in {0} hours"},past:{one:"{0} hour ago",other:"{0} hours ago"}}},"hour-short":{displayName:"hr.",relative:{0:"this hour"},relativeTime:{future:{one:"in {0} hr.",other:"in {0} hr."},past:{one:"{0} hr. ago",other:"{0} hr. ago"}}},minute:{displayName:"minute",relative:{0:"this minute"},relativeTime:{future:{one:"in {0} minute",other:"in {0} minutes"},past:{one:"{0} minute ago",other:"{0} minutes ago"}}},"minute-short":{displayName:"min.",relative:{0:"this minute"},relativeTime:{future:{one:"in {0} min.",other:"in {0} min."},past:{one:"{0} min. ago",other:"{0} min. ago"}}},second:{displayName:"second",relative:{0:"now"},relativeTime:{future:{one:"in {0} second",other:"in {0} seconds"},past:{one:"{0} second ago",other:"{0} seconds ago"}}},"second-short":{displayName:"sec.",relative:{0:"now"},relativeTime:{future:{one:"in {0} sec.",other:"in {0} sec."},past:{one:"{0} sec. ago",other:"{0} sec. ago"}}}}}},function(e,t,r){"use strict";var a=Object.prototype.hasOwnProperty,n=Object.prototype.toString,o=function(){try{return!!Object.defineProperty({},"a",{})}catch(e){return!1}}(),i=(!o&&Object.prototype.__defineGetter__,o?Object.defineProperty:function(e,t,r){"get"in r&&e.__defineGetter__?e.__defineGetter__(t,r.get):(!a.call(e,t)||"value"in r)&&(e[t]=r.value)}),l=Object.create||function(e,t){function r(){}var n,o;r.prototype=e,n=new r;for(o in t)a.call(t,o)&&i(n,o,t[o]);return n},s=Array.prototype.indexOf||function(e,t){var r=this;if(!r.length)return-1;for(var a=t||0,n=r.length;a<n;a++)if(r[a]===e)return a;return-1},u=Array.isArray||function(e){return"[object Array]"===n.call(e)},h=Date.now||function(){return(new Date).getTime()};t.defineProperty=i,t.objCreate=l,t.arrIndexOf=s,t.isArray=u,t.dateNow=h},function(e,t,r){"use strict";var a=r(383).default;a.__addLocaleData({locale:"af",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"jaar",relative:{0:"hierdie jaar",1:"volgende jaar","-1":"verlede jaar"},relativeTime:{future:{one:"oor {0} jaar",other:"oor {0} jaar"},past:{one:"{0} jaar gelede",other:"{0} jaar gelede"}}},"year-short":{displayName:"j.",relative:{0:"hierdie jaar",1:"volgende jaar","-1":"verlede jaar"},relativeTime:{future:{one:"oor {0} jaar",other:"oor {0} jaar"},past:{one:"{0} jaar gelede",other:"{0} jaar gelede"}}},month:{displayName:"maand",relative:{0:"vandeesmaand",1:"volgende maand","-1":"verlede maand"},relativeTime:{future:{one:"oor {0} minuut",other:"oor {0} minuut"},past:{one:"{0} maand gelede",other:"{0} maande gelede"}}},"month-short":{displayName:"md.",relative:{0:"vandeesmaand",1:"volgende maand","-1":"verlede maand"},relativeTime:{future:{one:"oor {0} md.",other:"oor {0} md."},past:{one:"{0} md. gelede",other:"{0} md. gelede"}}},day:{displayName:"dag",relative:{0:"vandag",1:"môre",2:"oormôre","-2":"eergister","-1":"gister"},relativeTime:{future:{one:"oor {0} minuut",other:"oor {0} minuut"},past:{one:"{0} dag gelede",other:"{0} dae gelede"}}},"day-short":{displayName:"d.",relative:{0:"vandag",1:"môre",2:"oormôre","-2":"eergister","-1":"gister"},relativeTime:{future:{one:"oor {0} dag",other:"oor {0} dae"},past:{one:"{0} dag gelede",other:"{0} dae gelede"}}},hour:{displayName:"uur",relative:{0:"hierdie uur"},relativeTime:{future:{one:"oor {0} uur",other:"oor {0} uur"},past:{one:"{0} uur gelede",other:"{0} uur gelede"}}},"hour-short":{displayName:"u.",relative:{0:"hierdie uur"},relativeTime:{future:{one:"oor {0} uur",other:"oor {0} uur"},past:{one:"{0} uur gelede",other:"{0} uur gelede"}}},minute:{displayName:"minuut",relative:{0:"hierdie minuut"},relativeTime:{future:{one:"oor {0} minuut",other:"oor {0} minuut"},past:{one:"{0} minuut gelede",other:"{0} minute gelede"}}},"minute-short":{displayName:"min.",relative:{0:"hierdie minuut"},relativeTime:{future:{one:"oor {0} min.",other:"oor {0} min."},past:{one:"{0} min. gelede",other:"{0} min. gelede"}}},second:{displayName:"sekonde",relative:{0:"nou"},relativeTime:{future:{one:"oor {0} sekonde",other:"oor {0} sekondes"},past:{one:"{0} sekonde gelede",other:"{0} sekondes gelede"}}},"second-short":{displayName:"sek.",relative:{0:"nou"},relativeTime:{future:{one:"oor {0} sek.",other:"oor {0} sek."},past:{one:"{0} sek. gelede",other:"{0} sek. gelede"}}}}}),a.__addLocaleData({locale:"af-NA",parentLocale:"af"}),a.__addLocaleData({locale:"agq",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"kɨnûm",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"kɨnûm",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"ndzɔŋ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"ndzɔŋ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"utsuʔ",relative:{0:"nɛ",1:"tsʉtsʉ","-1":"ā zūɛɛ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"utsuʔ",relative:{0:"nɛ",1:"tsʉtsʉ","-1":"ā zūɛɛ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"tàm",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"tàm",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"menè",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"menè",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"sɛkɔ̀n",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"sɛkɔ̀n",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ak",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"},fields:{year:{displayName:"Afe",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Afe",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Bosome",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Bosome",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Da",relative:{0:"Ndɛ",1:"Ɔkyena","-1":"Ndeda"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Da",relative:{0:"Ndɛ",1:"Ɔkyena","-1":"Ndeda"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Dɔnhwer",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Dɔnhwer",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Sema",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Sema",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sɛkɛnd",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Sɛkɛnd",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"am",pluralRuleFunction:function(e,t){return t?"other":e>=0&&e<=1?"one":"other"},fields:{year:{displayName:"ዓመት",relative:{0:"በዚህ ዓመት",1:"የሚቀጥለው ዓመት","-1":"ያለፈው ዓመት"},relativeTime:{future:{one:"በ{0} ዓመታት ውስጥ",other:"በ{0} ዓመታት ውስጥ"},past:{one:"ከ{0} ዓመት በፊት",other:"ከ{0} ዓመታት በፊት"}}},"year-short":{displayName:"ዓመት",relative:{0:"በዚህ ዓመት",1:"የሚቀጥለው ዓመት","-1":"ያለፈው ዓመት"},relativeTime:{future:{one:"በ{0} ዓመታት ውስጥ",other:"በ{0} ዓመታት ውስጥ"},past:{one:"ከ{0} ዓመታት በፊት",other:"ከ{0} ዓመታት በፊት"}}},month:{displayName:"ወር",relative:{0:"በዚህ ወር",1:"የሚቀጥለው ወር","-1":"ያለፈው ወር"},relativeTime:{future:{one:"በ{0} ወር ውስጥ",other:"በ{0} ወራት ውስጥ"},past:{one:"ከ{0} ወር በፊት",other:"ከ{0} ወራት በፊት"}}},"month-short":{displayName:"ወር",relative:{0:"በዚህ ወር",1:"የሚቀጥለው ወር","-1":"ያለፈው ወር"},relativeTime:{future:{one:"በ{0} ወራት ውስጥ",other:"በ{0} ወራት ውስጥ"},past:{one:"ከ{0} ወራት በፊት",other:"ከ{0} ወራት በፊት"}}},day:{displayName:"ቀን",relative:{0:"ዛሬ",1:"ነገ",2:"ከነገ ወዲያ","-2":"ከትናንት ወዲያ","-1":"ትናንት"},relativeTime:{future:{one:"በ{0} ቀን ውስጥ",other:"በ{0} ቀናት ውስጥ"},past:{one:"ከ{0} ቀን በፊት",other:"ከ{0} ቀናት በፊት"}}},"day-short":{displayName:"ቀን",relative:{0:"ዛሬ",1:"ነገ",2:"ከነገ ወዲያ","-2":"ከትናንት ወዲያ","-1":"ትላንትና"},relativeTime:{future:{one:"በ{0} ቀን ውስጥ",other:"በ{0} ቀኖች ውስጥ"},past:{one:"ከ {0} ቀን በፊት",other:"ከ{0} ቀኖች በፊት"}}},hour:{displayName:"ሰዓት",relative:{0:"ይህ ሰዓት"},relativeTime:{future:{one:"በ{0} ሰዓት ውስጥ",other:"በ{0} ሰዓቶች ውስጥ"},past:{one:"ከ{0} ሰዓት በፊት",other:"ከ{0} ሰዓቶች በፊት"}}},"hour-short":{displayName:"ሰዓት",relative:{0:"ይህ ሰዓት"},relativeTime:{future:{one:"በ{0} ሰዓት ውስጥ",other:"በ{0} ሰዓቶች ውስጥ"},past:{one:"ከ{0} ሰዓት በፊት",other:"ከ{0} ሰዓቶች በፊት"}}},minute:{displayName:"ደቂቃ",relative:{0:"ይህ ደቂቃ"},relativeTime:{future:{one:"በ{0} ደቂቃ ውስጥ",other:"በ{0} ደቂቃዎች ውስጥ"},past:{one:"ከ{0} ደቂቃ በፊት",other:"ከ{0} ደቂቃዎች በፊት"}}},"minute-short":{displayName:"ደቂቃ",relative:{0:"ይህ ደቂቃ"},relativeTime:{future:{one:"በ{0} ደቂቃ ውስጥ",other:"በ{0} ደቂቃዎች ውስጥ"},past:{one:"ከ{0} ደቂቃ በፊት",other:"ከ{0} ደቂቃዎች በፊት"}}},second:{displayName:"ሰከንድ",relative:{0:"አሁን"},relativeTime:{future:{one:"በ{0} ሰከንድ ውስጥ",other:"በ{0} ሰከንዶች ውስጥ"},past:{one:"ከ{0} ሰከንድ በፊት",other:"ከ{0} ሰከንዶች በፊት"}}},"second-short":{displayName:"ሰከንድ",relative:{0:"አሁን"},relativeTime:{future:{one:"በ{0} ሰከንድ ውስጥ",other:"በ{0} ሰከንዶች ውስጥ"},past:{one:"ከ{0} ሰከንድ በፊት",other:"ከ{0} ሰከንዶች በፊት"}}}}}),a.__addLocaleData({locale:"ar",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e,n=a&&r[0].slice(-2);return t?"other":0==e?"zero":1==e?"one":2==e?"two":n>=3&&n<=10?"few":n>=11&&n<=99?"many":"other"},fields:{year:{displayName:"السنة",relative:{0:"السنة الحالية",1:"السنة القادمة","-1":"السنة الماضية"},relativeTime:{future:{zero:"خلال {0} سنة",one:"خلال سنة واحدة",two:"خلال سنتين",few:"خلال {0} سنوات",many:"خلال {0} سنة",other:"خلال {0} سنة"},past:{zero:"قبل {0} سنة",one:"قبل سنة واحدة",two:"قبل سنتين",few:"قبل {0} سنوات",many:"قبل {0} سنة",other:"قبل {0} سنة"}}},"year-short":{displayName:"السنة",relative:{0:"السنة الحالية",1:"السنة القادمة","-1":"السنة الماضية"},relativeTime:{future:{zero:"خلال {0} سنة",one:"خلال سنة واحدة",two:"خلال سنتين",few:"خلال {0} سنوات",many:"خلال {0} سنة",other:"خلال {0} سنة"},past:{zero:"قبل {0} سنة",one:"قبل سنة واحدة",two:"قبل سنتين",few:"قبل {0} سنوات",many:"قبل {0} سنة",other:"قبل {0} سنة"}}},month:{displayName:"الشهر",relative:{0:"هذا الشهر",1:"الشهر القادم","-1":"الشهر الماضي"},relativeTime:{future:{zero:"خلال {0} شهر",one:"خلال شهر واحد",two:"خلال شهرين",few:"خلال {0} أشهر",many:"خلال {0} شهرًا",other:"خلال {0} شهر"},past:{zero:"قبل {0} شهر",one:"قبل شهر واحد",two:"قبل شهرين",few:"قبل {0} أشهر",many:"قبل {0} شهرًا",other:"قبل {0} شهر"}}},"month-short":{displayName:"الشهر",relative:{0:"هذا الشهر",1:"الشهر القادم","-1":"الشهر الماضي"},relativeTime:{future:{zero:"خلال {0} شهر",one:"خلال شهر واحد",two:"خلال شهرين",few:"خلال {0} أشهر",many:"خلال {0} شهرًا",other:"خلال {0} شهر"},past:{zero:"قبل {0} شهر",one:"قبل شهر واحد",two:"قبل شهرين",few:"خلال {0} أشهر",many:"قبل {0} شهرًا",other:"قبل {0} شهر"}}},day:{displayName:"يوم",relative:{0:"اليوم",1:"غدًا",2:"بعد الغد","-2":"أول أمس","-1":"أمس"},relativeTime:{future:{zero:"خلال {0} يوم",one:"خلال يوم واحد",two:"خلال يومين",few:"خلال {0} أيام",many:"خلال {0} يومًا",other:"خلال {0} يوم"},past:{zero:"قبل {0} يوم",one:"قبل يوم واحد",two:"قبل يومين",few:"قبل {0} أيام",many:"قبل {0} يومًا",other:"قبل {0} يوم"}}},"day-short":{displayName:"يوم",relative:{0:"اليوم",1:"غدًا",2:"بعد الغد","-2":"أول أمس","-1":"أمس"},relativeTime:{future:{zero:"خلال {0} يوم",one:"خلال يوم واحد",two:"خلال يومين",few:"خلال {0} أيام",many:"خلال {0} يومًا",other:"خلال {0} يوم"},past:{zero:"قبل {0} يوم",one:"قبل يوم واحد",two:"قبل يومين",few:"قبل {0} أيام",many:"قبل {0} يومًا",other:"قبل {0} يوم"}}},hour:{displayName:"الساعات",relative:{0:"الساعة الحالية"},relativeTime:{future:{zero:"خلال {0} ساعة",one:"خلال ساعة واحدة",two:"خلال ساعتين",few:"خلال {0} ساعات",many:"خلال {0} ساعة",other:"خلال {0} ساعة"},past:{zero:"قبل {0} ساعة",one:"قبل ساعة واحدة",two:"قبل ساعتين",few:"قبل {0} ساعات",many:"قبل {0} ساعة",other:"قبل {0} ساعة"}}},"hour-short":{displayName:"الساعات",relative:{0:"الساعة الحالية"},relativeTime:{future:{zero:"خلال {0} ساعة",one:"خلال ساعة واحدة",two:"خلال ساعتين",few:"خلال {0} ساعات",many:"خلال {0} ساعة",other:"خلال {0} ساعة"},past:{zero:"قبل {0} ساعة",one:"قبل ساعة واحدة",two:"قبل ساعتين",few:"قبل {0} ساعات",many:"قبل {0} ساعة",other:"قبل {0} ساعة"}}},minute:{displayName:"الدقائق",relative:{0:"هذه الدقيقة"},relativeTime:{future:{zero:"خلال {0} دقيقة",one:"خلال دقيقة واحدة",two:"خلال دقيقتين",few:"خلال {0} دقائق",many:"خلال {0} دقيقة",other:"خلال {0} دقيقة"},past:{zero:"قبل {0} دقيقة",one:"قبل دقيقة واحدة",two:"قبل دقيقتين",few:"قبل {0} دقائق",many:"قبل {0} دقيقة",other:"قبل {0} دقيقة"}}},"minute-short":{displayName:"الدقائق",relative:{0:"هذه الدقيقة"},relativeTime:{future:{zero:"خلال {0} دقيقة",one:"خلال دقيقة واحدة",two:"خلال دقيقتين",few:"خلال {0} دقائق",many:"خلال {0} دقيقة",other:"خلال {0} دقيقة"},past:{zero:"قبل {0} دقيقة",one:"قبل دقيقة واحدة",two:"قبل دقيقتين",few:"قبل {0} دقائق",many:"قبل {0} دقيقة",other:"قبل {0} دقيقة"}}},second:{displayName:"الثواني",relative:{0:"الآن"},relativeTime:{future:{zero:"خلال {0} ثانية",one:"خلال ثانية واحدة",two:"خلال ثانيتين",few:"خلال {0} ثوانٍ",many:"خلال {0} ثانية",other:"خلال {0} ثانية"},past:{zero:"قبل {0} ثانية",one:"قبل ثانية واحدة",two:"قبل ثانيتين",few:"قبل {0} ثوانِ",many:"قبل {0} ثانية",other:"قبل {0} ثانية"}}},"second-short":{displayName:"الثواني",relative:{0:"الآن"},relativeTime:{future:{zero:"خلال {0} ثانية",one:"خلال ثانية واحدة",two:"خلال ثانيتين",few:"خلال {0} ثوانٍ",many:"خلال {0} ثانية",other:"خلال {0} ثانية"},past:{zero:"قبل {0} ثانية",one:"قبل ثانية واحدة",two:"قبل ثانيتين",few:"قبل {0} ثوانٍ",many:"قبل {0} ثانية",other:"قبل {0} ثانية"}}}}}),a.__addLocaleData({locale:"ar-AE",parentLocale:"ar",fields:{year:{displayName:"السنة",relative:{0:"هذه السنة",1:"السنة التالية","-1":"السنة الماضية"},relativeTime:{future:{zero:"خلال {0} سنة",one:"خلال سنة واحدة",two:"خلال سنتين",few:"خلال {0} سنوات",many:"خلال {0} سنة",other:"خلال {0} سنة"},past:{zero:"قبل {0} سنة",one:"قبل سنة واحدة",two:"قبل سنتين",few:"قبل {0} سنوات",many:"قبل {0} سنة",other:"قبل {0} سنة"}}},"year-short":{displayName:"السنة",relative:{0:"هذه السنة",1:"السنة التالية","-1":"السنة الماضية"},relativeTime:{future:{zero:"خلال {0} سنة",one:"خلال سنة واحدة",two:"خلال سنتين",few:"خلال {0} سنوات",many:"خلال {0} سنة",other:"خلال {0} سنة"},past:{zero:"قبل {0} سنة",one:"قبل سنة واحدة",two:"قبل سنتين",few:"قبل {0} سنوات",many:"قبل {0} سنة",other:"قبل {0} سنة"}}},month:{displayName:"الشهر",relative:{0:"هذا الشهر",1:"الشهر القادم","-1":"الشهر الماضي"},relativeTime:{future:{zero:"خلال {0} شهر",one:"خلال شهر واحد",two:"خلال شهرين",few:"خلال {0} أشهر",many:"خلال {0} شهرًا",other:"خلال {0} شهر"},past:{zero:"قبل {0} شهر",one:"قبل شهر واحد",two:"قبل شهرين",few:"قبل {0} أشهر",many:"قبل {0} شهرًا",other:"قبل {0} شهر"}}},"month-short":{displayName:"الشهر",relative:{0:"هذا الشهر",1:"الشهر القادم","-1":"الشهر الماضي"},relativeTime:{future:{zero:"خلال {0} شهر",one:"خلال شهر واحد",two:"خلال شهرين",few:"خلال {0} أشهر",many:"خلال {0} شهرًا",other:"خلال {0} شهر"},past:{zero:"قبل {0} شهر",one:"قبل شهر واحد",two:"قبل شهرين",few:"خلال {0} أشهر",many:"قبل {0} شهرًا",other:"قبل {0} شهر"}}},day:{displayName:"يوم",relative:{0:"اليوم",1:"غدًا",2:"بعد الغد","-2":"أول أمس","-1":"أمس"},relativeTime:{future:{zero:"خلال {0} يوم",one:"خلال يوم واحد",two:"خلال يومين",few:"خلال {0} أيام",many:"خلال {0} يومًا",other:"خلال {0} يوم"},past:{zero:"قبل {0} يوم",one:"قبل يوم واحد",two:"قبل يومين",few:"قبل {0} أيام",many:"قبل {0} يومًا",other:"قبل {0} يوم"}}},"day-short":{displayName:"يوم",relative:{0:"اليوم",1:"غدًا",2:"بعد الغد","-2":"أول أمس","-1":"أمس"},relativeTime:{future:{zero:"خلال {0} يوم",one:"خلال يوم واحد",two:"خلال يومين",few:"خلال {0} أيام",many:"خلال {0} يومًا",other:"خلال {0} يوم"},past:{zero:"قبل {0} يوم",one:"قبل يوم واحد",two:"قبل يومين",few:"قبل {0} أيام",many:"قبل {0} يومًا",other:"قبل {0} يوم"}}},hour:{displayName:"الساعات",relative:{0:"الساعة الحالية"},relativeTime:{future:{zero:"خلال {0} ساعة",one:"خلال ساعة واحدة",two:"خلال ساعتين",few:"خلال {0} ساعات",many:"خلال {0} ساعة",other:"خلال {0} ساعة"},past:{zero:"قبل {0} ساعة",one:"قبل ساعة واحدة",two:"قبل ساعتين",few:"قبل {0} ساعات",many:"قبل {0} ساعة",other:"قبل {0} ساعة"}}},"hour-short":{displayName:"الساعات",relative:{0:"الساعة الحالية"},relativeTime:{future:{zero:"خلال {0} ساعة",one:"خلال ساعة واحدة",two:"خلال ساعتين",few:"خلال {0} ساعات",many:"خلال {0} ساعة",other:"خلال {0} ساعة"},past:{zero:"قبل {0} ساعة",one:"قبل ساعة واحدة",two:"قبل ساعتين",few:"قبل {0} ساعات",many:"قبل {0} ساعة",other:"قبل {0} ساعة"}}},minute:{displayName:"الدقائق",relative:{0:"هذه الدقيقة"},relativeTime:{future:{zero:"خلال {0} دقيقة",one:"خلال دقيقة واحدة",two:"خلال دقيقتين",few:"خلال {0} دقائق",many:"خلال {0} دقيقة",other:"خلال {0} دقيقة"},past:{zero:"قبل {0} دقيقة",one:"قبل دقيقة واحدة",two:"قبل دقيقتين",few:"قبل {0} دقائق",many:"قبل {0} دقيقة",other:"قبل {0} دقيقة"}}},"minute-short":{displayName:"الدقائق",relative:{0:"هذه الدقيقة"},relativeTime:{future:{zero:"خلال {0} دقيقة",one:"خلال دقيقة واحدة",two:"خلال دقيقتين",few:"خلال {0} دقائق",many:"خلال {0} دقيقة",other:"خلال {0} دقيقة"},past:{zero:"قبل {0} دقيقة",one:"قبل دقيقة واحدة",two:"قبل دقيقتين",few:"قبل {0} دقائق",many:"قبل {0} دقيقة",other:"قبل {0} دقيقة"}}},second:{displayName:"الثواني",relative:{0:"الآن"},relativeTime:{future:{zero:"خلال {0} ثانية",one:"خلال ثانية واحدة",two:"خلال ثانيتين",few:"خلال {0} ثوانٍ",many:"خلال {0} ثانية",other:"خلال {0} ثانية"},past:{zero:"قبل {0} ثانية",one:"قبل ثانية واحدة",two:"قبل ثانيتين",few:"قبل {0} ثوانِ",many:"قبل {0} ثانية",other:"قبل {0} ثانية"}}},"second-short":{displayName:"الثواني",relative:{0:"الآن"},relativeTime:{future:{zero:"خلال {0} ثانية",one:"خلال ثانية واحدة",two:"خلال ثانيتين",few:"خلال {0} ثوانٍ",many:"خلال {0} ثانية",other:"خلال {0} ثانية"},past:{zero:"قبل {0} ثانية",one:"قبل ثانية واحدة",two:"قبل ثانيتين",few:"قبل {0} ثوانٍ",many:"قبل {0} ثانية",other:"قبل {0} ثانية"}}}}}),a.__addLocaleData({locale:"ar-BH",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-DJ",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-DZ",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-EG",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-EH",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-ER",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-IL",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-IQ",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-JO",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-KM",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-KW",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-LB",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-LY",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-MA",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-MR",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-OM",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-PS",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-QA",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-SA",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-SD",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-SO",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-SS",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-SY",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-TD",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-TN",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-YE",parentLocale:"ar"}),a.__addLocaleData({locale:"ars",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e,n=a&&r[0].slice(-2);return t?"other":0==e?"zero":1==e?"one":2==e?"two":n>=3&&n<=10?"few":n>=11&&n<=99?"many":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"as",pluralRuleFunction:function(e,t){return t?1==e||5==e||7==e||8==e||9==e||10==e?"one":2==e||3==e?"two":4==e?"few":6==e?"many":"other":e>=0&&e<=1?"one":"other"},fields:{year:{displayName:"বছৰ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"বছৰ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"মাহ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"মাহ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"দিন",relative:{0:"আজি",1:"কাইলৈ",2:"পৰহিলৈ","-2":"পৰহি","-1":"কালি"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"দিন",relative:{0:"আজি",1:"কাইলৈ",2:"পৰহিলৈ","-2":"পৰহি","-1":"কালি"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"ঘণ্টা",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"ঘণ্টা",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"মিনিট",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"মিনিট",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"ছেকেণ্ড",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"ছেকেণ্ড",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"asa",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Mwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Mwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mweji",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Mweji",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Thiku",relative:{0:"Iyoo",1:"Yavo","-1":"Ighuo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Thiku",relative:{0:"Iyoo",1:"Yavo","-1":"Ighuo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Thaa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Thaa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Dakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Dakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Thekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Thekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ast",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"},fields:{year:{displayName:"añu",relative:{0:"esti añu",1:"l’añu viniente","-1":"l’añu pasáu"},relativeTime:{future:{one:"en {0} añu",other:"en {0} años"},past:{one:"hai {0} añu",other:"hai {0} años"}}},"year-short":{displayName:"añu",relative:{0:"esti añu",1:"l’añu vin.","-1":"l’añu pas."},relativeTime:{future:{one:"en {0} añu",other:"en {0} años"},past:{one:"hai {0} añu",other:"hai {0} años"}}},month:{displayName:"mes",relative:{0:"esti mes",1:"el mes viniente","-1":"el mes pasáu"},relativeTime:{future:{one:"en {0} mes",other:"en {0} meses"},past:{one:"hai {0} mes",other:"hai {0} meses"}}},"month-short":{displayName:"mes",relative:{0:"esti mes",1:"mes vin.","-1":"mes pas."},relativeTime:{future:{one:"en {0} mes",other:"en {0} meses"},past:{one:"hai {0} mes",other:"hai {0} meses"}}},day:{displayName:"día",relative:{0:"güei",1:"mañana",2:"pasao mañana","-2":"antayeri","-1":"ayeri"},relativeTime:{future:{one:"en {0} día",other:"en {0} díes"},past:{one:"hai {0} día",other:"hai {0} díes"}}},"day-short":{displayName:"día",relative:{0:"güei",1:"mañana",2:"pasao mañana","-2":"antayeri","-1":"ayeri"},relativeTime:{future:{one:"en {0} día",other:"en {0} díes"},past:{one:"hai {0} día",other:"hai {0} díes"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"en {0} hora",other:"en {0} hores"},past:{one:"hai {0} hora",other:"hai {0} hores"}}},"hour-short":{displayName:"h.",relative:{0:"esta hora"},relativeTime:{future:{one:"en {0} h.",other:"en {0} h."},past:{one:"hai {0} h.",other:"hai {0} h."}}},minute:{displayName:"minutu",relative:{0:"esti minutu"},relativeTime:{future:{one:"en {0} minutu",other:"en {0} minutos"},past:{one:"hai {0} minutu",other:"hai {0} minutos"}}},"minute-short":{displayName:"min.",relative:{0:"esti min."},relativeTime:{future:{one:"en {0} min.",other:"en {0} min."},past:{one:"hai {0} min.",other:"hai {0} min."}}},second:{displayName:"segundu",relative:{0:"agora"},relativeTime:{future:{one:"en {0} segundu",other:"en {0} segundos"},past:{one:"hai {0} segundu",other:"hai {0} segundos"}}},"second-short":{displayName:"s.",relative:{0:"agora"},relativeTime:{future:{one:"en {0} seg.",other:"en {0} seg."},past:{one:"hai {0} seg.",other:"hai {0} seg."}}}}}),a.__addLocaleData({locale:"az",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=a.slice(-1),o=a.slice(-2),i=a.slice(-3);return t?1==n||2==n||5==n||7==n||8==n||20==o||50==o||70==o||80==o?"one":3==n||4==n||100==i||200==i||300==i||400==i||500==i||600==i||700==i||800==i||900==i?"few":0==a||6==n||40==o||60==o||90==o?"many":"other":1==e?"one":"other"},fields:{year:{displayName:"İl",relative:{0:"bu il",1:"gələn il","-1":"keçən il"},relativeTime:{future:{one:"{0} il ərzində",other:"{0} il ərzində"},past:{one:"{0} il öncə",other:"{0} il öncə"}}},"year-short":{displayName:"il",relative:{0:"bu il",1:"gələn il","-1":"keçən il"},relativeTime:{future:{one:"{0} il ərzində",other:"{0} il ərzində"},past:{one:"{0} il öncə",other:"{0} il öncə"}}},month:{displayName:"Ay",relative:{0:"bu ay",1:"gələn ay","-1":"keçən ay"},relativeTime:{future:{one:"{0} ay ərzində",other:"{0} ay ərzində"},past:{one:"{0} ay öncə",other:"{0} ay öncə"}}},"month-short":{displayName:"ay",relative:{0:"bu ay",1:"gələn ay","-1":"keçən ay"},relativeTime:{future:{one:"{0} ay ərzində",other:"{0} ay ərzində"},past:{one:"{0} ay öncə",other:"{0} ay öncə"}}},day:{displayName:"Gün",relative:{0:"bu gün",1:"sabah","-1":"dünən"},relativeTime:{future:{one:"{0} gün ərzində",other:"{0} gün ərzində"},past:{one:"{0} gün öncə",other:"{0} gün öncə"}}},"day-short":{displayName:"Gün",relative:{0:"bu gün",1:"sabah","-1":"dünən"},relativeTime:{future:{one:"{0} gün ərzində",other:"{0} gün ərzində"},past:{one:"{0} gün öncə",other:"{0} gün öncə"}}},hour:{displayName:"Saat",relative:{0:"bu saat"},relativeTime:{future:{one:"{0} saat ərzində",other:"{0} saat ərzində"},past:{one:"{0} saat öncə",other:"{0} saat öncə"}}},"hour-short":{displayName:"saat",relative:{0:"bu saat"},relativeTime:{future:{one:"{0} saat ərzində",other:"{0} saat ərzində"},past:{one:"{0} saat öncə",other:"{0} saat öncə"}}},minute:{displayName:"Dəqiqə",relative:{0:"bu dəqiqə"},relativeTime:{future:{one:"{0} dəqiqə ərzində",other:"{0} dəqiqə ərzində"},past:{one:"{0} dəqiqə öncə",other:"{0} dəqiqə öncə"}}},"minute-short":{displayName:"dəq.",relative:{0:"bu dəqiqə"},relativeTime:{future:{one:"{0} dəqiqə ərzində",other:"{0} dəqiqə ərzində"},past:{one:"{0} dəqiqə öncə",other:"{0} dəqiqə öncə"}}},second:{displayName:"Saniyə",relative:{0:"indi"},relativeTime:{future:{one:"{0} saniyə ərzində",other:"{0} saniyə ərzində"},past:{one:"{0} saniyə öncə",other:"{0} saniyə öncə"}}},"second-short":{displayName:"san.",relative:{0:"indi"},relativeTime:{future:{one:"{0} saniyə ərzində",other:"{0} saniyə ərzində"},past:{one:"{0} saniyə öncə",other:"{0} saniyə öncə"}}}}}),a.__addLocaleData({locale:"az-Arab",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"az-Cyrl",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"az-Latn",parentLocale:"az"}),a.__addLocaleData({locale:"bas",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"ŋwìi",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"ŋwìi",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"soŋ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"soŋ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"kɛl",relative:{0:"lɛ̀n",1:"yàni","-1":"yààni"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"kɛl",relative:{0:"lɛ̀n",1:"yàni","-1":"yààni"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"ŋgɛŋ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"ŋgɛŋ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"ŋget",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"ŋget",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"hìŋgeŋget",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"hìŋgeŋget",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"be",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e,n=a&&r[0].slice(-1),o=a&&r[0].slice(-2);return t?2!=n&&3!=n||12==o||13==o?"other":"few":1==n&&11!=o?"one":n>=2&&n<=4&&(o<12||o>14)?"few":a&&0==n||n>=5&&n<=9||o>=11&&o<=14?"many":"other"},fields:{year:{displayName:"год",relative:{0:"у гэтым годзе",1:"у наступным годзе","-1":"у мінулым годзе"},relativeTime:{future:{one:"праз {0} год",few:"праз {0} гады",many:"праз {0} гадоў",other:"праз {0} года"},past:{one:"{0} год таму",few:"{0} гады таму",many:"{0} гадоў таму",other:"{0} года таму"}}},"year-short":{displayName:"г.",relative:{0:"у гэтым годзе",1:"у наступным годзе","-1":"у мінулым годзе"},relativeTime:{future:{one:"праз {0} г.",few:"праз {0} г.",many:"праз {0} г.",other:"праз {0} г."},past:{one:"{0} г. таму",few:"{0} г. таму",many:"{0} г. таму",other:"{0} г. таму"}}},month:{displayName:"месяц",relative:{0:"у гэтым месяцы",1:"у наступным месяцы","-1":"у мінулым месяцы"},relativeTime:{future:{one:"праз {0} месяц",few:"праз {0} месяцы",many:"праз {0} месяцаў",other:"праз {0} месяца"},past:{one:"{0} месяц таму",few:"{0} месяцы таму",many:"{0} месяцаў таму",other:"{0} месяца таму"}}},"month-short":{displayName:"мес.",relative:{0:"у гэтым месяцы",1:"у наступным месяцы","-1":"у мінулым месяцы"},relativeTime:{future:{one:"праз {0} мес.",few:"праз {0} мес.",many:"праз {0} мес.",other:"праз {0} мес."},past:{one:"{0} мес. таму",few:"{0} мес. таму",many:"{0} мес. таму",other:"{0} мес. таму"}}},day:{displayName:"дзень",relative:{0:"сёння",1:"заўтра",2:"паслязаўтра","-2":"пазаўчора","-1":"учора"},relativeTime:{future:{one:"праз {0} дзень",few:"праз {0} дні",many:"праз {0} дзён",other:"праз {0} дня"},past:{one:"{0} дзень таму",few:"{0} дні таму",many:"{0} дзён таму",other:"{0} дня таму"}}},"day-short":{displayName:"дзень",relative:{0:"сёння",1:"заўтра",2:"паслязаўтра","-2":"пазаўчора","-1":"учора"},relativeTime:{future:{one:"праз {0} дзень",few:"праз {0} дні",many:"праз {0} дзён",other:"праз {0} дня"},past:{one:"{0} дзень таму",few:"{0} дні таму",many:"{0} дзён таму",other:"{0} дня таму"}}},hour:{displayName:"гадзіна",relative:{0:"у гэту гадзіну"},relativeTime:{future:{one:"праз {0} гадзіну",few:"праз {0} гадзіны",many:"праз {0} гадзін",other:"праз {0} гадзіны"},past:{one:"{0} гадзіну таму",few:"{0} гадзіны таму",many:"{0} гадзін таму",other:"{0} гадзіны таму"}}},"hour-short":{displayName:"гадз",relative:{0:"у гэту гадзіну"},relativeTime:{future:{one:"праз {0} гадз",few:"праз {0} гадз",many:"праз {0} гадз",other:"праз {0} гадз"},past:{one:"{0} гадз таму",few:"{0} гадз таму",many:"{0} гадз таму",other:"{0} гадз таму"}}},minute:{displayName:"хвіліна",relative:{0:"у гэту хвіліну"},relativeTime:{future:{one:"праз {0} хвіліну",few:"праз {0} хвіліны",many:"праз {0} хвілін",other:"праз {0} хвіліны"},past:{one:"{0} хвіліну таму",few:"{0} хвіліны таму",many:"{0} хвілін таму",other:"{0} хвіліны таму"}}},"minute-short":{displayName:"хв",relative:{0:"у гэту хвіліну"},relativeTime:{future:{one:"праз {0} хв",few:"праз {0} хв",many:"праз {0} хв",other:"праз {0} хв"},past:{one:"{0} хв таму",few:"{0} хв таму",many:"{0} хв таму",other:"{0} хв таму"}}},second:{displayName:"секунда",relative:{0:"цяпер"},relativeTime:{future:{one:"праз {0} секунду",few:"праз {0} секунды",many:"праз {0} секунд",other:"праз {0} секунды"},past:{one:"{0} секунду таму",few:"{0} секунды таму",many:"{0} секунд таму",other:"{0} секунды таму"}}},"second-short":{displayName:"с",relative:{0:"цяпер"},relativeTime:{future:{one:"праз {0} с",few:"праз {0} с",many:"праз {0} с",other:"праз {0} с"},past:{one:"{0} с таму",few:"{0} с таму",many:"{0} с таму",other:"{0} с таму"}}}}}),a.__addLocaleData({locale:"bem",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Umwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Umwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Umweshi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Umweshi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ubushiku",relative:{0:"Lelo",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Ubushiku",relative:{0:"Lelo",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Insa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Insa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Mineti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Mineti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekondi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Sekondi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"bez",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Mwaha",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Mwaha",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mwedzi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Mwedzi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Sihu",relative:{0:"Neng’u ni",1:"Hilawu","-1":"Igolo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Sihu",relative:{0:"Neng’u ni",1:"Hilawu","-1":"Igolo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Dakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Dakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"bg",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"година",relative:{0:"тази година",1:"следващата година","-1":"миналата година"},relativeTime:{future:{one:"след {0} година",other:"след {0} години"},past:{one:"преди {0} година",other:"преди {0} години"}}},"year-short":{displayName:"г.",relative:{0:"т. г.",1:"следв. г.","-1":"мин. г."},relativeTime:{future:{one:"след {0} г.",other:"след {0} г."},past:{one:"преди {0} г.",other:"преди {0} г."}}},month:{displayName:"месец",relative:{0:"този месец",1:"следващ месец","-1":"предходен месец"},relativeTime:{future:{one:"след {0} месец",other:"след {0} месеца"},past:{one:"преди {0} месец",other:"преди {0} месеца"}}},"month-short":{displayName:"м",relative:{0:"този мес.",1:"следв. мес.","-1":"мин. мес."},relativeTime:{future:{one:"след {0} м.",other:"след {0} м."},past:{one:"преди {0} м.",other:"преди {0} м."}}},day:{displayName:"ден",relative:{0:"днес",1:"утре",2:"вдругиден","-2":"онзи ден","-1":"вчера"},relativeTime:{future:{one:"след {0} ден",other:"след {0} дни"},past:{one:"преди {0} ден",other:"преди {0} дни"}}},"day-short":{displayName:"д",relative:{0:"днес",1:"утре",2:"вдругиден","-2":"онзи ден","-1":"вчера"},relativeTime:{future:{one:"след {0} ден",other:"след {0} дни"},past:{one:"преди {0} ден",other:"преди {0} дни"}}},hour:{displayName:"час",relative:{0:"в този час"},relativeTime:{future:{one:"след {0} час",other:"след {0} часа"},past:{one:"преди {0} час",other:"преди {0} часа"}}},"hour-short":{displayName:"ч",relative:{0:"в този час"},relativeTime:{future:{one:"след {0} ч",other:"след {0} ч"},past:{one:"преди {0} ч",other:"преди {0} ч"}}},minute:{displayName:"минута",relative:{0:"в тази минута"},relativeTime:{future:{one:"след {0} минута",other:"след {0} минути"},past:{one:"преди {0} минута",other:"преди {0} минути"}}},"minute-short":{displayName:"мин",relative:{0:"в тази минута"},relativeTime:{future:{one:"след {0} мин",other:"след {0} мин"},past:{one:"преди {0} мин",other:"преди {0} мин"}}},second:{displayName:"секунда",relative:{0:"сега"},relativeTime:{future:{one:"след {0} секунда",other:"след {0} секунди"},past:{one:"преди {0} секунда",other:"преди {0} секунди"}}},"second-short":{displayName:"с",relative:{0:"сега"},relativeTime:{future:{one:"след {0} сек",other:"след {0} сек"},past:{one:"преди {0} сек",other:"преди {0} сек"}}}}}),a.__addLocaleData({locale:"bh",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"bm",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"san",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"san",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"kalo",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"kalo",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"don",relative:{0:"bi",1:"sini","-1":"kunu"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"don",relative:{0:"bi",1:"sini","-1":"kunu"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"lɛrɛ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"lɛrɛ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"miniti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"miniti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"sekondi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"sekondi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"bm-Nkoo",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"bn",pluralRuleFunction:function(e,t){return t?1==e||5==e||7==e||8==e||9==e||10==e?"one":2==e||3==e?"two":4==e?"few":6==e?"many":"other":e>=0&&e<=1?"one":"other"},fields:{year:{displayName:"বছর",relative:{0:"এই বছর",1:"পরের বছর","-1":"গত বছর"},relativeTime:{future:{one:"{0} বছরে",other:"{0} বছরে"},past:{one:"{0} বছর পূর্বে",other:"{0} বছর পূর্বে"}}},"year-short":{displayName:"বছর",relative:{0:"এই বছর",1:"পরের বছর","-1":"গত বছর"},relativeTime:{future:{one:"{0} বছরে",other:"{0} বছরে"},past:{one:"{0} বছর পূর্বে",other:"{0} বছর পূর্বে"}}},month:{displayName:"মাস",relative:{0:"এই মাস",1:"পরের মাস","-1":"গত মাস"},relativeTime:{future:{one:"{0} মাসে",other:"{0} মাসে"},past:{one:"{0} মাস আগে",other:"{0} মাস আগে"}}},"month-short":{displayName:"মাস",relative:{0:"এই মাস",1:"পরের মাস","-1":"গত মাস"},relativeTime:{future:{one:"{0} মাসে",other:"{0} মাসে"},past:{one:"{0} মাস আগে",other:"{0} মাস আগে"}}},day:{displayName:"দিন",relative:{0:"আজ",1:"আগামীকাল",2:"আগামী পরশু","-2":"গত পরশু","-1":"গতকাল"},relativeTime:{future:{one:"{0} দিনের মধ্যে",other:"{0} দিনের মধ্যে"},past:{one:"{0} দিন আগে",other:"{0} দিন আগে"}}},"day-short":{displayName:"দিন",relative:{0:"আজ",1:"আগামীকাল",2:"আগামী পরশু","-2":"গত পরশু","-1":"গতকাল"},relativeTime:{future:{one:"{0} দিনের মধ্যে",other:"{0} দিনের মধ্যে"},past:{one:"{0} দিন আগে",other:"{0} দিন আগে"}}},hour:{displayName:"ঘন্টা",relative:{0:"এই ঘণ্টায়"},relativeTime:{future:{one:"{0} ঘন্টায়",other:"{0} ঘন্টায়"},past:{one:"{0} ঘন্টা আগে",other:"{0} ঘন্টা আগে"}}},"hour-short":{displayName:"ঘন্টা",relative:{0:"এই ঘণ্টায়"},relativeTime:{future:{one:"{0} ঘন্টায়",other:"{0} ঘন্টায়"},past:{one:"{0} ঘন্টা আগে",other:"{0} ঘন্টা আগে"}}},minute:{displayName:"মিনিট",relative:{0:"এই মিনিট"},relativeTime:{future:{one:"{0} মিনিটে",other:"{0} মিনিটে"},past:{one:"{0} মিনিট আগে",other:"{0} মিনিট পূর্বে"}}},"minute-short":{displayName:"মিনিট",relative:{0:"এই মিনিট"},relativeTime:{future:{one:"{0} মিনিটে",other:"{0} মিনিটে"},past:{one:"{0} মিনিট আগে",other:"{0} মিনিট আগে"}}},second:{displayName:"সেকেন্ড",relative:{0:"এখন"},relativeTime:{future:{one:"{0} সেকেন্ডে",other:"{0} সেকেন্ডে"},past:{one:"{0} সেকেন্ড পূর্বে",other:"{0} সেকেন্ড পূর্বে"}}},"second-short":{displayName:"সেকেন্ড",relative:{0:"এখন"},relativeTime:{future:{one:"{0} সেকেন্ডে",other:"{0} সেকেন্ডে"},past:{one:"{0} সেকেন্ড পূর্বে",other:"{0} সেকেন্ড পূর্বে"}}}}}),a.__addLocaleData({locale:"bn-IN",parentLocale:"bn"}),a.__addLocaleData({locale:"bo",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"ལོ།",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"ལོ།",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"ཟླ་བ་",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"ཟླ་བ་",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"ཉིན།",relative:{0:"དེ་རིང་",1:"སང་ཉིན་",2:"གནངས་ཉིན་","-2":"ཁས་ཉིན་","-1":"ཁས་ས་"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"ཉིན།",relative:{0:"དེ་རིང་",1:"སང་ཉིན་",2:"གནངས་ཉིན་","-2":"ཁས་ཉིན་","-1":"ཁས་ས་"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"ཆུ་ཚོད་",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"ཆུ་ཚོད་",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"སྐར་མ།",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"སྐར་མ།",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"སྐར་ཆ།",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"སྐར་ཆ།",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"bo-IN",parentLocale:"bo"}),a.__addLocaleData({locale:"br",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e,n=a&&r[0].slice(-1),o=a&&r[0].slice(-2),i=a&&r[0].slice(-6);return t?"other":1==n&&11!=o&&71!=o&&91!=o?"one":2==n&&12!=o&&72!=o&&92!=o?"two":(3==n||4==n||9==n)&&(o<10||o>19)&&(o<70||o>79)&&(o<90||o>99)?"few":0!=e&&a&&0==i?"many":"other"},fields:{year:{displayName:"bloaz",relative:{0:"hevlene",1:"ar bloaz a zeu","-1":"warlene"},relativeTime:{future:{one:"a-benn {0} bloaz",two:"a-benn {0} vloaz",few:"a-benn {0} bloaz",many:"a-benn {0} a vloazioù",other:"a-benn {0} vloaz"},past:{one:"{0} bloaz zo",two:"{0} vloaz zo",few:"{0} bloaz zo",many:"{0} a vloazioù zo",other:"{0} vloaz zo"}}},"year-short":{displayName:"bl.",relative:{0:"hevlene",1:"ar bl. a zeu","-1":"warlene"},relativeTime:{future:{one:"a-benn {0} bl.",two:"a-benn {0} bl.",few:"a-benn {0} bl.",many:"a-benn {0} bl.",other:"a-benn {0} bl."},past:{one:"{0} bl. zo",two:"{0} bl. zo",few:"{0} bl. zo",many:"{0} bl. zo",other:"{0} bl. zo"}}},month:{displayName:"miz",relative:{0:"ar miz-mañ",1:"ar miz a zeu","-1":"ar miz diaraok"},relativeTime:{future:{one:"a-benn {0} miz",two:"a-benn {0} viz",few:"a-benn {0} miz",many:"a-benn {0} a vizioù",other:"a-benn {0} miz"},past:{one:"{0} miz zo",two:"{0} viz zo",few:"{0} miz zo",many:"{0} a vizioù zo",other:"{0} miz zo"}}},"month-short":{displayName:"miz",relative:{0:"ar miz-mañ",1:"ar miz a zeu","-1":"ar miz diaraok"},relativeTime:{future:{one:"a-benn {0} miz",two:"a-benn {0} viz",few:"a-benn {0} miz",many:"a-benn {0} a vizioù",other:"a-benn {0} miz"},past:{one:"{0} miz zo",two:"{0} viz zo",few:"{0} miz zo",many:"{0} a vizioù zo",other:"{0} miz zo"}}},day:{displayName:"deiz",relative:{0:"hiziv",1:"warcʼhoazh","-2":"dercʼhent-decʼh","-1":"decʼh"},relativeTime:{future:{one:"a-benn {0} deiz",two:"a-benn {0} zeiz",few:"a-benn {0} deiz",many:"a-benn {0} a zeizioù",other:"a-benn {0} deiz"},past:{one:"{0} deiz zo",two:"{0} zeiz zo",few:"{0} deiz zo",many:"{0} a zeizioù zo",other:"{0} deiz zo"}}},"day-short":{displayName:"d",relative:{0:"hiziv",1:"warcʼhoazh","-2":"dercʼhent-decʼh","-1":"decʼh"},relativeTime:{future:{one:"a-benn {0} d",two:"a-benn {0} d",few:"a-benn {0} d",many:"a-benn {0} d",other:"a-benn {0} d"},past:{one:"{0} d zo",two:"{0} d zo",few:"{0} d zo",many:"{0} d zo",other:"{0} d zo"}}},hour:{displayName:"eur",relative:{0:"this hour"},relativeTime:{future:{one:"a-benn {0} eur",two:"a-benn {0} eur",few:"a-benn {0} eur",many:"a-benn {0} a eurioù",other:"a-benn {0} eur"},past:{one:"{0} eur zo",two:"{0} eur zo",few:"{0} eur zo",many:"{0} a eurioù zo",other:"{0} eur zo"}}},"hour-short":{displayName:"e",relative:{0:"this hour"},relativeTime:{future:{one:"a-benn {0} e",two:"a-benn {0} e",few:"a-benn {0} e",many:"a-benn {0} e",other:"a-benn {0} e"},past:{one:"{0} e zo",two:"{0} e zo",few:"{0} e zo",many:"{0} e zo",other:"{0} e zo"}}},minute:{displayName:"munut",relative:{0:"this minute"},relativeTime:{future:{one:"a-benn {0} munut",two:"a-benn {0} vunut",few:"a-benn {0} munut",many:"a-benn {0} a vunutoù",other:"a-benn {0} munut"},past:{one:"{0} munut zo",two:"{0} vunut zo",few:"{0} munut zo",many:"{0} a vunutoù zo",other:"{0} munut zo"}}},"minute-short":{displayName:"min",relative:{0:"this minute"},relativeTime:{future:{one:"a-benn {0} min",two:"a-benn {0} min",few:"a-benn {0} min",many:"a-benn {0} min",other:"a-benn {0} min"},past:{one:"{0} min zo",two:"{0} min zo",few:"{0} min zo",many:"{0} min zo",other:"{0} min zo"}}},second:{displayName:"eilenn",relative:{0:"bremañ"},relativeTime:{future:{one:"a-benn {0} eilenn",two:"a-benn {0} eilenn",few:"a-benn {0} eilenn",many:"a-benn {0} a eilennoù",other:"a-benn {0} eilenn"},past:{one:"{0} eilenn zo",two:"{0} eilenn zo",few:"{0} eilenn zo",many:"{0} eilenn zo",other:"{0} eilenn zo"}}},"second-short":{displayName:"s",relative:{0:"brem."},relativeTime:{future:{one:"a-benn {0} s",two:"a-benn {0} s",few:"a-benn {0} s",many:"a-benn {0} s",other:"a-benn {0} s"},past:{one:"{0} s zo",two:"{0} s zo",few:"{0} s zo",many:"{0} s zo",other:"{0} s zo"}}}}}),a.__addLocaleData({locale:"brx",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"बोसोर",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"बोसोर",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"दान",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"दान",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"सान",relative:{0:"दिनै",1:"गाबोन","-1":"मैया"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"सान",relative:{0:"दिनै",1:"गाबोन","-1":"मैया"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"रिंगा",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"रिंगा",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"मिनिथ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"मिनिथ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"सेखेन्द",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"सेखेन्द",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"bs",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=a.slice(-2),s=n.slice(-1),u=n.slice(-2);return t?"other":o&&1==i&&11!=l||1==s&&11!=u?"one":o&&i>=2&&i<=4&&(l<12||l>14)||s>=2&&s<=4&&(u<12||u>14)?"few":"other"},fields:{year:{displayName:"godina",relative:{0:"ove godine",1:"sljedeće godine","-1":"prošle godine"},relativeTime:{future:{one:"za {0} godinu",few:"za {0} godine",other:"za {0} godina"},past:{one:"prije {0} godinu",few:"prije {0} godine",other:"prije {0} godina"}}},"year-short":{displayName:"god.",relative:{0:"ove godine",1:"sljedeće godine","-1":"prošle godine"},relativeTime:{future:{one:"za {0} god.",few:"za {0} god.",other:"za {0} god."},past:{one:"prije {0} god.",few:"prije {0} god.",other:"prije {0} god."}}},month:{displayName:"mjesec",relative:{0:"ovaj mjesec",1:"sljedeći mjesec","-1":"prošli mjesec"},relativeTime:{future:{one:"za {0} mjesec",few:"za {0} mjeseca",other:"za {0} mjeseci"},past:{one:"prije {0} mjesec",few:"prije {0} mjeseca",other:"prije {0} mjeseci"}}},"month-short":{displayName:"mj.",relative:{0:"ovaj mjesec",1:"sljedeći mjesec","-1":"prošli mjesec"},relativeTime:{future:{one:"za {0} mj.",few:"za {0} mj.",other:"za {0} mj."},past:{one:"prije {0} mj.",few:"prije {0} mj.",other:"prije {0} mj."}}},day:{displayName:"dan",relative:{0:"danas",1:"sutra",2:"prekosutra","-2":"prekjučer","-1":"jučer"},relativeTime:{future:{one:"za {0} dan",few:"za {0} dana",other:"za {0} dana"},past:{one:"prije {0} dan",few:"prije {0} dana",other:"prije {0} dana"}}},"day-short":{displayName:"dan",relative:{0:"danas",1:"sutra",2:"prekosutra","-2":"prekjučer","-1":"jučer"},relativeTime:{future:{one:"za {0} d.",few:"za {0} d.",other:"za {0} d."},past:{one:"prije {0} d.",few:"prije {0} d.",other:"prije {0} d."}}},hour:{displayName:"sat",relative:{0:"ovaj sat"},relativeTime:{future:{one:"za {0} sat",few:"za {0} sata",other:"za {0} sati"},past:{one:"prije {0} sat",few:"prije {0} sata",other:"prije {0} sati"}}},"hour-short":{displayName:"h",relative:{0:"ovaj sat"},relativeTime:{future:{one:"za {0} sat",few:"za {0} sata",other:"za {0} sati"},past:{one:"prije {0} sat",few:"prije {0} sata",other:"prije {0} sati"}}},minute:{displayName:"minuta",relative:{0:"ova minuta"},relativeTime:{future:{one:"za {0} minutu",few:"za {0} minute",other:"za {0} minuta"},past:{one:"prije {0} minutu",few:"prije {0} minute",other:"prije {0} minuta"}}},"minute-short":{displayName:"min.",relative:{0:"ova minuta"},relativeTime:{future:{one:"za {0} min.",few:"za {0} min.",other:"za {0} min."},past:{one:"prije {0} min.",few:"prije {0} min.",other:"prije {0} min."}}},second:{displayName:"sekunda",relative:{0:"sada"},relativeTime:{future:{one:"za {0} sekundu",few:"za {0} sekunde",other:"za {0} sekundi"},past:{one:"prije {0} sekundu",few:"prije {0} sekunde",other:"prije {0} sekundi"}}},"second-short":{displayName:"sek.",relative:{0:"sada"},relativeTime:{future:{one:"za {0} sek.",few:"za {0} sek.",other:"za {0} sek."},past:{one:"prije {0} sek.",few:"prije {0} sek.",other:"prije {0} sek."}}}}}),a.__addLocaleData({locale:"bs-Cyrl",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"година",relative:{0:"Ове године",1:"Следеће године","-1":"Прошле године"},relativeTime:{future:{one:"за {0} годину",few:"за {0} године",other:"за {0} година"},past:{one:"пре {0} годину",few:"пре {0} године",other:"пре {0} година"}}},"year-short":{displayName:"година",relative:{0:"Ове године",1:"Следеће године","-1":"Прошле године"},relativeTime:{future:{one:"за {0} годину",few:"за {0} године",other:"за {0} година"},past:{one:"пре {0} годину",few:"пре {0} године",other:"пре {0} година"}}},month:{displayName:"месец",relative:{0:"Овог месеца",1:"Следећег месеца","-1":"Прошлог месеца"},relativeTime:{future:{one:"за {0} месец",few:"за {0} месеца",other:"за {0} месеци"},past:{one:"пре {0} месец",few:"пре {0} месеца",other:"пре {0} месеци"}}},"month-short":{displayName:"месец",relative:{0:"Овог месеца",1:"Следећег месеца","-1":"Прошлог месеца"},relativeTime:{future:{one:"за {0} месец",few:"за {0} месеца",other:"за {0} месеци"},past:{one:"пре {0} месец",few:"пре {0} месеца",other:"пре {0} месеци"}}},day:{displayName:"дан",relative:{0:"данас",1:"сутра",2:"прекосутра","-2":"прекјуче","-1":"јуче"},relativeTime:{future:{one:"за {0} дан",few:"за {0} дана",other:"за {0} дана"},past:{one:"пре {0} дан",few:"пре {0} дана",other:"пре {0} дана"}}},"day-short":{displayName:"дан",relative:{0:"данас",1:"сутра",2:"прекосутра","-2":"прекјуче","-1":"јуче"},relativeTime:{future:{one:"за {0} дан",few:"за {0} дана",other:"за {0} дана"},past:{one:"пре {0} дан",few:"пре {0} дана",other:"пре {0} дана"}}},hour:{displayName:"час",relative:{0:"this hour"},relativeTime:{future:{one:"за {0} сат",few:"за {0} сата",other:"за {0} сати"},past:{one:"пре {0} сат",few:"пре {0} сата",other:"пре {0} сати"}}},"hour-short":{displayName:"час",relative:{0:"this hour"},relativeTime:{future:{one:"за {0} сат",few:"за {0} сата",other:"за {0} сати"},past:{one:"пре {0} сат",few:"пре {0} сата",other:"пре {0} сати"}}},minute:{displayName:"минут",relative:{0:"this minute"},relativeTime:{future:{one:"за {0} минут",few:"за {0} минута",other:"за {0} минута"},past:{one:"пре {0} минут",few:"пре {0} минута",other:"пре {0} минута"}}},"minute-short":{displayName:"минут",relative:{0:"this minute"},relativeTime:{future:{one:"за {0} минут",few:"за {0} минута",other:"за {0} минута"},past:{one:"пре {0} минут",few:"пре {0} минута",other:"пре {0} минута"}}},second:{displayName:"секунд",relative:{0:"now"},relativeTime:{future:{one:"за {0} секунд",few:"за {0} секунде",other:"за {0} секунди"},past:{one:"пре {0} секунд",few:"пре {0} секунде",other:"пре {0} секунди"}}},"second-short":{displayName:"секунд",relative:{0:"now"},relativeTime:{future:{one:"за {0} секунд",few:"за {0} секунде",other:"за {0} секунди"},past:{one:"пре {0} секунд",few:"пре {0} секунде",other:"пре {0} секунди"}}}}}),a.__addLocaleData({locale:"bs-Latn",parentLocale:"bs"}),a.__addLocaleData({locale:"ca",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?1==e||3==e?"one":2==e?"two":4==e?"few":"other":1==e&&a?"one":"other"},fields:{year:{displayName:"any",relative:{0:"enguany",1:"l’any que ve","-1":"l’any passat"},relativeTime:{future:{one:"d’aquí a {0} any",other:"d’aquí a {0} anys"},past:{one:"fa {0} any",other:"fa {0} anys"}}},"year-short":{displayName:"any",relative:{0:"enguany",1:"l’any que ve","-1":"l’any passat"},relativeTime:{future:{one:"d’aquí a {0} any",other:"d’aquí a {0} anys"},past:{one:"fa {0} any",other:"fa {0} anys"}}},month:{displayName:"mes",relative:{0:"aquest mes",1:"el mes que ve","-1":"el mes passat"},relativeTime:{future:{one:"d’aquí a {0} mes",other:"d’aquí a {0} mesos"},past:{one:"fa {0} mes",other:"fa {0} mesos"}}},"month-short":{displayName:"mes",relative:{0:"aquest mes",1:"el mes que ve","-1":"el mes passat"},relativeTime:{future:{one:"d’aquí a {0} mes",other:"d’aquí a {0} mesos"},past:{one:"fa {0} mes",other:"fa {0} mesos"}}},day:{displayName:"dia",relative:{0:"avui",1:"demà",2:"demà passat","-2":"abans-d’ahir","-1":"ahir"},relativeTime:{future:{one:"d’aquí a {0} dia",other:"d’aquí a {0} dies"},past:{one:"fa {0} dia",other:"fa {0} dies"}}},"day-short":{displayName:"dia",relative:{0:"avui",1:"demà",2:"demà passat","-2":"abans-d’ahir","-1":"ahir"},relativeTime:{future:{one:"d’aquí a {0} dia",other:"d’aquí a {0} dies"},past:{one:"fa {0} dia",other:"fa {0} dies"}}},hour:{displayName:"hora",relative:{0:"aquesta hora"},relativeTime:{future:{one:"d’aquí a {0} hora",other:"d’aquí a {0} hores"},past:{one:"fa {0} hora",other:"fa {0} hores"}}},"hour-short":{displayName:"h",relative:{0:"aquesta hora"},relativeTime:{future:{one:"d’aquí a {0} h",other:"d’aquí a {0} h"},past:{one:"fa {0} h",other:"fa {0} h"}}},minute:{displayName:"minut",relative:{0:"aquest minut"},relativeTime:{future:{one:"d’aquí a {0} minut",other:"d’aquí a {0} minuts"},past:{one:"fa {0} minut",other:"fa {0} minuts"}}},"minute-short":{displayName:"min",relative:{0:"aquest minut"},relativeTime:{future:{one:"d’aquí a {0} min",other:"d’aquí a {0} min"},past:{one:"fa {0} min",other:"fa {0} min"}}},second:{displayName:"segon",relative:{0:"ara"},relativeTime:{future:{one:"d’aquí a {0} segon",other:"d’aquí a {0} segons"},past:{one:"fa {0} segon",other:"fa {0} segons"}}},"second-short":{displayName:"s",relative:{0:"ara"},relativeTime:{future:{one:"d’aquí a {0} s",other:"d’aquí a {0} s"},past:{one:"fa {0} s",other:"fa {0} s"}}}}}),a.__addLocaleData({locale:"ca-AD",parentLocale:"ca"}),a.__addLocaleData({locale:"ca-ES-VALENCIA",parentLocale:"ca-ES",fields:{year:{displayName:"any",relative:{0:"enguany",1:"l’any que ve","-1":"l’any passat"},relativeTime:{future:{one:"d’aquí a {0} any",other:"d’aquí a {0} anys"},past:{one:"fa {0} any",other:"fa {0} anys"}}},"year-short":{displayName:"any",relative:{0:"enguany",1:"l’any que ve","-1":"l’any passat"},relativeTime:{future:{one:"d’aquí a {0} any",other:"d’aquí a {0} anys"},past:{one:"fa {0} any",other:"fa {0} anys"}}},month:{displayName:"mes",relative:{0:"aquest mes",1:"el mes que ve","-1":"el mes passat"},relativeTime:{future:{one:"d’aquí a {0} mes",other:"d’aquí a {0} mesos"},past:{one:"fa {0} mes",other:"fa {0} mesos"}}},"month-short":{displayName:"mes",relative:{0:"aquest mes",1:"el mes que ve","-1":"el mes passat"},relativeTime:{future:{one:"d’aquí a {0} mes",other:"d’aquí a {0} mesos"},past:{one:"fa {0} mes",other:"fa {0} mesos"}}},day:{displayName:"dia",relative:{0:"avui",1:"demà",2:"demà passat","-2":"abans-d’ahir","-1":"ahir"},relativeTime:{future:{one:"d’aquí a {0} dia",other:"d’aquí a {0} dies"},past:{one:"fa {0} dia",other:"fa {0} dies"}}},"day-short":{displayName:"dia",relative:{0:"avui",1:"demà",2:"demà passat","-2":"abans-d’ahir","-1":"ahir"},relativeTime:{future:{one:"d’aquí a {0} dia",other:"d’aquí a {0} dies"},past:{one:"fa {0} dia",other:"fa {0} dies"}}},hour:{displayName:"hora",relative:{0:"aquesta hora"},relativeTime:{future:{one:"d’aquí a {0} hora",other:"d’aquí a {0} hores"},past:{one:"fa {0} hora",other:"fa {0} hores"}}},"hour-short":{displayName:"h",relative:{0:"aquesta hora"},relativeTime:{future:{one:"d’aquí a {0} h",other:"d’aquí a {0} h"},past:{one:"fa {0} h",other:"fa {0} h"}}},minute:{displayName:"minut",relative:{0:"aquest minut"},relativeTime:{future:{one:"d’aquí a {0} minut",other:"d’aquí a {0} minuts"},past:{one:"fa {0} minut",other:"fa {0} minuts"}}},"minute-short":{displayName:"min",relative:{0:"aquest minut"},relativeTime:{future:{one:"d’aquí a {0} min",other:"d’aquí a {0} min"},past:{one:"fa {0} min",other:"fa {0} min"}}},second:{displayName:"segon",relative:{0:"ara"},relativeTime:{future:{one:"d’aquí a {0} segon",other:"d’aquí a {0} segons"},past:{one:"fa {0} segon",other:"fa {0} segons"}}},"second-short":{displayName:"s",relative:{0:"ara"},relativeTime:{future:{one:"d’aquí a {0} s",other:"d’aquí a {0} s"},past:{one:"fa {0} s",other:"fa {0} s"}}}}}),a.__addLocaleData({locale:"ca-ES",parentLocale:"ca"}),a.__addLocaleData({locale:"ca-FR",parentLocale:"ca"}),a.__addLocaleData({locale:"ca-IT",parentLocale:"ca"}),a.__addLocaleData({locale:"ce",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"шо",relative:{0:"карарчу шарахь",1:"рогӀерчу шарахь","-1":"даханчу шарахь"},relativeTime:{future:{one:"{0} шо даьлча",other:"{0} шо даьлча"},past:{one:"{0} шо хьалха",other:"{0} шо хьалха"}}},"year-short":{displayName:"ш.",relative:{0:"карарчу шарахь",1:"рогӀерчу шарахь","-1":"даханчу шарахь"},relativeTime:{future:{one:"{0} ш. даьлча",other:"{0} ш. даьлча"},past:{one:"{0} ш. хьалха",other:"{0} ш. хьалха"}}},month:{displayName:"бутт",relative:{0:"карарчу баттахь",1:"рогӀерчу баттахь","-1":"баханчу баттахь"},relativeTime:{future:{one:"{0} бутт баьлча",other:"{0} бутт баьлча"},past:{one:"{0} бутт хьалха",other:"{0} бутт хьалха"}}},"month-short":{displayName:"бут.",relative:{0:"карарчу баттахь",1:"рогӀерчу баттахь","-1":"баханчу баттахь"},relativeTime:{future:{one:"{0} б. баьлча",other:"{0} б. баьлча"},past:{one:"{0} б. хьалха",other:"{0} б. хьалха"}}},day:{displayName:"де",relative:{0:"тахана",1:"кхана","-1":"селхана"},relativeTime:{future:{one:"{0} де даьлча",other:"{0} де даьлча"},past:{one:"{0} де хьалха",other:"{0} де хьалха"}}},"day-short":{displayName:"де",relative:{0:"тахана",1:"кхана","-1":"селхана"},relativeTime:{future:{one:"{0} д. даьлча",other:"{0} д. даьлча"},past:{one:"{0} д. хьалха",other:"{0} де хьалха"}}},hour:{displayName:"сахьт",relative:{0:"this hour"},relativeTime:{future:{one:"{0} сахьт даьлча",other:"{0} сахьт даьлча"},past:{one:"{0} сахьт хьалха",other:"{0} сахьт хьалха"}}},"hour-short":{displayName:"сахь.",relative:{0:"this hour"},relativeTime:{future:{one:"{0} сахь. даьлча",other:"{0} сахь. даьлча"},past:{one:"{0} сахь. хьалха",other:"{0} сахь. хьалха"}}},minute:{displayName:"минот",relative:{0:"this minute"},relativeTime:{future:{one:"{0} минот яьлча",other:"{0} минот яьлча"},past:{one:"{0} минот хьалха",other:"{0} минот хьалха"}}},"minute-short":{displayName:"мин.",relative:{0:"this minute"},relativeTime:{future:{one:"{0} мин. яьлча",other:"{0} мин. яьлча"},past:{one:"{0} мин. хьалха",other:"{0} мин. хьалха"}}},second:{displayName:"секунд",relative:{0:"now"},relativeTime:{future:{one:"{0} секунд яьлча",other:"{0} секунд яьлча"},past:{one:"{0} секунд хьалха",other:"{0} секунд хьалха"}}},"second-short":{displayName:"сек.",relative:{0:"now"},relativeTime:{future:{one:"{0} сек. яьлча",other:"{0} сек. яьлча"},past:{one:"{0} сек. хьалха",other:"{0} сек. хьалха"}}}}}),a.__addLocaleData({locale:"cgg",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Omwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Omwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Omwezi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Omwezi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Eizooba",relative:{0:"Erizooba",1:"Nyenkyakare","-1":"Nyomwabazyo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Eizooba",relative:{0:"Erizooba",1:"Nyenkyakare","-1":"Nyomwabazyo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Shaaha",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Shaaha",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Edakiika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Edakiika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Obucweka/Esekendi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Obucweka/Esekendi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"chr",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"ᎤᏕᏘᏴᏌᏗᏒᎢ",relative:{0:"ᎯᎠ ᏧᏕᏘᏴᏒᏘ",1:"ᎡᏘᏴᎢ","-1":"ᎡᏘ ᏥᎨᏒ"},relativeTime:{future:{one:"ᎾᎿ {0} ᎤᏕᏘᏴᏌᏗᏒᎢ",other:"ᎾᎿ {0} ᎢᏧᏕᏘᏴᏌᏗᏒᎢ"},past:{one:"{0} ᎤᏕᏘᏴᏌᏗᏒᎢ ᏥᎨᏒ",other:"{0} ᎢᏧᏕᏘᏴᏌᏗᏒᎢ ᏥᎨᏒ"}}},"year-short":{displayName:"ᎤᏕ.",relative:{0:"ᎯᎠ ᏧᏕᏘᏴᏒᏘ",1:"ᎡᏘᏴᎢ","-1":"ᎡᏘ ᏥᎨᏒ"},relativeTime:{future:{one:"ᎾᎿ {0} ᎤᏕ.",other:"ᎾᎿ {0} ᎤᏕ."},past:{one:"ᎾᎿ {0} ᎤᏕ. ᏥᎨᏒ",other:"ᎾᎿ {0} ᎤᏕ. ᏥᎨᏒ"}}},month:{displayName:"ᎧᎸᎢ",relative:{0:"ᎯᎠ ᎧᎸᎢ",1:"ᏔᎵᏁ ᎧᎸᎢ","-1":"ᎧᎸᎢ ᏥᎨᏒ"},relativeTime:{future:{one:"ᎾᎿ {0} ᎧᎸᎢ",other:"ᎾᎿ {0} ᏗᎧᎸᎢ"},past:{one:"ᎾᎿ {0} ᎧᎸᎢ ᏥᎨᏒ",other:"ᎾᎿ {0} ᏗᎧᎸᎢ ᏥᎨᏒ"}}},"month-short":{displayName:"ᎧᎸ.",relative:{0:"ᎯᎠ ᎧᎸᎢ",1:"ᏔᎵᏁ ᎧᎸᎢ","-1":"ᎧᎸᎢ ᏥᎨᏒ"},relativeTime:{future:{one:"ᎾᎿ {0} ᎧᎸ.",other:"ᎾᎿ {0} ᎧᎸ."},past:{one:"ᎾᎿ {0} ᎧᎸ. ᏥᎨᏒ",other:"ᎾᎿ {0} ᎧᎸ. ᏥᎨᏒ"}}},day:{displayName:"ᎢᎦ",relative:{0:"ᎪᎯ ᎢᎦ",1:"ᏌᎾᎴᎢ","-1":"ᏒᎯ"},relativeTime:{future:{one:"ᎾᎿ {0} ᎢᎦ",other:"ᎾᎿ {0} ᎯᎸᏍᎩ ᏧᏒᎯᏛ"},past:{one:"{0} ᎢᎦ ᏥᎨᏒ",other:"{0} ᎯᎸᏍᎩ ᏧᏒᎯᏛ ᏥᎨᏒ"}}},"day-short":{displayName:"ᎢᎦ",relative:{0:"ᎪᎯ ᎢᎦ",1:"ᏌᎾᎴᎢ","-1":"ᏒᎯ"},relativeTime:{future:{one:"ᎾᎿ {0} ᎢᎦ",other:"ᎾᎿ {0} ᎯᎸᏍᎩ ᏧᏒᎯᏛ"},past:{one:"{0} ᎢᎦ ᏥᎨᏒ",other:"{0} ᎯᎸᏍᎩ ᏧᏒᎯᏛ ᏥᎨᏒ"}}},hour:{displayName:"ᏑᏟᎶᏓ",relative:{0:"ᎯᎠ ᏑᏟᎶᏓ"},relativeTime:{future:{one:"ᎾᎿ {0} ᏑᏟᎶᏓ",other:"ᎾᎿ {0} ᎢᏳᏟᎶᏓ"},past:{one:"{0} ᏑᏟᎶᏓ ᏥᎨᏒ",other:"{0} ᎢᏳᏟᎶᏓ ᏥᎨᏒ"}}},"hour-short":{displayName:"ᏑᏟ.",relative:{0:"ᎯᎠ ᏑᏟᎶᏓ"},relativeTime:{future:{one:"ᎾᎿ {0} ᏑᏟ.",other:"ᎾᎿ {0} ᏑᏟ."},past:{one:"ᎾᎿ {0} ᏑᏟ. ᏥᎨᏒ",other:"ᎾᎿ {0} ᏑᏟ. ᏥᎨᏒ"}}},minute:{displayName:"ᎢᏯᏔᏬᏍᏔᏅ",relative:{0:"ᎯᎠ ᎢᏯᏔᏬᏍᏔᏅ"},relativeTime:{future:{one:"ᎾᎿ {0} ᎢᏯᏔᏬᏍᏔᏅ",other:"ᎾᎿ {0} ᎢᏯᏔᏬᏍᏔᏅ"},past:{one:"ᎾᎿ {0} ᎢᏯᏔᏬᏍᏔᏅ ᏥᎨᏒ",other:"ᎾᎿ {0} ᎢᏯᏔᏬᏍᏔᏅ ᏥᎨᏒ"}}},"minute-short":{displayName:"ᎢᏯᏔ.",relative:{0:"ᎯᎠ ᎢᏯᏔᏬᏍᏔᏅ"},relativeTime:{future:{one:"ᎾᎿ {0} ᎢᏯᏔ.",other:"ᎾᎿ {0} ᎢᏯᏔ."},past:{one:"ᎾᎿ {0} ᎢᏯᏔ. ᏥᎨᏒ",other:"ᎾᎿ {0} ᎢᏯᏔ. ᏥᎨᏒ"}}},second:{displayName:"ᎠᏎᏢ",relative:{0:"ᏃᏊ"},relativeTime:{future:{one:"ᎾᎿ {0} ᎠᏎᏢ",other:"ᎾᎿ {0} ᏓᏓᎾᏩᏍᎬ ᏥᎨᏒ"},past:{one:"{0} ᎠᏎᏢ ᏥᎨᏒ",other:"{0} ᏓᏓᎾᏩᏍᎬ ᏥᎨᏒ"}}},"second-short":{displayName:"ᎠᏎᏢ.",relative:{0:"ᏃᏊ"},relativeTime:{future:{one:"ᎾᎿ {0} ᎠᏎᏢ.",other:"ᎾᎿ {0} ᎠᏎᏢ."},past:{one:"{0} ᎠᏎᏢ. ᏥᎨᏒ",other:"{0} ᎠᏎᏢ. ᏥᎨᏒ"}}}}}),a.__addLocaleData({locale:"ckb",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ckb-IR",parentLocale:"ckb"}),a.__addLocaleData({locale:"cs",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1];return t?"other":1==e&&n?"one":a>=2&&a<=4&&n?"few":n?"other":"many"},fields:{year:{displayName:"rok",relative:{0:"tento rok",1:"příští rok","-1":"minulý rok"},relativeTime:{future:{one:"za {0} rok",few:"za {0} roky",many:"za {0} roku",other:"za {0} let"},past:{one:"před {0} rokem",few:"před {0} lety",many:"před {0} roku",other:"před {0} lety"}}},"year-short":{displayName:"r.",relative:{0:"tento rok",1:"příští rok","-1":"minulý rok"},relativeTime:{future:{one:"za {0} r.",few:"za {0} r.",many:"za {0} r.",other:"za {0} l."},past:{one:"před {0} r.",few:"před {0} r.",many:"před {0} r.",other:"před {0} l."}}},month:{displayName:"měsíc",relative:{0:"tento měsíc",1:"příští měsíc","-1":"minulý měsíc"},relativeTime:{future:{one:"za {0} měsíc",few:"za {0} měsíce",many:"za {0} měsíce",other:"za {0} měsíců"},past:{one:"před {0} měsícem",few:"před {0} měsíci",many:"před {0} měsíce",other:"před {0} měsíci"}}},"month-short":{displayName:"měs.",relative:{0:"tento měsíc",1:"příští měsíc","-1":"minulý měsíc"},relativeTime:{future:{one:"za {0} měs.",few:"za {0} měs.",many:"za {0} měs.",other:"za {0} měs."},past:{one:"před {0} měs.",few:"před {0} měs.",many:"před {0} měs.",other:"před {0} měs."}}},day:{displayName:"den",relative:{0:"dnes",1:"zítra",2:"pozítří","-2":"předevčírem","-1":"včera"},relativeTime:{future:{one:"za {0} den",few:"za {0} dny",many:"za {0} dne",other:"za {0} dní"},past:{one:"před {0} dnem",few:"před {0} dny",many:"před {0} dne",other:"před {0} dny"}}},"day-short":{displayName:"den",relative:{0:"dnes",1:"zítra",2:"pozítří","-2":"předevčírem","-1":"včera"},relativeTime:{future:{one:"za {0} den",few:"za {0} dny",many:"za {0} dne",other:"za {0} dní"},past:{one:"před {0} dnem",few:"před {0} dny",many:"před {0} dne",other:"před {0} dny"}}},hour:{displayName:"hodina",relative:{0:"tuto hodinu"},relativeTime:{future:{one:"za {0} hodinu",few:"za {0} hodiny",many:"za {0} hodiny",other:"za {0} hodin"},past:{one:"před {0} hodinou",few:"před {0} hodinami",many:"před {0} hodiny",other:"před {0} hodinami"}}},"hour-short":{displayName:"h",relative:{0:"tuto hodinu"},relativeTime:{future:{one:"za {0} h",few:"za {0} h",many:"za {0} h",other:"za {0} h"},past:{one:"před {0} h",few:"před {0} h",many:"před {0} h",other:"před {0} h"}}},minute:{displayName:"minuta",relative:{0:"tuto minutu"},relativeTime:{future:{one:"za {0} minutu",few:"za {0} minuty",many:"za {0} minuty",other:"za {0} minut"},past:{one:"před {0} minutou",few:"před {0} minutami",many:"před {0} minuty",other:"před {0} minutami"}}},"minute-short":{displayName:"min",relative:{0:"tuto minutu"},relativeTime:{future:{one:"za {0} min",few:"za {0} min",many:"za {0} min",other:"za {0} min"},past:{one:"před {0} min",few:"před {0} min",many:"před {0} min",other:"před {0} min"}}},second:{displayName:"sekunda",relative:{0:"nyní"},relativeTime:{future:{one:"za {0} sekundu",few:"za {0} sekundy",many:"za {0} sekundy",other:"za {0} sekund"},past:{one:"před {0} sekundou",few:"před {0} sekundami",many:"před {0} sekundy",other:"před {0} sekundami"}}},"second-short":{displayName:"s",relative:{0:"nyní"},relativeTime:{future:{one:"za {0} s",few:"za {0} s",many:"za {0} s",other:"za {0} s"},past:{one:"před {0} s",few:"před {0} s",many:"před {0} s",other:"před {0} s"}}}}}),a.__addLocaleData({locale:"cu",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"cy",pluralRuleFunction:function(e,t){return t?0==e||7==e||8==e||9==e?"zero":1==e?"one":2==e?"two":3==e||4==e?"few":5==e||6==e?"many":"other":0==e?"zero":1==e?"one":2==e?"two":3==e?"few":6==e?"many":"other"},fields:{year:{displayName:"blwyddyn",relative:{0:"eleni",1:"blwyddyn nesaf","-1":"llynedd"},relativeTime:{future:{zero:"ymhen {0} mlynedd",one:"ymhen blwyddyn",two:"ymhen {0} flynedd",few:"ymhen {0} blynedd",many:"ymhen {0} blynedd",other:"ymhen {0} mlynedd"},past:{zero:"{0} o flynyddoedd yn ôl",one:"blwyddyn yn ôl",two:"{0} flynedd yn ôl",few:"{0} blynedd yn ôl",many:"{0} blynedd yn ôl",other:"{0} o flynyddoedd yn ôl"}}},"year-short":{displayName:"bl.",relative:{0:"eleni",1:"blwyddyn nesaf","-1":"llynedd"},relativeTime:{future:{zero:"ymhen {0} mlynedd",one:"ymhen blwyddyn",two:"ymhen {0} flynedd",few:"ymhen {0} blynedd",many:"ymhen {0} blynedd",other:"ymhen {0} mlynedd"},past:{zero:"{0} o flynyddoedd yn ôl",one:"blwyddyn yn ôl",two:"{0} flynedd yn ôl",few:"{0} blynedd yn ôl",many:"{0} blynedd yn ôl",other:"{0} o flynyddoedd yn ôl"}}},month:{displayName:"mis",relative:{0:"y mis hwn",1:"mis nesaf","-1":"mis diwethaf"},relativeTime:{future:{zero:"ymhen {0} mis",one:"ymhen mis",two:"ymhen deufis",few:"ymhen {0} mis",many:"ymhen {0} mis",other:"ymhen {0} mis"},past:{zero:"{0} mis yn ôl",one:"{0} mis yn ôl",two:"{0} fis yn ôl",few:"{0} mis yn ôl",many:"{0} mis yn ôl",other:"{0} mis yn ôl"}}},"month-short":{displayName:"mis",relative:{0:"y mis hwn",1:"mis nesaf","-1":"mis diwethaf"},relativeTime:{future:{zero:"ymhen {0} mis",one:"ymhen mis",two:"ymhen deufis",few:"ymhen {0} mis",many:"ymhen {0} mis",other:"ymhen {0} mis"},past:{zero:"{0} mis yn ôl",one:"{0} mis yn ôl",two:"deufis yn ôl",few:"{0} mis yn ôl",many:"{0} mis yn ôl",other:"{0} mis yn ôl"}}},day:{displayName:"dydd",relative:{0:"heddiw",1:"yfory",2:"drennydd","-2":"echdoe","-1":"ddoe"},relativeTime:{future:{zero:"ymhen {0} diwrnod",one:"ymhen diwrnod",two:"ymhen deuddydd",few:"ymhen tridiau",many:"ymhen {0} diwrnod",other:"ymhen {0} diwrnod"},past:{zero:"{0} diwrnod yn ôl",one:"{0} diwrnod yn ôl",two:"{0} ddiwrnod yn ôl",few:"{0} diwrnod yn ôl",many:"{0} diwrnod yn ôl",other:"{0} diwrnod yn ôl"}}},"day-short":{displayName:"dydd",relative:{0:"heddiw",1:"yfory",2:"drennydd","-2":"echdoe","-1":"ddoe"},relativeTime:{future:{zero:"ymhen {0} diwrnod",one:"ymhen diwrnod",two:"ymhen deuddydd",few:"ymhen tridiau",many:"ymhen {0} diwrnod",other:"ymhen {0} diwrnod"},past:{zero:"{0} diwrnod yn ôl",one:"{0} diwrnod yn ôl",two:"{0} ddiwrnod yn ôl",few:"{0} diwrnod yn ôl",many:"{0} diwrnod yn ôl",other:"{0} diwrnod yn ôl"}}},hour:{displayName:"awr",relative:{0:"yr awr hon"},relativeTime:{future:{zero:"ymhen {0} awr",one:"ymhen awr",two:"ymhen {0} awr",few:"ymhen {0} awr",many:"ymhen {0} awr",other:"ymhen {0} awr"},past:{zero:"{0} awr yn ôl",one:"awr yn ôl",two:"{0} awr yn ôl",few:"{0} awr yn ôl",many:"{0} awr yn ôl",other:"{0} awr yn ôl"}}},"hour-short":{displayName:"awr",relative:{0:"yr awr hon"},relativeTime:{future:{zero:"ymhen {0} awr",one:"ymhen awr",two:"ymhen {0} awr",few:"ymhen {0} awr",many:"ymhen {0} awr",other:"ymhen {0} awr"},past:{zero:"{0} awr yn ôl",one:"awr yn ôl",two:"{0} awr yn ôl",few:"{0} awr yn ôl",many:"{0} awr yn ôl",other:"{0} awr yn ôl"}}},minute:{displayName:"munud",relative:{0:"y funud hon"},relativeTime:{future:{zero:"ymhen {0} munud",one:"ymhen munud",two:"ymhen {0} funud",few:"ymhen {0} munud",many:"ymhen {0} munud",other:"ymhen {0} munud"},past:{zero:"{0} munud yn ôl",one:"{0} munud yn ôl",two:"{0} funud yn ôl",few:"{0} munud yn ôl",many:"{0} munud yn ôl",other:"{0} munud yn ôl"}}},"minute-short":{displayName:"mun.",relative:{0:"y funud hon"},relativeTime:{future:{zero:"ymhen {0} mun.",one:"ymhen {0} mun.",two:"ymhen {0} fun.",few:"ymhen {0} mun.",many:"ymhen {0} mun.",other:"ymhen {0} mun."},past:{zero:"{0} mun. yn ôl",one:"{0} mun. yn ôl",two:"{0} fun. yn ôl",few:"{0} mun. yn ôl",many:"{0} mun. yn ôl",other:"{0} mun. yn ôl"}}},second:{displayName:"eiliad",relative:{0:"nawr"},relativeTime:{future:{zero:"ymhen {0} eiliad",one:"ymhen eiliad",two:"ymhen {0} eiliad",few:"ymhen {0} eiliad",many:"ymhen {0} eiliad",other:"ymhen {0} eiliad"},past:{zero:"{0} eiliad yn ôl",one:"eiliad yn ôl",two:"{0} eiliad yn ôl",few:"{0} eiliad yn ôl",many:"{0} eiliad yn ôl",other:"{0} eiliad yn ôl"}}},"second-short":{displayName:"eiliad",relative:{0:"nawr"},relativeTime:{future:{zero:"ymhen {0} eiliad",one:"ymhen eiliad",two:"ymhen {0} eiliad",few:"ymhen {0} eiliad",many:"ymhen {0} eiliad",other:"ymhen {0} eiliad"},past:{zero:"{0} eiliad yn ôl",one:"{0} eiliad yn ôl",two:"{0} eiliad yn ôl",few:"{0} eiliad yn ôl",many:"{0} eiliad yn ôl",other:"{0} eiliad yn ôl"}}}}}),a.__addLocaleData({locale:"da",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=Number(r[0])==e;return t?"other":1!=e&&(n||0!=a&&1!=a)?"other":"one"},fields:{year:{displayName:"år",relative:{0:"i år",1:"næste år","-1":"sidste år"},relativeTime:{future:{one:"om {0} år",other:"om {0} år"},past:{one:"for {0} år siden",other:"for {0} år siden"}}},"year-short":{displayName:"år",relative:{0:"i år",1:"næste år","-1":"sidste år"},relativeTime:{future:{one:"om {0} år",other:"om {0} år"},past:{one:"for {0} år siden",other:"for {0} år siden"}}},month:{displayName:"måned",relative:{0:"denne måned",1:"næste måned","-1":"sidste måned"},relativeTime:{future:{one:"om {0} måned",other:"om {0} måneder"},past:{one:"for {0} måned siden",other:"for {0} måneder siden"}}},"month-short":{displayName:"md.",relative:{0:"denne md.",1:"næste md.","-1":"sidste md."},relativeTime:{future:{one:"om {0} md.",other:"om {0} mdr."},past:{one:"for {0} md. siden",other:"for {0} mdr. siden"}}},day:{displayName:"dag",relative:{0:"i dag",1:"i morgen",2:"i overmorgen","-2":"i forgårs","-1":"i går"},relativeTime:{future:{one:"om {0} dag",other:"om {0} dage"},past:{one:"for {0} dag siden",other:"for {0} dage siden"}}},"day-short":{displayName:"dag",relative:{0:"i dag",1:"i morgen",2:"i overmorgen","-2":"i forgårs","-1":"i går"},relativeTime:{future:{one:"om {0} dag",other:"om {0} dage"},past:{one:"for {0} dag siden",other:"for {0} dage siden"}}},hour:{displayName:"time",relative:{0:"i den kommende time"},relativeTime:{future:{one:"om {0} time",other:"om {0} timer"},past:{one:"for {0} time siden",other:"for {0} timer siden"}}},"hour-short":{displayName:"t.",relative:{0:"i den kommende time"},relativeTime:{future:{one:"om {0} time",other:"om {0} timer"},past:{one:"for {0} time siden",other:"for {0} timer siden"}}},minute:{displayName:"minut",relative:{0:"i det kommende minut"},relativeTime:{future:{one:"om {0} minut",other:"om {0} minutter"},past:{one:"for {0} minut siden",other:"for {0} minutter siden"}}},"minute-short":{displayName:"min.",relative:{0:"i det kommende minut"},relativeTime:{future:{one:"om {0} min.",other:"om {0} min."},past:{one:"for {0} min. siden",other:"for {0} min. siden"}}},second:{displayName:"sekund",relative:{0:"nu"},relativeTime:{future:{one:"om {0} sekund",other:"om {0} sekunder"},past:{one:"for {0} sekund siden",other:"for {0} sekunder siden"}}},"second-short":{displayName:"sek.",relative:{0:"nu"},relativeTime:{future:{one:"om {0} sek.",other:"om {0} sek."},past:{one:"for {0} sek. siden",other:"for {0} sek. siden"}}}}}),a.__addLocaleData({locale:"da-GL",parentLocale:"da"}),a.__addLocaleData({locale:"dav",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Mwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Mwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mori",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Mori",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ituku",relative:{0:"Idime",1:"Kesho","-1":"Iguo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Ituku",relative:{0:"Idime",1:"Kesho","-1":"Iguo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Dakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Dakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"de",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"},fields:{year:{displayName:"Jahr",relative:{0:"dieses Jahr",1:"nächstes Jahr","-1":"letztes Jahr"},relativeTime:{future:{one:"in {0} Jahr",other:"in {0} Jahren"},past:{one:"vor {0} Jahr",other:"vor {0} Jahren"}}},"year-short":{displayName:"Jahr",relative:{0:"dieses Jahr",1:"nächstes Jahr","-1":"letztes Jahr"},relativeTime:{future:{one:"in {0} Jahr",other:"in {0} Jahren"},past:{one:"vor {0} Jahr",other:"vor {0} Jahren"}}},month:{displayName:"Monat",relative:{0:"diesen Monat",1:"nächsten Monat","-1":"letzten Monat"},relativeTime:{future:{one:"in {0} Monat",other:"in {0} Monaten"},past:{one:"vor {0} Monat",other:"vor {0} Monaten"}}},"month-short":{displayName:"Monat",relative:{0:"diesen Monat",1:"nächsten Monat","-1":"letzten Monat"},relativeTime:{future:{one:"in {0} Monat",other:"in {0} Monaten"},past:{one:"vor {0} Monat",other:"vor {0} Monaten"}}},day:{displayName:"Tag",relative:{0:"heute",1:"morgen",2:"übermorgen","-2":"vorgestern","-1":"gestern"},relativeTime:{future:{one:"in {0} Tag",other:"in {0} Tagen"},past:{one:"vor {0} Tag",other:"vor {0} Tagen"}}},"day-short":{displayName:"Tag",relative:{0:"heute",1:"morgen",2:"übermorgen","-2":"vorgestern","-1":"gestern"},relativeTime:{future:{one:"in {0} Tag",other:"in {0} Tagen"},past:{one:"vor {0} Tag",other:"vor {0} Tagen"}}},hour:{displayName:"Stunde",relative:{0:"in dieser Stunde"},relativeTime:{future:{one:"in {0} Stunde",other:"in {0} Stunden"},past:{one:"vor {0} Stunde",other:"vor {0} Stunden"}}},"hour-short":{displayName:"Std.",relative:{0:"in dieser Stunde"},relativeTime:{future:{one:"in {0} Std.",other:"in {0} Std."},past:{one:"vor {0} Std.",other:"vor {0} Std."}}},minute:{displayName:"Minute",relative:{0:"in dieser Minute"},relativeTime:{future:{one:"in {0} Minute",other:"in {0} Minuten"},past:{one:"vor {0} Minute",other:"vor {0} Minuten"}}},"minute-short":{displayName:"Min.",relative:{0:"in dieser Minute"},relativeTime:{future:{one:"in {0} Min.",other:"in {0} Min."},past:{one:"vor {0} Min.",other:"vor {0} Min."}}},second:{displayName:"Sekunde",relative:{0:"jetzt"},relativeTime:{future:{one:"in {0} Sekunde",other:"in {0} Sekunden"},past:{one:"vor {0} Sekunde",other:"vor {0} Sekunden"}}},"second-short":{displayName:"Sek.",relative:{0:"jetzt"},relativeTime:{future:{one:"in {0} Sek.",other:"in {0} Sek."},past:{one:"vor {0} Sek.",other:"vor {0} Sek."}}}}}),a.__addLocaleData({locale:"de-AT",parentLocale:"de"}),a.__addLocaleData({locale:"de-BE",parentLocale:"de"}),a.__addLocaleData({locale:"de-CH",parentLocale:"de"}),a.__addLocaleData({locale:"de-IT",parentLocale:"de"}),a.__addLocaleData({locale:"de-LI",parentLocale:"de"}),a.__addLocaleData({locale:"de-LU",parentLocale:"de"}),a.__addLocaleData({locale:"dje",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Jiiri",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Jiiri",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Handu",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Handu",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Zaari",relative:{0:"Hõo",1:"Suba","-1":"Bi"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Zaari",relative:{0:"Hõo",1:"Suba","-1":"Bi"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Guuru",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Guuru",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Miniti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Miniti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Miti",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Miti",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"dsb",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-2),l=n.slice(-2);return t?"other":o&&1==i||1==l?"one":o&&2==i||2==l?"two":o&&(3==i||4==i)||3==l||4==l?"few":"other"},fields:{year:{displayName:"lěto",relative:{0:"lětosa",1:"znowa","-1":"łoni"},relativeTime:{future:{one:"za {0} lěto",two:"za {0} lěśe",few:"za {0} lěta",other:"za {0} lět"},past:{one:"pśed {0} lětom",two:"pśed {0} lětoma",few:"pśed {0} lětami",other:"pśed {0} lětami"}}},"year-short":{displayName:"l.",relative:{0:"lětosa",1:"znowa","-1":"łoni"},relativeTime:{future:{one:"za {0} l.",two:"za {0} l.",few:"za {0} l.",other:"za {0} l."},past:{one:"pśed {0} l.",two:"pśed {0} l.",few:"pśed {0} l.",other:"pśed {0} l."}}},month:{displayName:"mjasec",relative:{0:"ten mjasec",1:"pśiducy mjasec","-1":"slědny mjasec"},relativeTime:{future:{one:"za {0} mjasec",two:"za {0} mjaseca",few:"za {0} mjasecy",other:"za {0} mjasecow"},past:{one:"pśed {0} mjasecom",two:"pśed {0} mjasecoma",few:"pśed {0} mjasecami",other:"pśed {0} mjasecami"}}},"month-short":{displayName:"mjas.",relative:{0:"ten mjasec",1:"pśiducy mjasec","-1":"slědny mjasec"},relativeTime:{future:{one:"za {0} mjas.",two:"za {0} mjas.",few:"za {0} mjas.",other:"za {0} mjas."},past:{one:"pśed {0} mjas.",two:"pśed {0} mjas.",few:"pśed {0} mjas.",other:"pśed {0} mjas."}}},day:{displayName:"źeń",relative:{0:"źinsa",1:"witśe","-1":"cora"},relativeTime:{future:{one:"za {0} źeń",two:"za {0} dnja",few:"za {0} dny",other:"za {0} dnjow"},past:{one:"pśed {0} dnjom",two:"pśed {0} dnjoma",few:"pśed {0} dnjami",other:"pśed {0} dnjami"}}},"day-short":{displayName:"źeń",relative:{0:"źinsa",1:"witśe","-1":"cora"},relativeTime:{future:{one:"za {0} źeń",two:"za {0} dnj.",few:"za {0} dny",other:"za {0} dnj."},past:{one:"pśed {0} dnj.",two:"pśed {0} dnj.",few:"pśed {0} dnj.",other:"pśed {0} dnj."}}},hour:{displayName:"góźina",relative:{0:"this hour"},relativeTime:{future:{one:"za {0} góźinu",two:"za {0} góźinje",few:"za {0} góźiny",other:"za {0} góźin"},past:{one:"pśed {0} góźinu",two:"pśed {0} góźinoma",few:"pśed {0} góźinami",other:"pśed {0} góźinami"}}},"hour-short":{displayName:"góź.",relative:{0:"this hour"},relativeTime:{future:{one:"za {0} góź.",two:"za {0} góź.",few:"za {0} góź.",other:"za {0} góź."},past:{one:"pśed {0} góź.",two:"pśed {0} góź.",few:"pśed {0} góź.",other:"pśed {0} góź."}}},minute:{displayName:"minuta",relative:{0:"this minute"},relativeTime:{future:{one:"za {0} minutu",two:"za {0} minuśe",few:"za {0} minuty",other:"za {0} minutow"},past:{one:"pśed {0} minutu",two:"pśed {0} minutoma",few:"pśed {0} minutami",other:"pśed {0} minutami"}}},"minute-short":{displayName:"min.",relative:{0:"this minute"},relativeTime:{future:{one:"za {0} min.",two:"za {0} min.",few:"za {0} min.",other:"za {0} min."},past:{one:"pśed {0} min.",two:"pśed {0} min.",few:"pśed {0} min.",other:"pśed {0} min."}}},second:{displayName:"sekunda",relative:{0:"now"},relativeTime:{future:{one:"za {0} sekundu",two:"za {0} sekunźe",few:"za {0} sekundy",other:"za {0} sekundow"},past:{one:"pśed {0} sekundu",two:"pśed {0} sekundoma",few:"pśed {0} sekundami",other:"pśed {0} sekundami"}}},"second-short":{displayName:"sek.",relative:{0:"now"},relativeTime:{future:{one:"za {0} sek.",two:"za {0} sek.",few:"za {0} sek.",other:"za {0} sek."},past:{one:"pśed {0} sek.",two:"pśed {0} sek.",few:"pśed {0} sek.",other:"pśed {0} sek."}}}}}),a.__addLocaleData({locale:"dua",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"mbú",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"mbú",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"mɔ́di",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"mɔ́di",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"búnyá",relative:{0:"wɛ́ŋgɛ̄",1:"kíɛlɛ","-1":"kíɛlɛ nítómb́í"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"búnyá",relative:{0:"wɛ́ŋgɛ̄",1:"kíɛlɛ","-1":"kíɛlɛ nítómb́í"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"ŋgandɛ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"ŋgandɛ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"ndɔkɔ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"ndɔkɔ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"píndí",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"píndí",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"dv",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"dyo",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Emit",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Emit",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Fuleeŋ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Fuleeŋ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Funak",relative:{0:"Jaat",1:"Kajom","-1":"Fucen"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Funak",relative:{0:"Jaat",1:"Kajom","-1":"Fucen"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"dz",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"ལོ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"ལོ་འཁོར་ {0} ནང་"},past:{other:"ལོ་འཁོར་ {0} ཧེ་མ་"}}},"year-short":{displayName:"ལོ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"ལོ་འཁོར་ {0} ནང་"},past:{other:"ལོ་འཁོར་ {0} ཧེ་མ་"}}},month:{displayName:"ཟླ་ཝ་",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"ཟླཝ་ {0} ནང་"},past:{other:"ཟླཝ་ {0} ཧེ་མ་"}}},"month-short":{displayName:"ཟླ་ཝ་",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"ཟླཝ་ {0} ནང་"},past:{other:"ཟླཝ་ {0} ཧེ་མ་"}}},day:{displayName:"ཚེས་",relative:{0:"ད་རིས་",1:"ནངས་པ་",2:"གནངས་ཚེ","-2":"ཁ་ཉིམ","-1":"ཁ་ཙ་"},relativeTime:{future:{other:"ཉིནམ་ {0} ནང་"},past:{other:"ཉིནམ་ {0} ཧེ་མ་"}}},"day-short":{displayName:"ཚེས་",relative:{0:"ད་རིས་",1:"ནངས་པ་",2:"གནངས་ཚེ","-2":"ཁ་ཉིམ","-1":"ཁ་ཙ་"},relativeTime:{future:{other:"ཉིནམ་ {0} ནང་"},past:{other:"ཉིནམ་ {0} ཧེ་མ་"}}},hour:{displayName:"ཆུ་ཚོད",relative:{0:"this hour"},relativeTime:{future:{other:"ཆུ་ཚོད་ {0} ནང་"},past:{other:"ཆུ་ཚོད་ {0} ཧེ་མ་"}}},"hour-short":{displayName:"ཆུ་ཚོད",relative:{0:"this hour"},relativeTime:{future:{other:"ཆུ་ཚོད་ {0} ནང་"},past:{other:"ཆུ་ཚོད་ {0} ཧེ་མ་"}}},minute:{displayName:"སྐར་མ",relative:{0:"this minute"},relativeTime:{future:{other:"སྐར་མ་ {0} ནང་"},past:{other:"སྐར་མ་ {0} ཧེ་མ་"}}},"minute-short":{displayName:"སྐར་མ",relative:{0:"this minute"},relativeTime:{future:{other:"སྐར་མ་ {0} ནང་"},past:{other:"སྐར་མ་ {0} ཧེ་མ་"}}},second:{displayName:"སྐར་ཆཱ་",relative:{0:"now"},relativeTime:{future:{other:"སྐར་ཆ་ {0} ནང་"},past:{other:"སྐར་ཆ་ {0} ཧེ་མ་"}}},"second-short":{displayName:"སྐར་ཆཱ་",relative:{0:"now"},relativeTime:{future:{other:"སྐར་ཆ་ {0} ནང་"},past:{other:"སྐར་ཆ་ {0} ཧེ་མ་"}}}}}),a.__addLocaleData({locale:"ebu",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Mwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Mwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mweri",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Mweri",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Mũthenya",relative:{0:"Ũmũnthĩ",1:"Rũciũ","-1":"Ĩgoro"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Mũthenya",relative:{0:"Ũmũnthĩ",1:"Rũciũ","-1":"Ĩgoro"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Ithaa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Ithaa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Ndagĩka",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Ndagĩka",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekondi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Sekondi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ee",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"ƒe",relative:{0:"ƒe sia",1:"ƒe si gbɔ na","-1":"ƒe si va yi"},relativeTime:{future:{one:"le ƒe {0} me",other:"le ƒe {0} me"},past:{one:"ƒe {0} si va yi",other:"ƒe {0} si wo va yi"}}},"year-short":{displayName:"ƒe",relative:{0:"ƒe sia",1:"ƒe si gbɔ na","-1":"ƒe si va yi"},relativeTime:{future:{one:"le ƒe {0} me",other:"le ƒe {0} me"},past:{one:"le ƒe {0} si va yi me",other:"le ƒe {0} si va yi me"}}},month:{displayName:"ɣleti",relative:{0:"ɣleti sia",1:"ɣleti si gbɔ na","-1":"ɣleti si va yi"},relativeTime:{future:{one:"le ɣleti {0} me",other:"le ɣleti {0} wo me"},past:{one:"ɣleti {0} si va yi",other:"ɣleti {0} si wo va yi"}}},"month-short":{displayName:"ɣleti",relative:{0:"ɣleti sia",1:"ɣleti si gbɔ na","-1":"ɣleti si va yi"},relativeTime:{future:{one:"le ɣleti {0} me",other:"le ɣleti {0} wo me"},past:{one:"ɣleti {0} si va yi",other:"ɣleti {0} si wo va yi"}}},day:{displayName:"ŋkeke",relative:{0:"egbe",1:"etsɔ si gbɔna",2:"nyitsɔ si gbɔna","-2":"nyitsɔ si va yi","-1":"etsɔ si va yi"},relativeTime:{future:{one:"le ŋkeke {0} me",other:"le ŋkeke {0} wo me"},past:{one:"ŋkeke {0} si va yi",other:"ŋkeke {0} si wo va yi"}}},"day-short":{displayName:"ŋkeke",relative:{0:"egbe",1:"etsɔ si gbɔna",2:"nyitsɔ si gbɔna","-2":"nyitsɔ si va yi","-1":"etsɔ si va yi"},relativeTime:{future:{one:"le ŋkeke {0} me",other:"le ŋkeke {0} wo me"},past:{one:"ŋkeke {0} si va yi",other:"ŋkeke {0} si wo va yi"}}},hour:{displayName:"gaƒoƒo",relative:{0:"this hour"},relativeTime:{future:{one:"le gaƒoƒo {0} me",other:"le gaƒoƒo {0} wo me"},past:{one:"gaƒoƒo {0} si va yi",other:"gaƒoƒo {0} si wo va yi"}}},"hour-short":{displayName:"gaƒoƒo",relative:{0:"this hour"},relativeTime:{future:{one:"le gaƒoƒo {0} me",other:"le gaƒoƒo {0} wo me"},past:{one:"gaƒoƒo {0} si va yi",other:"gaƒoƒo {0} si wo va yi"}}},minute:{displayName:"aɖabaƒoƒo",relative:{0:"this minute"},relativeTime:{future:{one:"le aɖabaƒoƒo {0} me",other:"le aɖabaƒoƒo {0} wo me"},past:{one:"aɖabaƒoƒo {0} si va yi",other:"aɖabaƒoƒo {0} si wo va yi"}}},"minute-short":{displayName:"aɖabaƒoƒo",relative:{0:"this minute"},relativeTime:{future:{one:"le aɖabaƒoƒo {0} me",other:"le aɖabaƒoƒo {0} wo me"},past:{one:"aɖabaƒoƒo {0} si va yi",other:"aɖabaƒoƒo {0} si wo va yi"}}},second:{displayName:"sekend",relative:{0:"fifi"},relativeTime:{future:{one:"le sekend {0} me",other:"le sekend {0} wo me"},past:{one:"sekend {0} si va yi",other:"sekend {0} si wo va yi"}}},"second-short":{displayName:"sekend",relative:{0:"fifi"},relativeTime:{future:{one:"le sekend {0} me",other:"le sekend {0} wo me"},past:{one:"sekend {0} si va yi",other:"sekend {0} si wo va yi"}}}}}),a.__addLocaleData({locale:"ee-TG",parentLocale:"ee"}),a.__addLocaleData({locale:"el",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"έτος",relative:{0:"φέτος",1:"επόμενο έτος","-1":"πέρσι"},relativeTime:{future:{one:"σε {0} έτος",other:"σε {0} έτη"},past:{one:"πριν από {0} έτος",other:"πριν από {0} έτη"}}},"year-short":{displayName:"έτ.",relative:{0:"φέτος",1:"επόμενο έτος","-1":"πέρσι"},relativeTime:{future:{one:"σε {0} έτος",other:"σε {0} έτη"},past:{one:"πριν από {0} έτος",other:"πριν από {0} έτη"}}},month:{displayName:"μήνας",relative:{0:"τρέχων μήνας",1:"επόμενος μήνας","-1":"προηγούμενος μήνας"},relativeTime:{future:{one:"σε {0} μήνα",other:"σε {0} μήνες"},past:{one:"πριν από {0} μήνα",other:"πριν από {0} μήνες"}}},"month-short":{displayName:"μήν.",relative:{0:"τρέχων μήνας",1:"επόμενος μήνας","-1":"προηγούμενος μήνας"},relativeTime:{future:{one:"σε {0} μήνα",other:"σε {0} μήνες"},past:{one:"πριν από {0} μήνα",other:"πριν από {0} μήνες"}}},day:{displayName:"ημέρα",relative:{0:"σήμερα",1:"αύριο",2:"μεθαύριο","-2":"προχθές","-1":"χθες"},relativeTime:{future:{one:"σε {0} ημέρα",other:"σε {0} ημέρες"},past:{one:"πριν από {0} ημέρα",other:"πριν από {0} ημέρες"}}},"day-short":{displayName:"ημέρα",relative:{0:"σήμερα",1:"αύριο",2:"μεθαύριο","-2":"προχθές","-1":"χθες"},relativeTime:{future:{one:"σε {0} ημέρα",other:"σε {0} ημέρες"},past:{one:"πριν από {0} ημέρα",other:"πριν από {0} ημέρες"}}},hour:{displayName:"ώρα",relative:{0:"αυτήν την ώρα"},relativeTime:{future:{one:"σε {0} ώρα",other:"σε {0} ώρες"},past:{one:"πριν από {0} ώρα",other:"πριν από {0} ώρες"}}},"hour-short":{displayName:"ώρ.",relative:{0:"αυτήν την ώρα"},relativeTime:{future:{one:"σε {0} ώρα",other:"σε {0} ώρ."},past:{one:"πριν από {0} ώρα",other:"πριν από {0} ώρ."}}},minute:{displayName:"λεπτό",relative:{0:"αυτό το λεπτό"},relativeTime:{future:{one:"σε {0} λεπτό",other:"σε {0} λεπτά"},past:{one:"πριν από {0} λεπτό",other:"πριν από {0} λεπτά"}}},"minute-short":{displayName:"λεπ.",relative:{0:"αυτό το λεπτό"},relativeTime:{future:{one:"σε {0} λεπ.",other:"σε {0} λεπ."},past:{one:"πριν από {0} λεπ.",other:"πριν από {0} λεπ."}}},second:{displayName:"δευτερόλεπτο",relative:{0:"τώρα"},relativeTime:{future:{one:"σε {0} δευτερόλεπτο",other:"σε {0} δευτερόλεπτα"},past:{one:"πριν από {0} δευτερόλεπτο",other:"πριν από {0} δευτερόλεπτα"}}},"second-short":{displayName:"δευτ.",relative:{0:"τώρα"},relativeTime:{future:{one:"σε {0} δευτ.",other:"σε {0} δευτ."},past:{one:"πριν από {0} δευτ.",other:"πριν από {0} δευτ."}}}}}),a.__addLocaleData({locale:"el-CY",parentLocale:"el"}),a.__addLocaleData({locale:"en",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1],n=Number(r[0])==e,o=n&&r[0].slice(-1),i=n&&r[0].slice(-2);return t?1==o&&11!=i?"one":2==o&&12!=i?"two":3==o&&13!=i?"few":"other":1==e&&a?"one":"other"},fields:{year:{displayName:"year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"in {0} year",other:"in {0} years"},past:{one:"{0} year ago",other:"{0} years ago"}}},"year-short":{displayName:"yr.",relative:{0:"this yr.",1:"next yr.","-1":"last yr."},relativeTime:{future:{one:"in {0} yr.",other:"in {0} yr."},past:{one:"{0} yr. ago",other:"{0} yr. ago"}}},month:{displayName:"month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"in {0} month",other:"in {0} months"},past:{one:"{0} month ago",other:"{0} months ago"}}},"month-short":{displayName:"mo.",relative:{0:"this mo.",1:"next mo.","-1":"last mo."},relativeTime:{future:{one:"in {0} mo.",other:"in {0} mo."},past:{one:"{0} mo. ago",other:"{0} mo. ago"}}},day:{displayName:"day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{one:"in {0} day",other:"in {0} days"},past:{one:"{0} day ago",other:"{0} days ago"}}},"day-short":{displayName:"day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{one:"in {0} day",other:"in {0} days"},past:{one:"{0} day ago",other:"{0} days ago"}}},hour:{displayName:"hour",relative:{0:"this hour"},relativeTime:{future:{one:"in {0} hour",other:"in {0} hours"},past:{one:"{0} hour ago",other:"{0} hours ago"}}},"hour-short":{displayName:"hr.",relative:{0:"this hour"},relativeTime:{future:{one:"in {0} hr.",other:"in {0} hr."},past:{one:"{0} hr. ago",other:"{0} hr. ago"}}},minute:{displayName:"minute",relative:{0:"this minute"},relativeTime:{future:{one:"in {0} minute",other:"in {0} minutes"},past:{one:"{0} minute ago",other:"{0} minutes ago"}}},"minute-short":{displayName:"min.",relative:{0:"this minute"},relativeTime:{future:{one:"in {0} min.",other:"in {0} min."},past:{one:"{0} min. ago",other:"{0} min. ago"}}},second:{displayName:"second",relative:{0:"now"},relativeTime:{future:{one:"in {0} second",other:"in {0} seconds"},past:{one:"{0} second ago",other:"{0} seconds ago"}}},"second-short":{displayName:"sec.",relative:{0:"now"},relativeTime:{future:{one:"in {0} sec.",other:"in {0} sec."},past:{one:"{0} sec. ago",other:"{0} sec. ago"}}}}}),a.__addLocaleData({locale:"en-001",parentLocale:"en",fields:{year:{displayName:"year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"in {0} year",other:"in {0} years"},past:{one:"{0} year ago",other:"{0} years ago"}}},"year-short":{displayName:"yr",relative:{0:"this yr.",1:"next yr.","-1":"last yr."},relativeTime:{future:{one:"in {0} yr",other:"in {0} yr"},past:{one:"{0} yr ago",other:"{0} yr ago"}}},month:{displayName:"month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"in {0} month",other:"in {0} months"},past:{one:"{0} month ago",other:"{0} months ago"}}},"month-short":{displayName:"mo",relative:{0:"this mo.",1:"next mo.","-1":"last mo."},relativeTime:{future:{one:"in {0} mo",other:"in {0} mo"},past:{one:"{0} mo ago",other:"{0} mo ago"}}},day:{displayName:"day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{one:"in {0} day",other:"in {0} days"},past:{one:"{0} day ago",other:"{0} days ago"}}},"day-short":{displayName:"day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{one:"in {0} day",other:"in {0} days"},past:{one:"{0} day ago",other:"{0} days ago"}}},hour:{displayName:"hour",relative:{0:"this hour"},relativeTime:{future:{one:"in {0} hour",other:"in {0} hours"},past:{one:"{0} hour ago",other:"{0} hours ago"}}},"hour-short":{displayName:"hr",relative:{0:"this hour"},relativeTime:{future:{one:"in {0} hr",other:"in {0} hr"},past:{one:"{0} hr ago",other:"{0} hr ago"}}},minute:{displayName:"minute",relative:{0:"this minute"},relativeTime:{future:{one:"in {0} minute",other:"in {0} minutes"},past:{one:"{0} minute ago",other:"{0} minutes ago"}}},"minute-short":{displayName:"min",relative:{0:"this minute"},relativeTime:{future:{one:"in {0} min",other:"in {0} min"},past:{one:"{0} min ago",other:"{0} min ago"}}},second:{displayName:"second",relative:{0:"now"},relativeTime:{future:{one:"in {0} second",other:"in {0} seconds"},past:{one:"{0} second ago",other:"{0} seconds ago"}}},"second-short":{displayName:"sec",relative:{0:"now"},relativeTime:{future:{one:"in {0} sec",other:"in {0} sec"},past:{one:"{0} sec ago",other:"{0} sec ago"}}}}}),a.__addLocaleData({locale:"en-150",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-AG",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-AI",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-AS",parentLocale:"en"}),a.__addLocaleData({locale:"en-AT",parentLocale:"en-150"}),a.__addLocaleData({locale:"en-AU",parentLocale:"en-001",fields:{year:{displayName:"year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"in {0} year",other:"in {0} years"},past:{one:"{0} year ago",other:"{0} years ago"}}},"year-short":{displayName:"yr",relative:{0:"this yr.",1:"next yr.","-1":"last yr."},relativeTime:{future:{one:"in {0} yr",other:"in {0} yr"},past:{one:"{0} yr ago",other:"{0} yr ago"}}},month:{displayName:"month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"in {0} month",other:"in {0} months"},past:{one:"{0} month ago",other:"{0} months ago"}}},"month-short":{displayName:"mo",relative:{0:"this mo.",1:"next mo.","-1":"last mo."},relativeTime:{future:{one:"in {0} mo",other:"in {0} mo"},past:{one:"{0} mo ago",other:"{0} mo ago"}}},day:{displayName:"day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{one:"in {0} day",other:"in {0} days"},past:{one:"{0} day ago",other:"{0} days ago"}}},"day-short":{displayName:"day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{one:"in {0} day",other:"in {0} days"},past:{one:"{0} day ago",other:"{0} days ago"}}},hour:{displayName:"hour",relative:{0:"this hour"},relativeTime:{future:{one:"in {0} hour",other:"in {0} hours"},past:{one:"{0} hour ago",other:"{0} hours ago"}}},"hour-short":{displayName:"h",relative:{0:"this hour"},relativeTime:{future:{one:"in {0} hr",other:"in {0} hr"},past:{one:"{0} hr ago",other:"{0} hr ago"}}},minute:{displayName:"minute",relative:{0:"this minute"},relativeTime:{future:{one:"in {0} minute",other:"in {0} minutes"},past:{one:"{0} minute ago",other:"{0} minutes ago"}}},"minute-short":{displayName:"min",relative:{0:"this minute"},relativeTime:{future:{one:"in {0} min",other:"in {0} min"},past:{one:"{0} min ago",other:"{0} min ago"}}},second:{displayName:"second",relative:{0:"now"},relativeTime:{future:{one:"in {0} second",other:"in {0} seconds"},past:{one:"{0} second ago",other:"{0} seconds ago"}}},"second-short":{displayName:"sec",relative:{0:"now"},relativeTime:{future:{one:"in {0} sec",other:"in {0} sec"},past:{one:"{0} sec ago",other:"{0} sec ago"}}}}}),a.__addLocaleData({locale:"en-BB",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-BE",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-BI",parentLocale:"en"}),a.__addLocaleData({locale:"en-BM",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-BS",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-BW",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-BZ",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-CA",parentLocale:"en-001",fields:{year:{displayName:"year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"in {0} year",other:"in {0} years"},past:{one:"{0} year ago",other:"{0} years ago"}}},"year-short":{displayName:"yr",relative:{0:"this yr.",1:"next yr.","-1":"last yr."},relativeTime:{future:{one:"in {0} yr.",other:"in {0} yrs."},past:{one:"{0} yr. ago",other:"{0} yrs. ago"}}},month:{displayName:"month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"in {0} month",other:"in {0} months"},past:{one:"{0} month ago",other:"{0} months ago"}}},"month-short":{displayName:"mo",relative:{0:"this mo.",1:"next mo.","-1":"last mo."},relativeTime:{future:{one:"in {0} mo.",other:"in {0} mos."},past:{one:"{0} mo. ago",other:"{0} mos. ago"}}},day:{displayName:"day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{one:"in {0} day",other:"in {0} days"},past:{one:"{0} day ago",other:"{0} days ago"}}},"day-short":{displayName:"day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{one:"in {0} day",other:"in {0} days"},past:{one:"{0} day ago",other:"{0} days ago"}}},hour:{displayName:"hour",relative:{0:"this hour"},relativeTime:{future:{one:"in {0} hour",other:"in {0} hours"},past:{one:"{0} hour ago",other:"{0} hours ago"}}},"hour-short":{displayName:"hr",relative:{0:"this hour"},relativeTime:{future:{one:"in {0} hr.",other:"in {0} hrs."},past:{one:"{0} hr. ago",other:"{0} hrs. ago"}}},minute:{displayName:"minute",relative:{0:"this minute"},relativeTime:{future:{one:"in {0} minute",other:"in {0} minutes"},past:{one:"{0} minute ago",other:"{0} minutes ago"}}},"minute-short":{displayName:"min",relative:{0:"this minute"},relativeTime:{future:{one:"in {0} min.",other:"in {0} mins."},past:{one:"{0} min. ago",other:"{0} mins. ago"}}},second:{displayName:"second",relative:{0:"now"},relativeTime:{future:{one:"in {0} second",other:"in {0} seconds"},past:{one:"{0} second ago",other:"{0} seconds ago"}}},"second-short":{displayName:"sec",relative:{0:"now"},relativeTime:{future:{one:"in {0} sec.",other:"in {0} secs."},past:{one:"{0} sec. ago",other:"{0} secs. ago"}}}}}),a.__addLocaleData({locale:"en-CC",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-CH",parentLocale:"en-150"}),a.__addLocaleData({locale:"en-CK",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-CM",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-CX",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-CY",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-DE",parentLocale:"en-150"}),a.__addLocaleData({locale:"en-DG",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-DK",parentLocale:"en-150"}),a.__addLocaleData({locale:"en-DM",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-Dsrt",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"en-ER",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-FI",parentLocale:"en-150"}),a.__addLocaleData({locale:"en-FJ",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-FK",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-FM",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-GB",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-GD",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-GG",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-GH",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-GI",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-GM",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-GU",parentLocale:"en"}),a.__addLocaleData({locale:"en-GY",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-HK",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-IE",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-IL",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-IM",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-IN",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-IO",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-JE",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-JM",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-KE",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-KI",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-KN",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-KY",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-LC",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-LR",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-LS",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-MG",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-MH",parentLocale:"en"}),a.__addLocaleData({locale:"en-MO",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-MP",parentLocale:"en"}),a.__addLocaleData({locale:"en-MS",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-MT",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-MU",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-MW",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-MY",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-NA",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-NF",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-NG",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-NL",parentLocale:"en-150"}),a.__addLocaleData({locale:"en-NR",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-NU",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-NZ",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-PG",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-PH",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-PK",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-PN",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-PR",parentLocale:"en"}),a.__addLocaleData({locale:"en-PW",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-RW",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-SB",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-SC",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-SD",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-SE",parentLocale:"en-150"}),a.__addLocaleData({locale:"en-SG",parentLocale:"en-001",fields:{year:{displayName:"year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"in {0} year",other:"in {0} years"},past:{one:"{0} year ago",other:"{0} years ago"}}},"year-short":{displayName:"yr",relative:{0:"this yr",1:"next yr","-1":"last yr"},relativeTime:{future:{one:"in {0} yr",other:"in {0} yr"},past:{one:"{0} yr ago",other:"{0} yr ago"}}},month:{displayName:"month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"in {0} month",other:"in {0} months"},past:{one:"{0} month ago",other:"{0} months ago"}}},"month-short":{displayName:"mth",relative:{0:"this mth",1:"next mth","-1":"last mth"},relativeTime:{future:{one:"in {0} mth",other:"in {0} mth"},past:{one:"{0} mth ago",other:"{0} mth ago"}}},day:{displayName:"day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{one:"in {0} day",other:"in {0} days"},past:{one:"{0} day ago",other:"{0} days ago"}}},"day-short":{displayName:"day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{one:"in {0} day",other:"in {0} days"},past:{one:"{0} day ago",other:"{0} days ago"}}},hour:{displayName:"hour",relative:{0:"this hour"},relativeTime:{future:{one:"in {0} hour",other:"in {0} hours"},past:{one:"{0} hour ago",other:"{0} hours ago"}}},"hour-short":{displayName:"hr",relative:{0:"this hour"},relativeTime:{future:{one:"in {0} hr",other:"in {0} hr"},past:{one:"{0} hr ago",other:"{0} hr ago"}}},minute:{displayName:"minute",relative:{0:"this minute"},relativeTime:{future:{one:"in {0} minute",other:"in {0} minutes"},past:{one:"{0} minute ago",other:"{0} minutes ago"}}},"minute-short":{displayName:"min",relative:{0:"this minute"},relativeTime:{future:{one:"in {0} min",other:"in {0} min"},past:{one:"{0} min ago",other:"{0} min ago"}}},second:{displayName:"second",relative:{0:"now"},relativeTime:{future:{one:"in {0} second",other:"in {0} seconds"},past:{one:"{0} second ago",other:"{0} seconds ago"}}},"second-short":{displayName:"sec",relative:{0:"now"},relativeTime:{future:{one:"in {0} sec",other:"in {0} sec"},past:{one:"{0} sec ago",other:"{0} sec ago"}}}}}),a.__addLocaleData({locale:"en-SH",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-SI",parentLocale:"en-150"}),a.__addLocaleData({locale:"en-SL",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-SS",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-SX",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-SZ",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-Shaw",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"en-TC",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-TK",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-TO",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-TT",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-TV",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-TZ",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-UG",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-UM",parentLocale:"en"}),a.__addLocaleData({locale:"en-US",parentLocale:"en"}),a.__addLocaleData({locale:"en-VC",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-VG",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-VI",parentLocale:"en"}),a.__addLocaleData({locale:"en-VU",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-WS",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-ZA",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-ZM",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-ZW",parentLocale:"en-001"});a.__addLocaleData({locale:"eo",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"es",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},"year-short":{displayName:"a",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} a",other:"dentro de {0} a"},past:{one:"hace {0} a",other:"hace {0} a"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},"month-short":{displayName:"m",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} m",other:"dentro de {0} m"},past:{one:"hace {0} m",other:"hace {0} m"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"anteayer","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},"day-short":{displayName:"d",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"anteayer","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},"hour-short":{displayName:"h",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} h",other:"dentro de {0} h"},past:{one:"hace {0} h",other:"hace {0} h"}}},minute:{displayName:"minuto",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},"minute-short":{displayName:"min",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} min",other:"dentro de {0} min"},past:{one:"hace {0} min",other:"hace {0} min"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}},"second-short":{displayName:"s",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} s",other:"dentro de {0} s"},past:{one:"hace {0} s",other:"hace {0} s"}}}}}),a.__addLocaleData({locale:"es-419",parentLocale:"es"}),a.__addLocaleData({locale:"es-AR",parentLocale:"es-419",fields:{year:{displayName:"año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},"year-short":{displayName:"a",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} a",other:"dentro de {0} a"},past:{one:"hace {0} a",other:"hace {0} a"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},"month-short":{displayName:"m",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} m",other:"dentro de {0} m"},past:{one:"hace {0} m",other:"hace {0} m"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"anteayer","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},"day-short":{displayName:"d",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"anteayer","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} días",other:"dentro de {0} días"},past:{one:"hace {0} días",other:"hace {0} días"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},"hour-short":{displayName:"h",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} h",other:"dentro de {0} h"},past:{one:"hace {0} h",other:"hace {0} h"}}},minute:{displayName:"minuto",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},"minute-short":{displayName:"min",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} min",other:"dentro de {0} min"},past:{one:"hace {0} min",other:"hace {0} min"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}},"second-short":{displayName:"seg.",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} seg.",other:"dentro de {0} seg."},past:{one:"hace {0} seg.",other:"hace {0} seg."}}}}}),a.__addLocaleData({locale:"es-BO",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-BR",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-BZ",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-CL",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-CO",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-CR",parentLocale:"es-419",fields:{year:{displayName:"año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},"year-short":{displayName:"a",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} a",other:"dentro de {0} a"},past:{one:"hace {0} a",other:"hace {0} a"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},"month-short":{displayName:"m",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} m",other:"dentro de {0} m"},past:{one:"hace {0} m",other:"hace {0} m"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"antier","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},"day-short":{displayName:"d",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"anteayer","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},"hour-short":{displayName:"h",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} h",other:"dentro de {0} h"},past:{one:"hace {0} h",other:"hace {0} h"}}},minute:{displayName:"minuto",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},"minute-short":{displayName:"min",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} min",other:"dentro de {0} min"},past:{one:"hace {0} min",other:"hace {0} min"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}},"second-short":{displayName:"s",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} s",other:"dentro de {0} s"},past:{one:"hace {0} s",other:"hace {0} s"}}}}}),a.__addLocaleData({locale:"es-CU",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-DO",parentLocale:"es-419",fields:{year:{displayName:"Año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},"year-short":{displayName:"a",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} a",other:"dentro de {0} a"},past:{one:"hace {0} a",other:"hace {0} a"}}},month:{displayName:"Mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},"month-short":{displayName:"m",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} m",other:"dentro de {0} m"},past:{one:"hace {0} m",other:"hace {0} m"}}},day:{displayName:"Día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"anteayer","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},"day-short":{displayName:"d",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"anteayer","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},"hour-short":{displayName:"h",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} h",other:"dentro de {0} h"},past:{one:"hace {0} h",other:"hace {0} h"}}},minute:{displayName:"Minuto",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},"minute-short":{displayName:"min",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} min",other:"dentro de {0} min"},past:{one:"hace {0} min",other:"hace {0} min"}}},second:{displayName:"Segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}},"second-short":{displayName:"s",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} s",other:"dentro de {0} s"},past:{one:"hace {0} s",other:"hace {0} s"}}}}}),a.__addLocaleData({locale:"es-EA",parentLocale:"es"}),a.__addLocaleData({locale:"es-EC",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-GQ",parentLocale:"es"}),a.__addLocaleData({locale:"es-GT",parentLocale:"es-419",fields:{year:{displayName:"año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},"year-short":{displayName:"a",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} a",other:"dentro de {0} a"},past:{one:"hace {0} a",other:"hace {0} a"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},"month-short":{displayName:"m",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} m",other:"dentro de {0} m"},past:{one:"hace {0} m",other:"hace {0} m"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"antier","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},"day-short":{displayName:"d",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"anteayer","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},"hour-short":{displayName:"h",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} h",other:"dentro de {0} h"},past:{one:"hace {0} h",other:"hace {0} h"}}},minute:{displayName:"minuto",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},"minute-short":{displayName:"min",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} min",other:"dentro de {0} min"},past:{one:"hace {0} min",other:"hace {0} min"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}},"second-short":{displayName:"s",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} s",other:"dentro de {0} s"},past:{one:"hace {0} s",other:"hace {0} s"}}}}}),a.__addLocaleData({locale:"es-HN",parentLocale:"es-419",fields:{year:{displayName:"año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},"year-short":{displayName:"a",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} a",other:"dentro de {0} a"},past:{one:"hace {0} a",other:"hace {0} a"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},"month-short":{displayName:"m",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} m",other:"dentro de {0} m"},past:{one:"hace {0} m",other:"hace {0} m"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"antier","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},"day-short":{displayName:"d",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"anteayer","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},"hour-short":{displayName:"h",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} h",other:"dentro de {0} h"},past:{one:"hace {0} h",other:"hace {0} h"}}},minute:{displayName:"minuto",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},"minute-short":{displayName:"min",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} min",other:"dentro de {0} min"},past:{one:"hace {0} min",other:"hace {0} min"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}},"second-short":{displayName:"s",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} s",other:"dentro de {0} s"},past:{one:"hace {0} s",other:"hace {0} s"}}}}}),a.__addLocaleData({locale:"es-IC",parentLocale:"es"}),a.__addLocaleData({locale:"es-MX",parentLocale:"es-419",fields:{year:{displayName:"año",relative:{0:"este año",1:"el año próximo","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},"year-short":{displayName:"a",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"en {0} a",other:"en {0} a"},past:{one:"hace {0} a",other:"hace {0} a"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el mes próximo","-1":"el mes pasado"},relativeTime:{future:{one:"en {0} mes",other:"en {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},"month-short":{displayName:"m",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"en {0} m",other:"en {0} m"},past:{one:"hace {0} m",other:"hace {0} m"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"antier","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},"day-short":{displayName:"d",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"anteayer","-1":"ayer"},relativeTime:{future:{one:"en {0} día",other:"en {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},"hour-short":{displayName:"h",relative:{0:"esta hora"},relativeTime:{future:{one:"en {0} h",other:"en {0} n"},past:{one:"hace {0} h",other:"hace {0} h"}}},minute:{displayName:"minuto",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},"minute-short":{displayName:"min",relative:{0:"este minuto"},relativeTime:{future:{one:"en {0} min",other:"en {0} min"},past:{one:"hace {0} min",other:"hace {0} min"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}},"second-short":{displayName:"s",relative:{0:"ahora"},relativeTime:{future:{one:"en {0} s",other:"en {0} s"},past:{one:"hace {0} s",other:"hace {0} s"}}}}}),a.__addLocaleData({locale:"es-NI",parentLocale:"es-419",fields:{year:{displayName:"año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},"year-short":{displayName:"a",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} a",other:"dentro de {0} a"},past:{one:"hace {0} a",other:"hace {0} a"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},"month-short":{displayName:"m",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} m",other:"dentro de {0} m"},past:{one:"hace {0} m",other:"hace {0} m"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"antier","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},"day-short":{displayName:"d",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"anteayer","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},"hour-short":{displayName:"h",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} h",other:"dentro de {0} h"},past:{one:"hace {0} h",other:"hace {0} h"}}},minute:{displayName:"minuto",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},"minute-short":{displayName:"min",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} min",other:"dentro de {0} min"},past:{one:"hace {0} min",other:"hace {0} min"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}},"second-short":{displayName:"s",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} s",other:"dentro de {0} s"},past:{one:"hace {0} s",other:"hace {0} s"}}}}}),a.__addLocaleData({locale:"es-PA",parentLocale:"es-419",fields:{year:{displayName:"año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},"year-short":{displayName:"a",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} a",other:"dentro de {0} a"},past:{one:"hace {0} a",other:"hace {0} a"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},"month-short":{displayName:"m",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} m",other:"dentro de {0} m"},past:{one:"hace {0} m",other:"hace {0} m"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"antier","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},"day-short":{displayName:"d",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"anteayer","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},"hour-short":{displayName:"h",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} h",other:"dentro de {0} h"},past:{one:"hace {0} h",other:"hace {0} h"}}},minute:{displayName:"minuto",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},"minute-short":{displayName:"min",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} min",other:"dentro de {0} min"},past:{one:"hace {0} min",other:"hace {0} min"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}},"second-short":{displayName:"s",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} s",other:"dentro de {0} s"},past:{one:"hace {0} s",other:"hace {0} s"}}}}}),a.__addLocaleData({locale:"es-PE",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-PH",parentLocale:"es"}),a.__addLocaleData({locale:"es-PR",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-PY",parentLocale:"es-419",fields:{year:{displayName:"año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},"year-short":{displayName:"a",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} a",other:"dentro de {0} a"},past:{one:"hace {0} a",other:"hace {0} a"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},"month-short":{displayName:"m",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} m",other:"dentro de {0} m"},past:{one:"hace {0} m",other:"hace {0} m"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"antes de ayer","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},"day-short":{displayName:"d",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"anteayer","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},"hour-short":{displayName:"h",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} h",other:"dentro de {0} h"},past:{one:"hace {0} h",other:"hace {0} h"}}},minute:{displayName:"minuto",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},"minute-short":{displayName:"min",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} min",other:"dentro de {0} min"},past:{one:"hace {0} min",other:"hace {0} min"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}},"second-short":{displayName:"seg.",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} seg.",other:"dentro de {0} seg."},past:{one:"hace {0} seg.",other:"hace {0} seg."}}}}}),a.__addLocaleData({locale:"es-SV",parentLocale:"es-419",fields:{year:{displayName:"año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},"year-short":{displayName:"a",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} a",other:"dentro de {0} a"},past:{one:"hace {0} a",other:"hace {0} a"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},"month-short":{displayName:"m",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} m",other:"dentro de {0} m"},past:{one:"hace {0} m",other:"hace {0} m"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"antier","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},"day-short":{displayName:"d",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"anteayer","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},"hour-short":{displayName:"h",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} h",other:"dentro de {0} h"},past:{one:"hace {0} h",other:"hace {0} h"}}},minute:{displayName:"minuto",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},"minute-short":{displayName:"min",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} min",other:"dentro de {0} min"},past:{one:"hace {0} min",other:"hace {0} min"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}},"second-short":{displayName:"s",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} s",other:"dentro de {0} s"},past:{one:"hace {0} s",other:"hace {0} s"}}}}}),a.__addLocaleData({locale:"es-US",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-UY",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-VE",parentLocale:"es-419"}),a.__addLocaleData({locale:"et",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"},fields:{year:{displayName:"aasta",relative:{0:"käesolev aasta",1:"järgmine aasta","-1":"eelmine aasta"},relativeTime:{future:{one:"{0} aasta pärast",other:"{0} aasta pärast"},past:{one:"{0} aasta eest",other:"{0} aasta eest"}}},"year-short":{displayName:"a",relative:{0:"käesolev aasta",1:"järgmine aasta","-1":"eelmine aasta"},relativeTime:{future:{one:"{0} a pärast",other:"{0} a pärast"},past:{one:"{0} a eest",other:"{0} a eest"}}},month:{displayName:"kuu",relative:{0:"käesolev kuu",1:"järgmine kuu","-1":"eelmine kuu"},relativeTime:{future:{one:"{0} kuu pärast",other:"{0} kuu pärast"},past:{one:"{0} kuu eest",other:"{0} kuu eest"}}},"month-short":{displayName:"k",relative:{0:"käesolev kuu",1:"järgmine kuu","-1":"eelmine kuu"},relativeTime:{future:{one:"{0} kuu pärast",other:"{0} kuu pärast"},past:{one:"{0} kuu eest",other:"{0} kuu eest"}}},day:{displayName:"päev",relative:{0:"täna",1:"homme",2:"ülehomme","-2":"üleeile","-1":"eile"},relativeTime:{future:{one:"{0} päeva pärast",other:"{0} päeva pärast"},past:{one:"{0} päeva eest",other:"{0} päeva eest"}}},"day-short":{displayName:"p",relative:{0:"täna",1:"homme",2:"ülehomme","-2":"üleeile","-1":"eile"},relativeTime:{future:{one:"{0} p pärast",other:"{0} p pärast"},past:{one:"{0} p eest",other:"{0} p eest"}}},hour:{displayName:"tund",relative:{0:"praegusel tunnil"},relativeTime:{future:{one:"{0} tunni pärast",other:"{0} tunni pärast"},past:{one:"{0} tunni eest",other:"{0} tunni eest"}}},"hour-short":{displayName:"t",relative:{0:"praegusel tunnil"},relativeTime:{future:{one:"{0} t pärast",other:"{0} t pärast"},past:{one:"{0} t eest",other:"{0} t eest"}}},minute:{displayName:"minut",relative:{0:"praegusel minutil"},relativeTime:{future:{one:"{0} minuti pärast",other:"{0} minuti pärast"},past:{one:"{0} minuti eest",other:"{0} minuti eest"}}},"minute-short":{displayName:"min",relative:{0:"praegusel minutil"},relativeTime:{future:{one:"{0} min pärast",other:"{0} min pärast"},past:{one:"{0} min eest",other:"{0} min eest"}}},second:{displayName:"sekund",relative:{0:"nüüd"},relativeTime:{future:{one:"{0} sekundi pärast",other:"{0} sekundi pärast"},past:{one:"{0} sekundi eest",other:"{0} sekundi eest"}}},"second-short":{displayName:"sek",relative:{0:"nüüd"},relativeTime:{future:{one:"{0} sek pärast",other:"{0} sek pärast"},past:{one:"{0} sek eest",other:"{0} sek eest"}}}}}),a.__addLocaleData({locale:"eu",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"urtea",relative:{0:"aurten",1:"hurrengo urtea","-1":"aurreko urtea"},relativeTime:{future:{one:"{0} urte barru",other:"{0} urte barru"},past:{one:"Duela {0} urte",other:"Duela {0} urte"}}},"year-short":{displayName:"urtea",relative:{0:"aurten",1:"hurrengo urtea","-1":"aurreko urtea"},relativeTime:{future:{one:"{0} urte barru",other:"{0} urte barru"},past:{one:"Duela {0} urte",other:"Duela {0} urte"}}},month:{displayName:"hilabetea",relative:{0:"hilabete hau",1:"hurrengo hilabetea","-1":"aurreko hilabetea"},relativeTime:{future:{one:"{0} hilabete barru",other:"{0} hilabete barru"},past:{one:"Duela {0} hilabete",other:"Duela {0} hilabete"}}},"month-short":{displayName:"hil.",relative:{0:"hilabete hau",1:"hurrengo hilabetea","-1":"aurreko hilabetea"},relativeTime:{future:{one:"{0} hilabete barru",other:"{0} hilabete barru"},past:{one:"Duela {0} hilabete",other:"Duela {0} hilabete"}}},day:{displayName:"eguna",relative:{0:"gaur",1:"bihar",2:"etzi","-2":"herenegun","-1":"atzo"},relativeTime:{future:{one:"{0} egun barru",other:"{0} egun barru"},past:{one:"Duela {0} egun",other:"Duela {0} egun"}}},"day-short":{displayName:"eg.",relative:{0:"gaur",1:"bihar",2:"etzi","-2":"herenegun","-1":"atzo"},relativeTime:{future:{one:"{0} egun barru",other:"{0} egun barru"},past:{one:"Duela {0} egun",other:"Duela {0} egun"}}},hour:{displayName:"ordua",relative:{0:"ordu honetan"},relativeTime:{future:{one:"{0} ordu barru",other:"{0} ordu barru"},past:{one:"Duela {0} ordu",other:"Duela {0} ordu"}}},"hour-short":{displayName:"h",relative:{0:"ordu honetan"},relativeTime:{future:{one:"{0} ordu barru",other:"{0} ordu barru"},past:{one:"Duela {0} ordu",other:"Duela {0} ordu"}}},minute:{displayName:"minutua",relative:{0:"minutu honetan"},relativeTime:{future:{one:"{0} minutu barru",other:"{0} minutu barru"},past:{one:"Duela {0} minutu",other:"Duela {0} minutu"}}},"minute-short":{displayName:"min",relative:{0:"minutu honetan"},relativeTime:{future:{one:"{0} minutu barru",other:"{0} minutu barru"},past:{one:"Duela {0} minutu",other:"Duela {0} minutu"}}},second:{displayName:"segundoa",relative:{0:"orain"},relativeTime:{future:{one:"{0} segundo barru",other:"{0} segundo barru"},past:{one:"Duela {0} segundo",other:"Duela {0} segundo"}}},"second-short":{displayName:"s",relative:{0:"orain"},relativeTime:{future:{one:"{0} segundo barru",other:"{0} segundo barru"},past:{one:"Duela {0} segundo",other:"Duela {0} segundo"}}}}}),a.__addLocaleData({locale:"ewo",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"M̀bú",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"M̀bú",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Ngɔn",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Ngɔn",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Amǒs",relative:{0:"Aná",1:"Okírí","-1":"Angogé"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Amǒs",relative:{0:"Aná",1:"Okírí","-1":"Angogé"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Awola",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Awola",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Enútɛn",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Enútɛn",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Akábəga",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Akábəga",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"fa",pluralRuleFunction:function(e,t){return t?"other":e>=0&&e<=1?"one":"other"},fields:{year:{displayName:"سال",relative:{0:"امسال",1:"سال آینده","-1":"سال گذشته"},relativeTime:{future:{one:"{0} سال بعد",other:"{0} سال بعد"},past:{one:"{0} سال پیش",other:"{0} سال پیش"}}},"year-short":{displayName:"سال",relative:{0:"امسال",1:"سال آینده","-1":"سال گذشته"},relativeTime:{future:{one:"{0} سال بعد",other:"{0} سال بعد"},past:{one:"{0} سال پیش",other:"{0} سال پیش"}}},month:{displayName:"ماه",relative:{0:"این ماه",1:"ماه آینده","-1":"ماه گذشته"},relativeTime:{future:{one:"{0} ماه بعد",other:"{0} ماه بعد"},past:{one:"{0} ماه پیش",other:"{0} ماه پیش"}}},"month-short":{displayName:"ماه",relative:{0:"این ماه",1:"ماه آینده","-1":"ماه پیش"},relativeTime:{future:{one:"{0} ماه بعد",other:"{0} ماه بعد"},past:{one:"{0} ماه پیش",other:"{0} ماه پیش"}}},day:{displayName:"روز",relative:{0:"امروز",1:"فردا",2:"پس‌فردا","-2":"پریروز","-1":"دیروز"},relativeTime:{future:{one:"{0} روز بعد",other:"{0} روز بعد"},past:{one:"{0} روز پیش",other:"{0} روز پیش"}}},"day-short":{displayName:"روز",relative:{0:"امروز",1:"فردا",2:"پس‌فردا","-2":"پریروز","-1":"دیروز"},relativeTime:{future:{one:"{0} روز بعد",other:"{0} روز بعد"},past:{one:"{0} روز پیش",other:"{0} روز پیش"}}},hour:{displayName:"ساعت",relative:{0:"همین ساعت"},relativeTime:{future:{one:"{0} ساعت بعد",other:"{0} ساعت بعد"},past:{one:"{0} ساعت پیش",other:"{0} ساعت پیش"}}},"hour-short":{displayName:"ساعت",relative:{0:"همین ساعت"},relativeTime:{future:{one:"{0} ساعت بعد",other:"{0} ساعت بعد"},past:{one:"{0} ساعت پیش",other:"{0} ساعت پیش"}}},minute:{displayName:"دقیقه",relative:{0:"همین دقیقه"},relativeTime:{future:{one:"{0} دقیقه بعد",other:"{0} دقیقه بعد"},past:{one:"{0} دقیقه پیش",other:"{0} دقیقه پیش"}}},"minute-short":{displayName:"دقیقه",relative:{0:"همین دقیقه"},relativeTime:{future:{one:"{0} دقیقه بعد",other:"{0} دقیقه بعد"},past:{one:"{0} دقیقه پیش",other:"{0} دقیقه پیش"}}},second:{displayName:"ثانیه",relative:{0:"اکنون"},relativeTime:{future:{one:"{0} ثانیه بعد",other:"{0} ثانیه بعد"},past:{one:"{0} ثانیه پیش",other:"{0} ثانیه پیش"}}},"second-short":{displayName:"ثانیه",relative:{0:"اکنون"},relativeTime:{future:{one:"{0} ثانیه بعد",other:"{0} ثانیه بعد"},past:{one:"{0} ثانیه پیش",other:"{0} ثانیه پیش"}}}}}),a.__addLocaleData({locale:"fa-AF",parentLocale:"fa"}),a.__addLocaleData({locale:"ff",pluralRuleFunction:function(e,t){return t?"other":e>=0&&e<2?"one":"other"},fields:{year:{displayName:"Hitaande",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Hitaande",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Lewru",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Lewru",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ñalnde",relative:{0:"Hannde",1:"Jaŋngo","-1":"Haŋki"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Ñalnde",relative:{0:"Hannde",1:"Jaŋngo","-1":"Haŋki"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Waktu",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Waktu",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Hoƴom",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Hoƴom",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Majaango",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Majaango",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ff-CM",parentLocale:"ff"}),a.__addLocaleData({locale:"ff-GN",parentLocale:"ff"}),a.__addLocaleData({locale:"ff-MR",parentLocale:"ff"}),a.__addLocaleData({locale:"fi",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"},fields:{year:{displayName:"vuosi",relative:{0:"tänä vuonna",1:"ensi vuonna","-1":"viime vuonna"},relativeTime:{future:{one:"{0} vuoden päästä",other:"{0} vuoden päästä"},past:{one:"{0} vuosi sitten",other:"{0} vuotta sitten"}}},"year-short":{displayName:"v",relative:{0:"tänä v",1:"ensi v","-1":"viime v"},relativeTime:{future:{one:"{0} v päästä",other:"{0} v päästä"},past:{one:"{0} v sitten",other:"{0} v sitten"}}},month:{displayName:"kuukausi",relative:{0:"tässä kuussa",1:"ensi kuussa","-1":"viime kuussa"},relativeTime:{future:{one:"{0} kuukauden päästä",other:"{0} kuukauden päästä"},past:{one:"{0} kuukausi sitten",other:"{0} kuukautta sitten"}}},"month-short":{displayName:"kk",relative:{0:"tässä kk",1:"ensi kk","-1":"viime kk"},relativeTime:{future:{one:"{0} kk päästä",other:"{0} kk päästä"},past:{one:"{0} kk sitten",other:"{0} kk sitten"}}},day:{displayName:"päivä",relative:{0:"tänään",1:"huomenna",2:"ylihuomenna","-2":"toissa päivänä","-1":"eilen"},relativeTime:{future:{one:"{0} päivän päästä",other:"{0} päivän päästä"},past:{one:"{0} päivä sitten",other:"{0} päivää sitten"}}},"day-short":{displayName:"pv",relative:{0:"tänään",1:"huom.",2:"ylihuom.","-2":"toissap.","-1":"eilen"},relativeTime:{future:{one:"{0} pv päästä",other:"{0} pv päästä"},past:{one:"{0} pv sitten",other:"{0} pv sitten"}}},hour:{displayName:"tunti",relative:{0:"tämän tunnin aikana"},relativeTime:{future:{one:"{0} tunnin päästä",other:"{0} tunnin päästä"},past:{one:"{0} tunti sitten",other:"{0} tuntia sitten"}}},"hour-short":{displayName:"t",relative:{0:"tunnin sisällä"},relativeTime:{future:{one:"{0} t päästä",other:"{0} t päästä"},past:{one:"{0} t sitten",other:"{0} t sitten"}}},minute:{displayName:"minuutti",relative:{0:"tämän minuutin aikana"},relativeTime:{future:{one:"{0} minuutin päästä",other:"{0} minuutin päästä"},past:{one:"{0} minuutti sitten",other:"{0} minuuttia sitten"}}},"minute-short":{displayName:"min",relative:{0:"minuutin sisällä"},relativeTime:{future:{one:"{0} min päästä",other:"{0} min päästä"},past:{one:"{0} min sitten",other:"{0} min sitten"}}},second:{displayName:"sekunti",relative:{0:"nyt"},relativeTime:{future:{one:"{0} sekunnin päästä",other:"{0} sekunnin päästä"},past:{one:"{0} sekunti sitten",other:"{0} sekuntia sitten"}}},"second-short":{displayName:"s",relative:{0:"nyt"},relativeTime:{future:{one:"{0} s päästä",other:"{0} s päästä"},past:{one:"{0} s sitten",other:"{0} s sitten"}}}}}),a.__addLocaleData({locale:"fil",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=n.slice(-1);return t?1==e?"one":"other":o&&(1==a||2==a||3==a)||o&&4!=i&&6!=i&&9!=i||!o&&4!=l&&6!=l&&9!=l?"one":"other"},fields:{year:{displayName:"taon",relative:{0:"ngayong taon",1:"susunod na taon","-1":"nakaraang taon"},relativeTime:{future:{one:"sa {0} taon",other:"sa {0} (na) taon"},past:{one:"{0} taon ang nakalipas",other:"{0} (na) taon ang nakalipas"}}},"year-short":{displayName:"taon",relative:{0:"ngayong taon",1:"susunod na taon","-1":"nakaraang taon"},relativeTime:{future:{one:"sa {0} taon",other:"sa {0} (na) taon"},past:{one:"{0} taon ang nakalipas",other:"{0} (na) taon ang nakalipas"}}},month:{displayName:"buwan",relative:{0:"ngayong buwan",1:"susunod na buwan","-1":"nakaraang buwan"},relativeTime:{future:{one:"sa {0} buwan",other:"sa {0} (na) buwan"},past:{one:"{0} buwan ang nakalipas",other:"{0} (na) buwan ang nakalipas"}}},"month-short":{displayName:"buwan",relative:{0:"ngayong buwan",1:"susunod na buwan","-1":"nakaraang buwan"},relativeTime:{future:{one:"sa {0} buwan",other:"sa {0} (na) buwan"},past:{one:"{0} buwan ang nakalipas",other:"{0} (na) buwan ang nakalipas"}}},day:{displayName:"araw",relative:{0:"ngayong araw",1:"bukas",2:"Samakalawa","-2":"Araw bago ang kahapon","-1":"kahapon"},relativeTime:{future:{one:"sa {0} araw",other:"sa {0} (na) araw"},past:{one:"{0} araw ang nakalipas",other:"{0} (na) araw ang nakalipas"}}},"day-short":{displayName:"araw",relative:{0:"ngayong araw",1:"bukas",2:"Samakalawa","-2":"Araw bago ang kahapon","-1":"kahapon"},relativeTime:{future:{one:"sa {0} (na) araw",other:"sa {0} (na) araw"},past:{one:"{0} (na) araw ang nakalipas",other:"{0} (na) araw ang nakalipas"}}},hour:{displayName:"oras",relative:{0:"ngayong oras"},relativeTime:{future:{one:"sa {0} oras",other:"sa {0} (na) oras"},past:{one:"{0} oras ang nakalipas",other:"{0} (na) oras ang nakalipas"}}},"hour-short":{displayName:"oras",relative:{0:"ngayong oras"},relativeTime:{future:{one:"sa {0} oras",other:"sa {0} (na) oras"},past:{one:"{0} oras ang nakalipas",other:"{0} (na) oras ang nakalipas"}}},minute:{displayName:"minuto",relative:{0:"sa minutong ito"},relativeTime:{future:{one:"sa {0} minuto",other:"sa {0} (na) minuto"},past:{one:"{0} minuto ang nakalipas",other:"{0} (na) minuto ang nakalipas"}}},"minute-short":{displayName:"min.",relative:{0:"sa minutong ito"},relativeTime:{future:{one:"sa {0} min.",other:"sa {0} (na) min."},past:{one:"{0} min. ang nakalipas",other:"{0} (na) min. ang nakalipas"}}},second:{displayName:"segundo",relative:{0:"ngayon"},relativeTime:{future:{one:"sa {0} segundo",other:"sa {0} (na) segundo"},past:{one:"{0} segundo ang nakalipas",other:"{0} (na) segundo ang nakalipas"}}},"second-short":{displayName:"seg.",relative:{0:"ngayon"},relativeTime:{future:{one:"sa {0} seg.",other:"sa {0} (na) seg."},past:{one:"{0} seg. ang nakalipas",other:"{0} (na) seg. nakalipas"}}}}}),a.__addLocaleData({locale:"fo",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"ár",relative:{0:"í ár",1:"næsta ár","-1":"í fjør"},relativeTime:{future:{one:"um {0} ár",other:"um {0} ár"},past:{one:"{0} ár síðan",other:"{0} ár síðan"}}},"year-short":{displayName:"ár",relative:{0:"í ár",1:"næsta ár","-1":"í fjør"},relativeTime:{future:{one:"um {0} ár",other:"um {0} ár"},past:{one:"{0} ár síðan",other:"{0} ár síðan"}}},month:{displayName:"mánaður",relative:{0:"henda mánaðin",1:"næsta mánað","-1":"seinasta mánað"},relativeTime:{future:{one:"um {0} mánað",other:"um {0} mánaðir"},past:{one:"{0} mánað síðan",other:"{0} mánaðir síðan"}}},"month-short":{displayName:"mnð.",relative:{0:"henda mánaðin",1:"næsta mánað","-1":"seinasta mánað"},relativeTime:{future:{one:"um {0} mnð.",other:"um {0} mnð."},past:{one:"{0} mnð. síðan",other:"{0} mnð. síðan"}}},day:{displayName:"dagur",relative:{0:"í dag",1:"í morgin",2:"í ovurmorgin","-2":"fyrradagin","-1":"í gjár"},relativeTime:{future:{one:"um {0} dag",other:"um {0} dagar"},past:{one:"{0} dagur síðan",other:"{0} dagar síðan"}}},"day-short":{displayName:"da.",relative:{0:"í dag",1:"í morgin",2:"í ovurmorgin","-2":"fyrradagin","-1":"í gjár"},relativeTime:{future:{one:"um {0} da.",other:"um {0} da."},past:{one:"{0} da. síðan",other:"{0} da. síðan"}}},hour:{displayName:"tími",relative:{0:"hendan tíman"},relativeTime:{future:{one:"um {0} tíma",other:"um {0} tímar"},past:{one:"{0} tími síðan",other:"{0} tímar síðan"}}},"hour-short":{displayName:"t.",relative:{0:"hendan tíman"},relativeTime:{future:{one:"um {0} t.",other:"um {0} t."},past:{one:"{0} t. síðan",other:"{0} t. síðan"}}},minute:{displayName:"minuttur",relative:{0:"hendan minuttin"},relativeTime:{future:{one:"um {0} minutt",other:"um {0} minuttir"},past:{one:"{0} minutt síðan",other:"{0} minuttir síðan"}}},"minute-short":{displayName:"min.",relative:{0:"hendan minuttin"},relativeTime:{future:{one:"um {0} min.",other:"um {0} min."},past:{one:"{0} min. síðan",other:"{0} min. síðan"}}},second:{displayName:"sekund",relative:{0:"nú"},relativeTime:{future:{one:"um {0} sekund",other:"um {0} sekund"},past:{one:"{0} sekund síðan",other:"{0} sekund síðan"}}},"second-short":{displayName:"sek.",relative:{0:"nú"},relativeTime:{future:{one:"um {0} sek.",other:"um {0} sek."},past:{one:"{0} sek. síðan",other:"{0} sek. síðan"}}}}}),a.__addLocaleData({locale:"fo-DK",parentLocale:"fo"}),a.__addLocaleData({locale:"fr",pluralRuleFunction:function(e,t){return t?1==e?"one":"other":e>=0&&e<2?"one":"other"},fields:{year:{displayName:"année",relative:{0:"cette année",1:"l’année prochaine","-1":"l’année dernière"},relativeTime:{future:{one:"dans {0} an",other:"dans {0} ans"},past:{one:"il y a {0} an",other:"il y a {0} ans"}}},"year-short":{displayName:"an",relative:{0:"cette année",1:"l’année prochaine","-1":"l’année dernière"},relativeTime:{future:{one:"dans {0} a",other:"dans {0} a"},past:{one:"il y a {0} a",other:"il y a {0} a"}}},month:{displayName:"mois",relative:{0:"ce mois-ci",1:"le mois prochain","-1":"le mois dernier"},relativeTime:{future:{one:"dans {0} mois",other:"dans {0} mois"},past:{one:"il y a {0} mois",other:"il y a {0} mois"}}},"month-short":{displayName:"m.",relative:{0:"ce mois-ci",1:"le mois prochain","-1":"le mois dernier"},relativeTime:{future:{one:"dans {0} m.",other:"dans {0} m."},past:{one:"il y a {0} m.",other:"il y a {0} m."}}},day:{displayName:"jour",relative:{0:"aujourd’hui",1:"demain",2:"après-demain","-2":"avant-hier","-1":"hier"},relativeTime:{future:{one:"dans {0} jour",other:"dans {0} jours"},past:{one:"il y a {0} jour",other:"il y a {0} jours"}}},"day-short":{displayName:"j",relative:{0:"aujourd’hui",1:"demain",2:"après-demain","-2":"avant-hier","-1":"hier"},relativeTime:{future:{one:"dans {0} j",other:"dans {0} j"},past:{one:"il y a {0} j",other:"il y a {0} j"}}},hour:{displayName:"heure",relative:{0:"cette heure-ci"},relativeTime:{future:{one:"dans {0} heure",other:"dans {0} heures"},past:{one:"il y a {0} heure",other:"il y a {0} heures"}}},"hour-short":{displayName:"h",relative:{0:"cette heure-ci"},relativeTime:{future:{one:"dans {0} h",other:"dans {0} h"},past:{one:"il y a {0} h",other:"il y a {0} h"}}},minute:{displayName:"minute",relative:{0:"cette minute-ci"},relativeTime:{future:{one:"dans {0} minute",other:"dans {0} minutes"},past:{one:"il y a {0} minute",other:"il y a {0} minutes"}}},"minute-short":{displayName:"min",relative:{0:"cette minute-ci"},relativeTime:{future:{one:"dans {0} min",other:"dans {0} min"},past:{one:"il y a {0} min",other:"il y a {0} min"}}},second:{displayName:"seconde",relative:{0:"maintenant"},relativeTime:{future:{one:"dans {0} seconde",other:"dans {0} secondes"},past:{one:"il y a {0} seconde",other:"il y a {0} secondes"}}},"second-short":{displayName:"s",relative:{0:"maintenant"},relativeTime:{future:{one:"dans {0} s",other:"dans {0} s"},past:{one:"il y a {0} s",other:"il y a {0} s"}}}}}),a.__addLocaleData({locale:"fr-BE",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-BF",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-BI",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-BJ",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-BL",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-CA",parentLocale:"fr",fields:{year:{displayName:"année",relative:{0:"cette année",1:"l’année prochaine","-1":"l’année dernière"},relativeTime:{future:{one:"Dans {0} an",other:"Dans {0} ans"},past:{one:"Il y a {0} an",other:"Il y a {0} ans"}}},"year-short":{displayName:"a",relative:{0:"cette année",1:"l’année prochaine","-1":"l’année dernière"},relativeTime:{future:{one:"dans {0} a",other:"dans {0} a"},past:{one:"il y a {0} a",other:"il y a {0} a"}}},month:{displayName:"mois",relative:{0:"ce mois-ci",1:"le mois prochain","-1":"le mois dernier"},relativeTime:{future:{one:"dans {0} mois",other:"dans {0} mois"},past:{one:"il y a {0} mois",other:"il y a {0} mois"}}},"month-short":{displayName:"m.",relative:{0:"ce mois-ci",1:"le mois prochain","-1":"le mois dernier"},relativeTime:{future:{one:"dans {0} m.",other:"dans {0} m."},past:{one:"il y a {0} m.",other:"il y a {0} m."}}},day:{displayName:"jour",relative:{0:"aujourd’hui",1:"demain",2:"après-demain","-2":"avant-hier","-1":"hier"},relativeTime:{future:{one:"dans {0} jour",other:"dans {0} jours"},past:{one:"il y a {0} jour",other:"il y a {0} jours"}}},"day-short":{displayName:"j",relative:{0:"aujourd’hui",1:"demain",2:"après-demain","-2":"avant-hier","-1":"hier"},relativeTime:{future:{one:"dans {0} j",other:"dans {0} j"},past:{one:"il y a {0} j",other:"il y a {0} j"}}},hour:{displayName:"heure",relative:{0:"cette heure-ci"},relativeTime:{future:{one:"dans {0} heure",other:"dans {0} heures"},past:{one:"il y a {0} heure",other:"il y a {0} heures"}}},"hour-short":{displayName:"h",relative:{0:"cette heure-ci"},relativeTime:{future:{one:"dans {0} h",other:"dans {0} h"},past:{one:"il y a {0} h",other:"il y a {0} h"}}},minute:{displayName:"minute",relative:{0:"cette minute-ci"},relativeTime:{future:{one:"dans {0} minute",other:"dans {0} minutes"},past:{one:"il y a {0} minute",other:"il y a {0} minutes"}}},"minute-short":{displayName:"min",relative:{0:"cette minute-ci"},relativeTime:{future:{one:"dans {0} min",other:"dans {0} min"},past:{one:"il y a {0} min",other:"il y a {0} min"}}},second:{displayName:"seconde",relative:{0:"maintenant"},relativeTime:{future:{one:"dans {0} seconde",other:"dans {0} secondes"},past:{one:"il y a {0} seconde",other:"il y a {0} secondes"}}},"second-short":{displayName:"s",relative:{0:"maintenant"},relativeTime:{future:{one:"dans {0} s",other:"dans {0} s"},past:{one:"il y a {0} s",other:"il y a {0} s"}}}}}),a.__addLocaleData({locale:"fr-CD",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-CF",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-CG",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-CH",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-CI",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-CM",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-DJ",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-DZ",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-GA",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-GF",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-GN",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-GP",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-GQ",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-HT",parentLocale:"fr",fields:{year:{displayName:"année",relative:{0:"cette année",1:"l’année prochaine","-1":"l’année dernière"},relativeTime:{future:{one:"dans {0} an",other:"dans {0} ans"},past:{one:"il y a {0} an",other:"il y a {0} ans"}}},"year-short":{displayName:"an",relative:{0:"cette année",1:"l’année prochaine","-1":"l’année dernière"},relativeTime:{future:{one:"dans {0} a",other:"dans {0} a"},past:{one:"il y a {0} a",other:"il y a {0} a"}}},month:{displayName:"mois",relative:{0:"ce mois-ci",1:"le mois prochain","-1":"le mois dernier"},relativeTime:{future:{one:"dans {0} mois",other:"dans {0} mois"},past:{one:"il y a {0} mois",other:"il y a {0} mois"}}},"month-short":{displayName:"m.",relative:{0:"ce mois-ci",1:"le mois prochain","-1":"le mois dernier"},relativeTime:{future:{one:"dans {0} m.",other:"dans {0} m."},past:{one:"il y a {0} m.",other:"il y a {0} m."}}},day:{displayName:"jour",relative:{0:"aujourd’hui",1:"demain",2:"après-demain","-2":"avant-hier","-1":"hier"},relativeTime:{future:{one:"dans {0} jour",other:"dans {0} jours"},past:{one:"il y a {0} jour",other:"il y a {0} jours"}}},"day-short":{displayName:"jr.",relative:{0:"aujourd’hui",1:"demain",2:"après-demain","-2":"avant-hier","-1":"hier"},relativeTime:{future:{one:"dans {0} j",other:"dans {0} j"},past:{one:"il y a {0} j",other:"il y a {0} j"}}},hour:{displayName:"heure",relative:{0:"cette heure-ci"},relativeTime:{future:{one:"dans {0} heure",other:"dans {0} heures"},past:{one:"il y a {0} heure",other:"il y a {0} heures"}}},"hour-short":{displayName:"hr",relative:{0:"cette heure-ci"},relativeTime:{future:{one:"dans {0} h",other:"dans {0} h"},past:{one:"il y a {0} h",other:"il y a {0} h"}}},minute:{displayName:"minute",relative:{0:"cette minute-ci"},relativeTime:{future:{one:"dans {0} minute",other:"dans {0} minutes"},past:{one:"il y a {0} minute",other:"il y a {0} minutes"}}},"minute-short":{displayName:"min.",relative:{0:"cette minute-ci"},relativeTime:{future:{one:"dans {0} min",other:"dans {0} min"},past:{one:"il y a {0} min",other:"il y a {0} min"}}},second:{displayName:"seconde",relative:{0:"maintenant"},relativeTime:{future:{one:"dans {0} seconde",other:"dans {0} secondes"},past:{one:"il y a {0} seconde",other:"il y a {0} secondes"}}},"second-short":{displayName:"s",relative:{0:"maintenant"},relativeTime:{future:{one:"dans {0} s",other:"dans {0} s"},past:{one:"il y a {0} s",other:"il y a {0} s"}}}}}),a.__addLocaleData({locale:"fr-KM",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-LU",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-MA",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-MC",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-MF",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-MG",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-ML",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-MQ",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-MR",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-MU",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-NC",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-NE",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-PF",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-PM",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-RE",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-RW",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-SC",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-SN",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-SY",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-TD",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-TG",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-TN",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-VU",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-WF",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-YT",parentLocale:"fr"}),a.__addLocaleData({locale:"fur",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"an",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"ca di {0} an",other:"ca di {0} agns"},past:{one:"{0} an indaûr",other:"{0} agns indaûr"}}},"year-short":{displayName:"an",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"ca di {0} an",other:"ca di {0} agns"},past:{one:"{0} an indaûr",other:"{0} agns indaûr"}}},month:{displayName:"mês",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"ca di {0} mês",other:"ca di {0} mês"},past:{one:"{0} mês indaûr",other:"{0} mês indaûr"}}},"month-short":{displayName:"mês",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"ca di {0} mês",other:"ca di {0} mês"},past:{one:"{0} mês indaûr",other:"{0} mês indaûr"}}},day:{displayName:"dì",relative:{0:"vuê",1:"doman",2:"passantdoman","-2":"îr l’altri","-1":"îr"},relativeTime:{future:{one:"ca di {0} zornade",other:"ca di {0} zornadis"},past:{one:"{0} zornade indaûr",other:"{0} zornadis indaûr"}}},"day-short":{displayName:"dì",relative:{0:"vuê",1:"doman",2:"passantdoman","-2":"îr l’altri","-1":"îr"},relativeTime:{future:{one:"ca di {0} zornade",other:"ca di {0} zornadis"},past:{one:"{0} zornade indaûr",other:"{0} zornadis indaûr"}}},hour:{displayName:"ore",relative:{0:"this hour"},relativeTime:{future:{one:"ca di {0} ore",other:"ca di {0} oris"},past:{one:"{0} ore indaûr",other:"{0} oris indaûr"}}},"hour-short":{displayName:"ore",relative:{0:"this hour"},relativeTime:{future:{one:"ca di {0} ore",other:"ca di {0} oris"},past:{one:"{0} ore indaûr",other:"{0} oris indaûr"}}},minute:{displayName:"minût",relative:{0:"this minute"},relativeTime:{future:{one:"ca di {0} minût",other:"ca di {0} minûts"},past:{one:"{0} minût indaûr",other:"{0} minûts indaûr"}}},"minute-short":{displayName:"minût",relative:{0:"this minute"},relativeTime:{future:{one:"ca di {0} minût",other:"ca di {0} minûts"},past:{one:"{0} minût indaûr",other:"{0} minûts indaûr"}}},second:{displayName:"secont",relative:{0:"now"},relativeTime:{future:{one:"ca di {0} secont",other:"ca di {0} seconts"},past:{one:"{0} secont indaûr",other:"{0} seconts indaûr"}}},"second-short":{displayName:"secont",relative:{0:"now"},relativeTime:{future:{one:"ca di {0} secont",other:"ca di {0} seconts"},past:{one:"{0} secont indaûr",other:"{0} seconts indaûr"}}}}}),a.__addLocaleData({locale:"fy",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"},fields:{year:{displayName:"Jier",relative:{0:"dit jier",1:"folgjend jier","-1":"foarich jier"},relativeTime:{future:{one:"Oer {0} jier",other:"Oer {0} jier"},past:{one:"{0} jier lyn",other:"{0} jier lyn"}}},"year-short":{displayName:"Jier",relative:{0:"dit jier",1:"folgjend jier","-1":"foarich jier"},relativeTime:{future:{one:"Oer {0} jier",other:"Oer {0} jier"},past:{one:"{0} jier lyn",other:"{0} jier lyn"}}},month:{displayName:"Moanne",relative:{0:"dizze moanne",1:"folgjende moanne","-1":"foarige moanne"},relativeTime:{future:{one:"Oer {0} moanne",other:"Oer {0} moannen"},past:{one:"{0} moanne lyn",other:"{0} moannen lyn"}}},"month-short":{displayName:"Moanne",relative:{0:"dizze moanne",1:"folgjende moanne","-1":"foarige moanne"},relativeTime:{future:{one:"Oer {0} moanne",other:"Oer {0} moannen"},past:{one:"{0} moanne lyn",other:"{0} moannen lyn"}}},day:{displayName:"dei",relative:{0:"vandaag",1:"morgen",2:"Oermorgen","-2":"eergisteren","-1":"gisteren"},relativeTime:{future:{one:"Oer {0} dei",other:"Oer {0} deien"},past:{one:"{0} dei lyn",other:"{0} deien lyn"}}},"day-short":{displayName:"dei",relative:{0:"vandaag",1:"morgen",2:"Oermorgen","-2":"eergisteren","-1":"gisteren"},relativeTime:{future:{one:"Oer {0} dei",other:"Oer {0} deien"},past:{one:"{0} dei lyn",other:"{0} deien lyn"}}},hour:{displayName:"oere",relative:{0:"this hour"},relativeTime:{future:{one:"Oer {0} oere",other:"Oer {0} oere"},past:{one:"{0} oere lyn",other:"{0} oere lyn"}}},"hour-short":{displayName:"oere",relative:{0:"this hour"},relativeTime:{future:{one:"Oer {0} oere",other:"Oer {0} oere"},past:{one:"{0} oere lyn",other:"{0} oere lyn"}}},minute:{displayName:"Minút",relative:{0:"this minute"},relativeTime:{future:{one:"Oer {0} minút",other:"Oer {0} minuten"},past:{one:"{0} minút lyn",other:"{0} minuten lyn"}}},"minute-short":{displayName:"Minút",relative:{0:"this minute"},relativeTime:{future:{one:"Oer {0} minút",other:"Oer {0} minuten"},past:{one:"{0} minút lyn",other:"{0} minuten lyn"}}},second:{displayName:"Sekonde",relative:{0:"nu"},relativeTime:{future:{one:"Oer {0} sekonde",other:"Oer {0} sekonden"},past:{one:"{0} sekonde lyn",other:"{0} sekonden lyn"}}},"second-short":{displayName:"Sekonde",relative:{0:"nu"},relativeTime:{future:{one:"Oer {0} sekonde",other:"Oer {0} sekonden"},past:{one:"{0} sekonde lyn",other:"{0} sekonden lyn"}}}}}),a.__addLocaleData({locale:"ga",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e;return t?1==e?"one":"other":1==e?"one":2==e?"two":a&&e>=3&&e<=6?"few":a&&e>=7&&e<=10?"many":"other"},fields:{year:{displayName:"Bliain",relative:{0:"an bhliain seo",1:"an bhliain seo chugainn","-1":"anuraidh"},relativeTime:{future:{one:"i gceann {0} bhliain",two:"i gceann {0} bhliain",few:"i gceann {0} bliana",many:"i gceann {0} mbliana",other:"i gceann {0} bliain"},past:{one:"{0} bhliain ó shin",two:"{0} bhliain ó shin",few:"{0} bliana ó shin",many:"{0} mbliana ó shin",other:"{0} bliain ó shin"}}},"year-short":{displayName:"bl.",relative:{0:"an bhl. seo",1:"an bhl. seo chugainn","-1":"anuraidh"},relativeTime:{future:{one:"i gceann {0} bl.",two:"i gceann {0} bhl.",few:"i gceann {0} bl.",many:"i gceann {0} mbl.",other:"i gceann {0} bl."},past:{one:"{0} bhl. ó shin",two:"{0} bhl. ó shin",few:"{0} bl. ó shin",many:"{0} mbl. ó shin",other:"{0} bl. ó shin"}}},month:{displayName:"Mí",relative:{0:"an mhí seo",1:"an mhí seo chugainn","-1":"an mhí seo caite"},relativeTime:{future:{one:"i gceann {0} mhí",two:"i gceann {0} mhí",few:"i gceann {0} mhí",many:"i gceann {0} mí",other:"i gceann {0} mí"},past:{one:"{0} mhí ó shin",two:"{0} mhí ó shin",few:"{0} mhí ó shin",many:"{0} mí ó shin",other:"{0} mí ó shin"}}},"month-short":{displayName:"mí",relative:{0:"an mhí seo",1:"an mhí seo chugainn","-1":"an mhí seo caite"},relativeTime:{future:{one:"i gceann {0} mhí",two:"i gceann {0} mhí",few:"i gceann {0} mhí",many:"i gceann {0} mí",other:"i gceann {0} mí"},past:{one:"{0} mhí ó shin",two:"{0} mhí ó shin",few:"{0} mhí ó shin",many:"{0} mí ó shin",other:"{0} mí ó shin"}}},day:{displayName:"Lá",relative:{0:"inniu",1:"amárach",2:"arú amárach","-2":"arú inné","-1":"inné"},relativeTime:{future:{one:"i gceann {0} lá",two:"i gceann {0} lá",few:"i gceann {0} lá",many:"i gceann {0} lá",other:"i gceann {0} lá"},past:{one:"{0} lá ó shin",two:"{0} lá ó shin",few:"{0} lá ó shin",many:"{0} lá ó shin",other:"{0} lá ó shin"}}},"day-short":{displayName:"Lá",relative:{0:"inniu",1:"amárach",2:"arú amárach","-2":"arú inné","-1":"inné"},relativeTime:{future:{one:"i gceann {0} lá",two:"i gceann {0} lá",few:"i gceann {0} lá",many:"i gceann {0} lá",other:"i gceann {0} lá"},past:{one:"{0} lá ó shin",two:"{0} lá ó shin",few:"{0} lá ó shin",many:"{0} lá ó shin",other:"{0} lá ó shin"}}},hour:{displayName:"Uair",relative:{0:"an uair seo"},relativeTime:{future:{one:"i gceann {0} uair an chloig",two:"i gceann {0} uair an chloig",few:"i gceann {0} huaire an chloig",many:"i gceann {0} n-uaire an chloig",other:"i gceann {0} uair an chloig"},past:{one:"{0} uair an chloig ó shin",two:"{0} uair an chloig ó shin",few:"{0} huaire an chloig ó shin",many:"{0} n-uaire an chloig ó shin",other:"{0} uair an chloig ó shin"}}},"hour-short":{displayName:"uair",relative:{0:"an uair seo"},relativeTime:{future:{one:"i gceann {0} uair",two:"i gceann {0} uair",few:"i gceann {0} huaire",many:"i gceann {0} n-uaire",other:"i gceann {0} uair"},past:{one:"{0} uair ó shin",two:"{0} uair ó shin",few:"{0} huaire ó shin",many:"{0} n-uaire ó shin",other:"{0} uair ó shin"}}},minute:{displayName:"Nóiméad",relative:{0:"an nóiméad seo"},relativeTime:{future:{one:"i gceann {0} nóiméad",two:"i gceann {0} nóiméad",few:"i gceann {0} nóiméad",many:"i gceann {0} nóiméad",other:"i gceann {0} nóiméad"},past:{one:"{0} nóiméad ó shin",two:"{0} nóiméad ó shin",few:"{0} nóiméad ó shin",many:"{0} nóiméad ó shin",other:"{0} nóiméad ó shin"}}},"minute-short":{displayName:"nóim.",relative:{0:"an nóiméad seo"},relativeTime:{future:{one:"i gceann {0} nóim.",two:"i gceann {0} nóim.",few:"i gceann {0} nóim.",many:"i gceann {0} nóim.",other:"i gceann {0} nóim."},past:{one:"{0} nóim. ó shin",two:"{0} nóim. ó shin",few:"{0} nóim. ó shin",many:"{0} nóim. ó shin",other:"{0} nóim. ó shin"}}},second:{displayName:"Soicind",relative:{0:"anois"},relativeTime:{future:{one:"i gceann {0} soicind",two:"i gceann {0} shoicind",few:"i gceann {0} shoicind",many:"i gceann {0} soicind",other:"i gceann {0} soicind"},past:{one:"{0} soicind ó shin",two:"{0} shoicind ó shin",few:"{0} shoicind ó shin",many:"{0} soicind ó shin",other:"{0} soicind ó shin"}}},"second-short":{displayName:"soic.",relative:{0:"anois"},relativeTime:{future:{one:"i gceann {0} soic.",two:"i gceann {0} shoic.",few:"i gceann {0} shoic.",many:"i gceann {0} soic.",other:"i gceann {0} soic."},past:{one:"{0} soic. ó shin",two:"{0} shoic. ó shin",few:"{0} shoic. ó shin",many:"{0} soic. ó shin",other:"{0} soic. ó shin"}}}}}),a.__addLocaleData({locale:"gd",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e;return t?"other":1==e||11==e?"one":2==e||12==e?"two":a&&e>=3&&e<=10||a&&e>=13&&e<=19?"few":"other"},fields:{year:{displayName:"bliadhna",relative:{0:"am bliadhna",1:"an ath-bhliadhna","-2":"a-bhòn-uiridh","-1":"an-uiridh"},relativeTime:{future:{one:"an ceann {0} bhliadhna",two:"an ceann {0} bhliadhna",few:"an ceann {0} bliadhnaichean",other:"an ceann {0} bliadhna"},past:{one:"{0} bhliadhna air ais",two:"{0} bhliadhna air ais",few:"{0} bhliadhnaichean air ais",other:"{0} bliadhna air ais"}}},"year-short":{displayName:"blia.",relative:{0:"am bliadhna",1:"an ath-bhliadhna","-2":"a-bhòn-uiridh","-1":"an-uiridh"},relativeTime:{future:{one:"an {0} bhlia.",two:"an {0} bhlia.",few:"an {0} blia.",other:"an {0} blia."},past:{one:"o {0} bhlia.",two:"o {0} bhlia.",few:"o {0} blia.",other:"o {0} blia."}}},month:{displayName:"mìos",relative:{0:"am mìos seo",1:"an ath-mhìos","-1":"am mìos seo chaidh"},relativeTime:{future:{one:"an ceann {0} mhìosa",two:"an ceann {0} mhìosa",few:"an ceann {0} mìosan",other:"an ceann {0} mìosa"},past:{one:"{0} mhìos air ais",two:"{0} mhìos air ais",few:"{0} mìosan air ais",other:"{0} mìos air ais"}}},"month-short":{displayName:"mìos",relative:{0:"am mìos seo",1:"an ath-mhìos","-1":"am mìos sa chaidh"},relativeTime:{future:{one:"an {0} mhìos.",two:"an {0} mhìos.",few:"an {0} mìos.",other:"an {0} mìos."},past:{one:"o {0} mhìos.",two:"o {0} mhìos.",few:"o {0} mìos.",other:"o {0} mìos."}}},day:{displayName:"latha",relative:{0:"an-diugh",1:"a-màireach",2:"an-earar",3:"an-eararais","-2":"a-bhòin-dè","-1":"an-dè"},relativeTime:{future:{one:"an ceann {0} latha",two:"an ceann {0} latha",few:"an ceann {0} làithean",other:"an ceann {0} latha"},past:{one:"{0} latha air ais",two:"{0} latha air ais",few:"{0} làithean air ais",other:"{0} latha air ais"}}},"day-short":{displayName:"là",relative:{0:"an-diugh",1:"a-màireach",2:"an-earar",3:"an-eararais","-2":"a-bhòin-dè","-1":"an-dè"},relativeTime:{future:{one:"an {0} là",two:"an {0} là",few:"an {0} là.",other:"an {0} là"},past:{one:"o {0} là",two:"o {0} là",few:"o {0} là.",other:"o {0} là"}}},hour:{displayName:"uair a thìde",relative:{0:"this hour"},relativeTime:{future:{one:"an ceann {0} uair a thìde",two:"an ceann {0} uair a thìde",few:"an ceann {0} uairean a thìde",other:"an ceann {0} uair a thìde"},past:{one:"{0} uair a thìde air ais",two:"{0} uair a thìde air ais",few:"{0} uairean a thìde air ais",other:"{0} uair a thìde air ais"}}},"hour-short":{displayName:"uair",relative:{0:"this hour"},relativeTime:{future:{one:"an {0} uair",two:"an {0} uair",few:"an {0} uair.",other:"an {0} uair"},past:{one:"o {0} uair",two:"o {0} uair",few:"o {0} uair.",other:"o {0} uair"}}},minute:{displayName:"mionaid",relative:{0:"this minute"},relativeTime:{future:{one:"an ceann {0} mhionaid",two:"an ceann {0} mhionaid",few:"an ceann {0} mionaidean",other:"an ceann {0} mionaid"},past:{one:"{0} mhionaid air ais",two:"{0} mhionaid air ais",few:"{0} mionaidean air ais",other:"{0} mionaid air ais"}}},"minute-short":{displayName:"mion.",relative:{0:"this minute"},relativeTime:{future:{one:"an {0} mhion.",two:"an {0} mhion.",few:"an {0} mion.",other:"an {0} mion."},past:{one:"o {0} mhion.",two:"o {0} mhion.",few:"o {0} mion.",other:"o {0} mion."}}},second:{displayName:"diog",relative:{0:"an-dràsta"},relativeTime:{future:{one:"an ceann {0} diog",two:"an ceann {0} dhiog",few:"an ceann {0} diogan",other:"an ceann {0} diog"},past:{one:"{0} diog air ais",two:"{0} dhiog air ais",few:"{0} diogan air ais",other:"{0} diog air ais"}}},"second-short":{displayName:"diog",relative:{0:"an-dràsta"},relativeTime:{future:{one:"an {0} diog",two:"an {0} dhiog",few:"an {0} diog.",other:"an {0} diog"},past:{one:"o {0} diog",two:"o {0} dhiog",few:"o {0} diog.",other:"o {0} diog"}}}}}),a.__addLocaleData({locale:"gl",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"},fields:{year:{displayName:"ano",relative:{0:"este ano",1:"o próximo ano","-1":"o ano pasado"},relativeTime:{future:{one:"en {0} ano",other:"en {0} anos"},past:{one:"hai {0} ano",other:"hai {0} anos"}}},"year-short":{displayName:"ano",relative:{0:"este ano",1:"seguinte ano","-1":"ano pasado"},relativeTime:{future:{one:"en {0} ano",other:"en {0} anos"},past:{one:"hai {0} ano",other:"hai {0} anos"}}},month:{displayName:"mes",relative:{0:"este mes",1:"o próximo mes","-1":"o mes pasado"},relativeTime:{future:{one:"en {0} mes",other:"en {0} meses"},past:{one:"hai {0} mes",other:"hai {0} meses"}}},"month-short":{displayName:"mes",relative:{0:"este m.",1:"m. seguinte","-1":"m. pasado"},relativeTime:{future:{one:"en {0} mes",other:"en {0} mes."},past:{one:"hai {0} mes",other:"hai {0} mes."}}},day:{displayName:"día",relative:{0:"hoxe",1:"mañá",2:"pasadomañá","-2":"antonte","-1":"onte"},relativeTime:{future:{one:"en {0} día",other:"en {0} días"},past:{one:"hai {0} día",other:"hai {0} días"}}},"day-short":{displayName:"d",relative:{0:"hoxe",1:"mañá",2:"pasadomañá","-2":"antonte","-1":"onte"},relativeTime:{future:{one:"en {0} día",other:"en {0} días"},past:{one:"hai {0} día",other:"hai {0} días"}}},hour:{displayName:"hora",relative:{0:"nesta hora"},relativeTime:{future:{one:"en {0} hora",other:"en {0} horas"},past:{one:"hai {0} hora",other:"hai {0} horas"}}},"hour-short":{displayName:"h",relative:{0:"nesta hora"},relativeTime:{future:{one:"en {0} h",other:"en {0} h"},past:{one:"hai {0} h",other:"hai {0} h"}}},minute:{displayName:"minuto",relative:{0:"neste minuto"},relativeTime:{future:{one:"en {0} minuto",other:"en {0} minutos"},past:{one:"hai {0} minuto",other:"hai {0} minutos"}}},"minute-short":{displayName:"min",relative:{0:"neste minuto"},relativeTime:{future:{one:"en {0} min",other:"en {0} min"},past:{one:"hai {0} min",other:"hai {0} min"}}},second:{displayName:"segundo",relative:{0:"agora"},relativeTime:{future:{one:"en {0} segundo",other:"en {0} segundos"},past:{one:"hai {0} segundo",other:"hai {0} segundos"}}},"second-short":{displayName:"s",relative:{0:"agora"},relativeTime:{future:{one:"en {0} s",other:"en {0} s"},past:{one:"hai {0} s",other:"hai {0} s"}}}}}),a.__addLocaleData({locale:"gsw",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Jaar",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Jaar",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Monet",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Monet",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Tag",relative:{0:"hüt",1:"moorn",2:"übermoorn","-2":"vorgeschter","-1":"geschter"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Tag",relative:{0:"hüt",1:"moorn",2:"übermoorn","-2":"vorgeschter","-1":"geschter"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Schtund",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Schtund",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minuute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minuute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"gsw-FR",parentLocale:"gsw"}),a.__addLocaleData({locale:"gsw-LI",parentLocale:"gsw"}),a.__addLocaleData({locale:"gu",pluralRuleFunction:function(e,t){return t?1==e?"one":2==e||3==e?"two":4==e?"few":6==e?"many":"other":e>=0&&e<=1?"one":"other"},fields:{year:{displayName:"વર્ષ",relative:{0:"આ વર્ષે",1:"આવતા વર્ષે","-1":"ગયા વર્ષે"},relativeTime:{future:{one:"{0} વર્ષમાં",other:"{0} વર્ષમાં"},past:{one:"{0} વર્ષ પહેલાં",other:"{0} વર્ષ પહેલાં"}}},"year-short":{displayName:"વ.",relative:{0:"આ વર્ષે",1:"આવતા વર્ષે","-1":"ગયા વર્ષે"},relativeTime:{future:{one:"{0} વર્ષમાં",other:"{0} વર્ષમાં"},past:{one:"{0} વર્ષ પહેલાં",other:"{0} વર્ષ પહેલાં"}}},month:{displayName:"મહિનો",relative:{0:"આ મહિને",1:"આવતા મહિને","-1":"ગયા મહિને"},relativeTime:{future:{one:"{0} મહિનામાં",other:"{0} મહિનામાં"},past:{one:"{0} મહિના પહેલાં",other:"{0} મહિના પહેલાં"}}},"month-short":{displayName:"મ.",relative:{0:"આ મહિને",1:"આવતા મહિને","-1":"ગયા મહિને"},relativeTime:{future:{one:"{0} મહિનામાં",other:"{0} મહિનામાં"},past:{one:"{0} મહિના પહેલાં",other:"{0} મહિના પહેલાં"}}},day:{displayName:"દિવસ",relative:{0:"આજે",1:"આવતીકાલે",2:"પરમદિવસે","-2":"ગયા પરમદિવસે","-1":"ગઈકાલે"},relativeTime:{future:{one:"{0} દિવસમાં",other:"{0} દિવસમાં"},past:{one:"{0} દિવસ પહેલાં",other:"{0} દિવસ પહેલાં"}}},"day-short":{displayName:"દિવસ",relative:{0:"આજે",1:"આવતીકાલે",2:"પરમદિવસે","-2":"ગયા પરમદિવસે","-1":"ગઈકાલે"},relativeTime:{future:{one:"{0} દિવસમાં",other:"{0} દિવસમાં"},past:{one:"{0} દિવસ પહેલાં",other:"{0} દિવસ પહેલાં"}}},hour:{displayName:"કલાક",relative:{0:"આ કલાક"},relativeTime:{future:{one:"{0} કલાકમાં",other:"{0} કલાકમાં"},past:{one:"{0} કલાક પહેલાં",other:"{0} કલાક પહેલાં"}}},"hour-short":{displayName:"ક.",relative:{0:"આ કલાક"},relativeTime:{future:{one:"{0} કલાકમાં",other:"{0} કલાકમાં"},past:{one:"{0} કલાક પહેલાં",other:"{0} કલાક પહેલાં"}}},minute:{displayName:"મિનિટ",relative:{0:"આ મિનિટ"},relativeTime:{future:{one:"{0} મિનિટમાં",other:"{0} મિનિટમાં"},past:{one:"{0} મિનિટ પહેલાં",other:"{0} મિનિટ પહેલાં"}}},"minute-short":{displayName:"મિ.",relative:{0:"આ મિનિટ"},relativeTime:{future:{one:"{0} મિનિટમાં",other:"{0} મિનિટમાં"},past:{one:"{0} મિનિટ પહેલાં",other:"{0} મિનિટ પહેલાં"}}},second:{displayName:"સેકન્ડ",relative:{0:"હમણાં"},relativeTime:{future:{one:"{0} સેકંડમાં",other:"{0} સેકંડમાં"},past:{one:"{0} સેકંડ પહેલાં",other:"{0} સેકંડ પહેલાં"}}},"second-short":{displayName:"સે.",relative:{0:"હમણાં"},relativeTime:{future:{one:"{0} સેકંડમાં",other:"{0} સેકંડમાં"},past:{one:"{0} સેકંડ પહેલાં",other:"{0} સેકંડ પહેલાં"}}}}}),a.__addLocaleData({locale:"guw",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"guz",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Omwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Omwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Omotienyi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Omotienyi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Rituko",relative:{0:"Rero",1:"Mambia","-1":"Igoro"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Rituko",relative:{0:"Rero",1:"Mambia","-1":"Igoro"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Ensa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Ensa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Edakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Edakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Esekendi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Esekendi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"gv",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=a.slice(-1),i=a.slice(-2);return t?"other":n&&1==o?"one":n&&2==o?"two":!n||0!=i&&20!=i&&40!=i&&60!=i&&80!=i?n?"other":"many":"few"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ha",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Shekara",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Shekara",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Wata",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Wata",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Kwana",relative:{0:"Yau",1:"Gobe","-1":"Jiya"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Kwana",relative:{0:"Yau",1:"Gobe","-1":"Jiya"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Awa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Awa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Daƙiƙa",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Daƙiƙa",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ha-Arab",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ha-GH",parentLocale:"ha"}),a.__addLocaleData({locale:"ha-NE",parentLocale:"ha"}),a.__addLocaleData({locale:"haw",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"he",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=Number(r[0])==e,i=o&&r[0].slice(-1);return t?"other":1==e&&n?"one":2==a&&n?"two":n&&(e<0||e>10)&&o&&0==i?"many":"other"},fields:{year:{displayName:"שנה",relative:{0:"השנה",1:"השנה הבאה","-1":"השנה שעברה"},relativeTime:{future:{one:"בעוד שנה",two:"בעוד שנתיים",many:"בעוד {0} שנה",other:"בעוד {0} שנים"},past:{one:"לפני שנה",two:"לפני שנתיים",many:"לפני {0} שנה",other:"לפני {0} שנים"}}},"year-short":{displayName:"שנ׳",relative:{0:"השנה",1:"השנה הבאה","-1":"השנה שעברה"},relativeTime:{future:{one:"בעוד שנה",two:"בעוד שנתיים",many:"בעוד {0} שנה",other:"בעוד {0} שנים"},past:{one:"לפני שנה",two:"לפני שנתיים",many:"לפני {0} שנה",other:"לפני {0} שנים"}}},month:{displayName:"חודש",relative:{0:"החודש",1:"החודש הבא","-1":"החודש שעבר"},relativeTime:{future:{one:"בעוד חודש",two:"בעוד חודשיים",many:"בעוד {0} חודשים",other:"בעוד {0} חודשים"},past:{one:"לפני חודש",two:"לפני חודשיים",many:"לפני {0} חודשים",other:"לפני {0} חודשים"}}},"month-short":{displayName:"חו׳",relative:{0:"החודש",1:"החודש הבא","-1":"החודש שעבר"},relativeTime:{future:{one:"בעוד חודש",two:"בעוד חודשיים",many:"בעוד {0} חודשים",other:"בעוד {0} חודשים"},past:{one:"לפני חודש",two:"לפני חודשיים",many:"לפני {0} חודשים",other:"לפני {0} חודשים"}}},day:{displayName:"יום",relative:{0:"היום",1:"מחר",2:"מחרתיים","-2":"שלשום","-1":"אתמול"},relativeTime:{future:{one:"בעוד יום {0}",two:"בעוד יומיים",many:"בעוד {0} ימים",other:"בעוד {0} ימים"},past:{one:"לפני יום {0}",two:"לפני יומיים",many:"לפני {0} ימים",other:"לפני {0} ימים"}}},"day-short":{displayName:"יום",relative:{0:"היום",1:"מחר",2:"מחרתיים","-2":"שלשום","-1":"אתמול"},relativeTime:{future:{one:"מחר",two:"בעוד יומיים",many:"בעוד {0} יום",other:"בעוד {0} ימים"},past:{one:"אתמול",two:"לפני יומיים",many:"לפני {0} ימים",other:"לפני {0} ימ׳"}}},hour:{displayName:"שעה",relative:{0:"בשעה זו"},relativeTime:{future:{one:"בעוד שעה",two:"בעוד שעתיים",many:"בעוד {0} שעות",other:"בעוד {0} שעות"},past:{one:"לפני שעה",two:"לפני שעתיים",many:"לפני {0} שעות",other:"לפני {0} שעות"}}},"hour-short":{displayName:"שעה",relative:{0:"בשעה זו"},relativeTime:{future:{one:"בעוד שעה",two:"בעוד שעתיים",many:"בעוד {0} שע׳",other:"בעוד {0} שע׳"},past:{one:"לפני שעה",two:"לפני שעתיים",many:"לפני {0} שע׳",other:"לפני {0} שע׳"}}},minute:{displayName:"דקה",relative:{0:"בדקה זו"},relativeTime:{future:{one:"בעוד דקה",two:"בעוד שתי דקות",many:"בעוד {0} דקות",other:"בעוד {0} דקות"},past:{one:"לפני דקה",two:"לפני שתי דקות",many:"לפני {0} דקות",other:"לפני {0} דקות"}}},"minute-short":{displayName:"דק׳",relative:{0:"בדקה זו"},relativeTime:{future:{one:"בעוד דקה",two:"בעוד שתי דק׳",many:"בעוד {0} דק׳",other:"בעוד {0} דק׳"},past:{one:"לפני דקה",two:"לפני {0} דק׳",many:"לפני {0} דק׳",other:"לפני {0} דק׳"}}},second:{displayName:"שנייה",relative:{0:"עכשיו"},relativeTime:{future:{one:"בעוד שנייה",two:"בעוד שתי שניות",many:"בעוד {0} שניות",other:"בעוד {0} שניות"},past:{one:"לפני שנייה",two:"לפני שתי שניות",many:"לפני {0} שניות",other:"לפני {0} שניות"}}},"second-short":{displayName:"שנ׳",relative:{0:"עכשיו"},relativeTime:{future:{one:"בעוד שנ׳",two:"בעוד שתי שנ׳",many:"בעוד {0} שנ׳",other:"בעוד {0} שנ׳"},past:{one:"לפני שנ׳",two:"לפני שתי שנ׳",many:"לפני {0} שנ׳",other:"לפני {0} שנ׳"}}}}}),a.__addLocaleData({locale:"hi",pluralRuleFunction:function(e,t){return t?1==e?"one":2==e||3==e?"two":4==e?"few":6==e?"many":"other":e>=0&&e<=1?"one":"other"},fields:{year:{displayName:"वर्ष",relative:{0:"इस वर्ष",1:"अगला वर्ष","-1":"पिछला वर्ष"},relativeTime:{future:{one:"{0} वर्ष में",other:"{0} वर्ष में"},past:{one:"{0} वर्ष पहले",other:"{0} वर्ष पहले"}}},"year-short":{displayName:"वर्ष",relative:{0:"इस वर्ष",1:"अगला वर्ष","-1":"पिछला वर्ष"},relativeTime:{future:{one:"{0} वर्ष में",other:"{0} वर्ष में"},past:{one:"{0} वर्ष पहले",other:"{0} वर्ष पहले"}}},month:{displayName:"माह",relative:{0:"इस माह",1:"अगला माह","-1":"पिछला माह"},relativeTime:{future:{one:"{0} माह में",other:"{0} माह में"},past:{one:"{0} माह पहले",other:"{0} माह पहले"}}},"month-short":{displayName:"माह",relative:{0:"इस माह",1:"अगला माह","-1":"पिछला माह"},relativeTime:{future:{one:"{0} माह में",other:"{0} माह में"},past:{one:"{0} माह पहले",other:"{0} माह पहले"}}},day:{displayName:"दिन",relative:{0:"आज",1:"कल",2:"परसों","-2":"बीता परसों","-1":"कल"},relativeTime:{future:{one:"{0} दिन में",other:"{0} दिन में"},past:{one:"{0} दिन पहले",other:"{0} दिन पहले"}}},"day-short":{displayName:"दिन",relative:{0:"आज",1:"कल",2:"परसों","-2":"बीता परसों","-1":"कल"},relativeTime:{future:{one:"{0} दिन में",other:"{0} दिन में"},past:{one:"{0} दिन पहले",other:"{0} दिन पहले"}}},hour:{displayName:"घंटा",relative:{0:"यह घंटा"},relativeTime:{future:{one:"{0} घंटे में",other:"{0} घंटे में"},past:{one:"{0} घंटे पहले",other:"{0} घंटे पहले"}}},"hour-short":{displayName:"घं.",relative:{0:"यह घंटा"},relativeTime:{future:{one:"{0} घं. में",other:"{0} घं. में"},past:{one:"{0} घं. पहले",other:"{0} घं. पहले"}}},minute:{displayName:"मिनट",relative:{0:"यह मिनट"},relativeTime:{future:{one:"{0} मिनट में",other:"{0} मिनट में"},past:{one:"{0} मिनट पहले",other:"{0} मिनट पहले"}}},"minute-short":{displayName:"मि.",relative:{0:"यह मिनट"},relativeTime:{future:{one:"{0} मि. में",other:"{0} मि. में"},past:{one:"{0} मि. पहले",other:"{0} मि. पहले"}}},second:{displayName:"सेकंड",relative:{0:"अब"},relativeTime:{future:{one:"{0} सेकंड में",other:"{0} सेकंड में"},past:{one:"{0} सेकंड पहले",other:"{0} सेकंड पहले"}}},"second-short":{displayName:"से.",relative:{0:"अब"},relativeTime:{future:{one:"{0} से. में",other:"{0} से. में"},past:{one:"{0} से. पहले",other:"{0} से. पहले"}}}}}),a.__addLocaleData({locale:"hr",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=a.slice(-2),s=n.slice(-1),u=n.slice(-2);return t?"other":o&&1==i&&11!=l||1==s&&11!=u?"one":o&&i>=2&&i<=4&&(l<12||l>14)||s>=2&&s<=4&&(u<12||u>14)?"few":"other"},fields:{year:{displayName:"godina",relative:{0:"ove godine",1:"sljedeće godine","-1":"prošle godine"},relativeTime:{future:{one:"za {0} godinu",few:"za {0} godine",other:"za {0} godina"},past:{one:"prije {0} godinu",few:"prije {0} godine",other:"prije {0} godina"}}},"year-short":{displayName:"g.",relative:{0:"ove god.",1:"sljedeće god.","-1":"prošle god."},relativeTime:{future:{one:"za {0} g.",few:"za {0} g.",other:"za {0} g."},past:{one:"prije {0} g.",few:"prije {0} g.",other:"prije {0} g."}}},month:{displayName:"mjesec",relative:{0:"ovaj mjesec",1:"sljedeći mjesec","-1":"prošli mjesec"},relativeTime:{future:{one:"za {0} mjesec",few:"za {0} mjeseca",other:"za {0} mjeseci"},past:{one:"prije {0} mjesec",few:"prije {0} mjeseca",other:"prije {0} mjeseci"}}},"month-short":{displayName:"mj.",relative:{0:"ovaj mj.",1:"sljedeći mj.","-1":"prošli mj."},relativeTime:{future:{one:"za {0} mj.",few:"za {0} mj.",other:"za {0} mj."},past:{one:"prije {0} mj.",few:"prije {0} mj.",other:"prije {0} mj."}}},day:{displayName:"dan",relative:{0:"danas",1:"sutra",2:"prekosutra","-2":"prekjučer","-1":"jučer"},relativeTime:{future:{one:"za {0} dan",few:"za {0} dana",other:"za {0} dana"},past:{one:"prije {0} dan",few:"prije {0} dana",other:"prije {0} dana"}}},"day-short":{displayName:"d.",relative:{0:"danas",1:"sutra",2:"prekosutra","-2":"prekjučer","-1":"jučer"},relativeTime:{future:{one:"za {0} dan",few:"za {0} dana",other:"za {0} dana"},past:{one:"prije {0} dan",few:"prije {0} dana",other:"prije {0} dana"}}},hour:{displayName:"sat",relative:{0:"ovaj sat"},relativeTime:{future:{one:"za {0} sat",few:"za {0} sata",other:"za {0} sati"},past:{one:"prije {0} sat",few:"prije {0} sata",other:"prije {0} sati"}}},"hour-short":{displayName:"h",relative:{0:"ovaj sat"},relativeTime:{future:{one:"za {0} h",few:"za {0} h",other:"za {0} h"},past:{one:"prije {0} h",few:"prije {0} h",other:"prije {0} h"}}},minute:{displayName:"minuta",relative:{0:"ova minuta"},relativeTime:{future:{one:"za {0} minutu",few:"za {0} minute",other:"za {0} minuta"},past:{one:"prije {0} minutu",few:"prije {0} minute",other:"prije {0} minuta"}}},"minute-short":{displayName:"min",relative:{0:"ova minuta"},relativeTime:{future:{one:"za {0} min",few:"za {0} min",other:"za {0} min"},past:{one:"prije {0} min",few:"prije {0} min",other:"prije {0} min"}}},second:{displayName:"sekunda",relative:{0:"sad"},relativeTime:{future:{one:"za {0} sekundu",few:"za {0} sekunde",other:"za {0} sekundi"},past:{one:"prije {0} sekundu",few:"prije {0} sekunde",other:"prije {0} sekundi"}}},"second-short":{displayName:"s",relative:{0:"sad"},relativeTime:{future:{one:"za {0} s",few:"za {0} s",other:"za {0} s"},past:{one:"prije {0} s",few:"prije {0} s",other:"prije {0} s"}}}}}),a.__addLocaleData({locale:"hr-BA",parentLocale:"hr"}),a.__addLocaleData({locale:"hsb",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-2),l=n.slice(-2);return t?"other":o&&1==i||1==l?"one":o&&2==i||2==l?"two":o&&(3==i||4==i)||3==l||4==l?"few":"other"},fields:{year:{displayName:"lěto",relative:{0:"lětsa",1:"klětu","-1":"loni"},relativeTime:{future:{one:"za {0} lěto",two:"za {0} lěće",few:"za {0} lěta",other:"za {0} lět"},past:{one:"před {0} lětom",two:"před {0} lětomaj",few:"před {0} lětami",other:"před {0} lětami"}}},"year-short":{displayName:"l.",relative:{0:"lětsa",1:"klětu","-1":"loni"},relativeTime:{future:{one:"za {0} l.",two:"za {0} l.",few:"za {0} l.",other:"za {0} l."},past:{one:"před {0} l.",two:"před {0} l.",few:"před {0} l.",other:"před {0} l."}}},month:{displayName:"měsac",relative:{0:"tutón měsac",1:"přichodny měsac","-1":"zašły měsac"},relativeTime:{future:{one:"za {0} měsac",two:"za {0} měsacaj",few:"za {0} měsacy",other:"za {0} měsacow"},past:{one:"před {0} měsacom",two:"před {0} měsacomaj",few:"před {0} měsacami",other:"před {0} měsacami"}}},"month-short":{displayName:"měs.",relative:{0:"tutón měsac",1:"přichodny měsac","-1":"zašły měsac"},relativeTime:{future:{one:"za {0} měs.",two:"za {0} měs.",few:"za {0} měs.",other:"za {0} měs."},past:{one:"před {0} měs.",two:"před {0} měs.",few:"před {0} měs.",other:"před {0} měs."}}},day:{displayName:"dźeń",relative:{0:"dźensa",1:"jutře","-1":"wčera"},relativeTime:{future:{one:"za {0} dźeń",two:"za {0} dnjej",few:"za {0} dny",other:"za {0} dnjow"},past:{one:"před {0} dnjom",two:"před {0} dnjomaj",few:"před {0} dnjemi",other:"před {0} dnjemi"}}},"day-short":{displayName:"dźeń",relative:{0:"dźensa",1:"jutře","-1":"wčera"},relativeTime:{future:{one:"za {0} dźeń",two:"za {0} dnj.",few:"za {0} dny",other:"za {0} dnj."},past:{one:"před {0} dnj.",two:"před {0} dnj.",few:"před {0} dnj.",other:"před {0} dnj."}}},hour:{displayName:"hodźina",relative:{0:"this hour"},relativeTime:{future:{one:"za {0} hodźinu",two:"za {0} hodźinje",few:"za {0} hodźiny",other:"za {0} hodźin"},past:{one:"před {0} hodźinu",two:"před {0} hodźinomaj",few:"před {0} hodźinami",other:"před {0} hodźinami"}}},"hour-short":{displayName:"hodź.",relative:{0:"this hour"},relativeTime:{future:{one:"za {0} hodź.",two:"za {0} hodź.",few:"za {0} hodź.",other:"za {0} hodź."},past:{one:"před {0} hodź.",two:"před {0} hodź.",few:"před {0} hodź.",other:"před {0} hodź."}}},minute:{displayName:"minuta",relative:{0:"this minute"},relativeTime:{future:{one:"za {0} minutu",two:"za {0} minuće",few:"za {0} minuty",other:"za {0} minutow"},past:{one:"před {0} minutu",two:"před {0} minutomaj",few:"před {0} minutami",other:"před {0} minutami"}}},"minute-short":{displayName:"min.",relative:{0:"this minute"},relativeTime:{future:{one:"za {0} min.",two:"za {0} min.",few:"za {0} min.",other:"za {0} min."},past:{one:"před {0} min.",two:"před {0} min.",few:"před {0} min.",other:"před {0} min."}}},second:{displayName:"sekunda",relative:{0:"now"},relativeTime:{future:{one:"za {0} sekundu",two:"za {0} sekundźe",few:"za {0} sekundy",other:"za {0} sekundow"},past:{one:"před {0} sekundu",two:"před {0} sekundomaj",few:"před {0} sekundami",other:"před {0} sekundami"}}},"second-short":{displayName:"sek.",relative:{0:"now"},relativeTime:{future:{one:"za {0} sek.",two:"za {0} sek.",few:"za {0} sek.",other:"za {0} sek."},past:{one:"před {0} sek.",two:"před {0} sek.",few:"před {0} sek.",other:"před {0} sek."}}}}}),a.__addLocaleData({locale:"hu",pluralRuleFunction:function(e,t){return t?1==e||5==e?"one":"other":1==e?"one":"other"},fields:{year:{displayName:"év",relative:{0:"ez az év",1:"következő év","-1":"előző év"},relativeTime:{future:{one:"{0} év múlva",other:"{0} év múlva"},past:{one:"{0} évvel ezelőtt",other:"{0} évvel ezelőtt"}}},"year-short":{displayName:"év",relative:{0:"ez az év",1:"következő év","-1":"előző év"},relativeTime:{future:{one:"{0} év múlva",other:"{0} év múlva"},past:{one:"{0} évvel ezelőtt",other:"{0} évvel ezelőtt"}}},month:{displayName:"hónap",relative:{0:"ez a hónap",1:"következő hónap","-1":"előző hónap"},relativeTime:{future:{one:"{0} hónap múlva",other:"{0} hónap múlva"},past:{one:"{0} hónappal ezelőtt",other:"{0} hónappal ezelőtt"}}},"month-short":{displayName:"hónap",relative:{0:"ez a hónap",1:"következő hónap","-1":"előző hónap"},relativeTime:{future:{one:"{0} hónap múlva",other:"{0} hónap múlva"},past:{one:"{0} hónappal ezelőtt",other:"{0} hónappal ezelőtt"}}},day:{displayName:"nap",relative:{0:"ma",1:"holnap",2:"holnapután","-2":"tegnapelőtt","-1":"tegnap"},relativeTime:{future:{one:"{0} nap múlva",other:"{0} nap múlva"},past:{one:"{0} nappal ezelőtt",other:"{0} nappal ezelőtt"}}},"day-short":{displayName:"nap",relative:{0:"ma",1:"holnap",2:"holnapután","-2":"tegnapelőtt","-1":"tegnap"},relativeTime:{future:{one:"{0} nap múlva",other:"{0} nap múlva"},past:{one:"{0} napja",other:"{0} napja"}}},hour:{displayName:"óra",relative:{0:"ebben az órában"},relativeTime:{future:{one:"{0} óra múlva",other:"{0} óra múlva"},past:{one:"{0} órával ezelőtt",other:"{0} órával ezelőtt"}}},"hour-short":{displayName:"óra",relative:{0:"ebben az órában"},relativeTime:{future:{one:"{0} óra múlva",other:"{0} óra múlva"},past:{one:"{0} órával ezelőtt",other:"{0} órával ezelőtt"}}},minute:{displayName:"perc",relative:{0:"ebben a percben"},relativeTime:{future:{one:"{0} perc múlva",other:"{0} perc múlva"},past:{one:"{0} perccel ezelőtt",other:"{0} perccel ezelőtt"}}},"minute-short":{displayName:"perc",relative:{0:"ebben a percben"},relativeTime:{future:{one:"{0} perc múlva",other:"{0} perc múlva"},past:{one:"{0} perccel ezelőtt",other:"{0} perccel ezelőtt"}}},second:{displayName:"másodperc",relative:{0:"most"},relativeTime:{future:{one:"{0} másodperc múlva",other:"{0} másodperc múlva"},past:{one:"{0} másodperccel ezelőtt",other:"{0} másodperccel ezelőtt"}}},"second-short":{displayName:"másodperc",relative:{0:"most"},relativeTime:{future:{one:"{0} másodperc múlva",other:"{0} másodperc múlva"},past:{one:"{0} másodperccel ezelőtt",other:"{0} másodperccel ezelőtt"}}}}}),a.__addLocaleData({locale:"hy",pluralRuleFunction:function(e,t){return t?1==e?"one":"other":e>=0&&e<2?"one":"other"},fields:{year:{displayName:"տարի",relative:{0:"այս տարի",1:"հաջորդ տարի","-1":"նախորդ տարի"},relativeTime:{future:{one:"{0} տարուց",other:"{0} տարուց"},past:{one:"{0} տարի առաջ",other:"{0} տարի առաջ"}}},"year-short":{displayName:"տ",relative:{0:"այս տարի",1:"հաջորդ տարի","-1":"նախորդ տարի"},relativeTime:{future:{one:"{0} տարուց",other:"{0} տարուց"},past:{one:"{0} տ առաջ",other:"{0} տ առաջ"}}},month:{displayName:"ամիս",relative:{0:"այս ամիս",1:"հաջորդ ամիս","-1":"նախորդ ամիս"},relativeTime:{future:{one:"{0} ամսից",other:"{0} ամսից"},past:{one:"{0} ամիս առաջ",other:"{0} ամիս առաջ"}}},"month-short":{displayName:"ամս",relative:{0:"այս ամիս",1:"հաջորդ ամիս","-1":"անցյալ ամիս"},relativeTime:{future:{one:"{0} ամսից",other:"{0} ամսից"},past:{one:"{0} ամիս առաջ",other:"{0} ամիս առաջ"}}},day:{displayName:"օր",relative:{0:"այսօր",1:"վաղը",2:"վաղը չէ մյուս օրը","-2":"երեկ չէ առաջի օրը","-1":"երեկ"},relativeTime:{future:{one:"{0} օրից",other:"{0} օրից"},past:{one:"{0} օր առաջ",other:"{0} օր առաջ"}}},"day-short":{displayName:"օր",relative:{0:"այսօր",1:"վաղը",2:"վաղը չէ մյուս օրը","-2":"երեկ չէ առաջի օրը","-1":"երեկ"},relativeTime:{future:{one:"{0} օրից",other:"{0} օրից"},past:{one:"{0} օր առաջ",other:"{0} օր առաջ"}}},hour:{displayName:"ժամ",relative:{0:"այս ժամին"},relativeTime:{future:{one:"{0} ժամից",other:"{0} ժամից"},past:{one:"{0} ժամ առաջ",other:"{0} ժամ առաջ"}}},"hour-short":{displayName:"ժ",relative:{0:"այս ժամին"},relativeTime:{future:{one:"{0} ժ-ից",other:"{0} ժ-ից"},past:{one:"{0} ժ առաջ",other:"{0} ժ առաջ"}}},minute:{displayName:"րոպե",relative:{0:"այս րոպեին"},relativeTime:{future:{one:"{0} րոպեից",other:"{0} րոպեից"},past:{one:"{0} րոպե առաջ",other:"{0} րոպե առաջ"}}},"minute-short":{displayName:"ր",relative:{0:"այս րոպեին"},relativeTime:{future:{one:"{0} ր-ից",other:"{0} ր-ից"},past:{one:"{0} ր առաջ",other:"{0} ր առաջ"}}},second:{displayName:"վայրկյան",relative:{0:"այժմ"},relativeTime:{future:{one:"{0} վայրկյանից",other:"{0} վայրկյանից"},past:{one:"{0} վայրկյան առաջ",other:"{0} վայրկյան առաջ"}}},"second-short":{displayName:"վ",relative:{0:"այժմ"},relativeTime:{future:{one:"{0} վրկ-ից",other:"{0} վրկ-ից"},past:{one:"{0} վրկ առաջ",other:"{0} վրկ առաջ"}}}}}),a.__addLocaleData({locale:"id",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Tahun",relative:{0:"tahun ini",1:"tahun depan","-1":"tahun lalu"},relativeTime:{future:{other:"Dalam {0} tahun"},past:{other:"{0} tahun yang lalu"}}},"year-short":{displayName:"thn.",relative:{0:"tahun ini",1:"tahun depan","-1":"tahun lalu"},relativeTime:{future:{other:"dlm {0} thn"},past:{other:"{0} thn lalu"}}},month:{displayName:"Bulan",relative:{0:"bulan ini",1:"Bulan berikutnya","-1":"bulan lalu"},relativeTime:{future:{other:"Dalam {0} bulan"},past:{other:"{0} bulan yang lalu"}}},"month-short":{displayName:"bln.",relative:{0:"bulan ini",1:"Bulan berikutnya","-1":"bulan lalu"},relativeTime:{future:{other:"dlm {0} bln"},past:{other:"{0} bln lalu"}}},day:{displayName:"Hari",relative:{0:"hari ini",1:"besok",2:"lusa","-2":"kemarin dulu","-1":"kemarin"},relativeTime:{future:{other:"Dalam {0} hari"},past:{other:"{0} hari yang lalu"}}},"day-short":{displayName:"h",relative:{0:"hari ini",1:"besok",2:"lusa","-2":"kemarin dulu","-1":"kemarin"},relativeTime:{future:{other:"dalam {0} h"},past:{other:"{0} h lalu"}}},hour:{displayName:"Jam",relative:{0:"jam ini"},relativeTime:{future:{other:"Dalam {0} jam"},past:{other:"{0} jam yang lalu"}}},"hour-short":{displayName:"jam",relative:{0:"jam ini"},relativeTime:{future:{other:"Dalam {0} jam"},past:{other:"{0} jam lalu"}}},minute:{displayName:"Menit",relative:{0:"menit ini"},relativeTime:{future:{other:"Dalam {0} menit"},past:{other:"{0} menit yang lalu"}}},"minute-short":{displayName:"mnt.",relative:{0:"menit ini"},relativeTime:{future:{other:"dlm {0} mnt"},past:{other:"{0} mnt lalu"}}},second:{displayName:"Detik",relative:{0:"sekarang"},relativeTime:{future:{other:"Dalam {0} detik"},past:{other:"{0} detik yang lalu"}}},"second-short":{displayName:"dtk.",relative:{0:"sekarang"},relativeTime:{future:{other:"dlm {0} dtk"},past:{other:"{0} dtk lalu"}}}}}),a.__addLocaleData({locale:"ig",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Afọ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Afọ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Ọnwa",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Ọnwa",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ụbọchị",relative:{0:"Taata",1:"Echi","-1":"Nnyaafụ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Ụbọchị",relative:{0:"Taata",1:"Echi","-1":"Nnyaafụ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Elekere",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Elekere",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Nkeji",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Nkeji",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Nkejinta",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Nkejinta",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ii",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"ꈎ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"ꈎ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"ꆪ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"ꆪ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"ꑍ",relative:{0:"ꀃꑍ",1:"ꃆꏂꑍ",2:"ꌕꀿꑍ","-2":"ꎴꂿꋍꑍ","-1":"ꀋꅔꉈ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"ꑍ",relative:{0:"ꀃꑍ",1:"ꃆꏂꑍ",2:"ꌕꀿꑍ","-2":"ꎴꂿꋍꑍ","-1":"ꀋꅔꉈ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"ꄮꈉ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"ꄮꈉ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"ꃏ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"ꃏ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"ꇙ",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"ꇙ",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"in",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"is",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=Number(r[0])==e,o=a.slice(-1),i=a.slice(-2);return t?"other":n&&1==o&&11!=i||!n?"one":"other"},fields:{year:{displayName:"ár",relative:{0:"á þessu ári",1:"á næsta ári","-1":"á síðasta ári"},relativeTime:{future:{one:"eftir {0} ár",other:"eftir {0} ár"},past:{one:"fyrir {0} ári",other:"fyrir {0} árum"}}},"year-short":{displayName:"ár",relative:{0:"á þessu ári",1:"á næsta ári","-1":"á síðasta ári"},relativeTime:{future:{one:"eftir {0} ár",other:"eftir {0} ár"},past:{one:"fyrir {0} ári",other:"fyrir {0} árum"}}},month:{displayName:"mánuður",relative:{0:"í þessum mánuði",1:"í næsta mánuði","-1":"í síðasta mánuði"},relativeTime:{future:{one:"eftir {0} mánuð",other:"eftir {0} mánuði"},past:{one:"fyrir {0} mánuði",other:"fyrir {0} mánuðum"}}},"month-short":{displayName:"mán.",relative:{0:"í þessum mán.",1:"í næsta mán.","-1":"í síðasta mán."},relativeTime:{future:{one:"eftir {0} mán.",other:"eftir {0} mán."},past:{one:"fyrir {0} mán.",other:"fyrir {0} mán."}}},day:{displayName:"dagur",relative:{0:"í dag",1:"á morgun",2:"eftir tvo daga","-2":"í fyrradag","-1":"í gær"},relativeTime:{future:{one:"eftir {0} dag",other:"eftir {0} daga"},past:{one:"fyrir {0} degi",other:"fyrir {0} dögum"}}},"day-short":{displayName:"dagur",relative:{0:"í dag",1:"á morgun",2:"eftir tvo daga","-2":"í fyrradag","-1":"í gær"},relativeTime:{future:{one:"eftir {0} dag",other:"eftir {0} daga"},past:{one:"fyrir {0} dögum",other:"fyrir {0} dögum"}}},hour:{displayName:"klukkustund",relative:{0:"this hour"},relativeTime:{future:{one:"eftir {0} klukkustund",other:"eftir {0} klukkustundir"},past:{one:"fyrir {0} klukkustund",other:"fyrir {0} klukkustundum"}}},"hour-short":{displayName:"klst.",relative:{0:"this hour"},relativeTime:{future:{one:"eftir {0} klst.",other:"eftir {0} klst."},past:{one:"fyrir {0} klst.",other:"fyrir {0} klst."}}},minute:{displayName:"mínúta",relative:{0:"this minute"},relativeTime:{future:{one:"eftir {0} mínútu",other:"eftir {0} mínútur"},past:{one:"fyrir {0} mínútu",other:"fyrir {0} mínútum"}}},"minute-short":{displayName:"mín.",relative:{0:"this minute"},relativeTime:{future:{one:"eftir {0} mín.",other:"eftir {0} mín."},past:{one:"fyrir {0} mín.",other:"fyrir {0} mín."}}},second:{displayName:"sekúnda",relative:{0:"núna"},relativeTime:{future:{one:"eftir {0} sekúndu",other:"eftir {0} sekúndur"},past:{one:"fyrir {0} sekúndu",other:"fyrir {0} sekúndum"}}},"second-short":{displayName:"sek.",relative:{0:"núna"},relativeTime:{future:{one:"eftir {0} sek.",other:"eftir {0} sek."},past:{one:"fyrir {0} sek.",other:"fyrir {0} sek."}}}}}),a.__addLocaleData({locale:"it",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?11==e||8==e||80==e||800==e?"many":"other":1==e&&a?"one":"other"},fields:{year:{displayName:"anno",relative:{0:"quest’anno",1:"anno prossimo","-1":"anno scorso"},relativeTime:{future:{one:"tra {0} anno",other:"tra {0} anni"},past:{one:"{0} anno fa",other:"{0} anni fa"}}},"year-short":{displayName:"anno",relative:{0:"quest’anno",1:"anno prossimo","-1":"anno scorso"},relativeTime:{future:{one:"tra {0} anno",other:"tra {0} anni"},past:{one:"{0} anno fa",other:"{0} anni fa"}}},month:{displayName:"mese",relative:{0:"questo mese",1:"mese prossimo","-1":"mese scorso"},relativeTime:{future:{one:"tra {0} mese",other:"tra {0} mesi"},past:{one:"{0} mese fa",other:"{0} mesi fa"}}},"month-short":{displayName:"mese",relative:{0:"questo mese",1:"mese prossimo","-1":"mese scorso"},relativeTime:{future:{one:"tra {0} mese",other:"tra {0} mesi"},past:{one:"{0} mese fa",other:"{0} mesi fa"}}},day:{displayName:"giorno",relative:{0:"oggi",1:"domani",2:"dopodomani","-2":"l’altro ieri","-1":"ieri"},relativeTime:{future:{one:"tra {0} giorno",other:"tra {0} giorni"},past:{one:"{0} giorno fa",other:"{0} giorni fa"}}},"day-short":{displayName:"g",relative:{0:"oggi",1:"domani",2:"dopodomani","-2":"l’altro ieri","-1":"ieri"},relativeTime:{future:{one:"tra {0} g",other:"tra {0} gg"},past:{one:"{0} g fa",other:"{0} gg fa"}}},hour:{displayName:"ora",relative:{0:"quest’ora"},relativeTime:{future:{one:"tra {0} ora",other:"tra {0} ore"},past:{one:"{0} ora fa",other:"{0} ore fa"}}},"hour-short":{displayName:"h.",relative:{0:"quest’ora"},relativeTime:{future:{one:"tra {0} h.",other:"tra {0} h."},past:{one:"{0} h. fa",other:"{0} h. fa"}}},minute:{displayName:"minuto",relative:{0:"questo minuto"},relativeTime:{future:{one:"tra {0} minuto",other:"tra {0} minuti"},past:{one:"{0} minuto fa",other:"{0} minuti fa"}}},"minute-short":{displayName:"min.",relative:{0:"questo minuto"},relativeTime:{future:{one:"tra {0} min.",other:"tra {0} min."},past:{one:"{0} min. fa",other:"{0} min. fa"}}},second:{displayName:"secondo",relative:{0:"ora"},relativeTime:{future:{one:"tra {0} secondo",other:"tra {0} secondi"},past:{one:"{0} secondo fa",other:"{0} secondi fa"}}},"second-short":{displayName:"sec.",relative:{0:"ora"},relativeTime:{future:{one:"tra {0} sec.",other:"tra {0} sec."},past:{one:"{0} sec. fa",other:"{0} sec. fa"}}}}}),a.__addLocaleData({locale:"it-CH",parentLocale:"it"}),a.__addLocaleData({locale:"it-SM",parentLocale:"it"}),a.__addLocaleData({locale:"it-VA",parentLocale:"it"}),a.__addLocaleData({locale:"iu",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"iu-Latn",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"iw",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=Number(r[0])==e,i=o&&r[0].slice(-1);return t?"other":1==e&&n?"one":2==a&&n?"two":n&&(e<0||e>10)&&o&&0==i?"many":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ja",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"年",relative:{0:"今年",1:"翌年","-1":"昨年"},relativeTime:{future:{other:"{0} 年後"},past:{other:"{0} 年前"}}},"year-short":{displayName:"年",relative:{0:"今年",1:"翌年","-1":"昨年"},relativeTime:{future:{other:"{0} 年後"},past:{other:"{0} 年前"}}},month:{displayName:"月",relative:{0:"今月",1:"翌月","-1":"先月"},relativeTime:{future:{other:"{0} か月後"},past:{other:"{0} か月前"}}},"month-short":{displayName:"月",relative:{0:"今月",1:"翌月","-1":"先月"},relativeTime:{future:{other:"{0} か月後"},past:{other:"{0} か月前"}}},day:{displayName:"日",relative:{0:"今日",1:"明日",2:"明後日","-2":"一昨日","-1":"昨日"},relativeTime:{future:{other:"{0} 日後"},past:{other:"{0} 日前"}}},"day-short":{displayName:"日",relative:{0:"今日",1:"明日",2:"明後日","-2":"一昨日","-1":"昨日"},relativeTime:{future:{other:"{0} 日後"},past:{other:"{0} 日前"}}},hour:{displayName:"時",relative:{0:"1 時間以内"},relativeTime:{future:{other:"{0} 時間後"},past:{other:"{0} 時間前"}}},"hour-short":{displayName:"時",relative:{0:"1 時間以内"},relativeTime:{future:{other:"{0} 時間後"},past:{other:"{0} 時間前"}}},minute:{displayName:"分",relative:{0:"1 分以内"},relativeTime:{future:{other:"{0} 分後"},past:{other:"{0} 分前"}}},"minute-short":{displayName:"分",relative:{0:"1 分以内"},relativeTime:{future:{other:"{0} 分後"},past:{other:"{0} 分前"}}},second:{displayName:"秒",relative:{0:"今"},relativeTime:{future:{other:"{0} 秒後"},past:{other:"{0} 秒前"}}},"second-short":{displayName:"秒",relative:{0:"今"},relativeTime:{future:{other:"{0} 秒後"},past:{other:"{0} 秒前"}}}}}),a.__addLocaleData({locale:"jbo",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"jgo",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"Nǔu ŋguꞋ {0}",other:"Nǔu ŋguꞋ {0}"},past:{one:"Ɛ́gɛ́ mɔ́ ŋguꞋ {0}",other:"Ɛ́gɛ́ mɔ́ ŋguꞋ {0}"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"Nǔu ŋguꞋ {0}",other:"Nǔu ŋguꞋ {0}"},past:{one:"Ɛ́gɛ́ mɔ́ ŋguꞋ {0}",other:"Ɛ́gɛ́ mɔ́ ŋguꞋ {0}"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"Nǔu {0} saŋ",other:"Nǔu {0} saŋ"},past:{one:"ɛ́ gɛ́ mɔ́ pɛsaŋ {0}",other:"ɛ́ gɛ́ mɔ́ pɛsaŋ {0}"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"Nǔu {0} saŋ",other:"Nǔu {0} saŋ"},past:{one:"ɛ́ gɛ́ mɔ́ pɛsaŋ {0}",other:"ɛ́ gɛ́ mɔ́ pɛsaŋ {0}"}}},day:{displayName:"Day",relative:{0:"lɔꞋɔ",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{one:"Nǔu lɛ́Ꞌ {0}",other:"Nǔu lɛ́Ꞌ {0}"},past:{one:"Ɛ́ gɛ́ mɔ́ lɛ́Ꞌ {0}",other:"Ɛ́ gɛ́ mɔ́ lɛ́Ꞌ {0}"}}},"day-short":{displayName:"Day",relative:{0:"lɔꞋɔ",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{one:"Nǔu lɛ́Ꞌ {0}",other:"Nǔu lɛ́Ꞌ {0}"},past:{one:"Ɛ́ gɛ́ mɔ́ lɛ́Ꞌ {0}",other:"Ɛ́ gɛ́ mɔ́ lɛ́Ꞌ {0}"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{one:"nǔu háwa {0}",other:"nǔu háwa {0}"},past:{one:"ɛ́ gɛ mɔ́ {0} háwa",other:"ɛ́ gɛ mɔ́ {0} háwa"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{one:"nǔu háwa {0}",other:"nǔu háwa {0}"},past:{one:"ɛ́ gɛ mɔ́ {0} háwa",other:"ɛ́ gɛ mɔ́ {0} háwa"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{one:"nǔu {0} minút",other:"nǔu {0} minút"},past:{one:"ɛ́ gɛ́ mɔ́ minút {0}",other:"ɛ́ gɛ́ mɔ́ minút {0}"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{one:"nǔu {0} minút",other:"nǔu {0} minút"},past:{one:"ɛ́ gɛ́ mɔ́ minút {0}",other:"ɛ́ gɛ́ mɔ́ minút {0}"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ji",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"jmc",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Maka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Maka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mori",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Mori",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Mfiri",relative:{0:"Inu",1:"Ngama","-1":"Ukou"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Mfiri",relative:{0:"Inu",1:"Ngama","-1":"Ukou"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Dakyika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Dakyika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"jv",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"jw",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ka",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=a.slice(-2);return t?1==a?"one":0==a||n>=2&&n<=20||40==n||60==n||80==n?"many":"other":1==e?"one":"other"},fields:{year:{displayName:"წელი",relative:{0:"ამ წელს",1:"მომავალ წელს","-1":"გასულ წელს"},relativeTime:{future:{one:"{0} წელიწადში",other:"{0} წელიწადში"},past:{one:"{0} წლის წინ",other:"{0} წლის წინ"}}},"year-short":{displayName:"წ.",relative:{0:"ამ წელს",1:"მომავალ წელს","-1":"გასულ წელს"},relativeTime:{future:{one:"{0} წელში",other:"{0} წელში"},past:{one:"{0} წლის წინ",other:"{0} წლის წინ"}}},month:{displayName:"თვე",relative:{0:"ამ თვეში",1:"მომავალ თვეს","-1":"გასულ თვეს"},relativeTime:{future:{one:"{0} თვეში",other:"{0} თვეში"},past:{one:"{0} თვის წინ",other:"{0} თვის წინ"}}},"month-short":{displayName:"თვე",relative:{0:"ამ თვეში",1:"მომავალ თვეს","-1":"გასულ თვეს"},relativeTime:{future:{one:"{0} თვეში",other:"{0} თვეში"},past:{one:"{0} თვის წინ",other:"{0} თვის წინ"}}},day:{displayName:"დღე",relative:{0:"დღეს",1:"ხვალ",2:"ზეგ","-2":"გუშინწინ","-1":"გუშინ"},relativeTime:{future:{one:"{0} დღეში",other:"{0} დღეში"},past:{one:"{0} დღის წინ",other:"{0} დღის წინ"}}},"day-short":{displayName:"დღე",relative:{0:"დღეს",1:"ხვალ",2:"ზეგ","-2":"გუშინწინ","-1":"გუშინ"},relativeTime:{future:{one:"{0} დღეში",other:"{0} დღეში"},past:{one:"{0} დღის წინ",other:"{0} დღის წინ"}}},hour:{displayName:"საათი",relative:{0:"ამ საათში"},relativeTime:{future:{one:"{0} საათში",other:"{0} საათში"},past:{one:"{0} საათის წინ",other:"{0} საათის წინ"}}},"hour-short":{displayName:"სთ.",relative:{0:"ამ საათში"},relativeTime:{future:{one:"{0} საათში",other:"{0} საათში"},past:{one:"{0} სთ წინ",other:"{0} სთ წინ"}}},minute:{displayName:"წუთი",relative:{0:"ამ წუთში"},relativeTime:{future:{one:"{0} წუთში",other:"{0} წუთში"},past:{one:"{0} წუთის წინ",other:"{0} წუთის წინ"}}},"minute-short":{displayName:"წთ.",relative:{0:"ამ წუთში"},relativeTime:{future:{one:"{0} წუთში",other:"{0} წუთში"},past:{one:"{0} წთ წინ",other:"{0} წთ წინ"}}},second:{displayName:"წამი",relative:{0:"ახლა"},relativeTime:{future:{one:"{0} წამში",other:"{0} წამში"},past:{one:"{0} წამის წინ",other:"{0} წამის წინ"}}},"second-short":{displayName:"წმ.",relative:{0:"ახლა"},relativeTime:{future:{one:"{0} წამში",other:"{0} წამში"},past:{one:"{0} წმ წინ",other:"{0} წმ წინ"}}}}}),a.__addLocaleData({locale:"kab",pluralRuleFunction:function(e,t){return t?"other":e>=0&&e<2?"one":"other"},fields:{year:{displayName:"Aseggas",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Aseggas",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Aggur",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Aggur",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ass",relative:{0:"Ass-a",1:"Azekka","-1":"Iḍelli"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Ass",relative:{0:"Ass-a",1:"Azekka","-1":"Iḍelli"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Tamert",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Tamert",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Tamrect",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Tamrect",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Tasint",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Tasint",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"kaj",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"kam",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Mwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Mwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mwai",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Mwai",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Mũthenya",relative:{0:"Ũmũnthĩ",1:"Ũnĩ","-1":"Ĩyoo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Mũthenya",relative:{0:"Ũmũnthĩ",1:"Ũnĩ","-1":"Ĩyoo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Ndatĩka",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Ndatĩka",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"sekondi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"sekondi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"kcg",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"kde",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Mwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Mwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mwedi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Mwedi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Lihiku",relative:{0:"Nelo",1:"Nundu","-1":"Lido"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Lihiku",relative:{0:"Nelo",1:"Nundu","-1":"Lido"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Dakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Dakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"kea",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Anu",relative:{0:"es anu li",1:"prósimu anu","-1":"anu pasadu"},relativeTime:{future:{other:"di li {0} anu"},past:{other:"a ten {0} anu"}}},"year-short":{displayName:"anu",relative:{0:"es anu li",1:"prósimu anu","-1":"anu pasadu"},relativeTime:{future:{other:"di li {0} anu"},past:{other:"a ten {0} anu"}}},month:{displayName:"Mes",relative:{0:"es mes li",1:"prósimu mes","-1":"mes pasadu"},relativeTime:{future:{other:"di li {0} mes"},past:{other:"a ten {0} mes"}}},"month-short":{displayName:"mes",relative:{0:"es mes li",1:"prósimu mes","-1":"mes pasadu"},relativeTime:{future:{other:"di li {0} mes"},past:{other:"a ten {0} mes"}}},day:{displayName:"Dia",relative:{0:"oji",1:"manha","-1":"onti"},relativeTime:{future:{other:"di li {0} dia"},past:{other:"a ten {0} dia"}}},"day-short":{displayName:"dia",relative:{0:"oji",1:"manha","-1":"onti"},relativeTime:{future:{other:"di li {0} dia"},past:{other:"a ten {0} dia"}}},hour:{displayName:"Ora",relative:{0:"this hour"},relativeTime:{future:{other:"di li {0} ora"},past:{other:"a ten {0} ora"}}},"hour-short":{displayName:"ora",relative:{0:"this hour"},relativeTime:{future:{other:"di li {0} ora"},past:{other:"a ten {0} ora"}}},minute:{displayName:"Minutu",relative:{0:"this minute"},relativeTime:{future:{other:"di li {0} minutu"},past:{other:"a ten {0} minutu"}}},"minute-short":{displayName:"min",relative:{0:"this minute"},relativeTime:{future:{other:"di li {0} min"},past:{other:"a ten {0} min"}}},second:{displayName:"Sigundu",relative:{0:"now"},relativeTime:{future:{other:"di li {0} sigundu"},past:{other:"a ten {0} sigundu"}}},"second-short":{displayName:"sig",relative:{0:"now"},relativeTime:{future:{other:"di li {0} sig"},past:{other:"a ten {0} sig"}}}}}),a.__addLocaleData({locale:"khq",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Jiiri",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Jiiri",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Handu",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Handu",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Jaari",relative:{0:"Hõo",1:"Suba","-1":"Bi"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Jaari",relative:{0:"Hõo",1:"Suba","-1":"Bi"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Guuru",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Guuru",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Miniti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Miniti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Miti",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Miti",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ki",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Mwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Mwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mweri",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Mweri",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Mũthenya",relative:{0:"Ũmũthĩ",1:"Rũciũ","-1":"Ira"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Mũthenya",relative:{0:"Ũmũthĩ",1:"Rũciũ","-1":"Ira"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Ithaa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Ithaa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Ndagĩka",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Ndagĩka",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"kk",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e,n=a&&r[0].slice(-1);return t?6==n||9==n||a&&0==n&&0!=e?"many":"other":1==e?"one":"other"},fields:{year:{displayName:"жыл",relative:{0:"биылғы жыл",1:"келесі жыл","-1":"былтырғы жыл"},relativeTime:{future:{one:"{0} жылдан кейін",other:"{0} жылдан кейін"},past:{one:"{0} жыл бұрын",other:"{0} жыл бұрын"}}},"year-short":{displayName:"ж.",relative:{0:"биылғы жыл",1:"келесі жыл","-1":"былтырғы жыл"},relativeTime:{future:{one:"{0} ж. кейін",other:"{0} ж. кейін"},past:{one:"{0} ж. бұрын",other:"{0} ж. бұрын"}}},month:{displayName:"ай",relative:{0:"осы ай",1:"келесі ай","-1":"өткен ай"},relativeTime:{future:{one:"{0} айдан кейін",other:"{0} айдан кейін"},past:{one:"{0} ай бұрын",other:"{0} ай бұрын"}}},"month-short":{displayName:"ай",relative:{0:"осы ай",1:"келесі ай","-1":"өткен ай"},relativeTime:{future:{one:"{0} айдан кейін",other:"{0} айдан кейін"},past:{one:"{0} ай бұрын",other:"{0} ай бұрын"}}},day:{displayName:"күн",relative:{0:"бүгін",1:"ертең",2:"бүрсігүні","-2":"алдыңгүні","-1":"кеше"},relativeTime:{future:{one:"{0} күннен кейін",other:"{0} күннен кейін"},past:{one:"{0} күн бұрын",other:"{0} күн бұрын"}}},"day-short":{displayName:"күн",relative:{0:"бүгін",1:"ертең",2:"бүрсігүні","-2":"алдыңғы күні","-1":"кеше"},relativeTime:{future:{one:"{0} күннен кейін",other:"{0} күннен кейін"},past:{one:"{0} күн бұрын",other:"{0} күн бұрын"}}},hour:{displayName:"сағат",relative:{0:"осы сағат"},relativeTime:{future:{one:"{0} сағаттан кейін",other:"{0} сағаттан кейін"},past:{one:"{0} сағат бұрын",other:"{0} сағат бұрын"}}},"hour-short":{displayName:"сағ",relative:{0:"осы сағат"},relativeTime:{future:{one:"{0} сағ. кейін",other:"{0} сағ. кейін"},past:{one:"{0} сағ. бұрын",other:"{0} сағ. бұрын"}}},minute:{displayName:"минут",relative:{0:"осы минут"},relativeTime:{future:{one:"{0} минуттан кейін",other:"{0} минуттан кейін"},past:{one:"{0} минут бұрын",other:"{0} минут бұрын"}}},"minute-short":{displayName:"мин",relative:{0:"осы минут"},relativeTime:{future:{one:"{0} мин. кейін",other:"{0} мин. кейін"},past:{one:"{0} мин. бұрын",other:"{0} мин. бұрын"}}},second:{displayName:"секунд",relative:{0:"қазір"},relativeTime:{future:{one:"{0} секундтан кейін",other:"{0} секундтан кейін"},past:{one:"{0} секунд бұрын",other:"{0} секунд бұрын"}}},"second-short":{displayName:"с",relative:{0:"қазір"},relativeTime:{future:{one:"{0} сек. кейін",other:"{0} сек. кейін"},past:{one:"{0} сек. бұрын",other:"{0} сек. бұрын"}}}}}),a.__addLocaleData({locale:"kkj",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"muka",1:"nɛmɛnɔ","-1":"kwey"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"muka",1:"nɛmɛnɔ","-1":"kwey"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"kl",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"om {0} ukioq",other:"om {0} ukioq"},past:{one:"for {0} ukioq siden",other:"for {0} ukioq siden"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"om {0} ukioq",other:"om {0} ukioq"},past:{one:"for {0} ukioq siden",other:"for {0} ukioq siden"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"om {0} qaammat",other:"om {0} qaammat"},past:{one:"for {0} qaammat siden",other:"for {0} qaammat siden"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"om {0} qaammat",other:"om {0} qaammat"},past:{one:"for {0} qaammat siden",other:"for {0} qaammat siden"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{one:"om {0} ulloq unnuarlu",other:"om {0} ulloq unnuarlu"},past:{one:"for {0} ulloq unnuarlu siden",other:"for {0} ulloq unnuarlu siden"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{one:"om {0} ulloq unnuarlu",other:"om {0} ulloq unnuarlu"},past:{one:"for {0} ulloq unnuarlu siden",other:"for {0} ulloq unnuarlu siden"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{one:"om {0} nalunaaquttap-akunnera",other:"om {0} nalunaaquttap-akunnera"},past:{one:"for {0} nalunaaquttap-akunnera siden",other:"for {0} nalunaaquttap-akunnera siden"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{one:"om {0} nalunaaquttap-akunnera",other:"om {0} nalunaaquttap-akunnera"},past:{one:"for {0} nalunaaquttap-akunnera siden",other:"for {0} nalunaaquttap-akunnera siden"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{one:"om {0} minutsi",other:"om {0} minutsi"},past:{one:"for {0} minutsi siden",other:"for {0} minutsi siden"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{one:"om {0} minutsi",other:"om {0} minutsi"},past:{one:"for {0} minutsi siden",other:"for {0} minutsi siden"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{one:"om {0} sekundi",other:"om {0} sekundi"},past:{one:"for {0} sekundi siden",other:"for {0} sekundi siden"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{one:"om {0} sekundi",other:"om {0} sekundi"},past:{one:"for {0} sekundi siden",other:"for {0} sekundi siden"}}}}}),a.__addLocaleData({locale:"kln",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Kenyit",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Kenyit",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Arawet",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Arawet",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Betut",relative:{0:"Raini",1:"Mutai","-1":"Amut"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Betut",relative:{0:"Raini",1:"Mutai","-1":"Amut"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Sait",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Sait",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minitit",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minitit",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekondit",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Sekondit",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"km",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"ឆ្នាំ",relative:{0:"ឆ្នាំ​នេះ",1:"ឆ្នាំ​ក្រោយ","-1":"ឆ្នាំ​មុន"},relativeTime:{future:{other:"{0} ឆ្នាំទៀត"},past:{other:"{0} ឆ្នាំ​មុន"}}},"year-short":{displayName:"ឆ្នាំ",relative:{0:"ឆ្នាំ​នេះ",1:"ឆ្នាំ​ក្រោយ","-1":"ឆ្នាំ​មុន"},relativeTime:{future:{other:"{0} ឆ្នាំទៀត"},past:{other:"{0} ឆ្នាំ​មុន"}}},month:{displayName:"ខែ",relative:{0:"ខែ​នេះ",1:"ខែ​ក្រោយ","-1":"ខែ​មុន"},relativeTime:{future:{other:"{0} ខែទៀត"},past:{other:"{0} ខែមុន"}}},"month-short":{displayName:"ខែ",relative:{0:"ខែ​នេះ",1:"ខែ​ក្រោយ","-1":"ខែ​មុន"},relativeTime:{future:{other:"{0} ខែទៀត"},past:{other:"{0} ខែមុន"}}},day:{displayName:"ថ្ងៃ",relative:{0:"ថ្ងៃ​នេះ",1:"ថ្ងៃ​ស្អែក",2:"​ខាន​ស្អែក","-2":"ម្សិល​ម៉្ងៃ","-1":"ម្សិលមិញ"},relativeTime:{future:{other:"{0} ថ្ងៃទៀត"},past:{other:"{0} ថ្ងៃ​មុន"}}},"day-short":{displayName:"ថ្ងៃ",relative:{0:"ថ្ងៃ​នេះ",1:"ថ្ងៃស្អែក",2:"​ខាន​ស្អែក","-2":"ម្សិល​ម៉្ងៃ","-1":"ម្សិលមិញ"},relativeTime:{future:{other:"{0} ថ្ងៃទៀត"},past:{other:"{0} ថ្ងៃ​​មុន"}}},hour:{displayName:"ម៉ោង",relative:{0:"ម៉ោងនេះ"},relativeTime:{future:{other:"ក្នុង​រយៈ​ពេល {0} ម៉ោង"},past:{other:"{0} ម៉ោង​មុន"}}},"hour-short":{displayName:"ម៉ោង",relative:{0:"ម៉ោងនេះ"},relativeTime:{future:{other:"{0} ម៉ោងទៀត"},past:{other:"{0} ម៉ោង​មុន"}}},minute:{displayName:"នាទី",relative:{0:"នាទីនេះ"},relativeTime:{future:{other:"{0} នាទីទៀត"},past:{other:"{0} នាទី​មុន"}}},"minute-short":{displayName:"នាទី",relative:{0:"នាទីនេះ"},relativeTime:{future:{other:"{0} នាទីទៀត"},past:{other:"{0} នាទី​​មុន"}}},second:{displayName:"វិនាទី",relative:{0:"ឥឡូវ"},relativeTime:{future:{other:"{0} វិនាទីទៀត"},past:{other:"{0} វិនាទី​មុន"}}},"second-short":{displayName:"វិនាទី",relative:{0:"ឥឡូវ"},relativeTime:{future:{other:"{0} វិនាទីទៀត"},past:{other:"{0} វិនាទី​មុន"}}}}}),a.__addLocaleData({locale:"kn",pluralRuleFunction:function(e,t){return t?"other":e>=0&&e<=1?"one":"other"},fields:{year:{displayName:"ವರ್ಷ",relative:{0:"ಈ ವರ್ಷ",1:"ಮುಂದಿನ ವರ್ಷ","-1":"ಹಿಂದಿನ ವರ್ಷ"},relativeTime:{future:{one:"{0} ವರ್ಷದಲ್ಲಿ",other:"{0} ವರ್ಷಗಳಲ್ಲಿ"},past:{one:"{0} ವರ್ಷದ ಹಿಂದೆ",other:"{0} ವರ್ಷಗಳ ಹಿಂದೆ"}}},"year-short":{displayName:"ವರ್ಷ",relative:{0:"ಈ ವರ್ಷ",1:"ಮುಂದಿನ ವರ್ಷ","-1":"ಕಳೆದ ವರ್ಷ"},relativeTime:{future:{one:"{0} ವರ್ಷದಲ್ಲಿ",other:"{0} ವರ್ಷಗಳಲ್ಲಿ"},past:{one:"{0} ವರ್ಷದ ಹಿಂದೆ",other:"{0} ವರ್ಷಗಳ ಹಿಂದೆ"}}},month:{displayName:"ತಿಂಗಳು",relative:{0:"ಈ ತಿಂಗಳು",1:"ಮುಂದಿನ ತಿಂಗಳು","-1":"ಕಳೆದ ತಿಂಗಳು"},relativeTime:{future:{one:"{0} ತಿಂಗಳಲ್ಲಿ",other:"{0} ತಿಂಗಳುಗಳಲ್ಲಿ"},past:{one:"{0} ತಿಂಗಳುಗಳ ಹಿಂದೆ",other:"{0} ತಿಂಗಳುಗಳ ಹಿಂದೆ"}}},"month-short":{displayName:"ತಿಂಗಳು",relative:{0:"ಈ ತಿಂಗಳು",1:"ಮುಂದಿನ ತಿಂಗಳು","-1":"ಕಳೆದ ತಿಂಗಳು"},relativeTime:{future:{one:"{0} ತಿಂಗಳಲ್ಲಿ",other:"{0} ತಿಂಗಳುಗಳಲ್ಲಿ"},past:{one:"{0} ತಿಂಗಳು ಹಿಂದೆ",other:"{0} ತಿಂಗಳುಗಳ ಹಿಂದೆ"}}},day:{displayName:"ದಿನ",relative:{0:"ಇಂದು",1:"ನಾಳೆ",2:"ನಾಡಿದ್ದು","-2":"ಮೊನ್ನೆ","-1":"ನಿನ್ನೆ"},relativeTime:{future:{one:"{0} ದಿನದಲ್ಲಿ",other:"{0} ದಿನಗಳಲ್ಲಿ"},past:{one:"{0} ದಿನದ ಹಿಂದೆ",other:"{0} ದಿನಗಳ ಹಿಂದೆ"}}},"day-short":{displayName:"ದಿನ",relative:{0:"ಇಂದು",1:"ನಾಳೆ",2:"ನಾಡಿದ್ದು","-2":"ಮೊನ್ನೆ","-1":"ನಿನ್ನೆ"},relativeTime:{future:{one:"{0} ದಿನದಲ್ಲಿ",other:"{0} ದಿನಗಳಲ್ಲಿ"},past:{one:"{0} ದಿನಗಳ ಹಿಂದೆ",other:"{0} ದಿನಗಳ ಹಿಂದೆ"}}},hour:{displayName:"ಗಂಟೆ",relative:{0:"ಈ ಗಂಟೆ"},relativeTime:{future:{one:"{0} ಗಂಟೆಯಲ್ಲಿ",other:"{0} ಗಂಟೆಗಳಲ್ಲಿ"},past:{one:"{0} ಗಂಟೆ ಹಿಂದೆ",other:"{0} ಗಂಟೆಗಳ ಹಿಂದೆ"}}},"hour-short":{displayName:"ಗಂಟೆ",relative:{0:"ಈ ಗಂಟೆ"},relativeTime:{future:{one:"{0} ಗಂಟೆಯಲ್ಲಿ",other:"{0} ಗಂಟೆಗಳಲ್ಲಿ"},past:{one:"{0} ಗಂಟೆ ಹಿಂದೆ",other:"{0} ಗಂಟೆಗಳ ಹಿಂದೆ"}}},minute:{displayName:"ನಿಮಿಷ",relative:{0:"ಈ ನಿಮಿಷ"},relativeTime:{future:{one:"{0} ನಿಮಿಷದಲ್ಲಿ",other:"{0} ನಿಮಿಷಗಳಲ್ಲಿ"},past:{one:"{0} ನಿಮಿಷಗಳ ಹಿಂದೆ",other:"{0} ನಿಮಿಷಗಳ ಹಿಂದೆ"}}},"minute-short":{displayName:"ನಿಮಿಷ",relative:{0:"ಈ ನಿಮಿಷ"},relativeTime:{future:{one:"{0} ನಿಮಿಷದಲ್ಲಿ",other:"{0} ನಿಮಿಷಗಳಲ್ಲಿ"},past:{one:"{0} ನಿಮಿಷದ ಹಿಂದೆ",other:"{0} ನಿಮಿಷಗಳ ಹಿಂದೆ"}}},second:{displayName:"ಸೆಕೆಂಡ್",relative:{0:"ಈಗ"},relativeTime:{future:{one:"{0} ಸೆಕೆಂಡ್‌ನಲ್ಲಿ",other:"{0} ಸೆಕೆಂಡ್‌ಗಳಲ್ಲಿ"},past:{one:"{0} ಸೆಕೆಂಡ್ ಹಿಂದೆ",other:"{0} ಸೆಕೆಂಡುಗಳ ಹಿಂದೆ"}}},"second-short":{displayName:"ಸೆಕೆಂಡ್",relative:{0:"ಈಗ"},relativeTime:{future:{one:"{0} ಸೆಕೆಂಡ್‌ನಲ್ಲಿ",other:"{0} ಸೆಕೆಂಡ್‌ಗಳಲ್ಲಿ"},past:{one:"{0} ಸೆಕೆಂಡ್ ಹಿಂದೆ",other:"{0} ಸೆಕೆಂಡುಗಳ ಹಿಂದೆ"}}}}}),a.__addLocaleData({locale:"ko",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"년",relative:{0:"올해",1:"내년","-1":"작년"},relativeTime:{future:{other:"{0}년 후"},past:{other:"{0}년 전"}}},"year-short":{displayName:"년",relative:{0:"올해",1:"내년","-1":"작년"},relativeTime:{future:{other:"{0}년 후"},past:{other:"{0}년 전"}}},month:{displayName:"월",relative:{0:"이번 달",1:"다음 달","-1":"지난달"},relativeTime:{future:{other:"{0}개월 후"},past:{other:"{0}개월 전"}}},"month-short":{displayName:"월",relative:{0:"이번 달",1:"다음 달","-1":"지난달"},relativeTime:{future:{other:"{0}개월 후"},past:{other:"{0}개월 전"}}},day:{displayName:"일",relative:{0:"오늘",1:"내일",2:"모레","-2":"그저께","-1":"어제"},relativeTime:{future:{other:"{0}일 후"},past:{other:"{0}일 전"}}},"day-short":{displayName:"일",relative:{0:"오늘",1:"내일",2:"모레","-2":"그저께","-1":"어제"},relativeTime:{future:{other:"{0}일 후"},past:{other:"{0}일 전"}}},hour:{displayName:"시",relative:{0:"현재 시간"},relativeTime:{future:{other:"{0}시간 후"},past:{other:"{0}시간 전"}}},"hour-short":{displayName:"시",relative:{0:"현재 시간"},relativeTime:{future:{other:"{0}시간 후"},past:{other:"{0}시간 전"}}},minute:{displayName:"분",relative:{0:"현재 분"},relativeTime:{future:{other:"{0}분 후"},past:{other:"{0}분 전"}}},"minute-short":{displayName:"분",relative:{0:"현재 분"},relativeTime:{future:{other:"{0}분 후"},past:{other:"{0}분 전"}}},second:{displayName:"초",relative:{0:"지금"},relativeTime:{future:{other:"{0}초 후"},past:{other:"{0}초 전"}}},"second-short":{displayName:"초",relative:{0:"지금"},relativeTime:{future:{other:"{0}초 후"},past:{other:"{0}초 전"}}}}}),a.__addLocaleData({locale:"ko-KP",parentLocale:"ko"}),a.__addLocaleData({locale:"kok",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ks",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"ؤری",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"ؤری",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"رٮ۪تھ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"رٮ۪تھ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"دۄہ",relative:{0:"اَز",1:"پگاہ","-1":"راتھ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"دۄہ",relative:{0:"اَز",1:"پگاہ","-1":"راتھ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"گٲنٛٹہٕ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"گٲنٛٹہٕ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"مِنَٹ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"مِنَٹ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"سٮ۪کَنڑ",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"سٮ۪کَنڑ",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ksb",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Ng’waka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Ng’waka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Ng’ezi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Ng’ezi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Siku",relative:{0:"Evi eo",1:"Keloi","-1":"Ghuo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Siku",relative:{0:"Evi eo",1:"Keloi","-1":"Ghuo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Dakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Dakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ksf",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Bǝk",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Bǝk",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Ŋwíí",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Ŋwíí",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ŋwós",relative:{0:"Gɛ́ɛnǝ",1:"Ridúrǝ́","-1":"Rinkɔɔ́"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Ŋwós",relative:{0:"Gɛ́ɛnǝ",1:"Ridúrǝ́","-1":"Rinkɔɔ́"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Cámɛɛn",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Cámɛɛn",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Mǝnít",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Mǝnít",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Háu",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Háu",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ksh",pluralRuleFunction:function(e,t){return t?"other":0==e?"zero":1==e?"one":"other"},fields:{year:{displayName:"Johr",relative:{0:"diß Johr",1:"näx Johr","-1":"läz Johr"},relativeTime:{future:{zero:"en keinem Johr",one:"en {0} Johr",other:"en {0} Johre"},past:{zero:"vör keijnem Johr",one:"vör {0} Johr",other:"vör {0} Johre"}}},"year-short":{displayName:"J.",relative:{0:"diß Johr",1:"näx Johr","-1":"läz Johr"},relativeTime:{future:{zero:"en keinem Johr",one:"en {0} Johr",other:"en {0} Johre"},past:{zero:"vör keijnem Johr",one:"vör {0} Johr",other:"vör {0} Johre"}}},month:{displayName:"Mohnd",relative:{0:"diese Mohnd",1:"nächste Mohnd","-1":"lätzde Mohnd"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Mohnd",relative:{0:"diese Mohnd",1:"nächste Mohnd","-1":"lätzde Mohnd"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Daach",relative:{0:"hück",1:"morje",2:"övvermorje","-2":"vörjestere","-1":"jestere"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"D.",relative:{0:"hück",1:"morje",2:"övvermorje","-2":"vörjestere","-1":"jestere"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Schtund",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Std.",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Menutt",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"min.",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekond",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"sek.",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ku",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"kw",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ky",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"жыл",relative:{0:"быйыл",1:"эмдиги жылы","-1":"былтыр"},relativeTime:{future:{one:"{0} жылдан кийин",other:"{0} жылдан кийин"},past:{one:"{0} жыл мурун",other:"{0} жыл мурун"}}},"year-short":{displayName:"ж.",relative:{0:"быйыл",1:"эмдиги жылы","-1":"былтыр"},relativeTime:{future:{one:"{0} жыл. кийин",other:"{0} жыл. кийин"},past:{one:"{0} жыл мурун",other:"{0} жыл мурун"}}},month:{displayName:"ай",relative:{0:"бул айда",1:"эмдиги айда","-1":"өткөн айда"},relativeTime:{future:{one:"{0} айдан кийин",other:"{0} айдан кийин"},past:{one:"{0} ай мурун",other:"{0} ай мурун"}}},"month-short":{displayName:"ай",relative:{0:"бул айда",1:"эмдиги айда","-1":"өткөн айда"},relativeTime:{future:{one:"{0} айд. кийин",other:"{0} айд. кийин"},past:{one:"{0} ай мурун",other:"{0} ай мурун"}}},day:{displayName:"күн",relative:{0:"бүгүн",1:"эртеӊ",2:"бүрсүгүнү","-2":"мурдагы күнү","-1":"кечээ"},relativeTime:{future:{one:"{0} күндөн кийин",other:"{0} күндөн кийин"},past:{one:"{0} күн мурун",other:"{0} күн мурун"}}},"day-short":{displayName:"күн",relative:{0:"бүгүн",1:"эртеӊ",2:"бүрсүгүнү","-2":"мурдагы күнү","-1":"кечээ"},relativeTime:{future:{one:"{0} күн. кийин",other:"{0} күн. кийин"},past:{one:"{0} күн мурун",other:"{0} күн мурун"}}},hour:{displayName:"саат",relative:{0:"ушул саатта"},relativeTime:{future:{one:"{0} сааттан кийин",other:"{0} сааттан кийин"},past:{one:"{0} саат мурун",other:"{0} саат мурун"}}},"hour-short":{displayName:"ст",relative:{0:"ушул саатта"},relativeTime:{future:{one:"{0} саат. кийин",other:"{0} саат. кийин"},past:{one:"{0} саат. мурун",other:"{0} саат. мурун"}}},minute:{displayName:"мүнөт",relative:{0:"ушул мүнөттө"},relativeTime:{future:{one:"{0} мүнөттөн кийин",other:"{0} мүнөттөн кийин"},past:{one:"{0} мүнөт мурун",other:"{0} мүнөт мурун"}}},"minute-short":{displayName:"мүн.",relative:{0:"ушул мүнөттө"},relativeTime:{future:{one:"{0} мүн. кийин",other:"{0} мүн. кийин"},past:{one:"{0} мүн. мурун",other:"{0} мүн. мурун"}}},second:{displayName:"секунд",relative:{0:"азыр"},relativeTime:{future:{one:"{0} секунддан кийин",other:"{0} секунддан кийин"},past:{one:"{0} секунд мурун",other:"{0} секунд мурун"}}},"second-short":{displayName:"сек.",relative:{0:"азыр"},relativeTime:{future:{one:"{0} сек. кийин",other:"{0} сек. кийин"},past:{one:"{0} сек. мурун",other:"{0} сек. мурун"}}}}}),a.__addLocaleData({locale:"lag",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0];return t?"other":0==e?"zero":0!=a&&1!=a||0==e?"other":"one"},fields:{year:{displayName:"Mwaáka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Mwaáka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mweéri",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Mweéri",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Sikʉ",relative:{0:"Isikʉ",1:"Lamʉtoondo","-1":"Niijo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Sikʉ",relative:{0:"Isikʉ",1:"Lamʉtoondo","-1":"Niijo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Sáa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Sáa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Dakíka",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Dakíka",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekúunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Sekúunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"lb",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Joer",relative:{0:"dëst Joer",1:"nächst Joer","-1":"lescht Joer"},relativeTime:{future:{one:"an {0} Joer",other:"a(n) {0} Joer"},past:{one:"virun {0} Joer",other:"viru(n) {0} Joer"}}},"year-short":{displayName:"J.",relative:{0:"dëst Joer",1:"nächst Joer","-1":"lescht Joer"},relativeTime:{future:{one:"an {0} J.",other:"a(n) {0} J."},past:{one:"virun {0} J.",other:"viru(n) {0} J."}}},month:{displayName:"Mount",relative:{0:"dëse Mount",1:"nächste Mount","-1":"leschte Mount"},relativeTime:{future:{one:"an {0} Mount",other:"a(n) {0} Méint"},past:{one:"virun {0} Mount",other:"viru(n) {0} Méint"}}},"month-short":{displayName:"M.",relative:{0:"dëse Mount",1:"nächste Mount","-1":"leschte Mount"},relativeTime:{future:{one:"an {0} M.",other:"a(n) {0} M."},past:{one:"virun {0} M.",other:"viru(n) {0} M."}}},day:{displayName:"Dag",relative:{0:"haut",1:"muer","-1":"gëschter"},relativeTime:{future:{one:"an {0} Dag",other:"a(n) {0} Deeg"},past:{one:"virun {0} Dag",other:"viru(n) {0} Deeg"}}},"day-short":{displayName:"D.",relative:{0:"haut",1:"muer","-1":"gëschter"},relativeTime:{future:{one:"an {0} D.",other:"a(n) {0} D."},past:{one:"virun {0} D.",other:"viru(n) {0} D."}}},hour:{displayName:"Stonn",relative:{0:"this hour"},relativeTime:{future:{one:"an {0} Stonn",other:"a(n) {0} Stonnen"},past:{one:"virun {0} Stonn",other:"viru(n) {0} Stonnen"}}},"hour-short":{displayName:"St.",relative:{0:"this hour"},relativeTime:{future:{one:"an {0} St.",other:"a(n) {0} St."},past:{one:"virun {0} St.",other:"viru(n) {0} St."}}},minute:{displayName:"Minutt",relative:{0:"this minute"},relativeTime:{future:{one:"an {0} Minutt",other:"a(n) {0} Minutten"},past:{one:"virun {0} Minutt",other:"viru(n) {0} Minutten"}}},"minute-short":{displayName:"Min.",relative:{0:"this minute"},relativeTime:{future:{one:"an {0} Min.",other:"a(n) {0} Min."},past:{one:"virun {0} Min.",other:"viru(n) {0} Min."}}},second:{displayName:"Sekonn",relative:{0:"now"},relativeTime:{future:{one:"an {0} Sekonn",other:"a(n) {0} Sekonnen"},past:{one:"virun {0} Sekonn",other:"viru(n) {0} Sekonnen"}}},"second-short":{displayName:"Sek.",relative:{0:"now"},relativeTime:{future:{one:"an {0} Sek.",other:"a(n) {0} Sek."},past:{one:"virun {0} Sek.",other:"viru(n) {0} Sek."}}}}}),a.__addLocaleData({locale:"lg",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Mwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Mwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mwezi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Mwezi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Lunaku",relative:{0:"Lwaleero",1:"Nkya","-1":"Ggulo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Lunaku",relative:{0:"Lwaleero",1:"Nkya","-1":"Ggulo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Saawa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Saawa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Dakiika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Dakiika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Kasikonda",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Kasikonda",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"lkt",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Ómakȟa",relative:{0:"Lé ómakȟa kiŋ",1:"Tȟokáta ómakȟa kiŋháŋ","-1":"Ómakȟa kʼuŋ héhaŋ"},relativeTime:{future:{other:"Letáŋhaŋ ómakȟa {0} kiŋháŋ"},past:{other:"Hékta ómakȟa {0} kʼuŋ héhaŋ"}}},"year-short":{displayName:"Ómakȟa",relative:{0:"Lé ómakȟa kiŋ",1:"Tȟokáta ómakȟa kiŋháŋ","-1":"Ómakȟa kʼuŋ héhaŋ"},relativeTime:{future:{other:"Letáŋhaŋ ómakȟa {0} kiŋháŋ"},past:{other:"Hékta ómakȟa {0} kʼuŋ héhaŋ"}}},month:{displayName:"Wí",relative:{0:"Lé wí kiŋ",1:"Tȟokáta wí kiŋháŋ","-1":"Wí kʼuŋ héhaŋ"},relativeTime:{future:{other:"Letáŋhaŋ wíyawapi {0} kiŋháŋ"},past:{other:"Hékta wíyawapi {0} kʼuŋ héhaŋ"}}},"month-short":{displayName:"Wí",relative:{0:"Lé wí kiŋ",1:"Tȟokáta wí kiŋháŋ","-1":"Wí kʼuŋ héhaŋ"},relativeTime:{future:{other:"Letáŋhaŋ wíyawapi {0} kiŋháŋ"},past:{other:"Hékta wíyawapi {0} kʼuŋ héhaŋ"}}},day:{displayName:"Aŋpétu",relative:{0:"Lé aŋpétu kiŋ",1:"Híŋhaŋni kiŋháŋ","-1":"Ȟtálehaŋ"},relativeTime:{future:{other:"Letáŋhaŋ {0}-čháŋ kiŋháŋ"},past:{other:"Hékta {0}-čháŋ k’uŋ héhaŋ"}}},"day-short":{displayName:"Aŋpétu",relative:{0:"Lé aŋpétu kiŋ",1:"Híŋhaŋni kiŋháŋ","-1":"Ȟtálehaŋ"},relativeTime:{future:{other:"Letáŋhaŋ {0}-čháŋ kiŋháŋ"},past:{other:"Hékta {0}-čháŋ k’uŋ héhaŋ"}}},hour:{displayName:"Owápȟe",relative:{0:"this hour"},relativeTime:{future:{other:"Letáŋhaŋ owápȟe {0} kiŋháŋ"},past:{other:"Hékta owápȟe {0} kʼuŋ héhaŋ"}}},"hour-short":{displayName:"Owápȟe",relative:{0:"this hour"},relativeTime:{future:{other:"Letáŋhaŋ owápȟe {0} kiŋháŋ"},past:{other:"Hékta owápȟe {0} kʼuŋ héhaŋ"}}},minute:{displayName:"Owápȟe oȟʼáŋkȟo",relative:{0:"this minute"},relativeTime:{future:{other:"Letáŋhaŋ oȟ’áŋkȟo {0} kiŋháŋ"},past:{other:"Hékta oȟ’áŋkȟo {0} k’uŋ héhaŋ"}}},"minute-short":{displayName:"Owápȟe oȟʼáŋkȟo",relative:{0:"this minute"},relativeTime:{future:{other:"Letáŋhaŋ oȟ’áŋkȟo {0} kiŋháŋ"},past:{other:"Hékta oȟ’áŋkȟo {0} k’uŋ héhaŋ"}}},second:{displayName:"Okpí",relative:{0:"now"},relativeTime:{future:{other:"Letáŋhaŋ okpí {0} kiŋháŋ"},past:{other:"Hékta okpí {0} k’uŋ héhaŋ"}}},"second-short":{displayName:"Okpí",relative:{0:"now"},relativeTime:{future:{other:"Letáŋhaŋ okpí {0} kiŋháŋ"},past:{other:"Hékta okpí {0} k’uŋ héhaŋ"}}}}}),a.__addLocaleData({locale:"ln",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"},fields:{year:{displayName:"Mobú",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Mobú",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Sánzá",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Sánzá",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Mokɔlɔ",relative:{0:"Lɛlɔ́",1:"Lóbi ekoyâ","-1":"Lóbi elékí"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Mokɔlɔ",relative:{0:"Lɛlɔ́",1:"Lóbi ekoyâ","-1":"Lóbi elékí"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Ngonga",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Ngonga",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Monúti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Monúti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sɛkɔ́ndɛ",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Sɛkɔ́ndɛ",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ln-AO",parentLocale:"ln"}),a.__addLocaleData({locale:"ln-CF",parentLocale:"ln"}),a.__addLocaleData({locale:"ln-CG",parentLocale:"ln"}),a.__addLocaleData({locale:"lo",pluralRuleFunction:function(e,t){return t&&1==e?"one":"other"},fields:{year:{displayName:"ປີ",relative:{0:"ປີນີ້",1:"ປີໜ້າ","-1":"ປີກາຍ"},relativeTime:{future:{other:"ໃນອີກ {0} ປີ"},past:{other:"{0} ປີກ່ອນ"}}},"year-short":{displayName:"ປີ",relative:{0:"ປີນີ້",1:"ປີໜ້າ","-1":"ປີກາຍ"},relativeTime:{future:{other:"ໃນອີກ {0} ປີ"},past:{other:"{0} ປີກ່ອນ"}}},month:{displayName:"ເດືອນ",relative:{0:"ເດືອນນີ້",1:"ເດືອນໜ້າ","-1":"ເດືອນແລ້ວ"},relativeTime:{future:{other:"ໃນອີກ {0} ເດືອນ"},past:{other:"{0} ເດືອນກ່ອນ"}}},"month-short":{displayName:"ດ.",relative:{0:"ເດືອນນີ້",1:"ເດືອນໜ້າ","-1":"ເດືອນແລ້ວ"},relativeTime:{future:{other:"ໃນອີກ {0} ດ."},past:{other:"{0} ດ. ກ່ອນ"}}},day:{displayName:"ມື້",relative:{0:"ມື້ນີ້",1:"ມື້ອື່ນ",2:"ມື້ຮື","-2":"ມື້ກ່ອນ","-1":"ມື້ວານ"},relativeTime:{future:{other:"ໃນອີກ {0} ມື້"},past:{other:"{0} ມື້ກ່ອນ"}}},"day-short":{displayName:"ມື້",relative:{0:"ມື້ນີ້",1:"ມື້ອື່ນ",2:"ມື້ຮື","-2":"ມື້ກ່ອນ","-1":"ມື້ວານ"},relativeTime:{future:{other:"ໃນອີກ {0} ມື້"},past:{other:"{0} ມື້ກ່ອນ"}}},hour:{displayName:"ຊົ່ວໂມງ",relative:{0:"ຊົ່ວໂມງນີ້"},relativeTime:{future:{other:"ໃນອີກ {0} ຊົ່ວໂມງ"},past:{other:"{0} ຊົ່ວໂມງກ່ອນ"}}},"hour-short":{displayName:"ຊມ.",relative:{0:"ຊົ່ວໂມງນີ້"},relativeTime:{future:{other:"ໃນອີກ {0} ຊມ."},past:{other:"{0} ຊມ. ກ່ອນ"}}},minute:{displayName:"ນາທີ",relative:{0:"ນາທີນີ້"},relativeTime:{future:{other:"{0} ໃນອີກ 0 ນາທີ"},past:{other:"{0} ນາທີກ່ອນ"}}},"minute-short":{displayName:"ນທ.",relative:{0:"ນາທີນີ້"},relativeTime:{future:{other:"ໃນ {0} ນທ."},past:{other:"{0} ນທ. ກ່ອນ"}}},second:{displayName:"ວິນາທີ",relative:{0:"ຕອນນີ້"},relativeTime:{future:{other:"ໃນອີກ {0} ວິນາທີ"},past:{other:"{0} ວິນາທີກ່ອນ"}}},"second-short":{displayName:"ວິ.",relative:{0:"ຕອນນີ້"},relativeTime:{future:{other:"ໃນ {0} ວິ."},past:{other:"{0} ວິ. ກ່ອນ"}}}}}),a.__addLocaleData({locale:"lrc",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"سال",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"سال",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"ما",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"ما",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"روٙز",relative:{0:"أمروٙ",1:"شوٙصوٙ","-1":"دیروٙز"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"روٙز",relative:{0:"أمروٙ",1:"شوٙصوٙ","-1":"دیروٙز"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"ساأت",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"ساأت",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"دئیقە",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"دئیقە",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"ثانیە",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"ثانیە",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"lrc-IQ",parentLocale:"lrc"}),a.__addLocaleData({locale:"lt",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[1]||"",n=Number(r[0])==e,o=n&&r[0].slice(-1),i=n&&r[0].slice(-2);return t?"other":1==o&&(i<11||i>19)?"one":o>=2&&o<=9&&(i<11||i>19)?"few":0!=a?"many":"other"},fields:{year:{displayName:"metai",relative:{0:"šiais metais",1:"kitais metais","-1":"praėjusiais metais"},relativeTime:{future:{one:"po {0} metų",few:"po {0} metų",many:"po {0} metų",other:"po {0} metų"},past:{one:"prieš {0} metus",few:"prieš {0} metus",many:"prieš {0} metų",other:"prieš {0} metų"}}},"year-short":{displayName:"m.",relative:{0:"šiais metais",1:"kitais metais","-1":"praėjusiais metais"},relativeTime:{future:{one:"po {0} m.",few:"po {0} m.",many:"po {0} m.",other:"po {0} m."},past:{one:"prieš {0} m.",few:"prieš {0} m.",many:"prieš {0} m.",other:"prieš {0} metų"}}},month:{displayName:"mėnuo",relative:{0:"šį mėnesį",1:"kitą mėnesį","-1":"praėjusį mėnesį"},relativeTime:{future:{one:"po {0} mėnesio",few:"po {0} mėnesių",many:"po {0} mėnesio",other:"po {0} mėnesių"},past:{one:"prieš {0} mėnesį",few:"prieš {0} mėnesius",many:"prieš {0} mėnesio",other:"prieš {0} mėnesių"}}},"month-short":{displayName:"mėn.",relative:{0:"šį mėnesį",1:"kitą mėnesį","-1":"praėjusį mėnesį"},relativeTime:{future:{one:"po {0} mėn.",few:"po {0} mėn.",many:"po {0} mėn.",other:"po {0} mėn."},past:{one:"prieš {0} mėn.",few:"prieš {0} mėn.",many:"prieš {0} mėn.",other:"prieš {0} mėn."}}},day:{displayName:"diena",relative:{0:"šiandien",1:"rytoj",2:"poryt","-2":"užvakar","-1":"vakar"},relativeTime:{future:{one:"po {0} dienos",few:"po {0} dienų",many:"po {0} dienos",other:"po {0} dienų"},past:{one:"prieš {0} dieną",few:"prieš {0} dienas",many:"prieš {0} dienos",other:"prieš {0} dienų"}}},"day-short":{displayName:"d.",relative:{0:"šiandien",1:"rytoj",2:"poryt","-2":"užvakar","-1":"vakar"},relativeTime:{future:{one:"po {0} d.",few:"po {0} d.",many:"po {0} d.",other:"po {0} d."},past:{one:"prieš {0} d.",few:"prieš {0} d.",many:"prieš {0} d.",other:"prieš {0} d."}}},hour:{displayName:"valanda",relative:{0:"šią valandą"},relativeTime:{future:{one:"po {0} valandos",few:"po {0} valandų",many:"po {0} valandos",other:"po {0} valandų"},past:{one:"prieš {0} valandą",few:"prieš {0} valandas",many:"prieš {0} valandos",other:"prieš {0} valandų"}}},"hour-short":{displayName:"val.",relative:{0:"šią valandą"},relativeTime:{future:{one:"po {0} val.",few:"po {0} val.",many:"po {0} val.",other:"po {0} val."},past:{one:"prieš {0} val.",few:"prieš {0} val.",many:"prieš {0} val.",other:"prieš {0} val."}}},minute:{displayName:"minutė",relative:{0:"šią minutę"},relativeTime:{future:{one:"po {0} minutės",few:"po {0} minučių",many:"po {0} minutės",other:"po {0} minučių"},past:{one:"prieš {0} minutę",few:"prieš {0} minutes",many:"prieš {0} minutės",other:"prieš {0} minučių"}}},"minute-short":{displayName:"min.",relative:{0:"šią minutę"},relativeTime:{future:{one:"po {0} min.",few:"po {0} min.",many:"po {0} min.",other:"po {0} min."},past:{one:"prieš {0} min.",few:"prieš {0} min.",many:"prieš {0} min.",other:"prieš {0} min."}}},second:{displayName:"sekundė",relative:{0:"dabar"},relativeTime:{future:{one:"po {0} sekundės",few:"po {0} sekundžių",many:"po {0} sekundės",other:"po {0} sekundžių"},past:{one:"prieš {0} sekundę",few:"prieš {0} sekundes",many:"prieš {0} sekundės",other:"prieš {0} sekundžių"}}},"second-short":{displayName:"sek.",relative:{0:"dabar"},relativeTime:{future:{one:"po {0} sek.",few:"po {0} sek.",many:"po {0} sek.",other:"po {0} sek."},past:{one:"prieš {0} sek.",few:"prieš {0} sek.",many:"prieš {0} sek.",other:"prieš {0} sek."}}}}}),a.__addLocaleData({locale:"lu",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Tshidimu",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Tshidimu",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Ngondo",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Ngondo",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Dituku",relative:{0:"Lelu",1:"Malaba","-1":"Makelela"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Dituku",relative:{0:"Lelu",1:"Malaba","-1":"Makelela"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Diba",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Diba",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Kasunsu",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Kasunsu",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Kasunsukusu",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Kasunsukusu",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"luo",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"higa",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"higa",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"dwe",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"dwe",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"chieng’",relative:{0:"kawuono",1:"kiny","-1":"nyoro"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"chieng’",relative:{0:"kawuono",1:"kiny","-1":"nyoro"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"dakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"dakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"nyiriri mar saa",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"nyiriri mar saa",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"luy",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Muhiga",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Muhiga",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mweri",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Mweri",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ridiku",relative:{0:"Lero",1:"Mgamba","-1":"Mgorova"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Ridiku",relative:{0:"Lero",1:"Mgamba","-1":"Mgorova"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Isaa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Isaa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Idagika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Idagika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"lv",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[1]||"",n=a.length,o=Number(r[0])==e,i=o&&r[0].slice(-1),l=o&&r[0].slice(-2),s=a.slice(-2),u=a.slice(-1);return t?"other":o&&0==i||l>=11&&l<=19||2==n&&s>=11&&s<=19?"zero":1==i&&11!=l||2==n&&1==u&&11!=s||2!=n&&1==u?"one":"other"},fields:{year:{displayName:"gads",relative:{0:"šajā gadā",1:"nākamajā gadā","-1":"pagājušajā gadā"},relativeTime:{future:{zero:"pēc {0} gadiem",one:"pēc {0} gada",other:"pēc {0} gadiem"},past:{zero:"pirms {0} gadiem",one:"pirms {0} gada",other:"pirms {0} gadiem"}}},"year-short":{displayName:"g.",relative:{0:"šajā gadā",1:"nākamajā gadā","-1":"pagājušajā gadā"},relativeTime:{future:{zero:"pēc {0} g.",one:"pēc {0} g.",other:"pēc {0} g."},past:{zero:"pirms {0} g.",one:"pirms {0} g.",other:"pirms {0} g."}}},month:{displayName:"mēnesis",relative:{0:"šajā mēnesī",1:"nākamajā mēnesī","-1":"pagājušajā mēnesī"},relativeTime:{future:{zero:"pēc {0} mēnešiem",one:"pēc {0} mēneša",other:"pēc {0} mēnešiem"},past:{zero:"pirms {0} mēnešiem",one:"pirms {0} mēneša",other:"pirms {0} mēnešiem"}}},"month-short":{displayName:"mēn.",relative:{0:"šajā mēnesī",1:"nākamajā mēnesī","-1":"pagājušajā mēnesī"},relativeTime:{future:{zero:"pēc {0} mēn.",one:"pēc {0} mēn.",other:"pēc {0} mēn."},past:{zero:"pirms {0} mēn.",one:"pirms {0} mēn.",other:"pirms {0} mēn."}}},day:{displayName:"diena",relative:{0:"šodien",1:"rīt",2:"parīt","-2":"aizvakar","-1":"vakar"},relativeTime:{future:{zero:"pēc {0} dienām",one:"pēc {0} dienas",other:"pēc {0} dienām"},past:{zero:"pirms {0} dienām",one:"pirms {0} dienas",other:"pirms {0} dienām"}}},"day-short":{displayName:"d.",relative:{0:"šodien",1:"rīt",2:"parīt","-2":"aizvakar","-1":"vakar"},relativeTime:{future:{zero:"pēc {0} d.",one:"pēc {0} d.",other:"pēc {0} d."},past:{zero:"pirms {0} d.",one:"pirms {0} d.",other:"pirms {0} d."}}},hour:{displayName:"stundas",relative:{0:"šajā stundā"},relativeTime:{future:{zero:"pēc {0} stundām",one:"pēc {0} stundas",other:"pēc {0} stundām"},past:{zero:"pirms {0} stundām",one:"pirms {0} stundas",other:"pirms {0} stundām"}}},"hour-short":{displayName:"st.",relative:{0:"šajā stundā"},relativeTime:{future:{zero:"pēc {0} st.",one:"pēc {0} st.",other:"pēc {0} st."},past:{zero:"pirms {0} st.",one:"pirms {0} st.",other:"pirms {0} st."}}},minute:{displayName:"minūtes",relative:{0:"šajā minūtē"},relativeTime:{future:{zero:"pēc {0} minūtēm",one:"pēc {0} minūtes",other:"pēc {0} minūtēm"},past:{zero:"pirms {0} minūtēm",one:"pirms {0} minūtes",other:"pirms {0} minūtēm"}}},"minute-short":{displayName:"min.",relative:{0:"šajā minūtē"},relativeTime:{future:{zero:"pēc {0} min.",one:"pēc {0} min.",other:"pēc {0} min."},past:{zero:"pirms {0} min.",one:"pirms {0} min.",other:"pirms {0} min."}}},second:{displayName:"sekundes",relative:{0:"tagad"},relativeTime:{future:{zero:"pēc {0} sekundēm",one:"pēc {0} sekundes",other:"pēc {0} sekundēm"},past:{zero:"pirms {0} sekundēm",one:"pirms {0} sekundes",other:"pirms {0} sekundēm"}}},"second-short":{displayName:"sek.",relative:{0:"tagad"},relativeTime:{future:{zero:"pēc {0} sek.",one:"pēc {0} sek.",other:"pēc {0} sek."},past:{zero:"pirms {0} sek.",one:"pirms {0} sek.",other:"pirms {0} sek."}}}}}),a.__addLocaleData({locale:"mas",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Ɔlárì",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Ɔlárì",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Ɔlápà",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Ɔlápà",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ɛnkɔlɔ́ŋ",relative:{0:"Táatá",1:"Tááisérè","-1":"Ŋolé"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Ɛnkɔlɔ́ŋ",relative:{0:"Táatá",1:"Tááisérè","-1":"Ŋolé"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Ɛ́sáâ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Ɛ́sáâ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Oldákikaè",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Oldákikaè",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"mas-TZ",parentLocale:"mas"}),a.__addLocaleData({locale:"mer",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Mwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Mwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mweri",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Mweri",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ntukũ",relative:{0:"Narua",1:"Rũjũ","-1":"Ĩgoro"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Ntukũ",relative:{0:"Narua",1:"Rũjũ","-1":"Ĩgoro"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Ĩthaa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Ĩthaa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Ndagika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Ndagika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekondi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Sekondi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"mfe",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Lane",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Lane",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mwa",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Mwa",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Zour",relative:{0:"Zordi",1:"Demin","-1":"Yer"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Zour",relative:{0:"Zordi",1:"Demin","-1":"Yer"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Ler",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Ler",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minit",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minit",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Segonn",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Segonn",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"mg",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"},fields:{year:{displayName:"Taona",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Taona",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Volana",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Volana",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Andro",relative:{0:"Anio",1:"Rahampitso","-1":"Omaly"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Andro",relative:{0:"Anio",1:"Rahampitso","-1":"Omaly"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Ora",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Ora",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minitra",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minitra",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Segondra",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Segondra",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"mgh",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"yaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"yaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"mweri",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"mweri",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"nihuku",relative:{0:"lel’lo",1:"me’llo","-1":"n’chana"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"nihuku",relative:{0:"lel’lo",1:"me’llo","-1":"n’chana"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"isaa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"isaa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"idakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"idakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"isekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"isekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"mgo",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"fituʼ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"fituʼ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"iməg",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"+{0} m",other:"+{0} m"},past:{one:"-{0} m",other:"-{0} m"}}},"month-short":{displayName:"iməg",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"+{0} m",other:"+{0} m"},past:{one:"-{0} m",other:"-{0} m"}}},day:{displayName:"anəg",relative:{0:"tèchɔ̀ŋ",1:"isu",2:"isu ywi","-1":"ikwiri"},relativeTime:{future:{one:"+{0} d",other:"+{0} d"},past:{one:"-{0} d",other:"-{0} d"}}},"day-short":{displayName:"anəg",relative:{0:"tèchɔ̀ŋ",1:"isu",2:"isu ywi","-1":"ikwiri"},relativeTime:{future:{one:"+{0} d",other:"+{0} d"},past:{one:"-{0} d",other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{one:"+{0} h",other:"+{0} h"},past:{one:"-{0} h",other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{one:"+{0} h",other:"+{0} h"},past:{one:"-{0} h",other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{one:"+{0} min",other:"+{0} min"},past:{one:"-{0} min",other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{one:"+{0} min",other:"+{0} min"},past:{one:"-{0} min",other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{one:"+{0} s",other:"+{0} s"},past:{one:"-{0} s",other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{one:"+{0} s",other:"+{0} s"},past:{one:"-{0} s",other:"-{0} s"}}}}}),a.__addLocaleData({locale:"mk",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=a.slice(-2),s=n.slice(-1);return t?1==i&&11!=l?"one":2==i&&12!=l?"two":7!=i&&8!=i||17==l||18==l?"other":"many":o&&1==i||1==s?"one":"other"},fields:{year:{displayName:"година",relative:{0:"оваа година",1:"следната година","-1":"минатата година"},relativeTime:{future:{one:"за {0} година",other:"за {0} години"},past:{one:"пред {0} година",other:"пред {0} години"}}},"year-short":{displayName:"год.",relative:{0:"оваа година",1:"следната година","-1":"минатата година"},relativeTime:{future:{one:"за {0} година",other:"за {0} години"},past:{one:"пред {0} година",other:"пред {0} години"}}},month:{displayName:"месец",relative:{0:"овој месец",1:"следниот месец","-1":"минатиот месец"},relativeTime:{future:{one:"за {0} месец",other:"за {0} месеци"},past:{one:"пред {0} месец",other:"пред {0} месеци"}}},"month-short":{displayName:"мес.",relative:{0:"овој месец",1:"следниот месец","-1":"минатиот месец"},relativeTime:{future:{one:"за {0} месец",other:"за {0} месеци"},past:{one:"пред {0} месец",other:"пред {0} месеци"}}},day:{displayName:"ден",relative:{0:"денес",1:"утре",2:"задутре","-2":"завчера","-1":"вчера"},relativeTime:{future:{one:"за {0} ден",other:"за {0} дена"},past:{one:"пред {0} ден",other:"пред {0} дена"}}},"day-short":{displayName:"ден",relative:{0:"денес",1:"утре",2:"задутре","-2":"завчера","-1":"вчера"},relativeTime:{future:{one:"за {0} ден",other:"за {0} дена"},past:{one:"пред {0} ден",other:"пред {0} дена"}}},hour:{displayName:"час",relative:{0:"часов"},relativeTime:{future:{one:"за {0} час",other:"за {0} часа"},past:{one:"пред {0} час",other:"пред {0} часа"}}},"hour-short":{displayName:"час",relative:{0:"часов"},relativeTime:{future:{one:"за {0} час",other:"за {0} часа"},past:{one:"пред {0} час",other:"пред {0} часа"}}},minute:{displayName:"минута",relative:{0:"оваа минута"},relativeTime:{future:{one:"за {0} минута",other:"за {0} минути"},past:{one:"пред {0} минута",other:"пред {0} минути"}}},"minute-short":{displayName:"мин.",relative:{0:"оваа минута"},relativeTime:{future:{one:"за {0} минута",other:"за {0} минути"},past:{one:"пред {0} минута",other:"пред {0} минути"}}},second:{displayName:"секунда",relative:{0:"сега"},relativeTime:{future:{one:"за {0} секунда",other:"за {0} секунди"},past:{one:"пред {0} секунда",other:"пред {0} секунди"}}},"second-short":{displayName:"сек.",relative:{0:"сега"},relativeTime:{future:{one:"за {0} секунда",other:"за {0} секунди"},past:{one:"пред {0} секунда",other:"пред {0} секунди"}}}}}),a.__addLocaleData({locale:"ml",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"വർഷം",relative:{0:"ഈ വർ‌ഷം",1:"അടുത്തവർഷം","-1":"കഴിഞ്ഞ വർഷം"},relativeTime:{future:{one:"{0} വർഷത്തിൽ",other:"{0} വർഷത്തിൽ"},past:{one:"{0} വർഷം മുമ്പ്",other:"{0} വർഷം മുമ്പ്"}}},"year-short":{displayName:"വ.",relative:{0:"ഈ വർ‌ഷം",1:"അടുത്തവർഷം","-1":"കഴിഞ്ഞ വർഷം"},relativeTime:{future:{one:"{0} വർഷത്തിൽ",other:"{0} വർഷത്തിൽ"},past:{one:"{0} വർഷം മുമ്പ്",other:"{0} വർഷം മുമ്പ്"}}},month:{displayName:"മാസം",relative:{0:"ഈ മാസം",1:"അടുത്ത മാസം","-1":"കഴിഞ്ഞ മാസം"},relativeTime:{future:{one:"{0} മാസത്തിൽ",other:"{0} മാസത്തിൽ"},past:{one:"{0} മാസം മുമ്പ്",other:"{0} മാസം മുമ്പ്"}}},"month-short":{displayName:"മാ.",relative:{0:"ഈ മാസം",1:"അടുത്ത മാസം","-1":"കഴിഞ്ഞ മാസം"},relativeTime:{future:{one:"{0} മാസത്തിൽ",other:"{0} മാസത്തിൽ"},past:{one:"{0} മാസം മുമ്പ്",other:"{0} മാസം മുമ്പ്"}}},day:{displayName:"ദിവസം",relative:{0:"ഇന്ന്",1:"നാളെ",2:"മറ്റന്നാൾ","-2":"മിനിഞ്ഞാന്ന്","-1":"ഇന്നലെ"},relativeTime:{future:{one:"{0} ദിവസത്തിൽ",other:"{0} ദിവസത്തിൽ"},past:{one:"{0} ദിവസം മുമ്പ്",other:"{0} ദിവസം മുമ്പ്"}}},"day-short":{displayName:"ദിവസം",relative:{0:"ഇന്ന്",1:"നാളെ",2:"മറ്റന്നാൾ","-2":"മിനിഞ്ഞാന്ന്","-1":"ഇന്നലെ"},relativeTime:{future:{one:"{0} ദിവസത്തിൽ",other:"{0} ദിവസത്തിൽ"},past:{one:"{0} ദിവസം മുമ്പ്",other:"{0} ദിവസം മുമ്പ്"}}},hour:{displayName:"മണിക്കൂർ",relative:{0:"ഈ മണിക്കൂറിൽ"},relativeTime:{future:{one:"{0} മണിക്കൂറിൽ",other:"{0} മണിക്കൂറിൽ"},past:{one:"{0} മണിക്കൂർ മുമ്പ്",other:"{0} മണിക്കൂർ മുമ്പ്"}}},"hour-short":{displayName:"മ.",relative:{0:"ഈ മണിക്കൂറിൽ"},relativeTime:{future:{one:"{0} മണിക്കൂറിൽ",other:"{0} മണിക്കൂറിൽ"},past:{one:"{0} മണിക്കൂർ മുമ്പ്",other:"{0} മണിക്കൂർ മുമ്പ്"}}},minute:{displayName:"മിനിറ്റ്",relative:{0:"ഈ മിനിറ്റിൽ"},relativeTime:{future:{one:"{0} മിനിറ്റിൽ",other:"{0} മിനിറ്റിൽ"},past:{one:"{0} മിനിറ്റ് മുമ്പ്",other:"{0} മിനിറ്റ് മുമ്പ്"}}},"minute-short":{displayName:"മി.",relative:{0:"ഈ മിനിറ്റിൽ"},relativeTime:{future:{one:"{0} മിനിറ്റിൽ",other:"{0} മിനിറ്റിൽ"},past:{one:"{0} മിനിറ്റ് മുമ്പ്",other:"{0} മിനിറ്റ് മുമ്പ്"}}},second:{displayName:"സെക്കൻഡ്",relative:{0:"ഇപ്പോൾ"},relativeTime:{future:{one:"{0} സെക്കൻഡിൽ",other:"{0} സെക്കൻഡിൽ"},past:{one:"{0} സെക്കൻഡ് മുമ്പ്",other:"{0} സെക്കൻഡ് മുമ്പ്"}}},"second-short":{displayName:"സെ.",relative:{0:"ഇപ്പോൾ"},relativeTime:{future:{one:"{0} സെക്കൻഡിൽ",other:"{0} സെക്കൻഡിൽ"},past:{one:"{0} സെക്കൻഡ് മുമ്പ്",other:"{0} സെക്കൻഡ് മുമ്പ്"}}}}}),a.__addLocaleData({locale:"mn",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"жил",relative:{0:"энэ жил",1:"ирэх жил","-1":"өнгөрсөн жил"},relativeTime:{future:{one:"{0} жилийн дараа",other:"{0} жилийн дараа"},past:{one:"{0} жилийн өмнө",other:"{0} жилийн өмнө"}}},"year-short":{displayName:"жил",relative:{0:"энэ жил",1:"ирэх жил","-1":"өнгөрсөн жил"},relativeTime:{future:{one:"{0} жилийн дараа",other:"{0} жилийн дараа"},past:{one:"{0} жилийн өмнө",other:"{0} жилийн өмнө"}}},month:{displayName:"сар",relative:{0:"энэ сар",1:"ирэх сар","-1":"өнгөрсөн сар"},relativeTime:{future:{one:"{0} сарын дараа",other:"{0} сарын дараа"},past:{one:"{0} сарын өмнө",other:"{0} сарын өмнө"}}},"month-short":{displayName:"сар",relative:{0:"энэ сар",1:"ирэх сар","-1":"өнгөрсөн сар"},relativeTime:{future:{one:"{0} сарын дараа",other:"{0} сарын дараа"},past:{one:"{0} сарын өмнө",other:"{0} сарын өмнө"}}},day:{displayName:"өдөр",relative:{0:"өнөөдөр",1:"маргааш",2:"нөгөөдөр","-2":"уржигдар","-1":"өчигдөр"},relativeTime:{future:{one:"{0} өдрийн дараа",other:"{0} өдрийн дараа"},past:{one:"{0} өдрийн өмнө",other:"{0} өдрийн өмнө"}}},"day-short":{displayName:"өдөр",relative:{0:"өнөөдөр",1:"маргааш",2:"нөгөөдөр","-2":"уржигдар","-1":"өчигдөр"},relativeTime:{future:{one:"{0} өдөрт",other:"{0} өдөрт"},past:{one:"{0} өдрийн өмнө",other:"{0} өдрийн өмнө"}}},hour:{displayName:"цаг",relative:{0:"энэ цаг"},relativeTime:{future:{one:"{0} цагийн дараа",other:"{0} цагийн дараа"},past:{one:"{0} цагийн өмнө",other:"{0} цагийн өмнө"}}},"hour-short":{displayName:"ц.",relative:{0:"энэ цаг"},relativeTime:{future:{one:"{0} ц. дараа",other:"{0} ц. дараа"},past:{one:"{0} ц. өмнө",other:"{0} ц. өмнө"}}},minute:{displayName:"минут",relative:{0:"энэ минут"},relativeTime:{future:{one:"{0} минутын дараа",other:"{0} минутын дараа"},past:{one:"{0} минутын өмнө",other:"{0} минутын өмнө"}}},"minute-short":{displayName:"мин.",relative:{0:"энэ минут"},relativeTime:{future:{one:"{0} мин. дараа",other:"{0} мин. дараа"},past:{one:"{0} мин. өмнө",other:"{0} мин. өмнө"}}},second:{displayName:"секунд",relative:{0:"одоо"},relativeTime:{future:{one:"{0} секундын дараа",other:"{0} секундын дараа"},past:{one:"{0} секундын өмнө",other:"{0} секундын өмнө"}}},"second-short":{displayName:"сек.",relative:{0:"одоо"},relativeTime:{future:{one:"{0} сек. дараа",other:"{0} сек. дараа"},past:{one:"{0} сек. өмнө",other:"{0} сек. өмнө"}}}}}),a.__addLocaleData({locale:"mn-Mong",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"mo",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1],n=Number(r[0])==e,o=n&&r[0].slice(-2);return t?1==e?"one":"other":1==e&&a?"one":!a||0==e||1!=e&&o>=1&&o<=19?"few":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"mr",pluralRuleFunction:function(e,t){return t?1==e?"one":2==e||3==e?"two":4==e?"few":"other":e>=0&&e<=1?"one":"other"},fields:{year:{displayName:"वर्ष",relative:{0:"हे वर्ष",1:"पुढील वर्ष","-1":"मागील वर्ष"},relativeTime:{future:{one:"{0} वर्षामध्ये",other:"{0} वर्षांमध्ये"},past:{one:"{0} वर्षापूर्वी",other:"{0} वर्षांपूर्वी"}}},"year-short":{displayName:"वर्ष",relative:{0:"हे वर्ष",1:"पुढील वर्ष","-1":"मागील वर्ष"},relativeTime:{future:{one:"{0} वर्षामध्ये",other:"{0} वर्षांमध्ये"},past:{one:"{0} वर्षापूर्वी",other:"{0} वर्षांपूर्वी"}}},month:{displayName:"महिना",relative:{0:"हा महिना",1:"पुढील महिना","-1":"मागील महिना"},relativeTime:{future:{one:"{0} महिन्यामध्ये",other:"{0} महिन्यांमध्ये"},past:{one:"{0} महिन्यापूर्वी",other:"{0} महिन्यांपूर्वी"}}},"month-short":{displayName:"महिना",relative:{0:"हा महिना",1:"पुढील महिना","-1":"मागील महिना"},relativeTime:{future:{one:"{0} महिन्यामध्ये",other:"{0} महिन्यामध्ये"},past:{one:"{0} महिन्यापूर्वी",other:"{0} महिन्यापूर्वी"}}},day:{displayName:"दिवस",relative:{0:"आज",1:"उद्या","-1":"काल"},relativeTime:{future:{one:"{0} दिवसामध्ये",other:"{0} दिवसांमध्ये"},past:{one:"{0} दिवसापूर्वी",other:"{0} दिवसांपूर्वी"}}},"day-short":{displayName:"दिवस",relative:{0:"आज",1:"उद्या","-1":"काल"},relativeTime:{future:{one:"{0} दिवसामध्ये",other:"{0} दिवसांमध्ये"},past:{one:"{0} दिवसापूर्वी",other:"{0} दिवसांपूर्वी"}}},hour:{displayName:"तास",relative:{0:"तासात"},relativeTime:{future:{one:"{0} तासामध्ये",other:"{0} तासांमध्ये"},past:{one:"{0} तासापूर्वी",other:"{0} तासांपूर्वी"}}},"hour-short":{displayName:"तास",relative:{0:"तासात"},relativeTime:{future:{one:"{0} तासामध्ये",other:"{0} तासांमध्ये"},past:{one:"{0} तासापूर्वी",other:"{0} तासांपूर्वी"}}},minute:{displayName:"मिनिट",relative:{0:"या मिनिटात"},relativeTime:{future:{one:"{0} मिनिटामध्ये",other:"{0} मिनिटांमध्ये"},past:{one:"{0} मिनिटापूर्वी",other:"{0} मिनिटांपूर्वी"}}},"minute-short":{displayName:"मि.",relative:{0:"या मिनिटात"},relativeTime:{future:{one:"{0} मिनि. मध्ये",other:"{0} मिनि. मध्ये"},past:{one:"{0} मिनि. पूर्वी",other:"{0} मिनि. पूर्वी"}}},second:{displayName:"सेकंद",relative:{0:"आत्ता"},relativeTime:{future:{one:"{0} सेकंदामध्ये",other:"{0} सेकंदांमध्ये"},past:{one:"{0} सेकंदापूर्वी",other:"{0} सेकंदांपूर्वी"}}},"second-short":{displayName:"से.",relative:{0:"आत्ता"},relativeTime:{future:{one:"{0} से. मध्ये",other:"{0} से. मध्ये"},past:{one:"{0} से. पूर्वी",other:"{0} से. पूर्वी"}}}}}),a.__addLocaleData({locale:"ms",pluralRuleFunction:function(e,t){return t&&1==e?"one":"other"},fields:{year:{displayName:"Tahun",relative:{0:"tahun ini",1:"tahun depan","-1":"tahun lalu"},relativeTime:{future:{other:"dalam {0} saat"},past:{other:"{0} tahun lalu"}}},"year-short":{displayName:"thn",relative:{0:"thn ini",1:"thn depan","-1":"thn lepas"},relativeTime:{future:{other:"dalam {0} thn"},past:{other:"{0} thn lalu"}}},month:{displayName:"Bulan",relative:{0:"bulan ini",1:"bulan depan","-1":"bulan lalu"},relativeTime:{future:{other:"dalam {0} bulan"},past:{other:"{0} bulan lalu"}}},"month-short":{displayName:"bln",relative:{0:"bln ini",1:"bln depan","-1":"bln lalu"},relativeTime:{future:{other:"dlm {0} bln"},past:{other:"{0} bln lalu"}}},day:{displayName:"Hari",relative:{0:"hari ini",1:"esok",2:"lusa","-2":"kelmarin","-1":"semalam"},relativeTime:{future:{other:"dalam {0} hari"},past:{other:"{0} hari lalu"}}},"day-short":{displayName:"hari",relative:{0:"hari ini",1:"esok",2:"lusa","-2":"kelmarin","-1":"semlm"},relativeTime:{future:{other:"dlm {0} hari"},past:{other:"{0} hari lalu"}}},hour:{displayName:"Jam",relative:{0:"jam ini"},relativeTime:{future:{other:"dalam {0} jam"},past:{other:"{0} jam lalu"}}},"hour-short":{displayName:"jam",relative:{0:"jam ini"},relativeTime:{future:{other:"dlm {0} jam"},past:{other:"{0} jam lalu"}}},minute:{displayName:"Minit",relative:{0:"pada minit ini"},relativeTime:{future:{other:"dalam {0} minit"},past:{other:"{0} minit lalu"}}},"minute-short":{displayName:"min",relative:{0:"pada minit ini"},relativeTime:{future:{other:"dlm {0} min"},past:{other:"{0} min lalu"}}},second:{displayName:"Saat",relative:{0:"sekarang"},relativeTime:{future:{other:"dalam {0} saat"},past:{other:"{0} saat lalu"}}},"second-short":{displayName:"saat",relative:{0:"sekarang"},relativeTime:{future:{other:"dlm {0} saat"},past:{other:"{0} saat lalu"}}}}}),a.__addLocaleData({locale:"ms-Arab",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ms-BN",parentLocale:"ms"}),a.__addLocaleData({locale:"ms-SG",parentLocale:"ms"}),a.__addLocaleData({locale:"mt",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e,n=a&&r[0].slice(-2);return t?"other":1==e?"one":0==e||n>=2&&n<=10?"few":n>=11&&n<=19?"many":"other"},fields:{year:{displayName:"Sena",relative:{0:"din is-sena",1:"Is-sena d-dieħla","-1":"Is-sena li għaddiet"},relativeTime:{future:{other:"+{0} y"},past:{one:"{0} sena ilu",few:"{0} snin ilu",many:"{0} snin ilu",other:"{0} snin ilu"}}},"year-short":{displayName:"Sena",relative:{0:"din is-sena",1:"Is-sena d-dieħla","-1":"Is-sena li għaddiet"},relativeTime:{future:{other:"+{0} y"},past:{one:"{0} sena ilu",few:"{0} snin ilu",many:"{0} snin ilu",other:"{0} snin ilu"}}},month:{displayName:"Xahar",relative:{0:"Dan ix-xahar",1:"Ix-xahar id-dieħel","-1":"Ix-xahar li għadda"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Xahar",relative:{0:"Dan ix-xahar",1:"Ix-xahar id-dieħel","-1":"Ix-xahar li għadda"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Jum",relative:{0:"Illum",1:"Għada","-1":"Ilbieraħ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Jum",relative:{0:"Illum",1:"Għada","-1":"Ilbieraħ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Siegħa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Siegħa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minuta",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minuta",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekonda",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Sekonda",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"mua",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Syii",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Syii",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Fĩi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Fĩi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Zah’nane/ Comme",relative:{0:"Tǝ’nahko",1:"Tǝ’nane","-1":"Tǝsoo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Zah’nane/ Comme",relative:{0:"Tǝ’nahko",1:"Tǝ’nane","-1":"Tǝsoo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Cok comme",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Cok comme",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Cok comme ma laŋne",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Cok comme ma laŋne",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Cok comme ma laŋ tǝ biŋ",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Cok comme ma laŋ tǝ biŋ",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"my",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"နှစ်",relative:{0:"ယခုနှစ်",1:"လာမည့်နှစ်","-1":"ယမန်နှစ်"},relativeTime:{future:{other:"{0} နှစ်အတွင်း"},past:{other:"ပြီးခဲ့သည့် {0} နှစ်"}}},"year-short":{displayName:"နှစ်",relative:{0:"ယခုနှစ်",1:"လာမည့်နှစ်","-1":"ယမန်နှစ်"},relativeTime:{future:{other:"{0} နှစ်အတွင်း"},past:{other:"ပြီးခဲ့သည့် {0} နှစ်"}}},month:{displayName:"လ",relative:{0:"ယခုလ",1:"လာမည့်လ","-1":"ပြီးခဲ့သည့်လ"},relativeTime:{future:{other:"{0} လအတွင်း"},past:{other:"ပြီးခဲ့သည့် {0} လ"}}},"month-short":{displayName:"လ",relative:{0:"ယခုလ",1:"လာမည့်လ","-1":"ပြီးခဲ့သည့်လ"},relativeTime:{future:{other:"{0} လအတွင်း"},past:{other:"ပြီးခဲ့သည့် {0} လ"}}},day:{displayName:"ရက်",relative:{0:"ယနေ့",1:"မနက်ဖြန်",2:"သန်ဘက်ခါ","-2":"တစ်နေ့က","-1":"မနေ့က"},relativeTime:{future:{other:"{0} ရက်အတွင်း"},past:{other:"ပြီးခဲ့သည့် {0} ရက်"}}},"day-short":{displayName:"ရက်",relative:{0:"ယနေ့",1:"မနက်ဖြန်",2:"သန်ဘက်ခါ","-2":"တစ်နေ့က","-1":"မနေ့က"},relativeTime:{future:{other:"{0} ရက်အတွင်း"},past:{other:"ပြီးခဲ့သည့် {0} ရက်"}}},hour:{displayName:"နာရီ",relative:{0:"ဤအချိန်"},relativeTime:{future:{other:"{0} နာရီအတွင်း"},past:{other:"ပြီးခဲ့သည့် {0} နာရီ"}}},"hour-short":{displayName:"နာရီ",relative:{0:"ဤအချိန်"},relativeTime:{future:{other:"{0} နာရီအတွင်း"},past:{other:"ပြီးခဲ့သည့် {0} နာရီ"}}},minute:{displayName:"မိနစ်",relative:{0:"ဤမိနစ်"},relativeTime:{future:{other:"{0} မိနစ်အတွင်း"},past:{other:"ပြီးခဲ့သည့် {0} မိနစ်"}}},"minute-short":{displayName:"မိနစ်",relative:{0:"ဤမိနစ်"},relativeTime:{future:{other:"{0} မိနစ်အတွင်း"},past:{other:"ပြီးခဲ့သည့် {0} မိနစ်"}}},second:{displayName:"စက္ကန့်",relative:{0:"ယခု"},relativeTime:{future:{other:"{0} စက္ကန့်အတွင်း"},past:{other:"ပြီးခဲ့သည့် {0} စက္ကန့်"}}},"second-short":{displayName:"စက္ကန့်",relative:{0:"ယခု"},relativeTime:{future:{other:"{0} စက္ကန့်အတွင်း"},past:{other:"ပြီးခဲ့သည့် {0} စက္ကန့်"}}}}}),a.__addLocaleData({locale:"mzn",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"سال",relative:{0:"امسال",1:"سال دیگه","-1":"پارسال"},relativeTime:{future:{other:"{0} سال دله"},past:{other:"{0} سال پیش"}}},"year-short":{displayName:"سال",relative:{0:"امسال",1:"سال دیگه","-1":"پارسال"},relativeTime:{future:{other:"{0} سال دله"},past:{other:"{0} سال پیش"}}},month:{displayName:"ماه",relative:{0:"این ماه",1:"ماه ِبعد","-1":"ماه قبل"},relativeTime:{future:{other:"{0} ماه دله"},past:{other:"{0} ماه پیش"}}},"month-short":{displayName:"ماه",relative:{0:"این ماه",1:"ماه ِبعد","-1":"ماه قبل"},relativeTime:{future:{other:"{0} ماه دله"},past:{other:"{0} ماه پیش"}}},day:{displayName:"روز",relative:{0:"اَمروز",1:"فِردا","-1":"دیروز"},relativeTime:{future:{other:"{0} روز دله"},past:{other:"{0} روز پیش"}}},"day-short":{displayName:"روز",relative:{0:"اَمروز",1:"فِردا","-1":"دیروز"},relativeTime:{future:{other:"{0} روز دله"},past:{other:"{0} روز پیش"}}},hour:{displayName:"ساعِت",relative:{0:"this hour"},relativeTime:{future:{other:"{0} ساعِت دله"},past:{other:"{0} ساعِت پیش"}}},"hour-short":{displayName:"ساعت",relative:{0:"this hour"},relativeTime:{future:{other:"{0} ساعت دله"},past:{other:"{0} ساعت پیش"}}},minute:{displayName:"دقیقه",relative:{0:"this minute"},relativeTime:{future:{other:"{0} دقیقه دله"},past:{other:"{0} دَقه پیش"}}},"minute-short":{displayName:"دَقه",relative:{0:"this minute"},relativeTime:{future:{other:"{0} دَقه دله"},past:{other:"{0} دَقه پیش"}}},second:{displayName:"ثانیه",relative:{0:"now"},relativeTime:{future:{other:"{0} ثانیه دله"},past:{other:"{0} ثانیه پیش"}}},"second-short":{displayName:"ثانیه",relative:{0:"now"},relativeTime:{future:{other:"{0} ثانیه دله"},past:{other:"{0} ثانیه پیش"}}}}}),a.__addLocaleData({locale:"nah",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"naq",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"},fields:{year:{displayName:"Kurib",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Kurib",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"ǁKhâb",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"ǁKhâb",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Tsees",relative:{0:"Neetsee",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Tsees",relative:{0:"Neetsee",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Iiri",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Iiri",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Haib",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Haib",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"ǀGâub",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"ǀGâub",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"nb",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"år",relative:{0:"i år",1:"neste år","-1":"i fjor"},relativeTime:{future:{one:"om {0} år",other:"om {0} år"},past:{one:"for {0} år siden",other:"for {0} år siden"}}},"year-short":{displayName:"år",relative:{0:"i år",1:"neste år","-1":"i fjor"},relativeTime:{future:{one:"om {0} år",other:"om {0} år"},past:{one:"for {0} år siden",other:"for {0} år siden"}}},month:{displayName:"måned",relative:{0:"denne måneden",1:"neste måned","-1":"forrige måned"},relativeTime:{future:{one:"om {0} måned",other:"om {0} måneder"},past:{one:"for {0} måned siden",other:"for {0} måneder siden"}}},"month-short":{displayName:"mnd.",relative:{0:"denne md.",1:"neste md.","-1":"forrige md."},relativeTime:{future:{one:"om {0} md.",other:"om {0} md."},past:{one:"for {0} md. siden",other:"for {0} md. siden"}}},day:{displayName:"dag",relative:{0:"i dag",1:"i morgen",2:"i overmorgen","-2":"i forgårs","-1":"i går"},relativeTime:{future:{one:"om {0} døgn",other:"om {0} døgn"},past:{one:"for {0} døgn siden",other:"for {0} døgn siden"}}},"day-short":{displayName:"dag",relative:{0:"i dag",1:"i morgen",2:"i overmorgen","-2":"i forgårs","-1":"i går"},relativeTime:{future:{one:"om {0} d.",other:"om {0} d."},past:{one:"for {0} d. siden",other:"for {0} d. siden"}}},hour:{displayName:"time",relative:{0:"denne timen"},relativeTime:{future:{one:"om {0} time",other:"om {0} timer"},past:{one:"for {0} time siden",other:"for {0} timer siden"}}},"hour-short":{displayName:"t",relative:{0:"denne timen"},relativeTime:{future:{one:"om {0} t",other:"om {0} t"},past:{one:"for {0} t siden",other:"for {0} t siden"}}},minute:{displayName:"minutt",relative:{0:"dette minuttet"},relativeTime:{future:{one:"om {0} minutt",other:"om {0} minutter"},past:{one:"for {0} minutt siden",other:"for {0} minutter siden"}}},"minute-short":{displayName:"min",relative:{0:"dette minuttet"},relativeTime:{future:{one:"om {0} min",other:"om {0} min"},past:{one:"for {0} min siden",other:"for {0} min siden"}}},second:{displayName:"sekund",relative:{0:"nå"},relativeTime:{future:{one:"om {0} sekund",other:"om {0} sekunder"},past:{one:"for {0} sekund siden",other:"for {0} sekunder siden"}}},"second-short":{displayName:"sek",relative:{0:"nå"},relativeTime:{future:{one:"om {0} sek",other:"om {0} sek"},past:{one:"for {0} sek siden",other:"for {0} sek siden"}}}}}),a.__addLocaleData({locale:"nb-SJ",parentLocale:"nb"}),a.__addLocaleData({locale:"nd",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Umnyaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Umnyaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Inyangacale",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Inyangacale",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ilanga",relative:{0:"Lamuhla",1:"Kusasa","-1":"Izolo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Ilanga",relative:{0:"Lamuhla",1:"Kusasa","-1":"Izolo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Ihola",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Ihola",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Umuzuzu",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Umuzuzu",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Isekendi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Isekendi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"nds",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"nds-NL",parentLocale:"nds"});a.__addLocaleData({locale:"ne",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e;return t?a&&e>=1&&e<=4?"one":"other":1==e?"one":"other"},fields:{year:{displayName:"वर्ष",relative:{0:"यो वर्ष",1:"अर्को वर्ष","-1":"गत वर्ष"},relativeTime:{future:{one:"{0} वर्षमा",other:"{0} वर्षमा"},past:{one:"{0} वर्ष अघि",other:"{0} वर्ष अघि"}}},"year-short":{displayName:"बर्ष",relative:{0:"यो वर्ष",1:"अर्को वर्ष","-1":"गत वर्ष"},relativeTime:{future:{one:"{0} वर्षमा",other:"{0} वर्षमा"},past:{one:"{0} वर्ष अघि",other:"{0} वर्ष अघि"}}},month:{displayName:"महिना",relative:{0:"यो महिना",1:"अर्को महिना","-1":"गत महिना"},relativeTime:{future:{one:"{0} महिनामा",other:"{0} महिनामा"},past:{one:"{0} महिना पहिले",other:"{0} महिना पहिले"}}},"month-short":{displayName:"महिना",relative:{0:"यो महिना",1:"अर्को महिना","-1":"गत महिना"},relativeTime:{future:{one:"{0} महिनामा",other:"{0} महिनामा"},past:{one:"{0} महिना पहिले",other:"{0} महिना पहिले"}}},day:{displayName:"बार",relative:{0:"आज",1:"भोलि",2:"पर्सि","-2":"अस्ति","-1":"हिजो"},relativeTime:{future:{one:"{0} दिनमा",other:"{0} दिनमा"},past:{one:"{0} दिन पहिले",other:"{0} दिन पहिले"}}},"day-short":{displayName:"बार",relative:{0:"आज",1:"भोलि",2:"पर्सि","-2":"अस्ति","-1":"हिजो"},relativeTime:{future:{one:"{0} दिनमा",other:"{0} दिनमा"},past:{one:"{0} दिन पहिले",other:"{0} दिन पहिले"}}},hour:{displayName:"घण्टा",relative:{0:"यो घडीमा"},relativeTime:{future:{one:"{0} घण्टामा",other:"{0} घण्टामा"},past:{one:"{0} घण्टा पहिले",other:"{0} घण्टा पहिले"}}},"hour-short":{displayName:"घण्टा",relative:{0:"यो घडीमा"},relativeTime:{future:{one:"{0} घण्टामा",other:"{0} घण्टामा"},past:{one:"{0} घण्टा पहिले",other:"{0} घण्टा पहिले"}}},minute:{displayName:"मिनेट",relative:{0:"यही मिनेटमा"},relativeTime:{future:{one:"{0} मिनेटमा",other:"{0} मिनेटमा"},past:{one:"{0} मिनेट पहिले",other:"{0} मिनेट पहिले"}}},"minute-short":{displayName:"मिनेट",relative:{0:"यही मिनेटमा"},relativeTime:{future:{one:"{0} मिनेटमा",other:"{0} मिनेटमा"},past:{one:"{0} मिनेट पहिले",other:"{0} मिनेट पहिले"}}},second:{displayName:"सेकेन्ड",relative:{0:"अब"},relativeTime:{future:{one:"{0} सेकेण्डमा",other:"{0} सेकेण्डमा"},past:{one:"{0} सेकेण्ड पहिले",other:"{0} सेकेण्ड पहिले"}}},"second-short":{displayName:"सेकेन्ड",relative:{0:"अब"},relativeTime:{future:{one:"{0} सेकेण्डमा",other:"{0} सेकेण्डमा"},past:{one:"{0} सेकेण्ड पहिले",other:"{0} सेकेण्ड पहिले"}}}}}),a.__addLocaleData({locale:"ne-IN",parentLocale:"ne"}),a.__addLocaleData({locale:"nl",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"},fields:{year:{displayName:"jaar",relative:{0:"dit jaar",1:"volgend jaar","-1":"vorig jaar"},relativeTime:{future:{one:"over {0} jaar",other:"over {0} jaar"},past:{one:"{0} jaar geleden",other:"{0} jaar geleden"}}},"year-short":{displayName:"jr",relative:{0:"dit jaar",1:"volgend jaar","-1":"vorig jaar"},relativeTime:{future:{one:"over {0} jaar",other:"over {0} jaar"},past:{one:"{0} jaar geleden",other:"{0} jaar geleden"}}},month:{displayName:"maand",relative:{0:"deze maand",1:"volgende maand","-1":"vorige maand"},relativeTime:{future:{one:"over {0} maand",other:"over {0} maanden"},past:{one:"{0} maand geleden",other:"{0} maanden geleden"}}},"month-short":{displayName:"mnd",relative:{0:"deze maand",1:"volgende maand","-1":"vorige maand"},relativeTime:{future:{one:"over {0} maand",other:"over {0} maanden"},past:{one:"{0} maand geleden",other:"{0} maanden geleden"}}},day:{displayName:"dag",relative:{0:"vandaag",1:"morgen",2:"overmorgen","-2":"eergisteren","-1":"gisteren"},relativeTime:{future:{one:"over {0} dag",other:"over {0} dagen"},past:{one:"{0} dag geleden",other:"{0} dagen geleden"}}},"day-short":{displayName:"dag",relative:{0:"vandaag",1:"morgen",2:"overmorgen","-2":"eergisteren","-1":"gisteren"},relativeTime:{future:{one:"over {0} dag",other:"over {0} dgn"},past:{one:"{0} dag geleden",other:"{0} dgn geleden"}}},hour:{displayName:"uur",relative:{0:"binnen een uur"},relativeTime:{future:{one:"over {0} uur",other:"over {0} uur"},past:{one:"{0} uur geleden",other:"{0} uur geleden"}}},"hour-short":{displayName:"uur",relative:{0:"binnen een uur"},relativeTime:{future:{one:"over {0} uur",other:"over {0} uur"},past:{one:"{0} uur geleden",other:"{0} uur geleden"}}},minute:{displayName:"minuut",relative:{0:"binnen een minuut"},relativeTime:{future:{one:"over {0} minuut",other:"over {0} minuten"},past:{one:"{0} minuut geleden",other:"{0} minuten geleden"}}},"minute-short":{displayName:"min",relative:{0:"binnen een minuut"},relativeTime:{future:{one:"over {0} min.",other:"over {0} min."},past:{one:"{0} min. geleden",other:"{0} min. geleden"}}},second:{displayName:"seconde",relative:{0:"nu"},relativeTime:{future:{one:"over {0} seconde",other:"over {0} seconden"},past:{one:"{0} seconde geleden",other:"{0} seconden geleden"}}},"second-short":{displayName:"sec",relative:{0:"nu"},relativeTime:{future:{one:"over {0} sec.",other:"over {0} sec."},past:{one:"{0} sec. geleden",other:"{0} sec. geleden"}}}}}),a.__addLocaleData({locale:"nl-AW",parentLocale:"nl"}),a.__addLocaleData({locale:"nl-BE",parentLocale:"nl"}),a.__addLocaleData({locale:"nl-BQ",parentLocale:"nl"}),a.__addLocaleData({locale:"nl-CW",parentLocale:"nl"}),a.__addLocaleData({locale:"nl-SR",parentLocale:"nl"}),a.__addLocaleData({locale:"nl-SX",parentLocale:"nl"}),a.__addLocaleData({locale:"nmg",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Mbvu",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Mbvu",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Ngwɛn",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Ngwɛn",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Duö",relative:{0:"Dɔl",1:"Namáná","-1":"Nakugú"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Duö",relative:{0:"Dɔl",1:"Namáná","-1":"Nakugú"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Wulā",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Wulā",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Mpálâ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Mpálâ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Nyiɛl",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Nyiɛl",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"nn",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"år",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"om {0} år",other:"om {0} år"},past:{one:"for {0} år siden",other:"for {0} år siden"}}},"year-short":{displayName:"år",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"om {0} år",other:"om {0} år"},past:{one:"for {0} år siden",other:"for {0} år siden"}}},month:{displayName:"månad",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"om {0} måned",other:"om {0} måneder"},past:{one:"for {0} måned siden",other:"for {0} måneder siden"}}},"month-short":{displayName:"månad",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"om {0} måned",other:"om {0} måneder"},past:{one:"for {0} måned siden",other:"for {0} måneder siden"}}},day:{displayName:"dag",relative:{0:"i dag",1:"i morgon",2:"i overmorgon","-2":"i forgårs","-1":"i går"},relativeTime:{future:{one:"om {0} døgn",other:"om {0} døgn"},past:{one:"for {0} døgn siden",other:"for {0} døgn siden"}}},"day-short":{displayName:"dag",relative:{0:"i dag",1:"i morgon",2:"i overmorgon","-2":"i forgårs","-1":"i går"},relativeTime:{future:{one:"om {0} døgn",other:"om {0} døgn"},past:{one:"for {0} døgn siden",other:"for {0} døgn siden"}}},hour:{displayName:"time",relative:{0:"this hour"},relativeTime:{future:{one:"om {0} time",other:"om {0} timer"},past:{one:"for {0} time siden",other:"for {0} timer siden"}}},"hour-short":{displayName:"time",relative:{0:"this hour"},relativeTime:{future:{one:"om {0} time",other:"om {0} timer"},past:{one:"for {0} time siden",other:"for {0} timer siden"}}},minute:{displayName:"minutt",relative:{0:"this minute"},relativeTime:{future:{one:"om {0} minutt",other:"om {0} minutter"},past:{one:"for {0} minutt siden",other:"for {0} minutter siden"}}},"minute-short":{displayName:"minutt",relative:{0:"this minute"},relativeTime:{future:{one:"om {0} minutt",other:"om {0} minutter"},past:{one:"for {0} minutt siden",other:"for {0} minutter siden"}}},second:{displayName:"sekund",relative:{0:"now"},relativeTime:{future:{one:"om {0} sekund",other:"om {0} sekunder"},past:{one:"for {0} sekund siden",other:"for {0} sekunder siden"}}},"second-short":{displayName:"sekund",relative:{0:"now"},relativeTime:{future:{one:"om {0} sekund",other:"om {0} sekunder"},past:{one:"for {0} sekund siden",other:"for {0} sekunder siden"}}}}}),a.__addLocaleData({locale:"nnh",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"ngùʼ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"ngùʼ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"lyɛ̌ʼ",relative:{0:"lyɛ̌ʼɔɔn",1:"jǔɔ gẅie à ne ntóo","-1":"jǔɔ gẅie à ka tɔ̌g"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"lyɛ̌ʼ",relative:{0:"lyɛ̌ʼɔɔn",1:"jǔɔ gẅie à ne ntóo","-1":"jǔɔ gẅie à ka tɔ̌g"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"fʉ̀ʼ nèm",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"fʉ̀ʼ nèm",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"no",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"nqo",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"nr",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"nso",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"nus",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Ruɔ̱n",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Ruɔ̱n",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Pay",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Pay",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Cäŋ",relative:{0:"Walɛ",1:"Ruun","-1":"Pan"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Cäŋ",relative:{0:"Walɛ",1:"Ruun","-1":"Pan"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Thaak",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Thaak",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minit",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minit",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Thɛkɛni",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Thɛkɛni",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ny",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"nyn",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Omwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Omwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Omwezi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Omwezi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Eizooba",relative:{0:"Erizooba",1:"Nyenkyakare","-1":"Nyomwabazyo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Eizooba",relative:{0:"Erizooba",1:"Nyenkyakare","-1":"Nyomwabazyo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Shaaha",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Shaaha",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Edakiika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Edakiika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Obucweka/Esekendi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Obucweka/Esekendi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"om",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"om-KE",parentLocale:"om"}),a.__addLocaleData({locale:"or",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"os",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Аз",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Аз",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Мӕй",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Мӕй",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Бон",relative:{0:"Абон",1:"Сом",2:"Иннӕбон","-2":"Ӕндӕрӕбон","-1":"Знон"},relativeTime:{future:{one:"{0} боны фӕстӕ",other:"{0} боны фӕстӕ"},past:{one:"{0} бон раздӕр",other:"{0} боны размӕ"}}},"day-short":{displayName:"Бон",relative:{0:"Абон",1:"Сом",2:"Иннӕбон","-2":"Ӕндӕрӕбон","-1":"Знон"},relativeTime:{future:{one:"{0} боны фӕстӕ",other:"{0} боны фӕстӕ"},past:{one:"{0} бон раздӕр",other:"{0} боны размӕ"}}},hour:{displayName:"Сахат",relative:{0:"this hour"},relativeTime:{future:{one:"{0} сахаты фӕстӕ",other:"{0} сахаты фӕстӕ"},past:{one:"{0} сахаты размӕ",other:"{0} сахаты размӕ"}}},"hour-short":{displayName:"Сахат",relative:{0:"this hour"},relativeTime:{future:{one:"{0} сахаты фӕстӕ",other:"{0} сахаты фӕстӕ"},past:{one:"{0} сахаты размӕ",other:"{0} сахаты размӕ"}}},minute:{displayName:"Минут",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Минут",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Секунд",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Секунд",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"os-RU",parentLocale:"os"}),a.__addLocaleData({locale:"pa",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"},fields:{year:{displayName:"ਸਾਲ",relative:{0:"ਇਹ ਸਾਲ",1:"ਅਗਲਾ ਸਾਲ","-1":"ਪਿਛਲਾ ਸਾਲ"},relativeTime:{future:{one:"{0} ਸਾਲ ਵਿੱਚ",other:"{0} ਸਾਲਾਂ ਵਿੱਚ"},past:{one:"{0} ਸਾਲ ਪਹਿਲਾਂ",other:"{0} ਸਾਲ ਪਹਿਲਾਂ"}}},"year-short":{displayName:"ਸਾਲ",relative:{0:"ਇਹ ਸਾਲ",1:"ਅਗਲਾ ਸਾਲ","-1":"ਪਿਛਲਾ ਸਾਲ"},relativeTime:{future:{one:"{0} ਸਾਲ ਵਿੱਚ",other:"{0} ਸਾਲਾਂ ਵਿੱਚ"},past:{one:"{0} ਸਾਲ ਪਹਿਲਾਂ",other:"{0} ਸਾਲ ਪਹਿਲਾਂ"}}},month:{displayName:"ਮਹੀਨਾ",relative:{0:"ਇਹ ਮਹੀਨਾ",1:"ਅਗਲਾ ਮਹੀਨਾ","-1":"ਪਿਛਲਾ ਮਹੀਨਾ"},relativeTime:{future:{one:"{0} ਮਹੀਨੇ ਵਿੱਚ",other:"{0} ਮਹੀਨਿਆਂ ਵਿੱਚ"},past:{one:"{0} ਮਹੀਨਾ ਪਹਿਲਾਂ",other:"{0} ਮਹੀਨੇ ਪਹਿਲਾਂ"}}},"month-short":{displayName:"ਮਹੀਨਾ",relative:{0:"ਇਹ ਮਹੀਨਾ",1:"ਅਗਲਾ ਮਹੀਨਾ","-1":"ਪਿਛਲਾ ਮਹੀਨਾ"},relativeTime:{future:{one:"{0} ਮਹੀਨੇ ਵਿੱਚ",other:"{0} ਮਹੀਨਿਆਂ ਵਿੱਚ"},past:{one:"{0} ਮਹੀਨਾ ਪਹਿਲਾਂ",other:"{0} ਮਹੀਨੇ ਪਹਿਲਾਂ"}}},day:{displayName:"ਦਿਨ",relative:{0:"ਅੱਜ",1:"ਭਲਕੇ","-1":"ਬੀਤਿਆ ਕੱਲ੍ਹ"},relativeTime:{future:{one:"{0} ਦਿਨ ਵਿੱਚ",other:"{0} ਦਿਨਾਂ ਵਿੱਚ"},past:{one:"{0} ਦਿਨ ਪਹਿਲਾਂ",other:"{0} ਦਿਨ ਪਹਿਲਾਂ"}}},"day-short":{displayName:"ਦਿਨ",relative:{0:"ਅੱਜ",1:"ਭਲਕੇ","-1":"ਬੀਤਿਆ ਕੱਲ੍ਹ"},relativeTime:{future:{one:"{0} ਦਿਨ ਵਿੱਚ",other:"{0} ਦਿਨਾਂ ਵਿੱਚ"},past:{one:"{0} ਦਿਨ ਪਹਿਲਾਂ",other:"{0} ਦਿਨ ਪਹਿਲਾਂ"}}},hour:{displayName:"ਘੰਟਾ",relative:{0:"ਇਸ ਘੰਟੇ"},relativeTime:{future:{one:"{0} ਘੰਟੇ ਵਿੱਚ",other:"{0} ਘੰਟਿਆਂ ਵਿੱਚ"},past:{one:"{0} ਘੰਟਾ ਪਹਿਲਾਂ",other:"{0} ਘੰਟੇ ਪਹਿਲਾਂ"}}},"hour-short":{displayName:"ਘੰਟਾ",relative:{0:"ਇਸ ਘੰਟੇ"},relativeTime:{future:{one:"{0} ਘੰਟੇ ਵਿੱਚ",other:"{0} ਘੰਟਿਆਂ ਵਿੱਚ"},past:{one:"{0} ਘੰਟਾ ਪਹਿਲਾਂ",other:"{0} ਘੰਟੇ ਪਹਿਲਾਂ"}}},minute:{displayName:"ਮਿੰਟ",relative:{0:"ਇਸ ਮਿੰਟ"},relativeTime:{future:{one:"{0} ਮਿੰਟ ਵਿੱਚ",other:"{0} ਮਿੰਟਾਂ ਵਿੱਚ"},past:{one:"{0} ਮਿੰਟ ਪਹਿਲਾਂ",other:"{0} ਮਿੰਟ ਪਹਿਲਾਂ"}}},"minute-short":{displayName:"ਮਿੰਟ",relative:{0:"ਇਸ ਮਿੰਟ"},relativeTime:{future:{one:"{0} ਮਿੰਟ ਵਿੱਚ",other:"{0} ਮਿੰਟਾਂ ਵਿੱਚ"},past:{one:"{0} ਮਿੰਟ ਪਹਿਲਾਂ",other:"{0} ਮਿੰਟ ਪਹਿਲਾਂ"}}},second:{displayName:"ਸਕਿੰਟ",relative:{0:"ਹੁਣ"},relativeTime:{future:{one:"{0} ਸਕਿੰਟ ਵਿੱਚ",other:"{0} ਸਕਿੰਟਾਂ ਵਿੱਚ"},past:{one:"{0} ਸਕਿੰਟ ਪਹਿਲਾਂ",other:"{0} ਸਕਿੰਟ ਪਹਿਲਾਂ"}}},"second-short":{displayName:"ਸਕਿੰਟ",relative:{0:"ਹੁਣ"},relativeTime:{future:{one:"{0} ਸਕਿੰਟ ਵਿੱਚ",other:"{0} ਸਕਿੰਟਾਂ ਵਿੱਚ"},past:{one:"{0} ਸਕਿੰਟ ਪਹਿਲਾਂ",other:"{0} ਸਕਿੰਟ ਪਹਿਲਾਂ"}}}}}),a.__addLocaleData({locale:"pa-Arab",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"ورھا",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"ورھا",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"مہينا",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"مہينا",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"دئن",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"دئن",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"گھنٹا",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"گھنٹا",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"منٹ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"منٹ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"pa-Guru",parentLocale:"pa"}),a.__addLocaleData({locale:"pap",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"pl",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=a.slice(-1),i=a.slice(-2);return t?"other":1==e&&n?"one":n&&o>=2&&o<=4&&(i<12||i>14)?"few":n&&1!=a&&(0==o||1==o)||n&&o>=5&&o<=9||n&&i>=12&&i<=14?"many":"other"},fields:{year:{displayName:"rok",relative:{0:"w tym roku",1:"w przyszłym roku","-1":"w zeszłym roku"},relativeTime:{future:{one:"za {0} rok",few:"za {0} lata",many:"za {0} lat",other:"za {0} roku"},past:{one:"{0} rok temu",few:"{0} lata temu",many:"{0} lat temu",other:"{0} roku temu"}}},"year-short":{displayName:"r.",relative:{0:"w tym roku",1:"w przyszłym roku","-1":"w zeszłym roku"},relativeTime:{future:{one:"za {0} rok",few:"za {0} lata",many:"za {0} lat",other:"za {0} roku"},past:{one:"{0} rok temu",few:"{0} lata temu",many:"{0} lat temu",other:"{0} roku temu"}}},month:{displayName:"miesiąc",relative:{0:"w tym miesiącu",1:"w przyszłym miesiącu","-1":"w zeszłym miesiącu"},relativeTime:{future:{one:"za {0} miesiąc",few:"za {0} miesiące",many:"za {0} miesięcy",other:"za {0} miesiąca"},past:{one:"{0} miesiąc temu",few:"{0} miesiące temu",many:"{0} miesięcy temu",other:"{0} miesiąca temu"}}},"month-short":{displayName:"mies.",relative:{0:"w tym miesiącu",1:"w przyszłym miesiącu","-1":"w zeszłym miesiącu"},relativeTime:{future:{one:"za {0} mies.",few:"za {0} mies.",many:"za {0} mies.",other:"za {0} mies."},past:{one:"{0} mies. temu",few:"{0} mies. temu",many:"{0} mies. temu",other:"{0} mies. temu"}}},day:{displayName:"dzień",relative:{0:"dzisiaj",1:"jutro",2:"pojutrze","-2":"przedwczoraj","-1":"wczoraj"},relativeTime:{future:{one:"za {0} dzień",few:"za {0} dni",many:"za {0} dni",other:"za {0} dnia"},past:{one:"{0} dzień temu",few:"{0} dni temu",many:"{0} dni temu",other:"{0} dnia temu"}}},"day-short":{displayName:"dzień",relative:{0:"dzisiaj",1:"jutro",2:"pojutrze","-2":"przedwczoraj","-1":"wczoraj"},relativeTime:{future:{one:"za {0} dzień",few:"za {0} dni",many:"za {0} dni",other:"za {0} dnia"},past:{one:"{0} dzień temu",few:"{0} dni temu",many:"{0} dni temu",other:"{0} dnia temu"}}},hour:{displayName:"godzina",relative:{0:"ta godzina"},relativeTime:{future:{one:"za {0} godzinę",few:"za {0} godziny",many:"za {0} godzin",other:"za {0} godziny"},past:{one:"{0} godzinę temu",few:"{0} godziny temu",many:"{0} godzin temu",other:"{0} godziny temu"}}},"hour-short":{displayName:"godz.",relative:{0:"ta godzina"},relativeTime:{future:{one:"za {0} godz.",few:"za {0} godz.",many:"za {0} godz.",other:"za {0} godz."},past:{one:"{0} godz. temu",few:"{0} godz. temu",many:"{0} godz. temu",other:"{0} godz. temu"}}},minute:{displayName:"minuta",relative:{0:"ta minuta"},relativeTime:{future:{one:"za {0} minutę",few:"za {0} minuty",many:"za {0} minut",other:"za {0} minuty"},past:{one:"{0} minutę temu",few:"{0} minuty temu",many:"{0} minut temu",other:"{0} minuty temu"}}},"minute-short":{displayName:"min",relative:{0:"ta minuta"},relativeTime:{future:{one:"za {0} min",few:"za {0} min",many:"za {0} min",other:"za {0} min"},past:{one:"{0} min temu",few:"{0} min temu",many:"{0} min temu",other:"{0} min temu"}}},second:{displayName:"sekunda",relative:{0:"teraz"},relativeTime:{future:{one:"za {0} sekundę",few:"za {0} sekundy",many:"za {0} sekund",other:"za {0} sekundy"},past:{one:"{0} sekundę temu",few:"{0} sekundy temu",many:"{0} sekund temu",other:"{0} sekundy temu"}}},"second-short":{displayName:"sek.",relative:{0:"teraz"},relativeTime:{future:{one:"za {0} sek.",few:"za {0} sek.",many:"za {0} sek.",other:"za {0} sek."},past:{one:"{0} sek. temu",few:"{0} sek. temu",many:"{0} sek. temu",other:"{0} sek. temu"}}}}}),a.__addLocaleData({locale:"prg",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[1]||"",n=a.length,o=Number(r[0])==e,i=o&&r[0].slice(-1),l=o&&r[0].slice(-2),s=a.slice(-2),u=a.slice(-1);return t?"other":o&&0==i||l>=11&&l<=19||2==n&&s>=11&&s<=19?"zero":1==i&&11!=l||2==n&&1==u&&11!=s||2!=n&&1==u?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ps",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"pt",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0];return t?"other":0==a||1==a?"one":"other"},fields:{year:{displayName:"ano",relative:{0:"este ano",1:"próximo ano","-1":"ano passado"},relativeTime:{future:{one:"em {0} ano",other:"em {0} anos"},past:{one:"há {0} ano",other:"há {0} anos"}}},"year-short":{displayName:"ano",relative:{0:"este ano",1:"próximo ano","-1":"ano passado"},relativeTime:{future:{one:"em {0} ano",other:"em {0} anos"},past:{one:"há {0} ano",other:"há {0} anos"}}},month:{displayName:"mês",relative:{0:"este mês",1:"próximo mês","-1":"mês passado"},relativeTime:{future:{one:"em {0} mês",other:"em {0} meses"},past:{one:"há {0} mês",other:"há {0} meses"}}},"month-short":{displayName:"mês",relative:{0:"este mês",1:"próximo mês","-1":"mês passado"},relativeTime:{future:{one:"em {0} mês",other:"em {0} meses"},past:{one:"há {0} mês",other:"há {0} meses"}}},day:{displayName:"dia",relative:{0:"hoje",1:"amanhã",2:"depois de amanhã","-2":"anteontem","-1":"ontem"},relativeTime:{future:{one:"em {0} dia",other:"em {0} dias"},past:{one:"há {0} dia",other:"há {0} dias"}}},"day-short":{displayName:"dia",relative:{0:"hoje",1:"amanhã",2:"depois de amanhã","-2":"anteontem","-1":"ontem"},relativeTime:{future:{one:"em {0} dia",other:"em {0} dias"},past:{one:"há {0} dia",other:"há {0} dias"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"em {0} hora",other:"em {0} horas"},past:{one:"há {0} hora",other:"há {0} horas"}}},"hour-short":{displayName:"h",relative:{0:"esta hora"},relativeTime:{future:{one:"em {0} h",other:"em {0} h"},past:{one:"há {0} h",other:"há {0} h"}}},minute:{displayName:"minuto",relative:{0:"este minuto"},relativeTime:{future:{one:"em {0} minuto",other:"em {0} minutos"},past:{one:"há {0} minuto",other:"há {0} minutos"}}},"minute-short":{displayName:"min.",relative:{0:"este minuto"},relativeTime:{future:{one:"em {0} min.",other:"em {0} mins."},past:{one:"há {0} min.",other:"há {0} mins."}}},second:{displayName:"segundo",relative:{0:"agora"},relativeTime:{future:{one:"em {0} segundo",other:"em {0} segundos"},past:{one:"há {0} segundo",other:"há {0} segundos"}}},"second-short":{displayName:"seg.",relative:{0:"agora"},relativeTime:{future:{one:"em {0} seg.",other:"em {0} segs."},past:{one:"há {0} seg.",other:"há {0} seg."}}}}}),a.__addLocaleData({locale:"pt-AO",parentLocale:"pt-PT"}),a.__addLocaleData({locale:"pt-PT",parentLocale:"pt",fields:{year:{displayName:"ano",relative:{0:"este ano",1:"próximo ano","-1":"ano passado"},relativeTime:{future:{one:"dentro de {0} ano",other:"dentro de {0} anos"},past:{one:"há {0} ano",other:"há {0} anos"}}},"year-short":{displayName:"ano",relative:{0:"este ano",1:"próximo ano","-1":"ano passado"},relativeTime:{future:{one:"dentro de {0} ano",other:"dentro de {0} anos"},past:{one:"há {0} ano",other:"há {0} anos"}}},month:{displayName:"mês",relative:{0:"este mês",1:"próximo mês","-1":"mês passado"},relativeTime:{future:{one:"dentro de {0} mês",other:"dentro de {0} meses"},past:{one:"há {0} mês",other:"há {0} meses"}}},"month-short":{displayName:"mês",relative:{0:"este mês",1:"próximo mês","-1":"mês passado"},relativeTime:{future:{one:"dentro de {0} mês",other:"dentro de {0} meses"},past:{one:"há {0} mês",other:"há {0} meses"}}},day:{displayName:"dia",relative:{0:"hoje",1:"amanhã",2:"depois de amanhã","-2":"anteontem","-1":"ontem"},relativeTime:{future:{one:"dentro de {0} dia",other:"dentro de {0} dias"},past:{one:"há {0} dia",other:"há {0} dias"}}},"day-short":{displayName:"dia",relative:{0:"hoje",1:"amanhã",2:"depois de amanhã","-2":"anteontem","-1":"ontem"},relativeTime:{future:{one:"dentro de {0} dia",other:"dentro de {0} dias"},past:{one:"há {0} dia",other:"há {0} dias"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"há {0} hora",other:"há {0} horas"}}},"hour-short":{displayName:"h",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} h",other:"dentro de {0} h"},past:{one:"há {0} h",other:"há {0} h"}}},minute:{displayName:"minuto",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"há {0} minuto",other:"há {0} minutos"}}},"minute-short":{displayName:"min",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} min",other:"dentro de {0} min"},past:{one:"há {0} min",other:"há {0} min"}}},second:{displayName:"segundo",relative:{0:"agora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"há {0} segundo",other:"há {0} segundos"}}},"second-short":{displayName:"s",relative:{0:"agora"},relativeTime:{future:{one:"dentro de {0} s",other:"dentro de {0} s"},past:{one:"há {0} s",other:"há {0} s"}}}}}),a.__addLocaleData({locale:"pt-CH",parentLocale:"pt-PT"}),a.__addLocaleData({locale:"pt-CV",parentLocale:"pt-PT"}),a.__addLocaleData({locale:"pt-GQ",parentLocale:"pt-PT"}),a.__addLocaleData({locale:"pt-GW",parentLocale:"pt-PT"}),a.__addLocaleData({locale:"pt-LU",parentLocale:"pt-PT"}),a.__addLocaleData({locale:"pt-MO",parentLocale:"pt-PT"}),a.__addLocaleData({locale:"pt-MZ",parentLocale:"pt-PT"}),a.__addLocaleData({locale:"pt-ST",parentLocale:"pt-PT"}),a.__addLocaleData({locale:"pt-TL",parentLocale:"pt-PT"}),a.__addLocaleData({locale:"qu",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"qu-BO",parentLocale:"qu"}),a.__addLocaleData({locale:"qu-EC",parentLocale:"qu"}),a.__addLocaleData({locale:"rm",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"onn",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"onn",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"mais",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"mais",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Tag",relative:{0:"oz",1:"damaun",2:"puschmaun","-2":"stersas","-1":"ier"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Tag",relative:{0:"oz",1:"damaun",2:"puschmaun","-2":"stersas","-1":"ier"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"ura",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"ura",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"minuta",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"minuta",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"secunda",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"secunda",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"rn",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Umwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Umwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Ukwezi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Ukwezi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Umusi",relative:{0:"Uyu musi",1:"Ejo (hazoza)","-1":"Ejo (haheze)"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Umusi",relative:{0:"Uyu musi",1:"Ejo (hazoza)","-1":"Ejo (haheze)"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Isaha",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Isaha",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Umunota",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Umunota",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Isegonda",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Isegonda",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ro",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1],n=Number(r[0])==e,o=n&&r[0].slice(-2);return t?1==e?"one":"other":1==e&&a?"one":!a||0==e||1!=e&&o>=1&&o<=19?"few":"other"},fields:{year:{displayName:"an",relative:{0:"anul acesta",1:"anul viitor","-1":"anul trecut"},relativeTime:{future:{one:"peste {0} an",few:"peste {0} ani",other:"peste {0} de ani"},past:{one:"acum {0} an",few:"acum {0} ani",other:"acum {0} de ani"}}},"year-short":{displayName:"an",relative:{0:"anul acesta",1:"anul viitor","-1":"anul trecut"},relativeTime:{future:{one:"peste {0} an",few:"peste {0} ani",other:"peste {0} ani"},past:{one:"acum {0} an",few:"acum {0} ani",other:"acum {0} de ani"}}},month:{displayName:"lună",relative:{0:"luna aceasta",1:"luna viitoare","-1":"luna trecută"},relativeTime:{future:{one:"peste {0} lună",few:"peste {0} luni",other:"peste {0} de luni"},past:{one:"acum {0} lună",few:"acum {0} luni",other:"acum {0} de luni"}}},"month-short":{displayName:"lună",relative:{0:"luna aceasta",1:"luna viitoare","-1":"luna trecută"},relativeTime:{future:{one:"peste {0} lună",few:"peste {0} luni",other:"peste {0} luni"},past:{one:"acum {0} lună",few:"acum {0} luni",other:"acum {0} luni"}}},day:{displayName:"zi",relative:{0:"azi",1:"mâine",2:"poimâine","-2":"alaltăieri","-1":"ieri"},relativeTime:{future:{one:"peste {0} zi",few:"peste {0} zile",other:"peste {0} de zile"},past:{one:"acum {0} zi",few:"acum {0} zile",other:"acum {0} de zile"}}},"day-short":{displayName:"zi",relative:{0:"azi",1:"mâine",2:"poimâine","-2":"alaltăieri","-1":"ieri"},relativeTime:{future:{one:"peste {0} zi",few:"peste {0} zile",other:"peste {0} zile"},past:{one:"acum {0} zi",few:"acum {0} zile",other:"acum {0} zile"}}},hour:{displayName:"oră",relative:{0:"ora aceasta"},relativeTime:{future:{one:"peste {0} oră",few:"peste {0} ore",other:"peste {0} de ore"},past:{one:"acum {0} oră",few:"acum {0} ore",other:"acum {0} de ore"}}},"hour-short":{displayName:"h",relative:{0:"ora aceasta"},relativeTime:{future:{one:"peste {0} h",few:"peste {0} h",other:"peste {0} h"},past:{one:"acum {0} h",few:"acum {0} h",other:"acum {0} h"}}},minute:{displayName:"minut",relative:{0:"minutul acesta"},relativeTime:{future:{one:"peste {0} minut",few:"peste {0} minute",other:"peste {0} de minute"},past:{one:"acum {0} minut",few:"acum {0} minute",other:"acum {0} de minute"}}},"minute-short":{displayName:"min.",relative:{0:"minutul acesta"},relativeTime:{future:{one:"peste {0} min.",few:"peste {0} min.",other:"peste {0} min."},past:{one:"acum {0} min.",few:"acum {0} min.",other:"acum {0} min."}}},second:{displayName:"secundă",relative:{0:"acum"},relativeTime:{future:{one:"peste {0} secundă",few:"peste {0} secunde",other:"peste {0} de secunde"},past:{one:"acum {0} secundă",few:"acum {0} secunde",other:"acum {0} de secunde"}}},"second-short":{displayName:"sec.",relative:{0:"acum"},relativeTime:{future:{one:"peste {0} sec.",few:"peste {0} sec.",other:"peste {0} sec."},past:{one:"acum {0} sec.",few:"acum {0} sec.",other:"acum {0} sec."}}}}}),a.__addLocaleData({locale:"ro-MD",parentLocale:"ro"}),a.__addLocaleData({locale:"rof",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Muaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Muaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mweri",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Mweri",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Mfiri",relative:{0:"Linu",1:"Ng’ama","-1":"Hiyo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Mfiri",relative:{0:"Linu",1:"Ng’ama","-1":"Hiyo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Isaa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Isaa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Dakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Dakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ru",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=a.slice(-1),i=a.slice(-2);return t?"other":n&&1==o&&11!=i?"one":n&&o>=2&&o<=4&&(i<12||i>14)?"few":n&&0==o||n&&o>=5&&o<=9||n&&i>=11&&i<=14?"many":"other"},fields:{year:{displayName:"год",relative:{0:"в этом году",1:"в следующем году","-1":"в прошлом году"},relativeTime:{future:{one:"через {0} год",few:"через {0} года",many:"через {0} лет",other:"через {0} года"},past:{one:"{0} год назад",few:"{0} года назад",many:"{0} лет назад",other:"{0} года назад"}}},"year-short":{displayName:"г.",relative:{0:"в этом году",1:"в следующем году","-1":"в прошлом году"},relativeTime:{future:{one:"через {0} г.",few:"через {0} г.",many:"через {0} л.",other:"через {0} г."},past:{one:"{0} г. назад",few:"{0} г. назад",many:"{0} л. назад",other:"{0} г. назад"}}},month:{displayName:"месяц",relative:{0:"в этом месяце",1:"в следующем месяце","-1":"в прошлом месяце"},relativeTime:{future:{one:"через {0} месяц",few:"через {0} месяца",many:"через {0} месяцев",other:"через {0} месяца"},past:{one:"{0} месяц назад",few:"{0} месяца назад",many:"{0} месяцев назад",other:"{0} месяца назад"}}},"month-short":{displayName:"мес.",relative:{0:"в этом месяце",1:"в следующем месяце","-1":"в прошлом месяце"},relativeTime:{future:{one:"через {0} мес.",few:"через {0} мес.",many:"через {0} мес.",other:"через {0} мес."},past:{one:"{0} мес. назад",few:"{0} мес. назад",many:"{0} мес. назад",other:"{0} мес. назад"}}},day:{displayName:"день",relative:{0:"сегодня",1:"завтра",2:"послезавтра","-2":"позавчера","-1":"вчера"},relativeTime:{future:{one:"через {0} день",few:"через {0} дня",many:"через {0} дней",other:"через {0} дня"},past:{one:"{0} день назад",few:"{0} дня назад",many:"{0} дней назад",other:"{0} дня назад"}}},"day-short":{displayName:"дн.",relative:{0:"сегодня",1:"завтра",2:"послезавтра","-2":"позавчера","-1":"вчера"},relativeTime:{future:{one:"через {0} д.",few:"через {0} дн.",many:"через {0} дн.",other:"через {0} дн."},past:{one:"{0} д. назад",few:"{0} дн. назад",many:"{0} дн. назад",other:"{0} дн. назад"}}},hour:{displayName:"час",relative:{0:"в этом часе"},relativeTime:{future:{one:"через {0} час",few:"через {0} часа",many:"через {0} часов",other:"через {0} часа"},past:{one:"{0} час назад",few:"{0} часа назад",many:"{0} часов назад",other:"{0} часа назад"}}},"hour-short":{displayName:"ч.",relative:{0:"в этом часе"},relativeTime:{future:{one:"через {0} ч.",few:"через {0} ч.",many:"через {0} ч.",other:"через {0} ч."},past:{one:"{0} ч. назад",few:"{0} ч. назад",many:"{0} ч. назад",other:"{0} ч. назад"}}},minute:{displayName:"минута",relative:{0:"в эту минуту"},relativeTime:{future:{one:"через {0} минуту",few:"через {0} минуты",many:"через {0} минут",other:"через {0} минуты"},past:{one:"{0} минуту назад",few:"{0} минуты назад",many:"{0} минут назад",other:"{0} минуты назад"}}},"minute-short":{displayName:"мин.",relative:{0:"в эту минуту"},relativeTime:{future:{one:"через {0} мин.",few:"через {0} мин.",many:"через {0} мин.",other:"через {0} мин."},past:{one:"{0} мин. назад",few:"{0} мин. назад",many:"{0} мин. назад",other:"{0} мин. назад"}}},second:{displayName:"секунда",relative:{0:"сейчас"},relativeTime:{future:{one:"через {0} секунду",few:"через {0} секунды",many:"через {0} секунд",other:"через {0} секунды"},past:{one:"{0} секунду назад",few:"{0} секунды назад",many:"{0} секунд назад",other:"{0} секунды назад"}}},"second-short":{displayName:"сек.",relative:{0:"сейчас"},relativeTime:{future:{one:"через {0} сек.",few:"через {0} сек.",many:"через {0} сек.",other:"через {0} сек."},past:{one:"{0} сек. назад",few:"{0} сек. назад",many:"{0} сек. назад",other:"{0} сек. назад"}}}}}),a.__addLocaleData({locale:"ru-BY",parentLocale:"ru"}),a.__addLocaleData({locale:"ru-KG",parentLocale:"ru"}),a.__addLocaleData({locale:"ru-KZ",parentLocale:"ru"}),a.__addLocaleData({locale:"ru-MD",parentLocale:"ru"}),a.__addLocaleData({locale:"ru-UA",parentLocale:"ru"}),a.__addLocaleData({locale:"rw",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"rwk",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Maka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Maka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mori",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Mori",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Mfiri",relative:{0:"Inu",1:"Ngama","-1":"Ukou"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Mfiri",relative:{0:"Inu",1:"Ngama","-1":"Ukou"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Dakyika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Dakyika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"sah",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Сыл",relative:{0:"быйыл",1:"эһиил","-1":"Былырыын"},relativeTime:{future:{other:"{0} сылынан"},past:{other:"{0} сыл ынараа өттүгэр"}}},"year-short":{displayName:"Сыл",relative:{0:"быйыл",1:"эһиил","-1":"Былырыын"},relativeTime:{future:{other:"{0} сылынан"},past:{other:"{0} сыл ынараа өттүгэр"}}},month:{displayName:"Ый",relative:{0:"бу ый",1:"аныгыскы ый","-1":"ааспыт ый"},relativeTime:{future:{other:"{0} ыйынан"},past:{other:"{0} ый ынараа өттүгэр"}}},"month-short":{displayName:"Ый",relative:{0:"бу ый",1:"аныгыскы ый","-1":"ааспыт ый"},relativeTime:{future:{other:"{0} ыйынан"},past:{other:"{0} ый ынараа өттүгэр"}}},day:{displayName:"Күн",relative:{0:"Бүгүн",1:"Сарсын",2:"Өйүүн","-2":"Иллэрээ күн","-1":"Бэҕэһээ"},relativeTime:{future:{other:"{0} күнүнэн"},past:{other:"{0} күн ынараа өттүгэр"}}},"day-short":{displayName:"Күн",relative:{0:"Бүгүн",1:"Сарсын",2:"Өйүүн","-2":"Иллэрээ күн","-1":"Бэҕэһээ"},relativeTime:{future:{other:"{0} күнүнэн"},past:{other:"{0} күн ынараа өттүгэр"}}},hour:{displayName:"Чаас",relative:{0:"this hour"},relativeTime:{future:{other:"{0} чааһынан"},past:{other:"{0} чаас ынараа өттүгэр"}}},"hour-short":{displayName:"Чаас",relative:{0:"this hour"},relativeTime:{future:{other:"{0} чааһынан"},past:{other:"{0} чаас ынараа өттүгэр"}}},minute:{displayName:"Мүнүүтэ",relative:{0:"this minute"},relativeTime:{future:{other:"{0} мүнүүтэннэн"},past:{other:"{0} мүнүүтэ ынараа өттүгэр"}}},"minute-short":{displayName:"Мүнүүтэ",relative:{0:"this minute"},relativeTime:{future:{other:"{0} мүнүүтэннэн"},past:{other:"{0} мүнүүтэ ынараа өттүгэр"}}},second:{displayName:"Сөкүүндэ",relative:{0:"билигин"},relativeTime:{future:{other:"{0} сөкүүндэннэн"},past:{other:"{0} сөкүүндэ ынараа өттүгэр"}}},"second-short":{displayName:"Сөкүүндэ",relative:{0:"билигин"},relativeTime:{future:{other:"{0} сөкүүндэннэн"},past:{other:"{0} сөк. анараа өттүгэр"}}}}}),a.__addLocaleData({locale:"saq",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Lari",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Lari",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Lapa",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Lapa",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Mpari",relative:{0:"Duo",1:"Taisere","-1":"Ng’ole"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Mpari",relative:{0:"Duo",1:"Taisere","-1":"Ng’ole"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Saai",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Saai",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Idakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Idakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Isekondi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Isekondi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"sbp",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Mwakha",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Mwakha",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mwesi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Mwesi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Lusiku",relative:{0:"Ineng’uni",1:"Pamulaawu","-1":"Imehe"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Lusiku",relative:{0:"Ineng’uni",1:"Pamulaawu","-1":"Imehe"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Ilisala",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Ilisala",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Idakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Idakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Isekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Isekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"sdh",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"se",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"},fields:{year:{displayName:"jáhki",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"{0} jahki maŋŋilit",two:"{0} jahkki maŋŋilit",other:"{0} jahkki maŋŋilit"},past:{one:"{0} jahki árat",two:"{0} jahkki árat",other:"{0} jahkki árat"}}},"year-short":{displayName:"jáhki",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"{0} jahki maŋŋilit",two:"{0} jahkki maŋŋilit",other:"{0} jahkki maŋŋilit"},past:{one:"{0} jahki árat",two:"{0} jahkki árat",other:"{0} jahkki árat"}}},month:{displayName:"mánnu",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"{0} mánotbadji maŋŋilit",two:"{0} mánotbadji maŋŋilit",other:"{0} mánotbadji maŋŋilit"},past:{one:"{0} mánotbadji árat",two:"{0} mánotbadji árat",other:"{0} mánotbadji árat"}}},"month-short":{displayName:"mánnu",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"{0} mánotbadji maŋŋilit",two:"{0} mánotbadji maŋŋilit",other:"{0} mánotbadji maŋŋilit"},past:{one:"{0} mánotbadji árat",two:"{0} mánotbadji árat",other:"{0} mánotbadji árat"}}},day:{displayName:"beaivi",relative:{0:"odne",1:"ihttin",2:"paijeelittáá","-2":"oovdebpeivvi","-1":"ikte"},relativeTime:{future:{one:"{0} jándor maŋŋilit",two:"{0} jándor amaŋŋilit",other:"{0} jándora maŋŋilit"},past:{one:"{0} jándor árat",two:"{0} jándora árat",other:"{0} jándora árat"}}},"day-short":{displayName:"beaivi",relative:{0:"odne",1:"ihttin",2:"paijeelittáá","-2":"oovdebpeivvi","-1":"ikte"},relativeTime:{future:{one:"{0} jándor maŋŋilit",two:"{0} jándor amaŋŋilit",other:"{0} jándora maŋŋilit"},past:{one:"{0} jándor árat",two:"{0} jándora árat",other:"{0} jándora árat"}}},hour:{displayName:"diibmu",relative:{0:"this hour"},relativeTime:{future:{one:"{0} diibmu maŋŋilit",two:"{0} diibmur maŋŋilit",other:"{0} diibmur maŋŋilit"},past:{one:"{0} diibmu árat",two:"{0} diibmur árat",other:"{0} diibmur árat"}}},"hour-short":{displayName:"diibmu",relative:{0:"this hour"},relativeTime:{future:{one:"{0} diibmu maŋŋilit",two:"{0} diibmur maŋŋilit",other:"{0} diibmur maŋŋilit"},past:{one:"{0} diibmu árat",two:"{0} diibmur árat",other:"{0} diibmur árat"}}},minute:{displayName:"minuhtta",relative:{0:"this minute"},relativeTime:{future:{one:"{0} minuhta maŋŋilit",two:"{0} minuhtta maŋŋilit",other:"{0} minuhtta maŋŋilit"},past:{one:"{0} minuhta árat",two:"{0} minuhtta árat",other:"{0} minuhtta árat"}}},"minute-short":{displayName:"minuhtta",relative:{0:"this minute"},relativeTime:{future:{one:"{0} minuhta maŋŋilit",two:"{0} minuhtta maŋŋilit",other:"{0} minuhtta maŋŋilit"},past:{one:"{0} minuhta árat",two:"{0} minuhtta árat",other:"{0} minuhtta árat"}}},second:{displayName:"sekunda",relative:{0:"now"},relativeTime:{future:{one:"{0} sekunda maŋŋilit",two:"{0} sekundda maŋŋilit",other:"{0} sekundda maŋŋilit"},past:{one:"{0} sekunda árat",two:"{0} sekundda árat",other:"{0} sekundda árat"}}},"second-short":{displayName:"sekunda",relative:{0:"now"},relativeTime:{future:{one:"{0} sekunda maŋŋilit",two:"{0} sekundda maŋŋilit",other:"{0} sekundda maŋŋilit"},past:{one:"{0} sekunda árat",two:"{0} sekundda árat",other:"{0} sekundda árat"}}}}}),a.__addLocaleData({locale:"se-FI",parentLocale:"se",fields:{year:{displayName:"jahki",relative:{0:"dán jagi",1:"boahtte jagi","-1":"mannan jagi"},relativeTime:{future:{one:"{0} jagi siste",two:"{0} jagi siste",other:"{0} jagi siste"},past:{one:"{0} jagi árat",two:"{0} jagi árat",other:"{0} jagi árat"}}},"year-short":{displayName:"j.",relative:{0:"dán jagi",1:"boahtte jagi","-1":"mannan jagi"},relativeTime:{future:{one:"{0} jagi siste",two:"{0} jagi siste",other:"{0} jagi siste"},past:{one:"{0} jagi árat",two:"{0} jagi árat",other:"{0} jagi árat"}}},month:{displayName:"mánnu",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"{0} mánotbadji maŋŋilit",two:"{0} mánotbadji maŋŋilit",other:"{0} mánotbadji maŋŋilit"},past:{one:"{0} mánotbadji árat",two:"{0} mánotbadji árat",other:"{0} mánotbadji árat"}}},"month-short":{displayName:"mánnu",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"{0} mánotbadji maŋŋilit",two:"{0} mánotbadji maŋŋilit",other:"{0} mánotbadji maŋŋilit"},past:{one:"{0} mánotbadji árat",two:"{0} mánotbadji árat",other:"{0} mánotbadji árat"}}},day:{displayName:"beaivi",relative:{0:"odne",1:"ihttin",2:"paijeelittáá","-2":"oovdebpeivvi","-1":"ikte"},relativeTime:{future:{one:"{0} jándor maŋŋilit",two:"{0} jándor amaŋŋilit",other:"{0} jándora maŋŋilit"},past:{one:"{0} jándor árat",two:"{0} jándora árat",other:"{0} jándora árat"}}},"day-short":{displayName:"beaivi",relative:{0:"odne",1:"ihttin",2:"paijeelittáá","-2":"oovdebpeivvi","-1":"ikte"},relativeTime:{future:{one:"{0} jándor maŋŋilit",two:"{0} jándor amaŋŋilit",other:"{0} jándora maŋŋilit"},past:{one:"{0} jándor árat",two:"{0} jándora árat",other:"{0} jándora árat"}}},hour:{displayName:"diibmu",relative:{0:"this hour"},relativeTime:{future:{one:"{0} diibmu maŋŋilit",two:"{0} diibmur maŋŋilit",other:"{0} diibmur maŋŋilit"},past:{one:"{0} diibmu árat",two:"{0} diibmur árat",other:"{0} diibmur árat"}}},"hour-short":{displayName:"diibmu",relative:{0:"this hour"},relativeTime:{future:{one:"{0} diibmu maŋŋilit",two:"{0} diibmur maŋŋilit",other:"{0} diibmur maŋŋilit"},past:{one:"{0} diibmu árat",two:"{0} diibmur árat",other:"{0} diibmur árat"}}},minute:{displayName:"minuhtta",relative:{0:"this minute"},relativeTime:{future:{one:"{0} minuhta maŋŋilit",two:"{0} minuhtta maŋŋilit",other:"{0} minuhtta maŋŋilit"},past:{one:"{0} minuhta árat",two:"{0} minuhtta árat",other:"{0} minuhtta árat"}}},"minute-short":{displayName:"minuhtta",relative:{0:"this minute"},relativeTime:{future:{one:"{0} minuhta maŋŋilit",two:"{0} minuhtta maŋŋilit",other:"{0} minuhtta maŋŋilit"},past:{one:"{0} minuhta árat",two:"{0} minuhtta árat",other:"{0} minuhtta árat"}}},second:{displayName:"sekunda",relative:{0:"now"},relativeTime:{future:{one:"{0} sekunda maŋŋilit",two:"{0} sekundda maŋŋilit",other:"{0} sekundda maŋŋilit"},past:{one:"{0} sekunda árat",two:"{0} sekundda árat",other:"{0} sekundda árat"}}},"second-short":{displayName:"sekunda",relative:{0:"now"},relativeTime:{future:{one:"{0} sekunda maŋŋilit",two:"{0} sekundda maŋŋilit",other:"{0} sekundda maŋŋilit"},past:{one:"{0} sekunda árat",two:"{0} sekundda árat",other:"{0} sekundda árat"}}}}}),a.__addLocaleData({locale:"se-SE",parentLocale:"se"}),a.__addLocaleData({locale:"seh",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Chaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Chaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mwezi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Mwezi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ntsiku",relative:{0:"Lero",1:"Manguana","-1":"Zuro"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Ntsiku",relative:{0:"Lero",1:"Manguana","-1":"Zuro"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hora",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hora",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minuto",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minuto",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Segundo",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Segundo",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ses",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Jiiri",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Jiiri",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Handu",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Handu",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Zaari",relative:{0:"Hõo",1:"Suba","-1":"Bi"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Zaari",relative:{0:"Hõo",1:"Suba","-1":"Bi"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Guuru",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Guuru",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Miniti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Miniti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Miti",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Miti",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"sg",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Ngû",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Ngû",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Nze",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Nze",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Lâ",relative:{0:"Lâsô",1:"Kêkerêke","-1":"Bîrï"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Lâ",relative:{0:"Lâsô",1:"Kêkerêke","-1":"Bîrï"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Ngbonga",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Ngbonga",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Ndurü ngbonga",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Ndurü ngbonga",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Nzîna ngbonga",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Nzîna ngbonga",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"sh",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=a.slice(-2),s=n.slice(-1),u=n.slice(-2);return t?"other":o&&1==i&&11!=l||1==s&&11!=u?"one":o&&i>=2&&i<=4&&(l<12||l>14)||s>=2&&s<=4&&(u<12||u>14)?"few":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"shi",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e;return t?"other":e>=0&&e<=1?"one":a&&e>=2&&e<=10?"few":"other"},fields:{year:{displayName:"ⴰⵙⴳⴳⵯⴰⵙ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"ⴰⵙⴳⴳⵯⴰⵙ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"ⴰⵢⵢⵓⵔ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"ⴰⵢⵢⵓⵔ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"ⴰⵙⵙ",relative:{0:"ⴰⵙⵙⴰ",1:"ⴰⵙⴽⴽⴰ","-1":"ⵉⴹⵍⵍⵉ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"ⴰⵙⵙ",relative:{0:"ⴰⵙⵙⴰ",1:"ⴰⵙⴽⴽⴰ","-1":"ⵉⴹⵍⵍⵉ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"ⵜⴰⵙⵔⴰⴳⵜ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"ⵜⴰⵙⵔⴰⴳⵜ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"ⵜⵓⵙⴷⵉⴷⵜ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"ⵜⵓⵙⴷⵉⴷⵜ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"ⵜⴰⵙⵉⵏⵜ",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"ⵜⴰⵙⵉⵏⵜ",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"shi-Latn",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"asggʷas",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"asggʷas",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"ayyur",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"ayyur",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"ass",relative:{0:"assa",1:"askka","-1":"iḍlli"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"ass",relative:{0:"assa",1:"askka","-1":"iḍlli"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"tasragt",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"tasragt",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"tusdidt",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"tusdidt",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"tasint",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"tasint",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"shi-Tfng",parentLocale:"shi"}),a.__addLocaleData({locale:"si",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"";return t?"other":0==e||1==e||0==a&&1==n?"one":"other"},fields:{year:{displayName:"වර්ෂය",relative:{0:"මෙම වසර",1:"ඊළඟ වසර","-1":"පසුගිය වසර"},relativeTime:{future:{one:"වසර {0}කින්",other:"වසර {0}කින්"},past:{one:"වසර {0}කට පෙර",other:"වසර {0}කට පෙර"}}},"year-short":{displayName:"වර්.",relative:{0:"මෙම වසර",1:"ඊළඟ වසර","-1":"පසුගිය වසර"},relativeTime:{future:{one:"වසර {0}කින්",other:"වසර {0}කින්"},past:{one:"වසර {0}කට පෙර",other:"වසර {0}කට පෙර"}}},month:{displayName:"මාසය",relative:{0:"මෙම මාසය",1:"ඊළඟ මාසය","-1":"පසුගිය මාසය"},relativeTime:{future:{one:"මාස {0}කින්",other:"මාස {0}කින්"},past:{one:"මාස {0}කට පෙර",other:"මාස {0}කට පෙර"}}},"month-short":{displayName:"මාස.",relative:{0:"මෙම මාස.",1:"ඊළඟ මාස.","-1":"පසුගිය මාස."},relativeTime:{future:{one:"මාස {0}කින්",other:"මාස {0}කින්"},past:{one:"මාස {0}කට පෙර",other:"මාස {0}කට පෙර"}}},day:{displayName:"දිනය",relative:{0:"අද",1:"හෙට",2:"අනිද්දා","-2":"පෙරේදා","-1":"ඊයේ"},relativeTime:{future:{one:"දින {0}න්",other:"දින {0}න්"},past:{one:"දින {0}කට පෙර",other:"දින {0}කට පෙර"}}},"day-short":{displayName:"දිනය",relative:{0:"අද",1:"හෙට",2:"අනිද්දා","-2":"පෙරේදා","-1":"ඊයේ"},relativeTime:{future:{one:"දින {0}න්",other:"දින {0}න්"},past:{one:"දින {0}කට පෙර",other:"දින {0}කට පෙර"}}},hour:{displayName:"පැය",relative:{0:"මෙම පැය"},relativeTime:{future:{one:"පැය {0}කින්",other:"පැය {0}කින්"},past:{one:"පැය {0}කට පෙර",other:"පැය {0}කට පෙර"}}},"hour-short":{displayName:"පැය",relative:{0:"මෙම පැය"},relativeTime:{future:{one:"පැය {0}කින්",other:"පැය {0}කින්"},past:{one:"පැය {0}කට පෙර",other:"පැය {0}කට පෙර"}}},minute:{displayName:"මිනිත්තුව",relative:{0:"මෙම මිනිත්තුව"},relativeTime:{future:{one:"මිනිත්තු {0}කින්",other:"මිනිත්තු {0}කින්"},past:{one:"මිනිත්තු {0}කට පෙර",other:"මිනිත්තු {0}කට පෙර"}}},"minute-short":{displayName:"මිනි.",relative:{0:"මෙම මිනිත්තුව"},relativeTime:{future:{one:"මිනිත්තු {0}කින්",other:"මිනිත්තු {0}කින්"},past:{one:"මිනිත්තු {0}කට පෙර",other:"මිනිත්තු {0}කට පෙර"}}},second:{displayName:"තත්පරය",relative:{0:"දැන්"},relativeTime:{future:{one:"තත්පර {0}කින්",other:"තත්පර {0}කින්"},past:{one:"තත්පර {0}කට පෙර",other:"තත්පර {0}කට පෙර"}}},"second-short":{displayName:"තත්.",relative:{0:"දැන්"},relativeTime:{future:{one:"තත්පර {0}කින්",other:"තත්පර {0}කින්"},past:{one:"තත්පර {0}කට පෙර",other:"තත්පර {0}කට පෙර"}}}}}),a.__addLocaleData({locale:"sk",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1];return t?"other":1==e&&n?"one":a>=2&&a<=4&&n?"few":n?"other":"many"},fields:{year:{displayName:"rok",relative:{0:"tento rok",1:"budúci rok","-1":"minulý rok"},relativeTime:{future:{one:"o {0} rok",few:"o {0} roky",many:"o {0} roka",other:"o {0} rokov"},past:{one:"pred {0} rokom",few:"pred {0} rokmi",many:"pred {0} roka",other:"pred {0} rokmi"}}},"year-short":{displayName:"r.",relative:{0:"tento rok",1:"budúci rok","-1":"minulý rok"},relativeTime:{future:{one:"o {0} r.",few:"o {0} r.",many:"o {0} r.",other:"o {0} r."},past:{one:"pred {0} r.",few:"pred {0} r.",many:"pred {0} r.",other:"pred {0} r."}}},month:{displayName:"mesiac",relative:{0:"tento mesiac",1:"budúci mesiac","-1":"minulý mesiac"},relativeTime:{future:{one:"o {0} mesiac",few:"o {0} mesiace",many:"o {0} mesiaca",other:"o {0} mesiacov"},past:{one:"pred {0} mesiacom",few:"pred {0} mesiacmi",many:"pred {0} mesiaca",other:"pred {0} mesiacmi"}}},"month-short":{displayName:"mes.",relative:{0:"tento mesiac",1:"budúci mesiac","-1":"minulý mesiac"},relativeTime:{future:{one:"o {0} mes.",few:"o {0} mes.",many:"o {0} mes.",other:"o {0} mes."},past:{one:"pred {0} mes.",few:"pred {0} mes.",many:"pred {0} mes.",other:"pred {0} mes."}}},day:{displayName:"deň",relative:{0:"dnes",1:"zajtra",2:"pozajtra","-2":"predvčerom","-1":"včera"},relativeTime:{future:{one:"o {0} deň",few:"o {0} dni",many:"o {0} dňa",other:"o {0} dní"},past:{one:"pred {0} dňom",few:"pred {0} dňami",many:"pred {0} dňa",other:"pred {0} dňami"}}},"day-short":{displayName:"d.",relative:{0:"dnes",1:"zajtra",2:"pozajtra","-2":"predvčerom","-1":"včera"},relativeTime:{future:{one:"o {0} d.",few:"o {0} d.",many:"o {0} d.",other:"o {0} d."},past:{one:"pred {0} d.",few:"pred {0} d.",many:"pred {0} d.",other:"pred {0} d."}}},hour:{displayName:"hodina",relative:{0:"v tejto hodine"},relativeTime:{future:{one:"o {0} hodinu",few:"o {0} hodiny",many:"o {0} hodiny",other:"o {0} hodín"},past:{one:"pred {0} hodinou",few:"pred {0} hodinami",many:"pred {0} hodinou",other:"pred {0} hodinami"}}},"hour-short":{displayName:"h",relative:{0:"v tejto hodine"},relativeTime:{future:{one:"o {0} h",few:"o {0} h",many:"o {0} h",other:"o {0} h"},past:{one:"pred {0} h",few:"pred {0} h",many:"pred {0} h",other:"pred {0} h"}}},minute:{displayName:"minúta",relative:{0:"v tejto minúte"},relativeTime:{future:{one:"o {0} minútu",few:"o {0} minúty",many:"o {0} minúty",other:"o {0} minút"},past:{one:"pred {0} minútou",few:"pred {0} minútami",many:"pred {0} minúty",other:"pred {0} minútami"}}},"minute-short":{displayName:"min",relative:{0:"v tejto minúte"},relativeTime:{future:{one:"o {0} min",few:"o {0} min",many:"o {0} min",other:"o {0} min"},past:{one:"pred {0} min",few:"pred {0} min",many:"pred {0} min",other:"pred {0} min"}}},second:{displayName:"sekunda",relative:{0:"teraz"},relativeTime:{future:{one:"o {0} sekundu",few:"o {0} sekundy",many:"o {0} sekundy",other:"o {0} sekúnd"},past:{one:"pred {0} sekundou",few:"pred {0} sekundami",many:"pred {0} sekundy",other:"pred {0} sekundami"}}},"second-short":{displayName:"s",relative:{0:"teraz"},relativeTime:{future:{one:"o {0} s",few:"o {0} s",many:"o {0} s",other:"o {0} s"},past:{one:"pred {0} s",few:"pred {0} s",many:"pred {0} s",other:"pred {0} s"}}}}}),a.__addLocaleData({locale:"sl",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=a.slice(-2);return t?"other":n&&1==o?"one":n&&2==o?"two":n&&(3==o||4==o)||!n?"few":"other"},fields:{year:{displayName:"leto",relative:{0:"letos",1:"naslednje leto","-1":"lani"},relativeTime:{future:{one:"čez {0} leto",two:"čez {0} leti",few:"čez {0} leta",other:"čez {0} let"},past:{one:"pred {0} letom",two:"pred {0} letoma",few:"pred {0} leti",other:"pred {0} leti"}}},"year-short":{displayName:"leto",relative:{0:"letos",1:"naslednje leto","-1":"lani"},relativeTime:{future:{one:"čez {0} leto",two:"čez {0} leti",few:"čez {0} leta",other:"čez {0} let"},past:{one:"pred {0} letom",two:"pred {0} letoma",few:"pred {0} leti",other:"pred {0} leti"}}},month:{displayName:"mesec",relative:{0:"ta mesec",1:"naslednji mesec","-1":"prejšnji mesec"},relativeTime:{future:{one:"čez {0} mesec",two:"čez {0} meseca",few:"čez {0} mesece",other:"čez {0} mesecev"},past:{one:"pred {0} mesecem",two:"pred {0} mesecema",few:"pred {0} meseci",other:"pred {0} meseci"}}},"month-short":{displayName:"mes.",relative:{0:"ta mesec",1:"naslednji mesec","-1":"prejšnji mesec"},relativeTime:{future:{one:"čez {0} mes.",two:"čez {0} mes.",few:"čez {0} mesece",other:"čez {0} mes."},past:{one:"pred {0} mes.",two:"pred {0} mes.",few:"pred {0} mes.",other:"pred {0} mes."}}},day:{displayName:"dan",relative:{0:"danes",1:"jutri",2:"pojutrišnjem","-2":"predvčerajšnjim","-1":"včeraj"},relativeTime:{future:{one:"čez {0} dan",two:"čez {0} dneva",few:"čez {0} dni",other:"čez {0} dni"},past:{one:"pred {0} dnevom",two:"pred {0} dnevoma",few:"pred {0} dnevi",other:"pred {0} dnevi"}}},"day-short":{displayName:"dan",relative:{0:"danes",1:"jutri",2:"pojutrišnjem","-2":"predvčerajšnjim","-1":"včeraj"},relativeTime:{future:{one:"čez {0} dan",two:"čez {0} dneva",few:"čez {0} dni",other:"čez {0} dni"},past:{one:"pred {0} dnevom",two:"pred {0} dnevoma",few:"pred {0} dnevi",other:"pred {0} dnevi"}}},hour:{displayName:"ura",relative:{0:"v tej uri"},relativeTime:{future:{one:"čez {0} uro",two:"čez {0} uri",few:"čez {0} ure",other:"čez {0} ur"},past:{one:"pred {0} uro",two:"pred {0} urama",few:"pred {0} urami",other:"pred {0} urami"}}},"hour-short":{displayName:"ura",relative:{0:"v tej uri"},relativeTime:{future:{one:"čez {0} uro",two:"čez {0} uri",few:"čez {0} ure",other:"čez {0} ur"},past:{one:"pred {0} uro",two:"pred {0} urama",few:"pred {0} urami",other:"pred {0} urami"}}},minute:{displayName:"minuta",relative:{0:"to minuto"},relativeTime:{future:{one:"čez {0} minuto",two:"čez {0} minuti",few:"čez {0} minute",other:"čez {0} minut"},past:{one:"pred {0} minuto",two:"pred {0} minutama",few:"pred {0} minutami",other:"pred {0} minutami"}}},"minute-short":{displayName:"min.",relative:{0:"to minuto"},relativeTime:{future:{one:"čez {0} min.",two:"čez {0} min.",few:"čez {0} min.",other:"čez {0} min."},past:{one:"pred {0} min.",two:"pred {0} min.",few:"pred {0} min.",other:"pred {0} min."}}},second:{displayName:"sekunda",relative:{0:"zdaj"},relativeTime:{future:{one:"čez {0} sekundo",two:"čez {0} sekundi",few:"čez {0} sekunde",other:"čez {0} sekund"},past:{one:"pred {0} sekundo",two:"pred {0} sekundama",few:"pred {0} sekundami",other:"pred {0} sekundami"}}},"second-short":{displayName:"sek.",relative:{0:"zdaj"},relativeTime:{future:{one:"čez {0} s",two:"čez {0} s",few:"čez {0} s",other:"čez {0} s"},past:{one:"pred {0} s",two:"pred {0} s",few:"pred {0} s",other:"pred {0} s"}}}}}),a.__addLocaleData({locale:"sma",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"smi",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"smj",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"smn",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"sms",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"sn",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Gore",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Gore",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mwedzi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Mwedzi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Zuva",relative:{0:"Nhasi",1:"Mangwana","-1":"Nezuro"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Zuva",relative:{0:"Nhasi",1:"Mangwana","-1":"Nezuro"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Awa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Awa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Mineti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Mineti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekondi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Sekondi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"so",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"+{0} y",other:"+{0} y"},past:{one:"-{0} y",other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"+{0} y",other:"+{0} y"},past:{one:"-{0} y",other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"+{0} m",other:"+{0} m"},past:{one:"-{0} m",other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"+{0} m",other:"+{0} m"},past:{one:"-{0} m",other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"Maanta",1:"Berri","-1":"Shalay"},relativeTime:{future:{one:"+{0} d",other:"+{0} d"},past:{one:"-{0} d",other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"Maanta",1:"Berri","-1":"Shalay"},relativeTime:{future:{one:"+{0} d",other:"+{0} d"},past:{one:"-{0} d",other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{one:"+{0} h",other:"+{0} h"},past:{one:"-{0} h",other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{one:"+{0} h",other:"+{0} h"},past:{one:"-{0} h",other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{one:"+{0} min",other:"+{0} min"},past:{one:"-{0} min",other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{one:"+{0} min",other:"+{0} min"},past:{one:"-{0} min",other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{one:"+{0} s",other:"+{0} s"},past:{one:"-{0} s",other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{one:"+{0} s",other:"+{0} s"},past:{one:"-{0} s",other:"-{0} s"}}}}}),a.__addLocaleData({locale:"so-DJ",parentLocale:"so"}),a.__addLocaleData({locale:"so-ET",parentLocale:"so"}),a.__addLocaleData({locale:"so-KE",parentLocale:"so"}),a.__addLocaleData({locale:"sq",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e,n=a&&r[0].slice(-1),o=a&&r[0].slice(-2);return t?1==e?"one":4==n&&14!=o?"many":"other":1==e?"one":"other"},fields:{year:{displayName:"vit",relative:{0:"këtë vit",1:"vitin e ardhshëm","-1":"vitin e kaluar"},relativeTime:{future:{one:"pas {0} viti",other:"pas {0} vjetësh"},past:{one:"{0} vit më parë",other:"{0} vjet më parë"}}},"year-short":{displayName:"vit",relative:{0:"këtë vit",1:"vitin e ardhshëm","-1":"vitin e kaluar"},relativeTime:{future:{one:"pas {0} viti",other:"pas {0} vjetësh"},past:{one:"{0} vit më parë",other:"{0} vjet më parë"}}},month:{displayName:"muaj",relative:{0:"këtë muaj",1:"muajin e ardhshëm","-1":"muajin e kaluar"},relativeTime:{future:{one:"pas {0} muaji",other:"pas {0} muajsh"},past:{one:"{0} muaj më parë",other:"{0} muaj më parë"}}},"month-short":{displayName:"muaj",relative:{0:"këtë muaj",1:"muajin e ardhshëm","-1":"muajin e kaluar"},relativeTime:{future:{one:"pas {0} muaji",other:"pas {0} muajsh"},past:{one:"{0} muaj më parë",other:"{0} muaj më parë"}}},day:{displayName:"ditë",relative:{0:"sot",1:"nesër","-1":"dje"},relativeTime:{future:{one:"pas {0} dite",other:"pas {0} ditësh"},past:{one:"{0} ditë më parë",other:"{0} ditë më parë"}}},"day-short":{displayName:"ditë",relative:{0:"sot",1:"nesër","-1":"dje"},relativeTime:{future:{one:"pas {0} dite",other:"pas {0} ditësh"},past:{one:"{0} ditë më parë",other:"{0} ditë më parë"}}},hour:{displayName:"orë",relative:{0:"këtë orë"},relativeTime:{future:{one:"pas {0} ore",other:"pas {0} orësh"},past:{one:"{0} orë më parë",other:"{0} orë më parë"}}},"hour-short":{displayName:"orë",relative:{0:"këtë orë"},relativeTime:{future:{one:"pas {0} ore",other:"pas {0} orësh"},past:{one:"{0} orë më parë",other:"{0} orë më parë"}}},minute:{displayName:"minutë",relative:{0:"këtë minutë"},relativeTime:{future:{one:"pas {0} minute",other:"pas {0} minutash"},past:{one:"{0} minutë më parë",other:"{0} minuta më parë"}}},"minute-short":{displayName:"min.",relative:{0:"këtë minutë"},relativeTime:{future:{one:"pas {0} min.",other:"pas {0} min."},past:{one:"{0} min. më parë",other:"{0} min. më parë"}}},second:{displayName:"sekondë",relative:{0:"tani"},relativeTime:{future:{one:"pas {0} sekonde",other:"pas {0} sekondash"},past:{one:"{0} sekondë më parë",other:"{0} sekonda më parë"}}},"second-short":{displayName:"sek.",relative:{0:"tani"},relativeTime:{future:{one:"pas {0} sek.",other:"pas {0} sek."},past:{one:"{0} sek. më parë",other:"{0} sek. më parë"}}}}}),a.__addLocaleData({locale:"sq-MK",parentLocale:"sq"}),a.__addLocaleData({locale:"sq-XK",parentLocale:"sq"}),a.__addLocaleData({locale:"sr",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=a.slice(-2),s=n.slice(-1),u=n.slice(-2);return t?"other":o&&1==i&&11!=l||1==s&&11!=u?"one":o&&i>=2&&i<=4&&(l<12||l>14)||s>=2&&s<=4&&(u<12||u>14)?"few":"other"},fields:{year:{displayName:"година",relative:{0:"ове године",1:"следеће године","-1":"прошле године"},relativeTime:{future:{one:"за {0} годину",few:"за {0} године",other:"за {0} година"},past:{one:"пре {0} године",few:"пре {0} године",other:"пре {0} година"}}},"year-short":{displayName:"год.",relative:{0:"ове године",1:"следеће године","-1":"прошле године"},relativeTime:{future:{one:"за {0} год.",few:"за {0} год.",other:"за {0} год."},past:{one:"пре {0} год.",few:"пре {0} год.",other:"пре {0} год."}}},month:{displayName:"месец",relative:{0:"овог месеца",1:"следећег месеца","-1":"прошлог месеца"},relativeTime:{future:{one:"за {0} месец",few:"за {0} месеца",other:"за {0} месеци"},past:{one:"пре {0} месеца",few:"пре {0} месеца",other:"пре {0} месеци"}}},"month-short":{displayName:"мес.",relative:{0:"овог месеца",1:"следећег месеца","-1":"прошлог месеца"},relativeTime:{future:{one:"за {0} мес.",few:"за {0} мес.",other:"за {0} мес."},past:{one:"пре {0} мес.",few:"пре {0} мес.",other:"пре {0} мес."}}},day:{displayName:"дан",relative:{0:"данас",1:"сутра",2:"прекосутра","-2":"прекјуче","-1":"јуче"},relativeTime:{future:{one:"за {0} дан",few:"за {0} дана",other:"за {0} дана"},past:{one:"пре {0} дана",few:"пре {0} дана",other:"пре {0} дана"}}},"day-short":{displayName:"д.",relative:{0:"данас",1:"сутра",2:"прекосутра","-2":"прекјуче","-1":"јуче"},relativeTime:{future:{one:"за {0} д.",few:"за {0} д.",other:"за {0} д."},past:{one:"пре {0} д.",few:"пре {0} д.",other:"пре {0} д."}}},hour:{displayName:"сат",relative:{0:"овог сата"},relativeTime:{future:{one:"за {0} сат",few:"за {0} сата",other:"за {0} сати"},past:{one:"пре {0} сата",few:"пре {0} сата",other:"пре {0} сати"}}},"hour-short":{displayName:"ч.",relative:{0:"овог сата"},relativeTime:{future:{one:"за {0} ч.",few:"за {0} ч.",other:"за {0} ч."},past:{one:"пре {0} ч.",few:"пре {0} ч.",other:"пре {0} ч."}}},minute:{displayName:"минут",relative:{0:"овог минута"},relativeTime:{future:{one:"за {0} минут",few:"за {0} минута",other:"за {0} минута"},past:{one:"пре {0} минута",few:"пре {0} минута",other:"пре {0} минута"}}},"minute-short":{displayName:"мин.",relative:{0:"овог минута"},relativeTime:{future:{one:"за {0} мин.",few:"за {0} мин.",other:"за {0} мин."},past:{one:"пре {0} мин.",few:"пре {0} мин.",other:"пре {0} мин."}}},second:{displayName:"секунд",relative:{0:"сада"},relativeTime:{future:{one:"за {0} секунду",few:"за {0} секунде",other:"за {0} секунди"},past:{one:"пре {0} секунде",few:"пре {0} секунде",other:"пре {0} секунди"}}},"second-short":{displayName:"сек.",relative:{0:"сада"},relativeTime:{future:{one:"за {0} сек.",few:"за {0} сек.",other:"за {0} сек."},past:{one:"пре {0} сек.",few:"пре {0} сек.",other:"пре {0} сек."}}}}}),a.__addLocaleData({locale:"sr-Cyrl",parentLocale:"sr"}),a.__addLocaleData({locale:"sr-Cyrl-BA",parentLocale:"sr-Cyrl"}),a.__addLocaleData({locale:"sr-Cyrl-ME",parentLocale:"sr-Cyrl"}),a.__addLocaleData({locale:"sr-Cyrl-XK",parentLocale:"sr-Cyrl"}),a.__addLocaleData({locale:"sr-Latn",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"godina",relative:{0:"ove godine",1:"sledeće godine","-1":"prošle godine"},relativeTime:{future:{one:"za {0} godinu",few:"za {0} godine",other:"za {0} godina"},past:{one:"pre {0} godine",few:"pre {0} godine",other:"pre {0} godina"}}},"year-short":{displayName:"god.",relative:{0:"ove godine",1:"sledeće godine","-1":"prošle godine"},relativeTime:{future:{one:"za {0} god.",few:"za {0} god.",other:"za {0} god."},past:{one:"pre {0} god.",few:"pre {0} god.",other:"pre {0} god."}}},month:{displayName:"mesec",relative:{0:"ovog meseca",1:"sledećeg meseca","-1":"prošlog meseca"},relativeTime:{future:{one:"za {0} mesec",few:"za {0} meseca",other:"za {0} meseci"},past:{one:"pre {0} meseca",few:"pre {0} meseca",other:"pre {0} meseci"}}},"month-short":{displayName:"mes.",relative:{0:"ovog meseca",1:"sledećeg meseca","-1":"prošlog meseca"},relativeTime:{future:{one:"za {0} mes.",few:"za {0} mes.",other:"za {0} mes."},past:{one:"pre {0} mes.",few:"pre {0} mes.",other:"pre {0} mes."}}},day:{displayName:"dan",relative:{0:"danas",1:"sutra",2:"prekosutra","-2":"prekjuče","-1":"juče"},relativeTime:{future:{one:"za {0} dan",few:"za {0} dana",other:"za {0} dana"},past:{one:"pre {0} dana",few:"pre {0} dana",other:"pre {0} dana"}}},"day-short":{displayName:"d.",relative:{0:"danas",1:"sutra",2:"prekosutra","-2":"prekjuče","-1":"juče"},relativeTime:{future:{one:"za {0} d.",few:"za {0} d.",other:"za {0} d."},past:{one:"pre {0} d.",few:"pre {0} d.",other:"pre {0} d."}}},hour:{displayName:"sat",relative:{0:"ovog sata"},relativeTime:{future:{one:"za {0} sat",few:"za {0} sata",other:"za {0} sati"},past:{one:"pre {0} sata",few:"pre {0} sata",other:"pre {0} sati"}}},"hour-short":{displayName:"č.",relative:{0:"ovog sata"},relativeTime:{future:{one:"za {0} č.",few:"za {0} č.",other:"za {0} č."},past:{one:"pre {0} č.",few:"pre {0} č.",other:"pre {0} č."}}},minute:{displayName:"minut",relative:{0:"ovog minuta"},relativeTime:{future:{one:"za {0} minut",few:"za {0} minuta",other:"za {0} minuta"},past:{one:"pre {0} minuta",few:"pre {0} minuta",other:"pre {0} minuta"}}},"minute-short":{displayName:"min.",relative:{0:"ovog minuta"},relativeTime:{future:{one:"za {0} min.",few:"za {0} min.",other:"za {0} min."},past:{one:"pre {0} min.",few:"pre {0} min.",other:"pre {0} min."}}},second:{displayName:"sekund",relative:{0:"sada"},relativeTime:{future:{one:"za {0} sekundu",few:"za {0} sekunde",other:"za {0} sekundi"},past:{one:"pre {0} sekunde",few:"pre {0} sekunde",other:"pre {0} sekundi"}}},"second-short":{displayName:"sek.",relative:{0:"sada"},relativeTime:{future:{one:"za {0} sek.",few:"za {0} sek.",other:"za {0} sek."},past:{one:"pre {0} sek.",few:"pre {0} sek.",other:"pre {0} sek."}}}}}),a.__addLocaleData({locale:"sr-Latn-BA",parentLocale:"sr-Latn"}),a.__addLocaleData({locale:"sr-Latn-ME",parentLocale:"sr-Latn"}),a.__addLocaleData({locale:"sr-Latn-XK",parentLocale:"sr-Latn"}),a.__addLocaleData({locale:"ss",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ssy",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"st",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"sv",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1],n=Number(r[0])==e,o=n&&r[0].slice(-1),i=n&&r[0].slice(-2);return t?1!=o&&2!=o||11==i||12==i?"other":"one":1==e&&a?"one":"other"},fields:{year:{displayName:"år",relative:{0:"i år",1:"nästa år","-1":"i fjol"},relativeTime:{future:{one:"om {0} år",other:"om {0} år"},past:{one:"för {0} år sedan",other:"för {0} år sedan"}}},"year-short":{displayName:"år",relative:{0:"i år",1:"nästa år","-1":"i fjol"},relativeTime:{future:{one:"om {0} år",other:"om {0} år"},past:{one:"för {0} år sedan",other:"för {0} år sedan"}}},month:{displayName:"månad",relative:{0:"denna månad",1:"nästa månad","-1":"förra månaden"},relativeTime:{future:{one:"om {0} månad",other:"om {0} månader"},past:{one:"för {0} månad sedan",other:"för {0} månader sedan"}}},"month-short":{displayName:"m",relative:{0:"denna mån.",1:"nästa mån.","-1":"förra mån."},relativeTime:{future:{one:"om {0} mån.",other:"om {0} mån."},past:{one:"för {0} mån. sedan",other:"för {0} mån. sedan"}}},day:{displayName:"dag",relative:{0:"i dag",1:"i morgon",2:"i övermorgon","-2":"i förrgår","-1":"i går"},relativeTime:{future:{one:"om {0} dag",other:"om {0} dagar"},past:{one:"för {0} dag sedan",other:"för {0} dagar sedan"}}},"day-short":{displayName:"dag",relative:{0:"i dag",1:"i morgon",2:"i övermorgon","-2":"i förrgår","-1":"i går"},relativeTime:{future:{one:"om {0} d",other:"om {0} d"},past:{one:"för {0} d sedan",other:"för {0} d sedan"}}},hour:{displayName:"timme",relative:{0:"denna timme"},relativeTime:{future:{one:"om {0} timme",other:"om {0} timmar"},past:{one:"för {0} timme sedan",other:"för {0} timmar sedan"}}},"hour-short":{displayName:"tim",relative:{0:"denna timme"},relativeTime:{future:{one:"om {0} tim",other:"om {0} tim"},past:{one:"för {0} tim sedan",other:"för {0} tim sedan"}}},minute:{displayName:"minut",relative:{0:"denna minut"},relativeTime:{future:{one:"om {0} minut",other:"om {0} minuter"},past:{one:"för {0} minut sedan",other:"för {0} minuter sedan"}}},"minute-short":{displayName:"min",relative:{0:"denna minut"},relativeTime:{future:{one:"om {0} min",other:"om {0} min"},past:{one:"för {0} min sedan",other:"för {0} min sedan"}}},second:{displayName:"sekund",relative:{0:"nu"},relativeTime:{future:{one:"om {0} sekund",other:"om {0} sekunder"},past:{one:"för {0} sekund sedan",other:"för {0} sekunder sedan"}}},"second-short":{displayName:"sek",relative:{0:"nu"},relativeTime:{future:{one:"om {0} sek",other:"om {0} sek"},past:{one:"för {0} sek sedan",other:"för {0} sek sedan"}}}}}),a.__addLocaleData({locale:"sv-AX",parentLocale:"sv"}),a.__addLocaleData({locale:"sv-FI",parentLocale:"sv"}),a.__addLocaleData({locale:"sw",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"},fields:{year:{displayName:"mwaka",relative:{0:"mwaka huu",1:"mwaka ujao","-1":"mwaka uliopita"},relativeTime:{future:{one:"baada ya mwaka {0}",other:"baada ya miaka {0}"},past:{one:"mwaka {0} uliopita",other:"miaka {0} iliyopita"}}},"year-short":{displayName:"mwaka",relative:{0:"mwaka huu",1:"mwaka ujao","-1":"mwaka uliopita"},relativeTime:{future:{one:"baada ya mwaka {0}",other:"baada ya miaka {0}"},past:{one:"mwaka {0} uliopita",other:"miaka {0} iliyopita"}}},month:{displayName:"mwezi",relative:{0:"mwezi huu",1:"mwezi ujao","-1":"mwezi uliopita"},relativeTime:{future:{one:"baada ya mwezi {0}",other:"baada ya miezi {0}"},past:{one:"mwezi {0} uliopita",other:"miezi {0} iliyopita"}}},"month-short":{displayName:"mwezi",relative:{0:"mwezi huu",1:"mwezi ujao","-1":"mwezi uliopita"},relativeTime:{future:{one:"baada ya mwezi {0}",other:"baada ya miezi {0}"},past:{one:"mwezi {0} uliopita",other:"miezi {0} iliyopita"}}},day:{displayName:"siku",relative:{0:"leo",1:"kesho",2:"kesho kutwa","-2":"juzi","-1":"jana"},relativeTime:{future:{one:"baada ya siku {0}",other:"baada ya siku {0}"},past:{one:"siku {0} iliyopita",other:"siku {0} zilizopita"}}},"day-short":{displayName:"siku",relative:{0:"leo",1:"kesho",2:"kesho kutwa","-2":"juzi","-1":"jana"},relativeTime:{future:{one:"baada ya siku {0}",other:"baada ya siku {0}"},past:{one:"siku {0} iliyopita",other:"siku {0} zilizopita"}}},hour:{displayName:"saa",relative:{0:"saa hii"},relativeTime:{future:{one:"baada ya saa {0}",other:"baada ya saa {0}"},past:{one:"saa {0} iliyopita",other:"saa {0} zilizopita"}}},"hour-short":{displayName:"saa",relative:{0:"saa hii"},relativeTime:{future:{one:"baada ya saa {0}",other:"baada ya saa {0}"},past:{one:"saa {0} iliyopita",other:"saa {0} zilizopita"}}},minute:{displayName:"dakika",relative:{0:"dakika hii"},relativeTime:{future:{one:"baada ya dakika {0}",other:"baada ya dakika {0}"},past:{one:"dakika {0} iliyopita",other:"dakika {0} zilizopita"}}},"minute-short":{displayName:"dak",relative:{0:"dakika hii"},relativeTime:{future:{one:"baada ya dakika {0}",other:"baada ya dakika {0}"},past:{one:"dakika {0} iliyopita",other:"dakika {0} zilizopita"}}},second:{displayName:"sekunde",relative:{0:"sasa hivi"},relativeTime:{future:{one:"baada ya sekunde {0}",other:"baada ya sekunde {0}"},past:{one:"Sekunde {0} iliyopita",other:"Sekunde {0} zilizopita"}}},"second-short":{displayName:"sek",relative:{0:"sasa hivi"},relativeTime:{future:{one:"baada ya sekunde {0}",other:"baada ya sekunde {0}"},past:{one:"sekunde {0} iliyopita",other:"sekunde {0} zilizopita"}}}}}),a.__addLocaleData({locale:"sw-CD",parentLocale:"sw"}),a.__addLocaleData({locale:"sw-KE",parentLocale:"sw"}),a.__addLocaleData({locale:"sw-UG",parentLocale:"sw"}),a.__addLocaleData({locale:"syr",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ta",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"ஆண்டு",relative:{0:"இந்த ஆண்டு",1:"அடுத்த ஆண்டு","-1":"கடந்த ஆண்டு"},relativeTime:{future:{one:"{0} ஆண்டில்",other:"{0} ஆண்டுகளில்"},past:{one:"{0} ஆண்டிற்கு முன்",other:"{0} ஆண்டுகளுக்கு முன்"}}},"year-short":{displayName:"ஆண்டு",relative:{0:"இந்த ஆண்டு",1:"அடுத்த ஆண்டு","-1":"கடந்த ஆண்டு"},relativeTime:{future:{one:"{0} ஆண்டில்",other:"{0} ஆண்டுகளில்"},past:{one:"{0} ஆண்டிற்கு முன்",other:"{0} ஆண்டுகளுக்கு முன்"}}},month:{displayName:"மாதம்",relative:{0:"இந்த மாதம்",1:"அடுத்த மாதம்","-1":"கடந்த மாதம்"},relativeTime:{future:{one:"{0} மாதத்தில்",other:"{0} மாதங்களில்"},past:{one:"{0} மாதத்துக்கு முன்",other:"{0} மாதங்களுக்கு முன்"}}},"month-short":{displayName:"மாத.",relative:{0:"இந்த மாதம்",1:"அடுத்த மாதம்","-1":"கடந்த மாதம்"},relativeTime:{future:{one:"{0} மாத.",other:"{0} மாத."},past:{one:"{0} மாத. முன்",other:"{0} மாத. முன்"}}},day:{displayName:"நாள்",relative:{0:"இன்று",1:"நாளை",2:"நாளை மறுநாள்","-2":"நேற்று முன் தினம்","-1":"நேற்று"},relativeTime:{future:{one:"{0} நாளில்",other:"{0} நாட்களில்"},past:{one:"{0} நாளுக்கு முன்",other:"{0} நாட்களுக்கு முன்"}}},"day-short":{displayName:"நாள்",relative:{0:"இன்று",1:"நாளை",2:"நாளை மறுநாள்","-2":"நேற்று முன் தினம்","-1":"நேற்று"},relativeTime:{future:{one:"{0} நாளில்",other:"{0} நாட்களில்"},past:{one:"{0} நாளுக்கு முன்",other:"{0} நாட்களுக்கு முன்"}}},hour:{displayName:"மணி",relative:{0:"இந்த ஒரு மணிநேரத்தில்"},relativeTime:{future:{one:"{0} மணிநேரத்தில்",other:"{0} மணிநேரத்தில்"},past:{one:"{0} மணிநேரம் முன்",other:"{0} மணிநேரம் முன்"}}},"hour-short":{displayName:"மணி.",relative:{0:"இந்த ஒரு மணிநேரத்தில்"},relativeTime:{future:{one:"{0} மணி.",other:"{0} மணி."},past:{one:"{0} மணி. முன்",other:"{0} மணி. முன்"}}},minute:{displayName:"நிமிடம்",relative:{0:"இந்த ஒரு நிமிடத்தில்"},relativeTime:{future:{one:"{0} நிமிடத்தில்",other:"{0} நிமிடங்களில்"},past:{one:"{0} நிமிடத்திற்கு முன்",other:"{0} நிமிடங்களுக்கு முன்"}}},"minute-short":{displayName:"நிமி.",relative:{0:"இந்த ஒரு நிமிடத்தில்"},relativeTime:{future:{one:"{0} நிமி.",other:"{0} நிமி."},past:{one:"{0} நிமி. முன்",other:"{0} நிமி. முன்"}}},second:{displayName:"விநாடி",relative:{0:"இப்போது"},relativeTime:{future:{one:"{0} விநாடியில்",other:"{0} விநாடிகளில்"},past:{one:"{0} விநாடிக்கு முன்",other:"{0} விநாடிகளுக்கு முன்"}}},"second-short":{displayName:"விநா.",relative:{0:"இப்போது"},relativeTime:{future:{one:"{0} விநா.",other:"{0} விநா."},past:{one:"{0} விநா. முன்",other:"{0} விநா. முன்"}}}}}),a.__addLocaleData({locale:"ta-LK",parentLocale:"ta"}),a.__addLocaleData({locale:"ta-MY",parentLocale:"ta"}),a.__addLocaleData({locale:"ta-SG",parentLocale:"ta"}),a.__addLocaleData({locale:"te",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"సంవత్సరం",relative:{0:"ఈ సంవత్సరం",1:"తదుపరి సంవత్సరం","-1":"గత సంవత్సరం"},relativeTime:{future:{one:"{0} సంవత్సరంలో",other:"{0} సంవత్సరాల్లో"},past:{one:"{0} సంవత్సరం క్రితం",other:"{0} సంవత్సరాల క్రితం"}}},"year-short":{displayName:"సం.",relative:{0:"ఈ సంవత్సరం",1:"తదుపరి సంవత్సరం","-1":"గత సంవత్సరం"},relativeTime:{future:{one:"{0} సం.లో",other:"{0} సం.లో"},past:{one:"{0} సం. క్రితం",other:"{0} సం. క్రితం"}}},month:{displayName:"నెల",relative:{0:"ఈ నెల",1:"తదుపరి నెల","-1":"గత నెల"},relativeTime:{future:{one:"{0} నెలలో",other:"{0} నెలల్లో"},past:{one:"{0} నెల క్రితం",other:"{0} నెలల క్రితం"}}},"month-short":{displayName:"నెల",relative:{0:"ఈ నెల",1:"తదుపరి నెల","-1":"గత నెల"},relativeTime:{future:{one:"{0} నెలలో",other:"{0} నెలల్లో"},past:{one:"{0} నెల క్రితం",other:"{0} నెలల క్రితం"}}},day:{displayName:"దినం",relative:{0:"ఈ రోజు",1:"రేపు",2:"ఎల్లుండి","-2":"మొన్న","-1":"నిన్న"},relativeTime:{future:{one:"{0} రోజులో",other:"{0} రోజుల్లో"},past:{one:"{0} రోజు క్రితం",other:"{0} రోజుల క్రితం"}}},"day-short":{displayName:"దినం",relative:{0:"ఈ రోజు",1:"రేపు",2:"ఎల్లుండి","-2":"మొన్న","-1":"నిన్న"},relativeTime:{future:{one:"{0} రోజులో",other:"{0} రోజుల్లో"},past:{one:"{0} రోజు క్రితం",other:"{0} రోజుల క్రితం"}}},hour:{displayName:"గంట",relative:{0:"ఈ గంట"},relativeTime:{future:{one:"{0} గంటలో",other:"{0} గంటల్లో"},past:{one:"{0} గంట క్రితం",other:"{0} గంటల క్రితం"}}},"hour-short":{displayName:"గం.",relative:{0:"ఈ గంట"},relativeTime:{future:{one:"{0} గం.లో",other:"{0} గం.లో"},past:{one:"{0} గం. క్రితం",other:"{0} గం. క్రితం"}}},minute:{displayName:"నిమిషము",relative:{0:"ఈ నిమిషం"},relativeTime:{future:{one:"{0} నిమిషంలో",other:"{0} నిమిషాల్లో"},past:{one:"{0} నిమిషం క్రితం",other:"{0} నిమిషాల క్రితం"}}},"minute-short":{displayName:"నిమి.",relative:{0:"ఈ నిమిషం"},relativeTime:{future:{one:"{0} నిమి.లో",other:"{0} నిమి.లో"},past:{one:"{0} నిమి. క్రితం",other:"{0} నిమి. క్రితం"}}},second:{displayName:"సెకను",relative:{0:"ప్రస్తుతం"},relativeTime:{future:{one:"{0} సెకనులో",other:"{0} సెకన్లలో"},past:{one:"{0} సెకను క్రితం",other:"{0} సెకన్ల క్రితం"}}},"second-short":{displayName:"సెక.",relative:{0:"ప్రస్తుతం"},relativeTime:{future:{one:"{0} సెక. లో",other:"{0} సెక. లో"},past:{one:"{0} సెక. క్రితం",other:"{0} సెక. క్రితం"}}}}}),a.__addLocaleData({locale:"teo",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Ekan",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Ekan",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Elap",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Elap",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Aparan",relative:{0:"Lolo",1:"Moi","-1":"Jaan"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Aparan",relative:{0:"Lolo",1:"Moi","-1":"Jaan"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Esaa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Esaa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Idakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Idakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Isekonde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Isekonde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"teo-KE",parentLocale:"teo"}),a.__addLocaleData({locale:"th",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"ปี",relative:{0:"ปีนี้",1:"ปีหน้า","-1":"ปีที่แล้ว"},relativeTime:{future:{other:"ในอีก {0} ปี"},past:{other:"{0} ปีที่แล้ว"}}},"year-short":{displayName:"ปี",relative:{0:"ปีนี้",1:"ปีหน้า","-1":"ปีที่แล้ว"},relativeTime:{future:{other:"ใน {0} ปี"},past:{other:"{0} ปีที่แล้ว"}}},month:{displayName:"เดือน",relative:{0:"เดือนนี้",1:"เดือนหน้า","-1":"เดือนที่แล้ว"},relativeTime:{future:{other:"ในอีก {0} เดือน"},past:{other:"{0} เดือนที่ผ่านมา"}}},"month-short":{displayName:"เดือน",relative:{0:"เดือนนี้",1:"เดือนหน้า","-1":"เดือนที่แล้ว"},relativeTime:{future:{other:"ใน {0} เดือน"},past:{other:"{0} เดือนที่แล้ว"}}},day:{displayName:"วัน",relative:{0:"วันนี้",1:"พรุ่งนี้",2:"มะรืนนี้","-2":"เมื่อวานซืน","-1":"เมื่อวาน"},relativeTime:{future:{other:"ในอีก {0} วัน"},past:{other:"{0} วันที่ผ่านมา"}}},"day-short":{displayName:"วัน",relative:{0:"วันนี้",1:"พรุ่งนี้",2:"มะรืนนี้","-2":"เมื่อวานซืน","-1":"เมื่อวาน"},relativeTime:{future:{other:"ใน {0} วัน"},past:{other:"{0} วันที่แล้ว"}}},hour:{displayName:"ชั่วโมง",relative:{0:"ชั่วโมงนี้"},relativeTime:{future:{other:"ในอีก {0} ชั่วโมง"},past:{other:"{0} ชั่วโมงที่ผ่านมา"}}},"hour-short":{displayName:"ชม.",relative:{0:"ชั่วโมงนี้"},relativeTime:{future:{other:"ใน {0} ชม."},past:{other:"{0} ชม. ที่แล้ว"}}},minute:{displayName:"นาที",relative:{0:"นาทีนี้"},relativeTime:{future:{other:"ในอีก {0} นาที"},past:{other:"{0} นาทีที่ผ่านมา"}}},"minute-short":{displayName:"น.",relative:{0:"นาทีนี้"},relativeTime:{future:{other:"ใน {0} นาที"},past:{other:"{0} นาทีที่แล้ว"}}},second:{displayName:"วินาที",relative:{0:"ขณะนี้"},relativeTime:{future:{other:"ในอีก {0} วินาที"},past:{other:"{0} วินาทีที่ผ่านมา"}}},"second-short":{displayName:"วิ",relative:{0:"ขณะนี้"},relativeTime:{future:{other:"ใน {0} วินาที"},past:{other:"{0} วินาทีที่แล้ว"}}}}}),a.__addLocaleData({locale:"ti",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ti-ER",parentLocale:"ti"}),a.__addLocaleData({locale:"tig",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"tk",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"ýyl",relative:{0:"şu ýyl",1:"indiki ýyl","-1":"geçen ýyl"},relativeTime:{future:{one:"{0} ýyldan",other:"{0} ýyldan"},past:{one:"{0} ýyl öň",other:"{0} ýyl öň"}}},"year-short":{displayName:"ý.",relative:{0:"şu ýyl",1:"indiki ýyl","-1":"geçen ýyl"},relativeTime:{future:{one:"{0}ý.-dan",other:"{0}ý.-dan"},past:{one:"{0}ý. öň",other:"{0}ý. öň"}}},month:{displayName:"aý",relative:{0:"şu aý",1:"indiki aý","-1":"geçen aý"},relativeTime:{future:{one:"{0} aýdan",other:"{0} aýdan"},past:{one:"{0} aý öň",other:"{0} aý öň"}}},"month-short":{displayName:"aý",relative:{0:"şu aý",1:"indiki aý","-1":"geçen aý"},relativeTime:{future:{one:"{0} aýdan",other:"{0} aýdan"},past:{one:"{0} aý öň",other:"{0} aý öň"}}},day:{displayName:"gün",relative:{0:"şu gün",1:"ertir","-1":"düýn"},relativeTime:{future:{one:"{0} günden",other:"{0} günden"},past:{one:"{0} gün öň",other:"{0} gün öň"}}},"day-short":{displayName:"gün",relative:{0:"şu gün",1:"ertir","-1":"düýn"},relativeTime:{future:{one:"{0} g-den",other:"{0} g-den"},past:{one:"{0} g. öň",other:"{0} g. öň"}}},hour:{displayName:"sagat",relative:{0:"this hour"},relativeTime:{future:{one:"{0} sagatdan",other:"{0} sagatdan"},past:{one:"{0} sagat öň",other:"{0} sagat öň"}}},"hour-short":{displayName:"sag.",relative:{0:"this hour"},relativeTime:{future:{one:"{0} sag-dan",other:"{0} sag-dan"},past:{one:"{0} sag. öň",other:"{0} sag. öň"}}},minute:{displayName:"minut",relative:{0:"this minute"},relativeTime:{future:{one:"{0} minutdan",other:"{0} minutdan"},past:{one:"{0} minut öň",other:"{0} minut öň"}}},"minute-short":{displayName:"min.",relative:{0:"this minute"},relativeTime:{future:{one:"{0} min-dan",other:"{0} min-dan"},past:{one:"{0} min. öň",other:"{0} min. öň"}}},second:{displayName:"sekunt",relative:{0:"now"},relativeTime:{future:{one:"{0} sekuntdan",other:"{0} sekuntdan"},past:{one:"{0} sekunt öň",other:"{0} sekunt öň"}}},"second-short":{displayName:"sek.",relative:{0:"now"},relativeTime:{future:{one:"{0} sek-dan",other:"{0} sek-dan"},past:{one:"{0} sek. öň",other:"{0} sek. öň"}}}}}),a.__addLocaleData({locale:"tl",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=n.slice(-1);return t?1==e?"one":"other":o&&(1==a||2==a||3==a)||o&&4!=i&&6!=i&&9!=i||!o&&4!=l&&6!=l&&9!=l?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"tn",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"to",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"taʻu",relative:{0:"taʻú ni",1:"taʻu kahaʻu","-1":"taʻu kuoʻosi"},relativeTime:{future:{other:"ʻi he taʻu ʻe {0}"},past:{other:"taʻu ʻe {0} kuoʻosi"}}},"year-short":{displayName:"taʻu",relative:{0:"taʻú ni",1:"taʻu kahaʻu","-1":"taʻu kuoʻosi"},relativeTime:{future:{other:"ʻi he taʻu ʻe {0}"},past:{other:"taʻu ʻe {0} kuoʻosi"}}},month:{displayName:"māhina",relative:{0:"māhiná ni",1:"māhina kahaʻu","-1":"māhina kuoʻosi"},relativeTime:{future:{other:"ʻi he māhina ʻe {0}"},past:{other:"māhina ʻe {0} kuoʻosi"}}},"month-short":{displayName:"māhina",relative:{0:"māhiná ni",1:"māhina kahaʻu","-1":"māhina kuoʻosi"},relativeTime:{future:{other:"ʻi he māhina ʻe {0}"},past:{other:"māhina ʻe {0} kuoʻosi"}}},day:{displayName:"ʻaho",relative:{0:"ʻahó ni",1:"ʻapongipongi",2:"ʻahepongipongi","-2":"ʻaneheafi","-1":"ʻaneafi"},relativeTime:{future:{other:"ʻi he ʻaho ʻe {0}"},past:{other:"ʻaho ʻe {0} kuoʻosi"}}},"day-short":{displayName:"ʻaho",relative:{0:"ʻahó ni",1:"ʻapongipongi",2:"ʻahepongipongi","-2":"ʻaneheafi","-1":"ʻaneafi"},relativeTime:{future:{other:"ʻi he ʻaho ʻe {0}"},past:{other:"ʻaho ʻe {0} kuoʻosi"}}},hour:{displayName:"houa",relative:{0:"this hour"},relativeTime:{future:{other:"ʻi he houa ʻe {0}"},past:{other:"houa ʻe {0} kuoʻosi"}}},"hour-short":{displayName:"houa",relative:{0:"this hour"},relativeTime:{future:{other:"ʻi he houa ʻe {0}"},past:{other:"houa ʻe {0} kuoʻosi"}}},minute:{displayName:"miniti",relative:{0:"this minute"},relativeTime:{future:{other:"ʻi he miniti ʻe {0}"},past:{other:"miniti ʻe {0} kuoʻosi"}}},"minute-short":{displayName:"miniti",relative:{0:"this minute"},relativeTime:{future:{other:"ʻi he miniti ʻe {0}"},past:{other:"miniti ʻe {0} kuoʻosi"}}},second:{displayName:"sekoni",relative:{0:"taimí ni"},relativeTime:{future:{other:"ʻi he sekoni ʻe {0}"},past:{other:"sekoni ʻe {0} kuoʻosi"}}},"second-short":{displayName:"sekoni",relative:{0:"taimí ni"},relativeTime:{future:{other:"ʻi he sekoni ʻe {0}"},past:{other:"sekoni ʻe {0} kuoʻosi"}}}}}),a.__addLocaleData({locale:"tr",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"yıl",relative:{0:"bu yıl",1:"gelecek yıl","-1":"geçen yıl"},relativeTime:{future:{one:"{0} yıl sonra",other:"{0} yıl sonra"},past:{one:"{0} yıl önce",other:"{0} yıl önce"}}},"year-short":{displayName:"yıl",relative:{0:"bu yıl",1:"gelecek yıl","-1":"geçen yıl"},relativeTime:{future:{one:"{0} yıl sonra",other:"{0} yıl sonra"},past:{one:"{0} yıl önce",other:"{0} yıl önce"}}},month:{displayName:"ay",relative:{0:"bu ay",1:"gelecek ay","-1":"geçen ay"},relativeTime:{future:{one:"{0} ay sonra",other:"{0} ay sonra"},past:{one:"{0} ay önce",other:"{0} ay önce"}}},"month-short":{displayName:"ay",relative:{0:"bu ay",1:"gelecek ay","-1":"geçen ay"},relativeTime:{future:{one:"{0} ay sonra",other:"{0} ay sonra"},past:{one:"{0} ay önce",other:"{0} ay önce"}}},day:{displayName:"gün",relative:{0:"bugün",1:"yarın",2:"öbür gün","-2":"evvelsi gün","-1":"dün"},relativeTime:{future:{one:"{0} gün sonra",other:"{0} gün sonra"},past:{one:"{0} gün önce",other:"{0} gün önce"}}},"day-short":{displayName:"gün",relative:{0:"bugün",1:"yarın",2:"öbür gün","-2":"evvelsi gün","-1":"dün"},relativeTime:{future:{one:"{0} gün sonra",other:"{0} gün sonra"},past:{one:"{0} gün önce",other:"{0} gün önce"}}},hour:{displayName:"saat",relative:{0:"bu saat"},relativeTime:{future:{one:"{0} saat sonra",other:"{0} saat sonra"},past:{one:"{0} saat önce",other:"{0} saat önce"}}},"hour-short":{displayName:"sa.",relative:{0:"bu saat"},relativeTime:{future:{one:"{0} sa. sonra",other:"{0} sa. sonra"},past:{one:"{0} sa. önce",other:"{0} sa. önce"}}},minute:{displayName:"dakika",relative:{0:"bu dakika"},relativeTime:{future:{one:"{0} dakika sonra",other:"{0} dakika sonra"},past:{one:"{0} dakika önce",other:"{0} dakika önce"}}},"minute-short":{displayName:"dk.",relative:{0:"bu dakika"},relativeTime:{future:{one:"{0} dk. sonra",other:"{0} dk. sonra"},past:{one:"{0} dk. önce",other:"{0} dk. önce"}}},second:{displayName:"saniye",relative:{0:"şimdi"},relativeTime:{future:{one:"{0} saniye sonra",other:"{0} saniye sonra"},past:{one:"{0} saniye önce",other:"{0} saniye önce"}}},"second-short":{displayName:"sn.",relative:{0:"şimdi"},relativeTime:{future:{one:"{0} sn. sonra",other:"{0} sn. sonra"},past:{one:"{0} sn. önce",other:"{0} sn. önce"}}}}}),a.__addLocaleData({locale:"tr-CY",parentLocale:"tr"}),a.__addLocaleData({locale:"ts",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"twq",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Jiiri",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Jiiri",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Handu",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Handu",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Zaari",relative:{0:"Hõo",1:"Suba","-1":"Bi"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Zaari",relative:{0:"Hõo",1:"Suba","-1":"Bi"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Guuru",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Guuru",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Miniti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Miniti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Miti",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Miti",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"tzm",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e;return t?"other":0==e||1==e||a&&e>=11&&e<=99?"one":"other"},fields:{year:{displayName:"Asseggas",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Asseggas",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Ayur",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Ayur",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ass",relative:{0:"Assa",1:"Asekka","-1":"Assenaṭ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Ass",relative:{0:"Assa",1:"Asekka","-1":"Assenaṭ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Tasragt",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Tasragt",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Tusdat",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Tusdat",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Tusnat",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Tusnat",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"ug",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"يىل",relative:{0:"بۇ يىل",1:"كېلەر يىل","-1":"ئۆتكەن يىل"},relativeTime:{future:{one:"{0} يىلدىن كېيىن",other:"{0} يىلدىن كېيىن"},past:{one:"{0} يىل ئىلگىرى",other:"{0} يىل ئىلگىرى"}}},"year-short":{displayName:"يىل",relative:{0:"بۇ يىل",1:"كېلەر يىل","-1":"ئۆتكەن يىل"},relativeTime:{future:{one:"{0} يىلدىن كېيىن",other:"{0} يىلدىن كېيىن"},past:{one:"{0} يىل ئىلگىرى",other:"{0} يىل ئىلگىرى"}}},month:{displayName:"ئاي",relative:{0:"بۇ ئاي",1:"كېلەر ئاي","-1":"ئۆتكەن ئاي"},relativeTime:{future:{one:"{0} ئايدىن كېيىن",other:"{0} ئايدىن كېيىن"},past:{one:"{0} ئاي ئىلگىرى",other:"{0} ئاي ئىلگىرى"}}},"month-short":{displayName:"ئاي",relative:{0:"بۇ ئاي",1:"كېلەر ئاي","-1":"ئۆتكەن ئاي"},relativeTime:{future:{one:"{0} ئايدىن كېيىن",other:"{0} ئايدىن كېيىن"},past:{one:"{0} ئاي ئىلگىرى",other:"{0} ئاي ئىلگىرى"}}},day:{displayName:"كۈن",relative:{0:"بۈگۈن",1:"ئەتە","-1":"تۈنۈگۈن"},relativeTime:{future:{one:"{0} كۈندىن كېيىن",other:"{0} كۈندىن كېيىن"},past:{one:"{0} كۈن ئىلگىرى",other:"{0} كۈن ئىلگىرى"}}},"day-short":{displayName:"كۈن",relative:{0:"بۈگۈن",1:"ئەتە","-1":"تۈنۈگۈن"},relativeTime:{future:{one:"{0} كۈندىن كېيىن",other:"{0} كۈندىن كېيىن"},past:{one:"{0} كۈن ئىلگىرى",other:"{0} كۈن ئىلگىرى"}}},hour:{displayName:"سائەت",relative:{0:"this hour"},relativeTime:{future:{one:"{0} سائەتتىن كېيىن",other:"{0} سائەتتىن كېيىن"},past:{one:"{0} سائەت ئىلگىرى",other:"{0} سائەت ئىلگىرى"}}},"hour-short":{displayName:"سائەت",relative:{0:"this hour"},relativeTime:{future:{one:"{0} سائەتتىن كېيىن",other:"{0} سائەتتىن كېيىن"},past:{one:"{0} سائەت ئىلگىرى",other:"{0} سائەت ئىلگىرى"}}},minute:{displayName:"مىنۇت",relative:{0:"this minute"},relativeTime:{future:{one:"{0} مىنۇتتىن كېيىن",other:"{0} مىنۇتتىن كېيىن"},past:{one:"{0} مىنۇت ئىلگىرى",other:"{0} مىنۇت ئىلگىرى"}}},"minute-short":{displayName:"مىنۇت",relative:{0:"this minute"},relativeTime:{future:{one:"{0} مىنۇتتىن كېيىن",other:"{0} مىنۇتتىن كېيىن"},past:{one:"{0} مىنۇت ئىلگىرى",other:"{0} مىنۇت ئىلگىرى"}}},second:{displayName:"سېكۇنت",relative:{0:"now"},relativeTime:{future:{one:"{0} سېكۇنتتىن كېيىن",other:"{0} سېكۇنتتىن كېيىن"},past:{one:"{0} سېكۇنت ئىلگىرى",other:"{0} سېكۇنت ئىلگىرى"}}},"second-short":{displayName:"سېكۇنت",relative:{0:"now"},relativeTime:{future:{one:"{0} سېكۇنتتىن كېيىن",other:"{0} سېكۇنتتىن كېيىن"},past:{one:"{0} سېكۇنت ئىلگىرى",other:"{0} سېكۇنت ئىلگىرى"}}}}}),a.__addLocaleData({locale:"uk",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=Number(r[0])==e,i=o&&r[0].slice(-1),l=o&&r[0].slice(-2),s=a.slice(-1),u=a.slice(-2);return t?3==i&&13!=l?"few":"other":n&&1==s&&11!=u?"one":n&&s>=2&&s<=4&&(u<12||u>14)?"few":n&&0==s||n&&s>=5&&s<=9||n&&u>=11&&u<=14?"many":"other"},fields:{year:{displayName:"рік",relative:{0:"цього року",1:"наступного року","-1":"торік"},relativeTime:{future:{one:"через {0} рік",few:"через {0} роки",many:"через {0} років",other:"через {0} року"},past:{one:"{0} рік тому",few:"{0} роки тому",many:"{0} років тому",other:"{0} року тому"}}},"year-short":{displayName:"р.",relative:{0:"цього року",1:"наступного року","-1":"торік"},relativeTime:{future:{one:"через {0} р.",few:"через {0} р.",many:"через {0} р.",other:"через {0} р."},past:{one:"{0} р. тому",few:"{0} р. тому",many:"{0} р. тому",other:"{0} р. тому"}}},month:{displayName:"місяць",relative:{0:"цього місяця",1:"наступного місяця","-1":"минулого місяця"},relativeTime:{future:{one:"через {0} місяць",few:"через {0} місяці",many:"через {0} місяців",other:"через {0} місяця"},past:{one:"{0} місяць тому",few:"{0} місяці тому",many:"{0} місяців тому",other:"{0} місяця тому"}}},"month-short":{displayName:"міс.",relative:{0:"цього місяця",1:"наступного місяця","-1":"минулого місяця"},relativeTime:{future:{one:"через {0} міс.",few:"через {0} міс.",many:"через {0} міс.",other:"через {0} міс."},past:{one:"{0} міс. тому",few:"{0} міс. тому",many:"{0} міс. тому",other:"{0} міс. тому"}}},day:{displayName:"день",relative:{0:"сьогодні",1:"завтра",2:"післязавтра","-2":"позавчора","-1":"учора"},relativeTime:{future:{one:"через {0} день",few:"через {0} дні",many:"через {0} днів",other:"через {0} дня"},past:{one:"{0} день тому",few:"{0} дні тому",many:"{0} днів тому",other:"{0} дня тому"}}},"day-short":{displayName:"д.",relative:{0:"сьогодні",1:"завтра",2:"післязавтра","-2":"позавчора","-1":"учора"},relativeTime:{future:{one:"через {0} дн.",few:"через {0} дн.",many:"через {0} дн.",other:"через {0} дн."},past:{one:"{0} дн. тому",few:"{0} дн. тому",many:"{0} дн. тому",other:"{0} дн. тому"}}},hour:{displayName:"година",relative:{0:"цієї години"},relativeTime:{future:{one:"через {0} годину",few:"через {0} години",many:"через {0} годин",other:"через {0} години"},past:{one:"{0} годину тому",few:"{0} години тому",many:"{0} годин тому",other:"{0} години тому"}}},"hour-short":{displayName:"год",relative:{0:"цієї години"},relativeTime:{future:{one:"через {0} год",few:"через {0} год",many:"через {0} год",other:"через {0} год"},past:{one:"{0} год тому",few:"{0} год тому",many:"{0} год тому",other:"{0} год тому"}}},minute:{displayName:"хвилина",relative:{0:"цієї хвилини"},relativeTime:{future:{one:"через {0} хвилину",few:"через {0} хвилини",many:"через {0} хвилин",other:"через {0} хвилини"},past:{one:"{0} хвилину тому",few:"{0} хвилини тому",many:"{0} хвилин тому",other:"{0} хвилини тому"}}},"minute-short":{displayName:"хв",relative:{0:"цієї хвилини"},relativeTime:{future:{one:"через {0} хв",few:"через {0} хв",many:"через {0} хв",other:"через {0} хв"},past:{one:"{0} хв тому",few:"{0} хв тому",many:"{0} хв тому",other:"{0} хв тому"}}},second:{displayName:"секунда",relative:{0:"зараз"},relativeTime:{future:{one:"через {0} секунду",few:"через {0} секунди",many:"через {0} секунд",other:"через {0} секунди"},past:{one:"{0} секунду тому",few:"{0} секунди тому",many:"{0} секунд тому",other:"{0} секунди тому"}}},"second-short":{displayName:"с",relative:{0:"зараз"},relativeTime:{future:{one:"через {0} с",few:"через {0} с",many:"через {0} с",other:"через {0} с"},past:{one:"{0} с тому",few:"{0} с тому",many:"{0} с тому",other:"{0} с тому"}}}}}),a.__addLocaleData({locale:"ur",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"},fields:{year:{displayName:"سال",relative:{0:"اس سال",1:"اگلے سال","-1":"گزشتہ سال"},relativeTime:{future:{one:"{0} سال میں",other:"{0} سال میں"},past:{one:"{0} سال پہلے",other:"{0} سال پہلے"}}},"year-short":{displayName:"سال",relative:{0:"اس سال",1:"اگلے سال","-1":"گزشتہ سال"},relativeTime:{future:{one:"{0} سال میں",other:"{0} سال میں"},past:{one:"{0} سال پہلے",other:"{0} سال پہلے"}}},month:{displayName:"مہینہ",relative:{0:"اس مہینہ",1:"اگلے مہینہ","-1":"پچھلے مہینہ"},relativeTime:{future:{one:"{0} مہینہ میں",other:"{0} مہینے میں"},past:{one:"{0} مہینہ پہلے",other:"{0} مہینے پہلے"}}},"month-short":{displayName:"ماہ",relative:{0:"اس مہینہ",1:"اگلے مہینہ","-1":"پچھلے مہینہ"},relativeTime:{future:{one:"{0} ماہ میں",other:"{0} ماہ میں"},past:{one:"{0} ماہ قبل",other:"{0} ماہ قبل"}}},day:{displayName:"دن",relative:{0:"آج",1:"آئندہ کل",2:"آنے والا پرسوں","-2":"گزشتہ پرسوں","-1":"گزشتہ کل"},relativeTime:{future:{one:"{0} دن میں",other:"{0} دنوں میں"},past:{one:"{0} دن پہلے",other:"{0} دنوں پہلے"}}},"day-short":{displayName:"دن",relative:{0:"آج",1:"آئندہ کل",2:"آنے والا پرسوں","-2":"گزشتہ پرسوں","-1":"گزشتہ کل"},relativeTime:{future:{one:"{0} دن میں",other:"{0} دنوں میں"},past:{one:"{0} دن پہلے",other:"{0} دنوں پہلے"}}},hour:{displayName:"گھنٹہ",relative:{0:"اس گھنٹے"},relativeTime:{future:{one:"{0} گھنٹہ میں",other:"{0} گھنٹے میں"},past:{one:"{0} گھنٹہ پہلے",other:"{0} گھنٹے پہلے"}}},"hour-short":{displayName:"گھنٹہ",relative:{0:"اس گھنٹے"},relativeTime:{future:{one:"{0} گھنٹے میں",other:"{0} گھنٹے میں"},past:{one:"{0} گھنٹے پہلے",other:"{0} گھنٹے پہلے"}}},minute:{displayName:"منٹ",relative:{0:"اس منٹ"},relativeTime:{future:{one:"{0} منٹ میں",other:"{0} منٹ میں"},past:{one:"{0} منٹ پہلے",other:"{0} منٹ پہلے"}}},"minute-short":{displayName:"منٹ",relative:{0:"اس منٹ"},relativeTime:{future:{one:"{0} منٹ میں",other:"{0} منٹ میں"},past:{one:"{0} منٹ پہلے",other:"{0} منٹ پہلے"}}},second:{displayName:"سیکنڈ",relative:{0:"اب"},relativeTime:{future:{one:"{0} سیکنڈ میں",other:"{0} سیکنڈ میں"},past:{one:"{0} سیکنڈ پہلے",other:"{0} سیکنڈ پہلے"}}},"second-short":{displayName:"سیکنڈ",relative:{0:"اب"},relativeTime:{future:{one:"{0} سیکنڈ میں",other:"{0} سیکنڈ میں"},past:{one:"{0} سیکنڈ پہلے",other:"{0} سیکنڈ پہلے"}}}}}),a.__addLocaleData({locale:"ur-IN",parentLocale:"ur",fields:{year:{displayName:"سال",relative:{0:"اس سال",1:"اگلے سال","-1":"گزشتہ سال"},relativeTime:{future:{one:"{0} سال میں",other:"{0} سالوں میں"},past:{one:"{0} سال پہلے",other:"{0} سال پہلے"}}},"year-short":{displayName:"سال",relative:{0:"اس سال",1:"اگلے سال","-1":"گزشتہ سال"},relativeTime:{future:{one:"{0} سال میں",other:"{0} سالوں میں"},past:{one:"{0} سال پہلے",other:"{0} سالوں پہلے"}}},month:{displayName:"مہینہ",relative:{0:"اس ماہ",1:"اگلے ماہ","-1":"گزشتہ ماہ"},relativeTime:{future:{one:"{0} ماہ میں",other:"{0} ماہ میں"},past:{one:"{0} ماہ قبل",other:"{0} ماہ قبل"}}},"month-short":{displayName:"مہینہ",relative:{0:"اس مہینہ",1:"اگلے مہینہ","-1":"پچھلے مہینہ"},relativeTime:{future:{one:"{0} ماہ میں",other:"{0} ماہ میں"},past:{one:"{0} ماہ قبل",other:"{0} ماہ قبل"}}},day:{displayName:"دن",relative:{0:"آج",1:"آئندہ کل",2:"آنے والا پرسوں","-2":"گزشتہ پرسوں","-1":"گزشتہ کل"},relativeTime:{future:{one:"{0} دن میں",other:"{0} دنوں میں"},past:{one:"{0} دن پہلے",other:"{0} دنوں پہلے"}}},"day-short":{displayName:"دن",relative:{0:"آج",1:"آئندہ کل",2:"آنے والا پرسوں","-2":"گزشتہ پرسوں","-1":"گزشتہ کل"},relativeTime:{future:{one:"{0} دنوں میں",other:"{0} دنوں میں"},past:{one:"{0} دن پہلے",other:"{0} دنوں پہلے"}}},hour:{displayName:"گھنٹہ",relative:{0:"اس گھنٹے"},relativeTime:{future:{one:"{0} گھنٹہ میں",other:"{0} گھنٹے میں"},past:{one:"{0} گھنٹہ پہلے",other:"{0} گھنٹے پہلے"}}},"hour-short":{displayName:"گھنٹہ",relative:{0:"اس گھنٹے"},relativeTime:{future:{one:"{0} گھنٹے میں",other:"{0} گھنٹے میں"},past:{one:"{0} گھنٹے قبل",other:"{0} گھنٹے قبل"}}},minute:{displayName:"منٹ",relative:{0:"اس منٹ"},relativeTime:{future:{one:"{0} منٹ میں",other:"{0} منٹ میں"},past:{one:"{0} منٹ قبل",other:"{0} منٹ قبل"}}},"minute-short":{displayName:"منٹ",relative:{0:"اس منٹ"},relativeTime:{future:{one:"{0} منٹ میں",other:"{0} منٹ میں"},past:{one:"{0} منٹ قبل",other:"{0} منٹ قبل"}}},second:{displayName:"سیکنڈ",relative:{0:"اب"},relativeTime:{future:{one:"{0} سیکنڈ میں",other:"{0} سیکنڈ میں"},past:{one:"{0} سیکنڈ قبل",other:"{0} سیکنڈ قبل"}}},"second-short":{displayName:"سیکنڈ",relative:{0:"اب"},relativeTime:{future:{one:"{0} سیکنڈ میں",other:"{0} سیکنڈ میں"},past:{one:"{0} سیکنڈ قبل",other:"{0} سیکنڈ قبل"}}}}}),a.__addLocaleData({locale:"uz",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"yil",relative:{0:"shu yil",1:"keyingi yil","-1":"o‘tgan yil"},relativeTime:{future:{one:"{0} yildan keyin",other:"{0} yildan keyin"},past:{one:"{0} yil oldin",other:"{0} yil oldin"}}},"year-short":{displayName:"yil",relative:{0:"bu yil",1:"keyingi yil","-1":"oʻtgan yil"},relativeTime:{future:{one:"{0} yildan keyin",other:"{0} yildan keyin"},past:{one:"{0} yil oldin",other:"{0} yil oldin"}}},month:{displayName:"oy",relative:{0:"shu oy",1:"keyingi oy","-1":"o‘tgan oy"},relativeTime:{future:{one:"{0} oydan keyin",other:"{0} oydan keyin"},past:{one:"{0} oy oldin",other:"{0} oy oldin"}}},"month-short":{displayName:"oy",relative:{0:"shu oy",1:"keyingi oy","-1":"o‘tgan oy"},relativeTime:{future:{one:"{0} oydan keyin",other:"{0} oydan keyin"},past:{one:"{0} oy oldin",other:"{0} oy oldin"}}},day:{displayName:"kun",relative:{0:"bugun",1:"ertaga","-1":"kecha"},relativeTime:{future:{one:"{0} kundan keyin",other:"{0} kundan keyin"},past:{one:"{0} kun oldin",other:"{0} kun oldin"}}},"day-short":{displayName:"kun",relative:{0:"bugun",1:"ertaga","-1":"kecha"},relativeTime:{future:{one:"{0} kundan keyin",other:"{0} kundan keyin"},past:{one:"{0} kun oldin",other:"{0} kun oldin"}}},hour:{displayName:"soat",relative:{0:"shu soatda"},relativeTime:{future:{one:"{0} soatdan keyin",other:"{0} soatdan keyin"},past:{one:"{0} soat oldin",other:"{0} soat oldin"}}},"hour-short":{displayName:"soat",relative:{0:"shu soatda"},relativeTime:{future:{one:"{0} soatdan keyin",other:"{0} soatdan keyin"},past:{one:"{0} soat oldin",other:"{0} soat oldin"}}},minute:{displayName:"daqiqa",relative:{0:"shu daqiqada"},relativeTime:{future:{one:"{0} daqiqadan keyin",other:"{0} daqiqadan keyin"},past:{one:"{0} daqiqa oldin",other:"{0} daqiqa oldin"}}},"minute-short":{displayName:"daq.",relative:{0:"shu daqiqada"},relativeTime:{future:{one:"{0} daqiqadan keyin",other:"{0} daqiqadan keyin"},past:{one:"{0} daqiqa oldin",other:"{0} daqiqa oldin"}}},second:{displayName:"soniya",relative:{0:"hozir"},relativeTime:{future:{one:"{0} soniyadan keyin",other:"{0} soniyadan keyin"},past:{one:"{0} soniya oldin",other:"{0} soniya oldin"}}},"second-short":{displayName:"son.",relative:{0:"hozir"},relativeTime:{future:{one:"{0} soniyadan keyin",other:"{0} soniyadan keyin"},past:{one:"{0} soniya oldin",other:"{0} soniya oldin"}}}}}),a.__addLocaleData({locale:"uz-Arab",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"uz-Cyrl",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Йил",relative:{0:"бу йил",1:"кейинги йил","-1":"ўтган йил"},relativeTime:{future:{one:"{0} йилдан сўнг",other:"{0} йилдан сўнг"},past:{one:"{0} йил аввал",other:"{0} йил аввал"}}},"year-short":{displayName:"Йил",relative:{0:"бу йил",1:"кейинги йил","-1":"ўтган йил"},relativeTime:{future:{one:"{0} йилдан сўнг",other:"{0} йилдан сўнг"},past:{one:"{0} йил аввал",other:"{0} йил аввал"}}},month:{displayName:"Ой",relative:{0:"бу ой",1:"кейинги ой","-1":"ўтган ой"},relativeTime:{future:{one:"{0} ойдан сўнг",other:"{0} ойдан сўнг"},past:{one:"{0} ой аввал",other:"{0} ой аввал"}}},"month-short":{displayName:"Ой",relative:{0:"бу ой",1:"кейинги ой","-1":"ўтган ой"},relativeTime:{future:{one:"{0} ойдан сўнг",other:"{0} ойдан сўнг"},past:{one:"{0} ой аввал",other:"{0} ой аввал"}}},day:{displayName:"Кун",relative:{0:"бугун",1:"эртага","-1":"кеча"},relativeTime:{future:{one:"{0} кундан сўнг",other:"{0} кундан сўнг"},past:{one:"{0} кун олдин",other:"{0} кун олдин"}}},"day-short":{displayName:"Кун",relative:{0:"бугун",1:"эртага","-1":"кеча"},relativeTime:{future:{one:"{0} кундан сўнг",other:"{0} кундан сўнг"},past:{one:"{0} кун олдин",other:"{0} кун олдин"}}},hour:{displayName:"Соат",relative:{0:"this hour"},relativeTime:{future:{one:"{0} соатдан сўнг",other:"{0} соатдан сўнг"},past:{one:"{0} соат олдин",other:"{0} соат олдин"}}},"hour-short":{displayName:"Соат",relative:{0:"this hour"},relativeTime:{future:{one:"{0} соатдан сўнг",other:"{0} соатдан сўнг"},past:{one:"{0} соат олдин",other:"{0} соат олдин"}}},minute:{displayName:"Дақиқа",relative:{0:"this minute"},relativeTime:{future:{one:"{0} дақиқадан сўнг",other:"{0} дақиқадан сўнг"},past:{one:"{0} дақиқа олдин",other:"{0} дақиқа олдин"}}},"minute-short":{displayName:"Дақиқа",relative:{0:"this minute"},relativeTime:{future:{one:"{0} дақиқадан сўнг",other:"{0} дақиқадан сўнг"},past:{one:"{0} дақиқа олдин",other:"{0} дақиқа олдин"}}},second:{displayName:"Сония",relative:{0:"ҳозир"},relativeTime:{future:{one:"{0} сониядан сўнг",other:"{0} сониядан сўнг"},past:{one:"{0} сония олдин",other:"{0} сония олдин"}}},"second-short":{displayName:"Сония",relative:{0:"ҳозир"},relativeTime:{future:{one:"{0} сониядан сўнг",other:"{0} сониядан сўнг"},past:{one:"{0} сония олдин",other:"{0} сония олдин"}}}}}),a.__addLocaleData({locale:"uz-Latn",parentLocale:"uz"}),a.__addLocaleData({locale:"vai",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"ꕢꘋ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"ꕢꘋ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"ꕪꖃ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"ꕪꖃ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"ꔎꔒ",relative:{0:"ꗦꗷ",1:"ꔻꕯ","-1":"ꖴꖸ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"ꔎꔒ",relative:{0:"ꗦꗷ",1:"ꔻꕯ","-1":"ꖴꖸ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"ꕌꕎ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"ꕌꕎ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"ꕆꕇ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"ꕆꕇ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"ꕧꕃꕧꕪ",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"ꕧꕃꕧꕪ",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"vai-Latn",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"saŋ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"saŋ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"kalo",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"kalo",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"tele",relative:{0:"wɛlɛ",1:"sina","-1":"kunu"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"tele",relative:{0:"wɛlɛ",1:"sina","-1":"kunu"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"hawa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"hawa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"mini",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"mini",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"jaki-jaka",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"jaki-jaka",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"vai-Vaii",parentLocale:"vai"}),a.__addLocaleData({locale:"ve",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"vi",pluralRuleFunction:function(e,t){return t&&1==e?"one":"other"},fields:{year:{displayName:"Năm",relative:{0:"năm nay",1:"năm sau","-1":"năm ngoái"},relativeTime:{future:{other:"sau {0} năm nữa"},past:{other:"{0} năm trước"}}},"year-short":{displayName:"Năm",relative:{0:"năm nay",1:"năm sau","-1":"năm ngoái"},relativeTime:{future:{other:"sau {0} năm nữa"},past:{other:"{0} năm trước"}}},month:{displayName:"Tháng",relative:{0:"tháng này",1:"tháng sau","-1":"tháng trước"},relativeTime:{future:{other:"sau {0} tháng nữa"},past:{other:"{0} tháng trước"}}},"month-short":{displayName:"Tháng",relative:{0:"tháng này",1:"tháng sau","-1":"tháng trước"},relativeTime:{future:{other:"sau {0} tháng nữa"},past:{other:"{0} tháng trước"}}},day:{displayName:"Ngày",relative:{0:"Hôm nay",1:"Ngày mai",2:"Ngày kia","-2":"Hôm kia","-1":"Hôm qua"},relativeTime:{future:{other:"sau {0} ngày nữa"},past:{other:"{0} ngày trước"}}},"day-short":{displayName:"Ngày",relative:{0:"Hôm nay",1:"Ngày mai",2:"Ngày kia","-2":"Hôm kia","-1":"Hôm qua"},relativeTime:{future:{other:"sau {0} ngày nữa"},past:{other:"{0} ngày trước"}}},hour:{displayName:"Giờ",relative:{0:"giờ này"},relativeTime:{future:{other:"sau {0} giờ nữa"},past:{other:"{0} giờ trước"}}},"hour-short":{displayName:"Giờ",relative:{0:"giờ này"},relativeTime:{future:{other:"sau {0} giờ nữa"},past:{other:"{0} giờ trước"}}},minute:{displayName:"Phút",relative:{0:"phút này"},relativeTime:{future:{other:"sau {0} phút nữa"},past:{other:"{0} phút trước"}}},"minute-short":{displayName:"Phút",relative:{0:"phút này"},relativeTime:{future:{other:"sau {0} phút nữa"},past:{other:"{0} phút trước"}}},second:{displayName:"Giây",relative:{0:"bây giờ"},relativeTime:{future:{other:"sau {0} giây nữa"},past:{other:"{0} giây trước"}}},"second-short":{displayName:"Giây",relative:{0:"bây giờ"},relativeTime:{future:{other:"sau {0} giây nữa"},past:{other:"{0} giây trước"}}}}}),a.__addLocaleData({locale:"vo",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"vun",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Maka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Maka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mori",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Mori",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Mfiri",relative:{0:"Inu",1:"Ngama","-1":"Ukou"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Mfiri",relative:{0:"Inu",1:"Ngama","-1":"Ukou"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Dakyika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Dakyika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"wa",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"wae",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Jár",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"I {0} jár",other:"I {0} jár"},past:{one:"vor {0} jár",other:"cor {0} jár"}}},"year-short":{displayName:"Jár",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"I {0} jár",other:"I {0} jár"},past:{one:"vor {0} jár",other:"cor {0} jár"}}},month:{displayName:"Mánet",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"I {0} mánet",other:"I {0} mánet"},past:{one:"vor {0} mánet",other:"vor {0} mánet"}}},"month-short":{displayName:"Mánet",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"I {0} mánet",other:"I {0} mánet"},past:{one:"vor {0} mánet",other:"vor {0} mánet"}}},day:{displayName:"Tag",relative:{0:"Hitte",1:"Móre",2:"Ubermóre","-2":"Vorgešter","-1":"Gešter"},relativeTime:{future:{one:"i {0} tag",other:"i {0} täg"},past:{one:"vor {0} tag",other:"vor {0} täg"}}},"day-short":{displayName:"Tag",relative:{0:"Hitte",1:"Móre",2:"Ubermóre","-2":"Vorgešter","-1":"Gešter"},relativeTime:{future:{one:"i {0} tag",other:"i {0} täg"},past:{one:"vor {0} tag",other:"vor {0} täg"}}},hour:{displayName:"Schtund",relative:{0:"this hour"},relativeTime:{future:{one:"i {0} stund",other:"i {0} stunde"},past:{one:"vor {0} stund",other:"vor {0} stunde"}}},"hour-short":{displayName:"Schtund",relative:{0:"this hour"},relativeTime:{future:{one:"i {0} stund",other:"i {0} stunde"},past:{one:"vor {0} stund",other:"vor {0} stunde"}}},minute:{displayName:"Mínütta",relative:{0:"this minute"},relativeTime:{future:{one:"i {0} minüta",other:"i {0} minüte"},past:{one:"vor {0} minüta",other:"vor {0} minüte"}}},"minute-short":{displayName:"Mínütta",relative:{0:"this minute"},relativeTime:{future:{one:"i {0} minüta",other:"i {0} minüte"},past:{one:"vor {0} minüta",other:"vor {0} minüte"}}},second:{displayName:"Sekunda",relative:{0:"now"},relativeTime:{future:{one:"i {0} sekund",other:"i {0} sekunde"},past:{one:"vor {0} sekund",other:"vor {0} sekunde"}}},"second-short":{displayName:"Sekunda",relative:{0:"now"},relativeTime:{future:{one:"i {0} sekund",other:"i {0} sekunde"},past:{one:"vor {0} sekund",other:"vor {0} sekunde"}}}}}),a.__addLocaleData({locale:"wo",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"xh",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"xog",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Omwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Omwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Omwezi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Omwezi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Olunaku",relative:{0:"Olwaleelo (leelo)",1:"Enkyo","-1":"Edho"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Olunaku",relative:{0:"Olwaleelo (leelo)",1:"Enkyo","-1":"Edho"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Essawa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Essawa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Edakiika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Edakiika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Obutikitiki",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Obutikitiki",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"yav",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"yɔɔŋ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"yɔɔŋ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"oóli",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"oóli",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"puɔ́sɛ́",relative:{0:"ínaan",1:"nakinyám","-1":"púyoó"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"puɔ́sɛ́",relative:{0:"ínaan",1:"nakinyám","-1":"púyoó"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"kisikɛl,",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"kisikɛl,",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"minít",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"minít",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"síkɛn",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"síkɛn",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"yi",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"},fields:{year:{displayName:"יאָר",relative:{0:"הײַ יאָר",1:"איבער א יאָר","-1":"פֿאַראַיאָר"},relativeTime:{future:{one:"איבער {0} יאָר",other:"איבער {0} יאָר"},past:{one:"פֿאַר {0} יאָר",other:"פֿאַר {0} יאָר"}}},"year-short":{displayName:"יאָר",relative:{0:"הײַ יאָר",1:"איבער א יאָר","-1":"פֿאַראַיאָר"},relativeTime:{future:{one:"איבער א יאָר",other:"איבער {0} יאָר"},past:{one:"פֿאַר {0} יאָר",other:"פֿאַר {0} יאָר"}}},month:{displayName:"מאנאַט",relative:{0:"דעם חודש",1:"קומענדיקן חודש","-1":"פֿאַרגאנגענעם חודש"},relativeTime:{future:{one:"איבער {0} חודש",other:"איבער {0} חדשים"},past:{one:"פֿאַר {0} חודש",other:"פֿאַר {0} חדשים"}}},"month-short":{displayName:"מאנאַט",relative:{0:"דעם חודש",1:"קומענדיקן חודש","-1":"פֿאַרגאנגענעם חודש"},relativeTime:{future:{one:"איבער {0} חודש",other:"איבער {0} חדשים"},past:{one:"פֿאַר {0} חודש",other:"פֿאַר {0} חדשים"}}},day:{displayName:"טאָג",relative:{0:"היינט",1:"מארגן","-1":"נעכטן"},relativeTime:{future:{one:"אין {0} טאָג אַרום",other:"אין {0} טעג אַרום"},past:{other:"-{0} d"}}},"day-short":{displayName:"טאָג",relative:{0:"היינט",1:"מארגן","-1":"נעכטן"},relativeTime:{future:{one:"אין {0} טאָג אַרום",other:"אין {0} טעג אַרום"},past:{other:"-{0} d"}}},hour:{displayName:"שעה",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"שעה",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"מינוט",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"מינוט",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"סעקונדע",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"סעקונדע",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"yo",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Ọdún",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Ọdún",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Osù",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Osù",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ọjọ́",relative:{0:"Òní",1:"Ọ̀la",2:"òtúùnla","-2":"íjẹta","-1":"Àná"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Ọjọ́",relative:{0:"Òní",1:"Ọ̀la",2:"òtúùnla","-2":"íjẹta","-1":"Àná"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"wákàtí",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"wákàtí",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Ìsẹ́jú",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Ìsẹ́jú",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Ìsẹ́jú Ààyá",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Ìsẹ́jú Ààyá",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"yo-BJ",parentLocale:"yo",fields:{year:{displayName:"Ɔdún",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Ɔdún",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Osù",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Osù",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ɔjɔ́",relative:{0:"Òní",1:"Ɔ̀la",2:"òtúùnla","-2":"íjɛta","-1":"Àná"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Ɔjɔ́",relative:{0:"Òní",1:"Ɔ̀la",2:"òtúùnla","-2":"íjɛta","-1":"Àná"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"wákàtí",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"wákàtí",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Ìsɛ́jú",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Ìsɛ́jú",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Ìsɛ́jú Ààyá",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Ìsɛ́jú Ààyá",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"yue",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"年",relative:{0:"今年",1:"下年","-1":"舊年"},relativeTime:{future:{other:"{0} 年後"},past:{other:"{0} 年前"}}},"year-short":{displayName:"年",relative:{0:"今年",1:"下年","-1":"舊年"},relativeTime:{future:{other:"{0} 年後"},past:{other:"{0} 年前"}}},month:{displayName:"月",relative:{0:"今個月",1:"下個月","-1":"上個月"},relativeTime:{future:{other:"{0} 個月後"},past:{other:"{0} 個月前"}}},"month-short":{displayName:"月",relative:{0:"今個月",1:"下個月","-1":"上個月"},relativeTime:{future:{other:"{0} 個月後"},past:{other:"{0} 個月前"}}},day:{displayName:"日",relative:{0:"今日",1:"聽日",2:"後天","-2":"前天","-1":"尋日"},relativeTime:{future:{other:"{0} 日後"},past:{other:"{0} 日前"}}},"day-short":{displayName:"日",relative:{0:"今日",1:"聽日",2:"後天","-2":"前天","-1":"尋日"},relativeTime:{future:{other:"{0} 日後"},past:{other:"{0} 日前"}}},hour:{displayName:"小時",relative:{0:"呢個小時"},relativeTime:{future:{other:"{0} 小時後"},past:{other:"{0} 小時前"}}},"hour-short":{displayName:"小時",relative:{0:"呢個小時"},relativeTime:{future:{other:"{0} 小時後"},past:{other:"{0} 小時前"}}},minute:{displayName:"分鐘",relative:{0:"呢分鐘"},relativeTime:{future:{other:"{0} 分鐘後"},past:{other:"{0} 分鐘前"}}},"minute-short":{displayName:"分鐘",relative:{0:"呢分鐘"},relativeTime:{future:{other:"{0} 分鐘後"},past:{other:"{0} 分鐘前"}}},second:{displayName:"秒",relative:{0:"宜家"},relativeTime:{future:{other:"{0} 秒後"},past:{other:"{0} 秒前"}}},"second-short":{displayName:"秒",relative:{0:"宜家"},relativeTime:{future:{other:"{0} 秒後"},past:{other:"{0} 秒前"}}}}}),a.__addLocaleData({locale:"yue-Hans",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"zgh",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"ⴰⵙⴳⴳⵯⴰⵙ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},"year-short":{displayName:"ⴰⵙⴳⴳⵯⴰⵙ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"ⴰⵢⵢⵓⵔ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},"month-short":{displayName:"ⴰⵢⵢⵓⵔ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"ⴰⵙⵙ",relative:{0:"ⴰⵙⵙⴰ",1:"ⴰⵙⴽⴽⴰ","-1":"ⵉⴹⵍⵍⵉ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},"day-short":{displayName:"ⴰⵙⵙ",relative:{0:"ⴰⵙⵙⴰ",1:"ⴰⵙⴽⴽⴰ","-1":"ⵉⴹⵍⵍⵉ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"ⵜⴰⵙⵔⴰⴳⵜ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},"hour-short":{displayName:"ⵜⴰⵙⵔⴰⴳⵜ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"ⵜⵓⵙⴷⵉⴷⵜ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},"minute-short":{displayName:"ⵜⵓⵙⴷⵉⴷⵜ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"ⵜⴰⵙⵉⵏⵜ",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}},"second-short":{displayName:"ⵜⴰⵙⵉⵏⵜ",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}}),a.__addLocaleData({locale:"zh",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"年",relative:{0:"今年",1:"明年","-1":"去年"},relativeTime:{future:{other:"{0}年后"},past:{other:"{0}年前"}}},"year-short":{displayName:"年",relative:{0:"今年",1:"明年","-1":"去年"},relativeTime:{future:{other:"{0}年后"},past:{other:"{0}年前"}}},month:{displayName:"月",relative:{0:"本月",1:"下个月","-1":"上个月"},relativeTime:{future:{other:"{0}个月后"},past:{other:"{0}个月前"}}},"month-short":{displayName:"月",relative:{0:"本月",1:"下个月","-1":"上个月"},relativeTime:{future:{other:"{0}个月后"},past:{other:"{0}个月前"}}},day:{displayName:"日",relative:{0:"今天",1:"明天",2:"后天","-2":"前天","-1":"昨天"},relativeTime:{future:{other:"{0}天后"},past:{other:"{0}天前"}}},"day-short":{displayName:"日",relative:{0:"今天",1:"明天",2:"后天","-2":"前天","-1":"昨天"},relativeTime:{future:{other:"{0}天后"},past:{other:"{0}天前"}}},hour:{displayName:"小时",relative:{0:"这一时间 / 此时"},relativeTime:{future:{other:"{0}小时后"},past:{other:"{0}小时前"}}},"hour-short":{displayName:"小时",relative:{0:"这一时间 / 此时"},relativeTime:{future:{other:"{0}小时后"},past:{other:"{0}小时前"}}},minute:{displayName:"分钟",relative:{0:"此刻"},relativeTime:{future:{other:"{0}分钟后"},past:{other:"{0}分钟前"}}},"minute-short":{displayName:"分",relative:{0:"此刻"},relativeTime:{future:{other:"{0}分钟后"},past:{other:"{0}分钟前"}}},second:{displayName:"秒",relative:{0:"现在"},relativeTime:{future:{other:"{0}秒钟后"},past:{other:"{0}秒钟前"}}},"second-short":{displayName:"秒",relative:{0:"现在"},relativeTime:{future:{other:"{0}秒后"},past:{other:"{0}秒前"}}}}}),a.__addLocaleData({locale:"zh-Hans",parentLocale:"zh"}),a.__addLocaleData({locale:"zh-Hans-HK",parentLocale:"zh-Hans",fields:{year:{displayName:"年",relative:{0:"今年",1:"明年","-1":"去年"},relativeTime:{future:{other:"{0}年后"},past:{other:"{0}年前"}}},"year-short":{displayName:"年",relative:{0:"今年",1:"明年","-1":"去年"},relativeTime:{future:{other:"{0}年后"},past:{other:"{0}年前"}}},month:{displayName:"月",relative:{0:"本月",1:"下个月","-1":"上个月"},relativeTime:{future:{other:"{0}个月后"},past:{other:"{0}个月前"}}},"month-short":{displayName:"月",relative:{0:"本月",1:"下个月","-1":"上个月"},relativeTime:{future:{other:"{0}个月后"},past:{other:"{0}个月前"}}},day:{displayName:"日",relative:{0:"今天",1:"明天",2:"后天","-2":"前天","-1":"昨天"},relativeTime:{future:{other:"{0}天后"},past:{other:"{0}天前"}}},"day-short":{displayName:"日",relative:{0:"今天",1:"明天",2:"后天","-2":"前天","-1":"昨天"},relativeTime:{future:{other:"{0}天后"},past:{other:"{0}天前"}}},hour:{displayName:"小时",relative:{0:"这一时间 / 此时"},relativeTime:{future:{other:"{0}小时后"},past:{other:"{0}小时前"}}},"hour-short":{displayName:"小时",relative:{0:"这一时间 / 此时"},relativeTime:{future:{other:"{0}小时后"},past:{other:"{0}小时前"}}},minute:{displayName:"分钟",relative:{0:"此刻"},relativeTime:{future:{other:"{0}分钟后"},past:{other:"{0}分钟前"}}},"minute-short":{displayName:"分",relative:{0:"此刻"},relativeTime:{future:{other:"{0}分钟后"},past:{other:"{0}分钟前"}}},second:{displayName:"秒",relative:{0:"现在"},relativeTime:{future:{other:"{0}秒后"},past:{other:"{0}秒前"}}},"second-short":{displayName:"秒",relative:{0:"现在"},relativeTime:{future:{other:"{0}秒后"},past:{other:"{0}秒前"}}}}}),a.__addLocaleData({locale:"zh-Hans-MO",parentLocale:"zh-Hans",fields:{year:{displayName:"年",relative:{0:"今年",1:"明年","-1":"去年"},relativeTime:{future:{other:"{0}年后"},past:{other:"{0}年前"}}},"year-short":{displayName:"年",relative:{0:"今年",1:"明年","-1":"去年"},relativeTime:{future:{other:"{0}年后"},past:{other:"{0}年前"}}},month:{displayName:"月",relative:{0:"本月",1:"下个月","-1":"上个月"},relativeTime:{future:{other:"{0}个月后"},past:{other:"{0}个月前"}}},"month-short":{displayName:"月",relative:{0:"本月",1:"下个月","-1":"上个月"},relativeTime:{future:{other:"{0}个月后"},past:{other:"{0}个月前"}}},day:{displayName:"日",relative:{0:"今天",1:"明天",2:"后天","-2":"前天","-1":"昨天"},relativeTime:{future:{other:"{0}天后"},past:{other:"{0}天前"}}},"day-short":{displayName:"日",relative:{0:"今天",1:"明天",2:"后天","-2":"前天","-1":"昨天"},relativeTime:{future:{other:"{0}天后"},past:{other:"{0}天前"}}},hour:{displayName:"小时",relative:{0:"这一时间 / 此时"},relativeTime:{future:{other:"{0}小时后"},past:{other:"{0}小时前"}}},"hour-short":{displayName:"小时",relative:{0:"这一时间 / 此时"},relativeTime:{future:{other:"{0}小时后"},past:{other:"{0}小时前"}}},minute:{displayName:"分钟",relative:{0:"此刻"},relativeTime:{future:{other:"{0}分钟后"},past:{other:"{0}分钟前"}}},"minute-short":{displayName:"分",relative:{0:"此刻"},relativeTime:{future:{other:"{0}分钟后"},past:{other:"{0}分钟前"}}},second:{displayName:"秒",relative:{0:"现在"},relativeTime:{future:{other:"{0}秒后"},past:{other:"{0}秒前"}}},"second-short":{displayName:"秒",relative:{0:"现在"},relativeTime:{future:{other:"{0}秒后"},past:{other:"{0}秒前"}}}}}),a.__addLocaleData({locale:"zh-Hans-SG",parentLocale:"zh-Hans",fields:{year:{displayName:"年",relative:{0:"今年",1:"明年","-1":"去年"},relativeTime:{future:{other:"{0}年后"},past:{other:"{0}年前"}}},"year-short":{displayName:"年",relative:{0:"今年",1:"明年","-1":"去年"},relativeTime:{future:{other:"{0}年后"},past:{other:"{0}年前"}}},month:{displayName:"月",relative:{0:"本月",1:"下个月","-1":"上个月"},relativeTime:{future:{other:"{0}个月后"},past:{other:"{0}个月前"}}},"month-short":{displayName:"月",relative:{0:"本月",1:"下个月","-1":"上个月"},relativeTime:{future:{other:"{0}个月后"},past:{other:"{0}个月前"}}},day:{displayName:"日",relative:{0:"今天",1:"明天",2:"后天","-2":"前天","-1":"昨天"},relativeTime:{future:{other:"{0}天后"},past:{other:"{0}天前"}}},"day-short":{displayName:"日",relative:{0:"今天",1:"明天",2:"后天","-2":"前天","-1":"昨天"},relativeTime:{future:{other:"{0}天后"},past:{other:"{0}天前"}}},hour:{displayName:"小时",relative:{0:"这一时间 / 此时"},relativeTime:{future:{other:"{0}小时后"},past:{other:"{0}小时前"}}},"hour-short":{displayName:"小时",relative:{0:"这一时间 / 此时"},relativeTime:{future:{other:"{0}小时后"},past:{other:"{0}小时前"}}},minute:{displayName:"分钟",relative:{0:"此刻"},relativeTime:{future:{other:"{0}分钟后"},past:{other:"{0}分钟前"}}},"minute-short":{displayName:"分",relative:{0:"此刻"},relativeTime:{future:{other:"{0}分钟后"},past:{other:"{0}分钟前"}}},second:{displayName:"秒",relative:{0:"现在"},relativeTime:{future:{other:"{0}秒后"},past:{other:"{0}秒前"}}},"second-short":{displayName:"秒",relative:{0:"现在"},relativeTime:{future:{other:"{0}秒后"},past:{other:"{0}秒前"}}}}}),a.__addLocaleData({locale:"zh-Hant",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"年",relative:{0:"今年",1:"明年","-1":"去年"},relativeTime:{future:{other:"{0} 年後"},past:{other:"{0} 年前"}}},"year-short":{displayName:"年",relative:{0:"今年",1:"明年","-1":"去年"},relativeTime:{future:{other:"{0} 年後"},past:{other:"{0} 年前"}}},month:{displayName:"月",relative:{0:"本月",1:"下個月","-1":"上個月"},relativeTime:{future:{other:"{0} 個月後"},past:{other:"{0} 個月前"}}},"month-short":{displayName:"月",relative:{0:"本月",1:"下個月","-1":"上個月"},relativeTime:{future:{other:"{0} 個月後"},past:{other:"{0} 個月前"}}},day:{displayName:"日",relative:{0:"今天",1:"明天",2:"後天","-2":"前天","-1":"昨天"},relativeTime:{future:{other:"{0} 天後"},past:{other:"{0} 天前"}}},"day-short":{displayName:"日",relative:{0:"今天",1:"明天",2:"後天","-2":"前天","-1":"昨天"},relativeTime:{future:{other:"{0} 天後"},past:{other:"{0} 天前"}}},hour:{displayName:"小時",relative:{0:"這一小時"},relativeTime:{future:{other:"{0} 小時後"},past:{other:"{0} 小時前"}}},"hour-short":{displayName:"小時",relative:{0:"這一小時"},relativeTime:{future:{other:"{0} 小時後"},past:{other:"{0} 小時前"}}},minute:{displayName:"分鐘",relative:{0:"這一分鐘"},relativeTime:{future:{other:"{0} 分鐘後"},past:{other:"{0} 分鐘前"}}},"minute-short":{displayName:"分鐘",relative:{0:"這一分鐘"},relativeTime:{future:{other:"{0} 分鐘後"},past:{other:"{0} 分鐘前"}}},second:{displayName:"秒",relative:{0:"現在"},relativeTime:{future:{other:"{0} 秒後"},past:{other:"{0} 秒前"}}},"second-short":{displayName:"秒",relative:{0:"現在"},relativeTime:{future:{other:"{0} 秒後"},past:{other:"{0} 秒前"}}}}}),a.__addLocaleData({locale:"zh-Hant-HK",parentLocale:"zh-Hant",fields:{year:{displayName:"年",relative:{0:"今年",1:"下年","-1":"上年"},relativeTime:{future:{other:"{0} 年後"},past:{other:"{0} 年前"}}},"year-short":{displayName:"年",relative:{0:"今年",1:"下年","-1":"上年"},relativeTime:{future:{other:"{0} 年後"},past:{other:"{0} 年前"}}},month:{displayName:"月",relative:{0:"本月",1:"下個月","-1":"上個月"},relativeTime:{future:{other:"{0} 個月後"},past:{other:"{0} 個月前"}}},"month-short":{displayName:"月",relative:{0:"本月",1:"下個月","-1":"上個月"},relativeTime:{future:{other:"{0} 個月後"},past:{other:"{0} 個月前"}}},day:{displayName:"日",relative:{0:"今日",1:"明日",2:"後日","-2":"前日","-1":"昨日"},relativeTime:{future:{other:"{0} 日後"},past:{other:"{0} 日前"}}},"day-short":{displayName:"日",relative:{0:"今日",1:"明日",2:"後日","-2":"前日","-1":"昨日"},relativeTime:{future:{other:"{0} 日後"},past:{other:"{0} 日前"}}},hour:{displayName:"小時",relative:{0:"這個小時"},relativeTime:{future:{other:"{0} 小時後"},past:{other:"{0} 小時前"}}},"hour-short":{displayName:"小時",relative:{0:"這個小時"},relativeTime:{future:{other:"{0} 小時後"},past:{other:"{0} 小時前"}}},minute:{displayName:"分鐘",relative:{0:"這分鐘"},relativeTime:{future:{other:"{0} 分鐘後"},past:{other:"{0} 分鐘前"}}},"minute-short":{displayName:"分鐘",relative:{0:"這分鐘"},relativeTime:{future:{other:"{0} 分鐘後"},past:{other:"{0} 分鐘前"}}},second:{displayName:"秒",relative:{0:"現在"},relativeTime:{future:{other:"{0} 秒後"},past:{other:"{0} 秒前"}}},"second-short":{displayName:"秒",relative:{0:"現在"},relativeTime:{future:{other:"{0} 秒後"},past:{other:"{0} 秒前"}}}}}),a.__addLocaleData({locale:"zh-Hant-MO",parentLocale:"zh-Hant-HK"}),a.__addLocaleData({locale:"zu",pluralRuleFunction:function(e,t){return t?"other":e>=0&&e<=1?"one":"other"},fields:{year:{displayName:"Unyaka",relative:{0:"kulo nyaka",1:"unyaka ozayo","-1":"onyakeni odlule"},relativeTime:{future:{one:"onyakeni ongu-{0} ozayo",other:"eminyakeni engu-{0} ezayo"},past:{one:"{0} unyaka odlule",other:"{0} iminyaka edlule"}}},"year-short":{displayName:"Unyaka",relative:{0:"kulo nyaka",1:"unyaka ozayo","-1":"onyakeni odlule"},relativeTime:{future:{one:"onyakeni ongu-{0} ozayo",other:"eminyakeni engu-{0} ezayo"},past:{one:"{0} unyaka odlule",other:"{0} unyaka odlule"}}},month:{displayName:"Inyanga",relative:{0:"le nyanga",1:"inyanga ezayo","-1":"inyanga edlule"},relativeTime:{future:{one:"enyangeni engu-{0}",other:"ezinyangeni ezingu-{0} ezizayo"},past:{one:"{0} inyanga edlule",other:"{0} izinyanga ezedlule"}}},"month-short":{displayName:"Inyanga",relative:{0:"le nyanga",1:"inyanga ezayo","-1":"inyanga edlule"},relativeTime:{future:{one:"ezinyangeni ezingu-{0} ezizayo",other:"ezinyangeni ezingu-{0} ezizayo"},past:{one:"{0} izinyanga ezedlule",other:"{0} izinyanga ezedlule"}}},day:{displayName:"Usuku",relative:{0:"namhlanje",1:"kusasa",2:"usuku olulandela olwakusasa","-2":"usuku olwandulela olwayizolo","-1":"izolo"},relativeTime:{future:{one:"osukwini olungu-{0} oluzayo",other:"ezinsukwini ezingu-{0} ezizayo"},past:{one:"osukwini olungu-{0} olwedlule",other:"ezinsukwini ezingu-{0} ezedlule."}}},"day-short":{displayName:"Usuku",relative:{0:"namhlanje",1:"kusasa",2:"usuku olulandela olwakusasa","-2":"usuku olwandulela olwayizolo","-1":"izolo"},relativeTime:{future:{one:"osukwini olungu-{0} oluzayo",other:"ezinsukwini ezingu-{0} ezizayo"},past:{one:"{0} usuku olwedlule",other:"{0} izinsuku ezedlule"}}},hour:{displayName:"Ihora",relative:{0:"leli hora"},relativeTime:{future:{one:"ehoreni elingu-{0} elizayo",other:"emahoreni angu-{0} ezayo"},past:{one:"{0} ihora eledlule",other:"emahoreni angu-{0} edlule"}}},"hour-short":{displayName:"Ihora",relative:{0:"leli hora"},relativeTime:{future:{one:"ehoreni elingu-{0} elizayo",other:"emahoreni angu-{0} ezayo"},past:{one:"{0} ihora eledlule",other:"{0} amahora edlule"}}},minute:{displayName:"Iminithi",relative:{0:"leli minithi"},relativeTime:{future:{one:"kuminithi elingu-{0} elizayo",other:"kumaminithi angu-{0} ezayo"},past:{one:"{0} iminithi eledlule",other:"{0} amaminithi edlule"}}},"minute-short":{displayName:"Iminithi",relative:{0:"leli minithi"},relativeTime:{future:{one:"kuminithi elingu-{0} elizayo",other:"kumaminithi angu-{0} ezayo"},past:{one:"{0} iminithi eledlule",other:"{0} amaminithi edlule"}}},second:{displayName:"Isekhondi",relative:{0:"manje"},relativeTime:{future:{one:"kusekhondi elingu-{0} elizayo",other:"kumasekhondi angu-{0} ezayo"},past:{one:"{0} isekhondi eledlule",other:"{0} amasekhondi edlule"}}},"second-short":{displayName:"Isekhondi",relative:{0:"manje"},relativeTime:{future:{one:"kusekhondi elingu-{0} elizayo",other:"kumasekhondi angu-{0} ezayo"},past:{one:"{0} isekhondi eledlule",other:"{0} amasekhondi edlule"}}}}})},function(e,t,r){"use strict";var a=r(383),n=r(992);a.default.__addLocaleData(n.default),a.default.defaultLocale="en",t.default=a.default},function(e,t,r){"use strict";t=e.exports=r(997).default,t.default=t},function(e,t,r){"use strict";t.default=function(){function e(t,r,a,n){this.message=t,this.expected=r,this.found=a,this.location=n,this.name="SyntaxError","function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,e)}function t(t){function r(){return n(Ye,qe)}function a(e){var r,a,n=Ze[e];if(n)return n;for(r=e-1;!Ze[r];)r--;for(n=Ze[r],n={line:n.line,column:n.column,seenCR:n.seenCR};r<e;)a=t.charAt(r),"\n"===a?(n.seenCR||n.line++,n.column=1,n.seenCR=!1):"\r"===a||"\u2028"===a||"\u2029"===a?(n.line++,n.column=1,n.seenCR=!0):(n.column++,n.seenCR=!1),r++;return Ze[e]=n,n}function n(e,t){var r=a(e),n=a(t);return{start:{offset:e,line:r.line,column:r.column},end:{offset:t,line:n.line,column:n.column}}}function o(e){qe<Ke||(qe>Ke&&(Ke=qe,Je=[]),Je.push(e))}function i(){return l()}function l(){var e,t,r;for(e=qe,t=[],r=s();r!==I;)t.push(r),r=s();return t!==I&&(Ye=e,t=R(t)),e=t}function s(){var e;return e=h(),e===I&&(e=d()),e}function u(){var e,r,a,n,o,i;if(e=qe,r=[],a=qe,n=N(),n!==I?(o=D(),o!==I?(i=N(),i!==I?(n=[n,o,i],a=n):(qe=a,a=I)):(qe=a,a=I)):(qe=a,a=I),a!==I)for(;a!==I;)r.push(a),a=qe,n=N(),n!==I?(o=D(),o!==I?(i=N(),i!==I?(n=[n,o,i],a=n):(qe=a,a=I)):(qe=a,a=I)):(qe=a,a=I);else r=I;return r!==I&&(Ye=e,r=E(r)),e=r,e===I&&(e=qe,r=w(),e=r!==I?t.substring(e,qe):r),e}function h(){var e,t;return e=qe,t=u(),t!==I&&(Ye=e,t=P(t)),e=t}function c(){var e,r,a;if((e=S())===I){if(e=qe,r=[],O.test(t.charAt(qe))?(a=t.charAt(qe),qe++):(a=I,0===Xe&&o(F)),a!==I)for(;a!==I;)r.push(a),O.test(t.charAt(qe))?(a=t.charAt(qe),qe++):(a=I,0===Xe&&o(F));else r=I;e=r!==I?t.substring(e,qe):r}return e}function d(){var e,r,a,n,i,l,s,u,h;return e=qe,123===t.charCodeAt(qe)?(r=j,qe++):(r=I,0===Xe&&o(B)),r!==I?(a=N(),a!==I?(n=c(),n!==I?(i=N(),i!==I?(l=qe,44===t.charCodeAt(qe)?(s=H,qe++):(s=I,0===Xe&&o(V)),s!==I?(u=N(),u!==I?(h=m(),h!==I?(s=[s,u,h],l=s):(qe=l,l=I)):(qe=l,l=I)):(qe=l,l=I),l===I&&(l=null),l!==I?(s=N(),s!==I?(125===t.charCodeAt(qe)?(u=G,qe++):(u=I,0===Xe&&o(W)),u!==I?(Ye=e,r=U(n,l),e=r):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I),e}function m(){var e;return e=p(),e===I&&(e=f())===I&&(e=v())===I&&(e=y()),e}function p(){var e,r,a,n,i,l,s;return e=qe,t.substr(qe,6)===q?(r=q,qe+=6):(r=I,0===Xe&&o(Y)),r===I&&(t.substr(qe,4)===Z?(r=Z,qe+=4):(r=I,0===Xe&&o(K)),r===I&&(t.substr(qe,4)===J?(r=J,qe+=4):(r=I,0===Xe&&o(X)))),r!==I?(a=N(),a!==I?(n=qe,44===t.charCodeAt(qe)?(i=H,qe++):(i=I,0===Xe&&o(V)),i!==I?(l=N(),l!==I?(s=D(),s!==I?(i=[i,l,s],n=i):(qe=n,n=I)):(qe=n,n=I)):(qe=n,n=I),n===I&&(n=null),n!==I?(Ye=e,r=$(r,n),e=r):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I),e}function f(){var e,r,a,n,i,l;return e=qe,t.substr(qe,6)===Q?(r=Q,qe+=6):(r=I,0===Xe&&o(ee)),r!==I?(a=N(),a!==I?(44===t.charCodeAt(qe)?(n=H,qe++):(n=I,0===Xe&&o(V)),n!==I?(i=N(),i!==I?(l=x(),l!==I?(Ye=e,r=te(l),e=r):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I),e}function v(){var e,r,a,n,i,l;return e=qe,t.substr(qe,13)===re?(r=re,qe+=13):(r=I,0===Xe&&o(ae)),r!==I?(a=N(),a!==I?(44===t.charCodeAt(qe)?(n=H,qe++):(n=I,0===Xe&&o(V)),n!==I?(i=N(),i!==I?(l=x(),l!==I?(Ye=e,r=ne(l),e=r):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I),e}function y(){var e,r,a,n,i;if(e=qe,t.substr(qe,6)===oe?(r=oe,qe+=6):(r=I,0===Xe&&o(ie)),r!==I)if(N()!==I)if(44===t.charCodeAt(qe)?(a=H,qe++):(a=I,0===Xe&&o(V)),a!==I)if(N()!==I){if(n=[],(i=_())!==I)for(;i!==I;)n.push(i),i=_();else n=I;n!==I?(Ye=e,r=le(n),e=r):(qe=e,e=I)}else qe=e,e=I;else qe=e,e=I;else qe=e,e=I;else qe=e,e=I;return e}function g(){var e,r,a,n;return e=qe,r=qe,61===t.charCodeAt(qe)?(a=se,qe++):(a=I,0===Xe&&o(ue)),a!==I?(n=S(),n!==I?(a=[a,n],r=a):(qe=r,r=I)):(qe=r,r=I),e=r!==I?t.substring(e,qe):r,e===I&&(e=D()),e}function _(){var e,r,a,n,i,s,u,h,c;return e=qe,r=N(),r!==I?(a=g(),a!==I?(n=N(),n!==I?(123===t.charCodeAt(qe)?(i=j,qe++):(i=I,0===Xe&&o(B)),i!==I?(s=N(),s!==I?(u=l(),u!==I?(h=N(),h!==I?(125===t.charCodeAt(qe)?(c=G,qe++):(c=I,0===Xe&&o(W)),c!==I?(Ye=e,r=he(a,u),e=r):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I),e}function T(){var e,r,a,n;return e=qe,t.substr(qe,7)===ce?(r=ce,qe+=7):(r=I,0===Xe&&o(de)),r!==I?(a=N(),a!==I?(n=S(),n!==I?(Ye=e,r=me(n),e=r):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I),e}function x(){var e,t,r,a;if(e=qe,t=T(),t===I&&(t=null),t!==I)if(N()!==I){if(r=[],(a=_())!==I)for(;a!==I;)r.push(a),a=_();else r=I;r!==I?(Ye=e,t=pe(t,r),e=t):(qe=e,e=I)}else qe=e,e=I;else qe=e,e=I;return e}function w(){var e,r;if(Xe++,e=[],ve.test(t.charAt(qe))?(r=t.charAt(qe),qe++):(r=I,0===Xe&&o(ye)),r!==I)for(;r!==I;)e.push(r),ve.test(t.charAt(qe))?(r=t.charAt(qe),qe++):(r=I,0===Xe&&o(ye));else e=I;return Xe--,e===I&&(r=I,0===Xe&&o(fe)),e}function N(){var e,r,a;for(Xe++,e=qe,r=[],a=w();a!==I;)r.push(a),a=w();return e=r!==I?t.substring(e,qe):r,Xe--,e===I&&(r=I,0===Xe&&o(ge)),e}function b(){var e;return _e.test(t.charAt(qe))?(e=t.charAt(qe),qe++):(e=I,0===Xe&&o(Te)),e}function L(){var e;return xe.test(t.charAt(qe))?(e=t.charAt(qe),qe++):(e=I,0===Xe&&o(we)),e}function S(){var e,r,a,n,i,l;if(e=qe,48===t.charCodeAt(qe)?(r=Ne,qe++):(r=I,0===Xe&&o(be)),r===I){if(r=qe,a=qe,Le.test(t.charAt(qe))?(n=t.charAt(qe),qe++):(n=I,0===Xe&&o(Se)),n!==I){for(i=[],l=b();l!==I;)i.push(l),l=b();i!==I?(n=[n,i],a=n):(qe=a,a=I)}else qe=a,a=I;r=a!==I?t.substring(r,qe):a}return r!==I&&(Ye=e,r=ke(r)),e=r}function k(){var e,r,a,n,i,l,s,u;return De.test(t.charAt(qe))?(e=t.charAt(qe),qe++):(e=I,0===Xe&&o(Me)),e===I&&(e=qe,t.substr(qe,2)===Ae?(r=Ae,qe+=2):(r=I,0===Xe&&o(Ie)),r!==I&&(Ye=e,r=ze()),(e=r)===I&&(e=qe,t.substr(qe,2)===Ce?(r=Ce,qe+=2):(r=I,0===Xe&&o(Re)),r!==I&&(Ye=e,r=Ee()),(e=r)===I&&(e=qe,t.substr(qe,2)===Pe?(r=Pe,qe+=2):(r=I,0===Xe&&o(Oe)),r!==I&&(Ye=e,r=Fe()),(e=r)===I&&(e=qe,t.substr(qe,2)===je?(r=je,qe+=2):(r=I,0===Xe&&o(Be)),r!==I&&(Ye=e,r=He()),(e=r)===I&&(e=qe,t.substr(qe,2)===Ve?(r=Ve,qe+=2):(r=I,0===Xe&&o(Ge)),r!==I?(a=qe,n=qe,i=L(),i!==I?(l=L(),l!==I?(s=L(),s!==I?(u=L(),u!==I?(i=[i,l,s,u],n=i):(qe=n,n=I)):(qe=n,n=I)):(qe=n,n=I)):(qe=n,n=I),a=n!==I?t.substring(a,qe):n,a!==I?(Ye=e,r=We(a),e=r):(qe=e,e=I)):(qe=e,e=I)))))),e}function D(){var e,t,r;if(e=qe,t=[],(r=k())!==I)for(;r!==I;)t.push(r),r=k();else t=I;return t!==I&&(Ye=e,t=Ue(t)),e=t}var M,A=arguments.length>1?arguments[1]:{},I={},z={start:i},C=i,R=function(e){return{type:"messageFormatPattern",elements:e,location:r()}},E=function(e){var t,r,a,n,o,i="";for(t=0,a=e.length;t<a;t+=1)for(n=e[t],r=0,o=n.length;r<o;r+=1)i+=n[r];return i},P=function(e){return{type:"messageTextElement",value:e,location:r()}},O=/^[^ \t\n\r,.+={}#]/,F={type:"class",value:"[^ \\t\\n\\r,.+={}#]",description:"[^ \\t\\n\\r,.+={}#]"},j="{",B={type:"literal",value:"{",description:'"{"'},H=",",V={type:"literal",value:",",description:'","'},G="}",W={type:"literal",value:"}",description:'"}"'},U=function(e,t){return{type:"argumentElement",id:e,format:t&&t[2],location:r()}},q="number",Y={type:"literal",value:"number",description:'"number"'},Z="date",K={type:"literal",value:"date",description:'"date"'},J="time",X={type:"literal",value:"time",description:'"time"'},$=function(e,t){return{type:e+"Format",style:t&&t[2],location:r()}},Q="plural",ee={type:"literal",value:"plural",description:'"plural"'},te=function(e){return{type:e.type,ordinal:!1,offset:e.offset||0,options:e.options,location:r()}},re="selectordinal",ae={type:"literal",value:"selectordinal",description:'"selectordinal"'},ne=function(e){return{type:e.type,ordinal:!0,offset:e.offset||0,options:e.options,location:r()}},oe="select",ie={type:"literal",value:"select",description:'"select"'},le=function(e){return{type:"selectFormat",options:e,location:r()}},se="=",ue={type:"literal",value:"=",description:'"="'},he=function(e,t){return{type:"optionalFormatPattern",selector:e,value:t,location:r()}},ce="offset:",de={type:"literal",value:"offset:",description:'"offset:"'},me=function(e){return e},pe=function(e,t){return{type:"pluralFormat",offset:e,options:t,location:r()}},fe={type:"other",description:"whitespace"},ve=/^[ \t\n\r]/,ye={type:"class",value:"[ \\t\\n\\r]",description:"[ \\t\\n\\r]"},ge={type:"other",description:"optionalWhitespace"},_e=/^[0-9]/,Te={type:"class",value:"[0-9]",description:"[0-9]"},xe=/^[0-9a-f]/i,we={type:"class",value:"[0-9a-f]i",description:"[0-9a-f]i"},Ne="0",be={type:"literal",value:"0",description:'"0"'},Le=/^[1-9]/,Se={type:"class",value:"[1-9]",description:"[1-9]"},ke=function(e){return parseInt(e,10)},De=/^[^{}\\\0-\x1F \t\n\r]/,Me={type:"class",value:"[^{}\\\\\\0-\\x1F\\x7f \\t\\n\\r]",description:"[^{}\\\\\\0-\\x1F\\x7f \\t\\n\\r]"},Ae="\\\\",Ie={type:"literal",value:"\\\\",description:'"\\\\\\\\"'},ze=function(){return"\\"},Ce="\\#",Re={type:"literal",value:"\\#",description:'"\\\\#"'},Ee=function(){return"\\#"},Pe="\\{",Oe={type:"literal",value:"\\{",description:'"\\\\{"'},Fe=function(){return"{"},je="\\}",Be={type:"literal",value:"\\}",description:'"\\\\}"'},He=function(){return"}"},Ve="\\u",Ge={type:"literal",value:"\\u",description:'"\\\\u"'},We=function(e){return String.fromCharCode(parseInt(e,16))},Ue=function(e){return e.join("")},qe=0,Ye=0,Ze=[{line:1,column:1,seenCR:!1}],Ke=0,Je=[],Xe=0;if("startRule"in A){if(!(A.startRule in z))throw new Error("Can't start parsing from rule \""+A.startRule+'".');C=z[A.startRule]}if((M=C())!==I&&qe===t.length)return M;throw M!==I&&qe<t.length&&o({type:"end",description:"end of input"}),function(t,r,a,n){return null!==r&&function(e){var t=1;for(e.sort(function(e,t){return e.description<t.description?-1:e.description>t.description?1:0});t<e.length;)e[t-1]===e[t]?e.splice(t,1):t++}(r),new e(null!==t?t:function(e,t){var r,a,n,o=new Array(e.length);for(n=0;n<e.length;n++)o[n]=e[n].description;return r=e.length>1?o.slice(0,-1).join(", ")+" or "+o[e.length-1]:o[0],a=t?'"'+function(e){function t(e){return e.charCodeAt(0).toString(16).toUpperCase()}return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\x08/g,"\\b").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\f/g,"\\f").replace(/\r/g,"\\r").replace(/[\x00-\x07\x0B\x0E\x0F]/g,function(e){return"\\x0"+t(e)}).replace(/[\x10-\x1F\x80-\xFF]/g,function(e){return"\\x"+t(e)}).replace(/[\u0100-\u0FFF]/g,function(e){return"\\u0"+t(e)}).replace(/[\u1000-\uFFFF]/g,function(e){return"\\u"+t(e)})}(t)+'"':"end of input","Expected "+r+" but "+a+" found."}(r,a),r,a,n)}(null,Je,Ke<t.length?t.charAt(Ke):null,Ke<t.length?n(Ke,Ke+1):n(Ke,Ke))}return function(e,t){function r(){this.constructor=e}r.prototype=t.prototype,e.prototype=new r}(e,Error),{SyntaxError:e,parse:t}}()},function(e,t,r){"use strict";var a=r(1003).default;r(1002),t=e.exports=a,t.default=t},function(e,t,r){"use strict";function a(e,t,r){this.locales=e,this.formats=t,this.pluralFn=r}function n(e){this.id=e}function o(e,t,r,a,n){this.id=e,this.useOrdinal=t,this.offset=r,this.options=a,this.pluralFn=n}function i(e,t,r,a){this.id=e,this.offset=t,this.numberFormat=r,this.string=a}function l(e,t){this.id=e,this.options=t}t.default=a,a.prototype.compile=function(e){return this.pluralStack=[],this.currentPlural=null,this.pluralNumberFormat=null,this.compileMessage(e)},a.prototype.compileMessage=function(e){if(!e||"messageFormatPattern"!==e.type)throw new Error('Message AST is not of type: "messageFormatPattern"');var t,r,a,n=e.elements,o=[];for(t=0,r=n.length;t<r;t+=1)switch(a=n[t],a.type){case"messageTextElement":o.push(this.compileMessageText(a));break;case"argumentElement":o.push(this.compileArgument(a));break;default:throw new Error("Message element does not have a valid type")}return o},a.prototype.compileMessageText=function(e){return this.currentPlural&&/(^|[^\\])#/g.test(e.value)?(this.pluralNumberFormat||(this.pluralNumberFormat=new Intl.NumberFormat(this.locales)),new i(this.currentPlural.id,this.currentPlural.format.offset,this.pluralNumberFormat,e.value)):e.value.replace(/\\#/g,"#")},a.prototype.compileArgument=function(e){var t=e.format;if(!t)return new n(e.id);var r,a=this.formats,i=this.locales,s=this.pluralFn;switch(t.type){case"numberFormat":return r=a.number[t.style],{id:e.id,format:new Intl.NumberFormat(i,r).format};case"dateFormat":return r=a.date[t.style],{id:e.id,format:new Intl.DateTimeFormat(i,r).format};case"timeFormat":return r=a.time[t.style],{id:e.id,format:new Intl.DateTimeFormat(i,r).format};case"pluralFormat":return r=this.compileOptions(e),new o(e.id,t.ordinal,t.offset,r,s);case"selectFormat":return r=this.compileOptions(e),new l(e.id,r);default:throw new Error("Message element does not have a valid format type")}},a.prototype.compileOptions=function(e){var t=e.format,r=t.options,a={};this.pluralStack.push(this.currentPlural),this.currentPlural="pluralFormat"===t.type?e:null;var n,o,i;for(n=0,o=r.length;n<o;n+=1)i=r[n],a[i.selector]=this.compileMessage(i.value);return this.currentPlural=this.pluralStack.pop(),a},n.prototype.format=function(e){return e||"number"==typeof e?"string"==typeof e?e:String(e):""},o.prototype.getOption=function(e){var t=this.options;return t["="+e]||t[this.pluralFn(e-this.offset,this.useOrdinal)]||t.other},i.prototype.format=function(e){var t=this.numberFormat.format(e-this.offset);return this.string.replace(/(^|[^\\])#/g,"$1"+t).replace(/\\#/g,"#")},l.prototype.getOption=function(e){var t=this.options;return t[e]||t.other}},function(e,t,r){"use strict";t.default={locale:"en",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1],n=Number(r[0])==e,o=n&&r[0].slice(-1),i=n&&r[0].slice(-2);return t?1==o&&11!=i?"one":2==o&&12!=i?"two":3==o&&13!=i?"few":"other":1==e&&a?"one":"other"}}},function(e,t,r){"use strict";var a=r(385),n=function(){try{return!!Object.defineProperty({},"a",{})}catch(e){return!1}}(),o=(!n&&Object.prototype.__defineGetter__,n?Object.defineProperty:function(e,t,r){"get"in r&&e.__defineGetter__?e.__defineGetter__(t,r.get):(!a.hop.call(e,t)||"value"in r)&&(e[t]=r.value)}),i=Object.create||function(e,t){function r(){}var n,i;r.prototype=e,n=new r;for(i in t)a.hop.call(t,i)&&o(n,i,t[i]);return n};t.defineProperty=o,t.objCreate=i},function(e,t,r){"use strict";var a=r(384).default;a.__addLocaleData({locale:"af",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"af-NA",parentLocale:"af"}),a.__addLocaleData({locale:"agq",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ak",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"}}),a.__addLocaleData({locale:"am",pluralRuleFunction:function(e,t){return t?"other":e>=0&&e<=1?"one":"other"}}),a.__addLocaleData({locale:"ar",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e,n=a&&r[0].slice(-2);return t?"other":0==e?"zero":1==e?"one":2==e?"two":n>=3&&n<=10?"few":n>=11&&n<=99?"many":"other"}}),a.__addLocaleData({locale:"ar-AE",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-BH",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-DJ",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-DZ",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-EG",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-EH",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-ER",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-IL",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-IQ",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-JO",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-KM",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-KW",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-LB",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-LY",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-MA",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-MR",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-OM",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-PS",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-QA",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-SA",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-SD",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-SO",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-SS",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-SY",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-TD",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-TN",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-YE",parentLocale:"ar"}),a.__addLocaleData({locale:"as",pluralRuleFunction:function(e,t){return t?1==e||5==e||7==e||8==e||9==e||10==e?"one":2==e||3==e?"two":4==e?"few":6==e?"many":"other":e>=0&&e<=1?"one":"other"}}),a.__addLocaleData({locale:"asa",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ast",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"az",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=a.slice(-1),o=a.slice(-2),i=a.slice(-3);return t?1==n||2==n||5==n||7==n||8==n||20==o||50==o||70==o||80==o?"one":3==n||4==n||100==i||200==i||300==i||400==i||500==i||600==i||700==i||800==i||900==i?"few":0==a||6==n||40==o||60==o||90==o?"many":"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"az-Arab",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"az-Cyrl",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"az-Latn",parentLocale:"az"}),a.__addLocaleData({locale:"bas",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"be",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e,n=a&&r[0].slice(-1),o=a&&r[0].slice(-2);return t?2!=n&&3!=n||12==o||13==o?"other":"few":1==n&&11!=o?"one":n>=2&&n<=4&&(o<12||o>14)?"few":a&&0==n||n>=5&&n<=9||o>=11&&o<=14?"many":"other"}}),a.__addLocaleData({locale:"bem",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"bez",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"bg",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"bh",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"}}),a.__addLocaleData({locale:"bm",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"bm-Nkoo",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"bn",pluralRuleFunction:function(e,t){return t?1==e||5==e||7==e||8==e||9==e||10==e?"one":2==e||3==e?"two":4==e?"few":6==e?"many":"other":e>=0&&e<=1?"one":"other"}}),a.__addLocaleData({locale:"bn-IN",parentLocale:"bn"}),a.__addLocaleData({locale:"bo",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"bo-IN",parentLocale:"bo"}),a.__addLocaleData({locale:"br",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e,n=a&&r[0].slice(-1),o=a&&r[0].slice(-2),i=a&&r[0].slice(-6);return t?"other":1==n&&11!=o&&71!=o&&91!=o?"one":2==n&&12!=o&&72!=o&&92!=o?"two":(3==n||4==n||9==n)&&(o<10||o>19)&&(o<70||o>79)&&(o<90||o>99)?"few":0!=e&&a&&0==i?"many":"other"}}),a.__addLocaleData({locale:"brx",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"bs",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=a.slice(-2),s=n.slice(-1),u=n.slice(-2);return t?"other":o&&1==i&&11!=l||1==s&&11!=u?"one":o&&i>=2&&i<=4&&(l<12||l>14)||s>=2&&s<=4&&(u<12||u>14)?"few":"other"}}),a.__addLocaleData({locale:"bs-Cyrl",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"bs-Latn",parentLocale:"bs"}),a.__addLocaleData({locale:"ca",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?1==e||3==e?"one":2==e?"two":4==e?"few":"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"ca-AD",parentLocale:"ca"}),a.__addLocaleData({locale:"ca-ES-VALENCIA",parentLocale:"ca-ES"}),a.__addLocaleData({locale:"ca-ES",parentLocale:"ca"}),a.__addLocaleData({locale:"ca-FR",parentLocale:"ca"}),a.__addLocaleData({locale:"ca-IT",parentLocale:"ca"}),a.__addLocaleData({locale:"ce",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"cgg",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"chr",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ckb",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ckb-IR",parentLocale:"ckb"}),a.__addLocaleData({locale:"cs",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1];return t?"other":1==e&&n?"one":a>=2&&a<=4&&n?"few":n?"other":"many"}}),a.__addLocaleData({locale:"cu",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"cy",pluralRuleFunction:function(e,t){return t?0==e||7==e||8==e||9==e?"zero":1==e?"one":2==e?"two":3==e||4==e?"few":5==e||6==e?"many":"other":0==e?"zero":1==e?"one":2==e?"two":3==e?"few":6==e?"many":"other"}}),a.__addLocaleData({locale:"da",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=Number(r[0])==e;return t?"other":1!=e&&(n||0!=a&&1!=a)?"other":"one"}}),a.__addLocaleData({locale:"da-GL",parentLocale:"da"}),a.__addLocaleData({locale:"dav",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"de",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"de-AT",parentLocale:"de"}),a.__addLocaleData({locale:"de-BE",parentLocale:"de"}),a.__addLocaleData({locale:"de-CH",parentLocale:"de"}),a.__addLocaleData({locale:"de-LI",parentLocale:"de"}),a.__addLocaleData({locale:"de-LU",parentLocale:"de"}),a.__addLocaleData({locale:"dje",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"dsb",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-2),l=n.slice(-2);return t?"other":o&&1==i||1==l?"one":o&&2==i||2==l?"two":o&&(3==i||4==i)||3==l||4==l?"few":"other"}}),a.__addLocaleData({locale:"dua",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"dv",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"dyo",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"dz",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ebu",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ee",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ee-TG",parentLocale:"ee"}),a.__addLocaleData({locale:"el",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"el-CY",parentLocale:"el"}),a.__addLocaleData({locale:"en",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1],n=Number(r[0])==e,o=n&&r[0].slice(-1),i=n&&r[0].slice(-2);return t?1==o&&11!=i?"one":2==o&&12!=i?"two":3==o&&13!=i?"few":"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"en-001",parentLocale:"en"}),a.__addLocaleData({locale:"en-150",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-AG",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-AI",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-AS",parentLocale:"en"}),a.__addLocaleData({locale:"en-AT",parentLocale:"en-150"}),a.__addLocaleData({locale:"en-AU",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-BB",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-BE",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-BI",parentLocale:"en"}),a.__addLocaleData({locale:"en-BM",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-BS",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-BW",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-BZ",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-CA",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-CC",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-CH",parentLocale:"en-150"}),a.__addLocaleData({locale:"en-CK",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-CM",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-CX",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-CY",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-DE",parentLocale:"en-150"}),a.__addLocaleData({locale:"en-DG",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-DK",parentLocale:"en-150"}),a.__addLocaleData({locale:"en-DM",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-Dsrt",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"en-ER",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-FI",parentLocale:"en-150"}),a.__addLocaleData({locale:"en-FJ",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-FK",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-FM",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-GB",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-GD",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-GG",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-GH",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-GI",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-GM",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-GU",parentLocale:"en"}),a.__addLocaleData({locale:"en-GY",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-HK",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-IE",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-IL",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-IM",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-IN",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-IO",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-JE",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-JM",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-KE",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-KI",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-KN",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-KY",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-LC",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-LR",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-LS",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-MG",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-MH",parentLocale:"en"}),a.__addLocaleData({locale:"en-MO",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-MP",parentLocale:"en"}),a.__addLocaleData({locale:"en-MS",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-MT",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-MU",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-MW",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-MY",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-NA",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-NF",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-NG",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-NL",parentLocale:"en-150"}),a.__addLocaleData({locale:"en-NR",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-NU",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-NZ",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-PG",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-PH",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-PK",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-PN",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-PR",parentLocale:"en"}),a.__addLocaleData({locale:"en-PW",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-RW",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-SB",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-SC",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-SD",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-SE",parentLocale:"en-150"}),a.__addLocaleData({locale:"en-SG",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-SH",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-SI",parentLocale:"en-150"}),a.__addLocaleData({locale:"en-SL",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-SS",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-SX",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-SZ",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-Shaw",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"en-TC",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-TK",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-TO",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-TT",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-TV",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-TZ",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-UG",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-UM",parentLocale:"en"}),a.__addLocaleData({locale:"en-US",parentLocale:"en"}),a.__addLocaleData({locale:"en-VC",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-VG",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-VI",parentLocale:"en"}),a.__addLocaleData({locale:"en-VU",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-WS",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-ZA",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-ZM",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-ZW",parentLocale:"en-001"}),a.__addLocaleData({locale:"eo",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"es",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}});a.__addLocaleData({locale:"es-419",parentLocale:"es"}),a.__addLocaleData({locale:"es-AR",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-BO",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-CL",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-CO",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-CR",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-CU",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-DO",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-EA",parentLocale:"es"}),a.__addLocaleData({locale:"es-EC",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-GQ",parentLocale:"es"}),a.__addLocaleData({locale:"es-GT",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-HN",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-IC",parentLocale:"es"}),a.__addLocaleData({locale:"es-MX",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-NI",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-PA",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-PE",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-PH",parentLocale:"es"}),a.__addLocaleData({locale:"es-PR",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-PY",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-SV",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-US",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-UY",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-VE",parentLocale:"es-419"}),a.__addLocaleData({locale:"et",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"eu",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ewo",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"fa",pluralRuleFunction:function(e,t){return t?"other":e>=0&&e<=1?"one":"other"}}),a.__addLocaleData({locale:"fa-AF",parentLocale:"fa"}),a.__addLocaleData({locale:"ff",pluralRuleFunction:function(e,t){return t?"other":e>=0&&e<2?"one":"other"}}),a.__addLocaleData({locale:"ff-CM",parentLocale:"ff"}),a.__addLocaleData({locale:"ff-GN",parentLocale:"ff"}),a.__addLocaleData({locale:"ff-MR",parentLocale:"ff"}),a.__addLocaleData({locale:"fi",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"fil",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=n.slice(-1);return t?1==e?"one":"other":o&&(1==a||2==a||3==a)||o&&4!=i&&6!=i&&9!=i||!o&&4!=l&&6!=l&&9!=l?"one":"other"}}),a.__addLocaleData({locale:"fo",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"fo-DK",parentLocale:"fo"}),a.__addLocaleData({locale:"fr",pluralRuleFunction:function(e,t){return t?1==e?"one":"other":e>=0&&e<2?"one":"other"}}),a.__addLocaleData({locale:"fr-BE",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-BF",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-BI",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-BJ",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-BL",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-CA",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-CD",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-CF",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-CG",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-CH",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-CI",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-CM",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-DJ",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-DZ",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-GA",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-GF",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-GN",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-GP",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-GQ",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-HT",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-KM",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-LU",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-MA",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-MC",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-MF",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-MG",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-ML",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-MQ",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-MR",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-MU",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-NC",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-NE",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-PF",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-PM",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-RE",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-RW",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-SC",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-SN",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-SY",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-TD",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-TG",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-TN",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-VU",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-WF",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-YT",parentLocale:"fr"}),a.__addLocaleData({locale:"fur",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"fy",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"ga",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e;return t?1==e?"one":"other":1==e?"one":2==e?"two":a&&e>=3&&e<=6?"few":a&&e>=7&&e<=10?"many":"other"}}),a.__addLocaleData({locale:"gd",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e;return t?"other":1==e||11==e?"one":2==e||12==e?"two":a&&e>=3&&e<=10||a&&e>=13&&e<=19?"few":"other"}}),a.__addLocaleData({locale:"gl",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"gsw",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"gsw-FR",parentLocale:"gsw"}),a.__addLocaleData({locale:"gsw-LI",parentLocale:"gsw"}),a.__addLocaleData({locale:"gu",pluralRuleFunction:function(e,t){return t?1==e?"one":2==e||3==e?"two":4==e?"few":6==e?"many":"other":e>=0&&e<=1?"one":"other"}}),a.__addLocaleData({locale:"guw",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"}}),a.__addLocaleData({locale:"guz",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"gv",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=a.slice(-1),i=a.slice(-2);return t?"other":n&&1==o?"one":n&&2==o?"two":!n||0!=i&&20!=i&&40!=i&&60!=i&&80!=i?n?"other":"many":"few"}}),a.__addLocaleData({locale:"ha",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ha-Arab",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ha-GH",parentLocale:"ha"}),a.__addLocaleData({locale:"ha-NE",parentLocale:"ha"}),a.__addLocaleData({locale:"haw",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"he",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=Number(r[0])==e,i=o&&r[0].slice(-1);return t?"other":1==e&&n?"one":2==a&&n?"two":n&&(e<0||e>10)&&o&&0==i?"many":"other"}}),a.__addLocaleData({locale:"hi",pluralRuleFunction:function(e,t){return t?1==e?"one":2==e||3==e?"two":4==e?"few":6==e?"many":"other":e>=0&&e<=1?"one":"other"}}),a.__addLocaleData({locale:"hr",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=a.slice(-2),s=n.slice(-1),u=n.slice(-2);return t?"other":o&&1==i&&11!=l||1==s&&11!=u?"one":o&&i>=2&&i<=4&&(l<12||l>14)||s>=2&&s<=4&&(u<12||u>14)?"few":"other"}}),a.__addLocaleData({locale:"hr-BA",parentLocale:"hr"}),a.__addLocaleData({locale:"hsb",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-2),l=n.slice(-2);return t?"other":o&&1==i||1==l?"one":o&&2==i||2==l?"two":o&&(3==i||4==i)||3==l||4==l?"few":"other"}}),a.__addLocaleData({locale:"hu",pluralRuleFunction:function(e,t){return t?1==e||5==e?"one":"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"hy",pluralRuleFunction:function(e,t){return t?1==e?"one":"other":e>=0&&e<2?"one":"other"}}),a.__addLocaleData({locale:"id",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ig",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ii",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"in",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"is",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=Number(r[0])==e,o=a.slice(-1),i=a.slice(-2);return t?"other":n&&1==o&&11!=i||!n?"one":"other"}}),a.__addLocaleData({locale:"it",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?11==e||8==e||80==e||800==e?"many":"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"it-CH",parentLocale:"it"}),a.__addLocaleData({locale:"it-SM",parentLocale:"it"}),a.__addLocaleData({locale:"iu",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"}}),a.__addLocaleData({locale:"iu-Latn",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"iw",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=Number(r[0])==e,i=o&&r[0].slice(-1);return t?"other":1==e&&n?"one":2==a&&n?"two":n&&(e<0||e>10)&&o&&0==i?"many":"other"}}),a.__addLocaleData({locale:"ja",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"jbo",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"jgo",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ji",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"jmc",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"jv",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"jw",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ka",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=a.slice(-2);return t?1==a?"one":0==a||n>=2&&n<=20||40==n||60==n||80==n?"many":"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"kab",pluralRuleFunction:function(e,t){return t?"other":e>=0&&e<2?"one":"other"}}),a.__addLocaleData({locale:"kaj",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"kam",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"kcg",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"kde",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"kea",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"khq",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ki",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"kk",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e,n=a&&r[0].slice(-1);return t?6==n||9==n||a&&0==n&&0!=e?"many":"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"kkj",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"kl",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"kln",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"km",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"kn",pluralRuleFunction:function(e,t){return t?"other":e>=0&&e<=1?"one":"other"}}),a.__addLocaleData({locale:"ko",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ko-KP",parentLocale:"ko"}),a.__addLocaleData({locale:"kok",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ks",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ksb",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ksf",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ksh",pluralRuleFunction:function(e,t){return t?"other":0==e?"zero":1==e?"one":"other"}}),a.__addLocaleData({locale:"ku",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"kw",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"}}),a.__addLocaleData({locale:"ky",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"lag",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0];return t?"other":0==e?"zero":0!=a&&1!=a||0==e?"other":"one"}}),a.__addLocaleData({locale:"lb",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"lg",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"lkt",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ln",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"}}),a.__addLocaleData({locale:"ln-AO",parentLocale:"ln"}),a.__addLocaleData({locale:"ln-CF",parentLocale:"ln"}),a.__addLocaleData({locale:"ln-CG",parentLocale:"ln"}),a.__addLocaleData({locale:"lo",pluralRuleFunction:function(e,t){return t&&1==e?"one":"other"}}),a.__addLocaleData({locale:"lrc",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"lrc-IQ",parentLocale:"lrc"}),a.__addLocaleData({locale:"lt",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[1]||"",n=Number(r[0])==e,o=n&&r[0].slice(-1),i=n&&r[0].slice(-2);return t?"other":1==o&&(i<11||i>19)?"one":o>=2&&o<=9&&(i<11||i>19)?"few":0!=a?"many":"other"}}),a.__addLocaleData({locale:"lu",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"luo",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"luy",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"lv",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[1]||"",n=a.length,o=Number(r[0])==e,i=o&&r[0].slice(-1),l=o&&r[0].slice(-2),s=a.slice(-2),u=a.slice(-1);return t?"other":o&&0==i||l>=11&&l<=19||2==n&&s>=11&&s<=19?"zero":1==i&&11!=l||2==n&&1==u&&11!=s||2!=n&&1==u?"one":"other"}}),a.__addLocaleData({locale:"mas",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"mas-TZ",parentLocale:"mas"}),a.__addLocaleData({locale:"mer",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"mfe",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"mg",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"}}),a.__addLocaleData({locale:"mgh",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"mgo",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"mk",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=a.slice(-2),s=n.slice(-1);return t?1==i&&11!=l?"one":2==i&&12!=l?"two":7!=i&&8!=i||17==l||18==l?"other":"many":o&&1==i||1==s?"one":"other"}}),a.__addLocaleData({locale:"ml",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"mn",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"mn-Mong",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"mo",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1],n=Number(r[0])==e,o=n&&r[0].slice(-2);return t?1==e?"one":"other":1==e&&a?"one":!a||0==e||1!=e&&o>=1&&o<=19?"few":"other"}}),a.__addLocaleData({locale:"mr",pluralRuleFunction:function(e,t){return t?1==e?"one":2==e||3==e?"two":4==e?"few":"other":e>=0&&e<=1?"one":"other"}}),a.__addLocaleData({locale:"ms",pluralRuleFunction:function(e,t){return t&&1==e?"one":"other"}}),a.__addLocaleData({locale:"ms-Arab",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ms-BN",parentLocale:"ms"}),a.__addLocaleData({locale:"ms-SG",parentLocale:"ms"}),a.__addLocaleData({locale:"mt",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e,n=a&&r[0].slice(-2);return t?"other":1==e?"one":0==e||n>=2&&n<=10?"few":n>=11&&n<=19?"many":"other"}}),a.__addLocaleData({locale:"mua",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"my",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"mzn",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"nah",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"naq",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"}}),a.__addLocaleData({locale:"nb",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"nb-SJ",parentLocale:"nb"}),a.__addLocaleData({locale:"nd",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ne",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e;return t?a&&e>=1&&e<=4?"one":"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ne-IN",parentLocale:"ne"}),a.__addLocaleData({locale:"nl",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"nl-AW",parentLocale:"nl"}),a.__addLocaleData({locale:"nl-BE",parentLocale:"nl"}),a.__addLocaleData({locale:"nl-BQ",parentLocale:"nl"}),a.__addLocaleData({locale:"nl-CW",parentLocale:"nl"});a.__addLocaleData({locale:"nl-SR",parentLocale:"nl"}),a.__addLocaleData({locale:"nl-SX",parentLocale:"nl"}),a.__addLocaleData({locale:"nmg",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"nn",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"nnh",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"no",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"nqo",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"nr",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"nso",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"}}),a.__addLocaleData({locale:"nus",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ny",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"nyn",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"om",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"om-KE",parentLocale:"om"}),a.__addLocaleData({locale:"or",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"os",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"os-RU",parentLocale:"os"}),a.__addLocaleData({locale:"pa",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"}}),a.__addLocaleData({locale:"pa-Arab",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"pa-Guru",parentLocale:"pa"}),a.__addLocaleData({locale:"pap",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"pl",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=a.slice(-1),i=a.slice(-2);return t?"other":1==e&&n?"one":n&&o>=2&&o<=4&&(i<12||i>14)?"few":n&&1!=a&&(0==o||1==o)||n&&o>=5&&o<=9||n&&i>=12&&i<=14?"many":"other"}}),a.__addLocaleData({locale:"prg",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[1]||"",n=a.length,o=Number(r[0])==e,i=o&&r[0].slice(-1),l=o&&r[0].slice(-2),s=a.slice(-2),u=a.slice(-1);return t?"other":o&&0==i||l>=11&&l<=19||2==n&&s>=11&&s<=19?"zero":1==i&&11!=l||2==n&&1==u&&11!=s||2!=n&&1==u?"one":"other"}}),a.__addLocaleData({locale:"ps",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"pt",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e;return t?"other":a&&e>=0&&e<=2&&2!=e?"one":"other"}}),a.__addLocaleData({locale:"pt-AO",parentLocale:"pt-PT"}),a.__addLocaleData({locale:"pt-PT",parentLocale:"pt",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"pt-CV",parentLocale:"pt-PT"}),a.__addLocaleData({locale:"pt-GW",parentLocale:"pt-PT"}),a.__addLocaleData({locale:"pt-MO",parentLocale:"pt-PT"}),a.__addLocaleData({locale:"pt-MZ",parentLocale:"pt-PT"}),a.__addLocaleData({locale:"pt-ST",parentLocale:"pt-PT"}),a.__addLocaleData({locale:"pt-TL",parentLocale:"pt-PT"}),a.__addLocaleData({locale:"qu",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"qu-BO",parentLocale:"qu"}),a.__addLocaleData({locale:"qu-EC",parentLocale:"qu"}),a.__addLocaleData({locale:"rm",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"rn",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ro",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1],n=Number(r[0])==e,o=n&&r[0].slice(-2);return t?1==e?"one":"other":1==e&&a?"one":!a||0==e||1!=e&&o>=1&&o<=19?"few":"other"}}),a.__addLocaleData({locale:"ro-MD",parentLocale:"ro"}),a.__addLocaleData({locale:"rof",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ru",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=a.slice(-1),i=a.slice(-2);return t?"other":n&&1==o&&11!=i?"one":n&&o>=2&&o<=4&&(i<12||i>14)?"few":n&&0==o||n&&o>=5&&o<=9||n&&i>=11&&i<=14?"many":"other"}}),a.__addLocaleData({locale:"ru-BY",parentLocale:"ru"}),a.__addLocaleData({locale:"ru-KG",parentLocale:"ru"}),a.__addLocaleData({locale:"ru-KZ",parentLocale:"ru"}),a.__addLocaleData({locale:"ru-MD",parentLocale:"ru"}),a.__addLocaleData({locale:"ru-UA",parentLocale:"ru"}),a.__addLocaleData({locale:"rw",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"rwk",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"sah",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"saq",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"sbp",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"sdh",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"se",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"}}),a.__addLocaleData({locale:"se-FI",parentLocale:"se"}),a.__addLocaleData({locale:"se-SE",parentLocale:"se"}),a.__addLocaleData({locale:"seh",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ses",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"sg",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"sh",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=a.slice(-2),s=n.slice(-1),u=n.slice(-2);return t?"other":o&&1==i&&11!=l||1==s&&11!=u?"one":o&&i>=2&&i<=4&&(l<12||l>14)||s>=2&&s<=4&&(u<12||u>14)?"few":"other"}}),a.__addLocaleData({locale:"shi",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e;return t?"other":e>=0&&e<=1?"one":a&&e>=2&&e<=10?"few":"other"}}),a.__addLocaleData({locale:"shi-Latn",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"shi-Tfng",parentLocale:"shi"}),a.__addLocaleData({locale:"si",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"";return t?"other":0==e||1==e||0==a&&1==n?"one":"other"}}),a.__addLocaleData({locale:"sk",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1];return t?"other":1==e&&n?"one":a>=2&&a<=4&&n?"few":n?"other":"many"}}),a.__addLocaleData({locale:"sl",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=a.slice(-2);return t?"other":n&&1==o?"one":n&&2==o?"two":n&&(3==o||4==o)||!n?"few":"other"}}),a.__addLocaleData({locale:"sma",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"}}),a.__addLocaleData({locale:"smi",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"}}),a.__addLocaleData({locale:"smj",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"}}),a.__addLocaleData({locale:"smn",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"}}),a.__addLocaleData({locale:"sms",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"}}),a.__addLocaleData({locale:"sn",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"so",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"so-DJ",parentLocale:"so"}),a.__addLocaleData({locale:"so-ET",parentLocale:"so"}),a.__addLocaleData({locale:"so-KE",parentLocale:"so"}),a.__addLocaleData({locale:"sq",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e,n=a&&r[0].slice(-1),o=a&&r[0].slice(-2);return t?1==e?"one":4==n&&14!=o?"many":"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"sq-MK",parentLocale:"sq"}),a.__addLocaleData({locale:"sq-XK",parentLocale:"sq"}),a.__addLocaleData({locale:"sr",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=a.slice(-2),s=n.slice(-1),u=n.slice(-2);return t?"other":o&&1==i&&11!=l||1==s&&11!=u?"one":o&&i>=2&&i<=4&&(l<12||l>14)||s>=2&&s<=4&&(u<12||u>14)?"few":"other"}}),a.__addLocaleData({locale:"sr-Cyrl",parentLocale:"sr"}),a.__addLocaleData({locale:"sr-Cyrl-BA",parentLocale:"sr-Cyrl"}),a.__addLocaleData({locale:"sr-Cyrl-ME",parentLocale:"sr-Cyrl"}),a.__addLocaleData({locale:"sr-Cyrl-XK",parentLocale:"sr-Cyrl"}),a.__addLocaleData({locale:"sr-Latn",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"sr-Latn-BA",parentLocale:"sr-Latn"}),a.__addLocaleData({locale:"sr-Latn-ME",parentLocale:"sr-Latn"}),a.__addLocaleData({locale:"sr-Latn-XK",parentLocale:"sr-Latn"}),a.__addLocaleData({locale:"ss",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ssy",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"st",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"sv",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1],n=Number(r[0])==e,o=n&&r[0].slice(-1),i=n&&r[0].slice(-2);return t?1!=o&&2!=o||11==i||12==i?"other":"one":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"sv-AX",parentLocale:"sv"}),a.__addLocaleData({locale:"sv-FI",parentLocale:"sv"}),a.__addLocaleData({locale:"sw",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"sw-CD",parentLocale:"sw"}),a.__addLocaleData({locale:"sw-KE",parentLocale:"sw"}),a.__addLocaleData({locale:"sw-UG",parentLocale:"sw"}),a.__addLocaleData({locale:"syr",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ta",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ta-LK",parentLocale:"ta"}),a.__addLocaleData({locale:"ta-MY",parentLocale:"ta"}),a.__addLocaleData({locale:"ta-SG",parentLocale:"ta"}),a.__addLocaleData({locale:"te",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"teo",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"teo-KE",parentLocale:"teo"}),a.__addLocaleData({locale:"th",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ti",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"}}),a.__addLocaleData({locale:"ti-ER",parentLocale:"ti"}),a.__addLocaleData({locale:"tig",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"tk",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"tl",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=n.slice(-1);return t?1==e?"one":"other":o&&(1==a||2==a||3==a)||o&&4!=i&&6!=i&&9!=i||!o&&4!=l&&6!=l&&9!=l?"one":"other"}}),a.__addLocaleData({locale:"tn",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"to",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"tr",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"tr-CY",parentLocale:"tr"}),a.__addLocaleData({locale:"ts",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"twq",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"tzm",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e;return t?"other":0==e||1==e||a&&e>=11&&e<=99?"one":"other"}}),a.__addLocaleData({locale:"ug",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"uk",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=Number(r[0])==e,i=o&&r[0].slice(-1),l=o&&r[0].slice(-2),s=a.slice(-1),u=a.slice(-2);return t?3==i&&13!=l?"few":"other":n&&1==s&&11!=u?"one":n&&s>=2&&s<=4&&(u<12||u>14)?"few":n&&0==s||n&&s>=5&&s<=9||n&&u>=11&&u<=14?"many":"other"}}),a.__addLocaleData({locale:"ur",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"ur-IN",parentLocale:"ur"}),a.__addLocaleData({locale:"uz",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"uz-Arab",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"uz-Cyrl",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"uz-Latn",parentLocale:"uz"}),a.__addLocaleData({locale:"vai",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"vai-Latn",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"vai-Vaii",parentLocale:"vai"}),a.__addLocaleData({locale:"ve",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"vi",pluralRuleFunction:function(e,t){return t&&1==e?"one":"other"}}),a.__addLocaleData({locale:"vo",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"vun",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"wa",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"}}),a.__addLocaleData({locale:"wae",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"wo",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"xh",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"xog",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"yav",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"yi",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"yo",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"yo-BJ",parentLocale:"yo"}),a.__addLocaleData({locale:"zgh",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"zh",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"zh-Hans",parentLocale:"zh"}),a.__addLocaleData({locale:"zh-Hans-HK",parentLocale:"zh-Hans"}),a.__addLocaleData({locale:"zh-Hans-MO",parentLocale:"zh-Hans"}),a.__addLocaleData({locale:"zh-Hans-SG",parentLocale:"zh-Hans"}),a.__addLocaleData({locale:"zh-Hant",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"zh-Hant-HK",parentLocale:"zh-Hant"}),a.__addLocaleData({locale:"zh-Hant-MO",parentLocale:"zh-Hant-HK"}),a.__addLocaleData({locale:"zu",pluralRuleFunction:function(e,t){return t?"other":e>=0&&e<=1?"one":"other"}})},function(e,t,r){"use strict";var a=r(384),n=r(1e3);a.default.__addLocaleData(n.default),a.default.defaultLocale="en",t.default=a.default},function(e,t,r){"use strict";var a=r(116),n=r(59),o=a(n,"DataView");e.exports=o},function(e,t,r){"use strict";function a(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var a=e[t];this.set(a[0],a[1])}}var n=r(1060),o=r(1061),i=r(1062),l=r(1063),s=r(1064);a.prototype.clear=n,a.prototype.delete=o,a.prototype.get=i,a.prototype.has=l,a.prototype.set=s,e.exports=a},function(e,t,r){"use strict";var a=r(116),n=r(59),o=a(n,"Promise");e.exports=o},function(e,t,r){"use strict";var a=r(116),n=r(59),o=a(n,"Set");e.exports=o},function(e,t,r){"use strict";function a(e){var t=-1,r=null==e?0:e.length;for(this.__data__=new n;++t<r;)this.add(e[t])}var n=r(260),o=r(1082),i=r(1083);a.prototype.add=a.prototype.push=o,a.prototype.has=i,e.exports=a},function(e,t,r){"use strict";var a=r(59),n=a.Uint8Array;e.exports=n},function(e,t,r){"use strict";var a=r(116),n=r(59),o=a(n,"WeakMap");e.exports=o},function(e,t,r){"use strict";function a(e,t){for(var r=-1,a=null==e?0:e.length,n=0,o=[];++r<a;){var i=e[r];t(i,r,e)&&(o[n++]=i)}return o}e.exports=a},function(e,t,r){"use strict";function a(e,t){var r=i(e),a=!r&&o(e),h=!r&&!a&&l(e),d=!r&&!a&&!h&&u(e),m=r||a||h||d,p=m?n(e.length,String):[],f=p.length;for(var v in e)!t&&!c.call(e,v)||m&&("length"==v||h&&("offset"==v||"parent"==v)||d&&("buffer"==v||"byteLength"==v||"byteOffset"==v)||s(v,f))||p.push(v);return p}var n=r(1038),o=r(262),i=r(39),l=r(263),s=r(397),u=r(266),h=Object.prototype,c=h.hasOwnProperty;e.exports=a},function(e,t,r){"use strict";function a(e,t){for(var r=-1,a=t.length,n=e.length;++r<a;)e[n+r]=t[r];return e}e.exports=a},function(e,t,r){"use strict";function a(e,t){for(var r=-1,a=null==e?0:e.length;++r<a;)if(t(e[r],r,e))return!0;return!1}e.exports=a},function(e,t,r){"use strict";function a(e){return e.split("")}e.exports=a},function(e,t,r){"use strict";function a(e){return e.match(n)||[]}var n=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;e.exports=a},function(e,t,r){"use strict";var a=r(1020),n=r(1045),o=n(a);e.exports=o},function(e,t,r){"use strict";function a(e,t,r,a){for(var n=e.length,o=r+(a?1:-1);a?o--:++o<n;)if(t(e[o],o,e))return o;return-1}e.exports=a},function(e,t,r){"use strict";var a=r(1046),n=a();e.exports=n},function(e,t,r){"use strict";function a(e,t){return e&&n(e,t,o)}var n=r(1019),o=r(185);e.exports=a},function(e,t,r){"use strict";function a(e,t,r){var a=t(e);return o(e)?a:n(a,r(e))}var n=r(1013),o=r(39);e.exports=a},function(e,t,r){"use strict";function a(e,t){return null!=e&&t in Object(e)}e.exports=a},function(e,t,r){"use strict";function a(e,t,r){return t===t?i(e,t,r):n(e,o,r)}var n=r(1018),o=r(1027),i=r(1090);e.exports=a},function(e,t,r){"use strict";function a(e){return o(e)&&n(e)==i}var n=r(96),o=r(97),i="[object Arguments]";e.exports=a},function(e,t,r){"use strict";function a(e,t,r,a,v,g){var _=u(e),T=u(t),x=_?p:s(e),w=T?p:s(t);x=x==m?f:x,w=w==m?f:w;var N=x==f,b=w==f,L=x==w;if(L&&h(e)){if(!h(t))return!1;_=!0,N=!1}if(L&&!N)return g||(g=new n),_||c(e)?o(e,t,r,a,v,g):i(e,t,x,r,a,v,g);if(!(r&d)){var S=N&&y.call(e,"__wrapped__"),k=b&&y.call(t,"__wrapped__");if(S||k){var D=S?e.value():e,M=k?t.value():t;return g||(g=new n),v(D,M,r,a,g)}}return!!L&&(g||(g=new n),l(e,t,r,a,v,g))}var n=r(386),o=r(393),i=r(1050),l=r(1051),s=r(395),u=r(39),h=r(263),c=r(266),d=1,m="[object Arguments]",p="[object Array]",f="[object Object]",v=Object.prototype,y=v.hasOwnProperty;e.exports=a},function(e,t,r){"use strict";function a(e,t,r,a){var s=r.length,u=s,h=!a;if(null==e)return!u;for(e=Object(e);s--;){var c=r[s];if(h&&c[2]?c[1]!==e[c[0]]:!(c[0]in e))return!1}for(;++s<u;){c=r[s];var d=c[0],m=e[d],p=c[1];if(h&&c[2]){if(void 0===m&&!(d in e))return!1}else{var f=new n;if(a)var v=a(m,p,d,e,t,f);if(!(void 0===v?o(p,m,i|l,a,f):v))return!1}}return!0}var n=r(386),o=r(390),i=1,l=2;e.exports=a},function(e,t,r){"use strict";function a(e){return e!==e}e.exports=a},function(e,t,r){"use strict";function a(e){return!(!i(e)||o(e))&&(n(e)?p:u).test(l(e))}var n=r(135),o=r(1066),i=r(183),l=r(402),s=/[\\^$.*+?()[\]{}|]/g,u=/^\[object .+?Constructor\]$/,h=Function.prototype,c=Object.prototype,d=h.toString,m=c.hasOwnProperty,p=RegExp("^"+d.call(m).replace(s,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");e.exports=a},function(e,t,r){"use strict";function a(e){return i(e)&&o(e.length)&&!!l[n(e)]}var n=r(96),o=r(264),i=r(97),l={};l["[object Float32Array]"]=l["[object Float64Array]"]=l["[object Int8Array]"]=l["[object Int16Array]"]=l["[object Int32Array]"]=l["[object Uint8Array]"]=l["[object Uint8ClampedArray]"]=l["[object Uint16Array]"]=l["[object Uint32Array]"]=!0,l["[object Arguments]"]=l["[object Array]"]=l["[object ArrayBuffer]"]=l["[object Boolean]"]=l["[object DataView]"]=l["[object Date]"]=l["[object Error]"]=l["[object Function]"]=l["[object Map]"]=l["[object Number]"]=l["[object Object]"]=l["[object RegExp]"]=l["[object Set]"]=l["[object String]"]=l["[object WeakMap]"]=!1,e.exports=a},function(e,t,r){"use strict";function a(e){return"function"==typeof e?e:null==e?l:"object"==(void 0===e?"undefined":n(e))?s(e)?i(e[0],e[1]):o(e):u(e)}var 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},o=r(1031),i=r(1032),l=r(181),s=r(39),u=r(1104);e.exports=a},function(e,t,r){"use strict";function a(e){var t=o(e);return 1==t.length&&t[0][2]?i(t[0][0],t[0][1]):function(r){return r===e||n(r,e,t)}}var n=r(1026),o=r(1053),i=r(400);e.exports=a},function(e,t,r){"use strict";function a(e,t){return l(e)&&s(t)?u(h(e),t):function(r){var a=o(r,e);return void 0===a&&a===t?i(r,e):n(t,a,c|d)}}var n=r(390),o=r(1098),i=r(1099),l=r(261),s=r(399),u=r(400),h=r(180),c=1,d=2;e.exports=a},function(e,t,r){"use strict";function a(e){return function(t){return null==t?void 0:t[e]}}e.exports=a},function(e,t,r){"use strict";function a(e){return function(t){return n(t,e)}}var n=r(389);e.exports=a},function(e,t,r){"use strict";function a(e){return function(t){return null==e?void 0:e[t]}}e.exports=a},function(e,t,r){"use strict";function a(e,t,r,a,n){return n(e,function(e,n,o){r=a?(a=!1,e):t(r,e,n,o)}),r}e.exports=a},function(e,t,r){"use strict";function a(e,t,r){var a=-1,n=e.length;t<0&&(t=-t>n?0:n+t),r=r>n?n:r,r<0&&(r+=n),n=t>r?0:r-t>>>0,t>>>=0;for(var o=Array(n);++a<n;)o[a]=e[a+t];return o}e.exports=a},function(e,t,r){"use strict";function a(e,t){for(var r=-1,a=Array(e);++r<e;)a[r]=t(r);return a}e.exports=a},function(e,t,r){"use strict";function a(e){if("string"==typeof e)return e;if(i(e))return o(e,a)+"";if(l(e))return h?h.call(e):"";var t=e+"";return"0"==t&&1/e==-s?"-0":t}var n=r(176),o=r(387),i=r(39),l=r(136),s=1/0,u=n?n.prototype:void 0,h=u?u.toString:void 0;e.exports=a},function(e,t,r){"use strict";function a(e){return function(t){return e(t)}}e.exports=a},function(e,t,r){"use strict";function a(e,t){return n(t,function(t){return e[t]})}var n=r(387);e.exports=a},function(e,t,r){"use strict";function a(e,t){return e.has(t)}e.exports=a},function(e,t,r){"use strict";function a(e,t,r){var a=e.length;return r=void 0===r?a:r,!t&&r>=a?e:n(e,t,r)}var n=r(1037);e.exports=a},function(e,t,r){"use strict";var a=r(59),n=a["__core-js_shared__"];e.exports=n},function(e,t,r){"use strict";function a(e,t){return function(r,a){if(null==r)return r;if(!n(r))return e(r,a);for(var o=r.length,i=t?o:-1,l=Object(r);(t?i--:++i<o)&&!1!==a(l[i],i,l););return r}}var n=r(182);e.exports=a},function(e,t,r){"use strict";function a(e){return function(t,r,a){for(var n=-1,o=Object(t),i=a(t),l=i.length;l--;){var s=i[e?l:++n];if(!1===r(o[s],s,o))break}return t}}e.exports=a},function(e,t,r){"use strict";function a(e){return function(t){t=l(t);var r=o(t)?i(t):void 0,a=r?r[0]:t.charAt(0),s=r?n(r,1).join(""):t.slice(1);return a[e]()+s}}var n=r(1043),o=r(396),i=r(1091),l=r(117);e.exports=a},function(e,t,r){"use strict";function a(e){return function(t){return n(i(o(t).replace(l,"")),e,"")}}var n=r(388),o=r(1097),i=r(1113),l=RegExp("['’]","g");e.exports=a},function(e,t,r){"use strict";var a=r(1035),n={"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ā":"A","Ă":"A","Ą":"A","ā":"a","ă":"a","ą":"a","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","ć":"c","ĉ":"c","ċ":"c","č":"c","Ď":"D","Đ":"D","ď":"d","đ":"d","Ē":"E","Ĕ":"E","Ė":"E","Ę":"E","Ě":"E","ē":"e","ĕ":"e","ė":"e","ę":"e","ě":"e","Ĝ":"G","Ğ":"G","Ġ":"G","Ģ":"G","ĝ":"g","ğ":"g","ġ":"g","ģ":"g","Ĥ":"H","Ħ":"H","ĥ":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Į":"I","İ":"I","ĩ":"i","ī":"i","ĭ":"i","į":"i","ı":"i","Ĵ":"J","ĵ":"j","Ķ":"K","ķ":"k","ĸ":"k","Ĺ":"L","Ļ":"L","Ľ":"L","Ŀ":"L","Ł":"L","ĺ":"l","ļ":"l","ľ":"l","ŀ":"l","ł":"l","Ń":"N","Ņ":"N","Ň":"N","Ŋ":"N","ń":"n","ņ":"n","ň":"n","ŋ":"n","Ō":"O","Ŏ":"O","Ő":"O","ō":"o","ŏ":"o","ő":"o","Ŕ":"R","Ŗ":"R","Ř":"R","ŕ":"r","ŗ":"r","ř":"r","Ś":"S","Ŝ":"S","Ş":"S","Š":"S","ś":"s","ŝ":"s","ş":"s","š":"s","Ţ":"T","Ť":"T","Ŧ":"T","ţ":"t","ť":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Ů":"U","Ű":"U","Ų":"U","ũ":"u","ū":"u","ŭ":"u","ů":"u","ű":"u","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","Ż":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","IJ":"IJ","ij":"ij","Œ":"Oe","œ":"oe","ʼn":"'n","ſ":"s"},o=a(n);e.exports=o},function(e,t,r){"use strict";function a(e,t,r,a,n,N,L){switch(r){case w:if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case x:return!(e.byteLength!=t.byteLength||!N(new o(e),new o(t)));case d:case m:case v:return i(+e,+t);case p:return e.name==t.name&&e.message==t.message;case y:case _:return e==t+"";case f:var S=s;case g:var k=a&h;if(S||(S=u),e.size!=t.size&&!k)return!1;var D=L.get(e);if(D)return D==t;a|=c,L.set(e,t);var M=l(S(e),S(t),a,n,N,L);return L.delete(e),M;case T:if(b)return b.call(e)==b.call(t)}return!1}var n=r(176),o=r(1009),i=r(403),l=r(393),s=r(1077),u=r(1084),h=1,c=2,d="[object Boolean]",m="[object Date]",p="[object Error]",f="[object Map]",v="[object Number]",y="[object RegExp]",g="[object Set]",_="[object String]",T="[object Symbol]",x="[object ArrayBuffer]",w="[object DataView]",N=n?n.prototype:void 0,b=N?N.valueOf:void 0;e.exports=a},function(e,t,r){"use strict";function a(e,t,r,a,i,s){var u=r&o,h=n(e),c=h.length;if(c!=n(t).length&&!u)return!1;for(var d=c;d--;){var m=h[d];if(!(u?m in t:l.call(t,m)))return!1}var p=s.get(e);if(p&&s.get(t))return p==t;var f=!0;s.set(e,t),s.set(t,e);for(var v=u;++d<c;){m=h[d];var y=e[m],g=t[m];if(a)var _=u?a(g,y,m,t,e,s):a(y,g,m,e,t,s);if(!(void 0===_?y===g||i(y,g,r,a,s):_)){f=!1;break}v||(v="constructor"==m)}if(f&&!v){var T=e.constructor,x=t.constructor;T!=x&&"constructor"in e&&"constructor"in t&&!("function"==typeof T&&T instanceof T&&"function"==typeof x&&x instanceof x)&&(f=!1)}return s.delete(e),s.delete(t),f}var n=r(1052),o=1,i=Object.prototype,l=i.hasOwnProperty;e.exports=a},function(e,t,r){"use strict";function a(e){return n(e,i,o)}var n=r(1021),o=r(1056),i=r(185);e.exports=a},function(e,t,r){"use strict";function a(e){for(var t=o(e),r=t.length;r--;){var a=t[r],i=e[a];t[r]=[a,i,n(i)]}return t}var n=r(399),o=r(185);e.exports=a},function(e,t,r){"use strict";var a=r(401),n=a(Object.getPrototypeOf,Object);e.exports=n},function(e,t,r){"use strict";function a(e){var t=i.call(e,s),r=e[s];try{e[s]=void 0;var a=!0}catch(e){}var n=l.call(e);return a&&(t?e[s]=r:delete e[s]),n}var n=r(176),o=Object.prototype,i=o.hasOwnProperty,l=o.toString,s=n?n.toStringTag:void 0;e.exports=a},function(e,t,r){"use strict";var a=r(1011),n=r(1106),o=Object.prototype,i=o.propertyIsEnumerable,l=Object.getOwnPropertySymbols,s=l?function(e){return null==e?[]:(e=Object(e),a(l(e),function(t){return i.call(e,t)}))}:n;e.exports=s},function(e,t,r){"use strict";function a(e,t){return null==e?void 0:e[t]}e.exports=a},function(e,t,r){"use strict";function a(e,t,r){t=n(t,e);for(var a=-1,h=t.length,c=!1;++a<h;){var d=u(t[a]);if(!(c=null!=e&&r(e,d)))break;e=e[d]}return c||++a!=h?c:!!(h=null==e?0:e.length)&&s(h)&&l(d,h)&&(i(e)||o(e))}var n=r(392),o=r(262),i=r(39),l=r(397),s=r(264),u=r(180);e.exports=a},function(e,t,r){"use strict";function a(e){return n.test(e)}var n=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;e.exports=a},function(e,t,r){"use strict";function a(){this.__data__=n?n(null):{},this.size=0}var n=r(179);e.exports=a},function(e,t,r){"use strict";function a(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}e.exports=a},function(e,t,r){"use strict";function a(e){var t=this.__data__;if(n){var r=t[e];return r===o?void 0:r}return l.call(t,e)?t[e]:void 0}var n=r(179),o="__lodash_hash_undefined__",i=Object.prototype,l=i.hasOwnProperty;e.exports=a},function(e,t,r){"use strict";function a(e){var t=this.__data__;return n?void 0!==t[e]:i.call(t,e)}var n=r(179),o=Object.prototype,i=o.hasOwnProperty;e.exports=a},function(e,t,r){"use strict";function a(e,t){var r=this.__data__;return this.size+=this.has(e)?0:1,r[e]=n&&void 0===t?o:t,this}var n=r(179),o="__lodash_hash_undefined__";e.exports=a},function(e,t,r){"use strict";function a(e){var t=void 0===e?"undefined":n(e);return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e}var 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};e.exports=a},function(e,t,r){"use strict";function a(e){return!!o&&o in e}var n=r(1044),o=function(){var e=/[^.]+$/.exec(n&&n.keys&&n.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}();e.exports=a},function(e,t,r){"use strict";function a(){this.__data__=[],this.size=0}e.exports=a},function(e,t,r){"use strict";function a(e){var t=this.__data__,r=n(t,e);return!(r<0||(r==t.length-1?t.pop():i.call(t,r,1),--this.size,0))}var n=r(177),o=Array.prototype,i=o.splice;e.exports=a},function(e,t,r){"use strict";function a(e){var t=this.__data__,r=n(t,e);return r<0?void 0:t[r][1]}var n=r(177);e.exports=a},function(e,t,r){"use strict";function a(e){return n(this.__data__,e)>-1}var n=r(177);e.exports=a},function(e,t,r){"use strict";function a(e,t){var r=this.__data__,a=n(r,e);return a<0?(++this.size,r.push([e,t])):r[a][1]=t,this}var n=r(177);e.exports=a},function(e,t,r){"use strict";function a(){this.size=0,this.__data__={hash:new n,map:new(i||o),string:new n}}var n=r(1005),o=r(175),i=r(259);e.exports=a},function(e,t,r){"use strict";function a(e){var t=n(this,e).delete(e);return this.size-=t?1:0,t}var n=r(178);e.exports=a},function(e,t,r){"use strict";function a(e){return n(this,e).get(e)}var n=r(178);e.exports=a},function(e,t,r){"use strict";function a(e){return n(this,e).has(e)}var n=r(178);e.exports=a},function(e,t,r){"use strict";function a(e,t){var r=n(this,e),a=r.size;return r.set(e,t),this.size+=r.size==a?0:1,this}var n=r(178);e.exports=a},function(e,t,r){"use strict";function a(e){var t=-1,r=Array(e.size);return e.forEach(function(e,a){r[++t]=[a,e]}),r}e.exports=a},function(e,t,r){"use strict";function a(e){var t=n(e,function(e){return r.size===o&&r.clear(),e}),r=t.cache;return t}var n=r(1103),o=500;e.exports=a},function(e,t,r){"use strict";var a=r(401),n=a(Object.keys,Object);e.exports=n},function(e,t,r){"use strict";(function(e){var 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},n=r(394),o="object"==a(t)&&t&&!t.nodeType&&t,i=o&&"object"==a(e)&&e&&!e.nodeType&&e,l=i&&i.exports===o,s=l&&n.process,u=function(){try{return i&&i.require&&i.require("util").types||s&&s.binding&&s.binding("util")}catch(e){}}();e.exports=u}).call(t,r(120)(e))},function(e,t,r){"use strict";function a(e){return o.call(e)}var n=Object.prototype,o=n.toString;e.exports=a},function(e,t,r){"use strict";function a(e){return this.__data__.set(e,n),this}var n="__lodash_hash_undefined__";e.exports=a},function(e,t,r){"use strict";function a(e){return this.__data__.has(e)}e.exports=a},function(e,t,r){"use strict";function a(e){var t=-1,r=Array(e.size);return e.forEach(function(e){r[++t]=e}),r}e.exports=a},function(e,t,r){"use strict";function a(){this.__data__=new n,this.size=0}var n=r(175);e.exports=a},function(e,t,r){"use strict";function a(e){var t=this.__data__,r=t.delete(e);return this.size=t.size,r}e.exports=a},function(e,t,r){"use strict";function a(e){return this.__data__.get(e)}e.exports=a},function(e,t,r){"use strict";function a(e){return this.__data__.has(e)}e.exports=a},function(e,t,r){"use strict";function a(e,t){var r=this.__data__;if(r instanceof n){var a=r.__data__;if(!o||a.length<l-1)return a.push([e,t]),this.size=++r.size,this;r=this.__data__=new i(a)}return r.set(e,t),this.size=r.size,this}var n=r(175),o=r(259),i=r(260),l=200;e.exports=a},function(e,t,r){"use strict";function a(e,t,r){for(var a=r-1,n=e.length;++a<n;)if(e[a]===t)return a;return-1}e.exports=a},function(e,t,r){"use strict";function a(e){return o(e)?i(e):n(e)}var n=r(1015),o=r(396),i=r(1093);e.exports=a},function(e,t,r){"use strict";var a=r(1078),n=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,o=/\\(\\)?/g,i=a(function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(""),e.replace(n,function(e,r,a,n){t.push(a?n.replace(o,"$1"):r||e)}),t});e.exports=i},function(e,t,r){"use strict";function a(e){return e.match(d)||[]}var n="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",o="\\ud83c[\\udffb-\\udfff]",i="(?:\\ud83c[\\udde6-\\uddff]){2}",l="[\\ud800-\\udbff][\\udc00-\\udfff]",s="(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?",u="(?:\\u200d(?:"+["[^\\ud800-\\udfff]",i,l].join("|")+")[\\ufe0e\\ufe0f]?"+s+")*",h="[\\ufe0e\\ufe0f]?"+s+u,c="(?:"+["[^\\ud800-\\udfff]"+n+"?",n,i,l,"[\\ud800-\\udfff]"].join("|")+")",d=RegExp(o+"(?="+o+")|"+c+h,"g");e.exports=a},function(e,t,r){"use strict";function a(e){return e.match(f)||[]}var n="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",o="["+n+"]",i="[a-z\\xdf-\\xf6\\xf8-\\xff]",l="(?:\\ud83c[\\udde6-\\uddff]){2}",s="[\\ud800-\\udbff][\\udc00-\\udfff]",u="[A-Z\\xc0-\\xd6\\xd8-\\xde]",h="(?:"+i+"|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])",c="(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?",d="(?:\\u200d(?:"+["[^\\ud800-\\udfff]",l,s].join("|")+")[\\ufe0e\\ufe0f]?"+c+")*",m="[\\ufe0e\\ufe0f]?"+c+d,p="(?:"+["[\\u2700-\\u27bf]",l,s].join("|")+")"+m,f=RegExp([u+"?"+i+"+(?:['’](?:d|ll|m|re|s|t|ve))?(?="+[o,u,"$"].join("|")+")","(?:[A-Z\\xc0-\\xd6\\xd8-\\xde]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['’](?:D|LL|M|RE|S|T|VE))?(?="+[o,u+h,"$"].join("|")+")",u+"?"+h+"+(?:['’](?:d|ll|m|re|s|t|ve))?",u+"+(?:['’](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])","\\d+",p].join("|"),"g");e.exports=a},function(e,t,r){"use strict";var a=r(1096),n=r(1048),o=n(function(e,t,r){return t=t.toLowerCase(),e+(r?a(t):t)});e.exports=o},function(e,t,r){"use strict";function a(e){return o(n(e).toLowerCase())}var n=r(117),o=r(1111);e.exports=a},function(e,t,r){"use strict";function a(e){return(e=o(e))&&e.replace(i,n).replace(l,"")}var n=r(1049),o=r(117),i=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,l=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g");e.exports=a},function(e,t,r){"use strict";function a(e,t,r){var a=null==e?void 0:n(e,t);return void 0===a?r:a}var n=r(389);e.exports=a},function(e,t,r){"use strict";function a(e,t){return null!=e&&o(e,t,n)}var n=r(1022),o=r(1058);e.exports=a},function(e,t,r){"use strict";function a(e,t,r,a){e=o(e)?e:s(e),r=r&&!a?l(r):0;var h=e.length;return r<0&&(r=u(h+r,0)),i(e)?r<=h&&e.indexOf(t,r)>-1:!!h&&n(e,t,r)>-1}var n=r(1023),o=r(182),i=r(265),l=r(1109),s=r(1112),u=Math.max;e.exports=a},function(e,t,r){"use strict";function a(e){if(null==e)return!0;if(s(e)&&(l(e)||"string"==typeof e||"function"==typeof e.splice||u(e)||c(e)||i(e)))return!e.length;var t=o(e);if(t==d||t==m)return!e.size;if(h(e))return!n(e).length;for(var r in e)if(f.call(e,r))return!1;return!0}var n=r(391),o=r(395),i=r(262),l=r(39),s=r(182),u=r(263),h=r(398),c=r(266),d="[object Map]",m="[object Set]",p=Object.prototype,f=p.hasOwnProperty;e.exports=a},function(e,t,r){"use strict";function a(e){return null==e}e.exports=a},function(e,t,r){"use strict";function a(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new TypeError(o);var r=function r(){var a=arguments,n=t?t.apply(this,a):a[0],o=r.cache;if(o.has(n))return o.get(n);var i=e.apply(this,a);return r.cache=o.set(n,i)||o,i};return r.cache=new(a.Cache||n),r}var n=r(260),o="Expected a function";a.Cache=n,e.exports=a},function(e,t,r){"use strict";function a(e){return i(e)?n(l(e)):o(e)}var n=r(1033),o=r(1034),i=r(261),l=r(180);e.exports=a},function(e,t,r){"use strict";function a(e,t,r){var a=s(e)?n:l,u=arguments.length<3;return a(e,i(t,4),r,u,o)}var n=r(388),o=r(1017),i=r(1030),l=r(1036),s=r(39);e.exports=a},function(e,t,r){"use strict";function a(){return[]}e.exports=a},function(e,t,r){"use strict";function a(){return!1}e.exports=a},function(e,t,r){"use strict";function a(e){return e?(e=n(e))===o||e===-o?(e<0?-1:1)*i:e===e?e:0:0===e?e:0}var n=r(1110),o=1/0,i=1.7976931348623157e308;e.exports=a},function(e,t,r){"use strict";function a(e){var t=n(e),r=t%1;return t===t?r?t-r:t:0}var n=r(1108);e.exports=a},function(e,t,r){"use strict";function a(e){if("number"==typeof e)return e;if(o(e))return i;if(n(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=n(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(l,"");var r=u.test(e);return r||h.test(e)?c(e.slice(2),r?2:8):s.test(e)?i:+e}var n=r(183),o=r(136),i=NaN,l=/^\s+|\s+$/g,s=/^[-+]0x[0-9a-f]+$/i,u=/^0b[01]+$/i,h=/^0o[0-7]+$/i,c=parseInt;e.exports=a},function(e,t,r){"use strict";var a=r(1047),n=a("toUpperCase");e.exports=n},function(e,t,r){"use strict";function a(e){return null==e?[]:n(e,o(e))}var n=r(1041),o=r(185);e.exports=a},function(e,t,r){"use strict";function a(e,t,r){return e=i(e),t=r?void 0:t,void 0===t?o(e)?l(e):n(e):e.match(t)||[]}var n=r(1016),o=r(1059),i=r(117),l=r(1094);e.exports=a},function(e,t,r){"use strict";(function(t){(function(){var r,a,n,o,i,l;"undefined"!=typeof performance&&null!==performance&&performance.now?e.exports=function(){return performance.now()}:void 0!==t&&null!==t&&t.hrtime?(e.exports=function(){return(r()-i)/1e6},a=t.hrtime,r=function(){var e;return e=a(),1e9*e[0]+e[1]},o=r(),l=1e9*t.uptime(),i=o-l):Date.now?(e.exports=function(){return Date.now()-n},n=Date.now()):(e.exports=function(){return(new Date).getTime()-n},n=(new Date).getTime())}).call(void 0)}).call(t,r(404))},function(e,t,r){"use strict";function a(){}var n=r(1116);e.exports=function(){function e(e,t,r,a,o,i){if(i!==n){var l=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");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var r={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t};return r.checkPropTypes=a,r.PropTypes=r,r}},function(e,t,r){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},function(e,t,r){"use strict";function a(e){switch(e.arrayFormat){case"index":return function(t,r,a){return null===r?[o(t,e),"[",a,"]"].join(""):[o(t,e),"[",o(a,e),"]=",o(r,e)].join("")};case"bracket":return function(t,r){return null===r?o(t,e):[o(t,e),"[]=",o(r,e)].join("")};default:return function(t,r){return null===r?o(t,e):[o(t,e),"=",o(r,e)].join("")}}}function n(e){var t;switch(e.arrayFormat){case"index":return function(e,r,a){if(t=/\[(\d*)\]$/.exec(e),e=e.replace(/\[\d*\]$/,""),!t)return void(a[e]=r);void 0===a[e]&&(a[e]={}),a[e][t[1]]=r};case"bracket":return function(e,r,a){return t=/(\[\])$/.exec(e),e=e.replace(/\[\]$/,""),t?void 0===a[e]?void(a[e]=[r]):void(a[e]=[].concat(a[e],r)):void(a[e]=r)};default:return function(e,t,r){if(void 0===r[e])return void(r[e]=t);r[e]=[].concat(r[e],t)}}}function o(e,t){return t.encode?t.strict?s(e):encodeURIComponent(e):e}function i(e){return Array.isArray(e)?e.sort():"object"===(void 0===e?"undefined":l(e))?i(Object.keys(e)).sort(function(e,t){return Number(e)-Number(t)}).map(function(t){return e[t]}):e}var l="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},s=r(1184),u=r(186);t.extract=function(e){return e.split("?")[1]||""},t.parse=function(e,t){t=u({arrayFormat:"none"},t);var r=n(t),a=Object.create(null);return"string"!=typeof e?a:(e=e.trim().replace(/^(\?|#|&)/,""))?(e.split("&").forEach(function(e){var t=e.replace(/\+/g," ").split("="),n=t.shift(),o=t.length>0?t.join("="):void 0;o=void 0===o?null:decodeURIComponent(o),r(decodeURIComponent(n),o,a)}),Object.keys(a).sort().reduce(function(e,t){var r=a[t];return Boolean(r)&&"object"===(void 0===r?"undefined":l(r))&&!Array.isArray(r)?e[t]=i(r):e[t]=r,e},Object.create(null))):a},t.stringify=function(e,t){t=u({encode:!0,strict:!0,arrayFormat:"none"},t);var r=a(t);return e?Object.keys(e).sort().map(function(a){var n=e[a];if(void 0===n)return"";if(null===n)return o(a,t);if(Array.isArray(n)){var i=[];return n.slice().forEach(function(e){void 0!==e&&i.push(r(a,e,i.length))}),i.join("&")}return o(a,t)+"="+o(n,t)}).filter(function(e){return e.length>0}).join("&"):""}},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}var 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};Object.defineProperty(t,"__esModule",{value:!0});var o=r(99),i=a(o),l=r(100),s=a(l),u=r(102),h=a(u),c=r(101),d=a(c),m=r(15),p=a(m),f=r(142),v=a(f),y=r(21),g=a(y),_=r(724),T=a(_),x=r(406),w=a(x),N={enter:"transitionEnter",appear:"transitionAppear",leave:"transitionLeave"},b=function(e){function t(){return(0,i.default)(this,t),(0,h.default)(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return(0,d.default)(t,e),(0,s.default)(t,[{key:"componentWillUnmount",value:function(){this.stop()}},{key:"componentWillEnter",value:function(e){w.default.isEnterSupported(this.props)?this.transition("enter",e):e()}},{key:"componentWillAppear",value:function(e){w.default.isAppearSupported(this.props)?this.transition("appear",e):e()}},{key:"componentWillLeave",value:function(e){w.default.isLeaveSupported(this.props)?this.transition("leave",e):e()}},{key:"transition",value:function(e,t){var r=this,a=v.default.findDOMNode(this),o=this.props,i=o.transitionName,l="object"===(void 0===i?"undefined":n(i));this.stop();var s=function(){r.stopper=null,t()};if((_.isCssAnimationSupported||!o.animation[e])&&i&&o[N[e]]){var u=l?i[e]:i+"-"+e,h=u+"-active";l&&i[e+"Active"]&&(h=i[e+"Active"]),this.stopper=(0,T.default)(a,{name:u,active:h},s)}else this.stopper=o.animation[e](a,s)}},{key:"stop",value:function(){var e=this.stopper;e&&(this.stopper=null,e.stop())}},{key:"render",value:function(){return this.props.children}}]),t}(p.default.Component);b.propTypes={children:g.default.any},t.default=b,e.exports=t.default},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function n(e){function t(t){return!(!t.motionName||!e)}var r=function(e){function r(){(0,c.default)(this,r);var e=(0,f.default)(this,(r.__proto__||Object.getPrototypeOf(r)).call(this));return e.onDomUpdate=function(){var r=e.state,a=r.status,n=r.newStatus,o=e.props,i=o.onAppearStart,l=o.onEnterStart,s=o.onLeaveStart,u=o.onAppearActive,h=o.onEnterActive,c=o.onLeaveActive,d=o.motionAppear,m=o.motionEnter,p=o.motionLeave;if(t(e.props)){var f=x.default.findDOMNode(e);e.$ele!==f&&(e.removeEventListener(e.$ele),e.addEventListener(f),e.$ele=f),n&&a===I&&d?e.updateStatus(i,null,null,function(){e.updateActiveStatus(u,I)}):n&&a===z&&m?e.updateStatus(l,null,null,function(){e.updateActiveStatus(h,z)}):n&&a===C&&p&&e.updateStatus(s,null,null,function(){e.updateActiveStatus(c,C)})}},e.onMotionEnd=function(t){var r=e.state,a=r.status,n=r.statusActive,o=e.props,i=o.onAppearEnd,l=o.onEnterEnd,s=o.onLeaveEnd;a===I&&n?e.updateStatus(i,{status:A},t):a===z&&n?e.updateStatus(l,{status:A},t):a===C&&n&&e.updateStatus(s,{status:A},t)},e.addEventListener=function(t){t&&(t.addEventListener(M.transitionEndName,e.onMotionEnd),t.addEventListener(M.animationEndName,e.onMotionEnd))},e.removeEventListener=function(t){t&&(t.removeEventListener(M.transitionEndName,e.onMotionEnd),t.removeEventListener(M.animationEndName,e.onMotionEnd))},e.updateStatus=function(t,r,a,n){var i=t?t(x.default.findDOMNode(e),a):null;if(!1!==i&&!e._destroyed){var l=void 0;n&&(l=function(){e.nextFrame(n)}),e.setState((0,u.default)({statusStyle:"object"===(void 0===i?"undefined":o(i))?i:null,newStatus:!1},r),l)}},e.updateActiveStatus=function(t,r){e.nextFrame(function(){e.state.status===r&&e.updateStatus(t,{statusActive:!0})})},e.nextFrame=function(t){e.cancelNextFrame(),e.raf=(0,D.default)(t)},e.cancelNextFrame=function(){e.raf&&(D.default.cancel(e.raf),e.raf=null)},e.state={status:A,statusActive:!1,newStatus:!1,statusStyle:null},e.$ele=null,e.raf=null,e}return(0,y.default)(r,e),(0,m.default)(r,[{key:"componentDidMount",value:function(){this.onDomUpdate()}},{key:"componentDidUpdate",value:function(){this.onDomUpdate()}},{key:"componentWillUnmount",value:function(){this._destroyed=!0,this.removeEventListener(this.$ele),this.cancelNextFrame()}},{key:"render",value:function(){var e,r=this.state,a=r.status,n=r.statusActive,o=r.statusStyle,i=this.props,s=i.children,u=i.motionName,h=i.visible,c=i.removeOnLeave;return s?a!==A&&t(this.props)?s({className:(0,S.default)((e={},(0,l.default)(e,(0,M.getTransitionName)(u,a),a!==A),(0,l.default)(e,(0,M.getTransitionName)(u,a+"-active"),a!==A&&n),(0,l.default)(e,u,"string"==typeof u),e)),style:o}):h||!c?s({}):null:null}}],[{key:"getDerivedStateFromProps",value:function(e,r){var a=r.prevProps;if(!t(e))return{};var n=e.visible,o=e.motionAppear,i=e.motionEnter,l=e.motionLeave,s=e.motionLeaveImmediately,u={prevProps:e};return!a&&n&&o&&(u.status=I,u.statusActive=!1,u.newStatus=!0),a&&!a.visible&&n&&i&&(u.status=z,u.statusActive=!1,u.newStatus=!0),(a&&a.visible&&!n&&l||!a&&s&&!n&&l)&&(u.status=C,u.statusActive=!1,u.newStatus=!0),u}}]),r}(_.default.Component);return r.propTypes={visible:N.default.bool,children:N.default.func,motionName:N.default.oneOfType([N.default.string,N.default.object]),motionAppear:N.default.bool,motionEnter:N.default.bool,motionLeave:N.default.bool,motionLeaveImmediately:N.default.bool,removeOnLeave:N.default.bool,onAppearStart:N.default.func,onAppearActive:N.default.func,onAppearEnd:N.default.func,onEnterStart:N.default.func,onEnterActive:N.default.func,onEnterEnd:N.default.func,onLeaveStart:N.default.func,onLeaveActive:N.default.func,onLeaveEnd:N.default.func},r.defaultProps={visible:!0,motionEnter:!0,motionAppear:!0,motionLeave:!0,removeOnLeave:!0},(0,b.polyfill)(r),r}var o="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};Object.defineProperty(t,"__esModule",{value:!0});var i=r(282),l=a(i),s=r(76),u=a(s),h=r(99),c=a(h),d=r(100),m=a(d),p=r(102),f=a(p),v=r(101),y=a(v);t.genCSSMotion=n;var g=r(15),_=a(g),T=r(142),x=a(T),w=r(21),N=a(w),b=r(1139),L=r(479),S=a(L),k=r(405),D=a(k),M=r(1121),A="none",I="appear",z="enter",C="leave";t.default=n(M.supportTransition)},function(e,t,r){"use strict";function a(e){var t=[];return h.default.Children.forEach(e,function(e){t.push(e)}),t}function n(e,t){var r=null;return e&&e.forEach(function(e){r||e&&e.key===t&&(r=e)}),r}function o(e,t,r){var a=null;return e&&e.forEach(function(e){if(e&&e.key===t&&e.props[r]){if(a)throw new Error("two child with same key for <rc-animate> children");a=e}}),a}function i(e,t,r){var a=0;return e&&e.forEach(function(e){a||(a=e&&e.key===t&&!e.props[r])}),a}function l(e,t,r){var a=e.length===t.length;return a&&e.forEach(function(e,n){var o=t[n];e&&o&&(e&&!o||!e&&o?a=!1:e.key!==o.key?a=!1:r&&e.props[r]!==o.props[r]&&(a=!1))}),a}function s(e,t){var r=[],a={},o=[];return e.forEach(function(e){e&&n(t,e.key)?o.length&&(a[e.key]=o,o=[]):o.push(e)}),t.forEach(function(e){e&&Object.prototype.hasOwnProperty.call(a,e.key)&&(r=r.concat(a[e.key])),r.push(e)}),r=r.concat(o)}Object.defineProperty(t,"__esModule",{value:!0}),t.toArrayChildren=a,t.findChildInChildrenByKey=n,t.findShownChildInChildrenByKey=o,t.findHiddenChildInChildrenByKey=i,t.isSameChildren=l,t.mergeChildren=s;var u=r(15),h=function(e){return e&&e.__esModule?e:{default:e}}(u)},function(e,t,r){"use strict";function a(e,t){var r={};return r[e.toLowerCase()]=t.toLowerCase(),r["Webkit"+e]="webkit"+t,r["Moz"+e]="moz"+t,r["ms"+e]="MS"+t,r["O"+e]="o"+t.toLowerCase(),r}function n(e,t){var r={animationend:a("Animation","AnimationEnd"),transitionend:a("Transition","TransitionEnd")};return e&&("AnimationEvent"in t||delete r.animationend.animation,"TransitionEvent"in t||delete r.transitionend.transition),r}function o(e){if(c[e])return c[e];var t=u[e];if(t)for(var r=Object.keys(t),a=r.length,n=0;n<a;n+=1){var o=r[n];if(Object.prototype.hasOwnProperty.call(t,o)&&o in h)return c[e]=t[o],c[e]}return""}function i(e,t){return e?"object"===(void 0===e?"undefined":l(e))?e[t.replace(/-\w/g,function(e){return e[1].toUpperCase()})]:e+"-"+t:null}var l="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};Object.defineProperty(t,"__esModule",{value:!0}),t.getVendorPrefixes=n,t.getVendorPrefixedEventName=o,t.getTransitionName=i;var s=!("undefined"==typeof window||!window.document||!window.document.createElement),u=n(s,"undefined"!=typeof window?window:{}),h={};s&&(h=document.createElement("div").style);var c={},d=t.animationEndName=o("animationend"),m=t.transitionEndName=o("transitionend");t.supportTransition=!(!d||!m)},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var n=r(76),o=a(n),i=r(477),l=a(i),s=r(478),u=a(s),h=r(99),c=a(h),d=r(100),m=a(d),p=r(102),f=a(p),v=r(101),y=a(v),g=r(15),_=a(g),T=r(21),x=a(T),w=r(1127),N=a(w),b=r(1124),L=r(1123),S=a(L),k=function(){},D=["displayName","propTypes","getDefaultProps","defaultProps","childContextTypes","contextTypes"],M=function(e){function t(e){(0,c.default)(this,t);var r=(0,f.default)(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));A.call(r),r.oneEnter=!1,r.tweenToEnter={},r.leaveUnfinishedChild=[],r.saveTweenOneTag={},r.unwantedStart={},r.keysToEnter=[],r.keysToLeave=[],r.keysToEnterPaused={},r.placeholderTimeoutIds={};var a=(0,b.toArrayChildren)((0,b.getChildrenFromProps)(e)),n={};return a.forEach(function(e){e&&e.key&&(r.props.appear?r.keysToEnter.push(e.key):n[e.key]=!0)}),r.keysToEnterToCallback=[].concat((0,u.default)(r.keysToEnter)),r.originalChildren=(0,b.toArrayChildren)((0,b.getChildrenFromProps)(e)),r.state={children:a,childrenShow:n},r}return(0,y.default)(t,e),(0,m.default)(t,[{key:"componentDidMount",value:function(){this.props.appear&&this.componentDidUpdate(),this.oneEnter=!0}},{key:"componentWillReceiveProps",value:function(e){var t=this,r=(0,b.toArrayChildren)(e.children).filter(function(e){return e}),a=this.originalChildren.filter(function(e){return e});if(this.state.children.length){var n=this.state.children.filter(function(e){return e&&t.keysToLeave.indexOf(e.key)>=0});this.leaveUnfinishedChild=n.map(function(e){return e.key});var o=(0,b.mergeChildren)(a,this.state.children),i=[],l=function(e){e.forEach(function(e){var t=o.indexOf(e);-1===t?i.push(e):i.splice(t,0,e)})};l(n),l(a),a=i.filter(function(e){return e})}var s=(0,b.mergeChildren)(a,r),h=s.length?this.state.childrenShow:{};if(this.keysToEnterPaused={},!(!r.length&&!a.length&&this.state.children.length)){var c=r.map(function(e){return e.key});this.keysToLeave.forEach(function(r){c.indexOf(r)>=0&&(t.keysToEnterPaused[r]=!0,a=a.filter(function(e){return e.key!==r}),e.forcedReplay&&delete h[r])})}this.keysToEnter=[],this.keysToLeave=[],this.setState({childrenShow:h,children:s}),r.forEach(function(e){if(e){var r=e.key;!(0,b.findChildInChildrenByKey)(a,r)&&r&&t.keysToEnter.push(r)}}),a.forEach(function(e){if(e){var a=e.key;!(0,b.findChildInChildrenByKey)(r,a)&&a&&t.keysToLeave.push(a)}}),this.keysToEnterToCallback=[].concat((0,u.default)(this.keysToEnter))}},{key:"componentDidUpdate",value:function(){this.originalChildren=(0,b.toArrayChildren)((0,b.getChildrenFromProps)(this.props));var e=[].concat((0,u.default)(this.keysToEnter)),t=[].concat((0,u.default)(this.keysToLeave));e.forEach(this.performEnter),t.forEach(this.performLeave)}},{key:"componentWillUnmount",value:function(){var e=this;Object.keys(this.placeholderTimeoutIds).forEach(function(t){w.ticker.clear(e.placeholderTimeoutIds[t])}),this.keysToEnter=[],this.keysToLeave=[]}},{key:"getTweenType",value:function(e,t){var r=S.default[e];return this.getTweenAnimConfig(r,t)}},{key:"getTweenAnimConfig",value:function(e,t,r){var a=this;return Array.isArray(e)?e.map(function(e){return a.getTweenSingleConfig(e,t,r)}):this.getTweenSingleConfig(e,t,r)}},{key:"render",value:function(){var e=(0,l.default)(this.props,[]);["component","componentProps","interval","duration","delay","type","animConfig","ease","leaveReverse","animatingClassName","forcedReplay","onEnd","appear"].forEach(function(t){return delete e[t]});var t=(0,b.toArrayChildren)(this.state.children).map(this.getChildrenToRender),r=(0,o.default)({},e,this.props.componentProps);return(0,g.createElement)(this.props.component,r,t)}}]),t}(_.default.Component);M.propTypes={children:x.default.any,component:x.default.any,componentProps:x.default.object,interval:x.default.any,duration:x.default.any,delay:x.default.any,type:x.default.any,animConfig:x.default.any,ease:x.default.any,leaveReverse:x.default.bool,forcedReplay:x.default.bool,animatingClassName:x.default.array,onEnd:x.default.func,appear:x.default.bool},M.defaultProps={component:"div",componentProps:{},interval:100,duration:450,delay:0,type:"right",animConfig:null,ease:"easeOutQuart",leaveReverse:!1,forcedReplay:!1,animatingClassName:["queue-anim-entering","queue-anim-leaving"],onEnd:k,appear:!0};var A=function(){var e=this;this.getTweenSingleConfig=function(e,t,r){var a={};return Object.keys(e).forEach(function(n){Array.isArray(e[n])?a[n]=e[n][t]:(!r&&!t||r&&t)&&(a[n]=e[n])}),a},this.getTweenData=function(t,r,a){var n=e.props,o="enter"===a?0:1,i="enter"===a?1:0,l="enter"===a?0:1,s=e.getAnimData(n,t,r,o,i),u=e.getAnimData(n,t,r,o,l);s="enter"!==a||!n.forcedReplay&&e.unwantedStart[t]?null:s;var h=(0,b.transformArguments)(n.ease,t,r)[o],c=(0,b.transformArguments)(n.duration,t,r)[o];return Array.isArray(h)&&(h=h.map(function(e){return 100*e}),h=N.default.easing.path("M0,100C"+h[0]+","+(100-h[1])+","+h[2]+","+(100-h[3])+",100,0",{lengthPixel:c/16.6667})),{startAnim:s,animate:u,ease:h,duration:c,isArray:Array.isArray(u)}},this.getTweenSingleData=function(e,t,r,a,n,i,l,s){var u=Object.keys(t||{}).length;return{animation:(0,o.default)({onStart:l,onComplete:s,duration:n,delay:i,ease:a},r),startAnimate:u?(0,o.default)({duration:0},t):null}},this.getTweenEnterOrLeaveData=function(t,r,a,n){var o=e.getTweenData(t,r,n),i=o.startAnim,l=o.animate,s=("enter"===n?e.enterBegin:e.leaveBegin).bind(e,t),u=("enter"===n?e.enterComplete:e.leaveComplete).bind(e,t);if(o.isArray){var h=l.length-1,c=[],d=[];return l.forEach(function(r,n){var l=i&&i[n],m=e.getTweenSingleData(t,l,r,o.ease,o.duration/h,n?0:a,n?null:s,n===h?u:null);c.push(m.animation),m.startAnimate&&d.push(m.startAnimate)}),d.concat(c)}return o=e.getTweenSingleData(t,i,l,o.ease,o.duration,a,s,u),[o.startAnimate,o.animation].filter(function(e){return e})},this.getTweenAppearData=function(t,r){return(0,o.default)({},e.getAnimData(e.props,t,r,0,0),{duration:0})},this.getAnimData=function(t,r,a,n,o){return t.animConfig?e.getTweenAnimConfig((0,b.transformArguments)(t.animConfig,r,a)[n],o,n):e.getTweenType((0,b.transformArguments)(t.type,r,a)[n],o)},this.getChildrenToRender=function(t){var r=e.props,a=r.forcedReplay,n=r.leaveReverse,o=r.appear,i=r.delay,l=r.interval;if(!t||!t.key)return t;var s=t.key;if(!e.state.childrenShow[s])return null;var u=e.keysToLeave.indexOf(s),h=void 0,c="function"==typeof t.type,d=c?{}:null;if(c&&Object.keys(t.type).forEach(function(e){-1===D.indexOf(e)&&(d[e]=t.type[e])}),u>=0){if(e.leaveUnfinishedChild.indexOf(s)>=0)return e.saveTweenOneTag[s];var m=(0,b.transformArguments)(l,s,u)[1],p=(0,b.transformArguments)(i,s,u)[1];p=m*((n?e.keysToLeave.length-u-1:u)-e.leaveUnfinishedChild.length)+p,h=e.getTweenEnterOrLeaveData(s,u,p,"leave")}else if(u=e.keysToEnterToCallback.indexOf(s),h=e.oneEnter||o?e.getTweenEnterOrLeaveData(s,u,0,"enter"):e.getTweenAppearData(s,u),e.tweenToEnter[s]&&!a)return(0,g.createElement)(N.default,{key:s,component:t.type,forcedJudg:d,componentProps:t.props});h=e.keysToEnterPaused[s]&&!e.keysToLeave.indexOf(s)>=0?null:h;var f=(0,g.createElement)(N.default,{key:s,component:t.type,forcedJudg:d,componentProps:t.props,animation:h});return e.saveTweenOneTag[s]=f,f},this.performEnter=function(t,r){var a=(0,b.transformArguments)(e.props.interval,t,r)[0],n=(0,b.transformArguments)(e.props.delay,t,r)[0];e.placeholderTimeoutIds[t]=w.ticker.timeout(e.performEnterBegin.bind(e,t),a*r+n),e.keysToEnter.indexOf(t)>=0&&e.keysToEnter.splice(e.keysToEnter.indexOf(t),1)},this.performEnterBegin=function(t){var r=e.state.childrenShow;r[t]=!0,delete e.keysToEnterPaused[t],w.ticker.clear(e.placeholderTimeoutIds[t]),delete e.placeholderTimeoutIds[t],e.setState({childrenShow:r})},this.performLeave=function(t){w.ticker.clear(e.placeholderTimeoutIds[t]),delete e.placeholderTimeoutIds[t]},this.enterBegin=function(t,r){var a=r.target,n=e.props.animatingClassName;a.className=a.className.replace(n[1],""),-1===a.className.indexOf(n[0])&&(a.className=(a.className+" "+n[0]).trim())},this.enterComplete=function(t,r){if(!(e.keysToEnterPaused[t]||e.keysToLeave.indexOf(t)>=0)){var a=r.target;a.className=a.className.replace(e.props.animatingClassName[0],"").trim(),e.tweenToEnter[t]=!0,e.unwantedStart[t]=!0,e.props.onEnd({key:t,type:"enter"})}},this.leaveBegin=function(t,r){var a=r.target,n=e.props.animatingClassName;a.className=a.className.replace(n[0],""),-1===a.className.indexOf(n[1])&&(a.className=(a.className+" "+n[1]).trim()),e.unwantedStart[t]=!0,delete e.tweenToEnter[t]},this.leaveComplete=function(t,r){if(!(e.keysToEnterToCallback.indexOf(t)>=0)){var a=e.state.childrenShow;if(delete a[t],delete e.saveTweenOneTag[t],delete e.unwantedStart[t],e.keysToLeave.indexOf(t)>=0&&e.keysToLeave.splice(e.keysToLeave.indexOf(t),1),!e.keysToLeave.some(function(e){return a[e]})){var n=(0,b.toArrayChildren)((0,b.getChildrenFromProps)(e.props));e.setState({children:n,childrenShow:a})}var o=r.target;o.className=o.className.replace(e.props.animatingClassName[1],"").trim(),e.props.onEnd({key:t,type:"leave"})}}};M.isQueueAnim=!0,t.default=M,e.exports=t.default},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={left:{opacity:[1,0],translateX:[0,-30]},top:{opacity:[1,0],translateY:[0,-30]},right:{opacity:[1,0],translateX:[0,30]},bottom:{opacity:[1,0],translateY:[0,30]},alpha:{opacity:[1,0]},scale:{opacity:[1,0],scale:[1,0]},scaleBig:{opacity:[1,0],scale:[1,2]},scaleX:{opacity:[1,0],scaleX:[1,0]},scaleY:{opacity:[1,0],scaleY:[1,0]}},e.exports=t.default},function(e,t,r){"use strict";function a(e){var t=[];return u.default.Children.forEach(e,function(e){t.push(e)}),t}function n(e,t){var r=null;return e&&e.forEach(function(e){!r&&e&&e.key===t&&(r=e)}),r}function o(e,t){var r=[],a={},o=[],i=void 0;return e.forEach(function(e){e&&(n(t,e.key)?(o.length&&(a[e.key]=o,o=[]),i=e.key):e.key&&o.push(e))}),i||(r=r.concat(o)),t.forEach(function(e){e&&(a.hasOwnProperty(e.key)&&(r=r.concat(a[e.key])),r.push(e),e.key===i&&(r=r.concat(o)))}),r}function i(e,t,r){var a=void 0;return a="function"==typeof e?e({key:t,index:r}):e,Array.isArray(a)?2===a.length?a:[a[0],a[0]]:[a,a]}function l(e){return e&&e.children}Object.defineProperty(t,"__esModule",{value:!0}),t.toArrayChildren=a,t.findChildInChildrenByKey=n,t.mergeChildren=o,t.transformArguments=i,t.getChildrenFromProps=l;var s=r(15),u=function(e){return e&&e.__esModule?e:{default:e}}(s)},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function n(){}function o(e,t){var r=e.duration||0===e.duration?e.duration:y;return{duration:"set"===e.type?0:r,delay:e.delay||g,ease:"function"==typeof e.ease?e.ease:h.default[e.ease||v],onUpdate:e.onUpdate||n,onComplete:e.onComplete||n,onStart:e.onStart||n,onRepeat:e.onRepeat||n,repeat:e.repeat||0,repeatDelay:e.repeatDelay||0,yoyo:e.yoyo||!1,type:"from"===e.type?"from":"to",initTime:t,appearTo:"number"==typeof e.appearTo?e.appearTo:null,perTime:0,currentRepeat:0}}Object.defineProperty(t,"__esModule",{value:!0});var i=r(76),l=a(i),s=r(433),u=r(408),h=a(u),c=r(267),d=a(c),m=r(1128),p=a(m),f=r(137),v="easeInOutQuad",y=450,g=0;d.default.push(p.default);var _=function(e,t,r){this.target=e,this.attr=r.attr||"style",this.accuracy=1e-5,this.totalTime=0,this.progressTime=0,this.defaultData=[],this.start={},this.startDefaultData={},this.tween={},this.data=t,this.perFrame=Math.round(1e3/60),this.register=!1,this.isSvg=this.target.ownerSVGElement;var a=this.setAttrIsStyle();this.setDefaultData(a)},T=_.prototype;T.setAttrIsStyle=function(){var e=this,t=[];return this.data.forEach(function(r,a){var n=(0,l.default)({},r);"style"===e.attr?(t[a]={},Object.keys(n).forEach(function(e){e in o({},0)&&(t[a][e]=n[e],delete n[e])}),t[a].style=n,e.startDefaultData.style=e.target.getAttribute("style")):"attr"===e.attr&&(Object.keys(n).forEach(function(t){if("style"===t&&Array.isArray(r[t]))throw new Error("Style should be the object.");"bezier"===t?(n.style=(0,l.default)({},n.style,{bezier:n[t]}),delete n[t],e.startDefaultData.style=e.target.getAttribute("style")):e.startDefaultData[t]=e.target.getAttribute(t)}),t[a]=n)}),t},T.setDefaultData=function(e){var t=this,r=0,a=!1,n=e.map(function(e){var n="number"==typeof e.appearTo;n||(r+=e.delay||0);var i=(e.appearTo||0)+(e.delay||0),l=o(e,n?i:r);l.vars={},Object.keys(e).forEach(function(r){if(!(r in l)){var a=e[r];if(r in d.default)l.vars[r]=new d.default[r](t.target,a,l.type);else if(r.match(/color/i)||"stroke"===r||"fill"===r)l.vars[r]={type:"color",vars:(0,s.parseColor)(a)};else if("number"==typeof a||a.split(/[,|\s]/g).length<=1){var n=parseFloat(a),o=a.toString().replace(/[^a-z|%]/g,""),i=a.toString().replace(/[^+|=|-]/g,"");l.vars[r]={unit:o,vars:n,count:i}}else("d"===r||"points"===r)&&"SVGMorph"in d.default&&(l.vars[r]=new d.default.SVGMorph(t.target,a,r))}}),l.yoyo&&!l.repeat&&console.warn("Warning: yoyo must be used together with repeat;"),-1===l.repeat&&(a=!0);var u=-1===l.repeat?0:l.repeat;if(n){var h=e.appearTo+(e.delay||0)+l.duration*(u+1)+l.repeatDelay*u;r=h>=r?h:r}else l.delay<-l.duration?r-=l.delay:r+=l.duration*(u+1)+l.repeatDelay*u;return l.mode="",l});this.totalTime=a?Number.MAX_VALUE:r,this.defaultData=n},T.getComputedStyle=function(){var e="undefined"!=typeof window&&document.defaultView?document.defaultView.getComputedStyle(this.target):{};if(this.isSvg){var t=e[(0,s.checkStyleName)("transform")]||"none";if("none"===t){var r=this.target.getAttribute("style");r&&r.indexOf("transform:")>=0?t=r.split(";").filter(function(e){return e.indexOf("transform:")>=0}).map(function(e){return(0,s.createMatrix)(e.split(":")[1].trim()).toString()})[0]:this.target.getAttribute("transform")&&console.warn("Do not add transform on the label, otherwise it will be invalid.")}e.transformSVG=t}return e},T.getAnimStartData=function(e){var t=this,r={};return Object.keys(e).forEach(function(a){if(a in d.default||"attr"===t.attr&&("d"===a||"points"===a))return t.computedStyle=t.computedStyle||t.getComputedStyle(),void(r[a]=e[a].getAnimStart(t.computedStyle,t.tween,t.isSvg));if("attr"!==t.attr)r[a]=t.target[a]||0;else{var n=t.target.getAttribute(a),o="null"!==n&&n?n:0;if(a.match(/color/i)||"stroke"===a||"fill"===a)o=o||"stroke"!==a?o:"rgba(255, 255, 255, 0)",o=(0,s.parseColor)(o),r[a]=o;else if(parseFloat(o)||0===parseFloat(o)||0===o){var i=o.toString().replace(/[^a-z|%]/g,"");r[a]=i!==e[a].unit?(0,f.startConvertToEndUnit)(t.target,a,parseFloat(o),i,e[a].unit):parseFloat(o)}}}),r},T.setAnimData=function(e){var t=this;Object.keys(e).forEach(function(r){r in d.default||"attr"===t.attr&&("d"===r||"points"===r)||(t.target[r]=e[r])})},T.setRatio=function(e,t,r){var a=this;Object.keys(t.vars).forEach(function(n){if(n in d.default||"attr"===a.attr&&("d"===n||"points"===n))return void t.vars[n].setRatio(e,a.tween,a.isSvg&&a.computedStyle);var o=t.vars[n],i=a.start[r][n],l=void 0;"attr"===a.attr&&(o.type?"color"===o.type&&(3===o.vars.length&&4===i.length&&(o.vars[3]=1),l=o.vars.map(function(t,r){var a=i[r]||0;return(t-a)*e+a}),a.target.setAttribute(n,(0,s.getColor)(l))):(l="="===o.unit.charAt(1)?i+o.vars*e+o.unit:(o.vars-i)*e+i+o.unit,a.target.setAttribute(n,l)))}),this.setAnimData(this.tween)},T.render=function(){var e=this,t=this.reverse;this.defaultData.forEach(function(r,a){var n=r.initTime,o=(0,s.toFixed)(r.duration),i=Math.ceil((e.progressTime-n)/(o+r.repeatDelay))-1||0;if(i=i<0?0:i,r.repeat){if(r.repeat<i&&-1!==r.repeat)return;(r.repeat||r.repeat<=i)&&(n+=i*(o+r.repeatDelay))}var u=r.yoyo&&i%2?1:0,h=r.yoyo&&i%2?0:1;u="from"===r.type?1-u:u,h="from"===r.type?1-h:h;var c=(0,s.toFixed)(e.progressTime-n),d=void 0;if(!(c+("from"===r.type?r.delay:0)>=0&&!e.start[a]&&(e.start[a]=e.getAnimStartData(r.vars),c<e.perFrame?(d=r.duration||r.delay?r.ease(0,u,h,1):r.ease(1,u,h,1),e.setRatio(d,r,a)):c>o&&(d=r.ease(1,u,h,1),e.setRatio(d,r,a)),(!e.register||a&&!n)&&(e.register=!0,0===c&&r.duration&&r.delay)))){var m={index:a,target:e.target},p=(0,l.default)({moment:e.progressTime},m),f=e.perFrame-e.accuracy,v=r.delay&&t?-f:0;if(c>=v&&!(c>o&&"onComplete"===r.mode)&&e.start[a]){var y="update"===e.updateAnim;if(((c=c<f&&!t&&r.duration>=e.perFrame?0:c)>=o-e.accuracy&&!t||t&&c<=0)&&i>=r.repeat){if("onComplete"===r.mode)return;if(d=r.ease(t?0:1,u,h,1),e.setRatio(d,r,a,r.currentRepeat!==i),r.reset||y){if(c>=o+f)return}else o<f&&(o||(r.onStart(m),p.mode="onStart",e.onChange(p)),r.onUpdate((0,l.default)({ratio:d},m)),p.mode="onUpdate",e.onChange(p)),r.onComplete(m);r.mode="onComplete"}else if(o>f){var g=c<0?0:c;g=g>o?o:g,d=r.ease(g,u,h,o),e.setRatio(d,r,a),y||(r.repeat&&i>0&&r.currentRepeat!==i?(r.mode="onRepeat",r.currentRepeat=i,r.onRepeat((0,l.default)({},m,{repeatNum:i}))):("number"!=typeof r.perTime||c>=v&&c<=f||t&&r.perTime>=e.reverseStartTime-n)&&"onStart"!==r.mode?(r.mode="onStart",r.onStart(m)):(r.mode="onUpdate",r.onUpdate((0,l.default)({ratio:d},m))))}y||(p.mode=r.mode,e.onChange(p)),r.perTime=c,r.reset&&delete r.reset}}})},T.frame=function(e){var t=this;this.progressTime=e,this.defaultData.forEach(function(e){var r=t.progressTime-e.duration-e.initTime;r<t.perFrame&&r>0&&(t.progressTime=e.duration+e.initTime)}),this.render()},T.resetAnimData=function(){this.tween={},this.start={}},T.resetDefaultStyle=function(){var e=this;this.tween={},this.defaultData=this.defaultData.map(function(e){return e.reset=!0,delete e.mode,e}),Object.keys(this.startDefaultData).forEach(function(t){t in o({},0)||e.target.setAttribute(t,e.startDefaultData[t])})},T.reStart=function(e){var t=this;this.start={},this.target.style.cssText="",Object.keys(e||{}).forEach(function(r){t.target.style[r]=(0,s.stylesToCss)(r,e[r])}),this.setAttrIsStyle(),this.resetDefaultStyle()},T.onChange=n,t.default=_,e.exports=t.default},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function n(){}var o="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};Object.defineProperty(t,"__esModule",{value:!0});var i=r(76),l=a(i),s=r(99),u=a(s),h=r(100),c=a(h),d=r(102),m=a(d),p=r(101),f=a(p),v=r(15),y=a(v),g=r(21),_=a(g),T=r(407),x=a(T),w=r(137),N=function(e){function t(e){(0,u.default)(this,t);var r=(0,m.default)(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));b.call(r),r.keysToEnter=[],r.keysToLeave=[],r.saveTweenTag={},r.onEnterBool=!1,r.animQueue=[],r.isTween={};var a=(0,w.toArrayChildren)((0,w.getChildrenFromProps)(r.props));return r.originalChildren=(0,w.toArrayChildren)((0,w.getChildrenFromProps)(r.props)),r.currentChildren=(0,w.toArrayChildren)((0,w.getChildrenFromProps)(r.props)),r.state={children:a},r}return(0,f.default)(t,e),(0,c.default)(t,[{key:"componentDidMount",value:function(){this.onEnterBool=!0}},{key:"componentWillReceiveProps",value:function(e){var t=(0,w.toArrayChildren)(e.children);if(Object.keys(this.isTween).length&&!e.exclusive)return void this.animQueue.push(t);var r=(0,w.toArrayChildren)(e.exclusive?this.originalChildren:this.state.children);this.changeChildren(t,r)}},{key:"componentDidUpdate",value:function(){this.originalChildren=(0,w.toArrayChildren)((0,w.getChildrenFromProps)(this.props))}},{key:"changeChildren",value:function(e,t){var r=this,a=(0,w.mergeChildren)(t,e);this.keysToEnter=[],this.keysToLeave=[],e.forEach(function(e){if(e){var a=e.key,n=(0,w.findChildInChildrenByKey)(t,a);r.saveTweenTag[a]&&(r.saveTweenTag[a]=y.default.cloneElement(r.saveTweenTag[a],{},e)),!n&&a&&r.keysToEnter.push(a)}}),t.forEach(function(t){if(t){var a=t.key;!(0,w.findChildInChildrenByKey)(e,a)&&a&&(r.keysToLeave.push(a),delete r.saveTweenTag[a])}}),this.currentChildren=a,this.setState({children:a})}},{key:"render",value:function(){var e=this.getChildrenToRender(this.state.children);if(!this.props.component)return e[0]||null;var t=(0,l.default)({},this.props);return["component","componentProps","appear","enter","leave","animatingClassName","onEnd","exclusive"].forEach(function(e){return delete t[e]}),(0,v.createElement)(this.props.component,(0,l.default)({},t,this.props.componentProps),e)}}]),t}(v.Component),b=function(){var e=this;this.onChange=function(t,r,a,n){var i=(0,w.dataToArray)(t).length,l=n.target,s="object"===o(l.className)&&"baseVal"in l.className,u="enter"===a||"appear"===a;if("onStart"===n.mode)s?l.className.baseVal=e.setClassName(l.className.baseVal,u):l.className=e.setClassName(l.className,u);else if(n.index===i-1&&"onComplete"===n.mode){if(delete e.isTween[r],s?l.className.baseVal=l.className.baseVal.replace(e.props.animatingClassName[u?0:1],"").trim():l.className=l.className.replace(e.props.animatingClassName[u?0:1],"").trim(),"enter"===a)e.keysToEnter.splice(e.keysToEnter.indexOf(r),1),e.keysToEnter.length||e.reAnimQueue();else if("leave"===a&&(e.keysToLeave.splice(e.keysToLeave.indexOf(r),1),e.currentChildren=e.currentChildren.filter(function(e){return r!==e.key}),!e.keysToLeave.length)){var h=e.currentChildren.map(function(e){return e.key});Object.keys(e.saveTweenTag).forEach(function(t){-1===h.indexOf(t)&&delete e.saveTweenTag[t]}),e.setState({children:e.currentChildren},e.reAnimQueue)}var c={key:r,type:a};e.props.onEnd(c)}},this.setClassName=function(t,r){var a=t.replace(e.props.animatingClassName[r?1:0],"").trim();return-1===a.indexOf(e.props.animatingClassName[r?0:1])&&(a=(a+" "+e.props.animatingClassName[r?0:1]).trim()),a},this.getTweenChild=function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=t.key;return e.saveTweenTag[a]=y.default.createElement(x.default,(0,l.default)({},r,{key:a,component:null}),t),e.saveTweenTag[a]},this.getCoverAnimation=function(t,r,a){var n=void 0;n="leave"===a?e.props.leave:e.props.enter,"appear"===a&&(n=(0,w.transformArguments)(e.props.appear,t.key,r)&&e.props.enter||null);var o=(0,w.transformArguments)(n,t.key,r),i=e.onChange.bind(e,o,t.key,a),l={key:t.key,animation:o,onChange:i,resetStyle:e.props.exclusive};return(e.keysToEnter.concat(e.keysToLeave).indexOf(t.key)>=0||!e.onEnterBool&&n)&&(e.saveTweenTag[t.key]||(e.isTween[t.key]=a)),e.getTweenChild(t,l)},this.getChildrenToRender=function(t){return t.map(function(t,r){if(!t||!t.key)return t;var a=t.key;return e.keysToLeave.indexOf(a)>=0?e.getCoverAnimation(t,r,"leave"):!(e.keysToEnter.indexOf(a)>=0||e.isTween[a]&&-1===e.keysToLeave.indexOf(a))||"enter"===e.isTween[a]&&e.saveTweenTag[a]?e.onEnterBool?e.saveTweenTag[a]:e.getCoverAnimation(t,r,"appear"):e.getCoverAnimation(t,r,"enter")})},this.reAnimQueue=function(){!Object.keys(e.isTween).length&&e.animQueue.length&&(e.changeChildren(e.animQueue[e.animQueue.length-1],e.state.children),e.animQueue=[])}};N.propTypes={component:_.default.any,componentProps:_.default.object,children:_.default.any,style:_.default.object,appear:_.default.bool,enter:_.default.any,leave:_.default.any,animatingClassName:_.default.array,onEnd:_.default.func,exclusive:_.default.bool},N.defaultProps={component:"div",componentProps:{},appear:!0,animatingClassName:["tween-one-entering","tween-one-leaving"],enter:{x:50,opacity:0,type:"from"},leave:{x:-50,opacity:0},onEnd:n,exclusive:!1},N.isTweenOneGroup=!0,t.default=N,e.exports=t.default},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0}),t.ticker=t.plugins=t.easing=t.TweenOneGroup=void 0;var n=r(407),o=a(n),i=r(1126),l=a(i),s=r(408),u=a(s),h=r(267),c=a(h),d=r(409),m=a(d);o.default.TweenOneGroup=l.default,o.default.easing=u.default,o.default.plugins=c.default,o.default.ticker=m.default,t.default=o.default,t.TweenOneGroup=l.default,t.easing=u.default,t.plugins=c.default,t.ticker=m.default},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var n=r(76),o=a(n),i=r(433),l=a(i),s=r(137),u=r(267),h=a(u),c=function(e,t,r){this.target=e,this.vars=t,this.type=r,this.propsData={},this.setDefaultData()};c.prototype={name:"style"};var d=c.prototype;d.getTweenData=function(e,t){var r={data:{},dataType:{},dataUnit:{},dataCount:{},dataSplitStr:{}};if(e.match(/colo|fill|storker/i)?(r.data[e]=(0,i.parseColor)(t),r.dataType[e]="color"):e.match(/shadow/i)?(r.data[e]=(0,i.parseShadow)(t),r.dataType[e]="shadow"):"string"==typeof t&&t.split(/[\s|,]/).length>1?(r.data[e]=t.split(/[\s|,]/),r.dataSplitStr[e]=t.replace(/[^\s|,]/g,""),r.dataType[e]="string"):(r.data[e]=t,r.dataType[e]="other"),Array.isArray(r.data[e]))r.dataUnit[e]=r.data[e].map(function(e){return e.toString().replace(/[^a-z|%]/g,"")}),r.dataCount[e]=r.data[e].map(function(e){return e.toString().replace(/[^+|=|-]/g,"")}),r.data[e]=r.data[e].map(function(e){return parseFloat(e)||0===parseFloat(e)?parseFloat(e):e});else{r.dataUnit[e]=r.data[e].toString().replace(/[^a-z|%]/g,""),r.dataCount[e]=r.data[e].toString().replace(/[^+|=|-]/g,"");var a=parseFloat(r.data[e].toString().replace(/[a-z|%|=]/g,""));r.data[e]=a||0===a?a:r.data[e]}return r},d.setDefaultData=function(){var e=this;this.propsData.data={},this.propsData.dataType={},this.propsData.dataUnit={},this.propsData.dataCount={},this.propsData.dataSplitStr={},Object.keys(this.vars).forEach(function(t){if(t in h.default)return void(e.propsData.data[t]=new h.default[t](e.target,e.vars[t]));var r=(0,i.getGsapType)(t),a=e.getTweenData(r,e.vars[t]);e.propsData.data[r]=a.data[r],e.propsData.dataType[r]=a.dataType[r],e.propsData.dataUnit[r]=a.dataUnit[r],e.propsData.dataCount[r]=a.dataCount[r],a.dataSplitStr[r]&&(e.propsData.dataSplitStr[r]=a.dataSplitStr[r])})},d.convertToMarksArray=function(e,t,r,a,n){var o=a.toString().replace(/[^a-z|%]/g,""),i=t[n];return o===i?parseFloat(a):parseFloat(a)||0===parseFloat(a)?(0,s.startConvertToEndUnit)(this.target,e,r,a,o,i,null,"transformOrigin"===r&&!n):a},d.getAnimStart=function(e,t,r){var a=this,n={},l=t.style||{};return Object.keys(this.propsData.data).forEach(function(t){var u=(0,i.isConvert)(t),c=l[u]||e[u],d="fixed"===e.position;c&&"none"!==c&&"auto"!==c||(c="");var m=void 0,p=void 0,f=void 0;t in h.default?("bezier"===t&&(a.transform=(0,i.checkStyleName)("transform"),c=e[r?"transformSVG":a.transform],n.transform=l.transform?(0,o.default)({},l.transform):n.transform||(0,i.getTransform)(c)),a.propsData.data[t].getAnimStart(e,r)):"transform"===u?(a.transform=(0,i.checkStyleName)("transform"),c=e[r?"transformSVG":a.transform],p=a.propsData.dataUnit[t],m=l.transform?(0,o.default)({},l.transform):n.transform||(0,i.getTransform)(c),p&&p.match(/%|vw|vh|em|rem/i)&&(m[t]=(0,s.startConvertToEndUnit)(a.target,e,t,m[t],null,p)),n.transform=m):"filter"===u?(l[u]?c=l[u]:(a.filterName=(0,i.checkStyleName)("filter")||"filter",c=e[a.filterName],a.filterObject=(0,o.default)({},a.filterObject,(0,i.splitFilterToObject)(c)),c=a.filterObject[t]||0),f=c.toString().replace(/[^a-z|%]/g,""),p=a.propsData.dataUnit[t],p!==f&&(c=(0,s.startConvertToEndUnit)(a.target,e,u,parseFloat(c),f,p,d)),n[t]=parseFloat(c)):t.match(/color|fill/i)||"stroke"===t?(c=c||"stroke"!==t?c:"rgba(255, 255, 255, 0)",n[u]=(0,i.parseColor)(c)):t.match(/shadow/i)?(c=(0,i.parseShadow)(c),p=a.propsData.dataUnit[t],c=c.map(a.convertToMarksArray.bind(a,e,p,t)),n[u]=c):Array.isArray(a.propsData.data[t])?(c=c.split(/[\s|,]/),p=a.propsData.dataUnit[t],c=c.map(a.convertToMarksArray.bind(a,e,p,t)),n[u]=c):(p=a.propsData.dataUnit[u],f=c.toString().replace(/[^a-z|%]/g,""),p!==f&&(c=(0,s.startConvertToEndUnit)(a.target,e,u,parseFloat(c),f,p,d)),n[u]=parseFloat(c||0))}),this.start=n,n},d.setArrayRatio=function(e,t,r,a,n){"color"===n&&4===t.length&&3===r.length&&(r[3]=1);var o=t.indexOf("inset")>=0,l=r.indexOf("inset")>=0;if(o&&!l||l&&!o)throw console.error('Error: "box-shadow" inset have to exist');var s=l?9:8;t.length===s&&r.length===s-1?(r.splice(3,0,0),a.splice(3,0,"")):r.length===s&&t.length===s-1&&t.splice(3,0,0);var u=r.map(function(r,o){var i="color"!==n||3!==o||t[o]?0:1,l="number"==typeof t[o]?t[o]:i;return"string"==typeof r?r:(r-l)*e+l+(a[o]||0)});if("color"===n)return(0,i.getColor)(u);if("shadow"===n){var h=u.length===s?4:3,c=u.slice(0,h).map(function(e){return"number"==typeof e?e+"px":e}),d=u.slice(h,l?u.length-1:u.length),m=(0,i.getColor)(d);return(c.join(" ")+" "+m+" "+(l?"inset":"")).trim()}return u},d.setRatio=function(e,t,r){var a=this;t.style=t.style||{},this.start.transform&&(t.style.transform=t.style.transform||(0,o.default)({},this.start.transform));var n=this.target.style;Object.keys(this.propsData.data).forEach(function(o){var u="transform"===(0,i.isTransform)(o),c=u?a.start.transform[o]:a.start[o],d=a.propsData.data[o],m=a.propsData.dataUnit[o],p=a.propsData.dataCount[o];if(o in h.default)return a.propsData.data[o].setRatio(e,t,r),void("bezier"===o?n[a.transform]=(0,s.getTransformValue)(t.style.transform):Object.keys(t.style).forEach(function(e){n[e]=t.style[e]}));if(u){if(m&&m.match(/%|vw|vh|em|rem/i))c=a.start.transform[o],"="===p.charAt(1)?t.style.transform[o]=c+d*e+m:t.style.transform[o]=(d-c)*e+c+m;else if("scale"===o){var f=a.start.transform.scaleX,v=a.start.transform.scaleY;"="===p.charAt(1)?(t.style.transform.scaleX=f+d*e,t.style.transform.scaleY=v+d*e):(t.style.transform.scaleX=(d-f)*e+f,t.style.transform.scaleY=(d-v)*e+v)}else"="===p.charAt(1)?t.style.transform[o]=c+d*e:t.style.transform[o]=(d-c)*e+c;return n[a.transform]=(0,s.getTransformValue)(t.style.transform),void(r&&(r.transformSVG=(0,i.createMatrix)(n[a.transform]).toString()))}if(Array.isArray(d)){var y=a.propsData.dataType[o];t.style[o]=a.setArrayRatio(e,c,d,m,y),"string"===y&&(t.style[o]=t.style[o].join(a.propsData.dataSplitStr[o]))}else{var g=(0,i.stylesToCss)(o,0);if(g="number"==typeof g?"":g.replace(/[^a-z|%]/g,""),m=m||(l.default.filter.indexOf(o)>=0?"":g),"string"==typeof d)t.style[o]=d;else if("="===p.charAt(1))t.style[o]=c+d*e+m;else{var _=(d-c)*e+c;t.style[o]=m?""+_+m:_}}if(l.default.filter.indexOf(o)>=0){if(!a.filterObject)return;a.filterObject[o]=t.style[o];var T="";return Object.keys(a.filterObject).forEach(function(e){T+=" "+e+"("+a.filterObject[e]+")"}),void(n[a.filterName]=T.trim())}n[o]=t.style[o]})},t.default=c,e.exports=t.default},function(e,t,r){"use strict";function a(e,t,r,a,n,o,i,l){if(!e){if(e=void 0,void 0===t)e=Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var s=[r,a,n,o,i,l],u=0;e=Error(t.replace(/%s/g,function(){return s[u++]})),e.name="Invariant Violation"}throw e.framesToPop=1,e}}function n(e){for(var t=arguments.length-1,r="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=0;n<t;n++)r+="&args[]="+encodeURIComponent(arguments[n+1]);a(!1,"Minified React error #"+e+"; visit %s for the full message or use the non-minified dev environment for full errors and additional helpful warnings. ",r)}function o(e,t,r,a,n,o,i,l,s){var u=Array.prototype.slice.call(arguments,3);try{t.apply(r,u)}catch(e){this.onError(e)}}function i(e,t,r,a,n,i,l,s,u){wa=!1,Na=null,o.apply(Sa,arguments)}function l(e,t,r,a,o,l,s,u,h){if(i.apply(this,arguments),wa){if(wa){var c=Na;wa=!1,Na=null}else n("198"),c=void 0;ba||(ba=!0,La=c)}}function s(){if(ka)for(var e in Da){var t=Da[e],r=ka.indexOf(e);if(-1<r||n("96",e),!Ma[r]){t.extractEvents||n("97",e),Ma[r]=t,r=t.eventTypes;for(var a in r){var o=void 0,i=r[a],l=t,s=a;Aa.hasOwnProperty(s)&&n("99",s),Aa[s]=i;var h=i.phasedRegistrationNames;if(h){for(o in h)h.hasOwnProperty(o)&&u(h[o],l,s);o=!0}else i.registrationName?(u(i.registrationName,l,s),o=!0):o=!1;o||n("98",a,e)}}}}function u(e,t,r){Ia[e]&&n("100",e),Ia[e]=t,za[e]=t.eventTypes[r].dependencies}function h(e,t,r,a){t=e.type||"unknown-event",e.currentTarget=Ea(a),l(t,r,void 0,e),e.currentTarget=null}function c(e,t){return null==t&&n("30"),null==e?t:Array.isArray(e)?Array.isArray(t)?(e.push.apply(e,t),e):(e.push(t),e):Array.isArray(t)?[e].concat(t):[e,t]}function d(e,t,r){Array.isArray(e)?e.forEach(t,r):e&&t.call(r,e)}function m(e,t){if(e){var r=e._dispatchListeners,a=e._dispatchInstances;if(Array.isArray(r))for(var n=0;n<r.length&&!e.isPropagationStopped();n++)h(e,t,r[n],a[n]);else r&&h(e,t,r,a);e._dispatchListeners=null,e._dispatchInstances=null,e.isPersistent()||e.constructor.release(e)}}function p(e){return m(e,!0)}function f(e){return m(e,!1)}function v(e,t){var r=e.stateNode;if(!r)return null;var a=Ca(r);if(!a)return null;r=a[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":(a=!a.disabled)||(e=e.type,a=!("button"===e||"input"===e||"select"===e||"textarea"===e)),e=!a;break e;default:e=!1}return e?null:(r&&"function"!=typeof r&&n("231",t,void 0===r?"undefined":ga(r)),r)}function y(e,t){if(null!==e&&(Pa=c(Pa,e)),e=Pa,Pa=null,e&&(t?d(e,p):d(e,f),Pa&&n("95"),ba))throw t=La,ba=!1,La=null,t}function g(e){if(e[ja])return e[ja];for(;!e[ja];){if(!e.parentNode)return null;e=e.parentNode}return e=e[ja],7===e.tag||8===e.tag?e:null}function _(e){return e=e[ja],!e||7!==e.tag&&8!==e.tag?null:e}function T(e){if(7===e.tag||8===e.tag)return e.stateNode;n("33")}function x(e){return e[Ba]||null}function w(e){do{e=e.return}while(e&&7!==e.tag);return e||null}function N(e,t,r){(t=v(e,r.dispatchConfig.phasedRegistrationNames[t]))&&(r._dispatchListeners=c(r._dispatchListeners,t),r._dispatchInstances=c(r._dispatchInstances,e))}function b(e){if(e&&e.dispatchConfig.phasedRegistrationNames){for(var t=e._targetInst,r=[];t;)r.push(t),t=w(t);for(t=r.length;0<t--;)N(r[t],"captured",e);for(t=0;t<r.length;t++)N(r[t],"bubbled",e)}}function L(e,t,r){e&&r&&r.dispatchConfig.registrationName&&(t=v(e,r.dispatchConfig.registrationName))&&(r._dispatchListeners=c(r._dispatchListeners,t),r._dispatchInstances=c(r._dispatchInstances,e))}function S(e){e&&e.dispatchConfig.registrationName&&L(e._targetInst,null,e)}function k(e){d(e,b)}function D(e,t){var r={};return r[e.toLowerCase()]=t.toLowerCase(),r["Webkit"+e]="webkit"+t,r["Moz"+e]="moz"+t,r}function M(e){if(Ga[e])return Ga[e];if(!Va[e])return e;var t,r=Va[e];for(t in r)if(r.hasOwnProperty(t)&&t in Wa)return Ga[e]=r[t];return e}function A(){if($a)return $a;var e,t,r=Xa,a=r.length,n="value"in Ja?Ja.value:Ja.textContent,o=n.length;for(e=0;e<a&&r[e]===n[e];e++);var i=a-e;for(t=1;t<=i&&r[a-t]===n[o-t];t++);return $a=n.slice(e,1<t?1-t:void 0)}function I(){return!0}function z(){return!1}function C(e,t,r,a){this.dispatchConfig=e,this._targetInst=t,this.nativeEvent=r,e=this.constructor.Interface;for(var n in e)e.hasOwnProperty(n)&&((t=e[n])?this[n]=t(r):"target"===n?this.target=a:this[n]=r[n]);return this.isDefaultPrevented=(null!=r.defaultPrevented?r.defaultPrevented:!1===r.returnValue)?I:z,this.isPropagationStopped=z,this}function R(e,t,r,a){if(this.eventPool.length){var n=this.eventPool.pop();return this.call(n,e,t,r,a),n}return new this(e,t,r,a)}function E(e){e instanceof this||n("279"),e.destructor(),10>this.eventPool.length&&this.eventPool.push(e)}function P(e){e.eventPool=[],e.getPooled=R,e.release=E}function O(e,t){switch(e){case"keyup":return-1!==tn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"blur":return!0;default:return!1}}function F(e){return e=e.detail,"object"===(void 0===e?"undefined":ga(e))&&"data"in e?e.data:null}function j(e,t){switch(e){case"compositionend":return F(t);case"keypress":return 32!==t.which?null:(un=!0,ln);case"textInput":return e=t.data,e===ln&&un?null:e;default:return null}}function B(e,t){if(hn)return"compositionend"===e||!rn&&O(e,t)?(e=A(),$a=Xa=Ja=null,hn=!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 on&&"ko"!==t.locale?null:t.data;default:return null}}function H(e){if(e=Ra(e)){"function"!=typeof dn&&n("280");var t=Ca(e.stateNode);dn(e.stateNode,e.type,t)}}function V(e){mn?pn?pn.push(e):pn=[e]:mn=e}function G(){if(mn){var e=mn,t=pn;if(pn=mn=null,H(e),t)for(e=0;e<t.length;e++)H(t[e])}}function W(e,t){return e(t)}function U(e,t,r){return e(t,r)}function q(){}function Y(e,t){if(fn)return e(t);fn=!0;try{return W(e,t)}finally{fn=!1,(null!==mn||null!==pn)&&(q(),G())}}function Z(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!vn[e.type]:"textarea"===t}function K(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}function J(e){if(!Ha)return!1;e="on"+e;var t=e in document;return t||(t=document.createElement("div"),t.setAttribute(e,"return;"),t="function"==typeof t[e]),t}function X(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function $(e){var t=X(e)?"checked":"value",r=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),a=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==r&&"function"==typeof r.get&&"function"==typeof r.set){var n=r.get,o=r.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return n.call(this)},set:function(e){a=""+e,o.call(this,e)}}),Object.defineProperty(e,t,{enumerable:r.enumerable}),{getValue:function(){return a},setValue:function(e){a=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Q(e){e._valueTracker||(e._valueTracker=$(e))}function ee(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var r=t.getValue(),a="";return e&&(a=X(e)?e.checked?"true":"false":e.value),(e=a)!==r&&(t.setValue(e),!0)}function te(e){return null===e||"object"!==(void 0===e?"undefined":ga(e))?null:(e=An&&e[An]||e["@@iterator"],"function"==typeof e?e:null)}function re(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case kn:return"AsyncMode";case wn:return"Fragment";case xn:return"Portal";case bn:return"Profiler";case Nn:return"StrictMode";case Mn:return"Placeholder"}if("object"===(void 0===e?"undefined":ga(e))){switch(e.$$typeof){case Sn:return"Context.Consumer";case Ln:return"Context.Provider";case Dn:var t=e.render;return t=t.displayName||t.name||"",e.displayName||(""!==t?"ForwardRef("+t+")":"ForwardRef")}if("function"==typeof e.then&&(e=1===e._reactStatus?e._reactResult:null))return re(e)}return null}function ae(e){var t="";do{e:switch(e.tag){case 4:case 0:case 1:case 2:case 3:case 7:case 10:var r=e._debugOwner,a=e._debugSource,n=re(e.type),o=null;r&&(o=re(r.type)),r=n,n="",a?n=" (at "+a.fileName.replace(gn,"")+":"+a.lineNumber+")":o&&(n=" (created by "+o+")"),o="\n in "+(r||"Unknown")+n;break e;default:o=""}t+=o,e=e.return}while(e);return t}function ne(e){return!!zn.call(Rn,e)||!zn.call(Cn,e)&&(In.test(e)?Rn[e]=!0:(Cn[e]=!0,!1))}function oe(e,t,r,a){if(null!==r&&0===r.type)return!1;switch(void 0===t?"undefined":ga(t)){case"function":case"symbol":return!0;case"boolean":return!a&&(null!==r?!r.acceptsBooleans:"data-"!==(e=e.toLowerCase().slice(0,5))&&"aria-"!==e);default:return!1}}function ie(e,t,r,a){if(null===t||void 0===t||oe(e,t,r,a))return!0;if(a)return!1;if(null!==r)switch(r.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function le(e,t,r,a,n){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=a,this.attributeNamespace=n,this.mustUseProperty=r,this.propertyName=e,this.type=t}function se(e){return e[1].toUpperCase()}function ue(e,t,r,a){var n=En.hasOwnProperty(t)?En[t]:null;(null!==n?0===n.type:!a&&2<t.length&&("o"===t[0]||"O"===t[0])&&("n"===t[1]||"N"===t[1]))||(ie(t,r,n,a)&&(r=null),a||null===n?ne(t)&&(null===r?e.removeAttribute(t):e.setAttribute(t,""+r)):n.mustUseProperty?e[n.propertyName]=null===r?3!==n.type&&"":r:(t=n.attributeName,a=n.attributeNamespace,null===r?e.removeAttribute(t):(n=n.type,r=3===n||4===n&&!0===r?"":""+r,a?e.setAttributeNS(a,t,r):e.setAttribute(t,r))))}function he(e){switch(void 0===e?"undefined":ga(e)){case"boolean":case"number":case"object":case"string":case"undefined":return e;default:return""}}function ce(e,t){var r=t.checked;return Ta({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=r?r:e._wrapperState.initialChecked})}function de(e,t){var r=null==t.defaultValue?"":t.defaultValue,a=null!=t.checked?t.checked:t.defaultChecked;r=he(null!=t.value?t.value:r),e._wrapperState={initialChecked:a,initialValue:r,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function me(e,t){null!=(t=t.checked)&&ue(e,"checked",t,!1)}function pe(e,t){me(e,t);var r=he(t.value),a=t.type;if(null!=r)"number"===a?(0===r&&""===e.value||e.value!=r)&&(e.value=""+r):e.value!==""+r&&(e.value=""+r);else if("submit"===a||"reset"===a)return void e.removeAttribute("value");t.hasOwnProperty("value")?ve(e,t.type,r):t.hasOwnProperty("defaultValue")&&ve(e,t.type,he(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function fe(e,t,r){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,r||t===e.value||(e.value=t),e.defaultValue=t}r=e.name,""!==r&&(e.name=""),e.defaultChecked=!e.defaultChecked,e.defaultChecked=!!e._wrapperState.initialChecked,""!==r&&(e.name=r)}function ve(e,t,r){"number"===t&&e.ownerDocument.activeElement===e||(null==r?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+r&&(e.defaultValue=""+r))}function ye(e,t,r){return e=C.getPooled(On.change,e,t,r),e.type="change",V(r),k(e),e}function ge(e){y(e,!1)}function _e(e){if(ee(T(e)))return e}function Te(e,t){if("change"===e)return t}function xe(){Fn&&(Fn.detachEvent("onpropertychange",we),jn=Fn=null)}function we(e){"value"===e.propertyName&&_e(jn)&&(e=ye(jn,e,K(e)),Y(ge,e))}function Ne(e,t,r){"focus"===e?(xe(),Fn=t,jn=r,Fn.attachEvent("onpropertychange",we)):"blur"===e&&xe()}function be(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return _e(jn)}function Le(e,t){if("click"===e)return _e(t)}function Se(e,t){if("input"===e||"change"===e)return _e(t)}function ke(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=Gn[e])&&!!t[e]}function De(){return ke}function Me(e,t){return e===t?0!==e||0!==t||1/e==1/t:e!==e&&t!==t}function Ae(e,t){if(Me(e,t))return!0;if("object"!==(void 0===e?"undefined":ga(e))||null===e||"object"!==(void 0===t?"undefined":ga(t))||null===t)return!1;var r=Object.keys(e),a=Object.keys(t);if(r.length!==a.length)return!1;for(a=0;a<r.length;a++)if(!$n.call(t,r[a])||!Me(e[r[a]],t[r[a]]))return!1;return!0}function Ie(e){var t=e;if(e.alternate)for(;t.return;)t=t.return;else{if(0!=(2&t.effectTag))return 1;for(;t.return;)if(t=t.return,0!=(2&t.effectTag))return 1}return 5===t.tag?2:3}function ze(e){2!==Ie(e)&&n("188")}function Ce(e){var t=e.alternate;if(!t)return t=Ie(e),3===t&&n("188"),1===t?null:e;for(var r=e,a=t;;){var o=r.return,i=o?o.alternate:null;if(!o||!i)break;if(o.child===i.child){for(var l=o.child;l;){if(l===r)return ze(o),e;if(l===a)return ze(o),t;l=l.sibling}n("188")}if(r.return!==a.return)r=o,a=i;else{l=!1;for(var s=o.child;s;){if(s===r){l=!0,r=o,a=i;break}if(s===a){l=!0,a=o,r=i;break}s=s.sibling}if(!l){for(s=i.child;s;){if(s===r){l=!0,r=i,a=o;break}if(s===a){l=!0,a=i,r=o;break}s=s.sibling}l||n("189")}}r.alternate!==a&&n("190")}return 5!==r.tag&&n("188"),r.stateNode.current===r?e:t}function Re(e){if(!(e=Ce(e)))return null;for(var t=e;;){if(7===t.tag||8===t.tag)return t;if(t.child)t.child.return=t,t=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 Ee(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function Pe(e,t){var r=e[0];e=e[1];var a="on"+(e[0].toUpperCase()+e.slice(1));t={phasedRegistrationNames:{bubbled:a,captured:a+"Capture"},dependencies:[r],isInteractive:t},ho[e]=t,co[r]=t}function Oe(e){var t=e.targetInst,r=t;do{if(!r){e.ancestors.push(r);break}var a;for(a=r;a.return;)a=a.return;if(!(a=5!==a.tag?null:a.stateNode.containerInfo))break;e.ancestors.push(r),r=g(a)}while(r);for(r=0;r<e.ancestors.length;r++){t=e.ancestors[r];var n=K(e.nativeEvent);a=e.topLevelType;for(var o=e.nativeEvent,i=null,l=0;l<Ma.length;l++){var s=Ma[l];s&&(s=s.extractEvents(a,t,o,n))&&(i=c(i,s))}y(i,!1)}}function Fe(e,t){if(!t)return null;var r=(po(e)?Be:He).bind(null,e);t.addEventListener(e,r,!1)}function je(e,t){if(!t)return null;var r=(po(e)?Be:He).bind(null,e);t.addEventListener(e,r,!0)}function Be(e,t){U(He,e,t)}function He(e,t){if(vo){var r=K(t);if(r=g(r),null===r||"number"!=typeof r.tag||2===Ie(r)||(r=null),fo.length){var a=fo.pop();a.topLevelType=e,a.nativeEvent=t,a.targetInst=r,e=a}else e={topLevelType:e,nativeEvent:t,targetInst:r,ancestors:[]};try{Y(Oe,e)}finally{e.topLevelType=null,e.nativeEvent=null,e.targetInst=null,e.ancestors.length=0,10>fo.length&&fo.push(e)}}}function Ve(e){return Object.prototype.hasOwnProperty.call(e,_o)||(e[_o]=go++,yo[e[_o]]={}),yo[e[_o]]}function Ge(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}function We(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function Ue(e,t){var r=We(e);e=0;for(var a;r;){if(3===r.nodeType){if(a=e+r.textContent.length,e<=t&&a>=t)return{node:r,offset:t-e};e=a}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=We(r)}}function qe(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?qe(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function Ye(){for(var e=window,t=Ge();t instanceof e.HTMLIFrameElement;){try{e=t.contentDocument.defaultView}catch(e){break}t=Ge(e.document)}return t}function Ze(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)}function Ke(e,t){var r=t.window===t?t.document:9===t.nodeType?t:t.ownerDocument;return Lo||null==wo||wo!==Ge(r)?null:(r=wo,"selectionStart"in r&&Ze(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),bo&&Ae(bo,r)?null:(bo=r,e=C.getPooled(xo.select,No,e,t),e.type="select",e.target=wo,k(e),e))}function Je(e){var t="";return _a.Children.forEach(e,function(e){null!=e&&(t+=e)}),t}function Xe(e,t){return e=Ta({children:void 0},t),(t=Je(t.children))&&(e.children=t),e}function $e(e,t,r,a){if(e=e.options,t){t={};for(var n=0;n<r.length;n++)t["$"+r[n]]=!0;for(r=0;r<e.length;r++)n=t.hasOwnProperty("$"+e[r].value),e[r].selected!==n&&(e[r].selected=n),n&&a&&(e[r].defaultSelected=!0)}else{for(r=""+he(r),t=null,n=0;n<e.length;n++){if(e[n].value===r)return e[n].selected=!0,void(a&&(e[n].defaultSelected=!0));null!==t||e[n].disabled||(t=e[n])}null!==t&&(t.selected=!0)}}function Qe(e,t){return null!=t.dangerouslySetInnerHTML&&n("91"),Ta({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function et(e,t){var r=t.value;null==r&&(r=t.defaultValue,t=t.children,null!=t&&(null!=r&&n("92"),Array.isArray(t)&&(1>=t.length||n("93"),t=t[0]),r=t),null==r&&(r="")),e._wrapperState={initialValue:he(r)}}function tt(e,t){var r=he(t.value),a=he(t.defaultValue);null!=r&&(r=""+r,r!==e.value&&(e.value=r),null==t.defaultValue&&e.defaultValue!==r&&(e.defaultValue=r)),null!=a&&(e.defaultValue=""+a)}function rt(e){var t=e.textContent;t===e._wrapperState.initialValue&&(e.value=t)}function at(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 nt(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?at(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}function ot(e,t){if(t){var r=e.firstChild;if(r&&r===e.lastChild&&3===r.nodeType)return void(r.nodeValue=t)}e.textContent=t}function it(e,t){e=e.style;for(var r in t)if(t.hasOwnProperty(r)){var a=0===r.indexOf("--"),n=r,o=t[r];n=null==o||"boolean"==typeof o||""===o?"":a||"number"!=typeof o||0===o||Ao.hasOwnProperty(n)&&Ao[n]?(""+o).trim():o+"px","float"===r&&(r="cssFloat"),a?e.setProperty(r,n):e[r]=n}}function lt(e,t){t&&(zo[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML)&&n("137",e,""),null!=t.dangerouslySetInnerHTML&&(null!=t.children&&n("60"),"object"===ga(t.dangerouslySetInnerHTML)&&"__html"in t.dangerouslySetInnerHTML||n("61")),null!=t.style&&"object"!==ga(t.style)&&n("62",""))}function st(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}}function ut(e,t){e=9===e.nodeType||11===e.nodeType?e:e.ownerDocument;var r=Ve(e);t=za[t];for(var a=0;a<t.length;a++){var n=t[a];if(!r.hasOwnProperty(n)||!r[n]){switch(n){case"scroll":je("scroll",e);break;case"focus":case"blur":je("focus",e),je("blur",e),r.blur=!0,r.focus=!0;break;case"cancel":case"close":J(n)&&je(n,e);break;case"invalid":case"submit":case"reset":break;default:-1===Ka.indexOf(n)&&Fe(n,e)}r[n]=!0}}}function ht(){}function ct(e,t){switch(e){case"button":case"input":case"select":case"textarea":return!!t.autoFocus}return!1}function dt(e,t){return"textarea"===e||"option"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"===ga(t.dangerouslySetInnerHTML)&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}function mt(e){for(e=e.nextSibling;e&&1!==e.nodeType&&3!==e.nodeType;)e=e.nextSibling;return e}function pt(e){for(e=e.firstChild;e&&1!==e.nodeType&&3!==e.nodeType;)e=e.nextSibling;return e}function ft(e){0>Po||(e.current=Eo[Po],Eo[Po]=null,Po--)}function vt(e,t){Po++,Eo[Po]=e.current,e.current=t}function yt(e,t){var r=e.type.contextTypes;if(!r)return Oo;var a=e.stateNode;if(a&&a.__reactInternalMemoizedUnmaskedChildContext===t)return a.__reactInternalMemoizedMaskedChildContext;var n,o={};for(n in r)o[n]=t[n];return a&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function gt(e){return null!==(e=e.childContextTypes)&&void 0!==e}function _t(e){ft(jo,e),ft(Fo,e)}function Tt(e){ft(jo,e),ft(Fo,e)}function xt(e,t,r){Fo.current!==Oo&&n("168"),vt(Fo,t,e),vt(jo,r,e)}function wt(e,t,r){var a=e.stateNode;if(e=t.childContextTypes,"function"!=typeof a.getChildContext)return r;a=a.getChildContext();for(var o in a)o in e||n("108",re(t)||"Unknown",o);return Ta({},r,a)}function Nt(e){var t=e.stateNode;return t=t&&t.__reactInternalMemoizedMergedChildContext||Oo,Bo=Fo.current,vt(Fo,t,e),vt(jo,jo.current,e),!0}function bt(e,t,r){var a=e.stateNode;a||n("169"),r?(t=wt(e,t,Bo),a.__reactInternalMemoizedMergedChildContext=t,ft(jo,e),ft(Fo,e),vt(Fo,t,e)):ft(jo,e),vt(jo,r,e)}function Lt(e){return function(t){try{return e(t)}catch(e){}}}function St(e){if("undefined"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var t=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(t.isDisabled||!t.supportsFiber)return!0;try{var r=t.inject(e);Ho=Lt(function(e){return t.onCommitFiberRoot(r,e)}),Vo=Lt(function(e){return t.onCommitFiberUnmount(r,e)})}catch(e){}return!0}function kt(e,t,r,a){this.tag=e,this.key=r,this.sibling=this.child=this.return=this.stateNode=this.type=null,this.index=0,this.ref=null,this.pendingProps=t,this.firstContextDependency=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 Dt(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Mt(e,t,r){var a=e.alternate;return null===a?(a=new kt(e.tag,t,e.key,e.mode),a.type=e.type,a.stateNode=e.stateNode,a.alternate=e,e.alternate=a):(a.pendingProps=t,a.effectTag=0,a.nextEffect=null,a.firstEffect=null,a.lastEffect=null),a.childExpirationTime=e.childExpirationTime,a.expirationTime=t!==e.pendingProps?r:e.expirationTime,a.child=e.child,a.memoizedProps=e.memoizedProps,a.memoizedState=e.memoizedState,a.updateQueue=e.updateQueue,a.firstContextDependency=e.firstContextDependency,a.sibling=e.sibling,a.index=e.index,a.ref=e.ref,a}function At(e,t,r){var a=e.type,o=e.key;e=e.props;var i=void 0;if("function"==typeof a)i=Dt(a)?2:4;else if("string"==typeof a)i=7;else e:switch(a){case wn:return It(e.children,t,r,o);case kn:i=10,t|=3;break;case Nn:i=10,t|=2;break;case bn:return a=new kt(15,e,o,4|t),a.type=bn,a.expirationTime=r,a;case Mn:i=16;break;default:if("object"===(void 0===a?"undefined":ga(a))&&null!==a)switch(a.$$typeof){case Ln:i=12;break e;case Sn:i=11;break e;case Dn:i=13;break e;default:if("function"==typeof a.then){i=4;break e}}n("130",null==a?a:void 0===a?"undefined":ga(a),"")}return t=new kt(i,e,o,t),t.type=a,t.expirationTime=r,t}function It(e,t,r,a){return e=new kt(9,e,a,t),e.expirationTime=r,e}function zt(e,t,r){return e=new kt(8,e,null,t),e.expirationTime=r,e}function Ct(e,t,r){return t=new kt(6,null!==e.children?e.children:[],e.key,t),t.expirationTime=r,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Rt(e,t){e.didError=!1;var r=e.earliestPendingTime;0===r?e.earliestPendingTime=e.latestPendingTime=t:r>t?e.earliestPendingTime=t:e.latestPendingTime<t&&(e.latestPendingTime=t),Et(t,e)}function Et(e,t){var r=t.earliestSuspendedTime,a=t.latestSuspendedTime,n=t.earliestPendingTime,o=t.latestPingedTime;n=0!==n?n:o,0===n&&(0===e||a>e)&&(n=a),e=n,0!==e&&0!==r&&r<e&&(e=r),t.nextExpirationTimeToWorkOn=n,t.expirationTime=e}function Pt(e){return{baseState:e,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function Ot(e){return{baseState:e.baseState,firstUpdate:e.firstUpdate,lastUpdate:e.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function Ft(e){return{expirationTime:e,tag:0,payload:null,callback:null,next:null,nextEffect:null}}function jt(e,t){null===e.lastUpdate?e.firstUpdate=e.lastUpdate=t:(e.lastUpdate.next=t,e.lastUpdate=t)}function Bt(e,t){var r=e.alternate;if(null===r){var a=e.updateQueue,n=null;null===a&&(a=e.updateQueue=Pt(e.memoizedState))}else a=e.updateQueue,n=r.updateQueue,null===a?null===n?(a=e.updateQueue=Pt(e.memoizedState),n=r.updateQueue=Pt(r.memoizedState)):a=e.updateQueue=Ot(n):null===n&&(n=r.updateQueue=Ot(a));null===n||a===n?jt(a,t):null===a.lastUpdate||null===n.lastUpdate?(jt(a,t),jt(n,t)):(jt(a,t),n.lastUpdate=t)}function Ht(e,t){var r=e.updateQueue;r=null===r?e.updateQueue=Pt(e.memoizedState):Vt(e,r),null===r.lastCapturedUpdate?r.firstCapturedUpdate=r.lastCapturedUpdate=t:(r.lastCapturedUpdate.next=t,r.lastCapturedUpdate=t)}function Vt(e,t){var r=e.alternate;return null!==r&&t===r.updateQueue&&(t=e.updateQueue=Ot(t)),t}function Gt(e,t,r,a,n,o){switch(r.tag){case 1:return e=r.payload,"function"==typeof e?e.call(o,a,n):e;case 3:e.effectTag=-1025&e.effectTag|64;case 0:if(e=r.payload,null===(n="function"==typeof e?e.call(o,a,n):e)||void 0===n)break;return Ta({},a,n);case 2:Go=!0}return a}function Wt(e,t,r,a,n){Go=!1,t=Vt(e,t);for(var o=t.baseState,i=null,l=0,s=t.firstUpdate,u=o;null!==s;){var h=s.expirationTime;h>n?(null===i&&(i=s,o=u),(0===l||l>h)&&(l=h)):(u=Gt(e,t,s,u,r,a),null!==s.callback&&(e.effectTag|=32,s.nextEffect=null,null===t.lastEffect?t.firstEffect=t.lastEffect=s:(t.lastEffect.nextEffect=s,t.lastEffect=s))),s=s.next}for(h=null,s=t.firstCapturedUpdate;null!==s;){var c=s.expirationTime;c>n?(null===h&&(h=s,null===i&&(o=u)),(0===l||l>c)&&(l=c)):(u=Gt(e,t,s,u,r,a),null!==s.callback&&(e.effectTag|=32,s.nextEffect=null,null===t.lastCapturedEffect?t.firstCapturedEffect=t.lastCapturedEffect=s:(t.lastCapturedEffect.nextEffect=s,t.lastCapturedEffect=s))),s=s.next}null===i&&(t.lastUpdate=null),null===h?t.lastCapturedUpdate=null:e.effectTag|=32,null===i&&null===h&&(o=u),t.baseState=o,t.firstUpdate=i,t.firstCapturedUpdate=h,e.expirationTime=l,e.memoizedState=u}function Ut(e,t,r){null!==t.firstCapturedUpdate&&(null!==t.lastUpdate&&(t.lastUpdate.next=t.firstCapturedUpdate,t.lastUpdate=t.lastCapturedUpdate),t.firstCapturedUpdate=t.lastCapturedUpdate=null),qt(t.firstEffect,r),t.firstEffect=t.lastEffect=null,qt(t.firstCapturedEffect,r),t.firstCapturedEffect=t.lastCapturedEffect=null}function qt(e,t){for(;null!==e;){var r=e.callback;if(null!==r){e.callback=null;var a=t;"function"!=typeof r&&n("191",r),r.call(a)}e=e.nextEffect}}function Yt(e,t){return{value:e,source:t,stack:ae(t)}}function Zt(e,t){var r=e.type._context;vt(Wo,r._currentValue,e),r._currentValue=t}function Kt(e){var t=Wo.current;ft(Wo,e),e.type._context._currentValue=t}function Jt(e){Uo=e,Yo=qo=null,e.firstContextDependency=null}function Xt(e,t){return Yo!==e&&!1!==t&&0!==t&&("number"==typeof t&&1073741823!==t||(Yo=e,t=1073741823),t={context:e,observedBits:t,next:null},null===qo?(null===Uo&&n("277"),Uo.firstContextDependency=qo=t):qo=qo.next=t),e._currentValue}function $t(e){return e===Zo&&n("174"),e}function Qt(e,t){vt(Xo,t,e),vt(Jo,e,e),vt(Ko,Zo,e);var r=t.nodeType;switch(r){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:nt(null,"");break;default:r=8===r?t.parentNode:t,t=r.namespaceURI||null,r=r.tagName,t=nt(t,r)}ft(Ko,e),vt(Ko,t,e)}function er(e){ft(Ko,e),ft(Jo,e),ft(Xo,e)}function tr(e){$t(Xo.current);var t=$t(Ko.current),r=nt(t,e.type);t!==r&&(vt(Jo,e,e),vt(Ko,r,e))}function rr(e){Jo.current===e&&(ft(Ko,e),ft(Jo,e))}function ar(e,t,r,a){t=e.memoizedState,r=r(a,t),r=null===r||void 0===r?t:Ta({},t,r),e.memoizedState=r,null!==(a=e.updateQueue)&&0===e.expirationTime&&(a.baseState=r)}function nr(e,t,r,a,n,o,i){return e=e.stateNode,"function"==typeof e.shouldComponentUpdate?e.shouldComponentUpdate(a,o,i):!(t.prototype&&t.prototype.isPureReactComponent&&Ae(r,a)&&Ae(n,o))}function or(e,t,r,a){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(r,a),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(r,a),t.state!==e&&Qo.enqueueReplaceState(t,t.state,null)}function ir(e,t,r,a){var n=e.stateNode,o=gt(t)?Bo:Fo.current;n.props=r,n.state=e.memoizedState,n.refs=$o,n.context=yt(e,o),o=e.updateQueue,null!==o&&(Wt(e,o,r,n,a),n.state=e.memoizedState),o=t.getDerivedStateFromProps,"function"==typeof o&&(ar(e,t,o,r),n.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof n.getSnapshotBeforeUpdate||"function"!=typeof n.UNSAFE_componentWillMount&&"function"!=typeof n.componentWillMount||(t=n.state,"function"==typeof n.componentWillMount&&n.componentWillMount(),"function"==typeof n.UNSAFE_componentWillMount&&n.UNSAFE_componentWillMount(),t!==n.state&&Qo.enqueueReplaceState(n,n.state,null),null!==(o=e.updateQueue)&&(Wt(e,o,r,n,a),n.state=e.memoizedState)),"function"==typeof n.componentDidMount&&(e.effectTag|=4)}function lr(e,t,r){if(null!==(e=r.ref)&&"function"!=typeof e&&"object"!==(void 0===e?"undefined":ga(e))){if(r._owner){r=r._owner;var a=void 0;r&&(2!==r.tag&&3!==r.tag&&n("110"),a=r.stateNode),a||n("147",e);var o=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===o?t.ref:(t=function(e){var t=a.refs;t===$o&&(t=a.refs={}),null===e?delete t[o]:t[o]=e},t._stringRef=o,t)}"string"!=typeof e&&n("284"),r._owner||n("254",e)}return e}function sr(e,t){"textarea"!==e.type&&n("31","[object Object]"===Object.prototype.toString.call(t)?"object with keys {"+Object.keys(t).join(", ")+"}":t,"")}function ur(e){function t(t,r){if(e){var a=t.lastEffect;null!==a?(a.nextEffect=r,t.lastEffect=r):t.firstEffect=t.lastEffect=r,r.nextEffect=null,r.effectTag=8}}function r(r,a){if(!e)return null;for(;null!==a;)t(r,a),a=a.sibling;return null}function a(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,r){return e=Mt(e,t,r),e.index=0,e.sibling=null,e}function i(t,r,a){return t.index=a,e?null!==(a=t.alternate)?(a=a.index,a<r?(t.effectTag=2,r):a):(t.effectTag=2,r):r}function l(t){return e&&null===t.alternate&&(t.effectTag=2),t}function s(e,t,r,a){return null===t||8!==t.tag?(t=zt(r,e.mode,a),t.return=e,t):(t=o(t,r,a),t.return=e,t)}function u(e,t,r,a){return null!==t&&t.type===r.type?(a=o(t,r.props,a),a.ref=lr(e,t,r),a.return=e,a):(a=At(r,e.mode,a),a.ref=lr(e,t,r),a.return=e,a)}function h(e,t,r,a){return null===t||6!==t.tag||t.stateNode.containerInfo!==r.containerInfo||t.stateNode.implementation!==r.implementation?(t=Ct(r,e.mode,a),t.return=e,t):(t=o(t,r.children||[],a),t.return=e,t)}function c(e,t,r,a,n){return null===t||9!==t.tag?(t=It(r,e.mode,a,n),t.return=e,t):(t=o(t,r,a),t.return=e,t)}function d(e,t,r){if("string"==typeof t||"number"==typeof t)return t=zt(""+t,e.mode,r),t.return=e,t;if("object"===(void 0===t?"undefined":ga(t))&&null!==t){switch(t.$$typeof){case Tn:return r=At(t,e.mode,r),r.ref=lr(e,null,t),r.return=e,r;case xn:return t=Ct(t,e.mode,r),t.return=e,t}if(ei(t)||te(t))return t=It(t,e.mode,r,null),t.return=e,t;sr(e,t)}return null}function m(e,t,r,a){var n=null!==t?t.key:null;if("string"==typeof r||"number"==typeof r)return null!==n?null:s(e,t,""+r,a);if("object"===(void 0===r?"undefined":ga(r))&&null!==r){switch(r.$$typeof){case Tn:return r.key===n?r.type===wn?c(e,t,r.props.children,a,n):u(e,t,r,a):null;case xn:return r.key===n?h(e,t,r,a):null}if(ei(r)||te(r))return null!==n?null:c(e,t,r,a,null);sr(e,r)}return null}function p(e,t,r,a,n){if("string"==typeof a||"number"==typeof a)return e=e.get(r)||null,s(t,e,""+a,n);if("object"===(void 0===a?"undefined":ga(a))&&null!==a){switch(a.$$typeof){case Tn:return e=e.get(null===a.key?r:a.key)||null,a.type===wn?c(t,e,a.props.children,n,a.key):u(t,e,a,n);case xn:return e=e.get(null===a.key?r:a.key)||null,h(t,e,a,n)}if(ei(a)||te(a))return e=e.get(r)||null,c(t,e,a,n,null);sr(t,a)}return null}function f(n,o,l,s){for(var u=null,h=null,c=o,f=o=0,v=null;null!==c&&f<l.length;f++){c.index>f?(v=c,c=null):v=c.sibling;var y=m(n,c,l[f],s);if(null===y){null===c&&(c=v);break}e&&c&&null===y.alternate&&t(n,c),o=i(y,o,f),null===h?u=y:h.sibling=y,h=y,c=v}if(f===l.length)return r(n,c),u;if(null===c){for(;f<l.length;f++)(c=d(n,l[f],s))&&(o=i(c,o,f),null===h?u=c:h.sibling=c,h=c);return u}for(c=a(n,c);f<l.length;f++)(v=p(c,n,f,l[f],s))&&(e&&null!==v.alternate&&c.delete(null===v.key?f:v.key),o=i(v,o,f),null===h?u=v:h.sibling=v,h=v);return e&&c.forEach(function(e){return t(n,e)}),u}function v(o,l,s,u){var h=te(s);"function"!=typeof h&&n("150"),null==(s=h.call(s))&&n("151");for(var c=h=null,f=l,v=l=0,y=null,g=s.next();null!==f&&!g.done;v++,g=s.next()){f.index>v?(y=f,f=null):y=f.sibling;var _=m(o,f,g.value,u);if(null===_){f||(f=y);break}e&&f&&null===_.alternate&&t(o,f),l=i(_,l,v),null===c?h=_:c.sibling=_,c=_,f=y}if(g.done)return r(o,f),h;if(null===f){for(;!g.done;v++,g=s.next())null!==(g=d(o,g.value,u))&&(l=i(g,l,v),null===c?h=g:c.sibling=g,c=g);return h}for(f=a(o,f);!g.done;v++,g=s.next())null!==(g=p(f,o,v,g.value,u))&&(e&&null!==g.alternate&&f.delete(null===g.key?v:g.key),l=i(g,l,v),null===c?h=g:c.sibling=g,c=g);return e&&f.forEach(function(e){return t(o,e)}),h}return function(e,a,i,s){var u="object"===(void 0===i?"undefined":ga(i))&&null!==i&&i.type===wn&&null===i.key;u&&(i=i.props.children);var h="object"===(void 0===i?"undefined":ga(i))&&null!==i;if(h)switch(i.$$typeof){case Tn:e:{for(h=i.key,u=a;null!==u;){if(u.key===h){if(9===u.tag?i.type===wn:u.type===i.type){r(e,u.sibling),a=o(u,i.type===wn?i.props.children:i.props,s),a.ref=lr(e,u,i),a.return=e,e=a;break e}r(e,u);break}t(e,u),u=u.sibling}i.type===wn?(a=It(i.props.children,e.mode,s,i.key),a.return=e,e=a):(s=At(i,e.mode,s),s.ref=lr(e,a,i),s.return=e,e=s)}return l(e);case xn:e:{for(u=i.key;null!==a;){if(a.key===u){if(6===a.tag&&a.stateNode.containerInfo===i.containerInfo&&a.stateNode.implementation===i.implementation){r(e,a.sibling),a=o(a,i.children||[],s),a.return=e,e=a;break e}r(e,a);break}t(e,a),a=a.sibling}a=Ct(i,e.mode,s),a.return=e,e=a}return l(e)}if("string"==typeof i||"number"==typeof i)return i=""+i,null!==a&&8===a.tag?(r(e,a.sibling),a=o(a,i,s),a.return=e,e=a):(r(e,a),a=zt(i,e.mode,s),a.return=e,e=a),l(e);if(ei(i))return f(e,a,i,s);if(te(i))return v(e,a,i,s);if(h&&sr(e,i),void 0===i&&!u)switch(e.tag){case 2:case 3:case 0:s=e.type,n("152",s.displayName||s.name||"Component")}return r(e,a)}}function hr(e,t){var r=new kt(7,null,null,0);r.type="DELETED",r.stateNode=t,r.return=e,r.effectTag=8,null!==e.lastEffect?(e.lastEffect.nextEffect=r,e.lastEffect=r):e.firstEffect=e.lastEffect=r}function cr(e,t){switch(e.tag){case 7:var r=e.type;return null!==(t=1!==t.nodeType||r.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,!0);case 8:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,!0);default:return!1}}function dr(e){if(oi){var t=ni;if(t){var r=t;if(!cr(e,t)){if(!(t=mt(r))||!cr(e,t))return e.effectTag|=2,oi=!1,void(ai=e);hr(ai,r)}ai=e,ni=pt(t)}else e.effectTag|=2,oi=!1,ai=e}}function mr(e){for(e=e.return;null!==e&&7!==e.tag&&5!==e.tag;)e=e.return;ai=e}function pr(e){if(e!==ai)return!1;if(!oi)return mr(e),oi=!0,!1;var t=e.type;if(7!==e.tag||"head"!==t&&"body"!==t&&!dt(t,e.memoizedProps))for(t=ni;t;)hr(e,t),t=mt(t);return mr(e),ni=ai?mt(e.stateNode):null,!0}function fr(){ni=ai=null,oi=!1}function vr(e){switch(e._reactStatus){case 1:return e._reactResult;case 2:throw e._reactResult;case 0:throw e;default:throw e._reactStatus=0,e.then(function(t){if(0===e._reactStatus){if(e._reactStatus=1,"object"===(void 0===t?"undefined":ga(t))&&null!==t){var r=t.default;t=void 0!==r&&null!==r?r:t}e._reactResult=t}},function(t){0===e._reactStatus&&(e._reactStatus=2,e._reactResult=t)}),e}}function yr(e,t,r,a){t.child=null===e?ri(t,null,r,a):ti(t,e.child,r,a)}function gr(e,t,r,a,n){r=r.render;var o=t.ref;return jo.current||t.memoizedProps!==a||o!==(null!==e?e.ref:null)?(r=r(a,o),yr(e,t,r,n),t.memoizedProps=a,t.child):Sr(e,t,n)}function _r(e,t){var r=t.ref;(null===e&&null!==r||null!==e&&e.ref!==r)&&(t.effectTag|=128)}function Tr(e,t,r,a,n){var o=gt(r)?Bo:Fo.current;return o=yt(t,o),Jt(t,n),r=r(a,o),t.effectTag|=1,yr(e,t,r,n),t.memoizedProps=a,t.child}function xr(e,t,r,a,n){if(gt(r)){var o=!0;Nt(t)}else o=!1;if(Jt(t,n),null===e)if(null===t.stateNode){var i=gt(r)?Bo:Fo.current,l=r.contextTypes,s=null!==l&&void 0!==l;l=s?yt(t,i):Oo;var u=new r(a,l);t.memoizedState=null!==u.state&&void 0!==u.state?u.state:null,u.updater=Qo,t.stateNode=u,u._reactInternalFiber=t,s&&(s=t.stateNode,s.__reactInternalMemoizedUnmaskedChildContext=i,s.__reactInternalMemoizedMaskedChildContext=l),ir(t,r,a,n),a=!0}else{i=t.stateNode,l=t.memoizedProps,i.props=l;var h=i.context;s=gt(r)?Bo:Fo.current,s=yt(t,s);var c=r.getDerivedStateFromProps;(u="function"==typeof c||"function"==typeof i.getSnapshotBeforeUpdate)||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(l!==a||h!==s)&&or(t,i,a,s),Go=!1;var d=t.memoizedState;h=i.state=d;var m=t.updateQueue;null!==m&&(Wt(t,m,a,i,n),h=t.memoizedState),l!==a||d!==h||jo.current||Go?("function"==typeof c&&(ar(t,r,c,a),h=t.memoizedState),(l=Go||nr(t,r,l,a,d,h,s))?(u||"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=h),i.props=a,i.state=h,i.context=s,a=l):("function"==typeof i.componentDidMount&&(t.effectTag|=4),a=!1)}else i=t.stateNode,l=t.memoizedProps,i.props=l,h=i.context,s=gt(r)?Bo:Fo.current,s=yt(t,s),c=r.getDerivedStateFromProps,(u="function"==typeof c||"function"==typeof i.getSnapshotBeforeUpdate)||"function"!=typeof i.UNSAFE_componentWillReceiveProps&&"function"!=typeof i.componentWillReceiveProps||(l!==a||h!==s)&&or(t,i,a,s),Go=!1,h=t.memoizedState,d=i.state=h,m=t.updateQueue,null!==m&&(Wt(t,m,a,i,n),d=t.memoizedState),l!==a||h!==d||jo.current||Go?("function"==typeof c&&(ar(t,r,c,a),d=t.memoizedState),(c=Go||nr(t,r,l,a,h,d,s))?(u||"function"!=typeof i.UNSAFE_componentWillUpdate&&"function"!=typeof i.componentWillUpdate||("function"==typeof i.componentWillUpdate&&i.componentWillUpdate(a,d,s),"function"==typeof i.UNSAFE_componentWillUpdate&&i.UNSAFE_componentWillUpdate(a,d,s)),"function"==typeof i.componentDidUpdate&&(t.effectTag|=4),"function"==typeof i.getSnapshotBeforeUpdate&&(t.effectTag|=256)):("function"!=typeof i.componentDidUpdate||l===e.memoizedProps&&h===e.memoizedState||(t.effectTag|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&h===e.memoizedState||(t.effectTag|=256),t.memoizedProps=a,t.memoizedState=d),i.props=a,i.state=d,i.context=s,a=c):("function"!=typeof i.componentDidUpdate||l===e.memoizedProps&&h===e.memoizedState||(t.effectTag|=4),"function"!=typeof i.getSnapshotBeforeUpdate||l===e.memoizedProps&&h===e.memoizedState||(t.effectTag|=256),a=!1);return wr(e,t,r,a,o,n)}function wr(e,t,r,a,n,o){_r(e,t);var i=0!=(64&t.effectTag);if(!a&&!i)return n&&bt(t,r,!1),Sr(e,t,o);a=t.stateNode,ii.current=t;var l=i?null:a.render();return t.effectTag|=1,null!==e&&i&&(yr(e,t,null,o),t.child=null),yr(e,t,l,o),t.memoizedState=a.state,t.memoizedProps=a.props,n&&bt(t,r,!0),t.child}function Nr(e){var t=e.stateNode;t.pendingContext?xt(e,t.pendingContext,t.pendingContext!==t.context):t.context&&xt(e,t.context,!1),Qt(e,t.containerInfo)}function br(e,t){if(e&&e.defaultProps){t=Ta({},t),e=e.defaultProps;for(var r in e)void 0===t[r]&&(t[r]=e[r])}return t}function Lr(e,t,r,a){null!==e&&n("155");var o=t.pendingProps;if("object"===(void 0===r?"undefined":ga(r))&&null!==r&&"function"==typeof r.then){r=vr(r);var i=r;i="function"==typeof i?Dt(i)?3:1:void 0!==i&&null!==i&&i.$$typeof?14:4,i=t.tag=i;var l=br(r,o);switch(i){case 1:return Tr(e,t,r,l,a);case 3:return xr(e,t,r,l,a);case 14:return gr(e,t,r,l,a);default:n("283",r)}}if(i=yt(t,Fo.current),Jt(t,a),i=r(o,i),t.effectTag|=1,"object"===(void 0===i?"undefined":ga(i))&&null!==i&&"function"==typeof i.render&&void 0===i.$$typeof){t.tag=2,gt(r)?(l=!0,Nt(t)):l=!1,t.memoizedState=null!==i.state&&void 0!==i.state?i.state:null;var s=r.getDerivedStateFromProps;return"function"==typeof s&&ar(t,r,s,o),i.updater=Qo,t.stateNode=i,i._reactInternalFiber=t,ir(t,r,o,a),wr(e,t,r,!0,l,a)}return t.tag=0,yr(e,t,i,a),t.memoizedProps=o,t.child}function Sr(e,t,r){null!==e&&(t.firstContextDependency=e.firstContextDependency);var a=t.childExpirationTime;if(0===a||a>r)return null;if(null!==e&&t.child!==e.child&&n("153"),null!==t.child){for(e=t.child,r=Mt(e,e.pendingProps,e.expirationTime),t.child=r,r.return=t;null!==e.sibling;)e=e.sibling,r=r.sibling=Mt(e,e.pendingProps,e.expirationTime),r.return=t;r.sibling=null}return t.child}function kr(e,t,r){var a=t.expirationTime;if(!jo.current&&(0===a||a>r)){switch(t.tag){case 5:Nr(t),fr();break;case 7:tr(t);break;case 2:gt(t.type)&&Nt(t);break;case 3:gt(t.type._reactResult)&&Nt(t);break;case 6:Qt(t,t.stateNode.containerInfo);break;case 12:Zt(t,t.memoizedProps.value)}return Sr(e,t,r)}switch(t.expirationTime=0,t.tag){case 4:return Lr(e,t,t.type,r);case 0:return Tr(e,t,t.type,t.pendingProps,r);case 1:var o=t.type._reactResult;return a=t.pendingProps,e=Tr(e,t,o,br(o,a),r),t.memoizedProps=a,e;case 2:return xr(e,t,t.type,t.pendingProps,r);case 3:return o=t.type._reactResult,a=t.pendingProps,e=xr(e,t,o,br(o,a),r),t.memoizedProps=a,e;case 5:return Nr(t),a=t.updateQueue,null===a&&n("282"),o=t.memoizedState,o=null!==o?o.element:null,Wt(t,a,t.pendingProps,null,r),a=t.memoizedState.element,a===o?(fr(),t=Sr(e,t,r)):(o=t.stateNode,(o=(null===e||null===e.child)&&o.hydrate)&&(ni=pt(t.stateNode.containerInfo),ai=t,o=oi=!0),o?(t.effectTag|=2,t.child=ri(t,null,a,r)):(yr(e,t,a,r),fr()),t=t.child),t;case 7:tr(t),null===e&&dr(t),a=t.type,o=t.pendingProps;var i=null!==e?e.memoizedProps:null,l=o.children;return dt(a,o)?l=null:null!==i&&dt(a,i)&&(t.effectTag|=16),_r(e,t),1073741823!==r&&1&t.mode&&o.hidden?(t.expirationTime=1073741823,t.memoizedProps=o,t=null):(yr(e,t,l,r),t.memoizedProps=o,t=t.child),t;case 8:return null===e&&dr(t),t.memoizedProps=t.pendingProps,null;case 16:return null;case 6:return Qt(t,t.stateNode.containerInfo),a=t.pendingProps,null===e?t.child=ti(t,null,a,r):yr(e,t,a,r),t.memoizedProps=a,t.child;case 13:return gr(e,t,t.type,t.pendingProps,r);case 14:return o=t.type._reactResult,a=t.pendingProps,e=gr(e,t,o,br(o,a),r),t.memoizedProps=a,e;case 9:return a=t.pendingProps,yr(e,t,a,r),t.memoizedProps=a,t.child;case 10:return a=t.pendingProps.children,yr(e,t,a,r),t.memoizedProps=a,t.child;case 15:return a=t.pendingProps,yr(e,t,a.children,r),t.memoizedProps=a,t.child;case 12:e:{if(a=t.type._context,o=t.pendingProps,l=t.memoizedProps,i=o.value,t.memoizedProps=o,Zt(t,i),null!==l){var s=l.value;if(0==(i=s===i&&(0!==s||1/s==1/i)||s!==s&&i!==i?0:0|("function"==typeof a._calculateChangedBits?a._calculateChangedBits(s,i):1073741823))){if(l.children===o.children&&!jo.current){t=Sr(e,t,r);break e}}else for(null!==(l=t.child)&&(l.return=t);null!==l;){if(null!==(s=l.firstContextDependency))do{if(s.context===a&&0!=(s.observedBits&i)){if(2===l.tag||3===l.tag){var u=Ft(r);u.tag=2,Bt(l,u)}(0===l.expirationTime||l.expirationTime>r)&&(l.expirationTime=r),null!==(u=l.alternate)&&(0===u.expirationTime||u.expirationTime>r)&&(u.expirationTime=r);for(var h=l.return;null!==h;){if(u=h.alternate,0===h.childExpirationTime||h.childExpirationTime>r)h.childExpirationTime=r,null!==u&&(0===u.childExpirationTime||u.childExpirationTime>r)&&(u.childExpirationTime=r);else{if(null===u||!(0===u.childExpirationTime||u.childExpirationTime>r))break;u.childExpirationTime=r}h=h.return}}u=l.child,s=s.next}while(null!==s);else u=12===l.tag&&l.type===t.type?null:l.child;if(null!==u)u.return=l;else for(u=l;null!==u;){if(u===t){u=null;break}if(null!==(l=u.sibling)){l.return=u.return,u=l;break}u=u.return}l=u}}yr(e,t,o.children,r),t=t.child}return t;case 11:return i=t.type,a=t.pendingProps,o=a.children,Jt(t,r),i=Xt(i,a.unstable_observedBits),o=o(i),t.effectTag|=1,yr(e,t,o,r),t.memoizedProps=a,t.child;default:n("156")}}function Dr(e){e.effectTag|=4}function Mr(e,t){var r=t.source,a=t.stack;null===a&&null!==r&&(a=ae(r)),null!==r&&re(r.type),t=t.value,null!==e&&2===e.tag&&re(e.type);try{console.error(t)}catch(e){setTimeout(function(){throw e})}}function Ar(e){var t=e.ref;if(null!==t)if("function"==typeof t)try{t(null)}catch(t){Gr(e,t)}else t.current=null}function Ir(e){switch("function"==typeof Vo&&Vo(e),e.tag){case 2:case 3:Ar(e);var t=e.stateNode;if("function"==typeof t.componentWillUnmount)try{t.props=e.memoizedProps,t.state=e.memoizedState,t.componentWillUnmount()}catch(t){Gr(e,t)}break;case 7:Ar(e);break;case 6:Rr(e)}}function zr(e){return 7===e.tag||5===e.tag||6===e.tag}function Cr(e){e:{for(var t=e.return;null!==t;){if(zr(t)){var r=t;break e}t=t.return}n("160"),r=void 0}var a=t=void 0;switch(r.tag){case 7:t=r.stateNode,a=!1;break;case 5:case 6:t=r.stateNode.containerInfo,a=!0;break;default:n("161")}16&r.effectTag&&(ot(t,""),r.effectTag&=-17);e:t:for(r=e;;){for(;null===r.sibling;){if(null===r.return||zr(r.return)){r=null;break e}r=r.return}for(r.sibling.return=r.return,r=r.sibling;7!==r.tag&&8!==r.tag;){if(2&r.effectTag)continue t;if(null===r.child||6===r.tag)continue t;r.child.return=r,r=r.child}if(!(2&r.effectTag)){r=r.stateNode;break e}}for(var o=e;;){if(7===o.tag||8===o.tag)if(r)if(a){var i=t,l=o.stateNode,s=r;8===i.nodeType?i.parentNode.insertBefore(l,s):i.insertBefore(l,s)}else t.insertBefore(o.stateNode,r);else a?(i=t,l=o.stateNode,8===i.nodeType?(s=i.parentNode,s.insertBefore(l,i)):(s=i,s.appendChild(l)),null===s.onclick&&(s.onclick=ht)):t.appendChild(o.stateNode);else if(6!==o.tag&&null!==o.child){o.child.return=o,o=o.child;continue}if(o===e)break;for(;null===o.sibling;){if(null===o.return||o.return===e)return;o=o.return}o.sibling.return=o.return,o=o.sibling}}function Rr(e){for(var t=e,r=!1,a=void 0,o=void 0;;){if(!r){r=t.return;e:for(;;){switch(null===r&&n("160"),r.tag){case 7:a=r.stateNode,o=!1;break e;case 5:case 6:a=r.stateNode.containerInfo,o=!0;break e}r=r.return}r=!0}if(7===t.tag||8===t.tag){e:for(var i=t,l=i;;)if(Ir(l),null!==l.child&&6!==l.tag)l.child.return=l,l=l.child;else{if(l===i)break;for(;null===l.sibling;){if(null===l.return||l.return===i)break e;l=l.return}l.sibling.return=l.return,l=l.sibling}o?(i=a,l=t.stateNode,8===i.nodeType?i.parentNode.removeChild(l):i.removeChild(l)):a.removeChild(t.stateNode)}else if(6===t.tag?(a=t.stateNode.containerInfo,o=!0):Ir(t),null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return;t=t.return,6===t.tag&&(r=!1)}t.sibling.return=t.return,t=t.sibling}}function Er(e,t){switch(t.tag){case 2:case 3:break;case 7:var r=t.stateNode;if(null!=r){var a=t.memoizedProps,o=null!==e?e.memoizedProps:a;e=t.type;var i=t.updateQueue;if(t.updateQueue=null,null!==i){for(r[Ba]=a,"input"===e&&"radio"===a.type&&null!=a.name&&me(r,a),st(e,o),t=st(e,a),o=0;o<i.length;o+=2){var l=i[o],s=i[o+1];"style"===l?it(r,s):"dangerouslySetInnerHTML"===l?Mo(r,s):"children"===l?ot(r,s):ue(r,l,s,t)}switch(e){case"input":pe(r,a);break;case"textarea":tt(r,a);break;case"select":e=r._wrapperState.wasMultiple,r._wrapperState.wasMultiple=!!a.multiple,i=a.value,null!=i?$e(r,!!a.multiple,i,!1):e!==!!a.multiple&&(null!=a.defaultValue?$e(r,!!a.multiple,a.defaultValue,!0):$e(r,!!a.multiple,a.multiple?[]:"",!1))}}}break;case 8:null===t.stateNode&&n("162"),t.stateNode.nodeValue=t.memoizedProps;break;case 5:case 15:case 16:break;default:n("163")}}function Pr(e,t,r){r=Ft(r),r.tag=3,r.payload={element:null};var a=t.value;return r.callback=function(){ra(a),Mr(e,t)},r}function Or(e,t,r){r=Ft(r),r.tag=3;var a=e.stateNode;return null!==a&&"function"==typeof a.componentDidCatch&&(r.callback=function(){null===xi?xi=new Set([this]):xi.add(this);var r=t.value,a=t.stack;Mr(e,t),this.componentDidCatch(r,{componentStack:null!==a?a:""})}),r}function Fr(e){switch(e.tag){case 2:gt(e.type)&&_t(e);var t=e.effectTag;return 1024&t?(e.effectTag=-1025&t|64,e):null;case 3:return gt(e.type._reactResult)&&_t(e),t=e.effectTag,1024&t?(e.effectTag=-1025&t|64,e):null;case 5:return er(e),Tt(e),t=e.effectTag,0!=(64&t)&&n("285"),e.effectTag=-1025&t|64,e;case 7:return rr(e),null;case 16:return t=e.effectTag,1024&t?(e.effectTag=-1025&t|64,e):null;case 6:return er(e),null;case 12:return Kt(e),null;default:return null}}function jr(){if(null!==fi)for(var e=fi.return;null!==e;){var t=e;switch(t.tag){case 2:var r=t.type.childContextTypes;null!==r&&void 0!==r&&_t(t);break;case 3:null!==(r=t.type._reactResult.childContextTypes)&&void 0!==r&&_t(t);break;case 5:er(t),Tt(t);break;case 7:rr(t);break;case 6:er(t);break;case 12:Kt(t)}e=e.return}vi=null,yi=0,gi=!1,fi=null}function Br(e){for(;;){var t=e.alternate,r=e.return,a=e.sibling;if(0==(512&e.effectTag)){var o=t;t=e;var i=t.pendingProps;switch(t.tag){case 0:case 1:break;case 2:gt(t.type)&&_t(t);break;case 3:gt(t.type._reactResult)&&_t(t);break;case 5:er(t),Tt(t),i=t.stateNode,i.pendingContext&&(i.context=i.pendingContext,i.pendingContext=null),null!==o&&null!==o.child||(pr(t),t.effectTag&=-3),li(t);break;case 7:rr(t);var l=$t(Xo.current),s=t.type;if(null!==o&&null!=t.stateNode)si(o,t,s,i,l),o.ref!==t.ref&&(t.effectTag|=128);else if(i){var u=$t(Ko.current);if(pr(t)){i=t,o=i.stateNode;var h=i.type,c=i.memoizedProps,d=l;switch(o[ja]=i,o[Ba]=c,s=void 0,l=h){case"iframe":case"object":Fe("load",o);break;case"video":case"audio":for(h=0;h<Ka.length;h++)Fe(Ka[h],o);break;case"source":Fe("error",o);break;case"img":case"image":case"link":Fe("error",o),Fe("load",o);break;case"form":Fe("reset",o),Fe("submit",o);break;case"details":Fe("toggle",o);break;case"input":de(o,c),Fe("invalid",o),ut(d,"onChange");break;case"select":o._wrapperState={wasMultiple:!!c.multiple},Fe("invalid",o),ut(d,"onChange");break;case"textarea":et(o,c),Fe("invalid",o),ut(d,"onChange")}lt(l,c),h=null;for(s in c)c.hasOwnProperty(s)&&(u=c[s],"children"===s?"string"==typeof u?o.textContent!==u&&(h=["children",u]):"number"==typeof u&&o.textContent!==""+u&&(h=["children",""+u]):Ia.hasOwnProperty(s)&&null!=u&&ut(d,s));switch(l){case"input":Q(o),fe(o,c,!0);break;case"textarea":Q(o),rt(o,c);break;case"select":case"option":break;default:"function"==typeof c.onClick&&(o.onclick=ht)}s=h,i.updateQueue=s,(i=null!==s)&&Dr(t)}else{c=t,o=s,d=i,h=9===l.nodeType?l:l.ownerDocument,u===ko.html&&(u=at(o)),u===ko.html?"script"===o?(o=h.createElement("div"),o.innerHTML="<script><\/script>",h=o.removeChild(o.firstChild)):"string"==typeof d.is?h=h.createElement(o,{is:d.is}):(h=h.createElement(o),"select"===o&&d.multiple&&(h.multiple=!0)):h=h.createElementNS(u,o),o=h,o[ja]=c,o[Ba]=i;e:for(c=o,d=t,h=d.child;null!==h;){if(7===h.tag||8===h.tag)c.appendChild(h.stateNode);else if(6!==h.tag&&null!==h.child){h.child.return=h,h=h.child;continue}if(h===d)break;for(;null===h.sibling;){if(null===h.return||h.return===d)break e;h=h.return}h.sibling.return=h.return,h=h.sibling}d=o,h=s,c=i;var m=l,p=st(h,c);switch(h){case"iframe":case"object":Fe("load",d),l=c;break;case"video":case"audio":for(l=0;l<Ka.length;l++)Fe(Ka[l],d);l=c;break;case"source":Fe("error",d),l=c;break;case"img":case"image":case"link":Fe("error",d),Fe("load",d),l=c;break;case"form":Fe("reset",d),Fe("submit",d),l=c;break;case"details":Fe("toggle",d),l=c;break;case"input":de(d,c),l=ce(d,c),Fe("invalid",d),ut(m,"onChange");break;case"option":l=Xe(d,c);break;case"select":d._wrapperState={wasMultiple:!!c.multiple},l=Ta({},c,{value:void 0}),Fe("invalid",d),ut(m,"onChange");break;case"textarea":et(d,c),l=Qe(d,c),Fe("invalid",d),ut(m,"onChange");break;default:l=c}lt(h,l),u=void 0;var f=h,v=d,y=l;for(u in y)if(y.hasOwnProperty(u)){var g=y[u];"style"===u?it(v,g):"dangerouslySetInnerHTML"===u?null!=(g=g?g.__html:void 0)&&Mo(v,g):"children"===u?"string"==typeof g?("textarea"!==f||""!==g)&&ot(v,g):"number"==typeof g&&ot(v,""+g):"suppressContentEditableWarning"!==u&&"suppressHydrationWarning"!==u&&"autoFocus"!==u&&(Ia.hasOwnProperty(u)?null!=g&&ut(m,u):null!=g&&ue(v,u,g,p))}switch(h){case"input":Q(d),fe(d,c,!1);break;case"textarea":Q(d),rt(d,c);break;case"option":null!=c.value&&d.setAttribute("value",""+he(c.value));break;case"select":l=d,l.multiple=!!c.multiple,d=c.value,null!=d?$e(l,!!c.multiple,d,!1):null!=c.defaultValue&&$e(l,!!c.multiple,c.defaultValue,!0);break;default:"function"==typeof l.onClick&&(d.onclick=ht)}(i=ct(s,i))&&Dr(t),t.stateNode=o}null!==t.ref&&(t.effectTag|=128)}else null===t.stateNode&&n("166");break;case 8:o&&null!=t.stateNode?ui(o,t,o.memoizedProps,i):("string"!=typeof i&&null===t.stateNode&&n("166"),o=$t(Xo.current),$t(Ko.current),pr(t)?(i=t,s=i.stateNode,o=i.memoizedProps,s[ja]=i,(i=s.nodeValue!==o)&&Dr(t)):(s=t,i=(9===o.nodeType?o:o.ownerDocument).createTextNode(i),i[ja]=s,t.stateNode=i));break;case 13:case 14:case 16:case 9:case 10:case 15:break;case 6:er(t),li(t);break;case 12:Kt(t);break;case 11:break;case 4:n("167");default:n("156")}if(t=fi=null,i=e,1073741823===yi||1073741823!==i.childExpirationTime){for(s=0,o=i.child;null!==o;)l=o.expirationTime,c=o.childExpirationTime,(0===s||0!==l&&l<s)&&(s=l),(0===s||0!==c&&c<s)&&(s=c),o=o.sibling;i.childExpirationTime=s}if(null!==t)return t;null!==r&&0==(512&r.effectTag)&&(null===r.firstEffect&&(r.firstEffect=e.firstEffect),null!==e.lastEffect&&(null!==r.lastEffect&&(r.lastEffect.nextEffect=e.firstEffect),r.lastEffect=e.lastEffect),1<e.effectTag&&(null!==r.lastEffect?r.lastEffect.nextEffect=e:r.firstEffect=e,r.lastEffect=e))}else{if(null!==(e=Fr(e,yi)))return e.effectTag&=511,e;null!==r&&(r.firstEffect=r.lastEffect=null,r.effectTag|=512)}if(null!==a)return a;if(null===r)break;e=r}return null}function Hr(e){var t=kr(e.alternate,e,yi);return null===t&&(t=Br(e)),ci.current=null,t}function Vr(e,t,r){pi&&n("243"),pi=!0,ci.currentDispatcher=hi;var a=e.nextExpirationTimeToWorkOn;a===yi&&e===vi&&null!==fi||(jr(),vi=e,yi=a,fi=Mt(vi.current,null,yi),e.pendingCommitExpirationTime=0);for(var o=!1;;){try{if(t)for(;null!==fi&&!ta();)fi=Hr(fi);else for(;null!==fi;)fi=Hr(fi)}catch(e){if(null===fi)o=!0,ra(e);else{null===fi&&n("271");var i=fi,l=i.return;if(null!==l){e:{var s=l,u=i,h=e;l=yi,u.effectTag|=512,u.firstEffect=u.lastEffect=null,gi=!0,h=Yt(h,u);do{switch(s.tag){case 5:s.effectTag|=1024,s.expirationTime=l,l=Pr(s,h,l),Ht(s,l);break e;case 2:case 3:u=h;var c=s.stateNode;if(0==(64&s.effectTag)&&null!==c&&"function"==typeof c.componentDidCatch&&(null===xi||!xi.has(c))){s.effectTag|=1024,s.expirationTime=l,l=Or(s,u,l),Ht(s,l);break e}}s=s.return}while(null!==s)}fi=Br(i);continue}o=!0,ra(e)}}break}if(pi=!1,Yo=qo=Uo=ci.currentDispatcher=null,o)vi=null,e.finishedWork=null;else if(null!==fi)e.finishedWork=null;else{if(t=e.current.alternate,null===t&&n("281"),vi=null,gi){if(o=e.latestPendingTime,i=e.latestSuspendedTime,l=e.latestPingedTime,0!==o&&o>a||0!==i&&i>a||0!==l&&l>a)return e.didError=!1,r=e.latestPingedTime,0!==r&&r<=a&&(e.latestPingedTime=0),r=e.earliestPendingTime,t=e.latestPendingTime,r===a?e.earliestPendingTime=t===a?e.latestPendingTime=0:t:t===a&&(e.latestPendingTime=r),r=e.earliestSuspendedTime,t=e.latestSuspendedTime,0===r?e.earliestSuspendedTime=e.latestSuspendedTime=a:r>a?e.earliestSuspendedTime=a:t<a&&(e.latestSuspendedTime=a),Et(a,e),void(e.expirationTime=e.expirationTime);if(!e.didError&&!r)return e.didError=!0,e.nextExpirationTimeToWorkOn=a,a=e.expirationTime=1,void(e.expirationTime=a)}e.pendingCommitExpirationTime=a,e.finishedWork=t}}function Gr(e,t){var r;e:{for(pi&&!Ti&&n("263"),r=e.return;null!==r;){switch(r.tag){case 2:case 3:var a=r.stateNode;if("function"==typeof r.type.getDerivedStateFromCatch||"function"==typeof a.componentDidCatch&&(null===xi||!xi.has(a))){e=Yt(t,e),e=Or(r,e,1),Bt(r,e),Ur(r,1),r=void 0;break e}break;case 5:e=Yt(t,e),e=Pr(r,e,1),Bt(r,e),Ur(r,1),r=void 0;break e}r=r.return}5===e.tag&&(r=Yt(t,e),r=Pr(e,r,1),Bt(e,r),Ur(e,1)),r=void 0}return r}function Wr(e,t){return 0!==mi?e=mi:pi?e=Ti?1:yi:1&t.mode?(e=Pi?2+10*(1+((e-2+15)/10|0)):2+25*(1+((e-2+500)/25|0)),null!==vi&&e===yi&&(e+=1)):e=1,Pi&&(0===Mi||e>Mi)&&(Mi=e),e}function Ur(e,t){e:{(0===e.expirationTime||e.expirationTime>t)&&(e.expirationTime=t);var r=e.alternate;null!==r&&(0===r.expirationTime||r.expirationTime>t)&&(r.expirationTime=t);var a=e.return;if(null===a&&5===e.tag)e=e.stateNode;else{for(;null!==a;){if(r=a.alternate,(0===a.childExpirationTime||a.childExpirationTime>t)&&(a.childExpirationTime=t),null!==r&&(0===r.childExpirationTime||r.childExpirationTime>t)&&(r.childExpirationTime=t),null===a.return&&5===a.tag){e=a.stateNode;break e}a=a.return}e=null}}null!==e&&(!pi&&0!==yi&&t<yi&&jr(),Rt(e,t),pi&&!Ti&&vi===e||(t=e,e=e.expirationTime,null===t.nextScheduledRoot?(t.expirationTime=e,null===Ni?(wi=Ni=t,t.nextScheduledRoot=t):(Ni=Ni.nextScheduledRoot=t,Ni.nextScheduledRoot=wi)):(0===(r=t.expirationTime)||e<r)&&(t.expirationTime=e),Si||(Ri?Ei&&(ki=t,Di=1,Qr(t,1,!0)):1===e?$r(1,null):Zr(t,e))),Vi>Hi&&(Vi=0,n("185")))}function qr(e,t,r,a,n){var o=mi;mi=1;try{return e(t,r,a,n)}finally{mi=o}}function Yr(){ji=2+((xa.unstable_now()-Fi)/10|0)}function Zr(e,t){if(0!==bi){if(t>bi)return;null!==Li&&xa.unstable_cancelScheduledWork(Li)}bi=t,e=xa.unstable_now()-Fi,Li=xa.unstable_scheduleWork(Xr,{timeout:10*(t-2)-e})}function Kr(){return Si?Bi:(Jr(),0!==Di&&1073741823!==Di||(Yr(),Bi=ji),Bi)}function Jr(){var e=0,t=null;if(null!==Ni)for(var r=Ni,a=wi;null!==a;){var o=a.expirationTime;if(0===o){if((null===r||null===Ni)&&n("244"),a===a.nextScheduledRoot){wi=Ni=a.nextScheduledRoot=null;break}if(a===wi)wi=o=a.nextScheduledRoot,Ni.nextScheduledRoot=o,a.nextScheduledRoot=null;else{if(a===Ni){Ni=r,Ni.nextScheduledRoot=wi,a.nextScheduledRoot=null;break}r.nextScheduledRoot=a.nextScheduledRoot,a.nextScheduledRoot=null}a=r.nextScheduledRoot}else{if((0===e||o<e)&&(e=o,t=a),a===Ni)break;if(1===e)break;r=a,a=a.nextScheduledRoot}}ki=t,Di=e}function Xr(e){if(e.didTimeout&&null!==wi){Yr();var t=wi;do{var r=t.expirationTime;0!==r&&ji>=r&&(t.nextExpirationTimeToWorkOn=ji),t=t.nextScheduledRoot}while(t!==wi)}$r(0,e)}function $r(e,t){if(Ci=t,Jr(),null!==Ci)for(Yr(),Bi=ji;null!==ki&&0!==Di&&(0===e||e>=Di)&&(!Ai||ji>=Di);)Qr(ki,Di,ji>=Di),Jr(),Yr(),Bi=ji;else for(;null!==ki&&0!==Di&&(0===e||e>=Di);)Qr(ki,Di,!0),Jr();if(null!==Ci&&(bi=0,Li=null),0!==Di&&Zr(ki,Di),Ci=null,Ai=!1,Vi=0,Gi=null,null!==Oi)for(e=Oi,Oi=null,t=0;t<e.length;t++){var r=e[t];try{r._onComplete()}catch(e){Ii||(Ii=!0,zi=e)}}if(Ii)throw e=zi,zi=null,Ii=!1,e}function Qr(e,t,r){if(Si&&n("245"),Si=!0,null===Ci||r){var a=e.finishedWork;null!==a?ea(e,a,t):(e.finishedWork=null,Vr(e,!1,r),null!==(a=e.finishedWork)&&ea(e,a,t))}else a=e.finishedWork,null!==a?ea(e,a,t):(e.finishedWork=null,Vr(e,!0,r),null!==(a=e.finishedWork)&&(ta()?e.finishedWork=a:ea(e,a,t)));Si=!1}function ea(e,t,r){var a=e.firstBatch;if(null!==a&&a._expirationTime<=r&&(null===Oi?Oi=[a]:Oi.push(a),a._defer))return e.finishedWork=t,void(e.expirationTime=0);e.finishedWork=null,e===Gi?Vi++:(Gi=e,Vi=0),Ti=pi=!0,e.current===t&&n("177"),r=e.pendingCommitExpirationTime,0===r&&n("261"),e.pendingCommitExpirationTime=0,a=t.expirationTime;var o=t.childExpirationTime;if(a=0===a||0!==o&&o<a?o:a,e.didError=!1,0===a?(e.earliestPendingTime=0,e.latestPendingTime=0,e.earliestSuspendedTime=0,e.latestSuspendedTime=0,e.latestPingedTime=0):(o=e.latestPendingTime,0!==o&&(o<a?e.earliestPendingTime=e.latestPendingTime=0:e.earliestPendingTime<a&&(e.earliestPendingTime=e.latestPendingTime)),o=e.earliestSuspendedTime,0===o?Rt(e,a):a>e.latestSuspendedTime?(e.earliestSuspendedTime=0,e.latestSuspendedTime=0,e.latestPingedTime=0,Rt(e,a)):a<o&&Rt(e,a)),Et(0,e),ci.current=null,1<t.effectTag?null!==t.lastEffect?(t.lastEffect.nextEffect=t,a=t.firstEffect):a=t:a=t.firstEffect,Co=vo,o=Ye(),Ze(o)){if("selectionStart"in o)var i={start:o.selectionStart,end:o.selectionEnd};else e:{i=(i=o.ownerDocument)&&i.defaultView||window;var l=i.getSelection&&i.getSelection();if(l&&0!==l.rangeCount){i=l.anchorNode;var s=l.anchorOffset,u=l.focusNode;l=l.focusOffset;try{i.nodeType,u.nodeType}catch(e){i=null;break e}var h=0,c=-1,d=-1,m=0,p=0,f=o,v=null;t:for(;;){for(var y;f!==i||0!==s&&3!==f.nodeType||(c=h+s),f!==u||0!==l&&3!==f.nodeType||(d=h+l),3===f.nodeType&&(h+=f.nodeValue.length),null!==(y=f.firstChild);)v=f,f=y;for(;;){if(f===o)break t;if(v===i&&++m===s&&(c=h),v===u&&++p===l&&(d=h),null!==(y=f.nextSibling))break;f=v,v=f.parentNode}f=y}i=-1===c||-1===d?null:{start:c,end:d}}else i=null}i=i||{start:0,end:0}}else i=null;for(Ro={focusedElem:o,selectionRange:i},vo=!1,_i=a;null!==_i;){o=!1,i=void 0;try{for(;null!==_i;){if(256&_i.effectTag){var g=_i.alternate;e:switch(s=_i,s.tag){case 2:case 3:if(256&s.effectTag&&null!==g){var _=g.memoizedProps,T=g.memoizedState,x=s.stateNode;x.props=s.memoizedProps,x.state=s.memoizedState;var w=x.getSnapshotBeforeUpdate(_,T);x.__reactInternalSnapshotBeforeUpdate=w}break e;case 5:case 7:case 8:case 6:break e;default:n("163")}}_i=_i.nextEffect}}catch(e){o=!0,i=e}o&&(null===_i&&n("178"),Gr(_i,i),null!==_i&&(_i=_i.nextEffect))}for(_i=a;null!==_i;){g=!1,_=void 0;try{for(;null!==_i;){var N=_i.effectTag;if(16&N&&ot(_i.stateNode,""),128&N){var b=_i.alternate;if(null!==b){var L=b.ref;null!==L&&("function"==typeof L?L(null):L.current=null)}}switch(14&N){case 2:Cr(_i),_i.effectTag&=-3;break;case 6:Cr(_i),_i.effectTag&=-3,Er(_i.alternate,_i);break;case 4:Er(_i.alternate,_i);break;case 8:T=_i,Rr(T),T.return=null,T.child=null,T.alternate&&(T.alternate.child=null,T.alternate.return=null)}_i=_i.nextEffect}}catch(e){g=!0,_=e}g&&(null===_i&&n("178"),Gr(_i,_),null!==_i&&(_i=_i.nextEffect))}if(L=Ro,b=Ye(),N=L.focusedElem,_=L.selectionRange,b!==N&&N&&N.ownerDocument&&qe(N.ownerDocument.documentElement,N)){null!==_&&Ze(N)&&(b=_.start,L=_.end,void 0===L&&(L=b),"selectionStart"in N?(N.selectionStart=b,N.selectionEnd=Math.min(L,N.value.length)):(g=N.ownerDocument||document,b=(g&&g.defaultView||window).getSelection(),T=N.textContent.length,L=Math.min(_.start,T),_=void 0===_.end?L:Math.min(_.end,T),!b.extend&&L>_&&(T=_,_=L,L=T),T=Ue(N,L),x=Ue(N,_),T&&x&&(1!==b.rangeCount||b.anchorNode!==T.node||b.anchorOffset!==T.offset||b.focusNode!==x.node||b.focusOffset!==x.offset)&&(g=g.createRange(),g.setStart(T.node,T.offset),b.removeAllRanges(),L>_?(b.addRange(g),b.extend(x.node,x.offset)):(g.setEnd(x.node,x.offset),b.addRange(g))))),b=[];for(L=N;L=L.parentNode;)1===L.nodeType&&b.push({element:L,left:L.scrollLeft,top:L.scrollTop});for("function"==typeof N.focus&&N.focus(),N=0;N<b.length;N++)L=b[N],L.element.scrollLeft=L.left,L.element.scrollTop=L.top}for(Ro=null,vo=!!Co,Co=null,e.current=t,_i=a;null!==_i;){a=!1,N=void 0;try{for(b=r;null!==_i;){var S=_i.effectTag;if(36&S){var k=_i.alternate;switch(L=_i,g=b,L.tag){case 2:case 3:var D=L.stateNode;if(4&L.effectTag)if(null===k)D.props=L.memoizedProps,D.state=L.memoizedState,D.componentDidMount();else{var M=k.memoizedProps,A=k.memoizedState;D.props=L.memoizedProps,D.state=L.memoizedState,D.componentDidUpdate(M,A,D.__reactInternalSnapshotBeforeUpdate)}var I=L.updateQueue;null!==I&&(D.props=L.memoizedProps,D.state=L.memoizedState,Ut(L,I,D,g));break;case 5:var z=L.updateQueue;if(null!==z){if(_=null,null!==L.child)switch(L.child.tag){case 7:_=L.child.stateNode;break;case 2:case 3:_=L.child.stateNode}Ut(L,z,_,g)}break;case 7:var C=L.stateNode;null===k&&4&L.effectTag&&ct(L.type,L.memoizedProps)&&C.focus();break;case 8:case 6:case 15:case 16:break;default:n("163")}}if(128&S){var R=_i.ref;if(null!==R){var E=_i.stateNode;switch(_i.tag){case 7:var P=E;break;default:P=E}"function"==typeof R?R(P):R.current=P}}var O=_i.nextEffect;_i.nextEffect=null,_i=O}}catch(e){a=!0,N=e}a&&(null===_i&&n("178"),Gr(_i,N),null!==_i&&(_i=_i.nextEffect))}pi=Ti=!1,"function"==typeof Ho&&Ho(t.stateNode),S=t.expirationTime,t=t.childExpirationTime,t=0===S||0!==t&&t<S?t:S,0===t&&(xi=null),e.expirationTime=t,e.finishedWork=null}function ta(){return!!Ai||!(null===Ci||Ci.timeRemaining()>Wi)&&(Ai=!0)}function ra(e){null===ki&&n("246"),ki.expirationTime=0,Ii||(Ii=!0,zi=e)}function aa(e,t){var r=Ri;Ri=!0;try{return e(t)}finally{(Ri=r)||Si||$r(1,null)}}function na(e,t){if(Ri&&!Ei){Ei=!0;try{return e(t)}finally{Ei=!1}}return e(t)}function oa(e,t,r){if(Pi)return e(t,r);Ri||Si||0===Mi||($r(Mi,null),Mi=0);var a=Pi,n=Ri;Ri=Pi=!0;try{return e(t,r)}finally{Pi=a,(Ri=n)||Si||$r(1,null)}}function ia(e){if(!e)return Oo;e=e._reactInternalFiber;e:{(2!==Ie(e)||2!==e.tag&&3!==e.tag)&&n("170");var t=e;do{switch(t.tag){case 5:t=t.stateNode.context;break e;case 2:if(gt(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}break;case 3:if(gt(t.type._reactResult)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(null!==t);n("171"),t=void 0}if(2===e.tag){var r=e.type;if(gt(r))return wt(e,r,t)}else if(3===e.tag&&(r=e.type._reactResult,gt(r)))return wt(e,r,t);return t}function la(e,t,r,a,n){var o=t.current;return r=ia(r),null===t.context?t.context=r:t.pendingContext=r,t=n,n=Ft(a),n.payload={element:e},t=void 0===t?null:t,null!==t&&(n.callback=t),Bt(o,n),Ur(o,a),a}function sa(e,t,r,a){var n=t.current;return n=Wr(Kr(),n),la(e,t,r,n,a)}function ua(e){if(e=e.current,!e.child)return null;switch(e.child.tag){case 7:default:return e.child.stateNode}}function ha(e,t,r){var a=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:xn,key:null==a?null:""+a,children:e,containerInfo:t,implementation:r}}function ca(e){var t=2+25*(1+((Kr()-2+500)/25|0));t<=di&&(t=di+1),this._expirationTime=di=t,this._root=e,this._callbacks=this._next=null,this._hasChildren=this._didComplete=!1,this._children=null,this._defer=!0}function da(){this._callbacks=null,this._didCommit=!1,this._onCommit=this._onCommit.bind(this)}function ma(e,t,r){t=new kt(5,null,null,t?3:0),e={current:t,containerInfo:e,pendingChildren:null,earliestPendingTime:0,latestPendingTime:0,earliestSuspendedTime:0,latestSuspendedTime:0,latestPingedTime:0,didError:!1,pendingCommitExpirationTime:0,finishedWork:null,timeoutHandle:-1,context:null,pendingContext:null,hydrate:r,nextExpirationTimeToWorkOn:0,expirationTime:0,firstBatch:null,nextScheduledRoot:null},this._internalRoot=t.stateNode=e}function pa(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function fa(e,t){if(t||(t=e?9===e.nodeType?e.documentElement:e.firstChild:null,t=!(!t||1!==t.nodeType||!t.hasAttribute("data-reactroot"))),!t)for(var r;r=e.lastChild;)e.removeChild(r);return new ma(e,!1,t)}function va(e,t,r,a,o){pa(r)||n("200");var i=r._reactRootContainer;if(i){if("function"==typeof o){var l=o;o=function(){var e=ua(i._internalRoot);l.call(e)}}null!=e?i.legacy_renderSubtreeIntoContainer(e,t,o):i.render(t,o)}else{if(i=r._reactRootContainer=fa(r,a),"function"==typeof o){var s=o;o=function(){var e=ua(i._internalRoot);s.call(e)}}na(function(){null!=e?i.legacy_renderSubtreeIntoContainer(e,t,o):i.render(t,o)})}return ua(i._internalRoot)}function ya(e,t){var r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;return pa(t)||n("200"),ha(e,t,null,r)}/** @license React v16.5.2 + * 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 ga="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},_a=r(15),Ta=r(186),xa=r(1183);_a||n("227");var wa=!1,Na=null,ba=!1,La=null,Sa={onError:function(e){wa=!0,Na=e}},ka=null,Da={},Ma=[],Aa={},Ia={},za={},Ca=null,Ra=null,Ea=null,Pa=null,Oa={injectEventPluginOrder:function(e){ka&&n("101"),ka=Array.prototype.slice.call(e),s()},injectEventPluginsByName:function(e){var t,r=!1;for(t in e)if(e.hasOwnProperty(t)){var a=e[t];Da.hasOwnProperty(t)&&Da[t]===a||(Da[t]&&n("102",t),Da[t]=a,r=!0)}r&&s()}},Fa=Math.random().toString(36).slice(2),ja="__reactInternalInstance$"+Fa,Ba="__reactEventHandlers$"+Fa,Ha=!("undefined"==typeof window||!window.document||!window.document.createElement),Va={animationend:D("Animation","AnimationEnd"),animationiteration:D("Animation","AnimationIteration"),animationstart:D("Animation","AnimationStart"),transitionend:D("Transition","TransitionEnd")},Ga={},Wa={};Ha&&(Wa=document.createElement("div").style,"AnimationEvent"in window||(delete Va.animationend.animation,delete Va.animationiteration.animation,delete Va.animationstart.animation),"TransitionEvent"in window||delete Va.transitionend.transition);var Ua=M("animationend"),qa=M("animationiteration"),Ya=M("animationstart"),Za=M("transitionend"),Ka="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Ja=null,Xa=null,$a=null;Ta(C.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=I)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=I)},persist:function(){this.isPersistent=I},isPersistent:z,destructor:function(){var e,t=this.constructor.Interface;for(e in t)this[e]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null,this.isPropagationStopped=this.isDefaultPrevented=z,this._dispatchInstances=this._dispatchListeners=null}}),C.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},C.extend=function(e){function t(){}function r(){return a.apply(this,arguments)}var a=this;t.prototype=a.prototype;var n=new t;return Ta(n,r.prototype),r.prototype=n,r.prototype.constructor=r,r.Interface=Ta({},a.Interface,e),r.extend=a.extend,P(r),r},P(C);var Qa=C.extend({data:null}),en=C.extend({data:null}),tn=[9,13,27,32],rn=Ha&&"CompositionEvent"in window,an=null;Ha&&"documentMode"in document&&(an=document.documentMode);var nn=Ha&&"TextEvent"in window&&!an,on=Ha&&(!rn||an&&8<an&&11>=an),ln=String.fromCharCode(32),sn={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(" ")}},un=!1,hn=!1,cn={eventTypes:sn,extractEvents:function(e,t,r,a){var n=void 0,o=void 0;if(rn)e:{switch(e){case"compositionstart":n=sn.compositionStart;break e;case"compositionend":n=sn.compositionEnd;break e;case"compositionupdate":n=sn.compositionUpdate;break e}n=void 0}else hn?O(e,r)&&(n=sn.compositionEnd):"keydown"===e&&229===r.keyCode&&(n=sn.compositionStart);return n?(on&&"ko"!==r.locale&&(hn||n!==sn.compositionStart?n===sn.compositionEnd&&hn&&(o=A()):(Ja=a,Xa="value"in Ja?Ja.value:Ja.textContent,hn=!0)),n=Qa.getPooled(n,t,r,a),o?n.data=o:null!==(o=F(r))&&(n.data=o),k(n),o=n):o=null,(e=nn?j(e,r):B(e,r))?(t=en.getPooled(sn.beforeInput,t,r,a),t.data=e,k(t)):t=null,null===o?t:null===t?o:[o,t]}},dn=null,mn=null,pn=null,fn=!1,vn={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},yn=_a.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,gn=/^(.*)[\\\/]/,_n="function"==typeof Symbol&&Symbol.for,Tn=_n?Symbol.for("react.element"):60103,xn=_n?Symbol.for("react.portal"):60106,wn=_n?Symbol.for("react.fragment"):60107,Nn=_n?Symbol.for("react.strict_mode"):60108,bn=_n?Symbol.for("react.profiler"):60114,Ln=_n?Symbol.for("react.provider"):60109,Sn=_n?Symbol.for("react.context"):60110,kn=_n?Symbol.for("react.async_mode"):60111,Dn=_n?Symbol.for("react.forward_ref"):60112,Mn=_n?Symbol.for("react.placeholder"):60113,An="function"==typeof Symbol&&Symbol.iterator,In=/^[: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]*$/,zn=Object.prototype.hasOwnProperty,Cn={},Rn={},En={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){En[e]=new le(e,0,!1,e,null)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];En[t]=new le(t,1,!1,e[1],null)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){En[e]=new le(e,2,!1,e.toLowerCase(),null)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){En[e]=new le(e,2,!1,e,null)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){En[e]=new le(e,3,!1,e.toLowerCase(),null)}),["checked","multiple","muted","selected"].forEach(function(e){En[e]=new le(e,3,!0,e,null)}),["capture","download"].forEach(function(e){En[e]=new le(e,4,!1,e,null)}),["cols","rows","size","span"].forEach(function(e){En[e]=new le(e,6,!1,e,null)}),["rowSpan","start"].forEach(function(e){En[e]=new le(e,5,!1,e.toLowerCase(),null)});var Pn=/[\-:]([a-z])/g;"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(Pn,se);En[t]=new le(t,1,!1,e,null)}),"xlink:actuate xlink:arcrole xlink:href xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(Pn,se);En[t]=new le(t,1,!1,e,"http://www.w3.org/1999/xlink")}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(Pn,se);En[t]=new le(t,1,!1,e,"http://www.w3.org/XML/1998/namespace")}),En.tabIndex=new le("tabIndex",1,!1,"tabindex",null);var On={change:{phasedRegistrationNames:{bubbled:"onChange",captured:"onChangeCapture"},dependencies:"blur change click focus input keydown keyup selectionchange".split(" ")}},Fn=null,jn=null,Bn=!1;Ha&&(Bn=J("input")&&(!document.documentMode||9<document.documentMode));var Hn={eventTypes:On,_isInputEventSupported:Bn,extractEvents:function(e,t,r,a){var n=t?T(t):window,o=void 0,i=void 0,l=n.nodeName&&n.nodeName.toLowerCase();if("select"===l||"input"===l&&"file"===n.type?o=Te:Z(n)?Bn?o=Se:(o=be,i=Ne):(l=n.nodeName)&&"input"===l.toLowerCase()&&("checkbox"===n.type||"radio"===n.type)&&(o=Le),o&&(o=o(e,t)))return ye(o,r,a);i&&i(e,n,t),"blur"===e&&(e=n._wrapperState)&&e.controlled&&"number"===n.type&&ve(n,"number",n.value)}},Vn=C.extend({view:null,detail:null}),Gn={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"},Wn=0,Un=0,qn=!1,Yn=!1,Zn=Vn.extend({screenX:null,screenY:null,clientX:null,clientY:null,pageX:null,pageY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:De,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=Wn;return Wn=e.screenX,qn?"mousemove"===e.type?e.screenX-t:0:(qn=!0,0)},movementY:function(e){if("movementY"in e)return e.movementY;var t=Un;return Un=e.screenY,Yn?"mousemove"===e.type?e.screenY-t:0:(Yn=!0,0)}}),Kn=Zn.extend({pointerId:null,width:null,height:null,pressure:null,tangentialPressure:null,tiltX:null,tiltY:null,twist:null,pointerType:null,isPrimary:null}),Jn={mouseEnter:{registrationName:"onMouseEnter",dependencies:["mouseout","mouseover"]},mouseLeave:{registrationName:"onMouseLeave",dependencies:["mouseout","mouseover"]},pointerEnter:{registrationName:"onPointerEnter",dependencies:["pointerout","pointerover"]},pointerLeave:{registrationName:"onPointerLeave",dependencies:["pointerout","pointerover"]}},Xn={eventTypes:Jn,extractEvents:function(e,t,r,a){var n="mouseover"===e||"pointerover"===e,o="mouseout"===e||"pointerout"===e;if(n&&(r.relatedTarget||r.fromElement)||!o&&!n)return null;if(n=a.window===a?a:(n=a.ownerDocument)?n.defaultView||n.parentWindow:window,o?(o=t,t=(t=r.relatedTarget||r.toElement)?g(t):null):o=null,o===t)return null;var i=void 0,l=void 0,s=void 0,u=void 0;"mouseout"===e||"mouseover"===e?(i=Zn,l=Jn.mouseLeave,s=Jn.mouseEnter,u="mouse"):"pointerout"!==e&&"pointerover"!==e||(i=Kn,l=Jn.pointerLeave,s=Jn.pointerEnter,u="pointer");var h=null==o?n:T(o);if(n=null==t?n:T(t),e=i.getPooled(l,o,r,a),e.type=u+"leave",e.target=h,e.relatedTarget=n,r=i.getPooled(s,t,r,a),r.type=u+"enter",r.target=n,r.relatedTarget=h,a=t,o&&a)e:{for(t=o,n=a,u=0,i=t;i;i=w(i))u++;for(i=0,s=n;s;s=w(s))i++;for(;0<u-i;)t=w(t),u--;for(;0<i-u;)n=w(n),i--;for(;u--;){if(t===n||t===n.alternate)break e;t=w(t),n=w(n)}t=null}else t=null;for(n=t,t=[];o&&o!==n&&(null===(u=o.alternate)||u!==n);)t.push(o),o=w(o);for(o=[];a&&a!==n&&(null===(u=a.alternate)||u!==n);)o.push(a),a=w(a);for(a=0;a<t.length;a++)L(t[a],"bubbled",e);for(a=o.length;0<a--;)L(o[a],"captured",r);return[e,r]}},$n=Object.prototype.hasOwnProperty,Qn=C.extend({animationName:null,elapsedTime:null,pseudoElement:null}),eo=C.extend({clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),to=Vn.extend({relatedTarget:null}),ro={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},ao={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"},no=Vn.extend({key:function(e){if(e.key){var t=ro[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?(e=Ee(e),13===e?"Enter":String.fromCharCode(e)):"keydown"===e.type||"keyup"===e.type?ao[e.keyCode]||"Unidentified":""},location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:De,charCode:function(e){return"keypress"===e.type?Ee(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?Ee(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),oo=Zn.extend({dataTransfer:null}),io=Vn.extend({touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:De}),lo=C.extend({propertyName:null,elapsedTime:null,pseudoElement:null}),so=Zn.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}),uo=[["abort","abort"],[Ua,"animationEnd"],[qa,"animationIteration"],[Ya,"animationStart"],["canplay","canPlay"],["canplaythrough","canPlayThrough"],["drag","drag"],["dragenter","dragEnter"],["dragexit","dragExit"],["dragleave","dragLeave"],["dragover","dragOver"],["durationchange","durationChange"],["emptied","emptied"],["encrypted","encrypted"],["ended","ended"],["error","error"],["gotpointercapture","gotPointerCapture"],["load","load"],["loadeddata","loadedData"],["loadedmetadata","loadedMetadata"],["loadstart","loadStart"],["lostpointercapture","lostPointerCapture"],["mousemove","mouseMove"],["mouseout","mouseOut"],["mouseover","mouseOver"],["playing","playing"],["pointermove","pointerMove"],["pointerout","pointerOut"],["pointerover","pointerOver"],["progress","progress"],["scroll","scroll"],["seeking","seeking"],["stalled","stalled"],["suspend","suspend"],["timeupdate","timeUpdate"],["toggle","toggle"],["touchmove","touchMove"],[Za,"transitionEnd"],["waiting","waiting"],["wheel","wheel"]],ho={},co={};[["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"]].forEach(function(e){Pe(e,!0)}),uo.forEach(function(e){Pe(e,!1)});var mo={eventTypes:ho,isInteractiveTopLevelEventType:function(e){return void 0!==(e=co[e])&&!0===e.isInteractive},extractEvents:function(e,t,r,a){var n=co[e];if(!n)return null;switch(e){case"keypress":if(0===Ee(r))return null;case"keydown":case"keyup":e=no;break;case"blur":case"focus":e=to;break;case"click":if(2===r.button)return null;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":e=Zn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":e=oo;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":e=io;break;case Ua:case qa:case Ya:e=Qn;break;case Za:e=lo;break;case"scroll":e=Vn;break;case"wheel":e=so;break;case"copy":case"cut":case"paste":e=eo;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":e=Kn;break;default:e=C}return t=e.getPooled(n,t,r,a),k(t),t}},po=mo.isInteractiveTopLevelEventType,fo=[],vo=!0,yo={},go=0,_o="_reactListenersID"+(""+Math.random()).slice(2),To=Ha&&"documentMode"in document&&11>=document.documentMode,xo={select:{phasedRegistrationNames:{bubbled:"onSelect",captured:"onSelectCapture"},dependencies:"blur contextmenu dragend focus keydown keyup mousedown mouseup selectionchange".split(" ")}},wo=null,No=null,bo=null,Lo=!1,So={eventTypes:xo,extractEvents:function(e,t,r,a){var n,o=a.window===a?a.document:9===a.nodeType?a:a.ownerDocument;if(!(n=!o)){e:{o=Ve(o),n=za.onSelect;for(var i=0;i<n.length;i++){var l=n[i];if(!o.hasOwnProperty(l)||!o[l]){o=!1;break e}}o=!0}n=!o}if(n)return null;switch(o=t?T(t):window,e){case"focus":(Z(o)||"true"===o.contentEditable)&&(wo=o,No=t,bo=null);break;case"blur":bo=No=wo=null;break;case"mousedown":Lo=!0;break;case"contextmenu":case"mouseup":case"dragend":return Lo=!1,Ke(r,a);case"selectionchange":if(To)break;case"keydown":case"keyup":return Ke(r,a)}return null}};Oa.injectEventPluginOrder("ResponderEventPlugin SimpleEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin".split(" ")),Ca=x,Ra=_,Ea=T,Oa.injectEventPluginsByName({SimpleEventPlugin:mo,EnterLeaveEventPlugin:Xn,ChangeEventPlugin:Hn,SelectEventPlugin:So,BeforeInputEventPlugin:cn});var ko={html:"http://www.w3.org/1999/xhtml",mathml:"http://www.w3.org/1998/Math/MathML",svg:"http://www.w3.org/2000/svg"},Do=void 0,Mo=function(e){return"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(t,r,a,n){MSApp.execUnsafeLocalFunction(function(){return e(t,r)})}:e}(function(e,t){if(e.namespaceURI!==ko.svg||"innerHTML"in e)e.innerHTML=t;else{for(Do=Do||document.createElement("div"),Do.innerHTML="<svg>"+t+"</svg>",t=Do.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}}),Ao={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},Io=["Webkit","ms","Moz","O"];Object.keys(Ao).forEach(function(e){Io.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Ao[t]=Ao[e]})});var zo=Ta({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}),Co=null,Ro=null;new Set;var Eo=[],Po=-1,Oo={},Fo={current:Oo},jo={current:!1},Bo=Oo,Ho=null,Vo=null,Go=!1,Wo={current:null},Uo=null,qo=null,Yo=null,Zo={},Ko={current:Zo},Jo={current:Zo},Xo={current:Zo},$o=(new _a.Component).refs,Qo={isMounted:function(e){return!!(e=e._reactInternalFiber)&&2===Ie(e)},enqueueSetState:function(e,t,r){e=e._reactInternalFiber;var a=Kr();a=Wr(a,e);var n=Ft(a);n.payload=t,void 0!==r&&null!==r&&(n.callback=r),Bt(e,n),Ur(e,a)},enqueueReplaceState:function(e,t,r){e=e._reactInternalFiber;var a=Kr();a=Wr(a,e);var n=Ft(a);n.tag=1,n.payload=t,void 0!==r&&null!==r&&(n.callback=r),Bt(e,n),Ur(e,a)},enqueueForceUpdate:function(e,t){e=e._reactInternalFiber;var r=Kr();r=Wr(r,e);var a=Ft(r);a.tag=2,void 0!==t&&null!==t&&(a.callback=t),Bt(e,a),Ur(e,r)}},ei=Array.isArray,ti=ur(!0),ri=ur(!1),ai=null,ni=null,oi=!1,ii=yn.ReactCurrentOwner,li=void 0,si=void 0,ui=void 0;li=function(){},si=function(e,t,r,a,n){var o=e.memoizedProps;if(o!==a){var i=t.stateNode;switch($t(Ko.current),e=null,r){case"input":o=ce(i,o),a=ce(i,a),e=[];break;case"option":o=Xe(i,o),a=Xe(i,a),e=[];break;case"select":o=Ta({},o,{value:void 0}),a=Ta({},a,{value:void 0}),e=[];break;case"textarea":o=Qe(i,o),a=Qe(i,a),e=[];break;default:"function"!=typeof o.onClick&&"function"==typeof a.onClick&&(i.onclick=ht)}lt(r,a),i=r=void 0;var l=null;for(r in o)if(!a.hasOwnProperty(r)&&o.hasOwnProperty(r)&&null!=o[r])if("style"===r){var s=o[r];for(i in s)s.hasOwnProperty(i)&&(l||(l={}),l[i]="")}else"dangerouslySetInnerHTML"!==r&&"children"!==r&&"suppressContentEditableWarning"!==r&&"suppressHydrationWarning"!==r&&"autoFocus"!==r&&(Ia.hasOwnProperty(r)?e||(e=[]):(e=e||[]).push(r,null));for(r in a){var u=a[r];if(s=null!=o?o[r]:void 0,a.hasOwnProperty(r)&&u!==s&&(null!=u||null!=s))if("style"===r)if(s){for(i in s)!s.hasOwnProperty(i)||u&&u.hasOwnProperty(i)||(l||(l={}),l[i]="");for(i in u)u.hasOwnProperty(i)&&s[i]!==u[i]&&(l||(l={}),l[i]=u[i])}else l||(e||(e=[]),e.push(r,l)),l=u;else"dangerouslySetInnerHTML"===r?(u=u?u.__html:void 0,s=s?s.__html:void 0,null!=u&&s!==u&&(e=e||[]).push(r,""+u)):"children"===r?s===u||"string"!=typeof u&&"number"!=typeof u||(e=e||[]).push(r,""+u):"suppressContentEditableWarning"!==r&&"suppressHydrationWarning"!==r&&(Ia.hasOwnProperty(r)?(null!=u&&ut(n,r),e||s===u||(e=[])):(e=e||[]).push(r,u))}l&&(e=e||[]).push("style",l),n=e,(t.updateQueue=n)&&Dr(t)}},ui=function(e,t,r,a){r!==a&&Dr(t)};var hi={readContext:Xt},ci=yn.ReactCurrentOwner,di=0,mi=0,pi=!1,fi=null,vi=null,yi=0,gi=!1,_i=null,Ti=!1,xi=null,wi=null,Ni=null,bi=0,Li=void 0,Si=!1,ki=null,Di=0,Mi=0,Ai=!1,Ii=!1,zi=null,Ci=null,Ri=!1,Ei=!1,Pi=!1,Oi=null,Fi=xa.unstable_now(),ji=2+(Fi/10|0),Bi=ji,Hi=50,Vi=0,Gi=null,Wi=1;dn=function(e,t,r){switch(t){case"input":if(pe(e,r),t=r.name,"radio"===r.type&&null!=t){for(r=e;r.parentNode;)r=r.parentNode;for(r=r.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<r.length;t++){var a=r[t];if(a!==e&&a.form===e.form){var o=x(a);o||n("90"),ee(a),pe(a,o)}}}break;case"textarea":tt(e,r);break;case"select":null!=(t=r.value)&&$e(e,!!r.multiple,t,!1)}},ca.prototype.render=function(e){this._defer||n("250"),this._hasChildren=!0,this._children=e;var t=this._root._internalRoot,r=this._expirationTime,a=new da;return la(e,t,null,r,a._onCommit),a},ca.prototype.then=function(e){if(this._didComplete)e();else{var t=this._callbacks;null===t&&(t=this._callbacks=[]),t.push(e)}},ca.prototype.commit=function(){var e=this._root._internalRoot,t=e.firstBatch;if(this._defer&&null!==t||n("251"),this._hasChildren){var r=this._expirationTime;if(t!==this){this._hasChildren&&(r=this._expirationTime=t._expirationTime,this.render(this._children));for(var a=null,o=t;o!==this;)a=o,o=o._next;null===a&&n("251"),a._next=o._next,this._next=t,e.firstBatch=this}this._defer=!1,t=r,Si&&n("253"),ki=e,Di=t,Qr(e,t,!0),$r(1,null),t=this._next,this._next=null,null!==(t=e.firstBatch=t)&&t._hasChildren&&t.render(t._children)}else this._next=null,this._defer=!1},ca.prototype._onComplete=function(){if(!this._didComplete){this._didComplete=!0;var e=this._callbacks;if(null!==e)for(var t=0;t<e.length;t++)(0,e[t])()}},da.prototype.then=function(e){if(this._didCommit)e();else{var t=this._callbacks;null===t&&(t=this._callbacks=[]),t.push(e)}},da.prototype._onCommit=function(){if(!this._didCommit){this._didCommit=!0;var e=this._callbacks;if(null!==e)for(var t=0;t<e.length;t++){var r=e[t];"function"!=typeof r&&n("191",r),r()}}},ma.prototype.render=function(e,t){var r=this._internalRoot,a=new da;return t=void 0===t?null:t,null!==t&&a.then(t),sa(e,r,null,a._onCommit),a},ma.prototype.unmount=function(e){var t=this._internalRoot,r=new da;return e=void 0===e?null:e,null!==e&&r.then(e),sa(null,t,null,r._onCommit),r},ma.prototype.legacy_renderSubtreeIntoContainer=function(e,t,r){var a=this._internalRoot,n=new da;return r=void 0===r?null:r,null!==r&&n.then(r),sa(t,a,e,n._onCommit),n},ma.prototype.createBatch=function(){var e=new ca(this),t=e._expirationTime,r=this._internalRoot,a=r.firstBatch;if(null===a)r.firstBatch=e,e._next=null;else{for(r=null;null!==a&&a._expirationTime<=t;)r=a,a=a._next;e._next=a,null!==r&&(r._next=e)}return e},W=aa,U=oa,q=function(){Si||0===Mi||($r(Mi,null),Mi=0)};var Ui={createPortal:ya,findDOMNode:function(e){if(null==e)return null;if(1===e.nodeType)return e;var t=e._reactInternalFiber;return void 0===t&&("function"==typeof e.render?n("188"):n("268",Object.keys(e))),e=Re(t),e=null===e?null:e.stateNode},hydrate:function(e,t,r){return va(null,e,t,!0,r)},render:function(e,t,r){return va(null,e,t,!1,r)},unstable_renderSubtreeIntoContainer:function(e,t,r,a){return(null==e||void 0===e._reactInternalFiber)&&n("38"),va(e,t,r,!1,a)},unmountComponentAtNode:function(e){return pa(e)||n("40"),!!e._reactRootContainer&&(na(function(){va(null,null,e,!1,function(){e._reactRootContainer=null})}),!0)},unstable_createPortal:function(){return ya.apply(void 0,arguments)},unstable_batchedUpdates:aa,unstable_interactiveUpdates:oa,flushSync:function(e,t){Si&&n("187");var r=Ri;Ri=!0;try{return qr(e,t)}finally{Ri=r,$r(1,null)}},unstable_flushControlled:function(e){var t=Ri;Ri=!0;try{qr(e)}finally{(Ri=t)||Si||$r(1,null)}},__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{Events:[_,T,x,Oa.injectEventPluginsByName,Aa,k,function(e){d(e,S)},V,G,He,y]},unstable_createRoot:function(e,t){return pa(e)||n("278"),new ma(e,!0,null!=t&&!0===t.hydrate)}};!function(e){var t=e.findFiberByHostInstance;St(Ta({},e,{findHostInstanceByFiber:function(e){return e=Re(e),null===e?null:e.stateNode},findFiberByHostInstance:function(e){return t?t(e):null}}))}({findFiberByHostInstance:g,bundleType:0,version:"16.5.2",rendererPackageName:"react-dom"});var qi={default:Ui},Yi=qi&&Ui||qi;e.exports=Yi.default||Yi},function(e,t,r){"use strict";var a,n,o="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};!function(i,l){"object"==o(t)&&void 0!==e?e.exports=l():(a=l,void 0!==(n="function"==typeof a?a.call(t,r,t,e):a)&&(e.exports=n))}(0,function(){return[{locale:"af",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"jaar",relative:{0:"hierdie jaar",1:"volgende jaar","-1":"verlede jaar"},relativeTime:{future:{one:"oor {0} jaar",other:"oor {0} jaar"},past:{one:"{0} jaar gelede",other:"{0} jaar gelede"}}},month:{displayName:"maand",relative:{0:"vandeesmaand",1:"volgende maand","-1":"verlede maand"},relativeTime:{future:{one:"oor {0} minuut",other:"oor {0} minuut"},past:{one:"{0} maand gelede",other:"{0} maande gelede"}}},day:{displayName:"dag",relative:{0:"vandag",1:"môre",2:"oormôre","-2":"eergister","-1":"gister"},relativeTime:{future:{one:"oor {0} minuut",other:"oor {0} minuut"},past:{one:"{0} dag gelede",other:"{0} dae gelede"}}},hour:{displayName:"uur",relative:{0:"hierdie uur"},relativeTime:{future:{one:"oor {0} uur",other:"oor {0} uur"},past:{one:"{0} uur gelede",other:"{0} uur gelede"}}},minute:{displayName:"minuut",relative:{0:"hierdie minuut"},relativeTime:{future:{one:"oor {0} minuut",other:"oor {0} minuut"},past:{one:"{0} minuut gelede",other:"{0} minute gelede"}}},second:{displayName:"sekonde",relative:{0:"nou"},relativeTime:{future:{one:"oor {0} sekonde",other:"oor {0} sekondes"},past:{one:"{0} sekonde gelede",other:"{0} sekondes gelede"}}}}},{locale:"af-NA",parentLocale:"af"},{locale:"agq",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"kɨnûm",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"ndzɔŋ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"utsuʔ",relative:{0:"nɛ",1:"tsʉtsʉ","-1":"ā zūɛɛ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"tàm",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"menè",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"sɛkɔ̀n",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ak",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"},fields:{year:{displayName:"Afe",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Bosome",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Da",relative:{0:"Ndɛ",1:"Ɔkyena","-1":"Ndeda"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Dɔnhwer",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Sema",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sɛkɛnd",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"am",pluralRuleFunction:function(e,t){return t?"other":e>=0&&e<=1?"one":"other"},fields:{year:{displayName:"ዓመት",relative:{0:"በዚህ ዓመት",1:"የሚቀጥለው ዓመት","-1":"ያለፈው ዓመት"},relativeTime:{future:{one:"በ{0} ዓመታት ውስጥ",other:"በ{0} ዓመታት ውስጥ"},past:{one:"ከ{0} ዓመት በፊት",other:"ከ{0} ዓመታት በፊት"}}},month:{displayName:"ወር",relative:{0:"በዚህ ወር",1:"የሚቀጥለው ወር","-1":"ያለፈው ወር"},relativeTime:{future:{one:"በ{0} ወር ውስጥ",other:"በ{0} ወራት ውስጥ"},past:{one:"ከ{0} ወር በፊት",other:"ከ{0} ወራት በፊት"}}},day:{displayName:"ቀን",relative:{0:"ዛሬ",1:"ነገ",2:"ከነገ ወዲያ","-2":"ከትናንት ወዲያ","-1":"ትናንት"},relativeTime:{future:{one:"በ{0} ቀን ውስጥ",other:"በ{0} ቀናት ውስጥ"},past:{one:"ከ{0} ቀን በፊት",other:"ከ{0} ቀናት በፊት"}}},hour:{displayName:"ሰዓት",relative:{0:"ይህ ሰዓት"},relativeTime:{future:{one:"በ{0} ሰዓት ውስጥ",other:"በ{0} ሰዓቶች ውስጥ"},past:{one:"ከ{0} ሰዓት በፊት",other:"ከ{0} ሰዓቶች በፊት"}}},minute:{displayName:"ደቂቃ",relative:{0:"ይህ ደቂቃ"},relativeTime:{future:{one:"በ{0} ደቂቃ ውስጥ",other:"በ{0} ደቂቃዎች ውስጥ"},past:{one:"ከ{0} ደቂቃ በፊት",other:"ከ{0} ደቂቃዎች በፊት"}}},second:{displayName:"ሰከንድ",relative:{0:"አሁን"},relativeTime:{future:{one:"በ{0} ሰከንድ ውስጥ",other:"በ{0} ሰከንዶች ውስጥ"},past:{one:"ከ{0} ሰከንድ በፊት",other:"ከ{0} ሰከንዶች በፊት"}}}}},{locale:"ar",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e&&r[0].slice(-2);return t?"other":0==e?"zero":1==e?"one":2==e?"two":a>=3&&a<=10?"few":a>=11&&a<=99?"many":"other"},fields:{year:{displayName:"السنة",relative:{0:"السنة الحالية",1:"السنة القادمة","-1":"السنة الماضية"},relativeTime:{future:{zero:"خلال {0} سنة",one:"خلال سنة واحدة",two:"خلال سنتين",few:"خلال {0} سنوات",many:"خلال {0} سنة",other:"خلال {0} سنة"},past:{zero:"قبل {0} سنة",one:"قبل سنة واحدة",two:"قبل سنتين",few:"قبل {0} سنوات",many:"قبل {0} سنة",other:"قبل {0} سنة"}}},month:{displayName:"الشهر",relative:{0:"هذا الشهر",1:"الشهر القادم","-1":"الشهر الماضي"},relativeTime:{future:{zero:"خلال {0} شهر",one:"خلال شهر واحد",two:"خلال شهرين",few:"خلال {0} أشهر",many:"خلال {0} شهرًا",other:"خلال {0} شهر"},past:{zero:"قبل {0} شهر",one:"قبل شهر واحد",two:"قبل شهرين",few:"قبل {0} أشهر",many:"قبل {0} شهرًا",other:"قبل {0} شهر"}}},day:{displayName:"يوم",relative:{0:"اليوم",1:"غدًا",2:"بعد الغد","-2":"أول أمس","-1":"أمس"},relativeTime:{future:{zero:"خلال {0} يوم",one:"خلال يوم واحد",two:"خلال يومين",few:"خلال {0} أيام",many:"خلال {0} يومًا",other:"خلال {0} يوم"},past:{zero:"قبل {0} يوم",one:"قبل يوم واحد",two:"قبل يومين",few:"قبل {0} أيام",many:"قبل {0} يومًا",other:"قبل {0} يوم"}}},hour:{displayName:"الساعات",relative:{0:"الساعة الحالية"},relativeTime:{future:{zero:"خلال {0} ساعة",one:"خلال ساعة واحدة",two:"خلال ساعتين",few:"خلال {0} ساعات",many:"خلال {0} ساعة",other:"خلال {0} ساعة"},past:{zero:"قبل {0} ساعة",one:"قبل ساعة واحدة",two:"قبل ساعتين",few:"قبل {0} ساعات",many:"قبل {0} ساعة",other:"قبل {0} ساعة"}}},minute:{displayName:"الدقائق",relative:{0:"هذه الدقيقة"},relativeTime:{future:{zero:"خلال {0} دقيقة",one:"خلال دقيقة واحدة",two:"خلال دقيقتين",few:"خلال {0} دقائق",many:"خلال {0} دقيقة",other:"خلال {0} دقيقة"},past:{zero:"قبل {0} دقيقة",one:"قبل دقيقة واحدة",two:"قبل دقيقتين",few:"قبل {0} دقائق",many:"قبل {0} دقيقة",other:"قبل {0} دقيقة"}}},second:{displayName:"الثواني",relative:{0:"الآن"},relativeTime:{future:{zero:"خلال {0} ثانية",one:"خلال ثانية واحدة",two:"خلال ثانيتين",few:"خلال {0} ثوانٍ",many:"خلال {0} ثانية",other:"خلال {0} ثانية"},past:{zero:"قبل {0} ثانية",one:"قبل ثانية واحدة",two:"قبل ثانيتين",few:"قبل {0} ثوانِ",many:"قبل {0} ثانية",other:"قبل {0} ثانية"}}}}},{locale:"ar-AE",parentLocale:"ar",fields:{year:{displayName:"السنة",relative:{0:"هذه السنة",1:"السنة التالية","-1":"السنة الماضية"},relativeTime:{future:{zero:"خلال {0} سنة",one:"خلال سنة واحدة",two:"خلال سنتين",few:"خلال {0} سنوات",many:"خلال {0} سنة",other:"خلال {0} سنة"},past:{zero:"قبل {0} سنة",one:"قبل سنة واحدة",two:"قبل سنتين",few:"قبل {0} سنوات",many:"قبل {0} سنة",other:"قبل {0} سنة"}}},month:{displayName:"الشهر",relative:{0:"هذا الشهر",1:"الشهر القادم","-1":"الشهر الماضي"},relativeTime:{future:{zero:"خلال {0} شهر",one:"خلال شهر واحد",two:"خلال شهرين",few:"خلال {0} أشهر",many:"خلال {0} شهرًا",other:"خلال {0} شهر"},past:{zero:"قبل {0} شهر",one:"قبل شهر واحد",two:"قبل شهرين",few:"قبل {0} أشهر",many:"قبل {0} شهرًا",other:"قبل {0} شهر"}}},day:{displayName:"يوم",relative:{0:"اليوم",1:"غدًا",2:"بعد الغد","-2":"أول أمس","-1":"أمس"},relativeTime:{future:{zero:"خلال {0} يوم",one:"خلال يوم واحد",two:"خلال يومين",few:"خلال {0} أيام",many:"خلال {0} يومًا",other:"خلال {0} يوم"},past:{zero:"قبل {0} يوم",one:"قبل يوم واحد",two:"قبل يومين",few:"قبل {0} أيام",many:"قبل {0} يومًا",other:"قبل {0} يوم"}}},hour:{displayName:"الساعات",relative:{0:"الساعة الحالية"},relativeTime:{future:{zero:"خلال {0} ساعة",one:"خلال ساعة واحدة",two:"خلال ساعتين",few:"خلال {0} ساعات",many:"خلال {0} ساعة",other:"خلال {0} ساعة"},past:{zero:"قبل {0} ساعة",one:"قبل ساعة واحدة",two:"قبل ساعتين",few:"قبل {0} ساعات",many:"قبل {0} ساعة",other:"قبل {0} ساعة"}}},minute:{displayName:"الدقائق",relative:{0:"هذه الدقيقة"},relativeTime:{future:{zero:"خلال {0} دقيقة",one:"خلال دقيقة واحدة",two:"خلال دقيقتين",few:"خلال {0} دقائق",many:"خلال {0} دقيقة",other:"خلال {0} دقيقة"},past:{zero:"قبل {0} دقيقة",one:"قبل دقيقة واحدة",two:"قبل دقيقتين",few:"قبل {0} دقائق",many:"قبل {0} دقيقة",other:"قبل {0} دقيقة"}}},second:{displayName:"الثواني",relative:{0:"الآن"},relativeTime:{future:{zero:"خلال {0} ثانية",one:"خلال ثانية واحدة",two:"خلال ثانيتين",few:"خلال {0} ثوانٍ",many:"خلال {0} ثانية",other:"خلال {0} ثانية"},past:{zero:"قبل {0} ثانية",one:"قبل ثانية واحدة",two:"قبل ثانيتين",few:"قبل {0} ثوانِ",many:"قبل {0} ثانية",other:"قبل {0} ثانية"}}}}},{locale:"ar-BH",parentLocale:"ar"},{locale:"ar-DJ",parentLocale:"ar"},{locale:"ar-DZ",parentLocale:"ar"},{locale:"ar-EG",parentLocale:"ar"},{locale:"ar-EH",parentLocale:"ar"},{locale:"ar-ER",parentLocale:"ar"},{locale:"ar-IL",parentLocale:"ar"},{locale:"ar-IQ",parentLocale:"ar"},{locale:"ar-JO",parentLocale:"ar"},{locale:"ar-KM",parentLocale:"ar"},{locale:"ar-KW",parentLocale:"ar"},{locale:"ar-LB",parentLocale:"ar"},{locale:"ar-LY",parentLocale:"ar"},{locale:"ar-MA",parentLocale:"ar"},{locale:"ar-MR",parentLocale:"ar"},{locale:"ar-OM",parentLocale:"ar"},{locale:"ar-PS",parentLocale:"ar"},{locale:"ar-QA",parentLocale:"ar"},{locale:"ar-SA",parentLocale:"ar"},{locale:"ar-SD",parentLocale:"ar"},{locale:"ar-SO",parentLocale:"ar"},{locale:"ar-SS",parentLocale:"ar"},{locale:"ar-SY",parentLocale:"ar"},{locale:"ar-TD",parentLocale:"ar"},{locale:"ar-TN",parentLocale:"ar"},{locale:"ar-YE",parentLocale:"ar"},{locale:"ars",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e&&r[0].slice(-2);return t?"other":0==e?"zero":1==e?"one":2==e?"two":a>=3&&a<=10?"few":a>=11&&a<=99?"many":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"as",pluralRuleFunction:function(e,t){return t?1==e||5==e||7==e||8==e||9==e||10==e?"one":2==e||3==e?"two":4==e?"few":6==e?"many":"other":e>=0&&e<=1?"one":"other"},fields:{year:{displayName:"বছৰ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"মাহ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"দিন",relative:{0:"আজি",1:"কাইলৈ",2:"পৰহিলৈ","-2":"পৰহি","-1":"কালি"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"ঘণ্টা",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"মিনিট",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"ছেকেণ্ড",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"asa",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Mwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mweji",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Thiku",relative:{0:"Iyoo",1:"Yavo","-1":"Ighuo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Thaa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Dakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Thekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ast",pluralRuleFunction:function(e,t){var r=!String(e).split(".")[1];return t?"other":1==e&&r?"one":"other"},fields:{year:{displayName:"añu",relative:{0:"esti añu",1:"l’añu viniente","-1":"l’añu pasáu"},relativeTime:{future:{one:"en {0} añu",other:"en {0} años"},past:{one:"hai {0} añu",other:"hai {0} años"}}},month:{displayName:"mes",relative:{0:"esti mes",1:"el mes viniente","-1":"el mes pasáu"},relativeTime:{future:{one:"en {0} mes",other:"en {0} meses"},past:{one:"hai {0} mes",other:"hai {0} meses"}}},day:{displayName:"día",relative:{0:"güei",1:"mañana",2:"pasao mañana","-2":"antayeri","-1":"ayeri"},relativeTime:{future:{one:"en {0} día",other:"en {0} díes"},past:{one:"hai {0} día",other:"hai {0} díes"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"en {0} hora",other:"en {0} hores"},past:{one:"hai {0} hora",other:"hai {0} hores"}}},minute:{displayName:"minutu",relative:{0:"esti minutu"},relativeTime:{future:{one:"en {0} minutu",other:"en {0} minutos"},past:{one:"hai {0} minutu",other:"hai {0} minutos"}}},second:{displayName:"segundu",relative:{0:"agora"},relativeTime:{future:{one:"en {0} segundu",other:"en {0} segundos"},past:{one:"hai {0} segundu",other:"hai {0} segundos"}}}}},{locale:"az",pluralRuleFunction:function(e,t){var r=String(e).split(".")[0],a=r.slice(-1),n=r.slice(-2),o=r.slice(-3);return t?1==a||2==a||5==a||7==a||8==a||20==n||50==n||70==n||80==n?"one":3==a||4==a||100==o||200==o||300==o||400==o||500==o||600==o||700==o||800==o||900==o?"few":0==r||6==a||40==n||60==n||90==n?"many":"other":1==e?"one":"other"},fields:{year:{displayName:"İl",relative:{0:"bu il",1:"gələn il","-1":"keçən il"},relativeTime:{future:{one:"{0} il ərzində",other:"{0} il ərzində"},past:{one:"{0} il öncə",other:"{0} il öncə"}}},month:{displayName:"Ay",relative:{0:"bu ay",1:"gələn ay","-1":"keçən ay"},relativeTime:{future:{one:"{0} ay ərzində",other:"{0} ay ərzində"},past:{one:"{0} ay öncə",other:"{0} ay öncə"}}},day:{displayName:"Gün",relative:{0:"bu gün",1:"sabah","-1":"dünən"},relativeTime:{future:{one:"{0} gün ərzində",other:"{0} gün ərzində"},past:{one:"{0} gün öncə",other:"{0} gün öncə"}}},hour:{displayName:"Saat",relative:{0:"bu saat"},relativeTime:{future:{one:"{0} saat ərzində",other:"{0} saat ərzində"},past:{one:"{0} saat öncə",other:"{0} saat öncə"}}},minute:{displayName:"Dəqiqə",relative:{0:"bu dəqiqə"},relativeTime:{future:{one:"{0} dəqiqə ərzində",other:"{0} dəqiqə ərzində"},past:{one:"{0} dəqiqə öncə",other:"{0} dəqiqə öncə"}}},second:{displayName:"Saniyə",relative:{0:"indi"},relativeTime:{future:{one:"{0} saniyə ərzində",other:"{0} saniyə ərzində"},past:{one:"{0} saniyə öncə",other:"{0} saniyə öncə"}}}}},{locale:"az-Arab",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"az-Cyrl",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"az-Latn",parentLocale:"az"},{locale:"bas",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"ŋwìi",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"soŋ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"kɛl",relative:{0:"lɛ̀n",1:"yàni","-1":"yààni"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"ŋgɛŋ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"ŋget",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"hìŋgeŋget",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"be",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e,n=a&&r[0].slice(-1),o=a&&r[0].slice(-2);return t?2!=n&&3!=n||12==o||13==o?"other":"few":1==n&&11!=o?"one":n>=2&&n<=4&&(o<12||o>14)?"few":a&&0==n||n>=5&&n<=9||o>=11&&o<=14?"many":"other"},fields:{year:{displayName:"год",relative:{0:"у гэтым годзе",1:"у наступным годзе","-1":"у мінулым годзе"},relativeTime:{future:{one:"праз {0} год",few:"праз {0} гады",many:"праз {0} гадоў",other:"праз {0} года"},past:{one:"{0} год таму",few:"{0} гады таму",many:"{0} гадоў таму",other:"{0} года таму"}}},month:{displayName:"месяц",relative:{0:"у гэтым месяцы",1:"у наступным месяцы","-1":"у мінулым месяцы"},relativeTime:{future:{one:"праз {0} месяц",few:"праз {0} месяцы",many:"праз {0} месяцаў",other:"праз {0} месяца"},past:{one:"{0} месяц таму",few:"{0} месяцы таму",many:"{0} месяцаў таму",other:"{0} месяца таму"}}},day:{displayName:"дзень",relative:{0:"сёння",1:"заўтра",2:"паслязаўтра","-2":"пазаўчора","-1":"учора"},relativeTime:{future:{one:"праз {0} дзень",few:"праз {0} дні",many:"праз {0} дзён",other:"праз {0} дня"},past:{one:"{0} дзень таму",few:"{0} дні таму",many:"{0} дзён таму",other:"{0} дня таму"}}},hour:{displayName:"гадзіна",relative:{0:"у гэту гадзіну"},relativeTime:{future:{one:"праз {0} гадзіну",few:"праз {0} гадзіны",many:"праз {0} гадзін",other:"праз {0} гадзіны"},past:{one:"{0} гадзіну таму",few:"{0} гадзіны таму",many:"{0} гадзін таму",other:"{0} гадзіны таму"}}},minute:{displayName:"хвіліна",relative:{0:"у гэту хвіліну"},relativeTime:{future:{one:"праз {0} хвіліну",few:"праз {0} хвіліны",many:"праз {0} хвілін",other:"праз {0} хвіліны"},past:{one:"{0} хвіліну таму",few:"{0} хвіліны таму",many:"{0} хвілін таму",other:"{0} хвіліны таму"}}},second:{displayName:"секунда",relative:{0:"цяпер"},relativeTime:{future:{one:"праз {0} секунду",few:"праз {0} секунды",many:"праз {0} секунд",other:"праз {0} секунды"},past:{one:"{0} секунду таму",few:"{0} секунды таму",many:"{0} секунд таму",other:"{0} секунды таму"}}}}},{locale:"bem",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Umwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Umweshi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ubushiku",relative:{0:"Lelo",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Insa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Mineti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekondi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"bez",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Mwaha",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mwedzi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Sihu",relative:{0:"Neng’u ni",1:"Hilawu","-1":"Igolo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Dakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"bg",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"година",relative:{0:"тази година",1:"следващата година","-1":"миналата година"},relativeTime:{future:{one:"след {0} година",other:"след {0} години"},past:{one:"преди {0} година",other:"преди {0} години"}}},month:{displayName:"месец",relative:{0:"този месец",1:"следващ месец","-1":"предходен месец"},relativeTime:{future:{one:"след {0} месец",other:"след {0} месеца"},past:{one:"преди {0} месец",other:"преди {0} месеца"}}},day:{displayName:"ден",relative:{0:"днес",1:"утре",2:"вдругиден","-2":"онзи ден","-1":"вчера"},relativeTime:{future:{one:"след {0} ден",other:"след {0} дни"},past:{one:"преди {0} ден",other:"преди {0} дни"}}},hour:{displayName:"час",relative:{0:"в този час"},relativeTime:{future:{one:"след {0} час",other:"след {0} часа"},past:{one:"преди {0} час",other:"преди {0} часа"}}},minute:{displayName:"минута",relative:{0:"в тази минута"},relativeTime:{future:{one:"след {0} минута",other:"след {0} минути"},past:{one:"преди {0} минута",other:"преди {0} минути"}}},second:{displayName:"секунда",relative:{0:"сега"},relativeTime:{future:{one:"след {0} секунда",other:"след {0} секунди"},past:{one:"преди {0} секунда",other:"преди {0} секунди"}}}}},{locale:"bh",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"bm",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"san",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"kalo",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"don",relative:{0:"bi",1:"sini","-1":"kunu"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"lɛrɛ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"miniti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"sekondi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"bm-Nkoo",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"bn",pluralRuleFunction:function(e,t){return t?1==e||5==e||7==e||8==e||9==e||10==e?"one":2==e||3==e?"two":4==e?"few":6==e?"many":"other":e>=0&&e<=1?"one":"other"},fields:{year:{displayName:"বছর",relative:{0:"এই বছর",1:"পরের বছর","-1":"গত বছর"},relativeTime:{future:{one:"{0} বছরে",other:"{0} বছরে"},past:{one:"{0} বছর পূর্বে",other:"{0} বছর পূর্বে"}}},month:{displayName:"মাস",relative:{0:"এই মাস",1:"পরের মাস","-1":"গত মাস"},relativeTime:{future:{one:"{0} মাসে",other:"{0} মাসে"},past:{one:"{0} মাস আগে",other:"{0} মাস আগে"}}},day:{displayName:"দিন",relative:{0:"আজ",1:"আগামীকাল",2:"আগামী পরশু","-2":"গত পরশু","-1":"গতকাল"},relativeTime:{future:{one:"{0} দিনের মধ্যে",other:"{0} দিনের মধ্যে"},past:{one:"{0} দিন আগে",other:"{0} দিন আগে"}}},hour:{displayName:"ঘন্টা",relative:{0:"এই ঘণ্টায়"},relativeTime:{future:{one:"{0} ঘন্টায়",other:"{0} ঘন্টায়"},past:{one:"{0} ঘন্টা আগে",other:"{0} ঘন্টা আগে"}}},minute:{displayName:"মিনিট",relative:{0:"এই মিনিট"},relativeTime:{future:{one:"{0} মিনিটে",other:"{0} মিনিটে"},past:{one:"{0} মিনিট আগে",other:"{0} মিনিট পূর্বে"}}},second:{displayName:"সেকেন্ড",relative:{0:"এখন"},relativeTime:{future:{one:"{0} সেকেন্ডে",other:"{0} সেকেন্ডে"},past:{one:"{0} সেকেন্ড পূর্বে",other:"{0} সেকেন্ড পূর্বে"}}}}},{locale:"bn-IN",parentLocale:"bn"},{locale:"bo",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"ལོ།",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"ཟླ་བ་",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"ཉིན།",relative:{0:"དེ་རིང་",1:"སང་ཉིན་",2:"གནངས་ཉིན་","-2":"ཁས་ཉིན་","-1":"ཁས་ས་"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"ཆུ་ཚོད་",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"སྐར་མ།",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"སྐར་ཆ།",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"bo-IN",parentLocale:"bo"},{locale:"br",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e,n=a&&r[0].slice(-1),o=a&&r[0].slice(-2),i=a&&r[0].slice(-6);return t?"other":1==n&&11!=o&&71!=o&&91!=o?"one":2==n&&12!=o&&72!=o&&92!=o?"two":(3==n||4==n||9==n)&&(o<10||o>19)&&(o<70||o>79)&&(o<90||o>99)?"few":0!=e&&a&&0==i?"many":"other"},fields:{year:{displayName:"bloaz",relative:{0:"hevlene",1:"ar bloaz a zeu","-1":"warlene"},relativeTime:{future:{one:"a-benn {0} bloaz",two:"a-benn {0} vloaz",few:"a-benn {0} bloaz",many:"a-benn {0} a vloazioù",other:"a-benn {0} vloaz"},past:{one:"{0} bloaz zo",two:"{0} vloaz zo",few:"{0} bloaz zo",many:"{0} a vloazioù zo",other:"{0} vloaz zo"}}},month:{displayName:"miz",relative:{0:"ar miz-mañ",1:"ar miz a zeu","-1":"ar miz diaraok"},relativeTime:{future:{one:"a-benn {0} miz",two:"a-benn {0} viz",few:"a-benn {0} miz",many:"a-benn {0} a vizioù",other:"a-benn {0} miz"},past:{one:"{0} miz zo",two:"{0} viz zo",few:"{0} miz zo",many:"{0} a vizioù zo",other:"{0} miz zo"}}},day:{displayName:"deiz",relative:{0:"hiziv",1:"warcʼhoazh","-2":"dercʼhent-decʼh","-1":"decʼh"},relativeTime:{future:{one:"a-benn {0} deiz",two:"a-benn {0} zeiz",few:"a-benn {0} deiz",many:"a-benn {0} a zeizioù",other:"a-benn {0} deiz"},past:{one:"{0} deiz zo",two:"{0} zeiz zo",few:"{0} deiz zo",many:"{0} a zeizioù zo",other:"{0} deiz zo"}}},hour:{displayName:"eur",relative:{0:"this hour"},relativeTime:{future:{one:"a-benn {0} eur",two:"a-benn {0} eur",few:"a-benn {0} eur",many:"a-benn {0} a eurioù",other:"a-benn {0} eur"},past:{one:"{0} eur zo",two:"{0} eur zo",few:"{0} eur zo",many:"{0} a eurioù zo",other:"{0} eur zo"}}},minute:{displayName:"munut",relative:{0:"this minute"},relativeTime:{future:{one:"a-benn {0} munut",two:"a-benn {0} vunut",few:"a-benn {0} munut",many:"a-benn {0} a vunutoù",other:"a-benn {0} munut"},past:{one:"{0} munut zo",two:"{0} vunut zo",few:"{0} munut zo",many:"{0} a vunutoù zo",other:"{0} munut zo"}}},second:{displayName:"eilenn",relative:{0:"bremañ"},relativeTime:{future:{one:"a-benn {0} eilenn",two:"a-benn {0} eilenn",few:"a-benn {0} eilenn",many:"a-benn {0} a eilennoù",other:"a-benn {0} eilenn"},past:{one:"{0} eilenn zo",two:"{0} eilenn zo",few:"{0} eilenn zo",many:"{0} eilenn zo",other:"{0} eilenn zo"}}}}},{locale:"brx",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"बोसोर",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"दान",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"सान",relative:{0:"दिनै",1:"गाबोन","-1":"मैया"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"रिंगा",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"मिनिथ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"सेखेन्द",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"bs",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=a.slice(-2),s=n.slice(-1),u=n.slice(-2);return t?"other":o&&1==i&&11!=l||1==s&&11!=u?"one":o&&i>=2&&i<=4&&(l<12||l>14)||s>=2&&s<=4&&(u<12||u>14)?"few":"other"},fields:{year:{displayName:"godina",relative:{0:"ove godine",1:"sljedeće godine","-1":"prošle godine"},relativeTime:{future:{one:"za {0} godinu",few:"za {0} godine",other:"za {0} godina"},past:{one:"prije {0} godinu",few:"prije {0} godine",other:"prije {0} godina"}}},month:{displayName:"mjesec",relative:{0:"ovaj mjesec",1:"sljedeći mjesec","-1":"prošli mjesec"},relativeTime:{future:{one:"za {0} mjesec",few:"za {0} mjeseca",other:"za {0} mjeseci"},past:{one:"prije {0} mjesec",few:"prije {0} mjeseca",other:"prije {0} mjeseci"}}},day:{displayName:"dan",relative:{0:"danas",1:"sutra",2:"prekosutra","-2":"prekjučer","-1":"jučer"},relativeTime:{future:{one:"za {0} dan",few:"za {0} dana",other:"za {0} dana"},past:{one:"prije {0} dan",few:"prije {0} dana",other:"prije {0} dana"}}},hour:{displayName:"sat",relative:{0:"ovaj sat"},relativeTime:{future:{one:"za {0} sat",few:"za {0} sata",other:"za {0} sati"},past:{one:"prije {0} sat",few:"prije {0} sata",other:"prije {0} sati"}}},minute:{displayName:"minuta",relative:{0:"ova minuta"},relativeTime:{future:{one:"za {0} minutu",few:"za {0} minute",other:"za {0} minuta"},past:{one:"prije {0} minutu",few:"prije {0} minute",other:"prije {0} minuta"}}},second:{displayName:"sekunda",relative:{0:"sada"},relativeTime:{future:{one:"za {0} sekundu",few:"za {0} sekunde",other:"za {0} sekundi"},past:{one:"prije {0} sekundu",few:"prije {0} sekunde",other:"prije {0} sekundi"}}}}},{locale:"bs-Cyrl",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"година",relative:{0:"Ове године",1:"Следеће године","-1":"Прошле године"},relativeTime:{future:{one:"за {0} годину",few:"за {0} године",other:"за {0} година"},past:{one:"пре {0} годину",few:"пре {0} године",other:"пре {0} година"}}},month:{displayName:"месец",relative:{0:"Овог месеца",1:"Следећег месеца","-1":"Прошлог месеца"},relativeTime:{future:{one:"за {0} месец",few:"за {0} месеца",other:"за {0} месеци"},past:{one:"пре {0} месец",few:"пре {0} месеца",other:"пре {0} месеци"}}},day:{displayName:"дан",relative:{0:"данас",1:"сутра",2:"прекосутра","-2":"прекјуче","-1":"јуче"},relativeTime:{future:{one:"за {0} дан",few:"за {0} дана",other:"за {0} дана"},past:{one:"пре {0} дан",few:"пре {0} дана",other:"пре {0} дана"}}},hour:{displayName:"час",relative:{0:"this hour"},relativeTime:{future:{one:"за {0} сат",few:"за {0} сата",other:"за {0} сати"},past:{one:"пре {0} сат",few:"пре {0} сата",other:"пре {0} сати"}}},minute:{displayName:"минут",relative:{0:"this minute"},relativeTime:{future:{one:"за {0} минут",few:"за {0} минута",other:"за {0} минута"},past:{one:"пре {0} минут",few:"пре {0} минута",other:"пре {0} минута"}}},second:{displayName:"секунд",relative:{0:"now"},relativeTime:{future:{one:"за {0} секунд",few:"за {0} секунде",other:"за {0} секунди"},past:{one:"пре {0} секунд",few:"пре {0} секунде",other:"пре {0} секунди"}}}}},{locale:"bs-Latn",parentLocale:"bs"},{locale:"ca",pluralRuleFunction:function(e,t){var r=!String(e).split(".")[1];return t?1==e||3==e?"one":2==e?"two":4==e?"few":"other":1==e&&r?"one":"other"},fields:{year:{displayName:"any",relative:{0:"enguany",1:"l’any que ve","-1":"l’any passat"},relativeTime:{future:{one:"d’aquí a {0} any",other:"d’aquí a {0} anys"},past:{one:"fa {0} any",other:"fa {0} anys"}}},month:{displayName:"mes",relative:{0:"aquest mes",1:"el mes que ve","-1":"el mes passat"},relativeTime:{future:{one:"d’aquí a {0} mes",other:"d’aquí a {0} mesos"},past:{one:"fa {0} mes",other:"fa {0} mesos"}}},day:{displayName:"dia",relative:{0:"avui",1:"demà",2:"demà passat","-2":"abans-d’ahir","-1":"ahir"},relativeTime:{future:{one:"d’aquí a {0} dia",other:"d’aquí a {0} dies"},past:{one:"fa {0} dia",other:"fa {0} dies"}}},hour:{displayName:"hora",relative:{0:"aquesta hora"},relativeTime:{future:{one:"d’aquí a {0} hora",other:"d’aquí a {0} hores"},past:{one:"fa {0} hora",other:"fa {0} hores"}}},minute:{displayName:"minut",relative:{0:"aquest minut"},relativeTime:{future:{one:"d’aquí a {0} minut",other:"d’aquí a {0} minuts"},past:{one:"fa {0} minut",other:"fa {0} minuts"}}},second:{displayName:"segon",relative:{0:"ara"},relativeTime:{future:{one:"d’aquí a {0} segon",other:"d’aquí a {0} segons"},past:{one:"fa {0} segon",other:"fa {0} segons"}}}}},{locale:"ca-AD",parentLocale:"ca"},{locale:"ca-ES-VALENCIA",parentLocale:"ca-ES",fields:{year:{displayName:"any",relative:{0:"enguany",1:"l’any que ve","-1":"l’any passat"},relativeTime:{future:{one:"d’aquí a {0} any",other:"d’aquí a {0} anys"},past:{one:"fa {0} any",other:"fa {0} anys"}}},month:{displayName:"mes",relative:{0:"aquest mes",1:"el mes que ve","-1":"el mes passat"},relativeTime:{future:{one:"d’aquí a {0} mes",other:"d’aquí a {0} mesos"},past:{one:"fa {0} mes",other:"fa {0} mesos"}}},day:{displayName:"dia",relative:{0:"avui",1:"demà",2:"demà passat","-2":"abans-d’ahir","-1":"ahir"},relativeTime:{future:{one:"d’aquí a {0} dia",other:"d’aquí a {0} dies"},past:{one:"fa {0} dia",other:"fa {0} dies"}}},hour:{displayName:"hora",relative:{0:"aquesta hora"},relativeTime:{future:{one:"d’aquí a {0} hora",other:"d’aquí a {0} hores"},past:{one:"fa {0} hora",other:"fa {0} hores"}}},minute:{displayName:"minut",relative:{0:"aquest minut"},relativeTime:{future:{one:"d’aquí a {0} minut",other:"d’aquí a {0} minuts"},past:{one:"fa {0} minut",other:"fa {0} minuts"}}},second:{displayName:"segon",relative:{0:"ara"},relativeTime:{future:{one:"d’aquí a {0} segon",other:"d’aquí a {0} segons"},past:{one:"fa {0} segon",other:"fa {0} segons"}}}}},{locale:"ca-ES",parentLocale:"ca"},{locale:"ca-FR",parentLocale:"ca"},{locale:"ca-IT",parentLocale:"ca"},{locale:"ce",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"шо",relative:{0:"карарчу шарахь",1:"рогӀерчу шарахь","-1":"даханчу шарахь"},relativeTime:{future:{one:"{0} шо даьлча",other:"{0} шо даьлча"},past:{one:"{0} шо хьалха",other:"{0} шо хьалха"}}},month:{displayName:"бутт",relative:{0:"карарчу баттахь",1:"рогӀерчу баттахь","-1":"баханчу баттахь"},relativeTime:{future:{one:"{0} бутт баьлча",other:"{0} бутт баьлча"},past:{one:"{0} бутт хьалха",other:"{0} бутт хьалха"}}},day:{displayName:"де",relative:{0:"тахана",1:"кхана","-1":"селхана"},relativeTime:{future:{one:"{0} де даьлча",other:"{0} де даьлча"},past:{one:"{0} де хьалха",other:"{0} де хьалха"}}},hour:{displayName:"сахьт",relative:{0:"this hour"},relativeTime:{future:{one:"{0} сахьт даьлча",other:"{0} сахьт даьлча"},past:{one:"{0} сахьт хьалха",other:"{0} сахьт хьалха"}}},minute:{displayName:"минот",relative:{0:"this minute"},relativeTime:{future:{one:"{0} минот яьлча",other:"{0} минот яьлча"},past:{one:"{0} минот хьалха",other:"{0} минот хьалха"}}},second:{displayName:"секунд",relative:{0:"now"},relativeTime:{future:{one:"{0} секунд яьлча",other:"{0} секунд яьлча"},past:{one:"{0} секунд хьалха",other:"{0} секунд хьалха"}}}}},{locale:"cgg",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Omwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Omwezi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Eizooba",relative:{0:"Erizooba",1:"Nyenkyakare","-1":"Nyomwabazyo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Shaaha",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Edakiika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Obucweka/Esekendi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"chr",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"ᎤᏕᏘᏴᏌᏗᏒᎢ",relative:{0:"ᎯᎠ ᏧᏕᏘᏴᏒᏘ",1:"ᎡᏘᏴᎢ","-1":"ᎡᏘ ᏥᎨᏒ"},relativeTime:{future:{one:"ᎾᎿ {0} ᎤᏕᏘᏴᏌᏗᏒᎢ",other:"ᎾᎿ {0} ᎢᏧᏕᏘᏴᏌᏗᏒᎢ"},past:{one:"{0} ᎤᏕᏘᏴᏌᏗᏒᎢ ᏥᎨᏒ",other:"{0} ᎢᏧᏕᏘᏴᏌᏗᏒᎢ ᏥᎨᏒ"}}},month:{displayName:"ᎧᎸᎢ",relative:{0:"ᎯᎠ ᎧᎸᎢ",1:"ᏔᎵᏁ ᎧᎸᎢ","-1":"ᎧᎸᎢ ᏥᎨᏒ"},relativeTime:{future:{one:"ᎾᎿ {0} ᎧᎸᎢ",other:"ᎾᎿ {0} ᏗᎧᎸᎢ"},past:{one:"ᎾᎿ {0} ᎧᎸᎢ ᏥᎨᏒ",other:"ᎾᎿ {0} ᏗᎧᎸᎢ ᏥᎨᏒ"}}},day:{displayName:"ᎢᎦ",relative:{0:"ᎪᎯ ᎢᎦ",1:"ᏌᎾᎴᎢ","-1":"ᏒᎯ"},relativeTime:{future:{one:"ᎾᎿ {0} ᎢᎦ",other:"ᎾᎿ {0} ᎯᎸᏍᎩ ᏧᏒᎯᏛ"},past:{one:"{0} ᎢᎦ ᏥᎨᏒ",other:"{0} ᎯᎸᏍᎩ ᏧᏒᎯᏛ ᏥᎨᏒ"}}},hour:{displayName:"ᏑᏟᎶᏓ",relative:{0:"ᎯᎠ ᏑᏟᎶᏓ"},relativeTime:{future:{one:"ᎾᎿ {0} ᏑᏟᎶᏓ",other:"ᎾᎿ {0} ᎢᏳᏟᎶᏓ"},past:{one:"{0} ᏑᏟᎶᏓ ᏥᎨᏒ",other:"{0} ᎢᏳᏟᎶᏓ ᏥᎨᏒ"}}},minute:{displayName:"ᎢᏯᏔᏬᏍᏔᏅ",relative:{0:"ᎯᎠ ᎢᏯᏔᏬᏍᏔᏅ"},relativeTime:{future:{one:"ᎾᎿ {0} ᎢᏯᏔᏬᏍᏔᏅ",other:"ᎾᎿ {0} ᎢᏯᏔᏬᏍᏔᏅ"},past:{one:"ᎾᎿ {0} ᎢᏯᏔᏬᏍᏔᏅ ᏥᎨᏒ",other:"ᎾᎿ {0} ᎢᏯᏔᏬᏍᏔᏅ ᏥᎨᏒ"}}},second:{displayName:"ᎠᏎᏢ",relative:{0:"ᏃᏊ"},relativeTime:{future:{one:"ᎾᎿ {0} ᎠᏎᏢ",other:"ᎾᎿ {0} ᏓᏓᎾᏩᏍᎬ ᏥᎨᏒ"},past:{one:"{0} ᎠᏎᏢ ᏥᎨᏒ",other:"{0} ᏓᏓᎾᏩᏍᎬ ᏥᎨᏒ"}}}}},{locale:"ckb",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ckb-IR",parentLocale:"ckb"},{locale:"cs",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1];return t?"other":1==e&&n?"one":a>=2&&a<=4&&n?"few":n?"other":"many"},fields:{year:{displayName:"rok",relative:{0:"tento rok",1:"příští rok","-1":"minulý rok"},relativeTime:{future:{one:"za {0} rok",few:"za {0} roky",many:"za {0} roku",other:"za {0} let"},past:{one:"před {0} rokem",few:"před {0} lety",many:"před {0} roku",other:"před {0} lety"}}},month:{displayName:"měsíc",relative:{0:"tento měsíc",1:"příští měsíc","-1":"minulý měsíc"},relativeTime:{future:{one:"za {0} měsíc",few:"za {0} měsíce",many:"za {0} měsíce",other:"za {0} měsíců"},past:{one:"před {0} měsícem",few:"před {0} měsíci",many:"před {0} měsíce",other:"před {0} měsíci"}}},day:{displayName:"den",relative:{0:"dnes",1:"zítra",2:"pozítří","-2":"předevčírem","-1":"včera"},relativeTime:{future:{one:"za {0} den",few:"za {0} dny",many:"za {0} dne",other:"za {0} dní"},past:{one:"před {0} dnem",few:"před {0} dny",many:"před {0} dne",other:"před {0} dny"}}},hour:{displayName:"hodina",relative:{0:"tuto hodinu"},relativeTime:{future:{one:"za {0} hodinu",few:"za {0} hodiny",many:"za {0} hodiny",other:"za {0} hodin"},past:{one:"před {0} hodinou",few:"před {0} hodinami",many:"před {0} hodiny",other:"před {0} hodinami"}}},minute:{displayName:"minuta",relative:{0:"tuto minutu"},relativeTime:{future:{one:"za {0} minutu",few:"za {0} minuty",many:"za {0} minuty",other:"za {0} minut"},past:{one:"před {0} minutou",few:"před {0} minutami",many:"před {0} minuty",other:"před {0} minutami"}}},second:{displayName:"sekunda",relative:{0:"nyní"},relativeTime:{future:{one:"za {0} sekundu",few:"za {0} sekundy",many:"za {0} sekundy",other:"za {0} sekund"},past:{one:"před {0} sekundou",few:"před {0} sekundami",many:"před {0} sekundy",other:"před {0} sekundami"}}}}},{locale:"cu",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"cy",pluralRuleFunction:function(e,t){return t?0==e||7==e||8==e||9==e?"zero":1==e?"one":2==e?"two":3==e||4==e?"few":5==e||6==e?"many":"other":0==e?"zero":1==e?"one":2==e?"two":3==e?"few":6==e?"many":"other"},fields:{year:{displayName:"blwyddyn",relative:{0:"eleni",1:"blwyddyn nesaf","-1":"llynedd"},relativeTime:{future:{zero:"ymhen {0} mlynedd",one:"ymhen blwyddyn",two:"ymhen {0} flynedd",few:"ymhen {0} blynedd",many:"ymhen {0} blynedd",other:"ymhen {0} mlynedd"},past:{zero:"{0} o flynyddoedd yn ôl",one:"blwyddyn yn ôl",two:"{0} flynedd yn ôl",few:"{0} blynedd yn ôl",many:"{0} blynedd yn ôl",other:"{0} o flynyddoedd yn ôl"}}},month:{displayName:"mis",relative:{0:"y mis hwn",1:"mis nesaf","-1":"mis diwethaf"},relativeTime:{future:{zero:"ymhen {0} mis",one:"ymhen mis",two:"ymhen deufis",few:"ymhen {0} mis",many:"ymhen {0} mis",other:"ymhen {0} mis"},past:{zero:"{0} mis yn ôl",one:"{0} mis yn ôl",two:"{0} fis yn ôl",few:"{0} mis yn ôl",many:"{0} mis yn ôl",other:"{0} mis yn ôl"}}},day:{displayName:"dydd",relative:{0:"heddiw",1:"yfory",2:"drennydd","-2":"echdoe","-1":"ddoe"},relativeTime:{future:{zero:"ymhen {0} diwrnod",one:"ymhen diwrnod",two:"ymhen deuddydd",few:"ymhen tridiau",many:"ymhen {0} diwrnod",other:"ymhen {0} diwrnod"},past:{zero:"{0} diwrnod yn ôl",one:"{0} diwrnod yn ôl",two:"{0} ddiwrnod yn ôl",few:"{0} diwrnod yn ôl",many:"{0} diwrnod yn ôl",other:"{0} diwrnod yn ôl"}}},hour:{displayName:"awr",relative:{0:"yr awr hon"},relativeTime:{future:{zero:"ymhen {0} awr",one:"ymhen awr",two:"ymhen {0} awr",few:"ymhen {0} awr",many:"ymhen {0} awr",other:"ymhen {0} awr"},past:{zero:"{0} awr yn ôl",one:"awr yn ôl",two:"{0} awr yn ôl",few:"{0} awr yn ôl",many:"{0} awr yn ôl",other:"{0} awr yn ôl"}}},minute:{displayName:"munud",relative:{0:"y funud hon"},relativeTime:{future:{zero:"ymhen {0} munud",one:"ymhen munud",two:"ymhen {0} funud",few:"ymhen {0} munud",many:"ymhen {0} munud",other:"ymhen {0} munud"},past:{zero:"{0} munud yn ôl",one:"{0} munud yn ôl",two:"{0} funud yn ôl",few:"{0} munud yn ôl",many:"{0} munud yn ôl",other:"{0} munud yn ôl"}}},second:{displayName:"eiliad",relative:{0:"nawr"},relativeTime:{future:{zero:"ymhen {0} eiliad",one:"ymhen eiliad",two:"ymhen {0} eiliad",few:"ymhen {0} eiliad",many:"ymhen {0} eiliad",other:"ymhen {0} eiliad"},past:{zero:"{0} eiliad yn ôl",one:"eiliad yn ôl",two:"{0} eiliad yn ôl",few:"{0} eiliad yn ôl",many:"{0} eiliad yn ôl",other:"{0} eiliad yn ôl"}}}}},{locale:"da",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=Number(r[0])==e;return t?"other":1!=e&&(n||0!=a&&1!=a)?"other":"one"},fields:{year:{displayName:"år",relative:{0:"i år",1:"næste år","-1":"sidste år"},relativeTime:{future:{one:"om {0} år",other:"om {0} år"},past:{one:"for {0} år siden",other:"for {0} år siden"}}},month:{displayName:"måned",relative:{0:"denne måned",1:"næste måned","-1":"sidste måned"},relativeTime:{future:{one:"om {0} måned",other:"om {0} måneder"},past:{one:"for {0} måned siden",other:"for {0} måneder siden"}}},day:{displayName:"dag",relative:{0:"i dag",1:"i morgen",2:"i overmorgen","-2":"i forgårs","-1":"i går"},relativeTime:{future:{one:"om {0} dag",other:"om {0} dage"},past:{one:"for {0} dag siden",other:"for {0} dage siden"}}},hour:{displayName:"time",relative:{0:"i den kommende time"},relativeTime:{future:{one:"om {0} time",other:"om {0} timer"},past:{one:"for {0} time siden",other:"for {0} timer siden"}}},minute:{displayName:"minut",relative:{0:"i det kommende minut"},relativeTime:{future:{one:"om {0} minut",other:"om {0} minutter"},past:{one:"for {0} minut siden",other:"for {0} minutter siden"}}},second:{displayName:"sekund",relative:{0:"nu"},relativeTime:{future:{one:"om {0} sekund",other:"om {0} sekunder"},past:{one:"for {0} sekund siden",other:"for {0} sekunder siden"}}}}},{locale:"da-GL",parentLocale:"da"},{locale:"dav",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Mwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mori",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ituku",relative:{0:"Idime",1:"Kesho","-1":"Iguo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Dakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"de",pluralRuleFunction:function(e,t){var r=!String(e).split(".")[1];return t?"other":1==e&&r?"one":"other"},fields:{year:{displayName:"Jahr",relative:{0:"dieses Jahr",1:"nächstes Jahr","-1":"letztes Jahr"},relativeTime:{future:{one:"in {0} Jahr",other:"in {0} Jahren"},past:{one:"vor {0} Jahr",other:"vor {0} Jahren"}}},month:{displayName:"Monat",relative:{0:"diesen Monat",1:"nächsten Monat","-1":"letzten Monat"},relativeTime:{future:{one:"in {0} Monat",other:"in {0} Monaten"},past:{one:"vor {0} Monat",other:"vor {0} Monaten"}}},day:{displayName:"Tag",relative:{0:"heute",1:"morgen",2:"übermorgen","-2":"vorgestern","-1":"gestern"},relativeTime:{future:{one:"in {0} Tag",other:"in {0} Tagen"},past:{one:"vor {0} Tag",other:"vor {0} Tagen"}}},hour:{displayName:"Stunde",relative:{0:"in dieser Stunde"},relativeTime:{future:{one:"in {0} Stunde",other:"in {0} Stunden"},past:{one:"vor {0} Stunde",other:"vor {0} Stunden"}}},minute:{displayName:"Minute",relative:{0:"in dieser Minute"},relativeTime:{future:{one:"in {0} Minute",other:"in {0} Minuten"},past:{one:"vor {0} Minute",other:"vor {0} Minuten"}}},second:{displayName:"Sekunde",relative:{0:"jetzt"},relativeTime:{future:{one:"in {0} Sekunde",other:"in {0} Sekunden"},past:{one:"vor {0} Sekunde",other:"vor {0} Sekunden"}}}}},{locale:"de-AT",parentLocale:"de"},{locale:"de-BE",parentLocale:"de"},{locale:"de-CH",parentLocale:"de"},{locale:"de-IT",parentLocale:"de"},{locale:"de-LI",parentLocale:"de"},{locale:"de-LU",parentLocale:"de"},{locale:"dje",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Jiiri",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Handu",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Zaari",relative:{0:"Hõo",1:"Suba","-1":"Bi"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Guuru",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Miniti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Miti",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"dsb",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-2),l=n.slice(-2);return t?"other":o&&1==i||1==l?"one":o&&2==i||2==l?"two":o&&(3==i||4==i)||3==l||4==l?"few":"other"},fields:{year:{displayName:"lěto",relative:{0:"lětosa",1:"znowa","-1":"łoni"},relativeTime:{future:{one:"za {0} lěto",two:"za {0} lěśe",few:"za {0} lěta",other:"za {0} lět"},past:{one:"pśed {0} lětom",two:"pśed {0} lětoma",few:"pśed {0} lětami",other:"pśed {0} lětami"}}},month:{displayName:"mjasec",relative:{0:"ten mjasec",1:"pśiducy mjasec","-1":"slědny mjasec"},relativeTime:{future:{one:"za {0} mjasec",two:"za {0} mjaseca",few:"za {0} mjasecy",other:"za {0} mjasecow"},past:{one:"pśed {0} mjasecom",two:"pśed {0} mjasecoma",few:"pśed {0} mjasecami",other:"pśed {0} mjasecami"}}},day:{displayName:"źeń",relative:{0:"źinsa",1:"witśe","-1":"cora"},relativeTime:{future:{one:"za {0} źeń",two:"za {0} dnja",few:"za {0} dny",other:"za {0} dnjow"},past:{one:"pśed {0} dnjom",two:"pśed {0} dnjoma",few:"pśed {0} dnjami",other:"pśed {0} dnjami"}}},hour:{displayName:"góźina",relative:{0:"this hour"},relativeTime:{future:{one:"za {0} góźinu",two:"za {0} góźinje",few:"za {0} góźiny",other:"za {0} góźin"},past:{one:"pśed {0} góźinu",two:"pśed {0} góźinoma",few:"pśed {0} góźinami",other:"pśed {0} góźinami"}}},minute:{displayName:"minuta",relative:{0:"this minute"},relativeTime:{future:{one:"za {0} minutu",two:"za {0} minuśe",few:"za {0} minuty",other:"za {0} minutow"},past:{one:"pśed {0} minutu",two:"pśed {0} minutoma",few:"pśed {0} minutami",other:"pśed {0} minutami"}}},second:{displayName:"sekunda",relative:{0:"now"},relativeTime:{future:{one:"za {0} sekundu",two:"za {0} sekunźe",few:"za {0} sekundy",other:"za {0} sekundow"},past:{one:"pśed {0} sekundu",two:"pśed {0} sekundoma",few:"pśed {0} sekundami",other:"pśed {0} sekundami"}}}}},{locale:"dua",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"mbú",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"mɔ́di",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"búnyá",relative:{0:"wɛ́ŋgɛ̄",1:"kíɛlɛ","-1":"kíɛlɛ nítómb́í"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"ŋgandɛ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"ndɔkɔ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"píndí",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"dv",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"dyo",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Emit",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Fuleeŋ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Funak",relative:{0:"Jaat",1:"Kajom","-1":"Fucen"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"dz",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"ལོ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"ལོ་འཁོར་ {0} ནང་"},past:{other:"ལོ་འཁོར་ {0} ཧེ་མ་"}}},month:{displayName:"ཟླ་ཝ་",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"ཟླཝ་ {0} ནང་"},past:{other:"ཟླཝ་ {0} ཧེ་མ་"}}},day:{displayName:"ཚེས་",relative:{0:"ད་རིས་",1:"ནངས་པ་",2:"གནངས་ཚེ","-2":"ཁ་ཉིམ","-1":"ཁ་ཙ་"},relativeTime:{future:{other:"ཉིནམ་ {0} ནང་"},past:{other:"ཉིནམ་ {0} ཧེ་མ་"}}},hour:{displayName:"ཆུ་ཚོད",relative:{0:"this hour"},relativeTime:{future:{other:"ཆུ་ཚོད་ {0} ནང་"},past:{other:"ཆུ་ཚོད་ {0} ཧེ་མ་"}}},minute:{displayName:"སྐར་མ",relative:{0:"this minute"},relativeTime:{future:{other:"སྐར་མ་ {0} ནང་"},past:{other:"སྐར་མ་ {0} ཧེ་མ་"}}},second:{displayName:"སྐར་ཆཱ་",relative:{0:"now"},relativeTime:{future:{other:"སྐར་ཆ་ {0} ནང་"},past:{other:"སྐར་ཆ་ {0} ཧེ་མ་"}}}}},{locale:"ebu",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Mwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mweri",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Mũthenya",relative:{0:"Ũmũnthĩ",1:"Rũciũ","-1":"Ĩgoro"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Ithaa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Ndagĩka",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekondi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ee",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"ƒe",relative:{0:"ƒe sia",1:"ƒe si gbɔ na","-1":"ƒe si va yi"},relativeTime:{future:{one:"le ƒe {0} me",other:"le ƒe {0} me"},past:{one:"ƒe {0} si va yi",other:"ƒe {0} si wo va yi"}}},month:{displayName:"ɣleti",relative:{0:"ɣleti sia",1:"ɣleti si gbɔ na","-1":"ɣleti si va yi"},relativeTime:{future:{one:"le ɣleti {0} me",other:"le ɣleti {0} wo me"},past:{one:"ɣleti {0} si va yi",other:"ɣleti {0} si wo va yi"}}},day:{displayName:"ŋkeke",relative:{0:"egbe",1:"etsɔ si gbɔna",2:"nyitsɔ si gbɔna","-2":"nyitsɔ si va yi","-1":"etsɔ si va yi"},relativeTime:{future:{one:"le ŋkeke {0} me",other:"le ŋkeke {0} wo me"},past:{one:"ŋkeke {0} si va yi",other:"ŋkeke {0} si wo va yi"}}},hour:{displayName:"gaƒoƒo",relative:{0:"this hour"},relativeTime:{future:{one:"le gaƒoƒo {0} me",other:"le gaƒoƒo {0} wo me"},past:{one:"gaƒoƒo {0} si va yi",other:"gaƒoƒo {0} si wo va yi"}}},minute:{displayName:"aɖabaƒoƒo",relative:{0:"this minute"},relativeTime:{future:{one:"le aɖabaƒoƒo {0} me",other:"le aɖabaƒoƒo {0} wo me"},past:{one:"aɖabaƒoƒo {0} si va yi",other:"aɖabaƒoƒo {0} si wo va yi"}}},second:{displayName:"sekend",relative:{0:"fifi"},relativeTime:{future:{one:"le sekend {0} me",other:"le sekend {0} wo me"},past:{one:"sekend {0} si va yi",other:"sekend {0} si wo va yi"}}}}},{locale:"ee-TG",parentLocale:"ee"},{locale:"el",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"έτος",relative:{0:"φέτος",1:"επόμενο έτος","-1":"πέρσι"},relativeTime:{future:{one:"σε {0} έτος",other:"σε {0} έτη"},past:{one:"πριν από {0} έτος",other:"πριν από {0} έτη"}}},month:{displayName:"μήνας",relative:{0:"τρέχων μήνας",1:"επόμενος μήνας","-1":"προηγούμενος μήνας"},relativeTime:{future:{one:"σε {0} μήνα",other:"σε {0} μήνες"},past:{one:"πριν από {0} μήνα",other:"πριν από {0} μήνες"}}},day:{displayName:"ημέρα",relative:{0:"σήμερα",1:"αύριο",2:"μεθαύριο","-2":"προχθές","-1":"χθες"},relativeTime:{future:{one:"σε {0} ημέρα",other:"σε {0} ημέρες"},past:{one:"πριν από {0} ημέρα",other:"πριν από {0} ημέρες"}}},hour:{displayName:"ώρα",relative:{0:"αυτήν την ώρα"},relativeTime:{future:{one:"σε {0} ώρα",other:"σε {0} ώρες"},past:{one:"πριν από {0} ώρα",other:"πριν από {0} ώρες"}}},minute:{displayName:"λεπτό",relative:{0:"αυτό το λεπτό"},relativeTime:{future:{one:"σε {0} λεπτό",other:"σε {0} λεπτά"},past:{one:"πριν από {0} λεπτό",other:"πριν από {0} λεπτά"}}},second:{displayName:"δευτερόλεπτο",relative:{0:"τώρα"},relativeTime:{future:{one:"σε {0} δευτερόλεπτο",other:"σε {0} δευτερόλεπτα"},past:{one:"πριν από {0} δευτερόλεπτο",other:"πριν από {0} δευτερόλεπτα"}}}}},{locale:"el-CY",parentLocale:"el"},{locale:"en",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1],n=Number(r[0])==e,o=n&&r[0].slice(-1),i=n&&r[0].slice(-2);return t?1==o&&11!=i?"one":2==o&&12!=i?"two":3==o&&13!=i?"few":"other":1==e&&a?"one":"other"},fields:{year:{displayName:"year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"in {0} year",other:"in {0} years"},past:{one:"{0} year ago",other:"{0} years ago"}}},month:{displayName:"month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"in {0} month",other:"in {0} months"},past:{one:"{0} month ago",other:"{0} months ago"}}},day:{displayName:"day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{one:"in {0} day",other:"in {0} days"},past:{one:"{0} day ago",other:"{0} days ago"}}},hour:{displayName:"hour",relative:{0:"this hour"},relativeTime:{future:{one:"in {0} hour",other:"in {0} hours"},past:{one:"{0} hour ago",other:"{0} hours ago"}}},minute:{displayName:"minute",relative:{0:"this minute"},relativeTime:{future:{one:"in {0} minute",other:"in {0} minutes"},past:{one:"{0} minute ago",other:"{0} minutes ago"}}},second:{displayName:"second",relative:{0:"now"},relativeTime:{future:{one:"in {0} second",other:"in {0} seconds"},past:{one:"{0} second ago",other:"{0} seconds ago"}}}}},{locale:"en-001",parentLocale:"en"},{locale:"en-150",parentLocale:"en-001"},{locale:"en-AG",parentLocale:"en-001"},{locale:"en-AI",parentLocale:"en-001"},{locale:"en-AS",parentLocale:"en"},{locale:"en-AT",parentLocale:"en-150"},{locale:"en-AU",parentLocale:"en-001"},{locale:"en-BB",parentLocale:"en-001"},{locale:"en-BE",parentLocale:"en-001"},{locale:"en-BI",parentLocale:"en"},{locale:"en-BM",parentLocale:"en-001"},{locale:"en-BS",parentLocale:"en-001"},{locale:"en-BW",parentLocale:"en-001"},{locale:"en-BZ",parentLocale:"en-001"},{locale:"en-CA",parentLocale:"en-001"},{locale:"en-CC",parentLocale:"en-001"},{locale:"en-CH",parentLocale:"en-150"},{locale:"en-CK",parentLocale:"en-001"},{locale:"en-CM",parentLocale:"en-001"},{locale:"en-CX",parentLocale:"en-001"},{locale:"en-CY",parentLocale:"en-001"},{locale:"en-DE",parentLocale:"en-150"},{locale:"en-DG",parentLocale:"en-001"},{locale:"en-DK",parentLocale:"en-150"},{locale:"en-DM",parentLocale:"en-001"},{locale:"en-Dsrt",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"en-ER",parentLocale:"en-001"},{locale:"en-FI",parentLocale:"en-150"},{locale:"en-FJ",parentLocale:"en-001"},{locale:"en-FK",parentLocale:"en-001"},{locale:"en-FM",parentLocale:"en-001"},{locale:"en-GB",parentLocale:"en-001"},{locale:"en-GD",parentLocale:"en-001"},{locale:"en-GG",parentLocale:"en-001"},{locale:"en-GH",parentLocale:"en-001"},{locale:"en-GI",parentLocale:"en-001"},{locale:"en-GM",parentLocale:"en-001"},{locale:"en-GU",parentLocale:"en"},{locale:"en-GY",parentLocale:"en-001"},{locale:"en-HK",parentLocale:"en-001"},{locale:"en-IE",parentLocale:"en-001"},{locale:"en-IL",parentLocale:"en-001"},{locale:"en-IM",parentLocale:"en-001"},{locale:"en-IN",parentLocale:"en-001"},{locale:"en-IO",parentLocale:"en-001"},{locale:"en-JE",parentLocale:"en-001"},{locale:"en-JM",parentLocale:"en-001"},{locale:"en-KE",parentLocale:"en-001"},{locale:"en-KI",parentLocale:"en-001"},{locale:"en-KN",parentLocale:"en-001"},{locale:"en-KY",parentLocale:"en-001"},{locale:"en-LC",parentLocale:"en-001"},{locale:"en-LR",parentLocale:"en-001"},{locale:"en-LS",parentLocale:"en-001"},{locale:"en-MG",parentLocale:"en-001"},{locale:"en-MH",parentLocale:"en"},{locale:"en-MO",parentLocale:"en-001"},{locale:"en-MP",parentLocale:"en"},{locale:"en-MS",parentLocale:"en-001"},{locale:"en-MT",parentLocale:"en-001"},{locale:"en-MU",parentLocale:"en-001"},{locale:"en-MW",parentLocale:"en-001"},{locale:"en-MY",parentLocale:"en-001"},{locale:"en-NA",parentLocale:"en-001"},{locale:"en-NF",parentLocale:"en-001"},{locale:"en-NG",parentLocale:"en-001"},{locale:"en-NL",parentLocale:"en-150"},{locale:"en-NR",parentLocale:"en-001"},{locale:"en-NU",parentLocale:"en-001"},{locale:"en-NZ",parentLocale:"en-001"},{locale:"en-PG",parentLocale:"en-001"},{locale:"en-PH",parentLocale:"en-001"},{locale:"en-PK",parentLocale:"en-001"},{locale:"en-PN",parentLocale:"en-001"},{locale:"en-PR",parentLocale:"en"},{locale:"en-PW",parentLocale:"en-001"},{locale:"en-RW",parentLocale:"en-001"},{locale:"en-SB",parentLocale:"en-001"},{locale:"en-SC",parentLocale:"en-001"},{locale:"en-SD",parentLocale:"en-001"},{locale:"en-SE",parentLocale:"en-150"},{locale:"en-SG",parentLocale:"en-001"},{locale:"en-SH",parentLocale:"en-001"},{locale:"en-SI",parentLocale:"en-150"},{locale:"en-SL",parentLocale:"en-001"},{locale:"en-SS",parentLocale:"en-001"},{locale:"en-SX",parentLocale:"en-001"},{locale:"en-SZ",parentLocale:"en-001"},{locale:"en-Shaw",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"en-TC",parentLocale:"en-001"},{locale:"en-TK",parentLocale:"en-001"},{locale:"en-TO",parentLocale:"en-001"},{locale:"en-TT",parentLocale:"en-001"},{locale:"en-TV",parentLocale:"en-001"},{locale:"en-TZ",parentLocale:"en-001"},{locale:"en-UG",parentLocale:"en-001"},{locale:"en-UM",parentLocale:"en"},{locale:"en-US",parentLocale:"en"},{locale:"en-VC",parentLocale:"en-001"},{locale:"en-VG",parentLocale:"en-001"},{locale:"en-VI",parentLocale:"en"},{locale:"en-VU",parentLocale:"en-001"},{locale:"en-WS",parentLocale:"en-001"},{locale:"en-ZA",parentLocale:"en-001"},{locale:"en-ZM",parentLocale:"en-001"},{locale:"en-ZW",parentLocale:"en-001"},{locale:"eo",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"es",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"anteayer","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},minute:{displayName:"minuto",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}}}},{locale:"es-419",parentLocale:"es"},{locale:"es-AR",parentLocale:"es-419"},{locale:"es-BO",parentLocale:"es-419"},{locale:"es-BR",parentLocale:"es-419"},{locale:"es-BZ",parentLocale:"es-419"},{locale:"es-CL",parentLocale:"es-419"},{locale:"es-CO",parentLocale:"es-419"},{locale:"es-CR",parentLocale:"es-419",fields:{year:{displayName:"año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"antier","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},minute:{displayName:"minuto",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}}}},{locale:"es-CU",parentLocale:"es-419"},{locale:"es-DO",parentLocale:"es-419",fields:{year:{displayName:"Año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},month:{displayName:"Mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},day:{displayName:"Día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"anteayer","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},minute:{displayName:"Minuto",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},second:{displayName:"Segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}}}},{locale:"es-EA",parentLocale:"es"},{locale:"es-EC",parentLocale:"es-419"},{locale:"es-GQ",parentLocale:"es"},{locale:"es-GT",parentLocale:"es-419",fields:{year:{displayName:"año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"antier","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},minute:{displayName:"minuto",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}}}},{locale:"es-HN",parentLocale:"es-419",fields:{year:{displayName:"año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"antier","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},minute:{displayName:"minuto",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}}}},{locale:"es-IC",parentLocale:"es"},{locale:"es-MX",parentLocale:"es-419",fields:{year:{displayName:"año",relative:{0:"este año",1:"el año próximo","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el mes próximo","-1":"el mes pasado"},relativeTime:{future:{one:"en {0} mes",other:"en {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"antier","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},minute:{displayName:"minuto",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}}}},{locale:"es-NI",parentLocale:"es-419",fields:{year:{displayName:"año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"antier","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},minute:{displayName:"minuto",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}}}},{locale:"es-PA",parentLocale:"es-419",fields:{year:{displayName:"año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"antier","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},minute:{displayName:"minuto",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}}}},{locale:"es-PE",parentLocale:"es-419"},{locale:"es-PH",parentLocale:"es"},{locale:"es-PR",parentLocale:"es-419"},{locale:"es-PY",parentLocale:"es-419",fields:{year:{displayName:"año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"antes de ayer","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},minute:{displayName:"minuto",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}}}},{locale:"es-SV",parentLocale:"es-419",fields:{year:{displayName:"año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"antier","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},minute:{displayName:"minuto",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}}}},{locale:"es-US",parentLocale:"es-419"},{locale:"es-UY",parentLocale:"es-419"},{locale:"es-VE",parentLocale:"es-419"},{locale:"et",pluralRuleFunction:function(e,t){var r=!String(e).split(".")[1];return t?"other":1==e&&r?"one":"other"},fields:{year:{displayName:"aasta",relative:{0:"käesolev aasta",1:"järgmine aasta","-1":"eelmine aasta"},relativeTime:{future:{one:"{0} aasta pärast",other:"{0} aasta pärast"},past:{one:"{0} aasta eest",other:"{0} aasta eest"}}},month:{displayName:"kuu",relative:{0:"käesolev kuu",1:"järgmine kuu","-1":"eelmine kuu"},relativeTime:{future:{one:"{0} kuu pärast",other:"{0} kuu pärast"},past:{one:"{0} kuu eest",other:"{0} kuu eest"}}},day:{displayName:"päev",relative:{0:"täna",1:"homme",2:"ülehomme","-2":"üleeile","-1":"eile"},relativeTime:{future:{one:"{0} päeva pärast",other:"{0} päeva pärast"},past:{one:"{0} päeva eest",other:"{0} päeva eest"}}},hour:{displayName:"tund",relative:{0:"praegusel tunnil"},relativeTime:{future:{one:"{0} tunni pärast",other:"{0} tunni pärast"},past:{one:"{0} tunni eest",other:"{0} tunni eest"}}},minute:{displayName:"minut",relative:{0:"praegusel minutil"},relativeTime:{future:{one:"{0} minuti pärast",other:"{0} minuti pärast"},past:{one:"{0} minuti eest",other:"{0} minuti eest"}}},second:{displayName:"sekund",relative:{0:"nüüd"},relativeTime:{future:{one:"{0} sekundi pärast",other:"{0} sekundi pärast"},past:{one:"{0} sekundi eest",other:"{0} sekundi eest"}}}}},{locale:"eu",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"urtea",relative:{0:"aurten",1:"hurrengo urtea","-1":"aurreko urtea"},relativeTime:{future:{one:"{0} urte barru",other:"{0} urte barru"},past:{one:"Duela {0} urte",other:"Duela {0} urte"}}},month:{displayName:"hilabetea",relative:{0:"hilabete hau",1:"hurrengo hilabetea","-1":"aurreko hilabetea"},relativeTime:{future:{one:"{0} hilabete barru",other:"{0} hilabete barru"},past:{one:"Duela {0} hilabete",other:"Duela {0} hilabete"}}},day:{displayName:"eguna",relative:{0:"gaur",1:"bihar",2:"etzi","-2":"herenegun","-1":"atzo"},relativeTime:{future:{one:"{0} egun barru",other:"{0} egun barru"},past:{one:"Duela {0} egun",other:"Duela {0} egun"}}},hour:{displayName:"ordua",relative:{0:"ordu honetan"},relativeTime:{future:{one:"{0} ordu barru",other:"{0} ordu barru"},past:{one:"Duela {0} ordu",other:"Duela {0} ordu"}}},minute:{displayName:"minutua",relative:{0:"minutu honetan"},relativeTime:{future:{one:"{0} minutu barru",other:"{0} minutu barru"},past:{one:"Duela {0} minutu",other:"Duela {0} minutu"}}},second:{displayName:"segundoa",relative:{0:"orain"},relativeTime:{future:{one:"{0} segundo barru",other:"{0} segundo barru"},past:{one:"Duela {0} segundo",other:"Duela {0} segundo"}}}}},{locale:"ewo",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"M̀bú",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Ngɔn",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Amǒs",relative:{0:"Aná",1:"Okírí","-1":"Angogé"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Awola",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Enútɛn",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Akábəga",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"fa",pluralRuleFunction:function(e,t){return t?"other":e>=0&&e<=1?"one":"other"},fields:{year:{displayName:"سال",relative:{0:"امسال",1:"سال آینده","-1":"سال گذشته"},relativeTime:{future:{one:"{0} سال بعد",other:"{0} سال بعد"},past:{one:"{0} سال پیش",other:"{0} سال پیش"}}},month:{displayName:"ماه",relative:{0:"این ماه",1:"ماه آینده","-1":"ماه گذشته"},relativeTime:{future:{one:"{0} ماه بعد",other:"{0} ماه بعد"},past:{one:"{0} ماه پیش",other:"{0} ماه پیش"}}},day:{displayName:"روز",relative:{0:"امروز",1:"فردا",2:"پس‌فردا","-2":"پریروز","-1":"دیروز"},relativeTime:{future:{one:"{0} روز بعد",other:"{0} روز بعد"},past:{one:"{0} روز پیش",other:"{0} روز پیش"}}},hour:{displayName:"ساعت",relative:{0:"همین ساعت"},relativeTime:{future:{one:"{0} ساعت بعد",other:"{0} ساعت بعد"},past:{one:"{0} ساعت پیش",other:"{0} ساعت پیش"}}},minute:{displayName:"دقیقه",relative:{0:"همین دقیقه"},relativeTime:{future:{one:"{0} دقیقه بعد",other:"{0} دقیقه بعد"},past:{one:"{0} دقیقه پیش",other:"{0} دقیقه پیش"}}},second:{displayName:"ثانیه",relative:{0:"اکنون"},relativeTime:{future:{one:"{0} ثانیه بعد",other:"{0} ثانیه بعد"},past:{one:"{0} ثانیه پیش",other:"{0} ثانیه پیش"}}}}},{locale:"fa-AF",parentLocale:"fa"},{locale:"ff",pluralRuleFunction:function(e,t){return t?"other":e>=0&&e<2?"one":"other"},fields:{year:{displayName:"Hitaande",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Lewru",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ñalnde",relative:{0:"Hannde",1:"Jaŋngo","-1":"Haŋki"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Waktu",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Hoƴom",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Majaango",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ff-CM",parentLocale:"ff"},{locale:"ff-GN",parentLocale:"ff"},{locale:"ff-MR",parentLocale:"ff"},{locale:"fi",pluralRuleFunction:function(e,t){var r=!String(e).split(".")[1];return t?"other":1==e&&r?"one":"other"},fields:{year:{displayName:"vuosi",relative:{0:"tänä vuonna",1:"ensi vuonna","-1":"viime vuonna"},relativeTime:{future:{one:"{0} vuoden päästä",other:"{0} vuoden päästä"},past:{one:"{0} vuosi sitten",other:"{0} vuotta sitten"}}},month:{displayName:"kuukausi",relative:{0:"tässä kuussa",1:"ensi kuussa","-1":"viime kuussa"},relativeTime:{future:{one:"{0} kuukauden päästä",other:"{0} kuukauden päästä"},past:{one:"{0} kuukausi sitten",other:"{0} kuukautta sitten"}}},day:{displayName:"päivä",relative:{0:"tänään",1:"huomenna",2:"ylihuomenna","-2":"toissa päivänä","-1":"eilen"},relativeTime:{future:{one:"{0} päivän päästä",other:"{0} päivän päästä"},past:{one:"{0} päivä sitten",other:"{0} päivää sitten"}}},hour:{displayName:"tunti",relative:{0:"tämän tunnin aikana"},relativeTime:{future:{one:"{0} tunnin päästä",other:"{0} tunnin päästä"},past:{one:"{0} tunti sitten",other:"{0} tuntia sitten"}}},minute:{displayName:"minuutti",relative:{0:"tämän minuutin aikana"},relativeTime:{future:{one:"{0} minuutin päästä",other:"{0} minuutin päästä"},past:{one:"{0} minuutti sitten",other:"{0} minuuttia sitten"}}},second:{displayName:"sekunti",relative:{0:"nyt"},relativeTime:{future:{one:"{0} sekunnin päästä",other:"{0} sekunnin päästä"},past:{one:"{0} sekunti sitten",other:"{0} sekuntia sitten"}}}}},{locale:"fil",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=n.slice(-1);return t?1==e?"one":"other":o&&(1==a||2==a||3==a)||o&&4!=i&&6!=i&&9!=i||!o&&4!=l&&6!=l&&9!=l?"one":"other"},fields:{year:{displayName:"taon",relative:{0:"ngayong taon",1:"susunod na taon","-1":"nakaraang taon"},relativeTime:{future:{one:"sa {0} taon",other:"sa {0} (na) taon"},past:{one:"{0} taon ang nakalipas",other:"{0} (na) taon ang nakalipas"}}},month:{displayName:"buwan",relative:{0:"ngayong buwan",1:"susunod na buwan","-1":"nakaraang buwan"},relativeTime:{future:{one:"sa {0} buwan",other:"sa {0} (na) buwan"},past:{one:"{0} buwan ang nakalipas",other:"{0} (na) buwan ang nakalipas"}}},day:{displayName:"araw",relative:{0:"ngayong araw",1:"bukas",2:"Samakalawa","-2":"Araw bago ang kahapon","-1":"kahapon"},relativeTime:{future:{one:"sa {0} araw",other:"sa {0} (na) araw"},past:{one:"{0} araw ang nakalipas",other:"{0} (na) araw ang nakalipas"}}},hour:{displayName:"oras",relative:{0:"ngayong oras"},relativeTime:{future:{one:"sa {0} oras",other:"sa {0} (na) oras"},past:{one:"{0} oras ang nakalipas",other:"{0} (na) oras ang nakalipas"}}},minute:{displayName:"minuto",relative:{0:"sa minutong ito"},relativeTime:{future:{one:"sa {0} minuto",other:"sa {0} (na) minuto"},past:{one:"{0} minuto ang nakalipas",other:"{0} (na) minuto ang nakalipas"}}},second:{displayName:"segundo",relative:{0:"ngayon"},relativeTime:{future:{one:"sa {0} segundo",other:"sa {0} (na) segundo"},past:{one:"{0} segundo ang nakalipas",other:"{0} (na) segundo ang nakalipas"}}}}},{locale:"fo",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"ár",relative:{0:"í ár",1:"næsta ár","-1":"í fjør"},relativeTime:{future:{one:"um {0} ár",other:"um {0} ár"},past:{one:"{0} ár síðan",other:"{0} ár síðan"}}},month:{displayName:"mánaður",relative:{0:"henda mánaðin",1:"næsta mánað","-1":"seinasta mánað"},relativeTime:{future:{one:"um {0} mánað",other:"um {0} mánaðir"},past:{one:"{0} mánað síðan",other:"{0} mánaðir síðan"}}},day:{displayName:"dagur",relative:{0:"í dag",1:"í morgin",2:"í ovurmorgin","-2":"fyrradagin","-1":"í gjár"},relativeTime:{future:{one:"um {0} dag",other:"um {0} dagar"},past:{one:"{0} dagur síðan",other:"{0} dagar síðan"}}},hour:{displayName:"tími",relative:{0:"hendan tíman"},relativeTime:{future:{one:"um {0} tíma",other:"um {0} tímar"},past:{one:"{0} tími síðan",other:"{0} tímar síðan"}}},minute:{displayName:"minuttur",relative:{0:"hendan minuttin"},relativeTime:{future:{one:"um {0} minutt",other:"um {0} minuttir"},past:{one:"{0} minutt síðan",other:"{0} minuttir síðan"}}},second:{displayName:"sekund",relative:{0:"nú"},relativeTime:{future:{one:"um {0} sekund",other:"um {0} sekund"},past:{one:"{0} sekund síðan",other:"{0} sekund síðan"}}}}},{locale:"fo-DK",parentLocale:"fo"},{locale:"fr",pluralRuleFunction:function(e,t){return t?1==e?"one":"other":e>=0&&e<2?"one":"other"},fields:{year:{displayName:"année",relative:{0:"cette année",1:"l’année prochaine","-1":"l’année dernière"},relativeTime:{future:{one:"dans {0} an",other:"dans {0} ans"},past:{one:"il y a {0} an",other:"il y a {0} ans"}}},month:{displayName:"mois",relative:{0:"ce mois-ci",1:"le mois prochain","-1":"le mois dernier"},relativeTime:{future:{one:"dans {0} mois",other:"dans {0} mois"},past:{one:"il y a {0} mois",other:"il y a {0} mois"}}},day:{displayName:"jour",relative:{0:"aujourd’hui",1:"demain",2:"après-demain","-2":"avant-hier","-1":"hier"},relativeTime:{future:{one:"dans {0} jour",other:"dans {0} jours"},past:{one:"il y a {0} jour",other:"il y a {0} jours"}}},hour:{displayName:"heure",relative:{0:"cette heure-ci"},relativeTime:{future:{one:"dans {0} heure",other:"dans {0} heures"},past:{one:"il y a {0} heure",other:"il y a {0} heures"}}},minute:{displayName:"minute",relative:{0:"cette minute-ci"},relativeTime:{future:{one:"dans {0} minute",other:"dans {0} minutes"},past:{one:"il y a {0} minute",other:"il y a {0} minutes"}}},second:{displayName:"seconde",relative:{0:"maintenant"},relativeTime:{future:{one:"dans {0} seconde",other:"dans {0} secondes"},past:{one:"il y a {0} seconde",other:"il y a {0} secondes"}}}}},{locale:"fr-BE",parentLocale:"fr"},{locale:"fr-BF",parentLocale:"fr"},{locale:"fr-BI",parentLocale:"fr"},{locale:"fr-BJ",parentLocale:"fr"},{locale:"fr-BL",parentLocale:"fr"},{locale:"fr-CA",parentLocale:"fr",fields:{year:{displayName:"année",relative:{0:"cette année",1:"l’année prochaine","-1":"l’année dernière"},relativeTime:{future:{one:"Dans {0} an",other:"Dans {0} ans"},past:{one:"Il y a {0} an",other:"Il y a {0} ans"}}},month:{displayName:"mois",relative:{0:"ce mois-ci",1:"le mois prochain","-1":"le mois dernier"},relativeTime:{future:{one:"dans {0} mois",other:"dans {0} mois"},past:{one:"il y a {0} mois",other:"il y a {0} mois"}}},day:{displayName:"jour",relative:{0:"aujourd’hui",1:"demain",2:"après-demain","-2":"avant-hier","-1":"hier"},relativeTime:{future:{one:"dans {0} jour",other:"dans {0} jours"},past:{one:"il y a {0} jour",other:"il y a {0} jours"}}},hour:{displayName:"heure",relative:{0:"cette heure-ci"},relativeTime:{future:{one:"dans {0} heure",other:"dans {0} heures"},past:{one:"il y a {0} heure",other:"il y a {0} heures"}}},minute:{displayName:"minute",relative:{0:"cette minute-ci"},relativeTime:{future:{one:"dans {0} minute",other:"dans {0} minutes"},past:{one:"il y a {0} minute",other:"il y a {0} minutes"}}},second:{displayName:"seconde",relative:{0:"maintenant"},relativeTime:{future:{one:"dans {0} seconde",other:"dans {0} secondes"},past:{one:"il y a {0} seconde",other:"il y a {0} secondes"}}}}},{locale:"fr-CD",parentLocale:"fr"},{locale:"fr-CF",parentLocale:"fr"},{locale:"fr-CG",parentLocale:"fr"},{locale:"fr-CH",parentLocale:"fr"},{locale:"fr-CI",parentLocale:"fr"},{locale:"fr-CM",parentLocale:"fr"},{locale:"fr-DJ",parentLocale:"fr"},{locale:"fr-DZ",parentLocale:"fr"},{locale:"fr-GA",parentLocale:"fr"},{locale:"fr-GF",parentLocale:"fr"},{locale:"fr-GN",parentLocale:"fr"},{locale:"fr-GP",parentLocale:"fr"},{locale:"fr-GQ",parentLocale:"fr"},{locale:"fr-HT",parentLocale:"fr"},{locale:"fr-KM",parentLocale:"fr"},{locale:"fr-LU",parentLocale:"fr"},{locale:"fr-MA",parentLocale:"fr"},{locale:"fr-MC",parentLocale:"fr"},{locale:"fr-MF",parentLocale:"fr"},{locale:"fr-MG",parentLocale:"fr"},{locale:"fr-ML",parentLocale:"fr"},{locale:"fr-MQ",parentLocale:"fr"},{locale:"fr-MR",parentLocale:"fr"},{locale:"fr-MU",parentLocale:"fr"},{locale:"fr-NC",parentLocale:"fr"},{locale:"fr-NE",parentLocale:"fr"},{locale:"fr-PF",parentLocale:"fr"},{locale:"fr-PM",parentLocale:"fr"},{locale:"fr-RE",parentLocale:"fr"},{locale:"fr-RW",parentLocale:"fr"},{locale:"fr-SC",parentLocale:"fr"},{locale:"fr-SN",parentLocale:"fr"},{locale:"fr-SY",parentLocale:"fr"},{locale:"fr-TD",parentLocale:"fr"},{locale:"fr-TG",parentLocale:"fr"},{locale:"fr-TN",parentLocale:"fr"},{locale:"fr-VU",parentLocale:"fr"},{locale:"fr-WF",parentLocale:"fr"},{locale:"fr-YT",parentLocale:"fr"},{locale:"fur",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"an",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"ca di {0} an",other:"ca di {0} agns"},past:{one:"{0} an indaûr",other:"{0} agns indaûr"}}},month:{displayName:"mês",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"ca di {0} mês",other:"ca di {0} mês"},past:{one:"{0} mês indaûr",other:"{0} mês indaûr"}}},day:{displayName:"dì",relative:{0:"vuê",1:"doman",2:"passantdoman","-2":"îr l’altri","-1":"îr"},relativeTime:{future:{one:"ca di {0} zornade",other:"ca di {0} zornadis"},past:{one:"{0} zornade indaûr",other:"{0} zornadis indaûr"}}},hour:{displayName:"ore",relative:{0:"this hour"},relativeTime:{future:{one:"ca di {0} ore",other:"ca di {0} oris"},past:{one:"{0} ore indaûr",other:"{0} oris indaûr"}}},minute:{displayName:"minût",relative:{0:"this minute"},relativeTime:{future:{one:"ca di {0} minût",other:"ca di {0} minûts"},past:{one:"{0} minût indaûr",other:"{0} minûts indaûr"}}},second:{displayName:"secont",relative:{0:"now"},relativeTime:{future:{one:"ca di {0} secont",other:"ca di {0} seconts"},past:{one:"{0} secont indaûr",other:"{0} seconts indaûr"}}}}},{locale:"fy",pluralRuleFunction:function(e,t){var r=!String(e).split(".")[1];return t?"other":1==e&&r?"one":"other"},fields:{year:{displayName:"Jier",relative:{0:"dit jier",1:"folgjend jier","-1":"foarich jier"},relativeTime:{future:{one:"Oer {0} jier",other:"Oer {0} jier"},past:{one:"{0} jier lyn",other:"{0} jier lyn"}}},month:{displayName:"Moanne",relative:{0:"dizze moanne",1:"folgjende moanne","-1":"foarige moanne"},relativeTime:{future:{one:"Oer {0} moanne",other:"Oer {0} moannen"},past:{one:"{0} moanne lyn",other:"{0} moannen lyn"}}},day:{displayName:"dei",relative:{0:"vandaag",1:"morgen",2:"Oermorgen","-2":"eergisteren","-1":"gisteren"},relativeTime:{future:{one:"Oer {0} dei",other:"Oer {0} deien"},past:{one:"{0} dei lyn",other:"{0} deien lyn"}}},hour:{displayName:"oere",relative:{0:"this hour"},relativeTime:{future:{one:"Oer {0} oere",other:"Oer {0} oere"},past:{one:"{0} oere lyn",other:"{0} oere lyn"}}},minute:{displayName:"Minút",relative:{0:"this minute"},relativeTime:{future:{one:"Oer {0} minút",other:"Oer {0} minuten"},past:{one:"{0} minút lyn",other:"{0} minuten lyn"}}},second:{displayName:"Sekonde",relative:{0:"nu"},relativeTime:{future:{one:"Oer {0} sekonde",other:"Oer {0} sekonden"},past:{one:"{0} sekonde lyn",other:"{0} sekonden lyn"}}}}},{locale:"ga",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e;return t?1==e?"one":"other":1==e?"one":2==e?"two":a&&e>=3&&e<=6?"few":a&&e>=7&&e<=10?"many":"other"},fields:{year:{displayName:"Bliain",relative:{0:"an bhliain seo",1:"an bhliain seo chugainn","-1":"anuraidh"},relativeTime:{future:{one:"i gceann {0} bhliain",two:"i gceann {0} bhliain",few:"i gceann {0} bliana",many:"i gceann {0} mbliana",other:"i gceann {0} bliain"},past:{one:"{0} bhliain ó shin",two:"{0} bhliain ó shin",few:"{0} bliana ó shin",many:"{0} mbliana ó shin",other:"{0} bliain ó shin"}}},month:{displayName:"Mí",relative:{0:"an mhí seo",1:"an mhí seo chugainn","-1":"an mhí seo caite"},relativeTime:{future:{one:"i gceann {0} mhí",two:"i gceann {0} mhí",few:"i gceann {0} mhí",many:"i gceann {0} mí",other:"i gceann {0} mí"},past:{one:"{0} mhí ó shin",two:"{0} mhí ó shin",few:"{0} mhí ó shin",many:"{0} mí ó shin",other:"{0} mí ó shin"}}},day:{displayName:"Lá",relative:{0:"inniu",1:"amárach",2:"arú amárach","-2":"arú inné","-1":"inné"},relativeTime:{future:{one:"i gceann {0} lá",two:"i gceann {0} lá",few:"i gceann {0} lá",many:"i gceann {0} lá",other:"i gceann {0} lá"},past:{one:"{0} lá ó shin",two:"{0} lá ó shin",few:"{0} lá ó shin",many:"{0} lá ó shin",other:"{0} lá ó shin"}}},hour:{displayName:"Uair",relative:{0:"an uair seo"},relativeTime:{future:{one:"i gceann {0} uair an chloig",two:"i gceann {0} uair an chloig",few:"i gceann {0} huaire an chloig",many:"i gceann {0} n-uaire an chloig",other:"i gceann {0} uair an chloig"},past:{one:"{0} uair an chloig ó shin",two:"{0} uair an chloig ó shin",few:"{0} huaire an chloig ó shin",many:"{0} n-uaire an chloig ó shin",other:"{0} uair an chloig ó shin"}}},minute:{displayName:"Nóiméad",relative:{0:"an nóiméad seo"},relativeTime:{future:{one:"i gceann {0} nóiméad",two:"i gceann {0} nóiméad",few:"i gceann {0} nóiméad",many:"i gceann {0} nóiméad",other:"i gceann {0} nóiméad"},past:{one:"{0} nóiméad ó shin",two:"{0} nóiméad ó shin",few:"{0} nóiméad ó shin",many:"{0} nóiméad ó shin",other:"{0} nóiméad ó shin"}}},second:{displayName:"Soicind",relative:{0:"anois"},relativeTime:{future:{one:"i gceann {0} soicind",two:"i gceann {0} shoicind",few:"i gceann {0} shoicind",many:"i gceann {0} soicind",other:"i gceann {0} soicind"},past:{one:"{0} soicind ó shin",two:"{0} shoicind ó shin",few:"{0} shoicind ó shin",many:"{0} soicind ó shin",other:"{0} soicind ó shin"}}}}},{locale:"gd",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e;return t?"other":1==e||11==e?"one":2==e||12==e?"two":a&&e>=3&&e<=10||a&&e>=13&&e<=19?"few":"other"},fields:{year:{displayName:"bliadhna",relative:{0:"am bliadhna",1:"an ath-bhliadhna","-2":"a-bhòn-uiridh","-1":"an-uiridh"},relativeTime:{future:{one:"an ceann {0} bhliadhna",two:"an ceann {0} bhliadhna",few:"an ceann {0} bliadhnaichean",other:"an ceann {0} bliadhna"},past:{one:"{0} bhliadhna air ais",two:"{0} bhliadhna air ais",few:"{0} bhliadhnaichean air ais",other:"{0} bliadhna air ais"}}},month:{displayName:"mìos",relative:{0:"am mìos seo",1:"an ath-mhìos","-1":"am mìos seo chaidh"},relativeTime:{future:{one:"an ceann {0} mhìosa",two:"an ceann {0} mhìosa",few:"an ceann {0} mìosan",other:"an ceann {0} mìosa"},past:{one:"{0} mhìos air ais",two:"{0} mhìos air ais",few:"{0} mìosan air ais",other:"{0} mìos air ais"}}},day:{displayName:"latha",relative:{0:"an-diugh",1:"a-màireach",2:"an-earar",3:"an-eararais","-2":"a-bhòin-dè","-1":"an-dè"},relativeTime:{future:{one:"an ceann {0} latha",two:"an ceann {0} latha",few:"an ceann {0} làithean",other:"an ceann {0} latha"},past:{one:"{0} latha air ais",two:"{0} latha air ais",few:"{0} làithean air ais",other:"{0} latha air ais"}}},hour:{displayName:"uair a thìde",relative:{0:"this hour"},relativeTime:{future:{one:"an ceann {0} uair a thìde",two:"an ceann {0} uair a thìde",few:"an ceann {0} uairean a thìde",other:"an ceann {0} uair a thìde"},past:{one:"{0} uair a thìde air ais",two:"{0} uair a thìde air ais",few:"{0} uairean a thìde air ais",other:"{0} uair a thìde air ais"}}},minute:{displayName:"mionaid",relative:{0:"this minute"},relativeTime:{future:{one:"an ceann {0} mhionaid",two:"an ceann {0} mhionaid",few:"an ceann {0} mionaidean",other:"an ceann {0} mionaid"},past:{one:"{0} mhionaid air ais",two:"{0} mhionaid air ais",few:"{0} mionaidean air ais",other:"{0} mionaid air ais"}}},second:{displayName:"diog",relative:{0:"an-dràsta"},relativeTime:{future:{one:"an ceann {0} diog",two:"an ceann {0} dhiog",few:"an ceann {0} diogan",other:"an ceann {0} diog"},past:{one:"{0} diog air ais",two:"{0} dhiog air ais",few:"{0} diogan air ais",other:"{0} diog air ais"}}}}},{locale:"gl",pluralRuleFunction:function(e,t){var r=!String(e).split(".")[1];return t?"other":1==e&&r?"one":"other"},fields:{year:{displayName:"ano",relative:{0:"este ano",1:"o próximo ano","-1":"o ano pasado"},relativeTime:{future:{one:"en {0} ano",other:"en {0} anos"},past:{one:"hai {0} ano",other:"hai {0} anos"}}},month:{displayName:"mes",relative:{0:"este mes",1:"o próximo mes","-1":"o mes pasado"},relativeTime:{future:{one:"en {0} mes",other:"en {0} meses"},past:{one:"hai {0} mes",other:"hai {0} meses"}}},day:{displayName:"día",relative:{0:"hoxe",1:"mañá",2:"pasadomañá","-2":"antonte","-1":"onte"},relativeTime:{future:{one:"en {0} día",other:"en {0} días"},past:{one:"hai {0} día",other:"hai {0} días"}}},hour:{displayName:"hora",relative:{0:"nesta hora"},relativeTime:{future:{one:"en {0} hora",other:"en {0} horas"},past:{one:"hai {0} hora",other:"hai {0} horas"}}},minute:{displayName:"minuto",relative:{0:"neste minuto"},relativeTime:{future:{one:"en {0} minuto",other:"en {0} minutos"},past:{one:"hai {0} minuto",other:"hai {0} minutos"}}},second:{displayName:"segundo",relative:{0:"agora"},relativeTime:{future:{one:"en {0} segundo",other:"en {0} segundos"},past:{one:"hai {0} segundo",other:"hai {0} segundos"}}}}},{locale:"gsw",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Jaar",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Monet",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Tag",relative:{0:"hüt",1:"moorn",2:"übermoorn","-2":"vorgeschter","-1":"geschter"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Schtund",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minuute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"gsw-FR",parentLocale:"gsw"},{locale:"gsw-LI",parentLocale:"gsw"},{locale:"gu",pluralRuleFunction:function(e,t){return t?1==e?"one":2==e||3==e?"two":4==e?"few":6==e?"many":"other":e>=0&&e<=1?"one":"other"},fields:{year:{displayName:"વર્ષ",relative:{0:"આ વર્ષે",1:"આવતા વર્ષે","-1":"ગયા વર્ષે"},relativeTime:{future:{one:"{0} વર્ષમાં",other:"{0} વર્ષમાં"},past:{one:"{0} વર્ષ પહેલાં",other:"{0} વર્ષ પહેલાં"}}},month:{displayName:"મહિનો",relative:{0:"આ મહિને",1:"આવતા મહિને","-1":"ગયા મહિને"},relativeTime:{future:{one:"{0} મહિનામાં",other:"{0} મહિનામાં"},past:{one:"{0} મહિના પહેલાં",other:"{0} મહિના પહેલાં"}}},day:{displayName:"દિવસ",relative:{0:"આજે",1:"આવતીકાલે",2:"પરમદિવસે","-2":"ગયા પરમદિવસે","-1":"ગઈકાલે"},relativeTime:{future:{one:"{0} દિવસમાં",other:"{0} દિવસમાં"},past:{one:"{0} દિવસ પહેલાં",other:"{0} દિવસ પહેલાં"}}},hour:{displayName:"કલાક",relative:{0:"આ કલાક"},relativeTime:{future:{one:"{0} કલાકમાં",other:"{0} કલાકમાં"},past:{one:"{0} કલાક પહેલાં",other:"{0} કલાક પહેલાં"}}},minute:{displayName:"મિનિટ",relative:{0:"આ મિનિટ"},relativeTime:{future:{one:"{0} મિનિટમાં",other:"{0} મિનિટમાં"},past:{one:"{0} મિનિટ પહેલાં",other:"{0} મિનિટ પહેલાં"}}},second:{displayName:"સેકન્ડ",relative:{0:"હમણાં"},relativeTime:{future:{one:"{0} સેકંડમાં",other:"{0} સેકંડમાં"},past:{one:"{0} સેકંડ પહેલાં",other:"{0} સેકંડ પહેલાં"}}}}},{locale:"guw",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"guz",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Omwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Omotienyi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Rituko",relative:{0:"Rero",1:"Mambia","-1":"Igoro"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Ensa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Edakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Esekendi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"gv",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=a.slice(-1),i=a.slice(-2);return t?"other":n&&1==o?"one":n&&2==o?"two":!n||0!=i&&20!=i&&40!=i&&60!=i&&80!=i?n?"other":"many":"few"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ha",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Shekara",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Wata",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Kwana",relative:{0:"Yau",1:"Gobe","-1":"Jiya"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Awa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Daƙiƙa",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ha-Arab",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ha-GH",parentLocale:"ha"},{locale:"ha-NE",parentLocale:"ha"},{locale:"haw",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"he",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=Number(r[0])==e,i=o&&r[0].slice(-1);return t?"other":1==e&&n?"one":2==a&&n?"two":n&&(e<0||e>10)&&o&&0==i?"many":"other"},fields:{year:{displayName:"שנה",relative:{0:"השנה",1:"השנה הבאה","-1":"השנה שעברה"},relativeTime:{future:{one:"בעוד שנה",two:"בעוד שנתיים",many:"בעוד {0} שנה",other:"בעוד {0} שנים"},past:{one:"לפני שנה",two:"לפני שנתיים",many:"לפני {0} שנה",other:"לפני {0} שנים"}}},month:{displayName:"חודש",relative:{0:"החודש",1:"החודש הבא","-1":"החודש שעבר"},relativeTime:{future:{one:"בעוד חודש",two:"בעוד חודשיים",many:"בעוד {0} חודשים",other:"בעוד {0} חודשים"},past:{one:"לפני חודש",two:"לפני חודשיים",many:"לפני {0} חודשים",other:"לפני {0} חודשים"}}},day:{displayName:"יום",relative:{0:"היום",1:"מחר",2:"מחרתיים","-2":"שלשום","-1":"אתמול"},relativeTime:{future:{one:"בעוד יום {0}",two:"בעוד יומיים",many:"בעוד {0} ימים",other:"בעוד {0} ימים"},past:{one:"לפני יום {0}",two:"לפני יומיים",many:"לפני {0} ימים",other:"לפני {0} ימים"}}},hour:{displayName:"שעה",relative:{0:"בשעה זו"},relativeTime:{future:{one:"בעוד שעה",two:"בעוד שעתיים",many:"בעוד {0} שעות",other:"בעוד {0} שעות"},past:{one:"לפני שעה",two:"לפני שעתיים",many:"לפני {0} שעות",other:"לפני {0} שעות"}}},minute:{displayName:"דקה",relative:{0:"בדקה זו"},relativeTime:{future:{one:"בעוד דקה",two:"בעוד שתי דקות",many:"בעוד {0} דקות",other:"בעוד {0} דקות"},past:{one:"לפני דקה",two:"לפני שתי דקות",many:"לפני {0} דקות",other:"לפני {0} דקות"}}},second:{displayName:"שנייה",relative:{0:"עכשיו"},relativeTime:{future:{one:"בעוד שנייה",two:"בעוד שתי שניות",many:"בעוד {0} שניות",other:"בעוד {0} שניות"},past:{one:"לפני שנייה",two:"לפני שתי שניות",many:"לפני {0} שניות",other:"לפני {0} שניות"}}}}},{locale:"hi",pluralRuleFunction:function(e,t){return t?1==e?"one":2==e||3==e?"two":4==e?"few":6==e?"many":"other":e>=0&&e<=1?"one":"other"},fields:{year:{displayName:"वर्ष",relative:{0:"इस वर्ष",1:"अगला वर्ष","-1":"पिछला वर्ष"},relativeTime:{future:{one:"{0} वर्ष में",other:"{0} वर्ष में"},past:{one:"{0} वर्ष पहले",other:"{0} वर्ष पहले"}}},month:{displayName:"माह",relative:{0:"इस माह",1:"अगला माह","-1":"पिछला माह"},relativeTime:{future:{one:"{0} माह में",other:"{0} माह में"},past:{one:"{0} माह पहले",other:"{0} माह पहले"}}},day:{displayName:"दिन",relative:{0:"आज",1:"कल",2:"परसों","-2":"बीता परसों","-1":"कल"},relativeTime:{future:{one:"{0} दिन में",other:"{0} दिन में"},past:{one:"{0} दिन पहले",other:"{0} दिन पहले"}}},hour:{displayName:"घंटा",relative:{0:"यह घंटा"},relativeTime:{future:{one:"{0} घंटे में",other:"{0} घंटे में"},past:{one:"{0} घंटे पहले",other:"{0} घंटे पहले"}}},minute:{displayName:"मिनट",relative:{0:"यह मिनट"},relativeTime:{future:{one:"{0} मिनट में",other:"{0} मिनट में"},past:{one:"{0} मिनट पहले",other:"{0} मिनट पहले"}}},second:{displayName:"सेकंड",relative:{0:"अब"},relativeTime:{future:{one:"{0} सेकंड में",other:"{0} सेकंड में"},past:{one:"{0} सेकंड पहले",other:"{0} सेकंड पहले"}}}}},{locale:"hr",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=a.slice(-2),s=n.slice(-1),u=n.slice(-2);return t?"other":o&&1==i&&11!=l||1==s&&11!=u?"one":o&&i>=2&&i<=4&&(l<12||l>14)||s>=2&&s<=4&&(u<12||u>14)?"few":"other"},fields:{year:{displayName:"godina",relative:{0:"ove godine",1:"sljedeće godine","-1":"prošle godine"},relativeTime:{future:{one:"za {0} godinu",few:"za {0} godine",other:"za {0} godina"},past:{one:"prije {0} godinu",few:"prije {0} godine",other:"prije {0} godina"}}},month:{displayName:"mjesec",relative:{0:"ovaj mjesec",1:"sljedeći mjesec","-1":"prošli mjesec"},relativeTime:{future:{one:"za {0} mjesec",few:"za {0} mjeseca",other:"za {0} mjeseci"},past:{one:"prije {0} mjesec",few:"prije {0} mjeseca",other:"prije {0} mjeseci"}}},day:{displayName:"dan",relative:{0:"danas",1:"sutra",2:"prekosutra","-2":"prekjučer","-1":"jučer"},relativeTime:{future:{one:"za {0} dan",few:"za {0} dana",other:"za {0} dana"},past:{one:"prije {0} dan",few:"prije {0} dana",other:"prije {0} dana"}}},hour:{displayName:"sat",relative:{0:"ovaj sat"},relativeTime:{future:{one:"za {0} sat",few:"za {0} sata",other:"za {0} sati"},past:{one:"prije {0} sat",few:"prije {0} sata",other:"prije {0} sati"}}},minute:{displayName:"minuta",relative:{0:"ova minuta"},relativeTime:{future:{one:"za {0} minutu",few:"za {0} minute",other:"za {0} minuta"},past:{one:"prije {0} minutu",few:"prije {0} minute",other:"prije {0} minuta"}}},second:{displayName:"sekunda",relative:{0:"sad"},relativeTime:{future:{one:"za {0} sekundu",few:"za {0} sekunde",other:"za {0} sekundi"},past:{one:"prije {0} sekundu",few:"prije {0} sekunde",other:"prije {0} sekundi"}}}}},{locale:"hr-BA",parentLocale:"hr"},{locale:"hsb",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-2),l=n.slice(-2);return t?"other":o&&1==i||1==l?"one":o&&2==i||2==l?"two":o&&(3==i||4==i)||3==l||4==l?"few":"other"},fields:{year:{displayName:"lěto",relative:{0:"lětsa",1:"klětu","-1":"loni"},relativeTime:{future:{one:"za {0} lěto",two:"za {0} lěće",few:"za {0} lěta",other:"za {0} lět"},past:{one:"před {0} lětom",two:"před {0} lětomaj",few:"před {0} lětami",other:"před {0} lětami"}}},month:{displayName:"měsac",relative:{0:"tutón měsac",1:"přichodny měsac","-1":"zašły měsac"},relativeTime:{future:{one:"za {0} měsac",two:"za {0} měsacaj",few:"za {0} měsacy",other:"za {0} měsacow"},past:{one:"před {0} měsacom",two:"před {0} měsacomaj",few:"před {0} měsacami",other:"před {0} měsacami"}}},day:{displayName:"dźeń",relative:{0:"dźensa",1:"jutře","-1":"wčera"},relativeTime:{future:{one:"za {0} dźeń",two:"za {0} dnjej",few:"za {0} dny",other:"za {0} dnjow"},past:{one:"před {0} dnjom",two:"před {0} dnjomaj",few:"před {0} dnjemi",other:"před {0} dnjemi"}}},hour:{displayName:"hodźina",relative:{0:"this hour"},relativeTime:{future:{one:"za {0} hodźinu",two:"za {0} hodźinje",few:"za {0} hodźiny",other:"za {0} hodźin"},past:{one:"před {0} hodźinu",two:"před {0} hodźinomaj",few:"před {0} hodźinami",other:"před {0} hodźinami"}}},minute:{displayName:"minuta",relative:{0:"this minute"},relativeTime:{future:{one:"za {0} minutu",two:"za {0} minuće",few:"za {0} minuty",other:"za {0} minutow"},past:{one:"před {0} minutu",two:"před {0} minutomaj",few:"před {0} minutami",other:"před {0} minutami"}}},second:{displayName:"sekunda",relative:{0:"now"},relativeTime:{future:{one:"za {0} sekundu",two:"za {0} sekundźe",few:"za {0} sekundy",other:"za {0} sekundow"},past:{one:"před {0} sekundu",two:"před {0} sekundomaj",few:"před {0} sekundami",other:"před {0} sekundami"}}}}},{locale:"hu",pluralRuleFunction:function(e,t){return t?1==e||5==e?"one":"other":1==e?"one":"other"},fields:{year:{displayName:"év",relative:{0:"ez az év",1:"következő év","-1":"előző év"},relativeTime:{future:{one:"{0} év múlva",other:"{0} év múlva"},past:{one:"{0} évvel ezelőtt",other:"{0} évvel ezelőtt"}}},month:{displayName:"hónap",relative:{0:"ez a hónap",1:"következő hónap","-1":"előző hónap"},relativeTime:{future:{one:"{0} hónap múlva",other:"{0} hónap múlva"},past:{one:"{0} hónappal ezelőtt",other:"{0} hónappal ezelőtt"}}},day:{displayName:"nap",relative:{0:"ma",1:"holnap",2:"holnapután","-2":"tegnapelőtt","-1":"tegnap"},relativeTime:{future:{one:"{0} nap múlva",other:"{0} nap múlva"},past:{one:"{0} nappal ezelőtt",other:"{0} nappal ezelőtt"}}},hour:{displayName:"óra",relative:{0:"ebben az órában"},relativeTime:{future:{one:"{0} óra múlva",other:"{0} óra múlva"},past:{one:"{0} órával ezelőtt",other:"{0} órával ezelőtt"}}},minute:{displayName:"perc",relative:{0:"ebben a percben"},relativeTime:{future:{one:"{0} perc múlva",other:"{0} perc múlva"},past:{one:"{0} perccel ezelőtt",other:"{0} perccel ezelőtt"}}},second:{displayName:"másodperc",relative:{0:"most"},relativeTime:{future:{one:"{0} másodperc múlva",other:"{0} másodperc múlva"},past:{one:"{0} másodperccel ezelőtt",other:"{0} másodperccel ezelőtt"}}}}},{locale:"hy",pluralRuleFunction:function(e,t){return t?1==e?"one":"other":e>=0&&e<2?"one":"other"},fields:{year:{displayName:"տարի",relative:{0:"այս տարի",1:"հաջորդ տարի","-1":"նախորդ տարի"},relativeTime:{future:{one:"{0} տարուց",other:"{0} տարուց"},past:{one:"{0} տարի առաջ",other:"{0} տարի առաջ"}}},month:{displayName:"ամիս",relative:{0:"այս ամիս",1:"հաջորդ ամիս","-1":"նախորդ ամիս"},relativeTime:{future:{one:"{0} ամսից",other:"{0} ամսից"},past:{one:"{0} ամիս առաջ",other:"{0} ամիս առաջ"}}},day:{displayName:"օր",relative:{0:"այսօր",1:"վաղը",2:"վաղը չէ մյուս օրը","-2":"երեկ չէ առաջի օրը","-1":"երեկ"},relativeTime:{future:{one:"{0} օրից",other:"{0} օրից"},past:{one:"{0} օր առաջ",other:"{0} օր առաջ"}}},hour:{displayName:"ժամ",relative:{0:"այս ժամին"},relativeTime:{future:{one:"{0} ժամից",other:"{0} ժամից"},past:{one:"{0} ժամ առաջ",other:"{0} ժամ առաջ"}}},minute:{displayName:"րոպե",relative:{0:"այս րոպեին"},relativeTime:{future:{one:"{0} րոպեից",other:"{0} րոպեից"},past:{one:"{0} րոպե առաջ",other:"{0} րոպե առաջ"}}},second:{displayName:"վայրկյան",relative:{0:"այժմ"},relativeTime:{future:{one:"{0} վայրկյանից",other:"{0} վայրկյանից"},past:{one:"{0} վայրկյան առաջ",other:"{0} վայրկյան առաջ"}}}}},{locale:"id",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Tahun",relative:{0:"tahun ini",1:"tahun depan","-1":"tahun lalu"},relativeTime:{future:{other:"Dalam {0} tahun"},past:{other:"{0} tahun yang lalu"}}},month:{displayName:"Bulan",relative:{0:"bulan ini",1:"Bulan berikutnya","-1":"bulan lalu"},relativeTime:{future:{other:"Dalam {0} bulan"},past:{other:"{0} bulan yang lalu"}}},day:{displayName:"Hari",relative:{0:"hari ini",1:"besok",2:"lusa","-2":"kemarin dulu","-1":"kemarin"},relativeTime:{future:{other:"Dalam {0} hari"},past:{other:"{0} hari yang lalu"}}},hour:{displayName:"Jam",relative:{0:"jam ini"},relativeTime:{future:{other:"Dalam {0} jam"},past:{other:"{0} jam yang lalu"}}},minute:{displayName:"Menit",relative:{0:"menit ini"},relativeTime:{future:{other:"Dalam {0} menit"},past:{other:"{0} menit yang lalu"}}},second:{displayName:"Detik",relative:{0:"sekarang"},relativeTime:{future:{other:"Dalam {0} detik"},past:{other:"{0} detik yang lalu"}}}}},{locale:"ig",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Afọ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Ọnwa",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ụbọchị",relative:{0:"Taata",1:"Echi","-1":"Nnyaafụ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Elekere",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Nkeji",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Nkejinta",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ii",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"ꈎ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"ꆪ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"ꑍ",relative:{0:"ꀃꑍ",1:"ꃆꏂꑍ",2:"ꌕꀿꑍ","-2":"ꎴꂿꋍꑍ","-1":"ꀋꅔꉈ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"ꄮꈉ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"ꃏ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"ꇙ",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"in",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"is",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=Number(r[0])==e,o=a.slice(-1),i=a.slice(-2);return t?"other":n&&1==o&&11!=i||!n?"one":"other"},fields:{year:{displayName:"ár",relative:{0:"á þessu ári",1:"á næsta ári","-1":"á síðasta ári"},relativeTime:{future:{one:"eftir {0} ár",other:"eftir {0} ár"},past:{one:"fyrir {0} ári",other:"fyrir {0} árum"}}},month:{displayName:"mánuður",relative:{0:"í þessum mánuði",1:"í næsta mánuði","-1":"í síðasta mánuði"},relativeTime:{future:{one:"eftir {0} mánuð",other:"eftir {0} mánuði"},past:{one:"fyrir {0} mánuði",other:"fyrir {0} mánuðum"}}},day:{displayName:"dagur",relative:{0:"í dag",1:"á morgun",2:"eftir tvo daga","-2":"í fyrradag","-1":"í gær"},relativeTime:{future:{one:"eftir {0} dag",other:"eftir {0} daga"},past:{one:"fyrir {0} degi",other:"fyrir {0} dögum"}}},hour:{displayName:"klukkustund",relative:{0:"this hour"},relativeTime:{future:{one:"eftir {0} klukkustund",other:"eftir {0} klukkustundir"},past:{one:"fyrir {0} klukkustund",other:"fyrir {0} klukkustundum"}}},minute:{displayName:"mínúta",relative:{0:"this minute"},relativeTime:{future:{one:"eftir {0} mínútu",other:"eftir {0} mínútur"},past:{one:"fyrir {0} mínútu",other:"fyrir {0} mínútum"}}},second:{displayName:"sekúnda",relative:{0:"núna"},relativeTime:{future:{one:"eftir {0} sekúndu",other:"eftir {0} sekúndur"},past:{one:"fyrir {0} sekúndu",other:"fyrir {0} sekúndum"}}}}},{locale:"it",pluralRuleFunction:function(e,t){var r=!String(e).split(".")[1];return t?11==e||8==e||80==e||800==e?"many":"other":1==e&&r?"one":"other"},fields:{year:{displayName:"anno",relative:{0:"quest’anno",1:"anno prossimo","-1":"anno scorso"},relativeTime:{future:{one:"tra {0} anno",other:"tra {0} anni"},past:{one:"{0} anno fa",other:"{0} anni fa"}}},month:{displayName:"mese",relative:{0:"questo mese",1:"mese prossimo","-1":"mese scorso"},relativeTime:{future:{one:"tra {0} mese",other:"tra {0} mesi"},past:{one:"{0} mese fa",other:"{0} mesi fa"}}},day:{displayName:"giorno",relative:{0:"oggi",1:"domani",2:"dopodomani","-2":"l’altro ieri","-1":"ieri"},relativeTime:{future:{one:"tra {0} giorno",other:"tra {0} giorni"},past:{one:"{0} giorno fa",other:"{0} giorni fa"}}},hour:{displayName:"ora",relative:{0:"quest’ora"},relativeTime:{future:{one:"tra {0} ora",other:"tra {0} ore"},past:{one:"{0} ora fa",other:"{0} ore fa"}}},minute:{displayName:"minuto",relative:{0:"questo minuto"},relativeTime:{future:{one:"tra {0} minuto",other:"tra {0} minuti"},past:{one:"{0} minuto fa",other:"{0} minuti fa"}}},second:{displayName:"secondo",relative:{0:"ora"},relativeTime:{future:{one:"tra {0} secondo",other:"tra {0} secondi"},past:{one:"{0} secondo fa",other:"{0} secondi fa"}}}}},{locale:"it-CH",parentLocale:"it"},{locale:"it-SM",parentLocale:"it"},{locale:"it-VA",parentLocale:"it"},{locale:"iu",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"iu-Latn",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"iw",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=Number(r[0])==e,i=o&&r[0].slice(-1);return t?"other":1==e&&n?"one":2==a&&n?"two":n&&(e<0||e>10)&&o&&0==i?"many":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ja",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"年",relative:{0:"今年",1:"翌年","-1":"昨年"},relativeTime:{future:{other:"{0} 年後"},past:{other:"{0} 年前"}}},month:{displayName:"月",relative:{0:"今月",1:"翌月","-1":"先月"},relativeTime:{future:{other:"{0} か月後"},past:{other:"{0} か月前"}}},day:{displayName:"日",relative:{0:"今日",1:"明日",2:"明後日","-2":"一昨日","-1":"昨日"},relativeTime:{future:{other:"{0} 日後"},past:{other:"{0} 日前"}}},hour:{displayName:"時",relative:{0:"1 時間以内"},relativeTime:{future:{other:"{0} 時間後"},past:{other:"{0} 時間前"}}},minute:{displayName:"分",relative:{0:"1 分以内"},relativeTime:{future:{other:"{0} 分後"},past:{other:"{0} 分前"}}},second:{displayName:"秒",relative:{0:"今"},relativeTime:{future:{other:"{0} 秒後"},past:{other:"{0} 秒前"}}}}},{locale:"jbo",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"jgo",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"Nǔu ŋguꞋ {0}",other:"Nǔu ŋguꞋ {0}"},past:{one:"Ɛ́gɛ́ mɔ́ ŋguꞋ {0}",other:"Ɛ́gɛ́ mɔ́ ŋguꞋ {0}"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"Nǔu {0} saŋ",other:"Nǔu {0} saŋ"},past:{one:"ɛ́ gɛ́ mɔ́ pɛsaŋ {0}",other:"ɛ́ gɛ́ mɔ́ pɛsaŋ {0}"}}},day:{displayName:"Day",relative:{0:"lɔꞋɔ",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{one:"Nǔu lɛ́Ꞌ {0}",other:"Nǔu lɛ́Ꞌ {0}"},past:{one:"Ɛ́ gɛ́ mɔ́ lɛ́Ꞌ {0}",other:"Ɛ́ gɛ́ mɔ́ lɛ́Ꞌ {0}"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{one:"nǔu háwa {0}",other:"nǔu háwa {0}"},past:{one:"ɛ́ gɛ mɔ́ {0} háwa",other:"ɛ́ gɛ mɔ́ {0} háwa"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{one:"nǔu {0} minút",other:"nǔu {0} minút"},past:{one:"ɛ́ gɛ́ mɔ́ minút {0}",other:"ɛ́ gɛ́ mɔ́ minút {0}"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ji",pluralRuleFunction:function(e,t){var r=!String(e).split(".")[1];return t?"other":1==e&&r?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"jmc",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Maka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mori",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Mfiri",relative:{0:"Inu",1:"Ngama","-1":"Ukou"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Dakyika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"jv",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"jw",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ka",pluralRuleFunction:function(e,t){var r=String(e).split(".")[0],a=r.slice(-2);return t?1==r?"one":0==r||a>=2&&a<=20||40==a||60==a||80==a?"many":"other":1==e?"one":"other"},fields:{year:{displayName:"წელი",relative:{0:"ამ წელს",1:"მომავალ წელს","-1":"გასულ წელს"},relativeTime:{future:{one:"{0} წელიწადში",other:"{0} წელიწადში"},past:{one:"{0} წლის წინ",other:"{0} წლის წინ"}}},month:{displayName:"თვე",relative:{0:"ამ თვეში",1:"მომავალ თვეს","-1":"გასულ თვეს"},relativeTime:{future:{one:"{0} თვეში",other:"{0} თვეში"},past:{one:"{0} თვის წინ",other:"{0} თვის წინ"}}},day:{displayName:"დღე",relative:{0:"დღეს",1:"ხვალ",2:"ზეგ","-2":"გუშინწინ","-1":"გუშინ"},relativeTime:{future:{one:"{0} დღეში",other:"{0} დღეში"},past:{one:"{0} დღის წინ",other:"{0} დღის წინ"}}},hour:{displayName:"საათი",relative:{0:"ამ საათში"},relativeTime:{future:{one:"{0} საათში",other:"{0} საათში"},past:{one:"{0} საათის წინ",other:"{0} საათის წინ"}}},minute:{displayName:"წუთი",relative:{0:"ამ წუთში"},relativeTime:{future:{one:"{0} წუთში",other:"{0} წუთში"},past:{one:"{0} წუთის წინ",other:"{0} წუთის წინ"}}},second:{displayName:"წამი",relative:{0:"ახლა"},relativeTime:{future:{one:"{0} წამში",other:"{0} წამში"},past:{one:"{0} წამის წინ",other:"{0} წამის წინ"}}}}},{locale:"kab",pluralRuleFunction:function(e,t){return t?"other":e>=0&&e<2?"one":"other"},fields:{year:{displayName:"Aseggas",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Aggur",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ass",relative:{0:"Ass-a",1:"Azekka","-1":"Iḍelli"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Tamert",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Tamrect",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Tasint",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"kaj",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"kam",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Mwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mwai",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Mũthenya",relative:{0:"Ũmũnthĩ",1:"Ũnĩ","-1":"Ĩyoo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Ndatĩka",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"sekondi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"kcg",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"kde",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Mwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mwedi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Lihiku",relative:{0:"Nelo",1:"Nundu","-1":"Lido"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Dakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"kea",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Anu",relative:{0:"es anu li",1:"prósimu anu","-1":"anu pasadu"},relativeTime:{future:{other:"di li {0} anu"},past:{other:"a ten {0} anu"}}},month:{displayName:"Mes",relative:{0:"es mes li",1:"prósimu mes","-1":"mes pasadu"},relativeTime:{future:{other:"di li {0} mes"},past:{other:"a ten {0} mes"}}},day:{displayName:"Dia",relative:{0:"oji",1:"manha","-1":"onti"},relativeTime:{future:{other:"di li {0} dia"},past:{other:"a ten {0} dia"}}},hour:{displayName:"Ora",relative:{0:"this hour"},relativeTime:{future:{other:"di li {0} ora"},past:{other:"a ten {0} ora"}}},minute:{displayName:"Minutu",relative:{0:"this minute"},relativeTime:{future:{other:"di li {0} minutu"},past:{other:"a ten {0} minutu"}}},second:{displayName:"Sigundu",relative:{0:"now"},relativeTime:{future:{other:"di li {0} sigundu"},past:{other:"a ten {0} sigundu"}}}}},{locale:"khq",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Jiiri",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Handu",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Jaari",relative:{0:"Hõo",1:"Suba","-1":"Bi"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Guuru",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Miniti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Miti",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ki",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Mwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mweri",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Mũthenya",relative:{0:"Ũmũthĩ",1:"Rũciũ","-1":"Ira"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Ithaa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Ndagĩka",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"kk",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e,n=a&&r[0].slice(-1);return t?6==n||9==n||a&&0==n&&0!=e?"many":"other":1==e?"one":"other"},fields:{year:{displayName:"жыл",relative:{0:"биылғы жыл",1:"келесі жыл","-1":"былтырғы жыл"},relativeTime:{future:{one:"{0} жылдан кейін",other:"{0} жылдан кейін"},past:{one:"{0} жыл бұрын",other:"{0} жыл бұрын"}}},month:{displayName:"ай",relative:{0:"осы ай",1:"келесі ай","-1":"өткен ай"},relativeTime:{future:{one:"{0} айдан кейін",other:"{0} айдан кейін"},past:{one:"{0} ай бұрын",other:"{0} ай бұрын"}}},day:{displayName:"күн",relative:{0:"бүгін",1:"ертең",2:"бүрсігүні","-2":"алдыңгүні","-1":"кеше"},relativeTime:{future:{one:"{0} күннен кейін",other:"{0} күннен кейін"},past:{one:"{0} күн бұрын",other:"{0} күн бұрын"}}},hour:{displayName:"сағат",relative:{0:"осы сағат"},relativeTime:{future:{one:"{0} сағаттан кейін",other:"{0} сағаттан кейін"},past:{one:"{0} сағат бұрын",other:"{0} сағат бұрын"}}},minute:{displayName:"минут",relative:{0:"осы минут"},relativeTime:{future:{one:"{0} минуттан кейін",other:"{0} минуттан кейін"},past:{one:"{0} минут бұрын",other:"{0} минут бұрын"}}},second:{displayName:"секунд",relative:{0:"қазір"},relativeTime:{future:{one:"{0} секундтан кейін",other:"{0} секундтан кейін"},past:{one:"{0} секунд бұрын",other:"{0} секунд бұрын"}}}}},{locale:"kkj",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"muka",1:"nɛmɛnɔ","-1":"kwey"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"kl",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"om {0} ukioq",other:"om {0} ukioq"},past:{one:"for {0} ukioq siden",other:"for {0} ukioq siden"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"om {0} qaammat",other:"om {0} qaammat"},past:{one:"for {0} qaammat siden",other:"for {0} qaammat siden"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{one:"om {0} ulloq unnuarlu",other:"om {0} ulloq unnuarlu"},past:{one:"for {0} ulloq unnuarlu siden",other:"for {0} ulloq unnuarlu siden"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{one:"om {0} nalunaaquttap-akunnera",other:"om {0} nalunaaquttap-akunnera"},past:{one:"for {0} nalunaaquttap-akunnera siden",other:"for {0} nalunaaquttap-akunnera siden"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{one:"om {0} minutsi",other:"om {0} minutsi"},past:{one:"for {0} minutsi siden",other:"for {0} minutsi siden"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{one:"om {0} sekundi",other:"om {0} sekundi"},past:{one:"for {0} sekundi siden",other:"for {0} sekundi siden"}}}}},{locale:"kln",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Kenyit",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Arawet",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Betut",relative:{0:"Raini",1:"Mutai","-1":"Amut"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Sait",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minitit",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekondit",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"km",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"ឆ្នាំ",relative:{0:"ឆ្នាំ​នេះ",1:"ឆ្នាំ​ក្រោយ","-1":"ឆ្នាំ​មុន"},relativeTime:{future:{other:"{0} ឆ្នាំទៀត"},past:{other:"{0} ឆ្នាំ​មុន"}}},month:{displayName:"ខែ",relative:{0:"ខែ​នេះ",1:"ខែ​ក្រោយ","-1":"ខែ​មុន"},relativeTime:{future:{other:"{0} ខែទៀត"},past:{other:"{0} ខែមុន"}}},day:{displayName:"ថ្ងៃ",relative:{0:"ថ្ងៃ​នេះ",1:"ថ្ងៃ​ស្អែក",2:"​ខាន​ស្អែក","-2":"ម្សិល​ម៉្ងៃ","-1":"ម្សិលមិញ"},relativeTime:{future:{other:"{0} ថ្ងៃទៀត"},past:{other:"{0} ថ្ងៃ​មុន"}}},hour:{displayName:"ម៉ោង",relative:{0:"ម៉ោងនេះ"},relativeTime:{future:{other:"ក្នុង​រយៈ​ពេល {0} ម៉ោង"},past:{other:"{0} ម៉ោង​មុន"}}},minute:{displayName:"នាទី",relative:{0:"នាទីនេះ"},relativeTime:{future:{other:"{0} នាទីទៀត"},past:{other:"{0} នាទី​មុន"}}},second:{displayName:"វិនាទី",relative:{0:"ឥឡូវ"},relativeTime:{future:{other:"{0} វិនាទីទៀត"},past:{other:"{0} វិនាទី​មុន"}}}}},{locale:"kn",pluralRuleFunction:function(e,t){return t?"other":e>=0&&e<=1?"one":"other"},fields:{year:{displayName:"ವರ್ಷ",relative:{0:"ಈ ವರ್ಷ",1:"ಮುಂದಿನ ವರ್ಷ","-1":"ಹಿಂದಿನ ವರ್ಷ"},relativeTime:{future:{one:"{0} ವರ್ಷದಲ್ಲಿ",other:"{0} ವರ್ಷಗಳಲ್ಲಿ"},past:{one:"{0} ವರ್ಷದ ಹಿಂದೆ",other:"{0} ವರ್ಷಗಳ ಹಿಂದೆ"}}},month:{displayName:"ತಿಂಗಳು",relative:{0:"ಈ ತಿಂಗಳು",1:"ಮುಂದಿನ ತಿಂಗಳು","-1":"ಕಳೆದ ತಿಂಗಳು"},relativeTime:{future:{one:"{0} ತಿಂಗಳಲ್ಲಿ",other:"{0} ತಿಂಗಳುಗಳಲ್ಲಿ"},past:{one:"{0} ತಿಂಗಳುಗಳ ಹಿಂದೆ",other:"{0} ತಿಂಗಳುಗಳ ಹಿಂದೆ"}}},day:{displayName:"ದಿನ",relative:{0:"ಇಂದು",1:"ನಾಳೆ",2:"ನಾಡಿದ್ದು","-2":"ಮೊನ್ನೆ","-1":"ನಿನ್ನೆ"},relativeTime:{future:{one:"{0} ದಿನದಲ್ಲಿ",other:"{0} ದಿನಗಳಲ್ಲಿ"},past:{one:"{0} ದಿನದ ಹಿಂದೆ",other:"{0} ದಿನಗಳ ಹಿಂದೆ"}}},hour:{displayName:"ಗಂಟೆ",relative:{0:"ಈ ಗಂಟೆ"},relativeTime:{future:{one:"{0} ಗಂಟೆಯಲ್ಲಿ",other:"{0} ಗಂಟೆಗಳಲ್ಲಿ"},past:{one:"{0} ಗಂಟೆ ಹಿಂದೆ",other:"{0} ಗಂಟೆಗಳ ಹಿಂದೆ"}}},minute:{displayName:"ನಿಮಿಷ",relative:{0:"ಈ ನಿಮಿಷ"},relativeTime:{future:{one:"{0} ನಿಮಿಷದಲ್ಲಿ",other:"{0} ನಿಮಿಷಗಳಲ್ಲಿ"},past:{one:"{0} ನಿಮಿಷಗಳ ಹಿಂದೆ",other:"{0} ನಿಮಿಷಗಳ ಹಿಂದೆ"}}},second:{displayName:"ಸೆಕೆಂಡ್",relative:{0:"ಈಗ"},relativeTime:{future:{one:"{0} ಸೆಕೆಂಡ್‌ನಲ್ಲಿ",other:"{0} ಸೆಕೆಂಡ್‌ಗಳಲ್ಲಿ"},past:{one:"{0} ಸೆಕೆಂಡ್ ಹಿಂದೆ",other:"{0} ಸೆಕೆಂಡುಗಳ ಹಿಂದೆ"}}}}},{locale:"ko",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"년",relative:{0:"올해",1:"내년","-1":"작년"},relativeTime:{future:{other:"{0}년 후"},past:{other:"{0}년 전"}}},month:{displayName:"월",relative:{0:"이번 달",1:"다음 달","-1":"지난달"},relativeTime:{future:{other:"{0}개월 후"},past:{other:"{0}개월 전"}}},day:{displayName:"일",relative:{0:"오늘",1:"내일",2:"모레","-2":"그저께","-1":"어제"},relativeTime:{future:{other:"{0}일 후"},past:{other:"{0}일 전"}}},hour:{displayName:"시",relative:{0:"현재 시간"},relativeTime:{future:{other:"{0}시간 후"},past:{other:"{0}시간 전"}}},minute:{displayName:"분",relative:{0:"현재 분"},relativeTime:{future:{other:"{0}분 후"},past:{other:"{0}분 전"}}},second:{displayName:"초",relative:{0:"지금"},relativeTime:{future:{other:"{0}초 후"},past:{other:"{0}초 전"}}}}},{locale:"ko-KP",parentLocale:"ko"},{locale:"kok",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ks",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"ؤری",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"رٮ۪تھ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"دۄہ",relative:{0:"اَز",1:"پگاہ","-1":"راتھ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"گٲنٛٹہٕ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"مِنَٹ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"سٮ۪کَنڑ",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ksb",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Ng’waka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Ng’ezi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Siku",relative:{0:"Evi eo",1:"Keloi","-1":"Ghuo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Dakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ksf",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Bǝk",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Ŋwíí",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ŋwós",relative:{0:"Gɛ́ɛnǝ",1:"Ridúrǝ́","-1":"Rinkɔɔ́"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Cámɛɛn",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Mǝnít",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Háu",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ksh",pluralRuleFunction:function(e,t){return t?"other":0==e?"zero":1==e?"one":"other"},fields:{year:{displayName:"Johr",relative:{0:"diß Johr",1:"näx Johr","-1":"läz Johr"},relativeTime:{future:{zero:"en keinem Johr",one:"en {0} Johr",other:"en {0} Johre"},past:{zero:"vör keijnem Johr",one:"vör {0} Johr",other:"vör {0} Johre"}}},month:{displayName:"Mohnd",relative:{0:"diese Mohnd",1:"nächste Mohnd","-1":"lätzde Mohnd"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Daach",relative:{0:"hück",1:"morje",2:"övvermorje","-2":"vörjestere","-1":"jestere"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Schtund",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Menutt",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekond",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ku",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"kw",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ky",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"жыл",relative:{0:"быйыл",1:"эмдиги жылы","-1":"былтыр"},relativeTime:{future:{one:"{0} жылдан кийин",other:"{0} жылдан кийин"},past:{one:"{0} жыл мурун",other:"{0} жыл мурун"}}},month:{displayName:"ай",relative:{0:"бул айда",1:"эмдиги айда","-1":"өткөн айда"},relativeTime:{future:{one:"{0} айдан кийин",other:"{0} айдан кийин"},past:{one:"{0} ай мурун",other:"{0} ай мурун"}}},day:{displayName:"күн",relative:{0:"бүгүн",1:"эртеӊ",2:"бүрсүгүнү","-2":"мурдагы күнү","-1":"кечээ"},relativeTime:{future:{one:"{0} күндөн кийин",other:"{0} күндөн кийин"},past:{one:"{0} күн мурун",other:"{0} күн мурун"}}},hour:{displayName:"саат",relative:{0:"ушул саатта"},relativeTime:{future:{one:"{0} сааттан кийин",other:"{0} сааттан кийин"},past:{one:"{0} саат мурун",other:"{0} саат мурун"}}},minute:{displayName:"мүнөт",relative:{0:"ушул мүнөттө"},relativeTime:{future:{one:"{0} мүнөттөн кийин",other:"{0} мүнөттөн кийин"},past:{one:"{0} мүнөт мурун",other:"{0} мүнөт мурун"}}},second:{displayName:"секунд",relative:{0:"азыр"},relativeTime:{future:{one:"{0} секунддан кийин",other:"{0} секунддан кийин"},past:{one:"{0} секунд мурун",other:"{0} секунд мурун"}}}}},{locale:"lag",pluralRuleFunction:function(e,t){var r=String(e).split(".")[0];return t?"other":0==e?"zero":0!=r&&1!=r||0==e?"other":"one"},fields:{year:{displayName:"Mwaáka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mweéri",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Sikʉ",relative:{0:"Isikʉ",1:"Lamʉtoondo","-1":"Niijo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Sáa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Dakíka",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekúunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"lb",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Joer",relative:{0:"dëst Joer",1:"nächst Joer","-1":"lescht Joer"},relativeTime:{future:{one:"an {0} Joer",other:"a(n) {0} Joer"},past:{one:"virun {0} Joer",other:"viru(n) {0} Joer"}}},month:{displayName:"Mount",relative:{0:"dëse Mount",1:"nächste Mount","-1":"leschte Mount"},relativeTime:{future:{one:"an {0} Mount",other:"a(n) {0} Méint"},past:{one:"virun {0} Mount",other:"viru(n) {0} Méint"}}},day:{displayName:"Dag",relative:{0:"haut",1:"muer","-1":"gëschter"},relativeTime:{future:{one:"an {0} Dag",other:"a(n) {0} Deeg"},past:{one:"virun {0} Dag",other:"viru(n) {0} Deeg"}}},hour:{displayName:"Stonn",relative:{0:"this hour"},relativeTime:{future:{one:"an {0} Stonn",other:"a(n) {0} Stonnen"},past:{one:"virun {0} Stonn",other:"viru(n) {0} Stonnen"}}},minute:{displayName:"Minutt",relative:{0:"this minute"},relativeTime:{future:{one:"an {0} Minutt",other:"a(n) {0} Minutten"},past:{one:"virun {0} Minutt",other:"viru(n) {0} Minutten"}}},second:{displayName:"Sekonn",relative:{0:"now"},relativeTime:{future:{one:"an {0} Sekonn",other:"a(n) {0} Sekonnen"},past:{one:"virun {0} Sekonn",other:"viru(n) {0} Sekonnen"}}}}},{locale:"lg",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Mwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mwezi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Lunaku",relative:{0:"Lwaleero",1:"Nkya","-1":"Ggulo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Saawa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Dakiika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Kasikonda",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"lkt",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Ómakȟa",relative:{0:"Lé ómakȟa kiŋ",1:"Tȟokáta ómakȟa kiŋháŋ","-1":"Ómakȟa kʼuŋ héhaŋ"},relativeTime:{future:{other:"Letáŋhaŋ ómakȟa {0} kiŋháŋ"},past:{other:"Hékta ómakȟa {0} kʼuŋ héhaŋ"}}},month:{displayName:"Wí",relative:{0:"Lé wí kiŋ",1:"Tȟokáta wí kiŋháŋ","-1":"Wí kʼuŋ héhaŋ"},relativeTime:{future:{other:"Letáŋhaŋ wíyawapi {0} kiŋháŋ"},past:{other:"Hékta wíyawapi {0} kʼuŋ héhaŋ"}}},day:{displayName:"Aŋpétu",relative:{0:"Lé aŋpétu kiŋ",1:"Híŋhaŋni kiŋháŋ","-1":"Ȟtálehaŋ"},relativeTime:{future:{other:"Letáŋhaŋ {0}-čháŋ kiŋháŋ"},past:{other:"Hékta {0}-čháŋ k’uŋ héhaŋ"}}},hour:{displayName:"Owápȟe",relative:{0:"this hour"},relativeTime:{future:{other:"Letáŋhaŋ owápȟe {0} kiŋháŋ"},past:{other:"Hékta owápȟe {0} kʼuŋ héhaŋ"}}},minute:{displayName:"Owápȟe oȟʼáŋkȟo",relative:{0:"this minute"},relativeTime:{future:{other:"Letáŋhaŋ oȟ’áŋkȟo {0} kiŋháŋ"},past:{other:"Hékta oȟ’áŋkȟo {0} k’uŋ héhaŋ"}}},second:{displayName:"Okpí",relative:{0:"now"},relativeTime:{future:{other:"Letáŋhaŋ okpí {0} kiŋháŋ"},past:{other:"Hékta okpí {0} k’uŋ héhaŋ"}}}}},{locale:"ln",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"},fields:{year:{displayName:"Mobú",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Sánzá",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Mokɔlɔ",relative:{0:"Lɛlɔ́",1:"Lóbi ekoyâ","-1":"Lóbi elékí"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Ngonga",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Monúti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sɛkɔ́ndɛ",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ln-AO",parentLocale:"ln"},{locale:"ln-CF",parentLocale:"ln"},{locale:"ln-CG",parentLocale:"ln"},{locale:"lo",pluralRuleFunction:function(e,t){return t&&1==e?"one":"other"},fields:{year:{displayName:"ປີ",relative:{0:"ປີນີ້",1:"ປີໜ້າ","-1":"ປີກາຍ"},relativeTime:{future:{other:"ໃນອີກ {0} ປີ"},past:{other:"{0} ປີກ່ອນ"}}},month:{displayName:"ເດືອນ",relative:{0:"ເດືອນນີ້",1:"ເດືອນໜ້າ","-1":"ເດືອນແລ້ວ"},relativeTime:{future:{other:"ໃນອີກ {0} ເດືອນ"},past:{other:"{0} ເດືອນກ່ອນ"}}},day:{displayName:"ມື້",relative:{0:"ມື້ນີ້",1:"ມື້ອື່ນ",2:"ມື້ຮື","-2":"ມື້ກ່ອນ","-1":"ມື້ວານ"},relativeTime:{future:{other:"ໃນອີກ {0} ມື້"},past:{other:"{0} ມື້ກ່ອນ"}}},hour:{displayName:"ຊົ່ວໂມງ",relative:{0:"ຊົ່ວໂມງນີ້"},relativeTime:{future:{other:"ໃນອີກ {0} ຊົ່ວໂມງ"},past:{other:"{0} ຊົ່ວໂມງກ່ອນ"}}},minute:{displayName:"ນາທີ",relative:{0:"ນາທີນີ້"},relativeTime:{future:{other:"{0} ໃນອີກ 0 ນາທີ"},past:{other:"{0} ນາທີກ່ອນ"}}},second:{displayName:"ວິນາທີ",relative:{0:"ຕອນນີ້"},relativeTime:{future:{other:"ໃນອີກ {0} ວິນາທີ"},past:{other:"{0} ວິນາທີກ່ອນ"}}}}},{locale:"lrc",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"سال",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"ما",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"روٙز",relative:{0:"أمروٙ",1:"شوٙصوٙ","-1":"دیروٙز"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"ساأت",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"دئیقە",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"ثانیە",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"lrc-IQ",parentLocale:"lrc"},{locale:"lt",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[1]||"",n=Number(r[0])==e,o=n&&r[0].slice(-1),i=n&&r[0].slice(-2);return t?"other":1==o&&(i<11||i>19)?"one":o>=2&&o<=9&&(i<11||i>19)?"few":0!=a?"many":"other"},fields:{year:{displayName:"metai",relative:{0:"šiais metais",1:"kitais metais","-1":"praėjusiais metais"},relativeTime:{future:{one:"po {0} metų",few:"po {0} metų",many:"po {0} metų",other:"po {0} metų"},past:{one:"prieš {0} metus",few:"prieš {0} metus",many:"prieš {0} metų",other:"prieš {0} metų"}}},month:{displayName:"mėnuo",relative:{0:"šį mėnesį",1:"kitą mėnesį","-1":"praėjusį mėnesį"},relativeTime:{future:{one:"po {0} mėnesio",few:"po {0} mėnesių",many:"po {0} mėnesio",other:"po {0} mėnesių"},past:{one:"prieš {0} mėnesį",few:"prieš {0} mėnesius",many:"prieš {0} mėnesio",other:"prieš {0} mėnesių"}}},day:{displayName:"diena",relative:{0:"šiandien",1:"rytoj",2:"poryt","-2":"užvakar","-1":"vakar"},relativeTime:{future:{one:"po {0} dienos",few:"po {0} dienų",many:"po {0} dienos",other:"po {0} dienų"},past:{one:"prieš {0} dieną",few:"prieš {0} dienas",many:"prieš {0} dienos",other:"prieš {0} dienų"}}},hour:{displayName:"valanda",relative:{0:"šią valandą"},relativeTime:{future:{one:"po {0} valandos",few:"po {0} valandų",many:"po {0} valandos",other:"po {0} valandų"},past:{one:"prieš {0} valandą",few:"prieš {0} valandas",many:"prieš {0} valandos",other:"prieš {0} valandų"}}},minute:{displayName:"minutė",relative:{0:"šią minutę"},relativeTime:{future:{one:"po {0} minutės",few:"po {0} minučių",many:"po {0} minutės",other:"po {0} minučių"},past:{one:"prieš {0} minutę",few:"prieš {0} minutes",many:"prieš {0} minutės",other:"prieš {0} minučių"}}},second:{displayName:"sekundė",relative:{0:"dabar"},relativeTime:{future:{one:"po {0} sekundės",few:"po {0} sekundžių",many:"po {0} sekundės",other:"po {0} sekundžių"},past:{one:"prieš {0} sekundę",few:"prieš {0} sekundes",many:"prieš {0} sekundės",other:"prieš {0} sekundžių"}}}}},{locale:"lu",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Tshidimu",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Ngondo",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Dituku",relative:{0:"Lelu",1:"Malaba","-1":"Makelela"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Diba",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Kasunsu",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Kasunsukusu",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"luo",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"higa",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"dwe",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"chieng’",relative:{0:"kawuono",1:"kiny","-1":"nyoro"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"dakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"nyiriri mar saa",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"luy",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Muhiga",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mweri",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ridiku",relative:{0:"Lero",1:"Mgamba","-1":"Mgorova"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Isaa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Idagika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"lv",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[1]||"",n=a.length,o=Number(r[0])==e,i=o&&r[0].slice(-1),l=o&&r[0].slice(-2),s=a.slice(-2),u=a.slice(-1);return t?"other":o&&0==i||l>=11&&l<=19||2==n&&s>=11&&s<=19?"zero":1==i&&11!=l||2==n&&1==u&&11!=s||2!=n&&1==u?"one":"other"},fields:{year:{displayName:"gads",relative:{0:"šajā gadā",1:"nākamajā gadā","-1":"pagājušajā gadā"},relativeTime:{future:{zero:"pēc {0} gadiem",one:"pēc {0} gada",other:"pēc {0} gadiem"},past:{zero:"pirms {0} gadiem",one:"pirms {0} gada",other:"pirms {0} gadiem"}}},month:{displayName:"mēnesis",relative:{0:"šajā mēnesī",1:"nākamajā mēnesī","-1":"pagājušajā mēnesī"},relativeTime:{future:{zero:"pēc {0} mēnešiem",one:"pēc {0} mēneša",other:"pēc {0} mēnešiem"},past:{zero:"pirms {0} mēnešiem",one:"pirms {0} mēneša",other:"pirms {0} mēnešiem"}}},day:{displayName:"diena",relative:{0:"šodien",1:"rīt",2:"parīt","-2":"aizvakar","-1":"vakar"},relativeTime:{future:{zero:"pēc {0} dienām",one:"pēc {0} dienas",other:"pēc {0} dienām"},past:{zero:"pirms {0} dienām",one:"pirms {0} dienas",other:"pirms {0} dienām"}}},hour:{displayName:"stundas",relative:{0:"šajā stundā"},relativeTime:{future:{zero:"pēc {0} stundām",one:"pēc {0} stundas",other:"pēc {0} stundām"},past:{zero:"pirms {0} stundām",one:"pirms {0} stundas",other:"pirms {0} stundām"}}},minute:{displayName:"minūtes",relative:{0:"šajā minūtē"},relativeTime:{future:{zero:"pēc {0} minūtēm",one:"pēc {0} minūtes",other:"pēc {0} minūtēm"},past:{zero:"pirms {0} minūtēm",one:"pirms {0} minūtes",other:"pirms {0} minūtēm"}}},second:{displayName:"sekundes",relative:{0:"tagad"},relativeTime:{future:{zero:"pēc {0} sekundēm",one:"pēc {0} sekundes",other:"pēc {0} sekundēm"},past:{zero:"pirms {0} sekundēm",one:"pirms {0} sekundes",other:"pirms {0} sekundēm"}}}}},{locale:"mas",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Ɔlárì",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Ɔlápà",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ɛnkɔlɔ́ŋ",relative:{0:"Táatá",1:"Tááisérè","-1":"Ŋolé"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Ɛ́sáâ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Oldákikaè",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"mas-TZ",parentLocale:"mas"},{locale:"mer",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Mwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mweri",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ntukũ",relative:{0:"Narua",1:"Rũjũ","-1":"Ĩgoro"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Ĩthaa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Ndagika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekondi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"mfe",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Lane",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mwa",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Zour",relative:{0:"Zordi",1:"Demin","-1":"Yer"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Ler",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minit",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Segonn",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"mg",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"},fields:{year:{displayName:"Taona",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Volana",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Andro",relative:{0:"Anio",1:"Rahampitso","-1":"Omaly"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Ora",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minitra",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Segondra",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"mgh",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"yaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"mweri",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"nihuku",relative:{0:"lel’lo",1:"me’llo","-1":"n’chana"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"isaa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"idakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"isekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"mgo",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"fituʼ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"iməg",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"+{0} m",other:"+{0} m"},past:{one:"-{0} m",other:"-{0} m"}}},day:{displayName:"anəg",relative:{0:"tèchɔ̀ŋ",1:"isu",2:"isu ywi","-1":"ikwiri"},relativeTime:{future:{one:"+{0} d",other:"+{0} d"},past:{one:"-{0} d",other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{one:"+{0} h",other:"+{0} h"},past:{one:"-{0} h",other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{one:"+{0} min",other:"+{0} min"},past:{one:"-{0} min",other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{one:"+{0} s",other:"+{0} s"},past:{one:"-{0} s",other:"-{0} s"}}}}},{locale:"mk",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=a.slice(-2),s=n.slice(-1);return t?1==i&&11!=l?"one":2==i&&12!=l?"two":7!=i&&8!=i||17==l||18==l?"other":"many":o&&1==i||1==s?"one":"other"},fields:{year:{displayName:"година",relative:{0:"оваа година",1:"следната година","-1":"минатата година"},relativeTime:{future:{one:"за {0} година",other:"за {0} години"},past:{one:"пред {0} година",other:"пред {0} години"}}},month:{displayName:"месец",relative:{0:"овој месец",1:"следниот месец","-1":"минатиот месец"},relativeTime:{future:{one:"за {0} месец",other:"за {0} месеци"},past:{one:"пред {0} месец",other:"пред {0} месеци"}}},day:{displayName:"ден",relative:{0:"денес",1:"утре",2:"задутре","-2":"завчера","-1":"вчера"},relativeTime:{future:{one:"за {0} ден",other:"за {0} дена"},past:{one:"пред {0} ден",other:"пред {0} дена"}}},hour:{displayName:"час",relative:{0:"часов"},relativeTime:{future:{one:"за {0} час",other:"за {0} часа"},past:{one:"пред {0} час",other:"пред {0} часа"}}},minute:{displayName:"минута",relative:{0:"оваа минута"},relativeTime:{future:{one:"за {0} минута",other:"за {0} минути"},past:{one:"пред {0} минута",other:"пред {0} минути"}}},second:{displayName:"секунда",relative:{0:"сега"},relativeTime:{future:{one:"за {0} секунда",other:"за {0} секунди"},past:{one:"пред {0} секунда",other:"пред {0} секунди"}}}}},{locale:"ml",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"വർഷം",relative:{0:"ഈ വർ‌ഷം",1:"അടുത്തവർഷം","-1":"കഴിഞ്ഞ വർഷം"},relativeTime:{future:{one:"{0} വർഷത്തിൽ",other:"{0} വർഷത്തിൽ"},past:{one:"{0} വർഷം മുമ്പ്",other:"{0} വർഷം മുമ്പ്"}}},month:{displayName:"മാസം",relative:{0:"ഈ മാസം",1:"അടുത്ത മാസം","-1":"കഴിഞ്ഞ മാസം"},relativeTime:{future:{one:"{0} മാസത്തിൽ",other:"{0} മാസത്തിൽ"},past:{one:"{0} മാസം മുമ്പ്",other:"{0} മാസം മുമ്പ്"}}},day:{displayName:"ദിവസം",relative:{0:"ഇന്ന്",1:"നാളെ",2:"മറ്റന്നാൾ","-2":"മിനിഞ്ഞാന്ന്","-1":"ഇന്നലെ"},relativeTime:{future:{one:"{0} ദിവസത്തിൽ",other:"{0} ദിവസത്തിൽ"},past:{one:"{0} ദിവസം മുമ്പ്",other:"{0} ദിവസം മുമ്പ്"}}},hour:{displayName:"മണിക്കൂർ",relative:{0:"ഈ മണിക്കൂറിൽ"},relativeTime:{future:{one:"{0} മണിക്കൂറിൽ",other:"{0} മണിക്കൂറിൽ"},past:{one:"{0} മണിക്കൂർ മുമ്പ്",other:"{0} മണിക്കൂർ മുമ്പ്"}}},minute:{displayName:"മിനിറ്റ്",relative:{0:"ഈ മിനിറ്റിൽ"},relativeTime:{future:{one:"{0} മിനിറ്റിൽ",other:"{0} മിനിറ്റിൽ"},past:{one:"{0} മിനിറ്റ് മുമ്പ്",other:"{0} മിനിറ്റ് മുമ്പ്"}}},second:{displayName:"സെക്കൻഡ്",relative:{0:"ഇപ്പോൾ"},relativeTime:{future:{one:"{0} സെക്കൻഡിൽ",other:"{0} സെക്കൻഡിൽ"},past:{one:"{0} സെക്കൻഡ് മുമ്പ്",other:"{0} സെക്കൻഡ് മുമ്പ്"}}}}},{locale:"mn",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"жил",relative:{0:"энэ жил",1:"ирэх жил","-1":"өнгөрсөн жил"},relativeTime:{future:{one:"{0} жилийн дараа",other:"{0} жилийн дараа"},past:{one:"{0} жилийн өмнө",other:"{0} жилийн өмнө"}}},month:{displayName:"сар",relative:{0:"энэ сар",1:"ирэх сар","-1":"өнгөрсөн сар"},relativeTime:{future:{one:"{0} сарын дараа",other:"{0} сарын дараа"},past:{one:"{0} сарын өмнө",other:"{0} сарын өмнө"}}},day:{displayName:"өдөр",relative:{0:"өнөөдөр",1:"маргааш",2:"нөгөөдөр","-2":"уржигдар","-1":"өчигдөр"},relativeTime:{future:{one:"{0} өдрийн дараа",other:"{0} өдрийн дараа"},past:{one:"{0} өдрийн өмнө",other:"{0} өдрийн өмнө"}}},hour:{displayName:"цаг",relative:{0:"энэ цаг"},relativeTime:{future:{one:"{0} цагийн дараа",other:"{0} цагийн дараа"},past:{one:"{0} цагийн өмнө",other:"{0} цагийн өмнө"}}},minute:{displayName:"минут",relative:{0:"энэ минут"},relativeTime:{future:{one:"{0} минутын дараа",other:"{0} минутын дараа"},past:{one:"{0} минутын өмнө",other:"{0} минутын өмнө"}}},second:{displayName:"секунд",relative:{0:"одоо"},relativeTime:{future:{one:"{0} секундын дараа",other:"{0} секундын дараа"},past:{one:"{0} секундын өмнө",other:"{0} секундын өмнө"}}}}},{locale:"mn-Mong",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"mo",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1],n=Number(r[0])==e&&r[0].slice(-2);return t?1==e?"one":"other":1==e&&a?"one":!a||0==e||1!=e&&n>=1&&n<=19?"few":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"mr",pluralRuleFunction:function(e,t){return t?1==e?"one":2==e||3==e?"two":4==e?"few":"other":e>=0&&e<=1?"one":"other"},fields:{year:{displayName:"वर्ष",relative:{0:"हे वर्ष",1:"पुढील वर्ष","-1":"मागील वर्ष"},relativeTime:{future:{one:"{0} वर्षामध्ये",other:"{0} वर्षांमध्ये"},past:{one:"{0} वर्षापूर्वी",other:"{0} वर्षांपूर्वी"}}},month:{displayName:"महिना",relative:{0:"हा महिना",1:"पुढील महिना","-1":"मागील महिना"},relativeTime:{future:{one:"{0} महिन्यामध्ये",other:"{0} महिन्यांमध्ये"},past:{one:"{0} महिन्यापूर्वी",other:"{0} महिन्यांपूर्वी"}}},day:{displayName:"दिवस",relative:{0:"आज",1:"उद्या","-1":"काल"},relativeTime:{future:{one:"{0} दिवसामध्ये",other:"{0} दिवसांमध्ये"},past:{one:"{0} दिवसापूर्वी",other:"{0} दिवसांपूर्वी"}}},hour:{displayName:"तास",relative:{0:"तासात"},relativeTime:{future:{one:"{0} तासामध्ये",other:"{0} तासांमध्ये"},past:{one:"{0} तासापूर्वी",other:"{0} तासांपूर्वी"}}},minute:{displayName:"मिनिट",relative:{0:"या मिनिटात"},relativeTime:{future:{one:"{0} मिनिटामध्ये",other:"{0} मिनिटांमध्ये"},past:{one:"{0} मिनिटापूर्वी",other:"{0} मिनिटांपूर्वी"}}},second:{displayName:"सेकंद",relative:{0:"आत्ता"},relativeTime:{future:{one:"{0} सेकंदामध्ये",other:"{0} सेकंदांमध्ये"},past:{one:"{0} सेकंदापूर्वी",other:"{0} सेकंदांपूर्वी"}}}}},{locale:"ms",pluralRuleFunction:function(e,t){return t&&1==e?"one":"other"},fields:{year:{displayName:"Tahun",relative:{0:"tahun ini",1:"tahun depan","-1":"tahun lalu"},relativeTime:{future:{other:"dalam {0} saat"},past:{other:"{0} tahun lalu"}}},month:{displayName:"Bulan",relative:{0:"bulan ini",1:"bulan depan","-1":"bulan lalu"},relativeTime:{future:{other:"dalam {0} bulan"},past:{other:"{0} bulan lalu"}}},day:{displayName:"Hari",relative:{0:"hari ini",1:"esok",2:"lusa","-2":"kelmarin","-1":"semalam"},relativeTime:{future:{other:"dalam {0} hari"},past:{other:"{0} hari lalu"}}},hour:{displayName:"Jam",relative:{0:"jam ini"},relativeTime:{future:{other:"dalam {0} jam"},past:{other:"{0} jam lalu"}}},minute:{displayName:"Minit",relative:{0:"pada minit ini"},relativeTime:{future:{other:"dalam {0} minit"},past:{other:"{0} minit lalu"}}},second:{displayName:"Saat",relative:{0:"sekarang"},relativeTime:{future:{other:"dalam {0} saat"},past:{other:"{0} saat lalu"}}}}},{locale:"ms-Arab",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ms-BN",parentLocale:"ms"},{locale:"ms-SG",parentLocale:"ms"},{locale:"mt",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e&&r[0].slice(-2);return t?"other":1==e?"one":0==e||a>=2&&a<=10?"few":a>=11&&a<=19?"many":"other"},fields:{year:{displayName:"Sena",relative:{0:"din is-sena",1:"Is-sena d-dieħla","-1":"Is-sena li għaddiet"},relativeTime:{future:{other:"+{0} y"},past:{one:"{0} sena ilu",few:"{0} snin ilu",many:"{0} snin ilu",other:"{0} snin ilu"}}},month:{displayName:"Xahar",relative:{0:"Dan ix-xahar",1:"Ix-xahar id-dieħel","-1":"Ix-xahar li għadda"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Jum",relative:{0:"Illum",1:"Għada","-1":"Ilbieraħ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Siegħa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minuta",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekonda",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"mua",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Syii",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Fĩi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Zah’nane/ Comme",relative:{0:"Tǝ’nahko",1:"Tǝ’nane","-1":"Tǝsoo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Cok comme",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Cok comme ma laŋne",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Cok comme ma laŋ tǝ biŋ",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"my",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"နှစ်",relative:{0:"ယခုနှစ်",1:"လာမည့်နှစ်","-1":"ယမန်နှစ်"},relativeTime:{future:{other:"{0} နှစ်အတွင်း"},past:{other:"ပြီးခဲ့သည့် {0} နှစ်"}}},month:{displayName:"လ",relative:{0:"ယခုလ",1:"လာမည့်လ","-1":"ပြီးခဲ့သည့်လ"},relativeTime:{future:{other:"{0} လအတွင်း"},past:{other:"ပြီးခဲ့သည့် {0} လ"}}},day:{displayName:"ရက်",relative:{0:"ယနေ့",1:"မနက်ဖြန်",2:"သန်ဘက်ခါ","-2":"တစ်နေ့က","-1":"မနေ့က"},relativeTime:{future:{other:"{0} ရက်အတွင်း"},past:{other:"ပြီးခဲ့သည့် {0} ရက်"}}},hour:{displayName:"နာရီ",relative:{0:"ဤအချိန်"},relativeTime:{future:{other:"{0} နာရီအတွင်း"},past:{other:"ပြီးခဲ့သည့် {0} နာရီ"}}},minute:{displayName:"မိနစ်",relative:{0:"ဤမိနစ်"},relativeTime:{future:{other:"{0} မိနစ်အတွင်း"},past:{other:"ပြီးခဲ့သည့် {0} မိနစ်"}}},second:{displayName:"စက္ကန့်",relative:{0:"ယခု"},relativeTime:{future:{other:"{0} စက္ကန့်အတွင်း"},past:{other:"ပြီးခဲ့သည့် {0} စက္ကန့်"}}}}},{locale:"mzn",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"سال",relative:{0:"امسال",1:"سال دیگه","-1":"پارسال"},relativeTime:{future:{other:"{0} سال دله"},past:{other:"{0} سال پیش"}}},month:{displayName:"ماه",relative:{0:"این ماه",1:"ماه ِبعد","-1":"ماه قبل"},relativeTime:{future:{other:"{0} ماه دله"},past:{other:"{0} ماه پیش"}}},day:{displayName:"روز",relative:{0:"اَمروز",1:"فِردا","-1":"دیروز"},relativeTime:{future:{other:"{0} روز دله"},past:{other:"{0} روز پیش"}}},hour:{displayName:"ساعِت",relative:{0:"this hour"},relativeTime:{future:{other:"{0} ساعِت دله"},past:{other:"{0} ساعِت پیش"}}},minute:{displayName:"دقیقه",relative:{0:"this minute"},relativeTime:{future:{other:"{0} دقیقه دله"},past:{other:"{0} دَقه پیش"}}},second:{displayName:"ثانیه",relative:{0:"now"},relativeTime:{future:{other:"{0} ثانیه دله"},past:{other:"{0} ثانیه پیش"}}}}},{locale:"nah",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"naq",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"},fields:{year:{displayName:"Kurib",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"ǁKhâb",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Tsees",relative:{0:"Neetsee",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Iiri",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Haib",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"ǀGâub",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"nb",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"år",relative:{0:"i år",1:"neste år","-1":"i fjor"},relativeTime:{future:{one:"om {0} år",other:"om {0} år"},past:{one:"for {0} år siden",other:"for {0} år siden"}}},month:{displayName:"måned",relative:{0:"denne måneden",1:"neste måned","-1":"forrige måned"},relativeTime:{future:{one:"om {0} måned",other:"om {0} måneder"},past:{one:"for {0} måned siden",other:"for {0} måneder siden"}}},day:{displayName:"dag",relative:{0:"i dag",1:"i morgen",2:"i overmorgen","-2":"i forgårs","-1":"i går"},relativeTime:{future:{one:"om {0} døgn",other:"om {0} døgn"},past:{one:"for {0} døgn siden",other:"for {0} døgn siden"}}},hour:{displayName:"time",relative:{0:"denne timen"},relativeTime:{future:{one:"om {0} time",other:"om {0} timer"},past:{one:"for {0} time siden",other:"for {0} timer siden"}}},minute:{displayName:"minutt",relative:{0:"dette minuttet"},relativeTime:{future:{one:"om {0} minutt",other:"om {0} minutter"},past:{one:"for {0} minutt siden",other:"for {0} minutter siden"}}},second:{displayName:"sekund",relative:{0:"nå"},relativeTime:{future:{one:"om {0} sekund",other:"om {0} sekunder"},past:{one:"for {0} sekund siden",other:"for {0} sekunder siden"}}}}},{locale:"nb-SJ",parentLocale:"nb"},{locale:"nd",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Umnyaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Inyangacale",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ilanga",relative:{0:"Lamuhla",1:"Kusasa","-1":"Izolo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Ihola",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Umuzuzu",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Isekendi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"nds",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"nds-NL",parentLocale:"nds"},{locale:"ne",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e;return t?a&&e>=1&&e<=4?"one":"other":1==e?"one":"other"},fields:{year:{displayName:"वर्ष",relative:{0:"यो वर्ष",1:"अर्को वर्ष","-1":"गत वर्ष"},relativeTime:{future:{one:"{0} वर्षमा",other:"{0} वर्षमा"},past:{one:"{0} वर्ष अघि",other:"{0} वर्ष अघि"}}},month:{displayName:"महिना",relative:{0:"यो महिना",1:"अर्को महिना","-1":"गत महिना"},relativeTime:{future:{one:"{0} महिनामा",other:"{0} महिनामा"},past:{one:"{0} महिना पहिले",other:"{0} महिना पहिले"}}},day:{displayName:"बार",relative:{0:"आज",1:"भोलि",2:"पर्सि","-2":"अस्ति","-1":"हिजो"},relativeTime:{future:{one:"{0} दिनमा",other:"{0} दिनमा"},past:{one:"{0} दिन पहिले",other:"{0} दिन पहिले"}}},hour:{displayName:"घण्टा",relative:{0:"यो घडीमा"},relativeTime:{future:{one:"{0} घण्टामा",other:"{0} घण्टामा"},past:{one:"{0} घण्टा पहिले",other:"{0} घण्टा पहिले"}}},minute:{displayName:"मिनेट",relative:{0:"यही मिनेटमा"},relativeTime:{future:{one:"{0} मिनेटमा",other:"{0} मिनेटमा"},past:{one:"{0} मिनेट पहिले",other:"{0} मिनेट पहिले"}}},second:{displayName:"सेकेन्ड",relative:{0:"अब"},relativeTime:{future:{one:"{0} सेकेण्डमा",other:"{0} सेकेण्डमा"},past:{one:"{0} सेकेण्ड पहिले",other:"{0} सेकेण्ड पहिले"}}}}},{locale:"ne-IN",parentLocale:"ne"},{locale:"nl",pluralRuleFunction:function(e,t){var r=!String(e).split(".")[1];return t?"other":1==e&&r?"one":"other"},fields:{year:{displayName:"jaar",relative:{0:"dit jaar",1:"volgend jaar","-1":"vorig jaar"},relativeTime:{future:{one:"over {0} jaar",other:"over {0} jaar"},past:{one:"{0} jaar geleden",other:"{0} jaar geleden"}}},month:{displayName:"maand",relative:{0:"deze maand",1:"volgende maand","-1":"vorige maand"},relativeTime:{future:{one:"over {0} maand",other:"over {0} maanden"},past:{one:"{0} maand geleden",other:"{0} maanden geleden"}}},day:{displayName:"dag",relative:{0:"vandaag",1:"morgen",2:"overmorgen","-2":"eergisteren","-1":"gisteren"},relativeTime:{future:{one:"over {0} dag",other:"over {0} dagen"},past:{one:"{0} dag geleden",other:"{0} dagen geleden"}}},hour:{displayName:"uur",relative:{0:"binnen een uur"},relativeTime:{future:{one:"over {0} uur",other:"over {0} uur"},past:{one:"{0} uur geleden",other:"{0} uur geleden"}}},minute:{displayName:"minuut",relative:{0:"binnen een minuut"},relativeTime:{future:{one:"over {0} minuut",other:"over {0} minuten"},past:{one:"{0} minuut geleden",other:"{0} minuten geleden"}}},second:{displayName:"seconde",relative:{0:"nu"},relativeTime:{future:{one:"over {0} seconde",other:"over {0} seconden"},past:{one:"{0} seconde geleden",other:"{0} seconden geleden"}}}}},{locale:"nl-AW",parentLocale:"nl"},{locale:"nl-BE",parentLocale:"nl"},{locale:"nl-BQ",parentLocale:"nl"},{locale:"nl-CW",parentLocale:"nl"},{locale:"nl-SR",parentLocale:"nl"},{locale:"nl-SX",parentLocale:"nl"},{locale:"nmg",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Mbvu",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Ngwɛn",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Duö",relative:{0:"Dɔl",1:"Namáná","-1":"Nakugú"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Wulā",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Mpálâ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Nyiɛl",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"nn",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"år",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"om {0} år",other:"om {0} år"},past:{one:"for {0} år siden",other:"for {0} år siden"}}},month:{displayName:"månad",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"om {0} måned",other:"om {0} måneder"},past:{one:"for {0} måned siden",other:"for {0} måneder siden"}}},day:{displayName:"dag",relative:{0:"i dag",1:"i morgon",2:"i overmorgon","-2":"i forgårs","-1":"i går"},relativeTime:{future:{one:"om {0} døgn",other:"om {0} døgn"},past:{one:"for {0} døgn siden",other:"for {0} døgn siden"}}},hour:{displayName:"time",relative:{0:"this hour"},relativeTime:{future:{one:"om {0} time",other:"om {0} timer"},past:{one:"for {0} time siden",other:"for {0} timer siden"}}},minute:{displayName:"minutt",relative:{0:"this minute"},relativeTime:{future:{one:"om {0} minutt",other:"om {0} minutter"},past:{one:"for {0} minutt siden",other:"for {0} minutter siden"}}},second:{displayName:"sekund",relative:{0:"now"},relativeTime:{future:{one:"om {0} sekund",other:"om {0} sekunder"},past:{one:"for {0} sekund siden",other:"for {0} sekunder siden"}}}}},{locale:"nnh",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"ngùʼ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"lyɛ̌ʼ",relative:{0:"lyɛ̌ʼɔɔn",1:"jǔɔ gẅie à ne ntóo","-1":"jǔɔ gẅie à ka tɔ̌g"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"fʉ̀ʼ nèm",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"no",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"nqo",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"nr",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"nso",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"nus",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Ruɔ̱n",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Pay",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Cäŋ",relative:{0:"Walɛ",1:"Ruun","-1":"Pan"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Thaak",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minit",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Thɛkɛni",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ny",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"nyn",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Omwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Omwezi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Eizooba",relative:{0:"Erizooba",1:"Nyenkyakare","-1":"Nyomwabazyo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Shaaha",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Edakiika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Obucweka/Esekendi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"om",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"om-KE",parentLocale:"om"},{locale:"or",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"os",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Аз",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Мӕй",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Бон",relative:{0:"Абон",1:"Сом",2:"Иннӕбон","-2":"Ӕндӕрӕбон","-1":"Знон"},relativeTime:{future:{one:"{0} боны фӕстӕ",other:"{0} боны фӕстӕ"},past:{one:"{0} бон раздӕр",other:"{0} боны размӕ"}}},hour:{displayName:"Сахат",relative:{0:"this hour"},relativeTime:{future:{one:"{0} сахаты фӕстӕ",other:"{0} сахаты фӕстӕ"},past:{one:"{0} сахаты размӕ",other:"{0} сахаты размӕ"}}},minute:{displayName:"Минут",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Секунд",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"os-RU",parentLocale:"os"},{locale:"pa",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"},fields:{year:{displayName:"ਸਾਲ",relative:{0:"ਇਹ ਸਾਲ",1:"ਅਗਲਾ ਸਾਲ","-1":"ਪਿਛਲਾ ਸਾਲ"},relativeTime:{future:{one:"{0} ਸਾਲ ਵਿੱਚ",other:"{0} ਸਾਲਾਂ ਵਿੱਚ"},past:{one:"{0} ਸਾਲ ਪਹਿਲਾਂ",other:"{0} ਸਾਲ ਪਹਿਲਾਂ"}}},month:{displayName:"ਮਹੀਨਾ",relative:{0:"ਇਹ ਮਹੀਨਾ",1:"ਅਗਲਾ ਮਹੀਨਾ","-1":"ਪਿਛਲਾ ਮਹੀਨਾ"},relativeTime:{future:{one:"{0} ਮਹੀਨੇ ਵਿੱਚ",other:"{0} ਮਹੀਨਿਆਂ ਵਿੱਚ"},past:{one:"{0} ਮਹੀਨਾ ਪਹਿਲਾਂ",other:"{0} ਮਹੀਨੇ ਪਹਿਲਾਂ"}}},day:{displayName:"ਦਿਨ",relative:{0:"ਅੱਜ",1:"ਭਲਕੇ","-1":"ਬੀਤਿਆ ਕੱਲ੍ਹ"},relativeTime:{future:{one:"{0} ਦਿਨ ਵਿੱਚ",other:"{0} ਦਿਨਾਂ ਵਿੱਚ"},past:{one:"{0} ਦਿਨ ਪਹਿਲਾਂ",other:"{0} ਦਿਨ ਪਹਿਲਾਂ"}}},hour:{displayName:"ਘੰਟਾ",relative:{0:"ਇਸ ਘੰਟੇ"},relativeTime:{future:{one:"{0} ਘੰਟੇ ਵਿੱਚ",other:"{0} ਘੰਟਿਆਂ ਵਿੱਚ"},past:{one:"{0} ਘੰਟਾ ਪਹਿਲਾਂ",other:"{0} ਘੰਟੇ ਪਹਿਲਾਂ"}}},minute:{displayName:"ਮਿੰਟ",relative:{0:"ਇਸ ਮਿੰਟ"},relativeTime:{future:{one:"{0} ਮਿੰਟ ਵਿੱਚ",other:"{0} ਮਿੰਟਾਂ ਵਿੱਚ"},past:{one:"{0} ਮਿੰਟ ਪਹਿਲਾਂ",other:"{0} ਮਿੰਟ ਪਹਿਲਾਂ"}}},second:{displayName:"ਸਕਿੰਟ",relative:{0:"ਹੁਣ"},relativeTime:{future:{one:"{0} ਸਕਿੰਟ ਵਿੱਚ",other:"{0} ਸਕਿੰਟਾਂ ਵਿੱਚ"},past:{one:"{0} ਸਕਿੰਟ ਪਹਿਲਾਂ",other:"{0} ਸਕਿੰਟ ਪਹਿਲਾਂ"}}}}},{locale:"pa-Arab",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"ورھا",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"مہينا",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"دئن",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"گھنٹا",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"منٹ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"pa-Guru",parentLocale:"pa"},{locale:"pap",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"pl",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=a.slice(-1),i=a.slice(-2);return t?"other":1==e&&n?"one":n&&o>=2&&o<=4&&(i<12||i>14)?"few":n&&1!=a&&(0==o||1==o)||n&&o>=5&&o<=9||n&&i>=12&&i<=14?"many":"other"},fields:{year:{displayName:"rok",relative:{0:"w tym roku",1:"w przyszłym roku","-1":"w zeszłym roku"},relativeTime:{future:{one:"za {0} rok",few:"za {0} lata",many:"za {0} lat",other:"za {0} roku"},past:{one:"{0} rok temu",few:"{0} lata temu",many:"{0} lat temu",other:"{0} roku temu"}}},month:{displayName:"miesiąc",relative:{0:"w tym miesiącu",1:"w przyszłym miesiącu","-1":"w zeszłym miesiącu"},relativeTime:{future:{one:"za {0} miesiąc",few:"za {0} miesiące",many:"za {0} miesięcy",other:"za {0} miesiąca"},past:{one:"{0} miesiąc temu",few:"{0} miesiące temu",many:"{0} miesięcy temu",other:"{0} miesiąca temu"}}},day:{displayName:"dzień",relative:{0:"dzisiaj",1:"jutro",2:"pojutrze","-2":"przedwczoraj","-1":"wczoraj"},relativeTime:{future:{one:"za {0} dzień",few:"za {0} dni",many:"za {0} dni",other:"za {0} dnia"},past:{one:"{0} dzień temu",few:"{0} dni temu",many:"{0} dni temu",other:"{0} dnia temu"}}},hour:{displayName:"godzina",relative:{0:"ta godzina"},relativeTime:{future:{one:"za {0} godzinę",few:"za {0} godziny",many:"za {0} godzin",other:"za {0} godziny"},past:{one:"{0} godzinę temu",few:"{0} godziny temu",many:"{0} godzin temu",other:"{0} godziny temu"}}},minute:{displayName:"minuta",relative:{0:"ta minuta"},relativeTime:{future:{one:"za {0} minutę",few:"za {0} minuty",many:"za {0} minut",other:"za {0} minuty"},past:{one:"{0} minutę temu",few:"{0} minuty temu",many:"{0} minut temu",other:"{0} minuty temu"}}},second:{displayName:"sekunda",relative:{0:"teraz"},relativeTime:{future:{one:"za {0} sekundę",few:"za {0} sekundy",many:"za {0} sekund",other:"za {0} sekundy"},past:{one:"{0} sekundę temu",few:"{0} sekundy temu",many:"{0} sekund temu",other:"{0} sekundy temu"}}}}},{locale:"prg",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[1]||"",n=a.length,o=Number(r[0])==e,i=o&&r[0].slice(-1),l=o&&r[0].slice(-2),s=a.slice(-2),u=a.slice(-1);return t?"other":o&&0==i||l>=11&&l<=19||2==n&&s>=11&&s<=19?"zero":1==i&&11!=l||2==n&&1==u&&11!=s||2!=n&&1==u?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ps",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"pt",pluralRuleFunction:function(e,t){var r=String(e).split(".")[0];return t?"other":0==r||1==r?"one":"other"},fields:{year:{displayName:"ano",relative:{0:"este ano",1:"próximo ano","-1":"ano passado"},relativeTime:{future:{one:"em {0} ano",other:"em {0} anos"},past:{one:"há {0} ano",other:"há {0} anos"}}},month:{displayName:"mês",relative:{0:"este mês",1:"próximo mês","-1":"mês passado"},relativeTime:{future:{one:"em {0} mês",other:"em {0} meses"},past:{one:"há {0} mês",other:"há {0} meses"}}},day:{displayName:"dia",relative:{0:"hoje",1:"amanhã",2:"depois de amanhã","-2":"anteontem","-1":"ontem"},relativeTime:{future:{one:"em {0} dia",other:"em {0} dias"},past:{one:"há {0} dia",other:"há {0} dias"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"em {0} hora",other:"em {0} horas"},past:{one:"há {0} hora",other:"há {0} horas"}}},minute:{displayName:"minuto",relative:{0:"este minuto"},relativeTime:{future:{one:"em {0} minuto",other:"em {0} minutos"},past:{one:"há {0} minuto",other:"há {0} minutos"}}},second:{displayName:"segundo",relative:{0:"agora"},relativeTime:{future:{one:"em {0} segundo",other:"em {0} segundos"},past:{one:"há {0} segundo",other:"há {0} segundos"}}}}},{locale:"pt-AO",parentLocale:"pt-PT"},{locale:"pt-PT",parentLocale:"pt",fields:{year:{displayName:"ano",relative:{0:"este ano",1:"próximo ano","-1":"ano passado"},relativeTime:{future:{one:"dentro de {0} ano",other:"dentro de {0} anos"},past:{one:"há {0} ano",other:"há {0} anos"}}},month:{displayName:"mês",relative:{0:"este mês",1:"próximo mês","-1":"mês passado"},relativeTime:{future:{one:"dentro de {0} mês",other:"dentro de {0} meses"},past:{one:"há {0} mês",other:"há {0} meses"}}},day:{displayName:"dia",relative:{0:"hoje",1:"amanhã",2:"depois de amanhã","-2":"anteontem","-1":"ontem"},relativeTime:{future:{one:"dentro de {0} dia",other:"dentro de {0} dias"},past:{one:"há {0} dia",other:"há {0} dias"}}},hour:{displayName:"hora",relative:{0:"esta hora"},relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"há {0} hora",other:"há {0} horas"}}},minute:{displayName:"minuto",relative:{0:"este minuto"},relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"há {0} minuto",other:"há {0} minutos"}}},second:{displayName:"segundo",relative:{0:"agora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"há {0} segundo",other:"há {0} segundos"}}}}},{locale:"pt-CH",parentLocale:"pt-PT"},{locale:"pt-CV",parentLocale:"pt-PT"},{locale:"pt-GQ",parentLocale:"pt-PT"},{locale:"pt-GW",parentLocale:"pt-PT"},{locale:"pt-LU",parentLocale:"pt-PT"},{locale:"pt-MO",parentLocale:"pt-PT"},{locale:"pt-MZ",parentLocale:"pt-PT"},{locale:"pt-ST",parentLocale:"pt-PT"},{locale:"pt-TL",parentLocale:"pt-PT"},{locale:"qu",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"qu-BO",parentLocale:"qu"},{locale:"qu-EC",parentLocale:"qu"},{locale:"rm",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"onn",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"mais",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Tag",relative:{0:"oz",1:"damaun",2:"puschmaun","-2":"stersas","-1":"ier"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"ura",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"minuta",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"secunda",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"rn",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Umwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Ukwezi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Umusi",relative:{0:"Uyu musi",1:"Ejo (hazoza)","-1":"Ejo (haheze)"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Isaha",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Umunota",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Isegonda",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ro",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1],n=Number(r[0])==e&&r[0].slice(-2);return t?1==e?"one":"other":1==e&&a?"one":!a||0==e||1!=e&&n>=1&&n<=19?"few":"other"},fields:{year:{displayName:"an",relative:{0:"anul acesta",1:"anul viitor","-1":"anul trecut"},relativeTime:{future:{one:"peste {0} an",few:"peste {0} ani",other:"peste {0} de ani"},past:{one:"acum {0} an",few:"acum {0} ani",other:"acum {0} de ani"}}},month:{displayName:"lună",relative:{0:"luna aceasta",1:"luna viitoare","-1":"luna trecută"},relativeTime:{future:{one:"peste {0} lună",few:"peste {0} luni",other:"peste {0} de luni"},past:{one:"acum {0} lună",few:"acum {0} luni",other:"acum {0} de luni"}}},day:{displayName:"zi",relative:{0:"azi",1:"mâine",2:"poimâine","-2":"alaltăieri","-1":"ieri"},relativeTime:{future:{one:"peste {0} zi",few:"peste {0} zile",other:"peste {0} de zile"},past:{one:"acum {0} zi",few:"acum {0} zile",other:"acum {0} de zile"}}},hour:{displayName:"oră",relative:{0:"ora aceasta"},relativeTime:{future:{one:"peste {0} oră",few:"peste {0} ore",other:"peste {0} de ore"},past:{one:"acum {0} oră",few:"acum {0} ore",other:"acum {0} de ore"}}},minute:{displayName:"minut",relative:{0:"minutul acesta"},relativeTime:{future:{one:"peste {0} minut",few:"peste {0} minute",other:"peste {0} de minute"},past:{one:"acum {0} minut",few:"acum {0} minute",other:"acum {0} de minute"}}},second:{displayName:"secundă",relative:{0:"acum"},relativeTime:{future:{one:"peste {0} secundă",few:"peste {0} secunde",other:"peste {0} de secunde"},past:{one:"acum {0} secundă",few:"acum {0} secunde",other:"acum {0} de secunde"}}}}},{locale:"ro-MD",parentLocale:"ro"},{locale:"rof",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Muaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mweri",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Mfiri",relative:{0:"Linu",1:"Ng’ama","-1":"Hiyo"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Isaa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Dakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ru",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=a.slice(-1),i=a.slice(-2);return t?"other":n&&1==o&&11!=i?"one":n&&o>=2&&o<=4&&(i<12||i>14)?"few":n&&0==o||n&&o>=5&&o<=9||n&&i>=11&&i<=14?"many":"other"},fields:{year:{displayName:"год",relative:{0:"в этом году",1:"в следующем году","-1":"в прошлом году"},relativeTime:{future:{one:"через {0} год",few:"через {0} года",many:"через {0} лет",other:"через {0} года"},past:{one:"{0} год назад",few:"{0} года назад",many:"{0} лет назад",other:"{0} года назад"}}},month:{displayName:"месяц",relative:{0:"в этом месяце",1:"в следующем месяце","-1":"в прошлом месяце"},relativeTime:{future:{one:"через {0} месяц",few:"через {0} месяца",many:"через {0} месяцев",other:"через {0} месяца"},past:{one:"{0} месяц назад",few:"{0} месяца назад",many:"{0} месяцев назад",other:"{0} месяца назад"}}},day:{displayName:"день",relative:{0:"сегодня",1:"завтра",2:"послезавтра","-2":"позавчера","-1":"вчера"},relativeTime:{future:{one:"через {0} день",few:"через {0} дня",many:"через {0} дней",other:"через {0} дня"},past:{one:"{0} день назад",few:"{0} дня назад",many:"{0} дней назад",other:"{0} дня назад"}}},hour:{displayName:"час",relative:{0:"в этом часе"},relativeTime:{future:{one:"через {0} час",few:"через {0} часа",many:"через {0} часов",other:"через {0} часа"},past:{one:"{0} час назад",few:"{0} часа назад",many:"{0} часов назад",other:"{0} часа назад"}}},minute:{displayName:"минута",relative:{0:"в эту минуту"},relativeTime:{future:{one:"через {0} минуту",few:"через {0} минуты",many:"через {0} минут",other:"через {0} минуты"},past:{one:"{0} минуту назад",few:"{0} минуты назад",many:"{0} минут назад",other:"{0} минуты назад"}}},second:{displayName:"секунда",relative:{0:"сейчас"},relativeTime:{future:{one:"через {0} секунду",few:"через {0} секунды",many:"через {0} секунд",other:"через {0} секунды"},past:{one:"{0} секунду назад",few:"{0} секунды назад",many:"{0} секунд назад",other:"{0} секунды назад"}}}}},{locale:"ru-BY",parentLocale:"ru"},{locale:"ru-KG",parentLocale:"ru"},{locale:"ru-KZ",parentLocale:"ru"},{locale:"ru-MD",parentLocale:"ru"},{locale:"ru-UA",parentLocale:"ru"},{locale:"rw",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"rwk",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Maka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mori",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Mfiri",relative:{0:"Inu",1:"Ngama","-1":"Ukou"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Dakyika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"sah",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Сыл",relative:{0:"быйыл",1:"эһиил","-1":"Былырыын"},relativeTime:{future:{other:"{0} сылынан"},past:{other:"{0} сыл ынараа өттүгэр"}}},month:{displayName:"Ый",relative:{0:"бу ый",1:"аныгыскы ый","-1":"ааспыт ый"},relativeTime:{future:{other:"{0} ыйынан"},past:{other:"{0} ый ынараа өттүгэр"}}},day:{displayName:"Күн",relative:{0:"Бүгүн",1:"Сарсын",2:"Өйүүн","-2":"Иллэрээ күн","-1":"Бэҕэһээ"},relativeTime:{future:{other:"{0} күнүнэн"},past:{other:"{0} күн ынараа өттүгэр"}}},hour:{displayName:"Чаас",relative:{0:"this hour"},relativeTime:{future:{other:"{0} чааһынан"},past:{other:"{0} чаас ынараа өттүгэр"}}},minute:{displayName:"Мүнүүтэ",relative:{0:"this minute"},relativeTime:{future:{other:"{0} мүнүүтэннэн"},past:{other:"{0} мүнүүтэ ынараа өттүгэр"}}},second:{displayName:"Сөкүүндэ",relative:{0:"билигин"},relativeTime:{future:{other:"{0} сөкүүндэннэн"},past:{other:"{0} сөкүүндэ ынараа өттүгэр"}}}}},{locale:"saq",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Lari",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Lapa",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Mpari",relative:{0:"Duo",1:"Taisere","-1":"Ng’ole"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Saai",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Idakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Isekondi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"sbp",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Mwakha",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mwesi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Lusiku",relative:{0:"Ineng’uni",1:"Pamulaawu","-1":"Imehe"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Ilisala",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Idakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Isekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"sdh",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"se",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"},fields:{year:{displayName:"jáhki",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"{0} jahki maŋŋilit",two:"{0} jahkki maŋŋilit",other:"{0} jahkki maŋŋilit"},past:{one:"{0} jahki árat",two:"{0} jahkki árat",other:"{0} jahkki árat"}}},month:{displayName:"mánnu",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"{0} mánotbadji maŋŋilit",two:"{0} mánotbadji maŋŋilit",other:"{0} mánotbadji maŋŋilit"},past:{one:"{0} mánotbadji árat",two:"{0} mánotbadji árat",other:"{0} mánotbadji árat"}}},day:{displayName:"beaivi",relative:{0:"odne",1:"ihttin",2:"paijeelittáá","-2":"oovdebpeivvi","-1":"ikte"},relativeTime:{future:{one:"{0} jándor maŋŋilit",two:"{0} jándor amaŋŋilit",other:"{0} jándora maŋŋilit"},past:{one:"{0} jándor árat",two:"{0} jándora árat",other:"{0} jándora árat"}}},hour:{displayName:"diibmu",relative:{0:"this hour"},relativeTime:{future:{one:"{0} diibmu maŋŋilit",two:"{0} diibmur maŋŋilit",other:"{0} diibmur maŋŋilit"},past:{one:"{0} diibmu árat",two:"{0} diibmur árat",other:"{0} diibmur árat"}}},minute:{displayName:"minuhtta",relative:{0:"this minute"},relativeTime:{future:{one:"{0} minuhta maŋŋilit",two:"{0} minuhtta maŋŋilit",other:"{0} minuhtta maŋŋilit"},past:{one:"{0} minuhta árat",two:"{0} minuhtta árat",other:"{0} minuhtta árat"}}},second:{displayName:"sekunda",relative:{0:"now"},relativeTime:{future:{one:"{0} sekunda maŋŋilit",two:"{0} sekundda maŋŋilit",other:"{0} sekundda maŋŋilit"},past:{one:"{0} sekunda árat",two:"{0} sekundda árat",other:"{0} sekundda árat"}}}}},{locale:"se-FI",parentLocale:"se",fields:{year:{displayName:"jahki",relative:{0:"dán jagi",1:"boahtte jagi","-1":"mannan jagi"},relativeTime:{future:{one:"{0} jagi siste",two:"{0} jagi siste",other:"{0} jagi siste"},past:{one:"{0} jagi árat",two:"{0} jagi árat",other:"{0} jagi árat"}}},month:{displayName:"mánnu",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"{0} mánotbadji maŋŋilit",two:"{0} mánotbadji maŋŋilit",other:"{0} mánotbadji maŋŋilit"},past:{one:"{0} mánotbadji árat",two:"{0} mánotbadji árat",other:"{0} mánotbadji árat"}}},day:{displayName:"beaivi",relative:{0:"odne",1:"ihttin",2:"paijeelittáá","-2":"oovdebpeivvi","-1":"ikte"},relativeTime:{future:{one:"{0} jándor maŋŋilit",two:"{0} jándor amaŋŋilit",other:"{0} jándora maŋŋilit"},past:{one:"{0} jándor árat",two:"{0} jándora árat",other:"{0} jándora árat"}}},hour:{displayName:"diibmu",relative:{0:"this hour"},relativeTime:{future:{one:"{0} diibmu maŋŋilit",two:"{0} diibmur maŋŋilit",other:"{0} diibmur maŋŋilit"},past:{one:"{0} diibmu árat",two:"{0} diibmur árat",other:"{0} diibmur árat"}}},minute:{displayName:"minuhtta",relative:{0:"this minute"},relativeTime:{future:{one:"{0} minuhta maŋŋilit",two:"{0} minuhtta maŋŋilit",other:"{0} minuhtta maŋŋilit"},past:{one:"{0} minuhta árat",two:"{0} minuhtta árat",other:"{0} minuhtta árat"}}},second:{displayName:"sekunda",relative:{0:"now"},relativeTime:{future:{one:"{0} sekunda maŋŋilit",two:"{0} sekundda maŋŋilit",other:"{0} sekundda maŋŋilit"},past:{one:"{0} sekunda árat",two:"{0} sekundda árat",other:"{0} sekundda árat"}}}}},{locale:"se-SE",parentLocale:"se"},{locale:"seh",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Chaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mwezi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ntsiku",relative:{0:"Lero",1:"Manguana","-1":"Zuro"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hora",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minuto",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Segundo",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ses",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Jiiri",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Handu",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Zaari",relative:{0:"Hõo",1:"Suba","-1":"Bi"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Guuru",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Miniti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Miti",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"sg",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Ngû",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Nze",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Lâ",relative:{0:"Lâsô",1:"Kêkerêke","-1":"Bîrï"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Ngbonga",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Ndurü ngbonga",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Nzîna ngbonga",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"sh",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=a.slice(-2),s=n.slice(-1),u=n.slice(-2);return t?"other":o&&1==i&&11!=l||1==s&&11!=u?"one":o&&i>=2&&i<=4&&(l<12||l>14)||s>=2&&s<=4&&(u<12||u>14)?"few":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"shi",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e;return t?"other":e>=0&&e<=1?"one":a&&e>=2&&e<=10?"few":"other"},fields:{year:{displayName:"ⴰⵙⴳⴳⵯⴰⵙ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"ⴰⵢⵢⵓⵔ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"ⴰⵙⵙ",relative:{0:"ⴰⵙⵙⴰ",1:"ⴰⵙⴽⴽⴰ","-1":"ⵉⴹⵍⵍⵉ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"ⵜⴰⵙⵔⴰⴳⵜ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"ⵜⵓⵙⴷⵉⴷⵜ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"ⵜⴰⵙⵉⵏⵜ",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"shi-Latn",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"asggʷas",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"ayyur",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"ass",relative:{0:"assa",1:"askka","-1":"iḍlli"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"tasragt",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"tusdidt",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"tasint",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"shi-Tfng",parentLocale:"shi"},{locale:"si",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"";return t?"other":0==e||1==e||0==a&&1==n?"one":"other"},fields:{year:{displayName:"වර්ෂය",relative:{0:"මෙම වසර",1:"ඊළඟ වසර","-1":"පසුගිය වසර"},relativeTime:{future:{one:"වසර {0}කින්",other:"වසර {0}කින්"},past:{one:"වසර {0}කට පෙර",other:"වසර {0}කට පෙර"}}},month:{displayName:"මාසය",relative:{0:"මෙම මාසය",1:"ඊළඟ මාසය","-1":"පසුගිය මාසය"},relativeTime:{future:{one:"මාස {0}කින්",other:"මාස {0}කින්"},past:{one:"මාස {0}කට පෙර",other:"මාස {0}කට පෙර"}}},day:{displayName:"දිනය",relative:{0:"අද",1:"හෙට",2:"අනිද්දා","-2":"පෙරේදා","-1":"ඊයේ"},relativeTime:{future:{one:"දින {0}න්",other:"දින {0}න්"},past:{one:"දින {0}කට පෙර",other:"දින {0}කට පෙර"}}},hour:{displayName:"පැය",relative:{0:"මෙම පැය"},relativeTime:{future:{one:"පැය {0}කින්",other:"පැය {0}කින්"},past:{one:"පැය {0}කට පෙර",other:"පැය {0}කට පෙර"}}},minute:{displayName:"මිනිත්තුව",relative:{0:"මෙම මිනිත්තුව"},relativeTime:{future:{one:"මිනිත්තු {0}කින්",other:"මිනිත්තු {0}කින්"},past:{one:"මිනිත්තු {0}කට පෙර",other:"මිනිත්තු {0}කට පෙර"}}},second:{displayName:"තත්පරය",relative:{0:"දැන්"},relativeTime:{future:{one:"තත්පර {0}කින්",other:"තත්පර {0}කින්"},past:{one:"තත්පර {0}කට පෙර",other:"තත්පර {0}කට පෙර"}}}}},{locale:"sk",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1];return t?"other":1==e&&n?"one":a>=2&&a<=4&&n?"few":n?"other":"many"},fields:{year:{displayName:"rok",relative:{0:"tento rok",1:"budúci rok","-1":"minulý rok"},relativeTime:{future:{one:"o {0} rok",few:"o {0} roky",many:"o {0} roka",other:"o {0} rokov"},past:{one:"pred {0} rokom",few:"pred {0} rokmi",many:"pred {0} roka",other:"pred {0} rokmi"}}},month:{displayName:"mesiac",relative:{0:"tento mesiac",1:"budúci mesiac","-1":"minulý mesiac"},relativeTime:{future:{one:"o {0} mesiac",few:"o {0} mesiace",many:"o {0} mesiaca",other:"o {0} mesiacov"},past:{one:"pred {0} mesiacom",few:"pred {0} mesiacmi",many:"pred {0} mesiaca",other:"pred {0} mesiacmi"}}},day:{displayName:"deň",relative:{0:"dnes",1:"zajtra",2:"pozajtra","-2":"predvčerom","-1":"včera"},relativeTime:{future:{one:"o {0} deň",few:"o {0} dni",many:"o {0} dňa",other:"o {0} dní"},past:{one:"pred {0} dňom",few:"pred {0} dňami",many:"pred {0} dňa",other:"pred {0} dňami"}}},hour:{displayName:"hodina",relative:{0:"v tejto hodine"},relativeTime:{future:{one:"o {0} hodinu",few:"o {0} hodiny",many:"o {0} hodiny",other:"o {0} hodín"},past:{one:"pred {0} hodinou",few:"pred {0} hodinami",many:"pred {0} hodinou",other:"pred {0} hodinami"}}},minute:{displayName:"minúta",relative:{0:"v tejto minúte"},relativeTime:{future:{one:"o {0} minútu",few:"o {0} minúty",many:"o {0} minúty",other:"o {0} minút"},past:{one:"pred {0} minútou",few:"pred {0} minútami",many:"pred {0} minúty",other:"pred {0} minútami"}}},second:{displayName:"sekunda",relative:{0:"teraz"},relativeTime:{future:{one:"o {0} sekundu",few:"o {0} sekundy",many:"o {0} sekundy",other:"o {0} sekúnd"},past:{one:"pred {0} sekundou",few:"pred {0} sekundami",many:"pred {0} sekundy",other:"pred {0} sekundami"}}}}},{locale:"sl",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=a.slice(-2);return t?"other":n&&1==o?"one":n&&2==o?"two":n&&(3==o||4==o)||!n?"few":"other"},fields:{year:{displayName:"leto",relative:{0:"letos",1:"naslednje leto","-1":"lani"},relativeTime:{future:{one:"čez {0} leto",two:"čez {0} leti",few:"čez {0} leta",other:"čez {0} let"},past:{one:"pred {0} letom",two:"pred {0} letoma",few:"pred {0} leti",other:"pred {0} leti"}}},month:{displayName:"mesec",relative:{0:"ta mesec",1:"naslednji mesec","-1":"prejšnji mesec"},relativeTime:{future:{one:"čez {0} mesec",two:"čez {0} meseca",few:"čez {0} mesece",other:"čez {0} mesecev"},past:{one:"pred {0} mesecem",two:"pred {0} mesecema",few:"pred {0} meseci",other:"pred {0} meseci"}}},day:{displayName:"dan",relative:{0:"danes",1:"jutri",2:"pojutrišnjem","-2":"predvčerajšnjim","-1":"včeraj"},relativeTime:{future:{one:"čez {0} dan",two:"čez {0} dneva",few:"čez {0} dni",other:"čez {0} dni"},past:{one:"pred {0} dnevom",two:"pred {0} dnevoma",few:"pred {0} dnevi",other:"pred {0} dnevi"}}},hour:{displayName:"ura",relative:{0:"v tej uri"},relativeTime:{future:{one:"čez {0} uro",two:"čez {0} uri",few:"čez {0} ure",other:"čez {0} ur"},past:{one:"pred {0} uro",two:"pred {0} urama",few:"pred {0} urami",other:"pred {0} urami"}}},minute:{displayName:"minuta",relative:{0:"to minuto"},relativeTime:{future:{one:"čez {0} minuto",two:"čez {0} minuti",few:"čez {0} minute",other:"čez {0} minut"},past:{one:"pred {0} minuto",two:"pred {0} minutama",few:"pred {0} minutami",other:"pred {0} minutami"}}},second:{displayName:"sekunda",relative:{0:"zdaj"},relativeTime:{future:{one:"čez {0} sekundo",two:"čez {0} sekundi",few:"čez {0} sekunde",other:"čez {0} sekund"},past:{one:"pred {0} sekundo",two:"pred {0} sekundama",few:"pred {0} sekundami",other:"pred {0} sekundami"}}}}},{locale:"sma",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"smi",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"smj",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"smn",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"sms",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"sn",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Gore",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mwedzi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Zuva",relative:{0:"Nhasi",1:"Mangwana","-1":"Nezuro"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Awa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Mineti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekondi",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"so",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"+{0} y",other:"+{0} y"},past:{one:"-{0} y",other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"+{0} m",other:"+{0} m"},past:{one:"-{0} m",other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"Maanta",1:"Berri","-1":"Shalay"},relativeTime:{future:{one:"+{0} d",other:"+{0} d"},past:{one:"-{0} d",other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{one:"+{0} h",other:"+{0} h"},past:{one:"-{0} h",other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{one:"+{0} min",other:"+{0} min"},past:{one:"-{0} min",other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{one:"+{0} s",other:"+{0} s"},past:{one:"-{0} s",other:"-{0} s"}}}}},{locale:"so-DJ",parentLocale:"so"},{locale:"so-ET",parentLocale:"so"},{locale:"so-KE",parentLocale:"so"},{locale:"sq",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e,n=a&&r[0].slice(-1),o=a&&r[0].slice(-2);return t?1==e?"one":4==n&&14!=o?"many":"other":1==e?"one":"other"},fields:{year:{displayName:"vit",relative:{0:"këtë vit",1:"vitin e ardhshëm","-1":"vitin e kaluar"},relativeTime:{future:{one:"pas {0} viti",other:"pas {0} vjetësh"},past:{one:"{0} vit më parë",other:"{0} vjet më parë"}}},month:{displayName:"muaj",relative:{0:"këtë muaj",1:"muajin e ardhshëm","-1":"muajin e kaluar"},relativeTime:{future:{one:"pas {0} muaji",other:"pas {0} muajsh"},past:{one:"{0} muaj më parë",other:"{0} muaj më parë"}}},day:{displayName:"ditë",relative:{0:"sot",1:"nesër","-1":"dje"},relativeTime:{future:{one:"pas {0} dite",other:"pas {0} ditësh"},past:{one:"{0} ditë më parë",other:"{0} ditë më parë"}}},hour:{displayName:"orë",relative:{0:"këtë orë"},relativeTime:{future:{one:"pas {0} ore",other:"pas {0} orësh"},past:{one:"{0} orë më parë",other:"{0} orë më parë"}}},minute:{displayName:"minutë",relative:{0:"këtë minutë"},relativeTime:{future:{one:"pas {0} minute",other:"pas {0} minutash"},past:{one:"{0} minutë më parë",other:"{0} minuta më parë"}}},second:{displayName:"sekondë",relative:{0:"tani"},relativeTime:{future:{one:"pas {0} sekonde",other:"pas {0} sekondash"},past:{one:"{0} sekondë më parë",other:"{0} sekonda më parë"}}}}},{locale:"sq-MK",parentLocale:"sq"},{locale:"sq-XK",parentLocale:"sq"},{locale:"sr",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=a.slice(-2),s=n.slice(-1),u=n.slice(-2);return t?"other":o&&1==i&&11!=l||1==s&&11!=u?"one":o&&i>=2&&i<=4&&(l<12||l>14)||s>=2&&s<=4&&(u<12||u>14)?"few":"other"},fields:{year:{displayName:"година",relative:{0:"ове године",1:"следеће године","-1":"прошле године"},relativeTime:{future:{one:"за {0} годину",few:"за {0} године",other:"за {0} година"},past:{one:"пре {0} године",few:"пре {0} године",other:"пре {0} година"}}},month:{displayName:"месец",relative:{0:"овог месеца",1:"следећег месеца","-1":"прошлог месеца"},relativeTime:{future:{one:"за {0} месец",few:"за {0} месеца",other:"за {0} месеци"},past:{one:"пре {0} месеца",few:"пре {0} месеца",other:"пре {0} месеци"}}},day:{displayName:"дан",relative:{0:"данас",1:"сутра",2:"прекосутра","-2":"прекјуче","-1":"јуче"},relativeTime:{future:{one:"за {0} дан",few:"за {0} дана",other:"за {0} дана"},past:{one:"пре {0} дана",few:"пре {0} дана",other:"пре {0} дана"}}},hour:{displayName:"сат",relative:{0:"овог сата"},relativeTime:{future:{one:"за {0} сат",few:"за {0} сата",other:"за {0} сати"},past:{one:"пре {0} сата",few:"пре {0} сата",other:"пре {0} сати"}}},minute:{displayName:"минут",relative:{0:"овог минута"},relativeTime:{future:{one:"за {0} минут",few:"за {0} минута",other:"за {0} минута"},past:{one:"пре {0} минута",few:"пре {0} минута",other:"пре {0} минута"}}},second:{displayName:"секунд",relative:{0:"сада"},relativeTime:{future:{one:"за {0} секунду",few:"за {0} секунде",other:"за {0} секунди"},past:{one:"пре {0} секунде",few:"пре {0} секунде",other:"пре {0} секунди"}}}}},{locale:"sr-Cyrl",parentLocale:"sr"},{locale:"sr-Cyrl-BA",parentLocale:"sr-Cyrl"},{locale:"sr-Cyrl-ME",parentLocale:"sr-Cyrl"},{locale:"sr-Cyrl-XK",parentLocale:"sr-Cyrl"},{locale:"sr-Latn",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"godina",relative:{0:"ove godine",1:"sledeće godine","-1":"prošle godine"},relativeTime:{future:{one:"za {0} godinu",few:"za {0} godine",other:"za {0} godina"},past:{one:"pre {0} godine",few:"pre {0} godine",other:"pre {0} godina"}}},month:{displayName:"mesec",relative:{0:"ovog meseca",1:"sledećeg meseca","-1":"prošlog meseca"},relativeTime:{future:{one:"za {0} mesec",few:"za {0} meseca",other:"za {0} meseci"},past:{one:"pre {0} meseca",few:"pre {0} meseca",other:"pre {0} meseci"}}},day:{displayName:"dan",relative:{0:"danas",1:"sutra",2:"prekosutra","-2":"prekjuče","-1":"juče"},relativeTime:{future:{one:"za {0} dan",few:"za {0} dana",other:"za {0} dana"},past:{one:"pre {0} dana",few:"pre {0} dana",other:"pre {0} dana"}}},hour:{displayName:"sat",relative:{0:"ovog sata"},relativeTime:{future:{one:"za {0} sat",few:"za {0} sata",other:"za {0} sati"},past:{one:"pre {0} sata",few:"pre {0} sata",other:"pre {0} sati"}}},minute:{displayName:"minut",relative:{0:"ovog minuta"},relativeTime:{future:{one:"za {0} minut",few:"za {0} minuta",other:"za {0} minuta"},past:{one:"pre {0} minuta",few:"pre {0} minuta",other:"pre {0} minuta"}}},second:{displayName:"sekund",relative:{0:"sada"},relativeTime:{future:{one:"za {0} sekundu",few:"za {0} sekunde",other:"za {0} sekundi"},past:{one:"pre {0} sekunde",few:"pre {0} sekunde",other:"pre {0} sekundi"}}}}},{locale:"sr-Latn-BA",parentLocale:"sr-Latn"},{locale:"sr-Latn-ME",parentLocale:"sr-Latn"},{locale:"sr-Latn-XK",parentLocale:"sr-Latn"},{locale:"ss",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ssy",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"st",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"sv",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1],n=Number(r[0])==e,o=n&&r[0].slice(-1),i=n&&r[0].slice(-2);return t?1!=o&&2!=o||11==i||12==i?"other":"one":1==e&&a?"one":"other"},fields:{year:{displayName:"år",relative:{0:"i år",1:"nästa år","-1":"i fjol"},relativeTime:{future:{one:"om {0} år",other:"om {0} år"},past:{one:"för {0} år sedan",other:"för {0} år sedan"}}},month:{displayName:"månad",relative:{0:"denna månad",1:"nästa månad","-1":"förra månaden"},relativeTime:{future:{one:"om {0} månad",other:"om {0} månader"},past:{one:"för {0} månad sedan",other:"för {0} månader sedan"}}},day:{displayName:"dag",relative:{0:"i dag",1:"i morgon",2:"i övermorgon","-2":"i förrgår","-1":"i går"},relativeTime:{future:{one:"om {0} dag",other:"om {0} dagar"},past:{one:"för {0} dag sedan",other:"för {0} dagar sedan"}}},hour:{displayName:"timme",relative:{0:"denna timme"},relativeTime:{future:{one:"om {0} timme",other:"om {0} timmar"},past:{one:"för {0} timme sedan",other:"för {0} timmar sedan"}}},minute:{displayName:"minut",relative:{0:"denna minut"},relativeTime:{future:{one:"om {0} minut",other:"om {0} minuter"},past:{one:"för {0} minut sedan",other:"för {0} minuter sedan"}}},second:{displayName:"sekund",relative:{0:"nu"},relativeTime:{future:{one:"om {0} sekund",other:"om {0} sekunder"},past:{one:"för {0} sekund sedan",other:"för {0} sekunder sedan"}}}}},{locale:"sv-AX",parentLocale:"sv"},{locale:"sv-FI",parentLocale:"sv"},{locale:"sw",pluralRuleFunction:function(e,t){var r=!String(e).split(".")[1];return t?"other":1==e&&r?"one":"other"},fields:{year:{displayName:"mwaka",relative:{0:"mwaka huu",1:"mwaka ujao","-1":"mwaka uliopita"},relativeTime:{future:{one:"baada ya mwaka {0}",other:"baada ya miaka {0}"},past:{one:"mwaka {0} uliopita",other:"miaka {0} iliyopita"}}},month:{displayName:"mwezi",relative:{0:"mwezi huu",1:"mwezi ujao","-1":"mwezi uliopita"},relativeTime:{future:{one:"baada ya mwezi {0}",other:"baada ya miezi {0}"},past:{one:"mwezi {0} uliopita",other:"miezi {0} iliyopita"}}},day:{displayName:"siku",relative:{0:"leo",1:"kesho",2:"kesho kutwa","-2":"juzi","-1":"jana"},relativeTime:{future:{one:"baada ya siku {0}",other:"baada ya siku {0}"},past:{one:"siku {0} iliyopita",other:"siku {0} zilizopita"}}},hour:{displayName:"saa",relative:{0:"saa hii"},relativeTime:{future:{one:"baada ya saa {0}",other:"baada ya saa {0}"},past:{one:"saa {0} iliyopita",other:"saa {0} zilizopita"}}},minute:{displayName:"dakika",relative:{0:"dakika hii"},relativeTime:{future:{one:"baada ya dakika {0}",other:"baada ya dakika {0}"},past:{one:"dakika {0} iliyopita",other:"dakika {0} zilizopita"}}},second:{displayName:"sekunde",relative:{0:"sasa hivi"},relativeTime:{future:{one:"baada ya sekunde {0}",other:"baada ya sekunde {0}"},past:{one:"Sekunde {0} iliyopita",other:"Sekunde {0} zilizopita"}}}}},{locale:"sw-CD",parentLocale:"sw"},{locale:"sw-KE",parentLocale:"sw"},{locale:"sw-UG",parentLocale:"sw"},{locale:"syr",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ta",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"ஆண்டு",relative:{0:"இந்த ஆண்டு",1:"அடுத்த ஆண்டு","-1":"கடந்த ஆண்டு"},relativeTime:{future:{one:"{0} ஆண்டில்",other:"{0} ஆண்டுகளில்"},past:{one:"{0} ஆண்டிற்கு முன்",other:"{0} ஆண்டுகளுக்கு முன்"}}},month:{displayName:"மாதம்",relative:{0:"இந்த மாதம்",1:"அடுத்த மாதம்","-1":"கடந்த மாதம்"},relativeTime:{future:{one:"{0} மாதத்தில்",other:"{0} மாதங்களில்"},past:{one:"{0} மாதத்துக்கு முன்",other:"{0} மாதங்களுக்கு முன்"}}},day:{displayName:"நாள்",relative:{0:"இன்று",1:"நாளை",2:"நாளை மறுநாள்","-2":"நேற்று முன் தினம்","-1":"நேற்று"},relativeTime:{future:{one:"{0} நாளில்",other:"{0} நாட்களில்"},past:{one:"{0} நாளுக்கு முன்",other:"{0} நாட்களுக்கு முன்"}}},hour:{displayName:"மணி",relative:{0:"இந்த ஒரு மணிநேரத்தில்"},relativeTime:{future:{one:"{0} மணிநேரத்தில்",other:"{0} மணிநேரத்தில்"},past:{one:"{0} மணிநேரம் முன்",other:"{0} மணிநேரம் முன்"}}},minute:{displayName:"நிமிடம்",relative:{0:"இந்த ஒரு நிமிடத்தில்"},relativeTime:{future:{one:"{0} நிமிடத்தில்",other:"{0} நிமிடங்களில்"},past:{one:"{0} நிமிடத்திற்கு முன்",other:"{0} நிமிடங்களுக்கு முன்"}}},second:{displayName:"விநாடி",relative:{0:"இப்போது"},relativeTime:{future:{one:"{0} விநாடியில்",other:"{0} விநாடிகளில்"},past:{one:"{0} விநாடிக்கு முன்",other:"{0} விநாடிகளுக்கு முன்"}}}}},{locale:"ta-LK",parentLocale:"ta"},{locale:"ta-MY",parentLocale:"ta"},{locale:"ta-SG",parentLocale:"ta"},{locale:"te",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"సంవత్సరం",relative:{0:"ఈ సంవత్సరం",1:"తదుపరి సంవత్సరం","-1":"గత సంవత్సరం"},relativeTime:{future:{one:"{0} సంవత్సరంలో",other:"{0} సంవత్సరాల్లో"},past:{one:"{0} సంవత్సరం క్రితం",other:"{0} సంవత్సరాల క్రితం"}}},month:{displayName:"నెల",relative:{0:"ఈ నెల",1:"తదుపరి నెల","-1":"గత నెల"},relativeTime:{future:{one:"{0} నెలలో",other:"{0} నెలల్లో"},past:{one:"{0} నెల క్రితం",other:"{0} నెలల క్రితం"}}},day:{displayName:"దినం",relative:{0:"ఈ రోజు",1:"రేపు",2:"ఎల్లుండి","-2":"మొన్న","-1":"నిన్న"},relativeTime:{future:{one:"{0} రోజులో",other:"{0} రోజుల్లో"},past:{one:"{0} రోజు క్రితం",other:"{0} రోజుల క్రితం"}}},hour:{displayName:"గంట",relative:{0:"ఈ గంట"},relativeTime:{future:{one:"{0} గంటలో",other:"{0} గంటల్లో"},past:{one:"{0} గంట క్రితం",other:"{0} గంటల క్రితం"}}},minute:{displayName:"నిమిషము",relative:{0:"ఈ నిమిషం"},relativeTime:{future:{one:"{0} నిమిషంలో",other:"{0} నిమిషాల్లో"},past:{one:"{0} నిమిషం క్రితం",other:"{0} నిమిషాల క్రితం"}}},second:{displayName:"సెకను",relative:{0:"ప్రస్తుతం"},relativeTime:{future:{one:"{0} సెకనులో",other:"{0} సెకన్లలో"},past:{one:"{0} సెకను క్రితం",other:"{0} సెకన్ల క్రితం"}}}}},{locale:"teo",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Ekan",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Elap",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Aparan",relative:{0:"Lolo",1:"Moi","-1":"Jaan"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Esaa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Idakika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Isekonde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"teo-KE",parentLocale:"teo"},{locale:"th",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"ปี",relative:{0:"ปีนี้",1:"ปีหน้า","-1":"ปีที่แล้ว"},relativeTime:{future:{other:"ในอีก {0} ปี"},past:{other:"{0} ปีที่แล้ว"}}},month:{displayName:"เดือน",relative:{0:"เดือนนี้",1:"เดือนหน้า","-1":"เดือนที่แล้ว"},relativeTime:{future:{other:"ในอีก {0} เดือน"},past:{other:"{0} เดือนที่ผ่านมา"}}},day:{displayName:"วัน",relative:{0:"วันนี้",1:"พรุ่งนี้",2:"มะรืนนี้","-2":"เมื่อวานซืน","-1":"เมื่อวาน"},relativeTime:{future:{other:"ในอีก {0} วัน"},past:{other:"{0} วันที่ผ่านมา"}}},hour:{displayName:"ชั่วโมง",relative:{0:"ชั่วโมงนี้"},relativeTime:{future:{other:"ในอีก {0} ชั่วโมง"},past:{other:"{0} ชั่วโมงที่ผ่านมา"}}},minute:{displayName:"นาที",relative:{0:"นาทีนี้"},relativeTime:{future:{other:"ในอีก {0} นาที"},past:{other:"{0} นาทีที่ผ่านมา"}}},second:{displayName:"วินาที",relative:{0:"ขณะนี้"},relativeTime:{future:{other:"ในอีก {0} วินาที"},past:{other:"{0} วินาทีที่ผ่านมา"}}}}},{locale:"ti",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ti-ER",parentLocale:"ti"},{locale:"tig",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"tk",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"ýyl",relative:{0:"şu ýyl",1:"indiki ýyl","-1":"geçen ýyl"},relativeTime:{future:{one:"{0} ýyldan",other:"{0} ýyldan"},past:{one:"{0} ýyl öň",other:"{0} ýyl öň"}}},month:{displayName:"aý",relative:{0:"şu aý",1:"indiki aý","-1":"geçen aý"},relativeTime:{future:{one:"{0} aýdan",other:"{0} aýdan"},past:{one:"{0} aý öň",other:"{0} aý öň"}}},day:{displayName:"gün",relative:{0:"şu gün",1:"ertir","-1":"düýn"},relativeTime:{future:{one:"{0} günden",other:"{0} günden"},past:{one:"{0} gün öň",other:"{0} gün öň"}}},hour:{displayName:"sagat",relative:{0:"this hour"},relativeTime:{future:{one:"{0} sagatdan",other:"{0} sagatdan"},past:{one:"{0} sagat öň",other:"{0} sagat öň"}}},minute:{displayName:"minut",relative:{0:"this minute"},relativeTime:{future:{one:"{0} minutdan",other:"{0} minutdan"},past:{one:"{0} minut öň",other:"{0} minut öň"}}},second:{displayName:"sekunt",relative:{0:"now"},relativeTime:{future:{one:"{0} sekuntdan",other:"{0} sekuntdan"},past:{one:"{0} sekunt öň",other:"{0} sekunt öň"}}}}},{locale:"tl",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=n.slice(-1);return t?1==e?"one":"other":o&&(1==a||2==a||3==a)||o&&4!=i&&6!=i&&9!=i||!o&&4!=l&&6!=l&&9!=l?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"tn",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"to",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"taʻu",relative:{0:"taʻú ni",1:"taʻu kahaʻu","-1":"taʻu kuoʻosi"},relativeTime:{future:{other:"ʻi he taʻu ʻe {0}"},past:{other:"taʻu ʻe {0} kuoʻosi"}}},month:{displayName:"māhina",relative:{0:"māhiná ni",1:"māhina kahaʻu","-1":"māhina kuoʻosi"},relativeTime:{future:{other:"ʻi he māhina ʻe {0}"},past:{other:"māhina ʻe {0} kuoʻosi"}}},day:{displayName:"ʻaho",relative:{0:"ʻahó ni",1:"ʻapongipongi",2:"ʻahepongipongi","-2":"ʻaneheafi","-1":"ʻaneafi"},relativeTime:{future:{other:"ʻi he ʻaho ʻe {0}"},past:{other:"ʻaho ʻe {0} kuoʻosi"}}},hour:{displayName:"houa",relative:{0:"this hour"},relativeTime:{future:{other:"ʻi he houa ʻe {0}"},past:{other:"houa ʻe {0} kuoʻosi"}}},minute:{displayName:"miniti",relative:{0:"this minute"},relativeTime:{future:{other:"ʻi he miniti ʻe {0}"},past:{other:"miniti ʻe {0} kuoʻosi"}}},second:{displayName:"sekoni",relative:{0:"taimí ni"},relativeTime:{future:{other:"ʻi he sekoni ʻe {0}"},past:{other:"sekoni ʻe {0} kuoʻosi"}}}}},{locale:"tr",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"yıl",relative:{0:"bu yıl",1:"gelecek yıl","-1":"geçen yıl"},relativeTime:{future:{one:"{0} yıl sonra",other:"{0} yıl sonra"},past:{one:"{0} yıl önce",other:"{0} yıl önce"}}},month:{displayName:"ay",relative:{0:"bu ay",1:"gelecek ay","-1":"geçen ay"},relativeTime:{future:{one:"{0} ay sonra",other:"{0} ay sonra"},past:{one:"{0} ay önce",other:"{0} ay önce"}}},day:{displayName:"gün",relative:{0:"bugün",1:"yarın",2:"öbür gün","-2":"evvelsi gün","-1":"dün"},relativeTime:{future:{one:"{0} gün sonra",other:"{0} gün sonra"},past:{one:"{0} gün önce",other:"{0} gün önce"}}},hour:{displayName:"saat",relative:{0:"bu saat"},relativeTime:{future:{one:"{0} saat sonra",other:"{0} saat sonra"},past:{one:"{0} saat önce",other:"{0} saat önce"}}},minute:{displayName:"dakika",relative:{0:"bu dakika"},relativeTime:{future:{one:"{0} dakika sonra",other:"{0} dakika sonra"},past:{one:"{0} dakika önce",other:"{0} dakika önce"}}},second:{displayName:"saniye",relative:{0:"şimdi"},relativeTime:{future:{one:"{0} saniye sonra",other:"{0} saniye sonra"},past:{one:"{0} saniye önce",other:"{0} saniye önce"}}}}},{locale:"tr-CY",parentLocale:"tr"},{locale:"ts",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"twq",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Jiiri",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Handu",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Zaari",relative:{0:"Hõo",1:"Suba","-1":"Bi"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Guuru",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Miniti",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Miti",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"tzm",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e;return t?"other":0==e||1==e||a&&e>=11&&e<=99?"one":"other"},fields:{year:{displayName:"Asseggas",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Ayur",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ass",relative:{0:"Assa",1:"Asekka","-1":"Assenaṭ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Tasragt",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Tusdat",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Tusnat",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"ug",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"يىل",relative:{0:"بۇ يىل",1:"كېلەر يىل","-1":"ئۆتكەن يىل"},relativeTime:{future:{one:"{0} يىلدىن كېيىن",other:"{0} يىلدىن كېيىن"},past:{one:"{0} يىل ئىلگىرى",other:"{0} يىل ئىلگىرى"}}},month:{displayName:"ئاي",relative:{0:"بۇ ئاي",1:"كېلەر ئاي","-1":"ئۆتكەن ئاي"},relativeTime:{future:{one:"{0} ئايدىن كېيىن",other:"{0} ئايدىن كېيىن"},past:{one:"{0} ئاي ئىلگىرى",other:"{0} ئاي ئىلگىرى"}}},day:{displayName:"كۈن",relative:{0:"بۈگۈن",1:"ئەتە","-1":"تۈنۈگۈن"},relativeTime:{future:{one:"{0} كۈندىن كېيىن",other:"{0} كۈندىن كېيىن"},past:{one:"{0} كۈن ئىلگىرى",other:"{0} كۈن ئىلگىرى"}}},hour:{displayName:"سائەت",relative:{0:"this hour"},relativeTime:{future:{one:"{0} سائەتتىن كېيىن",other:"{0} سائەتتىن كېيىن"},past:{one:"{0} سائەت ئىلگىرى",other:"{0} سائەت ئىلگىرى"}}},minute:{displayName:"مىنۇت",relative:{0:"this minute"},relativeTime:{future:{one:"{0} مىنۇتتىن كېيىن",other:"{0} مىنۇتتىن كېيىن"},past:{one:"{0} مىنۇت ئىلگىرى",other:"{0} مىنۇت ئىلگىرى"}}},second:{displayName:"سېكۇنت",relative:{0:"now"},relativeTime:{future:{one:"{0} سېكۇنتتىن كېيىن",other:"{0} سېكۇنتتىن كېيىن"},past:{one:"{0} سېكۇنت ئىلگىرى",other:"{0} سېكۇنت ئىلگىرى"}}}}},{locale:"uk",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=Number(r[0])==e,i=o&&r[0].slice(-1),l=o&&r[0].slice(-2),s=a.slice(-1),u=a.slice(-2);return t?3==i&&13!=l?"few":"other":n&&1==s&&11!=u?"one":n&&s>=2&&s<=4&&(u<12||u>14)?"few":n&&0==s||n&&s>=5&&s<=9||n&&u>=11&&u<=14?"many":"other"},fields:{year:{displayName:"рік",relative:{0:"цього року",1:"наступного року","-1":"торік"},relativeTime:{future:{one:"через {0} рік",few:"через {0} роки",many:"через {0} років",other:"через {0} року"},past:{one:"{0} рік тому",few:"{0} роки тому",many:"{0} років тому",other:"{0} року тому"}}},month:{displayName:"місяць",relative:{0:"цього місяця",1:"наступного місяця","-1":"минулого місяця"},relativeTime:{future:{one:"через {0} місяць",few:"через {0} місяці",many:"через {0} місяців",other:"через {0} місяця"},past:{one:"{0} місяць тому",few:"{0} місяці тому",many:"{0} місяців тому",other:"{0} місяця тому"}}},day:{displayName:"день",relative:{0:"сьогодні",1:"завтра",2:"післязавтра","-2":"позавчора","-1":"учора"},relativeTime:{future:{one:"через {0} день",few:"через {0} дні",many:"через {0} днів",other:"через {0} дня"},past:{one:"{0} день тому",few:"{0} дні тому",many:"{0} днів тому",other:"{0} дня тому"}}},hour:{displayName:"година",relative:{0:"цієї години"},relativeTime:{future:{one:"через {0} годину",few:"через {0} години",many:"через {0} годин",other:"через {0} години"},past:{one:"{0} годину тому",few:"{0} години тому",many:"{0} годин тому",other:"{0} години тому"}}},minute:{displayName:"хвилина",relative:{0:"цієї хвилини"},relativeTime:{future:{one:"через {0} хвилину",few:"через {0} хвилини",many:"через {0} хвилин",other:"через {0} хвилини"},past:{one:"{0} хвилину тому",few:"{0} хвилини тому",many:"{0} хвилин тому",other:"{0} хвилини тому"}}},second:{displayName:"секунда",relative:{0:"зараз"},relativeTime:{future:{one:"через {0} секунду",few:"через {0} секунди",many:"через {0} секунд",other:"через {0} секунди"},past:{one:"{0} секунду тому",few:"{0} секунди тому",many:"{0} секунд тому",other:"{0} секунди тому"}}}}},{locale:"ur",pluralRuleFunction:function(e,t){var r=!String(e).split(".")[1];return t?"other":1==e&&r?"one":"other"},fields:{year:{displayName:"سال",relative:{0:"اس سال",1:"اگلے سال","-1":"گزشتہ سال"},relativeTime:{future:{one:"{0} سال میں",other:"{0} سال میں"},past:{one:"{0} سال پہلے",other:"{0} سال پہلے"}}},month:{displayName:"مہینہ",relative:{0:"اس مہینہ",1:"اگلے مہینہ","-1":"پچھلے مہینہ"},relativeTime:{future:{one:"{0} مہینہ میں",other:"{0} مہینے میں"},past:{one:"{0} مہینہ پہلے",other:"{0} مہینے پہلے"}}},day:{displayName:"دن",relative:{0:"آج",1:"آئندہ کل",2:"آنے والا پرسوں","-2":"گزشتہ پرسوں","-1":"گزشتہ کل"},relativeTime:{future:{one:"{0} دن میں",other:"{0} دنوں میں"},past:{one:"{0} دن پہلے",other:"{0} دنوں پہلے"}}},hour:{displayName:"گھنٹہ",relative:{0:"اس گھنٹے"},relativeTime:{future:{one:"{0} گھنٹہ میں",other:"{0} گھنٹے میں"},past:{one:"{0} گھنٹہ پہلے",other:"{0} گھنٹے پہلے"}}},minute:{displayName:"منٹ",relative:{0:"اس منٹ"},relativeTime:{future:{one:"{0} منٹ میں",other:"{0} منٹ میں"},past:{one:"{0} منٹ پہلے",other:"{0} منٹ پہلے"}}},second:{displayName:"سیکنڈ",relative:{0:"اب"},relativeTime:{future:{one:"{0} سیکنڈ میں",other:"{0} سیکنڈ میں"},past:{one:"{0} سیکنڈ پہلے",other:"{0} سیکنڈ پہلے"}}}}},{locale:"ur-IN",parentLocale:"ur",fields:{year:{displayName:"سال",relative:{0:"اس سال",1:"اگلے سال","-1":"گزشتہ سال"},relativeTime:{future:{one:"{0} سال میں",other:"{0} سالوں میں"},past:{one:"{0} سال پہلے",other:"{0} سال پہلے"}}},month:{displayName:"مہینہ",relative:{0:"اس ماہ",1:"اگلے ماہ","-1":"گزشتہ ماہ"},relativeTime:{future:{one:"{0} ماہ میں",other:"{0} ماہ میں"},past:{one:"{0} ماہ قبل",other:"{0} ماہ قبل"}}},day:{displayName:"دن",relative:{0:"آج",1:"آئندہ کل",2:"آنے والا پرسوں","-2":"گزشتہ پرسوں","-1":"گزشتہ کل"},relativeTime:{future:{one:"{0} دن میں",other:"{0} دنوں میں"},past:{one:"{0} دن پہلے",other:"{0} دنوں پہلے"}}},hour:{displayName:"گھنٹہ",relative:{0:"اس گھنٹے"},relativeTime:{future:{one:"{0} گھنٹہ میں",other:"{0} گھنٹے میں"},past:{one:"{0} گھنٹہ پہلے",other:"{0} گھنٹے پہلے"}}},minute:{displayName:"منٹ",relative:{0:"اس منٹ"},relativeTime:{future:{one:"{0} منٹ میں",other:"{0} منٹ میں"},past:{one:"{0} منٹ قبل",other:"{0} منٹ قبل"}}},second:{displayName:"سیکنڈ",relative:{0:"اب"},relativeTime:{future:{one:"{0} سیکنڈ میں",other:"{0} سیکنڈ میں"},past:{one:"{0} سیکنڈ قبل",other:"{0} سیکنڈ قبل"}}}}},{locale:"uz",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"yil",relative:{0:"shu yil",1:"keyingi yil","-1":"o‘tgan yil"},relativeTime:{future:{one:"{0} yildan keyin",other:"{0} yildan keyin"},past:{one:"{0} yil oldin",other:"{0} yil oldin"}}},month:{displayName:"oy",relative:{0:"shu oy",1:"keyingi oy","-1":"o‘tgan oy"},relativeTime:{future:{one:"{0} oydan keyin",other:"{0} oydan keyin"},past:{one:"{0} oy oldin",other:"{0} oy oldin"}}},day:{displayName:"kun",relative:{0:"bugun",1:"ertaga","-1":"kecha"},relativeTime:{future:{one:"{0} kundan keyin",other:"{0} kundan keyin"},past:{one:"{0} kun oldin",other:"{0} kun oldin"}}},hour:{displayName:"soat",relative:{0:"shu soatda"},relativeTime:{future:{one:"{0} soatdan keyin",other:"{0} soatdan keyin"},past:{one:"{0} soat oldin",other:"{0} soat oldin"}}},minute:{displayName:"daqiqa",relative:{0:"shu daqiqada"},relativeTime:{future:{one:"{0} daqiqadan keyin",other:"{0} daqiqadan keyin"},past:{one:"{0} daqiqa oldin",other:"{0} daqiqa oldin"}}},second:{displayName:"soniya",relative:{0:"hozir"},relativeTime:{future:{one:"{0} soniyadan keyin",other:"{0} soniyadan keyin"},past:{one:"{0} soniya oldin",other:"{0} soniya oldin"}}}}},{locale:"uz-Arab",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"uz-Cyrl",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Йил",relative:{0:"бу йил",1:"кейинги йил","-1":"ўтган йил"},relativeTime:{future:{one:"{0} йилдан сўнг",other:"{0} йилдан сўнг"},past:{one:"{0} йил аввал",other:"{0} йил аввал"}}},month:{displayName:"Ой",relative:{0:"бу ой",1:"кейинги ой","-1":"ўтган ой"},relativeTime:{future:{one:"{0} ойдан сўнг",other:"{0} ойдан сўнг"},past:{one:"{0} ой аввал",other:"{0} ой аввал"}}},day:{displayName:"Кун",relative:{0:"бугун",1:"эртага","-1":"кеча"},relativeTime:{future:{one:"{0} кундан сўнг",other:"{0} кундан сўнг"},past:{one:"{0} кун олдин",other:"{0} кун олдин"}}},hour:{displayName:"Соат",relative:{0:"this hour"},relativeTime:{future:{one:"{0} соатдан сўнг",other:"{0} соатдан сўнг"},past:{one:"{0} соат олдин",other:"{0} соат олдин"}}},minute:{displayName:"Дақиқа",relative:{0:"this minute"},relativeTime:{future:{one:"{0} дақиқадан сўнг",other:"{0} дақиқадан сўнг"},past:{one:"{0} дақиқа олдин",other:"{0} дақиқа олдин"}}},second:{displayName:"Сония",relative:{0:"ҳозир"},relativeTime:{future:{one:"{0} сониядан сўнг",other:"{0} сониядан сўнг"},past:{one:"{0} сония олдин",other:"{0} сония олдин"}}}}},{locale:"uz-Latn",parentLocale:"uz"},{locale:"vai",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"ꕢꘋ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"ꕪꖃ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"ꔎꔒ",relative:{0:"ꗦꗷ",1:"ꔻꕯ","-1":"ꖴꖸ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"ꕌꕎ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"ꕆꕇ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"ꕧꕃꕧꕪ",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"vai-Latn",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"saŋ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"kalo",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"tele",relative:{0:"wɛlɛ",1:"sina","-1":"kunu"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"hawa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"mini",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"jaki-jaka",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"vai-Vaii",parentLocale:"vai"},{locale:"ve",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"vi",pluralRuleFunction:function(e,t){return t&&1==e?"one":"other"},fields:{year:{displayName:"Năm",relative:{0:"năm nay",1:"năm sau","-1":"năm ngoái"},relativeTime:{future:{other:"sau {0} năm nữa"},past:{other:"{0} năm trước"}}},month:{displayName:"Tháng",relative:{0:"tháng này",1:"tháng sau","-1":"tháng trước"},relativeTime:{future:{other:"sau {0} tháng nữa"},past:{other:"{0} tháng trước"}}},day:{displayName:"Ngày",relative:{0:"Hôm nay",1:"Ngày mai",2:"Ngày kia","-2":"Hôm kia","-1":"Hôm qua"},relativeTime:{future:{other:"sau {0} ngày nữa"},past:{other:"{0} ngày trước"}}},hour:{displayName:"Giờ",relative:{0:"giờ này"},relativeTime:{future:{other:"sau {0} giờ nữa"},past:{other:"{0} giờ trước"}}},minute:{displayName:"Phút",relative:{0:"phút này"},relativeTime:{future:{other:"sau {0} phút nữa"},past:{other:"{0} phút trước"}}},second:{displayName:"Giây",relative:{0:"bây giờ"},relativeTime:{future:{other:"sau {0} giây nữa"},past:{other:"{0} giây trước"}}}}},{locale:"vo",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"vun",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Maka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Mori",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Mfiri",relative:{0:"Inu",1:"Ngama","-1":"Ukou"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Saa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Dakyika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Sekunde",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"wa",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"wae",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Jár",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"I {0} jár",other:"I {0} jár"},past:{one:"vor {0} jár",other:"cor {0} jár"}}},month:{displayName:"Mánet",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"I {0} mánet",other:"I {0} mánet"},past:{one:"vor {0} mánet",other:"vor {0} mánet"}}},day:{displayName:"Tag",relative:{0:"Hitte",1:"Móre",2:"Ubermóre","-2":"Vorgešter","-1":"Gešter"},relativeTime:{future:{one:"i {0} tag",other:"i {0} täg"},past:{one:"vor {0} tag",other:"vor {0} täg"}}},hour:{displayName:"Schtund",relative:{0:"this hour"},relativeTime:{future:{one:"i {0} stund",other:"i {0} stunde"},past:{one:"vor {0} stund",other:"vor {0} stunde"}}},minute:{displayName:"Mínütta",relative:{0:"this minute"},relativeTime:{future:{one:"i {0} minüta",other:"i {0} minüte"},past:{one:"vor {0} minüta",other:"vor {0} minüte"}}},second:{displayName:"Sekunda",relative:{0:"now"},relativeTime:{future:{one:"i {0} sekund",other:"i {0} sekunde"},past:{one:"vor {0} sekund",other:"vor {0} sekunde"}}}}},{locale:"wo",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"xh",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"xog",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"},fields:{year:{displayName:"Omwaka",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Omwezi",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Olunaku",relative:{0:"Olwaleelo (leelo)",1:"Enkyo","-1":"Edho"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Essawa",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Edakiika",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Obutikitiki",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"yav",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"yɔɔŋ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"oóli",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"puɔ́sɛ́",relative:{0:"ínaan",1:"nakinyám","-1":"púyoó"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"kisikɛl,",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"minít",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"síkɛn",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"yi",pluralRuleFunction:function(e,t){var r=!String(e).split(".")[1];return t?"other":1==e&&r?"one":"other"},fields:{year:{displayName:"יאָר",relative:{0:"הײַ יאָר",1:"איבער א יאָר","-1":"פֿאַראַיאָר"},relativeTime:{future:{one:"איבער {0} יאָר",other:"איבער {0} יאָר"},past:{one:"פֿאַר {0} יאָר",other:"פֿאַר {0} יאָר"}}},month:{displayName:"מאנאַט",relative:{0:"דעם חודש",1:"קומענדיקן חודש","-1":"פֿאַרגאנגענעם חודש"},relativeTime:{future:{one:"איבער {0} חודש",other:"איבער {0} חדשים"},past:{one:"פֿאַר {0} חודש",other:"פֿאַר {0} חדשים"}}},day:{displayName:"טאָג",relative:{0:"היינט",1:"מארגן","-1":"נעכטן"},relativeTime:{future:{one:"אין {0} טאָג אַרום",other:"אין {0} טעג אַרום"},past:{other:"-{0} d"}}},hour:{displayName:"שעה",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"מינוט",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"סעקונדע",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"yo",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Ọdún",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Osù",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ọjọ́",relative:{0:"Òní",1:"Ọ̀la",2:"òtúùnla","-2":"íjẹta","-1":"Àná"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"wákàtí",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Ìsẹ́jú",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Ìsẹ́jú Ààyá",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"yo-BJ",parentLocale:"yo",fields:{year:{displayName:"Ɔdún",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Osù",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Ɔjɔ́",relative:{0:"Òní",1:"Ɔ̀la",2:"òtúùnla","-2":"íjɛta","-1":"Àná"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"wákàtí",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Ìsɛ́jú",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Ìsɛ́jú Ààyá",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"yue",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"年",relative:{0:"今年",1:"下年","-1":"舊年"},relativeTime:{future:{other:"{0} 年後"},past:{other:"{0} 年前"}}},month:{displayName:"月",relative:{0:"今個月",1:"下個月","-1":"上個月"},relativeTime:{future:{other:"{0} 個月後"},past:{other:"{0} 個月前"}}},day:{displayName:"日",relative:{0:"今日",1:"聽日",2:"後天","-2":"前天","-1":"尋日"},relativeTime:{future:{other:"{0} 日後"},past:{other:"{0} 日前"}}},hour:{displayName:"小時",relative:{0:"呢個小時"},relativeTime:{future:{other:"{0} 小時後"},past:{other:"{0} 小時前"}}},minute:{displayName:"分鐘",relative:{0:"呢分鐘"},relativeTime:{future:{other:"{0} 分鐘後"},past:{other:"{0} 分鐘前"}}},second:{displayName:"秒",relative:{0:"宜家"},relativeTime:{future:{other:"{0} 秒後"},past:{other:"{0} 秒前"}}}}},{locale:"yue-Hans",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"zgh",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"ⴰⵙⴳⴳⵯⴰⵙ",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"ⴰⵢⵢⵓⵔ",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"ⴰⵙⵙ",relative:{0:"ⴰⵙⵙⴰ",1:"ⴰⵙⴽⴽⴰ","-1":"ⵉⴹⵍⵍⵉ"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"ⵜⴰⵙⵔⴰⴳⵜ",relative:{0:"this hour"},relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"ⵜⵓⵙⴷⵉⴷⵜ",relative:{0:"this minute"},relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"ⵜⴰⵙⵉⵏⵜ",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"zh",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"年",relative:{0:"今年",1:"明年","-1":"去年"},relativeTime:{future:{other:"{0}年后"},past:{other:"{0}年前"}}},month:{displayName:"月",relative:{0:"本月",1:"下个月","-1":"上个月"},relativeTime:{future:{other:"{0}个月后"},past:{other:"{0}个月前"}}},day:{displayName:"日",relative:{0:"今天",1:"明天",2:"后天","-2":"前天","-1":"昨天"},relativeTime:{future:{other:"{0}天后"},past:{other:"{0}天前"}}},hour:{displayName:"小时",relative:{0:"这一时间 / 此时"},relativeTime:{future:{other:"{0}小时后"},past:{other:"{0}小时前"}}},minute:{displayName:"分钟",relative:{0:"此刻"},relativeTime:{future:{other:"{0}分钟后"},past:{other:"{0}分钟前"}}},second:{displayName:"秒",relative:{0:"现在"},relativeTime:{future:{other:"{0}秒钟后"},past:{other:"{0}秒钟前"}}}}},{locale:"zh-Hans",parentLocale:"zh"},{locale:"zh-Hans-HK",parentLocale:"zh-Hans",fields:{year:{displayName:"年",relative:{0:"今年",1:"明年","-1":"去年"},relativeTime:{future:{other:"{0}年后"},past:{other:"{0}年前"}}},month:{displayName:"月",relative:{0:"本月",1:"下个月","-1":"上个月"},relativeTime:{future:{other:"{0}个月后"},past:{other:"{0}个月前"}}},day:{displayName:"日",relative:{0:"今天",1:"明天",2:"后天","-2":"前天","-1":"昨天"},relativeTime:{future:{other:"{0}天后"},past:{other:"{0}天前"}}},hour:{displayName:"小时",relative:{0:"这一时间 / 此时"},relativeTime:{future:{other:"{0}小时后"},past:{other:"{0}小时前"}}},minute:{displayName:"分钟",relative:{0:"此刻"},relativeTime:{future:{other:"{0}分钟后"},past:{other:"{0}分钟前"}}},second:{displayName:"秒",relative:{0:"现在"},relativeTime:{future:{other:"{0}秒后"},past:{other:"{0}秒前"}}}}},{locale:"zh-Hans-MO",parentLocale:"zh-Hans",fields:{year:{displayName:"年",relative:{0:"今年",1:"明年","-1":"去年"},relativeTime:{future:{other:"{0}年后"},past:{other:"{0}年前"}}},month:{displayName:"月",relative:{0:"本月",1:"下个月","-1":"上个月"},relativeTime:{future:{other:"{0}个月后"},past:{other:"{0}个月前"}}},day:{displayName:"日",relative:{0:"今天",1:"明天",2:"后天","-2":"前天","-1":"昨天"},relativeTime:{future:{other:"{0}天后"},past:{other:"{0}天前"}}},hour:{displayName:"小时",relative:{0:"这一时间 / 此时"},relativeTime:{future:{other:"{0}小时后"},past:{other:"{0}小时前"}}},minute:{displayName:"分钟",relative:{0:"此刻"},relativeTime:{future:{other:"{0}分钟后"},past:{other:"{0}分钟前"}}},second:{displayName:"秒",relative:{0:"现在"},relativeTime:{future:{other:"{0}秒后"},past:{other:"{0}秒前"}}}}},{locale:"zh-Hans-SG",parentLocale:"zh-Hans",fields:{year:{displayName:"年",relative:{0:"今年",1:"明年","-1":"去年"},relativeTime:{future:{other:"{0}年后"},past:{other:"{0}年前"}}},month:{displayName:"月",relative:{0:"本月",1:"下个月","-1":"上个月"},relativeTime:{future:{other:"{0}个月后"},past:{other:"{0}个月前"}}},day:{displayName:"日",relative:{0:"今天",1:"明天",2:"后天","-2":"前天","-1":"昨天"},relativeTime:{future:{other:"{0}天后"},past:{other:"{0}天前"}}},hour:{displayName:"小时",relative:{0:"这一时间 / 此时"},relativeTime:{future:{other:"{0}小时后"},past:{other:"{0}小时前"}}},minute:{displayName:"分钟",relative:{0:"此刻"},relativeTime:{future:{other:"{0}分钟后"},past:{other:"{0}分钟前"}}},second:{displayName:"秒",relative:{0:"现在"},relativeTime:{future:{other:"{0}秒后"},past:{other:"{0}秒前"}}}}},{locale:"zh-Hant",pluralRuleFunction:function(e,t){return"other"},fields:{year:{displayName:"年",relative:{0:"今年",1:"明年","-1":"去年"},relativeTime:{future:{other:"{0} 年後"},past:{other:"{0} 年前"}}},month:{displayName:"月",relative:{0:"本月",1:"下個月","-1":"上個月"},relativeTime:{future:{other:"{0} 個月後"},past:{other:"{0} 個月前"}}},day:{displayName:"日",relative:{0:"今天",1:"明天",2:"後天","-2":"前天","-1":"昨天"},relativeTime:{future:{other:"{0} 天後"},past:{other:"{0} 天前"}}},hour:{displayName:"小時",relative:{0:"這一小時"},relativeTime:{future:{other:"{0} 小時後"},past:{other:"{0} 小時前"}}},minute:{displayName:"分鐘",relative:{0:"這一分鐘"},relativeTime:{future:{other:"{0} 分鐘後"},past:{other:"{0} 分鐘前"}}},second:{displayName:"秒",relative:{0:"現在"},relativeTime:{future:{other:"{0} 秒後"},past:{other:"{0} 秒前"}}}}},{locale:"zh-Hant-HK",parentLocale:"zh-Hant",fields:{year:{displayName:"年",relative:{0:"今年",1:"下年","-1":"上年"},relativeTime:{future:{other:"{0} 年後"},past:{other:"{0} 年前"}}},month:{displayName:"月",relative:{0:"本月",1:"下個月","-1":"上個月"},relativeTime:{future:{other:"{0} 個月後"},past:{other:"{0} 個月前"}}},day:{displayName:"日",relative:{0:"今日",1:"明日",2:"後日","-2":"前日","-1":"昨日"},relativeTime:{future:{other:"{0} 日後"},past:{other:"{0} 日前"}}},hour:{displayName:"小時",relative:{0:"這個小時"},relativeTime:{future:{other:"{0} 小時後"},past:{other:"{0} 小時前"}}},minute:{displayName:"分鐘",relative:{0:"這分鐘"},relativeTime:{future:{other:"{0} 分鐘後"},past:{other:"{0} 分鐘前"}}},second:{displayName:"秒",relative:{0:"現在"},relativeTime:{future:{other:"{0} 秒後"},past:{other:"{0} 秒前"}}}}},{locale:"zh-Hant-MO",parentLocale:"zh-Hant-HK"},{locale:"zu",pluralRuleFunction:function(e,t){return t?"other":e>=0&&e<=1?"one":"other"},fields:{year:{displayName:"Unyaka",relative:{0:"kulo nyaka",1:"unyaka ozayo","-1":"onyakeni odlule"},relativeTime:{future:{one:"onyakeni ongu-{0} ozayo",other:"eminyakeni engu-{0} ezayo"},past:{one:"{0} unyaka odlule",other:"{0} iminyaka edlule"}}},month:{displayName:"Inyanga",relative:{0:"le nyanga",1:"inyanga ezayo","-1":"inyanga edlule"},relativeTime:{future:{one:"enyangeni engu-{0}",other:"ezinyangeni ezingu-{0} ezizayo"},past:{one:"{0} inyanga edlule",other:"{0} izinyanga ezedlule"}}},day:{displayName:"Usuku",relative:{0:"namhlanje",1:"kusasa",2:"usuku olulandela olwakusasa","-2":"usuku olwandulela olwayizolo","-1":"izolo"},relativeTime:{future:{one:"osukwini olungu-{0} oluzayo",other:"ezinsukwini ezingu-{0} ezizayo"},past:{one:"osukwini olungu-{0} olwedlule",other:"ezinsukwini ezingu-{0} ezedlule."}}},hour:{displayName:"Ihora",relative:{0:"leli hora"},relativeTime:{future:{one:"ehoreni elingu-{0} elizayo",other:"emahoreni angu-{0} ezayo"},past:{one:"{0} ihora eledlule",other:"emahoreni angu-{0} edlule"}}},minute:{displayName:"Iminithi",relative:{0:"leli minithi"},relativeTime:{future:{one:"kuminithi elingu-{0} elizayo",other:"kumaminithi angu-{0} ezayo"},past:{one:"{0} iminithi eledlule",other:"{0} amaminithi edlule"}}},second:{displayName:"Isekhondi",relative:{0:"manje"},relativeTime:{future:{one:"kusekhondi elingu-{0} elizayo",other:"kumasekhondi angu-{0} ezayo"},past:{one:"{0} isekhondi eledlule",other:"{0} amasekhondi edlule"}}}}}]})},function(e,t,r){"use strict";t=e.exports=r(1132).default,t.default=t},function(e,t,r){"use strict";t.default=function(){function e(t,r,a,n){this.message=t,this.expected=r,this.found=a,this.location=n,this.name="SyntaxError","function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,e)}function t(t){function r(){return n(Ye,qe)}function a(e){var r,a,n=Ze[e];if(n)return n;for(r=e-1;!Ze[r];)r--;for(n=Ze[r],n={line:n.line,column:n.column,seenCR:n.seenCR};r<e;)a=t.charAt(r),"\n"===a?(n.seenCR||n.line++,n.column=1,n.seenCR=!1):"\r"===a||"\u2028"===a||"\u2029"===a?(n.line++,n.column=1,n.seenCR=!0):(n.column++,n.seenCR=!1),r++;return Ze[e]=n,n}function n(e,t){var r=a(e),n=a(t);return{start:{offset:e,line:r.line,column:r.column},end:{offset:t,line:n.line,column:n.column}}}function o(e){qe<Ke||(qe>Ke&&(Ke=qe,Je=[]),Je.push(e))}function i(){return l()}function l(){var e,t,r;for(e=qe,t=[],r=s();r!==I;)t.push(r),r=s();return t!==I&&(Ye=e,t=R(t)),e=t}function s(){var e;return e=h(),e===I&&(e=d()),e}function u(){var e,r,a,n,o,i;if(e=qe,r=[],a=qe,n=N(),n!==I?(o=D(),o!==I?(i=N(),i!==I?(n=[n,o,i],a=n):(qe=a,a=I)):(qe=a,a=I)):(qe=a,a=I),a!==I)for(;a!==I;)r.push(a),a=qe,n=N(),n!==I?(o=D(),o!==I?(i=N(),i!==I?(n=[n,o,i],a=n):(qe=a,a=I)):(qe=a,a=I)):(qe=a,a=I);else r=I;return r!==I&&(Ye=e,r=E(r)),e=r,e===I&&(e=qe,r=w(),e=r!==I?t.substring(e,qe):r),e}function h(){var e,t;return e=qe,t=u(),t!==I&&(Ye=e,t=P(t)),e=t}function c(){var e,r,a;if((e=S())===I){if(e=qe,r=[],O.test(t.charAt(qe))?(a=t.charAt(qe),qe++):(a=I,0===Xe&&o(F)),a!==I)for(;a!==I;)r.push(a),O.test(t.charAt(qe))?(a=t.charAt(qe),qe++):(a=I,0===Xe&&o(F));else r=I;e=r!==I?t.substring(e,qe):r}return e}function d(){var e,r,a,n,i,l,s,u,h;return e=qe,123===t.charCodeAt(qe)?(r=j,qe++):(r=I,0===Xe&&o(B)),r!==I?(a=N(),a!==I?(n=c(),n!==I?(i=N(),i!==I?(l=qe,44===t.charCodeAt(qe)?(s=H,qe++):(s=I,0===Xe&&o(V)),s!==I?(u=N(),u!==I?(h=m(),h!==I?(s=[s,u,h],l=s):(qe=l,l=I)):(qe=l,l=I)):(qe=l,l=I),l===I&&(l=null),l!==I?(s=N(),s!==I?(125===t.charCodeAt(qe)?(u=G,qe++):(u=I,0===Xe&&o(W)),u!==I?(Ye=e,r=U(n,l),e=r):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I),e}function m(){var e;return e=p(),e===I&&(e=f())===I&&(e=v())===I&&(e=y()),e}function p(){var e,r,a,n,i,l,s;return e=qe,t.substr(qe,6)===q?(r=q,qe+=6):(r=I,0===Xe&&o(Y)),r===I&&(t.substr(qe,4)===Z?(r=Z,qe+=4):(r=I,0===Xe&&o(K)),r===I&&(t.substr(qe,4)===J?(r=J,qe+=4):(r=I,0===Xe&&o(X)))),r!==I?(a=N(),a!==I?(n=qe,44===t.charCodeAt(qe)?(i=H,qe++):(i=I,0===Xe&&o(V)),i!==I?(l=N(),l!==I?(s=D(),s!==I?(i=[i,l,s],n=i):(qe=n,n=I)):(qe=n,n=I)):(qe=n,n=I),n===I&&(n=null),n!==I?(Ye=e,r=$(r,n),e=r):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I),e}function f(){var e,r,a,n,i,l;return e=qe,t.substr(qe,6)===Q?(r=Q,qe+=6):(r=I,0===Xe&&o(ee)),r!==I?(a=N(),a!==I?(44===t.charCodeAt(qe)?(n=H,qe++):(n=I,0===Xe&&o(V)),n!==I?(i=N(),i!==I?(l=x(),l!==I?(Ye=e,r=te(l),e=r):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I),e}function v(){var e,r,a,n,i,l;return e=qe,t.substr(qe,13)===re?(r=re,qe+=13):(r=I,0===Xe&&o(ae)),r!==I?(a=N(),a!==I?(44===t.charCodeAt(qe)?(n=H,qe++):(n=I,0===Xe&&o(V)),n!==I?(i=N(),i!==I?(l=x(),l!==I?(Ye=e,r=ne(l),e=r):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I),e}function y(){var e,r,a,n,i;if(e=qe,t.substr(qe,6)===oe?(r=oe,qe+=6):(r=I,0===Xe&&o(ie)),r!==I)if(N()!==I)if(44===t.charCodeAt(qe)?(a=H,qe++):(a=I,0===Xe&&o(V)),a!==I)if(N()!==I){if(n=[],(i=_())!==I)for(;i!==I;)n.push(i),i=_();else n=I;n!==I?(Ye=e,r=le(n),e=r):(qe=e,e=I)}else qe=e,e=I;else qe=e,e=I;else qe=e,e=I;else qe=e,e=I;return e}function g(){var e,r,a,n;return e=qe,r=qe,61===t.charCodeAt(qe)?(a=se,qe++):(a=I,0===Xe&&o(ue)),a!==I?(n=S(),n!==I?(a=[a,n],r=a):(qe=r,r=I)):(qe=r,r=I),e=r!==I?t.substring(e,qe):r,e===I&&(e=D()),e}function _(){var e,r,a,n,i,s,u,h,c;return e=qe,r=N(),r!==I?(a=g(),a!==I?(n=N(),n!==I?(123===t.charCodeAt(qe)?(i=j,qe++):(i=I,0===Xe&&o(B)),i!==I?(s=N(),s!==I?(u=l(),u!==I?(h=N(),h!==I?(125===t.charCodeAt(qe)?(c=G,qe++):(c=I,0===Xe&&o(W)),c!==I?(Ye=e,r=he(a,u),e=r):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I),e}function T(){var e,r,a,n;return e=qe,t.substr(qe,7)===ce?(r=ce,qe+=7):(r=I,0===Xe&&o(de)),r!==I?(a=N(),a!==I?(n=S(),n!==I?(Ye=e,r=me(n),e=r):(qe=e,e=I)):(qe=e,e=I)):(qe=e,e=I),e}function x(){var e,t,r,a;if(e=qe,t=T(),t===I&&(t=null),t!==I)if(N()!==I){if(r=[],(a=_())!==I)for(;a!==I;)r.push(a),a=_();else r=I;r!==I?(Ye=e,t=pe(t,r),e=t):(qe=e,e=I)}else qe=e,e=I;else qe=e,e=I;return e}function w(){var e,r;if(Xe++,e=[],ve.test(t.charAt(qe))?(r=t.charAt(qe),qe++):(r=I,0===Xe&&o(ye)),r!==I)for(;r!==I;)e.push(r),ve.test(t.charAt(qe))?(r=t.charAt(qe),qe++):(r=I,0===Xe&&o(ye));else e=I;return Xe--,e===I&&(r=I,0===Xe&&o(fe)),e}function N(){var e,r,a;for(Xe++,e=qe,r=[],a=w();a!==I;)r.push(a),a=w();return e=r!==I?t.substring(e,qe):r,Xe--,e===I&&(r=I,0===Xe&&o(ge)),e}function b(){var e;return _e.test(t.charAt(qe))?(e=t.charAt(qe),qe++):(e=I,0===Xe&&o(Te)),e}function L(){var e;return xe.test(t.charAt(qe))?(e=t.charAt(qe),qe++):(e=I,0===Xe&&o(we)),e}function S(){var e,r,a,n,i,l;if(e=qe,48===t.charCodeAt(qe)?(r=Ne,qe++):(r=I,0===Xe&&o(be)),r===I){if(r=qe,a=qe,Le.test(t.charAt(qe))?(n=t.charAt(qe),qe++):(n=I,0===Xe&&o(Se)),n!==I){for(i=[],l=b();l!==I;)i.push(l),l=b();i!==I?(n=[n,i],a=n):(qe=a,a=I)}else qe=a,a=I;r=a!==I?t.substring(r,qe):a}return r!==I&&(Ye=e,r=ke(r)),e=r}function k(){var e,r,a,n,i,l,s,u;return De.test(t.charAt(qe))?(e=t.charAt(qe),qe++):(e=I,0===Xe&&o(Me)),e===I&&(e=qe,t.substr(qe,2)===Ae?(r=Ae,qe+=2):(r=I,0===Xe&&o(Ie)),r!==I&&(Ye=e,r=ze()),(e=r)===I&&(e=qe,t.substr(qe,2)===Ce?(r=Ce,qe+=2):(r=I,0===Xe&&o(Re)),r!==I&&(Ye=e,r=Ee()),(e=r)===I&&(e=qe,t.substr(qe,2)===Pe?(r=Pe,qe+=2):(r=I,0===Xe&&o(Oe)),r!==I&&(Ye=e,r=Fe()),(e=r)===I&&(e=qe,t.substr(qe,2)===je?(r=je,qe+=2):(r=I,0===Xe&&o(Be)),r!==I&&(Ye=e,r=He()),(e=r)===I&&(e=qe,t.substr(qe,2)===Ve?(r=Ve,qe+=2):(r=I,0===Xe&&o(Ge)),r!==I?(a=qe,n=qe,i=L(),i!==I?(l=L(),l!==I?(s=L(),s!==I?(u=L(),u!==I?(i=[i,l,s,u],n=i):(qe=n,n=I)):(qe=n,n=I)):(qe=n,n=I)):(qe=n,n=I),a=n!==I?t.substring(a,qe):n,a!==I?(Ye=e,r=We(a),e=r):(qe=e,e=I)):(qe=e,e=I)))))),e}function D(){var e,t,r;if(e=qe,t=[],(r=k())!==I)for(;r!==I;)t.push(r),r=k();else t=I;return t!==I&&(Ye=e,t=Ue(t)),e=t}var M,A=arguments.length>1?arguments[1]:{},I={},z={start:i},C=i,R=function(e){return{type:"messageFormatPattern",elements:e,location:r()}},E=function(e){var t,r,a,n,o,i="";for(t=0,a=e.length;t<a;t+=1)for(n=e[t],r=0,o=n.length;r<o;r+=1)i+=n[r];return i},P=function(e){return{type:"messageTextElement",value:e,location:r()}},O=/^[^ \t\n\r,.+={}#]/,F={type:"class",value:"[^ \\t\\n\\r,.+={}#]",description:"[^ \\t\\n\\r,.+={}#]"},j="{",B={type:"literal",value:"{",description:'"{"'},H=",",V={type:"literal",value:",",description:'","'},G="}",W={type:"literal",value:"}",description:'"}"'},U=function(e,t){return{type:"argumentElement",id:e,format:t&&t[2],location:r()}},q="number",Y={type:"literal",value:"number",description:'"number"'},Z="date",K={type:"literal",value:"date",description:'"date"'},J="time",X={type:"literal",value:"time",description:'"time"'},$=function(e,t){return{type:e+"Format",style:t&&t[2],location:r()}},Q="plural",ee={type:"literal",value:"plural",description:'"plural"'},te=function(e){return{type:e.type,ordinal:!1,offset:e.offset||0,options:e.options,location:r()}},re="selectordinal",ae={type:"literal",value:"selectordinal",description:'"selectordinal"'},ne=function(e){return{type:e.type,ordinal:!0,offset:e.offset||0,options:e.options,location:r()}},oe="select",ie={type:"literal",value:"select",description:'"select"'},le=function(e){return{type:"selectFormat",options:e,location:r()}},se="=",ue={type:"literal",value:"=",description:'"="'},he=function(e,t){return{type:"optionalFormatPattern",selector:e,value:t,location:r()}},ce="offset:",de={type:"literal",value:"offset:",description:'"offset:"'},me=function(e){return e},pe=function(e,t){return{type:"pluralFormat",offset:e,options:t,location:r()}},fe={type:"other",description:"whitespace"},ve=/^[ \t\n\r]/,ye={type:"class",value:"[ \\t\\n\\r]",description:"[ \\t\\n\\r]"},ge={type:"other",description:"optionalWhitespace"},_e=/^[0-9]/,Te={type:"class",value:"[0-9]",description:"[0-9]"},xe=/^[0-9a-f]/i,we={type:"class",value:"[0-9a-f]i",description:"[0-9a-f]i"},Ne="0",be={type:"literal",value:"0",description:'"0"'},Le=/^[1-9]/,Se={type:"class",value:"[1-9]",description:"[1-9]"},ke=function(e){return parseInt(e,10)},De=/^[^{}\\\0-\x1F \t\n\r]/,Me={type:"class",value:"[^{}\\\\\\0-\\x1F\\x7f \\t\\n\\r]",description:"[^{}\\\\\\0-\\x1F\\x7f \\t\\n\\r]"},Ae="\\\\",Ie={type:"literal",value:"\\\\",description:'"\\\\\\\\"'},ze=function(){return"\\"},Ce="\\#",Re={type:"literal",value:"\\#",description:'"\\\\#"'},Ee=function(){return"\\#"},Pe="\\{",Oe={type:"literal",value:"\\{",description:'"\\\\{"'},Fe=function(){return"{"},je="\\}",Be={type:"literal",value:"\\}",description:'"\\\\}"'},He=function(){return"}"},Ve="\\u",Ge={type:"literal",value:"\\u",description:'"\\\\u"'},We=function(e){return String.fromCharCode(parseInt(e,16))},Ue=function(e){return e.join("")},qe=0,Ye=0,Ze=[{line:1,column:1,seenCR:!1}],Ke=0,Je=[],Xe=0;if("startRule"in A){if(!(A.startRule in z))throw new Error("Can't start parsing from rule \""+A.startRule+'".');C=z[A.startRule]}if((M=C())!==I&&qe===t.length)return M;throw M!==I&&qe<t.length&&o({type:"end",description:"end of input"}),function(t,r,a,n){return null!==r&&function(e){var t=1;for(e.sort(function(e,t){return e.description<t.description?-1:e.description>t.description?1:0});t<e.length;)e[t-1]===e[t]?e.splice(t,1):t++}(r),new e(null!==t?t:function(e,t){var r,a,n,o=new Array(e.length);for(n=0;n<e.length;n++)o[n]=e[n].description;return r=e.length>1?o.slice(0,-1).join(", ")+" or "+o[e.length-1]:o[0],a=t?'"'+function(e){function t(e){return e.charCodeAt(0).toString(16).toUpperCase()}return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\x08/g,"\\b").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\f/g,"\\f").replace(/\r/g,"\\r").replace(/[\x00-\x07\x0B\x0E\x0F]/g,function(e){return"\\x0"+t(e)}).replace(/[\x10-\x1F\x80-\xFF]/g,function(e){return"\\x"+t(e)}).replace(/[\u0100-\u0FFF]/g,function(e){return"\\u0"+t(e)}).replace(/[\u1000-\uFFFF]/g,function(e){return"\\u"+t(e)})}(t)+'"':"end of input","Expected "+r+" but "+a+" found."}(r,a),r,a,n)}(null,Je,Ke<t.length?t.charAt(Ke):null,Ke<t.length?n(Ke,Ke+1):n(Ke,Ke))}return function(e,t){function r(){this.constructor=e}r.prototype=t.prototype,e.prototype=new r}(e,Error),{SyntaxError:e,parse:t}}()},function(e,t,r){"use strict";var a=r(1138).default;r(1137),t=e.exports=a,t.default=t},function(e,t,r){"use strict";function a(e,t,r){this.locales=e,this.formats=t,this.pluralFn=r}function n(e){this.id=e}function o(e,t,r,a,n){this.id=e,this.useOrdinal=t,this.offset=r,this.options=a,this.pluralFn=n}function i(e,t,r,a){this.id=e,this.offset=t,this.numberFormat=r,this.string=a}function l(e,t){this.id=e,this.options=t}t.default=a,a.prototype.compile=function(e){return this.pluralStack=[],this.currentPlural=null,this.pluralNumberFormat=null,this.compileMessage(e)},a.prototype.compileMessage=function(e){if(!e||"messageFormatPattern"!==e.type)throw new Error('Message AST is not of type: "messageFormatPattern"');var t,r,a,n=e.elements,o=[];for(t=0,r=n.length;t<r;t+=1)switch(a=n[t],a.type){case"messageTextElement":o.push(this.compileMessageText(a));break;case"argumentElement":o.push(this.compileArgument(a));break;default:throw new Error("Message element does not have a valid type")}return o},a.prototype.compileMessageText=function(e){return this.currentPlural&&/(^|[^\\])#/g.test(e.value)?(this.pluralNumberFormat||(this.pluralNumberFormat=new Intl.NumberFormat(this.locales)),new i(this.currentPlural.id,this.currentPlural.format.offset,this.pluralNumberFormat,e.value)):e.value.replace(/\\#/g,"#")},a.prototype.compileArgument=function(e){var t=e.format;if(!t)return new n(e.id);var r,a=this.formats,i=this.locales,s=this.pluralFn;switch(t.type){case"numberFormat":return r=a.number[t.style],{id:e.id,format:new Intl.NumberFormat(i,r).format};case"dateFormat":return r=a.date[t.style],{id:e.id,format:new Intl.DateTimeFormat(i,r).format};case"timeFormat":return r=a.time[t.style],{id:e.id,format:new Intl.DateTimeFormat(i,r).format};case"pluralFormat":return r=this.compileOptions(e),new o(e.id,t.ordinal,t.offset,r,s);case"selectFormat":return r=this.compileOptions(e),new l(e.id,r);default:throw new Error("Message element does not have a valid format type")}},a.prototype.compileOptions=function(e){var t=e.format,r=t.options,a={};this.pluralStack.push(this.currentPlural),this.currentPlural="pluralFormat"===t.type?e:null;var n,o,i;for(n=0,o=r.length;n<o;n+=1)i=r[n],a[i.selector]=this.compileMessage(i.value);return this.currentPlural=this.pluralStack.pop(),a},n.prototype.format=function(e){return e||"number"==typeof e?"string"==typeof e?e:String(e):""},o.prototype.getOption=function(e){var t=this.options;return t["="+e]||t[this.pluralFn(e-this.offset,this.useOrdinal)]||t.other},i.prototype.format=function(e){var t=this.numberFormat.format(e-this.offset);return this.string.replace(/(^|[^\\])#/g,"$1"+t).replace(/\\#/g,"#")},l.prototype.getOption=function(e){var t=this.options;return t[e]||t.other}},function(e,t,r){"use strict";t.default={locale:"en",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1],n=Number(r[0])==e,o=n&&r[0].slice(-1),i=n&&r[0].slice(-2);return t?1==o&&11!=i?"one":2==o&&12!=i?"two":3==o&&13!=i?"few":"other":1==e&&a?"one":"other"}}},function(e,t,r){"use strict";var a=r(411),n=function(){try{return!!Object.defineProperty({},"a",{})}catch(e){return!1}}(),o=(!n&&Object.prototype.__defineGetter__,n?Object.defineProperty:function(e,t,r){"get"in r&&e.__defineGetter__?e.__defineGetter__(t,r.get):(!a.hop.call(e,t)||"value"in r)&&(e[t]=r.value)}),i=Object.create||function(e,t){function r(){}var n,i;r.prototype=e,n=new r;for(i in t)a.hop.call(t,i)&&o(n,i,t[i]);return n};t.defineProperty=o,t.objCreate=i},function(e,t,r){"use strict";var a=r(410).default;a.__addLocaleData({locale:"af",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"af-NA",parentLocale:"af"}),a.__addLocaleData({locale:"agq",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ak",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"}}),a.__addLocaleData({locale:"am",pluralRuleFunction:function(e,t){return t?"other":e>=0&&e<=1?"one":"other"}}),a.__addLocaleData({locale:"ar",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e,n=a&&r[0].slice(-2);return t?"other":0==e?"zero":1==e?"one":2==e?"two":n>=3&&n<=10?"few":n>=11&&n<=99?"many":"other"}}),a.__addLocaleData({locale:"ar-AE",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-BH",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-DJ",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-DZ",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-EG",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-EH",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-ER",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-IL",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-IQ",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-JO",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-KM",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-KW",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-LB",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-LY",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-MA",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-MR",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-OM",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-PS",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-QA",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-SA",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-SD",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-SO",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-SS",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-SY",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-TD",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-TN",parentLocale:"ar"}),a.__addLocaleData({locale:"ar-YE",parentLocale:"ar"}),a.__addLocaleData({locale:"as",pluralRuleFunction:function(e,t){return t?1==e||5==e||7==e||8==e||9==e||10==e?"one":2==e||3==e?"two":4==e?"few":6==e?"many":"other":e>=0&&e<=1?"one":"other"}}),a.__addLocaleData({locale:"asa",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ast",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"az",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=a.slice(-1),o=a.slice(-2),i=a.slice(-3);return t?1==n||2==n||5==n||7==n||8==n||20==o||50==o||70==o||80==o?"one":3==n||4==n||100==i||200==i||300==i||400==i||500==i||600==i||700==i||800==i||900==i?"few":0==a||6==n||40==o||60==o||90==o?"many":"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"az-Arab",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"az-Cyrl",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"az-Latn",parentLocale:"az"}),a.__addLocaleData({locale:"bas",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"be",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e,n=a&&r[0].slice(-1),o=a&&r[0].slice(-2);return t?2!=n&&3!=n||12==o||13==o?"other":"few":1==n&&11!=o?"one":n>=2&&n<=4&&(o<12||o>14)?"few":a&&0==n||n>=5&&n<=9||o>=11&&o<=14?"many":"other"}}),a.__addLocaleData({locale:"bem",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"bez",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"bg",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"bh",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"}}),a.__addLocaleData({locale:"bm",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"bm-Nkoo",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"bn",pluralRuleFunction:function(e,t){return t?1==e||5==e||7==e||8==e||9==e||10==e?"one":2==e||3==e?"two":4==e?"few":6==e?"many":"other":e>=0&&e<=1?"one":"other"}}),a.__addLocaleData({locale:"bn-IN",parentLocale:"bn"}),a.__addLocaleData({locale:"bo",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"bo-IN",parentLocale:"bo"}),a.__addLocaleData({locale:"br",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e,n=a&&r[0].slice(-1),o=a&&r[0].slice(-2),i=a&&r[0].slice(-6);return t?"other":1==n&&11!=o&&71!=o&&91!=o?"one":2==n&&12!=o&&72!=o&&92!=o?"two":(3==n||4==n||9==n)&&(o<10||o>19)&&(o<70||o>79)&&(o<90||o>99)?"few":0!=e&&a&&0==i?"many":"other"}}),a.__addLocaleData({locale:"brx",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"bs",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=a.slice(-2),s=n.slice(-1),u=n.slice(-2);return t?"other":o&&1==i&&11!=l||1==s&&11!=u?"one":o&&i>=2&&i<=4&&(l<12||l>14)||s>=2&&s<=4&&(u<12||u>14)?"few":"other"}}),a.__addLocaleData({locale:"bs-Cyrl",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"bs-Latn",parentLocale:"bs"}),a.__addLocaleData({locale:"ca",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?1==e||3==e?"one":2==e?"two":4==e?"few":"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"ca-AD",parentLocale:"ca"}),a.__addLocaleData({locale:"ca-ES-VALENCIA",parentLocale:"ca-ES"}),a.__addLocaleData({locale:"ca-ES",parentLocale:"ca"}),a.__addLocaleData({locale:"ca-FR",parentLocale:"ca"}),a.__addLocaleData({locale:"ca-IT",parentLocale:"ca"}),a.__addLocaleData({locale:"ce",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"cgg",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"chr",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ckb",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ckb-IR",parentLocale:"ckb"}),a.__addLocaleData({locale:"cs",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1];return t?"other":1==e&&n?"one":a>=2&&a<=4&&n?"few":n?"other":"many"}}),a.__addLocaleData({locale:"cu",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"cy",pluralRuleFunction:function(e,t){return t?0==e||7==e||8==e||9==e?"zero":1==e?"one":2==e?"two":3==e||4==e?"few":5==e||6==e?"many":"other":0==e?"zero":1==e?"one":2==e?"two":3==e?"few":6==e?"many":"other"}}),a.__addLocaleData({locale:"da",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=Number(r[0])==e;return t?"other":1!=e&&(n||0!=a&&1!=a)?"other":"one"}}),a.__addLocaleData({locale:"da-GL",parentLocale:"da"}),a.__addLocaleData({locale:"dav",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"de",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"de-AT",parentLocale:"de"}),a.__addLocaleData({locale:"de-BE",parentLocale:"de"}),a.__addLocaleData({locale:"de-CH",parentLocale:"de"}),a.__addLocaleData({locale:"de-LI",parentLocale:"de"}),a.__addLocaleData({locale:"de-LU",parentLocale:"de"}),a.__addLocaleData({locale:"dje",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"dsb",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-2),l=n.slice(-2);return t?"other":o&&1==i||1==l?"one":o&&2==i||2==l?"two":o&&(3==i||4==i)||3==l||4==l?"few":"other"}}),a.__addLocaleData({locale:"dua",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"dv",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"dyo",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"dz",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ebu",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ee",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ee-TG",parentLocale:"ee"}),a.__addLocaleData({locale:"el",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"el-CY",parentLocale:"el"}),a.__addLocaleData({locale:"en",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1],n=Number(r[0])==e,o=n&&r[0].slice(-1),i=n&&r[0].slice(-2);return t?1==o&&11!=i?"one":2==o&&12!=i?"two":3==o&&13!=i?"few":"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"en-001",parentLocale:"en"}),a.__addLocaleData({locale:"en-150",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-AG",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-AI",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-AS",parentLocale:"en"}),a.__addLocaleData({locale:"en-AT",parentLocale:"en-150"}),a.__addLocaleData({locale:"en-AU",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-BB",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-BE",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-BI",parentLocale:"en"}),a.__addLocaleData({locale:"en-BM",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-BS",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-BW",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-BZ",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-CA",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-CC",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-CH",parentLocale:"en-150"}),a.__addLocaleData({locale:"en-CK",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-CM",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-CX",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-CY",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-DE",parentLocale:"en-150"}),a.__addLocaleData({locale:"en-DG",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-DK",parentLocale:"en-150"}),a.__addLocaleData({locale:"en-DM",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-Dsrt",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"en-ER",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-FI",parentLocale:"en-150"}),a.__addLocaleData({locale:"en-FJ",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-FK",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-FM",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-GB",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-GD",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-GG",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-GH",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-GI",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-GM",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-GU",parentLocale:"en"}),a.__addLocaleData({locale:"en-GY",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-HK",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-IE",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-IL",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-IM",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-IN",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-IO",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-JE",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-JM",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-KE",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-KI",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-KN",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-KY",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-LC",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-LR",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-LS",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-MG",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-MH",parentLocale:"en"}),a.__addLocaleData({locale:"en-MO",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-MP",parentLocale:"en"}),a.__addLocaleData({locale:"en-MS",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-MT",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-MU",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-MW",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-MY",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-NA",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-NF",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-NG",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-NL",parentLocale:"en-150"}),a.__addLocaleData({locale:"en-NR",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-NU",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-NZ",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-PG",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-PH",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-PK",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-PN",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-PR",parentLocale:"en"}),a.__addLocaleData({locale:"en-PW",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-RW",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-SB",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-SC",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-SD",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-SE",parentLocale:"en-150"}),a.__addLocaleData({locale:"en-SG",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-SH",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-SI",parentLocale:"en-150"}),a.__addLocaleData({locale:"en-SL",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-SS",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-SX",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-SZ",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-Shaw",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"en-TC",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-TK",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-TO",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-TT",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-TV",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-TZ",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-UG",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-UM",parentLocale:"en"}),a.__addLocaleData({locale:"en-US",parentLocale:"en"}),a.__addLocaleData({locale:"en-VC",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-VG",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-VI",parentLocale:"en"}),a.__addLocaleData({locale:"en-VU",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-WS",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-ZA",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-ZM",parentLocale:"en-001"}),a.__addLocaleData({locale:"en-ZW",parentLocale:"en-001"}),a.__addLocaleData({locale:"eo",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"es",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}});a.__addLocaleData({locale:"es-419",parentLocale:"es"}),a.__addLocaleData({locale:"es-AR",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-BO",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-CL",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-CO",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-CR",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-CU",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-DO",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-EA",parentLocale:"es"}),a.__addLocaleData({locale:"es-EC",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-GQ",parentLocale:"es"}),a.__addLocaleData({locale:"es-GT",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-HN",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-IC",parentLocale:"es"}),a.__addLocaleData({locale:"es-MX",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-NI",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-PA",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-PE",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-PH",parentLocale:"es"}),a.__addLocaleData({locale:"es-PR",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-PY",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-SV",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-US",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-UY",parentLocale:"es-419"}),a.__addLocaleData({locale:"es-VE",parentLocale:"es-419"}),a.__addLocaleData({locale:"et",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"eu",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ewo",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"fa",pluralRuleFunction:function(e,t){return t?"other":e>=0&&e<=1?"one":"other"}}),a.__addLocaleData({locale:"fa-AF",parentLocale:"fa"}),a.__addLocaleData({locale:"ff",pluralRuleFunction:function(e,t){return t?"other":e>=0&&e<2?"one":"other"}}),a.__addLocaleData({locale:"ff-CM",parentLocale:"ff"}),a.__addLocaleData({locale:"ff-GN",parentLocale:"ff"}),a.__addLocaleData({locale:"ff-MR",parentLocale:"ff"}),a.__addLocaleData({locale:"fi",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"fil",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=n.slice(-1);return t?1==e?"one":"other":o&&(1==a||2==a||3==a)||o&&4!=i&&6!=i&&9!=i||!o&&4!=l&&6!=l&&9!=l?"one":"other"}}),a.__addLocaleData({locale:"fo",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"fo-DK",parentLocale:"fo"}),a.__addLocaleData({locale:"fr",pluralRuleFunction:function(e,t){return t?1==e?"one":"other":e>=0&&e<2?"one":"other"}}),a.__addLocaleData({locale:"fr-BE",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-BF",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-BI",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-BJ",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-BL",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-CA",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-CD",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-CF",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-CG",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-CH",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-CI",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-CM",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-DJ",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-DZ",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-GA",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-GF",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-GN",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-GP",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-GQ",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-HT",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-KM",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-LU",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-MA",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-MC",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-MF",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-MG",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-ML",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-MQ",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-MR",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-MU",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-NC",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-NE",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-PF",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-PM",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-RE",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-RW",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-SC",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-SN",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-SY",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-TD",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-TG",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-TN",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-VU",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-WF",parentLocale:"fr"}),a.__addLocaleData({locale:"fr-YT",parentLocale:"fr"}),a.__addLocaleData({locale:"fur",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"fy",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"ga",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e;return t?1==e?"one":"other":1==e?"one":2==e?"two":a&&e>=3&&e<=6?"few":a&&e>=7&&e<=10?"many":"other"}}),a.__addLocaleData({locale:"gd",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e;return t?"other":1==e||11==e?"one":2==e||12==e?"two":a&&e>=3&&e<=10||a&&e>=13&&e<=19?"few":"other"}}),a.__addLocaleData({locale:"gl",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"gsw",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"gsw-FR",parentLocale:"gsw"}),a.__addLocaleData({locale:"gsw-LI",parentLocale:"gsw"}),a.__addLocaleData({locale:"gu",pluralRuleFunction:function(e,t){return t?1==e?"one":2==e||3==e?"two":4==e?"few":6==e?"many":"other":e>=0&&e<=1?"one":"other"}}),a.__addLocaleData({locale:"guw",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"}}),a.__addLocaleData({locale:"guz",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"gv",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=a.slice(-1),i=a.slice(-2);return t?"other":n&&1==o?"one":n&&2==o?"two":!n||0!=i&&20!=i&&40!=i&&60!=i&&80!=i?n?"other":"many":"few"}}),a.__addLocaleData({locale:"ha",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ha-Arab",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ha-GH",parentLocale:"ha"}),a.__addLocaleData({locale:"ha-NE",parentLocale:"ha"}),a.__addLocaleData({locale:"haw",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"he",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=Number(r[0])==e,i=o&&r[0].slice(-1);return t?"other":1==e&&n?"one":2==a&&n?"two":n&&(e<0||e>10)&&o&&0==i?"many":"other"}}),a.__addLocaleData({locale:"hi",pluralRuleFunction:function(e,t){return t?1==e?"one":2==e||3==e?"two":4==e?"few":6==e?"many":"other":e>=0&&e<=1?"one":"other"}}),a.__addLocaleData({locale:"hr",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=a.slice(-2),s=n.slice(-1),u=n.slice(-2);return t?"other":o&&1==i&&11!=l||1==s&&11!=u?"one":o&&i>=2&&i<=4&&(l<12||l>14)||s>=2&&s<=4&&(u<12||u>14)?"few":"other"}}),a.__addLocaleData({locale:"hr-BA",parentLocale:"hr"}),a.__addLocaleData({locale:"hsb",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-2),l=n.slice(-2);return t?"other":o&&1==i||1==l?"one":o&&2==i||2==l?"two":o&&(3==i||4==i)||3==l||4==l?"few":"other"}}),a.__addLocaleData({locale:"hu",pluralRuleFunction:function(e,t){return t?1==e||5==e?"one":"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"hy",pluralRuleFunction:function(e,t){return t?1==e?"one":"other":e>=0&&e<2?"one":"other"}}),a.__addLocaleData({locale:"id",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ig",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ii",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"in",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"is",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=Number(r[0])==e,o=a.slice(-1),i=a.slice(-2);return t?"other":n&&1==o&&11!=i||!n?"one":"other"}}),a.__addLocaleData({locale:"it",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?11==e||8==e||80==e||800==e?"many":"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"it-CH",parentLocale:"it"}),a.__addLocaleData({locale:"it-SM",parentLocale:"it"}),a.__addLocaleData({locale:"iu",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"}}),a.__addLocaleData({locale:"iu-Latn",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"iw",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=Number(r[0])==e,i=o&&r[0].slice(-1);return t?"other":1==e&&n?"one":2==a&&n?"two":n&&(e<0||e>10)&&o&&0==i?"many":"other"}}),a.__addLocaleData({locale:"ja",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"jbo",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"jgo",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ji",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"jmc",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"jv",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"jw",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ka",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=a.slice(-2);return t?1==a?"one":0==a||n>=2&&n<=20||40==n||60==n||80==n?"many":"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"kab",pluralRuleFunction:function(e,t){return t?"other":e>=0&&e<2?"one":"other"}}),a.__addLocaleData({locale:"kaj",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"kam",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"kcg",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"kde",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"kea",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"khq",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ki",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"kk",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e,n=a&&r[0].slice(-1);return t?6==n||9==n||a&&0==n&&0!=e?"many":"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"kkj",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"kl",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"kln",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"km",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"kn",pluralRuleFunction:function(e,t){return t?"other":e>=0&&e<=1?"one":"other"}}),a.__addLocaleData({locale:"ko",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ko-KP",parentLocale:"ko"}),a.__addLocaleData({locale:"kok",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ks",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ksb",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ksf",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ksh",pluralRuleFunction:function(e,t){return t?"other":0==e?"zero":1==e?"one":"other"}}),a.__addLocaleData({locale:"ku",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"kw",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"}}),a.__addLocaleData({locale:"ky",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"lag",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0];return t?"other":0==e?"zero":0!=a&&1!=a||0==e?"other":"one"}}),a.__addLocaleData({locale:"lb",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"lg",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"lkt",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ln",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"}}),a.__addLocaleData({locale:"ln-AO",parentLocale:"ln"}),a.__addLocaleData({locale:"ln-CF",parentLocale:"ln"}),a.__addLocaleData({locale:"ln-CG",parentLocale:"ln"}),a.__addLocaleData({locale:"lo",pluralRuleFunction:function(e,t){return t&&1==e?"one":"other"}}),a.__addLocaleData({locale:"lrc",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"lrc-IQ",parentLocale:"lrc"}),a.__addLocaleData({locale:"lt",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[1]||"",n=Number(r[0])==e,o=n&&r[0].slice(-1),i=n&&r[0].slice(-2);return t?"other":1==o&&(i<11||i>19)?"one":o>=2&&o<=9&&(i<11||i>19)?"few":0!=a?"many":"other"}}),a.__addLocaleData({locale:"lu",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"luo",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"luy",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"lv",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[1]||"",n=a.length,o=Number(r[0])==e,i=o&&r[0].slice(-1),l=o&&r[0].slice(-2),s=a.slice(-2),u=a.slice(-1);return t?"other":o&&0==i||l>=11&&l<=19||2==n&&s>=11&&s<=19?"zero":1==i&&11!=l||2==n&&1==u&&11!=s||2!=n&&1==u?"one":"other"}}),a.__addLocaleData({locale:"mas",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"mas-TZ",parentLocale:"mas"}),a.__addLocaleData({locale:"mer",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"mfe",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"mg",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"}}),a.__addLocaleData({locale:"mgh",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"mgo",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"mk",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=a.slice(-2),s=n.slice(-1);return t?1==i&&11!=l?"one":2==i&&12!=l?"two":7!=i&&8!=i||17==l||18==l?"other":"many":o&&1==i||1==s?"one":"other"}}),a.__addLocaleData({locale:"ml",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"mn",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"mn-Mong",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"mo",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1],n=Number(r[0])==e,o=n&&r[0].slice(-2);return t?1==e?"one":"other":1==e&&a?"one":!a||0==e||1!=e&&o>=1&&o<=19?"few":"other"}}),a.__addLocaleData({locale:"mr",pluralRuleFunction:function(e,t){return t?1==e?"one":2==e||3==e?"two":4==e?"few":"other":e>=0&&e<=1?"one":"other"}}),a.__addLocaleData({locale:"ms",pluralRuleFunction:function(e,t){return t&&1==e?"one":"other"}}),a.__addLocaleData({locale:"ms-Arab",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ms-BN",parentLocale:"ms"}),a.__addLocaleData({locale:"ms-SG",parentLocale:"ms"}),a.__addLocaleData({locale:"mt",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e,n=a&&r[0].slice(-2);return t?"other":1==e?"one":0==e||n>=2&&n<=10?"few":n>=11&&n<=19?"many":"other"}}),a.__addLocaleData({locale:"mua",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"my",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"mzn",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"nah",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"naq",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"}}),a.__addLocaleData({locale:"nb",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"nb-SJ",parentLocale:"nb"}),a.__addLocaleData({locale:"nd",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ne",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e;return t?a&&e>=1&&e<=4?"one":"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ne-IN",parentLocale:"ne"}),a.__addLocaleData({locale:"nl",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"nl-AW",parentLocale:"nl"}),a.__addLocaleData({locale:"nl-BE",parentLocale:"nl"}),a.__addLocaleData({locale:"nl-BQ",parentLocale:"nl"}),a.__addLocaleData({locale:"nl-CW",parentLocale:"nl"});a.__addLocaleData({locale:"nl-SR",parentLocale:"nl"}),a.__addLocaleData({locale:"nl-SX",parentLocale:"nl"}),a.__addLocaleData({locale:"nmg",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"nn",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"nnh",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"no",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"nqo",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"nr",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"nso",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"}}),a.__addLocaleData({locale:"nus",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ny",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"nyn",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"om",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"om-KE",parentLocale:"om"}),a.__addLocaleData({locale:"or",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"os",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"os-RU",parentLocale:"os"}),a.__addLocaleData({locale:"pa",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"}}),a.__addLocaleData({locale:"pa-Arab",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"pa-Guru",parentLocale:"pa"}),a.__addLocaleData({locale:"pap",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"pl",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=a.slice(-1),i=a.slice(-2);return t?"other":1==e&&n?"one":n&&o>=2&&o<=4&&(i<12||i>14)?"few":n&&1!=a&&(0==o||1==o)||n&&o>=5&&o<=9||n&&i>=12&&i<=14?"many":"other"}}),a.__addLocaleData({locale:"prg",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[1]||"",n=a.length,o=Number(r[0])==e,i=o&&r[0].slice(-1),l=o&&r[0].slice(-2),s=a.slice(-2),u=a.slice(-1);return t?"other":o&&0==i||l>=11&&l<=19||2==n&&s>=11&&s<=19?"zero":1==i&&11!=l||2==n&&1==u&&11!=s||2!=n&&1==u?"one":"other"}}),a.__addLocaleData({locale:"ps",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"pt",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e;return t?"other":a&&e>=0&&e<=2&&2!=e?"one":"other"}}),a.__addLocaleData({locale:"pt-AO",parentLocale:"pt-PT"}),a.__addLocaleData({locale:"pt-PT",parentLocale:"pt",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"pt-CV",parentLocale:"pt-PT"}),a.__addLocaleData({locale:"pt-GW",parentLocale:"pt-PT"}),a.__addLocaleData({locale:"pt-MO",parentLocale:"pt-PT"}),a.__addLocaleData({locale:"pt-MZ",parentLocale:"pt-PT"}),a.__addLocaleData({locale:"pt-ST",parentLocale:"pt-PT"}),a.__addLocaleData({locale:"pt-TL",parentLocale:"pt-PT"}),a.__addLocaleData({locale:"qu",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"qu-BO",parentLocale:"qu"}),a.__addLocaleData({locale:"qu-EC",parentLocale:"qu"}),a.__addLocaleData({locale:"rm",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"rn",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ro",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1],n=Number(r[0])==e,o=n&&r[0].slice(-2);return t?1==e?"one":"other":1==e&&a?"one":!a||0==e||1!=e&&o>=1&&o<=19?"few":"other"}}),a.__addLocaleData({locale:"ro-MD",parentLocale:"ro"}),a.__addLocaleData({locale:"rof",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ru",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=a.slice(-1),i=a.slice(-2);return t?"other":n&&1==o&&11!=i?"one":n&&o>=2&&o<=4&&(i<12||i>14)?"few":n&&0==o||n&&o>=5&&o<=9||n&&i>=11&&i<=14?"many":"other"}}),a.__addLocaleData({locale:"ru-BY",parentLocale:"ru"}),a.__addLocaleData({locale:"ru-KG",parentLocale:"ru"}),a.__addLocaleData({locale:"ru-KZ",parentLocale:"ru"}),a.__addLocaleData({locale:"ru-MD",parentLocale:"ru"}),a.__addLocaleData({locale:"ru-UA",parentLocale:"ru"}),a.__addLocaleData({locale:"rw",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"rwk",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"sah",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"saq",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"sbp",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"sdh",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"se",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"}}),a.__addLocaleData({locale:"se-FI",parentLocale:"se"}),a.__addLocaleData({locale:"se-SE",parentLocale:"se"}),a.__addLocaleData({locale:"seh",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ses",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"sg",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"sh",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=a.slice(-2),s=n.slice(-1),u=n.slice(-2);return t?"other":o&&1==i&&11!=l||1==s&&11!=u?"one":o&&i>=2&&i<=4&&(l<12||l>14)||s>=2&&s<=4&&(u<12||u>14)?"few":"other"}}),a.__addLocaleData({locale:"shi",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e;return t?"other":e>=0&&e<=1?"one":a&&e>=2&&e<=10?"few":"other"}}),a.__addLocaleData({locale:"shi-Latn",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"shi-Tfng",parentLocale:"shi"}),a.__addLocaleData({locale:"si",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"";return t?"other":0==e||1==e||0==a&&1==n?"one":"other"}}),a.__addLocaleData({locale:"sk",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1];return t?"other":1==e&&n?"one":a>=2&&a<=4&&n?"few":n?"other":"many"}}),a.__addLocaleData({locale:"sl",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=a.slice(-2);return t?"other":n&&1==o?"one":n&&2==o?"two":n&&(3==o||4==o)||!n?"few":"other"}}),a.__addLocaleData({locale:"sma",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"}}),a.__addLocaleData({locale:"smi",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"}}),a.__addLocaleData({locale:"smj",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"}}),a.__addLocaleData({locale:"smn",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"}}),a.__addLocaleData({locale:"sms",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":2==e?"two":"other"}}),a.__addLocaleData({locale:"sn",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"so",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"so-DJ",parentLocale:"so"}),a.__addLocaleData({locale:"so-ET",parentLocale:"so"}),a.__addLocaleData({locale:"so-KE",parentLocale:"so"}),a.__addLocaleData({locale:"sq",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e,n=a&&r[0].slice(-1),o=a&&r[0].slice(-2);return t?1==e?"one":4==n&&14!=o?"many":"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"sq-MK",parentLocale:"sq"}),a.__addLocaleData({locale:"sq-XK",parentLocale:"sq"}),a.__addLocaleData({locale:"sr",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=a.slice(-2),s=n.slice(-1),u=n.slice(-2);return t?"other":o&&1==i&&11!=l||1==s&&11!=u?"one":o&&i>=2&&i<=4&&(l<12||l>14)||s>=2&&s<=4&&(u<12||u>14)?"few":"other"}}),a.__addLocaleData({locale:"sr-Cyrl",parentLocale:"sr"}),a.__addLocaleData({locale:"sr-Cyrl-BA",parentLocale:"sr-Cyrl"}),a.__addLocaleData({locale:"sr-Cyrl-ME",parentLocale:"sr-Cyrl"}),a.__addLocaleData({locale:"sr-Cyrl-XK",parentLocale:"sr-Cyrl"}),a.__addLocaleData({locale:"sr-Latn",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"sr-Latn-BA",parentLocale:"sr-Latn"}),a.__addLocaleData({locale:"sr-Latn-ME",parentLocale:"sr-Latn"}),a.__addLocaleData({locale:"sr-Latn-XK",parentLocale:"sr-Latn"}),a.__addLocaleData({locale:"ss",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ssy",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"st",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"sv",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1],n=Number(r[0])==e,o=n&&r[0].slice(-1),i=n&&r[0].slice(-2);return t?1!=o&&2!=o||11==i||12==i?"other":"one":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"sv-AX",parentLocale:"sv"}),a.__addLocaleData({locale:"sv-FI",parentLocale:"sv"}),a.__addLocaleData({locale:"sw",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"sw-CD",parentLocale:"sw"}),a.__addLocaleData({locale:"sw-KE",parentLocale:"sw"}),a.__addLocaleData({locale:"sw-UG",parentLocale:"sw"}),a.__addLocaleData({locale:"syr",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ta",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"ta-LK",parentLocale:"ta"}),a.__addLocaleData({locale:"ta-MY",parentLocale:"ta"}),a.__addLocaleData({locale:"ta-SG",parentLocale:"ta"}),a.__addLocaleData({locale:"te",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"teo",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"teo-KE",parentLocale:"teo"}),a.__addLocaleData({locale:"th",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"ti",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"}}),a.__addLocaleData({locale:"ti-ER",parentLocale:"ti"}),a.__addLocaleData({locale:"tig",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"tk",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"tl",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=r[1]||"",o=!r[1],i=a.slice(-1),l=n.slice(-1);return t?1==e?"one":"other":o&&(1==a||2==a||3==a)||o&&4!=i&&6!=i&&9!=i||!o&&4!=l&&6!=l&&9!=l?"one":"other"}}),a.__addLocaleData({locale:"tn",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"to",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"tr",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"tr-CY",parentLocale:"tr"}),a.__addLocaleData({locale:"ts",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"twq",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"tzm",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=Number(r[0])==e;return t?"other":0==e||1==e||a&&e>=11&&e<=99?"one":"other"}}),a.__addLocaleData({locale:"ug",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"uk",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=r[0],n=!r[1],o=Number(r[0])==e,i=o&&r[0].slice(-1),l=o&&r[0].slice(-2),s=a.slice(-1),u=a.slice(-2);return t?3==i&&13!=l?"few":"other":n&&1==s&&11!=u?"one":n&&s>=2&&s<=4&&(u<12||u>14)?"few":n&&0==s||n&&s>=5&&s<=9||n&&u>=11&&u<=14?"many":"other"}}),a.__addLocaleData({locale:"ur",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"ur-IN",parentLocale:"ur"}),a.__addLocaleData({locale:"uz",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"uz-Arab",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"uz-Cyrl",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"uz-Latn",parentLocale:"uz"}),a.__addLocaleData({locale:"vai",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"vai-Latn",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"vai-Vaii",parentLocale:"vai"}),a.__addLocaleData({locale:"ve",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"vi",pluralRuleFunction:function(e,t){return t&&1==e?"one":"other"}}),a.__addLocaleData({locale:"vo",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"vun",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"wa",pluralRuleFunction:function(e,t){return t?"other":0==e||1==e?"one":"other"}}),a.__addLocaleData({locale:"wae",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"wo",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"xh",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"xog",pluralRuleFunction:function(e,t){return t?"other":1==e?"one":"other"}}),a.__addLocaleData({locale:"yav",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"yi",pluralRuleFunction:function(e,t){var r=String(e).split("."),a=!r[1];return t?"other":1==e&&a?"one":"other"}}),a.__addLocaleData({locale:"yo",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"yo-BJ",parentLocale:"yo"}),a.__addLocaleData({locale:"zgh",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"zh",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"zh-Hans",parentLocale:"zh"}),a.__addLocaleData({locale:"zh-Hans-HK",parentLocale:"zh-Hans"}),a.__addLocaleData({locale:"zh-Hans-MO",parentLocale:"zh-Hans"}),a.__addLocaleData({locale:"zh-Hans-SG",parentLocale:"zh-Hans"}),a.__addLocaleData({locale:"zh-Hant",pluralRuleFunction:function(e,t){return"other"}}),a.__addLocaleData({locale:"zh-Hant-HK",parentLocale:"zh-Hant"}),a.__addLocaleData({locale:"zh-Hant-MO",parentLocale:"zh-Hant-HK"}),a.__addLocaleData({locale:"zu",pluralRuleFunction:function(e,t){return t?"other":e>=0&&e<=1?"one":"other"}})},function(e,t,r){"use strict";var a=r(410),n=r(1135);a.default.__addLocaleData(n.default),a.default.defaultLocale="en",t.default=a.default},function(e,t,r){"use strict";function a(){var e=this.constructor.getDerivedStateFromProps(this.props,this.state);null!==e&&void 0!==e&&this.setState(e)}function n(e){function t(t){var r=this.constructor.getDerivedStateFromProps(e,t);return null!==r&&void 0!==r?r:null}this.setState(t.bind(this))}function o(e,t){try{var r=this.props,a=this.state;this.props=e,this.state=t,this.__reactInternalSnapshotFlag=!0,this.__reactInternalSnapshot=this.getSnapshotBeforeUpdate(r,a)}finally{this.props=r,this.state=a}}function i(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)return e;var r=null,i=null,l=null;if("function"==typeof t.componentWillMount?r="componentWillMount":"function"==typeof t.UNSAFE_componentWillMount&&(r="UNSAFE_componentWillMount"),"function"==typeof t.componentWillReceiveProps?i="componentWillReceiveProps":"function"==typeof t.UNSAFE_componentWillReceiveProps&&(i="UNSAFE_componentWillReceiveProps"),"function"==typeof t.componentWillUpdate?l="componentWillUpdate":"function"==typeof t.UNSAFE_componentWillUpdate&&(l="UNSAFE_componentWillUpdate"),null!==r||null!==i||null!==l){var s=e.displayName||e.name,u="function"==typeof e.getDerivedStateFromProps?"getDerivedStateFromProps()":"getSnapshotBeforeUpdate()";throw Error("Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n"+s+" uses "+u+" but also contains the following legacy lifecycles:"+(null!==r?"\n "+r:"")+(null!==i?"\n "+i:"")+(null!==l?"\n "+l:"")+"\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=a,t.componentWillReceiveProps=n),"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=o;var h=t.componentDidUpdate;t.componentDidUpdate=function(e,t,r){var a=this.__reactInternalSnapshotFlag?this.__reactInternalSnapshot:r;h.call(this,e,t,a)}}return e}Object.defineProperty(t,"__esModule",{value:!0}),a.__suppressDeprecationWarning=!0,n.__suppressDeprecationWarning=!0,o.__suppressDeprecationWarning=!0,t.polyfill=i},function(e,t,r){"use strict";function a(e,t){for(var r=Object.getOwnPropertyNames(t),a=0;a<r.length;a++){var n=r[a],o=Object.getOwnPropertyDescriptor(t,n);o&&o.configurable&&void 0===e[n]&&Object.defineProperty(e,n,o)}return e}function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!==(void 0===t?"undefined":u(t))&&"function"!=typeof t?e:t}function l(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":u(t)));e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):a(e,t))}function s(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"store",r=arguments[1],a=r||t+"Subscription",n=function(e){function r(a,n){o(this,r);var l=i(this,e.call(this,a,n));return l[t]=a.store,l}return l(r,e),r.prototype.getChildContext=function(){var e;return e={},e[t]=this[t],e[a]=null,e},r.prototype.render=function(){return h.Children.only(this.props.children)},r}(h.Component);return n.propTypes={store:m.storeShape.isRequired,children:d.default.element.isRequired},n.childContextTypes=(e={},e[t]=m.storeShape.isRequired,e[a]=m.subscriptionShape,e),n}var u="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.__esModule=!0,t.createProvider=s;var h=r(15),c=r(21),d=n(c),m=r(414);n(r(268)),t.default=s()},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function n(e,t){var r={};for(var a in e)t.indexOf(a)>=0||Object.prototype.hasOwnProperty.call(e,a)&&(r[a]=e[a]);return r}function o(e,t,r){for(var a=t.length-1;a>=0;a--){var n=t[a](e);if(n)return n}return function(t,a){throw new Error("Invalid value of type "+(void 0===e?"undefined":s(e))+" for "+r+" argument when connecting component "+a.wrappedComponentName+".")}}function i(e,t){return e===t}function l(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.connectHOC,r=void 0===t?c.default:t,a=e.mapStateToPropsFactories,l=void 0===a?y.default:a,s=e.mapDispatchToPropsFactories,h=void 0===s?f.default:s,d=e.mergePropsFactories,p=void 0===d?_.default:d,v=e.selectorFactory,g=void 0===v?x.default:v;return function(e,t,a){var s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},c=s.pure,d=void 0===c||c,f=s.areStatesEqual,v=void 0===f?i:f,y=s.areOwnPropsEqual,_=void 0===y?m.default:y,T=s.areStatePropsEqual,x=void 0===T?m.default:T,w=s.areMergedPropsEqual,N=void 0===w?m.default:w,b=n(s,["pure","areStatesEqual","areOwnPropsEqual","areStatePropsEqual","areMergedPropsEqual"]),L=o(e,l,"mapStateToProps"),S=o(t,h,"mapDispatchToProps"),k=o(a,p,"mergeProps");return r(g,u({methodName:"connect",getDisplayName:function(e){return"Connect("+e+")"},shouldHandleStateChanges:Boolean(e),initMapStateToProps:L,initMapDispatchToProps:S,initMergeProps:k,pure:d,areStatesEqual:v,areOwnPropsEqual:_,areStatePropsEqual:x,areMergedPropsEqual:N},b))}}var s="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.__esModule=!0;var u=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e};t.createConnect=l;var h=r(412),c=a(h),d=r(1148),m=a(d),p=r(1142),f=a(p),v=r(1143),y=a(v),g=r(1144),_=a(g),T=r(1145),x=a(T);t.default=l()},function(e,t,r){"use strict";function a(e){return"function"==typeof e?(0,s.wrapMapToPropsFunc)(e,"mapDispatchToProps"):void 0}function n(e){return e?void 0:(0,s.wrapMapToPropsConstant)(function(e){return{dispatch:e}})}function o(e){return e&&"object"===(void 0===e?"undefined":i(e))?(0,s.wrapMapToPropsConstant)(function(t){return(0,l.bindActionCreators)(e,t)}):void 0}var i="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.__esModule=!0,t.whenMapDispatchToPropsIsFunction=a,t.whenMapDispatchToPropsIsMissing=n,t.whenMapDispatchToPropsIsObject=o;var l=r(280),s=r(413);t.default=[a,n,o]},function(e,t,r){"use strict";function a(e){return"function"==typeof e?(0,o.wrapMapToPropsFunc)(e,"mapStateToProps"):void 0}function n(e){return e?void 0:(0,o.wrapMapToPropsConstant)(function(){return{}})}t.__esModule=!0,t.whenMapStateToPropsIsFunction=a,t.whenMapStateToPropsIsMissing=n;var o=r(413);t.default=[a,n]},function(e,t,r){"use strict";function a(e,t,r){return l({},r,e,t)}function n(e){return function(t,r){var a=(r.displayName,r.pure),n=r.areMergedPropsEqual,o=!1,i=void 0;return function(t,r,l){var s=e(t,r,l);return o?a&&n(s,i)||(i=s):(o=!0,i=s),i}}}function o(e){return"function"==typeof e?n(e):void 0}function i(e){return e?void 0:function(){return a}}t.__esModule=!0;var l=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e};t.defaultMergeProps=a,t.wrapMergePropsFunc=n,t.whenMergePropsIsFunction=o,t.whenMergePropsIsOmitted=i;var s=r(415);!function(e){e&&e.__esModule}(s),t.default=[o,i]},function(e,t,r){"use strict";function a(e,t){var r={};for(var a in e)t.indexOf(a)>=0||Object.prototype.hasOwnProperty.call(e,a)&&(r[a]=e[a]);return r}function n(e,t,r,a){return function(n,o){return r(e(n,o),t(a,o),o)}}function o(e,t,r,a,n){function o(n,o){return p=n,f=o,v=e(p,f),y=t(a,f),g=r(v,y,f),m=!0,g}function i(){return v=e(p,f),t.dependsOnOwnProps&&(y=t(a,f)),g=r(v,y,f)}function l(){return e.dependsOnOwnProps&&(v=e(p,f)),t.dependsOnOwnProps&&(y=t(a,f)),g=r(v,y,f)}function s(){var t=e(p,f),a=!d(t,v);return v=t,a&&(g=r(v,y,f)),g}function u(e,t){var r=!c(t,f),a=!h(e,p);return p=e,f=t,r&&a?i():r?l():a?s():g}var h=n.areStatesEqual,c=n.areOwnPropsEqual,d=n.areStatePropsEqual,m=!1,p=void 0,f=void 0,v=void 0,y=void 0,g=void 0;return function(e,t){return m?u(e,t):o(e,t)}}function i(e,t){var r=t.initMapStateToProps,i=t.initMapDispatchToProps,l=t.initMergeProps,s=a(t,["initMapStateToProps","initMapDispatchToProps","initMergeProps"]),u=r(e,s),h=i(e,s),c=l(e,s);return(s.pure?o:n)(u,h,c,e,s)}t.__esModule=!0,t.impureFinalPropsSelectorFactory=n,t.pureFinalPropsSelectorFactory=o,t.default=i;var l=r(1146);!function(e){e&&e.__esModule}(l)},function(e,t,r){"use strict";function a(e,t,r){if(!e)throw new Error("Unexpected value for "+t+" in "+r+".");"mapStateToProps"!==t&&"mapDispatchToProps"!==t||e.hasOwnProperty("dependsOnOwnProps")||(0,i.default)("The selector for "+t+" of "+r+" did not specify a value for dependsOnOwnProps.")}function n(e,t,r,n){a(e,"mapStateToProps",n),a(t,"mapDispatchToProps",n),a(r,"mergeProps",n)}t.__esModule=!0,t.default=n;var o=r(268),i=function(e){return e&&e.__esModule?e:{default:e}}(o)},function(e,t,r){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(){var e=[],t=[];return{clear:function(){t=o,e=o},notify:function(){for(var r=e=t,a=0;a<r.length;a++)r[a]()},get:function(){return t},subscribe:function(r){var a=!0;return t===e&&(t=e.slice()),t.push(r),function(){a&&e!==o&&(a=!1,t===e&&(t=e.slice()),t.splice(t.indexOf(r),1))}}}}t.__esModule=!0;var o=null,i={notify:function(){}},l=function(){function e(t,r,n){a(this,e),this.store=t,this.parentSub=r,this.onStateChange=n,this.unsubscribe=null,this.listeners=i}return e.prototype.addNestedSub=function(e){return this.trySubscribe(),this.listeners.subscribe(e)},e.prototype.notifyNestedSubs=function(){this.listeners.notify()},e.prototype.isSubscribed=function(){return Boolean(this.unsubscribe)},e.prototype.trySubscribe=function(){this.unsubscribe||(this.unsubscribe=this.parentSub?this.parentSub.addNestedSub(this.onStateChange):this.store.subscribe(this.onStateChange),this.listeners=n())},e.prototype.tryUnsubscribe=function(){this.unsubscribe&&(this.unsubscribe(),this.unsubscribe=null,this.listeners.clear(),this.listeners=i)},e}();t.default=l},function(e,t,r){"use strict";function a(e,t){return e===t?0!==e||0!==t||1/e==1/t:e!==e&&t!==t}function n(e,t){if(a(e,t))return!0;if("object"!==(void 0===e?"undefined":o(e))||null===e||"object"!==(void 0===t?"undefined":o(t))||null===t)return!1;var r=Object.keys(e),n=Object.keys(t);if(r.length!==n.length)return!1;for(var l=0;l<r.length;l++)if(!i.call(t,r[l])||!a(e[r[l]],t[r[l]]))return!1;return!0}var o="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.__esModule=!0,t.default=n;var i=Object.prototype.hasOwnProperty},function(e,t,r){"use strict";function a(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t<e.length;t++)r[t]=e[t];return r}return Array.from(e)}function n(e){return function(){return function(t){return function(r){if(r.type!==o.CALL_HISTORY_METHOD)return t(r);var n=r.payload,i=n.method,l=n.args;e[i].apply(e,a(l))}}}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=n;var o=r(416)},function(e,t,r){"use strict";function a(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=r.selectLocationState,l=void 0===a?i:a,s=r.adjustUrlOnReplay,u=void 0===s||s;if(void 0===l(t.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.");var h=void 0,c=void 0,d=void 0,m=void 0,p=void 0,f=function(e){return l(t.getState()).locationBeforeTransitions||(e?h:void 0)};if(h=f(),u){var v=function(){var t=f(!0);p!==t&&h!==t&&(c=!0,p=t,e.transitionTo(n({},t,{action:"PUSH"})),c=!1)};d=t.subscribe(v),v()}var y=function(e){c||(p=e,!h&&(h=e,f())||t.dispatch({type:o.LOCATION_CHANGE,payload:e}))};return m=e.listen(y),e.getCurrentLocation&&y(e.getCurrentLocation()),n({},e,{listen:function(r){var a=f(!0),n=!1,o=t.subscribe(function(){var e=f(!0);e!==a&&(a=e,n||r(a))});return e.getCurrentLocation||r(a),function(){n=!0,o()}},unsubscribe:function(){u&&d(),m()}})}Object.defineProperty(t,"__esModule",{value:!0});var n=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e};t.default=a;var o=r(417),i=function(e){return e.routing}},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var n=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},o=r(15),i=a(o),l=r(57),s=a(l),u=r(418),h=a(u),c=(0,s.default)({displayName:"IndexLink",render:function(){return i.default.createElement(h.default,n({},this.props,{onlyActiveOnIndex:!0}))}});t.default=c,e.exports=t.default},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var n=r(57),o=a(n),i=r(21),l=r(119),s=(a(l),r(28)),u=a(s),h=r(420),c=a(h),d=r(138),m=(0,o.default)({displayName:"IndexRedirect",statics:{createRouteFromReactElement:function(e,t){t&&(t.indexRoute=c.default.createRouteFromReactElement(e))}},propTypes:{to:i.string.isRequired,query:i.object,state:i.object,onEnter:d.falsy,children:d.falsy},render:function(){(0,u.default)(!1)}});t.default=m,e.exports=t.default},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var n=r(57),o=a(n),i=r(21),l=r(119),s=(a(l),r(28)),u=a(s),h=r(74),c=r(138),d=(0,o.default)({displayName:"IndexRoute",statics:{createRouteFromReactElement:function(e,t){t&&(t.indexRoute=(0,h.createRouteFromReactElement)(e))}},propTypes:{path:c.falsy,component:c.component,components:c.components,getComponent:i.func,getComponents:i.func},render:function(){(0,u.default)(!1)}});t.default=d,e.exports=t.default},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var n=r(57),o=a(n),i=r(21),l=r(28),s=a(l),u=r(74),h=r(138),c=(0,o.default)({displayName:"Route",statics:{createRouteFromReactElement:u.createRouteFromReactElement},propTypes:{path:i.string,component:h.component,components:h.components,getComponent:i.func,getComponents:i.func},render:function(){(0,s.default)(!1)}});t.default=c,e.exports=t.default},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function n(e,t){var r={};for(var a in e)t.indexOf(a)>=0||Object.prototype.hasOwnProperty.call(e,a)&&(r[a]=e[a]);return r}t.__esModule=!0;var o=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},i=r(28),l=a(i),s=r(15),u=a(s),h=r(57),c=a(h),d=r(21),m=r(424),p=a(m),f=r(138),v=r(272),y=a(v),g=r(74),_=r(421),T=r(119),x=(a(T),{history:d.object,children:f.routes,routes:f.routes,render:d.func,createElement:d.func,onError:d.func,onUpdate:d.func,matchContext:d.object}),w=(0,c.default)({displayName:"Router",propTypes:x,getDefaultProps:function(){return{render:function(e){return u.default.createElement(y.default,e)}}},getInitialState:function(){return{location:null,routes:null,params:null,components:null}},handleError:function(e){if(!this.props.onError)throw e;this.props.onError.call(this,e)},createRouterObject:function(e){var t=this.props.matchContext;if(t)return t.router;var r=this.props.history;return(0,_.createRouterObject)(r,this.transitionManager,e)},createTransitionManager:function(){var e=this.props.matchContext;if(e)return e.transitionManager;var t=this.props.history,r=this.props,a=r.routes,n=r.children;return t.getCurrentLocation||(0,l.default)(!1),(0,p.default)(t,(0,g.createRoutes)(a||n))},componentWillMount:function(){var e=this;this.transitionManager=this.createTransitionManager(),this.router=this.createRouterObject(this.state),this._unlisten=this.transitionManager.listen(function(t,r){t?e.handleError(t):((0,_.assignRouterState)(e.router,r),e.setState(r,e.props.onUpdate))})},componentWillReceiveProps:function(e){},componentWillUnmount:function(){this._unlisten&&this._unlisten()},render:function(){var e=this.state,t=e.location,r=e.routes,a=e.params,i=e.components,l=this.props,s=l.createElement,u=l.render,h=n(l,["createElement","render"]);return null==t?null:(Object.keys(x).forEach(function(e){return delete h[e]}),u(o({},h,{router:this.router,location:t,routes:r,params:a,components:i,createElement:s})))}});t.default=w,e.exports=t.default},function(e,t,r){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(){function e(e,t,r,a){var n=e.length<r,o=function(){for(var r=arguments.length,a=Array(r),o=0;o<r;o++)a[o]=arguments[o];e.apply(t,a),n&&(0,a[a.length-1])()};return a.add(o),o}function t(t){return t.reduce(function(t,r){return r.onEnter&&t.push(e(r.onEnter,r,3,u)),t},[])}function r(t){return t.reduce(function(t,r){return r.onChange&&t.push(e(r.onChange,r,4,h)),t},[])}function a(e,t,r){function a(e){n=e}if(!e)return void r();var n=void 0;(0,o.loopAsync)(e,function(e,r,o){t(e,a,function(e){e||n?o(e,n):r()})},r)}function n(e,r,n){u.clear();var o=t(e);return a(o.length,function(e,t,a){var n=function(){u.has(o[e])&&(a.apply(void 0,arguments),u.remove(o[e]))};o[e](r,t,n)},n)}function l(e,t,n,o){h.clear();var i=r(e);return a(i.length,function(e,r,a){var o=function(){h.has(i[e])&&(a.apply(void 0,arguments),h.remove(i[e]))};i[e](t,n,r,o)},o)}function s(e,t){for(var r=0,a=e.length;r<a;++r)e[r].onLeave&&e[r].onLeave.call(e[r],t)}var u=new i,h=new i;return{runEnterHooks:n,runChangeHooks:l,runLeaveHooks:s}}t.__esModule=!0,t.default=n;var o=r(269),i=function e(){var t=this;a(this,e),this.hooks=[],this.add=function(e){return t.hooks.push(e)},this.remove=function(e){return t.hooks=t.hooks.filter(function(t){return t!==e})},this.has=function(e){return-1!==t.hooks.indexOf(e)},this.clear=function(){return t.hooks=[]}};e.exports=t.default},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var n=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},o=r(15),i=a(o),l=r(272),s=a(l);a(r(119)),t.default=function(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];var a=t.map(function(e){return e.renderRouterContext}).filter(Boolean),l=t.map(function(e){return e.renderRouteComponent}).filter(Boolean),u=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:o.createElement;return function(t,r){return l.reduceRight(function(e,t){return t(e,r)},e(t,r))}};return function(e){return a.reduceRight(function(t,r){return r(t,e)},i.default.createElement(s.default,n({},e,{createElement:u(e.createElement)})))}},e.exports=t.default},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var n=r(983),o=a(n),i=r(423),l=a(i);t.default=(0,l.default)(o.default),e.exports=t.default},function(e,t,r){"use strict";function a(e,t,r){return!!e.path&&(0,o.getParamNames)(e.path).some(function(e){return t.params[e]!==r.params[e]})}function n(e,t){var r=e&&e.routes,n=t.routes,o=void 0,i=void 0,l=void 0;if(r){var s=!1;o=r.filter(function(r){if(s)return!0;var o=-1===n.indexOf(r)||a(r,e,t);return o&&(s=!0),o}),o.reverse(),l=[],i=[],n.forEach(function(e){var t=-1===r.indexOf(e),a=-1!==o.indexOf(e);t||a?l.push(e):i.push(e)})}else o=[],i=[],l=n;return{leaveRoutes:o,changeRoutes:i,enterRoutes:l}}t.__esModule=!0;var o=r(118);t.default=n,e.exports=t.default},function(e,t,r){"use strict";function a(e,t,r){if(t.component||t.components)return void r(null,t.component||t.components);var a=t.getComponent||t.getComponents;if(a){var n=a.call(t,e,r);(0,i.isPromise)(n)&&n.then(function(e){return r(null,e)},r)}else r()}function n(e,t){(0,o.mapAsync)(e.routes,function(t,r,n){a(e,t,n)},t)}t.__esModule=!0;var o=r(269),i=r(419);t.default=n,e.exports=t.default},function(e,t,r){"use strict";function a(e,t){var r={};return e.path?((0,n.getParamNames)(e.path).forEach(function(e){Object.prototype.hasOwnProperty.call(t,e)&&(r[e]=t[e])}),r):r}t.__esModule=!0;var n=r(118);t.default=a,e.exports=t.default},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var n=r(984),o=a(n),i=r(423),l=a(i);t.default=(0,l.default)(o.default),e.exports=t.default},function(e,t,r){"use strict";function a(e,t){if(e==t)return!0;if(null==e||null==t)return!1;if(Array.isArray(e))return Array.isArray(t)&&e.length===t.length&&e.every(function(e,r){return a(e,t[r])});if("object"===(void 0===e?"undefined":u(e))){for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r))if(void 0===e[r]){if(void 0!==t[r])return!1}else{if(!Object.prototype.hasOwnProperty.call(t,r))return!1;if(!a(e[r],t[r]))return!1}return!0}return String(e)===String(t)}function n(e,t){return"/"!==t.charAt(0)&&(t="/"+t),"/"!==e.charAt(e.length-1)&&(e+="/"),"/"!==t.charAt(t.length-1)&&(t+="/"),t===e}function o(e,t,r){for(var a=e,n=[],o=[],i=0,l=t.length;i<l;++i){var s=t[i],u=s.path||"";if("/"===u.charAt(0)&&(a=e,n=[],o=[]),null!==a&&u){var c=(0,h.matchPattern)(u,a);if(c?(a=c.remainingPathname,n=[].concat(n,c.paramNames),o=[].concat(o,c.paramValues)):a=null,""===a)return n.every(function(e,t){return String(o[t])===String(r[e])})}}return!1}function i(e,t){return null==t?null==e:null==e||a(e,t)}function l(e,t,r,a,l){var s=e.pathname,u=e.query;return null!=r&&("/"!==s.charAt(0)&&(s="/"+s),!!(n(s,r.pathname)||!t&&o(s,a,l))&&i(u,r.query))}var s="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.__esModule=!0;var u="function"==typeof Symbol&&"symbol"===s(Symbol.iterator)?function(e){return void 0===e?"undefined":s(e)}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":void 0===e?"undefined":s(e)};t.default=l;var h=r(118);e.exports=t.default},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function n(e,t){var r={};for(var a in e)t.indexOf(a)>=0||Object.prototype.hasOwnProperty.call(e,a)&&(r[a]=e[a]);return r}function o(e,t){var r=e.history,a=e.routes,o=e.location,s=n(e,["history","routes","location"]);r||o||(0,u.default)(!1),r=r||(0,c.default)(s);var h=(0,m.default)(r,(0,p.createRoutes)(a));o=o?r.createLocation(o):r.getCurrentLocation(),h.match(o,function(e,a,n){var o=void 0;if(n){var s=(0,f.createRouterObject)(r,h,n);o=i({},n,{router:s,matchContext:{transitionManager:h,router:s}})}t(e,a&&r.createLocation(a,l.REPLACE),o)})}t.__esModule=!0;var i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e},l=r(173),s=r(28),u=a(s),h=r(422),c=a(h),d=r(424),m=a(d),p=r(74),f=r(421);t.default=o,e.exports=t.default},function(e,t,r){"use strict";function a(e,t,r,a,n){if(e.childRoutes)return[null,e.childRoutes];if(!e.getChildRoutes)return[];var o=!0,l=void 0,s={location:t,params:i(r,a)},u=e.getChildRoutes(s,function(e,t){if(t=!e&&(0,p.createRoutes)(t),o)return void(l=[e,t]);n(e,t)});return(0,c.isPromise)(u)&&u.then(function(e){return n(null,(0,p.createRoutes)(e))},n),o=!1,l}function n(e,t,r,o,l){if(e.indexRoute)l(null,e.indexRoute);else if(e.getIndexRoute){var s={location:t,params:i(r,o)},u=e.getIndexRoute(s,function(e,t){l(e,!e&&(0,p.createRoutes)(t)[0])});(0,c.isPromise)(u)&&u.then(function(e){return l(null,(0,p.createRoutes)(e)[0])},l)}else if(e.childRoutes||e.getChildRoutes){var d=function(e,a){if(e)return void l(e);var i=a.filter(function(e){return!e.path});(0,h.loopAsync)(i.length,function(e,a,l){n(i[e],t,r,o,function(t,r){if(t||r){var n=[i[e]].concat(Array.isArray(r)?r:[r]);l(t,n)}else a()})},function(e,t){l(null,t)})},m=a(e,t,r,o,d);m&&d.apply(void 0,m)}else l()}function o(e,t,r){return t.reduce(function(e,t,a){var n=r&&r[a];return Array.isArray(e[t])?e[t].push(n):e[t]=t in e?[e[t],n]:n,e},e)}function i(e,t){return o({},e,t)}function l(e,t,r,o,l,u){var h=e.path||"";if("/"===h.charAt(0)&&(r=t.pathname,o=[],l=[]),null!==r&&h){try{var c=(0,d.matchPattern)(h,r);c?(r=c.remainingPathname,o=[].concat(o,c.paramNames),l=[].concat(l,c.paramValues)):r=null}catch(e){u(e)}if(""===r){var m={routes:[e],params:i(o,l)};return void n(e,t,o,l,function(e,t){if(e)u(e);else{if(Array.isArray(t)){var r;(r=m.routes).push.apply(r,t)}else t&&m.routes.push(t);u(null,m)}})}}if(null!=r||e.childRoutes){var p=function(a,n){a?u(a):n?s(n,t,function(t,r){t?u(t):r?(r.routes.unshift(e),u(null,r)):u()},r,o,l):u()},f=a(e,t,o,l,p);f&&p.apply(void 0,f)}else u()}function s(e,t,r,a){var n=arguments.length>4&&void 0!==arguments[4]?arguments[4]:[],o=arguments.length>5&&void 0!==arguments[5]?arguments[5]:[];void 0===a&&("/"!==t.pathname.charAt(0)&&(t=u({},t,{pathname:"/"+t.pathname})),a=t.pathname),(0,h.loopAsync)(e.length,function(r,i,s){l(e[r],t,a,n,o,function(e,t){e||t?s(e,t):i()})},r)}t.__esModule=!0;var u=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e};t.default=s;var h=r(269),c=r(419),d=r(118),m=r(119),p=(function(e){e&&e.__esModule}(m),r(74));e.exports=t.default},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function n(e){return e.displayName||e.name||"Component"}function o(e,t){var r=t&&t.withRef,a=(0,d.default)({displayName:"WithRouter",mixins:[(0,f.ContextSubscriber)("router")],contextTypes:{router:v.routerShape},propTypes:{router:v.routerShape},getWrappedInstance:function(){return r||(0,s.default)(!1),this.wrappedInstance},render:function(){var t=this,a=this.props.router||this.context.router;if(!a)return h.default.createElement(e,this.props);var n=a.params,o=a.location,l=a.routes,s=i({},this.props,{router:a,params:n,location:o,routes:l});return r&&(s.ref=function(e){t.wrappedInstance=e}),h.default.createElement(e,s)}});return a.displayName="withRouter("+n(e)+")",a.WrappedComponent=e,(0,p.default)(a,e)}t.__esModule=!0;var i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e};t.default=o;var l=r(28),s=a(l),u=r(15),h=a(u),c=r(57),d=a(c),m=r(258),p=a(m),f=r(270),v=r(271);e.exports=t.default},function(e,t,r){"use strict";var a=function(){};e.exports=a},function(e,t,r){"use strict";function a(e,t,r,a,n,o,i,l){if(!e){if(e=void 0,void 0===t)e=Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var s=[r,a,n,o,i,l],u=0;e=Error(t.replace(/%s/g,function(){return s[u++]})),e.name="Invariant Violation"}throw e.framesToPop=1,e}}function n(e){for(var t=arguments.length-1,r="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=0;n<t;n++)r+="&args[]="+encodeURIComponent(arguments[n+1]);a(!1,"Minified React error #"+e+"; visit %s for the full message or use the non-minified dev environment for full errors and additional helpful warnings. ",r)}function o(e,t,r){this.props=e,this.context=t,this.refs=E,this.updater=r||R}function i(){}function l(e,t,r){this.props=e,this.context=t,this.refs=E,this.updater=r||R}function s(e,t,r){var a=void 0,n={},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)F.call(t,a)&&!j.hasOwnProperty(a)&&(n[a]=t[a]);var l=arguments.length-2;if(1===l)n.children=r;else if(1<l){for(var s=Array(l),u=0;u<l;u++)s[u]=arguments[u+2];n.children=s}if(e&&e.defaultProps)for(a in l=e.defaultProps)void 0===n[a]&&(n[a]=l[a]);return{$$typeof:b,type:e,key:o,ref:i,props:n,_owner:O.current}}function u(e,t){return{$$typeof:b,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}function h(e){return"object"===(void 0===e?"undefined":x(e))&&null!==e&&e.$$typeof===b}function c(e){var t={"=":"=0",":":"=2"};return"$"+(""+e).replace(/[=:]/g,function(e){return t[e]})}function d(e,t,r,a){if(H.length){var n=H.pop();return n.result=e,n.keyPrefix=t,n.func=r,n.context=a,n.count=0,n}return{result:e,keyPrefix:t,func:r,context:a,count:0}}function m(e){e.result=null,e.keyPrefix=null,e.func=null,e.context=null,e.count=0,10>H.length&&H.push(e)}function p(e,t,r,a){var o=void 0===e?"undefined":x(e);"undefined"!==o&&"boolean"!==o||(e=null);var i=!1;if(null===e)i=!0;else switch(o){case"string":case"number":i=!0;break;case"object":switch(e.$$typeof){case b:case L:i=!0}}if(i)return r(a,e,""===t?"."+v(e,0):t),1;if(i=0,t=""===t?".":t+":",Array.isArray(e))for(var l=0;l<e.length;l++){o=e[l];var s=t+v(o,l);i+=p(o,s,r,a)}else if(null===e||"object"!==(void 0===e?"undefined":x(e))?s=null:(s=C&&e[C]||e["@@iterator"],s="function"==typeof s?s:null),"function"==typeof s)for(e=s.call(e),l=0;!(o=e.next()).done;)o=o.value,s=t+v(o,l++),i+=p(o,s,r,a);else"object"===o&&(r=""+e,n("31","[object Object]"===r?"object with keys {"+Object.keys(e).join(", ")+"}":r,""));return i}function f(e,t,r){return null==e?0:p(e,"",t,r)}function v(e,t){return"object"===(void 0===e?"undefined":x(e))&&null!==e&&null!=e.key?c(e.key):t.toString(36)}function y(e,t){e.func.call(e.context,t,e.count++)}function g(e,t,r){var a=e.result,n=e.keyPrefix;e=e.func.call(e.context,t,e.count++),Array.isArray(e)?_(e,a,r,function(e){return e}):null!=e&&(h(e)&&(e=u(e,n+(!e.key||t&&t.key===e.key?"":(""+e.key).replace(B,"$&/")+"/")+r)),a.push(e))}function _(e,t,r,a,n){var o="";null!=r&&(o=(""+r).replace(B,"$&/")+"/"),t=d(t,o,a,n),f(e,g,t),m(t)}function T(e,t){var r=O.currentDispatcher;return null===r&&n("277"),r.readContext(e,t)}/** @license React v16.5.2 + * 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 x="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},w=r(186),N="function"==typeof Symbol&&Symbol.for,b=N?Symbol.for("react.element"):60103,L=N?Symbol.for("react.portal"):60106,S=N?Symbol.for("react.fragment"):60107,k=N?Symbol.for("react.strict_mode"):60108,D=N?Symbol.for("react.profiler"):60114,M=N?Symbol.for("react.provider"):60109,A=N?Symbol.for("react.context"):60110,I=N?Symbol.for("react.async_mode"):60111,z=N?Symbol.for("react.forward_ref"):60112;N&&Symbol.for("react.placeholder");var C="function"==typeof Symbol&&Symbol.iterator,R={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},E={};o.prototype.isReactComponent={},o.prototype.setState=function(e,t){"object"!==(void 0===e?"undefined":x(e))&&"function"!=typeof e&&null!=e&&n("85"),this.updater.enqueueSetState(this,e,t,"setState")},o.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},i.prototype=o.prototype;var P=l.prototype=new i;P.constructor=l,w(P,o.prototype),P.isPureReactComponent=!0;var O={current:null,currentDispatcher:null},F=Object.prototype.hasOwnProperty,j={key:!0,ref:!0,__self:!0,__source:!0},B=/\/+/g,H=[],V={Children:{map:function(e,t,r){if(null==e)return e;var a=[];return _(e,a,null,t,r),a},forEach:function(e,t,r){if(null==e)return e;t=d(null,null,t,r),f(e,y,t),m(t)},count:function(e){return f(e,function(){return null},null)},toArray:function(e){var t=[];return _(e,t,null,function(e){return e}),t},only:function(e){return h(e)||n("143"),e}},createRef:function(){return{current:null}},Component:o,PureComponent:l,createContext:function(e,t){return void 0===t&&(t=null),e={$$typeof:A,_calculateChangedBits:t,_currentValue:e,_currentValue2:e,Provider:null,Consumer:null,unstable_read:null},e.Provider={$$typeof:M,_context:e},e.Consumer=e,e.unstable_read=T.bind(null,e),e},forwardRef:function(e){return{$$typeof:z,render:e}},Fragment:S,StrictMode:k,unstable_AsyncMode:I,unstable_Profiler:D,createElement:s,cloneElement:function(e,t,r){(null===e||void 0===e)&&n("267",e);var a=void 0,o=w({},e.props),i=e.key,l=e.ref,s=e._owner;if(null!=t){void 0!==t.ref&&(l=t.ref,s=O.current),void 0!==t.key&&(i=""+t.key);var u=void 0;e.type&&e.type.defaultProps&&(u=e.type.defaultProps);for(a in t)F.call(t,a)&&!j.hasOwnProperty(a)&&(o[a]=void 0===t[a]&&void 0!==u?u[a]:t[a])}if(1==(a=arguments.length-2))o.children=r;else if(1<a){u=Array(a);for(var h=0;h<a;h++)u[h]=arguments[h+2];o.children=u}return{$$typeof:b,type:e.type,key:i,ref:l,props:o,_owner:s}},createFactory:function(e){var t=s.bind(null,e);return t.type=e,t},isValidElement:h,version:"16.5.2",__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{ReactCurrentOwner:O,assign:w}},G={default:V},W=G&&V||G;e.exports=W.default||W},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return function(e,r){return t.reduce(function(e,t){return t(e,r)},e)}},e.exports=t.default},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function o(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t<e.length;t++)r[t]=e[t];return r}return Array.from(e)}function i(e){for(var t=arguments.length,r=Array(t>1?t-1:0),a=1;a<t;a++)r[a-1]=arguments[a];if(r.every(N.default)){if((0,N.default)(e))return u([e].concat(r));if((0,y.default)(e))return c({},s(e),u(r))}throw new TypeError("Expected optional object followed by string action types")}function l(e){if((0,L.default)(e))return!0;if((0,_.default)(e)){var t=h(e,2),r=t[0],a=void 0===r?m.default:r,n=t[1];return(0,L.default)(a)&&(0,L.default)(n)}return!1}function s(e){return(0,x.default)(e,function(e,t,r){if(!l(t))throw new TypeError("Expected function, undefined, or array with payload and meta functions for "+r);var a=(0,_.default)(t)?k.default.apply(void 0,[r].concat(o(t))):(0,k.default)(r,t);return c({},e,n({},(0,f.default)(r),a))},{})}function u(e){return s(e.reduce(function(e,t){return c({},e,n({},t,m.default))},{}))}Object.defineProperty(t,"__esModule",{value:!0});var h=function(){function e(e,t){var r=[],a=!0,n=!1,o=void 0;try{for(var i,l=e[Symbol.iterator]();!(a=(i=l.next()).done)&&(r.push(i.value),!t||r.length!==t);a=!0);}catch(e){n=!0,o=e}finally{try{!a&&l.return&&l.return()}finally{if(n)throw o}}return r}return function(t,r){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,r);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),c=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e};t.default=i;var d=r(181),m=a(d),p=r(1095),f=a(p),v=r(184),y=a(v),g=r(39),_=a(g),T=r(1105),x=a(T),w=r(265),N=a(w),b=r(135),L=a(b),S=r(427),k=a(S)},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function n(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t<e.length;t++)r[t]=e[t];return r}return Array.from(e)}function o(e,t){var r=(0,u.default)(e).map(function(t){return(0,l.default)(t,e[t])}),a=c.default.apply(void 0,n(r));return function(){var e=arguments.length<=0||void 0===arguments[0]?t:arguments[0],r=arguments[1];return a(e,r)}}Object.defineProperty(t,"__esModule",{value:!0}),t.default=o;var i=r(428),l=a(i),s=r(1172),u=a(s),h=r(1169),c=a(h)},function(e,t,r){"use strict";function a(e){if("undefined"!=typeof Reflect&&"function"==typeof Reflect.ownKeys)return Reflect.ownKeys(e);var t=Object.getOwnPropertyNames(e);return"function"==typeof Object.getOwnPropertySymbols&&(t=t.concat(Object.getOwnPropertySymbols(e))),t}Object.defineProperty(t,"__esModule",{value:!0}),t.default=a},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=r(188);Object.defineProperty(t,"take",{enumerable:!0,get:function(){return a.take}}),Object.defineProperty(t,"takem",{enumerable:!0,get:function(){return a.takem}}),Object.defineProperty(t,"put",{enumerable:!0,get:function(){return a.put}}),Object.defineProperty(t,"race",{enumerable:!0,get:function(){return a.race}}),Object.defineProperty(t,"call",{enumerable:!0,get:function(){return a.call}}),Object.defineProperty(t,"apply",{enumerable:!0,get:function(){return a.apply}}),Object.defineProperty(t,"cps",{enumerable:!0,get:function(){return a.cps}}),Object.defineProperty(t,"fork",{enumerable:!0,get:function(){return a.fork}}),Object.defineProperty(t,"spawn",{enumerable:!0,get:function(){return a.spawn}}),Object.defineProperty(t,"join",{enumerable:!0,get:function(){return a.join}}),Object.defineProperty(t,"cancel",{enumerable:!0,get:function(){return a.cancel}}),Object.defineProperty(t,"select",{enumerable:!0,get:function(){return a.select}}),Object.defineProperty(t,"actionChannel",{enumerable:!0,get:function(){return a.actionChannel}}),Object.defineProperty(t,"cancelled",{enumerable:!0,get:function(){return a.cancelled}})},function(e,t,r){"use strict";function a(e){o?n.push(e):(o=!0,n.push(e),a.flush())}Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var n=[],o=!1;a.suspend=function(){return o=!0},a.flush=function(){for(var e=void 0;e=n.shift();)e();o=!1}},function(e,t,r){"use strict";function a(){function e(e){function a(e){for(var r=arguments.length,a=Array(r>1?r-1:0),l=1;l<r;l++)a[l-1]=arguments[l];return(0,i.default)(e.apply(void 0,a),s.subscribe,o,n,t,0,e.name)}var n=e.getState,o=e.dispatch;r=a;var s=(0,l.emitter)();return function(e){return function(t){var r=e(t);return s.emit(t),r}}}var t=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],r=void 0;if(n.is.func(t))throw new Error("Saga middleware no longer accept Generator functions. Use sagaMiddleware.run instead");if(t.logger&&!n.is.func(t.logger))throw new Error("`options.logger` passed to the Saga middleware is not a function!");return e.run=function(e){for(var t=arguments.length,a=Array(t>1?t-1:0),o=1;o<t;o++)a[o-1]=arguments[o];return(0,n.check)(r,n.is.notUndef,"Before running a Saga, you must mount the Saga middleware on the Store using applyMiddleware"),(0,n.check)(e,n.is.func,"sagaMiddleware.run(saga, ...args): saga argument must be a Generator function!"),r.apply(void 0,[e].concat(a))},e}Object.defineProperty(t,"__esModule",{value:!0}),t.default=a;var n=r(60),o=r(429),i=function(e){return e&&e.__esModule?e:{default:e}}(o),l=r(187)},function(e,t,r){"use strict";function a(e,t){var r=t.subscribe,a=t.dispatch,o=t.getState,l=t.sagaMonitor,s=t.logger;return(0,n.check)(e,n.is.iterator,"runSaga must be called on an iterator"),(0,i.default)(e,r,a,o,{sagaMonitor:l,logger:s})}Object.defineProperty(t,"__esModule",{value:!0}),t.runSaga=a;var n=r(60),o=r(429),i=function(e){return e&&e.__esModule?e:{default:e}}(o)},function(e,t,r){"use strict";function a(e,t){function r(t,r){if(o===d)return c;if(r)throw o=d,r;n&&n(t);var a=e[o](),i=l(a,3),s=i[0],u=i[1],h=i[2];return o=s,n=h,o===d?c:u}var a=arguments.length<=2||void 0===arguments[2]?"iterator":arguments[2],n=void 0,o=t;return(0,u.makeIterator)(r,function(e){return r(null,e)},a)}function n(e){return Array.isArray(e)?String(e.map(function(e){return String(e)})):String(e)}function o(e,t){for(var r=arguments.length,o=Array(r>2?r-2:0),i=2;i<r;i++)o[i-2]=arguments[i];var l={done:!1,value:(0,h.take)(e)},u=function(e){return{done:!1,value:h.fork.apply(void 0,[t].concat(o,[e]))}},c=void 0,m=function(e){return c=e};return a({q1:function(){return["q2",l,m]},q2:function(){return c===s.END?[d]:["q1",u(c)]}},"q1","takeEvery("+n(e)+", "+t.name+")")}function i(e,t){for(var r=arguments.length,o=Array(r>2?r-2:0),i=2;i<r;i++)o[i-2]=arguments[i];var l={done:!1,value:(0,h.take)(e)},u=function(e){return{done:!1,value:h.fork.apply(void 0,[t].concat(o,[e]))}},c=function(e){return{done:!1,value:(0,h.cancel)(e)}},m=void 0,p=void 0,f=function(e){return m=e},v=function(e){return p=e};return a({q1:function(){return["q2",l,v]},q2:function(){return p===s.END?[d]:m?["q3",c(m)]:["q1",u(p),f]},q3:function(){return["q1",u(p),f]}},"q1","takeLatest("+n(e)+", "+t.name+")")}Object.defineProperty(t,"__esModule",{value:!0});var l=function(){function e(e,t){var r=[],a=!0,n=!1,o=void 0;try{for(var i,l=e[Symbol.iterator]();!(a=(i=l.next()).done)&&(r.push(i.value),!t||r.length!==t);a=!0);}catch(e){n=!0,o=e}finally{try{!a&&l.return&&l.return()}finally{if(n)throw o}}return r}return function(t,r){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,r);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();t.takeEvery=o,t.takeLatest=i;var s=r(187),u=r(60),h=r(188),c={done:!0,value:void 0},d={}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=r(60);Object.defineProperty(t,"TASK",{enumerable:!0,get:function(){return a.TASK}}),Object.defineProperty(t,"noop",{enumerable:!0,get:function(){return a.noop}}),Object.defineProperty(t,"is",{enumerable:!0,get:function(){return a.is}}),Object.defineProperty(t,"deferred",{enumerable:!0,get:function(){return a.deferred}}),Object.defineProperty(t,"arrayOfDeffered",{enumerable:!0,get:function(){return a.arrayOfDeffered}}),Object.defineProperty(t,"createMockTask",{enumerable:!0,get:function(){return a.createMockTask}});var n=r(188);Object.defineProperty(t,"asEffect",{enumerable:!0,get:function(){return n.asEffect}})},function(e,t,r){"use strict";function a(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return function(e){return function(r,a,o){var l=e(r,a,o),s=l.dispatch,u=[],h={getState:l.getState,dispatch:function(e){return s(e)}};return u=t.map(function(e){return e(h)}),s=i.default.apply(void 0,u)(l.dispatch),n({},l,{dispatch:s})}}}t.__esModule=!0;var n=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(e[a]=r[a])}return e};t.default=a;var o=r(430),i=function(e){return e&&e.__esModule?e:{default:e}}(o)},function(e,t,r){"use strict";function a(e,t){return function(){return t(e.apply(void 0,arguments))}}function n(e,t){if("function"==typeof e)return a(e,t);if("object"!==(void 0===e?"undefined":o(e))||null===e)throw new Error("bindActionCreators expected an object or a function, instead received "+(null===e?"null":void 0===e?"undefined":o(e))+'. Did you write "import ActionCreators from" instead of "import * as ActionCreators from"?');for(var r=Object.keys(e),n={},i=0;i<r.length;i++){var l=r[i],s=e[l];"function"==typeof s&&(n[l]=a(s,t))}return n}var o="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.__esModule=!0,t.default=n},function(e,t,r){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function n(e,t){var r=t&&t.type;return"Given action "+(r&&'"'+r.toString()+'"'||"an action")+', reducer "'+e+'" returned undefined. To ignore an action, you must explicitly return the previous state.'}function o(e){Object.keys(e).forEach(function(t){var r=e[t];if(void 0===r(void 0,{type:l.ActionTypes.INIT}))throw new Error('Reducer "'+t+'" returned undefined during initialization. If the state passed to the reducer is undefined, you must explicitly return the initial state. The initial state may not be undefined.');if(void 0===r(void 0,{type:"@@redux/PROBE_UNKNOWN_ACTION_"+Math.random().toString(36).substring(7).split("").join(".")}))throw new Error('Reducer "'+t+"\" returned undefined when probed with a random type. Don't try to handle "+l.ActionTypes.INIT+' or other actions in "redux/*" namespace. They are considered private. Instead, you must return the current state for any unknown actions, unless it is undefined, in which case you must return the initial state, regardless of the action type. The initial state may not be undefined.')})}function i(e){for(var t=Object.keys(e),r={},a=0;a<t.length;a++){var i=t[a];"function"==typeof e[i]&&(r[i]=e[i])}var l,s=Object.keys(r);try{o(r)}catch(e){l=e}return function(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0],t=arguments[1];if(l)throw l;for(var a=!1,o={},i=0;i<s.length;i++){var u=s[i],h=r[u],c=e[u],d=h(c,t);if(void 0===d){var m=n(u,t);throw new Error(m)}o[u]=d,a=a||d!==c}return a?o:e}}t.__esModule=!0,t.default=i;var l=r(431);a((a(r(184)),r(432)))},function(e,t,r){"use strict";function a(){if(!c){var e=h.timesOutAt;d?w():d=!0,x(o,e)}}function n(){var e=h,t=h.next;if(h===t)h=null;else{var r=h.previous;h=r.next=t,t.previous=r}e.next=e.previous=null,(e=e.callback)(p)}function o(e){c=!0,p.didTimeout=e;try{if(e)for(;null!==h;){var r=t.unstable_now();if(!(h.timesOutAt<=r))break;do{n()}while(null!==h&&h.timesOutAt<=r)}else if(null!==h)do{n()}while(null!==h&&0<N()-t.unstable_now())}finally{c=!1,null!==h?a(h):d=!1}}function i(e){s=g(function(t){y(u),e(t)}),u=v(function(){_(s),e(t.unstable_now())},100)}/** @license React v16.5.2 + * schedule.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 l="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};Object.defineProperty(t,"__esModule",{value:!0});var s,u,h=null,c=!1,d=!1,m="object"===("undefined"==typeof performance?"undefined":l(performance))&&"function"==typeof performance.now,p={timeRemaining:m?function(){var e=N()-performance.now();return 0<e?e:0}:function(){var e=N()-Date.now();return 0<e?e:0},didTimeout:!1},f=Date,v="function"==typeof setTimeout?setTimeout:void 0,y="function"==typeof clearTimeout?clearTimeout:void 0,g="function"==typeof requestAnimationFrame?requestAnimationFrame:void 0,_="function"==typeof cancelAnimationFrame?cancelAnimationFrame:void 0;if(m){var T=performance;t.unstable_now=function(){return T.now()}}else t.unstable_now=function(){return f.now()};var x,w,N;if("undefined"==typeof window){var b=-1;x=function(e){b=setTimeout(e,0,!0)},w=function(){clearTimeout(b)},N=function(){return 0}}else if(window._schedMock){var L=window._schedMock;x=L[0],w=L[1],N=L[2]}else{"undefined"!=typeof console&&("function"!=typeof g&&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 _&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"));var S=null,k=!1,D=-1,M=!1,A=!1,I=0,z=33,C=33;N=function(){return I};var R="__reactIdleCallback$"+Math.random().toString(36).slice(2);window.addEventListener("message",function(e){if(e.source===window&&e.data===R){k=!1;var r=t.unstable_now();if(e=!1,0>=I-r){if(!(-1!==D&&D<=r))return void(M||(M=!0,i(E)));e=!0}if(D=-1,r=S,S=null,null!==r){A=!0;try{r(e)}finally{A=!1}}}},!1);var E=function(e){M=!1;var t=e-I+C;t<C&&z<C?(8>t&&(t=8),C=t<z?z:t):z=t,I=e+C,k||(k=!0,window.postMessage(R,"*"))};x=function(e,t){S=e,D=t,A?window.postMessage(R,"*"):M||(M=!0,i(E))},w=function(){S=null,k=!1,D=-1}}t.unstable_scheduleWork=function(e,r){var n=t.unstable_now();if(r=void 0!==r&&null!==r&&null!==r.timeout&&void 0!==r.timeout?n+r.timeout:n+5e3,e={callback:e,timesOutAt:r,next:null,previous:null},null===h)h=e.next=e.previous=e,a(h);else{n=null;var o=h;do{if(o.timesOutAt>r){n=o;break}o=o.next}while(o!==h);null===n?n=h:n===h&&(h=e,a(h)),r=n.previous,r.next=n.previous=e,e.next=n,e.previous=r}return e},t.unstable_cancelScheduledWork=function(e){var t=e.next;if(null!==t){if(t===e)h=null;else{e===h&&(h=t);var r=e.previous;r.next=t,t.previous=r}e.next=e.previous=null}}},function(e,t,r){"use strict";e.exports=r(1182)},function(e,t,r){"use strict";e.exports=function(e){return encodeURIComponent(e).replace(/[!'()*]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})}},function(e,t,r){"use strict";(function(e,a){Object.defineProperty(t,"__esModule",{value:!0});var n,o=r(1186),i=function(e){return e&&e.__esModule?e:{default:e}}(o);n="undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==e?e:a;var l=(0,i.default)(n);t.default=l}).call(t,r(61),r(120)(e))},function(e,t,r){"use strict";function a(e){var t,r=e.Symbol;return"function"==typeof r?r.observable?t=r.observable:(t=r("observable"),r.observable=t):t="@@observable",t}Object.defineProperty(t,"__esModule",{value:!0}),t.default=a},function(e,t,r){"use strict";var a={linear:function(e,t,r,a){return(r-t)*e/a+t},easeInQuad:function(e,t,r,a){return(r-t)*(e/=a)*e+t},easeOutQuad:function(e,t,r,a){return-(r-t)*(e/=a)*(e-2)+t},easeInOutQuad:function(e,t,r,a){var n=r-t;return(e/=a/2)<1?n/2*e*e+t:-n/2*(--e*(e-2)-1)+t},easeInCubic:function(e,t,r,a){return(r-t)*(e/=a)*e*e+t},easeOutCubic:function(e,t,r,a){return(r-t)*((e=e/a-1)*e*e+1)+t},easeInOutCubic:function(e,t,r,a){var n=r-t;return(e/=a/2)<1?n/2*e*e*e+t:n/2*((e-=2)*e*e+2)+t},easeInQuart:function(e,t,r,a){return(r-t)*(e/=a)*e*e*e+t},easeOutQuart:function(e,t,r,a){return-(r-t)*((e=e/a-1)*e*e*e-1)+t},easeInOutQuart:function(e,t,r,a){var n=r-t;return(e/=a/2)<1?n/2*e*e*e*e+t:-n/2*((e-=2)*e*e*e-2)+t},easeInQuint:function(e,t,r,a){return(r-t)*(e/=a)*e*e*e*e+t},easeOutQuint:function(e,t,r,a){return(r-t)*((e=e/a-1)*e*e*e*e+1)+t},easeInOutQuint:function(e,t,r,a){var n=r-t;return(e/=a/2)<1?n/2*e*e*e*e*e+t:n/2*((e-=2)*e*e*e*e+2)+t},easeInSine:function(e,t,r,a){var n=r-t;return-n*Math.cos(e/a*(Math.PI/2))+n+t},easeOutSine:function(e,t,r,a){return(r-t)*Math.sin(e/a*(Math.PI/2))+t},easeInOutSine:function(e,t,r,a){return-(r-t)/2*(Math.cos(Math.PI*e/a)-1)+t},easeInExpo:function(e,t,r,a){var n=r-t;return 0==e?t:n*Math.pow(2,10*(e/a-1))+t},easeOutExpo:function(e,t,r,a){var n=r-t;return e==a?t+n:n*(1-Math.pow(2,-10*e/a))+t},easeInOutExpo:function(e,t,r,a){var n=r-t;return 0===e?t:e===a?t+n:(e/=a/2)<1?n/2*Math.pow(2,10*(e-1))+t:n/2*(2-Math.pow(2,-10*--e))+t},easeInCirc:function(e,t,r,a){return-(r-t)*(Math.sqrt(1-(e/=a)*e)-1)+t},easeOutCirc:function(e,t,r,a){return(r-t)*Math.sqrt(1-(e=e/a-1)*e)+t},easeInOutCirc:function(e,t,r,a){var n=r-t;return(e/=a/2)<1?-n/2*(Math.sqrt(1-e*e)-1)+t:n/2*(Math.sqrt(1-(e-=2)*e)+1)+t},easeInElastic:function(e,t,r,a){var n,o,i,l=r-t;return i=1.70158,o=0,n=l,0===e?t:1==(e/=a)?t+l:(o||(o=.3*a),n<Math.abs(l)?(n=l,i=o/4):i=o/(2*Math.PI)*Math.asin(l/n),-n*Math.pow(2,10*(e-=1))*Math.sin((e*a-i)*(2*Math.PI)/o)+t)},easeOutElastic:function(e,t,r,a){var n,o,i,l=r-t;return i=1.70158,o=0,n=l,0===e?t:1==(e/=a)?t+l:(o||(o=.3*a),n<Math.abs(l)?(n=l,i=o/4):i=o/(2*Math.PI)*Math.asin(l/n),n*Math.pow(2,-10*e)*Math.sin((e*a-i)*(2*Math.PI)/o)+l+t)},easeInOutElastic:function(e,t,r,a){var n,o,i,l=r-t;return i=1.70158,o=0,n=l,0===e?t:2==(e/=a/2)?t+l:(o||(o=a*(.3*1.5)),n<Math.abs(l)?(n=l,i=o/4):i=o/(2*Math.PI)*Math.asin(l/n),e<1?n*Math.pow(2,10*(e-=1))*Math.sin((e*a-i)*(2*Math.PI)/o)*-.5+t:n*Math.pow(2,-10*(e-=1))*Math.sin((e*a-i)*(2*Math.PI)/o)*.5+l+t)},easeInBack:function(e,t,r,a,n){var o=r-t;return void 0===n&&(n=1.70158),o*(e/=a)*e*((n+1)*e-n)+t},easeOutBack:function(e,t,r,a,n){var o=r-t;return void 0===n&&(n=1.70158),o*((e=e/a-1)*e*((n+1)*e+n)+1)+t},easeInOutBack:function(e,t,r,a,n){var o=r-t;return void 0===n&&(n=1.70158),(e/=a/2)<1?o/2*(e*e*((1+(n*=1.525))*e-n))+t:o/2*((e-=2)*e*((1+(n*=1.525))*e+n)+2)+t},easeInBounce:function(e,t,r,n){var o,i=r-t;return o=a.easeOutBounce(n-e,0,i,n),i-o+t},easeOutBounce:function(e,t,r,a){var n=r-t;return(e/=a)<1/2.75?n*(7.5625*e*e)+t:e<2/2.75?n*(7.5625*(e-=1.5/2.75)*e+.75)+t:e<2.5/2.75?n*(7.5625*(e-=2.25/2.75)*e+.9375)+t:n*(7.5625*(e-=2.625/2.75)*e+.984375)+t},easeInOutBounce:function(e,t,r,n){var o=r-t;return e<n/2?.5*a.easeInBounce(2*e,0,o,n)+t:.5*a.easeOutBounce(2*e-n,0,o,n)+.5*o+t}};e.exports=a},function(e,t,r){"use strict";(function(a){var n,o,i="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};!function(a,l){"object"===i(t)&&void 0!==e?e.exports=l():(n=l,void 0!==(o="function"==typeof n?n.call(t,r,t,e):n)&&(e.exports=o))}(0,function(){function e(e){var a=void 0===e?"undefined":i(e);if("object"!==a)return a;if(null===e)return"null";if(e===r)return"global";if(Array.isArray(e)&&(!1===d||!(Symbol.toStringTag in e)))return"Array";if("object"===("undefined"==typeof window?"undefined":i(window))&&null!==window){if("object"===i(window.location)&&e===window.location)return"Location";if("object"===i(window.document)&&e===window.document)return"Document";if("object"===i(window.navigator)){if("object"===i(window.navigator.mimeTypes)&&e===window.navigator.mimeTypes)return"MimeTypeArray";if("object"===i(window.navigator.plugins)&&e===window.navigator.plugins)return"PluginArray"}if(("function"==typeof window.HTMLElement||"object"===i(window.HTMLElement))&&e instanceof window.HTMLElement){if("BLOCKQUOTE"===e.tagName)return"HTMLQuoteElement";if("TD"===e.tagName)return"HTMLTableDataCellElement";if("TH"===e.tagName)return"HTMLTableHeaderCellElement"}}var n=d&&e[Symbol.toStringTag];if("string"==typeof n)return n;var c=Object.getPrototypeOf(e);return c===RegExp.prototype?"RegExp":c===Date.prototype?"Date":t&&c===Promise.prototype?"Promise":l&&c===Set.prototype?"Set":o&&c===Map.prototype?"Map":u&&c===WeakSet.prototype?"WeakSet":s&&c===WeakMap.prototype?"WeakMap":h&&c===DataView.prototype?"DataView":o&&c===v?"Map Iterator":l&&c===f?"Set Iterator":y&&c===g?"Array Iterator":_&&c===T?"String Iterator":null===c?"Object":Object.prototype.toString.call(e).slice(x,w)}var t="function"==typeof Promise,r="object"===("undefined"==typeof self?"undefined":i(self))?self:a,n="undefined"!=typeof Symbol,o="undefined"!=typeof Map,l="undefined"!=typeof Set,s="undefined"!=typeof WeakMap,u="undefined"!=typeof WeakSet,h="undefined"!=typeof DataView,c=n&&void 0!==Symbol.iterator,d=n&&void 0!==Symbol.toStringTag,m=l&&"function"==typeof Set.prototype.entries,p=o&&"function"==typeof Map.prototype.entries,f=m&&Object.getPrototypeOf((new Set).entries()),v=p&&Object.getPrototypeOf((new Map).entries()),y=c&&"function"==typeof Array.prototype[Symbol.iterator],g=y&&Object.getPrototypeOf([][Symbol.iterator]()),_=c&&"function"==typeof String.prototype[Symbol.iterator],T=_&&Object.getPrototypeOf(""[Symbol.iterator]()),x=8,w=-1;return e})}).call(t,r(61))},function(e,t,r){"use strict";function a(e,t,r){return{type:e,event:r,target:t.target,topTarget:t.topTarget,cancelBubble:!1,offsetX:r.zrX,offsetY:r.zrY,gestureEvent:r.gestureEvent,pinchX:r.pinchX,pinchY:r.pinchY,pinchScale:r.pinchScale,wheelDelta:r.zrDelta,zrByTouch:r.zrByTouch,which:r.which}}function n(){}function o(e,t,r){if(e[e.rectHover?"rectContain":"contain"](t,r)){for(var a,n=e;n;){if(n.clipPath&&!n.clipPath.contain(t,r))return!1;n.silent&&(a=!0),n=n.parent}return!a||h}return!1}var i=r(0),l=r(12),s=r(1216),u=r(98),h="silent";n.prototype.dispose=function(){};var c=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],d=function(e,t,r,a){u.call(this),this.storage=e,this.painter=t,this.painterRoot=a,r=r||new n,this.proxy=r,r.handler=this,this._hovered={},this._lastTouchMoment,this._lastX,this._lastY,s.call(this),i.each(c,function(e){r.on&&r.on(e,this[e],this)},this)};d.prototype={constructor:d,mousemove:function(e){var t=e.zrX,r=e.zrY,a=this._hovered,n=a.target;n&&!n.__zr&&(a=this.findHover(a.x,a.y),n=a.target);var o=this._hovered=this.findHover(t,r),i=o.target,l=this.proxy;l.setCursor&&l.setCursor(i?i.cursor:"default"),n&&i!==n&&this.dispatchToElement(a,"mouseout",e),this.dispatchToElement(o,"mousemove",e),i&&i!==n&&this.dispatchToElement(o,"mouseover",e)},mouseout:function(e){this.dispatchToElement(this._hovered,"mouseout",e);var t,r=e.toElement||e.relatedTarget;do{r=r&&r.parentNode}while(r&&9!=r.nodeType&&!(t=r===this.painterRoot));!t&&this.trigger("globalout",{event:e})},resize:function(e){this._hovered={}},dispatch:function(e,t){var r=this[e];r&&r.call(this,t)},dispose:function(){this.proxy.dispose(),this.storage=this.proxy=this.painter=null},setCursorStyle:function(e){var t=this.proxy;t.setCursor&&t.setCursor(e)},dispatchToElement:function(e,t,r){e=e||{};var n=e.target;if(!n||!n.silent){for(var o="on"+t,i=a(t,e,r);n&&(n[o]&&(i.cancelBubble=n[o].call(n,i)),n.trigger(t,i),n=n.parent,!i.cancelBubble););i.cancelBubble||(this.trigger(t,i),this.painter&&this.painter.eachOtherLayer(function(e){"function"==typeof e[o]&&e[o].call(e,i),e.trigger&&e.trigger(t,i)}))}},findHover:function(e,t,r){for(var a=this.storage.getDisplayList(),n={x:e,y:t},i=a.length-1;i>=0;i--){var l;if(a[i]!==r&&!a[i].ignore&&(l=o(a[i],e,t))&&(!n.topTarget&&(n.topTarget=a[i]),l!==h)){n.target=a[i];break}}return n}},i.each(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(e){d.prototype[e]=function(t){var r=this.findHover(t.zrX,t.zrY),a=r.target;if("mousedown"===e)this._downEl=a,this._downPoint=[t.zrX,t.zrY],this._upEl=a;else if("mosueup"===e)this._upEl=a;else if("click"===e){if(this._downEl!==this._upEl||!this._downPoint||l.dist(this._downPoint,[t.zrX,t.zrY])>4)return;this._downPoint=null}this.dispatchToElement(r,e,t)}}),i.mixin(d,u),i.mixin(d,s);var m=d;e.exports=m},function(e,t,r){"use strict";function a(){return!1}function n(e,t,r){var a=o.createCanvas(),n=t.getWidth(),i=t.getHeight(),l=a.style;return l.position="absolute",l.left=0,l.top=0,l.width=n+"px",l.height=i+"px",a.width=n*r,a.height=i*r,a.setAttribute("data-zr-dom-id",e),a}var o=r(0),i=r(189),l=i.devicePixelRatio,s=r(446),u=r(445),h=function(e,t,r){var i;r=r||l,"string"==typeof e?i=n(e,t,r):o.isObject(e)&&(i=e,e=i.id),this.id=e,this.dom=i;var s=i.style;s&&(i.onselectstart=a,s["-webkit-user-select"]="none",s["user-select"]="none",s["-webkit-touch-callout"]="none",s["-webkit-tap-highlight-color"]="rgba(0,0,0,0)",s.padding=0,s.margin=0,s["border-width"]=0),this.domBack=null,this.ctxBack=null,this.painter=t,this.config=null,this.clearColor=0,this.motionBlur=!1,this.lastFrameAlpha=.7,this.dpr=r};h.prototype={constructor:h,elCount:0,__dirty:!0,initContext:function(){this.ctx=this.dom.getContext("2d"),this.ctx.__currentValues={},this.ctx.dpr=this.dpr},createBackBuffer:function(){var e=this.dpr;this.domBack=n("back-"+this.id,this.painter,e),this.ctxBack=this.domBack.getContext("2d"),this.ctxBack.__currentValues={},1!=e&&this.ctxBack.scale(e,e)},resize:function(e,t){var r=this.dpr,a=this.dom,n=a.style,o=this.domBack;n.width=e+"px",n.height=t+"px",a.width=e*r,a.height=t*r,o&&(o.width=e*r,o.height=t*r,1!=r&&this.ctxBack.scale(r,r))},clear:function(e){var t=this.dom,r=this.ctx,a=t.width,n=t.height,o=this.clearColor,i=this.motionBlur&&!e,l=this.lastFrameAlpha,h=this.dpr;if(i&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation="copy",this.ctxBack.drawImage(t,0,0,a/h,n/h)),r.clearRect(0,0,a,n),o){var c;o.colorStops?(c=o.__canvasGradient||s.getGradient(r,o,{x:0,y:0,width:a,height:n}),o.__canvasGradient=c):o.image&&(c=u.prototype.getCanvasPattern.call(o,r)),r.save(),r.fillStyle=c||o,r.fillRect(0,0,a,n),r.restore()}if(i){var d=this.domBack;r.save(),r.globalAlpha=l,r.drawImage(d,0,0,a,n),r.restore()}}};var c=h;e.exports=c},function(e,t,r){"use strict";function a(e){return parseInt(e,10)}function n(e){return!!e&&(!!e.__builtin__||"function"==typeof e.resize&&"function"==typeof e.refresh)}function o(e){e.__unusedCount++}function i(e){1==e.__unusedCount&&e.clear()}function l(e,t,r){return T.copy(e.getBoundingRect()),e.transform&&T.applyTransform(e.transform),x.width=t,x.height=r,!T.intersect(x)}function s(e,t){if(e==t)return!1;if(!e||!t||e.length!==t.length)return!0;for(var r=0;r<e.length;r++)if(e[r]!==t[r])return!0}function u(e,t){for(var r=0;r<e.length;r++){var a=e[r];a.setTransform(t),t.beginPath(),a.buildPath(t,a.shape),t.clip(),a.restoreTransform(t)}}function h(e,t){var r=document.createElement("div");return r.style.cssText=["position:relative","overflow:hidden","width:"+e+"px","height:"+t+"px","padding:0","margin:0","border-width:0"].join(";")+";",r}var c=r(189),d=c.devicePixelRatio,m=r(0),p=r(139),f=r(19),v=r(275),y=r(1190),g=r(436),_=r(140),T=new f(0,0,0,0),x=new f(0,0,0,0),w=function(e,t,r){this.type="canvas";var a=!e.nodeName||"CANVAS"===e.nodeName.toUpperCase();this._opts=r=m.extend({},r||{}),this.dpr=r.devicePixelRatio||d,this._singleCanvas=a,this.root=e;var n=e.style;n&&(n["-webkit-tap-highlight-color"]="transparent",n["-webkit-user-select"]=n["user-select"]=n["-webkit-touch-callout"]="none",e.innerHTML=""),this.storage=t;var o=this._zlevelList=[],i=this._layers={};if(this._layerConfig={},a){null!=r.width&&(e.width=r.width),null!=r.height&&(e.height=r.height);var l=e.width,s=e.height;this._width=l,this._height=s;var u=new y(e,this,1);u.initContext(),i[0]=u,o.push(0),this._domRoot=e}else{this._width=this._getSize(0),this._height=this._getSize(1);var c=this._domRoot=h(this._width,this._height);e.appendChild(c)}this._progressiveLayers=[],this._hoverlayer,this._hoverElements=[]};w.prototype={constructor:w,getType:function(){return"canvas"},isSingleCanvas:function(){return this._singleCanvas},getViewportRoot:function(){return this._domRoot},getViewportRootOffset:function(){var e=this.getViewportRoot();if(e)return{offsetLeft:e.offsetLeft||0,offsetTop:e.offsetTop||0}},refresh:function(e){var t=this.storage.getDisplayList(!0),r=this._zlevelList;this._paintList(t,e);for(var a=0;a<r.length;a++){var n=r[a],o=this._layers[n];!o.__builtin__&&o.refresh&&o.refresh()}return this.refreshHover(),this._progressiveLayers.length&&this._startProgessive(),this},addHover:function(e,t){if(!e.__hoverMir){var r=new e.constructor({style:e.style,shape:e.shape});r.__from=e,e.__hoverMir=r,r.setStyle(t),this._hoverElements.push(r)}},removeHover:function(e){var t=e.__hoverMir,r=this._hoverElements,a=m.indexOf(r,t);a>=0&&r.splice(a,1),e.__hoverMir=null},clearHover:function(e){for(var t=this._hoverElements,r=0;r<t.length;r++){var a=t[r].__from;a&&(a.__hoverMir=null)}t.length=0},refreshHover:function(){var e=this._hoverElements,t=e.length,r=this._hoverlayer;if(r&&r.clear(),t){v(e,this.storage.displayableSortFunc),r||(r=this._hoverlayer=this.getLayer(1e5));var a={};r.ctx.save();for(var n=0;n<t;){var o=e[n],i=o.__from;i&&i.__zr?(n++,i.invisible||(o.transform=i.transform,o.invTransform=i.invTransform,o.__clipPaths=i.__clipPaths,this._doPaintEl(o,r,!0,a))):(e.splice(n,1),i.__hoverMir=null,t--)}r.ctx.restore()}},_startProgessive:function(){function e(){r===t._progressiveToken&&t.storage&&(t._doPaintList(t.storage.getDisplayList()),t._furtherProgressive?(t._progress++,g(e)):t._progressiveToken=-1)}var t=this;if(t._furtherProgressive){var r=t._progressiveToken=+new Date;t._progress++,g(e)}},_clearProgressive:function(){this._progressiveToken=-1,this._progress=0,m.each(this._progressiveLayers,function(e){e.__dirty&&e.clear()})},_paintList:function(e,t){null==t&&(t=!1),this._updateLayerStatus(e),this._clearProgressive(),this.eachBuiltinLayer(o),this._doPaintList(e,t),this.eachBuiltinLayer(i)},_doPaintList:function(e,t){function r(e){var t=o.dpr||1;o.save(),o.globalAlpha=1,o.shadowBlur=0,a.__dirty=!0,o.setTransform(1,0,0,1,0,0),o.drawImage(e.dom,0,0,h*t,c*t),o.restore()}for(var a,n,o,i,l,s,u=0,h=this._width,c=this._height,d=this._progress,f=0,v=e.length;f<v;f++){var y=e[f],g=this._singleCanvas?0:y.zlevel,_=y.__frame;if(_<0&&l&&(r(l),l=null),n!==g&&(o&&o.restore(),i={},n=g,a=this.getLayer(n),a.__builtin__||p("ZLevel "+n+" has been used by unkown layer "+a.id),o=a.ctx,o.save(),a.__unusedCount=0,(a.__dirty||t)&&a.clear()),a.__dirty||t){if(_>=0){if(!l){if(l=this._progressiveLayers[Math.min(u++,4)],l.ctx.save(),l.renderScope={},l&&l.__progress>l.__maxProgress){f=l.__nextIdxNotProg-1;continue}s=l.__progress,l.__dirty||(d=s),l.__progress=d+1}_===d&&this._doPaintEl(y,l,!0,l.renderScope)}else this._doPaintEl(y,a,t,i);y.__dirty=!1}}l&&r(l),o&&o.restore(),this._furtherProgressive=!1,m.each(this._progressiveLayers,function(e){e.__maxProgress>=e.__progress&&(this._furtherProgressive=!0)},this)},_doPaintEl:function(e,t,r,a){var n=t.ctx,o=e.transform;if((t.__dirty||r)&&!e.invisible&&0!==e.style.opacity&&(!o||o[0]||o[3])&&(!e.culling||!l(e,this._width,this._height))){var i=e.__clipPaths;(a.prevClipLayer!==t||s(i,a.prevElClipPaths))&&(a.prevElClipPaths&&(a.prevClipLayer.ctx.restore(),a.prevClipLayer=a.prevElClipPaths=null,a.prevEl=null),i&&(n.save(),u(i,n),a.prevClipLayer=t,a.prevElClipPaths=i)),e.beforeBrush&&e.beforeBrush(n),e.brush(n,a.prevEl||null),a.prevEl=e,e.afterBrush&&e.afterBrush(n)}},getLayer:function(e){if(this._singleCanvas)return this._layers[0];var t=this._layers[e];return t||(t=new y("zr_"+e,this,this.dpr),t.__builtin__=!0,this._layerConfig[e]&&m.merge(t,this._layerConfig[e],!0),this.insertLayer(e,t),t.initContext()),t},insertLayer:function(e,t){var r=this._layers,a=this._zlevelList,o=a.length,i=null,l=-1,s=this._domRoot;if(r[e])return void p("ZLevel "+e+" has been used already");if(!n(t))return void p("Layer of zlevel "+e+" is not valid");if(o>0&&e>a[0]){for(l=0;l<o-1&&!(a[l]<e&&a[l+1]>e);l++);i=r[a[l]]}if(a.splice(l+1,0,e),r[e]=t,!t.virtual)if(i){var u=i.dom;u.nextSibling?s.insertBefore(t.dom,u.nextSibling):s.appendChild(t.dom)}else s.firstChild?s.insertBefore(t.dom,s.firstChild):s.appendChild(t.dom)},eachLayer:function(e,t){var r,a,n=this._zlevelList;for(a=0;a<n.length;a++)r=n[a],e.call(t,this._layers[r],r)},eachBuiltinLayer:function(e,t){var r,a,n,o=this._zlevelList;for(n=0;n<o.length;n++)a=o[n],r=this._layers[a],r.__builtin__&&e.call(t,r,a)},eachOtherLayer:function(e,t){var r,a,n,o=this._zlevelList;for(n=0;n<o.length;n++)a=o[n],r=this._layers[a],r.__builtin__||e.call(t,r,a)},getLayers:function(){return this._layers},_updateLayerStatus:function(e){var t=this._layers,r=this._progressiveLayers,a={},n={};this.eachBuiltinLayer(function(e,t){a[t]=e.elCount,e.elCount=0,e.__dirty=!1}),m.each(r,function(e,t){n[t]=e.elCount,e.elCount=0,e.__dirty=!1});for(var o,i,l=0,s=0,u=0,h=e.length;u<h;u++){var c=e[u],d=this._singleCanvas?0:c.zlevel,p=t[d],f=c.progressive;if(p&&(p.elCount++,p.__dirty=p.__dirty||c.__dirty),f>=0){i!==f&&(i=f,s++);var v=c.__frame=s-1;if(!o){var g=Math.min(l,4);o=r[g],o||(o=r[g]=new y("progressive",this,this.dpr),o.initContext()),o.__maxProgress=0}o.__dirty=o.__dirty||c.__dirty,o.elCount++,o.__maxProgress=Math.max(o.__maxProgress,v),o.__maxProgress>=o.__progress&&(p.__dirty=!0)}else c.__frame=-1,o&&(o.__nextIdxNotProg=u,l++,o=null)}o&&(l++,o.__nextIdxNotProg=u),this.eachBuiltinLayer(function(e,t){a[t]!==e.elCount&&(e.__dirty=!0)}),r.length=Math.min(l,5),m.each(r,function(e,t){n[t]!==e.elCount&&(c.__dirty=!0),e.__dirty&&(e.__progress=0)})},clear:function(){return this.eachBuiltinLayer(this._clearLayer),this},_clearLayer:function(e){e.clear()},configLayer:function(e,t){if(t){var r=this._layerConfig;r[e]?m.merge(r[e],t,!0):r[e]=t;var a=this._layers[e];a&&m.merge(a,r[e],!0)}},delLayer:function(e){var t=this._layers,r=this._zlevelList,a=t[e];a&&(a.dom.parentNode.removeChild(a.dom),delete t[e],r.splice(m.indexOf(r,e),1))},resize:function(e,t){var r=this._domRoot;r.style.display="none";var a=this._opts;if(null!=e&&(a.width=e),null!=t&&(a.height=t),e=this._getSize(0),t=this._getSize(1),r.style.display="",this._width!=e||t!=this._height){r.style.width=e+"px",r.style.height=t+"px";for(var n in this._layers)this._layers.hasOwnProperty(n)&&this._layers[n].resize(e,t);m.each(this._progressiveLayers,function(r){r.resize(e,t)}),this.refresh(!0)}return this._width=e,this._height=t,this},clearLayer:function(e){var t=this._layers[e];t&&t.clear()},dispose:function(){this.root.innerHTML="",this.root=this.storage=this._domRoot=this._layers=null},getRenderedCanvas:function(e){function t(e,t){var a=i._zlevelList;null==e&&(e=-1/0);for(var n,o=0;o<a.length;o++){var l=a[o],s=i._layers[l];if(!s.__builtin__&&l>e&&l<t){n=s;break}}n&&n.renderToCanvas&&(r.ctx.save(),n.renderToCanvas(r.ctx),r.ctx.restore())}if(e=e||{},this._singleCanvas)return this._layers[0].dom;var r=new y("image",this,e.pixelRatio||this.dpr);r.initContext(),r.clearColor=e.backgroundColor,r.clear();for(var a,n=this.storage.getDisplayList(!0),o={},i=this,l=0;l<n.length;l++){var s=n[l];s.zlevel!==a&&(t(a,s.zlevel),a=s.zlevel),this._doPaintEl(s,r,!0,o)}return t(a,1/0),r.dom},getWidth:function(){return this._width},getHeight:function(){return this._height},_getSize:function(e){var t=this._opts,r=["width","height"][e],n=["clientWidth","clientHeight"][e],o=["paddingLeft","paddingTop"][e],i=["paddingRight","paddingBottom"][e];if(null!=t[r]&&"auto"!==t[r])return parseFloat(t[r]);var l=this.root,s=document.defaultView.getComputedStyle(l);return(l[n]||a(s[r])||a(l.style[r]))-(a(s[o])||0)-(a(s[i])||0)|0},pathToImage:function(e,t){t=t||this.dpr;var r=document.createElement("canvas"),a=r.getContext("2d"),n=e.getBoundingRect(),o=e.style,i=o.shadowBlur,l=o.shadowOffsetX,s=o.shadowOffsetY,u=o.hasStroke()?o.lineWidth:0,h=Math.max(u/2,-l+i),c=Math.max(u/2,l+i),d=Math.max(u/2,-s+i),m=Math.max(u/2,s+i),p=n.width+h+c,f=n.height+d+m;r.width=p*t,r.height=f*t,a.scale(t,t),a.clearRect(0,0,p,f),a.dpr=t;var v={position:e.position,rotation:e.rotation,scale:e.scale};e.position=[h-n.x,d-n.y],e.rotation=0,e.scale=[1,1],e.updateTransform(),e&&e.brush(a);var y=_,g=new y({style:{x:0,y:0,image:r}});return null!=v.position&&(g.position=e.position=v.position),null!=v.rotation&&(g.rotation=e.rotation=v.rotation),null!=v.scale&&(g.scale=e.scale=v.scale),g}};var N=w;e.exports=N},function(e,t,r){"use strict";function a(e,t){return e.zlevel===t.zlevel?e.z===t.z?e.z2-t.z2:e.z-t.z:e.zlevel-t.zlevel}var n=r(0),o=r(25),i=r(190),l=r(275),s=function(){this._roots=[],this._displayList=[],this._displayListLen=0};s.prototype={constructor:s,traverse:function(e,t){for(var r=0;r<this._roots.length;r++)this._roots[r].traverse(e,t)},getDisplayList:function(e,t){return t=t||!1,e&&this.updateDisplayList(t),this._displayList},updateDisplayList:function(e){this._displayListLen=0;for(var t=this._roots,r=this._displayList,n=0,i=t.length;n<i;n++)this._updateAndAddDisplayable(t[n],null,e);r.length=this._displayListLen,o.canvasSupported&&l(r,a)},_updateAndAddDisplayable:function(e,t,r){if(!e.ignore||r){e.beforeUpdate(),e.__dirty&&e.update(),e.afterUpdate();var a=e.clipPath;if(a){t=t?t.slice():[];for(var n=a,o=e;n;)n.parent=o,n.updateTransform(),t.push(n),o=n,n=n.clipPath}if(e.isGroup){for(var i=e._children,l=0;l<i.length;l++){var s=i[l];e.__dirty&&(s.__dirty=!0),this._updateAndAddDisplayable(s,t,r)}e.__dirty=!1}else e.__clipPaths=t,this._displayList[this._displayListLen++]=e}},addRoot:function(e){e.__storage!==this&&(e instanceof i&&e.addChildrenToStorage(this),this.addToStorage(e),this._roots.push(e))},delRoot:function(e){if(null==e){for(var t=0;t<this._roots.length;t++){var r=this._roots[t];r instanceof i&&r.delChildrenFromStorage(this)}return this._roots=[],this._displayList=[],void(this._displayListLen=0)}if(e instanceof Array)for(var t=0,a=e.length;t<a;t++)this.delRoot(e[t]);else{var o=n.indexOf(this._roots,e);o>=0&&(this.delFromStorage(e),this._roots.splice(o,1),e instanceof i&&e.delChildrenFromStorage(this))}},addToStorage:function(e){return e.__storage=this,e.dirty(!1),this},delFromStorage:function(e){return e&&(e.__storage=null),this},dispose:function(){this._renderList=this._roots=null},displayableSortFunc:a};var u=s;e.exports=u},function(e,t,r){"use strict";var a=r(0),n=r(62),o=n.Dispatcher,i=r(436),l=r(435),s=function(e){e=e||{},this.stage=e.stage||{},this.onframe=e.onframe||function(){},this._clips=[],this._running=!1,this._time,this._pausedTime,this._pauseStart,this._paused=!1,o.call(this)};s.prototype={constructor:s,addClip:function(e){this._clips.push(e)},addAnimator:function(e){e.animation=this;for(var t=e.getClips(),r=0;r<t.length;r++)this.addClip(t[r])},removeClip:function(e){var t=a.indexOf(this._clips,e);t>=0&&this._clips.splice(t,1)},removeAnimator:function(e){for(var t=e.getClips(),r=0;r<t.length;r++)this.removeClip(t[r]);e.animation=null},_update:function(){for(var e=(new Date).getTime()-this._pausedTime,t=e-this._time,r=this._clips,a=r.length,n=[],o=[],i=0;i<a;i++){var l=r[i],s=l.step(e,t);s&&(n.push(s),o.push(l))}for(var i=0;i<a;)r[i]._needsRemove?(r[i]=r[a-1],r.pop(),a--):i++;a=n.length;for(var i=0;i<a;i++)o[i].fire(n[i]);this._time=e,this.onframe(t),this.trigger("frame",t),this.stage.update&&this.stage.update()},_startLoop:function(){function e(){t._running&&(i(e),!t._paused&&t._update())}var t=this;this._running=!0,i(e)},start:function(){this._time=(new Date).getTime(),this._pausedTime=0,this._startLoop()},stop:function(){this._running=!1},pause:function(){this._paused||(this._pauseStart=(new Date).getTime(),this._paused=!0)},resume:function(){this._paused&&(this._pausedTime+=(new Date).getTime()-this._pauseStart,this._paused=!1)},clear:function(){this._clips=[]},animate:function(e,t){t=t||{};var r=new l(e,t.loop,t.getter,t.setter);return this.addAnimator(r),r}},a.mixin(s,o);var u=s;e.exports=u},function(e,t,r){"use strict";function a(e){this._target=e.target,this._life=e.life||1e3,this._delay=e.delay||0,this._initialized=!1,this.loop=null!=e.loop&&e.loop,this.gap=e.gap||0,this.easing=e.easing||"Linear",this.onframe=e.onframe,this.ondestroy=e.ondestroy,this.onrestart=e.onrestart,this._pausedTime=0,this._paused=!1}var n=r(1195);a.prototype={constructor:a,step:function(e,t){if(this._initialized||(this._startTime=e+this._delay,this._initialized=!0),this._paused)return void(this._pausedTime+=t);var r=(e-this._startTime-this._pausedTime)/this._life;if(!(r<0)){r=Math.min(r,1);var a=this.easing,o="string"==typeof a?n[a]:a,i="function"==typeof o?o(r):r;return this.fire("frame",i),1==r?this.loop?(this.restart(e),"restart"):(this._needsRemove=!0,"destroy"):null}},restart:function(e){var t=(e-this._startTime-this._pausedTime)%this._life;this._startTime=e-t+this.gap,this._pausedTime=0,this._needsRemove=!1},fire:function(e,t){e="on"+e,this[e]&&this[e](this._target,t)},pause:function(){this._paused=!0},resume:function(){this._paused=!1}};var o=a;e.exports=o},function(e,t,r){"use strict";var a={linear:function(e){return e},quadraticIn:function(e){return e*e},quadraticOut:function(e){return e*(2-e)},quadraticInOut:function(e){return(e*=2)<1?.5*e*e:-.5*(--e*(e-2)-1)},cubicIn:function(e){return e*e*e},cubicOut:function(e){return--e*e*e+1},cubicInOut:function(e){return(e*=2)<1?.5*e*e*e:.5*((e-=2)*e*e+2)},quarticIn:function(e){return e*e*e*e},quarticOut:function(e){return 1- --e*e*e*e},quarticInOut:function(e){return(e*=2)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2)},quinticIn:function(e){return e*e*e*e*e},quinticOut:function(e){return--e*e*e*e*e+1},quinticInOut:function(e){return(e*=2)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2)},sinusoidalIn:function(e){return 1-Math.cos(e*Math.PI/2)},sinusoidalOut:function(e){return Math.sin(e*Math.PI/2)},sinusoidalInOut:function(e){return.5*(1-Math.cos(Math.PI*e))},exponentialIn:function(e){return 0===e?0:Math.pow(1024,e-1)},exponentialOut:function(e){return 1===e?1:1-Math.pow(2,-10*e)},exponentialInOut:function(e){return 0===e?0:1===e?1:(e*=2)<1?.5*Math.pow(1024,e-1):.5*(2-Math.pow(2,-10*(e-1)))},circularIn:function(e){return 1-Math.sqrt(1-e*e)},circularOut:function(e){return Math.sqrt(1- --e*e)},circularInOut:function(e){return(e*=2)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1)},elasticIn:function(e){var t,r=.1;return 0===e?0:1===e?1:(!r||r<1?(r=1,t=.1):t=.4*Math.asin(1/r)/(2*Math.PI),-r*Math.pow(2,10*(e-=1))*Math.sin((e-t)*(2*Math.PI)/.4))},elasticOut:function(e){var t,r=.1;return 0===e?0:1===e?1:(!r||r<1?(r=1,t=.1):t=.4*Math.asin(1/r)/(2*Math.PI),r*Math.pow(2,-10*e)*Math.sin((e-t)*(2*Math.PI)/.4)+1)},elasticInOut:function(e){var t,r=.1;return 0===e?0:1===e?1:(!r||r<1?(r=1,t=.1):t=.4*Math.asin(1/r)/(2*Math.PI),(e*=2)<1?r*Math.pow(2,10*(e-=1))*Math.sin((e-t)*(2*Math.PI)/.4)*-.5:r*Math.pow(2,-10*(e-=1))*Math.sin((e-t)*(2*Math.PI)/.4)*.5+1)},backIn:function(e){var t=1.70158;return e*e*((t+1)*e-t)},backOut:function(e){var t=1.70158;return--e*e*((t+1)*e+t)+1},backInOut:function(e){var t=2.5949095;return(e*=2)<1?e*e*((t+1)*e-t)*.5:.5*((e-=2)*e*((t+1)*e+t)+2)},bounceIn:function(e){return 1-a.bounceOut(1-e)},bounceOut:function(e){return e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375},bounceInOut:function(e){return e<.5?.5*a.bounceIn(2*e):.5*a.bounceOut(2*e-1)+.5}},n=a;e.exports=n},function(e,t,r){"use strict";function a(e,t,r,a,n,l,s,u,h){if(0===s)return!1;var c=s;u-=e,h-=t;var d=Math.sqrt(u*u+h*h);if(d-c>r||d+c<r)return!1;if(Math.abs(a-n)%i<1e-4)return!0;if(l){var m=a;a=o(n),n=o(m)}else a=o(a),n=o(n);a>n&&(n+=i);var p=Math.atan2(h,u);return p<0&&(p+=i),p>=a&&p<=n||p+i>=a&&p+i<=n}var n=r(440),o=n.normalizeRadian,i=2*Math.PI;t.containStroke=a},function(e,t,r){"use strict";function a(e,t,r,a,o,i,l,s,u,h,c){if(0===u)return!1;var d=u;return!(c>t+d&&c>a+d&&c>i+d&&c>s+d||c<t-d&&c<a-d&&c<i-d&&c<s-d||h>e+d&&h>r+d&&h>o+d&&h>l+d||h<e-d&&h<r-d&&h<o-d&&h<l-d)&&n.cubicProjectPoint(e,t,r,a,o,i,l,s,h,c,null)<=d/2}var n=r(75);t.containStroke=a},function(e,t,r){"use strict";function a(e,t){return Math.abs(e-t)<w}function n(){var e=b[0];b[0]=b[1],b[1]=e}function o(e,t,r,a,o,i,l,s,u,h){if(h>t&&h>a&&h>i&&h>s||h<t&&h<a&&h<i&&h<s)return 0;var c=g.cubicRootAt(t,a,i,s,h,N);if(0===c)return 0;for(var d,m,p=0,f=-1,v=0;v<c;v++){var y=N[v],_=0===y||1===y?.5:1;g.cubicAt(e,r,o,l,y)<u||(f<0&&(f=g.cubicExtrema(t,a,i,s,b),b[1]<b[0]&&f>1&&n(),d=g.cubicAt(t,a,i,s,b[0]),f>1&&(m=g.cubicAt(t,a,i,s,b[1]))),2==f?y<b[0]?p+=d<t?_:-_:y<b[1]?p+=m<d?_:-_:p+=s<m?_:-_:y<b[0]?p+=d<t?_:-_:p+=s<d?_:-_)}return p}function i(e,t,r,a,n,o,i,l){if(l>t&&l>a&&l>o||l<t&&l<a&&l<o)return 0;var s=g.quadraticRootAt(t,a,o,l,N);if(0===s)return 0;var u=g.quadraticExtremum(t,a,o);if(u>=0&&u<=1){for(var h=0,c=g.quadraticAt(t,a,o,u),d=0;d<s;d++){var m=0===N[d]||1===N[d]?.5:1,p=g.quadraticAt(e,r,n,N[d]);p<i||(N[d]<u?h+=c<t?m:-m:h+=o<c?m:-m)}return h}var m=0===N[0]||1===N[0]?.5:1,p=g.quadraticAt(e,r,n,N[0]);return p<i?0:o<t?m:-m}function l(e,t,r,a,n,o,i,l){if((l-=t)>r||l<-r)return 0;var s=Math.sqrt(r*r-l*l);N[0]=-s,N[1]=s;var u=Math.abs(a-n);if(u<1e-4)return 0;if(u%x<1e-4){a=0,n=x;var h=o?1:-1;return i>=N[0]+e&&i<=N[1]+e?h:0}if(o){var s=a;a=y(n),n=y(s)}else a=y(a),n=y(n);a>n&&(n+=x);for(var c=0,d=0;d<2;d++){var m=N[d];if(m+e>i){var p=Math.atan2(l,m),h=o?1:-1;p<0&&(p=x+p),(p>=a&&p<=n||p+x>=a&&p+x<=n)&&(p>Math.PI/2&&p<1.5*Math.PI&&(h=-h),c+=h)}}return c}function s(e,t,r,n,s){for(var u=0,h=0,c=0,v=0,y=0,g=0;g<e.length;){var x=e[g++];switch(x===T.M&&g>1&&(r||(u+=_(h,c,v,y,n,s))),1==g&&(h=e[g],c=e[g+1],v=h,y=c),x){case T.M:v=e[g++],y=e[g++],h=v,c=y;break;case T.L:if(r){if(d.containStroke(h,c,e[g],e[g+1],t,n,s))return!0}else u+=_(h,c,e[g],e[g+1],n,s)||0;h=e[g++],c=e[g++];break;case T.C:if(r){if(m.containStroke(h,c,e[g++],e[g++],e[g++],e[g++],e[g],e[g+1],t,n,s))return!0}else u+=o(h,c,e[g++],e[g++],e[g++],e[g++],e[g],e[g+1],n,s)||0;h=e[g++],c=e[g++];break;case T.Q:if(r){if(p.containStroke(h,c,e[g++],e[g++],e[g],e[g+1],t,n,s))return!0}else u+=i(h,c,e[g++],e[g++],e[g],e[g+1],n,s)||0;h=e[g++],c=e[g++];break;case T.A:var w=e[g++],N=e[g++],b=e[g++],L=e[g++],S=e[g++],k=e[g++],D=(e[g++],1-e[g++]),M=Math.cos(S)*b+w,A=Math.sin(S)*L+N;g>1?u+=_(h,c,M,A,n,s):(v=M,y=A);var I=(n-w)*L/b+w;if(r){if(f.containStroke(w,N,L,S,S+k,D,t,I,s))return!0}else u+=l(w,N,L,S,S+k,D,I,s);h=Math.cos(S+k)*b+w,c=Math.sin(S+k)*L+N;break;case T.R:v=h=e[g++],y=c=e[g++];var z=e[g++],C=e[g++],M=v+z,A=y+C;if(r){if(d.containStroke(v,y,M,y,t,n,s)||d.containStroke(M,y,M,A,t,n,s)||d.containStroke(M,A,v,A,t,n,s)||d.containStroke(v,A,v,y,t,n,s))return!0}else u+=_(M,y,M,A,n,s),u+=_(v,A,v,y,n,s);break;case T.Z:if(r){if(d.containStroke(h,c,v,y,t,n,s))return!0}else u+=_(h,c,v,y,n,s);h=v,c=y}}return r||a(c,y)||(u+=_(h,c,v,y,n,s)||0),0!==u}function u(e,t,r){return s(e,0,!1,t,r)}function h(e,t,r,a){return s(e,t,!0,r,a)}var c=r(121),d=r(437),m=r(1197),p=r(439),f=r(1196),v=r(440),y=v.normalizeRadian,g=r(75),_=r(441),T=c.CMD,x=2*Math.PI,w=1e-4,N=[-1,-1,-1],b=[-1,-1];t.contain=u,t.containStroke=h},function(e,t,r){"use strict";function a(e){var t=e[1][0]-e[0][0],r=e[1][1]-e[0][1];return Math.sqrt(t*t+r*r)}function n(e){return[(e[0][0]+e[1][0])/2,(e[0][1]+e[1][1])/2]}var o=r(62),i=function(){this._track=[]};i.prototype={constructor:i,recognize:function(e,t,r){return this._doTrack(e,t,r),this._recognize(e)},clear:function(){return this._track.length=0,this},_doTrack:function(e,t,r){var a=e.touches;if(a){for(var n={points:[],touches:[],target:t,event:e},i=0,l=a.length;i<l;i++){var s=a[i],u=o.clientToLocal(r,s,{});n.points.push([u.zrX,u.zrY]),n.touches.push(s)}this._track.push(n)}},_recognize:function(e){for(var t in l)if(l.hasOwnProperty(t)){var r=l[t](this._track,e);if(r)return r}}};var l={pinch:function(e,t){var r=e.length;if(r){var o=(e[r-1]||{}).points,i=(e[r-2]||{}).points||o;if(i&&i.length>1&&o&&o.length>1){var l=a(o)/a(i);!isFinite(l)&&(l=1),t.pinchScale=l;var s=n(o);return t.pinchX=s[0],t.pinchY=s[1],{type:"pinch",target:e[0].target,event:t}}}}},s=i;e.exports=s},function(e,t,r){"use strict";function a(){}function n(e,t,r,a){for(var n=0,o=t.length,i=0,l=0;n<o;n++){var s=t[n];if(s.removed){for(var u=[],h=l;h<l+s.count;h++)u.push(h);s.indices=u,l+=s.count}else{for(var u=[],h=i;h<i+s.count;h++)u.push(h);s.indices=u,i+=s.count,s.added||(l+=s.count)}}return t}function o(e){return{newPos:e.newPos,components:e.components.slice(0)}}function i(e,t,r){return l.diff(e,t,r)}a.prototype={diff:function(e,t,r){r||(r=function(e,t){return e===t}),this.equals=r;var a=this;e=e.slice(),t=t.slice();var i=t.length,l=e.length,s=1,u=i+l,h=[{newPos:-1,components:[]}],c=this.extractCommon(h[0],t,e,0);if(h[0].newPos+1>=i&&c+1>=l){for(var d=[],m=0;m<t.length;m++)d.push(m);return[{indices:d,count:t.length}]}for(;s<=u;){var p=function(){for(var r=-1*s;r<=s;r+=2){var u,c=h[r-1],d=h[r+1],m=(d?d.newPos:0)-r;c&&(h[r-1]=void 0);var p=c&&c.newPos+1<i,f=d&&0<=m&&m<l;if(p||f){if(!p||f&&c.newPos<d.newPos?(u=o(d),a.pushComponent(u.components,void 0,!0)):(u=c,u.newPos++,a.pushComponent(u.components,!0,void 0)),m=a.extractCommon(u,t,e,r),u.newPos+1>=i&&m+1>=l)return n(a,u.components,t,e);h[r]=u}else h[r]=void 0}s++}();if(p)return p}},pushComponent:function(e,t,r){var a=e[e.length-1];a&&a.added===t&&a.removed===r?e[e.length-1]={count:a.count+1,added:t,removed:r}:e.push({count:1,added:t,removed:r})},extractCommon:function(e,t,r,a){for(var n=t.length,o=r.length,i=e.newPos,l=i-a,s=0;i+1<n&&l+1<o&&this.equals(t[i+1],r[l+1]);)i++,l++,s++;return s&&e.components.push({count:s}),e.newPos=i,l},tokenize:function(e){return e.slice()},join:function(e){return e.slice()}};var l=new a;e.exports=i},function(e,t,r){"use strict";function a(e){return"mousewheel"===e&&f.browser.firefox?"DOMMouseScroll":e}function n(e,t,r){var a=e._gestureMgr;"start"===r&&a.clear();var n=a.recognize(t,e.handler.findHover(t.zrX,t.zrY,null).target,e.dom);if("end"===r&&a.clear(),n){var o=n.type;t.gestureEvent=o,e.handler.dispatchToElement({target:n.target},o,n.event)}}function o(e){e._touching=!0,clearTimeout(e._touchTimer),e._touchTimer=setTimeout(function(){e._touching=!1},700)}function i(e){var t=e.pointerType;return"pen"===t||"touch"===t}function l(e){function t(e,t){return function(){if(!t._touching)return e.apply(t,arguments)}}m.each(g,function(t){e._handlers[t]=m.bind(x[t],e)}),m.each(T,function(t){e._handlers[t]=m.bind(x[t],e)}),m.each(y,function(r){e._handlers[r]=t(x[r],e)})}function s(e){function t(t,r){m.each(t,function(t){h(e,a(t),r._handlers[t])},r)}p.call(this),this.dom=e,this._touching=!1,this._touchTimer,this._gestureMgr=new v,this._handlers={},l(this),f.pointerEventsSupported?t(T,this):(f.touchEventsSupported&&t(g,this),t(y,this))}var u=r(62),h=u.addEventListener,c=u.removeEventListener,d=u.normalizeEvent,m=r(0),p=r(98),f=r(25),v=r(1199),y=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],g=["touchstart","touchend","touchmove"],_={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},T=m.map(y,function(e){var t=e.replace("mouse","pointer");return _[t]?t:e}),x={mousemove:function(e){e=d(this.dom,e),this.trigger("mousemove",e)},mouseout:function(e){e=d(this.dom,e);var t=e.toElement||e.relatedTarget;if(t!=this.dom)for(;t&&9!=t.nodeType;){if(t===this.dom)return;t=t.parentNode}this.trigger("mouseout",e)},touchstart:function(e){e=d(this.dom,e),e.zrByTouch=!0,this._lastTouchMoment=new Date,n(this,e,"start"),x.mousemove.call(this,e),x.mousedown.call(this,e),o(this)},touchmove:function(e){e=d(this.dom,e),e.zrByTouch=!0,n(this,e,"change"),x.mousemove.call(this,e),o(this)},touchend:function(e){e=d(this.dom,e),e.zrByTouch=!0,n(this,e,"end"),x.mouseup.call(this,e),+new Date-this._lastTouchMoment<300&&x.click.call(this,e),o(this)},pointerdown:function(e){x.mousedown.call(this,e)},pointermove:function(e){i(e)||x.mousemove.call(this,e)},pointerup:function(e){x.mouseup.call(this,e)},pointerout:function(e){i(e)||x.mouseout.call(this,e)}};m.each(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(e){x[e]=function(t){t=d(this.dom,t),this.trigger(e,t)}});var w=s.prototype;w.dispose=function(){for(var e=y.concat(g),t=0;t<e.length;t++){var r=e[t];c(this.dom,a(r),this._handlers[r])}},w.setCursor=function(e){this.dom.style.cursor=e||"default"},m.mixin(s,p);var N=s;e.exports=N},function(e,t,r){"use strict";var a=r(26),n=a.extend({type:"compound",shape:{paths:null},_updatePathDirty:function(){for(var e=this.__dirtyPath,t=this.shape.paths,r=0;r<t.length;r++)e=e||t[r].__dirtyPath;this.__dirtyPath=e,this.__dirty=this.__dirty||e},beforeBrush:function(){this._updatePathDirty();for(var e=this.shape.paths||[],t=this.getGlobalScale(),r=0;r<e.length;r++)e[r].path||e[r].createPathProxy(),e[r].path.setScale(t[0],t[1])},buildPath:function(e,t){for(var r=t.paths||[],a=0;a<r.length;a++)r[a].buildPath(e,r[a].shape,!0)},afterBrush:function(){for(var e=this.shape.paths||[],t=0;t<e.length;t++)e[t].__dirtyPath=!1},getBoundingRect:function(){return this._updatePathDirty(),a.prototype.getBoundingRect.call(this)}});e.exports=n},function(e,t,r){"use strict";var a=r(0),n=r(192),o=function(e,t,r,a,o){this.x=null==e?.5:e,this.y=null==t?.5:t,this.r=null==r?.5:r,this.type="radial",this.global=o||!1,n.call(this,a)};o.prototype={constructor:o},a.inherits(o,n);var i=o;e.exports=i},function(e,t,r){"use strict";function a(e,t,r,a){var n,d,m,p,f=[],v=[],y=[],g=[];if(a){m=[1/0,1/0],p=[-1/0,-1/0];for(var _=0,T=e.length;_<T;_++)o(m,m,e[_]),i(p,p,e[_]);o(m,m,a[0]),i(p,p,a[1])}for(var _=0,T=e.length;_<T;_++){var x=e[_];if(r)n=e[_?_-1:T-1],d=e[(_+1)%T];else{if(0===_||_===T-1){f.push(h(e[_]));continue}n=e[_-1],d=e[_+1]}c(v,d,n),l(v,v,t);var w=s(x,n),N=s(x,d),b=w+N;0!==b&&(w/=b,N/=b),l(y,v,-w),l(g,v,N);var L=u([],x,y),S=u([],x,g);a&&(i(L,L,m),o(L,L,p),i(S,S,m),o(S,S,p)),f.push(L),f.push(S)}return r&&f.push(f.shift()),f}var n=r(12),o=n.min,i=n.max,l=n.scale,s=n.distance,u=n.add,h=n.clone,c=n.sub;e.exports=a},function(e,t,r){"use strict";function a(e,t,r,a,n,o,i){var l=.5*(r-e),s=.5*(a-t);return(2*(t-r)+l+s)*i+(-3*(t-r)-2*l-s)*o+l*n+t}function n(e,t){for(var r=e.length,n=[],o=0,l=1;l<r;l++)o+=i(e[l-1],e[l]);var s=o/2;s=s<r?r:s;for(var l=0;l<s;l++){var u,h,c,d=l/(s-1)*(t?r:r-1),m=Math.floor(d),p=d-m,f=e[m%r];t?(u=e[(m-1+r)%r],h=e[(m+1)%r],c=e[(m+2)%r]):(u=e[0===m?m:m-1],h=e[m>r-2?r-1:m+1],c=e[m>r-3?r-1:m+2]);var v=p*p,y=p*v;n.push([a(u[0],f[0],h[0],c[0],p,v,y),a(u[1],f[1],h[1],c[1],p,v,y)])}return n}var o=r(12),i=o.distance;e.exports=n},function(e,t,r){"use strict";var a=r(26),n=a.extend({type:"arc",shape:{cx:0,cy:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},style:{stroke:"#000",fill:null},buildPath:function(e,t){var r=t.cx,a=t.cy,n=Math.max(t.r,0),o=t.startAngle,i=t.endAngle,l=t.clockwise,s=Math.cos(o),u=Math.sin(o);e.moveTo(s*n+r,u*n+a),e.arc(r,a,n,o,i,!l)}});e.exports=n},function(e,t,r){"use strict";function a(e,t,r){var a=e.cpx2,n=e.cpy2;return null===a||null===n?[(r?d:h)(e.x1,e.cpx1,e.cpx2,e.x2,t),(r?d:h)(e.y1,e.cpy1,e.cpy2,e.y2,t)]:[(r?c:u)(e.x1,e.cpx1,e.x2,t),(r?c:u)(e.y1,e.cpy1,e.y2,t)]}var n=r(26),o=r(12),i=r(75),l=i.quadraticSubdivide,s=i.cubicSubdivide,u=i.quadraticAt,h=i.cubicAt,c=i.quadraticDerivativeAt,d=i.cubicDerivativeAt,m=[],p=n.extend({type:"bezier-curve",shape:{x1:0,y1:0,x2:0,y2:0,cpx1:0,cpy1:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(e,t){var r=t.x1,a=t.y1,n=t.x2,o=t.y2,i=t.cpx1,u=t.cpy1,h=t.cpx2,c=t.cpy2,d=t.percent;0!==d&&(e.moveTo(r,a),null==h||null==c?(d<1&&(l(r,i,n,d,m),i=m[1],n=m[2],l(a,u,o,d,m),u=m[1],o=m[2]),e.quadraticCurveTo(i,u,n,o)):(d<1&&(s(r,i,h,n,d,m),i=m[1],h=m[2],n=m[3],s(a,u,c,o,d,m),u=m[1],c=m[2],o=m[3]),e.bezierCurveTo(i,u,h,c,n,o)))},pointAt:function(e){return a(this.shape,e,!1)},tangentAt:function(e){var t=a(this.shape,e,!0);return o.normalize(t,t)}});e.exports=p},function(e,t,r){"use strict";var a=r(26),n=a.extend({type:"circle",shape:{cx:0,cy:0,r:0},buildPath:function(e,t,r){r&&e.moveTo(t.cx+t.r,t.cy),e.arc(t.cx,t.cy,t.r,0,2*Math.PI,!0)}});e.exports=n},function(e,t,r){"use strict";var a=r(26),n=a.extend({type:"line",shape:{x1:0,y1:0,x2:0,y2:0,percent:1},style:{stroke:"#000",fill:null},buildPath:function(e,t){var r=t.x1,a=t.y1,n=t.x2,o=t.y2,i=t.percent;0!==i&&(e.moveTo(r,a),i<1&&(n=r*(1-i)+n*i,o=a*(1-i)+o*i),e.lineTo(n,o))},pointAt:function(e){var t=this.shape;return[t.x1*(1-e)+t.x2*e,t.y1*(1-e)+t.y2*e]}});e.exports=n},function(e,t,r){"use strict";var a=r(26),n=r(448),o=a.extend({type:"polygon",shape:{points:null,smooth:!1,smoothConstraint:null},buildPath:function(e,t){n.buildPath(e,t,!0)}});e.exports=o},function(e,t,r){"use strict";var a=r(26),n=r(448),o=a.extend({type:"polyline",shape:{points:null,smooth:!1,smoothConstraint:null},style:{stroke:"#000",fill:null},buildPath:function(e,t){n.buildPath(e,t,!1)}});e.exports=o},function(e,t,r){"use strict";var a=r(26),n=r(449),o=a.extend({type:"rect",shape:{r:0,x:0,y:0,width:0,height:0},buildPath:function(e,t){var r=t.x,a=t.y,o=t.width,i=t.height;t.r?n.buildPath(e,t):e.rect(r,a,o,i),e.closePath()}});e.exports=o},function(e,t,r){"use strict";var a=r(26),n=a.extend({type:"ring",shape:{cx:0,cy:0,r:0,r0:0},buildPath:function(e,t){var r=t.cx,a=t.cy,n=2*Math.PI;e.moveTo(r+t.r,a),e.arc(r,a,t.r,0,n,!1),e.moveTo(r+t.r0,a),e.arc(r,a,t.r0,0,n,!0)}});e.exports=n},function(e,t,r){"use strict";var a=r(26),n=r(447),o=a.extend({type:"sector",shape:{cx:0,cy:0,r0:0,r:0,startAngle:0,endAngle:2*Math.PI,clockwise:!0},brush:n(a.prototype.brush),buildPath:function(e,t){var r=t.cx,a=t.cy,n=Math.max(t.r0||0,0),o=Math.max(t.r,0),i=t.startAngle,l=t.endAngle,s=t.clockwise,u=Math.cos(i),h=Math.sin(i);e.moveTo(u*n+r,h*n+a),e.lineTo(u*o+r,h*o+a),e.arc(r,a,o,i,l,!s),e.lineTo(Math.cos(l)*n+r,Math.sin(l)*n+a),0!==n&&e.arc(r,a,n,l,i,s),e.closePath()}});e.exports=o},function(e,t,r){"use strict";var a=r(435),n=r(139),o=r(0),i=o.isString,l=o.isFunction,s=o.isObject,u=o.isArrayLike,h=o.indexOf,c=function(){this.animators=[]};c.prototype={constructor:c,animate:function(e,t){var r,o=!1,i=this,l=this.__zr;if(e){var s=e.split("."),u=i;o="shape"===s[0];for(var c=0,d=s.length;c<d;c++)u&&(u=u[s[c]]);u&&(r=u)}else r=i;if(!r)return void n('Property "'+e+'" is not existed in element '+i.id);var m=i.animators,p=new a(r,t);return p.during(function(e){i.dirty(o)}).done(function(){m.splice(h(m,p),1)}),m.push(p),l&&l.animation.addAnimator(p),p},stopAnimation:function(e){for(var t=this.animators,r=t.length,a=0;a<r;a++)t[a].stop(e);return t.length=0,this},animateTo:function(e,t,r,a,n,o){function s(){--h||n&&n()}i(r)?(n=a,a=r,r=0):l(a)?(n=a,a="linear",r=0):l(r)?(n=r,r=0):l(t)?(n=t,t=500):t||(t=500),this.stopAnimation(),this._animateToShallow("",this,e,t,r);var u=this.animators.slice(),h=u.length;h||n&&n();for(var c=0;c<u.length;c++)u[c].done(s).start(a,o)},_animateToShallow:function(e,t,r,a,n){var o={},i=0;for(var l in r)if(r.hasOwnProperty(l))if(null!=t[l])s(r[l])&&!u(r[l])?this._animateToShallow(e?e+"."+l:l,t[l],r[l],a,n):(o[l]=r[l],i++);else if(null!=r[l])if(e){var h={};h[e]={},h[e][l]=r[l],this.attr(h)}else this.attr(l,r[l]);return i>0&&this.animate(e,!1).when(null==a?500:a,o).delay(n||0),this}};var d=c;e.exports=d},function(e,t,r){"use strict";function a(){this.on("mousedown",this._dragStart,this),this.on("mousemove",this._drag,this),this.on("mouseup",this._dragEnd,this),this.on("globalout",this._dragEnd,this)}function n(e,t){return{target:e,topTarget:t&&t.topTarget}}a.prototype={constructor:a,_dragStart:function(e){var t=e.target;t&&t.draggable&&(this._draggingTarget=t,t.dragging=!0,this._x=e.offsetX,this._y=e.offsetY,this.dispatchToElement(n(t,e),"dragstart",e.event))},_drag:function(e){var t=this._draggingTarget;if(t){var r=e.offsetX,a=e.offsetY,o=r-this._x,i=a-this._y;this._x=r,this._y=a,t.drift(o,i,e),this.dispatchToElement(n(t,e),"drag",e.event);var l=this.findHover(r,a,t).target,s=this._dropTarget;this._dropTarget=l,t!==l&&(s&&l!==s&&this.dispatchToElement(n(s,e),"dragleave",e.event),l&&l!==s&&this.dispatchToElement(n(l,e),"dragenter",e.event))}},_dragEnd:function(e){var t=this._draggingTarget;t&&(t.dragging=!1),this.dispatchToElement(n(t,e),"dragend",e.event),this._dropTarget&&this.dispatchToElement(n(this._dropTarget,e),"drop",e.event),this._draggingTarget=null,this._dropTarget=null}};var o=a;e.exports=o},function(e,t,r){"use strict";function a(e){return parseInt(e,10)}function n(e){return e instanceof y?b:e instanceof g?L:e instanceof _?S:b}function o(e,t){return t&&e&&t.parentNode!==e}function i(e,t,r){if(o(e,t)&&r){var a=r.nextSibling;a?e.insertBefore(t,a):e.appendChild(t)}}function l(e,t){if(o(e,t)){var r=e.firstChild;r?e.insertBefore(t,r):e.appendChild(t)}}function s(e,t){t&&e&&t.parentNode===e&&e.removeChild(t)}function u(e){return e.__textSvgEl}function h(e){return e.__svgEl}function c(e){return function(){v('In SVG mode painter not support method "'+e+'"')}}var d=r(278),m=d.createElement,p=r(0),f=p.each,v=r(139),y=r(26),g=r(140),_=r(141),T=r(1200),x=r(1219),w=r(1218),N=r(279),b=N.path,L=N.image,S=N.text,k=function(e,t,r){this.root=e,this.storage=t,this._opts=r=p.extend({},r||{});var a=m("svg");a.setAttribute("xmlns","http://www.w3.org/2000/svg"),a.setAttribute("version","1.1"),a.setAttribute("baseProfile","full"),a.style["user-select"]="none",a.style.cssText="position:absolute;left:0;top:0;",this.gradientManager=new x(a),this.clipPathManager=new w(a);var n=document.createElement("div");n.style.cssText="overflow:hidden;position:relative",this._svgRoot=a,this._viewport=n,e.appendChild(n),n.appendChild(a),this.resize(r.width,r.height),this._visibleList=[]};k.prototype={constructor:k,getType:function(){return"svg"},getViewportRoot:function(){return this._viewport},getViewportRootOffset:function(){var e=this.getViewportRoot();if(e)return{offsetLeft:e.offsetLeft||0,offsetTop:e.offsetTop||0}},refresh:function(){var e=this.storage.getDisplayList(!0);this._paintList(e)},_paintList:function(e){this.gradientManager.markAllUnused(),this.clipPathManager.markAllUnused();var t,r=this._svgRoot,a=this._visibleList,o=e.length,c=[];for(t=0;t<o;t++){var d=e[t],m=n(d);d.invisible||(d.__dirty&&(m&&m.brush(d),this.clipPathManager.update(d),d.style&&(this.gradientManager.update(d.style.fill),this.gradientManager.update(d.style.stroke)),d.__dirty=!1),c.push(d))}var p,f=T(a,c);for(t=0;t<f.length;t++){var v=f[t];if(v.removed)for(var y=0;y<v.count;y++){var d=a[v.indices[y]],g=h(d),_=u(d);s(r,g),s(r,_)}}for(t=0;t<f.length;t++){var v=f[t];if(v.added)for(var y=0;y<v.count;y++){var d=c[v.indices[y]],g=h(d),_=u(d);p?i(r,g,p):l(r,g),g?i(r,_,g):p?i(r,_,p):l(r,_),i(r,_,g),p=_||g||p,this.gradientManager.addWithoutUpdate(g,d),this.clipPathManager.markUsed(d)}else if(!v.removed)for(var y=0;y<v.count;y++){var d=c[v.indices[y]];p=g=u(d)||h(d)||p,this.gradientManager.markUsed(d),this.gradientManager.addWithoutUpdate(g,d),this.clipPathManager.markUsed(d)}}this.gradientManager.removeUnused(),this.clipPathManager.removeUnused(),this._visibleList=c},_getDefs:function(e){var t=this._svgRoot,r=this._svgRoot.getElementsByTagName("defs");if(0===r.length){if(e){var r=t.insertBefore(m("defs"),t.firstChild);return r.contains||(r.contains=function(e){var t=r.children;if(!t)return!1;for(var a=t.length-1;a>=0;--a)if(t[a]===e)return!0;return!1}),r}return null}return r[0]},resize:function(e,t){var r=this._viewport;r.style.display="none";var a=this._opts;if(null!=e&&(a.width=e),null!=t&&(a.height=t),e=this._getSize(0),t=this._getSize(1),r.style.display="",this._width!==e&&this._height!==t){this._width=e,this._height=t;var n=r.style;n.width=e+"px",n.height=t+"px";var o=this._svgRoot;o.setAttribute("width",e),o.setAttribute("height",t)}},getWidth:function(){return this._width},getHeight:function(){return this._height},_getSize:function(e){var t=this._opts,r=["width","height"][e],n=["clientWidth","clientHeight"][e],o=["paddingLeft","paddingTop"][e],i=["paddingRight","paddingBottom"][e];if(null!=t[r]&&"auto"!==t[r])return parseFloat(t[r]);var l=this.root,s=document.defaultView.getComputedStyle(l);return(l[n]||a(s[r])||a(l.style[r]))-(a(s[o])||0)-(a(s[i])||0)|0},dispose:function(){this.root.innerHTML="",this._svgRoot=this._viewport=this.storage=null},clear:function(){this._viewport&&this.root.removeChild(this._viewport)},pathToSvg:function(){this.refresh();var e=this._svgRoot.outerHTML;return"data:img/svg+xml;utf-8,"+unescape(e)}},f(["getLayer","insertLayer","eachLayer","eachBuiltinLayer","eachOtherLayer","getLayers","modLayer","delLayer","clearLayer","toDataURL","pathToImage"],function(e){k.prototype[e]=c(e)});var D=k;e.exports=D},function(e,t,r){"use strict";function a(e){n.call(this,e,"clipPath","__clippath_in_use__")}var n=r(451),o=r(0),i=r(40);o.inherits(a,n),a.prototype.update=function(e){var t=this.getSvgElement(e);t&&this.updateDom(t,e.__clipPaths,!1);var r=this.getTextSvgElement(e);r&&this.updateDom(r,e.__clipPaths,!0),this.markUsed(e)},a.prototype.updateDom=function(e,t,r){if(t&&t.length>0){var a,n,o=this.getDefs(!0),l=t[0],s=r?"_textDom":"_dom";l[s]?(n=l[s].getAttribute("id"),a=l[s],o.contains(a)||o.appendChild(a)):(n="zr-clip-"+this.nextId,++this.nextId,a=this.createElement("clipPath"),a.setAttribute("id",n),o.appendChild(a),l[s]=a);var u=this.getSvgProxy(l);if(l.transform&&l.parent.invTransform&&!r){var h=Array.prototype.slice.call(l.transform);i.mul(l.transform,l.parent.invTransform,l.transform),u.brush(l),l.transform=h}else u.brush(l);var c=this.getSvgElement(l);a.appendChild(c.cloneNode()),e.setAttribute("clip-path","url(#"+n+")"),t.length>1&&this.updateDom(a,t.slice(1),r)}else e&&e.setAttribute("clip-path","none")},a.prototype.markUsed=function(e){var t=this;e.__clipPaths&&e.__clipPaths.length>0&&o.each(e.__clipPaths,function(e){e._dom&&n.prototype.markUsed.call(t,e._dom),e._textDom&&n.prototype.markUsed.call(t,e._textDom)})};var l=a;e.exports=l},function(e,t,r){"use strict";function a(e){n.call(this,e,["linearGradient","radialGradient"],"__gradient_in_use__")}var n=r(451),o=r(0),i=r(139);o.inherits(a,n),a.prototype.addWithoutUpdate=function(e,t){if(t&&t.style){var r=this;o.each(["fill","stroke"],function(a){if(t.style[a]&&("linear"===t.style[a].type||"radial"===t.style[a].type)){var n,o=t.style[a],i=r.getDefs(!0);o._dom?(n=o._dom,i.contains(o._dom)||r.addDom(n)):n=r.add(o),r.markUsed(t);var l=n.getAttribute("id");e.setAttribute(a,"url(#"+l+")")}})}},a.prototype.add=function(e){var t;if("linear"===e.type)t=this.createElement("linearGradient");else{if("radial"!==e.type)return i("Illegal gradient type."),null;t=this.createElement("radialGradient")}return e.id=e.id||this.nextId++,t.setAttribute("id","zr-gradient-"+e.id),this.updateDom(e,t),this.addDom(t),t},a.prototype.update=function(e){var t=this;n.prototype.update.call(this,e,function(){var r=e.type,a=e._dom.tagName;"linear"===r&&"linearGradient"===a||"radial"===r&&"radialGradient"===a?t.updateDom(e,e._dom):(t.removeDom(e),t.add(e))})},a.prototype.updateDom=function(e,t){if("linear"===e.type)t.setAttribute("x1",e.x),t.setAttribute("y1",e.y),t.setAttribute("x2",e.x2),t.setAttribute("y2",e.y2);else{if("radial"!==e.type)return void i("Illegal gradient type.");t.setAttribute("cx",e.x),t.setAttribute("cy",e.y),t.setAttribute("r",e.r)}e.global?t.setAttribute("gradientUnits","userSpaceOnUse"):t.setAttribute("gradientUnits","objectBoundingBox"),t.innerHTML="";for(var r=e.colorStops,a=0,n=r.length;a<n;++a){var o=this.createElement("stop");o.setAttribute("offset",100*r[a].offset+"%"),o.setAttribute("stop-color",r[a].color),t.appendChild(o)}e._dom=t},a.prototype.markUsed=function(e){if(e.style){var t=e.style.fill;t&&t._dom&&n.prototype.markUsed.call(this,t._dom),(t=e.style.stroke)&&t._dom&&n.prototype.markUsed.call(this,t._dom)}};var l=a;e.exports=l},function(e,t,r){"use strict";r(279),(0,r(194).registerPainter)("svg",r(1217))},function(e,t,r){"use strict";function a(e,t,r,a,n,o,i,l,s,u,h){var c=s*(v/180),d=f(c)*(e-r)/2+p(c)*(t-a)/2,y=-1*p(c)*(e-r)/2+f(c)*(t-a)/2,T=d*d/(i*i)+y*y/(l*l);T>1&&(i*=m(T),l*=m(T));var x=(n===o?-1:1)*m((i*i*(l*l)-i*i*(y*y)-l*l*(d*d))/(i*i*(y*y)+l*l*(d*d)))||0,w=x*i*y/l,N=x*-l*d/i,b=(e+r)/2+f(c)*w-p(c)*N,L=(t+a)/2+p(c)*w+f(c)*N,S=_([1,0],[(d-w)/i,(y-N)/l]),k=[(d-w)/i,(y-N)/l],D=[(-1*d-w)/i,(-1*y-N)/l],M=_(k,D);g(k,D)<=-1&&(M=v),g(k,D)>=1&&(M=0),0===o&&M>0&&(M-=2*v),1===o&&M<0&&(M+=2*v),h.addData(u,b,L,i,l,S,M,c,o)}function n(e){if(!e)return[];var t,r=e.replace(/-/g," -").replace(/ /g," ").replace(/ /g,",").replace(/,,/g,",");for(t=0;t<d.length;t++)r=r.replace(new RegExp(d[t],"g"),"|"+d[t]);var n,o=r.split("|"),i=0,l=0,s=new h,u=h.CMD;for(t=1;t<o.length;t++){var c,m=o[t],p=m.charAt(0),f=0,v=m.slice(1).replace(/e,-/g,"e-").split(",");v.length>0&&""===v[0]&&v.shift();for(var y=0;y<v.length;y++)v[y]=parseFloat(v[y]);for(;f<v.length&&!isNaN(v[f])&&!isNaN(v[0]);){var g,_,T,x,w,N,b,L=i,S=l;switch(p){case"l":i+=v[f++],l+=v[f++],c=u.L,s.addData(c,i,l);break;case"L":i=v[f++],l=v[f++],c=u.L,s.addData(c,i,l);break;case"m":i+=v[f++],l+=v[f++],c=u.M,s.addData(c,i,l),p="l";break;case"M":i=v[f++],l=v[f++],c=u.M,s.addData(c,i,l),p="L";break;case"h":i+=v[f++],c=u.L,s.addData(c,i,l);break;case"H":i=v[f++],c=u.L,s.addData(c,i,l);break;case"v":l+=v[f++],c=u.L,s.addData(c,i,l);break;case"V":l=v[f++],c=u.L,s.addData(c,i,l);break;case"C":c=u.C,s.addData(c,v[f++],v[f++],v[f++],v[f++],v[f++],v[f++]),i=v[f-2],l=v[f-1];break;case"c":c=u.C,s.addData(c,v[f++]+i,v[f++]+l,v[f++]+i,v[f++]+l,v[f++]+i,v[f++]+l),i+=v[f-2],l+=v[f-1];break;case"S":g=i,_=l;var k=s.len(),D=s.data;n===u.C&&(g+=i-D[k-4],_+=l-D[k-3]),c=u.C,L=v[f++],S=v[f++],i=v[f++],l=v[f++],s.addData(c,g,_,L,S,i,l);break;case"s":g=i,_=l;var k=s.len(),D=s.data;n===u.C&&(g+=i-D[k-4],_+=l-D[k-3]),c=u.C,L=i+v[f++],S=l+v[f++],i+=v[f++],l+=v[f++],s.addData(c,g,_,L,S,i,l);break;case"Q":L=v[f++],S=v[f++],i=v[f++],l=v[f++],c=u.Q,s.addData(c,L,S,i,l);break;case"q":L=v[f++]+i,S=v[f++]+l,i+=v[f++],l+=v[f++],c=u.Q,s.addData(c,L,S,i,l);break;case"T":g=i,_=l;var k=s.len(),D=s.data;n===u.Q&&(g+=i-D[k-4],_+=l-D[k-3]),i=v[f++],l=v[f++],c=u.Q,s.addData(c,g,_,i,l);break;case"t":g=i,_=l;var k=s.len(),D=s.data;n===u.Q&&(g+=i-D[k-4],_+=l-D[k-3]),i+=v[f++],l+=v[f++],c=u.Q,s.addData(c,g,_,i,l);break;case"A":T=v[f++],x=v[f++],w=v[f++],N=v[f++],b=v[f++],L=i,S=l,i=v[f++],l=v[f++],c=u.A,a(L,S,i,l,N,b,T,x,w,c,s);break;case"a":T=v[f++],x=v[f++],w=v[f++],N=v[f++],b=v[f++],L=i,S=l,i+=v[f++],l+=v[f++],c=u.A,a(L,S,i,l,N,b,T,x,w,c,s)}}"z"!==p&&"Z"!==p||(c=u.Z,s.addData(c)),n=c}return s.toStatic(),s}function o(e,t){var r=n(e);return t=t||{},t.buildPath=function(e){if(e.setData){e.setData(r.data);var t=e.getContext();t&&e.rebuildPath(t)}else{var t=e;r.rebuildPath(t)}},t.applyTransform=function(e){c(r,e),this.dirty(!0)},t}function i(e,t){return new u(o(e,t))}function l(e,t){return u.extend(o(e,t))}function s(e,t){for(var r=[],a=e.length,n=0;n<a;n++){var o=e[n];o.path||o.createPathProxy(),o.__dirtyPath&&o.buildPath(o.path,o.shape,!0),r.push(o.path)}var i=new u(t);return i.createPathProxy(),i.buildPath=function(e){e.appendPath(r);var t=e.getContext();t&&e.rebuildPath(t)},i}var u=r(26),h=r(121),c=r(1222),d=["m","M","l","L","v","V","h","H","z","Z","c","C","q","Q","t","T","s","S","a","A"],m=Math.sqrt,p=Math.sin,f=Math.cos,v=Math.PI,y=function(e){return Math.sqrt(e[0]*e[0]+e[1]*e[1])},g=function(e,t){return(e[0]*t[0]+e[1]*t[1])/(y(e)*y(t))},_=function(e,t){return(e[0]*t[1]<e[1]*t[0]?-1:1)*Math.acos(g(e,t))};t.createFromString=i,t.extendFromString=l,t.mergePath=s},function(e,t,r){"use strict";function a(e,t){var r,a,n,o,c,d,m=e.data,p=l.M,f=l.C,v=l.L,y=l.R,g=l.A,_=l.Q;for(n=0,o=0;n<m.length;){switch(r=m[n++],o=n,a=0,r){case p:case v:a=1;break;case f:a=3;break;case _:a=2;break;case g:var T=t[4],x=t[5],w=u(t[0]*t[0]+t[1]*t[1]),N=u(t[2]*t[2]+t[3]*t[3]),b=h(-t[1]/N,t[0]/w);m[n]*=w,m[n++]+=T,m[n]*=N,m[n++]+=x,m[n++]*=w,m[n++]*=N,m[n++]+=b,m[n++]+=b,n+=2,o=n;break;case y:d[0]=m[n++],d[1]=m[n++],i(d,d,t),m[o++]=d[0],m[o++]=d[1],d[0]+=m[n++],d[1]+=m[n++],i(d,d,t),m[o++]=d[0],m[o++]=d[1]}for(c=0;c<a;c++){var d=s[c];d[0]=m[n++],d[1]=m[n++],i(d,d,t),m[o++]=d[0],m[o++]=d[1]}}}var n=r(121),o=r(12),i=o.applyTransform,l=n.CMD,s=[[],[],[]],u=Math.sqrt,h=Math.atan2;e.exports=a},function(e,t,r){"use strict";function a(e){return parseInt(e,10)}function n(e,t){l.initVML(),this.root=e,this.storage=t;var r=document.createElement("div"),a=document.createElement("div");r.style.cssText="display:inline-block;overflow:hidden;position:relative;width:300px;height:150px;",a.style.cssText="position:absolute;left:0;top:0;",e.appendChild(r),this._vmlRoot=a,this._vmlViewport=r,this.resize();var n=t.delFromStorage,o=t.addToStorage;t.delFromStorage=function(e){n.call(t,e),e&&e.onRemove&&e.onRemove(a)},t.addToStorage=function(e){e.onAdd&&e.onAdd(a),o.call(t,e)},this._firstPaint=!0}function o(e){return function(){i('In IE8.0 VML mode painter not support method "'+e+'"')}}var i=r(139),l=r(452),s=r(0),u=s.each;n.prototype={constructor:n,getType:function(){return"vml"},getViewportRoot:function(){return this._vmlViewport},getViewportRootOffset:function(){var e=this.getViewportRoot();if(e)return{offsetLeft:e.offsetLeft||0,offsetTop:e.offsetTop||0}},refresh:function(){var e=this.storage.getDisplayList(!0,!0);this._paintList(e)},_paintList:function(e){for(var t=this._vmlRoot,r=0;r<e.length;r++){var a=e[r];a.invisible||a.ignore?(a.__alreadyNotVisible||a.onRemove(t),a.__alreadyNotVisible=!0):(a.__alreadyNotVisible&&a.onAdd(t),a.__alreadyNotVisible=!1,a.__dirty&&(a.beforeBrush&&a.beforeBrush(),(a.brushVML||a.brush).call(a,t),a.afterBrush&&a.afterBrush())),a.__dirty=!1}this._firstPaint&&(this._vmlViewport.appendChild(t),this._firstPaint=!1)},resize:function(e,t){var e=null==e?this._getWidth():e,t=null==t?this._getHeight():t;if(this._width!=e||this._height!=t){this._width=e,this._height=t;var r=this._vmlViewport.style;r.width=e+"px",r.height=t+"px"}},dispose:function(){this.root.innerHTML="",this._vmlRoot=this._vmlViewport=this.storage=null},getWidth:function(){return this._width},getHeight:function(){return this._height},clear:function(){this._vmlViewport&&this.root.removeChild(this._vmlViewport)},_getWidth:function(){var e=this.root,t=e.currentStyle;return(e.clientWidth||a(t.width))-a(t.paddingLeft)-a(t.paddingRight)|0},_getHeight:function(){var e=this.root,t=e.currentStyle;return(e.clientHeight||a(t.height))-a(t.paddingTop)-a(t.paddingBottom)|0}},u(["getLayer","insertLayer","eachLayer","eachBuiltinLayer","eachOtherLayer","getLayers","modLayer","delLayer","clearLayer","toDataURL","pathToImage"],function(e){n.prototype[e]=o(e)});var h=n;e.exports=h},function(e,t,r){"use strict";var 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},n=r(25),o=r(12),i=o.applyTransform,l=r(19),s=r(63),u=r(54),h=r(193),c=r(450),d=r(191),m=r(140),p=r(141),f=r(26),v=r(121),y=r(192),g=r(452),_=v.CMD,T=Math.round,x=Math.sqrt,w=Math.abs,N=Math.cos,b=Math.sin,L=Math.max;if(!n.canvasSupported){var S=21600,k=S/2,D=function(e){e.style.cssText="position:absolute;left:0;top:0;width:1px;height:1px;",e.coordsize=S+","+S,e.coordorigin="0,0"},M=function(e){return String(e).replace(/&/g,"&amp;").replace(/"/g,"&quot;")},A=function(e,t,r){return"rgb("+[e,t,r].join(",")+")"},I=function(e,t){t&&e&&t.parentNode!==e&&e.appendChild(t)},z=function(e,t){t&&e&&t.parentNode===e&&e.removeChild(t)},C=function(e,t,r){return 1e5*(parseFloat(e)||0)+1e3*(parseFloat(t)||0)+r},R=function(e,t){return"string"==typeof e?e.lastIndexOf("%")>=0?parseFloat(e)/100*t:parseFloat(e):e},E=function(e,t,r){var a=s.parse(t);r=+r,isNaN(r)&&(r=1),a&&(e.color=A(a[0],a[1],a[2]),e.opacity=r*a[3])},P=function(e){var t=s.parse(e);return[A(t[0],t[1],t[2]),t[3]]},O=function(e,t,r){var a=t.fill;if(null!=a)if(a instanceof y){var n,o=0,l=[0,0],s=0,u=1,h=r.getBoundingRect(),c=h.width,d=h.height;if("linear"===a.type){n="gradient";var m=r.transform,p=[a.x*c,a.y*d],f=[a.x2*c,a.y2*d];m&&(i(p,p,m),i(f,f,m));var v=f[0]-p[0],g=f[1]-p[1];o=180*Math.atan2(v,g)/Math.PI,o<0&&(o+=360),o<1e-6&&(o=0)}else{n="gradientradial";var p=[a.x*c,a.y*d],m=r.transform,_=r.scale,T=c,x=d;l=[(p[0]-h.x)/T,(p[1]-h.y)/x],m&&i(p,p,m),T/=_[0]*S,x/=_[1]*S;var w=L(T,x);s=0/w,u=2*a.r/w-s}var N=a.colorStops.slice();N.sort(function(e,t){return e.offset-t.offset});for(var b=N.length,k=[],D=[],M=0;M<b;M++){var A=N[M],I=P(A.color);D.push(A.offset*u+s+" "+I[0]),0!==M&&M!==b-1||k.push(I)}if(b>=2){var z=k[0][0],C=k[1][0],R=k[0][1]*t.opacity,O=k[1][1]*t.opacity;e.type=n,e.method="none",e.focus="100%",e.angle=o,e.color=z,e.color2=C,e.colors=D.join(","),e.opacity=O,e.opacity2=R}"radial"===n&&(e.focusposition=l.join(","))}else E(e,a,t.opacity)},F=function(e,t){null!=t.lineDash&&(e.dashstyle=t.lineDash.join(" ")),null==t.stroke||t.stroke instanceof y||E(e,t.stroke,t.opacity)},j=function(e,t,r,a){var n="fill"==t,o=e.getElementsByTagName(t)[0];null!=r[t]&&"none"!==r[t]&&(n||!n&&r.lineWidth)?(e[n?"filled":"stroked"]="true",r[t]instanceof y&&z(e,o),o||(o=g.createNode(t)),n?O(o,r,a):F(o,r),I(e,o)):(e[n?"filled":"stroked"]="false",z(e,o))},B=[[],[],[]],H=function(e,t){var r,a,n,o,l,s,u=_.M,h=_.C,c=_.L,d=_.A,m=_.Q,p=[],f=e.data,v=e.len();for(o=0;o<v;){switch(n=f[o++],a="",r=0,n){case u:a=" m ",r=1,l=f[o++],s=f[o++],B[0][0]=l,B[0][1]=s;break;case c:a=" l ",r=1,l=f[o++],s=f[o++],B[0][0]=l,B[0][1]=s;break;case m:case h:a=" c ",r=3;var y,g,w=f[o++],L=f[o++],D=f[o++],M=f[o++];n===m?(y=D,g=M,D=(D+2*w)/3,M=(M+2*L)/3,w=(l+2*w)/3,L=(s+2*L)/3):(y=f[o++],g=f[o++]),B[0][0]=w,B[0][1]=L,B[1][0]=D,B[1][1]=M,B[2][0]=y,B[2][1]=g,l=y,s=g;break;case d:var A=0,I=0,z=1,C=1,R=0;t&&(A=t[4],I=t[5],z=x(t[0]*t[0]+t[1]*t[1]),C=x(t[2]*t[2]+t[3]*t[3]),R=Math.atan2(-t[1]/C,t[0]/z));var E=f[o++],P=f[o++],O=f[o++],F=f[o++],j=f[o++]+R,H=f[o++]+j+R;o++;var V=f[o++],G=E+N(j)*O,W=P+b(j)*F,w=E+N(H)*O,L=P+b(H)*F,U=V?" wa ":" at ";Math.abs(G-w)<1e-4&&(Math.abs(H-j)>.01?V&&(G+=.0125):Math.abs(W-P)<1e-4?V&&G<E||!V&&G>E?L-=.0125:L+=.0125:V&&W<P||!V&&W>P?w+=.0125:w-=.0125),p.push(U,T(((E-O)*z+A)*S-k),",",T(((P-F)*C+I)*S-k),",",T(((E+O)*z+A)*S-k),",",T(((P+F)*C+I)*S-k),",",T((G*z+A)*S-k),",",T((W*C+I)*S-k),",",T((w*z+A)*S-k),",",T((L*C+I)*S-k)),l=w,s=L;break;case _.R:var q=B[0],Y=B[1];q[0]=f[o++],q[1]=f[o++],Y[0]=q[0]+f[o++],Y[1]=q[1]+f[o++],t&&(i(q,q,t),i(Y,Y,t)),q[0]=T(q[0]*S-k),Y[0]=T(Y[0]*S-k),q[1]=T(q[1]*S-k),Y[1]=T(Y[1]*S-k),p.push(" m ",q[0],",",q[1]," l ",Y[0],",",q[1]," l ",Y[0],",",Y[1]," l ",q[0],",",Y[1]);break;case _.Z:p.push(" x ")}if(r>0){p.push(a);for(var Z=0;Z<r;Z++){var K=B[Z];t&&i(K,K,t),p.push(T(K[0]*S-k),",",T(K[1]*S-k),Z<r-1?",":"")}}}return p.join("")};f.prototype.brushVML=function(e){var t=this.style,r=this._vmlEl;r||(r=g.createNode("shape"),D(r),this._vmlEl=r),j(r,"fill",t,this),j(r,"stroke",t,this);var a=this.transform,n=null!=a,o=r.getElementsByTagName("stroke")[0];if(o){var i=t.lineWidth;if(n&&!t.strokeNoScale){var l=a[0]*a[3]-a[1]*a[2];i*=x(w(l))}o.weight=i+"px"}var s=this.path||(this.path=new v);this.__dirtyPath&&(s.beginPath(),this.buildPath(s,this.shape),s.toStatic(),this.__dirtyPath=!1),r.path=H(s,this.transform),r.style.zIndex=C(this.zlevel,this.z,this.z2),I(e,r),null!=t.text?this.drawRectText(e,this.getBoundingRect()):this.removeRectText(e)},f.prototype.onRemove=function(e){z(e,this._vmlEl),this.removeRectText(e)},f.prototype.onAdd=function(e){I(e,this._vmlEl),this.appendRectText(e)};var V=function(e){return"object"===(void 0===e?"undefined":a(e))&&e.tagName&&"IMG"===e.tagName.toUpperCase()};m.prototype.brushVML=function(e){var t,r,a=this.style,n=a.image;if(V(n)){var o=n.src;if(o===this._imageSrc)t=this._imageWidth,r=this._imageHeight;else{var l=n.runtimeStyle,s=l.width,u=l.height;l.width="auto",l.height="auto",t=n.width,r=n.height,l.width=s,l.height=u,this._imageSrc=o,this._imageWidth=t,this._imageHeight=r}n=o}else n===this._imageSrc&&(t=this._imageWidth,r=this._imageHeight);if(n){var h=a.x||0,c=a.y||0,d=a.width,m=a.height,p=a.sWidth,f=a.sHeight,v=a.sx||0,y=a.sy||0,_=p&&f,w=this._vmlEl;w||(w=g.doc.createElement("div"),D(w),this._vmlEl=w);var N,b=w.style,S=!1,k=1,M=1;if(this.transform&&(N=this.transform,k=x(N[0]*N[0]+N[1]*N[1]),M=x(N[2]*N[2]+N[3]*N[3]),S=N[1]||N[2]),S){var A=[h,c],z=[h+d,c],R=[h,c+m],E=[h+d,c+m];i(A,A,N),i(z,z,N),i(R,R,N),i(E,E,N);var P=L(A[0],z[0],R[0],E[0]),O=L(A[1],z[1],R[1],E[1]),F=[];F.push("M11=",N[0]/k,",","M12=",N[2]/M,",","M21=",N[1]/k,",","M22=",N[3]/M,",","Dx=",T(h*k+N[4]),",","Dy=",T(c*M+N[5])),b.padding="0 "+T(P)+"px "+T(O)+"px 0",b.filter="progid:DXImageTransform.Microsoft.Matrix("+F.join("")+", SizingMethod=clip)"}else N&&(h=h*k+N[4],c=c*M+N[5]),b.filter="",b.left=T(h)+"px",b.top=T(c)+"px";var j=this._imageEl,B=this._cropEl;j||(j=g.doc.createElement("div"),this._imageEl=j);var H=j.style;if(_){if(t&&r)H.width=T(k*t*d/p)+"px",H.height=T(M*r*m/f)+"px";else{var G=new Image,W=this;G.onload=function(){G.onload=null,t=G.width,r=G.height,H.width=T(k*t*d/p)+"px",H.height=T(M*r*m/f)+"px",W._imageWidth=t,W._imageHeight=r,W._imageSrc=n},G.src=n}B||(B=g.doc.createElement("div"),B.style.overflow="hidden",this._cropEl=B);var U=B.style;U.width=T((d+v*d/p)*k),U.height=T((m+y*m/f)*M),U.filter="progid:DXImageTransform.Microsoft.Matrix(Dx="+-v*d/p*k+",Dy="+-y*m/f*M+")",B.parentNode||w.appendChild(B),j.parentNode!=B&&B.appendChild(j)}else H.width=T(k*d)+"px",H.height=T(M*m)+"px",w.appendChild(j),B&&B.parentNode&&(w.removeChild(B),this._cropEl=null);var q="",Y=a.opacity;Y<1&&(q+=".Alpha(opacity="+T(100*Y)+") "),q+="progid:DXImageTransform.Microsoft.AlphaImageLoader(src="+n+", SizingMethod=scale)",H.filter=q,w.style.zIndex=C(this.zlevel,this.z,this.z2),I(e,w),null!=a.text&&this.drawRectText(e,this.getBoundingRect())}},m.prototype.onRemove=function(e){z(e,this._vmlEl),this._vmlEl=null,this._cropEl=null,this._imageEl=null,this.removeRectText(e)},m.prototype.onAdd=function(e){I(e,this._vmlEl),this.appendRectText(e)};var G,W={},U=0,q=document.createElement("div"),Y=function(e){var t=W[e];if(!t){U>100&&(U=0,W={});var r,a=q.style;try{a.font=e,r=a.fontFamily.split(",")[0]}catch(e){}t={style:a.fontStyle||"normal",variant:a.fontVariant||"normal",weight:a.fontWeight||"normal",size:0|parseFloat(a.fontSize||12),family:r||"Microsoft YaHei"},W[e]=t,U++}return t};u.$override("measureText",function(e,t){var r=g.doc;G||(G=r.createElement("div"),G.style.cssText="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;",g.doc.body.appendChild(G));try{G.style.font=t}catch(e){}return G.innerHTML="",G.appendChild(r.createTextNode(e)),{width:G.offsetWidth}});for(var Z=new l,K=function(e,t,r,a){var n=this.style;this.__dirty&&h.normalizeTextStyle(n,!0);var o=n.text;if(null!=o&&(o+=""),o){if(n.rich){var l=u.parseRichText(o,n);o=[];for(var s=0;s<l.lines.length;s++){for(var c=l.lines[s].tokens,d=[],m=0;m<c.length;m++)d.push(c[m].text);o.push(d.join(""))}o=o.join("\n")}var p,f,v=n.textAlign,y=n.textVerticalAlign,_=Y(n.font),x=_.style+" "+_.variant+" "+_.weight+" "+_.size+'px "'+_.family+'"';r=r||u.getBoundingRect(o,x,v,y);var w=this.transform;if(w&&!a&&(Z.copy(t),Z.applyTransform(w),t=Z),a)p=t.x,f=t.y;else{var N=n.textPosition,b=n.textDistance;if(N instanceof Array)p=t.x+R(N[0],t.width),f=t.y+R(N[1],t.height),v=v||"left";else{var L=u.adjustTextPositionOnRect(N,t,b);p=L.x,f=L.y,v=v||L.textAlign,y=y||L.textVerticalAlign}}p=u.adjustTextX(p,r.width,v),f=u.adjustTextY(f,r.height,y),f+=r.height/2;var S,k,A,z=g.createNode,E=this._textVmlEl;E?(A=E.firstChild,S=A.nextSibling,k=S.nextSibling):(E=z("line"),S=z("path"),k=z("textpath"),A=z("skew"),k.style["v-text-align"]="left",D(E),S.textpathok=!0,k.on=!0,E.from="0 0",E.to="1000 0.05",I(E,A),I(E,S),I(E,k),this._textVmlEl=E);var P=[p,f],O=E.style;w&&a?(i(P,P,w),A.on=!0,A.matrix=w[0].toFixed(3)+","+w[2].toFixed(3)+","+w[1].toFixed(3)+","+w[3].toFixed(3)+",0,0",A.offset=(T(P[0])||0)+","+(T(P[1])||0),A.origin="0 0",O.left="0px",O.top="0px"):(A.on=!1,O.left=T(p)+"px",O.top=T(f)+"px"),k.string=M(o);try{k.style.font=x}catch(e){}j(E,"fill",{fill:n.textFill,opacity:n.opacity},this),j(E,"stroke",{stroke:n.textStroke,opacity:n.opacity,lineDash:n.lineDash},this),E.style.zIndex=C(this.zlevel,this.z,this.z2),I(e,E)}},J=function(e){z(e,this._textVmlEl),this._textVmlEl=null},X=function(e){I(e,this._textVmlEl)},$=[c,d,m,f,p],Q=0;Q<$.length;Q++){var ee=$[Q].prototype;ee.drawRectText=K,ee.removeRectText=J,ee.appendRectText=X}p.prototype.brushVML=function(e){var t=this.style;null!=t.text?this.drawRectText(e,{x:t.x||0,y:t.y||0,width:0,height:0},this.getBoundingRect(),!0):this.removeRectText(e)},p.prototype.onRemove=function(e){this.removeRectText(e)},p.prototype.onAdd=function(e){this.appendRectText(e)}}},function(e,t,r){"use strict";r(1224),(0,r(194).registerPainter)("vml",r(1223))}]); \ No newline at end of file diff --git a/cyclone-web/vendor/rsvp/rsvp-latest.min.js b/cyclone-web/vendor/rsvp/rsvp-latest.min.js new file mode 100644 index 0000000000000000000000000000000000000000..86624d520c3c95d4299bff15a713c9b87c2fdb45 --- /dev/null +++ b/cyclone-web/vendor/rsvp/rsvp-latest.min.js @@ -0,0 +1 @@ +(function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e(t.RSVP=t.RSVP||{})})(this,function(t){"use strict";function e(t,e){for(var r=0,n=t.length;r<n;r++)if(t[r]===e)return r;return-1}function r(t){var e=t._promiseCallbacks;e||(e=t._promiseCallbacks={});return e}function n(t,e){if("onerror"!==t){if(2!==arguments.length)return bt[t];bt[t]=e}else bt.on("error",e)}function o(t){return"function"==typeof t||"object"==typeof t&&null!==t}function i(t){return"function"==typeof t}function u(t){return"object"==typeof t&&null!==t}function s(){}function a(){setTimeout(function(){for(var t=0;t<St.length;t++){var e=St[t],r=e.payload;r.guid=r.key+r.id;r.childGuid=r.key+r.childId;r.error&&(r.stack=r.error.stack);bt.trigger(e.name,e.payload)}St.length=0},50)}function c(t,e,r){1===St.push({name:t,payload:{key:e._guidKey,id:e._id,eventName:t,detail:e._result,childId:r&&r._id,label:e._label,timeStamp:At(),error:bt["instrument-with-stack"]?new Error(e._label):null}})&&a()}function f(t,e){var r=this;if(t&&"object"==typeof t&&t.constructor===r)return t;var n=new r(h,e);m(n,t);return n}function l(){return new TypeError("A promises callback cannot return that same promise.")}function h(){}function p(t){try{return t.then}catch(e){Rt.error=e;return Rt}}function v(t,e,r,n){try{t.call(e,r,n)}catch(o){return o}}function d(t,e,r){bt.async(function(t){var n=!1,o=v(r,e,function(r){if(!n){n=!0;e!==r?m(t,r,void 0):g(t,r)}},function(e){if(!n){n=!0;b(t,e)}},"Settle: "+(t._label||" unknown promise"));if(!n&&o){n=!0;b(t,o)}},t)}function _(t,e){if(e._state===Ot)g(t,e._result);else if(e._state===Ct){e._onError=null;b(t,e._result)}else E(e,void 0,function(r){e!==r?m(t,r,void 0):g(t,r)},function(e){return b(t,e)})}function y(t,e,r){e.constructor===t.constructor&&r===O&&t.constructor.resolve===f?_(t,e):r===Rt?b(t,Rt.error):void 0===r?g(t,e):i(r)?d(t,e,r):g(t,e)}function m(t,e){t===e?g(t,e):o(e)?y(t,e,p(e)):g(t,e)}function w(t){t._onError&&t._onError(t._result);j(t)}function g(t,e){if(t._state===kt){t._result=e;t._state=Ot;0===t._subscribers.length?bt.instrument&&c("fulfilled",t):bt.async(j,t)}}function b(t,e){if(t._state===kt){t._state=Ct;t._result=e;bt.async(w,t)}}function E(t,e,r,n){var o=t._subscribers,i=o.length;t._onError=null;o[i]=e;o[i+Ot]=r;o[i+Ct]=n;0===i&&t._state&&bt.async(j,t)}function j(t){var e=t._subscribers,r=t._state;bt.instrument&&c(r===Ot?"fulfilled":"rejected",t);if(0!==e.length){for(var n=void 0,o=void 0,i=t._result,u=0;u<e.length;u+=3){n=e[u];o=e[u+r];n?S(r,n,o,i):o(i)}t._subscribers.length=0}}function A(){this.error=null}function T(t,e){try{return t(e)}catch(r){Mt.error=r;return Mt}}function S(t,e,r,n){var o=i(r),u=void 0,s=void 0,a=void 0,c=void 0;if(o){u=T(r,n);if(u===Mt){c=!0;s=u.error;u=null}else a=!0;if(e===u){b(e,l());return}}else{u=n;a=!0}e._state!==kt||(o&&a?m(e,u):c?b(e,s):t===Ot?g(e,u):t===Ct&&b(e,u))}function k(t,e){var r=!1;try{e(function(e){if(!r){r=!0;m(t,e)}},function(e){if(!r){r=!0;b(t,e)}})}catch(n){b(t,n)}}function O(t,e,r){var n=arguments,o=this,i=o._state;if(i===Ot&&!t||i===Ct&&!e){bt.instrument&&c("chained",o,o);return o}o._onError=null;var u=new o.constructor(h,r),s=o._result;bt.instrument&&c("chained",o,u);i?function(){var t=n[i-1];bt.async(function(){return S(i,u,t,s)})}():E(o,u,t,e);return u}function C(t,e,r){return t===Ot?{state:"fulfilled",value:r}:{state:"rejected",reason:r}}function R(t,e,r,n){this._instanceConstructor=t;this.promise=new t(h,n);this._abortOnReject=r;if(this._validateInput(e)){this._input=e;this.length=e.length;this._remaining=e.length;this._init();if(0===this.length)g(this.promise,this._result);else{this.length=this.length||0;this._enumerate();0===this._remaining&&g(this.promise,this._result)}}else b(this.promise,this._validationError())}function M(t,e){return new R(this,t,(!0),e).promise}function P(t,e){var r=this,n=new r(h,e);if(!jt(t)){b(n,new TypeError("You must pass an array to race."));return n}for(var o=0;n._state===kt&&o<t.length;o++)E(r.resolve(t[o]),void 0,function(t){return m(n,t)},function(t){return b(n,t)});return n}function I(t,e){var r=this,n=new r(h,e);b(n,t);return n}function x(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}function N(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}function Y(t,e){this._id=It++;this._label=e;this._state=void 0;this._result=void 0;this._subscribers=[];bt.instrument&&c("created",this);if(h!==t){"function"!=typeof t&&x();this instanceof Y?k(this,t):N()}}function D(){this.value=void 0}function K(t){try{return t.then}catch(e){xt.value=e;return xt}}function U(t,e,r){try{t.apply(e,r)}catch(n){xt.value=n;return xt}}function q(t,e){for(var r={},n=t.length,o=new Array(n),i=0;i<n;i++)o[i]=t[i];for(var u=0;u<e.length;u++){var s=e[u];r[s]=o[u+1]}return r}function V(t){for(var e=t.length,r=new Array(e-1),n=1;n<e;n++)r[n-1]=t[n];return r}function F(t,e){return{then:function(r,n){return t.call(e,r,n)}}}function G(t,e){var r=function(){for(var r=this,n=arguments.length,o=new Array(n+1),i=!1,u=0;u<n;++u){var s=arguments[u];if(!i){i=$(s);if(i===Nt){var a=new Y(h);b(a,Nt.value);return a}i&&i!==!0&&(s=F(i,s))}o[u]=s}var c=new Y(h);o[n]=function(t,r){t?b(c,t):void 0===e?m(c,r):e===!0?m(c,V(arguments)):jt(e)?m(c,q(arguments,e)):m(c,r)};return i?W(c,o,t,r):L(c,o,t,r)};r.__proto__=t;return r}function L(t,e,r,n){var o=U(r,n,e);o===xt&&b(t,o.value);return t}function W(t,e,r,n){return Y.all(e).then(function(e){var o=U(r,n,e);o===xt&&b(t,o.value);return t})}function $(t){return!(!t||"object"!=typeof t)&&(t.constructor===Y||K(t))}function z(t,e){return Y.all(t,e)}function B(t,e,r){this._superConstructor(t,e,!1,r)}function H(t,e){return new B(Y,t,e).promise}function J(t,e){return Y.race(t,e)}function Q(t,e,r){this._superConstructor(t,e,!0,r)}function X(t,e){return new Q(Y,t,e).promise}function Z(t,e,r){this._superConstructor(t,e,!1,r)}function tt(t,e){return new Z(Y,t,e).promise}function et(t){setTimeout(function(){throw t});throw t}function rt(t){var e={resolve:void 0,reject:void 0};e.promise=new Y(function(t,r){e.resolve=t;e.reject=r},t);return e}function nt(t,e,r){return Y.all(t,r).then(function(t){if(!i(e))throw new TypeError("You must pass a function as map's second argument.");for(var n=t.length,o=new Array(n),u=0;u<n;u++)o[u]=e(t[u]);return Y.all(o,r)})}function ot(t,e){return Y.resolve(t,e)}function it(t,e){return Y.reject(t,e)}function ut(t,e){return Y.all(t,e)}function st(t,e){return Y.resolve(t,e).then(function(t){return ut(t,e)})}function at(t,e,r){var n=jt(t)?ut(t,r):st(t,r);return n.then(function(t){if(!i(e))throw new TypeError("You must pass a function as filter's second argument.");for(var n=t.length,o=new Array(n),u=0;u<n;u++)o[u]=e(t[u]);return ut(o,r).then(function(e){for(var r=new Array(n),o=0,i=0;i<n;i++)if(e[i]){r[o]=t[i];o++}r.length=o;return r})})}function ct(t,e){Gt[Yt]=t;Gt[Yt+1]=e;Yt+=2;2===Yt&&Lt()}function ft(){var t=process.nextTick,e=process.versions.node.match(/^(?:(\d+)\.)?(?:(\d+)\.)?(\*|\d+)$/);Array.isArray(e)&&"0"===e[1]&&"10"===e[2]&&(t=setImmediate);return function(){return t(dt)}}function lt(){return"undefined"!=typeof Dt?function(){Dt(dt)}:vt()}function ht(){var t=0,e=new qt(dt),r=document.createTextNode("");e.observe(r,{characterData:!0});return function(){return r.data=t=++t%2}}function pt(){var t=new MessageChannel;t.port1.onmessage=dt;return function(){return t.port2.postMessage(0)}}function vt(){return function(){return setTimeout(dt,1)}}function dt(){for(var t=0;t<Yt;t+=2){var e=Gt[t],r=Gt[t+1];e(r);Gt[t]=void 0;Gt[t+1]=void 0}Yt=0}function _t(){try{var t=require,e=t("vertx");Dt=e.runOnLoop||e.runOnContext;return lt()}catch(r){return vt()}}function yt(t,e,r){e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r;return t}function mt(){bt.on.apply(bt,arguments)}function wt(){bt.off.apply(bt,arguments)}var gt={mixin:function(t){t.on=this.on;t.off=this.off;t.trigger=this.trigger;t._promiseCallbacks=void 0;return t},on:function(t,n){if("function"!=typeof n)throw new TypeError("Callback must be a function");var o=r(this),i=void 0;i=o[t];i||(i=o[t]=[]);e(i,n)===-1&&i.push(n)},off:function(t,n){var o=r(this),i=void 0,u=void 0;if(n){i=o[t];u=e(i,n);u!==-1&&i.splice(u,1)}else o[t]=[]},trigger:function(t,e,n){var o=r(this),i=void 0,u=void 0;if(i=o[t])for(var s=0;s<i.length;s++){u=i[s];u(e,n)}}},bt={instrument:!1};gt.mixin(bt);var Et=void 0;Et=Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)};var jt=Et,At=Date.now||function(){return(new Date).getTime()},Tt=Object.create||function(t){if(arguments.length>1)throw new Error("Second argument not supported");if("object"!=typeof t)throw new TypeError("Argument must be an object");s.prototype=t;return new s},St=[],kt=void 0,Ot=1,Ct=2,Rt=new A,Mt=new A;R.prototype._validateInput=function(t){return jt(t)};R.prototype._validationError=function(){return new Error("Array Methods must be provided an Array")};R.prototype._init=function(){this._result=new Array(this.length)};R.prototype._enumerate=function(){for(var t=this.length,e=this.promise,r=this._input,n=0;e._state===kt&&n<t;n++)this._eachEntry(r[n],n)};R.prototype._settleMaybeThenable=function(t,e){var r=this._instanceConstructor,n=r.resolve;if(n===f){var o=p(t);if(o===O&&t._state!==kt){t._onError=null;this._settledAt(t._state,e,t._result)}else if("function"!=typeof o){this._remaining--;this._result[e]=this._makeResult(Ot,e,t)}else if(r===Y){var i=new r(h);y(i,t,o);this._willSettleAt(i,e)}else this._willSettleAt(new r(function(e){return e(t)}),e)}else this._willSettleAt(n(t),e)};R.prototype._eachEntry=function(t,e){if(u(t))this._settleMaybeThenable(t,e);else{this._remaining--;this._result[e]=this._makeResult(Ot,e,t)}};R.prototype._settledAt=function(t,e,r){var n=this.promise;if(n._state===kt){this._remaining--;this._abortOnReject&&t===Ct?b(n,r):this._result[e]=this._makeResult(t,e,r)}0===this._remaining&&g(n,this._result)};R.prototype._makeResult=function(t,e,r){return r};R.prototype._willSettleAt=function(t,e){var r=this;E(t,void 0,function(t){return r._settledAt(Ot,e,t)},function(t){return r._settledAt(Ct,e,t)})};var Pt="rsvp_"+At()+"-",It=0;Y.cast=f;Y.all=M;Y.race=P;Y.resolve=f;Y.reject=I;Y.prototype={constructor:Y,_guidKey:Pt,_onError:function(t){var e=this;bt.after(function(){e._onError&&bt.trigger("error",t,e._label)})},then:O,"catch":function(t,e){return this.then(void 0,t,e)},"finally":function(t,e){var r=this,n=r.constructor;return r.then(function(e){return n.resolve(t()).then(function(){return e})},function(e){return n.resolve(t()).then(function(){throw e})},e)}};var xt=new D,Nt=new D;B.prototype=Tt(R.prototype);B.prototype._superConstructor=R;B.prototype._makeResult=C;B.prototype._validationError=function(){return new Error("allSettled must be called with an array")};Q.prototype=Tt(R.prototype);Q.prototype._superConstructor=R;Q.prototype._init=function(){this._result={}};Q.prototype._validateInput=function(t){return t&&"object"==typeof t};Q.prototype._validationError=function(){return new Error("Promise.hash must be called with an object")};Q.prototype._enumerate=function(){var t=this,e=t.promise,r=t._input,n=[];for(var o in r)e._state===kt&&Object.prototype.hasOwnProperty.call(r,o)&&n.push({position:o,entry:r[o]});var i=n.length;t._remaining=i;for(var u=void 0,s=0;e._state===kt&&s<i;s++){u=n[s];t._eachEntry(u.entry,u.position)}};Z.prototype=Tt(Q.prototype);Z.prototype._superConstructor=R;Z.prototype._makeResult=C;Z.prototype._validationError=function(){return new Error("hashSettled must be called with an object")};var Yt=0,Dt=void 0,Kt="undefined"!=typeof window?window:void 0,Ut=Kt||{},qt=Ut.MutationObserver||Ut.WebKitMutationObserver,Vt="undefined"==typeof self&&"undefined"!=typeof process&&"[object process]"==={}.toString.call(process),Ft="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel,Gt=new Array(1e3),Lt=void 0;Lt=Vt?ft():qt?ht():Ft?pt():void 0===Kt&&"function"==typeof require?_t():vt();var Wt=void 0;if("object"==typeof self)Wt=self;else{if("object"!=typeof global)throw new Error("no global: `self` or `global` found");Wt=global}var $t;bt.async=ct;bt.after=function(t){return setTimeout(t,0)};var zt=ot,Bt=function(t,e){return bt.async(t,e)};if("undefined"!=typeof window&&"object"==typeof window.__PROMISE_INSTRUMENTATION__){var Ht=window.__PROMISE_INSTRUMENTATION__;n("instrument",!0);for(var Jt in Ht)Ht.hasOwnProperty(Jt)&&mt(Jt,Ht[Jt])}var Qt=($t={cast:zt,Promise:Y,EventTarget:gt,all:z,allSettled:H,race:J,hash:X,hashSettled:tt,rethrow:et,defer:rt,denodeify:G,configure:n,on:mt,off:wt,resolve:ot,reject:it,map:nt},yt($t,"async",Bt),yt($t,"filter",at),$t);t["default"]=Qt;t.cast=zt;t.Promise=Y;t.EventTarget=gt;t.all=z;t.allSettled=H;t.race=J;t.hash=X;t.hashSettled=tt;t.rethrow=et;t.defer=rt;t.denodeify=G;t.configure=n;t.on=mt;t.off=wt;t.resolve=ot;t.reject=it;t.map=nt;t.async=Bt;t.filter=at;Object.defineProperty(t,"__esModule",{value:!0})}); \ No newline at end of file diff --git "a/docs/\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.png" "b/docs/\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..46be41e2164feb37264468ad677841ae93b0d715 Binary files /dev/null and "b/docs/\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.png" differ diff --git a/uam-server/.gitignore b/uam-server/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..2748235489d822515fa75b71b0961a41eacbdfaf --- /dev/null +++ b/uam-server/.gitignore @@ -0,0 +1,4 @@ +# clouduam +src/main/webapp/WEB-INF/lib +target/ +application-default.properties \ No newline at end of file diff --git a/uam-server/pom.xml b/uam-server/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..621277865030fedf6fb59e94b10543473c1aaf3a --- /dev/null +++ b/uam-server/pom.xml @@ -0,0 +1,319 @@ +<?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/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>com.idcos</groupId> + <artifactId>clouduam</artifactId> + <version>1.10.2</version> + <packaging>war</packaging> + + <name>clouduam</name> + <description>clouduam</description> + + <parent> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-parent</artifactId> + <version>1.5.7.RELEASE</version> + <relativePath/> <!-- lookup parent from repository --> + </parent> + + <profiles> + <profile> + <id>SonarQube</id> + </profile> + <profile> + <id>default</id> + <activation> + <activeByDefault>true</activeByDefault> + </activation> + <properties> + <argLine></argLine> + </properties> + </profile> + </profiles> + + <repositories> + <repository> + <id>central</id> + <name>center Repositories</name> + <url>http://maven.weoa.com/nexus/content/repositories/central/</url> + </repository> + </repositories> + <pluginRepositories> + <pluginRepository> + <id>webank</id> + <name>webank</name> + <url>http://maven.weoa.com/nexus/content/repositories/central/</url> + <releases> + <enabled>true</enabled> + </releases> + <snapshots> + <enabled>false</enabled> + </snapshots> + </pluginRepository> + </pluginRepositories> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <java.version>1.7</java.version> + + <mysql.connector.version>8.0.28</mysql.connector.version> + <fastjson.version>1.2.83</fastjson.version> + + <idcos.common.base.version>1.0.0-SNAPSHOT</idcos.common.base.version> + <idcos.common.component.version>1.0.0-20160517-SNAPSHOT</idcos.common.component.version> + <idcos.common.service.version>1.0.0-SNAPSHOT</idcos.common.service.version> + <idcos.common.web.version>1.0.0-20160524-SNAPSHOT</idcos.common.web.version> + + <apache.poi.version>4.1.1</apache.poi.version> + <apache.commons.io.version>2.6</apache.commons.io.version> + <apache.commons.exec.version>1.3</apache.commons.exec.version> + <apache.commons.fileupload.version>1.5</apache.commons.fileupload.version> + <apache.commons.compress.version>1.21</apache.commons.compress.version> + + <springfox.version>2.4.0</springfox.version> + </properties> + + <dependencies> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + </dependency> + <!--SpringBoot Jdbc Starter--> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-jdbc</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-security</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-logging</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-data-jpa</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-tomcat</artifactId> + <scope>provided</scope> + </dependency> + + <dependency> + <groupId>org.apache.tomcat.embed</groupId> + <artifactId>tomcat-embed-core</artifactId> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>org.jooq</groupId> + <artifactId>jooq</artifactId> + </dependency> + + + <dependency> + <groupId>mysql</groupId> + <artifactId>mysql-connector-java</artifactId> + <version>${mysql.connector.version}</version> + </dependency> + + <dependency> + <groupId>commons-beanutils</groupId> + <artifactId>commons-beanutils</artifactId> + </dependency> + + <dependency> + <groupId>com.idcos.common</groupId> + <artifactId>common-base</artifactId> + <version>${idcos.common.base.version}</version> + <scope>system</scope> + <systemPath>D:/MyProject/clouduam/src/main/webapp/WEB-INF/lib/common-base-1.0.0-SNAPSHOT.jar</systemPath> + </dependency> + <dependency> + <groupId>com.idcos.common</groupId> + <artifactId>common-component</artifactId> + <version>${idcos.common.component.version}</version> + <scope>system</scope> + <systemPath>D:/MyProject/clouduam/src/main/webapp/WEB-INF/lib/common-component-1.0.0-20160517-SNAPSHOT.jar</systemPath> + </dependency> + <dependency> + <groupId>com.idcos.common</groupId> + <artifactId>common-service</artifactId> + <version>${idcos.common.service.version}</version> + <scope>system</scope> + <systemPath>D:/MyProject/clouduam/src/main/webapp/WEB-INF/lib/common-service-1.0.0-SNAPSHOT.jar</systemPath> + </dependency> + <dependency> + <groupId>com.idcos.common</groupId> + <artifactId>common-web</artifactId> + <version>${idcos.common.web.version}</version> + <scope>system</scope> + <systemPath>D:/MyProject/clouduam/src/main/webapp/WEB-INF/lib/common-web-1.0.0-20160524-SNAPSHOT.jar</systemPath> + </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-lang</artifactId> + <version>2.4</version> + <scope>system</scope> + <systemPath>D:/MyProject/clouduam/src/main/webapp/WEB-INF/lib/commons-lang-2.4.jar</systemPath> + </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-lang3</artifactId> + <version>3.3.2</version> + <scope>system</scope> + <systemPath>D:/MyProject/clouduam/src/main/webapp/WEB-INF/lib/commons-lang3-3.3.2.jar</systemPath> + </dependency> + <dependency> + <groupId>org.hibernate.validator</groupId> + <artifactId>hibernate-validator</artifactId> + <version>5.3.6.Final</version> + <scope>system</scope> + <systemPath>D:/MyProject/clouduam/src/main/webapp/WEB-INF/lib/hibernate-validator-5.3.6.Final.jar</systemPath> + </dependency> + <dependency> + <groupId>org.bouncycastle</groupId> + <artifactId>bcprov-jdk15on</artifactId> + <version>1.52</version> + </dependency> + <dependency> + <groupId>org.yaml</groupId> + <artifactId>snakeyaml</artifactId> + <version>1.17</version> + </dependency> + <dependency> + <groupId>javax.validation</groupId> + <artifactId>validation-api</artifactId> + <version>2.0.1.Final</version> + </dependency> + <dependency> + <groupId>net.sf.ehcache</groupId> + <artifactId>ehcache</artifactId> + <version>2.10.8</version> + </dependency> + + <dependency> + <groupId>com.alibaba</groupId> + <artifactId>fastjson</artifactId> + <version>${fastjson.version}</version> + </dependency> + + <dependency> + <groupId>com.fasterxml.jackson.jaxrs</groupId> + <artifactId>jackson-jaxrs-json-provider</artifactId> + </dependency> + + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-databind</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-context-support</artifactId> + </dependency> + + <!-- JWT --> + <dependency> + <groupId>io.jsonwebtoken</groupId> + <artifactId>jjwt</artifactId> + <version>0.6.0</version> + </dependency> + + + <dependency> + <groupId>org.apache.poi</groupId> + <artifactId>poi</artifactId> + <version>${apache.poi.version}</version> + </dependency> + + <dependency> + <groupId>org.apache.poi</groupId> + <artifactId>poi-ooxml</artifactId> + <version>${apache.poi.version}</version> + </dependency> + + <!-- apache common --> + <dependency> + <groupId>commons-collections</groupId> + <artifactId>commons-collections</artifactId> + </dependency> + + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + <version>${apache.commons.io.version}</version> + </dependency> + + + <dependency> + <groupId>commons-fileupload</groupId> + <artifactId>commons-fileupload</artifactId> + <version>${apache.commons.fileupload.version}</version> + </dependency> + + + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-compress</artifactId> + <version>${apache.commons.compress.version}</version> + </dependency> + + <!--JsonSchema --> + <dependency> + <groupId>com.github.fge</groupId> + <artifactId>json-schema-validator</artifactId> + <version>2.2.6</version> + </dependency> + <!--模板--> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-thymeleaf</artifactId> + </dependency> + + <!--swagger--> + <dependency> + <groupId>io.springfox</groupId> + <artifactId>springfox-swagger2</artifactId> + <version>${springfox.version}</version> + </dependency> + + <dependency> + <groupId>io.springfox</groupId> + <artifactId>springfox-swagger-ui</artifactId> + <version>${springfox.version}</version> + </dependency> + + <dependency> + <groupId>com.unboundid</groupId> + <artifactId>unboundid-ldapsdk</artifactId> + </dependency> + </dependencies> + +</project> diff --git a/uam-server/src/.DS_Store b/uam-server/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..88232e42c9e7ad25b9d784e7483ba26fe27dbb8d Binary files /dev/null and b/uam-server/src/.DS_Store differ diff --git a/uam-server/src/main/.DS_Store b/uam-server/src/main/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c021967e4d122e4c30921011d81beb0887e040b7 Binary files /dev/null and b/uam-server/src/main/.DS_Store differ diff --git a/uam-server/src/main/java/.DS_Store b/uam-server/src/main/java/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 Binary files /dev/null and b/uam-server/src/main/java/.DS_Store differ diff --git a/uam-server/src/main/java/com/idcos/UamAppliction.java b/uam-server/src/main/java/com/idcos/UamAppliction.java new file mode 100644 index 0000000000000000000000000000000000000000..65c78d7ae56ae37cb110b4f2e338702a92f898c3 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/UamAppliction.java @@ -0,0 +1,92 @@ +package com.idcos; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowire; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.context.annotation.Bean; +import org.springframework.core.env.Environment; + +import com.idcos.enterprise.portal.ext.ExtValue; +import com.idcos.enterprise.portal.web.GlobalValue; + +/** + * Uam启动类 + * + * @author pengganyu + * @version $Id: UamAppliction.java, v 0.1 2016年5月8日 下午12:14:16 pengganyu Exp $ + */ +@SpringBootApplication +public class UamAppliction extends SpringBootServletInitializer { + + @Autowired + private Environment env; + + @Bean(autowire = Autowire.BY_NAME) + public GlobalValue globalValue() { + String ssoLoginUrl; + String secretKey; + String appId; + String decryptKey; + String accessTimeout; + /** + * 使用getRequiredProperty,缺少该配置项,则启动报错 + */ + try { + ssoLoginUrl = env.getRequiredProperty("sso.login.url"); + } catch (IllegalStateException e) { + throw new RuntimeException("项目缺少必须配置的配置项[sso.login.url],请检查添加后再重新启动"); + } + try { + secretKey = env.getRequiredProperty("secret.key"); + } catch (IllegalStateException e) { + throw new RuntimeException("项目缺少必须配置的配置项[secret.key],请检查添加后再重新启动"); + } + try { + appId = env.getRequiredProperty("sso.appID"); + } catch (IllegalStateException e) { + throw new RuntimeException("项目缺少必须配置的配置项[sso.appID],请检查添加后再重新启动"); + } + try { + decryptKey = env.getRequiredProperty("decryptKey"); + } catch (IllegalStateException e) { + throw new RuntimeException("项目缺少必须配置的配置项[decryptKey],请检查添加后再重新启动"); + } + try { + accessTimeout = env.getRequiredProperty("access.timeout"); + } catch (IllegalStateException e) { + throw new RuntimeException("项目缺少必须配置的配置项[access.timeout],请检查添加后再重新启动"); + } + + List<String> ignoreUris = env.getProperty("ignore.ignoreUris", List.class); + /** + * 不写该配置项,则默认值为true;配置项值.equalsIgnoreCase("true"),值为true;其余均为false + */ + Boolean isMultiTenant = Boolean.parseBoolean(env.getProperty("isMultiTenant", "true")); + + return new GlobalValue(ssoLoginUrl, secretKey, appId, ignoreUris, decryptKey, accessTimeout, isMultiTenant); + } + + @Bean(autowire = Autowire.BY_NAME) + public ExtValue getExtValue() { + String cron = env.getProperty("ext.user.sync.cron", ""); + String domain = env.getProperty("ext.user.server.domain", ""); + String ip = env.getProperty("ext.user.server.ip", ""); + String port = env.getProperty("ext.user.server.port", ""); + String baseDn = env.getProperty("ext.user.server.baseDn", ""); + String basePassword = env.getProperty("ext.user.server.basePassword", ""); + String baseDept = env.getProperty("ext.user.server.baseDept", ""); + String extAppId = env.getProperty("ext.user.server.extAppId", ""); + String extAppToken = env.getProperty("ext.user.server.extAppToken", ""); + return new ExtValue(cron, domain, ip, port, baseDn, basePassword, baseDept, extAppId, extAppToken); + } + + + public static void main(String[] args) { + SpringApplication.run(UamAppliction.class, args); + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/config/JooqConfig.java b/uam-server/src/main/java/com/idcos/enterprise/config/JooqConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..c5dbe70e830967aaec1bf3dae734c174602fdc3f --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/config/JooqConfig.java @@ -0,0 +1,30 @@ +package com.idcos.enterprise.config; + +import org.jooq.DSLContext; +import org.jooq.SQLDialect; +import org.jooq.conf.Settings; +import org.jooq.conf.StatementType; +import org.jooq.impl.DSL; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.sql.DataSource; + +/** + * @author souakiragen + * @version $Id: , v 0.1 2017年11月03 上午9:51 souakiragen Exp $ + */ + +@Configuration +public class JooqConfig { + + @Bean + public DSLContext dslContext(DataSource dataSource) { + Settings settings = new Settings(); + settings.setStatementType(StatementType.PREPARED_STATEMENT); + settings.setRenderSchema(false); + settings.setRenderScalarSubqueriesForStoredFunctions(true); + return DSL.using(dataSource, SQLDialect.MYSQL, settings); + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/Clouduam.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/Clouduam.java new file mode 100644 index 0000000000000000000000000000000000000000..66d99d0403fb2446b418e17a38cd4d1b8f14a3a5 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/Clouduam.java @@ -0,0 +1,79 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq; + + +import com.idcos.enterprise.jooq.tables.PortalDept; +import com.idcos.enterprise.jooq.tables.PortalDeptRoleRel; +import com.idcos.enterprise.jooq.tables.PortalGroupRoleRel; +import com.idcos.enterprise.jooq.tables.PortalGroupUserRel; +import com.idcos.enterprise.jooq.tables.PortalPermission; +import com.idcos.enterprise.jooq.tables.PortalResource; +import com.idcos.enterprise.jooq.tables.PortalRole; +import com.idcos.enterprise.jooq.tables.PortalSysDict; +import com.idcos.enterprise.jooq.tables.PortalTenant; +import com.idcos.enterprise.jooq.tables.PortalToken; +import com.idcos.enterprise.jooq.tables.PortalUser; +import com.idcos.enterprise.jooq.tables.PortalUserGroup; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import javax.annotation.Generated; + +import org.jooq.Table; +import org.jooq.impl.SchemaImpl; + + +/** + * This class is generated by jOOQ. + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class Clouduam extends SchemaImpl { + + private static final long serialVersionUID = -1532745740; + + /** + * The reference instance of <code>clouduam</code> + */ + public static final Clouduam CLOUDUAM = new Clouduam(); + + /** + * No further instances allowed + */ + private Clouduam() { + super("clouduam"); + } + + @Override + public final List<Table<?>> getTables() { + List result = new ArrayList(); + result.addAll(getTables0()); + return result; + } + + private final List<Table<?>> getTables0() { + return Arrays.<Table<?>>asList( + PortalDept.PORTAL_DEPT, + PortalDeptRoleRel.PORTAL_DEPT_ROLE_REL, + PortalGroupRoleRel.PORTAL_GROUP_ROLE_REL, + PortalGroupUserRel.PORTAL_GROUP_USER_REL, + PortalPermission.PORTAL_PERMISSION, + PortalResource.PORTAL_RESOURCE, + PortalRole.PORTAL_ROLE, + PortalSysDict.PORTAL_SYS_DICT, + PortalTenant.PORTAL_TENANT, + PortalToken.PORTAL_TOKEN, + PortalUser.PORTAL_USER, + PortalUserGroup.PORTAL_USER_GROUP); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/Keys.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/Keys.java new file mode 100644 index 0000000000000000000000000000000000000000..04c99d0744e44a2582d0f53b1f09fdf891eff88f --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/Keys.java @@ -0,0 +1,93 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq; + + +import com.idcos.enterprise.jooq.tables.PortalDept; +import com.idcos.enterprise.jooq.tables.PortalDeptRoleRel; +import com.idcos.enterprise.jooq.tables.PortalGroupRoleRel; +import com.idcos.enterprise.jooq.tables.PortalPermission; +import com.idcos.enterprise.jooq.tables.PortalResource; +import com.idcos.enterprise.jooq.tables.PortalRole; +import com.idcos.enterprise.jooq.tables.PortalSysDict; +import com.idcos.enterprise.jooq.tables.PortalTenant; +import com.idcos.enterprise.jooq.tables.PortalToken; +import com.idcos.enterprise.jooq.tables.PortalUser; +import com.idcos.enterprise.jooq.tables.PortalUserGroup; +import com.idcos.enterprise.jooq.tables.records.PortalDeptRecord; +import com.idcos.enterprise.jooq.tables.records.PortalDeptRoleRelRecord; +import com.idcos.enterprise.jooq.tables.records.PortalGroupRoleRelRecord; +import com.idcos.enterprise.jooq.tables.records.PortalPermissionRecord; +import com.idcos.enterprise.jooq.tables.records.PortalResourceRecord; +import com.idcos.enterprise.jooq.tables.records.PortalRoleRecord; +import com.idcos.enterprise.jooq.tables.records.PortalSysDictRecord; +import com.idcos.enterprise.jooq.tables.records.PortalTenantRecord; +import com.idcos.enterprise.jooq.tables.records.PortalTokenRecord; +import com.idcos.enterprise.jooq.tables.records.PortalUserGroupRecord; +import com.idcos.enterprise.jooq.tables.records.PortalUserRecord; + +import javax.annotation.Generated; + +import org.jooq.UniqueKey; +import org.jooq.impl.AbstractKeys; + + +/** + * A class modelling foreign key relationships between tables of the <code>clouduam</code> + * schema + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class Keys { + + // ------------------------------------------------------------------------- + // IDENTITY definitions + // ------------------------------------------------------------------------- + + + // ------------------------------------------------------------------------- + // UNIQUE and PRIMARY KEY definitions + // ------------------------------------------------------------------------- + + public static final UniqueKey<PortalDeptRecord> KEY_PORTAL_DEPT_PRIMARY = UniqueKeys0.KEY_PORTAL_DEPT_PRIMARY; + public static final UniqueKey<PortalDeptRoleRelRecord> KEY_PORTAL_DEPT_ROLE_REL_PRIMARY = UniqueKeys0.KEY_PORTAL_DEPT_ROLE_REL_PRIMARY; + public static final UniqueKey<PortalGroupRoleRelRecord> KEY_PORTAL_GROUP_ROLE_REL_PRIMARY = UniqueKeys0.KEY_PORTAL_GROUP_ROLE_REL_PRIMARY; + public static final UniqueKey<PortalPermissionRecord> KEY_PORTAL_PERMISSION_PRIMARY = UniqueKeys0.KEY_PORTAL_PERMISSION_PRIMARY; + public static final UniqueKey<PortalResourceRecord> KEY_PORTAL_RESOURCE_PRIMARY = UniqueKeys0.KEY_PORTAL_RESOURCE_PRIMARY; + public static final UniqueKey<PortalRoleRecord> KEY_PORTAL_ROLE_PRIMARY = UniqueKeys0.KEY_PORTAL_ROLE_PRIMARY; + public static final UniqueKey<PortalSysDictRecord> KEY_PORTAL_SYS_DICT_PRIMARY = UniqueKeys0.KEY_PORTAL_SYS_DICT_PRIMARY; + public static final UniqueKey<PortalTenantRecord> KEY_PORTAL_TENANT_PRIMARY = UniqueKeys0.KEY_PORTAL_TENANT_PRIMARY; + public static final UniqueKey<PortalTokenRecord> KEY_PORTAL_TOKEN_PRIMARY = UniqueKeys0.KEY_PORTAL_TOKEN_PRIMARY; + public static final UniqueKey<PortalUserRecord> KEY_PORTAL_USER_PRIMARY = UniqueKeys0.KEY_PORTAL_USER_PRIMARY; + public static final UniqueKey<PortalUserGroupRecord> KEY_PORTAL_USER_GROUP_PRIMARY = UniqueKeys0.KEY_PORTAL_USER_GROUP_PRIMARY; + + // ------------------------------------------------------------------------- + // FOREIGN KEY definitions + // ------------------------------------------------------------------------- + + + // ------------------------------------------------------------------------- + // [#1459] distribute members to avoid static initialisers > 64kb + // ------------------------------------------------------------------------- + + private static class UniqueKeys0 extends AbstractKeys { + public static final UniqueKey<PortalDeptRecord> KEY_PORTAL_DEPT_PRIMARY = createUniqueKey(PortalDept.PORTAL_DEPT, PortalDept.PORTAL_DEPT.ID); + public static final UniqueKey<PortalDeptRoleRelRecord> KEY_PORTAL_DEPT_ROLE_REL_PRIMARY = createUniqueKey(PortalDeptRoleRel.PORTAL_DEPT_ROLE_REL, PortalDeptRoleRel.PORTAL_DEPT_ROLE_REL.ID); + public static final UniqueKey<PortalGroupRoleRelRecord> KEY_PORTAL_GROUP_ROLE_REL_PRIMARY = createUniqueKey(PortalGroupRoleRel.PORTAL_GROUP_ROLE_REL, PortalGroupRoleRel.PORTAL_GROUP_ROLE_REL.ID); + public static final UniqueKey<PortalPermissionRecord> KEY_PORTAL_PERMISSION_PRIMARY = createUniqueKey(PortalPermission.PORTAL_PERMISSION, PortalPermission.PORTAL_PERMISSION.ID); + public static final UniqueKey<PortalResourceRecord> KEY_PORTAL_RESOURCE_PRIMARY = createUniqueKey(PortalResource.PORTAL_RESOURCE, PortalResource.PORTAL_RESOURCE.ID); + public static final UniqueKey<PortalRoleRecord> KEY_PORTAL_ROLE_PRIMARY = createUniqueKey(PortalRole.PORTAL_ROLE, PortalRole.PORTAL_ROLE.ID); + public static final UniqueKey<PortalSysDictRecord> KEY_PORTAL_SYS_DICT_PRIMARY = createUniqueKey(PortalSysDict.PORTAL_SYS_DICT, PortalSysDict.PORTAL_SYS_DICT.TENANT_ID, PortalSysDict.PORTAL_SYS_DICT.CODE, PortalSysDict.PORTAL_SYS_DICT.TYPE_CODE); + public static final UniqueKey<PortalTenantRecord> KEY_PORTAL_TENANT_PRIMARY = createUniqueKey(PortalTenant.PORTAL_TENANT, PortalTenant.PORTAL_TENANT.ID); + public static final UniqueKey<PortalTokenRecord> KEY_PORTAL_TOKEN_PRIMARY = createUniqueKey(PortalToken.PORTAL_TOKEN, PortalToken.PORTAL_TOKEN.ID); + public static final UniqueKey<PortalUserRecord> KEY_PORTAL_USER_PRIMARY = createUniqueKey(PortalUser.PORTAL_USER, PortalUser.PORTAL_USER.ID); + public static final UniqueKey<PortalUserGroupRecord> KEY_PORTAL_USER_GROUP_PRIMARY = createUniqueKey(PortalUserGroup.PORTAL_USER_GROUP, PortalUserGroup.PORTAL_USER_GROUP.ID); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/Tables.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/Tables.java new file mode 100644 index 0000000000000000000000000000000000000000..0c84f1281a1027ccfab8cabed427e9c2d56f4cd6 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/Tables.java @@ -0,0 +1,95 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq; + + +import com.idcos.enterprise.jooq.tables.PortalDept; +import com.idcos.enterprise.jooq.tables.PortalDeptRoleRel; +import com.idcos.enterprise.jooq.tables.PortalGroupRoleRel; +import com.idcos.enterprise.jooq.tables.PortalGroupUserRel; +import com.idcos.enterprise.jooq.tables.PortalPermission; +import com.idcos.enterprise.jooq.tables.PortalResource; +import com.idcos.enterprise.jooq.tables.PortalRole; +import com.idcos.enterprise.jooq.tables.PortalSysDict; +import com.idcos.enterprise.jooq.tables.PortalTenant; +import com.idcos.enterprise.jooq.tables.PortalToken; +import com.idcos.enterprise.jooq.tables.PortalUser; +import com.idcos.enterprise.jooq.tables.PortalUserGroup; + +import javax.annotation.Generated; + + +/** + * Convenience access to all tables in clouduam + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class Tables { + + /** + * 部门信息表 + */ + public static final PortalDept PORTAL_DEPT = com.idcos.enterprise.jooq.tables.PortalDept.PORTAL_DEPT; + + /** + * 部门与角色的关系表 + */ + public static final PortalDeptRoleRel PORTAL_DEPT_ROLE_REL = com.idcos.enterprise.jooq.tables.PortalDeptRoleRel.PORTAL_DEPT_ROLE_REL; + + /** + * 用户组与角色关系表 + */ + public static final PortalGroupRoleRel PORTAL_GROUP_ROLE_REL = com.idcos.enterprise.jooq.tables.PortalGroupRoleRel.PORTAL_GROUP_ROLE_REL; + + /** + * 用户组用户关系表 + */ + public static final PortalGroupUserRel PORTAL_GROUP_USER_REL = com.idcos.enterprise.jooq.tables.PortalGroupUserRel.PORTAL_GROUP_USER_REL; + + /** + * 授权信息表 + */ + public static final PortalPermission PORTAL_PERMISSION = com.idcos.enterprise.jooq.tables.PortalPermission.PORTAL_PERMISSION; + + /** + * 权限资源表 + */ + public static final PortalResource PORTAL_RESOURCE = com.idcos.enterprise.jooq.tables.PortalResource.PORTAL_RESOURCE; + + /** + * 角色信息表 + */ + public static final PortalRole PORTAL_ROLE = com.idcos.enterprise.jooq.tables.PortalRole.PORTAL_ROLE; + + /** + * uam系统参数表 + */ + public static final PortalSysDict PORTAL_SYS_DICT = com.idcos.enterprise.jooq.tables.PortalSysDict.PORTAL_SYS_DICT; + + /** + * 租户信息表 + */ + public static final PortalTenant PORTAL_TENANT = com.idcos.enterprise.jooq.tables.PortalTenant.PORTAL_TENANT; + + /** + * token信息表 + */ + public static final PortalToken PORTAL_TOKEN = com.idcos.enterprise.jooq.tables.PortalToken.PORTAL_TOKEN; + + /** + * 用户信息表 + */ + public static final PortalUser PORTAL_USER = com.idcos.enterprise.jooq.tables.PortalUser.PORTAL_USER; + + /** + * 用户组信息表 + */ + public static final PortalUserGroup PORTAL_USER_GROUP = com.idcos.enterprise.jooq.tables.PortalUserGroup.PORTAL_USER_GROUP; +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalDept.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalDept.java new file mode 100644 index 0000000000000000000000000000000000000000..57476ae6374c926b7890e70b143c9907136282a5 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalDept.java @@ -0,0 +1,159 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq.tables; + + +import com.idcos.enterprise.jooq.Clouduam; +import com.idcos.enterprise.jooq.Keys; +import com.idcos.enterprise.jooq.tables.records.PortalDeptRecord; + +import java.sql.Timestamp; +import java.util.Arrays; +import java.util.List; + +import javax.annotation.Generated; + +import org.jooq.Field; +import org.jooq.Table; +import org.jooq.TableField; +import org.jooq.UniqueKey; +import org.jooq.impl.TableImpl; + + +/** + * 部门信息表 + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class PortalDept extends TableImpl<PortalDeptRecord> { + + private static final long serialVersionUID = -1864948499; + + /** + * The reference instance of <code>clouduam.PORTAL_DEPT</code> + */ + public static final PortalDept PORTAL_DEPT = new PortalDept(); + + /** + * The class holding records for this type + */ + @Override + public Class<PortalDeptRecord> getRecordType() { + return PortalDeptRecord.class; + } + + /** + * The column <code>clouduam.PORTAL_DEPT.ID</code>. + */ + public final TableField<PortalDeptRecord, String> ID = createField("ID", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, ""); + + /** + * The column <code>clouduam.PORTAL_DEPT.CODE</code>. 部门code + */ + public final TableField<PortalDeptRecord, String> CODE = createField("CODE", org.jooq.impl.SQLDataType.VARCHAR.length(255), this, "部门code"); + + /** + * The column <code>clouduam.PORTAL_DEPT.DISPLAY_NAME</code>. 部门名称 + */ + public final TableField<PortalDeptRecord, String> DISPLAY_NAME = createField("DISPLAY_NAME", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, "部门名称"); + + /** + * The column <code>clouduam.PORTAL_DEPT.PARENT_ID</code>. 父项目id + */ + public final TableField<PortalDeptRecord, String> PARENT_ID = createField("PARENT_ID", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, "父项目id"); + + /** + * The column <code>clouduam.PORTAL_DEPT.STATUS</code>. 部门状态 + */ + public final TableField<PortalDeptRecord, String> STATUS = createField("STATUS", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, "部门状态"); + + /** + * The column <code>clouduam.PORTAL_DEPT.MANAGER_ID</code>. + */ + public final TableField<PortalDeptRecord, String> MANAGER_ID = createField("MANAGER_ID", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, ""); + + /** + * The column <code>clouduam.PORTAL_DEPT.REMARK</code>. 备注 + */ + public final TableField<PortalDeptRecord, String> REMARK = createField("REMARK", org.jooq.impl.SQLDataType.VARCHAR.length(255), this, "备注"); + + /** + * The column <code>clouduam.PORTAL_DEPT.TENANT_ID</code>. 租户id + */ + public final TableField<PortalDeptRecord, String> TENANT_ID = createField("TENANT_ID", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, "租户id"); + + /** + * The column <code>clouduam.PORTAL_DEPT.SOURCE_TYPE</code>. 数据同步来源来源,默认值native表示本系统,如果来自第三方,则需重新定义该值 + */ + public final TableField<PortalDeptRecord, String> SOURCE_TYPE = createField("SOURCE_TYPE", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false).defaulted(true), this, "数据同步来源来源,默认值native表示本系统,如果来自第三方,则需重新定义该值"); + + /** + * The column <code>clouduam.PORTAL_DEPT.GMT_CREATE</code>. 创建日期 + */ + public final TableField<PortalDeptRecord, Timestamp> GMT_CREATE = createField("GMT_CREATE", org.jooq.impl.SQLDataType.TIMESTAMP, this, "创建日期"); + + /** + * The column <code>clouduam.PORTAL_DEPT.GMT_MODIFIED</code>. 修改日期 + */ + public final TableField<PortalDeptRecord, Timestamp> GMT_MODIFIED = createField("GMT_MODIFIED", org.jooq.impl.SQLDataType.TIMESTAMP, this, "修改日期"); + + /** + * Create a <code>clouduam.PORTAL_DEPT</code> table reference + */ + public PortalDept() { + this("PORTAL_DEPT", null); + } + + /** + * Create an aliased <code>clouduam.PORTAL_DEPT</code> table reference + */ + public PortalDept(String alias) { + this(alias, PORTAL_DEPT); + } + + private PortalDept(String alias, Table<PortalDeptRecord> aliased) { + this(alias, aliased, null); + } + + private PortalDept(String alias, Table<PortalDeptRecord> aliased, Field<?>[] parameters) { + super(alias, Clouduam.CLOUDUAM, aliased, parameters, "部门信息表"); + } + + /** + * {@inheritDoc} + */ + @Override + public UniqueKey<PortalDeptRecord> getPrimaryKey() { + return Keys.KEY_PORTAL_DEPT_PRIMARY; + } + + /** + * {@inheritDoc} + */ + @Override + public List<UniqueKey<PortalDeptRecord>> getKeys() { + return Arrays.<UniqueKey<PortalDeptRecord>>asList(Keys.KEY_PORTAL_DEPT_PRIMARY); + } + + /** + * {@inheritDoc} + */ + @Override + public PortalDept as(String alias) { + return new PortalDept(alias, this); + } + + /** + * Rename this table + */ + public PortalDept rename(String name) { + return new PortalDept(name, null); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalDeptRoleRel.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalDeptRoleRel.java new file mode 100644 index 0000000000000000000000000000000000000000..a6c368586a4ffa52d6d5bc6ab9a5f4461dfa59cc --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalDeptRoleRel.java @@ -0,0 +1,118 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq.tables; + + +import com.idcos.enterprise.jooq.Clouduam; +import com.idcos.enterprise.jooq.Keys; +import com.idcos.enterprise.jooq.tables.records.PortalDeptRoleRelRecord; + +import java.util.Arrays; +import java.util.List; + +import javax.annotation.Generated; + +import org.jooq.Field; +import org.jooq.Table; +import org.jooq.TableField; +import org.jooq.UniqueKey; +import org.jooq.impl.TableImpl; + + +/** + * 部门与角色的关系表 + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class PortalDeptRoleRel extends TableImpl<PortalDeptRoleRelRecord> { + + private static final long serialVersionUID = 92442799; + + /** + * The reference instance of <code>clouduam.PORTAL_DEPT_ROLE_REL</code> + */ + public static final PortalDeptRoleRel PORTAL_DEPT_ROLE_REL = new PortalDeptRoleRel(); + + /** + * The class holding records for this type + */ + @Override + public Class<PortalDeptRoleRelRecord> getRecordType() { + return PortalDeptRoleRelRecord.class; + } + + /** + * The column <code>clouduam.PORTAL_DEPT_ROLE_REL.ID</code>. id + */ + public final TableField<PortalDeptRoleRelRecord, String> ID = createField("ID", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, "id"); + + /** + * The column <code>clouduam.PORTAL_DEPT_ROLE_REL.DEPT_ID</code>. 部门id + */ + public final TableField<PortalDeptRoleRelRecord, String> DEPT_ID = createField("DEPT_ID", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, "部门id"); + + /** + * The column <code>clouduam.PORTAL_DEPT_ROLE_REL.ROLE_ID</code>. 角色id + */ + public final TableField<PortalDeptRoleRelRecord, String> ROLE_ID = createField("ROLE_ID", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, "角色id"); + + /** + * Create a <code>clouduam.PORTAL_DEPT_ROLE_REL</code> table reference + */ + public PortalDeptRoleRel() { + this("PORTAL_DEPT_ROLE_REL", null); + } + + /** + * Create an aliased <code>clouduam.PORTAL_DEPT_ROLE_REL</code> table reference + */ + public PortalDeptRoleRel(String alias) { + this(alias, PORTAL_DEPT_ROLE_REL); + } + + private PortalDeptRoleRel(String alias, Table<PortalDeptRoleRelRecord> aliased) { + this(alias, aliased, null); + } + + private PortalDeptRoleRel(String alias, Table<PortalDeptRoleRelRecord> aliased, Field<?>[] parameters) { + super(alias, Clouduam.CLOUDUAM, aliased, parameters, "部门与角色的关系表"); + } + + /** + * {@inheritDoc} + */ + @Override + public UniqueKey<PortalDeptRoleRelRecord> getPrimaryKey() { + return Keys.KEY_PORTAL_DEPT_ROLE_REL_PRIMARY; + } + + /** + * {@inheritDoc} + */ + @Override + public List<UniqueKey<PortalDeptRoleRelRecord>> getKeys() { + return Arrays.<UniqueKey<PortalDeptRoleRelRecord>>asList(Keys.KEY_PORTAL_DEPT_ROLE_REL_PRIMARY); + } + + /** + * {@inheritDoc} + */ + @Override + public PortalDeptRoleRel as(String alias) { + return new PortalDeptRoleRel(alias, this); + } + + /** + * Rename this table + */ + public PortalDeptRoleRel rename(String name) { + return new PortalDeptRoleRel(name, null); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalGroupRoleRel.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalGroupRoleRel.java new file mode 100644 index 0000000000000000000000000000000000000000..4a25f044f6a99b822f7a0a7d2c81f1862b4fae1f --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalGroupRoleRel.java @@ -0,0 +1,123 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq.tables; + + +import com.idcos.enterprise.jooq.Clouduam; +import com.idcos.enterprise.jooq.Keys; +import com.idcos.enterprise.jooq.tables.records.PortalGroupRoleRelRecord; + +import java.util.Arrays; +import java.util.List; + +import javax.annotation.Generated; + +import org.jooq.Field; +import org.jooq.Table; +import org.jooq.TableField; +import org.jooq.UniqueKey; +import org.jooq.impl.TableImpl; + + +/** + * 用户组与角色关系表 + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class PortalGroupRoleRel extends TableImpl<PortalGroupRoleRelRecord> { + + private static final long serialVersionUID = -940972561; + + /** + * The reference instance of <code>clouduam.PORTAL_GROUP_ROLE_REL</code> + */ + public static final PortalGroupRoleRel PORTAL_GROUP_ROLE_REL = new PortalGroupRoleRel(); + + /** + * The class holding records for this type + */ + @Override + public Class<PortalGroupRoleRelRecord> getRecordType() { + return PortalGroupRoleRelRecord.class; + } + + /** + * The column <code>clouduam.PORTAL_GROUP_ROLE_REL.ID</code>. 关系ID + */ + public final TableField<PortalGroupRoleRelRecord, String> ID = createField("ID", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, "关系ID"); + + /** + * The column <code>clouduam.PORTAL_GROUP_ROLE_REL.ROLE_ID</code>. 角色ID + */ + public final TableField<PortalGroupRoleRelRecord, String> ROLE_ID = createField("ROLE_ID", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, "角色ID"); + + /** + * The column <code>clouduam.PORTAL_GROUP_ROLE_REL.GROUP_ID</code>. 用户组ID + */ + public final TableField<PortalGroupRoleRelRecord, String> GROUP_ID = createField("GROUP_ID", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, "用户组ID"); + + /** + * The column <code>clouduam.PORTAL_GROUP_ROLE_REL.TENANT</code>. 租户code + */ + public final TableField<PortalGroupRoleRelRecord, String> TENANT = createField("TENANT", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, "租户code"); + + /** + * Create a <code>clouduam.PORTAL_GROUP_ROLE_REL</code> table reference + */ + public PortalGroupRoleRel() { + this("PORTAL_GROUP_ROLE_REL", null); + } + + /** + * Create an aliased <code>clouduam.PORTAL_GROUP_ROLE_REL</code> table reference + */ + public PortalGroupRoleRel(String alias) { + this(alias, PORTAL_GROUP_ROLE_REL); + } + + private PortalGroupRoleRel(String alias, Table<PortalGroupRoleRelRecord> aliased) { + this(alias, aliased, null); + } + + private PortalGroupRoleRel(String alias, Table<PortalGroupRoleRelRecord> aliased, Field<?>[] parameters) { + super(alias, Clouduam.CLOUDUAM, aliased, parameters, "用户组与角色关系表"); + } + + /** + * {@inheritDoc} + */ + @Override + public UniqueKey<PortalGroupRoleRelRecord> getPrimaryKey() { + return Keys.KEY_PORTAL_GROUP_ROLE_REL_PRIMARY; + } + + /** + * {@inheritDoc} + */ + @Override + public List<UniqueKey<PortalGroupRoleRelRecord>> getKeys() { + return Arrays.<UniqueKey<PortalGroupRoleRelRecord>>asList(Keys.KEY_PORTAL_GROUP_ROLE_REL_PRIMARY); + } + + /** + * {@inheritDoc} + */ + @Override + public PortalGroupRoleRel as(String alias) { + return new PortalGroupRoleRel(alias, this); + } + + /** + * Rename this table + */ + public PortalGroupRoleRel rename(String name) { + return new PortalGroupRoleRel(name, null); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalGroupUserRel.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalGroupUserRel.java new file mode 100644 index 0000000000000000000000000000000000000000..80a4df49be408176cd1c92e3ba36795579eb83ba --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalGroupUserRel.java @@ -0,0 +1,102 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq.tables; + + +import com.idcos.enterprise.jooq.Clouduam; +import com.idcos.enterprise.jooq.tables.records.PortalGroupUserRelRecord; + +import javax.annotation.Generated; + +import org.jooq.Field; +import org.jooq.Table; +import org.jooq.TableField; +import org.jooq.impl.TableImpl; + + +/** + * 用户组用户关系表 + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class PortalGroupUserRel extends TableImpl<PortalGroupUserRelRecord> { + + private static final long serialVersionUID = 2025527354; + + /** + * The reference instance of <code>clouduam.PORTAL_GROUP_USER_REL</code> + */ + public static final PortalGroupUserRel PORTAL_GROUP_USER_REL = new PortalGroupUserRel(); + + /** + * The class holding records for this type + */ + @Override + public Class<PortalGroupUserRelRecord> getRecordType() { + return PortalGroupUserRelRecord.class; + } + + /** + * The column <code>clouduam.PORTAL_GROUP_USER_REL.ID</code>. 关系ID + */ + public final TableField<PortalGroupUserRelRecord, String> ID = createField("ID", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, "关系ID"); + + /** + * The column <code>clouduam.PORTAL_GROUP_USER_REL.USER_ID</code>. 用户ID + */ + public final TableField<PortalGroupUserRelRecord, String> USER_ID = createField("USER_ID", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, "用户ID"); + + /** + * The column <code>clouduam.PORTAL_GROUP_USER_REL.GROUP_ID</code>. 用户组ID + */ + public final TableField<PortalGroupUserRelRecord, String> GROUP_ID = createField("GROUP_ID", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, "用户组ID"); + + /** + * The column <code>clouduam.PORTAL_GROUP_USER_REL.TENANT</code>. 租户code + */ + public final TableField<PortalGroupUserRelRecord, String> TENANT = createField("TENANT", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, "租户code"); + + /** + * Create a <code>clouduam.PORTAL_GROUP_USER_REL</code> table reference + */ + public PortalGroupUserRel() { + this("PORTAL_GROUP_USER_REL", null); + } + + /** + * Create an aliased <code>clouduam.PORTAL_GROUP_USER_REL</code> table reference + */ + public PortalGroupUserRel(String alias) { + this(alias, PORTAL_GROUP_USER_REL); + } + + private PortalGroupUserRel(String alias, Table<PortalGroupUserRelRecord> aliased) { + this(alias, aliased, null); + } + + private PortalGroupUserRel(String alias, Table<PortalGroupUserRelRecord> aliased, Field<?>[] parameters) { + super(alias, Clouduam.CLOUDUAM, aliased, parameters, "用户组用户关系表"); + } + + /** + * {@inheritDoc} + */ + @Override + public PortalGroupUserRel as(String alias) { + return new PortalGroupUserRel(alias, this); + } + + /** + * Rename this table + */ + public PortalGroupUserRel rename(String name) { + return new PortalGroupUserRel(name, null); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalPermission.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalPermission.java new file mode 100644 index 0000000000000000000000000000000000000000..d5acf5a1af9c88a589c02910c0664515e49243ed --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalPermission.java @@ -0,0 +1,143 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq.tables; + + +import com.idcos.enterprise.jooq.Clouduam; +import com.idcos.enterprise.jooq.Keys; +import com.idcos.enterprise.jooq.tables.records.PortalPermissionRecord; + +import java.util.Arrays; +import java.util.List; + +import javax.annotation.Generated; + +import org.jooq.Field; +import org.jooq.Table; +import org.jooq.TableField; +import org.jooq.UniqueKey; +import org.jooq.impl.TableImpl; + + +/** + * 授权信息表 + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class PortalPermission extends TableImpl<PortalPermissionRecord> { + + private static final long serialVersionUID = 1006339669; + + /** + * The reference instance of <code>clouduam.PORTAL_PERMISSION</code> + */ + public static final PortalPermission PORTAL_PERMISSION = new PortalPermission(); + + /** + * The class holding records for this type + */ + @Override + public Class<PortalPermissionRecord> getRecordType() { + return PortalPermissionRecord.class; + } + + /** + * The column <code>clouduam.PORTAL_PERMISSION.ID</code>. 授权信息ID + */ + public final TableField<PortalPermissionRecord, String> ID = createField("ID", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, "授权信息ID"); + + /** + * The column <code>clouduam.PORTAL_PERMISSION.APP_ID</code>. 应用系统名称 + */ + public final TableField<PortalPermissionRecord, String> APP_ID = createField("APP_ID", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, "应用系统名称"); + + /** + * The column <code>clouduam.PORTAL_PERMISSION.AUTH_RES_TYPE</code>. 权限资源类型 + */ + public final TableField<PortalPermissionRecord, String> AUTH_RES_TYPE = createField("AUTH_RES_TYPE", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, "权限资源类型"); + + /** + * The column <code>clouduam.PORTAL_PERMISSION.AUTH_RES_ID</code>. 权限资源ID + */ + public final TableField<PortalPermissionRecord, String> AUTH_RES_ID = createField("AUTH_RES_ID", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, "权限资源ID"); + + /** + * The column <code>clouduam.PORTAL_PERMISSION.AUTH_RES_NAME</code>. + */ + public final TableField<PortalPermissionRecord, String> AUTH_RES_NAME = createField("AUTH_RES_NAME", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, ""); + + /** + * The column <code>clouduam.PORTAL_PERMISSION.AUTH_OBJ_ID</code>. 授权对象ID + */ + public final TableField<PortalPermissionRecord, String> AUTH_OBJ_ID = createField("AUTH_OBJ_ID", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, "授权对象ID"); + + /** + * The column <code>clouduam.PORTAL_PERMISSION.AUTH_OBJ_TYPE</code>. 授权对象类型 + */ + public final TableField<PortalPermissionRecord, String> AUTH_OBJ_TYPE = createField("AUTH_OBJ_TYPE", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, "授权对象类型"); + + /** + * The column <code>clouduam.PORTAL_PERMISSION.TENANT</code>. 租户code + */ + public final TableField<PortalPermissionRecord, String> TENANT = createField("TENANT", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, "租户code"); + + /** + * Create a <code>clouduam.PORTAL_PERMISSION</code> table reference + */ + public PortalPermission() { + this("PORTAL_PERMISSION", null); + } + + /** + * Create an aliased <code>clouduam.PORTAL_PERMISSION</code> table reference + */ + public PortalPermission(String alias) { + this(alias, PORTAL_PERMISSION); + } + + private PortalPermission(String alias, Table<PortalPermissionRecord> aliased) { + this(alias, aliased, null); + } + + private PortalPermission(String alias, Table<PortalPermissionRecord> aliased, Field<?>[] parameters) { + super(alias, Clouduam.CLOUDUAM, aliased, parameters, "授权信息表"); + } + + /** + * {@inheritDoc} + */ + @Override + public UniqueKey<PortalPermissionRecord> getPrimaryKey() { + return Keys.KEY_PORTAL_PERMISSION_PRIMARY; + } + + /** + * {@inheritDoc} + */ + @Override + public List<UniqueKey<PortalPermissionRecord>> getKeys() { + return Arrays.<UniqueKey<PortalPermissionRecord>>asList(Keys.KEY_PORTAL_PERMISSION_PRIMARY); + } + + /** + * {@inheritDoc} + */ + @Override + public PortalPermission as(String alias) { + return new PortalPermission(alias, this); + } + + /** + * Rename this table + */ + public PortalPermission rename(String name) { + return new PortalPermission(name, null); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalResource.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalResource.java new file mode 100644 index 0000000000000000000000000000000000000000..6eade3f3362f1c191d4ff488ee1fd88e3323151f --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalResource.java @@ -0,0 +1,143 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq.tables; + + +import com.idcos.enterprise.jooq.Clouduam; +import com.idcos.enterprise.jooq.Keys; +import com.idcos.enterprise.jooq.tables.records.PortalResourceRecord; + +import java.util.Arrays; +import java.util.List; + +import javax.annotation.Generated; + +import org.jooq.Field; +import org.jooq.Table; +import org.jooq.TableField; +import org.jooq.UniqueKey; +import org.jooq.impl.TableImpl; + + +/** + * 权限资源表 + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class PortalResource extends TableImpl<PortalResourceRecord> { + + private static final long serialVersionUID = -243160886; + + /** + * The reference instance of <code>clouduam.PORTAL_RESOURCE</code> + */ + public static final PortalResource PORTAL_RESOURCE = new PortalResource(); + + /** + * The class holding records for this type + */ + @Override + public Class<PortalResourceRecord> getRecordType() { + return PortalResourceRecord.class; + } + + /** + * The column <code>clouduam.PORTAL_RESOURCE.ID</code>. + */ + public final TableField<PortalResourceRecord, String> ID = createField("ID", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, ""); + + /** + * The column <code>clouduam.PORTAL_RESOURCE.APP_ID</code>. 应用系统名称 + */ + public final TableField<PortalResourceRecord, String> APP_ID = createField("APP_ID", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, "应用系统名称"); + + /** + * The column <code>clouduam.PORTAL_RESOURCE.CODE</code>. 权限资源类型 + */ + public final TableField<PortalResourceRecord, String> CODE = createField("CODE", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, "权限资源类型"); + + /** + * The column <code>clouduam.PORTAL_RESOURCE.NAME</code>. 权限资源名称 + */ + public final TableField<PortalResourceRecord, String> NAME = createField("NAME", org.jooq.impl.SQLDataType.VARCHAR.length(128).nullable(false), this, "权限资源名称"); + + /** + * The column <code>clouduam.PORTAL_RESOURCE.URL</code>. 权限资源URL + */ + public final TableField<PortalResourceRecord, String> URL = createField("URL", org.jooq.impl.SQLDataType.VARCHAR.length(128).nullable(false), this, "权限资源URL"); + + /** + * The column <code>clouduam.PORTAL_RESOURCE.REMARK</code>. 备注 + */ + public final TableField<PortalResourceRecord, String> REMARK = createField("REMARK", org.jooq.impl.SQLDataType.VARCHAR.length(256).nullable(false), this, "备注"); + + /** + * The column <code>clouduam.PORTAL_RESOURCE.IS_ACTIVE</code>. + */ + public final TableField<PortalResourceRecord, String> IS_ACTIVE = createField("IS_ACTIVE", org.jooq.impl.SQLDataType.VARCHAR.length(1).nullable(false).defaulted(true), this, ""); + + /** + * The column <code>clouduam.PORTAL_RESOURCE.TENANT</code>. 租户code + */ + public final TableField<PortalResourceRecord, String> TENANT = createField("TENANT", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, "租户code"); + + /** + * Create a <code>clouduam.PORTAL_RESOURCE</code> table reference + */ + public PortalResource() { + this("PORTAL_RESOURCE", null); + } + + /** + * Create an aliased <code>clouduam.PORTAL_RESOURCE</code> table reference + */ + public PortalResource(String alias) { + this(alias, PORTAL_RESOURCE); + } + + private PortalResource(String alias, Table<PortalResourceRecord> aliased) { + this(alias, aliased, null); + } + + private PortalResource(String alias, Table<PortalResourceRecord> aliased, Field<?>[] parameters) { + super(alias, Clouduam.CLOUDUAM, aliased, parameters, "权限资源表"); + } + + /** + * {@inheritDoc} + */ + @Override + public UniqueKey<PortalResourceRecord> getPrimaryKey() { + return Keys.KEY_PORTAL_RESOURCE_PRIMARY; + } + + /** + * {@inheritDoc} + */ + @Override + public List<UniqueKey<PortalResourceRecord>> getKeys() { + return Arrays.<UniqueKey<PortalResourceRecord>>asList(Keys.KEY_PORTAL_RESOURCE_PRIMARY); + } + + /** + * {@inheritDoc} + */ + @Override + public PortalResource as(String alias) { + return new PortalResource(alias, this); + } + + /** + * Rename this table + */ + public PortalResource rename(String name) { + return new PortalResource(name, null); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalRole.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalRole.java new file mode 100644 index 0000000000000000000000000000000000000000..3ef7a0a3105160e6ec4ae2b4b7d283f095858af5 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalRole.java @@ -0,0 +1,149 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq.tables; + + +import com.idcos.enterprise.jooq.Clouduam; +import com.idcos.enterprise.jooq.Keys; +import com.idcos.enterprise.jooq.tables.records.PortalRoleRecord; + +import java.sql.Timestamp; +import java.util.Arrays; +import java.util.List; + +import javax.annotation.Generated; + +import org.jooq.Field; +import org.jooq.Table; +import org.jooq.TableField; +import org.jooq.UniqueKey; +import org.jooq.impl.TableImpl; + + +/** + * 角色信息表 + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class PortalRole extends TableImpl<PortalRoleRecord> { + + private static final long serialVersionUID = 1771649252; + + /** + * The reference instance of <code>clouduam.PORTAL_ROLE</code> + */ + public static final PortalRole PORTAL_ROLE = new PortalRole(); + + /** + * The class holding records for this type + */ + @Override + public Class<PortalRoleRecord> getRecordType() { + return PortalRoleRecord.class; + } + + /** + * The column <code>clouduam.PORTAL_ROLE.ID</code>. 角色ID + */ + public final TableField<PortalRoleRecord, String> ID = createField("ID", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, "角色ID"); + + /** + * The column <code>clouduam.PORTAL_ROLE.CODE</code>. 角色编码 + */ + public final TableField<PortalRoleRecord, String> CODE = createField("CODE", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, "角色编码"); + + /** + * The column <code>clouduam.PORTAL_ROLE.NAME</code>. 角色名称 + */ + public final TableField<PortalRoleRecord, String> NAME = createField("NAME", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, "角色名称"); + + /** + * The column <code>clouduam.PORTAL_ROLE.REMARK</code>. 角色描述 + */ + public final TableField<PortalRoleRecord, String> REMARK = createField("REMARK", org.jooq.impl.SQLDataType.VARCHAR.length(256), this, "角色描述"); + + /** + * The column <code>clouduam.PORTAL_ROLE.CREATE_USER</code>. 创建人 + */ + public final TableField<PortalRoleRecord, String> CREATE_USER = createField("CREATE_USER", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, "创建人"); + + /** + * The column <code>clouduam.PORTAL_ROLE.GMT_CREATE</code>. 创建时间 + */ + public final TableField<PortalRoleRecord, Timestamp> GMT_CREATE = createField("GMT_CREATE", org.jooq.impl.SQLDataType.TIMESTAMP, this, "创建时间"); + + /** + * The column <code>clouduam.PORTAL_ROLE.GMT_MODIFIED</code>. 最后修改时间 + */ + public final TableField<PortalRoleRecord, Timestamp> GMT_MODIFIED = createField("GMT_MODIFIED", org.jooq.impl.SQLDataType.TIMESTAMP, this, "最后修改时间"); + + /** + * The column <code>clouduam.PORTAL_ROLE.IS_ACTIVE</code>. 是否有效 + */ + public final TableField<PortalRoleRecord, String> IS_ACTIVE = createField("IS_ACTIVE", org.jooq.impl.SQLDataType.CHAR.length(1), this, "是否有效"); + + /** + * The column <code>clouduam.PORTAL_ROLE.TENANT</code>. 租户code + */ + public final TableField<PortalRoleRecord, String> TENANT = createField("TENANT", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, "租户code"); + + /** + * Create a <code>clouduam.PORTAL_ROLE</code> table reference + */ + public PortalRole() { + this("PORTAL_ROLE", null); + } + + /** + * Create an aliased <code>clouduam.PORTAL_ROLE</code> table reference + */ + public PortalRole(String alias) { + this(alias, PORTAL_ROLE); + } + + private PortalRole(String alias, Table<PortalRoleRecord> aliased) { + this(alias, aliased, null); + } + + private PortalRole(String alias, Table<PortalRoleRecord> aliased, Field<?>[] parameters) { + super(alias, Clouduam.CLOUDUAM, aliased, parameters, "角色信息表"); + } + + /** + * {@inheritDoc} + */ + @Override + public UniqueKey<PortalRoleRecord> getPrimaryKey() { + return Keys.KEY_PORTAL_ROLE_PRIMARY; + } + + /** + * {@inheritDoc} + */ + @Override + public List<UniqueKey<PortalRoleRecord>> getKeys() { + return Arrays.<UniqueKey<PortalRoleRecord>>asList(Keys.KEY_PORTAL_ROLE_PRIMARY); + } + + /** + * {@inheritDoc} + */ + @Override + public PortalRole as(String alias) { + return new PortalRole(alias, this); + } + + /** + * Rename this table + */ + public PortalRole rename(String name) { + return new PortalRole(name, null); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalSysDict.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalSysDict.java new file mode 100644 index 0000000000000000000000000000000000000000..077a7460030d41113d6e5e5270e5c8eb5802fdeb --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalSysDict.java @@ -0,0 +1,128 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq.tables; + + +import com.idcos.enterprise.jooq.Clouduam; +import com.idcos.enterprise.jooq.Keys; +import com.idcos.enterprise.jooq.tables.records.PortalSysDictRecord; + +import java.util.Arrays; +import java.util.List; + +import javax.annotation.Generated; + +import org.jooq.Field; +import org.jooq.Table; +import org.jooq.TableField; +import org.jooq.UniqueKey; +import org.jooq.impl.TableImpl; + + +/** + * uam系统参数表 + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class PortalSysDict extends TableImpl<PortalSysDictRecord> { + + private static final long serialVersionUID = -990219296; + + /** + * The reference instance of <code>clouduam.PORTAL_SYS_DICT</code> + */ + public static final PortalSysDict PORTAL_SYS_DICT = new PortalSysDict(); + + /** + * The class holding records for this type + */ + @Override + public Class<PortalSysDictRecord> getRecordType() { + return PortalSysDictRecord.class; + } + + /** + * The column <code>clouduam.PORTAL_SYS_DICT.TYPE_CODE</code>. 系统字典类型编码 + */ + public final TableField<PortalSysDictRecord, String> TYPE_CODE = createField("TYPE_CODE", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, "系统字典类型编码"); + + /** + * The column <code>clouduam.PORTAL_SYS_DICT.CODE</code>. 系统字典编码 + */ + public final TableField<PortalSysDictRecord, String> CODE = createField("CODE", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, "系统字典编码"); + + /** + * The column <code>clouduam.PORTAL_SYS_DICT.VALUE</code>. 参数值 + */ + public final TableField<PortalSysDictRecord, String> VALUE = createField("VALUE", org.jooq.impl.SQLDataType.CLOB, this, "参数值"); + + /** + * The column <code>clouduam.PORTAL_SYS_DICT.TENANT_ID</code>. 租户code + */ + public final TableField<PortalSysDictRecord, String> TENANT_ID = createField("TENANT_ID", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, "租户code"); + + /** + * The column <code>clouduam.PORTAL_SYS_DICT.REMARK</code>. 说明 + */ + public final TableField<PortalSysDictRecord, String> REMARK = createField("REMARK", org.jooq.impl.SQLDataType.CLOB, this, "说明"); + + /** + * Create a <code>clouduam.PORTAL_SYS_DICT</code> table reference + */ + public PortalSysDict() { + this("PORTAL_SYS_DICT", null); + } + + /** + * Create an aliased <code>clouduam.PORTAL_SYS_DICT</code> table reference + */ + public PortalSysDict(String alias) { + this(alias, PORTAL_SYS_DICT); + } + + private PortalSysDict(String alias, Table<PortalSysDictRecord> aliased) { + this(alias, aliased, null); + } + + private PortalSysDict(String alias, Table<PortalSysDictRecord> aliased, Field<?>[] parameters) { + super(alias, Clouduam.CLOUDUAM, aliased, parameters, "uam系统参数表"); + } + + /** + * {@inheritDoc} + */ + @Override + public UniqueKey<PortalSysDictRecord> getPrimaryKey() { + return Keys.KEY_PORTAL_SYS_DICT_PRIMARY; + } + + /** + * {@inheritDoc} + */ + @Override + public List<UniqueKey<PortalSysDictRecord>> getKeys() { + return Arrays.<UniqueKey<PortalSysDictRecord>>asList(Keys.KEY_PORTAL_SYS_DICT_PRIMARY); + } + + /** + * {@inheritDoc} + */ + @Override + public PortalSysDict as(String alias) { + return new PortalSysDict(alias, this); + } + + /** + * Rename this table + */ + public PortalSysDict rename(String name) { + return new PortalSysDict(name, null); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalTenant.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalTenant.java new file mode 100644 index 0000000000000000000000000000000000000000..8d2ac4fbaae855081205f0ebd18931dc2081ee6f --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalTenant.java @@ -0,0 +1,134 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq.tables; + + +import com.idcos.enterprise.jooq.Clouduam; +import com.idcos.enterprise.jooq.Keys; +import com.idcos.enterprise.jooq.tables.records.PortalTenantRecord; + +import java.sql.Timestamp; +import java.util.Arrays; +import java.util.List; + +import javax.annotation.Generated; + +import org.jooq.Field; +import org.jooq.Table; +import org.jooq.TableField; +import org.jooq.UniqueKey; +import org.jooq.impl.TableImpl; + + +/** + * 租户信息表 + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class PortalTenant extends TableImpl<PortalTenantRecord> { + + private static final long serialVersionUID = -892349280; + + /** + * The reference instance of <code>clouduam.PORTAL_TENANT</code> + */ + public static final PortalTenant PORTAL_TENANT = new PortalTenant(); + + /** + * The class holding records for this type + */ + @Override + public Class<PortalTenantRecord> getRecordType() { + return PortalTenantRecord.class; + } + + /** + * The column <code>clouduam.PORTAL_TENANT.ID</code>. + */ + public final TableField<PortalTenantRecord, String> ID = createField("ID", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, ""); + + /** + * The column <code>clouduam.PORTAL_TENANT.NAME</code>. 租户编码 + */ + public final TableField<PortalTenantRecord, String> NAME = createField("NAME", org.jooq.impl.SQLDataType.VARCHAR.length(128), this, "租户编码"); + + /** + * The column <code>clouduam.PORTAL_TENANT.DISPLAY_NAME</code>. 租户名称 + */ + public final TableField<PortalTenantRecord, String> DISPLAY_NAME = createField("DISPLAY_NAME", org.jooq.impl.SQLDataType.VARCHAR.length(128), this, "租户名称"); + + /** + * The column <code>clouduam.PORTAL_TENANT.GMT_CREATE</code>. 创建日期 + */ + public final TableField<PortalTenantRecord, Timestamp> GMT_CREATE = createField("GMT_CREATE", org.jooq.impl.SQLDataType.TIMESTAMP, this, "创建日期"); + + /** + * The column <code>clouduam.PORTAL_TENANT.GMT_MODIFIED</code>. 修改日期 + */ + public final TableField<PortalTenantRecord, Timestamp> GMT_MODIFIED = createField("GMT_MODIFIED", org.jooq.impl.SQLDataType.TIMESTAMP.nullable(false), this, "修改日期"); + + /** + * The column <code>clouduam.PORTAL_TENANT.IS_ACTIVE</code>. 是否可用 + */ + public final TableField<PortalTenantRecord, String> IS_ACTIVE = createField("IS_ACTIVE", org.jooq.impl.SQLDataType.CHAR.length(1), this, "是否可用"); + + /** + * Create a <code>clouduam.PORTAL_TENANT</code> table reference + */ + public PortalTenant() { + this("PORTAL_TENANT", null); + } + + /** + * Create an aliased <code>clouduam.PORTAL_TENANT</code> table reference + */ + public PortalTenant(String alias) { + this(alias, PORTAL_TENANT); + } + + private PortalTenant(String alias, Table<PortalTenantRecord> aliased) { + this(alias, aliased, null); + } + + private PortalTenant(String alias, Table<PortalTenantRecord> aliased, Field<?>[] parameters) { + super(alias, Clouduam.CLOUDUAM, aliased, parameters, "租户信息表"); + } + + /** + * {@inheritDoc} + */ + @Override + public UniqueKey<PortalTenantRecord> getPrimaryKey() { + return Keys.KEY_PORTAL_TENANT_PRIMARY; + } + + /** + * {@inheritDoc} + */ + @Override + public List<UniqueKey<PortalTenantRecord>> getKeys() { + return Arrays.<UniqueKey<PortalTenantRecord>>asList(Keys.KEY_PORTAL_TENANT_PRIMARY); + } + + /** + * {@inheritDoc} + */ + @Override + public PortalTenant as(String alias) { + return new PortalTenant(alias, this); + } + + /** + * Rename this table + */ + public PortalTenant rename(String name) { + return new PortalTenant(name, null); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalToken.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalToken.java new file mode 100644 index 0000000000000000000000000000000000000000..43df1f08425f28d538919eb6450211829f9e408b --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalToken.java @@ -0,0 +1,155 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq.tables; + + +import com.idcos.enterprise.jooq.Clouduam; +import com.idcos.enterprise.jooq.Keys; +import com.idcos.enterprise.jooq.tables.records.PortalTokenRecord; + +import java.sql.Timestamp; +import java.util.Arrays; +import java.util.List; + +import javax.annotation.Generated; + +import org.jooq.Field; +import org.jooq.Table; +import org.jooq.TableField; +import org.jooq.UniqueKey; +import org.jooq.impl.TableImpl; +import org.jooq.types.UInteger; + + +/** + * token信息表 + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class PortalToken extends TableImpl<PortalTokenRecord> { + + private static final long serialVersionUID = -1174958722; + + /** + * The reference instance of <code>clouduam.PORTAL_TOKEN</code> + */ + public static final PortalToken PORTAL_TOKEN = new PortalToken(); + + /** + * The class holding records for this type + */ + @Override + public Class<PortalTokenRecord> getRecordType() { + return PortalTokenRecord.class; + } + + /** + * The column <code>clouduam.PORTAL_TOKEN.ID</code>. + */ + public final TableField<PortalTokenRecord, String> ID = createField("ID", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, ""); + + /** + * The column <code>clouduam.PORTAL_TOKEN.NAME</code>. token值 + */ + public final TableField<PortalTokenRecord, String> NAME = createField("NAME", org.jooq.impl.SQLDataType.CLOB.nullable(false), this, "token值"); + + /** + * The column <code>clouduam.PORTAL_TOKEN.TOKEN_CRC</code>. token串的crc哈希值 + */ + public final TableField<PortalTokenRecord, UInteger> TOKEN_CRC = createField("TOKEN_CRC", org.jooq.impl.SQLDataType.INTEGERUNSIGNED.nullable(false).defaulted(true), this, "token串的crc哈希值"); + + /** + * The column <code>clouduam.PORTAL_TOKEN.LOGIN_ID</code>. 登录名 + */ + public final TableField<PortalTokenRecord, String> LOGIN_ID = createField("LOGIN_ID", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, "登录名"); + + /** + * The column <code>clouduam.PORTAL_TOKEN.TENANT_ID</code>. 租户code + */ + public final TableField<PortalTokenRecord, String> TENANT_ID = createField("TENANT_ID", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, "租户code"); + + /** + * The column <code>clouduam.PORTAL_TOKEN.IS_ACTIVE</code>. 是否可用 + */ + public final TableField<PortalTokenRecord, String> IS_ACTIVE = createField("IS_ACTIVE", org.jooq.impl.SQLDataType.CHAR.length(1), this, "是否可用"); + + /** + * The column <code>clouduam.PORTAL_TOKEN.EXPIRE_TIME</code>. token过期时间 + */ + public final TableField<PortalTokenRecord, Timestamp> EXPIRE_TIME = createField("EXPIRE_TIME", org.jooq.impl.SQLDataType.TIMESTAMP.nullable(false), this, "token过期时间"); + + /** + * The column <code>clouduam.PORTAL_TOKEN.GMT_CREATE</code>. 创建日期 + */ + public final TableField<PortalTokenRecord, Timestamp> GMT_CREATE = createField("GMT_CREATE", org.jooq.impl.SQLDataType.TIMESTAMP, this, "创建日期"); + + /** + * The column <code>clouduam.PORTAL_TOKEN.GMT_MODIFIED</code>. 修改日期 + */ + public final TableField<PortalTokenRecord, Timestamp> GMT_MODIFIED = createField("GMT_MODIFIED", org.jooq.impl.SQLDataType.TIMESTAMP.nullable(false), this, "修改日期"); + + /** + * The column <code>clouduam.PORTAL_TOKEN.REMARK</code>. 备注 + */ + public final TableField<PortalTokenRecord, String> REMARK = createField("REMARK", org.jooq.impl.SQLDataType.CLOB, this, "备注"); + + /** + * Create a <code>clouduam.PORTAL_TOKEN</code> table reference + */ + public PortalToken() { + this("PORTAL_TOKEN", null); + } + + /** + * Create an aliased <code>clouduam.PORTAL_TOKEN</code> table reference + */ + public PortalToken(String alias) { + this(alias, PORTAL_TOKEN); + } + + private PortalToken(String alias, Table<PortalTokenRecord> aliased) { + this(alias, aliased, null); + } + + private PortalToken(String alias, Table<PortalTokenRecord> aliased, Field<?>[] parameters) { + super(alias, Clouduam.CLOUDUAM, aliased, parameters, "token信息表"); + } + + /** + * {@inheritDoc} + */ + @Override + public UniqueKey<PortalTokenRecord> getPrimaryKey() { + return Keys.KEY_PORTAL_TOKEN_PRIMARY; + } + + /** + * {@inheritDoc} + */ + @Override + public List<UniqueKey<PortalTokenRecord>> getKeys() { + return Arrays.<UniqueKey<PortalTokenRecord>>asList(Keys.KEY_PORTAL_TOKEN_PRIMARY); + } + + /** + * {@inheritDoc} + */ + @Override + public PortalToken as(String alias) { + return new PortalToken(alias, this); + } + + /** + * Rename this table + */ + public PortalToken rename(String name) { + return new PortalToken(name, null); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalUser.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalUser.java new file mode 100644 index 0000000000000000000000000000000000000000..ca46f41c4b1cd515b024c1929f132cea8f1c44b6 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalUser.java @@ -0,0 +1,224 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq.tables; + + +import com.idcos.enterprise.jooq.Clouduam; +import com.idcos.enterprise.jooq.Keys; +import com.idcos.enterprise.jooq.tables.records.PortalUserRecord; + +import java.sql.Timestamp; +import java.util.Arrays; +import java.util.List; + +import javax.annotation.Generated; + +import org.jooq.Field; +import org.jooq.Table; +import org.jooq.TableField; +import org.jooq.UniqueKey; +import org.jooq.impl.TableImpl; + + +/** + * 用户信息表 + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class PortalUser extends TableImpl<PortalUserRecord> { + + private static final long serialVersionUID = -1616998714; + + /** + * The reference instance of <code>clouduam.PORTAL_USER</code> + */ + public static final PortalUser PORTAL_USER = new PortalUser(); + + /** + * The class holding records for this type + */ + @Override + public Class<PortalUserRecord> getRecordType() { + return PortalUserRecord.class; + } + + /** + * The column <code>clouduam.PORTAL_USER.ID</code>. 用户ID + */ + public final TableField<PortalUserRecord, String> ID = createField("ID", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, "用户ID"); + + /** + * The column <code>clouduam.PORTAL_USER.NAME</code>. + */ + public final TableField<PortalUserRecord, String> NAME = createField("NAME", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, ""); + + /** + * The column <code>clouduam.PORTAL_USER.LOGIN_ID</code>. 登录名 + */ + public final TableField<PortalUserRecord, String> LOGIN_ID = createField("LOGIN_ID", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, "登录名"); + + /** + * The column <code>clouduam.PORTAL_USER.DEPT_ID</code>. 部门id + */ + public final TableField<PortalUserRecord, String> DEPT_ID = createField("DEPT_ID", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, "部门id"); + + /** + * The column <code>clouduam.PORTAL_USER.TITLE</code>. 标签 + */ + public final TableField<PortalUserRecord, String> TITLE = createField("TITLE", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, "标签"); + + /** + * The column <code>clouduam.PORTAL_USER.MOBILE1</code>. + */ + public final TableField<PortalUserRecord, String> MOBILE1 = createField("MOBILE1", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, ""); + + /** + * The column <code>clouduam.PORTAL_USER.WEIXIN</code>. 标签 + */ + public final TableField<PortalUserRecord, String> WEIXIN = createField("WEIXIN", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, "标签"); + + /** + * The column <code>clouduam.PORTAL_USER.EMAIL</code>. 邮箱 + */ + public final TableField<PortalUserRecord, String> EMAIL = createField("EMAIL", org.jooq.impl.SQLDataType.VARCHAR.length(256), this, "邮箱"); + + /** + * The column <code>clouduam.PORTAL_USER.IS_ACTIVE</code>. 是否有效 + */ + public final TableField<PortalUserRecord, String> IS_ACTIVE = createField("IS_ACTIVE", org.jooq.impl.SQLDataType.CHAR.length(1), this, "是否有效"); + + /** + * The column <code>clouduam.PORTAL_USER.STATUS</code>. 用户类型:INIT、ENABLED、DISABLED、LOCKED + */ + public final TableField<PortalUserRecord, String> STATUS = createField("STATUS", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false).defaulted(true), this, "用户类型:INIT、ENABLED、DISABLED、LOCKED"); + + /** + * The column <code>clouduam.PORTAL_USER.REMARK</code>. 备注 + */ + public final TableField<PortalUserRecord, String> REMARK = createField("REMARK", org.jooq.impl.SQLDataType.VARCHAR.length(256), this, "备注"); + + /** + * The column <code>clouduam.PORTAL_USER.TENANT_ID</code>. 租户编码 + */ + public final TableField<PortalUserRecord, String> TENANT_ID = createField("TENANT_ID", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, "租户编码"); + + /** + * The column <code>clouduam.PORTAL_USER.SOURCE_TYPE</code>. 数据同步来源来源,默认值native表示本系统,如果来自第三方,则需重新定义该值 + */ + public final TableField<PortalUserRecord, String> SOURCE_TYPE = createField("SOURCE_TYPE", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false).defaulted(true), this, "数据同步来源来源,默认值native表示本系统,如果来自第三方,则需重新定义该值"); + + /** + * The column <code>clouduam.PORTAL_USER.LAST_MODIFIED_TIME</code>. 最后登录时间 + */ + public final TableField<PortalUserRecord, Timestamp> LAST_MODIFIED_TIME = createField("LAST_MODIFIED_TIME", org.jooq.impl.SQLDataType.TIMESTAMP, this, "最后登录时间"); + + /** + * The column <code>clouduam.PORTAL_USER.CREATE_TIME</code>. 创建时间 + */ + public final TableField<PortalUserRecord, Timestamp> CREATE_TIME = createField("CREATE_TIME", org.jooq.impl.SQLDataType.TIMESTAMP, this, "创建时间"); + + /** + * The column <code>clouduam.PORTAL_USER.LAST_LOGIN_TIME</code>. 最后修改时间 + */ + public final TableField<PortalUserRecord, Timestamp> LAST_LOGIN_TIME = createField("LAST_LOGIN_TIME", org.jooq.impl.SQLDataType.TIMESTAMP, this, "最后修改时间"); + + /** + * The column <code>clouduam.PORTAL_USER.PASSWORD</code>. 密码 + */ + public final TableField<PortalUserRecord, String> PASSWORD = createField("PASSWORD", org.jooq.impl.SQLDataType.VARCHAR.length(255), this, "密码"); + + /** + * The column <code>clouduam.PORTAL_USER.SALT</code>. 密码盐 + */ + public final TableField<PortalUserRecord, String> SALT = createField("SALT", org.jooq.impl.SQLDataType.VARCHAR.length(255), this, "密码盐"); + + /** + * The column <code>clouduam.PORTAL_USER.MOBILE2</code>. + */ + public final TableField<PortalUserRecord, String> MOBILE2 = createField("MOBILE2", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, ""); + + /** + * The column <code>clouduam.PORTAL_USER.RTX</code>. RTX沟通工具 + */ + public final TableField<PortalUserRecord, String> RTX = createField("RTX", org.jooq.impl.SQLDataType.VARCHAR.length(32), this, "RTX沟通工具"); + + /** + * The column <code>clouduam.PORTAL_USER.OFFICE_TEL1</code>. + */ + public final TableField<PortalUserRecord, String> OFFICE_TEL1 = createField("OFFICE_TEL1", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, ""); + + /** + * The column <code>clouduam.PORTAL_USER.OFFICE_TEL2</code>. + */ + public final TableField<PortalUserRecord, String> OFFICE_TEL2 = createField("OFFICE_TEL2", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, ""); + + /** + * The column <code>clouduam.PORTAL_USER.EMPLOYEE_TYPE</code>. + */ + public final TableField<PortalUserRecord, String> EMPLOYEE_TYPE = createField("EMPLOYEE_TYPE", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, ""); + + /** + * The column <code>clouduam.PORTAL_USER.CREATE_USER</code>. 创建人 + */ + public final TableField<PortalUserRecord, String> CREATE_USER = createField("CREATE_USER", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, "创建人"); + + /** + * Create a <code>clouduam.PORTAL_USER</code> table reference + */ + public PortalUser() { + this("PORTAL_USER", null); + } + + /** + * Create an aliased <code>clouduam.PORTAL_USER</code> table reference + */ + public PortalUser(String alias) { + this(alias, PORTAL_USER); + } + + private PortalUser(String alias, Table<PortalUserRecord> aliased) { + this(alias, aliased, null); + } + + private PortalUser(String alias, Table<PortalUserRecord> aliased, Field<?>[] parameters) { + super(alias, Clouduam.CLOUDUAM, aliased, parameters, "用户信息表"); + } + + /** + * {@inheritDoc} + */ + @Override + public UniqueKey<PortalUserRecord> getPrimaryKey() { + return Keys.KEY_PORTAL_USER_PRIMARY; + } + + /** + * {@inheritDoc} + */ + @Override + public List<UniqueKey<PortalUserRecord>> getKeys() { + return Arrays.<UniqueKey<PortalUserRecord>>asList(Keys.KEY_PORTAL_USER_PRIMARY); + } + + /** + * {@inheritDoc} + */ + @Override + public PortalUser as(String alias) { + return new PortalUser(alias, this); + } + + /** + * Rename this table + */ + public PortalUser rename(String name) { + return new PortalUser(name, null); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalUserGroup.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalUserGroup.java new file mode 100644 index 0000000000000000000000000000000000000000..238b81a647f390ffd1ab5eaffdb518d36bf33e93 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/PortalUserGroup.java @@ -0,0 +1,149 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq.tables; + + +import com.idcos.enterprise.jooq.Clouduam; +import com.idcos.enterprise.jooq.Keys; +import com.idcos.enterprise.jooq.tables.records.PortalUserGroupRecord; + +import java.sql.Timestamp; +import java.util.Arrays; +import java.util.List; + +import javax.annotation.Generated; + +import org.jooq.Field; +import org.jooq.Table; +import org.jooq.TableField; +import org.jooq.UniqueKey; +import org.jooq.impl.TableImpl; + + +/** + * 用户组信息表 + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class PortalUserGroup extends TableImpl<PortalUserGroupRecord> { + + private static final long serialVersionUID = -888338359; + + /** + * The reference instance of <code>clouduam.PORTAL_USER_GROUP</code> + */ + public static final PortalUserGroup PORTAL_USER_GROUP = new PortalUserGroup(); + + /** + * The class holding records for this type + */ + @Override + public Class<PortalUserGroupRecord> getRecordType() { + return PortalUserGroupRecord.class; + } + + /** + * The column <code>clouduam.PORTAL_USER_GROUP.ID</code>. 用户组ID + */ + public final TableField<PortalUserGroupRecord, String> ID = createField("ID", org.jooq.impl.SQLDataType.VARCHAR.length(64).nullable(false), this, "用户组ID"); + + /** + * The column <code>clouduam.PORTAL_USER_GROUP.NAME</code>. 用户组名称 + */ + public final TableField<PortalUserGroupRecord, String> NAME = createField("NAME", org.jooq.impl.SQLDataType.VARCHAR.length(128), this, "用户组名称"); + + /** + * The column <code>clouduam.PORTAL_USER_GROUP.TYPE</code>. 用户组类型 + */ + public final TableField<PortalUserGroupRecord, String> TYPE = createField("TYPE", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, "用户组类型"); + + /** + * The column <code>clouduam.PORTAL_USER_GROUP.REMARK</code>. 备注 + */ + public final TableField<PortalUserGroupRecord, String> REMARK = createField("REMARK", org.jooq.impl.SQLDataType.VARCHAR.length(256), this, "备注"); + + /** + * The column <code>clouduam.PORTAL_USER_GROUP.CREATE_USER</code>. 创建人 + */ + public final TableField<PortalUserGroupRecord, String> CREATE_USER = createField("CREATE_USER", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, "创建人"); + + /** + * The column <code>clouduam.PORTAL_USER_GROUP.GMT_CREATE</code>. 创建时间 + */ + public final TableField<PortalUserGroupRecord, Timestamp> GMT_CREATE = createField("GMT_CREATE", org.jooq.impl.SQLDataType.TIMESTAMP, this, "创建时间"); + + /** + * The column <code>clouduam.PORTAL_USER_GROUP.GMT_MODIFIED</code>. 最后修改时间 + */ + public final TableField<PortalUserGroupRecord, Timestamp> GMT_MODIFIED = createField("GMT_MODIFIED", org.jooq.impl.SQLDataType.TIMESTAMP.nullable(false), this, "最后修改时间"); + + /** + * The column <code>clouduam.PORTAL_USER_GROUP.IS_ACTIVE</code>. 是否有效 + */ + public final TableField<PortalUserGroupRecord, String> IS_ACTIVE = createField("IS_ACTIVE", org.jooq.impl.SQLDataType.CHAR.length(1), this, "是否有效"); + + /** + * The column <code>clouduam.PORTAL_USER_GROUP.TENANT</code>. 租户code + */ + public final TableField<PortalUserGroupRecord, String> TENANT = createField("TENANT", org.jooq.impl.SQLDataType.VARCHAR.length(64), this, "租户code"); + + /** + * Create a <code>clouduam.PORTAL_USER_GROUP</code> table reference + */ + public PortalUserGroup() { + this("PORTAL_USER_GROUP", null); + } + + /** + * Create an aliased <code>clouduam.PORTAL_USER_GROUP</code> table reference + */ + public PortalUserGroup(String alias) { + this(alias, PORTAL_USER_GROUP); + } + + private PortalUserGroup(String alias, Table<PortalUserGroupRecord> aliased) { + this(alias, aliased, null); + } + + private PortalUserGroup(String alias, Table<PortalUserGroupRecord> aliased, Field<?>[] parameters) { + super(alias, Clouduam.CLOUDUAM, aliased, parameters, "用户组信息表"); + } + + /** + * {@inheritDoc} + */ + @Override + public UniqueKey<PortalUserGroupRecord> getPrimaryKey() { + return Keys.KEY_PORTAL_USER_GROUP_PRIMARY; + } + + /** + * {@inheritDoc} + */ + @Override + public List<UniqueKey<PortalUserGroupRecord>> getKeys() { + return Arrays.<UniqueKey<PortalUserGroupRecord>>asList(Keys.KEY_PORTAL_USER_GROUP_PRIMARY); + } + + /** + * {@inheritDoc} + */ + @Override + public PortalUserGroup as(String alias) { + return new PortalUserGroup(alias, this); + } + + /** + * Rename this table + */ + public PortalUserGroup rename(String name) { + return new PortalUserGroup(name, null); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalDeptRecord.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalDeptRecord.java new file mode 100644 index 0000000000000000000000000000000000000000..d80bbb6c932e9dcfae816739bb6bc698b5b62716 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalDeptRecord.java @@ -0,0 +1,544 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq.tables.records; + + +import com.idcos.enterprise.jooq.tables.PortalDept; + +import java.sql.Timestamp; + +import javax.annotation.Generated; + +import org.jooq.Field; +import org.jooq.Record1; +import org.jooq.Record11; +import org.jooq.Row11; +import org.jooq.impl.UpdatableRecordImpl; + + +/** + * 部门信息表 + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class PortalDeptRecord extends UpdatableRecordImpl<PortalDeptRecord> implements Record11<String, String, String, String, String, String, String, String, String, Timestamp, Timestamp> { + + private static final long serialVersionUID = 1423667730; + + /** + * Setter for <code>clouduam.PORTAL_DEPT.ID</code>. + */ + public void setId(String value) { + setValue(0, value); + } + + /** + * Getter for <code>clouduam.PORTAL_DEPT.ID</code>. + */ + public String getId() { + return (String) getValue(0); + } + + /** + * Setter for <code>clouduam.PORTAL_DEPT.CODE</code>. 部门code + */ + public void setCode(String value) { + setValue(1, value); + } + + /** + * Getter for <code>clouduam.PORTAL_DEPT.CODE</code>. 部门code + */ + public String getCode() { + return (String) getValue(1); + } + + /** + * Setter for <code>clouduam.PORTAL_DEPT.DISPLAY_NAME</code>. 部门名称 + */ + public void setDisplayName(String value) { + setValue(2, value); + } + + /** + * Getter for <code>clouduam.PORTAL_DEPT.DISPLAY_NAME</code>. 部门名称 + */ + public String getDisplayName() { + return (String) getValue(2); + } + + /** + * Setter for <code>clouduam.PORTAL_DEPT.PARENT_ID</code>. 父项目id + */ + public void setParentId(String value) { + setValue(3, value); + } + + /** + * Getter for <code>clouduam.PORTAL_DEPT.PARENT_ID</code>. 父项目id + */ + public String getParentId() { + return (String) getValue(3); + } + + /** + * Setter for <code>clouduam.PORTAL_DEPT.STATUS</code>. 部门状态 + */ + public void setStatus(String value) { + setValue(4, value); + } + + /** + * Getter for <code>clouduam.PORTAL_DEPT.STATUS</code>. 部门状态 + */ + public String getStatus() { + return (String) getValue(4); + } + + /** + * Setter for <code>clouduam.PORTAL_DEPT.MANAGER_ID</code>. + */ + public void setManagerId(String value) { + setValue(5, value); + } + + /** + * Getter for <code>clouduam.PORTAL_DEPT.MANAGER_ID</code>. + */ + public String getManagerId() { + return (String) getValue(5); + } + + /** + * Setter for <code>clouduam.PORTAL_DEPT.REMARK</code>. 备注 + */ + public void setRemark(String value) { + setValue(6, value); + } + + /** + * Getter for <code>clouduam.PORTAL_DEPT.REMARK</code>. 备注 + */ + public String getRemark() { + return (String) getValue(6); + } + + /** + * Setter for <code>clouduam.PORTAL_DEPT.TENANT_ID</code>. 租户id + */ + public void setTenantId(String value) { + setValue(7, value); + } + + /** + * Getter for <code>clouduam.PORTAL_DEPT.TENANT_ID</code>. 租户id + */ + public String getTenantId() { + return (String) getValue(7); + } + + /** + * Setter for <code>clouduam.PORTAL_DEPT.SOURCE_TYPE</code>. 数据同步来源来源,默认值native表示本系统,如果来自第三方,则需重新定义该值 + */ + public void setSourceType(String value) { + setValue(8, value); + } + + /** + * Getter for <code>clouduam.PORTAL_DEPT.SOURCE_TYPE</code>. 数据同步来源来源,默认值native表示本系统,如果来自第三方,则需重新定义该值 + */ + public String getSourceType() { + return (String) getValue(8); + } + + /** + * Setter for <code>clouduam.PORTAL_DEPT.GMT_CREATE</code>. 创建日期 + */ + public void setGmtCreate(Timestamp value) { + setValue(9, value); + } + + /** + * Getter for <code>clouduam.PORTAL_DEPT.GMT_CREATE</code>. 创建日期 + */ + public Timestamp getGmtCreate() { + return (Timestamp) getValue(9); + } + + /** + * Setter for <code>clouduam.PORTAL_DEPT.GMT_MODIFIED</code>. 修改日期 + */ + public void setGmtModified(Timestamp value) { + setValue(10, value); + } + + /** + * Getter for <code>clouduam.PORTAL_DEPT.GMT_MODIFIED</code>. 修改日期 + */ + public Timestamp getGmtModified() { + return (Timestamp) getValue(10); + } + + // ------------------------------------------------------------------------- + // Primary key information + // ------------------------------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public Record1<String> key() { + return (Record1) super.key(); + } + + // ------------------------------------------------------------------------- + // Record11 type implementation + // ------------------------------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public Row11<String, String, String, String, String, String, String, String, String, Timestamp, Timestamp> fieldsRow() { + return (Row11) super.fieldsRow(); + } + + /** + * {@inheritDoc} + */ + @Override + public Row11<String, String, String, String, String, String, String, String, String, Timestamp, Timestamp> valuesRow() { + return (Row11) super.valuesRow(); + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field1() { + return PortalDept.PORTAL_DEPT.ID; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field2() { + return PortalDept.PORTAL_DEPT.CODE; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field3() { + return PortalDept.PORTAL_DEPT.DISPLAY_NAME; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field4() { + return PortalDept.PORTAL_DEPT.PARENT_ID; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field5() { + return PortalDept.PORTAL_DEPT.STATUS; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field6() { + return PortalDept.PORTAL_DEPT.MANAGER_ID; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field7() { + return PortalDept.PORTAL_DEPT.REMARK; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field8() { + return PortalDept.PORTAL_DEPT.TENANT_ID; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field9() { + return PortalDept.PORTAL_DEPT.SOURCE_TYPE; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<Timestamp> field10() { + return PortalDept.PORTAL_DEPT.GMT_CREATE; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<Timestamp> field11() { + return PortalDept.PORTAL_DEPT.GMT_MODIFIED; + } + + /** + * {@inheritDoc} + */ + @Override + public String value1() { + return getId(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value2() { + return getCode(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value3() { + return getDisplayName(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value4() { + return getParentId(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value5() { + return getStatus(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value6() { + return getManagerId(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value7() { + return getRemark(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value8() { + return getTenantId(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value9() { + return getSourceType(); + } + + /** + * {@inheritDoc} + */ + @Override + public Timestamp value10() { + return getGmtCreate(); + } + + /** + * {@inheritDoc} + */ + @Override + public Timestamp value11() { + return getGmtModified(); + } + + /** + * {@inheritDoc} + */ + @Override + public PortalDeptRecord value1(String value) { + setId(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalDeptRecord value2(String value) { + setCode(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalDeptRecord value3(String value) { + setDisplayName(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalDeptRecord value4(String value) { + setParentId(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalDeptRecord value5(String value) { + setStatus(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalDeptRecord value6(String value) { + setManagerId(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalDeptRecord value7(String value) { + setRemark(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalDeptRecord value8(String value) { + setTenantId(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalDeptRecord value9(String value) { + setSourceType(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalDeptRecord value10(Timestamp value) { + setGmtCreate(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalDeptRecord value11(Timestamp value) { + setGmtModified(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalDeptRecord values(String value1, String value2, String value3, String value4, String value5, String value6, String value7, String value8, String value9, Timestamp value10, Timestamp value11) { + value1(value1); + value2(value2); + value3(value3); + value4(value4); + value5(value5); + value6(value6); + value7(value7); + value8(value8); + value9(value9); + value10(value10); + value11(value11); + return this; + } + + // ------------------------------------------------------------------------- + // Constructors + // ------------------------------------------------------------------------- + + /** + * Create a detached PortalDeptRecord + */ + public PortalDeptRecord() { + super(PortalDept.PORTAL_DEPT); + } + + /** + * Create a detached, initialised PortalDeptRecord + */ + public PortalDeptRecord(String id, String code, String displayName, String parentId, String status, String managerId, String remark, String tenantId, String sourceType, Timestamp gmtCreate, Timestamp gmtModified) { + super(PortalDept.PORTAL_DEPT); + + setValue(0, id); + setValue(1, code); + setValue(2, displayName); + setValue(3, parentId); + setValue(4, status); + setValue(5, managerId); + setValue(6, remark); + setValue(7, tenantId); + setValue(8, sourceType); + setValue(9, gmtCreate); + setValue(10, gmtModified); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalDeptRoleRelRecord.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalDeptRoleRelRecord.java new file mode 100644 index 0000000000000000000000000000000000000000..568fbaa6337a28923539cffb8c114c7e32a456ca --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalDeptRoleRelRecord.java @@ -0,0 +1,214 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq.tables.records; + + +import com.idcos.enterprise.jooq.tables.PortalDeptRoleRel; + +import javax.annotation.Generated; + +import org.jooq.Field; +import org.jooq.Record1; +import org.jooq.Record3; +import org.jooq.Row3; +import org.jooq.impl.UpdatableRecordImpl; + + +/** + * 部门与角色的关系表 + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class PortalDeptRoleRelRecord extends UpdatableRecordImpl<PortalDeptRoleRelRecord> implements Record3<String, String, String> { + + private static final long serialVersionUID = -673520352; + + /** + * Setter for <code>clouduam.PORTAL_DEPT_ROLE_REL.ID</code>. id + */ + public void setId(String value) { + setValue(0, value); + } + + /** + * Getter for <code>clouduam.PORTAL_DEPT_ROLE_REL.ID</code>. id + */ + public String getId() { + return (String) getValue(0); + } + + /** + * Setter for <code>clouduam.PORTAL_DEPT_ROLE_REL.DEPT_ID</code>. 部门id + */ + public void setDeptId(String value) { + setValue(1, value); + } + + /** + * Getter for <code>clouduam.PORTAL_DEPT_ROLE_REL.DEPT_ID</code>. 部门id + */ + public String getDeptId() { + return (String) getValue(1); + } + + /** + * Setter for <code>clouduam.PORTAL_DEPT_ROLE_REL.ROLE_ID</code>. 角色id + */ + public void setRoleId(String value) { + setValue(2, value); + } + + /** + * Getter for <code>clouduam.PORTAL_DEPT_ROLE_REL.ROLE_ID</code>. 角色id + */ + public String getRoleId() { + return (String) getValue(2); + } + + // ------------------------------------------------------------------------- + // Primary key information + // ------------------------------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public Record1<String> key() { + return (Record1) super.key(); + } + + // ------------------------------------------------------------------------- + // Record3 type implementation + // ------------------------------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public Row3<String, String, String> fieldsRow() { + return (Row3) super.fieldsRow(); + } + + /** + * {@inheritDoc} + */ + @Override + public Row3<String, String, String> valuesRow() { + return (Row3) super.valuesRow(); + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field1() { + return PortalDeptRoleRel.PORTAL_DEPT_ROLE_REL.ID; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field2() { + return PortalDeptRoleRel.PORTAL_DEPT_ROLE_REL.DEPT_ID; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field3() { + return PortalDeptRoleRel.PORTAL_DEPT_ROLE_REL.ROLE_ID; + } + + /** + * {@inheritDoc} + */ + @Override + public String value1() { + return getId(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value2() { + return getDeptId(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value3() { + return getRoleId(); + } + + /** + * {@inheritDoc} + */ + @Override + public PortalDeptRoleRelRecord value1(String value) { + setId(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalDeptRoleRelRecord value2(String value) { + setDeptId(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalDeptRoleRelRecord value3(String value) { + setRoleId(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalDeptRoleRelRecord values(String value1, String value2, String value3) { + value1(value1); + value2(value2); + value3(value3); + return this; + } + + // ------------------------------------------------------------------------- + // Constructors + // ------------------------------------------------------------------------- + + /** + * Create a detached PortalDeptRoleRelRecord + */ + public PortalDeptRoleRelRecord() { + super(PortalDeptRoleRel.PORTAL_DEPT_ROLE_REL); + } + + /** + * Create a detached, initialised PortalDeptRoleRelRecord + */ + public PortalDeptRoleRelRecord(String id, String deptId, String roleId) { + super(PortalDeptRoleRel.PORTAL_DEPT_ROLE_REL); + + setValue(0, id); + setValue(1, deptId); + setValue(2, roleId); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalGroupRoleRelRecord.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalGroupRoleRelRecord.java new file mode 100644 index 0000000000000000000000000000000000000000..74aed1c0bda73a1c9f8e6af7a4a7d1b59e1c29c4 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalGroupRoleRelRecord.java @@ -0,0 +1,255 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq.tables.records; + + +import com.idcos.enterprise.jooq.tables.PortalGroupRoleRel; + +import javax.annotation.Generated; + +import org.jooq.Field; +import org.jooq.Record1; +import org.jooq.Record4; +import org.jooq.Row4; +import org.jooq.impl.UpdatableRecordImpl; + + +/** + * 用户组与角色关系表 + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class PortalGroupRoleRelRecord extends UpdatableRecordImpl<PortalGroupRoleRelRecord> implements Record4<String, String, String, String> { + + private static final long serialVersionUID = -1466261113; + + /** + * Setter for <code>clouduam.PORTAL_GROUP_ROLE_REL.ID</code>. 关系ID + */ + public void setId(String value) { + setValue(0, value); + } + + /** + * Getter for <code>clouduam.PORTAL_GROUP_ROLE_REL.ID</code>. 关系ID + */ + public String getId() { + return (String) getValue(0); + } + + /** + * Setter for <code>clouduam.PORTAL_GROUP_ROLE_REL.ROLE_ID</code>. 角色ID + */ + public void setRoleId(String value) { + setValue(1, value); + } + + /** + * Getter for <code>clouduam.PORTAL_GROUP_ROLE_REL.ROLE_ID</code>. 角色ID + */ + public String getRoleId() { + return (String) getValue(1); + } + + /** + * Setter for <code>clouduam.PORTAL_GROUP_ROLE_REL.GROUP_ID</code>. 用户组ID + */ + public void setGroupId(String value) { + setValue(2, value); + } + + /** + * Getter for <code>clouduam.PORTAL_GROUP_ROLE_REL.GROUP_ID</code>. 用户组ID + */ + public String getGroupId() { + return (String) getValue(2); + } + + /** + * Setter for <code>clouduam.PORTAL_GROUP_ROLE_REL.TENANT</code>. 租户code + */ + public void setTenant(String value) { + setValue(3, value); + } + + /** + * Getter for <code>clouduam.PORTAL_GROUP_ROLE_REL.TENANT</code>. 租户code + */ + public String getTenant() { + return (String) getValue(3); + } + + // ------------------------------------------------------------------------- + // Primary key information + // ------------------------------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public Record1<String> key() { + return (Record1) super.key(); + } + + // ------------------------------------------------------------------------- + // Record4 type implementation + // ------------------------------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public Row4<String, String, String, String> fieldsRow() { + return (Row4) super.fieldsRow(); + } + + /** + * {@inheritDoc} + */ + @Override + public Row4<String, String, String, String> valuesRow() { + return (Row4) super.valuesRow(); + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field1() { + return PortalGroupRoleRel.PORTAL_GROUP_ROLE_REL.ID; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field2() { + return PortalGroupRoleRel.PORTAL_GROUP_ROLE_REL.ROLE_ID; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field3() { + return PortalGroupRoleRel.PORTAL_GROUP_ROLE_REL.GROUP_ID; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field4() { + return PortalGroupRoleRel.PORTAL_GROUP_ROLE_REL.TENANT; + } + + /** + * {@inheritDoc} + */ + @Override + public String value1() { + return getId(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value2() { + return getRoleId(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value3() { + return getGroupId(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value4() { + return getTenant(); + } + + /** + * {@inheritDoc} + */ + @Override + public PortalGroupRoleRelRecord value1(String value) { + setId(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalGroupRoleRelRecord value2(String value) { + setRoleId(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalGroupRoleRelRecord value3(String value) { + setGroupId(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalGroupRoleRelRecord value4(String value) { + setTenant(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalGroupRoleRelRecord values(String value1, String value2, String value3, String value4) { + value1(value1); + value2(value2); + value3(value3); + value4(value4); + return this; + } + + // ------------------------------------------------------------------------- + // Constructors + // ------------------------------------------------------------------------- + + /** + * Create a detached PortalGroupRoleRelRecord + */ + public PortalGroupRoleRelRecord() { + super(PortalGroupRoleRel.PORTAL_GROUP_ROLE_REL); + } + + /** + * Create a detached, initialised PortalGroupRoleRelRecord + */ + public PortalGroupRoleRelRecord(String id, String roleId, String groupId, String tenant) { + super(PortalGroupRoleRel.PORTAL_GROUP_ROLE_REL); + + setValue(0, id); + setValue(1, roleId); + setValue(2, groupId); + setValue(3, tenant); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalGroupUserRelRecord.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalGroupUserRelRecord.java new file mode 100644 index 0000000000000000000000000000000000000000..8e7149681575dc88afdc382ad164006bc4793199 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalGroupUserRelRecord.java @@ -0,0 +1,242 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq.tables.records; + + +import com.idcos.enterprise.jooq.tables.PortalGroupUserRel; + +import javax.annotation.Generated; + +import org.jooq.Field; +import org.jooq.Record4; +import org.jooq.Row4; +import org.jooq.impl.TableRecordImpl; + + +/** + * 用户组用户关系表 + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class PortalGroupUserRelRecord extends TableRecordImpl<PortalGroupUserRelRecord> implements Record4<String, String, String, String> { + + private static final long serialVersionUID = 279811932; + + /** + * Setter for <code>clouduam.PORTAL_GROUP_USER_REL.ID</code>. 关系ID + */ + public void setId(String value) { + setValue(0, value); + } + + /** + * Getter for <code>clouduam.PORTAL_GROUP_USER_REL.ID</code>. 关系ID + */ + public String getId() { + return (String) getValue(0); + } + + /** + * Setter for <code>clouduam.PORTAL_GROUP_USER_REL.USER_ID</code>. 用户ID + */ + public void setUserId(String value) { + setValue(1, value); + } + + /** + * Getter for <code>clouduam.PORTAL_GROUP_USER_REL.USER_ID</code>. 用户ID + */ + public String getUserId() { + return (String) getValue(1); + } + + /** + * Setter for <code>clouduam.PORTAL_GROUP_USER_REL.GROUP_ID</code>. 用户组ID + */ + public void setGroupId(String value) { + setValue(2, value); + } + + /** + * Getter for <code>clouduam.PORTAL_GROUP_USER_REL.GROUP_ID</code>. 用户组ID + */ + public String getGroupId() { + return (String) getValue(2); + } + + /** + * Setter for <code>clouduam.PORTAL_GROUP_USER_REL.TENANT</code>. 租户code + */ + public void setTenant(String value) { + setValue(3, value); + } + + /** + * Getter for <code>clouduam.PORTAL_GROUP_USER_REL.TENANT</code>. 租户code + */ + public String getTenant() { + return (String) getValue(3); + } + + // ------------------------------------------------------------------------- + // Record4 type implementation + // ------------------------------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public Row4<String, String, String, String> fieldsRow() { + return (Row4) super.fieldsRow(); + } + + /** + * {@inheritDoc} + */ + @Override + public Row4<String, String, String, String> valuesRow() { + return (Row4) super.valuesRow(); + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field1() { + return PortalGroupUserRel.PORTAL_GROUP_USER_REL.ID; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field2() { + return PortalGroupUserRel.PORTAL_GROUP_USER_REL.USER_ID; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field3() { + return PortalGroupUserRel.PORTAL_GROUP_USER_REL.GROUP_ID; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field4() { + return PortalGroupUserRel.PORTAL_GROUP_USER_REL.TENANT; + } + + /** + * {@inheritDoc} + */ + @Override + public String value1() { + return getId(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value2() { + return getUserId(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value3() { + return getGroupId(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value4() { + return getTenant(); + } + + /** + * {@inheritDoc} + */ + @Override + public PortalGroupUserRelRecord value1(String value) { + setId(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalGroupUserRelRecord value2(String value) { + setUserId(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalGroupUserRelRecord value3(String value) { + setGroupId(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalGroupUserRelRecord value4(String value) { + setTenant(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalGroupUserRelRecord values(String value1, String value2, String value3, String value4) { + value1(value1); + value2(value2); + value3(value3); + value4(value4); + return this; + } + + // ------------------------------------------------------------------------- + // Constructors + // ------------------------------------------------------------------------- + + /** + * Create a detached PortalGroupUserRelRecord + */ + public PortalGroupUserRelRecord() { + super(PortalGroupUserRel.PORTAL_GROUP_USER_REL); + } + + /** + * Create a detached, initialised PortalGroupUserRelRecord + */ + public PortalGroupUserRelRecord(String id, String userId, String groupId, String tenant) { + super(PortalGroupUserRel.PORTAL_GROUP_USER_REL); + + setValue(0, id); + setValue(1, userId); + setValue(2, groupId); + setValue(3, tenant); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalPermissionRecord.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalPermissionRecord.java new file mode 100644 index 0000000000000000000000000000000000000000..98e9210b076f03b4753ec95add88e312ce09bfe1 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalPermissionRecord.java @@ -0,0 +1,419 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq.tables.records; + + +import com.idcos.enterprise.jooq.tables.PortalPermission; + +import javax.annotation.Generated; + +import org.jooq.Field; +import org.jooq.Record1; +import org.jooq.Record8; +import org.jooq.Row8; +import org.jooq.impl.UpdatableRecordImpl; + + +/** + * 授权信息表 + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class PortalPermissionRecord extends UpdatableRecordImpl<PortalPermissionRecord> implements Record8<String, String, String, String, String, String, String, String> { + + private static final long serialVersionUID = -43383838; + + /** + * Setter for <code>clouduam.PORTAL_PERMISSION.ID</code>. 授权信息ID + */ + public void setId(String value) { + setValue(0, value); + } + + /** + * Getter for <code>clouduam.PORTAL_PERMISSION.ID</code>. 授权信息ID + */ + public String getId() { + return (String) getValue(0); + } + + /** + * Setter for <code>clouduam.PORTAL_PERMISSION.APP_ID</code>. 应用系统名称 + */ + public void setAppId(String value) { + setValue(1, value); + } + + /** + * Getter for <code>clouduam.PORTAL_PERMISSION.APP_ID</code>. 应用系统名称 + */ + public String getAppId() { + return (String) getValue(1); + } + + /** + * Setter for <code>clouduam.PORTAL_PERMISSION.AUTH_RES_TYPE</code>. 权限资源类型 + */ + public void setAuthResType(String value) { + setValue(2, value); + } + + /** + * Getter for <code>clouduam.PORTAL_PERMISSION.AUTH_RES_TYPE</code>. 权限资源类型 + */ + public String getAuthResType() { + return (String) getValue(2); + } + + /** + * Setter for <code>clouduam.PORTAL_PERMISSION.AUTH_RES_ID</code>. 权限资源ID + */ + public void setAuthResId(String value) { + setValue(3, value); + } + + /** + * Getter for <code>clouduam.PORTAL_PERMISSION.AUTH_RES_ID</code>. 权限资源ID + */ + public String getAuthResId() { + return (String) getValue(3); + } + + /** + * Setter for <code>clouduam.PORTAL_PERMISSION.AUTH_RES_NAME</code>. + */ + public void setAuthResName(String value) { + setValue(4, value); + } + + /** + * Getter for <code>clouduam.PORTAL_PERMISSION.AUTH_RES_NAME</code>. + */ + public String getAuthResName() { + return (String) getValue(4); + } + + /** + * Setter for <code>clouduam.PORTAL_PERMISSION.AUTH_OBJ_ID</code>. 授权对象ID + */ + public void setAuthObjId(String value) { + setValue(5, value); + } + + /** + * Getter for <code>clouduam.PORTAL_PERMISSION.AUTH_OBJ_ID</code>. 授权对象ID + */ + public String getAuthObjId() { + return (String) getValue(5); + } + + /** + * Setter for <code>clouduam.PORTAL_PERMISSION.AUTH_OBJ_TYPE</code>. 授权对象类型 + */ + public void setAuthObjType(String value) { + setValue(6, value); + } + + /** + * Getter for <code>clouduam.PORTAL_PERMISSION.AUTH_OBJ_TYPE</code>. 授权对象类型 + */ + public String getAuthObjType() { + return (String) getValue(6); + } + + /** + * Setter for <code>clouduam.PORTAL_PERMISSION.TENANT</code>. 租户code + */ + public void setTenant(String value) { + setValue(7, value); + } + + /** + * Getter for <code>clouduam.PORTAL_PERMISSION.TENANT</code>. 租户code + */ + public String getTenant() { + return (String) getValue(7); + } + + // ------------------------------------------------------------------------- + // Primary key information + // ------------------------------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public Record1<String> key() { + return (Record1) super.key(); + } + + // ------------------------------------------------------------------------- + // Record8 type implementation + // ------------------------------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public Row8<String, String, String, String, String, String, String, String> fieldsRow() { + return (Row8) super.fieldsRow(); + } + + /** + * {@inheritDoc} + */ + @Override + public Row8<String, String, String, String, String, String, String, String> valuesRow() { + return (Row8) super.valuesRow(); + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field1() { + return PortalPermission.PORTAL_PERMISSION.ID; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field2() { + return PortalPermission.PORTAL_PERMISSION.APP_ID; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field3() { + return PortalPermission.PORTAL_PERMISSION.AUTH_RES_TYPE; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field4() { + return PortalPermission.PORTAL_PERMISSION.AUTH_RES_ID; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field5() { + return PortalPermission.PORTAL_PERMISSION.AUTH_RES_NAME; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field6() { + return PortalPermission.PORTAL_PERMISSION.AUTH_OBJ_ID; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field7() { + return PortalPermission.PORTAL_PERMISSION.AUTH_OBJ_TYPE; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field8() { + return PortalPermission.PORTAL_PERMISSION.TENANT; + } + + /** + * {@inheritDoc} + */ + @Override + public String value1() { + return getId(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value2() { + return getAppId(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value3() { + return getAuthResType(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value4() { + return getAuthResId(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value5() { + return getAuthResName(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value6() { + return getAuthObjId(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value7() { + return getAuthObjType(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value8() { + return getTenant(); + } + + /** + * {@inheritDoc} + */ + @Override + public PortalPermissionRecord value1(String value) { + setId(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalPermissionRecord value2(String value) { + setAppId(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalPermissionRecord value3(String value) { + setAuthResType(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalPermissionRecord value4(String value) { + setAuthResId(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalPermissionRecord value5(String value) { + setAuthResName(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalPermissionRecord value6(String value) { + setAuthObjId(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalPermissionRecord value7(String value) { + setAuthObjType(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalPermissionRecord value8(String value) { + setTenant(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalPermissionRecord values(String value1, String value2, String value3, String value4, String value5, String value6, String value7, String value8) { + value1(value1); + value2(value2); + value3(value3); + value4(value4); + value5(value5); + value6(value6); + value7(value7); + value8(value8); + return this; + } + + // ------------------------------------------------------------------------- + // Constructors + // ------------------------------------------------------------------------- + + /** + * Create a detached PortalPermissionRecord + */ + public PortalPermissionRecord() { + super(PortalPermission.PORTAL_PERMISSION); + } + + /** + * Create a detached, initialised PortalPermissionRecord + */ + public PortalPermissionRecord(String id, String appId, String authResType, String authResId, String authResName, String authObjId, String authObjType, String tenant) { + super(PortalPermission.PORTAL_PERMISSION); + + setValue(0, id); + setValue(1, appId); + setValue(2, authResType); + setValue(3, authResId); + setValue(4, authResName); + setValue(5, authObjId); + setValue(6, authObjType); + setValue(7, tenant); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalResourceRecord.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalResourceRecord.java new file mode 100644 index 0000000000000000000000000000000000000000..fc2a998633a41a3877e688342da1cb83df45c722 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalResourceRecord.java @@ -0,0 +1,419 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq.tables.records; + + +import com.idcos.enterprise.jooq.tables.PortalResource; + +import javax.annotation.Generated; + +import org.jooq.Field; +import org.jooq.Record1; +import org.jooq.Record8; +import org.jooq.Row8; +import org.jooq.impl.UpdatableRecordImpl; + + +/** + * 权限资源表 + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class PortalResourceRecord extends UpdatableRecordImpl<PortalResourceRecord> implements Record8<String, String, String, String, String, String, String, String> { + + private static final long serialVersionUID = -581895275; + + /** + * Setter for <code>clouduam.PORTAL_RESOURCE.ID</code>. + */ + public void setId(String value) { + setValue(0, value); + } + + /** + * Getter for <code>clouduam.PORTAL_RESOURCE.ID</code>. + */ + public String getId() { + return (String) getValue(0); + } + + /** + * Setter for <code>clouduam.PORTAL_RESOURCE.APP_ID</code>. 应用系统名称 + */ + public void setAppId(String value) { + setValue(1, value); + } + + /** + * Getter for <code>clouduam.PORTAL_RESOURCE.APP_ID</code>. 应用系统名称 + */ + public String getAppId() { + return (String) getValue(1); + } + + /** + * Setter for <code>clouduam.PORTAL_RESOURCE.CODE</code>. 权限资源类型 + */ + public void setCode(String value) { + setValue(2, value); + } + + /** + * Getter for <code>clouduam.PORTAL_RESOURCE.CODE</code>. 权限资源类型 + */ + public String getCode() { + return (String) getValue(2); + } + + /** + * Setter for <code>clouduam.PORTAL_RESOURCE.NAME</code>. 权限资源名称 + */ + public void setName(String value) { + setValue(3, value); + } + + /** + * Getter for <code>clouduam.PORTAL_RESOURCE.NAME</code>. 权限资源名称 + */ + public String getName() { + return (String) getValue(3); + } + + /** + * Setter for <code>clouduam.PORTAL_RESOURCE.URL</code>. 权限资源URL + */ + public void setUrl(String value) { + setValue(4, value); + } + + /** + * Getter for <code>clouduam.PORTAL_RESOURCE.URL</code>. 权限资源URL + */ + public String getUrl() { + return (String) getValue(4); + } + + /** + * Setter for <code>clouduam.PORTAL_RESOURCE.REMARK</code>. 备注 + */ + public void setRemark(String value) { + setValue(5, value); + } + + /** + * Getter for <code>clouduam.PORTAL_RESOURCE.REMARK</code>. 备注 + */ + public String getRemark() { + return (String) getValue(5); + } + + /** + * Setter for <code>clouduam.PORTAL_RESOURCE.IS_ACTIVE</code>. + */ + public void setIsActive(String value) { + setValue(6, value); + } + + /** + * Getter for <code>clouduam.PORTAL_RESOURCE.IS_ACTIVE</code>. + */ + public String getIsActive() { + return (String) getValue(6); + } + + /** + * Setter for <code>clouduam.PORTAL_RESOURCE.TENANT</code>. 租户code + */ + public void setTenant(String value) { + setValue(7, value); + } + + /** + * Getter for <code>clouduam.PORTAL_RESOURCE.TENANT</code>. 租户code + */ + public String getTenant() { + return (String) getValue(7); + } + + // ------------------------------------------------------------------------- + // Primary key information + // ------------------------------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public Record1<String> key() { + return (Record1) super.key(); + } + + // ------------------------------------------------------------------------- + // Record8 type implementation + // ------------------------------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public Row8<String, String, String, String, String, String, String, String> fieldsRow() { + return (Row8) super.fieldsRow(); + } + + /** + * {@inheritDoc} + */ + @Override + public Row8<String, String, String, String, String, String, String, String> valuesRow() { + return (Row8) super.valuesRow(); + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field1() { + return PortalResource.PORTAL_RESOURCE.ID; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field2() { + return PortalResource.PORTAL_RESOURCE.APP_ID; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field3() { + return PortalResource.PORTAL_RESOURCE.CODE; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field4() { + return PortalResource.PORTAL_RESOURCE.NAME; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field5() { + return PortalResource.PORTAL_RESOURCE.URL; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field6() { + return PortalResource.PORTAL_RESOURCE.REMARK; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field7() { + return PortalResource.PORTAL_RESOURCE.IS_ACTIVE; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field8() { + return PortalResource.PORTAL_RESOURCE.TENANT; + } + + /** + * {@inheritDoc} + */ + @Override + public String value1() { + return getId(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value2() { + return getAppId(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value3() { + return getCode(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value4() { + return getName(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value5() { + return getUrl(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value6() { + return getRemark(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value7() { + return getIsActive(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value8() { + return getTenant(); + } + + /** + * {@inheritDoc} + */ + @Override + public PortalResourceRecord value1(String value) { + setId(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalResourceRecord value2(String value) { + setAppId(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalResourceRecord value3(String value) { + setCode(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalResourceRecord value4(String value) { + setName(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalResourceRecord value5(String value) { + setUrl(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalResourceRecord value6(String value) { + setRemark(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalResourceRecord value7(String value) { + setIsActive(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalResourceRecord value8(String value) { + setTenant(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalResourceRecord values(String value1, String value2, String value3, String value4, String value5, String value6, String value7, String value8) { + value1(value1); + value2(value2); + value3(value3); + value4(value4); + value5(value5); + value6(value6); + value7(value7); + value8(value8); + return this; + } + + // ------------------------------------------------------------------------- + // Constructors + // ------------------------------------------------------------------------- + + /** + * Create a detached PortalResourceRecord + */ + public PortalResourceRecord() { + super(PortalResource.PORTAL_RESOURCE); + } + + /** + * Create a detached, initialised PortalResourceRecord + */ + public PortalResourceRecord(String id, String appId, String code, String name, String url, String remark, String isActive, String tenant) { + super(PortalResource.PORTAL_RESOURCE); + + setValue(0, id); + setValue(1, appId); + setValue(2, code); + setValue(3, name); + setValue(4, url); + setValue(5, remark); + setValue(6, isActive); + setValue(7, tenant); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalRoleRecord.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalRoleRecord.java new file mode 100644 index 0000000000000000000000000000000000000000..38cbcb3c1348f9c6191f17a9abfdca41e17c727a --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalRoleRecord.java @@ -0,0 +1,462 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq.tables.records; + + +import com.idcos.enterprise.jooq.tables.PortalRole; + +import java.sql.Timestamp; + +import javax.annotation.Generated; + +import org.jooq.Field; +import org.jooq.Record1; +import org.jooq.Record9; +import org.jooq.Row9; +import org.jooq.impl.UpdatableRecordImpl; + + +/** + * 角色信息表 + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class PortalRoleRecord extends UpdatableRecordImpl<PortalRoleRecord> implements Record9<String, String, String, String, String, Timestamp, Timestamp, String, String> { + + private static final long serialVersionUID = 205384238; + + /** + * Setter for <code>clouduam.PORTAL_ROLE.ID</code>. 角色ID + */ + public void setId(String value) { + setValue(0, value); + } + + /** + * Getter for <code>clouduam.PORTAL_ROLE.ID</code>. 角色ID + */ + public String getId() { + return (String) getValue(0); + } + + /** + * Setter for <code>clouduam.PORTAL_ROLE.CODE</code>. 角色编码 + */ + public void setCode(String value) { + setValue(1, value); + } + + /** + * Getter for <code>clouduam.PORTAL_ROLE.CODE</code>. 角色编码 + */ + public String getCode() { + return (String) getValue(1); + } + + /** + * Setter for <code>clouduam.PORTAL_ROLE.NAME</code>. 角色名称 + */ + public void setName(String value) { + setValue(2, value); + } + + /** + * Getter for <code>clouduam.PORTAL_ROLE.NAME</code>. 角色名称 + */ + public String getName() { + return (String) getValue(2); + } + + /** + * Setter for <code>clouduam.PORTAL_ROLE.REMARK</code>. 角色描述 + */ + public void setRemark(String value) { + setValue(3, value); + } + + /** + * Getter for <code>clouduam.PORTAL_ROLE.REMARK</code>. 角色描述 + */ + public String getRemark() { + return (String) getValue(3); + } + + /** + * Setter for <code>clouduam.PORTAL_ROLE.CREATE_USER</code>. 创建人 + */ + public void setCreateUser(String value) { + setValue(4, value); + } + + /** + * Getter for <code>clouduam.PORTAL_ROLE.CREATE_USER</code>. 创建人 + */ + public String getCreateUser() { + return (String) getValue(4); + } + + /** + * Setter for <code>clouduam.PORTAL_ROLE.GMT_CREATE</code>. 创建时间 + */ + public void setGmtCreate(Timestamp value) { + setValue(5, value); + } + + /** + * Getter for <code>clouduam.PORTAL_ROLE.GMT_CREATE</code>. 创建时间 + */ + public Timestamp getGmtCreate() { + return (Timestamp) getValue(5); + } + + /** + * Setter for <code>clouduam.PORTAL_ROLE.GMT_MODIFIED</code>. 最后修改时间 + */ + public void setGmtModified(Timestamp value) { + setValue(6, value); + } + + /** + * Getter for <code>clouduam.PORTAL_ROLE.GMT_MODIFIED</code>. 最后修改时间 + */ + public Timestamp getGmtModified() { + return (Timestamp) getValue(6); + } + + /** + * Setter for <code>clouduam.PORTAL_ROLE.IS_ACTIVE</code>. 是否有效 + */ + public void setIsActive(String value) { + setValue(7, value); + } + + /** + * Getter for <code>clouduam.PORTAL_ROLE.IS_ACTIVE</code>. 是否有效 + */ + public String getIsActive() { + return (String) getValue(7); + } + + /** + * Setter for <code>clouduam.PORTAL_ROLE.TENANT</code>. 租户code + */ + public void setTenant(String value) { + setValue(8, value); + } + + /** + * Getter for <code>clouduam.PORTAL_ROLE.TENANT</code>. 租户code + */ + public String getTenant() { + return (String) getValue(8); + } + + // ------------------------------------------------------------------------- + // Primary key information + // ------------------------------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public Record1<String> key() { + return (Record1) super.key(); + } + + // ------------------------------------------------------------------------- + // Record9 type implementation + // ------------------------------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public Row9<String, String, String, String, String, Timestamp, Timestamp, String, String> fieldsRow() { + return (Row9) super.fieldsRow(); + } + + /** + * {@inheritDoc} + */ + @Override + public Row9<String, String, String, String, String, Timestamp, Timestamp, String, String> valuesRow() { + return (Row9) super.valuesRow(); + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field1() { + return PortalRole.PORTAL_ROLE.ID; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field2() { + return PortalRole.PORTAL_ROLE.CODE; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field3() { + return PortalRole.PORTAL_ROLE.NAME; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field4() { + return PortalRole.PORTAL_ROLE.REMARK; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field5() { + return PortalRole.PORTAL_ROLE.CREATE_USER; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<Timestamp> field6() { + return PortalRole.PORTAL_ROLE.GMT_CREATE; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<Timestamp> field7() { + return PortalRole.PORTAL_ROLE.GMT_MODIFIED; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field8() { + return PortalRole.PORTAL_ROLE.IS_ACTIVE; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field9() { + return PortalRole.PORTAL_ROLE.TENANT; + } + + /** + * {@inheritDoc} + */ + @Override + public String value1() { + return getId(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value2() { + return getCode(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value3() { + return getName(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value4() { + return getRemark(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value5() { + return getCreateUser(); + } + + /** + * {@inheritDoc} + */ + @Override + public Timestamp value6() { + return getGmtCreate(); + } + + /** + * {@inheritDoc} + */ + @Override + public Timestamp value7() { + return getGmtModified(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value8() { + return getIsActive(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value9() { + return getTenant(); + } + + /** + * {@inheritDoc} + */ + @Override + public PortalRoleRecord value1(String value) { + setId(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalRoleRecord value2(String value) { + setCode(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalRoleRecord value3(String value) { + setName(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalRoleRecord value4(String value) { + setRemark(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalRoleRecord value5(String value) { + setCreateUser(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalRoleRecord value6(Timestamp value) { + setGmtCreate(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalRoleRecord value7(Timestamp value) { + setGmtModified(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalRoleRecord value8(String value) { + setIsActive(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalRoleRecord value9(String value) { + setTenant(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalRoleRecord values(String value1, String value2, String value3, String value4, String value5, Timestamp value6, Timestamp value7, String value8, String value9) { + value1(value1); + value2(value2); + value3(value3); + value4(value4); + value5(value5); + value6(value6); + value7(value7); + value8(value8); + value9(value9); + return this; + } + + // ------------------------------------------------------------------------- + // Constructors + // ------------------------------------------------------------------------- + + /** + * Create a detached PortalRoleRecord + */ + public PortalRoleRecord() { + super(PortalRole.PORTAL_ROLE); + } + + /** + * Create a detached, initialised PortalRoleRecord + */ + public PortalRoleRecord(String id, String code, String name, String remark, String createUser, Timestamp gmtCreate, Timestamp gmtModified, String isActive, String tenant) { + super(PortalRole.PORTAL_ROLE); + + setValue(0, id); + setValue(1, code); + setValue(2, name); + setValue(3, remark); + setValue(4, createUser); + setValue(5, gmtCreate); + setValue(6, gmtModified); + setValue(7, isActive); + setValue(8, tenant); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalSysDictRecord.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalSysDictRecord.java new file mode 100644 index 0000000000000000000000000000000000000000..c544955f84b4110fdb5e33e71ac7e8c20ab649ab --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalSysDictRecord.java @@ -0,0 +1,296 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq.tables.records; + + +import com.idcos.enterprise.jooq.tables.PortalSysDict; + +import javax.annotation.Generated; + +import org.jooq.Field; +import org.jooq.Record3; +import org.jooq.Record5; +import org.jooq.Row5; +import org.jooq.impl.UpdatableRecordImpl; + + +/** + * uam系统参数表 + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class PortalSysDictRecord extends UpdatableRecordImpl<PortalSysDictRecord> implements Record5<String, String, String, String, String> { + + private static final long serialVersionUID = -647030708; + + /** + * Setter for <code>clouduam.PORTAL_SYS_DICT.TYPE_CODE</code>. 系统字典类型编码 + */ + public void setTypeCode(String value) { + setValue(0, value); + } + + /** + * Getter for <code>clouduam.PORTAL_SYS_DICT.TYPE_CODE</code>. 系统字典类型编码 + */ + public String getTypeCode() { + return (String) getValue(0); + } + + /** + * Setter for <code>clouduam.PORTAL_SYS_DICT.CODE</code>. 系统字典编码 + */ + public void setCode(String value) { + setValue(1, value); + } + + /** + * Getter for <code>clouduam.PORTAL_SYS_DICT.CODE</code>. 系统字典编码 + */ + public String getCode() { + return (String) getValue(1); + } + + /** + * Setter for <code>clouduam.PORTAL_SYS_DICT.VALUE</code>. 参数值 + */ + public void setValue(String value) { + setValue(2, value); + } + + /** + * Getter for <code>clouduam.PORTAL_SYS_DICT.VALUE</code>. 参数值 + */ + public String getValue() { + return (String) getValue(2); + } + + /** + * Setter for <code>clouduam.PORTAL_SYS_DICT.TENANT_ID</code>. 租户code + */ + public void setTenantId(String value) { + setValue(3, value); + } + + /** + * Getter for <code>clouduam.PORTAL_SYS_DICT.TENANT_ID</code>. 租户code + */ + public String getTenantId() { + return (String) getValue(3); + } + + /** + * Setter for <code>clouduam.PORTAL_SYS_DICT.REMARK</code>. 说明 + */ + public void setRemark(String value) { + setValue(4, value); + } + + /** + * Getter for <code>clouduam.PORTAL_SYS_DICT.REMARK</code>. 说明 + */ + public String getRemark() { + return (String) getValue(4); + } + + // ------------------------------------------------------------------------- + // Primary key information + // ------------------------------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public Record3<String, String, String> key() { + return (Record3) super.key(); + } + + // ------------------------------------------------------------------------- + // Record5 type implementation + // ------------------------------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public Row5<String, String, String, String, String> fieldsRow() { + return (Row5) super.fieldsRow(); + } + + /** + * {@inheritDoc} + */ + @Override + public Row5<String, String, String, String, String> valuesRow() { + return (Row5) super.valuesRow(); + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field1() { + return PortalSysDict.PORTAL_SYS_DICT.TYPE_CODE; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field2() { + return PortalSysDict.PORTAL_SYS_DICT.CODE; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field3() { + return PortalSysDict.PORTAL_SYS_DICT.VALUE; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field4() { + return PortalSysDict.PORTAL_SYS_DICT.TENANT_ID; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field5() { + return PortalSysDict.PORTAL_SYS_DICT.REMARK; + } + + /** + * {@inheritDoc} + */ + @Override + public String value1() { + return getTypeCode(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value2() { + return getCode(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value3() { + return getValue(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value4() { + return getTenantId(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value5() { + return getRemark(); + } + + /** + * {@inheritDoc} + */ + @Override + public PortalSysDictRecord value1(String value) { + setTypeCode(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalSysDictRecord value2(String value) { + setCode(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalSysDictRecord value3(String value) { + setValue(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalSysDictRecord value4(String value) { + setTenantId(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalSysDictRecord value5(String value) { + setRemark(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalSysDictRecord values(String value1, String value2, String value3, String value4, String value5) { + value1(value1); + value2(value2); + value3(value3); + value4(value4); + value5(value5); + return this; + } + + // ------------------------------------------------------------------------- + // Constructors + // ------------------------------------------------------------------------- + + /** + * Create a detached PortalSysDictRecord + */ + public PortalSysDictRecord() { + super(PortalSysDict.PORTAL_SYS_DICT); + } + + /** + * Create a detached, initialised PortalSysDictRecord + */ + public PortalSysDictRecord(String typeCode, String code, String value, String tenantId, String remark) { + super(PortalSysDict.PORTAL_SYS_DICT); + + setValue(0, typeCode); + setValue(1, code); + setValue(2, value); + setValue(3, tenantId); + setValue(4, remark); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalTenantRecord.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalTenantRecord.java new file mode 100644 index 0000000000000000000000000000000000000000..7ac851c69237850dfe8282b3a8a4fc22ed873971 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalTenantRecord.java @@ -0,0 +1,339 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq.tables.records; + + +import com.idcos.enterprise.jooq.tables.PortalTenant; + +import java.sql.Timestamp; + +import javax.annotation.Generated; + +import org.jooq.Field; +import org.jooq.Record1; +import org.jooq.Record6; +import org.jooq.Row6; +import org.jooq.impl.UpdatableRecordImpl; + + +/** + * 租户信息表 + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class PortalTenantRecord extends UpdatableRecordImpl<PortalTenantRecord> implements Record6<String, String, String, Timestamp, Timestamp, String> { + + private static final long serialVersionUID = -1223984903; + + /** + * Setter for <code>clouduam.PORTAL_TENANT.ID</code>. + */ + public void setId(String value) { + setValue(0, value); + } + + /** + * Getter for <code>clouduam.PORTAL_TENANT.ID</code>. + */ + public String getId() { + return (String) getValue(0); + } + + /** + * Setter for <code>clouduam.PORTAL_TENANT.NAME</code>. 租户编码 + */ + public void setName(String value) { + setValue(1, value); + } + + /** + * Getter for <code>clouduam.PORTAL_TENANT.NAME</code>. 租户编码 + */ + public String getName() { + return (String) getValue(1); + } + + /** + * Setter for <code>clouduam.PORTAL_TENANT.DISPLAY_NAME</code>. 租户名称 + */ + public void setDisplayName(String value) { + setValue(2, value); + } + + /** + * Getter for <code>clouduam.PORTAL_TENANT.DISPLAY_NAME</code>. 租户名称 + */ + public String getDisplayName() { + return (String) getValue(2); + } + + /** + * Setter for <code>clouduam.PORTAL_TENANT.GMT_CREATE</code>. 创建日期 + */ + public void setGmtCreate(Timestamp value) { + setValue(3, value); + } + + /** + * Getter for <code>clouduam.PORTAL_TENANT.GMT_CREATE</code>. 创建日期 + */ + public Timestamp getGmtCreate() { + return (Timestamp) getValue(3); + } + + /** + * Setter for <code>clouduam.PORTAL_TENANT.GMT_MODIFIED</code>. 修改日期 + */ + public void setGmtModified(Timestamp value) { + setValue(4, value); + } + + /** + * Getter for <code>clouduam.PORTAL_TENANT.GMT_MODIFIED</code>. 修改日期 + */ + public Timestamp getGmtModified() { + return (Timestamp) getValue(4); + } + + /** + * Setter for <code>clouduam.PORTAL_TENANT.IS_ACTIVE</code>. 是否可用 + */ + public void setIsActive(String value) { + setValue(5, value); + } + + /** + * Getter for <code>clouduam.PORTAL_TENANT.IS_ACTIVE</code>. 是否可用 + */ + public String getIsActive() { + return (String) getValue(5); + } + + // ------------------------------------------------------------------------- + // Primary key information + // ------------------------------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public Record1<String> key() { + return (Record1) super.key(); + } + + // ------------------------------------------------------------------------- + // Record6 type implementation + // ------------------------------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public Row6<String, String, String, Timestamp, Timestamp, String> fieldsRow() { + return (Row6) super.fieldsRow(); + } + + /** + * {@inheritDoc} + */ + @Override + public Row6<String, String, String, Timestamp, Timestamp, String> valuesRow() { + return (Row6) super.valuesRow(); + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field1() { + return PortalTenant.PORTAL_TENANT.ID; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field2() { + return PortalTenant.PORTAL_TENANT.NAME; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field3() { + return PortalTenant.PORTAL_TENANT.DISPLAY_NAME; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<Timestamp> field4() { + return PortalTenant.PORTAL_TENANT.GMT_CREATE; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<Timestamp> field5() { + return PortalTenant.PORTAL_TENANT.GMT_MODIFIED; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field6() { + return PortalTenant.PORTAL_TENANT.IS_ACTIVE; + } + + /** + * {@inheritDoc} + */ + @Override + public String value1() { + return getId(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value2() { + return getName(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value3() { + return getDisplayName(); + } + + /** + * {@inheritDoc} + */ + @Override + public Timestamp value4() { + return getGmtCreate(); + } + + /** + * {@inheritDoc} + */ + @Override + public Timestamp value5() { + return getGmtModified(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value6() { + return getIsActive(); + } + + /** + * {@inheritDoc} + */ + @Override + public PortalTenantRecord value1(String value) { + setId(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalTenantRecord value2(String value) { + setName(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalTenantRecord value3(String value) { + setDisplayName(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalTenantRecord value4(Timestamp value) { + setGmtCreate(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalTenantRecord value5(Timestamp value) { + setGmtModified(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalTenantRecord value6(String value) { + setIsActive(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalTenantRecord values(String value1, String value2, String value3, Timestamp value4, Timestamp value5, String value6) { + value1(value1); + value2(value2); + value3(value3); + value4(value4); + value5(value5); + value6(value6); + return this; + } + + // ------------------------------------------------------------------------- + // Constructors + // ------------------------------------------------------------------------- + + /** + * Create a detached PortalTenantRecord + */ + public PortalTenantRecord() { + super(PortalTenant.PORTAL_TENANT); + } + + /** + * Create a detached, initialised PortalTenantRecord + */ + public PortalTenantRecord(String id, String name, String displayName, Timestamp gmtCreate, Timestamp gmtModified, String isActive) { + super(PortalTenant.PORTAL_TENANT); + + setValue(0, id); + setValue(1, name); + setValue(2, displayName); + setValue(3, gmtCreate); + setValue(4, gmtModified); + setValue(5, isActive); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalTokenRecord.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalTokenRecord.java new file mode 100644 index 0000000000000000000000000000000000000000..84275018a7450e651e574f0a1c1102dac14717fa --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalTokenRecord.java @@ -0,0 +1,504 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq.tables.records; + + +import com.idcos.enterprise.jooq.tables.PortalToken; + +import java.sql.Timestamp; + +import javax.annotation.Generated; + +import org.jooq.Field; +import org.jooq.Record1; +import org.jooq.Record10; +import org.jooq.Row10; +import org.jooq.impl.UpdatableRecordImpl; +import org.jooq.types.UInteger; + + +/** + * token信息表 + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class PortalTokenRecord extends UpdatableRecordImpl<PortalTokenRecord> implements Record10<String, String, UInteger, String, String, String, Timestamp, Timestamp, Timestamp, String> { + + private static final long serialVersionUID = 1273843376; + + /** + * Setter for <code>clouduam.PORTAL_TOKEN.ID</code>. + */ + public void setId(String value) { + setValue(0, value); + } + + /** + * Getter for <code>clouduam.PORTAL_TOKEN.ID</code>. + */ + public String getId() { + return (String) getValue(0); + } + + /** + * Setter for <code>clouduam.PORTAL_TOKEN.NAME</code>. token值 + */ + public void setName(String value) { + setValue(1, value); + } + + /** + * Getter for <code>clouduam.PORTAL_TOKEN.NAME</code>. token值 + */ + public String getName() { + return (String) getValue(1); + } + + /** + * Setter for <code>clouduam.PORTAL_TOKEN.TOKEN_CRC</code>. token串的crc哈希值 + */ + public void setTokenCrc(UInteger value) { + setValue(2, value); + } + + /** + * Getter for <code>clouduam.PORTAL_TOKEN.TOKEN_CRC</code>. token串的crc哈希值 + */ + public UInteger getTokenCrc() { + return (UInteger) getValue(2); + } + + /** + * Setter for <code>clouduam.PORTAL_TOKEN.LOGIN_ID</code>. 登录名 + */ + public void setLoginId(String value) { + setValue(3, value); + } + + /** + * Getter for <code>clouduam.PORTAL_TOKEN.LOGIN_ID</code>. 登录名 + */ + public String getLoginId() { + return (String) getValue(3); + } + + /** + * Setter for <code>clouduam.PORTAL_TOKEN.TENANT_ID</code>. 租户code + */ + public void setTenantId(String value) { + setValue(4, value); + } + + /** + * Getter for <code>clouduam.PORTAL_TOKEN.TENANT_ID</code>. 租户code + */ + public String getTenantId() { + return (String) getValue(4); + } + + /** + * Setter for <code>clouduam.PORTAL_TOKEN.IS_ACTIVE</code>. 是否可用 + */ + public void setIsActive(String value) { + setValue(5, value); + } + + /** + * Getter for <code>clouduam.PORTAL_TOKEN.IS_ACTIVE</code>. 是否可用 + */ + public String getIsActive() { + return (String) getValue(5); + } + + /** + * Setter for <code>clouduam.PORTAL_TOKEN.EXPIRE_TIME</code>. token过期时间 + */ + public void setExpireTime(Timestamp value) { + setValue(6, value); + } + + /** + * Getter for <code>clouduam.PORTAL_TOKEN.EXPIRE_TIME</code>. token过期时间 + */ + public Timestamp getExpireTime() { + return (Timestamp) getValue(6); + } + + /** + * Setter for <code>clouduam.PORTAL_TOKEN.GMT_CREATE</code>. 创建日期 + */ + public void setGmtCreate(Timestamp value) { + setValue(7, value); + } + + /** + * Getter for <code>clouduam.PORTAL_TOKEN.GMT_CREATE</code>. 创建日期 + */ + public Timestamp getGmtCreate() { + return (Timestamp) getValue(7); + } + + /** + * Setter for <code>clouduam.PORTAL_TOKEN.GMT_MODIFIED</code>. 修改日期 + */ + public void setGmtModified(Timestamp value) { + setValue(8, value); + } + + /** + * Getter for <code>clouduam.PORTAL_TOKEN.GMT_MODIFIED</code>. 修改日期 + */ + public Timestamp getGmtModified() { + return (Timestamp) getValue(8); + } + + /** + * Setter for <code>clouduam.PORTAL_TOKEN.REMARK</code>. 备注 + */ + public void setRemark(String value) { + setValue(9, value); + } + + /** + * Getter for <code>clouduam.PORTAL_TOKEN.REMARK</code>. 备注 + */ + public String getRemark() { + return (String) getValue(9); + } + + // ------------------------------------------------------------------------- + // Primary key information + // ------------------------------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public Record1<String> key() { + return (Record1) super.key(); + } + + // ------------------------------------------------------------------------- + // Record10 type implementation + // ------------------------------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public Row10<String, String, UInteger, String, String, String, Timestamp, Timestamp, Timestamp, String> fieldsRow() { + return (Row10) super.fieldsRow(); + } + + /** + * {@inheritDoc} + */ + @Override + public Row10<String, String, UInteger, String, String, String, Timestamp, Timestamp, Timestamp, String> valuesRow() { + return (Row10) super.valuesRow(); + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field1() { + return PortalToken.PORTAL_TOKEN.ID; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field2() { + return PortalToken.PORTAL_TOKEN.NAME; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<UInteger> field3() { + return PortalToken.PORTAL_TOKEN.TOKEN_CRC; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field4() { + return PortalToken.PORTAL_TOKEN.LOGIN_ID; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field5() { + return PortalToken.PORTAL_TOKEN.TENANT_ID; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field6() { + return PortalToken.PORTAL_TOKEN.IS_ACTIVE; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<Timestamp> field7() { + return PortalToken.PORTAL_TOKEN.EXPIRE_TIME; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<Timestamp> field8() { + return PortalToken.PORTAL_TOKEN.GMT_CREATE; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<Timestamp> field9() { + return PortalToken.PORTAL_TOKEN.GMT_MODIFIED; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field10() { + return PortalToken.PORTAL_TOKEN.REMARK; + } + + /** + * {@inheritDoc} + */ + @Override + public String value1() { + return getId(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value2() { + return getName(); + } + + /** + * {@inheritDoc} + */ + @Override + public UInteger value3() { + return getTokenCrc(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value4() { + return getLoginId(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value5() { + return getTenantId(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value6() { + return getIsActive(); + } + + /** + * {@inheritDoc} + */ + @Override + public Timestamp value7() { + return getExpireTime(); + } + + /** + * {@inheritDoc} + */ + @Override + public Timestamp value8() { + return getGmtCreate(); + } + + /** + * {@inheritDoc} + */ + @Override + public Timestamp value9() { + return getGmtModified(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value10() { + return getRemark(); + } + + /** + * {@inheritDoc} + */ + @Override + public PortalTokenRecord value1(String value) { + setId(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalTokenRecord value2(String value) { + setName(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalTokenRecord value3(UInteger value) { + setTokenCrc(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalTokenRecord value4(String value) { + setLoginId(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalTokenRecord value5(String value) { + setTenantId(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalTokenRecord value6(String value) { + setIsActive(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalTokenRecord value7(Timestamp value) { + setExpireTime(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalTokenRecord value8(Timestamp value) { + setGmtCreate(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalTokenRecord value9(Timestamp value) { + setGmtModified(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalTokenRecord value10(String value) { + setRemark(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalTokenRecord values(String value1, String value2, UInteger value3, String value4, String value5, String value6, Timestamp value7, Timestamp value8, Timestamp value9, String value10) { + value1(value1); + value2(value2); + value3(value3); + value4(value4); + value5(value5); + value6(value6); + value7(value7); + value8(value8); + value9(value9); + value10(value10); + return this; + } + + // ------------------------------------------------------------------------- + // Constructors + // ------------------------------------------------------------------------- + + /** + * Create a detached PortalTokenRecord + */ + public PortalTokenRecord() { + super(PortalToken.PORTAL_TOKEN); + } + + /** + * Create a detached, initialised PortalTokenRecord + */ + public PortalTokenRecord(String id, String name, UInteger tokenCrc, String loginId, String tenantId, String isActive, Timestamp expireTime, Timestamp gmtCreate, Timestamp gmtModified, String remark) { + super(PortalToken.PORTAL_TOKEN); + + setValue(0, id); + setValue(1, name); + setValue(2, tokenCrc); + setValue(3, loginId); + setValue(4, tenantId); + setValue(5, isActive); + setValue(6, expireTime); + setValue(7, gmtCreate); + setValue(8, gmtModified); + setValue(9, remark); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalUserGroupRecord.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalUserGroupRecord.java new file mode 100644 index 0000000000000000000000000000000000000000..c3f7dffdaad39502be065a04fc59c5ac16e39633 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalUserGroupRecord.java @@ -0,0 +1,462 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq.tables.records; + + +import com.idcos.enterprise.jooq.tables.PortalUserGroup; + +import java.sql.Timestamp; + +import javax.annotation.Generated; + +import org.jooq.Field; +import org.jooq.Record1; +import org.jooq.Record9; +import org.jooq.Row9; +import org.jooq.impl.UpdatableRecordImpl; + + +/** + * 用户组信息表 + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class PortalUserGroupRecord extends UpdatableRecordImpl<PortalUserGroupRecord> implements Record9<String, String, String, String, String, Timestamp, Timestamp, String, String> { + + private static final long serialVersionUID = 195252397; + + /** + * Setter for <code>clouduam.PORTAL_USER_GROUP.ID</code>. 用户组ID + */ + public void setId(String value) { + setValue(0, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER_GROUP.ID</code>. 用户组ID + */ + public String getId() { + return (String) getValue(0); + } + + /** + * Setter for <code>clouduam.PORTAL_USER_GROUP.NAME</code>. 用户组名称 + */ + public void setName(String value) { + setValue(1, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER_GROUP.NAME</code>. 用户组名称 + */ + public String getName() { + return (String) getValue(1); + } + + /** + * Setter for <code>clouduam.PORTAL_USER_GROUP.TYPE</code>. 用户组类型 + */ + public void setType(String value) { + setValue(2, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER_GROUP.TYPE</code>. 用户组类型 + */ + public String getType() { + return (String) getValue(2); + } + + /** + * Setter for <code>clouduam.PORTAL_USER_GROUP.REMARK</code>. 备注 + */ + public void setRemark(String value) { + setValue(3, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER_GROUP.REMARK</code>. 备注 + */ + public String getRemark() { + return (String) getValue(3); + } + + /** + * Setter for <code>clouduam.PORTAL_USER_GROUP.CREATE_USER</code>. 创建人 + */ + public void setCreateUser(String value) { + setValue(4, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER_GROUP.CREATE_USER</code>. 创建人 + */ + public String getCreateUser() { + return (String) getValue(4); + } + + /** + * Setter for <code>clouduam.PORTAL_USER_GROUP.GMT_CREATE</code>. 创建时间 + */ + public void setGmtCreate(Timestamp value) { + setValue(5, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER_GROUP.GMT_CREATE</code>. 创建时间 + */ + public Timestamp getGmtCreate() { + return (Timestamp) getValue(5); + } + + /** + * Setter for <code>clouduam.PORTAL_USER_GROUP.GMT_MODIFIED</code>. 最后修改时间 + */ + public void setGmtModified(Timestamp value) { + setValue(6, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER_GROUP.GMT_MODIFIED</code>. 最后修改时间 + */ + public Timestamp getGmtModified() { + return (Timestamp) getValue(6); + } + + /** + * Setter for <code>clouduam.PORTAL_USER_GROUP.IS_ACTIVE</code>. 是否有效 + */ + public void setIsActive(String value) { + setValue(7, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER_GROUP.IS_ACTIVE</code>. 是否有效 + */ + public String getIsActive() { + return (String) getValue(7); + } + + /** + * Setter for <code>clouduam.PORTAL_USER_GROUP.TENANT</code>. 租户code + */ + public void setTenant(String value) { + setValue(8, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER_GROUP.TENANT</code>. 租户code + */ + public String getTenant() { + return (String) getValue(8); + } + + // ------------------------------------------------------------------------- + // Primary key information + // ------------------------------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public Record1<String> key() { + return (Record1) super.key(); + } + + // ------------------------------------------------------------------------- + // Record9 type implementation + // ------------------------------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public Row9<String, String, String, String, String, Timestamp, Timestamp, String, String> fieldsRow() { + return (Row9) super.fieldsRow(); + } + + /** + * {@inheritDoc} + */ + @Override + public Row9<String, String, String, String, String, Timestamp, Timestamp, String, String> valuesRow() { + return (Row9) super.valuesRow(); + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field1() { + return PortalUserGroup.PORTAL_USER_GROUP.ID; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field2() { + return PortalUserGroup.PORTAL_USER_GROUP.NAME; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field3() { + return PortalUserGroup.PORTAL_USER_GROUP.TYPE; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field4() { + return PortalUserGroup.PORTAL_USER_GROUP.REMARK; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field5() { + return PortalUserGroup.PORTAL_USER_GROUP.CREATE_USER; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<Timestamp> field6() { + return PortalUserGroup.PORTAL_USER_GROUP.GMT_CREATE; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<Timestamp> field7() { + return PortalUserGroup.PORTAL_USER_GROUP.GMT_MODIFIED; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field8() { + return PortalUserGroup.PORTAL_USER_GROUP.IS_ACTIVE; + } + + /** + * {@inheritDoc} + */ + @Override + public Field<String> field9() { + return PortalUserGroup.PORTAL_USER_GROUP.TENANT; + } + + /** + * {@inheritDoc} + */ + @Override + public String value1() { + return getId(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value2() { + return getName(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value3() { + return getType(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value4() { + return getRemark(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value5() { + return getCreateUser(); + } + + /** + * {@inheritDoc} + */ + @Override + public Timestamp value6() { + return getGmtCreate(); + } + + /** + * {@inheritDoc} + */ + @Override + public Timestamp value7() { + return getGmtModified(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value8() { + return getIsActive(); + } + + /** + * {@inheritDoc} + */ + @Override + public String value9() { + return getTenant(); + } + + /** + * {@inheritDoc} + */ + @Override + public PortalUserGroupRecord value1(String value) { + setId(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalUserGroupRecord value2(String value) { + setName(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalUserGroupRecord value3(String value) { + setType(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalUserGroupRecord value4(String value) { + setRemark(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalUserGroupRecord value5(String value) { + setCreateUser(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalUserGroupRecord value6(Timestamp value) { + setGmtCreate(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalUserGroupRecord value7(Timestamp value) { + setGmtModified(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalUserGroupRecord value8(String value) { + setIsActive(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalUserGroupRecord value9(String value) { + setTenant(value); + return this; + } + + /** + * {@inheritDoc} + */ + @Override + public PortalUserGroupRecord values(String value1, String value2, String value3, String value4, String value5, Timestamp value6, Timestamp value7, String value8, String value9) { + value1(value1); + value2(value2); + value3(value3); + value4(value4); + value5(value5); + value6(value6); + value7(value7); + value8(value8); + value9(value9); + return this; + } + + // ------------------------------------------------------------------------- + // Constructors + // ------------------------------------------------------------------------- + + /** + * Create a detached PortalUserGroupRecord + */ + public PortalUserGroupRecord() { + super(PortalUserGroup.PORTAL_USER_GROUP); + } + + /** + * Create a detached, initialised PortalUserGroupRecord + */ + public PortalUserGroupRecord(String id, String name, String type, String remark, String createUser, Timestamp gmtCreate, Timestamp gmtModified, String isActive, String tenant) { + super(PortalUserGroup.PORTAL_USER_GROUP); + + setValue(0, id); + setValue(1, name); + setValue(2, type); + setValue(3, remark); + setValue(4, createUser); + setValue(5, gmtCreate); + setValue(6, gmtModified); + setValue(7, isActive); + setValue(8, tenant); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalUserRecord.java b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalUserRecord.java new file mode 100644 index 0000000000000000000000000000000000000000..a5f913e30a576b128c8d17b2402c1e9397e4bf8b --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/jooq/tables/records/PortalUserRecord.java @@ -0,0 +1,422 @@ +/** + * This class is generated by jOOQ + */ +package com.idcos.enterprise.jooq.tables.records; + + +import com.idcos.enterprise.jooq.tables.PortalUser; + +import java.sql.Timestamp; + +import javax.annotation.Generated; + +import org.jooq.Record1; +import org.jooq.impl.UpdatableRecordImpl; + + +/** + * 用户信息表 + */ +@Generated( + value = { + "http://www.jooq.org", + "jOOQ version:3.7.2" + }, + comments = "This class is generated by jOOQ" +) +@SuppressWarnings({ "all", "unchecked", "rawtypes" }) +public class PortalUserRecord extends UpdatableRecordImpl<PortalUserRecord> { + + private static final long serialVersionUID = -666963976; + + /** + * Setter for <code>clouduam.PORTAL_USER.ID</code>. 用户ID + */ + public void setId(String value) { + setValue(0, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER.ID</code>. 用户ID + */ + public String getId() { + return (String) getValue(0); + } + + /** + * Setter for <code>clouduam.PORTAL_USER.NAME</code>. + */ + public void setName(String value) { + setValue(1, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER.NAME</code>. + */ + public String getName() { + return (String) getValue(1); + } + + /** + * Setter for <code>clouduam.PORTAL_USER.LOGIN_ID</code>. 登录名 + */ + public void setLoginId(String value) { + setValue(2, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER.LOGIN_ID</code>. 登录名 + */ + public String getLoginId() { + return (String) getValue(2); + } + + /** + * Setter for <code>clouduam.PORTAL_USER.DEPT_ID</code>. 部门id + */ + public void setDeptId(String value) { + setValue(3, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER.DEPT_ID</code>. 部门id + */ + public String getDeptId() { + return (String) getValue(3); + } + + /** + * Setter for <code>clouduam.PORTAL_USER.TITLE</code>. 标签 + */ + public void setTitle(String value) { + setValue(4, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER.TITLE</code>. 标签 + */ + public String getTitle() { + return (String) getValue(4); + } + + /** + * Setter for <code>clouduam.PORTAL_USER.MOBILE1</code>. + */ + public void setMobile1(String value) { + setValue(5, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER.MOBILE1</code>. + */ + public String getMobile1() { + return (String) getValue(5); + } + + /** + * Setter for <code>clouduam.PORTAL_USER.WEIXIN</code>. 标签 + */ + public void setWeixin(String value) { + setValue(6, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER.WEIXIN</code>. 标签 + */ + public String getWeixin() { + return (String) getValue(6); + } + + /** + * Setter for <code>clouduam.PORTAL_USER.EMAIL</code>. 邮箱 + */ + public void setEmail(String value) { + setValue(7, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER.EMAIL</code>. 邮箱 + */ + public String getEmail() { + return (String) getValue(7); + } + + /** + * Setter for <code>clouduam.PORTAL_USER.IS_ACTIVE</code>. 是否有效 + */ + public void setIsActive(String value) { + setValue(8, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER.IS_ACTIVE</code>. 是否有效 + */ + public String getIsActive() { + return (String) getValue(8); + } + + /** + * Setter for <code>clouduam.PORTAL_USER.STATUS</code>. 用户类型:INIT、ENABLED、DISABLED、LOCKED + */ + public void setStatus(String value) { + setValue(9, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER.STATUS</code>. 用户类型:INIT、ENABLED、DISABLED、LOCKED + */ + public String getStatus() { + return (String) getValue(9); + } + + /** + * Setter for <code>clouduam.PORTAL_USER.REMARK</code>. 备注 + */ + public void setRemark(String value) { + setValue(10, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER.REMARK</code>. 备注 + */ + public String getRemark() { + return (String) getValue(10); + } + + /** + * Setter for <code>clouduam.PORTAL_USER.TENANT_ID</code>. 租户编码 + */ + public void setTenantId(String value) { + setValue(11, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER.TENANT_ID</code>. 租户编码 + */ + public String getTenantId() { + return (String) getValue(11); + } + + /** + * Setter for <code>clouduam.PORTAL_USER.SOURCE_TYPE</code>. 数据同步来源来源,默认值native表示本系统,如果来自第三方,则需重新定义该值 + */ + public void setSourceType(String value) { + setValue(12, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER.SOURCE_TYPE</code>. 数据同步来源来源,默认值native表示本系统,如果来自第三方,则需重新定义该值 + */ + public String getSourceType() { + return (String) getValue(12); + } + + /** + * Setter for <code>clouduam.PORTAL_USER.LAST_MODIFIED_TIME</code>. 最后登录时间 + */ + public void setLastModifiedTime(Timestamp value) { + setValue(13, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER.LAST_MODIFIED_TIME</code>. 最后登录时间 + */ + public Timestamp getLastModifiedTime() { + return (Timestamp) getValue(13); + } + + /** + * Setter for <code>clouduam.PORTAL_USER.CREATE_TIME</code>. 创建时间 + */ + public void setCreateTime(Timestamp value) { + setValue(14, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER.CREATE_TIME</code>. 创建时间 + */ + public Timestamp getCreateTime() { + return (Timestamp) getValue(14); + } + + /** + * Setter for <code>clouduam.PORTAL_USER.LAST_LOGIN_TIME</code>. 最后修改时间 + */ + public void setLastLoginTime(Timestamp value) { + setValue(15, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER.LAST_LOGIN_TIME</code>. 最后修改时间 + */ + public Timestamp getLastLoginTime() { + return (Timestamp) getValue(15); + } + + /** + * Setter for <code>clouduam.PORTAL_USER.PASSWORD</code>. 密码 + */ + public void setPassword(String value) { + setValue(16, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER.PASSWORD</code>. 密码 + */ + public String getPassword() { + return (String) getValue(16); + } + + /** + * Setter for <code>clouduam.PORTAL_USER.SALT</code>. 密码盐 + */ + public void setSalt(String value) { + setValue(17, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER.SALT</code>. 密码盐 + */ + public String getSalt() { + return (String) getValue(17); + } + + /** + * Setter for <code>clouduam.PORTAL_USER.MOBILE2</code>. + */ + public void setMobile2(String value) { + setValue(18, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER.MOBILE2</code>. + */ + public String getMobile2() { + return (String) getValue(18); + } + + /** + * Setter for <code>clouduam.PORTAL_USER.RTX</code>. RTX沟通工具 + */ + public void setRtx(String value) { + setValue(19, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER.RTX</code>. RTX沟通工具 + */ + public String getRtx() { + return (String) getValue(19); + } + + /** + * Setter for <code>clouduam.PORTAL_USER.OFFICE_TEL1</code>. + */ + public void setOfficeTel1(String value) { + setValue(20, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER.OFFICE_TEL1</code>. + */ + public String getOfficeTel1() { + return (String) getValue(20); + } + + /** + * Setter for <code>clouduam.PORTAL_USER.OFFICE_TEL2</code>. + */ + public void setOfficeTel2(String value) { + setValue(21, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER.OFFICE_TEL2</code>. + */ + public String getOfficeTel2() { + return (String) getValue(21); + } + + /** + * Setter for <code>clouduam.PORTAL_USER.EMPLOYEE_TYPE</code>. + */ + public void setEmployeeType(String value) { + setValue(22, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER.EMPLOYEE_TYPE</code>. + */ + public String getEmployeeType() { + return (String) getValue(22); + } + + /** + * Setter for <code>clouduam.PORTAL_USER.CREATE_USER</code>. 创建人 + */ + public void setCreateUser(String value) { + setValue(23, value); + } + + /** + * Getter for <code>clouduam.PORTAL_USER.CREATE_USER</code>. 创建人 + */ + public String getCreateUser() { + return (String) getValue(23); + } + + // ------------------------------------------------------------------------- + // Primary key information + // ------------------------------------------------------------------------- + + /** + * {@inheritDoc} + */ + @Override + public Record1<String> key() { + return (Record1) super.key(); + } + + // ------------------------------------------------------------------------- + // Constructors + // ------------------------------------------------------------------------- + + /** + * Create a detached PortalUserRecord + */ + public PortalUserRecord() { + super(PortalUser.PORTAL_USER); + } + + /** + * Create a detached, initialised PortalUserRecord + */ + public PortalUserRecord(String id, String name, String loginId, String deptId, String title, String mobile1, String weixin, String email, String isActive, String status, String remark, String tenantId, String sourceType, Timestamp lastModifiedTime, Timestamp createTime, Timestamp lastLoginTime, String password, String salt, String mobile2, String rtx, String officeTel1, String officeTel2, String employeeType, String createUser) { + super(PortalUser.PORTAL_USER); + + setValue(0, id); + setValue(1, name); + setValue(2, loginId); + setValue(3, deptId); + setValue(4, title); + setValue(5, mobile1); + setValue(6, weixin); + setValue(7, email); + setValue(8, isActive); + setValue(9, status); + setValue(10, remark); + setValue(11, tenantId); + setValue(12, sourceType); + setValue(13, lastModifiedTime); + setValue(14, createTime); + setValue(15, lastLoginTime); + setValue(16, password); + setValue(17, salt); + setValue(18, mobile2); + setValue(19, rtx); + setValue(20, officeTel1); + setValue(21, officeTel2); + setValue(22, employeeType); + setValue(23, createUser); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/UamConstant.java b/uam-server/src/main/java/com/idcos/enterprise/portal/UamConstant.java new file mode 100644 index 0000000000000000000000000000000000000000..b43c1e746106a7f25d6929274c14f0018ecb5338 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/UamConstant.java @@ -0,0 +1,34 @@ +package com.idcos.enterprise.portal; + +/** + * Uam常用的常量 + * + * @author Xizhao.Dai + * @version UamConstant.java, v1 2018/9/3 上午9:32 Xizhao.Dai Exp $$ + */ +public interface UamConstant { + /** + * 问号 + */ + String INTERROGATION = "?"; + + /** + * 星号 + */ + String STAR = "*"; + + /** + * 斜线 + */ + String SLASH = "/"; + + /** + * admin用户 + */ + String ADMIN = "admin"; + + /** + * userId + */ + String USER_ID = "userId"; +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/AuthInfoException.java b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/AuthInfoException.java new file mode 100644 index 0000000000000000000000000000000000000000..0696cc2b32b78dc79493df6b676b591b2a50f33a --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/AuthInfoException.java @@ -0,0 +1,114 @@ +package com.idcos.enterprise.portal.biz.common; + +import com.idcos.common.biz.BizCoreException; +import org.springframework.util.Assert; + +/** + * @author Xizhao.Dai + * @version CommonBizException2.java, v1 2018/5/28 下午9:12 Xizhao.Dai Exp $$ + */ +public class AuthInfoException extends BizCoreException { + + /** + * serialVersionUID + */ + private static final long serialVersionUID = 1382559230799468711L; + + /** + * 结果码处理 + */ + private ResultCode resultCode; + + /** + * 异常描述对象,可以返回到json前台的信息 + */ + private Object exceptionDescription; + + /** + * 构造函数 + * + * @param resultCode + * @param message + */ + public AuthInfoException(ResultCode resultCode, String message) { + + super(message); + + Assert.notNull(resultCode, message); + + this.resultCode = resultCode; + } + + /** + * 构造函数 + * + * @param resultCode + * @param resultCode + */ + public AuthInfoException(ResultCode resultCode) { + + super(resultCode.getDescription()); + + Assert.notNull(resultCode, resultCode.getDescription()); + + this.resultCode = resultCode; + } + + /** + * @param message + */ + public AuthInfoException(String message) { + + super(message); + + this.resultCode = ResultCode.UNKNOWN_EXCEPTION; + } + + /** + * @param message + */ + public AuthInfoException(String message, Object exceptionDescription) { + + super(message); + + this.resultCode = ResultCode.UNKNOWN_EXCEPTION; + + this.exceptionDescription = exceptionDescription; + } + + /** + * @param resultCode + * @param message + * @param e + */ + public AuthInfoException(ResultCode resultCode, String message, Throwable e) { + + super(message, e); + + if (resultCode == null) { + this.resultCode = ResultCode.UNKNOWN_EXCEPTION; + } else { + this.resultCode = resultCode; + } + } + + /** + * @param message + * @param e + */ + public AuthInfoException(String message, Throwable e) { + + super(message, e); + + this.resultCode = ResultCode.UNKNOWN_EXCEPTION; + + } + + public ResultCode getResultCode() { + return resultCode; + } + + public Object getExceptionDescription() { + return exceptionDescription; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/CommonBizException.java b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/CommonBizException.java new file mode 100644 index 0000000000000000000000000000000000000000..8223b0d6e396ff06d259939026940aabe7c70025 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/CommonBizException.java @@ -0,0 +1,121 @@ +/** + * yunjikeji Inc. + * Copyright (c) 2004-2015 All Rights Reserved. + */ +package com.idcos.enterprise.portal.biz.common; + +import com.idcos.common.biz.BizCoreException; +import org.springframework.util.Assert; + +/** + * idcos管理平台运行时异常,作为业务处理的异常基类 + * + * @author yanlv + * @version $Id: idcosBizException.java, v 0.1 2015-1-29 下午7:47:55 yanlv Exp $ + */ +public class CommonBizException extends BizCoreException { + + /** + * serialVersionUID + */ + private static final long serialVersionUID = 1382559230799468711L; + + /** + * 结果码处理 + */ + private ResultCode resultCode; + + /** + * 异常描述对象,可以返回到json前台的信息 + */ + private Object exceptionDescription; + + /** + * 构造函数 + * + * @param resultCode + * @param message + */ + public CommonBizException(ResultCode resultCode, String message) { + + super(message); + + Assert.notNull(resultCode, message); + + this.resultCode = resultCode; + } + + /** + * 构造函数 + * + * @param resultCode + * @param resultCode + */ + public CommonBizException(ResultCode resultCode) { + + super(resultCode.getDescription()); + + Assert.notNull(resultCode, resultCode.getDescription()); + + this.resultCode = resultCode; + } + + /** + * @param message + */ + public CommonBizException(String message) { + + super(message); + + this.resultCode = ResultCode.UNKNOWN_EXCEPTION; + } + + /** + * @param message + */ + public CommonBizException(String message, Object exceptionDescription) { + + super(message); + + this.resultCode = ResultCode.UNKNOWN_EXCEPTION; + + this.exceptionDescription = exceptionDescription; + } + + /** + * @param resultCode + * @param message + * @param e + */ + public CommonBizException(ResultCode resultCode, String message, Throwable e) { + + super(message, e); + + if (resultCode == null) { + this.resultCode = ResultCode.UNKNOWN_EXCEPTION; + } else { + this.resultCode = resultCode; + } + } + + /** + * @param message + * @param e + */ + public CommonBizException(String message, Throwable e) { + + super(message, e); + + this.resultCode = ResultCode.UNKNOWN_EXCEPTION; + + } + + public ResultCode getResultCode() { + return resultCode; + } + + public Object getExceptionDescription() { + return exceptionDescription; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/PortalResponse.java b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/PortalResponse.java new file mode 100644 index 0000000000000000000000000000000000000000..947ef08fd794c797b0d04c029f054c01d1577e78 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/PortalResponse.java @@ -0,0 +1,87 @@ +package com.idcos.enterprise.portal.biz.common; + +/** + * 抽象配置项管理系统的返回信息对象。 + * + * @author pengganyu + * @version $Id: PortalResponse.java, v 0.1 2016年5月10日 下午4:45:34 pengganyu Exp $ + */ +public class PortalResponse { + + /** + * 返回调用操作是否有错误,代表状态码,成功success,失败error + * <p> + * 此处理的错误主要是业务层面的错误信息。 + * </p> + */ + private String status; + + /** + * 返回信息,不管操作是否成功,都可以返回相应的信息。 + */ + private String message; + + /** + * 返回值,不管操作是否成功都可以返回相应的数据。 + */ + private Object content; + + public PortalResponse() { + content = ""; + } + + /** + * Getter method for property <tt>error</tt>. + * + * @return property value of error + */ + public String getStatus() { + return status; + } + + /** + * Setter method for property <tt>error</tt>. + * + * @param error value to be assigned to property error + */ + public void setStatus(String status) { + this.status = status; + } + + /** + * Getter method for property <tt>message</tt>. + * + * @return property value of message + */ + public String getMessage() { + return message; + } + + /** + * Setter method for property <tt>message</tt>. + * + * @param message value to be assigned to property message + */ + public void setMessage(String message) { + this.message = message; + } + + /** + * Getter method for property <tt>data</tt>. + * + * @return property value of data + */ + public Object getContent() { + return content; + } + + /** + * Setter method for property <tt>data</tt>. + * + * @param data value to be assigned to property data + */ + public void setContent(Object content) { + this.content = content; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/ResultCode.java b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/ResultCode.java new file mode 100644 index 0000000000000000000000000000000000000000..69e70b260b22b662858daa30bd3a6517e8df881f --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/ResultCode.java @@ -0,0 +1,93 @@ +/** + * yunjikeji Inc. + * Copyright (c) 2004-2015 All Rights Reserved. + */ +package com.idcos.enterprise.portal.biz.common; + +/** + * 业务处理结果码 + * + * @author yanlv + * @version $Id: ResultCode.java, v 0.1 2015-1-29 下午7:50:32 yanlv Exp $ + */ +public enum ResultCode { + /** + * 处理失败 + */ + FAILE("FAILE", "处理失败"), + /** + * 处理成功 + */ + SUCCESS("success", "处理成功"), + + PARAM_NULL("PARAM_NULL", "参数为空"), + + PARAM_ERROR("PARAM_ERROR", "参数错误"), + + PAGE_OFFSET_LIMIT_PARAM_ERROR("PAGE_OFFSET_LIMIT_PARAM_ERROR", "翻页查询条件参数错误"), + + QUERY_RESULT_IS_NULL("QUERY_RESULT_IS_NULL", "查询结果为空"), + + DEVICE_NOT_EXIST_FIND_BY_SN("DEVICE_NOT_EXIST_FIND_BY_SN", "根据设备序列号无法获取对应设备信息"), + + DEVICE_SN_REPEAT("DEVICE_SN_REPEAT", "设备序列号重复"), + + UNKNOWN_EXCEPTION("UNKNOWN_EXCEPTION", "未知异常"), + + USER_NOT_EXIST("USER_NOT_EXIST", "用户信息不存在"), + + PASSWORD_NOT_CORRECT("PASSWORD_NOT_CORRECT", "用户密码错误"), + + USER_AUTH_EXCEPTION("USER_AUTH_EXCEPTION", "用户验证错误"), + + UNAUTHORIZED("UNAUTHORIZED", "未授权"), + + NO_AUTH("NO_AUTH", "未认证"), + + AUTH_FAIL("AUTH_FAIL", "认证失败"), + + INSTRUCTION_EXE_TIMEOUT("INSTRUCTION_EXE_TIMEOUT", "指令执行超时"), + + INSTRUCTION_EXE_WAY_NOT_SUPPORT("INSTRUCTION_EXE_WAY_NOT_SUPPORT", "指令执行方式不支持"), + + STATUS_ERROR("STATUS_ERROR", "状态异常"); + + /** + * 结果代码 + */ + private String code; + + /** + * 结果描述 + */ + private String description; + + /** + * @param code + * @param description + */ + private ResultCode(String code, String description) { + + this.code = code; + this.description = description; + } + + /** + * Getter method for property <tt>code</tt>. + * + * @return property value of code + */ + public String getCode() { + return code; + } + + /** + * Getter method for property <tt>description</tt>. + * + * @return property value of description + */ + public String getDescription() { + return description; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/convert/BaseConvertFunction.java b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/convert/BaseConvertFunction.java new file mode 100644 index 0000000000000000000000000000000000000000..0ba731ac15955ec3dd91a15b7c11a6c0f8ccdb86 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/convert/BaseConvertFunction.java @@ -0,0 +1,33 @@ +package com.idcos.enterprise.portal.biz.common.convert; + +import com.google.common.base.Function; +import com.idcos.cloud.core.common.util.ObjectUtil; +import com.idcos.enterprise.portal.dal.enums.BusinessIdentityEnum; + +import java.lang.reflect.ParameterizedType; + +/** + * PO2VO转换类 + * + * @author jiaohuizhe + * @version $Id: ConvertFunction.java, v 0.1 2015年5月8日 上午9:35:17 jiaohuizhe Exp $ + */ +public abstract class BaseConvertFunction<F, T> implements Function<F, T> { + private Class<T> entityClass; + + @Override + @SuppressWarnings("unchecked") + public T apply(F input) { + if (entityClass == null) { + entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()) + .getActualTypeArguments()[1]; + } + T t = ObjectUtil.copy(input, entityClass); + return t; + } + + public BusinessIdentityEnum getTabEnum() { + return null; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/tempalte/BusinessProcessCallback.java b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/tempalte/BusinessProcessCallback.java new file mode 100644 index 0000000000000000000000000000000000000000..8efdac9b1ff3c4c72254fde7a03679689f3833da --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/tempalte/BusinessProcessCallback.java @@ -0,0 +1,47 @@ +/** + * yunjikeji Inc. + * Copyright (c) 2004-2015 All Rights Reserved. + */ +package com.idcos.enterprise.portal.biz.common.tempalte; + +import com.idcos.enterprise.portal.biz.common.CommonBizException; + +/** + * 业务处理回调接口,负责处理具体的业务信息 + * + * @author yanlv + * @version $Id: BusinessProcessCallback.java, v 0.1 2015年3月18日 下午7:19:29 yanlv Exp $ + */ +public interface BusinessProcessCallback<T> { + + /** + * 检查参数信息,如果失败,抛出<code>CommonBizException</code>异常 + * + * @param context + */ + void checkParam(BusinessProcessContext context); + + /** + * 检查参数信息,如果失败,抛出<code>CommonBizException</code>异常 + * + * @param context + */ + void checkBusinessInfo(BusinessProcessContext context); + + /** + * 做相关的业务处理,提供事务相关的支持,如果失败,抛出<code>CommonBizException</code>异常 + * + * @param context + * @return T + */ + T doBusiness(BusinessProcessContext context); + + /** + * 发生异常的时候处理方式 + * + * @param exception 异常信息 + * @param context 上下文信息 + */ + void exceptionProcess(CommonBizException exception, BusinessProcessContext context); + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/tempalte/BusinessProcessCallbackAdator.java b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/tempalte/BusinessProcessCallbackAdator.java new file mode 100644 index 0000000000000000000000000000000000000000..a76fd20acf66c767e63122191d8c9a0ac1bf724b --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/tempalte/BusinessProcessCallbackAdator.java @@ -0,0 +1,36 @@ +/** + * yunjikeji Inc. + * Copyright (c) 2004-2015 All Rights Reserved. + */ +package com.idcos.enterprise.portal.biz.common.tempalte; + + +import com.idcos.enterprise.portal.biz.common.CommonBizException; + +/** + * 业务处理回调默认的适配器 + * + * @author yanlv + * @version $Id: BusinessProcessCallbackAdator.java, v 0.1 2015年3月22日 下午3:50:46 yanlv Exp $ + */ +public class BusinessProcessCallbackAdator<T> implements BusinessProcessCallback<T> { + + @Override + public void checkParam(BusinessProcessContext context) { + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + } + + @Override + public T doBusiness(BusinessProcessContext context) { + return null; + } + + @Override + public void exceptionProcess(CommonBizException exception, BusinessProcessContext context) { + + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/tempalte/BusinessProcessContext.java b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/tempalte/BusinessProcessContext.java new file mode 100644 index 0000000000000000000000000000000000000000..2bff6a0c5819786ec2bc91d9efd2e7fe0659f3ae --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/tempalte/BusinessProcessContext.java @@ -0,0 +1,23 @@ +/** + * yunjikeji Inc. + * Copyright (c) 2004-2015 All Rights Reserved. + */ +package com.idcos.enterprise.portal.biz.common.tempalte; + +import java.util.HashMap; + +/** + * 业务处理上下文信息 + * + * @author yanlv + * @version $Id: BusinessProcessContext.java, v 0.1 2015年3月22日 下午3:42:02 yanlv Exp $ + */ +public class BusinessProcessContext extends HashMap<String, Object> { + + /** + * serialVersionUID + */ + private static final long serialVersionUID = 1566492611795954955L; + + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/tempalte/BusinessProcessTemplate.java b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/tempalte/BusinessProcessTemplate.java new file mode 100644 index 0000000000000000000000000000000000000000..e5982c5af17c19dbc3b2ae76b48788f657debfc0 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/tempalte/BusinessProcessTemplate.java @@ -0,0 +1,158 @@ +/** + * yunjikeji Inc. + * Copyright (c) 2004-2015 All Rights Reserved. + */ +package com.idcos.enterprise.portal.biz.common.tempalte; + +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.common.biz.BizCoreException; +import com.idcos.common.biz.CommonResultCode; +import com.idcos.enterprise.portal.biz.common.CommonBizException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.TransactionCallback; +import org.springframework.transaction.support.TransactionTemplate; + +/** + * 业务处理模板,这里封装了基本的业务处理处理流程 + * 基本的业务处理流程 + * <ul> + * <li>检查请求参数基本信息</li> + * <li>检查业务参数基本信息</li> + * <li>处理业务信息,提供事务支持</li> + * <li>返回处理结果</li> + * </ul> + * + * @author yanlv + * @version $Id: BusinessProcessTemplate.java, v 0.1 2015年3月18日 下午7:18:25 yanlv Exp $ + */ +@Service +public class BusinessProcessTemplate { + /** + * 日志 + */ + private static final Logger LOGGER = LoggerFactory.getLogger(BusinessProcessTemplate.class); + + /** + * 事务模板信息 + */ + @Autowired + private TransactionTemplate transactionTemplate; + + /** + * 业务实现类,返回一个默认的CommonResult + * + * @param callback 业务回调实现类, + * @return + */ + + public <T> CommonResult<T> process(final BusinessProcessCallback<T> callback) { + + final CommonResult<T> result = new CommonResult<T>(); + + final BusinessProcessContext context = new BusinessProcessContext(); + + try { + + T object = transactionTemplate.execute(new TransactionCallback<T>() { + + @Override + public T doInTransaction(TransactionStatus status) { + + //对业务参数信息进行检查 + callback.checkParam(context); + + //对业务相关的类型进行check,比如唯一性,状态等等 + callback.checkBusinessInfo(context); + + //这里执行真正的业务逻辑,业务逻辑是在原子事务里面的 + return callback.doBusiness(context); + } + + }); + + result.setSuccess(true); + result.setResultObject(object); + + } catch (CommonBizException e) { + + LOGGER.error("执行业务操作异常", e); + result.setSuccess(false); + result.setResultCode(e.getResultCode().getCode()); + result.setResultMessage(e.getMessage()); + + callback.exceptionProcess(e, context); + + } catch (BizCoreException e) { + + LOGGER.error("执行业务操作异常", e); + result.setSuccess(false); + result.setResultCode(CommonResultCode.UNKNOWN_EXCEPTION.getCode()); + result.setResultMessage(e.getMessage()); + + } catch (Exception e) { + LOGGER.error("执行业务操作异常", e); + result.setSuccess(false); + result.setResultMessage(e.getMessage()); + + } + + return result; + + } + // + // /** + // * 业务实现类,参数指定要传入的result对象信息 + // * @param callback 业务回调实现类 + // * @return + // */ + // + // public synchronized <T> void processWithResult(final BusinessProcessCallbackWithResult<T> callback, + // final CommonResult<T> result) { + // + // final BusinessProcessContext context = new BusinessProcessContext(); + // + // try { + // + // T object = transactionTemplate.execute(new TransactionCallback<T>() { + // + // @Override + // public T doInTransaction(TransactionStatus status) { + // + // //对业务参数信息进行检查 + // callback.checkParam(context, result); + // + // //对业务相关的类型进行check,比如唯一性,状态等等 + // callback.checkBusinessInfo(context, result); + // + // //这里执行真正的业务逻辑,业务逻辑是在原子事务里面的 + // return callback.doBusiness(context, result); + // } + // + // }); + // + // result.setSuccess(true); + // result.setResultObject(object); + // + // } catch (CommonBizException e) { + // + // LOGGER.error("执行业务操作异常", e); + // result.setSuccess(false); + // result.setResultCode(e.getResultCode()); + // result.setResultMessage(e.getMessage()); + // + // callback.exceptionProcess(e, context, result); + // + // } catch (Exception e) { + // LOGGER.error("执行业务操作异常", e); + // result.setSuccess(false); + // result.setResultMessage(e.getMessage()); + // + // } + // + // } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/tempalte/BusinessQueryCallback.java b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/tempalte/BusinessQueryCallback.java new file mode 100644 index 0000000000000000000000000000000000000000..a4b5c6862b47aa40d2d255d6b855f2beeeff61f2 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/tempalte/BusinessQueryCallback.java @@ -0,0 +1,27 @@ +/** + * yunjikeji Inc. + * Copyright (c) 2004-2015 All Rights Reserved. + */ +package com.idcos.enterprise.portal.biz.common.tempalte; + +/** + * 查询回调处理 + * + * @author yanlv + * @version $Id: BusinessQueryCallback.java, v 0.1 2015年3月27日 下午1:21:21 yanlv Exp $ + */ +public interface BusinessQueryCallback<T> { + + /** + * 检查参数信息,是否满足查询条件 + */ + void checkParam(); + + /** + * 进行查询相关的业务处理 + * + * @return T + */ + T doQuery(); + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/tempalte/BusinessQueryTemplate.java b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/tempalte/BusinessQueryTemplate.java new file mode 100644 index 0000000000000000000000000000000000000000..2ff022b4fe513c69b09ac1f968a7964738dbf5ff --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/tempalte/BusinessQueryTemplate.java @@ -0,0 +1,95 @@ +/** + * yunjikeji Inc. + * Copyright (c) 2004-2015 All Rights Reserved. + */ +package com.idcos.enterprise.portal.biz.common.tempalte; + +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.common.biz.BizCoreException; +import com.idcos.common.biz.CommonResultCode; +import com.idcos.enterprise.portal.biz.common.CommonBizException; +import com.idcos.enterprise.portal.biz.common.AuthInfoException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +/** + * 查询模板处理 + * 基本的业务处理流程 + * <ul> + * <li>检查请求参数基本信息</li> + * <li>检查业务参数基本信息</li> + * <li>处理业务信息,提供事务支持</li> + * <li>返回处理结果</li> + * </ul> + * + * @author yanlv + * @version $Id: BusinessQueryTemplate.java, v 0.1 2015年3月27日 下午1:20:08 yanlv Exp $ + */ +@Service +public class BusinessQueryTemplate { + + /** + * 日志 + */ + private static final Logger logger = LoggerFactory.getLogger(BusinessQueryTemplate.class); + + /** + * @param callback 业务回调实现类 + * @return + */ + public <T> CommonResult<T> process(final BusinessQueryCallback<T> callback) { + + final CommonResult<T> result = new CommonResult<T>(); + + try { + + //对业务参数信息进行检查 + callback.checkParam(); + + //这里执行真正的业务逻辑,业务逻辑是在原子事务里面的 + T object = callback.doQuery(); + + result.setSuccess(true); + result.setResultObject(object); + + return result; + + } catch (AuthInfoException e) { + + logger.error("查询用户信息异常:{}", e.getMessage()); + result.setSuccess(false); + result.setResultCode(e.getResultCode().getCode()); + result.setResultMessage(e.getMessage()); + + return result; + + } catch (CommonBizException e) { + + logger.error("执行查询操作异常", e); + result.setSuccess(false); + result.setResultCode(e.getResultCode().getCode()); + result.setResultMessage(e.getMessage()); + + return result; + + } catch (BizCoreException e) { + + logger.error("执行查询操作异常", e); + result.setSuccess(false); + result.setResultCode(CommonResultCode.UNKNOWN_EXCEPTION.getCode()); + result.setResultMessage(e.getMessage()); + + return result; + + } catch (Exception e) { + + logger.error("执行查询操作异常", e); + result.setSuccess(false); + result.setResultMessage(e.getMessage()); + return result; + } + + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/Base64Util.java b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/Base64Util.java new file mode 100644 index 0000000000000000000000000000000000000000..7af675ec0067e05a0a80f7685494357102d50969 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/Base64Util.java @@ -0,0 +1,26 @@ +package com.idcos.enterprise.portal.biz.common.utils; + +import sun.misc.BASE64Decoder; +import sun.misc.BASE64Encoder; + +import java.io.IOException; + +/** + * base64编码解码工具类 + * + * @author Dana + * @version Base64Util.java, v1 2017/11/30 下午11:38 Dana Exp $$ + */ +public class Base64Util { + private static BASE64Decoder base64Decoder = new BASE64Decoder(); + + private static BASE64Encoder base64Encoder = new BASE64Encoder(); + + public static final String encode(byte[] b) { + return base64Encoder.encode(b); + } + + public static final byte[] decode(String str) throws IOException { + return base64Decoder.decodeBuffer(str); + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/CfgCacheUtil.java b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/CfgCacheUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..55b71e15dc214e5a1f071a18a6f3d2c613bc4d5c --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/CfgCacheUtil.java @@ -0,0 +1,67 @@ +/** + * 系统字典工具类信息 + * + * @author yanlv + * @version $Id: CfgSysDictUtils.java, v 0.1 2015年6月17日 上午11:04:54 yanlv Exp $ + */ +package com.idcos.enterprise.portal.biz.common.utils; + +import com.idcos.common.component.cache.CacheProvider; +import com.idcos.common.component.cache.CommonBizCache; +import org.springframework.beans.factory.InitializingBean; + +import java.util.Collection; + +/** + * 配置缓存工具类 + * @author yanlv + * @version $Id: CfgCacheUtil.java, v 0.1 2015年6月25日 下午6:30:51 yanlv Exp $ + */ +public class CfgCacheUtil implements InitializingBean { + + + @Override + public void afterPropertiesSet() throws Exception { + + } + + /** 缓存提供者 */ + private static CacheProvider cacheProvider; + + /** + * 默认的构造函数 + * @param cacheProvider + */ + public CfgCacheUtil(CacheProvider cacheProvider) { + CfgCacheUtil.cacheProvider = cacheProvider; + } + + /** + * 根据key以及缓存class 获取缓存中的数据类型 + * @param cacheEnum 缓存类型 + * @param key 缓存中的key的值 + * @param returnField 需要的返回字段值 + * @return + */ + + public static final Object find(Class<?> cacheClass, String key) { + + CommonBizCache<?> cache = cacheProvider.getCache(cacheClass); + + Object object = cache.get(key); + return object; + + } + + /** + * 获取缓存中所有的对象数据 + * @param cacheClass + * @return + */ + public static final Collection<?> findAll(Class<?> cacheClass) { + CommonBizCache<?> cache = cacheProvider.getCache(cacheClass); + return cache.getAll(); + + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/CrcUtil.java b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/CrcUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..586161472112b27806dd97e9c4ceaa4e932be72b --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/CrcUtil.java @@ -0,0 +1,16 @@ +package com.idcos.enterprise.portal.biz.common.utils; + +import java.util.zip.CRC32; + +/** + * @Author: Dai + * @Date: 2018/11/15 12:03 PM + * @Description: crc加密工具类 + */ +public class CrcUtil { + public static final long crc(String value) { + CRC32 crc32 = new CRC32(); + crc32.update(value.getBytes()); + return crc32.getValue(); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/CrudUtilService.java b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/CrudUtilService.java new file mode 100644 index 0000000000000000000000000000000000000000..88e6d2a0759a72802d8d2bee1eb7806ef1fe9bd3 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/CrudUtilService.java @@ -0,0 +1,252 @@ +package com.idcos.enterprise.portal.biz.common.utils; + +import com.idcos.cloud.biz.common.check.CommonParamtersChecker; +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.cloud.core.common.util.ListUtil; +import com.idcos.cloud.core.dal.common.page.PageForm; +import com.idcos.cloud.core.dal.common.page.PageUtils; +import com.idcos.cloud.core.dal.common.page.Pagination; +import com.idcos.cloud.core.dal.common.query.OperatorEnum; +import com.idcos.cloud.core.dal.common.query.SearchConditionBuilder; +import com.idcos.enterprise.portal.biz.common.CommonBizException; +import com.idcos.enterprise.portal.biz.common.ResultCode; +import com.idcos.enterprise.portal.biz.common.convert.BaseConvertFunction; +import com.idcos.enterprise.portal.biz.common.tempalte.*; +import com.idcos.enterprise.portal.dal.enums.IsActiveEnum; +import com.idcos.enterprise.portal.dal.repository.PortalGroupRoleRelRepository; +import com.idcos.enterprise.portal.dal.repository.PortalGroupUserRelRepository; +import com.idcos.enterprise.portal.dal.repository.PortalTenantRepository; +import org.apache.commons.beanutils.PropertyUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.support.ApplicationObjectSupport; +import org.springframework.data.domain.Page; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.stereotype.Service; + +import java.lang.reflect.InvocationTargetException; +import java.util.List; + +/** + * 基本的查询删除功能实现 + * + * @author jiaohuizhe + * @version $Id: CrudUtilService.java, v 0.1 2015年5月27日 下午2:24:05 jiaohuizhe Exp $ + */ +@Service +public class CrudUtilService extends ApplicationObjectSupport { + protected final Logger logger = LoggerFactory.getLogger(getClass()); + @Autowired + private BusinessProcessTemplate businessProcessTemplate; + + @Autowired + private BusinessQueryTemplate businessQueryTemplate; + + @Autowired + private PortalTenantRepository portalTenantRepository; + + @Autowired + private PortalGroupUserRelRepository portalGroupUserRelRepository; + + @Autowired + private PortalGroupRoleRelRepository portalGroupRoleRelRepository; + + /** + * 根据数据ID和转换类删除某条数据 + * + * @param id 数据ID + * @param func PO2VO转换类 PO持久类类型 VO界面展示类类型 + * @return + */ + public <PO, VO> CommonResult<VO> delete(final String id, final BaseConvertFunction<PO, VO> func) { + return businessProcessTemplate.process(new BusinessProcessCallback<VO>() { + @Override + public void checkParam(BusinessProcessContext context) { + CommonParamtersChecker.checkNotBlank(id, "删除【" + func.getTabEnum().getDescription() + + "】的功能接收参数ID不能为空!"); + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + } + + @Override + @SuppressWarnings("unchecked") + public VO doBusiness(BusinessProcessContext context) { + JpaRepository<PO, String> repository = getApplicationContext().getBean( + func.getTabEnum().getBeanName(), JpaRepository.class); + PO po = repository.findOne(id); + if (po == null) { + throw new CommonBizException(ResultCode.QUERY_RESULT_IS_NULL, "系统未查询到要删除的数据!"); + } else { + try { + if (IsActiveEnum.HAS_ACTIVE.getCode().equals( + PropertyUtils.getSimpleProperty(po, "isActive"))) { + PropertyUtils.setSimpleProperty(po, "isActive", + IsActiveEnum.NO_ACTIVE.getCode()); + return func.apply(repository.save(po)); + } else { + throw new CommonBizException(ResultCode.PARAM_ERROR, + "当前数据状态为已删除,无法再次删除!"); + } + } catch (ReflectiveOperationException e) { + throw new CommonBizException(ResultCode.UNKNOWN_EXCEPTION, "删除数据时出现未知错误!", + e); + } + } + } + + @Override + public void exceptionProcess(CommonBizException exception, + BusinessProcessContext context) { + } + }); + } + + + /** + * 根据form提交参数中的注解查询数据 + * + * @param pclass 持久类类型 + * @param form 前端提交表单内容 + * @param pageForm 提交提交分页内容 + * @param func PO2VO转换类 + * @return + */ + public <PO, VO> CommonResult<Pagination<VO>> query(final Class<PO> pclass, final Object form, + final PageForm pageForm, + final BaseConvertFunction<PO, VO> func, + final boolean isActive) { + CommonResult<Pagination<VO>> result = businessQueryTemplate + .process(new BusinessQueryCallback<Pagination<VO>>() { + @Override + public void checkParam() { + } + + @Override + @SuppressWarnings("unchecked") + public Pagination<VO> doQuery() { + JpaSpecificationExecutor<PO> repository = getApplicationContext().getBean( + func.getTabEnum().getBeanName(), JpaSpecificationExecutor.class); + SearchConditionBuilder<PO> scb = SearchConditionBuilder.newInstance(pclass); + if (isActive) { + scb.builder("isActive", OperatorEnum.EQ, IsActiveEnum.HAS_ACTIVE.getCode()); + } + Page<PO> page = repository.findAll(scb.builder(form).createQuery(), + PageUtils.buildPageRequest(pageForm)); + return PageUtils.toPagination(page, func); + } + }); + return result; + } + + /** + * 根据form提交参数中的注解查询数据,此方法中不做分页处理,仅处理pageForm中的排序信息. + * + * @param pclass 持久类类型 + * @param form 前端提交表单内容 + * @param pageForm 提交提交排序内容 + * @param func PO2VO转换类 + * @return + */ + public <PO, VO> CommonResult<List<VO>> queryAll(final Class<PO> pclass, final Object form, + final PageForm pageForm, + final BaseConvertFunction<PO, VO> func, + final boolean isActive) { + CommonResult<List<VO>> result = businessQueryTemplate + .process(new BusinessQueryCallback<List<VO>>() { + @Override + public void checkParam() { + } + + @Override + @SuppressWarnings("unchecked") + public List<VO> doQuery() { + JpaSpecificationExecutor<PO> repository = getApplicationContext().getBean( + func.getTabEnum().getBeanName(), JpaSpecificationExecutor.class); + SearchConditionBuilder<PO> scb = SearchConditionBuilder.newInstance(pclass); + if (isActive) { + scb.builder("isActive", OperatorEnum.EQ, IsActiveEnum.HAS_ACTIVE.getCode()); + } + List<PO> list = repository.findAll(scb.builder(form).createQuery(), PageUtils + .buildPageRequest(pageForm).getSort()); + return ListUtil.transform(list, func); + } + }); + return result; + } + + /** + * 根据数据ID和转换类查询某条数据 + * + * @param id 数据ID + * @param func PO2VO转换类 PO持久类类型 VO界面展示类类型 + * @return + */ + public <PO, VO> CommonResult<VO> findOne(final String id, final BaseConvertFunction<PO, VO> func) { + CommonResult<VO> result = businessQueryTemplate.process(new BusinessQueryCallback<VO>() { + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(id); + } + + @Override + @SuppressWarnings("unchecked") + public VO doQuery() { + JpaRepository<PO, String> repository = getApplicationContext().getBean( + func.getTabEnum().getBeanName(), JpaRepository.class); + PO po = repository.findOne(id); + if (po == null) { + throw new CommonBizException(ResultCode.QUERY_RESULT_IS_NULL, "查询结果为空!"); + } else { + return func.apply(po); + } + } + }); + return result; + } + + /** + * 根据数据ID和转换类查询某条数据,并验证有效性 + * + * @param id 数据ID + * @param func PO2VO转换类 PO持久类类型 VO界面展示类类型 + * @return + */ + public <PO, VO> CommonResult<VO> findOneAndIsActive(final String id, + final BaseConvertFunction<PO, VO> func) { + CommonResult<VO> result = businessQueryTemplate.process(new BusinessQueryCallback<VO>() { + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(id); + } + + @Override + @SuppressWarnings("unchecked") + public VO doQuery() { + JpaRepository<PO, String> repository = getApplicationContext().getBean( + func.getTabEnum().getBeanName(), JpaRepository.class); + PO po = repository.findOne(id); + if (po == null) { + throw new CommonBizException(ResultCode.QUERY_RESULT_IS_NULL, "查询结果为空!"); + } else { + try { + if (!IsActiveEnum.HAS_ACTIVE.getCode().equals( + PropertyUtils.getSimpleProperty(po, "isActive"))) { + throw new CommonBizException(ResultCode.STATUS_ERROR, + "当前" + func.getTabEnum().getDescription() + "已被删除!"); + } + } catch (IllegalAccessException | InvocationTargetException + | NoSuchMethodException e) { + throw new CommonBizException(ResultCode.STATUS_ERROR, "查询异常", e); + } + return func.apply(po); + } + } + }); + return result; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/CurrentUser.java b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/CurrentUser.java new file mode 100644 index 0000000000000000000000000000000000000000..5b14a5ff6f21c1542c1063193038cf878c4feac5 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/CurrentUser.java @@ -0,0 +1,50 @@ +package com.idcos.enterprise.portal.biz.common.utils; + +import com.idcos.common.web.model.JwtToken; +import com.idcos.enterprise.portal.dal.entity.JwtUser; +import com.idcos.enterprise.portal.web.GlobalValue; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Service; + +/** + * @author GuanBin + * @version CurrentUser.java, v1 2017/9/25 下午2:52 GuanBin Exp $$ + */ +@Service +public class CurrentUser { + + @Autowired + private GlobalValue globalValue; + + private static final Logger LOGGER = LoggerFactory.getLogger(CurrentUser.class); + + public JwtUser getUser() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + JwtToken jwtToken = (JwtToken) authentication; + JwtUser jwtUser = null; + + try { + Claims claims = (Claims) Jwts.parser().setSigningKey(globalValue.getSecretKey()) + .parseClaimsJws(jwtToken.getToken()).getBody(); + jwtUser = new JwtUser(); + jwtUser.setExp(claims.get("exp") == null ? "" : claims.get("exp").toString()); + jwtUser.setLoginId(claims.get("loginId") == null ? "" : claims.get("loginId").toString()); + jwtUser.setName(claims.get("name") == null ? "" : claims.get("name").toString()); + jwtUser.setUserId(claims.get("userId") == null ? "" : claims.get("userId").toString()); + jwtUser.setUserName(claims.get("userName") == null ? "" : claims.get("userName").toString()); + jwtUser.setTimeout(claims.get("timeout") == null ? "" : claims.get("timeout").toString()); + jwtUser.setTenantId(claims.get("tenantId") == null ? "" : claims.get("tenantId").toString()); + jwtUser.setTenantName(claims.get("tenantName") == null ? "" : claims.get("tenantName").toString()); + } catch (Exception e) { + LOGGER.error("用户解析异常:" + e); + } + + return jwtUser; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/DesCipherUtil.java b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/DesCipherUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..c94b8b689cbbfe809da91dc1b78a0887471f68cb --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/DesCipherUtil.java @@ -0,0 +1,88 @@ +package com.idcos.enterprise.portal.biz.common.utils; + +import org.bouncycastle.jce.provider.BouncyCastleProvider; + +import javax.crypto.*; +import javax.crypto.spec.DESKeySpec; +import java.io.IOException; +import java.nio.charset.Charset; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.security.Security; +import java.security.spec.InvalidKeySpecException; + +/** + * @author Xizhao.Dai + * @version DesCipherUtil.java, v1 2018/8/3 上午11:05 Xizhao.Dai Exp $$ + */ +public class DesCipherUtil { + private DesCipherUtil() { + throw new AssertionError("No DesCipherUtil instances for you!"); + } + + static { + // add BC provider + Security.addProvider(new BouncyCastleProvider()); + } + + /** + * 加密 + * + * @param encryptText 需要加密的信息 + * @param key 加密密钥 + * @return 加密后Base64编码的字符串 + */ + public static String encrypt(String encryptText, String key) { + + if (encryptText == null || key == null) { + throw new IllegalArgumentException("encryptText or key must not be null"); + } + + try { + DESKeySpec desKeySpec = new DESKeySpec(key.getBytes()); + SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES"); + SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec); + + Cipher cipher = Cipher.getInstance("DES/ECB/PKCS7Padding", "BC"); + cipher.init(Cipher.ENCRYPT_MODE, secretKey); + byte[] bytes = cipher.doFinal(encryptText.getBytes(Charset.forName("UTF-8"))); + return Base64Util.encode(bytes); + + } catch (NoSuchAlgorithmException | InvalidKeyException | InvalidKeySpecException | NoSuchPaddingException + | BadPaddingException | NoSuchProviderException | IllegalBlockSizeException e) { + throw new RuntimeException("encrypt failed", e); + } + + } + + /** + * 解密 + * + * @param decryptText 需要解密的信息 + * @param key 解密密钥,经过Base64编码 + * @return 解密后的字符串 + */ + public static String decrypt(String decryptText, String key) { + + if (decryptText == null || key == null) { + throw new IllegalArgumentException("decryptText or key must not be null"); + } + + try { + DESKeySpec desKeySpec = new DESKeySpec(key.getBytes()); + SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES"); + SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec); + + Cipher cipher = Cipher.getInstance("DES/ECB/PKCS7Padding", "BC"); + cipher.init(Cipher.DECRYPT_MODE, secretKey); + byte[] decode = Base64Util.decode(decryptText); + byte[] bytes = cipher.doFinal(decode); + return new String(bytes, Charset.forName("UTF-8")); + + } catch (NoSuchAlgorithmException | InvalidKeyException | InvalidKeySpecException | NoSuchPaddingException + | BadPaddingException | NoSuchProviderException | IllegalBlockSizeException | IOException e) { + throw new RuntimeException("decrypt failed", e); + } + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/PasswordUtil.java b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/PasswordUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..a8a8b96cf4e7cd307eaf9dde4b6257e1aed03969 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/PasswordUtil.java @@ -0,0 +1,320 @@ +package com.idcos.enterprise.portal.biz.common.utils; + +import com.idcos.enterprise.portal.biz.common.CommonBizException; +import com.idcos.enterprise.portal.dal.enums.ArrayNumEnum; + +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.SecretKeyFactory; +import javax.crypto.spec.PBEKeySpec; +import javax.crypto.spec.PBEParameterSpec; +import java.security.Key; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Random; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author + * @version PortalFilterUtil.java, v1 2017/11/18 下午6:22 Exp $$ + */ +public class PasswordUtil { + + /** + * JAVA6支持以下任意一种算法 PBEWITHMD5ANDDES PBEWITHMD5ANDTRIPLEDES + * PBEWITHSHAANDDESEDE PBEWITHSHA1ANDRC2_40 PBKDF2WITHHMACSHA1 + * */ + + /** + * 定义使用的算法为:PBEWITHMD5andDES算法 + */ + public static final String ALGORITHM = "PBEWithMD5AndDES"; + + /** + * 定义迭代次数为1000次 + */ + private static final int ITERATIONCOUNT = 1000; + + /** + * 获取加密算法中使用的盐值,解密中使用的盐值必须与加密中使用的相同才能完成操作. 盐长度必须为8字节 + * + * @return byte[] 盐值 + */ + public static byte[] getSalt() throws Exception { + // 实例化安全随机数 + // SecureRandom random = new SecureRandom(); + // 产出盐 + return randomSalt(8); + } + + /** + * SecureRandom有坑,这里自定义一个假的盐 + * + * @param length + * @return + */ + private static byte[] randomSalt(int length) { + byte[] letter = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".getBytes(); + int letterLength = letter.length; + + Random random = new Random(); + random.setSeed(System.currentTimeMillis()); + + byte[] randomValue = new byte[length]; + for (int i = 0; i < length; i++) { + int index = random.nextInt(length); + randomValue[i] = letter[index]; + } + return randomValue; + } + + /** + * 根据PBE密码生成一把密钥 + * + * @param password 生成密钥时所使用的密码 + * @return Key PBE算法密钥 + */ + private static Key getPBEKey(String password) { + // 实例化使用的算法 + SecretKeyFactory keyFactory; + SecretKey secretKey = null; + try { + keyFactory = SecretKeyFactory.getInstance(ALGORITHM); + // 设置PBE密钥参数 + PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray()); + // 生成密钥 + secretKey = keyFactory.generateSecret(keySpec); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + return secretKey; + } + + /** + * 加密明文字符串 + * + * @param plaintext 待加密的明文字符串 + * @param password 生成密钥时所使用的密码 + * @param salt 盐值 + * @return 加密后的密文字符串 + * @throws Exception + */ + public static String encrypt(String plaintext, String password, byte[] salt) { + + Key key = getPBEKey(password); + byte[] encipheredData = null; + PBEParameterSpec parameterSpec = new PBEParameterSpec(salt, ITERATIONCOUNT); + try { + Cipher cipher = Cipher.getInstance(ALGORITHM); + + cipher.init(Cipher.ENCRYPT_MODE, key, parameterSpec); + + encipheredData = cipher.doFinal(plaintext.getBytes()); + } catch (Exception e) { + } + return bytesToHexString(encipheredData); + } + + /** + * 解密密文字符串 + * + * @param ciphertext 待解密的密文字符串 + * @param password 生成密钥时所使用的密码(如需解密,该参数需要与加密时使用的一致) + * @param salt 盐值(如需解密,该参数需要与加密时使用的一致) + * @return 解密后的明文字符串 + * @throws Exception + */ + public static String decrypt(String ciphertext, String password, byte[] salt) { + + Key key = getPBEKey(password); + byte[] passDec = null; + PBEParameterSpec parameterSpec = new PBEParameterSpec(salt, ITERATIONCOUNT); + try { + Cipher cipher = Cipher.getInstance(ALGORITHM); + + cipher.init(Cipher.DECRYPT_MODE, key, parameterSpec); + + passDec = cipher.doFinal(hexStringToBytes(ciphertext)); + } catch (Exception e) { + // TODO: handle exception + e.printStackTrace(); + } + return new String(passDec); + } + + /** + * 将字节数组转换为十六进制字符串 + * + * @param src 字节数组 + * @return + */ + public static String bytesToHexString(byte[] src) { + StringBuilder stringBuilder = new StringBuilder(""); + if (src == null || src.length <= 0) { + return null; + } + for (int i = 0; i < src.length; i++) { + int v = src[i] & 0xFF; + String hv = Integer.toHexString(v); + if (hv.length() < 2) { + stringBuilder.append(0); + } + stringBuilder.append(hv); + } + return stringBuilder.toString(); + } + + /** + * 将十六进制字符串转换为字节数组 + * + * @param hexString 十六进制字符串 + * @return + */ + public static byte[] hexStringToBytes(String hexString) { + if (hexString == null || "".equals(hexString)) { + return null; + } + hexString = hexString.toUpperCase(); + int length = hexString.length() / 2; + char[] hexChars = hexString.toCharArray(); + byte[] d = new byte[length]; + for (int i = 0; i < length; i++) { + int pos = i * 2; + d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1])); + } + return d; + } + + private static byte charToByte(char c) { + return (byte) "0123456789ABCDEF".indexOf(c); + } + + /** + * public static void main(String[] args) { + * <p> + * System.out.print(-1 % 2 == 0); + * String str = "r00t!@#"; + * String password = ""; + * <p> + * System.out.println("明文:" + str); + * System.out.println("密码:" + password); + * <p> + * try { + * byte[] salt = PasswordUtil.getSalt(); + * String ciphertext = PasswordUtil.encrypt(str, password, salt); + * System.out.println("密文:" + ciphertext); + * String plaintext = PasswordUtil.decrypt(ciphertext, password, salt); + * System.out.println("1明文:" + plaintext); + * String tmp = new String(salt,"ISO-8859-1"); + * System.out.println(tmp); + * <p> + * salt = tmp.getBytes("ISO-8859-1"); + * plaintext = PasswordUtil.decrypt(ciphertext, password, salt); + * System.out.println("2明文:" + plaintext); + * } catch (Exception e) { + * e.printStackTrace(); + * } + * } + */ + private static final Pattern PATTERN1 = Pattern.compile("[a-z]+"); + + private static final Pattern PATTERN2 = Pattern.compile("[A-Z]+"); + + private static final Pattern PATTERN3 = Pattern.compile("[\\d]+"); + + /** + * ~!@#$%^&*()_-+=|\{}[]"';:/?.>,< + */ + private static final Pattern PATTERN4 = Pattern + .compile("[~!@#\\$%\\^&\\*\\(\\)_\\-\\+=\\|\\\\\\{\\}\\[\\]\\\"';:\\/\\?\\.>,<]+"); + + private static final Integer PASSWORD_MAX_LENGTH = 16; + + private static final Integer PASSWORD_MIN_LENGTH = 8; + + public static final void checkPassword(String password) { + // 密码强度校验 + // 要求:用户设定密码时需包含大小写字母,数字,特殊字符中的3种,长度为8-16个字符 + if (password.length() < PASSWORD_MIN_LENGTH || password.length() > PASSWORD_MAX_LENGTH) { + throw new CommonBizException("密码长度必须为8-16位,且包含大小写字母、数字、英文特殊字符!"); + } + Matcher m1 = PATTERN1.matcher(password); + if (!m1.find()) { + throw new CommonBizException("密码长度必须为8-16位,且包含大小写字母、数字、英文特殊字符!"); + } + Matcher m2 = PATTERN2.matcher(password); + if (!m2.find()) { + throw new CommonBizException("密码长度必须为8-16位,且包含大小写字母、数字、英文特殊字符!"); + } + Matcher m3 = PATTERN3.matcher(password); + if (!m3.find()) { + throw new CommonBizException("密码长度必须为8-16位,且包含大小写字母、数字、英文特殊字符!"); + } + Matcher m4 = PATTERN4.matcher(password); + if (!m4.find()) { + throw new CommonBizException("密码长度必须为8-16位,且包含大小写字母、数字、英文特殊字符!"); + } + } + + /** + * 重置密码生成随机字符串,必须包含大小写字母、数字和特殊字符 + * + * @param length + * @return + */ + public static String getStringRandom(int length) { + if (length < ArrayNumEnum.EIGHT.getCode()) { + throw new CommonBizException("密码长度至少为8!"); + } + String num = "23456789"; + String letter = "abcdefghjkmnpqrstuvwxyz"; + String specialChar = "~!@#$%^&*"; + Random random = new Random(); + StringBuffer sb = new StringBuffer(); + sb.append(specialChar.charAt(random.nextInt(specialChar.length()))); + for (int i = 0; i < ArrayNumEnum.TWO.getCode(); i++) { + sb.append(num.charAt(random.nextInt(num.length()))); + } + for (int i = 0; i < ArrayNumEnum.TWO.getCode(); i++) { + sb.append(letter.toUpperCase().charAt(random.nextInt(letter.toUpperCase().length()))); + } + for (int i = 0; i < length - ArrayNumEnum.FIVE.getCode(); i++) { + sb.append(letter.charAt(random.nextInt(letter.length()))); + } + char[] c = sb.toString().toCharArray(); + List<Character> lst = new ArrayList<>(); + for (int i = 0; i < c.length; i++) { + lst.add(c[i]); + } + Collections.shuffle(lst); + String resultStr = ""; + for (int i = 0; i < lst.size(); i++) { + resultStr += lst.get(i); + } + return resultStr; + } + + /** + * 对传入的密码加密处理 + * + * @param id + * @param password + * @param salt + * @return + */ + public static String encryptPassword(String id, String password, String salt) { + String encriptPW; + try { + byte[] saltBytes = Base64Util.decode(salt); + encriptPW = encrypt(password, id, saltBytes); + } catch (Exception e) { + throw new RuntimeException("密码加密错误:", e); + } + return encriptPW; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/PortalFilterUtil.java b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/PortalFilterUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..ab75f534700647c47fbc1a7f9628f4931d36450a --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/PortalFilterUtil.java @@ -0,0 +1,84 @@ +package com.idcos.enterprise.portal.biz.common.utils; + +import java.util.List; + +import com.google.common.collect.Lists; +import com.idcos.cloud.core.common.util.ListUtil; +import com.idcos.enterprise.portal.dal.entity.*; + +/** + * @author + * @version PortalFilterUtil.java, v1 2017/11/18 下午6:22 Exp $$ + */ +public class PortalFilterUtil { + + /** + * 过滤权限 不同的角色可能分配了相同的权限信息 + * + * @param list + * @return + */ + public static List<PortalPermission> filterPermission(List<PortalPermission> list) { + List<PortalPermission> newList = Lists.newArrayList(); + for (int i = list.size() - 1; i >= 0; i--) { + if (ListUtil.findOne(newList, "authResId", list.get(i).getAuthResId()) == null) { + newList.add(list.get(i)); + } + + } + return newList; + } + + /** + * 过滤用户 不同的用户组可能分配相同的用户 + * + * @param list + * @return + */ + public static List<PortalUser> filterUser(List<PortalUser> list) { + List<PortalUser> newList = Lists.newArrayList(); + + for (int i = list.size() - 1; i >= 0; i--) { + if (ListUtil.findOne(newList, "id", list.get(i).getId()) == null) { + newList.add(list.get(i)); + } + } + return newList; + } + + /** + * 过滤角色 不同的用户可能属于不同的角色 + * + * @param list + * @return + */ + public static List<PortalRole> filterRole(List<PortalRole> list) { + List<PortalRole> newList = Lists.newArrayList(); + + for (int i = list.size() - 1; i >= 0; i--) { + if (ListUtil.findOne(newList, "id", list.get(i).getId()) == null) { + newList.add(list.get(i)); + } + } + + return newList; + } + + /** + * 过滤用户组 + * + * @param list + * @return + */ + public static List<PortalUserGroup> filterGroup(List<PortalUserGroup> list) { + List<PortalUserGroup> newList = Lists.newArrayList(); + + for (int i = list.size() - 1; i >= 0; i--) { + if (ListUtil.findOne(newList, "id", list.get(i).getId()) == null) { + newList.add(list.get(i)); + } + } + + return newList; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/SourceTypeUtil.java b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/SourceTypeUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..504edf1d6300c6318b6d596b40e5abd23a9679c9 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/biz/common/utils/SourceTypeUtil.java @@ -0,0 +1,45 @@ +package com.idcos.enterprise.portal.biz.common.utils; + +/** + * @Author: Dai + * @Date: 2018/10/24 11:44 PM + * @Description: + */ +public class SourceTypeUtil { + /** + * 数据库存储的sourceType转换成页面显示的sourceType + * + * @param sourceType + * @return + */ + public static String getSourceType(String sourceType) { + switch (sourceType) { + case "native": + return "UAM"; + case "webank": + return "webank"; + default: + return "UAM"; + } + } + + /** + * 页面显示的sourceType转换成数据库存储的sourceType + * + * @param sourceType + * @return + */ + public static String setSourceType(String sourceType) { + switch (sourceType) { + case "UAM": + return "native"; + case "LDAP": + case "ldap": + return "ldap"; + case "webank": + return "webank"; + default: + return "native"; + } + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalPermissionConvert.java b/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalPermissionConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..d77717606b7705d4807513e75c08dcca98457ec2 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalPermissionConvert.java @@ -0,0 +1,26 @@ +package com.idcos.enterprise.portal.convert; + +import org.springframework.stereotype.Service; + +import com.idcos.enterprise.portal.biz.common.convert.BaseConvertFunction; +import com.idcos.enterprise.portal.dal.entity.PortalPermission; +import com.idcos.enterprise.portal.vo.PortalPermissionVO; + +/** + * {controller.converClassName}对象转化类 , 第一次只是生成一个默认的convert + * <p>第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖</p> + * <p>这个类是泛型,需要你确定转化的target是什么,ConvertFunction中 Object 需要指定的是待转化为VO的对象class type,这里默认是Object</p> + * + * @author yanlv + * @version PortalPermissionConvert.java, v 1.1 2015-06-09 10:00:37 yanlv Exp $ + */ +@Service +public class PortalPermissionConvert extends BaseConvertFunction<PortalPermission, PortalPermissionVO> { + + @Override + public PortalPermissionVO apply(PortalPermission input) { + PortalPermissionVO vo = super.apply(input); + vo.setTenantId(input.getTenant()); + return vo; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalResourceConvert.java b/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalResourceConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..0db7620f02b774b85e66a2ebdfe161f9b59a0529 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalResourceConvert.java @@ -0,0 +1,31 @@ +package com.idcos.enterprise.portal.convert; + +import org.springframework.stereotype.Service; + +import com.idcos.enterprise.portal.biz.common.convert.BaseConvertFunction; +import com.idcos.enterprise.portal.dal.entity.PortalResource; +import com.idcos.enterprise.portal.dal.enums.BusinessIdentityEnum; +import com.idcos.enterprise.portal.vo.PortalResourceVO; + +/** + * {controller.converClassName}对象转化类 , 第一次只是生成一个默认的convert + * <p>第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖</p> + * <p>这个类是泛型,需要你确定转化的target是什么,ConvertFunction中 Object 需要指定的是待转化为VO的对象class type,这里默认是Object</p> + * + * @author yanlv + * @version PortalPermissionConvert.java, v 1.1 2015-06-09 10:00:37 yanlv Exp $ + */ +@Service +public class PortalResourceConvert extends BaseConvertFunction<PortalResource, PortalResourceVO> { + @Override + public BusinessIdentityEnum getTabEnum() { + return BusinessIdentityEnum.PORTAL_RESOURCE; + } + + @Override + public PortalResourceVO apply(PortalResource input) { + PortalResourceVO vo = super.apply(input); + vo.setTenantId(input.getTenant()); + return vo; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalRoleConvert.java b/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalRoleConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..8f5c19ecffcf44d0f2ee51459d7effd44109a123 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalRoleConvert.java @@ -0,0 +1,31 @@ +package com.idcos.enterprise.portal.convert; + +import com.idcos.enterprise.portal.biz.common.convert.BaseConvertFunction; +import com.idcos.enterprise.portal.dal.entity.PortalRole; +import com.idcos.enterprise.portal.dal.enums.BusinessIdentityEnum; +import com.idcos.enterprise.portal.vo.PortalRoleVO; +import org.springframework.stereotype.Service; + +/** + * {controller.converClassName}对象转化类 , 第一次只是生成一个默认的convert + * <p>第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖</p> + * <p>这个类是泛型,需要你确定转化的target是什么,ConvertFunction中 Object 需要指定的是待转化为VO的对象class type,这里默认是Object</p> + * + * @author yanlv + * @version PortalRoleConvert.java, v 1.1 2015-06-06 10:06:33 yanlv Exp $ + */ +@Service +public class PortalRoleConvert extends BaseConvertFunction<PortalRole, PortalRoleVO> { + + @Override + public BusinessIdentityEnum getTabEnum() { + return BusinessIdentityEnum.PORTAL_ROLE; + } + + @Override + public PortalRoleVO apply(PortalRole input) { + PortalRoleVO vo = super.apply(input); + vo.setTenantId(input.getTenant()); + return vo; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalRoleInfoConvert.java b/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalRoleInfoConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..19e55209dba2fe2c9162aba0cfab50928538a78c --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalRoleInfoConvert.java @@ -0,0 +1,53 @@ +package com.idcos.enterprise.portal.convert; + +import com.idcos.enterprise.portal.biz.common.convert.BaseConvertFunction; +import com.idcos.enterprise.portal.dal.entity.PortalGroupRoleRel; +import com.idcos.enterprise.portal.dal.entity.PortalRole; +import com.idcos.enterprise.portal.dal.enums.BusinessIdentityEnum; +import com.idcos.enterprise.portal.dal.repository.PortalGroupRoleRelRepository; +import com.idcos.enterprise.portal.vo.PortalRoleVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * {controller.converClassName}对象转化类 , 第一次只是生成一个默认的convert + * <p>第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖</p> + * <p>这个类是泛型,需要你确定转化的target是什么,ConvertFunction中 Object 需要指定的是待转化为VO的对象class type,这里默认是Object</p> + * + * @author yanlv + * @version PortalRoleConvert.java, v 1.1 2015-06-06 10:06:33 yanlv Exp $ + */ +@Service +public class PortalRoleInfoConvert extends BaseConvertFunction<PortalRole, PortalRoleVO> { + + @Autowired + private PortalGroupRoleRelRepository portalGroupRoleRelRepository; + + @Override + public PortalRoleVO apply(PortalRole input) { + PortalRoleVO vo = super.apply(input); + vo.setTenantId(input.getTenant()); + + // 加载用户组信息 + { + List<PortalGroupRoleRel> list = portalGroupRoleRelRepository.findByRoleId(input.getId()); + String[] groups = new String[list.size()]; + + for (int i = 0; i < groups.length; i++) { + groups[i] = list.get(i).getGroupId(); + } + + vo.setSelGroups(groups); + } + + return vo; + } + + @Override + public BusinessIdentityEnum getTabEnum() { + return BusinessIdentityEnum.PORTAL_ROLE; + } + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalSysDictConvert.java b/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalSysDictConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..0f9cb18db92e5476b65846a84abb8faa0ee4756b --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalSysDictConvert.java @@ -0,0 +1,20 @@ +package com.idcos.enterprise.portal.convert; + +import org.springframework.stereotype.Service; + +import com.idcos.enterprise.portal.biz.common.convert.BaseConvertFunction; +import com.idcos.enterprise.portal.dal.entity.PortalSysDict; +import com.idcos.enterprise.portal.vo.PortalSysDictVO; + +/** + * @author Dana + * @version PortalSysDictConvert.java, v1 2017/12/5 上午9:58 Dana Exp $$ + */ +@Service +public class PortalSysDictConvert extends BaseConvertFunction<PortalSysDict, PortalSysDictVO> { + @Override + public PortalSysDictVO apply(PortalSysDict input) { + PortalSysDictVO vo = super.apply(input); + return vo; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalTenantConvert.java b/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalTenantConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..5f29ac819eeefd297673f98234fe4672857d3678 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalTenantConvert.java @@ -0,0 +1,27 @@ +package com.idcos.enterprise.portal.convert; + +import com.idcos.enterprise.portal.biz.common.convert.BaseConvertFunction; +import com.idcos.enterprise.portal.dal.entity.PortalTenant; +import com.idcos.enterprise.portal.vo.PortalTenantVO; +import org.springframework.stereotype.Service; + +/** + * {controller.converClassName}对象转化类 , 第一次只是生成一个默认的convert + * <p>第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖</p> + * <p>这个类是泛型,需要你确定转化的target是什么,ConvertFunction中 Object 需要指定的是待转化为VO的对象class type,这里默认是Object</p> + * + * @author yanlv + * @version PortalUserGroupConvert.java, v 1.1 2015-06-09 09:11:34 yanlv Exp $ + */ +@Service +public class PortalTenantConvert extends BaseConvertFunction<PortalTenant, PortalTenantVO> { + + @Override + public PortalTenantVO apply(PortalTenant input) { + PortalTenantVO vo = super.apply(input); + vo.setTenantId(input.getName()); + vo.setTenantName(input.getDisplayName()); + return vo; + } + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalTokenConvert.java b/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalTokenConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..60e79598d3f0a0449ad827c6f8d3e5df3fe80d5b --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalTokenConvert.java @@ -0,0 +1,20 @@ +package com.idcos.enterprise.portal.convert; + +import com.idcos.enterprise.portal.biz.common.convert.BaseConvertFunction; +import com.idcos.enterprise.portal.dal.entity.PortalToken; +import com.idcos.enterprise.portal.vo.PortalTokenVO; +import org.springframework.stereotype.Service; + +/** + * @author Dana + * @version PortalTokenConvert.java, v1 2017/11/30 下午5:09 Dana Exp $$ + */ +@Service +public class PortalTokenConvert extends BaseConvertFunction<PortalToken, PortalTokenVO> { + @Override + public PortalTokenVO apply(PortalToken input) { + PortalTokenVO vo = super.apply(input); + return vo; + } + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalUserConvert.java b/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalUserConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..66638e126f5c4f0f298eb3755e702f9459925061 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalUserConvert.java @@ -0,0 +1,30 @@ +package com.idcos.enterprise.portal.convert; + +import org.springframework.stereotype.Service; + +import com.idcos.enterprise.portal.biz.common.convert.BaseConvertFunction; +import com.idcos.enterprise.portal.dal.entity.PortalUser; +import com.idcos.enterprise.portal.dal.enums.BusinessIdentityEnum; +import com.idcos.enterprise.portal.vo.PortalUserVO; + +/** + * {controller.converClassName}对象转化类 , 第一次只是生成一个默认的convert + * <p>第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖</p> + * <p>这个类是泛型,需要你确定转化的target是什么,ConvertFunction中 Object 需要指定的是待转化为VO的对象class type,这里默认是Object</p> + * + * @author yanlv + * @version PortalUserGroupConvert.java, v 1.1 2015-06-09 09:11:34 yanlv Exp $ + */ +@Service +public class PortalUserConvert extends BaseConvertFunction<PortalUser, PortalUserVO> { + @Override + public BusinessIdentityEnum getTabEnum() { + return BusinessIdentityEnum.PORTAL_USER; + } + + @Override + public PortalUserVO apply(PortalUser input) { + PortalUserVO vo = super.apply(input); + return vo; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalUserGroupConvert.java b/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalUserGroupConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..42ea1be4fcd83cfa907442fa38aaceab021590ee --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalUserGroupConvert.java @@ -0,0 +1,31 @@ +package com.idcos.enterprise.portal.convert; + +import com.idcos.enterprise.portal.biz.common.convert.BaseConvertFunction; +import com.idcos.enterprise.portal.dal.entity.PortalUserGroup; +import com.idcos.enterprise.portal.dal.enums.BusinessIdentityEnum; +import com.idcos.enterprise.portal.vo.PortalUserGroupVO; +import org.springframework.stereotype.Service; + +/** + * {controller.converClassName}对象转化类 , 第一次只是生成一个默认的convert + * <p>第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖</p> + * <p>这个类是泛型,需要你确定转化的target是什么,ConvertFunction中 Object 需要指定的是待转化为VO的对象class type,这里默认是Object</p> + * + * @author yanlv + * @version PortalUserGroupConvert.java, v 1.1 2015-06-09 09:11:34 yanlv Exp $ + */ +@Service +public class PortalUserGroupConvert extends BaseConvertFunction<PortalUserGroup, PortalUserGroupVO> { + + @Override + public BusinessIdentityEnum getTabEnum() { + return BusinessIdentityEnum.PORTAL_USER_GROUP; + } + + @Override + public PortalUserGroupVO apply(PortalUserGroup input) { + PortalUserGroupVO vo = super.apply(input); + vo.setTenantId(input.getTenant()); + return vo; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalUserGroupInfoConvert.java b/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalUserGroupInfoConvert.java new file mode 100644 index 0000000000000000000000000000000000000000..38e5c7a776ad65768267a63313d226a9e1d32ba3 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/convert/PortalUserGroupInfoConvert.java @@ -0,0 +1,67 @@ +package com.idcos.enterprise.portal.convert; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.idcos.enterprise.portal.biz.common.convert.BaseConvertFunction; +import com.idcos.enterprise.portal.dal.entity.PortalGroupRoleRel; +import com.idcos.enterprise.portal.dal.entity.PortalGroupUserRel; +import com.idcos.enterprise.portal.dal.entity.PortalUserGroup; +import com.idcos.enterprise.portal.dal.enums.BusinessIdentityEnum; +import com.idcos.enterprise.portal.dal.repository.PortalGroupRoleRelRepository; +import com.idcos.enterprise.portal.dal.repository.PortalGroupUserRelRepository; +import com.idcos.enterprise.portal.vo.PortalUserGroupVO; + +/** + * 用户组PO2VO转换类 + * + * @author jiaohuizhe + * @version $Id: PortalUserGroupVOConvert.java, v 0.1 2015年5月8日 下午12:33:32 jiaohuizhe Exp $ + */ +@Service +public class PortalUserGroupInfoConvert extends BaseConvertFunction<PortalUserGroup, PortalUserGroupVO> { + + @Autowired + private PortalGroupRoleRelRepository portalGroupRoleRelRepository; + @Autowired + private PortalGroupUserRelRepository portalGroupUserRelRepository; + + @Override + public PortalUserGroupVO apply(PortalUserGroup input) { + PortalUserGroupVO vo = super.apply(input); + vo.setTenantId(input.getTenant()); + // 加载角色信息,加载权限信息 + { + List<PortalGroupRoleRel> list = portalGroupRoleRelRepository.findByGroupId(input + .getId()); + String[] roles = new String[list.size()]; + + for (int i = 0; i < roles.length; i++) { + roles[i] = list.get(i).getRoleId(); + } + vo.setSelRoles(roles); + + } + + // 加载用户信息 + { + List<PortalGroupUserRel> list = portalGroupUserRelRepository.findByGroupId(input + .getId()); + String[] users = new String[list.size()]; + + for (int i = 0; i < users.length; i++) { + users[i] = list.get(i).getUserId(); + } + vo.setSelUsers(users); + } + return vo; + } + + @Override + public BusinessIdentityEnum getTabEnum() { + return BusinessIdentityEnum.PORTAL_USER_GROUP; + } + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/DalConfig.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/DalConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..c5ab3c3932f4e7f10c3567474975526b16d82cad --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/DalConfig.java @@ -0,0 +1,25 @@ +package com.idcos.enterprise.portal.dal; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.support.TransactionTemplate; + +/** + * @author zhouqin + * @version com.idcos.automate.dal.DalConfig.java, v 1.1 3/1/16 zhouqin Exp $ + */ +@Configuration +@EnableJpaAuditing +public class DalConfig { + + @Bean(name = "transactionTemplateRequiredNew") + public TransactionTemplate transactionTemplateRequiredNew(PlatformTransactionManager transactionManager) { + TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); + transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); + + return transactionTemplate; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/JwtUser.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/JwtUser.java new file mode 100644 index 0000000000000000000000000000000000000000..e63b5e632dc3b91e3e418eb6ed883c709b20deb9 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/JwtUser.java @@ -0,0 +1,91 @@ +package com.idcos.enterprise.portal.dal.entity; + +/** + * @author GuanBin + * @version JwtUser.java, v1 2017/9/25 下午4:05 GuanBin Exp $$ + */ +public class JwtUser { + + private String exp; + private String loginId; + private String name; + private String userId; + private String userName; + private String timeout; + private String tenantId; + private String tenantName; + private String tenantDisplayName; + + + public String getExp() { + return exp; + } + + public void setExp(String exp) { + this.exp = exp; + } + + public String getLoginId() { + return loginId; + } + + public void setLoginId(String loginId) { + this.loginId = loginId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getTimeout() { + return timeout; + } + + public void setTimeout(String timeout) { + this.timeout = timeout; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getTenantName() { + return tenantName; + } + + public void setTenantName(String tenantName) { + this.tenantName = tenantName; + } + + public String getTenantDisplayName() { + return tenantDisplayName; + } + + public void setTenantDisplayName(String tenantDisplayName) { + this.tenantDisplayName = tenantDisplayName; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalDept.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalDept.java new file mode 100644 index 0000000000000000000000000000000000000000..5d101cd1b3f07b192a91f27424b1b72ce2460ffa --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalDept.java @@ -0,0 +1,163 @@ +package com.idcos.enterprise.portal.dal.entity; + +// auto generated imports + +import com.idcos.cloud.core.common.BaseVO; +import org.hibernate.annotations.GenericGenerator; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import javax.persistence.*; +import java.io.Serializable; +import java.util.Date; + +/** + * 数据库配置文件自动生成,此文件属于自动生成的,具体可以参考codegen工程 + * Generated by <tt>jap-codgen</tt> on 2017-09-26 09:22:12. + * + * @author GuanBin + * @version com.idcos.cloud.core.dal.domain.portal.java, v 1.1 2015-09-15 09:22:12 yanlv Exp $ + */ + +@Entity +@Table(name = "PORTAL_DEPT") +@EntityListeners(AuditingEntityListener.class) +public class PortalDept extends BaseVO implements Serializable { + + private static final long serialVersionUID = 741231858441822688L; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO, generator = "custom-uuid") + @GenericGenerator(name = "custom-uuid", strategy = "com.idcos.enterprise.portal.dal.jpa.Uuid2Generator") + @Column(name = "ID") + private String id; + + @Column(name = "CODE") + private String code; + + @Column(name = "DISPLAY_NAME") + private String displayName; + + @Column(name = "PARENT_ID") + private String parentId; + + @Column(name = "STATUS") + private String status; + + @Column(name = "MANAGER_ID") + private String managerId; + + + @Column(name = "REMARK") + private String remark; + + @Column(name = "TENANT_ID") + private String tenantId; + + @Column(name = "SOURCE_TYPE") + private String sourceType = "native"; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "GMT_CREATE") + @org.springframework.data.annotation.CreatedDate + private Date gmtCreate; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "GMT_MODIFIED") + @org.springframework.data.annotation.LastModifiedDate + private Date gmtModified; + + //========== getters and setters ========== + + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getManagerId() { + return managerId; + } + + public void setManagerId(String managerId) { + this.managerId = managerId; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getSourceType() { + return sourceType; + } + + public void setSourceType(String sourceType) { + this.sourceType = sourceType; + } + + 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; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalDeptRoleRel.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalDeptRoleRel.java new file mode 100644 index 0000000000000000000000000000000000000000..616b545824c9fa3ddd6e2b7e30b41b8c5e258cf4 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalDeptRoleRel.java @@ -0,0 +1,68 @@ +package com.idcos.enterprise.portal.dal.entity; + +import com.idcos.cloud.core.common.BaseVO; +import com.idcos.cloud.core.dal.common.ColumnMeta; +import org.hibernate.annotations.GenericGenerator; + +import javax.persistence.*; +import java.io.Serializable; + +/** + * @author souakiragen + * @version $Id: , v 0.1 2017年11月04 下午3:28 souakiragen Exp $ + */ +@Entity +@Table(name = "PORTAL_DEPT_ROLE_REL") +public class PortalDeptRoleRel extends BaseVO implements Serializable { + + private static final long serialVersionUID = 741231858441822677L; + + //========== properties ========== + /** + * 数据库字段 <tt>ID</tt>. + */ + @Id + @GeneratedValue(strategy = GenerationType.AUTO, generator = "system-uuid") + @GenericGenerator(name = "system-uuid", strategy = "uuid2") + @Column(name = "ID") + @ColumnMeta(name = "ID", length = 64, description = "关系ID", pk = true, unique = false, nullable = false, scale = 0) + private String id; + + /** + * 数据库字段 <tt>DEPT_ID</tt>. + */ + @Column(name = "DEPT_ID") + @ColumnMeta(name = "DEPT_ID", length = 64, description = "部门ID", pk = false, unique = false, nullable = false, scale = 0) + private String deptId; + + /** + * 数据库字段 <tt>ROLE_ID</tt>. + */ + @Column(name = "ROLE_ID") + @ColumnMeta(name = "ROLE_ID", length = 64, description = "用户组ID", pk = false, unique = false, nullable = false, scale = 0) + private String roleId; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getDeptId() { + return deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + + public String getRoleId() { + return roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalGroupRoleRel.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalGroupRoleRel.java new file mode 100644 index 0000000000000000000000000000000000000000..6a6be6a2d631c926b712c18882ed985b7bbeeaba --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalGroupRoleRel.java @@ -0,0 +1,96 @@ +package com.idcos.enterprise.portal.dal.entity; + +// auto generated imports + +import com.idcos.cloud.core.common.BaseVO; +import com.idcos.cloud.core.dal.common.ColumnMeta; +import org.hibernate.annotations.GenericGenerator; + +import javax.persistence.*; +import java.io.Serializable; + +/** + * 数据库配置文件自动生成,此文件属于自动生成的,具体可以参考codegen工程 + * Generated by <tt>jap-codgen</tt> on 2015-10-30 15:06:50. + * + * @author system-user + * @version com.idcos.cloud.core.dal.domain.portal.java, v 1.1 2015-10-30 15:06:50 system-user Exp $ + */ + +@Entity +@Table(name = "PORTAL_GROUP_ROLE_REL") +public class PortalGroupRoleRel extends BaseVO implements Serializable { + + private static final long serialVersionUID = 741231858441822688L; + + //========== properties ========== + /** + * 数据库字段 <tt>ID</tt>. + */ + @Id + @GeneratedValue(strategy = GenerationType.AUTO, generator = "system-uuid") + @GenericGenerator(name = "system-uuid", strategy = "uuid2") + @Column(name = "ID") + @ColumnMeta(name = "ID", length = 64, description = "关系ID", pk = true, unique = false, nullable = false, scale = 0) + private String id; + + /** + * 数据库字段 <tt>ROLE_ID</tt>. + */ + @Column(name = "ROLE_ID") + @ColumnMeta(name = "ROLE_ID", length = 64, description = "角色ID", pk = false, unique = false, nullable = false, scale = 0) + private String roleId; + + /** + * 数据库字段 <tt>GROUP_ID</tt>. + */ + @Column(name = "GROUP_ID") + @ColumnMeta(name = "GROUP_ID", length = 64, description = "用户组ID", pk = false, unique = false, nullable = false, scale = 0) + private String groupId; + + + /** + * 数据库字段 <tt>GROUP_ID</tt>. + */ + @Column(name = "TENANT") + @ColumnMeta(name = "TENANT", length = 64, description = "租户id", pk = false, unique = false, nullable = false, scale = 0) + private String tenant; + + //========== getters and setters ========== + + + public String getTenant() { + return tenant; + } + + public void setTenant(String tenant) { + this.tenant = tenant; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + + public String getRoleId() { + return roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + + public String getGroupId() { + return groupId; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalGroupUserRel.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalGroupUserRel.java new file mode 100644 index 0000000000000000000000000000000000000000..c7af599609a94cd4ce287cd4662465ad0303e61d --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalGroupUserRel.java @@ -0,0 +1,99 @@ + + +package com.idcos.enterprise.portal.dal.entity; + +// auto generated imports + +import com.idcos.cloud.core.common.BaseVO; +import com.idcos.cloud.core.dal.common.ColumnMeta; +import org.hibernate.annotations.GenericGenerator; + +import javax.persistence.*; +import java.io.Serializable; + +/** + * 数据库配置文件自动生成,此文件属于自动生成的,具体可以参考codegen工程 + * Generated by <tt>jap-codgen</tt> on 2015-10-29 14:50:33. + * + * @author system-user + * @version com.idcos.cloud.core.dal.domain.portal.java, v 1.1 2015-10-29 14:50:33 system-user Exp $ + */ + +@Entity +@Table(name = "PORTAL_GROUP_USER_REL") +public class PortalGroupUserRel extends BaseVO implements Serializable { + + private static final long serialVersionUID = 741231858441822688L; + + //========== properties ========== + /** + * 数据库字段 <tt>ID</tt>. + */ + @Id + @GeneratedValue(strategy = GenerationType.AUTO, generator = "system-uuid") + @GenericGenerator(name = "system-uuid", strategy = "uuid2") + @Column(name = "ID") + @ColumnMeta(name = "ID", length = 64, description = "关系ID", pk = true, unique = false, nullable = false, scale = 0) + private String id; + + /** + * 数据库字段 <tt>USER_ID</tt>. + */ + @Column(name = "USER_ID") + @ColumnMeta(name = "USER_ID", length = 64, description = "用户ID", pk = false, unique = false, nullable = false, scale = 0) + private String userId; + + /** + * 数据库字段 <tt>GROUP_ID</tt>. + */ + @Column(name = "GROUP_ID") + @ColumnMeta(name = "GROUP_ID", length = 64, description = "用户组ID", pk = false, unique = false, nullable = false, scale = 0) + private String groupId; + + + /** + * 数据库字段 <tt>TENANT</tt>. + */ + @Column(name = "TENANT") + @ColumnMeta(name = "TENANT", length = 64, description = "租户code", pk = false, unique = false, nullable = false, scale = 0) + private String tenant; + + + //========== getters and setters ========== + + + public String getTenant() { + return tenant; + } + + public void setTenant(String tenant) { + this.tenant = tenant; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + + public String getGroupId() { + return groupId; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalPermission.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalPermission.java new file mode 100644 index 0000000000000000000000000000000000000000..eb7efc23d01abe1eec427f2d26963274eca66b10 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalPermission.java @@ -0,0 +1,152 @@ + + +package com.idcos.enterprise.portal.dal.entity; + +// auto generated imports + +import com.idcos.cloud.core.common.BaseVO; +import com.idcos.cloud.core.dal.common.ColumnMeta; +import org.hibernate.annotations.GenericGenerator; + +import javax.persistence.*; +import java.io.Serializable; + +/** + * 数据库配置文件自动生成,此文件属于自动生成的,具体可以参考codegen工程 + * Generated by <tt>jap-codgen</tt> on 2015-11-07 10:08:49. + * + * @author system-user + * @version com.idcos.cloud.core.dal.domain.portal.java, v 1.1 2015-11-07 10:08:49 system-user Exp $ + */ + +@Entity +@Table(name = "PORTAL_PERMISSION") +public class PortalPermission extends BaseVO implements Serializable { + + private static final long serialVersionUID = 741231858441822688L; + + //========== properties ========== + /** + * 数据库字段 <tt>ID</tt>. + */ + @Id + @GeneratedValue(strategy = GenerationType.AUTO, generator = "system-uuid") + @GenericGenerator(name = "system-uuid", strategy = "uuid2") + @Column(name = "ID") + @ColumnMeta(name = "ID", length = 64, description = "授权信息ID", pk = true, unique = false, nullable = false, scale = 0) + private String id; + + /** + * 数据库字段 <tt>APP_ID</tt>. + */ + @Column(name = "APP_ID") + @ColumnMeta(name = "APP_ID", length = 64, description = "应用系统名称", pk = false, unique = false, nullable = true, scale = 0) + private String appId; + + /** + * 数据库字段 <tt>AUTH_RES_TYPE</tt>. + */ + @Column(name = "AUTH_RES_TYPE") + @ColumnMeta(name = "AUTH_RES_TYPE", length = 64, description = "权限资源类型", pk = false, unique = false, nullable = false, scale = 0) + private String authResType; + + /** + * 数据库字段 <tt>AUTH_RES_NAME</tt>. + */ + @Column(name = "AUTH_RES_NAME") + @ColumnMeta(name = "AUTH_RES_NAME", length = 64, description = "权限资源名称", pk = false, unique = false, nullable = false, scale = 0) + private String authResName; + + /** + * 数据库字段 <tt>AUTH_RES_ID</tt>. + */ + @Column(name = "AUTH_RES_ID") + @ColumnMeta(name = "AUTH_RES_ID", length = 64, description = "权限资源ID", pk = false, unique = false, nullable = false, scale = 0) + private String authResId; + + /** + * 数据库字段 <tt>AUTH_OBJ_TYPE</tt>. + */ + @Column(name = "AUTH_OBJ_TYPE") + @ColumnMeta(name = "AUTH_OBJ_TYPE", length = 64, description = "授权对象类型", pk = false, unique = false, nullable = false, scale = 0) + private String authObjType; + + /** + * 数据库字段 <tt>AUTH_OBJ_ID</tt>. + */ + @Column(name = "AUTH_OBJ_ID") + @ColumnMeta(name = "AUTH_OBJ_ID", length = 64, description = "授权对象ID", pk = false, unique = false, nullable = false, scale = 0) + private String authObjId; + + /** + * 数据库字段 <tt>TENANT</tt>. + */ + @Column(name = "TENANT") + @ColumnMeta(name = "TENANT", length = 64, description = "租户code", pk = false, unique = false, nullable = true, scale = 0) + private String tenant; + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getTenant() { + return tenant; + } + + public void setTenant(String tenant) { + this.tenant = tenant; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getAuthResType() { + return authResType; + } + + public void setAuthResType(String authResType) { + this.authResType = authResType; + } + + public String getAuthResId() { + return authResId; + } + + public void setAuthResId(String authResId) { + this.authResId = authResId; + } + + public String getAuthObjType() { + return authObjType; + } + + public void setAuthObjType(String authObjType) { + this.authObjType = authObjType; + } + + public String getAuthObjId() { + return authObjId; + } + + public void setAuthObjId(String authObjId) { + this.authObjId = authObjId; + } + + public String getAuthResName() { + return authResName; + } + + public void setAuthResName(String authResName) { + this.authResName = authResName; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalResource.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalResource.java new file mode 100644 index 0000000000000000000000000000000000000000..fb91ee4dd830a74153e9668020f5ebd697b196c1 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalResource.java @@ -0,0 +1,155 @@ + + +package com.idcos.enterprise.portal.dal.entity; + +// auto generated imports + +import com.idcos.cloud.core.common.BaseVO; +import com.idcos.cloud.core.dal.common.ColumnMeta; +import org.hibernate.annotations.GenericGenerator; + +import javax.persistence.*; +import java.io.Serializable; + +/** + * 数据库配置文件自动生成,此文件属于自动生成的,具体可以参考codegen工程 + * Generated by <tt>jap-codgen</tt> on 2015-11-10 15:13:07. + * + * @author system-user + * @version com.idcos.cloud.core.dal.domain.portal.java, v 1.1 2015-11-10 15:13:07 system-user Exp $ + */ + +@Entity +@Table(name = "PORTAL_RESOURCE") +public class PortalResource extends BaseVO implements Serializable { + + private static final long serialVersionUID = 741231858441822688L; + + //========== properties ========== + /** + * 数据库字段 <tt>ID</tt>. + */ + @Id + @GeneratedValue(strategy = GenerationType.AUTO, generator = "system-uuid") + @GenericGenerator(name = "system-uuid", strategy = "uuid2") + @Column(name = "ID") + @ColumnMeta(name = "ID", length = 64, description = "主键ID", pk = true, unique = false, nullable = false, scale = 0) + private String id; + + /** + * 数据库字段 <tt>CODE</tt>. + */ + @Column(name = "CODE") + @ColumnMeta(name = "CODE", length = 64, description = "权限编码", pk = false, unique = false, nullable = false, scale = 0) + private String code; + + /** + * 数据库字段 <tt>NAME</tt>. + */ + @Column(name = "NAME") + @ColumnMeta(name = "NAME", length = 128, description = "权限名称", pk = false, unique = false, nullable = false, scale = 0) + private String name; + + /** + * 数据库字段 <tt>URL</tt>. + */ + @Column(name = "URL") + @ColumnMeta(name = "URL", length = 128, description = "权限数据url", pk = false, unique = false, nullable = false, scale = 0) + private String url; + + /** + * 数据库字段 <tt>APP_ID</tt>. + */ + @Column(name = "APP_ID") + @ColumnMeta(name = "APP_ID", length = 64, description = "系统名称", pk = false, unique = false, nullable = false, scale = 0) + private String appId; + + /** + * 数据库字段 <tt>REMARK</tt>. + */ + @Column(name = "REMARK") + @ColumnMeta(name = "REMARK", length = 256, description = "备注", pk = false, unique = false, nullable = true, scale = 0) + private String remark; + + /** + * 数据库字段 <tt>IS_ACTIVE</tt>. + */ + @Column(name = "IS_ACTIVE") + @ColumnMeta(name = "IS_ACTIVE", length = 1, description = "是否有效", pk = false, unique = false, nullable = true, scale = 0) + private String isActive; + + + /** + * 数据库字段 <tt>TENANT</tt>. + */ + @Column(name = "TENANT") + @ColumnMeta(name = "TENANT", length = 64, description = "租户code", pk = false, unique = false, nullable = false, scale = 0) + private String tenant; + //========== getters and setters ========== + + + public String getTenant() { + return tenant; + } + + public void setTenant(String tenant) { + this.tenant = tenant; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getIsActive() { + return isActive; + } + + public void setIsActive(String isActive) { + this.isActive = isActive; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String systemName) { + this.appId = systemName; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalRole.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalRole.java new file mode 100644 index 0000000000000000000000000000000000000000..7f165d1723245491941a5ccf9786c7b272b742d2 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalRole.java @@ -0,0 +1,208 @@ + + +package com.idcos.enterprise.portal.dal.entity; + +// auto generated imports + +import java.io.Serializable; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EntityListeners; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +import org.hibernate.annotations.GenericGenerator; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import com.idcos.cloud.core.common.BaseVO; + +/** + * 数据库配置文件自动生成,此文件属于自动生成的,具体可以参考codegen工程 + * Generated by <tt>jap-codgen</tt> on 2015-09-15 09:22:12. + * + * @author yanlv + * @version com.idcos.cloud.core.dal.domain.portal.java, v 1.1 2015-09-15 09:22:12 yanlv Exp $ + */ + +@Entity +@Table(name = "PORTAL_ROLE") +@EntityListeners(AuditingEntityListener.class) +public class PortalRole extends BaseVO implements Serializable { + + private static final long serialVersionUID = 741231858441822688L; + + //========== properties ========== + /** + * This property corresponds to db column <tt>ID</tt>. + * 字段备注:<tt>角色ID</tt> + * 字段类型:<tt>varchar</tt> + * 字段长度:<tt>64</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Id + @GeneratedValue(strategy = GenerationType.AUTO, generator = "system-uuid") + @GenericGenerator(name = "system-uuid", strategy = "uuid2") + @Column(name = "ID") + private String id; + + /** + * This property corresponds to db column <tt>CODE</tt>. + * 字段备注:<tt>角色编码</tt> + * 字段类型:<tt>varchar</tt> + * 字段长度:<tt>64</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Column(name = "CODE") + private String code; + + /** + * This property corresponds to db column <tt>NAME</tt>. + * 字段备注:<tt>角色名称</tt> + * 字段类型:<tt>varchar</tt> + * 字段长度:<tt>64</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Column(name = "NAME") + private String name; + + /** + * This property corresponds to db column <tt>REMARK</tt>. + * 字段备注:<tt>角色描述</tt> + * 字段类型:<tt>varchar</tt> + * 字段长度:<tt>256</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Column(name = "REMARK") + private String remark; + + /** + * This property corresponds to db column <tt>CREATE_USER</tt>. + * 字段备注:<tt>创建人</tt> + * 字段类型:<tt>varchar</tt> + * 字段长度:<tt>64</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Column(name = "CREATE_USER") + @org.springframework.data.annotation.CreatedBy + private String createUser; + + /** + * This property corresponds to db column <tt>GMT_CREATE</tt>. + * 字段备注:<tt>创建时间</tt> + * 字段类型:<tt>datetime</tt> + * 字段长度:<tt>19</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "GMT_CREATE") + @org.springframework.data.annotation.CreatedDate + private Date gmtCreate; + + /** + * This property corresponds to db column <tt>GMT_MODIFIED</tt>. + * 字段备注:<tt>最后修改时间</tt> + * 字段类型:<tt>datetime</tt> + * 字段长度:<tt>19</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "GMT_MODIFIED") + @org.springframework.data.annotation.LastModifiedDate + private Date gmtModified; + + /** + * This property corresponds to db column <tt>IS_ACTIVE</tt>. + * 字段备注:<tt>是否有效</tt> + * 字段类型:<tt>char</tt> + * 字段长度:<tt>1</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Column(name = "IS_ACTIVE") + private String isActive; + + @Column(name = "TENANT") + private String tenant; + + + //========== getters and setters ========== + + + public String getTenant() { + return tenant; + } + + public void setTenant(String tenant) { + this.tenant = tenant; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + 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 getIsActive() { + return isActive; + } + + public void setIsActive(String isActive) { + this.isActive = isActive; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalSysDict.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalSysDict.java new file mode 100644 index 0000000000000000000000000000000000000000..ed4c072ed11393ffb33e4273cb7572bf95beb395 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalSysDict.java @@ -0,0 +1,151 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.dal.entity; + +import com.idcos.cloud.core.common.BaseVO; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import javax.persistence.*; +import java.io.Serializable; + +/** + * @author Dana + * @version PortalSysDict.java, v1 2017/11/24 上午1:40 Dana Exp $$ + */ +@Entity +@Table(name = "PORTAL_SYS_DICT") +@IdClass(PortalSysDict.PortalSysDictPrimarkKey.class) +@EntityListeners(AuditingEntityListener.class) +public class PortalSysDict extends BaseVO implements Serializable { + + private static final long serialVersionUID = 741231858441822677L; + + //========== properties ========== + /** + * This property corresponds to db column <tt>TYPE_CODE</tt>. + * 字段备注:<tt>系统字典类型编码</tt> + * 字段类型:<tt>varchar</tt> + * 字段长度:<tt>64</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Id + @Column(name = "TYPE_CODE") + private String typeCode; + + /** + * This property corresponds to db column <tt>CODE</tt>. + * 字段备注:<tt>系统字典编码</tt> + * 字段类型:<tt>varchar</tt> + * 字段长度:<tt>64</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Id + @Column(name = "CODE") + private String code; + + /** + * This property corresponds to db column <tt>VALUE</tt>. + * 字段备注:<tt>参数值</tt> + * 字段类型:<tt>text</tt> + * 可否为空:<tt>可为空</tt> + */ + @Column(name = "VALUE") + private String value; + + /** + * This property corresponds to db column <tt>TENANT_ID</tt>. + * 字段备注:<tt>租户</tt> + * 字段类型:<tt>varchar</tt> + * 字段长度:<tt>64</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Id + @Column(name = "TENANT_ID") + private String tenantId; + + /** + * This property corresponds to db column <tt>REMARK</tt>. + * 字段备注:<tt>说明</tt> + * 字段类型:<tt>text</tt> + * 可否为空:<tt>可为空</tt> + */ + @Column(name = "REMARK") + private String remark; + + public String getTypeCode() { + return typeCode; + } + + public void setTypeCode(String typeCode) { + this.typeCode = typeCode; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public static class PortalSysDictPrimarkKey implements Serializable { + private static final long serialVersionUID = 741231858441822666L; + + private String typeCode; + + private String code; + + private String tenantId; + + public String getTypeCode() { + return typeCode; + } + + public void setTypeCode(String typeCode) { + this.typeCode = typeCode; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalTenant.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalTenant.java new file mode 100644 index 0000000000000000000000000000000000000000..24abc345024f93fae20b5f7f657951c266aa0dd9 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalTenant.java @@ -0,0 +1,116 @@ + + +package com.idcos.enterprise.portal.dal.entity; + +// auto generated imports + +import com.idcos.cloud.core.common.BaseVO; +import com.idcos.cloud.core.dal.common.ColumnMeta; +import org.hibernate.annotations.GenericGenerator; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import javax.persistence.*; +import java.io.Serializable; +import java.util.Date; + +/** + * 数据库配置文件自动生成,此文件属于自动生成的,具体可以参考codegen工程 + * Generated by <tt>jap-codgen</tt> on 2017-09-26 09:22:12. + * + * @author GuanBin + * @version com.idcos.cloud.core.dal.domain.portal.java, v 1.1 2015-09-15 09:22:12 yanlv Exp $ + */ + +@Entity +@Table(name = "PORTAL_TENANT") +@EntityListeners(AuditingEntityListener.class) +public class PortalTenant extends BaseVO implements Serializable { + + private static final long serialVersionUID = 741231858441822688L; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO, generator = "system-uuid") + @GenericGenerator(name = "system-uuid", strategy = "uuid2") + @Column(name = "ID") + private String id; + + @Column(name = "NAME") + private String name; + + @Column(name = "DISPLAY_NAME") + private String displayName; + + + /** + * This property corresponds to db column <tt>GMT_CREATE</tt>. + * 字段备注:<tt>创建时间</tt> + * 字段类型:<tt>datetime</tt> + * 字段长度:<tt>19</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "GMT_CREATE") + @ColumnMeta(name = "GMT_CREATE", length = 19, description = "", pk = false, unique = false, nullable = false, scale = 0) + @org.springframework.data.annotation.CreatedDate + private Date gmtCreate; + + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "GMT_MODIFIED") + @org.springframework.data.annotation.LastModifiedDate + private Date gmtModified; + + @Column(name = "IS_ACTIVE") + private String isActive; + + //========== getters and setters ========== + + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + 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 getIsActive() { + return isActive; + } + + public void setIsActive(String isActive) { + this.isActive = isActive; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalToken.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalToken.java new file mode 100644 index 0000000000000000000000000000000000000000..727e733e33ece2ee901899730a6dfc7134bbd63b --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalToken.java @@ -0,0 +1,200 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.dal.entity; + +import com.idcos.cloud.core.common.BaseVO; + +import javax.persistence.*; +import java.io.Serializable; +import java.util.Date; + +/** + * @author Dana + * @version PortalToken.java, v1 2017/11/30 上午1:01 Dana Exp $$ + */ +@Entity +@Table(name = "PORTAL_TOKEN", + indexes = {@Index(columnList = "TOKEN_CRC")}) +public class PortalToken extends BaseVO implements Serializable { + private static final long serialVersionUID = 741231858441822655L; + + //========== properties ========== + /** + * This property corresponds to db column <tt>ID</tt>. + * 字段备注:<tt>主键</tt> + * 字段类型:<tt>varchar</tt> + * 字段长度:<tt>64</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Id + @Column(name = "ID") + private String id; + + /** + * This property corresponds to db column <tt>NAME</tt>. + * 字段备注:<tt>token值</tt> + * 字段类型:<tt>text</tt> + * 字段长度:<tt>未定义</tt> + * 可否为空:<tt>可为空</tt> + */ + @Column(name = "NAME") + private String name; + + /** + * This property corresponds to db column <tt>TOKEN_CRC</tt>. + * 字段备注:<tt>token串的crc哈希值</tt> + * 字段类型:<tt>int unsigned</tt> + * 字段长度:<tt>未定义</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Column(name = "TOKEN_CRC") + private long tokenCrc; + + /** + * This property corresponds to db column <tt>LOGIN_ID</tt>. + * 字段备注:<tt>登录名</tt> + * 字段类型:<tt>varchar</tt> + * 字段长度:<tt>64</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Column(name = "LOGIN_ID") + private String loginId; + + /** + * This property corresponds to db column <tt>TENANT_ID</tt>. + * 字段备注:<tt>租户code</tt> + * 字段类型:<tt>varchar</tt> + * 字段长度:<tt>64</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Column(name = "TENANT_ID") + private String tenantId; + + /** + * This property corresponds to db column <tt>IS_ACTIVE</tt>. + * 字段备注:<tt>是否可用</tt> + * 字段类型:<tt>char</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Column(name = "IS_ACTIVE") + private String isActive; + + /** + * This property corresponds to db column <tt>EXPIRE_TIME</tt>. + * 字段备注:<tt>token过期时间</tt> + * 字段类型:<tt>DATETIME</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Column(name = "EXPIRE_TIME") + private Date expireTime; + + /** + * This property corresponds to db column <tt>GMT_CREATE</tt>. + * 字段备注:<tt>创建日期</tt> + * 字段类型:<tt>DATETIME</tt> + * 可否为空:<tt>可为空</tt> + */ + @Column(name = "GMT_CREATE") + private Date gmtCreate; + + /** + * This property corresponds to db column <tt>GMT_MODIFIED</tt>. + * 字段备注:<tt>修改日期</tt> + * 字段类型:<tt>DATETIME</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Column(name = "GMT_MODIFIED") + private Date gmtModified; + + /** + * This property corresponds to db column <tt>REMARK</tt>. + * 字段备注:<tt>备注</tt> + * 字段类型:<tt>DATETIME</tt> + * 可否为空:<tt>可为空</tt> + */ + @Column(name = "REMARK") + private String remark; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public long getTokenCrc() { + return tokenCrc; + } + + public void setTokenCrc(long tokenCrc) { + this.tokenCrc = tokenCrc; + } + + public String getLoginId() { + return loginId; + } + + public void setLoginId(String loginId) { + this.loginId = loginId; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getIsActive() { + return isActive; + } + + public void setIsActive(String isActive) { + this.isActive = isActive; + } + + public Date getExpireTime() { + return expireTime; + } + + public void setExpireTime(Date expireTime) { + this.expireTime = expireTime; + } + + 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 getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalUser.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalUser.java new file mode 100644 index 0000000000000000000000000000000000000000..3fe6c9e86b1fcdc2cbf95acad7d77bdfbf6f5bd4 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalUser.java @@ -0,0 +1,302 @@ + + +package com.idcos.enterprise.portal.dal.entity; + +// auto generated imports + +import com.idcos.cloud.core.common.BaseVO; +import org.hibernate.annotations.GenericGenerator; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import javax.persistence.*; +import java.io.Serializable; +import java.util.Date; + +/** + * 数据库配置文件自动生成,此文件属于自动生成的,具体可以参考codegen工程 + * Generated by <tt>jap-codgen</tt> on 2015-09-15 09:22:12. + * + * @author yanlv + * @version com.idcos.cloud.core.dal.domain.portal.java, v 1.1 2015-09-15 09:22:12 yanlv Exp $ + */ + +@Entity +@Table(name = "PORTAL_USER") +@EntityListeners(AuditingEntityListener.class) +public class PortalUser extends BaseVO implements Serializable { + + private static final long serialVersionUID = 741231858441822688L; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO, generator = "custom-uuid") + @GenericGenerator(name = "custom-uuid", strategy = "com.idcos.enterprise.portal.dal.jpa.Uuid2Generator") + @Column(name = "ID") + private String id; + + @Column(name = "LOGIN_ID") + private String loginId; + + @Column(name = "NAME") + private String name; + + @Column(name = "DEPT_ID") + private String deptId; + + @Column(name = "TITLE") + private String title; + + @Column(name = "MOBILE1") + private String mobile1; + + @Column(name = "MOBILE2") + private String mobile2; + + @Column(name = "OFFICE_TEL1") + private String officeTel1; + + @Column(name = "RTX") + private String rtx; + + @Column(name = "OFFICE_TEL2") + private String officeTel2; + + @Column(name = "EMPLOYEE_TYPE") + private String employeeType; + + @Column(name = "WEIXIN") + private String weixin; + + @Column(name = "EMAIL") + private String email; + + @Column(name = "IS_ACTIVE") + private String isActive; + + @Column(name = "STATUS") + private String status; + + @Column(name = "REMARK") + private String remark; + + @Column(name = "TENANT_ID") + private String tenantId; + + @Column(name = "SOURCE_TYPE") + private String sourceType = "native"; + + @Column(name = "CREATE_USER") + private String createUser; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "CREATE_TIME") + @org.springframework.data.annotation.CreatedDate + private Date createTime; + + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "LAST_MODIFIED_TIME") + @org.springframework.data.annotation.LastModifiedDate + private Date lastModifiedTime; + + @Column(name = "LAST_LOGIN_TIME") + private Date lastLoginTime; + + @Column(name = "PASSWORD") + private String password; + + @Column(name = "SALT") + private String salt; + + //========== getters and setters ========== + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLoginId() { + return loginId; + } + + public void setLoginId(String loginId) { + this.loginId = loginId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDeptId() { + return deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getMobile1() { + return mobile1; + } + + public void setMobile1(String mobile1) { + this.mobile1 = mobile1; + } + + public String getMobile2() { + return mobile2; + } + + public void setMobile2(String mobile2) { + this.mobile2 = mobile2; + } + + public String getRtx() { + return rtx; + } + + public void setRtx(String rtx) { + this.rtx = rtx; + } + + public String getOfficeTel1() { + return officeTel1; + } + + public void setOfficeTel1(String officeTel1) { + this.officeTel1 = officeTel1; + } + + public String getOfficeTel2() { + return officeTel2; + } + + public void setOfficeTel2(String officeTel2) { + this.officeTel2 = officeTel2; + } + + public String getEmployeeType() { + return employeeType; + } + + public void setEmployeeType(String employeeType) { + this.employeeType = employeeType; + } + + public String getWeixin() { + return weixin; + } + + public void setWeixin(String weixin) { + this.weixin = weixin; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getIsActive() { + return isActive; + } + + public void setIsActive(String isActive) { + this.isActive = isActive; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getSourceType() { + return sourceType; + } + + public void setSourceType(String sourceType) { + this.sourceType = sourceType; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getLastModifiedTime() { + return lastModifiedTime; + } + + public void setLastModifiedTime(Date lastModifiedTime) { + this.lastModifiedTime = lastModifiedTime; + } + + public Date getLastLoginTime() { + return lastLoginTime; + } + + public void setLastLoginTime(Date lastLoginTime) { + this.lastLoginTime = lastLoginTime; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getSalt() { + return salt; + } + + public void setSalt(String salt) { + this.salt = salt; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalUserGroup.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalUserGroup.java new file mode 100644 index 0000000000000000000000000000000000000000..abaab6ea7c54548027b51474f507f6e1d9e2eab6 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/entity/PortalUserGroup.java @@ -0,0 +1,198 @@ + + +package com.idcos.enterprise.portal.dal.entity; + +// auto generated imports + +import com.idcos.cloud.core.common.BaseVO; +import com.idcos.cloud.core.dal.common.ColumnMeta; +import org.hibernate.annotations.GenericGenerator; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import javax.persistence.*; +import java.io.Serializable; +import java.util.Date; + +/** + * 数据库配置文件自动生成,此文件属于自动生成的,具体可以参考codegen工程 + * Generated by <tt>jap-codgen</tt> on 2015-09-15 09:22:12. + * + * @author yanlv + * @version com.idcos.cloud.core.dal.domain.portal.java, v 1.1 2015-09-15 09:22:12 yanlv Exp $ + */ + +@Entity +@Table(name = "PORTAL_USER_GROUP") +@EntityListeners(AuditingEntityListener.class) +public class PortalUserGroup extends BaseVO implements Serializable { + + private static final long serialVersionUID = 741231858441822688L; + + //========== properties ========== + /** + * This property corresponds to db column <tt>ID</tt>. + * 字段备注:<tt>用户组ID</tt> + * 字段类型:<tt>varchar</tt> + * 字段长度:<tt>64</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Id + @GeneratedValue(strategy = GenerationType.AUTO, generator = "system-uuid") + @GenericGenerator(name = "system-uuid", strategy = "uuid2") + @Column(name = "ID") + private String id; + + /** + * This property corresponds to db column <tt>NAME</tt>. + * 字段备注:<tt>用户组名称</tt> + * 字段类型:<tt>varchar</tt> + * 字段长度:<tt>128</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Column(name = "NAME") + private String name; + + /** + * This property corresponds to db column <tt>NAME</tt>. + * 字段备注:<tt>用户组名称</tt> + * 字段类型:<tt>varchar</tt> + * 字段长度:<tt>128</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Column(name = "TYPE") + private String type; + + /** + * This property corresponds to db column <tt>REMARK</tt>. + * 字段备注:<tt>备注</tt> + * 字段类型:<tt>varchar</tt> + * 字段长度:<tt>256</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Column(name = "REMARK") + private String remark; + + /** + * This property corresponds to db column <tt>CREATE_USER</tt>. + * 字段备注:<tt>创建人</tt> + * 字段类型:<tt>varchar</tt> + * 字段长度:<tt>64</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Column(name = "CREATE_USER") + private String createUser; + + /** + * This property corresponds to db column <tt>GMT_CREATE</tt>. + * 字段备注:<tt>创建时间</tt> + * 字段类型:<tt>datetime</tt> + * 字段长度:<tt>19</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "GMT_CREATE") + @ColumnMeta(name = "GMT_CREATE", length = 19, description = "", pk = false, unique = false, nullable = false, scale = 0) + @org.springframework.data.annotation.CreatedDate + private Date gmtCreate; + + /** + * This property corresponds to db column <tt>GMT_MODIFIED</tt>. + * 字段备注:<tt>最后修改时间</tt> + * 字段类型:<tt>datetime</tt> + * 字段长度:<tt>19</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Temporal(TemporalType.TIMESTAMP) + @Column(name = "GMT_MODIFIED") + @ColumnMeta(name = "GMT_MODIFIED", length = 19, description = "", pk = false, unique = false, nullable = true, scale = 0) + @org.springframework.data.annotation.LastModifiedDate + private Date gmtModified; + + /** + * This property corresponds to db column <tt>IS_ACTIVE</tt>. + * 字段备注:<tt>是否有效</tt> + * 字段类型:<tt>char</tt> + * 字段长度:<tt>1</tt> + * 可否为空:<tt>不可为空</tt> + */ + @Column(name = "IS_ACTIVE") + private String isActive; + + @Column(name = "TENANT") + private String tenant; + + //========== getters and setters ========== + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTenant() { + return tenant; + } + + public void setTenant(String tenant) { + this.tenant = tenant; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + 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 getIsActive() { + return isActive; + } + + public void setIsActive(String isActive) { + this.isActive = isActive; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/ArrayNumEnum.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/ArrayNumEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..f9c571279e2cef4f1fa6ea89a2297f56e5e05cfa --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/ArrayNumEnum.java @@ -0,0 +1,89 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2018 All Rights Reserved. + */ +package com.idcos.enterprise.portal.dal.enums; + +/** + * @author Xizhao.Dai + * @version ArrayNumEnum.java, v1 2018/4/29 下午5:35 Xizhao.Dai Exp $$ + */ +public enum ArrayNumEnum { + /** + * 0 + */ + ZERO(0, "0"), + /** + * 1 + */ + ONE(1, "1"), + /** + * 2 + */ + TWO(2, "2"), + /** + * 3 + */ + THREE(3, "3"), + /** + * 4 + */ + FOUR(4, "4"), + /** + * 5 + */ + FIVE(5, "5"), + /** + * 6 + */ + SIX(6, "6"), + /** + * 7 + */ + SEVEN(7, "7"), + /** + * 8 + */ + EIGHT(8, "8"), + /** + * 9 + */ + NINE(9, "9"), + /** + * 10 + */ + TEN(10, "10"); + + /** + * 枚举code + */ + private int code; + + /** + * 枚举描述 + */ + private String description; + + ArrayNumEnum(int code, String description) { + this.code = code; + + this.description = description; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/AuthObjTypeEnum.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/AuthObjTypeEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..a3d6fdf242179e5608221f8431c4c1b706bfb2e8 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/AuthObjTypeEnum.java @@ -0,0 +1,30 @@ +package com.idcos.enterprise.portal.dal.enums; + +/** + * @author + * @version PortalFilterUtil.java, v1 2017/11/18 下午6:22 Exp $$ + */ +public enum AuthObjTypeEnum { + /** + * ROLE + */ + ROLE("ROLE"), + /** + * NETSEG + */ + NETSEG("NETSEG"); + + private String code; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + AuthObjTypeEnum(String code) { + this.code = code; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/BusinessIdentityEnum.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/BusinessIdentityEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..6cc7c4a1e2cbd286d978e712c2ecbe42f8449666 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/BusinessIdentityEnum.java @@ -0,0 +1,81 @@ +/** + * yunjikeji Inc. + * Copyright (c) 2004-2015 All Rights Reserved. + */ +package com.idcos.enterprise.portal.dal.enums; + +/** + * 业务实体枚举信息,表述具体的实体对象 + * + * @author yanlv + * @version $Id: DeviceActiveEnum.java, v 0.1 2015年3月18日 下午8:12:24 yanlv Exp $ + */ +public enum BusinessIdentityEnum { + /** + * 角色信息 + */ + PORTAL_ROLE("PORTAL_ROLE", "portalRoleRepository", "角色信息"), + /** + * 用户信息 + */ + PORTAL_USER("PORTAL_USER", "portalUserRepository", "用户信息"), + /** + * 用户组信息 + */ + PORTAL_USER_GROUP("PORTAL_USER_GROUP", "portalUserGroupRepository", "用户组信息"), + /** + * 授权信息信息 + */ + PORTAL_PERMISSION("PORTAL_PERMISSION", "portalPermissionRepository", "授权信息信息"), + /** + * 权限资源管理 + */ + PORTAL_RESOURCE("PORTAL_RESOURCE", "portalResourceRepository", "权限资源管理"), + + ; + /** + * 枚举code + */ + private String code; + + /** + * 实体 repository 对应的bean name + */ + private String beanName; + + /** + * 枚举描述 + */ + private String description; + + private BusinessIdentityEnum(String code, String beanName, String description) { + this.code = code; + this.beanName = beanName; + this.description = description; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getBeanName() { + return beanName; + } + + public void setBeanName(String beanName) { + this.beanName = beanName; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/Customer.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/Customer.java new file mode 100644 index 0000000000000000000000000000000000000000..b5e300c81b30e1ecd71662f90858514b071d7c4a --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/Customer.java @@ -0,0 +1,55 @@ +package com.idcos.enterprise.portal.dal.enums; + +/** + * @Author: Dai + * @Date: 2018/10/28 3:20 AM + * @Description: + */ +public enum Customer { + /** + * 通用客户 + */ + DEFAULT("default", "通用客户"); + + /** + * 枚举code + */ + private String code; + + /** + * 枚举描述 + */ + private String description; + + private Customer(String code, String description) { + this.code = code; + + this.description = description; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public static Customer getByValue(String value) { + for (Customer customer : values()) { + if (customer.getCode().equals(value)) { + return customer; + } + } + //默认default用户 + return DEFAULT; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/FormInputTypeEnum.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/FormInputTypeEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..25d0ca411e836eddfb763dfd1eba011527cbdc7b --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/FormInputTypeEnum.java @@ -0,0 +1,66 @@ +/** + * 云霁科技网络技术有限公司 idcos.com Inc. + * Copyright (c) 2004-2015 All Rights Reserved. + */ +package com.idcos.enterprise.portal.dal.enums; + +/** + * @author jiaohuizhe + * @version $Id: FormInputTypeEnum.java, v 0.1 2015年10月12日 下午3:41:00 jiaohuizhe Exp $ + */ +public enum FormInputTypeEnum { + /** + * 文本框 + */ + INPUT("INPUT", "文本框"), + /** + * 下拉框 + */ + SELECT("SELECT", "下拉框"), + /** + * 复选框 + */ + CHECKBOX("CHECKBOX", "复选框"), + /** + * 单选框 + */ + RADIO("RADIO", "单选框"), + /** + * 文本域 + */ + TEXTAREA("TEXTAREA", "文本域"), + ; + + /** + * 枚举code + */ + private String code; + + /** + * 枚举描述 + */ + private String description; + + private FormInputTypeEnum(String code, String description) { + this.code = code; + + this.description = description; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/FormInputValueTypeEnum.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/FormInputValueTypeEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..a9132c6996e189f2818a2110b3a3040221c73695 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/FormInputValueTypeEnum.java @@ -0,0 +1,67 @@ +/** + * 云霁科技网络技术有限公司 idcos.com Inc. + * Copyright (c) 2004-2015 All Rights Reserved. + */ +package com.idcos.enterprise.portal.dal.enums; + +/** + * @author jiaohuizhe + * @version $Id: FormInputValueTypeEnum.java, v 0.1 2015年10月12日 下午3:41:00 jiaohuizhe Exp $ + */ +public enum FormInputValueTypeEnum { + /** + * 文本 + */ + TEXT("TEXT", "文本"), + /** + * 整数 + */ + INTEGER("INTEGER", "整数"), + /** + * 数值 + */ + NUMBER("NUMBER", "数值"), + /** + * 日期 + */ + DATE("DATE", "日期"), + /** + * JSON + */ + JSON("JSON", "JSON"), + + ; + + /** + * 枚举code + */ + private String code; + + /** + * 枚举描述 + */ + private String description; + + private FormInputValueTypeEnum(String code, String description) { + this.code = code; + + this.description = description; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/IsActiveEnum.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/IsActiveEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..2c08cc6c6e38431eb364225be39dcdb931dbd111 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/IsActiveEnum.java @@ -0,0 +1,60 @@ +/** + * yunjikeji Inc. + * Copyright (c) 2004-2015 All Rights Reserved. + */ +package com.idcos.enterprise.portal.dal.enums; + + +/** + * 信息是否激活 + * + * @author yanlv + * @version $Id: DeviceActiveEnum.java, v 0.1 2015年3月18日 下午8:12:24 yanlv Exp $ + */ +public enum IsActiveEnum { + /** + * 已激活 + */ + HAS_ACTIVE("Y", "已激活"), + /** + * 未激活 + */ + NO_ACTIVE("N", "未激活"), + + ; + + /** + * 枚举code + */ + private String code; + + /** + * 枚举描述 + */ + private String description; + + private IsActiveEnum(String code, String description) { + this.code = code; + + this.description = description; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + +} + + diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/LoginType.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/LoginType.java new file mode 100644 index 0000000000000000000000000000000000000000..8d31df1585765cc37077fa813d5faa600ac9f937 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/LoginType.java @@ -0,0 +1,17 @@ +package com.idcos.enterprise.portal.dal.enums; + +/** + * @Author: Dai + * @Date: 2018/10/28 4:47 AM + * @Description: + */ +public enum LoginType { + /** + * 默认登录方式 + */ + DEFAULT, + /** + * 微众银行登录方式 + */ + WEBANK, +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/PortalUserGroupTypeEnum.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/PortalUserGroupTypeEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..68d108fa99def4b95494cb298d683bdcc0debcb8 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/PortalUserGroupTypeEnum.java @@ -0,0 +1,50 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.dal.enums; + +/** + * 用户组类型 + * + * @author Dana + * @version PortalUserGroupTypeEnum.java, v1 2017/12/10 上午11:56 Dana Exp $$ + */ +public enum PortalUserGroupTypeEnum { + /** + * 默认用户组 + */ + DEFAULT("default", "默认用户组"); + /** + * 枚举code + */ + private String code; + + /** + * 枚举描述 + */ + private String description; + + PortalUserGroupTypeEnum(String code, String description) { + this.code = code; + + this.description = description; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/PortalUserStatusEnum.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/PortalUserStatusEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..6ad9508a469aafb0e1876893549f4a9ae0872e6e --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/PortalUserStatusEnum.java @@ -0,0 +1,63 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.dal.enums; + +/** + * 用户状态 + * + * @author Dana + * @version PortalUserStatusEnum.java, v1 2017/12/4 下午9:07 Dana Exp $$ + */ +public enum PortalUserStatusEnum { + /** + * 初始状态 + */ + INIT("INIT", "初始状态"), + /** + * 激活状态 + */ + ENABLED("ENABLED", "激活状态"), + /** + * 禁用状态 + */ + DISABLED("DISABLED", "禁用状态"), + /** + * 锁定状态 + */ + LOCKED("LOCKED", "锁定状态"); + + /** + * 枚举code + */ + private String code; + + /** + * 枚举描述 + */ + private String description; + + PortalUserStatusEnum(String code, String description) { + this.code = code; + + this.description = description; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/RbacMenuEnum.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/RbacMenuEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..2f553c1214d96a63cd3b0bcaccabb4e7f337cb66 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/RbacMenuEnum.java @@ -0,0 +1,54 @@ +package com.idcos.enterprise.portal.dal.enums; + +/** + * @author + * @version PortalFilterUtil.java, v1 2017/11/18 下午6:22 Exp $$ + */ +public enum RbacMenuEnum { + /** + * 用户管理 + */ + USER("USER", "用户管理"), + /** + * 用户组管理 + */ + GROUP("GROUP", "用户组管理"), + /** + * 角色管理 + */ + ROLE("ROLE", "角色管理"), + /** + * 权限资源管理 + */ + RESROUCE("RESOURCE", "权限资源管理"), + /** + * 权限资源分配 + */ + PERMISSION("PERMISSION", "权限资源分配"), + ; + + private String code; + + private String name; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + RbacMenuEnum(String code, String name) { + this.code = code; + this.name = name; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/SourceTypeEnum.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/SourceTypeEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..b2dad42879cd1df18e7461dd44ed93d72541165e --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/SourceTypeEnum.java @@ -0,0 +1,50 @@ +package com.idcos.enterprise.portal.dal.enums; + +/** + * @Author: Dai + * @Date: 2018/10/16 上午12:06 + * @Description: + */ +public enum SourceTypeEnum { + /** + * 本系统 + */ + NATIVE("native", "本系统"), + + /** + * WEBANK + */ + WEBANK("webank", "微众"); + + /** + * 枚举code + */ + private String code; + + /** + * 枚举描述 + */ + private String description; + + private SourceTypeEnum(String code, String description) { + this.code = code; + + this.description = description; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/StatusEnum.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/StatusEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..504992d06d3a597f7fb1e48e466c965d13aa1515 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/StatusEnum.java @@ -0,0 +1,54 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.dal.enums; + +/** + * @author souakiragen + * @version $Id: , v 0.1 2017年11月04 下午2:49 souakiragen Exp $ + */ +public enum StatusEnum { + /** + * 激活 + */ + Y("1", "激活"), + /** + * 删除 + */ + N("0", "删除"); + + /** + * 枚举code + */ + private String code; + + /** + * 枚举描述 + */ + private String description; + + private StatusEnum(String code, String description) { + this.code = code; + + this.description = description; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/TreeStyleEnum.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/TreeStyleEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..61b60e5e327671d1447a0a72aef42b7b7a8d6c16 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/TreeStyleEnum.java @@ -0,0 +1,58 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.dal.enums; + +/** + * @author souakiragen + * @version $Id: , v 0.1 2017年11月04 下午2:49 souakiragen Exp $ + */ +public enum TreeStyleEnum { + /** + * zTree + */ + Z_TREE("zTree", "zTree"), + /** + * ioTree + */ + IO_TREE("ioTree", "ioTree"), + /** + * all + */ + ALL("all", "all"); + + /** + * 枚举code + */ + private String code; + + /** + * 枚举描述 + */ + private String description; + + private TreeStyleEnum(String code, String description) { + this.code = code; + + this.description = description; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/TrueFalse.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/TrueFalse.java new file mode 100644 index 0000000000000000000000000000000000000000..54faac166003a47630cd1c9249dd94bfc23f9476 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/enums/TrueFalse.java @@ -0,0 +1,45 @@ +package com.idcos.enterprise.portal.dal.enums; + +/** + * @author admin + * @date 16/03/2017 + */ +public enum TrueFalse { + /** + * TRUE + */ + TRUE("true", "TRUE"), + /** + * FALSE + */ + FALSE("false", "FALSE"); + + /** + * 枚举编码 + */ + private String code; + + /** + * 枚举描述信息 + */ + private String description; + + /** + * @param code + * @param description + */ + private TrueFalse(String code, String description) { + + this.code = code; + this.description = description; + } + + public String getCode() { + return code; + } + + public String getDescription() { + return description; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/jpa/Uuid2Generator.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/jpa/Uuid2Generator.java new file mode 100644 index 0000000000000000000000000000000000000000..b7fd1a0b0c8d51eff584cc051a22f111be27dfe8 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/jpa/Uuid2Generator.java @@ -0,0 +1,35 @@ +/* + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2018 All Rights Reserved. + */ +package com.idcos.enterprise.portal.dal.jpa; + +import com.idcos.cloud.core.common.BaseVO; +import com.idcos.cloud.core.common.util.FieldUtil; +import org.hibernate.HibernateException; +import org.hibernate.engine.spi.SessionImplementor; +import org.hibernate.id.UUIDGenerator; + +import java.io.Serializable; + +/** + * 自定义UUID生成器 + * + * @author sevenlin + * @version Uuid2Generator.java, v1 2018/9/27 14:42 sevenlin Exp $$ + */ +public class Uuid2Generator extends UUIDGenerator { + + @Override + public Serializable generate(SessionImplementor session, Object object) throws HibernateException { + // 如果存在自定义ID则使用自定义ID + if (object instanceof BaseVO) { + Object id = FieldUtil.readField(object, "id"); + if (id != null) { + return (Serializable) id; + } + } + return super.generate(session, object); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalDeptRepository.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalDeptRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..33966585c5739fa1602fbb6a023a8427c626e48f --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalDeptRepository.java @@ -0,0 +1,88 @@ + + +package com.idcos.enterprise.portal.dal.repository; + +// auto generated imports + +import com.idcos.cloud.core.dal.common.jpa.BaseRepository; +import com.idcos.enterprise.portal.dal.entity.PortalDept; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; + +/** + * 自动生成PortalRoleRepository + * <p> + * 数据库配置文件自动生成,此文件属于自动生成的,具体可以参考codegen工程 + * Generated by <tt>jap-codgen</tt> on 2017-09-26 09:22:12. + * + * @author GuanBin + * @version PortalRoleRepository.java, v 1.1 2017-09-26 09:22:12 yanlv Exp $ + */ +public interface PortalDeptRepository extends BaseRepository<PortalDept, String> { + /** + * findAllDeptByTenantId + * + * @param tenantId + * @return + */ + @Query("select u from PortalDept u where u.tenantId = ?1 and u.status = '1'") + List<PortalDept> findAllDeptByTenantId(String tenantId); + + /** + * findAllByIsActive + * + * @return + */ + @Query("select u from PortalDept u where u.status = '1'") + List<PortalDept> findAllByIsActive(); + + /** + * findAllSyncDept + * + * @param sourceType + * @return + */ + @Query("select u from PortalDept u where u.sourceType =?1 and u.status ='1'") + List<PortalDept> findAllSyncDept(String sourceType); + + /** + * findByDeptId + * + * @param id + * @return + */ + @Query("select d from PortalDept d where d.id = ?1 and d.status = '1'") + PortalDept findByDeptId(String id); + + /** + * findByParentId + * + * @param id + * @return + */ + @Query("select dept from PortalDept dept where dept.parentId= ?1 and dept.status = '1'") + List<PortalDept> findByParentId(String id); + + /** + * 根据部门名称、tenantId和parentId查询部门 + * + * @param displayName + * @param tenantId + * @param parentId + * @return + */ + @Query("select dept from PortalDept dept where dept.displayName=?1 and dept.tenantId=?2 and dept.parentId =?3 and dept.status = '1'") + PortalDept findByDeptNameAndParentIdAndTenantId(String displayName, String tenantId, String parentId); + + /** + * 根据部门名称、tenantId和parentId为空查询部门 + * + * @param displayName + * @param tenantId + * @return + */ + @Query("select dept from PortalDept dept where dept.displayName=?1 and dept.tenantId=?2 and dept.status = '1' and (dept.parentId is null or dept.parentId='')") + PortalDept findByDeptNameAndTenantId(String displayName, String tenantId); + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalDeptRoleRelRepository.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalDeptRoleRelRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..7bbe0627876d89b62505145b80cab01d150aac92 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalDeptRoleRelRepository.java @@ -0,0 +1,38 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.dal.repository; + +import com.idcos.cloud.core.dal.common.jpa.BaseRepository; +import com.idcos.enterprise.portal.dal.entity.PortalDeptRoleRel; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; + +/** + * @author souakiragen + * @version $Id: , v 0.1 2017年11月04 下午3:37 souakiragen Exp $ + */ +public interface PortalDeptRoleRelRepository extends BaseRepository<PortalDeptRoleRel, String> { + /** + * 根据部门id删除 + * + * @param deptId + * @return + */ + @Query("delete from PortalDeptRoleRel dr where dr.deptId = ?1") + @Modifying + int deleteByDeptId(String deptId); + + /** + * 根据部门id查找 + * + * @param deptId + * @return + */ + @Query("select r from PortalDeptRoleRel r where r.deptId = ?1") + List<PortalDeptRoleRel> findByDeptId(String deptId); +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalGroupRoleRelRepository.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalGroupRoleRelRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..cc1d65e9500b719efd5c5a2c7b3d184e7e8ee1f4 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalGroupRoleRelRepository.java @@ -0,0 +1,60 @@ + + +package com.idcos.enterprise.portal.dal.repository; + +// auto generated imports + +import java.util.List; + +import com.idcos.enterprise.portal.dal.entity.PortalGroupRoleRel; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; + +import com.idcos.cloud.core.dal.common.jpa.BaseRepository; + +/** + * 自动生成PortalGroupRoleRelRepository + * <p> + * 数据库配置文件自动生成,此文件属于自动生成的,具体可以参考codegen工程 + * Generated by <tt>jap-codgen</tt> on 2015-10-30 15:06:50. + * + * @author system-user + * @version PortalGroupRoleRelRepository.java, v 1.1 2015-10-30 15:06:50 system-user Exp $ + */ +public interface PortalGroupRoleRelRepository extends BaseRepository<PortalGroupRoleRel, String> { + + + /** + * <p> + * The jql statement for this operation is <br> + * + * @param roleId + * @return List<PortalGroupRoleRel> + */ + public List<PortalGroupRoleRel> findByRoleId(String roleId); + + + /** + * <p> + * The jql statement for this operation is <br> + * + * @param groupId + * @return List<PortalGroupRoleRel> + */ + public List<PortalGroupRoleRel> findByGroupId(String groupId); + + + /** + * <p> + * The jql statement for this operation is <br> + * <tt>delete from PortalGroupRoleRel t where t.groupId = ?1 and t.roleId = ?2</tt> + * + * @param groupId + * @param roleId + * @return int + */ + @Query("delete from PortalGroupRoleRel t where t.groupId = ?1 and t.roleId = ?2") + @Modifying + public int deleteByGroupIdAndRoleId(String groupId, String roleId); + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalGroupUserRelRepository.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalGroupUserRelRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..f3d80f2c12d86339db20433b028a0ca866c49089 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalGroupUserRelRepository.java @@ -0,0 +1,66 @@ + + +package com.idcos.enterprise.portal.dal.repository; + +// auto generated imports + +import com.idcos.cloud.core.dal.common.jpa.BaseRepository; +import com.idcos.enterprise.portal.dal.entity.PortalGroupUserRel; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; + +/** + * 自动生成PortalGroupUserRelRepository + * <p> + * 数据库配置文件自动生成,此文件属于自动生成的,具体可以参考codegen工程 + * Generated by <tt>jap-codgen</tt> on 2015-10-29 14:50:33. + * + * @author system-user + * @version PortalGroupUserRelRepository.java, v 1.1 2015-10-29 14:50:33 system-user Exp $ + */ +public interface PortalGroupUserRelRepository extends BaseRepository<PortalGroupUserRel, String> { + + /** + * <p> + * The jql statement for this operation is <br> + * + * @param userId + * @return List<PortalGroupUserRel> + */ + List<PortalGroupUserRel> findByUserId(String userId); + + /** + * <p> + * The jql statement for this operation is <br> + * <tt>delete from PortalGroupUserRel t where t.groupId = ?1 and t.userId = ?2</tt> + * + * @param groupId + * @param userId + * @return int + */ + @Query("delete from PortalGroupUserRel t where t.groupId = ?1 and t.userId = ?2") + @Modifying + int deleteByGroupIdAndUserId(String groupId, String userId); + + /** + * 根据用户id删除 + * + * @param id + * @return + */ + @Modifying + @Query("delete from PortalGroupUserRel t where t.userId = ?1") + int deleteByUserId(String id); + + /** + * <p> + * The jql statement for this operation is <br> + * + * @param groupId + * @return List<PortalGroupUserRel> + */ + List<PortalGroupUserRel> findByGroupId(String groupId); + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalPermissionRepository.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalPermissionRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..008f747f869469b23f14a0992a43e9027f557a3f --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalPermissionRepository.java @@ -0,0 +1,105 @@ + + +package com.idcos.enterprise.portal.dal.repository; + +// auto generated imports + +import com.idcos.cloud.core.dal.common.jpa.BaseRepository; +import com.idcos.enterprise.portal.dal.entity.PortalPermission; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; +import java.util.Set; + +/** + * 自动生成PortalPermissionRepository + * <p> + * 数据库配置文件自动生成,此文件属于自动生成的,具体可以参考codegen工程 + * Generated by <tt>jap-codgen</tt> on 2015-11-07 10:08:49. + * + * @author system-user + * @version PortalPermissionRepository.java, v 1.1 2015-11-07 10:08:49 system-user Exp $ + */ +public interface PortalPermissionRepository extends BaseRepository<PortalPermission, String> { + + /** + * <p> + * The jql statement for this operation is <br> + * <tt>select p.authResId from PortalPermission p where p.authObjType=?1 and p.authResType=?2 and p.authObjId=?3</tt> + * + * @param authObjType + * @param authResType + * @param authObjId + * @return List<String> + */ + @Query("select p from PortalPermission p where p.authObjType=?1 and p.authResType=?2 and p.authObjId=?3") + List<PortalPermission> queryAuthRes(String authObjType, String authResType, String authObjId); + + /** + * <p> + * The jql statement for this operation is <br> + * <tt>select p.authObjId from PortalPermission p where p.authObjType=?1 and p.authResType=?2 and p.authResId=?3</tt> + * + * @param authObjType + * @param authResType + * @param authResId + * @return List<String> + */ + @Query("select p from PortalPermission p where p.authObjType=?1 and p.authResType=?2 and p.authResId=?3") + List<PortalPermission> queryAuthObj(String authObjType, String authResType, String authResId); + + /** + * 根据appId和authResType查询权限 + * + * @param appId + * @param authResType + * @return + */ + @Query("select p from PortalPermission p where p.appId=?1 and p.authResType=?2") + List<PortalPermission> queryAuthObjByAppIdAndAuthResType(String appId, String authResType); + + /** + * <p> + * The jql statement for this operation is <br> + * <tt>delete from PortalPermission s where s.authResId = ?1 and s.authObjId = ?2</tt> + * + * @param authResId + * @param authObjId + * @return int + */ + @Query("delete from PortalPermission s where s.authResId = ?1 and s.authObjId = ?2") + @Modifying + int deleteByAuthResIdAndAuthObjId(String authResId, String authObjId); + + /** + * <p> + * The jql statement for this operation is <br> + * + * @param authObjType + * @param authObjId + * @return List<PortalPermission> + */ + List<PortalPermission> queryAuthResByAuthObjTypeAndAuthObjId(String authObjType, String authObjId); + + /** + * 根据authObjId查询权限 + * + * @param authObjId + * @return + */ + List<PortalPermission> findByAuthObjId(String authObjId); + + + /** + * <p> + * select distinct p.authResId from PortalPermission p where p.authObjType=?1 and p.authObjId in ?2<br> + * + * @param appId + * @param roleList + * @return + */ + @Query("select p from PortalPermission p where p.appId=?1 and p.authObjId in ?2") + List<PortalPermission> queryAuthIdsByAuthObjs(String appId, Set<String> roleList); + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalRelQueryRepository.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalRelQueryRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..ad4a57ede2af301b1923c07081901528f5bdcbdb --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalRelQueryRepository.java @@ -0,0 +1,181 @@ +package com.idcos.enterprise.portal.dal.repository; + +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.TypedQuery; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import com.idcos.enterprise.portal.dal.entity.PortalRole; +import com.idcos.enterprise.portal.dal.entity.PortalUser; +import com.idcos.enterprise.portal.dal.entity.PortalUserGroup; + +/** + * 权限资源管理关联表分页查询实现 + * + * @author pengganyu + * @version $Id: PortalRelQueryRepository.java, v 0.1 2016年6月2日 上午10:23:01 pengganyu Exp $ + */ +@Repository +@Transactional(readOnly = true, rollbackFor = {Exception.class}) +public class PortalRelQueryRepository { + + private static final Logger Logger = LoggerFactory.getLogger(PortalRelQueryRepository.class); + + @PersistenceContext + private EntityManager em; + + /** + * 查询用户组关联的用户信息 + * + * @param groupId 用户组id + * @param cnd 用户查询条件 + * @param pageNo 页号 + * @param pageSize 页大小 + * @return + */ + public List<PortalUser> findUserPageByGroupIdAndCnd(String groupId, String cnd, int pageNo, + int pageSize) { + + String hql = "select u from PortalUser u,PortalGroupUserRel r where u.id=r.userId and r.groupId =?1 and u.isActive='Y' and (u.name like ?2 or u.loginId like ?2)"; + + Logger.info("查询用户组关联的用户信息:" + hql); + TypedQuery<PortalUser> query = em.createQuery(hql, PortalUser.class); + + query.setParameter(1, groupId); + query.setParameter(2, cnd); + query.setFirstResult((pageNo - 1) * pageSize); + query.setMaxResults(pageSize); + + return query.getResultList(); + } + + /** + * 查询角色所关联的用户信息 + * + * @param roleId 用户组id + * @param cnd 用户查询条件 + * @param pageNo 页号 + * @param pageSize 页大小 + * @return + */ + public List<PortalUser> findUserPageByRoleIdAndCnd(String roleId, String cnd, int pageNo, + int pageSize) { + + String hql = "select u from PortalUser u,PortalGroupUserRel r,PortalGroupRoleRel g where u.id=r.userId and g.groupId = r.groupId and g.roleId =?1 and u.isActive='Y' and (u.name like ?2 or u.loginId like ?2)"; + + Logger.info("查询角色所关联的用户信息:" + hql); + TypedQuery<PortalUser> query = em.createQuery(hql, PortalUser.class); + + query.setParameter(1, roleId); + query.setParameter(2, cnd); + query.setFirstResult((pageNo - 1) * pageSize); + query.setMaxResults(pageSize); + + return query.getResultList(); + } + + /** + * 查询用户所关联的用户组信息 + * + * @param userId 用户组id + * @param cnd 用户组查询条件 + * @param pageNo 页号 + * @param pageSize 页大小 + * @return + */ + public List<PortalUserGroup> findGroupPageByUserIdAndCnd(String userId, String cnd, int pageNo, + int pageSize) { + + String hql = "select u from PortalUserGroup u,PortalGroupUserRel r where u.id=r.groupId and r.userId =?1 and u.isActive='Y' and (u.name like ?2 or u.remark like ?2)"; + + Logger.info("查询用户所关联的用户组信息:" + hql); + TypedQuery<PortalUserGroup> query = em.createQuery(hql, PortalUserGroup.class); + + query.setParameter(1, userId); + query.setParameter(2, cnd); + query.setFirstResult((pageNo - 1) * pageSize); + query.setMaxResults(pageSize); + + return query.getResultList(); + } + + /** + * 查询角色所关联的用户组信息 + * + * @param roleId 用户组id + * @param cnd 用户组查询条件 + * @param pageNo 页号 + * @param pageSize 页大小 + * @return + */ + public List<PortalUserGroup> findGroupPageByRoleIdAndCnd(String roleId, String cnd, int pageNo, + int pageSize) { + + String hql = "select u from PortalUserGroup u,PortalGroupRoleRel r where u.id=r.groupId and r.roleId =?1 and u.isActive='Y' and (u.name like ?2 or u.remark like ?2)"; + + Logger.info("查询角色所关联的用户组信息:" + hql); + TypedQuery<PortalUserGroup> query = em.createQuery(hql, PortalUserGroup.class); + + query.setParameter(1, roleId); + query.setParameter(2, cnd); + query.setFirstResult((pageNo - 1) * pageSize); + query.setMaxResults(pageSize); + + return query.getResultList(); + } + + /** + * 查询用户组所关联的角色信息 + * + * @param groupId 用户组id + * @param cnd 用户组查询条件 + * @param pageNo 页号 + * @param pageSize 页大小 + * @return + */ + public List<PortalRole> findRolePageByGroupId(String groupId, String cnd, int pageNo, int pageSize) { + + String hql = "select distinct u from PortalRole u,PortalGroupRoleRel r where u.id=r.roleId and r.groupId =?1 and u.isActive='Y' and (u.name like ?2 or u.code like ?2 or u.remark like ?2)"; + + Logger.info("查询用户组所关联的角色信息:" + hql); + TypedQuery<PortalRole> query = em.createQuery(hql, PortalRole.class); + + query.setParameter(1, groupId); + query.setParameter(2, cnd); + query.setFirstResult((pageNo - 1) * pageSize); + query.setMaxResults(pageSize); + + return query.getResultList(); + } + + /** + * 查询用户所关联的角色信息 + * + * @param userId 用户组id + * @param cnd 用户组查询条件 + * @param pageNo 页号 + * @param pageSize 页大小 + * @return + */ + public List<PortalRole> findRolePageByUserId(String userId, String cnd, int pageNo, int pageSize) { + + String hql = "select u from PortalRole u,PortalGroupUserRel r,PortalGroupRoleRel g where u.id=g.roleId and g.groupId = r.groupId and r.userId =?1 and u.isActive='Y' and (u.name like ?2 or u.code like ?2 or u.remark like ?2)"; + + Logger.info("查询用户所关联的角色信息:" + hql); + TypedQuery<PortalRole> query = em.createQuery(hql, PortalRole.class); + + query.setParameter(1, userId); + query.setParameter(2, cnd); + query.setFirstResult((pageNo - 1) * pageSize); + query.setMaxResults(pageSize); + + return query.getResultList(); + } + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalResourceRepository.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalResourceRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..4bed805ea4b4642f88b1dfa1783e59f123dc82d9 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalResourceRepository.java @@ -0,0 +1,40 @@ + + +package com.idcos.enterprise.portal.dal.repository; + +// auto generated imports + +import com.idcos.cloud.core.dal.common.jpa.BaseRepository; +import com.idcos.enterprise.portal.dal.entity.PortalResource; + +import java.util.List; + +/** + * 自动生成PortalResourceRepository + * <p> + * 数据库配置文件自动生成,此文件属于自动生成的,具体可以参考codegen工程 + * Generated by <tt>jap-codgen</tt> on 2015-11-07 10:08:49. + * + * @author pengganyu + * @version PortalResourceRepository.java, v 1.1 2015-11-07 10:08:49 pengganyu Exp $ + */ +public interface PortalResourceRepository extends BaseRepository<PortalResource, String> { + + /** + * 根据权限资源类型编码和有效标志查询权限资源类型信息 + * + * @param code 权限资源类型编码 + * @param isActive 有效标志,Y/N + * @return PortalResource 权限资源类型 + */ + public PortalResource findByCodeAndIsActive(String code, String isActive); + + /** + * 查询全部权限资源类型 + * + * @param isActive + * @return + */ + public List<PortalResource> findByIsActive(String isActive); + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalRoleRepository.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalRoleRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..8b934aaf655700dbf34d23e69bfd3f8be0653148 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalRoleRepository.java @@ -0,0 +1,62 @@ + + +package com.idcos.enterprise.portal.dal.repository; + +// auto generated imports + +import com.idcos.cloud.core.dal.common.jpa.BaseRepository; +import com.idcos.enterprise.portal.dal.entity.PortalRole; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; + +/** + * 自动生成PortalRoleRepository + * <p> + * 数据库配置文件自动生成,此文件属于自动生成的,具体可以参考codegen工程 + * Generated by <tt>jap-codgen</tt> on 2015-09-15 09:22:12. + * + * @author yanlv + * @version PortalRoleRepository.java, v 1.1 2015-09-15 09:22:12 yanlv Exp $ + */ +public interface PortalRoleRepository extends BaseRepository<PortalRole, String> { + + /** + * <p> + * The jql statement for this operation is <br> + * + * @param code + * @param isActive + * @return List<PortalRole> + */ + List<PortalRole> findByCodeAndIsActive(String code, String isActive); + + /** + * <p> + * The jql statement for this operation is <br> + * + * @param isActive + * @return List<PortalRole> + */ + List<PortalRole> findByIsActive(String isActive); + + /** + * <p> + * The jql statement for this operation is <br> + * <tt>select r from PortalRole r where r.isActive='Y' order by r.name</tt> + * + * @return List<PortalRole> + */ + @Query("select r from PortalRole r where r.isActive='Y' order by r.name") + List<PortalRole> queryRoleList(); + + /** + * findRolePageByGroupIdAndCnd + * + * @param groupId + * @param cnd + * @return + */ + @Query("select distinct u from PortalRole u,PortalGroupRoleRel r where u.id=r.roleId and r.groupId =?1 and u.isActive='Y' and (u.name like ?2 or u.code like ?2 or u.remark like ?2)") + List<PortalRole> findRolePageByGroupIdAndCnd(String groupId, String cnd); +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalSysDictRepository.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalSysDictRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..317430c0afe7d142bd354f8e35cd088abb33668f --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalSysDictRepository.java @@ -0,0 +1,49 @@ + + +package com.idcos.enterprise.portal.dal.repository; + +// auto generated imports + +import org.springframework.data.jpa.repository.Query; + +import com.idcos.cloud.core.dal.common.jpa.BaseRepository; +import com.idcos.enterprise.portal.dal.entity.PortalSysDict; + +import java.util.List; + +/** + * 自动生成PortalRoleRepository + * <p> + * 数据库配置文件自动生成,此文件属于自动生成的,具体可以参考codegen工程 + * Generated by <tt>jap-codgen</tt> on 2017-09-26 09:22:12. + * + * @author GuanBin + * @version PortalRoleRepository.java, v 1.1 2017-09-26 09:22:12 yanlv Exp $ + */ +public interface PortalSysDictRepository extends BaseRepository<PortalSysDict, String> { + /** + * 获取字典表用户组类型 + * + * @param tenantId + * @return + */ + @Query("select sd.code from PortalSysDict sd where sd.typeCode = 'userGroupType' and sd.tenantId=?1") + List<String> getUserGroupType(String tenantId); + + /** + * 获取字典表用户组类型 + * + * @param tenantId + * @return + */ + @Query("select sd from PortalSysDict sd where sd.typeCode = 'userGroupType' and sd.tenantId=?1") + List<PortalSysDict> getUserGroupTypeAndValue(String tenantId); + + /** + * 获取字典表用户状态 + * + * @return + */ + @Query("select sd from PortalSysDict sd where sd.typeCode ='userStatus' and sd.tenantId='default'") + List<PortalSysDict> getUserStatus(); +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalTenantRepository.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalTenantRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..5839ba5ee3b29833b0e92c04b6474957d3b8fdd1 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalTenantRepository.java @@ -0,0 +1,77 @@ + + +package com.idcos.enterprise.portal.dal.repository; + +// auto generated imports + +import com.idcos.cloud.core.dal.common.jpa.BaseRepository; +import com.idcos.enterprise.portal.dal.entity.PortalTenant; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; + +/** + * 自动生成PortalRoleRepository + * <p> + * 数据库配置文件自动生成,此文件属于自动生成的,具体可以参考codegen工程 + * Generated by <tt>jap-codgen</tt> on 2017-09-26 09:22:12. + * + * @author GuanBin + * @version PortalRoleRepository.java, v 1.1 2017-09-26 09:22:12 yanlv Exp $ + */ +public interface PortalTenantRepository extends BaseRepository<PortalTenant, String> { + /** + * 根据名称查找 + * + * @param name + * @return + */ + @Query("select u from PortalTenant u where u.name = ?1 and u.isActive = 'Y'") + PortalTenant findByName(String name); + + /** + * 查询所有租户 + * + * @return + */ + @Query(nativeQuery = true, value = "select * from PORTAL_TENANT u where u.IS_ACTIVE = 'Y' order by convert(u.DISPLAY_NAME using gbk)") + List<PortalTenant> getAllPortalTenant(); + + /** + * 根据displayName查找 + * + * @param displayName + * @return + */ + @Query("select u from PortalTenant u where u.displayName = ?1 and u.isActive = 'Y'") + PortalTenant findByDisplayName(String displayName); + + /** + * NameNotId + * + * @param name + * @param id + * @return + */ + @Query("select u from PortalTenant u where u.name = ?1 and u.id <> ?2 and u.isActive = 'Y'") + PortalTenant findByNameNotId(String name, String id); + + /** + * DisplayNameNotId + * + * @param displayName + * @param id + * @return + */ + @Query("select u from PortalTenant u where u.displayName = ?1 and u.id <> ?2 and u.isActive = 'Y'") + PortalTenant findByDisplayNameNotId(String displayName, String id); + + /** + * 根据id查找 + * + * @param id + * @return + */ + @Query("select u from PortalTenant u where u.id = ?1 and u.isActive = 'Y'") + PortalTenant findById(String id); +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalTokenRepository.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalTokenRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..9300e255bc152d576205b69aa3589879e31af92f --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalTokenRepository.java @@ -0,0 +1,49 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.dal.repository; + +import com.idcos.cloud.core.dal.common.jpa.BaseRepository; +import com.idcos.enterprise.portal.dal.entity.PortalToken; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; + +/** + * @author Dana + * @version PortalTokenRepository.java, v1 2017/11/30 上午1:18 Dana Exp $$ + */ +public interface PortalTokenRepository extends BaseRepository<PortalToken, String> { + /** + * 根据tenantId和loginId获取token列表 + * 过期时间大于当前时间,代表token未过期 + * + * @param tenantId + * @param loginId + * @return + */ + @Query("select t from PortalToken t where t.tenantId = ?1 and t.loginId = ?2 and t.expireTime > current_timestamp") + List<PortalToken> listTokenByTenantIdAndLoginId(String tenantId, String loginId); + + /** + * 根据tokenId获取token + * + * @param tokenId + * @return + */ + @Query("select t from PortalToken t where t.id = ?1") + PortalToken queryTokenByTokenId(String tokenId); + + /** + * 根据token名和token名的hash值获取token + * + * @param name + * @param tokenCrc + * @return + */ + @Query("select t from PortalToken t where t.name = ?1 and t.tokenCrc=?2") + PortalToken queryTokenByNameAndTokenCrc(String name, long tokenCrc); + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalUserGroupRepository.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalUserGroupRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..7a5669767cdb5a2a9cc41b560940e2dd8773d9c4 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalUserGroupRepository.java @@ -0,0 +1,121 @@ + + +package com.idcos.enterprise.portal.dal.repository; + +// auto generated imports + +import com.idcos.cloud.core.dal.common.jpa.BaseRepository; +import com.idcos.enterprise.portal.dal.entity.PortalUserGroup; +import org.springframework.data.jpa.repository.Query; + +import java.util.List; +import java.util.Map; + +/** + * 自动生成PortalUserGroupRepository + * <p> + * 数据库配置文件自动生成,此文件属于自动生成的,具体可以参考codegen工程 + * Generated by <tt>jap-codgen</tt> on 2015-09-15 09:22:12. + * + * @author yanlv + * @version PortalUserGroupRepository.java, v 1.1 2015-09-15 09:22:12 yanlv Exp $ + */ +public interface PortalUserGroupRepository extends BaseRepository<PortalUserGroup, String> { + /** + * findByName + * + * @param groupName + * @return + */ + @Query("select ug from PortalUserGroup ug where ug.isActive='Y' and ug.name=?1") + List<PortalUserGroup> findByName(String groupName); + + /** + * 根据用户组名和租户名查询用户组 + * + * @param groupName + * @param tenant + * @return + */ + @Query("select ug from PortalUserGroup ug where ug.isActive='Y' and ug.name=?1 and ug.tenant=?2") + List<PortalUserGroup> findByNameAndTenant(String groupName, String tenant); + + /** + * <p> + * The jql statement for this operation is <br> + * <tt>select g from PortalUserGroup g where g.isActive='Y' order by g.name</tt> + * + * @param tenant + * @return List<PortalUserGroup> + */ + @Query("select g from PortalUserGroup g where g.isActive='Y' and tenant=?1 order by g.name") + List<PortalUserGroup> queryUserGroupList(String tenant); + + /** + * findGroupPageByUserIdAndCnd + * + * @param userId + * @param cnd + * @return + */ + @Query("select u from PortalUserGroup u,PortalGroupUserRel r where u.id=r.groupId and r.userId =?1 and u.isActive='Y' and (u.name like ?2 or u.remark like ?2)") + List<PortalUserGroup> findGroupPageByUserIdAndCnd(String userId, String cnd); + + /** + * findGroupPageByRoleIdAndCnd + * + * @param roleId + * @param cnd + * @return + */ + @Query("select u from PortalUserGroup u,PortalGroupRoleRel r where u.id=r.groupId and r.roleId =?1 and u.isActive='Y' and (u.name like ?2 or u.remark like ?2)") + List<PortalUserGroup> findGroupPageByRoleIdAndCnd(String roleId, String cnd); + + /** + * findAllUserGroupByTenantId + * + * @param tenantId + * @return + */ + @Query("select u from PortalUserGroup u where u.isActive='Y' and u.tenant = ?1") + List<PortalUserGroup> findAllUserGroupByTenantId(String tenantId); + + /** + * getUserGroupIdsByPermissionCode + * + * @param code + * @return + */ + @Query(value = "SELECT DISTINCT r.group_id as userGroupId FROM PORTAL_GROUP_ROLE_REL r WHERE r.role_id IN (SELECT p.auth_obj_id FROM PORTAL_PERMISSION p WHERE p.auth_res_id = ?1)", nativeQuery = true) + List<String> getUserGroupIdsByPermissionCode(String code); + + /** + * findUserGroupByUserGroupIdAndIsActive + * + * @param userGroupId + * @param isActive + * @return + */ + @Query("SELECT u FROM PortalUserGroup u WHERE u.id= ?1 and u.isActive=?2") + PortalUserGroup findUserGroupByUserGroupIdAndIsActive(String userGroupId, String isActive); + + /** + * findUserGroupByType + * + * @param type + * @return + */ + @Query("select u from PortalUserGroup u where u.type = ?1 and u.tenant='default' and u.isActive='Y'") + List<PortalUserGroup> findUserGroupByType(String type); + + /** + * findUserGroupByTypeAndTenantId + * + * @param type + * @param tenantId + * @return + */ + @Query("select u from PortalUserGroup u where u.type = ?1 and u.tenant=?2 and u.isActive='Y'") + List<PortalUserGroup> findUserGroupByTypeAndTenantId(String type, String tenantId); + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalUserRepository.java b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalUserRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..96ec0c61729a8a808dd320aa357ee045d38dd104 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/dal/repository/PortalUserRepository.java @@ -0,0 +1,163 @@ + + +package com.idcos.enterprise.portal.dal.repository; + +// auto generated imports + +import com.idcos.cloud.core.dal.common.jpa.BaseRepository; +import com.idcos.enterprise.portal.dal.entity.PortalUser; +import org.springframework.data.jpa.repository.Query; + +import java.util.Date; +import java.util.List; + +/** + * 自动生成PortalUserRepository + * <p> + * 数据库配置文件自动生成,此文件属于自动生成的,具体可以参考codegen工程 + * Generated by <tt>jap-codgen</tt> on 2015-09-15 09:22:12. + * + * @author yanlv + * @version PortalUserRepository.java, v 1.1 2015-09-15 09:22:12 yanlv Exp $ + */ +public interface PortalUserRepository extends BaseRepository<PortalUser, String> { + /** + * 模糊查询用户(姓名、登录名),根据GroupId + * + * @param id + * @param cnd + * @return + */ + @Query("select u from PortalUser u,PortalGroupUserRel r where u.id = r.userId and r.groupId = ?1 and u.isActive='Y' and (u.name like ?2 or u.loginId like ?2)") + List<PortalUser> findUserPageByGroupIdAndCnd(String id, String cnd); + + /** + * 模糊查询用户(姓名、登录名) + * + * @param tenantId + * @param cnd + * @return + */ + @Query("select u from PortalUser u where u.tenantId=?1 and u.isActive='Y' and (u.name like ?2 or u.loginId like ?2)") + List<PortalUser> queryUserByCnd(String tenantId, String cnd); + + /** + * 根据tenantId和deptId集合查询用户 + * + * @param tenantId + * @param ids + * @return + */ + @Query("select u from PortalUser u where u.tenantId = ?1 and u.deptId in ?2 and u.isActive = 'Y'") + List<PortalUser> findPortalUserByDeptIdIn(String tenantId, List<String> ids); + + /** + * 根据部门id查询用户 + * + * @param deptId + * @return + */ + @Query("select u from PortalUser u where u.deptId = ?1 and u.isActive = 'Y'") + List<PortalUser> findByDeptId(String deptId); + + /** + * 查询所有用户 + * + * @return + */ + @Query("select u from PortalUser u where u.isActive = 'Y'") + List<PortalUser> findIsActive(); + + + /** + * getSyncByDept + * + * @param deptId + * @param sourceType + * @return + */ + @Query("select u from PortalUser u where u.deptId=?1 and u.sourceType=?2") + List<PortalUser> getSyncByDept(String deptId, String sourceType); + + /** + * findAllSyncDept + * + * @param sourceType + * @return + */ + @Query("select u from PortalUser u where u.sourceType =?1 and u.isActive = 'Y'") + List<PortalUser> findAllSyncUser(String sourceType); + + /** + * 查询租户下的所有用户 + * + * @param tenantId + * @return + */ + @Query("select u from PortalUser u where u.tenantId=?1 and u.isActive = 'Y'") + List<PortalUser> findByTenantId(String tenantId); + + /** + * 根据id查询用户 + * + * @param userId + * @return + */ + @Query("select u from PortalUser u where u.id = ?1 and u.isActive = 'Y'") + PortalUser findById(String userId); + + /** + * 根据loginId查询用户 + * + * @param tenantId + * @param id + * @return + */ + @Query("select u from PortalUser u where u.tenantId = ?1 and u.loginId = ?2 and u.isActive = 'Y'") + PortalUser findPortalUserById(String tenantId, String id); + + /** + * 根据tenantId和id查询用户 + * + * @param tenantId + * @param id + * @return + */ + @Query("select u from PortalUser u where u.tenantId = ?1 and u.id = ?2 and u.isActive = 'Y'") + PortalUser findPortalUserByAccountId(String tenantId, String id); + + /** + * 根据tenantId和登录名List查询用户 + * + * @param tenantId + * @param accountNoList + * @return + */ + @Query("select u from PortalUser u where u.tenantId = ?1 and u.loginId in ?2 and u.isActive = 'Y'") + List<PortalUser> findUserByIds(String tenantId, List<String> accountNoList); + + /** + * 获取最后登录时间 + * + * @return + */ + @Query(nativeQuery = true, value = "SELECT u.LAST_LOGIN_TIME FROM PORTAL_USER u ORDER BY u.LAST_LOGIN_TIME DESC LIMIT 1") + Date getLastLoginTime(); + + /** + * 查询租户下系统的帐号总数 + * + * @param tenantId + * @return + */ + @Query("select count (u) from PortalUser u where u.tenantId = ?1 and u.isActive = 'Y'") + Long getAccountCount(String tenantId); + + /** + * 查询系统的帐号总数 + * + * @return + */ + @Query("select count (u) from PortalUser u where u.isActive = 'Y'") + Long getAccountCount(); +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/export/AuthRestController.java b/uam-server/src/main/java/com/idcos/enterprise/portal/export/AuthRestController.java new file mode 100644 index 0000000000000000000000000000000000000000..10babc83b3988f800bec28e6437e2c83bdb9cce3 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/export/AuthRestController.java @@ -0,0 +1,510 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.export; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import com.idcos.enterprise.portal.export.util.CommonRestResult; +import com.idcos.enterprise.portal.export.util.CommonRestResultUtil; +import com.idcos.enterprise.portal.form.*; +import com.idcos.enterprise.portal.manager.auto.*; + +import io.swagger.annotations.Api; + +import java.util.HashMap; + +/** + * rbac提供给外部系统的restful接口 + * + * @author Dana + * @version AuthRestController.java, v1 2017/9/26 下午2:34 Dana Exp $$ + */ +@Controller +@RequestMapping(value = "/rbac/api") +@Api(tags = "14.uam-client访问的接口", description = "AuthRestController") +public class AuthRestController { + private static final Logger logger = LoggerFactory.getLogger(AuthRestController.class); + + @Autowired + private PortalUserQueryManager portalUserQueryManager; + + @Autowired + private PortalUserOperateManager portalUserOperateManager; + + @Autowired + private PortalDeptQueryManager portalDeptQueryManager; + + @Autowired + private PortalTenantManager portalTenantManager; + + @Autowired + private PortalRoleQueryManager portalRoleQueryManager; + + @Autowired + private PortalUserGroupQueryManager portalUserGroupQueryManager; + + @Autowired + private PortalUserGroupOperateManager portalUserGroupOperateManager; + + /** + * 根据userId和appId查询该用户所有信息 + * + * @return + */ + @RequestMapping(value = "/authInfo", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") + @ResponseBody + public CommonRestResult authInfo(@RequestParam(name = "userId", required = false) String userId, @RequestParam String appId, + @RequestParam String token) { + return CommonRestResultUtil.getResult(portalUserQueryManager.authInfo(userId, appId, token)); + } + + /** + * 根据loginId和password查询该用户所有信息 + * + * @return + */ + @RequestMapping(value = "/userGroup/loginId", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + @ResponseBody + public CommonRestResult getAuthInfoByLoginIdAndPw(@RequestBody AuthInfoQueryForm form) { + return CommonRestResultUtil.getResult(portalUserQueryManager.getAuthInfoByLoginIdAndPw(form.getLoginId(), + form.getPassword(), form.getTenantId(), form.getAppId())); + } + + /** + * 根据租户id查询所有的帐号信息 + * + * @return + */ + @RequestMapping(value = "/account/getAllAcountByTenantId", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") + @ResponseBody + public CommonRestResult getAllAcountByTenantId(@RequestParam String tenantId) { + return CommonRestResultUtil.getResult(portalUserQueryManager.getAllAcount(tenantId)); + } + + /** + * 查询所有的帐号信息 + * + * @return + */ + @RequestMapping(value = "/account/getAllAcount", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") + @ResponseBody + public CommonRestResult getAllAcount() { + return CommonRestResultUtil.getResult(portalUserQueryManager.getAllAcount()); + } + + /** + * 查询租户下系统的帐号总数,不传租户则查询所有的账号总数 + * + * @return + */ + @RequestMapping(value = "/account/count", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") + @ResponseBody + public CommonRestResult getAccountCount(@RequestParam(name = "tenantId", required = false) String tenantId) { + return CommonRestResultUtil.getResult(portalUserQueryManager.getAccountCount(tenantId)); + } + + /** + * 查询部门下的所有的员工(及子部门下的帐号) + * + * @return + */ + @RequestMapping(value = "/account/getByDeptId", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") + @ResponseBody + public CommonRestResult getByDeptId(@RequestParam String tenantId, @RequestParam String deptId, + @RequestParam(name = "recurse", required = false) String recurse) { + return CommonRestResultUtil.getResult(portalUserQueryManager.getAcountByDeptId(tenantId, deptId, recurse)); + } + + /** + * 查询最后登录时间 + * + * @return + */ + @RequestMapping(value = "/account/getLastLoginTime", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") + @ResponseBody + public CommonRestResult getLastLoginTime() { + return CommonRestResultUtil.getResult(portalUserQueryManager.getLastLoginTime()); + } + + /** + * 根据登录id获取用户信息。 + * + * @param accountNo 账号的登录名. + * @return + */ + @RequestMapping(value = "/account/getByAccountNo", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") + @ResponseBody + public CommonRestResult getByAccountNo(@RequestParam String tenantId, @RequestParam String accountNo) { + return CommonRestResultUtil.getResult(portalUserQueryManager.getByAccountNo(tenantId, accountNo)); + } + + /** + * 根据用户id获取用户信息。 + * + * @param id 账号的登录名. + * @return + */ + @RequestMapping(value = "/account/id", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") + @ResponseBody + public CommonRestResult getUserById(@RequestParam String id) { + return CommonRestResultUtil.getResult(portalUserQueryManager.getUserById(id)); + } + + /** + * 根据账号登录ids查询账号信息。 + * 目前res只用到了accountNo和Email两个属性,所以后面可以考虑去掉这个方法 + * + * @param form 账号的登录名. + * @return + */ + @RequestMapping(value = "/account/getByAccountNos", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + @ResponseBody + public CommonRestResult getByAccountNos(@RequestParam String tenantId, @RequestBody UserListForm form) { + return CommonRestResultUtil.getResult(portalUserQueryManager.getByAccountNos(tenantId, form.getLoginIdList())); + } + + /** + * 分页模糊查询用户列表 + * + * @param form + * @return + */ + @RequestMapping(method = RequestMethod.GET, value = "/pageList", produces = "application/json; charset=UTF-8") + @ResponseBody + public CommonRestResult queryPagelist(@ModelAttribute PortalUserQueryPageListForm form) { + return CommonRestResultUtil.getResult(portalUserQueryManager.queryPageList(form)); + } + + /** + * 获取所有部门信息 + * + * @return + */ + @RequestMapping(value = "/dept/allDept", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") + @ResponseBody + public CommonRestResult getAllDept(@RequestParam(name = "tenantId", required = false) String tenantId) { + return CommonRestResultUtil.getResult(portalDeptQueryManager.getAllDept(tenantId)); + } + + /** + * 获取所有部门的Tree型的树 + * + * @return + */ + @RequestMapping(value = "/dept/tree", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") + @ResponseBody + public CommonRestResult getDeptsTree(@RequestParam String tenantId, @RequestParam String treeStyle) { + return CommonRestResultUtil.getResult(portalDeptQueryManager.getDeptsTree(tenantId, treeStyle)); + } + + /** + * 获取所有用户组的Tree型的树 + * + * @return + */ + @RequestMapping(value = "/accountGroup/tree", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") + @ResponseBody + public CommonRestResult getAccountGroupTree(@RequestParam String tenantId, @RequestParam String treeStyle, + @RequestParam String isOpen) { + return CommonRestResultUtil.getResult(portalUserGroupQueryManager.getAccountGroupTree(tenantId, treeStyle)); + } + + /** + * 根据权限code查询工作组列表 + * + * @return + */ + @RequestMapping(value = "/accountGroup/getListByCode", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") + @ResponseBody + public CommonRestResult getAccountGroupListByPermissionCode(@RequestParam String code) { + return CommonRestResultUtil.getResult(portalUserGroupQueryManager.getAccountGroupListByPermissionCode(code)); + } + + /** + * 根据部门id获取部门信息 + * + * @return + */ + @RequestMapping(value = "/dept/get", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") + @ResponseBody + public CommonRestResult getDeptByDeptId(@RequestParam String tenantId, @RequestParam String deptId) { + return CommonRestResultUtil.getResult(portalDeptQueryManager.getDeptByDeptId(tenantId, deptId)); + } + + /** + * 根据部门id获取部门角色 + * + * @return + */ + @RequestMapping(value = "/account/getRoles", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") + @ResponseBody + public CommonRestResult getRolesByDeptId(@RequestParam String tenantId, @RequestParam String deptId) { + return CommonRestResultUtil.getResult(null); + } + + /** + * 获取所有的租户信息 + * + * @return + */ + @RequestMapping(value = "/tenant/getAll", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") + @ResponseBody + public CommonRestResult getAllTenant() { + return CommonRestResultUtil.getResult(portalTenantManager.getAllTenant()); + } + + /** + * 通过租户Id获取租户信息 + * + * @return + */ + @RequestMapping(value = "/tenant/getByTenantId", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") + @ResponseBody + public CommonRestResult getTenantByTenantId(@RequestParam String tenantId) { + return CommonRestResultUtil.getResult(portalTenantManager.getTenantByTenantId(tenantId)); + } + + /** + * 根据tenantId获取所有角色信息 + * + * @return + */ + @RequestMapping(value = "/roles", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") + @ResponseBody + public CommonRestResult getAllRolesByTenantId(@RequestParam(name = "tenantId", required = false) String tenantId) { + return CommonRestResultUtil.getResult(portalRoleQueryManager.queryByTenantId(tenantId)); + } + + /** + * 根据tenantId和用户id获取所有角色信息 + * + * @return + */ + @RequestMapping(value = "/roles/accountId", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") + @ResponseBody + public CommonRestResult getAllRolesByAccountId(@RequestParam String accountId, @RequestParam String tenantId) { + return CommonRestResultUtil.getResult(portalRoleQueryManager.queryByAccountNoAndTenantId(accountId, tenantId)); + } + + /** + * 获取某用户权限信息 + * + * @param userId,appId + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/permissions") + @ResponseBody + public CommonRestResult queryPermissionsByUserIdAndAppId(@RequestParam String userId, + @RequestParam(name = "appId") String appId) { + return CommonRestResultUtil.getResult(portalUserQueryManager.queryPermissionsByUserIdAndAppId(userId, appId)); + } + + /** + * 获取某用户用户组信息 + * + * @param id + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/groups/{id}") + @ResponseBody + public CommonRestResult queryGroupsById(@PathVariable String id) { + return CommonRestResultUtil.getResult(portalUserQueryManager.queryGroupsById(id)); + } + + /** + * 根据用户组type查询用户组集合 + * + * @param type + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/group/type") + @ResponseBody + public CommonRestResult queryGroupByType(@RequestParam String type) { + return CommonRestResultUtil.getResult(portalUserGroupQueryManager.queryGroupByType(type)); + } + + /** + * 根据用户组type和租户id查询用户组集合 + * + * @param type + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/group/type/tenantId") + @ResponseBody + public CommonRestResult queryGroupByTypeAndTenantId(@RequestParam String type, @RequestParam String tenantId) { + return CommonRestResultUtil.getResult(portalUserGroupQueryManager.queryGroupByTypeAndTenantId(type, tenantId)); + } + + /** + * 根据用户id和用户组type查询用户组集合 + * + * @param type,userId + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/group/type/userId") + @ResponseBody + public CommonRestResult queryGroupByTypeAndUserId(@RequestParam String type, @RequestParam String userId) { + return CommonRestResultUtil.getResult(portalUserGroupQueryManager.queryGroupByTypeAndUserId(type, userId)); + } + + /** + * 根据loginId和tenantId查询用户组集合 + * + * @param loginId,tenantId + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/group/loginId") + @ResponseBody + public CommonRestResult queryGroupByLoginIdAndTenantId(@RequestParam String loginId, + @RequestParam String tenantId) { + return CommonRestResultUtil + .getResult(portalUserGroupQueryManager.queryGroupByLoginIdAndTenantId(loginId, tenantId)); + } + + /** + * 修改用户密码 + * + * @param form + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.POST, value = "/modifyPW") + @ResponseBody + public CommonRestResult modifyPassword(@RequestBody ModifyPasswordForm form) { + return CommonRestResultUtil.getResult(portalUserOperateManager.modifyPassword(form)); + } + + /** + * 重置用户密码 + * + * @param userId + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.POST, value = "/resetPW") + @ResponseBody + public CommonRestResult resetPassword(@RequestParam String userId) { + return CommonRestResultUtil.getResult(portalUserOperateManager.resetPassword(userId)); + } + + /** + * 对外提供的新增用户 + * + * @param tenantId + * @param map + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.POST, value = "/account/add") + @ResponseBody + public CommonRestResult addAccount(@RequestParam String tenantId, @RequestBody HashMap<String, String> map) { + PortalUserAddForm userAddForm = new PortalUserAddForm(); + userAddForm.setTenantId(tenantId); + userAddForm.setName(map.get("name")); + userAddForm.setLoginId(map.get("accountNo")); + userAddForm.setMobile1(map.get("mobile")); + userAddForm.setDeptId(map.get("deptID")); + userAddForm.setRemark(map.get("remark")); + userAddForm.setEmail(map.get("email")); + userAddForm.setOfficeTel1(map.get("officeTel")); + userAddForm.setPassword(map.get("password")); + userAddForm.setConfirmPassword(map.get("password")); + return CommonRestResultUtil.getResult(portalUserOperateManager.add(userAddForm)); + } + + /** + * 对外提供的修改用户 + * + * @param tenantId + * @param map + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.POST, value = "/account/update") + @ResponseBody + public CommonRestResult updateAccount(@RequestParam String tenantId, @RequestParam String id, @RequestBody HashMap<String, String> map) { + PortalUserUpdateForm userUpdateForm = new PortalUserUpdateForm(); + userUpdateForm.setId(id); + userUpdateForm.setTenantId(tenantId); + userUpdateForm.setName(map.get("name")); + userUpdateForm.setLoginId(map.get("accountNo")); + userUpdateForm.setMobile1(map.get("mobile")); + userUpdateForm.setDeptId(map.get("deptID")); + userUpdateForm.setRemark(map.get("remark")); + userUpdateForm.setEmail(map.get("email")); + userUpdateForm.setOfficeTel1(map.get("officeTel")); + return CommonRestResultUtil.getResult(portalUserOperateManager.update(userUpdateForm)); + } + + /** + * 获取某用户组下所有用户 + * + * @param groupId + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/groupId") + @ResponseBody + public CommonRestResult queryUserByGroupId(@RequestParam String groupId) { + return CommonRestResultUtil.getResult(portalUserGroupQueryManager.queryUsersByGroupId(groupId)); + } + + /** + * 根据用户组名称和租户Id获取某用户组下所有用户 + * + * @param groupName + * @param tenantId + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/users") + @ResponseBody + public CommonRestResult queryUserByGroupNameAndTenant(@RequestParam String groupName, + @RequestParam String tenantId) { + return CommonRestResultUtil + .getResult(portalUserGroupQueryManager.queryUserByGroupNameAndTenant(groupName, tenantId)); + } + + /** + * 删除用户组 + * + * @param groupId + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.POST, value = "/group/delete") + @ResponseBody + public CommonRestResult deleteUserGroup(@RequestParam String groupId) { + return CommonRestResultUtil.getResult(portalUserGroupOperateManager.delete(groupId)); + } + + /** + * 新建用户组(包括用户) + * 用户组名称必传,用户组类型传空值代表default类型,传其他值都是去查找字典表,字典表没有对应数据,则新建字典 + * + * @param form + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.POST, value = "/group/create") + @ResponseBody + public CommonRestResult createUserGroupAndUser(@RequestBody PortalGroupAndUserCreateForm form) { + return CommonRestResultUtil.getResult(portalUserGroupOperateManager.createUserGroupAndUser(form)); + } + + /** + * 修改用户组(包括用户) + * 用户组id和用户组名称必传,用户组类型传空值代表default类型,传其他值都是去查找字典表,字典表没有对应数据,则新建字典 + * + * @param form + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.POST, value = "/group/update") + @ResponseBody + public CommonRestResult updateUserGroupAndUser(@RequestBody PortalGroupAndUserUpdateForm form) { + return CommonRestResultUtil.getResult(portalUserGroupOperateManager.updateUserGroupAndUser(form)); + } + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/export/util/CommonRestResult.java b/uam-server/src/main/java/com/idcos/enterprise/portal/export/util/CommonRestResult.java new file mode 100644 index 0000000000000000000000000000000000000000..a0755eadfe02eb7245a136c998b474d98f3ecaa1 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/export/util/CommonRestResult.java @@ -0,0 +1,102 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.export.util; + +import java.util.List; + +/** + * @author Dana + * @version CommonRestResult.java, v1 2017/11/27 下午7:30 Dana Exp $$ + */ +public class CommonRestResult<T> { + /** + * 返回结果 + */ + private T content; + /** + * 业务的处理结果 + */ + private String status = "success"; + /** + * + */ + private String message; + + private String resultCode; + /** + * 更多错误 + */ + private List<?> errors; + + /** + * 默认构造函数 + */ + public CommonRestResult() { + + } + + public CommonRestResult(final T content) { + this(); + this.content = content; + } + + public CommonRestResult(final String status, final String message) { + this(null); + this.status = status; + this.message = message; + } + + public CommonRestResult(final String status, final String message, final String resultCode) { + this(null); + this.status = status; + this.message = message; + this.resultCode = resultCode; + } + + public T getContent() { + return content; + } + + public void setContent(T content) { + this.content = content; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public boolean success() { + return "success".equals(status); + } + + public List<?> getErrors() { + return errors; + } + + public void setErrors(List<?> errors) { + this.errors = errors; + } + + public String getResultCode() { + return resultCode; + } + + public void setResultCode(String resultCode) { + this.resultCode = resultCode; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/export/util/CommonRestResultUtil.java b/uam-server/src/main/java/com/idcos/enterprise/portal/export/util/CommonRestResultUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..c634b0280be78a7a62a1db97777a65169f87fee1 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/export/util/CommonRestResultUtil.java @@ -0,0 +1,29 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.export.util; + +import com.idcos.cloud.core.common.biz.CommonResult; + +/** + * @author Dana + * @version CommonRestResultUtil.java, v1 2017/10/14 下午5:22 Dana Exp $$ + */ +public class CommonRestResultUtil { + /** + * 根据CommonResult返回结果信息 + * + * @param result + * @return + */ + @SuppressWarnings("unchecked") + public static final CommonRestResult getResult(CommonResult<?> result) { + CommonRestResult commonRestResult = new CommonRestResult(result.isSuccess() ? "success" : "fail", + result.getResultMessage()); + commonRestResult.setContent(result.getResultObject()); + commonRestResult.setResultCode(result.getResultCode()); + return commonRestResult; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/export/util/DeptTreeUtils.java b/uam-server/src/main/java/com/idcos/enterprise/portal/export/util/DeptTreeUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..31375652714d4bb132321a0a1d59b0ea8104f955 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/export/util/DeptTreeUtils.java @@ -0,0 +1,146 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2016 All Rights Reserved. + */ +package com.idcos.enterprise.portal.export.util; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.idcos.enterprise.portal.dal.entity.PortalDept; +import com.idcos.enterprise.portal.dal.enums.SourceTypeEnum; +import org.apache.commons.collections.CollectionUtils; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + +import static com.google.common.base.Preconditions.checkNotNull; + +/** + * 辅助前端生成树形结构 + * + * @author Dana + * @version DeptTreeUtils.java, v1 2017/11/03 下午1:34 Dana Exp $$ + */ +public class DeptTreeUtils { + + public static Object getTree(List<PortalDept> list, TreeStyle treeStyle) { + + checkNotNull(treeStyle); + + if (CollectionUtils.isEmpty(list)) { + return Collections.emptyList(); + } + + HashMap<String, TreeNode> treeNodeMap = Maps.newHashMap(); + List<TreeNode> treeNodes = Lists.newLinkedList(); + + for (PortalDept portalDept : list) { + + TreeNode child = new TreeNode(treeStyle); + child.setId(portalDept.getId()); + child.setTitle(portalDept.getDisplayName()); + child.setSourceType(portalDept.getSourceType()); + + treeNodeMap.put(portalDept.getId(), child); + } + + for (PortalDept portalDept : list) { + + TreeNode parent = treeNodeMap.get(portalDept.getParentId()); + + TreeNode treeNode = treeNodeMap.get(portalDept.getId()); + + if (parent == null) { + treeNodes.add(treeNode); + continue; + } + + parent.getChildren().add(treeNode); + } + + return treeNodes; + } + + public static final class TreeNode extends HashMap<String, Object> { + + private static final long serialVersionUID = 1L; + + @JsonIgnore + private TreeStyle treeStyle; + + public TreeNode(TreeStyle treeStyle) { + this.treeStyle = checkNotNull(treeStyle); + + this.put(treeStyle.getIdName(), ""); + this.put(treeStyle.getTitleName(), ""); + this.put(treeStyle.getSourceType(), ""); + this.put(treeStyle.getChildrenName(), Lists.newLinkedList()); + } + + public void setId(String id) { + this.put(treeStyle.getIdName(), id); + } + + public void setTitle(String title) { + this.put(treeStyle.getTitleName(), title); + } + + public void setSourceType(String sourceType) { + this.put(treeStyle.getSourceType(), sourceType); + } + + public List<TreeNode> getChildren() { + return (List<TreeNode>) this.get(treeStyle.getChildrenName()); + } + + } + + public enum TreeStyle { + /** + * io_tree + */ + IO_TREE("id", "title", "children", "_node", "sourceType"); + + private final String idName; + + private final String titleName; + + private final String childrenName; + + private final String nodeName; + + private final String sourceType; + + TreeStyle(String idName, String titleName, String childrenName, String nodeName, String sourceType) { + this.idName = checkNotNull(idName); + this.titleName = checkNotNull(titleName); + this.childrenName = checkNotNull(childrenName); + this.nodeName = checkNotNull(nodeName); + this.sourceType = checkNotNull(sourceType); + } + + public String getIdName() { + return idName; + } + + public String getTitleName() { + return titleName; + } + + public String getChildrenName() { + return childrenName; + } + + public String getNodeName() { + return nodeName; + } + + public String getSourceType() { + return sourceType; + } + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/ext/ExtSyncController.java b/uam-server/src/main/java/com/idcos/enterprise/portal/ext/ExtSyncController.java new file mode 100644 index 0000000000000000000000000000000000000000..be644677946e92b861a10708eb23f4a6735898fb --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/ext/ExtSyncController.java @@ -0,0 +1,34 @@ +package com.idcos.enterprise.portal.ext; + +import io.swagger.annotations.Api; +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.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @Author: Dai + * @Date: 2018/11/8 10:28 PM + * @Description: + */ +@Controller +@RequestMapping(value = "/rbac/ext") +@Api(tags = "15.外部同步数据对接接口", description = "ExtSyncController") +public class ExtSyncController { + @Autowired + private ExtSyncService extSyncService; + + + /** + * 同步外部系统的部门和人员到UAM + * + * @return + */ + @RequestMapping(value = "/sync", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") + @ResponseBody + public void syncDeptAndUser() { + extSyncService.syncDeptAndUser(); + } +} + diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/ext/ExtSyncService.java b/uam-server/src/main/java/com/idcos/enterprise/portal/ext/ExtSyncService.java new file mode 100644 index 0000000000000000000000000000000000000000..196a6eb713c89ccbcaa4e8189c5badb3e5a0946e --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/ext/ExtSyncService.java @@ -0,0 +1,13 @@ +package com.idcos.enterprise.portal.ext; + +/** + * @Author: Dai + * @Date: 2018/11/8 10:26 PM + * @Description: 外部系统同步用户和部门必须继承这个接口 + */ +public interface ExtSyncService { + /** + * 同步部门和人员 + */ + void syncDeptAndUser(); +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/ext/ExtValue.java b/uam-server/src/main/java/com/idcos/enterprise/portal/ext/ExtValue.java new file mode 100644 index 0000000000000000000000000000000000000000..387a5d87f9da8ab57df004f9fbfa5e34b4d7c936 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/ext/ExtValue.java @@ -0,0 +1,98 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2018 All Rights Reserved. + */ +package com.idcos.enterprise.portal.ext; + +import javax.annotation.PostConstruct; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.alibaba.fastjson.JSONObject; + + +/** + * 统一管理对接外部系统的配置项 + * + * @author Xizhao.Dai + * @version ExtValue.java, v1 2018/9/6 上午1:17 Xizhao.Dai Exp $$ + */ +public class ExtValue { + private static final Logger logger = LoggerFactory.getLogger(ExtValue.class); + + private String cron; + + private String domain; + + private String ip; + + private String port; + + private String baseDn; + + private String basePassword; + + private String baseDept; + + private String extAppId; + + private String extAppToken; + + public ExtValue(String cron, String domain, String ip, String port, + String baseDn, String basePassword, String baseDept, String extAppId, String extAppToken) { + this.cron = cron; + this.domain = domain; + this.ip = ip; + this.port = port; + this.baseDn = baseDn; + this.basePassword = basePassword; + this.baseDept = baseDept; + this.extAppId = extAppId; + this.extAppToken = extAppToken; + } + + @PostConstruct + public void afterInit() { + logger.info("========== ExtValue =========="); + logger.info(JSONObject.toJSONString(this)); + } + + public String getCron() { + return cron; + } + + public String getDomain() { + return domain; + } + + public String getIp() { + return ip; + } + + public String getPort() { + return port; + } + + public String getBaseDn() { + return baseDn; + } + + public String getBasePassword() { + return basePassword; + } + + public String getBaseDept() { + return baseDept; + } + + public String getExtAppId() { + return extAppId; + } + + public String getExtAppToken() { + return extAppToken; + } + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/ext/NoExtSynvServiceImpl.java b/uam-server/src/main/java/com/idcos/enterprise/portal/ext/NoExtSynvServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..47f7a6996be174e5d1463f6c103a86dce300707c --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/ext/NoExtSynvServiceImpl.java @@ -0,0 +1,19 @@ +package com.idcos.enterprise.portal.ext; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; +import org.springframework.stereotype.Service; + +/** + * @Author: Dai + * @Date: 2018/11/20 9:06 PM + * @Description: + */ +@Service +@ConditionalOnExpression("'${ext.user.sync.type}' != 'LDAP' and '${ext.user.sync.type}' != 'OA'") +public class NoExtSynvServiceImpl implements ExtSyncService { + + @Override + public void syncDeptAndUser() { + throw new RuntimeException("同步功能尚未开通"); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/ext/oa/common/util/RestTemplateUtil.java b/uam-server/src/main/java/com/idcos/enterprise/portal/ext/oa/common/util/RestTemplateUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..55f312486f32346e1d92c2e6ad5aa808b61b7bd5 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/ext/oa/common/util/RestTemplateUtil.java @@ -0,0 +1,40 @@ +package com.idcos.enterprise.portal.ext.oa.common.util; + +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.StringHttpMessageConverter; +import org.springframework.web.client.RestTemplate; + +import java.nio.charset.StandardCharsets; +import java.util.List; + +/** + * @author xizhao + */ +public class RestTemplateUtil { + + /** + * 获取StringHttpMessageConverter字符集为utf-8类型的RestTemplate + * + * @return + */ + public static final RestTemplate getRestTemplate() { + RestTemplate restTemplate = new RestTemplate(); + List<HttpMessageConverter<?>> converterList = restTemplate.getMessageConverters(); + HttpMessageConverter<?> converterTarget = null; + for (HttpMessageConverter<?> item : converterList) { + if (item.getClass() == StringHttpMessageConverter.class) { + converterTarget = item; + break; + } + } + + if (converterTarget != null) { + converterList.remove(converterTarget); + } + HttpMessageConverter<?> converter = new StringHttpMessageConverter(StandardCharsets.UTF_8); + converterList.add(1, converter); + + return restTemplate; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/AuthInfoQueryForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/AuthInfoQueryForm.java new file mode 100644 index 0000000000000000000000000000000000000000..4aa2987e5f83277d9ff74ad1fba4250fe5b9443d --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/AuthInfoQueryForm.java @@ -0,0 +1,70 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.form; + +import org.hibernate.validator.constraints.NotBlank; + +/** + * @author Dana + * @version getAuthInfoForm.java, v1 2018/1/10 下午5:35 Dana Exp $$ + */ +public class AuthInfoQueryForm { + /** + * 登录Id. + */ + @NotBlank(message = "登录Id") + private String loginId; + + /** + * 用户密码 + */ + @NotBlank(message = "密码") + private String password; + + /** + * 租户。 + */ + @NotBlank(message = "租户") + private String tenantId; + + /** + * 系统名。 + */ + @NotBlank(message = "系统名") + private String appId; + + public String getLoginId() { + return loginId; + } + + public void setLoginId(String loginId) { + this.loginId = loginId; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/LoginConvertForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/LoginConvertForm.java new file mode 100644 index 0000000000000000000000000000000000000000..a3b5fe4e94a8ac9c507643b07b7e2070fb03b226 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/LoginConvertForm.java @@ -0,0 +1,55 @@ + + +package com.idcos.enterprise.portal.form; + +// auto generated imports + +import com.idcos.cloud.biz.common.BaseForm; +import org.hibernate.validator.constraints.NotBlank; + +/** + * 表单对象LoginConvertForm + * <p>第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖</p> + * + * @author yanlv + * @version LoginConvertForm.java, v 1.1 2015-06-09 10:00:37 yanlv Exp $ + */ + +public class LoginConvertForm extends BaseForm { + + //========== properties ========== + + private String userInfo; + + private String password; + + private String tenant; + + + //========== getters and setters ========== + + + public String getUserInfo() { + return userInfo; + } + + public void setUserInfo(String userInfo) { + this.userInfo = userInfo; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getTenant() { + return tenant; + } + + public void setTenant(String tenant) { + this.tenant = tenant; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/LoginForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/LoginForm.java new file mode 100644 index 0000000000000000000000000000000000000000..41a3ce228aa59edddbbbe45821ba36c4b768bb73 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/LoginForm.java @@ -0,0 +1,68 @@ + + +package com.idcos.enterprise.portal.form; + +import org.hibernate.validator.constraints.NotBlank; + +// auto generated imports + +import com.idcos.cloud.biz.common.BaseForm; + +/** + * 表单对象LoginForm + * <p>第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖</p> + * + * @author yanlv + * @version LoginForm.java, v 1.1 2015-06-09 10:00:37 yanlv Exp $ + */ + +public class LoginForm extends BaseForm { + + //========== properties ========== + /** + * loginId + */ + @NotBlank(message = "登录id") + private String loginId; + + /** + * password + */ + @NotBlank(message = "密码") + private String password; + + + /** + * 租户id + */ + @NotBlank(message = "tenant") + private String tenantId; + + + //========== getters and setters ========== + + + public String getLoginId() { + return loginId; + } + + public void setLoginId(String loginId) { + this.loginId = loginId; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/ModifyPasswordForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/ModifyPasswordForm.java new file mode 100644 index 0000000000000000000000000000000000000000..4e9887d9fb209a9e5a09fe398ceb44d24172047a --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/ModifyPasswordForm.java @@ -0,0 +1,56 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.form; + +import org.hibernate.validator.constraints.NotBlank; + +/** + * @author Dana + * @version ModifyPasswordForm.java, v1 2017/12/7 下午1:55 Dana Exp $$ + */ +public class ModifyPasswordForm { + /** + * 用户ID. + */ + @NotBlank(message = "用户Id") + private String userId; + + /** + * 用户老的密码 + */ + @NotBlank(message = "原始密码") + private String oldPassword; + + /** + * 用户新的密码。 + */ + @NotBlank(message = "新密码") + private String newPassword; + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getOldPassword() { + return oldPassword; + } + + public void setOldPassword(String oldPassword) { + this.oldPassword = oldPassword; + } + + public String getNewPassword() { + return newPassword; + } + + public void setNewPassword(String newPassword) { + this.newPassword = newPassword; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalCommandShellApiReportForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalCommandShellApiReportForm.java new file mode 100644 index 0000000000000000000000000000000000000000..df445463b5938fd5076e0a5e37b4d1a62524f0c6 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalCommandShellApiReportForm.java @@ -0,0 +1,120 @@ + + +package com.idcos.enterprise.portal.form; + +// auto generated imports + +import com.idcos.cloud.biz.common.BaseForm; +import com.idcos.cloud.biz.common.check.anonations.DateFormat; +import com.idcos.cloud.biz.common.check.anonations.In; +import org.hibernate.validator.constraints.NotBlank; + + +/** + * 表单对象PortalCommandShellApiReportForm + * <p>form由代码自动生成框架自动生成,不可进行编辑</p> + * + * @author + * @version PortalCommandShellApiReportForm.java, v 1.1 2015-10-12 17:04:52 Exp $ + */ + +public class PortalCommandShellApiReportForm extends BaseForm { + + //========== properties ========== + /** + * 主机名 + */ + @NotBlank(message = "主机名不能为空") + private String host; + + /** + * 执行用户 + */ + @NotBlank(message = "执行用户不能为空") + private String user; + + /** + * 执行的具体命令 + */ + @NotBlank(message = "执行的具体命令不能为空") + private String command; + + /** + * 命令执行开始时间 + */ + @NotBlank(message = "命令执行开始时间不能为空") + @DateFormat(format = "yyyy-MM-dd hh:mm:ss", message = "命令执行开始时间必须为'yyyy-MM-dd hh:mm:ss'格式") + private String startAt; + + /** + * 命令执行结束时间 + */ + @NotBlank(message = "命令执行结束时间不能为空") + @DateFormat(format = "yyyy-MM-dd hh:mm:ss", message = "命令执行结束时间必须为'yyyy-MM-dd hh:mm:ss'格式") + private String endAt; + + /** + * 执行状态 + */ + @NotBlank(message = "执行状态不能为空") + @In(value = {"success", "fail"}, message = "执行状态的值必须在{'success', 'fail'}之中") + private String status; + + + //========== getters and setters ========== + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + + public String getUser() { + return user; + } + + public void setUser(String user) { + this.user = user; + } + + + public String getCommand() { + return command; + } + + public void setCommand(String command) { + this.command = command; + } + + + public String getStartAt() { + return startAt; + } + + public void setStartAt(String startAt) { + this.startAt = startAt; + } + + + public String getEndAt() { + return endAt; + } + + public void setEndAt(String endAt) { + this.endAt = endAt; + } + + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalDeptAddForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalDeptAddForm.java new file mode 100644 index 0000000000000000000000000000000000000000..662e2e6abf7db80909cd7957553b6e5efe7cd051 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalDeptAddForm.java @@ -0,0 +1,76 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.form; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.hibernate.validator.constraints.NotBlank; + +/** + * @author souakiragen + * @version $Id: , v 0.1 2017年11月04 上午11:20 souakiragen Exp $ + */ +@ApiModel +public class PortalDeptAddForm { + + @NotBlank(message = "部门编码不能为空") + @ApiModelProperty(name = "code", value = "部门编码", notes = "部门编码,不能为空", dataType = "String", required = true) + private String code; + + @NotBlank(message = "部门名称不能为空") + @ApiModelProperty(name = "displayName", value = "部门名称", notes = "部门名称,不能为空", dataType = "String", required = true) + private String displayName; + + @ApiModelProperty(name = "parentId", value = "父级部门ID", notes = "属于哪个部门", dataType = "String", required = false) + private String parentId; + + @ApiModelProperty(name = "remark", value = "备注", notes = "备注", dataType = "String", required = false) + private String remark; + + @NotBlank(message = "租户不能为空") + @ApiModelProperty(name = "tenantId", value = "租户id", notes = "租户id,不能为空", dataType = "String", required = true) + private String tenantId; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalDeptAssignRoleForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalDeptAssignRoleForm.java new file mode 100644 index 0000000000000000000000000000000000000000..fc9d618aec7223f41417ab5122573e24c945e074 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalDeptAssignRoleForm.java @@ -0,0 +1,44 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.form; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.hibernate.validator.constraints.NotBlank; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +/** + * @author souakiragen + * @version $Id: , v 0.1 2017年11月04 下午3:48 souakiragen Exp $ + */ +@ApiModel(value = "为部门分配角色") +public class PortalDeptAssignRoleForm { + + @ApiModelProperty(name = "id", value = "部门id", required = true) + @NotBlank(message = "部门id不能为空") + private String id; + + @ApiModelProperty(name = "roleIds", value = "角色id列表", required = false) + private List<String> roleIds; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public List<String> getRoleIds() { + return roleIds; + } + + public void setRoleIds(List<String> roleIds) { + this.roleIds = roleIds; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalDeptUpdateForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalDeptUpdateForm.java new file mode 100644 index 0000000000000000000000000000000000000000..ae79ee1aaee6780d5336bc840de625e482cd2b40 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalDeptUpdateForm.java @@ -0,0 +1,30 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.form; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.hibernate.validator.constraints.NotBlank; + +/** + * @author souakiragen + * @version $Id: , v 0.1 2017年11月04 下午2:30 souakiragen Exp $ + */ +@ApiModel(value = "修改部门") +public class PortalDeptUpdateForm extends PortalDeptAddForm { + + @ApiModelProperty(name = "id", value = "部门id", notes = "要修改的部门id", required = true) + @NotBlank(message = "部门id不能为空") + private String id; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalGroupAllocateUserForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalGroupAllocateUserForm.java new file mode 100644 index 0000000000000000000000000000000000000000..3b72b68253f7fec430ffba5eb3db9c1a7ed0c90e --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalGroupAllocateUserForm.java @@ -0,0 +1,157 @@ + + +package com.idcos.enterprise.portal.form; + +import org.hibernate.validator.constraints.NotBlank; + +// auto generated imports +import com.idcos.cloud.biz.common.BaseForm; + +/** + * 表单对象PortalUserUpdateForm + * <p>form由代码自动生成框架自动生成,不可进行编辑</p> + * + * @author + * @version PortalUserUpdateForm.java, v 1.1 2015-11-07 16:44:40 Exp $ + */ + +public class PortalGroupAllocateUserForm extends BaseForm { + + @NotBlank(message = "用户id不能为空") + private String id; + + private String nameCN; + + private String nameEN; + + private String deptId; + + private String deptName; + + private String title; + + private String mobile; + + private String wexin; + + private String fax; + + private String email; + + private String tel; + + private String remark; + + /** + * 操作类型 I:新增、D:删除 + */ + @NotBlank(message = "操作类型不能为空") + private String operType; + + //========== getters and setters ========== + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getDeptId() { + return deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getNameCN() { + return nameCN; + } + + public void setNameCN(String nameCN) { + this.nameCN = nameCN; + } + + public String getNameEN() { + return nameEN; + } + + public void setNameEN(String nameEN) { + this.nameEN = nameEN; + } + + public String getWexin() { + return wexin; + } + + public void setWexin(String wexin) { + this.wexin = wexin; + } + + public String getFax() { + return fax; + } + + public void setFax(String fax) { + this.fax = fax; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getTel() { + return tel; + } + + public void setTel(String tel) { + this.tel = tel; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getOperType() { + return operType; + } + + public void setOperType(String operType) { + this.operType = operType; + } + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalGroupAndUserCreateForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalGroupAndUserCreateForm.java new file mode 100644 index 0000000000000000000000000000000000000000..5df2d2882157a36134fadd5a4f7eacec4868ee22 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalGroupAndUserCreateForm.java @@ -0,0 +1,75 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.form; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.hibernate.validator.constraints.NotBlank; + +/** + * @author Dana + * @version PortalGroupAndUserCreateForm.java, v1 2017/12/25 上午11:43 Dana Exp $$ + */ +@ApiModel(value = "新建用户组(包括用户)") +public class PortalGroupAndUserCreateForm { + + @ApiModelProperty(name = "groupName", value = "用户组名", required = true) + @NotBlank(message = "用户组名") + private String groupName; + + @ApiModelProperty(name = "groupType", value = "用户组类型") + private String groupType; + + @ApiModelProperty(name = "groupRemark", value = "用户组备注") + private String groupRemark; + + @ApiModelProperty(name = "tenantId", value = "租户", required = true) + @NotBlank(message = "租户") + private String tenantId; + + @ApiModelProperty(name = "loginIds", value = "用户登录id列表") + private String loginIds; + + public String getGroupName() { + return groupName; + } + + public void setGroupName(String groupName) { + this.groupName = groupName; + } + + public String getGroupType() { + return groupType; + } + + public void setGroupType(String groupType) { + this.groupType = groupType; + } + + public String getGroupRemark() { + return groupRemark; + } + + public void setGroupRemark(String groupRemark) { + this.groupRemark = groupRemark; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getLoginIds() { + return loginIds; + } + + public void setLoginIds(String loginIds) { + this.loginIds = loginIds; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalGroupAndUserUpdateForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalGroupAndUserUpdateForm.java new file mode 100644 index 0000000000000000000000000000000000000000..53a5924c48c9995451b057af1126f4d4e9959228 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalGroupAndUserUpdateForm.java @@ -0,0 +1,87 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.form; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.hibernate.validator.constraints.NotBlank; + +/** + * @author Dana + * @version PortalGroupAndUserCreateForm.java, v1 2017/12/25 上午11:43 Dana Exp $$ + */ +@ApiModel(value = "更新用户组(包括用户)") +public class PortalGroupAndUserUpdateForm { + + @ApiModelProperty(name = "groupId", value = "用户组id", required = true) + @NotBlank(message = "用户组id") + private String groupId; + + @ApiModelProperty(name = "groupName", value = "用户组名", required = true) + @NotBlank(message = "用户组名") + private String groupName; + + @ApiModelProperty(name = "groupType", value = "用户组类型") + private String groupType; + + @ApiModelProperty(name = "groupRemark", value = "用户组备注") + private String groupRemark; + + @ApiModelProperty(name = "tenantId", value = "租户", required = true) + @NotBlank(message = "租户") + private String tenantId; + + @ApiModelProperty(name = "loginIds", value = "用户登录id列表") + private String loginIds; + + public String getGroupId() { + return groupId; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } + + public String getGroupName() { + return groupName; + } + + public void setGroupName(String groupName) { + this.groupName = groupName; + } + + public String getGroupType() { + return groupType; + } + + public void setGroupType(String groupType) { + this.groupType = groupType; + } + + public String getGroupRemark() { + return groupRemark; + } + + public void setGroupRemark(String groupRemark) { + this.groupRemark = groupRemark; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getLoginIds() { + return loginIds; + } + + public void setLoginIds(String loginIds) { + this.loginIds = loginIds; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalPermissionQueryAuthObjForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalPermissionQueryAuthObjForm.java new file mode 100644 index 0000000000000000000000000000000000000000..a8a3339f708f975b79de8a23c4eba33628f229e8 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalPermissionQueryAuthObjForm.java @@ -0,0 +1,70 @@ + + +package com.idcos.enterprise.portal.form; + +// auto generated imports + +import com.idcos.cloud.biz.common.BaseForm; +import org.hibernate.validator.constraints.NotBlank; + + +/** + * 表单对象PortalPermissionQueryAuthObjForm + * <p>第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖</p> + * + * @author yanlv + * @version PortalPermissionQueryAuthObjForm.java, v 1.1 2015-06-09 10:00:37 yanlv Exp $ + */ + +public class PortalPermissionQueryAuthObjForm extends BaseForm { + + //========== properties ========== + /** + * 授权资源类型 + */ + @NotBlank(message = "授权资源类型不能为空") + private String authResType; + + /** + * 授权资源ID + */ + @NotBlank(message = "授权资源ID不能为空") + private String authResId; + + /** + * 授权对象类型 + */ + @NotBlank(message = "授权对象类型不能为空") + private String authObjType; + + + //========== getters and setters ========== + + public String getAuthResType() { + return authResType; + } + + public void setAuthResType(String authResType) { + this.authResType = authResType; + } + + + public String getAuthResId() { + return authResId; + } + + public void setAuthResId(String authResId) { + this.authResId = authResId; + } + + + public String getAuthObjType() { + return authObjType; + } + + public void setAuthObjType(String authObjType) { + this.authObjType = authObjType; + } + + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalPermissionQueryAuthResForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalPermissionQueryAuthResForm.java new file mode 100644 index 0000000000000000000000000000000000000000..08a0ca1d186c2e4f7fec37ec90d6613907e1eee8 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalPermissionQueryAuthResForm.java @@ -0,0 +1,70 @@ + + +package com.idcos.enterprise.portal.form; + +// auto generated imports + +import com.idcos.cloud.biz.common.BaseForm; +import org.hibernate.validator.constraints.NotBlank; + + +/** + * 表单对象PortalPermissionQueryAuthResForm + * <p>第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖</p> + * + * @author yanlv + * @version PortalPermissionQueryAuthResForm.java, v 1.1 2015-06-09 10:00:37 yanlv Exp $ + */ + +public class PortalPermissionQueryAuthResForm extends BaseForm { + + //========== properties ========== + /** + * 授权资源类型 + */ + @NotBlank(message = "授权资源类型不能为空") + private String authResType; + + /** + * 授权对象类型 + */ + @NotBlank(message = "授权对象类型不能为空") + private String authObjType; + + /** + * 授权对象ID + */ + @NotBlank(message = "授权对象ID不能为空") + private String authObjId; + + + //========== getters and setters ========== + + public String getAuthResType() { + return authResType; + } + + public void setAuthResType(String authResType) { + this.authResType = authResType; + } + + + public String getAuthObjType() { + return authObjType; + } + + public void setAuthObjType(String authObjType) { + this.authObjType = authObjType; + } + + + public String getAuthObjId() { + return authObjId; + } + + public void setAuthObjId(String authObjId) { + this.authObjId = authObjId; + } + + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalPermissionSaveAuthObjForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalPermissionSaveAuthObjForm.java new file mode 100644 index 0000000000000000000000000000000000000000..ae5f4e3ba784a1f155fb3c2ec6a8eaebd42c95e3 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalPermissionSaveAuthObjForm.java @@ -0,0 +1,93 @@ + + +package com.idcos.enterprise.portal.form; + +// auto generated imports + +import org.hibernate.validator.constraints.NotBlank; + +import com.idcos.cloud.biz.common.BaseForm; + +/** + * 表单对象PortalPermissionSaveAuthObjForm + * <p>第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖</p> + * + * @author yanlv + * @version PortalPermissionSaveAuthObjForm.java, v 1.1 2015-06-09 10:00:37 yanlv Exp $ + */ + +public class PortalPermissionSaveAuthObjForm extends BaseForm { + + //========== properties ========== + /** + * 授权资源类型 + */ + @NotBlank(message = "授权资源类型不能为空") + private String authResType; + + /** + * 授权资源ID + */ + @NotBlank(message = "授权资源ID不能为空") + private String authResId; + + /** + * 授权资源ID + */ + @NotBlank(message = "授权资源名称不能为空") + private String authResName; + + /** + * 授权对象类型 + */ + @NotBlank(message = "授权对象类型不能为空") + private String authObjType; + + /** + * null + */ + private String authObjIds; + + //========== getters and setters ========== + + public String getAuthResType() { + return authResType; + } + + public void setAuthResType(String authResType) { + this.authResType = authResType; + } + + public String getAuthResName() { + return authResName; + } + + public void setAuthResName(String authResName) { + this.authResName = authResName; + } + + public String getAuthResId() { + return authResId; + } + + public void setAuthResId(String authResId) { + this.authResId = authResId; + } + + public String getAuthObjType() { + return authObjType; + } + + public void setAuthObjType(String authObjType) { + this.authObjType = authObjType; + } + + public String getAuthObjIds() { + return authObjIds; + } + + public void setAuthObjIds(String authObjIds) { + this.authObjIds = authObjIds; + } + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalPermissionSaveAuthResForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalPermissionSaveAuthResForm.java new file mode 100644 index 0000000000000000000000000000000000000000..286c51ff5057e3483a5967fc95208f8a511da09c --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalPermissionSaveAuthResForm.java @@ -0,0 +1,106 @@ + + +package com.idcos.enterprise.portal.form; + +// auto generated imports + +import org.hibernate.validator.constraints.NotBlank; + +import com.idcos.cloud.biz.common.BaseForm; + +/** + * 表单对象PortalPermissionSaveAuthResForm + * <p>第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖</p> + * + * @author yanlv + * @version PortalPermissionSaveAuthResForm.java, v 1.1 2015-06-09 10:00:37 yanlv Exp $ + */ + +public class PortalPermissionSaveAuthResForm extends BaseForm { + + //========== properties ========== + /** + * 授权资源类型 + */ + @NotBlank(message = "授权资源类型不能为空") + private String authResType; + + /** + * 授权资源信息 + */ + @NotBlank(message = "授权资源信息不能为空") + private String authResId; + + /** + * 权限资源名称 + */ + private String authResName; + + /** + * 操作类型 I:新增/D:删除 + */ + private String operType; + + /** + * 授权对象类型 + */ + @NotBlank(message = "授权对象类型不能为空") + private String authObjType; + + /** + * 授权对象ID + */ + @NotBlank(message = "授权对象ID不能为空") + private String authObjId; + + //========== getters and setters ========== + + public String getAuthResType() { + return authResType; + } + + public void setAuthResType(String authResType) { + this.authResType = authResType; + } + + public String getAuthResId() { + return authResId; + } + + public void setAuthResId(String authResId) { + this.authResId = authResId; + } + + public String getAuthResName() { + return authResName; + } + + public void setAuthResName(String authResName) { + this.authResName = authResName; + } + + public String getOperType() { + return operType; + } + + public void setOperType(String operType) { + this.operType = operType; + } + + public String getAuthObjType() { + return authObjType; + } + + public void setAuthObjType(String authObjType) { + this.authObjType = authObjType; + } + + public String getAuthObjId() { + return authObjId; + } + + public void setAuthObjId(String authObjId) { + this.authObjId = authObjId; + } + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalQueryByPageForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalQueryByPageForm.java new file mode 100644 index 0000000000000000000000000000000000000000..210262b54d607120ec16bba17037ea2420c1c518 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalQueryByPageForm.java @@ -0,0 +1,38 @@ + +package com.idcos.enterprise.portal.form; + +import com.idcos.cloud.core.dal.common.page.PageForm; +import com.idcos.cloud.core.dal.common.query.DataQueryField; +import com.idcos.cloud.core.dal.common.query.OperatorEnum; + +/** + * 权限资源管理通用查询form + * + * @author pengganyu + * @version $Id: PortalQueryByPageForm.java, v 0.1 2016年6月1日 下午7:27:36 pengganyu Exp $ + */ +public class PortalQueryByPageForm extends PageForm { + + @DataQueryField + private String id; + + @DataQueryField(operator = OperatorEnum.LIKE) + private String cnd; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getCnd() { + return cnd; + } + + public void setCnd(String cnd) { + this.cnd = cnd; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalResourceCreateForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalResourceCreateForm.java new file mode 100644 index 0000000000000000000000000000000000000000..e4dbf95009c8e0e0de5f8fa7b1411e675413ec0e --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalResourceCreateForm.java @@ -0,0 +1,93 @@ + + +package com.idcos.enterprise.portal.form; + +// auto generated imports + +import org.hibernate.validator.constraints.NotBlank; + +import com.idcos.cloud.biz.common.BaseForm; + +/** + * 表单对象PortalResourceCreateForm + * <p>第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖</p> + * + * @author yanlv + * @version PortalResourceCreateForm.java, v 1.1 2015-06-09 10:00:37 yanlv Exp $ + */ + +public class PortalResourceCreateForm extends BaseForm { + + //========== properties ========== + /** + * 权限资源类型 + */ + @NotBlank(message = "权限资源类型不能为空") + private String code; + + /** + * 权限资源名称 + */ + @NotBlank(message = "权限资源名称不能为空") + private String name; + + /** + * 权限资源URL + */ + @NotBlank(message = "权限资源URL不能为空") + private String url; + + /** + * 系统名称 + */ + @NotBlank(message = "系统名称不能为空") + private String appId; + + /** + * 备注 + */ + private String remark; + + //========== getters and setters ========== + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalResourceUpdateForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalResourceUpdateForm.java new file mode 100644 index 0000000000000000000000000000000000000000..2a437cd18e8d3b1c0848dd40bcb9a02e8dc830ed --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalResourceUpdateForm.java @@ -0,0 +1,93 @@ + + +package com.idcos.enterprise.portal.form; + +// auto generated imports + +import org.hibernate.validator.constraints.NotBlank; + +import com.idcos.cloud.biz.common.BaseForm; + +/** + * 表单对象PortalResourceUpdateForm + * <p>第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖</p> + * + * @author yanlv + * @version PortalResourceUpdateForm.java, v 1.1 2015-06-09 10:00:37 yanlv Exp $ + */ + +public class PortalResourceUpdateForm extends BaseForm { + + //========== properties ========== + /** + * 权限资源类型 + */ + @NotBlank(message = "权限资源类型不能为空") + private String code; + + /** + * 权限资源名称 + */ + @NotBlank(message = "权限资源名称不能为空") + private String name; + + /** + * 权限资源URL + */ + @NotBlank(message = "权限资源URL不能为空") + private String url; + + /** + * 系统名称 + */ + @NotBlank(message = "系统名称不能为空") + private String appId; + + /** + * 备注 + */ + private String remark; + + //========== getters and setters ========== + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalRoleCreateForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalRoleCreateForm.java new file mode 100644 index 0000000000000000000000000000000000000000..01330667f13f83f7aa223d6b0799f4248849a8ed --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalRoleCreateForm.java @@ -0,0 +1,84 @@ + + +package com.idcos.enterprise.portal.form; + +// auto generated imports + +import com.idcos.cloud.biz.common.BaseForm; +import org.hibernate.validator.constraints.NotBlank; + + +/** + * 表单对象PortalRoleCreateForm + * <p>form由代码自动生成框架自动生成,不可进行编辑</p> + * + * @author + * @version PortalRoleCreateForm.java, v 1.1 2015-10-30 15:00:49 Exp $ + */ + +public class PortalRoleCreateForm extends BaseForm { + + //========== properties ========== + /** + * 名称 + */ + @NotBlank(message = "名称不能为空") + private String name; + + /** + * 编码 + */ + @NotBlank(message = "编码不能为空") + private String code; + + + /** + * 备注 + */ + private String remark; + + /** + * 编辑类型 + */ + private String editType; + + + //========== getters and setters ========== + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + + public String getEditType() { + return editType; + } + + public void setEditType(String editType) { + this.editType = editType; + } + + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalRoleQueryByPageForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalRoleQueryByPageForm.java new file mode 100644 index 0000000000000000000000000000000000000000..3b619d1f9f421b6d655a3817cc9fb67f5d3b361b --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalRoleQueryByPageForm.java @@ -0,0 +1,66 @@ + + +package com.idcos.enterprise.portal.form; + +// auto generated imports + +import com.idcos.cloud.biz.common.BaseForm; +import com.idcos.cloud.core.dal.common.query.DataQueryField; +import com.idcos.cloud.core.dal.common.query.OperatorEnum; + +/** + * 表单对象PortalRoleQueryByPageForm + * <p>form由代码自动生成框架自动生成,不可进行编辑</p> + * + * @author + * @version PortalRoleQueryByPageForm.java, v 1.1 2015-10-30 15:00:49 Exp $ + */ + +public class PortalRoleQueryByPageForm extends BaseForm { + + //========== properties ========== + /** + * 名称 + */ + @DataQueryField(operator = OperatorEnum.LIKE) + private String name; + + /** + * 编码 + */ + @DataQueryField + private String code; + + /** + * 备注 + */ + @DataQueryField + private String remark; + + //========== getters and setters ========== + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalRoleUpdateForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalRoleUpdateForm.java new file mode 100644 index 0000000000000000000000000000000000000000..fc9285c2d05e5f9028be1e609e6077a88e2aaaa9 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalRoleUpdateForm.java @@ -0,0 +1,83 @@ + + +package com.idcos.enterprise.portal.form; + +// auto generated imports + +import com.idcos.cloud.biz.common.BaseForm; +import org.hibernate.validator.constraints.NotBlank; + + +/** + * 表单对象PortalRoleUpdateForm + * <p>form由代码自动生成框架自动生成,不可进行编辑</p> + * + * @author + * @version PortalRoleUpdateForm.java, v 1.1 2015-10-30 15:00:49 Exp $ + */ + +public class PortalRoleUpdateForm extends BaseForm { + + //========== properties ========== + /** + * 名称 + */ + @NotBlank(message = "名称不能为空") + private String name; + + /** + * 编码 + */ + @NotBlank(message = "编码不能为空") + private String code; + + /** + * 备注 + */ + private String remark; + + /** + * 编辑类型 + */ + private String editType; + + + //========== getters and setters ========== + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + + public String getEditType() { + return editType; + } + + public void setEditType(String editType) { + this.editType = editType; + } + + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalTenantAddForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalTenantAddForm.java new file mode 100644 index 0000000000000000000000000000000000000000..04d1cd7060b2ee4c9d1577276cba497cabdbdc2f --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalTenantAddForm.java @@ -0,0 +1,39 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.form; + +import io.swagger.annotations.ApiModelProperty; +import org.hibernate.validator.constraints.NotBlank; + +/** + * @author souakiragen + * @version $Id: , v 0.1 2017年11月07 上午9:14 souakiragen Exp $ + */ +public class PortalTenantAddForm { + + @ApiModelProperty(name = "tenantId", value = "租户id", notes = "租户id", required = true) + @NotBlank(message = "租户id不能为空") + private String tenantId; + @NotBlank(message = "租户的名称不能为空") + @ApiModelProperty(name = "tenantName", value = "租户的名称", notes = "租户的名称", required = true) + private String tenantName; + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getTenantName() { + return tenantName; + } + + public void setTenantName(String tenantName) { + this.tenantName = tenantName; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalTenantQueryPageListForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalTenantQueryPageListForm.java new file mode 100644 index 0000000000000000000000000000000000000000..1078e4c838f5ea2952a2b346d99eabed5866fd5f --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalTenantQueryPageListForm.java @@ -0,0 +1,36 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.form; + + +/** + * @author souakiragen + * @version $Id: , v 0.1 2017年11月07 上午10:08 souakiragen Exp $ + */ +public class PortalTenantQueryPageListForm { + + private String tenantId; + + private String tenantName; + + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getTenantName() { + return tenantName; + } + + public void setTenantName(String tenantName) { + this.tenantName = tenantName; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalTenantUpdateForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalTenantUpdateForm.java new file mode 100644 index 0000000000000000000000000000000000000000..93a2aa8cf336bdaa067369c411a92b5023621a57 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalTenantUpdateForm.java @@ -0,0 +1,46 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.form; + +import org.hibernate.validator.constraints.NotBlank; + +/** + * @author souakiragen + * @version $Id: , v 0.1 2017年11月07 上午10:38 souakiragen Exp $ + */ +public class PortalTenantUpdateForm { + + @NotBlank(message = "id不能为空") + private String id; + @NotBlank(message = "tenantId不能为空") + private String tenantId; + @NotBlank(message = "租户名称不能为空") + private String tenantName; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getTenantName() { + return tenantName; + } + + public void setTenantName(String tenantName) { + this.tenantName = tenantName; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalUserAddForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalUserAddForm.java new file mode 100644 index 0000000000000000000000000000000000000000..2df3e3ac619f889c23900900bc1de132910cb60a --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalUserAddForm.java @@ -0,0 +1,255 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.form; + +import com.idcos.cloud.biz.common.BaseForm; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.StringUtils; +import org.hibernate.validator.constraints.NotBlank; + +/** + * @author souakiragen + * @version $Id: , v 0.1 2017年11月01 下午8:20 souakiragen Exp $ + */ +@ApiModel(value = "新增用户", description = "新增用户") +public class PortalUserAddForm extends BaseForm { + + //========== properties ========== + /** + * 登录名。 + */ + @ApiModelProperty(name = "loginId", value = "员工登录名", notes = "员工的登录名,不能重复", required = true) + @NotBlank(message = "登录名不能为空") + private String loginId; + + /** + * 中文名。 + */ + @NotBlank(message = "用户名称不能为空") + @ApiModelProperty(name = "loginId", value = "员工中文名", notes = "中文名称,可能会重复。", required = true) + private String name; + + + /** + * 部门ID。 + */ + @ApiModelProperty(name = "deptId", value = "部门ID", notes = "部门内部ID。", required = false) + private String deptId; + + /** + * 职务。 + */ + @ApiModelProperty(name = "title", value = "职务", notes = "职务", required = false) + private String title; + + /** + * 移动电话 + */ + @ApiModelProperty(name = "mobile1", value = "移动电话1", notes = "移动电话1", required = false) + private String mobile1; + + /** + * 移动电话 + */ + @ApiModelProperty(name = "mobile2", value = "移动电话2", notes = "移动电话2", required = false) + private String mobile2; + + /** + * rtx + */ + @ApiModelProperty(name = "rtx", value = "RTX", notes = "RTX", required = false) + private String rtx; + + /** + * 办公电话 + */ + @ApiModelProperty(name = "officeTel1", value = "办公电话1", notes = "办公电话1", required = false) + private String officeTel1; + + /** + * 办公电话 + */ + @ApiModelProperty(name = "officeTel2", value = "办公电话2", notes = "办公电话2", required = false) + private String officeTel2; + + /** + * 员工类型 + */ + @ApiModelProperty(name = "employeeType", value = "员工类型", notes = "员工类型", required = false) + private String employeeType; + /** + * 微信。 + */ + @ApiModelProperty(name = "weixin", value = "微信号", notes = "微信号", required = false) + private String weixin; + + /** + * 邮箱。 + */ + @ApiModelProperty(name = "email", value = "邮箱", notes = "电子邮箱地址。", required = false) + private String email; + + /** + * 备注 + */ + @ApiModelProperty(name = "remark", value = "备注", notes = "备注", required = false) + private String remark = ""; + + /** + * 租户 + */ + @NotBlank(message = "租户不能为空") + @ApiModelProperty(name = "tenantId", value = "租户Id", notes = "租户Id", required = true) + private String tenantId; + + /** + * 密码。 + */ + @NotBlank(message = "密码不能为空") + @ApiModelProperty(name = "password", value = "密码", notes = "密码", required = true) + private String password; + + /** + * 确认密码。 + */ + @NotBlank(message = "确认密码不能为空") + @ApiModelProperty(name = "confirmPassword", value = "密码", notes = "密码", required = true) + private String confirmPassword; + + public String getLoginId() { + return loginId; + } + + /** + * 去除首尾空格 + * + * @param loginId + */ + public void setLoginId(String loginId) { + this.loginId = StringUtils.trim(loginId); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDeptId() { + return deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getMobile1() { + return mobile1; + } + + public void setMobile1(String mobile1) { + this.mobile1 = mobile1; + } + + public String getMobile2() { + return mobile2; + } + + public void setMobile2(String mobile2) { + this.mobile2 = mobile2; + } + + public String getRtx() { + return rtx; + } + + public void setRtx(String rtx) { + this.rtx = rtx; + } + + public String getOfficeTel1() { + return officeTel1; + } + + public void setOfficeTel1(String officeTel1) { + this.officeTel1 = officeTel1; + } + + public String getOfficeTel2() { + return officeTel2; + } + + public void setOfficeTel2(String officeTel2) { + this.officeTel2 = officeTel2; + } + + public String getEmployeeType() { + return employeeType; + } + + public void setEmployeeType(String employeeType) { + this.employeeType = employeeType; + } + + public String getWeixin() { + return weixin; + } + + public void setWeixin(String weixin) { + this.weixin = weixin; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getConfirmPassword() { + return confirmPassword; + } + + public void setConfirmPassword(String confirmPassword) { + this.confirmPassword = confirmPassword; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalUserAllocateGroupForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalUserAllocateGroupForm.java new file mode 100644 index 0000000000000000000000000000000000000000..0c3d98d1b8388682777dfab9d92b68b92582a819 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalUserAllocateGroupForm.java @@ -0,0 +1,46 @@ +package com.idcos.enterprise.portal.form; + +import org.hibernate.validator.constraints.NotBlank; + +import com.idcos.cloud.biz.common.BaseForm; + +/** + * 用户表单提交类 + * + * @author jiaohuizhe + * @version $Id: PortalUserForm.java, v 0.1 2015年5月8日 上午11:03:29 jiaohuizhe Exp $ + */ +public class PortalUserAllocateGroupForm extends BaseForm { + + @NotBlank(message = "用户id不能为空") + private String id; + + private String selGroups; + + private String tenantId; + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSelGroups() { + return selGroups; + } + + public void setSelGroups(String selGroups) { + this.selGroups = selGroups; + } + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalUserGroupQueryByPageForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalUserGroupQueryByPageForm.java new file mode 100644 index 0000000000000000000000000000000000000000..280ded19e4bcfedc3767b3f8af74f20a7bd87fdb --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalUserGroupQueryByPageForm.java @@ -0,0 +1,101 @@ + + +package com.idcos.enterprise.portal.form; + +// auto generated imports + +import com.idcos.cloud.biz.common.BaseForm; +import com.idcos.cloud.core.dal.common.query.DataQueryField; +import com.idcos.cloud.core.dal.common.query.OperatorEnum; + +/** + * 表单对象PortalUserGroupQueryByPageForm + * <p>form由代码自动生成框架自动生成,不可进行编辑</p> + * + * @author + * @version PortalUserGroupQueryByPageForm.java, v 1.1 2015-10-28 14:17:42 Exp $ + */ + +public class PortalUserGroupQueryByPageForm extends BaseForm { + + //========== properties ========== + /** + * 名称 + */ + @DataQueryField(operator = OperatorEnum.LIKE) + private String name; + + /** + * 类型 + */ + @DataQueryField + private String type; + + /** + * 租户 + */ + @DataQueryField(name = "tenant") + private String tenantId; + + /** + * 备注 + */ + @DataQueryField + private String remark; + + /** + * 所属角色 + */ + @DataQueryField + private String selectRoles; + + /** + * 包含用户 + */ + @DataQueryField + private String selectUsers; + + //========== getters and setters ========== + + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getSelectRoles() { + return selectRoles; + } + + public void setSelectRoles(String selectRoles) { + this.selectRoles = selectRoles; + } + + public String getSelectUsers() { + return selectUsers; + } + + public void setSelectUsers(String selectUsers) { + this.selectUsers = selectUsers; + } + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalUserLoginForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalUserLoginForm.java new file mode 100644 index 0000000000000000000000000000000000000000..1684fb264710f726fd776443aa107bdce819b596 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalUserLoginForm.java @@ -0,0 +1,50 @@ + +package com.idcos.enterprise.portal.form; + +import com.idcos.cloud.biz.common.BaseForm; + +/** + * 用户登陆form请求 + * + * @author yanlv + * @version $Id: PortalUserLoginForm.java, v 0.1 2015年7月16日 上午9:52:04 yanlv Exp $ + */ +public class PortalUserLoginForm extends BaseForm { + private String username; + private String password; + private String rememberMe; + private String source; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getRememberMe() { + return rememberMe; + } + + public void setRememberMe(String rememberMe) { + this.rememberMe = rememberMe; + } + + public String getSource() { + return source; + } + + public void setSource(String source) { + this.source = source; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalUserQueryByPageForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalUserQueryByPageForm.java new file mode 100644 index 0000000000000000000000000000000000000000..d368cc50352f5420b8352ad7c932522441dd58b9 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalUserQueryByPageForm.java @@ -0,0 +1,49 @@ + +package com.idcos.enterprise.portal.form; + +import com.idcos.cloud.biz.common.BaseForm; +import com.idcos.cloud.core.dal.common.query.DataQueryField; +import com.idcos.cloud.core.dal.common.query.OperatorEnum; + +/** + * 权限资源管理通用查询form + * + * @author pengganyu + * @version $Id: PortalQueryByPageForm.java, v 0.1 2016年6月1日 下午7:27:36 pengganyu Exp $ + */ +public class PortalUserQueryByPageForm extends BaseForm { + + @DataQueryField + private String id; + + @DataQueryField(operator = OperatorEnum.LIKE) + private String nameCn; + + @DataQueryField(operator = OperatorEnum.LIKE) + private String nameEn; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getNameCn() { + return nameCn; + } + + public void setNameCn(String nameCn) { + this.nameCn = nameCn; + } + + public String getNameEn() { + return nameEn; + } + + public void setNameEn(String nameEn) { + this.nameEn = nameEn; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalUserQueryPageListForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalUserQueryPageListForm.java new file mode 100644 index 0000000000000000000000000000000000000000..c400cc0e74c71e84ee481fed3c58c13b820da652 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalUserQueryPageListForm.java @@ -0,0 +1,89 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.form; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.hibernate.validator.constraints.NotBlank; + +/** + * @author souakiragen + * @version $Id: , v 0.1 2017年11月02 下午5:36 souakiragen Exp $ + */ +@ApiModel("分页查询") +public class PortalUserQueryPageListForm { + + /** + * 租户id + */ + @ApiModelProperty(name = "tenantId", value = "租户id", notes = "租户id", required = true) + @NotBlank(message = "租户不能为空") + private String tenantId; + + /** + * 部门id + */ + @ApiModelProperty(name = "deptId", value = "部门id", notes = "部门id") + private String deptId; + + /** + * 用户名称 + */ + @ApiModelProperty(name = "name", value = "用户名称", notes = "用户名称,查询条件") + private String name; + + /** + * 页码 + */ + @ApiModelProperty(name = "pageNo", value = "页码", notes = "第几页") + private int pageNo; + + /** + * 分页大小 + */ + @ApiModelProperty(name = "pageSize", value = "分页大小", notes = "每页的记录数") + private int pageSize; + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getDeptId() { + return deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + + public int getPageNo() { + return pageNo; + } + + public void setPageNo(int pageNo) { + this.pageNo = pageNo; + } + + public int getPageSize() { + return pageSize; + } + + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalUserUpdateForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalUserUpdateForm.java new file mode 100644 index 0000000000000000000000000000000000000000..9fd80ad1531e766791896ea21f1406e3658a474f --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/PortalUserUpdateForm.java @@ -0,0 +1,250 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.form; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.StringUtils; +import org.hibernate.validator.constraints.NotBlank; + +/** + * @author souakiragen + * @version $Id: , v 0.1 2017年11月03 下午8:02 souakiragen Exp $ + */ +@ApiModel("更新用户") +public class PortalUserUpdateForm { + /** + * id。 + */ + @ApiModelProperty(name = "id", value = "员工Id", notes = "员工的Id", required = true) + @NotBlank(message = "Id不能为空") + private String id; + /** + * 登录名。 + */ + @ApiModelProperty(name = "loginId", value = "员工登录名", notes = "员工的登录名,不能重复", required = true) + @NotBlank(message = "登录名不能为空") + private String loginId; + + /** + * 中文名。 + */ + @NotBlank(message = "用户名不能为空") + @ApiModelProperty(name = "loginId", value = "员工中文名", notes = "中文名称,可能会重复。", required = true) + private String name; + + + /** + * 部门ID。 + */ + @ApiModelProperty(name = "deptId", value = "部门ID", notes = "部门内部ID。", required = false) + private String deptId; + + /** + * 状态。 + */ + @ApiModelProperty(name = "status", value = "状态", notes = "状态。", required = false) + private String status; + + /** + * 职务。 + */ + @ApiModelProperty(name = "title", value = "职务", notes = "职务", required = false) + private String title; + + /** + * 移动电话 + */ + @ApiModelProperty(name = "mobile1", value = "移动电话1", notes = "移动电话1", required = false) + private String mobile1; + + /** + * 移动电话 + */ + @ApiModelProperty(name = "mobile2", value = "移动电话2", notes = "移动电话2", required = false) + private String mobile2; + + /** + * rtx + */ + @ApiModelProperty(name = "rtx", value = "RTX", notes = "RTX", required = false) + private String rtx; + + /** + * 办公电话 + */ + @ApiModelProperty(name = "officeTel1", value = "办公电话1", notes = "办公电话1", required = false) + private String officeTel1; + + /** + * 办公电话 + */ + @ApiModelProperty(name = "officeTel2", value = "办公电话2", notes = "办公电话2", required = false) + private String officeTel2; + + /** + * 员工类型 + */ + @ApiModelProperty(name = "employeeType", value = "员工类型", notes = "员工类型", required = false) + private String employeeType; + /** + * 微信。 + */ + @ApiModelProperty(name = "weixin", value = "微信号", notes = "微信号", required = false) + private String weixin; + + /** + * 邮箱。 + */ + @ApiModelProperty(name = "email", value = "邮箱", notes = "电子邮箱地址。", required = false) + private String email; + + /** + * 备注 + */ + @ApiModelProperty(name = "remark", value = "备注", notes = "备注", required = false) + private String remark = ""; + + /** + * 租户 + */ + @NotBlank(message = "租户名不能为空") + @ApiModelProperty(name = "tenantId", value = "租户Id", notes = "租户Id", required = true) + private String tenantId; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLoginId() { + return loginId; + } + + /** + * 去除首尾空格 + * + * @param loginId + */ + public void setLoginId(String loginId) { + this.loginId = StringUtils.trim(loginId); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDeptId() { + return deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getMobile1() { + return mobile1; + } + + public void setMobile1(String mobile1) { + this.mobile1 = mobile1; + } + + public String getMobile2() { + return mobile2; + } + + public void setMobile2(String mobile2) { + this.mobile2 = mobile2; + } + + public String getRtx() { + return rtx; + } + + public void setRtx(String rtx) { + this.rtx = rtx; + } + + public String getOfficeTel1() { + return officeTel1; + } + + public void setOfficeTel1(String officeTel1) { + this.officeTel1 = officeTel1; + } + + public String getOfficeTel2() { + return officeTel2; + } + + public void setOfficeTel2(String officeTel2) { + this.officeTel2 = officeTel2; + } + + public String getEmployeeType() { + return employeeType; + } + + public void setEmployeeType(String employeeType) { + this.employeeType = employeeType; + } + + public String getWeixin() { + return weixin; + } + + public void setWeixin(String weixin) { + this.weixin = weixin; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/TokenForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/TokenForm.java new file mode 100644 index 0000000000000000000000000000000000000000..fedef75e49962ace5de2521b77348f8c280e77d4 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/TokenForm.java @@ -0,0 +1,83 @@ + + +package com.idcos.enterprise.portal.form; + +// auto generated imports + +import com.idcos.cloud.biz.common.BaseForm; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.hibernate.validator.constraints.NotBlank; + +/** + * 表单对象TokenForm + * <p>第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖</p> + * + * @author yanlv + * @version TokenForm.java, v 1.1 2015-06-09 10:00:37 yanlv Exp $ + */ +@ApiModel("生成Token") +public class TokenForm extends BaseForm { + + //========== properties ========== + /** + * loginId + */ + @ApiModelProperty(name = "loginId", value = "员工登录名,eg:admin", notes = "员工的登录名,不能重复", required = true) + @NotBlank(message = "登录id") + private String loginId; + + /** + * password + */ + @ApiModelProperty(name = "password", value = "密码", notes = "登录密码", required = true) + @NotBlank(message = "密码") + private String password; + + /** + * 租户id + */ + @ApiModelProperty(name = "tenantId", value = "租户id,eg:default", notes = "租户id", required = true) + @NotBlank(message = "tenant") + private String tenantId; + + /** + * token有效时间长度 + */ + @ApiModelProperty(name = "time", value = "token过期时间,eg:'2018-10-01 08:00'表示该token会在2018年10月1日上午8点过期;这里不填写则会生成系统的永久token", notes = "token过期时间") + private String time; + + //========== getters and setters ========== + + public String getLoginId() { + return loginId; + } + + public void setLoginId(String loginId) { + this.loginId = loginId; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/form/UserListForm.java b/uam-server/src/main/java/com/idcos/enterprise/portal/form/UserListForm.java new file mode 100644 index 0000000000000000000000000000000000000000..763453840d33bdff41d1afadb6b892415810ac03 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/form/UserListForm.java @@ -0,0 +1,27 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.form; + +import java.util.List; + +/** + * @author Dana + * @version UserListForm.java, v1 2017/12/7 下午1:55 Dana Exp $$ + */ +public class UserListForm { + /** + * 用户ID. + */ + private List<String> loginIdList; + + public List<String> getLoginIdList() { + return loginIdList; + } + + public void setLoginIdList(List<String> loginIdList) { + this.loginIdList = loginIdList; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/AuthManager.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/AuthManager.java new file mode 100644 index 0000000000000000000000000000000000000000..41f9c011d63a47fd6bd66cfdaca26c05f6cdd162 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/AuthManager.java @@ -0,0 +1,63 @@ + + +package com.idcos.enterprise.portal.manager.auto; + +// auto generated imports + +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.enterprise.portal.dal.entity.PortalTenant; +import com.idcos.enterprise.portal.dal.entity.PortalUser; +import com.idcos.enterprise.portal.form.LoginForm; + +/** + * manager层controller相关的接口自动生成,此文件属于自动生成的,请勿直接修改,具体可以参考codegen工程 + * Generated by <tt>controller-codegen</tt> on 2015-11-07 16:44:40. + * + * @author jiaohuizhe + * @version PortalUserQueryManager.java, v 1.1 2015-11-07 16:44:40 jiaohuizhe Exp $ + */ +public interface AuthManager { + + /** + * 验证登录信息 + * + * @param loginForm + * @return + */ + String getAuth(LoginForm loginForm); + + /** + * post方式创建token + * + * @param loginId + * @param password + * @param tenantId + * @param time + * @return + */ + CommonResult<?> grantToken(String loginId, String password, String tenantId, String time); + + /** + * post方式创建token + * + * @param loginId + * @param tenantId + * @return + */ + CommonResult<?> grantTokenByAdmin(String loginId, String tenantId); + + /** + * 分析token + * + * @param token + * @return + */ + CommonResult<?> parseToken(String token); + + /** + * 修改盐 + * + * @return + */ + CommonResult<?> modifySalt(); +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalCommonQueryManager.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalCommonQueryManager.java new file mode 100644 index 0000000000000000000000000000000000000000..856b39b69691a92b0894ffe8ac2ca77800d77faa --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalCommonQueryManager.java @@ -0,0 +1,33 @@ + + +package com.idcos.enterprise.portal.manager.auto; + +// auto generated imports + +import com.idcos.cloud.core.common.biz.CommonResult; + +/** + * manager层controller相关的接口自动生成,此文件属于自动生成的,请勿直接修改,具体可以参考codegen工程 + * Generated by <tt>controller-codegen</tt> on 2015-08-21 10:22:49. + * + * @author yanlv + * @version PortalCommonQueryManager.java, v 1.1 2015-08-21 10:22:49 yanlv Exp $ + */ +public interface PortalCommonQueryManager { + + /** + * 获取所有角色信息 + * + * @return BaseResultVO + */ + CommonResult<?> getRoleList(); + + /** + * 获取所有用户组信息 + * + * @param tenantId + * @return BaseResultVO + */ + CommonResult<?> getUserGroupList(String tenantId); + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalDeptOperateManager.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalDeptOperateManager.java new file mode 100644 index 0000000000000000000000000000000000000000..0daaaa1bc23596dadd70ec0648f31218d9e95d29 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalDeptOperateManager.java @@ -0,0 +1,50 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.manager.auto; + +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.enterprise.portal.form.PortalDeptAddForm; +import com.idcos.enterprise.portal.form.PortalDeptUpdateForm; + +/** + * @author souakiragen + * @version $Id: , v 0.1 2017年11月04 上午11:43 souakiragen Exp $ + */ +public interface PortalDeptOperateManager { + + /** + * 新增部门 + * + * @param form + * @return + */ + CommonResult<?> add(PortalDeptAddForm form); + + /** + * 修改部门 + * + * @param form + * @return + */ + CommonResult<?> update(PortalDeptUpdateForm form); + + /** + * 删除部门 + * + * @param id + * @return + */ + CommonResult<?> delete(String id); + + /** + * 分配角色 + * + * @param id + * @param roleIds + * @return + */ + CommonResult<?> assignRole(String id, String roleIds); +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalDeptQueryManager.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalDeptQueryManager.java new file mode 100644 index 0000000000000000000000000000000000000000..9b3f652ea5a7bb53b1be1965f21a8050bc9477ee --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalDeptQueryManager.java @@ -0,0 +1,56 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.manager.auto; + +import com.idcos.cloud.core.common.biz.CommonResult; + +/** + * @author Dana + * @version PortalDeptQueryManager.java, v1 2017/9/26 下午5:26 Dana Exp $$ + */ +public interface PortalDeptQueryManager { + /** + * 获取所有部门信息 + * + * @param tenantId + * @return BaseResultVO + */ + CommonResult<?> getAllDept(String tenantId); + + /** + * 获取所有部门的Tree型的树 + * + * @param tenantId + * @param treeStyle + * @return BaseResultVO + */ + CommonResult<?> getDeptsTree(String tenantId, String treeStyle); + + /** + * 根据租户id和部门id获取部门信息 + * + * @param tenantId + * @param deptId + * @return BaseResultVO + */ + CommonResult<?> getDeptByDeptId(String tenantId, String deptId); + + /** + * 根据部门id获取部门信息 + * + * @param id + * @return + */ + CommonResult<?> getDeptById(String id); + + /** + * 根据部门id获取对应的角色列表 + * + * @param id + * @return + */ + CommonResult<?> getRolesById(String id); +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalPermissionOperateManager.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalPermissionOperateManager.java new file mode 100644 index 0000000000000000000000000000000000000000..fadbc189d6d0928aef782ad6af18fdc3c227d46a --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalPermissionOperateManager.java @@ -0,0 +1,48 @@ + + +package com.idcos.enterprise.portal.manager.auto; + +// auto generated imports + +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.enterprise.portal.form.PortalPermissionSaveAuthObjForm; +import com.idcos.enterprise.portal.form.PortalPermissionSaveAuthResForm; + +import java.util.List; + +/** + * manager层controller相关的接口自动生成,此文件属于自动生成的,请勿直接修改,具体可以参考codegen工程 + * Generated by <tt>controller-codegen</tt> on 2015-06-09 10:00:37. + * + * @author yanlv + * @version PortalPermissionOperateManager.java, v 1.1 2015-06-09 10:00:37 yanlv Exp $ + */ +public interface PortalPermissionOperateManager { + + /** + * 保存授权对象关系 + * + * @param form + * @return ${method.returnType} + */ + CommonResult<?> saveAuthObj(PortalPermissionSaveAuthObjForm form); + + /** + * 保存授权资源关系 + * + * @param permissionInfo + * @return ${method.returnType} + */ + CommonResult<?> saveAuthRes(String permissionInfo); + + /** + * 绑定角色code和权限资源 + * + * @param tenantId + * @param roleCode + * @param perList + * @return + */ + CommonResult<?> assignByRoleCode(String tenantId, String roleCode, List<PortalPermissionSaveAuthResForm> perList); + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalPermissionQueryManager.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalPermissionQueryManager.java new file mode 100644 index 0000000000000000000000000000000000000000..702d99d59076629aec1fcd57b3af2788bf56e419 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalPermissionQueryManager.java @@ -0,0 +1,39 @@ + + +package com.idcos.enterprise.portal.manager.auto; + +// auto generated imports + +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.enterprise.portal.form.PortalPermissionQueryAuthObjForm; +import com.idcos.enterprise.portal.form.PortalPermissionQueryAuthResForm; + +/** + * manager层controller相关的接口自动生成,此文件属于自动生成的,请勿直接修改,具体可以参考codegen工程 + * Generated by <tt>controller-codegen</tt> on 2015-06-09 10:00:37. + * + * @author yanlv + * @version PortalPermissionQueryManager.java, v 1.1 2015-06-09 10:00:37 yanlv Exp $ + */ +public interface PortalPermissionQueryManager { + + + /** + * 获取授权对象ID + * + * @param form + * @return ${method.returnType} + */ + public CommonResult<?> queryAuthObj(PortalPermissionQueryAuthObjForm form); + + + /** + * 获取授权资源ID + * + * @param form + * @return ${method.returnType} + */ + public CommonResult<?> queryAuthRes(PortalPermissionQueryAuthResForm form); + + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalResourceOperateManager.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalResourceOperateManager.java new file mode 100644 index 0000000000000000000000000000000000000000..3208a56cf3d548b0e2932e77d4b589f9e1e7f048 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalResourceOperateManager.java @@ -0,0 +1,44 @@ + + +package com.idcos.enterprise.portal.manager.auto; + +// auto generated imports + +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.enterprise.portal.form.PortalResourceCreateForm; +import com.idcos.enterprise.portal.form.PortalResourceUpdateForm; + +/** + * 权限资源类型查询接口 + * + * @author pengganyu + * @version $Id: PortalResourceQueryManager.java, v 0.1 2016年5月10日 上午9:36:03 pengganyu Exp $ + */ +public interface PortalResourceOperateManager { + + /** + * 保存权限资源类型 + * + * @param form + * @return ${method.returnType} + */ + CommonResult<?> create(PortalResourceCreateForm form); + + /** + * 修改权限资源类型 + * + * @param form + * @param code + * @return ${method.returnType} + */ + CommonResult<?> update(String code, PortalResourceUpdateForm form); + + /** + * 删除权限资源类型 + * + * @param id 权限资源id + * @return + */ + CommonResult<?> delete(String id); + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalResourceQueryManager.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalResourceQueryManager.java new file mode 100644 index 0000000000000000000000000000000000000000..d5b11a240c03cf6a74d175612a2549c9e3c00fec --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalResourceQueryManager.java @@ -0,0 +1,31 @@ + + +package com.idcos.enterprise.portal.manager.auto; + +// auto generated imports + +import com.idcos.cloud.core.common.biz.CommonResult; + +/** + * 权限资源类型查询接口 + * + * @author pengganyu + * @version $Id: PortalResourceQueryManager.java, v 0.1 2016年5月10日 上午9:36:03 pengganyu Exp $ + */ +public interface PortalResourceQueryManager { + + /** + * 根据权限资源类型编码和有效标志查询权限资源类型信息 + * + * @param code 权限资源类型编码 + * @return PortalResource 权限资源类型 + */ + public CommonResult<?> queryByCode(String code); + + /** + * 查询所有的权限资源类型 + * + * @return + */ + public CommonResult<?> queryAll(); +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalRestfulService.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalRestfulService.java new file mode 100644 index 0000000000000000000000000000000000000000..3a51dd37774c263d8d933676a63469dc5abfa56b --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalRestfulService.java @@ -0,0 +1,61 @@ + + +package com.idcos.enterprise.portal.manager.auto; + +// auto generated imports + +import com.idcos.enterprise.portal.biz.common.PortalResponse; + +/** + * 第三方API service类 + * + * @author pengganyu + * @version $Id: PortalResfulService.java, v 0.1 2016年5月11日 下午5:03:50 pengganyu Exp $ + */ +public interface PortalRestfulService { + + /** + * 根据用户id获取用户的用户组,角色,权限信息 + * + * @param userId 用户id + * @return BaseResultVO + */ + PortalResponse queryAuthority(String userId); + + /** + * 根据查询条件查询用户信息 + * + * @param cnd 查询条件 + * @param pageNo 页号 + * @param pageSize 页大小 + * @param tenantId + * @return + */ + PortalResponse queryUserByCnd(String tenantId, String cnd, String pageNo, String pageSize); + + /** + * 根据用户组id查询用户ID列表 + * + * @param groupId 用户组id + * @return BaseResultVO + */ + PortalResponse queryUserIdsByGroupId(String groupId); + + /** + * 根据用户组名称查询用户ID列表 + * + * @param groupName 用户组id + * @return BaseResultVO + */ + PortalResponse queryUserIdsByGroupName(String groupName); + + /** + * 获取权限资源信息 + * + * @param resType 权限资源类型 + * @param tenantId 目标租户code + * @return + */ + PortalResponse queryResource(String resType, String tenantId); + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalRoleOperateManager.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalRoleOperateManager.java new file mode 100644 index 0000000000000000000000000000000000000000..70ff03611fe100f918a8a24fe13ac69f88070df0 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalRoleOperateManager.java @@ -0,0 +1,58 @@ + + +package com.idcos.enterprise.portal.manager.auto; + +// auto generated imports + +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.enterprise.portal.form.PortalRoleCreateForm; +import com.idcos.enterprise.portal.form.PortalRoleUpdateForm; + +/** + * manager层controller相关的接口自动生成,此文件属于自动生成的,请勿直接修改,具体可以参考codegen工程 + * Generated by <tt>controller-codegen</tt> on 2015-10-30 15:00:49. + * + * @author jiaohuizhe + * @version PortalRoleOperateManager.java, v 1.1 2015-10-30 15:00:49 jiaohuizhe Exp $ + */ +public interface PortalRoleOperateManager { + + + /** + * 分配用户组 + * + * @param id + * @param selGroups + * @return BaseResultVO + */ + public CommonResult<?> allocateGroup(String id, String selGroups); + + + /** + * 删除角色信息 + * + * @param id + * @return BaseResultVO + */ + public CommonResult<?> delete(String id); + + + /** + * 更新角色信息 + * + * @param id + * @param form + * @return BaseResultVO + */ + public CommonResult<?> update(String id, PortalRoleUpdateForm form); + + + /** + * 创建角色信息 + * + * @param form + * @return BaseResultVO + */ + public CommonResult<?> create(PortalRoleCreateForm form); + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalRoleQueryManager.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalRoleQueryManager.java new file mode 100644 index 0000000000000000000000000000000000000000..eed3960b8640c9c037f3cdfdb920a7a9ec9f95c0 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalRoleQueryManager.java @@ -0,0 +1,97 @@ + + +package com.idcos.enterprise.portal.manager.auto; + +// auto generated imports + +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.enterprise.portal.form.PortalQueryByPageForm; +import com.idcos.enterprise.portal.form.PortalRoleQueryByPageForm; + +/** + * manager层controller相关的接口自动生成,此文件属于自动生成的,请勿直接修改,具体可以参考codegen工程 + * Generated by <tt>controller-codegen</tt> on 2015-10-30 15:00:49. + * + * @author jiaohuizhe + * @version PortalRoleQueryManager.java, v 1.1 2015-10-30 15:00:49 jiaohuizhe Exp $ + */ +public interface PortalRoleQueryManager { + + /** + * 获取某个角色信息 + * + * @param id + * @return BaseResultVO + */ + CommonResult<?> queryById(String id); + + /** + * 获取某个角色信息 + * + * @param id + * @return BaseResultVO + */ + CommonResult<?> queryGroupsById(String id); + + /** + * 获取某个角色信息 + * + * @param id + * @return BaseResultVO + */ + CommonResult<?> queryPermissionsById(String id); + + /** + * 获取某个角色信息 + * + * @param id + * @return BaseResultVO + */ + CommonResult<?> queryUsersById(String id); + + /** + * 查询用户所关联的角色信息 + * + * @param form + * @return + */ + CommonResult<?> queryRolePageByUserIdAndCnd(PortalQueryByPageForm form); + + /** + * 查询用户组所关联的角色信息 + * + * @param form + * @return + */ + CommonResult<?> queryRolePageByGroupIdAndCnd(PortalQueryByPageForm form); + + /** + * 查询角色信息 + * + * @param offset + * @param limit + * @param form + * @return BaseResultVO + */ + CommonResult<?> queryByPage(String offset, String limit, PortalRoleQueryByPageForm form); + + + /** + * 根据tenantId查询所有的角色信息 + * + * @param tenantId + * @return + */ + CommonResult<?> queryByTenantId(String tenantId); + + + /** + * 根据tenantId和用户id查询所有的角色信息 + * + * @param tenantId + * @param accountNo + * @return + */ + CommonResult<?> queryByAccountNoAndTenantId(String accountNo, String tenantId); + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalTenantManager.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalTenantManager.java new file mode 100644 index 0000000000000000000000000000000000000000..dba02fc6b482a8011cda87cdb2696eb7735530e5 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalTenantManager.java @@ -0,0 +1,44 @@ +package com.idcos.enterprise.portal.manager.auto; + +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.enterprise.portal.form.PortalTenantQueryPageListForm; + +/** + * @author GuanBin + * @version PortalTenantManager.java, v1 2017/10/10 上午7:40 GuanBin Exp $$ + */ +public interface PortalTenantManager { + + /** + * 获取租户户信息 + * + * @return BaseResultVO + */ + CommonResult<?> getAllTenant(); + + /** + * 获取租户户信息 + * + * @param tenantId + * @return BaseResultVO + */ + CommonResult<?> getTenantByTenantId(String tenantId); + + /** + * 获取单个租户信息 + * + * @param id + * @return + */ + CommonResult<?> getTenantInfo(String id); + + /** + * 分页查询租户 + * + * @param pageNo + * @param pageSize + * @param form + * @return + */ + CommonResult<?> getPageList(int pageNo, int pageSize, PortalTenantQueryPageListForm form); +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalTenantOperateManager.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalTenantOperateManager.java new file mode 100644 index 0000000000000000000000000000000000000000..0db02dd28e4b088d77fca9f1fcb130f5b5a552e5 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalTenantOperateManager.java @@ -0,0 +1,41 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.manager.auto; + +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.enterprise.portal.form.PortalTenantAddForm; +import com.idcos.enterprise.portal.form.PortalTenantUpdateForm; + +/** + * @author souakiragen + * @version $Id: , v 0.1 2017年11月07 上午9:32 souakiragen Exp $ + */ +public interface PortalTenantOperateManager { + + /** + * 添加租户 + * + * @param form + * @return + */ + CommonResult<?> add(PortalTenantAddForm form); + + /** + * 更新租户 + * + * @param form + * @return + */ + CommonResult<?> update(PortalTenantUpdateForm form); + + /** + * 删除租户 + * + * @param id + * @return + */ + CommonResult<?> delete(String id); +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalUserGroupOperateManager.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalUserGroupOperateManager.java new file mode 100644 index 0000000000000000000000000000000000000000..3efb347c7f31cf58da8d5df526f7c5aa984802b3 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalUserGroupOperateManager.java @@ -0,0 +1,84 @@ + + +package com.idcos.enterprise.portal.manager.auto; + +// auto generated imports + +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.enterprise.portal.form.PortalGroupAndUserCreateForm; +import com.idcos.enterprise.portal.form.PortalGroupAndUserUpdateForm; + +/** + * manager层controller相关的接口自动生成,此文件属于自动生成的,请勿直接修改,具体可以参考codegen工程 + * Generated by <tt>controller-codegen</tt> on 2015-10-28 14:17:42. + * + * @author jiaohuizhe + * @version PortalUserGroupOperateManager.java, v 1.1 2015-10-28 14:17:42 jiaohuizhe Exp $ + */ +public interface PortalUserGroupOperateManager { + + /** + * 分配角色信息 + * + * @param id + * @param selectRoles + * @return BaseResultVO + */ + CommonResult<?> allocateRole(String id, String selectRoles); + + /** + * 分配用户信息 + * + * @param id + * @param selectUsers + * @return BaseResultVO + */ + CommonResult<?> allocateUser(String id, String selectUsers); + + /** + * 删除用户组 + * + * @param id + * @return BaseResultVO + */ + CommonResult<?> delete(String id); + + /** + * 更新用户组 + * + * @param id + * @param name + * @param remark + * @param type + * @return BaseResultVO + */ + CommonResult<?> update(String id, String name, String type, String remark); + + /** + * 创建用户组信息 + * + * @param name + * @param remark + * @param type + * @param tenant + * @return BaseResultVO + */ + CommonResult<?> create(String tenant, String name, String type, String remark); + + /** + * 新建用户组(包括用户) + * + * @param form + * @return BaseResultVO + */ + CommonResult<?> createUserGroupAndUser(PortalGroupAndUserCreateForm form); + + /** + * 修改用户组(包括用户) + * + * @param form + * @return BaseResultVO + */ + CommonResult<?> updateUserGroupAndUser(PortalGroupAndUserUpdateForm form); + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalUserGroupQueryManager.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalUserGroupQueryManager.java new file mode 100644 index 0000000000000000000000000000000000000000..e0f844cdaf5cedc02a879c7d45e9a656ce220fc5 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalUserGroupQueryManager.java @@ -0,0 +1,156 @@ + + +package com.idcos.enterprise.portal.manager.auto; + +// auto generated imports + +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.enterprise.portal.form.PortalQueryByPageForm; +import com.idcos.enterprise.portal.form.PortalUserGroupQueryByPageForm; + +/** + * manager层controller相关的接口自动生成,此文件属于自动生成的,请勿直接修改,具体可以参考codegen工程 + * Generated by <tt>controller-codegen</tt> on 2015-10-28 14:17:42. + * + * @author jiaohuizhe + * @version PortalUserGroupQueryManager.java, v 1.1 2015-10-28 14:17:42 jiaohuizhe Exp $ + */ +public interface PortalUserGroupQueryManager { + + /** + * 获取某用户组信息 + * + * @param id + * @return BaseResultVO + */ + CommonResult<?> queryById(String id); + + /** + * 获取某用户组角色信息 + * + * @param id + * @return BaseResultVO + */ + CommonResult<?> queryRolesById(String id); + + /** + * 获取某用户组权限信息 + * + * @param id + * @return BaseResultVO + */ + CommonResult<?> queryPermissionsById(String id); + + /** + * 获取某用户组用户列表 + * + * @param id + * @return BaseResultVO + */ + CommonResult<?> queryUsersById(String id); + + /** + * 获取某用户组用户列表(提供给外部系统) + * + * @param id + * @return BaseResultVO + */ + CommonResult<?> queryUsersByGroupId(String id); + + /** + * 获取某用户组用户列表(提供给外部系统) + * + * @param groupName + * @param tenantId + * @return BaseResultVO + */ + CommonResult<?> queryUserByGroupNameAndTenant(String groupName, String tenantId); + + /** + * 查询用户所关联的用户组信息 + * + * @param form + * @return + */ + CommonResult<?> queryGroupPageByUserIdAndCnd(PortalQueryByPageForm form); + + /** + * 查询角色所关联的用户组信息 + * + * @param form + * @return + */ + CommonResult<?> queryGroupPageByRoleIdAndCnd(PortalQueryByPageForm form); + + /** + * 查询用户组信息 + * + * @param offset + * @param limit + * @param form + * @param cnd + * @return BaseResultVO + */ + CommonResult<?> queryByPage(String offset, String limit, PortalUserGroupQueryByPageForm form, String cnd); + + /** + * 获取所有部门的Tree型的树 + * + * @param tenantId + * @param treeStyle + * @return BaseResultVO + */ + CommonResult<?> getAccountGroupTree(String tenantId, String treeStyle); + + /** + * 根据权限code查询工作组列表 + * + * @param code + * @return BaseResultVO + */ + CommonResult<?> getAccountGroupListByPermissionCode(String code); + + /** + * 查询字典表用户组类型 + * + * @param tenantId + * @return + */ + CommonResult<?> getUserGroupType(String tenantId); + + /** + * 根据用户组type查询用户组 + * + * @param type + * @return + */ + CommonResult<?> queryGroupByType(String type); + + /** + * 根据用户组type查询用户组 + * + * @param type + * @param tenantId + * @return + */ + CommonResult<?> queryGroupByTypeAndTenantId(String type, String tenantId); + + /** + * 根据用户组type和用户id查询用户组 + * + * @param type + * @param userId + * @return + */ + CommonResult<?> queryGroupByTypeAndUserId(String type, String userId); + + /** + * 根据loginId和tenantId查询用户组集合 + * + * @param tenantId + * @param loginId + * @return + */ + CommonResult<?> queryGroupByLoginIdAndTenantId(String loginId, String tenantId); + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalUserOperateManager.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalUserOperateManager.java new file mode 100644 index 0000000000000000000000000000000000000000..5fbc34221c196c8ee77ba1d19f5538652c20ce19 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalUserOperateManager.java @@ -0,0 +1,103 @@ + + +package com.idcos.enterprise.portal.manager.auto; + +// auto generated imports + +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.enterprise.portal.form.ModifyPasswordForm; +import com.idcos.enterprise.portal.form.PortalUserAddForm; +import com.idcos.enterprise.portal.form.PortalUserAllocateGroupForm; +import com.idcos.enterprise.portal.form.PortalUserUpdateForm; + +/** + * manager层controller相关的接口自动生成,此文件属于自动生成的,请勿直接修改,具体可以参考codegen工程 + * Generated by <tt>controller-codegen</tt> on 2015-11-07 16:44:40. + * + * @author jiaohuizhe + * @version PortalUserOperateManager.java, v 1.1 2015-11-07 16:44:40 jiaohuizhe Exp $ + */ +public interface PortalUserOperateManager { + + /** + * 添加用户 + * + * @param form + * @return BaseResultVO + */ + CommonResult<?> add(PortalUserAddForm form); + + /** + * 修改用户 + * + * @param form + * @return + */ + CommonResult<?> update(PortalUserUpdateForm form); + + /** + * 激活用户 + * + * @param id 用户id + * @return + */ + CommonResult<?> enabled(String id); + + /** + * 禁用用户 + * + * @param id 用户id + * @return + */ + CommonResult<?> disabled(String id); + + /** + * 删除用户 + * + * @param id 用户id + * @return + */ + CommonResult<?> delete(String id); + + /** + * 分配用户组 + * + * @param form + * @return BaseResultVO + */ + CommonResult<?> allocateGroup(PortalUserAllocateGroupForm form); + + /** + * 修改用户密码 + * + * @param form + * @return BaseResultVO + */ + CommonResult<?> modifyPassword(ModifyPasswordForm form); + + /** + * 重置用户密码 + * + * @param userId + * @return BaseResultVO + */ + CommonResult<?> resetPassword(String userId); + + /** + * 禁用token + * + * @param tokenId + * @return BaseResultVO + */ + CommonResult<?> forbiddenToken(String tokenId); + + /** + * 查询token + * + * @param tenantId + * @param loginId + * @return BaseResultVO + */ + CommonResult<?> listTokenByTenantIdAndLoginId(String tenantId, String loginId); + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalUserQueryManager.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalUserQueryManager.java new file mode 100644 index 0000000000000000000000000000000000000000..3f47f28705f0ec2278eb0e6ba5eb4fb6aaba1d5d --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/auto/PortalUserQueryManager.java @@ -0,0 +1,188 @@ + + +package com.idcos.enterprise.portal.manager.auto; + +// auto generated imports + +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.enterprise.portal.form.PortalQueryByPageForm; +import com.idcos.enterprise.portal.form.PortalUserQueryPageListForm; + +import java.util.List; + +/** + * manager层controller相关的接口自动生成,此文件属于自动生成的,请勿直接修改,具体可以参考codegen工程 + * Generated by <tt>controller-codegen</tt> on 2015-11-07 16:44:40. + * + * @author jiaohuizhe + * @version PortalUserQueryManager.java, v 1.1 2015-11-07 16:44:40 jiaohuizhe Exp $ + */ +public interface PortalUserQueryManager { + + /** + * 分页获取用户列表 + * + * @param form + * @return + */ + CommonResult<?> queryPageList(PortalUserQueryPageListForm form); + + /** + * 获取某用户信息 + * + * @param id + * @return BaseResultVO + */ + CommonResult<?> queryById(String id); + + /** + * 获取某用户信息 + * + * @param id + * @return BaseResultVO + */ + CommonResult<?> queryGroupsById(String id); + + /** + * 获取某用户信息 + * + * @param id + * @return BaseResultVO + */ + CommonResult<?> queryRolesById(String id); + + /** + * 查询用户组关联的用户信息 + * + * @param form + * @return + */ + CommonResult<?> queryUserPageByGroupIdAndCnd(PortalQueryByPageForm form); + + /** + * 查询角色所关联的用户信息 + * + * @param form + * @return + */ + CommonResult<?> queryUserPageByRoleIdAndCnd(PortalQueryByPageForm form); + + /** + * 获取某用户信息 + * + * @param id + * @param appId + * @return BaseResultVO + */ + CommonResult<?> queryPermissionsById(String id, String appId); + + /** + * 根据userId和appId获取某用户信息 + * + * @param userId + * @param appId + * @return BaseResultVO + */ + CommonResult<?> queryPermissionsByUserIdAndAppId(String userId, String appId); + + /** + * 查询租户下系统的帐号总数,不传租户则查询所有的账号总数 + * + * @param tenantId + * @return + */ + CommonResult<?> getAccountCount(String tenantId); + + /** + * 新增的rest接口 + * 查询所有的帐号信息 + * + * @return + */ + CommonResult<?> getAllAcount(); + + /** + * 新增的rest接口 + * 查询所有的帐号信息 + * + * @param tenantId + * @return + */ + CommonResult<?> getAllAcount(String tenantId); + + /** + * 新增的rest接口 + * 查询部门下的所有帐号(不包括子部门) + * + * @param deptId + * @param tenantId + * @param recurse + * @return + */ + CommonResult<?> getAcountByDeptId(String tenantId, String deptId, String recurse); + + /** + * 新增的rest接口 + * 根据登录id获取用户信息。 + * + * @param tenantId + * @param accountNo + * @return + */ + CommonResult<?> getByAccountNo(String tenantId, String accountNo); + + /** + * 根据用户id获取用户信息。 + * + * @param id + * @return + */ + CommonResult<?> getUserById(String id); + + /** + * 新增的rest接口 + * 根据账号登录ids查询账号信息。 + * + * @param tenantId + * @param accountNoList + * @return + */ + CommonResult<?> getByAccountNos(String tenantId, List<String> accountNoList); + + /** + * 新增的rest接口 + * 获取当前账户的上次登录时间(rbac中的该数据是从dir中同步过来的)。 + * + * @return + */ + CommonResult<?> getLastLoginTime(); + + /** + * 根据userId查询该用户所有信息。 + * + * @param appId + * @param userId + * @param token + * @return + */ + CommonResult<?> authInfo(String userId, String appId, String token); + + /** + * 根据用户登录Id和密码查询用户详情 + * + * @param appId + * @param tenantId + * @param loginId + * @param password + * @return + */ + CommonResult<?> getAuthInfoByLoginIdAndPw(String loginId, String password, String tenantId, String appId); + + /** + * 查询用户状态 + * + * @return BaseResultVO + */ + CommonResult<?> getUserStatus(); + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/common/CommonManager.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/common/CommonManager.java new file mode 100644 index 0000000000000000000000000000000000000000..a687dad92f2f507dd5021b10bd5066d0e4b302dd --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/common/CommonManager.java @@ -0,0 +1,102 @@ +/** + * 杭州云霁科技有限公司 http://www.idcos.com Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.manager.common; + +import java.util.*; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.google.common.collect.Lists; +import com.idcos.enterprise.portal.dal.entity.*; +import com.idcos.enterprise.portal.dal.repository.*; +import com.idcos.enterprise.portal.services.PortalDeptRoleRelService; +import com.idcos.enterprise.portal.services.PortalGroupRoleRelService; + +/** + * @author Dana + * @version CommonManager.java, v1 2017/12/10 下午1:35 Dana Exp $$ + */ +@Service +public class CommonManager { + @Autowired + private PortalUserRepository portalUserRepository; + + @Autowired + private PortalGroupUserRelRepository portalGroupUserRelRepository; + + @Autowired + private PortalGroupRoleRelService portalGroupRoleRelService; + + @Autowired + private PortalDeptRoleRelService portalDeptRoleRelService; + + @Autowired + private PortalDeptRepository portalDeptRepository; + + /** + * 根据用户Id获取所有角色(已去重) + * + * @param id + * @return + */ + public List<String> getRoleIdsById(String id) { + PortalUser portalUser = portalUserRepository.findOne(id); + List<String> roleIds = Lists.newArrayList(); + /** + * 获取用户所属的用户组 + */ + List<PortalGroupUserRel> portalGroupUserRels = portalGroupUserRelRepository.findByUserId(id); + /** + * 获取用户组对应的角色 + */ + List<String> groupIds = Lists.newArrayList(); + for (PortalGroupUserRel portalGroupUserRel : portalGroupUserRels) { + groupIds.add(portalGroupUserRel.getGroupId()); + } + roleIds.addAll(portalGroupRoleRelService.getRoleIdsByGroupIds(groupIds)); + /** + * 获取用户对应的部门,包括所有的父部门(admin用户的部门id可能为null) + */ + if (portalUser.getDeptId() != null) { + PortalDept portalDept = portalDeptRepository.findOne(portalUser.getDeptId()); + if (portalDept != null) { + List<String> deptIds = this.getDeptIdsByParentIdAndAllParent(portalDept.getParentId()); + deptIds.add(portalDept.getId()); + /** + * 获取部门对应的角色 + */ + roleIds.addAll(portalDeptRoleRelService.getRoleIdsByDeptIds(deptIds)); + } + } + + List<String> distinctRoleIds = new ArrayList<>(new HashSet<>(roleIds)); + + return distinctRoleIds; + } + + /** + * 根据parent级联查询所有父级部门id + * + * @param parentId + * @return + */ + public List<String> getDeptIdsByParentIdAndAllParent(String parentId) { + List<String> parentIds = Lists.newArrayList(); + parentIds.add(parentId); + while (StringUtils.isNotBlank(parentId)) { + PortalDept portalDept = portalDeptRepository.findByDeptId(parentId); + String tempParentId = portalDept.getParentId(); + if (StringUtils.isNotBlank(tempParentId)) { + parentIds.add(tempParentId); + parentId = tempParentId; + } else { + parentId = tempParentId; + } + } + return parentIds; + } + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/AuthManagerImpl.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/AuthManagerImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..b0b52e48d1156daeeac03d2d0d31c1aafe44973c --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/AuthManagerImpl.java @@ -0,0 +1,250 @@ + + +package com.idcos.enterprise.portal.manager.impl; + +// auto generated imports + +import com.idcos.cloud.biz.common.check.CommonParamtersChecker; +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.cloud.core.common.util.DateUtil; +import com.idcos.cloud.core.common.util.StringUtil; +import com.idcos.cloud.core.common.util.UUIDUtil; +import com.idcos.enterprise.portal.biz.common.CommonBizException; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessQueryCallback; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessQueryTemplate; +import com.idcos.enterprise.portal.biz.common.utils.Base64Util; +import com.idcos.enterprise.portal.biz.common.utils.CrcUtil; +import com.idcos.enterprise.portal.biz.common.utils.CurrentUser; +import com.idcos.enterprise.portal.dal.entity.PortalTenant; +import com.idcos.enterprise.portal.dal.entity.PortalToken; +import com.idcos.enterprise.portal.dal.entity.PortalUser; +import com.idcos.enterprise.portal.dal.repository.PortalTokenRepository; +import com.idcos.enterprise.portal.dal.repository.PortalUserRepository; +import com.idcos.enterprise.portal.form.LoginForm; +import com.idcos.enterprise.portal.manager.auto.AuthManager; +import com.idcos.enterprise.portal.vo.JwtTokenVO; +import com.idcos.enterprise.portal.web.GlobalValue; +import com.idcos.enterprise.sso.CheckLoginService; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.UnsupportedEncodingException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.Iterator; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static com.idcos.cloud.core.common.util.DateUtil.simpleFormat; +import static com.idcos.enterprise.portal.UamConstant.ADMIN; +import static com.idcos.enterprise.portal.UamConstant.USER_ID; + +/** + * Manager实现类 + * <p>第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖</p> + * + * @author yanlv + * @version v 1.1 2015-06-09 09:26:24 yanlv Exp $ + */ +@Service +public class AuthManagerImpl implements AuthManager { + @Autowired + private BusinessQueryTemplate businessQueryTemplate; + + @Autowired + private GlobalValue globalValue; + + @Autowired + private CheckLoginService checkLoginService; + + @Autowired + private PortalUserRepository portalUserRepository; + + @Autowired + private PortalTokenRepository portalTokenRepository; + + @Autowired + private CurrentUser currentUser; + + private static final Logger logger = LoggerFactory.getLogger(AuthManagerImpl.class); + + private static final String NEVER_EXPIRE_TIME = "2037-10-01 15:00"; + + @Override + public String getAuth(LoginForm loginForm) { + PortalUser portalUser = checkLoginService.checkUser(loginForm.getLoginId(), loginForm.getTenantId()); + PortalTenant portalTenant = checkLoginService.checkTenant(portalUser.getTenantId()); + return "token=" + buildToken(portalUser, portalTenant, + System.currentTimeMillis() / 1000L + Integer.valueOf(globalValue.getAccessTimeout())); + } + + @Override + public CommonResult<?> grantToken(final String loginId, final String password, final String tenantId, + final String time) { + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + + @Override + public Object doQuery() { + PortalTenant portalTenant = checkLoginService.checkTenant(tenantId); + PortalUser portalUser = checkLoginService.checkUser(loginId, tenantId); + checkLoginService.checkPassword(portalUser, password); + //返回token(生成永久token或者传入给定过期时间token); + String expireTime = StringUtil.isBlank(time) ? NEVER_EXPIRE_TIME : time; + return buildToken(portalUser, portalTenant, DateUtil.strToSimpleFormat(expireTime).getTime() / 1000L); + } + + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(loginId); + CommonParamtersChecker.checkNotBlank(tenantId); + CommonParamtersChecker.checkNotBlank(password); + } + }); + } + + @Override + public CommonResult<?> grantTokenByAdmin(final String loginId, final String tenantId) { + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + + @Override + public Object doQuery() { + if (!ADMIN.equals(currentUser.getUser().getLoginId())) { + throw new CommonBizException("非admin用户不允许给其他用户发放token!!!"); + } + PortalTenant portalTenant = checkLoginService.checkTenant(tenantId); + PortalUser portalUser = checkLoginService.checkUser(loginId, tenantId); + //返回token(生成永久token); + String expireTime = NEVER_EXPIRE_TIME; + return buildToken(portalUser, portalTenant, DateUtil.strToSimpleFormat(expireTime).getTime() / 1000L); + } + + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(loginId); + CommonParamtersChecker.checkNotBlank(tenantId); + } + }); + } + + + /** + * 生成token + * + * @return + */ + private String buildToken(PortalUser user, PortalTenant portalTenant, Long exp) { + String token = Jwts.builder().setSubject(user.getName()) + .signWith(SignatureAlgorithm.HS256, globalValue.getSecretKey()).claim("userId", user.getId()) + .claim("name", user.getName()).claim("loginId", user.getLoginId()).claim("loginName", user.getLoginId()) + .claim("tenantId", user.getTenantId()).claim("timeout", Integer.valueOf(globalValue.getAccessTimeout())) + .claim("exp", exp).claim("creatTime", System.currentTimeMillis()) + .claim("tenantName", portalTenant.getDisplayName()).compact(); + + //将token写入数据库 + PortalToken portalToken = new PortalToken(); + portalToken.setId(UUIDUtil.get()); + portalToken.setName(token); + portalToken.setTokenCrc(CrcUtil.crc(token)); + portalToken.setLoginId(user.getLoginId()); + portalToken.setExpireTime(new Date(exp * 1000)); + portalToken.setGmtCreate(new Date()); + portalToken.setGmtModified(new Date()); + portalToken.setIsActive("Y"); + portalToken.setTenantId(user.getTenantId()); + portalTokenRepository.save(portalToken); + logger.info("===============用户:" + user.getLoginId() + "@" + user.getTenantId() + "生成token:" + token); + return token; + + } + + @Override + public CommonResult<?> parseToken(final String token) { + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + + @Override + public Object doQuery() { + Claims claims = Jwts.parser().setSigningKey(globalValue.getSecretKey()).parseClaimsJws(token).getBody(); + if (claims == null || claims.get(USER_ID) == null) { + throw new CommonBizException("token中的用户id为空值导致解码失败"); + } + + JwtTokenVO jwtTokenVO = new JwtTokenVO(); + jwtTokenVO.setUserId(claims.get("userId").toString()); + jwtTokenVO.setName(claims.get("name") == null ? "" : claims.get("name").toString()); + jwtTokenVO.setLoginId(claims.get("loginId") == null ? "" : claims.get("loginId").toString()); + jwtTokenVO.setTenantId(claims.get("tenantId") == null ? "" : claims.get("tenantId").toString()); + jwtTokenVO.setTenantName(claims.get("tenantName") == null ? "" : claims.get("tenantName").toString()); + + String expireTime; + try { + expireTime = simpleFormat(new Date((Integer) claims.get("exp") * 1000L)); + } catch (Exception e) { + throw new RuntimeException("解析token过期时间异常!"); + } + jwtTokenVO.setExpireTime(expireTime); + + String creatTime; + try { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + creatTime = dateFormat.format(claims.get("creatTime")); + } catch (Exception e) { + throw new RuntimeException("解析token创建时间异常!"); + } + jwtTokenVO.setCreatTime(creatTime); + return jwtTokenVO; + } + + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(token); + } + }); + } + + private static final Pattern MODIFY_SALT_PATTERN = Pattern.compile("[A-Za-z0-9=]+"); + + @Override + public CommonResult<?> modifySalt() { + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + @Override + public Object doQuery() { + List<PortalUser> portalUsers = portalUserRepository.findAll(); + List<PortalUser> newPortalUsers = new ArrayList<>(); + + Iterator<PortalUser> iterator1 = portalUsers.iterator(); + while (iterator1.hasNext()) { + PortalUser portalUser = iterator1.next(); + Matcher matcher = MODIFY_SALT_PATTERN.matcher(portalUser.getSalt()); + if (matcher.matches()) { + throw new CommonBizException("接口已经执行过,不需要再执行了。"); + } + } + + Iterator<PortalUser> iterator2 = portalUsers.iterator(); + while (iterator2.hasNext()) { + PortalUser portalUser = iterator2.next(); + try { + portalUser.setSalt(Base64Util.encode(portalUser.getSalt().getBytes("ISO-8859-1"))); + } catch (UnsupportedEncodingException e) { + throw new CommonBizException("系统错误,请联系管理员。"); + } + newPortalUsers.add(portalUser); + } + portalUserRepository.save(newPortalUsers); + return null; + } + + @Override + public void checkParam() { + + } + }); + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalCommonQueryManagerImpl.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalCommonQueryManagerImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..caa546be78d07fb2e3f5ece4ea779633e67663f9 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalCommonQueryManagerImpl.java @@ -0,0 +1,86 @@ + + +package com.idcos.enterprise.portal.manager.impl; + +// auto generated imports + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.cloud.core.common.util.ListUtil; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessQueryCallback; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessQueryTemplate; +import com.idcos.enterprise.portal.biz.common.utils.CurrentUser; +import com.idcos.enterprise.portal.biz.common.CommonBizException; +import com.idcos.enterprise.portal.convert.PortalRoleConvert; +import com.idcos.enterprise.portal.convert.PortalUserGroupConvert; +import com.idcos.enterprise.portal.dal.repository.PortalRoleRepository; +import com.idcos.enterprise.portal.dal.repository.PortalUserGroupRepository; +import com.idcos.enterprise.portal.manager.auto.PortalCommonQueryManager; +import com.idcos.enterprise.portal.vo.PortalRoleVO; +import com.idcos.enterprise.portal.vo.PortalUserGroupVO; + +import static com.idcos.enterprise.portal.UamConstant.ADMIN; + +/** + * Manager实现类 + * <p>第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖</p> + * + * @author yanlv + * @version v 1.1 2015-06-09 10:37:31 yanlv Exp $ + */ +@Service +public class PortalCommonQueryManagerImpl implements PortalCommonQueryManager { + + @Autowired + private BusinessQueryTemplate businessQueryTemplate; + @Autowired + private PortalUserGroupRepository portalUserGroupRepository; + @Autowired + private PortalUserGroupConvert portalUserGroupConvert; + @Autowired + private PortalRoleRepository portalRoleRepository; + @Autowired + private PortalRoleConvert portalRoleConvert; + @Autowired + private CurrentUser currentUser; + + @Override + public CommonResult<?> getRoleList() { + if (!ADMIN.equals(currentUser.getUser().getLoginId())) { + throw new CommonBizException("only admin permits"); + } + return businessQueryTemplate.process(new BusinessQueryCallback<List<PortalRoleVO>>() { + @Override + public void checkParam() { + } + + @Override + public List<PortalRoleVO> doQuery() { + return ListUtil.transform(portalRoleRepository.queryRoleList(), portalRoleConvert); + } + }); + } + + @Override + public CommonResult<?> getUserGroupList(final String tenantId) { + if (!ADMIN.equals(currentUser.getUser().getLoginId())) { + throw new CommonBizException("only admin permits"); + } + return businessQueryTemplate.process(new BusinessQueryCallback<List<PortalUserGroupVO>>() { + @Override + public void checkParam() { + } + + @Override + public List<PortalUserGroupVO> doQuery() { + return ListUtil.transform(portalUserGroupRepository.queryUserGroupList(tenantId), + portalUserGroupConvert); + } + }); + } + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalDeptOperateManagerImpl.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalDeptOperateManagerImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..dd6f40e5c3ab29eeaab0a3acd8fbde24d17808bf --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalDeptOperateManagerImpl.java @@ -0,0 +1,225 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.manager.impl; + +import com.google.common.collect.Lists; +import com.idcos.cloud.biz.common.check.CommonParamtersChecker; +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.enterprise.portal.biz.common.CommonBizException; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessProcessCallback; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessProcessContext; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessProcessTemplate; +import com.idcos.enterprise.portal.dal.entity.PortalDept; +import com.idcos.enterprise.portal.dal.entity.PortalDeptRoleRel; +import com.idcos.enterprise.portal.dal.entity.PortalUser; +import com.idcos.enterprise.portal.dal.enums.SourceTypeEnum; +import com.idcos.enterprise.portal.dal.enums.StatusEnum; +import com.idcos.enterprise.portal.dal.repository.PortalDeptRepository; +import com.idcos.enterprise.portal.dal.repository.PortalDeptRoleRelRepository; +import com.idcos.enterprise.portal.dal.repository.PortalUserRepository; +import com.idcos.enterprise.portal.form.PortalDeptAddForm; +import com.idcos.enterprise.portal.form.PortalDeptUpdateForm; +import com.idcos.enterprise.portal.manager.auto.PortalDeptOperateManager; +import com.idcos.enterprise.portal.services.PortalDeptService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.thymeleaf.util.ListUtils; + +import java.util.Date; +import java.util.List; + +/** + * @author souakiragen + * @version $Id: , v 0.1 2017年11月04 上午11:44 souakiragen Exp $ + */ +@Service +public class PortalDeptOperateManagerImpl implements PortalDeptOperateManager { + + @Autowired + private BusinessProcessTemplate businessProcessTemplate; + + @Autowired + private PortalDeptRepository portalDeptRepository; + + @Autowired + private PortalDeptService portalDeptService; + + @Autowired + private PortalDeptRoleRelRepository portalDeptRoleRelRepository; + + @Autowired + private PortalUserRepository portalUserRepository; + + @Override + public CommonResult<?> add(final PortalDeptAddForm form) { + return businessProcessTemplate.process(new BusinessProcessCallback<Object>() { + @Override + public void checkParam(BusinessProcessContext context) { + if (StringUtils.isNotBlank(form.getParentId())) { + PortalDept portalDept = portalDeptRepository.findByDeptId(form.getParentId()); + if (portalDept == null) { + throw new RuntimeException("父级部门不存在!"); + } else if (!SourceTypeEnum.NATIVE.getCode().equals(portalDept.getSourceType())) { + throw new RuntimeException("数据源为" + portalDept.getSourceType() + "的部门不允许添加子部门!"); + } + } + if (portalDeptService.checkHasByTenantIdAndParentIdAndDisplayName(form.getTenantId(), + form.getParentId(), form.getDisplayName())) { + throw new RuntimeException("该部门已存在"); + } + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + + } + + @Override + public Object doBusiness(BusinessProcessContext context) { + PortalDept portalDept = new PortalDept(); + BeanUtils.copyProperties(form, portalDept); + portalDept.setStatus(StatusEnum.Y.getCode()); + portalDept.setGmtCreate(new Date()); + portalDept.setGmtModified(new Date()); + PortalDept dBdept = portalDeptRepository.save(portalDept); + return dBdept.getId(); + } + + @Override + public void exceptionProcess(CommonBizException exception, BusinessProcessContext context) { + + } + }); + } + + @Override + public CommonResult<?> update(final PortalDeptUpdateForm form) { + return businessProcessTemplate.process(new BusinessProcessCallback<Object>() { + @Override + public void checkParam(BusinessProcessContext context) { + + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + if (StringUtils.isNotBlank(form.getParentId())) { + PortalDept parentDept = portalDeptRepository.findByDeptId(form.getParentId()); + if (parentDept == null) { + throw new RuntimeException("父级部门不存在!"); + } else if (!SourceTypeEnum.NATIVE.getCode().equals(parentDept.getSourceType())) { + throw new RuntimeException("数据源为" + parentDept.getSourceType() + "的部门不允许添加子部门!"); + } + } + PortalDept portalDept = portalDeptRepository.findByDeptId(form.getId()); + if (!SourceTypeEnum.NATIVE.getCode().equals(portalDept.getSourceType())) { + throw new RuntimeException("数据源为" + portalDept.getSourceType() + "的部门不允许修改!"); + } + if (portalDeptService.checkHasByTenantIdAndParentIdAndDisplayNameAndNotId(form.getTenantId(), + form.getParentId(), form.getDisplayName(), form.getId())) { + throw new RuntimeException("该部门已存在"); + } + if (form.getParentId() != null && form.getParentId().equals(form.getId())) { + throw new RuntimeException("不能将自己设置成自己的父部门"); + } + } + + @Override + public Object doBusiness(BusinessProcessContext context) { + PortalDept oldPortalDept = portalDeptRepository.findByDeptId(form.getId()); + PortalDept portalDept = new PortalDept(); + BeanUtils.copyProperties(form, portalDept); + portalDept.setGmtCreate(oldPortalDept.getGmtCreate()); + portalDept.setGmtModified(new Date()); + portalDept.setStatus(oldPortalDept.getStatus()); + return portalDeptRepository.save(portalDept); + } + + + @Override + public void exceptionProcess(CommonBizException exception, BusinessProcessContext context) { + + } + }); + } + + + @Override + public CommonResult<?> delete(final String id) { + return businessProcessTemplate.process(new BusinessProcessCallback<Object>() { + @Override + public void checkParam(BusinessProcessContext context) { + PortalDept portalDept = portalDeptRepository.findByDeptId(id); + if (portalDept == null) { + throw new RuntimeException("要删除的部门不存在"); + } else if (!SourceTypeEnum.NATIVE.getCode().equals(portalDept.getSourceType())) { + throw new RuntimeException("数据源为" + portalDept.getSourceType() + "的部门不允许删除!"); + } + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + //检查部门下是否存在用户 + List<PortalUser> portalUsers = portalUserRepository.findByDeptId(id); + if (!ListUtils.isEmpty(portalUsers)) { + throw new RuntimeException("部门下存在用户,不能删除"); + } + } + + @Override + public Object doBusiness(BusinessProcessContext context) { + portalDeptService.updatePortalDeptStatus(StatusEnum.N.getCode(), id); + portalDeptRoleRelRepository.deleteByDeptId(id); + return "删除成功"; + } + + @Override + public void exceptionProcess(CommonBizException exception, BusinessProcessContext context) { + + } + }); + } + + @Override + public CommonResult<?> assignRole(final String id, final String roleIdsStr) { + return businessProcessTemplate.process(new BusinessProcessCallback<Object>() { + @Override + public void checkParam(BusinessProcessContext context) { + CommonParamtersChecker.checkNotBlank(id); + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + + } + + @Override + public Object doBusiness(BusinessProcessContext context) { + + portalDeptRoleRelRepository.deleteByDeptId(id); + if (StringUtils.isNotBlank(roleIdsStr)) { + List<String> roleIds = Lists.newArrayList(roleIdsStr.split(",")); + List<PortalDeptRoleRel> portalDeptRoleRels = Lists.newArrayList(); + for (String roleId : roleIds) { + PortalDeptRoleRel portalDeptRoleRel = new PortalDeptRoleRel(); + portalDeptRoleRel.setDeptId(id); + portalDeptRoleRel.setRoleId(roleId); + portalDeptRoleRels.add(portalDeptRoleRel); + } + portalDeptRoleRelRepository.save(portalDeptRoleRels); + } + return null; + } + + @Override + public void exceptionProcess(CommonBizException exception, BusinessProcessContext context) { + + } + }); + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalDeptQueryManagerImpl.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalDeptQueryManagerImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..1f51106d3198d85425448998ef5e1eb884601de3 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalDeptQueryManagerImpl.java @@ -0,0 +1,239 @@ +/** + * 杭州云霁科技有限公司 http://www.idcos.com Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.manager.impl; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.google.common.collect.Lists; +import com.idcos.cloud.biz.common.check.CommonParamtersChecker; +import com.idcos.cloud.core.common.BaseLinkVO; +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessQueryCallback; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessQueryTemplate; +import com.idcos.enterprise.portal.biz.common.utils.PortalFilterUtil; +import com.idcos.enterprise.portal.dal.entity.*; +import com.idcos.enterprise.portal.dal.enums.IsActiveEnum; +import com.idcos.enterprise.portal.dal.enums.TreeStyleEnum; +import com.idcos.enterprise.portal.dal.repository.*; +import com.idcos.enterprise.portal.export.util.DeptTreeUtils; +import com.idcos.enterprise.portal.manager.auto.PortalDeptQueryManager; +import com.idcos.enterprise.portal.services.PortalRoleService; +import com.idcos.enterprise.portal.vo.PortalDeptTreeVO; +import com.idcos.enterprise.portal.vo.PortalDeptVO; +import com.idcos.enterprise.portal.biz.common.CommonBizException; +import com.idcos.enterprise.portal.biz.common.utils.CurrentUser; +import static com.idcos.enterprise.portal.UamConstant.ADMIN; + +/** + * @author Dana + * @version PortalDeptQueryManagerImpl.java, v1 2017/9/26 下午5:33 Dana Exp $$ + */ +@Service +public class PortalDeptQueryManagerImpl implements PortalDeptQueryManager { + @Autowired + private BusinessQueryTemplate businessQueryTemplate; + + @Autowired + private PortalDeptRepository portalDeptRepository; + + @Autowired + private PortalDeptRoleRelRepository portalDeptRoleRelRepository; + + @Autowired + private PortalRoleService portalRoleService; + + @Autowired + private CurrentUser currentUser; + + @Override + public CommonResult<?> getAllDept(final String tenantId) { + if (!ADMIN.equals(currentUser.getUser().getLoginId())) { + throw new CommonBizException("only admin permits"); + } + return businessQueryTemplate.process(new BusinessQueryCallback<List<PortalDeptVO>>() { + + @Override + public void checkParam() {} + + @Override + public List<PortalDeptVO> doQuery() { + List<PortalDept> portalDepts; + if (tenantId == null) { + portalDepts = portalDeptRepository.findAll(); + } else { + portalDepts = portalDeptRepository.findAllDeptByTenantId(tenantId); + } + List<PortalDeptVO> deptVOS = new ArrayList<>(); + for (PortalDept portalDept : portalDepts) { + PortalDeptVO portalDeptVO = new PortalDeptVO(); + portalDeptVO.setId(portalDept.getId()); + portalDeptVO.setTenantId(portalDept.getTenantId()); + portalDeptVO.setManagerId(portalDept.getManagerId()); + portalDeptVO.setDisplayName(portalDept.getDisplayName()); + portalDeptVO.setStatus(portalDept.getStatus()); + portalDeptVO.setCode(portalDept.getCode()); + portalDeptVO.setRemark(portalDept.getRemark()); + portalDeptVO.setParentId(portalDept.getParentId()); + deptVOS.add(portalDeptVO); + } + + return deptVOS; + } + }); + } + + @Override + public CommonResult<?> getDeptsTree(final String tenantId, final String treeStyle) { + if (!ADMIN.equals(currentUser.getUser().getLoginId())) { + throw new CommonBizException("only admin permits"); + } + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(tenantId); + CommonParamtersChecker.checkNotBlank(treeStyle); + } + + @Override + public Object doQuery() { + List<PortalDept> portalDepts = portalDeptRepository.findAllDeptByTenantId(tenantId); + List<PortalDeptTreeVO> deptTreeList = convert2Dto(portalDepts); + if (TreeStyleEnum.Z_TREE.getCode().equals(treeStyle)) { + return deptTreeList; + } else if (TreeStyleEnum.IO_TREE.getCode().equals(treeStyle)) { + Object tree = DeptTreeUtils.getTree(portalDepts, DeptTreeUtils.TreeStyle.IO_TREE); + return tree; + } else if (TreeStyleEnum.ALL.getCode().equals(treeStyle)) { + return new ArrayList<>(); + } + return null; + } + }); + } + + @Override + public CommonResult<?> getDeptByDeptId(final String tenantId, final String deptId) { + if (!ADMIN.equals(currentUser.getUser().getLoginId())) { + throw new CommonBizException("only admin permits"); + } + return businessQueryTemplate.process(new BusinessQueryCallback<PortalDeptVO>() { + + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(tenantId); + CommonParamtersChecker.checkNotBlank(deptId); + } + + @Override + public PortalDeptVO doQuery() { + PortalDept portalDept = portalDeptRepository.findByDeptId(deptId); + PortalDeptVO portalDeptVO = new PortalDeptVO(); + portalDeptVO.setId(portalDept.getId()); + portalDeptVO.setTenantId(portalDept.getTenantId()); + portalDeptVO.setManagerId(portalDept.getManagerId()); + portalDeptVO.setDisplayName(portalDept.getDisplayName()); + portalDeptVO.setStatus(portalDept.getStatus()); + portalDeptVO.setSourceType(portalDept.getSourceType()); + portalDeptVO.setCode(portalDept.getCode()); + portalDeptVO.setRemark(portalDept.getRemark()); + portalDeptVO.setParentId(portalDept.getParentId()); + return portalDeptVO; + } + }); + } + + @Override + public CommonResult<?> getDeptById(final String id) { + if (!ADMIN.equals(currentUser.getUser().getLoginId())) { + throw new CommonBizException("only admin permits"); + } + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(id); + } + + @Override + public Object doQuery() { + PortalDept portalDept = portalDeptRepository.findOne(id); + PortalDeptVO portalDeptVO = new PortalDeptVO(); + BeanUtils.copyProperties(portalDept, portalDeptVO); + return portalDeptVO; + } + }); + } + + @Override + public CommonResult<?> getRolesById(final String id) { + if (!ADMIN.equals(currentUser.getUser().getLoginId())) { + throw new CommonBizException("only admin permits"); + } + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(id); + } + + @Override + public Object doQuery() { + // 声明变量 + BaseLinkVO vo = new BaseLinkVO(); + + List<PortalRole> roleList = Lists.newArrayList(); + + List<String> roleIds = Lists.newArrayList(); + + // 获取角色,获取权限 + for (PortalDeptRoleRel rel : portalDeptRoleRelRepository.findByDeptId(id)) { + roleIds.add(rel.getRoleId()); + } + List<PortalRole> portalRoles = portalRoleService.getListByIds(roleIds); + for (PortalRole portalRole : portalRoles) { + if (IsActiveEnum.HAS_ACTIVE.getCode().equals(portalRole.getIsActive())) { + roleList.add(portalRole); + } + } + vo.putLinkObj("ROLE", PortalFilterUtil.filterRole(roleList)); + + return vo; + } + }); + } + + /** + * 转化为PortalDeptTreeVO + * + * @param deptEntityList + * @return + */ + private List<PortalDeptTreeVO> convert2Dto(List<PortalDept> deptEntityList) { + List<PortalDeptTreeVO> dtos = new ArrayList<>(); + for (PortalDept dept : deptEntityList) { + PortalDeptTreeVO deptTreeVO = new PortalDeptTreeVO(); + deptTreeVO.setId(dept.getId()); + deptTreeVO.setCode(dept.getCode()); + if (StringUtils.isBlank(dept.getDisplayName())) { + deptTreeVO.setName(dept.getCode()); + } else { + deptTreeVO.setName(dept.getDisplayName()); + } + deptTreeVO.setPid(dept.getParentId()); + deptTreeVO.setSourceType(dept.getSourceType()); + deptTreeVO.setRemark(dept.getRemark()); + deptTreeVO.setTenantId(dept.getTenantId()); + deptTreeVO.setStatus(dept.getStatus()); + deptTreeVO.setManagerId(dept.getManagerId()); + dtos.add(deptTreeVO); + } + return dtos; + } + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalPermissionOperateManagerImpl.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalPermissionOperateManagerImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..8f8406902879a944682d1d983169ce7085262d56 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalPermissionOperateManagerImpl.java @@ -0,0 +1,219 @@ + + +package com.idcos.enterprise.portal.manager.impl; + +// auto generated imports + +import com.alibaba.fastjson.JSON; +import com.idcos.cloud.biz.common.check.FormChecker; +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.cloud.core.common.util.ListUtil; +import com.idcos.cloud.core.common.util.ObjectUtil; +import com.idcos.enterprise.portal.biz.common.CommonBizException; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessProcessCallbackAdator; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessProcessContext; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessProcessTemplate; +import com.idcos.enterprise.portal.biz.common.utils.CurrentUser; +import com.idcos.enterprise.portal.dal.entity.PortalPermission; +import com.idcos.enterprise.portal.dal.entity.PortalResource; +import com.idcos.enterprise.portal.dal.entity.PortalRole; +import com.idcos.enterprise.portal.dal.enums.AuthObjTypeEnum; +import com.idcos.enterprise.portal.dal.enums.IsActiveEnum; +import com.idcos.enterprise.portal.dal.repository.PortalPermissionRepository; +import com.idcos.enterprise.portal.dal.repository.PortalResourceRepository; +import com.idcos.enterprise.portal.dal.repository.PortalRoleRepository; +import com.idcos.enterprise.portal.form.PortalPermissionSaveAuthObjForm; +import com.idcos.enterprise.portal.form.PortalPermissionSaveAuthResForm; +import com.idcos.enterprise.portal.manager.auto.PortalPermissionOperateManager; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.formula.functions.T; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import static com.idcos.enterprise.portal.UamConstant.ADMIN; +import java.util.List; + +/** + * Manager实现类 + * <p>第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖</p> + * + * @author yanlv + * @version v 1.1 2015-06-09 10:00:37 yanlv Exp $ + */ +@Service +public class PortalPermissionOperateManagerImpl implements PortalPermissionOperateManager { + @Autowired + private PortalPermissionRepository portalPermissionRepository; + + @Autowired + private BusinessProcessTemplate businessProcessTemplate; + + @Autowired + private CurrentUser currentUser; + + @Autowired + private PortalResourceRepository portalResourceRepository; + + @Autowired + private PortalRoleRepository portalRoleRepository; + + @Override + public CommonResult<?> saveAuthObj(final PortalPermissionSaveAuthObjForm form) { + return businessProcessTemplate.process(new BusinessProcessCallbackAdator<T>() { + @Override + public void checkParam(BusinessProcessContext context) { + //FormChecker.check(form); TODO:jar包待下线 + } + + @Override + public T doBusiness(BusinessProcessContext context) { + + //取出authObjId信息,组装需要保存和删除的数据信息 + String authObjIds = form.getAuthObjIds(); + if (StringUtils.isNotBlank(authObjIds)) { + + String[] authObjArr = authObjIds.split(","); + + for (String str : authObjArr) { + String authObjId = str.split(":")[0]; + String operType = str.split(":")[1]; + + if ("I".equals(operType)) { + PortalPermission perPo = new PortalPermission(); + + perPo.setAuthObjId(authObjId); + perPo.setAuthObjType(StringUtils.upperCase(form.getAuthObjType())); + perPo.setAuthResId(form.getAuthResId()); + perPo.setAuthResType(StringUtils.upperCase(form.getAuthResType())); + + //获取资源系统的id并把AppId放到PortalPermissions中的AppId + perPo.setAppId(getAppId(form.getAuthResType())); + + perPo.setAuthResName(StringUtils.isBlank(form.getAuthResName()) ? form.getAuthResId() + : form.getAuthResName()); + perPo.setTenant(currentUser.getUser().getTenantId()); + portalPermissionRepository.save(perPo); + } + + if ("D".equals(operType)) { + portalPermissionRepository.deleteByAuthResIdAndAuthObjId(form.getAuthResId(), authObjId); + } + } + } + + return null; + } + }); + } + + /** + * 获取资源系统的id + * + * @param code + * @return + */ + private String getAppId(String code) { + PortalResource portalResource = portalResourceRepository.findByCodeAndIsActive(code, + IsActiveEnum.HAS_ACTIVE.getCode()); + if (portalResource == null) { + throw new CommonBizException("未查询到要保存的权限资源信息"); + } + return portalResource.getAppId(); + } + + @Override + public CommonResult<?> saveAuthRes(final String permissionInfo) { + if (!ADMIN.equals(currentUser.getUser().getLoginId())) { + throw new CommonBizException("非admin用户不允许给其他用户分配权限!!!"); + } + return businessProcessTemplate.process(new BusinessProcessCallbackAdator<T>() { + @Override + public void checkParam(BusinessProcessContext context) { + } + + @Override + public T doBusiness(BusinessProcessContext context) { + List<PortalPermissionSaveAuthResForm> permissionList = JSON.parseArray(permissionInfo, + PortalPermissionSaveAuthResForm.class); + savePermissionList(permissionList, currentUser.getUser().getTenantId()); + + return null; + } + }); + } + + @Override + public CommonResult<?> assignByRoleCode(final String tenantId, final String roleCode, + final List<PortalPermissionSaveAuthResForm> permissionList) { + return businessProcessTemplate.process(new BusinessProcessCallbackAdator<T>() { + @Override + public void checkParam(BusinessProcessContext context) { + } + + @Override + public T doBusiness(BusinessProcessContext context) { + List<PortalRole> roles = portalRoleRepository.findByCodeAndIsActive(roleCode, "Y"); + if (roles == null || roles.size() == 0) { + throw new RuntimeException("角色Code不存在,无法绑定权限!"); + } + String roleId = roles.get(0).getId(); + + for (PortalPermissionSaveAuthResForm form : permissionList) { + form.setAuthObjType(AuthObjTypeEnum.ROLE.getCode()); + form.setAuthObjId(roleId); + } + + savePermissionList(permissionList, tenantId); + + return null; + } + }); + } + + /** + * 增加或删除权限与角色的绑定关系 + * + * @param permissionList + * @param tenantId + */ + private void savePermissionList(List<PortalPermissionSaveAuthResForm> permissionList, String tenantId) { + //这里要防止重复插入 + if (permissionList == null || permissionList.size() == 0) { + return; + } + List<PortalPermission> dbPermissions = portalPermissionRepository.queryAuthRes("ROLE", + permissionList.get(0).getAuthResType(), permissionList.get(0).getAuthObjId()); + for (PortalPermissionSaveAuthResForm form : permissionList) { + //FormChecker.check(form); TODO:jar包待下线 + if (dbPermissions != null && dbPermissions.size() > 0) { + //数据库有数据 + PortalPermission existPermission = ListUtil.findOne(dbPermissions, "authResId", form.getAuthResId()); + if (existPermission != null) { + //数据库有列表数据 + if ("D".equals(form.getOperType())) { + portalPermissionRepository.deleteByAuthResIdAndAuthObjId(form.getAuthResId(), + form.getAuthObjId()); + } + } else { + //数据库没有列表数据 + if ("I".equals(form.getOperType())) { + PortalPermission permission = new PortalPermission(); + ObjectUtil.copyProperties(form, permission); + permission.setTenant(tenantId); + permission.setAppId(getAppId(form.getAuthResType())); + portalPermissionRepository.save(permission); + } + } + } else if (dbPermissions == null || dbPermissions.size() <= 0) { + //数据库没有数据 + if ("I".equals(form.getOperType())) { + PortalPermission permission = new PortalPermission(); + ObjectUtil.copyProperties(form, permission); + permission.setTenant(tenantId); + permission.setAppId(getAppId(form.getAuthResType())); + portalPermissionRepository.save(permission); + } + } + + } + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalPermissionQueryManagerImpl.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalPermissionQueryManagerImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..4bf9574fe5049e7e132fb07e3f0fe35b4e3d2d87 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalPermissionQueryManagerImpl.java @@ -0,0 +1,87 @@ + + +package com.idcos.enterprise.portal.manager.impl; + +// auto generated imports + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.idcos.cloud.biz.common.check.FormChecker; +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.cloud.core.common.util.ListUtil; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessQueryCallback; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessQueryTemplate; +import com.idcos.enterprise.portal.convert.PortalPermissionConvert; +import com.idcos.enterprise.portal.dal.repository.PortalPermissionRepository; +import com.idcos.enterprise.portal.form.PortalPermissionQueryAuthObjForm; +import com.idcos.enterprise.portal.form.PortalPermissionQueryAuthResForm; +import com.idcos.enterprise.portal.manager.auto.PortalPermissionQueryManager; +import com.idcos.enterprise.portal.vo.PortalPermissionVO; +import com.idcos.enterprise.portal.biz.common.CommonBizException; +import com.idcos.enterprise.portal.biz.common.utils.CurrentUser; +import static com.idcos.enterprise.portal.UamConstant.ADMIN; + +/** + * Manager实现类 + * <p>第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖</p> + * + * @author yanlv + * @version v 1.1 2015-06-09 10:00:37 yanlv Exp $ + */ +@Service +public class PortalPermissionQueryManagerImpl implements PortalPermissionQueryManager { + @Autowired + private BusinessQueryTemplate businessQueryTemplate; + @Autowired + private PortalPermissionConvert portalPermissionConvert; + @Autowired + private PortalPermissionRepository portalPermissionRepository; + + @Autowired + private CurrentUser currentUser; + + @Override + public CommonResult<?> queryAuthObj(final PortalPermissionQueryAuthObjForm form) { + if (!ADMIN.equals(currentUser.getUser().getLoginId())) { + throw new CommonBizException("only admin permits"); + } + return businessQueryTemplate.process(new BusinessQueryCallback<List<PortalPermissionVO>>() { + + @Override + public void checkParam() { + //FormChecker.check(form); TODO:jar包待下线 + } + + @Override + public List<PortalPermissionVO> doQuery() { + return ListUtil.transform( + portalPermissionRepository.queryAuthObj(form.getAuthObjType(), + form.getAuthResType(), form.getAuthResId()), portalPermissionConvert); + } + }); + } + + @Override + public CommonResult<?> queryAuthRes(final PortalPermissionQueryAuthResForm form) { + if (!ADMIN.equals(currentUser.getUser().getLoginId())) { + throw new CommonBizException("only admin permits"); + } + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + @Override + public void checkParam() { + //FormChecker.check(form); TODO:jar包待下线 + } + + @Override + public Object doQuery() { + return ListUtil.transform( + portalPermissionRepository.queryAuthRes(form.getAuthObjType(), + form.getAuthResType(), form.getAuthObjId()), portalPermissionConvert); + } + }); + } + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalResourceOperateManagerImpl.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalResourceOperateManagerImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..8c978e7fc94c2d343216eba2a319985a95da7e2f --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalResourceOperateManagerImpl.java @@ -0,0 +1,138 @@ + + +package com.idcos.enterprise.portal.manager.impl; + +// auto generated imports + +import com.idcos.cloud.core.common.util.ListUtil; +import com.idcos.enterprise.portal.biz.common.utils.CurrentUser; +import com.idcos.enterprise.portal.dal.entity.PortalPermission; +import com.idcos.enterprise.portal.dal.repository.PortalPermissionRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.idcos.cloud.biz.common.check.CommonParamtersChecker; +import com.idcos.cloud.biz.common.check.FormChecker; +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.cloud.core.common.util.ObjectUtil; +import com.idcos.enterprise.portal.biz.common.CommonBizException; +import com.idcos.enterprise.portal.biz.common.ResultCode; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessProcessCallbackAdator; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessProcessContext; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessProcessTemplate; +import com.idcos.enterprise.portal.biz.common.utils.CrudUtilService; +import com.idcos.enterprise.portal.convert.PortalResourceConvert; +import com.idcos.enterprise.portal.dal.entity.PortalResource; +import com.idcos.enterprise.portal.dal.enums.IsActiveEnum; +import com.idcos.enterprise.portal.dal.repository.PortalResourceRepository; +import com.idcos.enterprise.portal.form.PortalResourceCreateForm; +import com.idcos.enterprise.portal.form.PortalResourceUpdateForm; +import com.idcos.enterprise.portal.manager.auto.PortalResourceOperateManager; + +import java.util.ArrayList; +import java.util.List; + +/** + * PortalResourceOperateManagerImpl + * + * @author pengganyu + * @version $Id: PortalResourceOperateManagerImpl.java, v 0.1 2016年5月10日 上午9:50:27 pengganyu Exp $ + */ +@Service +public class PortalResourceOperateManagerImpl implements PortalResourceOperateManager { + @Autowired + private PortalResourceRepository portalResourceRepository; + @Autowired + private PortalPermissionRepository portalPermissionRepository; + @Autowired + private BusinessProcessTemplate businessProcessTemplate; + @Autowired + private CrudUtilService crudUtilService; + @Autowired + private PortalResourceConvert portalResourceConvert; + @Autowired + private CurrentUser currentUser; + + @Override + public CommonResult<?> create(final PortalResourceCreateForm form) { + return businessProcessTemplate.process(new BusinessProcessCallbackAdator<Object>() { + @Override + public void checkParam(BusinessProcessContext context) { + //FormChecker.check(form); TODO:jar包待下线 + + if (portalResourceRepository.findByCodeAndIsActive(form.getCode(), + IsActiveEnum.HAS_ACTIVE.getCode()) != null) { + throw new CommonBizException("不能保存已经存在的权限资源类型" + form.getCode()); + } + } + + @Override + public Object doBusiness(BusinessProcessContext context) { + PortalResource res = new PortalResource(); + + ObjectUtil.copyProperties(form, res); + res.setIsActive("Y"); + res.setTenant(currentUser.getUser().getTenantId()); + portalResourceRepository.save(res); + + return portalResourceConvert.apply(res); + } + }); + } + + @Override + public CommonResult<?> update(final String id, final PortalResourceUpdateForm form) { + return businessProcessTemplate.process(new BusinessProcessCallbackAdator<Object>() { + @Override + public void checkParam(BusinessProcessContext context) { + //FormChecker.check(form); TODO:jar包待下线 + CommonParamtersChecker.checkNotBlank(id); + + } + + @Override + public Object doBusiness(BusinessProcessContext context) { + + PortalResource resource = portalResourceRepository.findOne(id); + + if (resource == null) { + throw new CommonBizException(ResultCode.QUERY_RESULT_IS_NULL, "未查询到可更新的权限资源信息"); + } + + changePermissionAuthResId(resource, form); + + + ObjectUtil.copyProperties(form, resource); + + resource.setTenant(currentUser.getUser().getTenantId()); + portalResourceRepository.save(resource); + + return portalResourceConvert.apply(resource); + } + }); + } + + /** + * 需要修改permission表的权限资源编码,防止脏数据产生 + * + * @param resource + * @param form + */ + private void changePermissionAuthResId(PortalResource resource, PortalResourceUpdateForm form) { + List<PortalPermission> portalPermissions = new ArrayList<>(); + if (!form.getCode().equals(resource.getCode())) { + //如果form中的code和数据库不相同,说明权限资源编码发生变化,需要修改permission表的权限资源编码,防止脏数据产生 + portalPermissions = portalPermissionRepository.queryAuthObjByAppIdAndAuthResType(resource.getAppId(), resource.getCode()); + } + if (portalPermissions.size() > 0) { + ListUtil.update(portalPermissions, "authResType", resource.getCode(), form.getCode()); + portalPermissionRepository.save(portalPermissions); + } + } + + @Override + public CommonResult<?> delete(final String id) { + return crudUtilService.delete(id, portalResourceConvert); + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalResourceQueryManagerImpl.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalResourceQueryManagerImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..4656ea26441bb438fdfd3171f9226b42048f7bd2 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalResourceQueryManagerImpl.java @@ -0,0 +1,85 @@ + + +package com.idcos.enterprise.portal.manager.impl; + +// auto generated imports + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.idcos.cloud.biz.common.check.CommonParamtersChecker; +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.cloud.core.common.util.ListUtil; +import com.idcos.enterprise.portal.biz.common.CommonBizException; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessQueryCallback; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessQueryTemplate; +import com.idcos.enterprise.portal.convert.PortalResourceConvert; +import com.idcos.enterprise.portal.dal.entity.PortalResource; +import com.idcos.enterprise.portal.dal.enums.IsActiveEnum; +import com.idcos.enterprise.portal.dal.repository.PortalResourceRepository; +import com.idcos.enterprise.portal.manager.auto.PortalResourceQueryManager; +import com.idcos.enterprise.portal.biz.common.utils.CurrentUser; +import static com.idcos.enterprise.portal.UamConstant.ADMIN; +/** + * PortalResourceOperateManagerImpl + * + * @author pengganyu + * @version $Id: PortalResourceOperateManagerImpl.java, v 0.1 2016年5月10日 上午9:50:27 pengganyu Exp $ + */ +@Service +public class PortalResourceQueryManagerImpl implements PortalResourceQueryManager { + @Autowired + private PortalResourceRepository portalResourceRepository; + @Autowired + private BusinessQueryTemplate businessQueryTemplate; + @Autowired + private PortalResourceConvert portalResourceConvert; + @Autowired + private CurrentUser currentUser; + + @Override + public CommonResult<?> queryByCode(final String code) { + if (!ADMIN.equals(currentUser.getUser().getLoginId())) { + throw new CommonBizException("only admin permits"); + } + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + + @Override + public Object doQuery() { + PortalResource res = portalResourceRepository.findByCodeAndIsActive(code, "Y"); + + if (res == null) { + throw new CommonBizException("未查询到有效的权限资源信息"); + } + + return portalResourceConvert.apply(res); + } + + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(code); + } + }); + } + + @Override + public CommonResult<?> queryAll() { + if (!ADMIN.equals(currentUser.getUser().getLoginId())) { + throw new CommonBizException("only admin permits"); + } + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + + @Override + public Object doQuery() { + + return ListUtil.transform( + portalResourceRepository.findByIsActive(IsActiveEnum.HAS_ACTIVE.getCode()), + portalResourceConvert); + } + + @Override + public void checkParam() { + } + }); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalRestfulServiceImpl.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalRestfulServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..6b144cf4fae5a8193de22124a6354097438d438a --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalRestfulServiceImpl.java @@ -0,0 +1,264 @@ +/** + * 杭州云霁科技有限公司 http://www.idcos.com Copyright (c) 2015 All Rights Reserved. + */ + +package com.idcos.enterprise.portal.manager.impl; + +import static com.idcos.enterprise.portal.UamConstant.INTERROGATION; + +import java.util.*; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +// auto generated imports + +import com.alibaba.fastjson.JSON; +import com.google.common.collect.Lists; +import com.idcos.cloud.core.common.util.ListUtil; +import com.idcos.cloud.core.dal.common.page.Pagination; +import com.idcos.enterprise.portal.biz.common.PortalResponse; +import com.idcos.enterprise.portal.biz.common.ResultCode; +import com.idcos.enterprise.portal.biz.common.utils.CurrentUser; +import com.idcos.enterprise.portal.dal.entity.*; +import com.idcos.enterprise.portal.dal.enums.IsActiveEnum; +import com.idcos.enterprise.portal.dal.repository.*; +import com.idcos.enterprise.portal.manager.auto.PortalRestfulService; +import com.idcos.enterprise.portal.services.PortalUserService; +import com.idcos.enterprise.portal.vo.PortalUserVO; +import com.idcos.enterprise.portal.web.GlobalValue; + +/** + * Manager实现类 + * <p> + * 第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖 + * </p> + * + * @author pengganyu + * @version v 1.1 2015-06-09 09:26:24 pengganyu Exp $ + */ +@Service +public class PortalRestfulServiceImpl implements PortalRestfulService { + + /** + * Logger类 + */ + private static final Logger Logger = LoggerFactory.getLogger(PortalRestfulServiceImpl.class); + + @Autowired + private PortalGroupUserRelRepository portalGroupUserRelRepository; + + @Autowired + private PortalUserGroupRepository portalUserGroupRepository; + + @Autowired + private PortalGroupRoleRelRepository portalGroupRoleRelRepository; + + @Autowired + private PortalPermissionRepository portalPermissionRepository; + + @Autowired + private PortalResourceRepository portalResourceRepository; + + @Autowired + private PortalUserService portalUserService; + + @Autowired + private CurrentUser currentUser; + + @Autowired + private GlobalValue globalValue; + + /** + * 页面不传tenantId的话。租户信息从token中获取 + * + * @param tenantId + * @return + */ + private String getTenant(String tenantId) { + String tenant; + // 若页面不传的话 + if (StringUtils.isBlank(tenantId)) { + tenant = currentUser.getUser().getTenantId(); + } else { + tenant = tenantId; + } + return tenant; + } + + /** + * 根据用户组id查询用户ID列表 + * + * @return BaseResultVO + */ + @Override + public PortalResponse queryUserIdsByGroupId(String groupId) { + PortalResponse response = new PortalResponse(); + + if (StringUtils.isBlank(groupId)) { + response.setMessage("用户组Id为空"); + response.setStatus(ResultCode.FAILE.getCode()); + return response; + } + + List<String> userIds = Lists.newArrayList(); + + for (PortalGroupUserRel rel : portalGroupUserRelRepository.findByGroupId(groupId)) { + userIds.add(rel.getUserId()); + } + + response.setMessage("查询成功"); + response.setStatus(ResultCode.SUCCESS.getCode()); + response.setContent(userIds); + + return response; + } + + @Override + public PortalResponse queryUserIdsByGroupName(String groupName) { + PortalResponse rsp = new PortalResponse(); + + if (StringUtils.isBlank(groupName)) { + rsp.setStatus(ResultCode.FAILE.getCode()); + rsp.setMessage("用户组名称不能为空"); + return rsp; + } + + List<PortalUserGroup> groups = portalUserGroupRepository.findByName(groupName); + + if (groups.size() == 0) { + rsp.setStatus(ResultCode.SUCCESS.getCode()); + rsp.setMessage("查询成功"); + rsp.setContent(Lists.newArrayList()); + return rsp; + } + + if (groups.size() > 1) { + rsp.setStatus(ResultCode.FAILE.getCode()); + rsp.setMessage("用户组名称不唯一"); + return rsp; + } + return queryUserIdsByGroupId(groups.get(0).getId()); + } + + @Override + public PortalResponse queryUserByCnd(String tenantId, String cnd, String pageNo, String pageSize) { + Logger.info("===============================根据查询条件查询用户信息,查询条件为:" + cnd); + Pagination<PortalUserVO> userPagination = + portalUserService.getPageList(tenantId, null, cnd, Integer.parseInt(pageNo), Integer.parseInt(pageSize)); + + PortalResponse rsp = new PortalResponse(); + + if (userPagination.getTotalCount() == 0) { + rsp.setStatus(ResultCode.FAILE.getCode()); + rsp.setMessage("查询用户列表为空"); + return rsp; + } + rsp.setStatus(ResultCode.SUCCESS.getCode()); + rsp.setMessage("查询成功"); + rsp.setContent(userPagination); + return rsp; + } + + /** + * 根据用户id查询用户信息 + * + * @see com.idcos.enterprise.portal.manager.auto.PortalRestfulService#queryAuthority(java.lang.String) + */ + @SuppressWarnings("unchecked") + @Override + public PortalResponse queryAuthority(final String userId) { + PortalResponse rsp = new PortalResponse(); + + if (StringUtils.isBlank(userId)) { + rsp.setStatus(ResultCode.FAILE.getCode()); + rsp.setMessage("用户id为空"); + } + + Logger.info("===============================开始查询用户信息"); + Logger.info("===============================入参:" + userId); + + Map<String, Object> returnMap = new HashMap<>(3); + + Set<String> roleList = new HashSet<>(); + Set<String> groupList = new HashSet<>(); + + Map<String, Set<String>> perMap = new HashMap<>(9); + + // 获取用户组信息 + for (PortalGroupUserRel rel : portalGroupUserRelRepository.findByUserId(userId)) { + if (StringUtils.isNotBlank(rel.getGroupId())) { + groupList.add(rel.getGroupId()); + } + } + + // 根据用户组id查询角色 + for (String groupId : groupList) { + for (PortalGroupRoleRel rel : portalGroupRoleRelRepository.findByGroupId(groupId)) { + if (StringUtils.isNotBlank(rel.getRoleId())) { + roleList.add(rel.getRoleId()); + } + } + } + + // 获取权限信息 + if (roleList.size() > 0) { + Map<?, List<PortalPermission>> tmpMap = ListUtil.groupBy( + portalPermissionRepository.queryAuthIdsByAuthObjs(globalValue.getAppId(), roleList), "authResType"); + for (Object key : tmpMap.keySet()) { + perMap.put((String)key, new HashSet<String>(ListUtil.filter(tmpMap.get(key), "authResId"))); + } + } + + returnMap.put("roles", roleList); + returnMap.put("permissions", perMap); + returnMap.put("groups", groupList); + + rsp.setStatus(ResultCode.SUCCESS.getCode()); + rsp.setMessage("查询成功"); + rsp.setContent(JSON.toJSON(returnMap)); + + Logger.info("===============================查询结束。"); + return rsp; + } + + @Override + public PortalResponse queryResource(String code, String tenantId) { + PortalResponse rsp = new PortalResponse(); + + // 校验权限资源配置信息 + PortalResource res = portalResourceRepository.findByCodeAndIsActive(code, IsActiveEnum.HAS_ACTIVE.getCode()); + + if (res == null) { + rsp.setStatus(ResultCode.FAILE.getCode()); + rsp.setMessage("未查询到有效的权限资源配置信息"); + return rsp; + } + if (StringUtils.isBlank(res.getUrl())) { + rsp.setStatus(ResultCode.FAILE.getCode()); + rsp.setMessage("权限资源" + res.getName() + "URL配置为空"); + return rsp; + } + + StringBuffer url = new StringBuffer(res.getUrl()); + if (res.getUrl().contains(INTERROGATION)) { + url.append("&"); + } else { + url.append(INTERROGATION); + } + url.append("tenantId=" + tenantId); + + Logger.info("===============================开始查询" + res.getName() + "权限资源信息,URL地址为:" + url); + + rsp = new RestTemplate().getForObject(StringUtils.trim(url.toString()), PortalResponse.class); + + Logger.info("===============================查询结束,返回信息:" + rsp.getMessage()); + + return rsp; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalRoleOperateManagerImpl.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalRoleOperateManagerImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..60b2aff177c8c46021b6f094621f8f05b6044902 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalRoleOperateManagerImpl.java @@ -0,0 +1,235 @@ + + +package com.idcos.enterprise.portal.manager.impl; + +// auto generated imports + +import java.util.List; + +import com.idcos.enterprise.portal.biz.common.utils.CurrentUser; +import com.idcos.enterprise.portal.dal.entity.PortalPermission; +import com.idcos.enterprise.portal.dal.repository.PortalPermissionRepository; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.formula.functions.T; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.idcos.cloud.biz.common.check.CommonParamtersChecker; +import com.idcos.cloud.biz.common.check.FormChecker; +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.cloud.core.common.util.ObjectUtil; +import com.idcos.enterprise.portal.biz.common.CommonBizException; +import com.idcos.enterprise.portal.biz.common.ResultCode; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessProcessCallback; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessProcessContext; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessProcessTemplate; +import com.idcos.enterprise.portal.biz.common.utils.CrudUtilService; +import com.idcos.enterprise.portal.convert.PortalRoleConvert; +import com.idcos.enterprise.portal.dal.entity.PortalGroupRoleRel; +import com.idcos.enterprise.portal.dal.entity.PortalRole; +import com.idcos.enterprise.portal.dal.enums.IsActiveEnum; +import com.idcos.enterprise.portal.dal.repository.PortalGroupRoleRelRepository; +import com.idcos.enterprise.portal.dal.repository.PortalRoleRepository; +import com.idcos.enterprise.portal.form.PortalRoleCreateForm; +import com.idcos.enterprise.portal.form.PortalRoleUpdateForm; +import com.idcos.enterprise.portal.manager.auto.PortalRoleOperateManager; +import com.idcos.enterprise.portal.vo.PortalRoleVO; + +/** + * Manager实现类 + * <p>第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖</p> + * + * @author yanlv + * @version v 1.1 2015-06-06 10:24:34 yanlv Exp $ + */ +@Service +public class PortalRoleOperateManagerImpl implements PortalRoleOperateManager { + @Autowired + private PortalRoleConvert portalRoleConvert; + @Autowired + private CrudUtilService crudUtilService; + @Autowired + private PortalGroupRoleRelRepository portalGroupRoleRelRepository; + @Autowired + private PortalRoleRepository portalRoleRepository; + @Autowired + private BusinessProcessTemplate businessProcessTemplate; + + @Autowired + private PortalPermissionRepository portalPermissionRepository; + + @Autowired + private CurrentUser currentUser; + + @Override + public CommonResult<?> create(final PortalRoleCreateForm form) { + CommonResult<PortalRoleVO> result = businessProcessTemplate + .process(new BusinessProcessCallback<PortalRoleVO>() { + + @Override + public void checkParam(BusinessProcessContext context) { + //FormChecker.check(form); TODO:jar包待下线 + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + //编码重复校验 + List<PortalRole> roleList = portalRoleRepository.findByCodeAndIsActive( + form.getCode(), IsActiveEnum.HAS_ACTIVE.getCode()); + if (CollectionUtils.isNotEmpty(roleList)) { + throw new CommonBizException(ResultCode.UNKNOWN_EXCEPTION, "编码" + + form.getCode() + + "已经存在,无法保存"); + } + } + + @Override + public PortalRoleVO doBusiness(BusinessProcessContext context) { + PortalRole rolePo = new PortalRole(); + ObjectUtil.copyProperties(form, rolePo); + rolePo.setIsActive(IsActiveEnum.HAS_ACTIVE.getCode()); + rolePo.setTenant(currentUser.getUser().getTenantId()); + + return portalRoleConvert.apply(portalRoleRepository.save(rolePo)); + } + + @Override + public void exceptionProcess(CommonBizException exception, + BusinessProcessContext context) { + + } + + }); + return result; + } + + @Override + public CommonResult<?> delete(final String id) { + + //删除和角色关联的用户组关系信息 + deleteRoleGroupRel(id); + //删除和角色关联的权限关系信息 + deleteRolePermissionsRel(id); + return crudUtilService.delete(id, portalRoleConvert); + } + + private void deleteRoleGroupRel(String id) { + List<PortalGroupRoleRel> portalGroupRoleRelList = portalGroupRoleRelRepository.findByRoleId(id); + if (!portalGroupRoleRelList.isEmpty() && portalGroupRoleRelList != null) { + portalGroupRoleRelRepository.delete(portalGroupRoleRelList); + } + } + + + private void deleteRolePermissionsRel(String id) { + List<PortalPermission> portalPermissions = portalPermissionRepository.findByAuthObjId(id); + if (!portalPermissions.isEmpty() && portalPermissions != null) { + portalPermissionRepository.delete(portalPermissions); + } + } + + + @Override + public CommonResult<?> update(final String id, final PortalRoleUpdateForm form) { + CommonResult<PortalRoleVO> result = businessProcessTemplate + .process(new BusinessProcessCallback<PortalRoleVO>() { + + @Override + public void checkParam(BusinessProcessContext context) { + //FormChecker.check(form); TODO:jar包待下线 + CommonParamtersChecker.checkNotBlank(id); + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + PortalRole rolePo = portalRoleRepository.findOne(id); + if (rolePo == null + || IsActiveEnum.NO_ACTIVE.getCode().equals(rolePo.getIsActive())) { + throw new CommonBizException(ResultCode.QUERY_RESULT_IS_NULL, "未查询到有效的角色信息"); + } + + //编码重复校验 + List<PortalRole> roleList = portalRoleRepository.findByCodeAndIsActive( + form.getCode(), IsActiveEnum.HAS_ACTIVE.getCode()); + + for (PortalRole role : roleList) { + if (!role.getId().equals(id)) { + throw new CommonBizException(ResultCode.UNKNOWN_EXCEPTION, + "编码" + form.getCode() + "已经存在,无法保存"); + } + } + + context.put("PortalRole", rolePo); + + } + + @Override + public PortalRoleVO doBusiness(BusinessProcessContext context) { + PortalRole rolePo = (PortalRole) context.get("PortalRole"); + ObjectUtil.copyProperties(form, rolePo); + + return portalRoleConvert.apply(portalRoleRepository.save(rolePo)); + } + + @Override + public void exceptionProcess(CommonBizException exception, + BusinessProcessContext context) { + + } + + }); + return result; + } + + @Override + public CommonResult<?> allocateGroup(final String id, final String selGroups) { + CommonResult<T> result = businessProcessTemplate.process(new BusinessProcessCallback<T>() { + + @Override + public void checkParam(BusinessProcessContext context) { + //FormChecker.check(id); + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + + } + + @Override + public T doBusiness(BusinessProcessContext context) { + + if (StringUtils.isNoneBlank(selGroups)) { + String[] groupList = selGroups.split(","); + for (String str : groupList) { + //根据 : 来截取id和操作类型 + String groupId = str.split(":")[0]; + String operType = str.split(":")[1]; + + //D代表删除 + if ("D".equals(operType)) { + portalGroupRoleRelRepository.deleteByGroupIdAndRoleId(groupId, id); + } + + //I代表新增 + if ("I".equals(operType)) { + PortalGroupRoleRel relPo = new PortalGroupRoleRel(); + relPo.setGroupId(groupId); + relPo.setRoleId(id); + relPo.setTenant(currentUser.getUser().getTenantId()); + portalGroupRoleRelRepository.save(relPo); + } + } + } + + return null; + } + + @Override + public void exceptionProcess(CommonBizException exception, + BusinessProcessContext context) { + } + }); + return result; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalRoleQueryManagerImpl.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalRoleQueryManagerImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..4dfc6d3bdb310733d1404537e33f7020b7fb2055 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalRoleQueryManagerImpl.java @@ -0,0 +1,289 @@ +/** + * 杭州云霁科技有限公司 http://www.idcos.com Copyright (c) 2015 All Rights Reserved. + */ + +package com.idcos.enterprise.portal.manager.impl; + +import java.util.*; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.google.common.collect.Lists; +import com.idcos.cloud.biz.common.check.CommonParamtersChecker; +import com.idcos.cloud.biz.common.check.FormChecker; +import com.idcos.cloud.core.common.BaseLinkVO; +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.cloud.core.common.util.ListUtil; +import com.idcos.cloud.core.dal.common.page.*; +import com.idcos.enterprise.portal.biz.common.CommonBizException; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessQueryCallback; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessQueryTemplate; +import com.idcos.enterprise.portal.biz.common.utils.CrudUtilService; +import com.idcos.enterprise.portal.biz.common.utils.PortalFilterUtil; +import com.idcos.enterprise.portal.convert.PortalRoleConvert; +import com.idcos.enterprise.portal.convert.PortalRoleInfoConvert; +import com.idcos.enterprise.portal.dal.entity.*; +import com.idcos.enterprise.portal.dal.enums.AuthObjTypeEnum; +import com.idcos.enterprise.portal.dal.enums.IsActiveEnum; +import com.idcos.enterprise.portal.dal.repository.*; +import com.idcos.enterprise.portal.form.PortalQueryByPageForm; +import com.idcos.enterprise.portal.form.PortalRoleQueryByPageForm; +import com.idcos.enterprise.portal.manager.auto.PortalRoleQueryManager; +import com.idcos.enterprise.portal.services.PortalUserService; +import com.idcos.enterprise.portal.vo.PortalRoleVO; +import com.idcos.enterprise.portal.biz.common.utils.CurrentUser; +import static com.idcos.enterprise.portal.UamConstant.ADMIN; +/** + * Manager实现类 + * <p> + * 第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖 + * </p> + * + * @author yanlv + * @version v 1.1 2015-06-06 10:24:34 yanlv Exp $ + */ +@Service +public class PortalRoleQueryManagerImpl implements PortalRoleQueryManager { + @Autowired + private PortalRoleConvert func; + + @Autowired + private PortalRoleInfoConvert funcInfo; + + @Autowired + private CrudUtilService crudUtilService; + + @Autowired + private BusinessQueryTemplate businessQueryTemplate; + + @Autowired + private PortalUserGroupRepository portalUserGroupRepository; + + @Autowired + private PortalRoleRepository portalRoleRepository; + + @Autowired + private PortalGroupRoleRelRepository portalGroupRoleRelRepository; + + @Autowired + private PortalGroupUserRelRepository portalGroupUserRelRepository; + + @Autowired + private PortalPermissionRepository portalPermissionRepository; + + @Autowired + private PortalUserRepository portalUserRepository; + + @Autowired + private PortalRelQueryRepository portalRelQueryRepository; + + @Autowired + private PortalResourceRepository portalResourceRepository; + + @Autowired + private PortalUserService portalUserService; + + @Autowired + private CurrentUser currentUser; + + @Override + public CommonResult<?> queryByPage(final String offset, final String limit, final PortalRoleQueryByPageForm form) { + if (!ADMIN.equals(currentUser.getUser().getLoginId())) { + throw new CommonBizException("only admin permits"); + } + return crudUtilService.query(PortalRole.class, form, new PageForm(offset, limit, null, null), func, true); + } + + @Override + public CommonResult<?> queryById(final String id) { + return crudUtilService.findOneAndIsActive(id, funcInfo); + } + + @Override + public CommonResult<?> queryGroupsById(final String id) { + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(id); + } + + @Override + public Object doQuery() { + BaseLinkVO vo = new BaseLinkVO(); + List<PortalUserGroup> groupList = Lists.newArrayList(); + + for (PortalGroupRoleRel rel : portalGroupRoleRelRepository.findByRoleId(id)) { + PortalUserGroup group = portalUserGroupRepository.findOne(rel.getGroupId()); + if (IsActiveEnum.HAS_ACTIVE.getCode().equals(group.getIsActive())) { + groupList.add(group); + } + } + + vo.putLinkObj("GROUP", groupList); + return vo; + } + }); + } + + @Override + public CommonResult<?> queryPermissionsById(final String id) { + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(id); + } + + @Override + public Object doQuery() { + BaseLinkVO vo = new BaseLinkVO(); + List<PortalPermission> perList = Lists.newArrayList(); + + perList.addAll(portalPermissionRepository + .queryAuthResByAuthObjTypeAndAuthObjId(AuthObjTypeEnum.ROLE.getCode(), id)); + + Map<?, List<PortalPermission>> perGroups = ListUtil.groupBy(perList, "authResType"); + List<Map<String, Object>> resultList = Lists.newArrayList(); + + for (Object key : perGroups.keySet()) { + Map<String, Object> tmp = new HashMap<>(3); + + PortalResource res = portalResourceRepository.findByCodeAndIsActive((String)key, "Y"); + + if (res == null) { + continue; + } + // 资源类型 + tmp.put("resName", res.getName()); + // 系统名称 + tmp.put("systemName", res.getAppId()); + // 权限数据 + tmp.put("permissions", PortalFilterUtil.filterPermission(perGroups.get(key))); + + resultList.add(tmp); + } + + vo.putLinkObj("PERMISSION", resultList); + + return vo; + } + }); + } + + @Override + public CommonResult<?> queryUsersById(final String id) { + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(id); + } + + @Override + public Object doQuery() { + BaseLinkVO vo = new BaseLinkVO(); + vo.putLinkObj("USER", portalUserService.listUserByRoleId(id)); + return vo; + } + }); + } + + @Override + public CommonResult<?> queryRolePageByUserIdAndCnd(final PortalQueryByPageForm form) { + return businessQueryTemplate.process(new BusinessQueryCallback<Pagination<PortalRoleVO>>() { + @Override + public void checkParam() { + //FormChecker.check(form); TODO:jar包待下线 + } + + @Override + public Pagination<PortalRoleVO> doQuery() { + Pagination<PortalRoleVO> portalRoleVOPagination = portalUserService.listRoleByUserForm(form); + return portalRoleVOPagination; + } + }); + } + + @Override + public CommonResult<?> queryRolePageByGroupIdAndCnd(final PortalQueryByPageForm form) { + if (!ADMIN.equals(currentUser.getUser().getLoginId())) { + throw new CommonBizException("only admin permits"); + } + return businessQueryTemplate.process(new BusinessQueryCallback<Pagination<PortalRoleVO>>() { + @Override + public void checkParam() { + //FormChecker.check(form); TODO:jar包待下线 + } + + @Override + public Pagination<PortalRoleVO> doQuery() { + List<PortalRole> totalRoleList = + portalRoleRepository.findRolePageByGroupIdAndCnd(form.getId(), "%" + form.getCnd() + "%"); + + List<PortalRole> roleList = portalRelQueryRepository.findRolePageByGroupId(form.getId(), + "%" + form.getCnd() + "%", form.getPageNo(), form.getPageSize()); + + List<PortalRoleVO> voList = ListUtil.transform(roleList, func); + + return PageUtils.toPagination(voList, form.getPageNo(), form.getPageSize(), totalRoleList.size()); + + } + }); + } + + @Override + public CommonResult<?> queryByTenantId(final String tenantId) { + return businessQueryTemplate.process(new BusinessQueryCallback<List<PortalRoleVO>>() { + @Override + public void checkParam() {} + + @Override + public List<PortalRoleVO> doQuery() { + List<PortalRole> portalRoles = portalRoleRepository.findByIsActive("Y"); + return ListUtil.transform(portalRoles, func); + } + }); + } + + @Override + public CommonResult<?> queryByAccountNoAndTenantId(final String accountNo, final String tenantId) { + return businessQueryTemplate.process(new BusinessQueryCallback<List<PortalRoleVO>>() { + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(accountNo); + CommonParamtersChecker.checkNotBlank(tenantId); + } + + @Override + public List<PortalRoleVO> doQuery() { + + // 查询用户是否存在 + PortalUser portalUser = portalUserRepository.findPortalUserByAccountId(tenantId, accountNo); + + if (portalUser == null) { + + throw new CommonBizException("用户信息不存在,请检查"); + } + + List<PortalRole> portalRoles = new ArrayList<>(); + + for (PortalGroupUserRel userRel : portalGroupUserRelRepository.findByUserId(portalUser.getId())) { + + for (PortalGroupRoleRel roleRel : portalGroupRoleRelRepository + .findByGroupId(userRel.getGroupId())) { + + PortalRole portalRole = portalRoleRepository.findOne(roleRel.getRoleId()); + if (portalRole != null) { + portalRoles.add(portalRole); + } + + } + } + + return ListUtil.transform(portalRoles, func); + + } + }); + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalTenantManagerImpl.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalTenantManagerImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..fd4165f0ecf1a4328e7029c30d15e4df2c69a5aa --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalTenantManagerImpl.java @@ -0,0 +1,130 @@ + + +package com.idcos.enterprise.portal.manager.impl; + +// auto generated imports + +import com.idcos.cloud.biz.common.check.CommonParamtersChecker; +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.cloud.core.common.util.DateUtil; +import com.idcos.cloud.core.common.util.ListUtil; +import com.idcos.enterprise.portal.biz.common.tempalte.*; +import com.idcos.enterprise.portal.convert.PortalTenantConvert; +import com.idcos.enterprise.portal.dal.entity.PortalTenant; +import com.idcos.enterprise.portal.dal.repository.PortalTenantRepository; +import com.idcos.enterprise.portal.form.PortalTenantQueryPageListForm; +import com.idcos.enterprise.portal.manager.auto.PortalTenantManager; +import com.idcos.enterprise.portal.services.PortalTenantService; +import com.idcos.enterprise.portal.vo.PortalTenantVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * Manager实现类 + * <p>第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖</p> + * + * @author yanlv + * @version v 1.1 2015-06-09 09:26:24 yanlv Exp $ + */ +@Service +public class PortalTenantManagerImpl implements PortalTenantManager { + @Autowired + private BusinessQueryTemplate businessQueryTemplate; + + @Autowired + private PortalTenantRepository portalTenantRepository; + + @Autowired + private PortalTenantConvert portalTenantConvert; + + @Autowired + private PortalTenantService portalTenantService; + + @Override + public CommonResult<?> getAllTenant() { + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + + @Override + public Object doQuery() { + + List<PortalTenant> portalTenantList = portalTenantRepository.getAllPortalTenant(); + return ListUtil.transform(portalTenantList, portalTenantConvert); + } + + @Override + public void checkParam() { + } + }); + } + + @Override + public CommonResult<?> getTenantByTenantId(final String tenantId) { + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + + @Override + public Object doQuery() { + + PortalTenant portalTenant = portalTenantRepository.findByName(tenantId); + return portalTenantConvert.apply(portalTenant); + } + + @Override + public void checkParam() { + } + }); + } + + @Override + public CommonResult<?> getTenantInfo(final String tenantId) { + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(tenantId); + } + + @Override + public Object doQuery() { + PortalTenant portalTenant = portalTenantRepository.findOne(tenantId); + if (portalTenant == null) { + throw new RuntimeException("未找到改租户"); + } + return po2Vo(portalTenant); + } + }); + } + + @Override + public CommonResult<?> getPageList(final int pageNo, final int pageSize, final PortalTenantQueryPageListForm form) { + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + @Override + public void checkParam() { + + } + + @Override + public Object doQuery() { + int pageNoCheck = pageNo; + int pageSizeCheck = pageSize; + if (pageNoCheck == 0) { + pageNoCheck = 10; + } + if (pageSizeCheck == 0) { + pageSizeCheck = 10; + } + return portalTenantService.queryPageList(pageNoCheck, pageSizeCheck, form); + } + }); + } + + private PortalTenantVO po2Vo(PortalTenant portalTenant) { + PortalTenantVO portalTenantVO = new PortalTenantVO(); + portalTenantVO.setTenantId(portalTenant.getName()); + portalTenantVO.setTenantName(portalTenant.getDisplayName()); + portalTenantVO.setId(portalTenant.getId()); + portalTenantVO.setGmtCreate(portalTenant.getGmtCreate()); + portalTenantVO.setGmtModified(portalTenant.getGmtModified()); + return portalTenantVO; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalTenantOperateManagerImpl.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalTenantOperateManagerImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..1e32c4946986649cea081c7c39b06c889daa73be --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalTenantOperateManagerImpl.java @@ -0,0 +1,225 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.manager.impl; + +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.cloud.core.common.util.ListUtil; +import com.idcos.enterprise.portal.biz.common.CommonBizException; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessProcessCallback; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessProcessContext; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessProcessTemplate; +import com.idcos.enterprise.portal.biz.common.utils.Base64Util; +import com.idcos.enterprise.portal.biz.common.utils.CurrentUser; +import com.idcos.enterprise.portal.biz.common.utils.PasswordUtil; +import com.idcos.enterprise.portal.dal.entity.PortalDept; +import com.idcos.enterprise.portal.dal.entity.PortalTenant; +import com.idcos.enterprise.portal.dal.entity.PortalUser; +import com.idcos.enterprise.portal.dal.entity.PortalUserGroup; +import com.idcos.enterprise.portal.dal.enums.IsActiveEnum; +import com.idcos.enterprise.portal.dal.enums.PortalUserStatusEnum; +import com.idcos.enterprise.portal.dal.repository.PortalDeptRepository; +import com.idcos.enterprise.portal.dal.repository.PortalTenantRepository; +import com.idcos.enterprise.portal.dal.repository.PortalUserGroupRepository; +import com.idcos.enterprise.portal.dal.repository.PortalUserRepository; +import com.idcos.enterprise.portal.form.PortalTenantAddForm; +import com.idcos.enterprise.portal.form.PortalTenantUpdateForm; +import com.idcos.enterprise.portal.manager.auto.PortalTenantOperateManager; +import com.idcos.enterprise.portal.services.PortalTenantService; +import com.idcos.enterprise.portal.services.PortalUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +/** + * @author souakiragen + * @version $Id: , v 0.1 2017年11月07 上午9:42 souakiragen Exp $ + */ +@Service +public class PortalTenantOperateManagerImpl implements PortalTenantOperateManager { + + @Autowired + private BusinessProcessTemplate businessProcessTemplate; + + @Autowired + private PortalTenantRepository portalTenantRepository; + + @Autowired + private CurrentUser currentUser; + + @Autowired + private PortalTenantService portalTenantService; + + @Autowired + private PortalUserRepository portalUserRepository; + + @Autowired + private PortalDeptRepository portalDeptRepository; + + @Autowired + private PortalUserGroupRepository portalUserGroupRepository; + + @Override + public CommonResult<?> add(final PortalTenantAddForm form) { + return businessProcessTemplate.process(new BusinessProcessCallback<Object>() { + @Override + public void checkParam(BusinessProcessContext context) { + PortalTenant portalTenant = portalTenantRepository.findByName(form.getTenantId()); + if (portalTenant != null) { + throw new RuntimeException("租户id已存在"); + } + portalTenant = portalTenantRepository.findByDisplayName(form.getTenantName()); + if (portalTenant != null) { + throw new RuntimeException("租户名称已存在"); + } + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + + } + + @Override + public Object doBusiness(BusinessProcessContext context) { + PortalTenant portalTenant = new PortalTenant(); + portalTenant.setName(form.getTenantId()); + portalTenant.setDisplayName(form.getTenantName()); + portalTenant.setGmtCreate(new Date()); + portalTenant.setGmtModified(portalTenant.getGmtCreate()); + portalTenant.setIsActive(IsActiveEnum.HAS_ACTIVE.getCode()); + portalTenantRepository.save(portalTenant); + createAdmin(portalTenant.getName()); + return null; + } + + @Override + public void exceptionProcess(CommonBizException exception, BusinessProcessContext context) { + + } + }); + } + + /** + * 新建租户时创建admin用户 + * + * @param tenantId + */ + private void createAdmin(String tenantId) { + PortalUser user = new PortalUser(); + user.setName("管理员"); + user.setLoginId("admin"); + user.setTenantId(tenantId); + user.setStatus(PortalUserStatusEnum.ENABLED.getCode()); + user.setIsActive(IsActiveEnum.HAS_ACTIVE.getCode()); + user.setCreateUser(currentUser.getUser().getUserId()); + user.setCreateTime(new Date()); + user.setLastModifiedTime(new Date()); + portalUserRepository.save(user); + PortalUser portalUser = portalUserRepository.findPortalUserById(tenantId, user.getLoginId()); + //密码密码后保存到数据库. + //由于加密需要用户的ID,所以需要保存用户后再更新密码。 + //加密密码 + try { + //salt随机产生,生成密码时使用的密码是用户的ID. + byte[] salt = PasswordUtil.getSalt(); + String encriptPW = PasswordUtil.encrypt("zaq1@WSX", portalUser.getId(), salt); + + String saltStr = Base64Util.encode(salt); + user.setPassword(encriptPW); + user.setSalt(saltStr); + portalUserRepository.save(user); + } catch (Exception e) { + throw new RuntimeException("系统错误,请联系管理员。"); + } + } + + @Override + public CommonResult<?> update(final PortalTenantUpdateForm form) { + final PortalTenant oldPortalTenant = portalTenantRepository.findOne(form.getId()); + return businessProcessTemplate.process(new BusinessProcessCallback<Object>() { + @Override + public void checkParam(BusinessProcessContext context) { + if (oldPortalTenant == null) { + throw new RuntimeException("该租户不存在"); + } + PortalTenant portalTenant = portalTenantRepository.findByNameNotId(form.getTenantId(), form.getId()); + if (portalTenant != null) { + throw new RuntimeException("租户id已存在"); + } + portalTenant = portalTenantRepository.findByDisplayNameNotId(form.getTenantName(), form.getId()); + if (portalTenant != null) { + throw new RuntimeException("租户名称已存在"); + } + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + + } + + @Override + public Object doBusiness(BusinessProcessContext context) { + PortalTenant portalTenant = new PortalTenant(); + portalTenant.setId(oldPortalTenant.getId()); + portalTenant.setName(form.getTenantId()); + portalTenant.setDisplayName(form.getTenantName()); + portalTenant.setGmtCreate(oldPortalTenant.getGmtCreate()); + portalTenant.setGmtModified(new Date()); + portalTenant.setIsActive(oldPortalTenant.getIsActive()); + portalTenantRepository.save(portalTenant); + return null; + } + + @Override + public void exceptionProcess(CommonBizException exception, BusinessProcessContext context) { + + } + }); + } + + @Override + public CommonResult<?> delete(final String id) { + return businessProcessTemplate.process(new BusinessProcessCallback<Object>() { + @Override + public void checkParam(BusinessProcessContext context) { + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + + } + + @Override + public Object doBusiness(BusinessProcessContext context) { + PortalTenant portalTenant = portalTenantRepository.findById(id); + //删除租户 + portalTenantService.updateIsActive(id, IsActiveEnum.NO_ACTIVE.getCode()); + //删除用户 + List<PortalUser> portalUsers = portalUserRepository.findByTenantId(portalTenant.getName()); + ListUtil.update(portalUsers, "isActive", IsActiveEnum.HAS_ACTIVE.getCode(), + IsActiveEnum.NO_ACTIVE.getCode()); + portalUserRepository.save(portalUsers); + //删除用户组 + List<PortalUserGroup> userGroups = portalUserGroupRepository + .findAllUserGroupByTenantId(portalTenant.getName()); + ListUtil.update(userGroups, "isActive", IsActiveEnum.HAS_ACTIVE.getCode(), + IsActiveEnum.NO_ACTIVE.getCode()); + portalUserGroupRepository.save(userGroups); + //删除部门 + List<PortalDept> portalDepts = portalDeptRepository.findAllDeptByTenantId(portalTenant.getName()); + ListUtil.update(portalDepts, "status", "1", "0"); + portalDeptRepository.save(portalDepts); + return null; + } + + @Override + public void exceptionProcess(CommonBizException exception, BusinessProcessContext context) { + + } + }); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalUserGroupOperateManagerImpl.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalUserGroupOperateManagerImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..39328c399434931e01bef9d02749c80f4777da09 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalUserGroupOperateManagerImpl.java @@ -0,0 +1,451 @@ + + +package com.idcos.enterprise.portal.manager.impl; + +// auto generated imports + +import com.alibaba.fastjson.JSON; +import com.idcos.cloud.biz.common.check.CommonParamtersChecker; +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.cloud.core.common.util.ListUtil; +import com.idcos.enterprise.portal.biz.common.CommonBizException; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessProcessCallback; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessProcessContext; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessProcessTemplate; +import com.idcos.enterprise.portal.biz.common.utils.CrudUtilService; +import com.idcos.enterprise.portal.biz.common.utils.CurrentUser; +import com.idcos.enterprise.portal.convert.PortalUserGroupConvert; +import com.idcos.enterprise.portal.dal.entity.*; +import com.idcos.enterprise.portal.dal.enums.PortalUserGroupTypeEnum; +import com.idcos.enterprise.portal.dal.enums.IsActiveEnum; +import com.idcos.enterprise.portal.dal.repository.*; +import com.idcos.enterprise.portal.form.PortalGroupAllocateUserForm; +import com.idcos.enterprise.portal.form.PortalGroupAndUserCreateForm; +import com.idcos.enterprise.portal.form.PortalGroupAndUserUpdateForm; +import com.idcos.enterprise.portal.manager.auto.PortalUserGroupOperateManager; +import com.idcos.enterprise.portal.services.PortalUserGroupService; +import com.idcos.enterprise.portal.vo.PortalUserGroupVO; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.formula.functions.T; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +/** + * Manager实现类 + * <p>第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖</p> + * + * @author yanlv + * @version v 1.1 2015-06-09 09:11:34 yanlv Exp $ + */ +@Service +public class PortalUserGroupOperateManagerImpl implements PortalUserGroupOperateManager { + @Autowired + private BusinessProcessTemplate businessProcessTemplate; + + @Autowired + private PortalUserGroupConvert portalUserGroupConvert; + + @Autowired + private CrudUtilService crudUtilService; + + @Autowired + private PortalUserGroupService portalUserGroupService; + + @Autowired + private PortalUserRepository portalUserRepository; + + @Autowired + private PortalUserGroupRepository portalUserGroupRepository; + + @Autowired + private PortalGroupRoleRelRepository portalGroupRoleRelRepository; + + @Autowired + private PortalGroupUserRelRepository portalGroupUserRelRepository; + + @Autowired + private CurrentUser currentUser; + + @Autowired + private PortalSysDictRepository portalSysDictRepository; + + @Override + public CommonResult<?> create(final String tenant, final String name, final String type, final String remark) { + CommonResult<PortalUserGroupVO> result = businessProcessTemplate + .process(new BusinessProcessCallback<PortalUserGroupVO>() { + + @Override + public void checkParam(BusinessProcessContext context) { + CommonParamtersChecker.checkNotBlank(name); + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + if (portalUserGroupRepository.findByNameAndTenant(name, tenant).size() > 0) { + throw new CommonBizException("用户组名称已经存在,无法保存"); + } + } + + @Override + public PortalUserGroupVO doBusiness(BusinessProcessContext context) { + PortalUserGroup po = new PortalUserGroup(); + + po.setName(name); + po.setRemark(remark); + if (StringUtils.isNotBlank(type)) { + po.setType(type); + } else { + po.setType(PortalUserGroupTypeEnum.DEFAULT.getCode()); + } + po.setIsActive(IsActiveEnum.HAS_ACTIVE.getCode()); + if (StringUtils.isNotBlank(tenant)) { + po.setTenant(tenant); + } else { + po.setTenant(currentUser.getUser().getTenantId()); + } + return portalUserGroupConvert.apply(portalUserGroupRepository.save(po)); + } + + @Override + public void exceptionProcess(CommonBizException exception, BusinessProcessContext context) { + + } + }); + return result; + } + + @Override + public CommonResult<?> delete(final String id) { + return businessProcessTemplate.process(new BusinessProcessCallback<Object>() { + @Override + public void checkParam(BusinessProcessContext context) { + PortalUserGroup userGroup = portalUserGroupRepository.findOne(id); + if (userGroup == null) { + throw new RuntimeException("删除失败,此用户组不存在!"); + } + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + + } + + @Override + public Object doBusiness(BusinessProcessContext context) { + //删除用户组和人员关系数据 + deleteGroupUser(id); + //删除用户组和角色关联数据 + deleteGroupRole(id); + + portalUserGroupService.updateIsActiveById(IsActiveEnum.NO_ACTIVE.getCode(), id); + return null; + } + + @Override + public void exceptionProcess(CommonBizException exception, BusinessProcessContext context) { + + } + }); + } + + /** + * 删除用户组关联的用户关系数据 + */ + private void deleteGroupUser(String id) { + List<PortalGroupUserRel> portalGroupUserRelList = portalGroupUserRelRepository.findByGroupId(id); + if (portalGroupUserRelList != null && !portalGroupUserRelList.isEmpty()) { + portalGroupUserRelRepository.delete(portalGroupUserRelList); + } + } + + /** + * 删除用户组关联的角色关系数据 + */ + private void deleteGroupRole(String id) { + List<PortalGroupRoleRel> portalGroupRoleRelList = portalGroupRoleRelRepository.findByGroupId(id); + if (portalGroupRoleRelList != null && !portalGroupRoleRelList.isEmpty()) { + portalGroupRoleRelRepository.delete(portalGroupRoleRelList); + } + } + + @Override + public CommonResult<?> update(final String id, final String name, final String type, final String remark) { + CommonResult<PortalUserGroupVO> result = businessProcessTemplate + .process(new BusinessProcessCallback<PortalUserGroupVO>() { + + @Override + public void checkParam(BusinessProcessContext context) { + CommonParamtersChecker.checkNotBlank(id); + CommonParamtersChecker.checkNotBlank(name); + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + PortalUserGroup po = portalUserGroupRepository.findOne(id); + + if (po == null || IsActiveEnum.NO_ACTIVE.getCode().equals(po.getIsActive())) { + throw new CommonBizException("未查询到有效的用户组信息"); + } + + context.put("PortalUserGroup", po); + } + + @Override + public PortalUserGroupVO doBusiness(BusinessProcessContext context) { + PortalUserGroup po = (PortalUserGroup) context.get("PortalUserGroup"); + po.setName(name); + po.setRemark(remark); + if (StringUtils.isNotBlank(type)) { + po.setType(type); + } else { + po.setType(PortalUserGroupTypeEnum.DEFAULT.getCode()); + } + return portalUserGroupConvert.apply(portalUserGroupRepository.save(po)); + } + + @Override + public void exceptionProcess(CommonBizException exception, BusinessProcessContext context) { + + } + }); + return result; + } + + @Override + public CommonResult<?> allocateRole(final String id, final String selectRoles) { + CommonResult<T> result = businessProcessTemplate.process(new BusinessProcessCallback<T>() { + + @Override + public void checkParam(BusinessProcessContext context) { + CommonParamtersChecker.checkNotBlank(id); + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + + } + + @Override + public T doBusiness(BusinessProcessContext context) { + // 查询用户组信息 + PortalUserGroup group = portalUserGroupRepository.findOne(id); + if (StringUtils.isNoneBlank(selectRoles)) { + String[] roleIdList = selectRoles.split(","); + for (String role : roleIdList) { + String roleId = role.split(":")[0]; + String operType = role.split(":")[1]; + + if ("I".equals(operType)) { + PortalGroupRoleRel po = new PortalGroupRoleRel(); + po.setRoleId(roleId); + po.setGroupId(id); + po.setTenant(group.getTenant()); + portalGroupRoleRelRepository.save(po); + } + + if ("D".equals(operType)) { + portalGroupRoleRelRepository.deleteByGroupIdAndRoleId(id, roleId); + } + + } + } + return null; + } + + @Override + public void exceptionProcess(CommonBizException exception, BusinessProcessContext context) { + + } + }); + return result; + } + + @Override + public CommonResult<?> allocateUser(final String id, final String selectUsers) { + CommonResult<T> result = businessProcessTemplate.process(new BusinessProcessCallback<T>() { + + @Override + public void checkParam(BusinessProcessContext context) { + CommonParamtersChecker.checkNotBlank(id); + + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + + } + + @Override + public T doBusiness(BusinessProcessContext context) { + // 保存用户组与用户的关联关系 + // 查询用户组信息 + PortalUserGroup group = portalUserGroupRepository.findOne(id); + for (PortalGroupAllocateUserForm form : JSON.parseArray(selectUsers, + PortalGroupAllocateUserForm.class)) { + if ("I".equals(form.getOperType())) { + PortalGroupUserRel po = new PortalGroupUserRel(); + po.setUserId(form.getId()); + po.setGroupId(id); + po.setTenant(group.getTenant()); + portalGroupUserRelRepository.save(po); + } + + if ("D".equals(form.getOperType())) { + portalGroupUserRelRepository.deleteByGroupIdAndUserId(id, form.getId()); + } + + } + return null; + } + + @Override + public void exceptionProcess(CommonBizException exception, BusinessProcessContext context) { + + } + }); + return result; + } + + @Override + public CommonResult<?> createUserGroupAndUser(final PortalGroupAndUserCreateForm form) { + CommonResult<String> result = businessProcessTemplate.process(new BusinessProcessCallback<String>() { + @Override + public void checkParam(BusinessProcessContext context) { + CommonParamtersChecker.checkNotBlank(form.getGroupName()); + CommonParamtersChecker.checkNotBlank(form.getTenantId()); + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + if (portalUserGroupRepository.findByNameAndTenant(form.getGroupName(), form.getTenantId()).size() > 0) { + throw new CommonBizException("用户组名称已经存在,无法创建"); + } + } + + @Override + public String doBusiness(BusinessProcessContext context) { + String type = (form.getGroupType() == null || "".equals(form.getGroupType())) ? "default" + : form.getGroupType(); + List<String> userGroupTypes = portalSysDictRepository.getUserGroupType(form.getTenantId()); + if (!userGroupTypes.contains(type)) { + PortalSysDict sysDict = new PortalSysDict(); + sysDict.setTypeCode("userGroupType"); + sysDict.setCode(type); + sysDict.setValue(type); + sysDict.setTenantId(form.getTenantId()); + portalSysDictRepository.save(sysDict); + } + PortalUserGroup userGroup = new PortalUserGroup(); + userGroup.setName(form.getGroupName()); + userGroup.setType(type); + userGroup.setIsActive("Y"); + userGroup.setRemark(form.getGroupRemark()); + userGroup.setTenant(form.getTenantId()); + userGroup.setCreateUser("system"); + userGroup.setGmtCreate(new Date()); + userGroup.setGmtModified(new Date()); + PortalUserGroup portalUserGroup = portalUserGroupRepository.save(userGroup); + + if (form.getLoginIds() != null && !form.getLoginIds().isEmpty()) { + List<String> loginIds = Arrays.asList(form.getLoginIds().split(",")); + List<PortalUser> portalUsers = portalUserRepository.findUserByIds(form.getTenantId(), loginIds); + List<PortalGroupUserRel> groupUserRels = new ArrayList<>(); + for (PortalUser user : portalUsers) { + PortalGroupUserRel po = new PortalGroupUserRel(); + po.setGroupId(portalUserGroup.getId()); + po.setTenant(form.getTenantId()); + po.setUserId(user.getId()); + groupUserRels.add(po); + } + portalGroupUserRelRepository.save(groupUserRels); + } + + return portalUserGroup.getId(); + } + + @Override + public void exceptionProcess(CommonBizException exception, BusinessProcessContext context) { + + } + }); + return result; + } + + @Override + public CommonResult<?> updateUserGroupAndUser(final PortalGroupAndUserUpdateForm form) { + CommonResult<String> result = businessProcessTemplate.process(new BusinessProcessCallback<String>() { + @Override + public void checkParam(BusinessProcessContext context) { + CommonParamtersChecker.checkNotBlank(form.getGroupId()); + CommonParamtersChecker.checkNotBlank(form.getGroupName()); + CommonParamtersChecker.checkNotBlank(form.getTenantId()); + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + PortalUserGroup po = portalUserGroupRepository.findOne(form.getGroupId()); + + if (po == null || IsActiveEnum.NO_ACTIVE.getCode().equals(po.getIsActive())) { + throw new CommonBizException("未查询到有效的用户组信息"); + } + + context.put("PortalUserGroup", po); + } + + @Override + public String doBusiness(BusinessProcessContext context) { + String type = (form.getGroupType() == null || "".equals(form.getGroupType())) ? "default" + : form.getGroupType(); + List<String> userGroupTypes = portalSysDictRepository.getUserGroupType(form.getTenantId()); + if (!userGroupTypes.contains(type)) { + PortalSysDict sysDict = new PortalSysDict(); + sysDict.setTypeCode("userGroupType"); + sysDict.setValue(type); + sysDict.setCode(type); + sysDict.setTenantId(form.getTenantId()); + portalSysDictRepository.save(sysDict); + } + PortalUserGroup userGroup = new PortalUserGroup(); + userGroup.setId(form.getGroupId()); + userGroup.setName(form.getGroupName()); + userGroup.setType(type); + userGroup.setIsActive("Y"); + userGroup.setRemark(form.getGroupRemark()); + userGroup.setTenant(form.getTenantId()); + userGroup.setGmtModified(new Date()); + PortalUserGroup portalUserGroup = portalUserGroupRepository.save(userGroup); + + if (form.getLoginIds() == null || form.getLoginIds().isEmpty()) { + deleteGroupUser(form.getGroupId()); + } else { + //此处逻辑为先全部删除,再添加(这样逻辑简单) + deleteGroupUser(form.getGroupId()); + List<String> loginIds = Arrays.asList(form.getLoginIds().split(",")); + List<PortalUser> portalUsers = portalUserRepository.findUserByIds(form.getTenantId(), loginIds); + List<String> ids = ListUtil.filter(portalUsers, "id"); + List<PortalGroupUserRel> groupUserRels = new ArrayList<>(); + for (String id : ids) { + PortalGroupUserRel po = new PortalGroupUserRel(); + po.setGroupId(portalUserGroup.getId()); + po.setTenant(form.getTenantId()); + po.setUserId(id); + groupUserRels.add(po); + } + portalGroupUserRelRepository.save(groupUserRels); + } + return "success"; + } + + @Override + public void exceptionProcess(CommonBizException exception, BusinessProcessContext context) { + + } + }); + return result; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalUserGroupQueryManagerImpl.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalUserGroupQueryManagerImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..7b5a5c573d0cab836be2a1d2d439570f7cd6d238 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalUserGroupQueryManagerImpl.java @@ -0,0 +1,490 @@ +/** + * 杭州云霁科技有限公司 http://www.idcos.com Copyright (c) 2015 All Rights Reserved. + */ + +package com.idcos.enterprise.portal.manager.impl; + +import java.util.*; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.google.common.collect.Lists; +import com.idcos.cloud.biz.common.check.CommonParamtersChecker; +import com.idcos.cloud.biz.common.check.FormChecker; +import com.idcos.cloud.core.common.BaseLinkVO; +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.cloud.core.common.util.ListUtil; +import com.idcos.cloud.core.dal.common.page.PageUtils; +import com.idcos.cloud.core.dal.common.page.Pagination; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessQueryCallback; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessQueryTemplate; +import com.idcos.enterprise.portal.biz.common.utils.*; +import com.idcos.enterprise.portal.convert.*; +import com.idcos.enterprise.portal.dal.entity.*; +import com.idcos.enterprise.portal.dal.enums.*; +import com.idcos.enterprise.portal.dal.repository.*; +import com.idcos.enterprise.portal.form.PortalQueryByPageForm; +import com.idcos.enterprise.portal.form.PortalUserGroupQueryByPageForm; +import com.idcos.enterprise.portal.manager.auto.PortalUserGroupQueryManager; +import com.idcos.enterprise.portal.services.PortalUserGroupService; +import com.idcos.enterprise.portal.vo.PortalUserGroupVO; +import com.idcos.enterprise.portal.vo.PortalUserVO; +import com.idcos.enterprise.portal.biz.common.CommonBizException; +import com.idcos.enterprise.portal.biz.common.utils.CurrentUser; +import static com.idcos.enterprise.portal.UamConstant.ADMIN; + +/** + * Manager实现类 + * <p> + * 第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖 + * </p> + * + * @author yanlv + * @version v 1.1 2015-06-09 09:11:34 yanlv Exp $ + */ +@Service +public class PortalUserGroupQueryManagerImpl implements PortalUserGroupQueryManager { + private static final Logger LOGGER = LoggerFactory.getLogger(PortalUserGroupQueryManagerImpl.class); + + @Autowired + private PortalUserGroupConvert func; + + @Autowired + private PortalUserGroupConvert portalUserGroupConvert; + + @Autowired + private PortalSysDictConvert portalSysDictConvert; + + @Autowired + private PortalUserGroupInfoConvert funcInfo; + + @Autowired + private BusinessQueryTemplate businessQueryTemplate; + + @Autowired + private CrudUtilService crudUtilService; + + @Autowired + private PortalRoleRepository portalRoleRepository; + + @Autowired + private PortalPermissionRepository portalPermissionRepository; + + @Autowired + private PortalGroupRoleRelRepository portalGroupRoleRelRepository; + + @Autowired + private PortalGroupUserRelRepository portalGroupUserRelRepository; + + @Autowired + private PortalRelQueryRepository portalRelQueryRepository; + + @Autowired + private PortalUserRepository portalUserRepository; + + @Autowired + private PortalResourceRepository portalResourceRepository; + + @Autowired + private PortalUserGroupRepository portalUserGroupRepository; + + @Autowired + private CurrentUser currentUser; + + @Autowired + private PortalSysDictRepository portalSysDictRepository; + + @Autowired + private PortalUserGroupService portalUserGroupService; + + @Override + public CommonResult<?> queryByPage(final String offset, final String limit, + final PortalUserGroupQueryByPageForm form, final String cnd) { + if (!ADMIN.equals(currentUser.getUser().getLoginId())) { + throw new CommonBizException("only admin permits"); + } + return businessQueryTemplate.process(new BusinessQueryCallback<Pagination<PortalUserGroupVO>>() { + @Override + public void checkParam() {} + + @Override + public Pagination<PortalUserGroupVO> doQuery() { + // 如果页面没传tenantId则从token里取 + if (StringUtils.isBlank(form.getTenantId())) { + form.setTenantId(currentUser.getUser().getTenantId()); + } + return portalUserGroupService.getPageList(Integer.parseInt(offset), Integer.parseInt(limit), form, cnd); + } + }); + } + + @Override + public CommonResult<?> queryById(final String id) { + return crudUtilService.findOneAndIsActive(id, funcInfo); + } + + @Override + public CommonResult<?> queryRolesById(final String groupId) { + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(groupId); + } + + @Override + public Object doQuery() { + + // 声明变量 + BaseLinkVO vo = new BaseLinkVO(); + + List<PortalRole> roleList = Lists.newArrayList(); + + // 获取角色,获取权限 + for (PortalGroupRoleRel rel : portalGroupRoleRelRepository.findByGroupId(groupId)) { + PortalRole role = portalRoleRepository.findOne(rel.getRoleId()); + if (IsActiveEnum.HAS_ACTIVE.getCode().equals(role.getIsActive())) { + roleList.add(role); + } + } + + vo.putLinkObj("ROLE", PortalFilterUtil.filterRole(roleList)); + + return vo; + } + }); + } + + @Override + public CommonResult<?> queryUsersById(final String groupId) { + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(groupId); + } + + @Override + public Object doQuery() { + BaseLinkVO vo = new BaseLinkVO(); + List<PortalUser> userList = Lists.newArrayList(); + + for (PortalGroupUserRel rel : portalGroupUserRelRepository.findByGroupId(groupId)) { + PortalUser user = portalUserRepository.findOne(rel.getUserId()); + + if (user != null) { + if (IsActiveEnum.HAS_ACTIVE.getCode().equals(user.getIsActive())) { + userList.add(user); + } + } + } + + vo.putLinkObj("USER", PortalFilterUtil.filterUser(userList)); + return vo; + } + }); + } + + @Override + public CommonResult<?> queryUsersByGroupId(final String groupId) { + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(groupId); + } + + @Override + public Object doQuery() { + List<PortalUserVO> userVOS = portalUserGroupService.listUsersByGroupId(groupId); + return userVOS; + } + }); + } + + @Override + public CommonResult<?> queryUserByGroupNameAndTenant(final String groupName, final String tenantId) { + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(groupName); + CommonParamtersChecker.checkNotBlank(tenantId); + } + + @Override + public Object doQuery() { + List<PortalUserVO> userVOS = + portalUserGroupService.listUsersByGroupNameAndTenantId(groupName, tenantId); + return userVOS; + } + }); + } + + @Override + public CommonResult<?> queryPermissionsById(final String groupId) { + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(groupId); + } + + @Override + public Object doQuery() { + + // 声明变量 + BaseLinkVO vo = new BaseLinkVO(); + + List<PortalPermission> perList = Lists.newArrayList(); + + // 获取权限 + for (PortalGroupRoleRel rel : portalGroupRoleRelRepository.findByGroupId(groupId)) { + + perList.addAll(portalPermissionRepository + .queryAuthResByAuthObjTypeAndAuthObjId(AuthObjTypeEnum.ROLE.getCode(), rel.getRoleId())); + } + + Map<?, List<PortalPermission>> perGroups = ListUtil.groupBy(perList, "authResType"); + List<Map<String, Object>> resultList = Lists.newArrayList(); + + for (Object key : perGroups.keySet()) { + Map<String, Object> tmp = new HashMap<>(3); + + PortalResource res = portalResourceRepository.findByCodeAndIsActive((String)key, "Y"); + + if (res == null) { + continue; + } + // 资源类型 + tmp.put("resName", res.getName()); + // 系统名称 + tmp.put("systemName", res.getAppId()); + // 权限数据 + tmp.put("permissions", PortalFilterUtil.filterPermission(perGroups.get(key))); + + resultList.add(tmp); + } + + vo.putLinkObj("PERMISSION", resultList); + + return vo; + } + }); + } + + @Override + public CommonResult<?> queryGroupPageByUserIdAndCnd(final PortalQueryByPageForm form) { + return businessQueryTemplate.process(new BusinessQueryCallback<Pagination<PortalUserGroupVO>>() { + @Override + public void checkParam() { + //FormChecker.check(form); TODO:jar包待下线 + } + + @Override + public Pagination<PortalUserGroupVO> doQuery() { + + List<PortalUserGroup> totalGroupList = PortalFilterUtil.filterGroup( + portalUserGroupRepository.findGroupPageByUserIdAndCnd(form.getId(), "%" + form.getCnd() + "%")); + + List<PortalUserGroup> groupList = + PortalFilterUtil.filterGroup(portalRelQueryRepository.findGroupPageByUserIdAndCnd(form.getId(), + "%" + form.getCnd() + "%", form.getPageNo(), form.getPageSize())); + + List<PortalUserGroupVO> voList = ListUtil.transform(groupList, portalUserGroupConvert); + + return PageUtils.toPagination(voList, form.getPageNo(), form.getPageSize(), totalGroupList.size()); + + } + }); + } + + @Override + public CommonResult<?> queryGroupPageByRoleIdAndCnd(final PortalQueryByPageForm form) { + return businessQueryTemplate.process(new BusinessQueryCallback<Pagination<PortalUserGroupVO>>() { + @Override + public void checkParam() { + //FormChecker.check(form); TODO:jar包待下线 + } + + @Override + public Pagination<PortalUserGroupVO> doQuery() { + + List<PortalUserGroup> totalGroupList = PortalFilterUtil.filterGroup( + portalUserGroupRepository.findGroupPageByRoleIdAndCnd(form.getId(), "%" + form.getCnd() + "%")); + + List<PortalUserGroup> groupList = + PortalFilterUtil.filterGroup(portalRelQueryRepository.findGroupPageByRoleIdAndCnd(form.getId(), + "%" + form.getCnd() + "%", form.getPageNo(), form.getPageSize())); + + List<PortalUserGroupVO> voList = ListUtil.transform(groupList, portalUserGroupConvert); + + return PageUtils.toPagination(voList, form.getPageNo(), form.getPageSize(), totalGroupList.size()); + + } + }); + } + + @Override + public CommonResult<?> getAccountGroupTree(final String tenantId, final String treeStyle) { + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(tenantId); + CommonParamtersChecker.checkNotBlank(treeStyle); + } + + @Override + public Object doQuery() { + List<PortalUserGroup> portalUserGroups = portalUserGroupRepository.findAllUserGroupByTenantId(tenantId); + List<PortalUserGroupVO> userGroupVOList = convert2Dto(portalUserGroups); + if (TreeStyleEnum.Z_TREE.getCode().equals(treeStyle)) { + return userGroupVOList; + } else if (TreeStyleEnum.IO_TREE.getCode().equals(treeStyle)) { + return userGroupVOList; + } else if (TreeStyleEnum.ALL.getCode().equals(treeStyle)) { + return new ArrayList<>(); + } + return null; + } + }); + } + + @Override + public CommonResult<?> getAccountGroupListByPermissionCode(final String code) { + return businessQueryTemplate.process(new BusinessQueryCallback<List<PortalUserGroup>>() { + + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(code); + } + + @Override + public List<PortalUserGroup> doQuery() { + List<String> userGroupIds = portalUserGroupRepository.getUserGroupIdsByPermissionCode(code); + List<PortalUserGroup> portalUserGroups = new ArrayList<>(); + for (Iterator iterator = userGroupIds.iterator(); iterator.hasNext();) { + String userGroupId = (String)iterator.next(); + PortalUserGroup userGroup = + portalUserGroupRepository.findUserGroupByUserGroupIdAndIsActive(userGroupId, "Y"); + if (userGroup == null) { + continue; + } + portalUserGroups.add(userGroup); + } + return portalUserGroups; + } + }); + } + + @Override + public CommonResult<?> getUserGroupType(final String tenantId) { + return businessQueryTemplate.process(new BusinessQueryCallback<List<PortalSysDict>>() { + @Override + public void checkParam() { + + } + + @Override + public List<PortalSysDict> doQuery() { + List<PortalSysDict> userGroupType = portalSysDictRepository.getUserGroupTypeAndValue(tenantId); + return userGroupType; + } + }); + } + + @Override + public CommonResult<?> queryGroupByType(final String type) { + return businessQueryTemplate.process(new BusinessQueryCallback<List<PortalUserGroupVO>>() { + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(type); + } + + @Override + public List<PortalUserGroupVO> doQuery() { + List<PortalUserGroup> userGroup = portalUserGroupRepository.findUserGroupByType(type); + return convert2Dto(userGroup); + } + }); + } + + @Override + public CommonResult<?> queryGroupByTypeAndTenantId(final String type, final String tenantId) { + return businessQueryTemplate.process(new BusinessQueryCallback<List<PortalUserGroupVO>>() { + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(type); + } + + @Override + public List<PortalUserGroupVO> doQuery() { + List<PortalUserGroup> userGroup = + portalUserGroupRepository.findUserGroupByTypeAndTenantId(type, tenantId); + return convert2Dto(userGroup); + } + }); + } + + @Override + public CommonResult<?> queryGroupByTypeAndUserId(final String type, final String userId) { + return businessQueryTemplate.process(new BusinessQueryCallback<List<PortalUserGroupVO>>() { + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(type); + CommonParamtersChecker.checkNotBlank(userId); + } + + @Override + public List<PortalUserGroupVO> doQuery() { + List<PortalUserGroupVO> userGroup = portalUserGroupService.queryGroupByTypeAndUserId(type, userId); + return userGroup; + } + }); + } + + @Override + public CommonResult<?> queryGroupByLoginIdAndTenantId(final String loginId, final String tenantId) { + return businessQueryTemplate.process(new BusinessQueryCallback<List<PortalUserGroupVO>>() { + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(loginId); + CommonParamtersChecker.checkNotBlank(tenantId); + } + + @Override + public List<PortalUserGroupVO> doQuery() { + PortalUser portalUser = portalUserRepository.findPortalUserById(tenantId, loginId); + List<PortalUserGroupVO> userGroup = portalUserGroupService.listUserGroupByUserId(portalUser.getId()); + return userGroup; + } + }); + } + + /** + * 转化为PortalUserGroupVO + * + * @param portalUserGroups + * @return + */ + private List<PortalUserGroupVO> convert2Dto(List<PortalUserGroup> portalUserGroups) { + List<PortalUserGroupVO> dtos = new ArrayList<>(); + for (PortalUserGroup userGroup : portalUserGroups) { + PortalUserGroupVO userGroupVO = new PortalUserGroupVO(); + userGroupVO.setId(userGroup.getId()); + userGroupVO.setName(userGroup.getName()); + userGroupVO.setIsActive(userGroup.getIsActive()); + userGroupVO.setTenantId(userGroup.getTenant()); + userGroupVO.setRemark(userGroup.getRemark()); + userGroupVO.setType(userGroup.getType()); + dtos.add(userGroupVO); + } + return dtos; + } + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalUserOperateManagerImpl.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalUserOperateManagerImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..c9089081c8e5a4aee40306b441f77e47bafda7cd --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalUserOperateManagerImpl.java @@ -0,0 +1,510 @@ + + +package com.idcos.enterprise.portal.manager.impl; + +// auto generated imports + +import com.idcos.cloud.biz.common.check.CommonParamtersChecker; +import com.idcos.cloud.biz.common.check.FormChecker; +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.cloud.core.common.util.ListUtil; +import com.idcos.cloud.core.common.util.StringUtil; +import com.idcos.enterprise.portal.biz.common.CommonBizException; +import com.idcos.enterprise.portal.biz.common.ResultCode; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessProcessCallback; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessProcessContext; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessProcessTemplate; +import com.idcos.enterprise.portal.biz.common.utils.Base64Util; +import com.idcos.enterprise.portal.biz.common.utils.CrudUtilService; +import com.idcos.enterprise.portal.biz.common.utils.CurrentUser; +import com.idcos.enterprise.portal.biz.common.utils.PasswordUtil; +import com.idcos.enterprise.portal.convert.PortalTokenConvert; +import com.idcos.enterprise.portal.dal.entity.*; +import com.idcos.enterprise.portal.dal.enums.PortalUserStatusEnum; +import com.idcos.enterprise.portal.dal.enums.IsActiveEnum; +import com.idcos.enterprise.portal.dal.repository.*; +import com.idcos.enterprise.portal.form.ModifyPasswordForm; +import com.idcos.enterprise.portal.form.PortalUserAddForm; +import com.idcos.enterprise.portal.form.PortalUserAllocateGroupForm; +import com.idcos.enterprise.portal.form.PortalUserUpdateForm; +import com.idcos.enterprise.portal.manager.auto.PortalUserOperateManager; +import com.idcos.enterprise.portal.services.PortalUserService; +import com.idcos.enterprise.portal.vo.PortalTokenVO; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.formula.functions.T; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.thymeleaf.util.ListUtils; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.Date; +import java.util.List; + +/** + * Manager实现类 + * <p>第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖</p> + * + * @author yanlv + * @version v 1.1 2015-06-09 09:26:24 yanlv Exp $ + */ +@Service +public class PortalUserOperateManagerImpl implements PortalUserOperateManager { + private static final Logger LOGGER = LoggerFactory.getLogger(PortalUserOperateManagerImpl.class); + + @Autowired + private PortalGroupUserRelRepository portalGroupUserRelRepository; + + @Autowired + private PortalRoleRepository portalRoleRepository; + + @Autowired + private PortalUserRepository portalUserRepository; + + @Autowired + private BusinessProcessTemplate businessProcessTemplate; + + @Autowired + private CurrentUser currentUser; + + @Autowired + private PortalDeptRepository portalDeptRepository; + + @Autowired + private PortalTokenRepository portalTokenRepository; + + @Autowired + private PortalUserService portalUserService; + + @Autowired + private PortalTokenConvert portalTenantConvert; + + @Override + public CommonResult<?> add(final PortalUserAddForm form) { + final PortalUser user = new PortalUser(); + return businessProcessTemplate.process(new BusinessProcessCallback<Object>() { + @Override + public void checkParam(BusinessProcessContext context) { + //检查密码规则是否合法 + PasswordUtil.checkPassword(form.getPassword()); + + if (!form.getPassword().equals(form.getConfirmPassword())) { + throw new RuntimeException("两次输入密码不一致,添加失败!"); + } + + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + //如果所属部门不空,则检查所属部门。 + if (StringUtils.isNotBlank(form.getDeptId())) { + PortalDept dept = portalDeptRepository.findByDeptId(form.getDeptId()); + if (dept == null) { + throw new RuntimeException(String.format("用户所属部门(id: %s)没有找到。", form.getDeptId())); + } + } + //检测用户登录名是否已存在 + PortalUser tempUser = portalUserRepository.findPortalUserById(form.getTenantId(), form.getLoginId()); + if (tempUser != null) { + throw new RuntimeException(String.format("用户登录名(%s)已经存在。", form.getLoginId())); + } + } + + @Override + public Object doBusiness(BusinessProcessContext context) { + BeanUtils.copyProperties(form, user); + user.setIsActive(IsActiveEnum.HAS_ACTIVE.getCode()); + user.setCreateUser(currentUser.getUser().getUserId()); + user.setCreateTime(new Date()); + user.setLastModifiedTime(new Date()); + user.setStatus(PortalUserStatusEnum.ENABLED.getCode()); + portalUserRepository.save(user); + PortalUser portalUser = portalUserRepository.findPortalUserById(form.getTenantId(), form.getLoginId()); + + //密码密码后保存到数据库. + //由于加密需要用户的ID,所以需要保存用户后再更新密码。 + //加密密码 + try { + //salt随机产生,生成密码时使用的密码是用户的ID. + byte[] salt = PasswordUtil.getSalt(); + String encriptPW = PasswordUtil.encrypt(user.getPassword(), portalUser.getId(), salt); + + String saltStr = Base64Util.encode(salt); + user.setPassword(encriptPW); + user.setSalt(saltStr); + portalUserRepository.save(user); + } catch (Exception e) { + throw new RuntimeException("系统错误,请联系管理员。"); + } + return portalUser.getId(); + } + + @Override + public void exceptionProcess(CommonBizException exception, BusinessProcessContext context) { + + } + }); + } + + @Override + public CommonResult<?> update(final PortalUserUpdateForm form) { + final PortalUser oldPortalUser = portalUserRepository.findById(form.getId()); + return businessProcessTemplate.process(new BusinessProcessCallback<Object>() { + @Override + public void checkParam(BusinessProcessContext context) { + //如果所属部门不空,则检查所属部门。 + if (StringUtils.isNotBlank(form.getDeptId())) { + PortalDept dept = portalDeptRepository.findByDeptId(form.getDeptId()); + if (dept == null) { + throw new RuntimeException(String.format("用户所属部门(id: %s)没有找到。", form.getDeptId())); + } + } + if (oldPortalUser == null) { + throw new RuntimeException("该用户不存在"); + } + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + + } + + @Override + public Object doBusiness(BusinessProcessContext context) { + PortalUser portalUser = new PortalUser(); + BeanUtils.copyProperties(form, portalUser); + portalUser.setId(oldPortalUser.getId()); + portalUser.setIsActive(oldPortalUser.getIsActive()); + portalUser.setStatus(oldPortalUser.getStatus()); + portalUser.setPassword(oldPortalUser.getPassword()); + portalUser.setSalt(oldPortalUser.getSalt()); + portalUser.setLastModifiedTime(new Date()); + portalUserRepository.save(portalUser); + return portalUser; + } + + @Override + public void exceptionProcess(CommonBizException exception, BusinessProcessContext context) { + + } + }); + } + + @Override + public CommonResult<?> enabled(final String id) { + return businessProcessTemplate.process(new BusinessProcessCallback<Object>() { + @Override + public void checkParam(BusinessProcessContext context) { + PortalUser portalUser = portalUserRepository.findOne(id); + if (portalUser == null) { + throw new RuntimeException("激活失败,此用户不存在!"); + } + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + + } + + @Override + public Object doBusiness(BusinessProcessContext context) { + PortalUser portalUser = portalUserRepository.findOne(id); + portalUser.setStatus(PortalUserStatusEnum.ENABLED.getCode()); + portalUserRepository.save(portalUser); + return null; + } + + @Override + public void exceptionProcess(CommonBizException exception, BusinessProcessContext context) { + + } + }); + } + + @Override + public CommonResult<?> disabled(final String id) { + return businessProcessTemplate.process(new BusinessProcessCallback<Object>() { + @Override + public void checkParam(BusinessProcessContext context) { + PortalUser portalUser = portalUserRepository.findOne(id); + if (portalUser == null) { + throw new RuntimeException("禁用失败,此用户不存在!"); + } + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + + } + + @Override + public Object doBusiness(BusinessProcessContext context) { + PortalUser portalUser = portalUserRepository.findOne(id); + portalUser.setStatus(PortalUserStatusEnum.DISABLED.getCode()); + portalUserRepository.save(portalUser); + return null; + } + + @Override + public void exceptionProcess(CommonBizException exception, BusinessProcessContext context) { + + } + }); + } + + @Override + public CommonResult<?> delete(final String id) { + return businessProcessTemplate.process(new BusinessProcessCallback<Object>() { + @Override + public void checkParam(BusinessProcessContext context) { + PortalUser portalUser = portalUserRepository.findOne(id); + if (portalUser == null) { + throw new RuntimeException("删除失败,此用户不存在!"); + } + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + + } + + @Override + public Object doBusiness(BusinessProcessContext context) { + portalUserService.updateIsActionById(IsActiveEnum.NO_ACTIVE.getCode(), id); + /** + * 删除用户与工作组的关系 + */ + portalGroupUserRelRepository.deleteByUserId(id); + return null; + } + + @Override + public void exceptionProcess(CommonBizException exception, BusinessProcessContext context) { + + } + }); + } + + @Override + public CommonResult<?> allocateGroup(final PortalUserAllocateGroupForm form) { + CommonResult<T> result = businessProcessTemplate.process(new BusinessProcessCallback<T>() { + + @Override + public void checkParam(BusinessProcessContext context) { + //FormChecker.check(form); TODO:jar包待下线 + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + + } + + @Override + public T doBusiness(BusinessProcessContext context) { + String selGroups = form.getSelGroups(); + + // 保存用户组与用户的关联关系 + if (StringUtils.isNoneBlank(selGroups)) { + String[] groupIdList = StringUtils.split(selGroups, ","); + for (String str : groupIdList) { + //根据 : 来截取id和操作类型 + String groupId = str.split(":")[0]; + String operType = str.split(":")[1]; + + //D代表删除 + if ("D".equals(operType)) { + portalGroupUserRelRepository.deleteByGroupIdAndUserId(groupId, form.getId()); + } + + //I代表新增 + if ("I".equals(operType)) { + PortalGroupUserRel relPo = new PortalGroupUserRel(); + relPo.setUserId(form.getId()); + relPo.setGroupId(groupId); + if (StringUtils.isNotBlank(form.getTenantId()) && !"null".equals(form.getTenantId())) { + relPo.setTenant(form.getTenantId()); + } else { + relPo.setTenant(currentUser.getUser().getTenantId()); + } + portalGroupUserRelRepository.save(relPo); + } + } + } + return null; + } + + @Override + public void exceptionProcess(CommonBizException exception, BusinessProcessContext context) { + } + }); + return result; + } + + + @Override + public CommonResult<?> forbiddenToken(final String tokenId) { + return businessProcessTemplate.process(new BusinessProcessCallback<Object>() { + @Override + public void checkParam(BusinessProcessContext context) { + CommonParamtersChecker.checkNotBlank(tokenId); + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + } + + @Override + public Object doBusiness(BusinessProcessContext context) { + PortalToken portalToken = portalTokenRepository.queryTokenByTokenId(tokenId); + if (portalToken == null) { + throw new CommonBizException(ResultCode.STATUS_ERROR, "token不存在!!!"); + } + portalToken.setIsActive("N"); + portalTokenRepository.save(portalToken); + return "success"; + } + + @Override + public void exceptionProcess(CommonBizException exception, BusinessProcessContext context) { + + } + }); + } + + @Override + public CommonResult<?> listTokenByTenantIdAndLoginId(final String tenantId, final String loginId) { + return businessProcessTemplate.process(new BusinessProcessCallback<List<PortalTokenVO>>() { + @Override + public void checkParam(BusinessProcessContext context) { + CommonParamtersChecker.checkNotBlank(tenantId); + CommonParamtersChecker.checkNotBlank(loginId); + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + } + + @Override + public List<PortalTokenVO> doBusiness(BusinessProcessContext context) { + List<PortalToken> portalTokens = portalTokenRepository.listTokenByTenantIdAndLoginId(tenantId, loginId); + return ListUtil.transform(portalTokens, portalTenantConvert); + } + + @Override + public void exceptionProcess(CommonBizException exception, BusinessProcessContext context) { + + } + }); + } + + @Override + public CommonResult<?> modifyPassword(final ModifyPasswordForm form) { + return businessProcessTemplate.process(new BusinessProcessCallback<Object>() { + @Override + public void checkParam(BusinessProcessContext context) { + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + } + + @Override + public Object doBusiness(BusinessProcessContext context) { + PortalUser portalUser = portalUserRepository.findById(form.getUserId()); + if (portalUser == null) { + throw new CommonBizException("该用户不存在"); + } + //检查新密码规则是否合法 + PasswordUtil.checkPassword(form.getNewPassword()); + //检查老的密码是否与传过来的密码一样。 + if (!StringUtil.isEmpty(portalUser.getPassword())) { + //解密用户密码。 + try { + String cipherText = portalUser.getPassword(); + byte[] salt = Base64Util.decode(portalUser.getSalt()); + //解密时的解密用的密码是生成时的密码,也就是用户的ID。 + String plainText = PasswordUtil.decrypt(cipherText, form.getUserId(), salt); + if (!plainText.equals(form.getOldPassword())) { + throw new CommonBizException( + String.format("用户:%s输入的旧密码与系统中存在的密码不相同,不能修改。", portalUser.getLoginId())); + } + + } catch (UnsupportedEncodingException e) { + LOGGER.error(String.format("解密用户:%s密码的登录密码时出错。", portalUser.getLoginId()), e); + throw new CommonBizException(String.format("解密用户:%s密码的登录密码时出错。", portalUser.getLoginId())); + } catch (IOException e) { + throw new CommonBizException("系统错误,请联系管理员。"); + } + } + //加密密码 + try { + //salt随机产生,密码是用户的ID. + byte[] salt = PasswordUtil.getSalt(); + String encriptPW = PasswordUtil.encrypt(form.getNewPassword(), form.getUserId(), salt); + //修改 + portalUser.setPassword(encriptPW); + portalUser.setSalt(Base64Util.encode(salt)); + portalUserRepository.save(portalUser); + } catch (Exception e) { + throw new CommonBizException("系统错误,请联系管理员。"); + } + return "新密码为" + form.getNewPassword(); + } + + @Override + public void exceptionProcess(CommonBizException exception, BusinessProcessContext context) { + + } + }); + } + + @Override + public CommonResult<?> resetPassword(final String userId) { + return businessProcessTemplate.process(new BusinessProcessCallback<Object>() { + @Override + public void checkParam(BusinessProcessContext context) { + CommonParamtersChecker.checkNotBlank(userId); + } + + @Override + public void checkBusinessInfo(BusinessProcessContext context) { + + } + + @Override + public Object doBusiness(BusinessProcessContext context) { + PortalUser portalUser = portalUserRepository.findById(userId); + if (portalUser == null) { + throw new CommonBizException("该用户不存在"); + } + //随机生成一个8位的密码用于用户登录。 + String newPassword = PasswordUtil.getStringRandom(8); + //加密 + String encriptPW; + try { + encriptPW = PasswordUtil.encrypt(newPassword, userId, Base64Util.decode(portalUser.getSalt())); + } catch (UnsupportedEncodingException e) { + LOGGER.error(String.format("加密用户:(%s,%s)的登录密码时出错。", portalUser.getLoginId(), portalUser.getName()), + e); + throw new CommonBizException( + String.format("加密用户:(%s,%s)的登录密码时出错。", portalUser.getLoginId(), portalUser.getName())); + } catch (IOException e) { + throw new CommonBizException("系统错误,请联系管理员。"); + } + portalUser.setPassword(encriptPW); + portalUser.setLastModifiedTime(new Date()); + portalUserRepository.save(portalUser); + return newPassword; + } + + @Override + public void exceptionProcess(CommonBizException exception, BusinessProcessContext context) { + + } + }); + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalUserQueryManagerImpl.java b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalUserQueryManagerImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..50647ac28b299c396423bcb2854607e134f94fe4 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/manager/impl/PortalUserQueryManagerImpl.java @@ -0,0 +1,704 @@ +/** + * 杭州云霁科技有限公司 http://www.idcos.com Copyright (c) 2015 All Rights Reserved. + */ + +package com.idcos.enterprise.portal.manager.impl; + +import java.util.*; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.google.common.collect.Lists; +import com.idcos.cloud.biz.common.check.CommonParamtersChecker; +import com.idcos.cloud.biz.common.check.FormChecker; +import com.idcos.cloud.core.common.BaseLinkVO; +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.cloud.core.common.util.ListUtil; +import com.idcos.cloud.core.common.util.StringUtil; +import com.idcos.cloud.core.dal.common.page.PageUtils; +import com.idcos.cloud.core.dal.common.page.Pagination; +import com.idcos.enterprise.portal.biz.common.*; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessQueryCallback; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessQueryTemplate; +import com.idcos.enterprise.portal.biz.common.utils.*; +import com.idcos.enterprise.portal.convert.PortalSysDictConvert; +import com.idcos.enterprise.portal.dal.entity.*; +import com.idcos.enterprise.portal.dal.enums.*; +import com.idcos.enterprise.portal.dal.repository.*; +import com.idcos.enterprise.portal.form.PortalQueryByPageForm; +import com.idcos.enterprise.portal.form.PortalUserQueryPageListForm; +import com.idcos.enterprise.portal.manager.auto.PortalUserQueryManager; +import com.idcos.enterprise.portal.manager.common.CommonManager; +import com.idcos.enterprise.portal.services.PortalUserService; +import com.idcos.enterprise.portal.vo.*; +import com.idcos.enterprise.portal.web.GlobalValue; +import com.idcos.enterprise.portal.biz.common.CommonBizException; +import com.idcos.enterprise.portal.biz.common.utils.CurrentUser; +import static com.idcos.enterprise.portal.UamConstant.ADMIN; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; + +/** + * Manager实现类 + * <p> + * 第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖 + * </p> + * + * @author yanlv + * @version v 1.1 2015-06-09 09:26:24 yanlv Exp $ + */ +@Service +public class PortalUserQueryManagerImpl implements PortalUserQueryManager { + private static final Logger LOGGER = LoggerFactory.getLogger(PortalUserQueryManagerImpl.class); + + @Autowired + private PortalGroupUserRelRepository portalGroupUserRelRepository; + + @Autowired + private BusinessQueryTemplate businessQueryTemplate; + + @Autowired + private PortalUserGroupRepository portalUserGroupRepository; + + @Autowired + private PortalRoleRepository portalRoleRepository; + + @Autowired + private PortalUserRepository portalUserRepository; + + @Autowired + private PortalRelQueryRepository portalRelQueryRepository; + + @Autowired + private PortalGroupRoleRelRepository portalGroupRoleRelRepository; + + @Autowired + private PortalResourceRepository portalResourceRepository; + + @Autowired + private PortalUserService portalUserService; + + @Autowired + private PortalDeptRepository portalDeptRepository; + + @Autowired + private PortalTokenRepository portalTokenRepository; + + @Autowired + private PortalSysDictRepository portalSysDictRepository; + + @Autowired + private PortalSysDictConvert portalSysDictConvert; + + @Autowired + private GlobalValue globalValue; + + @Autowired + private CommonManager commonManager; + + @Autowired + private CurrentUser currentUser; + + @Override + public CommonResult<?> queryPageList(final PortalUserQueryPageListForm form) { + if (!ADMIN.equals(currentUser.getUser().getLoginId())) { + throw new CommonBizException("only admin permits"); + } + return businessQueryTemplate.process(new BusinessQueryCallback<Pagination<PortalUserVO>>() { + @Override + public void checkParam() { + if (form.getPageNo() <= 0) { + form.setPageNo(1); + } + if (form.getPageSize() <= 0) { + form.setPageSize(10); + } + } + + @Override + public Pagination<PortalUserVO> doQuery() { + return portalUserService.getPageList(form.getTenantId(), form.getDeptId(), form.getName(), + form.getPageNo(), form.getPageSize()); + } + }); + } + + @Override + public CommonResult<?> queryById(final String userId) { + return businessQueryTemplate.process(new BusinessQueryCallback<PortalUserVO>() { + + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(userId); + } + + @Override + public PortalUserVO doQuery() { + PortalUser portalUser = portalUserRepository.findOne(userId); + PortalUserVO userVo = convertUserToUserVO(portalUser); + + { + List<PortalGroupUserRel> list = portalGroupUserRelRepository.findByUserId(userId); + String[] selGroups = new String[list.size()]; + + for (int i = 0; i < list.size(); i++) { + selGroups[i] = list.get(i).getGroupId(); + } + userVo.setSelGroups(selGroups); + } + + return userVo; + } + }); + } + + @Override + public CommonResult<?> queryGroupsById(final String id) { + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(id); + } + + @Override + public Object doQuery() { + BaseLinkVO vo = new BaseLinkVO(); + List<PortalUserGroup> groupList = Lists.newArrayList(); + + for (PortalGroupUserRel rel : portalGroupUserRelRepository.findByUserId(id)) { + PortalUserGroup group = portalUserGroupRepository.findOne(rel.getGroupId()); + if (group != null) { + if (IsActiveEnum.HAS_ACTIVE.getCode().equals(group.getIsActive())) { + groupList.add(group); + } + } + } + + vo.putLinkObj("GROUP", groupList); + + return vo; + } + }); + } + + @Override + public CommonResult<?> queryRolesById(final String id) { + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(id); + } + + @Override + public Object doQuery() { + BaseLinkVO vo = new BaseLinkVO(); + List<PortalRole> roleList = Lists.newArrayList(); + + for (PortalGroupUserRel userRel : portalGroupUserRelRepository.findByUserId(id)) { + + for (PortalGroupRoleRel roleRel : portalGroupRoleRelRepository + .findByGroupId(userRel.getGroupId())) { + PortalRole role = portalRoleRepository.findOne(roleRel.getRoleId()); + + if (IsActiveEnum.HAS_ACTIVE.getCode().equals(role.getIsActive())) { + roleList.add(role); + } + } + } + vo.putLinkObj("ROLE", PortalFilterUtil.filterRole(roleList)); + + return vo; + } + }); + } + + @Override + public CommonResult<?> queryPermissionsById(final String id, final String appId) { + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(id); + } + + @Override + public Object doQuery() { + BaseLinkVO vo = new BaseLinkVO(); + List<PortalPermission> perList = Lists.newArrayList(); + + List<String> roleIds = commonManager.getRoleIdsById(id); + perList = + portalUserService.getPermissonByAuthObjTypeAndAuthObjId(AuthObjTypeEnum.ROLE.getCode(), roleIds); + + // 根据appId进行过滤,得到某个系统的权限 + List<PortalPermission> portalPermissions = Lists.newArrayList(); + if (StringUtil.isNotBlank(appId)) { + String app = appId.toUpperCase(); + for (PortalPermission portalPermission : perList) { + if (portalPermission.getAuthResType().contains(app)) { + portalPermissions.add(portalPermission); + } + } + } + + Map<?, List<PortalPermission>> perGroups; + if (portalPermissions.isEmpty() || portalPermissions == null) { + perGroups = ListUtil.groupBy(perList, "authResType"); + } else { + perGroups = ListUtil.groupBy(portalPermissions, "authResType"); + } + + List<Map<String, Object>> resultList = Lists.newArrayList(); + + for (Object key : perGroups.keySet()) { + Map<String, Object> tmp = new HashMap<>(3); + + PortalResource res = portalResourceRepository.findByCodeAndIsActive((String)key, "Y"); + + if (res == null) { + continue; + } + // 资源类型 + tmp.put("resName", res.getName()); + // 系统名称 + tmp.put("systemName", res.getAppId()); + // 权限数据 + tmp.put("permissions", PortalFilterUtil.filterPermission(perGroups.get(key))); + + resultList.add(tmp); + } + + vo.putLinkObj("PERMISSION", resultList); + + return vo; + } + }); + } + + @Override + public CommonResult<?> queryPermissionsByUserIdAndAppId(final String userId, final String appId) { + return businessQueryTemplate.process(new BusinessQueryCallback<Object>() { + + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(userId); + CommonParamtersChecker.checkNotBlank(appId); + } + + @Override + public Object doQuery() { + List<String> roleIds = commonManager.getRoleIdsById(userId); + List<PortalPermission> perminssionList = + portalUserService.queryPermissionsByRoleIdsAndAppId(roleIds, appId); + + Map<?, List<PortalPermission>> perGroups = new HashMap<>(2); + if (perminssionList != null && perminssionList.size() != 0) { + perGroups = ListUtil.groupBy(perminssionList, "authResType"); + } + + List<Map<String, Object>> resultList = Lists.newArrayList(); + for (Object key : perGroups.keySet()) { + Map<String, Object> tmp = new HashMap<>(2); + PortalResource res = portalResourceRepository.findByCodeAndIsActive((String)key, "Y"); + if (res == null) { + continue; + } + // 权限数据 + tmp.put("permissions", PortalFilterUtil.filterPermission(perGroups.get(key))); + resultList.add(tmp); + } + + return resultList; + } + }); + } + + @Override + public CommonResult<?> queryUserPageByGroupIdAndCnd(final PortalQueryByPageForm form) { + return businessQueryTemplate.process(new BusinessQueryCallback<Pagination<PortalUserVO>>() { + @Override + public void checkParam() { + //FormChecker.check(form); TODO:jar包待下线 + } + + @Override + public Pagination<PortalUserVO> doQuery() { + + List<PortalUser> totalUserList = PortalFilterUtil.filterUser( + portalUserRepository.findUserPageByGroupIdAndCnd(form.getId(), "%" + form.getCnd() + "%")); + + List<PortalUser> userList = + PortalFilterUtil.filterUser(portalRelQueryRepository.findUserPageByGroupIdAndCnd(form.getId(), + "%" + form.getCnd() + "%", form.getPageNo(), form.getPageSize())); + + List<PortalUserVO> voList = new ArrayList<>(); + Iterator<PortalUser> portalUserIterator = userList.iterator(); + while (portalUserIterator.hasNext()) { + PortalUser portalUser = portalUserIterator.next(); + PortalUserVO userVo = convertUserToUserVO(portalUser); + voList.add(userVo); + } + return PageUtils.toPagination(voList, form.getPageNo(), form.getPageSize(), totalUserList.size()); + + } + }); + } + + @Override + public CommonResult<?> queryUserPageByRoleIdAndCnd(final PortalQueryByPageForm form) { + return businessQueryTemplate.process(new BusinessQueryCallback<Pagination<PortalUserVO>>() { + @Override + public void checkParam() { + //FormChecker.check(form); TODO:jar包待下线 + } + + @Override + public Pagination<PortalUserVO> doQuery() { + return portalUserService.listUserByRoleForm(form); + } + }); + + } + + @Override + public CommonResult<?> getAccountCount(final String tenantId) { + return businessQueryTemplate.process(new BusinessQueryCallback<Long>() { + + @Override + public void checkParam() {} + + @Override + public Long doQuery() { + Long accountCount; + if (StringUtil.isNotBlank(tenantId)) { + accountCount = portalUserRepository.getAccountCount(tenantId); + } else { + accountCount = portalUserRepository.getAccountCount(); + } + return accountCount; + } + }); + } + + @Override + public CommonResult<?> getAllAcount() { + return businessQueryTemplate.process(new BusinessQueryCallback<List<PortalUserVO>>() { + + @Override + public void checkParam() {} + + @Override + public List<PortalUserVO> doQuery() { + return portalUserService.listUserVO(); + } + }); + } + + @Override + public CommonResult<?> getAllAcount(final String tenantId) { + if (!ADMIN.equals(currentUser.getUser().getLoginId())) { + throw new CommonBizException("only admin permits"); + } + return businessQueryTemplate.process(new BusinessQueryCallback<List<PortalUserVO>>() { + + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(tenantId); + } + + @Override + public List<PortalUserVO> doQuery() { + return portalUserService.listUserVOByTenantId(tenantId); + } + }); + } + + @Override + public CommonResult<?> getAcountByDeptId(final String tenantId, final String deptId, final String recurse) { + return businessQueryTemplate.process(new BusinessQueryCallback<List<PortalUserVO>>() { + + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(tenantId); + CommonParamtersChecker.checkNotBlank(deptId); + } + + @Override + public List<PortalUserVO> doQuery() { + String[] deptIds = deptId.split(","); + List<PortalUserVO> userVOs = new ArrayList<>(); + List<String> idList = new ArrayList<>(); + + if (TrueFalse.TRUE.getCode().equals(recurse)) { + // 获取所有的子部门和主部门的id集合 + for (String deptId : deptIds) { + idList.add(deptId); + for (PortalDept dept : getChildrenList(deptId)) { + idList.add(dept.getId()); + } + } + } else { + for (String deptId : deptIds) { + idList.add(deptId); + } + } + + List<PortalUser> portalUsers = portalUserRepository.findPortalUserByDeptIdIn(tenantId, idList); + + for (PortalUser portalUser : portalUsers) { + PortalUserVO userVO = convertUserToUserVO(portalUser); + userVOs.add(userVO); + } + + return userVOs; + } + }); + } + + /** + * 获取本部门下及子部门id的集合 + */ + private List<PortalDept> getChildrenList(String deptId) { + List<PortalDept> allChildrenList = new LinkedList<>(); + // 先得到直接的下级部门 + List<PortalDept> depts = portalDeptRepository.findByParentId(deptId); + for (PortalDept dept : depts) { + allChildrenList.add(dept); + // 递归查询,子部门下的子部门 + List<PortalDept> tmp = getChildrenList(dept.getId().toString()); + for (PortalDept ciClass1 : tmp) { + allChildrenList.add(ciClass1); + } + } + return allChildrenList; + + } + + @Override + public CommonResult<?> getByAccountNo(final String tenantId, final String accountNo) { + return businessQueryTemplate.process(new BusinessQueryCallback<PortalUserVO>() { + + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(tenantId); + CommonParamtersChecker.checkNotBlank(accountNo); + } + + @Override + public PortalUserVO doQuery() { + PortalUser portalUser = portalUserRepository.findPortalUserById(tenantId, accountNo); + PortalUserVO userVO = convertUserToUserVO(portalUser); + return userVO; + } + }); + } + + @Override + public CommonResult<?> getUserById(final String id) { + return businessQueryTemplate.process(new BusinessQueryCallback<PortalUserVO>() { + + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(id); + } + + @Override + public PortalUserVO doQuery() { + PortalUser portalUser = portalUserRepository.findOne(id); + PortalUserVO userVO = convertUserToUserVO(portalUser); + return userVO; + } + }); + } + + @Override + public CommonResult<?> getByAccountNos(final String tenantId, final List<String> accountNoList) { + return businessQueryTemplate.process(new BusinessQueryCallback<List<PortalUserVO>>() { + + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(tenantId); + } + + @Override + public List<PortalUserVO> doQuery() { + List<PortalUser> portalUsers = portalUserRepository.findUserByIds(tenantId, accountNoList); + List<PortalUserVO> userVOs = new ArrayList<>(); + for (PortalUser portalUser : portalUsers) { + PortalUserVO userVO = convertUserToUserVO(portalUser); + userVOs.add(userVO); + } + return userVOs; + } + }); + } + + @Override + public CommonResult<?> getLastLoginTime() { + return businessQueryTemplate.process(new BusinessQueryCallback<Long>() { + + @Override + public void checkParam() {} + + @Override + public Long doQuery() { + Date lastLoginTime = portalUserRepository.getLastLoginTime(); + return lastLoginTime.getTime(); + } + }); + + } + + private PortalUserVO convertUserToUserVO(PortalUser portalUser) { + PortalUserVO userVO = new PortalUserVO(); + userVO.setId(portalUser.getId()); + userVO.setName(portalUser.getName()); + userVO.setLoginId(portalUser.getLoginId()); + userVO.setDeptId(portalUser.getDeptId()); + userVO.setTenantId(portalUser.getTenantId()); + userVO.setMobile1(portalUser.getMobile1()); + userVO.setMobile2(portalUser.getMobile2()); + userVO.setEmployeeType(portalUser.getEmployeeType()); + userVO.setOfficeTel1(portalUser.getOfficeTel1()); + userVO.setOfficeTel2(portalUser.getOfficeTel2()); + userVO.setStatus(portalUser.getStatus()); + userVO.setWeixin(portalUser.getWeixin()); + userVO.setEmail(portalUser.getEmail()); + userVO.setRemark(portalUser.getRemark()); + userVO.setTitle(portalUser.getTitle()); + userVO.setRtx(portalUser.getRtx()); + PortalDept portalDept = portalDeptRepository.findByDeptId(portalUser.getDeptId()); + if (portalDept != null) { + userVO.setDeptName(portalDept.getDisplayName()); + } + return userVO; + } + + @Override + public CommonResult<?> authInfo(final String id, final String appId, final String token) { + return businessQueryTemplate.process(new BusinessQueryCallback<AuthInfoVO>() { + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(appId); + CommonParamtersChecker.checkNotBlank(token); + } + + @Override + public AuthInfoVO doQuery() { + String userId = id; + if (StringUtils.isBlank(userId)) { + Claims claims = + Jwts.parser().setSigningKey(globalValue.getSecretKey()).parseClaimsJws(token).getBody(); + + userId = (String)claims.get("userId"); + } + checkToken(userId, token); + + return getAuthInfoByUserIdAndAppId(userId, appId); + } + }); + } + + private void checkToken(String userId, String token) { + PortalUser portalUser = portalUserRepository.findById(userId); + if (portalUser == null) { + throw new AuthInfoException(ResultCode.STATUS_ERROR, "userId为" + userId + "的用户不存在"); + } + + PortalToken portalToken = portalTokenRepository.queryTokenByNameAndTokenCrc(token, CrcUtil.crc(token)); + if (portalToken == null) { + throw new AuthInfoException(ResultCode.STATUS_ERROR, + "用户TenantId:" + portalUser.getTenantId() + ",LoginId:" + portalUser.getLoginId() + "不存在值相同的token。"); + } + if (!IsActiveEnum.HAS_ACTIVE.getCode().equals(portalToken.getIsActive())) { + throw new AuthInfoException(ResultCode.AUTH_FAIL, "token被禁用!!!"); + } + } + + @Override + public CommonResult<?> getAuthInfoByLoginIdAndPw(final String loginId, final String password, final String tenantId, + final String appId) { + return businessQueryTemplate.process(new BusinessQueryCallback<AuthInfoVO>() { + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(loginId); + CommonParamtersChecker.checkNotBlank(password); + } + + @Override + public AuthInfoVO doQuery() { + // 验证用户、租户和密码是否正确 + PortalUser portalUser = portalUserRepository.findPortalUserById(tenantId, loginId); + if (portalUser == null) { + throw new CommonBizException(ResultCode.USER_NOT_EXIST, "帐号不存在,请检查!!!"); + } + + // 验证密码是否匹配 + String plainText = ""; + try { + String cipherText = portalUser.getPassword(); + byte[] salt = Base64Util.decode(portalUser.getSalt()); + // 解密时的解密用的密码是生成时的密码, 也就是用户的ID。 + plainText = PasswordUtil.decrypt(cipherText, portalUser.getId(), salt); + + } catch (Exception ex) { + LOGGER.error(String.format("解密用户【" + portalUser.getLoginId() + "】的登录密码时出错")); + throw new CommonBizException(ResultCode.PASSWORD_NOT_CORRECT, + String.format("解密用户【" + portalUser.getLoginId() + "】的登录密码时出错")); + + } + + if (!plainText.equals(password)) { + throw new CommonBizException(ResultCode.PASSWORD_NOT_CORRECT, "用户" + loginId + " 的密码校验错误!!!"); + } + return getAuthInfoByUserIdAndAppId(portalUser.getId(), appId); + } + }); + } + + private AuthInfoVO getAuthInfoByUserIdAndAppId(String userId, String appId) { + AuthInfoVO authInfoVO = portalUserService.findOne(userId); + List<String> roleIds = commonManager.getRoleIdsById(userId); + authInfoVO.setRoleIds(roleIds); + + List<PortalPermissionVO> permissions = portalUserService.getPermissionsByroleIds(appId, roleIds); + Map<String, List<String>> permissionMap = new HashMap<>(4); + + for (PortalPermissionVO permission : permissions) { + String authResType = permission.getAuthResType(); + if (!permissionMap.containsKey(authResType)) { + List<String> valueList = new ArrayList<>(); + permissionMap.put(authResType, valueList); + } + if (!permissionMap.get(authResType).contains(permission.getAuthResId())) { + permissionMap.get(authResType).add(permission.getAuthResId()); + } + } + + authInfoVO.setPermissions(permissionMap); + return authInfoVO; + } + + @Override + public CommonResult<?> getUserStatus() { + return businessQueryTemplate.process(new BusinessQueryCallback<List<PortalSysDictVO>>() { + @Override + public void checkParam() {} + + @Override + public List<PortalSysDictVO> doQuery() { + List<PortalSysDict> userStatusList = portalSysDictRepository.getUserStatus(); + if (userStatusList == null || userStatusList.size() == 0) { + return Collections.emptyList(); + } + return ListUtil.transform(userStatusList, portalSysDictConvert); + } + }); + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/services/PortalDeptRoleRelService.java b/uam-server/src/main/java/com/idcos/enterprise/portal/services/PortalDeptRoleRelService.java new file mode 100644 index 0000000000000000000000000000000000000000..cac5c871bd69fcba5b717362a33a055649bd1fd9 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/services/PortalDeptRoleRelService.java @@ -0,0 +1,36 @@ +/** + * 杭州云霁科技有限公司 http://www.idcos.com Copyright (c) 2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.services; + +import java.util.List; + +import org.jooq.DSLContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.thymeleaf.util.ListUtils; + +import com.google.common.collect.Lists; +import com.idcos.enterprise.jooq.Tables; +import com.idcos.enterprise.jooq.tables.PortalDeptRoleRel; + +/** + * @author souakiragen + * @version $Id: , v 0.1 2017年11月06 上午11:14 souakiragen Exp $ + */ +@Service +public class PortalDeptRoleRelService { + + @Autowired + private DSLContext dslContext; + + public List<String> getRoleIdsByDeptIds(List<String> deptIds) { + PortalDeptRoleRel portalDeptRoleRel = Tables.PORTAL_DEPT_ROLE_REL; + List<String> ids = dslContext.select(portalDeptRoleRel.ROLE_ID).from(portalDeptRoleRel) + .where(portalDeptRoleRel.DEPT_ID.in(deptIds)).groupBy(portalDeptRoleRel.ROLE_ID).fetch().into(String.class); + if (ListUtils.isEmpty(ids)) { + ids = Lists.newArrayList(); + } + return ids; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/services/PortalDeptService.java b/uam-server/src/main/java/com/idcos/enterprise/portal/services/PortalDeptService.java new file mode 100644 index 0000000000000000000000000000000000000000..bee3c765ec64c7122efdaacabb897b80e6a8fc75 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/services/PortalDeptService.java @@ -0,0 +1,60 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.services; + +import com.idcos.enterprise.jooq.Tables; +import com.idcos.enterprise.jooq.tables.PortalDept; +import com.idcos.enterprise.jooq.tables.records.PortalDeptRecord; +import com.idcos.enterprise.portal.dal.enums.StatusEnum; +import org.jooq.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @author souakiragen + * @version $Id: , v 0.1 2017年11月04 下午2:12 souakiragen Exp $ + */ +@Service +public class PortalDeptService { + + @Autowired + private DSLContext dslContext; + + public boolean checkHasByTenantIdAndParentIdAndDisplayName(String tenantId, String parentId, String displayName) { + PortalDept portalDept = Tables.PORTAL_DEPT; + SelectJoinStep<Record> select = dslContext.select().from(portalDept); + Condition condition = portalDept.TENANT_ID.eq(tenantId); + condition = condition.and(portalDept.PARENT_ID.eq(parentId)); + condition = condition.and(portalDept.STATUS.eq(StatusEnum.Y.getCode())); + condition = condition.and(portalDept.DISPLAY_NAME.eq(displayName)); + select.where(condition); + int count = dslContext.fetchCount(select); + return count > 0; + } + + public boolean checkHasByTenantIdAndParentIdAndDisplayNameAndNotId(String tenantId, String parentId, + String displayName, String id) { + PortalDept portalDept = Tables.PORTAL_DEPT; + SelectJoinStep<Record> select = dslContext.select().from(portalDept); + Condition condition = portalDept.TENANT_ID.eq(tenantId); + condition = condition.and(portalDept.PARENT_ID.eq(parentId)); + condition = condition.and(portalDept.DISPLAY_NAME.eq(displayName)); + condition = condition.and(portalDept.STATUS.eq(StatusEnum.Y.getCode())); + condition = condition.and(portalDept.ID.ne(id)); + select.where(condition); + int count = dslContext.fetchCount(select); + return count > 0; + } + + public void updatePortalDeptStatus(String status, String id) { + PortalDept portalDept = Tables.PORTAL_DEPT; + UpdateSetMoreStep<PortalDeptRecord> set = dslContext.update(portalDept).set(portalDept.STATUS, status); + Condition condition = portalDept.ID.eq(id); + set.where(condition); + set.execute(); + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/services/PortalGroupRoleRelService.java b/uam-server/src/main/java/com/idcos/enterprise/portal/services/PortalGroupRoleRelService.java new file mode 100644 index 0000000000000000000000000000000000000000..573d225b493d08f090ee7095666335404d96f368 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/services/PortalGroupRoleRelService.java @@ -0,0 +1,36 @@ +/** + * 杭州云霁科技有限公司 http://www.idcos.com Copyright (c) 2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.services; + +import java.util.List; + +import org.jooq.DSLContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.thymeleaf.util.ListUtils; + +import com.google.common.collect.Lists; +import com.idcos.enterprise.jooq.Tables; +import com.idcos.enterprise.jooq.tables.PortalGroupRoleRel; + +/** + * @author souakiragen + * @version $Id: , v 0.1 2017年11月04 下午5:04 souakiragen Exp $ + */ +@Service +public class PortalGroupRoleRelService { + + @Autowired + private DSLContext dslContext; + + public List<String> getRoleIdsByGroupIds(List<String> ids) { + PortalGroupRoleRel portalGroupRoleRel = Tables.PORTAL_GROUP_ROLE_REL; + List<String> roleIds = dslContext.select(portalGroupRoleRel.ROLE_ID).from(portalGroupRoleRel) + .where(portalGroupRoleRel.GROUP_ID.in(ids)).groupBy(portalGroupRoleRel.ROLE_ID).fetch().into(String.class); + if (ListUtils.isEmpty(roleIds)) { + return Lists.newArrayList(); + } + return roleIds; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/services/PortalRoleService.java b/uam-server/src/main/java/com/idcos/enterprise/portal/services/PortalRoleService.java new file mode 100644 index 0000000000000000000000000000000000000000..3bf5006f154dfb9146b519b5be2ff15b24324cee --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/services/PortalRoleService.java @@ -0,0 +1,33 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.services; + +import com.idcos.enterprise.jooq.Tables; +import com.idcos.enterprise.jooq.tables.PortalRole; +import org.jooq.DSLContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author souakiragen + * @version $Id: , v 0.1 2017年11月07 下午9:10 souakiragen Exp $ + */ +@Service +public class PortalRoleService { + + @Autowired + private DSLContext dslContext; + + public List<com.idcos.enterprise.portal.dal.entity.PortalRole> getListByIds(List<String> ids) { + PortalRole portalRole = Tables.PORTAL_ROLE; + List<com.idcos.enterprise.portal.dal.entity.PortalRole> portalRoles = dslContext.select() + .from(portalRole).where(portalRole.ID.in(ids)).fetch() + .into(com.idcos.enterprise.portal.dal.entity.PortalRole.class); + return portalRoles; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/services/PortalTenantService.java b/uam-server/src/main/java/com/idcos/enterprise/portal/services/PortalTenantService.java new file mode 100644 index 0000000000000000000000000000000000000000..0b94561181fbb73c58bd73e888c92c84671812a3 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/services/PortalTenantService.java @@ -0,0 +1,57 @@ +/** + * 杭州云霁科技有限公司 http://www.idcos.com Copyright (c) 2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.services; + +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.jooq.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.google.common.collect.Lists; +import com.idcos.cloud.core.dal.common.page.Pagination; +import com.idcos.enterprise.jooq.Tables; +import com.idcos.enterprise.jooq.tables.PortalTenant; +import com.idcos.enterprise.portal.dal.enums.IsActiveEnum; +import com.idcos.enterprise.portal.form.PortalTenantQueryPageListForm; +import com.idcos.enterprise.portal.vo.PortalTenantVO; + +/** + * @author souakiragen + * @version $Id: , v 0.1 2017年11月07 上午10:11 souakiragen Exp $ + */ +@Service +public class PortalTenantService { + + @Autowired + private DSLContext dslContext; + + public Pagination queryPageList(int pageNo, int pageSize, PortalTenantQueryPageListForm form) { + PortalTenant portalTenant = Tables.PORTAL_TENANT; + SelectJoinStep<Record3<String, String, String>> select = dslContext + .select(portalTenant.ID, portalTenant.NAME.as("TENANT_ID"), portalTenant.DISPLAY_NAME.as("TENANT_NAME")) + .from(portalTenant); + Condition condition = portalTenant.IS_ACTIVE.eq(IsActiveEnum.HAS_ACTIVE.getCode()); + if (StringUtils.isNotBlank(form.getTenantId())) { + condition = condition.and(portalTenant.NAME.like("%" + form.getTenantId() + "%")); + } + if (StringUtils.isNotBlank(form.getTenantName())) { + condition = condition.and(portalTenant.DISPLAY_NAME.like("%" + form.getTenantName() + "%")); + } + select.where(condition); + int total = dslContext.fetchCount(select); + if (total == 0) { + return new Pagination(pageNo, pageSize, 0, Lists.newArrayList()); + } + List<PortalTenantVO> portalTenantVOS = select.orderBy(portalTenant.GMT_CREATE.desc()) + .limit((pageNo - 1) * pageSize, pageSize).fetch().into(PortalTenantVO.class); + return new Pagination(pageNo, pageSize, total, portalTenantVOS); + } + + public void updateIsActive(String id, String isActive) { + PortalTenant portalTenant = Tables.PORTAL_TENANT; + dslContext.update(portalTenant).set(portalTenant.IS_ACTIVE, isActive).where(portalTenant.ID.eq(id)).execute(); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/services/PortalUserGroupService.java b/uam-server/src/main/java/com/idcos/enterprise/portal/services/PortalUserGroupService.java new file mode 100644 index 0000000000000000000000000000000000000000..8a3cd86b1e5a580f61964112e7614068f93d5c8e --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/services/PortalUserGroupService.java @@ -0,0 +1,149 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.services; + +import com.google.common.collect.Lists; +import com.idcos.cloud.core.dal.common.page.Pagination; +import com.idcos.enterprise.jooq.Tables; +import com.idcos.enterprise.jooq.tables.*; +import com.idcos.enterprise.jooq.tables.records.PortalUserGroupRecord; +import com.idcos.enterprise.portal.dal.enums.IsActiveEnum; +import com.idcos.enterprise.portal.form.PortalUserGroupQueryByPageForm; +import com.idcos.enterprise.portal.vo.PortalUserGroupVO; +import com.idcos.enterprise.portal.vo.PortalUserVO; +import org.apache.commons.lang3.StringUtils; +import org.jooq.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +import static com.idcos.enterprise.jooq.Tables.PORTAL_GROUP_USER_REL; +import static com.idcos.enterprise.jooq.Tables.PORTAL_USER_GROUP; + +/** + * @author Dana + * @version PortalUserGroupService.java, v1 2017/11/27 上午11:23 Dana Exp $$ + */ +@Service +public class PortalUserGroupService { + @Autowired + private DSLContext dslContext; + + /** + * 修改用户组的IsActive属性 + * + * @param isAction + * @param id + */ + public void updateIsActiveById(String isAction, String id) { + PortalUserGroup userGroup = PORTAL_USER_GROUP; + UpdateSetMoreStep<PortalUserGroupRecord> set = dslContext.update(userGroup).set(userGroup.IS_ACTIVE, isAction); + Condition condition = userGroup.ID.eq(id); + set.where(condition); + set.execute(); + } + + /** + * 根据用户id和用户组type查询用户组集合 + * + * @param type,id + * @return List<PortalUserGroupVO> + */ + public List<PortalUserGroupVO> queryGroupByTypeAndUserId(String type, String userId) { + ArrayList<Field<?>> fields = Lists.newArrayList(PORTAL_USER_GROUP.fields()); + return dslContext.select(fields).from(PORTAL_USER_GROUP).leftJoin(PORTAL_GROUP_USER_REL) + .on(PORTAL_USER_GROUP.ID.eq(PORTAL_GROUP_USER_REL.GROUP_ID)).where(PORTAL_GROUP_USER_REL.USER_ID.eq(userId)) + .and(PORTAL_USER_GROUP.TYPE.eq(type)).fetch().into(PortalUserGroupVO.class); + } + + /** + * 根据用户id获取工作组的list + * + * @param userId + * @return List<PortalUserGroupVO> + */ + public List<PortalUserGroupVO> listUserGroupByUserId(String userId) { + ArrayList<Field<?>> fields = Lists.newArrayList(PORTAL_USER_GROUP.fields()); + return dslContext.select(fields).from(PORTAL_USER_GROUP).leftJoin(PORTAL_GROUP_USER_REL) + .on(PORTAL_USER_GROUP.ID.eq(PORTAL_GROUP_USER_REL.GROUP_ID)).where(PORTAL_GROUP_USER_REL.USER_ID.eq(userId)) + .fetch().into(PortalUserGroupVO.class); + } + + /** + * 根据用户组id获取用户的list + * + * @param groupId + * @return List<PortalUserVO> + */ + public List<PortalUserVO> listUsersByGroupId(String groupId) { + PortalUser user = Tables.PORTAL_USER; + PortalGroupUserRel guRel = Tables.PORTAL_GROUP_USER_REL; + ArrayList<Field<?>> fields = Lists.newArrayList(user.fields()); + return dslContext.select(fields).from(user).leftJoin(guRel).on(user.ID.eq(guRel.USER_ID)) + .where(guRel.GROUP_ID.eq(groupId)).and(user.IS_ACTIVE.eq("Y")).fetch().into(PortalUserVO.class); + } + + /** + * 根据用户组名称和租户Id获取用户的list + * + * @param groupName + * @param tenantId + * @return List<PortalUserVO> + */ + public List<PortalUserVO> listUsersByGroupNameAndTenantId(String groupName, String tenantId) { + PortalUser user = Tables.PORTAL_USER; + PortalUserGroup userGroup = Tables.PORTAL_USER_GROUP; + PortalGroupUserRel guRel = Tables.PORTAL_GROUP_USER_REL; + ArrayList<Field<?>> fields = Lists.newArrayList(user.fields()); + return dslContext.select(fields).from(user).leftJoin(guRel).on(user.ID.eq(guRel.USER_ID)).leftJoin(userGroup) + .on(guRel.GROUP_ID.eq(userGroup.ID)).where(userGroup.NAME.eq(groupName)).and(userGroup.TENANT.eq(tenantId)) + .and(userGroup.IS_ACTIVE.eq("Y")).and(user.IS_ACTIVE.eq("Y")).fetch().into(PortalUserVO.class); + } + + /** + * 分页查询用户组(带每个组拥有的角色列表) + * + * @param pageNo + * @param pageSize + * @param form + * @return + */ + public Pagination<PortalUserGroupVO> getPageList(Integer pageNo, Integer pageSize, + PortalUserGroupQueryByPageForm form, String cnd) { + PortalUserGroup userGroup = Tables.PORTAL_USER_GROUP; + PortalGroupRoleRel grRel = Tables.PORTAL_GROUP_ROLE_REL; + PortalRole role = Tables.PORTAL_ROLE; + List<Field<?>> fields = Lists.newArrayList(userGroup.fields()); + SelectJoinStep<Record> select = dslContext.select(fields).from(userGroup); + Condition condition = userGroup.TENANT.eq(form.getTenantId()) + .and(userGroup.IS_ACTIVE.eq(IsActiveEnum.HAS_ACTIVE.getCode())); + if (StringUtils.isNotBlank(cnd)) { + condition = condition.and(userGroup.NAME.like("%" + cnd + "%").or(userGroup.REMARK.like("%" + cnd + "%"))); + } + //按最后更新时间降序展示 + select.where(condition).orderBy(userGroup.GMT_MODIFIED.desc()); + int count = dslContext.fetchCount(select); + if (count == 0) { + return new Pagination<>(pageNo, pageSize, 0, Lists.<PortalUserGroupVO>newArrayList()); + } + List<PortalUserGroupVO> portalUserGroupVOS = select.limit((pageNo - 1) * pageSize, pageSize).fetch() + .into(PortalUserGroupVO.class); + + //查询每个用户所属的用户组集合,放入PortalUserVO中 + for (PortalUserGroupVO portalUserGroupVO : portalUserGroupVOS) { + List<String> selRoleList = dslContext.selectDistinct(role.NAME).from(role).leftJoin(grRel) + .on(role.ID.eq(grRel.ROLE_ID)).where(role.IS_ACTIVE.eq(IsActiveEnum.HAS_ACTIVE.getCode())) + .and(grRel.GROUP_ID.eq(portalUserGroupVO.getId())).fetch().into(String.class); + String[] selRoles = new String[selRoleList.size()]; + selRoleList.toArray(selRoles); + portalUserGroupVO.setSelRoles(selRoles); + } + return new Pagination<>(pageNo, pageSize, count, portalUserGroupVOS); + } + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/services/PortalUserService.java b/uam-server/src/main/java/com/idcos/enterprise/portal/services/PortalUserService.java new file mode 100644 index 0000000000000000000000000000000000000000..3af54fef36e21ab72710bab48d15524fc6e69f37 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/services/PortalUserService.java @@ -0,0 +1,272 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.services; + +import com.google.common.collect.Lists; +import com.idcos.cloud.core.dal.common.page.Pagination; +import com.idcos.enterprise.jooq.Tables; +import com.idcos.enterprise.jooq.tables.*; +import com.idcos.enterprise.jooq.tables.records.PortalUserRecord; +import com.idcos.enterprise.portal.dal.enums.IsActiveEnum; +import com.idcos.enterprise.portal.form.PortalQueryByPageForm; +import com.idcos.enterprise.portal.form.PortalUserQueryPageListForm; +import com.idcos.enterprise.portal.vo.AuthInfoVO; +import com.idcos.enterprise.portal.vo.PortalPermissionVO; +import com.idcos.enterprise.portal.vo.PortalRoleVO; +import com.idcos.enterprise.portal.vo.PortalUserVO; +import org.apache.commons.lang3.StringUtils; +import org.jooq.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.thymeleaf.util.ListUtils; + +import java.util.*; + +import static com.idcos.enterprise.jooq.Tables.*; + +/** + * @author souakiragen + * @version $Id: , v 0.1 2017年11月02 下午8:30 souakiragen Exp $ + */ +@Service +public class PortalUserService { + @Autowired + private DSLContext dslContext; + + public Pagination<PortalUserVO> getPageList(String teanntId, String deptId, String cnd, int pageNo, int pageSize) { + PortalUser user = PORTAL_USER; + PortalDept dept = Tables.PORTAL_DEPT; + PortalUserGroup userGroup = Tables.PORTAL_USER_GROUP; + PortalGroupUserRel guRel = Tables.PORTAL_GROUP_USER_REL; + + List<Field<?>> fields = Lists.newArrayList(user.fields()); + Field deptNameField = dept.DISPLAY_NAME.as("DEPT_NAME"); + fields.add(deptNameField); + SelectJoinStep<Record> select = dslContext.select(fields).from(user).leftJoin(dept) + .on(user.DEPT_ID.eq(dept.ID)); + Condition condition = user.TENANT_ID.eq(teanntId); + if (StringUtils.isNotBlank(deptId)) { + condition = condition.and(user.DEPT_ID.eq(deptId)); + } + if (StringUtils.isNotBlank(cnd)) { + condition = condition + .and(user.NAME.like("%" + cnd + "%").or(user.LOGIN_ID.like("%" + cnd + "%"))); + } + condition = condition.and(user.IS_ACTIVE.eq(IsActiveEnum.HAS_ACTIVE.getCode())); + //默认按LOGIN_ID降序展示 + select.where(condition).orderBy(user.LOGIN_ID.asc()); + int count = dslContext.fetchCount(select); + + if (count == 0) { + return new Pagination<>(pageNo, pageSize, 0, Lists.<PortalUserVO>newArrayList()); + } + List<PortalUserVO> portalUserVOS = select.limit((pageNo - 1) * pageSize, pageSize) + .fetch().into(PortalUserVO.class); + + //查询每个用户所属的用户组集合,放入PortalUserVO中 + for (PortalUserVO portalUserVO : portalUserVOS) { + List<String> selGroupList = dslContext.selectDistinct(userGroup.NAME).from(userGroup).leftJoin(guRel) + .on(userGroup.ID.eq(guRel.GROUP_ID)).where(userGroup.IS_ACTIVE.eq(IsActiveEnum.HAS_ACTIVE.getCode())) + .and(guRel.USER_ID.eq(portalUserVO.getId())).fetch().into(String.class); + String[] selGroups = new String[selGroupList.size()]; + selGroupList.toArray(selGroups); + portalUserVO.setSelGroups(selGroups); + } + + return new Pagination<>(pageNo, pageSize, count, portalUserVOS); + } + + public void updateIsActionById(String isAction, String id) { + PortalUser portalUser = PORTAL_USER; + UpdateSetMoreStep<PortalUserRecord> set = dslContext.update(portalUser).set(portalUser.IS_ACTIVE, isAction); + Condition condition = portalUser.ID.eq(id); + set.where(condition); + set.execute(); + } + + public List<com.idcos.enterprise.portal.dal.entity.PortalPermission> getPermissonByAuthObjTypeAndAuthObjId(String authObjType, + List<String> authObjIds) { + PortalPermission portalPermission = Tables.PORTAL_PERMISSION; + /** + * 查询所有角色拥有的权限并去重 + */ + PortalPermission distinctAs = portalPermission.as("distinctAs"); + SelectJoinStep<Record1<String>> idSelect = dslContext.select(distinctAs.ID.max()).from(distinctAs); + Condition condition = distinctAs.AUTH_OBJ_TYPE.eq(authObjType); + condition = condition.and(distinctAs.AUTH_OBJ_ID.in(authObjIds)); + idSelect.where(condition).groupBy(distinctAs.AUTH_RES_ID); + PortalPermission prAs = portalPermission.as("prAs"); + SelectJoinStep<Record> select = dslContext.select(prAs.fields()).from(prAs); + select.where(prAs.ID.in(idSelect)); + List<com.idcos.enterprise.portal.dal.entity.PortalPermission> portalPermissionList = select.fetch() + .into(com.idcos.enterprise.portal.dal.entity.PortalPermission.class); + if (ListUtils.isEmpty(portalPermissionList)) { + return Lists.newArrayList(); + } + return portalPermissionList; + } + + public List<com.idcos.enterprise.portal.dal.entity.PortalPermission> queryPermissionsByRoleIdsAndAppId(List<String> authObjIds, + String appId) { + PortalPermission portalPermission = Tables.PORTAL_PERMISSION; + /** + * 查询所有角色拥有的权限并去重 + */ + PortalPermission distinctAs = portalPermission.as("distinctAs"); + SelectJoinStep<Record1<String>> idSelect = dslContext.select(distinctAs.ID.max()).from(distinctAs); + Condition condition = distinctAs.APP_ID.eq(appId); + condition = condition.and(distinctAs.AUTH_OBJ_ID.in(authObjIds)); + idSelect.where(condition).groupBy(distinctAs.AUTH_RES_ID); + PortalPermission prAs = portalPermission.as("prAs"); + SelectJoinStep<Record> select = dslContext.select(prAs.fields()).from(prAs); + select.where(prAs.ID.in(idSelect)); + List<com.idcos.enterprise.portal.dal.entity.PortalPermission> portalPermissionList = select.fetch() + .into(com.idcos.enterprise.portal.dal.entity.PortalPermission.class); + if (ListUtils.isEmpty(portalPermissionList)) { + return Lists.newArrayList(); + } + return portalPermissionList; + } + + /** + * 查询所有用户信息(包含deptName) + * + * @return List<PortalUserVO> + */ + public List<PortalUserVO> listUserVO() { + ArrayList<Field<?>> fields = Lists.newArrayList(PORTAL_USER.fields()); + fields.add(PORTAL_DEPT.DISPLAY_NAME.as("DEPT_NAME")); + return dslContext.select(fields).from(PORTAL_USER).leftJoin(PORTAL_DEPT) + .on(PORTAL_USER.DEPT_ID.eq(PORTAL_DEPT.ID)).where(PORTAL_USER.IS_ACTIVE.eq("Y")) + .fetchInto(PortalUserVO.class); + } + + /** + * 查询所有用户信息(包含deptName) + * + * @param tenantId + * @return List<PortalUserVO> + */ + public List<PortalUserVO> listUserVOByTenantId(String tenantId) { + ArrayList<Field<?>> fields = Lists.newArrayList(PORTAL_USER.fields()); + fields.add(PORTAL_DEPT.DISPLAY_NAME.as("DEPT_NAME")); + return dslContext.select(fields).from(PORTAL_USER).leftJoin(PORTAL_DEPT) + .on(PORTAL_USER.DEPT_ID.eq(PORTAL_DEPT.ID)).where(PORTAL_USER.TENANT_ID.eq(tenantId)) + .and(PORTAL_USER.IS_ACTIVE.eq("Y")).fetchInto(PortalUserVO.class); + } + + /** + * 根据用户id用户信息(包含deptName) + * + * @param userId + * @return AuthInfoVO + */ + public AuthInfoVO findOne(String userId) { + ArrayList<Field<?>> fields = Lists.newArrayList(PORTAL_USER.fields()); + fields.add(PORTAL_DEPT.DISPLAY_NAME.as("DEPT_NAME")); + fields.add(PORTAL_TENANT.DISPLAY_NAME.as("TENANT_NAME")); + AuthInfoVO authInfoVO = dslContext.select(fields).from(PORTAL_USER).leftJoin(PORTAL_DEPT) + .on(PORTAL_USER.DEPT_ID.eq(PORTAL_DEPT.ID)).leftJoin(PORTAL_TENANT) + .on(PORTAL_USER.TENANT_ID.eq(PORTAL_TENANT.NAME)).where(PORTAL_USER.ID.eq(userId)) + .fetchOneInto(AuthInfoVO.class); + List<String> userGroupIds = dslContext.select(PORTAL_USER_GROUP.ID).from(PORTAL_USER_GROUP) + .leftJoin(PORTAL_GROUP_USER_REL).on(PORTAL_USER_GROUP.ID.eq(PORTAL_GROUP_USER_REL.GROUP_ID)) + .where(PORTAL_USER_GROUP.IS_ACTIVE.eq("Y")).and(PORTAL_GROUP_USER_REL.USER_ID.eq(userId)).fetch() + .into(String.class); + authInfoVO.setUserGroups(userGroupIds); + return authInfoVO; + } + + /** + * 根据角色id查询所有用户(包含deptName) + * + * @param roleId + * @return List<String> + */ + public List<PortalUserVO> listUserByRoleId(String roleId) { + ArrayList<Field<?>> fields = Lists.newArrayList(PORTAL_USER.fields()); + fields.add(PORTAL_DEPT.DISPLAY_NAME.as("DEPT_NAME")); + return dslContext.selectDistinct(fields).from(PORTAL_USER).leftJoin(PORTAL_DEPT) + .on(PORTAL_USER.DEPT_ID.eq(PORTAL_DEPT.ID)).leftJoin(PORTAL_DEPT_ROLE_REL) + .on(PORTAL_USER.DEPT_ID.eq(PORTAL_DEPT_ROLE_REL.DEPT_ID)).leftJoin(PORTAL_GROUP_USER_REL) + .on(PORTAL_USER.ID.eq(PORTAL_GROUP_USER_REL.USER_ID)).leftJoin(PORTAL_GROUP_ROLE_REL) + .on(PORTAL_GROUP_USER_REL.GROUP_ID.eq(PORTAL_GROUP_ROLE_REL.GROUP_ID)) + .where(PORTAL_GROUP_ROLE_REL.ROLE_ID.eq(roleId)).or(PORTAL_DEPT_ROLE_REL.ROLE_ID.eq(roleId)).fetch() + .into(PortalUserVO.class); + } + + /** + * 根据角色id分页查询用户 + * + * @param form + * @return List<String> + */ + public Pagination<PortalUserVO> listUserByRoleForm(PortalQueryByPageForm form) { + ArrayList<Field<?>> fields = Lists.newArrayList(PORTAL_USER.fields()); + fields.add(PORTAL_DEPT.DISPLAY_NAME.as("DEPT_NAME")); + SelectConditionStep<Record> select = dslContext.selectDistinct(fields).from(PORTAL_USER).leftJoin(PORTAL_DEPT) + .on(PORTAL_USER.DEPT_ID.eq(PORTAL_DEPT.ID)).leftJoin(PORTAL_DEPT_ROLE_REL) + .on(PORTAL_USER.DEPT_ID.eq(PORTAL_DEPT_ROLE_REL.DEPT_ID)).leftJoin(PORTAL_GROUP_USER_REL) + .on(PORTAL_USER.ID.eq(PORTAL_GROUP_USER_REL.USER_ID)).leftJoin(PORTAL_GROUP_ROLE_REL) + .on(PORTAL_GROUP_USER_REL.GROUP_ID.eq(PORTAL_GROUP_ROLE_REL.GROUP_ID)) + .where(PORTAL_GROUP_ROLE_REL.ROLE_ID.eq(form.getId())).or(PORTAL_DEPT_ROLE_REL.ROLE_ID.eq(form.getId())); + + int count = dslContext.fetchCount(select); + + if (count == 0) { + return new Pagination<>(form.getPageNo(), form.getPageSize(), 0, Lists.<PortalUserVO>newArrayList()); + } + List<PortalUserVO> portalUserVOS = select.limit((form.getPageNo() - 1) * form.getPageSize(), form.getPageSize()) + .fetch().into(PortalUserVO.class); + return new Pagination<>(form.getPageNo(), form.getPageSize(), count, portalUserVOS); + } + + /** + * 根据用户id分页查询角色信息,支持模糊查询 + * + * @param form + * @return List<String> + */ + public Pagination<PortalRoleVO> listRoleByUserForm(PortalQueryByPageForm form) { + ArrayList<Field<?>> fields = Lists.newArrayList(PORTAL_ROLE.fields()); + SelectConditionStep<Record> select = dslContext.selectDistinct(fields).from(PORTAL_ROLE) + .leftJoin(PORTAL_GROUP_ROLE_REL).on(PORTAL_ROLE.ID.eq(PORTAL_GROUP_ROLE_REL.ROLE_ID)) + .leftJoin(PORTAL_GROUP_USER_REL).on(PORTAL_GROUP_ROLE_REL.GROUP_ID.eq(PORTAL_GROUP_USER_REL.GROUP_ID)) + .leftJoin(PORTAL_DEPT_ROLE_REL).on(PORTAL_ROLE.ID.eq(PORTAL_DEPT_ROLE_REL.ROLE_ID)).leftJoin(PORTAL_USER) + .on(PORTAL_USER.DEPT_ID.eq(PORTAL_DEPT_ROLE_REL.DEPT_ID)) + .where(PORTAL_ROLE.IS_ACTIVE.eq(IsActiveEnum.HAS_ACTIVE.getCode()) + .and(PORTAL_GROUP_USER_REL.USER_ID.eq(form.getId())).or(PORTAL_USER.ID.eq(form.getId()))); + + if (StringUtils.isNotBlank(form.getCnd())) { + Condition condition = PORTAL_ROLE.NAME.like(form.getCnd()).or(PORTAL_ROLE.CODE.like(form.getCnd())) + .or(PORTAL_ROLE.REMARK.like(form.getCnd())); + select.and(condition); + } + int count = dslContext.fetchCount(select); + + if (count == 0) { + return new Pagination<>(form.getPageNo(), form.getPageSize(), 0, Lists.<PortalRoleVO>newArrayList()); + } + List<PortalRoleVO> portalRoleVOS = select.limit((form.getPageNo() - 1) * form.getPageSize(), form.getPageSize()) + .fetch().into(PortalRoleVO.class); + return new Pagination<>(form.getPageNo(), form.getPageSize(), count, portalRoleVOS); + } + + /** + * 根据appId和角色id的List(无重复值)获取权限List(无重复值) + * + * @param appId,roleIds + * @return List<String> + */ + public List<PortalPermissionVO> getPermissionsByroleIds(String appId, List<String> roleIds) { + ArrayList<Field<?>> fields = Lists.newArrayList(PORTAL_PERMISSION.fields()); + List<PortalPermissionVO> portalPermissions = dslContext.select(fields).from(PORTAL_PERMISSION) + .where(PORTAL_PERMISSION.AUTH_OBJ_ID.in(roleIds).and(PORTAL_PERMISSION.APP_ID.eq(appId))).fetch() + .into(PortalPermissionVO.class); + return portalPermissions; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/vo/AuthInfoVO.java b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/AuthInfoVO.java new file mode 100644 index 0000000000000000000000000000000000000000..8c3bd3cffb1a9b605c6b5860db398c6a9b69547c --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/AuthInfoVO.java @@ -0,0 +1,249 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.vo; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * @author Dana + * @version AuthInfoVO.java, v1 2017/11/18 下午6:22 Dana Exp $$ + */ +public class AuthInfoVO implements Serializable { + private static final long serialVersionUID = 1L; + + private String id; + + private String loginId; + + private String name; + + private String email; + + private String mobile1; + + private String mobile2; + + private String rtx; + + private String officeTel1; + + private String officeTel2; + + private String employeeType; + + private String title; + + private String weixin; + + private String remark; + + private String isActive; + + private String status; + + private String deptId; + + private String deptName; + + private String tenantId; + + private String tenantName; + + private Map<String, List<String>> permissions; + + private List<String> userGroups; + + private List<String> roleIds; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLoginId() { + return loginId; + } + + public void setLoginId(String loginId) { + this.loginId = loginId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getMobile1() { + return mobile1; + } + + public void setMobile1(String mobile1) { + this.mobile1 = mobile1; + } + + public String getMobile2() { + return mobile2; + } + + public void setMobile2(String mobile2) { + this.mobile2 = mobile2; + } + + public String getRtx() { + return rtx; + } + + public void setRtx(String rtx) { + this.rtx = rtx; + } + + public String getOfficeTel1() { + return officeTel1; + } + + public void setOfficeTel1(String officeTel1) { + this.officeTel1 = officeTel1; + } + + public String getOfficeTel2() { + return officeTel2; + } + + public void setOfficeTel2(String officeTel2) { + this.officeTel2 = officeTel2; + } + + public String getEmployeeType() { + return employeeType; + } + + public void setEmployeeType(String employeeType) { + this.employeeType = employeeType; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getWeixin() { + return weixin; + } + + public void setWeixin(String weixin) { + this.weixin = weixin; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getIsActive() { + return isActive; + } + + public void setIsActive(String isActive) { + this.isActive = isActive; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getDeptId() { + return deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getTenantName() { + return tenantName; + } + + public void setTenantName(String tenantName) { + this.tenantName = tenantName; + } + + public Map<String, List<String>> getPermissions() { + return permissions; + } + + public void setPermissions(Map<String, List<String>> permissions) { + this.permissions = permissions; + } + + public List<String> getUserGroups() { + return userGroups; + } + + public void setUserGroups(List<String> userGroups) { + this.userGroups = userGroups; + } + + public List<String> getRoleIds() { + return roleIds; + } + + public void setRoleIds(List<String> roleIds) { + this.roleIds = roleIds; + } + + @Override + public String toString() { + return "AuthInfoVO{" + "id='" + id + '\'' + ", loginId='" + loginId + '\'' + ", name='" + name + '\'' + + ", email='" + email + '\'' + ", mobile1='" + mobile1 + '\'' + ", mobile2='" + mobile2 + '\'' + + ", officeTel1='" + officeTel1 + '\'' + ", officeTel2='" + officeTel2 + '\'' + ", employeeType='" + + employeeType + '\'' + ", title='" + title + '\'' + ", weixin='" + weixin + '\'' + ", remark='" + remark + + '\'' + ", isActive='" + isActive + '\'' + ", status='" + status + '\'' + ", deptId='" + deptId + '\'' + + ", deptName='" + deptName + '\'' + ", tenantId='" + tenantId + '\'' + ", tenantName='" + tenantName + + '\'' + ", permissions=" + permissions + ", userGroups=" + userGroups + ", roleIds=" + roleIds + '}'; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/vo/Item.java b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/Item.java new file mode 100644 index 0000000000000000000000000000000000000000..227898d8f91443aa816d98d6e17401b9d414eebc --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/Item.java @@ -0,0 +1,80 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2016 All Rights Reserved. + */ +package com.idcos.enterprise.portal.vo; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * @author zhouqin + * @version com.idcos.automate.export.api.rbac.Item.java, v 1.1 5/12/16 zhouqin Exp $ + */ +@SuppressWarnings("serial") +public class Item implements Serializable { + + private String id; + + private String title; + + private List<Item> children = new ArrayList<>(); + + @JsonIgnore + private Map<String, Item> childrenUnique = new HashMap<>(); + + public Item() { + + } + + public Item(String id, String title) { + this.id = id; + this.title = title; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public List<Item> getChildren() { + return children; + } + + public void setChildren(List<Item> children) { + this.children = children; + } + + /** + * return child in this + * + * @param item + * @return + */ + public Item addChild(Item item) { + if (childrenUnique.containsKey(item.getId())) { + return childrenUnique.get(item.getId()); + } + childrenUnique.put(item.getId(), item); + this.children.add(item); + return item; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/vo/JwtTokenVO.java b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/JwtTokenVO.java new file mode 100644 index 0000000000000000000000000000000000000000..f693d93b565b709548b39bc95f899139570f583c --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/JwtTokenVO.java @@ -0,0 +1,91 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2018 All Rights Reserved. + */ +package com.idcos.enterprise.portal.vo; + +import com.idcos.cloud.core.common.BaseVO; + +/** + * @author Xizhao.Dai + * @version JwtTokenVO.java, v1 2018/4/19 下午9:15 Xizhao.Dai Exp $$ + */ +public class JwtTokenVO extends BaseVO { + private String userId; + + private String name; + + private String loginId; + + private String tenantId; + + private String tenantName; + + private String expireTime; + + private String creatTime; + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getLoginId() { + return loginId; + } + + public void setLoginId(String loginId) { + this.loginId = loginId; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getTenantName() { + return tenantName; + } + + public void setTenantName(String tenantName) { + this.tenantName = tenantName; + } + + public String getExpireTime() { + return expireTime; + } + + public void setExpireTime(String expireTime) { + this.expireTime = expireTime; + } + + public String getCreatTime() { + return creatTime; + } + + public void setCreatTime(String creatTime) { + this.creatTime = creatTime; + } + + @Override + public String toString() { + return "JwtTokenVO{" + "userId='" + userId + '\'' + ", name='" + name + '\'' + ", loginId='" + loginId + '\'' + + ", tenantId='" + tenantId + '\'' + ", tenantName='" + tenantName + '\'' + ", expireTime='" + expireTime + + '\'' + ", creatTime='" + creatTime + '\'' + '}'; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalDeptTreeVO.java b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalDeptTreeVO.java new file mode 100644 index 0000000000000000000000000000000000000000..3f117cd7d9a9c2286d579c39439f0a4e542abd76 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalDeptTreeVO.java @@ -0,0 +1,108 @@ +package com.idcos.enterprise.portal.vo; + +import com.idcos.cloud.core.common.BaseVO; + +/** + * @author GuanBin + * @version PortalDeptVO.java, v1 2017/9/26 下午3:05 GuanBin Exp $$ + */ +public class PortalDeptTreeVO extends BaseVO { + private static final long serialVersionUID = 1L; + + private String id; + private String code; + private String name; + private String pid; + private String sourceType; + private String status; + private String managerId; + private String remark; + private String tenantId; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getSourceType() { + return sourceType; + } + + public void setSourceType(String sourceType) { + this.sourceType = sourceType; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getManagerId() { + return managerId; + } + + public void setManagerId(String managerId) { + this.managerId = managerId; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + @Override + public String toString() { + return "PortalDeptTreeVO{" + + "id='" + id + '\'' + + ", code='" + code + '\'' + + ", name='" + name + '\'' + + ", pid='" + pid + '\'' + + ", sourceType='" + sourceType + '\'' + + ", status='" + status + '\'' + + ", managerId='" + managerId + '\'' + + ", remark='" + remark + '\'' + + ", tenantId='" + tenantId + '\'' + + '}'; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalDeptVO.java b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalDeptVO.java new file mode 100644 index 0000000000000000000000000000000000000000..9309f8339a810e95c7bfb83106f136b244dec28b --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalDeptVO.java @@ -0,0 +1,117 @@ +package com.idcos.enterprise.portal.vo; + +import com.idcos.cloud.core.common.BaseVO; + +/** + * @author GuanBin + * @version PortalDeptVO.java, v1 2017/9/26 下午3:05 GuanBin Exp $$ + */ +public class PortalDeptVO extends BaseVO { + private static final long serialVersionUID = 1L; + + private String id; + private String code; + private String displayName; + private String parentId; + private String status; + private String sourceType; + private String managerId; + private String remark; + private String tenantId; + private String tenant; + + public String getTenant() { + return tenant; + } + + public void setTenant(String tenant) { + this.tenant = tenant; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName; + } + + public String getParentId() { + return parentId; + } + + public void setParentId(String parentId) { + this.parentId = parentId; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getSourceType() { + return sourceType; + } + + public void setSourceType(String sourceType) { + this.sourceType = sourceType; + } + + public String getManagerId() { + return managerId; + } + + public void setManagerId(String managerId) { + this.managerId = managerId; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + @Override + public String toString() { + return "PortalDeptVO{" + + "id='" + id + '\'' + + ", code='" + code + '\'' + + ", displayName='" + displayName + '\'' + + ", parentId='" + parentId + '\'' + + ", status='" + status + '\'' + + ", managerId='" + managerId + '\'' + + ", remark='" + remark + '\'' + + ", tenantId='" + tenantId + '\'' + + ", tenant='" + tenant + '\'' + + '}'; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalPermissionVO.java b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalPermissionVO.java new file mode 100644 index 0000000000000000000000000000000000000000..109dfcd5f714dd01ea8f07c36d9f28741e1c2d77 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalPermissionVO.java @@ -0,0 +1,103 @@ + + +package com.idcos.enterprise.portal.vo; + +// auto generated imports + +import com.idcos.cloud.core.common.BaseVO; + +/** + * 返回结果对象 {vo.className} + * <p>第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖</p> + * + * @author yanlv + * @version PortalPermissionVO.java, v 1.1 2015-06-09 10:00:37 yanlv Exp $ + */ + +public class PortalPermissionVO extends BaseVO { + + private static final long serialVersionUID = 1L; + + private String id; + + private String authResType; + + private String authResId; + + private String authResName; + + private String authObjType; + + private String authObjId; + + private String tenantId; + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getAuthResType() { + return authResType; + } + + public void setAuthResType(String authResType) { + this.authResType = authResType; + } + + public String getAuthResId() { + return authResId; + } + + public void setAuthResId(String authResId) { + this.authResId = authResId; + } + + public String getAuthObjType() { + return authObjType; + } + + public void setAuthObjType(String authObjType) { + this.authObjType = authObjType; + } + + public String getAuthObjId() { + return authObjId; + } + + public void setAuthObjId(String authObjId) { + this.authObjId = authObjId; + } + + public String getAuthResName() { + return authResName; + } + + public void setAuthResName(String authResName) { + this.authResName = authResName; + } + + @Override + public String toString() { + return "PortalPermissionVO{" + + "id='" + id + '\'' + + ", authResType='" + authResType + '\'' + + ", authResId='" + authResId + '\'' + + ", authResName='" + authResName + '\'' + + ", authObjType='" + authObjType + '\'' + + ", authObjId='" + authObjId + '\'' + + ", tenantId='" + tenantId + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalResourceVO.java b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalResourceVO.java new file mode 100644 index 0000000000000000000000000000000000000000..3638591594601adaef7a2c4d6f86a19f1ed454c9 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalResourceVO.java @@ -0,0 +1,120 @@ + + +package com.idcos.enterprise.portal.vo; + +// auto generated imports + +import com.idcos.cloud.core.common.BaseVO; + +/** + * PortalResourceVO + * + * @author pengganyu + * @version $Id: PortalResourceVO.java, v 0.1 2016年5月10日 上午9:46:42 pengganyu Exp $ + */ +public class PortalResourceVO extends BaseVO { + + private static final long serialVersionUID = 1L; + + /** + * 权限资源主键 + */ + private String id; + + /** + * 权限资源类型 + */ + private String code; + + /** + * 权限资源名称 + */ + private String name; + + /** + * 权限资源URL + */ + private String url; + + /** + * 系统名称 + */ + private String appId; + + /** + * 备注 + */ + private String remark; + + + private String tenantId; + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + @Override + public String toString() { + return "PortalResourceVO{" + + "id='" + id + '\'' + + ", code='" + code + '\'' + + ", name='" + name + '\'' + + ", url='" + url + '\'' + + ", appId='" + appId + '\'' + + ", remark='" + remark + '\'' + + ", tenantId='" + tenantId + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalRoleVO.java b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalRoleVO.java new file mode 100644 index 0000000000000000000000000000000000000000..1e03bdae85a4e30e0733dd3bb2ec5aadfb824581 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalRoleVO.java @@ -0,0 +1,120 @@ + + +package com.idcos.enterprise.portal.vo; + +import com.idcos.cloud.core.common.BaseLinkVO; + +import java.util.Arrays; +import java.util.Date; + +// auto generated imports + +/** + * 返回结果对象 {vo.className} + * <p>第一次由自动生成代码工具初始化,后续可以编辑,再次生成的时候不会进行覆盖</p> + * + * @author yanlv + * @version PortalRoleVO.java, v 1.1 2015-06-06 10:09:55 yanlv Exp $ + */ + +public class PortalRoleVO extends BaseLinkVO { + + private static final long serialVersionUID = 1L; + + private String id; + private String code; + private String name; + private String remark; + private Date gmtCreate; + private String isActive; + private String[] selGroups; + private String[] selUsers; + private String tenantId; + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getIsActive() { + return isActive; + } + + public void setIsActive(String isActive) { + this.isActive = isActive; + } + + public String[] getSelGroups() { + return selGroups; + } + + public void setSelGroups(String[] selGroups) { + this.selGroups = selGroups; + } + + public String[] getSelUsers() { + return selUsers; + } + + public void setSelUsers(String[] selUsers) { + this.selUsers = selUsers; + } + + public Date getGmtCreate() { + return gmtCreate; + } + + public void setGmtCreate(Date gmtCreate) { + this.gmtCreate = gmtCreate; + } + + @Override + public String toString() { + return "PortalRoleVO{" + + "id='" + id + '\'' + + ", code='" + code + '\'' + + ", name='" + name + '\'' + + ", remark='" + remark + '\'' + + ", gmtCreate=" + gmtCreate + + ", isActive='" + isActive + '\'' + + ", selGroups=" + Arrays.toString(selGroups) + + ", selUsers=" + Arrays.toString(selUsers) + + ", tenantId='" + tenantId + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalSysDictVO.java b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalSysDictVO.java new file mode 100644 index 0000000000000000000000000000000000000000..4b25801181e3fdca766d72dca144b90835961658 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalSysDictVO.java @@ -0,0 +1,71 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.vo; + +import com.idcos.cloud.core.common.BaseVO; + +/** + * @author Dana + * @version PortalSysDict.java, v1 2017/12/5 上午9:48 Dana Exp $$ + */ +public class PortalSysDictVO extends BaseVO { + private static final long serialVersionUID = 1L; + + private String typeCode; + + private String code; + + private String value; + + private String tenantId; + + private String remark; + + @Override + public String toString() { + return super.toString(); + } + + public String getTypeCode() { + return typeCode; + } + + public void setTypeCode(String typeCode) { + this.typeCode = typeCode; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalTenantVO.java b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalTenantVO.java new file mode 100644 index 0000000000000000000000000000000000000000..56db2e45556590bc6d6bd99d07dcd1fa449c0ed3 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalTenantVO.java @@ -0,0 +1,70 @@ +package com.idcos.enterprise.portal.vo; + +import com.idcos.cloud.core.common.BaseVO; + +import java.util.Date; + +/** + * @author GuanBin + * @version PortalDeptVO.java, v1 2017/9/26 下午3:05 GuanBin Exp $$ + */ +public class PortalTenantVO extends BaseVO { + private static final long serialVersionUID = 1L; + + private String id; + private String tenantId; + private String tenantName; + private Date gmtCreate; + private Date gmtModified; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getTenantName() { + return tenantName; + } + + public void setTenantName(String tenantName) { + this.tenantName = tenantName; + } + + 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 String toString() { + return "PortalTenantVO{" + + "id='" + id + '\'' + + ", tenantId='" + tenantId + '\'' + + ", tenantName='" + tenantName + '\'' + + ", gmtCreate=" + gmtCreate + + ", gmtModified=" + gmtModified + + '}'; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalTokenVO.java b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalTokenVO.java new file mode 100644 index 0000000000000000000000000000000000000000..891a917a36ddda043727e91e82a96035cf529619 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalTokenVO.java @@ -0,0 +1,123 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.vo; + +import com.idcos.cloud.core.common.BaseLinkVO; + +import java.util.Date; + +/** + * @author Dana + * @version PortalTokenVO.java, v1 2017/11/30 下午4:05 Dana Exp $$ + */ +public class PortalTokenVO extends BaseLinkVO { + private static final long serialVersionUID = 1L; + + private String id; + + private String name; + + private String loginId; + + private String tenantId; + + private String isActive; + + private Date expireTime; + + private Date gmtCreate; + + private Date gmtModified; + + private String remark; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getLoginId() { + return loginId; + } + + public void setLoginId(String loginId) { + this.loginId = loginId; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getIsActive() { + return isActive; + } + + public void setIsActive(String isActive) { + this.isActive = isActive; + } + + public Date getExpireTime() { + return expireTime; + } + + public void setExpireTime(Date expireTime) { + this.expireTime = expireTime; + } + + 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 getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + @Override + public String toString() { + return "PortalTokenVO{" + + "id='" + id + '\'' + + ", name='" + name + '\'' + + ", loginId='" + loginId + '\'' + + ", tenantId='" + tenantId + '\'' + + ", isActive='" + isActive + '\'' + + ", expireTime=" + expireTime + + ", gmtCreate=" + gmtCreate + + ", gmtModified=" + gmtModified + + ", remark='" + remark + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalUserGroupVO.java b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalUserGroupVO.java new file mode 100644 index 0000000000000000000000000000000000000000..00caa7d05faf1de0b4b40c52443f9a56693cd311 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalUserGroupVO.java @@ -0,0 +1,144 @@ +package com.idcos.enterprise.portal.vo; + +import com.idcos.cloud.core.common.BaseLinkVO; + +import java.util.Arrays; +import java.util.Date; + +/** + * 用户组界面展示类 + * + * @author jiaohuizhe + * @version $Id: PortalUserGroupVO.java, v 0.1 2015年5月8日 上午11:03:56 jiaohuizhe Exp $ + */ +public class PortalUserGroupVO extends BaseLinkVO { + + private static final long serialVersionUID = 1L; + + private String id; + + private String name; + + private String type; + + private String remark; + + private String isActive; + + private Date gmtCreate; + + private Date gmtModified; + + private String[] selRoles; + + private String[] selUsers; + + private String tenant; + + private String tenantName; + + public String getTenantName() { + return tenantName; + } + + public void setTenantName(String tenantName) { + this.tenantName = tenantName; + } + + public String getTenantId() { + return tenant; + } + + public void setTenantId(String tenantId) { + this.tenant = tenant; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getIsActive() { + return isActive; + } + + public void setIsActive(String isActive) { + this.isActive = isActive; + } + + public String[] getSelRoles() { + return selRoles; + } + + public void setSelRoles(String[] selRoles) { + this.selRoles = selRoles; + } + + public String[] getSelUsers() { + return selUsers; + } + + public void setSelUsers(String[] selUsers) { + this.selUsers = selUsers; + } + + 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 String toString() { + return "PortalUserGroupVO{" + + "id='" + id + '\'' + + ", name='" + name + '\'' + + ", type='" + type + '\'' + + ", remark='" + remark + '\'' + + ", isActive='" + isActive + '\'' + + ", gmtCreate=" + gmtCreate + + ", gmtModified=" + gmtModified + + ", selRoles=" + Arrays.toString(selRoles) + + ", selUsers=" + Arrays.toString(selUsers) + + ", tenant='" + tenant + '\'' + + ", tenantName='" + tenantName + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalUserImportVO.java b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalUserImportVO.java new file mode 100644 index 0000000000000000000000000000000000000000..185276ba2e73144d190acdf9a8be9d8072e6b1aa --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalUserImportVO.java @@ -0,0 +1,201 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.vo; + +import com.idcos.cloud.core.common.BaseVO; + +/** + * @author Dana + * @version PortalUserImportVO.java, v1 2017/12/22 上午9:45 Dana Exp $$ + */ +public class PortalUserImportVO extends BaseVO { + private static final long serialVersionUID = 1L; + + private String id; + + private String loginId; + + private String name; + + private String deptId; + + private String deptFullName; + + private String title; + + private String password; + + private String weixin; + + private String email; + + private String mobile1; + + private String mobile2; + + private String officeTel1; + + private String officeTel2; + + private String employeeType; + + private String tenantId; + + private String sourceType; + + private String remark; + + private String dataStatus; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getLoginId() { + return loginId; + } + + public void setLoginId(String loginId) { + this.loginId = loginId; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDeptId() { + return deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + + public String getDeptFullName() { + return deptFullName; + } + + public void setDeptFullName(String deptFullName) { + this.deptFullName = deptFullName; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getWeixin() { + return weixin; + } + + public void setWeixin(String weixin) { + this.weixin = weixin; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getMobile1() { + return mobile1; + } + + public void setMobile1(String mobile1) { + this.mobile1 = mobile1; + } + + public String getMobile2() { + return mobile2; + } + + public void setMobile2(String mobile2) { + this.mobile2 = mobile2; + } + + public String getOfficeTel1() { + return officeTel1; + } + + public void setOfficeTel1(String officeTel1) { + this.officeTel1 = officeTel1; + } + + public String getOfficeTel2() { + return officeTel2; + } + + public void setOfficeTel2(String officeTel2) { + this.officeTel2 = officeTel2; + } + + public String getEmployeeType() { + return employeeType; + } + + public void setEmployeeType(String employeeType) { + this.employeeType = employeeType; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getSourceType() { + return sourceType; + } + + public void setSourceType(String sourceType) { + this.sourceType = sourceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getDataStatus() { + return dataStatus; + } + + public void setDataStatus(String dataStatus) { + this.dataStatus = dataStatus; + } + + @Override + public String toString() { + return super.toString(); + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalUserVO.java b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalUserVO.java new file mode 100644 index 0000000000000000000000000000000000000000..e6b69fe32e816d8ed80791485924cd00afe3032e --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/vo/PortalUserVO.java @@ -0,0 +1,230 @@ +package com.idcos.enterprise.portal.vo; + +import com.idcos.cloud.core.common.BaseLinkVO; + +import java.util.Arrays; +import java.util.Date; + +/** + * 用户界面展示类 + * + * @author jiaohuizhe + * @version $Id: PortalUserVO.java, v 0.1 2015年5月8日 上午11:04:01 jiaohuizhe Exp $ + */ +public class PortalUserVO extends BaseLinkVO { + + private static final long serialVersionUID = 1L; + + private String id; + private String name; + private String deptId; + private String deptName; + private String email; + private String mobile1; + private String mobile2; + private String rtx; + private String officeTel1; + private String officeTel2; + private String employeeType; + private String title; + private String weixin; + private String remark; + private String isActive; + private String status; + private String tenantId; + private String[] selGroups; + private String[] selRoles; + private String loginId; + private String sourceType; + private Date lastLoginTime; + private Date lastModifiedTime; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDeptId() { + return deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getMobile1() { + return mobile1; + } + + public void setMobile1(String mobile1) { + this.mobile1 = mobile1; + } + + public String getMobile2() { + return mobile2; + } + + public void setMobile2(String mobile2) { + this.mobile2 = mobile2; + } + + public String getRtx() { + return rtx; + } + + public void setRtx(String rtx) { + this.rtx = rtx; + } + + public String getOfficeTel1() { + return officeTel1; + } + + public void setOfficeTel1(String officeTel1) { + this.officeTel1 = officeTel1; + } + + public String getOfficeTel2() { + return officeTel2; + } + + public void setOfficeTel2(String officeTel2) { + this.officeTel2 = officeTel2; + } + + public String getEmployeeType() { + return employeeType; + } + + public void setEmployeeType(String employeeType) { + this.employeeType = employeeType; + } + + public String getWeixin() { + return weixin; + } + + public void setWeixin(String weixin) { + this.weixin = weixin; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getIsActive() { + return isActive; + } + + public void setIsActive(String isActive) { + this.isActive = isActive; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String[] getSelGroups() { + return selGroups; + } + + public void setSelGroups(String[] selGroups) { + this.selGroups = selGroups; + } + + public String[] getSelRoles() { + return selRoles; + } + + public void setSelRoles(String[] selRoles) { + this.selRoles = selRoles; + } + + public String getLoginId() { + return loginId; + } + + public void setLoginId(String loginId) { + this.loginId = loginId; + } + + public Date getLastLoginTime() { + return lastLoginTime; + } + + public void setLastLoginTime(Date lastLoginTime) { + this.lastLoginTime = lastLoginTime; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getSourceType() { + return sourceType; + } + + public void setSourceType(String sourceType) { + this.sourceType = sourceType; + } + + public Date getLastModifiedTime() { + return lastModifiedTime; + } + + public void setLastModifiedTime(Date lastModifiedTime) { + this.lastModifiedTime = lastModifiedTime; + } + + @Override + public String toString() { + return super.toString(); + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/web/GlobalValue.java b/uam-server/src/main/java/com/idcos/enterprise/portal/web/GlobalValue.java new file mode 100644 index 0000000000000000000000000000000000000000..c76185bc9ca88e75fea6ffbf683e909fb3791163 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/web/GlobalValue.java @@ -0,0 +1,82 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2018 All Rights Reserved. + */ +package com.idcos.enterprise.portal.web; + +import com.alibaba.fastjson.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.annotation.PostConstruct; +import java.util.List; + +/** + * 统一管理使用配置文件的配置项 + * + * @author Xizhao.Dai + * @version GlobalValue.java, v1 2018/9/6 上午1:17 Xizhao.Dai Exp $$ + */ +public class GlobalValue { + private static final Logger logger = LoggerFactory.getLogger(GlobalValue.class); + + private String ssoLoginUrl; + + private String secretKey; + + private String appId; + + private List<String> ignoreUris; + + private String decryptKey; + + private String accessTimeout; + + private Boolean isMultiTenant; + + public GlobalValue(String ssoLoginUrl, String secretKey, String appId, List<String> ignoreUris, String decryptKey, + String accessTimeout, Boolean isMultiTenant) { + this.ssoLoginUrl = ssoLoginUrl; + this.secretKey = secretKey; + this.appId = appId; + this.ignoreUris = ignoreUris; + this.decryptKey = decryptKey; + this.accessTimeout = accessTimeout; + this.isMultiTenant = isMultiTenant; + } + + @PostConstruct + public void afterInit() { + logger.info("========== UAM_GlobalValue =========="); + logger.info(JSONObject.toJSONString(this)); + } + + public String getSsoLoginUrl() { + return ssoLoginUrl; + } + + public String getSecretKey() { + return secretKey; + } + + public String getAppId() { + return appId; + } + + public List<String> getIgnoreUris() { + return ignoreUris; + } + + public String getDecryptKey() { + return decryptKey; + } + + public String getAccessTimeout() { + return accessTimeout; + } + + public Boolean getMultiTenant() { + return isMultiTenant; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/web/JwtFilter.java b/uam-server/src/main/java/com/idcos/enterprise/portal/web/JwtFilter.java new file mode 100644 index 0000000000000000000000000000000000000000..cbfd971415ea107c0ccfc194ffdad279392e3105 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/web/JwtFilter.java @@ -0,0 +1,147 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2018 All Rights Reserved. + */ +package com.idcos.enterprise.portal.web; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.idcos.common.web.model.JwtToken; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.filter.GenericFilterBean; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static com.idcos.enterprise.portal.UamConstant.SLASH; + +/** + * @author Xizhao.Dai + * @version JwtFilter.java, v1 2018/9/5 下午9:17 Xizhao.Dai Exp $$ + */ +public class JwtFilter extends GenericFilterBean { + private final static Logger LOGGER = LoggerFactory.getLogger(JwtFilter.class); + + private String secretKey; + + private Map loginUrl = new HashMap(); + + private List<String> ignoreUris = new ArrayList<>(); + + public JwtFilter(String ssoLoginUrl, String secretKey) { + loginUrl.put("ssoWebUrl", ssoLoginUrl); + this.secretKey = secretKey; + LOGGER.debug("[JwtFilter]注入secretKey:" + secretKey); + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, + FilterChain filterChain) throws IOException, ServletException { + + final HttpServletRequest request = (HttpServletRequest) servletRequest; + HttpServletResponse response = (HttpServletResponse) servletResponse; + + if (verifyIgnoreAddressAndUri(servletRequest, servletResponse, filterChain, request)) { + return; + } + + String authHeader = request.getHeader("access-token"); + String accessToken = null; + if (StringUtils.isNotBlank(authHeader) && authHeader.startsWith("Bearer ")) { + //优先判断header中的token + accessToken = authHeader.substring(7); + if (StringUtils.isNotBlank(accessToken) && !StringUtils.equals(accessToken, "null")) { + LOGGER.info("从header中获取到accessToken:" + accessToken); + } else { + accessToken = null; + } + } + if (StringUtils.isBlank(accessToken)) { + //header中没有的情况下,从cookie获取 + Cookie[] cookies = request.getCookies(); + if (cookies == null || cookies.length == 0) { + LOGGER.debug("没有cookie"); + } else { + for (Cookie cookie : cookies) { + if ("access-token".equals(cookie.getName()) && StringUtils.isNotBlank(cookie.getValue())) { + accessToken = cookie.getValue(); + LOGGER.info("从cookie中获取到accessToken:" + accessToken); + break; + } + } + } + } + if (StringUtils.isNotEmpty(accessToken)) { + + JwtToken jwtToken = new JwtToken(accessToken); + if (jwtToken.verify(secretKey)) { + SecurityContextHolder.getContext().setAuthentication(jwtToken); + } + } else { + setLoginFailureStatus(response); + return; + } + + filterChain.doFilter(servletRequest, servletResponse); + } + + private ObjectMapper mapper = new ObjectMapper(); + + private void setLoginFailureStatus(HttpServletResponse response) throws IOException { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + response.setContentType("application/json;charset=UTF-8"); + RestResponse rsp = new RestResponse(); + rsp.setContent(loginUrl); + rsp.setStatus("fail"); + rsp.setMessage("会话超时或没有登录,请重新登录。"); + rsp.setStatusCode(ResponseStatusCode.RSP_STATUS_LOGINOUT); + PrintWriter writer = response.getWriter(); + writer.write(mapper.writeValueAsString(rsp)); + writer.close(); + } + + private boolean verifyIgnoreAddressAndUri(ServletRequest servletRequest, ServletResponse servletResponse, + FilterChain filterChain, + HttpServletRequest request) throws IOException, ServletException { + String uri = request.getRequestURI(); + if ("".equals(uri.trim()) || SLASH.equals(uri.trim())) { + filterChain.doFilter(servletRequest, servletResponse); + return true; + } + + for (String ignoreUri : ignoreUris) { + if (uri.startsWith(ignoreUri)) { + filterChain.doFilter(servletRequest, servletResponse); + return true; + } + if (uri.matches(".*\\.js$") || uri.matches(".*\\.css$") || uri.matches(".*\\.jpg$") + || uri.matches(".*\\.png$") || uri.matches(".*\\.svg$") || uri.matches(".*\\.jpeg$") || uri.matches(".*\\.json$") + || uri.matches(".*\\.txt$") || uri.matches(".*\\.ts$") || uri.matches(".*\\.ico$") + || uri.matches(".*\\.ttf$") || uri.matches(".*\\.woff$")) { + filterChain.doFilter(servletRequest, servletResponse); + return true; + } + } + return false; + } + + public void setIgnoreUris(List<String> ignoreUris) { + if (ignoreUris != null && ignoreUris.size() >= 0) { + this.ignoreUris.addAll(ignoreUris); + } + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/web/LocalAuthorizationProvider.java b/uam-server/src/main/java/com/idcos/enterprise/portal/web/LocalAuthorizationProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..1b975b8a9e592ac4842047ff9347208877ea9923 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/web/LocalAuthorizationProvider.java @@ -0,0 +1,47 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2016 All Rights Reserved. + */ +package com.idcos.enterprise.portal.web; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.alibaba.fastjson.JSON; +import com.idcos.common.web.model.BasicAuthorizationInfo; +import com.idcos.common.web.service.AuthorizationProvider; +import com.idcos.enterprise.portal.biz.common.PortalResponse; +import com.idcos.enterprise.portal.manager.auto.PortalRestfulService; + +/** + * @author zhouqin + * @version com.idcos.automate.web.LocalAuthorizationProvider.java, v 1.1 5/13/16 zhouqin Exp $ + */ +@Service +public class LocalAuthorizationProvider implements AuthorizationProvider { + + @Autowired + private GlobalValue globalValue; + + @Autowired + private PortalRestfulService portalRestfulService; + + @Override + public BasicAuthorizationInfo authorityContent(String accessToken) { + Claims claims = Jwts.parser().setSigningKey(globalValue.getSecretKey()).parseClaimsJws(accessToken).getBody(); + + String userId = (String) claims.get("userId"); + + PortalResponse portalResponse = portalRestfulService.queryAuthority(userId); + + BasicAuthorizationInfo basicAuthorizationInfo = JSON.parseObject(JSON.toJSONString(portalResponse.getContent()), + BasicAuthorizationInfo.class); + + return basicAuthorizationInfo; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/web/ResponseStatusCode.java b/uam-server/src/main/java/com/idcos/enterprise/portal/web/ResponseStatusCode.java new file mode 100644 index 0000000000000000000000000000000000000000..7cebb2264e719f38bab4e6e510aa877fa978f3cf --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/web/ResponseStatusCode.java @@ -0,0 +1,31 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.web; + +/** + * 返回状态码常量 + * + * @author xizhao.dai + * @version ResponseStatusCode.java, v1 2017/9/18 下午6:28 xizhao.dai Exp $$ + */ +public class ResponseStatusCode { + + /** + * 返回状态码 -- 正常状态 + */ + public final static String RSP_STATUS_NORMAL = "1000"; + + /** + * 返回状态码 -- 登录超时 + */ + public final static String RSP_STATUS_LOGINOUT = "7001"; + + /** + * 返回状态码 -- 非法请求token. + */ + public final static String RSP_STATUS_ILLEGAL_TOKEN = "7002"; + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/web/RestResponse.java b/uam-server/src/main/java/com/idcos/enterprise/portal/web/RestResponse.java new file mode 100644 index 0000000000000000000000000000000000000000..eed3c1801d3c4267cbe577464718af662adfa8f9 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/web/RestResponse.java @@ -0,0 +1,72 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.web; + +/** + * @author xizhao.dai + * @version RestResponse.java, v1 2017/9/18 下午6:28 xizhao.dai Exp $$ + */ +public class RestResponse { + + /** + * 返回调用操作是否有错误,代表状态码,成功success,失败fail + * <p> + * 此处理的错误主要是业务层面的错误信息。 + * </p> + */ + private String status; + + /** + * 返回信息,不管操作是否成功,都可以返回相应的信息。 + */ + private String message; + + /** + * 返回值,不管操作是否成功都可以返回相应的数据。 + */ + private Object content; + + /** + * 状态代码,用不同的数字标示不同的返回状态 + */ + private String statusCode = ResponseStatusCode.RSP_STATUS_NORMAL; + + public RestResponse() { + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Object getContent() { + return content; + } + + public void setContent(Object content) { + this.content = content; + } + + public String getStatusCode() { + return statusCode; + } + + public void setStatusCode(String statusCode) { + this.statusCode = statusCode; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/web/WebSecurityConfig.java b/uam-server/src/main/java/com/idcos/enterprise/portal/web/WebSecurityConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..9323082fd94e2f13554e01509766b95f5dfcb670 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/web/WebSecurityConfig.java @@ -0,0 +1,56 @@ + +package com.idcos.enterprise.portal.web; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.web.authentication.AnonymousAuthenticationFilter; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +import com.idcos.common.web.filter.AuthorizationFilter; +import com.idcos.common.web.service.AuthorizationProvider; + +/** + * @author zhouqin + * @version com.idcos.enterprise.portal.web.security.WebSecurityConfig.java, v 1.1 12/29/15 zhouqin Exp $ + */ +@Configuration +@EnableWebSecurity +@EnableGlobalMethodSecurity(securedEnabled = true) +public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + private GlobalValue globalValue; + + @Autowired + private AuthorizationProvider authorizationProvider; + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); + + JwtFilter jwtFilter = new JwtFilter(globalValue.getSsoLoginUrl(), globalValue.getSecretKey()); + jwtFilter.setIgnoreUris(globalValue.getIgnoreUris()); + http.addFilterAfter(jwtFilter, AnonymousAuthenticationFilter.class); + http.addFilterAfter(new AuthorizationFilter(authorizationProvider), JwtFilter.class); + + } + + @Bean + public WebMvcConfigurer corsConfigurer() { + return new WebMvcConfigurerAdapter() { + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**"); + } + }; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/web/auth/AuthController.java b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auth/AuthController.java new file mode 100644 index 0000000000000000000000000000000000000000..f92ae9295b66acfa32b173736a10732e7f925fa1 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auth/AuthController.java @@ -0,0 +1,62 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2016 All Rights Reserved. + */ +package com.idcos.enterprise.portal.web.auth; + +import com.alibaba.fastjson.JSONObject; +import com.idcos.common.service.vo.CommonRestResult; +import com.idcos.common.web.model.JwtToken; +import com.idcos.enterprise.portal.web.GlobalValue; +import io.swagger.annotations.Api; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AnonymousAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +/** + * @author zhouqin + * @version com.idcos.automate.web.controller.auth.AuthController.java, v 1.1 2/29/16 zhouqin Exp $ + */ +@RestController +@RequestMapping("/auth") +@Api(tags = "02.认证接口", description = "AuthController") +public class AuthController { + + @Autowired + private GlobalValue globalValue; + + @RequestMapping(method = RequestMethod.GET) + public CommonRestResult<?> currentUser() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (!authentication.isAuthenticated() || authentication instanceof AnonymousAuthenticationToken) { + CommonRestResult<Map> userResult = new CommonRestResult<>(); + userResult.setStatus("AUTH_FAILED"); + userResult.setMessage("未登录状态"); + return userResult; + } + JwtToken jwtToken = (JwtToken) authentication; + return new CommonRestResult<>(jwtToken); + } + + /** + * 判断是否是多租户 + * + * @return + */ + @RequestMapping(value = "/isMultiTenant", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") + public JSONObject isMultiTenant() { + JSONObject json = new JSONObject(); + json.put("status", "success"); + json.put("message", "isMultiTenant"); + json.put("content", globalValue.getMultiTenant()); + return json; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/PortalCommonController.java b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/PortalCommonController.java new file mode 100644 index 0000000000000000000000000000000000000000..44a0b7b2c3de9152204da87f58806488c6433bd7 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/PortalCommonController.java @@ -0,0 +1,66 @@ + + +package com.idcos.enterprise.portal.web.auto; + +// auto generated imports + +import io.swagger.annotations.Api; +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.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.idcos.cloud.biz.common.permisson.OperateAction; +import com.idcos.cloud.web.common.BaseResultVO; +import com.idcos.cloud.web.common.JsonResultUtil; +import com.idcos.enterprise.portal.manager.auto.PortalCommonQueryManager; + +/** + * 统一门户公共查询管理 + * web层controller相关的接口自动生成,此文件属于自动生成的,请勿直接修改,具体可以参考codegen工程 + * Generated by <tt>controller-codegen</tt> on 2015-08-21 10:22:49. + * + * @author yanlv + * @version PortalCommonController.java, v 1.1 2015-08-21 10:22:49 yanlv Exp $ + */ + +@Controller +@OperateAction("F_PORTAL_COMMON") +@RequestMapping(value = "/portal/common") +@Api(tags = "10.统一门户公共查询管理接口", description = "PortalCommonController") +public class PortalCommonController { + + //========== manager ========== + + @Autowired + private PortalCommonQueryManager portalCommonQueryManager; + + /** + * 获取所有角色信息 + * + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/roleListAction") + @ResponseBody + @OperateAction("O_PORTAL_COMMON_ROLELIST") + public BaseResultVO getRoleList() { + return JsonResultUtil.getResult(portalCommonQueryManager.getRoleList()); + + } + + /** + * 获取所有用户组信息 + * + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/userGroupListAction") + @ResponseBody + @OperateAction("O_PORTAL_COMMON_USERGROUPLIST") + public BaseResultVO getUserGroupList(@RequestParam("tenantId") String tenantId) { + return JsonResultUtil.getResult(portalCommonQueryManager.getUserGroupList(tenantId)); + + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/PortalDeptController.java b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/PortalDeptController.java new file mode 100644 index 0000000000000000000000000000000000000000..92e2edab177317572f5a33cc0fcf1f0883224035 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/PortalDeptController.java @@ -0,0 +1,87 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.web.auto; + +import com.idcos.cloud.biz.common.permisson.OperateAction; +import com.idcos.cloud.web.common.BaseResultVO; +import com.idcos.cloud.web.common.JsonResultUtil; +import com.idcos.enterprise.portal.form.PortalDeptAddForm; +import com.idcos.enterprise.portal.form.PortalDeptUpdateForm; +import com.idcos.enterprise.portal.manager.auto.PortalDeptOperateManager; +import com.idcos.enterprise.portal.manager.auto.PortalDeptQueryManager; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +/** + * 部门管理 + * + * @author souakiragen + * @version $Id: , v 0.1 2017年11月03 上午10:33 souakiragen Exp $ + */ +@Controller +@OperateAction("F_PORTAL_DEPT") +@RequestMapping(value = "/portal/dept") +@Api(tags = "05.部门管理的接口", description = "PortalDeptController") +public class PortalDeptController { + + @Autowired + private PortalDeptOperateManager portalDeptOperateManager; + + @Autowired + private PortalDeptQueryManager portalDeptQueryManager; + + @RequestMapping(method = RequestMethod.POST, value = "") + @ResponseBody + @OperateAction("ADD") + @ApiOperation(value = "新增部门", notes = "新增部门") + public BaseResultVO add(@ModelAttribute PortalDeptAddForm form) { + return JsonResultUtil.getResult(portalDeptOperateManager.add(form)); + } + + @RequestMapping(method = RequestMethod.PUT, value = "") + @ResponseBody + @OperateAction("update") + @ApiOperation(value = "修改部门", notes = "修改部门") + public BaseResultVO update(@ModelAttribute PortalDeptUpdateForm form) { + return JsonResultUtil.getResult(portalDeptOperateManager.update(form)); + } + + @RequestMapping(method = RequestMethod.DELETE, value = "/{id}") + @ResponseBody + @OperateAction("delete") + @ApiOperation(value = "删除部门", notes = "删除部门") + public BaseResultVO delete(@PathVariable String id) { + return JsonResultUtil.getResult(portalDeptOperateManager.delete(id)); + } + + @RequestMapping(method = RequestMethod.POST, value = "/roles/{id}", produces = "application/json;charset=utf-8") + @ResponseBody + @OperateAction("assign") + @ApiOperation(value = "分配角色", notes = "为部门分配角色") + public BaseResultVO assignRole(@PathVariable String id, @RequestParam String roleIds) { + return JsonResultUtil.getResult(portalDeptOperateManager.assignRole(id, roleIds)); + } + + @RequestMapping(method = RequestMethod.GET, value = "/roles/{id}") + @ResponseBody + @OperateAction("query") + @ApiOperation(value = "获取部门对应的角色", notes = "获取部门对应的角色") + public BaseResultVO queryRolesById(@PathVariable String id) { + return JsonResultUtil.getResult(portalDeptQueryManager.getRolesById(id)); + } + + @RequestMapping(method = RequestMethod.GET, value = "/{id}") + @ResponseBody + @OperateAction("query") + @ApiOperation(value = "获取部门信息", notes = "获取部门信息") + public BaseResultVO queryDeptById(@PathVariable String id) { + return JsonResultUtil.getResult(portalDeptQueryManager.getDeptById(id)); + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/PortalPermissionController.java b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/PortalPermissionController.java new file mode 100644 index 0000000000000000000000000000000000000000..a2157dfd4ddb30a1833705324e47568211b08d0d --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/PortalPermissionController.java @@ -0,0 +1,123 @@ + + +package com.idcos.enterprise.portal.web.auto; + +// auto generated imports + +import com.idcos.enterprise.portal.form.PortalPermissionSaveAuthResForm; +import io.swagger.annotations.Api; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import com.idcos.cloud.biz.common.permisson.OperateAction; +import com.idcos.cloud.web.common.BaseResultVO; +import com.idcos.cloud.web.common.JsonResultUtil; +import com.idcos.enterprise.portal.form.PortalPermissionQueryAuthObjForm; +import com.idcos.enterprise.portal.form.PortalPermissionQueryAuthResForm; +import com.idcos.enterprise.portal.form.PortalPermissionSaveAuthObjForm; +import com.idcos.enterprise.portal.manager.auto.PortalPermissionOperateManager; +import com.idcos.enterprise.portal.manager.auto.PortalPermissionQueryManager; + +import java.util.List; + +/** + * web层controller相关的接口自动生成,此文件属于自动生成的,请勿直接修改,具体可以参考codegen工程 + * Generated by <tt>controller-codegen</tt> on 2015-06-09 10:00:37. + * + * @author yanlv + * @version PortalPermissionController.java, v 1.1 2015-06-09 10:00:37 yanlv Exp $ + */ + +@Controller +@OperateAction("F_PORTAL_PERMISSION") +@RequestMapping(value = "/portal/permission") +@Api(tags = "08.权限授权管理的接口", description = "PortalPermissionController") +public class PortalPermissionController { + + //========== manager ========== + + @Autowired + private PortalPermissionQueryManager portalPermissionQueryManager; + + @Autowired + private PortalPermissionOperateManager portalPermissionOperateManager; + + /** + * 获取授权对象ID + * + * @param form + * @return ${method.returnType} + */ + + @RequestMapping(method = RequestMethod.GET, value = "/queryAuthObjAction") + @ResponseBody + @OperateAction("O_PORTAL_PERMISSION_GETOBJ") + public BaseResultVO queryAuthObj(PortalPermissionQueryAuthObjForm form) { + + return JsonResultUtil.getResult(portalPermissionQueryManager.queryAuthObj(form)); + + } + + /** + * 获取授权资源ID + * + * @param form + * @return ${method.returnType} + */ + + @RequestMapping(method = RequestMethod.GET, value = "/queryAuthResAction") + @ResponseBody + @OperateAction("O_PORTAL_PERMISSION_GETRES") + public BaseResultVO queryAuthRes(PortalPermissionQueryAuthResForm form) { + + return JsonResultUtil.getResult(portalPermissionQueryManager.queryAuthRes(form)); + + } + + /** + * 保存授权对象关系 + * + * @param form + * @return ${method.returnType} + */ + + @RequestMapping(method = RequestMethod.POST, value = "/saveAuthObjAction") + @ResponseBody + @OperateAction("O_PORTAL_PERMISSION_SAVEOBJ") + public BaseResultVO saveAuthObj(PortalPermissionSaveAuthObjForm form) { + + return JsonResultUtil.getResult(portalPermissionOperateManager.saveAuthObj(form)); + + } + + /** + * 保存授权资源关系 + * + * @param permissionInfo + * @return ${method.returnType} + */ + + @RequestMapping(method = RequestMethod.POST, value = "/saveAuthResAction") + @ResponseBody + @OperateAction("O_PORTAL_PERMISSION_SAVERES") + public BaseResultVO saveAuthRes(@RequestParam("permissionInfo") String permissionInfo) { + return JsonResultUtil.getResult(portalPermissionOperateManager.saveAuthRes(permissionInfo)); + } + + /** + * 绑定角色code和权限资源 + * + * @param tenantId + * @param roleCode + * @return ${method.returnType} + */ + + @RequestMapping(method = RequestMethod.POST, value = "/assignByRoleCode") + @ResponseBody + @OperateAction("O_PORTAL_PERMISSION_SAVERES") + public BaseResultVO assignByRoleCode(@RequestParam("tenantId") String tenantId, @RequestParam("roleCode") String roleCode, @RequestBody List<PortalPermissionSaveAuthResForm> perList) { + return JsonResultUtil.getResult(portalPermissionOperateManager.assignByRoleCode(tenantId, roleCode, perList)); + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/PortalResourceController.java b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/PortalResourceController.java new file mode 100644 index 0000000000000000000000000000000000000000..5e75056d14cf6930aded6f6423741f9505aee474 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/PortalResourceController.java @@ -0,0 +1,110 @@ + + +package com.idcos.enterprise.portal.web.auto; + +// auto generated imports + +import io.swagger.annotations.Api; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.idcos.cloud.biz.common.permisson.OperateAction; +import com.idcos.cloud.web.common.BaseResultVO; +import com.idcos.cloud.web.common.JsonResultUtil; +import com.idcos.enterprise.portal.form.PortalResourceCreateForm; +import com.idcos.enterprise.portal.form.PortalResourceUpdateForm; +import com.idcos.enterprise.portal.manager.auto.PortalResourceOperateManager; +import com.idcos.enterprise.portal.manager.auto.PortalResourceQueryManager; + +/** + * PortalResourceController + * 权限资源管理Controller + * + * @author pengganyu + * @version $Id: PortalResourceController.java, v 0.1 2016年5月11日 下午5:11:26 pengganyu Exp $ + */ +@Controller +@OperateAction("F_PORTAL_RESOURCE") +@RequestMapping(value = "/portal/res") +@Api(tags = "09.权限资源管理的接口", description = "PortalResourceController") +public class PortalResourceController { + + @Autowired + private PortalResourceQueryManager portalResourceQueryManager; + @Autowired + private PortalResourceOperateManager portalResourceOperateManager; + + /** + * 根据权限资源编码查询权限信息 + * + * @param code + * @return + */ + @RequestMapping(method = RequestMethod.GET, value = "/{code}") + @ResponseBody + @OperateAction("O_PORTAL_USER_GET") + public BaseResultVO queryByCode(@PathVariable String code) { + return JsonResultUtil.getResult(portalResourceQueryManager.queryByCode(code)); + + } + + /** + * 查询所有权限信息 + * + * @return + */ + @RequestMapping(method = RequestMethod.GET, value = "/all") + @ResponseBody + @OperateAction("O_PORTAL_USER_GET") + public BaseResultVO queryAll() { + return JsonResultUtil.getResult(portalResourceQueryManager.queryAll()); + + } + + /** + * 删除权限资源 + * + * @param id + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.DELETE, value = "/{id}") + @ResponseBody + @OperateAction("O_PORTAL_USER_DELETE") + public BaseResultVO delete(@PathVariable String id) { + return JsonResultUtil.getResult(portalResourceOperateManager.delete(id)); + } + + /** + * 更新权限资源 + * + * @param id + * @param form + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.PUT, value = "/{id}") + @ResponseBody + @OperateAction("O_PORTAL_USER_PUT") + public BaseResultVO update(@PathVariable String id, PortalResourceUpdateForm form) { + return JsonResultUtil.getResult(portalResourceOperateManager.update(id, form)); + + } + + /** + * 增加权限资源 + * + * @param form + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.POST, value = "/") + @ResponseBody + @OperateAction("O_PORTAL_USER_CREATE") + public BaseResultVO create(PortalResourceCreateForm form) { + return JsonResultUtil.getResult(portalResourceOperateManager.create(form)); + + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/PortalRoleController.java b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/PortalRoleController.java new file mode 100644 index 0000000000000000000000000000000000000000..2d6222b44425d40863c605d633ecf4bd47b3cec8 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/PortalRoleController.java @@ -0,0 +1,207 @@ + + +package com.idcos.enterprise.portal.web.auto; + +// auto generated imports + +import io.swagger.annotations.Api; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.idcos.cloud.biz.common.permisson.OperateAction; +import com.idcos.cloud.web.common.BaseResultVO; +import com.idcos.cloud.web.common.JsonResultUtil; +import com.idcos.enterprise.portal.form.PortalQueryByPageForm; +import com.idcos.enterprise.portal.form.PortalRoleCreateForm; +import com.idcos.enterprise.portal.form.PortalRoleQueryByPageForm; +import com.idcos.enterprise.portal.form.PortalRoleUpdateForm; +import com.idcos.enterprise.portal.manager.auto.PortalRoleOperateManager; +import com.idcos.enterprise.portal.manager.auto.PortalRoleQueryManager; + +/** + * 角色管理 + * web层controller相关的接口自动生成,此文件属于自动生成的,请勿直接修改,具体可以参考codegen工程 + * Generated by <tt>controller-codegen</tt> on 2015-10-30 15:00:49. + * + * @author jiaohuizhe + * @version PortalRoleController.java, v 1.1 2015-10-30 15:00:49 jiaohuizhe Exp $ + */ + +@Controller +@OperateAction("F_PORTAL_ROLE") +@RequestMapping(value = "/portal/role") +@Api(tags = "07.角色管理的接口", description = "PortalRoleController") +public class PortalRoleController { + + //========== manager ========== + + @Autowired + private PortalRoleQueryManager portalRoleQueryManager; + + @Autowired + private PortalRoleOperateManager portalRoleOperateManager; + + /** + * 分配用户组 + * + * @param id + * @param selGroups + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.POST, value = "/{id}/allocate/group") + @ResponseBody + @OperateAction("O_PORTAL_ROLE_POST") + public BaseResultVO allocateGroup(@PathVariable String id, + @RequestParam("selGroups") String selGroups) { + return JsonResultUtil.getResult(portalRoleOperateManager.allocateGroup(id, selGroups)); + + } + + /** + * 获取某个角色信息 + * + * @param id + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/{id}") + @ResponseBody + @OperateAction("O_PORTAL_ROLE_GET") + public BaseResultVO queryById(@PathVariable String id) { + return JsonResultUtil.getResult(portalRoleQueryManager.queryById(id)); + + } + + /** + * 获取某个角色用户信息 + * + * @param id + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/users/{id}") + @ResponseBody + @OperateAction("O_PORTAL_ROLE_GET") + public BaseResultVO queryUsersById(@PathVariable String id) { + return JsonResultUtil.getResult(portalRoleQueryManager.queryUsersById(id)); + + } + + /** + * 获取某个角色用户组信息 + * + * @param id + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/groups/{id}") + @ResponseBody + @OperateAction("O_PORTAL_ROLE_GET") + public BaseResultVO queryGroupsById(@PathVariable String id) { + return JsonResultUtil.getResult(portalRoleQueryManager.queryGroupsById(id)); + + } + + /** + * 获取某个角色权限信息 + * + * @param id + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/permissions/{id}") + @ResponseBody + @OperateAction("O_PORTAL_ROLE_GET") + public BaseResultVO queryPermissionsById(@PathVariable String id) { + return JsonResultUtil.getResult(portalRoleQueryManager.queryPermissionsById(id)); + + } + + /** + * 删除角色信息 + * + * @param id + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.DELETE, value = "/{id}") + @ResponseBody + @OperateAction("O_PORTAL_ROLE_DELETE") + public BaseResultVO delete(@PathVariable String id) { + return JsonResultUtil.getResult(portalRoleOperateManager.delete(id)); + + } + + /** + * 更新角色信息 + * + * @param id + * @param form + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.PUT, value = "/{id}") + @ResponseBody + @OperateAction("O_PORTAL_ROLE_UPDATE") + public BaseResultVO update(@PathVariable String id, PortalRoleUpdateForm form) { + return JsonResultUtil.getResult(portalRoleOperateManager.update(id, form)); + + } + + /** + * 查询角色信息 + * + * @param offset + * @param limit + * @param form + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/page/{offset}/{limit}") + @ResponseBody + @OperateAction("O_PORTAL_ROLE_PAGE") + public BaseResultVO queryByPage(@PathVariable String offset, @PathVariable String limit, + PortalRoleQueryByPageForm form) { + return JsonResultUtil.getResult(portalRoleQueryManager.queryByPage(offset, limit, form)); + + } + + /** + * 创建角色信息 + * + * @param form + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.POST, value = "/") + @ResponseBody + @OperateAction("O_PORTAL_ROLE_CREATE") + public BaseResultVO create(PortalRoleCreateForm form) { + return JsonResultUtil.getResult(portalRoleOperateManager.create(form)); + + } + + /** + * 查询用户组所关联的角色信息 + * + * @param id + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/page/group") + @ResponseBody + @OperateAction("O_PORTAL_ROLE_GET") + public BaseResultVO queryRolePageByGroupIdAndCnd(PortalQueryByPageForm form) { + return JsonResultUtil.getResult(portalRoleQueryManager.queryRolePageByGroupIdAndCnd(form)); + } + + /** + * 查询用户所关联的角色信息 + * + * @param id + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/page/user") + @ResponseBody + @OperateAction("O_PORTAL_ROLE_GET") + public BaseResultVO queryRolePageByUserIdAndCnd(PortalQueryByPageForm form) { + return JsonResultUtil.getResult(portalRoleQueryManager.queryRolePageByUserIdAndCnd(form)); + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/PortalTenantController.java b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/PortalTenantController.java new file mode 100644 index 0000000000000000000000000000000000000000..ee4ab7bca5cbd4efc76f60c7a24650f90b63f846 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/PortalTenantController.java @@ -0,0 +1,80 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.web.auto; + +import com.idcos.cloud.biz.common.permisson.OperateAction; +import com.idcos.cloud.web.common.BaseResultVO; +import com.idcos.cloud.web.common.JsonResultUtil; +import com.idcos.enterprise.portal.form.PortalTenantAddForm; +import com.idcos.enterprise.portal.form.PortalTenantQueryPageListForm; +import com.idcos.enterprise.portal.form.PortalTenantUpdateForm; +import com.idcos.enterprise.portal.manager.auto.PortalTenantManager; +import com.idcos.enterprise.portal.manager.auto.PortalTenantOperateManager; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +/** + * 租户管理 + * + * @author souakiragen + * @version $Id: , v 0.1 2017年11月07 上午9:09 souakiragen Exp $ + */ +@Controller +@OperateAction("F_PORTAL_TENANT") +@RequestMapping(value = "/portal/tenant") +@Api(tags = "06.租户管理的接口", description = "PortalTenantController") +public class PortalTenantController { + + @Autowired + private PortalTenantOperateManager portalTenantOperateManager; + + @Autowired + private PortalTenantManager portalTenantManager; + + @RequestMapping(method = RequestMethod.POST, value = "") + @ResponseBody + @OperateAction("ADD") + @ApiOperation(value = "新增租户", notes = "新增租户") + public BaseResultVO add(@ModelAttribute PortalTenantAddForm form) { + return JsonResultUtil.getResult(portalTenantOperateManager.add(form)); + } + + @RequestMapping(method = RequestMethod.GET, value = "/{id}") + @ResponseBody + @OperateAction("QUERY") + @ApiOperation(value = "获取租户信息", notes = "获取租户信息") + public BaseResultVO query(@PathVariable String id) { + return JsonResultUtil.getResult(portalTenantManager.getTenantInfo(id)); + } + + @RequestMapping(method = RequestMethod.GET, value = "/pageList/{pageNo}/{pageSize}") + @ResponseBody + @OperateAction("QUERY") + @ApiOperation(value = "获取分页数据", notes = "获取分页数据") + public BaseResultVO getPageList(@PathVariable int pageNo, @PathVariable int pageSize, + @ModelAttribute PortalTenantQueryPageListForm form) { + return JsonResultUtil.getResult(portalTenantManager.getPageList(pageNo, pageSize, form)); + } + + @RequestMapping(method = RequestMethod.PUT, value = "") + @ResponseBody + @OperateAction("UPDATE") + @ApiOperation(value = "更新租户", notes = "更新租户") + public BaseResultVO update(@ModelAttribute PortalTenantUpdateForm form) { + return JsonResultUtil.getResult(portalTenantOperateManager.update(form)); + } + + @RequestMapping(method = RequestMethod.DELETE, value = "/{id}") + @ResponseBody + @OperateAction("DELETE") + @ApiOperation(value = "删除租户", notes = "删除租户") + public BaseResultVO delete(@PathVariable String id) { + return JsonResultUtil.getResult(portalTenantOperateManager.delete(id)); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/PortalUserController.java b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/PortalUserController.java new file mode 100644 index 0000000000000000000000000000000000000000..7c3bfe24cd034b7fb26f3df2ebb6ef82b0d568b2 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/PortalUserController.java @@ -0,0 +1,370 @@ + + +package com.idcos.enterprise.portal.web.auto; + +// auto generated imports + +import com.alibaba.fastjson.JSONObject; +import com.idcos.cloud.biz.common.permisson.OperateAction; +import com.idcos.cloud.web.common.BaseResultVO; +import com.idcos.cloud.web.common.JsonResultUtil; +import com.idcos.enterprise.portal.form.*; +import com.idcos.enterprise.portal.manager.auto.PortalUserOperateManager; +import com.idcos.enterprise.portal.manager.auto.PortalUserQueryManager; +import com.idcos.enterprise.portal.web.auto.excelfilehandler.UserExcelFileHandler; +import com.idcos.enterprise.portal.web.auto.excelfilehandler.UserExcelTempleteHandler; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * 用户管理 + * web层controller相关的接口自动生成,此文件属于自动生成的,请勿直接修改,具体可以参考codegen工程 + * Generated by <tt>controller-codegen</tt> on 2015-11-07 16:44:40. + * + * @author jiaohuizhe + * @version PortalUserController.java, v 1.1 2015-11-07 16:44:40 jiaohuizhe Exp $ + */ + +@Controller +@OperateAction("F_PORTAL_USER") +@RequestMapping(value = "/portal/user") +@Api(tags = "03.用户管理的接口", description = "PortalUserController") +public class PortalUserController { + + //========== manager ========== + + @Autowired + private PortalUserQueryManager portalUserQueryManager; + + @Autowired + private PortalUserOperateManager portalUserOperateManager; + + @Autowired + private UserExcelFileHandler userExcelFileHandler; + + @Autowired + private UserExcelTempleteHandler userExcelTempleteHandler; + + /** + * 获取某用户信息 + * + * @param id + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/{id}") + @ResponseBody + @OperateAction("O_PORTAL_USER_GET") + public BaseResultVO queryById(@PathVariable String id) { + return JsonResultUtil.getResult(portalUserQueryManager.queryById(id)); + + } + + /** + * 获取某用户权限信息 + * + * @param id + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/permissions/{id}") + @ResponseBody + @OperateAction("O_PORTAL_USER_GET") + public JSONObject queryPermissionsById(@PathVariable String id, + @RequestParam(name = "appId", required = false) String appId) { + JSONObject json = new JSONObject(); + json.put("status", "success"); + json.put("message", "null"); + json.put("content", portalUserQueryManager.queryPermissionsById(id, appId).getResultObject()); + return json; + + } + + /** + * 获取某用户角色信息 + * + * @param id + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/roles/{id}") + @ResponseBody + @OperateAction("O_PORTAL_USER_GET") + public BaseResultVO queryRolesById(@PathVariable String id) { + return JsonResultUtil.getResult(portalUserQueryManager.queryRolesById(id)); + + } + + /** + * 获取某用户用户组信息 + * + * @param id + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/groups/{id}") + @ResponseBody + @OperateAction("O_PORTAL_USER_GET") + public JSONObject queryGroupsById(@PathVariable String id) { + JSONObject json = new JSONObject(); + json.put("status", "success"); + json.put("message", "null"); + json.put("content", portalUserQueryManager.queryGroupsById(id)); + return json; + } + + /** + * 分配用户组 + * + * @param form + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.POST, value = "/") + @ResponseBody + @OperateAction("O_PORTAL_USER_CREATE") + public BaseResultVO allocateGroup(PortalUserAllocateGroupForm form) { + return JsonResultUtil.getResult(portalUserOperateManager.allocateGroup(form)); + + } + + /** + * 查询用户组关联的用户信息 + * + * @param form + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/page/group") + @ResponseBody + @OperateAction("O_PORTAL_USER_GET") + public BaseResultVO queryUserPageByGroupIdAndCnd(PortalQueryByPageForm form) { + return JsonResultUtil.getResult(portalUserQueryManager.queryUserPageByGroupIdAndCnd(form)); + + } + + /** + * 查询角色关联的用户信息 + * + * @param form + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/page/role") + @ResponseBody + @OperateAction("O_PORTAL_USER_GET") + public BaseResultVO queryUserPageByRoleIdAndCnd(PortalQueryByPageForm form) { + return JsonResultUtil.getResult(portalUserQueryManager.queryUserPageByRoleIdAndCnd(form)); + + } + + /** + * 新增用户 + */ + @RequestMapping(method = RequestMethod.POST, value = "/add") + @ResponseBody + @OperateAction("ADD") + @ApiOperation(value = "新增用户", notes = "新增用户。") + public BaseResultVO add(@ModelAttribute PortalUserAddForm form) { + return JsonResultUtil.getResult(portalUserOperateManager.add(form)); + } + + /** + * 编辑用户 + */ + @RequestMapping(method = RequestMethod.PUT, value = "") + @ResponseBody + @OperateAction("UPDATE") + @ApiOperation(value = "修改用户", notes = "修改用户信息。") + public BaseResultVO update(@ModelAttribute PortalUserUpdateForm form) { + return JsonResultUtil.getResult(portalUserOperateManager.update(form)); + } + + /** + * 激活用户 + */ + @RequestMapping(method = RequestMethod.PUT, value = "/enabled/{id}") + @ResponseBody + @OperateAction("ENABLED") + @ApiOperation(value = "激活用户", notes = "激活用户。") + public BaseResultVO enabled(@PathVariable String id) { + return JsonResultUtil.getResult(portalUserOperateManager.enabled(id)); + } + + /** + * 禁用用户 + */ + @RequestMapping(method = RequestMethod.PUT, value = "/disabled/{id}") + @ResponseBody + @OperateAction("DISABLED") + @ApiOperation(value = "禁用用户", notes = "禁用用户。") + public BaseResultVO disabled(@PathVariable String id) { + return JsonResultUtil.getResult(portalUserOperateManager.disabled(id)); + } + + /** + * 删除用户 + */ + @RequestMapping(method = RequestMethod.DELETE, value = "/{id}") + @ResponseBody + @OperateAction("DELETE") + @ApiOperation(value = "删除用户", notes = "删除用户。") + public BaseResultVO delete(@PathVariable String id) { + return JsonResultUtil.getResult(portalUserOperateManager.delete(id)); + } + + /** + * 查询用户列表 + * + * @param form + * @return + */ + @RequestMapping(method = RequestMethod.GET, value = "/pageList") + @ResponseBody + @OperateAction("query") + @ApiOperation(value = "分页查询用户列表", notes = "分页查询用户列表") + public BaseResultVO queryPagelist(@ModelAttribute PortalUserQueryPageListForm form) { + return JsonResultUtil.getResult(portalUserQueryManager.queryPageList(form)); + } + + /** + * 重置用户密码 + * + * @param userId + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.POST, value = "/resetPW") + @ResponseBody + public BaseResultVO resetPassword(@RequestParam String userId) { + return JsonResultUtil.getResult(portalUserOperateManager.resetPassword(userId)); + } + + /** + * 修改用户密码 + * + * @param form + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.POST, value = "/modifyPW") + @ResponseBody + public BaseResultVO modifyPassword(@RequestBody ModifyPasswordForm form) { + return JsonResultUtil.getResult(portalUserOperateManager.modifyPassword(form)); + } + + /** + * 禁用token + * + * @param tokenId + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.POST, value = "/forbiddenToken") + @ResponseBody + public BaseResultVO forbiddenToken(@RequestParam String tokenId) { + return JsonResultUtil.getResult(portalUserOperateManager.forbiddenToken(tokenId)); + } + + /** + * 查询未过期token + * + * @param tenantId,loginId + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.POST, value = "/listToken") + @ResponseBody + public BaseResultVO listToken(@RequestParam String tenantId, @RequestParam String loginId) { + return JsonResultUtil.getResult(portalUserOperateManager.listTokenByTenantIdAndLoginId(tenantId, loginId)); + } + + /** + * 查询用户状态 + * + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/status") + @ResponseBody + public BaseResultVO getStatus() { + return JsonResultUtil.getResult(portalUserQueryManager.getUserStatus()); + } + + /** + * 上传用户数据的EXCEL,excel内容存入缓存 + * + * @param request 请求 + * @return 返回请求处理结果。 + */ + @ApiOperation(value = "上传用户数据的EXCEL,存入缓存", notes = "上传用户列表EXCEL。") + @RequestMapping(value = "/upload_users", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + @ResponseBody + public BaseResultVO uploadUsers(HttpServletRequest request, @RequestParam String tenantId) { + return JsonResultUtil.getResult(userExcelFileHandler.processUploadFile(request, tenantId)); + } + + /** + * 根据excel名,返回上传预览 + * + * @param fileName excel文件名 + * @return 返回请求处理结果。 + */ + @ApiOperation(value = "根据excel名,返回上传预览", notes = "根据excel名,返回上传预览。") + @RequestMapping(value = "/importPriview/fileName", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") + @ResponseBody + public BaseResultVO getUsersByExcelFileName(@RequestParam String fileName) { + return JsonResultUtil.getResult(userExcelFileHandler.getUsersByExcelFileName(fileName)); + } + + /** + * 导入预览中的合法数据,并删除用户列表缓存 + * + * @param fileName excel文件名 + * @return 返回请求处理结果。 + */ + @ApiOperation(value = "导入预览中的合法数据,并删除用户列表缓存", notes = "导入预览中的合法数据,并删除用户列表缓存。") + @RequestMapping(value = "/importPriview/fileName", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + @ResponseBody + public BaseResultVO saveImportUsers(@RequestParam String fileName) { + return JsonResultUtil.getResult(userExcelFileHandler.saveUsersByExcelFileName(fileName)); + } + + /** + * 取消导入,直接删除用户列表缓存 + * + * @param fileName excel文件名 + * @return 返回请求处理结果。 + */ + @ApiOperation(value = "取消导入,直接删除用户列表缓存", notes = "取消导入,直接删除用户列表缓存") + @RequestMapping(value = "/importPriview/fileName", method = RequestMethod.DELETE, produces = "application/json; charset=UTF-8") + @ResponseBody + public BaseResultVO removeImportUsers(@RequestParam String fileName) { + return JsonResultUtil.getResult(userExcelFileHandler.removeUsersByExcelFileName(fileName)); + } + + /** + * 下载用户信息模板。 + * + * @param request 请求 + * @param response 响应 + * @throws Exception + * @throws IOException + */ + @ApiOperation(value = "下载用户信息模板的接口", notes = "下载用户信息模板的EXCEL。") + @RequestMapping(value = "/templete/download", method = RequestMethod.GET) + public void downloadUserTemplet(HttpServletRequest request, HttpServletResponse response) throws Exception { + userExcelTempleteHandler.downloadTemplete(request, response); + } + + /** + * 下载用户列表。 + * + * @param request 请求 + * @param response 响应 + * @throws Exception + * @throws IOException + */ + @ApiOperation(value = "下载用户列表的接口", notes = "下载用户列表的EXCEL。") + @RequestMapping(value = "/list/download", method = RequestMethod.GET) + public void downloadUserList(HttpServletRequest request, HttpServletResponse response, @RequestParam String deptId, + @RequestParam("tenantId") String tenantId) throws Exception { + userExcelTempleteHandler.downloadData(response, deptId, tenantId); + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/PortalUserGroupController.java b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/PortalUserGroupController.java new file mode 100644 index 0000000000000000000000000000000000000000..30562f28dda2d81cd6d2bde258a9c866453941b1 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/PortalUserGroupController.java @@ -0,0 +1,248 @@ + + +package com.idcos.enterprise.portal.web.auto; + +// auto generated imports + +import com.idcos.cloud.biz.common.permisson.OperateAction; +import com.idcos.cloud.core.common.util.StringUtil; +import com.idcos.cloud.web.common.BaseResultVO; +import com.idcos.cloud.web.common.JsonResultUtil; +import com.idcos.enterprise.portal.form.PortalQueryByPageForm; +import com.idcos.enterprise.portal.form.PortalUserGroupQueryByPageForm; +import com.idcos.enterprise.portal.manager.auto.PortalUserGroupOperateManager; +import com.idcos.enterprise.portal.manager.auto.PortalUserGroupQueryManager; +import io.swagger.annotations.Api; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +/** + * 用户组管理 + * web层controller相关的接口自动生成,此文件属于自动生成的,请勿直接修改,具体可以参考codegen工程 + * Generated by <tt>controller-codegen</tt> on 2015-10-28 14:17:42. + * + * @author jiaohuizhe + * @version PortalUserGroupController.java, v 1.1 2015-10-28 14:17:42 jiaohuizhe Exp $ + */ + +@Controller +@OperateAction("F_PORTAL_USERGROUP") +@RequestMapping(value = "/portal/usergroup") +@Api(tags = "04.用户组管理的接口", description = "PortalUserGroupController") +public class PortalUserGroupController { + + //========== manager ========== + + @Autowired + private PortalUserGroupQueryManager portalUserGroupQueryManager; + + @Autowired + private PortalUserGroupOperateManager portalUserGroupOperateManager; + + /** + * 分配角色信息 + * + * @param id + * @param selectRoles + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.POST, value = "/{id}/allocate/role") + @ResponseBody + @OperateAction("O_PORTAL_USERGROUP_CREATE") + public BaseResultVO allocateRole(@PathVariable String id, @RequestParam("selectRoles") String selectRoles) { + return JsonResultUtil.getResult(portalUserGroupOperateManager.allocateRole(id, selectRoles)); + + } + + /** + * 分配用户信息 + * + * @param id + * @param selectUsers + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.POST, value = "/{id}/allocate/user") + @ResponseBody + @OperateAction("O_PORTAL_USERGROUP_CREATE") + public BaseResultVO allocateUser(@PathVariable String id, @RequestParam("selectUsers") String selectUsers) { + return JsonResultUtil.getResult(portalUserGroupOperateManager.allocateUser(id, selectUsers)); + + } + + /** + * 获取某用户组角色信息 + * + * @param id + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/roles/{id}") + @ResponseBody + @OperateAction("O_PORTAL_USERGROUP_GET") + public BaseResultVO queryRolesById(@PathVariable String id) { + return JsonResultUtil.getResult(portalUserGroupQueryManager.queryRolesById(id)); + + } + + /** + * 获取某用户组权限信息 + * + * @param id + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/permissions/{id}") + @ResponseBody + @OperateAction("O_PORTAL_USERGROUP_GET") + public BaseResultVO queryPermissionsById(@PathVariable String id) { + return JsonResultUtil.getResult(portalUserGroupQueryManager.queryPermissionsById(id)); + + } + + /** + * 获取某用户组用户列表 + * + * @param id + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/users/{id}") + @ResponseBody + @OperateAction("O_PORTAL_USERGROUP_GET") + public BaseResultVO queryUsresById(@PathVariable String id) { + return JsonResultUtil.getResult(portalUserGroupQueryManager.queryUsersById(id)); + + } + + /** + * 查询用户所关联的用户组信息 + * + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/page/user") + @ResponseBody + @OperateAction("O_PORTAL_USERGROUP_GET") + public BaseResultVO queryGroupPageByUserIdAndCnd(PortalQueryByPageForm form) { + return JsonResultUtil.getResult(portalUserGroupQueryManager.queryGroupPageByUserIdAndCnd(form)); + + } + + /** + * 查询角色所关联的用户组信息 + * + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/page/role") + @ResponseBody + @OperateAction("O_PORTAL_USERGROUP_GET") + public BaseResultVO queryGroupPageByRoleIdAndCnd(PortalQueryByPageForm form) { + return JsonResultUtil.getResult(portalUserGroupQueryManager.queryGroupPageByRoleIdAndCnd(form)); + } + + /** + * 获取某用户组信息 + * + * @param id + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/{id}") + @ResponseBody + @OperateAction("O_PORTAL_USERGROUP_GET") + public BaseResultVO queryById(@PathVariable String id) { + return JsonResultUtil.getResult(portalUserGroupQueryManager.queryById(id)); + + } + + /** + * 删除用户组 + * + * @param id + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.DELETE, value = "/{id}") + @ResponseBody + @OperateAction("O_PORTAL_USERGROUP_DELETE") + public BaseResultVO delete(@PathVariable String id) { + return JsonResultUtil.getResult(portalUserGroupOperateManager.delete(id)); + + } + + /** + * 更新用户组 + * + * @param id + * @param name + * @param remark + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.PUT, value = "/{id}") + @ResponseBody + @OperateAction("O_PORTAL_USERGROUP_PUT") + public BaseResultVO update(@PathVariable String id, @RequestParam("name") String name, + @RequestParam(name = "type", required = false) String type, + @RequestParam("remark") String remark) { + return JsonResultUtil.getResult(portalUserGroupOperateManager.update(id, name, type, remark)); + + } + + /** + * 查询用户组信息 + * + * @param offset + * @param limit + * @param form + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/page/{offset}/{limit}") + @ResponseBody + @OperateAction("O_PORTAL_USERGROUP_PAGE") + public BaseResultVO queryByPage(@PathVariable String offset, @PathVariable String limit, + PortalUserGroupQueryByPageForm form, @RequestParam("cnd") String cnd) { + BaseResultVO resultVO = JsonResultUtil.getResult(portalUserGroupQueryManager.queryByPage(offset, limit, form, cnd)); + + return resultVO; + + } + + /** + * 创建用户组信息 + * + * @param name + * @param remark + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.POST, value = "/") + @ResponseBody + @OperateAction("O_PORTAL_USERGROUP_CREATE") + public BaseResultVO create(@RequestParam("tenantId") String tenant, @RequestParam("name") String name, + @RequestParam(name = "type", required = false) String type, + @RequestParam("remark") String remark) { + return JsonResultUtil.getResult(portalUserGroupOperateManager.create(tenant, name, type, remark)); + + } + + /** + * 查询字典表用户组类型 + * + * @param tenantId + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/userGroupType") + @ResponseBody + public BaseResultVO getUserGroupType(@RequestParam("tenantId") String tenantId) { + BaseResultVO resultVO = JsonResultUtil.getResult(portalUserGroupQueryManager.getUserGroupType(tenantId)); + return resultVO; + } + + /** + * 根据用户组type和租户id查询用户组集合 + * + * @param type + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "/group/type/tenantId") + @ResponseBody + public BaseResultVO queryGroupByTypeAndTenantId(@RequestParam(name = "type", required = false) String type, @RequestParam String tenantId) { + return JsonResultUtil.getResult(portalUserGroupQueryManager + .queryGroupByTypeAndTenantId(StringUtil.isBlank(type) ? "default" : type, tenantId)); + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/excelfilehandler/ExcelImportException.java b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/excelfilehandler/ExcelImportException.java new file mode 100644 index 0000000000000000000000000000000000000000..26e54e5b1575a1aac10096ce0232c0e40f16c1a8 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/excelfilehandler/ExcelImportException.java @@ -0,0 +1,56 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.web.auto.excelfilehandler; + +/** + * @author Dana + * @version ServiceException.java, v1 2017/12/10 下午6:14 Dana Exp $$ + */ +public class ExcelImportException extends Exception { + + /** + * serialUID. + */ + private static final long serialVersionUID = -7902772542663897926L; + + /** + * + */ + public ExcelImportException() { + } + + /** + * @param message + */ + public ExcelImportException(String message) { + super(message); + } + + /** + * @param cause + */ + public ExcelImportException(Throwable cause) { + super(cause); + } + + /** + * @param message + * @param cause + */ + public ExcelImportException(String message, Throwable cause) { + super(message, cause); + } + + /** + * @param message + * @param cause + * @param enableSuppression + * @param writableStackTrace + */ + public ExcelImportException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/excelfilehandler/ExcelUtil.java b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/excelfilehandler/ExcelUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..a8706b1f2b541270610c1b0a05294f49f84c6f64 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/excelfilehandler/ExcelUtil.java @@ -0,0 +1,77 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.web.auto.excelfilehandler; + +import org.apache.poi.hssf.usermodel.HSSFDateUtil; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.Cell; + +import java.text.SimpleDateFormat; + +/** + * 操作EXCEL的工具类 + * + * @author Dana + * @version ExcelUtil.java, v1 2017/12/10 下午6:10 Dana Exp $$ + */ +public class ExcelUtil { + + /** + * + */ + private ExcelUtil() { + } + + public static final String getValueFromCell(Cell cell) { + if (cell == null) { + return null; + } + String value; + switch (cell.getCellType()) { + case NUMERIC: + // 数字 + if (HSSFDateUtil.isCellDateFormatted(cell)) { + // 如果是日期类型 + value = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(cell.getDateCellValue()); + } else { + cell.setCellType(CellType.STRING); + value = cell.getStringCellValue(); + } + break; + case STRING: + // 字符串 + value = cell.getStringCellValue(); + break; + case FORMULA: + // 用数字方式获取公式结果,根据值判断是否为日期类型 + double numericValue = cell.getNumericCellValue(); + if (HSSFDateUtil.isValidExcelDate(numericValue)) { + // 如果是日期类型 + value = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(cell.getDateCellValue()); + } else { + value = String.valueOf(numericValue); + } + break; + case BLANK: + // 空白 + value = ""; + break; + case BOOLEAN: + // Boolean + value = String.valueOf(cell.getBooleanCellValue()); + break; + case ERROR: + // Error,返回错误码 + value = String.valueOf(cell.getErrorCellValue()); + break; + default: + value = ""; + break; + } + // 使用[]记录坐标 + return value; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/excelfilehandler/UploadFileUtils.java b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/excelfilehandler/UploadFileUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..6e9f8ea2df0fbd9310a7c85f1ee0a5ce48a19ee3 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/excelfilehandler/UploadFileUtils.java @@ -0,0 +1,76 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.web.auto.excelfilehandler; + +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.multipart.commons.CommonsMultipartResolver; + +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * 文件上传工具类 + * + * @author Dana + * @version UploadFileUtils.java, v1 2017/12/10 下午6:04 Dana Exp $$ + */ +public class UploadFileUtils { + + /** + * + */ + private UploadFileUtils() { + } + + /** + * 根据上传请求得到其中上传的文件。 + * + * @param request 上传的请求对象。 + * @return 返回上传文件列表。 + */ + public static MultipartFile[] getUploadFile(HttpServletRequest request) { + //创建一个通用的多部分解析器 + CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver( + request.getSession().getServletContext()); + + List<MultipartFile> fileList = new ArrayList<MultipartFile>(); + //判断 request 是否有文件上传,即多部分请求 + if (multipartResolver.isMultipart(request)) { + //转换成多部分request + MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request; + //取得request中的所有文件名 + Iterator<String> iter = multiRequest.getFileNames(); + while (iter.hasNext()) { + + //取得上传文件 + MultipartFile file = multiRequest.getFile(iter.next()); + if (file != null) { + fileList.add(file); + } + + } + } + return fileList.toArray(new MultipartFile[0]); + } + + /** + * 返回上传的文件中第一个文件。 + * + * @param request + * @return + */ + public static MultipartFile getFirstUploadFile(HttpServletRequest request) { + MultipartFile[] files = getUploadFile(request); + + if (files.length > 0) { + return files[0]; + } + return null; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/excelfilehandler/UserExcelFileHandler.java b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/excelfilehandler/UserExcelFileHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..0a5e3cc74dff07ac3ea680050996dcc1139b8724 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/excelfilehandler/UserExcelFileHandler.java @@ -0,0 +1,597 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.web.auto.excelfilehandler; + +import com.idcos.cloud.biz.common.check.CommonParamtersChecker; +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.cloud.core.common.util.ListUtil; +import com.idcos.cloud.core.common.util.StringUtil; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessQueryCallback; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessQueryTemplate; +import com.idcos.enterprise.portal.biz.common.utils.Base64Util; +import com.idcos.enterprise.portal.biz.common.utils.PasswordUtil; +import com.idcos.enterprise.portal.biz.common.utils.SourceTypeUtil; +import com.idcos.enterprise.portal.dal.entity.PortalDept; +import com.idcos.enterprise.portal.dal.entity.PortalUser; +import com.idcos.enterprise.portal.dal.enums.ArrayNumEnum; +import com.idcos.enterprise.portal.dal.enums.PortalUserStatusEnum; +import com.idcos.enterprise.portal.dal.repository.PortalDeptRepository; +import com.idcos.enterprise.portal.dal.repository.PortalUserRepository; +import com.idcos.enterprise.portal.vo.PortalUserImportVO; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.poifs.filesystem.POIFSFileSystem; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.util.*; + +import static com.idcos.enterprise.portal.UamConstant.SLASH; +import static com.idcos.enterprise.portal.UamConstant.STAR; + +/** + * @author Dana + * @version UserExcelFileHandler.ava, v1 2017/12/10 下午6:08 Dana Exp $$ + */ +@Service +public class UserExcelFileHandler { + private static final Logger log = LoggerFactory.getLogger(UserExcelFileHandler.class); + + @Autowired + private PortalUserRepository portalUserRepository; + + @Autowired + private PortalDeptRepository portalDeptRepository; + + @Autowired + private BusinessQueryTemplate businessQueryTemplate; + + /** + * 用户导入的excel表头模板 + */ + private static final String[] USER_COLUMNS = {"登录名", "姓名", "具体部门名称", "职务", "密码", "邮箱", "移动电话", "办公电话", "数据来源", "备注"}; + + /** + * 当前上传文件的文件名称 + */ + private String fileName; + + /** + * 当前上传文件的文件名称 + */ + private final String fileType = ".xls"; + + /** + * step1:处理上传文件请求request。 + * + * @param request + * @return + */ + public CommonResult<?> processUploadFile(final HttpServletRequest request, final String tenantId) { + return businessQueryTemplate.process(new BusinessQueryCallback<String>() { + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(tenantId); + } + + @Override + public String doQuery() { + //获得上传的文件 + MultipartFile file = UploadFileUtils.getFirstUploadFile(request); + if (file == null) { + log.warn("上传的文件为空。"); + throw new RuntimeException("上传的文件为空。"); + } + //取得当前上传文件的文件名称 + fileName = file.getOriginalFilename(); + log.info("Received upload file: " + fileName); + if (StringUtil.isBlank(fileName)) { + log.error(String.format("Upload file is empty. ")); + throw new RuntimeException("上传的文件为空。"); + } + //检查文件类型,如果后缀不为.xls则报错 + if (!fileName.toLowerCase().endsWith(fileType)) { + log.info(String.format("Upload file is not a valid Excel file: ", fileName)); + throw new RuntimeException("上传的文件不是Excel文件:" + fileName); + } + //记录上传过程起始时的时间,用来计算上传时间 + long pre = System.currentTimeMillis(); + try { + //-->step2:解析上传的excel数据文件。 + parseFile(file, tenantId); + //如果解析过程中发现内容有错,则直接返回给客户端处理。 + //TODO + } catch (IOException e) { + log.info("Upload file read error.", e); + throw new RuntimeException(String.format("读取上传文件:%s时出错,原因:%s。", fileName, e.getMessage())); + } catch (Exception e) { + log.info("Process data failed", e); + throw new RuntimeException(String.format("处理上传文件数据时出错,原因:%s。", e.getMessage())); + } + + //记录上传该文件后的时间 + long finalTime = System.currentTimeMillis(); + log.info("Parsed file: {}, elapsed time :{}ms.", fileName, finalTime - pre); + return fileName; + } + }); + } + + /** + * step2:解析上传的excel数据文件。 + */ + public void parseFile(MultipartFile file, String tenantId) throws IOException { + POIFSFileSystem fs = new POIFSFileSystem(file.getInputStream()); + HSSFWorkbook workbook = new HSSFWorkbook(fs); + //只读取第一个sheet页。 + String sn = workbook.getSheetName(0); + try { + + log.info("Parsing and process user of {}...", sn); + Sheet sheet = workbook.getSheetAt(0); + //-->step3:读取每个sheet中的数据。 + readSheet(sheet, tenantId); + } catch (ExcelImportException e) { + log.error(String.format("Parse sheet:%s failed.", sn), e); + } + workbook.close(); + } + + /** + * step3:读取每个sheet中的数据。 + * + * @param sheet Sheet实例。 + * @return + * @throws ExcelImportException 如果插入或更新excel时出错抛出此异常。 + */ + private void readSheet(Sheet sheet, String tenantId) throws ExcelImportException { + //第一行: 列名。 + int firstRowIndex = sheet.getFirstRowNum(); + Row row = sheet.getRow(firstRowIndex); + + //列名的index和名字之间的对应关系为actualColNames。 + Map<Integer, String> actualColNames = new HashMap<>(9); + for (int i = row.getFirstCellNum(); i <= row.getLastCellNum(); i++) { + Cell cc = row.getCell(i); + String value = ExcelUtil.getValueFromCell(cc); + if (StringUtil.isBlank(value)) { + continue; + } + actualColNames.put(i, value.trim()); + } + List<PortalUserImportVO> userList = new ArrayList<>(); + for (int i = firstRowIndex + 1; i <= sheet.getLastRowNum(); i++) { + row = sheet.getRow(i); + if (row == null) { + continue; + } + //-->step4:处理每一行数据 + PortalUserImportVO user = parseUserRow(row, actualColNames); + if (user == null) { + //此行有问题,忽略。 + continue; + } + user.setTenantId(tenantId); + //此处DataStatus该字段值为空时,才能考虑是新增还是更新,否则该行数据有问题 + if (user.getDataStatus() == null) { + PortalUser tmpUser = portalUserRepository.findPortalUserById(user.getTenantId(), user.getLoginId()); + if (tmpUser == null) { + //1代表新增,0代表更新 + user.setDataStatus("1"); + //如果是新增,密码为空,则随机生成一个8位密码 + if (StringUtil.isBlank(user.getPassword())) { + String newPassword = PasswordUtil.getStringRandom(8); + user.setPassword(newPassword); + //DataStatus字段值改为2,说明导入时没有给密码,用户状态只能给init + user.setDataStatus("2"); + } + } else { + user.setDataStatus("0"); + //如果是更新,同时不想修改密码,给密码一个状态 + if (StringUtil.isBlank(user.getPassword())) { + user.setPassword("*"); + } + } + } + userList.add(user); + } + //如果登录id相同,则提示给前端,不让保存 + Map<?, List<PortalUserImportVO>> listMap = ListUtil.groupBy(userList, "loginId"); + Set<?> keys = listMap.keySet(); + Iterator<?> iterator = keys.iterator(); + while (iterator.hasNext()) { + String key = (String) iterator.next(); + List<PortalUserImportVO> portalUserImportVOS = listMap.get(key); + if (portalUserImportVOS.size() > 1) { + for (PortalUserImportVO portalUserImportVO : portalUserImportVOS) { + portalUserImportVO.setDataStatus("登录名不允许重复"); + } + } + } + //将userList存入缓存中 + UserExcelManager.getInstance().addUserImportList(fileName, userList); + } + + /** + * step4:处理每一行数据,处理前先验证数据对应的列是否在预定的列中。 + * + * @param row + * @param actualColNames + * @return + */ + private PortalUserImportVO parseUserRow(Row row, Map<Integer, String> actualColNames) { + PortalUserImportVO user = new PortalUserImportVO(); + for (Map.Entry<Integer, String> kv : actualColNames.entrySet()) { + int col = kv.getKey(); + String colName = kv.getValue(); + Cell cell = row.getCell(col); + //数据对应的列是否在预定的列中。 + boolean exist = false; + for (int i = 0; i < USER_COLUMNS.length; i++) { + if (colName.equals(USER_COLUMNS[i])) { + exist = true; + break; + } + } + if (!exist) { + log.warn("行:{},列:{}({})不在系统内置表字段中,将忽略。", "" + row.getRowNum(), "" + col, colName); + continue; + } + String value = ExcelUtil.getValueFromCell(cell); + try { + //-->step5:处理每一行各个字段(登录名和姓名不可为空) + processColumn(value, colName, user); + } catch (Exception ex) { + log.error(String.format("处理第%s行时出现系统错误: " + ex.getMessage(), row.getRowNum()), ex); + break; + } + } + return user; + } + + /** + * step5:处理每一行各个字段(登录名和姓名不可为空) + * + * @param value + * @param colName + * @param user + * @return + * @throws ExcelImportException + */ + private void processColumn(String value, String colName, PortalUserImportVO user) throws ExcelImportException { + StringBuilder sb = new StringBuilder(); + if (colName.equals(USER_COLUMNS[0])) { + //登录名 + if (StringUtil.isBlank(value)) { + sb.append("登录名为空;"); + user.setDataStatus(sb.toString()); + } else { + user.setLoginId(value.trim()); + } + } else if (colName.equals(USER_COLUMNS[1])) { + //姓名 + if (StringUtil.isBlank(value)) { + sb.append("姓名为空;"); + user.setDataStatus(sb.toString()); + } else { + user.setName(value.trim()); + } + } else if (colName.equals(USER_COLUMNS[ArrayNumEnum.TWO.getCode()])) { + //具体部门名称 + if (StringUtil.isBlank(value)) { + user.setDeptFullName(null); + } else { + if (!value.startsWith(SLASH)) { + user.setDataStatus("部门名称必须以'/'开头"); + } + String[] deptNameArray = value.split("/"); + for (int i = 1; i < deptNameArray.length; i++) { + if (StringUtil.isBlank(deptNameArray[i])) { + user.setDataStatus("部门名称格式错误"); + break; + } + } + user.setDeptFullName(value.trim()); + } + } else if (colName.equals(USER_COLUMNS[ArrayNumEnum.THREE.getCode()])) { + //职务 + if (StringUtil.isBlank(value)) { + user.setTitle(null); + } else { + user.setTitle(value.trim()); + } + } else if (colName.equals(USER_COLUMNS[ArrayNumEnum.FOUR.getCode()])) { + //密码 + if (StringUtil.isBlank(value)) { + user.setPassword(null); + } else { + try { + PasswordUtil.checkPassword(value); + } catch (Exception e) { + user.setDataStatus(e.getMessage()); + } + user.setPassword(value.trim()); + } + } else if (colName.equals(USER_COLUMNS[ArrayNumEnum.FIVE.getCode()])) { + //邮箱 + if (StringUtil.isBlank(value)) { + user.setEmail(null); + } else { + user.setEmail(value.trim()); + } + } else if (colName.equals(USER_COLUMNS[ArrayNumEnum.SIX.getCode()])) { + //移动电话 + if (StringUtil.isBlank(value)) { + user.setMobile1(null); + } else { + user.setMobile1(value.trim()); + } + } else if (colName.equals(USER_COLUMNS[ArrayNumEnum.SEVEN.getCode()])) { + //办公电话 + if (StringUtil.isBlank(value)) { + user.setOfficeTel1(null); + } else { + user.setOfficeTel1(value.trim()); + } + } else if (colName.equals(USER_COLUMNS[ArrayNumEnum.EIGHT.getCode()])) { + //数据来源 + user.setSourceType(SourceTypeUtil.setSourceType(value.trim())); + } else if (colName.equals(USER_COLUMNS[ArrayNumEnum.NINE.getCode()])) { + //备注 + if (StringUtil.isBlank(value)) { + user.setRemark(null); + } else { + user.setRemark(value.trim()); + } + } else { + } + + } + + /** + * 根据excel名,返回上传预览。 + * + * @param fileName + * @return + */ + public CommonResult<?> getUsersByExcelFileName(final String fileName) { + return businessQueryTemplate.process(new BusinessQueryCallback<List<PortalUserImportVO>>() { + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(fileName); + } + + @Override + public List<PortalUserImportVO> doQuery() { + //从缓存中取userList + List<PortalUserImportVO> userImportList = UserExcelManager.getInstance().getUserImportList(fileName); + return userImportList; + } + }); + } + + /** + * 导入预览中的合法数据,并删除用户列表缓存。 + * + * @param fileName + * @return + */ + public CommonResult<?> saveUsersByExcelFileName(final String fileName) { + return businessQueryTemplate.process(new BusinessQueryCallback<String>() { + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(fileName); + } + + @Override + public String doQuery() { + long beginTime = System.currentTimeMillis(); + log.info("开始导入数据: " + beginTime); + //从缓存中取出userImportList,将dataStatus值为空的数据存入数据库 + List<PortalUserImportVO> userImportList = UserExcelManager.getInstance().getUserImportList(fileName); + //需要插入的数据 + List<PortalUser> insertList = new ArrayList<>(); + //需要更新的数据 + List<PortalUser> updateList = new ArrayList<>(); + for (PortalUserImportVO userImportVO : userImportList) { + if (userImportVO.getDataStatus() != "0" && userImportVO.getDataStatus() != "1" + && userImportVO.getDataStatus() != "2") { + continue; + } + PortalUser tmpUser = portalUserRepository.findPortalUserById(userImportVO.getTenantId(), + userImportVO.getLoginId()); + if (tmpUser == null) { + //插入 + PortalUser insertUser = getInsertingUser(userImportVO); + insertList.add(insertUser); + } else { + //更新 + PortalUser updateUser = getUpdatingUser(userImportVO, tmpUser); + if (updateUser == null) { + continue; + } + updateList.add(updateUser); + } + } + + List<PortalUser> insertUsers = portalUserRepository.save(insertList); + portalUserRepository.save(updateList); + + producePassword(insertUsers); + + //从缓存中删除userList + UserExcelManager.getInstance().removeUserImportList(fileName); + long endTime = System.currentTimeMillis(); + long duringTime = endTime - beginTime; + log.info("导入数据结束: " + endTime + ", 共耗时:" + duringTime); + return "success"; + } + }); + } + + private PortalUser getUpdatingUser(PortalUserImportVO userImportVO, PortalUser tmpUser) { + PortalUser updateUser = new PortalUser(); + updateUser.setTenantId(userImportVO.getTenantId()); + updateUser.setId(tmpUser.getId()); + updateUser.setLoginId(userImportVO.getLoginId()); + updateUser.setName(userImportVO.getName()); + updateUser.setTitle(userImportVO.getTitle()); + updateUser.setEmail(userImportVO.getEmail()); + updateUser.setMobile1(userImportVO.getMobile1()); + updateUser.setOfficeTel1(userImportVO.getOfficeTel1()); + updateUser.setSourceType(userImportVO.getSourceType()); + updateUser.setRemark(userImportVO.getRemark()); + updateUser.setIsActive("Y"); + updateUser.setCreateUser(tmpUser.getCreateUser()); + updateUser.setCreateTime(tmpUser.getCreateTime()); + updateUser.setLastModifiedTime(new Date()); + updateUser.setStatus(tmpUser.getStatus()); + + try { + //如果上传文件中没有密码,则不对密码进行修改。 + if (STAR.equals(userImportVO.getPassword())) { + //将原来的密码放到此对象中。 + updateUser.setPassword(tmpUser.getPassword()); + updateUser.setSalt(tmpUser.getSalt()); + } else { //否则需要修改密码 + //salt随机产生,密码是用户的ID. + byte[] salt = PasswordUtil.getSalt(); + String encriptPW = PasswordUtil.encrypt(userImportVO.getPassword(), updateUser.getId(), + salt); + updateUser.setSalt(Base64Util.encode(salt)); + updateUser.setPassword(encriptPW); + } + } catch (Exception ex) { + return null; + } + String deptId = parseDeptFullName(userImportVO.getDeptFullName(), userImportVO.getTenantId(), userImportVO.getSourceType()); + updateUser.setDeptId(deptId); + return updateUser; + } + + private PortalUser getInsertingUser(PortalUserImportVO userImportVO) { + PortalUser insertUser = new PortalUser(); + insertUser.setTenantId(userImportVO.getTenantId()); + insertUser.setLoginId(userImportVO.getLoginId()); + insertUser.setName(userImportVO.getName()); + insertUser.setTitle(userImportVO.getTitle()); + insertUser.setEmail(userImportVO.getEmail()); + insertUser.setMobile1(userImportVO.getMobile1()); + insertUser.setOfficeTel1(userImportVO.getOfficeTel1()); + insertUser.setSourceType(userImportVO.getSourceType()); + insertUser.setRemark(userImportVO.getRemark()); + insertUser.setIsActive("Y"); + insertUser.setCreateUser("import"); + insertUser.setCreateTime(new Date()); + insertUser.setLastModifiedTime(new Date()); + if (userImportVO.getDataStatus() == "1") { + insertUser.setStatus(PortalUserStatusEnum.ENABLED.getCode()); + } else if (userImportVO.getDataStatus() == "2") { + insertUser.setStatus(PortalUserStatusEnum.INIT.getCode()); + } + insertUser.setPassword(userImportVO.getPassword()); + String deptId = parseDeptFullName(userImportVO.getDeptFullName(), userImportVO.getTenantId(), userImportVO.getSourceType()); + insertUser.setDeptId(deptId); + return insertUser; + } + + private void producePassword(List<PortalUser> users) { + List<PortalUser> insertUsers = new ArrayList<>(); + for (PortalUser user : users) { + try { + byte[] salt = PasswordUtil.getSalt(); + String encriptPW = PasswordUtil.encrypt(user.getPassword(), user.getId(), salt); + user.setSalt(Base64Util.encode(salt)); + user.setPassword(encriptPW); + insertUsers.add(user); + } catch (Exception ex) { + continue; + } + } + portalUserRepository.save(insertUsers); + } + + + /** + * 处理部门全名,返回部门id + * + * @param deptFullName + * @param tenantId + */ + private String parseDeptFullName(String deptFullName, String tenantId, String sourceType) { + if (StringUtil.isBlank(deptFullName)) { + return null; + } + //以符号/给部门名称分段,爷/父/子 + String[] deptNameArray = deptFullName.substring(1).split("/"); + PortalDept parentDept = portalDeptRepository.findByDeptNameAndTenantId(deptNameArray[0], tenantId); + int arrayNo = 0; + return produceDeptId(parentDept, tenantId, deptNameArray, arrayNo, "", sourceType); + } + + private String produceDeptId(PortalDept parentDept, String tenantId, String[] deptNameArray, int arrayNo, + String parentId, String sourceType) { + if (parentDept == null) { + return createRecurseDept(tenantId, deptNameArray, parentId, arrayNo, sourceType); + } + if (arrayNo < deptNameArray.length - 1) { + PortalDept dept = portalDeptRepository.findByDeptNameAndParentIdAndTenantId(deptNameArray[arrayNo + 1], + tenantId, parentDept.getId()); + arrayNo++; + return produceDeptId(dept, tenantId, deptNameArray, arrayNo, parentDept.getId(), sourceType); + } + return parentDept.getId(); + } + + private String createRecurseDept(String tenantId, String[] deptNameArray, String parentId, int arrayNo, String sourceType) { + //级联创建爷/父/子 + if (arrayNo < deptNameArray.length) { + PortalDept parentDept = new PortalDept(); + parentDept.setCode(deptNameArray[arrayNo]); + parentDept.setDisplayName(deptNameArray[arrayNo]); + parentDept.setTenantId(tenantId); + parentDept.setStatus("1"); + parentDept.setGmtCreate(new Date()); + parentDept.setGmtModified(new Date()); + parentDept.setParentId(parentId); + parentDept.setSourceType(sourceType); + PortalDept dbparentDept = portalDeptRepository.save(parentDept); + arrayNo++; + return createRecurseDept(tenantId, deptNameArray, dbparentDept.getId(), arrayNo, sourceType); + } + return parentId; + } + + /** + * 取消导入,直接删除用户列表缓存 + * + * @param fileName + * @return + */ + public CommonResult<?> removeUsersByExcelFileName(final String fileName) { + return businessQueryTemplate.process(new BusinessQueryCallback<String>() { + @Override + public void checkParam() { + CommonParamtersChecker.checkNotBlank(fileName); + } + + @Override + public String doQuery() { + //从缓存中删除userList + UserExcelManager.getInstance().removeUserImportList(fileName); + return "success"; + } + }); + } + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/excelfilehandler/UserExcelManager.java b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/excelfilehandler/UserExcelManager.java new file mode 100644 index 0000000000000000000000000000000000000000..018c6fa5c0c3450e148238713515b95287f977e5 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/excelfilehandler/UserExcelManager.java @@ -0,0 +1,92 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.web.auto.excelfilehandler; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.idcos.enterprise.portal.vo.PortalUserImportVO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * 为了生成excel导入预览,缓存导入时生成的List + * + * @author Dana + * @version UserExcelCache.java, v1 2017/12/27 上午9:37 Dana Exp $$ + */ +public class UserExcelManager { + private static final Logger logger = LoggerFactory.getLogger(UserExcelManager.class); + + /** + * 为提高性能,缓存userImportList,此缓存会在30分钟无操作后失效(key:excel名称,value:List<PortalUserImportVO>)。 + */ + + private Cache<String, List<PortalUserImportVO>> userImportListCache; + + private static UserExcelManager instance; + + /** + * @param timeout 缓存超时时间,单位:秒。 + */ + private void init(int timeout) { + logger.info("----Account Timeout in minutes: {}", timeout); + this.userImportListCache = CacheBuilder.newBuilder().expireAfterAccess(timeout, TimeUnit.MINUTES).build(); + } + + /** + * 得到excel管理器实例。 + * + * @return + */ + public static UserExcelManager getInstance() { + synchronized (UserExcelManager.class) { + if (instance == null) { + instance = new UserExcelManager(); + //缓存时间设置为30分钟 + instance.init(30); + } + } + return instance; + } + + /** + * 删除缓存中的UserImportList + * + * @param fileName excel文件名 + */ + public void removeUserImportList(String fileName) { + this.userImportListCache.invalidate(fileName); + } + + /** + * 向缓存中添加一个UserImportList + * + * @param fileName + * @param userImportList + */ + public void addUserImportList(String fileName, List<PortalUserImportVO> userImportList) { + this.userImportListCache.put(fileName, userImportList); + } + + /** + * 得到已缓存的UserImportList,返回当前系统UserImportList。 + * + * @param fileName excel文件名 + * @return 返回UserImportList,如果要查询的UserImportList没有在缓存中存在,则返回null. + */ + public List<PortalUserImportVO> getUserImportList(final String fileName) { + List<PortalUserImportVO> userImportList = null; + try { + userImportList = this.userImportListCache.getIfPresent(fileName); + } catch (Exception e) { + logger.error("Load loggined account from cache failed,cause by:" + e.getMessage(), e); + } + return userImportList; + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/excelfilehandler/UserExcelTempleteHandler.java b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/excelfilehandler/UserExcelTempleteHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..2c007315ffb54903a09618a100dc0fe9d60b001b --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/web/auto/excelfilehandler/UserExcelTempleteHandler.java @@ -0,0 +1,311 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2015-2017 All Rights Reserved. + */ +package com.idcos.enterprise.portal.web.auto.excelfilehandler; + +import com.idcos.cloud.core.common.util.StringUtil; +import com.idcos.enterprise.portal.biz.common.utils.SourceTypeUtil; +import com.idcos.enterprise.portal.dal.entity.PortalDept; +import com.idcos.enterprise.portal.dal.entity.PortalUser; +import com.idcos.enterprise.portal.dal.repository.PortalDeptRepository; +import com.idcos.enterprise.portal.dal.repository.PortalUserRepository; +import org.apache.poi.hssf.usermodel.HSSFCellStyle; +import org.apache.poi.hssf.usermodel.HSSFFont; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.List; + +/** + * @author Dana + * @version UserExcelTempterHandler.java, v1 2017/12/12 下午11:01 Dana Exp $$ + */ +@Service +public class UserExcelTempleteHandler { + + @Autowired + private PortalUserRepository portalUserRepository; + + @Autowired + private PortalDeptRepository portalDeptRepository; + + /** + * 用户导入的excel表头模板 + */ + private static final String[] USER_COLUMNS = {"登录名", "姓名", "具体部门名称", "职务", "密码", "邮箱", "移动电话", "办公电话", "数据来源", "备注"}; + + /** + * 格式化时间到分钟。 + */ + private SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HH_mm"); + + /** + * 下载用户信息的模板。 + * + * @param request + * @param response + * @throws IOException + */ + public void downloadTemplete(HttpServletRequest request, HttpServletResponse response) throws IOException { + HSSFWorkbook wb = new HSSFWorkbook(); + Sheet sh = wb.createSheet("用户信息模板"); + //设置用户信息表的表头 + setHead(wb, sh); + response.reset(); + // 设置response的Header + response.setHeader("Pragma", "No-cache"); + response.setHeader("Cache-Control", "No-cache"); + response.setDateHeader("Expires", 0); + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", + "attachment;filename=" + new String( + ("用户信息模板_" + sdf.format(new Timestamp(System.currentTimeMillis())) + ".xls").getBytes("GBK"), + "iso8859-1")); + response.setContentType("application/msexcel;charset=GBK"); + + wb.write(response.getOutputStream()); + + wb.close(); + } + + /** + * 设置用户信息表的表头 + * + * @param wb 代表一个EXCEL + * @param sh 代表一个sheet页。 + */ + private void setHead(HSSFWorkbook wb, Sheet sh) { + Row headRow = sh.createRow(0); + + headRow.setHeight((short) 400); + + HSSFFont rowF = wb.createFont(); + //字号 + rowF.setFontHeightInPoints((short) 10); + //rowF.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL); + rowF.setBold(true); + //设置头部字体为宋体 + rowF.setFontName("宋体"); + + HSSFCellStyle rowStyle = wb.createCellStyle(); + rowStyle.setFont(rowF); + //左右居中 + rowStyle.setAlignment(HorizontalAlignment.CENTER); + rowStyle.setVerticalAlignment(VerticalAlignment.CENTER); + rowStyle.setFillBackgroundColor(IndexedColors.WHITE.getIndex()); + rowStyle.setWrapText(true); + + headRow.setRowStyle(rowStyle); + + HSSFCellStyle style = wb.createCellStyle(); + HSSFFont f = wb.createFont(); + //字号 + f.setFontHeightInPoints((short) 11); + //加粗 + //f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL); + f.setBold(true); + //设置头部字体为宋体 + f.setFontName("宋体"); + style.setFont(f); + //左右居中 + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setFillBackgroundColor(IndexedColors.WHITE.getIndex()); + style.setWrapText(true); + + //必填项字体为红色 + + //style.setBottomBorderColor(IndexedColors.BLACK.getIndex()); // 底部边框颜色 + + HSSFCellStyle style1 = wb.createCellStyle(); + style1.setFont(f); + //左右居中 + style1.setAlignment(HorizontalAlignment.CENTER); + style1.setVerticalAlignment(VerticalAlignment.CENTER); + HSSFFont font = wb.createFont(); + font.setColor(IndexedColors.RED.getIndex()); + //设置头部字体为宋体 + font.setFontName("宋体"); + //字号 + font.setFontHeightInPoints((short) 11); + //加粗 + font.setBold(true); + //font.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL); + style1.setFont(font); + style1.setFillBackgroundColor(IndexedColors.RED.getIndex()); + style1.setWrapText(true); + + CreationHelper factory = wb.getCreationHelper(); + // When the comment box is visible, have it show in a 1x3 space + ClientAnchor anchor = factory.createClientAnchor(); + Drawing drawing = sh.createDrawingPatriarch(); + for (int i = 0; i < USER_COLUMNS.length; i++) { + sh.setColumnWidth(i, 12 * 256); + sh.autoSizeColumn(i); + Cell cell = headRow.createCell(i); + cell.setCellValue(USER_COLUMNS[i]); + cell.setCellType(CellType.STRING); + + anchor.setCol1(cell.getColumnIndex()); + anchor.setCol2(cell.getColumnIndex() + 4); + anchor.setRow1(cell.getRowIndex()); + anchor.setRow2(cell.getRowIndex() + 4); + anchor.setDx1(0); + anchor.setDx2(0); + anchor.setDy1(1300); + anchor.setDy2(1000); + + if (i < 2) { + Comment comment = drawing.createCellComment(anchor); + RichTextString str = factory.createRichTextString("不能为空。"); + comment.setString(str); + comment.setAuthor("系统"); + str.applyFont(font); + cell.setCellStyle(style1); + cell.setCellComment(comment); + } else { + cell.setCellStyle(style); + } + } + + } + + /** + * 下载用户数据。 + * + * @param response + * @throws IOException + */ + public void downloadData(HttpServletResponse response, String deptId, + String tenantId) throws IOException { + HSSFWorkbook wb = new HSSFWorkbook(); + Sheet sh = wb.createSheet("用户列表数据"); + //表头 + setHead(wb, sh); + + HSSFFont f = wb.createFont(); + //字号 + f.setFontHeightInPoints((short) 11); + //加粗 + f.setBold(true); + //f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL); + //设置头部字体为宋体 + f.setFontName("宋体"); + + HSSFCellStyle style = wb.createCellStyle(); + style.setFont(f); + //左右居中 + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setFillBackgroundColor(IndexedColors.WHITE.getIndex()); + //填充数据。 + //查询出来所有的员工,不超过24000条的话直接输出了 + List<PortalUser> userList; + if (StringUtil.isEmpty(deptId)) { + userList = this.portalUserRepository.findByTenantId(tenantId); + } else { + userList = this.portalUserRepository.findPortalUserByDeptIdIn(tenantId, Arrays.asList(deptId)); + } + if (userList != null) { + int i = 1; + for (PortalUser ue : userList) { + genUserRow(sh, ue, i); + i++; + } + } + + response.reset(); + // 设置response的Header + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", + "attachment;filename=" + new String( + ("用户列表数据_" + sdf.format(new Timestamp(System.currentTimeMillis())) + ".xls").getBytes("GBK"), + "iso8859-1")); + response.setContentType("application/msexcel;charset=GBK"); + + wb.write(response.getOutputStream()); + + wb.close(); + } + + /** + * 生成一条用户数据的行。 + * + * @param sh 代表一个sheet页。 + * @param ue 用户数据。 + * @param index 行的下标,从1开始. + */ + private void genUserRow(Sheet sh, PortalUser ue, int index) { + Row row = sh.createRow(index); + row.setHeight((short) 400); + //登录名 + Cell cell = row.createCell(0); + cell.setCellValue(ue.getLoginId()); + //姓名 + cell = row.createCell(1); + cell.setCellValue(ue.getName()); + //部门名称(全名) + cell = row.createCell(2); + + cell.setCellValue(this.getDeptFullNameByDeptId(ue.getDeptId())); + + //职务 + cell = row.createCell(3); + cell.setCellValue(ue.getTitle()); + //密码 + cell = row.createCell(4); + cell.setCellValue(""); + //邮箱 + cell = row.createCell(5); + cell.setCellValue(ue.getEmail()); + //移动电话 + cell = row.createCell(6); + cell.setCellValue(ue.getMobile1()); + //办公电话 + cell = row.createCell(7); + cell.setCellValue(ue.getOfficeTel1()); + //数据来源 + cell = row.createCell(8); + cell.setCellValue(SourceTypeUtil.getSourceType(ue.getSourceType())); + //备注 + cell = row.createCell(9); + cell.setCellValue(ue.getRemark()); + } + + /** + * 根据部门Id查询部门fullName + * + * @param deptId + * @return + */ + private String getDeptFullNameByDeptId(String deptId) { + if (StringUtil.isEmpty(deptId)) { + //如果用户没有部门Id,返回空 + return null; + } + String childId = deptId; + StringBuffer deptFullName = new StringBuffer(); + while (!StringUtil.isEmpty(childId)) { + PortalDept portalDept = portalDeptRepository.findByDeptId(childId); + if (portalDept == null) { + childId = null; + continue; + } + deptFullName=new StringBuffer("/").append(portalDept.getDisplayName()).append(deptFullName); + childId = portalDept.getParentId(); + } + return StringUtil.isEmpty(deptFullName.toString()) ? null + : deptFullName.toString(); + } + +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/web/manual/PortalPermissionResourceService.java b/uam-server/src/main/java/com/idcos/enterprise/portal/web/manual/PortalPermissionResourceService.java new file mode 100644 index 0000000000000000000000000000000000000000..e1c4d242a999eec5c53e91a91e392bc237713edf --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/web/manual/PortalPermissionResourceService.java @@ -0,0 +1,90 @@ +package com.idcos.enterprise.portal.web.manual; + +import com.idcos.cloud.biz.common.permisson.OperateAction; +import com.idcos.common.service.vo.CommonRestResult; +import com.idcos.enterprise.portal.dal.enums.RbacMenuEnum; +import com.idcos.enterprise.portal.vo.Item; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.mvc.method.RequestMappingInfo; +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; + +/** + * 权限资源管理系统对外提供权限资源信息的接口 + * + * @author pengganyu + * @version $Id: PortalPermissionResourceService.java, v 0.1 2016年6月2日 下午4:36:41 pengganyu Exp $ + */ +@RestController +@RequestMapping("/api/v1/rbac") +@Api(tags = "11.对外提供权限资源信息的接口", description = "PortalPermissionResourceService") +public class PortalPermissionResourceService { + @RequestMapping(value = "/operateCodes", method = RequestMethod.GET) + public CommonRestResult<Item> operateCodesResource(HttpServletRequest request) { + + Item root = new Item(); + root.setId(""); + root.setTitle("RBAC操作权限列表"); + + WebApplicationContext wc = WebApplicationContextUtils + .getRequiredWebApplicationContext(request.getSession().getServletContext()); + RequestMappingHandlerMapping handlerMapping = wc + .getBean(RequestMappingHandlerMapping.class); + Map<RequestMappingInfo, HandlerMethod> map = handlerMapping.getHandlerMethods(); + for (Map.Entry<RequestMappingInfo, HandlerMethod> entry : map.entrySet()) { + HandlerMethod handlerMethod = entry.getValue(); + //class level + OperateAction operateAction = handlerMethod.getBeanType().getAnnotation( + OperateAction.class); + if (operateAction == null) { + //假设method级别的annotation不能单独存在 + continue; + } + Item item = new Item(); + item.setId(operateAction.value()); + item.setTitle(operateAction.value()); + + Item classLevel = root.addChild(item); + + OperateAction methodLevelOperateAction = handlerMethod + .getMethodAnnotation(OperateAction.class); + if (methodLevelOperateAction != null) { + Item methodLevel = new Item(); + methodLevel.setId(methodLevelOperateAction.value()); + methodLevel.setTitle(methodLevelOperateAction.value()); + classLevel.addChild(methodLevel); + } + + } + return new CommonRestResult<>(root); + + } + + @RequestMapping(value = "/menuCodes", method = RequestMethod.GET) + public CommonRestResult<Item> menuCodesResource() { + Item root = new Item(); + + root.setId(""); + root.setTitle("RBAC菜单列表"); + + // 遍历枚举,组装菜单数据 + for (RbacMenuEnum rbEnum : RbacMenuEnum.values()) { + Item childLevel = new Item(); + + childLevel.setId(rbEnum.getCode()); + childLevel.setTitle(rbEnum.getName()); + + root.addChild(childLevel); + } + + return new CommonRestResult<>(root); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/web/manual/PortalRestfulController.java b/uam-server/src/main/java/com/idcos/enterprise/portal/web/manual/PortalRestfulController.java new file mode 100644 index 0000000000000000000000000000000000000000..2c2ff1417ec8ba3db473707e466060c66cbdff2e --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/web/manual/PortalRestfulController.java @@ -0,0 +1,90 @@ + + +package com.idcos.enterprise.portal.web.manual; + +// auto generated imports + +import io.swagger.annotations.Api; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.idcos.cloud.biz.common.permisson.OperateAction; +import com.idcos.enterprise.portal.biz.common.PortalResponse; +import com.idcos.enterprise.portal.manager.auto.PortalRestfulService; + +/** + * @author + * @version PortalFilterUtil.java, v1 2017/11/18 下午6:22 Exp $$ + */ +@Controller +@OperateAction("F_PORTAL_USER") +@RequestMapping(value = "/api/v1") +@Api(tags = "12./api/v1接口", description = "PortalRestfulController") +public class PortalRestfulController { + //========== manager ========== + + @Autowired + private PortalRestfulService portalRestfulService; + + /** + * 根据权限资源类型获取权限资源 + * + * @param resType + * @return + */ + @RequestMapping(method = RequestMethod.GET, value = "/res") + @ResponseBody + @OperateAction("O_PORTAL_USER_GET") + public PortalResponse queryResByResType(@RequestParam("resType") String resType, @RequestParam(name = "tenantId", required = false) String tenantId) { + return portalRestfulService.queryResource(resType, tenantId); + } + + /** + * queryUserIdsByGroupId + * + * @param groupId + * @return + */ + @RequestMapping(method = RequestMethod.GET, value = "/{groupId}/userIds") + @ResponseBody + @OperateAction("O_PORTAL_USER_GET") + public PortalResponse queryUserIdsById(@PathVariable String groupId) { + return portalRestfulService.queryUserIdsByGroupId(groupId); + } + + /** + * queryUserIdsByGroupName + * + * @param groupName + * @return + */ + @RequestMapping(method = RequestMethod.GET, value = "/userIds") + @ResponseBody + @OperateAction("O_PORTAL_USER_GET") + public PortalResponse queryUserIdsByGroupName(@RequestParam("groupName") String groupName) { + return portalRestfulService.queryUserIdsByGroupName(groupName); + } + + /** + * 根据查询条件查询用户信息 + * + * @param tenantId + * @param cnd + * @param pageNo + * @param pageSize + * @return + */ + @RequestMapping(method = RequestMethod.GET, value = "/users/cnd") + @ResponseBody + @OperateAction("O_PORTAL_USER_GET") + public PortalResponse queryUsersByCnd(@RequestParam(name = "tenantId", required = false) String tenantId, + @RequestParam("cnd") String cnd, @RequestParam("pageNo") String pageNo, + @RequestParam("pageSize") String pageSize) { + return portalRestfulService.queryUserByCnd(tenantId, cnd, pageNo, pageSize); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/web/permission/PermissionController.java b/uam-server/src/main/java/com/idcos/enterprise/portal/web/permission/PermissionController.java new file mode 100644 index 0000000000000000000000000000000000000000..7433f8f82bc69fea2928c1db2c48b76e0f36606a --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/web/permission/PermissionController.java @@ -0,0 +1,47 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2018 All Rights Reserved. + */ +package com.idcos.enterprise.portal.web.permission; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; + +import io.swagger.annotations.Api; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.ResourceUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; +import org.yaml.snakeyaml.Yaml; + +import com.idcos.common.service.vo.CommonRestResult; + +/** + * @author Xizhao.Dai + * @version PermissionController.java, v1 2018/7/19 下午5:40 Xizhao.Dai Exp $$ + */ +@RestController +@RequestMapping("/uam/permission") +@Api(tags = "13.CloudUam获取自身权限的接口", description = "PermissionController") +public class PermissionController { + private static final Logger logger = LoggerFactory.getLogger(PermissionController.class); + + @RequestMapping(value = "/menuCodes", method = RequestMethod.GET) + public CommonRestResult<PermissionNode> menuCodesResource() { + Yaml yaml = new Yaml(); + + PermissionNode permissionNode = null; + try { + File file = ResourceUtils.getFile("classpath:menu.yaml"); + permissionNode = yaml.loadAs(new FileInputStream(file), PermissionNode.class); + } catch (FileNotFoundException e) { + logger.error("menu resource file menu.yaml not found", e); + } + + return new CommonRestResult<>(permissionNode); + } +} \ No newline at end of file diff --git a/uam-server/src/main/java/com/idcos/enterprise/portal/web/permission/PermissionNode.java b/uam-server/src/main/java/com/idcos/enterprise/portal/web/permission/PermissionNode.java new file mode 100644 index 0000000000000000000000000000000000000000..c338d8ba609de91c553d179dcb3ec85a682cc646 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/portal/web/permission/PermissionNode.java @@ -0,0 +1,92 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2016 All Rights Reserved. + */ +package com.idcos.enterprise.portal.web.permission; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +/** + * @author zhouqin + * @version com.idcos.automate.export.api.rbac.Item.java, v 1.1 5/12/16 zhouqin Exp $ + */ +public class PermissionNode implements Serializable { + + /** */ + private static final long serialVersionUID = 1L; + + private String id; + + private String title; + + private String note; + + private List<PermissionNode> children = new ArrayList<PermissionNode>(); + + @JsonIgnore + private Map<String, PermissionNode> childrenUnique = new HashMap<>(); + + public PermissionNode() { + + } + + public PermissionNode(String id, String title) { + this.id = id; + this.title = title; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public List<PermissionNode> getChildren() { + return children; + } + + public void setChildren(List<PermissionNode> children) { + this.children = children; + } + + public String getNote() { + return note; + } + + public void setNote(String note) { + this.note = note; + } + + /** + * return child in this + * + * @param permissionNode + * @return + */ + public PermissionNode addChild(PermissionNode permissionNode) { + if (childrenUnique.containsKey(permissionNode.getId())) { + return childrenUnique.get(permissionNode.getId()); + } + childrenUnique.put(permissionNode.getId(), permissionNode); + this.children.add(permissionNode); + return permissionNode; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/sso/CheckLoginService.java b/uam-server/src/main/java/com/idcos/enterprise/sso/CheckLoginService.java new file mode 100644 index 0000000000000000000000000000000000000000..4d105c87b06d5fcb0cfe0625437c742facb20d6a --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/sso/CheckLoginService.java @@ -0,0 +1,51 @@ +package com.idcos.enterprise.sso; + +import com.idcos.enterprise.portal.biz.common.CommonBizException; +import com.idcos.enterprise.portal.biz.common.utils.PasswordUtil; +import com.idcos.enterprise.portal.dal.entity.PortalTenant; +import com.idcos.enterprise.portal.dal.entity.PortalUser; +import com.idcos.enterprise.portal.dal.enums.PortalUserStatusEnum; +import com.idcos.enterprise.portal.dal.repository.PortalTenantRepository; +import com.idcos.enterprise.portal.dal.repository.PortalUserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @Author: Dai + * @Date: 2018/10/8 下午7:33 + * @Description: + */ +@Service +public class CheckLoginService { + @Autowired + private PortalUserRepository portalUserRepository; + + @Autowired + private PortalTenantRepository portalTenantRepository; + + public PortalUser checkUser(String loginId, String tenantId) { + //验证用户、租户和密码是否正确 + PortalUser portalUser = portalUserRepository.findPortalUserById(tenantId, loginId); + if (portalUser == null || !portalUser.getStatus().equals(PortalUserStatusEnum.ENABLED.getCode())) { + throw new CommonBizException("您输入的用户或密码不正确,请检查。"); + } + return portalUser; + } + + public void checkPassword(PortalUser portalUser, String password) { + //验证密码是否匹配 + String pw = PasswordUtil.encryptPassword(portalUser.getId(), password, portalUser.getSalt()); + if (!pw.equals(portalUser.getPassword())) { + throw new CommonBizException("您输入的用户或密码不正确,请检查。"); + } + } + + public PortalTenant checkTenant(String tenantId) { + //验证租户 + PortalTenant portalTenant = portalTenantRepository.findByName(tenantId); + if (portalTenant == null) { + throw new CommonBizException("租户【" + tenantId + "】不存在,请检查。"); + } + return portalTenant; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/sso/Login.java b/uam-server/src/main/java/com/idcos/enterprise/sso/Login.java new file mode 100644 index 0000000000000000000000000000000000000000..9f986cd7798aba36fc6dfb3dd3fcdc7e321f9cca --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/sso/Login.java @@ -0,0 +1,186 @@ +package com.idcos.enterprise.sso; + +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang3.StringUtils; +import org.hibernate.validator.internal.util.privilegedactions.GetResource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import com.alibaba.fastjson.JSONObject; +import com.idcos.cloud.biz.common.permisson.OperateAction; +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.cloud.web.common.BaseResultVO; +import com.idcos.cloud.web.common.JsonResultUtil; +import com.idcos.enterprise.portal.biz.common.utils.DesCipherUtil; +import com.idcos.enterprise.portal.dal.repository.PortalUserRepository; +import com.idcos.enterprise.portal.form.LoginForm; +import com.idcos.enterprise.portal.form.TokenForm; +import com.idcos.enterprise.portal.manager.auto.AuthManager; +import com.idcos.enterprise.portal.web.GlobalValue; +import com.idcos.enterprise.sso.service.LoginResult; +import com.idcos.enterprise.sso.service.impl.LoginServiceImpl; + +import io.swagger.annotations.*; + +/** + * @author GuanBin + * @version Login.java, v1 2017/11/1 下午8:06 GuanBin Exp $$ + */ +@Controller +@OperateAction("F_AUTH_REST") +@Api(tags = "01.登录与token管理接口", description = "Login") +public class Login { + private static final Logger logger = LoggerFactory.getLogger(Login.class); + + @Autowired + private AuthManager authManager; + + @Autowired + private LoginServiceImpl loginService; + + @Autowired + private GlobalValue globalValue; + + @Autowired + private PortalUserRepository portalUserRepository; + + /** + * 登录接口 + * + * @param form + * @return + */ + @RequestMapping(method = RequestMethod.POST, value = "sso/login") + @ResponseBody + @OperateAction("O_PORTAL_USER_GET") + @ApiOperation(value = "登录", notes = "登录。") + public JSONObject login(@RequestBody LoginForm form, HttpServletResponse response, + @RequestParam(name = "customer", required = false) String customer) { + String afterDecrypt = DesCipherUtil.decrypt(form.getPassword(), globalValue.getDecryptKey()); + form.setPassword(afterDecrypt); + CommonResult<?> result = loginService.login(form); + LoginResult loginResult = (LoginResult)result.getResultObject(); + String accessToken = null; + if (loginResult != null) { + accessToken = authManager.getAuth(form); + } + + JSONObject json = new JSONObject(); + json.put("status", result.getResultCode()); + json.put("message", result.getResultMessage()); + json.put("content", accessToken); + + if (loginResult != null && !loginResult.isStatus()) { + json.put("status", loginResult.isStatus()); + json.put("message", loginResult.getMessage()); + } + + loginService.afterLogin(response, customer); + return json; + } + + @ApiOperation(value = "是否已经登录判定", notes = "是否已经登录判定") + @RequestMapping(value = "sso/info", method = RequestMethod.POST, produces = "application/json; charset=UTF-8") + public @ResponseBody JSONObject userInfo(@CookieValue(value = "LtpaToken2", required = false) String token) { + JSONObject json = new JSONObject(); + if (StringUtils.isBlank(token)) { + json.put("status", "fail"); + return json; + } + return json; + } + + /** + * 登录页面 + * + * @return + */ + @RequestMapping(value = "/login", method = RequestMethod.GET, produces = "application/json; charset=UTF-8") + public String loginHtml(@RequestParam(name = "customer", required = false) String customer, Model model) { + model.addAttribute("isMultiTenant", globalValue.getMultiTenant()); + model.addAttribute("customer", customer); + model.addAttribute("decryptKey", + globalValue.getDecryptKey() == null ? "com.idcos.enterprise.sso" : globalValue.getDecryptKey()); + if (StringUtils.isBlank(customer) || !getLoginTemplates(customer)) { + return "default/login"; + } else { + return customer + "/login"; + } + } + + /** + * 发放token + * + * @return BaseResultVO + */ + @OperateAction("O_PORTAL_COMMON_ROLELIST") + @ApiOperation(value = "生成token", notes = "生成token。") + @RequestMapping(method = RequestMethod.POST, value = "sso/token") + @ResponseBody + public BaseResultVO grantToken(@ModelAttribute TokenForm form) { + return JsonResultUtil.getResult( + authManager.grantToken(form.getLoginId(), form.getPassword(), form.getTenantId(), form.getTime())); + } + + /** + * 分析token + * + * @return BaseResultVO + */ + @OperateAction("O_PORTAL_COMMON_ROLELIST") + @ApiOperation(value = "分析token", notes = "分析token。") + @RequestMapping(method = RequestMethod.POST, value = "sso/token/parse") + @ResponseBody + public BaseResultVO parseToken(@RequestBody String token) { + return JsonResultUtil.getResult(authManager.parseToken(token)); + } + + /** + * admin用户给每个用户发放token + * + * @return BaseResultVO + */ + @RequestMapping(method = RequestMethod.GET, value = "sso/token/admin") + @ResponseBody + @OperateAction("O_PORTAL_COMMON_ROLELIST") + @ApiOperation(value = "admin给每个用户发放永久token", notes = "admin给每个用户发放永久token。") + public BaseResultVO grantTokenByAdmin(@RequestParam String loginId, @RequestParam String tenantId) { + return JsonResultUtil.getResult(authManager.grantTokenByAdmin(loginId, tenantId)); + } + + /** + * 发放永久token(主要为命令行提供) + * + * @return BaseResultVO + */ + @OperateAction("O_PORTAL_COMMON_ROLELIST") + @ApiOperation(value = "快速生成永久token", + notes = "使用curl生成永久token的格式:curl -G http://域名:端口/sso/token --data-urlencode 'password=密码' -d 'loginId=登录名&tenantId=租户' ") + @ApiImplicitParams(value = { + @ApiImplicitParam(paramType = "query", dataType = "String", name = "loginId", value = "登录id", required = true), + @ApiImplicitParam(paramType = "query", dataType = "String", name = "password", value = "密码", required = true), + @ApiImplicitParam(paramType = "query", dataType = "String", name = "tenantId", value = "租户id", + required = true)}) + @RequestMapping(method = RequestMethod.GET, value = "sso/token") + @ResponseBody + public BaseResultVO grantForeverToken(@RequestParam String loginId, + @RequestParam(name = "password", required = true) String password, @RequestParam String tenantId) { + + return JsonResultUtil.getResult(authManager.grantToken(loginId, password, tenantId, null)); + } + + private Boolean getLoginTemplates(String customer) { + Boolean bool = false; + try { + GetResource.class.getClassLoader().getResource("templates/" + customer).getPath(); + bool = true; + } catch (Exception e) { + } + return bool; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/sso/service/LoginResult.java b/uam-server/src/main/java/com/idcos/enterprise/sso/service/LoginResult.java new file mode 100644 index 0000000000000000000000000000000000000000..bb12ffb5f26beb66122ba6d6d9b61780a29608a6 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/sso/service/LoginResult.java @@ -0,0 +1,40 @@ +package com.idcos.enterprise.sso.service; + +import java.util.Map; + +/** + * @author xizhao + */ +public class LoginResult { + /** + * true: login success, false: login failed + */ + private boolean status; + private String message; + private Map<String, Object> otherData; + + public boolean isStatus() { + return status; + } + + public void setStatus(boolean status) { + this.status = status; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Map<String, Object> getOtherData() { + return otherData; + } + + public void setOtherData(Map<String, Object> otherData) { + this.otherData = otherData; + } + +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/sso/service/LoginService.java b/uam-server/src/main/java/com/idcos/enterprise/sso/service/LoginService.java new file mode 100644 index 0000000000000000000000000000000000000000..5884ff6c31cf227c6cd86e903c639393c03f1481 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/sso/service/LoginService.java @@ -0,0 +1,33 @@ +package com.idcos.enterprise.sso.service; + +import com.idcos.enterprise.portal.dal.enums.LoginType; +import com.idcos.enterprise.portal.form.LoginForm; + +/** + * @author xizhao + */ +public interface LoginService { + + /** + * action + * + * @return LoginType + */ + LoginType action(); + + /** + * login + * + * @param form + * @return + */ + LoginResult login(LoginForm form); + + /** + * afterLogin + * + * @param customer + * @return + */ + String afterLogin(String customer); +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/sso/service/impl/DefaultLoginServiceImpl.java b/uam-server/src/main/java/com/idcos/enterprise/sso/service/impl/DefaultLoginServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..242dcdcfce551c35f550fda8a34c6d6483470e92 --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/sso/service/impl/DefaultLoginServiceImpl.java @@ -0,0 +1,50 @@ +package com.idcos.enterprise.sso.service.impl; + +import com.idcos.enterprise.portal.dal.entity.PortalUser; +import com.idcos.enterprise.portal.dal.enums.LoginType; +import com.idcos.enterprise.portal.form.LoginForm; +import com.idcos.enterprise.sso.CheckLoginService; +import com.idcos.enterprise.sso.service.LoginResult; +import com.idcos.enterprise.sso.service.LoginService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @Author: Dai + * @Date: 2018/10/28 4:02 AM + * @Description: + */ +@Service +public class DefaultLoginServiceImpl implements LoginService { + private static final Logger logger = LoggerFactory.getLogger(DefaultLoginServiceImpl.class); + @Autowired + private CheckLoginService checkLoginService; + + @Override + public LoginType action() { + return LoginType.DEFAULT; + } + + /** + * 默认登录逻辑 + * + * @param form + * @return + */ + @Override + public LoginResult login(LoginForm form) { + PortalUser portalUser = checkLoginService.checkUser(form.getLoginId(), form.getTenantId()); + checkLoginService.checkPassword(portalUser, form.getPassword()); + logger.info("===============用户" + form.getLoginId() + "@" + form.getTenantId() + "开始登入rbac系统================"); + LoginResult result = new LoginResult(); + result.setStatus(true); + return result; + } + + @Override + public String afterLogin(String customer) { + return null; + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/sso/service/impl/LoginServiceImpl.java b/uam-server/src/main/java/com/idcos/enterprise/sso/service/impl/LoginServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..093e03bb9556fccd2a9760a113072ba4bdbadb4c --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/sso/service/impl/LoginServiceImpl.java @@ -0,0 +1,70 @@ +package com.idcos.enterprise.sso.service.impl; + +import static com.idcos.enterprise.portal.dal.enums.LoginType.DEFAULT; +import static com.idcos.enterprise.portal.dal.enums.LoginType.WEBANK; + +import java.util.*; + +import javax.servlet.http.HttpServletResponse; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.idcos.cloud.core.common.biz.CommonResult; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessQueryCallback; +import com.idcos.enterprise.portal.biz.common.tempalte.BusinessQueryTemplate; +import com.idcos.enterprise.portal.dal.entity.PortalUser; +import com.idcos.enterprise.portal.dal.enums.LoginType; +import com.idcos.enterprise.portal.dal.enums.SourceTypeEnum; +import com.idcos.enterprise.portal.form.LoginForm; +import com.idcos.enterprise.sso.CheckLoginService; +import com.idcos.enterprise.sso.service.LoginResult; +import com.idcos.enterprise.sso.service.LoginService; + +/** + * @Author: Dai + * @Date: 2018/10/8 下午5:25 + * @Description: + */ +@Service +public class LoginServiceImpl { + private BusinessQueryTemplate businessQueryTemplate; + private CheckLoginService checkLoginService; + + private final Map<LoginType, LoginService> loginServiceMap = new HashMap<>(); + + @Autowired + public LoginServiceImpl(BusinessQueryTemplate businessQueryTemplate, CheckLoginService checkLoginService, + List<LoginService> loginServices) { + this.businessQueryTemplate = businessQueryTemplate; + this.checkLoginService = checkLoginService; + for (LoginService loginService : loginServices) { + loginServiceMap.put(loginService.action(), loginService); + } + } + + public CommonResult<?> login(final LoginForm loginForm) { + return businessQueryTemplate.process(new BusinessQueryCallback<LoginResult>() { + @Override + public LoginResult doQuery() { + return loginServiceMap.get(DEFAULT).login(loginForm); + } + + @Override + public void checkParam() {} + }); + } + + public CommonResult<?> afterLogin(final HttpServletResponse response, final String customer) { + return businessQueryTemplate.process(new BusinessQueryCallback<Void>() { + + @Override + public Void doQuery() { + return null; + } + + @Override + public void checkParam() {} + }); + } +} diff --git a/uam-server/src/main/java/com/idcos/enterprise/swagger/SwaggerConfiguration.java b/uam-server/src/main/java/com/idcos/enterprise/swagger/SwaggerConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..64dbde1ff07a677bfdf489e9623910f11a157f7e --- /dev/null +++ b/uam-server/src/main/java/com/idcos/enterprise/swagger/SwaggerConfiguration.java @@ -0,0 +1,66 @@ +/** + * 杭州云霁科技有限公司 + * http://www.idcos.com + * Copyright (c) 2016 All Rights Reserved. + */ +package com.idcos.enterprise.swagger; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.util.StopWatch; +import springfox.documentation.builders.ParameterBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.schema.ModelRef; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Contact; +import springfox.documentation.service.Parameter; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +import java.util.Arrays; + +/** + * 启动swagger进行API描述自动生成在线文档。 + * + * @author aol_aog + * @version $Id: SwaggerConfiguration.java, v 0.1 2016年4月9日 上午11:07:09 aol_aog Exp $ + */ +@Configuration +@EnableSwagger2 +public class SwaggerConfiguration { + + private final Logger log = LoggerFactory.getLogger(SwaggerConfiguration.class); + Parameter parameterAccessToken = new ParameterBuilder().name("access-token") + .description("Access token identifier").modelRef(new ModelRef("string")) + .parameterType("header").required(false).build(); + + /** + * 第三方系统的接口API + * + * @return + */ + @Bean + public Docket thirdPartSysDocket() { + log.debug("Directory系统接口API,version: v1"); + StopWatch watch = new StopWatch(); + watch.start(); + Docket swaggerSpringMvcPlugin = new Docket(DocumentationType.SWAGGER_2) + .groupName("Directory_V1_API").apiInfo(apiInfo()).select() + .apis(RequestHandlerSelectors.basePackage("com.idcos.enterprise")) + .paths(PathSelectors.any()) + .build(); + swaggerSpringMvcPlugin.globalOperationParameters(Arrays.asList(new Parameter[]{parameterAccessToken})); + watch.stop(); + log.info("Started {} Swagger2 in {} ms", "Directory系统接口API", watch.getTotalTimeMillis()); + return swaggerSpringMvcPlugin; + } + + private ApiInfo apiInfo() { + return new ApiInfo("rbac系统内部模块间API接口说明", "主要描述相关API接口的详细信息,包括输入、输出参数、调用方式等信息。", "1.0", "无", + new Contact("", "", ""), "", "无"); + } +} diff --git a/uam-server/src/main/resources/.DS_Store b/uam-server/src/main/resources/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..bf2cf945823ebc99cb86c9cc1d2f7097b2bc2c2b Binary files /dev/null and b/uam-server/src/main/resources/.DS_Store differ diff --git a/uam-server/src/main/resources/banner.txt b/uam-server/src/main/resources/banner.txt new file mode 100644 index 0000000000000000000000000000000000000000..7f97a5493ada074ef317c77a41e25305dd2df6b1 --- /dev/null +++ b/uam-server/src/main/resources/banner.txt @@ -0,0 +1,6 @@ +${AnsiColor.BRIGHT_YELLOW} ██████╗██╗ ██████╗ ██╗ ██╗██████╗ ${AnsiColor.BRIGHT_RED} ██╗ ██╗ █████╗ ███╗ ███╗ +${AnsiColor.BRIGHT_YELLOW} ██╔════╝██║ ██╔═══██╗██║ ██║██╔══██╗ ${AnsiColor.BRIGHT_RED} ██║ ██║██╔══██╗████╗ ████║ +${AnsiColor.BRIGHT_YELLOW} ██║ ██║ ██║ ██║██║ ██║██║ ██║ ${AnsiColor.BRIGHT_RED} ██║ ██║███████║██╔████╔██║ +${AnsiColor.BRIGHT_YELLOW} ██║ ██║ ██║ ██║██║ ██║██║ ██║ ${AnsiColor.BRIGHT_RED} ██║ ██║██╔══██║██║╚██╔╝██║ +${AnsiColor.BRIGHT_YELLOW} ╚██████╗███████╗╚██████╔╝╚██████╔╝██████╔╝ ${AnsiColor.BRIGHT_RED} ╚██████╔╝██║ ██║██║ ╚═╝ ██║ +${AnsiColor.BRIGHT_YELLOW} ╚═════╝╚══════╝ ╚═════╝ ╚═════╝ ╚═════╝ ${AnsiColor.BRIGHT_RED} ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ${AnsiColor.BRIGHT_BLUE}server v2.0 diff --git a/uam-server/src/main/resources/ehcache.xml b/uam-server/src/main/resources/ehcache.xml new file mode 100644 index 0000000000000000000000000000000000000000..61e6875d1773b3d6aac6edd8d7dc2728fe08aad9 --- /dev/null +++ b/uam-server/src/main/resources/ehcache.xml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" + updateCheck="false"> + <diskStore path="java.io.tmpdir/Tmp_EhCache"/> + <defaultCache eternal="false" maxElementsInMemory="1000" overflowToDisk="false" diskPersistent="false" + timeToIdleSeconds="0" timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU"/> + + <cache name="demo" + + eternal="false" + maxElementsInMemory="100" + overflowToDisk="false" + diskPersistent="false" + timeToIdleSeconds="0" + timeToLiveSeconds="300" + memoryStoreEvictionPolicy="LRU"/> + + <cache name="findDictByCodeAndTypeCode" + eternal="false" + maxElementsInMemory="100" + overflowToDisk="false" + diskPersistent="false" + timeToIdleSeconds="0" + timeToLiveSeconds="300" + memoryStoreEvictionPolicy="LRU"/> + + <cache name="findDictByTypeCode" + eternal="false" + maxElementsInMemory="100" + overflowToDisk="false" + diskPersistent="false" + timeToIdleSeconds="0" + timeToLiveSeconds="300" + memoryStoreEvictionPolicy="LRU"/> + + <cache name="findDictByNameAndTypeCode" + eternal="false" + maxElementsInMemory="100" + overflowToDisk="false" + diskPersistent="false" + timeToIdleSeconds="0" + timeToLiveSeconds="300" + memoryStoreEvictionPolicy="LRU"/> + + +</ehcache> \ No newline at end of file diff --git a/uam-server/src/main/resources/logback-base.xml b/uam-server/src/main/resources/logback-base.xml new file mode 100644 index 0000000000000000000000000000000000000000..4c976082472206d0476d39cd31775b1a385d4bfd --- /dev/null +++ b/uam-server/src/main/resources/logback-base.xml @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!-- +Base logback configuration provided for rbac +--> + +<included> + <property name="LOG_PATH" value="${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}" /> + + <include resource="org/springframework/boot/logging/logback/defaults.xml" /> + <include resource="org/springframework/boot/logging/logback/console-appender.xml" /> + + <!--日志存储目录--> + <!-- <property name="LOG_DIR" value="${sys:user.home}/logs/automate/" /> --> + <!--保留多少天的日志--> + <property name="LOG_HIS_MAX" value="10" /> + <property name="LOG_FILE" value="${LOG_PATH}/rbac/common-default.log" /> + + <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${LOG_PATH}/rbac/common-error.log</file> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>${LOG_PATH}/rbac/common-error.log.%d{yyyy-MM-dd}</fileNamePattern> + <maxHistory>10</maxHistory> + </rollingPolicy> + <encoder> + <pattern>%d{HH:mm:ss.SSS} %thread %X{invokeNo} %logger{40} %msg%n</pattern> + </encoder> + <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 --> + <level>ERROR</level> + <onMatch>ACCEPT</onMatch> + <onMismatch>DENY</onMismatch> + </filter> + </appender> + + <appender name="DEFAULT_FILE" + class="ch.qos.logback.core.rolling.RollingFileAppender"> + <encoder> + <pattern>${FILE_LOG_PATTERN}</pattern> + </encoder> + <file>${LOG_FILE}</file> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}</fileNamePattern> + </rollingPolicy> + <triggeringPolicy + class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> + <MaxFileSize>10MB</MaxFileSize> + </triggeringPolicy> + </appender> + + <root level="INFO"> + <appender-ref ref="CONSOLE" /> + <appender-ref ref="DEFAULT_FILE" /> + <appender-ref ref="ERROR" /> + </root> + +</included> diff --git a/uam-server/src/main/resources/logback-spring.xml b/uam-server/src/main/resources/logback-spring.xml new file mode 100644 index 0000000000000000000000000000000000000000..85a0d2a7478985b989b944190f5acd0a449aa672 --- /dev/null +++ b/uam-server/src/main/resources/logback-spring.xml @@ -0,0 +1,58 @@ +<?xml version="1.0" encoding="UTF-8"?> +<configuration> + + <include resource="logback-base.xml"/> + <jmxConfigurator/> + <!-- <logger name="org.springframework.web" level="ERROR"/> --> + + <appender name="AUTOMATE_BIZ_DEFAULT" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${LOG_PATH}/rbac/rbac-biz-default.log</file> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>>${LOG_PATH}/rbac/rbac-biz-default.log.%d{yyyy-MM-dd}</fileNamePattern> + <maxHistory>10</maxHistory> + </rollingPolicy> + <encoder> + <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> + </encoder> + </appender> + + <appender name="Hibernate" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${LOG_PATH}/rbac/hibernate.log</file> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>${LOG_PATH}/rbac/hibernate.log.%d{yyyy-MM-dd}</fileNamePattern> + <maxHistory>10</maxHistory> + </rollingPolicy> + <encoder> + <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> + </encoder> + </appender> + + <appender name="SAL_DEBUG_LOGGER_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>${LOG_PATH}/rbac/sal-debug.log</file> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>${LOG_PATH}/rbac/sal-debug.log.%d{yyyy-MM-dd}</fileNamePattern> + <maxHistory>10</maxHistory> + </rollingPolicy> + <encoder> + <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> + </encoder> + </appender> + + <springProfile name="dev"> + + <logger name="com.idcos.enterprise.biz" additivity="false"> + <appender-ref ref="AUTOMATE_BIZ_DEFAULT" /> + <appender-ref ref="ERROR" /> + </logger> + + <logger name="org.hibernate" additivity="false"> + <appender-ref ref="Hibernate" /> + <appender-ref ref="ERROR" /> + </logger> + </springProfile> + + <logger name="SAL_DEBUG_LOGGER" additivity="false"> + <appender-ref ref="SAL_DEBUG_LOGGER_APPENDER"/> + </logger> + +</configuration> \ No newline at end of file diff --git a/uam-server/src/main/resources/menu.yaml b/uam-server/src/main/resources/menu.yaml new file mode 100644 index 0000000000000000000000000000000000000000..8f1b06265dc126dec8473454c8bd5d3c24ace3c5 --- /dev/null +++ b/uam-server/src/main/resources/menu.yaml @@ -0,0 +1,54 @@ +id: CloudUamMenu +title: CloudUam菜单权限 +children: + - id: login + title: 登录 + children: [] + - id: user + title: 用户管理 + children: + - id: user.list + title: 查看用户列表 + children: [] + - id: user.create + title: 新建用户 + children: [] + - id: user.import + title: 导入用户 + children: [] + - id: user.export + title: 导出用户 + children: [] + - id: user.operate + title: 用户操作(编辑、删除等) + children: [] + - id: user.deptTree + title: 查看部门树 + children: [] + - id: user.deptOperate + title: 部门操作(编辑、删除等) + children: [] + - id: userGroup + title: 用户组管理 + children: + - id: userGroup.list + title: 查看用户组列表 + children: [] + - id: userGroup.create + title: 新建用户组 + children: [] + - id: userGroup.operate + title: 用户组操作(编辑、删除等) + children: [] + - id: role + title: 角色管理 + children: [] + - id: permission + title: 权限资源管理 + children: [] + - id: resource + title: 权限资源分配 + children: [] + - id: tenant + title: 租户管理 + children: [] diff --git a/uam-server/src/main/resources/templates/default/login.html b/uam-server/src/main/resources/templates/default/login.html new file mode 100644 index 0000000000000000000000000000000000000000..387de475043427a2209e493baacb53b824809f73 --- /dev/null +++ b/uam-server/src/main/resources/templates/default/login.html @@ -0,0 +1,208 @@ +<!DOCTYPE html> +<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> +<head> + <meta charset="UTF-8"/> + <meta http-equiv="X-UA-Compatible" content="IE=edge"/> + <title>单点登录系统</title> + <meta name="description" content=""/> + <meta name="viewport" content="width=device-width, initial-scale=1"/> + <link rel="stylesheet" href="/public/assets/bootstrap.css"/> + <link rel="stylesheet" href="/public/assets/app.css"/> + <style type="text/css"> + .swal-button { + padding: 7px 19px; + border-radius: 2px; + background-color: #37a5fa; + font-size: 12px; + border: 1px solid #3e549a; + text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.3); + } + + .layui-layer-title { + display: none !important; + } + + .layui-layer-setwin { + display: none !important; + } + + </style> +</head> + +<body> +<div class="login"> + <div class="overlay"> + <div class="login-panel-wrapper"> + <div class="login-panel left"> + <div class="wrapper"> + <div class="left-panel-logo"> + <img src="/public/img/login/logo.png" width="320px" alt="统一认证系统"/> + </div> + </div> + </div> + <div class="login-panel right"> + <div class="login-body"> + <div class="login-body-banner"> + <strong style="font-size: 20px">用户登录</strong> + </div> + <div class="login-content"> + <form id="user" method="POST"> + <div class="form-group clearfix"> + <i class="user-icon"></i> + <input id="loginName" type="text" class="form-control" + placeholder="您的用户名" + name="loginName"/><span></span> + </div> + <div class="form-group clearfix"> + <i class="pwd-icon"></i> + <input id="password" type="password" class="form-control" + placeholder="PIN+TOKEN" + name="password"/><span></span> + </div> + <div class="forget-helper"> + <button id="login" class="btn submit"> + 登录 + </button> + </div> + </form> + </div> + </div> + </div> + </div> + </div> +</div> + +<script type="text/javascript" src="/public/assets/jquery.js"></script> +<script type="text/javascript" src="/public/assets/bootstrap.js"></script> +<script type="text/javascript" src="/public/assets/layer/layer.js"></script> + +<script type="text/javascript" src="/public/assets/crypto/crypto-js.js"></script> + +<script th:inline="javascript"> + var isMultiTenant = [[${isMultiTenant}]]; + var decryptKey = [[${decryptKey}]]; + var customer = [[${customer}]]; + $(function () { + console.log("isMultiTenant: " + isMultiTenant); + + $("#login").click(function () { + $("#loginName").blur(); + $("#password").blur(); + + //认证回调地址验证 + var url = window.location.href; + if (url.indexOf("authCallbackUrl") === -1) { + alertInfo("回调地址不能为空,请确认"); + return false; + } else if (url.split("authCallbackUrl=")[1] === "") { + swal("回调地址不能为空,请确认"); + return false; + } + + + //验证用户名和密码不能为空 + var loginName = $("#loginName").val(); + var password = $("#password").val(); + var loginId; + var tenantId; + if (loginName === "") { + alertInfo("登录帐号不能为空,请确认") + return false; + } + if (password === "") { + alertInfo("密码不能为空,请确认") + return false; + } + + if (isMultiTenant === true) { + //校验用户名格式,必须是xxx@czbank格式 + if (loginName.indexOf("@") == -1) { + alertInfo("用户名需包含@"); + return false; + } + var loginArray = loginName.split("@"); + if (loginArray[1] == '') { + alertInfo("用户名格式为:xxx@czbank;请重新填写"); + return false; + } + loginId = loginArray[0]; + tenantId = loginArray[1]; + } else { + loginId = loginName; + tenantId = "default"; + } + + var dat = { + "tenantId": tenantId, + "loginId": loginId, + "password": encryptByDESModeEBC(password) + }; + var json = JSON.stringify(dat); + $.ajax({ + type: "POST", + url: "/sso/login?customer=" + customer, + data: json, + contentType: "application/json; charset=utf-8", + async: false, + timeout: 3000, // 3s + success: function (data) { + if (data.status == "SUCCESS") { + //验证成功,则带着token进行跳转 + var href = decodeURIComponent(url.split("authCallbackUrl=")[1]); + if (href.indexOf("?") === -1) { + window.location.href = href + "?" + data.content; + } else { + var hre = (href + "&amp;" + data.content).replace("amp;", ""); + window.location.href = hre; + } + } else { + //错误给出错误提示信息 + alertInfo(data.message); + } + + }, + error: function (err) { + alert(err); + } + }); + + //禁用按钮的提交 + return false; + }); + + //错误提示框 + function alertInfo(info) { + layer.alert(info, { + area: '400px' + }) + } + + + function encryptByDESModeEBC(password) { + var keyHex = CryptoJS.enc.Utf8.parse(decryptKey); + var encrypted = CryptoJS.DES.encrypt(password, keyHex, { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7 + }); + return encrypted.toString(); + } + + + function decryptByDESModeEBC(encrypt) { + var keyHex = CryptoJS.enc.Utf8.parse(decryptKey); + var decrypted = CryptoJS.DES.decrypt( + encrypt, keyHex, { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7 + }); + var result_value = decrypted.toString(CryptoJS.enc.Utf8); + return result_value; + } + + }); + + +</script> +</body> + +</html> diff --git a/uam-server/src/main/webapp/.DS_Store b/uam-server/src/main/webapp/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c733cb378d5e5e6467b8a799ba50c309b80105ed Binary files /dev/null and b/uam-server/src/main/webapp/.DS_Store differ diff --git a/uam-server/src/main/webapp/favicon.ico b/uam-server/src/main/webapp/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a45cf65078c39ff9b5c69e7f2521ce418b21ba86 Binary files /dev/null and b/uam-server/src/main/webapp/favicon.ico differ diff --git a/uam-server/src/main/webapp/public/assets/app.css b/uam-server/src/main/webapp/public/assets/app.css new file mode 100644 index 0000000000000000000000000000000000000000..392be80fb10b196624216ca86c90ab56da3b03be --- /dev/null +++ b/uam-server/src/main/webapp/public/assets/app.css @@ -0,0 +1,189 @@ +.notify { + position: absolute; + top: 10px; + width: 382px; +} + +.login { + background: url("../img/login/bg.png") no-repeat center center fixed; + position: fixed; + background-size: 100% 100%; + margin: 0; + left: 0; + top: 0; + bottom: 0; + right: 0; + width: 100%; + height: 100%; + display: table; + font-weight: 200; + overflow: hidden; +} + +.login .login-logo { + position: absolute; + top: 60px; + left: 100px; +} + +.login .login-logo img { + width: 158px; +} + +.login .overlay { + display: table-cell; + vertical-align: middle; + padding: 0; + margin: 0; +} + +.login .overlay .login-panel-wrapper { + display: flex; + width: 908px; /* 454px * 2 */ + margin: 0 auto; +} + +.login .overlay .login-panel { + width: 50%; + height: 400px; + /* margin: 0 auto; */ + font-size: 12px; +} + +.login .overlay .login-panel.left { + background: #07195B; + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; + text-align: center; + display: flex; + display: -ms-flexbox; + justify-content: center; + align-items: center +} + +.login .overlay .login-panel.left .left-panel-text { + margin-top: 10px; + font-size: 16px; + color: #FDFDFD; + font-weight: 400; +} + +.login .overlay .login-panel.right { + background: #F7FBFF; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +.login .overlay .login-panel .login-header { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} + +.login .overlay .login-panel .login-title img { + margin-top: -74px; + width: 271px; +} + +.login .overlay .login-body { + width: 100%; + height: 100%; + /* background: white; */ + padding-top: 75px; + /* border-radius: 3px; */ +} + +.login .overlay .login-body .login-left { + width: 72px; +} + +.login .overlay .login-body .login-body-banner { + /*text-align: center;*/ + padding-left: 100px; +} + +.login .overlay .login-content { + margin-top: 20px; + padding: 0 100px; +} + +.login .overlay .form-group { + margin-bottom: 24px; +} + +.login .overlay .form-group .user-icon { + position: absolute; + width: 20px; + height: 20px; + margin: 10px; + background: url("../img/login/usericon.svg") no-repeat; +} + +.login .overlay .form-group .pwd-icon { + position: absolute; + width: 20px; + height: 20px; + margin: 10px; + background: url("../img/login/pwdicon.svg") no-repeat; +} + +.login .overlay input.form-control { + height: 40px; + font-size: 14px; + padding: 6px 10px; + border-radius: 3px; + border-color: #A5AFBC; + padding-left: 40px; +} + +.login .overlay input.form-control:focus { + border-color: #0492FF; +} + +.login .overlay .btn.submit { + /* width: 81px; */ + width: 100%; + height: 34px; + padding: 0 10px; + text-align: center; + background: #07195B; + outline: none; + box-shadow: none; + border: none; + color: white; + font-size: 14px; + border-radius: 3px; + transition: .3s; +} + +.login .overlay .btn.submit:hover { + background: #348FFE; +} + +.login .overlay .forget-helper { + padding-top: 5px; +} + +.login .overlay a { + color: #51A3FF; + margin: 0 10px; +} + +.login .overlay i.line { + width: 2px; + border-right: solid 1px #ddd; + margin-left: 8px; +} + +.login .overlay .io-btn { + padding: 5px 20px; + border-radius: 0; +} + +.login .overlay p.footer { + color: #5B627C; + position: absolute; + left: 0; + bottom: 10px; + width: 100%; + text-align: center; +} \ No newline at end of file diff --git a/uam-server/src/main/webapp/public/assets/bootstrap.css b/uam-server/src/main/webapp/public/assets/bootstrap.css new file mode 100644 index 0000000000000000000000000000000000000000..4cf729e4342a51d8b300e8d43f2f78b0a6faf403 --- /dev/null +++ b/uam-server/src/main/webapp/public/assets/bootstrap.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/uam-server/src/main/webapp/public/assets/bootstrap.js b/uam-server/src/main/webapp/public/assets/bootstrap.js new file mode 100644 index 0000000000000000000000000000000000000000..e79c065134f2cfcf3e44a59cffcb5f090232f98f --- /dev/null +++ b/uam-server/src/main/webapp/public/assets/bootstrap.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under the MIT license + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>2)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.6",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.6",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.6",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.6",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",c).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in"),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a(document.createElement("div")).addClass("modal-backdrop "+e).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",a,b)};c.VERSION="3.3.6",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-m<o.top?"bottom":"right"==h&&k.right+l>o.width?"left":"left"==h&&k.left-l<o.left?"right":h,f.removeClass(n).addClass(h)}var p=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(p,h);var q=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",q).emulateTransitionEnd(c.TRANSITION_DURATION):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top+=g,b.left+=h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.6",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.6",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active"); +d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.6",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.6",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/uam-server/src/main/webapp/public/assets/bootstrap.min.css.map b/uam-server/src/main/webapp/public/assets/bootstrap.min.css.map new file mode 100644 index 0000000000000000000000000000000000000000..5f49bb37443c13fec81f2089d0d5559bc5a407e4 --- /dev/null +++ b/uam-server/src/main/webapp/public/assets/bootstrap.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["less/normalize.less","less/print.less","bootstrap.css","dist/css/bootstrap.css","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":";;;;4EAQA,KACE,YAAA,WACA,yBAAA,KACA,qBAAA,KAOF,KACE,OAAA,EAaF,QAAA,MAAA,QAAA,WAAA,OAAA,OAAA,OAAA,OAAA,KAAA,KAAA,IAAA,QAAA,QAaE,QAAA,MAQF,MAAA,OAAA,SAAA,MAIE,QAAA,aACA,eAAA,SAQF,sBACE,QAAA,KACA,OAAA,EAQF,SAAA,SAEE,QAAA,KAUF,EACE,iBAAA,YAQF,SAAA,QAEE,QAAA,EAUF,YACE,cAAA,IAAA,OAOF,EAAA,OAEE,YAAA,IAOF,IACE,WAAA,OAQF,GACE,OAAA,MAAA,EACA,UAAA,IAOF,KACE,MAAA,KACA,WAAA,KAOF,MACE,UAAA,IAOF,IAAA,IAEE,SAAA,SACA,UAAA,IACA,YAAA,EACA,eAAA,SAGF,IACE,IAAA,MAGF,IACE,OAAA,OAUF,IACE,OAAA,EAOF,eACE,SAAA,OAUF,OACE,OAAA,IAAA,KAOF,GACE,OAAA,EAAA,mBAAA,YAAA,gBAAA,YACA,WAAA,YAOF,IACE,SAAA,KAOF,KAAA,IAAA,IAAA,KAIE,YAAA,UAAA,UACA,UAAA,IAkBF,OAAA,MAAA,SAAA,OAAA,SAKE,OAAA,EACA,KAAA,QACA,MAAA,QAOF,OACE,SAAA,QAUF,OAAA,OAEE,eAAA,KAWF,OAAA,wBAAA,kBAAA,mBAIE,mBAAA,OACA,OAAA,QAOF,iBAAA,qBAEE,OAAA,QAOF,yBAAA,wBAEE,QAAA,EACA,OAAA,EAQF,MACE,YAAA,OAWF,qBAAA,kBAEE,mBAAA,WAAA,gBAAA,WAAA,WAAA,WACA,QAAA,EASF,8CAAA,8CAEE,OAAA,KAQF,mBACE,mBAAA,YACA,gBAAA,YAAA,WAAA,YAAA,mBAAA,UASF,iDAAA,8CAEE,mBAAA,KAOF,SACE,QAAA,MAAA,OAAA,MACA,OAAA,EAAA,IACA,OAAA,IAAA,MAAA,OAQF,OACE,QAAA,EACA,OAAA,EAOF,SACE,SAAA,KAQF,SACE,YAAA,IAUF,MACE,eAAA,EACA,gBAAA,SAGF,GAAA,GAEE,QAAA,uFCjUF,aA7FI,EAAA,OAAA,QAGI,MAAA,eACA,YAAA,eACA,WAAA,cAAA,mBAAA,eACA,WAAA,eAGJ,EAAA,UAEI,gBAAA,UAGJ,cACI,QAAA,KAAA,WAAA,IAGJ,kBACI,QAAA,KAAA,YAAA,IAKJ,6BAAA,mBAEI,QAAA,GAGJ,WAAA,IAEI,OAAA,IAAA,MAAA,KC4KL,kBAAA,MDvKK,MC0KL,QAAA,mBDrKK,IE8KN,GDLC,kBAAA,MDrKK,ICwKL,UAAA,eCUD,GF5KM,GE2KN,EF1KM,QAAA,ECuKL,OAAA,ECSD,GF3KM,GCsKL,iBAAA,MD/JK,QCkKL,QAAA,KCSD,YFtKU,oBCiKT,iBAAA,eD7JK,OCgKL,OAAA,IAAA,MAAA,KD5JK,OC+JL,gBAAA,mBCSD,UFpKU,UC+JT,iBAAA,eDzJS,mBEkKV,mBDLC,OAAA,IAAA,MAAA,gBEjPD,WACA,YAAA,uBFsPD,IAAA,+CE7OC,IAAK,sDAAuD,4BAA6B,iDAAkD,gBAAiB,gDAAiD,eAAgB,+CAAgD,mBAAoB,2EAA4E,cAE7W,WACA,SAAA,SACA,IAAA,IACA,QAAA,aACA,YAAA,uBACA,WAAA,OACA,YAAA,IACA,YAAA,EAIkC,uBAAA,YAAW,wBAAA,UACX,2BAAW,QAAA,QAEX,uBDuPlC,QAAS,QCtPyB,sBFiPnC,uBEjP8C,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,2BAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,6BAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,2BAAW,QAAA,QACX,qBAAW,QAAA,QACX,0BAAW,QAAA,QACX,qBAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,2BAAW,QAAA,QACX,sBAAW,QAAA,QACX,yBAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,+BAAW,QAAA,QACX,2BAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,8BAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,6BAAW,QAAA,QACX,6BAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,sBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,2BAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,yBAAW,QAAA,QACX,8BAAW,QAAA,QACX,6BAAW,QAAA,QACX,6BAAW,QAAA,QACX,+BAAW,QAAA,QACX,8BAAW,QAAA,QACX,gCAAW,QAAA,QACX,uBAAW,QAAA,QACX,8BAAW,QAAA,QACX,+BAAW,QAAA,QACX,iCAAW,QAAA,QACX,0BAAW,QAAA,QACX,6BAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,gCAAW,QAAA,QACX,gCAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,0BAAW,QAAA,QACX,+BAAW,QAAA,QACX,+BAAW,QAAA,QACX,wBAAW,QAAA,QACX,+BAAW,QAAA,QACX,gCAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,8BAAW,QAAA,QACX,0BAAW,QAAA,QACX,gCAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,gCAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,6BAAW,QAAA,QACX,8BAAW,QAAA,QACX,2BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,8BAAW,QAAA,QACX,+BAAW,QAAA,QACX,mCAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,2BAAW,QAAA,QACX,4BAAW,QAAA,QACX,+BAAW,QAAA,QACX,wBAAW,QAAA,QACX,2BAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,yBAAW,QAAA,QACX,6BAAW,QAAA,QACX,+BAAW,QAAA,QACX,0BAAW,QAAA,QACX,gCAAW,QAAA,QACX,+BAAW,QAAA,QACX,8BAAW,QAAA,QACX,kCAAW,QAAA,QACX,oCAAW,QAAA,QACX,sBAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,8BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,0BAAW,QAAA,QACX,4BAAW,QAAA,QACX,qCAAW,QAAA,QACX,oCAAW,QAAA,QACX,kCAAW,QAAA,QACX,oCAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,8BAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,0BAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,uBAAW,QAAA,QACX,mCAAW,QAAA,QACX,uCAAW,QAAA,QACX,gCAAW,QAAA,QACX,oCAAW,QAAA,QACX,qCAAW,QAAA,QACX,yCAAW,QAAA,QACX,4BAAW,QAAA,QACX,yBAAW,QAAA,QACX,gCAAW,QAAA,QACX,8BAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,0BAAW,QAAA,QACX,6BAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,8BAAW,QAAA,QACX,+BAAW,QAAA,QACX,gCAAW,QAAA,QACX,8BAAW,QAAA,QACX,8BAAW,QAAA,QACX,8BAAW,QAAA,QACX,2BAAW,QAAA,QACX,0BAAW,QAAA,QACX,yBAAW,QAAA,QACX,6BAAW,QAAA,QACX,2BAAW,QAAA,QACX,4BAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,2BAAW,QAAA,QACX,2BAAW,QAAA,QACX,4BAAW,QAAA,QACX,+BAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,iCAAW,QAAA,QACX,oCAAW,QAAA,QACX,iCAAW,QAAA,QACX,+BAAW,QAAA,QACX,+BAAW,QAAA,QACX,iCAAW,QAAA,QACX,qBAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QASX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,4BAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,yBAAW,QAAA,QACX,yBAAW,QAAA,QACX,+BAAW,QAAA,QACX,uBAAW,QAAA,QACX,6BAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,4BAAW,QAAA,QACX,uBAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,2BAAW,QAAA,QACX,0BAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,4BAAW,QAAA,QACX,mCAAW,QAAA,QACX,4BAAW,QAAA,QACX,oCAAW,QAAA,QACX,kCAAW,QAAA,QACX,iCAAW,QAAA,QACX,+BAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,kCAAW,QAAA,QACX,mCAAW,QAAA,QACX,sCAAW,QAAA,QACX,0CAAW,QAAA,QACX,oCAAW,QAAA,QACX,wCAAW,QAAA,QACX,qCAAW,QAAA,QACX,iCAAW,QAAA,QACX,gCAAW,QAAA,QACX,kCAAW,QAAA,QACX,+BAAW,QAAA,QACX,0BAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QCtS/C,0BCgEE,QAAA,QHi+BF,EDNC,mBAAA,WGxhCI,gBAAiB,WFiiCZ,WAAY,WGl+BZ,OADL,QJg+BJ,mBAAA,WGthCI,gBAAiB,WACpB,WAAA,WHyhCD,KGrhCC,UAAW,KAEX,4BAAA,cAEA,KACA,YAAA,iBAAA,UAAA,MAAA,WHuhCD,UAAA,KGnhCC,YAAa,WF4hCb,MAAO,KACP,iBAAkB,KExhClB,OADA,MAEA,OHqhCD,SG/gCC,YAAa,QACb,UAAA,QACA,YAAA,QAEA,EFwhCA,MAAO,QEthCL,gBAAA,KAIF,QH8gCD,QKnkCC,MAAA,QAEA,gBAAA,ULskCD,QGxgCC,QAAS,KAAK,OACd,QAAA,IAAA,KAAA,yBH0gCD,eAAA,KGngCC,OHsgCD,OAAA,ECSD,IACE,eAAgB,ODDjB,4BMhlCC,0BLmlCF,gBKplCE,iBADA,eH4EA,QAAS,MACT,UAAA,KHwgCD,OAAA,KGjgCC,aACA,cAAA,IAEA,eACA,QAAA,aC6FA,UAAA,KACK,OAAA,KACG,QAAA,IEvLR,YAAA,WACA,iBAAA,KACA,OAAA,IAAA,MAAA,KNgmCD,cAAA,IGlgCC,mBAAoB,IAAI,IAAI,YAC5B,cAAA,IAAA,IAAA,YHogCD,WAAA,IAAA,IAAA,YG7/BC,YACA,cAAA,IAEA,GHggCD,WAAA,KGx/BC,cAAe,KACf,OAAA,EACA,WAAA,IAAA,MAAA,KAEA,SACA,SAAA,SACA,MAAA,IACA,OAAA,IACA,QAAA,EH0/BD,OAAA,KGl/BC,SAAA,OF2/BA,KAAM,cEz/BJ,OAAA,EAEA,0BACA,yBACA,SAAA,OACA,MAAA,KHo/BH,OAAA,KGz+BC,OAAQ,EACR,SAAA,QH2+BD,KAAA,KCSD,cACE,OAAQ,QAQV,IACA,IMnpCE,IACA,IACA,IACA,INyoCF,GACA,GACA,GACA,GACA,GACA,GDAC,YAAA,QOnpCC,YAAa,IN4pCb,YAAa,IACb,MAAO,QAoBT,WAZA,UAaA,WAZA,UM7pCI,WN8pCJ,UM7pCI,WN8pCJ,UM7pCI,WN8pCJ,UDMC,WCLD,UACA,UAZA,SAaA,UAZA,SAaA,UAZA,SAaA,UAZA,SAaA,UAZA,SAaA,UAZA,SMrpCE,YAAa,INyqCb,YAAa,EACb,MAAO,KAGT,IMzqCE,IAJF,IN4qCA,GAEA,GDLC,GCSC,WAAY,KACZ,cAAe,KASjB,WANA,UDCC,WCCD,UM7qCA,WN+qCA,UACA,UANA,SM7qCI,UN+qCJ,SM5qCA,UN8qCA,SAQE,UAAW,IAGb,IMrrCE,IAJF,INwrCA,GAEA,GDLC,GCSC,WAAY,KACZ,cAAe,KASjB,WANA,UDCC,WCCD,UMxrCA,WN0rCA,UACA,UANA,SMzrCI,UN2rCJ,SMvrCA,UNyrCA,SMzrCU,UAAA,IACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KAOR,IADF,GPusCC,UAAA,KCSD,EM1sCE,OAAA,EAAA,EAAA,KAEA,MPqsCD,cAAA,KOhsCC,UAAW,KAwOX,YAAa,IA1OX,YAAA,IPusCH,yBO9rCC,MNusCE,UAAW,MMlsCf,OAAA,MAEE,UAAA,IAKF,MP2rCC,KO3rCsB,QAAA,KP8rCtB,iBAAA,QO7rCsB,WPgsCtB,WAAA,KO/rCsB,YPksCtB,WAAA,MOjsCsB,aPosCtB,WAAA,OOnsCsB,cPssCtB,WAAA,QOnsCsB,aPssCtB,YAAA,OOrsCsB,gBPwsCtB,eAAA,UOvsCsB,gBP0sCtB,eAAA,UOtsCC,iBPysCD,eAAA,WQ5yCC,YR+yCD,MAAA,KCSD,cOrzCI,MAAA,QAHF,qBDwGF,qBP8sCC,MAAA,QCSD,cO5zCI,MAAA,QAHF,qBD2GF,qBPktCC,MAAA,QCSD,WOn0CI,MAAA,QAHF,kBD8GF,kBPstCC,MAAA,QCSD,cO10CI,MAAA,QAHF,qBDiHF,qBP0tCC,MAAA,QCSD,aOj1CI,MAAA,QDwHF,oBAHF,oBExHE,MAAA,QACA,YR21CA,MAAO,KQz1CL,iBAAA,QAHF,mBF8HF,mBP4tCC,iBAAA,QCSD,YQh2CI,iBAAA,QAHF,mBFiIF,mBPguCC,iBAAA,QCSD,SQv2CI,iBAAA,QAHF,gBFoIF,gBPouCC,iBAAA,QCSD,YQ92CI,iBAAA,QAHF,mBFuIF,mBPwuCC,iBAAA,QCSD,WQr3CI,iBAAA,QF6IF,kBADF,kBAEE,iBAAA,QPuuCD,aO9tCC,eAAgB,INuuChB,OAAQ,KAAK,EAAE,KMruCf,cAAA,IAAA,MAAA,KAFF,GPmuCC,GCSC,WAAY,EACZ,cAAe,KM/tCf,MP2tCD,MO5tCD,MAPI,MASF,cAAA,EAIF,eALE,aAAA,EACA,WAAA,KPmuCD,aO/tCC,aAAc,EAKZ,YAAA,KACA,WAAA,KP8tCH,gBOxtCC,QAAS,aACT,cAAA,IACA,aAAA,IAEF,GNiuCE,WAAY,EM/tCZ,cAAA,KAGA,GADF,GP2tCC,YAAA,WOvtCC,GP0tCD,YAAA,IOpnCD,GAvFM,YAAA,EAEA,yBACA,kBGtNJ,MAAA,KACA,MAAA,MACA,SAAA,OVs6CC,MAAA,KO9nCC,WAAY,MAhFV,cAAA,SPitCH,YAAA,OOvsCD,kBNitCE,YAAa,OM3sCjB,0BPusCC,YOtsCC,OAAA,KA9IqB,cAAA,IAAA,OAAA,KAmJvB,YACE,UAAA,IACA,eAAA,UAEA,WPusCD,QAAA,KAAA,KOlsCG,OAAA,EAAA,EAAA,KN2sCF,UAAW,OACX,YAAa,IAAI,MAAM,KMrtCzB,yBPgtCC,wBOhtCD,yBN0tCE,cAAe,EMpsCb,kBAFA,kBACA,iBPmsCH,QAAA,MOhsCG,UAAA,INysCF,YAAa,WACb,MAAO,KMjsCT,yBP4rCC,yBO5rCD,wBAEE,QAAA,cAEA,oBACA,sBACA,cAAA,KP8rCD,aAAA,EOxrCG,WAAA,MNisCF,aAAc,IAAI,MAAM,KACxB,YAAa,EMjsCX,kCNmsCJ,kCMpsCe,iCACX,oCNosCJ,oCDLC,mCCUC,QAAS,GMlsCX,iCNosCA,iCM1sCM,gCAOJ,mCNosCF,mCDLC,kCO9rCC,QAAA,cPmsCD,QWx+CC,cAAe,KVi/Cf,WAAY,OACZ,YAAa,WU9+Cb,KX0+CD,IWt+CD,IACE,KACA,YAAA,MAAA,OAAA,SAAA,cAAA,UAEA,KACA,QAAA,IAAA,IXw+CD,UAAA,IWp+CC,MAAO,QACP,iBAAA,QACA,cAAA,IAEA,IACA,QAAA,IAAA,IACA,UAAA,IV6+CA,MU7+CA,KXs+CD,iBAAA,KW5+CC,cAAe,IASb,mBAAA,MAAA,EAAA,KAAA,EAAA,gBACA,WAAA,MAAA,EAAA,KAAA,EAAA,gBAEA,QV8+CF,QU9+CE,EXs+CH,UAAA,KWj+CC,YAAa,IACb,mBAAA,KACA,WAAA,KAEA,IACA,QAAA,MACA,QAAA,MACA,OAAA,EAAA,EAAA,KACA,UAAA,KACA,YAAA,WACA,MAAA,KACA,WAAA,UXm+CD,UAAA,WW9+CC,iBAAkB,QAehB,OAAA,IAAA,MAAA,KACA,cAAA,IAEA,SACA,QAAA,EACA,UAAA,QXk+CH,MAAA,QW79CC,YAAa,SACb,iBAAA,YACA,cAAA,EC1DF,gBCHE,WAAA,MACA,WAAA,OAEA,Wb+hDD,cAAA,KYzhDC,aAAA,KAqEA,aAAc,KAvEZ,YAAA,KZgiDH,yBY3hDC,WAkEE,MAAO,OZ89CV,yBY7hDC,WA+DE,MAAO,OZm+CV,0BY1hDC,WCvBA,MAAA,QAGA,iBbojDD,cAAA,KYvhDC,aAAc,KCvBd,aAAA,KACA,YAAA,KCAE,KACE,aAAA,MAEA,YAAA,MAGA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UdijDL,SAAA,ScjiDG,WAAA,IACE,cAAA,KdmiDL,aAAA,Kc3hDG,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Ud8hDH,MAAA,Kc9hDG,WdiiDH,MAAA,KcjiDG,WdoiDH,MAAA,acpiDG,WduiDH,MAAA,acviDG,Ud0iDH,MAAA,Ic1iDG,Ud6iDH,MAAA,ac7iDG,UdgjDH,MAAA,achjDG,UdmjDH,MAAA,IcnjDG,UdsjDH,MAAA,actjDG,UdyjDH,MAAA,aczjDG,Ud4jDH,MAAA,Ic5jDG,Ud+jDH,MAAA,achjDG,UdmjDH,MAAA,YcnjDG,gBdsjDH,MAAA,KctjDG,gBdyjDH,MAAA,aczjDG,gBd4jDH,MAAA,ac5jDG,ed+jDH,MAAA,Ic/jDG,edkkDH,MAAA,aclkDG,edqkDH,MAAA,acrkDG,edwkDH,MAAA,IcxkDG,ed2kDH,MAAA,ac3kDG,ed8kDH,MAAA,ac9kDG,edilDH,MAAA,IcjlDG,edolDH,MAAA,ac/kDG,edklDH,MAAA,YcjmDG,edomDH,MAAA,KcpmDG,gBdumDH,KAAA,KcvmDG,gBd0mDH,KAAA,ac1mDG,gBd6mDH,KAAA,ac7mDG,edgnDH,KAAA,IchnDG,edmnDH,KAAA,acnnDG,edsnDH,KAAA,actnDG,edynDH,KAAA,IcznDG,ed4nDH,KAAA,ac5nDG,ed+nDH,KAAA,ac/nDG,edkoDH,KAAA,IcloDG,edqoDH,KAAA,achoDG,edmoDH,KAAA,YcpnDG,edunDH,KAAA,KcvnDG,kBd0nDH,YAAA,Kc1nDG,kBd6nDH,YAAA,ac7nDG,kBdgoDH,YAAA,achoDG,iBdmoDH,YAAA,IcnoDG,iBdsoDH,YAAA,actoDG,iBdyoDH,YAAA,aczoDG,iBd4oDH,YAAA,Ic5oDG,iBd+oDH,YAAA,ac/oDG,iBdkpDH,YAAA,aclpDG,iBdqpDH,YAAA,IcrpDG,iBdwpDH,YAAA,acxpDG,iBd2pDH,YAAA,Yc7rDG,iBACE,YAAA,EAOJ,yBACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Ud2rDD,MAAA,Kc3rDC,Wd8rDD,MAAA,Kc9rDC,WdisDD,MAAA,acjsDC,WdosDD,MAAA,acpsDC,UdusDD,MAAA,IcvsDC,Ud0sDD,MAAA,ac1sDC,Ud6sDD,MAAA,ac7sDC,UdgtDD,MAAA,IchtDC,UdmtDD,MAAA,acntDC,UdstDD,MAAA,acttDC,UdytDD,MAAA,IcztDC,Ud4tDD,MAAA,ac7sDC,UdgtDD,MAAA,YchtDC,gBdmtDD,MAAA,KcntDC,gBdstDD,MAAA,acttDC,gBdytDD,MAAA,acztDC,ed4tDD,MAAA,Ic5tDC,ed+tDD,MAAA,ac/tDC,edkuDD,MAAA,acluDC,edquDD,MAAA,IcruDC,edwuDD,MAAA,acxuDC,ed2uDD,MAAA,ac3uDC,ed8uDD,MAAA,Ic9uDC,edivDD,MAAA,ac5uDC,ed+uDD,MAAA,Yc9vDC,ediwDD,MAAA,KcjwDC,gBdowDD,KAAA,KcpwDC,gBduwDD,KAAA,acvwDC,gBd0wDD,KAAA,ac1wDC,ed6wDD,KAAA,Ic7wDC,edgxDD,KAAA,achxDC,edmxDD,KAAA,acnxDC,edsxDD,KAAA,IctxDC,edyxDD,KAAA,aczxDC,ed4xDD,KAAA,ac5xDC,ed+xDD,KAAA,Ic/xDC,edkyDD,KAAA,ac7xDC,edgyDD,KAAA,YcjxDC,edoxDD,KAAA,KcpxDC,kBduxDD,YAAA,KcvxDC,kBd0xDD,YAAA,ac1xDC,kBd6xDD,YAAA,ac7xDC,iBdgyDD,YAAA,IchyDC,iBdmyDD,YAAA,acnyDC,iBdsyDD,YAAA,actyDC,iBdyyDD,YAAA,IczyDC,iBd4yDD,YAAA,ac5yDC,iBd+yDD,YAAA,ac/yDC,iBdkzDD,YAAA,IclzDC,iBdqzDD,YAAA,acrzDC,iBdwzDD,YAAA,YY/yDD,iBE3CE,YAAA,GAQF,yBACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Udy1DD,MAAA,Kcz1DC,Wd41DD,MAAA,Kc51DC,Wd+1DD,MAAA,ac/1DC,Wdk2DD,MAAA,acl2DC,Udq2DD,MAAA,Icr2DC,Udw2DD,MAAA,acx2DC,Ud22DD,MAAA,ac32DC,Ud82DD,MAAA,Ic92DC,Udi3DD,MAAA,acj3DC,Udo3DD,MAAA,acp3DC,Udu3DD,MAAA,Icv3DC,Ud03DD,MAAA,ac32DC,Ud82DD,MAAA,Yc92DC,gBdi3DD,MAAA,Kcj3DC,gBdo3DD,MAAA,acp3DC,gBdu3DD,MAAA,acv3DC,ed03DD,MAAA,Ic13DC,ed63DD,MAAA,ac73DC,edg4DD,MAAA,ach4DC,edm4DD,MAAA,Icn4DC,eds4DD,MAAA,act4DC,edy4DD,MAAA,acz4DC,ed44DD,MAAA,Ic54DC,ed+4DD,MAAA,ac14DC,ed64DD,MAAA,Yc55DC,ed+5DD,MAAA,Kc/5DC,gBdk6DD,KAAA,Kcl6DC,gBdq6DD,KAAA,acr6DC,gBdw6DD,KAAA,acx6DC,ed26DD,KAAA,Ic36DC,ed86DD,KAAA,ac96DC,edi7DD,KAAA,acj7DC,edo7DD,KAAA,Icp7DC,edu7DD,KAAA,acv7DC,ed07DD,KAAA,ac17DC,ed67DD,KAAA,Ic77DC,edg8DD,KAAA,ac37DC,ed87DD,KAAA,Yc/6DC,edk7DD,KAAA,Kcl7DC,kBdq7DD,YAAA,Kcr7DC,kBdw7DD,YAAA,acx7DC,kBd27DD,YAAA,ac37DC,iBd87DD,YAAA,Ic97DC,iBdi8DD,YAAA,acj8DC,iBdo8DD,YAAA,acp8DC,iBdu8DD,YAAA,Icv8DC,iBd08DD,YAAA,ac18DC,iBd68DD,YAAA,ac78DC,iBdg9DD,YAAA,Ich9DC,iBdm9DD,YAAA,acn9DC,iBds9DD,YAAA,YY18DD,iBE9CE,YAAA,GAQF,0BACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Udu/DD,MAAA,Kcv/DC,Wd0/DD,MAAA,Kc1/DC,Wd6/DD,MAAA,ac7/DC,WdggED,MAAA,achgEC,UdmgED,MAAA,IcngEC,UdsgED,MAAA,actgEC,UdygED,MAAA,aczgEC,Ud4gED,MAAA,Ic5gEC,Ud+gED,MAAA,ac/gEC,UdkhED,MAAA,aclhEC,UdqhED,MAAA,IcrhEC,UdwhED,MAAA,aczgEC,Ud4gED,MAAA,Yc5gEC,gBd+gED,MAAA,Kc/gEC,gBdkhED,MAAA,aclhEC,gBdqhED,MAAA,acrhEC,edwhED,MAAA,IcxhEC,ed2hED,MAAA,ac3hEC,ed8hED,MAAA,ac9hEC,ediiED,MAAA,IcjiEC,edoiED,MAAA,acpiEC,eduiED,MAAA,acviEC,ed0iED,MAAA,Ic1iEC,ed6iED,MAAA,acxiEC,ed2iED,MAAA,Yc1jEC,ed6jED,MAAA,Kc7jEC,gBdgkED,KAAA,KchkEC,gBdmkED,KAAA,acnkEC,gBdskED,KAAA,actkEC,edykED,KAAA,IczkEC,ed4kED,KAAA,ac5kEC,ed+kED,KAAA,ac/kEC,edklED,KAAA,IcllEC,edqlED,KAAA,acrlEC,edwlED,KAAA,acxlEC,ed2lED,KAAA,Ic3lEC,ed8lED,KAAA,aczlEC,ed4lED,KAAA,Yc7kEC,edglED,KAAA,KchlEC,kBdmlED,YAAA,KcnlEC,kBdslED,YAAA,actlEC,kBdylED,YAAA,aczlEC,iBd4lED,YAAA,Ic5lEC,iBd+lED,YAAA,ac/lEC,iBdkmED,YAAA,aclmEC,iBdqmED,YAAA,IcrmEC,iBdwmED,YAAA,acxmEC,iBd2mED,YAAA,ac3mEC,iBd8mED,YAAA,Ic9mEC,iBdinED,YAAA,acjnEC,iBdonED,YAAA,YevrED,iBACA,YAAA,GAGA,MACA,iBAAA,YAEA,Qf0rED,YAAA,IexrEC,eAAgB,IAChB,MAAA,Kf0rED,WAAA,KenrEC,GACA,WAAA,KfurED,OezrEC,MAAO,KdosEP,UAAW,KACX,cAAe,KcxrET,mBd2rER,mBc1rEQ,mBAHA,mBACA,mBd2rER,mBDHC,QAAA,IepsEC,YAAa,WAoBX,eAAA,IACA,WAAA,IAAA,MAAA,KArBJ,mBdmtEE,eAAgB,OAChB,cAAe,IAAI,MAAM,KDJ1B,uCCMD,uCcttEA,wCdutEA,wCcnrEI,2CANI,2CfqrEP,WAAA,Ee1qEG,mBf6qEH,WAAA,IAAA,MAAA,KCWD,cACE,iBAAkB,KchqEpB,6BdmqEA,6BclqEE,6BAZM,6BfuqEP,6BCMD,6BDHC,QAAA,ICWD,gBACE,OAAQ,IAAI,MAAM,Kc3qEpB,4Bd8qEA,4Bc9qEA,4BAQQ,4Bf+pEP,4BCMD,4Bc9pEM,OAAA,IAAA,MAAA,KAYF,4BAFJ,4BfqpEC,oBAAA,IexoEG,yCf2oEH,iBAAA,QejoEC,4BACA,iBAAA,QfqoED,uBe/nEG,SAAA,Od0oEF,QAAS,aczoEL,MAAA,KAEA,sBfkoEL,sBgB9wEC,SAAA,OfyxEA,QAAS,WACT,MAAO,KAST,0BetxEE,0BfgxEF,0BAGA,0BezxEM,0BAMJ,0BfixEF,0BAGA,0BACA,0BDNC,0BCAD,0BAGA,0BASE,iBAAkB,QDLnB,sCgBnyEC,sCAAA,oCf0yEF,sCevxEM,sCf4xEJ,iBAAkB,QASpB,2Be3yEE,2BfqyEF,2BAGA,2Be9yEM,2BAMJ,2BfsyEF,2BAGA,2BACA,2BDNC,2BCAD,2BAGA,2BASE,iBAAkB,QDLnB,uCgBxzEC,uCAAA,qCf+zEF,uCe5yEM,uCfizEJ,iBAAkB,QASpB,wBeh0EE,wBf0zEF,wBAGA,wBen0EM,wBAMJ,wBf2zEF,wBAGA,wBACA,wBDNC,wBCAD,wBAGA,wBASE,iBAAkB,QDLnB,oCgB70EC,oCAAA,kCfo1EF,oCej0EM,oCfs0EJ,iBAAkB,QASpB,2Ber1EE,2Bf+0EF,2BAGA,2Bex1EM,2BAMJ,2Bfg1EF,2BAGA,2BACA,2BDNC,2BCAD,2BAGA,2BASE,iBAAkB,QDLnB,uCgBl2EC,uCAAA,qCfy2EF,uCet1EM,uCf21EJ,iBAAkB,QASpB,0Be12EE,0Bfo2EF,0BAGA,0Be72EM,0BAMJ,0Bfq2EF,0BAGA,0BACA,0BDNC,0BCAD,0BAGA,0BASE,iBAAkB,QDLnB,sCejtEC,sCADF,oCdytEA,sCe32EM,sCDoJJ,iBAAA,QA6DF,kBACE,WAAY,KA3DV,WAAA,KAEA,oCACA,kBACA,MAAA,KfqtED,cAAA,Ke9pEC,WAAY,OAnDV,mBAAA,yBfotEH,OAAA,IAAA,MAAA,KCWD,yBACE,cAAe,Ec7qEjB,qCdgrEA,qCcltEI,qCARM,qCfmtET,qCCMD,qCDHC,YAAA,OCWD,kCACE,OAAQ,EcxrEV,0Dd2rEA,0Dc3rEA,0DAzBU,0Df6sET,0DCMD,0DAME,YAAa,EchsEf,yDdmsEA,yDcnsEA,yDArBU,yDfitET,yDCMD,yDAME,aAAc,EDLjB,yDe3sEW,yDEzNV,yDjBm6EC,yDiBl6ED,cAAA,GAMA,SjBm6ED,UAAA,EiBh6EC,QAAS,EACT,OAAA,EACA,OAAA,EAEA,OACA,QAAA,MACA,MAAA,KACA,QAAA,EACA,cAAA,KACA,UAAA,KjBk6ED,YAAA,QiB/5EC,MAAO,KACP,OAAA,EACA,cAAA,IAAA,MAAA,QAEA,MjBi6ED,QAAA,aiBt5EC,UAAW,Kb4BX,cAAA,IACG,YAAA,IJ83EJ,mBiBt5EC,mBAAoB,WhBi6EjB,gBAAiB,WgB/5EpB,WAAA,WjB05ED,qBiBx5EC,kBAGA,OAAQ,IAAI,EAAE,EACd,WAAA,MjBu5ED,YAAA,OiBl5EC,iBACA,QAAA,MAIF,kBhB45EE,QAAS,MgB15ET,MAAA,KAIF,iBAAA,ahB25EE,OAAQ,KIh+ER,uBL29ED,2BK19EC,wBY2EA,QAAS,KAAK,OACd,QAAA,IAAA,KAAA,yBACA,eAAA,KAEA,OACA,QAAA,MjBi5ED,YAAA,IiBv3EC,UAAW,KACX,YAAA,WACA,MAAA,KAEA,cACA,QAAA,MACA,MAAA,KACA,OAAA,KACA,QAAA,IAAA,KACA,UAAA,KACA,YAAA,WACA,MAAA,KbxDA,iBAAA,KACQ,iBAAA,KAyHR,OAAA,IAAA,MAAA,KACK,cAAA,IACG,mBAAA,MAAA,EAAA,IAAA,IAAA,iBJ0zET,WAAA,MAAA,EAAA,IAAA,IAAA,iBkBl8EC,mBAAA,aAAA,YAAA,KAAA,mBAAA,YAAA,KACE,cAAA,aAAA,YAAA,KAAA,WAAA,YAAA,KACA,WAAA,aAAA,YAAA,KAAA,WAAA,YAAA,KdWM,oBJ27ET,aAAA,QI15EC,QAAA,EACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,qBACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,qBAEF,gCAA0B,MAAA,KJ65E3B,QAAA,EI55EiC,oCJ+5EjC,MAAA,KiBl4EG,yCACA,MAAA,KAQF,0BhBw4EA,iBAAkB,YAClB,OAAQ,EgBr4EN,wBjB+3EH,wBiB53EC,iChBu4EA,iBAAkB,KgBr4EhB,QAAA,EAIF,wBACE,iCjB43EH,OAAA,YiB/2EC,sBjBk3ED,OAAA,KiBh2EG,mBhB42EF,mBAAoB,KAEtB,qDgB72EM,8BjBs2EH,8BiBn2EC,wCAAA,+BhB+2EA,YAAa,KgB72EX,iCjB22EH,iCiBx2EC,2CAAA,kChB42EF,0BACA,0BACA,oCACA,2BAKE,YAAa,KgBl3EX,iCjBg3EH,iCACF,2CiBt2EC,kChBy2EA,0BACA,0BACA,oCACA,2BgB32EA,YAAA,MhBm3EF,YgBz2EE,cAAA,KAGA,UADA,OjBm2ED,SAAA,SiBv2EC,QAAS,MhBk3ET,WAAY,KgB12EV,cAAA,KAGA,gBADA,aAEA,WAAA,KjBm2EH,aAAA,KiBh2EC,cAAe,EhB22Ef,YAAa,IACb,OAAQ,QgBt2ER,+BjBk2ED,sCiBp2EC,yBACA,gCAIA,SAAU,ShB02EV,WAAY,MgBx2EZ,YAAA,MAIF,oBAAA,cAEE,WAAA,KAGA,iBADA,cAEA,SAAA,SACA,QAAA,aACA,aAAA,KjB+1ED,cAAA,EiB71EC,YAAa,IhBw2Eb,eAAgB,OgBt2EhB,OAAA,QAUA,kCjBs1ED,4BCWC,WAAY,EACZ,YAAa,KgBz1Eb,wCAAA,qCjBq1ED,8BCOD,+BgBl2EI,2BhBi2EJ,4BAME,OAAQ,YDNT,0BiBz1EG,uBAMF,oCAAA,iChB+1EA,OAAQ,YDNT,yBiBt1EK,sBAaJ,mCAFF,gCAGE,OAAA,YAGA,qBjB20ED,WAAA,KiBz0EC,YAAA,IhBo1EA,eAAgB,IgBl1Ed,cAAA,EjB40EH,8BiB9zED,8BCnQE,cAAA,EACA,aAAA,EAEA,UACA,OAAA,KlBokFD,QAAA,IAAA,KkBlkFC,UAAA,KACE,YAAA,IACA,cAAA,IAGF,gBjB4kFA,OAAQ,KiB1kFN,YAAA,KD2PA,0BAFJ,kBAGI,OAAA,KAEA,6BACA,OAAA,KjB20EH,QAAA,IAAA,KiBj1EC,UAAW,KAST,YAAA,IACA,cAAA,IAVJ,mChBg2EE,OAAQ,KgBl1EN,YAAA,KAGA,6CAjBJ,qCAkBI,OAAA,KAEA,oCACA,OAAA,KjB20EH,WAAA,KiBv0EC,QAAS,IAAI,KC/Rb,UAAA,KACA,YAAA,IAEA,UACA,OAAA,KlBymFD,QAAA,KAAA,KkBvmFC,UAAA,KACE,YAAA,UACA,cAAA,IAGF,gBjBinFA,OAAQ,KiB/mFN,YAAA,KDuRA,0BAFJ,kBAGI,OAAA,KAEA,6BACA,OAAA,KjBo1EH,QAAA,KAAA,KiB11EC,UAAW,KAST,YAAA,UACA,cAAA,IAVJ,mChBy2EE,OAAQ,KgB31EN,YAAA,KAGA,6CAjBJ,qCAkBI,OAAA,KAEA,oCACA,OAAA,KjBo1EH,WAAA,KiB30EC,QAAS,KAAK,KAEd,UAAA,KjB40ED,YAAA,UiBx0EG,cjB20EH,SAAA,SiBt0EC,4BACA,cAAA,OAEA,uBACA,SAAA,SACA,IAAA,EACA,MAAA,EACA,QAAA,EACA,QAAA,MACA,MAAA,KjBy0ED,OAAA,KiBv0EC,YAAa,KhBk1Eb,WAAY,OACZ,eAAgB,KDLjB,oDiBz0EC,uCADA,iCAGA,MAAO,KhBk1EP,OAAQ,KACR,YAAa,KDLd,oDiBz0EC,uCADA,iCAKA,MAAO,KhBg1EP,OAAQ,KACR,YAAa,KAKf,uBAEA,8BAJA,4BADA,yBAEA,oBAEA,2BDNC,4BkBvuFG,mCAJA,yBD0ZJ,gCbvWE,MAAA,QJ6rFD,2BkB1uFG,aAAA,QACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBd4CJ,WAAA,MAAA,EAAA,IAAA,IAAA,iBJksFD,iCiB31EC,aAAc,QC5YZ,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QlB2uFH,gCiBh2EC,MAAO,QCtYL,iBAAA,QlByuFH,aAAA,QCWD,oCACE,MAAO,QAKT,uBAEA,8BAJA,4BADA,yBAEA,oBAEA,2BDNC,4BkBrwFG,mCAJA,yBD6ZJ,gCb1WE,MAAA,QJ2tFD,2BkBxwFG,aAAA,QACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBd4CJ,WAAA,MAAA,EAAA,IAAA,IAAA,iBJguFD,iCiBt3EC,aAAc,QC/YZ,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QlBywFH,gCiB33EC,MAAO,QCzYL,iBAAA,QlBuwFH,aAAA,QCWD,oCACE,MAAO,QAKT,qBAEA,4BAJA,0BADA,uBAEA,kBAEA,yBDNC,0BkBnyFG,iCAJA,uBDgaJ,8Bb7WE,MAAA,QJyvFD,yBkBtyFG,aAAA,QACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBd4CJ,WAAA,MAAA,EAAA,IAAA,IAAA,iBJ8vFD,+BiBj5EC,aAAc,QClZZ,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QlBuyFH,8BiBt5EC,MAAO,QC5YL,iBAAA,QlBqyFH,aAAA,QiBj5EG,kCjBo5EH,MAAA,QiBj5EG,2CjBo5EH,IAAA,KiBz4EC,mDACA,IAAA,EAEA,YjB44ED,QAAA,MiBzzEC,WAAY,IAwEZ,cAAe,KAtIX,MAAA,QAEA,yBjB23EH,yBiBvvEC,QAAS,aA/HP,cAAA,EACA,eAAA,OjB03EH,2BiB5vEC,QAAS,aAxHP,MAAA,KjBu3EH,eAAA,OiBn3EG,kCACA,QAAA,aAmHJ,0BhB8wEE,QAAS,aACT,eAAgB,OgBv3Ed,wCjBg3EH,6CiBxwED,2CjB2wEC,MAAA,KiB/2EG,wCACA,MAAA,KAmGJ,4BhB0xEE,cAAe,EgBt3Eb,eAAA,OAGA,uBADA,oBjBg3EH,QAAA,aiBtxEC,WAAY,EhBiyEZ,cAAe,EgBv3EX,eAAA,OAsFN,6BAAA,0BAjFI,aAAA,EAiFJ,4CjB+xEC,sCiB12EG,SAAA,SjB62EH,YAAA,EiBl2ED,kDhB82EE,IAAK,GgBp2EL,2BjBi2EH,kCiBl2EG,wBAEA,+BAXF,YAAa,IhBs3Eb,WAAY,EgBr2EV,cAAA,EJviBF,2BIshBF,wBJrhBE,WAAA,KI4jBA,6BAyBA,aAAc,MAnCV,YAAA,MAEA,yBjB01EH,gCACF,YAAA,IiB13EG,cAAe,EAwCf,WAAA,OAwBJ,sDAdQ,MAAA,KjBg1EL,yBACF,+CiBr0EC,YAAA,KAEE,UAAW,MjBw0EZ,yBACF,+CmBt6FG,YAAa,IACf,UAAA,MAGA,KACA,QAAA,aACA,QAAA,IAAA,KAAA,cAAA,EACA,UAAA,KACA,YAAA,IACA,YAAA,WACA,WAAA,OC0CA,YAAA,OACA,eAAA,OACA,iBAAA,aACA,aAAA,ahB+JA,OAAA,QACG,oBAAA,KACC,iBAAA,KACI,gBAAA,KJiuFT,YAAA,KmBz6FG,iBAAA,KlBq7FF,OAAQ,IAAI,MAAM,YAClB,cAAe,IDHhB,kBKx8FC,kBAEA,WACA,kBJ28FF,kBADA,WkBl7FE,QAAA,KAAA,OlBy7FA,QAAS,IAAI,KAAK,yBAClB,eAAgB,KkBn7FhB,WnB46FD,WmB/6FG,WlB27FF,MAAO,KkBt7FL,gBAAA,Kf6BM,YADR,YJq5FD,iBAAA,KmB56FC,QAAA,ElBw7FA,mBAAoB,MAAM,EAAE,IAAI,IAAI,iBAC5B,WAAY,MAAM,EAAE,IAAI,IAAI,iBoBn+FpC,cAGA,ejB8DA,wBACQ,OAAA,YJ65FT,OAAA,kBmB56FG,mBAAA,KlBw7FM,WAAY,KkBt7FhB,QAAA,IASN,eC3DE,yBACA,eAAA,KpBo+FD,aoBj+FC,MAAA,KnB6+FA,iBAAkB,KmB3+FhB,aAAA,KpBq+FH,mBoBn+FO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBo+FH,mBoBj+FC,MAAA,KnB6+FA,iBAAkB,QAClB,aAAc,QmBz+FR,oBADJ,oBpBo+FH,mCoBj+FG,MAAA,KnB6+FF,iBAAkB,QAClB,aAAc,QmBz+FN,0BnB++FV,0BAHA,0BmB7+FM,0BnB++FN,0BAHA,0BDFC,yCoB3+FK,yCnB++FN,yCmB1+FE,MAAA,KnBk/FA,iBAAkB,QAClB,aAAc,QmB3+FZ,oBpBm+FH,oBoBn+FG,mCnBg/FF,iBAAkB,KmB5+FV,4BnBi/FV,4BAHA,4BDHC,6BCOD,6BAHA,6BkB99FA,sCClBM,sCnBi/FN,sCmB3+FI,iBAAA,KACA,aAAA,KDcJ,oBC9DE,MAAA,KACA,iBAAA,KpB6hGD,aoB1hGC,MAAA,KnBsiGA,iBAAkB,QmBpiGhB,aAAA,QpB8hGH,mBoB5hGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpB6hGH,mBoB1hGC,MAAA,KnBsiGA,iBAAkB,QAClB,aAAc,QmBliGR,oBADJ,oBpB6hGH,mCoB1hGG,MAAA,KnBsiGF,iBAAkB,QAClB,aAAc,QmBliGN,0BnBwiGV,0BAHA,0BmBtiGM,0BnBwiGN,0BAHA,0BDFC,yCoBpiGK,yCnBwiGN,yCmBniGE,MAAA,KnB2iGA,iBAAkB,QAClB,aAAc,QmBpiGZ,oBpB4hGH,oBoB5hGG,mCnByiGF,iBAAkB,KmBriGV,4BnB0iGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBphGA,sCCrBM,sCnB0iGN,sCmBpiGI,iBAAA,QACA,aAAA,QDkBJ,oBClEE,MAAA,QACA,iBAAA,KpBslGD,aoBnlGC,MAAA,KnB+lGA,iBAAkB,QmB7lGhB,aAAA,QpBulGH,mBoBrlGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBslGH,mBoBnlGC,MAAA,KnB+lGA,iBAAkB,QAClB,aAAc,QmB3lGR,oBADJ,oBpBslGH,mCoBnlGG,MAAA,KnB+lGF,iBAAkB,QAClB,aAAc,QmB3lGN,0BnBimGV,0BAHA,0BmB/lGM,0BnBimGN,0BAHA,0BDFC,yCoB7lGK,yCnBimGN,yCmB5lGE,MAAA,KnBomGA,iBAAkB,QAClB,aAAc,QmB7lGZ,oBpBqlGH,oBoBrlGG,mCnBkmGF,iBAAkB,KmB9lGV,4BnBmmGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBzkGA,sCCzBM,sCnBmmGN,sCmB7lGI,iBAAA,QACA,aAAA,QDsBJ,oBCtEE,MAAA,QACA,iBAAA,KpB+oGD,UoB5oGC,MAAA,KnBwpGA,iBAAkB,QmBtpGhB,aAAA,QpBgpGH,gBoB9oGO,gBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpB+oGH,gBoB5oGC,MAAA,KnBwpGA,iBAAkB,QAClB,aAAc,QmBppGR,iBADJ,iBpB+oGH,gCoB5oGG,MAAA,KnBwpGF,iBAAkB,QAClB,aAAc,QmBppGN,uBnB0pGV,uBAHA,uBmBxpGM,uBnB0pGN,uBAHA,uBDFC,sCoBtpGK,sCnB0pGN,sCmBrpGE,MAAA,KnB6pGA,iBAAkB,QAClB,aAAc,QmBtpGZ,iBpB8oGH,iBoB9oGG,gCnB2pGF,iBAAkB,KmBvpGV,yBnB4pGV,yBAHA,yBDHC,0BCOD,0BAHA,0BkB9nGA,mCC7BM,mCnB4pGN,mCmBtpGI,iBAAA,QACA,aAAA,QD0BJ,iBC1EE,MAAA,QACA,iBAAA,KpBwsGD,aoBrsGC,MAAA,KnBitGA,iBAAkB,QmB/sGhB,aAAA,QpBysGH,mBoBvsGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBwsGH,mBoBrsGC,MAAA,KnBitGA,iBAAkB,QAClB,aAAc,QmB7sGR,oBADJ,oBpBwsGH,mCoBrsGG,MAAA,KnBitGF,iBAAkB,QAClB,aAAc,QmB7sGN,0BnBmtGV,0BAHA,0BmBjtGM,0BnBmtGN,0BAHA,0BDFC,yCoB/sGK,yCnBmtGN,yCmB9sGE,MAAA,KnBstGA,iBAAkB,QAClB,aAAc,QmB/sGZ,oBpBusGH,oBoBvsGG,mCnBotGF,iBAAkB,KmBhtGV,4BnBqtGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBnrGA,sCCjCM,sCnBqtGN,sCmB/sGI,iBAAA,QACA,aAAA,QD8BJ,oBC9EE,MAAA,QACA,iBAAA,KpBiwGD,YoB9vGC,MAAA,KnB0wGA,iBAAkB,QmBxwGhB,aAAA,QpBkwGH,kBoBhwGO,kBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBiwGH,kBoB9vGC,MAAA,KnB0wGA,iBAAkB,QAClB,aAAc,QmBtwGR,mBADJ,mBpBiwGH,kCoB9vGG,MAAA,KnB0wGF,iBAAkB,QAClB,aAAc,QmBtwGN,yBnB4wGV,yBAHA,yBmB1wGM,yBnB4wGN,yBAHA,yBDFC,wCoBxwGK,wCnB4wGN,wCmBvwGE,MAAA,KnB+wGA,iBAAkB,QAClB,aAAc,QmBxwGZ,mBpBgwGH,mBoBhwGG,kCnB6wGF,iBAAkB,KmBzwGV,2BnB8wGV,2BAHA,2BDHC,4BCOD,4BAHA,4BkBxuGA,qCCrCM,qCnB8wGN,qCmBxwGI,iBAAA,QACA,aAAA,QDuCJ,mBACE,MAAA,QACA,iBAAA,KnBkuGD,UmB/tGC,YAAA,IlB2uGA,MAAO,QACP,cAAe,EAEjB,UG5wGE,iBemCE,iBflCM,oBJqwGT,6BmBhuGC,iBAAA,YlB4uGA,mBAAoB,KACZ,WAAY,KkBzuGlB,UAEF,iBAAA,gBnBguGD,gBmB9tGG,aAAA,YnBouGH,gBmBluGG,gBAIA,MAAA,QlB0uGF,gBAAiB,UACjB,iBAAkB,YDNnB,0BmBnuGK,0BAUN,mCATM,mClB8uGJ,MAAO,KmB7yGP,gBAAA,KAGA,mBADA,QpBsyGD,QAAA,KAAA,KmB5tGC,UAAW,KlBwuGX,YAAa,UmBpzGb,cAAA,IAGA,mBADA,QpB6yGD,QAAA,IAAA,KmB/tGC,UAAW,KlB2uGX,YAAa,ImB3zGb,cAAA,IAGA,mBADA,QpBozGD,QAAA,IAAA,ImB9tGC,UAAW,KACX,YAAA,IACA,cAAA,IAIF,WACE,QAAA,MnB8tGD,MAAA,KCYD,sBACE,WAAY,IqB53GZ,6BADF,4BtBq3GC,6BIhsGC,MAAA,KAEQ,MJosGT,QAAA,EsBx3GC,mBAAA,QAAA,KAAA,OACE,cAAA,QAAA,KAAA,OtB03GH,WAAA,QAAA,KAAA,OsBr3GC,StBw3GD,QAAA,EsBt3Ga,UtBy3Gb,QAAA,KsBx3Ga,atB23Gb,QAAA,MsB13Ga,etB63Gb,QAAA,UsBz3GC,kBACA,QAAA,gBlBwKA,YACQ,SAAA,SAAA,OAAA,EAOR,SAAA,OACQ,mCAAA,KAAA,8BAAA,KAGR,2BAAA,KACQ,4BAAA,KAAA,uBAAA,KJ8sGT,oBAAA,KuBx5GC,4BAA6B,OAAQ,WACrC,uBAAA,OAAA,WACA,oBAAA,OAAA,WAEA,OACA,QAAA,aACA,MAAA,EACA,OAAA,EACA,YAAA,IACA,eAAA,OvB05GD,WAAA,IAAA,OuBt5GC,WAAY,IAAI,QtBq6GhB,aAAc,IAAI,MAAM,YsBn6GxB,YAAA,IAAA,MAAA,YAKA,UADF,QvBu5GC,SAAA,SuBj5GC,uBACA,QAAA,EAEA,eACA,SAAA,SACA,IAAA,KACA,KAAA,EACA,QAAA,KACA,QAAA,KACA,MAAA,KACA,UAAA,MACA,QAAA,IAAA,EACA,OAAA,IAAA,EAAA,EACA,UAAA,KACA,WAAA,KACA,WAAA,KnBsBA,iBAAA,KACQ,wBAAA,YmBrBR,gBAAA,YtBk6GA,OsBl6GA,IAAA,MAAA,KvBq5GD,OAAA,IAAA,MAAA,gBuBh5GC,cAAA,IACE,mBAAA,EAAA,IAAA,KAAA,iBACA,WAAA,EAAA,IAAA,KAAA,iBAzBJ,0BCzBE,MAAA,EACA,KAAA,KAEA,wBxBu8GD,OAAA,IuBj7GC,OAAQ,IAAI,EAmCV,SAAA,OACA,iBAAA,QAEA,oBACA,QAAA,MACA,QAAA,IAAA,KACA,MAAA,KvBi5GH,YAAA,IuB34GC,YAAA,WtB25GA,MAAO,KsBz5GL,YAAA,OvB+4GH,0BuB74GG,0BAMF,MAAA,QtBu5GA,gBAAiB,KACjB,iBAAkB,QsBp5GhB,yBAEA,+BADA,+BvB04GH,MAAA,KuBh4GC,gBAAA,KtBg5GA,iBAAkB,QAClB,QAAS,EDZV,2BuB93GC,iCAAA,iCAEE,MAAA,KEzGF,iCF2GE,iCAEA,gBAAA,KvBg4GH,OAAA,YuB33GC,iBAAkB,YAGhB,iBAAA,KvB23GH,OAAA,0DuBt3GG,qBvBy3GH,QAAA,MuBh3GC,QACA,QAAA,EAQF,qBACE,MAAA,EACA,KAAA,KAIF,oBACE,MAAA,KACA,KAAA,EAEA,iBACA,QAAA,MACA,QAAA,IAAA,KvB22GD,UAAA,KuBv2GC,YAAa,WACb,MAAA,KACA,YAAA,OAEA,mBACA,SAAA,MACA,IAAA,EvBy2GD,MAAA,EuBr2GC,OAAQ,EACR,KAAA,EACA,QAAA,IAQF,2BtB+2GE,MAAO,EsB32GL,KAAA,KAEA,eACA,sCvB+1GH,QAAA,GuBt2GC,WAAY,EtBs3GZ,cAAe,IAAI,OsB32GjB,cAAA,IAAA,QAEA,uBvB+1GH,8CuB10GC,IAAK,KAXL,OAAA,KApEA,cAAA,IvB85GC,yBuB11GD,6BA1DA,MAAA,EACA,KAAA,KvBw5GD,kC0BviHG,MAAO,KzBujHP,KAAM,GyBnjHR,W1ByiHD,oB0B7iHC,SAAU,SzB6jHV,QAAS,ayBvjHP,eAAA,OAGA,yB1ByiHH,gBCgBC,SAAU,SACV,MAAO,KyBhjHT,gC1ByiHC,gCCYD,+BAFA,+ByBnjHA,uBANM,uBzB0jHN,sBAFA,sBAQE,QAAS,EyBrjHP,qB1B0iHH,2B0BriHD,2BACE,iC1BuiHD,YAAA,KCgBD,aACE,YAAa,KDZd,kB0B7iHD,wBAAA,0BzB8jHE,MAAO,KDZR,kB0BliHD,wBACE,0B1BoiHD,YAAA,I0B/hHC,yE1BkiHD,cAAA,E2BnlHC,4BACG,YAAA,EDsDL,mEzBgjHE,wBAAyB,E0B/lHzB,2BAAA,E3BolHD,6C0B/hHD,8CACE,uBAAA,E1BiiHD,0BAAA,E0B9hHC,sB1BiiHD,MAAA,KCgBD,8D0BlnHE,cAAA,E3BumHD,mE0B9hHD,oECjEE,wBAAA,EACG,2BAAA,EDqEL,oEzB6iHE,uBAAwB,EyB3iHxB,0BAAA,EAiBF,mCACE,iCACA,QAAA,EAEF,iCACE,cAAA,IACA,aAAA,IAKF,oCtB/CE,cAAA,KACQ,aAAA,KsBkDR,iCtBnDA,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBsByDV,0CACE,mBAAA,K1B0gHD,WAAA,K0BtgHC,YACA,YAAA,EAGF,eACE,aAAA,IAAA,IAAA,E1BwgHD,oBAAA,ECgBD,uBACE,aAAc,EAAE,IAAI,IyB7gHlB,yBACA,+BACA,oC1BkgHH,QAAA,M0BzgHC,MAAO,KAcH,MAAA,K1B8/GL,UAAA,KCgBD,oCACE,MAAO,KyBvgHL,8BACA,oC1B4/GH,oC0Bv/GC,0CACE,WAAA,K1By/GH,YAAA,E2BlqHC,4DACC,cAAA,EAQA,sD3B+pHF,uBAAA,I0Bz/GC,wBAAA,IC/KA,2BAAA,EACC,0BAAA,EAQA,sD3BqqHF,uBAAA,E0B1/GC,wBAAyB,EACzB,2BAAA,I1B4/GD,0BAAA,ICgBD,uE0BzrHE,cAAA,E3B8qHD,4E0Bz/GD,6EC7LE,2BAAA,EACC,0BAAA,EDoMH,6EACE,uBAAA,EACA,wBAAA,EAEA,qB1Bu/GD,QAAA,M0B3/GC,MAAO,KzB2gHP,aAAc,MyBpgHZ,gBAAA,SAEA,0B1Bw/GH,gC0BjgHC,QAAS,WAYP,MAAA,K1Bw/GH,MAAA,G0Bp/GG,qC1Bu/GH,MAAA,KCgBD,+CACE,KAAM,KyBh/GF,gDAFA,6C1By+GL,2D0Bx+GK,wDEzOJ,SAAU,SACV,KAAA,cACA,eAAA,K5BotHD,a4BhtHC,SAAA,SACE,QAAA,MACA,gBAAA,S5BmtHH,0B4B3tHC,MAAO,KAeL,cAAA,EACA,aAAA,EAOA,2BACA,SAAA,S5B0sHH,QAAA,E4BxsHG,MAAA,KACE,MAAA,K5B0sHL,cAAA,ECgBD,iCACE,QAAS,EiBtrHT,8BACA,mCACA,sCACA,OAAA,KlB2qHD,QAAA,KAAA,KkBzqHC,UAAA,KjByrHA,YAAa,UACb,cAAe,IiBxrHb,oClB6qHH,yCkB1qHC,4CjB0rHA,OAAQ,KACR,YAAa,KDTd,8C4BltHD,mDAAA,sD3B6tHA,sCACA,2CiB5rHI,8CjBisHF,OAAQ,KiB7sHR,8BACA,mCACA,sCACA,OAAA,KlBksHD,QAAA,IAAA,KkBhsHC,UAAA,KjBgtHA,YAAa,IACb,cAAe,IiB/sHb,oClBosHH,yCkBjsHC,4CjBitHA,OAAQ,KACR,YAAa,KDTd,8C4BhuHD,mDAAA,sD3B2uHA,sCACA,2CiBntHI,8CjBwtHF,OAAQ,K2B5uHR,2B5BguHD,mB4BhuHC,iB3BivHA,QAAS,W2B5uHX,8D5BguHC,sD4BhuHD,oDAEE,cAAA,EAEA,mB5BkuHD,iB4B7tHC,MAAO,GACP,YAAA,OACA,eAAA,OAEA,mBACA,QAAA,IAAA,KACA,UAAA,KACA,YAAA,IACA,YAAA,EACA,MAAA,K5B+tHD,WAAA,O4B5tHC,iBAAA,KACE,OAAA,IAAA,MAAA,KACA,cAAA,I5B+tHH,4B4B5tHC,QAAA,IAAA,KACE,UAAA,KACA,cAAA,I5B+tHH,4B4BlvHC,QAAS,KAAK,K3BkwHd,UAAW,K2BxuHT,cAAA,IAKJ,wCAAA,qC3BwuHE,WAAY,EAEd,uCACA,+BACA,kC0Bh1HE,6CACG,8CC4GL,6D5BwtHC,wE4BvtHC,wBAAA,E5B0tHD,2BAAA,ECgBD,+BACE,aAAc,EAEhB,sCACA,8B2BnuHA,+D5BytHC,oDCWD,iC0Br1HE,4CACG,6CCiHH,uBAAA,E5B2tHD,0BAAA,E4BrtHC,8BAGA,YAAA,E5ButHD,iB4B3tHC,SAAU,SAUR,UAAA,E5BotHH,YAAA,O4BltHK,sB5BqtHL,SAAA,SCgBD,2BACE,YAAa,K2B3tHb,6BAAA,4B5B+sHD,4B4B5sHK,QAAA,EAGJ,kCAAA,wCAGI,aAAA,K5B+sHL,iC6B72HD,uCACE,QAAA,EACA,YAAA,K7Bg3HD,K6Bl3HC,aAAc,EAOZ,cAAA,EACA,WAAA,KARJ,QAWM,SAAA,SACA,QAAA,M7B+2HL,U6B72HK,SAAA,S5B63HJ,QAAS,M4B33HH,QAAA,KAAA,KAMJ,gB7B02HH,gB6Bz2HK,gBAAA,K7B42HL,iBAAA,KCgBD,mB4Bx3HQ,MAAA,KAGA,yBADA,yB7B62HP,MAAA,K6Br2HG,gBAAA,K5Bq3HF,OAAQ,YACR,iBAAkB,Y4Bl3Hd,aAzCN,mB7Bg5HC,mBwBn5HC,iBAAA,KACA,aAAA,QAEA,kBxBs5HD,OAAA,I6Bt5HC,OAAQ,IAAI,EA0DV,SAAA,O7B+1HH,iBAAA,Q6Br1HC,c7Bw1HD,UAAA,K6Bt1HG,UAEA,cAAA,IAAA,MAAA,KALJ,aASM,MAAA,KACA,cAAA,KAEA,e7Bu1HL,aAAA,I6Bt1HK,YAAA,WACE,OAAA,IAAA,MAAA,Y7Bw1HP,cAAA,IAAA,IAAA,EAAA,ECgBD,qBACE,aAAc,KAAK,KAAK,K4B/1HlB,sBAEA,4BADA,4BAEA,MAAA,K7Bo1HP,OAAA,Q6B/0HC,iBAAA,KAqDA,OAAA,IAAA,MAAA,KA8BA,oBAAA,YAnFA,wBAwDE,MAAA,K7B8xHH,cAAA,E6B5xHK,2BACA,MAAA,KA3DJ,6BAgEE,cAAA,IACA,WAAA,OAYJ,iDA0DE,IAAK,KAjED,KAAA,K7B6xHH,yB6B5tHD,2BA9DM,QAAA,W7B6xHL,MAAA,G6Bt2HD,6BAuFE,cAAA,GAvFF,6B5B23HA,aAAc,EACd,cAAe,IDZhB,kC6BzuHD,wCA3BA,wCATM,OAAA,IAAA,MAAA,K7BkxHH,yB6B9uHD,6B5B8vHE,cAAe,IAAI,MAAM,KACzB,cAAe,IAAI,IAAI,EAAE,EDZ1B,kC6Bj3HD,wC7Bk3HD,wC6Bh3HG,oBAAA,MAIE,c7Bk3HL,MAAA,K6B/2HK,gB7Bk3HL,cAAA,ICgBD,iBACE,YAAa,I4B13HP,uBAQR,6B7Bu2HC,6B6Br2HG,MAAA,K7Bw2HH,iBAAA,Q6Bt2HK,gBACA,MAAA,KAYN,mBACE,WAAA,I7B+1HD,YAAA,E6B51HG,e7B+1HH,MAAA,K6B71HK,kBACA,MAAA,KAPN,oBAYI,cAAA,IACA,WAAA,OAYJ,wCA0DE,IAAK,KAjED,KAAA,K7B81HH,yB6B7xHD,kBA9DM,QAAA,W7B81HL,MAAA,G6Br1HD,oBACA,cAAA,GAIE,oBACA,cAAA,EANJ,yB5B62HE,aAAc,EACd,cAAe,IDZhB,8B6B7yHD,oCA3BA,oCATM,OAAA,IAAA,MAAA,K7Bs1HH,yB6BlzHD,yB5Bk0HE,cAAe,IAAI,MAAM,KACzB,cAAe,IAAI,IAAI,EAAE,EDZ1B,8B6B30HD,oC7B40HD,oC6B10HG,oBAAA,MAGA,uB7B60HH,QAAA,K6Bl0HC,qBF3OA,QAAA,M3BkjID,yB8B3iIC,WAAY,KACZ,uBAAA,EACA,wBAAA,EAEA,Q9B6iID,SAAA,S8BriIC,WAAY,KA8nBZ,cAAe,KAhoBb,OAAA,IAAA,MAAA,Y9B4iIH,yB8B5hIC,QAgnBE,cAAe,K9Bi7GlB,yB8BphIC,eACA,MAAA,MAGA,iBACA,cAAA,KAAA,aAAA,KAEA,WAAA,Q9BqhID,2BAAA,M8BnhIC,WAAA,IAAA,MAAA,YACE,mBAAA,MAAA,EAAA,IAAA,EAAA,qB9BqhIH,WAAA,MAAA,EAAA,IAAA,EAAA,qB8B57GD,oBArlBI,WAAA,KAEA,yBAAA,iB9BqhID,MAAA,K8BnhIC,WAAA,EACE,mBAAA,KACA,WAAA,KAEA,0B9BqhIH,QAAA,gB8BlhIC,OAAA,eACE,eAAA,E9BohIH,SAAA,kBCkBD,oBACE,WAAY,QDZf,sC8BlhIK,mC9BihIH,oC8B5gIC,cAAe,E7B+hIf,aAAc,G6Bp+GlB,sCAnjBE,mC7B4hIA,WAAY,MDdX,4D8BtgID,sC9BugID,mCCkBG,WAAY,O6B9gId,kCANE,gC9BygIH,4B8B1gIG,0BAuiBF,aAAc,M7Bs/Gd,YAAa,MAEf,yBDZC,kC8B9gIK,gC9B6gIH,4B8B9gIG,0BAcF,aAAc,EAChB,YAAA,GAMF,mBA8gBE,QAAS,KAhhBP,aAAA,EAAA,EAAA,I9BqgIH,yB8BhgIC,mB7BkhIE,cAAe,G6B7gIjB,qBADA,kB9BmgID,SAAA,M8B5/HC,MAAO,EAggBP,KAAM,E7B+gHN,QAAS,KDdR,yB8BhgID,qB9BigID,kB8BhgIC,cAAA,GAGF,kBACE,IAAA,EACA,aAAA,EAAA,EAAA,I9BogID,qB8B7/HC,OAAQ,EACR,cAAA,EACA,aAAA,IAAA,EAAA,EAEA,cACA,MAAA,K9B+/HD,OAAA,K8B7/HC,QAAA,KAAA,K7B+gIA,UAAW,K6B7gIT,YAAA,KAIA,oBAbJ,oB9B2gIC,gBAAA,K8B1/HG,kB7B6gIF,QAAS,MDdR,yBACF,iC8Bn/HC,uCACA,YAAA,OAGA,eC9LA,SAAA,SACA,MAAA,MD+LA,QAAA,IAAA,KACA,WAAA,IACA,aAAA,KACA,cAAA,I9Bs/HD,iBAAA,Y8Bl/HC,iBAAA,KACE,OAAA,IAAA,MAAA,Y9Bo/HH,cAAA,I8B/+HG,qBACA,QAAA,EAEA,yB9Bk/HH,QAAA,M8BxgIC,MAAO,KAyBL,OAAA,I9Bk/HH,cAAA,I8BvjHD,mCAvbI,WAAA,I9Bm/HH,yB8Bz+HC,eACA,QAAA,MAGE,YACA,OAAA,MAAA,M9B4+HH,iB8B/8HC,YAAA,KA2YA,eAAgB,KAjaZ,YAAA,KAEA,yBACA,iCACA,SAAA,OACA,MAAA,KACA,MAAA,KAAA,WAAA,E9By+HH,iBAAA,Y8B9kHC,OAAQ,E7BimHR,mBAAoB,K6Bz/HhB,WAAA,KAGA,kDAqZN,sC9BqlHC,QAAA,IAAA,KAAA,IAAA,KCmBD,sC6B1/HQ,YAAA,KAmBR,4C9By9HD,4C8B1lHG,iBAAkB,M9B+lHnB,yB8B/lHD,YAtYI,MAAA,K9Bw+HH,OAAA,E8Bt+HK,eACA,MAAA,K9B0+HP,iB8B99HG,YAAa,KACf,eAAA,MAGA,aACA,QAAA,KAAA,K1B9NA,WAAA,IACQ,aAAA,M2B/DR,cAAA,IACA,YAAA,M/B+vID,WAAA,IAAA,MAAA,YiBzuHC,cAAe,IAAI,MAAM,YAwEzB,mBAAoB,MAAM,EAAE,IAAI,EAAE,qBAAyB,EAAE,IAAI,EAAE,qBAtI/D,WAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,IAAA,EAAA,qBAEA,yBjB2yHH,yBiBvqHC,QAAS,aA/HP,cAAA,EACA,eAAA,OjB0yHH,2BiB5qHC,QAAS,aAxHP,MAAA,KjBuyHH,eAAA,OiBnyHG,kCACA,QAAA,aAmHJ,0BhBssHE,QAAS,aACT,eAAgB,OgB/yHd,wCjBgyHH,6CiBxrHD,2CjB2rHC,MAAA,KiB/xHG,wCACA,MAAA,KAmGJ,4BhBktHE,cAAe,EgB9yHb,eAAA,OAGA,uBADA,oBjBgyHH,QAAA,aiBtsHC,WAAY,EhBytHZ,cAAe,EgB/yHX,eAAA,OAsFN,6BAAA,0BAjFI,aAAA,EAiFJ,4CjB+sHC,sCiB1xHG,SAAA,SjB6xHH,YAAA,E8BtgID,kDAmWE,IAAK,GAvWH,yBACE,yB9BihIL,cAAA,I8B//HD,oCAoVE,cAAe,GA1Vf,yBACA,aACA,MAAA,KACA,YAAA,E1BzPF,eAAA,EACQ,aAAA,EJswIP,YAAA,EACF,OAAA,E8BtgIG,mBAAoB,KACtB,WAAA,M9B0gID,8B8BtgIC,WAAY,EACZ,uBAAA,EHzUA,wBAAA,EAQA,mDACC,cAAA,E3B40IF,uBAAA,I8BlgIC,wBAAyB,IChVzB,2BAAA,EACA,0BAAA,EDkVA,YCnVA,WAAA,IACA,cAAA,IDqVA,mBCtVA,WAAA,KACA,cAAA,KD+VF,mBChWE,WAAA,KACA,cAAA,KDuWF,aAsSE,WAAY,KA1SV,cAAA,KAEA,yB9BkgID,aACF,MAAA,K8Br+HG,aAAc,KAhBhB,YAAA,MACA,yBE5WA,aF8WE,MAAA,eAFF,cAKI,MAAA,gB9B0/HH,aAAA,M8Bh/HD,4BACA,aAAA,GADF,gBAKI,iBAAA,Q9Bm/HH,aAAA,QCmBD,8B6BngIM,MAAA,KARN,oC9B6/HC,oC8B/+HG,MAAA,Q9Bk/HH,iBAAA,Y8B7+HK,6B9Bg/HL,MAAA,KCmBD,iC6B//HQ,MAAA,KAKF,uC9B4+HL,uCCmBC,MAAO,KACP,iBAAkB,Y6B5/HZ,sCAIF,4C9B0+HL,4CCmBC,MAAO,KACP,iBAAkB,Q6B1/HZ,wCAxCR,8C9BohIC,8C8Bt+HG,MAAA,K9By+HH,iBAAA,YCmBD,+B6Bz/HM,aAAA,KAGA,qCApDN,qC9B8hIC,iBAAA,KCmBD,yC6Bv/HI,iBAAA,KAOE,iCAAA,6B7Bq/HJ,aAAc,Q6Bj/HR,oCAiCN,0C9Bk8HD,0C8B9xHC,MAAO,KA7LC,iBAAA,QACA,yB7Bi/HR,sD6B/+HU,MAAA,KAKF,4D9B49HP,4DCmBC,MAAO,KACP,iBAAkB,Y6B5+HV,2DAIF,iE9B09HP,iECmBC,MAAO,KACP,iBAAkB,Q6B1+HV,6D9B69HX,mEADE,mE8B7jIC,MAAO,KA8GP,iBAAA,aAEE,6B9Bo9HL,MAAA,K8B/8HG,mC9Bk9HH,MAAA,KCmBD,0B6Bl+HM,MAAA,KAIA,gCAAA,gC7Bm+HJ,MAAO,K6Bz9HT,0CARQ,0CASN,mD9B08HD,mD8Bz8HC,MAAA,KAFF,gBAKI,iBAAA,K9B68HH,aAAA,QCmBD,8B6B79HM,MAAA,QARN,oC9Bu9HC,oC8Bz8HG,MAAA,K9B48HH,iBAAA,Y8Bv8HK,6B9B08HL,MAAA,QCmBD,iC6Bz9HQ,MAAA,QAKF,uC9Bs8HL,uCCmBC,MAAO,KACP,iBAAkB,Y6Bt9HZ,sCAIF,4C9Bo8HL,4CCmBC,MAAO,KACP,iBAAkB,Q6Bp9HZ,wCAxCR,8C9B8+HC,8C8B/7HG,MAAA,K9Bk8HH,iBAAA,YCmBD,+B6Bl9HM,aAAA,KAGA,qCArDN,qC9Bw/HC,iBAAA,KCmBD,yC6Bh9HI,iBAAA,KAME,iCAAA,6B7B+8HJ,aAAc,Q6B38HR,oCAuCN,0C9Bs5HD,0C8B93HC,MAAO,KAvDC,iBAAA,QAuDV,yBApDU,kE9By7HP,aAAA,Q8Bt7HO,0D9By7HP,iBAAA,QCmBD,sD6Bz8HU,MAAA,QAKF,4D9Bs7HP,4DCmBC,MAAO,KACP,iBAAkB,Y6Bt8HV,2DAIF,iE9Bo7HP,iECmBC,MAAO,KACP,iBAAkB,Q6Bp8HV,6D9Bu7HX,mEADE,mE8B7hIC,MAAO,KA+GP,iBAAA,aAEE,6B9Bm7HL,MAAA,Q8B96HG,mC9Bi7HH,MAAA,KCmBD,0B6Bj8HM,MAAA,QAIA,gCAAA,gC7Bk8HJ,MAAO,KgC1kJT,0CH0oBQ,0CGzoBN,mDjC2jJD,mDiC1jJC,MAAA,KAEA,YACA,QAAA,IAAA,KjC8jJD,cAAA,KiCnkJC,WAAY,KAQV,iBAAA,QjC8jJH,cAAA,IiC3jJK,eACA,QAAA,ajC+jJL,yBiC3kJC,QAAS,EAAE,IAkBT,MAAA,KjC4jJH,QAAA,SkC/kJC,oBACA,MAAA,KAEA,YlCklJD,QAAA,akCtlJC,aAAc,EAOZ,OAAA,KAAA,ElCklJH,cAAA,ICmBD,eiClmJM,QAAA,OAEA,iBACA,oBACA,SAAA,SACA,MAAA,KACA,QAAA,IAAA,KACA,YAAA,KACA,YAAA,WlCmlJL,MAAA,QkCjlJG,gBAAA,KjComJF,iBAAkB,KiCjmJZ,OAAA,IAAA,MAAA,KPVH,6B3B8lJJ,gCkChlJG,YAAA,EjCmmJF,uBAAwB,I0B1nJxB,0BAAA,I3B4mJD,4BkC3kJG,+BjC8lJF,wBAAyB,IACzB,2BAA4B,IiC3lJxB,uBAFA,uBAGA,0BAFA,0BlCilJL,QAAA,EkCzkJG,MAAA,QjC4lJF,iBAAkB,KAClB,aAAc,KAEhB,sBiC1lJM,4BAFA,4BjC6lJN,yBiC1lJM,+BAFA,+BAGA,QAAA,ElC8kJL,MAAA,KkCroJC,OAAQ,QjCwpJR,iBAAkB,QAClB,aAAc,QiCtlJV,wBAEA,8BADA,8BjCulJN,2BiCzlJM,iCjC0lJN,iCDZC,MAAA,KkClkJC,OAAQ,YjCqlJR,iBAAkB,KkChqJd,aAAA,KAEA,oBnCipJL,uBmC/oJG,QAAA,KAAA,KlCkqJF,UAAW,K0B7pJX,YAAA,U3B+oJD,gCmC9oJG,mClCiqJF,uBAAwB,I0B1qJxB,0BAAA,I3B4pJD,+BkC7kJD,kCjCgmJE,wBAAyB,IkChrJrB,2BAAA,IAEA,oBnCiqJL,uBmC/pJG,QAAA,IAAA,KlCkrJF,UAAW,K0B7qJX,YAAA,I3B+pJD,gCmC9pJG,mClCirJF,uBAAwB,I0B1rJxB,0BAAA,I3B4qJD,+BoC9qJD,kCACE,wBAAA,IACA,2BAAA,IAEA,OpCgrJD,aAAA,EoCprJC,OAAQ,KAAK,EAOX,WAAA,OpCgrJH,WAAA,KCmBD,UmChsJM,QAAA,OAEA,YACA,eACA,QAAA,apCirJL,QAAA,IAAA,KoC/rJC,iBAAkB,KnCktJlB,OAAQ,IAAI,MAAM,KmC/rJd,cAAA,KAnBN,kBpCosJC,kBCmBC,gBAAiB,KmC5rJb,iBAAA,KA3BN,eAAA,kBAkCM,MAAA,MAlCN,mBAAA,sBnCguJE,MAAO,KmCrrJH,mBAEA,yBADA,yBpCwqJL,sBqCrtJC,MAAO,KACP,OAAA,YACA,iBAAA,KAEA,OACA,QAAA,OACA,QAAA,KAAA,KAAA,KACA,UAAA,IACA,YAAA,IACA,YAAA,EACA,MAAA,KrCutJD,WAAA,OqCntJG,YAAA,OpCsuJF,eAAgB,SoCpuJZ,cAAA,MrCutJL,cqCrtJK,cAKJ,MAAA,KACE,gBAAA,KrCktJH,OAAA,QqC7sJG,aACA,QAAA,KAOJ,YCtCE,SAAA,StCkvJD,IAAA,KCmBD,eqChwJM,iBAAA,KALJ,2BD0CF,2BrC+sJC,iBAAA,QCmBD,eqCvwJM,iBAAA,QALJ,2BD8CF,2BrCktJC,iBAAA,QCmBD,eqC9wJM,iBAAA,QALJ,2BDkDF,2BrCqtJC,iBAAA,QCmBD,YqCrxJM,iBAAA,QALJ,wBDsDF,wBrCwtJC,iBAAA,QCmBD,eqC5xJM,iBAAA,QALJ,2BD0DF,2BrC2tJC,iBAAA,QCmBD,cqCnyJM,iBAAA,QCDJ,0BADF,0BAEE,iBAAA,QAEA,OACA,QAAA,aACA,UAAA,KACA,QAAA,IAAA,IACA,UAAA,KACA,YAAA,IACA,YAAA,EACA,MAAA,KACA,WAAA,OvCwxJD,YAAA,OuCrxJC,eAAA,OACE,iBAAA,KvCuxJH,cAAA,KuClxJG,aACA,QAAA,KAGF,YtCqyJA,SAAU,SsCnyJR,IAAA,KAMA,0BvC+wJH,eCmBC,IAAK,EsChyJD,QAAA,IAAA,IvCmxJL,cuCjxJK,cAKJ,MAAA,KtC+xJA,gBAAiB,KsC7xJf,OAAA,QvC+wJH,+BuC3wJC,4BACE,MAAA,QvC6wJH,iBAAA,KuCzwJG,wBvC4wJH,MAAA,MuCxwJG,+BvC2wJH,aAAA,IwCp0JC,uBACA,YAAA,IAEA,WACA,YAAA,KxCu0JD,eAAA,KwC50JC,cAAe,KvC+1Jf,MAAO,QuCt1JL,iBAAA,KAIA,eAbJ,cAcI,MAAA,QxCu0JH,awCr1JC,cAAe,KAmBb,UAAA,KxCq0JH,YAAA,ICmBD,cuCn1JI,iBAAA,QAEA,sBxCo0JH,4BwC91JC,cAAe,KA8Bb,aAAA,KxCm0JH,cAAA,IwChzJD,sBAfI,UAAA,KxCo0JD,oCwCj0JC,WvCo1JA,YAAa,KuCl1JX,eAAA,KxCo0JH,sBwC1zJD,4BvC60JE,cAAe,KuCj1Jb,aAAA,KC5CJ,ezC+2JD,cyC92JC,UAAA,MAGA,WACA,QAAA,MACA,QAAA,IACA,cAAA,KrCiLA,YAAA,WACK,iBAAA,KACG,OAAA,IAAA,MAAA,KJisJT,cAAA,IyC33JC,mBAAoB,OAAO,IAAI,YxC84J1B,cAAe,OAAO,IAAI,YwCj4J7B,WAAA,OAAA,IAAA,YAKF,iBzC82JD,eCmBC,aAAc,KACd,YAAa,KwC13JX,mBA1BJ,kBzCq4JC,kByC12JG,aAAA,QCzBJ,oBACE,QAAA,IACA,MAAA,KAEA,O1Cy4JD,QAAA,K0C74JC,cAAe,KAQb,OAAA,IAAA,MAAA,YAEA,cAAA,IAVJ,UAeI,WAAA,E1Cq4JH,MAAA,QCmBD,mByCl5JI,YAAA,IArBJ,SAyBI,U1Ck4JH,cAAA,ECmBD,WyC34JE,WAAA,IAFF,mBAAA,mBAMI,cAAA,KAEA,0BACA,0B1C43JH,SAAA,S0Cp3JC,IAAK,KCvDL,MAAA,MACA,MAAA,Q3C+6JD,e0Cz3JC,MAAO,QClDL,iBAAA,Q3C86JH,aAAA,Q2C36JG,kB3C86JH,iBAAA,Q2Ct7JC,2BACA,MAAA,Q3C07JD,Y0Ch4JC,MAAO,QCtDL,iBAAA,Q3Cy7JH,aAAA,Q2Ct7JG,e3Cy7JH,iBAAA,Q2Cj8JC,wBACA,MAAA,Q3Cq8JD,e0Cv4JC,MAAO,QC1DL,iBAAA,Q3Co8JH,aAAA,Q2Cj8JG,kB3Co8JH,iBAAA,Q2C58JC,2BACA,MAAA,Q3Cg9JD,c0C94JC,MAAO,QC9DL,iBAAA,Q3C+8JH,aAAA,Q2C58JG,iB3C+8JH,iBAAA,Q4Ch9JC,0BAAQ,MAAA,QACR,wCAAQ,K5Cs9JP,oBAAA,KAAA,E4Cl9JD,GACA,oBAAA,EAAA,GACA,mCAAQ,K5Cw9JP,oBAAA,KAAA,E4C19JD,GACA,oBAAA,EAAA,GACA,gCAAQ,K5Cw9JP,oBAAA,KAAA,E4Ch9JD,GACA,oBAAA,EAAA,GAGA,UACA,OAAA,KxCsCA,cAAA,KACQ,SAAA,OJ86JT,iBAAA,Q4Ch9JC,cAAe,IACf,mBAAA,MAAA,EAAA,IAAA,IAAA,eACA,WAAA,MAAA,EAAA,IAAA,IAAA,eAEA,cACA,MAAA,KACA,MAAA,EACA,OAAA,KACA,UAAA,KxCyBA,YAAA,KACQ,MAAA,KAyHR,WAAA,OACK,iBAAA,QACG,mBAAA,MAAA,EAAA,KAAA,EAAA,gBJk0JT,WAAA,MAAA,EAAA,KAAA,EAAA,gB4C78JC,mBAAoB,MAAM,IAAI,K3Cw+JzB,cAAe,MAAM,IAAI,K4Cv+J5B,WAAA,MAAA,IAAA,KDEF,sBCAE,gCDAF,iBAAA,yK5Ci9JD,iBAAA,oK4C18JC,iBAAiB,iK3Cs+JjB,wBAAyB,KAAK,KGlhK9B,gBAAA,KAAA,KJ4/JD,qBI1/JS,+BwCmDR,kBAAmB,qBAAqB,GAAG,OAAO,SErElD,aAAA,qBAAA,GAAA,OAAA,S9C+gKD,UAAA,qBAAA,GAAA,OAAA,S6C59JG,sBACA,iBAAA,Q7Cg+JH,wC4C38JC,iBAAkB,yKEzElB,iBAAA,oK9CuhKD,iBAAA,iK6Cp+JG,mBACA,iBAAA,Q7Cw+JH,qC4C/8JC,iBAAkB,yKE7ElB,iBAAA,oK9C+hKD,iBAAA,iK6C5+JG,sBACA,iBAAA,Q7Cg/JH,wC4Cn9JC,iBAAkB,yKEjFlB,iBAAA,oK9CuiKD,iBAAA,iK6Cp/JG,qBACA,iBAAA,Q7Cw/JH,uC+C/iKC,iBAAkB,yKAElB,iBAAA,oK/CgjKD,iBAAA,iK+C7iKG,O/CgjKH,WAAA,KC4BD,mB8CtkKE,WAAA,E/C+iKD,O+C3iKD,YACE,SAAA,O/C6iKD,KAAA,E+CziKC,Y/C4iKD,MAAA,Q+CxiKG,c/C2iKH,QAAA,MC4BD,4B8CjkKE,UAAA,KAGF,aAAA,mBAEE,aAAA,KAGF,YAAA,kB9CkkKE,cAAe,K8C3jKjB,YAHE,Y/CuiKD,a+CniKC,QAAA,W/CsiKD,eAAA,I+CliKC,c/CqiKD,eAAA,O+ChiKC,cACA,eAAA,OAMF,eACE,WAAA,EACA,cAAA,ICvDF,YAEE,aAAA,EACA,WAAA,KAQF,YACE,aAAA,EACA,cAAA,KAGA,iBACA,SAAA,SACA,QAAA,MhDglKD,QAAA,KAAA,KgD7kKC,cAAA,KrB3BA,iBAAA,KACC,OAAA,IAAA,MAAA,KqB6BD,6BACE,uBAAA,IrBvBF,wBAAA,I3BymKD,4BgDvkKC,cAAe,E/CmmKf,2BAA4B,I+CjmK5B,0BAAA,IAFF,kBAAA,uBAKI,MAAA,KAIF,2CAAA,gD/CmmKA,MAAO,K+C/lKL,wBAFA,wBhD4kKH,6BgD3kKG,6BAKF,MAAO,KACP,gBAAA,KACA,iBAAA,QAKA,uB/C+lKA,MAAO,KACP,WAAY,K+C5lKV,0BhDskKH,gCgDrkKG,gCALF,MAAA,K/CsmKA,OAAQ,YACR,iBAAkB,KDxBnB,mDgD/kKC,yDAAA,yD/C4mKA,MAAO,QDxBR,gDgDnkKC,sDAAA,sD/CgmKA,MAAO,K+C5lKL,wBAEA,8BADA,8BhDskKH,QAAA,EgD3kKC,MAAA,K/CumKA,iBAAkB,QAClB,aAAc,QAEhB,iDDpBC,wDCuBD,uDADA,uD+C5mKE,8DAYI,6D/C+lKN,uD+C3mKE,8D/C8mKF,6DAKE,MAAO,QDxBR,8CiD7qKG,oDADF,oDAEE,MAAA,QAEA,yBhD0sKF,MAAO,QgDxsKH,iBAAA,QAFF,0BAAA,+BAKI,MAAA,QAGF,mDAAA,wDhD2sKJ,MAAO,QDtBR,gCiDnrKO,gCAGF,qCAFE,qChD8sKN,MAAO,QACP,iBAAkB,QAEpB,iCgD1sKQ,uCAFA,uChD6sKR,sCDtBC,4CiDtrKO,4CArBN,MAAA,KACE,iBAAA,QACA,aAAA,QAEA,sBhDuuKF,MAAO,QgDruKH,iBAAA,QAFF,uBAAA,4BAKI,MAAA,QAGF,gDAAA,qDhDwuKJ,MAAO,QDtBR,6BiDhtKO,6BAGF,kCAFE,kChD2uKN,MAAO,QACP,iBAAkB,QAEpB,8BgDvuKQ,oCAFA,oChD0uKR,mCDtBC,yCiDntKO,yCArBN,MAAA,KACE,iBAAA,QACA,aAAA,QAEA,yBhDowKF,MAAO,QgDlwKH,iBAAA,QAFF,0BAAA,+BAKI,MAAA,QAGF,mDAAA,wDhDqwKJ,MAAO,QDtBR,gCiD7uKO,gCAGF,qCAFE,qChDwwKN,MAAO,QACP,iBAAkB,QAEpB,iCgDpwKQ,uCAFA,uChDuwKR,sCDtBC,4CiDhvKO,4CArBN,MAAA,KACE,iBAAA,QACA,aAAA,QAEA,wBhDiyKF,MAAO,QgD/xKH,iBAAA,QAFF,yBAAA,8BAKI,MAAA,QAGF,kDAAA,uDhDkyKJ,MAAO,QDtBR,+BiD1wKO,+BAGF,oCAFE,oChDqyKN,MAAO,QACP,iBAAkB,QAEpB,gCgDjyKQ,sCAFA,sChDoyKR,qCDtBC,2CiD7wKO,2CDkGN,MAAO,KACP,iBAAA,QACA,aAAA,QAEF,yBACE,WAAA,EACA,cAAA,IE1HF,sBACE,cAAA,EACA,YAAA,IAEA,O9C0DA,cAAA,KACQ,iBAAA,KJgvKT,OAAA,IAAA,MAAA,YkDtyKC,cAAe,IACf,mBAAA,EAAA,IAAA,IAAA,gBlDwyKD,WAAA,EAAA,IAAA,IAAA,gBkDlyKC,YACA,QAAA,KvBnBC,e3B0zKF,QAAA,KAAA,KkDzyKC,cAAe,IAAI,MAAM,YAMvB,uBAAA,IlDsyKH,wBAAA,IkDhyKC,0CACA,MAAA,QAEA,alDmyKD,WAAA,EkDvyKC,cAAe,EjDm0Kf,UAAW,KACX,MAAO,QDtBR,oBkD7xKC,sBjDqzKF,eiD3zKI,mBAKJ,qBAEE,MAAA,QvBvCA,cACC,QAAA,KAAA,K3By0KF,iBAAA,QkDxxKC,WAAY,IAAI,MAAM,KjDozKtB,2BAA4B,IiDjzK1B,0BAAA,IAHJ,mBAAA,mCAMM,cAAA,ElD2xKL,oCkDtxKG,oDjDkzKF,aAAc,IAAI,EiDhzKZ,cAAA,EvBtEL,4D3Bg2KF,4EkDpxKG,WAAA,EjDgzKF,uBAAwB,IiD9yKlB,wBAAA,IvBtEL,0D3B81KF,0EkD7yKC,cAAe,EvB1Df,2BAAA,IACC,0BAAA,IuB0FH,+EAEI,uBAAA,ElDixKH,wBAAA,EkD7wKC,wDlDgxKD,iBAAA,EC4BD,0BACE,iBAAkB,EiDryKpB,8BlD6wKC,ckD7wKD,gCjD0yKE,cAAe,EiD1yKjB,sCAQM,sBlD2wKL,wCC4BC,cAAe,K0Bx5Kf,aAAA,KuByGF,wDlDwxKC,0BC4BC,uBAAwB,IACxB,wBAAyB,IiDrzK3B,yFAoBQ,yFlD2wKP,2DkD5wKO,2DjDwyKN,uBAAwB,IACxB,wBAAyB,IAK3B,wGiDj0KA,wGjD+zKA,wGDtBC,wGCuBD,0EiDh0KA,0EjD8zKA,0EiDtyKU,0EjD8yKR,uBAAwB,IAK1B,uGiD30KA,uGjDy0KA,uGDtBC,uGCuBD,yEiD10KA,yEjDw0KA,yEiD5yKU,yEvB7HR,wBAAA,IuBiGF,sDlDwzKC,yBC4BC,2BAA4B,IAC5B,0BAA2B,IiD3yKrB,qFA1CR,qFAyCQ,wDlDsxKP,wDC4BC,2BAA4B,IAC5B,0BAA2B,IAG7B,oGDtBC,oGCwBD,oGiDj2KA,oGjD81KA,uEiDhzKU,uEjDkzKV,uEiDh2KA,uEjDs2KE,0BAA2B,IAG7B,mGDtBC,mGCwBD,mGiD32KA,mGjDw2KA,sEiDtzKU,sEjDwzKV,sEiD12KA,sEjDg3KE,2BAA4B,IiDrzK1B,0BlD8xKH,qCkDz1KD,0BAAA,qCA+DI,WAAA,IAAA,MAAA,KA/DJ,kDAAA,kDAmEI,WAAA,EAnEJ,uBAAA,yCjD83KE,OAAQ,EiDpzKA,+CjDwzKV,+CiDl4KA,+CjDo4KA,+CAEA,+CANA,+CDjBC,iECoBD,iEiDn4KA,iEjDq4KA,iEAEA,iEANA,iEAWE,YAAa,EiD9zKL,8CjDk0KV,8CiDh5KA,8CjDk5KA,8CAEA,8CANA,8CDjBC,gECoBD,gEiDj5KA,gEjDm5KA,gEAEA,gEANA,gEAWE,aAAc,EAIhB,+CiD95KA,+CjD45KA,+CiDr0KU,+CjDw0KV,iEiD/5KA,iEjD65KA,iEDtBC,iEC6BC,cAAe,EAEjB,8CiDt0KU,8CjDw0KV,8CiDx6KA,8CjDu6KA,gEDtBC,gECwBD,gEiDn0KI,gEACA,cAAA,EAUJ,yBACE,cAAA,ElDsyKD,OAAA,EkDlyKG,aACA,cAAA,KANJ,oBASM,cAAA,ElDqyKL,cAAA,IkDhyKG,2BlDmyKH,WAAA,IC4BD,4BiD3zKM,cAAA,EAKF,wDAvBJ,wDlDwzKC,WAAA,IAAA,MAAA,KkD/xKK,2BlDkyKL,WAAA,EmDrhLC,uDnDwhLD,cAAA,IAAA,MAAA,KmDrhLG,eACA,aAAA,KnDyhLH,8BmD3hLC,MAAA,KAMI,iBAAA,QnDwhLL,aAAA,KmDrhLK,0DACA,iBAAA,KAGJ,qCAEI,MAAA,QnDshLL,iBAAA,KmDviLC,yDnD0iLD,oBAAA,KmDviLG,eACA,aAAA,QnD2iLH,8BmD7iLC,MAAA,KAMI,iBAAA,QnD0iLL,aAAA,QmDviLK,0DACA,iBAAA,QAGJ,qCAEI,MAAA,QnDwiLL,iBAAA,KmDzjLC,yDnD4jLD,oBAAA,QmDzjLG,eACA,aAAA,QnD6jLH,8BmD/jLC,MAAA,QAMI,iBAAA,QnD4jLL,aAAA,QmDzjLK,0DACA,iBAAA,QAGJ,qCAEI,MAAA,QnD0jLL,iBAAA,QmD3kLC,yDnD8kLD,oBAAA,QmD3kLG,YACA,aAAA,QnD+kLH,2BmDjlLC,MAAA,QAMI,iBAAA,QnD8kLL,aAAA,QmD3kLK,uDACA,iBAAA,QAGJ,kCAEI,MAAA,QnD4kLL,iBAAA,QmD7lLC,sDnDgmLD,oBAAA,QmD7lLG,eACA,aAAA,QnDimLH,8BmDnmLC,MAAA,QAMI,iBAAA,QnDgmLL,aAAA,QmD7lLK,0DACA,iBAAA,QAGJ,qCAEI,MAAA,QnD8lLL,iBAAA,QmD/mLC,yDnDknLD,oBAAA,QmD/mLG,cACA,aAAA,QnDmnLH,6BmDrnLC,MAAA,QAMI,iBAAA,QnDknLL,aAAA,QmD/mLK,yDACA,iBAAA,QAGJ,oCAEI,MAAA,QnDgnLL,iBAAA,QoD/nLC,wDACA,oBAAA,QAEA,kBACA,SAAA,SpDkoLD,QAAA,MoDvoLC,OAAQ,EnDmqLR,QAAS,EACT,SAAU,OAEZ,yCmDzpLI,wBADA,yBAEA,yBACA,wBACA,SAAA,SACA,IAAA,EACA,OAAA,EpDkoLH,KAAA,EoD7nLC,MAAO,KACP,OAAA,KpD+nLD,OAAA,EoD1nLC,wBpD6nLD,eAAA,OqDvpLC,uBACA,eAAA,IAEA,MACA,WAAA,KACA,QAAA,KjDwDA,cAAA,KACQ,iBAAA,QJmmLT,OAAA,IAAA,MAAA,QqDlqLC,cAAe,IASb,mBAAA,MAAA,EAAA,IAAA,IAAA,gBACA,WAAA,MAAA,EAAA,IAAA,IAAA,gBAKJ,iBACE,aAAA,KACA,aAAA,gBAEF,SACE,QAAA,KACA,cAAA,ICtBF,SACE,QAAA,IACA,cAAA,IAEA,OACA,MAAA,MACA,UAAA,KjCRA,YAAA,IAGA,YAAA,ErBwrLD,MAAA,KsDhrLC,YAAA,EAAA,IAAA,EAAA,KrD4sLA,OAAQ,kBqD1sLN,QAAA,GjCbF,aiCeE,ajCZF,MAAA,KrBgsLD,gBAAA,KsD5qLC,OAAA,QACE,OAAA,kBACA,QAAA,GAEA,aACA,mBAAA,KtD8qLH,QAAA,EuDnsLC,OAAQ,QACR,WAAA,IvDqsLD,OAAA,EuDhsLC,YACA,SAAA,OAEA,OACA,SAAA,MACA,IAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EAIA,QAAA,KvDgsLD,QAAA,KuD7rLC,SAAA,OnD+GA,2BAAA,MACI,QAAA,EAEI,0BAkER,mBAAA,kBAAA,IAAA,SAEK,cAAA,aAAA,IAAA,SACG,WAAA,UAAA,IAAA,SJghLT,kBAAA,kBuDnsLC,cAAA,kBnD2GA,aAAA,kBACI,UAAA,kBAEI,wBJ2lLT,kBAAA,euDvsLK,cAAe,eACnB,aAAA,eACA,UAAA,eAIF,mBACE,WAAA,OACA,WAAA,KvDwsLD,cuDnsLC,SAAU,SACV,MAAA,KACA,OAAA,KAEA,eACA,SAAA,SnDaA,iBAAA,KACQ,wBAAA,YmDZR,gBAAA,YtD+tLA,OsD/tLA,IAAA,MAAA,KAEA,OAAA,IAAA,MAAA,evDqsLD,cAAA,IuDjsLC,QAAS,EACT,mBAAA,EAAA,IAAA,IAAA,eACA,WAAA,EAAA,IAAA,IAAA,eAEA,gBACA,SAAA,MACA,IAAA,EACA,MAAA,EvDmsLD,OAAA,EuDjsLC,KAAA,ElCrEA,QAAA,KAGA,iBAAA,KkCmEA,qBlCtEA,OAAA,iBAGA,QAAA,EkCwEF,mBACE,OAAA,kBACA,QAAA,GAIF,cACE,QAAA,KvDmsLD,cAAA,IAAA,MAAA,QuD9rLC,qBACA,WAAA,KAKF,aACE,OAAA,EACA,YAAA,WAIF,YACE,SAAA,SACA,QAAA,KvD6rLD,cuD/rLC,QAAS,KAQP,WAAA,MACA,WAAA,IAAA,MAAA,QATJ,wBAaI,cAAA,EvDyrLH,YAAA,IuDrrLG,mCvDwrLH,YAAA,KuDlrLC,oCACA,YAAA,EAEA,yBACA,SAAA,SvDqrLD,IAAA,QuDnqLC,MAAO,KAZP,OAAA,KACE,SAAA,OvDmrLD,yBuDhrLD,cnDvEA,MAAA,MACQ,OAAA,KAAA,KmD2ER,eAAY,mBAAA,EAAA,IAAA,KAAA,evDkrLX,WAAA,EAAA,IAAA,KAAA,euD5qLD,UAFA,MAAA,OvDorLD,yBwDl0LC,UACA,MAAA,OCNA,SAEA,SAAA,SACA,QAAA,KACA,QAAA,MACA,YAAA,iBAAA,UAAA,MAAA,WACA,UAAA,KACA,WAAA,OACA,YAAA,IACA,YAAA,WACA,WAAA,KACA,WAAA,MACA,gBAAA,KACA,YAAA,KACA,eAAA,KACA,eAAA,ODHA,WAAA,OnCVA,aAAA,OAGA,UAAA,OrBy1LD,YAAA,OwD90LC,OAAA,iBnCdA,QAAA,ErBg2LD,WAAA,KwDj1LY,YAAmB,OAAA,kBxDq1L/B,QAAA,GwDp1LY,aAAmB,QAAA,IAAA,ExDw1L/B,WAAA,KwDv1LY,eAAmB,QAAA,EAAA,IxD21L/B,YAAA,IwD11LY,gBAAmB,QAAA,IAAA,ExD81L/B,WAAA,IwDz1LC,cACA,QAAA,EAAA,IACA,YAAA,KAEA,eACA,UAAA,MxD41LD,QAAA,IAAA,IwDx1LC,MAAO,KACP,WAAA,OACA,iBAAA,KACA,cAAA,IAEA,exD01LD,SAAA,SwDt1LC,MAAA,EACE,OAAA,EACA,aAAA,YACA,aAAA,MAEA,4BxDw1LH,OAAA,EwDt1LC,KAAA,IACE,YAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEA,iCxDw1LH,MAAA,IwDt1LC,OAAA,EACE,cAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEA,kCxDw1LH,OAAA,EwDt1LC,KAAA,IACE,cAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEA,8BxDw1LH,IAAA,IwDt1LC,KAAA,EACE,WAAA,KACA,aAAA,IAAA,IAAA,IAAA,EACA,mBAAA,KAEA,6BxDw1LH,IAAA,IwDt1LC,MAAA,EACE,WAAA,KACA,aAAA,IAAA,EAAA,IAAA,IACA,kBAAA,KAEA,+BxDw1LH,IAAA,EwDt1LC,KAAA,IACE,YAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAEA,oCxDw1LH,IAAA,EwDt1LC,MAAA,IACE,WAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAEA,qCxDw1LH,IAAA,E0Dr7LC,KAAM,IACN,WAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAEA,SACA,SAAA,SACA,IAAA,EDXA,KAAA,EAEA,QAAA,KACA,QAAA,KACA,UAAA,MACA,QAAA,IACA,YAAA,iBAAA,UAAA,MAAA,WACA,UAAA,KACA,WAAA,OACA,YAAA,IACA,YAAA,WACA,WAAA,KACA,WAAA,MACA,gBAAA,KACA,YAAA,KACA,eAAA,KCAA,eAAA,OAEA,WAAA,OACA,aAAA,OAAA,UAAA,OACA,YAAA,OACA,iBAAA,KACA,wBAAA,YtD8CA,gBAAA,YACQ,OAAA,IAAA,MAAA,KJq5LT,OAAA,IAAA,MAAA,e0Dh8LC,cAAA,IAAY,mBAAA,EAAA,IAAA,KAAA,e1Dm8Lb,WAAA,EAAA,IAAA,KAAA,e0Dl8La,WAAA,KACZ,aAAY,WAAA,MACZ,eAAY,YAAA,KAGd,gBACE,WAAA,KAEA,cACA,YAAA,MAEA,e1Dw8LD,QAAA,IAAA,K0Dr8LC,OAAQ,EACR,UAAA,K1Du8LD,iBAAA,Q0D/7LC,cAAA,IAAA,MAAA,QzD49LA,cAAe,IAAI,IAAI,EAAE,EyDz9LvB,iBACA,QAAA,IAAA,KAEA,gBACA,sB1Di8LH,SAAA,S0D97LC,QAAS,MACT,MAAA,E1Dg8LD,OAAA,E0D97LC,aAAc,YACd,aAAA,M1Di8LD,gB0D57LC,aAAA,KAEE,sBACA,QAAA,GACA,aAAA,KAEA,oB1D87LH,OAAA,M0D77LG,KAAA,IACE,YAAA,MACA,iBAAA,KACA,iBAAA,gBACA,oBAAA,E1Dg8LL,0B0D57LC,OAAA,IACE,YAAA,MACA,QAAA,IACA,iBAAA,KACA,oBAAA,EAEA,sB1D87LH,IAAA,I0D77LG,KAAA,MACE,WAAA,MACA,mBAAA,KACA,mBAAA,gBACA,kBAAA,E1Dg8LL,4B0D57LC,OAAA,MACE,KAAA,IACA,QAAA,IACA,mBAAA,KACA,kBAAA,EAEA,uB1D87LH,IAAA,M0D77LG,KAAA,IACE,YAAA,MACA,iBAAA,EACA,oBAAA,KACA,oBAAA,gB1Dg8LL,6B0D37LC,IAAA,IACE,YAAA,MACA,QAAA,IACA,iBAAA,EACA,oBAAA,KAEA,qB1D67LH,IAAA,I0D57LG,MAAA,MACE,WAAA,MACA,mBAAA,EACA,kBAAA,KACA,kBAAA,gB1D+7LL,2B2DvjMC,MAAO,IACP,OAAA,M3DyjMD,QAAA,I2DtjMC,mBAAoB,EACpB,kBAAA,KAEA,U3DwjMD,SAAA,S2DrjMG,gBACA,SAAA,SvD6KF,MAAA,KACK,SAAA,OJ64LN,sB2DlkMC,SAAU,S1D+lMV,QAAS,K0DjlML,mBAAA,IAAA,YAAA,K3DwjML,cAAA,IAAA,YAAA,K2D9hMC,WAAA,IAAA,YAAA,KvDmKK,4BAFL,0BAGQ,YAAA,EA3JA,qDA+GR,sBAEQ,mBAAA,kBAAA,IAAA,YJi7LP,cAAA,aAAA,IAAA,Y2D5jMG,WAAA,UAAA,IAAA,YvDmHJ,4BAAA,OACQ,oBAAA,OuDjHF,oBAAA,O3D+jML,YAAA,OI/8LD,mCHy+LA,2BGx+LQ,KAAA,EuD5GF,kBAAA,sB3DgkML,UAAA,sBC2BD,kCADA,2BG/+LA,KAAA,EACQ,kBAAA,uBuDtGF,UAAA,uBArCN,6B3DumMD,gC2DvmMC,iC1DkoME,KAAM,E0DrlMN,kBAAA,mB3D+jMH,UAAA,oBAGA,wB2D/mMD,sBAAA,sBAsDI,QAAA,MAEA,wB3D6jMH,KAAA,E2DzjMG,sB3D4jMH,sB2DxnMC,SAAU,SA+DR,IAAA,E3D4jMH,MAAA,KC0BD,sB0DllMI,KAAA,KAnEJ,sBAuEI,KAAA,MAvEJ,2BA0EI,4B3D2jMH,KAAA,E2DljMC,6BACA,KAAA,MAEA,8BACA,KAAA,KtC3FA,kBsC6FA,SAAA,SACA,IAAA,EACA,OAAA,EACA,KAAA,EACA,MAAA,I3DsjMD,UAAA,K2DjjMC,MAAA,KdnGE,WAAA,OACA,YAAA,EAAA,IAAA,IAAA,eACA,iBAAA,cAAA,OAAA,kBACA,QAAA,G7CwpMH,uB2DrjMC,iBAAA,sEACE,iBAAA,iEACA,iBAAA,uFdxGA,iBAAA,kEACA,OAAA,+GACA,kBAAA,SACA,wBACA,MAAA,E7CgqMH,KAAA,K2DvjMC,iBAAA,sE1DmlMA,iBAAiB,iE0DjlMf,iBAAA,uFACA,iBAAA,kEACA,OAAA,+GtCvHF,kBAAA,SsCyFF,wB3DylMC,wBC4BC,MAAO,KACP,gBAAiB,KACjB,OAAQ,kB0DhlMN,QAAA,EACA,QAAA,G3D2jMH,0C2DnmMD,2CA2CI,6BADA,6B1DqlMF,SAAU,S0DhlMR,IAAA,IACA,QAAA,E3DwjMH,QAAA,a2DxmMC,WAAY,MAqDV,0CADA,6B3DyjMH,KAAA,I2D7mMC,YAAa,MA0DX,2CADA,6BAEA,MAAA,IACA,aAAA,MAME,6BADF,6B3DsjMH,MAAA,K2DjjMG,OAAA,KACE,YAAA,M3DmjML,YAAA,E2DxiMC,oCACA,QAAA,QAEA,oCACA,QAAA,QAEA,qBACA,SAAA,SACA,OAAA,K3D2iMD,KAAA,I2DpjMC,QAAS,GAYP,MAAA,IACA,aAAA,EACA,YAAA,KACA,WAAA,OACA,WAAA,KAEA,wBACA,QAAA,aAWA,MAAA,KACA,OAAA,K3DiiMH,OAAA,I2DhkMC,YAAa,OAkCX,OAAA,QACA,iBAAA,OACA,iBAAA,cACA,OAAA,IAAA,MAAA,K3DiiMH,cAAA,K2DzhMC,6BACA,MAAA,KACA,OAAA,KACA,OAAA,EACA,iBAAA,KAEA,kBACA,SAAA,SACA,MAAA,IACA,OAAA,K3D4hMD,KAAA,I2D3hMC,QAAA,GACE,YAAA,K3D6hMH,eAAA,K2Dp/LC,MAAO,KAhCP,WAAA,O1DijMA,YAAa,EAAE,IAAI,IAAI,eAEzB,uB0D9iMM,YAAA,KAEA,oCACA,0C3DshMH,2C2D9hMD,6BAAA,6BAYI,MAAA,K3DshMH,OAAA,K2DliMD,WAAA,M1D8jME,UAAW,KDxBZ,0C2DjhMD,6BACE,YAAA,MAEA,2C3DmhMD,6B2D/gMD,aAAA,M3DkhMC,kBACF,MAAA,I4DhxMC,KAAA,I3D4yME,eAAgB,KAElB,qBACE,OAAQ,MAkBZ,qCADA,sCADA,mBADA,oBAXA,gBADA,iBAOA,uBADA,wBADA,iBADA,kBADA,wBADA,yBASA,mCADA,oC2DvzME,oBAAA,qBAAA,oBAAA,qB3D8zMF,WADA,YAOA,uBADA,wBADA,qBADA,sBADA,cADA,e2Dl0MI,a3Dw0MJ,cDvBC,kB4DhzMG,mB3DwzMJ,WADA,YAwBE,QAAS,MACT,QAAS,IASX,qCADA,mBANA,gBAGA,uBADA,iBADA,wBAIA,mCDhBC,oB6Dl1MC,oB5Dq2MF,W+B/1MA,uBhCu0MC,qB4D/zMG,cChBF,aACA,kB5Dk2MF,W+Bx1ME,MAAO,KhC40MR,cgCz0MC,QAAS,MACT,aAAA,KhC20MD,YAAA,KgCl0MC,YhCq0MD,MAAA,gBgCl0MC,WhCq0MD,MAAA,egCl0MC,MhCq0MD,QAAA,e8D51MC,MACA,QAAA,gBAEA,WACA,WAAA,O9B8BF,WACE,KAAA,EAAA,EAAA,EhCm0MD,MAAA,YgC5zMC,YAAa,KACb,iBAAA,YhC8zMD,OAAA,E+D91MC,Q/Di2MD,QAAA,eC4BD,OACE,SAAU,M+Dt4MV,chE+2MD,MAAA,aC+BD,YADA,YADA,YADA,YAIE,QAAS,e+Dv5MT,kBhEy4MC,mBgEx4MD,yBhEo4MD,kB+Dr1MD,mBA6IA,yB9D+tMA,kBACA,mB8Dp3ME,yB9Dg3MF,kBACA,mBACA,yB+D15MY,QAAA,eACV,yBAAU,YhE64MT,QAAA,gBC4BD,iB+Dv6MU,QAAA,gBhEg5MX,c+D/1MG,QAAS,oB/Dm2MV,c+Dr2MC,c/Ds2MH,QAAA,sB+Dj2MG,yB/Dq2MD,kBACF,QAAA,iB+Dj2MG,yB/Dq2MD,mBACF,QAAA,kBgEn6MC,yBhEu6MC,yBgEt6MD,QAAA,wBACA,+CAAU,YhE26MT,QAAA,gBC4BD,iB+Dr8MU,QAAA,gBhE86MX,c+Dx2MG,QAAS,oB/D42MV,c+D92MC,c/D+2MH,QAAA,sB+D12MG,+C/D82MD,kBACF,QAAA,iB+D12MG,+C/D82MD,mBACF,QAAA,kBgEj8MC,+ChEq8MC,yBgEp8MD,QAAA,wBACA,gDAAU,YhEy8MT,QAAA,gBC4BD,iB+Dn+MU,QAAA,gBhE48MX,c+Dj3MG,QAAS,oB/Dq3MV,c+Dv3MC,c/Dw3MH,QAAA,sB+Dn3MG,gD/Du3MD,kBACF,QAAA,iB+Dn3MG,gD/Du3MD,mBACF,QAAA,kBgE/9MC,gDhEm+MC,yBgEl+MD,QAAA,wBACA,0BAAU,YhEu+MT,QAAA,gBC4BD,iB+DjgNU,QAAA,gBhE0+MX,c+D13MG,QAAS,oB/D83MV,c+Dh4MC,c/Di4MH,QAAA,sB+D53MG,0B/Dg4MD,kBACF,QAAA,iB+D53MG,0B/Dg4MD,mBACF,QAAA,kBgEr/MC,0BhEy/MC,yBACF,QAAA,wBgE1/MC,yBhE8/MC,WACF,QAAA,gBgE//MC,+ChEmgNC,WACF,QAAA,gBgEpgNC,gDhEwgNC,WACF,QAAA,gBAGA,0B+Dn3MC,WA4BE,QAAS,gBC5LX,eAAU,QAAA,eACV,aAAU,ehE4hNT,QAAA,gBC4BD,oB+DtjNU,QAAA,gBhE+hNX,iB+Dj4MG,QAAS,oBAMX,iB/D83MD,iB+Dz2MG,QAAS,sB/D82MZ,qB+Dl4MC,QAAS,e/Dq4MV,a+D/3MC,qBAcE,QAAS,iB/Ds3MZ,sB+Dn4MC,QAAS,e/Ds4MV,a+Dh4MC,sBAOE,QAAS,kB/D83MZ,4B+D/3MC,QAAS,eCpLT,ahEujNC,4BACF,QAAA,wBC6BD,aACE,cACE,QAAS"} \ No newline at end of file diff --git a/uam-server/src/main/webapp/public/assets/crypto/crypto-js.js b/uam-server/src/main/webapp/public/assets/crypto/crypto-js.js new file mode 100644 index 0000000000000000000000000000000000000000..17f2b1163a74d56fd16b4e2de193d975a0f464d2 --- /dev/null +++ b/uam-server/src/main/webapp/public/assets/crypto/crypto-js.js @@ -0,0 +1,5988 @@ +;(function (root, factory) { + if (typeof exports === "object") { + // CommonJS + module.exports = exports = factory(); + } + else if (typeof define === "function" && define.amd) { + // AMD + define([], factory); + } + else { + // Global (browser) + root.CryptoJS = factory(); + } +}(this, function () { + + /** + * CryptoJS core components. + */ + var CryptoJS = CryptoJS || (function (Math, undefined) { + /* + * Local polyfil of Object.create + */ + var create = Object.create || (function () { + function F() {}; + + return function (obj) { + var subtype; + + F.prototype = obj; + + subtype = new F(); + + F.prototype = null; + + return subtype; + }; + }()) + + /** + * CryptoJS namespace. + */ + var C = {}; + + /** + * Library namespace. + */ + var C_lib = C.lib = {}; + + /** + * Base object for prototypal inheritance. + */ + var Base = C_lib.Base = (function () { + + + return { + /** + * Creates a new object that inherits from this object. + * + * @param {Object} overrides Properties to copy into the new object. + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * field: 'value', + * + * method: function () { + * } + * }); + */ + extend: function (overrides) { + // Spawn + var subtype = create(this); + + // Augment + if (overrides) { + subtype.mixIn(overrides); + } + + // Create default initializer + if (!subtype.hasOwnProperty('init') || this.init === subtype.init) { + subtype.init = function () { + subtype.$super.init.apply(this, arguments); + }; + } + + // Initializer's prototype is the subtype object + subtype.init.prototype = subtype; + + // Reference supertype + subtype.$super = this; + + return subtype; + }, + + /** + * Extends this object and runs the init method. + * Arguments to create() will be passed to init(). + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var instance = MyType.create(); + */ + create: function () { + var instance = this.extend(); + instance.init.apply(instance, arguments); + + return instance; + }, + + /** + * Initializes a newly created object. + * Override this method to add some logic when your objects are created. + * + * @example + * + * var MyType = CryptoJS.lib.Base.extend({ + * init: function () { + * // ... + * } + * }); + */ + init: function () { + }, + + /** + * Copies properties into this object. + * + * @param {Object} properties The properties to mix in. + * + * @example + * + * MyType.mixIn({ + * field: 'value' + * }); + */ + mixIn: function (properties) { + for (var propertyName in properties) { + if (properties.hasOwnProperty(propertyName)) { + this[propertyName] = properties[propertyName]; + } + } + + // IE won't copy toString using the loop above + if (properties.hasOwnProperty('toString')) { + this.toString = properties.toString; + } + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = instance.clone(); + */ + clone: function () { + return this.init.prototype.extend(this); + } + }; + }()); + + /** + * An array of 32-bit words. + * + * @property {Array} words The array of 32-bit words. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var WordArray = C_lib.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of 32-bit words. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.create(); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); + * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 4; + } + }, + + /** + * Converts this word array to a string. + * + * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex + * + * @return {string} The stringified word array. + * + * @example + * + * var string = wordArray + ''; + * var string = wordArray.toString(); + * var string = wordArray.toString(CryptoJS.enc.Utf8); + */ + toString: function (encoder) { + return (encoder || Hex).stringify(this); + }, + + /** + * Concatenates a word array to this word array. + * + * @param {WordArray} wordArray The word array to append. + * + * @return {WordArray} This word array. + * + * @example + * + * wordArray1.concat(wordArray2); + */ + concat: function (wordArray) { + // Shortcuts + var thisWords = this.words; + var thatWords = wordArray.words; + var thisSigBytes = this.sigBytes; + var thatSigBytes = wordArray.sigBytes; + + // Clamp excess bits + this.clamp(); + + // Concat + if (thisSigBytes % 4) { + // Copy one byte at a time + for (var i = 0; i < thatSigBytes; i++) { + var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); + } + } else { + // Copy one word at a time + for (var i = 0; i < thatSigBytes; i += 4) { + thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2]; + } + } + this.sigBytes += thatSigBytes; + + // Chainable + return this; + }, + + /** + * Removes insignificant bits. + * + * @example + * + * wordArray.clamp(); + */ + clamp: function () { + // Shortcuts + var words = this.words; + var sigBytes = this.sigBytes; + + // Clamp + words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); + words.length = Math.ceil(sigBytes / 4); + }, + + /** + * Creates a copy of this word array. + * + * @return {WordArray} The clone. + * + * @example + * + * var clone = wordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone.words = this.words.slice(0); + + return clone; + }, + + /** + * Creates a word array filled with random bytes. + * + * @param {number} nBytes The number of random bytes to generate. + * + * @return {WordArray} The random word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.lib.WordArray.random(16); + */ + random: function (nBytes) { + var words = []; + + var r = (function (m_w) { + var m_w = m_w; + var m_z = 0x3ade68b1; + var mask = 0xffffffff; + + return function () { + m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask; + m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask; + var result = ((m_z << 0x10) + m_w) & mask; + result /= 0x100000000; + result += 0.5; + return result * (Math.random() > .5 ? 1 : -1); + } + }); + + for (var i = 0, rcache; i < nBytes; i += 4) { + var _r = r((rcache || Math.random()) * 0x100000000); + + rcache = _r() * 0x3ade67b7; + words.push((_r() * 0x100000000) | 0); + } + + return new WordArray.init(words, nBytes); + } + }); + + /** + * Encoder namespace. + */ + var C_enc = C.enc = {}; + + /** + * Hex encoding strategy. + */ + var Hex = C_enc.Hex = { + /** + * Converts a word array to a hex string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The hex string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.enc.Hex.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var hexChars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + hexChars.push((bite >>> 4).toString(16)); + hexChars.push((bite & 0x0f).toString(16)); + } + + return hexChars.join(''); + }, + + /** + * Converts a hex string to a word array. + * + * @param {string} hexStr The hex string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Hex.parse(hexString); + */ + parse: function (hexStr) { + // Shortcut + var hexStrLength = hexStr.length; + + // Convert + var words = []; + for (var i = 0; i < hexStrLength; i += 2) { + words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); + } + + return new WordArray.init(words, hexStrLength / 2); + } + }; + + /** + * Latin1 encoding strategy. + */ + var Latin1 = C_enc.Latin1 = { + /** + * Converts a word array to a Latin1 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Latin1 string. + * + * @static + * + * @example + * + * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var latin1Chars = []; + for (var i = 0; i < sigBytes; i++) { + var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + latin1Chars.push(String.fromCharCode(bite)); + } + + return latin1Chars.join(''); + }, + + /** + * Converts a Latin1 string to a word array. + * + * @param {string} latin1Str The Latin1 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Latin1.parse(latin1String); + */ + parse: function (latin1Str) { + // Shortcut + var latin1StrLength = latin1Str.length; + + // Convert + var words = []; + for (var i = 0; i < latin1StrLength; i++) { + words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); + } + + return new WordArray.init(words, latin1StrLength); + } + }; + + /** + * UTF-8 encoding strategy. + */ + var Utf8 = C_enc.Utf8 = { + /** + * Converts a word array to a UTF-8 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-8 string. + * + * @static + * + * @example + * + * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); + */ + stringify: function (wordArray) { + try { + return decodeURIComponent(escape(Latin1.stringify(wordArray))); + } catch (e) { + throw new Error('Malformed UTF-8 data'); + } + }, + + /** + * Converts a UTF-8 string to a word array. + * + * @param {string} utf8Str The UTF-8 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf8.parse(utf8String); + */ + parse: function (utf8Str) { + return Latin1.parse(unescape(encodeURIComponent(utf8Str))); + } + }; + + /** + * Abstract buffered block algorithm template. + * + * The property blockSize must be implemented in a concrete subtype. + * + * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0 + */ + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ + /** + * Resets this block algorithm's data buffer to its initial state. + * + * @example + * + * bufferedBlockAlgorithm.reset(); + */ + reset: function () { + // Initial values + this._data = new WordArray.init(); + this._nDataBytes = 0; + }, + + /** + * Adds new data to this block algorithm's buffer. + * + * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8. + * + * @example + * + * bufferedBlockAlgorithm._append('data'); + * bufferedBlockAlgorithm._append(wordArray); + */ + _append: function (data) { + // Convert string to WordArray, else assume WordArray already + if (typeof data == 'string') { + data = Utf8.parse(data); + } + + // Append + this._data.concat(data); + this._nDataBytes += data.sigBytes; + }, + + /** + * Processes available data blocks. + * + * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. + * + * @param {boolean} doFlush Whether all blocks and partial blocks should be processed. + * + * @return {WordArray} The processed data. + * + * @example + * + * var processedData = bufferedBlockAlgorithm._process(); + * var processedData = bufferedBlockAlgorithm._process(!!'flush'); + */ + _process: function (doFlush) { + // Shortcuts + var data = this._data; + var dataWords = data.words; + var dataSigBytes = data.sigBytes; + var blockSize = this.blockSize; + var blockSizeBytes = blockSize * 4; + + // Count blocks ready + var nBlocksReady = dataSigBytes / blockSizeBytes; + if (doFlush) { + // Round up to include partial blocks + nBlocksReady = Math.ceil(nBlocksReady); + } else { + // Round down to include only full blocks, + // less the number of blocks that must remain in the buffer + nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); + } + + // Count words ready + var nWordsReady = nBlocksReady * blockSize; + + // Count bytes ready + var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); + + // Process blocks + if (nWordsReady) { + for (var offset = 0; offset < nWordsReady; offset += blockSize) { + // Perform concrete-algorithm logic + this._doProcessBlock(dataWords, offset); + } + + // Remove processed words + var processedWords = dataWords.splice(0, nWordsReady); + data.sigBytes -= nBytesReady; + } + + // Return processed words + return new WordArray.init(processedWords, nBytesReady); + }, + + /** + * Creates a copy of this object. + * + * @return {Object} The clone. + * + * @example + * + * var clone = bufferedBlockAlgorithm.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + clone._data = this._data.clone(); + + return clone; + }, + + _minBufferSize: 0 + }); + + /** + * Abstract hasher template. + * + * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits) + */ + var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + */ + cfg: Base.extend(), + + /** + * Initializes a newly created hasher. + * + * @param {Object} cfg (Optional) The configuration options to use for this hash computation. + * + * @example + * + * var hasher = CryptoJS.algo.SHA256.create(); + */ + init: function (cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Set initial values + this.reset(); + }, + + /** + * Resets this hasher to its initial state. + * + * @example + * + * hasher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-hasher logic + this._doReset(); + }, + + /** + * Updates this hasher with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {Hasher} This hasher. + * + * @example + * + * hasher.update('message'); + * hasher.update(wordArray); + */ + update: function (messageUpdate) { + // Append + this._append(messageUpdate); + + // Update the hash + this._process(); + + // Chainable + return this; + }, + + /** + * Finalizes the hash computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The hash. + * + * @example + * + * var hash = hasher.finalize(); + * var hash = hasher.finalize('message'); + * var hash = hasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Final message update + if (messageUpdate) { + this._append(messageUpdate); + } + + // Perform concrete-hasher logic + var hash = this._doFinalize(); + + return hash; + }, + + blockSize: 512/32, + + /** + * Creates a shortcut function to a hasher's object interface. + * + * @param {Hasher} hasher The hasher to create a helper for. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); + */ + _createHelper: function (hasher) { + return function (message, cfg) { + return new hasher.init(cfg).finalize(message); + }; + }, + + /** + * Creates a shortcut function to the HMAC's object interface. + * + * @param {Hasher} hasher The hasher to use in this HMAC helper. + * + * @return {Function} The shortcut function. + * + * @static + * + * @example + * + * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); + */ + _createHmacHelper: function (hasher) { + return function (message, key) { + return new C_algo.HMAC.init(hasher, key).finalize(message); + }; + } + }); + + /** + * Algorithm namespace. + */ + var C_algo = C.algo = {}; + + return C; + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * Base64 encoding strategy. + */ + var Base64 = C_enc.Base64 = { + /** + * Converts a word array to a Base64 string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The Base64 string. + * + * @static + * + * @example + * + * var base64String = CryptoJS.enc.Base64.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + var map = this._map; + + // Clamp excess bits + wordArray.clamp(); + + // Convert + var base64Chars = []; + for (var i = 0; i < sigBytes; i += 3) { + var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; + var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff; + var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff; + + var triplet = (byte1 << 16) | (byte2 << 8) | byte3; + + for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) { + base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f)); + } + } + + // Add padding + var paddingChar = map.charAt(64); + if (paddingChar) { + while (base64Chars.length % 4) { + base64Chars.push(paddingChar); + } + } + + return base64Chars.join(''); + }, + + /** + * Converts a Base64 string to a word array. + * + * @param {string} base64Str The Base64 string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Base64.parse(base64String); + */ + parse: function (base64Str) { + // Shortcuts + var base64StrLength = base64Str.length; + var map = this._map; + var reverseMap = this._reverseMap; + + if (!reverseMap) { + reverseMap = this._reverseMap = []; + for (var j = 0; j < map.length; j++) { + reverseMap[map.charCodeAt(j)] = j; + } + } + + // Ignore padding + var paddingChar = map.charAt(64); + if (paddingChar) { + var paddingIndex = base64Str.indexOf(paddingChar); + if (paddingIndex !== -1) { + base64StrLength = paddingIndex; + } + } + + // Convert + return parseLoop(base64Str, base64StrLength, reverseMap); + + }, + + _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' + }; + + function parseLoop(base64Str, base64StrLength, reverseMap) { + var words = []; + var nBytes = 0; + for (var i = 0; i < base64StrLength; i++) { + if (i % 4) { + var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2); + var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2); + words[nBytes >>> 2] |= (bits1 | bits2) << (24 - (nBytes % 4) * 8); + nBytes++; + } + } + return WordArray.create(words, nBytes); + } + }()); + + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Constants table + var T = []; + + // Compute constants + (function () { + for (var i = 0; i < 64; i++) { + T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0; + } + }()); + + /** + * MD5 hash algorithm. + */ + var MD5 = C_algo.MD5 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0x67452301, 0xefcdab89, + 0x98badcfe, 0x10325476 + ]); + }, + + _doProcessBlock: function (M, offset) { + // Swap endian + for (var i = 0; i < 16; i++) { + // Shortcuts + var offset_i = offset + i; + var M_offset_i = M[offset_i]; + + M[offset_i] = ( + (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | + (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) + ); + } + + // Shortcuts + var H = this._hash.words; + + var M_offset_0 = M[offset + 0]; + var M_offset_1 = M[offset + 1]; + var M_offset_2 = M[offset + 2]; + var M_offset_3 = M[offset + 3]; + var M_offset_4 = M[offset + 4]; + var M_offset_5 = M[offset + 5]; + var M_offset_6 = M[offset + 6]; + var M_offset_7 = M[offset + 7]; + var M_offset_8 = M[offset + 8]; + var M_offset_9 = M[offset + 9]; + var M_offset_10 = M[offset + 10]; + var M_offset_11 = M[offset + 11]; + var M_offset_12 = M[offset + 12]; + var M_offset_13 = M[offset + 13]; + var M_offset_14 = M[offset + 14]; + var M_offset_15 = M[offset + 15]; + + // Working varialbes + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + + // Computation + a = FF(a, b, c, d, M_offset_0, 7, T[0]); + d = FF(d, a, b, c, M_offset_1, 12, T[1]); + c = FF(c, d, a, b, M_offset_2, 17, T[2]); + b = FF(b, c, d, a, M_offset_3, 22, T[3]); + a = FF(a, b, c, d, M_offset_4, 7, T[4]); + d = FF(d, a, b, c, M_offset_5, 12, T[5]); + c = FF(c, d, a, b, M_offset_6, 17, T[6]); + b = FF(b, c, d, a, M_offset_7, 22, T[7]); + a = FF(a, b, c, d, M_offset_8, 7, T[8]); + d = FF(d, a, b, c, M_offset_9, 12, T[9]); + c = FF(c, d, a, b, M_offset_10, 17, T[10]); + b = FF(b, c, d, a, M_offset_11, 22, T[11]); + a = FF(a, b, c, d, M_offset_12, 7, T[12]); + d = FF(d, a, b, c, M_offset_13, 12, T[13]); + c = FF(c, d, a, b, M_offset_14, 17, T[14]); + b = FF(b, c, d, a, M_offset_15, 22, T[15]); + + a = GG(a, b, c, d, M_offset_1, 5, T[16]); + d = GG(d, a, b, c, M_offset_6, 9, T[17]); + c = GG(c, d, a, b, M_offset_11, 14, T[18]); + b = GG(b, c, d, a, M_offset_0, 20, T[19]); + a = GG(a, b, c, d, M_offset_5, 5, T[20]); + d = GG(d, a, b, c, M_offset_10, 9, T[21]); + c = GG(c, d, a, b, M_offset_15, 14, T[22]); + b = GG(b, c, d, a, M_offset_4, 20, T[23]); + a = GG(a, b, c, d, M_offset_9, 5, T[24]); + d = GG(d, a, b, c, M_offset_14, 9, T[25]); + c = GG(c, d, a, b, M_offset_3, 14, T[26]); + b = GG(b, c, d, a, M_offset_8, 20, T[27]); + a = GG(a, b, c, d, M_offset_13, 5, T[28]); + d = GG(d, a, b, c, M_offset_2, 9, T[29]); + c = GG(c, d, a, b, M_offset_7, 14, T[30]); + b = GG(b, c, d, a, M_offset_12, 20, T[31]); + + a = HH(a, b, c, d, M_offset_5, 4, T[32]); + d = HH(d, a, b, c, M_offset_8, 11, T[33]); + c = HH(c, d, a, b, M_offset_11, 16, T[34]); + b = HH(b, c, d, a, M_offset_14, 23, T[35]); + a = HH(a, b, c, d, M_offset_1, 4, T[36]); + d = HH(d, a, b, c, M_offset_4, 11, T[37]); + c = HH(c, d, a, b, M_offset_7, 16, T[38]); + b = HH(b, c, d, a, M_offset_10, 23, T[39]); + a = HH(a, b, c, d, M_offset_13, 4, T[40]); + d = HH(d, a, b, c, M_offset_0, 11, T[41]); + c = HH(c, d, a, b, M_offset_3, 16, T[42]); + b = HH(b, c, d, a, M_offset_6, 23, T[43]); + a = HH(a, b, c, d, M_offset_9, 4, T[44]); + d = HH(d, a, b, c, M_offset_12, 11, T[45]); + c = HH(c, d, a, b, M_offset_15, 16, T[46]); + b = HH(b, c, d, a, M_offset_2, 23, T[47]); + + a = II(a, b, c, d, M_offset_0, 6, T[48]); + d = II(d, a, b, c, M_offset_7, 10, T[49]); + c = II(c, d, a, b, M_offset_14, 15, T[50]); + b = II(b, c, d, a, M_offset_5, 21, T[51]); + a = II(a, b, c, d, M_offset_12, 6, T[52]); + d = II(d, a, b, c, M_offset_3, 10, T[53]); + c = II(c, d, a, b, M_offset_10, 15, T[54]); + b = II(b, c, d, a, M_offset_1, 21, T[55]); + a = II(a, b, c, d, M_offset_8, 6, T[56]); + d = II(d, a, b, c, M_offset_15, 10, T[57]); + c = II(c, d, a, b, M_offset_6, 15, T[58]); + b = II(b, c, d, a, M_offset_13, 21, T[59]); + a = II(a, b, c, d, M_offset_4, 6, T[60]); + d = II(d, a, b, c, M_offset_11, 10, T[61]); + c = II(c, d, a, b, M_offset_2, 15, T[62]); + b = II(b, c, d, a, M_offset_9, 21, T[63]); + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + + var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000); + var nBitsTotalL = nBitsTotal; + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = ( + (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) | + (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00) + ); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( + (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) | + (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00) + ); + + data.sigBytes = (dataWords.length + 1) * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var hash = this._hash; + var H = hash.words; + + // Swap endian + for (var i = 0; i < 4; i++) { + // Shortcut + var H_i = H[i]; + + H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | + (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); + } + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + function FF(a, b, c, d, x, s, t) { + var n = a + ((b & c) | (~b & d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function GG(a, b, c, d, x, s, t) { + var n = a + ((b & d) | (c & ~d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function HH(a, b, c, d, x, s, t) { + var n = a + (b ^ c ^ d) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + function II(a, b, c, d, x, s, t) { + var n = a + (c ^ (b | ~d)) + x + t; + return ((n << s) | (n >>> (32 - s))) + b; + } + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.MD5('message'); + * var hash = CryptoJS.MD5(wordArray); + */ + C.MD5 = Hasher._createHelper(MD5); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacMD5(message, key); + */ + C.HmacMD5 = Hasher._createHmacHelper(MD5); + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Reusable object + var W = []; + + /** + * SHA-1 hash algorithm. + */ + var SHA1 = C_algo.SHA1 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0x67452301, 0xefcdab89, + 0x98badcfe, 0x10325476, + 0xc3d2e1f0 + ]); + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var H = this._hash.words; + + // Working variables + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + + // Computation + for (var i = 0; i < 80; i++) { + if (i < 16) { + W[i] = M[offset + i] | 0; + } else { + var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16]; + W[i] = (n << 1) | (n >>> 31); + } + + var t = ((a << 5) | (a >>> 27)) + e + W[i]; + if (i < 20) { + t += ((b & c) | (~b & d)) + 0x5a827999; + } else if (i < 40) { + t += (b ^ c ^ d) + 0x6ed9eba1; + } else if (i < 60) { + t += ((b & c) | (b & d) | (c & d)) - 0x70e44324; + } else /* if (i < 80) */ { + t += (b ^ c ^ d) - 0x359d3e2a; + } + + e = d; + d = c; + c = (b << 30) | (b >>> 2); + b = a; + a = t; + } + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + H[4] = (H[4] + e) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Return final computed hash + return this._hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA1('message'); + * var hash = CryptoJS.SHA1(wordArray); + */ + C.SHA1 = Hasher._createHelper(SHA1); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA1(message, key); + */ + C.HmacSHA1 = Hasher._createHmacHelper(SHA1); + }()); + + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Initialization and round constants tables + var H = []; + var K = []; + + // Compute constants + (function () { + function isPrime(n) { + var sqrtN = Math.sqrt(n); + for (var factor = 2; factor <= sqrtN; factor++) { + if (!(n % factor)) { + return false; + } + } + + return true; + } + + function getFractionalBits(n) { + return ((n - (n | 0)) * 0x100000000) | 0; + } + + var n = 2; + var nPrime = 0; + while (nPrime < 64) { + if (isPrime(n)) { + if (nPrime < 8) { + H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2)); + } + K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3)); + + nPrime++; + } + + n++; + } + }()); + + // Reusable object + var W = []; + + /** + * SHA-256 hash algorithm. + */ + var SHA256 = C_algo.SHA256 = Hasher.extend({ + _doReset: function () { + this._hash = new WordArray.init(H.slice(0)); + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var H = this._hash.words; + + // Working variables + var a = H[0]; + var b = H[1]; + var c = H[2]; + var d = H[3]; + var e = H[4]; + var f = H[5]; + var g = H[6]; + var h = H[7]; + + // Computation + for (var i = 0; i < 64; i++) { + if (i < 16) { + W[i] = M[offset + i] | 0; + } else { + var gamma0x = W[i - 15]; + var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^ + ((gamma0x << 14) | (gamma0x >>> 18)) ^ + (gamma0x >>> 3); + + var gamma1x = W[i - 2]; + var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^ + ((gamma1x << 13) | (gamma1x >>> 19)) ^ + (gamma1x >>> 10); + + W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]; + } + + var ch = (e & f) ^ (~e & g); + var maj = (a & b) ^ (a & c) ^ (b & c); + + var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22)); + var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25)); + + var t1 = h + sigma1 + ch + K[i] + W[i]; + var t2 = sigma0 + maj; + + h = g; + g = f; + f = e; + e = (d + t1) | 0; + d = c; + c = b; + b = a; + a = (t1 + t2) | 0; + } + + // Intermediate hash value + H[0] = (H[0] + a) | 0; + H[1] = (H[1] + b) | 0; + H[2] = (H[2] + c) | 0; + H[3] = (H[3] + d) | 0; + H[4] = (H[4] + e) | 0; + H[5] = (H[5] + f) | 0; + H[6] = (H[6] + g) | 0; + H[7] = (H[7] + h) | 0; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Return final computed hash + return this._hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA256('message'); + * var hash = CryptoJS.SHA256(wordArray); + */ + C.SHA256 = Hasher._createHelper(SHA256); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA256(message, key); + */ + C.HmacSHA256 = Hasher._createHmacHelper(SHA256); + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_enc = C.enc; + + /** + * UTF-16 BE encoding strategy. + */ + var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = { + /** + * Converts a word array to a UTF-16 BE string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-16 BE string. + * + * @static + * + * @example + * + * var utf16String = CryptoJS.enc.Utf16.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var utf16Chars = []; + for (var i = 0; i < sigBytes; i += 2) { + var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff; + utf16Chars.push(String.fromCharCode(codePoint)); + } + + return utf16Chars.join(''); + }, + + /** + * Converts a UTF-16 BE string to a word array. + * + * @param {string} utf16Str The UTF-16 BE string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf16.parse(utf16String); + */ + parse: function (utf16Str) { + // Shortcut + var utf16StrLength = utf16Str.length; + + // Convert + var words = []; + for (var i = 0; i < utf16StrLength; i++) { + words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16); + } + + return WordArray.create(words, utf16StrLength * 2); + } + }; + + /** + * UTF-16 LE encoding strategy. + */ + C_enc.Utf16LE = { + /** + * Converts a word array to a UTF-16 LE string. + * + * @param {WordArray} wordArray The word array. + * + * @return {string} The UTF-16 LE string. + * + * @static + * + * @example + * + * var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray); + */ + stringify: function (wordArray) { + // Shortcuts + var words = wordArray.words; + var sigBytes = wordArray.sigBytes; + + // Convert + var utf16Chars = []; + for (var i = 0; i < sigBytes; i += 2) { + var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff); + utf16Chars.push(String.fromCharCode(codePoint)); + } + + return utf16Chars.join(''); + }, + + /** + * Converts a UTF-16 LE string to a word array. + * + * @param {string} utf16Str The UTF-16 LE string. + * + * @return {WordArray} The word array. + * + * @static + * + * @example + * + * var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str); + */ + parse: function (utf16Str) { + // Shortcut + var utf16StrLength = utf16Str.length; + + // Convert + var words = []; + for (var i = 0; i < utf16StrLength; i++) { + words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16)); + } + + return WordArray.create(words, utf16StrLength * 2); + } + }; + + function swapEndian(word) { + return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff); + } + }()); + + + (function () { + // Check if typed arrays are supported + if (typeof ArrayBuffer != 'function') { + return; + } + + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + + // Reference original init + var superInit = WordArray.init; + + // Augment WordArray.init to handle typed arrays + var subInit = WordArray.init = function (typedArray) { + // Convert buffers to uint8 + if (typedArray instanceof ArrayBuffer) { + typedArray = new Uint8Array(typedArray); + } + + // Convert other array views to uint8 + if ( + typedArray instanceof Int8Array || + (typeof Uint8ClampedArray !== "undefined" && typedArray instanceof Uint8ClampedArray) || + typedArray instanceof Int16Array || + typedArray instanceof Uint16Array || + typedArray instanceof Int32Array || + typedArray instanceof Uint32Array || + typedArray instanceof Float32Array || + typedArray instanceof Float64Array + ) { + typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength); + } + + // Handle Uint8Array + if (typedArray instanceof Uint8Array) { + // Shortcut + var typedArrayByteLength = typedArray.byteLength; + + // Extract bytes + var words = []; + for (var i = 0; i < typedArrayByteLength; i++) { + words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8); + } + + // Initialize this word array + superInit.call(this, words, typedArrayByteLength); + } else { + // Else call normal init + superInit.apply(this, arguments); + } + }; + + subInit.prototype = WordArray; + }()); + + + /** @preserve + (c) 2012 by Cédric Mesnil. All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_algo = C.algo; + + // Constants table + var _zl = WordArray.create([ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, + 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, + 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, + 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]); + var _zr = WordArray.create([ + 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, + 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, + 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, + 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, + 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]); + var _sl = WordArray.create([ + 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, + 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, + 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, + 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, + 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]); + var _sr = WordArray.create([ + 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, + 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, + 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, + 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, + 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]); + + var _hl = WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]); + var _hr = WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]); + + /** + * RIPEMD160 hash algorithm. + */ + var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({ + _doReset: function () { + this._hash = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]); + }, + + _doProcessBlock: function (M, offset) { + + // Swap endian + for (var i = 0; i < 16; i++) { + // Shortcuts + var offset_i = offset + i; + var M_offset_i = M[offset_i]; + + // Swap + M[offset_i] = ( + (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) | + (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00) + ); + } + // Shortcut + var H = this._hash.words; + var hl = _hl.words; + var hr = _hr.words; + var zl = _zl.words; + var zr = _zr.words; + var sl = _sl.words; + var sr = _sr.words; + + // Working variables + var al, bl, cl, dl, el; + var ar, br, cr, dr, er; + + ar = al = H[0]; + br = bl = H[1]; + cr = cl = H[2]; + dr = dl = H[3]; + er = el = H[4]; + // Computation + var t; + for (var i = 0; i < 80; i += 1) { + t = (al + M[offset+zl[i]])|0; + if (i<16){ + t += f1(bl,cl,dl) + hl[0]; + } else if (i<32) { + t += f2(bl,cl,dl) + hl[1]; + } else if (i<48) { + t += f3(bl,cl,dl) + hl[2]; + } else if (i<64) { + t += f4(bl,cl,dl) + hl[3]; + } else {// if (i<80) { + t += f5(bl,cl,dl) + hl[4]; + } + t = t|0; + t = rotl(t,sl[i]); + t = (t+el)|0; + al = el; + el = dl; + dl = rotl(cl, 10); + cl = bl; + bl = t; + + t = (ar + M[offset+zr[i]])|0; + if (i<16){ + t += f5(br,cr,dr) + hr[0]; + } else if (i<32) { + t += f4(br,cr,dr) + hr[1]; + } else if (i<48) { + t += f3(br,cr,dr) + hr[2]; + } else if (i<64) { + t += f2(br,cr,dr) + hr[3]; + } else {// if (i<80) { + t += f1(br,cr,dr) + hr[4]; + } + t = t|0; + t = rotl(t,sr[i]) ; + t = (t+er)|0; + ar = er; + er = dr; + dr = rotl(cr, 10); + cr = br; + br = t; + } + // Intermediate hash value + t = (H[1] + cl + dr)|0; + H[1] = (H[2] + dl + er)|0; + H[2] = (H[3] + el + ar)|0; + H[3] = (H[4] + al + br)|0; + H[4] = (H[0] + bl + cr)|0; + H[0] = t; + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( + (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) | + (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00) + ); + data.sigBytes = (dataWords.length + 1) * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var hash = this._hash; + var H = hash.words; + + // Swap endian + for (var i = 0; i < 5; i++) { + // Shortcut + var H_i = H[i]; + + // Swap + H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) | + (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00); + } + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + } + }); + + + function f1(x, y, z) { + return ((x) ^ (y) ^ (z)); + + } + + function f2(x, y, z) { + return (((x)&(y)) | ((~x)&(z))); + } + + function f3(x, y, z) { + return (((x) | (~(y))) ^ (z)); + } + + function f4(x, y, z) { + return (((x) & (z)) | ((y)&(~(z)))); + } + + function f5(x, y, z) { + return ((x) ^ ((y) |(~(z)))); + + } + + function rotl(x,n) { + return (x<<n) | (x>>>(32-n)); + } + + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.RIPEMD160('message'); + * var hash = CryptoJS.RIPEMD160(wordArray); + */ + C.RIPEMD160 = Hasher._createHelper(RIPEMD160); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacRIPEMD160(message, key); + */ + C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160); + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var C_enc = C.enc; + var Utf8 = C_enc.Utf8; + var C_algo = C.algo; + + /** + * HMAC algorithm. + */ + var HMAC = C_algo.HMAC = Base.extend({ + /** + * Initializes a newly created HMAC. + * + * @param {Hasher} hasher The hash algorithm to use. + * @param {WordArray|string} key The secret key. + * + * @example + * + * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key); + */ + init: function (hasher, key) { + // Init hasher + hasher = this._hasher = new hasher.init(); + + // Convert string to WordArray, else assume WordArray already + if (typeof key == 'string') { + key = Utf8.parse(key); + } + + // Shortcuts + var hasherBlockSize = hasher.blockSize; + var hasherBlockSizeBytes = hasherBlockSize * 4; + + // Allow arbitrary length keys + if (key.sigBytes > hasherBlockSizeBytes) { + key = hasher.finalize(key); + } + + // Clamp excess bits + key.clamp(); + + // Clone key for inner and outer pads + var oKey = this._oKey = key.clone(); + var iKey = this._iKey = key.clone(); + + // Shortcuts + var oKeyWords = oKey.words; + var iKeyWords = iKey.words; + + // XOR keys with pad constants + for (var i = 0; i < hasherBlockSize; i++) { + oKeyWords[i] ^= 0x5c5c5c5c; + iKeyWords[i] ^= 0x36363636; + } + oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes; + + // Set initial values + this.reset(); + }, + + /** + * Resets this HMAC to its initial state. + * + * @example + * + * hmacHasher.reset(); + */ + reset: function () { + // Shortcut + var hasher = this._hasher; + + // Reset + hasher.reset(); + hasher.update(this._iKey); + }, + + /** + * Updates this HMAC with a message. + * + * @param {WordArray|string} messageUpdate The message to append. + * + * @return {HMAC} This HMAC instance. + * + * @example + * + * hmacHasher.update('message'); + * hmacHasher.update(wordArray); + */ + update: function (messageUpdate) { + this._hasher.update(messageUpdate); + + // Chainable + return this; + }, + + /** + * Finalizes the HMAC computation. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} messageUpdate (Optional) A final message update. + * + * @return {WordArray} The HMAC. + * + * @example + * + * var hmac = hmacHasher.finalize(); + * var hmac = hmacHasher.finalize('message'); + * var hmac = hmacHasher.finalize(wordArray); + */ + finalize: function (messageUpdate) { + // Shortcut + var hasher = this._hasher; + + // Compute HMAC + var innerHash = hasher.finalize(messageUpdate); + hasher.reset(); + var hmac = hasher.finalize(this._oKey.clone().concat(innerHash)); + + return hmac; + } + }); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var SHA1 = C_algo.SHA1; + var HMAC = C_algo.HMAC; + + /** + * Password-Based Key Derivation Function 2 algorithm. + */ + var PBKDF2 = C_algo.PBKDF2 = Base.extend({ + /** + * Configuration options. + * + * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) + * @property {Hasher} hasher The hasher to use. Default: SHA1 + * @property {number} iterations The number of iterations to perform. Default: 1 + */ + cfg: Base.extend({ + keySize: 128/32, + hasher: SHA1, + iterations: 1 + }), + + /** + * Initializes a newly created key derivation function. + * + * @param {Object} cfg (Optional) The configuration options to use for the derivation. + * + * @example + * + * var kdf = CryptoJS.algo.PBKDF2.create(); + * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 }); + * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 }); + */ + init: function (cfg) { + this.cfg = this.cfg.extend(cfg); + }, + + /** + * Computes the Password-Based Key Derivation Function 2. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * + * @return {WordArray} The derived key. + * + * @example + * + * var key = kdf.compute(password, salt); + */ + compute: function (password, salt) { + // Shortcut + var cfg = this.cfg; + + // Init HMAC + var hmac = HMAC.create(cfg.hasher, password); + + // Initial values + var derivedKey = WordArray.create(); + var blockIndex = WordArray.create([0x00000001]); + + // Shortcuts + var derivedKeyWords = derivedKey.words; + var blockIndexWords = blockIndex.words; + var keySize = cfg.keySize; + var iterations = cfg.iterations; + + // Generate key + while (derivedKeyWords.length < keySize) { + var block = hmac.update(salt).finalize(blockIndex); + hmac.reset(); + + // Shortcuts + var blockWords = block.words; + var blockWordsLength = blockWords.length; + + // Iterations + var intermediate = block; + for (var i = 1; i < iterations; i++) { + intermediate = hmac.finalize(intermediate); + hmac.reset(); + + // Shortcut + var intermediateWords = intermediate.words; + + // XOR intermediate with block + for (var j = 0; j < blockWordsLength; j++) { + blockWords[j] ^= intermediateWords[j]; + } + } + + derivedKey.concat(block); + blockIndexWords[0]++; + } + derivedKey.sigBytes = keySize * 4; + + return derivedKey; + } + }); + + /** + * Computes the Password-Based Key Derivation Function 2. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * @param {Object} cfg (Optional) The configuration options to use for this computation. + * + * @return {WordArray} The derived key. + * + * @static + * + * @example + * + * var key = CryptoJS.PBKDF2(password, salt); + * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 }); + * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 }); + */ + C.PBKDF2 = function (password, salt, cfg) { + return PBKDF2.create(cfg).compute(password, salt); + }; + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var MD5 = C_algo.MD5; + + /** + * This key derivation function is meant to conform with EVP_BytesToKey. + * www.openssl.org/docs/crypto/EVP_BytesToKey.html + */ + var EvpKDF = C_algo.EvpKDF = Base.extend({ + /** + * Configuration options. + * + * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) + * @property {Hasher} hasher The hash algorithm to use. Default: MD5 + * @property {number} iterations The number of iterations to perform. Default: 1 + */ + cfg: Base.extend({ + keySize: 128/32, + hasher: MD5, + iterations: 1 + }), + + /** + * Initializes a newly created key derivation function. + * + * @param {Object} cfg (Optional) The configuration options to use for the derivation. + * + * @example + * + * var kdf = CryptoJS.algo.EvpKDF.create(); + * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 }); + * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 }); + */ + init: function (cfg) { + this.cfg = this.cfg.extend(cfg); + }, + + /** + * Derives a key from a password. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * + * @return {WordArray} The derived key. + * + * @example + * + * var key = kdf.compute(password, salt); + */ + compute: function (password, salt) { + // Shortcut + var cfg = this.cfg; + + // Init hasher + var hasher = cfg.hasher.create(); + + // Initial values + var derivedKey = WordArray.create(); + + // Shortcuts + var derivedKeyWords = derivedKey.words; + var keySize = cfg.keySize; + var iterations = cfg.iterations; + + // Generate key + while (derivedKeyWords.length < keySize) { + if (block) { + hasher.update(block); + } + var block = hasher.update(password).finalize(salt); + hasher.reset(); + + // Iterations + for (var i = 1; i < iterations; i++) { + block = hasher.finalize(block); + hasher.reset(); + } + + derivedKey.concat(block); + } + derivedKey.sigBytes = keySize * 4; + + return derivedKey; + } + }); + + /** + * Derives a key from a password. + * + * @param {WordArray|string} password The password. + * @param {WordArray|string} salt A salt. + * @param {Object} cfg (Optional) The configuration options to use for this computation. + * + * @return {WordArray} The derived key. + * + * @static + * + * @example + * + * var key = CryptoJS.EvpKDF(password, salt); + * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 }); + * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 }); + */ + C.EvpKDF = function (password, salt, cfg) { + return EvpKDF.create(cfg).compute(password, salt); + }; + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var C_algo = C.algo; + var SHA256 = C_algo.SHA256; + + /** + * SHA-224 hash algorithm. + */ + var SHA224 = C_algo.SHA224 = SHA256.extend({ + _doReset: function () { + this._hash = new WordArray.init([ + 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, + 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4 + ]); + }, + + _doFinalize: function () { + var hash = SHA256._doFinalize.call(this); + + hash.sigBytes -= 4; + + return hash; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA224('message'); + * var hash = CryptoJS.SHA224(wordArray); + */ + C.SHA224 = SHA256._createHelper(SHA224); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA224(message, key); + */ + C.HmacSHA224 = SHA256._createHmacHelper(SHA224); + }()); + + + (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var X32WordArray = C_lib.WordArray; + + /** + * x64 namespace. + */ + var C_x64 = C.x64 = {}; + + /** + * A 64-bit word. + */ + var X64Word = C_x64.Word = Base.extend({ + /** + * Initializes a newly created 64-bit word. + * + * @param {number} high The high 32 bits. + * @param {number} low The low 32 bits. + * + * @example + * + * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607); + */ + init: function (high, low) { + this.high = high; + this.low = low; + } + + /** + * Bitwise NOTs this word. + * + * @return {X64Word} A new x64-Word object after negating. + * + * @example + * + * var negated = x64Word.not(); + */ + // not: function () { + // var high = ~this.high; + // var low = ~this.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise ANDs this word with the passed word. + * + * @param {X64Word} word The x64-Word to AND with this word. + * + * @return {X64Word} A new x64-Word object after ANDing. + * + * @example + * + * var anded = x64Word.and(anotherX64Word); + */ + // and: function (word) { + // var high = this.high & word.high; + // var low = this.low & word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise ORs this word with the passed word. + * + * @param {X64Word} word The x64-Word to OR with this word. + * + * @return {X64Word} A new x64-Word object after ORing. + * + * @example + * + * var ored = x64Word.or(anotherX64Word); + */ + // or: function (word) { + // var high = this.high | word.high; + // var low = this.low | word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Bitwise XORs this word with the passed word. + * + * @param {X64Word} word The x64-Word to XOR with this word. + * + * @return {X64Word} A new x64-Word object after XORing. + * + * @example + * + * var xored = x64Word.xor(anotherX64Word); + */ + // xor: function (word) { + // var high = this.high ^ word.high; + // var low = this.low ^ word.low; + + // return X64Word.create(high, low); + // }, + + /** + * Shifts this word n bits to the left. + * + * @param {number} n The number of bits to shift. + * + * @return {X64Word} A new x64-Word object after shifting. + * + * @example + * + * var shifted = x64Word.shiftL(25); + */ + // shiftL: function (n) { + // if (n < 32) { + // var high = (this.high << n) | (this.low >>> (32 - n)); + // var low = this.low << n; + // } else { + // var high = this.low << (n - 32); + // var low = 0; + // } + + // return X64Word.create(high, low); + // }, + + /** + * Shifts this word n bits to the right. + * + * @param {number} n The number of bits to shift. + * + * @return {X64Word} A new x64-Word object after shifting. + * + * @example + * + * var shifted = x64Word.shiftR(7); + */ + // shiftR: function (n) { + // if (n < 32) { + // var low = (this.low >>> n) | (this.high << (32 - n)); + // var high = this.high >>> n; + // } else { + // var low = this.high >>> (n - 32); + // var high = 0; + // } + + // return X64Word.create(high, low); + // }, + + /** + * Rotates this word n bits to the left. + * + * @param {number} n The number of bits to rotate. + * + * @return {X64Word} A new x64-Word object after rotating. + * + * @example + * + * var rotated = x64Word.rotL(25); + */ + // rotL: function (n) { + // return this.shiftL(n).or(this.shiftR(64 - n)); + // }, + + /** + * Rotates this word n bits to the right. + * + * @param {number} n The number of bits to rotate. + * + * @return {X64Word} A new x64-Word object after rotating. + * + * @example + * + * var rotated = x64Word.rotR(7); + */ + // rotR: function (n) { + // return this.shiftR(n).or(this.shiftL(64 - n)); + // }, + + /** + * Adds this word with the passed word. + * + * @param {X64Word} word The x64-Word to add with this word. + * + * @return {X64Word} A new x64-Word object after adding. + * + * @example + * + * var added = x64Word.add(anotherX64Word); + */ + // add: function (word) { + // var low = (this.low + word.low) | 0; + // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0; + // var high = (this.high + word.high + carry) | 0; + + // return X64Word.create(high, low); + // } + }); + + /** + * An array of 64-bit words. + * + * @property {Array} words The array of CryptoJS.x64.Word objects. + * @property {number} sigBytes The number of significant bytes in this word array. + */ + var X64WordArray = C_x64.WordArray = Base.extend({ + /** + * Initializes a newly created word array. + * + * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + * + * @example + * + * var wordArray = CryptoJS.x64.WordArray.create(); + * + * var wordArray = CryptoJS.x64.WordArray.create([ + * CryptoJS.x64.Word.create(0x00010203, 0x04050607), + * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) + * ]); + * + * var wordArray = CryptoJS.x64.WordArray.create([ + * CryptoJS.x64.Word.create(0x00010203, 0x04050607), + * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f) + * ], 10); + */ + init: function (words, sigBytes) { + words = this.words = words || []; + + if (sigBytes != undefined) { + this.sigBytes = sigBytes; + } else { + this.sigBytes = words.length * 8; + } + }, + + /** + * Converts this 64-bit word array to a 32-bit word array. + * + * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array. + * + * @example + * + * var x32WordArray = x64WordArray.toX32(); + */ + toX32: function () { + // Shortcuts + var x64Words = this.words; + var x64WordsLength = x64Words.length; + + // Convert + var x32Words = []; + for (var i = 0; i < x64WordsLength; i++) { + var x64Word = x64Words[i]; + x32Words.push(x64Word.high); + x32Words.push(x64Word.low); + } + + return X32WordArray.create(x32Words, this.sigBytes); + }, + + /** + * Creates a copy of this word array. + * + * @return {X64WordArray} The clone. + * + * @example + * + * var clone = x64WordArray.clone(); + */ + clone: function () { + var clone = Base.clone.call(this); + + // Clone "words" array + var words = clone.words = this.words.slice(0); + + // Clone each X64Word object + var wordsLength = words.length; + for (var i = 0; i < wordsLength; i++) { + words[i] = words[i].clone(); + } + + return clone; + } + }); + }()); + + + (function (Math) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var Hasher = C_lib.Hasher; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var C_algo = C.algo; + + // Constants tables + var RHO_OFFSETS = []; + var PI_INDEXES = []; + var ROUND_CONSTANTS = []; + + // Compute Constants + (function () { + // Compute rho offset constants + var x = 1, y = 0; + for (var t = 0; t < 24; t++) { + RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64; + + var newX = y % 5; + var newY = (2 * x + 3 * y) % 5; + x = newX; + y = newY; + } + + // Compute pi index constants + for (var x = 0; x < 5; x++) { + for (var y = 0; y < 5; y++) { + PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5; + } + } + + // Compute round constants + var LFSR = 0x01; + for (var i = 0; i < 24; i++) { + var roundConstantMsw = 0; + var roundConstantLsw = 0; + + for (var j = 0; j < 7; j++) { + if (LFSR & 0x01) { + var bitPosition = (1 << j) - 1; + if (bitPosition < 32) { + roundConstantLsw ^= 1 << bitPosition; + } else /* if (bitPosition >= 32) */ { + roundConstantMsw ^= 1 << (bitPosition - 32); + } + } + + // Compute next LFSR + if (LFSR & 0x80) { + // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1 + LFSR = (LFSR << 1) ^ 0x71; + } else { + LFSR <<= 1; + } + } + + ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw); + } + }()); + + // Reusable objects for temporary values + var T = []; + (function () { + for (var i = 0; i < 25; i++) { + T[i] = X64Word.create(); + } + }()); + + /** + * SHA-3 hash algorithm. + */ + var SHA3 = C_algo.SHA3 = Hasher.extend({ + /** + * Configuration options. + * + * @property {number} outputLength + * The desired number of bits in the output hash. + * Only values permitted are: 224, 256, 384, 512. + * Default: 512 + */ + cfg: Hasher.cfg.extend({ + outputLength: 512 + }), + + _doReset: function () { + var state = this._state = [] + for (var i = 0; i < 25; i++) { + state[i] = new X64Word.init(); + } + + this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32; + }, + + _doProcessBlock: function (M, offset) { + // Shortcuts + var state = this._state; + var nBlockSizeLanes = this.blockSize / 2; + + // Absorb + for (var i = 0; i < nBlockSizeLanes; i++) { + // Shortcuts + var M2i = M[offset + 2 * i]; + var M2i1 = M[offset + 2 * i + 1]; + + // Swap endian + M2i = ( + (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) | + (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00) + ); + M2i1 = ( + (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) | + (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00) + ); + + // Absorb message into state + var lane = state[i]; + lane.high ^= M2i1; + lane.low ^= M2i; + } + + // Rounds + for (var round = 0; round < 24; round++) { + // Theta + for (var x = 0; x < 5; x++) { + // Mix column lanes + var tMsw = 0, tLsw = 0; + for (var y = 0; y < 5; y++) { + var lane = state[x + 5 * y]; + tMsw ^= lane.high; + tLsw ^= lane.low; + } + + // Temporary values + var Tx = T[x]; + Tx.high = tMsw; + Tx.low = tLsw; + } + for (var x = 0; x < 5; x++) { + // Shortcuts + var Tx4 = T[(x + 4) % 5]; + var Tx1 = T[(x + 1) % 5]; + var Tx1Msw = Tx1.high; + var Tx1Lsw = Tx1.low; + + // Mix surrounding columns + var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31)); + var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31)); + for (var y = 0; y < 5; y++) { + var lane = state[x + 5 * y]; + lane.high ^= tMsw; + lane.low ^= tLsw; + } + } + + // Rho Pi + for (var laneIndex = 1; laneIndex < 25; laneIndex++) { + // Shortcuts + var lane = state[laneIndex]; + var laneMsw = lane.high; + var laneLsw = lane.low; + var rhoOffset = RHO_OFFSETS[laneIndex]; + + // Rotate lanes + if (rhoOffset < 32) { + var tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset)); + var tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset)); + } else /* if (rhoOffset >= 32) */ { + var tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset)); + var tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset)); + } + + // Transpose lanes + var TPiLane = T[PI_INDEXES[laneIndex]]; + TPiLane.high = tMsw; + TPiLane.low = tLsw; + } + + // Rho pi at x = y = 0 + var T0 = T[0]; + var state0 = state[0]; + T0.high = state0.high; + T0.low = state0.low; + + // Chi + for (var x = 0; x < 5; x++) { + for (var y = 0; y < 5; y++) { + // Shortcuts + var laneIndex = x + 5 * y; + var lane = state[laneIndex]; + var TLane = T[laneIndex]; + var Tx1Lane = T[((x + 1) % 5) + 5 * y]; + var Tx2Lane = T[((x + 2) % 5) + 5 * y]; + + // Mix rows + lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high); + lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low); + } + } + + // Iota + var lane = state[0]; + var roundConstant = ROUND_CONSTANTS[round]; + lane.high ^= roundConstant.high; + lane.low ^= roundConstant.low;; + } + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + var blockSizeBits = this.blockSize * 32; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32); + dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Shortcuts + var state = this._state; + var outputLengthBytes = this.cfg.outputLength / 8; + var outputLengthLanes = outputLengthBytes / 8; + + // Squeeze + var hashWords = []; + for (var i = 0; i < outputLengthLanes; i++) { + // Shortcuts + var lane = state[i]; + var laneMsw = lane.high; + var laneLsw = lane.low; + + // Swap endian + laneMsw = ( + (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) | + (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00) + ); + laneLsw = ( + (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) | + (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00) + ); + + // Squeeze state to retrieve hash + hashWords.push(laneLsw); + hashWords.push(laneMsw); + } + + // Return final computed hash + return new WordArray.init(hashWords, outputLengthBytes); + }, + + clone: function () { + var clone = Hasher.clone.call(this); + + var state = clone._state = this._state.slice(0); + for (var i = 0; i < 25; i++) { + state[i] = state[i].clone(); + } + + return clone; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA3('message'); + * var hash = CryptoJS.SHA3(wordArray); + */ + C.SHA3 = Hasher._createHelper(SHA3); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA3(message, key); + */ + C.HmacSHA3 = Hasher._createHmacHelper(SHA3); + }(Math)); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Hasher = C_lib.Hasher; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var X64WordArray = C_x64.WordArray; + var C_algo = C.algo; + + function X64Word_create() { + return X64Word.create.apply(X64Word, arguments); + } + + // Constants + var K = [ + X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd), + X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc), + X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019), + X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118), + X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe), + X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2), + X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1), + X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694), + X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3), + X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65), + X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483), + X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5), + X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210), + X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4), + X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725), + X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70), + X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926), + X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df), + X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8), + X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b), + X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001), + X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30), + X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910), + X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8), + X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53), + X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8), + X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb), + X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3), + X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60), + X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec), + X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9), + X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b), + X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207), + X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178), + X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6), + X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b), + X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493), + X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c), + X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a), + X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817) + ]; + + // Reusable objects + var W = []; + (function () { + for (var i = 0; i < 80; i++) { + W[i] = X64Word_create(); + } + }()); + + /** + * SHA-512 hash algorithm. + */ + var SHA512 = C_algo.SHA512 = Hasher.extend({ + _doReset: function () { + this._hash = new X64WordArray.init([ + new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b), + new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1), + new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f), + new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179) + ]); + }, + + _doProcessBlock: function (M, offset) { + // Shortcuts + var H = this._hash.words; + + var H0 = H[0]; + var H1 = H[1]; + var H2 = H[2]; + var H3 = H[3]; + var H4 = H[4]; + var H5 = H[5]; + var H6 = H[6]; + var H7 = H[7]; + + var H0h = H0.high; + var H0l = H0.low; + var H1h = H1.high; + var H1l = H1.low; + var H2h = H2.high; + var H2l = H2.low; + var H3h = H3.high; + var H3l = H3.low; + var H4h = H4.high; + var H4l = H4.low; + var H5h = H5.high; + var H5l = H5.low; + var H6h = H6.high; + var H6l = H6.low; + var H7h = H7.high; + var H7l = H7.low; + + // Working variables + var ah = H0h; + var al = H0l; + var bh = H1h; + var bl = H1l; + var ch = H2h; + var cl = H2l; + var dh = H3h; + var dl = H3l; + var eh = H4h; + var el = H4l; + var fh = H5h; + var fl = H5l; + var gh = H6h; + var gl = H6l; + var hh = H7h; + var hl = H7l; + + // Rounds + for (var i = 0; i < 80; i++) { + // Shortcut + var Wi = W[i]; + + // Extend message + if (i < 16) { + var Wih = Wi.high = M[offset + i * 2] | 0; + var Wil = Wi.low = M[offset + i * 2 + 1] | 0; + } else { + // Gamma0 + var gamma0x = W[i - 15]; + var gamma0xh = gamma0x.high; + var gamma0xl = gamma0x.low; + var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7); + var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25)); + + // Gamma1 + var gamma1x = W[i - 2]; + var gamma1xh = gamma1x.high; + var gamma1xl = gamma1x.low; + var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6); + var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26)); + + // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16] + var Wi7 = W[i - 7]; + var Wi7h = Wi7.high; + var Wi7l = Wi7.low; + + var Wi16 = W[i - 16]; + var Wi16h = Wi16.high; + var Wi16l = Wi16.low; + + var Wil = gamma0l + Wi7l; + var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0); + var Wil = Wil + gamma1l; + var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0); + var Wil = Wil + Wi16l; + var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0); + + Wi.high = Wih; + Wi.low = Wil; + } + + var chh = (eh & fh) ^ (~eh & gh); + var chl = (el & fl) ^ (~el & gl); + var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch); + var majl = (al & bl) ^ (al & cl) ^ (bl & cl); + + var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7)); + var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7)); + var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9)); + var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9)); + + // t1 = h + sigma1 + ch + K[i] + W[i] + var Ki = K[i]; + var Kih = Ki.high; + var Kil = Ki.low; + + var t1l = hl + sigma1l; + var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0); + var t1l = t1l + chl; + var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0); + var t1l = t1l + Kil; + var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0); + var t1l = t1l + Wil; + var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0); + + // t2 = sigma0 + maj + var t2l = sigma0l + majl; + var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0); + + // Update working variables + hh = gh; + hl = gl; + gh = fh; + gl = fl; + fh = eh; + fl = el; + el = (dl + t1l) | 0; + eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0; + dh = ch; + dl = cl; + ch = bh; + cl = bl; + bh = ah; + bl = al; + al = (t1l + t2l) | 0; + ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0; + } + + // Intermediate hash value + H0l = H0.low = (H0l + al); + H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0)); + H1l = H1.low = (H1l + bl); + H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0)); + H2l = H2.low = (H2l + cl); + H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0)); + H3l = H3.low = (H3l + dl); + H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0)); + H4l = H4.low = (H4l + el); + H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0)); + H5l = H5.low = (H5l + fl); + H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0)); + H6l = H6.low = (H6l + gl); + H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0)); + H7l = H7.low = (H7l + hl); + H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0)); + }, + + _doFinalize: function () { + // Shortcuts + var data = this._data; + var dataWords = data.words; + + var nBitsTotal = this._nDataBytes * 8; + var nBitsLeft = data.sigBytes * 8; + + // Add padding + dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); + dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000); + dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal; + data.sigBytes = dataWords.length * 4; + + // Hash final blocks + this._process(); + + // Convert hash to 32-bit word array before returning + var hash = this._hash.toX32(); + + // Return final computed hash + return hash; + }, + + clone: function () { + var clone = Hasher.clone.call(this); + clone._hash = this._hash.clone(); + + return clone; + }, + + blockSize: 1024/32 + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA512('message'); + * var hash = CryptoJS.SHA512(wordArray); + */ + C.SHA512 = Hasher._createHelper(SHA512); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA512(message, key); + */ + C.HmacSHA512 = Hasher._createHmacHelper(SHA512); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_x64 = C.x64; + var X64Word = C_x64.Word; + var X64WordArray = C_x64.WordArray; + var C_algo = C.algo; + var SHA512 = C_algo.SHA512; + + /** + * SHA-384 hash algorithm. + */ + var SHA384 = C_algo.SHA384 = SHA512.extend({ + _doReset: function () { + this._hash = new X64WordArray.init([ + new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507), + new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939), + new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511), + new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4) + ]); + }, + + _doFinalize: function () { + var hash = SHA512._doFinalize.call(this); + + hash.sigBytes -= 16; + + return hash; + } + }); + + /** + * Shortcut function to the hasher's object interface. + * + * @param {WordArray|string} message The message to hash. + * + * @return {WordArray} The hash. + * + * @static + * + * @example + * + * var hash = CryptoJS.SHA384('message'); + * var hash = CryptoJS.SHA384(wordArray); + */ + C.SHA384 = SHA512._createHelper(SHA384); + + /** + * Shortcut function to the HMAC's object interface. + * + * @param {WordArray|string} message The message to hash. + * @param {WordArray|string} key The secret key. + * + * @return {WordArray} The HMAC. + * + * @static + * + * @example + * + * var hmac = CryptoJS.HmacSHA384(message, key); + */ + C.HmacSHA384 = SHA512._createHmacHelper(SHA384); + }()); + + + /** + * Cipher core components. + */ + CryptoJS.lib.Cipher || (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var Base = C_lib.Base; + var WordArray = C_lib.WordArray; + var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm; + var C_enc = C.enc; + var Utf8 = C_enc.Utf8; + var Base64 = C_enc.Base64; + var C_algo = C.algo; + var EvpKDF = C_algo.EvpKDF; + + /** + * Abstract base cipher template. + * + * @property {number} keySize This cipher's key size. Default: 4 (128 bits) + * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits) + * @property {number} _ENC_XFORM_MODE A constant representing encryption mode. + * @property {number} _DEC_XFORM_MODE A constant representing decryption mode. + */ + var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({ + /** + * Configuration options. + * + * @property {WordArray} iv The IV to use for this operation. + */ + cfg: Base.extend(), + + /** + * Creates this cipher in encryption mode. + * + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {Cipher} A cipher instance. + * + * @static + * + * @example + * + * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray }); + */ + createEncryptor: function (key, cfg) { + return this.create(this._ENC_XFORM_MODE, key, cfg); + }, + + /** + * Creates this cipher in decryption mode. + * + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {Cipher} A cipher instance. + * + * @static + * + * @example + * + * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray }); + */ + createDecryptor: function (key, cfg) { + return this.create(this._DEC_XFORM_MODE, key, cfg); + }, + + /** + * Initializes a newly created cipher. + * + * @param {number} xformMode Either the encryption or decryption transormation mode constant. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @example + * + * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray }); + */ + init: function (xformMode, key, cfg) { + // Apply config defaults + this.cfg = this.cfg.extend(cfg); + + // Store transform mode and key + this._xformMode = xformMode; + this._key = key; + + // Set initial values + this.reset(); + }, + + /** + * Resets this cipher to its initial state. + * + * @example + * + * cipher.reset(); + */ + reset: function () { + // Reset data buffer + BufferedBlockAlgorithm.reset.call(this); + + // Perform concrete-cipher logic + this._doReset(); + }, + + /** + * Adds data to be encrypted or decrypted. + * + * @param {WordArray|string} dataUpdate The data to encrypt or decrypt. + * + * @return {WordArray} The data after processing. + * + * @example + * + * var encrypted = cipher.process('data'); + * var encrypted = cipher.process(wordArray); + */ + process: function (dataUpdate) { + // Append + this._append(dataUpdate); + + // Process available blocks + return this._process(); + }, + + /** + * Finalizes the encryption or decryption process. + * Note that the finalize operation is effectively a destructive, read-once operation. + * + * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt. + * + * @return {WordArray} The data after final processing. + * + * @example + * + * var encrypted = cipher.finalize(); + * var encrypted = cipher.finalize('data'); + * var encrypted = cipher.finalize(wordArray); + */ + finalize: function (dataUpdate) { + // Final data update + if (dataUpdate) { + this._append(dataUpdate); + } + + // Perform concrete-cipher logic + var finalProcessedData = this._doFinalize(); + + return finalProcessedData; + }, + + keySize: 128/32, + + ivSize: 128/32, + + _ENC_XFORM_MODE: 1, + + _DEC_XFORM_MODE: 2, + + /** + * Creates shortcut functions to a cipher's object interface. + * + * @param {Cipher} cipher The cipher to create a helper for. + * + * @return {Object} An object with encrypt and decrypt shortcut functions. + * + * @static + * + * @example + * + * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES); + */ + _createHelper: (function () { + function selectCipherStrategy(key) { + if (typeof key == 'string') { + return PasswordBasedCipher; + } else { + return SerializableCipher; + } + } + + return function (cipher) { + return { + encrypt: function (message, key, cfg) { + return selectCipherStrategy(key).encrypt(cipher, message, key, cfg); + }, + + decrypt: function (ciphertext, key, cfg) { + return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg); + } + }; + }; + }()) + }); + + /** + * Abstract base stream cipher template. + * + * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits) + */ + var StreamCipher = C_lib.StreamCipher = Cipher.extend({ + _doFinalize: function () { + // Process partial blocks + var finalProcessedBlocks = this._process(!!'flush'); + + return finalProcessedBlocks; + }, + + blockSize: 1 + }); + + /** + * Mode namespace. + */ + var C_mode = C.mode = {}; + + /** + * Abstract base block cipher mode template. + */ + var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({ + /** + * Creates this mode for encryption. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @static + * + * @example + * + * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words); + */ + createEncryptor: function (cipher, iv) { + return this.Encryptor.create(cipher, iv); + }, + + /** + * Creates this mode for decryption. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @static + * + * @example + * + * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words); + */ + createDecryptor: function (cipher, iv) { + return this.Decryptor.create(cipher, iv); + }, + + /** + * Initializes a newly created mode. + * + * @param {Cipher} cipher A block cipher instance. + * @param {Array} iv The IV words. + * + * @example + * + * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words); + */ + init: function (cipher, iv) { + this._cipher = cipher; + this._iv = iv; + } + }); + + /** + * Cipher Block Chaining mode. + */ + var CBC = C_mode.CBC = (function () { + /** + * Abstract base CBC mode. + */ + var CBC = BlockCipherMode.extend(); + + /** + * CBC encryptor. + */ + CBC.Encryptor = CBC.extend({ + /** + * Processes the data block at offset. + * + * @param {Array} words The data words to operate on. + * @param {number} offset The offset where the block starts. + * + * @example + * + * mode.processBlock(data.words, offset); + */ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // XOR and encrypt + xorBlock.call(this, words, offset, blockSize); + cipher.encryptBlock(words, offset); + + // Remember this block to use with next block + this._prevBlock = words.slice(offset, offset + blockSize); + } + }); + + /** + * CBC decryptor. + */ + CBC.Decryptor = CBC.extend({ + /** + * Processes the data block at offset. + * + * @param {Array} words The data words to operate on. + * @param {number} offset The offset where the block starts. + * + * @example + * + * mode.processBlock(data.words, offset); + */ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // Remember this block to use with next block + var thisBlock = words.slice(offset, offset + blockSize); + + // Decrypt and XOR + cipher.decryptBlock(words, offset); + xorBlock.call(this, words, offset, blockSize); + + // This block becomes the previous block + this._prevBlock = thisBlock; + } + }); + + function xorBlock(words, offset, blockSize) { + // Shortcut + var iv = this._iv; + + // Choose mixing block + if (iv) { + var block = iv; + + // Remove IV for subsequent blocks + this._iv = undefined; + } else { + var block = this._prevBlock; + } + + // XOR blocks + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= block[i]; + } + } + + return CBC; + }()); + + /** + * Padding namespace. + */ + var C_pad = C.pad = {}; + + /** + * PKCS #5/7 padding strategy. + */ + var Pkcs7 = C_pad.Pkcs7 = { + /** + * Pads data using the algorithm defined in PKCS #5/7. + * + * @param {WordArray} data The data to pad. + * @param {number} blockSize The multiple that the data should be padded to. + * + * @static + * + * @example + * + * CryptoJS.pad.Pkcs7.pad(wordArray, 4); + */ + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; + + // Create padding word + var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes; + + // Create padding + var paddingWords = []; + for (var i = 0; i < nPaddingBytes; i += 4) { + paddingWords.push(paddingWord); + } + var padding = WordArray.create(paddingWords, nPaddingBytes); + + // Add padding + data.concat(padding); + }, + + /** + * Unpads data that had been padded using the algorithm defined in PKCS #5/7. + * + * @param {WordArray} data The data to unpad. + * + * @static + * + * @example + * + * CryptoJS.pad.Pkcs7.unpad(wordArray); + */ + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + /** + * Abstract base block cipher template. + * + * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits) + */ + var BlockCipher = C_lib.BlockCipher = Cipher.extend({ + /** + * Configuration options. + * + * @property {Mode} mode The block mode to use. Default: CBC + * @property {Padding} padding The padding strategy to use. Default: Pkcs7 + */ + cfg: Cipher.cfg.extend({ + mode: CBC, + padding: Pkcs7 + }), + + reset: function () { + // Reset cipher + Cipher.reset.call(this); + + // Shortcuts + var cfg = this.cfg; + var iv = cfg.iv; + var mode = cfg.mode; + + // Reset block mode + if (this._xformMode == this._ENC_XFORM_MODE) { + var modeCreator = mode.createEncryptor; + } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { + var modeCreator = mode.createDecryptor; + // Keep at least one block in the buffer for unpadding + this._minBufferSize = 1; + } + + if (this._mode && this._mode.__creator == modeCreator) { + this._mode.init(this, iv && iv.words); + } else { + this._mode = modeCreator.call(mode, this, iv && iv.words); + this._mode.__creator = modeCreator; + } + }, + + _doProcessBlock: function (words, offset) { + this._mode.processBlock(words, offset); + }, + + _doFinalize: function () { + // Shortcut + var padding = this.cfg.padding; + + // Finalize + if (this._xformMode == this._ENC_XFORM_MODE) { + // Pad data + padding.pad(this._data, this.blockSize); + + // Process final blocks + var finalProcessedBlocks = this._process(!!'flush'); + } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { + // Process final blocks + var finalProcessedBlocks = this._process(!!'flush'); + + // Unpad data + padding.unpad(finalProcessedBlocks); + } + + return finalProcessedBlocks; + }, + + blockSize: 128/32 + }); + + /** + * A collection of cipher parameters. + * + * @property {WordArray} ciphertext The raw ciphertext. + * @property {WordArray} key The key to this ciphertext. + * @property {WordArray} iv The IV used in the ciphering operation. + * @property {WordArray} salt The salt used with a key derivation function. + * @property {Cipher} algorithm The cipher algorithm. + * @property {Mode} mode The block mode used in the ciphering operation. + * @property {Padding} padding The padding scheme used in the ciphering operation. + * @property {number} blockSize The block size of the cipher. + * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string. + */ + var CipherParams = C_lib.CipherParams = Base.extend({ + /** + * Initializes a newly created cipher params object. + * + * @param {Object} cipherParams An object with any of the possible cipher parameters. + * + * @example + * + * var cipherParams = CryptoJS.lib.CipherParams.create({ + * ciphertext: ciphertextWordArray, + * key: keyWordArray, + * iv: ivWordArray, + * salt: saltWordArray, + * algorithm: CryptoJS.algo.AES, + * mode: CryptoJS.mode.CBC, + * padding: CryptoJS.pad.PKCS7, + * blockSize: 4, + * formatter: CryptoJS.format.OpenSSL + * }); + */ + init: function (cipherParams) { + this.mixIn(cipherParams); + }, + + /** + * Converts this cipher params object to a string. + * + * @param {Format} formatter (Optional) The formatting strategy to use. + * + * @return {string} The stringified cipher params. + * + * @throws Error If neither the formatter nor the default formatter is set. + * + * @example + * + * var string = cipherParams + ''; + * var string = cipherParams.toString(); + * var string = cipherParams.toString(CryptoJS.format.OpenSSL); + */ + toString: function (formatter) { + return (formatter || this.formatter).stringify(this); + } + }); + + /** + * Format namespace. + */ + var C_format = C.format = {}; + + /** + * OpenSSL formatting strategy. + */ + var OpenSSLFormatter = C_format.OpenSSL = { + /** + * Converts a cipher params object to an OpenSSL-compatible string. + * + * @param {CipherParams} cipherParams The cipher params object. + * + * @return {string} The OpenSSL-compatible string. + * + * @static + * + * @example + * + * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams); + */ + stringify: function (cipherParams) { + // Shortcuts + var ciphertext = cipherParams.ciphertext; + var salt = cipherParams.salt; + + // Format + if (salt) { + var wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext); + } else { + var wordArray = ciphertext; + } + + return wordArray.toString(Base64); + }, + + /** + * Converts an OpenSSL-compatible string to a cipher params object. + * + * @param {string} openSSLStr The OpenSSL-compatible string. + * + * @return {CipherParams} The cipher params object. + * + * @static + * + * @example + * + * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString); + */ + parse: function (openSSLStr) { + // Parse base64 + var ciphertext = Base64.parse(openSSLStr); + + // Shortcut + var ciphertextWords = ciphertext.words; + + // Test for salt + if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) { + // Extract salt + var salt = WordArray.create(ciphertextWords.slice(2, 4)); + + // Remove salt from ciphertext + ciphertextWords.splice(0, 4); + ciphertext.sigBytes -= 16; + } + + return CipherParams.create({ ciphertext: ciphertext, salt: salt }); + } + }; + + /** + * A cipher wrapper that returns ciphertext as a serializable cipher params object. + */ + var SerializableCipher = C_lib.SerializableCipher = Base.extend({ + /** + * Configuration options. + * + * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL + */ + cfg: Base.extend({ + format: OpenSSLFormatter + }), + + /** + * Encrypts a message. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {WordArray|string} message The message to encrypt. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {CipherParams} A cipher params object. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key); + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv }); + * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + */ + encrypt: function (cipher, message, key, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Encrypt + var encryptor = cipher.createEncryptor(key, cfg); + var ciphertext = encryptor.finalize(message); + + // Shortcut + var cipherCfg = encryptor.cfg; + + // Create and return serializable cipher params + return CipherParams.create({ + ciphertext: ciphertext, + key: key, + iv: cipherCfg.iv, + algorithm: cipher, + mode: cipherCfg.mode, + padding: cipherCfg.padding, + blockSize: cipher.blockSize, + formatter: cfg.format + }); + }, + + /** + * Decrypts serialized ciphertext. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {CipherParams|string} ciphertext The ciphertext to decrypt. + * @param {WordArray} key The key. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {WordArray} The plaintext. + * + * @static + * + * @example + * + * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL }); + */ + decrypt: function (cipher, ciphertext, key, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Convert string to CipherParams + ciphertext = this._parse(ciphertext, cfg.format); + + // Decrypt + var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext); + + return plaintext; + }, + + /** + * Converts serialized ciphertext to CipherParams, + * else assumed CipherParams already and returns ciphertext unchanged. + * + * @param {CipherParams|string} ciphertext The ciphertext. + * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext. + * + * @return {CipherParams} The unserialized ciphertext. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format); + */ + _parse: function (ciphertext, format) { + if (typeof ciphertext == 'string') { + return format.parse(ciphertext, this); + } else { + return ciphertext; + } + } + }); + + /** + * Key derivation function namespace. + */ + var C_kdf = C.kdf = {}; + + /** + * OpenSSL key derivation function. + */ + var OpenSSLKdf = C_kdf.OpenSSL = { + /** + * Derives a key and IV from a password. + * + * @param {string} password The password to derive from. + * @param {number} keySize The size in words of the key to generate. + * @param {number} ivSize The size in words of the IV to generate. + * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly. + * + * @return {CipherParams} A cipher params object with the key, IV, and salt. + * + * @static + * + * @example + * + * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32); + * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt'); + */ + execute: function (password, keySize, ivSize, salt) { + // Generate random salt + if (!salt) { + salt = WordArray.random(64/8); + } + + // Derive key and IV + var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt); + + // Separate key and IV + var iv = WordArray.create(key.words.slice(keySize), ivSize * 4); + key.sigBytes = keySize * 4; + + // Return params + return CipherParams.create({ key: key, iv: iv, salt: salt }); + } + }; + + /** + * A serializable cipher wrapper that derives the key from a password, + * and returns ciphertext as a serializable cipher params object. + */ + var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({ + /** + * Configuration options. + * + * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL + */ + cfg: SerializableCipher.cfg.extend({ + kdf: OpenSSLKdf + }), + + /** + * Encrypts a message using a password. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {WordArray|string} message The message to encrypt. + * @param {string} password The password. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {CipherParams} A cipher params object. + * + * @static + * + * @example + * + * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password'); + * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL }); + */ + encrypt: function (cipher, message, password, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Derive key and other params + var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize); + + // Add IV to config + cfg.iv = derivedParams.iv; + + // Encrypt + var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg); + + // Mix in derived params + ciphertext.mixIn(derivedParams); + + return ciphertext; + }, + + /** + * Decrypts serialized ciphertext using a password. + * + * @param {Cipher} cipher The cipher algorithm to use. + * @param {CipherParams|string} ciphertext The ciphertext to decrypt. + * @param {string} password The password. + * @param {Object} cfg (Optional) The configuration options to use for this operation. + * + * @return {WordArray} The plaintext. + * + * @static + * + * @example + * + * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL }); + * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL }); + */ + decrypt: function (cipher, ciphertext, password, cfg) { + // Apply config defaults + cfg = this.cfg.extend(cfg); + + // Convert string to CipherParams + ciphertext = this._parse(ciphertext, cfg.format); + + // Derive key and other params + var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt); + + // Add IV to config + cfg.iv = derivedParams.iv; + + // Decrypt + var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg); + + return plaintext; + } + }); + }()); + + + /** + * Cipher Feedback block mode. + */ + CryptoJS.mode.CFB = (function () { + var CFB = CryptoJS.lib.BlockCipherMode.extend(); + + CFB.Encryptor = CFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); + + // Remember this block to use with next block + this._prevBlock = words.slice(offset, offset + blockSize); + } + }); + + CFB.Decryptor = CFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher; + var blockSize = cipher.blockSize; + + // Remember this block to use with next block + var thisBlock = words.slice(offset, offset + blockSize); + + generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher); + + // This block becomes the previous block + this._prevBlock = thisBlock; + } + }); + + function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) { + // Shortcut + var iv = this._iv; + + // Generate keystream + if (iv) { + var keystream = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } else { + var keystream = this._prevBlock; + } + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + + return CFB; + }()); + + + /** + * Electronic Codebook block mode. + */ + CryptoJS.mode.ECB = (function () { + var ECB = CryptoJS.lib.BlockCipherMode.extend(); + + ECB.Encryptor = ECB.extend({ + processBlock: function (words, offset) { + this._cipher.encryptBlock(words, offset); + } + }); + + ECB.Decryptor = ECB.extend({ + processBlock: function (words, offset) { + this._cipher.decryptBlock(words, offset); + } + }); + + return ECB; + }()); + + + /** + * ANSI X.923 padding strategy. + */ + CryptoJS.pad.AnsiX923 = { + pad: function (data, blockSize) { + // Shortcuts + var dataSigBytes = data.sigBytes; + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes; + + // Compute last byte position + var lastBytePos = dataSigBytes + nPaddingBytes - 1; + + // Pad + data.clamp(); + data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8); + data.sigBytes += nPaddingBytes; + }, + + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + + /** + * ISO 10126 padding strategy. + */ + CryptoJS.pad.Iso10126 = { + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Count padding bytes + var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes; + + // Pad + data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)). + concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1)); + }, + + unpad: function (data) { + // Get number of padding bytes from last byte + var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff; + + // Remove padding + data.sigBytes -= nPaddingBytes; + } + }; + + + /** + * ISO/IEC 9797-1 Padding Method 2. + */ + CryptoJS.pad.Iso97971 = { + pad: function (data, blockSize) { + // Add 0x80 byte + data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1)); + + // Zero pad the rest + CryptoJS.pad.ZeroPadding.pad(data, blockSize); + }, + + unpad: function (data) { + // Remove zero padding + CryptoJS.pad.ZeroPadding.unpad(data); + + // Remove one more byte -- the 0x80 byte + data.sigBytes--; + } + }; + + + /** + * Output Feedback block mode. + */ + CryptoJS.mode.OFB = (function () { + var OFB = CryptoJS.lib.BlockCipherMode.extend(); + + var Encryptor = OFB.Encryptor = OFB.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var keystream = this._keystream; + + // Generate keystream + if (iv) { + keystream = this._keystream = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + OFB.Decryptor = Encryptor; + + return OFB; + }()); + + + /** + * A noop padding strategy. + */ + CryptoJS.pad.NoPadding = { + pad: function () { + }, + + unpad: function () { + } + }; + + + (function (undefined) { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var CipherParams = C_lib.CipherParams; + var C_enc = C.enc; + var Hex = C_enc.Hex; + var C_format = C.format; + + var HexFormatter = C_format.Hex = { + /** + * Converts the ciphertext of a cipher params object to a hexadecimally encoded string. + * + * @param {CipherParams} cipherParams The cipher params object. + * + * @return {string} The hexadecimally encoded string. + * + * @static + * + * @example + * + * var hexString = CryptoJS.format.Hex.stringify(cipherParams); + */ + stringify: function (cipherParams) { + return cipherParams.ciphertext.toString(Hex); + }, + + /** + * Converts a hexadecimally encoded ciphertext string to a cipher params object. + * + * @param {string} input The hexadecimally encoded string. + * + * @return {CipherParams} The cipher params object. + * + * @static + * + * @example + * + * var cipherParams = CryptoJS.format.Hex.parse(hexString); + */ + parse: function (input) { + var ciphertext = Hex.parse(input); + return CipherParams.create({ ciphertext: ciphertext }); + } + }; + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var BlockCipher = C_lib.BlockCipher; + var C_algo = C.algo; + + // Lookup tables + var SBOX = []; + var INV_SBOX = []; + var SUB_MIX_0 = []; + var SUB_MIX_1 = []; + var SUB_MIX_2 = []; + var SUB_MIX_3 = []; + var INV_SUB_MIX_0 = []; + var INV_SUB_MIX_1 = []; + var INV_SUB_MIX_2 = []; + var INV_SUB_MIX_3 = []; + + // Compute lookup tables + (function () { + // Compute double table + var d = []; + for (var i = 0; i < 256; i++) { + if (i < 128) { + d[i] = i << 1; + } else { + d[i] = (i << 1) ^ 0x11b; + } + } + + // Walk GF(2^8) + var x = 0; + var xi = 0; + for (var i = 0; i < 256; i++) { + // Compute sbox + var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4); + sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63; + SBOX[x] = sx; + INV_SBOX[sx] = x; + + // Compute multiplication + var x2 = d[x]; + var x4 = d[x2]; + var x8 = d[x4]; + + // Compute sub bytes, mix columns tables + var t = (d[sx] * 0x101) ^ (sx * 0x1010100); + SUB_MIX_0[x] = (t << 24) | (t >>> 8); + SUB_MIX_1[x] = (t << 16) | (t >>> 16); + SUB_MIX_2[x] = (t << 8) | (t >>> 24); + SUB_MIX_3[x] = t; + + // Compute inv sub bytes, inv mix columns tables + var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100); + INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8); + INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16); + INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24); + INV_SUB_MIX_3[sx] = t; + + // Compute next counter + if (!x) { + x = xi = 1; + } else { + x = x2 ^ d[d[d[x8 ^ x2]]]; + xi ^= d[d[xi]]; + } + } + }()); + + // Precomputed Rcon lookup + var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36]; + + /** + * AES block cipher algorithm. + */ + var AES = C_algo.AES = BlockCipher.extend({ + _doReset: function () { + // Skip reset of nRounds has been set before and key did not change + if (this._nRounds && this._keyPriorReset === this._key) { + return; + } + + // Shortcuts + var key = this._keyPriorReset = this._key; + var keyWords = key.words; + var keySize = key.sigBytes / 4; + + // Compute number of rounds + var nRounds = this._nRounds = keySize + 6; + + // Compute number of key schedule rows + var ksRows = (nRounds + 1) * 4; + + // Compute key schedule + var keySchedule = this._keySchedule = []; + for (var ksRow = 0; ksRow < ksRows; ksRow++) { + if (ksRow < keySize) { + keySchedule[ksRow] = keyWords[ksRow]; + } else { + var t = keySchedule[ksRow - 1]; + + if (!(ksRow % keySize)) { + // Rot word + t = (t << 8) | (t >>> 24); + + // Sub word + t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; + + // Mix Rcon + t ^= RCON[(ksRow / keySize) | 0] << 24; + } else if (keySize > 6 && ksRow % keySize == 4) { + // Sub word + t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; + } + + keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t; + } + } + + // Compute inv key schedule + var invKeySchedule = this._invKeySchedule = []; + for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) { + var ksRow = ksRows - invKsRow; + + if (invKsRow % 4) { + var t = keySchedule[ksRow]; + } else { + var t = keySchedule[ksRow - 4]; + } + + if (invKsRow < 4 || ksRow <= 4) { + invKeySchedule[invKsRow] = t; + } else { + invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^ + INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]]; + } + } + }, + + encryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX); + }, + + decryptBlock: function (M, offset) { + // Swap 2nd and 4th rows + var t = M[offset + 1]; + M[offset + 1] = M[offset + 3]; + M[offset + 3] = t; + + this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX); + + // Inv swap 2nd and 4th rows + var t = M[offset + 1]; + M[offset + 1] = M[offset + 3]; + M[offset + 3] = t; + }, + + _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) { + // Shortcut + var nRounds = this._nRounds; + + // Get input, add round key + var s0 = M[offset] ^ keySchedule[0]; + var s1 = M[offset + 1] ^ keySchedule[1]; + var s2 = M[offset + 2] ^ keySchedule[2]; + var s3 = M[offset + 3] ^ keySchedule[3]; + + // Key schedule row counter + var ksRow = 4; + + // Rounds + for (var round = 1; round < nRounds; round++) { + // Shift rows, sub bytes, mix columns, add round key + var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++]; + var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++]; + var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++]; + var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++]; + + // Update state + s0 = t0; + s1 = t1; + s2 = t2; + s3 = t3; + } + + // Shift rows, sub bytes, add round key + var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++]; + var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++]; + var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++]; + var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++]; + + // Set output + M[offset] = t0; + M[offset + 1] = t1; + M[offset + 2] = t2; + M[offset + 3] = t3; + }, + + keySize: 256/32 + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg); + */ + C.AES = BlockCipher._createHelper(AES); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var WordArray = C_lib.WordArray; + var BlockCipher = C_lib.BlockCipher; + var C_algo = C.algo; + + // Permuted Choice 1 constants + var PC1 = [ + 57, 49, 41, 33, 25, 17, 9, 1, + 58, 50, 42, 34, 26, 18, 10, 2, + 59, 51, 43, 35, 27, 19, 11, 3, + 60, 52, 44, 36, 63, 55, 47, 39, + 31, 23, 15, 7, 62, 54, 46, 38, + 30, 22, 14, 6, 61, 53, 45, 37, + 29, 21, 13, 5, 28, 20, 12, 4 + ]; + + // Permuted Choice 2 constants + var PC2 = [ + 14, 17, 11, 24, 1, 5, + 3, 28, 15, 6, 21, 10, + 23, 19, 12, 4, 26, 8, + 16, 7, 27, 20, 13, 2, + 41, 52, 31, 37, 47, 55, + 30, 40, 51, 45, 33, 48, + 44, 49, 39, 56, 34, 53, + 46, 42, 50, 36, 29, 32 + ]; + + // Cumulative bit shift constants + var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28]; + + // SBOXes and round permutation constants + var SBOX_P = [ + { + 0x0: 0x808200, + 0x10000000: 0x8000, + 0x20000000: 0x808002, + 0x30000000: 0x2, + 0x40000000: 0x200, + 0x50000000: 0x808202, + 0x60000000: 0x800202, + 0x70000000: 0x800000, + 0x80000000: 0x202, + 0x90000000: 0x800200, + 0xa0000000: 0x8200, + 0xb0000000: 0x808000, + 0xc0000000: 0x8002, + 0xd0000000: 0x800002, + 0xe0000000: 0x0, + 0xf0000000: 0x8202, + 0x8000000: 0x0, + 0x18000000: 0x808202, + 0x28000000: 0x8202, + 0x38000000: 0x8000, + 0x48000000: 0x808200, + 0x58000000: 0x200, + 0x68000000: 0x808002, + 0x78000000: 0x2, + 0x88000000: 0x800200, + 0x98000000: 0x8200, + 0xa8000000: 0x808000, + 0xb8000000: 0x800202, + 0xc8000000: 0x800002, + 0xd8000000: 0x8002, + 0xe8000000: 0x202, + 0xf8000000: 0x800000, + 0x1: 0x8000, + 0x10000001: 0x2, + 0x20000001: 0x808200, + 0x30000001: 0x800000, + 0x40000001: 0x808002, + 0x50000001: 0x8200, + 0x60000001: 0x200, + 0x70000001: 0x800202, + 0x80000001: 0x808202, + 0x90000001: 0x808000, + 0xa0000001: 0x800002, + 0xb0000001: 0x8202, + 0xc0000001: 0x202, + 0xd0000001: 0x800200, + 0xe0000001: 0x8002, + 0xf0000001: 0x0, + 0x8000001: 0x808202, + 0x18000001: 0x808000, + 0x28000001: 0x800000, + 0x38000001: 0x200, + 0x48000001: 0x8000, + 0x58000001: 0x800002, + 0x68000001: 0x2, + 0x78000001: 0x8202, + 0x88000001: 0x8002, + 0x98000001: 0x800202, + 0xa8000001: 0x202, + 0xb8000001: 0x808200, + 0xc8000001: 0x800200, + 0xd8000001: 0x0, + 0xe8000001: 0x8200, + 0xf8000001: 0x808002 + }, + { + 0x0: 0x40084010, + 0x1000000: 0x4000, + 0x2000000: 0x80000, + 0x3000000: 0x40080010, + 0x4000000: 0x40000010, + 0x5000000: 0x40084000, + 0x6000000: 0x40004000, + 0x7000000: 0x10, + 0x8000000: 0x84000, + 0x9000000: 0x40004010, + 0xa000000: 0x40000000, + 0xb000000: 0x84010, + 0xc000000: 0x80010, + 0xd000000: 0x0, + 0xe000000: 0x4010, + 0xf000000: 0x40080000, + 0x800000: 0x40004000, + 0x1800000: 0x84010, + 0x2800000: 0x10, + 0x3800000: 0x40004010, + 0x4800000: 0x40084010, + 0x5800000: 0x40000000, + 0x6800000: 0x80000, + 0x7800000: 0x40080010, + 0x8800000: 0x80010, + 0x9800000: 0x0, + 0xa800000: 0x4000, + 0xb800000: 0x40080000, + 0xc800000: 0x40000010, + 0xd800000: 0x84000, + 0xe800000: 0x40084000, + 0xf800000: 0x4010, + 0x10000000: 0x0, + 0x11000000: 0x40080010, + 0x12000000: 0x40004010, + 0x13000000: 0x40084000, + 0x14000000: 0x40080000, + 0x15000000: 0x10, + 0x16000000: 0x84010, + 0x17000000: 0x4000, + 0x18000000: 0x4010, + 0x19000000: 0x80000, + 0x1a000000: 0x80010, + 0x1b000000: 0x40000010, + 0x1c000000: 0x84000, + 0x1d000000: 0x40004000, + 0x1e000000: 0x40000000, + 0x1f000000: 0x40084010, + 0x10800000: 0x84010, + 0x11800000: 0x80000, + 0x12800000: 0x40080000, + 0x13800000: 0x4000, + 0x14800000: 0x40004000, + 0x15800000: 0x40084010, + 0x16800000: 0x10, + 0x17800000: 0x40000000, + 0x18800000: 0x40084000, + 0x19800000: 0x40000010, + 0x1a800000: 0x40004010, + 0x1b800000: 0x80010, + 0x1c800000: 0x0, + 0x1d800000: 0x4010, + 0x1e800000: 0x40080010, + 0x1f800000: 0x84000 + }, + { + 0x0: 0x104, + 0x100000: 0x0, + 0x200000: 0x4000100, + 0x300000: 0x10104, + 0x400000: 0x10004, + 0x500000: 0x4000004, + 0x600000: 0x4010104, + 0x700000: 0x4010000, + 0x800000: 0x4000000, + 0x900000: 0x4010100, + 0xa00000: 0x10100, + 0xb00000: 0x4010004, + 0xc00000: 0x4000104, + 0xd00000: 0x10000, + 0xe00000: 0x4, + 0xf00000: 0x100, + 0x80000: 0x4010100, + 0x180000: 0x4010004, + 0x280000: 0x0, + 0x380000: 0x4000100, + 0x480000: 0x4000004, + 0x580000: 0x10000, + 0x680000: 0x10004, + 0x780000: 0x104, + 0x880000: 0x4, + 0x980000: 0x100, + 0xa80000: 0x4010000, + 0xb80000: 0x10104, + 0xc80000: 0x10100, + 0xd80000: 0x4000104, + 0xe80000: 0x4010104, + 0xf80000: 0x4000000, + 0x1000000: 0x4010100, + 0x1100000: 0x10004, + 0x1200000: 0x10000, + 0x1300000: 0x4000100, + 0x1400000: 0x100, + 0x1500000: 0x4010104, + 0x1600000: 0x4000004, + 0x1700000: 0x0, + 0x1800000: 0x4000104, + 0x1900000: 0x4000000, + 0x1a00000: 0x4, + 0x1b00000: 0x10100, + 0x1c00000: 0x4010000, + 0x1d00000: 0x104, + 0x1e00000: 0x10104, + 0x1f00000: 0x4010004, + 0x1080000: 0x4000000, + 0x1180000: 0x104, + 0x1280000: 0x4010100, + 0x1380000: 0x0, + 0x1480000: 0x10004, + 0x1580000: 0x4000100, + 0x1680000: 0x100, + 0x1780000: 0x4010004, + 0x1880000: 0x10000, + 0x1980000: 0x4010104, + 0x1a80000: 0x10104, + 0x1b80000: 0x4000004, + 0x1c80000: 0x4000104, + 0x1d80000: 0x4010000, + 0x1e80000: 0x4, + 0x1f80000: 0x10100 + }, + { + 0x0: 0x80401000, + 0x10000: 0x80001040, + 0x20000: 0x401040, + 0x30000: 0x80400000, + 0x40000: 0x0, + 0x50000: 0x401000, + 0x60000: 0x80000040, + 0x70000: 0x400040, + 0x80000: 0x80000000, + 0x90000: 0x400000, + 0xa0000: 0x40, + 0xb0000: 0x80001000, + 0xc0000: 0x80400040, + 0xd0000: 0x1040, + 0xe0000: 0x1000, + 0xf0000: 0x80401040, + 0x8000: 0x80001040, + 0x18000: 0x40, + 0x28000: 0x80400040, + 0x38000: 0x80001000, + 0x48000: 0x401000, + 0x58000: 0x80401040, + 0x68000: 0x0, + 0x78000: 0x80400000, + 0x88000: 0x1000, + 0x98000: 0x80401000, + 0xa8000: 0x400000, + 0xb8000: 0x1040, + 0xc8000: 0x80000000, + 0xd8000: 0x400040, + 0xe8000: 0x401040, + 0xf8000: 0x80000040, + 0x100000: 0x400040, + 0x110000: 0x401000, + 0x120000: 0x80000040, + 0x130000: 0x0, + 0x140000: 0x1040, + 0x150000: 0x80400040, + 0x160000: 0x80401000, + 0x170000: 0x80001040, + 0x180000: 0x80401040, + 0x190000: 0x80000000, + 0x1a0000: 0x80400000, + 0x1b0000: 0x401040, + 0x1c0000: 0x80001000, + 0x1d0000: 0x400000, + 0x1e0000: 0x40, + 0x1f0000: 0x1000, + 0x108000: 0x80400000, + 0x118000: 0x80401040, + 0x128000: 0x0, + 0x138000: 0x401000, + 0x148000: 0x400040, + 0x158000: 0x80000000, + 0x168000: 0x80001040, + 0x178000: 0x40, + 0x188000: 0x80000040, + 0x198000: 0x1000, + 0x1a8000: 0x80001000, + 0x1b8000: 0x80400040, + 0x1c8000: 0x1040, + 0x1d8000: 0x80401000, + 0x1e8000: 0x400000, + 0x1f8000: 0x401040 + }, + { + 0x0: 0x80, + 0x1000: 0x1040000, + 0x2000: 0x40000, + 0x3000: 0x20000000, + 0x4000: 0x20040080, + 0x5000: 0x1000080, + 0x6000: 0x21000080, + 0x7000: 0x40080, + 0x8000: 0x1000000, + 0x9000: 0x20040000, + 0xa000: 0x20000080, + 0xb000: 0x21040080, + 0xc000: 0x21040000, + 0xd000: 0x0, + 0xe000: 0x1040080, + 0xf000: 0x21000000, + 0x800: 0x1040080, + 0x1800: 0x21000080, + 0x2800: 0x80, + 0x3800: 0x1040000, + 0x4800: 0x40000, + 0x5800: 0x20040080, + 0x6800: 0x21040000, + 0x7800: 0x20000000, + 0x8800: 0x20040000, + 0x9800: 0x0, + 0xa800: 0x21040080, + 0xb800: 0x1000080, + 0xc800: 0x20000080, + 0xd800: 0x21000000, + 0xe800: 0x1000000, + 0xf800: 0x40080, + 0x10000: 0x40000, + 0x11000: 0x80, + 0x12000: 0x20000000, + 0x13000: 0x21000080, + 0x14000: 0x1000080, + 0x15000: 0x21040000, + 0x16000: 0x20040080, + 0x17000: 0x1000000, + 0x18000: 0x21040080, + 0x19000: 0x21000000, + 0x1a000: 0x1040000, + 0x1b000: 0x20040000, + 0x1c000: 0x40080, + 0x1d000: 0x20000080, + 0x1e000: 0x0, + 0x1f000: 0x1040080, + 0x10800: 0x21000080, + 0x11800: 0x1000000, + 0x12800: 0x1040000, + 0x13800: 0x20040080, + 0x14800: 0x20000000, + 0x15800: 0x1040080, + 0x16800: 0x80, + 0x17800: 0x21040000, + 0x18800: 0x40080, + 0x19800: 0x21040080, + 0x1a800: 0x0, + 0x1b800: 0x21000000, + 0x1c800: 0x1000080, + 0x1d800: 0x40000, + 0x1e800: 0x20040000, + 0x1f800: 0x20000080 + }, + { + 0x0: 0x10000008, + 0x100: 0x2000, + 0x200: 0x10200000, + 0x300: 0x10202008, + 0x400: 0x10002000, + 0x500: 0x200000, + 0x600: 0x200008, + 0x700: 0x10000000, + 0x800: 0x0, + 0x900: 0x10002008, + 0xa00: 0x202000, + 0xb00: 0x8, + 0xc00: 0x10200008, + 0xd00: 0x202008, + 0xe00: 0x2008, + 0xf00: 0x10202000, + 0x80: 0x10200000, + 0x180: 0x10202008, + 0x280: 0x8, + 0x380: 0x200000, + 0x480: 0x202008, + 0x580: 0x10000008, + 0x680: 0x10002000, + 0x780: 0x2008, + 0x880: 0x200008, + 0x980: 0x2000, + 0xa80: 0x10002008, + 0xb80: 0x10200008, + 0xc80: 0x0, + 0xd80: 0x10202000, + 0xe80: 0x202000, + 0xf80: 0x10000000, + 0x1000: 0x10002000, + 0x1100: 0x10200008, + 0x1200: 0x10202008, + 0x1300: 0x2008, + 0x1400: 0x200000, + 0x1500: 0x10000000, + 0x1600: 0x10000008, + 0x1700: 0x202000, + 0x1800: 0x202008, + 0x1900: 0x0, + 0x1a00: 0x8, + 0x1b00: 0x10200000, + 0x1c00: 0x2000, + 0x1d00: 0x10002008, + 0x1e00: 0x10202000, + 0x1f00: 0x200008, + 0x1080: 0x8, + 0x1180: 0x202000, + 0x1280: 0x200000, + 0x1380: 0x10000008, + 0x1480: 0x10002000, + 0x1580: 0x2008, + 0x1680: 0x10202008, + 0x1780: 0x10200000, + 0x1880: 0x10202000, + 0x1980: 0x10200008, + 0x1a80: 0x2000, + 0x1b80: 0x202008, + 0x1c80: 0x200008, + 0x1d80: 0x0, + 0x1e80: 0x10000000, + 0x1f80: 0x10002008 + }, + { + 0x0: 0x100000, + 0x10: 0x2000401, + 0x20: 0x400, + 0x30: 0x100401, + 0x40: 0x2100401, + 0x50: 0x0, + 0x60: 0x1, + 0x70: 0x2100001, + 0x80: 0x2000400, + 0x90: 0x100001, + 0xa0: 0x2000001, + 0xb0: 0x2100400, + 0xc0: 0x2100000, + 0xd0: 0x401, + 0xe0: 0x100400, + 0xf0: 0x2000000, + 0x8: 0x2100001, + 0x18: 0x0, + 0x28: 0x2000401, + 0x38: 0x2100400, + 0x48: 0x100000, + 0x58: 0x2000001, + 0x68: 0x2000000, + 0x78: 0x401, + 0x88: 0x100401, + 0x98: 0x2000400, + 0xa8: 0x2100000, + 0xb8: 0x100001, + 0xc8: 0x400, + 0xd8: 0x2100401, + 0xe8: 0x1, + 0xf8: 0x100400, + 0x100: 0x2000000, + 0x110: 0x100000, + 0x120: 0x2000401, + 0x130: 0x2100001, + 0x140: 0x100001, + 0x150: 0x2000400, + 0x160: 0x2100400, + 0x170: 0x100401, + 0x180: 0x401, + 0x190: 0x2100401, + 0x1a0: 0x100400, + 0x1b0: 0x1, + 0x1c0: 0x0, + 0x1d0: 0x2100000, + 0x1e0: 0x2000001, + 0x1f0: 0x400, + 0x108: 0x100400, + 0x118: 0x2000401, + 0x128: 0x2100001, + 0x138: 0x1, + 0x148: 0x2000000, + 0x158: 0x100000, + 0x168: 0x401, + 0x178: 0x2100400, + 0x188: 0x2000001, + 0x198: 0x2100000, + 0x1a8: 0x0, + 0x1b8: 0x2100401, + 0x1c8: 0x100401, + 0x1d8: 0x400, + 0x1e8: 0x2000400, + 0x1f8: 0x100001 + }, + { + 0x0: 0x8000820, + 0x1: 0x20000, + 0x2: 0x8000000, + 0x3: 0x20, + 0x4: 0x20020, + 0x5: 0x8020820, + 0x6: 0x8020800, + 0x7: 0x800, + 0x8: 0x8020000, + 0x9: 0x8000800, + 0xa: 0x20800, + 0xb: 0x8020020, + 0xc: 0x820, + 0xd: 0x0, + 0xe: 0x8000020, + 0xf: 0x20820, + 0x80000000: 0x800, + 0x80000001: 0x8020820, + 0x80000002: 0x8000820, + 0x80000003: 0x8000000, + 0x80000004: 0x8020000, + 0x80000005: 0x20800, + 0x80000006: 0x20820, + 0x80000007: 0x20, + 0x80000008: 0x8000020, + 0x80000009: 0x820, + 0x8000000a: 0x20020, + 0x8000000b: 0x8020800, + 0x8000000c: 0x0, + 0x8000000d: 0x8020020, + 0x8000000e: 0x8000800, + 0x8000000f: 0x20000, + 0x10: 0x20820, + 0x11: 0x8020800, + 0x12: 0x20, + 0x13: 0x800, + 0x14: 0x8000800, + 0x15: 0x8000020, + 0x16: 0x8020020, + 0x17: 0x20000, + 0x18: 0x0, + 0x19: 0x20020, + 0x1a: 0x8020000, + 0x1b: 0x8000820, + 0x1c: 0x8020820, + 0x1d: 0x20800, + 0x1e: 0x820, + 0x1f: 0x8000000, + 0x80000010: 0x20000, + 0x80000011: 0x800, + 0x80000012: 0x8020020, + 0x80000013: 0x20820, + 0x80000014: 0x20, + 0x80000015: 0x8020000, + 0x80000016: 0x8000000, + 0x80000017: 0x8000820, + 0x80000018: 0x8020820, + 0x80000019: 0x8000020, + 0x8000001a: 0x8000800, + 0x8000001b: 0x0, + 0x8000001c: 0x20800, + 0x8000001d: 0x820, + 0x8000001e: 0x20020, + 0x8000001f: 0x8020800 + } + ]; + + // Masks that select the SBOX input + var SBOX_MASK = [ + 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000, + 0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f + ]; + + /** + * DES block cipher algorithm. + */ + var DES = C_algo.DES = BlockCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + + // Select 56 bits according to PC1 + var keyBits = []; + for (var i = 0; i < 56; i++) { + var keyBitPos = PC1[i] - 1; + keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1; + } + + // Assemble 16 subkeys + var subKeys = this._subKeys = []; + for (var nSubKey = 0; nSubKey < 16; nSubKey++) { + // Create subkey + var subKey = subKeys[nSubKey] = []; + + // Shortcut + var bitShift = BIT_SHIFTS[nSubKey]; + + // Select 48 bits according to PC2 + for (var i = 0; i < 24; i++) { + // Select from the left 28 key bits + subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6); + + // Select from the right 28 key bits + subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6); + } + + // Since each subkey is applied to an expanded 32-bit input, + // the subkey can be broken into 8 values scaled to 32-bits, + // which allows the key to be used without expansion + subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31); + for (var i = 1; i < 7; i++) { + subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3); + } + subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27); + } + + // Compute inverse subkeys + var invSubKeys = this._invSubKeys = []; + for (var i = 0; i < 16; i++) { + invSubKeys[i] = subKeys[15 - i]; + } + }, + + encryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._subKeys); + }, + + decryptBlock: function (M, offset) { + this._doCryptBlock(M, offset, this._invSubKeys); + }, + + _doCryptBlock: function (M, offset, subKeys) { + // Get input + this._lBlock = M[offset]; + this._rBlock = M[offset + 1]; + + // Initial permutation + exchangeLR.call(this, 4, 0x0f0f0f0f); + exchangeLR.call(this, 16, 0x0000ffff); + exchangeRL.call(this, 2, 0x33333333); + exchangeRL.call(this, 8, 0x00ff00ff); + exchangeLR.call(this, 1, 0x55555555); + + // Rounds + for (var round = 0; round < 16; round++) { + // Shortcuts + var subKey = subKeys[round]; + var lBlock = this._lBlock; + var rBlock = this._rBlock; + + // Feistel function + var f = 0; + for (var i = 0; i < 8; i++) { + f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0]; + } + this._lBlock = rBlock; + this._rBlock = lBlock ^ f; + } + + // Undo swap from last round + var t = this._lBlock; + this._lBlock = this._rBlock; + this._rBlock = t; + + // Final permutation + exchangeLR.call(this, 1, 0x55555555); + exchangeRL.call(this, 8, 0x00ff00ff); + exchangeRL.call(this, 2, 0x33333333); + exchangeLR.call(this, 16, 0x0000ffff); + exchangeLR.call(this, 4, 0x0f0f0f0f); + + // Set output + M[offset] = this._lBlock; + M[offset + 1] = this._rBlock; + }, + + keySize: 64/32, + + ivSize: 64/32, + + blockSize: 64/32 + }); + + // Swap bits across the left and right words + function exchangeLR(offset, mask) { + var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask; + this._rBlock ^= t; + this._lBlock ^= t << offset; + } + + function exchangeRL(offset, mask) { + var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask; + this._lBlock ^= t; + this._rBlock ^= t << offset; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.DES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg); + */ + C.DES = BlockCipher._createHelper(DES); + + /** + * Triple-DES block cipher algorithm. + */ + var TripleDES = C_algo.TripleDES = BlockCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + + // Create DES instances + this._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(0, 2))); + this._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(2, 4))); + this._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(4, 6))); + }, + + encryptBlock: function (M, offset) { + this._des1.encryptBlock(M, offset); + this._des2.decryptBlock(M, offset); + this._des3.encryptBlock(M, offset); + }, + + decryptBlock: function (M, offset) { + this._des3.decryptBlock(M, offset); + this._des2.encryptBlock(M, offset); + this._des1.decryptBlock(M, offset); + }, + + keySize: 192/32, + + ivSize: 64/32, + + blockSize: 64/32 + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg); + * var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg); + */ + C.TripleDES = BlockCipher._createHelper(TripleDES); + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + /** + * RC4 stream cipher algorithm. + */ + var RC4 = C_algo.RC4 = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var key = this._key; + var keyWords = key.words; + var keySigBytes = key.sigBytes; + + // Init sbox + var S = this._S = []; + for (var i = 0; i < 256; i++) { + S[i] = i; + } + + // Key setup + for (var i = 0, j = 0; i < 256; i++) { + var keyByteIndex = i % keySigBytes; + var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff; + + j = (j + S[i] + keyByte) % 256; + + // Swap + var t = S[i]; + S[i] = S[j]; + S[j] = t; + } + + // Counters + this._i = this._j = 0; + }, + + _doProcessBlock: function (M, offset) { + M[offset] ^= generateKeystreamWord.call(this); + }, + + keySize: 256/32, + + ivSize: 0 + }); + + function generateKeystreamWord() { + // Shortcuts + var S = this._S; + var i = this._i; + var j = this._j; + + // Generate keystream word + var keystreamWord = 0; + for (var n = 0; n < 4; n++) { + i = (i + 1) % 256; + j = (j + S[i]) % 256; + + // Swap + var t = S[i]; + S[i] = S[j]; + S[j] = t; + + keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8); + } + + // Update counters + this._i = i; + this._j = j; + + return keystreamWord; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg); + */ + C.RC4 = StreamCipher._createHelper(RC4); + + /** + * Modified RC4 stream cipher algorithm. + */ + var RC4Drop = C_algo.RC4Drop = RC4.extend({ + /** + * Configuration options. + * + * @property {number} drop The number of keystream words to drop. Default 192 + */ + cfg: RC4.cfg.extend({ + drop: 192 + }), + + _doReset: function () { + RC4._doReset.call(this); + + // Drop + for (var i = this.cfg.drop; i > 0; i--) { + generateKeystreamWord.call(this); + } + } + }); + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg); + */ + C.RC4Drop = StreamCipher._createHelper(RC4Drop); + }()); + + + /** @preserve + * Counter block mode compatible with Dr Brian Gladman fileenc.c + * derived from CryptoJS.mode.CTR + * Jan Hruby jhruby.web@gmail.com + */ + CryptoJS.mode.CTRGladman = (function () { + var CTRGladman = CryptoJS.lib.BlockCipherMode.extend(); + + function incWord(word) + { + if (((word >> 24) & 0xff) === 0xff) { //overflow + var b1 = (word >> 16)&0xff; + var b2 = (word >> 8)&0xff; + var b3 = word & 0xff; + + if (b1 === 0xff) // overflow b1 + { + b1 = 0; + if (b2 === 0xff) + { + b2 = 0; + if (b3 === 0xff) + { + b3 = 0; + } + else + { + ++b3; + } + } + else + { + ++b2; + } + } + else + { + ++b1; + } + + word = 0; + word += (b1 << 16); + word += (b2 << 8); + word += b3; + } + else + { + word += (0x01 << 24); + } + return word; + } + + function incCounter(counter) + { + if ((counter[0] = incWord(counter[0])) === 0) + { + // encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8 + counter[1] = incWord(counter[1]); + } + return counter; + } + + var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var counter = this._counter; + + // Generate keystream + if (iv) { + counter = this._counter = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + + incCounter(counter); + + var keystream = counter.slice(0); + cipher.encryptBlock(keystream, 0); + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + CTRGladman.Decryptor = Encryptor; + + return CTRGladman; + }()); + + + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + // Reusable objects + var S = []; + var C_ = []; + var G = []; + + /** + * Rabbit stream cipher algorithm + */ + var Rabbit = C_algo.Rabbit = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var K = this._key.words; + var iv = this.cfg.iv; + + // Swap endian + for (var i = 0; i < 4; i++) { + K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff) | + (((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00); + } + + // Generate initial state values + var X = this._X = [ + K[0], (K[3] << 16) | (K[2] >>> 16), + K[1], (K[0] << 16) | (K[3] >>> 16), + K[2], (K[1] << 16) | (K[0] >>> 16), + K[3], (K[2] << 16) | (K[1] >>> 16) + ]; + + // Generate initial counter values + var C = this._C = [ + (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), + (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), + (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), + (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) + ]; + + // Carry bit + this._b = 0; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + + // Modify the counters + for (var i = 0; i < 8; i++) { + C[i] ^= X[(i + 4) & 7]; + } + + // IV setup + if (iv) { + // Shortcuts + var IV = iv.words; + var IV_0 = IV[0]; + var IV_1 = IV[1]; + + // Generate four subvectors + var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); + var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); + var i1 = (i0 >>> 16) | (i2 & 0xffff0000); + var i3 = (i2 << 16) | (i0 & 0x0000ffff); + + // Modify counter values + C[0] ^= i0; + C[1] ^= i1; + C[2] ^= i2; + C[3] ^= i3; + C[4] ^= i0; + C[5] ^= i1; + C[6] ^= i2; + C[7] ^= i3; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + } + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var X = this._X; + + // Iterate the system + nextState.call(this); + + // Generate four keystream words + S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); + S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); + S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); + S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); + + for (var i = 0; i < 4; i++) { + // Swap endian + S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | + (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); + + // Encrypt + M[offset + i] ^= S[i]; + } + }, + + blockSize: 128/32, + + ivSize: 64/32 + }); + + function nextState() { + // Shortcuts + var X = this._X; + var C = this._C; + + // Save old counter values + for (var i = 0; i < 8; i++) { + C_[i] = C[i]; + } + + // Calculate new counter values + C[0] = (C[0] + 0x4d34d34d + this._b) | 0; + C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; + C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; + C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; + C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; + C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; + C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; + C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; + this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; + + // Calculate the g-values + for (var i = 0; i < 8; i++) { + var gx = X[i] + C[i]; + + // Construct high and low argument for squaring + var ga = gx & 0xffff; + var gb = gx >>> 16; + + // Calculate high and low result of squaring + var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; + var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); + + // High XOR low + G[i] = gh ^ gl; + } + + // Calculate new state values + X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; + X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; + X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; + X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; + X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; + X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; + X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; + X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg); + * var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg); + */ + C.Rabbit = StreamCipher._createHelper(Rabbit); + }()); + + + /** + * Counter block mode. + */ + CryptoJS.mode.CTR = (function () { + var CTR = CryptoJS.lib.BlockCipherMode.extend(); + + var Encryptor = CTR.Encryptor = CTR.extend({ + processBlock: function (words, offset) { + // Shortcuts + var cipher = this._cipher + var blockSize = cipher.blockSize; + var iv = this._iv; + var counter = this._counter; + + // Generate keystream + if (iv) { + counter = this._counter = iv.slice(0); + + // Remove IV for subsequent blocks + this._iv = undefined; + } + var keystream = counter.slice(0); + cipher.encryptBlock(keystream, 0); + + // Increment counter + counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0 + + // Encrypt + for (var i = 0; i < blockSize; i++) { + words[offset + i] ^= keystream[i]; + } + } + }); + + CTR.Decryptor = Encryptor; + + return CTR; + }()); + + + (function () { + // Shortcuts + var C = CryptoJS; + var C_lib = C.lib; + var StreamCipher = C_lib.StreamCipher; + var C_algo = C.algo; + + // Reusable objects + var S = []; + var C_ = []; + var G = []; + + /** + * Rabbit stream cipher algorithm. + * + * This is a legacy version that neglected to convert the key to little-endian. + * This error doesn't affect the cipher's security, + * but it does affect its compatibility with other implementations. + */ + var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({ + _doReset: function () { + // Shortcuts + var K = this._key.words; + var iv = this.cfg.iv; + + // Generate initial state values + var X = this._X = [ + K[0], (K[3] << 16) | (K[2] >>> 16), + K[1], (K[0] << 16) | (K[3] >>> 16), + K[2], (K[1] << 16) | (K[0] >>> 16), + K[3], (K[2] << 16) | (K[1] >>> 16) + ]; + + // Generate initial counter values + var C = this._C = [ + (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff), + (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff), + (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff), + (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff) + ]; + + // Carry bit + this._b = 0; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + + // Modify the counters + for (var i = 0; i < 8; i++) { + C[i] ^= X[(i + 4) & 7]; + } + + // IV setup + if (iv) { + // Shortcuts + var IV = iv.words; + var IV_0 = IV[0]; + var IV_1 = IV[1]; + + // Generate four subvectors + var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00); + var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00); + var i1 = (i0 >>> 16) | (i2 & 0xffff0000); + var i3 = (i2 << 16) | (i0 & 0x0000ffff); + + // Modify counter values + C[0] ^= i0; + C[1] ^= i1; + C[2] ^= i2; + C[3] ^= i3; + C[4] ^= i0; + C[5] ^= i1; + C[6] ^= i2; + C[7] ^= i3; + + // Iterate the system four times + for (var i = 0; i < 4; i++) { + nextState.call(this); + } + } + }, + + _doProcessBlock: function (M, offset) { + // Shortcut + var X = this._X; + + // Iterate the system + nextState.call(this); + + // Generate four keystream words + S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16); + S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16); + S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16); + S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16); + + for (var i = 0; i < 4; i++) { + // Swap endian + S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) | + (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00); + + // Encrypt + M[offset + i] ^= S[i]; + } + }, + + blockSize: 128/32, + + ivSize: 64/32 + }); + + function nextState() { + // Shortcuts + var X = this._X; + var C = this._C; + + // Save old counter values + for (var i = 0; i < 8; i++) { + C_[i] = C[i]; + } + + // Calculate new counter values + C[0] = (C[0] + 0x4d34d34d + this._b) | 0; + C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0; + C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0; + C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0; + C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0; + C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0; + C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0; + C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0; + this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0; + + // Calculate the g-values + for (var i = 0; i < 8; i++) { + var gx = X[i] + C[i]; + + // Construct high and low argument for squaring + var ga = gx & 0xffff; + var gb = gx >>> 16; + + // Calculate high and low result of squaring + var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb; + var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0); + + // High XOR low + G[i] = gh ^ gl; + } + + // Calculate new state values + X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0; + X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0; + X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0; + X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0; + X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0; + X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0; + X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0; + X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0; + } + + /** + * Shortcut functions to the cipher's object interface. + * + * @example + * + * var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg); + * var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg); + */ + C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy); + }()); + + + /** + * Zero padding strategy. + */ + CryptoJS.pad.ZeroPadding = { + pad: function (data, blockSize) { + // Shortcut + var blockSizeBytes = blockSize * 4; + + // Pad + data.clamp(); + data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes); + }, + + unpad: function (data) { + // Shortcut + var dataWords = data.words; + + // Unpad + var i = data.sigBytes - 1; + while (!((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) { + i--; + } + data.sigBytes = i + 1; + } + }; + + + return CryptoJS; + +})); \ No newline at end of file diff --git a/uam-server/src/main/webapp/public/assets/customer/.DS_Store b/uam-server/src/main/webapp/public/assets/customer/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 Binary files /dev/null and b/uam-server/src/main/webapp/public/assets/customer/.DS_Store differ diff --git a/uam-server/src/main/webapp/public/assets/customer/antd.min.css b/uam-server/src/main/webapp/public/assets/customer/antd.min.css new file mode 100644 index 0000000000000000000000000000000000000000..30882524968ea0068c8545bd3e15aacebd536907 --- /dev/null +++ b/uam-server/src/main/webapp/public/assets/customer/antd.min.css @@ -0,0 +1,8 @@ +/*! + * antd v2.8.1 + * + * Copyright 2015-present, Alipay, Inc. + * All rights reserved. + */ +/*! normalize.css v5.0.0 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;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}a:active,a:hover{outline-width:0}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{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}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}*{-webkit-tap-highlight-color:rgba(0,0,0,0)}*,:after,:before{box-sizing:border-box}body,html{width:100%;height:100%}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:12px;line-height:1.5;color:rgba(0,0,0,.65);background-color:#fff}article,aside,blockquote,body,button,code,dd,details,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,input,legend,li,menu,nav,ol,p,pre,section,td,textarea,th,ul{margin:0;padding:0}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit;color:inherit}ol,ul{list-style:none}input::-ms-clear,input::-ms-reveal{display:none}::-moz-selection{background:#108ee9;color:#fff}::selection{background:#108ee9;color:#fff}a{color:#108ee9;background:transparent;text-decoration:none;outline:none;cursor:pointer;-webkit-transition:color .3s ease;transition:color .3s ease}a:hover{color:#49a9ee}a:active{color:#0e77ca}a:active,a:hover{outline:0;text-decoration:none}a[disabled]{color:rgba(0,0,0,.25);cursor:not-allowed;pointer-events:none}.ant-divider{margin:0 6px;display:inline-block;height:8px;width:1px;background:#ccc}code,kbd,pre,samp{font-family:Consolas,Menlo,Courier,monospace}.clearfix{zoom:1}.clearfix:after,.clearfix:before{content:" ";display:table}.clearfix:after{clear:both;visibility:hidden;font-size:0;height:0}@font-face{font-family:anticon;src:url("iconfont.eot");src:url("iconfont.eot?#iefix") format("embedded-opentype"),url("iconfont.svg#iconfont") format("svg")}.anticon{display:inline-block;font-style:normal;vertical-align:baseline;text-align:center;text-transform:none;line-height:1;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.anticon:before{display:block;font-family:anticon!important}.anticon-step-forward:before{content:"\E600"}.anticon-step-backward:before{content:"\E601"}.anticon-forward:before{content:"\E602"}.anticon-backward:before{content:"\E603"}.anticon-caret-right:before{content:"\E604"}.anticon-caret-left:before{content:"\E605"}.anticon-caret-down:before{content:"\E606"}.anticon-caret-up:before{content:"\E607"}.anticon-caret-circle-right:before,.anticon-circle-right:before,.anticon-right-circle:before{content:"\E608"}.anticon-caret-circle-left:before,.anticon-circle-left:before,.anticon-left-circle:before{content:"\E609"}.anticon-caret-circle-up:before,.anticon-circle-up:before,.anticon-up-circle:before{content:"\E60A"}.anticon-caret-circle-down:before,.anticon-circle-down:before,.anticon-down-circle:before{content:"\E60B"}.anticon-right-circle-o:before{content:"\E60C"}.anticon-caret-circle-o-right:before,.anticon-circle-o-right:before{content:"\E60C"}.anticon-left-circle-o:before{content:"\E60D"}.anticon-caret-circle-o-left:before,.anticon-circle-o-left:before{content:"\E60D"}.anticon-up-circle-o:before{content:"\E60E"}.anticon-caret-circle-o-up:before,.anticon-circle-o-up:before{content:"\E60E"}.anticon-down-circle-o:before{content:"\E60F"}.anticon-caret-circle-o-down:before,.anticon-circle-o-down:before{content:"\E60F"}.anticon-verticle-left:before{content:"\E610"}.anticon-verticle-right:before{content:"\E611"}.anticon-rollback:before{content:"\E612"}.anticon-retweet:before{content:"\E613"}.anticon-shrink:before{content:"\E614"}.anticon-arrow-salt:before,.anticon-arrows-alt:before{content:"\E615"}.anticon-reload:before{content:"\E616"}.anticon-double-right:before{content:"\E617"}.anticon-double-left:before{content:"\E618"}.anticon-arrow-down:before{content:"\E619"}.anticon-arrow-up:before{content:"\E61A"}.anticon-arrow-right:before{content:"\E61B"}.anticon-arrow-left:before{content:"\E61C"}.anticon-down:before{content:"\E61D"}.anticon-up:before{content:"\E61E"}.anticon-right:before{content:"\E61F"}.anticon-left:before{content:"\E620"}.anticon-minus-square-o:before{content:"\E621"}.anticon-minus-circle:before{content:"\E622"}.anticon-minus-circle-o:before{content:"\E623"}.anticon-minus:before{content:"\E624"}.anticon-plus-circle-o:before{content:"\E625"}.anticon-plus-circle:before{content:"\E626"}.anticon-plus:before{content:"\E627"}.anticon-info-circle:before{content:"\E628"}.anticon-info-circle-o:before{content:"\E629"}.anticon-info:before{content:"\E62A"}.anticon-exclamation:before{content:"\E62B"}.anticon-exclamation-circle:before{content:"\E62C"}.anticon-exclamation-circle-o:before{content:"\E62D"}.anticon-close-circle:before,.anticon-cross-circle:before{content:"\E62E"}.anticon-close-circle-o:before,.anticon-cross-circle-o:before{content:"\E62F"}.anticon-check-circle:before{content:"\E630"}.anticon-check-circle-o:before{content:"\E631"}.anticon-check:before{content:"\E632"}.anticon-close:before,.anticon-cross:before{content:"\E633"}.anticon-customer-service:before,.anticon-customerservice:before{content:"\E634"}.anticon-credit-card:before{content:"\E635"}.anticon-code-o:before{content:"\E636"}.anticon-book:before{content:"\E637"}.anticon-bar-chart:before{content:"\E638"}.anticon-bars:before{content:"\E639"}.anticon-question:before{content:"\E63A"}.anticon-question-circle:before{content:"\E63B"}.anticon-question-circle-o:before{content:"\E63C"}.anticon-pause:before{content:"\E63D"}.anticon-pause-circle:before{content:"\E63E"}.anticon-pause-circle-o:before{content:"\E63F"}.anticon-clock-circle:before{content:"\E640"}.anticon-clock-circle-o:before{content:"\E641"}.anticon-swap:before{content:"\E642"}.anticon-swap-left:before{content:"\E643"}.anticon-swap-right:before{content:"\E644"}.anticon-plus-square-o:before{content:"\E645"}.anticon-frown-circle:before,.anticon-frown:before{content:"\E646"}.anticon-ellipsis:before{content:"\E647"}.anticon-copy:before{content:"\E648"}.anticon-menu-fold:before{content:"\E658"}.anticon-mail:before{content:"\E659"}.anticon-logout:before{content:"\E65A"}.anticon-link:before{content:"\E65B"}.anticon-area-chart:before{content:"\E65C"}.anticon-line-chart:before{content:"\E65D"}.anticon-home:before{content:"\E65E"}.anticon-laptop:before{content:"\E65F"}.anticon-star:before{content:"\E660"}.anticon-star-o:before{content:"\E661"}.anticon-folder:before{content:"\E662"}.anticon-filter:before{content:"\E663"}.anticon-file:before{content:"\E664"}.anticon-exception:before{content:"\E665"}.anticon-meh-circle:before,.anticon-meh:before{content:"\E666"}.anticon-meh-o:before{content:"\E667"}.anticon-shopping-cart:before{content:"\E668"}.anticon-save:before{content:"\E669"}.anticon-user:before{content:"\E66A"}.anticon-video-camera:before{content:"\E66B"}.anticon-to-top:before{content:"\E66C"}.anticon-team:before{content:"\E66D"}.anticon-tablet:before{content:"\E66E"}.anticon-solution:before{content:"\E66F"}.anticon-search:before{content:"\E670"}.anticon-share-alt:before{content:"\E671"}.anticon-setting:before{content:"\E672"}.anticon-poweroff:before{content:"\E6D5"}.anticon-picture:before{content:"\E674"}.anticon-phone:before{content:"\E675"}.anticon-paper-clip:before{content:"\E676"}.anticon-notification:before{content:"\E677"}.anticon-mobile:before{content:"\E678"}.anticon-menu-unfold:before{content:"\E679"}.anticon-inbox:before{content:"\E67A"}.anticon-lock:before{content:"\E67B"}.anticon-qrcode:before{content:"\E67C"}.anticon-play-circle:before{content:"\E6D0"}.anticon-play-circle-o:before{content:"\E6D1"}.anticon-tag:before{content:"\E6D2"}.anticon-tag-o:before{content:"\E6D3"}.anticon-tags:before{content:"\E67D"}.anticon-tags-o:before{content:"\E67E"}.anticon-cloud-o:before{content:"\E67F"}.anticon-cloud:before{content:"\E680"}.anticon-cloud-upload:before{content:"\E681"}.anticon-cloud-download:before{content:"\E682"}.anticon-cloud-download-o:before{content:"\E683"}.anticon-cloud-upload-o:before{content:"\E684"}.anticon-environment:before{content:"\E685"}.anticon-environment-o:before{content:"\E686"}.anticon-eye:before{content:"\E687"}.anticon-eye-o:before{content:"\E688"}.anticon-camera:before{content:"\E689"}.anticon-camera-o:before{content:"\E68A"}.anticon-windows:before{content:"\E68B"}.anticon-apple:before{content:"\E68C"}.anticon-apple-o:before{content:"\E6D4"}.anticon-android:before{content:"\E938"}.anticon-android-o:before{content:"\E68D"}.anticon-aliwangwang:before{content:"\E68E"}.anticon-aliwangwang-o:before{content:"\E68F"}.anticon-export:before{content:"\E691"}.anticon-edit:before{content:"\E692"}.anticon-circle-down-o:before{content:"\E693"}.anticon-circle-down-:before{content:"\E694"}.anticon-appstore-o:before{content:"\E695"}.anticon-appstore:before{content:"\E696"}.anticon-scan:before{content:"\E697"}.anticon-file-text:before{content:"\E698"}.anticon-folder-open:before{content:"\E699"}.anticon-hdd:before{content:"\E69A"}.anticon-ie:before{content:"\E69B"}.anticon-file-jpg:before{content:"\E69C"}.anticon-like:before{content:"\E64C"}.anticon-like-o:before{content:"\E69D"}.anticon-dislike:before{content:"\E64B"}.anticon-dislike-o:before{content:"\E69E"}.anticon-delete:before{content:"\E69F"}.anticon-enter:before{content:"\E6A0"}.anticon-pushpin-o:before{content:"\E6A1"}.anticon-pushpin:before{content:"\E6A2"}.anticon-heart:before{content:"\E6A3"}.anticon-heart-o:before{content:"\E6A4"}.anticon-pay-circle:before{content:"\E6A5"}.anticon-pay-circle-o:before{content:"\E6A6"}.anticon-smile-circle:before,.anticon-smile:before{content:"\E6A7"}.anticon-smile-o:before{content:"\E6A8"}.anticon-frown-o:before{content:"\E6A9"}.anticon-calculator:before{content:"\E6AA"}.anticon-message:before{content:"\E6AB"}.anticon-chrome:before{content:"\E6AC"}.anticon-github:before{content:"\E6AD"}.anticon-file-unknown:before{content:"\E6AF"}.anticon-file-excel:before{content:"\E6B0"}.anticon-file-ppt:before{content:"\E6B1"}.anticon-file-word:before{content:"\E6B2"}.anticon-file-pdf:before{content:"\E6B3"}.anticon-desktop:before{content:"\E6B4"}.anticon-upload:before{content:"\E6B6"}.anticon-download:before{content:"\E6B7"}.anticon-pie-chart:before{content:"\E6B8"}.anticon-unlock:before{content:"\E6BA"}.anticon-calendar:before{content:"\E6BB"}.anticon-windows-o:before{content:"\E6BC"}.anticon-dot-chart:before{content:"\E6BD"}.anticon-bar-chart:before{content:"\E6BE"}.anticon-code:before{content:"\E6BF"}.anticon-plus-square:before{content:"\E6C0"}.anticon-minus-square:before{content:"\E6C1"}.anticon-close-square:before{content:"\E6C2"}.anticon-close-square-o:before{content:"\E6C3"}.anticon-check-square:before{content:"\E6C4"}.anticon-check-square-o:before{content:"\E6C5"}.anticon-fast-backward:before{content:"\E6C6"}.anticon-fast-forward:before{content:"\E6C7"}.anticon-up-square:before{content:"\E6C8"}.anticon-down-square:before{content:"\E6C9"}.anticon-left-square:before{content:"\E6CA"}.anticon-right-square:before{content:"\E6CB"}.anticon-right-square-o:before{content:"\E6CC"}.anticon-left-square-o:before{content:"\E6CD"}.anticon-down-square-o:before{content:"\E6CE"}.anticon-up-square-o:before{content:"\E6CF"}.anticon-loading:before{content:"\E64D"}.anticon-loading-3-quarters:before{content:"\E6AE"}.anticon-bulb:before{content:"\E649"}.anticon-select:before{content:"\E64A"}.anticon-addfile:before,.anticon-file-add:before{content:"\E910"}.anticon-addfolder:before,.anticon-folder-add:before{content:"\E914"}.anticon-switcher:before{content:"\E913"}.anticon-rocket:before{content:"\E90F"}.anticon-dingding:before{content:"\E923"}.anticon-dingding-o:before{content:"\E925"}.anticon-bell:before{content:"\E64E"}.anticon-disconnect:before{content:"\E64F"}.anticon-database:before{content:"\E650"}.anticon-compass:before{content:"\E6DB"}.anticon-barcode:before{content:"\E652"}.anticon-hourglass:before{content:"\E653"}.anticon-key:before{content:"\E654"}.anticon-flag:before{content:"\E655"}.anticon-layout:before{content:"\E656"}.anticon-login:before{content:"\E657"}.anticon-printer:before{content:"\E673"}.anticon-sound:before{content:"\E6E9"}.anticon-usb:before{content:"\E6D7"}.anticon-skin:before{content:"\E6D8"}.anticon-tool:before{content:"\E6D9"}.anticon-sync:before{content:"\E6DA"}.anticon-wifi:before{content:"\E6D6"}.anticon-car:before{content:"\E6DC"}.anticon-copyright:before{content:"\E6DE"}.anticon-schedule:before{content:"\E6DF"}.anticon-user-add:before{content:"\E6ED"}.anticon-user-delete:before{content:"\E6E0"}.anticon-usergroup-add:before{content:"\E6DD"}.anticon-usergroup-delete:before{content:"\E6E1"}.anticon-man:before{content:"\E6E2"}.anticon-woman:before{content:"\E6EC"}.anticon-shop:before{content:"\E6E3"}.anticon-gift:before{content:"\E6E4"}.anticon-idcard:before{content:"\E6E5"}.anticon-medicine-box:before{content:"\E6E6"}.anticon-red-envelope:before{content:"\E6E7"}.anticon-coffee:before{content:"\E6E8"}.anticon-trademark:before{content:"\E651"}.anticon-safety:before{content:"\E6EA"}.anticon-wallet:before{content:"\E6EB"}.anticon-bank:before{content:"\E6EE"}.anticon-trophy:before{content:"\E6EF"}.anticon-contacts:before{content:"\E6F0"}.anticon-global:before{content:"\E6F1"}.anticon-shake:before{content:"\E94F"}.anticon-spin:before{display:inline-block;-webkit-animation:loadingCircle 1s infinite linear;animation:loadingCircle 1s infinite linear}.fade-appear,.fade-enter,.fade-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.fade-appear.fade-appear-active,.fade-enter.fade-enter-active{-webkit-animation-name:antFadeIn;animation-name:antFadeIn;-webkit-animation-play-state:running;animation-play-state:running}.fade-leave.fade-leave-active{-webkit-animation-name:antFadeOut;animation-name:antFadeOut;-webkit-animation-play-state:running;animation-play-state:running}.fade-appear,.fade-enter{opacity:0}.fade-appear,.fade-enter,.fade-leave{-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes antFadeIn{0%{opacity:0}to{opacity:1}}@keyframes antFadeIn{0%{opacity:0}to{opacity:1}}@-webkit-keyframes antFadeOut{0%{opacity:1}to{opacity:0}}@keyframes antFadeOut{0%{opacity:1}to{opacity:0}}.move-up-appear,.move-up-enter,.move-up-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-up-appear.move-up-appear-active,.move-up-enter.move-up-enter-active{-webkit-animation-name:antMoveUpIn;animation-name:antMoveUpIn;-webkit-animation-play-state:running;animation-play-state:running}.move-up-leave.move-up-leave-active{-webkit-animation-name:antMoveUpOut;animation-name:antMoveUpOut;-webkit-animation-play-state:running;animation-play-state:running}.move-up-appear,.move-up-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.move-up-leave{-webkit-animation-timing-function:cubic-bezier(.6,.04,.98,.34);animation-timing-function:cubic-bezier(.6,.04,.98,.34)}.move-down-appear,.move-down-enter,.move-down-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-down-appear.move-down-appear-active,.move-down-enter.move-down-enter-active{-webkit-animation-name:antMoveDownIn;animation-name:antMoveDownIn;-webkit-animation-play-state:running;animation-play-state:running}.move-down-leave.move-down-leave-active{-webkit-animation-name:antMoveDownOut;animation-name:antMoveDownOut;-webkit-animation-play-state:running;animation-play-state:running}.move-down-appear,.move-down-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.move-down-leave{-webkit-animation-timing-function:cubic-bezier(.6,.04,.98,.34);animation-timing-function:cubic-bezier(.6,.04,.98,.34)}.move-left-appear,.move-left-enter,.move-left-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-left-appear.move-left-appear-active,.move-left-enter.move-left-enter-active{-webkit-animation-name:antMoveLeftIn;animation-name:antMoveLeftIn;-webkit-animation-play-state:running;animation-play-state:running}.move-left-leave.move-left-leave-active{-webkit-animation-name:antMoveLeftOut;animation-name:antMoveLeftOut;-webkit-animation-play-state:running;animation-play-state:running}.move-left-appear,.move-left-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.move-left-leave{-webkit-animation-timing-function:cubic-bezier(.6,.04,.98,.34);animation-timing-function:cubic-bezier(.6,.04,.98,.34)}.move-right-appear,.move-right-enter,.move-right-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.move-right-appear.move-right-appear-active,.move-right-enter.move-right-enter-active{-webkit-animation-name:antMoveRightIn;animation-name:antMoveRightIn;-webkit-animation-play-state:running;animation-play-state:running}.move-right-leave.move-right-leave-active{-webkit-animation-name:antMoveRightOut;animation-name:antMoveRightOut;-webkit-animation-play-state:running;animation-play-state:running}.move-right-appear,.move-right-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.move-right-leave{-webkit-animation-timing-function:cubic-bezier(.6,.04,.98,.34);animation-timing-function:cubic-bezier(.6,.04,.98,.34)}@-webkit-keyframes antMoveDownIn{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes antMoveDownIn{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@-webkit-keyframes antMoveDownOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}}@keyframes antMoveDownOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}}@-webkit-keyframes antMoveLeftIn{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}}@keyframes antMoveLeftIn{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}}@-webkit-keyframes antMoveLeftOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}@keyframes antMoveLeftOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(-100%);transform:translateX(-100%);opacity:0}}@-webkit-keyframes antMoveRightIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes antMoveRightIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes antMoveRightOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@keyframes antMoveRightOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(0);transform:translateX(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateX(100%);transform:translateX(100%);opacity:0}}@-webkit-keyframes antMoveUpIn{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(-100%);transform:translateY(-100%);opacity:0}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes antMoveUpIn{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(-100%);transform:translateY(-100%);opacity:0}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@-webkit-keyframes antMoveUpOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(-100%);transform:translateY(-100%);opacity:0}}@keyframes antMoveUpOut{0%{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(0);transform:translateY(0);opacity:1}to{-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:translateY(-100%);transform:translateY(-100%);opacity:0}}@-webkit-keyframes loadingCircle{0%{-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes loadingCircle{0%{-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.slide-up-appear,.slide-up-enter,.slide-up-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-up-appear.slide-up-appear-active,.slide-up-enter.slide-up-enter-active{-webkit-animation-name:antSlideUpIn;animation-name:antSlideUpIn;-webkit-animation-play-state:running;animation-play-state:running}.slide-up-leave.slide-up-leave-active{-webkit-animation-name:antSlideUpOut;animation-name:antSlideUpOut;-webkit-animation-play-state:running;animation-play-state:running}.slide-up-appear,.slide-up-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1)}.slide-up-leave{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06)}.slide-down-appear,.slide-down-enter,.slide-down-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-down-appear.slide-down-appear-active,.slide-down-enter.slide-down-enter-active{-webkit-animation-name:antSlideDownIn;animation-name:antSlideDownIn;-webkit-animation-play-state:running;animation-play-state:running}.slide-down-leave.slide-down-leave-active{-webkit-animation-name:antSlideDownOut;animation-name:antSlideDownOut;-webkit-animation-play-state:running;animation-play-state:running}.slide-down-appear,.slide-down-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1)}.slide-down-leave{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06)}.slide-left-appear,.slide-left-enter,.slide-left-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-left-appear.slide-left-appear-active,.slide-left-enter.slide-left-enter-active{-webkit-animation-name:antSlideLeftIn;animation-name:antSlideLeftIn;-webkit-animation-play-state:running;animation-play-state:running}.slide-left-leave.slide-left-leave-active{-webkit-animation-name:antSlideLeftOut;animation-name:antSlideLeftOut;-webkit-animation-play-state:running;animation-play-state:running}.slide-left-appear,.slide-left-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1)}.slide-left-leave{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06)}.slide-right-appear,.slide-right-enter,.slide-right-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.slide-right-appear.slide-right-appear-active,.slide-right-enter.slide-right-enter-active{-webkit-animation-name:antSlideRightIn;animation-name:antSlideRightIn;-webkit-animation-play-state:running;animation-play-state:running}.slide-right-leave.slide-right-leave-active{-webkit-animation-name:antSlideRightOut;animation-name:antSlideRightOut;-webkit-animation-play-state:running;animation-play-state:running}.slide-right-appear,.slide-right-enter{opacity:0;-webkit-animation-timing-function:cubic-bezier(.23,1,.32,1);animation-timing-function:cubic-bezier(.23,1,.32,1)}.slide-right-leave{-webkit-animation-timing-function:cubic-bezier(.755,.05,.855,.06);animation-timing-function:cubic-bezier(.755,.05,.855,.06)}@-webkit-keyframes antSlideUpIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.8);transform:scaleY(.8)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(1);transform:scaleY(1)}}@keyframes antSlideUpIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.8);transform:scaleY(.8)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(1);transform:scaleY(1)}}@-webkit-keyframes antSlideUpOut{0%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(1);transform:scaleY(1)}to{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.8);transform:scaleY(.8)}}@keyframes antSlideUpOut{0%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(1);transform:scaleY(1)}to{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(.8);transform:scaleY(.8)}}@-webkit-keyframes antSlideDownIn{0%{opacity:0;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(.8);transform:scaleY(.8)}to{opacity:1;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(1);transform:scaleY(1)}}@keyframes antSlideDownIn{0%{opacity:0;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(.8);transform:scaleY(.8)}to{opacity:1;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(1);transform:scaleY(1)}}@-webkit-keyframes antSlideDownOut{0%{opacity:1;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(1);transform:scaleY(1)}to{opacity:0;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(.8);transform:scaleY(.8)}}@keyframes antSlideDownOut{0%{opacity:1;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(1);transform:scaleY(1)}to{opacity:0;-webkit-transform-origin:100% 100%;transform-origin:100% 100%;-webkit-transform:scaleY(.8);transform:scaleY(.8)}}@-webkit-keyframes antSlideLeftIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes antSlideLeftIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(1);transform:scaleX(1)}}@-webkit-keyframes antSlideLeftOut{0%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(1);transform:scaleX(1)}to{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}}@keyframes antSlideLeftOut{0%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(1);transform:scaleX(1)}to{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}}@-webkit-keyframes antSlideRightIn{0%{opacity:0;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}to{opacity:1;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes antSlideRightIn{0%{opacity:0;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}to{opacity:1;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(1);transform:scaleX(1)}}@-webkit-keyframes antSlideRightOut{0%{opacity:1;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(1);transform:scaleX(1)}to{opacity:0;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}}@keyframes antSlideRightOut{0%{opacity:1;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(1);transform:scaleX(1)}to{opacity:0;-webkit-transform-origin:100% 0;transform-origin:100% 0;-webkit-transform:scaleX(.8);transform:scaleX(.8)}}.swing-appear,.swing-enter{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.swing-appear.swing-appear-active,.swing-enter.swing-enter-active{-webkit-animation-name:antSwingIn;animation-name:antSwingIn;-webkit-animation-play-state:running;animation-play-state:running}@-webkit-keyframes antSwingIn{0%,to{-webkit-transform:translateX(0);transform:translateX(0)}20%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}40%{-webkit-transform:translateX(10px);transform:translateX(10px)}60%{-webkit-transform:translateX(-5px);transform:translateX(-5px)}80%{-webkit-transform:translateX(5px);transform:translateX(5px)}}@keyframes antSwingIn{0%,to{-webkit-transform:translateX(0);transform:translateX(0)}20%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}40%{-webkit-transform:translateX(10px);transform:translateX(10px)}60%{-webkit-transform:translateX(-5px);transform:translateX(-5px)}80%{-webkit-transform:translateX(5px);transform:translateX(5px)}}.zoom-appear,.zoom-enter,.zoom-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.zoom-appear.zoom-appear-active,.zoom-enter.zoom-enter-active{-webkit-animation-name:antZoomIn;animation-name:antZoomIn;-webkit-animation-play-state:running;animation-play-state:running}.zoom-leave.zoom-leave-active{-webkit-animation-name:antZoomOut;animation-name:antZoomOut;-webkit-animation-play-state:running;animation-play-state:running}.zoom-appear,.zoom-enter{-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.zoom-leave{-webkit-animation-timing-function:cubic-bezier(.78,.14,.15,.86);animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.zoom-big-appear,.zoom-big-enter,.zoom-big-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.zoom-big-appear.zoom-big-appear-active,.zoom-big-enter.zoom-big-enter-active{-webkit-animation-name:antZoomBigIn;animation-name:antZoomBigIn;-webkit-animation-play-state:running;animation-play-state:running}.zoom-big-leave.zoom-big-leave-active{-webkit-animation-name:antZoomBigOut;animation-name:antZoomBigOut;-webkit-animation-play-state:running;animation-play-state:running}.zoom-big-appear,.zoom-big-enter{-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.zoom-big-leave{-webkit-animation-timing-function:cubic-bezier(.78,.14,.15,.86);animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.zoom-big-fast-appear,.zoom-big-fast-enter,.zoom-big-fast-leave{-webkit-animation-duration:.1s;animation-duration:.1s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.zoom-big-fast-appear.zoom-big-fast-appear-active,.zoom-big-fast-enter.zoom-big-fast-enter-active{-webkit-animation-name:antZoomBigIn;animation-name:antZoomBigIn;-webkit-animation-play-state:running;animation-play-state:running}.zoom-big-fast-leave.zoom-big-fast-leave-active{-webkit-animation-name:antZoomBigOut;animation-name:antZoomBigOut;-webkit-animation-play-state:running;animation-play-state:running}.zoom-big-fast-appear,.zoom-big-fast-enter{-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.zoom-big-fast-leave{-webkit-animation-timing-function:cubic-bezier(.78,.14,.15,.86);animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.zoom-up-appear,.zoom-up-enter,.zoom-up-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.zoom-up-appear.zoom-up-appear-active,.zoom-up-enter.zoom-up-enter-active{-webkit-animation-name:antZoomUpIn;animation-name:antZoomUpIn;-webkit-animation-play-state:running;animation-play-state:running}.zoom-up-leave.zoom-up-leave-active{-webkit-animation-name:antZoomUpOut;animation-name:antZoomUpOut;-webkit-animation-play-state:running;animation-play-state:running}.zoom-up-appear,.zoom-up-enter{-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.zoom-up-leave{-webkit-animation-timing-function:cubic-bezier(.78,.14,.15,.86);animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.zoom-down-appear,.zoom-down-enter,.zoom-down-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.zoom-down-appear.zoom-down-appear-active,.zoom-down-enter.zoom-down-enter-active{-webkit-animation-name:antZoomDownIn;animation-name:antZoomDownIn;-webkit-animation-play-state:running;animation-play-state:running}.zoom-down-leave.zoom-down-leave-active{-webkit-animation-name:antZoomDownOut;animation-name:antZoomDownOut;-webkit-animation-play-state:running;animation-play-state:running}.zoom-down-appear,.zoom-down-enter{-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.zoom-down-leave{-webkit-animation-timing-function:cubic-bezier(.78,.14,.15,.86);animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.zoom-left-appear,.zoom-left-enter,.zoom-left-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.zoom-left-appear.zoom-left-appear-active,.zoom-left-enter.zoom-left-enter-active{-webkit-animation-name:antZoomLeftIn;animation-name:antZoomLeftIn;-webkit-animation-play-state:running;animation-play-state:running}.zoom-left-leave.zoom-left-leave-active{-webkit-animation-name:antZoomLeftOut;animation-name:antZoomLeftOut;-webkit-animation-play-state:running;animation-play-state:running}.zoom-left-appear,.zoom-left-enter{-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.zoom-left-leave{-webkit-animation-timing-function:cubic-bezier(.78,.14,.15,.86);animation-timing-function:cubic-bezier(.78,.14,.15,.86)}.zoom-right-appear,.zoom-right-enter,.zoom-right-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-play-state:paused;animation-play-state:paused}.zoom-right-appear.zoom-right-appear-active,.zoom-right-enter.zoom-right-enter-active{-webkit-animation-name:antZoomRightIn;animation-name:antZoomRightIn;-webkit-animation-play-state:running;animation-play-state:running}.zoom-right-leave.zoom-right-leave-active{-webkit-animation-name:antZoomRightOut;animation-name:antZoomRightOut;-webkit-animation-play-state:running;animation-play-state:running}.zoom-right-appear,.zoom-right-enter{-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-animation-timing-function:cubic-bezier(.08,.82,.17,1);animation-timing-function:cubic-bezier(.08,.82,.17,1)}.zoom-right-leave{-webkit-animation-timing-function:cubic-bezier(.78,.14,.15,.86);animation-timing-function:cubic-bezier(.78,.14,.15,.86)}@-webkit-keyframes antZoomIn{0%{opacity:0;-webkit-transform:scale(.2);transform:scale(.2)}to{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes antZoomIn{0%{opacity:0;-webkit-transform:scale(.2);transform:scale(.2)}to{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes antZoomOut{0%{-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform:scale(.2);transform:scale(.2)}}@keyframes antZoomOut{0%{-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform:scale(.2);transform:scale(.2)}}@-webkit-keyframes antZoomBigIn{0%{opacity:0;-webkit-transform:scale(.8);transform:scale(.8)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes antZoomBigIn{0%{opacity:0;-webkit-transform:scale(.8);transform:scale(.8)}to{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes antZoomBigOut{0%{-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform:scale(.8);transform:scale(.8)}}@keyframes antZoomBigOut{0%{-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform:scale(.8);transform:scale(.8)}}@-webkit-keyframes antZoomUpIn{0%{opacity:0;-webkit-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:scale(.8);transform:scale(.8)}to{-webkit-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:scale(1);transform:scale(1)}}@keyframes antZoomUpIn{0%{opacity:0;-webkit-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:scale(.8);transform:scale(.8)}to{-webkit-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes antZoomUpOut{0%{-webkit-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:scale(.8);transform:scale(.8)}}@keyframes antZoomUpOut{0%{-webkit-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform-origin:50% 0;transform-origin:50% 0;-webkit-transform:scale(.8);transform:scale(.8)}}@-webkit-keyframes antZoomLeftIn{0%{opacity:0;-webkit-transform-origin:0 50%;transform-origin:0 50%;-webkit-transform:scale(.8);transform:scale(.8)}to{-webkit-transform-origin:0 50%;transform-origin:0 50%;-webkit-transform:scale(1);transform:scale(1)}}@keyframes antZoomLeftIn{0%{opacity:0;-webkit-transform-origin:0 50%;transform-origin:0 50%;-webkit-transform:scale(.8);transform:scale(.8)}to{-webkit-transform-origin:0 50%;transform-origin:0 50%;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes antZoomLeftOut{0%{-webkit-transform-origin:0 50%;transform-origin:0 50%;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform-origin:0 50%;transform-origin:0 50%;-webkit-transform:scale(.8);transform:scale(.8)}}@keyframes antZoomLeftOut{0%{-webkit-transform-origin:0 50%;transform-origin:0 50%;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform-origin:0 50%;transform-origin:0 50%;-webkit-transform:scale(.8);transform:scale(.8)}}@-webkit-keyframes antZoomRightIn{0%{opacity:0;-webkit-transform-origin:100% 50%;transform-origin:100% 50%;-webkit-transform:scale(.8);transform:scale(.8)}to{-webkit-transform-origin:100% 50%;transform-origin:100% 50%;-webkit-transform:scale(1);transform:scale(1)}}@keyframes antZoomRightIn{0%{opacity:0;-webkit-transform-origin:100% 50%;transform-origin:100% 50%;-webkit-transform:scale(.8);transform:scale(.8)}to{-webkit-transform-origin:100% 50%;transform-origin:100% 50%;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes antZoomRightOut{0%{-webkit-transform-origin:100% 50%;transform-origin:100% 50%;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform-origin:100% 50%;transform-origin:100% 50%;-webkit-transform:scale(.8);transform:scale(.8)}}@keyframes antZoomRightOut{0%{-webkit-transform-origin:100% 50%;transform-origin:100% 50%;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform-origin:100% 50%;transform-origin:100% 50%;-webkit-transform:scale(.8);transform:scale(.8)}}@-webkit-keyframes antZoomDownIn{0%{opacity:0;-webkit-transform-origin:50% 100%;transform-origin:50% 100%;-webkit-transform:scale(.8);transform:scale(.8)}to{-webkit-transform-origin:50% 100%;transform-origin:50% 100%;-webkit-transform:scale(1);transform:scale(1)}}@keyframes antZoomDownIn{0%{opacity:0;-webkit-transform-origin:50% 100%;transform-origin:50% 100%;-webkit-transform:scale(.8);transform:scale(.8)}to{-webkit-transform-origin:50% 100%;transform-origin:50% 100%;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes antZoomDownOut{0%{-webkit-transform-origin:50% 100%;transform-origin:50% 100%;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform-origin:50% 100%;transform-origin:50% 100%;-webkit-transform:scale(.8);transform:scale(.8)}}@keyframes antZoomDownOut{0%{-webkit-transform-origin:50% 100%;transform-origin:50% 100%;-webkit-transform:scale(1);transform:scale(1)}to{opacity:0;-webkit-transform-origin:50% 100%;transform-origin:50% 100%;-webkit-transform:scale(.8);transform:scale(.8)}}.ant-motion-collapse{overflow:hidden}.ant-motion-collapse-active{-webkit-transition:height .12s,opacity .12s;transition:height .12s,opacity .12s}.ant-affix{position:fixed;z-index:10}.ant-alert{position:relative;padding:8px 48px 8px 38px;border-radius:4px;color:rgba(0,0,0,.65);font-size:12px;line-height:16px;margin-bottom:10px}.ant-alert.ant-alert-no-icon{padding:8px 48px 8px 16px}.ant-alert-icon{font-size:14px;top:9.5px;left:16px;position:absolute}.ant-alert-description{font-size:12px;line-height:21px;display:none}.ant-alert-success{border:1px solid #cfefdf;background-color:#ebf8f2}.ant-alert-success .ant-alert-icon{color:#00a854}.ant-alert-info{border:1px solid #d2eafb;background-color:#ecf6fd}.ant-alert-info .ant-alert-icon{color:#108ee9}.ant-alert-warning{border:1px solid #fff3cf;background-color:#fffaeb}.ant-alert-warning .ant-alert-icon{color:#ffbf00}.ant-alert-error{border:1px solid #fcdbd9;background-color:#fef0ef}.ant-alert-error .ant-alert-icon{color:#f04134}.ant-alert-close-icon{font-size:12px;position:absolute;right:16px;top:10px;height:12px;line-height:12px;overflow:hidden;cursor:pointer}.ant-alert-close-icon .anticon-cross{color:rgba(0,0,0,.43);-webkit-transition:color .3s ease;transition:color .3s ease}.ant-alert-close-icon .anticon-cross:hover{color:#404040}.ant-alert-close-text{position:absolute;right:16px}.ant-alert-with-description{padding:16px 16px 16px 60px;position:relative;border-radius:4px;margin-bottom:10px;color:rgba(0,0,0,.65);line-height:1.5}.ant-alert-with-description.ant-alert-no-icon{padding:16px}.ant-alert-with-description .ant-alert-icon{position:absolute;top:16px;left:20px;font-size:24px}.ant-alert-with-description .ant-alert-close-icon{position:absolute;top:16px;right:16px;cursor:pointer;font-size:12px}.ant-alert-with-description .ant-alert-message{font-size:14px;color:rgba(0,0,0,.85);display:block;margin-bottom:4px}.ant-alert-with-description .ant-alert-description{display:block}.ant-alert.ant-alert-close{height:0!important;margin:0;padding-top:0;padding-bottom:0;-webkit-transition:all .3s cubic-bezier(.78,.14,.15,.86);transition:all .3s cubic-bezier(.78,.14,.15,.86);-webkit-transform-origin:50% 0;-ms-transform-origin:50% 0;transform-origin:50% 0}.ant-alert-slide-up-leave{-webkit-animation:antAlertSlideUpOut .3s cubic-bezier(.78,.14,.15,.86);animation:antAlertSlideUpOut .3s cubic-bezier(.78,.14,.15,.86);-webkit-animation-fill-mode:both;animation-fill-mode:both}.ant-alert-banner{border-radius:0;border:0;margin-bottom:0}@-webkit-keyframes antAlertSlideUpIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(0);transform:scaleY(0)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(1);transform:scaleY(1)}}@keyframes antAlertSlideUpIn{0%{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(0);transform:scaleY(0)}to{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(1);transform:scaleY(1)}}@-webkit-keyframes antAlertSlideUpOut{0%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(1);transform:scaleY(1)}to{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(0);transform:scaleY(0)}}@keyframes antAlertSlideUpOut{0%{opacity:1;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(1);transform:scaleY(1)}to{opacity:0;-webkit-transform-origin:0 0;transform-origin:0 0;-webkit-transform:scaleY(0);transform:scaleY(0)}}.ant-anchor{position:relative}.ant-anchor-wrapper{background-color:#fff}.ant-anchor-ink{position:absolute;height:100%;left:0;top:0}.ant-anchor-ink:before{content:" ";position:relative;width:2px;height:100%;display:block;background-color:#e9e9e9;margin:0 auto}.ant-anchor-ink-ball{display:none;position:absolute;width:9px;height:9px;border-radius:9px;border:3px solid #108ee9;background-color:#fff;left:50%;-webkit-transition:top .3s ease-in-out;transition:top .3s ease-in-out;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ant-anchor-ink-ball.visible{display:inline-block}.ant-anchor.fixed .ant-anchor-ink .ant-anchor-ink-ball{display:none}.ant-anchor-link{padding:8px 0 8px 18px;line-height:1}.ant-anchor-link .ant-anchor-link{padding-top:6px;padding-bottom:6px}.ant-anchor-link-title{display:block;position:relative;-webkit-transition:all .3s;transition:all .3s;color:rgba(0,0,0,.65);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:8px}.ant-anchor-link-title:only-child{margin-bottom:0}.ant-anchor-link-active>.ant-anchor-link-title{color:#108ee9}.ant-anchor-link>.ant-anchor-link{font-size:12px}.ant-select-auto-complete.ant-select .ant-select-selection{border:0}.ant-select-auto-complete.ant-select .ant-select-selection--single{height:auto}.ant-select-auto-complete.ant-select .ant-select-selection__rendered{margin-left:0;margin-right:0}.ant-select-auto-complete.ant-select .ant-select-selection__placeholder{margin-left:8px;margin-right:8px;top:14px}.ant-select-auto-complete.ant-select .ant-input{position:relative;display:inline-block;padding:4px 7px;width:100%;height:28px;cursor:text;font-size:12px;line-height:1.5;color:rgba(0,0,0,.65);background-color:#fff;background-image:none;border-radius:4px;-webkit-transition:all .3s;transition:all .3s;background:transparent}.ant-select-auto-complete.ant-select .ant-input::-moz-placeholder{color:#ccc;opacity:1}.ant-select-auto-complete.ant-select .ant-input:-ms-input-placeholder{color:#ccc}.ant-select-auto-complete.ant-select .ant-input::-webkit-input-placeholder{color:#ccc}.ant-select-auto-complete.ant-select .ant-input:hover{border-color:#49a9ee}.ant-select-auto-complete.ant-select .ant-input:focus{border-color:#49a9ee;outline:0;box-shadow:0 0 0 2px rgba(16,142,233,.2)}.ant-select-auto-complete.ant-select .ant-input[disabled]{background-color:#f7f7f7;opacity:1;cursor:not-allowed;color:rgba(0,0,0,.25)}.ant-select-auto-complete.ant-select .ant-input[disabled]:hover{border-color:#e2e2e2}textarea.ant-select-auto-complete.ant-select .ant-input{max-width:100%;height:auto;vertical-align:bottom}.ant-select-auto-complete.ant-select .ant-input-lg{padding:6px 7px;height:32px}.ant-select-auto-complete.ant-select .ant-input-sm{padding:1px 7px;height:22px}.ant-select-auto-complete.ant-select-lg .ant-select-selection__placeholder{top:16px}.ant-select-auto-complete.ant-select-lg .ant-input{padding:6px 7px;height:32px}.ant-select-auto-complete.ant-select-sm .ant-select-selection__placeholder{top:11px}.ant-select-auto-complete.ant-select-sm .ant-input{padding:1px 7px;height:22px}.ant-select-auto-complete.ant-select .ant-input{border:1px solid #d9d9d9}.ant-select-auto-complete.ant-select .ant-input:focus,.ant-select-auto-complete.ant-select .ant-input:hover{border-color:#49a9ee}.ant-select{box-sizing:border-box;display:inline-block;position:relative;color:rgba(0,0,0,.65);font-size:12px}.ant-select>ul>li>a{padding:0;background-color:#fff}.ant-select-arrow{font-style:normal;vertical-align:baseline;text-align:center;text-transform:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;position:absolute;top:50%;right:8px;line-height:1;margin-top:-6px;display:inline-block;font-size:12px;font-size:9px\9;-webkit-transform:scale(.75) rotate(0deg);-ms-transform:scale(.75) rotate(0deg);transform:scale(.75) rotate(0deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";zoom:1}.ant-select-arrow:before{display:block;font-family:anticon!important}:root .ant-select-arrow{-webkit-filter:none;filter:none;font-size:12px}.ant-select-arrow *{display:none}.ant-select-arrow:before{content:"\E61D";-webkit-transition:-webkit-transform .2s ease;transition:-webkit-transform .2s ease;transition:transform .2s ease;transition:transform .2s ease,-webkit-transform .2s ease}.ant-select-selection{outline:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;box-sizing:border-box;display:block;background-color:#fff;border-radius:4px;border:1px solid #d9d9d9;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1)}.ant-select-selection:hover{border-color:#49a9ee}.ant-select-focused .ant-select-selection,.ant-select-selection:active,.ant-select-selection:focus{border-color:#49a9ee;outline:0;box-shadow:0 0 0 2px rgba(16,142,233,.2)}.ant-select-selection__clear{display:inline-block;font-style:normal;vertical-align:baseline;text-align:center;text-transform:none;text-rendering:auto;opacity:0;position:absolute;right:8px;z-index:1;background:#fff;top:50%;font-size:12px;color:rgba(0,0,0,.25);width:12px;height:12px;margin-top:-6px;line-height:12px;cursor:pointer;-webkit-transition:color .3s ease,opacity .15s ease;transition:color .3s ease,opacity .15s ease}.ant-select-selection__clear:before{display:block;font-family:anticon;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\E62E"}.ant-select-selection__clear:hover{color:rgba(0,0,0,.43)}.ant-select-selection:hover .ant-select-selection__clear{opacity:1}.ant-select-selection-selected-value{float:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%;padding-right:14px}.ant-select-disabled{color:rgba(0,0,0,.25)}.ant-select-disabled .ant-select-selection{background:#f7f7f7;cursor:not-allowed}.ant-select-disabled .ant-select-selection:active,.ant-select-disabled .ant-select-selection:focus,.ant-select-disabled .ant-select-selection:hover{border-color:#d9d9d9;box-shadow:none}.ant-select-disabled .ant-select-selection__clear{display:none;visibility:hidden;pointer-events:none}.ant-select-disabled .ant-select-selection--multiple .ant-select-selection__choice{background:#e9e9e9;color:#aaa;padding-right:10px}.ant-select-disabled .ant-select-selection--multiple .ant-select-selection__choice__remove{display:none}.ant-select-selection--single{height:28px;position:relative;cursor:pointer}.ant-select-selection__rendered{display:block;margin-left:7px;margin-right:7px;position:relative;line-height:26px}.ant-select-selection__rendered:after{content:".";visibility:hidden;pointer-events:none;display:inline-block;width:0}.ant-select-lg .ant-select-selection--single{height:32px}.ant-select-lg .ant-select-selection__rendered{line-height:30px}.ant-select-lg .ant-select-selection--multiple{min-height:32px}.ant-select-lg .ant-select-selection--multiple .ant-select-selection__rendered li{height:24px;line-height:24px}.ant-select-sm .ant-select-selection--single{height:22px}.ant-select-sm .ant-select-selection__rendered{line-height:20px}.ant-select-sm .ant-select-selection--multiple{min-height:22px}.ant-select-sm .ant-select-selection--multiple .ant-select-selection__rendered li{height:14px;line-height:14px}.ant-select-disabled .ant-select-selection__choice__remove{color:rgba(0,0,0,.25);cursor:default}.ant-select-disabled .ant-select-selection__choice__remove:hover{color:rgba(0,0,0,.25)}.ant-select-search__field__wrap{display:inline-block;position:relative}.ant-select-search__field__placeholder,.ant-select-selection__placeholder{position:absolute;top:50%;left:0;right:9px;color:#ccc;line-height:20px;height:20px;max-width:100%;margin-top:-10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ant-select-search__field__placeholder{left:8px}.ant-select-search--inline{position:absolute;height:100%}.ant-select-selection--multiple .ant-select-search--inline{float:left;position:static}.ant-select-search--inline .ant-select-search__field__wrap{width:100%;height:100%}.ant-select-search--inline .ant-select-search__field{border:0;font-size:100%;height:100%;width:100%;background:transparent;outline:0;border-radius:4px}.ant-select-search--inline .ant-select-search__field__mirror{position:absolute;top:0;left:-9999px;white-space:pre;pointer-events:none}.ant-select-search--inline>i{float:right}.ant-select-selection--multiple{min-height:28px;cursor:text;padding-bottom:3px;zoom:1}.ant-select-selection--multiple:after,.ant-select-selection--multiple:before{content:" ";display:table}.ant-select-selection--multiple:after{clear:both;visibility:hidden;font-size:0;height:0}.ant-select-selection--multiple .ant-select-search--inline{width:auto;padding:0}.ant-select-selection--multiple .ant-select-search--inline .ant-select-search__field{width:.75em}.ant-select-selection--multiple .ant-select-selection__rendered{margin-left:5px;margin-bottom:-3px;height:auto}.ant-select-selection--multiple .ant-select-selection__rendered>ul>li,.ant-select-selection--multiple>ul>li{margin-top:3px;height:20px;line-height:20px}.ant-select-selection--multiple .ant-select-selection__choice{background-color:#f3f3f3;border-radius:4px;cursor:default;float:left;margin-right:4px;max-width:99%;position:relative;overflow:hidden;-webkit-transition:padding .3s cubic-bezier(.645,.045,.355,1);transition:padding .3s cubic-bezier(.645,.045,.355,1);padding:0 20px 0 10px}.ant-select-selection--multiple .ant-select-selection__choice__disabled{padding:0 10px}.ant-select-selection--multiple .ant-select-selection__choice__content{display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;-webkit-transition:margin .3s cubic-bezier(.645,.045,.355,1);transition:margin .3s cubic-bezier(.645,.045,.355,1)}.ant-select-selection--multiple .ant-select-selection__choice__remove{font-style:normal;vertical-align:baseline;text-align:center;text-transform:none;line-height:1;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:rgba(0,0,0,.43);line-height:inherit;cursor:pointer;font-weight:700;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);display:inline-block;font-size:12px;font-size:8px\9;-webkit-transform:scale(.66666667) rotate(0deg);-ms-transform:scale(.66666667) rotate(0deg);transform:scale(.66666667) rotate(0deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";zoom:1;position:absolute;right:4px;padding:0 0 0 8px}.ant-select-selection--multiple .ant-select-selection__choice__remove:before{display:block;font-family:anticon!important}:root .ant-select-selection--multiple .ant-select-selection__choice__remove{-webkit-filter:none;filter:none;font-size:12px}.ant-select-selection--multiple .ant-select-selection__choice__remove:hover{color:#404040}.ant-select-selection--multiple .ant-select-selection__choice__remove:before{content:"\E633"}.ant-select-open .ant-select-arrow{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-ms-transform:rotate(180deg)}.ant-select-open .ant-select-arrow:before{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.ant-select-open .ant-select-selection{border-color:#49a9ee;outline:0;box-shadow:0 0 0 2px rgba(16,142,233,.2)}.ant-select-combobox .ant-select-arrow{display:none}.ant-select-combobox .ant-select-search--inline{height:100%;width:100%;float:none}.ant-select-combobox .ant-select-search__field__wrap{width:100%;height:100%}.ant-select-combobox .ant-select-search__field{width:100%;height:100%;position:relative;z-index:1;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);box-shadow:none}.ant-select-dropdown{background-color:#fff;box-shadow:0 1px 6px rgba(0,0,0,.2);border-radius:4px;box-sizing:border-box;z-index:1050;left:-9999px;top:-9999px;position:absolute;outline:none;overflow:hidden;font-size:12px}.ant-select-dropdown.slide-up-appear.slide-up-appear-active.ant-select-dropdown-placement-bottomLeft,.ant-select-dropdown.slide-up-enter.slide-up-enter-active.ant-select-dropdown-placement-bottomLeft{-webkit-animation-name:antSlideUpIn;animation-name:antSlideUpIn}.ant-select-dropdown.slide-up-appear.slide-up-appear-active.ant-select-dropdown-placement-topLeft,.ant-select-dropdown.slide-up-enter.slide-up-enter-active.ant-select-dropdown-placement-topLeft{-webkit-animation-name:antSlideDownIn;animation-name:antSlideDownIn}.ant-select-dropdown.slide-up-leave.slide-up-leave-active.ant-select-dropdown-placement-bottomLeft{-webkit-animation-name:antSlideUpOut;animation-name:antSlideUpOut}.ant-select-dropdown.slide-up-leave.slide-up-leave-active.ant-select-dropdown-placement-topLeft{-webkit-animation-name:antSlideDownOut;animation-name:antSlideDownOut}.ant-select-dropdown-hidden{display:none}.ant-select-dropdown-menu{outline:none;margin-bottom:0;padding-left:0;list-style:none;max-height:250px;overflow:auto}.ant-select-dropdown-menu-item-group-list{margin:0;padding:0}.ant-select-dropdown-menu-item-group-list>.ant-select-dropdown-menu-item{padding-left:24px}.ant-select-dropdown-menu-item-group-title{color:rgba(0,0,0,.43);line-height:1.5;padding:8px 16px}.ant-select-dropdown-menu-item{position:relative;display:block;padding:7px 16px;font-weight:400;color:rgba(0,0,0,.65);white-space:nowrap;cursor:pointer;overflow:hidden;-webkit-transition:background .3s ease;transition:background .3s ease}.ant-select-dropdown-menu-item-active,.ant-select-dropdown-menu-item:hover{background-color:#ecf6fd}.ant-select-dropdown-menu-item-disabled{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-select-dropdown-menu-item-disabled:hover{color:rgba(0,0,0,.25);background-color:#fff;cursor:not-allowed}.ant-select-dropdown-menu-item-selected,.ant-select-dropdown-menu-item-selected:hover{background-color:#f7f7f7;font-weight:700;color:rgba(0,0,0,.65)}.ant-select-dropdown-menu-item-divider{height:1px;margin:1px 0;overflow:hidden;background-color:#e5e5e5;line-height:0}.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item:after{font-family:anticon;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\E632";color:transparent;display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);-ms-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";zoom:1;-webkit-transition:all .2s ease;transition:all .2s ease;position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);right:16px;font-weight:700;text-shadow:0 .1px 0,.1px 0 0,0 -.1px 0,-.1px 0}:root .ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item:after{-webkit-filter:none;filter:none;font-size:12px}.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item:hover:after{color:#ddd}.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item-disabled:after{display:none}.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item-selected:after,.ant-select-dropdown.ant-select-dropdown--multiple .ant-select-dropdown-menu-item-selected:hover:after{color:#108ee9;display:inline-block}.ant-select-dropdown-container-open .ant-select-dropdown,.ant-select-dropdown-open .ant-select-dropdown{display:block}.ant-input-search-icon{cursor:pointer;-webkit-transition:all .3s;transition:all .3s;font-size:14px}.ant-input-search-icon:hover{color:#108ee9}.ant-search-input-wrapper{display:inline-block;vertical-align:middle}.ant-search-input.ant-input-group .ant-input:first-child,.ant-search-input.ant-input-group .ant-select:first-child{border-radius:4px;position:absolute;top:-1px;width:100%}.ant-search-input.ant-input-group .ant-input:first-child{padding-right:36px}.ant-search-input .ant-search-btn{color:rgba(0,0,0,.65);background-color:#fff;border-color:#d9d9d9;border-radius:0 3px 3px 0;left:-1px;position:relative;border-width:0 0 0 1px;z-index:2;padding-left:8px;padding-right:8px}.ant-search-input .ant-search-btn>a:only-child{color:currentColor}.ant-search-input .ant-search-btn>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-search-input .ant-search-btn:focus,.ant-search-input .ant-search-btn:hover{color:#49a9ee;background-color:#fff;border-color:#49a9ee}.ant-search-input .ant-search-btn:focus>a:only-child,.ant-search-input .ant-search-btn:hover>a:only-child{color:currentColor}.ant-search-input .ant-search-btn:focus>a:only-child:after,.ant-search-input .ant-search-btn:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-search-input .ant-search-btn.active,.ant-search-input .ant-search-btn:active{color:#0e77ca;background-color:#fff;border-color:#0e77ca}.ant-search-input .ant-search-btn.active>a:only-child,.ant-search-input .ant-search-btn:active>a:only-child{color:currentColor}.ant-search-input .ant-search-btn.active>a:only-child:after,.ant-search-input .ant-search-btn:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-search-input .ant-search-btn.disabled,.ant-search-input .ant-search-btn.disabled.active,.ant-search-input .ant-search-btn.disabled:active,.ant-search-input .ant-search-btn.disabled:focus,.ant-search-input .ant-search-btn.disabled:hover,.ant-search-input .ant-search-btn[disabled],.ant-search-input .ant-search-btn[disabled].active,.ant-search-input .ant-search-btn[disabled]:active,.ant-search-input .ant-search-btn[disabled]:focus,.ant-search-input .ant-search-btn[disabled]:hover{color:rgba(0,0,0,.25);background-color:#f7f7f7;border-color:#d9d9d9}.ant-search-input .ant-search-btn.disabled.active>a:only-child,.ant-search-input .ant-search-btn.disabled:active>a:only-child,.ant-search-input .ant-search-btn.disabled:focus>a:only-child,.ant-search-input .ant-search-btn.disabled:hover>a:only-child,.ant-search-input .ant-search-btn.disabled>a:only-child,.ant-search-input .ant-search-btn[disabled].active>a:only-child,.ant-search-input .ant-search-btn[disabled]:active>a:only-child,.ant-search-input .ant-search-btn[disabled]:focus>a:only-child,.ant-search-input .ant-search-btn[disabled]:hover>a:only-child,.ant-search-input .ant-search-btn[disabled]>a:only-child{color:currentColor}.ant-search-input .ant-search-btn.disabled.active>a:only-child:after,.ant-search-input .ant-search-btn.disabled:active>a:only-child:after,.ant-search-input .ant-search-btn.disabled:focus>a:only-child:after,.ant-search-input .ant-search-btn.disabled:hover>a:only-child:after,.ant-search-input .ant-search-btn.disabled>a:only-child:after,.ant-search-input .ant-search-btn[disabled].active>a:only-child:after,.ant-search-input .ant-search-btn[disabled]:active>a:only-child:after,.ant-search-input .ant-search-btn[disabled]:focus>a:only-child:after,.ant-search-input .ant-search-btn[disabled]:hover>a:only-child:after,.ant-search-input .ant-search-btn[disabled]>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-search-input .ant-search-btn.active,.ant-search-input .ant-search-btn:active,.ant-search-input .ant-search-btn:focus,.ant-search-input .ant-search-btn:hover{background:#fff}.ant-search-input .ant-search-btn:hover{border-color:#d9d9d9}.ant-search-input.ant-search-input-focus .ant-search-btn-noempty,.ant-search-input:hover .ant-search-btn-noempty{color:#fff;background-color:#108ee9;border-color:#108ee9}.ant-search-input.ant-search-input-focus .ant-search-btn-noempty>a:only-child,.ant-search-input:hover .ant-search-btn-noempty>a:only-child{color:currentColor}.ant-search-input.ant-search-input-focus .ant-search-btn-noempty>a:only-child:after,.ant-search-input:hover .ant-search-btn-noempty>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-search-input.ant-search-input-focus .ant-search-btn-noempty:focus,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty:hover,.ant-search-input:hover .ant-search-btn-noempty:focus,.ant-search-input:hover .ant-search-btn-noempty:hover{color:#fff;background-color:#49a9ee;border-color:#49a9ee}.ant-search-input.ant-search-input-focus .ant-search-btn-noempty:focus>a:only-child,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty:hover>a:only-child,.ant-search-input:hover .ant-search-btn-noempty:focus>a:only-child,.ant-search-input:hover .ant-search-btn-noempty:hover>a:only-child{color:currentColor}.ant-search-input.ant-search-input-focus .ant-search-btn-noempty:focus>a:only-child:after,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty:hover>a:only-child:after,.ant-search-input:hover .ant-search-btn-noempty:focus>a:only-child:after,.ant-search-input:hover .ant-search-btn-noempty:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-search-input.ant-search-input-focus .ant-search-btn-noempty.active,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty:active,.ant-search-input:hover .ant-search-btn-noempty.active,.ant-search-input:hover .ant-search-btn-noempty:active{color:#fff;background-color:#0e77ca;border-color:#0e77ca}.ant-search-input.ant-search-input-focus .ant-search-btn-noempty.active>a:only-child,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty:active>a:only-child,.ant-search-input:hover .ant-search-btn-noempty.active>a:only-child,.ant-search-input:hover .ant-search-btn-noempty:active>a:only-child{color:currentColor}.ant-search-input.ant-search-input-focus .ant-search-btn-noempty.active>a:only-child:after,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty:active>a:only-child:after,.ant-search-input:hover .ant-search-btn-noempty.active>a:only-child:after,.ant-search-input:hover .ant-search-btn-noempty:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-search-input.ant-search-input-focus .ant-search-btn-noempty.disabled,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty.disabled.active,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty.disabled:active,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty.disabled:focus,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty.disabled:hover,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty[disabled],.ant-search-input.ant-search-input-focus .ant-search-btn-noempty[disabled].active,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty[disabled]:active,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty[disabled]:focus,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty[disabled]:hover,.ant-search-input:hover .ant-search-btn-noempty.disabled,.ant-search-input:hover .ant-search-btn-noempty.disabled.active,.ant-search-input:hover .ant-search-btn-noempty.disabled:active,.ant-search-input:hover .ant-search-btn-noempty.disabled:focus,.ant-search-input:hover .ant-search-btn-noempty.disabled:hover,.ant-search-input:hover .ant-search-btn-noempty[disabled],.ant-search-input:hover .ant-search-btn-noempty[disabled].active,.ant-search-input:hover .ant-search-btn-noempty[disabled]:active,.ant-search-input:hover .ant-search-btn-noempty[disabled]:focus,.ant-search-input:hover .ant-search-btn-noempty[disabled]:hover{color:rgba(0,0,0,.25);background-color:#f7f7f7;border-color:#d9d9d9}.ant-search-input.ant-search-input-focus .ant-search-btn-noempty.disabled.active>a:only-child,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty.disabled:active>a:only-child,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty.disabled:focus>a:only-child,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty.disabled:hover>a:only-child,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty.disabled>a:only-child,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty[disabled].active>a:only-child,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty[disabled]:active>a:only-child,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty[disabled]:focus>a:only-child,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty[disabled]:hover>a:only-child,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty[disabled]>a:only-child,.ant-search-input:hover .ant-search-btn-noempty.disabled.active>a:only-child,.ant-search-input:hover .ant-search-btn-noempty.disabled:active>a:only-child,.ant-search-input:hover .ant-search-btn-noempty.disabled:focus>a:only-child,.ant-search-input:hover .ant-search-btn-noempty.disabled:hover>a:only-child,.ant-search-input:hover .ant-search-btn-noempty.disabled>a:only-child,.ant-search-input:hover .ant-search-btn-noempty[disabled].active>a:only-child,.ant-search-input:hover .ant-search-btn-noempty[disabled]:active>a:only-child,.ant-search-input:hover .ant-search-btn-noempty[disabled]:focus>a:only-child,.ant-search-input:hover .ant-search-btn-noempty[disabled]:hover>a:only-child,.ant-search-input:hover .ant-search-btn-noempty[disabled]>a:only-child{color:currentColor}.ant-search-input.ant-search-input-focus .ant-search-btn-noempty.disabled.active>a:only-child:after,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty.disabled:active>a:only-child:after,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty.disabled:focus>a:only-child:after,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty.disabled:hover>a:only-child:after,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty.disabled>a:only-child:after,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty[disabled].active>a:only-child:after,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty[disabled]:active>a:only-child:after,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty[disabled]:focus>a:only-child:after,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty[disabled]:hover>a:only-child:after,.ant-search-input.ant-search-input-focus .ant-search-btn-noempty[disabled]>a:only-child:after,.ant-search-input:hover .ant-search-btn-noempty.disabled.active>a:only-child:after,.ant-search-input:hover .ant-search-btn-noempty.disabled:active>a:only-child:after,.ant-search-input:hover .ant-search-btn-noempty.disabled:focus>a:only-child:after,.ant-search-input:hover .ant-search-btn-noempty.disabled:hover>a:only-child:after,.ant-search-input:hover .ant-search-btn-noempty.disabled>a:only-child:after,.ant-search-input:hover .ant-search-btn-noempty[disabled].active>a:only-child:after,.ant-search-input:hover .ant-search-btn-noempty[disabled]:active>a:only-child:after,.ant-search-input:hover .ant-search-btn-noempty[disabled]:focus>a:only-child:after,.ant-search-input:hover .ant-search-btn-noempty[disabled]:hover>a:only-child:after,.ant-search-input:hover .ant-search-btn-noempty[disabled]>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-search-input .ant-select-combobox .ant-select-selection__rendered{margin-right:29px}.ant-input{position:relative;display:inline-block;padding:4px 7px;width:100%;height:28px;cursor:text;font-size:12px;line-height:1.5;color:rgba(0,0,0,.65);background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:4px;-webkit-transition:all .3s;transition:all .3s}.ant-input::-moz-placeholder{color:#ccc;opacity:1}.ant-input:-ms-input-placeholder{color:#ccc}.ant-input::-webkit-input-placeholder{color:#ccc}.ant-input:focus,.ant-input:hover{border-color:#49a9ee}.ant-input:focus{outline:0;box-shadow:0 0 0 2px rgba(16,142,233,.2)}.ant-input[disabled]{background-color:#f7f7f7;opacity:1;cursor:not-allowed;color:rgba(0,0,0,.25)}.ant-input[disabled]:hover{border-color:#e2e2e2}textarea.ant-input{max-width:100%;height:auto;vertical-align:bottom}.ant-input-lg{padding:6px 7px;height:32px}.ant-input-sm{padding:1px 7px;height:22px}.ant-input-group{position:relative;display:table;border-collapse:separate;border-spacing:0;width:100%}.ant-input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.ant-input-group>[class*=col-]{padding-right:8px}.ant-input-group-addon,.ant-input-group-wrap,.ant-input-group>.ant-input{display:table-cell}.ant-input-group-addon:not(:first-child):not(:last-child),.ant-input-group-wrap:not(:first-child):not(:last-child),.ant-input-group>.ant-input:not(:first-child):not(:last-child){border-radius:0}.ant-input-group-addon,.ant-input-group-wrap{width:1px;white-space:nowrap;vertical-align:middle}.ant-input-group-wrap>*{display:block!important}.ant-input-group .ant-input{float:left;width:100%;margin-bottom:0}.ant-input-group-addon{padding:4px 7px;font-size:12px;font-weight:400;line-height:1;color:rgba(0,0,0,.65);text-align:center;background-color:#eee;border:1px solid #d9d9d9;border-radius:4px;position:relative;-webkit-transition:all .3s;transition:all .3s}.ant-input-group-addon .ant-select{margin:-5px -7px}.ant-input-group-addon .ant-select .ant-select-selection{background-color:inherit;margin:-1px;border:1px solid transparent;box-shadow:none}.ant-input-group-addon .ant-select-focused .ant-select-selection,.ant-input-group-addon .ant-select-open .ant-select-selection{color:#108ee9}.ant-input-group-addon>i:only-child:after{position:absolute;content:"";top:0;left:0;right:0;bottom:0}.ant-input-group-addon:first-child,.ant-input-group-addon:first-child .ant-select .ant-select-selection,.ant-input-group>.ant-input:first-child,.ant-input-group>.ant-input:first-child .ant-select .ant-select-selection,.ant-input-group>span>.ant-input:first-child,.ant-input-group>span>.ant-input:first-child .ant-select .ant-select-selection{border-bottom-right-radius:0;border-top-right-radius:0}.ant-input-group>.ant-input-preSuffix-wrapper:not(:first-child) .ant-input{border-bottom-left-radius:0;border-top-left-radius:0}.ant-input-group>.ant-input-preSuffix-wrapper:not(:last-child) .ant-input{border-bottom-right-radius:0;border-top-right-radius:0}.ant-input-group-addon:first-child{border-right:0}.ant-input-group-addon:last-child{border-left:0}.ant-input-group-addon:last-child,.ant-input-group-addon:last-child .ant-select .ant-select-selection,.ant-input-group>.ant-input:last-child,.ant-input-group>.ant-input:last-child .ant-select .ant-select-selection{border-bottom-left-radius:0;border-top-left-radius:0}.ant-input-group-lg .ant-input,.ant-input-group-lg>.ant-input-group-addon{padding:6px 7px;height:32px}.ant-input-group-sm .ant-input,.ant-input-group-sm>.ant-input-group-addon{padding:1px 7px;height:22px}.ant-input-group .ant-input-preSuffix-wrapper{display:table-cell;width:100%;float:left}.ant-input-group.ant-input-group-compact>*{border-radius:0;border-right-width:0;vertical-align:middle}.ant-input-group.ant-input-group-compact .ant-input{float:none;z-index:auto}.ant-input-group.ant-input-group-compact>.ant-calendar-picker .ant-input,.ant-input-group.ant-input-group-compact>.ant-select>.ant-select-selection{border-radius:0;border-right-width:0}.ant-input-group.ant-input-group-compact>.ant-calendar-picker:first-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-select:first-child>.ant-select-selection,.ant-input-group.ant-input-group-compact>:first-child{border-top-left-radius:4px;border-bottom-left-radius:4px}.ant-input-group.ant-input-group-compact>.ant-calendar-picker:last-child .ant-input,.ant-input-group.ant-input-group-compact>.ant-select:last-child>.ant-select-selection,.ant-input-group.ant-input-group-compact>:last-child{border-top-right-radius:4px;border-bottom-right-radius:4px;border-right-width:1px}.ant-input-preSuffix-wrapper{position:relative;display:inline-block;width:100%}.ant-input-preSuffix-wrapper .ant-input{z-index:1}.ant-input-preSuffix-wrapper:hover .ant-input{border-color:#49a9ee}.ant-input-preSuffix-wrapper .ant-input-prefix,.ant-input-preSuffix-wrapper .ant-input-suffix{position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);z-index:2;line-height:0}.ant-input-preSuffix-wrapper .ant-input-prefix{left:7px}.ant-input-preSuffix-wrapper .ant-input-suffix{right:7px}.ant-input-preSuffix-wrapper .ant-input:not(:first-child){padding-left:24px}.ant-input-preSuffix-wrapper .ant-input:not(:last-child){padding-right:24px}.ant-back-top{z-index:10;position:fixed;right:100px;bottom:50px;height:40px;width:40px;cursor:pointer}.ant-back-top-content{height:40px;width:40px;border-radius:20px;background-color:rgba(64,64,64,.4);color:#fff;text-align:center}.ant-back-top-content,.ant-back-top-content:hover{-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1)}.ant-back-top-content:hover{background-color:rgba(64,64,64,.6)}.ant-back-top-icon{font-size:20px;margin-top:10px}.ant-badge{position:relative;display:inline-block;line-height:1;vertical-align:middle}.ant-badge-count{position:absolute;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);top:-10px;height:20px;border-radius:10px;min-width:20px;background:#f04134;color:#fff;line-height:20px;text-align:center;padding:0 6px;font-size:12px;white-space:nowrap;-webkit-transform-origin:-10% center;-ms-transform-origin:-10% center;transform-origin:-10% center;font-family:tahoma;box-shadow:0 0 0 1px #fff}.ant-badge-count a,.ant-badge-count a:hover{color:#fff}.ant-badge-dot{position:absolute;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);-webkit-transform-origin:0 center;-ms-transform-origin:0 center;transform-origin:0 center;top:-4px;height:8px;width:8px;border-radius:100%;background:#f04134;z-index:10;box-shadow:0 0 0 1px #fff}.ant-badge-status{line-height:inherit;vertical-align:baseline}.ant-badge-status-dot{width:8px;height:8px;display:inline-block;border-radius:50%}.ant-badge-status-success{background-color:#00a854}.ant-badge-status-processing{background-color:#108ee9;position:relative}.ant-badge-status-processing:after{position:absolute;top:0;left:0;width:100%;height:100%;border-radius:50%;border:1px solid #108ee9;content:"";-webkit-animation:antStatusProcessing 1.2s infinite ease-in-out;animation:antStatusProcessing 1.2s infinite ease-in-out}.ant-badge-status-default{background-color:#d9d9d9}.ant-badge-status-error{background-color:#f04134}.ant-badge-status-warning{background-color:#ffbf00}.ant-badge-status-text{color:rgba(0,0,0,.65);font-size:12px;margin-left:8px}.ant-badge-zoom-appear,.ant-badge-zoom-enter{-webkit-animation:antZoomBadgeIn .3s cubic-bezier(.12,.4,.29,1.46);animation:antZoomBadgeIn .3s cubic-bezier(.12,.4,.29,1.46);-webkit-animation-fill-mode:both;animation-fill-mode:both}.ant-badge-zoom-leave{-webkit-animation:antZoomBadgeOut .3s cubic-bezier(.71,-.46,.88,.6);animation:antZoomBadgeOut .3s cubic-bezier(.71,-.46,.88,.6);-webkit-animation-fill-mode:both;animation-fill-mode:both}.ant-badge-not-a-wrapper .ant-badge-count{top:auto;display:block;position:relative;-webkit-transform:none!important;-ms-transform:none!important;transform:none!important}@-webkit-keyframes antStatusProcessing{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:.5}to{-webkit-transform:scale(2.4);transform:scale(2.4);opacity:0}}@keyframes antStatusProcessing{0%{-webkit-transform:scale(.8);transform:scale(.8);opacity:.5}to{-webkit-transform:scale(2.4);transform:scale(2.4);opacity:0}}.ant-scroll-number{overflow:hidden}.ant-scroll-number-only{display:inline-block;-webkit-transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);height:20px}.ant-scroll-number-only>p{height:20px}.ant-scroll-number.not-support-css-animation .ant-scroll-number-only>p{display:none}.ant-scroll-number.not-support-css-animation .ant-scroll-number-only>p.current{display:block}@-webkit-keyframes antZoomBadgeIn{0%{opacity:0;-webkit-transform:scale(0) translateX(-50%);transform:scale(0) translateX(-50%)}to{-webkit-transform:scale(1) translateX(-50%);transform:scale(1) translateX(-50%)}}@keyframes antZoomBadgeIn{0%{opacity:0;-webkit-transform:scale(0) translateX(-50%);transform:scale(0) translateX(-50%)}to{-webkit-transform:scale(1) translateX(-50%);transform:scale(1) translateX(-50%)}}@-webkit-keyframes antZoomBadgeOut{0%{-webkit-transform:scale(1) translateX(-50%);transform:scale(1) translateX(-50%)}to{opacity:0;-webkit-transform:scale(0) translateX(-50%);transform:scale(0) translateX(-50%)}}@keyframes antZoomBadgeOut{0%{-webkit-transform:scale(1) translateX(-50%);transform:scale(1) translateX(-50%)}to{opacity:0;-webkit-transform:scale(0) translateX(-50%);transform:scale(0) translateX(-50%)}}.ant-breadcrumb{color:rgba(0,0,0,.65);font-size:12px}.ant-breadcrumb a{color:rgba(0,0,0,.65);-webkit-transition:color .3s;transition:color .3s}.ant-breadcrumb a:hover{color:#49a9ee}.ant-breadcrumb>span:last-child{font-weight:700;color:rgba(0,0,0,.65)}.ant-breadcrumb>span:last-child .ant-breadcrumb-separator{display:none}.ant-breadcrumb-separator{margin:0 8px;color:rgba(0,0,0,.3)}.ant-breadcrumb-link>.anticon+span{margin-left:4px}.ant-btn{display:inline-block;margin-bottom:0;font-weight:500;text-align:center;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;line-height:1.5;padding:4px 15px;font-size:12px;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);position:relative;color:rgba(0,0,0,.65);background-color:#fff;border-color:#d9d9d9}.ant-btn>.anticon{line-height:1}.ant-btn,.ant-btn:active,.ant-btn:focus{outline:0}.ant-btn:not([disabled]):hover{text-decoration:none}.ant-btn:not([disabled]):active{outline:0;-webkit-transition:none;transition:none}.ant-btn.disabled,.ant-btn[disabled]{cursor:not-allowed}.ant-btn.disabled>*,.ant-btn[disabled]>*{pointer-events:none}.ant-btn-lg{padding:4px 15px 5px;font-size:14px;border-radius:4px}.ant-btn-sm{padding:1px 7px;font-size:12px;border-radius:4px}.ant-btn>a:only-child{color:currentColor}.ant-btn>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn:focus,.ant-btn:hover{color:#49a9ee;background-color:#fff;border-color:#49a9ee}.ant-btn:focus>a:only-child,.ant-btn:hover>a:only-child{color:currentColor}.ant-btn:focus>a:only-child:after,.ant-btn:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn.active,.ant-btn:active{color:#0e77ca;background-color:#fff;border-color:#0e77ca}.ant-btn.active>a:only-child,.ant-btn:active>a:only-child{color:currentColor}.ant-btn.active>a:only-child:after,.ant-btn:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn.disabled,.ant-btn.disabled.active,.ant-btn.disabled:active,.ant-btn.disabled:focus,.ant-btn.disabled:hover,.ant-btn[disabled],.ant-btn[disabled].active,.ant-btn[disabled]:active,.ant-btn[disabled]:focus,.ant-btn[disabled]:hover{color:rgba(0,0,0,.25);background-color:#f7f7f7;border-color:#d9d9d9}.ant-btn.disabled.active>a:only-child,.ant-btn.disabled:active>a:only-child,.ant-btn.disabled:focus>a:only-child,.ant-btn.disabled:hover>a:only-child,.ant-btn.disabled>a:only-child,.ant-btn[disabled].active>a:only-child,.ant-btn[disabled]:active>a:only-child,.ant-btn[disabled]:focus>a:only-child,.ant-btn[disabled]:hover>a:only-child,.ant-btn[disabled]>a:only-child{color:currentColor}.ant-btn.disabled.active>a:only-child:after,.ant-btn.disabled:active>a:only-child:after,.ant-btn.disabled:focus>a:only-child:after,.ant-btn.disabled:hover>a:only-child:after,.ant-btn.disabled>a:only-child:after,.ant-btn[disabled].active>a:only-child:after,.ant-btn[disabled]:active>a:only-child:after,.ant-btn[disabled]:focus>a:only-child:after,.ant-btn[disabled]:hover>a:only-child:after,.ant-btn[disabled]>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn.active,.ant-btn:active,.ant-btn:focus,.ant-btn:hover{background:#fff}.ant-btn-primary{color:#fff;background-color:#108ee9;border-color:#108ee9}.ant-btn-primary>a:only-child{color:currentColor}.ant-btn-primary>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-primary:focus,.ant-btn-primary:hover{color:#fff;background-color:#49a9ee;border-color:#49a9ee}.ant-btn-primary:focus>a:only-child,.ant-btn-primary:hover>a:only-child{color:currentColor}.ant-btn-primary:focus>a:only-child:after,.ant-btn-primary:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-primary.active,.ant-btn-primary:active{color:#fff;background-color:#0e77ca;border-color:#0e77ca}.ant-btn-primary.active>a:only-child,.ant-btn-primary:active>a:only-child{color:currentColor}.ant-btn-primary.active>a:only-child:after,.ant-btn-primary:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-primary.disabled,.ant-btn-primary.disabled.active,.ant-btn-primary.disabled:active,.ant-btn-primary.disabled:focus,.ant-btn-primary.disabled:hover,.ant-btn-primary[disabled],.ant-btn-primary[disabled].active,.ant-btn-primary[disabled]:active,.ant-btn-primary[disabled]:focus,.ant-btn-primary[disabled]:hover{color:rgba(0,0,0,.25);background-color:#f7f7f7;border-color:#d9d9d9}.ant-btn-primary.disabled.active>a:only-child,.ant-btn-primary.disabled:active>a:only-child,.ant-btn-primary.disabled:focus>a:only-child,.ant-btn-primary.disabled:hover>a:only-child,.ant-btn-primary.disabled>a:only-child,.ant-btn-primary[disabled].active>a:only-child,.ant-btn-primary[disabled]:active>a:only-child,.ant-btn-primary[disabled]:focus>a:only-child,.ant-btn-primary[disabled]:hover>a:only-child,.ant-btn-primary[disabled]>a:only-child{color:currentColor}.ant-btn-primary.disabled.active>a:only-child:after,.ant-btn-primary.disabled:active>a:only-child:after,.ant-btn-primary.disabled:focus>a:only-child:after,.ant-btn-primary.disabled:hover>a:only-child:after,.ant-btn-primary.disabled>a:only-child:after,.ant-btn-primary[disabled].active>a:only-child:after,.ant-btn-primary[disabled]:active>a:only-child:after,.ant-btn-primary[disabled]:focus>a:only-child:after,.ant-btn-primary[disabled]:hover>a:only-child:after,.ant-btn-primary[disabled]>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child){border-right-color:#0e77ca;border-left-color:#0e77ca}.ant-btn-group .ant-btn-primary:not(:first-child):not(:last-child):disabled{border-color:#d9d9d9}.ant-btn-group .ant-btn-primary:first-child:not(:last-child){border-right-color:#0e77ca}.ant-btn-group .ant-btn-primary:first-child:not(:last-child)[disabled]{border-right-color:#d9d9d9}.ant-btn-group .ant-btn-primary+.ant-btn-primary,.ant-btn-group .ant-btn-primary:last-child:not(:first-child){border-left-color:#0e77ca}.ant-btn-group .ant-btn-primary+.ant-btn-primary[disabled],.ant-btn-group .ant-btn-primary:last-child:not(:first-child)[disabled]{border-left-color:#d9d9d9}.ant-btn-ghost{color:rgba(0,0,0,.65);background-color:transparent;border-color:#d9d9d9}.ant-btn-ghost>a:only-child{color:currentColor}.ant-btn-ghost>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-ghost:focus,.ant-btn-ghost:hover{color:#49a9ee;background-color:transparent;border-color:#49a9ee}.ant-btn-ghost:focus>a:only-child,.ant-btn-ghost:hover>a:only-child{color:currentColor}.ant-btn-ghost:focus>a:only-child:after,.ant-btn-ghost:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-ghost.active,.ant-btn-ghost:active{color:#0e77ca;background-color:transparent;border-color:#0e77ca}.ant-btn-ghost.active>a:only-child,.ant-btn-ghost:active>a:only-child{color:currentColor}.ant-btn-ghost.active>a:only-child:after,.ant-btn-ghost:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-ghost.disabled,.ant-btn-ghost.disabled.active,.ant-btn-ghost.disabled:active,.ant-btn-ghost.disabled:focus,.ant-btn-ghost.disabled:hover,.ant-btn-ghost[disabled],.ant-btn-ghost[disabled].active,.ant-btn-ghost[disabled]:active,.ant-btn-ghost[disabled]:focus,.ant-btn-ghost[disabled]:hover{color:rgba(0,0,0,.25);background-color:#f7f7f7;border-color:#d9d9d9}.ant-btn-ghost.disabled.active>a:only-child,.ant-btn-ghost.disabled:active>a:only-child,.ant-btn-ghost.disabled:focus>a:only-child,.ant-btn-ghost.disabled:hover>a:only-child,.ant-btn-ghost.disabled>a:only-child,.ant-btn-ghost[disabled].active>a:only-child,.ant-btn-ghost[disabled]:active>a:only-child,.ant-btn-ghost[disabled]:focus>a:only-child,.ant-btn-ghost[disabled]:hover>a:only-child,.ant-btn-ghost[disabled]>a:only-child{color:currentColor}.ant-btn-ghost.disabled.active>a:only-child:after,.ant-btn-ghost.disabled:active>a:only-child:after,.ant-btn-ghost.disabled:focus>a:only-child:after,.ant-btn-ghost.disabled:hover>a:only-child:after,.ant-btn-ghost.disabled>a:only-child:after,.ant-btn-ghost[disabled].active>a:only-child:after,.ant-btn-ghost[disabled]:active>a:only-child:after,.ant-btn-ghost[disabled]:focus>a:only-child:after,.ant-btn-ghost[disabled]:hover>a:only-child:after,.ant-btn-ghost[disabled]>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-dashed{color:rgba(0,0,0,.65);background-color:#fff;border-color:#d9d9d9;border-style:dashed}.ant-btn-dashed>a:only-child{color:currentColor}.ant-btn-dashed>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-dashed:focus,.ant-btn-dashed:hover{color:#49a9ee;background-color:#fff;border-color:#49a9ee}.ant-btn-dashed:focus>a:only-child,.ant-btn-dashed:hover>a:only-child{color:currentColor}.ant-btn-dashed:focus>a:only-child:after,.ant-btn-dashed:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-dashed.active,.ant-btn-dashed:active{color:#0e77ca;background-color:#fff;border-color:#0e77ca}.ant-btn-dashed.active>a:only-child,.ant-btn-dashed:active>a:only-child{color:currentColor}.ant-btn-dashed.active>a:only-child:after,.ant-btn-dashed:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-dashed.disabled,.ant-btn-dashed.disabled.active,.ant-btn-dashed.disabled:active,.ant-btn-dashed.disabled:focus,.ant-btn-dashed.disabled:hover,.ant-btn-dashed[disabled],.ant-btn-dashed[disabled].active,.ant-btn-dashed[disabled]:active,.ant-btn-dashed[disabled]:focus,.ant-btn-dashed[disabled]:hover{color:rgba(0,0,0,.25);background-color:#f7f7f7;border-color:#d9d9d9}.ant-btn-dashed.disabled.active>a:only-child,.ant-btn-dashed.disabled:active>a:only-child,.ant-btn-dashed.disabled:focus>a:only-child,.ant-btn-dashed.disabled:hover>a:only-child,.ant-btn-dashed.disabled>a:only-child,.ant-btn-dashed[disabled].active>a:only-child,.ant-btn-dashed[disabled]:active>a:only-child,.ant-btn-dashed[disabled]:focus>a:only-child,.ant-btn-dashed[disabled]:hover>a:only-child,.ant-btn-dashed[disabled]>a:only-child{color:currentColor}.ant-btn-dashed.disabled.active>a:only-child:after,.ant-btn-dashed.disabled:active>a:only-child:after,.ant-btn-dashed.disabled:focus>a:only-child:after,.ant-btn-dashed.disabled:hover>a:only-child:after,.ant-btn-dashed.disabled>a:only-child:after,.ant-btn-dashed[disabled].active>a:only-child:after,.ant-btn-dashed[disabled]:active>a:only-child:after,.ant-btn-dashed[disabled]:focus>a:only-child:after,.ant-btn-dashed[disabled]:hover>a:only-child:after,.ant-btn-dashed[disabled]>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-danger{color:#fff;background-color:#f04134;border-color:#f04134}.ant-btn-danger>a:only-child{color:currentColor}.ant-btn-danger>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-danger:focus,.ant-btn-danger:hover{color:#fff;background-color:#f46e65;border-color:#f46e65}.ant-btn-danger:focus>a:only-child,.ant-btn-danger:hover>a:only-child{color:currentColor}.ant-btn-danger:focus>a:only-child:after,.ant-btn-danger:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-danger.active,.ant-btn-danger:active{color:#fff;background-color:#d73435;border-color:#d73435}.ant-btn-danger.active>a:only-child,.ant-btn-danger:active>a:only-child{color:currentColor}.ant-btn-danger.active>a:only-child:after,.ant-btn-danger:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-danger.disabled,.ant-btn-danger.disabled.active,.ant-btn-danger.disabled:active,.ant-btn-danger.disabled:focus,.ant-btn-danger.disabled:hover,.ant-btn-danger[disabled],.ant-btn-danger[disabled].active,.ant-btn-danger[disabled]:active,.ant-btn-danger[disabled]:focus,.ant-btn-danger[disabled]:hover{color:rgba(0,0,0,.25);background-color:#f7f7f7;border-color:#d9d9d9}.ant-btn-danger.disabled.active>a:only-child,.ant-btn-danger.disabled:active>a:only-child,.ant-btn-danger.disabled:focus>a:only-child,.ant-btn-danger.disabled:hover>a:only-child,.ant-btn-danger.disabled>a:only-child,.ant-btn-danger[disabled].active>a:only-child,.ant-btn-danger[disabled]:active>a:only-child,.ant-btn-danger[disabled]:focus>a:only-child,.ant-btn-danger[disabled]:hover>a:only-child,.ant-btn-danger[disabled]>a:only-child{color:currentColor}.ant-btn-danger.disabled.active>a:only-child:after,.ant-btn-danger.disabled:active>a:only-child:after,.ant-btn-danger.disabled:focus>a:only-child:after,.ant-btn-danger.disabled:hover>a:only-child:after,.ant-btn-danger.disabled>a:only-child:after,.ant-btn-danger[disabled].active>a:only-child:after,.ant-btn-danger[disabled]:active>a:only-child:after,.ant-btn-danger[disabled]:focus>a:only-child:after,.ant-btn-danger[disabled]:hover>a:only-child:after,.ant-btn-danger[disabled]>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-circle,.ant-btn-circle-outline{width:28px;height:28px;padding:0;font-size:14px;border-radius:50%}.ant-btn-circle-outline.ant-btn-lg,.ant-btn-circle.ant-btn-lg{width:32px;height:32px;padding:0;font-size:16px;border-radius:50%}.ant-btn-circle-outline.ant-btn-sm,.ant-btn-circle.ant-btn-sm{width:22px;height:22px;padding:0;font-size:12px;border-radius:50%}.ant-btn:before{position:absolute;top:-1px;left:-1px;bottom:-1px;right:-1px;background:#fff;opacity:.35;content:"";border-radius:inherit;z-index:1;-webkit-transition:opacity .2s;transition:opacity .2s;pointer-events:none;display:none}.ant-btn.ant-btn-loading:before{display:block}.ant-btn .anticon{-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1)}.ant-btn.ant-btn-loading:not(.ant-btn-circle):not(.ant-btn-circle-outline){padding-left:29px;pointer-events:none;position:relative}.ant-btn.ant-btn-loading:not(.ant-btn-circle):not(.ant-btn-circle-outline) .anticon{margin-left:-14px}.ant-btn-sm.ant-btn-loading:not(.ant-btn-circle):not(.ant-btn-circle-outline){padding-left:24px}.ant-btn-sm.ant-btn-loading:not(.ant-btn-circle):not(.ant-btn-circle-outline) .anticon{margin-left:-17px}.ant-btn-group{position:relative;display:inline-block}.ant-btn-group>.ant-btn{position:relative;z-index:1}.ant-btn-group>.ant-btn.active,.ant-btn-group>.ant-btn:active,.ant-btn-group>.ant-btn:focus,.ant-btn-group>.ant-btn:hover{z-index:2}.ant-btn-group>.ant-btn:disabled{z-index:0}.ant-btn-group-lg>.ant-btn{padding:4px 15px 5px;font-size:14px;border-radius:4px}.ant-btn-group-sm>.ant-btn{padding:1px 7px;font-size:12px;border-radius:4px}.ant-btn-group-sm>.ant-btn>.anticon{font-size:12px}.ant-btn+.ant-btn-group,.ant-btn-group+.ant-btn,.ant-btn-group+.ant-btn-group,.ant-btn-group .ant-btn+.ant-btn{margin-left:-1px}.ant-btn-group .ant-btn:not(:first-child):not(:last-child){border-radius:0;padding-left:8px;padding-right:8px}.ant-btn-group>.ant-btn:first-child{margin-left:0}.ant-btn-group>.ant-btn:first-child:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;padding-right:8px}.ant-btn-group>.ant-btn:last-child:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0;padding-left:8px}.ant-btn-group>.ant-btn-group{float:left}.ant-btn-group>.ant-btn-group:not(:first-child):not(:last-child)>.ant-btn{border-radius:0}.ant-btn-group>.ant-btn-group:first-child:not(:last-child)>.ant-btn:last-child{border-bottom-right-radius:0;border-top-right-radius:0;padding-right:8px}.ant-btn-group>.ant-btn-group:last-child:not(:first-child)>.ant-btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0;padding-left:8px}.ant-btn:not(.ant-btn-circle):not(.ant-btn-circle-outline).ant-btn-icon-only{padding-left:8px;padding-right:8px}.ant-btn:active>span,.ant-btn:focus>span{position:relative}.ant-btn>.anticon+span,.ant-btn>span+.anticon{margin-left:.5em}.ant-btn-clicked:after{content:"";position:absolute;top:-1px;left:-1px;bottom:-1px;right:-1px;border-radius:inherit;border:0 solid #108ee9;opacity:.4;-webkit-animation:buttonEffect .4s;animation:buttonEffect .4s;display:block}.ant-btn-danger.ant-btn-clicked:after{border-color:#f04134}.ant-btn-background-ghost{background:transparent!important;border-color:#fff;color:#fff}.ant-btn-background-ghost.ant-btn-primary{color:#108ee9;background-color:transparent;border-color:#108ee9}.ant-btn-background-ghost.ant-btn-primary>a:only-child{color:currentColor}.ant-btn-background-ghost.ant-btn-primary>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-background-ghost.ant-btn-primary:focus,.ant-btn-background-ghost.ant-btn-primary:hover{color:#49a9ee;background-color:transparent;border-color:#49a9ee}.ant-btn-background-ghost.ant-btn-primary:focus>a:only-child,.ant-btn-background-ghost.ant-btn-primary:hover>a:only-child{color:currentColor}.ant-btn-background-ghost.ant-btn-primary:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-background-ghost.ant-btn-primary.active,.ant-btn-background-ghost.ant-btn-primary:active{color:#0e77ca;background-color:transparent;border-color:#0e77ca}.ant-btn-background-ghost.ant-btn-primary.active>a:only-child,.ant-btn-background-ghost.ant-btn-primary:active>a:only-child{color:currentColor}.ant-btn-background-ghost.ant-btn-primary.active>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-btn-background-ghost.ant-btn-primary.disabled,.ant-btn-background-ghost.ant-btn-primary.disabled.active,.ant-btn-background-ghost.ant-btn-primary.disabled:active,.ant-btn-background-ghost.ant-btn-primary.disabled:focus,.ant-btn-background-ghost.ant-btn-primary.disabled:hover,.ant-btn-background-ghost.ant-btn-primary[disabled],.ant-btn-background-ghost.ant-btn-primary[disabled].active,.ant-btn-background-ghost.ant-btn-primary[disabled]:active,.ant-btn-background-ghost.ant-btn-primary[disabled]:focus,.ant-btn-background-ghost.ant-btn-primary[disabled]:hover{color:rgba(0,0,0,.25);background-color:#f7f7f7;border-color:#d9d9d9}.ant-btn-background-ghost.ant-btn-primary.disabled.active>a:only-child,.ant-btn-background-ghost.ant-btn-primary.disabled:active>a:only-child,.ant-btn-background-ghost.ant-btn-primary.disabled:focus>a:only-child,.ant-btn-background-ghost.ant-btn-primary.disabled:hover>a:only-child,.ant-btn-background-ghost.ant-btn-primary.disabled>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled].active>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled]:active>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled]:focus>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled]:hover>a:only-child,.ant-btn-background-ghost.ant-btn-primary[disabled]>a:only-child{color:currentColor}.ant-btn-background-ghost.ant-btn-primary.disabled.active>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary.disabled:active>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary.disabled:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary.disabled:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary.disabled>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled].active>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled]:active>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled]:focus>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled]:hover>a:only-child:after,.ant-btn-background-ghost.ant-btn-primary[disabled]>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}@-webkit-keyframes buttonEffect{to{opacity:0;top:-6px;left:-6px;bottom:-6px;right:-6px;border-width:6px}}@keyframes buttonEffect{to{opacity:0;top:-6px;left:-6px;bottom:-6px;right:-6px;border-width:6px}}.ant-fullcalendar{font-size:12px;line-height:1.5;outline:none;border-top:1px solid #d9d9d9}.ant-fullcalendar-month-select{margin-left:5px}.ant-fullcalendar-header{padding:11px 16px 11px 0;text-align:right}.ant-fullcalendar-header .ant-select{text-align:left}.ant-fullcalendar-header .ant-radio-group{margin-left:8px;text-align:left}.ant-fullcalendar-header label.ant-radio-button{height:22px;line-height:20px;padding:0 10px}.ant-fullcalendar-date-panel{position:relative;outline:none}.ant-fullcalendar-calendar-body{padding:8px 8px 14px}.ant-fullcalendar table{border-collapse:collapse;max-width:100%;background-color:transparent;width:100%;height:246px}.ant-fullcalendar table,.ant-fullcalendar td,.ant-fullcalendar th{border:0}.ant-fullcalendar td{position:relative}.ant-fullcalendar-calendar-table{border-spacing:0;margin-bottom:0}.ant-fullcalendar-column-header{line-height:18px;padding:0;width:33px;text-align:center}.ant-fullcalendar-column-header .ant-fullcalendar-column-header-inner{display:block;font-weight:400}.ant-fullcalendar-week-number-header .ant-fullcalendar-column-header-inner{display:none}.ant-fullcalendar-date,.ant-fullcalendar-month{text-align:center;-webkit-transition:all .3s;transition:all .3s}.ant-fullcalendar-value{display:block;margin:0 auto;color:rgba(0,0,0,.65);border-radius:4px;width:22px;height:22px;padding:0;background:transparent;line-height:22px;-webkit-transition:all .3s;transition:all .3s}.ant-fullcalendar-value:hover{background:#ecf6fd;cursor:pointer}.ant-fullcalendar-value:active{background:#108ee9;color:#fff}.ant-fullcalendar-month-panel-cell .ant-fullcalendar-value{width:48px}.ant-fullcalendar-month-panel-current-cell .ant-fullcalendar-value,.ant-fullcalendar-today .ant-fullcalendar-value{box-shadow:0 0 0 1px #108ee9}.ant-fullcalendar-month-panel-selected-cell .ant-fullcalendar-value,.ant-fullcalendar-selected-day .ant-fullcalendar-value{background:#108ee9;color:#fff}.ant-fullcalendar-disabled-cell .ant-fullcalendar-value{cursor:not-allowed;color:rgba(0,0,0,.25);background:#f7f7f7;border-radius:0;width:auto}.ant-fullcalendar-disabled-cell .ant-fullcalendar-value:hover{background:#f7f7f7}.ant-fullcalendar-disabled-cell-first-of-row .ant-fullcalendar-value{border-top-left-radius:4px;border-bottom-left-radius:4px}.ant-fullcalendar-disabled-cell-last-of-row .ant-fullcalendar-value{border-top-right-radius:4px;border-bottom-right-radius:4px}.ant-fullcalendar-last-month-cell .ant-fullcalendar-value,.ant-fullcalendar-next-month-btn-day .ant-fullcalendar-value{color:rgba(0,0,0,.25)}.ant-fullcalendar-month-panel-table{table-layout:fixed;width:100%;border-collapse:separate}.ant-fullcalendar-content{position:absolute;width:100%;left:0;bottom:-9px}.ant-fullcalendar-fullscreen{border-top:0}.ant-fullcalendar-fullscreen .ant-fullcalendar-table{table-layout:fixed}.ant-fullcalendar-fullscreen .ant-fullcalendar-header .ant-radio-group{margin-left:16px}.ant-fullcalendar-fullscreen .ant-fullcalendar-header label.ant-radio-button{height:28px;line-height:26px}.ant-fullcalendar-fullscreen .ant-fullcalendar-date,.ant-fullcalendar-fullscreen .ant-fullcalendar-month{text-align:left;margin:0 4px;display:block;color:rgba(0,0,0,.65);height:116px;padding:4px 8px;border-top:2px solid #e9e9e9;-webkit-transition:background .3s;transition:background .3s}.ant-fullcalendar-fullscreen .ant-fullcalendar-date:hover,.ant-fullcalendar-fullscreen .ant-fullcalendar-month:hover{background:#ecf6fd;cursor:pointer}.ant-fullcalendar-fullscreen .ant-fullcalendar-date:active,.ant-fullcalendar-fullscreen .ant-fullcalendar-month:active{background:#d2eafb}.ant-fullcalendar-fullscreen .ant-fullcalendar-column-header{text-align:right;padding-right:12px;padding-bottom:5px}.ant-fullcalendar-fullscreen .ant-fullcalendar-value{text-align:right;background:transparent;width:auto}.ant-fullcalendar-fullscreen .ant-fullcalendar-today .ant-fullcalendar-value{color:rgba(0,0,0,.65)}.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-current-cell .ant-fullcalendar-month,.ant-fullcalendar-fullscreen .ant-fullcalendar-today .ant-fullcalendar-date{border-top-color:#108ee9;background:transparent}.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-current-cell .ant-fullcalendar-value,.ant-fullcalendar-fullscreen .ant-fullcalendar-today .ant-fullcalendar-value{box-shadow:none}.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-selected-cell .ant-fullcalendar-month,.ant-fullcalendar-fullscreen .ant-fullcalendar-selected-day .ant-fullcalendar-date{background:#ecf6fd}.ant-fullcalendar-fullscreen .ant-fullcalendar-month-panel-selected-cell .ant-fullcalendar-value,.ant-fullcalendar-fullscreen .ant-fullcalendar-selected-day .ant-fullcalendar-value{color:#108ee9}.ant-fullcalendar-fullscreen .ant-fullcalendar-last-month-cell .ant-fullcalendar-date,.ant-fullcalendar-fullscreen .ant-fullcalendar-next-month-btn-day .ant-fullcalendar-date{color:rgba(0,0,0,.25)}.ant-fullcalendar-fullscreen .ant-fullcalendar-content{height:90px;overflow-y:auto;position:static;width:auto;left:auto;bottom:auto}.ant-radio-group{display:inline-block;font-size:12px}.ant-radio-wrapper{font-size:12px;margin-right:8px}.ant-radio,.ant-radio-wrapper{display:inline-block;position:relative;white-space:nowrap;cursor:pointer}.ant-radio{outline:none;line-height:1;vertical-align:middle}.ant-radio-focused .ant-radio-inner,.ant-radio-wrapper:hover .ant-radio .ant-radio-inner,.ant-radio:hover .ant-radio-inner{border-color:#108ee9}.ant-radio-inner{position:relative;top:0;left:0;display:block;width:14px;height:14px;border-radius:14px;border:1px solid #d9d9d9;background-color:#fff;-webkit-transition:all .3s;transition:all .3s}.ant-radio-inner:after{position:absolute;width:6px;height:6px;left:3px;top:3px;border-radius:4px;display:table;border-top:0;border-left:0;content:" ";background-color:#108ee9;opacity:0;-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-transition:all .3s cubic-bezier(.78,.14,.15,.86);transition:all .3s cubic-bezier(.78,.14,.15,.86)}.ant-radio-input{position:absolute;left:0;z-index:1;cursor:pointer;opacity:0;top:0;bottom:0;right:0}.ant-radio-checked .ant-radio-inner{border-color:#108ee9}.ant-radio-checked .ant-radio-inner:after{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);opacity:1;-webkit-transition:all .3s cubic-bezier(.78,.14,.15,.86);transition:all .3s cubic-bezier(.78,.14,.15,.86)}.ant-radio-disabled .ant-radio-inner{border-color:#d9d9d9!important;background-color:#f3f3f3}.ant-radio-disabled .ant-radio-inner:after{background-color:#ccc}.ant-radio-disabled+span{color:rgba(0,0,0,.25);cursor:not-allowed}span.ant-radio+*{padding-left:8px;padding-right:8px;vertical-align:middle}.ant-radio-button-wrapper{margin:0;height:28px;line-height:26px;color:rgba(0,0,0,.65);display:inline-block;-webkit-transition:all .3s ease;transition:all .3s ease;cursor:pointer;border:1px solid #d9d9d9;border-left:0;background:#fff;padding:0 16px}.ant-radio-button-wrapper a{color:rgba(0,0,0,.65)}.ant-radio-button-wrapper>.ant-radio-button{margin-left:0;display:block;width:0;height:0}.ant-radio-group-large .ant-radio-button-wrapper{height:32px;line-height:30px}.ant-radio-group-small .ant-radio-button-wrapper{height:22px;line-height:20px;padding:0 12px}.ant-radio-group-small .ant-radio-button-wrapper:first-child{border-radius:2px 0 0 2px}.ant-radio-group-small .ant-radio-button-wrapper:last-child{border-radius:0 2px 2px 0}.ant-radio-button-wrapper:first-child{border-radius:4px 0 0 4px;border-left:1px solid #d9d9d9}.ant-radio-button-wrapper:last-child{border-radius:0 4px 4px 0}.ant-radio-button-wrapper:first-child:last-child{border-radius:4px}.ant-radio-button-wrapper-focused,.ant-radio-button-wrapper:hover{color:#108ee9;position:relative}.ant-radio-button-wrapper .ant-radio-inner,.ant-radio-button-wrapper input[type=checkbox],.ant-radio-button-wrapper input[type=radio]{opacity:0;filter:alpha(opacity=0);width:0;height:0}.ant-radio-button-wrapper-checked{background:#fff;border-color:#108ee9;color:#108ee9;box-shadow:-1px 0 0 0 #108ee9}.ant-radio-button-wrapper-checked:first-child{border-color:#108ee9;box-shadow:none!important}.ant-radio-button-wrapper-checked:hover{border-color:#49a9ee;box-shadow:-1px 0 0 0 #49a9ee;color:#49a9ee}.ant-radio-button-wrapper-checked:active{border-color:#0e77ca;box-shadow:-1px 0 0 0 #0e77ca;color:#0e77ca}.ant-radio-button-wrapper-disabled{cursor:not-allowed}.ant-radio-button-wrapper-disabled,.ant-radio-button-wrapper-disabled:first-child,.ant-radio-button-wrapper-disabled:hover{border-color:#d9d9d9;background-color:#f7f7f7;color:rgba(0,0,0,.25)}.ant-radio-button-wrapper-disabled:first-child{border-left-color:#d9d9d9}.ant-radio-button-wrapper-disabled.ant-radio-button-wrapper-checked{color:#fff;background-color:#e6e6e6;border-color:#d9d9d9;box-shadow:none}.ant-card{background:#fff;border-radius:4px;font-size:12px;position:relative;overflow:hidden;-webkit-transition:all .3s;transition:all .3s}.ant-card:hover{box-shadow:0 1px 6px rgba(0,0,0,.2);border-color:transparent}.ant-card-bordered{border:1px solid #e9e9e9}.ant-card-head{height:48px;line-height:48px;border-bottom:1px solid #e9e9e9;padding:0 24px}.ant-card-head-title{font-size:14px;display:inline-block;text-overflow:ellipsis;width:100%;overflow:hidden;white-space:nowrap;color:rgba(0,0,0,.85);font-weight:500}.ant-card-extra{position:absolute;right:24px;top:14px}.ant-card-body{padding:24px}.ant-card-loading .ant-card-body{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-card-loading-block{display:inline-block;margin:5px 1% 0;height:14px;border-radius:2px;background:-webkit-linear-gradient(left,rgba(207,216,220,.2),rgba(207,216,220,.4),rgba(207,216,220,.2));background:linear-gradient(90deg,rgba(207,216,220,.2),rgba(207,216,220,.4),rgba(207,216,220,.2));-webkit-animation:card-loading 1.4s ease infinite;animation:card-loading 1.4s ease infinite;background-size:600% 600%}@-webkit-keyframes card-loading{0%,to{background-position:0 50%}50%{background-position:100% 50%}}@keyframes card-loading{0%,to{background-position:0 50%}50%{background-position:100% 50%}}.ant-carousel .slick-slider{position:relative;display:block;box-sizing:border-box;-webkit-touch-callout:none;-ms-touch-action:pan-y;touch-action:pan-y;-webkit-tap-highlight-color:transparent}.ant-carousel .slick-list{position:relative;overflow:hidden;display:block;margin:0;padding:0}.ant-carousel .slick-list:focus{outline:none}.ant-carousel .slick-list.dragging{cursor:pointer}.ant-carousel .slick-slider .slick-list,.ant-carousel .slick-slider .slick-track{-webkit-transform:translateZ(0);transform:translateZ(0)}.ant-carousel .slick-track{position:relative;left:0;top:0;display:block}.ant-carousel .slick-track:after,.ant-carousel .slick-track:before{content:"";display:table}.ant-carousel .slick-track:after{clear:both}.slick-loading .ant-carousel .slick-track{visibility:hidden}.ant-carousel .slick-slide{float:left;height:100%;min-height:1px;display:none}[dir=rtl] .ant-carousel .slick-slide{float:right}.ant-carousel .slick-slide img{display:block}.ant-carousel .slick-slide.slick-loading img{display:none}.ant-carousel .slick-slide.dragging img{pointer-events:none}.ant-carousel .slick-initialized .slick-slide{display:block}.ant-carousel .slick-loading .slick-slide{visibility:hidden}.ant-carousel .slick-vertical .slick-slide{display:block;height:auto;border:1px solid transparent}.ant-carousel .slick-arrow.slick-hidden{display:none}.ant-carousel .slick-next,.ant-carousel .slick-prev{position:absolute;display:block;height:20px;width:20px;line-height:0;font-size:0;cursor:pointer;top:50%;margin-top:-10px;padding:0;border:0}.ant-carousel .slick-next,.ant-carousel .slick-next:focus,.ant-carousel .slick-next:hover,.ant-carousel .slick-prev,.ant-carousel .slick-prev:focus,.ant-carousel .slick-prev:hover{background:transparent;color:transparent;outline:none}.ant-carousel .slick-next:focus:before,.ant-carousel .slick-next:hover:before,.ant-carousel .slick-prev:focus:before,.ant-carousel .slick-prev:hover:before{opacity:1}.ant-carousel .slick-next.slick-disabled:before,.ant-carousel .slick-prev.slick-disabled:before{opacity:.25}.ant-carousel .slick-prev{left:-25px}.ant-carousel .slick-prev:before{content:"\2190"}.ant-carousel .slick-next{right:-25px}.ant-carousel .slick-next:before{content:"\2192"}.ant-carousel .slick-dots{position:absolute;bottom:12px;list-style:none;display:block;text-align:center;padding:0;width:100%;height:3px}.ant-carousel .slick-dots li{position:relative;display:inline-block;vertical-align:top;text-align:center;margin:0 2px;padding:0}.ant-carousel .slick-dots li button{border:0;cursor:pointer;background:#fff;opacity:.3;display:block;width:16px;height:3px;border-radius:1px;outline:none;font-size:0;color:transparent;-webkit-transition:all .5s;transition:all .5s}.ant-carousel .slick-dots li button:focus,.ant-carousel .slick-dots li button:hover{opacity:.75}.ant-carousel .slick-dots li.slick-active button{background:#fff;opacity:1;width:24px}.ant-carousel .slick-dots li.slick-active button:focus,.ant-carousel .slick-dots li.slick-active button:hover{opacity:1}.ant-carousel-vertical .slick-dots{width:3px;bottom:auto;right:12px;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);height:auto}.ant-carousel-vertical .slick-dots li{margin:0 2px;vertical-align:baseline}.ant-carousel-vertical .slick-dots li button{width:3px;height:16px}.ant-carousel-vertical .slick-dots li.slick-active button{width:3px;height:24px}.ant-cascader{font-size:12px}.ant-cascader-input.ant-input{background-color:transparent!important;cursor:pointer;width:100%;z-index:1}.ant-cascader-picker{position:relative;display:inline-block;cursor:pointer;font-size:12px;background-color:#fff;border-radius:4px;outline:0}.ant-cascader-picker-with-value .ant-cascader-picker-label{color:transparent}.ant-cascader-picker-disabled{cursor:not-allowed;background:#f7f7f7;color:rgba(0,0,0,.25)}.ant-cascader-picker-disabled .ant-cascader-input{cursor:not-allowed}.ant-cascader-picker:focus .ant-cascader-input{border-color:#49a9ee;outline:0;box-shadow:0 0 0 2px rgba(16,142,233,.2)}.ant-cascader-picker-label{position:absolute;left:0;height:20px;line-height:20px;top:50%;margin-top:-10px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;width:100%;padding:0 12px 0 8px}.ant-cascader-picker-clear{opacity:0;position:absolute;right:8px;z-index:2;background:#fff;top:50%;font-size:12px;color:rgba(0,0,0,.25);width:12px;height:12px;margin-top:-6px;line-height:12px;cursor:pointer;-webkit-transition:color .3s ease,opacity .15s ease;transition:color .3s ease,opacity .15s ease}.ant-cascader-picker-clear:hover{color:rgba(0,0,0,.43)}.ant-cascader-picker:hover .ant-cascader-picker-clear{opacity:1}.ant-cascader-picker-arrow{position:absolute;z-index:1;top:50%;right:8px;width:12px;height:12px;margin-top:-6px;line-height:12px;color:rgba(0,0,0,.43);display:inline-block;font-size:12px;font-size:9px\9;-webkit-transform:scale(.75) rotate(0deg);-ms-transform:scale(.75) rotate(0deg);transform:scale(.75) rotate(0deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";zoom:1}:root .ant-cascader-picker-arrow{-webkit-filter:none;filter:none;font-size:12px}.ant-cascader-picker-arrow:before{-webkit-transition:-webkit-transform .2s ease;transition:-webkit-transform .2s ease;transition:transform .2s ease;transition:transform .2s ease,-webkit-transform .2s ease}.ant-cascader-picker-arrow.ant-cascader-picker-arrow-expand{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"}.ant-cascader-picker-arrow.ant-cascader-picker-arrow-expand:before{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.ant-cascader-menus{font-size:12px;background:#fff;position:absolute;z-index:1050;border-radius:4px;box-shadow:0 1px 6px rgba(0,0,0,.2);white-space:nowrap}.ant-cascader-menus-empty,.ant-cascader-menus-hidden{display:none}.ant-cascader-menus.slide-up-appear.slide-up-appear-active.ant-cascader-menus-placement-bottomLeft,.ant-cascader-menus.slide-up-enter.slide-up-enter-active.ant-cascader-menus-placement-bottomLeft{-webkit-animation-name:antSlideUpIn;animation-name:antSlideUpIn}.ant-cascader-menus.slide-up-appear.slide-up-appear-active.ant-cascader-menus-placement-topLeft,.ant-cascader-menus.slide-up-enter.slide-up-enter-active.ant-cascader-menus-placement-topLeft{-webkit-animation-name:antSlideDownIn;animation-name:antSlideDownIn}.ant-cascader-menus.slide-up-leave.slide-up-leave-active.ant-cascader-menus-placement-bottomLeft{-webkit-animation-name:antSlideUpOut;animation-name:antSlideUpOut}.ant-cascader-menus.slide-up-leave.slide-up-leave-active.ant-cascader-menus-placement-topLeft{-webkit-animation-name:antSlideDownOut;animation-name:antSlideDownOut}.ant-cascader-menu{display:inline-block;vertical-align:top;min-width:111px;height:180px;list-style:none;margin:0;padding:0;border-right:1px solid #e9e9e9;overflow:auto}.ant-cascader-menu:first-child{border-radius:4px 0 0 4px}.ant-cascader-menu:last-child{border-right-color:transparent;margin-right:-1px;border-radius:0 4px 4px 0}.ant-cascader-menu:only-child{border-radius:4px}.ant-cascader-menu-item{padding:7px 26px 7px 16px;cursor:pointer;white-space:nowrap;-webkit-transition:all .3s ease;transition:all .3s ease}.ant-cascader-menu-item:hover{background:#ecf6fd}.ant-cascader-menu-item-disabled{cursor:not-allowed;color:rgba(0,0,0,.25)}.ant-cascader-menu-item-disabled:hover{background:transparent}.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled),.ant-cascader-menu-item-active:not(.ant-cascader-menu-item-disabled):hover{background-color:#f7f7f7;font-weight:700}.ant-cascader-menu-item-expand{position:relative}.ant-cascader-menu-item-expand:after{font-family:anticon;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\E61F";display:inline-block;font-size:12px;font-size:8px\9;-webkit-transform:scale(.66666667) rotate(0deg);-ms-transform:scale(.66666667) rotate(0deg);transform:scale(.66666667) rotate(0deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";zoom:1;color:rgba(0,0,0,.43);position:absolute;right:15px}:root .ant-cascader-menu-item-expand:after{-webkit-filter:none;filter:none;font-size:12px}.ant-cascader-menu-item-loading:after{font-family:anticon;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\E64D";-webkit-animation:loadingCircle 1s infinite linear;animation:loadingCircle 1s infinite linear}.ant-cascader-menu-item .ant-cascader-menu-item-keyword{color:#f04134}.ant-checkbox{white-space:nowrap;cursor:pointer;outline:none;display:inline-block;line-height:1;position:relative;vertical-align:middle}.ant-checkbox-input:focus+.ant-checkbox-inner,.ant-checkbox-wrapper:hover .ant-checkbox,.ant-checkbox:hover .ant-checkbox-inner{border-color:#108ee9}.ant-checkbox-inner{position:relative;top:0;left:0;display:block;width:14px;height:14px;border:1px solid #d9d9d9;border-radius:2px;background-color:#fff;-webkit-transition:all .3s;transition:all .3s}.ant-checkbox-inner:after{-webkit-transform:rotate(45deg) scale(0);-ms-transform:rotate(45deg) scale(0);transform:rotate(45deg) scale(0);position:absolute;left:4px;top:1px;display:table;width:5px;height:8px;border:2px solid #fff;border-top:0;border-left:0;content:" ";-webkit-transition:all .1s cubic-bezier(.71,-.46,.88,.6);transition:all .1s cubic-bezier(.71,-.46,.88,.6)}.ant-checkbox-input{position:absolute;left:0;z-index:1;cursor:pointer;opacity:0;filter:alpha(opacity=0);top:0;bottom:0;right:0;width:100%;height:100%}.ant-checkbox-indeterminate .ant-checkbox-inner:after{content:" ";-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);position:absolute;left:2px;top:5px;width:8px;height:1px}.ant-checkbox-checked .ant-checkbox-inner:after{-webkit-transform:rotate(45deg) scale(1);-ms-transform:rotate(45deg) scale(1);transform:rotate(45deg) scale(1);position:absolute;left:4px;top:1px;display:table;width:5px;height:8px;border:2px solid #fff;border-top:0;border-left:0;content:" ";-webkit-transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s}.ant-checkbox-checked .ant-checkbox-inner,.ant-checkbox-indeterminate .ant-checkbox-inner{background-color:#108ee9;border-color:#108ee9}.ant-checkbox-disabled.ant-checkbox-checked .ant-checkbox-inner:after{-webkit-animation-name:none;animation-name:none;border-color:rgba(0,0,0,.25)}.ant-checkbox-disabled .ant-checkbox-inner{border-color:#d9d9d9!important;background-color:#f3f3f3}.ant-checkbox-disabled .ant-checkbox-inner:after{-webkit-animation-name:none;animation-name:none;border-color:#f3f3f3}.ant-checkbox-disabled+span{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-checkbox-wrapper{cursor:pointer;font-size:12px;display:inline-block}.ant-checkbox-wrapper:not(:last-child){margin-right:8px}.ant-checkbox+span,.ant-checkbox-wrapper+span{padding-left:8px;padding-right:8px;vertical-align:middle}.ant-checkbox-group{font-size:12px}.ant-checkbox-group-item{display:inline-block}@media \0screen{.ant-checkbox-checked .ant-checkbox-inner:after,.ant-checkbox-checked .ant-checkbox-inner:before{font-family:anticon;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\E632";font-weight:700;font-size:8px;border:0;color:#fff;left:2px;top:3px;position:absolute}}.ant-row{position:relative;margin-left:0;margin-right:0;height:auto;zoom:1;display:block}.ant-row:after,.ant-row:before{content:" ";display:table}.ant-row:after{clear:both;visibility:hidden;font-size:0;height:0}.ant-row-flex{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.ant-row-flex,.ant-row-flex:after,.ant-row-flex:before{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ant-row-flex-start{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.ant-row-flex-center{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.ant-row-flex-end{-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.ant-row-flex-space-between{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.ant-row-flex-space-around{-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}.ant-row-flex-top{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}.ant-row-flex-middle{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.ant-row-flex-bottom{-webkit-box-align:end;-webkit-align-items:flex-end;-ms-flex-align:end;align-items:flex-end}.ant-col{position:relative;display:block}.ant-col-1,.ant-col-2,.ant-col-3,.ant-col-4,.ant-col-5,.ant-col-6,.ant-col-7,.ant-col-8,.ant-col-9,.ant-col-10,.ant-col-11,.ant-col-12,.ant-col-13,.ant-col-14,.ant-col-15,.ant-col-16,.ant-col-17,.ant-col-18,.ant-col-19,.ant-col-20,.ant-col-21,.ant-col-22,.ant-col-23,.ant-col-24,.ant-col-lg-1,.ant-col-lg-2,.ant-col-lg-3,.ant-col-lg-4,.ant-col-lg-5,.ant-col-lg-6,.ant-col-lg-7,.ant-col-lg-8,.ant-col-lg-9,.ant-col-lg-10,.ant-col-lg-11,.ant-col-lg-12,.ant-col-lg-13,.ant-col-lg-14,.ant-col-lg-15,.ant-col-lg-16,.ant-col-lg-17,.ant-col-lg-18,.ant-col-lg-19,.ant-col-lg-20,.ant-col-lg-21,.ant-col-lg-22,.ant-col-lg-23,.ant-col-lg-24,.ant-col-md-1,.ant-col-md-2,.ant-col-md-3,.ant-col-md-4,.ant-col-md-5,.ant-col-md-6,.ant-col-md-7,.ant-col-md-8,.ant-col-md-9,.ant-col-md-10,.ant-col-md-11,.ant-col-md-12,.ant-col-md-13,.ant-col-md-14,.ant-col-md-15,.ant-col-md-16,.ant-col-md-17,.ant-col-md-18,.ant-col-md-19,.ant-col-md-20,.ant-col-md-21,.ant-col-md-22,.ant-col-md-23,.ant-col-md-24,.ant-col-sm-1,.ant-col-sm-2,.ant-col-sm-3,.ant-col-sm-4,.ant-col-sm-5,.ant-col-sm-6,.ant-col-sm-7,.ant-col-sm-8,.ant-col-sm-9,.ant-col-sm-10,.ant-col-sm-11,.ant-col-sm-12,.ant-col-sm-13,.ant-col-sm-14,.ant-col-sm-15,.ant-col-sm-16,.ant-col-sm-17,.ant-col-sm-18,.ant-col-sm-19,.ant-col-sm-20,.ant-col-sm-21,.ant-col-sm-22,.ant-col-sm-23,.ant-col-sm-24,.ant-col-xs-1,.ant-col-xs-2,.ant-col-xs-3,.ant-col-xs-4,.ant-col-xs-5,.ant-col-xs-6,.ant-col-xs-7,.ant-col-xs-8,.ant-col-xs-9,.ant-col-xs-10,.ant-col-xs-11,.ant-col-xs-12,.ant-col-xs-13,.ant-col-xs-14,.ant-col-xs-15,.ant-col-xs-16,.ant-col-xs-17,.ant-col-xs-18,.ant-col-xs-19,.ant-col-xs-20,.ant-col-xs-21,.ant-col-xs-22,.ant-col-xs-23,.ant-col-xs-24{position:relative;min-height:1px;padding-left:0;padding-right:0}.ant-col-1,.ant-col-2,.ant-col-3,.ant-col-4,.ant-col-5,.ant-col-6,.ant-col-7,.ant-col-8,.ant-col-9,.ant-col-10,.ant-col-11,.ant-col-12,.ant-col-13,.ant-col-14,.ant-col-15,.ant-col-16,.ant-col-17,.ant-col-18,.ant-col-19,.ant-col-20,.ant-col-21,.ant-col-22,.ant-col-23,.ant-col-24{float:left;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.ant-col-24{display:block;width:100%}.ant-col-push-24{left:100%}.ant-col-pull-24{right:100%}.ant-col-offset-24{margin-left:100%}.ant-col-order-24{-webkit-box-ordinal-group:25;-webkit-order:24;-ms-flex-order:24;order:24}.ant-col-23{display:block;width:95.83333333%}.ant-col-push-23{left:95.83333333%}.ant-col-pull-23{right:95.83333333%}.ant-col-offset-23{margin-left:95.83333333%}.ant-col-order-23{-webkit-box-ordinal-group:24;-webkit-order:23;-ms-flex-order:23;order:23}.ant-col-22{display:block;width:91.66666667%}.ant-col-push-22{left:91.66666667%}.ant-col-pull-22{right:91.66666667%}.ant-col-offset-22{margin-left:91.66666667%}.ant-col-order-22{-webkit-box-ordinal-group:23;-webkit-order:22;-ms-flex-order:22;order:22}.ant-col-21{display:block;width:87.5%}.ant-col-push-21{left:87.5%}.ant-col-pull-21{right:87.5%}.ant-col-offset-21{margin-left:87.5%}.ant-col-order-21{-webkit-box-ordinal-group:22;-webkit-order:21;-ms-flex-order:21;order:21}.ant-col-20{display:block;width:83.33333333%}.ant-col-push-20{left:83.33333333%}.ant-col-pull-20{right:83.33333333%}.ant-col-offset-20{margin-left:83.33333333%}.ant-col-order-20{-webkit-box-ordinal-group:21;-webkit-order:20;-ms-flex-order:20;order:20}.ant-col-19{display:block;width:79.16666667%}.ant-col-push-19{left:79.16666667%}.ant-col-pull-19{right:79.16666667%}.ant-col-offset-19{margin-left:79.16666667%}.ant-col-order-19{-webkit-box-ordinal-group:20;-webkit-order:19;-ms-flex-order:19;order:19}.ant-col-18{display:block;width:75%}.ant-col-push-18{left:75%}.ant-col-pull-18{right:75%}.ant-col-offset-18{margin-left:75%}.ant-col-order-18{-webkit-box-ordinal-group:19;-webkit-order:18;-ms-flex-order:18;order:18}.ant-col-17{display:block;width:70.83333333%}.ant-col-push-17{left:70.83333333%}.ant-col-pull-17{right:70.83333333%}.ant-col-offset-17{margin-left:70.83333333%}.ant-col-order-17{-webkit-box-ordinal-group:18;-webkit-order:17;-ms-flex-order:17;order:17}.ant-col-16{display:block;width:66.66666667%}.ant-col-push-16{left:66.66666667%}.ant-col-pull-16{right:66.66666667%}.ant-col-offset-16{margin-left:66.66666667%}.ant-col-order-16{-webkit-box-ordinal-group:17;-webkit-order:16;-ms-flex-order:16;order:16}.ant-col-15{display:block;width:62.5%}.ant-col-push-15{left:62.5%}.ant-col-pull-15{right:62.5%}.ant-col-offset-15{margin-left:62.5%}.ant-col-order-15{-webkit-box-ordinal-group:16;-webkit-order:15;-ms-flex-order:15;order:15}.ant-col-14{display:block;width:58.33333333%}.ant-col-push-14{left:58.33333333%}.ant-col-pull-14{right:58.33333333%}.ant-col-offset-14{margin-left:58.33333333%}.ant-col-order-14{-webkit-box-ordinal-group:15;-webkit-order:14;-ms-flex-order:14;order:14}.ant-col-13{display:block;width:54.16666667%}.ant-col-push-13{left:54.16666667%}.ant-col-pull-13{right:54.16666667%}.ant-col-offset-13{margin-left:54.16666667%}.ant-col-order-13{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.ant-col-12{display:block;width:50%}.ant-col-push-12{left:50%}.ant-col-pull-12{right:50%}.ant-col-offset-12{margin-left:50%}.ant-col-order-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.ant-col-11{display:block;width:45.83333333%}.ant-col-push-11{left:45.83333333%}.ant-col-pull-11{right:45.83333333%}.ant-col-offset-11{margin-left:45.83333333%}.ant-col-order-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.ant-col-10{display:block;width:41.66666667%}.ant-col-push-10{left:41.66666667%}.ant-col-pull-10{right:41.66666667%}.ant-col-offset-10{margin-left:41.66666667%}.ant-col-order-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.ant-col-9{display:block;width:37.5%}.ant-col-push-9{left:37.5%}.ant-col-pull-9{right:37.5%}.ant-col-offset-9{margin-left:37.5%}.ant-col-order-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.ant-col-8{display:block;width:33.33333333%}.ant-col-push-8{left:33.33333333%}.ant-col-pull-8{right:33.33333333%}.ant-col-offset-8{margin-left:33.33333333%}.ant-col-order-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.ant-col-7{display:block;width:29.16666667%}.ant-col-push-7{left:29.16666667%}.ant-col-pull-7{right:29.16666667%}.ant-col-offset-7{margin-left:29.16666667%}.ant-col-order-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.ant-col-6{display:block;width:25%}.ant-col-push-6{left:25%}.ant-col-pull-6{right:25%}.ant-col-offset-6{margin-left:25%}.ant-col-order-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.ant-col-5{display:block;width:20.83333333%}.ant-col-push-5{left:20.83333333%}.ant-col-pull-5{right:20.83333333%}.ant-col-offset-5{margin-left:20.83333333%}.ant-col-order-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.ant-col-4{display:block;width:16.66666667%}.ant-col-push-4{left:16.66666667%}.ant-col-pull-4{right:16.66666667%}.ant-col-offset-4{margin-left:16.66666667%}.ant-col-order-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.ant-col-3{display:block;width:12.5%}.ant-col-push-3{left:12.5%}.ant-col-pull-3{right:12.5%}.ant-col-offset-3{margin-left:12.5%}.ant-col-order-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.ant-col-2{display:block;width:8.33333333%}.ant-col-push-2{left:8.33333333%}.ant-col-pull-2{right:8.33333333%}.ant-col-offset-2{margin-left:8.33333333%}.ant-col-order-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.ant-col-1{display:block;width:4.16666667%}.ant-col-push-1{left:4.16666667%}.ant-col-pull-1{right:4.16666667%}.ant-col-offset-1{margin-left:4.16666667%}.ant-col-order-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.ant-col-0{display:none}.ant-col-offset-0{margin-left:0}.ant-col-order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}.ant-col-xs-1,.ant-col-xs-2,.ant-col-xs-3,.ant-col-xs-4,.ant-col-xs-5,.ant-col-xs-6,.ant-col-xs-7,.ant-col-xs-8,.ant-col-xs-9,.ant-col-xs-10,.ant-col-xs-11,.ant-col-xs-12,.ant-col-xs-13,.ant-col-xs-14,.ant-col-xs-15,.ant-col-xs-16,.ant-col-xs-17,.ant-col-xs-18,.ant-col-xs-19,.ant-col-xs-20,.ant-col-xs-21,.ant-col-xs-22,.ant-col-xs-23,.ant-col-xs-24{float:left;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.ant-col-xs-24{display:block;width:100%}.ant-col-xs-push-24{left:100%}.ant-col-xs-pull-24{right:100%}.ant-col-xs-offset-24{margin-left:100%}.ant-col-xs-order-24{-webkit-box-ordinal-group:25;-webkit-order:24;-ms-flex-order:24;order:24}.ant-col-xs-23{display:block;width:95.83333333%}.ant-col-xs-push-23{left:95.83333333%}.ant-col-xs-pull-23{right:95.83333333%}.ant-col-xs-offset-23{margin-left:95.83333333%}.ant-col-xs-order-23{-webkit-box-ordinal-group:24;-webkit-order:23;-ms-flex-order:23;order:23}.ant-col-xs-22{display:block;width:91.66666667%}.ant-col-xs-push-22{left:91.66666667%}.ant-col-xs-pull-22{right:91.66666667%}.ant-col-xs-offset-22{margin-left:91.66666667%}.ant-col-xs-order-22{-webkit-box-ordinal-group:23;-webkit-order:22;-ms-flex-order:22;order:22}.ant-col-xs-21{display:block;width:87.5%}.ant-col-xs-push-21{left:87.5%}.ant-col-xs-pull-21{right:87.5%}.ant-col-xs-offset-21{margin-left:87.5%}.ant-col-xs-order-21{-webkit-box-ordinal-group:22;-webkit-order:21;-ms-flex-order:21;order:21}.ant-col-xs-20{display:block;width:83.33333333%}.ant-col-xs-push-20{left:83.33333333%}.ant-col-xs-pull-20{right:83.33333333%}.ant-col-xs-offset-20{margin-left:83.33333333%}.ant-col-xs-order-20{-webkit-box-ordinal-group:21;-webkit-order:20;-ms-flex-order:20;order:20}.ant-col-xs-19{display:block;width:79.16666667%}.ant-col-xs-push-19{left:79.16666667%}.ant-col-xs-pull-19{right:79.16666667%}.ant-col-xs-offset-19{margin-left:79.16666667%}.ant-col-xs-order-19{-webkit-box-ordinal-group:20;-webkit-order:19;-ms-flex-order:19;order:19}.ant-col-xs-18{display:block;width:75%}.ant-col-xs-push-18{left:75%}.ant-col-xs-pull-18{right:75%}.ant-col-xs-offset-18{margin-left:75%}.ant-col-xs-order-18{-webkit-box-ordinal-group:19;-webkit-order:18;-ms-flex-order:18;order:18}.ant-col-xs-17{display:block;width:70.83333333%}.ant-col-xs-push-17{left:70.83333333%}.ant-col-xs-pull-17{right:70.83333333%}.ant-col-xs-offset-17{margin-left:70.83333333%}.ant-col-xs-order-17{-webkit-box-ordinal-group:18;-webkit-order:17;-ms-flex-order:17;order:17}.ant-col-xs-16{display:block;width:66.66666667%}.ant-col-xs-push-16{left:66.66666667%}.ant-col-xs-pull-16{right:66.66666667%}.ant-col-xs-offset-16{margin-left:66.66666667%}.ant-col-xs-order-16{-webkit-box-ordinal-group:17;-webkit-order:16;-ms-flex-order:16;order:16}.ant-col-xs-15{display:block;width:62.5%}.ant-col-xs-push-15{left:62.5%}.ant-col-xs-pull-15{right:62.5%}.ant-col-xs-offset-15{margin-left:62.5%}.ant-col-xs-order-15{-webkit-box-ordinal-group:16;-webkit-order:15;-ms-flex-order:15;order:15}.ant-col-xs-14{display:block;width:58.33333333%}.ant-col-xs-push-14{left:58.33333333%}.ant-col-xs-pull-14{right:58.33333333%}.ant-col-xs-offset-14{margin-left:58.33333333%}.ant-col-xs-order-14{-webkit-box-ordinal-group:15;-webkit-order:14;-ms-flex-order:14;order:14}.ant-col-xs-13{display:block;width:54.16666667%}.ant-col-xs-push-13{left:54.16666667%}.ant-col-xs-pull-13{right:54.16666667%}.ant-col-xs-offset-13{margin-left:54.16666667%}.ant-col-xs-order-13{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.ant-col-xs-12{display:block;width:50%}.ant-col-xs-push-12{left:50%}.ant-col-xs-pull-12{right:50%}.ant-col-xs-offset-12{margin-left:50%}.ant-col-xs-order-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.ant-col-xs-11{display:block;width:45.83333333%}.ant-col-xs-push-11{left:45.83333333%}.ant-col-xs-pull-11{right:45.83333333%}.ant-col-xs-offset-11{margin-left:45.83333333%}.ant-col-xs-order-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.ant-col-xs-10{display:block;width:41.66666667%}.ant-col-xs-push-10{left:41.66666667%}.ant-col-xs-pull-10{right:41.66666667%}.ant-col-xs-offset-10{margin-left:41.66666667%}.ant-col-xs-order-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.ant-col-xs-9{display:block;width:37.5%}.ant-col-xs-push-9{left:37.5%}.ant-col-xs-pull-9{right:37.5%}.ant-col-xs-offset-9{margin-left:37.5%}.ant-col-xs-order-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.ant-col-xs-8{display:block;width:33.33333333%}.ant-col-xs-push-8{left:33.33333333%}.ant-col-xs-pull-8{right:33.33333333%}.ant-col-xs-offset-8{margin-left:33.33333333%}.ant-col-xs-order-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.ant-col-xs-7{display:block;width:29.16666667%}.ant-col-xs-push-7{left:29.16666667%}.ant-col-xs-pull-7{right:29.16666667%}.ant-col-xs-offset-7{margin-left:29.16666667%}.ant-col-xs-order-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.ant-col-xs-6{display:block;width:25%}.ant-col-xs-push-6{left:25%}.ant-col-xs-pull-6{right:25%}.ant-col-xs-offset-6{margin-left:25%}.ant-col-xs-order-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.ant-col-xs-5{display:block;width:20.83333333%}.ant-col-xs-push-5{left:20.83333333%}.ant-col-xs-pull-5{right:20.83333333%}.ant-col-xs-offset-5{margin-left:20.83333333%}.ant-col-xs-order-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.ant-col-xs-4{display:block;width:16.66666667%}.ant-col-xs-push-4{left:16.66666667%}.ant-col-xs-pull-4{right:16.66666667%}.ant-col-xs-offset-4{margin-left:16.66666667%}.ant-col-xs-order-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.ant-col-xs-3{display:block;width:12.5%}.ant-col-xs-push-3{left:12.5%}.ant-col-xs-pull-3{right:12.5%}.ant-col-xs-offset-3{margin-left:12.5%}.ant-col-xs-order-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.ant-col-xs-2{display:block;width:8.33333333%}.ant-col-xs-push-2{left:8.33333333%}.ant-col-xs-pull-2{right:8.33333333%}.ant-col-xs-offset-2{margin-left:8.33333333%}.ant-col-xs-order-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.ant-col-xs-1{display:block;width:4.16666667%}.ant-col-xs-push-1{left:4.16666667%}.ant-col-xs-pull-1{right:4.16666667%}.ant-col-xs-offset-1{margin-left:4.16666667%}.ant-col-xs-order-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.ant-col-xs-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-xs-push-0{left:auto}.ant-col-xs-pull-0{right:auto}.ant-col-xs-offset-0{margin-left:0}.ant-col-xs-order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}@media (min-width:768px){.ant-col-sm-1,.ant-col-sm-2,.ant-col-sm-3,.ant-col-sm-4,.ant-col-sm-5,.ant-col-sm-6,.ant-col-sm-7,.ant-col-sm-8,.ant-col-sm-9,.ant-col-sm-10,.ant-col-sm-11,.ant-col-sm-12,.ant-col-sm-13,.ant-col-sm-14,.ant-col-sm-15,.ant-col-sm-16,.ant-col-sm-17,.ant-col-sm-18,.ant-col-sm-19,.ant-col-sm-20,.ant-col-sm-21,.ant-col-sm-22,.ant-col-sm-23,.ant-col-sm-24{float:left;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.ant-col-sm-24{display:block;width:100%}.ant-col-sm-push-24{left:100%}.ant-col-sm-pull-24{right:100%}.ant-col-sm-offset-24{margin-left:100%}.ant-col-sm-order-24{-webkit-box-ordinal-group:25;-webkit-order:24;-ms-flex-order:24;order:24}.ant-col-sm-23{display:block;width:95.83333333%}.ant-col-sm-push-23{left:95.83333333%}.ant-col-sm-pull-23{right:95.83333333%}.ant-col-sm-offset-23{margin-left:95.83333333%}.ant-col-sm-order-23{-webkit-box-ordinal-group:24;-webkit-order:23;-ms-flex-order:23;order:23}.ant-col-sm-22{display:block;width:91.66666667%}.ant-col-sm-push-22{left:91.66666667%}.ant-col-sm-pull-22{right:91.66666667%}.ant-col-sm-offset-22{margin-left:91.66666667%}.ant-col-sm-order-22{-webkit-box-ordinal-group:23;-webkit-order:22;-ms-flex-order:22;order:22}.ant-col-sm-21{display:block;width:87.5%}.ant-col-sm-push-21{left:87.5%}.ant-col-sm-pull-21{right:87.5%}.ant-col-sm-offset-21{margin-left:87.5%}.ant-col-sm-order-21{-webkit-box-ordinal-group:22;-webkit-order:21;-ms-flex-order:21;order:21}.ant-col-sm-20{display:block;width:83.33333333%}.ant-col-sm-push-20{left:83.33333333%}.ant-col-sm-pull-20{right:83.33333333%}.ant-col-sm-offset-20{margin-left:83.33333333%}.ant-col-sm-order-20{-webkit-box-ordinal-group:21;-webkit-order:20;-ms-flex-order:20;order:20}.ant-col-sm-19{display:block;width:79.16666667%}.ant-col-sm-push-19{left:79.16666667%}.ant-col-sm-pull-19{right:79.16666667%}.ant-col-sm-offset-19{margin-left:79.16666667%}.ant-col-sm-order-19{-webkit-box-ordinal-group:20;-webkit-order:19;-ms-flex-order:19;order:19}.ant-col-sm-18{display:block;width:75%}.ant-col-sm-push-18{left:75%}.ant-col-sm-pull-18{right:75%}.ant-col-sm-offset-18{margin-left:75%}.ant-col-sm-order-18{-webkit-box-ordinal-group:19;-webkit-order:18;-ms-flex-order:18;order:18}.ant-col-sm-17{display:block;width:70.83333333%}.ant-col-sm-push-17{left:70.83333333%}.ant-col-sm-pull-17{right:70.83333333%}.ant-col-sm-offset-17{margin-left:70.83333333%}.ant-col-sm-order-17{-webkit-box-ordinal-group:18;-webkit-order:17;-ms-flex-order:17;order:17}.ant-col-sm-16{display:block;width:66.66666667%}.ant-col-sm-push-16{left:66.66666667%}.ant-col-sm-pull-16{right:66.66666667%}.ant-col-sm-offset-16{margin-left:66.66666667%}.ant-col-sm-order-16{-webkit-box-ordinal-group:17;-webkit-order:16;-ms-flex-order:16;order:16}.ant-col-sm-15{display:block;width:62.5%}.ant-col-sm-push-15{left:62.5%}.ant-col-sm-pull-15{right:62.5%}.ant-col-sm-offset-15{margin-left:62.5%}.ant-col-sm-order-15{-webkit-box-ordinal-group:16;-webkit-order:15;-ms-flex-order:15;order:15}.ant-col-sm-14{display:block;width:58.33333333%}.ant-col-sm-push-14{left:58.33333333%}.ant-col-sm-pull-14{right:58.33333333%}.ant-col-sm-offset-14{margin-left:58.33333333%}.ant-col-sm-order-14{-webkit-box-ordinal-group:15;-webkit-order:14;-ms-flex-order:14;order:14}.ant-col-sm-13{display:block;width:54.16666667%}.ant-col-sm-push-13{left:54.16666667%}.ant-col-sm-pull-13{right:54.16666667%}.ant-col-sm-offset-13{margin-left:54.16666667%}.ant-col-sm-order-13{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.ant-col-sm-12{display:block;width:50%}.ant-col-sm-push-12{left:50%}.ant-col-sm-pull-12{right:50%}.ant-col-sm-offset-12{margin-left:50%}.ant-col-sm-order-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.ant-col-sm-11{display:block;width:45.83333333%}.ant-col-sm-push-11{left:45.83333333%}.ant-col-sm-pull-11{right:45.83333333%}.ant-col-sm-offset-11{margin-left:45.83333333%}.ant-col-sm-order-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.ant-col-sm-10{display:block;width:41.66666667%}.ant-col-sm-push-10{left:41.66666667%}.ant-col-sm-pull-10{right:41.66666667%}.ant-col-sm-offset-10{margin-left:41.66666667%}.ant-col-sm-order-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.ant-col-sm-9{display:block;width:37.5%}.ant-col-sm-push-9{left:37.5%}.ant-col-sm-pull-9{right:37.5%}.ant-col-sm-offset-9{margin-left:37.5%}.ant-col-sm-order-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.ant-col-sm-8{display:block;width:33.33333333%}.ant-col-sm-push-8{left:33.33333333%}.ant-col-sm-pull-8{right:33.33333333%}.ant-col-sm-offset-8{margin-left:33.33333333%}.ant-col-sm-order-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.ant-col-sm-7{display:block;width:29.16666667%}.ant-col-sm-push-7{left:29.16666667%}.ant-col-sm-pull-7{right:29.16666667%}.ant-col-sm-offset-7{margin-left:29.16666667%}.ant-col-sm-order-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.ant-col-sm-6{display:block;width:25%}.ant-col-sm-push-6{left:25%}.ant-col-sm-pull-6{right:25%}.ant-col-sm-offset-6{margin-left:25%}.ant-col-sm-order-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.ant-col-sm-5{display:block;width:20.83333333%}.ant-col-sm-push-5{left:20.83333333%}.ant-col-sm-pull-5{right:20.83333333%}.ant-col-sm-offset-5{margin-left:20.83333333%}.ant-col-sm-order-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.ant-col-sm-4{display:block;width:16.66666667%}.ant-col-sm-push-4{left:16.66666667%}.ant-col-sm-pull-4{right:16.66666667%}.ant-col-sm-offset-4{margin-left:16.66666667%}.ant-col-sm-order-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.ant-col-sm-3{display:block;width:12.5%}.ant-col-sm-push-3{left:12.5%}.ant-col-sm-pull-3{right:12.5%}.ant-col-sm-offset-3{margin-left:12.5%}.ant-col-sm-order-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.ant-col-sm-2{display:block;width:8.33333333%}.ant-col-sm-push-2{left:8.33333333%}.ant-col-sm-pull-2{right:8.33333333%}.ant-col-sm-offset-2{margin-left:8.33333333%}.ant-col-sm-order-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.ant-col-sm-1{display:block;width:4.16666667%}.ant-col-sm-push-1{left:4.16666667%}.ant-col-sm-pull-1{right:4.16666667%}.ant-col-sm-offset-1{margin-left:4.16666667%}.ant-col-sm-order-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.ant-col-sm-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-sm-push-0{left:auto}.ant-col-sm-pull-0{right:auto}.ant-col-sm-offset-0{margin-left:0}.ant-col-sm-order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}}@media (min-width:992px){.ant-col-md-1,.ant-col-md-2,.ant-col-md-3,.ant-col-md-4,.ant-col-md-5,.ant-col-md-6,.ant-col-md-7,.ant-col-md-8,.ant-col-md-9,.ant-col-md-10,.ant-col-md-11,.ant-col-md-12,.ant-col-md-13,.ant-col-md-14,.ant-col-md-15,.ant-col-md-16,.ant-col-md-17,.ant-col-md-18,.ant-col-md-19,.ant-col-md-20,.ant-col-md-21,.ant-col-md-22,.ant-col-md-23,.ant-col-md-24{float:left;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.ant-col-md-24{display:block;width:100%}.ant-col-md-push-24{left:100%}.ant-col-md-pull-24{right:100%}.ant-col-md-offset-24{margin-left:100%}.ant-col-md-order-24{-webkit-box-ordinal-group:25;-webkit-order:24;-ms-flex-order:24;order:24}.ant-col-md-23{display:block;width:95.83333333%}.ant-col-md-push-23{left:95.83333333%}.ant-col-md-pull-23{right:95.83333333%}.ant-col-md-offset-23{margin-left:95.83333333%}.ant-col-md-order-23{-webkit-box-ordinal-group:24;-webkit-order:23;-ms-flex-order:23;order:23}.ant-col-md-22{display:block;width:91.66666667%}.ant-col-md-push-22{left:91.66666667%}.ant-col-md-pull-22{right:91.66666667%}.ant-col-md-offset-22{margin-left:91.66666667%}.ant-col-md-order-22{-webkit-box-ordinal-group:23;-webkit-order:22;-ms-flex-order:22;order:22}.ant-col-md-21{display:block;width:87.5%}.ant-col-md-push-21{left:87.5%}.ant-col-md-pull-21{right:87.5%}.ant-col-md-offset-21{margin-left:87.5%}.ant-col-md-order-21{-webkit-box-ordinal-group:22;-webkit-order:21;-ms-flex-order:21;order:21}.ant-col-md-20{display:block;width:83.33333333%}.ant-col-md-push-20{left:83.33333333%}.ant-col-md-pull-20{right:83.33333333%}.ant-col-md-offset-20{margin-left:83.33333333%}.ant-col-md-order-20{-webkit-box-ordinal-group:21;-webkit-order:20;-ms-flex-order:20;order:20}.ant-col-md-19{display:block;width:79.16666667%}.ant-col-md-push-19{left:79.16666667%}.ant-col-md-pull-19{right:79.16666667%}.ant-col-md-offset-19{margin-left:79.16666667%}.ant-col-md-order-19{-webkit-box-ordinal-group:20;-webkit-order:19;-ms-flex-order:19;order:19}.ant-col-md-18{display:block;width:75%}.ant-col-md-push-18{left:75%}.ant-col-md-pull-18{right:75%}.ant-col-md-offset-18{margin-left:75%}.ant-col-md-order-18{-webkit-box-ordinal-group:19;-webkit-order:18;-ms-flex-order:18;order:18}.ant-col-md-17{display:block;width:70.83333333%}.ant-col-md-push-17{left:70.83333333%}.ant-col-md-pull-17{right:70.83333333%}.ant-col-md-offset-17{margin-left:70.83333333%}.ant-col-md-order-17{-webkit-box-ordinal-group:18;-webkit-order:17;-ms-flex-order:17;order:17}.ant-col-md-16{display:block;width:66.66666667%}.ant-col-md-push-16{left:66.66666667%}.ant-col-md-pull-16{right:66.66666667%}.ant-col-md-offset-16{margin-left:66.66666667%}.ant-col-md-order-16{-webkit-box-ordinal-group:17;-webkit-order:16;-ms-flex-order:16;order:16}.ant-col-md-15{display:block;width:62.5%}.ant-col-md-push-15{left:62.5%}.ant-col-md-pull-15{right:62.5%}.ant-col-md-offset-15{margin-left:62.5%}.ant-col-md-order-15{-webkit-box-ordinal-group:16;-webkit-order:15;-ms-flex-order:15;order:15}.ant-col-md-14{display:block;width:58.33333333%}.ant-col-md-push-14{left:58.33333333%}.ant-col-md-pull-14{right:58.33333333%}.ant-col-md-offset-14{margin-left:58.33333333%}.ant-col-md-order-14{-webkit-box-ordinal-group:15;-webkit-order:14;-ms-flex-order:14;order:14}.ant-col-md-13{display:block;width:54.16666667%}.ant-col-md-push-13{left:54.16666667%}.ant-col-md-pull-13{right:54.16666667%}.ant-col-md-offset-13{margin-left:54.16666667%}.ant-col-md-order-13{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.ant-col-md-12{display:block;width:50%}.ant-col-md-push-12{left:50%}.ant-col-md-pull-12{right:50%}.ant-col-md-offset-12{margin-left:50%}.ant-col-md-order-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.ant-col-md-11{display:block;width:45.83333333%}.ant-col-md-push-11{left:45.83333333%}.ant-col-md-pull-11{right:45.83333333%}.ant-col-md-offset-11{margin-left:45.83333333%}.ant-col-md-order-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.ant-col-md-10{display:block;width:41.66666667%}.ant-col-md-push-10{left:41.66666667%}.ant-col-md-pull-10{right:41.66666667%}.ant-col-md-offset-10{margin-left:41.66666667%}.ant-col-md-order-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.ant-col-md-9{display:block;width:37.5%}.ant-col-md-push-9{left:37.5%}.ant-col-md-pull-9{right:37.5%}.ant-col-md-offset-9{margin-left:37.5%}.ant-col-md-order-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.ant-col-md-8{display:block;width:33.33333333%}.ant-col-md-push-8{left:33.33333333%}.ant-col-md-pull-8{right:33.33333333%}.ant-col-md-offset-8{margin-left:33.33333333%}.ant-col-md-order-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.ant-col-md-7{display:block;width:29.16666667%}.ant-col-md-push-7{left:29.16666667%}.ant-col-md-pull-7{right:29.16666667%}.ant-col-md-offset-7{margin-left:29.16666667%}.ant-col-md-order-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.ant-col-md-6{display:block;width:25%}.ant-col-md-push-6{left:25%}.ant-col-md-pull-6{right:25%}.ant-col-md-offset-6{margin-left:25%}.ant-col-md-order-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.ant-col-md-5{display:block;width:20.83333333%}.ant-col-md-push-5{left:20.83333333%}.ant-col-md-pull-5{right:20.83333333%}.ant-col-md-offset-5{margin-left:20.83333333%}.ant-col-md-order-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.ant-col-md-4{display:block;width:16.66666667%}.ant-col-md-push-4{left:16.66666667%}.ant-col-md-pull-4{right:16.66666667%}.ant-col-md-offset-4{margin-left:16.66666667%}.ant-col-md-order-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.ant-col-md-3{display:block;width:12.5%}.ant-col-md-push-3{left:12.5%}.ant-col-md-pull-3{right:12.5%}.ant-col-md-offset-3{margin-left:12.5%}.ant-col-md-order-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.ant-col-md-2{display:block;width:8.33333333%}.ant-col-md-push-2{left:8.33333333%}.ant-col-md-pull-2{right:8.33333333%}.ant-col-md-offset-2{margin-left:8.33333333%}.ant-col-md-order-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.ant-col-md-1{display:block;width:4.16666667%}.ant-col-md-push-1{left:4.16666667%}.ant-col-md-pull-1{right:4.16666667%}.ant-col-md-offset-1{margin-left:4.16666667%}.ant-col-md-order-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.ant-col-md-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-md-push-0{left:auto}.ant-col-md-pull-0{right:auto}.ant-col-md-offset-0{margin-left:0}.ant-col-md-order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}}@media (min-width:1200px){.ant-col-lg-1,.ant-col-lg-2,.ant-col-lg-3,.ant-col-lg-4,.ant-col-lg-5,.ant-col-lg-6,.ant-col-lg-7,.ant-col-lg-8,.ant-col-lg-9,.ant-col-lg-10,.ant-col-lg-11,.ant-col-lg-12,.ant-col-lg-13,.ant-col-lg-14,.ant-col-lg-15,.ant-col-lg-16,.ant-col-lg-17,.ant-col-lg-18,.ant-col-lg-19,.ant-col-lg-20,.ant-col-lg-21,.ant-col-lg-22,.ant-col-lg-23,.ant-col-lg-24{float:left;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.ant-col-lg-24{display:block;width:100%}.ant-col-lg-push-24{left:100%}.ant-col-lg-pull-24{right:100%}.ant-col-lg-offset-24{margin-left:100%}.ant-col-lg-order-24{-webkit-box-ordinal-group:25;-webkit-order:24;-ms-flex-order:24;order:24}.ant-col-lg-23{display:block;width:95.83333333%}.ant-col-lg-push-23{left:95.83333333%}.ant-col-lg-pull-23{right:95.83333333%}.ant-col-lg-offset-23{margin-left:95.83333333%}.ant-col-lg-order-23{-webkit-box-ordinal-group:24;-webkit-order:23;-ms-flex-order:23;order:23}.ant-col-lg-22{display:block;width:91.66666667%}.ant-col-lg-push-22{left:91.66666667%}.ant-col-lg-pull-22{right:91.66666667%}.ant-col-lg-offset-22{margin-left:91.66666667%}.ant-col-lg-order-22{-webkit-box-ordinal-group:23;-webkit-order:22;-ms-flex-order:22;order:22}.ant-col-lg-21{display:block;width:87.5%}.ant-col-lg-push-21{left:87.5%}.ant-col-lg-pull-21{right:87.5%}.ant-col-lg-offset-21{margin-left:87.5%}.ant-col-lg-order-21{-webkit-box-ordinal-group:22;-webkit-order:21;-ms-flex-order:21;order:21}.ant-col-lg-20{display:block;width:83.33333333%}.ant-col-lg-push-20{left:83.33333333%}.ant-col-lg-pull-20{right:83.33333333%}.ant-col-lg-offset-20{margin-left:83.33333333%}.ant-col-lg-order-20{-webkit-box-ordinal-group:21;-webkit-order:20;-ms-flex-order:20;order:20}.ant-col-lg-19{display:block;width:79.16666667%}.ant-col-lg-push-19{left:79.16666667%}.ant-col-lg-pull-19{right:79.16666667%}.ant-col-lg-offset-19{margin-left:79.16666667%}.ant-col-lg-order-19{-webkit-box-ordinal-group:20;-webkit-order:19;-ms-flex-order:19;order:19}.ant-col-lg-18{display:block;width:75%}.ant-col-lg-push-18{left:75%}.ant-col-lg-pull-18{right:75%}.ant-col-lg-offset-18{margin-left:75%}.ant-col-lg-order-18{-webkit-box-ordinal-group:19;-webkit-order:18;-ms-flex-order:18;order:18}.ant-col-lg-17{display:block;width:70.83333333%}.ant-col-lg-push-17{left:70.83333333%}.ant-col-lg-pull-17{right:70.83333333%}.ant-col-lg-offset-17{margin-left:70.83333333%}.ant-col-lg-order-17{-webkit-box-ordinal-group:18;-webkit-order:17;-ms-flex-order:17;order:17}.ant-col-lg-16{display:block;width:66.66666667%}.ant-col-lg-push-16{left:66.66666667%}.ant-col-lg-pull-16{right:66.66666667%}.ant-col-lg-offset-16{margin-left:66.66666667%}.ant-col-lg-order-16{-webkit-box-ordinal-group:17;-webkit-order:16;-ms-flex-order:16;order:16}.ant-col-lg-15{display:block;width:62.5%}.ant-col-lg-push-15{left:62.5%}.ant-col-lg-pull-15{right:62.5%}.ant-col-lg-offset-15{margin-left:62.5%}.ant-col-lg-order-15{-webkit-box-ordinal-group:16;-webkit-order:15;-ms-flex-order:15;order:15}.ant-col-lg-14{display:block;width:58.33333333%}.ant-col-lg-push-14{left:58.33333333%}.ant-col-lg-pull-14{right:58.33333333%}.ant-col-lg-offset-14{margin-left:58.33333333%}.ant-col-lg-order-14{-webkit-box-ordinal-group:15;-webkit-order:14;-ms-flex-order:14;order:14}.ant-col-lg-13{display:block;width:54.16666667%}.ant-col-lg-push-13{left:54.16666667%}.ant-col-lg-pull-13{right:54.16666667%}.ant-col-lg-offset-13{margin-left:54.16666667%}.ant-col-lg-order-13{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.ant-col-lg-12{display:block;width:50%}.ant-col-lg-push-12{left:50%}.ant-col-lg-pull-12{right:50%}.ant-col-lg-offset-12{margin-left:50%}.ant-col-lg-order-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.ant-col-lg-11{display:block;width:45.83333333%}.ant-col-lg-push-11{left:45.83333333%}.ant-col-lg-pull-11{right:45.83333333%}.ant-col-lg-offset-11{margin-left:45.83333333%}.ant-col-lg-order-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.ant-col-lg-10{display:block;width:41.66666667%}.ant-col-lg-push-10{left:41.66666667%}.ant-col-lg-pull-10{right:41.66666667%}.ant-col-lg-offset-10{margin-left:41.66666667%}.ant-col-lg-order-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.ant-col-lg-9{display:block;width:37.5%}.ant-col-lg-push-9{left:37.5%}.ant-col-lg-pull-9{right:37.5%}.ant-col-lg-offset-9{margin-left:37.5%}.ant-col-lg-order-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.ant-col-lg-8{display:block;width:33.33333333%}.ant-col-lg-push-8{left:33.33333333%}.ant-col-lg-pull-8{right:33.33333333%}.ant-col-lg-offset-8{margin-left:33.33333333%}.ant-col-lg-order-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.ant-col-lg-7{display:block;width:29.16666667%}.ant-col-lg-push-7{left:29.16666667%}.ant-col-lg-pull-7{right:29.16666667%}.ant-col-lg-offset-7{margin-left:29.16666667%}.ant-col-lg-order-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.ant-col-lg-6{display:block;width:25%}.ant-col-lg-push-6{left:25%}.ant-col-lg-pull-6{right:25%}.ant-col-lg-offset-6{margin-left:25%}.ant-col-lg-order-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.ant-col-lg-5{display:block;width:20.83333333%}.ant-col-lg-push-5{left:20.83333333%}.ant-col-lg-pull-5{right:20.83333333%}.ant-col-lg-offset-5{margin-left:20.83333333%}.ant-col-lg-order-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.ant-col-lg-4{display:block;width:16.66666667%}.ant-col-lg-push-4{left:16.66666667%}.ant-col-lg-pull-4{right:16.66666667%}.ant-col-lg-offset-4{margin-left:16.66666667%}.ant-col-lg-order-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.ant-col-lg-3{display:block;width:12.5%}.ant-col-lg-push-3{left:12.5%}.ant-col-lg-pull-3{right:12.5%}.ant-col-lg-offset-3{margin-left:12.5%}.ant-col-lg-order-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.ant-col-lg-2{display:block;width:8.33333333%}.ant-col-lg-push-2{left:8.33333333%}.ant-col-lg-pull-2{right:8.33333333%}.ant-col-lg-offset-2{margin-left:8.33333333%}.ant-col-lg-order-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.ant-col-lg-1{display:block;width:4.16666667%}.ant-col-lg-push-1{left:4.16666667%}.ant-col-lg-pull-1{right:4.16666667%}.ant-col-lg-offset-1{margin-left:4.16666667%}.ant-col-lg-order-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.ant-col-lg-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-lg-push-0{left:auto}.ant-col-lg-pull-0{right:auto}.ant-col-lg-offset-0{margin-left:0}.ant-col-lg-order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}}@media (min-width:1600px){.ant-col-xl-1,.ant-col-xl-2,.ant-col-xl-3,.ant-col-xl-4,.ant-col-xl-5,.ant-col-xl-6,.ant-col-xl-7,.ant-col-xl-8,.ant-col-xl-9,.ant-col-xl-10,.ant-col-xl-11,.ant-col-xl-12,.ant-col-xl-13,.ant-col-xl-14,.ant-col-xl-15,.ant-col-xl-16,.ant-col-xl-17,.ant-col-xl-18,.ant-col-xl-19,.ant-col-xl-20,.ant-col-xl-21,.ant-col-xl-22,.ant-col-xl-23,.ant-col-xl-24{float:left;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.ant-col-xl-24{display:block;width:100%}.ant-col-xl-push-24{left:100%}.ant-col-xl-pull-24{right:100%}.ant-col-xl-offset-24{margin-left:100%}.ant-col-xl-order-24{-webkit-box-ordinal-group:25;-webkit-order:24;-ms-flex-order:24;order:24}.ant-col-xl-23{display:block;width:95.83333333%}.ant-col-xl-push-23{left:95.83333333%}.ant-col-xl-pull-23{right:95.83333333%}.ant-col-xl-offset-23{margin-left:95.83333333%}.ant-col-xl-order-23{-webkit-box-ordinal-group:24;-webkit-order:23;-ms-flex-order:23;order:23}.ant-col-xl-22{display:block;width:91.66666667%}.ant-col-xl-push-22{left:91.66666667%}.ant-col-xl-pull-22{right:91.66666667%}.ant-col-xl-offset-22{margin-left:91.66666667%}.ant-col-xl-order-22{-webkit-box-ordinal-group:23;-webkit-order:22;-ms-flex-order:22;order:22}.ant-col-xl-21{display:block;width:87.5%}.ant-col-xl-push-21{left:87.5%}.ant-col-xl-pull-21{right:87.5%}.ant-col-xl-offset-21{margin-left:87.5%}.ant-col-xl-order-21{-webkit-box-ordinal-group:22;-webkit-order:21;-ms-flex-order:21;order:21}.ant-col-xl-20{display:block;width:83.33333333%}.ant-col-xl-push-20{left:83.33333333%}.ant-col-xl-pull-20{right:83.33333333%}.ant-col-xl-offset-20{margin-left:83.33333333%}.ant-col-xl-order-20{-webkit-box-ordinal-group:21;-webkit-order:20;-ms-flex-order:20;order:20}.ant-col-xl-19{display:block;width:79.16666667%}.ant-col-xl-push-19{left:79.16666667%}.ant-col-xl-pull-19{right:79.16666667%}.ant-col-xl-offset-19{margin-left:79.16666667%}.ant-col-xl-order-19{-webkit-box-ordinal-group:20;-webkit-order:19;-ms-flex-order:19;order:19}.ant-col-xl-18{display:block;width:75%}.ant-col-xl-push-18{left:75%}.ant-col-xl-pull-18{right:75%}.ant-col-xl-offset-18{margin-left:75%}.ant-col-xl-order-18{-webkit-box-ordinal-group:19;-webkit-order:18;-ms-flex-order:18;order:18}.ant-col-xl-17{display:block;width:70.83333333%}.ant-col-xl-push-17{left:70.83333333%}.ant-col-xl-pull-17{right:70.83333333%}.ant-col-xl-offset-17{margin-left:70.83333333%}.ant-col-xl-order-17{-webkit-box-ordinal-group:18;-webkit-order:17;-ms-flex-order:17;order:17}.ant-col-xl-16{display:block;width:66.66666667%}.ant-col-xl-push-16{left:66.66666667%}.ant-col-xl-pull-16{right:66.66666667%}.ant-col-xl-offset-16{margin-left:66.66666667%}.ant-col-xl-order-16{-webkit-box-ordinal-group:17;-webkit-order:16;-ms-flex-order:16;order:16}.ant-col-xl-15{display:block;width:62.5%}.ant-col-xl-push-15{left:62.5%}.ant-col-xl-pull-15{right:62.5%}.ant-col-xl-offset-15{margin-left:62.5%}.ant-col-xl-order-15{-webkit-box-ordinal-group:16;-webkit-order:15;-ms-flex-order:15;order:15}.ant-col-xl-14{display:block;width:58.33333333%}.ant-col-xl-push-14{left:58.33333333%}.ant-col-xl-pull-14{right:58.33333333%}.ant-col-xl-offset-14{margin-left:58.33333333%}.ant-col-xl-order-14{-webkit-box-ordinal-group:15;-webkit-order:14;-ms-flex-order:14;order:14}.ant-col-xl-13{display:block;width:54.16666667%}.ant-col-xl-push-13{left:54.16666667%}.ant-col-xl-pull-13{right:54.16666667%}.ant-col-xl-offset-13{margin-left:54.16666667%}.ant-col-xl-order-13{-webkit-box-ordinal-group:14;-webkit-order:13;-ms-flex-order:13;order:13}.ant-col-xl-12{display:block;width:50%}.ant-col-xl-push-12{left:50%}.ant-col-xl-pull-12{right:50%}.ant-col-xl-offset-12{margin-left:50%}.ant-col-xl-order-12{-webkit-box-ordinal-group:13;-webkit-order:12;-ms-flex-order:12;order:12}.ant-col-xl-11{display:block;width:45.83333333%}.ant-col-xl-push-11{left:45.83333333%}.ant-col-xl-pull-11{right:45.83333333%}.ant-col-xl-offset-11{margin-left:45.83333333%}.ant-col-xl-order-11{-webkit-box-ordinal-group:12;-webkit-order:11;-ms-flex-order:11;order:11}.ant-col-xl-10{display:block;width:41.66666667%}.ant-col-xl-push-10{left:41.66666667%}.ant-col-xl-pull-10{right:41.66666667%}.ant-col-xl-offset-10{margin-left:41.66666667%}.ant-col-xl-order-10{-webkit-box-ordinal-group:11;-webkit-order:10;-ms-flex-order:10;order:10}.ant-col-xl-9{display:block;width:37.5%}.ant-col-xl-push-9{left:37.5%}.ant-col-xl-pull-9{right:37.5%}.ant-col-xl-offset-9{margin-left:37.5%}.ant-col-xl-order-9{-webkit-box-ordinal-group:10;-webkit-order:9;-ms-flex-order:9;order:9}.ant-col-xl-8{display:block;width:33.33333333%}.ant-col-xl-push-8{left:33.33333333%}.ant-col-xl-pull-8{right:33.33333333%}.ant-col-xl-offset-8{margin-left:33.33333333%}.ant-col-xl-order-8{-webkit-box-ordinal-group:9;-webkit-order:8;-ms-flex-order:8;order:8}.ant-col-xl-7{display:block;width:29.16666667%}.ant-col-xl-push-7{left:29.16666667%}.ant-col-xl-pull-7{right:29.16666667%}.ant-col-xl-offset-7{margin-left:29.16666667%}.ant-col-xl-order-7{-webkit-box-ordinal-group:8;-webkit-order:7;-ms-flex-order:7;order:7}.ant-col-xl-6{display:block;width:25%}.ant-col-xl-push-6{left:25%}.ant-col-xl-pull-6{right:25%}.ant-col-xl-offset-6{margin-left:25%}.ant-col-xl-order-6{-webkit-box-ordinal-group:7;-webkit-order:6;-ms-flex-order:6;order:6}.ant-col-xl-5{display:block;width:20.83333333%}.ant-col-xl-push-5{left:20.83333333%}.ant-col-xl-pull-5{right:20.83333333%}.ant-col-xl-offset-5{margin-left:20.83333333%}.ant-col-xl-order-5{-webkit-box-ordinal-group:6;-webkit-order:5;-ms-flex-order:5;order:5}.ant-col-xl-4{display:block;width:16.66666667%}.ant-col-xl-push-4{left:16.66666667%}.ant-col-xl-pull-4{right:16.66666667%}.ant-col-xl-offset-4{margin-left:16.66666667%}.ant-col-xl-order-4{-webkit-box-ordinal-group:5;-webkit-order:4;-ms-flex-order:4;order:4}.ant-col-xl-3{display:block;width:12.5%}.ant-col-xl-push-3{left:12.5%}.ant-col-xl-pull-3{right:12.5%}.ant-col-xl-offset-3{margin-left:12.5%}.ant-col-xl-order-3{-webkit-box-ordinal-group:4;-webkit-order:3;-ms-flex-order:3;order:3}.ant-col-xl-2{display:block;width:8.33333333%}.ant-col-xl-push-2{left:8.33333333%}.ant-col-xl-pull-2{right:8.33333333%}.ant-col-xl-offset-2{margin-left:8.33333333%}.ant-col-xl-order-2{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.ant-col-xl-1{display:block;width:4.16666667%}.ant-col-xl-push-1{left:4.16666667%}.ant-col-xl-pull-1{right:4.16666667%}.ant-col-xl-offset-1{margin-left:4.16666667%}.ant-col-xl-order-1{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.ant-col-xl-0{display:none}.ant-col-push-0{left:auto}.ant-col-pull-0{right:auto}.ant-col-xl-push-0{left:auto}.ant-col-xl-pull-0{right:auto}.ant-col-xl-offset-0{margin-left:0}.ant-col-xl-order-0{-webkit-box-ordinal-group:1;-webkit-order:0;-ms-flex-order:0;order:0}}.ant-collapse{background-color:#f7f7f7;border-radius:4px;border:1px solid #d9d9d9;border-bottom:0}.ant-collapse>.ant-collapse-item{border-bottom:1px solid #d9d9d9}.ant-collapse>.ant-collapse-item>.ant-collapse-header{height:38px;line-height:38px;padding-left:32px;color:rgba(0,0,0,.85);cursor:pointer;position:relative;-webkit-transition:all .3s;transition:all .3s}.ant-collapse>.ant-collapse-item>.ant-collapse-header:active{background-color:#eee!important}.ant-collapse>.ant-collapse-item>.ant-collapse-header .arrow{font-size:12px;font-size:9px\9;-webkit-transform:scale(.75) rotate(0);-ms-transform:scale(.75) rotate(0);transform:scale(.75) rotate(0);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";zoom:1;font-style:normal;vertical-align:baseline;text-align:center;text-transform:none;line-height:1;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;position:absolute;color:rgba(0,0,0,.43);display:inline-block;font-weight:700;line-height:40px;vertical-align:middle;-webkit-transition:-webkit-transform .24s;transition:-webkit-transform .24s;transition:transform .24s;transition:transform .24s,-webkit-transform .24s;top:0;left:16px;top:16px\9;left:0\9}:root .ant-collapse>.ant-collapse-item>.ant-collapse-header .arrow{-webkit-filter:none;filter:none;font-size:12px}.ant-collapse>.ant-collapse-item>.ant-collapse-header .arrow:before{display:block;font-family:anticon!important;content:"\E61F"}.ant-collapse-anim-active{-webkit-transition:height .2s cubic-bezier(.215,.61,.355,1);transition:height .2s cubic-bezier(.215,.61,.355,1)}.ant-collapse-content{overflow:hidden;color:rgba(0,0,0,.65);padding:0 16px;background-color:#fff}.ant-collapse-content>.ant-collapse-content-box{padding-top:16px;padding-bottom:16px}.ant-collapse-content-inactive{display:none}.ant-collapse-item:last-child>.ant-collapse-content{border-radius:0 0 4px 4px}.ant-collapse>.ant-collapse-item>.ant-collapse-header[aria-expanded=true] .arrow{display:inline-block;font-size:12px;font-size:9px\9;-webkit-transform:scale(.75) rotate(90deg);-ms-transform:scale(.75) rotate(90deg);transform:scale(.75) rotate(90deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=0.00000000000000006123, M12=-1, M21=1, M22=0.00000000000000006123)";zoom:1}:root .ant-collapse>.ant-collapse-item>.ant-collapse-header[aria-expanded=true] .arrow{-webkit-filter:none;filter:none;font-size:12px}.ant-collapse-borderless{background-color:#fff;border:0}.ant-collapse-borderless>.ant-collapse-item-active{border:0}.ant-collapse-borderless>.ant-collapse-item>.ant-collapse-content{background-color:transparent;border-top:1px solid #d9d9d9}.ant-collapse-borderless>.ant-collapse-item>.ant-collapse-header{-webkit-transition:all .3s;transition:all .3s}.ant-collapse-borderless>.ant-collapse-item>.ant-collapse-header:hover{background-color:#f7f7f7}.ant-calendar-picker-container{position:absolute;z-index:1050}.ant-calendar-picker-container.slide-up-appear.slide-up-appear-active.ant-calendar-picker-container-placement-topLeft,.ant-calendar-picker-container.slide-up-appear.slide-up-appear-active.ant-calendar-picker-container-placement-topRight,.ant-calendar-picker-container.slide-up-enter.slide-up-enter-active.ant-calendar-picker-container-placement-topLeft,.ant-calendar-picker-container.slide-up-enter.slide-up-enter-active.ant-calendar-picker-container-placement-topRight{-webkit-animation-name:antSlideDownIn;animation-name:antSlideDownIn}.ant-calendar-picker-container.slide-up-appear.slide-up-appear-active.ant-calendar-picker-container-placement-bottomLeft,.ant-calendar-picker-container.slide-up-appear.slide-up-appear-active.ant-calendar-picker-container-placement-bottomRight,.ant-calendar-picker-container.slide-up-enter.slide-up-enter-active.ant-calendar-picker-container-placement-bottomLeft,.ant-calendar-picker-container.slide-up-enter.slide-up-enter-active.ant-calendar-picker-container-placement-bottomRight{-webkit-animation-name:antSlideUpIn;animation-name:antSlideUpIn}.ant-calendar-picker-container.slide-up-leave.slide-up-leave-active.ant-calendar-picker-container-placement-topLeft,.ant-calendar-picker-container.slide-up-leave.slide-up-leave-active.ant-calendar-picker-container-placement-topRight{-webkit-animation-name:antSlideDownOut;animation-name:antSlideDownOut}.ant-calendar-picker-container.slide-up-leave.slide-up-leave-active.ant-calendar-picker-container-placement-bottomLeft,.ant-calendar-picker-container.slide-up-leave.slide-up-leave-active.ant-calendar-picker-container-placement-bottomRight{-webkit-animation-name:antSlideUpOut;animation-name:antSlideUpOut}.ant-calendar-picker{position:relative;display:inline-block;outline:none;font-size:12px;-webkit-transition:opacity .3s;transition:opacity .3s}.ant-calendar-picker-input{outline:none}.ant-calendar-picker:hover .ant-calendar-picker-input:not([disabled]){border-color:#108ee9}.ant-calendar-picker-clear{opacity:0;pointer-events:none;z-index:1;position:absolute;right:7px;background:#fff;top:50%;font-size:12px;color:rgba(0,0,0,.25);width:14px;height:14px;margin-top:-7px;line-height:14px;cursor:pointer;-webkit-transition:color .3s,opacity .3s;transition:color .3s,opacity .3s}.ant-calendar-picker-clear:hover{color:rgba(0,0,0,.43)}.ant-calendar-picker:hover .ant-calendar-picker-clear{opacity:1;pointer-events:auto}.ant-calendar-picker-icon{position:absolute;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .3s;transition:all .3s;width:12px;height:12px;line-height:12px;right:8px;color:rgba(0,0,0,.43);top:50%;margin-top:-6px}.ant-calendar-picker-icon:after{content:"\E6BB";font-family:anticon;font-size:12px;color:rgba(0,0,0,.43);display:inline-block;line-height:1;vertical-align:bottom}.ant-calendar{position:relative;outline:none;width:231px;border:1px solid #fff;list-style:none;font-size:12px;text-align:left;background-color:#fff;border-radius:4px;box-shadow:0 1px 6px rgba(0,0,0,.2);background-clip:padding-box;line-height:1.5}.ant-calendar-input-wrap{height:34px;padding:6px;border-bottom:1px solid #e9e9e9}.ant-calendar-input{border:0;width:100%;cursor:auto;outline:0;height:22px;color:rgba(0,0,0,.65)}.ant-calendar-week-number{width:286px}.ant-calendar-week-number-cell{text-align:center}.ant-calendar-header{height:34px;line-height:34px;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-bottom:1px solid #e9e9e9}.ant-calendar-header a:hover{color:#49a9ee}.ant-calendar-header .ant-calendar-century-select,.ant-calendar-header .ant-calendar-decade-select,.ant-calendar-header .ant-calendar-month-select,.ant-calendar-header .ant-calendar-year-select{padding:0 2px;font-weight:700;display:inline-block;color:rgba(0,0,0,.65);line-height:34px}.ant-calendar-header .ant-calendar-century-select-arrow,.ant-calendar-header .ant-calendar-decade-select-arrow,.ant-calendar-header .ant-calendar-month-select-arrow,.ant-calendar-header .ant-calendar-year-select-arrow{display:none}.ant-calendar-header .ant-calendar-next-century-btn,.ant-calendar-header .ant-calendar-next-decade-btn,.ant-calendar-header .ant-calendar-next-month-btn,.ant-calendar-header .ant-calendar-next-year-btn,.ant-calendar-header .ant-calendar-prev-century-btn,.ant-calendar-header .ant-calendar-prev-decade-btn,.ant-calendar-header .ant-calendar-prev-month-btn,.ant-calendar-header .ant-calendar-prev-year-btn{position:absolute;top:0;color:rgba(0,0,0,.43);font-family:Arial,Hiragino Sans GB,Microsoft Yahei,Microsoft Sans Serif,sans-serif;padding:0 5px;font-size:16px;display:inline-block;line-height:34px}.ant-calendar-header .ant-calendar-prev-century-btn,.ant-calendar-header .ant-calendar-prev-decade-btn,.ant-calendar-header .ant-calendar-prev-year-btn{left:7px}.ant-calendar-header .ant-calendar-prev-century-btn:after,.ant-calendar-header .ant-calendar-prev-decade-btn:after,.ant-calendar-header .ant-calendar-prev-year-btn:after{content:"\AB"}.ant-calendar-header .ant-calendar-next-century-btn,.ant-calendar-header .ant-calendar-next-decade-btn,.ant-calendar-header .ant-calendar-next-year-btn{right:7px}.ant-calendar-header .ant-calendar-next-century-btn:after,.ant-calendar-header .ant-calendar-next-decade-btn:after,.ant-calendar-header .ant-calendar-next-year-btn:after{content:"\BB"}.ant-calendar-header .ant-calendar-prev-month-btn{left:29px}.ant-calendar-header .ant-calendar-prev-month-btn:after{content:"\2039"}.ant-calendar-header .ant-calendar-next-month-btn{right:29px}.ant-calendar-header .ant-calendar-next-month-btn:after{content:"\203A"}.ant-calendar-body{padding:4px 8px}.ant-calendar table{border-collapse:collapse;max-width:100%;background-color:transparent;width:100%}.ant-calendar table,.ant-calendar td,.ant-calendar th{border:0}.ant-calendar-calendar-table{border-spacing:0;margin-bottom:0}.ant-calendar-column-header{line-height:18px;width:33px;padding:6px 0;text-align:center}.ant-calendar-column-header .ant-calendar-column-header-inner{display:block;font-weight:400}.ant-calendar-week-number-header .ant-calendar-column-header-inner{display:none}.ant-calendar-cell{padding:4px 0}.ant-calendar-date{display:block;margin:0 auto;color:rgba(0,0,0,.65);border-radius:2px;width:20px;height:20px;line-height:18px;border:1px solid transparent;padding:0;background:transparent;text-align:center;-webkit-transition:background .3s ease;transition:background .3s ease}.ant-calendar-date-panel{position:relative}.ant-calendar-date:hover{background:#ecf6fd;cursor:pointer}.ant-calendar-date:active{color:#fff;background:#49a9ee}.ant-calendar-today .ant-calendar-date{border-color:#108ee9;font-weight:700;color:#108ee9}.ant-calendar-last-month-cell .ant-calendar-date,.ant-calendar-next-month-btn-day .ant-calendar-date{color:rgba(0,0,0,.25)}.ant-calendar-selected-day .ant-calendar-date{background:#108ee9;color:#fff;border:1px solid transparent}.ant-calendar-selected-day .ant-calendar-date:hover{background:#108ee9}.ant-calendar-disabled-cell .ant-calendar-date{cursor:not-allowed;color:#bcbcbc;background:#f3f3f3;border-radius:0;width:auto;border:1px solid transparent}.ant-calendar-disabled-cell .ant-calendar-date:hover{background:#f3f3f3}.ant-calendar-disabled-cell-first-of-row .ant-calendar-date{border-top-left-radius:4px;border-bottom-left-radius:4px}.ant-calendar-disabled-cell-last-of-row .ant-calendar-date{border-top-right-radius:4px;border-bottom-right-radius:4px}.ant-calendar-footer-btn{border-top:1px solid #e9e9e9;text-align:center;display:block;line-height:38px}.ant-calendar-footer>div{display:inline-block}.ant-calendar .ant-calendar-clear-btn,.ant-calendar .ant-calendar-today-btn{display:inline-block;text-align:center;margin:0 0 0 8px}.ant-calendar .ant-calendar-clear-btn-disabled,.ant-calendar .ant-calendar-today-btn-disabled{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-calendar .ant-calendar-clear-btn{display:none;position:absolute;right:5px;text-indent:-76px;overflow:hidden;width:20px;height:20px;text-align:center;line-height:20px;top:7px;margin:0}.ant-calendar .ant-calendar-clear-btn:after{font-family:anticon;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\E62E";font-size:12px;color:rgba(0,0,0,.25);display:inline-block;line-height:1;width:20px;text-indent:43px;-webkit-transition:color .3s ease;transition:color .3s ease}.ant-calendar .ant-calendar-clear-btn:hover:after{color:rgba(0,0,0,.43)}.ant-calendar .ant-calendar-ok-btn{display:inline-block;margin-bottom:0;font-weight:500;text-align:center;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;line-height:1.5;padding:4px 15px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);position:relative;color:#fff;background-color:#108ee9;border-color:#108ee9;padding:1px 7px;font-size:12px;border-radius:4px;position:absolute;bottom:8px;right:9px}.ant-calendar .ant-calendar-ok-btn>.anticon{line-height:1}.ant-calendar .ant-calendar-ok-btn,.ant-calendar .ant-calendar-ok-btn:active,.ant-calendar .ant-calendar-ok-btn:focus{outline:0}.ant-calendar .ant-calendar-ok-btn:not([disabled]):hover{text-decoration:none}.ant-calendar .ant-calendar-ok-btn:not([disabled]):active{outline:0;-webkit-transition:none;transition:none}.ant-calendar .ant-calendar-ok-btn.disabled,.ant-calendar .ant-calendar-ok-btn[disabled]{cursor:not-allowed}.ant-calendar .ant-calendar-ok-btn.disabled>*,.ant-calendar .ant-calendar-ok-btn[disabled]>*{pointer-events:none}.ant-calendar .ant-calendar-ok-btn-lg{padding:4px 15px 5px;font-size:14px;border-radius:4px}.ant-calendar .ant-calendar-ok-btn-sm{padding:1px 7px;font-size:12px;border-radius:4px}.ant-calendar .ant-calendar-ok-btn>a:only-child{color:currentColor}.ant-calendar .ant-calendar-ok-btn>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-calendar .ant-calendar-ok-btn:focus,.ant-calendar .ant-calendar-ok-btn:hover{color:#fff;background-color:#49a9ee;border-color:#49a9ee}.ant-calendar .ant-calendar-ok-btn:focus>a:only-child,.ant-calendar .ant-calendar-ok-btn:hover>a:only-child{color:currentColor}.ant-calendar .ant-calendar-ok-btn:focus>a:only-child:after,.ant-calendar .ant-calendar-ok-btn:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-calendar .ant-calendar-ok-btn.active,.ant-calendar .ant-calendar-ok-btn:active{color:#fff;background-color:#0e77ca;border-color:#0e77ca}.ant-calendar .ant-calendar-ok-btn.active>a:only-child,.ant-calendar .ant-calendar-ok-btn:active>a:only-child{color:currentColor}.ant-calendar .ant-calendar-ok-btn.active>a:only-child:after,.ant-calendar .ant-calendar-ok-btn:active>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-calendar .ant-calendar-ok-btn.disabled,.ant-calendar .ant-calendar-ok-btn.disabled.active,.ant-calendar .ant-calendar-ok-btn.disabled:active,.ant-calendar .ant-calendar-ok-btn.disabled:focus,.ant-calendar .ant-calendar-ok-btn.disabled:hover,.ant-calendar .ant-calendar-ok-btn[disabled],.ant-calendar .ant-calendar-ok-btn[disabled].active,.ant-calendar .ant-calendar-ok-btn[disabled]:active,.ant-calendar .ant-calendar-ok-btn[disabled]:focus,.ant-calendar .ant-calendar-ok-btn[disabled]:hover{color:rgba(0,0,0,.25);background-color:#f7f7f7;border-color:#d9d9d9}.ant-calendar .ant-calendar-ok-btn.disabled.active>a:only-child,.ant-calendar .ant-calendar-ok-btn.disabled:active>a:only-child,.ant-calendar .ant-calendar-ok-btn.disabled:focus>a:only-child,.ant-calendar .ant-calendar-ok-btn.disabled:hover>a:only-child,.ant-calendar .ant-calendar-ok-btn.disabled>a:only-child,.ant-calendar .ant-calendar-ok-btn[disabled].active>a:only-child,.ant-calendar .ant-calendar-ok-btn[disabled]:active>a:only-child,.ant-calendar .ant-calendar-ok-btn[disabled]:focus>a:only-child,.ant-calendar .ant-calendar-ok-btn[disabled]:hover>a:only-child,.ant-calendar .ant-calendar-ok-btn[disabled]>a:only-child{color:currentColor}.ant-calendar .ant-calendar-ok-btn.disabled.active>a:only-child:after,.ant-calendar .ant-calendar-ok-btn.disabled:active>a:only-child:after,.ant-calendar .ant-calendar-ok-btn.disabled:focus>a:only-child:after,.ant-calendar .ant-calendar-ok-btn.disabled:hover>a:only-child:after,.ant-calendar .ant-calendar-ok-btn.disabled>a:only-child:after,.ant-calendar .ant-calendar-ok-btn[disabled].active>a:only-child:after,.ant-calendar .ant-calendar-ok-btn[disabled]:active>a:only-child:after,.ant-calendar .ant-calendar-ok-btn[disabled]:focus>a:only-child:after,.ant-calendar .ant-calendar-ok-btn[disabled]:hover>a:only-child:after,.ant-calendar .ant-calendar-ok-btn[disabled]>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-calendar .ant-calendar-ok-btn-disabled{color:rgba(0,0,0,.25);background-color:#f7f7f7;border-color:#d9d9d9;cursor:not-allowed}.ant-calendar .ant-calendar-ok-btn-disabled>a:only-child{color:currentColor}.ant-calendar .ant-calendar-ok-btn-disabled>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-calendar .ant-calendar-ok-btn-disabled:hover{color:rgba(0,0,0,.25);background-color:#f7f7f7;border-color:#d9d9d9}.ant-calendar .ant-calendar-ok-btn-disabled:hover>a:only-child{color:currentColor}.ant-calendar .ant-calendar-ok-btn-disabled:hover>a:only-child:after{content:"";position:absolute;top:0;left:0;bottom:0;right:0;background:transparent}.ant-calendar-range-picker-input{background-color:transparent;border:0;height:18px;line-height:18px;outline:0;width:43%;text-align:center}.ant-calendar-range-picker-input[disabled]{cursor:not-allowed}.ant-calendar-range-picker-separator{color:rgba(0,0,0,.43)}.ant-calendar-range{width:470px;overflow:hidden}.ant-calendar-range .ant-calendar-date-panel:after{content:".";display:block;height:0;clear:both;visibility:hidden}.ant-calendar-range-part{width:50%;position:relative}.ant-calendar-range-left{float:left}.ant-calendar-range-left .ant-calendar-time-picker-inner{border-right:2px solid #e9e9e9}.ant-calendar-range-right{float:right}.ant-calendar-range-right .ant-calendar-time-picker-inner{border-left:2px solid #e9e9e9}.ant-calendar-range-middle{position:absolute;left:50%;width:20px;margin-left:-132px;text-align:center;height:34px;line-height:34px;color:rgba(0,0,0,.43)}.ant-calendar-range-right .ant-calendar-date-input-wrap{margin-left:-118px}.ant-calendar-range.ant-calendar-time .ant-calendar-range-middle{margin-left:-12px}.ant-calendar-range.ant-calendar-time .ant-calendar-range-right .ant-calendar-date-input-wrap{margin-left:0}.ant-calendar-range .ant-calendar-input-wrap{position:relative;height:34px}.ant-calendar-range .ant-calendar-input,.ant-calendar-range .ant-calendar-time-picker-input{position:relative;display:inline-block;padding:4px 7px;width:100%;height:28px;cursor:text;font-size:12px;line-height:1.5;color:rgba(0,0,0,.65);background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:4px;-webkit-transition:all .3s;transition:all .3s;height:22px;border:0;box-shadow:none}.ant-calendar-range .ant-calendar-input::-moz-placeholder,.ant-calendar-range .ant-calendar-time-picker-input::-moz-placeholder{color:#ccc;opacity:1}.ant-calendar-range .ant-calendar-input:-ms-input-placeholder,.ant-calendar-range .ant-calendar-time-picker-input:-ms-input-placeholder{color:#ccc}.ant-calendar-range .ant-calendar-input::-webkit-input-placeholder,.ant-calendar-range .ant-calendar-time-picker-input::-webkit-input-placeholder{color:#ccc}.ant-calendar-range .ant-calendar-input:hover,.ant-calendar-range .ant-calendar-time-picker-input:hover{border-color:#49a9ee}.ant-calendar-range .ant-calendar-input:focus,.ant-calendar-range .ant-calendar-time-picker-input:focus{border-color:#49a9ee;outline:0;box-shadow:0 0 0 2px rgba(16,142,233,.2)}.ant-calendar-range .ant-calendar-input[disabled],.ant-calendar-range .ant-calendar-time-picker-input[disabled]{background-color:#f7f7f7;opacity:1;cursor:not-allowed;color:rgba(0,0,0,.25)}.ant-calendar-range .ant-calendar-input[disabled]:hover,.ant-calendar-range .ant-calendar-time-picker-input[disabled]:hover{border-color:#e2e2e2}textarea.ant-calendar-range .ant-calendar-input,textarea.ant-calendar-range .ant-calendar-time-picker-input{max-width:100%;height:auto;vertical-align:bottom}.ant-calendar-range .ant-calendar-input-lg,.ant-calendar-range .ant-calendar-time-picker-input-lg{padding:6px 7px;height:32px}.ant-calendar-range .ant-calendar-input-sm,.ant-calendar-range .ant-calendar-time-picker-input-sm{padding:1px 7px;height:22px}.ant-calendar-range .ant-calendar-input:focus,.ant-calendar-range .ant-calendar-time-picker-input:focus{box-shadow:none}.ant-calendar-range .ant-calendar-time-picker-icon{display:none}.ant-calendar-range.ant-calendar-week-number{width:574px}.ant-calendar-range.ant-calendar-week-number .ant-calendar-range-part{width:286px}.ant-calendar-range .ant-calendar-month-panel,.ant-calendar-range .ant-calendar-year-panel{top:34px}.ant-calendar-range .ant-calendar-month-panel .ant-calendar-year-panel{top:0}.ant-calendar-range .ant-calendar-decade-panel-table,.ant-calendar-range .ant-calendar-month-panel-table,.ant-calendar-range .ant-calendar-year-panel-table{height:208px}.ant-calendar-range .ant-calendar-in-range-cell{border-radius:0;position:relative}.ant-calendar-range .ant-calendar-in-range-cell>div{position:relative;z-index:1}.ant-calendar-range .ant-calendar-in-range-cell:before{content:"";display:block;background:#ecf6fd;border-radius:0;border:0;position:absolute;top:4px;bottom:4px;left:0;right:0}.ant-calendar-range-bottom{text-align:right}.ant-calendar-range-bottom .ant-calendar-footer-btn{padding-right:16px}div.ant-calendar-range-quick-selector{display:block;text-align:left;border-top:1px solid #e9e9e9;padding:10.5px 10px}div.ant-calendar-range-quick-selector>a{margin-right:16px}.ant-calendar-range .ant-calendar-header,.ant-calendar-range .ant-calendar-month-panel-header,.ant-calendar-range .ant-calendar-year-panel-header{border-bottom:0}.ant-calendar-range .ant-calendar-body,.ant-calendar-range .ant-calendar-month-panel-body,.ant-calendar-range .ant-calendar-year-panel-body{border-top:1px solid #e9e9e9}.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker{height:207px;width:100%;top:68px;z-index:2}.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-panel{height:241px;margin-top:-34px}.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-inner{padding-top:34px;height:100%;background:none}.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-combobox{display:inline-block;height:100%;background-color:#fff;border-top:1px solid #e9e9e9}.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-select{height:100%}.ant-calendar-range.ant-calendar-time .ant-calendar-time-picker-select ul{max-height:100%}.ant-calendar-range.ant-calendar-time .ant-calendar-footer-btn{padding:9px 12px 9px 0;display:block;zoom:1}.ant-calendar-range.ant-calendar-time .ant-calendar-footer-btn:after,.ant-calendar-range.ant-calendar-time .ant-calendar-footer-btn:before{content:" ";display:table}.ant-calendar-range.ant-calendar-time .ant-calendar-footer-btn:after{clear:both;visibility:hidden;font-size:0;height:0}.ant-calendar-range.ant-calendar-time .ant-calendar-ok-btn{position:static;height:22px}.ant-calendar-range.ant-calendar-time .ant-calendar-footer .ant-calendar-time-picker-btn{margin-right:12px}.ant-calendar-range.ant-calendar-time .ant-calendar-today-btn{margin:8px 12px;height:22px;line-height:22px}.ant-calendar-range-with-ranges.ant-calendar-time .ant-calendar-time-picker{height:247px}.ant-calendar-range-with-ranges.ant-calendar-time .ant-calendar-time-picker-panel{height:281px}.ant-calendar-range.ant-calendar-show-time-picker .ant-calendar-body{border-top-color:transparent}.ant-calendar-time-picker{position:absolute;width:100%;top:34px;background-color:#fff}.ant-calendar-time-picker-panel{z-index:1050;position:absolute;width:100%}.ant-calendar-time-picker-inner{display:inline-block;position:relative;outline:none;list-style:none;font-size:12px;text-align:left;background-color:#fff;background-clip:padding-box;line-height:1.5;overflow:hidden;width:100%}.ant-calendar-time-picker-1-column,.ant-calendar-time-picker-1-column .ant-calendar-time-picker-select,.ant-calendar-time-picker-combobox{width:100%}.ant-calendar-time-picker-2-columns .ant-calendar-time-picker-select{width:50%}.ant-calendar-time-picker-1-column .ant-calendar-time-picker-select li,.ant-calendar-time-picker-2-columns .ant-calendar-time-picker-select li{padding:0;text-align:center}.ant-calendar-time-picker-input-wrap{display:none}.ant-calendar-time-picker-select{float:left;font-size:12px;border:1px solid #e9e9e9;border-width:0 1px;margin-left:-1px;box-sizing:border-box;width:33.6%;overflow:hidden;position:relative;height:206px}.ant-calendar-time-picker-select:hover{overflow-y:auto}.ant-calendar-time-picker-select:first-child{border-left:0;margin-left:0}.ant-calendar-time-picker-select:last-child{border-right:0}.ant-calendar-time-picker-select ul{list-style:none;box-sizing:border-box;margin:0;padding:0;width:100%;max-height:206px}.ant-calendar-time-picker-select li{padding:0 0 0 28px;list-style:none;box-sizing:content-box;margin:0;width:100%;height:24px;line-height:24px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:background .3s ease;transition:background .3s ease}.ant-calendar-time-picker-select li:last-child:after{content:"";height:182px;display:block}.ant-calendar-time-picker-select li:hover{background:#ecf6fd}li.ant-calendar-time-picker-select-option-selected{background:#f7f7f7;font-weight:700}li.ant-calendar-time-picker-select-option-disabled{color:rgba(0,0,0,.25)}li.ant-calendar-time-picker-select-option-disabled:hover{background:transparent;cursor:not-allowed}.ant-calendar-time .ant-calendar-day-select{padding:0 2px;font-weight:700;display:inline-block;color:rgba(0,0,0,.65);line-height:34px}.ant-calendar-time .ant-calendar-footer{text-align:right;position:relative;height:auto;line-height:auto}.ant-calendar-time .ant-calendar-footer-btn{padding:10px 0;line-height:1.5;text-align:right}.ant-calendar-time .ant-calendar-footer .ant-calendar-today-btn{float:left;margin:0;padding-left:12px}.ant-calendar-time .ant-calendar-footer .ant-calendar-time-picker-btn{display:inline-block;text-align:center;margin-right:60px}.ant-calendar-time .ant-calendar-footer .ant-calendar-time-picker-btn-disabled{color:rgba(0,0,0,.25)}.ant-calendar-month-panel{left:0;top:1px;bottom:0;right:0;background:#fff;z-index:10;position:absolute;outline:none;border-radius:4px}.ant-calendar-month-panel-hidden{display:none}.ant-calendar-month-panel-header{height:34px;line-height:34px;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-bottom:1px solid #e9e9e9}.ant-calendar-month-panel-header a:hover{color:#49a9ee}.ant-calendar-month-panel-header .ant-calendar-month-panel-century-select,.ant-calendar-month-panel-header .ant-calendar-month-panel-decade-select,.ant-calendar-month-panel-header .ant-calendar-month-panel-month-select,.ant-calendar-month-panel-header .ant-calendar-month-panel-year-select{padding:0 2px;font-weight:700;display:inline-block;color:rgba(0,0,0,.65);line-height:34px}.ant-calendar-month-panel-header .ant-calendar-month-panel-century-select-arrow,.ant-calendar-month-panel-header .ant-calendar-month-panel-decade-select-arrow,.ant-calendar-month-panel-header .ant-calendar-month-panel-month-select-arrow,.ant-calendar-month-panel-header .ant-calendar-month-panel-year-select-arrow{display:none}.ant-calendar-month-panel-header .ant-calendar-month-panel-next-century-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-next-decade-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-next-month-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-next-year-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-century-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-decade-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-month-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-year-btn{position:absolute;top:0;color:rgba(0,0,0,.43);font-family:Arial,Hiragino Sans GB,Microsoft Yahei,Microsoft Sans Serif,sans-serif;padding:0 5px;font-size:16px;display:inline-block;line-height:34px}.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-century-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-decade-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-year-btn{left:7px}.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-century-btn:after,.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-decade-btn:after,.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-year-btn:after{content:"\AB"}.ant-calendar-month-panel-header .ant-calendar-month-panel-next-century-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-next-decade-btn,.ant-calendar-month-panel-header .ant-calendar-month-panel-next-year-btn{right:7px}.ant-calendar-month-panel-header .ant-calendar-month-panel-next-century-btn:after,.ant-calendar-month-panel-header .ant-calendar-month-panel-next-decade-btn:after,.ant-calendar-month-panel-header .ant-calendar-month-panel-next-year-btn:after{content:"\BB"}.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-month-btn{left:29px}.ant-calendar-month-panel-header .ant-calendar-month-panel-prev-month-btn:after{content:"\2039"}.ant-calendar-month-panel-header .ant-calendar-month-panel-next-month-btn{right:29px}.ant-calendar-month-panel-header .ant-calendar-month-panel-next-month-btn:after{content:"\203A"}.ant-calendar-month-panel-table{table-layout:fixed;width:100%;height:248px;border-collapse:separate}.ant-calendar-month-panel-selected-cell .ant-calendar-month-panel-month,.ant-calendar-month-panel-selected-cell .ant-calendar-month-panel-month:hover{background:#108ee9;color:#fff}.ant-calendar-month-panel-cell{text-align:center}.ant-calendar-month-panel-cell-disabled .ant-calendar-month-panel-month,.ant-calendar-month-panel-cell-disabled .ant-calendar-month-panel-month:hover{cursor:not-allowed;color:#bcbcbc;background:#f3f3f3}.ant-calendar-month-panel-month{display:inline-block;margin:0 auto;color:rgba(0,0,0,.65);background:transparent;text-align:center;height:24px;line-height:24px;padding:0 6px;border-radius:4px;-webkit-transition:background .3s ease;transition:background .3s ease}.ant-calendar-month-panel-month:hover{background:#ecf6fd;cursor:pointer}.ant-calendar-year-panel{left:0;top:1px;bottom:0;right:0;background:#fff;z-index:10;position:absolute;outline:none;border-radius:4px}.ant-calendar-year-panel-hidden{display:none}.ant-calendar-year-panel-header{height:34px;line-height:34px;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-bottom:1px solid #e9e9e9}.ant-calendar-year-panel-header a:hover{color:#49a9ee}.ant-calendar-year-panel-header .ant-calendar-year-panel-century-select,.ant-calendar-year-panel-header .ant-calendar-year-panel-decade-select,.ant-calendar-year-panel-header .ant-calendar-year-panel-month-select,.ant-calendar-year-panel-header .ant-calendar-year-panel-year-select{padding:0 2px;font-weight:700;display:inline-block;color:rgba(0,0,0,.65);line-height:34px}.ant-calendar-year-panel-header .ant-calendar-year-panel-century-select-arrow,.ant-calendar-year-panel-header .ant-calendar-year-panel-decade-select-arrow,.ant-calendar-year-panel-header .ant-calendar-year-panel-month-select-arrow,.ant-calendar-year-panel-header .ant-calendar-year-panel-year-select-arrow{display:none}.ant-calendar-year-panel-header .ant-calendar-year-panel-next-century-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-next-decade-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-next-month-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-next-year-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-century-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-decade-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-month-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-year-btn{position:absolute;top:0;color:rgba(0,0,0,.43);font-family:Arial,Hiragino Sans GB,Microsoft Yahei,Microsoft Sans Serif,sans-serif;padding:0 5px;font-size:16px;display:inline-block;line-height:34px}.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-century-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-decade-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-year-btn{left:7px}.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-century-btn:after,.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-decade-btn:after,.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-year-btn:after{content:"\AB"}.ant-calendar-year-panel-header .ant-calendar-year-panel-next-century-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-next-decade-btn,.ant-calendar-year-panel-header .ant-calendar-year-panel-next-year-btn{right:7px}.ant-calendar-year-panel-header .ant-calendar-year-panel-next-century-btn:after,.ant-calendar-year-panel-header .ant-calendar-year-panel-next-decade-btn:after,.ant-calendar-year-panel-header .ant-calendar-year-panel-next-year-btn:after{content:"\BB"}.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-month-btn{left:29px}.ant-calendar-year-panel-header .ant-calendar-year-panel-prev-month-btn:after{content:"\2039"}.ant-calendar-year-panel-header .ant-calendar-year-panel-next-month-btn{right:29px}.ant-calendar-year-panel-header .ant-calendar-year-panel-next-month-btn:after{content:"\203A"}.ant-calendar-year-panel-table{table-layout:fixed;width:100%;height:248px;border-collapse:separate}.ant-calendar-year-panel-cell{text-align:center}.ant-calendar-year-panel-year{display:inline-block;margin:0 auto;color:rgba(0,0,0,.65);background:transparent;text-align:center;height:24px;line-height:24px;padding:0 6px;border-radius:4px;-webkit-transition:background .3s ease;transition:background .3s ease}.ant-calendar-year-panel-year:hover{background:#ecf6fd;cursor:pointer}.ant-calendar-year-panel-selected-cell .ant-calendar-year-panel-year,.ant-calendar-year-panel-selected-cell .ant-calendar-year-panel-year:hover{background:#108ee9;color:#fff}.ant-calendar-year-panel-last-decade-cell .ant-calendar-year-panel-year,.ant-calendar-year-panel-next-decade-cell .ant-calendar-year-panel-year{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:rgba(0,0,0,.25)}.ant-calendar-decade-panel{left:0;top:0;bottom:0;right:0;background:#fff;z-index:10;position:absolute;outline:none;border-radius:4px}.ant-calendar-decade-panel-hidden{display:none}.ant-calendar-decade-panel-header{height:34px;line-height:34px;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-bottom:1px solid #e9e9e9}.ant-calendar-decade-panel-header a:hover{color:#49a9ee}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-century-select,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-decade-select,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-month-select,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-year-select{padding:0 2px;font-weight:700;display:inline-block;color:rgba(0,0,0,.65);line-height:34px}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-century-select-arrow,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-decade-select-arrow,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-month-select-arrow,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-year-select-arrow{display:none}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-century-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-decade-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-month-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-year-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-century-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-decade-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-month-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-year-btn{position:absolute;top:0;color:rgba(0,0,0,.43);font-family:Arial,Hiragino Sans GB,Microsoft Yahei,Microsoft Sans Serif,sans-serif;padding:0 5px;font-size:16px;display:inline-block;line-height:34px}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-century-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-decade-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-year-btn{left:7px}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-century-btn:after,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-decade-btn:after,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-year-btn:after{content:"\AB"}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-century-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-decade-btn,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-year-btn{right:7px}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-century-btn:after,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-decade-btn:after,.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-year-btn:after{content:"\BB"}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-month-btn{left:29px}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-prev-month-btn:after{content:"\2039"}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-month-btn{right:29px}.ant-calendar-decade-panel-header .ant-calendar-decade-panel-next-month-btn:after{content:"\203A"}.ant-calendar-decade-panel-table{table-layout:fixed;width:100%;height:248px;border-collapse:separate}.ant-calendar-decade-panel-cell{text-align:center;white-space:nowrap}.ant-calendar-decade-panel-decade{display:inline-block;margin:0 auto;color:rgba(0,0,0,.65);background:transparent;text-align:center;height:24px;line-height:24px;padding:0 6px;border-radius:4px;-webkit-transition:background .3s ease;transition:background .3s ease}.ant-calendar-decade-panel-decade:hover{background:#ecf6fd;cursor:pointer}.ant-calendar-decade-panel-selected-cell .ant-calendar-decade-panel-decade,.ant-calendar-decade-panel-selected-cell .ant-calendar-decade-panel-decade:hover{background:#108ee9;color:#fff}.ant-calendar-decade-panel-last-century-cell .ant-calendar-decade-panel-decade,.ant-calendar-decade-panel-next-century-cell .ant-calendar-decade-panel-decade{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:rgba(0,0,0,.25)}.ant-calendar-month .ant-calendar-month-panel,.ant-calendar-month .ant-calendar-year-panel{top:0}.ant-time-picker-panel{max-width:168px;z-index:1050;position:absolute}.ant-time-picker-panel-inner{display:inline-block;position:relative;outline:none;list-style:none;font-size:12px;text-align:left;background-color:#fff;border-radius:4px;box-shadow:0 1px 6px rgba(0,0,0,.2);background-clip:padding-box;line-height:1.5;overflow:hidden;left:-2px}.ant-time-picker-panel-input{margin:0;padding:0;border:0;width:100%;cursor:auto;line-height:1.5;outline:0}.ant-time-picker-panel-input-wrap{box-sizing:border-box;position:relative;padding:6px;border-bottom:1px solid #e9e9e9}.ant-time-picker-panel-input-invalid{border-color:red}.ant-time-picker-panel-clear-btn{position:absolute;right:5px;cursor:pointer;overflow:hidden;width:20px;height:20px;text-align:center;line-height:20px;top:5px;margin:0}.ant-time-picker-panel-clear-btn:after{font-size:12px;color:rgba(0,0,0,.25);display:inline-block;line-height:1;width:20px;-webkit-transition:color .3s ease;transition:color .3s ease;font-family:anticon;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\E62E"}.ant-time-picker-panel-clear-btn:hover:after{color:rgba(0,0,0,.43)}.ant-time-picker-panel-narrow .ant-time-picker-panel-input-wrap{max-width:112px}.ant-time-picker-panel-select{float:left;font-size:12px;border-left:1px solid #e9e9e9;box-sizing:border-box;width:56px;overflow:hidden;position:relative;max-height:144px}.ant-time-picker-panel-select:hover{overflow-y:auto}.ant-time-picker-panel-select:first-child{border-left:0;margin-left:0}.ant-time-picker-panel-select:last-child{border-right:0}.ant-time-picker-panel-select:only-child{width:100%}.ant-time-picker-panel-select ul{list-style:none;box-sizing:border-box;margin:0;padding:0 0 120px;width:100%}.ant-time-picker-panel-select li{list-style:none;box-sizing:content-box;margin:0;padding:0 0 0 16px;width:100%;height:24px;line-height:24px;text-align:left;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:background .3s ease;transition:background .3s ease}.ant-time-picker-panel-select li:hover{background:#ecf6fd}li.ant-time-picker-panel-select-option-selected{background:#f7f7f7;font-weight:700}li.ant-time-picker-panel-select-option-disabled{color:rgba(0,0,0,.25)}li.ant-time-picker-panel-select-option-disabled:hover{background:transparent;cursor:not-allowed}.ant-time-picker-panel-combobox{zoom:1}.ant-time-picker-panel-combobox:after,.ant-time-picker-panel-combobox:before{content:" ";display:table}.ant-time-picker-panel-combobox:after{clear:both;visibility:hidden;font-size:0;height:0}.ant-time-picker-panel-addon{padding:8px;border-top:1px solid #e9e9e9}.ant-time-picker-panel.slide-up-appear.slide-up-appear-active.ant-time-picker-panel-placement-topLeft,.ant-time-picker-panel.slide-up-appear.slide-up-appear-active.ant-time-picker-panel-placement-topRight,.ant-time-picker-panel.slide-up-enter.slide-up-enter-active.ant-time-picker-panel-placement-topLeft,.ant-time-picker-panel.slide-up-enter.slide-up-enter-active.ant-time-picker-panel-placement-topRight{-webkit-animation-name:antSlideDownIn;animation-name:antSlideDownIn}.ant-time-picker-panel.slide-up-appear.slide-up-appear-active.ant-time-picker-panel-placement-bottomLeft,.ant-time-picker-panel.slide-up-appear.slide-up-appear-active.ant-time-picker-panel-placement-bottomRight,.ant-time-picker-panel.slide-up-enter.slide-up-enter-active.ant-time-picker-panel-placement-bottomLeft,.ant-time-picker-panel.slide-up-enter.slide-up-enter-active.ant-time-picker-panel-placement-bottomRight{-webkit-animation-name:antSlideUpIn;animation-name:antSlideUpIn}.ant-time-picker-panel.slide-up-leave.slide-up-leave-active.ant-time-picker-panel-placement-topLeft,.ant-time-picker-panel.slide-up-leave.slide-up-leave-active.ant-time-picker-panel-placement-topRight{-webkit-animation-name:antSlideDownOut;animation-name:antSlideDownOut}.ant-time-picker-panel.slide-up-leave.slide-up-leave-active.ant-time-picker-panel-placement-bottomLeft,.ant-time-picker-panel.slide-up-leave.slide-up-leave-active.ant-time-picker-panel-placement-bottomRight{-webkit-animation-name:antSlideUpOut;animation-name:antSlideUpOut}.ant-time-picker{outline:none;-webkit-transition:opacity .3s ease;transition:opacity .3s ease;width:100px}.ant-time-picker,.ant-time-picker-input{position:relative;display:inline-block;font-size:12px}.ant-time-picker-input{padding:4px 7px;width:100%;height:28px;cursor:text;line-height:1.5;color:rgba(0,0,0,.65);background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:4px;-webkit-transition:all .3s;transition:all .3s}.ant-time-picker-input::-moz-placeholder{color:#ccc;opacity:1}.ant-time-picker-input:-ms-input-placeholder{color:#ccc}.ant-time-picker-input::-webkit-input-placeholder{color:#ccc}.ant-time-picker-input:hover{border-color:#49a9ee}.ant-time-picker-input:focus{border-color:#49a9ee;outline:0;box-shadow:0 0 0 2px rgba(16,142,233,.2)}.ant-time-picker-input[disabled]{background-color:#f7f7f7;opacity:1;cursor:not-allowed;color:rgba(0,0,0,.25)}.ant-time-picker-input[disabled]:hover{border-color:#e2e2e2}textarea.ant-time-picker-input{max-width:100%;height:auto;vertical-align:bottom}.ant-time-picker-input-lg{padding:6px 7px;height:32px}.ant-time-picker-input-sm{padding:1px 7px;height:22px}.ant-time-picker-large .ant-time-picker-input{padding:6px 7px;height:32px}.ant-time-picker-small .ant-time-picker-input{padding:1px 7px;height:22px}.ant-time-picker-open{opacity:0}.ant-time-picker-icon{position:absolute;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);width:12px;height:12px;line-height:12px;right:8px;color:rgba(0,0,0,.43);top:50%;margin-top:-6px}.ant-time-picker-icon:after{content:"\E641";font-family:anticon;font-size:12px;color:rgba(0,0,0,.43);display:inline-block;line-height:1;vertical-align:bottom}.ant-dropdown{position:absolute;left:-9999px;top:-9999px;z-index:1050;display:block;font-size:12px;font-weight:400;line-height:1.5}.ant-dropdown-wrap{position:relative}.ant-dropdown-wrap .ant-btn>.anticon-down{display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);-ms-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";zoom:1}:root .ant-dropdown-wrap .ant-btn>.anticon-down{-webkit-filter:none;filter:none;font-size:12px}.ant-dropdown-wrap .anticon-down:before{-webkit-transition:-webkit-transform .2s ease;transition:-webkit-transform .2s ease;transition:transform .2s ease;transition:transform .2s ease,-webkit-transform .2s ease}.ant-dropdown-wrap-open .anticon-down:before{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.ant-dropdown-hidden,.ant-dropdown-menu-hidden{display:none}.ant-dropdown-menu{outline:none;position:relative;list-style-type:none;padding:0;margin:0;text-align:left;background-color:#fff;border-radius:4px;box-shadow:0 1px 6px rgba(0,0,0,.2);background-clip:padding-box}.ant-dropdown-menu-item,.ant-dropdown-menu-submenu-title{padding:7px 16px;margin:0;clear:both;font-size:12px;font-weight:400;color:rgba(0,0,0,.65);white-space:nowrap;cursor:pointer;-webkit-transition:all .3s;transition:all .3s}.ant-dropdown-menu-item>a,.ant-dropdown-menu-submenu-title>a{color:rgba(0,0,0,.65);display:block;padding:7px 16px;margin:-7px -16px;-webkit-transition:all .3s;transition:all .3s}.ant-dropdown-menu-item-selected,.ant-dropdown-menu-item-selected>a,.ant-dropdown-menu-submenu-title-selected,.ant-dropdown-menu-submenu-title-selected>a{color:#108ee9;background-color:#ecf6fd}.ant-dropdown-menu-item:hover,.ant-dropdown-menu-submenu-title:hover{background-color:#ecf6fd}.ant-dropdown-menu-item-disabled,.ant-dropdown-menu-submenu-title-disabled{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-dropdown-menu-item-disabled:hover,.ant-dropdown-menu-submenu-title-disabled:hover{color:rgba(0,0,0,.25);background-color:#fff;cursor:not-allowed}.ant-dropdown-menu-item:first-child,.ant-dropdown-menu-item:first-child>a,.ant-dropdown-menu-submenu-title:first-child,.ant-dropdown-menu-submenu-title:first-child>a{border-radius:4px 4px 0 0}.ant-dropdown-menu-item:last-child,.ant-dropdown-menu-item:last-child>a,.ant-dropdown-menu-submenu-title:last-child,.ant-dropdown-menu-submenu-title:last-child>a{border-radius:0 0 4px 4px}.ant-dropdown-menu-item:only-child,.ant-dropdown-menu-item:only-child>a,.ant-dropdown-menu-submenu-title:only-child,.ant-dropdown-menu-submenu-title:only-child>a{border-radius:4px}.ant-dropdown-menu-item-divider,.ant-dropdown-menu-submenu-title-divider{height:1px;overflow:hidden;background-color:#e9e9e9;line-height:0}.ant-dropdown-menu-submenu-title:after{font-family:anticon!important;position:absolute;content:"\E61F";right:12px;color:rgba(0,0,0,.43);display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);-ms-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";zoom:1}:root .ant-dropdown-menu-submenu-title:after{-webkit-filter:none;filter:none;font-size:12px}.ant-dropdown-menu-submenu-vertical{position:relative}.ant-dropdown-menu-submenu-vertical>.ant-dropdown-menu{top:0;left:100%;position:absolute;min-width:100%;margin-left:4px;-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}.ant-dropdown-menu-submenu:first-child .ant-dropdown-menu-submenu-title{border-radius:4px 4px 0 0}.ant-dropdown-menu-submenu:last-child .ant-dropdown-menu-submenu-title{border-radius:0 0 4px 4px}.ant-dropdown.slide-down-appear.slide-down-appear-active.ant-dropdown-placement-bottomCenter,.ant-dropdown.slide-down-appear.slide-down-appear-active.ant-dropdown-placement-bottomLeft,.ant-dropdown.slide-down-appear.slide-down-appear-active.ant-dropdown-placement-bottomRight,.ant-dropdown.slide-down-enter.slide-down-enter-active.ant-dropdown-placement-bottomCenter,.ant-dropdown.slide-down-enter.slide-down-enter-active.ant-dropdown-placement-bottomLeft,.ant-dropdown.slide-down-enter.slide-down-enter-active.ant-dropdown-placement-bottomRight{-webkit-animation-name:antSlideUpIn;animation-name:antSlideUpIn}.ant-dropdown.slide-up-appear.slide-up-appear-active.ant-dropdown-placement-topCenter,.ant-dropdown.slide-up-appear.slide-up-appear-active.ant-dropdown-placement-topLeft,.ant-dropdown.slide-up-appear.slide-up-appear-active.ant-dropdown-placement-topRight,.ant-dropdown.slide-up-enter.slide-up-enter-active.ant-dropdown-placement-topCenter,.ant-dropdown.slide-up-enter.slide-up-enter-active.ant-dropdown-placement-topLeft,.ant-dropdown.slide-up-enter.slide-up-enter-active.ant-dropdown-placement-topRight{-webkit-animation-name:antSlideDownIn;animation-name:antSlideDownIn}.ant-dropdown.slide-down-leave.slide-down-leave-active.ant-dropdown-placement-bottomCenter,.ant-dropdown.slide-down-leave.slide-down-leave-active.ant-dropdown-placement-bottomLeft,.ant-dropdown.slide-down-leave.slide-down-leave-active.ant-dropdown-placement-bottomRight{-webkit-animation-name:antSlideUpOut;animation-name:antSlideUpOut}.ant-dropdown.slide-up-leave.slide-up-leave-active.ant-dropdown-placement-topCenter,.ant-dropdown.slide-up-leave.slide-up-leave-active.ant-dropdown-placement-topLeft,.ant-dropdown.slide-up-leave.slide-up-leave-active.ant-dropdown-placement-topRight{-webkit-animation-name:antSlideDownOut;animation-name:antSlideDownOut}.ant-dropdown-link .anticon-down,.ant-dropdown-trigger .anticon-down{display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);-ms-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";zoom:1}:root .ant-dropdown-link .anticon-down,:root .ant-dropdown-trigger .anticon-down{-webkit-filter:none;filter:none;font-size:12px}.ant-dropdown-button{white-space:nowrap}.ant-dropdown-button.ant-btn-group>.ant-btn:last-child:not(:first-child){padding-right:7px}.ant-dropdown-button .anticon-down{display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);-ms-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";zoom:1}:root .ant-dropdown-button .anticon-down{-webkit-filter:none;filter:none;font-size:12px}.ant-dropdown-menu-dark,.ant-dropdown-menu-dark .ant-dropdown-menu{background:#404040}.ant-dropdown-menu-dark .ant-dropdown-menu-item,.ant-dropdown-menu-dark .ant-dropdown-menu-item:after,.ant-dropdown-menu-dark .ant-dropdown-menu-item>a,.ant-dropdown-menu-dark .ant-dropdown-menu-item>a:after,.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title,.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title:after{color:hsla(0,0%,100%,.67)}.ant-dropdown-menu-dark .ant-dropdown-menu-item:hover,.ant-dropdown-menu-dark .ant-dropdown-menu-item>a:hover,.ant-dropdown-menu-dark .ant-dropdown-menu-submenu-title:hover{color:#fff;background:transparent}.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected,.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected:hover,.ant-dropdown-menu-dark .ant-dropdown-menu-item-selected>a{background:#108ee9;color:#fff}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:14px;line-height:inherit;color:rgba(0,0,0,.43);border:0;border-bottom:1px solid #d9d9d9}label{font-size:12px}input[type=search]{box-sizing:border-box}input[type=checkbox],input[type=radio]{line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:15px;font-size:12px;line-height:1.5;color:rgba(0,0,0,.65)}label{position:relative}label>.anticon{vertical-align:top;font-size:12px}.ant-form-item-required:before{display:inline-block;margin-right:4px;content:"*";font-family:SimSun;line-height:1;font-size:12px;color:#f04134}.ant-form-hide-required-mark .ant-form-item-required:before{display:none}.ant-checkbox-inline.disabled,.ant-checkbox-vertical.disabled,.ant-checkbox.disabled label,.ant-radio-inline.disabled,.ant-radio-vertical.disabled,.ant-radio.disabled label,input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.ant-form-item{font-size:12px;margin-bottom:24px;color:rgba(0,0,0,.65);vertical-align:top}.ant-form-item :not(.ant-form)>.ant-form-item,.ant-form-item>.ant-form-item{margin-bottom:-24px}.ant-form-item-control{line-height:32px;position:relative;zoom:1}.ant-form-item-control:after,.ant-form-item-control:before{content:" ";display:table}.ant-form-item-control:after{clear:both;visibility:hidden;font-size:0;height:0}.ant-form-item-with-help{margin-bottom:6px}.ant-form-item-label{text-align:right;vertical-align:middle;line-height:32px;display:inline-block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ant-form-item-label label{color:rgba(0,0,0,.65)}.ant-form-item-label label:after{content:":";margin:0 8px 0 2px;position:relative;top:-.5px}.ant-form-item .ant-switch{margin:4px 0}.ant-form-item-no-colon .ant-form-item-label label:after{content:" "}.ant-form-explain{line-height:1.5}.ant-form-explain,.ant-form-extra{color:rgba(0,0,0,.43)}.ant-form-text{display:inline-block;padding-right:8px}.ant-form-split{display:block;text-align:center}form .has-feedback .ant-input{padding-right:24px}form .has-feedback .ant-select-arrow,form .has-feedback .ant-select-selection__clear{right:28px}form .has-feedback .ant-select-selection-selected-value{padding-right:42px}form .has-feedback .ant-cascader-picker-arrow{padding-right:36px}form .has-feedback .ant-calendar-picker-clear,form .has-feedback .ant-calendar-picker-icon,form .has-feedback .ant-cascader-picker-clear{right:28px}form textarea.ant-input{height:auto}form .ant-upload{background:transparent}form input[type=checkbox],form input[type=radio]{width:14px;height:14px}form .ant-checkbox-inline,form .ant-radio-inline{display:inline-block;vertical-align:middle;font-weight:400;cursor:pointer;margin-left:8px}form .ant-checkbox-inline:first-child,form .ant-radio-inline:first-child{margin-left:0}form .ant-checkbox-vertical,form .ant-radio-vertical{display:block}form .ant-checkbox-vertical+.ant-checkbox-vertical,form .ant-radio-vertical+.ant-radio-vertical{margin-left:0}form .ant-input-number{margin-top:-1px;margin-right:8px}form .ant-cascader-picker,form .ant-select{width:100%}.ant-input-group-wrap .ant-select-selection{border-bottom-left-radius:0;border-top-left-radius:0}.ant-input-group-wrap .ant-select-selection:hover{border-color:#d9d9d9}.ant-input-group-wrap .ant-select-selection--single{margin-left:-1px;height:32px;background-color:#eee}.ant-input-group-wrap .ant-select-selection--single .ant-select-selection__rendered{padding-left:8px;padding-right:25px;line-height:30px}.ant-input-group-wrap .ant-select-open .ant-select-selection{border-color:#d9d9d9;box-shadow:none}.ant-col-24.ant-form-item-label,.ant-form-vertical .ant-form-item-label{padding:0 0 8px;display:block;text-align:left}.ant-col-24.ant-form-item-label label:after,.ant-form-vertical .ant-form-item-label label:after{content:""}.ant-form-inline .ant-form-item{display:inline-block;margin-right:10px;margin-bottom:0}.ant-form-inline .ant-form-item-with-help{margin-bottom:24px}.ant-form-inline .ant-form-item>div{display:inline-block;vertical-align:middle}.ant-form-inline .ant-form-text,.ant-form-inline .has-feedback{display:inline-block}.ant-form-inline .ant-form-explain{position:absolute}.has-error.has-feedback:after,.has-success.has-feedback:after,.has-warning.has-feedback:after,.is-validating.has-feedback:after{position:absolute;top:0;right:0;visibility:visible;pointer-events:none;width:32px;height:32px;line-height:32px;text-align:center;font-size:14px;-webkit-animation:zoomIn .3s cubic-bezier(.12,.4,.29,1.46);animation:zoomIn .3s cubic-bezier(.12,.4,.29,1.46);font-family:anticon;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:""}.has-success.has-feedback:after{-webkit-animation-name:diffZoomIn1!important;animation-name:diffZoomIn1!important}.has-error.has-feedback:after{-webkit-animation-name:diffZoomIn2!important;animation-name:diffZoomIn2!important}.has-warning.has-feedback:after{-webkit-animation-name:diffZoomIn3!important;animation-name:diffZoomIn3!important}.has-success.has-feedback:after{content:"\E630";color:#00a854}.has-warning .ant-form-explain,.has-warning .ant-form-split{color:#ffbf00}.has-warning .ant-input,.has-warning .ant-input:hover{border-color:#ffbf00}.has-warning .ant-input:focus{border-color:#ffce3d;outline:0;box-shadow:0 0 0 2px rgba(255,191,0,.2)}.has-warning .ant-input:not([disabled]):hover{border-color:#ffbf00}.has-warning .ant-calendar-picker-open .ant-calendar-picker-input{border-color:#ffce3d;outline:0;box-shadow:0 0 0 2px rgba(255,191,0,.2)}.has-warning .ant-input-prefix{color:#ffbf00}.has-warning .ant-input-group-addon{color:#ffbf00;border-color:#ffbf00;background-color:#fff}.has-warning .has-feedback{color:#ffbf00}.has-warning.has-feedback:after{content:"\E62C";color:#ffbf00}.has-warning .ant-select-selection{border-color:#ffbf00}.has-warning .ant-select-focused .ant-select-selection,.has-warning .ant-select-open .ant-select-selection{border-color:#ffce3d;outline:0;box-shadow:0 0 0 2px rgba(255,191,0,.2)}.has-warning .ant-calendar-picker-icon:after,.has-warning .ant-cascader-picker-arrow,.has-warning .ant-picker-icon:after,.has-warning .ant-select-arrow{color:#ffbf00}.has-warning .ant-input-number,.has-warning .ant-time-picker-input{border-color:#ffbf00}.has-warning .ant-input-number-focused,.has-warning .ant-input-number:focus,.has-warning .ant-time-picker-input-focused,.has-warning .ant-time-picker-input:focus{border-color:#ffce3d;outline:0;box-shadow:0 0 0 2px rgba(255,191,0,.2)}.has-warning .ant-input-number:not([disabled]):hover,.has-warning .ant-time-picker-input:not([disabled]):hover{border-color:#ffbf00}.has-error .ant-form-explain,.has-error .ant-form-split{color:#f04134}.has-error .ant-input,.has-error .ant-input:hover{border-color:#f04134}.has-error .ant-input:focus{border-color:#f46e65;outline:0;box-shadow:0 0 0 2px rgba(240,65,52,.2)}.has-error .ant-input:not([disabled]):hover{border-color:#f04134}.has-error .ant-calendar-picker-open .ant-calendar-picker-input{border-color:#f46e65;outline:0;box-shadow:0 0 0 2px rgba(240,65,52,.2)}.has-error .ant-input-prefix{color:#f04134}.has-error .ant-input-group-addon{color:#f04134;border-color:#f04134;background-color:#fff}.has-error .has-feedback{color:#f04134}.has-error.has-feedback:after{content:"\E62E";color:#f04134}.has-error .ant-select-selection{border-color:#f04134}.has-error .ant-select-focused .ant-select-selection,.has-error .ant-select-open .ant-select-selection{border-color:#f46e65;outline:0;box-shadow:0 0 0 2px rgba(240,65,52,.2)}.has-error .ant-calendar-picker-icon:after,.has-error .ant-cascader-picker-arrow,.has-error .ant-picker-icon:after,.has-error .ant-select-arrow{color:#f04134}.has-error .ant-input-number,.has-error .ant-time-picker-input{border-color:#f04134}.has-error .ant-input-number-focused,.has-error .ant-input-number:focus,.has-error .ant-time-picker-input-focused,.has-error .ant-time-picker-input:focus{border-color:#f46e65;outline:0;box-shadow:0 0 0 2px rgba(240,65,52,.2)}.has-error .ant-input-number:not([disabled]):hover,.has-error .ant-mention-wrapper .ant-mention-editor,.has-error .ant-mention-wrapper .ant-mention-editor:not([disabled]):hover,.has-error .ant-time-picker-input:not([disabled]):hover{border-color:#f04134}.has-error .ant-mention-wrapper.active .ant-mention-editor,.has-error .ant-mention-wrapper .ant-mention-editor:not([disabled]):focus{border-color:#f46e65;outline:0;box-shadow:0 0 0 2px rgba(240,65,52,.2)}.is-validating.has-feedback:after{display:inline-block;-webkit-animation:loadingCircle 1s infinite linear;animation:loadingCircle 1s infinite linear;content:"\E64D";color:#108ee9}.ant-advanced-search-form .ant-form-item{margin-bottom:16px}.ant-advanced-search-form .ant-input,.ant-advanced-search-form .ant-input-group .ant-input,.ant-advanced-search-form .ant-input-group .ant-input-group-addon{height:28px}@-webkit-keyframes diffZoomIn1{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes diffZoomIn1{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes diffZoomIn2{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes diffZoomIn2{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes diffZoomIn3{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes diffZoomIn3{0%{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}.ant-input-number{position:relative;padding:4px 7px;width:100%;cursor:text;line-height:1.5;color:rgba(0,0,0,.65);background-color:#fff;background-image:none;-webkit-transition:all .3s;transition:all .3s;margin:0;padding:0;font-size:12px;height:28px;display:inline-block;border:1px solid #d9d9d9;border-radius:4px;width:80px}.ant-input-number::-moz-placeholder{color:#ccc;opacity:1}.ant-input-number:-ms-input-placeholder{color:#ccc}.ant-input-number::-webkit-input-placeholder{color:#ccc}.ant-input-number:focus{border-color:#49a9ee;outline:0;box-shadow:0 0 0 2px rgba(16,142,233,.2)}.ant-input-number[disabled]{background-color:#f7f7f7;opacity:1;cursor:not-allowed;color:rgba(0,0,0,.25)}.ant-input-number[disabled]:hover{border-color:#e2e2e2}textarea.ant-input-number{max-width:100%;height:auto;vertical-align:bottom}.ant-input-number-lg{padding:6px 7px;height:32px}.ant-input-number-sm{padding:1px 7px;height:22px}.ant-input-number-handler{text-align:center;line-height:0;height:50%;overflow:hidden;color:rgba(0,0,0,.43);position:relative;-webkit-transition:all .1s linear;transition:all .1s linear;display:block;width:100%;font-weight:700}.ant-input-number-handler:active{background:#f4f4f4}.ant-input-number-handler:hover .ant-input-number-handler-down-inner,.ant-input-number-handler:hover .ant-input-number-handler-up-inner{color:#49a9ee}.ant-input-number-handler-down-inner,.ant-input-number-handler-up-inner{font-style:normal;vertical-align:baseline;text-align:center;text-transform:none;line-height:1;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;line-height:12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:absolute;width:12px;height:12px;-webkit-transition:all .1s linear;transition:all .1s linear;display:inline-block;font-size:12px;font-size:7px\9;-webkit-transform:scale(.58333333) rotate(0deg);-ms-transform:scale(.58333333) rotate(0deg);transform:scale(.58333333) rotate(0deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";zoom:1;right:4px;color:rgba(0,0,0,.43)}.ant-input-number-handler-down-inner:before,.ant-input-number-handler-up-inner:before{display:block;font-family:anticon!important}:root .ant-input-number-handler-down-inner,:root .ant-input-number-handler-up-inner{-webkit-filter:none;filter:none;font-size:12px}.ant-input-number:hover{border-color:#49a9ee}.ant-input-number-focused{border-color:#49a9ee;outline:0;box-shadow:0 0 0 2px rgba(16,142,233,.2)}.ant-input-number-disabled{background-color:#f7f7f7;opacity:1;cursor:not-allowed;color:rgba(0,0,0,.25)}.ant-input-number-disabled:hover{border-color:#e2e2e2}.ant-input-number-input{width:100%;text-align:left;outline:0;-moz-appearance:textfield;line-height:26px;height:26px;-webkit-transition:all .3s linear;transition:all .3s linear;color:rgba(0,0,0,.65);border:0;border-radius:4px;padding:0 7px}.ant-input-number-input[disabled]{background-color:#f7f7f7;opacity:1;cursor:not-allowed;color:rgba(0,0,0,.25)}.ant-input-number-input[disabled]:hover{border-color:#e2e2e2}.ant-input-number-lg{padding:0}.ant-input-number-lg input{height:30px;line-height:30px}.ant-input-number-sm{padding:0}.ant-input-number-sm input{height:20px;line-height:20px}.ant-input-number-handler-wrap{border-left:1px solid #d9d9d9;width:22px;height:100%;background:#fff;position:absolute;top:0;right:0;opacity:0;border-radius:0 4px 4px 0;-webkit-transition:opacity .24s linear .1s;transition:opacity .24s linear .1s}.ant-input-number-handler-wrap:hover .ant-input-number-handler{height:40%}.ant-input-number:hover .ant-input-number-handler-wrap{opacity:1}.ant-input-number-handler-up{cursor:pointer}.ant-input-number-handler-up-inner{top:50%;margin-top:-6px}.ant-input-number-handler-up-inner:before{text-align:center;content:"\E61E"}.ant-input-number-handler-up:hover{height:60%!important}.ant-input-number-handler-down{border-top:1px solid #d9d9d9;top:-1px;cursor:pointer}.ant-input-number-handler-down-inner{top:50%;margin-top:-6px}.ant-input-number-handler-down-inner:before{text-align:center;content:"\E61D"}.ant-input-number-handler-down:hover{height:60%!important}.ant-input-number-disabled .ant-input-number-handler-down-inner,.ant-input-number-disabled .ant-input-number-handler-up-inner,.ant-input-number-handler-down-disabled .ant-input-number-handler-down-inner,.ant-input-number-handler-down-disabled .ant-input-number-handler-up-inner,.ant-input-number-handler-up-disabled .ant-input-number-handler-down-inner,.ant-input-number-handler-up-disabled .ant-input-number-handler-up-inner{opacity:.72;color:#ccc!important;cursor:not-allowed}.ant-input-number-disabled .ant-input-number-input{opacity:.72;cursor:not-allowed;background-color:#f3f3f3}.ant-input-number-disabled .ant-input-number-handler-wrap{display:none}.ant-input-number-disabled .ant-input-number-handler{opacity:.72;color:#ccc!important;cursor:not-allowed}.ant-layout{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-flex:1;-webkit-flex:auto;-ms-flex:auto;flex:auto;overflow:auto;background:#ececec}.ant-layout.ant-layout-has-sider{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ant-layout-footer,.ant-layout-header{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto}.ant-layout-header{background:#404040;padding:0 50px;height:64px;line-height:64px}.ant-layout-footer{padding:24px 50px;color:rgba(0,0,0,.65);font-size:12px}.ant-layout-content{-webkit-box-flex:1;-webkit-flex:auto;-ms-flex:auto;flex:auto}.ant-layout-sider{-webkit-transition:all .3s cubic-bezier(.215,.61,.355,1);transition:all .3s cubic-bezier(.215,.61,.355,1);position:relative;background:#404040}.ant-layout-sider-has-trigger{padding-bottom:48px}.ant-layout-sider-right{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.ant-layout-sider-trigger{position:absolute;text-align:center;width:100%;bottom:0;cursor:pointer;height:48px;line-height:48px;background:rgba(64,64,64,.88);color:#fff}.ant-layout-sider-zero-width>*{overflow:hidden}.ant-layout-sider-zero-width-trigger{position:absolute;top:64px;right:-36px;text-align:center;width:36px;height:42px;line-height:42px;background:#404040;color:#fff;font-size:18px;border-radius:0 4px 4px 0;cursor:pointer;-webkit-transition:background .3s ease;transition:background .3s ease}.ant-layout-sider-zero-width-trigger:hover{background:#535353}.ant-mention-wrapper{position:relative;display:inline-block;width:100%;vertical-align:middle}.ant-mention-wrapper-active .ant-mention-editor{border-color:#49a9ee;outline:0;box-shadow:0 0 0 2px rgba(16,142,233,.2)}.ant-mention-wrapper .ant-mention-editor{position:relative;display:inline-block;padding:4px 7px;width:100%;height:28px;cursor:text;font-size:12px;line-height:1.5;color:rgba(0,0,0,.65);background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:4px;-webkit-transition:all .3s;transition:all .3s;padding:0;display:block}.ant-mention-wrapper .ant-mention-editor::-moz-placeholder{color:#ccc;opacity:1}.ant-mention-wrapper .ant-mention-editor:-ms-input-placeholder{color:#ccc}.ant-mention-wrapper .ant-mention-editor::-webkit-input-placeholder{color:#ccc}.ant-mention-wrapper .ant-mention-editor:hover{border-color:#49a9ee}.ant-mention-wrapper .ant-mention-editor:focus{border-color:#49a9ee;outline:0;box-shadow:0 0 0 2px rgba(16,142,233,.2)}.ant-mention-wrapper .ant-mention-editor[disabled]{background-color:#f7f7f7;opacity:1;cursor:not-allowed;color:rgba(0,0,0,.25)}.ant-mention-wrapper .ant-mention-editor[disabled]:hover{border-color:#e2e2e2}textarea.ant-mention-wrapper .ant-mention-editor{max-width:100%;height:auto;vertical-align:bottom}.ant-mention-wrapper .ant-mention-editor-lg{padding:6px 7px;height:32px}.ant-mention-wrapper .ant-mention-editor-sm{padding:1px 7px;height:22px}.ant-mention-wrapper .ant-mention-editor-wrapper{overflow-y:auto;height:auto}.ant-mention-wrapper .public-DraftEditorPlaceholder-root{position:absolute}.ant-mention-wrapper .public-DraftEditorPlaceholder-root .public-DraftEditorPlaceholder-inner{color:#ccc;opacity:1;outline:none;white-space:pre-wrap;word-wrap:break-word;height:auto;padding:4px 7px}.ant-mention-wrapper .DraftEditor-editorContainer .public-DraftEditor-content{height:auto;padding:4px 7px}.ant-mention-dropdown{margin-top:1.5em;max-height:250px;min-width:120px;background-color:#fff;box-shadow:0 1px 6px rgba(0,0,0,.2);border-radius:4px;box-sizing:border-box;z-index:1050;left:-9999px;top:-9999px;position:absolute;outline:none;overflow-x:hidden;overflow-y:auto;font-size:12px}.ant-mention-dropdown-notfound.ant-mention-dropdown-item{color:rgba(0,0,0,.25)}.ant-mention-dropdown-notfound.ant-mention-dropdown-item .anticon-loading{color:#108ee9;text-align:center;display:block}.ant-mention-dropdown-item{position:relative;display:block;padding:7px 16px;font-weight:400;color:rgba(0,0,0,.65);white-space:nowrap;cursor:pointer;text-overflow:ellipsis;overflow:hidden;-webkit-transition:background .3s ease;transition:background .3s ease}.ant-mention-dropdown-item-active,.ant-mention-dropdown-item.focus,.ant-mention-dropdown-item:hover{background-color:#ecf6fd}.ant-mention-dropdown-item-disabled{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-mention-dropdown-item-disabled:hover{color:rgba(0,0,0,.25);background-color:#fff;cursor:not-allowed}.ant-mention-dropdown-item-selected,.ant-mention-dropdown-item-selected:hover{background-color:#f7f7f7;font-weight:700;color:rgba(0,0,0,.65)}.ant-mention-dropdown-item-divider{height:1px;margin:1px 0;overflow:hidden;background-color:#e9e9e9;line-height:0}.ant-menu{outline:none;margin-bottom:0;padding-left:0;list-style:none;z-index:1050;box-shadow:0 1px 6px rgba(0,0,0,.2);color:rgba(0,0,0,.65);background:#fff;line-height:46px}.ant-menu-hidden{display:none}.ant-menu-item-group-list{margin:0;padding:0}.ant-menu-item-group-title{color:rgba(0,0,0,.43);font-size:12px;line-height:1.5;padding:8px 16px}.ant-menu-item,.ant-menu-submenu,.ant-menu-submenu-title{cursor:pointer;-webkit-transition:all .3s ease;transition:all .3s ease}.ant-menu-item:active,.ant-menu-submenu-title:active{background:#ecf6fd}.ant-menu-submenu .ant-menu-sub{cursor:auto}.ant-menu-item>a{display:block;color:rgba(0,0,0,.65)}.ant-menu-item>a:hover{color:#108ee9}.ant-menu-item>a:before{position:absolute;background-color:transparent;width:100%;height:100%;top:0;left:0;bottom:0;right:0;content:""}.ant-menu-item-divider{height:1px;overflow:hidden;background-color:#e9e9e9;line-height:0}.ant-menu-item-active,.ant-menu-item:hover,.ant-menu-submenu-active,.ant-menu-submenu-title:hover,.ant-menu:not(.ant-menu-inline) .ant-menu-submenu-open{color:#108ee9}.ant-menu:not(.ant-menu-inline) .ant-menu-submenu-open{z-index:1050}.ant-menu-horizontal .ant-menu-item,.ant-menu-horizontal .ant-menu-submenu{margin-top:-1px}.ant-menu-horizontal>.ant-menu-item-active,.ant-menu-horizontal>.ant-menu-item:hover,.ant-menu-horizontal>.ant-menu-submenu .ant-menu-submenu-title:hover{background-color:transparent}.ant-menu-item-selected{color:#108ee9;-webkit-transform:translateZ(0);transform:translateZ(0)}.ant-menu-item-selected>a,.ant-menu-item-selected>a:hover{color:#108ee9}.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected{background-color:#ecf6fd}.ant-menu-horizontal,.ant-menu-inline,.ant-menu-vertical{z-index:auto}.ant-menu-inline,.ant-menu-vertical{border-right:1px solid #e9e9e9}.ant-menu-inline .ant-menu-item,.ant-menu-vertical .ant-menu-item{border-right:3px solid transparent;margin-left:-1px;left:1px;position:relative;z-index:1}.ant-menu-vertical.ant-menu-sub{border-right:0}.ant-menu-vertical.ant-menu-sub .ant-menu-item{border-right:0;margin-left:0;left:0}.ant-menu-vertical.ant-menu-sub>.ant-menu-item:first-child{border-radius:4px 4px 0 0}.ant-menu-vertical.ant-menu-sub>.ant-menu-item-group:last-child>.ant-menu-item-group-list:last-child>.ant-menu-item:last-child,.ant-menu-vertical.ant-menu-sub>.ant-menu-item:last-child{border-radius:0 0 4px 4px}.ant-menu-inline .ant-menu-item-selected,.ant-menu-inline .ant-menu-selected{border-right-color:#108ee9;-webkit-transform:translateZ(0);transform:translateZ(0)}.ant-menu-submenu-horizontal>.ant-menu{top:100%;left:0;position:absolute;min-width:100%;margin-top:7px;z-index:1050}.ant-menu-submenu-vertical{z-index:1}.ant-menu-submenu-vertical>.ant-menu{top:0;left:100%;position:absolute;min-width:160px;margin-left:4px;z-index:1050}.ant-menu-item,.ant-menu-submenu-title{margin:0;padding:0 20px;position:relative;display:block;white-space:nowrap}.ant-menu-item .anticon,.ant-menu-submenu-title .anticon{min-width:14px;margin-right:8px;-webkit-transition:all .3s;transition:all .3s}.ant-menu>.ant-menu-item-divider{height:1px;margin:1px 0;overflow:hidden;padding:0;line-height:0;background-color:#e5e5e5}.ant-menu-submenu{position:relative}.ant-menu-submenu>.ant-menu{background-color:#fff;border-radius:4px}.ant-menu-submenu-vertical>.ant-menu-submenu-title:after{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg) scale(.75);-ms-transform:rotate(270deg) scale(.75);transform:rotate(270deg) scale(.75)}.ant-menu-submenu-inline>.ant-menu-submenu-title:after,.ant-menu-submenu-vertical>.ant-menu-submenu-title:after{font-family:anticon!important;font-style:normal;vertical-align:baseline;text-align:center;text-transform:none;text-rendering:auto;position:absolute;-webkit-transition:-webkit-transform .3s ease;transition:-webkit-transform .3s ease;transition:transform .3s ease;transition:transform .3s ease,-webkit-transform .3s ease;content:"\E61D";right:16px}.ant-menu-submenu-inline>.ant-menu-submenu-title:after{top:0;display:inline-block;font-size:12px;font-size:8px\9;-webkit-transform:scale(.66666667) rotate(0deg);-ms-transform:scale(.66666667) rotate(0deg);transform:scale(.66666667) rotate(0deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";zoom:1}:root .ant-menu-submenu-inline>.ant-menu-submenu-title:after{-webkit-filter:none;filter:none;font-size:12px}.ant-menu-submenu-open.ant-menu-submenu-inline>.ant-menu-submenu-title:after{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(180deg) scale(.75);-ms-transform:rotate(180deg) scale(.75);transform:rotate(180deg) scale(.75)}.ant-menu-vertical .ant-menu-submenu-selected,.ant-menu-vertical .ant-menu-submenu-selected>a{color:#108ee9}.ant-menu-horizontal{border:0;border-bottom:1px solid #e9e9e9;box-shadow:none;z-index:0}.ant-menu-horizontal>.ant-menu-item,.ant-menu-horizontal>.ant-menu-submenu{position:relative;top:1px;float:left;border-bottom:2px solid transparent}.ant-menu-horizontal>.ant-menu-item-active,.ant-menu-horizontal>.ant-menu-item-open,.ant-menu-horizontal>.ant-menu-item-selected,.ant-menu-horizontal>.ant-menu-item:hover,.ant-menu-horizontal>.ant-menu-submenu-active,.ant-menu-horizontal>.ant-menu-submenu-open,.ant-menu-horizontal>.ant-menu-submenu-selected,.ant-menu-horizontal>.ant-menu-submenu:hover{border-bottom:2px solid #108ee9;color:#108ee9}.ant-menu-horizontal>.ant-menu-item>a,.ant-menu-horizontal>.ant-menu-submenu>a{display:block;color:rgba(0,0,0,.65)}.ant-menu-horizontal>.ant-menu-item>a:hover,.ant-menu-horizontal>.ant-menu-submenu>a:hover{color:#108ee9}.ant-menu-horizontal:after{content:" ";display:block;height:0;clear:both}.ant-menu-inline .ant-menu-item,.ant-menu-inline .ant-menu-submenu-title,.ant-menu-vertical .ant-menu-item,.ant-menu-vertical .ant-menu-submenu-title{padding:0 16px;font-size:12px;line-height:42px;height:42px;overflow:hidden;text-overflow:ellipsis}.ant-menu-item-group-list .ant-menu-item,.ant-menu-item-group-list .ant-menu-submenu-title{padding:0 16px 0 28px}.ant-menu-vertical.ant-menu-sub{padding:0}.ant-menu-vertical.ant-menu-sub,.ant-menu-vertical.ant-menu-sub>.ant-menu-item,.ant-menu-vertical.ant-menu-sub>.ant-menu-submenu{-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}.ant-menu-root.ant-menu-inline,.ant-menu-root.ant-menu-vertical{box-shadow:none}.ant-menu-sub.ant-menu-inline{padding:0;border:0;box-shadow:none;border-radius:0}.ant-menu-sub.ant-menu-inline>.ant-menu-item,.ant-menu-sub.ant-menu-inline>.ant-menu-submenu>.ant-menu-submenu-title{line-height:42px;height:42px;list-style-type:disc;list-style-position:inside}.ant-menu-sub.ant-menu-inline .ant-menu-item-group-title{padding-left:32px}.ant-menu-item-disabled,.ant-menu-submenu-disabled{color:rgba(0,0,0,.25)!important;cursor:not-allowed;background:none;border-color:transparent!important}.ant-menu-item-disabled>a,.ant-menu-submenu-disabled>a{color:rgba(0,0,0,.25)!important;pointer-events:none}.ant-menu-dark,.ant-menu-dark .ant-menu-sub{color:hsla(0,0%,100%,.67);background:#404040}.ant-menu-dark .ant-menu-inline.ant-menu-sub{background:#333}.ant-menu-dark.ant-menu-horizontal{border-bottom-color:#404040}.ant-menu-dark.ant-menu-horizontal>.ant-menu-item,.ant-menu-dark.ant-menu-horizontal>.ant-menu-submenu{border-color:#404040;border-bottom:0;top:0}.ant-menu-dark .ant-menu-item,.ant-menu-dark .ant-menu-item-group-title,.ant-menu-dark .ant-menu-item>a{color:hsla(0,0%,100%,.67)}.ant-menu-dark.ant-menu-inline,.ant-menu-dark.ant-menu-vertical{border-right:0}.ant-menu-dark.ant-menu-inline .ant-menu-item,.ant-menu-dark.ant-menu-vertical .ant-menu-item{border-right:0;margin-left:0;left:0}.ant-menu-dark .ant-menu-item-active,.ant-menu-dark .ant-menu-item:hover,.ant-menu-dark .ant-menu-submenu-active,.ant-menu-dark .ant-menu-submenu-selected,.ant-menu-dark .ant-menu-submenu-title:hover,.ant-menu-dark .ant-menu-submenu:hover,.ant-menu-dark:not(.ant-menu-inline) .ant-menu-submenu-open{background-color:transparent;color:#fff}.ant-menu-dark .ant-menu-item-active>a,.ant-menu-dark .ant-menu-item:hover>a,.ant-menu-dark .ant-menu-submenu-active>a,.ant-menu-dark .ant-menu-submenu-selected>a,.ant-menu-dark .ant-menu-submenu-title:hover>a,.ant-menu-dark .ant-menu-submenu:hover>a,.ant-menu-dark:not(.ant-menu-inline) .ant-menu-submenu-open>a{color:#fff}.ant-menu-dark .ant-menu-item-selected{border-right:0;color:#fff}.ant-menu-dark .ant-menu-item-selected>a,.ant-menu-dark .ant-menu-item-selected>a:hover{color:#fff}.ant-menu.ant-menu-dark .ant-menu-item-selected{background-color:transparent}.ant-menu-dark.ant-menu-inline .ant-menu-item-selected{background-color:#108ee9}.ant-menu-dark .ant-menu-item-disabled,.ant-menu-dark .ant-menu-item-disabled>a,.ant-menu-dark .ant-menu-submenu-disabled,.ant-menu-dark .ant-menu-submenu-disabled>a{opacity:.8;color:hsla(0,0%,100%,.35)!important}.ant-message{font-size:12px;position:fixed;z-index:1010;width:100%;top:16px;left:0;pointer-events:none}.ant-message-notice{padding:8px;text-align:center}.ant-message-notice:first-child{margin-top:-8px}.ant-message-notice-content{padding:8px 16px;border-radius:4px;box-shadow:0 2px 8px rgba(0,0,0,.2);background:#fff;display:inline-block;pointer-events:all}.ant-message-success .anticon{color:#00a854}.ant-message-error .anticon{color:#f04134}.ant-message-warning .anticon{color:#ffbf00}.ant-message-info .anticon,.ant-message-loading .anticon{color:#108ee9}.ant-message .anticon{margin-right:8px;font-size:14px;top:1px;position:relative}.ant-message-notice.move-up-leave.move-up-leave-active{-webkit-animation-name:MessageMoveOut;animation-name:MessageMoveOut;overflow:hidden;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes MessageMoveOut{0%{opacity:1;max-height:150px;padding:8px}to{opacity:0;max-height:0;padding:0}}@keyframes MessageMoveOut{0%{opacity:1;max-height:150px;padding:8px}to{opacity:0;max-height:0;padding:0}}.ant-modal{position:relative;width:auto;margin:0 auto;top:100px;padding-bottom:24px}.ant-modal-wrap{position:fixed;overflow:auto;top:0;right:0;bottom:0;left:0;z-index:1000;-webkit-overflow-scrolling:touch;outline:0}.ant-modal-title{margin:0;font-size:14px;line-height:21px;font-weight:500;color:rgba(0,0,0,.85)}.ant-modal-content{position:relative;background-color:#fff;border:0;border-radius:4px;background-clip:padding-box;box-shadow:0 2px 8px rgba(0,0,0,.2)}.ant-modal-close{cursor:pointer;border:0;background:transparent;position:absolute;right:16px;top:16px;z-index:10;font-weight:700;line-height:1;text-decoration:none;-webkit-transition:color .3s ease;transition:color .3s ease;color:rgba(0,0,0,.43);outline:0}.ant-modal-close-x{display:block;font-style:normal;vertical-align:baseline;text-align:center;text-transform:none;text-rendering:auto;width:14px;height:14px;font-size:14px;line-height:1}.ant-modal-close-x:before{content:"\E633";display:block;font-family:anticon!important}.ant-modal-close:focus,.ant-modal-close:hover{color:#444;text-decoration:none}.ant-modal-header{padding:14px 16px;border-radius:4px 4px 0 0;background:#fff;color:rgba(0,0,0,.65);border-bottom:1px solid #e9e9e9}.ant-modal-body{padding:16px;font-size:12px;line-height:1.5}.ant-modal-footer{border-top:1px solid #e9e9e9;padding:10px 16px 10px 10px;text-align:right;border-radius:0 0 4px 4px}.ant-modal-footer button+button{margin-left:8px;margin-bottom:0}.ant-modal.zoom-appear,.ant-modal.zoom-enter{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-transform:none;-ms-transform:none;transform:none;opacity:0}.ant-modal-mask{position:fixed;top:0;right:0;left:0;bottom:0;background-color:#373737;background-color:rgba(55,55,55,.6);height:100%;z-index:1000;filter:alpha(opacity=50)}.ant-modal-mask-hidden{display:none}.ant-modal-open{overflow:hidden}@media (max-width:768px){.ant-modal{width:auto!important;margin:10px}.vertical-center-modal .ant-modal{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}}.ant-confirm .ant-modal-close,.ant-confirm .ant-modal-header{display:none}.ant-confirm .ant-modal-body{padding:30px 40px}.ant-confirm-body-wrapper{zoom:1}.ant-confirm-body-wrapper:after,.ant-confirm-body-wrapper:before{content:" ";display:table}.ant-confirm-body-wrapper:after{clear:both;visibility:hidden;font-size:0;height:0}.ant-confirm-body .ant-confirm-title{color:rgba(0,0,0,.65);font-weight:700;font-size:14px}.ant-confirm-body .ant-confirm-content{margin-left:42px;font-size:12px;color:rgba(0,0,0,.65);margin-top:8px}.ant-confirm-body>.anticon{font-size:24px;margin-right:16px;padding:0 1px;float:left}.ant-confirm .ant-confirm-btns{margin-top:30px;float:right}.ant-confirm .ant-confirm-btns button+button{margin-left:10px;margin-bottom:0}.ant-confirm-error .ant-confirm-body>.anticon{color:#f04134}.ant-confirm-confirm .ant-confirm-body>.anticon,.ant-confirm-warning .ant-confirm-body>.anticon{color:#ffbf00}.ant-confirm-info .ant-confirm-body>.anticon{color:#108ee9}.ant-confirm-success .ant-confirm-body>.anticon{color:#00a854}.ant-notification{position:fixed;z-index:1010;width:335px;margin-right:24px}.ant-notification-bottomLeft,.ant-notification-topLeft{margin-left:24px;margin-right:0}.ant-notification-bottomLeft .ant-notification-fade-appear.ant-notification-fade-appear-active,.ant-notification-bottomLeft .ant-notification-fade-enter.ant-notification-fade-enter-active,.ant-notification-topLeft .ant-notification-fade-appear.ant-notification-fade-appear-active,.ant-notification-topLeft .ant-notification-fade-enter.ant-notification-fade-enter-active{-webkit-animation-name:NotificationLeftFadeIn;animation-name:NotificationLeftFadeIn}.ant-notification-notice{padding:16px;border-radius:4px;box-shadow:0 2px 8px rgba(0,0,0,.2);background:#fff;line-height:1.5;position:relative;margin-bottom:10px;overflow:hidden}.ant-notification-notice-message{font-size:14px;color:rgba(0,0,0,.85);margin-bottom:4px;line-height:20px}.ant-notification-notice-description{font-size:12px}.ant-notification-notice-closable .ant-notification-notice-message{padding-right:24px}.ant-notification-notice-with-icon .ant-notification-notice-message{font-size:14px;margin-left:48px;margin-bottom:4px}.ant-notification-notice-with-icon .ant-notification-notice-description{margin-left:48px;font-size:12px}.ant-notification-notice-icon{float:left;font-size:32px;line-height:32px}.ant-notification-notice-icon-success{color:#00a854}.ant-notification-notice-icon-info{color:#108ee9}.ant-notification-notice-icon-warning{color:#ffbf00}.ant-notification-notice-icon-error{color:#f04134}.ant-notification-notice-close-x:after{font-size:12px;content:"\E633";font-family:anticon;cursor:pointer}.ant-notification-notice-close{position:absolute;right:16px;top:10px;color:rgba(0,0,0,.43);outline:none}.ant-notification-notice-close:hover{color:#404040}.ant-notification-notice-btn{float:right;margin-top:16px}.ant-notification .notification-fade-effect{-webkit-animation-duration:.24s;animation-duration:.24s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:cubic-bezier(.645,.045,.355,1);animation-timing-function:cubic-bezier(.645,.045,.355,1)}.ant-notification-fade-appear,.ant-notification-fade-enter{opacity:0;-webkit-animation-play-state:paused;animation-play-state:paused}.ant-notification-fade-appear,.ant-notification-fade-enter,.ant-notification-fade-leave{-webkit-animation-duration:.24s;animation-duration:.24s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:cubic-bezier(.645,.045,.355,1);animation-timing-function:cubic-bezier(.645,.045,.355,1)}.ant-notification-fade-leave{-webkit-animation-duration:.2s;animation-duration:.2s;-webkit-animation-play-state:paused;animation-play-state:paused}.ant-notification-fade-appear.ant-notification-fade-appear-active,.ant-notification-fade-enter.ant-notification-fade-enter-active{-webkit-animation-name:NotificationFadeIn;animation-name:NotificationFadeIn;-webkit-animation-play-state:running;animation-play-state:running}.ant-notification-fade-leave.ant-notification-fade-leave-active{-webkit-animation-name:NotificationFadeOut;animation-name:NotificationFadeOut;-webkit-animation-play-state:running;animation-play-state:running}@-webkit-keyframes NotificationFadeIn{0%{opacity:0;left:335px}to{left:0;opacity:1}}@keyframes NotificationFadeIn{0%{opacity:0;left:335px}to{left:0;opacity:1}}@-webkit-keyframes NotificationLeftFadeIn{0%{opacity:0;right:335px}to{right:0;opacity:1}}@keyframes NotificationLeftFadeIn{0%{opacity:0;right:335px}to{right:0;opacity:1}}@-webkit-keyframes NotificationFadeOut{0%{opacity:1;margin-bottom:10px;padding-top:16px;padding-bottom:16px;max-height:150px}to{opacity:0;margin-bottom:0;padding-top:0;padding-bottom:0;max-height:0}}@keyframes NotificationFadeOut{0%{opacity:1;margin-bottom:10px;padding-top:16px;padding-bottom:16px;max-height:150px}to{opacity:0;margin-bottom:0;padding-top:0;padding-bottom:0;max-height:0}}.ant-pagination{font-size:12px}.ant-pagination:after{content:" ";display:block;height:0;clear:both;overflow:hidden;visibility:hidden}.ant-pagination-total-text{float:left;height:30px;line-height:30px;margin-right:10px}.ant-pagination-item{cursor:pointer;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;min-width:28px;height:28px;line-height:28px;text-align:center;list-style:none;float:left;border:1px solid #d9d9d9;background-color:#fff;margin-right:8px;font-family:Arial}.ant-pagination-item a{text-decoration:none;color:rgba(0,0,0,.65);-webkit-transition:none;transition:none;margin:0 6px}.ant-pagination-item:hover{-webkit-transition:all .3s ease;transition:all .3s ease;border-color:#108ee9}.ant-pagination-item:hover a{color:#108ee9}.ant-pagination-item-active{background-color:#108ee9;border-color:#108ee9}.ant-pagination-item-active:hover a,.ant-pagination-item-active a{color:#fff}.ant-pagination-jump-next:after,.ant-pagination-jump-prev:after{content:"\2022\2022\2022";display:block;letter-spacing:2px;color:rgba(0,0,0,.25);text-align:center}.ant-pagination-jump-next:hover:after,.ant-pagination-jump-prev:hover:after{color:#108ee9;display:inline-block;font-size:12px;font-size:8px\9;-webkit-transform:scale(.66666667) rotate(0deg);-ms-transform:scale(.66666667) rotate(0deg);transform:scale(.66666667) rotate(0deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";zoom:1;letter-spacing:-1px;font-family:anticon}:root .ant-pagination-jump-next:hover:after,:root .ant-pagination-jump-prev:hover:after{-webkit-filter:none;filter:none;font-size:12px}.ant-pagination-jump-prev:hover:after{content:"\E620\E620"}.ant-pagination-jump-next:hover:after{content:"\E61F\E61F"}.ant-pagination-jump-next,.ant-pagination-jump-prev,.ant-pagination-prev{margin-right:8px}.ant-pagination-jump-next,.ant-pagination-jump-prev,.ant-pagination-next,.ant-pagination-prev{font-family:Arial;cursor:pointer;color:rgba(0,0,0,.65);border-radius:4px;list-style:none;min-width:28px;height:28px;line-height:28px;float:left;text-align:center;-webkit-transition:all .3s ease;transition:all .3s ease;display:inline-block}.ant-pagination-next,.ant-pagination-prev{border:1px solid #d9d9d9;background-color:#fff}.ant-pagination-next a,.ant-pagination-prev a{color:rgba(0,0,0,.65)}.ant-pagination-next a:after,.ant-pagination-prev a:after{display:inline-block;font-size:12px;font-size:8px\9;-webkit-transform:scale(.66666667) rotate(0deg);-ms-transform:scale(.66666667) rotate(0deg);transform:scale(.66666667) rotate(0deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";zoom:1;display:block;height:26px;line-height:26px;font-family:anticon;text-align:center}:root .ant-pagination-next a:after,:root .ant-pagination-prev a:after{-webkit-filter:none;filter:none;font-size:12px}.ant-pagination-next:hover,.ant-pagination-prev:hover{border-color:#108ee9}.ant-pagination-next:hover a,.ant-pagination-prev:hover a{color:#108ee9}.ant-pagination-prev a:after{margin-top:-.5px;content:"\E620";display:block}.ant-pagination-next a:after{content:"\E61F";display:block}.ant-pagination-disabled{cursor:not-allowed}.ant-pagination-disabled:hover{border-color:#d9d9d9}.ant-pagination-disabled:hover a{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-pagination-disabled a{color:rgba(0,0,0,.25)}.ant-pagination-slash{margin:0 10px 0 5px}.ant-pagination-options{float:left;margin-left:15px}.ant-pagination-options-size-changer{float:left;margin-right:10px}.ant-pagination-options-quick-jumper{float:left;height:28px;line-height:28px}.ant-pagination-options-quick-jumper input{position:relative;display:inline-block;padding:4px 7px;width:100%;height:28px;cursor:text;font-size:12px;line-height:1.5;color:rgba(0,0,0,.65);background-color:#fff;background-image:none;border:1px solid #d9d9d9;border-radius:4px;-webkit-transition:all .3s;transition:all .3s;margin:0 8px;width:50px}.ant-pagination-options-quick-jumper input::-moz-placeholder{color:#ccc;opacity:1}.ant-pagination-options-quick-jumper input:-ms-input-placeholder{color:#ccc}.ant-pagination-options-quick-jumper input::-webkit-input-placeholder{color:#ccc}.ant-pagination-options-quick-jumper input:hover{border-color:#49a9ee}.ant-pagination-options-quick-jumper input:focus{border-color:#49a9ee;outline:0;box-shadow:0 0 0 2px rgba(16,142,233,.2)}.ant-pagination-options-quick-jumper input[disabled]{background-color:#f7f7f7;opacity:1;cursor:not-allowed;color:rgba(0,0,0,.25)}.ant-pagination-options-quick-jumper input[disabled]:hover{border-color:#e2e2e2}textarea.ant-pagination-options-quick-jumper input{max-width:100%;height:auto;vertical-align:bottom}.ant-pagination-options-quick-jumper input-lg{padding:6px 7px;height:32px}.ant-pagination-options-quick-jumper input-sm{padding:1px 7px;height:22px}.ant-pagination-simple .ant-pagination-next,.ant-pagination-simple .ant-pagination-prev{border:0;height:24px;line-height:24px;margin:0;font-size:18px}.ant-pagination-simple .ant-pagination-simple-pager{float:left;margin-right:8px}.ant-pagination-simple .ant-pagination-simple-pager input{margin:0 8px;box-sizing:border-box;background-color:#fff;border-radius:4px;border:1px solid #d9d9d9;outline:none;padding:5px 8px;width:30px;height:24px;text-align:center;-webkit-transition:border-color .3s ease;transition:border-color .3s ease}.ant-pagination-simple .ant-pagination-simple-pager input:hover{border-color:#108ee9}.ant-pagination.mini .ant-pagination-total-text{height:20px;line-height:20px}.ant-pagination.mini .ant-pagination-item,.ant-pagination.mini .ant-pagination-next,.ant-pagination.mini .ant-pagination-prev{border:0;margin:0;min-width:20px;height:20px;line-height:20px}.ant-pagination.mini .ant-pagination-jump-next,.ant-pagination.mini .ant-pagination-jump-prev,.ant-pagination.mini .ant-pagination-next a:after,.ant-pagination.mini .ant-pagination-prev a:after{height:20px;line-height:20px}.ant-pagination.mini .ant-pagination-options{margin-left:8px}.ant-pagination.mini .ant-pagination-options-quick-jumper{height:20px;line-height:20px}.ant-pagination.mini .ant-pagination-options-quick-jumper input{padding:1px 7px;height:22px;width:44px}@media only screen and (max-width:1024px){.ant-pagination-item-after-jump-prev,.ant-pagination-item-before-jump-next{display:none}}.ant-popover{position:absolute;top:0;left:0;z-index:1030;cursor:auto;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;white-space:normal;font-size:12px;line-height:1.5;font-weight:400;text-align:left}.ant-popover:after{content:"";position:absolute;background:hsla(0,0%,100%,.01)}.ant-popover-hidden{display:none}.ant-popover-placement-top,.ant-popover-placement-topLeft,.ant-popover-placement-topRight{padding-bottom:4px}.ant-popover-placement-right,.ant-popover-placement-rightBottom,.ant-popover-placement-rightTop{padding-left:4px}.ant-popover-placement-bottom,.ant-popover-placement-bottomLeft,.ant-popover-placement-bottomRight{padding-top:4px}.ant-popover-placement-left,.ant-popover-placement-leftBottom,.ant-popover-placement-leftTop{padding-right:4px}.ant-popover-inner{background-color:#fff;background-clip:padding-box;border-radius:4px;box-shadow:0 1px 6px rgba(0,0,0,.2)}.ant-popover-title{min-width:177px;margin:0;padding:0 16px;line-height:32px;height:32px;border-bottom:1px solid #e9e9e9;color:rgba(0,0,0,.85);font-weight:500}.ant-popover-inner-content{padding:8px 16px;color:rgba(0,0,0,.65)}.ant-popover-message{padding:8px 0 16px;font-size:12px;color:rgba(0,0,0,.65)}.ant-popover-message>.anticon{color:#ffbf00;line-height:17px;position:absolute}.ant-popover-message-title{padding-left:20px}.ant-popover-buttons{text-align:right;margin-bottom:8px}.ant-popover-buttons button{margin-left:8px}.ant-popover-arrow,.ant-popover-arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.ant-popover-arrow{border-width:5px}.ant-popover-arrow:after{border-width:4px;content:""}.ant-popover-placement-top>.ant-popover-content>.ant-popover-arrow,.ant-popover-placement-topLeft>.ant-popover-content>.ant-popover-arrow,.ant-popover-placement-topRight>.ant-popover-content>.ant-popover-arrow{border-bottom-width:0;border-top-color:hsla(0,0%,85%,.7);bottom:-1px}.ant-popover-placement-top>.ant-popover-content>.ant-popover-arrow:after,.ant-popover-placement-topLeft>.ant-popover-content>.ant-popover-arrow:after,.ant-popover-placement-topRight>.ant-popover-content>.ant-popover-arrow:after{content:" ";bottom:1px;margin-left:-4px;border-bottom-width:0;border-top-color:#fff}.ant-popover-placement-top>.ant-popover-content>.ant-popover-arrow{left:50%;margin-left:-5px}.ant-popover-placement-topLeft>.ant-popover-content>.ant-popover-arrow{left:16px}.ant-popover-placement-topRight>.ant-popover-content>.ant-popover-arrow{right:16px}.ant-popover-placement-right>.ant-popover-content>.ant-popover-arrow,.ant-popover-placement-rightBottom>.ant-popover-content>.ant-popover-arrow,.ant-popover-placement-rightTop>.ant-popover-content>.ant-popover-arrow{left:-1px;border-left-width:0;border-right-color:hsla(0,0%,85%,.7)}.ant-popover-placement-right>.ant-popover-content>.ant-popover-arrow:after,.ant-popover-placement-rightBottom>.ant-popover-content>.ant-popover-arrow:after,.ant-popover-placement-rightTop>.ant-popover-content>.ant-popover-arrow:after{content:" ";left:1px;bottom:-4px;border-left-width:0;border-right-color:#fff}.ant-popover-placement-right>.ant-popover-content>.ant-popover-arrow{top:50%;margin-top:-5px}.ant-popover-placement-rightTop>.ant-popover-content>.ant-popover-arrow{top:12px}.ant-popover-placement-rightBottom>.ant-popover-content>.ant-popover-arrow{bottom:12px}.ant-popover-placement-bottom>.ant-popover-content>.ant-popover-arrow,.ant-popover-placement-bottomLeft>.ant-popover-content>.ant-popover-arrow,.ant-popover-placement-bottomRight>.ant-popover-content>.ant-popover-arrow{border-top-width:0;border-bottom-color:hsla(0,0%,85%,.7);top:-1px}.ant-popover-placement-bottom>.ant-popover-content>.ant-popover-arrow:after,.ant-popover-placement-bottomLeft>.ant-popover-content>.ant-popover-arrow:after,.ant-popover-placement-bottomRight>.ant-popover-content>.ant-popover-arrow:after{content:" ";top:1px;margin-left:-4px;border-top-width:0;border-bottom-color:#fff}.ant-popover-placement-bottom>.ant-popover-content>.ant-popover-arrow{left:50%;margin-left:-5px}.ant-popover-placement-bottomLeft>.ant-popover-content>.ant-popover-arrow{left:16px}.ant-popover-placement-bottomRight>.ant-popover-content>.ant-popover-arrow{right:16px}.ant-popover-placement-left>.ant-popover-content>.ant-popover-arrow,.ant-popover-placement-leftBottom>.ant-popover-content>.ant-popover-arrow,.ant-popover-placement-leftTop>.ant-popover-content>.ant-popover-arrow{right:-1px;border-right-width:0;border-left-color:hsla(0,0%,85%,.7)}.ant-popover-placement-left>.ant-popover-content>.ant-popover-arrow:after,.ant-popover-placement-leftBottom>.ant-popover-content>.ant-popover-arrow:after,.ant-popover-placement-leftTop>.ant-popover-content>.ant-popover-arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-4px}.ant-popover-placement-left>.ant-popover-content>.ant-popover-arrow{top:50%;margin-top:-5px}.ant-popover-placement-leftTop>.ant-popover-content>.ant-popover-arrow{top:12px}.ant-popover-placement-leftBottom>.ant-popover-content>.ant-popover-arrow{bottom:12px}.ant-progress{display:inline-block}.ant-progress-line{width:100%;font-size:12px;position:relative}.ant-progress-outer{display:inline-block;width:100%;margin-right:0;padding-right:0}.ant-progress-show-info .ant-progress-outer{padding-right:45px;margin-right:-45px}.ant-progress-inner{display:inline-block;width:100%;background-color:#f7f7f7;border-radius:100px;vertical-align:middle}.ant-progress-circle-trail{stroke:#f7f7f7}.ant-progress-circle-path{stroke:#108ee9}.ant-progress-bg{border-radius:100px;background-color:#108ee9;-webkit-transition:all .4s cubic-bezier(.08,.82,.17,1) 0s;transition:all .4s cubic-bezier(.08,.82,.17,1) 0s;position:relative}.ant-progress-text{width:35px;text-align:left;font-size:1em;margin-left:10px;vertical-align:middle;display:inline-block;position:relative;top:-1px}.ant-progress-text .anticon{font-size:12px}.ant-progress-status-active .ant-progress-bg:before{content:"";opacity:0;position:absolute;top:0;left:0;right:0;bottom:0;background:#fff;border-radius:10px;-webkit-animation:ant-progress-active 2.4s cubic-bezier(.23,1,.32,1) infinite;animation:ant-progress-active 2.4s cubic-bezier(.23,1,.32,1) infinite}.ant-progress-status-exception .ant-progress-bg{background-color:#f04134}.ant-progress-status-exception .ant-progress-text{color:#f04134}.ant-progress-status-exception .ant-progress-circle-path{stroke:#f04134}.ant-progress-status-success .ant-progress-bg{background-color:#00a854}.ant-progress-status-success .ant-progress-text{color:#00a854}.ant-progress-status-success .ant-progress-circle-path{stroke:#00a854}.ant-progress-circle .ant-progress-inner{position:relative;line-height:1;background-color:transparent}.ant-progress-circle .ant-progress-text{display:block;position:absolute;width:100%;text-align:center;line-height:1;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);left:0;font-family:tahoma;margin:0}.ant-progress-circle .ant-progress-text .anticon{font-size:1.16666667em}.ant-progress-circle .ant-progress-status-exception .ant-progress-text{color:#f04134}.ant-progress-circle .ant-progress-status-success .ant-progress-text{color:#00a854}@-webkit-keyframes ant-progress-active{0%{opacity:.1;width:0}20%{opacity:.5;width:0}to{opacity:0;width:100%}}@keyframes ant-progress-active{0%{opacity:.1;width:0}20%{opacity:.5;width:0}to{opacity:0;width:100%}}.ant-rate{margin:0;padding:0;list-style:none;font-size:20px;display:inline-block;vertical-align:middle}.ant-rate-disabled .ant-rate-star{cursor:not-allowed}.ant-rate-disabled .ant-rate-star:hover{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}.ant-rate-star{margin:0;padding:0;display:inline-block;margin-right:8px;position:relative;-webkit-transition:all .3s;transition:all .3s;color:#e9e9e9;cursor:pointer}.ant-rate-star-first,.ant-rate-star-second{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .3s;transition:all .3s}.ant-rate-star:hover{-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)}.ant-rate-star-first{position:absolute;left:0;top:0;width:50%;height:100%;overflow:hidden;opacity:0}.ant-rate-star-half .ant-rate-star-first,.ant-rate-star-half .ant-rate-star-second{opacity:1}.ant-rate-star-full .ant-rate-star-second,.ant-rate-star-half .ant-rate-star-first{color:#f5a623}.ant-rate-star-full:hover .ant-rate-star-second,.ant-rate-star-half:hover .ant-rate-star-first{color:#f7b84f}.ant-rate-text{margin-left:8px;vertical-align:middle;display:inline-block;font-size:12px}.ant-slider{position:relative;margin:10px 6px;height:12px;border-radius:5px;background-color:#e9e9e9;cursor:pointer;border-top:4px solid #fff;border-bottom:4px solid #fff;-webkit-transition:background-color .3s ease;transition:background-color .3s ease}.ant-slider-vertical{width:12px;height:100%;margin:6px 10px;border:4px solid #fff;border-top:0 none;border-bottom:0 none}.ant-slider-vertical .ant-slider-track{width:4px}.ant-slider-vertical .ant-slider-handle{margin-left:-5px;margin-bottom:-7px}.ant-slider-vertical .ant-slider-mark{top:0;left:8px;width:18px;height:100%}.ant-slider-vertical .ant-slider-mark-text{left:4px;white-space:nowrap}.ant-slider-vertical .ant-slider-step{width:4px;height:100%}.ant-slider-vertical .ant-slider-dot{top:auto;left:2px;margin-bottom:-4px}.ant-slider-with-marks{margin-bottom:28px}.ant-slider-track{position:absolute;left:0;height:4px;border-radius:4px;background-color:#9fd2f6;z-index:1;-webkit-transition:background-color .3s ease;transition:background-color .3s ease}.ant-slider:hover{background-color:#e1e1e1}.ant-slider:hover .ant-slider-handle{border-color:#49a9ee}.ant-slider:hover .ant-slider-track{background-color:#70bbf2}.ant-slider-handle{position:absolute;margin-left:-7px;margin-top:-5px;width:14px;height:14px;cursor:pointer;border-radius:50%;border:2px solid #88c7f4;background-color:#fff;z-index:2;-webkit-transition:border-color .3s ease,-webkit-transform .3s cubic-bezier(.18,.89,.32,1.28);transition:border-color .3s ease,-webkit-transform .3s cubic-bezier(.18,.89,.32,1.28);transition:border-color .3s ease,transform .3s cubic-bezier(.18,.89,.32,1.28);transition:border-color .3s ease,transform .3s cubic-bezier(.18,.89,.32,1.28),-webkit-transform .3s cubic-bezier(.18,.89,.32,1.28)}.ant-slider-handle:hover{border-color:#49a9ee;-webkit-transform:scale(1.2);-ms-transform:scale(1.2);transform:scale(1.2);-webkit-transform-origin:center center;-ms-transform-origin:center center;transform-origin:center center}.ant-slider-handle:active{box-shadow:0 0 0 2px rgba(16,142,233,.2)}.ant-slider-mark{position:absolute;top:10px;left:0;width:100%;font-size:12px;z-index:3}.ant-slider-mark-text{position:absolute;display:inline-block;vertical-align:middle;text-align:center;cursor:pointer;color:rgba(0,0,0,.43)}.ant-slider-mark-text-active{color:rgba(0,0,0,.65)}.ant-slider-step{position:absolute;width:100%;height:4px;background:transparent;z-index:1}.ant-slider-dot{position:absolute;top:-2px;width:8px;height:8px;border:2px solid #e9e9e9;background-color:#fff;cursor:pointer;border-radius:50%;vertical-align:middle}.ant-slider-dot,.ant-slider-dot:first-child,.ant-slider-dot:last-child{margin-left:-4px}.ant-slider-dot-active{border-color:#88c7f4}.ant-slider-disabled{background-color:#e9e9e9!important}.ant-slider-disabled .ant-slider-track{background-color:rgba(0,0,0,.25)!important}.ant-slider-disabled .ant-slider-dot,.ant-slider-disabled .ant-slider-handle{border-color:rgba(0,0,0,.25)!important;background-color:#fff;cursor:not-allowed;box-shadow:none}.ant-slider-disabled .ant-slider-dot,.ant-slider-disabled .ant-slider-mark-text{cursor:not-allowed!important}.ant-tooltip{position:absolute;z-index:1060;display:block;visibility:visible;font-size:12px;line-height:1.5}.ant-tooltip-hidden{display:none}.ant-tooltip-placement-top,.ant-tooltip-placement-topLeft,.ant-tooltip-placement-topRight{padding:5px 0 8px}.ant-tooltip-placement-right,.ant-tooltip-placement-rightBottom,.ant-tooltip-placement-rightTop{padding:0 5px 0 8px}.ant-tooltip-placement-bottom,.ant-tooltip-placement-bottomLeft,.ant-tooltip-placement-bottomRight{padding:8px 0 5px}.ant-tooltip-placement-left,.ant-tooltip-placement-leftBottom,.ant-tooltip-placement-leftTop{padding:0 8px 0 5px}.ant-tooltip-inner{max-width:250px;padding:8px 10px;color:#fff;text-align:left;text-decoration:none;background-color:rgba(64,64,64,.85);border-radius:4px;box-shadow:0 1px 6px rgba(0,0,0,.2);min-height:34px}.ant-tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.ant-tooltip-placement-top .ant-tooltip-arrow,.ant-tooltip-placement-topLeft .ant-tooltip-arrow,.ant-tooltip-placement-topRight .ant-tooltip-arrow{bottom:3px;border-width:5px 5px 0;border-top-color:rgba(64,64,64,.85)}.ant-tooltip-placement-top .ant-tooltip-arrow{left:50%;margin-left:-5px}.ant-tooltip-placement-topLeft .ant-tooltip-arrow{left:16px}.ant-tooltip-placement-topRight .ant-tooltip-arrow{right:16px}.ant-tooltip-placement-right .ant-tooltip-arrow,.ant-tooltip-placement-rightBottom .ant-tooltip-arrow,.ant-tooltip-placement-rightTop .ant-tooltip-arrow{left:3px;border-width:5px 5px 5px 0;border-right-color:rgba(64,64,64,.85)}.ant-tooltip-placement-right .ant-tooltip-arrow{top:50%;margin-top:-5px}.ant-tooltip-placement-rightTop .ant-tooltip-arrow{top:8px}.ant-tooltip-placement-rightBottom .ant-tooltip-arrow{bottom:8px}.ant-tooltip-placement-left .ant-tooltip-arrow,.ant-tooltip-placement-leftBottom .ant-tooltip-arrow,.ant-tooltip-placement-leftTop .ant-tooltip-arrow{right:3px;border-width:5px 0 5px 5px;border-left-color:rgba(64,64,64,.85)}.ant-tooltip-placement-left .ant-tooltip-arrow{top:50%;margin-top:-5px}.ant-tooltip-placement-leftTop .ant-tooltip-arrow{top:8px}.ant-tooltip-placement-leftBottom .ant-tooltip-arrow{bottom:8px}.ant-tooltip-placement-bottom .ant-tooltip-arrow,.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow,.ant-tooltip-placement-bottomRight .ant-tooltip-arrow{top:3px;border-width:0 5px 5px;border-bottom-color:rgba(64,64,64,.85)}.ant-tooltip-placement-bottom .ant-tooltip-arrow{left:50%;margin-left:-5px}.ant-tooltip-placement-bottomLeft .ant-tooltip-arrow{left:16px}.ant-tooltip-placement-bottomRight .ant-tooltip-arrow{right:16px}.ant-spin{color:#108ee9;vertical-align:middle;text-align:center;opacity:0;position:absolute;-webkit-transition:-webkit-transform .3s cubic-bezier(.78,.14,.15,.86);transition:-webkit-transform .3s cubic-bezier(.78,.14,.15,.86);transition:transform .3s cubic-bezier(.78,.14,.15,.86);transition:transform .3s cubic-bezier(.78,.14,.15,.86),-webkit-transform .3s cubic-bezier(.78,.14,.15,.86);font-size:12px;display:none}.ant-spin-spinning{opacity:1;position:static;display:inline-block}.ant-spin-nested-loading{position:relative}.ant-spin-nested-loading>div>.ant-spin{position:absolute;height:100%;max-height:320px;width:100%;z-index:4}.ant-spin-nested-loading>div>.ant-spin .ant-spin-dot{position:absolute;top:50%;left:50%;margin:-10px}.ant-spin-nested-loading>div>.ant-spin .ant-spin-text{position:absolute;top:50%;width:100%;padding-top:6px}.ant-spin-nested-loading>div>.ant-spin.ant-spin-show-text .ant-spin-dot{margin-top:-20px}.ant-spin-nested-loading>div>.ant-spin-sm .ant-spin-dot{margin:-7px}.ant-spin-nested-loading>div>.ant-spin-sm .ant-spin-text{padding-top:3px}.ant-spin-nested-loading>div>.ant-spin-sm.ant-spin-show-text .ant-spin-dot{margin-top:-17px}.ant-spin-nested-loading>div>.ant-spin-lg .ant-spin-dot{margin:-16px}.ant-spin-nested-loading>div>.ant-spin-lg .ant-spin-text{padding-top:12px}.ant-spin-nested-loading>div>.ant-spin-lg.ant-spin-show-text .ant-spin-dot{margin-top:-26px}.ant-spin-container{-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);position:relative}.ant-spin-blur{opacity:.7;-webkit-filter:blur(.8px);filter:blur(.8px);-webkit-filter:progid\:DXImageTransform\.Microsoft\.Blur(PixelRadius\=1,MakeShadow\=false);filter:progid\:DXImageTransform\.Microsoft\.Blur(PixelRadius\=1,MakeShadow\=false);-webkit-transform:translateZ(0)}.ant-spin-blur:after{content:"";position:absolute;left:0;right:0;top:0;bottom:0;background:#fff;opacity:.2;-webkit-transition:all .3s;transition:all .3s}.ant-spin-tip{color:rgba(0,0,0,.43)}.ant-spin-dot{position:relative;display:block;width:20px;height:20px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);-webkit-animation:antRotate 2s infinite linear;animation:antRotate 2s infinite linear}.ant-spin-dot i{width:9px;height:9px;border-radius:100%;background-color:#108ee9;-webkit-transform:scale(.6);-ms-transform:scale(.6);transform:scale(.6);display:block;position:absolute;opacity:.3;-webkit-animation:antSpinMove 1s infinite linear alternate;animation:antSpinMove 1s infinite linear alternate;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.ant-spin-dot i:first-child{left:0;top:0}.ant-spin-dot i:nth-child(2){right:0;top:0;-webkit-animation-delay:.4s;animation-delay:.4s}.ant-spin-dot i:nth-child(3){right:0;bottom:0;-webkit-animation-delay:.8s;animation-delay:.8s}.ant-spin-dot i:nth-child(4){left:0;bottom:0;-webkit-animation-delay:1.2s;animation-delay:1.2s}.ant-spin-sm .ant-spin-dot{width:14px;height:14px}.ant-spin-sm .ant-spin-dot i{width:6px;height:6px}.ant-spin-lg .ant-spin-dot{width:32px;height:32px}.ant-spin-lg .ant-spin-dot i{width:14px;height:14px}.ant-spin.ant-spin-show-text .ant-spin-text{display:block}@media (-ms-high-contrast:active),(-ms-high-contrast:none){.ant-spin-blur{background:#fff;opacity:.5}}@-webkit-keyframes antSpinMove{to{-webkit-transform:scale(.9);transform:scale(.9);opacity:1}}@keyframes antSpinMove{to{-webkit-transform:scale(.9);transform:scale(.9);opacity:1}}@-webkit-keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}@keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}.ant-steps{font-size:0;width:100%;line-height:1.5}.ant-steps .ant-steps-item{position:relative;display:inline-block;vertical-align:top}.ant-steps .ant-steps-item.ant-steps-status-wait .ant-steps-head-inner{border-color:rgba(0,0,0,.25);background-color:#fff}.ant-steps .ant-steps-item.ant-steps-status-wait .ant-steps-head-inner>.ant-steps-icon{color:rgba(0,0,0,.25)}.ant-steps .ant-steps-item.ant-steps-status-wait .ant-steps-head-inner>.ant-steps-icon .ant-steps-icon-dot{background:rgba(0,0,0,.25)}.ant-steps .ant-steps-item.ant-steps-status-wait .ant-steps-description,.ant-steps .ant-steps-item.ant-steps-status-wait .ant-steps-title{color:rgba(0,0,0,.43)}.ant-steps .ant-steps-item.ant-steps-status-wait .ant-steps-tail>i{background-color:#e9e9e9}.ant-steps .ant-steps-item.ant-steps-status-process .ant-steps-head-inner{border-color:#108ee9;background-color:#108ee9}.ant-steps .ant-steps-item.ant-steps-status-process .ant-steps-head-inner>.ant-steps-icon{color:#fff}.ant-steps .ant-steps-item.ant-steps-status-process .ant-steps-head-inner>.ant-steps-icon .ant-steps-icon-dot{background:#108ee9}.ant-steps .ant-steps-item.ant-steps-status-process .ant-steps-description,.ant-steps .ant-steps-item.ant-steps-status-process .ant-steps-title{color:rgba(0,0,0,.65)}.ant-steps .ant-steps-item.ant-steps-status-process .ant-steps-tail>i{background-color:#e9e9e9}.ant-steps .ant-steps-item.ant-steps-status-finish .ant-steps-head-inner{border-color:#108ee9;background-color:#fff}.ant-steps .ant-steps-item.ant-steps-status-finish .ant-steps-head-inner>.ant-steps-icon{color:#108ee9}.ant-steps .ant-steps-item.ant-steps-status-finish .ant-steps-head-inner>.ant-steps-icon .ant-steps-icon-dot{background:#108ee9}.ant-steps .ant-steps-item.ant-steps-status-finish .ant-steps-tail>i:after{width:100%;background:#108ee9;-webkit-transition:all .6s;transition:all .6s;opacity:1}.ant-steps .ant-steps-item.ant-steps-status-finish .ant-steps-description,.ant-steps .ant-steps-item.ant-steps-status-finish .ant-steps-title{color:rgba(0,0,0,.43)}.ant-steps .ant-steps-item.ant-steps-status-error .ant-steps-head-inner{border-color:#f04134;background-color:#fff}.ant-steps .ant-steps-item.ant-steps-status-error .ant-steps-head-inner>.ant-steps-icon{color:#f04134}.ant-steps .ant-steps-item.ant-steps-status-error .ant-steps-head-inner>.ant-steps-icon .ant-steps-icon-dot{background:#f04134}.ant-steps .ant-steps-item.ant-steps-status-error .ant-steps-description,.ant-steps .ant-steps-item.ant-steps-status-error .ant-steps-title{color:#f04134}.ant-steps .ant-steps-item.ant-steps-status-error .ant-steps-tail>i{background-color:#e9e9e9}.ant-steps .ant-steps-item.ant-steps-next-error .ant-steps-tail>i,.ant-steps .ant-steps-item.ant-steps-next-error .ant-steps-tail>i:after{background-color:#f04134}.ant-steps .ant-steps-item.ant-steps-custom .ant-steps-head-inner{background:none;border:0;width:auto;height:auto}.ant-steps .ant-steps-item.ant-steps-custom .ant-steps-head-inner>.ant-steps-icon{font-size:26px;width:26px;height:26px}.ant-steps .ant-steps-item.ant-steps-custom.ant-steps-status-process .ant-steps-head-inner>.ant-steps-icon{color:#108ee9}.ant-steps .ant-steps-head,.ant-steps .ant-steps-main{position:relative;display:inline-block;vertical-align:top}.ant-steps .ant-steps-head{background:#fff}.ant-steps .ant-steps-head-inner{display:block;border:1px solid rgba(0,0,0,.25);width:26px;height:26px;line-height:23px;text-align:center;border-radius:26px;font-size:14px;margin-right:8px;-webkit-transition:background-color .3s ease,border-color .3s ease;transition:background-color .3s ease,border-color .3s ease}.ant-steps .ant-steps-head-inner>.ant-steps-icon{line-height:1;color:#108ee9;position:relative}.ant-steps .ant-steps-head-inner>.ant-steps-icon.anticon{font-size:12px}.ant-steps .ant-steps-head-inner>.ant-steps-icon.anticon-check,.ant-steps .ant-steps-head-inner>.ant-steps-icon.anticon-cross{font-weight:700}.ant-steps .ant-steps-main{margin-top:2.5px}.ant-steps .ant-steps-title{font-size:14px;margin-bottom:4px;color:rgba(0,0,0,.65);font-weight:700;background:#fff;display:inline-block;padding-right:10px}.ant-steps .ant-steps-title>a:first-child:last-child{color:rgba(0,0,0,.65)}.ant-steps .ant-steps-item-last .ant-steps-title{padding-right:0;width:100%}.ant-steps .ant-steps-description{font-size:12px;color:rgba(0,0,0,.43)}.ant-steps .ant-steps-tail{position:absolute;left:0;width:100%;top:13px;padding:0 10px}.ant-steps .ant-steps-tail>i{display:inline-block;vertical-align:top;background:#e9e9e9;height:1px;border-radius:1px;width:100%;position:relative}.ant-steps .ant-steps-tail>i:after{position:absolute;content:"";top:0;width:0;background:#e9e9e9;height:100%;opacity:0}.ant-steps.ant-steps-small .ant-steps-head-inner{border:1px solid rgba(0,0,0,.25);width:18px;height:18px;line-height:15px;text-align:center;border-radius:18px;font-size:12px;margin-right:10px}.ant-steps.ant-steps-small .ant-steps-head-inner>.ant-steps-icon.anticon{display:inline-block;font-size:12px;font-size:9px\9;-webkit-transform:scale(.75) rotate(0deg);-ms-transform:scale(.75) rotate(0deg);transform:scale(.75) rotate(0deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";zoom:1;top:0}:root .ant-steps.ant-steps-small .ant-steps-head-inner>.ant-steps-icon.anticon{-webkit-filter:none;filter:none;font-size:12px}.ant-steps.ant-steps-small .ant-steps-main{margin-top:0}.ant-steps.ant-steps-small .ant-steps-title{font-size:12px;margin-bottom:4px;color:rgba(0,0,0,.65);font-weight:700}.ant-steps.ant-steps-small .ant-steps-description{font-size:12px;color:rgba(0,0,0,.43)}.ant-steps.ant-steps-small .ant-steps-tail{top:8px;padding:0 8px}.ant-steps.ant-steps-small .ant-steps-tail>i{height:1px;border-radius:1px;width:100%}.ant-steps.ant-steps-small .ant-steps-custom .ant-steps-head-inner>.ant-steps-icon{font-size:18px;width:18px;height:18px}.ant-steps-vertical .ant-steps-item{display:block}.ant-steps-vertical .ant-steps-tail{position:absolute;left:13px;top:0;height:100%;width:1px;padding:30px 0 4px}.ant-steps-vertical .ant-steps-tail>i{height:100%;width:1px}.ant-steps-vertical .ant-steps-tail>i:after{height:0;width:100%}.ant-steps-vertical .ant-steps-status-finish .ant-steps-tail>i:after{height:100%}.ant-steps-vertical .ant-steps-head{float:left}.ant-steps-vertical .ant-steps-head-inner{margin-right:16px}.ant-steps-vertical .ant-steps-main{min-height:47px;overflow:hidden;display:block}.ant-steps-vertical .ant-steps-main .ant-steps-title{line-height:26px}.ant-steps-vertical .ant-steps-main .ant-steps-description{padding-bottom:12px}.ant-steps-vertical.ant-steps-small .ant-steps-tail{position:absolute;left:9px;top:0;padding:22px 0 4px}.ant-steps-vertical.ant-steps-small .ant-steps-tail>i{height:100%}.ant-steps-vertical.ant-steps-small .ant-steps-title{line-height:18px}.ant-steps-horizontal.ant-steps-hidden{visibility:hidden}.ant-steps-horizontal .ant-steps-description{max-width:120px}.ant-steps-horizontal .ant-steps-item:not(:first-child) .ant-steps-head{padding-left:10px;margin-left:-10px}.ant-steps-dot .ant-steps-item .ant-steps-step{display:inline-block;text-align:center;width:120px}.ant-steps-dot .ant-steps-item:not(:first-child) .ant-steps-head{margin-left:0;padding-left:0}.ant-steps-dot .ant-steps-tail{margin:0 0 0 60px;padding:0;width:100%;top:1px}.ant-steps-dot .ant-steps-tail>i{height:3px}.ant-steps-dot .ant-steps-head{display:inline-block;padding-right:0}.ant-steps-dot .ant-steps-head-inner{margin:0 auto;width:5px;height:5px;line-height:5px;border:0}.ant-steps-dot .ant-steps-head-inner .ant-steps-icon-dot{float:left;width:100%;height:100%;border-radius:2.5px;position:relative}.ant-steps-dot .ant-steps-head-inner .ant-steps-icon-dot:after{content:"";background:hsla(0,0%,100%,.001);width:40px;height:24px;position:absolute;top:-8px;left:-16px}.ant-steps-dot .ant-steps-head-inner .ant-steps-icon-dot:hover{-webkit-transform:scale(1.3);-ms-transform:scale(1.3);transform:scale(1.3)}.ant-steps-dot .ant-steps-main{display:block;margin-top:10px}.ant-steps-dot .ant-steps-main .ant-steps-title{padding-right:0}.ant-steps-dot .ant-steps-status-process .ant-steps-head{top:-1px}.ant-steps-dot .ant-steps-status-process .ant-steps-head-inner{width:7px;height:7px;line-height:7px}.ant-steps-dot .ant-steps-status-process .ant-steps-head-inner .ant-steps-icon-dot{border-radius:3.5px}.ant-steps-dot.ant-steps-vertical .ant-steps-tail{left:2px;height:100%;padding:0;top:15px}.ant-steps-dot.ant-steps-vertical .ant-steps-tail>i{height:100%;width:3px}.ant-steps-dot.ant-steps-vertical .ant-steps-head{top:12px;left:1px}.ant-steps-dot.ant-steps-vertical .ant-steps-status-process .ant-steps-head{left:0}.ant-switch{position:relative;display:inline-block;box-sizing:border-box;height:22px;min-width:44px;line-height:20px;vertical-align:middle;border-radius:20px;border:1px solid #ccc;background-color:rgba(0,0,0,.25);cursor:pointer;-webkit-transition:all .3s;transition:all .3s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ant-switch-inner{color:#fff;font-size:12px;margin-left:24px;margin-right:6px;display:block}.ant-switch:after{position:absolute;width:18px;height:18px;left:1px;top:1px;border-radius:18px;background-color:#fff;content:" ";cursor:pointer;-webkit-transition:all .3s,width .3s;transition:all .3s,width .3s}.ant-switch:active:after{width:24px}.ant-switch:focus{box-shadow:0 0 0 2px rgba(16,142,233,.2);outline:0}.ant-switch:focus:hover{box-shadow:none}.ant-switch-small{height:14px;min-width:28px;line-height:12px}.ant-switch-small .ant-switch-inner{margin-left:18px;margin-right:3px}.ant-switch-small:after{width:12px;height:12px;top:0;left:.5px}.ant-switch-small:active:after{width:16px}.ant-switch-small.ant-switch-checked:after{left:100%;margin-left:-12.5px}.ant-switch-small.ant-switch-checked .ant-switch-inner{margin-left:3px;margin-right:18px}.ant-switch-small:active.ant-switch-checked:after{margin-left:-16.5px}.ant-switch-checked{border-color:#108ee9;background-color:#108ee9}.ant-switch-checked .ant-switch-inner{margin-left:6px;margin-right:24px}.ant-switch-checked:after{left:100%;margin-left:-19px}.ant-switch-checked:active:after{margin-left:-25px}.ant-switch-disabled{cursor:not-allowed;background:#f4f4f4;border-color:#f4f4f4}.ant-switch-disabled:after{background:#ccc;cursor:not-allowed}.ant-switch-disabled .ant-switch-inner{color:rgba(0,0,0,.25)}.ant-table-wrapper{zoom:1}.ant-table-wrapper:after,.ant-table-wrapper:before{content:" ";display:table}.ant-table-wrapper:after{clear:both;visibility:hidden;font-size:0;height:0}.ant-table{font-size:12px;color:rgba(0,0,0,.65);overflow:hidden;position:relative;border-radius:4px 4px 0 0}.ant-table-body{-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.ant-table table{width:100%;border-collapse:separate;border-spacing:0;text-align:left;border-radius:4px 4px 0 0;overflow:hidden}.ant-table-thead>tr>th{background:#f7f7f7;font-weight:500;-webkit-transition:background .3s ease;transition:background .3s ease;text-align:left;color:rgba(0,0,0,.85)}.ant-table-thead>tr>th[colspan]{text-align:center}.ant-table-thead>tr>th .anticon-filter{margin-left:4px;font-size:12px;cursor:pointer;color:#aaa;-webkit-transition:all .3s;transition:all .3s}.ant-table-thead>tr>th .anticon-filter:hover{color:rgba(0,0,0,.65)}.ant-table-thead>tr>th .ant-table-filter-selected.anticon-filter{color:#108ee9}.ant-table-tbody>tr>td{border-bottom:1px solid #e9e9e9}.ant-table-tbody>tr,.ant-table-tbody>tr>td,.ant-table-thead>tr{-webkit-transition:all .3s;transition:all .3s}.ant-table-tbody>tr.ant-table-row-hover>td,.ant-table-tbody>tr:hover>td,.ant-table-thead>tr.ant-table-row-hover>td,.ant-table-thead>tr:hover>td{background:#ecf6fd}.ant-table-thead>tr:hover{background:none}.ant-table-footer{padding:16px 8px;background:#f7f7f7;border-radius:0 0 4px 4px;position:relative}.ant-table-footer:before{content:"";height:1px;background:#f7f7f7;position:absolute;top:-1px;width:100%;left:0}.ant-table.ant-table-bordered .ant-table-footer{border:1px solid #e9e9e9}.ant-table-title{padding:16px 0;position:relative;top:1px;border-radius:4px 4px 0 0}.ant-table.ant-table-bordered .ant-table-title{border:1px solid #e9e9e9;padding-left:8px;padding-right:8px}.ant-table-title+.ant-table-content{position:relative;border-radius:4px 4px 0 0;overflow:hidden}.ant-table-bordered .ant-table-title+.ant-table-content,.ant-table-bordered .ant-table-title+.ant-table-content table,.ant-table-without-column-header .ant-table-title+.ant-table-content,.ant-table-without-column-header table{border-radius:0}.ant-table-tbody>tr.ant-table-row-selected{background:#fafafa}.ant-table-thead>tr>th.ant-table-column-sort{background:#eaeaea}.ant-table-tbody>tr>td,.ant-table-thead>tr>th{padding:16px 8px;word-break:break-all}.ant-table-thead>tr>th.ant-table-selection-column{padding-left:16px;padding-right:0}.ant-table-tbody>tr>td.ant-table-selection-column,.ant-table-thead>tr>th.ant-table-selection-column{text-align:center;width:62px}.ant-table-expand-icon-th,.ant-table-row-expand-icon-cell{text-align:center;width:50px}.ant-table-header{background:#f7f7f7;overflow:hidden}.ant-table-header table{border-radius:4px 4px 0 0}.ant-table-loading{position:relative}.ant-table-loading .ant-table-body{background:#fff;opacity:.5}.ant-table-loading .ant-table-spin-holder{height:20px;line-height:20px;left:50%;top:50%;margin-left:-30px;position:absolute}.ant-table-loading .ant-table-with-pagination{margin-top:-20px}.ant-table-loading .ant-table-without-pagination{margin-top:10px}.ant-table-middle .ant-table-footer,.ant-table-middle .ant-table-tbody>tr>td,.ant-table-middle .ant-table-thead>tr>th:not(.ant-table-selection-column),.ant-table-middle .ant-table-title{padding:10px 8px}.ant-table-small{border:1px solid #e9e9e9;border-radius:4px}.ant-table-small .ant-table-body>table,.ant-table-small .ant-table-header>table{border:0;padding:0 8px}.ant-table-small .ant-table-thead>tr>th{background:#fff;border-bottom:1px solid #e9e9e9}.ant-table-small .ant-table-tbody>tr>td{padding:6px 8px}.ant-table-small .ant-table-footer,.ant-table-small .ant-table-thead>tr>th:not(.ant-table-selection-column),.ant-table-small .ant-table-title{padding:10px 8px}.ant-table-small .ant-table-title{border-bottom:1px solid #e9e9e9;top:0}.ant-table-small .ant-table-header{background:#fff}.ant-table-small .ant-table-header table{border-bottom:1px solid #e9e9e9}.ant-table-small .ant-table-placeholder,.ant-table-small .ant-table-row:last-child td{border-bottom:0}.ant-table-column-sorter{margin-left:4px;display:inline-block;width:12px;height:14px;vertical-align:middle;text-align:center}.ant-table-column-sorter-down,.ant-table-column-sorter-up{line-height:4px;height:5px;display:block;width:12px;cursor:pointer}.ant-table-column-sorter-down:hover .anticon,.ant-table-column-sorter-up:hover .anticon{color:rgba(0,0,0,.65)}.ant-table-column-sorter-down.on .anticon-caret-down,.ant-table-column-sorter-down.on .anticon-caret-up,.ant-table-column-sorter-up.on .anticon-caret-down,.ant-table-column-sorter-up.on .anticon-caret-up{color:#108ee9}.ant-table-column-sorter .anticon-caret-down,.ant-table-column-sorter .anticon-caret-up{display:inline-block;font-size:12px;font-size:7px\9;-webkit-transform:scale(.58333333) rotate(0deg);-ms-transform:scale(.58333333) rotate(0deg);transform:scale(.58333333) rotate(0deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";zoom:1;line-height:6px;height:6px;color:#aaa}:root .ant-table-column-sorter .anticon-caret-down,:root .ant-table-column-sorter .anticon-caret-up{-webkit-filter:none;filter:none;font-size:12px}.ant-table-column-sorter .anticon-caret-down:before,.ant-table-column-sorter .anticon-caret-up:before{-moz-transform-origin:53% 50%}.ant-table-bordered .ant-table-body>table,.ant-table-bordered .ant-table-fixed-left table,.ant-table-bordered .ant-table-fixed-right table,.ant-table-bordered .ant-table-header>table{border:1px solid #e9e9e9;border-right:0;border-bottom:0}.ant-table-bordered.ant-table-empty .ant-table-placeholder{border-left:1px solid #e9e9e9;border-right:1px solid #e9e9e9}.ant-table-bordered.ant-table-fixed-header .ant-table-header>table{border-bottom:0}.ant-table-bordered.ant-table-fixed-header .ant-table-body>table{border-top:0;border-top-left-radius:0;border-top-right-radius:0}.ant-table-bordered.ant-table-fixed-header .ant-table-body-inner>table{border-top:0}.ant-table-bordered.ant-table-fixed-header .ant-table-placeholder{border:0}.ant-table-bordered .ant-table-thead>tr>th{border-bottom:1px solid #e9e9e9}.ant-table-bordered .ant-table-tbody>tr>td,.ant-table-bordered .ant-table-thead>tr>th{border-right:1px solid #e9e9e9}.ant-table-bordered.ant-table-small{border-right:0}.ant-table-bordered.ant-table-small .ant-table-body>table,.ant-table-bordered.ant-table-small .ant-table-fixed-left table,.ant-table-bordered.ant-table-small .ant-table-fixed-right table,.ant-table-bordered.ant-table-small .ant-table-header>table{border:0;padding:0}.ant-table-bordered.ant-table-small .ant-table-title{border:0;border-bottom:1px solid #e9e9e9;border-right:1px solid #e9e9e9}.ant-table-bordered.ant-table-small .ant-table-footer{border:0;border-top:1px solid #e9e9e9;border-right:1px solid #e9e9e9}.ant-table-bordered.ant-table-small .ant-table-footer:before{display:none}.ant-table-bordered.ant-table-small .ant-table-placeholder{border-left:0;border-bottom:0}.ant-table-placeholder{position:relative;padding:16px 8px;background:#fff;border-bottom:1px solid #e9e9e9;text-align:center;font-size:12px;color:rgba(0,0,0,.43)}.ant-table-placeholder .anticon{margin-right:4px}.ant-table-pagination{margin:16px 0;float:right}.ant-table-filter-dropdown{min-width:96px;margin-left:-8px;background:#fff;border-radius:4px;box-shadow:0 1px 6px rgba(0,0,0,.2)}.ant-table-filter-dropdown .ant-dropdown-menu{border:0;box-shadow:none;border-radius:4px 4px 0 0}.ant-table-filter-dropdown .ant-dropdown-menu-without-submenu{max-height:400px;overflow-x:hidden}.ant-table-filter-dropdown .ant-dropdown-menu-item>label+span{padding:0}.ant-table-filter-dropdown .ant-dropdown-menu-sub{border-radius:4px;box-shadow:0 1px 6px rgba(0,0,0,.2)}.ant-table-filter-dropdown .ant-dropdown-menu .ant-dropdown-submenu-contain-selected .ant-dropdown-menu-submenu-title:after{color:#108ee9;font-weight:700;text-shadow:0 0 2px #d2eafb}.ant-table-filter-dropdown .ant-dropdown-menu-item{overflow:hidden}.ant-table-filter-dropdown>.ant-dropdown-menu>.ant-dropdown-menu-item:last-child,.ant-table-filter-dropdown>.ant-dropdown-menu>.ant-dropdown-menu-submenu:last-child .ant-dropdown-menu-submenu-title{border-radius:0}.ant-table-filter-dropdown-btns{overflow:hidden;padding:7px 16px;border-top:1px solid #e9e9e9}.ant-table-filter-dropdown-link{color:#108ee9}.ant-table-filter-dropdown-link:hover{color:#49a9ee}.ant-table-filter-dropdown-link:active{color:#0e77ca}.ant-table-filter-dropdown-link.confirm{float:left}.ant-table-filter-dropdown-link.clear{float:right}.ant-table-selection-select-all{margin-right:4px!important}.ant-table-selection .anticon-down{color:#aaa}.ant-table-selection-menu{min-width:96px;margin-top:5px;margin-left:-30px;background:#fff;border-radius:4px;box-shadow:0 1px 6px rgba(0,0,0,.2)}.ant-table-selection-menu .ant-action-down{color:#aaa}.ant-table-selection-down{cursor:pointer;padding:0;display:inline-block;vertical-align:middle;line-height:1}.ant-table-row-expand-icon{cursor:pointer;display:inline-block;width:17px;height:17px;text-align:center;line-height:14px;border:1px solid #e9e9e9;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background:#fff}.ant-table-row-expanded:after{content:"-"}.ant-table-row-collapsed:after{content:"+"}.ant-table-row-spaced{visibility:hidden}.ant-table-row-spaced:after{content:"."}.ant-table-row[class*=ant-table-row-level-0] .ant-table-selection-column>span{display:inline-block}tr.ant-table-expanded-row,tr.ant-table-expanded-row:hover{background:#fbfbfb}.ant-table .ant-table-row-indent+.ant-table-row-expand-icon{margin-right:8px}.ant-table-scroll{overflow:auto;overflow-x:hidden}.ant-table-scroll table{width:auto;min-width:100%}.ant-table-body-inner{height:100%}.ant-table-fixed-header .ant-table-body{position:relative;background:#fff}.ant-table-fixed-header .ant-table-body-inner{overflow:scroll}.ant-table-fixed-header .ant-table-scroll .ant-table-header{overflow:scroll;padding-bottom:20px;margin-bottom:-20px}.ant-table-fixed-header.ant-table-empty .ant-table-scroll .ant-table-body{padding-bottom:20px;margin-bottom:-20px}.ant-table-fixed-left,.ant-table-fixed-right{position:absolute;top:0;overflow:hidden;-webkit-transition:box-shadow .3s ease;transition:box-shadow .3s ease;border-radius:0}.ant-table-fixed-left table,.ant-table-fixed-right table{width:auto;background:#fff}.ant-table-fixed-header .ant-table-fixed-left .ant-table-body-outer .ant-table-fixed,.ant-table-fixed-header .ant-table-fixed-right .ant-table-body-outer .ant-table-fixed{border-radius:0}.ant-table-fixed-left{left:0;box-shadow:6px 0 6px -4px rgba(0,0,0,.2)}.ant-table-fixed-left .ant-table-header{overflow-y:hidden}.ant-table-fixed-left .ant-table-body-inner{margin-right:-20px;padding-right:20px}.ant-table-fixed-header .ant-table-fixed-left .ant-table-body-inner{padding-right:0}.ant-table-fixed-left,.ant-table-fixed-left table{border-radius:4px 0 0 0}.ant-table-fixed-right{right:0;box-shadow:-6px 0 6px -4px rgba(0,0,0,.2)}.ant-table-fixed-right,.ant-table-fixed-right table{border-radius:0 4px 0 0}.ant-table-fixed-right .ant-table-expanded-row{color:transparent;pointer-events:none}.ant-table.ant-table-scroll-position-left .ant-table-fixed-left,.ant-table.ant-table-scroll-position-right .ant-table-fixed-right{box-shadow:none}.ant-tabs.ant-tabs-card>.ant-tabs-bar .ant-tabs-nav-container{height:32px}.ant-tabs.ant-tabs-card>.ant-tabs-bar .ant-tabs-ink-bar{visibility:hidden}.ant-tabs.ant-tabs-card>.ant-tabs-bar .ant-tabs-tab{margin:0;border:1px solid #d9d9d9;border-bottom:0;border-radius:4px 4px 0 0;background:#f9f9f9;margin-right:2px;padding:5px 16px 4px;-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1)}.ant-tabs.ant-tabs-card>.ant-tabs-bar .ant-tabs-tab-active{background:#fff;border-color:#d9d9d9;color:#108ee9;padding-bottom:5px;-webkit-transform:translateZ(0);transform:translateZ(0)}.ant-tabs.ant-tabs-card>.ant-tabs-bar .ant-tabs-nav-wrap{margin-bottom:0}.ant-tabs.ant-tabs-card>.ant-tabs-bar .ant-tabs-tab .anticon-close{margin-right:0;color:rgba(0,0,0,.43);-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1);display:inline-block;font-size:12px;font-size:9px\9;-webkit-transform:scale(.75) rotate(0deg);-ms-transform:scale(.75) rotate(0deg);transform:scale(.75) rotate(0deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";zoom:1;-webkit-transform-origin:100% 50%;-ms-transform-origin:100% 50%;transform-origin:100% 50%;width:0;text-align:right;vertical-align:middle;overflow:hidden}:root .ant-tabs.ant-tabs-card>.ant-tabs-bar .ant-tabs-tab .anticon-close{-webkit-filter:none;filter:none;font-size:12px}.ant-tabs.ant-tabs-card>.ant-tabs-bar .ant-tabs-tab .anticon-close:hover{color:#404040;font-weight:700}.ant-tabs.ant-tabs-editable-card>.ant-tabs-bar .ant-tabs-tab>div{-webkit-transition:all .3s cubic-bezier(.645,.045,.355,1);transition:all .3s cubic-bezier(.645,.045,.355,1)}.ant-tabs.ant-tabs-editable-card>.ant-tabs-bar .ant-tabs-tab:not(.ant-tabs-tab-active):hover>div:not(.ant-tabs-tab-unclosable){margin-left:-8px;margin-right:-8px}.ant-tabs.ant-tabs-card>.ant-tabs-bar .ant-tabs-tab-active .anticon-close,.ant-tabs.ant-tabs-card>.ant-tabs-bar .ant-tabs-tab:hover .anticon-close{width:16px;-webkit-transform:translateZ(0);transform:translateZ(0)}.ant-tabs-extra-content{float:right;line-height:32px}.ant-tabs-extra-content .ant-tabs-new-tab{width:20px;height:20px;line-height:20px;text-align:center;cursor:pointer;border-radius:4px;border:1px solid #d9d9d9;display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);-ms-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";zoom:1;color:rgba(0,0,0,.43);-webkit-transition:color .3s ease;transition:color .3s ease}:root .ant-tabs-extra-content .ant-tabs-new-tab{-webkit-filter:none;filter:none;font-size:12px}.ant-tabs-extra-content .ant-tabs-new-tab:hover{color:#404040}.ant-tabs-vertical.ant-tabs-card>.ant-tabs-bar .ant-tabs-nav-container{height:auto}.ant-tabs-vertical.ant-tabs-card>.ant-tabs-bar .ant-tabs-tab{border-bottom:1px solid #d9d9d9;margin-bottom:8px}.ant-tabs-vertical.ant-tabs-card>.ant-tabs-bar .ant-tabs-tab-active{padding-bottom:4px}.ant-tabs-vertical.ant-tabs-card>.ant-tabs-bar .ant-tabs-tab:last-child{margin-bottom:8px}.ant-tabs-vertical.ant-tabs-card.ant-tabs-left>.ant-tabs-bar .ant-tabs-nav-wrap{margin-right:0}.ant-tabs-vertical.ant-tabs-card.ant-tabs-left>.ant-tabs-bar .ant-tabs-tab{border-right:0;border-radius:4px 0 0 4px;margin-right:1px}.ant-tabs-vertical.ant-tabs-card.ant-tabs-left>.ant-tabs-bar .ant-tabs-tab-active{margin-right:-1px;padding-right:18px}.ant-tabs-vertical.ant-tabs-card.ant-tabs-right>.ant-tabs-bar .ant-tabs-nav-wrap{margin-left:0}.ant-tabs-vertical.ant-tabs-card.ant-tabs-right>.ant-tabs-bar .ant-tabs-tab{border-left:0;border-radius:0 4px 4px 0;margin-left:1px}.ant-tabs-vertical.ant-tabs-card.ant-tabs-right>.ant-tabs-bar .ant-tabs-tab-active{margin-left:-1px;padding-left:18px}.ant-tabs{box-sizing:border-box;position:relative;overflow:hidden;zoom:1;color:rgba(0,0,0,.65)}.ant-tabs:after,.ant-tabs:before{content:" ";display:table}.ant-tabs:after{clear:both;visibility:hidden;font-size:0;height:0}.ant-tabs-ink-bar{z-index:1;position:absolute;left:0;bottom:1px;box-sizing:border-box;height:2px;background-color:#108ee9;-webkit-transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:-webkit-transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1);transition:transform .3s cubic-bezier(.645,.045,.355,1),-webkit-transform .3s cubic-bezier(.645,.045,.355,1);-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}.ant-tabs-bar{border-bottom:1px solid #d9d9d9;margin-bottom:16px;outline:none}.ant-tabs-nav-container{overflow:hidden;font-size:14px;line-height:1.5;box-sizing:border-box;position:relative;white-space:nowrap;margin-bottom:-1px;zoom:1}.ant-tabs-nav-container:after,.ant-tabs-nav-container:before{content:" ";display:table}.ant-tabs-nav-container:after{clear:both;visibility:hidden;font-size:0;height:0}.ant-tabs-nav-container-scrolling{padding-left:32px;padding-right:32px}.ant-tabs-tab-next,.ant-tabs-tab-prev{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:2;margin-right:-2px;margin-top:3px;width:32px;height:100%;line-height:32px;cursor:pointer;border:0;background-color:transparent;position:absolute;text-align:center;color:rgba(0,0,0,.43);-webkit-transition:color .3s ease;transition:color .3s ease}.ant-tabs-tab-next:hover,.ant-tabs-tab-prev:hover{color:rgba(0,0,0,.65)}.ant-tabs-tab-next-icon,.ant-tabs-tab-prev-icon{position:relative;font-style:normal;font-weight:700;font-variant:normal;line-height:inherit;vertical-align:baseline;text-align:center;text-transform:none;font-family:sans-serif;display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);-ms-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";zoom:1}:root .ant-tabs-tab-next-icon,:root .ant-tabs-tab-prev-icon{-webkit-filter:none;filter:none;font-size:12px}.ant-tabs-tab-next-icon:before,.ant-tabs-tab-prev-icon:before{display:block;font-family:anticon!important}.ant-tabs-tab-btn-disabled{cursor:not-allowed}.ant-tabs-tab-btn-disabled,.ant-tabs-tab-btn-disabled:hover{color:rgba(0,0,0,.25)}.ant-tabs-tab-next{right:2px}.ant-tabs-tab-next-icon:before{content:"\E61F"}.ant-tabs-tab-prev{left:0}.ant-tabs-tab-prev-icon:before{content:"\E620"}:root .ant-tabs-tab-prev{-webkit-filter:none;filter:none}.ant-tabs-nav-wrap{overflow:hidden;margin-bottom:-1px}.ant-tabs-nav-scroll{overflow:hidden;white-space:nowrap}.ant-tabs-nav{box-sizing:border-box;padding-left:0;-webkit-transition:-webkit-transform .5s cubic-bezier(.645,.045,.355,1);transition:-webkit-transform .5s cubic-bezier(.645,.045,.355,1);transition:transform .5s cubic-bezier(.645,.045,.355,1);transition:transform .5s cubic-bezier(.645,.045,.355,1),-webkit-transform .5s cubic-bezier(.645,.045,.355,1);position:relative;margin:0;list-style:none;float:left}.ant-tabs-nav:after,.ant-tabs-nav:before{display:table;content:" "}.ant-tabs-nav:after{clear:both}.ant-tabs-nav .ant-tabs-tab-disabled{pointer-events:none;cursor:default;color:rgba(0,0,0,.25)}.ant-tabs-nav .ant-tabs-tab{display:inline-block;height:100%;margin-right:24px;box-sizing:border-box;position:relative;padding:8px 20px;-webkit-transition:color .3s cubic-bezier(.645,.045,.355,1);transition:color .3s cubic-bezier(.645,.045,.355,1);cursor:pointer;text-decoration:none}.ant-tabs-nav .ant-tabs-tab:hover{color:#49a9ee}.ant-tabs-nav .ant-tabs-tab:active{color:#0e77ca}.ant-tabs-nav .ant-tabs-tab .anticon{width:14px;height:14px;margin-right:8px}.ant-tabs-nav .ant-tabs-tab-active{color:#108ee9}.ant-tabs-mini .ant-tabs-nav-container{font-size:12px}.ant-tabs-mini .ant-tabs-tab{margin-right:0;padding:8px 16px}.ant-tabs:not(.ant-tabs-vertical)>.ant-tabs-content{width:100%}.ant-tabs:not(.ant-tabs-vertical)>.ant-tabs-content>.ant-tabs-tabpane{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:100%;-webkit-transition:opacity .3s;transition:opacity .3s;opacity:1}.ant-tabs:not(.ant-tabs-vertical)>.ant-tabs-content>.ant-tabs-tabpane-inactive{opacity:0;height:0}.ant-tabs:not(.ant-tabs-vertical)>.ant-tabs-content-animated{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;will-change:margin-left;-webkit-transition:margin-left .3s cubic-bezier(.645,.045,.355,1);transition:margin-left .3s cubic-bezier(.645,.045,.355,1)}.ant-tabs-vertical>.ant-tabs-bar{border-bottom:0}.ant-tabs-vertical>.ant-tabs-bar .ant-tabs-tab{float:none;margin-right:0;margin-bottom:16px;display:block;padding:8px 24px}.ant-tabs-vertical>.ant-tabs-bar .ant-tabs-tab:last-child{margin-bottom:0}.ant-tabs-vertical>.ant-tabs-bar .ant-tabs-nav-scroll{width:auto}.ant-tabs-vertical>.ant-tabs-bar .ant-tabs-nav-container,.ant-tabs-vertical>.ant-tabs-bar .ant-tabs-nav-wrap{margin-bottom:0}.ant-tabs-vertical>.ant-tabs-bar .ant-tabs-ink-bar{width:2px;left:auto;height:auto;top:0}.ant-tabs-vertical>.ant-tabs-content{overflow:hidden;width:auto;margin-top:0!important}.ant-tabs-vertical.ant-tabs-left>.ant-tabs-bar{float:left;border-right:1px solid #e9e9e9;margin-right:-1px;margin-bottom:0}.ant-tabs-vertical.ant-tabs-left>.ant-tabs-bar .ant-tabs-tab{text-align:right}.ant-tabs-vertical.ant-tabs-left>.ant-tabs-bar .ant-tabs-nav-container,.ant-tabs-vertical.ant-tabs-left>.ant-tabs-bar .ant-tabs-nav-wrap{margin-right:-1px}.ant-tabs-vertical.ant-tabs-left>.ant-tabs-bar .ant-tabs-ink-bar{right:1px}.ant-tabs-vertical.ant-tabs-left>.ant-tabs-content{padding-left:24px;border-left:1px solid #e9e9e9}.ant-tabs-vertical.ant-tabs-right>.ant-tabs-bar{float:right;border-left:1px solid #e9e9e9;margin-left:-1px;margin-bottom:0}.ant-tabs-vertical.ant-tabs-right>.ant-tabs-bar .ant-tabs-nav-container,.ant-tabs-vertical.ant-tabs-right>.ant-tabs-bar .ant-tabs-nav-wrap{margin-left:-1px}.ant-tabs-vertical.ant-tabs-right>.ant-tabs-bar .ant-tabs-ink-bar{left:1px}.ant-tabs-vertical.ant-tabs-right>.ant-tabs-content{padding-right:24px;border-right:1px solid #e9e9e9}.ant-tabs-bottom>.ant-tabs-bar{margin-bottom:0;margin-top:16px}.ant-tabs-no-animation>.ant-tabs-content-animated,.ant-tabs-vertical>.ant-tabs-content-animated,.no-flex>.ant-tabs-content-animated{-webkit-transform:none!important;-ms-transform:none!important;transform:none!important;margin-left:0!important}.ant-tabs-no-animation>.ant-tabs-content>.ant-tabs-tabpane-inactive,.ant-tabs-vertical>.ant-tabs-content>.ant-tabs-tabpane-inactive,.no-flex>.ant-tabs-content>.ant-tabs-tabpane-inactive{display:none}.ant-tag{display:inline-block;line-height:20px;height:22px;padding:0 8px;border-radius:4px;border:1px solid #e9e9e9;background:#f7f7f7;font-size:12px;-webkit-transition:all .3s cubic-bezier(.78,.14,.15,.86);transition:all .3s cubic-bezier(.78,.14,.15,.86);opacity:1;margin-right:8px;cursor:pointer;white-space:nowrap}.ant-tag:hover{opacity:.85}.ant-tag,.ant-tag a,.ant-tag a:hover{color:rgba(0,0,0,.65)}.ant-tag-text a:first-child:last-child{display:inline-block;margin:0 -8px;padding:0 8px}.ant-tag .anticon-cross{display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);-ms-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";zoom:1;cursor:pointer;font-weight:700;margin-left:3px;-webkit-transition:all .3s ease;transition:all .3s ease;opacity:.66}:root .ant-tag .anticon-cross{-webkit-filter:none;filter:none;font-size:12px}.ant-tag .anticon-cross:hover{opacity:1}.ant-tag-has-color{border-color:transparent}.ant-tag-has-color,.ant-tag-has-color .anticon-cross,.ant-tag-has-color .anticon-cross:hover,.ant-tag-has-color a,.ant-tag-has-color a:hover{color:#fff}.ant-tag-checkable{background-color:transparent;border-color:transparent}.ant-tag-checkable-checked,.ant-tag-checkable:active,.ant-tag-checkable:hover{color:#fff}.ant-tag-checkable:hover{background-color:#49a9ee}.ant-tag-checkable-checked{background-color:#108ee9}.ant-tag-checkable:active{background-color:#0e77ca}.ant-tag-close{width:0!important;padding:0;margin:0}.ant-tag-zoom-appear,.ant-tag-zoom-enter{-webkit-animation:antFadeIn .2s cubic-bezier(.78,.14,.15,.86);animation:antFadeIn .2s cubic-bezier(.78,.14,.15,.86);-webkit-animation-fill-mode:both;animation-fill-mode:both}.ant-tag-zoom-leave{-webkit-animation:antZoomOut .3s cubic-bezier(.78,.14,.15,.86);animation:antZoomOut .3s cubic-bezier(.78,.14,.15,.86);-webkit-animation-fill-mode:both;animation-fill-mode:both}.ant-tag-pink{color:#f5317f;background:#fdd8e7;border-color:#fdd8e7}.ant-tag-pink-inverse{background:#f5317f;border-color:#f5317f;color:#fff}.ant-tag-red{color:#f04134;background:#fcdbd9;border-color:#fcdbd9}.ant-tag-red-inverse{background:#f04134;border-color:#f04134;color:#fff}.ant-tag-orange{color:#f56a00;background:#fde3cf;border-color:#fde3cf}.ant-tag-orange-inverse{background:#f56a00;border-color:#f56a00;color:#fff}.ant-tag-yellow{color:#ffbf00;background:#fff3cf;border-color:#fff3cf}.ant-tag-yellow-inverse{background:#ffbf00;border-color:#ffbf00;color:#fff}.ant-tag-cyan{color:#00a2ae;background:#cfedf0;border-color:#cfedf0}.ant-tag-cyan-inverse{background:#00a2ae;border-color:#00a2ae;color:#fff}.ant-tag-green{color:#00a854;background:#cfefdf;border-color:#cfefdf}.ant-tag-green-inverse{background:#00a854;border-color:#00a854;color:#fff}.ant-tag-blue{color:#108ee9;background:#d2eafb;border-color:#d2eafb}.ant-tag-blue-inverse{background:#108ee9;border-color:#108ee9;color:#fff}.ant-tag-purple{color:#7265e6;background:#e4e2fa;border-color:#e4e2fa}.ant-tag-purple-inverse{background:#7265e6;border-color:#7265e6;color:#fff}.ant-timeline{list-style:none;margin:0;padding:0}.ant-timeline-item{position:relative;padding:0 0 12px;list-style:none;margin:0}.ant-timeline-item-tail{position:absolute;left:5px;top:0;height:100%;border-left:2px solid #e9e9e9}.ant-timeline-item-pending .ant-timeline-item-tail{display:none}.ant-timeline-item-head{position:absolute;width:12px;height:12px;background-color:#fff;border-radius:100px;border:2px solid transparent}.ant-timeline-item-head-blue{border-color:#108ee9;color:#108ee9}.ant-timeline-item-head-red{border-color:#f04134;color:#f04134}.ant-timeline-item-head-green{border-color:#00a854;color:#00a854}.ant-timeline-item-head-custom{position:absolute;text-align:center;width:40px;left:-14px;line-height:1;margin-top:6px;border:0;height:auto;border-radius:0;padding:3px 0;font-size:12px;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ant-timeline-item-content{padding:0 0 10px 24px;font-size:12px;position:relative;top:-3px}.ant-timeline-item-last .ant-timeline-item-tail{border-left:2px dotted #e9e9e9;display:none}.ant-timeline-item-last .ant-timeline-item-content{min-height:48px}.ant-timeline.ant-timeline-pending .ant-timeline-item-last .ant-timeline-item-tail{display:block}.ant-transfer{position:relative;line-height:1.5}.ant-transfer-list{font-size:12px;border:1px solid #d9d9d9;display:inline-block;border-radius:4px;vertical-align:middle;position:relative;width:180px;height:200px;padding-top:33px}.ant-transfer-list-with-footer{padding-bottom:33px}.ant-transfer-list-search-action{color:rgba(0,0,0,.25);position:absolute;top:4px;right:4px;bottom:4px;width:28px;line-height:26px;text-align:center;font-size:14px}.ant-transfer-list-search-action .anticon{-webkit-transition:all .3s;transition:all .3s;font-size:12px;color:rgba(0,0,0,.25)}.ant-transfer-list-search-action .anticon:hover{color:rgba(0,0,0,.43)}span.ant-transfer-list-search-action{pointer-events:none}.ant-transfer-list-header{padding:7px 15px;border-radius:4px 4px 0 0;background:#fff;color:rgba(0,0,0,.65);border-bottom:1px solid #e9e9e9;overflow:hidden;position:absolute;top:0;left:0;width:100%}.ant-transfer-list-header-title{position:absolute;right:15px}.ant-transfer-list-body{font-size:12px;position:relative;height:100%}.ant-transfer-list-body-search-wrapper{position:absolute;top:0;left:0;padding:4px;width:100%}.ant-transfer-list-body-with-search{padding-top:34px}.ant-transfer-list-content{height:100%;overflow:auto}.ant-transfer-list-content-item{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding:7px 15px;min-height:32px;-webkit-transition:all .3s ease;transition:all .3s ease}.ant-transfer-list-content-item:not(.ant-transfer-list-content-item-disabled):hover{cursor:pointer;background-color:#ecf6fd}.ant-transfer-list-content-item-disabled{cursor:not-allowed;color:rgba(0,0,0,.25)}.ant-transfer-list-content-item-highlight-enter{-webkit-animation:transferHighlightIn 1s ease;animation:transferHighlightIn 1s ease;-webkit-transition:none;transition:none}.ant-transfer-list-body-not-found{padding-top:0;color:rgba(0,0,0,.25);text-align:center;display:none;position:absolute;top:50%;width:100%;margin-top:-10px}.ant-transfer-list-content:empty+.ant-transfer-list-body-not-found{display:block}.ant-transfer-list-footer{border-top:1px solid #e9e9e9;border-radius:0 0 4px 4px;position:absolute;bottom:0;left:0;width:100%}.ant-transfer-operation{display:inline-block;overflow:hidden;margin:0 8px;vertical-align:middle}.ant-transfer-operation .ant-btn{display:block}.ant-transfer-operation .ant-btn:first-child{margin-bottom:4px}.ant-transfer-operation .ant-btn .anticon{display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);-ms-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";zoom:1}:root .ant-transfer-operation .ant-btn .anticon{-webkit-filter:none;filter:none;font-size:12px}@-webkit-keyframes transferHighlightIn{0%{background:#d2eafb}to{background:transparent}}@keyframes transferHighlightIn{0%{background:#d2eafb}to{background:transparent}}.ant-select-tree-checkbox{white-space:nowrap;cursor:pointer;outline:none;display:inline-block;line-height:1;position:relative;vertical-align:middle}.ant-select-tree-checkbox-input:focus+.ant-select-tree-checkbox-inner,.ant-select-tree-checkbox-wrapper:hover .ant-select-tree-checkbox,.ant-select-tree-checkbox:hover .ant-select-tree-checkbox-inner{border-color:#108ee9}.ant-select-tree-checkbox-inner{position:relative;top:0;left:0;display:block;width:14px;height:14px;border:1px solid #d9d9d9;border-radius:2px;background-color:#fff;-webkit-transition:all .3s;transition:all .3s}.ant-select-tree-checkbox-inner:after{-webkit-transform:rotate(45deg) scale(0);-ms-transform:rotate(45deg) scale(0);transform:rotate(45deg) scale(0);position:absolute;left:4px;top:1px;display:table;width:5px;height:8px;border:2px solid #fff;border-top:0;border-left:0;content:" ";-webkit-transition:all .1s cubic-bezier(.71,-.46,.88,.6);transition:all .1s cubic-bezier(.71,-.46,.88,.6)}.ant-select-tree-checkbox-input{position:absolute;left:0;z-index:1;cursor:pointer;opacity:0;filter:alpha(opacity=0);top:0;bottom:0;right:0;width:100%;height:100%}.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner:after{content:" ";-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);position:absolute;left:2px;top:5px;width:8px;height:1px}.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner:after{-webkit-transform:rotate(45deg) scale(1);-ms-transform:rotate(45deg) scale(1);transform:rotate(45deg) scale(1);position:absolute;left:4px;top:1px;display:table;width:5px;height:8px;border:2px solid #fff;border-top:0;border-left:0;content:" ";-webkit-transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s}.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner,.ant-select-tree-checkbox-indeterminate .ant-select-tree-checkbox-inner{background-color:#108ee9;border-color:#108ee9}.ant-select-tree-checkbox-disabled.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner:after{-webkit-animation-name:none;animation-name:none;border-color:rgba(0,0,0,.25)}.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner{border-color:#d9d9d9!important;background-color:#f3f3f3}.ant-select-tree-checkbox-disabled .ant-select-tree-checkbox-inner:after{-webkit-animation-name:none;animation-name:none;border-color:#f3f3f3}.ant-select-tree-checkbox-disabled+span{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-select-tree-checkbox-wrapper{cursor:pointer;font-size:12px;display:inline-block}.ant-select-tree-checkbox-wrapper:not(:last-child){margin-right:8px}.ant-select-tree-checkbox+span,.ant-select-tree-checkbox-wrapper+span{padding-left:8px;padding-right:8px;vertical-align:middle}.ant-select-tree-checkbox-group{font-size:12px}.ant-select-tree-checkbox-group-item{display:inline-block}@media \0screen{.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner:after,.ant-select-tree-checkbox-checked .ant-select-tree-checkbox-inner:before{font-family:anticon;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\E632";font-weight:700;font-size:8px;border:0;color:#fff;left:2px;top:3px;position:absolute}}.ant-select-tree{margin:0;padding:8px;font-size:12px}.ant-select-tree li{padding:0;margin:8px 0;list-style:none;white-space:nowrap;outline:0}.ant-select-tree li.filter-node>a{font-weight:700!important}.ant-select-tree li ul{margin:0;padding:0 0 0 18px}.ant-select-tree li a{display:inline-block;padding:1px 5px;border-radius:2px;margin:0;cursor:pointer;text-decoration:none;vertical-align:top;color:rgba(0,0,0,.65);-webkit-transition:all .3s ease;transition:all .3s ease}.ant-select-tree li a:hover{background-color:#ecf6fd}.ant-select-tree li a.ant-select-tree-node-selected{background-color:#d2eafb}.ant-select-tree li span.ant-select-tree-checkbox{margin:2px 4px 0 0}.ant-select-tree li span.ant-select-tree-iconEle,.ant-select-tree li span.ant-select-tree-switcher{margin:0;width:16px;height:16px;line-height:16px;display:inline-block;vertical-align:middle;border:0 none;cursor:pointer;outline:none}.ant-select-tree li span.ant-select-tree-icon_loading:after{display:inline-block;font-family:anticon;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\E64D";font-weight:700;-webkit-animation:loadingCircle 1s infinite linear;animation:loadingCircle 1s infinite linear;margin-top:8px}.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-switcher-noop{cursor:auto}.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-bottom_open,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-center_open,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-noline_open,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-roots_open{position:relative}.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-bottom_open:after,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-center_open:after,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-noline_open:after,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-roots_open:after{font-size:12px;font-size:7px\9;-webkit-transform:scale(.58333333) rotate(0deg);-ms-transform:scale(.58333333) rotate(0deg);transform:scale(.58333333) rotate(0deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";zoom:1;display:inline-block;font-family:anticon;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\E606";font-weight:700;position:absolute;top:0;right:4px;color:rgba(0,0,0,.65);-webkit-transition:-webkit-transform .3s ease;transition:-webkit-transform .3s ease;transition:transform .3s ease;transition:transform .3s ease,-webkit-transform .3s ease}:root .ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-bottom_open:after,:root .ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-center_open:after,:root .ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-noline_open:after,:root .ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-roots_open:after{-webkit-filter:none;filter:none;font-size:12px}.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-bottom_close,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-center_close,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-noline_close,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-roots_close{position:relative;-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"}.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-bottom_close:after,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-center_close:after,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-noline_close:after,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-roots_close:after{font-size:12px;font-size:7px\9;-webkit-transform:scale(.58333333) rotate(0deg);-ms-transform:scale(.58333333) rotate(0deg);transform:scale(.58333333) rotate(0deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";zoom:1;display:inline-block;font-family:anticon;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\E606";font-weight:700;position:absolute;top:0;right:4px;color:rgba(0,0,0,.65);-webkit-transition:-webkit-transform .3s ease;transition:-webkit-transform .3s ease;transition:transform .3s ease;transition:transform .3s ease,-webkit-transform .3s ease}:root .ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-bottom_close:after,:root .ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-center_close:after,:root .ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-noline_close:after,:root .ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-roots_close:after{-webkit-filter:none;filter:none;font-size:12px}.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-bottom_close:after,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-center_close:after,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-noline_close:after,.ant-select-tree li span.ant-select-tree-switcher.ant-select-tree-roots_close:after{-webkit-transform:rotate(270deg) scale(.5);-ms-transform:rotate(270deg) scale(.5);transform:rotate(270deg) scale(.5)}.ant-select-tree-child-tree{display:none}.ant-select-tree-child-tree-open{display:block}.ant-select-tree-treenode-disabled>a,.ant-select-tree-treenode-disabled>a span,.ant-select-tree-treenode-disabled>span{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-select-tree-icon__close,.ant-select-tree-icon__open{margin-right:2px;vertical-align:top}.ant-select-tree-dropdown .ant-select-dropdown-search{display:block;padding:4px}.ant-select-tree-dropdown .ant-select-dropdown-search .ant-select-search__field__wrap{width:100%}.ant-select-tree-dropdown .ant-select-dropdown-search .ant-select-search__field{padding:4px 7px;width:100%;box-sizing:border-box;border:1px solid #d9d9d9;border-radius:4px;outline:none}.ant-select-tree-dropdown .ant-select-dropdown-search.ant-select-search--hide{display:none}.ant-select-tree-dropdown .ant-select-not-found{cursor:not-allowed;color:rgba(0,0,0,.25);padding:7px 16px;display:block}.ant-tree-checkbox{white-space:nowrap;cursor:pointer;outline:none;display:inline-block;line-height:1;position:relative;vertical-align:middle}.ant-tree-checkbox-input:focus+.ant-tree-checkbox-inner,.ant-tree-checkbox-wrapper:hover .ant-tree-checkbox,.ant-tree-checkbox:hover .ant-tree-checkbox-inner{border-color:#108ee9}.ant-tree-checkbox-inner{position:relative;top:0;left:0;display:block;width:14px;height:14px;border:1px solid #d9d9d9;border-radius:2px;background-color:#fff;-webkit-transition:all .3s;transition:all .3s}.ant-tree-checkbox-inner:after{-webkit-transform:rotate(45deg) scale(0);-ms-transform:rotate(45deg) scale(0);transform:rotate(45deg) scale(0);position:absolute;left:4px;top:1px;display:table;width:5px;height:8px;border:2px solid #fff;border-top:0;border-left:0;content:" ";-webkit-transition:all .1s cubic-bezier(.71,-.46,.88,.6);transition:all .1s cubic-bezier(.71,-.46,.88,.6)}.ant-tree-checkbox-input{position:absolute;left:0;z-index:1;cursor:pointer;opacity:0;filter:alpha(opacity=0);top:0;bottom:0;right:0;width:100%;height:100%}.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner:after{content:" ";-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);position:absolute;left:2px;top:5px;width:8px;height:1px}.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after{-webkit-transform:rotate(45deg) scale(1);-ms-transform:rotate(45deg) scale(1);transform:rotate(45deg) scale(1);position:absolute;left:4px;top:1px;display:table;width:5px;height:8px;border:2px solid #fff;border-top:0;border-left:0;content:" ";-webkit-transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s;transition:all .2s cubic-bezier(.12,.4,.29,1.46) .1s}.ant-tree-checkbox-checked .ant-tree-checkbox-inner,.ant-tree-checkbox-indeterminate .ant-tree-checkbox-inner{background-color:#108ee9;border-color:#108ee9}.ant-tree-checkbox-disabled.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after{-webkit-animation-name:none;animation-name:none;border-color:rgba(0,0,0,.25)}.ant-tree-checkbox-disabled .ant-tree-checkbox-inner{border-color:#d9d9d9!important;background-color:#f3f3f3}.ant-tree-checkbox-disabled .ant-tree-checkbox-inner:after{-webkit-animation-name:none;animation-name:none;border-color:#f3f3f3}.ant-tree-checkbox-disabled+span{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-tree-checkbox-wrapper{cursor:pointer;font-size:12px;display:inline-block}.ant-tree-checkbox-wrapper:not(:last-child){margin-right:8px}.ant-tree-checkbox+span,.ant-tree-checkbox-wrapper+span{padding-left:8px;padding-right:8px;vertical-align:middle}.ant-tree-checkbox-group{font-size:12px}.ant-tree-checkbox-group-item{display:inline-block}@media \0screen{.ant-tree-checkbox-checked .ant-tree-checkbox-inner:after,.ant-tree-checkbox-checked .ant-tree-checkbox-inner:before{font-family:anticon;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\E632";font-weight:700;font-size:8px;border:0;color:#fff;left:2px;top:3px;position:absolute}}.ant-tree{margin:0;padding:5px;font-size:12px}.ant-tree li{padding:4px 0;margin:0;list-style:none;white-space:nowrap;outline:0}.ant-tree li a[draggable=true],.ant-tree li a[draggable]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-top:2px solid transparent;border-bottom:2px solid transparent;-khtml-user-drag:element;-webkit-user-drag:element}.ant-tree li.drag-over>a[draggable]{background-color:#108ee9;color:#fff;opacity:.8}.ant-tree li.drag-over-gap-top>a[draggable]{border-top-color:#108ee9}.ant-tree li.drag-over-gap-bottom>a[draggable]{border-bottom-color:#108ee9}.ant-tree li.filter-node>a{color:#f04134!important;font-weight:700!important}.ant-tree li ul{margin:0;padding:0 0 0 18px}.ant-tree li a{display:inline-block;padding:1px 5px;border-radius:2px;margin:0;cursor:pointer;text-decoration:none;vertical-align:top;color:rgba(0,0,0,.65);-webkit-transition:all .3s ease;transition:all .3s ease}.ant-tree li a:hover{background-color:#ecf6fd}.ant-tree li a.ant-tree-node-selected{background-color:#d2eafb}.ant-tree li span.ant-tree-checkbox{margin:0 4px 0 0}.ant-tree li span.ant-tree-iconEle,.ant-tree li span.ant-tree-switcher{margin:0;width:16px;height:16px;line-height:16px;display:inline-block;vertical-align:middle;border:0 none;cursor:pointer;outline:none}.ant-tree li span.ant-tree-icon_loading:after{display:inline-block;font-family:anticon;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\E6AE";-webkit-animation:loadingCircle 1s infinite linear;animation:loadingCircle 1s infinite linear;color:#108ee9}.ant-tree li span.ant-tree-switcher.ant-tree-switcher-noop{cursor:auto}.ant-tree li span.ant-tree-switcher.ant-tree-bottom_open,.ant-tree li span.ant-tree-switcher.ant-tree-center_open,.ant-tree li span.ant-tree-switcher.ant-tree-noline_open,.ant-tree li span.ant-tree-switcher.ant-tree-roots_open{position:relative}.ant-tree li span.ant-tree-switcher.ant-tree-bottom_open:after,.ant-tree li span.ant-tree-switcher.ant-tree-center_open:after,.ant-tree li span.ant-tree-switcher.ant-tree-noline_open:after,.ant-tree li span.ant-tree-switcher.ant-tree-roots_open:after{font-size:12px;font-size:7px\9;-webkit-transform:scale(.58333333) rotate(0deg);-ms-transform:scale(.58333333) rotate(0deg);transform:scale(.58333333) rotate(0deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";zoom:1;display:inline-block;font-family:anticon;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\E606";font-weight:700;position:absolute;top:0;right:4px;color:rgba(0,0,0,.65);-webkit-transition:-webkit-transform .3s ease;transition:-webkit-transform .3s ease;transition:transform .3s ease;transition:transform .3s ease,-webkit-transform .3s ease}:root .ant-tree li span.ant-tree-switcher.ant-tree-bottom_open:after,:root .ant-tree li span.ant-tree-switcher.ant-tree-center_open:after,:root .ant-tree li span.ant-tree-switcher.ant-tree-noline_open:after,:root .ant-tree li span.ant-tree-switcher.ant-tree-roots_open:after{-webkit-filter:none;filter:none;font-size:12px}.ant-tree li span.ant-tree-switcher.ant-tree-bottom_close,.ant-tree li span.ant-tree-switcher.ant-tree-center_close,.ant-tree li span.ant-tree-switcher.ant-tree-noline_close,.ant-tree li span.ant-tree-switcher.ant-tree-roots_close{position:relative;-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"}.ant-tree li span.ant-tree-switcher.ant-tree-bottom_close:after,.ant-tree li span.ant-tree-switcher.ant-tree-center_close:after,.ant-tree li span.ant-tree-switcher.ant-tree-noline_close:after,.ant-tree li span.ant-tree-switcher.ant-tree-roots_close:after{font-size:12px;font-size:7px\9;-webkit-transform:scale(.58333333) rotate(0deg);-ms-transform:scale(.58333333) rotate(0deg);transform:scale(.58333333) rotate(0deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";zoom:1;display:inline-block;font-family:anticon;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\E606";font-weight:700;position:absolute;top:0;right:4px;color:rgba(0,0,0,.65);-webkit-transition:-webkit-transform .3s ease;transition:-webkit-transform .3s ease;transition:transform .3s ease;transition:transform .3s ease,-webkit-transform .3s ease}:root .ant-tree li span.ant-tree-switcher.ant-tree-bottom_close:after,:root .ant-tree li span.ant-tree-switcher.ant-tree-center_close:after,:root .ant-tree li span.ant-tree-switcher.ant-tree-noline_close:after,:root .ant-tree li span.ant-tree-switcher.ant-tree-roots_close:after{-webkit-filter:none;filter:none;font-size:12px}.ant-tree li span.ant-tree-switcher.ant-tree-bottom_close:after,.ant-tree li span.ant-tree-switcher.ant-tree-center_close:after,.ant-tree li span.ant-tree-switcher.ant-tree-noline_close:after,.ant-tree li span.ant-tree-switcher.ant-tree-roots_close:after{-webkit-transform:rotate(270deg) scale(.6);-ms-transform:rotate(270deg) scale(.6);transform:rotate(270deg) scale(.6)}.ant-tree>li:first-child{padding-top:7px}.ant-tree>li:last-child{padding-bottom:7px}.ant-tree-child-tree{display:none}.ant-tree-child-tree-open{display:block}.ant-tree-treenode-disabled>a,.ant-tree-treenode-disabled>a span,.ant-tree-treenode-disabled>span{color:rgba(0,0,0,.25);cursor:not-allowed}.ant-tree-icon__close,.ant-tree-icon__open{margin-right:2px;vertical-align:top}.ant-upload{font-size:12px;outline:0}.ant-upload-btn{display:block;width:100%;outline:none}.ant-upload input[type=file]{cursor:pointer}.ant-upload.ant-upload-select{display:inline-block}.ant-upload.ant-upload-select-picture-card{border:1px dashed #d9d9d9;width:96px;height:96px;border-radius:4px;background-color:#fbfbfb;text-align:center;cursor:pointer;-webkit-transition:border-color .3s ease;transition:border-color .3s ease;display:inline-block;vertical-align:top;margin-right:8px;margin-bottom:8px}.ant-upload.ant-upload-select-picture-card>.ant-upload{display:block;width:100%;height:100%;padding:20px 0}.ant-upload.ant-upload-select-picture-card:hover{border-color:#108ee9}.ant-upload.ant-upload-drag{border:1px dashed #d9d9d9;-webkit-transition:border-color .3s ease;transition:border-color .3s ease;cursor:pointer;border-radius:4px;text-align:center;width:100%;height:100%;position:relative}.ant-upload.ant-upload-drag.ant-upload-drag-hover:not(.ant-upload-disabled){border:2px dashed #49a9ee}.ant-upload.ant-upload-drag.ant-upload-disabled{cursor:not-allowed}.ant-upload.ant-upload-drag .ant-upload-btn{display:table;height:100%}.ant-upload.ant-upload-drag .ant-upload-drag-container{display:table-cell;vertical-align:middle}.ant-upload.ant-upload-drag:not(.ant-upload-disabled):hover{border-color:#49a9ee}.ant-upload.ant-upload-drag p.ant-upload-drag-icon{height:60px;margin-bottom:24px}.ant-upload.ant-upload-drag p.ant-upload-drag-icon .anticon{font-size:80px;margin-top:-5px;color:#49a9ee}.ant-upload.ant-upload-drag p.ant-upload-text{font-size:14px}.ant-upload.ant-upload-drag p.ant-upload-hint{font-size:12px;color:rgba(0,0,0,.43)}.ant-upload.ant-upload-drag .anticon-plus{font-size:30px;-webkit-transition:all .3s ease;transition:all .3s ease;color:rgba(0,0,0,.25)}.ant-upload.ant-upload-drag .anticon-plus:hover,.ant-upload.ant-upload-drag:hover .anticon-plus{color:rgba(0,0,0,.43)}.ant-upload-list{overflow:hidden}.ant-upload-list-item{overflow:hidden;margin-top:8px;font-size:12px;position:relative;height:22px}.ant-upload-list-item-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-left:16px;width:100%;display:inline-block}.ant-upload-list-item-info{line-height:22px;padding:0 12px 0 4px;-webkit-transition:background-color .3s;transition:background-color .3s}.ant-upload-list-item-info .anticon-paper-clip{margin-right:4px;font-size:12px;color:rgba(0,0,0,.43);position:absolute;top:6px}.ant-upload-list-item .anticon-cross{display:inline-block;font-size:12px;font-size:10px\9;-webkit-transform:scale(.83333333) rotate(0deg);-ms-transform:scale(.83333333) rotate(0deg);transform:scale(.83333333) rotate(0deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=1, M12=0, M21=0, M22=1)";zoom:1;-webkit-transition:all .3s;transition:all .3s;opacity:0;cursor:pointer;position:absolute;top:0;right:4px;color:rgba(0,0,0,.43);line-height:22px}:root .ant-upload-list-item .anticon-cross{-webkit-filter:none;filter:none;font-size:12px}.ant-upload-list-item .anticon-cross:hover{color:rgba(0,0,0,.65)}.ant-upload-list-item:hover .ant-upload-list-item-info{background-color:#ecf6fd}.ant-upload-list-item:hover .anticon-cross{opacity:1}.ant-upload-list-item-error,.ant-upload-list-item-error .ant-upload-list-item-name,.ant-upload-list-item-error .anticon-paper-clip{color:#f04134}.ant-upload-list-item-error .anticon-cross{opacity:1;color:#f04134!important}.ant-upload-list-item-progress{padding:0 8px 0 20px;margin-top:-2px;margin-bottom:1px;font-size:12px}.ant-upload-list-item-progress .ant-progress-line-inner{vertical-align:middle}.ant-upload-list-picture-card .ant-upload-list-item,.ant-upload-list-picture .ant-upload-list-item{padding:8px;border-radius:4px;border:1px solid #d9d9d9;height:66px;position:relative}.ant-upload-list-picture-card .ant-upload-list-item:hover,.ant-upload-list-picture .ant-upload-list-item:hover{background:transparent}.ant-upload-list-picture-card .ant-upload-list-item-error,.ant-upload-list-picture .ant-upload-list-item-error{border-color:#f04134}.ant-upload-list-picture-card .ant-upload-list-item-info,.ant-upload-list-picture .ant-upload-list-item-info{padding:0}.ant-upload-list-picture-card .ant-upload-list-item:hover .ant-upload-list-item-info,.ant-upload-list-picture .ant-upload-list-item:hover .ant-upload-list-item-info{background:transparent}.ant-upload-list-picture-card .ant-upload-list-item-uploading,.ant-upload-list-picture .ant-upload-list-item-uploading{border-style:dashed}.ant-upload-list-picture-card .ant-upload-list-item-thumbnail,.ant-upload-list-picture .ant-upload-list-item-thumbnail{width:48px;height:48px;position:absolute;top:8px;left:8px}.ant-upload-list-picture-card .ant-upload-list-item-thumbnail img,.ant-upload-list-picture .ant-upload-list-item-thumbnail img{width:48px;height:48px;display:block;overflow:hidden;border-radius:4px}.ant-upload-list-picture-card .ant-upload-list-item-thumbnail.anticon:before,.ant-upload-list-picture .ant-upload-list-item-thumbnail.anticon:before{line-height:48px;font-size:24px;color:rgba(0,0,0,.43)}.ant-upload-list-picture-card .ant-upload-list-item-name,.ant-upload-list-picture .ant-upload-list-item-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin:0 0 0 8px;line-height:44px;-webkit-transition:all .3s;transition:all .3s;padding-left:48px;padding-right:8px;max-width:100%;display:inline-block;box-sizing:border-box}.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-name,.ant-upload-list-picture .ant-upload-list-item-uploading .ant-upload-list-item-name{line-height:28px}.ant-upload-list-picture-card .ant-upload-list-item-progress,.ant-upload-list-picture .ant-upload-list-item-progress{padding-left:56px;margin-top:0}.ant-upload-list-picture-card .anticon-cross,.ant-upload-list-picture .anticon-cross{position:absolute;right:8px;top:8px;line-height:1}.ant-upload-list-picture-card{display:inline}.ant-upload-list-picture-card .ant-upload-list-item{float:left;width:96px;height:96px;margin:0 8px 8px 0}.ant-upload-list-picture-card .ant-upload-list-item-info{height:100%;position:relative}.ant-upload-list-picture-card .ant-upload-list-item-info:before{content:" ";position:absolute;z-index:1;background-color:rgba(0,0,0,.5);-webkit-transition:all .3s;transition:all .3s;width:100%;height:100%}.ant-upload-list-picture-card .ant-upload-list-item-info:hover:before{opacity:1}.ant-upload-list-picture-card .ant-upload-list-item-actions{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);z-index:10;white-space:nowrap;opacity:0;-webkit-transition:all .3s;transition:all .3s}.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete,.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye-o{z-index:10;-webkit-transition:all .3s;transition:all .3s;cursor:pointer;font-size:16px;width:16px;color:hsla(0,0%,100%,.91);margin:0 4px}.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-delete:hover,.ant-upload-list-picture-card .ant-upload-list-item-actions .anticon-eye-o:hover{color:#fff}.ant-upload-list-picture-card .ant-upload-list-item-actions:hover,.ant-upload-list-picture-card .ant-upload-list-item-info:hover+.ant-upload-list-item-actions{opacity:1}.ant-upload-list-picture-card .ant-upload-list-item-thumbnail,.ant-upload-list-picture-card .ant-upload-list-item-thumbnail img{display:block;width:100%;height:100%;position:static}.ant-upload-list-picture-card .ant-upload-list-item-name{display:none}.ant-upload-list-picture-card .ant-upload-list-item-uploading.ant-upload-list-item{background-color:#fbfbfb}.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info{height:auto}.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info .anticon-delete,.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info .anticon-eye-o,.ant-upload-list-picture-card .ant-upload-list-item-uploading .ant-upload-list-item-info:before{display:none}.ant-upload-list-picture-card .ant-upload-list-item-uploading-text{margin-top:18px;color:rgba(0,0,0,.43)}.ant-upload-list-picture-card .ant-upload-list-item-progress{padding-left:0}.ant-upload-list .ant-upload-success-icon{color:#00a854;font-weight:700}.ant-upload-list .ant-upload-animate-enter,.ant-upload-list .ant-upload-animate-inline-enter,.ant-upload-list .ant-upload-animate-inline-leave,.ant-upload-list .ant-upload-animate-leave{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:cubic-bezier(.78,.14,.15,.86);animation-fill-mode:cubic-bezier(.78,.14,.15,.86)}.ant-upload-list .ant-upload-animate-enter{-webkit-animation-name:uploadAnimateIn;animation-name:uploadAnimateIn}.ant-upload-list .ant-upload-animate-leave{-webkit-animation-name:uploadAnimateOut;animation-name:uploadAnimateOut}.ant-upload-list .ant-upload-animate-inline-enter{-webkit-animation-name:uploadAnimateInlineIn;animation-name:uploadAnimateInlineIn}.ant-upload-list .ant-upload-animate-inline-leave{-webkit-animation-name:uploadAnimateInlineOut;animation-name:uploadAnimateInlineOut}@-webkit-keyframes uploadAnimateIn{0%{height:0;margin:0;opacity:0;padding:0}}@keyframes uploadAnimateIn{0%{height:0;margin:0;opacity:0;padding:0}}@-webkit-keyframes uploadAnimateOut{to{height:0;margin:0;padding:0;opacity:0}}@keyframes uploadAnimateOut{to{height:0;margin:0;padding:0;opacity:0}}@-webkit-keyframes uploadAnimateInlineIn{0%{width:0;height:0;margin:0;opacity:0;padding:0}}@keyframes uploadAnimateInlineIn{0%{width:0;height:0;margin:0;opacity:0;padding:0}}@-webkit-keyframes uploadAnimateInlineOut{to{width:0;height:0;margin:0;padding:0;opacity:0}}@keyframes uploadAnimateInlineOut{to{width:0;height:0;margin:0;padding:0;opacity:0}} +/*# sourceMappingURL=antd.min.css.map*/ diff --git a/uam-server/src/main/webapp/public/assets/customer/iconfont.css b/uam-server/src/main/webapp/public/assets/customer/iconfont.css new file mode 100644 index 0000000000000000000000000000000000000000..3755ee3bd665cc3ab08cfe1ab071acc22c8eb161 --- /dev/null +++ b/uam-server/src/main/webapp/public/assets/customer/iconfont.css @@ -0,0 +1,42 @@ + +@font-face {font-family: "iconfont-cloud-conf"; + src: url('iconfont.eot?t=1479099177738'); /* IE9*/ + src: url('iconfont.eot?t=1479099177738#iefix') format('embedded-opentype'), /* IE6-IE8 */ + /*url('iconfont.woff?t=1479099177738') format('woff'), !* chrome, firefox *!*/ + /*url('iconfont.ttf?t=1479099177738') format('truetype'), !* chrome, firefox, opera, Safari, Android, iOS 4.2+*!*/ + url('iconfont.svg?t=1479099177738#iconfont-cloud-conf') format('svg'); /* iOS 4.1- */ +} + +.iconfont-cloud-conf { + font-family:"iconfont-cloud-conf" !important; + font-size:16px; + font-style:normal; + -webkit-font-smoothing: antialiased; + -webkit-text-stroke-width: 0.2px; + -moz-osx-font-smoothing: grayscale; +} + +.icon-cloud-conf-runflow:before { content: "\e60a"; } + +.icon-cloud-conf-stopflow:before { content: "\e60b"; } + +.icon-cloud-conf-stop:before { content: "\e63f"; } + +.icon-cloud-conf-reset:before { content: "\e63e"; } + +.icon-cloud-conf-stoppause:before { content: "\e64e"; } + +.icon-cloud-conf-retry:before { content: "\e658"; } + +.icon-cloud-conf-retry1:before { content: "\e65c"; } + +.icon-cloud-conf-suspend:before { content: "\e65d"; } + +.icon-cloud-conf-stop1:before { content: "\e65e"; } + +.icon-cloud-conf-start:before { content: "\e65f"; } + +.icon-cloud-conf-skip:before { content: "\e660"; } + +.icon-cloud-conf-recover:before { content: "\e661"; } + diff --git a/uam-server/src/main/webapp/public/assets/jquery.js b/uam-server/src/main/webapp/public/assets/jquery.js new file mode 100644 index 0000000000000000000000000000000000000000..f3644431eea2f04111468e57034018c341592f65 --- /dev/null +++ b/uam-server/src/main/webapp/public/assets/jquery.js @@ -0,0 +1,6 @@ +/*! jQuery v1.11.3 | (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="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,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=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.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},m.extend=m.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||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},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=r(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(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[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=r(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&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=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);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(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&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.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?m.extend(a,d):d}},e={};return d.pipe=d.then,m.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&&m.isFunction(a.promise)?e:0,g=1===f?a:m.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]&&m.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;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1; + +return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.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.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.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 m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.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=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(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},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!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(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},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 fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ca()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ca()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.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=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?aa:ba):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=aa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=aa,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=aa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.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(f in a)this.on(f,b,c,a[f],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=ba;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.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,m(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=ba),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function da(a){var b=ea.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var ea="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fa=/ jQuery\d+="(?:null|\d+)"/g,ga=new RegExp("<(?:"+ea+")[\\s/>]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/<tbody/i,la=/<|&#?\w+;/,ma=/<(?:script|style|link)/i,na=/checked\s*(?:[^=]|=\s*.checked.)/i,oa=/^$|\/(?:java|ecma)script/i,pa=/^true\/(.*)/,qa=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,ra={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?"<table>"!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(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=wa(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=wa(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?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(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,m.cleanData(ua(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,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ca[0].contentWindow||Ca[0].contentDocument).document,b.write(),b.close(),c=Ea(a,b),Ca.detach()),Da[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Ga=/^margin/,Ha=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ia,Ja,Ka=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ia=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Ha.test(g)&&Ga.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+""}):y.documentElement.currentStyle&&(Ia=function(a){return a.currentStyle},Ja=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ia(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Ha.test(g)&&!Ka.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function La(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.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",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight),b.removeChild(i)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.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 Ma=/alpha\([^)]*\)/i,Na=/opacity\s*=\s*([^)]*)/,Oa=/^(none|table(?!-c[ea]).+)/,Pa=new RegExp("^("+S+")(.*)$","i"),Qa=new RegExp("^([+-])=("+S+")","i"),Ra={position:"absolute",visibility:"hidden",display:"block"},Sa={letterSpacing:"0",fontWeight:"400"},Ta=["Webkit","O","Moz","ms"];function Ua(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Ta.length;while(e--)if(b=Ta[e]+c,b in a)return b;return d}function Va(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fa(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.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}function Wa(a,b,c){var d=Pa.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xa(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+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Ya(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ia(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Ja(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ha.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xa(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ja(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":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ua(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qa.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.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)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ua(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Ja(a,b,d)),"normal"===f&&b in Sa&&(f=Sa[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Oa.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Ra,function(){return Ya(a,b,d)}):Ya(a,b,d):void 0},set:function(a,c,d){var e=d&&Ia(a);return Wa(a,c,d?Xa(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Na.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Ma,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Ma.test(f)?f.replace(Ma,e):f+" "+e)}}),m.cssHooks.marginRight=La(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Ja,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Ga.test(a)||(m.cssHooks[a+b].set=Wa)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ia(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Va(this,!0)},hide:function(){return Va(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Za(a,b,c,d,e){ +return new Za.prototype.init(a,b,c,d,e)}m.Tween=Za,Za.prototype={constructor:Za,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||(m.cssNumber[c]?"":"px")},cur:function(){var a=Za.propHooks[this.prop];return a&&a.get?a.get(this):Za.propHooks._default.get(this)},run:function(a){var b,c=Za.propHooks[this.prop];return this.options.duration?this.pos=b=m.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):Za.propHooks._default.set(this),this}},Za.prototype.init.prototype=Za.prototype,Za.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Za.propHooks.scrollTop=Za.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Za.prototype.init,m.fx.step={};var $a,_a,ab=/^(?:toggle|show|hide)$/,bb=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cb=/queueHooks$/,db=[ib],eb={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bb.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bb.exec(m.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,m.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 fb(){return setTimeout(function(){$a=void 0}),$a=m.now()}function gb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hb(a,b,c){for(var d,e=(eb[b]||[]).concat(eb["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ib(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fa(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fa(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ab.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fa(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hb(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jb(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.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 kb(a,b,c){var d,e,f=0,g=db.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$a||fb(),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:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$a||fb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.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(jb(k,j.opts.specialEasing);g>f;f++)if(d=db[f].call(j,a,k,j.opts))return d;return m.map(k,hb,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.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)}m.Animation=m.extend(kb,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],eb[c]=eb[c]||[],eb[c].unshift(b)},prefilter:function(a,b){b?db.unshift(a):db.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kb(this,m.extend({},a),f);(e||m._data(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=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cb.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)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.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})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gb(b,!0),a,d,e)}}),m.each({slideDown:gb("show"),slideUp:gb("hide"),slideToggle:gb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($a=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$a=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_a||(_a=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_a),_a=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.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,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lb=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lb,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.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&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mb,nb,ob=m.expr.attrHandle,pb=/^(?:checked|selected)$/i,qb=k.getSetAttribute,rb=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nb:mb)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.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 m.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=m.propFix[c]||c,m.expr.match.bool.test(c)?rb&&qb||!pb.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qb?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nb={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rb&&qb||!pb.test(c)?a.setAttribute(!qb&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ob[b]||m.find.attr;ob[b]=rb&&qb||!pb.test(b)?function(a,b,d){var e,f;return d||(f=ob[b],ob[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,ob[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rb&&qb||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mb&&mb.set(a,b,c)}}),qb||(mb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},ob.id=ob.name=ob.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mb.set},m.attrHooks.contenteditable={set:function(a,b,c){mb.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sb=/^(?:input|select|textarea|button|object)$/i,tb=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.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||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.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){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sb.test(a.nodeName)||tb.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var ub=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(ub," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.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(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(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(ub," ").indexOf(b)>=0)return!0;return!1}}),m.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){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.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 vb=m.now(),wb=/\?/,xb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yb,zb,Ab=/#.*$/,Bb=/([?&])_=[^&]*/,Cb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Db=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Eb=/^(?:GET|HEAD)$/,Fb=/^\/\//,Gb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hb={},Ib={},Jb="*/".concat("*");try{zb=location.href}catch(Kb){zb=y.createElement("a"),zb.href="",zb=zb.href}yb=Gb.exec(zb.toLowerCase())||[];function Lb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mb(a,b,c,d){var e={},f=a===Ib;function g(h){var i;return e[h]=!0,m.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 Nb(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Ob(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pb(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}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zb,type:"GET",isLocal:Db.test(yb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jb,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":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nb(Nb(a,m.ajaxSettings),b):Nb(m.ajaxSettings,a)},ajaxPrefilter:Lb(Hb),ajaxTransport:Lb(Ib),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cb.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f: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 i&&i.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||zb)+"").replace(Ab,"").replace(Fb,yb[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gb.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yb[1]&&c[2]===yb[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yb[3]||("http:"===yb[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mb(Hb,k,b,v),2===t)return v;h=m.event&&k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Eb.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wb.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bb.test(e)?e.replace(Bb,"$1_="+vb++):e+(wb.test(e)?"&":"?")+"_="+vb++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(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]?", "+Jb+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mb(Ib,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Ob(k,v,c)),u=Pb(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=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,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qb=/%20/g,Rb=/\[\]$/,Sb=/\r?\n/g,Tb=/^(?:submit|button|image|reset|file)$/i,Ub=/^(?:input|select|textarea|keygen)/i;function Vb(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rb.test(a)?d(a,e):Vb(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vb(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vb(c,a[c],b,e);return d.join("&").replace(Qb,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Ub.test(this.nodeName)&&!Tb.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sb,"\r\n")}}):{name:b.name,value:c.replace(Sb,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zb()||$b()}:Zb;var Wb=0,Xb={},Yb=m.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Xb)Xb[a](void 0,!0)}),k.cors=!!Yb&&"withCredentials"in Yb,Yb=k.ajax=!!Yb,Yb&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wb;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)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xb[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xb[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zb(){try{return new a.XMLHttpRequest}catch(b){}}function $b(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _b=[],ac=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_b.pop()||m.expando+"_"+vb++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ac.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ac.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ac,"$1"+e):b.jsonp!==!1&&(b.url+=(wb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.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,_b.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bc=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bc)return bc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cc=a.document.documentElement;function dc(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cc;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cc})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=La(k.pixelPosition,function(a,c){return c?(c=Ja(a,b),Ha.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.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?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ec=a.jQuery,fc=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fc),b&&a.jQuery===m&&(a.jQuery=ec),m},typeof b===K&&(a.jQuery=a.$=m),m}); +//# sourceMappingURL=jquery.min.map \ No newline at end of file diff --git a/uam-server/src/main/webapp/public/assets/jquery.min.map b/uam-server/src/main/webapp/public/assets/jquery.min.map new file mode 100644 index 0000000000000000000000000000000000000000..1528143c07290134f5176bfa4b8a3cce46a986cf --- /dev/null +++ b/uam-server/src/main/webapp/public/assets/jquery.min.map @@ -0,0 +1 @@ +{"version":3,"file":"jquery.min.js","sources":["jquery.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","deletedIds","slice","concat","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","support","version","jQuery","selector","context","fn","init","rtrim","rmsPrefix","rdashAlpha","fcamelCase","all","letter","toUpperCase","prototype","jquery","constructor","length","toArray","call","get","num","pushStack","elems","ret","merge","prevObject","each","callback","args","map","elem","i","apply","arguments","first","eq","last","len","j","end","sort","splice","extend","src","copyIsArray","copy","name","options","clone","target","deep","isFunction","isPlainObject","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","obj","type","Array","isWindow","isNumeric","parseFloat","isEmptyObject","key","nodeType","e","ownLast","globalEval","data","trim","execScript","camelCase","string","nodeName","toLowerCase","value","isArraylike","text","makeArray","arr","results","Object","inArray","max","second","grep","invert","callbackInverse","matches","callbackExpect","arg","guid","proxy","tmp","now","Date","split","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","sortOrder","a","b","MAX_NEGATIVE","pop","push_native","list","booleans","whitespace","characterEncoding","identifier","attributes","pseudos","rwhitespace","RegExp","rcomma","rcombinators","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rnative","rquickExpr","rsibling","rescape","runescape","funescape","_","escaped","escapedWhitespace","high","String","fromCharCode","unloadHandler","childNodes","els","seed","match","m","groups","old","nid","newContext","newSelector","ownerDocument","exec","getElementById","parentNode","id","getElementsByTagName","getElementsByClassName","qsa","test","getAttribute","setAttribute","toSelector","testContext","join","querySelectorAll","qsaError","removeAttribute","keys","cache","cacheLength","shift","markFunction","assert","div","createElement","removeChild","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","documentElement","node","hasCompare","parent","doc","defaultView","top","addEventListener","attachEvent","className","appendChild","createComment","getById","getElementsByName","find","filter","attrId","getAttributeNode","tag","innerHTML","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","val","specified","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">","dir"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","simple","forward","ofType","xml","outerCache","nodeIndex","start","useCache","lastChild","pseudo","setFilters","idx","matched","not","matcher","unmatched","has","innerText","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","disabled","checked","selected","selectedIndex","empty","header","button","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","filters","parseOnly","tokens","soFar","preFilters","cached","addCombinator","combinator","base","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","multipleContexts","contexts","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","div1","defaultValue","unique","isXMLDoc","rneedsContext","rsingleTag","risSimple","winnow","qualifier","self","is","rootjQuery","charAt","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","next","prev","until","sibling","n","r","targets","closest","l","pos","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","siblings","contentDocument","contentWindow","reverse","rnotwhite","optionsCache","createOptions","object","flag","Callbacks","firing","memory","fired","firingLength","firingIndex","firingStart","stack","once","fire","stopOnFalse","disable","remove","lock","locked","fireWith","Deferred","func","tuples","state","promise","always","deferred","fail","then","fns","newDefer","tuple","returned","resolve","reject","progress","notify","pipe","stateString","when","subordinate","resolveValues","remaining","updateFunc","values","progressValues","notifyWith","resolveWith","progressContexts","resolveContexts","readyList","readyWait","holdReady","hold","wait","body","setTimeout","triggerHandler","off","detach","removeEventListener","completed","detachEvent","event","readyState","frameElement","doScroll","doScrollCheck","strundefined","inlineBlockNeedsLayout","container","style","cssText","zoom","offsetWidth","deleteExpando","acceptData","noData","rbrace","rmultiDash","dataAttr","parseJSON","isEmptyDataObject","internalData","pvt","thisCache","internalKey","isNode","toJSON","internalRemoveData","cleanData","applet ","embed ","object ","hasData","removeData","_data","_removeData","queue","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","cssExpand","isHidden","el","css","access","chainable","emptyGet","raw","bulk","rcheckableType","fragment","createDocumentFragment","leadingWhitespace","tbody","htmlSerialize","html5Clone","cloneNode","outerHTML","appendChecked","noCloneChecked","checkClone","noCloneEvent","click","eventName","change","focusin","rformElems","rkeyEvent","rmouseEvent","rfocusMorph","rtypenamespace","returnTrue","returnFalse","safeActiveElement","err","types","events","t","handleObjIn","special","eventHandle","handleObj","handlers","namespaces","origType","elemData","handle","triggered","dispatch","delegateType","bindType","namespace","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","trigger","onlyHandlers","ontype","bubbleType","eventPath","Event","isTrigger","namespace_re","noBubble","parentWindow","isPropagationStopped","preventDefault","isDefaultPrevented","_default","fix","handlerQueue","delegateTarget","preDispatch","currentTarget","isImmediatePropagationStopped","stopPropagation","postDispatch","sel","prop","originalEvent","fixHook","fixHooks","mouseHooks","keyHooks","props","srcElement","metaKey","original","which","charCode","keyCode","eventDoc","fromElement","pageX","clientX","scrollLeft","clientLeft","pageY","clientY","scrollTop","clientTop","relatedTarget","toElement","load","blur","beforeunload","returnValue","simulate","bubble","isSimulated","defaultPrevented","timeStamp","cancelBubble","stopImmediatePropagation","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","submitBubbles","form","_submit_bubble","changeBubbles","propertyName","_just_changed","focusinBubbles","attaches","on","one","origFn","createSafeFragment","nodeNames","safeFrag","rinlinejQuery","rnoshimcache","rleadingWhitespace","rxhtmlTag","rtagName","rtbody","rhtml","rnoInnerhtml","rchecked","rscriptType","rscriptTypeMasked","rcleanScript","wrapMap","option","legend","area","param","thead","tr","col","td","safeFragment","fragmentDiv","optgroup","tfoot","colgroup","caption","th","getAll","found","fixDefaultChecked","defaultChecked","manipulationTarget","content","disableScript","restoreScript","setGlobalEval","refElements","cloneCopyEvent","dest","oldData","curData","fixCloneNodeIssues","defaultSelected","dataAndEvents","deepDataAndEvents","destElements","srcElements","inPage","buildFragment","scripts","selection","wrap","safe","nodes","createTextNode","append","domManip","prepend","insertBefore","before","after","keepData","html","replaceWith","replaceChild","hasScripts","set","iNoClone","_evalUrl","appendTo","prependTo","insertAfter","replaceAll","insert","iframe","elemdisplay","actualDisplay","display","getDefaultComputedStyle","defaultDisplay","write","close","shrinkWrapBlocksVal","shrinkWrapBlocks","width","rmargin","rnumnonpx","getStyles","curCSS","rposition","getComputedStyle","opener","computed","minWidth","maxWidth","getPropertyValue","currentStyle","left","rs","rsLeft","runtimeStyle","pixelLeft","addGetHookIf","conditionFn","hookFn","condition","pixelPositionVal","boxSizingReliableVal","reliableHiddenOffsetsVal","reliableMarginRightVal","opacity","cssFloat","backgroundClip","clearCloneStyle","boxSizing","MozBoxSizing","WebkitBoxSizing","reliableHiddenOffsets","computeStyleTests","boxSizingReliable","pixelPosition","reliableMarginRight","marginRight","offsetHeight","swap","ralpha","ropacity","rdisplayswap","rnumsplit","rrelNum","cssShow","position","visibility","cssNormalTransform","letterSpacing","fontWeight","cssPrefixes","vendorPropName","capName","origName","showHide","show","hidden","setPositiveNumber","subtract","augmentWidthOrHeight","extra","isBorderBox","styles","getWidthOrHeight","valueIsBorderBox","cssHooks","cssNumber","columnCount","fillOpacity","flexGrow","flexShrink","lineHeight","order","orphans","widows","zIndex","cssProps","float","$1","margin","padding","border","prefix","suffix","expand","expanded","parts","hide","toggle","Tween","easing","unit","propHooks","run","percent","eased","duration","step","tween","fx","linear","p","swing","cos","PI","fxNow","timerId","rfxtypes","rfxnum","rrun","animationPrefilters","defaultPrefilter","tweeners","*","createTween","scale","maxIterations","createFxNow","genFx","includeWidth","height","animation","collection","opts","oldfire","checkDisplay","anim","dataShow","unqueued","overflow","overflowX","overflowY","propFilter","specialEasing","Animation","properties","stopped","tick","currentTime","startTime","tweens","originalProperties","originalOptions","gotoEnd","rejectWith","timer","complete","tweener","prefilter","speed","opt","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","interval","setInterval","clearInterval","slow","fast","delay","time","timeout","clearTimeout","getSetAttribute","hrefNormalized","checkOn","optSelected","enctype","optDisabled","radioValue","rreturn","valHooks","optionSet","scrollHeight","nodeHook","boolHook","ruseDefault","getSetInput","removeAttr","nType","attrHooks","propName","attrNames","propFix","getter","setAttributeNode","createAttribute","coords","contenteditable","rfocusable","rclickable","removeProp","for","class","notxml","tabindex","parseInt","rclass","addClass","classes","clazz","finalValue","proceed","removeClass","toggleClass","stateVal","classNames","hasClass","hover","fnOver","fnOut","bind","unbind","delegate","undelegate","nonce","rquery","rvalidtokens","JSON","parse","requireNonComma","depth","str","comma","open","Function","parseXML","DOMParser","parseFromString","ActiveXObject","async","loadXML","ajaxLocParts","ajaxLocation","rhash","rts","rheaders","rlocalProtocol","rnoContent","rprotocol","rurl","prefilters","transports","allTypes","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","ajaxHandleResponses","s","responses","firstDataType","ct","finalDataType","mimeType","getResponseHeader","converters","ajaxConvert","response","isSuccess","conv2","current","conv","responseFields","dataFilter","active","lastModified","etag","url","isLocal","processData","contentType","accepts","json","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","cacheURL","responseHeadersString","timeoutTimer","fireGlobals","transport","responseHeaders","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getAllResponseHeaders","setRequestHeader","lname","overrideMimeType","code","status","abort","statusText","finalText","success","method","crossDomain","traditional","hasContent","ifModified","headers","beforeSend","send","nativeStatusText","modified","getJSON","getScript","throws","wrapAll","wrapInner","unwrap","visible","r20","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","v","encodeURIComponent","serialize","serializeArray","xhr","createStandardXHR","createActiveXHR","xhrId","xhrCallbacks","xhrSupported","cors","username","xhrFields","isAbort","onreadystatechange","responseText","XMLHttpRequest","script","text script","head","scriptCharset","charset","onload","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","keepScripts","parsed","_load","params","animated","getWindow","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","calculatePosition","curElem","using","win","box","getBoundingClientRect","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","defaultExtra","funcName","size","andSelf","define","amd","_jQuery","_$","$","noConflict"],"mappings":";CAcC,SAAUA,EAAQC,GAEK,gBAAXC,SAAiD,gBAAnBA,QAAOC,QAQhDD,OAAOC,QAAUH,EAAOI,SACvBH,EAASD,GAAQ,GACjB,SAAUK,GACT,IAAMA,EAAED,SACP,KAAM,IAAIE,OAAO,2CAElB,OAAOL,GAASI,IAGlBJ,EAASD,IAIS,mBAAXO,QAAyBA,OAASC,KAAM,SAAUD,EAAQE,GAQnE,GAAIC,MAEAC,EAAQD,EAAWC,MAEnBC,EAASF,EAAWE,OAEpBC,EAAOH,EAAWG,KAElBC,EAAUJ,EAAWI,QAErBC,KAEAC,EAAWD,EAAWC,SAEtBC,EAASF,EAAWG,eAEpBC,KAKHC,EAAU,SAGVC,EAAS,SAAUC,EAAUC,GAG5B,MAAO,IAAIF,GAAOG,GAAGC,KAAMH,EAAUC,IAKtCG,EAAQ,qCAGRC,EAAY,QACZC,EAAa,eAGbC,EAAa,SAAUC,EAAKC,GAC3B,MAAOA,GAAOC,cAGhBX,GAAOG,GAAKH,EAAOY,WAElBC,OAAQd,EAERe,YAAad,EAGbC,SAAU,GAGVc,OAAQ,EAERC,QAAS,WACR,MAAO1B,GAAM2B,KAAM9B,OAKpB+B,IAAK,SAAUC,GACd,MAAc,OAAPA,EAGE,EAANA,EAAUhC,KAAMgC,EAAMhC,KAAK4B,QAAW5B,KAAMgC,GAG9C7B,EAAM2B,KAAM9B,OAKdiC,UAAW,SAAUC,GAGpB,GAAIC,GAAMtB,EAAOuB,MAAOpC,KAAK2B,cAAeO,EAO5C,OAJAC,GAAIE,WAAarC,KACjBmC,EAAIpB,QAAUf,KAAKe,QAGZoB,GAMRG,KAAM,SAAUC,EAAUC,GACzB,MAAO3B,GAAOyB,KAAMtC,KAAMuC,EAAUC,IAGrCC,IAAK,SAAUF,GACd,MAAOvC,MAAKiC,UAAWpB,EAAO4B,IAAIzC,KAAM,SAAU0C,EAAMC,GACvD,MAAOJ,GAAST,KAAMY,EAAMC,EAAGD,OAIjCvC,MAAO,WACN,MAAOH,MAAKiC,UAAW9B,EAAMyC,MAAO5C,KAAM6C,aAG3CC,MAAO,WACN,MAAO9C,MAAK+C,GAAI,IAGjBC,KAAM,WACL,MAAOhD,MAAK+C,GAAI,KAGjBA,GAAI,SAAUJ,GACb,GAAIM,GAAMjD,KAAK4B,OACdsB,GAAKP,GAAU,EAAJA,EAAQM,EAAM,EAC1B,OAAOjD,MAAKiC,UAAWiB,GAAK,GAASD,EAAJC,GAAYlD,KAAKkD,SAGnDC,IAAK,WACJ,MAAOnD,MAAKqC,YAAcrC,KAAK2B,YAAY,OAK5CtB,KAAMA,EACN+C,KAAMlD,EAAWkD,KACjBC,OAAQnD,EAAWmD,QAGpBxC,EAAOyC,OAASzC,EAAOG,GAAGsC,OAAS,WAClC,GAAIC,GAAKC,EAAaC,EAAMC,EAAMC,EAASC,EAC1CC,EAAShB,UAAU,OACnBF,EAAI,EACJf,EAASiB,UAAUjB,OACnBkC,GAAO,CAsBR,KAnBuB,iBAAXD,KACXC,EAAOD,EAGPA,EAAShB,UAAWF,OACpBA,KAIsB,gBAAXkB,IAAwBhD,EAAOkD,WAAWF,KACrDA,MAIIlB,IAAMf,IACViC,EAAS7D,KACT2C,KAGWf,EAAJe,EAAYA,IAEnB,GAAmC,OAA7BgB,EAAUd,UAAWF,IAE1B,IAAMe,IAAQC,GACbJ,EAAMM,EAAQH,GACdD,EAAOE,EAASD,GAGXG,IAAWJ,IAKXK,GAAQL,IAAU5C,EAAOmD,cAAcP,KAAUD,EAAc3C,EAAOoD,QAAQR,MAC7ED,GACJA,GAAc,EACdI,EAAQL,GAAO1C,EAAOoD,QAAQV,GAAOA,MAGrCK,EAAQL,GAAO1C,EAAOmD,cAAcT,GAAOA,KAI5CM,EAAQH,GAAS7C,EAAOyC,OAAQQ,EAAMF,EAAOH,IAGzBS,SAATT,IACXI,EAAQH,GAASD,GAOrB,OAAOI,IAGRhD,EAAOyC,QAENa,QAAS,UAAavD,EAAUwD,KAAKC,UAAWC,QAAS,MAAO,IAGhEC,SAAS,EAETC,MAAO,SAAUC,GAChB,KAAM,IAAI3E,OAAO2E,IAGlBC,KAAM,aAKNX,WAAY,SAAUY,GACrB,MAA4B,aAArB9D,EAAO+D,KAAKD,IAGpBV,QAASY,MAAMZ,SAAW,SAAUU,GACnC,MAA4B,UAArB9D,EAAO+D,KAAKD,IAGpBG,SAAU,SAAUH,GAEnB,MAAc,OAAPA,GAAeA,GAAOA,EAAI5E,QAGlCgF,UAAW,SAAUJ,GAKpB,OAAQ9D,EAAOoD,QAASU,IAAUA,EAAMK,WAAYL,GAAQ,GAAM,GAGnEM,cAAe,SAAUN,GACxB,GAAIjB,EACJ,KAAMA,IAAQiB,GACb,OAAO,CAER,QAAO,GAGRX,cAAe,SAAUW,GACxB,GAAIO,EAKJ,KAAMP,GAA4B,WAArB9D,EAAO+D,KAAKD,IAAqBA,EAAIQ,UAAYtE,EAAOiE,SAAUH,GAC9E,OAAO,CAGR,KAEC,GAAKA,EAAIhD,cACPlB,EAAOqB,KAAK6C,EAAK,iBACjBlE,EAAOqB,KAAK6C,EAAIhD,YAAYF,UAAW,iBACxC,OAAO,EAEP,MAAQ2D,GAET,OAAO,EAKR,GAAKzE,EAAQ0E,QACZ,IAAMH,IAAOP,GACZ,MAAOlE,GAAOqB,KAAM6C,EAAKO,EAM3B,KAAMA,IAAOP,IAEb,MAAeT,UAARgB,GAAqBzE,EAAOqB,KAAM6C,EAAKO,IAG/CN,KAAM,SAAUD,GACf,MAAY,OAAPA,EACGA,EAAM,GAEQ,gBAARA,IAAmC,kBAARA,GACxCpE,EAAYC,EAASsB,KAAK6C,KAAU,eAC7BA,IAMTW,WAAY,SAAUC,GAChBA,GAAQ1E,EAAO2E,KAAMD,KAIvBxF,EAAO0F,YAAc,SAAUF,GAChCxF,EAAe,KAAE+B,KAAM/B,EAAQwF,KAC3BA,IAMPG,UAAW,SAAUC,GACpB,MAAOA,GAAOrB,QAASnD,EAAW,OAAQmD,QAASlD,EAAYC,IAGhEuE,SAAU,SAAUlD,EAAMgB,GACzB,MAAOhB,GAAKkD,UAAYlD,EAAKkD,SAASC,gBAAkBnC,EAAKmC,eAI9DvD,KAAM,SAAUqC,EAAKpC,EAAUC,GAC9B,GAAIsD,GACHnD,EAAI,EACJf,EAAS+C,EAAI/C,OACbqC,EAAU8B,EAAapB,EAExB,IAAKnC,GACJ,GAAKyB,GACJ,KAAYrC,EAAJe,EAAYA,IAGnB,GAFAmD,EAAQvD,EAASK,MAAO+B,EAAKhC,GAAKH,GAE7BsD,KAAU,EACd,UAIF,KAAMnD,IAAKgC,GAGV,GAFAmB,EAAQvD,EAASK,MAAO+B,EAAKhC,GAAKH,GAE7BsD,KAAU,EACd,UAOH,IAAK7B,GACJ,KAAYrC,EAAJe,EAAYA,IAGnB,GAFAmD,EAAQvD,EAAST,KAAM6C,EAAKhC,GAAKA,EAAGgC,EAAKhC,IAEpCmD,KAAU,EACd,UAIF,KAAMnD,IAAKgC,GAGV,GAFAmB,EAAQvD,EAAST,KAAM6C,EAAKhC,GAAKA,EAAGgC,EAAKhC,IAEpCmD,KAAU,EACd,KAMJ,OAAOnB,IAIRa,KAAM,SAAUQ,GACf,MAAe,OAARA,EACN,IACEA,EAAO,IAAK1B,QAASpD,EAAO,KAIhC+E,UAAW,SAAUC,EAAKC,GACzB,GAAIhE,GAAMgE,KAaV,OAXY,OAAPD,IACCH,EAAaK,OAAOF,IACxBrF,EAAOuB,MAAOD,EACE,gBAAR+D,IACLA,GAAQA,GAGX7F,EAAKyB,KAAMK,EAAK+D,IAIX/D,GAGRkE,QAAS,SAAU3D,EAAMwD,EAAKvD,GAC7B,GAAIM,EAEJ,IAAKiD,EAAM,CACV,GAAK5F,EACJ,MAAOA,GAAQwB,KAAMoE,EAAKxD,EAAMC,EAMjC,KAHAM,EAAMiD,EAAItE,OACVe,EAAIA,EAAQ,EAAJA,EAAQyB,KAAKkC,IAAK,EAAGrD,EAAMN,GAAMA,EAAI,EAEjCM,EAAJN,EAASA,IAEhB,GAAKA,IAAKuD,IAAOA,EAAKvD,KAAQD,EAC7B,MAAOC,GAKV,MAAO,IAGRP,MAAO,SAAUU,EAAOyD,GACvB,GAAItD,IAAOsD,EAAO3E,OACjBsB,EAAI,EACJP,EAAIG,EAAMlB,MAEX,OAAYqB,EAAJC,EACPJ,EAAOH,KAAQ4D,EAAQrD,IAKxB,IAAKD,IAAQA,EACZ,MAAsBiB,SAAdqC,EAAOrD,GACdJ,EAAOH,KAAQ4D,EAAQrD,IAMzB,OAFAJ,GAAMlB,OAASe,EAERG,GAGR0D,KAAM,SAAUtE,EAAOK,EAAUkE,GAShC,IARA,GAAIC,GACHC,KACAhE,EAAI,EACJf,EAASM,EAAMN,OACfgF,GAAkBH,EAIP7E,EAAJe,EAAYA,IACnB+D,GAAmBnE,EAAUL,EAAOS,GAAKA,GACpC+D,IAAoBE,GACxBD,EAAQtG,KAAM6B,EAAOS,GAIvB,OAAOgE,IAIRlE,IAAK,SAAUP,EAAOK,EAAUsE,GAC/B,GAAIf,GACHnD,EAAI,EACJf,EAASM,EAAMN,OACfqC,EAAU8B,EAAa7D,GACvBC,IAGD,IAAK8B,EACJ,KAAYrC,EAAJe,EAAYA,IACnBmD,EAAQvD,EAAUL,EAAOS,GAAKA,EAAGkE,GAEnB,MAATf,GACJ3D,EAAI9B,KAAMyF,OAMZ,KAAMnD,IAAKT,GACV4D,EAAQvD,EAAUL,EAAOS,GAAKA,EAAGkE,GAEnB,MAATf,GACJ3D,EAAI9B,KAAMyF,EAMb,OAAO1F,GAAOwC,SAAWT,IAI1B2E,KAAM,EAINC,MAAO,SAAU/F,EAAID,GACpB,GAAIyB,GAAMuE,EAAOC,CAUjB,OARwB,gBAAZjG,KACXiG,EAAMhG,EAAID,GACVA,EAAUC,EACVA,EAAKgG,GAKAnG,EAAOkD,WAAY/C,IAKzBwB,EAAOrC,EAAM2B,KAAMe,UAAW,GAC9BkE,EAAQ,WACP,MAAO/F,GAAG4B,MAAO7B,GAAWf,KAAMwC,EAAKpC,OAAQD,EAAM2B,KAAMe,cAI5DkE,EAAMD,KAAO9F,EAAG8F,KAAO9F,EAAG8F,MAAQjG,EAAOiG,OAElCC,GAZC7C,QAeT+C,IAAK,WACJ,OAAQ,GAAMC,OAKfvG,QAASA,IAIVE,EAAOyB,KAAK,gEAAgE6E,MAAM,KAAM,SAASxE,EAAGe,GACnGnD,EAAY,WAAamD,EAAO,KAAQA,EAAKmC,eAG9C,SAASE,GAAapB,GAMrB,GAAI/C,GAAS,UAAY+C,IAAOA,EAAI/C,OACnCgD,EAAO/D,EAAO+D,KAAMD,EAErB,OAAc,aAATC,GAAuB/D,EAAOiE,SAAUH,IACrC,EAGc,IAAjBA,EAAIQ,UAAkBvD,GACnB,EAGQ,UAATgD,GAA+B,IAAXhD,GACR,gBAAXA,IAAuBA,EAAS,GAAOA,EAAS,IAAO+C,GAEhE,GAAIyC,GAWJ,SAAWrH,GAEX,GAAI4C,GACHhC,EACA0G,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAGAC,EACAlI,EACAmI,EACAC,EACAC,EACAC,EACAvB,EACAwB,EAGAhE,EAAU,SAAW,EAAI,GAAI+C,MAC7BkB,EAAerI,EAAOH,SACtByI,EAAU,EACVC,EAAO,EACPC,EAAaC,KACbC,EAAaD,KACbE,EAAgBF,KAChBG,EAAY,SAAUC,EAAGC,GAIxB,MAHKD,KAAMC,IACVhB,GAAe,GAET,GAIRiB,EAAe,GAAK,GAGpBrI,KAAcC,eACdwF,KACA6C,EAAM7C,EAAI6C,IACVC,EAAc9C,EAAI7F,KAClBA,EAAO6F,EAAI7F,KACXF,EAAQ+F,EAAI/F,MAGZG,EAAU,SAAU2I,EAAMvG,GAGzB,IAFA,GAAIC,GAAI,EACPM,EAAMgG,EAAKrH,OACAqB,EAAJN,EAASA,IAChB,GAAKsG,EAAKtG,KAAOD,EAChB,MAAOC,EAGT,OAAO,IAGRuG,EAAW,6HAKXC,EAAa,sBAEbC,EAAoB,mCAKpBC,EAAaD,EAAkB9E,QAAS,IAAK,MAG7CgF,EAAa,MAAQH,EAAa,KAAOC,EAAoB,OAASD,EAErE,gBAAkBA,EAElB,2DAA6DE,EAAa,OAASF,EACnF,OAEDI,EAAU,KAAOH,EAAoB,wFAKPE,EAAa,eAM3CE,EAAc,GAAIC,QAAQN,EAAa,IAAK,KAC5CjI,EAAQ,GAAIuI,QAAQ,IAAMN,EAAa,8BAAgCA,EAAa,KAAM,KAE1FO,EAAS,GAAID,QAAQ,IAAMN,EAAa,KAAOA,EAAa,KAC5DQ,EAAe,GAAIF,QAAQ,IAAMN,EAAa,WAAaA,EAAa,IAAMA,EAAa,KAE3FS,EAAmB,GAAIH,QAAQ,IAAMN,EAAa,iBAAmBA,EAAa,OAAQ,KAE1FU,EAAU,GAAIJ,QAAQF,GACtBO,EAAc,GAAIL,QAAQ,IAAMJ,EAAa,KAE7CU,GACCC,GAAM,GAAIP,QAAQ,MAAQL,EAAoB,KAC9Ca,MAAS,GAAIR,QAAQ,QAAUL,EAAoB,KACnDc,IAAO,GAAIT,QAAQ,KAAOL,EAAkB9E,QAAS,IAAK,MAAS,KACnE6F,KAAQ,GAAIV,QAAQ,IAAMH,GAC1Bc,OAAU,GAAIX,QAAQ,IAAMF,GAC5Bc,MAAS,GAAIZ,QAAQ,yDAA2DN,EAC/E,+BAAiCA,EAAa,cAAgBA,EAC9D,aAAeA,EAAa,SAAU,KACvCmB,KAAQ,GAAIb,QAAQ,OAASP,EAAW,KAAM,KAG9CqB,aAAgB,GAAId,QAAQ,IAAMN,EAAa,mDAC9CA,EAAa,mBAAqBA,EAAa,mBAAoB,MAGrEqB,EAAU,sCACVC,EAAU,SAEVC,EAAU,yBAGVC,EAAa,mCAEbC,GAAW,OACXC,GAAU,QAGVC,GAAY,GAAIrB,QAAQ,qBAAuBN,EAAa,MAAQA,EAAa,OAAQ,MACzF4B,GAAY,SAAUC,EAAGC,EAASC,GACjC,GAAIC,GAAO,KAAOF,EAAU,KAI5B,OAAOE,KAASA,GAAQD,EACvBD,EACO,EAAPE,EAECC,OAAOC,aAAcF,EAAO,OAE5BC,OAAOC,aAAcF,GAAQ,GAAK,MAAe,KAAPA,EAAe,QAO5DG,GAAgB,WACfxD,IAIF,KACCzH,EAAKuC,MACHsD,EAAM/F,EAAM2B,KAAMsG,EAAamD,YAChCnD,EAAamD,YAIdrF,EAAKkC,EAAamD,WAAW3J,QAASuD,SACrC,MAAQC,IACT/E,GAASuC,MAAOsD,EAAItE,OAGnB,SAAUiC,EAAQ2H,GACjBxC,EAAYpG,MAAOiB,EAAQ1D,EAAM2B,KAAK0J,KAKvC,SAAU3H,EAAQ2H,GACjB,GAAItI,GAAIW,EAAOjC,OACde,EAAI,CAEL,OAASkB,EAAOX,KAAOsI,EAAI7I,MAC3BkB,EAAOjC,OAASsB,EAAI,IAKvB,QAASkE,IAAQtG,EAAUC,EAASoF,EAASsF,GAC5C,GAAIC,GAAOhJ,EAAMiJ,EAAGxG,EAEnBxC,EAAGiJ,EAAQC,EAAKC,EAAKC,EAAYC,CAUlC,KAROjL,EAAUA,EAAQkL,eAAiBlL,EAAUqH,KAAmBxI,GACtEkI,EAAa/G,GAGdA,EAAUA,GAAWnB,EACrBuG,EAAUA,MACVhB,EAAWpE,EAAQoE,SAEM,gBAAbrE,KAA0BA,GACxB,IAAbqE,GAA+B,IAAbA,GAA+B,KAAbA,EAEpC,MAAOgB,EAGR,KAAMsF,GAAQzD,EAAiB,CAG9B,GAAkB,KAAb7C,IAAoBuG,EAAQf,EAAWuB,KAAMpL,IAEjD,GAAM6K,EAAID,EAAM,IACf,GAAkB,IAAbvG,EAAiB,CAIrB,GAHAzC,EAAO3B,EAAQoL,eAAgBR,IAG1BjJ,IAAQA,EAAK0J,WAQjB,MAAOjG,EALP,IAAKzD,EAAK2J,KAAOV,EAEhB,MADAxF,GAAQ9F,KAAMqC,GACPyD,MAOT,IAAKpF,EAAQkL,gBAAkBvJ,EAAO3B,EAAQkL,cAAcE,eAAgBR,KAC3ExD,EAAUpH,EAAS2B,IAAUA,EAAK2J,KAAOV,EAEzC,MADAxF,GAAQ9F,KAAMqC,GACPyD,MAKH,CAAA,GAAKuF,EAAM,GAEjB,MADArL,GAAKuC,MAAOuD,EAASpF,EAAQuL,qBAAsBxL,IAC5CqF,CAGD,KAAMwF,EAAID,EAAM,KAAO/K,EAAQ4L,uBAErC,MADAlM,GAAKuC,MAAOuD,EAASpF,EAAQwL,uBAAwBZ,IAC9CxF,EAKT,GAAKxF,EAAQ6L,OAASvE,IAAcA,EAAUwE,KAAM3L,IAAc,CASjE,GARAgL,EAAMD,EAAM1H,EACZ4H,EAAahL,EACbiL,EAA2B,IAAb7G,GAAkBrE,EAMd,IAAbqE,GAAqD,WAAnCpE,EAAQ6E,SAASC,cAA6B,CACpE+F,EAASpE,EAAU1G,IAEb+K,EAAM9K,EAAQ2L,aAAa,OAChCZ,EAAMD,EAAIvH,QAASuG,GAAS,QAE5B9J,EAAQ4L,aAAc,KAAMb,GAE7BA,EAAM,QAAUA,EAAM,MAEtBnJ,EAAIiJ,EAAOhK,MACX,OAAQe,IACPiJ,EAAOjJ,GAAKmJ,EAAMc,GAAYhB,EAAOjJ,GAEtCoJ,GAAanB,GAAS6B,KAAM3L,IAAc+L,GAAa9L,EAAQqL,aAAgBrL,EAC/EiL,EAAcJ,EAAOkB,KAAK,KAG3B,GAAKd,EACJ,IAIC,MAHA3L,GAAKuC,MAAOuD,EACX4F,EAAWgB,iBAAkBf,IAEvB7F,EACN,MAAM6G,IACN,QACKnB,GACL9K,EAAQkM,gBAAgB,QAQ7B,MAAOvF,GAAQ5G,EAASwD,QAASpD,EAAO,MAAQH,EAASoF,EAASsF,GASnE,QAASjD,MACR,GAAI0E,KAEJ,SAASC,GAAOjI,EAAKY,GAMpB,MAJKoH,GAAK7M,KAAM6E,EAAM,KAAQmC,EAAK+F,mBAE3BD,GAAOD,EAAKG,SAEZF,EAAOjI,EAAM,KAAQY,EAE9B,MAAOqH,GAOR,QAASG,IAActM,GAEtB,MADAA,GAAImD,IAAY,EACTnD,EAOR,QAASuM,IAAQvM,GAChB,GAAIwM,GAAM5N,EAAS6N,cAAc,MAEjC,KACC,QAASzM,EAAIwM,GACZ,MAAOpI,GACR,OAAO,EACN,QAEIoI,EAAIpB,YACRoB,EAAIpB,WAAWsB,YAAaF,GAG7BA,EAAM,MASR,QAASG,IAAWC,EAAOC,GAC1B,GAAI3H,GAAM0H,EAAMzG,MAAM,KACrBxE,EAAIiL,EAAMhM,MAEX,OAAQe,IACP0E,EAAKyG,WAAY5H,EAAIvD,IAAOkL,EAU9B,QAASE,IAAcnF,EAAGC,GACzB,GAAImF,GAAMnF,GAAKD,EACdqF,EAAOD,GAAsB,IAAfpF,EAAEzD,UAAiC,IAAf0D,EAAE1D,YAChC0D,EAAEqF,aAAepF,KACjBF,EAAEsF,aAAepF,EAGtB,IAAKmF,EACJ,MAAOA,EAIR,IAAKD,EACJ,MAASA,EAAMA,EAAIG,YAClB,GAAKH,IAAQnF,EACZ,MAAO,EAKV,OAAOD,GAAI,EAAI,GAOhB,QAASwF,IAAmBxJ,GAC3B,MAAO,UAAUlC,GAChB,GAAIgB,GAAOhB,EAAKkD,SAASC,aACzB,OAAgB,UAATnC,GAAoBhB,EAAKkC,OAASA,GAQ3C,QAASyJ,IAAoBzJ,GAC5B,MAAO,UAAUlC,GAChB,GAAIgB,GAAOhB,EAAKkD,SAASC,aACzB,QAAiB,UAATnC,GAA6B,WAATA,IAAsBhB,EAAKkC,OAASA,GAQlE,QAAS0J,IAAwBtN,GAChC,MAAOsM,IAAa,SAAUiB,GAE7B,MADAA,IAAYA,EACLjB,GAAa,SAAU7B,EAAM9E,GACnC,GAAIzD,GACHsL,EAAexN,KAAQyK,EAAK7J,OAAQ2M,GACpC5L,EAAI6L,EAAa5M,MAGlB,OAAQe,IACF8I,EAAOvI,EAAIsL,EAAa7L,MAC5B8I,EAAKvI,KAAOyD,EAAQzD,GAAKuI,EAAKvI,SAYnC,QAAS2J,IAAa9L,GACrB,MAAOA,IAAmD,mBAAjCA,GAAQuL,sBAAwCvL,EAI1EJ,EAAUyG,GAAOzG,WAOjB4G,EAAQH,GAAOG,MAAQ,SAAU7E,GAGhC,GAAI+L,GAAkB/L,IAASA,EAAKuJ,eAAiBvJ,GAAM+L,eAC3D,OAAOA,GAA+C,SAA7BA,EAAgB7I,UAAsB,GAQhEkC,EAAcV,GAAOU,YAAc,SAAU4G,GAC5C,GAAIC,GAAYC,EACfC,EAAMH,EAAOA,EAAKzC,eAAiByC,EAAOtG,CAG3C,OAAKyG,KAAQjP,GAA6B,IAAjBiP,EAAI1J,UAAmB0J,EAAIJ,iBAKpD7O,EAAWiP,EACX9G,EAAU8G,EAAIJ,gBACdG,EAASC,EAAIC,YAMRF,GAAUA,IAAWA,EAAOG,MAE3BH,EAAOI,iBACXJ,EAAOI,iBAAkB,SAAU1D,IAAe,GACvCsD,EAAOK,aAClBL,EAAOK,YAAa,WAAY3D,KAMlCtD,GAAkBT,EAAOsH,GAQzBlO,EAAQ2I,WAAaiE,GAAO,SAAUC,GAErC,MADAA,GAAI0B,UAAY,KACR1B,EAAId,aAAa,eAO1B/L,EAAQ2L,qBAAuBiB,GAAO,SAAUC,GAE/C,MADAA,GAAI2B,YAAaN,EAAIO,cAAc,MAC3B5B,EAAIlB,qBAAqB,KAAK1K,SAIvCjB,EAAQ4L,uBAAyB7B,EAAQ+B,KAAMoC,EAAItC,wBAMnD5L,EAAQ0O,QAAU9B,GAAO,SAAUC,GAElC,MADAzF,GAAQoH,YAAa3B,GAAMnB,GAAKlI,GACxB0K,EAAIS,oBAAsBT,EAAIS,kBAAmBnL,GAAUvC,SAI/DjB,EAAQ0O,SACZhI,EAAKkI,KAAS,GAAI,SAAUlD,EAAItL,GAC/B,GAAuC,mBAA3BA,GAAQoL,gBAAkCnE,EAAiB,CACtE,GAAI2D,GAAI5K,EAAQoL,eAAgBE,EAGhC,OAAOV,IAAKA,EAAES,YAAeT,QAG/BtE,EAAKmI,OAAW,GAAI,SAAUnD,GAC7B,GAAIoD,GAASpD,EAAG/H,QAASwG,GAAWC,GACpC,OAAO,UAAUrI,GAChB,MAAOA,GAAKgK,aAAa,QAAU+C,YAM9BpI,GAAKkI,KAAS,GAErBlI,EAAKmI,OAAW,GAAK,SAAUnD,GAC9B,GAAIoD,GAASpD,EAAG/H,QAASwG,GAAWC,GACpC,OAAO,UAAUrI,GAChB,GAAIgM,GAAwC,mBAA1BhM,GAAKgN,kBAAoChN,EAAKgN,iBAAiB,KACjF,OAAOhB,IAAQA,EAAK5I,QAAU2J,KAMjCpI,EAAKkI,KAAU,IAAI5O,EAAQ2L,qBAC1B,SAAUqD,EAAK5O,GACd,MAA6C,mBAAjCA,GAAQuL,qBACZvL,EAAQuL,qBAAsBqD,GAG1BhP,EAAQ6L,IACZzL,EAAQgM,iBAAkB4C,GAD3B,QAKR,SAAUA,EAAK5O,GACd,GAAI2B,GACHsE,KACArE,EAAI,EAEJwD,EAAUpF,EAAQuL,qBAAsBqD,EAGzC,IAAa,MAARA,EAAc,CAClB,MAASjN,EAAOyD,EAAQxD,KACA,IAAlBD,EAAKyC,UACT6B,EAAI3G,KAAMqC,EAIZ,OAAOsE,GAER,MAAOb,IAITkB,EAAKkI,KAAY,MAAI5O,EAAQ4L,wBAA0B,SAAU2C,EAAWnO,GAC3E,MAAKiH,GACGjH,EAAQwL,uBAAwB2C,GADxC,QAWDhH,KAOAD,MAEMtH,EAAQ6L,IAAM9B,EAAQ+B,KAAMoC,EAAI9B,qBAGrCQ,GAAO,SAAUC,GAMhBzF,EAAQoH,YAAa3B,GAAMoC,UAAY,UAAYzL,EAAU,qBAC3CA,EAAU,iEAOvBqJ,EAAIT,iBAAiB,wBAAwBnL,QACjDqG,EAAU5H,KAAM,SAAW8I,EAAa,gBAKnCqE,EAAIT,iBAAiB,cAAcnL,QACxCqG,EAAU5H,KAAM,MAAQ8I,EAAa,aAAeD,EAAW,KAI1DsE,EAAIT,iBAAkB,QAAU5I,EAAU,MAAOvC,QACtDqG,EAAU5H,KAAK,MAMVmN,EAAIT,iBAAiB,YAAYnL,QACtCqG,EAAU5H,KAAK,YAMVmN,EAAIT,iBAAkB,KAAO5I,EAAU,MAAOvC,QACnDqG,EAAU5H,KAAK,cAIjBkN,GAAO,SAAUC,GAGhB,GAAIqC,GAAQhB,EAAIpB,cAAc,QAC9BoC,GAAMlD,aAAc,OAAQ,UAC5Ba,EAAI2B,YAAaU,GAAQlD,aAAc,OAAQ,KAI1Ca,EAAIT,iBAAiB,YAAYnL,QACrCqG,EAAU5H,KAAM,OAAS8I,EAAa,eAKjCqE,EAAIT,iBAAiB,YAAYnL,QACtCqG,EAAU5H,KAAM,WAAY,aAI7BmN,EAAIT,iBAAiB,QACrB9E,EAAU5H,KAAK,YAIXM,EAAQmP,gBAAkBpF,EAAQ+B,KAAO9F,EAAUoB,EAAQpB,SAChEoB,EAAQgI,uBACRhI,EAAQiI,oBACRjI,EAAQkI,kBACRlI,EAAQmI,qBAER3C,GAAO,SAAUC,GAGhB7M,EAAQwP,kBAAoBxJ,EAAQ7E,KAAM0L,EAAK,OAI/C7G,EAAQ7E,KAAM0L,EAAK,aACnBtF,EAAc7H,KAAM,KAAMkJ,KAI5BtB,EAAYA,EAAUrG,QAAU,GAAI6H,QAAQxB,EAAU6E,KAAK,MAC3D5E,EAAgBA,EAActG,QAAU,GAAI6H,QAAQvB,EAAc4E,KAAK,MAIvE6B,EAAajE,EAAQ+B,KAAM1E,EAAQqI,yBAKnCjI,EAAWwG,GAAcjE,EAAQ+B,KAAM1E,EAAQI,UAC9C,SAAUS,EAAGC,GACZ,GAAIwH,GAAuB,IAAfzH,EAAEzD,SAAiByD,EAAE6F,gBAAkB7F,EAClD0H,EAAMzH,GAAKA,EAAEuD,UACd,OAAOxD,KAAM0H,MAAWA,GAAwB,IAAjBA,EAAInL,YAClCkL,EAAMlI,SACLkI,EAAMlI,SAAUmI,GAChB1H,EAAEwH,yBAA8D,GAAnCxH,EAAEwH,wBAAyBE,MAG3D,SAAU1H,EAAGC,GACZ,GAAKA,EACJ,MAASA,EAAIA,EAAEuD,WACd,GAAKvD,IAAMD,EACV,OAAO,CAIV,QAAO,GAOTD,EAAYgG,EACZ,SAAU/F,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,MADAhB,IAAe,EACR,CAIR,IAAI0I,IAAW3H,EAAEwH,yBAA2BvH,EAAEuH,uBAC9C,OAAKG,GACGA,GAIRA,GAAY3H,EAAEqD,eAAiBrD,MAAUC,EAAEoD,eAAiBpD,GAC3DD,EAAEwH,wBAAyBvH,GAG3B,EAGc,EAAV0H,IACF5P,EAAQ6P,cAAgB3H,EAAEuH,wBAAyBxH,KAAQ2H,EAGxD3H,IAAMiG,GAAOjG,EAAEqD,gBAAkB7D,GAAgBD,EAASC,EAAcQ,GACrE,GAEHC,IAAMgG,GAAOhG,EAAEoD,gBAAkB7D,GAAgBD,EAASC,EAAcS,GACrE,EAIDjB,EACJtH,EAASsH,EAAWgB,GAAMtI,EAASsH,EAAWiB,GAChD,EAGe,EAAV0H,EAAc,GAAK,IAE3B,SAAU3H,EAAGC,GAEZ,GAAKD,IAAMC,EAEV,MADAhB,IAAe,EACR,CAGR,IAAImG,GACHrL,EAAI,EACJ8N,EAAM7H,EAAEwD,WACRkE,EAAMzH,EAAEuD,WACRsE,GAAO9H,GACP+H,GAAO9H,EAGR,KAAM4H,IAAQH,EACb,MAAO1H,KAAMiG,EAAM,GAClBhG,IAAMgG,EAAM,EACZ4B,EAAM,GACNH,EAAM,EACN1I,EACEtH,EAASsH,EAAWgB,GAAMtI,EAASsH,EAAWiB,GAChD,CAGK,IAAK4H,IAAQH,EACnB,MAAOvC,IAAcnF,EAAGC,EAIzBmF,GAAMpF,CACN,OAASoF,EAAMA,EAAI5B,WAClBsE,EAAGE,QAAS5C,EAEbA,GAAMnF,CACN,OAASmF,EAAMA,EAAI5B,WAClBuE,EAAGC,QAAS5C,EAIb,OAAQ0C,EAAG/N,KAAOgO,EAAGhO,GACpBA,GAGD,OAAOA,GAENoL,GAAc2C,EAAG/N,GAAIgO,EAAGhO,IAGxB+N,EAAG/N,KAAOyF,EAAe,GACzBuI,EAAGhO,KAAOyF,EAAe,EACzB,GAGKyG,GA1WCjP,GA6WTwH,GAAOT,QAAU,SAAUkK,EAAMC,GAChC,MAAO1J,IAAQyJ,EAAM,KAAM,KAAMC,IAGlC1J,GAAO0I,gBAAkB,SAAUpN,EAAMmO,GASxC,IAPOnO,EAAKuJ,eAAiBvJ,KAAW9C,GACvCkI,EAAapF,GAIdmO,EAAOA,EAAKvM,QAASsF,EAAkB,aAElCjJ,EAAQmP,kBAAmB9H,GAC5BE,GAAkBA,EAAcuE,KAAMoE,IACtC5I,GAAkBA,EAAUwE,KAAMoE,IAErC,IACC,GAAI1O,GAAMwE,EAAQ7E,KAAMY,EAAMmO,EAG9B,IAAK1O,GAAOxB,EAAQwP,mBAGlBzN,EAAK9C,UAAuC,KAA3B8C,EAAK9C,SAASuF,SAChC,MAAOhD,GAEP,MAAOiD,IAGV,MAAOgC,IAAQyJ,EAAMjR,EAAU,MAAQ8C,IAASd,OAAS,GAG1DwF,GAAOe,SAAW,SAAUpH,EAAS2B,GAKpC,OAHO3B,EAAQkL,eAAiBlL,KAAcnB,GAC7CkI,EAAa/G,GAEPoH,EAAUpH,EAAS2B,IAG3B0E,GAAO2J,KAAO,SAAUrO,EAAMgB,IAEtBhB,EAAKuJ,eAAiBvJ,KAAW9C,GACvCkI,EAAapF,EAGd,IAAI1B,GAAKqG,EAAKyG,WAAYpK,EAAKmC,eAE9BmL,EAAMhQ,GAAMP,EAAOqB,KAAMuF,EAAKyG,WAAYpK,EAAKmC,eAC9C7E,EAAI0B,EAAMgB,GAAOsE,GACjB9D,MAEF,OAAeA,UAAR8M,EACNA,EACArQ,EAAQ2I,aAAetB,EACtBtF,EAAKgK,aAAchJ,IAClBsN,EAAMtO,EAAKgN,iBAAiBhM,KAAUsN,EAAIC,UAC1CD,EAAIlL,MACJ,MAGJsB,GAAO5C,MAAQ,SAAUC,GACxB,KAAM,IAAI3E,OAAO,0CAA4C2E,IAO9D2C,GAAO8J,WAAa,SAAU/K,GAC7B,GAAIzD,GACHyO,KACAjO,EAAI,EACJP,EAAI,CAOL,IAJAkF,GAAgBlH,EAAQyQ,iBACxBxJ,GAAajH,EAAQ0Q,YAAclL,EAAQhG,MAAO,GAClDgG,EAAQ/C,KAAMuF,GAETd,EAAe,CACnB,MAASnF,EAAOyD,EAAQxD,KAClBD,IAASyD,EAASxD,KACtBO,EAAIiO,EAAW9Q,KAAMsC,GAGvB,OAAQO,IACPiD,EAAQ9C,OAAQ8N,EAAYjO,GAAK,GAQnC,MAFA0E,GAAY,KAELzB,GAORmB,EAAUF,GAAOE,QAAU,SAAU5E,GACpC,GAAIgM,GACHvM,EAAM,GACNQ,EAAI,EACJwC,EAAWzC,EAAKyC,QAEjB,IAAMA,GAMC,GAAkB,IAAbA,GAA+B,IAAbA,GAA+B,KAAbA,EAAkB,CAGjE,GAAiC,gBAArBzC,GAAK4O,YAChB,MAAO5O,GAAK4O,WAGZ,KAAM5O,EAAOA,EAAK6O,WAAY7O,EAAMA,EAAOA,EAAKyL,YAC/ChM,GAAOmF,EAAS5E,OAGZ,IAAkB,IAAbyC,GAA+B,IAAbA,EAC7B,MAAOzC,GAAK8O,cAhBZ,OAAS9C,EAAOhM,EAAKC,KAEpBR,GAAOmF,EAASoH,EAkBlB,OAAOvM,IAGRkF,EAAOD,GAAOqK,WAGbrE,YAAa,GAEbsE,aAAcpE,GAEd5B,MAAO3B,EAEP+D,cAEAyB,QAEAoC,UACCC,KAAOC,IAAK,aAAc/O,OAAO,GACjCgP,KAAOD,IAAK,cACZE,KAAOF,IAAK,kBAAmB/O,OAAO,GACtCkP,KAAOH,IAAK,oBAGbI,WACC9H,KAAQ,SAAUuB,GAUjB,MATAA,GAAM,GAAKA,EAAM,GAAGpH,QAASwG,GAAWC,IAGxCW,EAAM,IAAOA,EAAM,IAAMA,EAAM,IAAMA,EAAM,IAAM,IAAKpH,QAASwG,GAAWC,IAExD,OAAbW,EAAM,KACVA,EAAM,GAAK,IAAMA,EAAM,GAAK,KAGtBA,EAAMvL,MAAO,EAAG,IAGxBkK,MAAS,SAAUqB,GA6BlB,MAlBAA,GAAM,GAAKA,EAAM,GAAG7F,cAEY,QAA3B6F,EAAM,GAAGvL,MAAO,EAAG,IAEjBuL,EAAM,IACXtE,GAAO5C,MAAOkH,EAAM,IAKrBA,EAAM,KAAQA,EAAM,GAAKA,EAAM,IAAMA,EAAM,IAAM,GAAK,GAAmB,SAAbA,EAAM,IAA8B,QAAbA,EAAM,KACzFA,EAAM,KAAUA,EAAM,GAAKA,EAAM,IAAqB,QAAbA,EAAM,KAGpCA,EAAM,IACjBtE,GAAO5C,MAAOkH,EAAM,IAGdA,GAGRtB,OAAU,SAAUsB,GACnB,GAAIwG,GACHC,GAAYzG,EAAM,IAAMA,EAAM,EAE/B,OAAK3B,GAAiB,MAAE0C,KAAMf,EAAM,IAC5B,MAIHA,EAAM,GACVA,EAAM,GAAKA,EAAM,IAAMA,EAAM,IAAM,GAGxByG,GAAYtI,EAAQ4C,KAAM0F,KAEpCD,EAAS1K,EAAU2K,GAAU,MAE7BD,EAASC,EAAS7R,QAAS,IAAK6R,EAASvQ,OAASsQ,GAAWC,EAASvQ,UAGvE8J,EAAM,GAAKA,EAAM,GAAGvL,MAAO,EAAG+R,GAC9BxG,EAAM,GAAKyG,EAAShS,MAAO,EAAG+R,IAIxBxG,EAAMvL,MAAO,EAAG,MAIzBqP,QAECtF,IAAO,SAAUkI,GAChB,GAAIxM,GAAWwM,EAAiB9N,QAASwG,GAAWC,IAAYlF,aAChE,OAA4B,MAArBuM,EACN,WAAa,OAAO,GACpB,SAAU1P,GACT,MAAOA,GAAKkD,UAAYlD,EAAKkD,SAASC,gBAAkBD,IAI3DqE,MAAS,SAAUiF,GAClB,GAAImD,GAAU9J,EAAY2G,EAAY,IAEtC,OAAOmD,KACLA,EAAU,GAAI5I,QAAQ,MAAQN,EAAa,IAAM+F,EAAY,IAAM/F,EAAa,SACjFZ,EAAY2G,EAAW,SAAUxM,GAChC,MAAO2P,GAAQ5F,KAAgC,gBAAnB/J,GAAKwM,WAA0BxM,EAAKwM,WAA0C,mBAAtBxM,GAAKgK,cAAgChK,EAAKgK,aAAa,UAAY,OAI1JvC,KAAQ,SAAUzG,EAAM4O,EAAUC,GACjC,MAAO,UAAU7P,GAChB,GAAI8P,GAASpL,GAAO2J,KAAMrO,EAAMgB,EAEhC,OAAe,OAAV8O,EACgB,OAAbF,EAEFA,GAINE,GAAU,GAEU,MAAbF,EAAmBE,IAAWD,EACvB,OAAbD,EAAoBE,IAAWD,EAClB,OAAbD,EAAoBC,GAAqC,IAA5BC,EAAOlS,QAASiS,GAChC,OAAbD,EAAoBC,GAASC,EAAOlS,QAASiS,GAAU,GAC1C,OAAbD,EAAoBC,GAASC,EAAOrS,OAAQoS,EAAM3Q,UAAa2Q,EAClD,OAAbD,GAAsB,IAAME,EAAOlO,QAASkF,EAAa,KAAQ,KAAMlJ,QAASiS,GAAU,GAC7E,OAAbD,EAAoBE,IAAWD,GAASC,EAAOrS,MAAO,EAAGoS,EAAM3Q,OAAS,KAAQ2Q,EAAQ,KACxF,IAZO,IAgBVlI,MAAS,SAAUzF,EAAM6N,EAAMlE,EAAUzL,EAAOE,GAC/C,GAAI0P,GAAgC,QAAvB9N,EAAKzE,MAAO,EAAG,GAC3BwS,EAA+B,SAArB/N,EAAKzE,MAAO,IACtByS,EAAkB,YAATH,CAEV,OAAiB,KAAV3P,GAAwB,IAATE,EAGrB,SAAUN,GACT,QAASA,EAAK0J,YAGf,SAAU1J,EAAM3B,EAAS8R,GACxB,GAAI1F,GAAO2F,EAAYpE,EAAMT,EAAM8E,EAAWC,EAC7CnB,EAAMa,IAAWC,EAAU,cAAgB,kBAC3C/D,EAASlM,EAAK0J,WACd1I,EAAOkP,GAAUlQ,EAAKkD,SAASC,cAC/BoN,GAAYJ,IAAQD,CAErB,IAAKhE,EAAS,CAGb,GAAK8D,EAAS,CACb,MAAQb,EAAM,CACbnD,EAAOhM,CACP,OAASgM,EAAOA,EAAMmD,GACrB,GAAKe,EAASlE,EAAK9I,SAASC,gBAAkBnC,EAAyB,IAAlBgL,EAAKvJ,SACzD,OAAO,CAIT6N,GAAQnB,EAAe,SAATjN,IAAoBoO,GAAS,cAE5C,OAAO,EAMR,GAHAA,GAAUL,EAAU/D,EAAO2C,WAAa3C,EAAOsE,WAG1CP,GAAWM,EAAW,CAE1BH,EAAalE,EAAQzK,KAAcyK,EAAQzK,OAC3CgJ,EAAQ2F,EAAYlO,OACpBmO,EAAY5F,EAAM,KAAO9E,GAAW8E,EAAM,GAC1Cc,EAAOd,EAAM,KAAO9E,GAAW8E,EAAM,GACrCuB,EAAOqE,GAAanE,EAAOrD,WAAYwH,EAEvC,OAASrE,IAASqE,GAAarE,GAAQA,EAAMmD,KAG3C5D,EAAO8E,EAAY,IAAMC,EAAMjK,MAGhC,GAAuB,IAAlB2F,EAAKvJ,YAAoB8I,GAAQS,IAAShM,EAAO,CACrDoQ,EAAYlO,IAAWyD,EAAS0K,EAAW9E,EAC3C,YAKI,IAAKgF,IAAa9F,GAASzK,EAAMyB,KAAczB,EAAMyB,QAAkBS,KAAWuI,EAAM,KAAO9E,EACrG4F,EAAOd,EAAM,OAKb,OAASuB,IAASqE,GAAarE,GAAQA,EAAMmD,KAC3C5D,EAAO8E,EAAY,IAAMC,EAAMjK,MAEhC,IAAO6J,EAASlE,EAAK9I,SAASC,gBAAkBnC,EAAyB,IAAlBgL,EAAKvJ,aAAsB8I,IAE5EgF,KACHvE,EAAMvK,KAAcuK,EAAMvK,QAAkBS,IAAWyD,EAAS4F,IAG7DS,IAAShM,GACb,KAQJ,OADAuL,IAAQjL,EACDiL,IAASnL,GAAWmL,EAAOnL,IAAU,GAAKmL,EAAOnL,GAAS,KAKrEsH,OAAU,SAAU+I,EAAQ5E,GAK3B,GAAI/L,GACHxB,EAAKqG,EAAKkC,QAAS4J,IAAY9L,EAAK+L,WAAYD,EAAOtN,gBACtDuB,GAAO5C,MAAO,uBAAyB2O,EAKzC,OAAKnS,GAAImD,GACDnD,EAAIuN,GAIPvN,EAAGY,OAAS,GAChBY,GAAS2Q,EAAQA,EAAQ,GAAI5E,GACtBlH,EAAK+L,WAAW1S,eAAgByS,EAAOtN,eAC7CyH,GAAa,SAAU7B,EAAM9E,GAC5B,GAAI0M,GACHC,EAAUtS,EAAIyK,EAAM8C,GACpB5L,EAAI2Q,EAAQ1R,MACb,OAAQe,IACP0Q,EAAM/S,EAASmL,EAAM6H,EAAQ3Q,IAC7B8I,EAAM4H,KAAW1M,EAAS0M,GAAQC,EAAQ3Q,MAG5C,SAAUD,GACT,MAAO1B,GAAI0B,EAAM,EAAGF,KAIhBxB,IAITuI,SAECgK,IAAOjG,GAAa,SAAUxM,GAI7B,GAAI+O,MACH1J,KACAqN,EAAU/L,EAAS3G,EAASwD,QAASpD,EAAO,MAE7C,OAAOsS,GAASrP,GACfmJ,GAAa,SAAU7B,EAAM9E,EAAS5F,EAAS8R,GAC9C,GAAInQ,GACH+Q,EAAYD,EAAS/H,EAAM,KAAMoH,MACjClQ,EAAI8I,EAAK7J,MAGV,OAAQe,KACDD,EAAO+Q,EAAU9Q,MACtB8I,EAAK9I,KAAOgE,EAAQhE,GAAKD,MAI5B,SAAUA,EAAM3B,EAAS8R,GAKxB,MAJAhD,GAAM,GAAKnN,EACX8Q,EAAS3D,EAAO,KAAMgD,EAAK1M,GAE3B0J,EAAM,GAAK,MACH1J,EAAQ4C,SAInB2K,IAAOpG,GAAa,SAAUxM,GAC7B,MAAO,UAAU4B,GAChB,MAAO0E,IAAQtG,EAAU4B,GAAOd,OAAS,KAI3CuG,SAAYmF,GAAa,SAAUtH,GAElC,MADAA,GAAOA,EAAK1B,QAASwG,GAAWC,IACzB,SAAUrI,GAChB,OAASA,EAAK4O,aAAe5O,EAAKiR,WAAarM,EAAS5E,IAASpC,QAAS0F,GAAS,MAWrF4N,KAAQtG,GAAc,SAAUsG,GAM/B,MAJM9J,GAAY2C,KAAKmH,GAAQ,KAC9BxM,GAAO5C,MAAO,qBAAuBoP,GAEtCA,EAAOA,EAAKtP,QAASwG,GAAWC,IAAYlF,cACrC,SAAUnD,GAChB,GAAImR,EACJ,GACC,IAAMA,EAAW7L,EAChBtF,EAAKkR,KACLlR,EAAKgK,aAAa,aAAehK,EAAKgK,aAAa,QAGnD,MADAmH,GAAWA,EAAShO,cACbgO,IAAaD,GAA2C,IAAnCC,EAASvT,QAASsT,EAAO,YAE5ClR,EAAOA,EAAK0J,aAAiC,IAAlB1J,EAAKyC,SAC3C,QAAO,KAKTtB,OAAU,SAAUnB,GACnB,GAAIoR,GAAO/T,EAAOgU,UAAYhU,EAAOgU,SAASD,IAC9C,OAAOA,IAAQA,EAAK3T,MAAO,KAAQuC,EAAK2J,IAGzC2H,KAAQ,SAAUtR,GACjB,MAAOA,KAASqF,GAGjBkM,MAAS,SAAUvR,GAClB,MAAOA,KAAS9C,EAASsU,iBAAmBtU,EAASuU,UAAYvU,EAASuU,gBAAkBzR,EAAKkC,MAAQlC,EAAK0R,OAAS1R,EAAK2R,WAI7HC,QAAW,SAAU5R,GACpB,MAAOA,GAAK6R,YAAa,GAG1BA,SAAY,SAAU7R,GACrB,MAAOA,GAAK6R,YAAa,GAG1BC,QAAW,SAAU9R,GAGpB,GAAIkD,GAAWlD,EAAKkD,SAASC,aAC7B,OAAqB,UAAbD,KAA0BlD,EAAK8R,SAA0B,WAAb5O,KAA2BlD,EAAK+R,UAGrFA,SAAY,SAAU/R,GAOrB,MAJKA,GAAK0J,YACT1J,EAAK0J,WAAWsI,cAGVhS,EAAK+R,YAAa,GAI1BE,MAAS,SAAUjS,GAKlB,IAAMA,EAAOA,EAAK6O,WAAY7O,EAAMA,EAAOA,EAAKyL,YAC/C,GAAKzL,EAAKyC,SAAW,EACpB,OAAO,CAGT,QAAO,GAGRyJ,OAAU,SAAUlM,GACnB,OAAQ2E,EAAKkC,QAAe,MAAG7G,IAIhCkS,OAAU,SAAUlS,GACnB,MAAO+H,GAAQgC,KAAM/J,EAAKkD,WAG3BiK,MAAS,SAAUnN,GAClB,MAAO8H,GAAQiC,KAAM/J,EAAKkD,WAG3BiP,OAAU,SAAUnS,GACnB,GAAIgB,GAAOhB,EAAKkD,SAASC,aACzB,OAAgB,UAATnC,GAAkC,WAAdhB,EAAKkC,MAA8B,WAATlB,GAGtDsC,KAAQ,SAAUtD,GACjB,GAAIqO,EACJ,OAAuC,UAAhCrO,EAAKkD,SAASC,eACN,SAAdnD,EAAKkC,OAImC,OAArCmM,EAAOrO,EAAKgK,aAAa,UAA2C,SAAvBqE,EAAKlL,gBAIvD/C,MAASwL,GAAuB,WAC/B,OAAS,KAGVtL,KAAQsL,GAAuB,SAAUE,EAAc5M,GACtD,OAASA,EAAS,KAGnBmB,GAAMuL,GAAuB,SAAUE,EAAc5M,EAAQ2M,GAC5D,OAAoB,EAAXA,EAAeA,EAAW3M,EAAS2M,KAG7CuG,KAAQxG,GAAuB,SAAUE,EAAc5M,GAEtD,IADA,GAAIe,GAAI,EACIf,EAAJe,EAAYA,GAAK,EACxB6L,EAAanO,KAAMsC,EAEpB,OAAO6L,KAGRuG,IAAOzG,GAAuB,SAAUE,EAAc5M,GAErD,IADA,GAAIe,GAAI,EACIf,EAAJe,EAAYA,GAAK,EACxB6L,EAAanO,KAAMsC,EAEpB,OAAO6L,KAGRwG,GAAM1G,GAAuB,SAAUE,EAAc5M,EAAQ2M,GAE5D,IADA,GAAI5L,GAAe,EAAX4L,EAAeA,EAAW3M,EAAS2M,IACjC5L,GAAK,GACd6L,EAAanO,KAAMsC,EAEpB,OAAO6L,KAGRyG,GAAM3G,GAAuB,SAAUE,EAAc5M,EAAQ2M,GAE5D,IADA,GAAI5L,GAAe,EAAX4L,EAAeA,EAAW3M,EAAS2M,IACjC5L,EAAIf,GACb4M,EAAanO,KAAMsC,EAEpB,OAAO6L,OAKVnH,EAAKkC,QAAa,IAAIlC,EAAKkC,QAAY,EAGvC,KAAM5G,KAAOuS,OAAO,EAAMC,UAAU,EAAMC,MAAM,EAAMC,UAAU,EAAMC,OAAO,GAC5EjO,EAAKkC,QAAS5G,GAAMyL,GAAmBzL,EAExC,KAAMA,KAAO4S,QAAQ,EAAMC,OAAO,GACjCnO,EAAKkC,QAAS5G,GAAM0L,GAAoB1L,EAIzC,SAASyQ,OACTA,GAAW3R,UAAY4F,EAAKoO,QAAUpO,EAAKkC,QAC3ClC,EAAK+L,WAAa,GAAIA,IAEtB5L,EAAWJ,GAAOI,SAAW,SAAU1G,EAAU4U,GAChD,GAAIpC,GAAS5H,EAAOiK,EAAQ/Q,EAC3BgR,EAAOhK,EAAQiK,EACfC,EAASrN,EAAY3H,EAAW,IAEjC,IAAKgV,EACJ,MAAOJ,GAAY,EAAII,EAAO3V,MAAO,EAGtCyV,GAAQ9U,EACR8K,KACAiK,EAAaxO,EAAK4K,SAElB,OAAQ2D,EAAQ,GAGTtC,IAAY5H,EAAQhC,EAAOwC,KAAM0J,OACjClK,IAEJkK,EAAQA,EAAMzV,MAAOuL,EAAM,GAAG9J,SAAYgU,GAE3ChK,EAAOvL,KAAOsV,OAGfrC,GAAU,GAGJ5H,EAAQ/B,EAAauC,KAAM0J,MAChCtC,EAAU5H,EAAM2B,QAChBsI,EAAOtV,MACNyF,MAAOwN,EAEP1O,KAAM8G,EAAM,GAAGpH,QAASpD,EAAO,OAEhC0U,EAAQA,EAAMzV,MAAOmT,EAAQ1R,QAI9B,KAAMgD,IAAQyC,GAAKmI,SACZ9D,EAAQ3B,EAAWnF,GAAOsH,KAAM0J,KAAcC,EAAYjR,MAC9D8G,EAAQmK,EAAYjR,GAAQ8G,MAC7B4H,EAAU5H,EAAM2B,QAChBsI,EAAOtV,MACNyF,MAAOwN,EACP1O,KAAMA,EACN+B,QAAS+E,IAEVkK,EAAQA,EAAMzV,MAAOmT,EAAQ1R,QAI/B,KAAM0R,EACL,MAOF,MAAOoC,GACNE,EAAMhU,OACNgU,EACCxO,GAAO5C,MAAO1D,GAEd2H,EAAY3H,EAAU8K,GAASzL,MAAO,GAGzC,SAASyM,IAAY+I,GAIpB,IAHA,GAAIhT,GAAI,EACPM,EAAM0S,EAAO/T,OACbd,EAAW,GACAmC,EAAJN,EAASA,IAChB7B,GAAY6U,EAAOhT,GAAGmD,KAEvB,OAAOhF,GAGR,QAASiV,IAAevC,EAASwC,EAAYC,GAC5C,GAAIpE,GAAMmE,EAAWnE,IACpBqE,EAAmBD,GAAgB,eAARpE,EAC3BsE,EAAW7N,GAEZ,OAAO0N,GAAWlT,MAEjB,SAAUJ,EAAM3B,EAAS8R,GACxB,MAASnQ,EAAOA,EAAMmP,GACrB,GAAuB,IAAlBnP,EAAKyC,UAAkB+Q,EAC3B,MAAO1C,GAAS9Q,EAAM3B,EAAS8R,IAMlC,SAAUnQ,EAAM3B,EAAS8R,GACxB,GAAIuD,GAAUtD,EACbuD,GAAahO,EAAS8N,EAGvB,IAAKtD,GACJ,MAASnQ,EAAOA,EAAMmP,GACrB,IAAuB,IAAlBnP,EAAKyC,UAAkB+Q,IACtB1C,EAAS9Q,EAAM3B,EAAS8R,GAC5B,OAAO,MAKV,OAASnQ,EAAOA,EAAMmP,GACrB,GAAuB,IAAlBnP,EAAKyC,UAAkB+Q,EAAmB,CAE9C,GADApD,EAAapQ,EAAMyB,KAAczB,EAAMyB,QACjCiS,EAAWtD,EAAYjB,KAC5BuE,EAAU,KAAQ/N,GAAW+N,EAAU,KAAQD,EAG/C,MAAQE,GAAU,GAAMD,EAAU,EAMlC,IAHAtD,EAAYjB,GAAQwE,EAGdA,EAAU,GAAM7C,EAAS9Q,EAAM3B,EAAS8R,GAC7C,OAAO,IASf,QAASyD,IAAgBC,GACxB,MAAOA,GAAS3U,OAAS,EACxB,SAAUc,EAAM3B,EAAS8R,GACxB,GAAIlQ,GAAI4T,EAAS3U,MACjB,OAAQe,IACP,IAAM4T,EAAS5T,GAAID,EAAM3B,EAAS8R,GACjC,OAAO,CAGT,QAAO,GAER0D,EAAS,GAGX,QAASC,IAAkB1V,EAAU2V,EAAUtQ,GAG9C,IAFA,GAAIxD,GAAI,EACPM,EAAMwT,EAAS7U,OACJqB,EAAJN,EAASA,IAChByE,GAAQtG,EAAU2V,EAAS9T,GAAIwD,EAEhC,OAAOA,GAGR,QAASuQ,IAAUjD,EAAWhR,EAAK+M,EAAQzO,EAAS8R,GAOnD,IANA,GAAInQ,GACHiU,KACAhU,EAAI,EACJM,EAAMwQ,EAAU7R,OAChBgV,EAAgB,MAAPnU,EAEEQ,EAAJN,EAASA,KACVD,EAAO+Q,EAAU9Q,OAChB6M,GAAUA,EAAQ9M,EAAM3B,EAAS8R,MACtC8D,EAAatW,KAAMqC,GACdkU,GACJnU,EAAIpC,KAAMsC,GAMd,OAAOgU,GAGR,QAASE,IAAY5E,EAAWnR,EAAU0S,EAASsD,EAAYC,EAAYC,GAO1E,MANKF,KAAeA,EAAY3S,KAC/B2S,EAAaD,GAAYC,IAErBC,IAAeA,EAAY5S,KAC/B4S,EAAaF,GAAYE,EAAYC,IAE/B1J,GAAa,SAAU7B,EAAMtF,EAASpF,EAAS8R,GACrD,GAAIoE,GAAMtU,EAAGD,EACZwU,KACAC,KACAC,EAAcjR,EAAQvE,OAGtBM,EAAQuJ,GAAQ+K,GAAkB1V,GAAY,IAAKC,EAAQoE,UAAapE,GAAYA,MAGpFsW,GAAYpF,IAAexG,GAAS3K,EAEnCoB,EADAwU,GAAUxU,EAAOgV,EAAQjF,EAAWlR,EAAS8R,GAG9CyE,EAAa9D,EAEZuD,IAAgBtL,EAAOwG,EAAYmF,GAAeN,MAMjD3Q,EACDkR,CAQF,IALK7D,GACJA,EAAS6D,EAAWC,EAAYvW,EAAS8R,GAIrCiE,EAAa,CACjBG,EAAOP,GAAUY,EAAYH,GAC7BL,EAAYG,KAAUlW,EAAS8R,GAG/BlQ,EAAIsU,EAAKrV,MACT,OAAQe,KACDD,EAAOuU,EAAKtU,MACjB2U,EAAYH,EAAQxU,MAAS0U,EAAWF,EAAQxU,IAAOD,IAK1D,GAAK+I,GACJ,GAAKsL,GAAc9E,EAAY,CAC9B,GAAK8E,EAAa,CAEjBE,KACAtU,EAAI2U,EAAW1V,MACf,OAAQe,KACDD,EAAO4U,EAAW3U,KAEvBsU,EAAK5W,KAAOgX,EAAU1U,GAAKD,EAG7BqU,GAAY,KAAOO,KAAkBL,EAAMpE,GAI5ClQ,EAAI2U,EAAW1V,MACf,OAAQe,KACDD,EAAO4U,EAAW3U,MACtBsU,EAAOF,EAAazW,EAASmL,EAAM/I,GAASwU,EAAOvU,IAAM,KAE1D8I,EAAKwL,KAAU9Q,EAAQ8Q,GAAQvU,SAOlC4U,GAAaZ,GACZY,IAAenR,EACdmR,EAAWjU,OAAQ+T,EAAaE,EAAW1V,QAC3C0V,GAEGP,EACJA,EAAY,KAAM5Q,EAASmR,EAAYzE,GAEvCxS,EAAKuC,MAAOuD,EAASmR,KAMzB,QAASC,IAAmB5B,GAwB3B,IAvBA,GAAI6B,GAAchE,EAAStQ,EAC1BD,EAAM0S,EAAO/T,OACb6V,EAAkBpQ,EAAKsK,SAAUgE,EAAO,GAAG/Q,MAC3C8S,EAAmBD,GAAmBpQ,EAAKsK,SAAS,KACpDhP,EAAI8U,EAAkB,EAAI,EAG1BE,EAAe5B,GAAe,SAAUrT,GACvC,MAAOA,KAAS8U,GACdE,GAAkB,GACrBE,EAAkB7B,GAAe,SAAUrT,GAC1C,MAAOpC,GAASkX,EAAc9U,GAAS,IACrCgV,GAAkB,GACrBnB,GAAa,SAAU7T,EAAM3B,EAAS8R,GACrC,GAAI1Q,IAASsV,IAAqB5E,GAAO9R,IAAY4G,MACnD6P,EAAezW,GAASoE,SACxBwS,EAAcjV,EAAM3B,EAAS8R,GAC7B+E,EAAiBlV,EAAM3B,EAAS8R,GAGlC,OADA2E,GAAe,KACRrV,IAGGc,EAAJN,EAASA,IAChB,GAAM6Q,EAAUnM,EAAKsK,SAAUgE,EAAOhT,GAAGiC,MACxC2R,GAAaR,GAAcO,GAAgBC,GAAY/C,QACjD,CAIN,GAHAA,EAAUnM,EAAKmI,OAAQmG,EAAOhT,GAAGiC,MAAOhC,MAAO,KAAM+S,EAAOhT,GAAGgE,SAG1D6M,EAASrP,GAAY,CAGzB,IADAjB,IAAMP,EACMM,EAAJC,EAASA,IAChB,GAAKmE,EAAKsK,SAAUgE,EAAOzS,GAAG0B,MAC7B,KAGF,OAAOiS,IACNlU,EAAI,GAAK2T,GAAgBC,GACzB5T,EAAI,GAAKiK,GAER+I,EAAOxV,MAAO,EAAGwC,EAAI,GAAIvC,QAAS0F,MAAgC,MAAzB6P,EAAQhT,EAAI,GAAIiC,KAAe,IAAM,MAC7EN,QAASpD,EAAO,MAClBsS,EACItQ,EAAJP,GAAS4U,GAAmB5B,EAAOxV,MAAOwC,EAAGO,IACzCD,EAAJC,GAAWqU,GAAoB5B,EAASA,EAAOxV,MAAO+C,IAClDD,EAAJC,GAAW0J,GAAY+I,IAGzBY,EAASlW,KAAMmT,GAIjB,MAAO8C,IAAgBC,GAGxB,QAASsB,IAA0BC,EAAiBC,GACnD,GAAIC,GAAQD,EAAYnW,OAAS,EAChCqW,EAAYH,EAAgBlW,OAAS,EACrCsW,EAAe,SAAUzM,EAAM1K,EAAS8R,EAAK1M,EAASgS,GACrD,GAAIzV,GAAMQ,EAAGsQ,EACZ4E,EAAe,EACfzV,EAAI,IACJ8Q,EAAYhI,MACZ4M,KACAC,EAAgB3Q,EAEhBzF,EAAQuJ,GAAQwM,GAAa5Q,EAAKkI,KAAU,IAAG,IAAK4I,GAEpDI,EAAiBlQ,GAA4B,MAAjBiQ,EAAwB,EAAIlU,KAAKC,UAAY,GACzEpB,EAAMf,EAAMN,MAUb,KARKuW,IACJxQ,EAAmB5G,IAAYnB,GAAYmB,GAOpC4B,IAAMM,GAA4B,OAApBP,EAAOR,EAAMS,IAAaA,IAAM,CACrD,GAAKsV,GAAavV,EAAO,CACxBQ,EAAI,CACJ,OAASsQ,EAAUsE,EAAgB5U,KAClC,GAAKsQ,EAAS9Q,EAAM3B,EAAS8R,GAAQ,CACpC1M,EAAQ9F,KAAMqC,EACd,OAGGyV,IACJ9P,EAAUkQ,GAKPP,KAEEtV,GAAQ8Q,GAAW9Q,IACxB0V,IAII3M,GACJgI,EAAUpT,KAAMqC,IAOnB,GADA0V,GAAgBzV,EACXqV,GAASrV,IAAMyV,EAAe,CAClClV,EAAI,CACJ,OAASsQ,EAAUuE,EAAY7U,KAC9BsQ,EAASC,EAAW4E,EAAYtX,EAAS8R,EAG1C,IAAKpH,EAAO,CAEX,GAAK2M,EAAe,EACnB,MAAQzV,IACA8Q,EAAU9Q,IAAM0V,EAAW1V,KACjC0V,EAAW1V,GAAKoG,EAAIjH,KAAMqE,GAM7BkS,GAAa3B,GAAU2B,GAIxBhY,EAAKuC,MAAOuD,EAASkS,GAGhBF,IAAc1M,GAAQ4M,EAAWzW,OAAS,GAC5CwW,EAAeL,EAAYnW,OAAW,GAExCwF,GAAO8J,WAAY/K,GAUrB,MALKgS,KACJ9P,EAAUkQ,EACV5Q,EAAmB2Q,GAGb7E,EAGT,OAAOuE,GACN1K,GAAc4K,GACdA,EA+KF,MA5KAzQ,GAAUL,GAAOK,QAAU,SAAU3G,EAAU4K,GAC9C,GAAI/I,GACHoV,KACAD,KACAhC,EAASpN,EAAe5H,EAAW,IAEpC,KAAMgV,EAAS,CAERpK,IACLA,EAAQlE,EAAU1G,IAEnB6B,EAAI+I,EAAM9J,MACV,OAAQe,IACPmT,EAASyB,GAAmB7L,EAAM/I,IAC7BmT,EAAQ3R,GACZ4T,EAAY1X,KAAMyV,GAElBgC,EAAgBzX,KAAMyV,EAKxBA,GAASpN,EAAe5H,EAAU+W,GAA0BC,EAAiBC,IAG7EjC,EAAOhV,SAAWA,EAEnB,MAAOgV,IAYRpO,EAASN,GAAOM,OAAS,SAAU5G,EAAUC,EAASoF,EAASsF,GAC9D,GAAI9I,GAAGgT,EAAQ6C,EAAO5T,EAAM2K,EAC3BkJ,EAA+B,kBAAb3X,IAA2BA,EAC7C4K,GAASD,GAAQjE,EAAW1G,EAAW2X,EAAS3X,UAAYA,EAK7D,IAHAqF,EAAUA,MAGY,IAAjBuF,EAAM9J,OAAe,CAIzB,GADA+T,EAASjK,EAAM,GAAKA,EAAM,GAAGvL,MAAO,GAC/BwV,EAAO/T,OAAS,GAAkC,QAA5B4W,EAAQ7C,EAAO,IAAI/Q,MAC5CjE,EAAQ0O,SAAgC,IAArBtO,EAAQoE,UAAkB6C,GAC7CX,EAAKsK,SAAUgE,EAAO,GAAG/Q,MAAS,CAGnC,GADA7D,GAAYsG,EAAKkI,KAAS,GAAGiJ,EAAM7R,QAAQ,GAAGrC,QAAQwG,GAAWC,IAAYhK,QAAkB,IACzFA,EACL,MAAOoF,EAGIsS,KACX1X,EAAUA,EAAQqL,YAGnBtL,EAAWA,EAASX,MAAOwV,EAAOtI,QAAQvH,MAAMlE,QAIjDe,EAAIoH,EAAwB,aAAE0C,KAAM3L,GAAa,EAAI6U,EAAO/T,MAC5D,OAAQe,IAAM,CAIb,GAHA6V,EAAQ7C,EAAOhT,GAGV0E,EAAKsK,SAAW/M,EAAO4T,EAAM5T,MACjC,KAED,KAAM2K,EAAOlI,EAAKkI,KAAM3K,MAEjB6G,EAAO8D,EACZiJ,EAAM7R,QAAQ,GAAGrC,QAASwG,GAAWC,IACrCH,GAAS6B,KAAMkJ,EAAO,GAAG/Q,OAAUiI,GAAa9L,EAAQqL,aAAgBrL,IACpE,CAKJ,GAFA4U,EAAOtS,OAAQV,EAAG,GAClB7B,EAAW2K,EAAK7J,QAAUgL,GAAY+I,IAChC7U,EAEL,MADAT,GAAKuC,MAAOuD,EAASsF,GACdtF,CAGR,SAeJ,OAPEsS,GAAYhR,EAAS3G,EAAU4K,IAChCD,EACA1K,GACCiH,EACD7B,EACAyE,GAAS6B,KAAM3L,IAAc+L,GAAa9L,EAAQqL,aAAgBrL,GAE5DoF,GAMRxF,EAAQ0Q,WAAalN,EAAQgD,MAAM,IAAI/D,KAAMuF,GAAYmE,KAAK,MAAQ3I,EAItExD,EAAQyQ,mBAAqBvJ,EAG7BC,IAIAnH,EAAQ6P,aAAejD,GAAO,SAAUmL,GAEvC,MAAuE,GAAhEA,EAAKtI,wBAAyBxQ,EAAS6N,cAAc,UAMvDF,GAAO,SAAUC,GAEtB,MADAA,GAAIoC,UAAY,mBAC+B,MAAxCpC,EAAI+D,WAAW7E,aAAa,WAEnCiB,GAAW,yBAA0B,SAAUjL,EAAMgB,EAAM6D,GAC1D,MAAMA,GAAN,OACQ7E,EAAKgK,aAAchJ,EAA6B,SAAvBA,EAAKmC,cAA2B,EAAI,KAOjElF,EAAQ2I,YAAeiE,GAAO,SAAUC,GAG7C,MAFAA,GAAIoC,UAAY,WAChBpC,EAAI+D,WAAW5E,aAAc,QAAS,IACY,KAA3Ca,EAAI+D,WAAW7E,aAAc,YAEpCiB,GAAW,QAAS,SAAUjL,EAAMgB,EAAM6D,GACzC,MAAMA,IAAyC,UAAhC7E,EAAKkD,SAASC,cAA7B,OACQnD,EAAKiW,eAOTpL,GAAO,SAAUC,GACtB,MAAuC,OAAhCA,EAAId,aAAa,eAExBiB,GAAWzE,EAAU,SAAUxG,EAAMgB,EAAM6D,GAC1C,GAAIyJ,EACJ,OAAMzJ,GAAN,OACQ7E,EAAMgB,MAAW,EAAOA,EAAKmC,eACjCmL,EAAMtO,EAAKgN,iBAAkBhM,KAAWsN,EAAIC,UAC7CD,EAAIlL,MACL,OAKGsB,IAEHrH,EAIJc,GAAO0O,KAAOnI,EACdvG,EAAOgQ,KAAOzJ,EAAOqK,UACrB5Q,EAAOgQ,KAAK,KAAOhQ,EAAOgQ,KAAKtH,QAC/B1I,EAAO+X,OAASxR,EAAO8J,WACvBrQ,EAAOmF,KAAOoB,EAAOE,QACrBzG,EAAOgY,SAAWzR,EAAOG,MACzB1G,EAAOsH,SAAWf,EAAOe,QAIzB,IAAI2Q,GAAgBjY,EAAOgQ,KAAKnF,MAAMnB,aAElCwO,EAAa,6BAIbC,EAAY,gBAGhB,SAASC,GAAQnI,EAAUoI,EAAW3F,GACrC,GAAK1S,EAAOkD,WAAYmV,GACvB,MAAOrY,GAAO2F,KAAMsK,EAAU,SAAUpO,EAAMC,GAE7C,QAASuW,EAAUpX,KAAMY,EAAMC,EAAGD,KAAW6Q,GAK/C,IAAK2F,EAAU/T,SACd,MAAOtE,GAAO2F,KAAMsK,EAAU,SAAUpO,GACvC,MAASA,KAASwW,IAAgB3F,GAKpC,IAA0B,gBAAd2F,GAAyB,CACpC,GAAKF,EAAUvM,KAAMyM,GACpB,MAAOrY,GAAO2O,OAAQ0J,EAAWpI,EAAUyC,EAG5C2F,GAAYrY,EAAO2O,OAAQ0J,EAAWpI,GAGvC,MAAOjQ,GAAO2F,KAAMsK,EAAU,SAAUpO,GACvC,MAAS7B,GAAOwF,QAAS3D,EAAMwW,IAAe,IAAQ3F,IAIxD1S,EAAO2O,OAAS,SAAUqB,EAAM3O,EAAOqR,GACtC,GAAI7Q,GAAOR,EAAO,EAMlB,OAJKqR,KACJ1C,EAAO,QAAUA,EAAO,KAGD,IAAjB3O,EAAMN,QAAkC,IAAlBc,EAAKyC,SACjCtE,EAAO0O,KAAKO,gBAAiBpN,EAAMmO,IAAWnO,MAC9C7B,EAAO0O,KAAK5I,QAASkK,EAAMhQ,EAAO2F,KAAMtE,EAAO,SAAUQ,GACxD,MAAyB,KAAlBA,EAAKyC,aAIftE,EAAOG,GAAGsC,QACTiM,KAAM,SAAUzO,GACf,GAAI6B,GACHR,KACAgX,EAAOnZ,KACPiD,EAAMkW,EAAKvX,MAEZ,IAAyB,gBAAbd,GACX,MAAOd,MAAKiC,UAAWpB,EAAQC,GAAW0O,OAAO,WAChD,IAAM7M,EAAI,EAAOM,EAAJN,EAASA,IACrB,GAAK9B,EAAOsH,SAAUgR,EAAMxW,GAAK3C,MAChC,OAAO,IAMX,KAAM2C,EAAI,EAAOM,EAAJN,EAASA,IACrB9B,EAAO0O,KAAMzO,EAAUqY,EAAMxW,GAAKR,EAMnC,OAFAA,GAAMnC,KAAKiC,UAAWgB,EAAM,EAAIpC,EAAO+X,OAAQzW,GAAQA,GACvDA,EAAIrB,SAAWd,KAAKc,SAAWd,KAAKc,SAAW,IAAMA,EAAWA,EACzDqB,GAERqN,OAAQ,SAAU1O,GACjB,MAAOd,MAAKiC,UAAWgX,EAAOjZ,KAAMc,OAAgB,KAErDyS,IAAK,SAAUzS,GACd,MAAOd,MAAKiC,UAAWgX,EAAOjZ,KAAMc,OAAgB,KAErDsY,GAAI,SAAUtY,GACb,QAASmY,EACRjZ,KAIoB,gBAAbc,IAAyBgY,EAAcrM,KAAM3L,GACnDD,EAAQC,GACRA,OACD,GACCc,SASJ,IAAIyX,GAGHzZ,EAAWG,EAAOH,SAKlB+K,EAAa,sCAEb1J,EAAOJ,EAAOG,GAAGC,KAAO,SAAUH,EAAUC,GAC3C,GAAI2K,GAAOhJ,CAGX,KAAM5B,EACL,MAAOd,KAIR,IAAyB,gBAAbc,GAAwB,CAUnC,GAPC4K,EAF2B,MAAvB5K,EAASwY,OAAO,IAAyD,MAA3CxY,EAASwY,OAAQxY,EAASc,OAAS,IAAed,EAASc,QAAU,GAE7F,KAAMd,EAAU,MAGlB6J,EAAWuB,KAAMpL,IAIrB4K,IAAUA,EAAM,IAAO3K,EAsDrB,OAAMA,GAAWA,EAAQW,QACtBX,GAAWsY,GAAa9J,KAAMzO,GAKhCd,KAAK2B,YAAaZ,GAAUwO,KAAMzO,EAzDzC,IAAK4K,EAAM,GAAK,CAYf,GAXA3K,EAAUA,YAAmBF,GAASE,EAAQ,GAAKA,EAInDF,EAAOuB,MAAOpC,KAAMa,EAAO0Y,UAC1B7N,EAAM,GACN3K,GAAWA,EAAQoE,SAAWpE,EAAQkL,eAAiBlL,EAAUnB,GACjE,IAIImZ,EAAWtM,KAAMf,EAAM,KAAQ7K,EAAOmD,cAAejD,GACzD,IAAM2K,IAAS3K,GAETF,EAAOkD,WAAY/D,KAAM0L,IAC7B1L,KAAM0L,GAAS3K,EAAS2K,IAIxB1L,KAAK+Q,KAAMrF,EAAO3K,EAAS2K,GAK9B,OAAO1L,MAQP,GAJA0C,EAAO9C,EAASuM,eAAgBT,EAAM,IAIjChJ,GAAQA,EAAK0J,WAAa,CAG9B,GAAK1J,EAAK2J,KAAOX,EAAM,GACtB,MAAO2N,GAAW9J,KAAMzO,EAIzBd,MAAK4B,OAAS,EACd5B,KAAK,GAAK0C,EAKX,MAFA1C,MAAKe,QAAUnB,EACfI,KAAKc,SAAWA,EACTd,KAcH,MAAKc,GAASqE,UACpBnF,KAAKe,QAAUf,KAAK,GAAKc,EACzBd,KAAK4B,OAAS,EACP5B,MAIIa,EAAOkD,WAAYjD,GACK,mBAArBuY,GAAWG,MACxBH,EAAWG,MAAO1Y,GAElBA,EAAUD,IAGeqD,SAAtBpD,EAASA,WACbd,KAAKc,SAAWA,EAASA,SACzBd,KAAKe,QAAUD,EAASC,SAGlBF,EAAOoF,UAAWnF,EAAUd,OAIrCiB,GAAKQ,UAAYZ,EAAOG,GAGxBqY,EAAaxY,EAAQjB,EAGrB,IAAI6Z,GAAe,iCAElBC,GACCC,UAAU,EACVC,UAAU,EACVC,MAAM,EACNC,MAAM,EAGRjZ,GAAOyC,QACNuO,IAAK,SAAUnP,EAAMmP,EAAKkI,GACzB,GAAIzG,MACHtF,EAAMtL,EAAMmP,EAEb,OAAQ7D,GAAwB,IAAjBA,EAAI7I,WAA6BjB,SAAV6V,GAAwC,IAAjB/L,EAAI7I,WAAmBtE,EAAQmN,GAAMoL,GAAIW,IAC/E,IAAjB/L,EAAI7I,UACRmO,EAAQjT,KAAM2N,GAEfA,EAAMA,EAAI6D,EAEX,OAAOyB,IAGR0G,QAAS,SAAUC,EAAGvX,GAGrB,IAFA,GAAIwX,MAEID,EAAGA,EAAIA,EAAE9L,YACI,IAAf8L,EAAE9U,UAAkB8U,IAAMvX,GAC9BwX,EAAE7Z,KAAM4Z,EAIV,OAAOC,MAITrZ,EAAOG,GAAGsC,QACToQ,IAAK,SAAU7P,GACd,GAAIlB,GACHwX,EAAUtZ,EAAQgD,EAAQ7D,MAC1BiD,EAAMkX,EAAQvY,MAEf,OAAO5B,MAAKwP,OAAO,WAClB,IAAM7M,EAAI,EAAOM,EAAJN,EAASA,IACrB,GAAK9B,EAAOsH,SAAUnI,KAAMma,EAAQxX,IACnC,OAAO,KAMXyX,QAAS,SAAU3I,EAAW1Q,GAS7B,IARA,GAAIiN,GACHrL,EAAI,EACJ0X,EAAIra,KAAK4B,OACT0R,KACAgH,EAAMxB,EAAcrM,KAAMgF,IAAoC,gBAAdA,GAC/C5Q,EAAQ4Q,EAAW1Q,GAAWf,KAAKe,SACnC,EAEUsZ,EAAJ1X,EAAOA,IACd,IAAMqL,EAAMhO,KAAK2C,GAAIqL,GAAOA,IAAQjN,EAASiN,EAAMA,EAAI5B,WAEtD,GAAK4B,EAAI7I,SAAW,KAAOmV,EAC1BA,EAAIC,MAAMvM,GAAO,GAGA,IAAjBA,EAAI7I,UACHtE,EAAO0O,KAAKO,gBAAgB9B,EAAKyD,IAAc,CAEhD6B,EAAQjT,KAAM2N,EACd,OAKH,MAAOhO,MAAKiC,UAAWqR,EAAQ1R,OAAS,EAAIf,EAAO+X,OAAQtF,GAAYA,IAKxEiH,MAAO,SAAU7X,GAGhB,MAAMA,GAKe,gBAATA,GACJ7B,EAAOwF,QAASrG,KAAK,GAAIa,EAAQ6B,IAIlC7B,EAAOwF,QAEb3D,EAAKhB,OAASgB,EAAK,GAAKA,EAAM1C,MAXrBA,KAAK,IAAMA,KAAK,GAAGoM,WAAepM,KAAK8C,QAAQ0X,UAAU5Y,OAAS,IAc7E6Y,IAAK,SAAU3Z,EAAUC,GACxB,MAAOf,MAAKiC,UACXpB,EAAO+X,OACN/X,EAAOuB,MAAOpC,KAAK+B,MAAOlB,EAAQC,EAAUC,OAK/C2Z,QAAS,SAAU5Z,GAClB,MAAOd,MAAKya,IAAiB,MAAZ3Z,EAChBd,KAAKqC,WAAarC,KAAKqC,WAAWmN,OAAO1O,MAK5C,SAASkZ,GAAShM,EAAK6D,GACtB,EACC7D,GAAMA,EAAK6D,SACF7D,GAAwB,IAAjBA,EAAI7I,SAErB,OAAO6I,GAGRnN,EAAOyB,MACNsM,OAAQ,SAAUlM,GACjB,GAAIkM,GAASlM,EAAK0J,UAClB,OAAOwC,IAA8B,KAApBA,EAAOzJ,SAAkByJ,EAAS,MAEpD+L,QAAS,SAAUjY,GAClB,MAAO7B,GAAOgR,IAAKnP,EAAM,eAE1BkY,aAAc,SAAUlY,EAAMC,EAAGoX,GAChC,MAAOlZ,GAAOgR,IAAKnP,EAAM,aAAcqX,IAExCF,KAAM,SAAUnX,GACf,MAAOsX,GAAStX,EAAM,gBAEvBoX,KAAM,SAAUpX,GACf,MAAOsX,GAAStX,EAAM,oBAEvBmY,QAAS,SAAUnY,GAClB,MAAO7B,GAAOgR,IAAKnP,EAAM,gBAE1B8X,QAAS,SAAU9X,GAClB,MAAO7B,GAAOgR,IAAKnP,EAAM,oBAE1BoY,UAAW,SAAUpY,EAAMC,EAAGoX,GAC7B,MAAOlZ,GAAOgR,IAAKnP,EAAM,cAAeqX,IAEzCgB,UAAW,SAAUrY,EAAMC,EAAGoX,GAC7B,MAAOlZ,GAAOgR,IAAKnP,EAAM,kBAAmBqX,IAE7CiB,SAAU,SAAUtY,GACnB,MAAO7B,GAAOmZ,SAAWtX,EAAK0J,gBAAmBmF,WAAY7O,IAE9DiX,SAAU,SAAUjX,GACnB,MAAO7B,GAAOmZ,QAAStX,EAAK6O,aAE7BqI,SAAU,SAAUlX,GACnB,MAAO7B,GAAO+E,SAAUlD,EAAM,UAC7BA,EAAKuY,iBAAmBvY,EAAKwY,cAActb,SAC3CiB,EAAOuB,SAAWM,EAAK6I,cAEvB,SAAU7H,EAAM1C,GAClBH,EAAOG,GAAI0C,GAAS,SAAUqW,EAAOjZ,GACpC,GAAIqB,GAAMtB,EAAO4B,IAAKzC,KAAMgB,EAAI+Y,EAsBhC,OApB0B,UAArBrW,EAAKvD,MAAO,MAChBW,EAAWiZ,GAGPjZ,GAAgC,gBAAbA,KACvBqB,EAAMtB,EAAO2O,OAAQ1O,EAAUqB,IAG3BnC,KAAK4B,OAAS,IAEZ8X,EAAkBhW,KACvBvB,EAAMtB,EAAO+X,OAAQzW,IAIjBsX,EAAahN,KAAM/I,KACvBvB,EAAMA,EAAIgZ,YAILnb,KAAKiC,UAAWE,KAGzB,IAAIiZ,GAAY,OAKZC,IAGJ,SAASC,GAAe3X,GACvB,GAAI4X,GAASF,EAAc1X,KAI3B,OAHA9C,GAAOyB,KAAMqB,EAAQ+H,MAAO0P,OAAmB,SAAUpQ,EAAGwQ,GAC3DD,EAAQC,IAAS,IAEXD,EAyBR1a,EAAO4a,UAAY,SAAU9X,GAI5BA,EAA6B,gBAAZA,GACd0X,EAAc1X,IAAa2X,EAAe3X,GAC5C9C,EAAOyC,UAAYK,EAEpB,IACC+X,GAEAC,EAEAC,EAEAC,EAEAC,EAEAC,EAEA9S,KAEA+S,GAASrY,EAAQsY,SAEjBC,EAAO,SAAU3W,GAOhB,IANAoW,EAAShY,EAAQgY,QAAUpW,EAC3BqW,GAAQ,EACRE,EAAcC,GAAe,EAC7BA,EAAc,EACdF,EAAe5S,EAAKrH,OACpB8Z,GAAS,EACDzS,GAAsB4S,EAAdC,EAA4BA,IAC3C,GAAK7S,EAAM6S,GAAclZ,MAAO2C,EAAM,GAAKA,EAAM,OAAU,GAAS5B,EAAQwY,YAAc,CACzFR,GAAS,CACT,OAGFD,GAAS,EACJzS,IACC+S,EACCA,EAAMpa,QACVsa,EAAMF,EAAM3O,SAEFsO,EACX1S,KAEAkQ,EAAKiD,YAKRjD,GAECsB,IAAK,WACJ,GAAKxR,EAAO,CAEX,GAAI+J,GAAQ/J,EAAKrH,QACjB,QAAU6Y,GAAKjY,GACd3B,EAAOyB,KAAME,EAAM,SAAUwI,EAAGnE,GAC/B,GAAIjC,GAAO/D,EAAO+D,KAAMiC,EACV,cAATjC,EACEjB,EAAQiV,QAAWO,EAAKzF,IAAK7M,IAClCoC,EAAK5I,KAAMwG,GAEDA,GAAOA,EAAIjF,QAAmB,WAATgD,GAEhC6V,EAAK5T,MAGJhE,WAGC6Y,EACJG,EAAe5S,EAAKrH,OAGT+Z,IACXI,EAAc/I,EACdkJ,EAAMP,IAGR,MAAO3b,OAGRqc,OAAQ,WAkBP,MAjBKpT,IACJpI,EAAOyB,KAAMO,UAAW,SAAUmI,EAAGnE,GACpC,GAAI0T,EACJ,QAAUA,EAAQ1Z,EAAOwF,QAASQ,EAAKoC,EAAMsR,IAAY,GACxDtR,EAAK5F,OAAQkX,EAAO,GAEfmB,IACUG,GAATtB,GACJsB,IAEaC,GAATvB,GACJuB,OAME9b,MAIR0T,IAAK,SAAU1S,GACd,MAAOA,GAAKH,EAAOwF,QAASrF,EAAIiI,GAAS,MAASA,IAAQA,EAAKrH,SAGhE+S,MAAO,WAGN,MAFA1L,MACA4S,EAAe,EACR7b,MAGRoc,QAAS,WAER,MADAnT,GAAO+S,EAAQL,EAASzX,OACjBlE,MAGRuU,SAAU,WACT,OAAQtL,GAGTqT,KAAM,WAKL,MAJAN,GAAQ9X,OACFyX,GACLxC,EAAKiD,UAECpc,MAGRuc,OAAQ,WACP,OAAQP,GAGTQ,SAAU,SAAUzb,EAASyB,GAU5B,OATKyG,GAAW2S,IAASI,IACxBxZ,EAAOA,MACPA,GAASzB,EAASyB,EAAKrC,MAAQqC,EAAKrC,QAAUqC,GACzCkZ,EACJM,EAAM3b,KAAMmC,GAEZ0Z,EAAM1Z,IAGDxC,MAGRkc,KAAM,WAEL,MADA/C,GAAKqD,SAAUxc,KAAM6C,WACd7C,MAGR4b,MAAO,WACN,QAASA,GAIZ,OAAOzC,IAIRtY,EAAOyC,QAENmZ,SAAU,SAAUC,GACnB,GAAIC,KAEA,UAAW,OAAQ9b,EAAO4a,UAAU,eAAgB,aACpD,SAAU,OAAQ5a,EAAO4a,UAAU,eAAgB,aACnD,SAAU,WAAY5a,EAAO4a,UAAU,YAE1CmB,EAAQ,UACRC,GACCD,MAAO,WACN,MAAOA,IAERE,OAAQ,WAEP,MADAC,GAASzU,KAAMzF,WAAYma,KAAMna,WAC1B7C,MAERid,KAAM,WACL,GAAIC,GAAMra,SACV,OAAOhC,GAAO4b,SAAS,SAAUU,GAChCtc,EAAOyB,KAAMqa,EAAQ,SAAUha,EAAGya,GACjC,GAAIpc,GAAKH,EAAOkD,WAAYmZ,EAAKva,KAASua,EAAKva,EAE/Coa,GAAUK,EAAM,IAAK,WACpB,GAAIC,GAAWrc,GAAMA,EAAG4B,MAAO5C,KAAM6C,UAChCwa,IAAYxc,EAAOkD,WAAYsZ,EAASR,SAC5CQ,EAASR,UACPvU,KAAM6U,EAASG,SACfN,KAAMG,EAASI,QACfC,SAAUL,EAASM,QAErBN,EAAUC,EAAO,GAAM,QAAUpd,OAAS6c,EAAUM,EAASN,UAAY7c,KAAMgB,GAAOqc,GAAaxa,eAItGqa,EAAM,OACJL,WAIJA,QAAS,SAAUlY,GAClB,MAAc,OAAPA,EAAc9D,EAAOyC,OAAQqB,EAAKkY,GAAYA,IAGvDE,IAwCD,OArCAF,GAAQa,KAAOb,EAAQI,KAGvBpc,EAAOyB,KAAMqa,EAAQ,SAAUha,EAAGya,GACjC,GAAInU,GAAOmU,EAAO,GACjBO,EAAcP,EAAO,EAGtBP,GAASO,EAAM,IAAOnU,EAAKwR,IAGtBkD,GACJ1U,EAAKwR,IAAI,WAERmC,EAAQe,GAGNhB,EAAY,EAAJha,GAAS,GAAIyZ,QAASO,EAAQ,GAAK,GAAIL,MAInDS,EAAUK,EAAM,IAAO,WAEtB,MADAL,GAAUK,EAAM,GAAK,QAAUpd,OAAS+c,EAAWF,EAAU7c,KAAM6C,WAC5D7C,MAER+c,EAAUK,EAAM,GAAK,QAAWnU,EAAKuT,WAItCK,EAAQA,QAASE,GAGZL,GACJA,EAAK5a,KAAMib,EAAUA,GAIfA,GAIRa,KAAM,SAAUC,GACf,GAAIlb,GAAI,EACPmb,EAAgB3d,EAAM2B,KAAMe,WAC5BjB,EAASkc,EAAclc,OAGvBmc,EAAuB,IAAXnc,GAAkBic,GAAehd,EAAOkD,WAAY8Z,EAAYhB,SAAcjb,EAAS,EAGnGmb,EAAyB,IAAdgB,EAAkBF,EAAchd,EAAO4b,WAGlDuB,EAAa,SAAUrb,EAAG8T,EAAUwH,GACnC,MAAO,UAAUnY,GAChB2Q,EAAU9T,GAAM3C,KAChBie,EAAQtb,GAAME,UAAUjB,OAAS,EAAIzB,EAAM2B,KAAMe,WAAciD,EAC1DmY,IAAWC,EACfnB,EAASoB,WAAY1H,EAAUwH,KAEhBF,GACfhB,EAASqB,YAAa3H,EAAUwH,KAKnCC,EAAgBG,EAAkBC,CAGnC,IAAK1c,EAAS,EAIb,IAHAsc,EAAiB,GAAIrZ,OAAOjD,GAC5Byc,EAAmB,GAAIxZ,OAAOjD,GAC9B0c,EAAkB,GAAIzZ,OAAOjD,GACjBA,EAAJe,EAAYA,IACdmb,EAAenb,IAAO9B,EAAOkD,WAAY+Z,EAAenb,GAAIka,SAChEiB,EAAenb,GAAIka,UACjBvU,KAAM0V,EAAYrb,EAAG2b,EAAiBR,IACtCd,KAAMD,EAASQ,QACfC,SAAUQ,EAAYrb,EAAG0b,EAAkBH,MAE3CH,CAUL,OAJMA,IACLhB,EAASqB,YAAaE,EAAiBR,GAGjCf,EAASF,YAMlB,IAAI0B,EAEJ1d,GAAOG,GAAGwY,MAAQ,SAAUxY,GAI3B,MAFAH,GAAO2Y,MAAMqD,UAAUvU,KAAMtH,GAEtBhB,MAGRa,EAAOyC,QAENiB,SAAS,EAITia,UAAW,EAGXC,UAAW,SAAUC,GACfA,EACJ7d,EAAO2d,YAEP3d,EAAO2Y,OAAO,IAKhBA,MAAO,SAAUmF,GAGhB,GAAKA,KAAS,KAAS9d,EAAO2d,WAAY3d,EAAO0D,QAAjD,CAKA,IAAM3E,EAASgf,KACd,MAAOC,YAAYhe,EAAO2Y,MAI3B3Y,GAAO0D,SAAU,EAGZoa,KAAS,KAAU9d,EAAO2d,UAAY,IAK3CD,EAAUH,YAAaxe,GAAYiB,IAG9BA,EAAOG,GAAG8d,iBACdje,EAAQjB,GAAWkf,eAAgB,SACnCje,EAAQjB,GAAWmf,IAAK,cAQ3B,SAASC,KACHpf,EAASoP,kBACbpP,EAASqf,oBAAqB,mBAAoBC,GAAW,GAC7Dnf,EAAOkf,oBAAqB,OAAQC,GAAW,KAG/Ctf,EAASuf,YAAa,qBAAsBD,GAC5Cnf,EAAOof,YAAa,SAAUD,IAOhC,QAASA,MAEHtf,EAASoP,kBAAmC,SAAfoQ,MAAMxa,MAA2C,aAAxBhF,EAASyf,cACnEL,IACAne,EAAO2Y,SAIT3Y,EAAO2Y,MAAMqD,QAAU,SAAUlY,GAChC,IAAM4Z,EAOL,GALAA,EAAY1d,EAAO4b,WAKU,aAAxB7c,EAASyf,WAEbR,WAAYhe,EAAO2Y,WAGb,IAAK5Z,EAASoP,iBAEpBpP,EAASoP,iBAAkB,mBAAoBkQ,GAAW,GAG1Dnf,EAAOiP,iBAAkB,OAAQkQ,GAAW,OAGtC,CAENtf,EAASqP,YAAa,qBAAsBiQ,GAG5Cnf,EAAOkP,YAAa,SAAUiQ,EAI9B,IAAInQ,IAAM,CAEV,KACCA,EAA6B,MAAvBhP,EAAOuf,cAAwB1f,EAAS6O,gBAC7C,MAAMrJ,IAEH2J,GAAOA,EAAIwQ,WACf,QAAUC,KACT,IAAM3e,EAAO0D,QAAU,CAEtB,IAGCwK,EAAIwQ,SAAS,QACZ,MAAMna,GACP,MAAOyZ,YAAYW,EAAe,IAInCR,IAGAne,EAAO2Y,YAMZ,MAAO+E,GAAU1B,QAASlY,GAI3B,IAAI8a,GAAe,YAMf9c,CACJ,KAAMA,IAAK9B,GAAQF,GAClB,KAEDA,GAAQ0E,QAAgB,MAAN1C,EAIlBhC,EAAQ+e,wBAAyB,EAGjC7e,EAAO,WAEN,GAAImQ,GAAKxD,EAAKoR,EAAMe,CAEpBf,GAAOhf,EAAS0M,qBAAsB,QAAU,GAC1CsS,GAASA,EAAKgB,QAMpBpS,EAAM5N,EAAS6N,cAAe,OAC9BkS,EAAY/f,EAAS6N,cAAe,OACpCkS,EAAUC,MAAMC,QAAU,iEAC1BjB,EAAKzP,YAAawQ,GAAYxQ,YAAa3B,SAE/BA,GAAIoS,MAAME,OAASL,IAK9BjS,EAAIoS,MAAMC,QAAU,gEAEpBlf,EAAQ+e,uBAAyB1O,EAA0B,IAApBxD,EAAIuS,YACtC/O,IAIJ4N,EAAKgB,MAAME,KAAO,IAIpBlB,EAAKlR,YAAaiS,MAMnB,WACC,GAAInS,GAAM5N,EAAS6N,cAAe,MAGlC,IAA6B,MAAzB9M,EAAQqf,cAAuB,CAElCrf,EAAQqf,eAAgB,CACxB,WACQxS,GAAIf,KACV,MAAOrH,GACRzE,EAAQqf,eAAgB,GAK1BxS,EAAM,QAOP3M,EAAOof,WAAa,SAAUvd,GAC7B,GAAIwd,GAASrf,EAAOqf,QAASxd,EAAKkD,SAAW,KAAKC,eACjDV,GAAYzC,EAAKyC,UAAY,CAG9B,OAAoB,KAAbA,GAA+B,IAAbA,GACxB,GAGC+a,GAAUA,KAAW,GAAQxd,EAAKgK,aAAa,aAAewT,EAIjE,IAAIC,GAAS,gCACZC,EAAa,UAEd,SAASC,GAAU3d,EAAMwC,EAAKK,GAG7B,GAAcrB,SAATqB,GAAwC,IAAlB7C,EAAKyC,SAAiB,CAEhD,GAAIzB,GAAO,QAAUwB,EAAIZ,QAAS8b,EAAY,OAAQva,aAItD,IAFAN,EAAO7C,EAAKgK,aAAchJ,GAEL,gBAAT6B,GAAoB,CAC/B,IACCA,EAAgB,SAATA,GAAkB,EACf,UAATA,GAAmB,EACV,SAATA,EAAkB,MAEjBA,EAAO,KAAOA,GAAQA,EACvB4a,EAAO1T,KAAMlH,GAAS1E,EAAOyf,UAAW/a,GACxCA,EACA,MAAOH,IAGTvE,EAAO0E,KAAM7C,EAAMwC,EAAKK,OAGxBA,GAAOrB,OAIT,MAAOqB,GAIR,QAASgb,GAAmB5b,GAC3B,GAAIjB,EACJ,KAAMA,IAAQiB,GAGb,IAAc,SAATjB,IAAmB7C,EAAOoE,cAAeN,EAAIjB,MAGpC,WAATA,EACJ,OAAO;;AAIT,OAAO,EAGR,QAAS8c,GAAc9d,EAAMgB,EAAM6B,EAAMkb,GACxC,GAAM5f,EAAOof,WAAYvd,GAAzB,CAIA,GAAIP,GAAKue,EACRC,EAAc9f,EAAOsD,QAIrByc,EAASle,EAAKyC,SAIdgI,EAAQyT,EAAS/f,EAAOsM,MAAQzK,EAIhC2J,EAAKuU,EAASle,EAAMie,GAAgBje,EAAMie,IAAiBA,CAI5D,IAAOtU,GAAOc,EAAMd,KAASoU,GAAQtT,EAAMd,GAAI9G,OAAmBrB,SAATqB,GAAsC,gBAAT7B,GAgEtF,MA5DM2I,KAIJA,EADIuU,EACCle,EAAMie,GAAgBzgB,EAAW6I,OAASlI,EAAOiG,OAEjD6Z,GAIDxT,EAAOd,KAGZc,EAAOd,GAAOuU,MAAgBC,OAAQhgB,EAAO6D,QAKzB,gBAAThB,IAAqC,kBAATA,MAClC+c,EACJtT,EAAOd,GAAOxL,EAAOyC,OAAQ6J,EAAOd,GAAM3I,GAE1CyJ,EAAOd,GAAK9G,KAAO1E,EAAOyC,OAAQ6J,EAAOd,GAAK9G,KAAM7B,IAItDgd,EAAYvT,EAAOd,GAKboU,IACCC,EAAUnb,OACfmb,EAAUnb,SAGXmb,EAAYA,EAAUnb,MAGTrB,SAATqB,IACJmb,EAAW7f,EAAO6E,UAAWhC,IAAW6B,GAKpB,gBAAT7B,IAGXvB,EAAMue,EAAWhd,GAGL,MAAPvB,IAGJA,EAAMue,EAAW7f,EAAO6E,UAAWhC,MAGpCvB,EAAMue,EAGAve,GAGR,QAAS2e,GAAoBpe,EAAMgB,EAAM+c,GACxC,GAAM5f,EAAOof,WAAYvd,GAAzB,CAIA,GAAIge,GAAW/d,EACdie,EAASle,EAAKyC,SAGdgI,EAAQyT,EAAS/f,EAAOsM,MAAQzK,EAChC2J,EAAKuU,EAASle,EAAM7B,EAAOsD,SAAYtD,EAAOsD,OAI/C,IAAMgJ,EAAOd,GAAb,CAIA,GAAK3I,IAEJgd,EAAYD,EAAMtT,EAAOd,GAAOc,EAAOd,GAAK9G,MAE3B,CAGV1E,EAAOoD,QAASP,GAsBrBA,EAAOA,EAAKtD,OAAQS,EAAO4B,IAAKiB,EAAM7C,EAAO6E,YAnBxChC,IAAQgd,GACZhd,GAASA,IAITA,EAAO7C,EAAO6E,UAAWhC,GAExBA,EADIA,IAAQgd,IACHhd,GAEFA,EAAKyD,MAAM,MAarBxE,EAAIe,EAAK9B,MACT,OAAQe,UACA+d,GAAWhd,EAAKf,GAKxB,IAAK8d,GAAOF,EAAkBG,IAAc7f,EAAOoE,cAAcyb,GAChE,QAMGD,UACEtT,GAAOd,GAAK9G,KAIbgb,EAAmBpT,EAAOd,QAM5BuU,EACJ/f,EAAOkgB,WAAare,IAAQ,GAIjB/B,EAAQqf,eAAiB7S,GAASA,EAAMpN,aAE5CoN,GAAOd,GAIdc,EAAOd,GAAO,QAIhBxL,EAAOyC,QACN6J,SAIA+S,QACCc,WAAW,EACXC,UAAU,EAEVC,UAAW,8CAGZC,QAAS,SAAUze,GAElB,MADAA,GAAOA,EAAKyC,SAAWtE,EAAOsM,MAAOzK,EAAK7B,EAAOsD,UAAazB,EAAM7B,EAAOsD,WAClEzB,IAAS6d,EAAmB7d,IAGtC6C,KAAM,SAAU7C,EAAMgB,EAAM6B,GAC3B,MAAOib,GAAc9d,EAAMgB,EAAM6B,IAGlC6b,WAAY,SAAU1e,EAAMgB,GAC3B,MAAOod,GAAoBpe,EAAMgB,IAIlC2d,MAAO,SAAU3e,EAAMgB,EAAM6B,GAC5B,MAAOib,GAAc9d,EAAMgB,EAAM6B,GAAM,IAGxC+b,YAAa,SAAU5e,EAAMgB,GAC5B,MAAOod,GAAoBpe,EAAMgB,GAAM,MAIzC7C,EAAOG,GAAGsC,QACTiC,KAAM,SAAUL,EAAKY,GACpB,GAAInD,GAAGe,EAAM6B,EACZ7C,EAAO1C,KAAK,GACZ4N,EAAQlL,GAAQA,EAAK4G,UAMtB,IAAapF,SAARgB,EAAoB,CACxB,GAAKlF,KAAK4B,SACT2D,EAAO1E,EAAO0E,KAAM7C,GAEG,IAAlBA,EAAKyC,WAAmBtE,EAAOwgB,MAAO3e,EAAM,gBAAkB,CAClEC,EAAIiL,EAAMhM,MACV,OAAQe,IAIFiL,EAAOjL,KACXe,EAAOkK,EAAOjL,GAAIe,KACe,IAA5BA,EAAKpD,QAAS,WAClBoD,EAAO7C,EAAO6E,UAAWhC,EAAKvD,MAAM,IACpCkgB,EAAU3d,EAAMgB,EAAM6B,EAAM7B,KAI/B7C,GAAOwgB,MAAO3e,EAAM,eAAe,GAIrC,MAAO6C,GAIR,MAAoB,gBAARL,GACJlF,KAAKsC,KAAK,WAChBzB,EAAO0E,KAAMvF,KAAMkF,KAIdrC,UAAUjB,OAAS,EAGzB5B,KAAKsC,KAAK,WACTzB,EAAO0E,KAAMvF,KAAMkF,EAAKY,KAKzBpD,EAAO2d,EAAU3d,EAAMwC,EAAKrE,EAAO0E,KAAM7C,EAAMwC,IAAUhB,QAG3Dkd,WAAY,SAAUlc,GACrB,MAAOlF,MAAKsC,KAAK,WAChBzB,EAAOugB,WAAYphB,KAAMkF,QAM5BrE,EAAOyC,QACNie,MAAO,SAAU7e,EAAMkC,EAAMW,GAC5B,GAAIgc,EAEJ,OAAK7e,IACJkC,GAASA,GAAQ,MAAS,QAC1B2c,EAAQ1gB,EAAOwgB,MAAO3e,EAAMkC,GAGvBW,KACEgc,GAAS1gB,EAAOoD,QAAQsB,GAC7Bgc,EAAQ1gB,EAAOwgB,MAAO3e,EAAMkC,EAAM/D,EAAOoF,UAAUV,IAEnDgc,EAAMlhB,KAAMkF,IAGPgc,OAZR,QAgBDC,QAAS,SAAU9e,EAAMkC,GACxBA,EAAOA,GAAQ,IAEf,IAAI2c,GAAQ1gB,EAAO0gB,MAAO7e,EAAMkC,GAC/B6c,EAAcF,EAAM3f,OACpBZ,EAAKugB,EAAMlU,QACXqU,EAAQ7gB,EAAO8gB,YAAajf,EAAMkC,GAClCiV,EAAO,WACNhZ,EAAO2gB,QAAS9e,EAAMkC,GAIZ,gBAAP5D,IACJA,EAAKugB,EAAMlU,QACXoU,KAGIzgB,IAIU,OAAT4D,GACJ2c,EAAM3Q,QAAS,oBAIT8Q,GAAME,KACb5gB,EAAGc,KAAMY,EAAMmX,EAAM6H,KAGhBD,GAAeC,GACpBA,EAAM/M,MAAMuH,QAKdyF,YAAa,SAAUjf,EAAMkC,GAC5B,GAAIM,GAAMN,EAAO,YACjB,OAAO/D,GAAOwgB,MAAO3e,EAAMwC,IAASrE,EAAOwgB,MAAO3e,EAAMwC,GACvDyP,MAAO9T,EAAO4a,UAAU,eAAehB,IAAI,WAC1C5Z,EAAOygB,YAAa5e,EAAMkC,EAAO,SACjC/D,EAAOygB,YAAa5e,EAAMwC,UAM9BrE,EAAOG,GAAGsC,QACTie,MAAO,SAAU3c,EAAMW,GACtB,GAAIsc,GAAS,CAQb,OANqB,gBAATjd,KACXW,EAAOX,EACPA,EAAO,KACPid,KAGIhf,UAAUjB,OAASigB,EAChBhhB,EAAO0gB,MAAOvhB,KAAK,GAAI4E,GAGfV,SAATqB,EACNvF,KACAA,KAAKsC,KAAK,WACT,GAAIif,GAAQ1gB,EAAO0gB,MAAOvhB,KAAM4E,EAAMW,EAGtC1E,GAAO8gB,YAAa3hB,KAAM4E,GAEZ,OAATA,GAA8B,eAAb2c,EAAM,IAC3B1gB,EAAO2gB,QAASxhB,KAAM4E,MAI1B4c,QAAS,SAAU5c,GAClB,MAAO5E,MAAKsC,KAAK,WAChBzB,EAAO2gB,QAASxhB,KAAM4E,MAGxBkd,WAAY,SAAUld,GACrB,MAAO5E,MAAKuhB,MAAO3c,GAAQ,UAI5BiY,QAAS,SAAUjY,EAAMD,GACxB,GAAIqC,GACH+a,EAAQ,EACRC,EAAQnhB,EAAO4b,WACf3L,EAAW9Q,KACX2C,EAAI3C,KAAK4B,OACT0b,EAAU,aACCyE,GACTC,EAAM5D,YAAatN,GAAYA,IAIb,iBAATlM,KACXD,EAAMC,EACNA,EAAOV,QAERU,EAAOA,GAAQ,IAEf,OAAQjC,IACPqE,EAAMnG,EAAOwgB,MAAOvQ,EAAUnO,GAAKiC,EAAO,cACrCoC,GAAOA,EAAI2N,QACfoN,IACA/a,EAAI2N,MAAM8F,IAAK6C,GAIjB,OADAA,KACO0E,EAAMnF,QAASlY,KAGxB,IAAIsd,GAAO,sCAAwCC,OAE/CC,GAAc,MAAO,QAAS,SAAU,QAExCC,EAAW,SAAU1f,EAAM2f,GAI7B,MADA3f,GAAO2f,GAAM3f,EAC4B,SAAlC7B,EAAOyhB,IAAK5f,EAAM,aAA2B7B,EAAOsH,SAAUzF,EAAKuJ,cAAevJ,IAOvF6f,EAAS1hB,EAAO0hB,OAAS,SAAUrgB,EAAOlB,EAAIkE,EAAKY,EAAO0c,EAAWC,EAAUC,GAClF,GAAI/f,GAAI,EACPf,EAASM,EAAMN,OACf+gB,EAAc,MAAPzd,CAGR,IAA4B,WAAvBrE,EAAO+D,KAAMM,GAAqB,CACtCsd,GAAY,CACZ,KAAM7f,IAAKuC,GACVrE,EAAO0hB,OAAQrgB,EAAOlB,EAAI2B,EAAGuC,EAAIvC,IAAI,EAAM8f,EAAUC,OAIhD,IAAexe,SAAV4B,IACX0c,GAAY,EAEN3hB,EAAOkD,WAAY+B,KACxB4c,GAAM,GAGFC,IAECD,GACJ1hB,EAAGc,KAAMI,EAAO4D,GAChB9E,EAAK,OAIL2hB,EAAO3hB,EACPA,EAAK,SAAU0B,EAAMwC,EAAKY,GACzB,MAAO6c,GAAK7gB,KAAMjB,EAAQ6B,GAAQoD,MAKhC9E,GACJ,KAAYY,EAAJe,EAAYA,IACnB3B,EAAIkB,EAAMS,GAAIuC,EAAKwd,EAAM5c,EAAQA,EAAMhE,KAAMI,EAAMS,GAAIA,EAAG3B,EAAIkB,EAAMS,GAAIuC,IAK3E,OAAOsd,GACNtgB,EAGAygB,EACC3hB,EAAGc,KAAMI,GACTN,EAASZ,EAAIkB,EAAM,GAAIgD,GAAQud,GAE9BG,EAAiB,yBAIrB,WAEC,GAAI/S,GAAQjQ,EAAS6N,cAAe,SACnCD,EAAM5N,EAAS6N,cAAe,OAC9BoV,EAAWjjB,EAASkjB,wBAsDrB,IAnDAtV,EAAIoC,UAAY,qEAGhBjP,EAAQoiB,kBAAgD,IAA5BvV,EAAI+D,WAAWpM,SAI3CxE,EAAQqiB,OAASxV,EAAIlB,qBAAsB,SAAU1K,OAIrDjB,EAAQsiB,gBAAkBzV,EAAIlB,qBAAsB,QAAS1K,OAI7DjB,EAAQuiB,WACyD,kBAAhEtjB,EAAS6N,cAAe,OAAQ0V,WAAW,GAAOC,UAInDvT,EAAMjL,KAAO,WACbiL,EAAM2E,SAAU,EAChBqO,EAAS1T,YAAaU,GACtBlP,EAAQ0iB,cAAgBxT,EAAM2E,QAI9BhH,EAAIoC,UAAY,yBAChBjP,EAAQ2iB,iBAAmB9V,EAAI2V,WAAW,GAAOjQ,UAAUyF,aAG3DkK,EAAS1T,YAAa3B,GACtBA,EAAIoC,UAAY,mDAIhBjP,EAAQ4iB,WAAa/V,EAAI2V,WAAW,GAAOA,WAAW,GAAOjQ,UAAUsB,QAKvE7T,EAAQ6iB,cAAe,EAClBhW,EAAIyB,cACRzB,EAAIyB,YAAa,UAAW,WAC3BtO,EAAQ6iB,cAAe,IAGxBhW,EAAI2V,WAAW,GAAOM,SAIM,MAAzB9iB,EAAQqf,cAAuB,CAElCrf,EAAQqf,eAAgB,CACxB,WACQxS,GAAIf,KACV,MAAOrH,GACRzE,EAAQqf,eAAgB,OAM3B,WACC,GAAIrd,GAAG+gB,EACNlW,EAAM5N,EAAS6N,cAAe,MAG/B,KAAM9K,KAAO4S,QAAQ,EAAMoO,QAAQ,EAAMC,SAAS,GACjDF,EAAY,KAAO/gB,GAEZhC,EAASgC,EAAI,WAAc+gB,IAAa3jB,MAE9CyN,EAAIb,aAAc+W,EAAW,KAC7B/iB,EAASgC,EAAI,WAAc6K,EAAIlE,WAAYoa,GAAYvf,WAAY,EAKrEqJ,GAAM,OAIP,IAAIqW,GAAa,+BAChBC,EAAY,OACZC,EAAc,uCACdC,EAAc,kCACdC,EAAiB,sBAElB,SAASC,MACR,OAAO,EAGR,QAASC,MACR,OAAO,EAGR,QAASC,MACR,IACC,MAAOxkB,GAASsU,cACf,MAAQmQ,KAOXxjB,EAAOue,OAEN5f,UAEAib,IAAK,SAAU/X,EAAM4hB,EAAOzW,EAAStI,EAAMzE,GAC1C,GAAIkG,GAAKud,EAAQC,EAAGC,EACnBC,EAASC,EAAaC,EACtBC,EAAUjgB,EAAMkgB,EAAYC,EAC5BC,EAAWnkB,EAAOwgB,MAAO3e,EAG1B,IAAMsiB,EAAN,CAKKnX,EAAQA,UACZ4W,EAAc5W,EACdA,EAAU4W,EAAY5W,QACtB/M,EAAW2jB,EAAY3jB,UAIlB+M,EAAQ/G,OACb+G,EAAQ/G,KAAOjG,EAAOiG,SAIhByd,EAASS,EAAST,UACxBA,EAASS,EAAST,YAEZI,EAAcK,EAASC,UAC7BN,EAAcK,EAASC,OAAS,SAAU7f,GAGzC,aAAcvE,KAAW4e,GAAkBra,GAAKvE,EAAOue,MAAM8F,YAAc9f,EAAER,KAE5EV,OADArD,EAAOue,MAAM+F,SAASviB,MAAO+hB,EAAYjiB,KAAMG,YAIjD8hB,EAAYjiB,KAAOA,GAIpB4hB,GAAUA,GAAS,IAAK5Y,MAAO0P,KAAiB,IAChDoJ,EAAIF,EAAM1iB,MACV,OAAQ4iB,IACPxd,EAAMid,EAAe/X,KAAMoY,EAAME,QACjC5f,EAAOmgB,EAAW/d,EAAI,GACtB8d,GAAe9d,EAAI,IAAM,IAAKG,MAAO,KAAM/D,OAGrCwB,IAKN8f,EAAU7jB,EAAOue,MAAMsF,QAAS9f,OAGhCA,GAAS9D,EAAW4jB,EAAQU,aAAeV,EAAQW,WAAczgB,EAGjE8f,EAAU7jB,EAAOue,MAAMsF,QAAS9f,OAGhCggB,EAAY/jB,EAAOyC,QAClBsB,KAAMA,EACNmgB,SAAUA,EACVxf,KAAMA,EACNsI,QAASA,EACT/G,KAAM+G,EAAQ/G,KACdhG,SAAUA,EACVyJ,aAAczJ,GAAYD,EAAOgQ,KAAKnF,MAAMnB,aAAakC,KAAM3L,GAC/DwkB,UAAWR,EAAWhY,KAAK,MACzB2X,IAGII,EAAWN,EAAQ3f,MACzBigB,EAAWN,EAAQ3f,MACnBigB,EAASU,cAAgB,EAGnBb,EAAQc,OAASd,EAAQc,MAAM1jB,KAAMY,EAAM6C,EAAMuf,EAAYH,MAAkB,IAE/EjiB,EAAKsM,iBACTtM,EAAKsM,iBAAkBpK,EAAM+f,GAAa,GAE/BjiB,EAAKuM,aAChBvM,EAAKuM,YAAa,KAAOrK,EAAM+f,KAK7BD,EAAQjK,MACZiK,EAAQjK,IAAI3Y,KAAMY,EAAMkiB,GAElBA,EAAU/W,QAAQ/G,OACvB8d,EAAU/W,QAAQ/G,KAAO+G,EAAQ/G,OAK9BhG,EACJ+jB,EAASxhB,OAAQwhB,EAASU,gBAAiB,EAAGX,GAE9CC,EAASxkB,KAAMukB,GAIhB/jB,EAAOue,MAAM5f,OAAQoF,IAAS,EAI/BlC,GAAO,OAIR2Z,OAAQ,SAAU3Z,EAAM4hB,EAAOzW,EAAS/M,EAAU2kB,GACjD,GAAIviB,GAAG0hB,EAAW5d,EACjB0e,EAAWlB,EAAGD,EACdG,EAASG,EAAUjgB,EACnBkgB,EAAYC,EACZC,EAAWnkB,EAAOsgB,QAASze,IAAU7B,EAAOwgB,MAAO3e,EAEpD,IAAMsiB,IAAcT,EAASS,EAAST,QAAtC,CAKAD,GAAUA,GAAS,IAAK5Y,MAAO0P,KAAiB,IAChDoJ,EAAIF,EAAM1iB,MACV,OAAQ4iB,IAMP,GALAxd,EAAMid,EAAe/X,KAAMoY,EAAME,QACjC5f,EAAOmgB,EAAW/d,EAAI,GACtB8d,GAAe9d,EAAI,IAAM,IAAKG,MAAO,KAAM/D,OAGrCwB,EAAN,CAOA8f,EAAU7jB,EAAOue,MAAMsF,QAAS9f,OAChCA,GAAS9D,EAAW4jB,EAAQU,aAAeV,EAAQW,WAAczgB,EACjEigB,EAAWN,EAAQ3f,OACnBoC,EAAMA,EAAI,IAAM,GAAIyC,QAAQ,UAAYqb,EAAWhY,KAAK,iBAAmB,WAG3E4Y,EAAYxiB,EAAI2hB,EAASjjB,MACzB,OAAQsB,IACP0hB,EAAYC,EAAU3hB,IAEfuiB,GAAeV,IAAaH,EAAUG,UACzClX,GAAWA,EAAQ/G,OAAS8d,EAAU9d,MACtCE,IAAOA,EAAIyF,KAAMmY,EAAUU,YAC3BxkB,GAAYA,IAAa8jB,EAAU9jB,WAAyB,OAAbA,IAAqB8jB,EAAU9jB,YACjF+jB,EAASxhB,OAAQH,EAAG,GAEf0hB,EAAU9jB,UACd+jB,EAASU,gBAELb,EAAQrI,QACZqI,EAAQrI,OAAOva,KAAMY,EAAMkiB,GAOzBc,KAAcb,EAASjjB,SACrB8iB,EAAQiB,UAAYjB,EAAQiB,SAAS7jB,KAAMY,EAAMoiB,EAAYE,EAASC,WAAa,GACxFpkB,EAAO+kB,YAAaljB,EAAMkC,EAAMogB,EAASC,cAGnCV,GAAQ3f,QAtCf,KAAMA,IAAQ2f,GACb1jB,EAAOue,MAAM/C,OAAQ3Z,EAAMkC,EAAO0f,EAAOE,GAAK3W,EAAS/M,GAAU,EA0C/DD,GAAOoE,cAAesf,WACnBS,GAASC,OAIhBpkB,EAAOygB,YAAa5e,EAAM,aAI5BmjB,QAAS,SAAUzG,EAAO7Z,EAAM7C,EAAMojB,GACrC,GAAIb,GAAQc,EAAQ/X,EACnBgY,EAAYtB,EAAS1d,EAAKrE,EAC1BsjB,GAAcvjB,GAAQ9C,GACtBgF,EAAOnE,EAAOqB,KAAMsd,EAAO,QAAWA,EAAMxa,KAAOwa,EACnD0F,EAAarkB,EAAOqB,KAAMsd,EAAO,aAAgBA,EAAMkG,UAAUne,MAAM,OAKxE,IAHA6G,EAAMhH,EAAMtE,EAAOA,GAAQ9C,EAGJ,IAAlB8C,EAAKyC,UAAoC,IAAlBzC,EAAKyC,WAK5B6e,EAAYvX,KAAM7H,EAAO/D,EAAOue,MAAM8F,aAItCtgB,EAAKtE,QAAQ,MAAQ,IAEzBwkB,EAAalgB,EAAKuC,MAAM,KACxBvC,EAAOkgB,EAAWzX,QAClByX,EAAW1hB,QAEZ2iB,EAASnhB,EAAKtE,QAAQ,KAAO,GAAK,KAAOsE,EAGzCwa,EAAQA,EAAOve,EAAOsD,SACrBib,EACA,GAAIve,GAAOqlB,MAAOthB,EAAuB,gBAAVwa,IAAsBA,GAGtDA,EAAM+G,UAAYL,EAAe,EAAI,EACrC1G,EAAMkG,UAAYR,EAAWhY,KAAK,KAClCsS,EAAMgH,aAAehH,EAAMkG,UAC1B,GAAI7b,QAAQ,UAAYqb,EAAWhY,KAAK,iBAAmB,WAC3D,KAGDsS,EAAM5M,OAAStO,OACTkb,EAAMvb,SACXub,EAAMvb,OAASnB,GAIhB6C,EAAe,MAARA,GACJ6Z,GACFve,EAAOoF,UAAWV,GAAQ6Z,IAG3BsF,EAAU7jB,EAAOue,MAAMsF,QAAS9f,OAC1BkhB,IAAgBpB,EAAQmB,SAAWnB,EAAQmB,QAAQjjB,MAAOF,EAAM6C,MAAW,GAAjF,CAMA,IAAMugB,IAAiBpB,EAAQ2B,WAAaxlB,EAAOiE,SAAUpC,GAAS,CAMrE,IAJAsjB,EAAatB,EAAQU,cAAgBxgB,EAC/Bof,EAAYvX,KAAMuZ,EAAaphB,KACpCoJ,EAAMA,EAAI5B,YAEH4B,EAAKA,EAAMA,EAAI5B,WACtB6Z,EAAU5lB,KAAM2N,GAChBhH,EAAMgH,CAIFhH,MAAStE,EAAKuJ,eAAiBrM,IACnCqmB,EAAU5lB,KAAM2G,EAAI8H,aAAe9H,EAAIsf,cAAgBvmB,GAKzD4C,EAAI,CACJ,QAASqL,EAAMiY,EAAUtjB,QAAUyc,EAAMmH,uBAExCnH,EAAMxa,KAAOjC,EAAI,EAChBqjB,EACAtB,EAAQW,UAAYzgB,EAGrBqgB,GAAWpkB,EAAOwgB,MAAOrT,EAAK,eAAoBoR,EAAMxa,OAAU/D,EAAOwgB,MAAOrT,EAAK,UAChFiX,GACJA,EAAOriB,MAAOoL,EAAKzI,GAIpB0f,EAASc,GAAU/X,EAAK+X,GACnBd,GAAUA,EAAOriB,OAAS/B,EAAOof,WAAYjS,KACjDoR,EAAM5M,OAASyS,EAAOriB,MAAOoL,EAAKzI,GAC7B6Z,EAAM5M,UAAW,GACrB4M,EAAMoH,iBAOT,IAHApH,EAAMxa,KAAOA,GAGPkhB,IAAiB1G,EAAMqH,wBAErB/B,EAAQgC,UAAYhC,EAAQgC,SAAS9jB,MAAOqjB,EAAUld,MAAOxD,MAAW,IAC9E1E,EAAOof,WAAYvd,IAKdqjB,GAAUrjB,EAAMkC,KAAW/D,EAAOiE,SAAUpC,GAAS,CAGzDsE,EAAMtE,EAAMqjB,GAEP/e,IACJtE,EAAMqjB,GAAW,MAIlBllB,EAAOue,MAAM8F,UAAYtgB,CACzB,KACClC,EAAMkC,KACL,MAAQQ,IAIVvE,EAAOue,MAAM8F,UAAYhhB,OAEpB8C,IACJtE,EAAMqjB,GAAW/e,GAMrB,MAAOoY,GAAM5M,SAGd2S,SAAU,SAAU/F,GAGnBA,EAAQve,EAAOue,MAAMuH,IAAKvH,EAE1B,IAAIzc,GAAGR,EAAKyiB,EAAWtR,EAASpQ,EAC/B0jB,KACApkB,EAAOrC,EAAM2B,KAAMe,WACnBgiB,GAAahkB,EAAOwgB,MAAOrhB,KAAM,eAAoBof,EAAMxa,UAC3D8f,EAAU7jB,EAAOue,MAAMsF,QAAStF,EAAMxa,SAOvC,IAJApC,EAAK,GAAK4c,EACVA,EAAMyH,eAAiB7mB,MAGlB0kB,EAAQoC,aAAepC,EAAQoC,YAAYhlB,KAAM9B,KAAMof,MAAY,EAAxE,CAKAwH,EAAe/lB,EAAOue,MAAMyF,SAAS/iB,KAAM9B,KAAMof,EAAOyF,GAGxDliB,EAAI,CACJ,QAAS2Q,EAAUsT,EAAcjkB,QAAWyc,EAAMmH,uBAAyB,CAC1EnH,EAAM2H,cAAgBzT,EAAQ5Q,KAE9BQ,EAAI,CACJ,QAAS0hB,EAAYtR,EAAQuR,SAAU3hB,QAAWkc,EAAM4H,kCAIjD5H,EAAMgH,cAAgBhH,EAAMgH,aAAa3Z,KAAMmY,EAAUU,cAE9DlG,EAAMwF,UAAYA,EAClBxF,EAAM7Z,KAAOqf,EAAUrf,KAEvBpD,IAAStB,EAAOue,MAAMsF,QAASE,EAAUG,eAAkBE,QAAUL,EAAU/W,SAC5EjL,MAAO0Q,EAAQ5Q,KAAMF,GAEX0B,SAAR/B,IACEid,EAAM5M,OAASrQ,MAAS,IAC7Bid,EAAMoH,iBACNpH,EAAM6H,oBAYX,MAJKvC,GAAQwC,cACZxC,EAAQwC,aAAaplB,KAAM9B,KAAMof,GAG3BA,EAAM5M,SAGdqS,SAAU,SAAUzF,EAAOyF,GAC1B,GAAIsC,GAAKvC,EAAWje,EAAShE,EAC5BikB,KACArB,EAAgBV,EAASU,cACzBvX,EAAMoR,EAAMvb,MAKb,IAAK0hB,GAAiBvX,EAAI7I,YAAcia,EAAMvK,QAAyB,UAAfuK,EAAMxa,MAG7D,KAAQoJ,GAAOhO,KAAMgO,EAAMA,EAAI5B,YAAcpM,KAK5C,GAAsB,IAAjBgO,EAAI7I,WAAmB6I,EAAIuG,YAAa,GAAuB,UAAf6K,EAAMxa,MAAoB,CAE9E,IADA+B,KACMhE,EAAI,EAAO4iB,EAAJ5iB,EAAmBA,IAC/BiiB,EAAYC,EAAUliB,GAGtBwkB,EAAMvC,EAAU9jB,SAAW,IAEHoD,SAAnByC,EAASwgB,KACbxgB,EAASwgB,GAAQvC,EAAUra,aAC1B1J,EAAQsmB,EAAKnnB,MAAOua,MAAOvM,IAAS,EACpCnN,EAAO0O,KAAM4X,EAAKnnB,KAAM,MAAQgO,IAAQpM,QAErC+E,EAASwgB,IACbxgB,EAAQtG,KAAMukB,EAGXje,GAAQ/E,QACZglB,EAAavmB,MAAOqC,KAAMsL,EAAK6W,SAAUle,IAW7C,MAJK4e,GAAgBV,EAASjjB,QAC7BglB,EAAavmB,MAAOqC,KAAM1C,KAAM6kB,SAAUA,EAAS1kB,MAAOolB,KAGpDqB,GAGRD,IAAK,SAAUvH,GACd,GAAKA,EAAOve,EAAOsD,SAClB,MAAOib,EAIR,IAAIzc,GAAGykB,EAAM3jB,EACZmB,EAAOwa,EAAMxa,KACbyiB,EAAgBjI,EAChBkI,EAAUtnB,KAAKunB,SAAU3iB,EAEpB0iB,KACLtnB,KAAKunB,SAAU3iB,GAAS0iB,EACvBvD,EAAYtX,KAAM7H,GAAS5E,KAAKwnB,WAChC1D,EAAUrX,KAAM7H,GAAS5E,KAAKynB,aAGhChkB,EAAO6jB,EAAQI,MAAQ1nB,KAAK0nB,MAAMtnB,OAAQknB,EAAQI,OAAU1nB,KAAK0nB,MAEjEtI,EAAQ,GAAIve,GAAOqlB,MAAOmB,GAE1B1kB,EAAIc,EAAK7B,MACT,OAAQe,IACPykB,EAAO3jB,EAAMd,GACbyc,EAAOgI,GAASC,EAAeD,EAmBhC,OAdMhI,GAAMvb,SACXub,EAAMvb,OAASwjB,EAAcM,YAAc/nB,GAKb,IAA1Bwf,EAAMvb,OAAOsB,WACjBia,EAAMvb,OAASub,EAAMvb,OAAOuI,YAK7BgT,EAAMwI,UAAYxI,EAAMwI,QAEjBN,EAAQ9X,OAAS8X,EAAQ9X,OAAQ4P,EAAOiI,GAAkBjI,GAIlEsI,MAAO,wHAAwHvgB,MAAM,KAErIogB,YAEAE,UACCC,MAAO,4BAA4BvgB,MAAM,KACzCqI,OAAQ,SAAU4P,EAAOyI,GAOxB,MAJoB,OAAfzI,EAAM0I,QACV1I,EAAM0I,MAA6B,MAArBD,EAASE,SAAmBF,EAASE,SAAWF,EAASG,SAGjE5I,IAIToI,YACCE,MAAO,mGAAmGvgB,MAAM,KAChHqI,OAAQ,SAAU4P,EAAOyI,GACxB,GAAIjJ,GAAMqJ,EAAUpZ,EACnBgG,EAASgT,EAAShT,OAClBqT,EAAcL,EAASK,WAuBxB,OApBoB,OAAf9I,EAAM+I,OAAqC,MAApBN,EAASO,UACpCH,EAAW7I,EAAMvb,OAAOoI,eAAiBrM,EACzCiP,EAAMoZ,EAASxZ,gBACfmQ,EAAOqJ,EAASrJ,KAEhBQ,EAAM+I,MAAQN,EAASO,SAAYvZ,GAAOA,EAAIwZ,YAAczJ,GAAQA,EAAKyJ,YAAc,IAAQxZ,GAAOA,EAAIyZ,YAAc1J,GAAQA,EAAK0J,YAAc,GACnJlJ,EAAMmJ,MAAQV,EAASW,SAAY3Z,GAAOA,EAAI4Z,WAAc7J,GAAQA,EAAK6J,WAAc,IAAQ5Z,GAAOA,EAAI6Z,WAAc9J,GAAQA,EAAK8J,WAAc,KAI9ItJ,EAAMuJ,eAAiBT,IAC5B9I,EAAMuJ,cAAgBT,IAAgB9I,EAAMvb,OAASgkB,EAASe,UAAYV,GAKrE9I,EAAM0I,OAAoB5jB,SAAX2Q,IACpBuK,EAAM0I,MAAmB,EAATjT,EAAa,EAAe,EAATA,EAAa,EAAe,EAATA,EAAa,EAAI,GAGjEuK,IAITsF,SACCmE,MAECxC,UAAU,GAEXpS,OAEC4R,QAAS,WACR,GAAK7lB,OAASokB,MAAuBpkB,KAAKiU,MACzC,IAEC,MADAjU,MAAKiU,SACE,EACN,MAAQ7O,MAOZggB,aAAc,WAEf0D,MACCjD,QAAS,WACR,MAAK7lB,QAASokB,MAAuBpkB,KAAK8oB,MACzC9oB,KAAK8oB,QACE,GAFR,QAKD1D,aAAc,YAEf3B,OAECoC,QAAS,WACR,MAAKhlB,GAAO+E,SAAU5F,KAAM,UAA2B,aAAdA,KAAK4E,MAAuB5E,KAAKyjB,OACzEzjB,KAAKyjB,SACE,GAFR,QAODiD,SAAU,SAAUtH,GACnB,MAAOve,GAAO+E,SAAUwZ,EAAMvb,OAAQ,OAIxCklB,cACC7B,aAAc,SAAU9H,GAIDlb,SAAjBkb,EAAM5M,QAAwB4M,EAAMiI,gBACxCjI,EAAMiI,cAAc2B,YAAc5J,EAAM5M,WAM5CyW,SAAU,SAAUrkB,EAAMlC,EAAM0c,EAAO8J,GAItC,GAAI9jB,GAAIvE,EAAOyC,OACd,GAAIzC,GAAOqlB,MACX9G,GAECxa,KAAMA,EACNukB,aAAa,EACb9B,kBAGG6B,GACJroB,EAAOue,MAAMyG,QAASzgB,EAAG,KAAM1C,GAE/B7B,EAAOue,MAAM+F,SAASrjB,KAAMY,EAAM0C,GAE9BA,EAAEqhB,sBACNrH,EAAMoH,mBAKT3lB,EAAO+kB,YAAchmB,EAASqf,oBAC7B,SAAUvc,EAAMkC,EAAMqgB,GAChBviB,EAAKuc,qBACTvc,EAAKuc,oBAAqBra,EAAMqgB,GAAQ,IAG1C,SAAUviB,EAAMkC,EAAMqgB,GACrB,GAAIvhB,GAAO,KAAOkB,CAEblC,GAAKyc,oBAIGzc,GAAMgB,KAAW+b,IAC5B/c,EAAMgB,GAAS,MAGhBhB,EAAKyc,YAAazb,EAAMuhB,KAI3BpkB,EAAOqlB,MAAQ,SAAU3iB,EAAKmkB,GAE7B,MAAO1nB,gBAAgBa,GAAOqlB,OAKzB3iB,GAAOA,EAAIqB,MACf5E,KAAKqnB,cAAgB9jB,EACrBvD,KAAK4E,KAAOrB,EAAIqB,KAIhB5E,KAAKymB,mBAAqBljB,EAAI6lB,kBACHllB,SAAzBX,EAAI6lB,kBAEJ7lB,EAAIylB,eAAgB,EACrB9E,GACAC,IAIDnkB,KAAK4E,KAAOrB,EAIRmkB,GACJ7mB,EAAOyC,OAAQtD,KAAM0nB,GAItB1nB,KAAKqpB,UAAY9lB,GAAOA,EAAI8lB,WAAaxoB,EAAOoG,WAGhDjH,KAAMa,EAAOsD,UAAY,IA/BjB,GAAItD,GAAOqlB,MAAO3iB,EAAKmkB,IAoChC7mB,EAAOqlB,MAAMzkB,WACZglB,mBAAoBtC,GACpBoC,qBAAsBpC,GACtB6C,8BAA+B7C,GAE/BqC,eAAgB,WACf,GAAIphB,GAAIpF,KAAKqnB,aAEbrnB,MAAKymB,mBAAqBvC,GACpB9e,IAKDA,EAAEohB,eACNphB,EAAEohB,iBAKFphB,EAAE4jB,aAAc,IAGlB/B,gBAAiB,WAChB,GAAI7hB,GAAIpF,KAAKqnB,aAEbrnB,MAAKumB,qBAAuBrC,GACtB9e,IAIDA,EAAE6hB,iBACN7hB,EAAE6hB,kBAKH7hB,EAAEkkB,cAAe,IAElBC,yBAA0B,WACzB,GAAInkB,GAAIpF,KAAKqnB,aAEbrnB,MAAKgnB,8BAAgC9C,GAEhC9e,GAAKA,EAAEmkB,0BACXnkB,EAAEmkB,2BAGHvpB,KAAKinB,oBAKPpmB,EAAOyB,MACNknB,WAAY,YACZC,WAAY,WACZC,aAAc,cACdC,aAAc,cACZ,SAAUC,EAAMjD,GAClB9lB,EAAOue,MAAMsF,QAASkF,IACrBxE,aAAcuB,EACdtB,SAAUsB,EAEV1B,OAAQ,SAAU7F,GACjB,GAAIjd,GACH0B,EAAS7D,KACT6pB,EAAUzK,EAAMuJ,cAChB/D,EAAYxF,EAAMwF,SASnB,SALMiF,GAAYA,IAAYhmB,IAAWhD,EAAOsH,SAAUtE,EAAQgmB,MACjEzK,EAAMxa,KAAOggB,EAAUG,SACvB5iB,EAAMyiB,EAAU/W,QAAQjL,MAAO5C,KAAM6C,WACrCuc,EAAMxa,KAAO+hB,GAEPxkB,MAMJxB,EAAQmpB,gBAEbjpB,EAAOue,MAAMsF,QAAQnP,QACpBiQ,MAAO,WAEN,MAAK3kB,GAAO+E,SAAU5F,KAAM,SACpB,MAIRa,GAAOue,MAAM3E,IAAKza,KAAM,iCAAkC,SAAUoF,GAEnE,GAAI1C,GAAO0C,EAAEvB,OACZkmB,EAAOlpB,EAAO+E,SAAUlD,EAAM,UAAa7B,EAAO+E,SAAUlD,EAAM,UAAaA,EAAKqnB,KAAO7lB,MACvF6lB,KAASlpB,EAAOwgB,MAAO0I,EAAM,mBACjClpB,EAAOue,MAAM3E,IAAKsP,EAAM,iBAAkB,SAAU3K,GACnDA,EAAM4K,gBAAiB,IAExBnpB,EAAOwgB,MAAO0I,EAAM,iBAAiB,OAMxC7C,aAAc,SAAU9H,GAElBA,EAAM4K,uBACH5K,GAAM4K,eACRhqB,KAAKoM,aAAegT,EAAM+G,WAC9BtlB,EAAOue,MAAM6J,SAAU,SAAUjpB,KAAKoM,WAAYgT,GAAO,KAK5DuG,SAAU,WAET,MAAK9kB,GAAO+E,SAAU5F,KAAM,SACpB,MAIRa,GAAOue,MAAM/C,OAAQrc,KAAM,eAMxBW,EAAQspB,gBAEbppB,EAAOue,MAAMsF,QAAQf,QAEpB6B,MAAO,WAEN,MAAK3B,GAAWpX,KAAMzM,KAAK4F,YAIP,aAAd5F,KAAK4E,MAAqC,UAAd5E,KAAK4E,QACrC/D,EAAOue,MAAM3E,IAAKza,KAAM,yBAA0B,SAAUof,GACjB,YAArCA,EAAMiI,cAAc6C,eACxBlqB,KAAKmqB,eAAgB,KAGvBtpB,EAAOue,MAAM3E,IAAKza,KAAM,gBAAiB,SAAUof,GAC7Cpf,KAAKmqB,gBAAkB/K,EAAM+G,YACjCnmB,KAAKmqB,eAAgB,GAGtBtpB,EAAOue,MAAM6J,SAAU,SAAUjpB,KAAMof,GAAO,OAGzC,OAGRve,GAAOue,MAAM3E,IAAKza,KAAM,yBAA0B,SAAUoF,GAC3D,GAAI1C,GAAO0C,EAAEvB,MAERggB,GAAWpX,KAAM/J,EAAKkD,YAAe/E,EAAOwgB,MAAO3e,EAAM,mBAC7D7B,EAAOue,MAAM3E,IAAK/X,EAAM,iBAAkB,SAAU0c,IAC9Cpf,KAAKoM,YAAegT,EAAM+J,aAAgB/J,EAAM+G,WACpDtlB,EAAOue,MAAM6J,SAAU,SAAUjpB,KAAKoM,WAAYgT,GAAO,KAG3Dve,EAAOwgB,MAAO3e,EAAM,iBAAiB,OAKxCuiB,OAAQ,SAAU7F,GACjB,GAAI1c,GAAO0c,EAAMvb,MAGjB,OAAK7D,QAAS0C,GAAQ0c,EAAM+J,aAAe/J,EAAM+G,WAA4B,UAAdzjB,EAAKkC,MAAkC,aAAdlC,EAAKkC,KACrFwa,EAAMwF,UAAU/W,QAAQjL,MAAO5C,KAAM6C,WAD7C,QAKD8iB,SAAU,WAGT,MAFA9kB,GAAOue,MAAM/C,OAAQrc,KAAM,aAEnB6jB,EAAWpX,KAAMzM,KAAK4F,aAM3BjF,EAAQypB,gBACbvpB,EAAOyB,MAAO2R,MAAO,UAAW6U,KAAM,YAAc,SAAUc,EAAMjD,GAGnE,GAAI9Y,GAAU,SAAUuR,GACtBve,EAAOue,MAAM6J,SAAUtC,EAAKvH,EAAMvb,OAAQhD,EAAOue,MAAMuH,IAAKvH,IAAS,GAGvEve,GAAOue,MAAMsF,QAASiC,IACrBnB,MAAO,WACN,GAAI3W,GAAM7O,KAAKiM,eAAiBjM,KAC/BqqB,EAAWxpB,EAAOwgB,MAAOxS,EAAK8X,EAEzB0D,IACLxb,EAAIG,iBAAkB4a,EAAM/b,GAAS,GAEtChN,EAAOwgB,MAAOxS,EAAK8X,GAAO0D,GAAY,GAAM,IAE7C1E,SAAU,WACT,GAAI9W,GAAM7O,KAAKiM,eAAiBjM,KAC/BqqB,EAAWxpB,EAAOwgB,MAAOxS,EAAK8X,GAAQ,CAEjC0D,GAILxpB,EAAOwgB,MAAOxS,EAAK8X,EAAK0D,IAHxBxb,EAAIoQ,oBAAqB2K,EAAM/b,GAAS,GACxChN,EAAOygB,YAAazS,EAAK8X,QAS9B9lB,EAAOG,GAAGsC,QAETgnB,GAAI,SAAUhG,EAAOxjB,EAAUyE,EAAMvE,EAAiBupB,GACrD,GAAI3lB,GAAM4lB,CAGV,IAAsB,gBAAVlG,GAAqB,CAEP,gBAAbxjB,KAEXyE,EAAOA,GAAQzE,EACfA,EAAWoD,OAEZ,KAAMU,IAAQ0f,GACbtkB,KAAKsqB,GAAI1lB,EAAM9D,EAAUyE,EAAM+e,EAAO1f,GAAQ2lB,EAE/C,OAAOvqB,MAmBR,GAhBa,MAARuF,GAAsB,MAANvE,GAEpBA,EAAKF,EACLyE,EAAOzE,EAAWoD,QACD,MAANlD,IACc,gBAAbF,IAEXE,EAAKuE,EACLA,EAAOrB,SAGPlD,EAAKuE,EACLA,EAAOzE,EACPA,EAAWoD,SAGRlD,KAAO,EACXA,EAAKmjB,OACC,KAAMnjB,EACZ,MAAOhB,KAaR,OAVa,KAARuqB,IACJC,EAASxpB,EACTA,EAAK,SAAUoe,GAGd,MADAve,KAASke,IAAKK,GACPoL,EAAO5nB,MAAO5C,KAAM6C,YAG5B7B,EAAG8F,KAAO0jB,EAAO1jB,OAAU0jB,EAAO1jB,KAAOjG,EAAOiG,SAE1C9G,KAAKsC,KAAM,WACjBzB,EAAOue,MAAM3E,IAAKza,KAAMskB,EAAOtjB,EAAIuE,EAAMzE,MAG3CypB,IAAK,SAAUjG,EAAOxjB,EAAUyE,EAAMvE,GACrC,MAAOhB,MAAKsqB,GAAIhG,EAAOxjB,EAAUyE,EAAMvE,EAAI,IAE5C+d,IAAK,SAAUuF,EAAOxjB,EAAUE,GAC/B,GAAI4jB,GAAWhgB,CACf,IAAK0f,GAASA,EAAMkC,gBAAkBlC,EAAMM,UAQ3C,MANAA,GAAYN,EAAMM,UAClB/jB,EAAQyjB,EAAMuC,gBAAiB9H,IAC9B6F,EAAUU,UAAYV,EAAUG,SAAW,IAAMH,EAAUU,UAAYV,EAAUG,SACjFH,EAAU9jB,SACV8jB,EAAU/W,SAEJ7N,IAER,IAAsB,gBAAVskB,GAAqB,CAEhC,IAAM1f,IAAQ0f,GACbtkB,KAAK+e,IAAKna,EAAM9D,EAAUwjB,EAAO1f,GAElC,OAAO5E,MAUR,OARKc,KAAa,GAA6B,kBAAbA,MAEjCE,EAAKF,EACLA,EAAWoD,QAEPlD,KAAO,IACXA,EAAKmjB,IAECnkB,KAAKsC,KAAK,WAChBzB,EAAOue,MAAM/C,OAAQrc,KAAMskB,EAAOtjB,EAAIF,MAIxC+kB,QAAS,SAAUjhB,EAAMW,GACxB,MAAOvF,MAAKsC,KAAK,WAChBzB,EAAOue,MAAMyG,QAASjhB,EAAMW,EAAMvF,SAGpC8e,eAAgB,SAAUla,EAAMW,GAC/B,GAAI7C,GAAO1C,KAAK,EAChB,OAAK0C,GACG7B,EAAOue,MAAMyG,QAASjhB,EAAMW,EAAM7C,GAAM,GADhD,SAOF,SAAS+nB,IAAoB7qB,GAC5B,GAAIqJ,GAAOyhB,GAAUvjB,MAAO,KAC3BwjB,EAAW/qB,EAASkjB,wBAErB,IAAK6H,EAASld,cACb,MAAQxE,EAAKrH,OACZ+oB,EAASld,cACRxE,EAAKF,MAIR,OAAO4hB,GAGR,GAAID,IAAY,6JAEfE,GAAgB,6BAChBC,GAAe,GAAIphB,QAAO,OAASihB,GAAY,WAAY,KAC3DI,GAAqB,OACrBC,GAAY,0EACZC,GAAW,YACXC,GAAS,UACTC,GAAQ,YACRC,GAAe,0BAEfC,GAAW,oCACXC,GAAc,4BACdC,GAAoB,cACpBC,GAAe,2CAGfC,IACCC,QAAU,EAAG,+BAAgC,aAC7CC,QAAU,EAAG,aAAc,eAC3BC,MAAQ,EAAG,QAAS,UACpBC,OAAS,EAAG,WAAY,aACxBC,OAAS,EAAG,UAAW,YACvBC,IAAM,EAAG,iBAAkB,oBAC3BC,KAAO,EAAG,mCAAoC,uBAC9CC,IAAM,EAAG,qBAAsB,yBAI/BtF,SAAU/lB,EAAQsiB,eAAkB,EAAG,GAAI,KAAS,EAAG,SAAU,WAElEgJ,GAAexB,GAAoB7qB,GACnCssB,GAAcD,GAAa9c,YAAavP,EAAS6N,cAAc,OAEhE+d,IAAQW,SAAWX,GAAQC,OAC3BD,GAAQxI,MAAQwI,GAAQY,MAAQZ,GAAQa,SAAWb,GAAQc,QAAUd,GAAQK,MAC7EL,GAAQe,GAAKf,GAAQQ,EAErB,SAASQ,IAAQzrB,EAAS4O,GACzB,GAAIzN,GAAOQ,EACVC,EAAI,EACJ8pB,QAAe1rB,GAAQuL,uBAAyBmT,EAAe1e,EAAQuL,qBAAsBqD,GAAO,WAC5F5O,GAAQgM,mBAAqB0S,EAAe1e,EAAQgM,iBAAkB4C,GAAO,KACpFzL,MAEF,KAAMuoB,EACL,IAAMA,KAAYvqB,EAAQnB,EAAQwK,YAAcxK,EAA8B,OAApB2B,EAAOR,EAAMS,IAAaA,KAC7EgN,GAAO9O,EAAO+E,SAAUlD,EAAMiN,GACnC8c,EAAMpsB,KAAMqC,GAEZ7B,EAAOuB,MAAOqqB,EAAOD,GAAQ9pB,EAAMiN,GAKtC,OAAezL,UAARyL,GAAqBA,GAAO9O,EAAO+E,SAAU7E,EAAS4O,GAC5D9O,EAAOuB,OAASrB,GAAW0rB,GAC3BA,EAIF,QAASC,IAAmBhqB,GACtBkgB,EAAenW,KAAM/J,EAAKkC,QAC9BlC,EAAKiqB,eAAiBjqB,EAAK8R,SAM7B,QAASoY,IAAoBlqB,EAAMmqB,GAClC,MAAOhsB,GAAO+E,SAAUlD,EAAM,UAC7B7B,EAAO+E,SAA+B,KAArBinB,EAAQ1nB,SAAkB0nB,EAAUA,EAAQtb,WAAY,MAEzE7O,EAAK4J,qBAAqB,SAAS,IAClC5J,EAAKyM,YAAazM,EAAKuJ,cAAcwB,cAAc,UACpD/K,EAIF,QAASoqB,IAAepqB,GAEvB,MADAA,GAAKkC,MAA6C,OAArC/D,EAAO0O,KAAKwB,KAAMrO,EAAM,SAAqB,IAAMA,EAAKkC,KAC9DlC,EAER,QAASqqB,IAAerqB,GACvB,GAAIgJ,GAAQ4f,GAAkBpf,KAAMxJ,EAAKkC,KAMzC,OALK8G,GACJhJ,EAAKkC,KAAO8G,EAAM,GAElBhJ,EAAKuK,gBAAgB,QAEfvK,EAIR,QAASsqB,IAAe9qB,EAAO+qB,GAG9B,IAFA,GAAIvqB,GACHC,EAAI,EACwB,OAApBD,EAAOR,EAAMS,IAAaA,IAClC9B,EAAOwgB,MAAO3e,EAAM,cAAeuqB,GAAepsB,EAAOwgB,MAAO4L,EAAYtqB,GAAI,eAIlF,QAASuqB,IAAgB3pB,EAAK4pB,GAE7B,GAAuB,IAAlBA,EAAKhoB,UAAmBtE,EAAOsgB,QAAS5d,GAA7C,CAIA,GAAIqB,GAAMjC,EAAG0X,EACZ+S,EAAUvsB,EAAOwgB,MAAO9d,GACxB8pB,EAAUxsB,EAAOwgB,MAAO8L,EAAMC,GAC9B7I,EAAS6I,EAAQ7I,MAElB,IAAKA,EAAS,OACN8I,GAAQpI,OACfoI,EAAQ9I,SAER,KAAM3f,IAAQ2f,GACb,IAAM5hB,EAAI,EAAG0X,EAAIkK,EAAQ3f,GAAOhD,OAAYyY,EAAJ1X,EAAOA,IAC9C9B,EAAOue,MAAM3E,IAAK0S,EAAMvoB,EAAM2f,EAAQ3f,GAAQjC,IAM5C0qB,EAAQ9nB,OACZ8nB,EAAQ9nB,KAAO1E,EAAOyC,UAAY+pB,EAAQ9nB,QAI5C,QAAS+nB,IAAoB/pB,EAAK4pB,GACjC,GAAIvnB,GAAUR,EAAGG,CAGjB,IAAuB,IAAlB4nB,EAAKhoB,SAAV,CAOA,GAHAS,EAAWunB,EAAKvnB,SAASC,eAGnBlF,EAAQ6iB,cAAgB2J,EAAMtsB,EAAOsD,SAAY,CACtDoB,EAAO1E,EAAOwgB,MAAO8L,EAErB,KAAM/nB,IAAKG,GAAKgf,OACf1jB,EAAO+kB,YAAauH,EAAM/nB,EAAGG,EAAK0f,OAInCkI,GAAKlgB,gBAAiBpM,EAAOsD,SAIZ,WAAbyB,GAAyBunB,EAAKnnB,OAASzC,EAAIyC,MAC/C8mB,GAAeK,GAAOnnB,KAAOzC,EAAIyC,KACjC+mB,GAAeI,IAIS,WAAbvnB,GACNunB,EAAK/gB,aACT+gB,EAAK/J,UAAY7f,EAAI6f,WAOjBziB,EAAQuiB,YAAgB3f,EAAIqM,YAAc/O,EAAO2E,KAAK2nB,EAAKvd,aAC/Dud,EAAKvd,UAAYrM,EAAIqM,YAGE,UAAbhK,GAAwBgd,EAAenW,KAAMlJ,EAAIqB,OAK5DuoB,EAAKR,eAAiBQ,EAAK3Y,QAAUjR,EAAIiR,QAIpC2Y,EAAKrnB,QAAUvC,EAAIuC,QACvBqnB,EAAKrnB,MAAQvC,EAAIuC,QAKM,WAAbF,EACXunB,EAAKI,gBAAkBJ,EAAK1Y,SAAWlR,EAAIgqB,iBAInB,UAAb3nB,GAAqC,aAAbA,KACnCunB,EAAKxU,aAAepV,EAAIoV,eAI1B9X,EAAOyC,QACNM,MAAO,SAAUlB,EAAM8qB,EAAeC,GACrC,GAAIC,GAAchf,EAAM9K,EAAOjB,EAAGgrB,EACjCC,EAAS/sB,EAAOsH,SAAUzF,EAAKuJ,cAAevJ,EAW/C,IATK/B,EAAQuiB,YAAcriB,EAAOgY,SAASnW,KAAUmoB,GAAape,KAAM,IAAM/J,EAAKkD,SAAW,KAC7FhC,EAAQlB,EAAKygB,WAAW,IAIxB+I,GAAYtc,UAAYlN,EAAK0gB,UAC7B8I,GAAYxe,YAAa9J,EAAQsoB,GAAY3a,eAGvC5Q,EAAQ6iB,cAAiB7iB,EAAQ2iB,gBACnB,IAAlB5gB,EAAKyC,UAAoC,KAAlBzC,EAAKyC,UAAqBtE,EAAOgY,SAASnW,IAOnE,IAJAgrB,EAAelB,GAAQ5oB,GACvB+pB,EAAcnB,GAAQ9pB,GAGhBC,EAAI,EAA8B,OAA1B+L,EAAOif,EAAYhrB,MAAeA,EAE1C+qB,EAAa/qB,IACjB2qB,GAAoB5e,EAAMgf,EAAa/qB,GAM1C,IAAK6qB,EACJ,GAAKC,EAIJ,IAHAE,EAAcA,GAAenB,GAAQ9pB,GACrCgrB,EAAeA,GAAgBlB,GAAQ5oB,GAEjCjB,EAAI,EAA8B,OAA1B+L,EAAOif,EAAYhrB,IAAaA,IAC7CuqB,GAAgBxe,EAAMgf,EAAa/qB,QAGpCuqB,IAAgBxqB,EAAMkB,EAaxB,OARA8pB,GAAelB,GAAQ5oB,EAAO,UACzB8pB,EAAa9rB,OAAS,GAC1BorB,GAAeU,GAAeE,GAAUpB,GAAQ9pB,EAAM,WAGvDgrB,EAAeC,EAAcjf,EAAO,KAG7B9K,GAGRiqB,cAAe,SAAU3rB,EAAOnB,EAAS+sB,EAASC,GAWjD,IAVA,GAAI7qB,GAAGR,EAAMyF,EACZnB,EAAK2I,EAAKqT,EAAOgL,EACjB3T,EAAInY,EAAMN,OAGVqsB,EAAOxD,GAAoB1pB,GAE3BmtB,KACAvrB,EAAI,EAEO0X,EAAJ1X,EAAOA,IAGd,GAFAD,EAAOR,EAAOS,GAETD,GAAiB,IAATA,EAGZ,GAA6B,WAAxB7B,EAAO+D,KAAMlC,GACjB7B,EAAOuB,MAAO8rB,EAAOxrB,EAAKyC,UAAazC,GAASA,OAG1C,IAAMwoB,GAAMze,KAAM/J,GAIlB,CACNsE,EAAMA,GAAOinB,EAAK9e,YAAapO,EAAQ0M,cAAc,QAGrDkC,GAAOqb,GAAS9e,KAAMxJ,KAAY,GAAI,KAAO,GAAImD,cACjDmoB,EAAOxC,GAAS7b,IAAS6b,GAAQ9E,SAEjC1f,EAAI4I,UAAYoe,EAAK,GAAKtrB,EAAK4B,QAASymB,GAAW,aAAgBiD,EAAK,GAGxE9qB,EAAI8qB,EAAK,EACT,OAAQ9qB,IACP8D,EAAMA,EAAIkM,SASX,KALMvS,EAAQoiB,mBAAqB+H,GAAmBre,KAAM/J,IAC3DwrB,EAAM7tB,KAAMU,EAAQotB,eAAgBrD,GAAmB5e,KAAMxJ,GAAO,MAI/D/B,EAAQqiB,MAAQ,CAGrBtgB,EAAe,UAARiN,GAAoBsb,GAAOxe,KAAM/J,GAI3B,YAAZsrB,EAAK,IAAqB/C,GAAOxe,KAAM/J,GAEtC,EADAsE,EAJDA,EAAIuK,WAOLrO,EAAIR,GAAQA,EAAK6I,WAAW3J,MAC5B,OAAQsB,IACFrC,EAAO+E,SAAWod,EAAQtgB,EAAK6I,WAAWrI,GAAK,WAAc8f,EAAMzX,WAAW3J,QAClFc,EAAKgL,YAAasV,GAKrBniB,EAAOuB,MAAO8rB,EAAOlnB,EAAIuE,YAGzBvE,EAAIsK,YAAc,EAGlB,OAAQtK,EAAIuK,WACXvK,EAAI0G,YAAa1G,EAAIuK,WAItBvK,GAAMinB,EAAK/a,cAtDXgb,GAAM7tB,KAAMU,EAAQotB,eAAgBzrB,GA4DlCsE,IACJinB,EAAKvgB,YAAa1G,GAKbrG,EAAQ0iB,eACbxiB,EAAO2F,KAAMgmB,GAAQ0B,EAAO,SAAWxB,IAGxC/pB,EAAI,CACJ,OAASD,EAAOwrB,EAAOvrB,KAItB,KAAKorB,GAAmD,KAAtCltB,EAAOwF,QAAS3D,EAAMqrB,MAIxC5lB,EAAWtH,EAAOsH,SAAUzF,EAAKuJ,cAAevJ,GAGhDsE,EAAMwlB,GAAQyB,EAAK9e,YAAazM,GAAQ,UAGnCyF,GACJ6kB,GAAehmB,GAIX8mB,GAAU,CACd5qB,EAAI,CACJ,OAASR,EAAOsE,EAAK9D,KACfmoB,GAAY5e,KAAM/J,EAAKkC,MAAQ,KACnCkpB,EAAQztB,KAAMqC,GAQlB,MAFAsE,GAAM,KAECinB,GAGRlN,UAAW,SAAU7e,EAAsB+d,GAQ1C,IAPA,GAAIvd,GAAMkC,EAAMyH,EAAI9G,EACnB5C,EAAI,EACJge,EAAc9f,EAAOsD,QACrBgJ,EAAQtM,EAAOsM,MACf6S,EAAgBrf,EAAQqf,cACxB0E,EAAU7jB,EAAOue,MAAMsF,QAEK,OAApBhiB,EAAOR,EAAMS,IAAaA,IAClC,IAAKsd,GAAcpf,EAAOof,WAAYvd,MAErC2J,EAAK3J,EAAMie,GACXpb,EAAO8G,GAAMc,EAAOd,IAER,CACX,GAAK9G,EAAKgf,OACT,IAAM3f,IAAQW,GAAKgf,OACbG,EAAS9f,GACb/D,EAAOue,MAAM/C,OAAQ3Z,EAAMkC,GAI3B/D,EAAO+kB,YAAaljB,EAAMkC,EAAMW,EAAK0f,OAMnC9X,GAAOd,WAEJc,GAAOd,GAKT2T,QACGtd,GAAMie,SAEKje,GAAKuK,kBAAoBwS,EAC3C/c,EAAKuK,gBAAiB0T,GAGtBje,EAAMie,GAAgB,KAGvBzgB,EAAWG,KAAMgM,QAQvBxL,EAAOG,GAAGsC,QACT0C,KAAM,SAAUF,GACf,MAAOyc,GAAQviB,KAAM,SAAU8F,GAC9B,MAAiB5B,UAAV4B,EACNjF,EAAOmF,KAAMhG,MACbA,KAAK2U,QAAQyZ,QAAUpuB,KAAK,IAAMA,KAAK,GAAGiM,eAAiBrM,GAAWuuB,eAAgBroB,KACrF,KAAMA,EAAOjD,UAAUjB,SAG3BwsB,OAAQ,WACP,MAAOpuB,MAAKquB,SAAUxrB,UAAW,SAAUH,GAC1C,GAAuB,IAAlB1C,KAAKmF,UAAoC,KAAlBnF,KAAKmF,UAAqC,IAAlBnF,KAAKmF,SAAiB,CACzE,GAAItB,GAAS+oB,GAAoB5sB,KAAM0C,EACvCmB,GAAOsL,YAAazM,OAKvB4rB,QAAS,WACR,MAAOtuB,MAAKquB,SAAUxrB,UAAW,SAAUH,GAC1C,GAAuB,IAAlB1C,KAAKmF,UAAoC,KAAlBnF,KAAKmF,UAAqC,IAAlBnF,KAAKmF,SAAiB,CACzE,GAAItB,GAAS+oB,GAAoB5sB,KAAM0C,EACvCmB,GAAO0qB,aAAc7rB,EAAMmB,EAAO0N,gBAKrCid,OAAQ,WACP,MAAOxuB,MAAKquB,SAAUxrB,UAAW,SAAUH,GACrC1C,KAAKoM,YACTpM,KAAKoM,WAAWmiB,aAAc7rB,EAAM1C,SAKvCyuB,MAAO,WACN,MAAOzuB,MAAKquB,SAAUxrB,UAAW,SAAUH,GACrC1C,KAAKoM,YACTpM,KAAKoM,WAAWmiB,aAAc7rB,EAAM1C,KAAKmO,gBAK5CkO,OAAQ,SAAUvb,EAAU4tB,GAK3B,IAJA,GAAIhsB,GACHR,EAAQpB,EAAWD,EAAO2O,OAAQ1O,EAAUd,MAASA,KACrD2C,EAAI,EAEwB,OAApBD,EAAOR,EAAMS,IAAaA,IAE5B+rB,GAA8B,IAAlBhsB,EAAKyC,UACtBtE,EAAOkgB,UAAWyL,GAAQ9pB,IAGtBA,EAAK0J,aACJsiB,GAAY7tB,EAAOsH,SAAUzF,EAAKuJ,cAAevJ,IACrDsqB,GAAeR,GAAQ9pB,EAAM,WAE9BA,EAAK0J,WAAWsB,YAAahL,GAI/B,OAAO1C,OAGR2U,MAAO,WAIN,IAHA,GAAIjS,GACHC,EAAI,EAEuB,OAAnBD,EAAO1C,KAAK2C,IAAaA,IAAM,CAEhB,IAAlBD,EAAKyC,UACTtE,EAAOkgB,UAAWyL,GAAQ9pB,GAAM,GAIjC,OAAQA,EAAK6O,WACZ7O,EAAKgL,YAAahL,EAAK6O,WAKnB7O,GAAKiB,SAAW9C,EAAO+E,SAAUlD,EAAM,YAC3CA,EAAKiB,QAAQ/B,OAAS,GAIxB,MAAO5B,OAGR4D,MAAO,SAAU4pB,EAAeC,GAI/B,MAHAD,GAAiC,MAAjBA,GAAwB,EAAQA,EAChDC,EAAyC,MAArBA,EAA4BD,EAAgBC,EAEzDztB,KAAKyC,IAAI,WACf,MAAO5B,GAAO+C,MAAO5D,KAAMwtB,EAAeC,MAI5CkB,KAAM,SAAU7oB,GACf,MAAOyc,GAAQviB,KAAM,SAAU8F,GAC9B,GAAIpD,GAAO1C,KAAM,OAChB2C,EAAI,EACJ0X,EAAIra,KAAK4B,MAEV,IAAesC,SAAV4B,EACJ,MAAyB,KAAlBpD,EAAKyC,SACXzC,EAAKkN,UAAUtL,QAASsmB,GAAe,IACvC1mB,MAIF,MAAsB,gBAAV4B,IAAuBqlB,GAAa1e,KAAM3G,KACnDnF,EAAQsiB,eAAkB4H,GAAape,KAAM3G,KAC7CnF,EAAQoiB,mBAAsB+H,GAAmBre,KAAM3G,IACxD0lB,IAAUR,GAAS9e,KAAMpG,KAAa,GAAI,KAAO,GAAID,gBAAkB,CAExEC,EAAQA,EAAMxB,QAASymB,GAAW,YAElC,KACC,KAAW1Q,EAAJ1X,EAAOA,IAEbD,EAAO1C,KAAK2C,OACW,IAAlBD,EAAKyC,WACTtE,EAAOkgB,UAAWyL,GAAQ9pB,GAAM,IAChCA,EAAKkN,UAAY9J,EAInBpD,GAAO,EAGN,MAAM0C,KAGJ1C,GACJ1C,KAAK2U,QAAQyZ,OAAQtoB,IAEpB,KAAMA,EAAOjD,UAAUjB,SAG3BgtB,YAAa,WACZ,GAAI/nB,GAAMhE,UAAW,EAcrB,OAXA7C,MAAKquB,SAAUxrB,UAAW,SAAUH,GACnCmE,EAAM7G,KAAKoM,WAEXvL,EAAOkgB,UAAWyL,GAAQxsB,OAErB6G,GACJA,EAAIgoB,aAAcnsB,EAAM1C,QAKnB6G,IAAQA,EAAIjF,QAAUiF,EAAI1B,UAAYnF,KAAOA,KAAKqc,UAG1D2C,OAAQ,SAAUle,GACjB,MAAOd,MAAKqc,OAAQvb,GAAU,IAG/ButB,SAAU,SAAU7rB,EAAMD,GAGzBC,EAAOpC,EAAOwC,SAAWJ,EAEzB,IAAIM,GAAO4L,EAAMogB,EAChBhB,EAASjf,EAAKgU,EACdlgB,EAAI,EACJ0X,EAAIra,KAAK4B,OACTmtB,EAAM/uB,KACNgvB,EAAW3U,EAAI,EACfvU,EAAQtD,EAAK,GACbuB,EAAalD,EAAOkD,WAAY+B,EAGjC,IAAK/B,GACDsW,EAAI,GAAsB,gBAAVvU,KAChBnF,EAAQ4iB,YAAc6H,GAAS3e,KAAM3G,GACxC,MAAO9F,MAAKsC,KAAK,SAAUiY,GAC1B,GAAIpB,GAAO4V,EAAIhsB,GAAIwX,EACdxW,KACJvB,EAAK,GAAKsD,EAAMhE,KAAM9B,KAAMua,EAAOpB,EAAKwV,SAEzCxV,EAAKkV,SAAU7rB,EAAMD,IAIvB,IAAK8X,IACJwI,EAAWhiB,EAAOgtB,cAAerrB,EAAMxC,KAAM,GAAIiM,eAAe,EAAOjM,MACvE8C,EAAQ+f,EAAStR,WAEmB,IAA/BsR,EAAStX,WAAW3J,SACxBihB,EAAW/f,GAGPA,GAAQ,CAMZ,IALAgrB,EAAUjtB,EAAO4B,IAAK+pB,GAAQ3J,EAAU,UAAYiK,IACpDgC,EAAahB,EAAQlsB,OAITyY,EAAJ1X,EAAOA,IACd+L,EAAOmU,EAEFlgB,IAAMqsB,IACVtgB,EAAO7N,EAAO+C,MAAO8K,GAAM,GAAM,GAG5BogB,GACJjuB,EAAOuB,MAAO0rB,EAAStB,GAAQ9d,EAAM,YAIvCnM,EAAST,KAAM9B,KAAK2C,GAAI+L,EAAM/L,EAG/B,IAAKmsB,EAOJ,IANAjgB,EAAMif,EAASA,EAAQlsB,OAAS,GAAIqK,cAGpCpL,EAAO4B,IAAKqrB,EAASf,IAGfpqB,EAAI,EAAOmsB,EAAJnsB,EAAgBA,IAC5B+L,EAAOof,EAASnrB,GACX0oB,GAAY5e,KAAMiC,EAAK9J,MAAQ,MAClC/D,EAAOwgB,MAAO3S,EAAM,eAAkB7N,EAAOsH,SAAU0G,EAAKH,KAExDA,EAAKnL,IAEJ1C,EAAOouB,UACXpuB,EAAOouB,SAAUvgB,EAAKnL,KAGvB1C,EAAOyE,YAAcoJ,EAAK1I,MAAQ0I,EAAK4C,aAAe5C,EAAKkB,WAAa,IAAKtL,QAASinB,GAAc,KAOxG1I,GAAW/f,EAAQ,KAIrB,MAAO9C,SAITa,EAAOyB,MACN4sB,SAAU,SACVC,UAAW,UACXZ,aAAc,SACda,YAAa,QACbC,WAAY,eACV,SAAU3rB,EAAMmkB,GAClBhnB,EAAOG,GAAI0C,GAAS,SAAU5C,GAO7B,IANA,GAAIoB,GACHS,EAAI,EACJR,KACAmtB,EAASzuB,EAAQC,GACjBkC,EAAOssB,EAAO1tB,OAAS,EAEXoB,GAALL,EAAWA,IAClBT,EAAQS,IAAMK,EAAOhD,KAAOA,KAAK4D,OAAM,GACvC/C,EAAQyuB,EAAO3sB,IAAMklB,GAAY3lB,GAGjC7B,EAAKuC,MAAOT,EAAKD,EAAMH,MAGxB,OAAO/B,MAAKiC,UAAWE,KAKzB,IAAIotB,IACHC,KAQD,SAASC,IAAe/rB,EAAMmL,GAC7B,GAAI+Q,GACHld,EAAO7B,EAAQgO,EAAIpB,cAAe/J,IAASwrB,SAAUrgB,EAAI+P,MAGzD8Q,EAAU3vB,EAAO4vB,0BAA6B/P,EAAQ7f,EAAO4vB,wBAAyBjtB,EAAM,KAI3Fkd,EAAM8P,QAAU7uB,EAAOyhB,IAAK5f,EAAM,GAAK,UAMzC,OAFAA,GAAKsc,SAEE0Q,EAOR,QAASE,IAAgBhqB,GACxB,GAAIiJ,GAAMjP,EACT8vB,EAAUF,GAAa5pB,EA0BxB,OAxBM8pB,KACLA,EAAUD,GAAe7pB,EAAUiJ,GAGlB,SAAZ6gB,GAAuBA,IAG3BH,IAAUA,IAAU1uB,EAAQ,mDAAoDquB,SAAUrgB,EAAIJ,iBAG9FI,GAAQ0gB,GAAQ,GAAIrU,eAAiBqU,GAAQ,GAAItU,iBAAkBrb,SAGnEiP,EAAIghB,QACJhhB,EAAIihB,QAEJJ,EAAUD,GAAe7pB,EAAUiJ,GACnC0gB,GAAOvQ,UAIRwQ,GAAa5pB,GAAa8pB,GAGpBA,GAIR,WACC,GAAIK,EAEJpvB,GAAQqvB,iBAAmB,WAC1B,GAA4B,MAAvBD,EACJ,MAAOA,EAIRA,IAAsB,CAGtB,IAAIviB,GAAKoR,EAAMe,CAGf,OADAf,GAAOhf,EAAS0M,qBAAsB,QAAU,GAC1CsS,GAASA,EAAKgB,OAMpBpS,EAAM5N,EAAS6N,cAAe,OAC9BkS,EAAY/f,EAAS6N,cAAe,OACpCkS,EAAUC,MAAMC,QAAU,iEAC1BjB,EAAKzP,YAAawQ,GAAYxQ,YAAa3B,SAI/BA,GAAIoS,MAAME,OAASL,IAE9BjS,EAAIoS,MAAMC,QAGT,iJAGDrS,EAAI2B,YAAavP,EAAS6N,cAAe,QAAUmS,MAAMqQ,MAAQ,MACjEF,EAA0C,IAApBviB,EAAIuS,aAG3BnB,EAAKlR,YAAaiS,GAEXoQ,GA3BP,UA+BF,IAAIG,IAAU,UAEVC,GAAY,GAAI1mB,QAAQ,KAAOwY,EAAO,kBAAmB,KAIzDmO,GAAWC,GACdC,GAAY,2BAERvwB,GAAOwwB,kBACXH,GAAY,SAAU1tB,GAIrB,MAAKA,GAAKuJ,cAAc6C,YAAY0hB,OAC5B9tB,EAAKuJ,cAAc6C,YAAYyhB,iBAAkB7tB,EAAM,MAGxD3C,EAAOwwB,iBAAkB7tB,EAAM,OAGvC2tB,GAAS,SAAU3tB,EAAMgB,EAAM+sB,GAC9B,GAAIR,GAAOS,EAAUC,EAAUxuB,EAC9Byd,EAAQld,EAAKkd,KAqCd,OAnCA6Q,GAAWA,GAAYL,GAAW1tB,GAGlCP,EAAMsuB,EAAWA,EAASG,iBAAkBltB,IAAU+sB,EAAU/sB,GAASQ,OAEpEusB,IAES,KAARtuB,GAAetB,EAAOsH,SAAUzF,EAAKuJ,cAAevJ,KACxDP,EAAMtB,EAAO+e,MAAOld,EAAMgB,IAOtBysB,GAAU1jB,KAAMtK,IAAS+tB,GAAQzjB,KAAM/I,KAG3CusB,EAAQrQ,EAAMqQ,MACdS,EAAW9Q,EAAM8Q,SACjBC,EAAW/Q,EAAM+Q,SAGjB/Q,EAAM8Q,SAAW9Q,EAAM+Q,SAAW/Q,EAAMqQ,MAAQ9tB,EAChDA,EAAMsuB,EAASR,MAGfrQ,EAAMqQ,MAAQA,EACdrQ,EAAM8Q,SAAWA,EACjB9Q,EAAM+Q,SAAWA,IAMJzsB,SAAR/B,EACNA,EACAA,EAAM,KAEGvC,EAAS6O,gBAAgBoiB,eACpCT,GAAY,SAAU1tB,GACrB,MAAOA,GAAKmuB,cAGbR,GAAS,SAAU3tB,EAAMgB,EAAM+sB,GAC9B,GAAIK,GAAMC,EAAIC,EAAQ7uB,EACrByd,EAAQld,EAAKkd,KAyCd,OAvCA6Q,GAAWA,GAAYL,GAAW1tB,GAClCP,EAAMsuB,EAAWA,EAAU/sB,GAASQ,OAIxB,MAAP/B,GAAeyd,GAASA,EAAOlc,KACnCvB,EAAMyd,EAAOlc,IAUTysB,GAAU1jB,KAAMtK,KAAUmuB,GAAU7jB,KAAM/I,KAG9CotB,EAAOlR,EAAMkR,KACbC,EAAKruB,EAAKuuB,aACVD,EAASD,GAAMA,EAAGD,KAGbE,IACJD,EAAGD,KAAOpuB,EAAKmuB,aAAaC,MAE7BlR,EAAMkR,KAAgB,aAATptB,EAAsB,MAAQvB,EAC3CA,EAAMyd,EAAMsR,UAAY,KAGxBtR,EAAMkR,KAAOA,EACRE,IACJD,EAAGD,KAAOE,IAMG9sB,SAAR/B,EACNA,EACAA,EAAM,IAAM,QAOf,SAASgvB,IAAcC,EAAaC,GAEnC,OACCtvB,IAAK,WACJ,GAAIuvB,GAAYF,GAEhB,IAAkB,MAAbE,EAML,MAAKA,cAIGtxB,MAAK+B,KAML/B,KAAK+B,IAAMsvB,GAAQzuB,MAAO5C,KAAM6C,cAM3C,WAEC,GAAI2K,GAAKoS,EAAOhX,EAAG2oB,EAAkBC,EACpCC,EAA0BC,CAS3B,IANAlkB,EAAM5N,EAAS6N,cAAe,OAC9BD,EAAIoC,UAAY,qEAChBhH,EAAI4E,EAAIlB,qBAAsB,KAAO,GACrCsT,EAAQhX,GAAKA,EAAEgX,MAGf,CAIAA,EAAMC,QAAU,wBAIhBlf,EAAQgxB,QAA4B,QAAlB/R,EAAM+R,QAIxBhxB,EAAQixB,WAAahS,EAAMgS,SAE3BpkB,EAAIoS,MAAMiS,eAAiB,cAC3BrkB,EAAI2V,WAAW,GAAOvD,MAAMiS,eAAiB,GAC7ClxB,EAAQmxB,gBAA+C,gBAA7BtkB,EAAIoS,MAAMiS,eAIpClxB,EAAQoxB,UAAgC,KAApBnS,EAAMmS,WAA2C,KAAvBnS,EAAMoS,cACzB,KAA1BpS,EAAMqS,gBAEPpxB,EAAOyC,OAAO3C,GACbuxB,sBAAuB,WAItB,MAHiC,OAA5BT,GACJU,IAEMV,GAGRW,kBAAmB,WAIlB,MAH6B,OAAxBZ,GACJW,IAEMX,GAGRa,cAAe,WAId,MAHyB,OAApBd,GACJY,IAEMZ,GAIRe,oBAAqB,WAIpB,MAH+B,OAA1BZ,GACJS,IAEMT,IAIT,SAASS,KAER,GAAI3kB,GAAKoR,EAAMe,EAAW/F,CAE1BgF,GAAOhf,EAAS0M,qBAAsB,QAAU,GAC1CsS,GAASA,EAAKgB,QAMpBpS,EAAM5N,EAAS6N,cAAe,OAC9BkS,EAAY/f,EAAS6N,cAAe,OACpCkS,EAAUC,MAAMC,QAAU,iEAC1BjB,EAAKzP,YAAawQ,GAAYxQ,YAAa3B,GAE3CA,EAAIoS,MAAMC,QAGT,uKAMD0R,EAAmBC,GAAuB,EAC1CE,GAAyB,EAGpB3xB,EAAOwwB,mBACXgB,EAA0E,QAArDxxB,EAAOwwB,iBAAkB/iB,EAAK,WAAeuB,IAClEyiB,EACwE,SAArEzxB,EAAOwwB,iBAAkB/iB,EAAK,QAAYyiB,MAAO,QAAUA,MAM9DrW,EAAWpM,EAAI2B,YAAavP,EAAS6N,cAAe,QAGpDmM,EAASgG,MAAMC,QAAUrS,EAAIoS,MAAMC,QAGlC,8HAEDjG,EAASgG,MAAM2S,YAAc3Y,EAASgG,MAAMqQ,MAAQ,IACpDziB,EAAIoS,MAAMqQ,MAAQ,MAElByB,GACE1sB,YAAcjF,EAAOwwB,iBAAkB3W,EAAU,WAAe2Y,aAElE/kB,EAAIE,YAAakM,IAUlBpM,EAAIoC,UAAY,8CAChBgK,EAAWpM,EAAIlB,qBAAsB,MACrCsN,EAAU,GAAIgG,MAAMC,QAAU,2CAC9B4R,EAA0D,IAA/B7X,EAAU,GAAI4Y,aACpCf,IACJ7X,EAAU,GAAIgG,MAAM8P,QAAU,GAC9B9V,EAAU,GAAIgG,MAAM8P,QAAU,OAC9B+B,EAA0D,IAA/B7X,EAAU,GAAI4Y,cAG1C5T,EAAKlR,YAAaiS,SAOpB9e,EAAO4xB,KAAO,SAAU/vB,EAAMiB,EAASpB,EAAUC,GAChD,GAAIL,GAAKuB,EACRmI,IAGD,KAAMnI,IAAQC,GACbkI,EAAKnI,GAAShB,EAAKkd,MAAOlc,GAC1BhB,EAAKkd,MAAOlc,GAASC,EAASD,EAG/BvB,GAAMI,EAASK,MAAOF,EAAMF,MAG5B,KAAMkB,IAAQC,GACbjB,EAAKkd,MAAOlc,GAASmI,EAAKnI,EAG3B,OAAOvB,GAIR,IACEuwB,IAAS,kBACVC,GAAW,wBAIXC,GAAe,4BACfC,GAAY,GAAIppB,QAAQ,KAAOwY,EAAO,SAAU,KAChD6Q,GAAU,GAAIrpB,QAAQ,YAAcwY,EAAO,IAAK,KAEhD8Q,IAAYC,SAAU,WAAYC,WAAY,SAAUvD,QAAS,SACjEwD,IACCC,cAAe,IACfC,WAAY,OAGbC,IAAgB,SAAU,IAAK,MAAO,KAIvC,SAASC,IAAgB1T,EAAOlc,GAG/B,GAAKA,IAAQkc,GACZ,MAAOlc,EAIR,IAAI6vB,GAAU7vB,EAAK4V,OAAO,GAAG9X,cAAgBkC,EAAKvD,MAAM,GACvDqzB,EAAW9vB,EACXf,EAAI0wB,GAAYzxB,MAEjB,OAAQe,IAEP,GADAe,EAAO2vB,GAAa1wB,GAAM4wB,EACrB7vB,IAAQkc,GACZ,MAAOlc,EAIT,OAAO8vB,GAGR,QAASC,IAAU3iB,EAAU4iB,GAM5B,IALA,GAAIhE,GAAShtB,EAAMixB,EAClB1V,KACA1D,EAAQ,EACR3Y,EAASkP,EAASlP,OAEHA,EAAR2Y,EAAgBA,IACvB7X,EAAOoO,EAAUyJ,GACX7X,EAAKkd,QAIX3B,EAAQ1D,GAAU1Z,EAAOwgB,MAAO3e,EAAM,cACtCgtB,EAAUhtB,EAAKkd,MAAM8P,QAChBgE,GAGEzV,EAAQ1D,IAAuB,SAAZmV,IACxBhtB,EAAKkd,MAAM8P,QAAU,IAMM,KAAvBhtB,EAAKkd,MAAM8P,SAAkBtN,EAAU1f,KAC3Cub,EAAQ1D,GAAU1Z,EAAOwgB,MAAO3e,EAAM,aAAcktB,GAAeltB,EAAKkD,cAGzE+tB,EAASvR,EAAU1f,IAEdgtB,GAAuB,SAAZA,IAAuBiE,IACtC9yB,EAAOwgB,MAAO3e,EAAM,aAAcixB,EAASjE,EAAU7uB,EAAOyhB,IAAK5f,EAAM,aAO1E,KAAM6X,EAAQ,EAAW3Y,EAAR2Y,EAAgBA,IAChC7X,EAAOoO,EAAUyJ,GACX7X,EAAKkd,QAGL8T,GAA+B,SAAvBhxB,EAAKkd,MAAM8P,SAA6C,KAAvBhtB,EAAKkd,MAAM8P,UACzDhtB,EAAKkd,MAAM8P,QAAUgE,EAAOzV,EAAQ1D,IAAW,GAAK,QAItD,OAAOzJ,GAGR,QAAS8iB,IAAmBlxB,EAAMoD,EAAO+tB,GACxC,GAAIltB,GAAUksB,GAAU3mB,KAAMpG,EAC9B,OAAOa,GAENvC,KAAKkC,IAAK,EAAGK,EAAS,IAAQktB,GAAY,KAAUltB,EAAS,IAAO,MACpEb,EAGF,QAASguB,IAAsBpxB,EAAMgB,EAAMqwB,EAAOC,EAAaC,GAS9D,IARA,GAAItxB,GAAIoxB,KAAYC,EAAc,SAAW,WAE5C,EAES,UAATtwB,EAAmB,EAAI,EAEvBsN,EAAM,EAEK,EAAJrO,EAAOA,GAAK,EAEJ,WAAVoxB,IACJ/iB,GAAOnQ,EAAOyhB,IAAK5f,EAAMqxB,EAAQ5R,EAAWxf,IAAK,EAAMsxB,IAGnDD,GAEW,YAAVD,IACJ/iB,GAAOnQ,EAAOyhB,IAAK5f,EAAM,UAAYyf,EAAWxf,IAAK,EAAMsxB,IAI7C,WAAVF,IACJ/iB,GAAOnQ,EAAOyhB,IAAK5f,EAAM,SAAWyf,EAAWxf,GAAM,SAAS,EAAMsxB,MAIrEjjB,GAAOnQ,EAAOyhB,IAAK5f,EAAM,UAAYyf,EAAWxf,IAAK,EAAMsxB,GAG5C,YAAVF,IACJ/iB,GAAOnQ,EAAOyhB,IAAK5f,EAAM,SAAWyf,EAAWxf,GAAM,SAAS,EAAMsxB,IAKvE,OAAOjjB,GAGR,QAASkjB,IAAkBxxB,EAAMgB,EAAMqwB,GAGtC,GAAII,IAAmB,EACtBnjB,EAAe,UAATtN,EAAmBhB,EAAKqd,YAAcrd,EAAK8vB,aACjDyB,EAAS7D,GAAW1tB,GACpBsxB,EAAcrzB,EAAQoxB,WAAgE,eAAnDlxB,EAAOyhB,IAAK5f,EAAM,aAAa,EAAOuxB,EAK1E,IAAY,GAAPjjB,GAAmB,MAAPA,EAAc,CAQ9B,GANAA,EAAMqf,GAAQ3tB,EAAMgB,EAAMuwB,IACf,EAANjjB,GAAkB,MAAPA,KACfA,EAAMtO,EAAKkd,MAAOlc,IAIdysB,GAAU1jB,KAAKuE,GACnB,MAAOA,EAKRmjB,GAAmBH,IAAiBrzB,EAAQyxB,qBAAuBphB,IAAQtO,EAAKkd,MAAOlc,IAGvFsN,EAAMhM,WAAYgM,IAAS,EAI5B,MAASA,GACR8iB,GACCpxB,EACAgB,EACAqwB,IAAWC,EAAc,SAAW,WACpCG,EACAF,GAEE,KAGLpzB,EAAOyC,QAGN8wB,UACCzC,SACC5vB,IAAK,SAAUW,EAAM+tB,GACpB,GAAKA,EAAW,CAEf,GAAItuB,GAAMkuB,GAAQ3tB,EAAM,UACxB,OAAe,KAARP,EAAa,IAAMA,MAO9BkyB,WACCC,aAAe,EACfC,aAAe,EACfC,UAAY,EACZC,YAAc,EACdrB,YAAc,EACdsB,YAAc,EACd/C,SAAW,EACXgD,OAAS,EACTC,SAAW,EACXC,QAAU,EACVC,QAAU,EACVhV,MAAQ,GAKTiV,UAECC,QAASr0B,EAAQixB,SAAW,WAAa,cAI1ChS,MAAO,SAAUld,EAAMgB,EAAMoC,EAAOiuB,GAEnC,GAAMrxB,GAA0B,IAAlBA,EAAKyC,UAAoC,IAAlBzC,EAAKyC,UAAmBzC,EAAKkd,MAAlE,CAKA,GAAIzd,GAAKyC,EAAM8c,EACd8R,EAAW3yB,EAAO6E,UAAWhC,GAC7Bkc,EAAQld,EAAKkd,KASd,IAPAlc,EAAO7C,EAAOk0B,SAAUvB,KAAgB3yB,EAAOk0B,SAAUvB,GAAaF,GAAgB1T,EAAO4T,IAI7F9R,EAAQ7gB,EAAOuzB,SAAU1wB,IAAU7C,EAAOuzB,SAAUZ,GAGrCtvB,SAAV4B,EAsCJ,MAAK4b,IAAS,OAASA,IAAqDxd,UAA3C/B,EAAMuf,EAAM3f,IAAKW,GAAM,EAAOqxB,IACvD5xB,EAIDyd,EAAOlc,EAhCd,IAVAkB,QAAckB,GAGA,WAATlB,IAAsBzC,EAAM2wB,GAAQ5mB,KAAMpG,MAC9CA,GAAU3D,EAAI,GAAK,GAAMA,EAAI,GAAK6C,WAAYnE,EAAOyhB,IAAK5f,EAAMgB,IAEhEkB,EAAO,UAIM,MAATkB,GAAiBA,IAAUA,IAKlB,WAATlB,GAAsB/D,EAAOwzB,UAAWb,KAC5C1tB,GAAS,MAKJnF,EAAQmxB,iBAA6B,KAAVhsB,GAA+C,IAA/BpC,EAAKpD,QAAQ,gBAC7Dsf,EAAOlc,GAAS,aAIXge,GAAW,OAASA,IAAwDxd,UAA7C4B,EAAQ4b,EAAMqN,IAAKrsB,EAAMoD,EAAOiuB,MAIpE,IACCnU,EAAOlc,GAASoC,EACf,MAAMV,OAcXkd,IAAK,SAAU5f,EAAMgB,EAAMqwB,EAAOE,GACjC,GAAIjyB,GAAKgP,EAAK0Q,EACb8R,EAAW3yB,EAAO6E,UAAWhC,EAyB9B,OAtBAA,GAAO7C,EAAOk0B,SAAUvB,KAAgB3yB,EAAOk0B,SAAUvB,GAAaF,GAAgB5wB,EAAKkd,MAAO4T,IAIlG9R,EAAQ7gB,EAAOuzB,SAAU1wB,IAAU7C,EAAOuzB,SAAUZ,GAG/C9R,GAAS,OAASA,KACtB1Q,EAAM0Q,EAAM3f,IAAKW,GAAM,EAAMqxB,IAIjB7vB,SAAR8M,IACJA,EAAMqf,GAAQ3tB,EAAMgB,EAAMuwB,IAId,WAARjjB,GAAoBtN,IAAQwvB,MAChCliB,EAAMkiB,GAAoBxvB,IAIZ,KAAVqwB,GAAgBA,GACpB/xB,EAAMgD,WAAYgM,GACX+iB,KAAU,GAAQlzB,EAAOkE,UAAW/C,GAAQA,GAAO,EAAIgP,GAExDA,KAITnQ,EAAOyB,MAAO,SAAU,SAAW,SAAUK,EAAGe,GAC/C7C,EAAOuzB,SAAU1wB,IAChB3B,IAAK,SAAUW,EAAM+tB,EAAUsD,GAC9B,MAAKtD,GAGGmC,GAAanmB,KAAM5L,EAAOyhB,IAAK5f,EAAM,aAAsC,IAArBA,EAAKqd,YACjElf,EAAO4xB,KAAM/vB,EAAMqwB,GAAS,WAC3B,MAAOmB,IAAkBxxB,EAAMgB,EAAMqwB,KAEtCG,GAAkBxxB,EAAMgB,EAAMqwB,GAPhC,QAWDhF,IAAK,SAAUrsB,EAAMoD,EAAOiuB,GAC3B,GAAIE,GAASF,GAAS3D,GAAW1tB,EACjC,OAAOkxB,IAAmBlxB,EAAMoD,EAAOiuB,EACtCD,GACCpxB,EACAgB,EACAqwB,EACApzB,EAAQoxB,WAAgE,eAAnDlxB,EAAOyhB,IAAK5f,EAAM,aAAa,EAAOuxB,GAC3DA,GACG,OAMFtzB,EAAQgxB,UACb9wB,EAAOuzB,SAASzC,SACf5vB,IAAK,SAAUW,EAAM+tB,GAEpB,MAAOkC,IAASlmB,MAAOgkB,GAAY/tB,EAAKmuB,aAAenuB,EAAKmuB,aAAarhB,OAAS9M,EAAKkd,MAAMpQ,SAAW,IACrG,IAAOxK,WAAYyE,OAAOwrB,IAAS,GACrCxE,EAAW,IAAM,IAGnB1B,IAAK,SAAUrsB,EAAMoD,GACpB,GAAI8Z,GAAQld,EAAKkd,MAChBiR,EAAenuB,EAAKmuB,aACpBc,EAAU9wB,EAAOkE,UAAWe,GAAU,iBAA2B,IAARA,EAAc,IAAM,GAC7E0J,EAASqhB,GAAgBA,EAAarhB,QAAUoQ,EAAMpQ,QAAU,EAIjEoQ,GAAME,KAAO,GAINha,GAAS,GAAe,KAAVA,IAC6B,KAAhDjF,EAAO2E,KAAMgK,EAAOlL,QAASouB,GAAQ,MACrC9S,EAAM3S,kBAKP2S,EAAM3S,gBAAiB,UAGR,KAAVnH,GAAgB+qB,IAAiBA,EAAarhB,UAMpDoQ,EAAMpQ,OAASkjB,GAAOjmB,KAAM+C,GAC3BA,EAAOlL,QAASouB,GAAQf,GACxBniB,EAAS,IAAMmiB,MAKnB9wB,EAAOuzB,SAAS7B,YAAcpB,GAAcxwB,EAAQ2xB,oBACnD,SAAU5vB,EAAM+tB,GACf,MAAKA,GAGG5vB,EAAO4xB,KAAM/vB,GAAQgtB,QAAW,gBACtCW,IAAU3tB,EAAM,gBAJlB,SAUF7B,EAAOyB,MACN4yB,OAAQ,GACRC,QAAS,GACTC,OAAQ,SACN,SAAUC,EAAQC,GACpBz0B,EAAOuzB,SAAUiB,EAASC,IACzBC,OAAQ,SAAUzvB,GAOjB,IANA,GAAInD,GAAI,EACP6yB,KAGAC,EAAyB,gBAAV3vB,GAAqBA,EAAMqB,MAAM,MAASrB,GAE9C,EAAJnD,EAAOA,IACd6yB,EAAUH,EAASlT,EAAWxf,GAAM2yB,GACnCG,EAAO9yB,IAAO8yB,EAAO9yB,EAAI,IAAO8yB,EAAO,EAGzC,OAAOD,KAIHtF,GAAQzjB,KAAM4oB,KACnBx0B,EAAOuzB,SAAUiB,EAASC,GAASvG,IAAM6E,MAI3C/yB,EAAOG,GAAGsC,QACTgf,IAAK,SAAU5e,EAAMoC,GACpB,MAAOyc,GAAQviB,KAAM,SAAU0C,EAAMgB,EAAMoC,GAC1C,GAAImuB,GAAQhxB,EACXR,KACAE,EAAI,CAEL,IAAK9B,EAAOoD,QAASP,GAAS,CAI7B,IAHAuwB,EAAS7D,GAAW1tB,GACpBO,EAAMS,EAAK9B,OAECqB,EAAJN,EAASA,IAChBF,EAAKiB,EAAMf,IAAQ9B,EAAOyhB,IAAK5f,EAAMgB,EAAMf,IAAK,EAAOsxB,EAGxD,OAAOxxB,GAGR,MAAiByB,UAAV4B,EACNjF,EAAO+e,MAAOld,EAAMgB,EAAMoC,GAC1BjF,EAAOyhB,IAAK5f,EAAMgB,IACjBA,EAAMoC,EAAOjD,UAAUjB,OAAS,IAEpC8xB,KAAM,WACL,MAAOD,IAAUzzB,MAAM,IAExB01B,KAAM,WACL,MAAOjC,IAAUzzB,OAElB21B,OAAQ,SAAU/Y,GACjB,MAAsB,iBAAVA,GACJA,EAAQ5c,KAAK0zB,OAAS1zB,KAAK01B,OAG5B11B,KAAKsC,KAAK,WACX8f,EAAUpiB,MACda,EAAQb,MAAO0zB,OAEf7yB,EAAQb,MAAO01B,WAOnB,SAASE,IAAOlzB,EAAMiB,EAASyjB,EAAMjkB,EAAK0yB;AACzC,MAAO,IAAID,IAAMn0B,UAAUR,KAAMyB,EAAMiB,EAASyjB,EAAMjkB,EAAK0yB,GAE5Dh1B,EAAO+0B,MAAQA,GAEfA,GAAMn0B,WACLE,YAAai0B,GACb30B,KAAM,SAAUyB,EAAMiB,EAASyjB,EAAMjkB,EAAK0yB,EAAQC,GACjD91B,KAAK0C,KAAOA,EACZ1C,KAAKonB,KAAOA,EACZpnB,KAAK61B,OAASA,GAAU,QACxB71B,KAAK2D,QAAUA,EACf3D,KAAKgT,MAAQhT,KAAKiH,IAAMjH,KAAKgO,MAC7BhO,KAAKmD,IAAMA,EACXnD,KAAK81B,KAAOA,IAAUj1B,EAAOwzB,UAAWjN,GAAS,GAAK,OAEvDpZ,IAAK,WACJ,GAAI0T,GAAQkU,GAAMG,UAAW/1B,KAAKonB,KAElC,OAAO1F,IAASA,EAAM3f,IACrB2f,EAAM3f,IAAK/B,MACX41B,GAAMG,UAAUrP,SAAS3kB,IAAK/B,OAEhCg2B,IAAK,SAAUC,GACd,GAAIC,GACHxU,EAAQkU,GAAMG,UAAW/1B,KAAKonB,KAoB/B,OAlBKpnB,MAAK2D,QAAQwyB,SACjBn2B,KAAKsa,IAAM4b,EAAQr1B,EAAOg1B,OAAQ71B,KAAK61B,QACtCI,EAASj2B,KAAK2D,QAAQwyB,SAAWF,EAAS,EAAG,EAAGj2B,KAAK2D,QAAQwyB,UAG9Dn2B,KAAKsa,IAAM4b,EAAQD,EAEpBj2B,KAAKiH,KAAQjH,KAAKmD,IAAMnD,KAAKgT,OAAUkjB,EAAQl2B,KAAKgT,MAE/ChT,KAAK2D,QAAQyyB,MACjBp2B,KAAK2D,QAAQyyB,KAAKt0B,KAAM9B,KAAK0C,KAAM1C,KAAKiH,IAAKjH,MAGzC0hB,GAASA,EAAMqN,IACnBrN,EAAMqN,IAAK/uB,MAEX41B,GAAMG,UAAUrP,SAASqI,IAAK/uB,MAExBA,OAIT41B,GAAMn0B,UAAUR,KAAKQ,UAAYm0B,GAAMn0B,UAEvCm0B,GAAMG,WACLrP,UACC3kB,IAAK,SAAUs0B,GACd,GAAI7jB,EAEJ,OAAiC,OAA5B6jB,EAAM3zB,KAAM2zB,EAAMjP,OACpBiP,EAAM3zB,KAAKkd,OAA2C,MAAlCyW,EAAM3zB,KAAKkd,MAAOyW,EAAMjP,OAQ/C5U,EAAS3R,EAAOyhB,IAAK+T,EAAM3zB,KAAM2zB,EAAMjP,KAAM,IAErC5U,GAAqB,SAAXA,EAAwBA,EAAJ,GAT9B6jB,EAAM3zB,KAAM2zB,EAAMjP,OAW3B2H,IAAK,SAAUsH,GAGTx1B,EAAOy1B,GAAGF,KAAMC,EAAMjP,MAC1BvmB,EAAOy1B,GAAGF,KAAMC,EAAMjP,MAAQiP,GACnBA,EAAM3zB,KAAKkd,QAAgE,MAArDyW,EAAM3zB,KAAKkd,MAAO/e,EAAOk0B,SAAUsB,EAAMjP,QAAoBvmB,EAAOuzB,SAAUiC,EAAMjP,OACrHvmB,EAAO+e,MAAOyW,EAAM3zB,KAAM2zB,EAAMjP,KAAMiP,EAAMpvB,IAAMovB,EAAMP,MAExDO,EAAM3zB,KAAM2zB,EAAMjP,MAASiP,EAAMpvB,OASrC2uB,GAAMG,UAAUtN,UAAYmN,GAAMG,UAAU1N,YAC3C0G,IAAK,SAAUsH,GACTA,EAAM3zB,KAAKyC,UAAYkxB,EAAM3zB,KAAK0J,aACtCiqB,EAAM3zB,KAAM2zB,EAAMjP,MAASiP,EAAMpvB,OAKpCpG,EAAOg1B,QACNU,OAAQ,SAAUC,GACjB,MAAOA,IAERC,MAAO,SAAUD,GAChB,MAAO,GAAMpyB,KAAKsyB,IAAKF,EAAIpyB,KAAKuyB,IAAO,IAIzC91B,EAAOy1B,GAAKV,GAAMn0B,UAAUR,KAG5BJ,EAAOy1B,GAAGF,OAKV,IACCQ,IAAOC,GACPC,GAAW,yBACXC,GAAS,GAAIttB,QAAQ,iBAAmBwY,EAAO,cAAe,KAC9D+U,GAAO,cACPC,IAAwBC,IACxBC,IACCC,KAAO,SAAUhQ,EAAMthB,GACtB,GAAIuwB,GAAQr2B,KAAKq3B,YAAajQ,EAAMthB,GACnCjC,EAASwyB,EAAMroB,MACfynB,EAAQsB,GAAO7qB,KAAMpG,GACrBgwB,EAAOL,GAASA,EAAO,KAAS50B,EAAOwzB,UAAWjN,GAAS,GAAK,MAGhEpU,GAAUnS,EAAOwzB,UAAWjN,IAAmB,OAAT0O,IAAkBjyB,IACvDkzB,GAAO7qB,KAAMrL,EAAOyhB,IAAK+T,EAAM3zB,KAAM0kB,IACtCkQ,EAAQ,EACRC,EAAgB,EAEjB,IAAKvkB,GAASA,EAAO,KAAQ8iB,EAAO,CAEnCA,EAAOA,GAAQ9iB,EAAO,GAGtByiB,EAAQA,MAGRziB,GAASnP,GAAU,CAEnB,GAGCyzB,GAAQA,GAAS,KAGjBtkB,GAAgBskB,EAChBz2B,EAAO+e,MAAOyW,EAAM3zB,KAAM0kB,EAAMpU,EAAQ8iB,SAI/BwB,KAAWA,EAAQjB,EAAMroB,MAAQnK,IAAqB,IAAVyzB,KAAiBC,GAaxE,MATK9B,KACJziB,EAAQqjB,EAAMrjB,OAASA,IAAUnP,GAAU,EAC3CwyB,EAAMP,KAAOA,EAEbO,EAAMlzB,IAAMsyB,EAAO,GAClBziB,GAAUyiB,EAAO,GAAM,GAAMA,EAAO,IACnCA,EAAO,IAGHY,IAKV,SAASmB,MAIR,MAHA3Y,YAAW,WACV+X,GAAQ1yB,SAEA0yB,GAAQ/1B,EAAOoG,MAIzB,QAASwwB,IAAO7yB,EAAM8yB,GACrB,GAAI5P,GACHla,GAAU+pB,OAAQ/yB,GAClBjC,EAAI,CAKL,KADA+0B,EAAeA,EAAe,EAAI,EACtB,EAAJ/0B,EAAQA,GAAK,EAAI+0B,EACxB5P,EAAQ3F,EAAWxf,GACnBiL,EAAO,SAAWka,GAAUla,EAAO,UAAYka,GAAUljB,CAO1D,OAJK8yB,KACJ9pB,EAAM+jB,QAAU/jB,EAAMqiB,MAAQrrB,GAGxBgJ,EAGR,QAASypB,IAAavxB,EAAOshB,EAAMwQ,GAKlC,IAJA,GAAIvB,GACHwB,GAAeV,GAAU/P,QAAehnB,OAAQ+2B,GAAU,MAC1D5c,EAAQ,EACR3Y,EAASi2B,EAAWj2B,OACLA,EAAR2Y,EAAgBA,IACvB,GAAM8b,EAAQwB,EAAYtd,GAAQzY,KAAM81B,EAAWxQ,EAAMthB,GAGxD,MAAOuwB,GAKV,QAASa,IAAkBx0B,EAAMglB,EAAOoQ,GAEvC,GAAI1Q,GAAMthB,EAAO6vB,EAAQU,EAAO3U,EAAOqW,EAASrI,EAASsI,EACxDC,EAAOj4B,KACP4pB,KACAhK,EAAQld,EAAKkd,MACb+T,EAASjxB,EAAKyC,UAAYid,EAAU1f,GACpCw1B,EAAWr3B,EAAOwgB,MAAO3e,EAAM,SAG1Bo1B,GAAKvW,QACVG,EAAQ7gB,EAAO8gB,YAAajf,EAAM,MACX,MAAlBgf,EAAMyW,WACVzW,EAAMyW,SAAW,EACjBJ,EAAUrW,EAAM/M,MAAMuH,KACtBwF,EAAM/M,MAAMuH,KAAO,WACZwF,EAAMyW,UACXJ,MAIHrW,EAAMyW,WAENF,EAAKnb,OAAO,WAGXmb,EAAKnb,OAAO,WACX4E,EAAMyW,WACAt3B,EAAO0gB,MAAO7e,EAAM,MAAOd,QAChC8f,EAAM/M,MAAMuH,YAOO,IAAlBxZ,EAAKyC,WAAoB,UAAYuiB,IAAS,SAAWA,MAK7DoQ,EAAKM,UAAaxY,EAAMwY,SAAUxY,EAAMyY,UAAWzY,EAAM0Y,WAIzD5I,EAAU7uB,EAAOyhB,IAAK5f,EAAM,WAG5Bs1B,EAA2B,SAAZtI,EACd7uB,EAAOwgB,MAAO3e,EAAM,eAAkBktB,GAAgBltB,EAAKkD,UAAa8pB,EAEnD,WAAjBsI,GAA6D,SAAhCn3B,EAAOyhB,IAAK5f,EAAM,WAI7C/B,EAAQ+e,wBAA8D,WAApCkQ,GAAgBltB,EAAKkD,UAG5Dga,EAAME,KAAO,EAFbF,EAAM8P,QAAU,iBAOdoI,EAAKM,WACTxY,EAAMwY,SAAW,SACXz3B,EAAQqvB,oBACbiI,EAAKnb,OAAO,WACX8C,EAAMwY,SAAWN,EAAKM,SAAU,GAChCxY,EAAMyY,UAAYP,EAAKM,SAAU,GACjCxY,EAAM0Y,UAAYR,EAAKM,SAAU,KAMpC,KAAMhR,IAAQM,GAEb,GADA5hB,EAAQ4hB,EAAON,GACV0P,GAAS5qB,KAAMpG,GAAU,CAG7B,SAFO4hB,GAAON,GACduO,EAASA,GAAoB,WAAV7vB,EACdA,KAAY6tB,EAAS,OAAS,QAAW,CAG7C,GAAe,SAAV7tB,IAAoBoyB,GAAiCh0B,SAArBg0B,EAAU9Q,GAG9C,QAFAuM,IAAS,EAKX/J,EAAMxC,GAAS8Q,GAAYA,EAAU9Q,IAAUvmB,EAAO+e,MAAOld,EAAM0kB,OAInEsI,GAAUxrB,MAIZ,IAAMrD,EAAOoE,cAAe2kB,GAwCqD,YAAxD,SAAZ8F,EAAqBE,GAAgBltB,EAAKkD,UAAa8pB,KACnE9P,EAAM8P,QAAUA,OAzCoB,CAC/BwI,EACC,UAAYA,KAChBvE,EAASuE,EAASvE,QAGnBuE,EAAWr3B,EAAOwgB,MAAO3e,EAAM,aAI3BizB,IACJuC,EAASvE,QAAUA,GAEfA,EACJ9yB,EAAQ6B,GAAOgxB,OAEfuE,EAAK3vB,KAAK,WACTzH,EAAQ6B,GAAOgzB,SAGjBuC,EAAK3vB,KAAK,WACT,GAAI8e,EACJvmB,GAAOygB,YAAa5e,EAAM,SAC1B,KAAM0kB,IAAQwC,GACb/oB,EAAO+e,MAAOld,EAAM0kB,EAAMwC,EAAMxC,KAGlC,KAAMA,IAAQwC,GACbyM,EAAQgB,GAAa1D,EAASuE,EAAU9Q,GAAS,EAAGA,EAAM6Q,GAElD7Q,IAAQ8Q,KACfA,EAAU9Q,GAASiP,EAAMrjB,MACpB2gB,IACJ0C,EAAMlzB,IAAMkzB,EAAMrjB,MAClBqjB,EAAMrjB,MAAiB,UAAToU,GAA6B,WAATA,EAAoB,EAAI,KAW/D,QAASmR,IAAY7Q,EAAO8Q,GAC3B,GAAIje,GAAO7W,EAAMmyB,EAAQ/vB,EAAO4b,CAGhC,KAAMnH,IAASmN,GAed,GAdAhkB,EAAO7C,EAAO6E,UAAW6U,GACzBsb,EAAS2C,EAAe90B,GACxBoC,EAAQ4hB,EAAOnN,GACV1Z,EAAOoD,QAAS6B,KACpB+vB,EAAS/vB,EAAO,GAChBA,EAAQ4hB,EAAOnN,GAAUzU,EAAO,IAG5ByU,IAAU7W,IACdgkB,EAAOhkB,GAASoC,QACT4hB,GAAOnN,IAGfmH,EAAQ7gB,EAAOuzB,SAAU1wB,GACpBge,GAAS,UAAYA,GAAQ,CACjC5b,EAAQ4b,EAAM6T,OAAQzvB,SACf4hB,GAAOhkB,EAId,KAAM6W,IAASzU,GACNyU,IAASmN,KAChBA,EAAOnN,GAAUzU,EAAOyU,GACxBie,EAAeje,GAAUsb,OAI3B2C,GAAe90B,GAASmyB,EAK3B,QAAS4C,IAAW/1B,EAAMg2B,EAAY/0B,GACrC,GAAI6O,GACHmmB,EACApe,EAAQ,EACR3Y,EAASq1B,GAAoBr1B,OAC7Bmb,EAAWlc,EAAO4b,WAAWK,OAAQ,iBAE7B8b,GAAKl2B,OAEbk2B,EAAO,WACN,GAAKD,EACJ,OAAO,CAUR,KARA,GAAIE,GAAcjC,IAASY,KAC1BzZ,EAAY3Z,KAAKkC,IAAK,EAAGsxB,EAAUkB,UAAYlB,EAAUzB,SAAW0C,GAEpE5hB,EAAO8G,EAAY6Z,EAAUzB,UAAY,EACzCF,EAAU,EAAIhf,EACdsD,EAAQ,EACR3Y,EAASg2B,EAAUmB,OAAOn3B,OAEXA,EAAR2Y,EAAiBA,IACxBqd,EAAUmB,OAAQxe,GAAQyb,IAAKC,EAKhC,OAFAlZ,GAASoB,WAAYzb,GAAQk1B,EAAW3B,EAASlY,IAElC,EAAVkY,GAAer0B,EACZmc,GAEPhB,EAASqB,YAAa1b,GAAQk1B,KACvB,IAGTA,EAAY7a,EAASF,SACpBna,KAAMA,EACNglB,MAAO7mB,EAAOyC,UAAYo1B,GAC1BZ,KAAMj3B,EAAOyC,QAAQ,GAAQk1B,kBAAqB70B,GAClDq1B,mBAAoBN,EACpBO,gBAAiBt1B,EACjBm1B,UAAWlC,IAASY,KACpBrB,SAAUxyB,EAAQwyB,SAClB4C,UACA1B,YAAa,SAAUjQ,EAAMjkB,GAC5B,GAAIkzB,GAAQx1B,EAAO+0B,MAAOlzB,EAAMk1B,EAAUE,KAAM1Q,EAAMjkB,EACpDy0B,EAAUE,KAAKU,cAAepR,IAAUwQ,EAAUE,KAAKjC,OAEzD,OADA+B,GAAUmB,OAAO14B,KAAMg2B,GAChBA,GAERzU,KAAM,SAAUsX,GACf,GAAI3e,GAAQ,EAGX3Y,EAASs3B,EAAUtB,EAAUmB,OAAOn3B,OAAS,CAC9C,IAAK+2B,EACJ,MAAO34B,KAGR,KADA24B,GAAU,EACM/2B,EAAR2Y,EAAiBA,IACxBqd,EAAUmB,OAAQxe,GAAQyb,IAAK,EAUhC,OALKkD,GACJnc,EAASqB,YAAa1b,GAAQk1B,EAAWsB,IAEzCnc,EAASoc,WAAYz2B,GAAQk1B,EAAWsB,IAElCl5B,QAGT0nB,EAAQkQ,EAAUlQ,KAInB,KAFA6Q,GAAY7Q,EAAOkQ,EAAUE,KAAKU,eAElB52B,EAAR2Y,EAAiBA,IAExB,GADA/H,EAASykB,GAAqB1c,GAAQzY,KAAM81B,EAAWl1B,EAAMglB,EAAOkQ,EAAUE,MAE7E,MAAOtlB,EAmBT,OAfA3R,GAAO4B,IAAKilB,EAAO2P,GAAaO,GAE3B/2B,EAAOkD,WAAY6zB,EAAUE,KAAK9kB,QACtC4kB,EAAUE,KAAK9kB,MAAMlR,KAAMY,EAAMk1B,GAGlC/2B,EAAOy1B,GAAG8C,MACTv4B,EAAOyC,OAAQs1B,GACdl2B,KAAMA,EACNu1B,KAAML,EACNrW,MAAOqW,EAAUE,KAAKvW,SAKjBqW,EAAUpa,SAAUoa,EAAUE,KAAKta,UACxClV,KAAMsvB,EAAUE,KAAKxvB,KAAMsvB,EAAUE,KAAKuB,UAC1Crc,KAAM4a,EAAUE,KAAK9a,MACrBF,OAAQ8a,EAAUE,KAAKhb,QAG1Bjc,EAAO43B,UAAY53B,EAAOyC,OAAQm1B,IACjCa,QAAS,SAAU5R,EAAOnlB,GACpB1B,EAAOkD,WAAY2jB,IACvBnlB,EAAWmlB,EACXA,GAAU,MAEVA,EAAQA,EAAMvgB,MAAM,IAOrB,KAJA,GAAIigB,GACH7M,EAAQ,EACR3Y,EAAS8lB,EAAM9lB,OAEAA,EAAR2Y,EAAiBA,IACxB6M,EAAOM,EAAOnN,GACd4c,GAAU/P,GAAS+P,GAAU/P,OAC7B+P,GAAU/P,GAAOxW,QAASrO,IAI5Bg3B,UAAW,SAAUh3B,EAAU+rB,GACzBA,EACJ2I,GAAoBrmB,QAASrO,GAE7B00B,GAAoB52B,KAAMkC,MAK7B1B,EAAO24B,MAAQ,SAAUA,EAAO3D,EAAQ70B,GACvC,GAAIy4B,GAAMD,GAA0B,gBAAVA,GAAqB34B,EAAOyC,UAAYk2B,IACjEH,SAAUr4B,IAAOA,GAAM60B,GACtBh1B,EAAOkD,WAAYy1B,IAAWA,EAC/BrD,SAAUqD,EACV3D,OAAQ70B,GAAM60B,GAAUA,IAAWh1B,EAAOkD,WAAY8xB,IAAYA,EAwBnE,OArBA4D,GAAItD,SAAWt1B,EAAOy1B,GAAGvX,IAAM,EAA4B,gBAAjB0a,GAAItD,SAAwBsD,EAAItD,SACzEsD,EAAItD,WAAYt1B,GAAOy1B,GAAGoD,OAAS74B,EAAOy1B,GAAGoD,OAAQD,EAAItD,UAAat1B,EAAOy1B,GAAGoD,OAAOhT,UAGtE,MAAb+S,EAAIlY,OAAiBkY,EAAIlY,SAAU,KACvCkY,EAAIlY,MAAQ,MAIbkY,EAAI5tB,IAAM4tB,EAAIJ,SAEdI,EAAIJ,SAAW,WACTx4B,EAAOkD,WAAY01B,EAAI5tB,MAC3B4tB,EAAI5tB,IAAI/J,KAAM9B,MAGVy5B,EAAIlY,OACR1gB,EAAO2gB,QAASxhB,KAAMy5B,EAAIlY,QAIrBkY,GAGR54B,EAAOG,GAAGsC,QACTq2B,OAAQ,SAAUH,EAAOI,EAAI/D,EAAQtzB,GAGpC,MAAOvC,MAAKwP,OAAQ4S,GAAWE,IAAK,UAAW,GAAIoR,OAGjDvwB,MAAM02B,SAAUlI,QAASiI,GAAMJ,EAAO3D,EAAQtzB,IAEjDs3B,QAAS,SAAUzS,EAAMoS,EAAO3D,EAAQtzB,GACvC,GAAIoS,GAAQ9T,EAAOoE,cAAemiB,GACjC0S,EAASj5B,EAAO24B,MAAOA,EAAO3D,EAAQtzB,GACtCw3B,EAAc,WAEb,GAAI9B,GAAOQ,GAAWz4B,KAAMa,EAAOyC,UAAY8jB,GAAQ0S,IAGlDnlB,GAAS9T,EAAOwgB,MAAOrhB,KAAM,YACjCi4B,EAAKrW,MAAM,GAKd,OAFCmY,GAAYC,OAASD,EAEfplB,GAASmlB,EAAOvY,SAAU,EAChCvhB,KAAKsC,KAAMy3B,GACX/5B,KAAKuhB,MAAOuY,EAAOvY,MAAOwY,IAE5BnY,KAAM,SAAUhd,EAAMkd,EAAYoX,GACjC,GAAIe,GAAY,SAAUvY,GACzB,GAAIE,GAAOF,EAAME,WACVF,GAAME,KACbA,EAAMsX,GAYP,OATqB,gBAATt0B,KACXs0B,EAAUpX,EACVA,EAAald,EACbA,EAAOV,QAEH4d,GAAcld,KAAS,GAC3B5E,KAAKuhB,MAAO3c,GAAQ,SAGd5E,KAAKsC,KAAK,WAChB,GAAIkf,IAAU,EACbjH,EAAgB,MAAR3V,GAAgBA,EAAO,aAC/Bs1B,EAASr5B,EAAOq5B,OAChB30B,EAAO1E,EAAOwgB,MAAOrhB,KAEtB,IAAKua,EACChV,EAAMgV,IAAWhV,EAAMgV,GAAQqH,MACnCqY,EAAW10B,EAAMgV,QAGlB,KAAMA,IAAShV,GACTA,EAAMgV,IAAWhV,EAAMgV,GAAQqH,MAAQoV,GAAKvqB,KAAM8N,IACtD0f,EAAW10B,EAAMgV,GAKpB,KAAMA,EAAQ2f,EAAOt4B,OAAQ2Y,KACvB2f,EAAQ3f,GAAQ7X,OAAS1C,MAAiB,MAAR4E,GAAgBs1B,EAAQ3f,GAAQgH,QAAU3c,IAChFs1B,EAAQ3f,GAAQ0d,KAAKrW,KAAMsX,GAC3B1X,GAAU,EACV0Y,EAAO72B,OAAQkX,EAAO,KAOnBiH,IAAY0X,IAChBr4B,EAAO2gB,QAASxhB,KAAM4E,MAIzBo1B,OAAQ,SAAUp1B,GAIjB,MAHKA,MAAS,IACbA,EAAOA,GAAQ,MAET5E,KAAKsC,KAAK,WAChB,GAAIiY,GACHhV,EAAO1E,EAAOwgB,MAAOrhB,MACrBuhB,EAAQhc,EAAMX,EAAO,SACrB8c,EAAQnc,EAAMX,EAAO,cACrBs1B,EAASr5B,EAAOq5B,OAChBt4B,EAAS2f,EAAQA,EAAM3f,OAAS,CAajC,KAVA2D,EAAKy0B,QAAS,EAGdn5B,EAAO0gB,MAAOvhB,KAAM4E,MAEf8c,GAASA,EAAME,MACnBF,EAAME,KAAK9f,KAAM9B,MAAM,GAIlBua,EAAQ2f,EAAOt4B,OAAQ2Y,KACvB2f,EAAQ3f,GAAQ7X,OAAS1C,MAAQk6B,EAAQ3f,GAAQgH,QAAU3c,IAC/Ds1B,EAAQ3f,GAAQ0d,KAAKrW,MAAM,GAC3BsY,EAAO72B,OAAQkX,EAAO,GAKxB,KAAMA,EAAQ,EAAW3Y,EAAR2Y,EAAgBA,IAC3BgH,EAAOhH,IAAWgH,EAAOhH,GAAQyf,QACrCzY,EAAOhH,GAAQyf,OAAOl4B,KAAM9B,YAKvBuF,GAAKy0B,YAKfn5B,EAAOyB,MAAO,SAAU,OAAQ,QAAU,SAAUK,EAAGe,GACtD,GAAIy2B,GAAQt5B,EAAOG,GAAI0C,EACvB7C,GAAOG,GAAI0C,GAAS,SAAU81B,EAAO3D,EAAQtzB,GAC5C,MAAgB,OAATi3B,GAAkC,iBAAVA,GAC9BW,EAAMv3B,MAAO5C,KAAM6C,WACnB7C,KAAK65B,QAASpC,GAAO/zB,GAAM,GAAQ81B,EAAO3D,EAAQtzB,MAKrD1B,EAAOyB,MACN83B,UAAW3C,GAAM,QACjB4C,QAAS5C,GAAM,QACf6C,YAAa7C,GAAM,UACnB8C,QAAU5I,QAAS,QACnB6I,SAAW7I,QAAS,QACpB8I,YAAc9I,QAAS,WACrB,SAAUjuB,EAAMgkB,GAClB7mB,EAAOG,GAAI0C,GAAS,SAAU81B,EAAO3D,EAAQtzB,GAC5C,MAAOvC,MAAK65B,QAASnS,EAAO8R,EAAO3D,EAAQtzB,MAI7C1B,EAAOq5B,UACPr5B,EAAOy1B,GAAGsC,KAAO,WAChB,GAAIQ,GACHc,EAASr5B,EAAOq5B,OAChBv3B,EAAI,CAIL,KAFAi0B,GAAQ/1B,EAAOoG,MAEPtE,EAAIu3B,EAAOt4B,OAAQe,IAC1By2B,EAAQc,EAAQv3B,GAEVy2B,KAAWc,EAAQv3B,KAAQy2B,GAChCc,EAAO72B,OAAQV,IAAK,EAIhBu3B,GAAOt4B,QACZf,EAAOy1B,GAAG1U,OAEXgV,GAAQ1yB,QAGTrD,EAAOy1B,GAAG8C,MAAQ,SAAUA,GAC3Bv4B,EAAOq5B,OAAO75B,KAAM+4B,GACfA,IACJv4B,EAAOy1B,GAAGtjB,QAEVnS,EAAOq5B,OAAOnxB,OAIhBlI,EAAOy1B,GAAGoE,SAAW,GAErB75B,EAAOy1B,GAAGtjB,MAAQ,WACX6jB,KACLA,GAAU8D,YAAa95B,EAAOy1B,GAAGsC,KAAM/3B,EAAOy1B,GAAGoE,YAInD75B,EAAOy1B,GAAG1U,KAAO,WAChBgZ,cAAe/D,IACfA,GAAU,MAGXh2B,EAAOy1B,GAAGoD,QACTmB,KAAM,IACNC,KAAM,IAENpU,SAAU,KAMX7lB,EAAOG,GAAG+5B,MAAQ,SAAUC,EAAMp2B,GAIjC,MAHAo2B,GAAOn6B,EAAOy1B,GAAKz1B,EAAOy1B,GAAGoD,OAAQsB,IAAUA,EAAOA,EACtDp2B,EAAOA,GAAQ,KAER5E,KAAKuhB,MAAO3c,EAAM,SAAUiV,EAAM6H,GACxC,GAAIuZ,GAAUpc,WAAYhF,EAAMmhB,EAChCtZ,GAAME,KAAO,WACZsZ,aAAcD,OAMjB,WAEC,GAAIprB,GAAOrC,EAAK9F,EAAQkB,EAAG6wB,CAG3BjsB,GAAM5N,EAAS6N,cAAe,OAC9BD,EAAIb,aAAc,YAAa,KAC/Ba,EAAIoC,UAAY,qEAChBhH,EAAI4E,EAAIlB,qBAAqB,KAAM,GAGnC5E,EAAS9H,EAAS6N,cAAc,UAChCgsB,EAAM/xB,EAAOyH,YAAavP,EAAS6N,cAAc,WACjDoC,EAAQrC,EAAIlB,qBAAqB,SAAU,GAE3C1D,EAAEgX,MAAMC,QAAU,UAGlBlf,EAAQw6B,gBAAoC,MAAlB3tB,EAAI0B,UAI9BvO,EAAQif,MAAQ,MAAMnT,KAAM7D,EAAE8D,aAAa,UAI3C/L,EAAQy6B,eAA4C,OAA3BxyB,EAAE8D,aAAa,QAGxC/L,EAAQ06B,UAAYxrB,EAAM/J,MAI1BnF,EAAQ26B,YAAc7B,EAAIhlB,SAG1B9T,EAAQ46B,UAAY37B,EAAS6N,cAAc,QAAQ8tB,QAInD7zB,EAAO6M,UAAW,EAClB5T,EAAQ66B,aAAe/B,EAAIllB,SAI3B1E,EAAQjQ,EAAS6N,cAAe,SAChCoC,EAAMlD,aAAc,QAAS,IAC7BhM,EAAQkP,MAA0C,KAAlCA,EAAMnD,aAAc,SAGpCmD,EAAM/J,MAAQ,IACd+J,EAAMlD,aAAc,OAAQ,SAC5BhM,EAAQ86B,WAA6B,MAAhB5rB,EAAM/J,QAI5B,IAAI41B,IAAU,KAEd76B,GAAOG,GAAGsC,QACT0N,IAAK,SAAUlL,GACd,GAAI4b,GAAOvf,EAAK4B,EACfrB,EAAO1C,KAAK,EAEb,EAAA,GAAM6C,UAAUjB,OAsBhB,MAFAmC,GAAalD,EAAOkD,WAAY+B,GAEzB9F,KAAKsC,KAAK,SAAUK,GAC1B,GAAIqO,EAEmB,KAAlBhR,KAAKmF,WAKT6L,EADIjN,EACE+B,EAAMhE,KAAM9B,KAAM2C,EAAG9B,EAAQb,MAAOgR,OAEpClL,EAIK,MAAPkL,EACJA,EAAM,GACoB,gBAARA,GAClBA,GAAO,GACInQ,EAAOoD,QAAS+M,KAC3BA,EAAMnQ,EAAO4B,IAAKuO,EAAK,SAAUlL,GAChC,MAAgB,OAATA,EAAgB,GAAKA,EAAQ,MAItC4b,EAAQ7gB,EAAO86B,SAAU37B,KAAK4E,OAAU/D,EAAO86B,SAAU37B,KAAK4F,SAASC,eAGjE6b,GAAW,OAASA,IAA8Cxd,SAApCwd,EAAMqN,IAAK/uB,KAAMgR,EAAK,WACzDhR,KAAK8F,MAAQkL,KAjDd,IAAKtO,EAGJ,MAFAgf,GAAQ7gB,EAAO86B,SAAUj5B,EAAKkC,OAAU/D,EAAO86B,SAAUj5B,EAAKkD,SAASC,eAElE6b,GAAS,OAASA,IAAgDxd,UAAtC/B,EAAMuf,EAAM3f,IAAKW,EAAM,UAChDP,GAGRA,EAAMO,EAAKoD,MAEW,gBAAR3D,GAEbA,EAAImC,QAAQo3B,GAAS,IAEd,MAAPv5B,EAAc,GAAKA,OA0CxBtB,EAAOyC,QACNq4B,UACClQ,QACC1pB,IAAK,SAAUW,GACd,GAAIsO,GAAMnQ,EAAO0O,KAAKwB,KAAMrO,EAAM,QAClC,OAAc,OAAPsO,EACNA,EAGAnQ,EAAO2E,KAAM3E,EAAOmF,KAAMtD,MAG7BgF,QACC3F,IAAK,SAAUW,GAYd,IAXA,GAAIoD,GAAO2lB,EACV9nB,EAAUjB,EAAKiB,QACf4W,EAAQ7X,EAAKgS,cACb6V,EAAoB,eAAd7nB,EAAKkC,MAAiC,EAAR2V,EACpC0D,EAASsM,EAAM,QACfjkB,EAAMikB,EAAMhQ,EAAQ,EAAI5W,EAAQ/B,OAChCe,EAAY,EAAR4X,EACHjU,EACAikB,EAAMhQ,EAAQ,EAGJjU,EAAJ3D,EAASA,IAIhB,GAHA8oB,EAAS9nB,EAAShB,MAGX8oB,EAAOhX,UAAY9R,IAAM4X,IAE5B5Z,EAAQ66B,YAAe/P,EAAOlX,SAA+C,OAApCkX,EAAO/e,aAAa,cAC5D+e,EAAOrf,WAAWmI,UAAa1T,EAAO+E,SAAU6lB,EAAOrf,WAAY,aAAiB,CAMxF,GAHAtG,EAAQjF,EAAQ4qB,GAASza,MAGpBuZ,EACJ,MAAOzkB,EAIRmY,GAAO5d,KAAMyF,GAIf,MAAOmY,IAGR8Q,IAAK,SAAUrsB,EAAMoD,GACpB,GAAI81B,GAAWnQ,EACd9nB,EAAUjB,EAAKiB,QACfsa,EAASpd,EAAOoF,UAAWH,GAC3BnD,EAAIgB,EAAQ/B,MAEb,OAAQe,IAGP,GAFA8oB,EAAS9nB,EAAShB,GAEb9B,EAAOwF,QAASxF,EAAO86B,SAASlQ,OAAO1pB,IAAK0pB,GAAUxN,IAAY,EAMtE,IACCwN,EAAOhX,SAAWmnB,GAAY,EAE7B,MAAQ5wB,GAGTygB,EAAOoQ,iBAIRpQ,GAAOhX,UAAW,CASpB,OAJMmnB,KACLl5B,EAAKgS,cAAgB,IAGf/Q,OAOX9C,EAAOyB,MAAO,QAAS,YAAc,WACpCzB,EAAO86B,SAAU37B,OAChB+uB,IAAK,SAAUrsB,EAAMoD,GACpB,MAAKjF,GAAOoD,QAAS6B,GACXpD,EAAK8R,QAAU3T,EAAOwF,QAASxF,EAAO6B,GAAMsO,MAAOlL,IAAW,EADxE,SAKInF,EAAQ06B,UACbx6B,EAAO86B,SAAU37B,MAAO+B,IAAM,SAAUW,GAGvC,MAAsC,QAA/BA,EAAKgK,aAAa,SAAoB,KAAOhK,EAAKoD,SAQ5D,IAAIg2B,IAAUC,GACbjuB,GAAajN,EAAOgQ,KAAK/C,WACzBkuB,GAAc,0BACdb,GAAkBx6B,EAAQw6B,gBAC1Bc,GAAct7B,EAAQkP,KAEvBhP,GAAOG,GAAGsC,QACTyN,KAAM,SAAUrN,EAAMoC,GACrB,MAAOyc,GAAQviB,KAAMa,EAAOkQ,KAAMrN,EAAMoC,EAAOjD,UAAUjB,OAAS,IAGnEs6B,WAAY,SAAUx4B,GACrB,MAAO1D,MAAKsC,KAAK,WAChBzB,EAAOq7B,WAAYl8B,KAAM0D,QAK5B7C,EAAOyC,QACNyN,KAAM,SAAUrO,EAAMgB,EAAMoC,GAC3B,GAAI4b,GAAOvf,EACVg6B,EAAQz5B,EAAKyC,QAGd,IAAMzC,GAAkB,IAAVy5B,GAAyB,IAAVA,GAAyB,IAAVA,EAK5C,aAAYz5B,GAAKgK,eAAiB+S,EAC1B5e,EAAOumB,KAAM1kB,EAAMgB,EAAMoC,IAKlB,IAAVq2B,GAAgBt7B,EAAOgY,SAAUnW,KACrCgB,EAAOA,EAAKmC,cACZ6b,EAAQ7gB,EAAOu7B,UAAW14B,KACvB7C,EAAOgQ,KAAKnF,MAAMpB,KAAKmC,KAAM/I,GAASq4B,GAAWD,KAGtC53B,SAAV4B,EAaO4b,GAAS,OAASA,IAA6C,QAAnCvf,EAAMuf,EAAM3f,IAAKW,EAAMgB,IACvDvB,GAGPA,EAAMtB,EAAO0O,KAAKwB,KAAMrO,EAAMgB,GAGhB,MAAPvB,EACN+B,OACA/B,GApBc,OAAV2D,EAGO4b,GAAS,OAASA,IAAoDxd,UAA1C/B,EAAMuf,EAAMqN,IAAKrsB,EAAMoD,EAAOpC,IAC9DvB,GAGPO,EAAKiK,aAAcjJ,EAAMoC,EAAQ,IAC1BA,OAPPjF,GAAOq7B,WAAYx5B,EAAMgB,KAuB5Bw4B,WAAY,SAAUx5B,EAAMoD,GAC3B,GAAIpC,GAAM24B,EACT15B,EAAI,EACJ25B,EAAYx2B,GAASA,EAAM4F,MAAO0P,EAEnC,IAAKkhB,GAA+B,IAAlB55B,EAAKyC,SACtB,MAASzB,EAAO44B,EAAU35B,KACzB05B,EAAWx7B,EAAO07B,QAAS74B,IAAUA,EAGhC7C,EAAOgQ,KAAKnF,MAAMpB,KAAKmC,KAAM/I,GAE5Bu4B,IAAed,KAAoBa,GAAYvvB,KAAM/I,GACzDhB,EAAM25B,IAAa,EAInB35B,EAAM7B,EAAO6E,UAAW,WAAahC,IACpChB,EAAM25B,IAAa,EAKrBx7B,EAAOkQ,KAAMrO,EAAMgB,EAAM,IAG1BhB,EAAKuK,gBAAiBkuB,GAAkBz3B,EAAO24B,IAKlDD,WACCx3B,MACCmqB,IAAK,SAAUrsB,EAAMoD,GACpB,IAAMnF,EAAQ86B,YAAwB,UAAV31B,GAAqBjF,EAAO+E,SAASlD,EAAM,SAAW,CAGjF,GAAIsO,GAAMtO,EAAKoD,KAKf,OAJApD,GAAKiK,aAAc,OAAQ7G,GACtBkL,IACJtO,EAAKoD,MAAQkL,GAEPlL,QAQZi2B,IACChN,IAAK,SAAUrsB,EAAMoD,EAAOpC,GAa3B,MAZKoC,MAAU,EAEdjF,EAAOq7B,WAAYx5B,EAAMgB,GACdu4B,IAAed,KAAoBa,GAAYvvB,KAAM/I,GAEhEhB,EAAKiK,cAAewuB,IAAmBt6B,EAAO07B,QAAS74B,IAAUA,EAAMA,GAIvEhB,EAAM7B,EAAO6E,UAAW,WAAahC,IAAWhB,EAAMgB,IAAS,EAGzDA,IAKT7C,EAAOyB,KAAMzB,EAAOgQ,KAAKnF,MAAMpB,KAAK4X,OAAOxW,MAAO,QAAU,SAAU/I,EAAGe,GAExE,GAAI84B,GAAS1uB,GAAYpK,IAAU7C,EAAO0O,KAAKwB,IAE/CjD,IAAYpK,GAASu4B,IAAed,KAAoBa,GAAYvvB,KAAM/I,GACzE,SAAUhB,EAAMgB,EAAM6D,GACrB,GAAIpF,GAAK8iB,CAUT,OATM1d,KAEL0d,EAASnX,GAAYpK,GACrBoK,GAAYpK,GAASvB,EACrBA,EAAqC,MAA/Bq6B,EAAQ95B,EAAMgB,EAAM6D,GACzB7D,EAAKmC,cACL,KACDiI,GAAYpK,GAASuhB,GAEf9iB,GAER,SAAUO,EAAMgB,EAAM6D,GACrB,MAAMA,GAAN,OACQ7E,EAAM7B,EAAO6E,UAAW,WAAahC,IAC3CA,EAAKmC,cACL,QAMCo2B,IAAgBd,KACrBt6B,EAAOu7B,UAAUt2B,OAChBipB,IAAK,SAAUrsB,EAAMoD,EAAOpC,GAC3B,MAAK7C,GAAO+E,SAAUlD,EAAM,cAE3BA,EAAKiW,aAAe7S,GAGbg2B,IAAYA,GAAS/M,IAAKrsB,EAAMoD,EAAOpC,MAO5Cy3B,KAILW,IACC/M,IAAK,SAAUrsB,EAAMoD,EAAOpC,GAE3B,GAAIvB,GAAMO,EAAKgN,iBAAkBhM,EAUjC,OATMvB,IACLO,EAAK+5B,iBACHt6B,EAAMO,EAAKuJ,cAAcywB,gBAAiBh5B,IAI7CvB,EAAI2D,MAAQA,GAAS,GAGP,UAATpC,GAAoBoC,IAAUpD,EAAKgK,aAAchJ,GAC9CoC,EADR,SAOFgI,GAAWzB,GAAKyB,GAAWpK,KAAOoK,GAAW6uB,OAC5C,SAAUj6B,EAAMgB,EAAM6D,GACrB,GAAIpF,EACJ,OAAMoF,GAAN,QACSpF,EAAMO,EAAKgN,iBAAkBhM,KAAyB,KAAdvB,EAAI2D,MACnD3D,EAAI2D,MACJ,MAKJjF,EAAO86B,SAAS9mB,QACf9S,IAAK,SAAUW,EAAMgB,GACpB,GAAIvB,GAAMO,EAAKgN,iBAAkBhM,EACjC,OAAKvB,IAAOA,EAAI8O,UACR9O,EAAI2D,MADZ,QAIDipB,IAAK+M,GAAS/M,KAKfluB,EAAOu7B,UAAUQ,iBAChB7N,IAAK,SAAUrsB,EAAMoD,EAAOpC,GAC3Bo4B,GAAS/M,IAAKrsB,EAAgB,KAAVoD,GAAe,EAAQA,EAAOpC,KAMpD7C,EAAOyB,MAAO,QAAS,UAAY,SAAUK,EAAGe,GAC/C7C,EAAOu7B,UAAW14B,IACjBqrB,IAAK,SAAUrsB,EAAMoD,GACpB,MAAe,KAAVA,GACJpD,EAAKiK,aAAcjJ,EAAM,QAClBoC,GAFR,YASEnF,EAAQif,QACb/e,EAAOu7B,UAAUxc,OAChB7d,IAAK,SAAUW,GAId,MAAOA,GAAKkd,MAAMC,SAAW3b,QAE9B6qB,IAAK,SAAUrsB,EAAMoD,GACpB,MAASpD,GAAKkd,MAAMC,QAAU/Z,EAAQ,KAQzC,IAAI+2B,IAAa,6CAChBC,GAAa,eAEdj8B,GAAOG,GAAGsC,QACT8jB,KAAM,SAAU1jB,EAAMoC,GACrB,MAAOyc,GAAQviB,KAAMa,EAAOumB,KAAM1jB,EAAMoC,EAAOjD,UAAUjB,OAAS,IAGnEm7B,WAAY,SAAUr5B,GAErB,MADAA,GAAO7C,EAAO07B,QAAS74B,IAAUA,EAC1B1D,KAAKsC,KAAK,WAEhB,IACCtC,KAAM0D,GAASQ,aACRlE,MAAM0D,GACZ,MAAO0B,UAKZvE,EAAOyC,QACNi5B,SACCS,MAAO,UACPC,QAAS,aAGV7V,KAAM,SAAU1kB,EAAMgB,EAAMoC,GAC3B,GAAI3D,GAAKuf,EAAOwb,EACff,EAAQz5B,EAAKyC,QAGd,IAAMzC,GAAkB,IAAVy5B,GAAyB,IAAVA,GAAyB,IAAVA,EAY5C,MARAe,GAAmB,IAAVf,IAAgBt7B,EAAOgY,SAAUnW,GAErCw6B,IAEJx5B,EAAO7C,EAAO07B,QAAS74B,IAAUA,EACjCge,EAAQ7gB,EAAOk1B,UAAWryB,IAGZQ,SAAV4B,EACG4b,GAAS,OAASA,IAAoDxd,UAA1C/B,EAAMuf,EAAMqN,IAAKrsB,EAAMoD,EAAOpC,IAChEvB,EACEO,EAAMgB,GAASoC,EAGX4b,GAAS,OAASA,IAA6C,QAAnCvf,EAAMuf,EAAM3f,IAAKW,EAAMgB,IACzDvB,EACAO,EAAMgB,IAITqyB,WACC1hB,UACCtS,IAAK,SAAUW,GAId,GAAIy6B,GAAWt8B,EAAO0O,KAAKwB,KAAMrO,EAAM,WAEvC,OAAOy6B,GACNC,SAAUD,EAAU,IACpBN,GAAWpwB,KAAM/J,EAAKkD,WAAck3B,GAAWrwB,KAAM/J,EAAKkD,WAAclD,EAAK0R,KAC5E,EACA,QAQAzT,EAAQy6B,gBAEbv6B,EAAOyB,MAAO,OAAQ,OAAS,SAAUK,EAAGe,GAC3C7C,EAAOk1B,UAAWryB,IACjB3B,IAAK,SAAUW,GACd,MAAOA,GAAKgK,aAAchJ,EAAM,OAS9B/C,EAAQ26B,cACbz6B,EAAOk1B,UAAUthB,UAChB1S,IAAK,SAAUW,GACd,GAAIkM,GAASlM,EAAK0J,UAUlB,OARKwC,KACJA,EAAO8F,cAGF9F,EAAOxC,YACXwC,EAAOxC,WAAWsI,eAGb,QAKV7T,EAAOyB,MACN,WACA,WACA,YACA,cACA,cACA,UACA,UACA,SACA,cACA,mBACE,WACFzB,EAAO07B,QAASv8B,KAAK6F,eAAkB7F,OAIlCW,EAAQ46B,UACb16B,EAAO07B,QAAQhB,QAAU,WAM1B,IAAI8B,IAAS,aAEbx8B,GAAOG,GAAGsC,QACTg6B,SAAU,SAAUx3B,GACnB,GAAIy3B,GAAS76B,EAAMsL,EAAKwvB,EAAOt6B,EAAGu6B,EACjC96B,EAAI,EACJM,EAAMjD,KAAK4B,OACX87B,EAA2B,gBAAV53B,IAAsBA,CAExC,IAAKjF,EAAOkD,WAAY+B,GACvB,MAAO9F,MAAKsC,KAAK,SAAUY,GAC1BrC,EAAQb,MAAOs9B,SAAUx3B,EAAMhE,KAAM9B,KAAMkD,EAAGlD,KAAKkP,aAIrD,IAAKwuB,EAIJ,IAFAH,GAAYz3B,GAAS,IAAK4F,MAAO0P,OAErBnY,EAAJN,EAASA,IAOhB,GANAD,EAAO1C,KAAM2C,GACbqL,EAAwB,IAAlBtL,EAAKyC,WAAoBzC,EAAKwM,WACjC,IAAMxM,EAAKwM,UAAY,KAAM5K,QAAS+4B,GAAQ,KAChD,KAGU,CACVn6B,EAAI,CACJ,OAASs6B,EAAQD,EAAQr6B,KACnB8K,EAAI1N,QAAS,IAAMk9B,EAAQ,KAAQ,IACvCxvB,GAAOwvB,EAAQ,IAKjBC,GAAa58B,EAAO2E,KAAMwI,GACrBtL,EAAKwM,YAAcuuB,IACvB/6B,EAAKwM,UAAYuuB,GAMrB,MAAOz9B,OAGR29B,YAAa,SAAU73B,GACtB,GAAIy3B,GAAS76B,EAAMsL,EAAKwvB,EAAOt6B,EAAGu6B,EACjC96B,EAAI,EACJM,EAAMjD,KAAK4B,OACX87B,EAA+B,IAArB76B,UAAUjB,QAAiC,gBAAVkE,IAAsBA,CAElE,IAAKjF,EAAOkD,WAAY+B,GACvB,MAAO9F,MAAKsC,KAAK,SAAUY,GAC1BrC,EAAQb,MAAO29B,YAAa73B,EAAMhE,KAAM9B,KAAMkD,EAAGlD,KAAKkP,aAGxD,IAAKwuB,EAGJ,IAFAH,GAAYz3B,GAAS,IAAK4F,MAAO0P,OAErBnY,EAAJN,EAASA,IAQhB,GAPAD,EAAO1C,KAAM2C,GAEbqL,EAAwB,IAAlBtL,EAAKyC,WAAoBzC,EAAKwM,WACjC,IAAMxM,EAAKwM,UAAY,KAAM5K,QAAS+4B,GAAQ,KAChD,IAGU,CACVn6B,EAAI,CACJ,OAASs6B,EAAQD,EAAQr6B,KAExB,MAAQ8K,EAAI1N,QAAS,IAAMk9B,EAAQ,MAAS,EAC3CxvB,EAAMA,EAAI1J,QAAS,IAAMk5B,EAAQ,IAAK,IAKxCC,GAAa33B,EAAQjF,EAAO2E,KAAMwI,GAAQ,GACrCtL,EAAKwM,YAAcuuB,IACvB/6B,EAAKwM,UAAYuuB,GAMrB,MAAOz9B,OAGR49B,YAAa,SAAU93B,EAAO+3B,GAC7B,GAAIj5B,SAAckB,EAElB,OAAyB,iBAAb+3B,IAAmC,WAATj5B,EAC9Bi5B,EAAW79B,KAAKs9B,SAAUx3B,GAAU9F,KAAK29B,YAAa73B,GAItD9F,KAAKsC,KADRzB,EAAOkD,WAAY+B,GACN,SAAUnD,GAC1B9B,EAAQb,MAAO49B,YAAa93B,EAAMhE,KAAK9B,KAAM2C,EAAG3C,KAAKkP,UAAW2uB,GAAWA,IAI5D,WAChB,GAAc,WAATj5B,EAAoB,CAExB,GAAIsK,GACHvM,EAAI,EACJwW,EAAOtY,EAAQb,MACf89B,EAAah4B,EAAM4F,MAAO0P,MAE3B,OAASlM,EAAY4uB,EAAYn7B,KAE3BwW,EAAK4kB,SAAU7uB,GACnBiK,EAAKwkB,YAAazuB,GAElBiK,EAAKmkB,SAAUpuB,QAKNtK,IAAS6a,GAAyB,YAAT7a,KAC/B5E,KAAKkP,WAETrO,EAAOwgB,MAAOrhB,KAAM,gBAAiBA,KAAKkP,WAO3ClP,KAAKkP,UAAYlP,KAAKkP,WAAapJ,KAAU,EAAQ,GAAKjF,EAAOwgB,MAAOrhB,KAAM,kBAAqB,OAKtG+9B,SAAU,SAAUj9B,GAInB,IAHA,GAAIoO,GAAY,IAAMpO,EAAW,IAChC6B,EAAI,EACJ0X,EAAIra,KAAK4B,OACEyY,EAAJ1X,EAAOA,IACd,GAA0B,IAArB3C,KAAK2C,GAAGwC,WAAmB,IAAMnF,KAAK2C,GAAGuM,UAAY,KAAK5K,QAAQ+4B,GAAQ,KAAK/8B,QAAS4O,IAAe,EAC3G,OAAO,CAIT,QAAO,KAUTrO,EAAOyB,KAAM,0MAEqD6E,MAAM,KAAM,SAAUxE,EAAGe,GAG1F7C,EAAOG,GAAI0C,GAAS,SAAU6B,EAAMvE,GACnC,MAAO6B,WAAUjB,OAAS,EACzB5B,KAAKsqB,GAAI5mB,EAAM,KAAM6B,EAAMvE,GAC3BhB,KAAK6lB,QAASniB,MAIjB7C,EAAOG,GAAGsC,QACT06B,MAAO,SAAUC,EAAQC,GACxB,MAAOl+B,MAAKwpB,WAAYyU,GAASxU,WAAYyU,GAASD,IAGvDE,KAAM,SAAU7Z,EAAO/e,EAAMvE,GAC5B,MAAOhB,MAAKsqB,GAAIhG,EAAO,KAAM/e,EAAMvE,IAEpCo9B,OAAQ,SAAU9Z,EAAOtjB,GACxB,MAAOhB,MAAK+e,IAAKuF,EAAO,KAAMtjB,IAG/Bq9B,SAAU,SAAUv9B,EAAUwjB,EAAO/e,EAAMvE,GAC1C,MAAOhB,MAAKsqB,GAAIhG,EAAOxjB,EAAUyE,EAAMvE,IAExCs9B,WAAY,SAAUx9B,EAAUwjB,EAAOtjB,GAEtC,MAA4B,KAArB6B,UAAUjB,OAAe5B,KAAK+e,IAAKje,EAAU,MAASd,KAAK+e,IAAKuF,EAAOxjB,GAAY,KAAME,KAKlG,IAAIu9B,IAAQ19B,EAAOoG,MAEfu3B,GAAS,KAITC,GAAe,kIAEnB59B,GAAOyf,UAAY,SAAU/a,GAE5B,GAAKxF,EAAO2+B,MAAQ3+B,EAAO2+B,KAAKC,MAG/B,MAAO5+B,GAAO2+B,KAAKC,MAAOp5B,EAAO,GAGlC,IAAIq5B,GACHC,EAAQ,KACRC,EAAMj+B,EAAO2E,KAAMD,EAAO,GAI3B,OAAOu5B,KAAQj+B,EAAO2E,KAAMs5B,EAAIx6B,QAASm6B,GAAc,SAAUjmB,EAAOumB,EAAOC,EAAMlP,GAQpF,MALK8O,IAAmBG,IACvBF,EAAQ,GAIM,IAAVA,EACGrmB,GAIRomB,EAAkBI,GAAQD,EAM1BF,IAAU/O,GAASkP,EAGZ,OAELC,SAAU,UAAYH,KACxBj+B,EAAO2D,MAAO,iBAAmBe,IAKnC1E,EAAOq+B,SAAW,SAAU35B,GAC3B,GAAIsN,GAAK7L,CACT,KAAMzB,GAAwB,gBAATA,GACpB,MAAO,KAER,KACMxF,EAAOo/B,WACXn4B,EAAM,GAAIm4B,WACVtsB,EAAM7L,EAAIo4B,gBAAiB75B,EAAM,cAEjCsN,EAAM,GAAIwsB,eAAe,oBACzBxsB,EAAIysB,MAAQ,QACZzsB,EAAI0sB,QAASh6B,IAEb,MAAOH,GACRyN,EAAM3O,OAKP,MAHM2O,IAAQA,EAAIpE,kBAAmBoE,EAAIvG,qBAAsB,eAAgB1K,QAC9Ef,EAAO2D,MAAO,gBAAkBe,GAE1BsN,EAIR,IAEC2sB,IACAC,GAEAC,GAAQ,OACRC,GAAM,gBACNC,GAAW,gCAEXC,GAAiB,4DACjBC,GAAa,iBACbC,GAAY,QACZC,GAAO,4DAWPC,MAOAC,MAGAC,GAAW,KAAK//B,OAAO,IAIxB,KACCq/B,GAAe1rB,SAASK,KACvB,MAAOhP,IAGRq6B,GAAe7/B,EAAS6N,cAAe,KACvCgyB,GAAarrB,KAAO,GACpBqrB,GAAeA,GAAarrB,KAI7BorB,GAAeQ,GAAK9zB,KAAMuzB,GAAa55B,kBAGvC,SAASu6B,IAA6BC,GAGrC,MAAO,UAAUC,EAAoB5jB,GAED,gBAAvB4jB,KACX5jB,EAAO4jB,EACPA,EAAqB,IAGtB,IAAIC,GACH59B,EAAI,EACJ69B,EAAYF,EAAmBz6B,cAAc6F,MAAO0P,MAErD,IAAKva,EAAOkD,WAAY2Y,GAEvB,MAAS6jB,EAAWC,EAAU79B,KAEC,MAAzB49B,EAASjnB,OAAQ,IACrBinB,EAAWA,EAASpgC,MAAO,IAAO,KACjCkgC,EAAWE,GAAaF,EAAWE,QAAkB3vB,QAAS8L,KAI9D2jB,EAAWE,GAAaF,EAAWE,QAAkBlgC,KAAMqc,IAQjE,QAAS+jB,IAA+BJ,EAAW18B,EAASs1B,EAAiByH,GAE5E,GAAIC,MACHC,EAAqBP,IAAcH,EAEpC,SAASW,GAASN,GACjB,GAAI9rB,EAYJ,OAXAksB,GAAWJ,IAAa,EACxB1/B,EAAOyB,KAAM+9B,EAAWE,OAAkB,SAAUv1B,EAAG81B,GACtD,GAAIC,GAAsBD,EAAoBn9B,EAASs1B,EAAiByH,EACxE,OAAoC,gBAAxBK,IAAqCH,GAAqBD,EAAWI,GAIrEH,IACDnsB,EAAWssB,GADf,QAHNp9B,EAAQ68B,UAAU5vB,QAASmwB,GAC3BF,EAASE,IACF,KAKFtsB,EAGR,MAAOosB,GAASl9B,EAAQ68B,UAAW,MAAUG,EAAW,MAASE,EAAS,KAM3E,QAASG,IAAYn9B,EAAQN,GAC5B,GAAIO,GAAMoB,EACT+7B,EAAcpgC,EAAOqgC,aAAaD,eAEnC,KAAM/7B,IAAO3B,GACQW,SAAfX,EAAK2B,MACP+7B,EAAa/7B,GAAQrB,EAAWC,IAASA,OAAgBoB,GAAQ3B,EAAK2B,GAO1E,OAJKpB,IACJjD,EAAOyC,QAAQ,EAAMO,EAAQC,GAGvBD,EAOR,QAASs9B,IAAqBC,EAAGV,EAAOW,GACvC,GAAIC,GAAeC,EAAIC,EAAe58B,EACrCgV,EAAWwnB,EAAExnB,SACb4mB,EAAYY,EAAEZ,SAGf,OAA2B,MAAnBA,EAAW,GAClBA,EAAUnzB,QACEnJ,SAAPq9B,IACJA,EAAKH,EAAEK,UAAYf,EAAMgB,kBAAkB,gBAK7C,IAAKH,EACJ,IAAM38B,IAAQgV,GACb,GAAKA,EAAUhV,IAAUgV,EAAUhV,GAAO6H,KAAM80B,GAAO,CACtDf,EAAU5vB,QAAShM,EACnB,OAMH,GAAK47B,EAAW,IAAOa,GACtBG,EAAgBhB,EAAW,OACrB,CAEN,IAAM57B,IAAQy8B,GAAY,CACzB,IAAMb,EAAW,IAAOY,EAAEO,WAAY/8B,EAAO,IAAM47B,EAAU,IAAO,CACnEgB,EAAgB58B,CAChB,OAEK08B,IACLA,EAAgB18B,GAIlB48B,EAAgBA,GAAiBF,EAMlC,MAAKE,IACCA,IAAkBhB,EAAW,IACjCA,EAAU5vB,QAAS4wB,GAEbH,EAAWG,IAJnB,OAWD,QAASI,IAAaR,EAAGS,EAAUnB,EAAOoB,GACzC,GAAIC,GAAOC,EAASC,EAAMj7B,EAAK8S,EAC9B6nB,KAEAnB,EAAYY,EAAEZ,UAAUrgC,OAGzB,IAAKqgC,EAAW,GACf,IAAMyB,IAAQb,GAAEO,WACfA,EAAYM,EAAKp8B,eAAkBu7B,EAAEO,WAAYM,EAInDD,GAAUxB,EAAUnzB,OAGpB,OAAQ20B,EAcP,GAZKZ,EAAEc,eAAgBF,KACtBtB,EAAOU,EAAEc,eAAgBF,IAAcH,IAIlC/nB,GAAQgoB,GAAaV,EAAEe,aAC5BN,EAAWT,EAAEe,WAAYN,EAAUT,EAAEb,WAGtCzmB,EAAOkoB,EACPA,EAAUxB,EAAUnzB,QAKnB,GAAiB,MAAZ20B,EAEJA,EAAUloB,MAGJ,IAAc,MAATA,GAAgBA,IAASkoB,EAAU,CAM9C,GAHAC,EAAON,EAAY7nB,EAAO,IAAMkoB,IAAaL,EAAY,KAAOK,IAG1DC,EACL,IAAMF,IAASJ,GAId,GADA36B,EAAM+6B,EAAM56B,MAAO,KACdH,EAAK,KAAQg7B,IAGjBC,EAAON,EAAY7nB,EAAO,IAAM9S,EAAK,KACpC26B,EAAY,KAAO36B,EAAK,KACb,CAENi7B,KAAS,EACbA,EAAON,EAAYI,GAGRJ,EAAYI,MAAY,IACnCC,EAAUh7B,EAAK,GACfw5B,EAAU5vB,QAAS5J,EAAK,IAEzB,OAOJ,GAAKi7B,KAAS,EAGb,GAAKA,GAAQb,EAAG,UACfS,EAAWI,EAAMJ,OAEjB,KACCA,EAAWI,EAAMJ,GAChB,MAAQz8B,GACT,OAASwX,MAAO,cAAepY,MAAOy9B,EAAO78B,EAAI,sBAAwB0U,EAAO,OAASkoB,IAQ/F,OAASplB,MAAO,UAAWrX,KAAMs8B,GAGlChhC,EAAOyC,QAGN8+B,OAAQ,EAGRC,gBACAC,QAEApB,cACCqB,IAAK9C,GACL76B,KAAM,MACN49B,QAAS3C,GAAepzB,KAAM+yB,GAAc,IAC5ChgC,QAAQ,EACRijC,aAAa,EACbnD,OAAO,EACPoD,YAAa,mDAabC,SACCvL,IAAK+I,GACLn6B,KAAM,aACN2oB,KAAM,YACN9b,IAAK,4BACL+vB,KAAM,qCAGPhpB,UACC/G,IAAK,MACL8b,KAAM,OACNiU,KAAM,QAGPV,gBACCrvB,IAAK,cACL7M,KAAM,eACN48B,KAAM,gBAKPjB,YAGCkB,SAAUz3B,OAGV03B,aAAa,EAGbC,YAAaliC,EAAOyf,UAGpB0iB,WAAYniC,EAAOq+B,UAOpB+B,aACCsB,KAAK,EACLxhC,SAAS,IAOXkiC,UAAW,SAAUp/B,EAAQq/B,GAC5B,MAAOA,GAGNlC,GAAYA,GAAYn9B,EAAQhD,EAAOqgC,cAAgBgC,GAGvDlC,GAAYngC,EAAOqgC,aAAcr9B,IAGnCs/B,cAAe/C,GAA6BH,IAC5CmD,cAAehD,GAA6BF,IAG5CmD,KAAM,SAAUd,EAAK5+B,GAGA,gBAAR4+B,KACX5+B,EAAU4+B,EACVA,EAAMr+B,QAIPP,EAAUA,KAEV,IACC8xB,GAEA9yB,EAEA2gC,EAEAC,EAEAC,EAGAC,EAEAC,EAEAC,EAEAvC,EAAIvgC,EAAOoiC,aAAet/B,GAE1BigC,EAAkBxC,EAAErgC,SAAWqgC,EAE/ByC,EAAqBzC,EAAErgC,UAAa6iC,EAAgBz+B,UAAYy+B,EAAgBliC,QAC/Eb,EAAQ+iC,GACR/iC,EAAOue,MAERrC,EAAWlc,EAAO4b,WAClBqnB,EAAmBjjC,EAAO4a,UAAU,eAEpCsoB,EAAa3C,EAAE2C,eAEfC,KACAC,KAEArnB,EAAQ,EAERsnB,EAAW,WAEXxD,GACCrhB,WAAY,EAGZqiB,kBAAmB,SAAUx8B,GAC5B,GAAIwG,EACJ,IAAe,IAAVkR,EAAc,CAClB,IAAM+mB,EAAkB,CACvBA,IACA,OAASj4B,EAAQk0B,GAAS1zB,KAAMq3B,GAC/BI,EAAiBj4B,EAAM,GAAG7F,eAAkB6F,EAAO,GAGrDA,EAAQi4B,EAAiBz+B,EAAIW,eAE9B,MAAgB,OAAT6F,EAAgB,KAAOA,GAI/By4B,sBAAuB,WACtB,MAAiB,KAAVvnB,EAAc2mB,EAAwB,MAI9Ca,iBAAkB,SAAU1gC,EAAMoC,GACjC,GAAIu+B,GAAQ3gC,EAAKmC,aAKjB,OAJM+W,KACLlZ,EAAOugC,EAAqBI,GAAUJ,EAAqBI,IAAW3gC,EACtEsgC,EAAgBtgC,GAASoC,GAEnB9F,MAIRskC,iBAAkB,SAAU1/B,GAI3B,MAHMgY,KACLwkB,EAAEK,SAAW78B,GAEP5E,MAIR+jC,WAAY,SAAUthC,GACrB,GAAI8hC,EACJ,IAAK9hC,EACJ,GAAa,EAARma,EACJ,IAAM2nB,IAAQ9hC,GAEbshC,EAAYQ,IAAWR,EAAYQ,GAAQ9hC,EAAK8hC,QAIjD7D,GAAM5jB,OAAQra,EAAKi+B,EAAM8D,QAG3B,OAAOxkC,OAIRykC,MAAO,SAAUC,GAChB,GAAIC,GAAYD,GAAcR,CAK9B,OAJKR,IACJA,EAAUe,MAAOE,GAElBr8B,EAAM,EAAGq8B,GACF3kC,MAwCV,IAnCA+c,EAASF,QAAS6jB,GAAQrH,SAAWyK,EAAiBrpB,IACtDimB,EAAMkE,QAAUlE,EAAMp4B,KACtBo4B,EAAMl8B,MAAQk8B,EAAM1jB,KAMpBokB,EAAEmB,MAAUA,GAAOnB,EAAEmB,KAAO9C,IAAiB,IAAKn7B,QAASo7B,GAAO,IAAKp7B,QAASy7B,GAAWP,GAAc,GAAM,MAG/G4B,EAAEx8B,KAAOjB,EAAQkhC,QAAUlhC,EAAQiB,MAAQw8B,EAAEyD,QAAUzD,EAAEx8B,KAGzDw8B,EAAEZ,UAAY3/B,EAAO2E,KAAM47B,EAAEb,UAAY,KAAM16B,cAAc6F,MAAO0P,KAAiB,IAG/D,MAAjBgmB,EAAE0D,cACNrP,EAAQuK,GAAK9zB,KAAMk1B,EAAEmB,IAAI18B,eACzBu7B,EAAE0D,eAAkBrP,GACjBA,EAAO,KAAQ+J,GAAc,IAAO/J,EAAO,KAAQ+J,GAAc,KAChE/J,EAAO,KAAwB,UAAfA,EAAO,GAAkB,KAAO,WAC/C+J,GAAc,KAA+B,UAAtBA,GAAc,GAAkB,KAAO,UAK/D4B,EAAE77B,MAAQ67B,EAAEqB,aAAiC,gBAAXrB,GAAE77B,OACxC67B,EAAE77B,KAAO1E,EAAO+qB,MAAOwV,EAAE77B,KAAM67B,EAAE2D,cAIlCtE,GAA+BR,GAAYmB,EAAGz9B,EAAS+8B,GAGxC,IAAV9jB,EACJ,MAAO8jB,EAKR+C,GAAc5iC,EAAOue,OAASgiB,EAAE5hC,OAG3BikC,GAAmC,IAApB5iC,EAAOuhC,UAC1BvhC,EAAOue,MAAMyG,QAAQ,aAItBub,EAAEx8B,KAAOw8B,EAAEx8B,KAAKpD,cAGhB4/B,EAAE4D,YAAclF,GAAWrzB,KAAM20B,EAAEx8B,MAInC0+B,EAAWlC,EAAEmB,IAGPnB,EAAE4D,aAGF5D,EAAE77B,OACN+9B,EAAalC,EAAEmB,MAAS/D,GAAO/xB,KAAM62B,GAAa,IAAM,KAAQlC,EAAE77B,WAE3D67B,GAAE77B,MAIL67B,EAAEj0B,SAAU,IAChBi0B,EAAEmB,IAAM5C,GAAIlzB,KAAM62B,GAGjBA,EAASh/B,QAASq7B,GAAK,OAASpB,MAGhC+E,GAAa9E,GAAO/xB,KAAM62B,GAAa,IAAM,KAAQ,KAAO/E,OAK1D6C,EAAE6D,aACDpkC,EAAOwhC,aAAciB,IACzB5C,EAAM0D,iBAAkB,oBAAqBvjC,EAAOwhC,aAAciB,IAE9DziC,EAAOyhC,KAAMgB,IACjB5C,EAAM0D,iBAAkB,gBAAiBvjC,EAAOyhC,KAAMgB,MAKnDlC,EAAE77B,MAAQ67B,EAAE4D,YAAc5D,EAAEsB,eAAgB,GAAS/+B,EAAQ++B,cACjEhC,EAAM0D,iBAAkB,eAAgBhD,EAAEsB,aAI3ChC,EAAM0D,iBACL,SACAhD,EAAEZ,UAAW,IAAOY,EAAEuB,QAASvB,EAAEZ,UAAU,IAC1CY,EAAEuB,QAASvB,EAAEZ,UAAU,KAA8B,MAArBY,EAAEZ,UAAW,GAAc,KAAOL,GAAW,WAAa,IAC1FiB,EAAEuB,QAAS,KAIb,KAAMhgC,IAAKy+B,GAAE8D,QACZxE,EAAM0D,iBAAkBzhC,EAAGy+B,EAAE8D,QAASviC,GAIvC,IAAKy+B,EAAE+D,aAAgB/D,EAAE+D,WAAWrjC,KAAM8hC,EAAiBlD,EAAOU,MAAQ,GAAmB,IAAVxkB,GAElF,MAAO8jB,GAAM+D,OAIdP,GAAW,OAGX,KAAMvhC,KAAOiiC,QAAS,EAAGpgC,MAAO,EAAG60B,SAAU,GAC5CqH,EAAO/9B,GAAKy+B,EAAGz+B,GAOhB,IAHA+gC,EAAYjD,GAA+BP,GAAYkB,EAAGz9B,EAAS+8B,GAK5D,CACNA,EAAMrhB,WAAa,EAGdokB,GACJI,EAAmBhe,QAAS,YAAc6a,EAAOU,IAG7CA,EAAE9B,OAAS8B,EAAEnG,QAAU,IAC3BuI,EAAe3kB,WAAW,WACzB6hB,EAAM+D,MAAM,YACVrD,EAAEnG,SAGN,KACCre,EAAQ,EACR8mB,EAAU0B,KAAMpB,EAAgB17B,GAC/B,MAAQlD,GAET,KAAa,EAARwX,GAIJ,KAAMxX,EAHNkD,GAAM,GAAIlD,QArBZkD,GAAM,GAAI,eA8BX,SAASA,GAAMk8B,EAAQa,EAAkBhE,EAAW6D,GACnD,GAAIpD,GAAW8C,EAASpgC,EAAOq9B,EAAUyD,EACxCZ,EAAaW,CAGC,KAAVzoB,IAKLA,EAAQ,EAGH4mB,GACJtI,aAAcsI,GAKfE,EAAYx/B,OAGZq/B,EAAwB2B,GAAW,GAGnCxE,EAAMrhB,WAAamlB,EAAS,EAAI,EAAI,EAGpC1C,EAAY0C,GAAU,KAAgB,IAATA,GAA2B,MAAXA,EAGxCnD,IACJQ,EAAWV,GAAqBC,EAAGV,EAAOW,IAI3CQ,EAAWD,GAAaR,EAAGS,EAAUnB,EAAOoB,GAGvCA,GAGCV,EAAE6D,aACNK,EAAW5E,EAAMgB,kBAAkB,iBAC9B4D,IACJzkC,EAAOwhC,aAAciB,GAAagC,GAEnCA,EAAW5E,EAAMgB,kBAAkB,QAC9B4D,IACJzkC,EAAOyhC,KAAMgB,GAAagC,IAKZ,MAAXd,GAA6B,SAAXpD,EAAEx8B,KACxB8/B,EAAa,YAGS,MAAXF,EACXE,EAAa,eAIbA,EAAa7C,EAASjlB,MACtBgoB,EAAU/C,EAASt8B,KACnBf,EAAQq9B,EAASr9B,MACjBs9B,GAAat9B,KAKdA,EAAQkgC,GACHF,IAAWE,KACfA,EAAa,QACC,EAATF,IACJA,EAAS,KAMZ9D,EAAM8D,OAASA,EACf9D,EAAMgE,YAAeW,GAAoBX,GAAe,GAGnD5C,EACJ/kB,EAASqB,YAAawlB,GAAmBgB,EAASF,EAAYhE,IAE9D3jB,EAASoc,WAAYyK,GAAmBlD,EAAOgE,EAAYlgC,IAI5Dk8B,EAAMqD,WAAYA,GAClBA,EAAa7/B,OAERu/B,GACJI,EAAmBhe,QAASic,EAAY,cAAgB,aACrDpB,EAAOU,EAAGU,EAAY8C,EAAUpgC,IAIpCs/B,EAAiBtnB,SAAUonB,GAAmBlD,EAAOgE,IAEhDjB,IACJI,EAAmBhe,QAAS,gBAAkB6a,EAAOU,MAE3CvgC,EAAOuhC,QAChBvhC,EAAOue,MAAMyG,QAAQ,cAKxB,MAAO6a,IAGR6E,QAAS,SAAUhD,EAAKh9B,EAAMhD,GAC7B,MAAO1B,GAAOkB,IAAKwgC,EAAKh9B,EAAMhD,EAAU,SAGzCijC,UAAW,SAAUjD,EAAKhgC,GACzB,MAAO1B,GAAOkB,IAAKwgC,EAAKr+B,OAAW3B,EAAU,aAI/C1B,EAAOyB,MAAQ,MAAO,QAAU,SAAUK,EAAGkiC,GAC5ChkC,EAAQgkC,GAAW,SAAUtC,EAAKh9B,EAAMhD,EAAUqC,GAQjD,MANK/D,GAAOkD,WAAYwB,KACvBX,EAAOA,GAAQrC,EACfA,EAAWgD,EACXA,EAAOrB,QAGDrD,EAAOwiC,MACbd,IAAKA,EACL39B,KAAMigC,EACNtE,SAAU37B,EACVW,KAAMA,EACNq/B,QAASriC,OAMZ1B,EAAOouB,SAAW,SAAUsT,GAC3B,MAAO1hC,GAAOwiC,MACbd,IAAKA,EACL39B,KAAM,MACN27B,SAAU,SACVjB,OAAO,EACP9/B,QAAQ,EACRimC,UAAU,KAKZ5kC,EAAOG,GAAGsC,QACToiC,QAAS,SAAU/W,GAClB,GAAK9tB,EAAOkD,WAAY4qB,GACvB,MAAO3uB,MAAKsC,KAAK,SAASK,GACzB9B,EAAOb,MAAM0lC,QAAS/W,EAAK7sB,KAAK9B,KAAM2C,KAIxC,IAAK3C,KAAK,GAAK,CAEd,GAAIguB,GAAOntB,EAAQ8tB,EAAM3uB,KAAK,GAAGiM,eAAgBlJ,GAAG,GAAGa,OAAM,EAExD5D,MAAK,GAAGoM,YACZ4hB,EAAKO,aAAcvuB,KAAK,IAGzBguB,EAAKvrB,IAAI,WACR,GAAIC,GAAO1C,IAEX,OAAQ0C,EAAK6O,YAA2C,IAA7B7O,EAAK6O,WAAWpM,SAC1CzC,EAAOA,EAAK6O,UAGb,OAAO7O,KACL0rB,OAAQpuB,MAGZ,MAAOA,OAGR2lC,UAAW,SAAUhX,GACpB,MACQ3uB,MAAKsC,KADRzB,EAAOkD,WAAY4qB,GACN,SAAShsB,GACzB9B,EAAOb,MAAM2lC,UAAWhX,EAAK7sB,KAAK9B,KAAM2C,KAIzB,WAChB,GAAIwW,GAAOtY,EAAQb,MAClB4Z,EAAWT,EAAKS,UAEZA,GAAShY,OACbgY,EAAS8rB,QAAS/W,GAGlBxV,EAAKiV,OAAQO,MAKhBX,KAAM,SAAUW,GACf,GAAI5qB,GAAalD,EAAOkD,WAAY4qB,EAEpC,OAAO3uB,MAAKsC,KAAK,SAASK,GACzB9B,EAAQb,MAAO0lC,QAAS3hC,EAAa4qB,EAAK7sB,KAAK9B,KAAM2C,GAAKgsB,MAI5DiX,OAAQ,WACP,MAAO5lC,MAAK4O,SAAStM,KAAK,WACnBzB,EAAO+E,SAAU5F,KAAM,SAC5Ba,EAAQb,MAAO4uB,YAAa5uB,KAAKuL,cAEhCpI,SAKLtC,EAAOgQ,KAAK4E,QAAQke,OAAS,SAAUjxB,GAGtC,MAAOA,GAAKqd,aAAe,GAAKrd,EAAK8vB,cAAgB,IAClD7xB,EAAQuxB,yBACiE,UAAxExvB,EAAKkd,OAASld,EAAKkd,MAAM8P,SAAY7uB,EAAOyhB,IAAK5f,EAAM,aAG5D7B,EAAOgQ,KAAK4E,QAAQowB,QAAU,SAAUnjC,GACvC,OAAQ7B,EAAOgQ,KAAK4E,QAAQke,OAAQjxB,GAMrC,IAAIojC,IAAM,OACTC,GAAW,QACXC,GAAQ,SACRC,GAAkB,wCAClBC,GAAe,oCAEhB,SAASC,IAAa9Q,EAAQ1wB,EAAKogC,EAAatqB,GAC/C,GAAI/W,EAEJ,IAAK7C,EAAOoD,QAASU,GAEpB9D,EAAOyB,KAAMqC,EAAK,SAAUhC,EAAGyjC,GACzBrB,GAAegB,GAASt5B,KAAM4oB,GAElC5a,EAAK4a,EAAQ+Q,GAIbD,GAAa9Q,EAAS,KAAqB,gBAAN+Q,GAAiBzjC,EAAI,IAAO,IAAKyjC,EAAGrB,EAAatqB,SAIlF,IAAMsqB,GAAsC,WAAvBlkC,EAAO+D,KAAMD,GAQxC8V,EAAK4a,EAAQ1wB,OANb,KAAMjB,IAAQiB,GACbwhC,GAAa9Q,EAAS,IAAM3xB,EAAO,IAAKiB,EAAKjB,GAAQqhC,EAAatqB,GAWrE5Z,EAAO+qB,MAAQ,SAAUhjB,EAAGm8B,GAC3B,GAAI1P,GACH+L,KACA3mB,EAAM,SAAUvV,EAAKY,GAEpBA,EAAQjF,EAAOkD,WAAY+B,GAAUA,IAAqB,MAATA,EAAgB,GAAKA,EACtEs7B,EAAGA,EAAEx/B,QAAWykC,mBAAoBnhC,GAAQ,IAAMmhC,mBAAoBvgC,GASxE,IALqB5B,SAAhB6gC,IACJA,EAAclkC,EAAOqgC,cAAgBrgC,EAAOqgC,aAAa6D,aAIrDlkC,EAAOoD,QAAS2E,IAASA,EAAElH,SAAWb,EAAOmD,cAAe4E,GAEhE/H,EAAOyB,KAAMsG,EAAG,WACf6R,EAAKza,KAAK0D,KAAM1D,KAAK8F,aAMtB,KAAMuvB,IAAUzsB,GACfu9B,GAAa9Q,EAAQzsB,EAAGysB,GAAU0P,EAAatqB,EAKjD,OAAO2mB,GAAEt0B,KAAM,KAAMxI,QAASwhC,GAAK,MAGpCjlC,EAAOG,GAAGsC,QACTgjC,UAAW,WACV,MAAOzlC,GAAO+qB,MAAO5rB,KAAKumC,mBAE3BA,eAAgB,WACf,MAAOvmC,MAAKyC,IAAI,WAEf,GAAIqO,GAAWjQ,EAAOumB,KAAMpnB,KAAM,WAClC,OAAO8Q,GAAWjQ,EAAOoF,UAAW6K,GAAa9Q,OAEjDwP,OAAO,WACP,GAAI5K,GAAO5E,KAAK4E,IAEhB,OAAO5E,MAAK0D,OAAS7C,EAAQb,MAAOoZ,GAAI,cACvC8sB,GAAaz5B,KAAMzM,KAAK4F,YAAeqgC,GAAgBx5B,KAAM7H,KAC3D5E,KAAKwU,UAAYoO,EAAenW,KAAM7H,MAEzCnC,IAAI,SAAUE,EAAGD,GACjB,GAAIsO,GAAMnQ,EAAQb,MAAOgR,KAEzB,OAAc,OAAPA,EACN,KACAnQ,EAAOoD,QAAS+M,GACfnQ,EAAO4B,IAAKuO,EAAK,SAAUA,GAC1B,OAAStN,KAAMhB,EAAKgB,KAAMoC,MAAOkL,EAAI1M,QAAS0hC,GAAO,YAEpDtiC,KAAMhB,EAAKgB,KAAMoC,MAAOkL,EAAI1M,QAAS0hC,GAAO,WAC9CjkC,SAOLlB,EAAOqgC,aAAasF,IAA+BtiC,SAAzBnE,EAAOs/B,cAEhC,WAGC,OAAQr/B,KAAKwiC,SAQZ,wCAAwC/1B,KAAMzM,KAAK4E,OAEnD6hC,MAAuBC,MAGzBD,EAED,IAAIE,IAAQ,EACXC,MACAC,GAAehmC,EAAOqgC,aAAasF,KAK/BzmC,GAAOkP,aACXlP,EAAOkP,YAAa,WAAY,WAC/B,IAAM,GAAI/J,KAAO0hC,IAChBA,GAAc1hC,GAAOhB,QAAW,KAMnCvD,EAAQmmC,OAASD,IAAkB,mBAAqBA,IACxDA,GAAelmC,EAAQ0iC,OAASwD,GAG3BA,IAEJhmC,EAAOuiC,cAAc,SAAUz/B,GAE9B,IAAMA,EAAQmhC,aAAenkC,EAAQmmC,KAAO,CAE3C,GAAIvkC,EAEJ,QACC6iC,KAAM,SAAUF,EAAS7L,GACxB,GAAI12B,GACH6jC,EAAM7iC,EAAQ6iC,MACdn6B,IAAOs6B,EAMR,IAHAH,EAAIxH,KAAMr7B,EAAQiB,KAAMjB,EAAQ4+B,IAAK5+B,EAAQ27B,MAAO37B,EAAQojC,SAAUpjC,EAAQ0R,UAGzE1R,EAAQqjC,UACZ,IAAMrkC,IAAKgB,GAAQqjC,UAClBR,EAAK7jC,GAAMgB,EAAQqjC,UAAWrkC,EAK3BgB,GAAQ89B,UAAY+E,EAAIlC,kBAC5BkC,EAAIlC,iBAAkB3gC,EAAQ89B,UAQzB99B,EAAQmhC,aAAgBI,EAAQ,sBACrCA,EAAQ,oBAAsB,iBAI/B,KAAMviC,IAAKuiC,GAOYhhC,SAAjBghC,EAASviC,IACb6jC,EAAIpC,iBAAkBzhC,EAAGuiC,EAASviC,GAAM,GAO1C6jC,GAAIpB,KAAQzhC,EAAQqhC,YAAcrhC,EAAQ4B,MAAU,MAGpDhD,EAAW,SAAUyI,EAAGi8B,GACvB,GAAIzC,GAAQE,EAAYrD,CAGxB,IAAK9+B,IAAc0kC,GAA8B,IAAnBT,EAAInnB,YAOjC,SALOunB,IAAcv6B,GACrB9J,EAAW2B,OACXsiC,EAAIU,mBAAqBrmC,EAAO6D,KAG3BuiC,EACoB,IAAnBT,EAAInnB,YACRmnB,EAAI/B,YAEC,CACNpD,KACAmD,EAASgC,EAAIhC,OAKoB,gBAArBgC,GAAIW,eACf9F,EAAUr7B,KAAOwgC,EAAIW,aAKtB,KACCzC,EAAa8B,EAAI9B,WAChB,MAAOt/B,GAERs/B,EAAa,GAQRF,IAAU7gC,EAAQ6+B,SAAY7+B,EAAQmhC,YAGrB,OAAXN,IACXA,EAAS,KAHTA,EAASnD,EAAUr7B,KAAO,IAAM,IAS9Bq7B,GACJhI,EAAUmL,EAAQE,EAAYrD,EAAWmF,EAAIrC,0BAIzCxgC,EAAQ27B,MAGiB,IAAnBkH,EAAInnB,WAGfR,WAAYtc,GAGZikC,EAAIU,mBAAqBN,GAAcv6B,GAAO9J,EAP9CA,KAWFkiC,MAAO,WACDliC,GACJA,EAAU2B,QAAW,OAS3B,SAASuiC,MACR,IACC,MAAO,IAAI1mC,GAAOqnC,eACjB,MAAOhiC,KAGV,QAASshC,MACR,IACC,MAAO,IAAI3mC,GAAOs/B,cAAe,qBAChC,MAAOj6B,KAOVvE,EAAOoiC,WACNN,SACC0E,OAAQ,6FAETztB,UACCytB,OAAQ,uBAET1F,YACC2F,cAAe,SAAUthC,GAExB,MADAnF,GAAOyE,WAAYU,GACZA,MAMVnF,EAAOsiC,cAAe,SAAU,SAAU/B,GACxBl9B,SAAZk9B,EAAEj0B,QACNi0B,EAAEj0B,OAAQ,GAENi0B,EAAE0D,cACN1D,EAAEx8B,KAAO,MACTw8B,EAAE5hC,QAAS,KAKbqB,EAAOuiC,cAAe,SAAU,SAAShC,GAGxC,GAAKA,EAAE0D,YAAc,CAEpB,GAAIuC,GACHE,EAAO3nC,EAAS2nC,MAAQ1mC,EAAO,QAAQ,IAAMjB,EAAS6O,eAEvD,QAEC22B,KAAM,SAAUp6B,EAAGzI,GAElB8kC,EAASznC,EAAS6N,cAAc,UAEhC45B,EAAO/H,OAAQ,EAEV8B,EAAEoG,gBACNH,EAAOI,QAAUrG,EAAEoG,eAGpBH,EAAO9jC,IAAM69B,EAAEmB,IAGf8E,EAAOK,OAASL,EAAOH,mBAAqB,SAAUl8B,EAAGi8B,IAEnDA,IAAYI,EAAOhoB,YAAc,kBAAkB5S,KAAM46B,EAAOhoB,eAGpEgoB,EAAOK,OAASL,EAAOH,mBAAqB,KAGvCG,EAAOj7B,YACXi7B,EAAOj7B,WAAWsB,YAAa25B,GAIhCA,EAAS,KAGHJ,GACL1kC,EAAU,IAAK,aAOlBglC,EAAKhZ,aAAc8Y,EAAQE,EAAKh2B,aAGjCkzB,MAAO,WACD4C,GACJA,EAAOK,OAAQxjC,QAAW,OAU/B,IAAIyjC,OACHC,GAAS,mBAGV/mC,GAAOoiC,WACN4E,MAAO,WACPC,cAAe,WACd,GAAIvlC,GAAWolC,GAAa5+B,OAAWlI,EAAOsD,QAAU,IAAQo6B,IAEhE,OADAv+B,MAAMuC,IAAa,EACZA,KAKT1B,EAAOsiC,cAAe,aAAc,SAAU/B,EAAG2G,EAAkBrH,GAElE,GAAIsH,GAAcC,EAAaC,EAC9BC,EAAW/G,EAAEyG,SAAU,IAAWD,GAAOn7B,KAAM20B,EAAEmB,KAChD,MACkB,gBAAXnB,GAAE77B,QAAwB67B,EAAEsB,aAAe,IAAKpiC,QAAQ,sCAAwCsnC,GAAOn7B,KAAM20B,EAAE77B,OAAU,OAIlI,OAAK4iC,IAAiC,UAArB/G,EAAEZ,UAAW,IAG7BwH,EAAe5G,EAAE0G,cAAgBjnC,EAAOkD,WAAYq9B,EAAE0G,eACrD1G,EAAE0G,gBACF1G,EAAE0G,cAGEK,EACJ/G,EAAG+G,GAAa/G,EAAG+G,GAAW7jC,QAASsjC,GAAQ,KAAOI,GAC3C5G,EAAEyG,SAAU,IACvBzG,EAAEmB,MAAS/D,GAAO/xB,KAAM20B,EAAEmB,KAAQ,IAAM,KAAQnB,EAAEyG,MAAQ,IAAMG,GAIjE5G,EAAEO,WAAW,eAAiB,WAI7B,MAHMuG,IACLrnC,EAAO2D,MAAOwjC,EAAe,mBAEvBE,EAAmB,IAI3B9G,EAAEZ,UAAW,GAAM,OAGnByH,EAAcloC,EAAQioC,GACtBjoC,EAAQioC,GAAiB,WACxBE,EAAoBrlC,WAIrB69B,EAAM5jB,OAAO,WAEZ/c,EAAQioC,GAAiBC,EAGpB7G,EAAG4G,KAEP5G,EAAE0G,cAAgBC,EAAiBD,cAGnCH,GAAatnC,KAAM2nC,IAIfE,GAAqBrnC,EAAOkD,WAAYkkC,IAC5CA,EAAaC,EAAmB,IAGjCA,EAAoBD,EAAc/jC,SAI5B,UAtDR,SAgEDrD,EAAO0Y,UAAY,SAAUhU,EAAMxE,EAASqnC,GAC3C,IAAM7iC,GAAwB,gBAATA,GACpB,MAAO,KAEgB,kBAAZxE,KACXqnC,EAAcrnC,EACdA,GAAU,GAEXA,EAAUA,GAAWnB,CAErB,IAAIyoC,GAAStvB,EAAW7M,KAAM3G,GAC7BuoB,GAAWsa,KAGZ,OAAKC,IACKtnC,EAAQ0M,cAAe46B,EAAO,MAGxCA,EAASxnC,EAAOgtB,eAAiBtoB,GAAQxE,EAAS+sB,GAE7CA,GAAWA,EAAQlsB,QACvBf,EAAQitB,GAAUzR,SAGZxb,EAAOuB,SAAWimC,EAAO98B,aAKjC,IAAI+8B,IAAQznC,EAAOG,GAAG6nB,IAKtBhoB,GAAOG,GAAG6nB,KAAO,SAAU0Z,EAAKgG,EAAQhmC,GACvC,GAAoB,gBAARggC,IAAoB+F,GAC/B,MAAOA,IAAM1lC,MAAO5C,KAAM6C,UAG3B,IAAI/B,GAAU+gC,EAAUj9B,EACvBuU,EAAOnZ,KACP+e,EAAMwjB,EAAIjiC,QAAQ,IA+CnB,OA7CKye,IAAO,IACXje,EAAWD,EAAO2E,KAAM+8B,EAAIpiC,MAAO4e,EAAKwjB,EAAI3gC,SAC5C2gC,EAAMA,EAAIpiC,MAAO,EAAG4e,IAIhBle,EAAOkD,WAAYwkC,IAGvBhmC,EAAWgmC,EACXA,EAASrkC,QAGEqkC,GAA4B,gBAAXA,KAC5B3jC,EAAO,QAIHuU,EAAKvX,OAAS,GAClBf,EAAOwiC,MACNd,IAAKA,EAGL39B,KAAMA,EACN27B,SAAU,OACVh7B,KAAMgjC,IACJjgC,KAAK,SAAU6+B,GAGjBtF,EAAWh/B,UAEXsW,EAAKwV,KAAM7tB,EAIVD,EAAO,SAASutB,OAAQvtB,EAAO0Y,UAAW4tB,IAAiB53B,KAAMzO,GAGjEqmC,KAEC9N,SAAU92B,GAAY,SAAUm+B,EAAO8D,GACzCrrB,EAAK7W,KAAMC,EAAUs/B,IAAcnB,EAAMyG,aAAc3C,EAAQ9D,MAI1D1gC,MAORa,EAAOyB,MAAQ,YAAa,WAAY,eAAgB,YAAa,cAAe,YAAc,SAAUK,EAAGiC,GAC9G/D,EAAOG,GAAI4D,GAAS,SAAU5D,GAC7B,MAAOhB,MAAKsqB,GAAI1lB,EAAM5D,MAOxBH,EAAOgQ,KAAK4E,QAAQ+yB,SAAW,SAAU9lC,GACxC,MAAO7B,GAAO2F,KAAK3F,EAAOq5B,OAAQ,SAAUl5B,GAC3C,MAAO0B,KAAS1B,EAAG0B,OACjBd,OAOJ,IAAImG,IAAUhI,EAAOH,SAAS6O,eAK9B,SAASg6B,IAAW/lC,GACnB,MAAO7B,GAAOiE,SAAUpC,GACvBA,EACkB,IAAlBA,EAAKyC,SACJzC,EAAKoM,aAAepM,EAAK4jB,cACzB,EAGHzlB,EAAO6nC,QACNC,UAAW,SAAUjmC,EAAMiB,EAAShB,GACnC,GAAIimC,GAAaC,EAASC,EAAWC,EAAQC,EAAWC,EAAYC,EACnElW,EAAWnyB,EAAOyhB,IAAK5f,EAAM,YAC7BymC,EAAUtoC,EAAQ6B,GAClBglB,IAGiB,YAAbsL,IACJtwB,EAAKkd,MAAMoT,SAAW,YAGvBgW,EAAYG,EAAQT,SACpBI,EAAYjoC,EAAOyhB,IAAK5f,EAAM,OAC9BumC,EAAapoC,EAAOyhB,IAAK5f,EAAM,QAC/BwmC,GAAmC,aAAblW,GAAwC,UAAbA,IAChDnyB,EAAOwF,QAAQ,QAAUyiC,EAAWG,IAAiB,GAGjDC,GACJN,EAAcO,EAAQnW,WACtB+V,EAASH,EAAY75B,IACrB85B,EAAUD,EAAY9X,OAEtBiY,EAAS/jC,WAAY8jC,IAAe,EACpCD,EAAU7jC,WAAYikC,IAAgB,GAGlCpoC,EAAOkD,WAAYJ,KACvBA,EAAUA,EAAQ7B,KAAMY,EAAMC,EAAGqmC,IAGd,MAAfrlC,EAAQoL,MACZ2Y,EAAM3Y,IAAQpL,EAAQoL,IAAMi6B,EAAUj6B,IAAQg6B,GAE1B,MAAhBplC,EAAQmtB,OACZpJ,EAAMoJ,KAASntB,EAAQmtB,KAAOkY,EAAUlY,KAAS+X,GAG7C,SAAWllC,GACfA,EAAQylC,MAAMtnC,KAAMY,EAAMglB,GAE1ByhB,EAAQ7mB,IAAKoF,KAKhB7mB,EAAOG,GAAGsC,QACTolC,OAAQ,SAAU/kC,GACjB,GAAKd,UAAUjB,OACd,MAAmBsC,UAAZP,EACN3D,KACAA,KAAKsC,KAAK,SAAUK,GACnB9B,EAAO6nC,OAAOC,UAAW3oC,KAAM2D,EAAShB,IAI3C,IAAIoF,GAASshC,EACZC,GAAQv6B,IAAK,EAAG+hB,KAAM,GACtBpuB,EAAO1C,KAAM,GACb6O,EAAMnM,GAAQA,EAAKuJ,aAEpB,IAAM4C,EAON,MAHA9G,GAAU8G,EAAIJ,gBAGR5N,EAAOsH,SAAUJ,EAASrF,UAMpBA,GAAK6mC,wBAA0B9pB,IAC1C6pB,EAAM5mC,EAAK6mC,yBAEZF,EAAMZ,GAAW55B,IAEhBE,IAAKu6B,EAAIv6B,KAASs6B,EAAIG,aAAezhC,EAAQ0gB,YAAiB1gB,EAAQ2gB,WAAc,GACpFoI,KAAMwY,EAAIxY,MAASuY,EAAII,aAAe1hC,EAAQsgB,aAAiBtgB,EAAQugB,YAAc,KAX9EghB,GAeTtW,SAAU,WACT,GAAMhzB,KAAM,GAAZ,CAIA,GAAI0pC,GAAchB,EACjBiB,GAAiB56B,IAAK,EAAG+hB,KAAM,GAC/BpuB,EAAO1C,KAAM,EAwBd,OArBwC,UAAnCa,EAAOyhB,IAAK5f,EAAM,YAEtBgmC,EAAShmC,EAAK6mC,yBAGdG,EAAe1pC,KAAK0pC,eAGpBhB,EAAS1oC,KAAK0oC,SACR7nC,EAAO+E,SAAU8jC,EAAc,GAAK,UACzCC,EAAeD,EAAahB,UAI7BiB,EAAa56B,KAAQlO,EAAOyhB,IAAKonB,EAAc,GAAK,kBAAkB,GACtEC,EAAa7Y,MAAQjwB,EAAOyhB,IAAKonB,EAAc,GAAK,mBAAmB,KAOvE36B,IAAM25B,EAAO35B,IAAO46B,EAAa56B,IAAMlO,EAAOyhB,IAAK5f,EAAM,aAAa,GACtEouB,KAAM4X,EAAO5X,KAAO6Y,EAAa7Y,KAAOjwB,EAAOyhB,IAAK5f,EAAM,cAAc,MAI1EgnC,aAAc,WACb,MAAO1pC,MAAKyC,IAAI,WACf,GAAIinC,GAAe1pC,KAAK0pC,cAAgB3hC,EAExC,OAAQ2hC,IAAmB7oC,EAAO+E,SAAU8jC,EAAc,SAAuD,WAA3C7oC,EAAOyhB,IAAKonB,EAAc,YAC/FA,EAAeA,EAAaA,YAE7B,OAAOA,IAAgB3hC,QAM1BlH,EAAOyB,MAAQ+lB,WAAY,cAAeI,UAAW,eAAiB,SAAUoc,EAAQzd,GACvF,GAAIrY,GAAM,IAAItC,KAAM2a,EAEpBvmB,GAAOG,GAAI6jC,GAAW,SAAU7zB,GAC/B,MAAOuR,GAAQviB,KAAM,SAAU0C,EAAMmiC,EAAQ7zB,GAC5C,GAAIq4B,GAAMZ,GAAW/lC,EAErB,OAAawB,UAAR8M,EACGq4B,EAAOjiB,IAAQiiB,GAAOA,EAAKjiB,GACjCiiB,EAAIzpC,SAAS6O,gBAAiBo2B,GAC9BniC,EAAMmiC,QAGHwE,EACJA,EAAIO,SACF76B,EAAYlO,EAAQwoC,GAAMhhB,aAApBrX,EACPjC,EAAMiC,EAAMnQ,EAAQwoC,GAAM5gB,aAI3B/lB,EAAMmiC,GAAW7zB,IAEhB6zB,EAAQ7zB,EAAKnO,UAAUjB,OAAQ,SAQpCf,EAAOyB,MAAQ,MAAO,QAAU,SAAUK,EAAGykB,GAC5CvmB,EAAOuzB,SAAUhN,GAAS+J,GAAcxwB,EAAQ0xB,cAC/C,SAAU3vB,EAAM+tB,GACf,MAAKA,IACJA,EAAWJ,GAAQ3tB,EAAM0kB,GAElB+I,GAAU1jB,KAAMgkB,GACtB5vB,EAAQ6B,GAAOswB,WAAY5L,GAAS,KACpCqJ,GALF,WAaH5vB,EAAOyB,MAAQunC,OAAQ,SAAUC,MAAO,SAAW,SAAUpmC,EAAMkB,GAClE/D,EAAOyB,MAAQ6yB,QAAS,QAAUzxB,EAAMmpB,QAASjoB,EAAM,GAAI,QAAUlB,GAAQ,SAAUqmC,EAAcC,GAEpGnpC,EAAOG,GAAIgpC,GAAa,SAAU9U,EAAQpvB,GACzC,GAAI0c,GAAY3f,UAAUjB,SAAYmoC,GAAkC,iBAAX7U,IAC5DnB,EAAQgW,IAAkB7U,KAAW,GAAQpvB,KAAU,EAAO,SAAW,SAE1E,OAAOyc,GAAQviB,KAAM,SAAU0C,EAAMkC,EAAMkB,GAC1C,GAAI+I,EAEJ,OAAKhO,GAAOiE,SAAUpC,GAIdA,EAAK9C,SAAS6O,gBAAiB,SAAW/K,GAI3B,IAAlBhB,EAAKyC,UACT0J,EAAMnM,EAAK+L,gBAIJrK,KAAKkC,IACX5D,EAAKkc,KAAM,SAAWlb,GAAQmL,EAAK,SAAWnL,GAC9ChB,EAAKkc,KAAM,SAAWlb,GAAQmL,EAAK,SAAWnL,GAC9CmL,EAAK,SAAWnL,KAIDQ,SAAV4B,EAENjF,EAAOyhB,IAAK5f,EAAMkC,EAAMmvB,GAGxBlzB,EAAO+e,MAAOld,EAAMkC,EAAMkB,EAAOiuB,IAChCnvB,EAAM4d,EAAY0S,EAAShxB,OAAWse,EAAW,WAOvD3hB,EAAOG,GAAGipC,KAAO,WAChB,MAAOjqC,MAAK4B,QAGbf,EAAOG,GAAGkpC,QAAUrpC,EAAOG,GAAG0Z,QAkBP,kBAAXyvB,SAAyBA,OAAOC,KAC3CD,OAAQ,YAAc,WACrB,MAAOtpC,IAOT,IAECwpC,IAAUtqC,EAAOc,OAGjBypC,GAAKvqC,EAAOwqC,CAwBb,OAtBA1pC,GAAO2pC,WAAa,SAAU1mC,GAS7B,MARK/D,GAAOwqC,IAAM1pC,IACjBd,EAAOwqC,EAAID,IAGPxmC,GAAQ/D,EAAOc,SAAWA,IAC9Bd,EAAOc,OAASwpC,IAGVxpC,SAMIZ,KAAawf,IACxB1f,EAAOc,OAASd,EAAOwqC,EAAI1pC,GAMrBA"} \ No newline at end of file diff --git a/uam-server/src/main/webapp/public/assets/layer/layer.js b/uam-server/src/main/webapp/public/assets/layer/layer.js new file mode 100644 index 0000000000000000000000000000000000000000..12cb6b5c0296d96c67b2a84931ccd3b884a47f3e --- /dev/null +++ b/uam-server/src/main/webapp/public/assets/layer/layer.js @@ -0,0 +1,2 @@ +/*! layer-v3.1.1 Web弹层组件 MIT License http://layer.layui.com/ By 贤心 */ + ;!function(e,t){"use strict";var i,n,a=e.layui&&layui.define,o={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,i=t.length-1,n=i;n>0;n--)if("interactive"===t[n].readyState){e=t[n].src;break}return e||t[i].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:["&#x786E;&#x5B9A;","&#x53D6;&#x6D88;"],type:["dialog","page","iframe","loading","tips"],getStyle:function(t,i){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](i)},link:function(t,i,n){if(r.path){var a=document.getElementsByTagName("head")[0],s=document.createElement("link");"string"==typeof i&&(n=i);var l=(n||t).replace(/\.|\//g,""),f="layuicss-"+l,c=0;s.rel="stylesheet",s.href=r.path+t,s.id=f,document.getElementById(f)||a.appendChild(s),"function"==typeof i&&!function u(){return++c>80?e.console&&console.error("layer.css: Invalid"):void(1989===parseInt(o.getStyle(document.getElementById(f),"width"))?i():setTimeout(u,100))}()}}},r={v:"3.1.1",ie:function(){var t=navigator.userAgent.toLowerCase();return!!(e.ActiveXObject||"ActiveXObject"in e)&&((t.match(/msie\s(\d+)/)||[])[1]||"11")}(),index:e.layer&&e.layer.v?1e5:0,path:o.getPath,config:function(e,t){return e=e||{},r.cache=o.config=i.extend({},o.config,e),r.path=o.config.path||r.path,"string"==typeof e.extend&&(e.extend=[e.extend]),o.config.path&&r.ready(),e.extend?(a?layui.addcss("modules/layer/"+e.extend):o.link("theme/"+e.extend),this):this},ready:function(e){var t="layer",i="",n=(a?"modules/layer/":"theme/")+"default/layer.css?v="+r.v+i;return a?layui.addcss(n,e,t):o.link(n,e,t),this},alert:function(e,t,n){var a="function"==typeof t;return a&&(n=t),r.open(i.extend({content:e,yes:n},a?{}:t))},confirm:function(e,t,n,a){var s="function"==typeof t;return s&&(a=n,n=t),r.open(i.extend({content:e,btn:o.btn,yes:n,btn2:a},s?{}:t))},msg:function(e,n,a){var s="function"==typeof n,f=o.config.skin,c=(f?f+" "+f+"-msg":"")||"layui-layer-msg",u=l.anim.length-1;return s&&(a=n),r.open(i.extend({content:e,time:3e3,shade:!1,skin:c,title:!1,closeBtn:!1,btn:!1,resize:!1,end:a},s&&!o.config.skin?{skin:c+" layui-layer-hui",anim:u}:function(){return n=n||{},(n.icon===-1||n.icon===t&&!o.config.skin)&&(n.skin=c+" "+(n.skin||"layui-layer-hui")),n}()))},load:function(e,t){return r.open(i.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,n){return r.open(i.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:210},n))}},s=function(e){var t=this;t.index=++r.index,t.config=i.extend({},t.config,o.config,e),document.body?t.creat():setTimeout(function(){t.creat()},30)};s.pt=s.prototype;var l=["layui-layer",".layui-layer-title",".layui-layer-main",".layui-layer-dialog","layui-layer-iframe","layui-layer-content","layui-layer-btn","layui-layer-close"];l.anim=["layer-anim-00","layer-anim-01","layer-anim-02","layer-anim-03","layer-anim-04","layer-anim-05","layer-anim-06"],s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:"&#x4FE1;&#x606F;",offset:"auto",area:"auto",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,isOutAnim:!0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},s.pt.vessel=function(e,t){var n=this,a=n.index,r=n.config,s=r.zIndex+a,f="object"==typeof r.title,c=r.maxmin&&(1===r.type||2===r.type),u=r.title?'<div class="layui-layer-title" style="'+(f?r.title[1]:"")+'">'+(f?r.title[0]:r.title)+"</div>":"";return r.zIndex=s,t([r.shade?'<div class="layui-layer-shade" id="layui-layer-shade'+a+'" times="'+a+'" style="'+("z-index:"+(s-1)+"; ")+'"></div>':"",'<div class="'+l[0]+(" layui-layer-"+o.type[r.type])+(0!=r.type&&2!=r.type||r.shade?"":" layui-layer-border")+" "+(r.skin||"")+'" id="'+l[0]+a+'" type="'+o.type[r.type]+'" times="'+a+'" showtime="'+r.time+'" conType="'+(e?"object":"string")+'" style="z-index: '+s+"; width:"+r.area[0]+";height:"+r.area[1]+(r.fixed?"":";position:absolute;")+'">'+(e&&2!=r.type?"":u)+'<div id="'+(r.id||"")+'" class="layui-layer-content'+(0==r.type&&r.icon!==-1?" layui-layer-padding":"")+(3==r.type?" layui-layer-loading"+r.icon:"")+'">'+(0==r.type&&r.icon!==-1?'<i class="layui-layer-ico layui-layer-ico'+r.icon+'"></i>':"")+(1==r.type&&e?"":r.content||"")+'</div><span class="layui-layer-setwin">'+function(){var e=c?'<a class="layui-layer-min" href="javascript:;"><cite></cite></a><a class="layui-layer-ico layui-layer-max" href="javascript:;"></a>':"";return r.closeBtn&&(e+='<a class="layui-layer-ico '+l[7]+" "+l[7]+(r.title?r.closeBtn:4==r.type?"1":"2")+'" href="javascript:;"></a>'),e}()+"</span>"+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t<i;t++)e+='<a class="'+l[6]+t+'">'+r.btn[t]+"</a>";return'<div class="'+l[6]+" layui-layer-btn-"+(r.btnAlign||"")+'">'+e+"</div>"}():"")+(r.resize?'<span class="layui-layer-resize"></span>':"")+"</div>"],u,i('<div class="layui-layer-move"></div>')),n},s.pt.creat=function(){var e=this,t=e.config,a=e.index,s=t.content,f="object"==typeof s,c=i("body");if(!t.id||!i("#"+t.id)[0]){switch("string"==typeof t.area&&(t.area="auto"===t.area?["",""]:[t.area,""]),t.shift&&(t.anim=t.shift),6==r.ie&&(t.fixed=!1),t.type){case 0:t.btn="btn"in t?t.btn:o.btn[0],r.closeAll("dialog");break;case 2:var s=t.content=f?t.content:[t.content||"http://layer.layui.com","auto"];t.content='<iframe scrolling="'+(t.content[1]||"auto")+'" allowtransparency="true" id="'+l[4]+a+'" name="'+l[4]+a+'" onload="this.className=\'\';" class="layui-layer-load" frameborder="0" src="'+t.content[0]+'"></iframe>';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll("loading");break;case 4:f||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'<i class="layui-layer-TipsG"></i>',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll("tips")}if(e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i("body").append(n[1])}():function(){s.parents("."+l[0])[0]||(s.data("display",s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]),i("#"+l[0]+a).find("."+l[5]).before(r))}()}():c.append(n[1]),i(".layui-layer-move")[0]||c.append(o.moveElem=u),e.layero=i("#"+l[0]+a),t.scrollbar||l.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),i("#layui-layer-shade"+e.index).css({"background-color":t.shade[1]||"#000",opacity:t.shade[0]||t.shade}),2==t.type&&6==r.ie&&e.layero.find("iframe").attr("src",s[0]),4==t.type?e.tips():e.offset(),t.fixed&&n.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]){var u="layer-anim "+l.anim[t.anim];e.layero.addClass(u).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){i(this).removeClass(u)})}t.isOutAnim&&e.layero.data("isOutAnim",!0)}},s.pt.auto=function(e){var t=this,a=t.config,o=i("#"+l[0]+e);""===a.area[0]&&a.maxWidth>0&&(r.ie&&r.ie<8&&a.btn&&o.width(o.innerWidth()),o.outerWidth()>a.maxWidth&&o.width(a.maxWidth));var s=[o.innerWidth(),o.innerHeight()],f=o.find(l[1]).outerHeight()||0,c=o.find("."+l[6]).outerHeight()||0,u=function(e){e=o.find(e),e.height(s[1]-f-c-2*(0|parseFloat(e.css("padding-top"))))};switch(a.type){case 2:u("iframe");break;default:""===a.area[1]?a.maxHeight>0&&o.outerHeight()>a.maxHeight?(s[1]=a.maxHeight,u("."+l[5])):a.fixed&&s[1]>=n.height()&&(s[1]=n.height(),u("."+l[5])):u("."+l[5])}return t},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o="object"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=n.width()-a[0]:"b"===t.offset?e.offsetTop=n.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):"rb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i("body"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:"auto"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find("."+l[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(".layui-layer-resize"),c={};return t.move&&l.css("cursor","move"),l.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css("left")),e.clientY-parseFloat(s.css("top"))],o.moveElem.css("cursor","move").show())}),f.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l="fixed"===s.css("position");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;a<c.stX&&(a=c.stX),a>f&&(a=f),o<c.stY&&(o=c.stY),o>u&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on("mouseup",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find("iframe").on("load",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find("."+l[6]).children("a").on("click",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find("."+l[7]).on("click",e),a.shadeClose&&i("#layui-layer-shade"+t.index).on("click",function(){r.close(t.index)}),n.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(n);e===!1||r.min(t.index,a)}),n.find(".layui-layer-max").on("click",function(){i(this).hasClass("layui-layer-maxmin")?(r.restore(t.index),a.restore&&a.restore(n)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i("select"),function(e,t){var n=i(this);n.parents("."+l[0])[0]||1==n.attr("layer")&&i("."+l[0]).length<1&&n.removeAttr("layer").show(),n=null})},s.pt.IE6=function(e){i("select").each(function(e,t){var n=i(this);n.parents("."+l[0])[0]||"none"===n.css("display")||n.attr({layer:"1"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css("z-index",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr("layer-full")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty("overflow"):l.html[0].style.removeAttribute("overflow"),l.html.removeAttr("layer-full"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i("."+l[4]).attr("times"),i("#"+l[0]+t).find("iframe").contents().find(e)},r.getFrameIndex=function(e){return i("#"+e).parents("."+l[4]).attr("times")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame("html",e).outerHeight(),n=i("#"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find("."+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find("iframe").css({height:t})}},r.iframeSrc=function(e,t){i("#"+l[0]+e).find("iframe").attr("src",t)},r.style=function(e,t,n){var a=i("#"+l[0]+e),r=a.find(".layui-layer-content"),s=a.attr("type"),f=a.find(l[1]).outerHeight()||0,c=a.find("."+l[6]).outerHeight()||0;a.attr("minLeft");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find("."+l[6]).outerHeight(),s===o.type[2]?a.find("iframe").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom"))}))},r.min=function(e,t){var a=i("#"+l[0]+e),s=a.find(l[1]).outerHeight()||0,f=a.attr("minLeft")||181*o.minIndex+"px",c=a.css("position");o.record(a),o.minLeft[0]&&(f=o.minLeft[0],o.minLeft.shift()),a.attr("position",c),r.style(e,{width:180,height:s,left:f,top:n.height()-s,position:"fixed",overflow:"hidden"},!0),a.find(".layui-layer-min").hide(),"page"===a.attr("type")&&a.find(l[4]).hide(),o.rescollbar(e),a.attr("minLeft")||o.minIndex++,a.attr("minLeft",f)},r.restore=function(e){var t=i("#"+l[0]+e),n=t.attr("area").split(",");t.attr("type");r.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(l[4]).show(),o.rescollbar(e)},r.full=function(e){var t,a=i("#"+l[0]+e);o.record(a),l.html.attr("layer-full")||l.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(".layui-layer-min").hide()},100)},r.title=function(e,t){var n=i("#"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e){var t=i("#"+l[0]+e),n=t.attr("type"),a="layer-anim-close";if(t[0]){var s="layui-layer-wrap",f=function(){if(n===o.type[1]&&"object"===t.attr("conType")){t.children(":not(."+l[5]+")").remove();for(var a=t.find("."+s),r=0;r<2;r++)a.unwrap();a.css("display",a.data("display")).removeClass(s)}else{if(n===o.type[2])try{var f=i("#"+l[4]+e)[0];f.contentWindow.document.write(""),f.contentWindow.close(),t.find("."+l[5])[0].removeChild(f)}catch(c){}t[0].innerHTML="",t.remove()}"function"==typeof o.end[e]&&o.end[e](),delete o.end[e]};t.data("isOutAnim")&&t.addClass("layer-anim "+a),i("#layui-layer-moves, #layui-layer-shade"+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),t.attr("minLeft")&&(o.minIndex--,o.minLeft.push(t.attr("minLeft"))),r.ie&&r.ie<10||!t.data("isOutAnim")?f():setTimeout(function(){f()},200)}},r.closeAll=function(e){i.each(i("."+l[0]),function(){var t=i(this),n=e?t.attr("type")===e:1;n&&r.close(t.attr("times")),n=null})};var f=r.cache||{},c=function(e){return f.skin?" "+f.skin+" "+f.skin+"-"+e:""};r.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var o=e.area;a='style="width: '+o[0]+"; height: "+o[1]+';"',delete e.area}var s,l=2==e.formType?'<textarea class="layui-layer-input"'+a+">"+(e.value||"")+"</textarea>":function(){return'<input type="'+(1==e.formType?"password":"text")+'" class="layui-layer-input" value="'+(e.value||"")+'">'}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["&#x786E;&#x5B9A;","&#x53D6;&#x6D88;"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(e){s=e.find(".layui-layer-input"),s.focus(),"function"==typeof f&&f(e)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("&#x6700;&#x591A;&#x8F93;&#x5165;"+(e.maxlength||500)+"&#x4E2A;&#x5B57;&#x6570;",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n="layui-this",a=e.success;return delete e.success,r.open(i.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,i=1,a="";if(e>0)for(a='<span class="'+n+'">'+t[0].title+"</span>";i<e;i++)a+="<span>"+t[i].title+"</span>";return a}(),content:'<ul class="layui-layer-tabmain">'+function(){var e=t.length,i=1,a="";if(e>0)for(a='<li class="layui-layer-tabli '+n+'">'+(t[0].content||"no content")+"</li>";i<e;i++)a+='<li class="layui-layer-tabli">'+(t[i].content||"no content")+"</li>";return a}()+"</ul>",success:function(t){var o=t.find(".layui-layer-title").children(),r=t.find(".layui-layer-tabmain").children();o.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var a=i(this),o=a.index();a.addClass(n).siblings().removeClass(n),r.eq(o).show().siblings().hide(),"function"==typeof e.change&&e.change(o)}),"function"==typeof a&&a(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=t.photos.constructor===Object,f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||"img";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg("&#x6CA1;&#x6709;&#x56FE;&#x7247;")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr("layer-index",e),u.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(h(),0===u.length)return;if(n||p.on("click",t.img,function(){var e=i(this),n=e.attr("layer-index");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0),h()}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){if(!(u.length<=1))return f.start=s.imgIndex-1,r.close(s.index),r.photos(t,!0,e)},s.event=function(){s.bigimg.hover(function(){s.imgsee.show()},function(){s.imgsee.hide()}),s.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),s.imgprev()}),s.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),s.imgnext()}),i(document).on("keyup",s.keyup)},s.loadi=r.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),s.index=r.open(i.extend({type:1,id:"layui-layer-photos",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]<r[1]&&(a[0]=a[0]/r[1],a[1]=a[1]/r[1])}return[a[0]+"px",a[1]+"px"]}(),title:!1,shade:.9,shadeClose:!0,closeBtn:!1,move:".layui-layer-phimg img",moveType:1,scrollbar:!1,moveOut:!0,isOutAnim:!1,skin:"layui-layer-photos"+c("photos"),content:'<div class="layui-layer-phimg"><img src="'+u[d].src+'" alt="'+(u[d].alt||"")+'" layer-pid="'+u[d].pid+'"><div class="layui-layer-imgsee">'+(u.length>1?'<span class="layui-layer-imguide"><a href="javascript:;" class="layui-layer-iconext layui-layer-imgprev"></a><a href="javascript:;" class="layui-layer-iconext layui-layer-imgnext"></a></span>':"")+'<div class="layui-layer-imgbar" style="display:'+(a?"block":"")+'"><span class="layui-layer-imgtit"><a href="javascript:;">'+(u[d].alt||"")+"</a><em>"+s.imgIndex+"/"+u.length+"</em></span></div></div></div>",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imguide,.layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("&#x5F53;&#x524D;&#x56FE;&#x7247;&#x5730;&#x5740;&#x5F02;&#x5E38;<br>&#x662F;&#x5426;&#x7EE7;&#x7EED;&#x67E5;&#x770B;&#x4E0B;&#x4E00;&#x5F20;&#xFF1F;",{time:3e4,btn:["&#x4E0B;&#x4E00;&#x5F20;","&#x4E0D;&#x770B;&#x4E86;"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.$),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window); \ No newline at end of file diff --git a/uam-server/src/main/webapp/public/assets/layer/mobile/layer.js b/uam-server/src/main/webapp/public/assets/layer/mobile/layer.js new file mode 100644 index 0000000000000000000000000000000000000000..f9cf69313ea610b7e3260824d507701823101bb7 --- /dev/null +++ b/uam-server/src/main/webapp/public/assets/layer/mobile/layer.js @@ -0,0 +1,2 @@ +/*! layer mobile-v2.0.0 Web弹层组件 MIT License http://layer.layui.com/mobile By 贤心 */ + ;!function(e){"use strict";var t=document,n="querySelectorAll",i="getElementsByClassName",a=function(e){return t[n](e)},s={type:0,shade:!0,shadeClose:!0,fixed:!0,anim:"scale"},l={extend:function(e){var t=JSON.parse(JSON.stringify(s));for(var n in e)t[n]=e[n];return t},timer:{},end:{}};l.touch=function(e,t){e.addEventListener("click",function(e){t.call(this,e)},!1)};var r=0,o=["layui-m-layer"],c=function(e){var t=this;t.config=l.extend(e),t.view()};c.prototype.view=function(){var e=this,n=e.config,s=t.createElement("div");e.id=s.id=o[0]+r,s.setAttribute("class",o[0]+" "+o[0]+(n.type||0)),s.setAttribute("index",r);var l=function(){var e="object"==typeof n.title;return n.title?'<h3 style="'+(e?n.title[1]:"")+'">'+(e?n.title[0]:n.title)+"</h3>":""}(),c=function(){"string"==typeof n.btn&&(n.btn=[n.btn]);var e,t=(n.btn||[]).length;return 0!==t&&n.btn?(e='<span yes type="1">'+n.btn[0]+"</span>",2===t&&(e='<span no type="0">'+n.btn[1]+"</span>"+e),'<div class="layui-m-layerbtn">'+e+"</div>"):""}();if(n.fixed||(n.top=n.hasOwnProperty("top")?n.top:100,n.style=n.style||"",n.style+=" top:"+(t.body.scrollTop+n.top)+"px"),2===n.type&&(n.content='<i></i><i class="layui-m-layerload"></i><i></i><p>'+(n.content||"")+"</p>"),n.skin&&(n.anim="up"),"msg"===n.skin&&(n.shade=!1),s.innerHTML=(n.shade?"<div "+("string"==typeof n.shade?'style="'+n.shade+'"':"")+' class="layui-m-layershade"></div>':"")+'<div class="layui-m-layermain" '+(n.fixed?"":'style="position:static;"')+'><div class="layui-m-layersection"><div class="layui-m-layerchild '+(n.skin?"layui-m-layer-"+n.skin+" ":"")+(n.className?n.className:"")+" "+(n.anim?"layui-m-anim-"+n.anim:"")+'" '+(n.style?'style="'+n.style+'"':"")+">"+l+'<div class="layui-m-layercont">'+n.content+"</div>"+c+"</div></div></div>",!n.type||2===n.type){var d=t[i](o[0]+n.type),y=d.length;y>=1&&layer.close(d[0].getAttribute("index"))}document.body.appendChild(s);var u=e.elem=a("#"+e.id)[0];n.success&&n.success(u),e.index=r++,e.action(n,u)},c.prototype.action=function(e,t){var n=this;e.time&&(l.timer[n.index]=setTimeout(function(){layer.close(n.index)},1e3*e.time));var a=function(){var t=this.getAttribute("type");0==t?(e.no&&e.no(),layer.close(n.index)):e.yes?e.yes(n.index):layer.close(n.index)};if(e.btn)for(var s=t[i]("layui-m-layerbtn")[0].children,r=s.length,o=0;o<r;o++)l.touch(s[o],a);if(e.shade&&e.shadeClose){var c=t[i]("layui-m-layershade")[0];l.touch(c,function(){layer.close(n.index,e.end)})}e.end&&(l.end[n.index]=e.end)},e.layer={v:"2.0",index:r,open:function(e){var t=new c(e||{});return t.index},close:function(e){var n=a("#"+o[0]+e)[0];n&&(n.innerHTML="",t.body.removeChild(n),clearTimeout(l.timer[e]),delete l.timer[e],"function"==typeof l.end[e]&&l.end[e](),delete l.end[e])},closeAll:function(){for(var e=t[i](o[0]),n=0,a=e.length;n<a;n++)layer.close(0|e[0].getAttribute("index"))}},"function"==typeof define?define(function(){return layer}):function(){var e=document.scripts,n=e[e.length-1],i=n.src,a=i.substring(0,i.lastIndexOf("/")+1);n.getAttribute("merge")||document.head.appendChild(function(){var e=t.createElement("link");return e.href=a+"need/layer.css?2.0",e.type="text/css",e.rel="styleSheet",e.id="layermcss",e}())}()}(window); \ No newline at end of file diff --git a/uam-server/src/main/webapp/public/assets/layer/mobile/need/layer.css b/uam-server/src/main/webapp/public/assets/layer/mobile/need/layer.css new file mode 100644 index 0000000000000000000000000000000000000000..b9dbf2010203d0d5ba7d4e030fbe7c34f149d3ab --- /dev/null +++ b/uam-server/src/main/webapp/public/assets/layer/mobile/need/layer.css @@ -0,0 +1 @@ +.layui-m-layer{position:relative;z-index:19891014}.layui-m-layer *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.layui-m-layermain,.layui-m-layershade{position:fixed;left:0;top:0;width:100%;height:100%}.layui-m-layershade{background-color:rgba(0,0,0,.7);pointer-events:auto}.layui-m-layermain{display:table;font-family:Helvetica,arial,sans-serif;pointer-events:none}.layui-m-layermain .layui-m-layersection{display:table-cell;vertical-align:middle;text-align:center}.layui-m-layerchild{position:relative;display:inline-block;text-align:left;background-color:#fff;font-size:14px;border-radius:5px;box-shadow:0 0 8px rgba(0,0,0,.1);pointer-events:auto;-webkit-overflow-scrolling:touch;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@-webkit-keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.layui-m-anim-scale{animation-name:layui-m-anim-scale;-webkit-animation-name:layui-m-anim-scale}@-webkit-keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.layui-m-anim-up{-webkit-animation-name:layui-m-anim-up;animation-name:layui-m-anim-up}.layui-m-layer0 .layui-m-layerchild{width:90%;max-width:640px}.layui-m-layer1 .layui-m-layerchild{border:none;border-radius:0}.layui-m-layer2 .layui-m-layerchild{width:auto;max-width:260px;min-width:40px;border:none;background:0 0;box-shadow:none;color:#fff}.layui-m-layerchild h3{padding:0 10px;height:60px;line-height:60px;font-size:16px;font-weight:400;border-radius:5px 5px 0 0;text-align:center}.layui-m-layerbtn span,.layui-m-layerchild h3{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-m-layercont{padding:50px 30px;line-height:22px;text-align:center}.layui-m-layer1 .layui-m-layercont{padding:0;text-align:left}.layui-m-layer2 .layui-m-layercont{text-align:center;padding:0;line-height:0}.layui-m-layer2 .layui-m-layercont i{width:25px;height:25px;margin-left:8px;display:inline-block;background-color:#fff;border-radius:100%;-webkit-animation:layui-m-anim-loading 1.4s infinite ease-in-out;animation:layui-m-anim-loading 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-m-layerbtn,.layui-m-layerbtn span{position:relative;text-align:center;border-radius:0 0 5px 5px}.layui-m-layer2 .layui-m-layercont p{margin-top:20px}@-webkit-keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}@keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0;-webkit-animation-delay:-.32s;animation-delay:-.32s}.layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay:-.16s;animation-delay:-.16s}.layui-m-layer2 .layui-m-layercont>div{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px} \ No newline at end of file diff --git a/uam-server/src/main/webapp/public/assets/layer/theme/default/icon-ext.png b/uam-server/src/main/webapp/public/assets/layer/theme/default/icon-ext.png new file mode 100644 index 0000000000000000000000000000000000000000..bbbb669bb311514baa5db3a6a00b4644d0e280f1 Binary files /dev/null and b/uam-server/src/main/webapp/public/assets/layer/theme/default/icon-ext.png differ diff --git a/uam-server/src/main/webapp/public/assets/layer/theme/default/icon.png b/uam-server/src/main/webapp/public/assets/layer/theme/default/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3e17da8b1aaae2935e19ac97d9015f0fe24e8770 Binary files /dev/null and b/uam-server/src/main/webapp/public/assets/layer/theme/default/icon.png differ diff --git a/uam-server/src/main/webapp/public/assets/layer/theme/default/layer.css b/uam-server/src/main/webapp/public/assets/layer/theme/default/layer.css new file mode 100644 index 0000000000000000000000000000000000000000..820b4a99b1225426bbb031ebcaea74f52777e5a4 --- /dev/null +++ b/uam-server/src/main/webapp/public/assets/layer/theme/default/layer.css @@ -0,0 +1 @@ +.layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;background-color:#F8F8F8;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1E9FFF;background-color:#1E9FFF;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#E9E7E7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:230px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;overflow:hidden;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:43px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{-webkit-animation-duration:.8s;animation-duration:.8s}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}} \ No newline at end of file diff --git a/uam-server/src/main/webapp/public/assets/layer/theme/default/loading-0.gif b/uam-server/src/main/webapp/public/assets/layer/theme/default/loading-0.gif new file mode 100644 index 0000000000000000000000000000000000000000..6f3c9539a22171cc2f12639492e346d97a9078e8 Binary files /dev/null and b/uam-server/src/main/webapp/public/assets/layer/theme/default/loading-0.gif differ diff --git a/uam-server/src/main/webapp/public/assets/layer/theme/default/loading-1.gif b/uam-server/src/main/webapp/public/assets/layer/theme/default/loading-1.gif new file mode 100644 index 0000000000000000000000000000000000000000..db3a483e4b74971fbfb1cc0fb6499852cedfe650 Binary files /dev/null and b/uam-server/src/main/webapp/public/assets/layer/theme/default/loading-1.gif differ diff --git a/uam-server/src/main/webapp/public/assets/layer/theme/default/loading-2.gif b/uam-server/src/main/webapp/public/assets/layer/theme/default/loading-2.gif new file mode 100644 index 0000000000000000000000000000000000000000..5bb90fd6a49107a321c35b9cee4a7b810314b51f Binary files /dev/null and b/uam-server/src/main/webapp/public/assets/layer/theme/default/loading-2.gif differ diff --git a/uam-server/src/main/webapp/public/assets/sweetalert.min.js b/uam-server/src/main/webapp/public/assets/sweetalert.min.js new file mode 100644 index 0000000000000000000000000000000000000000..685431d9193905a99c7195cdbd73d190649fbf57 --- /dev/null +++ b/uam-server/src/main/webapp/public/assets/sweetalert.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.swal=e():t.swal=e()}(this,function(){return function(t){function e(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return t[o].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,o){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:o})},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=8)}([function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o="swal-button";e.CLASS_NAMES={MODAL:"swal-modal",OVERLAY:"swal-overlay",SHOW_MODAL:"swal-overlay--show-modal",MODAL_TITLE:"swal-title",MODAL_TEXT:"swal-text",ICON:"swal-icon",ICON_CUSTOM:"swal-icon--custom",CONTENT:"swal-content",FOOTER:"swal-footer",BUTTON_CONTAINER:"swal-button-container",BUTTON:o,CONFIRM_BUTTON:o+"--confirm",CANCEL_BUTTON:o+"--cancel",DANGER_BUTTON:o+"--danger",BUTTON_LOADING:o+"--loading",BUTTON_LOADER:o+"__loader"},e.default=e.CLASS_NAMES},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.getNode=function(t){var e="."+t;return document.querySelector(e)},e.stringToNode=function(t){var e=document.createElement("div");return e.innerHTML=t.trim(),e.firstChild},e.insertAfter=function(t,e){var n=e.nextSibling;e.parentNode.insertBefore(t,n)},e.removeNode=function(t){t.parentElement.removeChild(t)},e.throwErr=function(t){throw t=t.replace(/ +(?= )/g,""),"SweetAlert: "+(t=t.trim())},e.isPlainObject=function(t){if("[object Object]"!==Object.prototype.toString.call(t))return!1;var e=Object.getPrototypeOf(t);return null===e||e===Object.prototype},e.ordinalSuffixOf=function(t){var e=t%10,n=t%100;return 1===e&&11!==n?t+"st":2===e&&12!==n?t+"nd":3===e&&13!==n?t+"rd":t+"th"}},function(t,e,n){"use strict";function o(t){for(var n in t)e.hasOwnProperty(n)||(e[n]=t[n])}Object.defineProperty(e,"__esModule",{value:!0}),o(n(25));var r=n(26);e.overlayMarkup=r.default,o(n(27)),o(n(28)),o(n(29));var i=n(0),a=i.default.MODAL_TITLE,s=i.default.MODAL_TEXT,c=i.default.ICON,l=i.default.FOOTER;e.iconMarkup='\n <div class="'+c+'"></div>',e.titleMarkup='\n <div class="'+a+'"></div>\n',e.textMarkup='\n <div class="'+s+'"></div>',e.footerMarkup='\n <div class="'+l+'"></div>\n'},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(1);e.CONFIRM_KEY="confirm",e.CANCEL_KEY="cancel";var r={visible:!0,text:null,value:null,className:"",closeModal:!0},i=Object.assign({},r,{visible:!1,text:"Cancel",value:null}),a=Object.assign({},r,{text:"OK",value:!0});e.defaultButtonList={cancel:i,confirm:a};var s=function(t){switch(t){case e.CONFIRM_KEY:return a;case e.CANCEL_KEY:return i;default:var n=t.charAt(0).toUpperCase()+t.slice(1);return Object.assign({},r,{text:n,value:t})}},c=function(t,e){var n=s(t);return!0===e?Object.assign({},n,{visible:!0}):"string"==typeof e?Object.assign({},n,{visible:!0,text:e}):o.isPlainObject(e)?Object.assign({visible:!0},n,e):Object.assign({},n,{visible:!1})},l=function(t){for(var e={},n=0,o=Object.keys(t);n<o.length;n++){var r=o[n],a=t[r],s=c(r,a);e[r]=s}return e.cancel||(e.cancel=i),e},u=function(t){var n={};switch(t.length){case 1:n[e.CANCEL_KEY]=Object.assign({},i,{visible:!1});break;case 2:n[e.CANCEL_KEY]=c(e.CANCEL_KEY,t[0]),n[e.CONFIRM_KEY]=c(e.CONFIRM_KEY,t[1]);break;default:o.throwErr("Invalid number of 'buttons' in array ("+t.length+").\n If you want more than 2 buttons, you need to use an object!")}return n};e.getButtonListOpts=function(t){var n=e.defaultButtonList;return"string"==typeof t?n[e.CONFIRM_KEY]=c(e.CONFIRM_KEY,t):Array.isArray(t)?n=u(t):o.isPlainObject(t)?n=l(t):!0===t?n=u([!0,!0]):!1===t?n=u([!1,!1]):void 0===t&&(n=e.defaultButtonList),n}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(1),r=n(2),i=n(0),a=i.default.MODAL,s=i.default.OVERLAY,c=n(30),l=n(31),u=n(32),f=n(33);e.injectElIntoModal=function(t){var e=o.getNode(a),n=o.stringToNode(t);return e.appendChild(n),n};var d=function(t){t.className=a,t.textContent=""},p=function(t,e){d(t);var n=e.className;n&&t.classList.add(n)};e.initModalContent=function(t){var e=o.getNode(a);p(e,t),c.default(t.icon),l.initTitle(t.title),l.initText(t.text),f.default(t.content),u.default(t.buttons,t.dangerMode)};var m=function(){var t=o.getNode(s),e=o.stringToNode(r.modalMarkup);t.appendChild(e)};e.default=m},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(3),r={isOpen:!1,promise:null,actions:{},timer:null},i=Object.assign({},r);e.resetState=function(){i=Object.assign({},r)},e.setActionValue=function(t){if("string"==typeof t)return a(o.CONFIRM_KEY,t);for(var e in t)a(e,t[e])};var a=function(t,e){i.actions[t]||(i.actions[t]={}),Object.assign(i.actions[t],{value:e})};e.setActionOptionsFor=function(t,e){var n=(void 0===e?{}:e).closeModal,o=void 0===n||n;Object.assign(i.actions[t],{closeModal:o})},e.default=i},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(1),r=n(3),i=n(0),a=i.default.OVERLAY,s=i.default.SHOW_MODAL,c=i.default.BUTTON,l=i.default.BUTTON_LOADING,u=n(5);e.openModal=function(){o.getNode(a).classList.add(s),u.default.isOpen=!0};var f=function(){o.getNode(a).classList.remove(s),u.default.isOpen=!1};e.onAction=function(t){void 0===t&&(t=r.CANCEL_KEY);var e=u.default.actions[t],n=e.value;if(!1===e.closeModal){var i=c+"--"+t;o.getNode(i).classList.add(l)}else f();u.default.promise.resolve(n)},e.getState=function(){var t=Object.assign({},u.default);return delete t.promise,delete t.timer,t},e.stopLoading=function(){for(var t=document.querySelectorAll("."+c),e=0;e<t.length;e++){t[e].classList.remove(l)}}},function(t,e){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(n=window)}t.exports=n},function(t,e,n){(function(e){t.exports=e.sweetAlert=n(9)}).call(e,n(7))},function(t,e,n){(function(e){t.exports=e.swal=n(10)}).call(e,n(7))},function(t,e,n){"undefined"!=typeof window&&n(11),n(16);var o=n(23).default;t.exports=o},function(t,e,n){var o=n(12);"string"==typeof o&&(o=[[t.i,o,""]]);var r={insertAt:"top"};r.transform=void 0;n(14)(o,r);o.locals&&(t.exports=o.locals)},function(t,e,n){e=t.exports=n(13)(void 0),e.push([t.i,'.swal-icon--error{border-color:#f27474;-webkit-animation:animateErrorIcon .5s;animation:animateErrorIcon .5s}.swal-icon--error__x-mark{position:relative;display:block;-webkit-animation:animateXMark .5s;animation:animateXMark .5s}.swal-icon--error__line{position:absolute;height:5px;width:47px;background-color:#f27474;display:block;top:37px;border-radius:2px}.swal-icon--error__line--left{-webkit-transform:rotate(45deg);transform:rotate(45deg);left:17px}.swal-icon--error__line--right{-webkit-transform:rotate(-45deg);transform:rotate(-45deg);right:16px}@-webkit-keyframes animateErrorIcon{0%{-webkit-transform:rotateX(100deg);transform:rotateX(100deg);opacity:0}to{-webkit-transform:rotateX(0deg);transform:rotateX(0deg);opacity:1}}@keyframes animateErrorIcon{0%{-webkit-transform:rotateX(100deg);transform:rotateX(100deg);opacity:0}to{-webkit-transform:rotateX(0deg);transform:rotateX(0deg);opacity:1}}@-webkit-keyframes animateXMark{0%{-webkit-transform:scale(.4);transform:scale(.4);margin-top:26px;opacity:0}50%{-webkit-transform:scale(.4);transform:scale(.4);margin-top:26px;opacity:0}80%{-webkit-transform:scale(1.15);transform:scale(1.15);margin-top:-6px}to{-webkit-transform:scale(1);transform:scale(1);margin-top:0;opacity:1}}@keyframes animateXMark{0%{-webkit-transform:scale(.4);transform:scale(.4);margin-top:26px;opacity:0}50%{-webkit-transform:scale(.4);transform:scale(.4);margin-top:26px;opacity:0}80%{-webkit-transform:scale(1.15);transform:scale(1.15);margin-top:-6px}to{-webkit-transform:scale(1);transform:scale(1);margin-top:0;opacity:1}}.swal-icon--warning{border-color:#f8bb86;-webkit-animation:pulseWarning .75s infinite alternate;animation:pulseWarning .75s infinite alternate}.swal-icon--warning__body{width:5px;height:47px;top:10px;border-radius:2px;margin-left:-2px}.swal-icon--warning__body,.swal-icon--warning__dot{position:absolute;left:50%;background-color:#f8bb86}.swal-icon--warning__dot{width:7px;height:7px;border-radius:50%;margin-left:-4px;bottom:-11px}@-webkit-keyframes pulseWarning{0%{border-color:#f8d486}to{border-color:#f8bb86}}@keyframes pulseWarning{0%{border-color:#f8d486}to{border-color:#f8bb86}}.swal-icon--success{border-color:#a5dc86}.swal-icon--success:after,.swal-icon--success:before{content:"";border-radius:50%;position:absolute;width:60px;height:120px;background:#fff;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.swal-icon--success:before{border-radius:120px 0 0 120px;top:-7px;left:-33px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:60px 60px;transform-origin:60px 60px}.swal-icon--success:after{border-radius:0 120px 120px 0;top:-11px;left:30px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:0 60px;transform-origin:0 60px;-webkit-animation:rotatePlaceholder 4.25s ease-in;animation:rotatePlaceholder 4.25s ease-in}.swal-icon--success__ring{width:80px;height:80px;border:4px solid hsla(98,55%,69%,.2);border-radius:50%;box-sizing:content-box;position:absolute;left:-4px;top:-4px;z-index:2}.swal-icon--success__hide-corners{width:5px;height:90px;background-color:#fff;position:absolute;left:28px;top:8px;z-index:1;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.swal-icon--success__line{height:5px;background-color:#a5dc86;display:block;border-radius:2px;position:absolute;z-index:2}.swal-icon--success__line--tip{width:25px;left:14px;top:46px;-webkit-transform:rotate(45deg);transform:rotate(45deg);-webkit-animation:animateSuccessTip .75s;animation:animateSuccessTip .75s}.swal-icon--success__line--long{width:47px;right:8px;top:38px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-animation:animateSuccessLong .75s;animation:animateSuccessLong .75s}@-webkit-keyframes rotatePlaceholder{0%{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}5%{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}12%{-webkit-transform:rotate(-405deg);transform:rotate(-405deg)}to{-webkit-transform:rotate(-405deg);transform:rotate(-405deg)}}@keyframes rotatePlaceholder{0%{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}5%{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}12%{-webkit-transform:rotate(-405deg);transform:rotate(-405deg)}to{-webkit-transform:rotate(-405deg);transform:rotate(-405deg)}}@-webkit-keyframes animateSuccessTip{0%{width:0;left:1px;top:19px}54%{width:0;left:1px;top:19px}70%{width:50px;left:-8px;top:37px}84%{width:17px;left:21px;top:48px}to{width:25px;left:14px;top:45px}}@keyframes animateSuccessTip{0%{width:0;left:1px;top:19px}54%{width:0;left:1px;top:19px}70%{width:50px;left:-8px;top:37px}84%{width:17px;left:21px;top:48px}to{width:25px;left:14px;top:45px}}@-webkit-keyframes animateSuccessLong{0%{width:0;right:46px;top:54px}65%{width:0;right:46px;top:54px}84%{width:55px;right:0;top:35px}to{width:47px;right:8px;top:38px}}@keyframes animateSuccessLong{0%{width:0;right:46px;top:54px}65%{width:0;right:46px;top:54px}84%{width:55px;right:0;top:35px}to{width:47px;right:8px;top:38px}}.swal-icon--info{border-color:#c9dae1}.swal-icon--info:before{width:5px;height:29px;bottom:17px;border-radius:2px;margin-left:-2px}.swal-icon--info:after,.swal-icon--info:before{content:"";position:absolute;left:50%;background-color:#c9dae1}.swal-icon--info:after{width:7px;height:7px;border-radius:50%;margin-left:-3px;top:19px}.swal-icon{width:80px;height:80px;border-width:4px;border-style:solid;border-radius:50%;padding:0;position:relative;box-sizing:content-box;margin:20px auto}.swal-icon:first-child{margin-top:32px}.swal-icon--custom{width:auto;height:auto;max-width:100%;border:none;border-radius:0}.swal-icon img{max-width:100%;max-height:100%}.swal-title{color:rgba(0,0,0,.65);font-weight:600;text-transform:none;position:relative;display:block;padding:13px 16px;font-size:27px;line-height:normal;text-align:center;margin-bottom:0}.swal-title:first-child{margin-top:26px}.swal-title:not(:first-child){padding-bottom:0}.swal-title:not(:last-child){margin-bottom:13px}.swal-text{font-size:16px;position:relative;float:none;line-height:normal;vertical-align:top;text-align:left;display:inline-block;margin:0;padding:0 10px;font-weight:400;color:rgba(0,0,0,.64);max-width:calc(100% - 20px);overflow-wrap:break-word;box-sizing:border-box}.swal-text:first-child{margin-top:45px}.swal-text:last-child{margin-bottom:45px}.swal-footer{text-align:right;padding-top:13px;margin-top:13px;padding:13px 16px;border-radius:inherit;border-top-left-radius:0;border-top-right-radius:0}.swal-button-container{margin:5px;display:inline-block;position:relative}.swal-button{background-color:#7cd1f9;color:#fff;border:none;box-shadow:none;border-radius:5px;font-weight:600;font-size:14px;padding:10px 24px;margin:0;cursor:pointer}.swal-button[not:disabled]:hover{background-color:#78cbf2}.swal-button:active{background-color:#70bce0}.swal-button:focus{outline:none;box-shadow:0 0 0 1px #fff,0 0 0 3px rgba(43,114,165,.29)}.swal-button[disabled]{opacity:.5;cursor:default}.swal-button::-moz-focus-inner{border:0}.swal-button--cancel{color:#555;background-color:#efefef}.swal-button--cancel[not:disabled]:hover{background-color:#e8e8e8}.swal-button--cancel:active{background-color:#d7d7d7}.swal-button--cancel:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px rgba(116,136,150,.29)}.swal-button--danger{background-color:#e64942}.swal-button--danger[not:disabled]:hover{background-color:#df4740}.swal-button--danger:active{background-color:#cf423b}.swal-button--danger:focus{box-shadow:0 0 0 1px #fff,0 0 0 3px rgba(165,43,43,.29)}.swal-content{padding:0 20px;margin-top:20px;font-size:medium}.swal-content:last-child{margin-bottom:20px}.swal-content__input,.swal-content__textarea{-webkit-appearance:none;background-color:#fff;border:none;font-size:14px;display:block;box-sizing:border-box;width:100%;border:1px solid rgba(0,0,0,.14);padding:10px 13px;border-radius:2px;transition:border-color .2s}.swal-content__input:focus,.swal-content__textarea:focus{outline:none;border-color:#6db8ff}.swal-content__textarea{resize:vertical}.swal-button--loading{color:transparent}.swal-button--loading~.swal-button__loader{opacity:1}.swal-button__loader{position:absolute;height:auto;width:43px;z-index:2;left:50%;top:50%;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);text-align:center;pointer-events:none;opacity:0}.swal-button__loader div{display:inline-block;float:none;vertical-align:baseline;width:9px;height:9px;padding:0;border:none;margin:2px;opacity:.4;border-radius:7px;background-color:hsla(0,0%,100%,.9);transition:background .2s;-webkit-animation:swal-loading-anim 1s infinite;animation:swal-loading-anim 1s infinite}.swal-button__loader div:nth-child(3n+2){-webkit-animation-delay:.15s;animation-delay:.15s}.swal-button__loader div:nth-child(3n+3){-webkit-animation-delay:.3s;animation-delay:.3s}@-webkit-keyframes swal-loading-anim{0%{opacity:.4}20%{opacity:.4}50%{opacity:1}to{opacity:.4}}@keyframes swal-loading-anim{0%{opacity:.4}20%{opacity:.4}50%{opacity:1}to{opacity:.4}}.swal-overlay{position:fixed;top:0;bottom:0;left:0;right:0;text-align:center;font-size:0;overflow-y:scroll;background-color:rgba(0,0,0,.4);z-index:10000;pointer-events:none;opacity:0;transition:opacity .3s}.swal-overlay:before{content:" ";display:inline-block;vertical-align:middle;height:100%}.swal-overlay--show-modal{opacity:1;pointer-events:auto}.swal-overlay--show-modal .swal-modal{opacity:1;pointer-events:auto;box-sizing:border-box;-webkit-animation:showSweetAlert .3s;animation:showSweetAlert .3s;will-change:transform}.swal-modal{width:478px;opacity:0;pointer-events:none;background-color:#fff;text-align:center;border-radius:5px;position:static;margin:20px auto;display:inline-block;vertical-align:middle;-webkit-transform:scale(1);transform:scale(1);-webkit-transform-origin:50% 50%;transform-origin:50% 50%;z-index:10001;transition:opacity .2s,-webkit-transform .3s;transition:transform .3s,opacity .2s;transition:transform .3s,opacity .2s,-webkit-transform .3s}@media (max-width:500px){.swal-modal{width:calc(100% - 20px)}}@-webkit-keyframes showSweetAlert{0%{-webkit-transform:scale(1);transform:scale(1)}1%{-webkit-transform:scale(.5);transform:scale(.5)}45%{-webkit-transform:scale(1.05);transform:scale(1.05)}80%{-webkit-transform:scale(.95);transform:scale(.95)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes showSweetAlert{0%{-webkit-transform:scale(1);transform:scale(1)}1%{-webkit-transform:scale(.5);transform:scale(.5)}45%{-webkit-transform:scale(1.05);transform:scale(1.05)}80%{-webkit-transform:scale(.95);transform:scale(.95)}to{-webkit-transform:scale(1);transform:scale(1)}}',""])},function(t,e){function n(t,e){var n=t[1]||"",r=t[3];if(!r)return n;if(e&&"function"==typeof btoa){var i=o(r);return[n].concat(r.sources.map(function(t){return"/*# sourceURL="+r.sourceRoot+t+" */"})).concat([i]).join("\n")}return[n].join("\n")}function o(t){return"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(t))))+" */"}t.exports=function(t){var e=[];return e.toString=function(){return this.map(function(e){var o=n(e,t);return e[2]?"@media "+e[2]+"{"+o+"}":o}).join("")},e.i=function(t,n){"string"==typeof t&&(t=[[null,t,""]]);for(var o={},r=0;r<this.length;r++){var i=this[r][0];"number"==typeof i&&(o[i]=!0)}for(r=0;r<t.length;r++){var a=t[r];"number"==typeof a[0]&&o[a[0]]||(n&&!a[2]?a[2]=n:n&&(a[2]="("+a[2]+") and ("+n+")"),e.push(a))}},e}},function(t,e,n){function o(t,e){for(var n=0;n<t.length;n++){var o=t[n],r=m[o.id];if(r){r.refs++;for(var i=0;i<r.parts.length;i++)r.parts[i](o.parts[i]);for(;i<o.parts.length;i++)r.parts.push(u(o.parts[i],e))}else{for(var a=[],i=0;i<o.parts.length;i++)a.push(u(o.parts[i],e));m[o.id]={id:o.id,refs:1,parts:a}}}}function r(t,e){for(var n=[],o={},r=0;r<t.length;r++){var i=t[r],a=e.base?i[0]+e.base:i[0],s=i[1],c=i[2],l=i[3],u={css:s,media:c,sourceMap:l};o[a]?o[a].parts.push(u):n.push(o[a]={id:a,parts:[u]})}return n}function i(t,e){var n=v(t.insertInto);if(!n)throw new Error("Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.");var o=w[w.length-1];if("top"===t.insertAt)o?o.nextSibling?n.insertBefore(e,o.nextSibling):n.appendChild(e):n.insertBefore(e,n.firstChild),w.push(e);else{if("bottom"!==t.insertAt)throw new Error("Invalid value for parameter 'insertAt'. Must be 'top' or 'bottom'.");n.appendChild(e)}}function a(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t);var e=w.indexOf(t);e>=0&&w.splice(e,1)}function s(t){var e=document.createElement("style");return t.attrs.type="text/css",l(e,t.attrs),i(t,e),e}function c(t){var e=document.createElement("link");return t.attrs.type="text/css",t.attrs.rel="stylesheet",l(e,t.attrs),i(t,e),e}function l(t,e){Object.keys(e).forEach(function(n){t.setAttribute(n,e[n])})}function u(t,e){var n,o,r,i;if(e.transform&&t.css){if(!(i=e.transform(t.css)))return function(){};t.css=i}if(e.singleton){var l=h++;n=g||(g=s(e)),o=f.bind(null,n,l,!1),r=f.bind(null,n,l,!0)}else t.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(n=c(e),o=p.bind(null,n,e),r=function(){a(n),n.href&&URL.revokeObjectURL(n.href)}):(n=s(e),o=d.bind(null,n),r=function(){a(n)});return o(t),function(e){if(e){if(e.css===t.css&&e.media===t.media&&e.sourceMap===t.sourceMap)return;o(t=e)}else r()}}function f(t,e,n,o){var r=n?"":o.css;if(t.styleSheet)t.styleSheet.cssText=x(e,r);else{var i=document.createTextNode(r),a=t.childNodes;a[e]&&t.removeChild(a[e]),a.length?t.insertBefore(i,a[e]):t.appendChild(i)}}function d(t,e){var n=e.css,o=e.media;if(o&&t.setAttribute("media",o),t.styleSheet)t.styleSheet.cssText=n;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(n))}}function p(t,e,n){var o=n.css,r=n.sourceMap,i=void 0===e.convertToAbsoluteUrls&&r;(e.convertToAbsoluteUrls||i)&&(o=y(o)),r&&(o+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(r))))+" */");var a=new Blob([o],{type:"text/css"}),s=t.href;t.href=URL.createObjectURL(a),s&&URL.revokeObjectURL(s)}var m={},b=function(t){var e;return function(){return void 0===e&&(e=t.apply(this,arguments)),e}}(function(){return window&&document&&document.all&&!window.atob}),v=function(t){var e={};return function(n){return void 0===e[n]&&(e[n]=t.call(this,n)),e[n]}}(function(t){return document.querySelector(t)}),g=null,h=0,w=[],y=n(15);t.exports=function(t,e){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");e=e||{},e.attrs="object"==typeof e.attrs?e.attrs:{},e.singleton||(e.singleton=b()),e.insertInto||(e.insertInto="head"),e.insertAt||(e.insertAt="bottom");var n=r(t,e);return o(n,e),function(t){for(var i=[],a=0;a<n.length;a++){var s=n[a],c=m[s.id];c.refs--,i.push(c)}if(t){o(r(t,e),e)}for(var a=0;a<i.length;a++){var c=i[a];if(0===c.refs){for(var l=0;l<c.parts.length;l++)c.parts[l]();delete m[c.id]}}}};var x=function(){var t=[];return function(e,n){return t[e]=n,t.filter(Boolean).join("\n")}}()},function(t,e){t.exports=function(t){var e="undefined"!=typeof window&&window.location;if(!e)throw new Error("fixUrls requires window.location");if(!t||"string"!=typeof t)return t;var n=e.protocol+"//"+e.host,o=n+e.pathname.replace(/\/[^\/]*$/,"/");return t.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi,function(t,e){var r=e.trim().replace(/^"(.*)"$/,function(t,e){return e}).replace(/^'(.*)'$/,function(t,e){return e});if(/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/)/i.test(r))return t;var i;return i=0===r.indexOf("//")?r:0===r.indexOf("/")?n+r:o+r.replace(/^\.\//,""),"url("+JSON.stringify(i)+")"})}},function(t,e,n){var o=n(17);"undefined"==typeof window||window.Promise||(window.Promise=o),n(21),String.prototype.includes||(String.prototype.includes=function(t,e){"use strict";return"number"!=typeof e&&(e=0),!(e+t.length>this.length)&&-1!==this.indexOf(t,e)}),Array.prototype.includes||Object.defineProperty(Array.prototype,"includes",{value:function(t,e){if(null==this)throw new TypeError('"this" is null or not defined');var n=Object(this),o=n.length>>>0;if(0===o)return!1;for(var r=0|e,i=Math.max(r>=0?r:o-Math.abs(r),0);i<o;){if(function(t,e){return t===e||"number"==typeof t&&"number"==typeof e&&isNaN(t)&&isNaN(e)}(n[i],t))return!0;i++}return!1}}),"undefined"!=typeof window&&function(t){t.forEach(function(t){t.hasOwnProperty("remove")||Object.defineProperty(t,"remove",{configurable:!0,enumerable:!0,writable:!0,value:function(){this.parentNode.removeChild(this)}})})}([Element.prototype,CharacterData.prototype,DocumentType.prototype])},function(t,e,n){(function(e){!function(n){function o(){}function r(t,e){return function(){t.apply(e,arguments)}}function i(t){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof t)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],f(t,this)}function a(t,e){for(;3===t._state;)t=t._value;if(0===t._state)return void t._deferreds.push(e);t._handled=!0,i._immediateFn(function(){var n=1===t._state?e.onFulfilled:e.onRejected;if(null===n)return void(1===t._state?s:c)(e.promise,t._value);var o;try{o=n(t._value)}catch(t){return void c(e.promise,t)}s(e.promise,o)})}function s(t,e){try{if(e===t)throw new TypeError("A promise cannot be resolved with itself.");if(e&&("object"==typeof e||"function"==typeof e)){var n=e.then;if(e instanceof i)return t._state=3,t._value=e,void l(t);if("function"==typeof n)return void f(r(n,e),t)}t._state=1,t._value=e,l(t)}catch(e){c(t,e)}}function c(t,e){t._state=2,t._value=e,l(t)}function l(t){2===t._state&&0===t._deferreds.length&&i._immediateFn(function(){t._handled||i._unhandledRejectionFn(t._value)});for(var e=0,n=t._deferreds.length;e<n;e++)a(t,t._deferreds[e]);t._deferreds=null}function u(t,e,n){this.onFulfilled="function"==typeof t?t:null,this.onRejected="function"==typeof e?e:null,this.promise=n}function f(t,e){var n=!1;try{t(function(t){n||(n=!0,s(e,t))},function(t){n||(n=!0,c(e,t))})}catch(t){if(n)return;n=!0,c(e,t)}}var d=setTimeout;i.prototype.catch=function(t){return this.then(null,t)},i.prototype.then=function(t,e){var n=new this.constructor(o);return a(this,new u(t,e,n)),n},i.all=function(t){var e=Array.prototype.slice.call(t);return new i(function(t,n){function o(i,a){try{if(a&&("object"==typeof a||"function"==typeof a)){var s=a.then;if("function"==typeof s)return void s.call(a,function(t){o(i,t)},n)}e[i]=a,0==--r&&t(e)}catch(t){n(t)}}if(0===e.length)return t([]);for(var r=e.length,i=0;i<e.length;i++)o(i,e[i])})},i.resolve=function(t){return t&&"object"==typeof t&&t.constructor===i?t:new i(function(e){e(t)})},i.reject=function(t){return new i(function(e,n){n(t)})},i.race=function(t){return new i(function(e,n){for(var o=0,r=t.length;o<r;o++)t[o].then(e,n)})},i._immediateFn="function"==typeof e&&function(t){e(t)}||function(t){d(t,0)},i._unhandledRejectionFn=function(t){"undefined"!=typeof console&&console&&console.warn("Possible Unhandled Promise Rejection:",t)},i._setImmediateFn=function(t){i._immediateFn=t},i._setUnhandledRejectionFn=function(t){i._unhandledRejectionFn=t},void 0!==t&&t.exports?t.exports=i:n.Promise||(n.Promise=i)}(this)}).call(e,n(18).setImmediate)},function(t,e,n){function o(t,e){this._id=t,this._clearFn=e}var r=Function.prototype.apply;e.setTimeout=function(){return new o(r.call(setTimeout,window,arguments),clearTimeout)},e.setInterval=function(){return new o(r.call(setInterval,window,arguments),clearInterval)},e.clearTimeout=e.clearInterval=function(t){t&&t.close()},o.prototype.unref=o.prototype.ref=function(){},o.prototype.close=function(){this._clearFn.call(window,this._id)},e.enroll=function(t,e){clearTimeout(t._idleTimeoutId),t._idleTimeout=e},e.unenroll=function(t){clearTimeout(t._idleTimeoutId),t._idleTimeout=-1},e._unrefActive=e.active=function(t){clearTimeout(t._idleTimeoutId);var e=t._idleTimeout;e>=0&&(t._idleTimeoutId=setTimeout(function(){t._onTimeout&&t._onTimeout()},e))},n(19),e.setImmediate=setImmediate,e.clearImmediate=clearImmediate},function(t,e,n){(function(t,e){!function(t,n){"use strict";function o(t){"function"!=typeof t&&(t=new Function(""+t));for(var e=new Array(arguments.length-1),n=0;n<e.length;n++)e[n]=arguments[n+1];var o={callback:t,args:e};return l[c]=o,s(c),c++}function r(t){delete l[t]}function i(t){var e=t.callback,o=t.args;switch(o.length){case 0:e();break;case 1:e(o[0]);break;case 2:e(o[0],o[1]);break;case 3:e(o[0],o[1],o[2]);break;default:e.apply(n,o)}}function a(t){if(u)setTimeout(a,0,t);else{var e=l[t];if(e){u=!0;try{i(e)}finally{r(t),u=!1}}}}if(!t.setImmediate){var s,c=1,l={},u=!1,f=t.document,d=Object.getPrototypeOf&&Object.getPrototypeOf(t);d=d&&d.setTimeout?d:t,"[object process]"==={}.toString.call(t.process)?function(){s=function(t){e.nextTick(function(){a(t)})}}():function(){if(t.postMessage&&!t.importScripts){var e=!0,n=t.onmessage;return t.onmessage=function(){e=!1},t.postMessage("","*"),t.onmessage=n,e}}()?function(){var e="setImmediate$"+Math.random()+"$",n=function(n){n.source===t&&"string"==typeof n.data&&0===n.data.indexOf(e)&&a(+n.data.slice(e.length))};t.addEventListener?t.addEventListener("message",n,!1):t.attachEvent("onmessage",n),s=function(n){t.postMessage(e+n,"*")}}():t.MessageChannel?function(){var t=new MessageChannel;t.port1.onmessage=function(t){a(t.data)},s=function(e){t.port2.postMessage(e)}}():f&&"onreadystatechange"in f.createElement("script")?function(){var t=f.documentElement;s=function(e){var n=f.createElement("script");n.onreadystatechange=function(){a(e),n.onreadystatechange=null,t.removeChild(n),n=null},t.appendChild(n)}}():function(){s=function(t){setTimeout(a,0,t)}}(),d.setImmediate=o,d.clearImmediate=r}}("undefined"==typeof self?void 0===t?this:t:self)}).call(e,n(7),n(20))},function(t,e){function n(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function r(t){if(u===setTimeout)return setTimeout(t,0);if((u===n||!u)&&setTimeout)return u=setTimeout,setTimeout(t,0);try{return u(t,0)}catch(e){try{return u.call(null,t,0)}catch(e){return u.call(this,t,0)}}}function i(t){if(f===clearTimeout)return clearTimeout(t);if((f===o||!f)&&clearTimeout)return f=clearTimeout,clearTimeout(t);try{return f(t)}catch(e){try{return f.call(null,t)}catch(e){return f.call(this,t)}}}function a(){b&&p&&(b=!1,p.length?m=p.concat(m):v=-1,m.length&&s())}function s(){if(!b){var t=r(a);b=!0;for(var e=m.length;e;){for(p=m,m=[];++v<e;)p&&p[v].run();v=-1,e=m.length}p=null,b=!1,i(t)}}function c(t,e){this.fun=t,this.array=e}function l(){}var u,f,d=t.exports={};!function(){try{u="function"==typeof setTimeout?setTimeout:n}catch(t){u=n}try{f="function"==typeof clearTimeout?clearTimeout:o}catch(t){f=o}}();var p,m=[],b=!1,v=-1;d.nextTick=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)e[n-1]=arguments[n];m.push(new c(t,e)),1!==m.length||b||r(s)},c.prototype.run=function(){this.fun.apply(null,this.array)},d.title="browser",d.browser=!0,d.env={},d.argv=[],d.version="",d.versions={},d.on=l,d.addListener=l,d.once=l,d.off=l,d.removeListener=l,d.removeAllListeners=l,d.emit=l,d.prependListener=l,d.prependOnceListener=l,d.listeners=function(t){return[]},d.binding=function(t){throw new Error("process.binding is not supported")},d.cwd=function(){return"/"},d.chdir=function(t){throw new Error("process.chdir is not supported")},d.umask=function(){return 0}},function(t,e,n){"use strict";n(22).polyfill()},function(t,e,n){"use strict";function o(t,e){if(void 0===t||null===t)throw new TypeError("Cannot convert first argument to object");for(var n=Object(t),o=1;o<arguments.length;o++){var r=arguments[o];if(void 0!==r&&null!==r)for(var i=Object.keys(Object(r)),a=0,s=i.length;a<s;a++){var c=i[a],l=Object.getOwnPropertyDescriptor(r,c);void 0!==l&&l.enumerable&&(n[c]=r[c])}}return n}function r(){Object.assign||Object.defineProperty(Object,"assign",{enumerable:!1,configurable:!0,writable:!0,value:o})}t.exports={assign:o,polyfill:r}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(24),r=n(6),i=n(5),a=n(36),s=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];if("undefined"!=typeof window){var n=a.getOpts.apply(void 0,t);return new Promise(function(t,e){i.default.promise={resolve:t,reject:e},o.default(n),setTimeout(function(){r.openModal()})})}};s.close=r.onAction,s.getState=r.getState,s.setActionValue=i.setActionValue,s.stopLoading=r.stopLoading,s.setDefaults=a.setDefaults,e.default=s},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(1),r=n(0),i=r.default.MODAL,a=n(4),s=n(34),c=n(35),l=n(1);e.init=function(t){o.getNode(i)||(document.body||l.throwErr("You can only use SweetAlert AFTER the DOM has loaded!"),s.default(),a.default()),a.initModalContent(t),c.default(t)},e.default=e.init},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(0),r=o.default.MODAL;e.modalMarkup='\n <div class="'+r+'"></div>',e.default=e.modalMarkup},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(0),r=o.default.OVERLAY,i='<div \n class="'+r+'"\n tabIndex="-1">\n </div>';e.default=i},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(0),r=o.default.ICON;e.errorIconMarkup=function(){var t=r+"--error",e=t+"__line";return'\n <div class="'+t+'__x-mark">\n <span class="'+e+" "+e+'--left"></span>\n <span class="'+e+" "+e+'--right"></span>\n </div>\n '},e.warningIconMarkup=function(){var t=r+"--warning";return'\n <span class="'+t+'__body">\n <span class="'+t+'__dot"></span>\n </span>\n '},e.successIconMarkup=function(){var t=r+"--success";return'\n <span class="'+t+"__line "+t+'__line--long"></span>\n <span class="'+t+"__line "+t+'__line--tip"></span>\n\n <div class="'+t+'__ring"></div>\n <div class="'+t+'__hide-corners"></div>\n '}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(0),r=o.default.CONTENT;e.contentMarkup='\n <div class="'+r+'">\n\n </div>\n'},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(0),r=o.default.BUTTON_CONTAINER,i=o.default.BUTTON,a=o.default.BUTTON_LOADER;e.buttonMarkup='\n <div class="'+r+'">\n\n <button\n class="'+i+'"\n ></button>\n\n <div class="'+a+'">\n <div></div>\n <div></div>\n <div></div>\n </div>\n\n </div>\n'},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(4),r=n(2),i=n(0),a=i.default.ICON,s=i.default.ICON_CUSTOM,c=["error","warning","success","info"],l={error:r.errorIconMarkup(),warning:r.warningIconMarkup(),success:r.successIconMarkup()},u=function(t,e){var n=a+"--"+t;e.classList.add(n);var o=l[t];o&&(e.innerHTML=o)},f=function(t,e){e.classList.add(s);var n=document.createElement("img");n.src=t,e.appendChild(n)},d=function(t){if(t){var e=o.injectElIntoModal(r.iconMarkup);c.includes(t)?u(t,e):f(t,e)}};e.default=d},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(2),r=n(4),i=function(t){navigator.userAgent.includes("AppleWebKit")&&(t.style.display="none",t.offsetHeight,t.style.display="")};e.initTitle=function(t){if(t){var e=r.injectElIntoModal(o.titleMarkup);e.textContent=t,i(e)}},e.initText=function(t){if(t){var e=r.injectElIntoModal(o.textMarkup);e.textContent=t,i(e)}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(1),r=n(4),i=n(0),a=i.default.BUTTON,s=i.default.DANGER_BUTTON,c=n(3),l=n(2),u=n(6),f=n(5),d=function(t,e,n){var r=e.text,i=e.value,d=e.className,p=e.closeModal,m=o.stringToNode(l.buttonMarkup),b=m.querySelector("."+a),v=a+"--"+t;b.classList.add(v),d&&b.classList.add(d),n&&t===c.CONFIRM_KEY&&b.classList.add(s),b.textContent=r;var g={};return g[t]=i,f.setActionValue(g),f.setActionOptionsFor(t,{closeModal:p}),b.addEventListener("click",function(){return u.onAction(t)}),m},p=function(t,e){var n=r.injectElIntoModal(l.footerMarkup);for(var o in t){var i=t[o],a=d(o,i,e);i.visible&&n.appendChild(a)}0===n.children.length&&n.remove()};e.default=p},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(3),r=n(4),i=n(2),a=n(5),s=n(6),c=n(0),l=c.default.CONTENT,u=function(t){t.addEventListener("input",function(t){var e=t.target,n=e.value;a.setActionValue(n)}),t.addEventListener("keyup",function(t){if("Enter"===t.key)return s.onAction(o.CONFIRM_KEY)}),setTimeout(function(){t.focus(),a.setActionValue("")},0)},f=function(t,e,n){var o=document.createElement(e),r=l+"__"+e;o.classList.add(r);for(var i in n){var a=n[i];o[i]=a}"input"===e&&u(o),t.appendChild(o)},d=function(t){if(t){var e=r.injectElIntoModal(i.contentMarkup),n=t.element,o=t.attributes;"string"==typeof n?f(e,n,o):e.appendChild(n)}};e.default=d},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(1),r=n(2),i=function(){var t=o.stringToNode(r.overlayMarkup);document.body.appendChild(t)};e.default=i},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(5),r=n(6),i=n(1),a=n(3),s=n(0),c=s.default.MODAL,l=s.default.BUTTON,u=s.default.OVERLAY,f=function(t){t.preventDefault(),v()},d=function(t){t.preventDefault(),g()},p=function(t){if(o.default.isOpen)switch(t.key){case"Escape":return r.onAction(a.CANCEL_KEY)}},m=function(t){if(o.default.isOpen)switch(t.key){case"Tab":return f(t)}},b=function(t){if(o.default.isOpen)return"Tab"===t.key&&t.shiftKey?d(t):void 0},v=function(){var t=i.getNode(l);t&&(t.tabIndex=0,t.focus())},g=function(){var t=i.getNode(c),e=t.querySelectorAll("."+l),n=e.length-1,o=e[n];o&&o.focus()},h=function(t){t[t.length-1].addEventListener("keydown",m)},w=function(t){t[0].addEventListener("keydown",b)},y=function(){var t=i.getNode(c),e=t.querySelectorAll("."+l);e.length&&(h(e),w(e))},x=function(t){if(i.getNode(u)===t.target)return r.onAction(a.CANCEL_KEY)},_=function(t){var e=i.getNode(u);e.removeEventListener("click",x),t&&e.addEventListener("click",x)},k=function(t){o.default.timer&&clearTimeout(o.default.timer),t&&(o.default.timer=window.setTimeout(function(){return r.onAction(a.CANCEL_KEY)},t))},O=function(t){t.closeOnEsc?document.addEventListener("keyup",p):document.removeEventListener("keyup",p),t.dangerMode?v():g(),y(),_(t.closeOnClickOutside),k(t.timer)};e.default=O},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(1),r=n(3),i=n(37),a=n(38),s={title:null,text:null,icon:null,buttons:r.defaultButtonList,content:null,className:null,closeOnClickOutside:!0,closeOnEsc:!0,dangerMode:!1,timer:null},c=Object.assign({},s);e.setDefaults=function(t){c=Object.assign({},s,t)};var l=function(t){var e=t&&t.button,n=t&&t.buttons;return void 0!==e&&void 0!==n&&o.throwErr("Cannot set both 'button' and 'buttons' options!"),void 0!==e?{confirm:e}:n},u=function(t){return o.ordinalSuffixOf(t+1)},f=function(t,e){o.throwErr(u(e)+" argument ('"+t+"') is invalid")},d=function(t,e){var n=t+1,r=e[n];o.isPlainObject(r)||void 0===r||o.throwErr("Expected "+u(n)+" argument ('"+r+"') to be a plain object")},p=function(t,e){var n=t+1,r=e[n];void 0!==r&&o.throwErr("Unexpected "+u(n)+" argument ("+r+")")},m=function(t,e,n,r){var i=typeof e,a="string"===i,s=e instanceof Element;if(a){if(0===n)return{text:e};if(1===n)return{text:e,title:r[0]};if(2===n)return d(n,r),{icon:e};f(e,n)}else{if(s&&0===n)return d(n,r),{content:e};if(o.isPlainObject(e))return p(n,r),e;f(e,n)}};e.getOpts=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];var n={};t.forEach(function(e,o){var r=m(0,e,o,t);Object.assign(n,r)});var o=l(n);n.buttons=r.getButtonListOpts(o),delete n.button,n.content=i.getContentOpts(n.content);var u=Object.assign({},s,c,n);return Object.keys(u).forEach(function(t){a.DEPRECATED_OPTS[t]&&a.logDeprecation(t)}),u}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=n(1),r={element:"input",attributes:{placeholder:""}};e.getContentOpts=function(t){var e={};return o.isPlainObject(t)?Object.assign(e,t):t instanceof Element?{element:t}:"input"===t?r:null}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.logDeprecation=function(t){var n=e.DEPRECATED_OPTS[t],o=n.onlyRename,r=n.replacement,i=n.subOption,a=n.link,s=o?"renamed":"deprecated",c='SweetAlert warning: "'+t+'" option has been '+s+".";if(r){c+=" Please use"+(i?' "'+i+'" in ':" ")+'"'+r+'" instead.'}var l="https://sweetalert.js.org";c+=a?" More details: "+l+a:" More details: "+l+"/guides/#upgrading-from-1x",console.warn(c)},e.DEPRECATED_OPTS={type:{replacement:"icon",link:"/docs/#icon"},imageUrl:{replacement:"icon",link:"/docs/#icon"},customClass:{replacement:"className",onlyRename:!0,link:"/docs/#classname"},imageSize:{},showCancelButton:{replacement:"buttons",link:"/docs/#buttons"},showConfirmButton:{replacement:"button",link:"/docs/#button"},confirmButtonText:{replacement:"button",link:"/docs/#button"},confirmButtonColor:{},cancelButtonText:{replacement:"buttons",link:"/docs/#buttons"},closeOnConfirm:{replacement:"button",subOption:"closeModal",link:"/docs/#button"},closeOnCancel:{replacement:"buttons",subOption:"closeModal",link:"/docs/#buttons"},showLoaderOnConfirm:{replacement:"buttons"},animation:{},inputType:{replacement:"content",link:"/docs/#content"},inputValue:{replacement:"content",link:"/docs/#content"},inputPlaceholder:{replacement:"content",link:"/docs/#content"},html:{replacement:"content",link:"/docs/#content"},allowEscapeKey:{replacement:"closeOnEsc",onlyRename:!0,link:"/docs/#closeonesc"},allowClickOutside:{replacement:"closeOnClickOutside",onlyRename:!0,link:"/docs/#closeonclickoutside"}}}])}); \ No newline at end of file diff --git a/uam-server/src/main/webapp/public/fonts/glyphicons-halflings-regular.eot b/uam-server/src/main/webapp/public/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64 Binary files /dev/null and b/uam-server/src/main/webapp/public/fonts/glyphicons-halflings-regular.eot differ diff --git a/uam-server/src/main/webapp/public/fonts/glyphicons-halflings-regular.svg b/uam-server/src/main/webapp/public/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 0000000000000000000000000000000000000000..94fb5490a2ed10b2c69a4a567a4fd2e4f706d841 --- /dev/null +++ b/uam-server/src/main/webapp/public/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,288 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata></metadata> +<defs> +<font id="glyphicons_halflingsregular" horiz-adv-x="1200" > +<font-face units-per-em="1200" ascent="960" descent="-240" /> +<missing-glyph horiz-adv-x="500" /> +<glyph horiz-adv-x="0" /> +<glyph horiz-adv-x="400" /> +<glyph unicode=" " /> +<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" /> +<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xa0;" /> +<glyph unicode="&#xa5;" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" /> +<glyph unicode="&#x2000;" horiz-adv-x="650" /> +<glyph unicode="&#x2001;" horiz-adv-x="1300" /> +<glyph unicode="&#x2002;" horiz-adv-x="650" /> +<glyph unicode="&#x2003;" horiz-adv-x="1300" /> +<glyph unicode="&#x2004;" horiz-adv-x="433" /> +<glyph unicode="&#x2005;" horiz-adv-x="325" /> +<glyph unicode="&#x2006;" horiz-adv-x="216" /> +<glyph unicode="&#x2007;" horiz-adv-x="216" /> +<glyph unicode="&#x2008;" horiz-adv-x="162" /> +<glyph unicode="&#x2009;" horiz-adv-x="260" /> +<glyph unicode="&#x200a;" horiz-adv-x="72" /> +<glyph unicode="&#x202f;" horiz-adv-x="260" /> +<glyph unicode="&#x205f;" horiz-adv-x="325" /> +<glyph unicode="&#x20ac;" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" /> +<glyph unicode="&#x20bd;" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" /> +<glyph unicode="&#x2212;" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#x231b;" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" /> +<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" /> +<glyph unicode="&#x2601;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" /> +<glyph unicode="&#x26fa;" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " /> +<glyph unicode="&#x2709;" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" /> +<glyph unicode="&#x270f;" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" /> +<glyph unicode="&#xe001;" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" /> +<glyph unicode="&#xe002;" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" /> +<glyph unicode="&#xe003;" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" /> +<glyph unicode="&#xe005;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" /> +<glyph unicode="&#xe006;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" /> +<glyph unicode="&#xe007;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" /> +<glyph unicode="&#xe008;" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" /> +<glyph unicode="&#xe009;" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" /> +<glyph unicode="&#xe010;" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe011;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" /> +<glyph unicode="&#xe012;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe013;" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" /> +<glyph unicode="&#xe014;" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" /> +<glyph unicode="&#xe015;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe016;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe017;" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" /> +<glyph unicode="&#xe018;" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe019;" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" /> +<glyph unicode="&#xe020;" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" /> +<glyph unicode="&#xe021;" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" /> +<glyph unicode="&#xe022;" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" /> +<glyph unicode="&#xe023;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe024;" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" /> +<glyph unicode="&#xe025;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe026;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " /> +<glyph unicode="&#xe027;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" /> +<glyph unicode="&#xe028;" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" /> +<glyph unicode="&#xe029;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" /> +<glyph unicode="&#xe030;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" /> +<glyph unicode="&#xe031;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" /> +<glyph unicode="&#xe032;" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe033;" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" /> +<glyph unicode="&#xe034;" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" /> +<glyph unicode="&#xe035;" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" /> +<glyph unicode="&#xe036;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" /> +<glyph unicode="&#xe037;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" /> +<glyph unicode="&#xe038;" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" /> +<glyph unicode="&#xe039;" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" /> +<glyph unicode="&#xe040;" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" /> +<glyph unicode="&#xe041;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" /> +<glyph unicode="&#xe042;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" /> +<glyph unicode="&#xe043;" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" /> +<glyph unicode="&#xe044;" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe045;" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" /> +<glyph unicode="&#xe046;" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" /> +<glyph unicode="&#xe047;" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" /> +<glyph unicode="&#xe048;" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" /> +<glyph unicode="&#xe049;" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" /> +<glyph unicode="&#xe050;" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" /> +<glyph unicode="&#xe051;" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" /> +<glyph unicode="&#xe052;" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe053;" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe054;" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" /> +<glyph unicode="&#xe055;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe056;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe057;" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe058;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe059;" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" /> +<glyph unicode="&#xe060;" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" /> +<glyph unicode="&#xe062;" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" /> +<glyph unicode="&#xe063;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" /> +<glyph unicode="&#xe064;" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" /> +<glyph unicode="&#xe065;" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" /> +<glyph unicode="&#xe066;" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" /> +<glyph unicode="&#xe067;" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" /> +<glyph unicode="&#xe068;" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" /> +<glyph unicode="&#xe069;" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe070;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe071;" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" /> +<glyph unicode="&#xe072;" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" /> +<glyph unicode="&#xe073;" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe074;" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" /> +<glyph unicode="&#xe075;" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" /> +<glyph unicode="&#xe076;" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe077;" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe078;" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe079;" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" /> +<glyph unicode="&#xe080;" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" /> +<glyph unicode="&#xe081;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" /> +<glyph unicode="&#xe082;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" /> +<glyph unicode="&#xe083;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" /> +<glyph unicode="&#xe084;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" /> +<glyph unicode="&#xe085;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" /> +<glyph unicode="&#xe086;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" /> +<glyph unicode="&#xe087;" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" /> +<glyph unicode="&#xe088;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" /> +<glyph unicode="&#xe089;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" /> +<glyph unicode="&#xe090;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" /> +<glyph unicode="&#xe091;" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" /> +<glyph unicode="&#xe092;" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" /> +<glyph unicode="&#xe093;" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" /> +<glyph unicode="&#xe094;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe095;" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" /> +<glyph unicode="&#xe096;" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" /> +<glyph unicode="&#xe097;" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" /> +<glyph unicode="&#xe101;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" /> +<glyph unicode="&#xe102;" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" /> +<glyph unicode="&#xe103;" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" /> +<glyph unicode="&#xe104;" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" /> +<glyph unicode="&#xe105;" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" /> +<glyph unicode="&#xe106;" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" /> +<glyph unicode="&#xe107;" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" /> +<glyph unicode="&#xe108;" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" /> +<glyph unicode="&#xe109;" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" /> +<glyph unicode="&#xe110;" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" /> +<glyph unicode="&#xe111;" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" /> +<glyph unicode="&#xe112;" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" /> +<glyph unicode="&#xe113;" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" /> +<glyph unicode="&#xe114;" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" /> +<glyph unicode="&#xe115;" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" /> +<glyph unicode="&#xe116;" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" /> +<glyph unicode="&#xe117;" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" /> +<glyph unicode="&#xe118;" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" /> +<glyph unicode="&#xe119;" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" /> +<glyph unicode="&#xe120;" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" /> +<glyph unicode="&#xe121;" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" /> +<glyph unicode="&#xe122;" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" /> +<glyph unicode="&#xe123;" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" /> +<glyph unicode="&#xe124;" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" /> +<glyph unicode="&#xe125;" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe126;" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" /> +<glyph unicode="&#xe127;" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe128;" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe129;" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe130;" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" /> +<glyph unicode="&#xe131;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" /> +<glyph unicode="&#xe132;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" /> +<glyph unicode="&#xe133;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" /> +<glyph unicode="&#xe134;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" /> +<glyph unicode="&#xe135;" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" /> +<glyph unicode="&#xe136;" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" /> +<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " /> +<glyph unicode="&#xe138;" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" /> +<glyph unicode="&#xe139;" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" /> +<glyph unicode="&#xe140;" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" /> +<glyph unicode="&#xe141;" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" /> +<glyph unicode="&#xe142;" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" /> +<glyph unicode="&#xe143;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" /> +<glyph unicode="&#xe144;" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" /> +<glyph unicode="&#xe145;" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" /> +<glyph unicode="&#xe146;" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" /> +<glyph unicode="&#xe148;" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" /> +<glyph unicode="&#xe149;" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" /> +<glyph unicode="&#xe150;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" /> +<glyph unicode="&#xe151;" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " /> +<glyph unicode="&#xe152;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " /> +<glyph unicode="&#xe153;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" /> +<glyph unicode="&#xe154;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" /> +<glyph unicode="&#xe155;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" /> +<glyph unicode="&#xe156;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" /> +<glyph unicode="&#xe157;" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" /> +<glyph unicode="&#xe158;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" /> +<glyph unicode="&#xe159;" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" /> +<glyph unicode="&#xe160;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" /> +<glyph unicode="&#xe161;" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" /> +<glyph unicode="&#xe162;" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" /> +<glyph unicode="&#xe163;" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" /> +<glyph unicode="&#xe164;" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" /> +<glyph unicode="&#xe165;" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" /> +<glyph unicode="&#xe166;" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" /> +<glyph unicode="&#xe167;" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" /> +<glyph unicode="&#xe168;" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" /> +<glyph unicode="&#xe169;" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" /> +<glyph unicode="&#xe170;" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" /> +<glyph unicode="&#xe171;" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" /> +<glyph unicode="&#xe172;" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" /> +<glyph unicode="&#xe173;" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" /> +<glyph unicode="&#xe174;" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" /> +<glyph unicode="&#xe175;" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe176;" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" /> +<glyph unicode="&#xe177;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" /> +<glyph unicode="&#xe178;" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" /> +<glyph unicode="&#xe179;" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" /> +<glyph unicode="&#xe180;" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" /> +<glyph unicode="&#xe181;" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" /> +<glyph unicode="&#xe182;" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" /> +<glyph unicode="&#xe183;" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" /> +<glyph unicode="&#xe184;" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe185;" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " /> +<glyph unicode="&#xe186;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" /> +<glyph unicode="&#xe187;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" /> +<glyph unicode="&#xe188;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" /> +<glyph unicode="&#xe189;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" /> +<glyph unicode="&#xe190;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" /> +<glyph unicode="&#xe191;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" /> +<glyph unicode="&#xe192;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" /> +<glyph unicode="&#xe193;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" /> +<glyph unicode="&#xe194;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" /> +<glyph unicode="&#xe195;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" /> +<glyph unicode="&#xe197;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe198;" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" /> +<glyph unicode="&#xe199;" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" /> +<glyph unicode="&#xe200;" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" /> +<glyph unicode="&#xe201;" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" /> +<glyph unicode="&#xe202;" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" /> +<glyph unicode="&#xe203;" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" /> +<glyph unicode="&#xe204;" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" /> +<glyph unicode="&#xe205;" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" /> +<glyph unicode="&#xe206;" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" /> +<glyph unicode="&#xe209;" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" /> +<glyph unicode="&#xe210;" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe211;" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe212;" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe213;" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe214;" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe215;" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe216;" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" /> +<glyph unicode="&#xe218;" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" /> +<glyph unicode="&#xe219;" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" /> +<glyph unicode="&#xe221;" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe223;" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" /> +<glyph unicode="&#xe224;" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " /> +<glyph unicode="&#xe225;" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" /> +<glyph unicode="&#xe226;" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" /> +<glyph unicode="&#xe227;" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" /> +<glyph unicode="&#xe230;" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" /> +<glyph unicode="&#xe231;" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" /> +<glyph unicode="&#xe232;" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" /> +<glyph unicode="&#xe233;" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" /> +<glyph unicode="&#xe234;" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" /> +<glyph unicode="&#xe235;" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" /> +<glyph unicode="&#xe236;" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" /> +<glyph unicode="&#xe237;" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" /> +<glyph unicode="&#xe238;" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe239;" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" /> +<glyph unicode="&#xe240;" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" /> +<glyph unicode="&#xe241;" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" /> +<glyph unicode="&#xe242;" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" /> +<glyph unicode="&#xe243;" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" /> +<glyph unicode="&#xe244;" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" /> +<glyph unicode="&#xe245;" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" /> +<glyph unicode="&#xe246;" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" /> +<glyph unicode="&#xe247;" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe248;" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" /> +<glyph unicode="&#xe249;" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" /> +<glyph unicode="&#xe250;" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" /> +<glyph unicode="&#xe251;" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" /> +<glyph unicode="&#xe252;" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" /> +<glyph unicode="&#xe253;" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" /> +<glyph unicode="&#xe254;" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" /> +<glyph unicode="&#xe255;" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" /> +<glyph unicode="&#xe256;" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" /> +<glyph unicode="&#xe257;" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" /> +<glyph unicode="&#xe258;" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" /> +<glyph unicode="&#xe259;" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" /> +<glyph unicode="&#xe260;" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" /> +<glyph unicode="&#xf8ff;" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" /> +<glyph unicode="&#x1f511;" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" /> +<glyph unicode="&#x1f6aa;" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" /> +</font> +</defs></svg> \ No newline at end of file diff --git a/uam-server/src/main/webapp/public/fonts/glyphicons-halflings-regular.ttf b/uam-server/src/main/webapp/public/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b Binary files /dev/null and b/uam-server/src/main/webapp/public/fonts/glyphicons-halflings-regular.ttf differ diff --git a/uam-server/src/main/webapp/public/fonts/glyphicons-halflings-regular.woff b/uam-server/src/main/webapp/public/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..9e612858f802245ddcbf59788a0db942224bab35 Binary files /dev/null and b/uam-server/src/main/webapp/public/fonts/glyphicons-halflings-regular.woff differ diff --git a/uam-server/src/main/webapp/public/fonts/glyphicons-halflings-regular.woff2 b/uam-server/src/main/webapp/public/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0 Binary files /dev/null and b/uam-server/src/main/webapp/public/fonts/glyphicons-halflings-regular.woff2 differ diff --git a/uam-server/src/main/webapp/public/img/.DS_Store b/uam-server/src/main/webapp/public/img/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 Binary files /dev/null and b/uam-server/src/main/webapp/public/img/.DS_Store differ diff --git a/uam-server/src/main/webapp/public/img/login/Res.svg b/uam-server/src/main/webapp/public/img/login/Res.svg new file mode 100644 index 0000000000000000000000000000000000000000..bfb688321a6f5b5d1de93792648a8d4dc293081d --- /dev/null +++ b/uam-server/src/main/webapp/public/img/login/Res.svg @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="59px" height="57px" viewBox="0 0 59 57" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch --> + <title>Group</title> + <desc>Created with Sketch.</desc> + <defs> + <linearGradient x1="95.617643%" y1="30.8807958%" x2="6.4312356%" y2="73.4870905%" id="linearGradient-1"> + <stop stop-color="#FFF082" offset="0%"></stop> + <stop stop-color="#009EFD" offset="100%"></stop> + </linearGradient> + <path d="M0.980540852,0.0283885714 C0.742671738,0.0283885714 0.523159082,0.152557714 0.406136656,0.353499429 C-0.224611672,1.43670857 0.583582426,2.77640229 1.86802466,2.77640229 L8.60433521,2.77640229 L8.97528866,2.77640229 C9.33578911,2.77640229 9.69552472,2.82577371 10.0374138,2.93636571 C11.0120908,3.25135543 12.5032981,4.05216 11.8134012,5.87643429 C11.2917718,7.25537829 9.97775528,8.038656 7.8708417,8.22552686 C7.46903921,8.26132114 7.20975423,8.65431771 7.34997718,9.02065371 L9.38117036,14.321664 C9.73810151,15.2525623 10.8254668,15.7065326 11.7692947,15.3179794 L12.923967,14.8432731 C13.2638164,14.7033051 13.4236706,14.3243794 13.2819179,13.9940846 L11.7759234,10.4859977 C11.6701188,10.2396343 11.7458392,9.95278629 11.964842,9.79109486 C14.1604784,8.17072457 15.3398809,6.51554743 15.5033044,4.82556343 C15.6603541,3.200256 14.8595536,1.72775314 13.1003929,0.408301714 C12.7676821,0.158729143 12.3544068,0.0283885714 11.933483,0.0283885714 L0.980540852,0.0283885714 Z" id="path-2"></path> + <path d="M4.911616,0.0441 C4.127744,0.0441 3.438336,0.552888 3.218432,1.293264 L0.230656,11.355372 C0.12288,11.718252 0.39936,12.081132 0.783104,12.081132 L2.23872,12.081132 C2.95296,12.081132 3.581184,11.616696 3.780608,10.94184 L6.7648,0.848232 C6.883584,0.44604 6.577152,0.0441 6.15168,0.0441 L4.911616,0.0441 Z" id="path-4"></path> + </defs> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> + <g id="方案一" transform="translate(-884.000000, -238.000000)"> + <g id="Group" transform="translate(884.000000, 238.000000)"> + <g id="Group-9-Copy"> + <g id="Group-18" transform="translate(0.000000, 37.600000)"> + <text id="混合云管理平台" font-family="PingFangSC-Medium, PingFang SC" font-size="8.39808" font-weight="400" fill="#213056"> + <tspan x="0" y="18.09792">混合云管理平台</tspan> + </text> + <text id="Cloud-Res" font-family="Arial-BoldMT, Arial" font-size="9.79776" font-weight="bold" fill="#212F54"> + <tspan x="0" y="9">Cloud Res</tspan> + </text> + </g> + <g id="Group-57" transform="translate(12.800000, 0.000000)"> + <g id="Group-34-Copy" fill="url(#linearGradient-1)"> + <circle id="Oval-3" cx="16.416" cy="16.416" r="16.416"></circle> + </g> + <g id="Page-1" transform="translate(7.776000, 8.640000)"> + <g id="Group-3" transform="translate(0.864000, 0.000000)"> + <mask id="mask-3" fill="white"> + <use xlink:href="#path-2"></use> + </mask> + <g id="Clip-2"></g> + <polygon id="Fill-1" fill="#FEFEFE" mask="url(#mask-3)" points="-5.35396721 20.2422857 19.8718867 20.2422857 19.8718867 -4.18274743 -5.35396721 -4.18274743"></polygon> + </g> + <g id="Group-6" transform="translate(0.000000, 4.320000)"> + <mask id="mask-5" fill="white"> + <use xlink:href="#path-4"></use> + </mask> + <g id="Clip-5"></g> + <polygon id="Fill-4" fill="#FEFEFE" mask="url(#mask-5)" points="-4.352 16.38 11.369728 16.38 11.369728 -4.25502 -4.352 -4.25502"></polygon> + </g> + </g> + </g> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/uam-server/src/main/webapp/public/img/login/bg.png b/uam-server/src/main/webapp/public/img/login/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..7788c45059b4c87337fc0e325536774999a5d5d5 Binary files /dev/null and b/uam-server/src/main/webapp/public/img/login/bg.png differ diff --git a/uam-server/src/main/webapp/public/img/login/logo.png b/uam-server/src/main/webapp/public/img/login/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6656106dc527760c418f32bd2686a6a19d71a5af Binary files /dev/null and b/uam-server/src/main/webapp/public/img/login/logo.png differ diff --git a/uam-server/src/main/webapp/public/img/login/pwdicon.svg b/uam-server/src/main/webapp/public/img/login/pwdicon.svg new file mode 100644 index 0000000000000000000000000000000000000000..1e8d3fe4b68e7e0fe0cee81937b0e02b76968244 --- /dev/null +++ b/uam-server/src/main/webapp/public/img/login/pwdicon.svg @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="14px" height="18px" viewBox="0 0 14 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch --> + <title>Shape</title> + <desc>Created with Sketch.</desc> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" opacity="0.6"> + <g id="方案一" transform="translate(-802.000000, -407.000000)" fill="#4C5A71"> + <g id="分组" transform="translate(782.000000, 396.000000)"> + <path d="M33.0641319,24.6142462 C32.7176032,25.4719047 32.2259656,26.2385994 31.6043797,26.8905066 C30.9849597,27.5489111 30.2572494,28.0687041 29.4450728,28.4347251 C28.6047407,28.8094092 27.7145951,29 26.8006257,29 C25.8844904,29 24.9943448,28.8094092 24.1540128,28.4325593 C23.3418361,28.0687041 22.6162917,27.5489111 21.9947058,26.8905066 C21.3687884,26.2299362 20.8771508,25.4632415 20.5349537,24.6142462 C20.1797618,23.7349296 20,22.7993021 20,21.8333534 L20,12.3969438 C20,11.6259175 20.5955962,11 21.3298039,11 L32.2671159,11 C33.0013235,11 33.5969197,11.6259175 33.5947539,12.3969438 L33.5947539,20.7244616 L33.5990855,21.1078089 L33.5990855,21.8333534 C33.5990855,22.7949705 33.4193238,23.730598 33.0641319,24.6142462 L33.0641319,24.6142462 Z M24.6868006,27.1698953 L24.6911322,27.1698953 L24.7171219,27.1807243 C25.3733606,27.4796053 26.0729154,27.6312116 26.7984599,27.6312116 C27.5196727,27.6312116 28.2213933,27.4796053 28.8819637,27.1850559 C29.5230418,26.897004 30.1034773,26.4811695 30.6081097,25.9527133 C31.114908,25.4177596 31.5112502,24.7961737 31.7906389,24.1052822 C32.0808567,23.3862351 32.2281314,22.623872 32.2281314,21.8333534 L32.2281314,21.239923 L21.3687884,21.239923 L21.3687884,21.239923 L21.3687884,21.8355192 C21.3687884,22.6173746 21.516063,23.3819035 21.8062808,24.1052822 C22.0878354,24.8026712 22.4863434,25.4220912 22.98881,25.9505475 C23.486945,26.4746721 24.0565516,26.8861749 24.6868006,27.1698953 L24.6868006,27.1698953 Z M32.232463,19.8711346 L32.232463,12.3969438 C32.232463,12.383949 32.2302972,12.3752858 32.2281314,12.3687884 L21.37312,12.3687884 C21.3709542,12.3752858 21.3687884,12.383949 21.3687884,12.3969438 L21.3687884,19.8711346 L32.232463,19.8711346 L32.232463,19.8711346 Z M26.166045,16.789195 L26.166045,14.9937432 C26.166045,14.6428829 26.4519312,14.3569968 26.8027915,14.3569968 C27.1536518,14.3569968 27.439538,14.6428829 27.439538,14.9937432 L27.439538,16.7935267 C27.7774034,17.0101071 27.9788232,17.376128 27.9788232,17.7811334 C27.9788232,18.4308747 27.450367,18.959331 26.8006257,18.959331 C26.1508844,18.959331 25.6224281,18.4308747 25.6224281,17.7811334 C25.6224281,17.3804596 25.8303453,17.0036097 26.166045,16.789195 L26.166045,16.789195 Z" id="Shape" transform="translate(26.799543, 20.000000) scale(1, -1) translate(-26.799543, -20.000000) "></path> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/uam-server/src/main/webapp/public/img/login/usericon.svg b/uam-server/src/main/webapp/public/img/login/usericon.svg new file mode 100644 index 0000000000000000000000000000000000000000..420e0ada838035d2d353c307b8615070c1c163b7 --- /dev/null +++ b/uam-server/src/main/webapp/public/img/login/usericon.svg @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="14px" height="18px" viewBox="0 0 14 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch --> + <title>Shape</title> + <desc>Created with Sketch.</desc> + <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" opacity="0.6"> + <g id="方案一" transform="translate(-802.000000, -343.000000)" fill="#4C5A71"> + <path d="M814.90057,346.339895 C814.562353,347.139134 814.077173,347.857846 813.461134,348.473884 C812.845096,349.089923 812.126384,349.575103 811.327145,349.913321 C811.055363,350.028073 810.775528,350.124706 810.493681,350.203221 C811.290907,350.47299 812.021698,350.923946 812.63371,351.535958 C813.680573,352.582821 814.25836,353.975953 814.25836,355.455654 C814.25836,356.935354 813.682586,358.328487 812.63371,359.37535 C811.586847,360.422212 810.193714,361 808.714014,361 C807.234314,361 805.841181,360.424225 804.794318,359.37535 C803.747456,358.328487 803.169668,356.935354 803.169668,355.455654 C803.169668,353.975953 803.745442,352.582821 804.794318,351.535958 C805.40633,350.923946 806.137121,350.47299 806.934347,350.203221 C806.6525,350.124706 806.372665,350.030086 806.100884,349.913321 C805.301644,349.575103 804.582933,349.089923 803.966894,348.473884 C803.350856,347.857846 802.865675,347.139134 802.527458,346.339895 C802.177161,345.510457 802,344.632703 802,343.724751 C802,343.324125 802.324125,343 802.724751,343 C803.125377,343 803.449502,343.324125 803.449502,343.724751 C803.449502,345.131976 803.997092,346.454647 804.991612,347.449167 C805.986131,348.443686 807.308802,348.991276 808.716027,348.991276 C810.123252,348.991276 811.445923,348.443686 812.440443,347.449167 C813.434963,346.454647 813.982552,345.131976 813.982552,343.724751 C813.982552,343.324125 814.306677,343 814.707303,343 C815.10793,343 815.432055,343.324125 815.432055,343.724751 C815.428028,344.632703 815.250867,345.510457 814.90057,346.339895 L814.90057,346.339895 Z M804.617157,355.455654 C804.617157,357.714461 806.455206,359.550498 808.712001,359.550498 C810.968795,359.550498 812.806845,357.714461 812.806845,355.455654 C812.806845,353.196846 810.970809,351.36081 808.712001,351.36081 C806.453193,351.36081 804.617157,353.198859 804.617157,355.455654 L804.617157,355.455654 Z" id="Shape" transform="translate(808.716027, 352.000000) scale(1, -1) translate(-808.716027, -352.000000) "></path> + </g> + </g> +</svg> \ No newline at end of file diff --git a/uam-web/.bowerrc b/uam-web/.bowerrc new file mode 100644 index 0000000000000000000000000000000000000000..959e1696e7b2c970005c35ec8a0f94aea5df36ac --- /dev/null +++ b/uam-web/.bowerrc @@ -0,0 +1,4 @@ +{ + "directory": "bower_components", + "analytics": false +} diff --git a/uam-web/.ember-cli b/uam-web/.ember-cli new file mode 100644 index 0000000000000000000000000000000000000000..927fabe4ab8158894f4ed6da87461d45f6b51a62 --- /dev/null +++ b/uam-web/.ember-cli @@ -0,0 +1,10 @@ +{ + /** + Ember CLI sends analytics information by default. The data is completely + anonymous, but there are times when you might want to disable this behavior. + + Setting `disableAnalytics` to true will prevent any data from being sent. + */ + "disableAnalytics": false, + "usePods": true +} diff --git a/uam-web/.gitignore b/uam-web/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..46ce63a91eeedd0d5e5f5c7c26fa6c798d24f4f7 --- /dev/null +++ b/uam-web/.gitignore @@ -0,0 +1,7 @@ +# clouduam-web +node_modules/ +bower_components/ +dist/ +tmp/ +bin/ +.DS_Store \ No newline at end of file diff --git a/uam-web/.jshintrc b/uam-web/.jshintrc new file mode 100644 index 0000000000000000000000000000000000000000..20266c4b4390a806c34f380cfcf7421db09c96f2 --- /dev/null +++ b/uam-web/.jshintrc @@ -0,0 +1,36 @@ +{ + "predef": [ + "document", + "window", + "-Promise", + "swal", + "go", + "store", + "$" + ], + "browser": true, + "boss": true, + "curly": true, + "debug": false, + "devel": true, + "eqeqeq": true, + "evil": true, + "forin": false, + "immed": false, + "laxbreak": false, + "newcap": true, + "noarg": true, + "noempty": false, + "nonew": false, + "nomen": false, + "onevar": false, + "plusplus": false, + "regexp": false, + "undef": true, + "sub": true, + "strict": false, + "white": false, + "eqnull": true, + "esnext": true, + "unused": true +} diff --git a/uam-web/.travis.yml b/uam-web/.travis.yml new file mode 100644 index 0000000000000000000000000000000000000000..66dd1076931b767dd6c5680bc289d29ea2dd9013 --- /dev/null +++ b/uam-web/.travis.yml @@ -0,0 +1,23 @@ +--- +language: node_js +node_js: + - "0.12" + +sudo: false + +cache: + directories: + - node_modules + +before_install: + - export PATH=/usr/local/phantomjs-2.0.0/bin:$PATH + - "npm config set spin false" + - "npm install -g npm@^2" + +install: + - npm install -g bower + - npm install + - bower install + +script: + - npm test diff --git a/uam-web/.watchmanconfig b/uam-web/.watchmanconfig new file mode 100644 index 0000000000000000000000000000000000000000..e7834e3e4f39c1a745942dfe90891708593e0ea6 --- /dev/null +++ b/uam-web/.watchmanconfig @@ -0,0 +1,3 @@ +{ + "ignore_dirs": ["tmp", "dist"] +} diff --git a/uam-web/README.md b/uam-web/README.md new file mode 100644 index 0000000000000000000000000000000000000000..5f5c0b9cef8039f7ae3e837bd3019a1807dbee16 --- /dev/null +++ b/uam-web/README.md @@ -0,0 +1,53 @@ +# clouduam-web + +This README outlines the details of collaborating on this Ember application. +A short introduction of this app could easily go here. + +## Prerequisites + +You will need the following things properly installed on your computer. + +* [Git](http://git-scm.com/) +* [Node.js](http://nodejs.org/) (with NPM) +* [Bower](http://bower.io/) +* [Ember CLI](http://www.ember-cli.com/) +* [PhantomJS](http://phantomjs.org/) + +## Installation + +* `git clone <repository-url>` this repository +* change into the new directory +* `npm install` +* `bower install` + +## Running / Development + +* `ember server` +* Visit your app at [http://localhost:4200](http://localhost:4200). + +### Code Generators + +Make use of the many generators for code, try `ember help generate` for more details + +### Running Tests + +* `ember test` +* `ember test --server` + +### Building + +* `ember build` (development) +* `ember build --environment production` (production) + +### Deploying + +Specify what it takes to deploy your app. + +## Further Reading / Useful Links + +* [ember.js](http://emberjs.com/) +* [ember-cli](http://www.ember-cli.com/) +* Development Browser Extensions + * [ember inspector for chrome](https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi) + * [ember inspector for firefox](https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/) + diff --git a/uam-web/app/app.js b/uam-web/app/app.js new file mode 100644 index 0000000000000000000000000000000000000000..6fe9508d565e976763b2b0a72b3fb731f9555db5 --- /dev/null +++ b/uam-web/app/app.js @@ -0,0 +1,29 @@ +import Ember from 'ember'; +import Resolver from 'ember/resolver'; +import loadInitializers from 'ember/load-initializers'; +import config from './config/environment'; + +let App; + +Ember.MODEL_FACTORY_INJECTIONS = true; + +App = Ember.Application.extend({ + modulePrefix: config.modulePrefix, + podModulePrefix: config.podModulePrefix, + Resolver +}); + +loadInitializers(App, config.modulePrefix); + +// // 固定设置 +// Ember.$.ajaxSetup({ +// 'headers': { +// 'Accept': '*/*', +// 'Content-Type': 'application/json' +// }, +// cache: false, +// dataType: 'json', +// contentType: 'application/json' +// }); + +export default App; diff --git a/uam-web/app/application/controller.js b/uam-web/app/application/controller.js new file mode 100644 index 0000000000000000000000000000000000000000..a980424dbd1e22469edace4bebe6e8f5c25b42f7 --- /dev/null +++ b/uam-web/app/application/controller.js @@ -0,0 +1,34 @@ +import Ember from 'ember'; +const {set, + get, + inject, + RSVP +} = Ember; + +export default Ember.Controller.extend({ + tenantChange: function() { + var tenant = this.get("model.tenant"); + var oldTenant = window.sessionStorage.getItem("tenant"); + if (tenant !== oldTenant) { + window.sessionStorage.setItem("tenant", tenant); + window.location.reload(); + } + // set(model, 'selPerLength', model.selPers.length); + }.observes('model.tenant'), + actions: { + menuChangeAct: function(url) { + this.transitionToRoute(url); + }, + + logout: function() { + if (window.sessionStorage.getItem('tenant')) { + window.sessionStorage.removeItem("tenant"); + } + this.set('curUser', null); + document.cookie = "LtpaToken2=" + '=0;expires=' + new Date(0).toUTCString()+"; path=/"+"; domain=.gf.com.cn"; + document.cookie = "access-token=" + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT;'; + location.href = "/"; + } + }, + +}); \ No newline at end of file diff --git a/uam-web/app/application/route.js b/uam-web/app/application/route.js new file mode 100644 index 0000000000000000000000000000000000000000..ef08ffc17ca1f171f4f04f46d78a5cd3a5ee129a --- /dev/null +++ b/uam-web/app/application/route.js @@ -0,0 +1,64 @@ +import Ember from 'ember'; +const {set, + get, + inject, + RSVP +} = Ember; +export default Ember.Route.extend({ + apiSrv: inject.service('api/portal-api/service'), + session: inject.service('auth-service/service'), + beforeModel: function() { + if (window.location.hash === '') { + this.transitionTo('dashboard.portalManagement.user'); + } + }, + model: function() { + let promises = {}; + let tenants = this.get('apiSrv').queryTenantList().then(results => results.content); + let user = this.get("session").authInfo().user; + + promises.tenants = tenants; + promises.user = user; + + this.get("apiSrv").isMultiTenant().then(resp => { + window.localStorage.setItem("IS_MULTI_TENANT", resp.content==null?'true':resp.content); + }); + + return Ember.RSVP.hash(promises).then(results => results); + + }, + setupController: function(controller, model) { + var tenant = window.sessionStorage.getItem("tenant"); + //storage里没有取到租户信息,则从当前用户的登录信息里获取 + var authInfo = this.get("session").authInfo(); + model.authInfo = authInfo; + if (Ember.isEmpty(tenant)) { + if (authInfo.authenticated && authInfo.user) { + tenant = authInfo.user.tenantId; + } + } + model.tenant = tenant; + controller.set("model", model); + + let ifTenant= window.localStorage.getItem("IS_MULTI_TENANT"); + model.ifTenant = (ifTenant=='true'); + }, + actions: { + loading(transition) { + //displayLoadingSpinner(); + this.router.one('didTransition', function() { + // hideLoadingSpinner(); + // console.log('loading done'); + }); + // substate implementation when returning `true` + return true; + }, + error(error, transition) { + // Ember.onerror(error); + if (error && error.status === 400) { + return this.transitionTo('error'); + } + return true; + } + } +}); \ No newline at end of file diff --git a/uam-web/app/application/template.hbs b/uam-web/app/application/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..e6d5dd78d7ca770d82ce0e17c053d3d3be9f560c --- /dev/null +++ b/uam-web/app/application/template.hbs @@ -0,0 +1,56 @@ +<div class="application"> + <div class="app-header clearfix"> + <div class="app-header__logo pull-left"> + {{#link-to 'dashboard.portalManagement.user' }}<img src="/img/logo.png" alt=""> {{/link-to}} + </div> + + <div class="app-header__user pull-right"> + {{#if (eq true model.ifTenant)}} + {{#if (eq "default" model.authInfo.user.tenantId)}} + {{#io-select class="io-select-dropdown-menu-item-tenant" value=model.tenant required=true placeholder="切换租户" }} + {{#each model.tenants as |item|}} + {{#io-option value=item.tenantId}}{{item.tenantName}}{{/io-option}} + {{/each}} + {{/io-select}} + &nbsp;&nbsp; + {{/if}} + {{/if}} + + <img src="/img/avatar.png" alt=""> + + {{#if (eq true model.ifTenant)}} + <span ><font color="white">{{model.user.name}} + {{#each model.tenants as |item|}} + {{#if (eq item.tenantId model.authInfo.user.tenantId)}} + - {{item.tenantName}} + {{/if}} + {{/each}} + </font></span> + {{/if}} + + {{#if (eq false model.ifTenant)}} + <span ><font color="white">{{model.user.name}} + </font></span> + {{/if}} + + {{#io-dropdown}} + {{#io-dropdown-trigger}} + {{authSrv.curUser.name}} {{io-icon type="down"}} + {{/io-dropdown-trigger}} + {{#io-dropdown-overlay}} + {{#io-menu}} + {{#io-menu-item onClick="logout"}} 退出 {{/io-menu-item}} + {{/io-menu}} + {{/io-dropdown-overlay}} + {{/io-dropdown}} + {{!-- {{#io-select value=chooseItem required=true onChange="onChange" }} + {{#each options as |idc|}} + {{#io-option value=idc.id}}{{idc.name}}{{/io-option}} + {{/each}} + {{/io-select}} --}} + </div> + </div> + <div class="app-body-wrapper"> + {{outlet}} + </div> +</div> diff --git a/uam-web/app/authenticated/controller.js b/uam-web/app/authenticated/controller.js new file mode 100644 index 0000000000000000000000000000000000000000..cbb50bf9a7aa006bf4f975bca858f093680b8b07 --- /dev/null +++ b/uam-web/app/authenticated/controller.js @@ -0,0 +1,21 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + queryParams: ["token", "redirectTo"], + + initController: function() { + var model = this.get("model"); + var token = model.token; + var redirectTo = model.redirectTo; + + var expireDate = new Date(); + expireDate.setTime(expireDate.getTime() + (18 * 60 * 60 * 1000)); + + document.cookie = "access-token=" + token + ";expires=" + expireDate.toUTCString(); + if(redirectTo == null || redirectTo == "") { + location.href = "/"; + } else { + location.href = redirectTo; + } + } +}); diff --git a/uam-web/app/authenticated/route.js b/uam-web/app/authenticated/route.js new file mode 100644 index 0000000000000000000000000000000000000000..4881fb3f20bde1d21ccd02448c8f6edb86fef200 --- /dev/null +++ b/uam-web/app/authenticated/route.js @@ -0,0 +1,22 @@ +import Ember from 'ember'; + +export default Ember.Route.extend({ + + queryParams: { + token: { + refreshModel: true + }, + redirectTo: { + refreshModel: true + } + }, + + model: function(params) { + return params; + }, + + setupController: function(controller, model) { + controller.set('model', model); + controller.initController(); + } +}); \ No newline at end of file diff --git a/uam-web/app/authenticated/template.hbs b/uam-web/app/authenticated/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..c24cd68950a9a5c52c59d7020c3a30a00adb094d --- /dev/null +++ b/uam-web/app/authenticated/template.hbs @@ -0,0 +1 @@ +{{outlet}} diff --git a/uam-web/app/common/util/uuid.js b/uam-web/app/common/util/uuid.js new file mode 100644 index 0000000000000000000000000000000000000000..c9ad9e8ff252ec866d4b0ecdfb2916e968ef33a2 --- /dev/null +++ b/uam-web/app/common/util/uuid.js @@ -0,0 +1,13 @@ +/** + * Created by zhangrong on 16/3/5. + */ + +// A more compact, but less performant, RFC4122v4 solution: +function uuid() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + }); +} + +export default uuid; diff --git a/uam-web/app/components/.gitkeep b/uam-web/app/components/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/uam-web/app/components/common/io-file-upload/ajax-file-upload.js b/uam-web/app/components/common/io-file-upload/ajax-file-upload.js new file mode 100644 index 0000000000000000000000000000000000000000..66cc675d8ef530fbd12401864851a7f57cb8a3e0 --- /dev/null +++ b/uam-web/app/components/common/io-file-upload/ajax-file-upload.js @@ -0,0 +1,270 @@ +/** + * request + */ +import ajaxRequest from './request'; + +const now = +(new Date()); +let index = 0; + +/** + * [uid description] + * @return {[type]} [description] + */ +function uid() { + return now + '-' + (++index); +} + +const $ = window.$; + +/** + * [request description] + * @param {[type]} options [description] + * @return {[type]} [description] + * + * + * option { + * // form action url + * url: '', + * + * // input file element + * fileElement: Element, + * + * // key-value pairs extra data + * data: {}, + * + * // domain if crosseddomain, default document.domain + * domain: '', + * + * // timeout + * timeout: 100, + * + * // onprogress only support in modern browser + * onProgress: Function, + * + * // succss handler + * onSuccess: Function, + * + * // error handler + * onError: Function + * + * // start handler + * onStart: Function + * } + */ +function request(option) { + option.onStart = option.onStart || nil; + option.onError = option.onError || nil; + option.onSuccess = option.onSuccess || nil; + option.onProgress = option.onProgress || nil; + + const fileElement = option.fileElement; + if (!fileElement) { + return option.onError(getError('Not Find fileElement')); + } + + option.filename = option.filename || $(fileElement).attr('name') || 'file'; + + option.onStart(); + if (window.FormData) { + // console.log('ajax-upload'); + option.action = option.action || option.url; + option.file = fileElement.files[0]; + return ajaxRequest(option); + } + + // console.log('iframe-upload'); + + option = $.extend({}, $.ajaxSettings, option); + const domain = option.domain || document.domain; + const id = uid(); + const $iframe = createIframe(id, domain); + const $form = createUploadForm(id, option, domain); + + let requestDone = false; + + + if (option.timeout > 0) { + setTimeout(()=> { + if (!requestDone) { + uploadCallback("timeout"); + } + }, option.timeout); + } + + try { + if ($form[0].encoding) { + $form.attr('encoding', 'multipart/form-data'); + } else { + $form.attr('enctype', 'multipart/form-data'); + } + $form.submit(); + } catch (e) { + option.onError(e); + } + + $iframe.load(uploadCallback); + + /** + * [uploadCallback description] + * @param {Boolean} isTimeout [description] + * @return {[type]} [description] + */ + function uploadCallback(isTimeout) { + let xhr = {}; + + if (isTimeout === 'timeout') { + xhr.status = 'Error'; + xhr.msg = 'timeout'; + return option.onError(getError(option, xhr)); + } + + const iframe = $iframe[0]; + try { + if (iframe.contentWindow) { + xhr.document = iframe.contentWindow.document; + } else if (iframe.contentDocument) { + xhr.document = iframe.contentDocument.document; + } + } catch (e) { + return option.onError(e); + } + + if (xhr.document) { + requestDone = true; + try { + xhr.response = getUploadHttpData(xhr); + option.onSuccess(xhr.response); + } catch (e) { + option.onError(e); + } + $iframe.unbind(); + setTimeout(()=> { + try { + $form.remove(); + $iframe.remove(); + } catch (e) { + + } + }, 10); + } + } +} + +/** + * [createIframe description] + * @param {[type]} id [description] + * @param {[type]} src [description] + * @return {[type]} [description] + */ +function createIframe(id, domain) { + const iframeId = `IframeUpload-${id}`; + // let src = `javascript:void((function(){ + // var d = document; + // d.open(); + // d.domain='${domain}'; + // d.write(''); + // d.close(); + // })())`; + let iframeHtml = ` + <iframe + id="${iframeId}" + name="${iframeId}" + style="position:fixed; top:-9999px; left:-9999px" + src=""> + </iframe>`; + + const $iframe = $(iframeHtml); + $iframe.appendTo(document.body); + return $iframe; +} + + +/** + * [createUploadForm description] + * @param {[type]} iframeId [description] + * @param {[type]} fileElement [description] + * @param {[type]} data [description] + * @return {[type]} [description] + */ +function createUploadForm(id, option, domain) { + const fileElement = option.fileElement; + const iframeId = `IframeUpload-${id}`; + const formId = `IframeUploadForm-${id}`; + const fileId = `IframeUploadFile-${id}`; + const action = option.action || option.url; + const formHtml = ` + <form + action="${action}" + method="POST" + name="${formId}" + id="${formId}" + enctype="multipart/form-data" + target="${iframeId}" + style="position: absolute; left: -9999px; top: -9999px;"> + </form> + `; + const $form = $(formHtml); + + /** + * data transform into inputs + */ + const data = option.data; + if (data) { + for (let attr in data) { + $(`<input type="hidden" name="${attr}" value="${data[attr]}" />`).appendTo($form); + } + } + + /** + * domain input + */ + $(`<input name="_documentDomain" value="${domain}" />`).appendTo($form); + + /** + * fileElement + * @type {[type]} + */ + const $newFile = $(fileElement).clone(); + $(fileElement).attr('id', fileId); + $(fileElement).before($newFile); + $(fileElement).appendTo($form); + $(fileElement).attr('name', option.filename || $(fileElement).attr('name')); + $form.appendTo('body'); + + return $form; +} + +/** + * [getUploadHttpData description] + * @param {[type]} xml [description] + */ +function getUploadHttpData(xml) { + const doc = xml.document; + const script = doc.getElementsByTagName('script')[0]; + if (script && script.parentNode === doc.body) { + doc.body.removeChild(script); + } + return doc.body ? doc.body.innerText : null; +} + +/** + * [getError description] + * @param {[type]} option [description] + * @param {[type]} msg [description] + * @return {[type]} [description] + */ +function getError(option, xhr) { + const err = new Error(xhr.msg); + err.status = xhr.status; + err.method = 'post'; + err.url = option.action; + return err; +} + +/** + * [nil description] + * @return {[type]} [description] + */ +function nil(){} + +export default request; \ No newline at end of file diff --git a/uam-web/app/components/common/io-file-upload/component.js b/uam-web/app/components/common/io-file-upload/component.js new file mode 100644 index 0000000000000000000000000000000000000000..7ffbf0a30c778fdba92880101a54f735152ade08 --- /dev/null +++ b/uam-web/app/components/common/io-file-upload/component.js @@ -0,0 +1,14 @@ +import Ember from 'ember'; + +export default Ember.Component.extend({ + multiple: true, + showUploadButton: true, + autoUpload: false, + + actions: { + upload: function() { + var files = this.$('.file-uploader')[0].files; + return this.sendAction('upload', files); + } + } +}); \ No newline at end of file diff --git a/uam-web/app/components/common/io-file-upload/request.js b/uam-web/app/components/common/io-file-upload/request.js new file mode 100644 index 0000000000000000000000000000000000000000..55d9182787bf9194252b73ed557f9d36c6a407a9 --- /dev/null +++ b/uam-web/app/components/common/io-file-upload/request.js @@ -0,0 +1,72 @@ +function getError(option, xhr) { + const msg = `cannot post ${option.action} ${xhr.status}'`; + const err = new Error(msg); + err.status = xhr.status; + err.method = 'post'; + err.url = option.action; + return err; +} + +function getBody(xhr) { + const text = xhr.responseText || xhr.response; + if (!text) { + return text; + } + + // try { + // return JSON.parse(text); + // } catch (e) { + return text; + // } +} + +export default function upload(option) { + if (typeof XMLHttpRequest === 'undefined') { + return; + } + + const xhr = new XMLHttpRequest(); + if (xhr.upload) { + xhr.upload.onprogress = function progress(e) { + if (e.total > 0) { + e.percent = e.loaded / e.total * 100; + } + option.onProgress(e); + }; + } + + const formData = new FormData(); + + formData.append(option.filename, option.file); + if (option.data) { + Object.keys(option.data).map(key => { + formData.append(key, option.data[key]); + }); + } + + xhr.onerror = function error(e) { + option.onError(e); + }; + + xhr.onload = function onload() { + if (xhr.status !== 200) { + return option.onError(getError(option, xhr), getBody(xhr)); + } + + option.onSuccess(getBody(xhr)); + }; + + if (option.withCredentials && 'withCredentials' in xhr) { + xhr.withCredentials = true; + } + + xhr.open('post', option.action, true); + xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); + const headers = option.headers || {}; + for (const h in headers) { + if (headers.hasOwnProperty(h)) { + xhr.setRequestHeader(h, headers[h]); + } + } + xhr.send(formData); +} \ No newline at end of file diff --git a/uam-web/app/components/common/io-file-upload/template.hbs b/uam-web/app/components/common/io-file-upload/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..b0d2c12ec827fa866ea52a11d7d54cd263f72cb7 --- /dev/null +++ b/uam-web/app/components/common/io-file-upload/template.hbs @@ -0,0 +1,22 @@ +<form class="form-inline" role="form"> + <div class="form-group"> + {{#if multiple}} + {{#if autoUpload}} + <input type="file" name="files[]" class="file-uploader form-control" {{action 'upload' on='change'}} multiple> + {{else}} + <input type="file" name="files[]" class="file-uploader form-control" multiple> + {{/if}} + {{else}} + {{#if autoUpload}} + <input type="file" name="files[]" class="file-uploader form-control" {{action 'upload' on='change'}}> + {{else}} + <input type="file" name="files[]" class="file-uploader form-control"> + {{/if}} + {{/if}} + </div> + {{#if showUploadButton}} + <button {{action "upload"}} class="btn btn-primary btn-sm"> + {{translate "upload"}} + </button> + {{/if}} +</form> \ No newline at end of file diff --git a/uam-web/app/components/io-loading/template.hbs b/uam-web/app/components/io-loading/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..f5a49403745bd3d403ae3de25e8c25dfdce1fa31 --- /dev/null +++ b/uam-web/app/components/io-loading/template.hbs @@ -0,0 +1,10 @@ +<div class="loading-spin"> + <div class="io-spin io-spin-spining" > + <span class="io-spin-dot io-spin-dot-first" > + </span> + <span class="io-spin-dot io-spin-dot-second" > + </span> + <span class="io-spin-dot io-spin-dot-third" > + </span> + </div> +</div> \ No newline at end of file diff --git a/uam-web/app/components/tool-tips/component.js b/uam-web/app/components/tool-tips/component.js new file mode 100644 index 0000000000000000000000000000000000000000..998a4bc605756d8c22c3dff0f6fea617c7daffd6 --- /dev/null +++ b/uam-web/app/components/tool-tips/component.js @@ -0,0 +1,135 @@ +import Ember from 'ember'; + +/** + * Alert Component + ```html + ``` + */ + +export default Ember.Component.extend({ + /** + * [tagName description] + */ + tagName: 'div', + attributeBindings: ['disabled', 'role'], + classNames: 'io-tooltips', + classNamePrefix: 'io-tooltips-', + classNameBindings: ['typeClass','displayClass','activeClass'], + /** + * @attribute triggerEvent + * @type {String [mosueover | click]} + */ + triggerEvent: 'mouseover', + _hidden: true, + showTips:true, + _style:function(){ + var getStyle=''; + if (!this.get('_hidden')) { + var dw = this.$('.io-tooltips-title').width(); + var dh = this.$('.io-tooltips-title').height(); + var tw = this.$('.io-tooltips-content').width(); + var th = this.$('.io-tooltips-content').height(); + // console.log("dw:"+dw+" dh:"+dh); + var topY = -10-th; + var bottomY = dh+10; + var leftX = -5-tw; + var rightX = dw+20; + + var topLeft = (dw/2-tw-10)/2; + var topCenter = (dw-tw)/2; + var topRight = (dw/2+dw-tw+10)/2; + + var bottomLeft = (dw/2-tw-10)/2; + var bottomCenter = (dw-tw)/2; + var bottomRight = (dw/2+dw-tw+10)/2; + + var leftTop = (dh/2-th-10)/2; + var leftCenter = (dh-th-10)/2; + var leftBottom = (dh/2+dh-th-10)/2; + + var rightTop = (dh/2-th-10)/2; + var rightCenter = (dh-th-10)/2; + var rightBottom = (dh/2+dh-th-10)/2; + + var type=this.get('type'); + + switch (type) { + case 'topLeft': + getStyle="left:"+topLeft+"px;top:"+topY+"px;";break; + case 'top': + getStyle="left:"+topCenter+"px;top:"+topY+"px;";break; + case 'topRight': + getStyle="left:"+topRight+"px;top:"+topY+"px;";break; + case 'rightTop': + getStyle="left:"+rightX+"px;top:"+rightTop+"px;";break; + case 'right': + getStyle="left:"+rightX+"px;top:"+rightCenter+"px;";break; + case 'rightBottom': + getStyle="left:"+rightX+"px;top:"+rightBottom+"px;";break; + case 'bottomRight': + getStyle="left:"+bottomRight+"px;top:"+bottomY+"px;";break; + case 'bottom': + getStyle="left:"+bottomCenter+"px;top:"+bottomY+"px;";break; + case 'bottomLeft': + getStyle="left:"+bottomLeft+"px;top:"+bottomY+"px;";break; + case 'leftBottom': + getStyle="left:"+leftX+"px;top:"+leftBottom+"px;";break; + case 'left': + getStyle="left:"+leftX+"px;top:"+leftCenter+"px;";break; + case 'leftTop': + getStyle="left:"+leftX+"px;top:"+leftTop+"px;";break; + default: + getStyle="left:"+topCenter+"px;top:"+topY+"px;";break; + }; + } + return getStyle; + }.property('_hidden'), + /** + * classNameBindings + * @return {[type]} [description] + */ + typeClass: function() { + return this.get('classNamePrefix') + "placement-" +this.get('type'); + }.property('type'), + displayClass: function() { + if (this.get('_hidden')) { + return this.get('classNamePrefix') + 'hidden'; + } + return ''; + }.property('_hidden'), + activeClass: function() { + if (!this.get('_hidden')) { + return this.get('classNamePrefix') + 'active'; + } else { + return ''; + } + }.property('_hidden'), + /** + * mosueover event description + * @type {[type]} + */ + t: null, + _mouseover: false, + mouseEnter() { + //console.log("悬浮"); + if (this.get('triggerEvent') !== 'mouseover') { + return + } + clearTimeout(this.get('t')); + this.set('_mouseover', true); + this.set('_hidden', false); + this.set('showTips',true); + }, + mouseLeave() { + //console.log("远离"); + if (this.get('triggerEvent') !== 'mouseover') { + return + } + const t = setTimeout(function() { + this.set('_mouseover', false); + this.set('_hidden', true); + this.set('showTips',false); + }.bind(this), 200); + this.set('t', t); + }, +}); \ No newline at end of file diff --git a/uam-web/app/components/tool-tips/template.hbs b/uam-web/app/components/tool-tips/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..5df3925b0d7c8683a5ea29dcb52dbd3932faf008 --- /dev/null +++ b/uam-web/app/components/tool-tips/template.hbs @@ -0,0 +1,5 @@ + <div class="io-tooltips-content" style={{_style}}> + <div class="io-tooltips-arrow"></div> + <div class="io-tooltips-inner">{{tip}}</div> + </div> +<div class="io-tooltips-title">{{yield}}</div> \ No newline at end of file diff --git a/uam-web/app/dashboard/controller.js b/uam-web/app/dashboard/controller.js new file mode 100644 index 0000000000000000000000000000000000000000..aea0b4a88adbbdd755022aebd22d715e86125a1a --- /dev/null +++ b/uam-web/app/dashboard/controller.js @@ -0,0 +1,11 @@ +import Ember from 'ember'; + +export default Ember.Controller.extend({ + activeMenu: "", + actions: { + linkToAction: function(item) { + this.transitionToRoute('dashboard.portalManagement.' + item); + Ember.set(this, 'activeMenu', item); + } + } +}); diff --git a/uam-web/app/dashboard/error/template.hbs b/uam-web/app/dashboard/error/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..c98f939b657cdef01af2ec42bac85f2bf89bb94d --- /dev/null +++ b/uam-web/app/dashboard/error/template.hbs @@ -0,0 +1,7 @@ +<div class="error-message" style="margin: auto; margin-top: 30vh; width: 600px;"> + {{io-alert + message="系统错误,请联系管理员" + description=model.message + type="error" + showIcon=true}} +</div> diff --git a/uam-web/app/dashboard/loading/template.hbs b/uam-web/app/dashboard/loading/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..74308b1c4bd2d70fa21b079cd1cc3703ef822317 --- /dev/null +++ b/uam-web/app/dashboard/loading/template.hbs @@ -0,0 +1,10 @@ +<div class="loading-spin"> + <div class="io-spin io-spin-spining" > + <span class="io-spin-dot io-spin-dot-first" > + </span> + <span class="io-spin-dot io-spin-dot-second" > + </span> + <span class="io-spin-dot io-spin-dot-third" > + </span> + </div> +</div> diff --git a/uam-web/app/dashboard/portal-management/controller.js b/uam-web/app/dashboard/portal-management/controller.js new file mode 100644 index 0000000000000000000000000000000000000000..7ccb1147d2a6713a2a0fbb3d9717b3db7608cda0 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/controller.js @@ -0,0 +1,21 @@ +import Ember from 'ember'; +var set = Ember.set; + +export default Ember.Controller.extend({ + currentItem: "", + + initPortalMenu: function() { + // set(this, 'currentItem', "user"); + }, + + /** + * 事件集合 + * @type {Object} + */ + actions: { + clickItemAction: function(item) { + set(this, 'currentItem', item); + this.transitionToRoute("dashboard.portalManagement." + item); + } + } +}); diff --git a/uam-web/app/dashboard/portal-management/permission/controller.js b/uam-web/app/dashboard/portal-management/permission/controller.js new file mode 100644 index 0000000000000000000000000000000000000000..289b0c0a7fbcf13d4cb686fa8a1c02c8f4b9285d --- /dev/null +++ b/uam-web/app/dashboard/portal-management/permission/controller.js @@ -0,0 +1,2 @@ +import Ember from 'ember'; +export default Ember.Controller.extend({}); diff --git a/uam-web/app/dashboard/portal-management/permission/index/controller.js b/uam-web/app/dashboard/portal-management/permission/index/controller.js new file mode 100644 index 0000000000000000000000000000000000000000..0e62d661dbfb07e497941391380b8f39fdee855d --- /dev/null +++ b/uam-web/app/dashboard/portal-management/permission/index/controller.js @@ -0,0 +1,305 @@ +import Ember from 'ember'; +const {set, + get, + inject, + RSVP +} = Ember; +const operSelect = ['选择权限']; +export default Ember.Controller.extend({ + perSrv: inject.service('api/portal-permission/service'), + commSrv: inject.service('api/portal-common/service'), + apiSrv: inject.service('api/portal-api/service'), + resSrv: inject.service('api/portal-resource/service'), + + loading: false, + multi: [], + + /** + * 初始化权限信息 + * 初始化树结构 + * @return {[type]} [description] + */ + initPermission: function(model) { + var commSrv = get(this, 'commSrv'), + resSrv = get(this, 'resSrv'), + self = this; + + RSVP.hash({ + "resData": resSrv.queryAll().then((res) => { + return res.list; + }), + "allRols": commSrv.getRoleList().then((res) => { + return res.list; + }), + }).then((data) => { + var appIdList = data.resData.mapBy("appId").uniq(); + let roles = self.parseRoleList(data.allRols); + set(model, 'appIdList', appIdList); + set(model, 'resData', data.resData); + set(model, 'operSelect', operSelect); + set(model, 'operId', operSelect[0]); + set(model, 'selectedRole', roles[0]); + set(model, 'roleData', roles); + set(model, 'selPers', []); + if (appIdList.length > 0) { + set(model, 'appId', appIdList[0]); + } + + if (data.allRols.length > 0) { + set(model, 'roleId', data.allRols[0].id); + set(model, 'roleName', data.allRols[0].name); + } + + set(self, 'model', model); + }); + }, + + /** + * 解析角色列表,将角色列表数据结构转换为树形结构 + * @param {[type]} roleList [description] + * @return {[type]} [description] + */ + parseRoleList: function(roleList) { + roleList.forEach((item) => { + set(item, 'title', item.name); + }); + return roleList; + }, + + /** + * 遍历树,加载已经选择的节点信息 + * 为已经选择的节点添加selected=true的属性 + * 同时, + * @param {[type]} children [树的节点list] + * @param {[type]} perData [已经选择的权限信息] + */ + iteatorTree: function(children, perData) { + let self = this, + multi = get(this, 'multi'); + children.forEach(function(item) { + if (perData.contains(item.id)) { + set(item, 'selected', true); + if (multi.indexOf(item) < 0) { + multi.pushObject(item); + } + } + if (item.children && item.children.length > 0) { + self.iteatorTree(item.children, perData); + } + }); + }, + + /** + * 监听操作类型 + * @return {[type]} [description] + */ + selectOper: function() { + let model = get(this, 'model'); + + if (model.operId === operSelect[0]) { + return; + } + this.transitionToRoute('dashboard.portalManagement.permission.reverse'); + }.observes('model.operId'), + + /** + * 监听操作系统名称 + * @return {[type]} [description] + */ + selectedAppId: function() { + var model = get(this, 'model'); + if (model.resData) { + var resTypeData = model.resData.filterBy('appId', model.appId); + var resType = resTypeData.mapBy('code').uniq(); + set(model, 'resTypeData', resTypeData); + if (resType.length > 0) { + set(model, 'resType', resType[0]); + }else{ + set(model, 'resType', ''); + } + } + }.observes('model.appId'), + + /** + * 监听分配对象类型,功能id + * 查询现有的功能与对象的关联信息 + * @return {[type]} [description] + */ + changeTreeData: function() { + var model = get(this, 'model'), + apiSrv = get(this, 'apiSrv'), + perSrv = get(this, 'perSrv'), + self = this; + + if (Ember.isBlank(model.appId)) { + return; + } + + if (Ember.isBlank(model.resType)) { + return; + } + + + set(this, 'loading', true); + // set(model, 'selRes', []); + set(model, 'selPers', []); + + var tenantId = window.sessionStorage.getItem('tenant'); + apiSrv.queryResByResType(model.resType,tenantId).then((res) => { + if (res.status === "success") { + this.set('loading', false); + let treeData = res.content; + set(this, 'multi', []); + set(treeData, 'expanded', true); + set(model, 'resTree', treeData); + + if (Ember.isBlank(model.roleId)) { + return; + } + + var queryResForm = { + authResType: model.resType, + authObjType: "ROLE", + authObjId: model.roleId + }; + + perSrv.queryAuthRes(queryResForm).then((res) => { + if (res.status === "success") { + let perData = res.list.mapBy("authResId"); + self.iteatorTree(model.resTree.children, perData); + } else { + self.transitionToRoute(res.message); + } + }); + + } else { + self.transitionToRoute(res.message); + } + }); + }.observes('model.resType', 'model.roleId'), + + /** + * 监听选择树节点,选择后添加至已经选择的列表当中 + * @return {[type]} [description] + */ + observeSelRes: function() { + let model = get(this, 'model'), + multi = get(this, 'multi'); + + if (multi) { + set(model, 'selPers', []); + //遍历获取已经选择的权限列表信息 + multi.forEach(item => { + if (item.authResId) { + if (!model.selPers.findBy("id", item.authResId)) { + model.selPers.pushObject({ + id: item.authResId, + title: item.authResName + }); + } + } else { + if (item.id && !model.selPers.findBy("id", item.id)) { + model.selPers.pushObject({ + id: item.id, + title: item.title + }); + } + } + }); + } + set(model, 'selPerLength', model.selPers.length); + }.observes('multi.length'), + + /** + * 将树平铺为List返回 + * @param {[type]} children [树的节点list] + */ + treeToList: function(children) { + let list = []; + children.forEach(item => { + if (list.indexOf(item) < 0) { + list.push(item); + } + if (item.children && item.children.length > 0) { + list=list.concat(this.treeToList(item.children)); + } + }); + return list; + }, + + + /** + * 事件集合 + * @type {Object} + */ + actions: { + selectResType: function(resType) { + var model = get(this, 'model'); + set(model, 'resType', resType); + }, + + /** + * 删除已经选择的权限信息 + * @param {[type]} per [description] + * @return {[type]} [description] + */ + removePermission: function(per) { + let model = get(this, 'model'); + model.selPers.removeObject(per); + if (model.selRes.findBy('authResId', per.id)) { + set(model.selRes.findBy('authResId', per.id), 'selected', false); + } + + if (model.selRes.findBy('id', per.id)) { + set(model.selRes.findBy('id', per.id), 'selected', false); + } + }, + + selRoleAction: function(param) { + let model = get(this, 'model'); + if (!param.id) { + swal("角色信息为空,请确认"); + return; + } + set(model, 'roleId', param.id); + set(model, 'roleName', param.title); + }, + + savePermissionAction: function() { + let model = get(this, 'model'), + perSrv = get(this, 'perSrv'), + self = this; + + if (Ember.isBlank(model.roleId)) { + swal("角色信息为空,请确认"); + return; + } + + let resTree = get(model,'resTree'), + operList = self.treeToList(resTree.children); + + let commitData = []; + operList.forEach(item => { + if (item.id) { + let perInfo = { + authResType: model.resType, + authResId: item.id, + authResName: item.title, + authObjType: "ROLE", + authObjId: model.roleId, + operType: item.selected ? 'I' : 'D' + }; + commitData.pushObject(perInfo); + } + }); + perSrv.saveAuthRes(JSON.stringify(commitData)).then(function(data) { + if ("success" === data.status) { + swal("保存成功!"); + } else { + swal(data.message); + } + + }); + }, + } +}); \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/permission/index/route.js b/uam-web/app/dashboard/portal-management/permission/index/route.js new file mode 100644 index 0000000000000000000000000000000000000000..886aec8d1cacbee11f70ea0bfc63e6e225c82dd0 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/permission/index/route.js @@ -0,0 +1,10 @@ +import Ember from 'ember'; + +export default Ember.Route.extend({ + model: function() { + return Ember.RSVP.hash({}); + }, + setupController: function(controller, model) { + controller.initPermission(model); + } +}); diff --git a/uam-web/app/dashboard/portal-management/permission/index/template.hbs b/uam-web/app/dashboard/portal-management/permission/index/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..4e400de0686cb7ec276385b561573d71a1287e06 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/permission/index/template.hbs @@ -0,0 +1,99 @@ +<div class="inner-app"> + <div class="inner-app__context-bar context-bar"> + <span class="context-bar-nav-header"> + <span class="context-bar__icon"> + <i class="idcicon idcicon-permissiondistribution"></i> 权限资源分配 + </span> + <span class="context-bar-icon pull-right"> + {{#io-select value=model.operId width=90 required=true placeholder="请选择" }} + {{#each model.operSelect as |idc|}} + {{#io-option value=idc}}{{idc}}{{/io-option}} + {{/each}} + {{/io-select}} + </span> + + </span> + <span class="total-icons"> + <i class="point point-primary"></i><i class="idcicon idcicon-permissionmanager"></i> 权限信息 (当前角色-{{model.roleName}}) + </span> + </div> + <div class="inner-app__nav"> + <div class="row"> + <span class="context-bar__icon"> + <i class="idcicon idcicon-rolemanager"></i> 角色信息 + </span> + <hr> + {{#if model.roleData}} + {{io-tree + model=model.roleData + treeNodeIcon='idcicon idcicon-rolemanager' + treeNodeTemplate='partial/tree-node-with-icon' + selected=model.selectedRole + onSelectNode='selRoleAction'}} + {{/if}} + </div> + </div> + <div class="inner-app__main" style="padding: 20px;"> + <div class="row inline-search"> + <div style="display:inline-block;"> + <label for="">系统名称:</label> + {{#io-select value=model.appId required=true placeholder="请选择" width=150}} + {{#each model.appIdList as |idc|}} + {{#io-option value=idc}}{{idc}}{{/io-option}} + {{/each}} + {{/io-select}} + </div> + <div style="display:inline-block;margin-left:20px;"> + <label for="">权限资源类型:</label> + {{#io-select value=model.resType required=true placeholder="请选择" width=200}} + {{#each model.resTypeData as |idc|}} + {{#io-option value=idc.code}}{{idc.name}}{{/io-option}} + {{/each}} + {{/io-select}} + </div> + </div> + {{#if loading}} + {{io-loading}} + {{else}} + {{#if model.resTree}} + <br> + <div class="selectbox"> + <div class="selectbox__menu col-sm-6"> + {{io-tree + model=model.resTree + in-multi-selection=true + multi-selection=multi + selected=selected}} + {{!-- multi-selection=model.selRes --}} + + </div> + <div class="selectbox__content col-sm-18"> + <div class="row"> + <h3>已选择权限 -- {{model.selPerLength}}个:</h3> + <p> + {{#each model.selPers as | per|}} + <span class="io-tag"> + {{#if per.title}} + <span class="io-tag-text">{{per.title}}</span> + {{else}} + <span class="io-tag-text">{{per.authResName}}</span> + {{/if}} + <i {{action "removePermission" per}} class="ioicon ioicon-cross"></i> + </span> + {{/each}} + </p> + </div> + <hr> + <div class="row selectbox__content__footer"> + {{#io-button type="primary" onClick="savePermissionAction" class="pull-right"}} {{io-icon type="save"}}保存 {{/io-button}} + </div> + </div> + </div> + {{else}} + <p class="empty"> + 没有任何数据,请选择过滤条件 + </p> + {{/if}} + {{/if}} + </div> +</div> \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/permission/reverse/controller.js b/uam-web/app/dashboard/portal-management/permission/reverse/controller.js new file mode 100644 index 0000000000000000000000000000000000000000..2b2904d2ffd9a96224a02b0c54697bba6fa92198 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/permission/reverse/controller.js @@ -0,0 +1,300 @@ +import Ember from 'ember'; +const {set, + get, + inject, + RSVP +} = Ember; +const operSelect = ['选择权限', '选择角色']; +export default Ember.Controller.extend({ + perSrv: inject.service('api/portal-permission/service'), + commSrv: inject.service('api/portal-common/service'), + apiSrv: inject.service('api/portal-api/service'), + resSrv: inject.service('api/portal-resource/service'), + + loading: false, + /** + * 初始化权限信息 + * 初始化树结构 + * @return {[type]} [description] + */ + initPermission: function(model) { + var commSrv = get(this, 'commSrv'), + resSrv = get(this, 'resSrv'), + self = this; + + RSVP.hash({ + "resData": resSrv.queryAll().then((res) => { + return res.list; + }), + "allRols": commSrv.getRoleList().then((res) => { + return res.list; + }), + }).then((data) => { + var appIdList = data.resData.mapBy("appId").uniq(); + + set(model, 'appIdList', appIdList); + set(model, 'resData', data.resData); + set(model, 'operSelect', operSelect); + set(model, 'operId', operSelect[1]); + set(model, 'roleData', self.parseRoleList(data.allRols)); + set(model, 'appId', appIdList[0]); + set(model, 'perId', ""); + set(model, 'selPers', []); //// 已经选择的数据集合,obj数组 + set(model, 'selRes', []); //// 勾选的数据集合 + set(model, 'bakRes', []); //// 备份的角色权限,只有id,用于selRes的比对 + set(self, 'model', model); + }); + }, + + /** + * 监听分配对象类型,功能id + * 查询现有的功能与对象的关联信息 + * @return {[type]} [description] + */ + observePerTree: function() { + var model = get(this, 'model'), + apiSrv = get(this, 'apiSrv'), + self = this; + + if (Ember.isBlank(model.appId)) { + return; + } + + if (Ember.isBlank(model.resType)) { + return; + } + + set(this, 'loading', true); + + var tenantId = window.sessionStorage.getItem('tenant'); + apiSrv.queryResByResType(model.resType,tenantId).then((res) => { + if (res.status === "success") { + this.set('loading', false); + //////// 获取权限树数据,并展开一级 + let treeData = res.content; + treeData.expanded = true; + set(model, 'resTree', treeData); + } else { + self.transitionToRoute(res.message); + } + }); + }.observes('model.resType'), + + + /** + * 监听权限id,查询角色权限的关系数据信息 + * @return {[type]} [description] + */ + obserPerId: function() { + let model = get(this, 'model'), + perId = model.perId, + perSrv = get(this, 'perSrv'), + self = this; + + if (Ember.isBlank(perId)) { + return; + } + + let queryForm = { + authResId: perId, + authResType: model.resType, + authObjType: "ROLE" + }; + + perSrv.queryAuthObj(queryForm).then(function(res) { + if ("success" === res.status) { + let perData = res.list.mapBy("authObjId"); + /////// 添加备份信息 + set(model, 'bakRes', perData); + // 修改roleData的状态,添加selected=true + self.iteratorTree(model.roleData, perData); + + } else { + swal("查询角色权限数据信息失败", res.message); + } + }); + }.observes('model.perId'), + + /** + * 解析角色列表,将角色列表数据结构转换为树形结构 + * @param {[type]} roleList [description] + * @return {[type]} [description] + */ + parseRoleList: function(roleList) { + roleList.forEach(item => { + set(item, 'title', item.name); + }); + return roleList; + }, + + /** + * 监听操作类型 + * @return {[type]} [description] + */ + obserOper: function() { + let model = get(this, 'model'); + + if (model.operId === operSelect[1]) { + return; + } + this.transitionToRoute('dashboard.portalManagement.permission'); + }.observes('model.operId'), + + /** + * 监听操作系统名称 + * @return {[type]} [description] + */ + selectedAppId: function() { + var model = get(this, 'model'); + var resTypeData = model.resData.filterBy('appId', model.appId); + set(model, 'resTypeData', resTypeData); + + var resType = resTypeData.mapBy('code').uniq(); + if (resType.length > 0) { + set(model, 'resType', resType[0]); + }else{ + set(model, 'resType', ''); + } + + }.observes('model.appId'), + + + iteratorTree: function(roleData, perData) { + let model = get(this, 'model'); + + roleData.forEach(item => { + if (perData.contains(item.id)) { + set(item, 'selected', true); + if (!model.selPers.findBy("id", item.id)) { + model.selRes.pushObject(item); + } + } else { + set(item, 'selected', false); + } + }); + }, + + /** + * 监听选择树节点,选择后添加至已经选择的列表当中 + * @return {[type]} [description] + */ + observeSelRes: function() { + let model = get(this, 'model'); + + set(model, 'selPers', []); + if (model.selRes) { + model.selRes.forEach(item => { + if (item.id && !model.selPers.findBy("id", item.id)) { + model.selPers.pushObject({ + id: item.id, + title: item.title + }); + } + }); + } + + set(model, 'selPersLength', model.selPers.length); + }.observes('model.selRes.length'), + + + /** + * 事件集合 + * @type {Object} + */ + actions: { + selectResType: function(resType) { + var model = get(this, 'model'); + set(model, 'resType', resType); + }, + + /** + * 删除已经选择的权限信息 + * @param {[type]} per [description] + * @return {[type]} [description] + */ + removePermission: function(per) { + let model = get(this, 'model'); + model.selPers.removeObject(per); + let node = model.selRes.findBy('id', per.id); + + set(node, 'selected', false); + model.selRes.removeObject(node); + }, + + selPerAction: function(param) { + let model = get(this, 'model'); + if (!param.id) { + swal("权限id为空,请确认"); + return; + } + set(model, 'perId', param.id); + set(model, 'perName', param.title); + }, + + + selRoleAction: function(param) { + let model = get(this, 'model'); + if (!param.id) { + swal("权限id为空,请确认"); + return; + } + set(model, 'perId', param.id); + set(model, 'perName', param.title); + }, + + savePermissionAction: function() { + var model = get(this, 'model'), + bakRes = get(model, 'bakRes'), + perSrv = get(this, 'perSrv'); + + if (Ember.isBlank(model.perId)) { + swal("当前权限信息为空,请确认"); + return; + } + + var selPers = Ember.copy(model.selPers); + + selPers.forEach(item => { + if (bakRes.contains(item.id)) { + bakRes.removeAt(bakRes.indexOf(item.id)); + } else { + set(item, 'operType', "I"); + } + }); + + bakRes.forEach(item => { + let perInfo = { + id: item, + operType: "D" + }; + selPers.pushObject(perInfo); + }); + + + let commitData = []; + selPers.forEach(item => { + if (item.id) { + let perInfo = { + authResType: model.resType, + authResId: model.perId, + authResName: model.perName, + authObjType: "ROLE", + authObjId: item.id, + operType: item.operType + }; + commitData.pushObject(perInfo); + } + }); + + perSrv.saveAuthRes(JSON.stringify(commitData)).then(function(data) { + if ("success" === data.status) { + swal("保存成功!"); + set(model, 'bakRes', model.selPers.mapBy("id")); + } else { + swal(data.message); + } + + }); + }, + } +}); diff --git a/uam-web/app/dashboard/portal-management/permission/reverse/route.js b/uam-web/app/dashboard/portal-management/permission/reverse/route.js new file mode 100644 index 0000000000000000000000000000000000000000..886aec8d1cacbee11f70ea0bfc63e6e225c82dd0 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/permission/reverse/route.js @@ -0,0 +1,10 @@ +import Ember from 'ember'; + +export default Ember.Route.extend({ + model: function() { + return Ember.RSVP.hash({}); + }, + setupController: function(controller, model) { + controller.initPermission(model); + } +}); diff --git a/uam-web/app/dashboard/portal-management/permission/reverse/template.hbs b/uam-web/app/dashboard/portal-management/permission/reverse/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..e8dc6f6b6c8fd110d20fff849257c0ff3902aad5 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/permission/reverse/template.hbs @@ -0,0 +1,98 @@ +<div class="inner-app"> + <div class="inner-app__context-bar context-bar"> + <span class="context-bar-nav-header"> + <span class="context-bar__icon"> + <i class="idcicon idcicon-permissiondistribution"></i> 权限资源分配 + </span> + <span class="context-bar-icon pull-right"> + {{#io-select value=model.operId width=90 required=true placeholder="请选择" }} + {{#each model.operSelect as |idc|}} + {{#io-option value=idc}}{{idc}}{{/io-option}} + {{/each}} + {{/io-select}} + </span> + </span> + <span class="total-icons"> + <i class="point point-primary"></i><i class="idcicon idcicon-rolemanager"></i> 角色信息 (当前权限-{{model.perName}}) + </span> + </div> + <div class="inner-app__nav"> + <div class="row"> + <div> + <span class="context-bar__icon"> + <i class="idcicon idcicon-permissionmanager"></i> 权限信息 + </span> + </div> + <br> + <div class="row" style="margin-bottom: 4px;"> + <label for="">系统名称:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</label> + {{#io-select value=model.appId required=true placeholder="请选择" width=200 }} + {{#each model.appIdList as |idc|}} + {{#io-option value=idc}}{{idc}}{{/io-option}} + {{/each}} + {{/io-select}} + </div> + <div class="row"> + <label for="">权限资源类型:</label> + {{#io-select value=model.resType required=true placeholder="请选择" width=200}} + {{#each model.resTypeData as |idc|}} + {{#io-option value=idc.code}}{{idc.name}}{{/io-option}} + {{/each}} + {{/io-select}} + </div> + <br> + <hr> + {{#if loading}} + {{io-loading}} + {{else}} + {{#if model.resTree}} + <br> + {{io-tree + model=model.resTree + selected=selected + onSelectNode='selPerAction'}} + {{else}} + <p class="empty"> + 没有任何数据,请选择过滤条件 + </p> + {{/if}} + {{/if}} + </div> + </div> + <div class="inner-app__main" style="padding: 20px;"> + <div class="selectbox"> + <div class="selectbox__menu col-sm-6"> + {{#if model.roleData}} + {{io-tree + model=model.roleData + in-multi-selection=true + multi-selection=model.selRes + treeNodeIcon='idcicon idcicon-rolemanager' + treeNodeTemplate='partial/tree-node-with-icon' + }} + {{/if}} + </div> + <div class="selectbox__content col-sm-18"> + <div class="row"> + <h3>已选择角色 -- {{model.selPersLength}}个:</h3> + <p> + {{#each model.selPers as | per|}} + <span class="io-tag"> + {{#if per.title}} + <span class="io-tag-text">{{per.title}}</span> + {{else}} + <span class="io-tag-text">{{per.name}}</span> + {{/if}} + <i {{action "removePermission" per}} class="ioicon ioicon-cross"></i> + </span> + {{/each}} + </p> + </div> + <hr> + <div class="row selectbox__content__footer"> + {{#io-button type="primary" onClick="savePermissionAction" class="pull-right"}} {{io-icon type="save"}}保存 {{/io-button}} + </div> + </div> + </div> + </div> +</div> \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/permission/route.js b/uam-web/app/dashboard/portal-management/permission/route.js new file mode 100644 index 0000000000000000000000000000000000000000..096e3c59cfb348cb6c3831228905e6edddac4555 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/permission/route.js @@ -0,0 +1,3 @@ +import Ember from 'ember'; + +export default Ember.Route.extend({}); diff --git a/uam-web/app/dashboard/portal-management/permission/template.hbs b/uam-web/app/dashboard/portal-management/permission/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..e2147cab02d61b24bccf33f448609ff7bf5ad470 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/permission/template.hbs @@ -0,0 +1 @@ +{{outlet}} \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/resource/controller.js b/uam-web/app/dashboard/portal-management/resource/controller.js new file mode 100644 index 0000000000000000000000000000000000000000..289b0c0a7fbcf13d4cb686fa8a1c02c8f4b9285d --- /dev/null +++ b/uam-web/app/dashboard/portal-management/resource/controller.js @@ -0,0 +1,2 @@ +import Ember from 'ember'; +export default Ember.Controller.extend({}); diff --git a/uam-web/app/dashboard/portal-management/resource/index/controller.js b/uam-web/app/dashboard/portal-management/resource/index/controller.js new file mode 100644 index 0000000000000000000000000000000000000000..ea3f777c847317c48bdeb40e777cc5453fef3ef0 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/resource/index/controller.js @@ -0,0 +1,124 @@ +import Ember from 'ember'; +const {set, get, inject } = Ember; +export default Ember.Controller.extend({ + portalResSrv: inject.service('api/portal-resource/service'), + + /** + * 初始化resInfo主页面 + * @param {[type]} currentPage [description] + * @return {[type]} [description] + */ + initResource: function(model) { + var portalResSrv = get(this, 'portalResSrv'); + this.set('loading', true); + portalResSrv.queryAll().then((res) => { + this.set('loading', false); + set(model, 'data', res.list); + }); + }, + /** + * [loading description] + * @type {Boolean} + */ + loading: false, + /** + * [filterString description] + * @type {String} + */ + filterString: '', + + /** + * 事件集合 + * @type {Object} + */ + actions: { + + showModelAction: function(resInfo) { + let id = ""; + if (resInfo) { + id = resInfo.code; + } + this.transitionToRoute('dashboard.portalManagement.resource.operate', id); + }, + + lookUpAction: function(resInfo) { + if (Ember.isBlank(resInfo.code)) { + swal("权限资源编码为空,请确认"); + return; + } + this.transitionToRoute('dashboard.portalManagement.resource.view', resInfo.code); + }, + + /** + * 对角色进行操作包括新增,删除,分配用户,分配用户组等 + * @param {[type]} actionType [description] + * @param {[type]} resInfo [description] + * @return {[type]} [description] + */ + saveResAction: function() { + var model = get(this, 'model'), + resForm = get(this, 'resForm'), + portalResSrv = get(this, 'portalResSrv'), + self = this; + + if (resForm.id) { + portalResSrv.update(resForm.id, resForm).then((res) => { + if (res.status === "success") { + swal("修改成功!"); + self.send('toggleModal', 'AddShowing'); + self.initResource(model); + } else { + swal(res.message); + } + }); + } else { + portalResSrv.create(resForm).then((res) => { + if (res.status === "success") { + swal("保存成功!"); + self.send('toggleModal', 'AddShowing'); + self.initResource(model); + } else { + swal(res.message); + } + }); + } + }, + + /** + * 删除角色信息,同时刷新角色列表 + * @param {[type]} resInfo [description] + * @return {[type]} [description] + */ + deleteResAction: function(resInfo) { + var id = resInfo.id, + model = get(this, 'model'), + self = this, + portalResSrv = get(this, 'portalResSrv'); + + if (Ember.isBlank(id)) { + swal("权限资源编码不能为空,请确认!"); + return; + } + swal({ + title: "是否删除此权限资源?", + type: "warning", + showCancelButton: true, + confirmButtonClass: "btn-danger", + cancelButtonText: "取消", + confirmButtonText: "删除", + closeOnConfirm: false + }, function(isConfirm) { + if (isConfirm) { + portalResSrv.delete(id).then(function(data) { + if ("success" === data.status) { + swal.close(); + self.initResource(model); + } else { + swal(data.message); + } + }); + } + }); + } + } +}); diff --git a/uam-web/app/dashboard/portal-management/resource/index/route.js b/uam-web/app/dashboard/portal-management/resource/index/route.js new file mode 100644 index 0000000000000000000000000000000000000000..9269e6d5948b3c2aec9ab7e0a5538aaf16cfdb49 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/resource/index/route.js @@ -0,0 +1,31 @@ +import Ember from 'ember'; + +export default Ember.Route.extend({ + model: function() { + var columns = [{ + "propertyName": "name", + "title": "名称", + "template": "partial/lookUp" + }, { + "propertyName": "code", + "title": "编码" + }, { + "propertyName": "url", + "title": "URL" + }, { + "propertyName": "appId", + "title": "系统名称" + }, { + "title": "操作", + "template": "partial/resOper" + }]; + return Ember.RSVP.hash({ + columns: columns, + indexNumber: 1 + }); + }, + setupController: function(controller, model) { + controller.initResource(model); + controller.set('model', model); + } +}); \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/resource/index/template.hbs b/uam-web/app/dashboard/portal-management/resource/index/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..7ac55c5b80d01e02d2ede9d994344c4e788fa602 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/resource/index/template.hbs @@ -0,0 +1,36 @@ +<div class="inner-app"> + <div class="col-md-24 inner-app__context-bar"> + <span class="context-bar-nav-header no-shadow"> + <span class="context-bar__icon"> + <i class="idcicon idcicon-permissionmanager"></i> 权限资源管理 + </span> + </span> + <span class="context-bar__right-button-group pull-right"> + <span class="input-group search"> + {{input type="text" value=filterString placeholder="请输入搜索内容"}} + {{io-icon type="search"}} + </span> + <button class="io-btn io-btn-primary" {{action "showModelAction"}}>{{io-icon type="plus"}} 新建权限资源</button> + </span> + </div> + <div class="inner-app__main collapsed"> + {{#if model.columns}} + {{io-table + columns=model.columns + showIndexNumber=true + showGlobalFilter=false + filterString=filterString + indexNumberBase=model.indexNumber + update="showModelAction" + delete="deleteResAction" + lookUpAction="lookUpAction" + pageSize=100000 + data=model.data}} + {{/if}} + {{#if model.data}} + <div class="row"> + {{io-pagination change="pageClick" count=model.meta.pages current=model.meta.offset}} + </div> + {{/if}} + </div> +</div> \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/resource/operate/controller.js b/uam-web/app/dashboard/portal-management/resource/operate/controller.js new file mode 100644 index 0000000000000000000000000000000000000000..d3b0ee7207fa87edacbe7e885796dcb5ca11d47e --- /dev/null +++ b/uam-web/app/dashboard/portal-management/resource/operate/controller.js @@ -0,0 +1,72 @@ +import Ember from 'ember'; +const {set, get, inject } = Ember; +export default Ember.Controller.extend({ + resSrv: inject.service('api/portal-resource/service'), + + + initPerRes: function(model) { + var resId = model.id, + resSrv = get(this, 'resSrv'), + self = this; + + //若id为空,说明为新增,初始化所用的用户组和角色信息 + if (Ember.isBlank(resId)) { + set(this, 'resForm', { + name: "", + code: "", + dataSource: "", + remark: "", + }); + } else { + resSrv.queryByCode(resId).then(function(data) { + if (data.status === "success") { + set(self, 'resForm', data.item); + } else { + swal(data.message); + } + }); + } + }, + + actions: { + /** + * 返回链接 + * @return {[type]} [description] + */ + backPerResAction: function() { + this.transitionToRoute('dashboard.portalManagement.resource.index'); + }, + + /** + * 保存用户操作 + * @param {[type]} resForm [description] + * @return {[type]} [description] + */ + saveResAction: function() { + var resSrv = get(this, 'resSrv'), + resForm = get(this, 'resForm'), + self = this, + resId = resForm.id; + + if (Ember.isBlank(resId)) { + resSrv.create(resForm).then(function(data) { + if (data.status === "success") { + swal("新建权限资源" + resForm.name + "成功!"); + self.send('backPerResAction'); + } else { + swal(data.message); + } + }); + } else { + resSrv.update(resId, resForm).then(function(data) { + if (data.status === "success") { + swal("修改权限资源" + resForm.name + "成功!"); + self.send('backPerResAction'); + } else { + swal(dta.message); + } + }); + } + } + } +}); diff --git a/uam-web/app/dashboard/portal-management/resource/operate/route.js b/uam-web/app/dashboard/portal-management/resource/operate/route.js new file mode 100644 index 0000000000000000000000000000000000000000..ea8bfe3cd5ca118ca3daa487ff623c464dc9b50a --- /dev/null +++ b/uam-web/app/dashboard/portal-management/resource/operate/route.js @@ -0,0 +1,10 @@ +import Ember from 'ember'; +export default Ember.Route.extend({ + + model: function(params) { + return params; + }, + setupController: function(controller, model) { + controller.initPerRes(model); + } +}); diff --git a/uam-web/app/dashboard/portal-management/resource/operate/template.hbs b/uam-web/app/dashboard/portal-management/resource/operate/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..e845478492a849b8b154b7e27d0e3b9f15839be0 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/resource/operate/template.hbs @@ -0,0 +1,52 @@ +<div class="inner-app"> + <div class="inner-app__context-bar context-bar"> + <span class="h4 context-bar__icon" style="margin-left: 15px;"> + {{#link-to "dashboard.portalManagement.resource"}}<i class="ioicon ioicon-left"></i> 权限资源管理&nbsp; {{/link-to}} / {{#if resForm.name}} {{resForm.name}}{{else}}新建权限资源{{/if}} + </span> + </div> + <div class="inner-app__main collapsed"> + <div class="row" style="padding: 20px;"> + {{#io-form submitForm="saveResAction" class="panel form-horizontal" }} + <div class="panel-body row"style="width:800px; margin:auto;"> + <div class="form-group"> + <label class="col-md-8 control-label required" for="textinput">权限资源编码:</label> + <div class="col-md-16"> + {{input class="form-control input-md" value = resForm.code type="text" required=true }} + </div> + </div> + <div class="form-group"> + <label class="col-md-8 control-label required" for="textinput">权限资源名称:</label> + <div class="col-md-16"> + {{input class="form-control input-md" value = resForm.name type="text" required=true }} + </div> + </div> + <div class="form-group"> + <label class="col-md-8 control-label required" for="textinput">权限资源URL:</label> + <div class="col-md-16"> + {{input class="form-control input-md" value = resForm.url type="text" required=true }} + </div> + </div> + <div class="form-group"> + <label class="col-md-8 control-label required" for="textinput">系统名称(appId):</label> + <div class="col-md-16"> + {{#if resForm.id}} + {{input class="form-control input-md" value = resForm.appId type="text" required=true readonly=true}} + {{else}} + {{input class="form-control input-md" value = resForm.appId type="text" required=true}} + {{/if}} + </div> + </div> + <div class="form-group"> + <label class="col-md-8 control-label required" for="textinput">权限资源备注:</label> + <div class="col-md-16"> + {{textarea class="form-control input-md" value = resForm.remark type="text" required=true }} + </div> + </div> + <div class="row "style="text-align:center"> + <button type="submit" class="io-btn io-btn-primary" >{{io-icon type="save"}}保存</button> + </div> + </div> + {{/io-form}} + </div> + </div> +</div> \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/resource/route.js b/uam-web/app/dashboard/portal-management/resource/route.js new file mode 100644 index 0000000000000000000000000000000000000000..26d9f3124ec6aa902b1a208b6d4cbfb62083a3ea --- /dev/null +++ b/uam-web/app/dashboard/portal-management/resource/route.js @@ -0,0 +1,4 @@ +import Ember from 'ember'; + +export default Ember.Route.extend({ +}); diff --git a/uam-web/app/dashboard/portal-management/resource/template.hbs b/uam-web/app/dashboard/portal-management/resource/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..c24cd68950a9a5c52c59d7020c3a30a00adb094d --- /dev/null +++ b/uam-web/app/dashboard/portal-management/resource/template.hbs @@ -0,0 +1 @@ +{{outlet}} diff --git a/uam-web/app/dashboard/portal-management/resource/view/controller.js b/uam-web/app/dashboard/portal-management/resource/view/controller.js new file mode 100644 index 0000000000000000000000000000000000000000..12fbf519d99ca3056dfc46e1a6ff11a62709ff98 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/resource/view/controller.js @@ -0,0 +1,25 @@ +import Ember from 'ember'; +const {set, get, inject } = Ember; +export default Ember.Controller.extend({ + resSrv: inject.service('api/portal-resource/service'), + + initPerRes: function(model) { + let resSrv = get(this, 'resSrv'), + self = this; + + if (Ember.isBlank(model.id)) { + swal("权限资源id为空,请确认"); + return; + } + + resSrv.queryByCode(model.id).then(res => { + if ("success" === res.status) { + set(self, 'resForm', res.item); + set(model, 'readOnly', true); + set(self, 'model', model); + } else { + swal("查询权限资源信息失败", res.message); + } + }); + } +}); diff --git a/uam-web/app/dashboard/portal-management/resource/view/route.js b/uam-web/app/dashboard/portal-management/resource/view/route.js new file mode 100644 index 0000000000000000000000000000000000000000..ea8bfe3cd5ca118ca3daa487ff623c464dc9b50a --- /dev/null +++ b/uam-web/app/dashboard/portal-management/resource/view/route.js @@ -0,0 +1,10 @@ +import Ember from 'ember'; +export default Ember.Route.extend({ + + model: function(params) { + return params; + }, + setupController: function(controller, model) { + controller.initPerRes(model); + } +}); diff --git a/uam-web/app/dashboard/portal-management/resource/view/template.hbs b/uam-web/app/dashboard/portal-management/resource/view/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..5aaa492f847caddd60c0585f9c946c274085299e --- /dev/null +++ b/uam-web/app/dashboard/portal-management/resource/view/template.hbs @@ -0,0 +1,32 @@ +<div class="inner-app"> + <div class="inner-app__context-bar context-bar"> + <span class="h4 context-bar__icon" style="margin-left: 15px;"> + {{#link-to "dashboard.portalManagement.resource"}}<i class="ioicon ioicon-left"></i> 权限资源管理&nbsp; {{/link-to}} / {{#if roleForm.name}} {{roleForm.name}}{{else}}{{resForm.name}}{{/if}} + </span> + </div> + <div class="inner-app__main collapsed"> + <div class="row" style="padding: 20px;"> + {{#if resForm}} + {{#io-form submitForm="saveResAction" class="panel form-horizontal" readonly=model.readOnly}} + <div class="panel-body row"style="width:800px; margin:auto;"> + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="权限资源编码:" }} + {{io-input value=resForm.code type="text" data-error="请填写应用名称" }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="权限资源名称:" }} + {{io-input value=resForm.name type="text" data-error="请填写应用名称" }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="权限资源URL:" }} + {{io-input value=resForm.url type="text" data-error="请填写应用名称" }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="系统名称(appId):" }} + {{io-input value=resForm.appId type="text" data-error="请填写应用名称" }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="权限资源备注:" }} + {{io-textarea style="font-size:10px" value=resForm.remark rows="6"}} + {{/io-form-group}} + </div> + {{/io-form}} + {{/if}} + </div> + </div> +</div> \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/role/controller.js b/uam-web/app/dashboard/portal-management/role/controller.js new file mode 100644 index 0000000000000000000000000000000000000000..289b0c0a7fbcf13d4cb686fa8a1c02c8f4b9285d --- /dev/null +++ b/uam-web/app/dashboard/portal-management/role/controller.js @@ -0,0 +1,2 @@ +import Ember from 'ember'; +export default Ember.Controller.extend({}); diff --git a/uam-web/app/dashboard/portal-management/role/index/controller.js b/uam-web/app/dashboard/portal-management/role/index/controller.js new file mode 100644 index 0000000000000000000000000000000000000000..4f607f132117db65513d5cad91bd8974a18f8a12 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/role/index/controller.js @@ -0,0 +1,142 @@ +import Ember from 'ember'; +const {set, get, inject } = Ember; +const pageSize = 10; +export default Ember.Controller.extend({ + portalRoleSrv: inject.service('api/portal-role/service'), + queryForm: { + name: "", + }, + + /** + * 查询form里面name的监听事件 + */ + queryByName: function() { + this.initRole(); + }.observes('queryForm.name'), + + queryRoleByPage: function(offset, queryForm) { + var portalRoleSrv = get(this, 'portalRoleSrv'), + model = get(this, 'model'); + + set(model, 'paginationShow', false); + this.set('loading', true); + portalRoleSrv.queryByPage(offset, pageSize, queryForm).then((data) => { + this.set('loading', false); + set(model, 'data', data.list); + set(model, 'meta', data.meta); + if (data.meta.pages > 1) { + set(model, 'paginationShow', true); + } + }); + + }, + + /** + * 初始化role主页面 + * @param {[type]} currentPage [description] + * @return {[type]} [description] + */ + initRole: function(model) { + set(model, 'indexNumber', 1); + set(model, 'pageNo', 1); + set(model, 'paginationShow', false); + set(this, 'model', model); + this.queryRoleByPage(1, this.queryForm); + }, + /** + * [loading description] + * @type {Boolean} + */ + loading: false, + /** + * [filterString description] + * @type {String} + */ + filterString: '', + /** + * 事件集合 + * @type {Object} + */ + actions: { + pageClick: function(pageNo) { + var model = get(this, 'model'); + set(model, 'indexNumber', (pageNo - 1) * model.meta.limit + 1); + set(model.meta, 'offset', pageNo); + this.queryRoleByPage(pageNo, this.queryForm); + }, + /** + * 查询角色信息 + * @return {[type]} [description] + */ + queryRoleDataAction: function() { + var model = get(this, 'model'); + this.initRole(model); + }, + + /** + * 对角色进行操作包括新增,删除,分配用户,分配用户组等 + * @param {[type]} actionType [description] + * @param {[type]} role [description] + * @return {[type]} [description] + */ + operateRoleAction: function(actionType, role) { + var id = ""; + if (!Ember.isBlank(role)) { + id = Ember.isBlank(role.id) ? "" : role.id; + } + + var param = { + id: id, + type: actionType + }; + + this.transitionToRoute('dashboard.portalManagement.role.operate', { + queryParams: param + }); + }, + + lookUpAction: function(record) { + if (Ember.isBlank(record.id)) { + swal("角色id为空,请确认"); + return; + } + + this.transitionToRoute('dashboard.portalManagement.role.view', record.id); + }, + + /** + * 删除角色信息,同时刷新角色列表 + * @param {[type]} role [description] + * @return {[type]} [description] + */ + deleteRoleAction: function(role) { + var roleId = role.id, + model = get(this, 'model'), + self = this, + portalRoleSrv = get(this, 'portalRoleSrv'); + + if (Ember.isBlank(roleId)) { + swal("角色信息为空,请确认"); + return; + } + swal({ + title: "是否删除此角色?", + type: "warning", + showCancelButton: true, + confirmButtonClass: "btn-danger", + cancelButtonText: "取消", + confirmButtonText: "删除", + closeOnConfirm: false + }, function(isConfirm) { + if (isConfirm) { + portalRoleSrv.delete(roleId).then(function(data) { + swal.close(); + if ("success" === data.status) { + self.queryRoleByPage(model.meta.offset, self.queryForm); + } + }); + } + }); + } + } +}); diff --git a/uam-web/app/dashboard/portal-management/role/index/route.js b/uam-web/app/dashboard/portal-management/role/index/route.js new file mode 100644 index 0000000000000000000000000000000000000000..6cecbed46325dcbf1e261aeaed7a9d3a7b594a7d --- /dev/null +++ b/uam-web/app/dashboard/portal-management/role/index/route.js @@ -0,0 +1,12 @@ +import Ember from 'ember'; + +export default Ember.Route.extend({ + model: function() { + var columns = [{ "propertyName": "name", "title": "名称","template":"partial/lookUp" }, { "propertyName": "code", "title": "编码" }, { "title": "操作", "template": "partial/roleOper" }]; + return { 'columns': columns }; + }, + setupController: function(controller, model) { + controller.initRole(model); + controller.set('model', model); + } +}); diff --git a/uam-web/app/dashboard/portal-management/role/index/template.hbs b/uam-web/app/dashboard/portal-management/role/index/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..f768f17e56f0208179b3e25e5afa4eb97961a217 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/role/index/template.hbs @@ -0,0 +1,43 @@ +<div class="inner-app"> + <div class="col-md-24 inner-app__context-bar"> + <span class="context-bar-nav-header no-shadow"> + <span class="context-bar__icon"> + <i class="idcicon idcicon-rolemanager"></i> 角色管理 + </span> + </span> + <span class="context-bar__right-button-group pull-right"> + <span class="input-group search"> + {{input type="text" value=filterString placeholder="请输入搜索内容"}} + {{io-icon type="search"}} + </span> + <button class="io-btn io-btn-primary" {{action "operateRoleAction" "ALL"}}>{{io-icon type="plus"}} 新建角色</button> + </span> + </div> + + <div class="inner-app__main collapsed"> + {{#if loading}} + {{io-loading}} + {{else}} + {{#if model.columns}} + {{io-table + columns=model.columns + showIndexNumber=true + showGlobalFilter=false + filterString=filterString + indexNumberBase=model.indexNumber + allocatePer = "operateRoleAction" + allocateGroup="operateRoleAction" + allocateUser="operateRoleAction" + update="operateRoleAction" + delete="deleteRoleAction" + lookUpAction="lookUpAction" + data=model.data}} + {{/if}} + {{#if model.paginationShow}} + <div class="row"> + {{io-pagination change="pageClick" count=model.meta.pages current=model.meta.offset}} + </div> + {{/if}} + {{/if}} + </div> +</div> diff --git a/uam-web/app/dashboard/portal-management/role/operate/controller.js b/uam-web/app/dashboard/portal-management/role/operate/controller.js new file mode 100644 index 0000000000000000000000000000000000000000..b729184b3aa33878b1ebe3e39219daa58de56f6b --- /dev/null +++ b/uam-web/app/dashboard/portal-management/role/operate/controller.js @@ -0,0 +1,535 @@ +import Ember from 'ember'; +const {set, get, inject, RSVP } = Ember; +export default Ember.Controller.extend({ + queryParams: ["id", "type", "source"], + portalRoleSrv: inject.service('api/portal-role/service'), + portalCommonSrv: inject.service('api/portal-common/service'), + apiSrv: inject.service('api/portal-api/service'), + resSrv: inject.service('api/portal-resource/service'), + perSrv: inject.service('api/portal-permission/service'), + roleId: "", + roleForm: { + code: "", + name: "", + remark: "" + }, + unSelectedUserList: [], + selectedUserList: [], + unSelectedGroupList: [], + selectedGroupList: [], + selectedAuthResList: [], + + roleAllTabs: [{ + title: "角色信息", + status: "process", + active: true, + index: 1, + icon: "rolemanager" + }, { + title: "用户组信息", + status: "wait", + index: 2, + icon: "usergroup" + }, { + title: "权限资源信息", + status: "wait", + index: 3, + icon: "permissionmanager", + last: true + }], + + loading: false, + + //备份角色关联信息,用于提交数据进行比对,判断新增/删除 + bakUserList: [], //角色的关联用户信息备份, + bakGroupList: [], //角色关联用户组信息备份 + bakAuthResList: [], //角色关联的功能信息备份 + + // 监听系统名称 + selectedAppId: function() { + var model = get(this, 'model'); + if (model.resData) { + var resTypeData = model.resData.filterBy('appId', model.appId); + set(model, 'resTypeData', resTypeData); + var resType = resTypeData.mapBy('code').uniq(); + if (resType.length > 0) { + set(model, 'resType', resType[0]); + }else{ + set(model, 'resType', ''); + } + } + }.observes('model.appId'), + + // 穿梭框转换 + parseTransferList: function(list) { + list.forEach((item) => { + set(item, 'label', item.name); + set(item, 'value', item.id); + }); + return list; + }, + /** + * 比较两个list,将删除,新增标志与id号进行拼接 + * @param {[type]} backList [description] + * @param {[type]} selectedList [description] + * @return {[type]} [description] + */ + compareList: function(backList, selectedList) { + var idListUnion = []; //id号与操作的拼接数据 id:I id:D + + //将selectedList与backList对比 + //若两个list都存在相同的id,从backList当中移除,只保留未选择的 + //若selectedList当中的id在backList当中不存在,则标记为I + selectedList.forEach((item) => { + var selectedId = ""; + if (typeof(item) === "string") { + selectedId = item; + } else { + selectedId = item.id; + } + + if (backList.contains(selectedId)) { + backList.removeAt(backList.indexOf(selectedId)); + } else { + idListUnion.addObject(selectedId + ":I"); + } + }); + + backList.forEach((item) => { + idListUnion.addObject(item + ":D"); + }); + return idListUnion.join(); + }, + /** + * 遍历树,加载已经选择的节点信息 + * @param {[type]} children [树的节点list] + * @param {[type]} perData [已经选择的权限信息] + */ + iteatorTree: function(children, perData) { + let self = this, + model = get(this, 'model'); + children.forEach(function(item) { + if (perData.contains(item.id)) { + set(item, 'selected', true); + if (model.selRes.indexOf(item) < 0) { + model.selRes.pushObject(item); + } + } + if (item.children.length > 0) { + self.iteatorTree(item.children, perData); + } + }); + }, + + observeSelRes: function() { + let model = get(this, 'model'); + + set(model, 'selPers', []); + if (model.selRes) { + model.selRes.forEach(item => { + if (item.authResId) { + if (!model.selPers.findBy("id", item.authResId)) { + model.selPers.pushObject({ id: item.authResId, title: item.authResName }); + } + } else { + if (item.id && !model.selPers.findBy("id", item.id)) { + model.selPers.pushObject({ id: item.id, title: item.title }); + } + } + }); + } + set(model, 'selPersLength', model.selPers.length); + }.observes('model.selRes.length'), + + /** + * 操作角色初始化 + * 分配权限初始化 + * 分配用户组和用户以及修改角色基本信息初始化 + * @param {[type]} model [description] + * @return {[type]} [description] + */ + initOperateRole: function(model) { + this.queryUserGroupType(); + var roleId = model.roleId, + type = model.type, + selectedGroupList = get(model, 'selectedGroupList'), + portalRoleSrv = get(this, 'portalRoleSrv'), + bakGroupList = get(model, 'bakGroupList'), + bakUserList = get(model, 'bakUserList'), + portalCommonSrv = get(this, 'portalCommonSrv'), + resSrv = get(this, 'resSrv'), + groupTypeSrv = get(this, 'apiSrv'), + self = this; + var tenantId = window.sessionStorage.getItem("tenant"); + //若id为空,说明为新增,初始化所有的用户组和角色信息 + if (Ember.isBlank(model.roleId)) { + set(model, 'roleId', ""); + + RSVP.hash({ + "allGroups": groupTypeSrv.getUserGroupByTypeAndTenantId("default",tenantId).then(res => { + return res.list + }), + "allRes": resSrv.queryAll().then(function(res) { + return res.list; + }) + }).then(function(res) { + set(model, 'dataSource', self.parseTransferList(res.allGroups)); + set(model, 'resData', res.allRes); + var appIdList = res.allRes.mapBy("appId").uniq(); + set(model, 'appIdList', appIdList); + set(model, 'appId', appIdList[0]); + set(self, 'roleForm', { + code: "", + name: "", + remark: "" + }); + set(self, 'model', model); + }); + this.send('stepAction', 1); + + } else { + /** + * 若为分配权限,对权限信息进行处理 + * 1. 获取所有已经选择的权限信息对应关系 + * 2. 对功能列表进行初始化,并对已经选择的权限信息进行添加checkBox,checked等对象 + * 3. 备份功能信息,用于保存时进行比对,判断新增/删除 + * @param {[type]} "PERMISSION" [description] + * @return {[type]} [description] + */ + + RSVP.hash({ + "roleItem": portalRoleSrv.queryById(roleId).then(function(res) { + return res.item; + }), + "allGroups": groupTypeSrv.getUserGroupByTypeAndTenantId("default",tenantId).then(res => { + return res.list + }), + "allRes": resSrv.queryAll().then(function(res) { + return res.list; + }), + }).then(function(res) { + var roleItem = res.roleItem, + allGroups = res.allGroups, + selGroupIds = roleItem.selGroups; + + var appIdList = res.allRes.mapBy("appId").uniq(); + + bakGroupList.pushObjects(selGroupIds); + + //处理已经选择的用户组和未选择的用户组 + allGroups.forEach((item) => { + if (selGroupIds.contains(item.id)) { + set(item, 'chosen', item.id); + } + }); + + set(model, 'resData', res.allRes); + set(model, 'dataSource', self.parseTransferList(allGroups)); + selectedGroupList.pushObjects(selGroupIds); + set(self, 'roleForm', roleItem); + set(model, 'appIdList', appIdList); + set(model, 'appId', appIdList[0]); + set(model, 'selPers', []); + set(self, 'model', model); + }); + + //控制标签页显示 + if ("INFO" === type || "ALL" === type) { + this.send('stepAction', 1); + } + + if ("GROUP" === type) { + this.send('stepAction', 2); + } + + if ("PERMISSION" === type) { + this.send('stepAction', 3); + } + } + }, + + /** + * 查询用户组所有类型 + * @return {[type]} [description] + */ + queryUserGroupType: function(){ + let groupTypeSrv = get(this, 'apiSrv'); + let tenant=window.sessionStorage.getItem("tenant"); + let model = get(this, 'model') + groupTypeSrv.getUserGroupType(tenant).then(resp => { + if (resp.status === 'success') { + set(model, 'groupTypeTree', resp.list); + } else { + swal(resp.message) + } + }); + }, + + /** + * 监听用户组类型选择操作 + * @return {[type]} [description] + */ + observeUserGroupType: function() { + let groupTypeSrv = get(this, 'apiSrv'); + let tenant=window.sessionStorage.getItem("tenant"); + let model = get(this, 'model'); + let self = this + groupTypeSrv.getUserGroupByTypeAndTenantId(model.groupType,tenant).then(resp => { + if (resp.status === 'success') { + let userGroups = resp.list; + Ember.set(model, 'dataSource', self.parseTransferList(userGroups)); + } else { + swal(resp.message) + } + }); + }.observes('model.groupType'), + + /** + * 监听分配对象类型,功能id + * 查询现有的功能与对象的关联信息 + * @return {[type]} [description] + */ + changeTreeData: function() { + var model = get(this, 'model'), + apiSrv = get(this, 'apiSrv'), + perSrv = get(this, 'perSrv'), + self = this; + + if (Ember.isBlank(model.appId)) { + return; + } + + if (Ember.isBlank(model.resType)) { + return; + } + + + set(this, 'loading', true); + set(model, 'selRes', []); + + var tenantId = window.sessionStorage.getItem('tenant'); + apiSrv.queryResByResType(model.resType,tenantId).then((res) => { + if (res.status === "success") { + this.set('loading', false); + let treeData = res.content; + set(treeData, 'expanded', true); + + set(model, 'resTree', treeData); + + if (Ember.isBlank(model.roleId)) { + return; + } + + var queryResForm = { + authResType: model.resType, + authObjType: "ROLE", + authObjId: model.roleId + }; + + perSrv.queryAuthRes(queryResForm).then((res) => { + if (res.status === "success") { + let perData = res.list.mapBy("authResId"); + + self.iteatorTree(model.resTree.children, perData); + set(model, 'backRes', Ember.copy(perData)); + + } else { + self.transitionToRoute(res.message); + } + }); + + } else { + self.transitionToRoute(res.message); + } + }); + + }.observes('model.resType', 'model.roleId'), + + /** + * 将树平铺为List返回 + * @param {[type]} children [树的节点list] + */ + treeToList: function(children) { + let list = []; + children.forEach(item => { + if (list.indexOf(item) < 0) { + list.push(item); + } + if (item.children && item.children.length > 0) { + list=list.concat(this.treeToList(item.children)); + } + }); + return list; + }, + + /** + * 事件集合 + * @type {Object} + */ + actions: { + linkAction: function(targetRoute) { + var param = { + id: "", + type: "ALL", + source: "role.operate" + }; + this.transitionToRoute('dashboard.portalManagement.' + targetRoute + '.operate', { + queryParams: param + }); + }, + /** + * tab标签切换 + * @param {[type]} selectTab [description] + * @return {[type]} [description] + */ + selectTabAction: function(step) { + get(this, 'roleAllTabs').forEach(item => { + if (item.index === step.index) { + set(item, 'status', 'process'); + return; + } + set(item, 'status', 'wait'); + }); + set(this, 'currentTab', step.title); + }, + + /** + * 点击步骤操作 + * @param {[type]} index [description] + * @return {[type]} [description] + */ + stepAction: function(index) { + let roleAllTabs = get(this, 'roleAllTabs'); + let currentStep = roleAllTabs.findBy("index", index); + this.send('selectTabAction', currentStep); + }, + + /** + * 删除已经选择的权限信息 + * @param {[type]} per [description] + * @return {[type]} [description] + */ + removePermission: function(per) { + let model = get(this, 'model'); + model.selPers.removeObject(per); + let node = model.selRes.findBy('id', per.id); + set(node, 'selected', false); + model.selRes.removeObject(node); + }, + + /** + * 返回链接 + * @return {[type]} [description] + */ + backRoleAction: function() { + var source = get(this, 'source'); + if (Ember.isBlank(source)) { + this.transitionToRoute('dashboard.portalManagement.role.index'); + } else { + if (source === "user.operate") { + this.transitionToRoute('dashboard.portalManagement.user'); + } else { + this.transitionToRoute('dashboard.portalManagement.' + source); + } + set(this, 'source', ""); + } + }, + + /** + * 保存角色操作 + * @param {[type]} roleForm [description] + * @return {[type]} [description] + */ + saveRoleAction: function() { + var portalRoleSrv = get(this, 'portalRoleSrv'), + model = get(this, 'model'), + roleForm = get(this, 'roleForm'), + self = this; + + + if (Ember.isBlank(model.roleId)) { + portalRoleSrv.create(roleForm).then(function(data) { + if (data.status === "success") { + swal(roleForm.name + "角色保存成功!"); + self.send('stepAction', 2); + set(model, 'roleId', data.item.id); + } else { + swal(data.message); + } + }); + } else { + portalRoleSrv.update(model.roleId, roleForm).then(function(data) { + if (data.status === "success") { + swal(roleForm.name + "角色修改成功!"); + } else { + swal(data.message); + } + }); + } + }, + /** + * 保存用户组与角色关联操作 + * @return {[type]} [description] + */ + saveGroupRoleAction: function() { + var model = get(this, 'model'), + selectedGroupList = get(model, 'selectedGroupList'), + portalRoleSrv = get(this, 'portalRoleSrv'), + bakGroupList = get(this, 'bakGroupList'), + roleId = get(model, 'roleId'), + self = this; + + var selGroups = this.compareList(bakGroupList, selectedGroupList); + + if (Ember.isBlank(roleId)) { + swal("角色信息不能为空,请确认"); + return; + } + + portalRoleSrv.allocateGroup(roleId, selGroups).then(function(data) { + if (data.status === "success") { + swal("保存成功!"); + set(self, 'bakGroupList', Ember.copy(selectedGroupList)); + // self.send('stepAction', 3); + } else { + swal(data.message); + } + }); + }, + + /** + * 保存权限信息 + * @return {[type]} [description] + */ + savePermissionAction: function() { + let model = get(this, 'model'), + perSrv = get(this, 'perSrv'), + self = this; + + if (Ember.isBlank(model.roleId)) { + swal("角色信息为空,请确认"); + return; + } + + let selPers = Ember.copy(model.selPers), + resTree = get(model,'resTree'), + operList = self.treeToList(resTree.children); + + let commitData = []; + operList.forEach(item => { + let perInfo = { authResType: model.resType, authResId: item.id, authResName: item.title, authObjType: "ROLE", authObjId: model.roleId, operType: item.selected ? 'I' : 'D' }; + commitData.pushObject(perInfo); + }); + + perSrv.saveAuthRes(JSON.stringify(commitData)).then(function(data) { + if ("success" === data.status) { + swal("保存成功!"); + set(model, 'backRes', model.selPers.mapBy("id")); + } else { + swal(data.message); + } + + }); + }, + } +}); diff --git a/uam-web/app/dashboard/portal-management/role/operate/route.js b/uam-web/app/dashboard/portal-management/role/operate/route.js new file mode 100644 index 0000000000000000000000000000000000000000..d49cfe59ac91883319df76cbea7582fe23a3f5bf --- /dev/null +++ b/uam-web/app/dashboard/portal-management/role/operate/route.js @@ -0,0 +1,31 @@ +import Ember from 'ember'; +var hash = Ember.RSVP.hash; +export default Ember.Route.extend({ + queryParams: { + id: { + refreshModel: true + }, + type: { + refreshModel: true + }, + source: { + refreshModel: true + } + }, + model: function(params) { + return hash({ + roleId: params.id, + type: params.type, + source: params.source, + selectedUserList: [], + selectedGroupList: [], + bakGroupList: [], + bakUserList: [], + dataSource: [] + }); + }, + setupController: function(controller, model) { + controller.set('model', model); + controller.initOperateRole(model); + } +}); diff --git a/uam-web/app/dashboard/portal-management/role/operate/template.hbs b/uam-web/app/dashboard/portal-management/role/operate/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..bd6311d1ac57b6db93f74a3ea53f26615d5b2302 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/role/operate/template.hbs @@ -0,0 +1,155 @@ +<div class="inner-app"> + <div class="inner-app__context-bar context-bar"> + <span class="h4 context-bar__icon" style="margin-left: 15px;"> + {{#link-to "dashboard.portalManagement.role"}}<i class="ioicon ioicon-left"></i> 角色管理&nbsp; {{/link-to}} / {{#if roleForm.name}} {{roleForm.name}}{{else}}新建角色{{/if}} + </span> + </div> + <div class="row"> + <div class="panel-heading bg-primary"> + {{#link-to "dashboard.portalManagement.role"}} 角色管理&nbsp; {{/link-to}} / {{#if roleForm.name}} {{roleForm.name}}{{else}}新建角色{{/if}} + </div> + </div> + <div class="inner-app__main collapsed"> + <div class="row" style="padding: 20px;"> + <div class="io-steps io-steps-horizontal io-steps-label-horizontal" style="display: inline-block; text-align: center; padding-left: 100px;"> + {{#each roleAllTabs as |step|}} + <div class="io-steps-item io-steps-status-{{step.status}}" style="margin-right: -18.4492px; width: 246px; text-align: left; cursor: pointer;" {{action "selectTabAction" step}}> + {{#unless step.last}} + <div class="io-steps-tail"> <i> </i> </div> + {{/unless}} + <div class="io-steps-step"> + <div class="io-steps-head"> + <div class="io-steps-head-inner"> + {{#if (eq step.status "finish")}} + <span class="io-steps-icon ioicon ioicon-check"> + </span> + {{else}} + <i class='idcicon idcicon-{{step.icon}}'></i> + {{/if}} + </div> + </div> + <div class="io-steps-main"> + <div class="io-steps-title"> + {{step.title}} + </div> + </div> + </div> + </div> + {{/each}} + </div> + </div> + <div class="tab-content"> + <div role="tabpanel" class="tab-pane {{if (eq '角色信息' currentTab) 'active'}}" id="info"> + {{#io-form submitForm="saveRoleAction" class="panel form-horizontal"}} + <div class="panel-body row"style="width:800px; margin:auto;"> + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" required=true help="" label="角色编码:" }} + {{io-input value=roleForm.code type="text" required=true data-error="请填写角色编码" }} + {{/io-form-group}} + + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" required=true help="" label="角色名称:" }} + {{io-input value=roleForm.name type="text" required=true data-error="请填写角色名称" }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="描述信息:" }} + {{io-textarea style="font-size:10px" value=roleForm.remark rows="6"}} + {{/io-form-group}} + <div class="row "style="text-align:center"> + <button type="submit" class="io-btn io-btn-primary"> {{io-icon type="save"}}保存</button> + </div> + </div> + {{/io-form}} + </div> + <div role="tabpanel" class="tab-pane {{if (eq '用户组信息' currentTab) 'active'}}" id="role"> + <div class="container-fluid"> + <div class="row padding0" style="padding: 30px; width: 770px; margin: auto;"> + <div style="margin-bottom:8px"> + <label for="">用户组类型:</label> + {{!-- {{#io-form-group labelColClass="col-sm-8" inputColClass="col-sm-16" required=false help="" label="用户组类型:" }} --}} + {{#io-select value=model.groupType placeholder="默认" }} + {{#each model.groupTypeTree as |queryType|}} + {{#io-option value=queryType.code}}{{queryType.value}}{{/io-option}} + {{/each}} + {{/io-select}} + </div> + {{!-- {{/io-form-group}} --}} + + {{io-transfer + dataSource=model.dataSource + targetValues=model.selectedGroupList}} + </div> + <div class="row"style="text-align:center"> + <button {{action "saveGroupRoleAction" }} class="io-btn io-btn-primary"> {{io-icon type="save"}}保存</button> + </div> + </div> + + </div> + <div role="tabpanel" class="tab-pane {{if (eq '权限资源信息' currentTab) 'active'}}" id="role"> + <div class="inner-app_main" style="padding: 20px;"> + <div class="row" style="max-width: 800px; margin: auto;"> + <div class="row inline-search"> + <div style="display:inline-block;"> + <label for="">系统名称:</label> + {{#io-select value=model.appId required=true placeholder="请选择" width=150 }} + {{#each model.appIdList as |idc|}} + {{#io-option value=idc}}{{idc}}{{/io-option}} + {{/each}} + {{/io-select}} + </div> + <div style="display:inline-block;margin-left:20px;"> + <label for="">权限资源类型:</label> + {{#io-select value=model.resType required=true placeholder="请选择" width=200}} + {{#each model.resTypeData as |idc|}} + {{#io-option value=idc.code}}{{idc.name}}{{/io-option}} + {{/each}} + {{/io-select}} + </div> + </div> + + {{#if loading}} + {{io-loading}} + {{else}} + {{#if model.resTree}} + <br> + <div class="selectbox" > + <div class="selectbox__menu col-sm-8" style="height: 450px;"> + {{io-tree + model=model.resTree + in-multi-selection=true + multi-selection=model.selRes + selected=selected}} + </div> + <div class="selectbox__content col-sm-16" style="height: 450px;"> + <div class="row"> + <h3>已选择权限 -- {{model.selPersLength}}个:</h3> + <p> + {{#each model.selPers as | per|}} + <span class="io-tag"> + {{#if per.title}} + <span class="io-tag-text">{{per.title}}</span> + {{else}} + <span class="io-tag-text">{{per.authResName}}</span> + {{/if}} + <i {{action "removePermission" per}} class="ioicon ioicon-cross"></i> + </span> + {{/each}} + </p> + </div> + </div> + </div> + <br> + <div class="row selectbox__content__footer" style="text-align: center;"> + {{#io-button type="primary" onClick="savePermissionAction"}} {{io-icon type="save"}}保存 {{/io-button}} + + </div> + {{else}} + <p class="empty"> + 没有任何数据,请选择过滤条件 + </p> + {{/if}} + {{/if}} + </div> + </div> + </div> + </div> + + </div> +</div> \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/role/route.js b/uam-web/app/dashboard/portal-management/role/route.js new file mode 100644 index 0000000000000000000000000000000000000000..26d9f3124ec6aa902b1a208b6d4cbfb62083a3ea --- /dev/null +++ b/uam-web/app/dashboard/portal-management/role/route.js @@ -0,0 +1,4 @@ +import Ember from 'ember'; + +export default Ember.Route.extend({ +}); diff --git a/uam-web/app/dashboard/portal-management/role/template.hbs b/uam-web/app/dashboard/portal-management/role/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..e2147cab02d61b24bccf33f448609ff7bf5ad470 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/role/template.hbs @@ -0,0 +1 @@ +{{outlet}} \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/role/view/controller.js b/uam-web/app/dashboard/portal-management/role/view/controller.js new file mode 100644 index 0000000000000000000000000000000000000000..19abc77df12e86ad95e703f23c9deb84209e7c65 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/role/view/controller.js @@ -0,0 +1,167 @@ +import Ember from 'ember'; +const {get, + set, + inject +} = Ember; +const pageSize = 10; +export default Ember.Controller.extend({ + roleSrv: inject.service('api/portal-role/service'), + groupSrv: inject.service('api/portal-user-group/service'), + userSrv: inject.service('api/portal-user/service'), + roleSteps: [{ + title: "角色信息", + status: "process", + active: true, + index: 0, + icon: "rolemanager" + }, { + title: "用户组信息", + status: "wait", + index: 1, + icon: "usergroup" + }, { + title: "用户信息", + status: "wait", + index: 2, + icon: "usermanager" + }, { + title: "权限信息", + status: "wait", + index: 3, + icon: "permissiondistribution", + last: true + }], + loading: false, + + initRoleView: function(model) { + let groupId = model.id; + if (Ember.isBlank(groupId)) { + swal("角色id不能为空,请确认!"); + return; + } + this.send('stepAction', 0); + this.queryById(groupId); + }, + + queryUserPageByRoleIdAndCnd: function(cnd, pageNo) { + let userSrv = get(this, 'userSrv'), + model = get(this, 'model'); + + let queryForm = { + id: model.id, + cnd: cnd, + pageNo: pageNo, + pageSize: pageSize + }; + + set(this, 'loading', true); + userSrv.queryUserPageByRoleIdAndCnd(queryForm).then(res => { + set(this, 'loading', false); + if ("success" === res.status) { + set(model, 'users', res.list); + set(model, 'usermeta', res.meta); + set(model, 'indexNumber', (pageNo - 1) * pageSize + 1); + } else { + swal("查询角色关联用户信息失败", res.message); + } + }); + }, + + queryPermissionsById: function(id) { + let roleSrv = get(this, 'roleSrv'), + model = get(this, 'model'); + + roleSrv.queryPermissionsById(id).then(res => { + if ("success" === res.status) { + set(model, 'permissions', res.item.links.PERMISSION.sortBy("systemName")); + } else { + swal("查询角色关联的权限信息失败,", res.message); + } + }); + }, + + queryGroupPageByRoleIdAndCnd: function(cnd, pageNo) { + let groupSrv = get(this, 'groupSrv'), + model = get(this, 'model'); + + let queryForm = { + id: model.id, + cnd: cnd, + pageNo: pageNo, + pageSize: pageSize + }; + set(this, 'loading', true); + groupSrv.queryGroupPageByRoleIdAndCnd(queryForm).then(res => { + set(this, 'loading', false); + if ("success" === res.status) { + set(model, 'groups', res.list); + set(model, 'groupmeta', res.meta); + } else { + swal("查询角色关联的用户组信息失败,", res.message); + } + }); + }, + + queryById: function(id) { + let roleSrv = get(this, 'roleSrv'), + self = this; + + roleSrv.queryById(id).then(res => { + if ("success" === res.status) { + set(self, 'roleForm', res.item); + } else { + swal("查询角色信息失败,", res.message); + } + }); + }, + + actions: { + /** + * 点击步骤操作 + * @param {[type]} index [description] + * @return {[type]} [description] + */ + stepAction: function(index) { + let roleSteps = get(this, 'roleSteps'), + model = get(this, 'model'); + + let currentStep = roleSteps.findBy("index", index); + + roleSteps.forEach(item => { + if (item.index !== index) { + set(item, 'status', 'wait'); + return; + } + set(currentStep, 'status', 'process'); + }); + set(this, 'currentTab', currentStep.title); + + + if (index === 0) { + this.queryById(model.id); + } + + if (index === 1) { + this.queryGroupPageByRoleIdAndCnd("", 1); + } + + if (index === 2) { + this.queryUserPageByRoleIdAndCnd("", 1); + } + + if (index === 3) { + this.queryPermissionsById(model.id); + } + }, + + userPageClick: function(pageNo) { + this.queryUserPageByRoleIdAndCnd("", pageNo); + + }, + groupPageClick: function(pageNo) { + this.queryGroupPageByRoleIdAndCnd("", pageNo); + } + } + + +}); \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/role/view/route.js b/uam-web/app/dashboard/portal-management/role/view/route.js new file mode 100644 index 0000000000000000000000000000000000000000..be71dffc76051e951c950a3cb2468da6c6bddba0 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/role/view/route.js @@ -0,0 +1,39 @@ +import Ember from 'ember'; + +export default Ember.Route.extend({ + model: function(param) { + let userColumns = [{ + "propertyName": "name", + "title": "用户名称" + }, { + "propertyName": "tenantId", + "title": "租户" + }, { + "propertyName": "title", + "title": "职位" + }, { + "propertyName": "deptName", + "title": "部门名称" + }]; + let groupColumns = [{ + "propertyName": "name", + "title": "名称" + }, { + "propertyName": "remark", + "title": "备注" + }, { + "propertyName": "gmtCreate", + "title": "创建时间" + }]; + + Ember.set(param, 'userColumns', userColumns); + Ember.set(param, 'groupColumns', groupColumns); + Ember.set(param, 'indexNumber', 1); + return param; + }, + setupController: function(controller, model) { + controller.set('model', model); + controller.initRoleView(model); + } + +}); \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/role/view/template.hbs b/uam-web/app/dashboard/portal-management/role/view/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..68747cdb4f0aca9f1817732a52f650f122c1e405 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/role/view/template.hbs @@ -0,0 +1,112 @@ +<div class="inner-app"> + <div class="inner-app__context-bar context-bar"> + <span class="h4 context-bar__icon" style="margin-left: 15px;"> + {{#link-to 'dashboard.portalManagement.role'}} {{io-icon type="left"}}{{/link-to}} + {{#link-to 'dashboard.portalManagement.role'}} 角色管理 {{/link-to}} / <span>{{roleForm.name}}</span> + </span> + </div> + + <div class="inner-app__main collapsed"> + <div class="row" style="padding: 20px;"> + <div class="io-steps io-steps-horizontal io-steps-label-horizontal" style="display: inline-block; text-align: center; padding-left: 100px;"> + {{#each roleSteps as |step|}} + <div class="io-steps-item io-steps-status-{{step.status}}" style="margin-right: -18.4492px; width: 246px; text-align: left; cursor: pointer;" {{action "stepAction" step.index}}> + {{#unless step.last}} + <div class="io-steps-tail"> <i> </i> </div> + {{/unless}} + <div class="io-steps-step"> + <div class="io-steps-head"> + <div class="io-steps-head-inner"> + {{#if (eq step.status "finish")}} + <span class="io-steps-icon ioicon ioicon-check"> + </span> + {{else}} + <i class='idcicon idcicon-{{step.icon}}'></i> + {{/if}} + </div> + </div> + <div class="io-steps-main"> + <div class="io-steps-title"> + {{step.title}} + </div> + </div> + </div> + </div> + {{/each}} + </div> + </div> + <div class="tab-content"> + <div role="tabpanel" class="tab-pane {{if (eq '角色信息' currentTab) 'active'}}" id="info"> + {{#io-form submitForm="saveResAction" class="panel form-horizontal" readonly=true}} + <div class="panel-body row"style="width:1000px; margin:auto;"> + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="角色编码:" }} + {{io-input value=roleForm.code type="text" data-error="" }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="角色名称:" }} + {{io-input value=roleForm.name type="text" data-error="" }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="备注:" }} + {{io-textarea style="font-size:10px" value=roleForm.remark rows="6"}} + {{/io-form-group}} + </div> + {{/io-form}} + </div> + <div role="tabpanel" class="tab-pane {{if (eq '用户信息' currentTab) 'active'}}" id="info"> + <div class="container-fluid user-list" style="width:1000px; margin:auto;"> + {{#if loading}} + {{io-loading}} + {{else}} + {{io-table + columns=model.userColumns + showIndexNumber=true + showGlobalFilter=true + indexNumberBase=model.indexNumber + data=model.users}} + <div class="row"> + {{io-pagination change="userPageClick" count=model.usermeta.pages current=model.usermeta.offset}} + </div> + {{/if}} + </div> + </div> + <div role="tabpanel" class="tab-pane {{if (eq '用户组信息' currentTab) 'active'}}" id="role"> + <div class="container-fluid user-list" style="width:1000px; margin:auto;"> + {{#if loading}} + {{io-loading}} + {{else}} + {{io-table + columns=model.groupColumns + showIndexNumber=true + showGlobalFilter=true + indexNumberBase=model.indexNumber + data=model.groups}} + <div class="row"> + {{io-pagination change="groupPageClick" count=model.groupmeta.pages current=model.groupmeta.offset}} + </div> + {{/if}} + </div> + </div> + + <div role="tabpanel" class="tab-pane {{if (eq '权限信息' currentTab) 'active'}}" id="user"> + <div class="container-fluid user-list" style="width:1000px; margin:auto;"> + <div class="user-list-selected"> + <p> + {{#each model.permissions as | per|}} + <h3>{{per.systemName}}--{{per.resName}}</h3> + <hr> + <br> + {{#each per.permissions as | item|}} + <span class="io-tag"> + <span class="io-tag-text">{{item.authResName}}</span> + </span> + {{/each}} + <br> + <br> + {{/each}} + </p> + </div> + </div> + <br> + </div> + </div> + </div> +</div> \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/route.js b/uam-web/app/dashboard/portal-management/route.js new file mode 100644 index 0000000000000000000000000000000000000000..22588b47c16a420029506a438567cc9754105f8e --- /dev/null +++ b/uam-web/app/dashboard/portal-management/route.js @@ -0,0 +1,3 @@ +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'clouduam-web/mixins/authenticated-route-mixin'; +export default Ember.Route.extend(AuthenticatedRouteMixin,{}); diff --git a/uam-web/app/dashboard/portal-management/template.hbs b/uam-web/app/dashboard/portal-management/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..e2147cab02d61b24bccf33f448609ff7bf5ad470 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/template.hbs @@ -0,0 +1 @@ +{{outlet}} \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/tenant/controller.js b/uam-web/app/dashboard/portal-management/tenant/controller.js new file mode 100644 index 0000000000000000000000000000000000000000..ebf0ba3d2f2c976e97d031af90e8815aa7b00d83 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/tenant/controller.js @@ -0,0 +1,145 @@ +import Ember from 'ember' +const { set, get, inject } = Ember +const pageSize = 10 +export default Ember.Controller.extend({ + tenantSrv: inject.service('api/portal-tenant/service'), + queryForm: { + tenantId: null, + tenantName: null + }, + filterString: '', + loading: false, + editTenant: {}, + infoTenant: {}, + openModalWindow: false, + openModalWindowTitle: '租户信息', + openInfoModalWindow: false, + openInfoModalWindowTitle: '租户信息', + initTenant: function(model) { + var meta = { + offset: 1 + } + set(model, 'meta', meta) + set(model, 'indexNumber', 1) + set(this, 'model', model) + this.queryTenantByPage(meta.offset, this.queryForm) + }, + queryTenantByPage: function(offset, queryForm) { + var tenantSrv = get(this, 'tenantSrv'), + model = get(this, 'model') + set(model, 'paginationShow', true) + set(this, 'loading', true) + tenantSrv.queryByPage(offset, pageSize, queryForm).then(res => { + set(this, 'loading', false) + if ('success' === res.status) { + set(model, 'data', res.list) + set(model, 'meta', res.meta) + } else { + swal(res.message) + } + }) + }, + actions: { + /** + * 分页查询 + */ + pageClick: function(pageNo) { + var model = get(this, 'model') + + // 设置页面的number开头 + set(model, 'indexNumber', (pageNo - 1) * pageSize + 1) + set(model.meta, 'offset', pageNo) + this.queryTenantByPage(model.meta.offset, this.queryForm) + }, + /** + * 打开租户编辑窗口 + */ + viewModalWindow: function(type, tenant) { + set(this, 'openModalWindow', true) + var model = get(this, 'model') + if (type === 'add') { + set(model, 'isAdd', true) + set(this, 'openModalWindowTitle', '新增租户') + } else { + set(this, 'openModalWindowTitle', '修改租户') + var tenantSrv = get(this, 'tenantSrv') + tenantSrv.queryTenantById(tenant.id).then(res => { + if ('success' === res.status) { + set(this, 'editTenant', res.item) + } else { + swal(res.message) + } + }) + } + }, + closeModalWindow: function() { + set(this, 'openModalWindow', false) + set(this, 'editTenant', {}) + }, + saveTenant: function() { + var self = this + var model = get(this, 'model') + var tenantSrv = get(this, 'tenantSrv') + if (model.isAdd) { + tenantSrv.addUser(this.editTenant).then(res => { + if ('success' === res.status) { + swal('新增租户成功') + } else { + swal(res.message) + } + self.queryTenantByPage(1, this.queryForm) + }) + } else { + tenantSrv.updateUser(this.editTenant).then(res => { + if ('success' === res.status) { + swal('修改租户成功') + } else { + swal(res.message) + } + self.queryTenantByPage(1, this.queryForm) + }) + } + set(this, 'openModalWindow', false) + set(this, 'editTenant', {}) + }, + deleteTenant: function(tenant) { + var self = this + if (!tenant && Ember.isBlank(tenant.id)) { + swal('用户信息为空,请确认') + return + } + var tenantSrv = get(this, 'tenantSrv') + swal( + { + title: '是否删除此租户?', + type: 'warning', + showCancelButton: true, + confirmButtonClass: 'btn-danger', + cancelButtonText: '取消', + confirmButtonText: '删除', + closeOnConfirm: false + }, + function(isConfirm) { + if (isConfirm) { + tenantSrv.deleteTenant(tenant.id).then(res => { + if ('success' === res.status) { + swal('删除租户成功!') + self.queryTenantByPage(1, this.queryForm) + } else { + swal(res.message) + } + }) + } + } + ) + }, + viewInfoModalWindow: function(tenant) { + set(this, 'infoTenant', tenant) + set(this, 'openInfoModalWindow', true) + }, + closeInfoModalWindow: function() { + set(this, 'infoTenant', {}) + set(this, 'openInfoModalWindow', false) + } + } +}) diff --git a/uam-web/app/dashboard/portal-management/tenant/route.js b/uam-web/app/dashboard/portal-management/tenant/route.js new file mode 100644 index 0000000000000000000000000000000000000000..be998facddd8f3f8f961afc1eb2f596233f2e84b --- /dev/null +++ b/uam-web/app/dashboard/portal-management/tenant/route.js @@ -0,0 +1,26 @@ +import Ember from 'ember' + +export default Ember.Route.extend({ + model: function() { + var columns = [ + { + propertyName: 'tenantName', + title: '名称', + template: 'partial/tenantLookUp' + }, + { + propertyName: 'tenantId', + title: '租户编码' + }, + { + title: '操作', + template: 'partial/tenantOper' + } + ] + return { columns: columns } + }, + setupController: function(controller, model) { + controller.initTenant(model) + controller.set('model', model) + } +}) diff --git a/uam-web/app/dashboard/portal-management/tenant/template.hbs b/uam-web/app/dashboard/portal-management/tenant/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..9ed76a0fe2902f62d93b41364c8c5615ff282531 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/tenant/template.hbs @@ -0,0 +1,100 @@ +<div class="inner-app"> + <div class="col-md-24 inner-app__context-bar"> + <span class="context-bar-nav-header no-shadow"> + <span class="context-bar__icon"> + <i class="idcicon idcicon-usergroup"></i> 租户管理 + </span> + </span> + <span class="context-bar__right-button-group pull-right"> + <span class="input-group search"> + {{input type="text" value=filterString placeholder="请输入搜索内容"}} + {{io-icon type="search"}} + </span> + <button class="io-btn io-btn-primary" {{action "viewModalWindow" "add"}} data-dismiss="modal">{{io-icon type="plus"}} 新建租户</button> + </span> + </div> + + <div class="inner-app__main collapsed"> + {{#if loading}} + {{io-loading}} + {{else}} + {{#if model.columns}} + {{io-table + columns=model.columns + showIndexNumber=true + showGlobalFilter=false + filterString=filterString + indexNumberBase=model.indexNumber + update="viewModalWindow" + delete="deleteTenant" + lookUpAction="viewInfoModalWindow" + data=model.data}} + {{/if}} + {{#if model.paginationShow}} + <div class="row"> + {{io-pagination change="pageClick" count=model.meta.pages current=model.meta.offset}} + </div> + {{/if}} + {{/if}} + </div> +</div> + +{{#io-modal show=openModalWindow}} +<div class="modal fade" data-backdrop="static"> + <div class="modal-dialog modal-lg"> + <div class="modal-content"> + <div class="modal-header bg-primary"> + <button type="button" class="close" {{action 'closeModalWindow'}}>×</button> + <h4 class="modal-title">{{openModalWindowTitle}}</h4> + </div> + {{#io-form-validator submitForm="saveTenant"}} + <form class="form-horizontal"> + <div class="modal-body scroll-y" style="height: calc(100% - 200px);"> + <div style="display: none"> + {{io-input value=editTenant.id }} + </div> + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" required=true help="" label="租户编码:" }} + {{io-input value=editTenant.tenantId type="text" required=true data-error="请填写租户编码" }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" required=true help="" label="租户名称:" }} + {{io-input value=editTenant.tenantName type="text" required=true data-error="请填写租户名称" }} + {{/io-form-group}} + </div> + <div class="modal-footer"> + <button type="submit" class="io-btn io-btn-primary"> {{io-icon type="save"}}保存</button> + <button type="button" class="btn btn-default" {{action 'closeModalWindow'}}>关 闭</button> + </div> + </form> + {{/io-form-validator}} + </div> + </div> +</div> +{{/io-modal}} + +{{#io-modal show=openInfoModalWindow}} +<div class="modal fade" data-backdrop="static"> + <div class="modal-dialog modal-lg"> + <div class="modal-content"> + <div class="modal-header bg-primary"> + <button type="button" class="close" {{action 'closeInfoModalWindow'}}>×</button> + <h4 class="modal-title">{{openInfoModalWindowTitle}}</h4> + </div> + <form class="form-horizontal"> + {{#io-form submitForm="saveResAction" class="panel form-horizontal" readonly=true}} + <div class="modal-body scroll-y" style="height: auto;"> + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="租户编码:" }} + {{io-input value=infoTenant.tenantId type="text" data-error="" }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="租户名称:" }} + {{io-input value=infoTenant.tenantName type="text" data-error="" }} + {{/io-form-group}} + </div> + {{/io-form}} + <div class="modal-footer"> + <button type="button" class="btn btn-default" {{action 'closeInfoModalWindow'}}>关 闭</button> + </div> + </form> + </div> + </div> +</div> +{{/io-modal}} \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/user-group/controller.js b/uam-web/app/dashboard/portal-management/user-group/controller.js new file mode 100644 index 0000000000000000000000000000000000000000..289b0c0a7fbcf13d4cb686fa8a1c02c8f4b9285d --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user-group/controller.js @@ -0,0 +1,2 @@ +import Ember from 'ember'; +export default Ember.Controller.extend({}); diff --git a/uam-web/app/dashboard/portal-management/user-group/index/controller.js b/uam-web/app/dashboard/portal-management/user-group/index/controller.js new file mode 100644 index 0000000000000000000000000000000000000000..948582987fc0669ad41acfcc04a62d686b6852c4 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user-group/index/controller.js @@ -0,0 +1,140 @@ +import Ember from 'ember'; +const {set, get, inject } = Ember; +const pageSize = 10; +export default Ember.Controller.extend({ + groupSrv: inject.service('api/portal-user-group/service'), + //查询form + queryForm: { + code: null, + name: null + }, + filterString: '', + queryUserGroupData: function(offset, queryForm, cnd) { + var groupSrv = get(this, 'groupSrv'), + model = get(this, 'model'); + set(model, 'paginationShow', true); + + this.set('loading', true); + groupSrv.queryByPage(offset, pageSize, queryForm, cnd).then((data) => { + set(model, 'meta', data.meta); + set(model, 'data', data.list); + data.list.forEach(item=>{ + Ember.set(item,'firstValue',item.selRoles[0]); + set(item, 'roleNumbers', item.selRoles.length); + }); + this.set('loading', false); + if (data.meta.pages > 1) { + set(model, 'paginationShow', true); + } + }); + }, + + queryUserGroupByCnd: function(cnd, offset) { + set(this, 'loading', true) + this.queryUserGroupData(offset, this.queryForm, cnd) + }, + + /** + * 监听查询条件 + * @return {[type]} [description] + */ + queryUserGroupsByCn: function() { + this.queryUserGroupByCnd(this.filterString, 1); + }.observes('filterString'), + + + initUserGroup: function(model) { + var meta = { + offset: 1, + }; + set(model, 'meta', meta); + set(model, 'indexNumber', 1); + set(this, 'model', model); + this.queryUserGroupData(model.meta.offset, this.queryForm, ""); + }, + + // /** + // * 监听页面录入名称,查询数据列表信息 + // * @param {[type]} queryForm [description] + // * @return {[type]} [description] + // */ + // queryByName: function(queryForm) { + // var model = get(this, 'model'); + // this.queryUserGroupData(model.meta.offset, model.meta.pageSize, this.queryForm); + // }.observes('queryForm.name'), + loading: false, + actions: { + /** + * 分页查询操作 + * @param {[type]} pageNo [description] + * @return {[type]} [description] + */ + pageClick: function(pageNo) { + var model = get(this, 'model'); + + // 设置页面的number开头 + set(model, 'indexNumber', (pageNo - 1) * pageSize + 1); + set(model.meta, 'offset', pageNo); + if (this.filterString) { + this.queryUserGroupByCnd(this.filterString, pageNo); + } else { + this.queryUserGroupData(model.meta.offset, this.queryForm, ""); + } + }, + + editUserGroupAction: function(actionType, group) { + var id = ""; + if (!Ember.isBlank(group)) { + id = Ember.isBlank(group.id) ? "" : group.id; + } + var param = { + id: id, + type: actionType + }; + this.transitionToRoute('dashboard.portalManagement.userGroup.operate', { + queryParams: param + }); + }, + + lookUpAction: function(record) { + + if (Ember.isBlank(record.id)) { + swal("用户组id不能为空,请确认"); + return; + } + + this.transitionToRoute('dashboard.portalManagement.userGroup.view', record.id); + }, + + deleteUserGroupAction: function(group) { + var userGroupId = group.id, + model = get(this, 'model'), + self = this, + groupSrv = get(this, 'groupSrv'); + if (Ember.isBlank(userGroupId)) { + swal("用户组信息为空,请确认"); + return; + } + swal({ + title: "是否删除此用户组?", + type: "warning", + showCancelButton: true, + confirmButtonClass: "btn-danger", + cancelButtonText: "取消", + confirmButtonText: "删除", + closeOnConfirm: false + }, function(isConfirm) { + if (isConfirm) { + groupSrv.delete(userGroupId).then(function(data) { + swal.close(); + if ("success" === data.status) { + self.queryUserGroupByCnd(self.filterString, 1); + // self.queryUserGroupData(model.meta.offset, self.queryForm); + } + }); + } + }); + + } + } +}); diff --git a/uam-web/app/dashboard/portal-management/user-group/index/route.js b/uam-web/app/dashboard/portal-management/user-group/index/route.js new file mode 100644 index 0000000000000000000000000000000000000000..f92e608f56a532556b5b391f48324df7905b5634 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user-group/index/route.js @@ -0,0 +1,25 @@ +import Ember from 'ember'; +const {set, + get, + inject, + RSVP +} = Ember; +export default Ember.Route.extend({ + permissions: [], + model: function() { + this.set('permissions', window.sessionStorage.getItem("permissions").split(',')) + var columns = [{ "propertyName": "name", "title": "名称", "template": "partial/lookUp" }, + { "propertyName": "remark", "title": "描述" }, + { "propertyName": "type", "title": "类型" , "template": "partial/groupType"}, + { "propertyName": "selRoles", "title": "拥有角色", "template": "partial/groupSelRoles" }, + { "propertyName": "gmtModified", "title": "最后修改时间" }, + this.permissions.includes("userGroup.operate")? { "title": "操作", "template": "partial/groupOper" }: {} + ]; + return { "columns": columns }; + }, + setupController: function(controller, model) { + set(model, 'permissions', this.permissions); + controller.initUserGroup(model); + controller.set('model', model); + } +}); diff --git a/uam-web/app/dashboard/portal-management/user-group/index/template.hbs b/uam-web/app/dashboard/portal-management/user-group/index/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..32cdfa5af3a573784a85bd68eed577c39cff2d4f --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user-group/index/template.hbs @@ -0,0 +1,47 @@ +<div class="inner-app"> + <div class="col-md-24 inner-app__context-bar"> + <span class="context-bar-nav-header no-shadow"> + <span class="context-bar__icon"> + <i class="idcicon idcicon-usergroup"></i> 用户组管理 + </span> + </span> + <span class="context-bar__right-button-group pull-right"> + <span class="input-group search"> + {{input type="text" value=filterString placeholder="请输入搜索内容"}} + {{io-icon type="search"}} + </span> + + {{#if (permission-check model.permissions "userGroup.create")}} + <button class="io-btn io-btn-primary" {{action "editUserGroupAction" "ALL"}} data-dismiss="modal">{{io-icon type="plus"}} 新建用户组</button> + {{/if}} + </span> + </div> + + {{#if (permission-check model.permissions "userGroup.list")}} + <div class="inner-app__main collapsed"> + {{#if loading}} + {{io-loading}} + {{else}} + {{#if model.columns}} + {{io-table + columns=model.columns + showIndexNumber=true + showGlobalFilter=false + filterString=filterString + indexNumberBase=model.indexNumber + allocateUser = "editUserGroupAction" + allocateRole="editUserGroupAction" + update="editUserGroupAction" + delete="deleteUserGroupAction" + lookUpAction="lookUpAction" + data=model.data}} + {{/if}} + {{#if model.paginationShow}} + <div class="row"> + {{io-pagination change="pageClick" count=model.meta.pages current=model.meta.offset}} + </div> + {{/if}} + {{/if}} + </div> + {{/if}} +</div> \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/user-group/operate/controller.js b/uam-web/app/dashboard/portal-management/user-group/operate/controller.js new file mode 100644 index 0000000000000000000000000000000000000000..1a879d3f84fb2356a7df8c1ef240b42a9bd53737 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user-group/operate/controller.js @@ -0,0 +1,574 @@ +import Ember from 'ember'; +const {get, + set, + inject, + RSVP +} = Ember; +const pageSize = 20; +const rootNode = { + id: "", + title: "所有部门" +}; +export default Ember.Controller.extend({ + queryParams: ["id", "type", "source"], + portalUserGroupSrv: inject.service('api/portal-user-group/service'), + portalCommonSrv: inject.service('api/portal-common/service'), + apiSrv: inject.service('api/portal-api/service'), + + userGroupSteps: [{ + title: "用户组信息", + status: "process", + active: true, + index: 1, + icon: "usergroup" + }, { + title: "角色清单", + status: "wait", + index: 2, + icon: "rolemanager" + }, { + title: "用户清单", + status: "wait", + index: 3, + icon: "usermanager", + last: true + }], + currentTab: "用户组信息", + /** + * 比较两个list,将删除,新增标志与id号进行拼接 + * @param {[type]} backList [description] + * @param {[type]} selectedList [description] + * @return {[type]} [description] + */ + compareList: function(backList, selectedList) { + var idListUnion = []; //id号与操作的拼接数据 id:I id:D + + //将selectedList与backList对比 + //若两个list都存在相同的id,从backList当中移除,只保留未选择的 + //若selectedList当中的id在backList当中不存在,则标记为I + for (var i = selectedList.length - 1; i >= 0; i--) { + + var selectedId = ""; + if (typeof(selectedList[i]) === "string") { + selectedId = selectedList[i]; + } else { + selectedId = selectedList[i].id; + } + + if (backList.contains(selectedId)) { + backList.removeAt(backList.indexOf(selectedId)); + } else { + idListUnion.addObject(selectedId + ":I"); + } + } + + //将backList里面所有的id都标记为D + for (var j = backList.length - 1; j >= 0; j--) { + idListUnion.addObject(backList[j] + ":D"); + } + return idListUnion.join(); + }, + + /** + * 监听用户table的选择操作 + * @return {[type]} [description] + */ + observeCheckbox: function() { + let model = get(this, 'model'); + if (model.users) { + model.users.forEach(item => { + if (item.checked && !model.selUsers.findBy("id", item.id)) { + model.selUsers.addObject(item); + } + + if (!item.checked && model.selUsers.findBy("id", item.id)) { + model.selUsers.removeObject(model.selUsers.findBy("id", item.id)); + } + }); + } + + if (model.selUsers) { + set(model, 'selUsersLength', model.selUsers.length); + } + }.observes('model.users.@each.checked'), + + /** + * 监听用户查询条件 + * @return {[type]} [description] + */ + observeQueryParam: function() { + let model = get(this, 'model'), + apiSrv = get(this, 'apiSrv'); + + /////// 第一次加载页面是为undfined + /// 若model.queryParam="", 会查询两次,根据deptID查询一次,然后监听查询条件再查询一次 + if (model.queryParam === undefined) { + return; + } + var tenantId = window.sessionStorage.getItem("tenant"); + apiSrv.queryUserByCnd(tenantId, model.queryParam, 1, pageSize).then(res => { + if ("success" === res.status) { + let userData = res.content.list; + + /////// 对已经选择的用户添加checked + /////// model.selUsers:已经选择的用户列表 + userData.forEach(item => { + if (model.selUsers.findBy("id", item.id)) { + set(item, 'checked', true); + } + }); + set(model, 'users', userData); + set(model.meta, 'totalPage', res.content.totalPage); + set(model.meta, 'page', res.content.page); + } else { + // swal("查询失败,", res.message); + } + }); + + }.observes('model.queryParam'), + + + //////// 将角色列表根据指定的key,进行转换 + parseTransferList: function(list) { + list.forEach((item) => { + set(item, 'label', item.name); + set(item, 'value', item.id); + }); + return list; + }, + /** + * 查询用户组所有类型 + * @return {[type]} [description] + */ + queryUserGroupType: function(){ + let groupTypeSrv = get(this, 'apiSrv'); + let tenant=window.sessionStorage.getItem("tenant"); + let model = get(this, 'model') + groupTypeSrv.getUserGroupType(tenant).then(resp => { + if (resp.status === 'success') { + set(model, 'groupTypeTree', resp.list); + } else { + swal(resp.message) + } + }); + }, + /** + * 初始化用户组信息 + * @return {[type]} [description] + */ + initUserGroup: function(model) { + this.queryUserGroupType(); + var portalUserGroupSrv = get(this, 'portalUserGroupSrv'), + portalCommonSrv = get(this, 'portalCommonSrv'), + apiSrv = get(this, 'apiSrv'), + userGroupId = model.userGroupId, + type = model.type, + userGroupAllTabs = get(this, 'userGroupAllTabs'), + self = this; + + set(model, 'meta', { + page: 1, + limit: pageSize + }); + var tenant = window.sessionStorage.getItem("tenant"); + //判断是否为修改,为空,则为新增 + if (Ember.isBlank(userGroupId)) { + set(this, 'currentTab', "用户组信息"); + set(this, 'userGroupTabs', userGroupAllTabs); + set(model, 'userGroupId', ""); + + set(this, 'userGroupForm', { + name: "", + remark: "" + }); + + RSVP.hash({ + "allRoles": portalCommonSrv.getRoleList().then(function(data) { + return data.list; + }), + "allDept": apiSrv.queryDepartment(tenant).then(res => { + return res.content; + }) + }).then(function(data) { + const allDept = data.allDept; + allDept.insertAt(0, rootNode); ///// 添加所有部门的节点 + set(model, 'dataSource', self.parseTransferList(data.allRoles)); + set(model, 'selectedRoleList', []); + set(model, 'bakRoleList', []); + set(model, 'bakUserList', []); + set(model, 'selUsers', []); + set(model, 'deptTree', allDept); + set(self, 'model', model); + self.queryUserByDeptId('', 1, tenant); + }); + } else { + + RSVP.hash({ + "userGroup": portalUserGroupSrv.queryById(userGroupId).then(res => { + return res.item; + }), + "allRoles": portalCommonSrv.getRoleList().then((data) => { + return data.list; + }), + "allDept": apiSrv.queryDepartment(tenant).then(res => { + return res.content; + }), + "selUsersInfo": portalUserGroupSrv.queryUsersById(userGroupId).then(res => { + return res.item; + }) + }).then((res) => { + //组装用户组与角色的对应关系 + var allRoles = res.allRoles, + userGroup = res.userGroup, + db_selRoles = userGroup.selRoles, // 数据库已经选择的角色信息 + db_selUsers = userGroup.selUsers, // 数据库已经选择的用户信息 + allDept = res.allDept, + selUsersInfo = res.selUsersInfo.links.USER; + + // 组装穿梭框数据---已经选择的角色及未选择的角色 // + allRoles.forEach((item) => { + if (db_selRoles.contains(item.id)) { + set(item, 'chose', item.id); + } + }); + + allDept.insertAt(0, rootNode); + set(model, 'selectedRoleList', db_selRoles); + set(model, 'dataSource', self.parseTransferList(allRoles)); + set(model, 'selUsers', selUsersInfo); + set(model, 'bakRoleList', Ember.copy(db_selRoles)); ///// 备份数据库已经选择的角色信息 + set(model, 'bakUserList', Ember.copy(db_selUsers)); ///// 备份数据库已经选择的用户信息 + set(model, 'deptTree', allDept); + set(model, 'deptID', ''); + set(model, 'queryParam', ''); + set(self, 'model', model); + set(self, 'userGroupForm', res.userGroup); + self.queryUserByDeptId('', 1, tenant); + }); + } + + //为ALL,全部显示,此时控制上一步,下一步按钮的显示 + if (type === "ALL" || type === "INFO") { + this.send('stepAction', 1); + } + if (type === "ROLE") { + this.send('stepAction', 2); + } + if (type === "USER") { + this.send('stepAction', 3); + } + }, + + /** + * 根据部门id查询用户信息,并关联已经选择的用户与未选择的用户 + * 根据部门id,加载用户信息 + * 若用户组id为空,则不加载关联信息 + * @param {[type]} deptId [description] + * @param {[type]} pageNo [description] + * @param {[type]} pageSize [description] + * @return {[type]} [description] + */ + queryUserByDeptId: function(deptId, pageNo) { + var apiSrv = get(this, 'apiSrv'), + model = get(this, 'model'), + portalUserGroupSrv = get(this, 'portalUserGroupSrv'), + self = this; + var tenant = window.sessionStorage.getItem("tenant"); + apiSrv.queryUserByDeptId(deptId, pageNo, pageSize, tenant).then(res => { + if (res.status === "success") { + let userData = res.list; + + set(model.meta, 'totalPage', res.meta.pages); + set(model.meta, 'page', res.meta.offset); + set(model, 'indexNumber', (pageNo - 1) * pageSize + 1); + + ////// 用户在选择了其他部门或者其他table页的用户信息也需要添加checked标志 + userData.forEach(item => { + if (model.selUsers.findBy("id", item.id)) { + set(item, 'checked', true); + } + }); + + set(model, 'users', userData); + + ////// 用户切换部门的时候,需要将全选标记去掉 + set(model, 'AllChecked', false); + + ///// 若用户组id为空,不加载db当中已经选择的用户信息 + if (Ember.isBlank(model.userGroupId)) { + return; + } + + portalUserGroupSrv.queryById(model.userGroupId).then(res => { + if ("success" === res.status) { + let groupData = res.item; + let db_selUsers = groupData.selUsers; + + model.users.forEach(item => { + if (db_selUsers.contains(item.id)) { + set(item, 'checked', true); + } + }); + set(model, 'bakUserList', Ember.copy(db_selUsers)); + } else { + self.transitionToRoute('error', '查询用户组关联用户信息异常'); + } + }); + + } else { + self.transitionToRoute('error', '查询部门人员异常'); + } + }); + }, + + /** + * 事件集合 + * @type {Object} + */ + actions: { + + /** + * 全选操作 + * @return {[type]} [description] + */ + checkBoxClick: function() { + let model = get(this, 'model'), + checked = !model.AllChecked; + + model.users.forEach(item => { + set(item, 'checked', checked); + }); + /////// 控制全选的样式 + set(model, 'AllChecked', checked); + }, + + /** + * 页面操作 + * @param {[type]} pageNo [description] + * @return {[type]} [description] + */ + pageClick: function(pageNo) { + let model = get(this, 'model'), + apiSrv = get(this, 'apiSrv'), + self = this; + var tenant = window.sessionStorage.getItem("tenant"); + + ////////// 根据部门id分页查询用户列表信息 + apiSrv.queryUserByDeptId(model.deptID, pageNo, pageSize, tenant).then(res => { + if (res.status === "success") { + let userData = res.list; + //set(model.meta, 'totalPage', res.meta.total); + //set(model.meta, 'page', res.meta.pages); + + ////// 用户在选择了其他部门或者其他table页的用户信息也需要添加checked标志 + userData.forEach(item => { + if (model.selUsers.findBy("id", item.id)) { + set(item, 'checked', true); + } + }); + set(model, 'users', userData); + set(model, 'AllChecked', false); //翻页的时候将全选标志标记为false + } else { + self.transitionToRoute('error', '查询部门人员异常'); + } + }); + + + }, + /** + * 链接事件 + * @param {[type]} targetRoute [description] + * @return {[type]} [description] + */ + linkAction: function(targetRoute) { + var param = { + id: "", + type: "ALL", + source: "userGroup.operate", + }; + this.transitionToRoute('dashboard.portalManagement.' + targetRoute + '.operate', { + queryParams: param + }); + }, + /** + * tab标签切换 + * @param {[type]} selectTab [description] + * @return {[type]} [description] + */ + selectTabAction: function(step) { + let userGroupSteps = get(this, 'userGroupSteps'); + + userGroupSteps.forEach(item => { + if (item.index !== step.index) { + set(item, 'status', 'wait'); + return; + } + set(step, 'status', 'process'); + }); + + set(this, 'currentTab', step.title); + }, + + /** + * 点击部门节点,根据部门id分页查询用户列表信息 + * @param {[type]} node [description] + * @return {[type]} [description] + */ + onSelectedFolderNode: function(param) { + var model = get(this, 'model'), + pageNo = 1; + var tenant = window.sessionStorage.getItem("tenant"); + set(model, 'deptID', param.id); + this.queryUserByDeptId(param.id, pageNo, tenant); + }, + + /** + * 点击步骤操作 + * @param {[type]} index [description] + * @return {[type]} [description] + */ + stepAction: function(index) { + let currentStep = get(this, 'userGroupSteps').findBy("index", index); + this.send('selectTabAction', currentStep); + }, + + /** + * 从已经选择的用户列表当中,删除某一用户 + * @param {[type]} user [description] + * @return {[type]} [description] + */ + removeUserAction: function(user) { + let model = get(this, 'model'), + selUsers = model.selUsers; + + if (!selUsers) { + selUsers = []; + return; + } + selUsers.removeObject(user); + + ///// 删除用户后,取消当前用户列表此用户的checked状态 + model.users.forEach(item => { + if (item.id === user.id) { + set(item, 'checked', false); + } + }); + }, + + /** + * 保存/更新用户组信息接口 + * @param {[type]} userGroupForm [description] + * @return {[type]} [description] + */ + saveUesrGroupAction: function() { + var portalUserGroupSrv = get(this, 'portalUserGroupSrv'), + userGroupForm = get(this, 'userGroupForm'), + model = get(this, 'model'), + userGroupId = get(model, 'userGroupId'), + name = userGroupForm.name, + type = userGroupForm.type, + remark = userGroupForm.remark, + self = this; + if (Ember.isBlank(userGroupId)) { + portalUserGroupSrv.create(name, type,remark).then(function(data) { + if (data.status === "success") { + swal(name + "用户组保存成功!"); + set(model, 'userGroupId', data.item.id); + self.send('stepAction', 2); + } else { + swal(data.message); + } + + }); + + } else { + portalUserGroupSrv.update(userGroupId, name, type,remark).then(function(data) { + if (data.status === "success") { + swal(name + "用户组修改成功!"); + self.send('stepAction', 2); + } else { + swal(data.message); + } + + }); + } + }, + + /** + * 保存用户组与角色的关联关系 + * @return {[type]} [description] + */ + saveGroupRoleAction: function() { + var portalUserGroupSrv = get(this, 'portalUserGroupSrv'), + model = get(this, 'model'), + userGroupId = get(model, 'userGroupId'), + selRoles = get(model, 'selectedRoleList'), + bakRoleList = get(model, 'bakRoleList'); + + if (Ember.isBlank(userGroupId)) { + swal("用户组信息不能为空"); + return; + } + + ////////// 将备份的角色与现选择的角色进行比对,区分新增/删除 + ////////// 若为新增,id:I,若为删除,id:D + var roleIdListStr = this.compareList(bakRoleList, selRoles); + + portalUserGroupSrv.allocateRole(userGroupId, roleIdListStr).then(function(data) { + if (data.status === "success" && !Ember.isBlank(userGroupId)) { + swal("保存成功"); + set(model, 'bakRoleList', Ember.copy(selRoles)); + } else { + swal(data.message); + } + }); + }, + + /** + * 保存用户组与用户的关联关系 + * @return {[type]} [description] + */ + saveGroupUserAction: function() { + var portalUserGroupSrv = get(this, 'portalUserGroupSrv'), + model = get(this, 'model'), + userGroupId = get(model, 'userGroupId'), + bakUserList = get(model, 'bakUserList'); + + if (Ember.isBlank(userGroupId)) { + swal("用户组信息不能为空"); + return; + } + + let selUsers = Ember.copy(model.selUsers); + + // 比较用户,区分删除,新增状态 + selUsers.forEach(item => { + set(item, 'operType', ""); //防止注入operType + if (bakUserList.contains(item.id)) { + bakUserList.removeAt(bakUserList.indexOf(item.id)); + } else { + set(item, 'operType', "I"); + } + }); + + bakUserList.forEach(item => { + let userInfo = { + "id": item, + "operType": "D" + }; + selUsers.pushObject(userInfo); + }); + + portalUserGroupSrv.allocateUser(userGroupId, JSON.stringify(selUsers)).then(function(data) { + if (data.status === "success") { + swal("保存成功!"); + //////// 保存成功后,刷新备份的用户id列表 + set(model, 'bakUserList', model.selUsers.mapBy("id")); + } else { + swal(data.message); + } + + }); + } + } +}); \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/user-group/operate/route.js b/uam-web/app/dashboard/portal-management/user-group/operate/route.js new file mode 100644 index 0000000000000000000000000000000000000000..154b5fe4727914607f42d3cbc188ce06e8a3986c --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user-group/operate/route.js @@ -0,0 +1,31 @@ +import Ember from 'ember'; +var hash = Ember.RSVP.hash; +export default Ember.Route.extend({ + queryParams: { + id: { + refreshModel: true + }, + type: { + refreshModel: true + }, + source: { + refreshModel: true + } + }, + model: function(params) { + return hash({ + columns: [], + userGroupId: params.id, + type: params.type, + source: params.source, + dataSource: [], + AllChecked: false + }); + }, + setupController: function(controller, model) { + let ifTenant= window.localStorage.getItem("IS_MULTI_TENANT"); + model.ifTenant = (ifTenant=='true'); + controller.set('model', model); + controller.initUserGroup(model); + } +}); diff --git a/uam-web/app/dashboard/portal-management/user-group/operate/template.hbs b/uam-web/app/dashboard/portal-management/user-group/operate/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..eecfd2670cb020bb73a3fa9229834a1378402d56 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user-group/operate/template.hbs @@ -0,0 +1,185 @@ +<div class="inner-app"> + <div class="inner-app__context-bar context-bar"> + <span class="h4 context-bar__icon" style="margin-left: 15px;"> + {{#link-to "dashboard.portalManagement.userGroup"}}<i class="ioicon ioicon-left"></i>用户组管理{{/link-to}} &nbsp;/ {{#if userGroupForm.name}}{{userGroupForm.name}}{{else}}新建用户组{{/if}} + </span> + </div> + + <div class="inner-app__main collapsed"> + <div class="row" style="padding: 20px;"> + <div class="io-steps io-steps-horizontal io-steps-label-horizontal" style="display: inline-block; text-align: center; padding-left: 100px;"> + {{#each userGroupSteps as |step|}} + <div class="io-steps-item io-steps-status-{{step.status}}" style="margin-right: -18.4492px; width: 246px; text-align: left; cursor: pointer;" {{action "selectTabAction" step}}> + {{#unless step.last}} + <div class="io-steps-tail"> <i> </i> </div> + {{/unless}} + <div class="io-steps-step"> + <div class="io-steps-head"> + <div class="io-steps-head-inner"> + {{#if (eq step.status "finish")}} + <span class="io-steps-icon ioicon ioicon-check"> + </span> + {{else}} + <i class='idcicon idcicon-{{step.icon}}'></i> + {{/if}} + </div> + </div> + <div class="io-steps-main"> + <div class="io-steps-title"> + {{step.title}} + </div> + </div> + </div> + </div> + {{/each}} + </div> + </div> + <div class="tab-content"> + <div role="tabpanel" class="tab-pane {{if (eq '用户组信息' currentTab) 'active'}}" id="info"> + {{#io-form submitForm="saveUesrGroupAction" class="panel form-horizontal"}} + <div class="panel-body row" style="width: 800px; margin: auto;"> + {{#io-form-group labelColClass="col-sm-8" inputColClass="col-sm-16" required=true help="" label="用户组名称:" }} + {{io-input value=userGroupForm.name class="pull-left" type="text" required=true data-error="请填写用户组名称" }} + {{/io-form-group}} + + {{#io-form-group labelColClass="col-sm-8" inputColClass="col-sm-16" required=false help="" label="类型(可选):" }} + {{#io-select value=userGroupForm.type placeholder="默认" width='100%'}} + {{#each model.groupTypeTree as |queryType|}} + {{#io-option value=queryType.code}}{{queryType.value}}{{/io-option}} + {{/each}} + {{/io-select}} + {{/io-form-group}} + + {{#io-form-group labelColClass="col-sm-8" inputColClass="col-sm-16" help="" label="描述信息(可选):" }} + {{io-textarea style="font-size:10px" class="pull-left" value=userGroupForm.remark rows="6"}} + {{/io-form-group}} + </div> + {{/io-form}} + <div class="row" style="text-align:center;"> + <button {{action "saveUesrGroupAction"}} class="io-btn io-btn-primary"> {{io-icon type="save"}} 保存</button> + <button {{action "stepAction" 2}} class="io-btn io-btn-ghost">下一步 {{io-icon type="right"}}</button> + </div> + </div> + <div role="tabpanel" class="tab-pane {{if (eq '角色清单' currentTab) 'active'}}" id="role"> + <div class="container-fluid"> + <div class="row padding0" style="padding: 30px; width: 770px; margin: auto;"> + {{io-transfer + dataSource=model.dataSource + targetValues=model.selectedRoleList}} + </div> + <br> + <div class="row" style="text-align:center;"> + <button {{action "saveGroupRoleAction"}} class="io-btn io-btn-primary"> {{io-icon type="save"}} 保存</button> + <button {{action "stepAction" 1}} class="io-btn io-btn-ghost">{{io-icon type="left"}} 上一步 </button> + <button {{action "stepAction" 3}} class="io-btn io-btn-ghost">下一步 {{io-icon type="right"}}</button> + </div> + <br><br> + </div> + </div> + + <div role="tabpanel" class="tab-pane {{if (eq '用户清单' currentTab) 'active'}}" id="user"> + <div class="container-fluid user-list"> + <div class="input-group pull-right"> + {{!-- <span class="input-group-addon "><i class="ioicon ioicon-search"></i></span> --}} + {{io-input class="col-24 pull-right" value=model.queryParam type="text" placeholder="请输入查询条件" }} + </div> + <div class="user-list-selectbox"> + <div class="col-sm-5 user-list-selectbox__menu"> + {{#if model.deptTree}} + {{io-tree + treeNodeIcon='idcicon idcicon-build' + treeNodeTemplate='partial/tree-node-with-icon' + model=model.deptTree + selected=selected + onSelectNode='onSelectedFolderNode' + }} + {{/if}} + </div> + + <div class="col-sm-19 user-list-selectbox__content"> + <table class="table"> + <!--<colgroup> + <col style="width: 150px;"/> + <col style="width: 25%;"/> + <col style="width: 25%;"/> + <col/> + </colgroup>--> + <thead> + <tr> + <th> + <span {{action "checkBoxClick"}} class="io-checkbox {{if model.AllChecked 'io-checkbox-checked'}}"> + <span class="io-checkbox-inner"></span> + </span> + </th> + <th>登录名</th> + <th>姓名</th> + {{#if (eq true model.ifTenant)}} + <th>租户</th> + {{/if}} + {{!-- <th>职位</th> --}} + <th>部门</th> + </tr> + </thead> + </table> + <div class="table-body-wrapper"> + <table class="table"> + <!--<colgroup> + <col style="width: 150px;"/> + <col style="width: 25%;"/> + <col style="width: 25%;"/> + <col/> + </colgroup>--> + <tbody> + {{!-- {{log model.users}} --}} + {{#each model.users as |user index|}} + <tr> + <td > {{io-checkbox checked=user.checked}}</td> + <td>{{user.loginId}}</td> + <td>{{user.name}}</td> + {{#if (eq true model.ifTenant)}} + <td>{{user.tenantId}}</td> + {{/if}} + {{!-- <td>{{user.title}}</td> --}} + <td>{{user.deptName}}</td> + </tr> + {{/each}} + </tbody> + </table> + {{#unless model.users}} + <p class="empty"> + 当前列表为空,请选择左侧部门信息 + </p> + {{/unless}} + </div> + <div class="row"> + {{io-pagination change="pageClick" count=model.meta.totalPage current=model.meta.page}} + </div> + </div> + </div> + <div class="user-list-selected"> + <h3>已选择用户 -- {{model.selUsersLength}}个:</h3> + <p> + {{#each model.selUsers as | user|}} + <span class="io-tag"> + {{#if user.name}} + <span class="io-tag-text">{{user.name}}</span> + {{else}} + <span class="io-tag-text">{{user.name}}</span> + {{/if}} + <i {{action "removeUserAction" user}}class="ioicon ioicon-cross"></i> + </span> + {{/each}} + </p> + </div> + </div> + <br> + <div class="row" style="text-align:center;"> + <button {{action "saveGroupUserAction"}} class="io-btn io-btn-primary"> {{io-icon type="save"}} 保存</button> + <button {{action "stepAction" 2}} class="io-btn io-btn-ghost">{{io-icon type="left"}} 上一步 </button> + + </div> + <br><br><br> + </div> + </div> + </div> +</div> \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/user-group/route.js b/uam-web/app/dashboard/portal-management/user-group/route.js new file mode 100644 index 0000000000000000000000000000000000000000..26d9f3124ec6aa902b1a208b6d4cbfb62083a3ea --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user-group/route.js @@ -0,0 +1,4 @@ +import Ember from 'ember'; + +export default Ember.Route.extend({ +}); diff --git a/uam-web/app/dashboard/portal-management/user-group/template.hbs b/uam-web/app/dashboard/portal-management/user-group/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..e2147cab02d61b24bccf33f448609ff7bf5ad470 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user-group/template.hbs @@ -0,0 +1 @@ +{{outlet}} \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/user-group/view/controller.js b/uam-web/app/dashboard/portal-management/user-group/view/controller.js new file mode 100644 index 0000000000000000000000000000000000000000..2cb5ace7b556b86b705c630458be3724af649861 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user-group/view/controller.js @@ -0,0 +1,175 @@ +import Ember from 'ember'; +const {get, + set, + inject +} = Ember; +const pageSize = 10; +export default Ember.Controller.extend({ + groupSrv: inject.service('api/portal-user-group/service'), + roleSrv: inject.service('api/portal-role/service'), + apiSrv: inject.service('api/portal-api/service'), + userSrv: inject.service('api/portal-user/service'), + userGroupSteps: [{ + title: "用户组信息", + status: "process", + active: true, + index: 0, + icon: "usergroup" + }, { + title: "角色信息", + status: "wait", + index: 1, + icon: "rolemanager" + }, { + title: "用户信息", + status: "wait", + index: 2, + icon: "usermanager" + }, { + title: "权限信息", + status: "wait", + index: 3, + icon: "permissiondistribution", + last: true + }], + loading: false, + + initGroupView: function(model) { + let groupId = model.id; + if (Ember.isBlank(groupId)) { + swal("用户组id不能为空,请确认!"); + return; + } + + let initmeta = { + pages: 0, + offset: 1 + }; + set(model, 'usermeta', initmeta); + this.send('stepAction', 0); + this.queryById(groupId); + }, + + queryUserPageByGroupIdAndCnd: function(cnd, pageNo) { + let userSrv = get(this, 'userSrv'), + model = get(this, 'model'); + + let queryForm = { + id: model.id, + cnd: cnd, + pageNo: pageNo, + pageSize: pageSize + }; + + set(this, 'loading', true); + userSrv.queryUserPageByGroupIdAndCnd(queryForm).then(res => { + set(this, 'loading', false); + if ("success" === res.status) { + set(model, 'users', res.list); + set(model, 'usermeta', res.meta); + set(model, 'indexNumber', (pageNo - 1) * pageSize + 1); + } else { + swal("查询用户信息失败", res.message); + } + }); + }, + + queryPermissionsById: function(id) { + let groupSrv = get(this, 'groupSrv'), + model = get(this, 'model'); + + groupSrv.queryPermissionsById(id).then(res => { + if ("success" === res.status) { + set(model, 'permissions', res.item.links.PERMISSION.sortBy("systemName")); + } else { + swal("查询用户组关联的权限信息失败,", res.message); + } + }); + }, + + queryRolePageByGroupIdAndCnd: function(cnd, pageNo) { + let roleSrv = get(this, 'roleSrv'), + model = get(this, 'model'); + + let queryForm = { + id: model.id, + cnd: cnd, + pageNo: pageNo, + pageSize: pageSize + }; + + set(this, 'loading', true); + roleSrv.queryRolePageByGroupIdAndCnd(queryForm).then(res => { + set(this, 'loading', false); + if ("success" === res.status) { + set(model, 'roles', res.list); + set(model, 'rolemeta', res.meta); + set(model, 'indexNumber', (pageNo - 1) * pageSize + 1); + } else { + swal("查询用户组关联的角色信息失败,", res.message); + } + }); + }, + + queryById: function(id) { + let groupSrv = get(this, 'groupSrv'), + self = this; + + groupSrv.queryById(id).then(res => { + if ("success" === res.status) { + set(self, 'groupForm', res.item); + } else { + swal("查询用户组关联的用户组失败,", res.message); + } + }); + }, + + actions: { + /** + * 点击步骤操作 + * @param {[type]} index [description] + * @return {[type]} [description] + */ + stepAction: function(index) { + let userGroupSteps = get(this, 'userGroupSteps'), + model = get(this, 'model'); + + let currentStep = userGroupSteps.findBy("index", index); + + userGroupSteps.forEach(item => { + if (item.index !== index) { + set(item, 'status', 'wait'); + return; + } + set(currentStep, 'status', 'process'); + }); + set(this, 'currentTab', currentStep.title); + + + if (index === 0) { + this.queryById(model.id); + } + + if (index === 1) { + this.queryRolePageByGroupIdAndCnd("", 1); + } + + if (index === 2) { + this.queryUserPageByGroupIdAndCnd("", 1); + } + + if (index === 3) { + this.queryPermissionsById(model.id); + } + }, + + userPageClick: function(pageNo) { + this.queryUserPageByGroupIdAndCnd("", pageNo); + }, + rolePageClick: function(pageNo) { + this.queryRolePageByGroupIdAndCnd("", pageNo); + } + } + + +}); \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/user-group/view/route.js b/uam-web/app/dashboard/portal-management/user-group/view/route.js new file mode 100644 index 0000000000000000000000000000000000000000..271ced00b938e7dd6de25f4bb75ddebb8270f882 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user-group/view/route.js @@ -0,0 +1,45 @@ +import Ember from 'ember'; +const {get, + set, + inject +} = Ember; +export default Ember.Route.extend({ + model: function(param) { + let userColumns = [{ + "propertyName": "name", + "title": "用户名称" + }, { + "propertyName": "tenantId", + "title": "租户" + }, { + "propertyName": "title", + "title": "职位" + }, { + "propertyName": "deptName", + "title": "部门名称" + }]; + let roleColumns = [{ + "propertyName": "code", + "title": "编码" + }, { + "propertyName": "name", + "title": "名称" + }, { + "propertyName": "remark", + "title": "备注" + }, { + "propertyName": "gmtCreate", + "title": "创建时间" + }]; + + Ember.set(param, 'userColumns', userColumns); + Ember.set(param, 'roleColumns', roleColumns); + Ember.set(param, 'indexNumber', 1); + return param; + }, + setupController: function(controller, model) { + controller.set('model', model); + controller.initGroupView(model); + } + +}); \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/user-group/view/template.hbs b/uam-web/app/dashboard/portal-management/user-group/view/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..c7e9503d0fa7c77ea0c8c1564e095edbf0027877 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user-group/view/template.hbs @@ -0,0 +1,112 @@ +<div class="inner-app"> + <div class="inner-app__context-bar context-bar"> + <span class="h4 context-bar__icon" style="margin-left: 15px;"> + {{#link-to 'dashboard.portalManagement.userGroup'}} {{io-icon type="left"}}{{/link-to}} + {{#link-to 'dashboard.portalManagement.userGroup'}} 用户组管理 {{/link-to}} / <span>{{groupForm.name}}</span> + </span> + </div> + + <div class="inner-app__main collapsed"> + <div class="row" style="padding: 20px;"> + <div class="io-steps io-steps-horizontal io-steps-label-horizontal" style="display: inline-block; text-align: center; padding-left: 100px;"> + {{#each userGroupSteps as |step|}} + <div class="io-steps-item io-steps-status-{{step.status}}" style="margin-right: -18.4492px; width: 246px; text-align: left; cursor: pointer;" {{action "stepAction" step.index}}> + {{#unless step.last}} + <div class="io-steps-tail"> <i> </i> </div> + {{/unless}} + <div class="io-steps-step"> + <div class="io-steps-head"> + <div class="io-steps-head-inner"> + {{#if (eq step.status "finish")}} + <span class="io-steps-icon ioicon ioicon-check"> + </span> + {{else}} + <i class='idcicon idcicon-{{step.icon}}'></i> + {{/if}} + </div> + </div> + <div class="io-steps-main"> + <div class="io-steps-title"> + {{step.title}} + </div> + </div> + </div> + </div> + {{/each}} + </div> + </div> + <div class="tab-content"> + <div role="tabpanel" class="tab-pane {{if (eq '用户组信息' currentTab) 'active'}}" id="info"> + {{#io-form submitForm="saveResAction" class="panel form-horizontal" readonly=true}} + <div class="panel-body row"style="width:1000px; margin:auto;"> + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="用户组名称:" }} + {{io-input value=groupForm.name type="text" data-error="" }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="类型:" }} + {{io-input value=groupForm.type type="text" data-error="" }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="备注:" }} + {{io-textarea style="font-size:10px" value=groupForm.remark rows="6"}} + {{/io-form-group}} + </div> + {{/io-form}} + </div> + <div role="tabpanel" class="tab-pane {{if (eq '用户信息' currentTab) 'active'}}" id="info"> + <div class="container-fluid user-list" style="width:1000px; margin:auto;"> + {{#if loading}} + {{io-loading}} + {{else}} + {{io-table + columns=model.userColumns + showGlobalFilter=true + showIndexNumber=true + indexNumberBase=model.indexNumber + data=model.users}} + <div class="row"> + {{io-pagination change="userPageClick" count=model.usermeta.pages current=model.usermeta.offset}} + </div> + {{/if}} + </div> + </div> + <div role="tabpanel" class="tab-pane {{if (eq '角色信息' currentTab) 'active'}}" id="role"> + <div class="container-fluid user-list" style="width:1000px; margin:auto;"> + {{#if loading}} + {{io-loading}} + {{else}} + {{io-table + columns=model.roleColumns + showIndexNumber=true + showGlobalFilter=true + indexNumberBase=model.indexNumber + data=model.roles}} + <div class="row"> + {{io-pagination change="rolePageClick" count=model.rolemeta.pages current=model.rolemeta.offset}} + </div> + {{/if}} + </div> + </div> + + <div role="tabpanel" class="tab-pane {{if (eq '权限信息' currentTab) 'active'}}" id="user"> + <div class="container-fluid user-list" style="width:1000px; margin:auto;"> + <div class="user-list-selected"> + <p> + {{#each model.permissions as | per|}} + <h3>{{per.appId}}--{{per.resName}}</h3> + <hr> + <br> + {{#each per.permissions as | item|}} + <span class="io-tag"> + <span class="io-tag-text">{{item.authResName}}</span> + </span> + {{/each}} + <br> + <br> + {{/each}} + </p> + </div> + </div> + <br> + </div> + </div> + </div> +</div> \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/user/controller.js b/uam-web/app/dashboard/portal-management/user/controller.js new file mode 100644 index 0000000000000000000000000000000000000000..289b0c0a7fbcf13d4cb686fa8a1c02c8f4b9285d --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user/controller.js @@ -0,0 +1,2 @@ +import Ember from 'ember'; +export default Ember.Controller.extend({}); diff --git a/uam-web/app/dashboard/portal-management/user/import-priview/controller.js b/uam-web/app/dashboard/portal-management/user/import-priview/controller.js new file mode 100644 index 0000000000000000000000000000000000000000..9598a563e0bc7af575038137acc23ca0aa500d85 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user/import-priview/controller.js @@ -0,0 +1,57 @@ +import Ember from 'ember'; +const { get, set, inject } = Ember +export default Ember.Controller.extend({ + userSrv: inject.service('api/portal-user/service'), + /** + * [loading description] + * @type {Boolean} + */ + loading: false, + clickToSave: true, + + /** + * 初始化导入用户预览操作 + */ + initUser: function(model) { + var self = this + self.importPriview(model.id); + }, + + importPriview: function(id) { + var userSrv = get(this, 'userSrv') + var self = this + var model = get(this, 'model') + userSrv.importPriview(id).then(res => { + + if (res.status === 'success') { + set(model, 'users', res.list); + + } else { + swal(res.message) + } + }) + }, + +actions: { + saveAction: function() { + var userSrv = get(this, 'userSrv') + var self = this + var model = get(this, 'model') + if(get(this, 'clickToSave')===true){ + set(this, 'clickToSave', false); + userSrv.saveImportUsers(model.id).then(res => { + if (res.status === 'success') { + swal("导入用户成功!"); + set(this, 'clickToSave', true); + self.transitionToRoute('dashboard.portalManagement.user.index'); + } else { + swal("导入用户失败!"); + set(this, 'clickToSave', true); + } + }) + } + + } + + } +}); \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/user/import-priview/route.js b/uam-web/app/dashboard/portal-management/user/import-priview/route.js new file mode 100644 index 0000000000000000000000000000000000000000..dc7ec4e457004e4954bfede025875f46ece84253 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user/import-priview/route.js @@ -0,0 +1,81 @@ +import Ember from 'ember' +var hash = Ember.RSVP.hash +export default Ember.Route.extend({ + queryParams: { + id: { + refreshModel: true + } + }, + model: function(param) { + if (!param.id) { + param['id'] = '' + } + return hash({ + columns: [ + { + propertyName: 'loginId', + title: '登录名', + template: 'partial/importPriview/loginId' + }, + { + propertyName: 'name', + title: '姓名', + template: 'partial/importPriview/name' + }, + { + propertyName: 'deptFullName', + title: '具体部门名称', + template: 'partial/importPriview/deptFullName' + }, + { + propertyName: 'title', + title: '职务', + template: 'partial/importPriview/title' + }, + { + propertyName: 'password', + title: '密码', + template: 'partial/importPriview/password' + }, + { + propertyName: 'email', + title: '邮箱', + template: 'partial/importPriview/email' + }, + { + propertyName: 'mobile1', + title: '移动电话1', + template: 'partial/importPriview/mobile' + }, + { + propertyName: 'officeTel1', + title: '办公电话1', + template: 'partial/importPriview/officeTel' + }, + { + propertyName: 'sourceType', + title: '数据来源', + template: 'partial/importPriview/sourceType' + }, + { + propertyName: 'remark', + title: '备注', + template: 'partial/importPriview/remark' + }, + { + propertyName: 'dataStatus', + title: '数据状态', + template: 'partial/importPriview/dataStatus' + } + ], + id: param.id + }) + + }, + setupController: function(controller, model) { + controller.set('model', model) + controller.initUser(model) + } + +}) + diff --git a/uam-web/app/dashboard/portal-management/user/import-priview/template.hbs b/uam-web/app/dashboard/portal-management/user/import-priview/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..3f852ef281c4194fc5c6ebde18092c3f9c8fa270 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user/import-priview/template.hbs @@ -0,0 +1,30 @@ +<div class="inner-app"> + <div class="inner-app__context-bar context-bar"> + {{!-- <span class="context-bar-nav-header"> --}} + {{#link-to 'dashboard.portalManagement.user'}} {{io-icon type="left"}}{{/link-to}} + {{#link-to 'dashboard.portalManagement.user'}} 用户管理 {{/link-to}} / <span>导入用户预览</span> + + + <span class="context-bar__right-button-group pull-right"> + <button {{action "saveAction"}} class="io-btn io-btn-primary"> {{io-icon type="save"}} 导入有效用户</button> + {{#link-to "dashboard.portalManagement.user.import"}} &nbsp;&nbsp; + <button class="io-btn io-btn-primary"> {{io-icon type="rollback"}}重新导入 </button> + {{/link-to}} + </span> + </div> + + <div class="inner-app__main collapsed"> + {{#if model.columns}} + {{io-table + columns=model.columns + showIndexNumber=true + showGlobalFilter=false + indexNumberBase=model.indexNumber + saveAction = "saveAction" + pageSize=100000 + data=model.users}} + {{/if}} + </div> + +</div> + diff --git a/uam-web/app/dashboard/portal-management/user/import/controller.js b/uam-web/app/dashboard/portal-management/user/import/controller.js new file mode 100644 index 0000000000000000000000000000000000000000..178771c0a34db0d9ce7e40b8fe2c21e00469f4f9 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user/import/controller.js @@ -0,0 +1,36 @@ +import Ember from 'ember'; +import ajaxUploadFile from 'clouduam-web/components/common/io-file-upload/ajax-file-upload'; + +export default Ember.Controller.extend({ + actions: { + saveAction: function () { + var self = this; + var files = $('.file-uploader')[0].files; + if (Ember.isEmpty(files) || files.length <= 0) { + swal("操作失败,请选择要上传的文件!"); + return; + } + var tenantId = window.sessionStorage.getItem("tenant"); + ajaxUploadFile({ + url: '/portal/user/upload_users?tenantId='+tenantId, + fileElement: $('.file-uploader')[0], + onStart() { + }, + onSuccess(response) { + var data = $.parseJSON(response); + if (data.status === "success") { + // swal("导入用户成功!"); + self.transitionToRoute('dashboard.portalManagement.user.importPriview', data.item); + } else { + swal("操作失败!"); + return; + } + }, + onError(err) { + swal("操作失败:" + err); + return; + } + }); + }, + } +}); \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/user/import/route.js b/uam-web/app/dashboard/portal-management/user/import/route.js new file mode 100644 index 0000000000000000000000000000000000000000..26d9f3124ec6aa902b1a208b6d4cbfb62083a3ea --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user/import/route.js @@ -0,0 +1,4 @@ +import Ember from 'ember'; + +export default Ember.Route.extend({ +}); diff --git a/uam-web/app/dashboard/portal-management/user/import/template.hbs b/uam-web/app/dashboard/portal-management/user/import/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..b40bbae89de04d1a39cd9923b7a9a03fab44da08 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user/import/template.hbs @@ -0,0 +1,37 @@ +<div class="inner-app"> + <div class="inner-app__context-bar context-bar"> + {{!-- <span class="context-bar-nav-header"> --}} + <span class="h4 context-bar__icon" style="margin-left: 15px;"> + {{#link-to 'dashboard.portalManagement.user'}} {{io-icon type="left"}}{{/link-to}} + {{#link-to 'dashboard.portalManagement.user'}} 用户管理 {{/link-to}} / <span>导入用户</span> + </span> + {{!-- </span> --}} + </div> + <div class="inner-app__main collapsed"> + <div class="container-fluid" style="width: 750px; margin: 30px auto 20px;"> + <div class="row padding0"> + <div class="col-md-12"> + {{#common/io-file-upload + upload="upload" + autoUpload=false + showUploadButton=false + multiple=false}} + {{/common/io-file-upload}} + </div> + <div class="col-md-4" style="margin-left:5px; margin-top:7px;"> + <a href="/portal/user/templete/download">点击下载导入模板</a> + </div> + </div> + + <div class="row" style="margin-top:20px;"> + <button {{action "saveAction"}} class="io-btn io-btn-primary"> {{io-icon type="save"}} 导入预览</button> + {{#link-to "dashboard.portalManagement.user.index"}} &nbsp;&nbsp; + <button class="io-btn io-btn-primary"> {{io-icon type="rollback"}} 取消导入 </button> + {{/link-to}} + </div> + </div> + <div class="row"> + + </div> + </div> +</div> \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/user/index/controller.js b/uam-web/app/dashboard/portal-management/user/index/controller.js new file mode 100644 index 0000000000000000000000000000000000000000..b7399f24bc30c968d6bbc3e03fc7e7582d7d01ce --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user/index/controller.js @@ -0,0 +1,540 @@ +import Ember from 'ember' +const { get, set, inject } = Ember +const pageSize = 10 +const rootNode = { + id: '', + title: '所有部门', + sourceType: '' +} +export default Ember.Controller.extend({ + apiSrv: inject.service('api/portal-api/service'), + userSrv: inject.service('api/portal-user/service'), + deptSrv: inject.service('api/portal-dept/service'), + commonSrv: inject.service('api/portal-common/service'), + queryParams: ['deptID'], + openPersonModalWindow: false, + openPersonModalWindowTitle: '用户信息', + openDeptModalWindow: false, + openDeptRoleWindow: false, + editUser: {}, + editDept: {}, + allRoles: [], + selectedRoles: [], + openResetPasswordWindow: false, + openNewPasswordContent: '', + openGrantTokenWindow: false, + openGrantTokenContent: '', + /** + * [loading description] + * @type {Boolean} + */ + loading: false, + /** + * [filterString description] + * @type {String} + */ + filterString: '', + + /** + * 初始化用户操作 + */ + initUser: function(model) { + var self = this + var meta = { + offset: 1 + } + + set(model, 'indexNumber', 1) + self.queryDeptTree() + self.queryUserByDeptId(model.deptID, meta.offset) + }, + + queryDeptTree: function() { + var apiSrv = get(this, 'apiSrv') + var self = this + var tenant = window.sessionStorage.getItem('tenant') + var model = get(this, 'model') + apiSrv.queryDepartment(tenant).then(res => { + if (res.status === 'success') { + //Add root dept + res.content.insertAt(0, rootNode) + set(model, 'deptTree', res.content) + } else { + swal(res.message) + } + }) + }, + + queryUserByCnd: function(cnd, pageNo) { + let apiSrv = get(this, 'apiSrv'), + model = get(this, 'model') + let deptId = model.deptID + set(this, 'loading', true) + this.queryUserByDeptId(deptId, pageNo, cnd) + }, + + /** + * 监听查询条件 + * @return {[type]} [description] + */ + queryUsersByCn: function() { + this.queryUserByCnd(this.filterString, 1) + }.observes('filterString'), + + /** + * 分页查询操作 + */ + queryUserByDeptId: function(deptId, pageNo, cnd) { + var apiSrv = get(this, 'apiSrv'), + model = get(this, 'model') + set(model, 'paginationShow', false) + set(this, 'loading', true) + var tenant = window.sessionStorage.getItem('tenant') + apiSrv.queryUserByDeptId(deptId, pageNo, 10, tenant, cnd).then(res => { + this.set('loading', false) + if (res.status === 'success') { + + res.list.forEach(item=>{ + Ember.set(item,'firstValue',item.selGroups[0]); + set(item, 'groupNumbers', item.selGroups.length); + }); + set(model, 'users', res.list); + set(model, 'meta', res.meta); + if (res.meta.total > 0) { + set(model, 'paginationShow', true) + } + } else { + swal(res.message) + } + }) + }, + //////// 将角色列表根据指定的key,进行转换 + parseTransferList: function(list) { + list.forEach(item => { + set(item, 'label', item.name) + set(item, 'value', item.id) + }) + return list + }, + + /** + * [actions description] + * @type {Object} + */ + actions: { + /** 点击部门树,查询用户列表信息 */ + onSelectedFolderNode: function(param) { + var model = get(this, 'model'), + pageNo = 1 + + set(model, 'deptID', param.id) + set(model, 'indexNumber', (pageNo - 1) * pageSize + 1) + this.set('loading', true) + this.queryUserByDeptId(param.id, pageNo) + }, + + lookUpAction: function(record) { + this.transitionToRoute( + 'dashboard.portalManagement.user.view', + record.id + ) + }, + /** + * 页面操作 + * @param {[type]} pageNo [description] + * @return {[type]} [description] + */ + pageClick: function(pageNo) { + var model = get(this, 'model') + set(model.users, 'offset', pageNo) + set(model, 'indexNumber', (pageNo - 1) * pageSize + 1) + if (this.filterString) { + this.queryUserByCnd(this.filterString, pageNo) + } else { + this.queryUserByDeptId(model.deptID, pageNo) + } + }, + + /** + * 分配用户组操作,跳转页面 + */ + editUserGroupAction: function(actionType, group) { + var id = '', + model = get(this, 'model') + if (!Ember.isBlank(group)) { + id = Ember.isBlank(group.id) ? '' : group.id + } + var param = { + deptID: model.deptID, + type: actionType + } + this.transitionToRoute( + 'dashboard.portalManagement.user.operate', + id, + { + queryParams: param + } + ) + }, + + /** + * 打开用户编辑窗口 + */ + viewPersonModalWindow: function(type, user) { + var userSrv = get(this, 'userSrv') + var model = get(this, 'model') + this.set('openPersonModalWindow', true) + set(model, 'isAdd', false) + if (type === 'add') { + set(model, 'isAdd', true) + this.set('openPersonModalWindowTitle', '新增用户') + this.set('editUser', { deptId: model.deptID }) + } else if (type === 'edit') { + this.set('openPersonModalWindowTitle', '编辑用户') + userSrv.queryById(user.id).then(res => { + if (res.status === 'success') { + this.set('editUser', res.item) + } else { + swal(res.message) + } + }) + } + }, + + /** + * 关闭用户编辑窗口 + */ + closePersonModalWindow: function() { + this.set('openPersonModalWindow', false) + this.set('editUser', {}) + }, + + /** + * 新增用户 + */ + saveUser: function() { + var userSrv = get(this, 'userSrv') + let tenantId = window.sessionStorage.getItem('tenant') + let user = get(this, 'editUser') + var model = get(this, 'model') + user.tenantId = tenantId + if (model.isAdd === true) { + userSrv.addUser(user).then(res => { + if (res.status === 'success') { + swal('新增用户成功!') + this.set('openPersonModalWindow', false) + this.set('editUser', {}) + } else { + swal(res.message) + } + this.queryUserByCnd(this.filterString, 1) + }) + } else { + userSrv.updateUser(user).then(res => { + if (res.status === 'success') { + swal('修改用户成功!') + this.set('openPersonModalWindow', false) + this.set('editUser', {}) + } else { + swal(res.message) + } + this.queryUserByCnd(this.filterString, 1) + }) + } + }, + + /** + * 导出用户 + */ + downloadUser: function() { + let userSrv = get(this, 'userSrv') + let model = get(this, 'model') + let deptId=model.deptID + let tenantId = window.sessionStorage.getItem('tenant'); + location.href = '/portal/user/list/download?deptId='+deptId+'&tenantId='+tenantId; + }, + + /** + * 激活用户 + */ + enabledUser: function(user) { + var userSrv = get(this, 'userSrv') + var model = get(this, 'model'); + if (user.status === 'ENABLED') { + userSrv.disabledUser(user.id).then(res => { + if (res.status === 'success') { + swal('禁用用户成功!') + } else { + swal(res.message) + } + this.queryUserByCnd(this.filterString, 1) + }) + } else { + userSrv.enabledUser(user.id).then(res => { + if (res.status === 'success') { + swal('激活用户成功!') + } else { + swal(res.message) + } + this.queryUserByCnd(this.filterString, 1) + }) + } + }, + + /** + * 重置密码 + */ + resetPW: function(user) { + var userSrv = get(this, 'userSrv'); + var self = this + swal( + { + title: '是否重置此用户密码?', + type: 'warning', + showCancelButton: true, + confirmButtonClass: 'btn-danger', + confirmButtonText: '重置密码', + cancelButtonText: '取消操作', + closeOnConfirm: true, + closeOnCancel: true + }, + function(isConfirm) { + if (isConfirm) { + userSrv.resetPW(user.id).then(res => { + set(self, 'openResetPasswordWindow', true); + set(self, 'openNewPasswordContent', res.item); + self.queryUserByCnd(self.filterString, 1); + }) + } + } + ) + }, + + closeResetPasswordWindow: function() { + set(this, 'openResetPasswordWindow', false) + set(this, 'openNewPasswordContent', "") + }, + + /** + * 删除用户 + */ + deleteUser: function(user) { + var self = this + var userSrv = get(this, 'userSrv') + // userSrv.deleteUser(user.id) + + if (!user && Ember.isBlank(user.id)) { + swal('用户信息为空,请确认') + return + } + swal( + { + title: '是否删除此用户?', + type: 'warning', + showCancelButton: true, + confirmButtonClass: 'btn-danger', + cancelButtonText: '取消', + confirmButtonText: '删除', + closeOnConfirm: false + }, + function(isConfirm) { + if (isConfirm) { + userSrv.deleteUser(user.id).then(res => { + if ('success' === res.status) { + swal('删除用户成功!') + self.queryUserByCnd(this.filterString, 1) + } else { + swal(res.message) + } + }) + } + } + ) + }, + + /** + * admin给其他用户发放Token + */ + grantToken: function(user) { + var self = this + var userSrv = get(this, 'userSrv') + let tenantId = window.sessionStorage.getItem('tenant') + let loginId=user.loginId; + userSrv.grantToken(loginId,tenantId).then(res => { + if (res.status === 'success') { + set(self, 'openGrantTokenWindow', true); + set(self, 'openGrantTokenContent', res.item); + self.queryUserByCnd(self.filterString, 1); + // swal(res.item) + } else { + swal(res.message) + } + }) + }, + + closeGrantTokenWindow: function() { + set(this, 'openGrantTokenWindow', false) + set(this, 'openGrantTokenContent', "") + }, + + viewDeptModalWindow: function(type) { + var deptSrv = get(this, 'deptSrv') + var model = get(this, 'model') + set(model, 'isAddDept', false) + if (type === 'add') { + this.set('openDeptModalWindow', true) + set(model, 'isAddDept', true) + this.set('openDeptModalWindowTitle', '新增部门') + } else if (type === 'edit') { + if (Ember.isBlank(model.deptID)) { + swal('请选择一个部门!') + return + } + deptSrv.queryDeptById(model.deptID).then(res => { + if (res.status === 'success') { + if(res.item.sourceType !== 'native'){ + swal('数据源为'+res.item.sourceType+'的部门不允许修改!') + return + } + this.set('editDept', res.item) + this.set('openDeptModalWindow', true) + this.set('openDeptModalWindowTitle', '部门信息') + } else { + swal(res.message) + } + }) + } + }, + + closeDeptModalWindow: function() { + this.set('openDeptModalWindow', false) + this.set('openDeptModalWindowTitle', '') + this.set('editDept', {}) + }, + + saveDept: function() { + var model = get(this, 'model') + var dept = this.editDept + var deptSrv = get(this, 'deptSrv') + dept.tenantId = window.sessionStorage.getItem('tenant') + if (model.isAddDept === true) { + deptSrv.addDept(dept).then(res => { + if (res.status === 'success') { + swal('新增部门成功!') + } else { + swal(res.message) + } + this.queryDeptTree() + }) + } else { + deptSrv.updateDept(dept).then(res => { + if (res.status === 'success') { + swal('修改部门成功!') + } else { + swal(res.message) + } + this.queryDeptTree() + }) + } + this.set('openDeptModalWindow', false) + this.set('editDept', {}) + }, + + /** + * 打开部门绑定角色的窗口 + */ + viewDeptRoleModalWindow: function() { + var self = this + var model = get(this, 'model') + if (Ember.isBlank(model.deptID)) { + swal('请选择一个部门!') + return + } + this.set('openDeptRoleWindow', true) + var commonSrv = get(this, 'commonSrv') + var deptSrv = get(this, 'deptSrv') + commonSrv.getRoleList().then(res => { + if (res.status === 'success') { + this.set('allRoles', self.parseTransferList(res.list)) + } else { + swal(res.message) + } + }) + deptSrv.queryRolesByDeptId(model.deptID).then(res => { + if (res.status === 'success') { + let roleIds = [] + for (let item of res.item.links.ROLE) { + roleIds.push(item.id) + } + this.set('selectedRoles', roleIds) + } else { + swal(res.message) + } + }) + }, + + /** + * 关门部门绑定角色的窗口 + */ + closeDeptRoleModalWindow: function() { + this.set('openDeptRoleWindow', false) + this.set('selectedRoles', []) + }, + + /** + * 保存部门与角色的绑定 + */ + saveDeptToRole: function() { + var model = get(this, 'model') + var deptSrv = get(this, 'deptSrv') + deptSrv + .saveDeptToRole(model.deptID, this.selectedRoles) + .then(res => { + if (res.status === 'success') { + swal('绑定部门角色成功!') + } else { + swal(res.message) + } + }) + this.set('openDeptRoleWindow', false) + this.set('selectedRoles', []) + }, + + /** + * 删除部门 + */ + deleteDept: function() { + var self = this + var model = get(this, 'model') + if (Ember.isBlank(model.deptID)) { + swal('请选择一个部门!') + return + } + var deptSrv = get(this, 'deptSrv') + swal( + { + title: '是否删除此部门?', + type: 'warning', + showCancelButton: true, + confirmButtonClass: 'btn-danger', + cancelButtonText: '取消', + confirmButtonText: '删除', + closeOnConfirm: false + }, + function(isConfirm) { + if (isConfirm) { + deptSrv.deleteDept(model.deptID).then(res => { + if ('success' === res.status) { + swal('删除部门成功!') + set(model, 'deptID', '') + self.queryDeptTree() + } else { + swal(res.message) + } + }) + } + } + ) + } + } +}) diff --git a/uam-web/app/dashboard/portal-management/user/index/route.js b/uam-web/app/dashboard/portal-management/user/index/route.js new file mode 100644 index 0000000000000000000000000000000000000000..638f1e86aad29eaa22e1b562cb89d545abf6f124 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user/index/route.js @@ -0,0 +1,41 @@ +import Ember from 'ember' +const { get, set, inject } = Ember + +export default Ember.Route.extend({ + queryParams: { + deptID: { + refreshModel: true + } + }, + permissions: [], + model: function(param) { + if (!param.deptID) { + param['deptID'] = '' + } + let ifTenant = window.localStorage.getItem("IS_MULTI_TENANT"); + this.set('permissions', window.sessionStorage.getItem("permissions").split(',')) + + return Ember.RSVP.hash({ + columns: [ + {propertyName: 'loginId',title: '登录名'}, + {propertyName: 'name',title: '姓名',template: 'partial/userLookUp'}, + ifTenant === 'true' ? {propertyName: 'tenantId',title: '租户'} : {}, + {propertyName: 'selGroups',title: '所属用户组',template: 'partial/userSelGroups'}, + {propertyName: 'deptName',title: '部门名称'}, + {propertyName: 'sourceType',title: '来源',template: 'partial/userSourcetype'}, + {propertyName: 'lastModifiedTime',title: '最后修改时间'}, + {propertyName: 'status',title: '状态',template: 'partial/userStatus'}, + this.permissions.includes("user.operate")? {title: '操作',template: 'partial/userOper'}: {} + + ], + deptID: param.deptID + }) + + }, + setupController: function(controller, model) { + set(model, 'permissions', this.permissions); + controller.set('model', model) + controller.initUser(model) + } + +}) diff --git a/uam-web/app/dashboard/portal-management/user/index/template.hbs b/uam-web/app/dashboard/portal-management/user/index/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..8e915cbfd635512c393643be4433214a1115b2e5 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user/index/template.hbs @@ -0,0 +1,288 @@ +<div class="inner-app"> + <div class="inner-app__context-bar context-bar"> + <span class="context-bar-nav-header"> + <span class="context-bar__icon"> + <i class="idcicon idcicon-usermanager"></i> 用户管理 + </span> + </span> + <span class="total-icons"> + <i class="point point-primary"></i> 用户信息 + </span> + + <span class="context-bar__right-button-group pull-right"> + <span class="input-group search"> + {{input type="text" value=filterString placeholder="请输入搜索内容"}} + {{io-icon type="search"}} + </span> + + {{#if (permission-check model.permissions "user.create")}} + <button class="io-btn io-btn-primary" {{action "viewPersonModalWindow" 'add'}} data-dismiss="modal">{{io-icon type="plus"}} 新建用户</button> + {{/if}} + + {{#if (permission-check model.permissions "user.import")}} + {{#link-to "dashboard.portalManagement.user.import"}} + <button class="io-btn io-btn-primary" data-dismiss="modal"> + <i class="fa fa-upload"></i>导入用户 + </button> + {{/link-to}} + {{/if}} + + <!--<a href="/portal/user/list/download?deptId={{modal.deptID}}&tenantId={{modal.tenantId}}">--> + {{#if (permission-check model.permissions "user.export")}} + <button class="io-btn io-btn-primary" data-dismiss="modal" {{action 'downloadUser'}}> + <i class="fa fa-download"></i>导出用户 + </button> + {{/if}} + + </span> + + + </div> + <div class="inner-app__nav"> + <div> + <span class="context-bar__icon"> + <i class="idcicon idcicon-build"></i> 部门信息 + {{#if (permission-check model.permissions "user.deptOperate")}} + <div style="float: right"> + <i style="cursor: pointer" title="新增部门" {{action 'viewDeptModalWindow' 'add'}}>{{io-icon type="plus"}}</i> + <i style="cursor: pointer" title="修改部门" {{action 'viewDeptModalWindow' 'edit'}}>{{io-icon type="edit"}}</i> + <i style="cursor: pointer" title="删除部门" {{action 'deleteDept'}}>{{io-icon type="delete"}}</i> + <i style="cursor: pointer" title="为部门绑定角色" {{action 'viewDeptRoleModalWindow' 'edit'}}><i class="idcicon idcicon-rolemanager"></i></i> + </div> + {{/if}} + </span> + </div> + <hr> + {{#if (permission-check model.permissions "user.deptTree")}} + {{#if model.deptTree}} + {{io-tree + model=model.deptTree + selected=selected + treeNodeIcon='idcicon idcicon-build' + treeNodeTemplate='partial/tree-node-with-icon' + onSelectNode='onSelectedFolderNode'}} + {{/if}} + {{/if}} + </div> + <div class="inner-app__main icon-management"> + <div class="row"> + <div class="row"> + {{#if loading}} + {{io-loading}} + {{else}} + {{#if (permission-check model.permissions "user.list")}} + {{#if model.columns}} + {{io-table + columns=model.columns + showIndexNumber=true + showGlobalFilter=false + indexNumberBase=model.indexNumber + allocateRole="editUserGroupAction" + allocateGroup = "editUserGroupAction" + viewPersonModalWindow = "viewPersonModalWindow" + delete = "deleteUser" + enabled = "enabledUser" + resetPW = "resetPW" + grantToken = "grantToken" + lookUpAction = "lookUpAction" + data=model.users}} + {{/if}} + {{#if model.paginationShow}} + <div class="row"> + {{io-pagination change="pageClick" count=model.meta.pages current=model.meta.offset}} + </div> + {{/if}} + {{/if}} + {{/if}} + </div> + </div> + </div> +</div> + +{{#io-modal show=openPersonModalWindow}} +<div class="modal fade" data-backdrop="static"> + <div class="modal-dialog modal-lg"> + <div class="modal-content"> + <div class="modal-header bg-primary"> + <button type="button" class="close" {{action 'closePersonModalWindow'}}>×</button> + <h4 class="modal-title">{{openPersonModalWindowTitle}}</h4> + </div> + {{#io-form-validator submitForm="saveUser"}} + <form class="form-horizontal"> + <div class="modal-body scroll-y" style="height: calc(100% - 200px);"> + <div class="panel-body row"style="width:800px; margin:auto;"> + <div style="display: none"> + {{io-input value=editUser.id }} + </div> + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" required=true help="" label="登录名:" }} + {{io-input value=editUser.loginId type="text" required=true data-error="请填写登录名" }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" required=true help="" label="姓名:" }} + {{io-input value=editUser.name type="text" required=true data-error="请填写用户名称" }} + {{/io-form-group}} + {{#if model.isAdd}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" required=true help="" label="密码:"}} + {{io-input value=editUser.password type="password" required=true data-error="请输入密码"}} + 注意:密码长度必须为8-16位,且必须包含大写字母、小写字母、数字和英文特殊字符! + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" required=true help="" label="确认密码:"}} + {{io-input value=editUser.confirmPassword type="password" required=true data-error="请输入确认密码"}} + {{/io-form-group}} + {{else}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" required=false help="" label="状态:"}} + {{io-input value=editUser.status type="status" readonly=true}} + {{/io-form-group}} + {{/if}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="部门:" }} + {{io-tree-select treeData=model.deptTree value=editUser.deptId }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" required=false help="" label="职务:"}} + {{io-input value=editUser.title type="text" required=false}} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" required=false help="" label="移动电话1:"}} + {{io-input value=editUser.mobile1 type="text" required=false}} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" required=false help="" label="移动电话2:"}} + {{io-input value=editUser.mobile2 type="text" required=false}} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" required=false help="" label="RTX:"}} + {{io-input value=editUser.rtx type="text" required=false}} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" required=false help="" label="办公电话1:"}} + {{io-input value=editUser.officeTel1 type="text" required=false}} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" required=false help="" label="办公电话2:"}} + {{io-input value=editUser.officeTel2 type="text" required=false}} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" required=false help="" label="员工类型:"}} + {{io-input value=editUser.employeeType type="text" required=false}} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" required=false help="" label="微信号:"}} + {{io-input value=editUser.weixin type="text" required=false}} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" required=false help="" label="邮箱:"}} + {{io-input value=editUser.email type="text" required=false}} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" required=false help="" label="备注:"}} + {{io-input value=editUser.remark type="text" required=false}} + {{/io-form-group}} + </div> + </div> + <div class="modal-footer"> + <button type="submit" class="io-btn io-btn-primary"> {{io-icon type="save"}}保存</button> + <button type="button" class="btn btn-default" {{action 'closePersonModalWindow'}}>关 闭</button> + </div> + </form> + {{/io-form-validator}} + </div> + </div> +</div> +{{/io-modal}} + +{{#io-modal show=openDeptModalWindow}} +<div class="modal fade" data-backdrop="static"> + <div class="modal-dialog modal-lg"> + <div class="modal-content"> + <div class="modal-header bg-primary"> + <button type="button" class="close" {{action 'closeDeptModalWindow'}}>×</button> + <h4 class="modal-title">{{openDeptModalWindowTitle}}</h4> + </div> + {{#io-form-validator submitForm="saveDept"}} + <form class="form-horizontal"> + <div class="modal-body scroll-y" style="height: calc(100% - 200px);"> + <div style="display: none"> + {{io-input value=editDept.id }} + </div> + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" required=true help="" label="部门编码:" }} + {{io-input value=editDept.code type="text" required=true data-error="请填写部门编码"}} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" required=true help="" label="部门名称:" }} + {{io-input value=editDept.displayName type="text" required=true data-error="请填写部门名称" }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="父部门:" }} + {{io-tree-select treeData=model.deptTree value=editDept.parentId }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" required=false help="" label="描述信息:" }} + {{io-textarea value=editDept.remark placeholder=""}} + {{/io-form-group}} + </div> + <div class="modal-footer"> + <button type="submit" class="io-btn io-btn-primary"> {{io-icon type="save"}}保存</button> + <button type="button" class="btn btn-default" {{action 'closeDeptModalWindow'}}>关 闭</button> + </div> + </form> + {{/io-form-validator}} + </div> + </div> +</div> +{{/io-modal}} + +{{#io-modal show=openDeptRoleWindow}} +<div class="modal fade" data-backdrop="static"> + <div class="modal-dialog modal-lg"> + <div class="modal-content"> + <div class="modal-header bg-primary"> + <button type="button" class="close" {{action 'closeDeptRoleModalWindow'}}>×</button> + <h4 class="modal-title">为部门绑定角色</h4> + </div> + {{#io-form-validator submitForm="saveDeptToRole"}} + <form class="form-horizontal"> + <div class="modal-body scroll-y" style="height: calc(100% - 200px);"> + <div class="row padding0" style="padding: 30px; width: 770px; margin: auto;"> + {{io-transfer + dataSource=allRoles + targetValues=selectedRoles}} + </div> + </div> + <div class="modal-footer"> + <button type="submit" class="io-btn io-btn-primary"> {{io-icon type="save"}}保存</button> + <button type="button" class="btn btn-default" {{action 'closeDeptRoleModalWindow'}}>关 闭</button> + </div> + </form> + {{/io-form-validator}} + </div> + </div> +</div> +{{/io-modal}} + +{{#io-modal show=openResetPasswordWindow}} +<div class="modal fade" data-backdrop="static"> + <div class="modal-dialog modal-lg" style="width:50%"> + <div class="modal-content"> + <div class="modal-header bg-primary"> + <button type="button" class="close" {{action 'closeResetPasswordWindow'}}>×</button> + <h4 class="modal-title">重置密码</h4> + </div> + <div class="modal-body scroll-y" style="height: calc(100% - 200px);text-align:center;" > + <br/><br/> + <h4 class="modal-title">用户密码重置成功,请发给用户登录验证。新密码为:</h4> + <br/><br/> + <h3 class="modal-title">{{openNewPasswordContent}}</h3> + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default" {{action 'closeResetPasswordWindow'}}>关 闭</button> + </div> + </div> + </div> +</div> +{{/io-modal}} + +{{#io-modal show=openGrantTokenWindow}} +<div class="modal fade" data-backdrop="static"> + <div class="modal-dialog modal-lg" style="width:50%"> + <div class="modal-content"> + <div class="modal-header bg-primary"> + <button type="button" class="close" {{action 'closeGrantTokenWindow'}}>×</button> + <h4 class="modal-title">系统访问的Token(过期时间为:2049-10-01 15:00)</h4> + </div> + <div class="modal-body scroll-y" style="height: calc(100% - 200px);text-align:left;" > + <br/><br/> + <h3 class="modal-title">{{openGrantTokenContent}}</h3> + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-default" {{action 'closeGrantTokenWindow'}}>关 闭</button> + </div> + </div> + </div> +</div> +{{/io-modal}} \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/user/operate/controller.js b/uam-web/app/dashboard/portal-management/user/operate/controller.js new file mode 100644 index 0000000000000000000000000000000000000000..ae0ce1760c44e0b9c105a860ad70b7114f0ed337 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user/operate/controller.js @@ -0,0 +1,206 @@ +import Ember from 'ember' +const { set, get, inject, RSVP } = Ember +export default Ember.Controller.extend({ + queryParams: ['deptID', 'type', 'source'], + portalUserSrv: inject.service('api/portal-user/service'), + portalGroupSrv: inject.service('api/portal-user-group/service'), + portalCommonSrv: inject.service('api/portal-common/service'), + apiSrv: inject.service('api/portal-api/service'), + userId: '', + + unSelectedRoleList: [], + selectedRoleList: [], + unSelectedGroupList: [], + selectedGroupList: [], + + /////////// 转换数组,将数据转换为 + parseTransferList: function(list) { + list.forEach(item => { + set(item, 'label', item.name) + set(item, 'value', item.id) + }) + return list + }, + + /** + * 初始化用户信息 + * @param {[type]} model [description] + * @return {[type]} [description] + */ + initOperateUser: function(model) { + this.queryUserGroupType(); + var userId = model.id, + portalUserSrv = get(this, 'portalUserSrv'), + groupTypeSrv = get(this, 'apiSrv'), + self = this + var tenantId = window.sessionStorage.getItem('tenant') + + //若id为空,说明为新增,初始化所用的用户组和角色信息 + RSVP.hash({ + allGroups: groupTypeSrv.getUserGroupByTypeAndTenantId("default",tenantId).then(res => { + return res.list + }), + userData: portalUserSrv.queryById(userId).then(res => { + return res.item + }) + }).then(res => { + var allGroups = res.allGroups, + userData = res.userData + ///////// 已经选择的用户组信息 ////////// + var selGroups = [] + + if (userData) { + selGroups = userData.selGroups + + allGroups.forEach(item => { + if (selGroups.contains(item.id)) { + set(item, 'chose', item.id) + } + }) + + } + set(model, 'backGroupList', Ember.copy(selGroups)) + set(model, 'selGroups', selGroups) + set(model, 'groupSource', self.parseTransferList(allGroups)) + set(self, 'model', model) + }) + }, + + /** + * 比较两个list,将删除,新增标志与id号进行拼接 + * @param {[type]} backList [description] + * @param {[type]} selectedList [description] + * @return {[type]} [description] + */ + compareList: function(backList, selectedList) { + var idListUnion = [] //id号与操作的拼接数据 id:I id:D + + //将selectedList与backList对比 + //若两个list都存在相同的id,从backList当中移除,只保留未选择的 + //若selectedList当中的id在backList当中不存在,则标记为I + selectedList.forEach(item => { + if (backList.contains(item)) { + backList.removeAt(backList.indexOf(item)) + } else { + idListUnion.addObject(item + ':I') + } + }) + //将backList里面所有的id都标记为D + backList.forEach(item => { + idListUnion.addObject(item + ':D') + }) + return idListUnion.join() + }, + + /** + * 查询用户组所有类型 + * @return {[type]} [description] + */ + queryUserGroupType: function(){ + let groupTypeSrv = get(this, 'apiSrv'); + let tenant=window.sessionStorage.getItem("tenant"); + let model = get(this, 'model') + groupTypeSrv.getUserGroupType(tenant).then(resp => { + if (resp.status === 'success') { + set(model, 'groupTypeTree', resp.list); + } else { + swal(resp.message) + } + }); + }, + + /** + * 监听用户组类型选择操作 + * @return {[type]} [description] + */ + observeUserGroupType: function() { + let groupTypeSrv = get(this, 'apiSrv'); + let tenant=window.sessionStorage.getItem("tenant"); + let model = get(this, 'model'); + const self = this + groupTypeSrv.getUserGroupByTypeAndTenantId(model.groupType,tenant).then(resp => { + if (resp.status === 'success') { + let userGroups = resp.list; + Ember.set(model, 'groupSource', self.parseTransferList(userGroups)); + } else { + swal(resp.message) + } + }); + }.observes('model.groupType'), + + /** + * 事件集合 + * @type {Object} + */ + actions: { + linkAction: function(targetRoute) { + var param = { + id: '', + type: 'ALL', + source: 'user.operate' + } + this.transitionToRoute( + 'dashboard.portalManagement.' + targetRoute + '.operate', + { + queryParams: param + } + ) + }, + /** + * tab标签切换 + * @param {[type]} selectTab [description] + * @return {[type]} [description] + */ + selectTabAction: function(selectTab) { + set(this, 'currentTab', selectTab) + }, + + /** + * 返回链接 + * @return {[type]} [description] + */ + backUserAction: function() { + var source = get(this, 'source'), + model = get(this, 'model') + if (Ember.isBlank(source)) { + this.transitionToRoute('dashboard.portalManagement.user', { + queryParams: { + deptID: model.deptID + } + }) + } else { + this.transitionToRoute('dashboard.portalManagement.' + source) + } + }, + + /** + * 保存用户组操作 + * @return {[type]} [description] + */ + saveGroupAction: function() { + var model = get(this, 'model'), + userId = get(model, 'id'), + selectedGroupList = get(model, 'selGroups'), + backGroupList = get(model, 'backGroupList'), + portalUserSrv = get(this, 'portalUserSrv'), + apiSrv = get(this, 'apiSrv') + + var selGroups = this.compareList(backGroupList, selectedGroupList) + + let userForm = { + id: userId, + tenantId: window.sessionStorage.getItem('tenant'), + selGroups: selGroups + } + + portalUserSrv.allocate(userForm).then(function(data) { + if ('success' === data.status) { + swal('保存成功') + set(model, 'backGroupList', Ember.copy(selectedGroupList)) + } else { + swal('保存失败', data.message) + } + }) + } + } +}) diff --git a/uam-web/app/dashboard/portal-management/user/operate/route.js b/uam-web/app/dashboard/portal-management/user/operate/route.js new file mode 100644 index 0000000000000000000000000000000000000000..503cd723170a574ef0d3a3e6e54dd4588bc6fe22 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user/operate/route.js @@ -0,0 +1,28 @@ +import Ember from 'ember'; +var hash = Ember.RSVP.hash; +export default Ember.Route.extend({ + queryParams: { + deptID: { + refreshModel: true + }, + type: { + refreshModel: true + }, + source: { + refreshModel: true + } + }, + model: function(params) { + return hash({ + id: params.id, + deptID: params.deptID, + type: params.type, + groupSource: [], + selGroups: [] + }); + }, + setupController: function(controller, model) { + controller.set('model', model); + controller.initOperateUser(model); + } +}); diff --git a/uam-web/app/dashboard/portal-management/user/operate/template.hbs b/uam-web/app/dashboard/portal-management/user/operate/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..a66a93f1876428ca6980d7614aabd7ea9ecb967c --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user/operate/template.hbs @@ -0,0 +1,36 @@ +<div class="inner-app"> + <div class="inner-app__context-bar context-bar"> + {{!-- <span class="context-bar-nav-header"> --}} + <span class="h4 context-bar__icon" style="margin-left: 15px;"> + {{#link-to 'dashboard.portalManagement.user'}} {{io-icon type="left"}}{{/link-to}} + {{#link-to 'dashboard.portalManagement.user'}} 用户管理 {{/link-to}} / <span>分配用户组</span> + </span> + {{!-- </span> --}} + </div> + <div class="inner-app__main collapsed"> + <div class="container-fluid" style="width: 750px; margin: 30px auto 20px;"> + <div style="margin-bottom:8px"> + {{!-- {{#io-form-group required=false help="" label="用户组类型:" }} --}} + <label for="">用户组类型:</label> + {{#io-select value=model.groupType placeholder="默认" width=150 }} + {{#each model.groupTypeTree as |queryType|}} + {{#io-option value=queryType.code}} + {{queryType.value}} + {{/io-option}} + {{/each}} + {{/io-select}} + {{!-- {{/io-form-group}} --}} + </div> + + + <div class="row padding0"> + {{io-transfer + dataSource=model.groupSource + targetValues=model.selGroups}} + </div> + </div> + <div class="row" style="text-align:center;"> + <button {{action "saveGroupAction"}} class="io-btn io-btn-primary"> {{io-icon type="save"}} 保存</button> + </div> + </div> +</div> \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/user/route.js b/uam-web/app/dashboard/portal-management/user/route.js new file mode 100644 index 0000000000000000000000000000000000000000..26d9f3124ec6aa902b1a208b6d4cbfb62083a3ea --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user/route.js @@ -0,0 +1,4 @@ +import Ember from 'ember'; + +export default Ember.Route.extend({ +}); diff --git a/uam-web/app/dashboard/portal-management/user/template.hbs b/uam-web/app/dashboard/portal-management/user/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..c24cd68950a9a5c52c59d7020c3a30a00adb094d --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user/template.hbs @@ -0,0 +1 @@ +{{outlet}} diff --git a/uam-web/app/dashboard/portal-management/user/view/controller.js b/uam-web/app/dashboard/portal-management/user/view/controller.js new file mode 100644 index 0000000000000000000000000000000000000000..14393a79cc30ce96a360b465f2ef8cc2a8afa66c --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user/view/controller.js @@ -0,0 +1,165 @@ +import Ember from 'ember'; +const {get, + set, + inject +} = Ember; +const pageSize = 10; +export default Ember.Controller.extend({ + userSrv: inject.service('api/portal-user/service'), + apiSrv: inject.service('api/portal-api/service'), + groupSrv: inject.service('api/portal-user-group/service'), + roleSrv: inject.service('api/portal-role/service'), + userSteps: [{ + title: "用户信息", + status: "process", + active: true, + index: 0, + icon: "usermanager" + }, { + title: "用户组信息", + status: "wait", + index: 1, + icon: "usergroup" + }, { + title: "角色信息", + status: "wait", + index: 2, + icon: "rolemanager" + }, { + title: "权限信息", + status: "wait", + index: 3, + icon: "permissiondistribution", + last: true + }], + loading: false, + + initUserView: function(model) { + let userId = model.id; + if (Ember.isBlank(userId)) { + swal("用户id不能为空,请确认!"); + return; + } + this.send('stepAction', 0); + this.queryUserById(userId); + }, + + queryUserById: function(id) { + let apiSrv = get(this, 'apiSrv'), + self = this; + + apiSrv.queryUserById(id).then(res => { + if ("success" === res.status) { + set(self, 'userForm', res.item); + } else { + swal("查询用户信息失败", res.message); + } + }); + }, + + queryPermissionsById: function(id) { + let userSrv = get(this, 'userSrv'), + model = get(this, 'model'); + + userSrv.queryPermissionsById(id).then(res => { + if ("success" === res.status) { + set(model, 'permissions', res.content.links.PERMISSION.sortBy("systemName")); + } else { + swal("查询用户关联的权限信息失败,", res.message); + } + }); + }, + + queryRolePageByUserIdAndCnd: function(cnd, pageNo) { + let roleSrv = get(this, 'roleSrv'), + model = get(this, 'model'); + + let queryForm = { + id: model.id, + cnd: cnd, + pageNo: pageNo, + pageSize: pageSize + }; + + set(this, 'loading', true); + roleSrv.queryRolePageByUserIdAndCnd(queryForm).then(res => { + set(this, 'loading', false); + if ("success" === res.status) { + set(model, 'roles', res.list); + set(model, 'rolemeta', res.meta); + set(model, 'indexNumber', (pageNo - 1) * pageSize + 1); + } else { + swal("查询用户关联的角色信息失败,", res.message); + } + }); + }, + + queryGroupPageByUserIdAndCnd: function(cnd, pageNo) { + let groupSrv = get(this, 'groupSrv'), + model = get(this, 'model'); + + let queryForm = { + id: model.id, + cnd: cnd, + pageNo: pageNo, + pageSize: pageSize + }; + + set(this, 'loading', true); + groupSrv.queryGroupPageByUserIdAndCnd(queryForm).then(res => { + set(this, 'loading', false); + if ("success" === res.status) { + set(model, 'groups', res.list); + set(model, 'groupmeta', res.meta); + set(model, 'indexNumber', (pageNo - 1) * pageSize + 1); + } else { + swal("查询用户关联的用户组失败,", res.message); + } + }); + }, + + actions: { + /** + * 点击步骤操作 + * @param {[type]} index [description] + * @return {[type]} [description] + */ + stepAction: function(index) { + let userSteps = get(this, 'userSteps'), + model = get(this, 'model'); + let currentStep = userSteps.findBy("index", index); + + userSteps.forEach(item => { + if (item.index !== index) { + set(item, 'status', 'wait'); + return; + } + set(currentStep, 'status', 'process'); + }); + set(this, 'currentTab', currentStep.title); + + if (index === 0) { + this.queryUserById(model.id); + } + + if (index === 1) { + this.queryGroupPageByUserIdAndCnd("", 1); + } + + if (index === 2) { + this.queryRolePageByUserIdAndCnd("", 1); + } + + if (index === 3) { + this.queryPermissionsById(model.id); + } + }, + + groupPageClick: function(pageNo) { + this.queryGroupPageByUserIdAndCnd("", pageNo); + }, + rolePageClick: function(pageNo) { + this.queryRolePageByUserIdAndCnd("", pageNo); + } + } +}); \ No newline at end of file diff --git a/uam-web/app/dashboard/portal-management/user/view/route.js b/uam-web/app/dashboard/portal-management/user/view/route.js new file mode 100644 index 0000000000000000000000000000000000000000..963f34f892d1dd11ab80d4ce439813649e0ec474 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user/view/route.js @@ -0,0 +1,18 @@ +import Ember from 'ember'; + +export default Ember.Route.extend({ + model: function(param) { + let groupColumns = [{ "propertyName": "name", "title": "名称" }, { "propertyName": "remark", "title": "备注" }, { "propertyName": "gmtCreate", "title": "创建时间" }]; + let roleColumns = [{ "propertyName": "code", "title": "编码" }, { "propertyName": "name", "title": "名称" }, { "propertyName": "remark", "title": "备注" }, { "propertyName": "gmtCreate", "title": "创建时间" }]; + + Ember.set(param, 'groupColumns', groupColumns); + Ember.set(param, 'roleColumns', roleColumns); + Ember.set(param, 'indexNumber', 1); + return param; + }, + setupController: function(controller, model) { + controller.set('model', model); + controller.initUserView(model); + } + +}); diff --git a/uam-web/app/dashboard/portal-management/user/view/template.hbs b/uam-web/app/dashboard/portal-management/user/view/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..6a913e96e34251241982efc1a45510ab279511c2 --- /dev/null +++ b/uam-web/app/dashboard/portal-management/user/view/template.hbs @@ -0,0 +1,142 @@ +<div class="inner-app"> + <div class="inner-app__context-bar context-bar"> + <span class="h4 context-bar__icon" style="margin-left: 15px;"> + {{#link-to 'dashboard.portalManagement.user'}} {{io-icon type="left"}}{{/link-to}} + {{#link-to 'dashboard.portalManagement.user'}} 用户管理 {{/link-to}} / <span>{{userForm.name}}</span> + </span> + </div> + + <div class="inner-app__main collapsed"> + <div class="row" style="padding: 20px;"> + <div class="io-steps io-steps-horizontal io-steps-label-horizontal" style="display: inline-block; text-align: center; padding-left: 100px;"> + {{#each userSteps as |step|}} + <div class="io-steps-item io-steps-status-{{step.status}}" style="margin-right: -18.4492px; width: 246px; text-align: left; cursor: pointer;" {{action "stepAction" step.index}}> + {{#unless step.last}} + <div class="io-steps-tail"> <i> </i> </div> + {{/unless}} + <div class="io-steps-step"> + <div class="io-steps-head"> + <div class="io-steps-head-inner"> + {{#if (eq step.status "finish")}} + <span class="io-steps-icon ioicon ioicon-check"> + </span> + {{else}} + <i class='idcicon idcicon-{{step.icon}}'></i> + {{/if}} + </div> + </div> + <div class="io-steps-main"> + <div class="io-steps-title"> + {{step.title}} + </div> + </div> + </div> + </div> + {{/each}} + </div> + </div> + <div class="tab-content"> + <div role="tabpanel" class="tab-pane {{if (eq '用户信息' currentTab) 'active'}}" id="info"> + {{#io-form submitForm="saveResAction" class="panel form-horizontal" readonly=true}} + <div class="panel-body row"style="width:1000px; margin:auto;"> + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="部门:" }} + {{io-input value=userForm.deptName type="text" data-error="" }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="姓名:" }} + {{io-input value=userForm.name type="text" data-error="" }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="登录名:" }} + {{io-input value=userForm.loginId type="text" data-error="" }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="员工类型:" }} + {{io-input value=userForm.employeeType type="text" data-error="" }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="状态:" }} + {{io-input value=userForm.status type="text" data-error="" }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="手机号码1:" }} + {{io-input value=userForm.mobile1 type="text" data-error="" }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="手机号码2:" }} + {{io-input value=userForm.mobile2 type="text" data-error="" }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="RTX:" }} + {{io-input value=userForm.rtx type="text" data-error="" }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="办公号码1:" }} + {{io-input value=userForm.officeTel1 type="text" data-error="" }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="办公号码2:" }} + {{io-input value=userForm.officeTel2 type="text" data-error="" }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="微信号码:" }} + {{io-input value=userForm.weixin type="text" data-error="" }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="邮箱地址:" }} + {{io-input value=userForm.email type="text" data-error="" }} + {{/io-form-group}} + {{#io-form-group labelColClass="col-md-8" inputColClass="col-md-16" help="" label="备注:" }} + {{io-textarea style="font-size:10px" value=userForm.remark rows="6"}} + {{/io-form-group}} + </div> + {{/io-form}} + </div> + <div role="tabpanel" class="tab-pane {{if (eq '用户组信息' currentTab) 'active'}}" id="info"> + <div class="container-fluid user-list" style="width:1000px; margin:auto;"> + {{#if loading}} + {{io-loading}} + {{else}} + {{io-table + columns=model.groupColumns + showIndexNumber=true + showGlobalFilter=true + indexNumberBase=model.indexNumber + data=model.groups}} + <div class="row"> + {{io-pagination change="groupPageClick" count=model.groupmeta.pages current=model.groupmeta.offset}} + </div> + {{/if}} + </div> + </div> + <div role="tabpanel" class="tab-pane {{if (eq '角色信息' currentTab) 'active'}}" id="role"> + <div class="container-fluid user-list" style="width:1000px; margin:auto;"> + {{#if loading}} + {{io-loading}} + {{else}} + {{io-table + columns=model.roleColumns + showIndexNumber=true + showGlobalFilter=true + indexNumberBase=model.indexNumber + data=model.roles}} + <div class="row"> + {{io-pagination change="rolePageClick" count=model.rolemeta.pages current=model.rolemeta.offset}} + </div> + {{/if}} + </div> + </div> + + <div role="tabpanel" class="tab-pane {{if (eq '权限信息' currentTab) 'active'}}" id="user"> + <div class="container-fluid user-list" style="width:1000px; margin:auto;"> + <div class="user-list-selected"> + <p> + {{#each model.permissions as | per|}} + <h3>{{per.systemName}}--{{per.resName}}</h3> + <hr> + <br> + {{#each per.permissions as | item|}} + <span class="io-tag"> + <span class="io-tag-text">{{item.authResName}}</span> + </span> + {{/each}} + <br> + <br> + {{/each}} + </p> + </div> + </div> + <br> + </div> + </div> + </div> +</div> \ No newline at end of file diff --git a/uam-web/app/dashboard/route.js b/uam-web/app/dashboard/route.js new file mode 100644 index 0000000000000000000000000000000000000000..857787f6f59c55416cae1080165404596b0b944a --- /dev/null +++ b/uam-web/app/dashboard/route.js @@ -0,0 +1,27 @@ +import Ember from 'ember'; +import AuthenticatedRouteMixin from 'clouduam-web/mixins/authenticated-route-mixin'; +export default Ember.Route.extend(AuthenticatedRouteMixin, { + model: function(params) { + var authInfo = this.get("session").authInfo(); + + var user = authInfo.user; + var tenantId = user.tenantId; + let promises = {}; + var tenant = window.sessionStorage.getItem("tenant"); + if (tenant != null && tenant != '' && tenant != 'default') { + tenantId = tenant; + } + user.tenant = tenantId; + promises.user = user; + promises.permissions =window.sessionStorage.getItem("permissions").split(','); + return Ember.RSVP.hash(promises).then(results => results); + }, + + setupController: function(controller, model) { + let ifTenant= window.localStorage.getItem("IS_MULTI_TENANT"); + model.ifTenant = (ifTenant=='true'); + + controller.set('model', model); + + } +}); \ No newline at end of file diff --git a/uam-web/app/dashboard/template.hbs b/uam-web/app/dashboard/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..6b60cf6d6d8e3f1febccccac4c27f6628cca27f9 --- /dev/null +++ b/uam-web/app/dashboard/template.hbs @@ -0,0 +1,64 @@ +<div class="app-body"> + <div class="app-body__menu" style="top: 0;width:170px;"> + {{#io-menu mode="inline" style="width: 170px;"}} + + {{#if (permission-check model.permissions "user")}} + {{#io-menu-item selected=(eq activeMenu 'user')}} + <a href="" {{action "linkToAction" 'user' }}> + <i class="idcicon idcicon-usermanager"></i> + 用户管理 + </a> + {{/io-menu-item}} + {{/if}} + + {{#if (permission-check model.permissions "userGroup")}} + {{#io-menu-item selected=(eq activeMenu 'userGroup')}} + <a href="" {{action "linkToAction" 'userGroup' }}> + <i class="idcicon idcicon-usergroup"></i> + 用户组管理 + </a> + {{/io-menu-item}} + {{/if}} + + {{#if (permission-check model.permissions "role")}} + {{#io-menu-item selected=(eq activeMenu 'role')}} + <a href="" {{action "linkToAction" 'role' }}> + <i class="idcicon idcicon-rolemanager"></i> + 角色管理 + </a> + {{/io-menu-item}} + {{/if}} + + {{#if (permission-check model.permissions "resource")}} + {{#io-menu-item selected=(eq activeMenu 'resource')}} + <a href="" {{action "linkToAction" 'resource' }}> + <i class="idcicon-permissionmanager idcicon"></i> + 权限资源管理 + </a> + {{/io-menu-item}} + {{/if}} + + {{#if (permission-check model.permissions "permission")}} + {{#io-menu-item selected=(eq activeMenu 'permission')}} + <a href="" {{action "linkToAction" 'permission' }}> + <i class="idcicon idcicon-permissiondistribution"></i> + 权限资源分配 + </a> + {{/io-menu-item}} + {{/if}} + + {{#if (permission-check model.permissions "tenant")}} + {{#io-menu-item selected=(eq activeMenu 'tenant')}} + <a href="" {{action "linkToAction" 'tenant' }}> + <i class="idcicon idcicon-permissiondistribution"></i> + 租户管理 + </a> + {{/io-menu-item}} + {{/if}} + + {{/io-menu}} + </div> + <div class="app-body__main clearfix" style="left:170px;"> + {{outlet}} + </div> +</div> \ No newline at end of file diff --git a/uam-web/app/error/template.hbs b/uam-web/app/error/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..c98f939b657cdef01af2ec42bac85f2bf89bb94d --- /dev/null +++ b/uam-web/app/error/template.hbs @@ -0,0 +1,7 @@ +<div class="error-message" style="margin: auto; margin-top: 30vh; width: 600px;"> + {{io-alert + message="系统错误,请联系管理员" + description=model.message + type="error" + showIcon=true}} +</div> diff --git a/uam-web/app/helpers/.gitkeep b/uam-web/app/helpers/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/uam-web/app/helpers/boolean-data-type.js b/uam-web/app/helpers/boolean-data-type.js new file mode 100644 index 0000000000000000000000000000000000000000..8639e013ec0b1e71bd1d0386a37eabfa1a58f68c --- /dev/null +++ b/uam-web/app/helpers/boolean-data-type.js @@ -0,0 +1,7 @@ +import Ember from 'ember'; + +export function booleanDataType(params) { + return params[0] === true ? '是' : '否'; +} + +export default Ember.Helper.helper(booleanDataType); diff --git a/uam-web/app/helpers/ci-attr-data-type.js b/uam-web/app/helpers/ci-attr-data-type.js new file mode 100644 index 0000000000000000000000000000000000000000..6970aeeaa4526136d31942e6dfa8a63a378c40f4 --- /dev/null +++ b/uam-web/app/helpers/ci-attr-data-type.js @@ -0,0 +1,19 @@ +import Ember from 'ember'; + +const dataTypes = { + 'string': '字符型', + 'boolean': '布尔型', + 'integer': '整型', + 'number': '浮点型', + 'enum': '枚举型', + 'datetime': '日期型', + 'date': '日期时间型' +}; + +export function ciAttrDataType(params) { + let _name = dataTypes[params[0]]; + + return _name ? _name : '未知数据类型'; +} + +export default Ember.Helper.helper(ciAttrDataType); diff --git a/uam-web/app/helpers/io-date-format.js b/uam-web/app/helpers/io-date-format.js new file mode 100644 index 0000000000000000000000000000000000000000..da8e2dc3087d1ba7d03d3095564127bd430b47c4 --- /dev/null +++ b/uam-web/app/helpers/io-date-format.js @@ -0,0 +1,41 @@ +import Ember from 'ember'; + +const formatType = ["yyyy-mm-dd", "yyyy-mm-dd HH:MM:ss", "yyyy年mm月dd日"]; + +export default Ember.Helper.extend({ + compute: function(param, hash) { + var date = this.getDate(param); + var year = date.getFullYear(), + month = date.getMonth() + 1, + day = date.getDate(), + hour = "0" + date.getHours(), + min = "0" + date.getMinutes(), + sec = "0" + date.getSeconds(); + + var index = formatType.indexOf(hash.formatType); + + if (index === -1) { + return year + "-" + month + "-" + day; + } + + if (index === 0) { + return year + "-" + month + "-" + day; + } + + if (index === 1) { + return year + "-" + month + "-" + day + " " + hour.substr(hour.length - 2) + ":" + min.substr(min.length - 2) + ":" + sec.substr(sec.length - 2); + } + + if (index === 2) { + return year + '年' + month + '月' + day + '日'; + } + return ""; + }, + getDate: function(date) { + if (Ember.isBlank(date)) { + return new Date(); + } else { + return new Date(date[0]); + } + } +}); diff --git a/uam-web/app/helpers/io-moment.js b/uam-web/app/helpers/io-moment.js new file mode 100644 index 0000000000000000000000000000000000000000..8175cc077156ce035e5d4f0e376ac38c6fad6a8b --- /dev/null +++ b/uam-web/app/helpers/io-moment.js @@ -0,0 +1,9 @@ +import Ember from 'ember'; +const moment = window.moment; + +export function ioMoment(params, hash) { + var date = moment(params[0]); + return date.format(hash.format); +} + +export default Ember.Helper.helper(ioMoment); diff --git a/uam-web/app/helpers/permission-check.js b/uam-web/app/helpers/permission-check.js new file mode 100644 index 0000000000000000000000000000000000000000..cc5e421b5a8ddd42628b3dba4847985abe62cb35 --- /dev/null +++ b/uam-web/app/helpers/permission-check.js @@ -0,0 +1,15 @@ +import Ember from 'ember'; + +export function permissionCheck(param) { + if(param.length < 2){ + return false; + } + for(var i=0;i<param[0].length;i++){ + if(param[0][i] === param[1]){ + return true; + } + } + return false; +} + +export default Ember.Helper.helper(permissionCheck); \ No newline at end of file diff --git a/uam-web/app/index.html b/uam-web/app/index.html new file mode 100644 index 0000000000000000000000000000000000000000..fa24baf8816af85aaf8db8298ba567035c0d9734 --- /dev/null +++ b/uam-web/app/index.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!--[if IE 9]> +<html lang="zh-cmn-Hans" class="lt-ie10 ie9 no-js"> <![endif]--> + <!--[if !IE]><!--> + <html lang="zh-cmn-Hans"> + <!--<![endif]--> + <head> + <meta charset="utf-8"/> + <title>权限管理</title> + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/> + <meta content="width=device-width, initial-scale=1" name="viewport"/> + <meta name="description" content=""> + {{content-for 'head'}} + <link rel="stylesheet" href="assets/vendor.css"> + <link rel="stylesheet" href="assets/bootstrap.css"> + <link rel="stylesheet" href="assets/common.css"> + <link rel="stylesheet" href="assets/clouduam-web.css"> + {{content-for 'head-footer'}} + </head> + <body> + {{content-for 'body'}} + <div id="AppRoot"></div> + <script src="vendor/ieshim/normalizeconsole.js"></script> + <script src="vendor/gojs/go.js"></script> + <script src="vendor/state-machine.js"></script> + <script src="assets/vendor.js"></script> + <script src="assets/clouduam-web.js"></script> + {{content-for 'body-footer'}} + </body> + </html> \ No newline at end of file diff --git a/uam-web/app/loading/template.hbs b/uam-web/app/loading/template.hbs new file mode 100644 index 0000000000000000000000000000000000000000..74308b1c4bd2d70fa21b079cd1cc3703ef822317 --- /dev/null +++ b/uam-web/app/loading/template.hbs @@ -0,0 +1,10 @@ +<div class="loading-spin"> + <div class="io-spin io-spin-spining" > + <span class="io-spin-dot io-spin-dot-first" > + </span> + <span class="io-spin-dot io-spin-dot-second" > + </span> + <span class="io-spin-dot io-spin-dot-third" > + </span> + </div> +</div> diff --git a/uam-web/app/mixins/authenticated-route-mixin.js b/uam-web/app/mixins/authenticated-route-mixin.js new file mode 100644 index 0000000000000000000000000000000000000000..36facb59a7debaebba3e916ec99ec88cdc4167b4 --- /dev/null +++ b/uam-web/app/mixins/authenticated-route-mixin.js @@ -0,0 +1,38 @@ +import Ember from 'ember'; + +const { + service +} = Ember.inject; + +export default Ember.Mixin.create({ + session: service('auth-service/service'), + /** + * [beforeModel description] + * @param {[type]} transition [description] + * @return {[type]} [description] + */ + beforeModel(transition) { + var authInfo = this.get("session").authInfo(); + var user = authInfo.user; + + if (!authInfo.authenticated) { + transition.abort(); + this.set('session.attemptedTransition', transition); + Ember.run.later(() => { + location = authInfo.login; + }, 10); + } else { + // 如果没有login的权限,不允许进入 + let permissions = window.sessionStorage.getItem("permissions").split(','); + if (authInfo.user.loginName !== "admin" && !permissions.includes("login")) { + this.transitionTo('error', "用户无登陆权限,请确认!"); + Ember.run.later(() => { + document.cookie = "access-token=" + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT;'; + location.href = "/"; + }, 3000); + } + return this._super(...arguments); + } + return null; + } +}); \ No newline at end of file diff --git a/uam-web/app/mixins/unauthenticated-route-mixin.js b/uam-web/app/mixins/unauthenticated-route-mixin.js new file mode 100644 index 0000000000000000000000000000000000000000..f2bfca94e5ece20d322ca8c5eabe67b5f9b3d4a2 --- /dev/null +++ b/uam-web/app/mixins/unauthenticated-route-mixin.js @@ -0,0 +1,28 @@ +import Ember from 'ember'; + +const { service } = Ember.inject; + +export default Ember.Mixin.create({ + authSrv: service('auth-service/service'), + /** + * [beforeModel description] + * @param {[type]} transition [description] + * @return {[type]} [description] + */ + beforeModel(transition) { + var user = this.get("authSrv").getUser(); + if (user) { + // 如果没有RBAC的权限,不允许进入 + let permissions = authInfo.user.authorizationInfo.permissions; + + if (!permissions.RBAC) { + this.transitionToRoute('error', "用户没有系统登陆权限,请确认"); + return; + } + transition.abort(); + this.transitionTo('dashboard.srvManagement.srvBpAppInfo.bpList'); + } else { + return this._super(...arguments); + } + } +}); diff --git a/uam-web/app/resolver.js b/uam-web/app/resolver.js new file mode 100644 index 0000000000000000000000000000000000000000..2fb563d6c0488f41bec454fe1fa7c229975a58df --- /dev/null +++ b/uam-web/app/resolver.js @@ -0,0 +1,3 @@ +import Resolver from 'ember-resolver'; + +export default Resolver; diff --git a/uam-web/app/router.js b/uam-web/app/router.js new file mode 100644 index 0000000000000000000000000000000000000000..ca546fc15ee021e5416c7e86a60ac4d6427d9979 --- /dev/null +++ b/uam-web/app/router.js @@ -0,0 +1,56 @@ +import Ember from 'ember' +import config from './config/environment' + +const Router = Ember.Router.extend({ + location: config.locationType +}) + +Router.map(function() { + this.route('dashboard', function() { + this.route('error') + this.route('portalManagement', function() { + this.route('userGroup', function() { + this.route('operate') + this.route('view', { + path: 'view/:id' + }) + }) + this.route('user', function() { + this.route('operate', { + path: 'operate/:id' + }) + this.route('view', { + path: 'view/:id' + }) + this.route('import'); + this.route('importPriview', { + path: 'importPriview/:id' + }); + }) + this.route('role', function() { + this.route('operate') + this.route('view', { + path: 'view/:id' + }) + }) + this.route('permission', function() { + this.route('reverse') + }) + this.route('resource', function() { + this.route('operate', { + path: 'operate/:id' + }) + this.route('view', { + path: 'view/:id' + }) + }) + this.route('tenant') + }) + }) + this.route('authenticated') + this.route('error', { + path: 'error/:message' + }) +}) + +export default Router diff --git a/uam-web/app/services/api/portal-api/service.js b/uam-web/app/services/api/portal-api/service.js new file mode 100644 index 0000000000000000000000000000000000000000..faa20a3f5bbc4793811038fa45da9a63cef9ea71 --- /dev/null +++ b/uam-web/app/services/api/portal-api/service.js @@ -0,0 +1,200 @@ +/* + * 权限资源管理 + * 这里的接口对应java中的 PortalUserGroupController提供的api,具体见java中PortalUserGroupController.java的实现 + * 2015-10-28 14:30:49 + */ +import Ember from 'ember' +var ajax = Ember.$.ajax + +export default Ember.Service.extend({ + /** + * 查询部门信息 + * @param {[type]} code [description] + * @return {[type]} [description] + */ + queryDepartment: function(tenantId) { + var url = '/rbac/api/dept/tree' + //生成发请求数据对象 + var data = {} + data.tenantId = tenantId + data.treeStyle = 'ioTree' + //发送ajax请求 + return ajax({ + method: 'GET', + url: url, + data: data + }) + }, + + /** + * 根据deptID获取权限资源数据 + * @param {[type]} resType [description] + * @return {[type]} [description] + */ + queryResByResType: function(resType,tenantId) { + var url = '/api/v1/res' + //生成发请求数据对象 + var data = {} + data.resType = resType; + data.tenantId = tenantId; + + //发送ajax请求 + return ajax({ + method: 'GET', + url: url, + data: data + }) + }, + + /** + * 根据部门id查询人员信息 + * @param {[type]} deptID [description] + * @return {[type]} [description] + */ + queryUserByDeptId: function(deptId, pageNo, pageSize, tenant, name) { + var url = '/portal/user/pageList' + //生成发请求数据对象 + var data = {} + data.deptId = deptId + data.pageNo = pageNo + data.pageSize = pageSize + data.tenantId = tenant + data.name = name + + //发送ajax请求 + return ajax({ + method: 'GET', + url: url, + data: data + }) + }, + + /** + * 根据部门id查询人员信息 + * @param {[type]} deptID [description] + * @return {[type]} [description] + */ + queryUserByCnd: function(tenantId, cnd, pageNo, pageSize) { + var url = '/api/v1/users/cnd' + //生成发请求数据对象 + var data = {} + data.tenantId = tenantId + data.cnd = cnd + data.pageNo = pageNo + data.pageSize = pageSize + + //发送ajax请求 + return ajax({ + method: 'GET', + url: url, + data: data + }) + }, + + /** + * 根据部门id查询人员信息 + * @param {[type]} deptID [description] + * @return {[type]} [description] + */ + queryUserById: function(userId) { + var url = '/portal/user/' + userId + //生成发请求数据对象 + var data = {} + + //发送ajax请求 + return ajax({ + method: 'GET', + url: url, + data: data + }) + }, + + /** + * 查询部门信息 + * @param {[type]} code [description] + * @return {[type]} [description] + */ + queryTenantList: function() { + var url = '/rbac/api/tenant/getAll' + //生成发请求数据对象 + var data = {} + + //发送ajax请求 + return ajax({ + method: 'GET', + url: url, + data: data + }) + }, + + /** + * 查询是否是多租户 + * @return {[type]} [description] + */ + isMultiTenant: function() { + var url = '/auth/isMultiTenant' + //生成发请求数据对象 + var data = {} + + //发送ajax请求 + return ajax({ + method: 'GET', + url: url, + data: data + }) + }, + + /** + * 根据类型和租户id查询用户组集合 + * @return {[type]} [description] + */ + getUserGroupByTypeAndTenantId: function(type,tenantId) { + var url = '/portal/usergroup/group/type/tenantId' + //生成发请求数据对象 + var data = {} + data.type = type + data.tenantId = tenantId + + //发送ajax请求 + return ajax({ + method: 'GET', + url: url, + data: data + }) + }, + + /** + * 查询字典的用户组类型 + * @return {[type]} [description] + */ + getUserGroupType: function(tenantId) { + var url = '/portal/usergroup/userGroupType' + //生成发请求数据对象 + var data = {} + data.tenantId = tenantId + + //发送ajax请求 + return ajax({ + method: 'GET', + url: url, + data: data + }) + }, + + /** + * 查询字典的用户状态 + * @return {[type]} [description] + */ + getUserStatus: function() { + var url = '/portal/user/status' + //生成发请求数据对象 + var data = {} + + //发送ajax请求 + return ajax({ + method: 'GET', + url: url, + data: data + }) + } +}) diff --git a/uam-web/app/services/api/portal-common/service.js b/uam-web/app/services/api/portal-common/service.js new file mode 100644 index 0000000000000000000000000000000000000000..682f342e582aa8516da1d29562c8305859491f6a --- /dev/null +++ b/uam-web/app/services/api/portal-common/service.js @@ -0,0 +1,81 @@ +/* +* 统一门户公共查询管理 +* 这里的接口对应java中的 PortalCommonController提供的api,具体见java中PortalCommonController.java的实现 +* 2015-10-27 14:18:30 +*/ +import Ember from 'ember'; +var ajax = Ember.$.ajax; + +export default Ember.Service.extend({ + + + /* + * 获取所有网段信息 + */ + queryNetSegList : function() { + var url = "/portal/common/netSegListAction"; + //生成发请求数据对象 + var data = {}; + + //发送ajax请求 + return ajax({ + 'method': 'GET', + 'url': url, + 'data': data, + }); + + }, + + /* + * 获取所有用户组信息 + */ + getUserGroupList: function(tenantId) { + var url = "/portal/common/userGroupListAction"; + //生成发请求数据对象 + var data = {}; + data.tenantId=tenantId; + //发送ajax请求 + return ajax({ + 'method': 'GET', + 'url': url, + 'data': data, + }); + + }, + + /* + * 获取功能树 + */ + queryFuncTree : function(showFuncOper) { + var url = "/portal/common/funcTreeAction"; + //生成发请求数据对象 + var data = {}; + data.showFuncOper = showFuncOper; + + //发送ajax请求 + return ajax({ + 'method': 'GET', + 'url': url, + 'data': data, + }); + + }, + + /* + * 获取所有角色信息 + */ + getRoleList : function() { + var url = "/portal/common/roleListAction"; + //生成发请求数据对象 + var data = {}; + + //发送ajax请求 + return ajax({ + 'method': 'GET', + 'url': url, + 'data': data, + }); + + } + +}); \ No newline at end of file diff --git a/uam-web/app/services/api/portal-dept/service.js b/uam-web/app/services/api/portal-dept/service.js new file mode 100644 index 0000000000000000000000000000000000000000..5e3b6d83658cf685e6e14465ba13ce8dff455b4e --- /dev/null +++ b/uam-web/app/services/api/portal-dept/service.js @@ -0,0 +1,92 @@ +import Ember from 'ember' +var ajax = Ember.$.ajax + +export default Ember.Service.extend({ + /** + * 新增部门 + */ + addDept: function(data) { + var url = '/portal/dept' + + //发送ajax请求 + return ajax({ + method: 'POST', + url: url, + data: data + }) + }, + + /** + * 获取部门的信息 + */ + queryDeptById: function(id) { + var url = `/portal/dept/${id}` + var data = {} + + //发送ajax请求 + return ajax({ + method: 'GET', + url: url, + data: data + }) + }, + + /** + * 修改部门 + */ + updateDept: function(data) { + var url = '/portal/dept' + + //发送ajax请求 + return ajax({ + method: 'PUT', + url: url, + data: data + }) + }, + + deleteDept: function(id) { + var url = `/portal/dept/${id}` + var data = {} + + //发送ajax请求 + return ajax({ + method: 'DELETE', + url: url, + data: data + }) + }, + + /** + * 查询部门所关联的角色信息 + */ + queryRolesByDeptId: function(id) { + var url = `/portal/dept/roles/${id}` + + var data = {} + + //发送ajax请求 + return ajax({ + method: 'GET', + url: url, + data: data + }) + }, + + /** + * 保存部门与角色的绑定关系 + */ + saveDeptToRole: function(id, roleIds) { + var url = `/portal/dept/roles/${id}` + + var data = {} + data.roleIds = roleIds.join(',') + + //发送ajax请求 + return ajax({ + method: 'POST', + url: url, + data: data + }) + } +}) diff --git a/uam-web/app/services/api/portal-permission/service.js b/uam-web/app/services/api/portal-permission/service.js new file mode 100644 index 0000000000000000000000000000000000000000..92c36537c9c3a6337820c53ed9a4d443112ef4cd --- /dev/null +++ b/uam-web/app/services/api/portal-permission/service.js @@ -0,0 +1,107 @@ +/* + * 授权管理 + * 这里的接口对应java中的 PortalPermissionController提供的api,具体见java中PortalPermissionController.java的实现 + * 2015-11-05 16:44:09 + */ +import Ember from 'ember'; +var ajax = Ember.$.ajax; + +export default Ember.Service.extend({ + + + /* + * 获取授权资源ID + * 参数form对象信息 + * ---------参数名称:参数说明------- + * ---authResType:授权资源类型------ + * ---authObjType:授权对象类型------ + * ---authObjId:授权对象ID------ + */ + queryAuthRes: function(form) { + var url = "/portal/permission/queryAuthResAction"; + //生成发请求数据对象 + var data = {}; + data = form; + + //发送ajax请求 + return ajax({ + 'method': 'GET', + 'url': url, + 'data': data, + }); + + }, + + /* + * 保存授权对象关系 + * 参数form对象信息 + * ---------参数名称:参数说明------- + * ---authResType:授权资源类型------ + * ---authResId:授权资源ID------ + * ---authObjType:授权对象类型------ + * ---authObjIds:null------ + */ + saveAuthObj: function(form) { + var url = "/portal/permission/saveAuthObjAction"; + //生成发请求数据对象 + var data = {}; + data = form; + + //发送ajax请求 + return ajax({ + 'method': 'POST', + 'url': url, + 'data': data, + }); + + }, + + /* + * 保存授权资源关系 + * 参数form对象信息 + * ---------参数名称:参数说明------- + * ---authResType:授权资源类型------ + * ---authResIds:null------ + * ---authObjType:授权对象类型------ + * ---authObjId:授权对象ID------ + */ + saveAuthRes: function(permissionInfo) { + var url = "/portal/permission/saveAuthResAction"; + //生成发请求数据对象 + var data = {}; + data.permissionInfo = permissionInfo; + + //发送ajax请求 + return ajax({ + 'method': 'POST', + 'datatypec':'json', + 'url': url, + 'data': data, + }); + + }, + + /* + * 获取授权对象ID + * 参数form对象信息 + * ---------参数名称:参数说明------- + * ---authResType:授权资源类型------ + * ---authResId:授权资源ID------ + * ---authObjType:授权对象类型------ + */ + queryAuthObj: function(form) { + var url = "/portal/permission/queryAuthObjAction"; + //生成发请求数据对象 + var data = {}; + data = form; + + //发送ajax请求 + return ajax({ + 'method': 'GET', + 'url': url, + 'data': data, + }); + + } + +}); diff --git a/uam-web/app/services/api/portal-resource/service.js b/uam-web/app/services/api/portal-resource/service.js new file mode 100644 index 0000000000000000000000000000000000000000..4d75c1c35bb96b53678702e2074b175ecbf67520 --- /dev/null +++ b/uam-web/app/services/api/portal-resource/service.js @@ -0,0 +1,109 @@ +/* + * 权限资源管理 + * 这里的接口对应java中的 PortalUserGroupController提供的api,具体见java中PortalUserGroupController.java的实现 + * 2015-10-28 14:30:49 + */ +import Ember from 'ember'; +var ajax = Ember.$.ajax; + +export default Ember.Service.extend({ + + + + /* + * 获取某权限资源信息 + */ + queryByCode: function(code) { + var url = "/portal/res/{code}"; + //替换{参数占位符} + url = url.replace("{code}", code); + //生成发请求数据对象 + var data = {}; + + //发送ajax请求 + return ajax({ + 'method': 'GET', + 'url': url, + 'data': data, + }); + + }, + + /* + * 删除权限资源 + */ + delete: function(id) { + var url = "/portal/res/{id}"; + //替换{参数占位符} + url = url.replace("{id}", id); + //生成发请求数据对象 + var data = {}; + + //发送ajax请求 + return ajax({ + 'method': 'DELETE', + 'url': url, + 'data': data, + }); + + }, + + /* + * 更新权限资源 + */ + update: function(id, form) { + var url = "/portal/res/{id}"; + //替换{参数占位符} + url = url.replace("{id}", id); + //生成发请求数据对象 + var data = {}; + data = form; + //发送ajax请求 + return ajax({ + 'method': 'PUT', + 'url': url, + 'data': data, + }); + + }, + + /* + * 查询权限资源信息 + * 参数form对象信息 + * ---------参数名称:参数说明------- + * ---name:名称------ + * ---remark:备注------ + * ---selectRoles:所属角色------ + * ---selectUsers:包含用户------ + */ + queryAll: function() { + var url = "/portal/res/all"; + //生成发请求数据对象 + var data = {}; + //发送ajax请求 + return ajax({ + 'method': 'GET', + 'url': url, + 'data': data, + }); + + }, + + /* + * 创建权限资源信息 + */ + create: function(form) { + var url = "/portal/res/"; + //生成发请求数据对象 + var data = form; + + //发送ajax请求 + return ajax({ + 'method': 'POST', + 'url': url, + 'data': data, + }); + + } + +}); diff --git a/uam-web/app/services/api/portal-role/service.js b/uam-web/app/services/api/portal-role/service.js new file mode 100644 index 0000000000000000000000000000000000000000..dc3c03e9cc4ca112925b6a1400d8ed2ca7e10dc1 --- /dev/null +++ b/uam-web/app/services/api/portal-role/service.js @@ -0,0 +1,240 @@ +/* + * 角色管理 + * 这里的接口对应java中的 PortalRoleController提供的api,具体见java中PortalRoleController.java的实现 + * 2015-10-30 15:14:19 + */ +import Ember from 'ember' +var ajax = Ember.$.ajax + +export default Ember.Service.extend({ + /* + * 分配用户组 + */ + allocateGroup: function(id, selGroups) { + var url = '/portal/role/{id}/allocate/group' + //替换{参数占位符} + url = url.replace('{id}', id) + //生成发请求数据对象 + var data = {} + data.selGroups = selGroups + + //发送ajax请求 + return ajax({ + method: 'POST', + url: url, + data: data + }) + }, + + /* + * 分配用户 + */ + allocateUser: function(id, selUsers) { + var url = '/portal/role/{id}/allocate/users' + //替换{参数占位符} + url = url.replace('{id}', id) + //生成发请求数据对象 + var data = {} + data.selUsers = selUsers + + //发送ajax请求 + return ajax({ + method: 'POST', + url: url, + data: data + }) + }, + + /* + * 获取某个角色信息 + */ + queryById: function(id) { + var url = '/portal/role/{id}' + //替换{参数占位符} + url = url.replace('{id}', id) + //生成发请求数据对象 + var data = {} + + //发送ajax请求 + return ajax({ + method: 'GET', + url: url, + data: data + }) + }, + + /* + * 获取某个角色权限信息 + */ + queryPermissionsById: function(id) { + var url = '/portal/role/permissions/{id}' + //替换{参数占位符} + url = url.replace('{id}', id) + //生成发请求数据对象 + var data = {} + + //发送ajax请求 + return ajax({ + method: 'GET', + url: url, + data: data + }) + }, + + /* + * 获取某个角色用户信息 + */ + queryUsersById: function(id) { + var url = '/portal/role/users/{id}' + //替换{参数占位符} + url = url.replace('{id}', id) + //生成发请求数据对象 + var data = {} + + //发送ajax请求 + return ajax({ + method: 'GET', + url: url, + data: data + }) + }, + + /* + * 获取某个角色用户组信息 + */ + queryGroupsById: function(id) { + var url = '/portal/role/groups/{id}' + //替换{参数占位符} + url = url.replace('{id}', id) + //生成发请求数据对象 + var data = {} + + //发送ajax请求 + return ajax({ + method: 'GET', + url: url, + data: data + }) + }, + + /* + * 查询用户组所关联的角色信息 + */ + queryRolePageByGroupIdAndCnd: function(form) { + var url = '/portal/role/page/group' + + //发送ajax请求 + return ajax({ + method: 'GET', + url: url, + data: form + }) + }, + + /* + * 查询用户所关联的角色信息 + */ + queryRolePageByUserIdAndCnd: function(form) { + var url = '/portal/role/page/user' + + //发送ajax请求 + return ajax({ + method: 'GET', + url: url, + data: form + }) + }, + + /* + * 删除角色信息 + */ + delete: function(id) { + var url = '/portal/role/{id}' + //替换{参数占位符} + url = url.replace('{id}', id) + //生成发请求数据对象 + var data = {} + + //发送ajax请求 + return ajax({ + method: 'DELETE', + url: url, + data: data + }) + }, + + /* + * 更新角色信息 + * 参数form对象信息 + * ---------参数名称:参数说明------- + * ---name:名称------ + * ---code:编码------ + * ---remark:备注------ + * ---editType:编辑类型------ + */ + update: function(id, form) { + var url = '/portal/role/{id}' + //替换{参数占位符} + url = url.replace('{id}', id) + //生成发请求数据对象 + var data = {} + data = form + data['_method'] = 'PUT' + + //发送ajax请求 + return ajax({ + method: 'POST', + url: url, + data: data + }) + }, + + /* + * 查询角色信息 + * 参数form对象信息 + * ---------参数名称:参数说明------- + * ---name:名称------ + * ---code:编码------ + * ---remark:备注------ + */ + queryByPage: function(offset, limit, form) { + var url = '/portal/role/page/{offset}/{limit}' + //替换{参数占位符} + url = url.replace('{offset}', offset) + //替换{参数占位符} + url = url.replace('{limit}', limit) + //生成发请求数据对象 + var data = {} + data = form + + //发送ajax请求 + return ajax({ + method: 'GET', + url: url, + data: data + }) + }, + + /* + * 创建角色信息 + * 参数form对象信息 + * ---------参数名称:参数说明------- + * ---name:名称------ + * ---code:编码------ + * ---remark:备注------ + * ---editType:编辑类型------ + */ + create: function(form) { + var url = '/portal/role/' + //生成发请求数据对象 + var data = {} + data = form + + //发送ajax请求 + return ajax({ + method: 'POST', + url: url, + data: data + }) + } +}) diff --git a/uam-web/app/services/api/portal-tenant/service.js b/uam-web/app/services/api/portal-tenant/service.js new file mode 100644 index 0000000000000000000000000000000000000000..ffe4b6e26d99606a5d0460550af8b07e6f71f61a --- /dev/null +++ b/uam-web/app/services/api/portal-tenant/service.js @@ -0,0 +1,69 @@ +import Ember from 'ember' +var ajax = Ember.$.ajax + +export default Ember.Service.extend({ + /** + * 分页查询用户组 + */ + queryByPage: function(offset, limit, form) { + var url = `/portal/tenant/pageList/${offset}/${limit}` + + //发送ajax请求 + return ajax({ + method: 'GET', + url: url, + data: form + }) + }, + /** + * 新增租户 + */ + addUser: function(data) { + var url = `/portal/tenant` + + //发送ajax请求 + return ajax({ + method: 'POST', + url: url, + data: data + }) + }, + /** + * 修改用户 + * @param {[type]} data [description] + * @return {[type]} [description] + */ + updateUser: function(data) { + var url = `/portal/tenant` + + //发送ajax请求 + return ajax({ + method: 'PUT', + url: url, + data: data + }) + }, + /** + * 获取租户信息 + * @param {[type]} id [description] + * @return {[type]} [description] + */ + queryTenantById: function(id) { + var url = `/portal/tenant/${id}` + + //发送ajax请求 + return ajax({ + method: 'GET', + url: url + }) + }, + deleteTenant: function(id) { + var url = `/portal/tenant/${id}` + + //发送ajax请求 + return ajax({ + method: 'DELETE', + url: url + }) + } +}) diff --git a/uam-web/app/services/api/portal-user-group/service.js b/uam-web/app/services/api/portal-user-group/service.js new file mode 100644 index 0000000000000000000000000000000000000000..706649f71b37d394514858945919c8ab3b635be8 --- /dev/null +++ b/uam-web/app/services/api/portal-user-group/service.js @@ -0,0 +1,254 @@ +/* + * 用户组管理 + * 这里的接口对应java中的 PortalUserGroupController提供的api,具体见java中PortalUserGroupController.java的实现 + * 2015-10-28 14:30:49 + */ +import Ember from 'ember'; +var ajax = Ember.$.ajax; + +export default Ember.Service.extend({ + + + /* + * 分配角色信息 + */ + allocateRole: function(id, selectRoles) { + var url = "/portal/usergroup/{id}/allocate/role"; + //替换{参数占位符} + url = url.replace("{id}", id); + //生成发请求数据对象 + var data = {}; + data.selectRoles = selectRoles; + + //发送ajax请求 + return ajax({ + 'method': 'POST', + 'url': url, + 'data': data, + }); + + }, + + /* + * 分配用户信息 + */ + allocateUser: function(id, selectUsers) { + var url = "/portal/usergroup/{id}/allocate/user"; + //替换{参数占位符} + url = url.replace("{id}", id); + //生成发请求数据对象 + var data = {}; + data.selectUsers = selectUsers; + + //发送ajax请求 + return ajax({ + 'method': 'POST', + 'url': url, + 'data': data, + }); + + }, + + /* + * 获取某用户组角色信息 + */ + queryRolesById: function(id) { + var url = "/portal/usergroup/roles/{id}"; + //替换{参数占位符} + url = url.replace("{id}", id); + //生成发请求数据对象 + var data = {}; + + //发送ajax请求 + return ajax({ + 'method': 'GET', + 'url': url, + 'data': data, + }); + + }, + + /* + * 获取某用户组用户列表 + */ + queryUsersById: function(id) { + var url = "/portal/usergroup/users/{id}"; + //替换{参数占位符} + url = url.replace("{id}", id); + //生成发请求数据对象 + var data = {}; + + //发送ajax请求 + return ajax({ + 'method': 'GET', + 'url': url, + 'data': data, + }); + + }, + + /* + * 查询用户所关联的用户组信息 + */ + queryGroupPageByUserIdAndCnd: function(form) { + var url = "/portal/usergroup/page/user"; + + //发送ajax请求 + return ajax({ + 'method': 'GET', + 'url': url, + 'data': form + }); + + }, + + /* + * 查询角色所关联的用户组信息 + */ + queryGroupPageByRoleIdAndCnd: function(form) { + var url = "/portal/usergroup/page/role"; + + //发送ajax请求 + return ajax({ + 'method': 'GET', + 'url': url, + 'data': form + }); + + }, + + /* + * 获取某用户组权限信息 + */ + queryPermissionsById: function(id) { + var url = "/portal/usergroup/permissions/{id}"; + //替换{参数占位符} + url = url.replace("{id}", id); + //生成发请求数据对象 + var data = {}; + + //发送ajax请求 + return ajax({ + 'method': 'GET', + 'url': url, + 'data': data, + }); + + }, + + /* + * 获取某用户组信息 + */ + queryById: function(id) { + var url = "/portal/usergroup/{id}"; + //替换{参数占位符} + url = url.replace("{id}", id); + //生成发请求数据对象 + var data = {}; + + //发送ajax请求 + return ajax({ + 'method': 'GET', + 'url': url, + 'data': data, + }); + + }, + + /* + * 删除用户组 + */ + delete: function(id) { + var url = "/portal/usergroup/{id}"; + //替换{参数占位符} + url = url.replace("{id}", id); + //生成发请求数据对象 + var data = {}; + + //发送ajax请求 + return ajax({ + 'method': 'DELETE', + 'url': url, + 'data': data, + }); + + }, + + /* + * 更新用户组 + */ + update: function(id, name, type,remark) { + var url = "/portal/usergroup/{id}"; + //替换{参数占位符} + url = url.replace("{id}", id); + //生成发请求数据对象 + var data = {}; + data.name = name; + data.type = type; + data.remark = remark; + data['_method'] = "PUT"; + + //发送ajax请求 + return ajax({ + 'method': 'POST', + 'url': url, + 'data': data, + }); + + }, + + /* + * 查询用户组信息 + * 参数form对象信息 + * ---------参数名称:参数说明------- + * ---name:名称------ + * ---remark:备注------ + * ---selectRoles:所属角色------ + * ---selectUsers:包含用户------ + */ + queryByPage: function(offset, limit, form, cnd) { + var url = "/portal/usergroup/page/{offset}/{limit}?cnd="+cnd; + //替换{参数占位符} + url = url.replace("{offset}", offset); + //替换{参数占位符} + url = url.replace("{limit}", limit); + + var tenantId = window.sessionStorage.getItem("tenant"); + form.tenantId = tenantId; + //生成发请求数据对象 + var data = {}; + data = form; + + //发送ajax请求 + return ajax({ + 'method': 'GET', + 'url': url, + 'data': data, + }); + + }, + + /* + * 创建用户组信息 + */ + create: function(name, type,remark) { + var url = "/portal/usergroup/"; + //生成发请求数据对象 + var data = {}; + + var tenantId = window.sessionStorage.getItem("tenant"); + data.tenantId = tenantId; + data.name = name; + data.type = type; + data.remark = remark; + + //发送ajax请求 + return ajax({ + 'method': 'POST', + 'url': url, + 'data': data, + }); + + } + +}); \ No newline at end of file diff --git a/uam-web/app/services/api/portal-user/service.js b/uam-web/app/services/api/portal-user/service.js new file mode 100644 index 0000000000000000000000000000000000000000..8ed67a9b55a42ee47c7038f5cb133107ca6a5ede --- /dev/null +++ b/uam-web/app/services/api/portal-user/service.js @@ -0,0 +1,285 @@ +/* + * 用户管理 + * 这里的接口对应java中的 PortalUserController提供的api,具体见java中PortalUserController.java的实现 + * 2015-11-07 18:52:53 + */ +import Ember from 'ember' +var ajax = Ember.$.ajax + +export default Ember.Service.extend({ + /* + * 分配用户组 + */ + allocateGroup: function(userInfo) { + var url = '/portal/user/allocate/userGroup' + //替换{参数占位符} + // url = url.replace("{id}", id); + //生成发请求数据对象 + var data = {} + data.userInfo = userInfo + + //发送ajax请求 + return ajax({ + method: 'POST', + url: url, + datatype: 'json', + data: data + }) + }, + + /* + * 分配用户组 + */ + allocate: function(userInfo) { + var url = '/portal/user/' + //生成发请求数据对象 + var data = {} + data = userInfo + var tenant = window.sessionStorage.getItem('tenant') + data.tenantId = tenant + //发送ajax请求 + return ajax({ + method: 'POST', + url: url, + data: data + }) + }, + + /** + * 获取某用户的权限信息 + * @param {[type]} id [description] + * @return {[type]} [description] + */ + queryPermissionsById: function(id) { + var url = '/portal/user/permissions/{id}' + //替换{参数占位符} + url = url.replace('{id}', id) + //生成发请求数据对象 + var data = {} + + //发送ajax请求 + return ajax({ + method: 'GET', + url: url, + data: data + }) + }, + + /** + * 获获取某用户角色信息 + * @param {[type]} id [description] + * @return {[type]} [description] + */ + queryRolesById: function(id) { + var url = '/portal/user/roles/{id}' + //替换{参数占位符} + url = url.replace('{id}', id) + //生成发请求数据对象 + var data = {} + + //发送ajax请求 + return ajax({ + method: 'GET', + url: url, + data: data + }) + }, + + /** + * 获取某用户用户组信息 + * @param {[type]} id [description] + * @return {[type]} [description] + */ + queryGroupsById: function(id) { + var url = '/portal/user/groups/{id}' + //替换{参数占位符} + url = url.replace('{id}', id) + //生成发请求数据对象 + var data = {} + + //发送ajax请求 + return ajax({ + method: 'GET', + url: url, + data: data + }) + }, + + /* + * 查询用户组所关联的角色信息 + */ + queryUserPageByGroupIdAndCnd: function(form) { + var url = '/portal/user/page/group' + + //发送ajax请求 + return ajax({ + method: 'GET', + url: url, + data: form + }) + }, + + /* + * 查询用户组所关联的角色信息 + */ + queryUserPageByRoleIdAndCnd: function(form) { + var url = '/portal/user/page/role' + + //发送ajax请求 + return ajax({ + method: 'GET', + url: url, + data: form + }) + }, + + /* + * 获取某用户信息 + */ + queryById: function(id) { + var url = '/portal/user/{id}' + //替换{参数占位符} + url = url.replace('{id}', id) + //生成发请求数据对象 + var data = {} + + //发送ajax请求 + return ajax({ + method: 'GET', + url: url, + data: data + }) + }, + + /** + * 新增用户 + * @param {[type]} data [description] + */ + addUser: function(data) { + var url = '/portal/user/add' + return ajax({ + method: 'POST', + url: url, + data: data + }) + }, + + /** + * 修改用户 + * @param {[type]} data [description] + * @return {[type]} [description] + */ + updateUser: function(data) { + var url = '/portal/user' + return ajax({ + method: 'PUT', + url: url, + data: data + }) + }, + + /** + * 激活用户 + * @param {[type]} id [description] + * @return {[type]} [description] + */ + enabledUser: function(id) { + var url = '/portal/user/enabled/{id}' + //替换{参数占位符} + url = url.replace('{id}', id) + var data = {} + return ajax({ + method: 'PUT', + url: url, + data: data + }) + }, + + /** + * 禁用用户 + * @param {[type]} id [description] + * @return {[type]} [description] + */ + disabledUser: function(id) { + var url = '/portal/user/disabled/{id}' + //替换{参数占位符} + url = url.replace('{id}', id) + var data = {} + return ajax({ + method: 'PUT', + url: url, + data: data + }) + }, + + /** + * 删除用户 + */ + deleteUser: function(id) { + var url = '/portal/user/{id}' + //替换{参数占位符} + url = url.replace('{id}', id) + var data = {} + return ajax({ + method: 'DELETE', + url: url, + data: data + }) + }, + + /** + * admin给其他用户发放Token + * @param {[type]} data [description] + * @return {[type]} [description] + */ + grantToken: function(loginId,tenantId) { + var url = '/sso/token/admin?loginId='+loginId+'&tenantId='+tenantId; + var data = {} + return ajax({ + method: 'GET', + url: url, + data: data + }) + }, + + /** + * 重置密码 + */ + resetPW: function(id) { + var url = '/portal/user/resetPW' + var data = {} + data.userId = id + return ajax({ + method: 'POST', + url: url, + data: data + }) + }, + + /** + * 根据excel名,返回上传预览 + */ + importPriview: function(id) { + var url = '/portal/user/importPriview/fileName' + var data = {} + data.fileName = id + return ajax({ + method: 'GET', + url: url, + data: data + }) + }, + /** + * 导入预览中的合法数据,并删除用户列表缓存 + */ + saveImportUsers: function(id) { + var url = '/portal/user/importPriview/fileName' + var data = {} + data.fileName = id + return ajax({ + method: 'POST', + url: url, + data: data + }) + } +}) diff --git a/uam-web/app/services/auth-service/service.js b/uam-web/app/services/auth-service/service.js new file mode 100644 index 0000000000000000000000000000000000000000..655fb1deb587f76f04ae4ca29dbb3f33d93325d2 --- /dev/null +++ b/uam-web/app/services/auth-service/service.js @@ -0,0 +1,58 @@ +import Ember from 'ember'; + +export default Ember.Service.extend({ + authInfo: function() { + var model = { + authenticated: false, + }; + + if (this.get("curUser")) { + model.authenticated = true; + model.user = this.get("curUser"); + return model; + } + + var token = null; + if (document.cookie !== undefined) { + document.cookie.split('; ').forEach(function(data) { + if (data.indexOf("access-token=") === 0) { + token = data.substring(13); + } + }); + } + + var url = "/auth"; + var self = this; + let callBackUrl=window.location.protocol+"//"+window.location.host + window.location.pathname + "#/authenticated?loginHash=" + window.location.hash.replace("#/",""); + let customer="default"; + window.sessionStorage.removeItem("permissions"); + Ember.$.ajax({ + 'method': 'GET', + 'url': url, + headers: { + "access-token": "Bearer " + token + }, + async: false, + success: function(data) { + if (data.status === "success") { + model.user = data.content; + model.authenticated = true; + self.set("curUser", data.content); + window.sessionStorage.setItem("permissions", data.content.authorizationInfo.permissions.CLOUDUAM_MENU); + } else if (data.status === "AUTH_FAILED") { + model.login = "/login?authCallbackUrl=" + encodeURIComponent(callBackUrl)+"&customer="+customer; + } else { + swal(data.message); + } + }, + error: function(resp) { + if(resp.status === 401){ + model.login = resp.responseJSON.content.ssoWebUrl + encodeURIComponent(callBackUrl)+"&customer="+customer; + } + // swal("系统异常"); + } + }); + + return model; + }, +}); \ No newline at end of file diff --git a/uam-web/app/styles/app.less b/uam-web/app/styles/app.less new file mode 100644 index 0000000000000000000000000000000000000000..620baf34b3aa4c0b35fb40ac41981a1927a59bac --- /dev/null +++ b/uam-web/app/styles/app.less @@ -0,0 +1,25 @@ +@import './mixins'; +@import './vars'; +@import './ci-class'; + +// components +@import './components/app-header'; +@import './components/menu'; +@import './components/context-bar'; +@import './components/ui-switcher'; +@import './components/upload-file-modal'; +@import './components/app-card'; +@import './components/cornel-label'; +@import './components/ioicon'; +@import './components/nav-tabs'; +@import './components/loading'; +@import './components/detail-panel'; +@import './components/io-table'; +@import './components/io-form'; +@import './components/idcos-puppet'; +@import './components/accordion'; +@import './components/io-tree'; +@import './components/tool-tips'; +// routes +@import 'routes/application/index'; +@import 'routes/user-group'; diff --git a/uam-web/app/styles/bootstrap.less b/uam-web/app/styles/bootstrap.less new file mode 100644 index 0000000000000000000000000000000000000000..90ea22d94645e33a898265ed4ebfcdc57165406b --- /dev/null +++ b/uam-web/app/styles/bootstrap.less @@ -0,0 +1,4 @@ +@import 'vendor/lib/bootstrap/less/bootstrap.less'; +@grid-columns: 24; +@screen-lg: 1270px; + diff --git a/uam-web/app/styles/ci-class.less b/uam-web/app/styles/ci-class.less new file mode 100644 index 0000000000000000000000000000000000000000..dfa5ef4aab273bf8ad2f53cfd2ee8371ab78db82 --- /dev/null +++ b/uam-web/app/styles/ci-class.less @@ -0,0 +1,276 @@ +/* layout */ + +.page-content { + margin-top: 0px; + padding: 0px; +} + +.app-body__main__body.scroll-y { + // 叶光明: 修复不滚动的问题 + height: 100%; +} + +@media (min-width: 992px) { + + .page-sidebar { + width: 235px; + float: left; + position: relative; + margin-right: -100%; + margin-bottom: 10px; + } + + .page-sidebar.navbar-collapse { + max-height: none !important; + } + + .page-content-wrapper { + float: left; + width: 100%; + } + + .page-content-wrapper .page-content { + margin-left: 235px; + margin-top: 0px; + min-height: 600px; + padding: 10px 0 0 20px; + } + +} + +@media (max-width: 991px) { + + .page-content-wrapper1 .page-content { + margin: 0px !important; + padding: 20px !important; + min-height: 280px; + } + +} + +@media (max-width: 767px) { + + .page-sidebar, + .page-sidebar.in { + margin: 10px 10px 10px 10px !important; + } + + /* 767px */ + /* Page content */ + .page-content-wrapper .page-content { + padding: 20px 10px 10px 10px !important; + overflow: hidden; + /* Page title */ + } + + .page-content-wrapper .page-content .page-title { + margin-bottom: 15px; + font-size: 20px; + } + + .page-content-wrapper .page-content .page-title small { + font-size: 13px; + padding-top: 3px; + } +} + +@media (max-width: 480px) { + /* 480px */ + /* Dashboard date range panel */ + .page-content-wrapper .page-content .page-title small { + display: block; + clear: both; + } +} + +/* Components */ + +.portlet { + margin-top: 0px; + margin-bottom: 25px; + padding: 0px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + -ms-border-radius: 4px; + -o-border-radius: 4px; + border-radius: 4px; +} + +.portlet > .portlet-title { + border-bottom: 1px solid #eee; + padding: 0; + margin-bottom: 10px; + min-height: 41px; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + -ms-border-radius: 4px 4px 0 0; + -o-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.portlet > .portlet-body { + clear: both; + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + -ms-border-radius: 0 0 4px 4px; + -o-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.portlet > .portlet-title > .caption { + float: left; + display: inline-block; + font-size: 18px; + line-height: 18px; + padding: 10px 0; +} + +.portlet > .portlet-title > .tools { + float: right; + display: inline-block; + padding: 12px 0 8px 0; +} + +.portlet.io-dynamic-form { + .control-label { + text-align: right; + height: 32px; + line-height: 32px; + padding-right: 8px; + } + + .form-control-static { + font-weight: 700; + padding: 6px 7px; + } +} + +.table-ci-class td div.pk { + position: absolute; + margin-top: -5px; + float: left; + width: 2px; + height: 30px; + margin-right: 20px !important; + border-left: 2px solid #d3583f; +} + +.table-ci-class tr td a { + margin-left: 15px; + color: #666; +} + + +.inner-app{ + .text-primary{ + color:#4CADF8; + } + .ioicon-delete{ + color:#FA4848; + } + .top-nav{ + height:50px; + line-height:32px; + .io-table tr td:last-child, .io-table tr th:last-child { + padding: 4px; + text-align:center; + .io-tooltips{ + //margin-left:4px; + margin-right:10px; + } + } + + } + .inner-app__context{ + position: absolute; + top: 0px;left: 0px; + right: 0;bottom: 0; + overflow-y: auto; + overflow-x: hidden; + padding: 0px; + background: #fff; + border-radius:5px; + box-shadow: 0 2px 2px 0 rgba(0,0,0,.05); + color: #373B47; + .io-table{ + padding-top:7px; + } + } + .inner-app__context-bar{ + padding:0px; + } + .inner-app__main{ + padding:0px; + } + .panel-footer .io-btn{ + margin-left:10px; + margin-right:10px; + } +} +a:focus{ + outline: none; +} +.io-pagination{ + margin:10px; +} + +.container{ + width:100%;padding-top:51px; + .tab-content{ + .container-fluid{ + text-align:center; + + } + } + .panel-body{ + padding-bottom: 0px; + } + .panel-footer{ + background:none; + } + .form-horizontal{ + border-bottom:0px; + } +} +.container-fluid{ + padding-bottom:15px; +} +.io-transfer-list{ + min-width: 320px; + min-height: 500px; + text-align: left; +} + +.panel-body{ + padding-top:55px; + .row{ + label{ + text-align:right; + padding-right:10px; + } + } + +} +.io-table tr { + td,th{ + padding: 4px 8px; + .io-tooltips-inner{ + overflow: hidden; + width:100px; + z-index:1; + } + } + td:first-child, th:first-child { + width: 57px; + text-align:center; + padding-left:10px !important; + padding-right:0px !important; + } + td:last-child, th:last-child { + padding: 4px !important; + text-align: left !important; + } +} +.io-tooltips{ + opacity:1 !important; +} \ No newline at end of file diff --git a/uam-web/app/styles/common.less b/uam-web/app/styles/common.less new file mode 100644 index 0000000000000000000000000000000000000000..715947cf587a49f53df357529fc18a1ccc0e1c87 --- /dev/null +++ b/uam-web/app/styles/common.less @@ -0,0 +1,5 @@ +@import 'vendor/styles/idcos.less'; +@import './vars'; +@media (min-width: @screen-xlg-min) { + .make-grid(xlg); +} diff --git a/uam-web/app/styles/components/accordion.less b/uam-web/app/styles/components/accordion.less new file mode 100644 index 0000000000000000000000000000000000000000..66fcedc1c3d3e57299bfa0be3a8af1b13cfb8be2 --- /dev/null +++ b/uam-web/app/styles/components/accordion.less @@ -0,0 +1,58 @@ +/** + * accordion + */ +.accordion-bare { + .panel { + box-shadow: none; + position: relative; + &-heading { + padding-left: 20px; + border-bottom: none; + a { + text-decoration: none; + &:hover { + color: lighten(@brand-font-color-d1, 10%); + } + } + } + &-body { + border-top: none !important; + } + &-collapse { + ~ .toggle { + position: absolute; + transform: scale(0.5) rotate(0); + left: -1px; + top: 6px; + trasition: all .3s ease-in; + } + &.in { + ~ .toggle { + transform: scale(0.5) rotate(90deg); + } + } + } + } + + .io-steps { + @color: @brand-font-color-d1; + &-title { + color: @color !important; + } + &-description { + padding: 20px 0 20px 40px; + color: @color !important; + } + &-main { + overflow: visible !important; + } + + &-tail>i:after { + background: @border-color !important; + } + } + + .io-transfer-list-header { + color: @brand-font-color-d1; + } +} diff --git a/uam-web/app/styles/components/app-card.less b/uam-web/app/styles/components/app-card.less new file mode 100644 index 0000000000000000000000000000000000000000..719b1088c48186128ab1b8fb2a794c9e384fbeb3 --- /dev/null +++ b/uam-web/app/styles/components/app-card.less @@ -0,0 +1,86 @@ +.app-card-container { + text-align: center; + padding: 10px; + display: inline-block; + float: left; + .clearfix; + .app-card { + text-align: left; + display: inline-block; + background: white; + height: 380px; + // max-width: 100%; + max-width: 330px; + border: 1px solid #DBDBDB; + box-shadow: 0px 0px 4px 0px rgba(0,0,0,0.08); + padding: 44px 33px 33px 33px; + position: relative; + &__title { + font-weight: bold; + font-size: 16px; + } + + &__meta { + margin: 20px 0 50px; + position: relative; + >.modify-meta-btn { + position: absolute; + top: 0; + right: 0; + } + li { + color: #AAAFBC; + margin-bottom: 5px; + height: 20px; + } + } + &__btn-group { + width: 130%; + margin-left: -15%; + text-align: center; + .io-btn { + border-color: @brand-primary; + color: @brand-primary; + &:hover, &:active { + background: @brand-primary; + color: white; + } + } + } + + &__primary-btn { + margin-top: 25px; + text-align: center; + .io-btn { + border-radius: 30px; + padding: 5px 30px; + } + } + + &.selected { + .cornel-label { + border-color: @brand-success; + color: white; + } + } + + &-empty { + text-align: center; + >i { + font-size: 180px; + color: #CDCFD4; + margin-bottom: 25px; + } + .io-btn { + border-color: @brand-primary; + color: @brand-primary; + &:hover, &:active { + background: @brand-primary; + color: white; + } + } + } + } +} + + diff --git a/uam-web/app/styles/components/app-header.less b/uam-web/app/styles/components/app-header.less new file mode 100644 index 0000000000000000000000000000000000000000..ad6d66f4f7fe185799768cbbad0b0965d26ea59c --- /dev/null +++ b/uam-web/app/styles/components/app-header.less @@ -0,0 +1,42 @@ +.app-header { + height: 51px; + line-height: 51px; + background-color: @brand-background-color-d3; + color: white; + &__logo { + width: 270px; + margin-right: 30px; + margin-left: 18px; + a{ + display: inline-block; + width: 168px; + height: 42px; + vertical-align: middle; + img { + vertical-align: top; + width: 100%; + height: 100%; + } + } + + } + &__user { + margin-left: 15px; + margin-right: 20px; + color: @brand-font-color-d1; + img { + height: 36px; + width: 36px; + margin-right: 20px; + } + .io-dropdown .io-dropdown-overlay { + right: 0; + left: auto; + top: 20px; + transition: all .2s ease-in-out; + } + } + .io-dropdown-trigger { + color: #757984; + } +} diff --git a/uam-web/app/styles/components/context-bar.less b/uam-web/app/styles/components/context-bar.less new file mode 100644 index 0000000000000000000000000000000000000000..c5442df650506c227b72db655c97b1d66eac4b6f --- /dev/null +++ b/uam-web/app/styles/components/context-bar.less @@ -0,0 +1,182 @@ +/** + * .context bar + */ +.context-bar { + @bar-height: 47px; + padding: 0 @body-padding; + line-height: @bar-height; + background: @brand-background-color-d1; + color: white; + height: @bar-height; + user-select: none; + -webkit-user-select: none; + .clearfix(); + + &__back { + font-size: 16px; + color: #A3ADB9; + margin-right: 20px; + cursor: pointer; + } + + &__name { + display: inline-block; + font-size: 16px; + font-weight: bold; + >i { + font-size: 18px; + margin-right: 4px; + color: @brand-primary; + } + } + &__spliter { + display: inline-block; + position: relative; + width: 1px; + height: @bar-height; + margin: 0 20px; + top: -3px; + vertical-align: middle; + background: @brand-background-color-d3; + } + &__right-button-group { + .input-group.search{ + background: @brand-background-color-d1; + border-radius: 30px; + position: relative; + border: solid 1px @brand-background-color-d3; + display: inline-block; + margin-right: 20px; + line-height: 30px; + transition: background .3s ease-in-out; + -ms-transition: background .3s ease-in-out; + &:hover { + background: white; + } + input { + box-sizing: content-box; + height: 100%; + line-height: 1; + padding: 0 28px 0 18px; + background: none; + outline: none; + border: none; + box-shadow: none; + font-size: 12px; + color: @brand-background-color-d3; + &::-webkit-input-placeholder { + color: @brand-background-color-d2; + } + &::-ms-input-placeholder { + color: @brand-background-color-d2; + } + &::-moz-input-placeholder { + color: @brand-background-color-d2; + } + } + i { + position: absolute; + right: 8px; + top: 10px; + font-size: 14px; + color: @brand-background-color-d3; + } + } + } + &__group { + display: inline-block; + } + &__button-group { + position: relative; + bottom: 3px; + .io-btn { + @border-color: darken(@brand-font-color, 12%); + background: none; + color: @brand-font-color; + border-color: @border-color; + &:first-child { + border-left-color: @border-color; + } + i { + font-size: 16px; + vertical-align: middle; + margin-right: 5px; + position: relative; + bottom: 2px; + } + padding: 0 10px !important; + &:active { + background: @primary-color; + color: white; + border-color: @primary-color; + } + } + } + + &__active { + color: @brand-success; + } + + &__control-button { + margin: 0 10px; + cursor: pointer; + font-size: 16px; + display: inline-block; + user-select: none; + vertical-align: middle; + text-align: center; + &.icon-btn { + >i { + margin-bottom: 20px; + font-size: 23px; + } + } + &:hover[class^="io-btn"] { + color: @brand-primary; + } + } + + &__steps { + text-align: center; + position: absolute; + left: 50%; + margin-left: -309px; + top: 4px; + } + + &-sub { + @bar-height: 48px; + height: @bar-height; + line-height: @bar-height; + border-top: solid 1px @brand-background-color-d3; + .context-bar__spliter { + height: @bar-height; + top: -4px; + } + } + + &__crumbs { + margin-left: 20px; + font-size: 13px; + .go-back { + margin-right: .5em; + cursor: pointer; + font-size: 20px; + position: relative; + top: 2px; + } + .splitter { + position: relative; + bottom: 1px; + } + .current { + color: white; + } + } +} + + +@media (max-width: 1200px) { + +} + diff --git a/uam-web/app/styles/components/cornel-label.less b/uam-web/app/styles/components/cornel-label.less new file mode 100644 index 0000000000000000000000000000000000000000..19ff9a25422c6be6917191417cd74086b96ab745 --- /dev/null +++ b/uam-web/app/styles/components/cornel-label.less @@ -0,0 +1,41 @@ +.cornel-label { + @size: 4em; + position: absolute; + top: 0; + right: 0; + margin: 0; + padding: 0; + text-align: center; + border-color: #F8F8F8; + width: @size; + height: @size; + z-index: 1; + -webkit-transition: border-color .1s ease; + transition: border-color .1s ease; + background-color: transparent!important; + &::after { + position: absolute; + content: ""; + right: 0; + top: 0; + z-index: -1; + width: 0; + height: 0; + background-color: transparent!important; + border-top: 0 solid transparent; + border-right: 4em solid transparent; + border-bottom: 4em solid transparent; + border-left: 0 solid transparent; + border-right-color: inherit; + -webkit-transition: border-color .1s ease; + transition: border-color .1s ease; + } + >i { + cursor: default; + position: relative; + top: .64285714em; + left: .78571429em; + font-size: 1.14285714em; + + } +} \ No newline at end of file diff --git a/uam-web/app/styles/components/detail-panel.less b/uam-web/app/styles/components/detail-panel.less new file mode 100644 index 0000000000000000000000000000000000000000..d8140056ac80b95c1eedc98d2d14ea6816c611a5 --- /dev/null +++ b/uam-web/app/styles/components/detail-panel.less @@ -0,0 +1,43 @@ +/** + * right-sidebar + */ +.detail-panel { + @padding: 15px; + background: @brand-background-color-d2; + color: @brand-font-color; + height: 100%; + z-index: 2; + + &.open { + height: 300px; + overflow-y: scroll; + } + &__title { + line-height: 47px; + font-size: 16px; + padding-left: @padding; + color: @brand-font-color; + border: solid 1px @brand-background-color-d3; + border-left: none; + border-right: none; + margin: 5px 0; + } + &__block { + padding: 20px; + } + + table.table.table{ + background: transparent; + tr th, tr td{ + background: transparent; + padding: 5px 20px; + border: solid 1px @brand-background-color-d3; + } + } + + &__info { + .form-group { + margin-bottom: 0px; + } + } +} diff --git a/uam-web/app/styles/components/idcos-puppet.less b/uam-web/app/styles/components/idcos-puppet.less new file mode 100644 index 0000000000000000000000000000000000000000..a8bc760fea5685b2f6ec689b879a5cc393cf39b7 --- /dev/null +++ b/uam-web/app/styles/components/idcos-puppet.less @@ -0,0 +1,67 @@ +.idcos-puppet { + .box { + padding: 10px 0 5px; + + > .box-heading { + padding: 5px 0 20px; + h4{ + font-size: 15px; + font-weight: bold; + + small { + + } + } + } + + > .box-body { + } + + > .box-footer { + > .pull-right { + > .btn { + margin-left: 20px; + } + } + } + } + + .table { + &.table-middle { + > thead > tr > th, + > tbody > tr > th, + > tfoot > tr > th, + > thead > tr > td, + > tbody > tr > td, + > tfoot > tr > td { + vertical-align: middle; + } + } + + th,td, + label { + font-weight: normal; + } + + > tbody > tr > td { + > p { + margin-bottom: 9px; + } + } + } + + .table > thead > tr > th, .table > thead > tr > td { + border-bottom-width: 1px; + } + + .modal-content .modal-body { + overflow-y: auto; + } + + .form-group .form-control, + .form-group .io-input, + .form-group .io-select, + .form-group .submit-button-wrapper { + width: 100%!important; + } +} diff --git a/uam-web/app/styles/components/io-form.less b/uam-web/app/styles/components/io-form.less new file mode 100644 index 0000000000000000000000000000000000000000..f2b705f9a48d0f650b23094c18477edadf6b09dc --- /dev/null +++ b/uam-web/app/styles/components/io-form.less @@ -0,0 +1,29 @@ +.form-group { + .form-control, + .io-select, + .io-input, + .submit-button-wrapper{ + width: 360px; + font-size: 12px; + } + .io-select-selection, + .io-select-dropdown { + width: 100%; + } +} + +.io-form { + &-readonly { + .form-group { + margin-bottom: 8px; + .io-select, + .io-input { + font-weight: bold; + height: 32px; + } + .help-block { + display: none; + } + } + } +} \ No newline at end of file diff --git a/uam-web/app/styles/components/io-table.less b/uam-web/app/styles/components/io-table.less new file mode 100644 index 0000000000000000000000000000000000000000..c807a4f042182363b9c6e7d3de9d44fc362d7d68 --- /dev/null +++ b/uam-web/app/styles/components/io-table.less @@ -0,0 +1,31 @@ +.io-table { + @content-padding: 47px; + padding-top: 11px; + .globalSearch{ + margin-right: @content-padding; + margin-bottom: 10px; + input { + font-size: 14px; + font-weight: normal; + } + } + tr th, tr td { + font-size: 13px; + &:first-child { + padding-left: @content-padding; + } + &:last-child { + padding-right: @content-padding; + } + } + + &__btn { + font-size: 20px; + &-danger { + color: @brand-danger; + } + } + &-body { + margin-top: 6px; + } +} \ No newline at end of file diff --git a/uam-web/app/styles/components/io-tree.less b/uam-web/app/styles/components/io-tree.less new file mode 100644 index 0000000000000000000000000000000000000000..a549afb25d58f2c7c4584b12ab2a14137559d382 --- /dev/null +++ b/uam-web/app/styles/components/io-tree.less @@ -0,0 +1,19 @@ +.inner-app__nav { + .io-tree { + .io-tree-node { + font-size: 14px; + background: white; + &-active { + display: inline-block; + width: 93%; + padding: 0 5px; + color: white; + background: @brand-primary; + transition: all .2s ease-in-out; + &.io-tree-node-leaf { + width: 100%; + } + } + } + } +} \ No newline at end of file diff --git a/uam-web/app/styles/components/ioicon.less b/uam-web/app/styles/components/ioicon.less new file mode 100644 index 0000000000000000000000000000000000000000..0233da00cedd1ee90d9741230da9341a9fd78cda --- /dev/null +++ b/uam-web/app/styles/components/ioicon.less @@ -0,0 +1,37 @@ +@font-face { + font-family: 'idcicon'; + src: url('../fonts/iconfont.eot'); /* IE9*/ + src: url('../fonts/iconfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('../fonts/iconfont.woff') format('woff'), /* chrome、firefox */ + url('../fonts/iconfont.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/ + url('../fonts/iconfont.svg#iconfont') format('svg'); /* iOS 4.1- */ +} + +.idcicon { + display: inline-block; + font-style: normal; + vertical-align: baseline; + text-align: center; + text-transform: none; + text-rendering: auto; + line-height: 1; + + &:before { + display: block; + font-family: "idcicon" !important; + } +} + +.idcicon-del:before { content: "\e604"; } +.idcicon-edit:before { content: "\e607"; } +.idcicon-build:before { content: "\e600"; } +.idcicon-usermanager:before { content: "\e601"; } +.idcicon-usergroup:before { content: "\e602"; } +.idcicon-rolemanager:before { content: "\e603"; } +.idcicon-permissiondistribution:before { content: "\e605"; } +.idcicon-permissionmanager:before { content: "\e606"; } +.icon-key:before { content: "\e608"; } + + + + diff --git a/uam-web/app/styles/components/loading.less b/uam-web/app/styles/components/loading.less new file mode 100644 index 0000000000000000000000000000000000000000..12d562285ad107b2a8df4761b41b8f2d93ef8347 --- /dev/null +++ b/uam-web/app/styles/components/loading.less @@ -0,0 +1,4 @@ +.loading-spin { + text-align: center; + margin-top: 30vh; +} \ No newline at end of file diff --git a/uam-web/app/styles/components/menu.less b/uam-web/app/styles/components/menu.less new file mode 100644 index 0000000000000000000000000000000000000000..fdecaecdfd2ee63a39ab3510c8ddae77c78d5331 --- /dev/null +++ b/uam-web/app/styles/components/menu.less @@ -0,0 +1,91 @@ +/** + * themed menu + */ +.io-menu { + &-idcos-dark { + background: none; + border-bottom: none; + position: relative; + .io-menu-item { + font-size: 14px; + border-bottom: none; + padding: 0 32px; + color: @brand-font-color; + i { + font-size: 16px; + margin-right: 8px; + margin-bottom: 3px; + vertical-align: middle; + } + a { + color: #757984; + font-weight: bold; + } + &-selected { + background: #17191A; + border-top: solid 3px @brand-primary; + border-bottom: none; + color: @brand-primary; + a { + color: @brand-primary; + font-weight: bold; + } + } + &-active { + color: @brand-primary; + } + } + } + &-idcos-light { + background: @brand-background-color-l1; + .io-menu-item { + @height: 62px; + font-size: 16px; + color: @brand-font-color-d1; + height: @height; + line-height: @height; + i { + font-size: 20px; + margin-right: 25px; + } + &, &:hover { + .io-badge { + top: (@height / 2) - 10px; + background: white; + color: @brand-font-color-d1; + } + } + &:hover { + background: darken(@brand-background-color-l1, 5%); + } + &-active, &-active:hover, &-selected, &-selected:hover { + border-right: none; + background: darken(@brand-background-color-l1, 7%); + .io-badge { + background: @brand-primary; + color: white; + } + } + } + + } + +} + +.io-badge { + height: 20px; + border-radius: 10px; + min-width: 20px; + background: #f50; + border: 1px solid transparent; + color: #fff; + line-height: 18px; + text-align: center; + padding: 0 6px; + font-size: 12px; + white-space: nowrap; + transform-origin: -10% center; + z-index: 10; + font-family: tahoma; + transition: all .3s ease-in-out; +} \ No newline at end of file diff --git a/uam-web/app/styles/components/nav-tabs.less b/uam-web/app/styles/components/nav-tabs.less new file mode 100644 index 0000000000000000000000000000000000000000..b7704aff7d88ece86a05af5cbd7c846fd330b3af --- /dev/null +++ b/uam-web/app/styles/components/nav-tabs.less @@ -0,0 +1,36 @@ +/** + * nav tabs + */ +ul.nav-tabs { + // @brand-background-color; + background: white; + margin-top: 10px; + border-color: @border-color; + li { + &:first-child { + margin-left: 48px; + } + a { + color: @brand-font-color-d1; + padding: 6px 25px; + &:hover { + background: #f8f8f8; + } + } + &.active{ + a { + background: white !important; + color: @brand-font-color-d1 !important; + background: none; + border-bottom: none; + border-color: @border-color; + } + } + &.active { + a { + position: relative; + bottom: -1px; + } + } + } +} \ No newline at end of file diff --git a/uam-web/app/styles/components/tool-tips.less b/uam-web/app/styles/components/tool-tips.less new file mode 100644 index 0000000000000000000000000000000000000000..6e1ea8e1bafe0d27274bd5e5556167a674b9dde0 --- /dev/null +++ b/uam-web/app/styles/components/tool-tips.less @@ -0,0 +1,140 @@ +.io-tooltips { + position: relative; + display: inline-block; + visibility: visible; + font-size: 12px; + line-height: 1.5; + opacity: .9; + margin-right: 6px; +} + +.io-tooltips-hidden .io-tooltips-content { + display: none; +} + +.io-tooltips-content { + position: absolute; + display: block; + visibility: visible; + font-size: 12px; + line-height: 1.5; + opacity: .9; + padding: 5px 0 8px; + z-index: 10; +} + +.io-tooltips-placement-top,.io-tooltips-placement-topLeft,.io-tooltips-placement-topRight { + padding: 5px 0 9px; +} + +.io-tooltips-placement-right,.io-tooltips-placement-rightBottom,.io-tooltips-placement-rightTop { + padding: 0 5px 0 9px; +} + +.io-tooltips-placement-bottom,.io-tooltips-placement-bottomLeft,.io-tooltips-placement-bottomRight { + padding: 9px 0 5px; +} + +.io-tooltips-placement-left,.io-tooltips-placement-leftBottom,.io-tooltips-placement-leftTop { + padding: 0 9px 0 5px; +} + +.io-tooltips-inner { + max-width: 250px; + min-width: 68px; + padding: 8px 10px; + color: #fff; + text-align: center; + text-decoration: none; + background-color: #373737; + border-radius: 3px; + box-shadow: 0 0 4px rgba(0,0,0,.17); + min-height: 34px; + z-index: 9; +} + +.io-tooltips-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.io-tooltips-placement-top .io-tooltips-arrow,.io-tooltips-placement-topLeft .io-tooltips-arrow,.io-tooltips-placement-topRight .io-tooltips-arrow { + bottom: 4px; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #373737; +} + +.io-tooltips-placement-top .io-tooltips-arrow { + left: 50%; +} + +.io-tooltips-placement-topLeft .io-tooltips-arrow { + left: 15%; +} + +.io-tooltips-placement-topRight .io-tooltips-arrow { + right: 15%; +} + +.io-tooltips-placement-right .io-tooltips-arrow,.io-tooltips-placement-rightBottom .io-tooltips-arrow,.io-tooltips-placement-rightTop .io-tooltips-arrow { + left: -4px; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #373737; +} + +.io-tooltips-placement-right .io-tooltips-arrow { + top: 46%; +} + +.io-tooltips-placement-rightTop .io-tooltips-arrow { + top: 25%; + margin-top: 0; +} + +.io-tooltips-placement-rightBottom .io-tooltips-arrow { + bottom: 25%; +} + +.io-tooltips-placement-left .io-tooltips-arrow,.io-tooltips-placement-leftBottom .io-tooltips-arrow,.io-tooltips-placement-leftTop .io-tooltips-arrow { + right: -4px; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #373737; +} + +.io-tooltips-placement-left .io-tooltips-arrow { + top: 46%; +} + +.io-tooltips-placement-leftTop .io-tooltips-arrow { + top: 25%; + margin-top: 0; +} + +.io-tooltips-placement-leftBottom .io-tooltips-arrow { + bottom: 25%; +} + +.io-tooltips-placement-bottom .io-tooltips-arrow,.io-tooltips-placement-bottomLeft .io-tooltips-arrow,.io-tooltips-placement-bottomRight .io-tooltips-arrow { + top: 0; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #373737; +} + +.io-tooltips-placement-bottom .io-tooltips-arrow { + left: 50%; +} + +.io-tooltips-placement-bottomLeft .io-tooltips-arrow { + left: 15%; +} + +.io-tooltips-placement-bottomRight .io-tooltips-arrow { + right: 15%; +} \ No newline at end of file diff --git a/uam-web/app/styles/components/ui-switcher.less b/uam-web/app/styles/components/ui-switcher.less new file mode 100644 index 0000000000000000000000000000000000000000..c8e5aabf8dbda0d39e3c2725270a896a3b13de56 --- /dev/null +++ b/uam-web/app/styles/components/ui-switcher.less @@ -0,0 +1,43 @@ +/** + * ui-switcher + */ +.ui-switcher { + background: @gray-d3; + display: inline-block; + position: relative; + text-align: center; + color: @gray-d5; + @radius: 5px; + @width: 47px; + @height: 24px; + &::after { + font-family: "anticon" !important; + font-style: normal; + vertical-align: baseline; + text-align: center; + text-transform: none; + text-rendering: auto; + transition: transform .3s ease; + content: "\e603"; + // right: 16px; + position: relative; + top: -3px; + display: inline-block; + font-weight: bold; + font-size: 22px; + transform: scale(0.66666667) rotate(180deg); + zoom: 1; + } + &-top { + width: @width; + height: @height; + border-bottom-left-radius: @radius; + border-bottom-right-radius: @radius; + line-height: @height; + &.open { + &::after { + transform: rotate(180deg) + } + } + } +} diff --git a/uam-web/app/styles/components/upload-file-modal.less b/uam-web/app/styles/components/upload-file-modal.less new file mode 100644 index 0000000000000000000000000000000000000000..e2583a22f53864627f6dc3512312f41bc0e469aa --- /dev/null +++ b/uam-web/app/styles/components/upload-file-modal.less @@ -0,0 +1,37 @@ +/** + * 文件上传模态框 + */ +.upload-file-modal { + .modal-content { + margin-top: 20vh; + .modal-body { + background: @brand-background-color; + overflow-y: hidden; + padding: 30px; + max-height: 100vh; + } + .title { + margin-bottom: 20px; + } + .upload-area { + height: 347px; + background: white; + border: solid 1px #D2D2D2; + text-align: center; + padding-top: 84px; + padding-bottom: 60px; + img { + width: 144px; + } + p { + font-size: 18px; + margin: 20px 0; + color: @brand-font-color-d1; + } + } + .io-btn { + border-radius: 0; + padding: 4px 20px; + } + } +} \ No newline at end of file diff --git a/uam-web/app/styles/mixins.less b/uam-web/app/styles/mixins.less new file mode 100644 index 0000000000000000000000000000000000000000..8fbd42e33c75a2fdb45b06f59d4d183864a212f2 --- /dev/null +++ b/uam-web/app/styles/mixins.less @@ -0,0 +1,48 @@ +// mixins for clearfix +// ------------------------ +.clearfix() { + zoom: 1; + &:before, + &:after { + content: " "; + display: table; + } + &:after { + clear: both; + visibility: hidden; + font-size: 0; + height: 0; + } +} + +.card-box(@padding: 20px) { + overflow: hidden; + box-sizing: border-box; + background: #FFFFFF; + border: 1px solid @border-color; + box-shadow: 0px 1px 2px 0px rgba(0,0,0,0.22); + padding: @padding; + color: #868686; + position: relative; + border-radius: 3px; + &:hover { + /* Rectangle 11: */ + border: 1px solid #36A5FA; + box-shadow: 0px 0px 8px 0px #6ABEFF; + transition: all .1s ease-in-out; + } +} + +.ellipsis { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.abs() { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; +} diff --git a/uam-web/app/styles/routes/application/app-body-menu.less b/uam-web/app/styles/routes/application/app-body-menu.less new file mode 100644 index 0000000000000000000000000000000000000000..801d9b668ed154489204758e05b024908b7987d5 --- /dev/null +++ b/uam-web/app/styles/routes/application/app-body-menu.less @@ -0,0 +1,65 @@ +.app-body__menu { + background: @brand-background-color-d2; + padding-top: 18px; + .io-menu { + outline: 0; + margin-bottom: 0; + padding-left: 0; + list-style: none; + z-index: 999; + box-shadow: 0 0 4px rgba(0, 0, 0, .17); + color: #FFF; + background: #2E323E; + line-height: 46px; + box-shadow: none; + .io-menu-item { + .ioicon, + .idcicon { + margin-right: 5px; + font-size: 18px; + vertical-align: middle; + } + + > a { + color: @brand-font-color; + font-size: 14px; + text-decoration: none; + } + &:hover, &-selected, &-active{ + color: white; + >a { + color: white; + } + } + } + } + + .io-menu-submenu-open .io-menu-inline .io-menu-item { + background: #282B35; + } + + .io-menu-submenu-open .io-menu-inline .io-menu-item:hover { + background: #202027; + } + + + .io-menu-item-selected, + .io-menu-item-active:hover, + .io-menu-item-active:visited, + .io-menu-submenu-active .io-menu-submenu-title:hover { + padding-left: 44px !important; + background: #202027; + color: #FFF; + } + .io-menu-inline, .io-menu-vertical { + border: 0; + } + .io-menu-submenu-title { + -webkit-transition: padding-left 1s ease; + transition: padding-left 1s ease; + } + + .io-menu-item-active, .io-menu-submenu-title:hover { + background-color: #2E323E; + } +} \ No newline at end of file diff --git a/uam-web/app/styles/routes/application/app-common.less b/uam-web/app/styles/routes/application/app-common.less new file mode 100644 index 0000000000000000000000000000000000000000..5b540872a19ddf4ca393b9f4b6ca3f68fd251a34 --- /dev/null +++ b/uam-web/app/styles/routes/application/app-common.less @@ -0,0 +1,86 @@ +/** + * application common + */ +html, html body, body > div.ember-view{ + height: 100%; + width: 100%; + padding: 0; + margin: 0; + background: #CED2DB; //@brand-background-color; + font-size: 14px; + font-family: Arial,"Microsoft YaHei", "微软雅黑", sans-serif; + overflow: hidden; +} + +@media screen and (min-width:~'0\0') { + body { + letter-spacing: .09em; + } +} + +canvas, iframe{ + border: none; + outline: none; +} + +.scroll { + overflow: auto; + &-y { + overflow-y: auto; + } + &-x { + overflow-x: auto; + } +} + +/** + * modal + */ +.modal-dialog { + margin-top: 10vh; + .nav-tabs { + padding-top: 15px; + } + .modal-header { + .close { + color: white; + opacity: .8; + } + } + .modal-content .modal-body{ + min-height: 30vh; + //max-height: 65vh; + } +} + +.io-table th { + background: #F6F7FA; +} + +.bg-primary { + background: #555F74; +} + + +/** + * font-size 调整 + */ +.io-btn, .btn, .panel-title { + font-size: 14px; + font-weight: bold; +} +label, input, td, th, .form-control { + font-size: 14px; +} +.form-group label { + font-weight: normal; +} + + +.io-table table { + overflow: visible; +} + +.io-select-dropdown-menu-item-tenant li { + padding: 0px 15px +} \ No newline at end of file diff --git a/uam-web/app/styles/routes/application/index.less b/uam-web/app/styles/routes/application/index.less new file mode 100644 index 0000000000000000000000000000000000000000..0aad7c99bc59b0cca1e9d33e168e4723fc65dade --- /dev/null +++ b/uam-web/app/styles/routes/application/index.less @@ -0,0 +1,163 @@ +@import "app-common"; +@import "app-body-menu"; +@import "search"; + +.app-header__logo a img { + width: 100px!important; +} + + +/** + * app-structure + */ +.application { + height: 100%; + width: 100%; + position: absolute; + overflow: hidden; + @header-height: 51px; + @body-menu-width: 67px; + >.app-header { + height: @header-height; + } + >.app-body-wrapper { + .abs(); + top: @header-height; + >.app-body { + height: 100%; + >.app-body__menu { + width: @body-menu-width; + position: absolute; + top: 0; + left: 0; + bottom: 0; + } + >.app-body__main{ + .abs(); + left: @body-menu-width; + >.app-body__main__content { + height: ~'calc(100% - 47px)'; + overflow-y: auto; + } + >.inner-app { + .abs(); + margin: 23px; + background: white; + } + } + } + } +} + +/** + * inner-app-strcucture + */ + +.inner-app { + @context-bar-bg: #F8F9FA; + @context-bar-height: 41px; + @border-radius: 5px; + @nav-width: 256px; + @nav-padding: 15px; + @border-color: #E0E2E5; + border-radius: @border-radius; + color: @brand-font-color-d1; + &__context-bar { + border-top-left-radius: @border-radius; + border-top-right-radius: @border-radius; + height: @context-bar-height; + line-height: @context-bar-height; + background: @context-bar-bg; + /* Rectangle 95: */ + background-image: linear-gradient(-180deg, #F0F2F6 0%, #FFFFFF 100%); + box-shadow: 0px 2px 2px 0px rgba(0,0,0,0.05); + color: @brand-font-color-d1; + padding: 0 @nav-padding; + padding-left: 0; + border-bottom: solid 1px @border-color; + .context-bar-nav-header { + padding: 0 @nav-padding; + width: @nav-width; + display: inline-block; + box-shadow: 2px 0 2px 0 rgba(0,0,0,.07); + border-right: solid 1px @border-color; + /* Rectangle 80: */ + &.no-shadow { + box-shadow: none; + border-right: none; + } + } + .context-bar-button { + background-image: linear-gradient(-180deg,#FFF 0,#EFF2F8 100%); + border: 1px solid #CDD3DF; + box-shadow: inset 0px 1px 0px 0px #FFFFFF; + border-radius: 3px; + padding: 5px; + font-size: 15px; + display: inline-block; + line-height: 16px; + margin-top: 6px; + margin-left: 6px; + outline: none; + &-danger { + color: @brand-danger; + } + } + .context-bar__icon { + color: @brand-font-color-d1; + font-size: 16px; + i { + font-size: 20px; + margin-right: 2px; + } + } + .input-group.search { + border-radius: @border-radius; + background: white; + border: solid 1px #ddd; + // line-height: 1; + margin-right: 0; + } + .context-bar__right-button-group { + margin-right: 20px; + } + } + &__nav { + position: absolute; + top: @context-bar-height; + left: 0; + bottom: 0; + width: @nav-width; + overflow-y: auto; + padding: @nav-padding; + border-right: solid 1px @border-color; + } + &__main { + position: absolute; + top: @context-bar-height; + left: @nav-width; + right: 0; + bottom: 0; + overflow-y: auto; + overflow-x: hidden; + padding: 42px; + background: white; + &.collapsed { + left: 0; + padding: 0; + } + } +} + +.point { + @size: 8px; + width: @size; + height: @size; + display: inline-block; + border-radius: @size; + background: @brand-primary; + margin: 0 5px; + vertical-align: middle; +} + + diff --git a/uam-web/app/styles/routes/application/search.less b/uam-web/app/styles/routes/application/search.less new file mode 100644 index 0000000000000000000000000000000000000000..528c7062b5b7822a01a979ba144e72f7fd3d0a79 --- /dev/null +++ b/uam-web/app/styles/routes/application/search.less @@ -0,0 +1,61 @@ +.inline-search { + padding-bottom: 10px; + border-bottom: 1px solid #F3F3F3; + .form-group { + .form-control, + .io-input, + .io-select, + .form-item, + .submit-button-wrapper { + width: 140px; + display: inline-block; + } + margin: 0; + } + .search-group { + text-align: center; + .io-btn { + padding: 4px 10px; + i { + margin-right: 4px; + } + } + } +} + +.io-btn { + i { + margin-right: 5px; + } +} + +.selectbox { + h3 { + font-size: 14px; + margin-bottom: 10px; + } + hr { + margin: 10px 0; + } + @min-height: 66vh; //450px + .clearfix(); + border-radius: 3px; + border: @border; + &__menu, &__content { + height: @min-height; + overflow-y: auto; + } + + &__menu { + border-right: @border; + } + &__content { + padding: 20px; + } +} + +.empty { + color: #999; + text-align: center; + margin-top: 20%; +} \ No newline at end of file diff --git a/uam-web/app/styles/routes/user-group.less b/uam-web/app/styles/routes/user-group.less new file mode 100644 index 0000000000000000000000000000000000000000..a149829944f1e51585622b3a1db2f8d7efdd63ab --- /dev/null +++ b/uam-web/app/styles/routes/user-group.less @@ -0,0 +1,59 @@ +/** + * 用户清单 + */ +.user-list { + width: 730px; + &-selectbox { + margin: auto; + height: 500px; + margin: 30px auto; + border: @border; + border-radius: 3px; + &__menu, &__content { + height: 100%; + } + + &__menu { + overflow-y: auto; + border-right: @border; + } + &__content { + table { + width: 100%; + margin-bottom: 0; + } + .table-body-wrapper { + height: 408px; + overflow-y: auto; + } + } + .empty { + color: #999; + text-align: center; + margin-top: 30%; + } + } + &-selected { + h3 { + font-size: 14px; + margin-bottom: 15px; + } + } +} + +.io-steps { + .io-steps-head-inner { + i { + position: relative; + bottom: 2px; + left: 1px; + } + } + .io-steps-status-process { + .io-steps-head-inner { + i { + color: white; + } + } + } +} \ No newline at end of file diff --git a/uam-web/app/styles/vars.less b/uam-web/app/styles/vars.less new file mode 100644 index 0000000000000000000000000000000000000000..1ba497d3f7bc7b6c9d7b82442e831fb3d2938f74 --- /dev/null +++ b/uam-web/app/styles/vars.less @@ -0,0 +1,50 @@ +/** + * [brand-color] + * @type {[type]} + */ +@brand-primary: #4CADF8; +@brand-success: #16DB7E; +@brand-warning: #F9D13B; +@brand-danger: #FC6262; +@brand-progress: #8877FA; + +@primary-color: @brand-primary; +@success-color: @brand-success; +@danger-color: @brand-danger; +@warning-color: @brand-warning; + +/** + * [background-color] + * @type {[type]} + */ +@brand-background-color: #CED2DB; +@brand-background-color-d1: #5F6374; +@brand-background-color-d2: #2E323E; +@brand-background-color-d3: #202027; +@brand-background-color-d4: #17191A; +@brand-background-color-l1: #E5E9EE; + +/** + * font color + * @type {[type]} + */ +@brand-font-color: #989FB4; +@brand-font-color-d1: #373B47; + +/** + * gray levels + * @type {[type]} + */ +@gray-d3: #454545; +@gray-d4: #333; +@gray-d5: #212020; + +@sidebar-width: 200px; +@body-padding: 26px; +@border-radius-base: 3px; +@border-color: #D8DBE5; + +@grid-columns: 24; +@screen-xlg-min: 1800px; +@screen-lg: 1270px; +@border: 1px solid #d9d9d9; diff --git a/uam-web/app/templates/partial/group-oper.hbs b/uam-web/app/templates/partial/group-oper.hbs new file mode 100644 index 0000000000000000000000000000000000000000..2e8b3ee63f0791d2860ae27454eabb9e68f0208a --- /dev/null +++ b/uam-web/app/templates/partial/group-oper.hbs @@ -0,0 +1,24 @@ +{{!-- +<a type="button" class="io-table__btn" {{action 'sendAction' 'allocateUser' "USER" record}}>分配用户</a> +<a type="button" class="io-table__btn" {{action 'sendAction' 'allocateRole' "ROLE" record}}>分配角色</a> +<a type="button" class="io-table__btn" {{action 'sendAction' 'viewUsers' record}}>查看用户列表</a> +<a type="button" class="io-table__btn io-table__btn-danger" {{action 'sendAction' 'update' "INFO" record}}>{{io-icon type="edit"}}</a> +&nbsp; +<a type="button" class="io-table__btn io-table__btn-danger" {{action 'sendAction' 'delete' record}}>{{io-icon type="delete"}}</a> +--}} + +{{#tool-tips type="bottom" tip="分配用户"}} + <span {{action 'sendAction' 'allocateUser' "USER" record}} class="h4 text-primary" ><i class="idcicon idcicon-usermanager"></i></span> +{{/tool-tips}} + +{{#tool-tips type="bottom" tip="分配角色"}} + <span {{action 'sendAction' 'allocateRole' "ROLE" record}} class="h4 text-primary" ><i class="idcicon idcicon-rolemanager"></i></span> +{{/tool-tips}} + +{{#tool-tips type="bottom" tip="编辑"}} + <span {{action 'sendAction' 'update' "INFO" record}} class="h4 text-primary" >{{io-icon type="edit"}}</span> +{{/tool-tips}} + +{{#tool-tips type="bottom" tip="删除"}} + <span {{action 'sendAction' 'delete' record}} class="h4 text-danger" >{{io-icon type="delete"}}</span> +{{/tool-tips}} \ No newline at end of file diff --git a/uam-web/app/templates/partial/group-sel-roles.hbs b/uam-web/app/templates/partial/group-sel-roles.hbs new file mode 100644 index 0000000000000000000000000000000000000000..a8ac0615bb0bc892cebb2b3b23d0c4fccfbd1839 --- /dev/null +++ b/uam-web/app/templates/partial/group-sel-roles.hbs @@ -0,0 +1,20 @@ +<span> +{{#io-dropdown}} + {{#io-dropdown-trigger}} + {{record.firstValue}} + {{#if (eq record.roleNumbers 0)}} + {{else if (eq record.roleNumbers 1)}} + {{else}} + {{io-icon type="down"}} + {{/if}} + {{/io-dropdown-trigger}} + + {{#io-dropdown-overlay}} + {{#io-menu}} + {{#each record.selRoles as |item|}} + {{#io-menu-item}} {{item}} {{/io-menu-item}} + {{/each}} + {{/io-menu}} + {{/io-dropdown-overlay}} +{{/io-dropdown}} +</span> \ No newline at end of file diff --git a/uam-web/app/templates/partial/group-type.hbs b/uam-web/app/templates/partial/group-type.hbs new file mode 100644 index 0000000000000000000000000000000000000000..f2db1332d0facb81833dcdeb914b1d58be7bd8b5 --- /dev/null +++ b/uam-web/app/templates/partial/group-type.hbs @@ -0,0 +1,11 @@ +<span> +{{#if (eq record.type "default")}} +默认 +{{else if (eq record.type "project")}} +项目组 +{{else if (eq record.type "recheck")}} +复核 +{{else if (eq record.type "approval")}} +审批 +{{/if}} +</span> \ No newline at end of file diff --git a/uam-web/app/templates/partial/import-priview/data-status.hbs b/uam-web/app/templates/partial/import-priview/data-status.hbs new file mode 100644 index 0000000000000000000000000000000000000000..5ee1d762ac89b86e1addda0fd7f0d33d6151eb9f --- /dev/null +++ b/uam-web/app/templates/partial/import-priview/data-status.hbs @@ -0,0 +1,17 @@ +{{#if (eq record.dataStatus "0")}} + <span style="font-size:12px; color: #4CADF8;" > + 更新 + </span> +{{else if (eq record.dataStatus "1")}} + <span style="font-size:12px; color: #4CADF8" > + 新增 + </span> +{{else if (eq record.dataStatus "2")}} + <span style="font-size:12px; color: #4CADF8" > + 新增 + </span> +{{else}} + <span style="font-size:12px; color: #FA4848" > + {{record.dataStatus}} + </span> +{{/if}} \ No newline at end of file diff --git a/uam-web/app/templates/partial/import-priview/dept-full-name.hbs b/uam-web/app/templates/partial/import-priview/dept-full-name.hbs new file mode 100644 index 0000000000000000000000000000000000000000..8434c02340db5ec4decaa724565d98f4c084b1b8 --- /dev/null +++ b/uam-web/app/templates/partial/import-priview/dept-full-name.hbs @@ -0,0 +1,4 @@ +<span style="font-size:12px"> +{{record.deptFullName}} + +</span> \ No newline at end of file diff --git a/uam-web/app/templates/partial/import-priview/email.hbs b/uam-web/app/templates/partial/import-priview/email.hbs new file mode 100644 index 0000000000000000000000000000000000000000..761dd0534abde7be8db04419c4f7c8b74633c4b7 --- /dev/null +++ b/uam-web/app/templates/partial/import-priview/email.hbs @@ -0,0 +1,4 @@ +<span style="font-size:12px"> +{{record.email}} + +</span> \ No newline at end of file diff --git a/uam-web/app/templates/partial/import-priview/login-id.hbs b/uam-web/app/templates/partial/import-priview/login-id.hbs new file mode 100644 index 0000000000000000000000000000000000000000..ed2c0082b6ac6bc0a3e0a5f9b5a200026f51b0dd --- /dev/null +++ b/uam-web/app/templates/partial/import-priview/login-id.hbs @@ -0,0 +1,4 @@ +<span style="font-size:12px"> +{{record.loginId}} + +</span> \ No newline at end of file diff --git a/uam-web/app/templates/partial/import-priview/mobile.hbs b/uam-web/app/templates/partial/import-priview/mobile.hbs new file mode 100644 index 0000000000000000000000000000000000000000..d4af2ab9146ca377b9ac88a4f425d579072cad33 --- /dev/null +++ b/uam-web/app/templates/partial/import-priview/mobile.hbs @@ -0,0 +1,4 @@ +<span style="font-size:12px"> +{{record.mobile1}} + +</span> \ No newline at end of file diff --git a/uam-web/app/templates/partial/import-priview/name.hbs b/uam-web/app/templates/partial/import-priview/name.hbs new file mode 100644 index 0000000000000000000000000000000000000000..4f15096457970486905a39e5917b6cdf9f8df408 --- /dev/null +++ b/uam-web/app/templates/partial/import-priview/name.hbs @@ -0,0 +1,4 @@ +<span style="font-size:12px"> +{{record.name}} + +</span> \ No newline at end of file diff --git a/uam-web/app/templates/partial/import-priview/office-tel.hbs b/uam-web/app/templates/partial/import-priview/office-tel.hbs new file mode 100644 index 0000000000000000000000000000000000000000..6d389a853e0f50568f32f8b2ace58e3eec5077d9 --- /dev/null +++ b/uam-web/app/templates/partial/import-priview/office-tel.hbs @@ -0,0 +1,4 @@ +<span style="font-size:12px"> +{{record.officeTel1}} + +</span> \ No newline at end of file diff --git a/uam-web/app/templates/partial/import-priview/password.hbs b/uam-web/app/templates/partial/import-priview/password.hbs new file mode 100644 index 0000000000000000000000000000000000000000..5a7c3f388c29d21e16ead07a68288c52ef5b6818 --- /dev/null +++ b/uam-web/app/templates/partial/import-priview/password.hbs @@ -0,0 +1,9 @@ +{{#if (eq record.password "*")}} + <span style="font-size:12px; color: #6ABEFF" > + 不更新 + </span> +{{else}} + <span style="font-size:12px"> + {{record.password}} + </span> +{{/if}} \ No newline at end of file diff --git a/uam-web/app/templates/partial/import-priview/remark.hbs b/uam-web/app/templates/partial/import-priview/remark.hbs new file mode 100644 index 0000000000000000000000000000000000000000..a69a4b39eb83a0a8a3327e2b0751668c227b1f61 --- /dev/null +++ b/uam-web/app/templates/partial/import-priview/remark.hbs @@ -0,0 +1,4 @@ +<span style="font-size:12px"> +{{record.remark}} + +</span> \ No newline at end of file diff --git a/uam-web/app/templates/partial/import-priview/source-type.hbs b/uam-web/app/templates/partial/import-priview/source-type.hbs new file mode 100644 index 0000000000000000000000000000000000000000..5c28933a8116628ef82c301a919bb3f87aabcb08 --- /dev/null +++ b/uam-web/app/templates/partial/import-priview/source-type.hbs @@ -0,0 +1,9 @@ +<span> +{{#if (eq record.sourceType "native")}} +UAM +{{else if (eq record.sourceType "ldap")}} +LDAP +{{else if (eq record.sourceType "webank")}} +webank +{{/if}} +</span> diff --git a/uam-web/app/templates/partial/import-priview/title.hbs b/uam-web/app/templates/partial/import-priview/title.hbs new file mode 100644 index 0000000000000000000000000000000000000000..11fbb6999e108eec4b72fb55c36f171d91495ce6 --- /dev/null +++ b/uam-web/app/templates/partial/import-priview/title.hbs @@ -0,0 +1,4 @@ +<span style="font-size:12px"> +{{record.title}} + +</span> \ No newline at end of file diff --git a/uam-web/app/templates/partial/look-up.hbs b/uam-web/app/templates/partial/look-up.hbs new file mode 100644 index 0000000000000000000000000000000000000000..a74d459a19532719c190c88b381f592e987c4f51 --- /dev/null +++ b/uam-web/app/templates/partial/look-up.hbs @@ -0,0 +1 @@ +<a {{action 'sendAction' 'lookUpAction' record}}>{{record.name}}</a> \ No newline at end of file diff --git a/uam-web/app/templates/partial/res-oper.hbs b/uam-web/app/templates/partial/res-oper.hbs new file mode 100644 index 0000000000000000000000000000000000000000..27d8b8a04c2510f50d06552e79988aae38500f1b --- /dev/null +++ b/uam-web/app/templates/partial/res-oper.hbs @@ -0,0 +1,13 @@ +{{!-- +<a type="button" class="io-table__btn io-table__btn-danger" {{action 'sendAction' 'update' record}}>{{io-icon type="edit"}}</a> +&nbsp;&nbsp;&nbsp; +<a type="button" class="io-table__btn io-table__btn-danger" {{action 'sendAction' 'delete' record}}>{{io-icon type="delete"}}</a> +--}} + +{{#tool-tips type="bottom" tip="编辑"}} + <span {{action 'sendAction' 'update' record}} class="h4 text-primary" >{{io-icon type="edit"}}</span> +{{/tool-tips}} + +{{#tool-tips type="bottom" tip="删除"}} + <span {{action 'sendAction' 'delete' record}} class="h4 text-danger" >{{io-icon type="delete"}}</span> +{{/tool-tips}} \ No newline at end of file diff --git a/uam-web/app/templates/partial/role-oper.hbs b/uam-web/app/templates/partial/role-oper.hbs new file mode 100644 index 0000000000000000000000000000000000000000..1b66e33cd7e9fef0ca8ea03afcfb0f12b0187159 --- /dev/null +++ b/uam-web/app/templates/partial/role-oper.hbs @@ -0,0 +1,12 @@ +{{#tool-tips type="bottom" tip="分配权限"}} +<span {{action 'sendAction' 'allocateGroup' "PERMISSION" record}} class="h4 text-primary" ><i class="idcicon idcicon-permissiondistribution"></i></span> +{{/tool-tips}} +{{#tool-tips type="bottom" tip="分配用户组"}} +<span {{action 'sendAction' 'allocateGroup' "GROUP" record}} class="h4 text-primary" ><i class="idcicon idcicon-usergroup"></i></span> +{{/tool-tips}} +{{#tool-tips type="bottom" tip="编辑"}} +<span {{action 'sendAction' 'update' "INFO" record}} class="h4 text-primary" >{{io-icon type="edit"}}</span> +{{/tool-tips}} +{{#tool-tips type="bottom" tip="删除"}} +<span {{action 'sendAction' 'delete' record}} class="h4 text-danger" >{{io-icon type="delete"}}</span> +{{/tool-tips}} \ No newline at end of file diff --git a/uam-web/app/templates/partial/tenant-look-up.hbs b/uam-web/app/templates/partial/tenant-look-up.hbs new file mode 100644 index 0000000000000000000000000000000000000000..05e6853cf832e9c9fe190e5524e607987408ea51 --- /dev/null +++ b/uam-web/app/templates/partial/tenant-look-up.hbs @@ -0,0 +1 @@ +<a {{action 'sendAction' 'lookUpAction' record}}>{{record.tenantName}}</a> \ No newline at end of file diff --git a/uam-web/app/templates/partial/tenant-oper.hbs b/uam-web/app/templates/partial/tenant-oper.hbs new file mode 100644 index 0000000000000000000000000000000000000000..c3c987e9bd682a04525e0c38a68951d18864f9c5 --- /dev/null +++ b/uam-web/app/templates/partial/tenant-oper.hbs @@ -0,0 +1,8 @@ + +{{#tool-tips type="bottom" tip="编辑"}} + <span {{action 'sendAction' 'update' "edit" record}} class="h4 text-primary" >{{io-icon type="edit"}}</span> +{{/tool-tips}} + +{{#tool-tips type="bottom" tip="删除"}} + <span {{action 'sendAction' 'delete' record}} class="h4 text-danger" >{{io-icon type="delete"}}</span> +{{/tool-tips}} \ No newline at end of file diff --git a/uam-web/app/templates/partial/tree-node-with-icon.hbs b/uam-web/app/templates/partial/tree-node-with-icon.hbs new file mode 100644 index 0000000000000000000000000000000000000000..7b39e21d963c3ad191943095260983059ef8f997 --- /dev/null +++ b/uam-web/app/templates/partial/tree-node-with-icon.hbs @@ -0,0 +1,9 @@ +<span {{action 'select'}} class="{{nodeSelectedClasses}}"> + {{!-- {{log model.icon}} --}} + {{#if model.icon}} + <i class={{model.icon}}></i> + {{else}} + <i class="{{tree.treeNodeIcon}}"></i> + {{/if}} + {{model.title}} +</span> \ No newline at end of file diff --git a/uam-web/app/templates/partial/user-look-up.hbs b/uam-web/app/templates/partial/user-look-up.hbs new file mode 100644 index 0000000000000000000000000000000000000000..a74d459a19532719c190c88b381f592e987c4f51 --- /dev/null +++ b/uam-web/app/templates/partial/user-look-up.hbs @@ -0,0 +1 @@ +<a {{action 'sendAction' 'lookUpAction' record}}>{{record.name}}</a> \ No newline at end of file diff --git a/uam-web/app/templates/partial/user-oper.hbs b/uam-web/app/templates/partial/user-oper.hbs new file mode 100644 index 0000000000000000000000000000000000000000..fdea8d3d7e312df02b2e7930722713550d3f3139 --- /dev/null +++ b/uam-web/app/templates/partial/user-oper.hbs @@ -0,0 +1,37 @@ +{{!-- <a type="button" class="io-table__btn" {{action 'sendAction' 'allocateRole' "ROLE" record}}>分配角色</a> +<a type="button" class="io-table__btn" {{action 'sendAction' 'allocateGroup' "GROUP" record}}>分配用户组</a> --}} + +{{#tool-tips type="bottom" tip="编辑"}} + <span {{action 'sendAction' 'viewPersonModalWindow' "edit" record}} class="h4 text-primary" >{{io-icon type="edit"}}</span> +{{/tool-tips}} + +{{#tool-tips type="bottom" tip="分配用户组"}} + <span {{action 'sendAction' 'allocateGroup' "GROUP" record}} class="h4 text-primary" ><i class="idcicon idcicon-usergroup"></i></span> +{{/tool-tips}} + +{{#if (eq record.sourceType "native")}} + {{#tool-tips type="bottom" tip="重置密码"}} + <span {{action 'sendAction' 'resetPW' record}} class="h4 text-danger" ><img width="23" height="23" src="/img/key.png"/></span> + {{/tool-tips}} + + {{#tool-tips type="bottom" tip="发放Token"}} + <span {{action 'sendAction' 'grantToken' record}} class="h4 text-danger" ><img width="18" height="18" src="/img/token.png"/></span> + {{/tool-tips}} +{{/if}} + +{{#if (eq record.status "ENABLED")}} + {{#tool-tips type="bottom" tip="禁用"}} + <span {{action 'sendAction' 'enabled' record}} class="h4 text-danger" ><img width="18" height="18" src="/img/lock.png"/></span> + {{/tool-tips}} +{{else}} + {{#tool-tips type="bottom" tip="激活"}} + <span {{action 'sendAction' 'enabled' record}} class="h4 text-danger" ><img width="18" height="18" src="/img/unlock.png"/></span> + {{/tool-tips}} +{{/if}} + +{{#tool-tips type="bottom" tip="删除"}} + <span {{action 'sendAction' 'delete' record}} class="h4 text-danger" >{{io-icon type="delete"}}</span> +{{/tool-tips}} + + + diff --git a/uam-web/app/templates/partial/user-sel-groups.hbs b/uam-web/app/templates/partial/user-sel-groups.hbs new file mode 100644 index 0000000000000000000000000000000000000000..5fb2c658c44a6e7f2a0e0111445f3998a310f0e6 --- /dev/null +++ b/uam-web/app/templates/partial/user-sel-groups.hbs @@ -0,0 +1,19 @@ +<span> +{{#io-dropdown}} + {{#io-dropdown-trigger}} + {{record.firstValue}} + {{#if (eq record.groupNumbers 0)}} + {{else if (eq record.groupNumbers 1)}} + {{else}} + {{io-icon type="down"}} + {{/if}} + {{/io-dropdown-trigger}} + {{#io-dropdown-overlay}} + {{#io-menu}} + {{#each record.selGroups as |item|}} + {{#io-menu-item}} {{item}} {{/io-menu-item}} + {{/each}} + {{/io-menu}} + {{/io-dropdown-overlay}} +{{/io-dropdown}} +</span> diff --git a/uam-web/app/templates/partial/user-sourcetype.hbs b/uam-web/app/templates/partial/user-sourcetype.hbs new file mode 100644 index 0000000000000000000000000000000000000000..5c28933a8116628ef82c301a919bb3f87aabcb08 --- /dev/null +++ b/uam-web/app/templates/partial/user-sourcetype.hbs @@ -0,0 +1,9 @@ +<span> +{{#if (eq record.sourceType "native")}} +UAM +{{else if (eq record.sourceType "ldap")}} +LDAP +{{else if (eq record.sourceType "webank")}} +webank +{{/if}} +</span> diff --git a/uam-web/app/templates/partial/user-status.hbs b/uam-web/app/templates/partial/user-status.hbs new file mode 100644 index 0000000000000000000000000000000000000000..1601b53d579e59ad685c680cc1bd8677948d52a9 --- /dev/null +++ b/uam-web/app/templates/partial/user-status.hbs @@ -0,0 +1,11 @@ +<span> +{{#if (eq record.status "ENABLED")}} +激活 +{{else if (eq record.status "DISABLED")}} +禁用 +{{else if (eq record.status "INIT")}} +初始 +{{else if (eq record.status "LOCKED")}} +锁定 +{{/if}} +</span> \ No newline at end of file diff --git a/uam-web/bower.json b/uam-web/bower.json new file mode 100644 index 0000000000000000000000000000000000000000..40a5fc1ce9fd0290e24e96237456012d1cc8a31d --- /dev/null +++ b/uam-web/bower.json @@ -0,0 +1,18 @@ +{ + "name": "hf-cmdbs-web", + "dependencies": { + "ember": "1.13.13", + "ember-cli-shims": "~0.1.1", + "ember-cli-test-loader": "0.2.1", + "ember-data": "1.13.16", + "ember-load-initializers": "0.1.7", + "ember-qunit": "0.4.20", + "ember-qunit-notifications": "0.1.0", + "ember-resolver": "~0.1.20", + "jquery": "1.11.3", + "loader.js": "ember-cli/loader.js#3.4.0", + "qunit": "~1.20.0", + "font-awesome": "~4.5.0", + "spectrum": "^1.8.0" + } +} diff --git a/uam-web/config/environment.js b/uam-web/config/environment.js new file mode 100644 index 0000000000000000000000000000000000000000..24b94a0cdc650ed089e3be75ad41f2c58ed12b23 --- /dev/null +++ b/uam-web/config/environment.js @@ -0,0 +1,59 @@ +/* jshint node: true */ + +module.exports = function(environment) { + var ENV = { + modulePrefix: 'clouduam-web', + environment: environment, + baseURL: '/', + locationType: 'hash', + ecmascript: '6', + EmberENV: { + FEATURES: { + // Here you can enable experimental features on an ember canary build + // e.g. 'with-controller': true + } + }, + + APP: { + rootElement: '#AppRoot' + // Here you can pass flags/options to your application instance + // when it is created + }, + + contentSecurityPolicy: { + 'default-src': "'none'", + 'script-src': "'self' 'unsafe-inline' 'unsafe-eval' use.typekit.net connect.facebook.net maps.googleapis.com maps.gstatic.com", + 'font-src': "'self' data: at.alicdn.com fonts.gstatic.com", + 'connect-src': "'self'", + 'img-src': "'self' data: www.facebook.com p.typekit.net", + 'style-src': "'self' 'unsafe-inline' use.typekit.net", + 'frame-src': "s-static.ak.facebook.com static.ak.facebook.com www.facebook.com" + } + }; + + if (environment === 'development') { + // ENV.APP.LOG_RESOLVER = true; + // ENV.APP.LOG_ACTIVE_GENERATION = true; + // ENV.APP.LOG_TRANSITIONS = true; + // ENV.APP.LOG_TRANSITIONS_INTERNAL = true; + // ENV.APP.LOG_VIEW_LOOKUPS = true; + } + + if (environment === 'test') { + // Testem prefers this... + ENV.baseURL = '/'; + ENV.locationType = 'none'; + + // keep test console output quieter + ENV.APP.LOG_ACTIVE_GENERATION = false; + ENV.APP.LOG_VIEW_LOOKUPS = false; + + ENV.APP.rootElement = '#ember-testing'; + } + + if (environment === 'production') { + + } + + return ENV; +}; diff --git a/uam-web/ember-cli-build.js b/uam-web/ember-cli-build.js new file mode 100644 index 0000000000000000000000000000000000000000..7e2512bd7581a01a598c5aba97816a65ecbe4ba1 --- /dev/null +++ b/uam-web/ember-cli-build.js @@ -0,0 +1,56 @@ +/*jshint node:true*/ +/* global require, module */ +var EmberApp = require('ember-cli/lib/broccoli/ember-app'); + +module.exports = function (defaults) { + + defaults.overwrite = true; + + var app = new EmberApp({ + lessOptions: { + sourceMap: false + }, + minifyCSS: { + enabled: true, + options: { + exclude: ["vendor/**/*"] + } + }, + minifyJS: { + options: { + exclude: ["vendor/**/*"] + } + }, + fingerprint: { + exclude: ["vendor/**/*"] + }, + outputPaths: { + app: { + css: { + common: '/assets/common.css', + bootstrap: '/assets/bootstrap.css' + } + } + }, + 'ember-cli-less': { + mergeTrees: { + overwrite: true + } + } + }); + + // Use `app.import` to add additional libraries to the generated + // output files. + // + // If you need to use different assets in different + // environments, specify an object as the first parameter. That + // object's keys should be the environment name and the values + // should be the asset to use in that environment. + // + // If the library that you are including contains AMD or ES6 + // modules that you would like to import into your application + // please specify an object with the list of modules as keys + // along with the exports of each module as its value. + + return app.toTree(); +}; diff --git a/uam-web/lib/.jshintrc b/uam-web/lib/.jshintrc new file mode 100644 index 0000000000000000000000000000000000000000..839c191fa9d2414682440ba190f53d0ab178dd60 --- /dev/null +++ b/uam-web/lib/.jshintrc @@ -0,0 +1,4 @@ +{ + "node": true, + "browser": false +} diff --git a/uam-web/lib/publish/index.js b/uam-web/lib/publish/index.js new file mode 100644 index 0000000000000000000000000000000000000000..bdbc3678843640a7c61318279ff06f4950e0227b --- /dev/null +++ b/uam-web/lib/publish/index.js @@ -0,0 +1,44 @@ +var fs = require('fs-extra'), + path = require('path'), + exec = require('child_process').exec, + BUILDENV = 'production', + currentBuidEnv = ''; +module.exports = { + name: 'publish', + isDevelopingAddon: function() { + return true; + }, + outputReady: function(results) { + var env = process.env.EMBER_ENV || currentBuidEnv; + console.log('in ' + env + ' mode'); + if (env === BUILDENV) { + var bin = path.resolve(__dirname, '../../bin'); + var dist = path.resolve(__dirname, '../../dist'); + + console.log('\n Copy dist to bin.... \n'); + try { + // remove from git + exec('git rm -r --cached --ignore-unmatch ' + bin, function (error, stdout, stderr) { + console.log(' Remove bin from repository \n'); + if (!!stdout) { + console.log('stdout: ' + stdout); + } + if (!!stderr) { + console.log('stderr: ' + stderr); + } + if (error !== null) { + console.log('exec error: ' + error); + } + }); + } catch (err) { + console.error(err); + } + + fs.emptyDirSync(bin); + fs.copySync(dist, bin); + } + }, + config: function(env, baseConfig) { + currentBuidEnv = env; + } +}; diff --git a/uam-web/lib/publish/package.json b/uam-web/lib/publish/package.json new file mode 100644 index 0000000000000000000000000000000000000000..661d71aabecf19f6c4463eb2db76650c869135cd --- /dev/null +++ b/uam-web/lib/publish/package.json @@ -0,0 +1,6 @@ +{ + "name": "publish", + "keywords": [ + "ember-addon" + ] +} diff --git a/uam-web/package-lock.json b/uam-web/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..5f9b773d5cc0c9765a36c68ef2b86588263d0a24 --- /dev/null +++ b/uam-web/package-lock.json @@ -0,0 +1,11297 @@ +{ + "name": "clouduam-web", + "version": "1.10.2", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@sailshq/lodash": { + "version": "3.10.4", + "resolved": "http://registry.npmjs.org/@sailshq/lodash/-/lodash-3.10.4.tgz", + "integrity": "sha512-YXJqp9gdHcZKAmBY/WnwFpPtNQp2huD/ME2YMurH2YHJvxrVzYsmpKw/pb7yINArRpp8E++fwbQd3ajYXGA45Q==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "abort-controller": { + "version": "3.0.0", + "resolved": "http://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "accepts": { + "version": "1.3.8", + "resolved": "http://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "after": { + "version": "0.8.1", + "resolved": "http://registry.npmjs.org/after/-/after-0.8.1.tgz", + "integrity": "sha512-SuI3vWhCFeSmkmmJ3efyuOkrhGyp/AuHthh3F5DinGYh2kR9t/0xUlm3/Vn2qMScfgg+cKho5fW7TUEYUhYeiA==", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "http://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "alter": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/alter/-/alter-0.2.0.tgz", + "integrity": "sha512-Wuss6JIZ6h4j2+NgU2t+9mSwS7gBSZJbU4Dg8xETguAD2veJUSuCrvTIiC78QgZE7/zX7h6OnXw2PiiCBirEGw==", + "dev": true, + "requires": { + "stable": "~0.1.3" + } + }, + "amd-name-resolver": { + "version": "0.0.2", + "resolved": "http://registry.npmjs.org/amd-name-resolver/-/amd-name-resolver-0.0.2.tgz", + "integrity": "sha512-C3DqWR/upivadPhkPuyNhNi0u6OeN3ZWa/aoW1K5WuKT0z0A/znRlvqu3Hut6bnj8juMBsYJ7yE80UgyZSC1GQ==", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "http://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "http://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "ansicolors": { + "version": "0.2.1", + "resolved": "http://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz", + "integrity": "sha512-tOIuy1/SK/dr94ZA0ckDohKXNeBNqZ4us6PjMVLs5h1w2GBB6uPtOknp2+VF4F/zcy9LI70W+Z+pE2Soajky1w==", + "dev": true + }, + "anymatch": { + "version": "1.3.2", + "resolved": "http://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "aproba": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "are-we-there-yet": { + "version": "4.0.0", + "resolved": "http://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-4.0.0.tgz", + "integrity": "sha512-nSXlV+u3vtVjRgihdTzbfWYzxPWGo424zPgQbHD0ZqIla3jqYAewDcvee0Ua2hjS5IfTAmjGlx1Jf0PKwjZDEw==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^4.1.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "http://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + } + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "array-equal": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/array-equal/-/array-equal-1.0.2.tgz", + "integrity": "sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "http://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.6", + "resolved": "http://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha512-6ZjfQaBSy6CuIH0+B0NrxMfDE5VIOCP/5gOqSpEIsaAZx9/giszzrXg6PZ7G51U/n88UmlAgYLNQ9wAnII7PJA==", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "http://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "optional": true + }, + "asn1": { + "version": "0.2.6", + "resolved": "http://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha512-u1L0ZLywRziOVjUhRxI0Qg9G+4RnFB9H/Rq40YWn0dieDgO7vAYeJz6jKAO6t/aruzlDFLAPkQTT87e+f8Imaw==", + "dev": true, + "optional": true + }, + "ast-traverse": { + "version": "0.1.1", + "resolved": "http://registry.npmjs.org/ast-traverse/-/ast-traverse-0.1.1.tgz", + "integrity": "sha512-CPuE4BWIhJjsNMvFkrzjiBgOl56NJTuBPBkBqyRyfq/nZtx1Z1f5I+qx7G/Zt+FAOS+ABhghkEuWJrfW9Njjog==", + "dev": true + }, + "ast-types": { + "version": "0.9.6", + "resolved": "http://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", + "integrity": "sha512-qEdtR2UH78yyHX/AUNfXmJTlM48XoFZKBdwi1nzkI1mJL21cmbu0cvjxjpkXJ5NENMq42H+hNs8VLJcqXLerBQ==", + "dev": true + }, + "async": { + "version": "2.6.4", + "resolved": "http://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-disk-cache": { + "version": "1.3.5", + "resolved": "http://registry.npmjs.org/async-disk-cache/-/async-disk-cache-1.3.5.tgz", + "integrity": "sha512-VZpqfR0R7CEOJZ/0FOTgWq70lCrZyS1rkI8PXugDUkTKyyAUgZ2zQ09gLhMkEn+wN8LYeUTPxZdXtlX/kmbXKQ==", + "dev": true, + "requires": { + "debug": "^2.1.3", + "heimdalljs": "^0.2.3", + "istextorbinary": "2.1.0", + "mkdirp": "^0.5.0", + "rimraf": "^2.5.3", + "rsvp": "^3.0.18", + "username-sync": "^1.0.2" + } + }, + "async-promise-queue": { + "version": "1.0.5", + "resolved": "http://registry.npmjs.org/async-promise-queue/-/async-promise-queue-1.0.5.tgz", + "integrity": "sha512-xi0aQ1rrjPWYmqbwr18rrSKbSaXIeIwSd1J4KAgVfkq8utNbdZoht7GfvfY6swFUAMJ9obkc4WPJmtGwl+B8dw==", + "dev": true, + "requires": { + "async": "^2.4.1", + "debug": "^2.6.8" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "http://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "http://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha512-JnJpAS0p9RmixkOvW2XwDxxzs1bd4/VAGIl6Q0EC5YOo+p+hqIhtDhn/nmFnB/xUNXbLkpE2mOjgVIBRKD4xYw==", + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.12.0", + "resolved": "http://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true, + "optional": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "http://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "http://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "http://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "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" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "http://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "babel-core": { + "version": "5.8.38", + "resolved": "http://registry.npmjs.org/babel-core/-/babel-core-5.8.38.tgz", + "integrity": "sha512-aVoPuaEiJJ/vqFpYuGp3kHOrKeKciCkjDE/e9va3VoSPAe37Qc0+9AZ+gBgIMTu8V8reCt2lW809e8k1KJQdaQ==", + "dev": true, + "requires": { + "babel-plugin-constant-folding": "^1.0.1", + "babel-plugin-dead-code-elimination": "^1.0.2", + "babel-plugin-eval": "^1.0.1", + "babel-plugin-inline-environment-variables": "^1.0.1", + "babel-plugin-jscript": "^1.0.4", + "babel-plugin-member-expression-literals": "^1.0.1", + "babel-plugin-property-literals": "^1.0.1", + "babel-plugin-proto-to-assign": "^1.0.3", + "babel-plugin-react-constant-elements": "^1.0.3", + "babel-plugin-react-display-name": "^1.0.3", + "babel-plugin-remove-console": "^1.0.1", + "babel-plugin-remove-debugger": "^1.0.1", + "babel-plugin-runtime": "^1.0.7", + "babel-plugin-undeclared-variables-check": "^1.0.2", + "babel-plugin-undefined-to-void": "^1.1.6", + "babylon": "^5.8.38", + "bluebird": "^2.9.33", + "chalk": "^1.0.0", + "convert-source-map": "^1.1.0", + "core-js": "^1.0.0", + "debug": "^2.1.1", + "detect-indent": "^3.0.0", + "esutils": "^2.0.0", + "fs-readdir-recursive": "^0.1.0", + "globals": "^6.4.0", + "home-or-tmp": "^1.0.0", + "is-integer": "^1.0.4", + "js-tokens": "1.0.1", + "json5": "^0.4.0", + "lodash": "^3.10.0", + "minimatch": "^2.0.3", + "output-file-sync": "^1.1.0", + "path-exists": "^1.0.0", + "path-is-absolute": "^1.0.0", + "private": "^0.1.6", + "regenerator": "0.8.40", + "regexpu": "^1.3.0", + "repeating": "^1.1.2", + "resolve": "^1.1.6", + "shebang-regex": "^1.0.0", + "slash": "^1.0.0", + "source-map": "^0.5.0", + "source-map-support": "^0.2.10", + "to-fast-properties": "^1.0.0", + "trim-right": "^1.0.0", + "try-resolve": "^1.0.0" + }, + "dependencies": { + "core-js": { + "version": "1.2.7", + "resolved": "http://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA==", + "dev": true + }, + "js-tokens": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/js-tokens/-/js-tokens-1.0.1.tgz", + "integrity": "sha512-WKqed1YxjsT7sGqM2IdbkJHnA3rXHqFqN+4xUy973UeYNjSXZCKM3G/zUmPNYut/6D9QCUbqegDmUCQRdm0lnQ==", + "dev": true + }, + "lodash": { + "version": "3.10.1", + "resolved": "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==", + "dev": true + }, + "minimatch": { + "version": "2.0.10", + "resolved": "http://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha512-jQo6o1qSVLEWaw3l+bwYA2X0uLuK2KjNh2wjgO7Q/9UJnXr1Q3yQKR8BI0/Bt/rPg75e6SMW4hW/6cBHVTZUjA==", + "dev": true, + "requires": { + "brace-expansion": "^1.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "http://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "detect-indent": { + "version": "4.0.0", + "resolved": "http://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A==", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA==", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "http://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + } + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "http://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha512-gCtfYORSG1fUMX4kKraymq607FWgMWg+j42IFPc18kFQEsmtaibP4UrqsXt8FlEJle25HUd4tsoDR7H2wDhe9Q==", + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "http://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha512-RL8n2NiEj+kKztlrVJM9JT1cXzzAdvWFh76xh/H1I4nKwunzE4INBXn8ieCZ+wh4zWszZk7NBS1s/8HR5jDkzQ==", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "http://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha512-bHkmjcC9lM1kmZcVpA5t2om2nzT/xiZpo6TJq7UlZ3wqKfzia4veeXbIhKvJXAMzhhEBd3cR1IElL5AenWEUpA==", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "http://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha512-qe5csbhbvq6ccry9G7tkXbzNtcDiH4r51rrPUbwwoTzZ18AqxWYRZT6AOmxrpxKnQBW0pYlBI/8vh73Z//78nQ==", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "http://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha512-Oo6+e2iX+o9eVvJ9Y5eKL5iryeRdsIkwRYheCuhYdVHsdEQysbc2z2QkqCLIYnNxkT5Ss3ggrHdXiDI7Dhrn4Q==", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "http://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha512-WfgKFX6swFB1jS2vo+DwivRN4NB8XUdM3ij0Y1gnC21y1tdBoe6xjVnd7NSI6alv+gZXCtJqvrTeMW3fR/c0ng==", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "http://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha512-zAYl3tqerLItvG5cKYw7f1SpvIxS9zi7ohyGHaI9cgDUjAT6YcY9jIEH5CstetP5wHIVSceXwNS7Z5BpJg+rOw==", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "http://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha512-Op9IhEaxhbRT8MDXx2iNuMgciu2V8lDvYCNQbDGjdBNCjaMvyLf4wl4A3b8IgndCyQF8TwfgsQ8T3VD8aX1/pA==", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "http://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha512-VlPiWmqmGJp0x0oK27Out1D+71nVVCTSdlbhIVoaBAj2lUgrNjBCRR9+llO4lTSb2O4r7PJg+RobRkhBrf6ofg==", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "http://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha512-RYqaPD0mQyQIFRu7Ho5wE2yvA/5jxqCIj/Lv4BXNq23mHYu/vxikOy2JueLiBxQknwapwrJeNCesvY0ZcfnlHg==", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "http://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha512-sLI+u7sXJh6+ToqDr57Bv973kCepItDhMou0xCP2YPVmR1jkHSCY+p1no8xErbV1Siz5QE8qKT1WIwybSWlqjw==", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "http://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ==", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "http://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w==", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "http://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha512-B1M5KBP29248dViEo1owyY32lk1ZSH2DaNNrXLGt8lyjjHm7pBqAdQ7VKUPR6EEDO323+OvT3MQXbCin8ooWdA==", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-constant-folding": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/babel-plugin-constant-folding/-/babel-plugin-constant-folding-1.0.1.tgz", + "integrity": "sha512-Rvhz9+o8/Bbqq6qTCO7FUPYxhrzqd/XkIY482DdYrXpFbhhqDu/xZZUd5/vYHV3oEE1poW+M10pjRZELDepwyQ==", + "dev": true + }, + "babel-plugin-dead-code-elimination": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz", + "integrity": "sha512-wbVXBByKqaaIL3+3a9bRSLAL0GYhQWYmQCWTaGTXOsqqe1Jhi+qaj8/H+yQ5GMiJhvYEQiawzOCjCS1dmjvE5g==", + "dev": true + }, + "babel-plugin-eval": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz", + "integrity": "sha512-Yu9H5PbQKGVp/O/BFXUUbHVIUzBeZtEL+Yk+Io8ND4NobQYW8eg/ztToMkn+1/dQrQjaOeFtiBKtkYBwWLvFhw==", + "dev": true + }, + "babel-plugin-htmlbars-inline-precompile": { + "version": "0.1.1", + "resolved": "http://registry.npmjs.org/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-0.1.1.tgz", + "integrity": "sha512-uG5QNBSmVOXwgOKo1pHXxTS47GppolC9FOzpiAcU5BbD/P/SrJ08XUY6PBttul4DvfmyhdYdh6cTCBxDTB7Etw==", + "dev": true + }, + "babel-plugin-inline-environment-variables": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/babel-plugin-inline-environment-variables/-/babel-plugin-inline-environment-variables-1.0.1.tgz", + "integrity": "sha512-upNlt2GMmPkLMtJEQEqJB+Y1OeNs78W5+toLTYD/zotypPg0K2w79fFfmiee34ehvLwOZL7khxtkPU54IS1Kvw==", + "dev": true + }, + "babel-plugin-jscript": { + "version": "1.0.4", + "resolved": "http://registry.npmjs.org/babel-plugin-jscript/-/babel-plugin-jscript-1.0.4.tgz", + "integrity": "sha512-eMT10ilWqWvBtGL70fFVciexOcjfPaeOHsyfp5OuumTFPSxla2kJTZuDzIpTbKspHVFyzCGxY6NpGJolfVywgQ==", + "dev": true + }, + "babel-plugin-member-expression-literals": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/babel-plugin-member-expression-literals/-/babel-plugin-member-expression-literals-1.0.1.tgz", + "integrity": "sha512-Ql/UCGOaA0nQP/9H0MfhFSn2U1m2mLsJFo76NDVBQry5uCDbF8++Uv4VyAtyQ8s6UHcoIKxepzRbZGl//X569w==", + "dev": true + }, + "babel-plugin-property-literals": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/babel-plugin-property-literals/-/babel-plugin-property-literals-1.0.1.tgz", + "integrity": "sha512-ZS1JuVJuo0j8IW2RRk8xA6MR/i14KIAhmDNHkipFn51uXe1S/hCH6u+V7TweF9aroT07F9PoxtENmuhFfVvq4g==", + "dev": true + }, + "babel-plugin-proto-to-assign": { + "version": "1.0.4", + "resolved": "http://registry.npmjs.org/babel-plugin-proto-to-assign/-/babel-plugin-proto-to-assign-1.0.4.tgz", + "integrity": "sha512-VY0VnODP15n5ORbJNFIQ0lzewhf+XqkcwbA5UpeeJ96/wIFmbvHK8fNAJoddHUuxl6b5hZtygVdSs3qwPAa/0A==", + "dev": true, + "requires": { + "lodash": "^3.9.3" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==", + "dev": true + } + } + }, + "babel-plugin-react-constant-elements": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/babel-plugin-react-constant-elements/-/babel-plugin-react-constant-elements-1.0.3.tgz", + "integrity": "sha512-5vv5DJ8NB5kKzjD5tqnkbm0znmKBzDDKFz82zJKn4hFxs1Vwk3WolLN8RypRzlDsddNQPLuDS/0xHq/u/J6i7w==", + "dev": true + }, + "babel-plugin-react-display-name": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/babel-plugin-react-display-name/-/babel-plugin-react-display-name-1.0.3.tgz", + "integrity": "sha512-IMO+IEvFKzZgLbmO+lGcoPKeD+pBg48T9p+ZgMbKkXyFvHk1pKeHsnhjV45GRxVBQC+SLYkmG7EHbXDWxfThOA==", + "dev": true + }, + "babel-plugin-remove-console": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/babel-plugin-remove-console/-/babel-plugin-remove-console-1.0.1.tgz", + "integrity": "sha512-dNNqqYeRa0HpJbL+bXgSXeNnkgHbpLuU9o3040iyQjzHoTrIRUwltRWy1ZZgluuw/P0j1ukUOZsiudLLVRCmKw==", + "dev": true + }, + "babel-plugin-remove-debugger": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/babel-plugin-remove-debugger/-/babel-plugin-remove-debugger-1.0.1.tgz", + "integrity": "sha512-/rGQc8sgCVpTEeWQhHZShzQjANqWxpwxPlY3RkG9keK5+NKdA2U6ukfC/cySoSa1XmFwM6NBO67QWuOGR/DHrg==", + "dev": true + }, + "babel-plugin-runtime": { + "version": "1.0.7", + "resolved": "http://registry.npmjs.org/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz", + "integrity": "sha512-tDVsSImhImOPIszO/6O4FhGW+o+PirMt53fkuBQ/plT41i2SRzTSnGvisrKtV/2jaAVSRnCiFwhN7v8dQ1Ymag==", + "dev": true + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha512-4Zp4unmHgw30A1eWI5EpACji2qMocisdXhAftfhXoSV9j0Tvj6nRFE3tOmRY912E0FMRm/L5xWE7MGVT2FoLnw==", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha512-Z/flU+T9ta0aIEKl1tGEmN/pZiI1uXmCiGFRegKacQfEJzp7iNsKloZmyJlQr+75FCJtiFfGIK03SiCvCt9cPQ==", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha512-Gx9CH3Q/3GKbhs07Bszw5fPTlU+ygrOGfAhEt7W2JICwufpC4SuO0mG0+4NykPBSYPMJhqvVlDBU17qB1D+hMQ==", + "dev": true + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "http://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha512-7BgYJujNCg0Ti3x0c/DL3tStvnKS6ktIYOmo9wginv/dfZOrbSZ+qG4IRRHMBOzZ5Awb1skTiAsQXg/+IWkZYw==", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha512-PCqwwzODXW7JMrzu+yZIaYbPQSKjDTAsNNlK2l5Gg9g4rz2VzLnZsStvp/3c46GfXpwkyufb3NCyG9+50FF1Vg==", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha512-2+ujAT2UMBzYFm7tidUsYh+ZoIutxJ3pN9IYrF1/H6dCKtECfhmB8UkHVpyxDwkj0CYbQG35ykoz925TUnBc3A==", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha512-YiN6sFAQ5lML8JjCmr7uerS5Yc/EMbgg9G8ZNmk2E3nYX4ckHR01wrkeeMijEf5WHNK5TW0Sl0Uu3pv3EdOJWw==", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha512-5Dy7ZbRinGrNtmWpquZKZ3EGY8sDgIVB4CU8Om8q8tnMLrD/m94cKglVcHps0BCTdZ0TJeeAWOq2TK9MIY6cag==", + "dev": true, + "requires": { + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha512-C/uAv4ktFP/Hmh01gMTvYvICrKze0XVX9f2PdIXuriCSvUmV9j+u+BB9f5fJK3+878yMK6dkdcq+Ymr9mrcLzw==", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha512-aNv/GDAW0j/f4Uy1OEPZn1mqD+Nfy9viFGBfQ5bZyT35YqOiqx7/tXdyfZkJ1sC21NyEsBdfDY6PYmLHF4r5iA==", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha512-ossocTuPOssfxO2h+Z3/Ea1Vo1wWx31Uqy9vIiJusOP4TbF7tPs9U0sJ9pX9OJPf4lXRGj5+6Gkl/HHKiAP5ug==", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha512-DLuRwoygCoXx+YfxHLkVx5/NpeSbVwfoTeBykpJK7JhYWlL/O8hgAK/reforUnZDlxasOrVPPJVI/guE3dCwkw==", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha512-iFp5KIcorf11iBqu/y/a7DK3MN5di3pNCzto61FqCNnUX4qeBwcV1SLqe10oXNnCaxBUImX3SckX2/o1nsrTcg==", + "dev": true, + "requires": { + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha512-tjFl0cwMPpDYyoqYA9li1/7mGFit39XiNX5DKC/uCNjBctMxyL1/PT/l4rSlbvBG1pOKI88STRdUsWXB3/Q9hQ==", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha512-LnIIdGWIKdw7zwckqx+eGjcS8/cl8D74A3BpJbGjKTFFNJSMrjN4bIh22HY1AlkUbeLG6X6OZj56BDvWD+OeFA==", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha512-ONFIPsq8y4bls5PPsAWYXH/21Hqv64TBxdje0FvU3MhIV6QM2j5YS7KvAzg/nTIVLot2D2fmFQrFWCbgHlFEjg==", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha512-LpVbiT9CLsuAIp3IG0tfbVo81QIhn6pE8xBJ7XSeCtFlMltuar5VuBV6y6Q45tpui9QWcy5i0vLQfCfrnF7Kiw==", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha512-8G5hpZMecb53vpD3mjs64NhI1au24TAmokQ4B+TBFBjN9cVoGoOvotdrMMRmHvVZUEvqGUPWL514woru1ChZMA==", + "dev": true, + "requires": { + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha512-8HxlW+BB5HqniD+nLkQ4xSAVq3bR/pcYW9IigY+2y0dI+Y7INFeTbfAQr+63T3E4UDsZGjyb+l9txUnABWxlOQ==", + "dev": true, + "requires": { + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha512-mDdocSfUVm1/7Jw/FIRNw9vPrBQNePy6wZJlR8HAUBLybNp1w/6lr6zZ2pjMShee65t/ybR5pT8ulkLzD1xwiw==", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha512-3Ghhi26r4l3d0Js933E5+IhHwk0A1yiutj9gwvzmFbVV0sPMYk2lekhOufHBswX7NCoSeF4Xrl3sCIuSIa+zOg==", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha512-CYP359ADryTo3pCsH0oxRo/0yn6UsEZLqYohHmvLQdfS9xkf+MbCzE3/Kolw9OYIY4ZMilH25z/5CbQbwDD+lQ==", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha512-x8b9W0ngnKzDMHimVtTfn5ryimars1ByTqsfBDwAqLibmuuQY6pgBQi5z1ErIsUOWBdw1bW9FSz5RZUojM4apg==", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha512-fz6J2Sf4gYN6gWgRZaoFXmq93X+Li/8vf+fb0sGDVtdeWvxC9y5/bTD7bvfWMEq6zetGEHpWjtzRGSugt5kNqw==", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "http://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha512-v61Dbbihf5XxnYjtBN04B/JBvsScY37R1cZT5r9permN1cp+b70DY3Ib3fIkgn1DI9U3tGgBJZVD8p/mE/4JbQ==", + "dev": true, + "requires": { + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha512-tJ9+S4oKjxY8IZ9jmjnp/mtytu1u3iyIQAfmI51IKWH6bFf7XR1ybtaO6j7INhZKXOTYADk7V5qxaqLkmNxiZQ==", + "dev": true, + "requires": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "http://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha512-jlQ9gYLfk2p3V5Ag5fYhA7fv7OHzd1KUH0PRP46xc3TgwjwgROIW572AfYg/X9kaNq/LJnu6oJcFRXlIrGoTRw==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + } + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "http://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha512-LzXDmbMkklvNhprr20//RStKVcT8Cu+SQtX18eMHLhjHf2yFzwtQ0S2f0jQ+89rokoNdmwoSqYzAhq86FxlLSQ==", + "dev": true, + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "http://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha512-LS+dBkUGlNR15/5WHKe/8Neawx663qttS6AGqoOUhICc9d1KciBvtrQSuc0PI+CxQ2Q/S1aKuJ+u64GtLdcEZg==", + "dev": true, + "requires": { + "regenerator-transform": "^0.10.0" + }, + "dependencies": { + "regenerator-transform": { + "version": "0.10.1", + "resolved": "http://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "requires": { + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" + } + } + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "http://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha512-j3KtSpjyLSJxNoCDrhwiJad8kw0gJ9REGj8/CqL0HeRyLnvUNYV9zcqluL6QJSXh3nfsLEmSLvwRfGzrgR96Pw==", + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" + } + }, + "babel-plugin-undeclared-variables-check": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/babel-plugin-undeclared-variables-check/-/babel-plugin-undeclared-variables-check-1.0.2.tgz", + "integrity": "sha512-NytRjvfh0DMsjUNaxOIROntf5c03PktIBQlTK6texdQZR7KhpeFxc2W8wGfF5LoJY13bHr2WnRY5xLZp6JXKOg==", + "dev": true, + "requires": { + "leven": "^1.0.2" + } + }, + "babel-plugin-undefined-to-void": { + "version": "1.1.6", + "resolved": "http://registry.npmjs.org/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz", + "integrity": "sha512-YAi+mWX+Al08e6Isbv8g2UigZUoVnZuuF/JFmG5uAZKQ+6EYILBCFmS28BedM7Ts4QbAIpSqwXdMBzej+9tHUg==", + "dev": true + }, + "babel-polyfill": { + "version": "6.26.0", + "resolved": "http://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "http://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==", + "dev": true + } + } + }, + "babel-preset-env": { + "version": "1.7.0", + "resolved": "http://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", + "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^3.2.6", + "invariant": "^2.2.2", + "semver": "^5.3.0" + }, + "dependencies": { + "browserslist": { + "version": "3.2.8", + "resolved": "http://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", + "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000844", + "electron-to-chromium": "^1.3.47" + } + }, + "semver": { + "version": "5.7.2", + "resolved": "http://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + } + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "http://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A==", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + }, + "dependencies": { + "babel-core": { + "version": "6.26.3", + "resolved": "http://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "http://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "http://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "http://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "http://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "http://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg==", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + }, + "dependencies": { + "babylon": { + "version": "6.18.0", + "resolved": "http://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + } + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "http://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + }, + "dependencies": { + "babylon": { + "version": "6.18.0", + "resolved": "http://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "globals": { + "version": "9.18.0", + "resolved": "http://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "http://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==", + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + }, + "dependencies": { + "to-fast-properties": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==", + "dev": true + } + } + }, + "babylon": { + "version": "5.8.38", + "resolved": "http://registry.npmjs.org/babylon/-/babylon-5.8.38.tgz", + "integrity": "sha512-jtLAtIWCbI17buqCVN4/DtuHf3N1w9ZvbwrTWIae+EBSu2N3sVGCwSJeiZdAkTH4KRwinfMQIyoovP/xZtRwXQ==", + "dev": true + }, + "backbone": { + "version": "1.5.0", + "resolved": "http://registry.npmjs.org/backbone/-/backbone-1.5.0.tgz", + "integrity": "sha512-RPKlstw5NW+rD2X4PnEnvgLhslRnXOugXw2iBloHkPMgOxvakP1/A+tZIGM3qCm8uvZeEf8zMm0uvcK1JwL+IA==", + "dev": true, + "requires": { + "underscore": ">=1.8.3" + } + }, + "backo2": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "http://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha512-437oANT9tP582zZMwSvZGy2nmSeAb8DW2me3y+Uv1Wp2Rulr8Mqlyrv3E7MLxmsiaPSMMDmiDVzgE+e8zlMx9g==", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "http://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "base64id": { + "version": "0.1.0", + "resolved": "http://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz", + "integrity": "sha512-DSjtfjhAsHl9J4OJj7e4+toV2zqxJrGwVd3CLlsCp8QmicvOn7irG0Mb8brOc/nur3SdO8lIbNlY1s1ZDJdUKQ==", + "dev": true + }, + "basic-auth": { + "version": "2.0.1", + "resolved": "http://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha512-bYeph2DFlpK1XmGs6fvlLRUN29QISM3GBuUwSFsMY2XRx4AvC0WNCS57j4c/xGrK2RS24C1w3YoBOsw9fT46tQ==", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "binaryextensions": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/binaryextensions/-/binaryextensions-2.3.0.tgz", + "integrity": "sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==", + "dev": true + }, + "blank-object": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/blank-object/-/blank-object-1.0.2.tgz", + "integrity": "sha512-kXQ19Xhoghiyw66CUiGypnuRpWlbHAzY/+NyvqTEdTfhfQGH1/dbEMYiXju7fYKIFePpzp/y9dsu5Cu/PkmawQ==", + "dev": true + }, + "blob": { + "version": "0.0.4", + "resolved": "http://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha512-YRc9zvVz4wNaxcXmiSgb9LAg7YYwqQ2xd0Sj6osfA7k/PKmIGVlnOYs3wOFdkRC9/JpQu8sGt/zHgJV7xzerfg==", + "dev": true + }, + "bluebird": { + "version": "2.11.0", + "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha512-UfFSr22dmHPQqPP9XWHRhq+gWnHCYguQGkXQlbyPtW5qTnhFWA8/iXg765tH0cAjy7l/zPJ1aBTO0g5XgA7kvQ==", + "dev": true + }, + "body-parser": { + "version": "1.20.1", + "resolved": "http://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "http://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "http://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + } + } + }, + "boom": { + "version": "2.10.1", + "resolved": "http://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha512-KbiZEa9/vofNcVJXGwdWWn25reQ3V3dHBWbS07FTF3/TOehLnm9GEhJV4T6ZvGPkShRpmUqYwnaCrkj0mRnP6Q==", + "dev": true, + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "bower": { + "version": "1.8.14", + "resolved": "http://registry.npmjs.org/bower/-/bower-1.8.14.tgz", + "integrity": "sha512-8Rq058FD91q9Nwthyhw0la9fzpBz0iwZTrt51LWl+w+PnJgZk9J+5wp3nibsJcIUPglMYXr4NRBaR+TUj0OkBQ==", + "dev": true + }, + "bower-config": { + "version": "0.6.1", + "resolved": "http://registry.npmjs.org/bower-config/-/bower-config-0.6.1.tgz", + "integrity": "sha512-K9pa3X37ESmS0zIm9Q1/68WksxOtqsTvsBFRXocvFVNacBCX4LghSZFqGFCukfabpGI3wVhka16AFuzK6jho8g==", + "dev": true, + "requires": { + "graceful-fs": "~2.0.0", + "mout": "~0.9.0", + "optimist": "~0.6.0", + "osenv": "0.0.3" + } + }, + "bower-endpoint-parser": { + "version": "0.2.2", + "resolved": "http://registry.npmjs.org/bower-endpoint-parser/-/bower-endpoint-parser-0.2.2.tgz", + "integrity": "sha512-YWZHhWkPdXtIfH3VRu3QIV95sa75O9vrQWBOHjexWCLBCTy5qJvRr36LXTqFwTchSXVlzy5piYJOjzHr7qhsNg==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "http://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "http://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "breakable": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/breakable/-/breakable-1.0.0.tgz", + "integrity": "sha512-+ityJqcjhozQNrezzTd2dtH/lkIXmE52HL+FohK2TOLQDl3QURTNkim+2C0xcso4Zehq/HM4Wkumcdz7Ue+XmA==", + "dev": true + }, + "broccoli": { + "version": "0.16.8", + "resolved": "http://registry.npmjs.org/broccoli/-/broccoli-0.16.8.tgz", + "integrity": "sha512-wIxcaf6bx2abUVzlXOrsJ6ROqj9l9Sycq0G5IaknO0CyyCivqihwMzNtBJg4Iajinmwip+OhjlS28cMnraY/KQ==", + "dev": true, + "requires": { + "broccoli-kitchen-sink-helpers": "^0.2.5", + "broccoli-slow-trees": "^1.0.0", + "commander": "^2.5.0", + "connect": "^3.3.3", + "copy-dereference": "^1.0.0", + "findup-sync": "^0.2.1", + "handlebars": "^3.0.1", + "mime": "^1.2.11", + "promise-map-series": "^0.2.1", + "quick-temp": "^0.1.2", + "rimraf": "^2.2.8", + "rsvp": "^3.0.17" + }, + "dependencies": { + "broccoli-kitchen-sink-helpers": { + "version": "0.2.9", + "resolved": "http://registry.npmjs.org/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz", + "integrity": "sha512-C+oEqivDofZv/h80rgN4WJkbZkbfwkrIeu8vFn4bb4m4jPd3ICNNplhkXGl3ps439pzc2yjZ1qIwz0yy8uHcQg==", + "dev": true, + "requires": { + "glob": "^5.0.10", + "mkdirp": "^0.5.1" + } + } + } + }, + "broccoli-asset-rev": { + "version": "2.7.0", + "resolved": "http://registry.npmjs.org/broccoli-asset-rev/-/broccoli-asset-rev-2.7.0.tgz", + "integrity": "sha512-GZ7gU3Qo6HMAUqDeh1q+4UVCQPJPjCyGcpIY5s9Qp58a244FT4nZSiy8qYkVC4LLIWTZt59G7jFFsUcj/13IPQ==", + "dev": true, + "requires": { + "broccoli-asset-rewrite": "^1.1.0", + "broccoli-filter": "^1.2.2", + "broccoli-persistent-filter": "^1.4.3", + "json-stable-stringify": "^1.0.0", + "minimatch": "^3.0.4", + "rsvp": "^3.0.6" + } + }, + "broccoli-asset-rewrite": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/broccoli-asset-rewrite/-/broccoli-asset-rewrite-1.1.0.tgz", + "integrity": "sha512-DLFMXCnaflEssBLEA1x6hzABOz8Zj7BXCHQkA/jVnpVzJcoHJaN1rn3AfZ2Hahrp4er9LMJAGxm8OI4lCXLBEQ==", + "dev": true, + "requires": { + "broccoli-filter": "^1.2.3" + } + }, + "broccoli-babel-transpiler": { + "version": "5.7.4", + "resolved": "http://registry.npmjs.org/broccoli-babel-transpiler/-/broccoli-babel-transpiler-5.7.4.tgz", + "integrity": "sha512-gI14Pqc4qbmn5RW4SuAmybLiOoYW59D+HzQyhY6WdaGMAjikKBwJN0p17phyvafQ+kvG0mUiMd83lgHLeATnEA==", + "dev": true, + "requires": { + "babel-core": "^5.0.0", + "broccoli-funnel": "^1.0.0", + "broccoli-merge-trees": "^1.0.0", + "broccoli-persistent-filter": "^1.4.2", + "clone": "^0.2.0", + "hash-for-dep": "^1.0.2", + "heimdalljs-logger": "^0.1.7", + "json-stable-stringify": "^1.0.0", + "rsvp": "^3.5.0", + "workerpool": "^2.3.0" + } + }, + "broccoli-caching-writer": { + "version": "3.0.3", + "resolved": "http://registry.npmjs.org/broccoli-caching-writer/-/broccoli-caching-writer-3.0.3.tgz", + "integrity": "sha512-g644Kb5uBPsy+6e2DvO3sOc+/cXZQQNgQt64QQzjA9TSdP0dl5qvetpoNIx4sy/XIjrPYG1smEidq9Z9r61INw==", + "dev": true, + "requires": { + "broccoli-kitchen-sink-helpers": "^0.3.1", + "broccoli-plugin": "^1.2.1", + "debug": "^2.1.1", + "rimraf": "^2.2.8", + "rsvp": "^3.0.17", + "walk-sync": "^0.3.0" + } + }, + "broccoli-clean-css": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/broccoli-clean-css/-/broccoli-clean-css-0.2.0.tgz", + "integrity": "sha512-UXrdt0UGjQ0D2dsTgcjRqSE5AybzQGPFrZGupQjVrkrCU0BKnFeADtG9rHK+UkusUO8osXyxW6jCGUI+O0SH+A==", + "dev": true, + "requires": { + "broccoli-filter": "^0.1.6", + "clean-css": "^2.2.1" + }, + "dependencies": { + "broccoli-filter": { + "version": "0.1.14", + "resolved": "http://registry.npmjs.org/broccoli-filter/-/broccoli-filter-0.1.14.tgz", + "integrity": "sha512-ZsOcLBVeSOzdSrRfKLMOtcYLV4fBfwOi3Oc+rJpy/2X0xmNvROYtGsftZI5YEYcI9yR9AgUk0Mtj3TfQymK/pg==", + "dev": true, + "requires": { + "broccoli-kitchen-sink-helpers": "^0.2.6", + "broccoli-writer": "^0.1.1", + "mkdirp": "^0.3.5", + "promise-map-series": "^0.2.1", + "quick-temp": "^0.1.2", + "rsvp": "^3.0.16", + "symlink-or-copy": "^1.0.1", + "walk-sync": "^0.1.3" + } + }, + "broccoli-kitchen-sink-helpers": { + "version": "0.2.9", + "resolved": "http://registry.npmjs.org/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz", + "integrity": "sha512-C+oEqivDofZv/h80rgN4WJkbZkbfwkrIeu8vFn4bb4m4jPd3ICNNplhkXGl3ps439pzc2yjZ1qIwz0yy8uHcQg==", + "dev": true, + "requires": { + "glob": "^5.0.10", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.6", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + } + } + }, + "mkdirp": { + "version": "0.3.5", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg==", + "dev": true + }, + "walk-sync": { + "version": "0.1.3", + "resolved": "http://registry.npmjs.org/walk-sync/-/walk-sync-0.1.3.tgz", + "integrity": "sha512-TxkEYAjyjVCrye/AjyV7NOb/Ww3jnf/MXQJxFanxJb6KhHGKja1S2H8sVEe/zKFJCIYegtZbFMrPm0XxU8CBmQ==", + "dev": true + } + } + }, + "broccoli-concat": { + "version": "2.3.8", + "resolved": "http://registry.npmjs.org/broccoli-concat/-/broccoli-concat-2.3.8.tgz", + "integrity": "sha512-QjkifZCURI7bjWiXpBNl+hp6GqrwecxhJXeWTYjzToaYJxpktdTsK6Y7Ky7DM8r36tFOu2Bz08stSXRBi4bsZw==", + "dev": true, + "requires": { + "broccoli-caching-writer": "^2.3.1", + "broccoli-kitchen-sink-helpers": "^0.3.1", + "broccoli-stew": "^1.3.3", + "fast-sourcemap-concat": "^1.0.1", + "fs-extra": "^0.30.0", + "lodash.merge": "^4.3.0", + "lodash.omit": "^4.1.0", + "lodash.uniq": "^4.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "http://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "broccoli-caching-writer": { + "version": "2.3.1", + "resolved": "http://registry.npmjs.org/broccoli-caching-writer/-/broccoli-caching-writer-2.3.1.tgz", + "integrity": "sha512-lfoDx98VaU8tG4mUXCxKdKyw2Lr+iSIGUjCgV83KC2zRC07SzYTGuSsMqpXFiOQlOGuoJxG3NRoyniBa1BWOqA==", + "dev": true, + "requires": { + "broccoli-kitchen-sink-helpers": "^0.2.5", + "broccoli-plugin": "1.1.0", + "debug": "^2.1.1", + "rimraf": "^2.2.8", + "rsvp": "^3.0.17", + "walk-sync": "^0.2.5" + }, + "dependencies": { + "broccoli-kitchen-sink-helpers": { + "version": "0.2.9", + "resolved": "http://registry.npmjs.org/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz", + "integrity": "sha512-C+oEqivDofZv/h80rgN4WJkbZkbfwkrIeu8vFn4bb4m4jPd3ICNNplhkXGl3ps439pzc2yjZ1qIwz0yy8uHcQg==", + "dev": true, + "requires": { + "glob": "^5.0.10", + "mkdirp": "^0.5.1" + } + } + } + }, + "broccoli-plugin": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/broccoli-plugin/-/broccoli-plugin-1.1.0.tgz", + "integrity": "sha512-dY1QsA20of9wWEto8yhN7JQjpfjySmgeIMsvnQ9aBAv1wEJJCe04B0ekdgq7Bduyx9yWXdoC5CngGy81swmp2w==", + "dev": true, + "requires": { + "promise-map-series": "^0.2.1", + "quick-temp": "^0.1.3", + "rimraf": "^2.3.4", + "symlink-or-copy": "^1.0.1" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "fast-sourcemap-concat": { + "version": "1.4.0", + "resolved": "http://registry.npmjs.org/fast-sourcemap-concat/-/fast-sourcemap-concat-1.4.0.tgz", + "integrity": "sha512-x90Wlx/2C83lfyg7h4oguTZN4MyaVfaiUSJQNpU+YEA0Odf9u659Opo44b0LfoVg9G/bOE++GdID/dkyja+XcA==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "fs-extra": "^5.0.0", + "heimdalljs-logger": "^0.1.9", + "memory-streams": "^0.1.3", + "mkdirp": "^0.5.0", + "source-map": "^0.4.2", + "source-map-url": "^0.3.0", + "sourcemap-validator": "^1.1.0" + }, + "dependencies": { + "fs-extra": { + "version": "5.0.0", + "resolved": "http://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "fs-extra": { + "version": "0.30.0", + "resolved": "http://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "jsonfile": { + "version": "2.4.0", + "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + } + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "http://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "http://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A==", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "walk-sync": { + "version": "0.2.7", + "resolved": "http://registry.npmjs.org/walk-sync/-/walk-sync-0.2.7.tgz", + "integrity": "sha512-OH8GdRMowEFr0XSHQeX5fGweO6zSVHo7bG/0yJQx6LAj9Oukz0C8heI3/FYectT66gY0IPGe89kOvU410/UNpg==", + "dev": true, + "requires": { + "ensure-posix-path": "^1.0.0", + "matcher-collection": "^1.0.0" + } + } + } + }, + "broccoli-config-loader": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/broccoli-config-loader/-/broccoli-config-loader-1.0.1.tgz", + "integrity": "sha512-MDKYQ50rxhn+g17DYdfzfEM9DjTuSGu42Db37A8TQHQe8geYEcUZ4SQqZRgzdAI3aRQNlA1yBHJfOeGmOjhLIg==", + "dev": true, + "requires": { + "broccoli-caching-writer": "^3.0.3" + } + }, + "broccoli-config-replace": { + "version": "1.1.2", + "resolved": "http://registry.npmjs.org/broccoli-config-replace/-/broccoli-config-replace-1.1.2.tgz", + "integrity": "sha512-qLlEY3V7p3ZWJNRPdPgwIM77iau1qR03S9BupMMFngjzBr7S6RSzcg96HbCYXmW9gfTbjRm9FC4CQT81SBusZg==", + "dev": true, + "requires": { + "broccoli-kitchen-sink-helpers": "^0.3.1", + "broccoli-plugin": "^1.2.0", + "debug": "^2.2.0", + "fs-extra": "^0.24.0" + }, + "dependencies": { + "fs-extra": { + "version": "0.24.0", + "resolved": "http://registry.npmjs.org/fs-extra/-/fs-extra-0.24.0.tgz", + "integrity": "sha512-w1RvhdLZdU9V3vQdL+RooGlo6b9R9WVoBanOfoJvosWlqSKvrjFlci2oVhwvLwZXBtM7khyPvZ8r3fwsim3o0A==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + } + } + }, + "broccoli-debug": { + "version": "0.6.5", + "resolved": "http://registry.npmjs.org/broccoli-debug/-/broccoli-debug-0.6.5.tgz", + "integrity": "sha512-RIVjHvNar9EMCLDW/FggxFRXqpjhncM/3qq87bn/y+/zR9tqEkHvTqbyOc4QnB97NO2m6342w4wGkemkaeOuWg==", + "dev": true, + "requires": { + "broccoli-plugin": "^1.2.1", + "fs-tree-diff": "^0.5.2", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "symlink-or-copy": "^1.1.8", + "tree-sync": "^1.2.2" + }, + "dependencies": { + "tree-sync": { + "version": "1.4.0", + "resolved": "http://registry.npmjs.org/tree-sync/-/tree-sync-1.4.0.tgz", + "integrity": "sha512-YvYllqh3qrR5TAYZZTXdspnIhlKAYezPYw11ntmweoceu4VK+keN356phHRIIo1d+RDmLpHZrUlmxga2gc9kSQ==", + "dev": true, + "requires": { + "debug": "^2.2.0", + "fs-tree-diff": "^0.5.6", + "mkdirp": "^0.5.1", + "quick-temp": "^0.1.5", + "walk-sync": "^0.3.3" + } + } + } + }, + "broccoli-filter": { + "version": "1.3.0", + "resolved": "http://registry.npmjs.org/broccoli-filter/-/broccoli-filter-1.3.0.tgz", + "integrity": "sha512-VXJXw7eBfG82CFxaBDjYmyN7V72D4In2zwLVQJd/h3mBfF3CMdRTsv2L20lmRTtCv1sAHcB+LgMso90e/KYiLw==", + "dev": true, + "requires": { + "broccoli-kitchen-sink-helpers": "^0.3.1", + "broccoli-plugin": "^1.0.0", + "copy-dereference": "^1.0.0", + "debug": "^2.2.0", + "mkdirp": "^0.5.1", + "promise-map-series": "^0.2.1", + "rsvp": "^3.0.18", + "symlink-or-copy": "^1.0.1", + "walk-sync": "^0.3.1" + } + }, + "broccoli-funnel": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/broccoli-funnel/-/broccoli-funnel-1.2.0.tgz", + "integrity": "sha512-0pbFNUA5Ml+gPPd58Rj/M26OS21+bMiV0F+m6+9OVzAhAdppVLxylSsXfWAt2WOD3kS+D8UsDv6GSmnZhbw/dw==", + "dev": true, + "requires": { + "array-equal": "^1.0.0", + "blank-object": "^1.0.1", + "broccoli-plugin": "^1.3.0", + "debug": "^2.2.0", + "exists-sync": "0.0.4", + "fast-ordered-set": "^1.0.0", + "fs-tree-diff": "^0.5.3", + "heimdalljs": "^0.2.0", + "minimatch": "^3.0.0", + "mkdirp": "^0.5.0", + "path-posix": "^1.0.0", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0", + "walk-sync": "^0.3.1" + }, + "dependencies": { + "exists-sync": { + "version": "0.0.4", + "resolved": "http://registry.npmjs.org/exists-sync/-/exists-sync-0.0.4.tgz", + "integrity": "sha512-cy5z7K+05RFxHAWY37dSDkPWmuTi+VzrA/xLwPDHmwQPMnO/kVhu6jheGaItlnNRoOE6f5MAjxy3VEupfrHigQ==", + "dev": true + } + } + }, + "broccoli-jshint": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/broccoli-jshint/-/broccoli-jshint-1.2.0.tgz", + "integrity": "sha512-P2TdLOdiGh/CcK6q1m4LF5coXjTNnFzAcTEoS9VLBW4Spo/h0ZRdTTN7LoxvSkDB7CRU6fgNHrrqCmy3ZaCXpg==", + "dev": true, + "requires": { + "broccoli-persistent-filter": "^1.2.0", + "chalk": "~0.4.0", + "findup-sync": "^0.3.0", + "jshint": "^2.7.0", + "json-stable-stringify": "^1.0.0", + "mkdirp": "~0.4.0" + }, + "dependencies": { + "ansi-styles": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha512-3iF4FIKdxaVYT3JqQuY3Wat/T2t7TRbbQ94Fu50ZUCbLy4TFbTzr90NOHQodQkNqmeEGCw8WbeP78WNi6SKYUA==", + "dev": true + }, + "chalk": { + "version": "0.4.0", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha512-sQfYDlfv2DGVtjdoQqxS0cEZDroyG8h6TamA6rvxwlrU5BaSLDx9xhatBYl2pxZ7gmpNaPFVwBtdGdu5rQ+tYQ==", + "dev": true, + "requires": { + "ansi-styles": "~1.0.0", + "has-color": "~0.1.0", + "strip-ansi": "~0.1.0" + } + }, + "findup-sync": { + "version": "0.3.0", + "resolved": "http://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", + "integrity": "sha512-z8Nrwhi6wzxNMIbxlrTzuUW6KWuKkogZ/7OdDVq+0+kxn77KUH1nipx8iU6suqkHqc4y6n7a9A8IpmxY/pTjWg==", + "dev": true, + "requires": { + "glob": "~5.0.0" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==", + "dev": true + }, + "mkdirp": { + "version": "0.4.2", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.4.2.tgz", + "integrity": "sha512-aiwEvGvWUEFscNrK7RnxM++ltHpm/dzoVZicG8jqFK0yr3FgSUJ174D3b9kackdgHLuRb9cWapcUCoXVELD0Pg==", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "strip-ansi": { + "version": "0.1.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha512-behete+3uqxecWlDAm5lmskaSaISA+ThQ4oNNBDTBJt0x2ppR6IPqfZNuj6BLaLJ/Sji4TPZlcRyOis8wXQTLg==", + "dev": true + } + } + }, + "broccoli-kitchen-sink-helpers": { + "version": "0.3.1", + "resolved": "http://registry.npmjs.org/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.3.1.tgz", + "integrity": "sha512-gqYnKSJxBSjj/uJqeuRAzYVbmjWhG0mOZ8jrp6+fnUIOgLN6MvI7XxBECDHkYMIFPJ8Smf4xaI066Q2FqQDnXg==", + "dev": true, + "requires": { + "glob": "^5.0.10", + "mkdirp": "^0.5.1" + } + }, + "broccoli-less-single": { + "version": "0.6.4", + "resolved": "http://registry.npmjs.org/broccoli-less-single/-/broccoli-less-single-0.6.4.tgz", + "integrity": "sha512-mlZEXdWpMZoa1ygzVtxVo7sgX/JT0orOn//xSZJW5PQCOz31m+4asi57gOQtq1RKz74NugU4siYAeoHIOEjkRw==", + "dev": true, + "requires": { + "broccoli-caching-writer": "^2.3.1", + "include-path-searcher": "^0.1.0", + "less": "^2.5.0", + "lodash.merge": "^3.3.2", + "mkdirp": "^0.5.0" + }, + "dependencies": { + "broccoli-caching-writer": { + "version": "2.3.1", + "resolved": "http://registry.npmjs.org/broccoli-caching-writer/-/broccoli-caching-writer-2.3.1.tgz", + "integrity": "sha512-lfoDx98VaU8tG4mUXCxKdKyw2Lr+iSIGUjCgV83KC2zRC07SzYTGuSsMqpXFiOQlOGuoJxG3NRoyniBa1BWOqA==", + "dev": true, + "requires": { + "broccoli-kitchen-sink-helpers": "^0.2.5", + "broccoli-plugin": "1.1.0", + "debug": "^2.1.1", + "rimraf": "^2.2.8", + "rsvp": "^3.0.17", + "walk-sync": "^0.2.5" + } + }, + "broccoli-kitchen-sink-helpers": { + "version": "0.2.9", + "resolved": "http://registry.npmjs.org/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz", + "integrity": "sha512-C+oEqivDofZv/h80rgN4WJkbZkbfwkrIeu8vFn4bb4m4jPd3ICNNplhkXGl3ps439pzc2yjZ1qIwz0yy8uHcQg==", + "dev": true, + "requires": { + "glob": "^5.0.10", + "mkdirp": "^0.5.1" + } + }, + "broccoli-plugin": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/broccoli-plugin/-/broccoli-plugin-1.1.0.tgz", + "integrity": "sha512-dY1QsA20of9wWEto8yhN7JQjpfjySmgeIMsvnQ9aBAv1wEJJCe04B0ekdgq7Bduyx9yWXdoC5CngGy81swmp2w==", + "dev": true, + "requires": { + "promise-map-series": "^0.2.1", + "quick-temp": "^0.1.3", + "rimraf": "^2.3.4", + "symlink-or-copy": "^1.0.1" + } + }, + "walk-sync": { + "version": "0.2.7", + "resolved": "http://registry.npmjs.org/walk-sync/-/walk-sync-0.2.7.tgz", + "integrity": "sha512-OH8GdRMowEFr0XSHQeX5fGweO6zSVHo7bG/0yJQx6LAj9Oukz0C8heI3/FYectT66gY0IPGe89kOvU410/UNpg==", + "dev": true, + "requires": { + "ensure-posix-path": "^1.0.0", + "matcher-collection": "^1.0.0" + } + } + } + }, + "broccoli-merge-trees": { + "version": "1.2.4", + "resolved": "http://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-1.2.4.tgz", + "integrity": "sha512-RXJAleytlED0dxXGEo2EXwrg5cCesY8LQzzGRogwGQmluoz+ijzxajpyWAW6wu/AyuQZj1vgnIqnld8jvuuXtQ==", + "dev": true, + "requires": { + "broccoli-plugin": "^1.3.0", + "can-symlink": "^1.0.0", + "fast-ordered-set": "^1.0.2", + "fs-tree-diff": "^0.5.4", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0" + } + }, + "broccoli-null": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/broccoli-null/-/broccoli-null-1.0.1.tgz", + "integrity": "sha512-TGXIFzFAHtpGrnxrEu7LCQXb4pmjWNeBXwFvydIDlwiguR3Deq7Cq0LwdstVP72A/bcgX6bS0APaAOxwjkVgHw==", + "dev": true, + "requires": { + "broccoli-plugin": "^1.3.1" + } + }, + "broccoli-persistent-filter": { + "version": "1.4.6", + "resolved": "http://registry.npmjs.org/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.6.tgz", + "integrity": "sha512-0RejLwoC95kv4kta8KAa+FmECJCK78Qgm8SRDEK7YyU0N9Cx6KpY3UCDy9WELl3mCXLN8TokNxc7/hp3lL4lfw==", + "dev": true, + "requires": { + "async-disk-cache": "^1.2.1", + "async-promise-queue": "^1.0.3", + "broccoli-plugin": "^1.0.0", + "fs-tree-diff": "^0.5.2", + "hash-for-dep": "^1.0.2", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "mkdirp": "^0.5.1", + "promise-map-series": "^0.2.1", + "rimraf": "^2.6.1", + "rsvp": "^3.0.18", + "symlink-or-copy": "^1.0.1", + "walk-sync": "^0.3.1" + } + }, + "broccoli-plugin": { + "version": "1.3.1", + "resolved": "http://registry.npmjs.org/broccoli-plugin/-/broccoli-plugin-1.3.1.tgz", + "integrity": "sha512-DW8XASZkmorp+q7J4EeDEZz+LoyKLAd2XZULXyD9l4m9/hAKV3vjHmB1kiUshcWAYMgTP1m2i4NnqCE/23h6AQ==", + "dev": true, + "requires": { + "promise-map-series": "^0.2.1", + "quick-temp": "^0.1.3", + "rimraf": "^2.3.4", + "symlink-or-copy": "^1.1.8" + } + }, + "broccoli-sane-watcher": { + "version": "1.1.5", + "resolved": "http://registry.npmjs.org/broccoli-sane-watcher/-/broccoli-sane-watcher-1.1.5.tgz", + "integrity": "sha512-9udAYby/avSVwi7pNSU9LbFIzHixJgYhDItfNGlNLoHsJ1evqIH5UBavz0BoM5rr9itZ6QF2/a1pDvC7On7tCw==", + "dev": true, + "requires": { + "broccoli-slow-trees": "^1.1.0", + "debug": "^2.1.0", + "rsvp": "^3.0.18", + "sane": "^1.1.1" + } + }, + "broccoli-slow-trees": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/broccoli-slow-trees/-/broccoli-slow-trees-1.1.0.tgz", + "integrity": "sha512-WjDAcPk88BZVlGFRGW9mt1hR/t1efSUuZN/uNDR7xK8PXmvj2u8xOlHXsci86DMKCod3oQevBdqEhJGEMu9/AA==", + "dev": true + }, + "broccoli-source": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/broccoli-source/-/broccoli-source-1.1.0.tgz", + "integrity": "sha512-ahvqmwF6Yvh6l+sTJJdey4o4ynwSH8swSSBSGmUXGSPPCqBWvquWB/4rWN65ZArKilBFq/29O0yQnZNIf//sTg==", + "dev": true + }, + "broccoli-sourcemap-concat": { + "version": "2.0.2", + "resolved": "http://registry.npmjs.org/broccoli-sourcemap-concat/-/broccoli-sourcemap-concat-2.0.2.tgz", + "integrity": "sha512-TIU4VEpwVg8Ihddb84fW6MiS84YjKVAxmSi7TK0nRQ0YzX5vZCz4LomP5LxetCGhFBKRZ9DY/Sf9Z4kDJ2R6AQ==", + "dev": true, + "requires": { + "broccoli-caching-writer": "^2.0.0", + "broccoli-kitchen-sink-helpers": "^0.2.5", + "fast-sourcemap-concat": " ^0.2.4", + "lodash-node": "^2.4.1", + "lodash.uniq": "^3.2.2", + "minimatch": "^2.0.10", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "broccoli-caching-writer": { + "version": "2.3.1", + "resolved": "http://registry.npmjs.org/broccoli-caching-writer/-/broccoli-caching-writer-2.3.1.tgz", + "integrity": "sha512-lfoDx98VaU8tG4mUXCxKdKyw2Lr+iSIGUjCgV83KC2zRC07SzYTGuSsMqpXFiOQlOGuoJxG3NRoyniBa1BWOqA==", + "dev": true, + "requires": { + "broccoli-kitchen-sink-helpers": "^0.2.5", + "broccoli-plugin": "1.1.0", + "debug": "^2.1.1", + "rimraf": "^2.2.8", + "rsvp": "^3.0.17", + "walk-sync": "^0.2.5" + } + }, + "broccoli-kitchen-sink-helpers": { + "version": "0.2.9", + "resolved": "http://registry.npmjs.org/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz", + "integrity": "sha512-C+oEqivDofZv/h80rgN4WJkbZkbfwkrIeu8vFn4bb4m4jPd3ICNNplhkXGl3ps439pzc2yjZ1qIwz0yy8uHcQg==", + "dev": true, + "requires": { + "glob": "^5.0.10", + "mkdirp": "^0.5.1" + } + }, + "broccoli-plugin": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/broccoli-plugin/-/broccoli-plugin-1.1.0.tgz", + "integrity": "sha512-dY1QsA20of9wWEto8yhN7JQjpfjySmgeIMsvnQ9aBAv1wEJJCe04B0ekdgq7Bduyx9yWXdoC5CngGy81swmp2w==", + "dev": true, + "requires": { + "promise-map-series": "^0.2.1", + "quick-temp": "^0.1.3", + "rimraf": "^2.3.4", + "symlink-or-copy": "^1.0.1" + } + }, + "minimatch": { + "version": "2.0.10", + "resolved": "http://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha512-jQo6o1qSVLEWaw3l+bwYA2X0uLuK2KjNh2wjgO7Q/9UJnXr1Q3yQKR8BI0/Bt/rPg75e6SMW4hW/6cBHVTZUjA==", + "dev": true, + "requires": { + "brace-expansion": "^1.0.0" + } + }, + "walk-sync": { + "version": "0.2.7", + "resolved": "http://registry.npmjs.org/walk-sync/-/walk-sync-0.2.7.tgz", + "integrity": "sha512-OH8GdRMowEFr0XSHQeX5fGweO6zSVHo7bG/0yJQx6LAj9Oukz0C8heI3/FYectT66gY0IPGe89kOvU410/UNpg==", + "dev": true, + "requires": { + "ensure-posix-path": "^1.0.0", + "matcher-collection": "^1.0.0" + } + } + } + }, + "broccoli-sri-hash": { + "version": "1.2.2", + "resolved": "http://registry.npmjs.org/broccoli-sri-hash/-/broccoli-sri-hash-1.2.2.tgz", + "integrity": "sha512-H3rNqB0x/AsG/QB4hs4P4COrIRNHP4M1BUQABBH38DbjBLwhubCLLLRc7eT5SXJVYUS+v6bGX7oIEsSBYF0pww==", + "dev": true, + "requires": { + "broccoli-caching-writer": "^2.2.0", + "mkdirp": "^0.5.1", + "rsvp": "^3.1.0", + "sri-toolbox": "^0.2.0", + "symlink-or-copy": "^1.0.1" + }, + "dependencies": { + "broccoli-caching-writer": { + "version": "2.3.1", + "resolved": "http://registry.npmjs.org/broccoli-caching-writer/-/broccoli-caching-writer-2.3.1.tgz", + "integrity": "sha512-lfoDx98VaU8tG4mUXCxKdKyw2Lr+iSIGUjCgV83KC2zRC07SzYTGuSsMqpXFiOQlOGuoJxG3NRoyniBa1BWOqA==", + "dev": true, + "requires": { + "broccoli-kitchen-sink-helpers": "^0.2.5", + "broccoli-plugin": "1.1.0", + "debug": "^2.1.1", + "rimraf": "^2.2.8", + "rsvp": "^3.0.17", + "walk-sync": "^0.2.5" + } + }, + "broccoli-kitchen-sink-helpers": { + "version": "0.2.9", + "resolved": "http://registry.npmjs.org/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz", + "integrity": "sha512-C+oEqivDofZv/h80rgN4WJkbZkbfwkrIeu8vFn4bb4m4jPd3ICNNplhkXGl3ps439pzc2yjZ1qIwz0yy8uHcQg==", + "dev": true, + "requires": { + "glob": "^5.0.10", + "mkdirp": "^0.5.1" + } + }, + "broccoli-plugin": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/broccoli-plugin/-/broccoli-plugin-1.1.0.tgz", + "integrity": "sha512-dY1QsA20of9wWEto8yhN7JQjpfjySmgeIMsvnQ9aBAv1wEJJCe04B0ekdgq7Bduyx9yWXdoC5CngGy81swmp2w==", + "dev": true, + "requires": { + "promise-map-series": "^0.2.1", + "quick-temp": "^0.1.3", + "rimraf": "^2.3.4", + "symlink-or-copy": "^1.0.1" + } + }, + "walk-sync": { + "version": "0.2.7", + "resolved": "http://registry.npmjs.org/walk-sync/-/walk-sync-0.2.7.tgz", + "integrity": "sha512-OH8GdRMowEFr0XSHQeX5fGweO6zSVHo7bG/0yJQx6LAj9Oukz0C8heI3/FYectT66gY0IPGe89kOvU410/UNpg==", + "dev": true, + "requires": { + "ensure-posix-path": "^1.0.0", + "matcher-collection": "^1.0.0" + } + } + } + }, + "broccoli-stew": { + "version": "1.6.0", + "resolved": "http://registry.npmjs.org/broccoli-stew/-/broccoli-stew-1.6.0.tgz", + "integrity": "sha512-sUwCJNnYH4Na690By5xcEMAZqKgquUQnMAEuIiL3Z2k63mSw9Xg+7Ew4wCrFrMmXMcLpWjZDOm6Yqnq268N+ZQ==", + "dev": true, + "requires": { + "broccoli-debug": "^0.6.1", + "broccoli-funnel": "^2.0.0", + "broccoli-merge-trees": "^2.0.0", + "broccoli-persistent-filter": "^1.1.6", + "broccoli-plugin": "^1.3.0", + "chalk": "^2.4.1", + "debug": "^3.1.0", + "ensure-posix-path": "^1.0.1", + "fs-extra": "^5.0.0", + "minimatch": "^3.0.4", + "resolve": "^1.8.1", + "rsvp": "^4.8.3", + "symlink-or-copy": "^1.2.0", + "walk-sync": "^0.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "http://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "broccoli-funnel": { + "version": "2.0.2", + "resolved": "http://registry.npmjs.org/broccoli-funnel/-/broccoli-funnel-2.0.2.tgz", + "integrity": "sha512-/vDTqtv7ipjEZQOVqO4vGDVAOZyuYzQ/EgGoyewfOgh1M7IQAToBKZI0oAQPgMBeFPPlIbfMuAngk+ohPBuaHQ==", + "dev": true, + "requires": { + "array-equal": "^1.0.0", + "blank-object": "^1.0.1", + "broccoli-plugin": "^1.3.0", + "debug": "^2.2.0", + "fast-ordered-set": "^1.0.0", + "fs-tree-diff": "^0.5.3", + "heimdalljs": "^0.2.0", + "minimatch": "^3.0.0", + "mkdirp": "^0.5.0", + "path-posix": "^1.0.0", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0", + "walk-sync": "^0.3.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "broccoli-merge-trees": { + "version": "2.0.1", + "resolved": "http://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-2.0.1.tgz", + "integrity": "sha512-WjaexJ+I8BxP5V5RNn6um/qDRSmKoiBC/QkRi79FT9ClHfldxRyCDs9mcV7mmoaPlsshmmPaUz5jdtcKA6DClQ==", + "dev": true, + "requires": { + "broccoli-plugin": "^1.3.0", + "merge-trees": "^1.0.1" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "http://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "http://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "fs-extra": { + "version": "5.0.0", + "resolved": "http://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "http://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "broccoli-uglify-sourcemap": { + "version": "1.5.2", + "resolved": "http://registry.npmjs.org/broccoli-uglify-sourcemap/-/broccoli-uglify-sourcemap-1.5.2.tgz", + "integrity": "sha512-LO01NPTTwWoFBRrPCwJv0dXp/xeFLhsFhHoUgr8ETa9ZwE2q0be5/lLJae/M2nCMhwyFiBpiDhB9NG1zbMoYSA==", + "dev": true, + "requires": { + "broccoli-plugin": "^1.2.1", + "debug": "^2.2.0", + "lodash.merge": "^4.5.1", + "matcher-collection": "^1.0.0", + "mkdirp": "^0.5.0", + "source-map-url": "^0.3.0", + "symlink-or-copy": "^1.0.1", + "uglify-js": "^2.7.0", + "walk-sync": "^0.1.3" + }, + "dependencies": { + "lodash.merge": { + "version": "4.6.2", + "resolved": "http://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "walk-sync": { + "version": "0.1.3", + "resolved": "http://registry.npmjs.org/walk-sync/-/walk-sync-0.1.3.tgz", + "integrity": "sha512-TxkEYAjyjVCrye/AjyV7NOb/Ww3jnf/MXQJxFanxJb6KhHGKja1S2H8sVEe/zKFJCIYegtZbFMrPm0XxU8CBmQ==", + "dev": true + } + } + }, + "broccoli-viz": { + "version": "2.0.1", + "resolved": "http://registry.npmjs.org/broccoli-viz/-/broccoli-viz-2.0.1.tgz", + "integrity": "sha512-VIKxQZHDU4JEyWf/yb3gzNgUFH3HserEt44haB5Kq7pEpcyG7sS57vHE+X5N7W1Q5VCQjFaX13LxTHnFDQxYvA==", + "dev": true + }, + "broccoli-writer": { + "version": "0.1.1", + "resolved": "http://registry.npmjs.org/broccoli-writer/-/broccoli-writer-0.1.1.tgz", + "integrity": "sha512-nUA3VGTMdNnjIlPZUD2bvesusjWV+hmZsF6Lg8Fmoh2sf3KA6ZPa1eViNi9d9T4pYl3CWq/UHwWyaFPfJ/GQSg==", + "dev": true, + "requires": { + "quick-temp": "^0.1.0", + "rsvp": "^3.0.6" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "http://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer": { + "version": "6.0.3", + "resolved": "http://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "bytes": { + "version": "3.0.0", + "resolved": "http://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true + }, + "call-bind": { + "version": "1.0.5", + "resolved": "http://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, + "requires": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "http://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", + "dev": true + }, + "can-symlink": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/can-symlink/-/can-symlink-1.0.0.tgz", + "integrity": "sha512-RbsNrFyhwkx+6psk/0fK/Q9orOUr9VMxohGd8vTa4djf4TGLfblBgUfqZChrZuW0Q+mz2eBPFLusw9Jfukzmhg==", + "dev": true, + "requires": { + "tmp": "0.0.28" + }, + "dependencies": { + "tmp": { + "version": "0.0.28", + "resolved": "http://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz", + "integrity": "sha512-c2mmfiBmND6SOVxzogm1oda0OJ1HZVIk/5n26N59dDTh80MUeavpiCls4PGAdkX1PFkKokLpcf7prSjCeXLsJg==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + } + } + }, + "caniuse-lite": { + "version": "1.0.30001571", + "resolved": "http://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001571.tgz", + "integrity": "sha512-tYq/6MoXhdezDLFZuCO/TKboTzuQ/xR5cFdgXPfDtM7/kchBO3b4VWghE/OAi/DV7tTdhmLjZiZBZi1fA/GheQ==", + "dev": true + }, + "cardinal": { + "version": "0.5.0", + "resolved": "http://registry.npmjs.org/cardinal/-/cardinal-0.5.0.tgz", + "integrity": "sha512-HRGILv/FykuNVO7xCTiXMEPJxA7jMyHwEgljgcAZ3xkLSEhLvStqcTy6xamC1NH4Ja8hlc9VHlXKoSuFbI+7lA==", + "dev": true, + "requires": { + "ansicolors": "~0.2.1", + "redeyed": "~0.5.0" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "http://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true, + "optional": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "http://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", + "dev": true, + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.0.tgz", + "integrity": "sha512-pn7bzDYUIrL0KRp/KK5B+sej6uYtzQ5hYOdLU+L3MVWHCgoYi4aUYdh2/R2rsdURIoOK/ptZi5FDtLdjvKYQ7g==", + "dev": true, + "requires": { + "ansi-styles": "^2.1.0", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "charm": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/charm/-/charm-1.0.2.tgz", + "integrity": "sha512-wqW3VdPnlSWT4eRiYX+hcs+C6ViBPUWk1qTCd+37qw9kEm/a5n2qcyQDMBWvSYKN/ctqZzeXNQaeBjOetJJUkw==", + "dev": true, + "requires": { + "inherits": "^2.0.1" + } + }, + "clean-base-url": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/clean-base-url/-/clean-base-url-1.0.0.tgz", + "integrity": "sha512-9q6ZvUAhbKOSRFY7A/irCQ/rF0KIpa3uXpx6izm8+fp7b2H4hLeUJ+F1YYk9+gDQ/X8Q0MEyYs+tG3cht//HTg==", + "dev": true + }, + "clean-css": { + "version": "2.2.23", + "resolved": "http://registry.npmjs.org/clean-css/-/clean-css-2.2.23.tgz", + "integrity": "sha512-4Ft5U6dNFqr++uztZJzaGXLTTI1aGYgOVAvGAwjp1eOPd4jT6HKjYE2CJ6qnAWZ3/H/U77iFeCZyhhBmOUaU1w==", + "dev": true, + "requires": { + "commander": "2.2.x" + }, + "dependencies": { + "commander": { + "version": "2.2.0", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.2.0.tgz", + "integrity": "sha512-U6hBkeIsoeE81B+yas9uVF4YYVcVoBCwb1e314VPyvVQubFwvnTAuc1oUQ6VuMPYUS4Rf1gzr0wTVLvs4sb5Pw==", + "dev": true + } + } + }, + "cli": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha512-41U72MB56TfUMGndAKK8vJ78eooOD4Z5NOL4xEfjc0c23s+6EYKXlXsmACBVclLP1yOfWCgEganVzddVrSNoTg==", + "dev": true, + "requires": { + "exit": "0.1.2", + "glob": "^7.1.1" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "http://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "cli-color": { + "version": "0.3.3", + "resolved": "http://registry.npmjs.org/cli-color/-/cli-color-0.3.3.tgz", + "integrity": "sha512-e8BuO18ajBxfbL2eJldk8VgYDjshE8hV1ECafR0pl5EzgbyK9YnmGWLHylXVrQgaK4J1SJJzWDjIncfVuJvtpg==", + "dev": true, + "requires": { + "d": "~0.1.1", + "es5-ext": "~0.10.6", + "memoizee": "~0.3.8", + "timers-ext": "0.1" + } + }, + "cli-table": { + "version": "0.3.11", + "resolved": "http://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", + "integrity": "sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==", + "dev": true, + "requires": { + "colors": "1.0.3" + }, + "dependencies": { + "colors": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", + "dev": true + } + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", + "dev": true, + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "http://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", + "dev": true + } + } + }, + "clone": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha512-g62n3Kb9cszeZvmvBUqP/dsEJD/+80pDA8u8KqHnAPrVnQ2Je9rVV6opxkhuWCd1kCn2gOibzDKxCtBvD3q5kA==", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "http://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "dev": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "http://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "colors": { + "version": "0.6.2", + "resolved": "http://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha512-OsSVtHK8Ir8r3+Fxw/b4jS1ZLPXkV6ZxDRJQzeD7qo0SqMXWrHDM71DgYzPMHY8SFJ0Ao+nNU2p1MmwdzKqPrw==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "optional": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "commoner": { + "version": "0.10.8", + "resolved": "http://registry.npmjs.org/commoner/-/commoner-0.10.8.tgz", + "integrity": "sha512-3/qHkNMM6o/KGXHITA14y78PcfmXh4+AOCJpSoF73h4VY1JpdGv3CHMS5+JW6SwLhfJt4RhNmLAa7+RRX/62EQ==", + "dev": true, + "requires": { + "commander": "^2.5.0", + "detective": "^4.3.1", + "glob": "^5.0.15", + "graceful-fs": "^4.1.2", + "iconv-lite": "^0.4.5", + "mkdirp": "^0.5.0", + "private": "^0.1.6", + "q": "^1.1.2", + "recast": "^0.11.17" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "http://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "recast": { + "version": "0.11.23", + "resolved": "http://registry.npmjs.org/recast/-/recast-0.11.23.tgz", + "integrity": "sha512-+nixG+3NugceyR8O1bLU45qs84JgI3+8EauyRZafLgC9XbdAOIVgwV1Pe2da0YzGo62KzWoZwUpVEQf6qNAXWA==", + "dev": true, + "requires": { + "ast-types": "0.9.6", + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + } + } + }, + "component-bind": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==", + "dev": true + }, + "component-emitter": { + "version": "1.1.2", + "resolved": "http://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha512-YhIbp3PJiznERfjlIkK0ue4obZxt2S60+0W8z24ZymOHT8sHloOqWOqZRU2eN5OlY8U08VFsP02letcu26FilA==", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "http://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "http://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "http://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "configstore": { + "version": "1.2.1", + "resolved": "http://registry.npmjs.org/configstore/-/configstore-1.2.1.tgz", + "integrity": "sha512-ymX+3jSUyNVP4dSLkaeGgL0+HK8/9GWnUIaWO0YPvm2mCqNih8jDqs3vWCx79RomV0IKCDM3boHGJg8vRhbDoQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "object-assign": "^3.0.0", + "os-tmpdir": "^1.0.0", + "osenv": "^0.1.0", + "uuid": "^2.0.1", + "write-file-atomic": "^1.1.2", + "xdg-basedir": "^2.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.11", + "resolved": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "object-assign": { + "version": "3.0.0", + "resolved": "http://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "http://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + } + } + }, + "connect": { + "version": "3.7.0", + "resolved": "http://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha512-duS7VP5pvfsNLDvL1O4VOEbw37AI3A4ZUQYemvDlnpGrNu9tprR7BYWpDYwC0Xia0Zxz5ZupdiIrUp0GH1aXfg==", + "dev": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "consolidate": { + "version": "0.14.5", + "resolved": "http://registry.npmjs.org/consolidate/-/consolidate-0.14.5.tgz", + "integrity": "sha512-PZFskfj64QnpKVK9cPdY36pyWEhZNM+srRVqtwMiVTlnViSoZcvX35PpBhhUcyLTHXYvz7pZRmxvsqwzJqg9kA==", + "dev": true, + "requires": { + "bluebird": "^3.1.1" + }, + "dependencies": { + "bluebird": { + "version": "3.7.2", + "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + } + } + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "http://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "http://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "http://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "cookie": { + "version": "0.5.0", + "resolved": "http://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "http://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "copy-dereference": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/copy-dereference/-/copy-dereference-1.0.0.tgz", + "integrity": "sha512-40TSLuhhbiKeszZhK9LfNdazC67Ue4kq/gGwN5sdxEUWPXTIMmKmGmgD9mPfNKVAeecEW+NfEIpBaZoACCQLLw==", + "dev": true + }, + "core-js": { + "version": "2.6.12", + "resolved": "http://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "dev": true + }, + "core-object": { + "version": "0.0.2", + "resolved": "http://registry.npmjs.org/core-object/-/core-object-0.0.2.tgz", + "integrity": "sha512-fcNdzhrynk5aUPMtMwWe9cdIGol4dF17rD1IHk3Z8A/pt9P4fJQwfs6yEUzHaOtw/lCKh8St6/KvQNchOKrjvw==", + "dev": true, + "requires": { + "lodash-node": "^2.4.1" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "cpr": { + "version": "0.4.2", + "resolved": "http://registry.npmjs.org/cpr/-/cpr-0.4.2.tgz", + "integrity": "sha512-OBWxXDXdkEEqZtgLJx9P5iHZU5VWI5DhFI+rYg1154GzzZZRXjGr+39P00dzbGxtNowTTP4oPdfrtBfmNSREEA==", + "dev": true, + "requires": { + "graceful-fs": "~4.1.2", + "mkdirp": "~0.5.0", + "rimraf": "~2.4.3" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "http://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "rimraf": { + "version": "2.4.5", + "resolved": "http://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==", + "dev": true, + "requires": { + "glob": "^6.0.1" + } + } + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "http://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "http://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha512-FFN5KwpvvQTTS5hWPxrU8/QE4kQUc6uwZcrnlMBN82t1MgAtq8mnoDwINBly9Tdr02seeIIhtdF+UH1feBYGog==", + "dev": true, + "optional": true, + "requires": { + "boom": "2.x.x" + } + }, + "d": { + "version": "0.1.1", + "resolved": "http://registry.npmjs.org/d/-/d-0.1.1.tgz", + "integrity": "sha512-0SdM9V9pd/OXJHoWmTfNPTAeD+lw6ZqHg+isPyBFuJsZLSE0Ygg1cYZ/0l6DrKQXMOqGOu1oWupMoOfoRfMZrQ==", + "dev": true, + "requires": { + "es5-ext": "~0.10.2" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "http://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "optional": true + } + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "http://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha512-AsElvov3LoNB7tf5k37H2jYSB+ZZPMT5sG2QjJCcdlV5chIv6htBUBUui2IKRjgtKAKtCBN7Zbwa+MtwLjSeNw==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, + "define-data-property": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, + "defined": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", + "dev": true + }, + "defs": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/defs/-/defs-1.1.1.tgz", + "integrity": "sha512-KgGV1vmSa2UPKeDXaWE5FiXjix8BOtYMgiPGpYhd/42wxiC6YGwtscj/zU9gD5/xk4K2iLDpyGhGA5puZxaeMg==", + "dev": true, + "requires": { + "alter": "~0.2.0", + "ast-traverse": "~0.1.1", + "breakable": "~1.0.0", + "esprima-fb": "~15001.1001.0-dev-harmony-fb", + "simple-fmt": "~0.1.0", + "simple-is": "~0.2.0", + "stringmap": "~0.2.2", + "stringset": "~0.2.1", + "tryor": "~0.1.2", + "yargs": "~3.27.0" + }, + "dependencies": { + "window-size": { + "version": "0.1.4", + "resolved": "http://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw==", + "dev": true + }, + "yargs": { + "version": "3.27.0", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.27.0.tgz", + "integrity": "sha512-6atYjGACjX/OYWico7LwdBx9eiGlkMnIw6OwqfBb+uJQpaT82tQ7oI+BI6Dvq62qZvSbzGzQCVLQdMd59tR2eA==", + "dev": true, + "requires": { + "camelcase": "^1.2.1", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "os-locale": "^1.4.0", + "window-size": "^0.1.2", + "y18n": "^3.2.0" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "depd": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "destroy": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true + }, + "detect-indent": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/detect-indent/-/detect-indent-3.0.1.tgz", + "integrity": "sha512-xo3WP66SNbr1Eim85s/qyH0ZL8PQUwp86HWm0S1l8WnJ/zjT6T3w1nwNA0yOZeuvOemupEYvpvF6BIdYRuERJQ==", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "minimist": "^1.1.0", + "repeating": "^1.1.0" + } + }, + "detective": { + "version": "4.7.1", + "resolved": "http://registry.npmjs.org/detective/-/detective-4.7.1.tgz", + "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", + "dev": true, + "requires": { + "acorn": "^5.2.1", + "defined": "^1.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.4", + "resolved": "http://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "dev": true + } + } + }, + "diff": { + "version": "1.4.0", + "resolved": "http://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha512-VzVc42hMZbYU9Sx/ltb7KYuQ6pqAw+cbFWVy4XKdkuEL2CFaRLGEnISPs7YdzaUGpi+CpIqvRmu7hPQ4T7EQ5w==", + "dev": true + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "http://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "http://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "http://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.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "http://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "http://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "editions": { + "version": "1.3.4", + "resolved": "http://registry.npmjs.org/editions/-/editions-1.3.4.tgz", + "integrity": "sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.609", + "resolved": "http://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.609.tgz", + "integrity": "sha512-ihiCP7PJmjoGNuLpl7TjNA8pCQWu09vGyjlPYw1Rqww4gvNuCcmvl+44G+2QyJ6S2K4o+wbTS++Xz0YN8Q9ERw==", + "dev": true + }, + "ember-cli": { + "version": "1.13.15", + "resolved": "http://registry.npmjs.org/ember-cli/-/ember-cli-1.13.15.tgz", + "integrity": "sha512-hQ+AF8w+Igs9DqqOT4Z9GZsMZyx6ORPcLf4RpPYZlMLmo5TaLOq8T4rqSFOa1NRPIo7PmBjxCoMaTlDJsahrKw==", + "dev": true, + "requires": { + "amd-name-resolver": "0.0.2", + "bower": "^1.3.12", + "bower-config": "0.6.1", + "bower-endpoint-parser": "0.2.2", + "broccoli": "0.16.8", + "broccoli-babel-transpiler": "^5.4.5", + "broccoli-config-loader": "^1.0.0", + "broccoli-config-replace": "^1.1.0", + "broccoli-funnel": "^1.0.0", + "broccoli-kitchen-sink-helpers": "^0.2.7", + "broccoli-merge-trees": "^1.0.0", + "broccoli-plugin": "^1.2.0", + "broccoli-sane-watcher": "^1.1.1", + "broccoli-source": "^1.1.0", + "broccoli-sourcemap-concat": "^2.0.2", + "broccoli-viz": "^2.0.1", + "chalk": "1.1.0", + "clean-base-url": "^1.0.0", + "compression": "^1.4.4", + "configstore": "1.2.1", + "core-object": "0.0.2", + "cpr": "0.4.2", + "debug": "^2.1.3", + "diff": "^1.3.1", + "ember-cli-copy-dereference": "^1.0.0", + "ember-cli-get-dependency-depth": "^1.0.0", + "ember-cli-is-package-missing": "^1.0.0", + "ember-cli-normalize-entity-name": "^1.0.0", + "ember-cli-path-utils": "^1.0.0", + "ember-cli-preprocess-registry": "^1.0.3", + "ember-cli-string-utils": "^1.0.0", + "ember-cli-test-info": "^1.0.0", + "ember-router-generator": "^1.0.0", + "escape-string-regexp": "^1.0.3", + "exists-sync": "0.0.3", + "exit": "^0.1.2", + "express": "^4.12.3", + "findup": "0.1.5", + "findup-sync": "^0.2.1", + "fs-extra": "0.22.1", + "fs-monitor-stack": "^1.0.2", + "git-repo-info": "^1.0.4", + "glob": "5.0.13", + "http-proxy": "^1.9.0", + "inflection": "^1.7.0", + "inquirer": "0.5.1", + "is-git-url": "^0.2.0", + "isbinaryfile": "^2.0.3", + "leek": "0.0.18", + "lodash": "^3.6.0", + "markdown-it": "4.3.0", + "markdown-it-terminal": "0.0.2", + "merge-defaults": "^0.2.1", + "minimatch": "^2.0.4", + "morgan": "^1.5.2", + "node-modules-path": "^1.0.0", + "node-uuid": "^1.4.3", + "nopt": "^3.0.1", + "npm": "2.14.10", + "pleasant-progress": "^1.0.2", + "portfinder": "^0.4.0", + "promise-map-series": "^0.2.1", + "quick-temp": "0.1.3", + "readline2": "0.1.1", + "resolve": "^1.1.6", + "rsvp": "^3.0.17", + "sane": "^1.1.1", + "semver": "^4.3.3", + "silent-error": "^1.0.0", + "symlink-or-copy": "^1.0.1", + "temp": "0.8.3", + "testem": "^1.0.0", + "through": "^2.3.6", + "tiny-lr": "0.2.0", + "walk-sync": "0.1.3", + "yam": "0.0.18" + }, + "dependencies": { + "broccoli-kitchen-sink-helpers": { + "version": "0.2.9", + "resolved": "http://registry.npmjs.org/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz", + "integrity": "sha512-C+oEqivDofZv/h80rgN4WJkbZkbfwkrIeu8vFn4bb4m4jPd3ICNNplhkXGl3ps439pzc2yjZ1qIwz0yy8uHcQg==", + "dev": true, + "requires": { + "glob": "^5.0.10", + "mkdirp": "^0.5.1" + } + }, + "ember-router-generator": { + "version": "1.2.3", + "resolved": "http://registry.npmjs.org/ember-router-generator/-/ember-router-generator-1.2.3.tgz", + "integrity": "sha512-WtkmDTspiMrDESNHoe0hFOmo1Kop57JoZzls0r3O5ab+hUjBALZy96U2mreHY5O31/Pohce0UqW5dGpBPy4eiQ==", + "dev": true, + "requires": { + "recast": "^0.11.3" + } + }, + "esprima": { + "version": "3.1.3", + "resolved": "http://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==", + "dev": true + }, + "fs-extra": { + "version": "0.22.1", + "resolved": "http://registry.npmjs.org/fs-extra/-/fs-extra-0.22.1.tgz", + "integrity": "sha512-M7CuxS2f9k/5il8ufmLiCtT7B2O2JLoTZi83ZtyEJMG67cTn87fNULYWtno5Vm31TxmSRE0nkA9GxaRR+y3XTA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "rimraf": "^2.2.8" + } + }, + "glob": { + "version": "5.0.13", + "resolved": "http://registry.npmjs.org/glob/-/glob-5.0.13.tgz", + "integrity": "sha512-UUX7KcKGxsailKUG+md76uvcasQ+pwcb5X6o97LcqGobNvcBvXvWPvhAF+FndmzEXBFB9xdT2ME5DkzS8F5zIg==", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^2.0.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "lodash": { + "version": "3.10.1", + "resolved": "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==", + "dev": true + }, + "minimatch": { + "version": "2.0.10", + "resolved": "http://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha512-jQo6o1qSVLEWaw3l+bwYA2X0uLuK2KjNh2wjgO7Q/9UJnXr1Q3yQKR8BI0/Bt/rPg75e6SMW4hW/6cBHVTZUjA==", + "dev": true, + "requires": { + "brace-expansion": "^1.0.0" + } + }, + "mktemp": { + "version": "0.3.5", + "resolved": "http://registry.npmjs.org/mktemp/-/mktemp-0.3.5.tgz", + "integrity": "sha512-hFyxoCMAjgU76O22rG4zxjmBqRaOCe9GL9PSTaG+GIX5t7d6kuB/49CkjM2R1u+4XJIZsdaFrnRkOxpmr4aG4w==", + "dev": true + }, + "quick-temp": { + "version": "0.1.3", + "resolved": "http://registry.npmjs.org/quick-temp/-/quick-temp-0.1.3.tgz", + "integrity": "sha512-utnjEbDTxoyrLMibLScZkULvfd8oib1Qeddx1BqkbixrbJoa3CycyrelsNFjw3lV73s/KW2GqSH1D9F0jkJ2sw==", + "dev": true, + "requires": { + "mktemp": "~0.3.4", + "rimraf": "~2.2.6", + "underscore.string": "~2.3.3" + }, + "dependencies": { + "rimraf": { + "version": "2.2.8", + "resolved": "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg==", + "dev": true + } + } + }, + "recast": { + "version": "0.11.23", + "resolved": "http://registry.npmjs.org/recast/-/recast-0.11.23.tgz", + "integrity": "sha512-+nixG+3NugceyR8O1bLU45qs84JgI3+8EauyRZafLgC9XbdAOIVgwV1Pe2da0YzGo62KzWoZwUpVEQf6qNAXWA==", + "dev": true, + "requires": { + "ast-types": "0.9.6", + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + }, + "underscore.string": { + "version": "2.3.3", + "resolved": "http://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "integrity": "sha512-hbD5MibthuDAu4yA5wxes5bzFgqd3PpBJuClbRxaNddxfdsz+qf+1kHwrGQFrmchmDHb9iNU+6EHDn8uj0xDJg==", + "dev": true + }, + "walk-sync": { + "version": "0.1.3", + "resolved": "http://registry.npmjs.org/walk-sync/-/walk-sync-0.1.3.tgz", + "integrity": "sha512-TxkEYAjyjVCrye/AjyV7NOb/Ww3jnf/MXQJxFanxJb6KhHGKja1S2H8sVEe/zKFJCIYegtZbFMrPm0XxU8CBmQ==", + "dev": true + } + } + }, + "ember-cli-app-version": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/ember-cli-app-version/-/ember-cli-app-version-1.0.1.tgz", + "integrity": "sha512-EWNJBhVZtAFyP8Fj9zlXsB1QgbUF8gunAVIwY6X2CY5NHW7FbJse77QGM1Bcvs8UNd+Z1ErHq7py72IqfUlFTQ==", + "dev": true, + "requires": { + "ember-cli-babel": "^5.1.6", + "ember-cli-htmlbars": "^1.0.0", + "git-repo-version": "0.3.0" + } + }, + "ember-cli-babel": { + "version": "5.2.8", + "resolved": "http://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-5.2.8.tgz", + "integrity": "sha512-Mt9OOB5RaZwjde+LYef8EgwNVCAzsYDv4ktshblaXxr4m/Xm5/7/rxEu42RNrYkoy/qWpT9uhaD+JKK4riMf+w==", + "dev": true, + "requires": { + "broccoli-babel-transpiler": "^5.6.2", + "broccoli-funnel": "^1.0.0", + "clone": "^2.0.0", + "ember-cli-version-checker": "^1.0.2", + "resolve": "^1.1.2" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "http://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true + } + } + }, + "ember-cli-copy-dereference": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/ember-cli-copy-dereference/-/ember-cli-copy-dereference-1.0.0.tgz", + "integrity": "sha512-3Ul+NbIDlqJGJY65KeQ9ZsG8gXAUvV7GQx7PIZ+Hs+SPwnc3H0QrqW6czWp1mJuDjKdgvOoZD55Uy+DRNkkG0g==", + "dev": true + }, + "ember-cli-dependency-checker": { + "version": "1.4.0", + "resolved": "http://registry.npmjs.org/ember-cli-dependency-checker/-/ember-cli-dependency-checker-1.4.0.tgz", + "integrity": "sha512-yTalfITxZKkQrnopBh7pawez8Z6ZY2/5O2sv84SOvBDBNGNARYkeohpG8jAAKeQcvfU3hvbMoeclTRMr/N0Uyw==", + "dev": true, + "requires": { + "chalk": "^0.5.1", + "is-git-url": "^0.2.0", + "semver": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "0.2.1", + "resolved": "http://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==", + "dev": true + }, + "ansi-styles": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA==", + "dev": true + }, + "chalk": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha512-bIKA54hP8iZhyDT81TOsJiQvR1gW+ZYSXFaZUAvoD4wCHdbHY2actmpTE4x344ZlFqHbvoxKOaESULTZN2gstg==", + "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" + } + }, + "has-ansi": { + "version": "0.1.0", + "resolved": "http://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha512-1YsTg1fk2/6JToQhtZkArMkurq8UoWU1Qe0aR3VUHjgij4nOylSWLWAtBXoZ4/dXOmugfLGm1c+QhuD0JyedFA==", + "dev": true, + "requires": { + "ansi-regex": "^0.2.0" + } + }, + "is-git-url": { + "version": "0.2.3", + "resolved": "http://registry.npmjs.org/is-git-url/-/is-git-url-0.2.3.tgz", + "integrity": "sha512-UEWwpSpBBqQB6lYMJUHHCxJMPBKV8fxcmdbA5GNDq7SApnMyyRVNF9QeBtCs3+56elwkix5QEGsN9O669XnEYw==", + "dev": true + }, + "semver": { + "version": "4.3.6", + "resolved": "http://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha512-IrpJ+yoG4EOH8DFWuVg+8H1kW1Oaof0Wxe7cPcXW3x9BjkN/eVo54F15LyqemnDIUYskQWr9qvl/RihmSy6+xQ==", + "dev": true + }, + "strip-ansi": { + "version": "0.3.0", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha512-DerhZL7j6i6/nEnVG0qViKXI0OKouvvpsAiaj7c+LfqZZZxdwZtv8+UiA/w4VUJpT8UzX0pR1dcHOii1GbmruQ==", + "dev": true, + "requires": { + "ansi-regex": "^0.2.1" + } + }, + "supports-color": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha512-tdCZ28MnM7k7cJDJc7Eq80A9CsRFAAOZUy41npOZCs++qSjfIy7o5Rh46CBk+Dk5FbKJ33X3Tqg4YrV07N5RaA==", + "dev": true + } + } + }, + "ember-cli-get-dependency-depth": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/ember-cli-get-dependency-depth/-/ember-cli-get-dependency-depth-1.0.0.tgz", + "integrity": "sha512-qSDDLIVvMsSPFr0L3ldxyyrot65JQVo8hf27bYtA6tQsEUYvfgq3LqpFNztpUr9yfWTYomjAxkoI/Eguq7yonQ==", + "dev": true + }, + "ember-cli-htmlbars": { + "version": "1.3.5", + "resolved": "http://registry.npmjs.org/ember-cli-htmlbars/-/ember-cli-htmlbars-1.3.5.tgz", + "integrity": "sha512-Qur/anb0Vk57qmIhGLkSzl8X1QIMoae6pLa14MRQ8+YD2N5fNs3qdhEFf0SDBquPOH1QxQtraiNQvji47QBJyg==", + "dev": true, + "requires": { + "broccoli-persistent-filter": "^1.0.3", + "ember-cli-version-checker": "^1.0.2", + "hash-for-dep": "^1.0.2", + "json-stable-stringify": "^1.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "ember-cli-version-checker": { + "version": "1.3.1", + "resolved": "http://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz", + "integrity": "sha512-mu1Apdd19ZuDsy9WAHheFhltaJx+0ardFNM8Hb/AeRO9RokOK/bdUq/Jc1oeg0/Hl18tnxg8STG9TyJ6HgE3+g==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "semver": { + "version": "5.7.2", + "resolved": "http://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + } + } + }, + "ember-cli-htmlbars-inline-precompile": { + "version": "0.3.13", + "resolved": "http://registry.npmjs.org/ember-cli-htmlbars-inline-precompile/-/ember-cli-htmlbars-inline-precompile-0.3.13.tgz", + "integrity": "sha512-OfjM/0vX7C1FAZvyibkbh7oGHxDVRaLmEkIHcCLt4CLq/AbYptUYIL2dxFReFUfLDRxs92/+YP2tjP9jtkW40A==", + "dev": true, + "requires": { + "babel-plugin-htmlbars-inline-precompile": "^0.1.0", + "ember-cli-babel": "^5.1.3", + "ember-cli-htmlbars": "^1.0.0", + "hash-for-dep": "^1.0.2", + "heimdalljs-logger": "^0.1.7", + "resolve": "^1.3.3", + "semver": "^5.3.0", + "silent-error": "^1.1.0" + }, + "dependencies": { + "semver": { + "version": "5.7.2", + "resolved": "http://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + } + } + }, + "ember-cli-ic-ajax": { + "version": "0.2.4", + "resolved": "http://registry.npmjs.org/ember-cli-ic-ajax/-/ember-cli-ic-ajax-0.2.4.tgz", + "integrity": "sha512-SyZkUagzKuSKl+agjgwKGxvD8pfgU9d8+j6uNqmq8Edlmny4iBcwqAGEMVfs94kJaDcNtO6MS8T4fDvMYm3PvQ==", + "dev": true, + "requires": { + "ic-ajax": "~2.0.1" + }, + "dependencies": { + "ic-ajax": { + "version": "2.0.1", + "dev": true + } + } + }, + "ember-cli-idcos": { + "version": "1.0.17", + "resolved": "http://registry.npmjs.org/ember-cli-idcos/-/ember-cli-idcos-1.0.17.tgz", + "integrity": "sha512-a5Faf8SWNx6Td5f+mgMI9dN0uAeZwLsT8pwkq44XNXsWxRKBuxYwoLsDDWlDceK4Dhbv46//GbrrUvXzY4FGjg==", + "dev": true, + "requires": { + "ember-cli-babel": "^5.1.3" + } + }, + "ember-cli-inject-live-reload": { + "version": "1.10.2", + "resolved": "http://registry.npmjs.org/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-1.10.2.tgz", + "integrity": "sha512-yFvZE4WFyWjzMJ6MTYIyjCXpcJNFMTaZP61JXITMkXhSkhuDkzMD/XfwR5+fr004TYcwrbNWpg1oGX5DbOgcaQ==", + "dev": true, + "requires": { + "clean-base-url": "^1.0.0", + "ember-cli-version-checker": "^2.1.2" + }, + "dependencies": { + "ember-cli-version-checker": { + "version": "2.2.0", + "resolved": "http://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-2.2.0.tgz", + "integrity": "sha512-G+KtYIVlSOWGcNaTFHk76xR4GdzDLzAS4uxZUKdASuFX0KJE43C6DaqL+y3VTpUFLI2FIkAS6HZ4I1YBi+S3hg==", + "dev": true, + "requires": { + "resolve": "^1.3.3", + "semver": "^5.3.0" + } + }, + "semver": { + "version": "5.7.2", + "resolved": "http://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + } + } + }, + "ember-cli-is-package-missing": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/ember-cli-is-package-missing/-/ember-cli-is-package-missing-1.0.0.tgz", + "integrity": "sha512-9hEoZj6Au5onlSDdcoBqYEPT8ehlYntZPxH8pBKV0GO7LNel88otSAQsCfXvbi2eKE+MaSeLG/gNaCI5UdWm9g==", + "dev": true + }, + "ember-cli-less": { + "version": "1.5.3", + "resolved": "http://registry.npmjs.org/ember-cli-less/-/ember-cli-less-1.5.3.tgz", + "integrity": "sha512-idd+N6tVqiTOxbmOYgLXTmodvMg8NJNZBnGL7Gpbq6dDhhfPc/KnZlxsP8nqEh1VBitwK/WmkSFr9aJ/dj3aSQ==", + "dev": true, + "requires": { + "broccoli-less-single": "^0.6.0", + "broccoli-merge-trees": "^1.0.0", + "ember-cli-version-checker": "^1.1.4", + "lodash.merge": "^3.3.2" + } + }, + "ember-cli-normalize-entity-name": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/ember-cli-normalize-entity-name/-/ember-cli-normalize-entity-name-1.0.0.tgz", + "integrity": "sha512-rF4P1rW2P1gVX1ynZYPmuIf7TnAFDiJmIUFI1Xz16VYykUAyiOCme0Y22LeZq8rTzwBMiwBwoE3RO4GYWehXZA==", + "dev": true, + "requires": { + "silent-error": "^1.0.0" + } + }, + "ember-cli-path-utils": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/ember-cli-path-utils/-/ember-cli-path-utils-1.0.0.tgz", + "integrity": "sha512-Qq0vvquzf4cFHoDZavzkOy3Izc893r/5spspWgyzLCPTaG78fM3HsrjZm7UWEltbXUqwHHYrqZd/R0jS08NqSA==", + "dev": true + }, + "ember-cli-preprocess-registry": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/ember-cli-preprocess-registry/-/ember-cli-preprocess-registry-1.1.0.tgz", + "integrity": "sha512-qPvvdsAZ3S/OCukihTjstYpsO4vd4dnRtKkI5JYLbuzXPug+LI+VYpDNp0iQWXFhaJwV7wd771NZMVp0z9u4lQ==", + "dev": true, + "requires": { + "broccoli-clean-css": "0.2.0", + "broccoli-funnel": "^1.0.0", + "broccoli-merge-trees": "^1.0.0", + "debug": "^2.2.0", + "exists-sync": "0.0.3", + "lodash": "^3.10.0", + "process-relative-require": "^1.0.0", + "silent-error": "^1.0.0" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==", + "dev": true + } + } + }, + "ember-cli-qunit": { + "version": "1.4.3", + "resolved": "http://registry.npmjs.org/ember-cli-qunit/-/ember-cli-qunit-1.4.3.tgz", + "integrity": "sha512-7l9JbCS8qdb5vRQ5bCOV593farUo1NdNTb+8rkAcU2eJnph/mLmHy+bqKKjAfbFuEr74bIJUPis5NCsMxTHv/Q==", + "dev": true, + "requires": { + "broccoli-babel-transpiler": "^5.5.0", + "broccoli-concat": "^2.2.0", + "broccoli-jshint": "^1.0.0", + "broccoli-merge-trees": "^1.1.0", + "broccoli-null": "^1.0.0", + "ember-cli-babel": "^5.1.5", + "ember-cli-version-checker": "^1.1.4", + "ember-qunit": "^0.4.18", + "qunitjs": "^1.20.0", + "resolve": "^1.1.6" + } + }, + "ember-cli-release": { + "version": "0.2.8", + "resolved": "http://registry.npmjs.org/ember-cli-release/-/ember-cli-release-0.2.8.tgz", + "integrity": "sha512-ucPqVl7zAXlWMTa8Q4xin/CytPYNfXA45Qlyb9tPmAhnq7EQTXA1ftw1F2gutqDMHgPJoGuMHyaDaN4cc1g3MA==", + "dev": true, + "requires": { + "chalk": "^1.0.0", + "git-tools": "^0.1.4", + "make-array": "^0.1.2", + "merge": "^1.2.0", + "moment-timezone": "^0.3.0", + "nopt": "^3.0.3", + "rsvp": "^3.0.17", + "semver": "^4.3.1", + "silent-error": "^1.0.0" + } + }, + "ember-cli-sri": { + "version": "1.2.1", + "resolved": "http://registry.npmjs.org/ember-cli-sri/-/ember-cli-sri-1.2.1.tgz", + "integrity": "sha512-vpUDprsH4/UeydpXy1MMIkvk1DV16Z7ruPodzAJz/KYPA0soEcyLQvxweBT6EtFzRVGQRAT+3IOamja/PlcOfQ==", + "dev": true, + "requires": { + "broccoli-sri-hash": "^1.2.2" + } + }, + "ember-cli-string-utils": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz", + "integrity": "sha512-PlJt4fUDyBrC/0X+4cOpaGCiMawaaB//qD85AXmDRikxhxVzfVdpuoec02HSiTGTTB85qCIzWBIh8lDOiMyyFg==", + "dev": true + }, + "ember-cli-test-info": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/ember-cli-test-info/-/ember-cli-test-info-1.0.0.tgz", + "integrity": "sha512-dEVTIpmUfCzweC97NGf6p7L6XKBwV2GmSM4elmzKvkttEp5P7AvGA9uGyN4GqFq+RwhW+2b0I2qlX00w+skm+A==", + "dev": true, + "requires": { + "ember-cli-string-utils": "^1.0.0" + } + }, + "ember-cli-uglify": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/ember-cli-uglify/-/ember-cli-uglify-1.2.0.tgz", + "integrity": "sha512-AIdvRLjHzVW3Y/FV88dm2gAIMvJplFChlCLkm0nEeZZ1y3/0qBh7eUwqE4VpRYt+KOyU59TP9CmcxpBDJSfvQw==", + "dev": true, + "requires": { + "broccoli-uglify-sourcemap": "^1.0.0" + } + }, + "ember-cli-version-checker": { + "version": "1.3.1", + "resolved": "http://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-1.3.1.tgz", + "integrity": "sha512-mu1Apdd19ZuDsy9WAHheFhltaJx+0ardFNM8Hb/AeRO9RokOK/bdUq/Jc1oeg0/Hl18tnxg8STG9TyJ6HgE3+g==", + "dev": true, + "requires": { + "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.2", + "resolved": "http://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + } + } + }, + "ember-composable-helpers": { + "version": "0.23.1", + "resolved": "http://registry.npmjs.org/ember-composable-helpers/-/ember-composable-helpers-0.23.1.tgz", + "integrity": "sha512-Dd2OCi7yu6J+AloddGPBSgobM7fmLwrpvEfJyUc2WlotczMUSSzfxdogPt8+/lHAQ9f2YF3STIzYChe2jkkcKA==", + "dev": true, + "requires": { + "broccoli-funnel": "^1.0.1", + "ember-cli-babel": "^5.1.5" + } + }, + "ember-computed-decorators": { + "version": "0.2.2", + "resolved": "http://registry.npmjs.org/ember-computed-decorators/-/ember-computed-decorators-0.2.2.tgz", + "integrity": "sha512-b5O+oASNLGCVp+cqhPC/TyDe5ULPQmnVwAmmPYJAwb0iLCaVMa1MVUPvro5We0P7YG+Wk7zjoL54OIR0qcrXCA==", + "dev": true, + "requires": { + "ember-cli-babel": "^5.1.5" + } + }, + "ember-data": { + "version": "1.13.15", + "resolved": "http://registry.npmjs.org/ember-data/-/ember-data-1.13.15.tgz", + "integrity": "sha512-y6jaq+mWhFwzTcRWpeM0qRNGduVvSm/J2wzosPn059LadzdA6qQEl8TT42QCcQb3Ojg4Q3Njv9V7buoYU/kddw==", + "dev": true, + "requires": { + "rsvp": "^3.0.18" + }, + "dependencies": { + "@ember-data/private-build-infra": {} + } + }, + "ember-disable-proxy-controllers": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/ember-disable-proxy-controllers/-/ember-disable-proxy-controllers-1.0.2.tgz", + "integrity": "sha512-n3ldcJ7QtowV30tTEOkc/LEC1Xssqn8rZ2DDYJLVjMZIa32+p0TbJBXr+8kvThgzi5EZACNoI4Y3cLRW5OLJnw==", + "dev": true, + "requires": { + "ember-cli-babel": "^6.16.0" + }, + "dependencies": { + "amd-name-resolver": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/amd-name-resolver/-/amd-name-resolver-1.2.0.tgz", + "integrity": "sha512-hlSTWGS1t6/xq5YCed7YALg7tKZL3rkl7UwEZ/eCIkn8JxmM6fU6Qs/1hwtjQqfuYxlffuUcgYEm0f5xP4YKaA==", + "dev": true, + "requires": { + "ensure-posix-path": "^1.0.1" + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "http://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + } + }, + "babel-plugin-debug-macros": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.2.0.tgz", + "integrity": "sha512-Wpmw4TbhR3Eq2t3W51eBAQSdKlr+uAyF0GI4GtPfMCD12Y4cIdpKC9l0RjNTH/P9isFypSqqewMPm7//fnZlNA==", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "babel-plugin-ember-modules-api-polyfill": { + "version": "2.13.4", + "resolved": "http://registry.npmjs.org/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.13.4.tgz", + "integrity": "sha512-uxQPkEQAzCYdwhZk16O9m1R4xtCRNy4oEUTBrccOPfzlIahRZJic/JeP/ZEL0BC6Mfq6r55eOg6gMF/zdFoCvA==", + "dev": true, + "requires": { + "ember-rfc176-data": "^0.3.13" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "http://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "broccoli-babel-transpiler": { + "version": "6.5.1", + "resolved": "http://registry.npmjs.org/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.5.1.tgz", + "integrity": "sha512-w6GcnkxvHcNCte5FcLGEG1hUdQvlfvSN/6PtGWU/otg69Ugk8rUk51h41R0Ugoc+TNxyeFG1opRt2RlA87XzNw==", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "broccoli-funnel": "^2.0.1", + "broccoli-merge-trees": "^2.0.0", + "broccoli-persistent-filter": "^1.4.3", + "clone": "^2.0.0", + "hash-for-dep": "^1.2.3", + "heimdalljs-logger": "^0.1.7", + "json-stable-stringify": "^1.0.0", + "rsvp": "^4.8.2", + "workerpool": "^2.3.0" + } + }, + "broccoli-funnel": { + "version": "2.0.2", + "resolved": "http://registry.npmjs.org/broccoli-funnel/-/broccoli-funnel-2.0.2.tgz", + "integrity": "sha512-/vDTqtv7ipjEZQOVqO4vGDVAOZyuYzQ/EgGoyewfOgh1M7IQAToBKZI0oAQPgMBeFPPlIbfMuAngk+ohPBuaHQ==", + "dev": true, + "requires": { + "array-equal": "^1.0.0", + "blank-object": "^1.0.1", + "broccoli-plugin": "^1.3.0", + "debug": "^2.2.0", + "fast-ordered-set": "^1.0.0", + "fs-tree-diff": "^0.5.3", + "heimdalljs": "^0.2.0", + "minimatch": "^3.0.0", + "mkdirp": "^0.5.0", + "path-posix": "^1.0.0", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0", + "walk-sync": "^0.3.1" + } + }, + "broccoli-merge-trees": { + "version": "2.0.1", + "resolved": "http://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-2.0.1.tgz", + "integrity": "sha512-WjaexJ+I8BxP5V5RNn6um/qDRSmKoiBC/QkRi79FT9ClHfldxRyCDs9mcV7mmoaPlsshmmPaUz5jdtcKA6DClQ==", + "dev": true, + "requires": { + "broccoli-plugin": "^1.3.0", + "merge-trees": "^1.0.1" + } + }, + "broccoli-source": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/broccoli-source/-/broccoli-source-1.1.0.tgz", + "integrity": "sha512-ahvqmwF6Yvh6l+sTJJdey4o4ynwSH8swSSBSGmUXGSPPCqBWvquWB/4rWN65ZArKilBFq/29O0yQnZNIf//sTg==", + "dev": true + }, + "clone": { + "version": "2.1.2", + "resolved": "http://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "ember-cli-babel": { + "version": "6.18.0", + "resolved": "http://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz", + "integrity": "sha512-7ceC8joNYxY2wES16iIBlbPSxwKDBhYwC8drU3ZEvuPDMwVv1KzxCNu1fvxyFEBWhwaRNTUxSCsEVoTd9nosGA==", + "dev": true, + "requires": { + "amd-name-resolver": "1.2.0", + "babel-plugin-debug-macros": "^0.2.0-beta.6", + "babel-plugin-ember-modules-api-polyfill": "^2.6.0", + "babel-plugin-transform-es2015-modules-amd": "^6.24.0", + "babel-polyfill": "^6.26.0", + "babel-preset-env": "^1.7.0", + "broccoli-babel-transpiler": "^6.5.0", + "broccoli-debug": "^0.6.4", + "broccoli-funnel": "^2.0.0", + "broccoli-source": "^1.1.0", + "clone": "^2.0.0", + "ember-cli-version-checker": "^2.1.2", + "semver": "^5.5.0" + } + }, + "ember-cli-version-checker": { + "version": "2.2.0", + "resolved": "http://registry.npmjs.org/ember-cli-version-checker/-/ember-cli-version-checker-2.2.0.tgz", + "integrity": "sha512-G+KtYIVlSOWGcNaTFHk76xR4GdzDLzAS4uxZUKdASuFX0KJE43C6DaqL+y3VTpUFLI2FIkAS6HZ4I1YBi+S3hg==", + "dev": true, + "requires": { + "resolve": "^1.3.3", + "semver": "^5.3.0" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", + "dev": true + }, + "merge-trees": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/merge-trees/-/merge-trees-1.0.1.tgz", + "integrity": "sha512-O7TWwipLHhc9tErjq3WBvNP7I1g7Wgudl1ZkLqpT7F2MZy1yEdgnI9cpZZxBaqk+wJZu+2b9FE7D3ubUmGFHFA==", + "dev": true, + "requires": { + "can-symlink": "^1.0.0", + "fs-tree-diff": "^0.5.4", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0" + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "http://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "semver": { + "version": "5.7.2", + "resolved": "http://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + }, + "workerpool": { + "version": "2.3.4", + "resolved": "http://registry.npmjs.org/workerpool/-/workerpool-2.3.4.tgz", + "integrity": "sha512-c2EWrgB9IKHi1jbf4LG9sxKgHYOY+Ej5li6siEGtFecCXWG7eQOqATPEJ0rg1KFETXROEkErc1t5XiNrLG666Q==", + "dev": true, + "requires": { + "object-assign": "4.1.1" + } + } + } + }, + "ember-export-application-global": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/ember-export-application-global/-/ember-export-application-global-1.1.1.tgz", + "integrity": "sha512-dwYIgOOosgmJa8q38zUYADcxMePmol064bJuDngezriCgEZEHCUUiKmPI6yp2TI4LG2mnsJz9tAAf9GvpyjtjQ==", + "dev": true, + "requires": { + "ember-cli-babel": "^5.1.10" + } + }, + "ember-font-awesome": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/ember-font-awesome/-/ember-font-awesome-2.1.0.tgz", + "integrity": "sha512-pmV/3+cO9PFKZupcME3IihgPoJMoZQx2LEZgpyK18QTchnjsWOxCleBoj5V7qSINLFaBK/8tE6tvBOqgbQRQ5Q==", + "dev": true, + "requires": { + "ember-cli-babel": "^5.1.5", + "ember-cli-htmlbars": "^1.0.1", + "ember-computed-decorators": "0.2.2" + } + }, + "ember-lodash": { + "version": "0.0.6", + "resolved": "http://registry.npmjs.org/ember-lodash/-/ember-lodash-0.0.6.tgz", + "integrity": "sha512-eKXlr9neoq+y5Cr8XlfcbwhW4K51Zp32uJP+clszWapqPrHXmm+iuXAnOQ5H1UcjyXvcVjIBnnO01/q7gg+yOw==", + "dev": true, + "requires": { + "broccoli-merge-trees": "^0.2.1", + "ember-cli-babel": "^5.1.5", + "lodash-es": "^3.10.0" + }, + "dependencies": { + "broccoli-merge-trees": { + "version": "0.2.4", + "resolved": "http://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-0.2.4.tgz", + "integrity": "sha512-/Tzzz7nqXzzPe5nUyJOPWLd7TByS1pHZQNlMrMgr/MKpWgAXhTzLOpOwmN4e8REAfM+oQ0PYaq0GVveq246vXw==", + "dev": true, + "requires": { + "broccoli-plugin": "^1.0.0", + "debug": "^2.2.0", + "symlink-or-copy": "^1.0.0" + } + } + } + }, + "ember-qunit": { + "version": "0.4.24", + "resolved": "http://registry.npmjs.org/ember-qunit/-/ember-qunit-0.4.24.tgz", + "integrity": "sha512-ygPS0uZjQW6jjBO1qjzZ43L91K3Tq9JeWCoRnl3aQ4QOfvDI3F+vVh+WKKoO65fOG0ePDCvykeQFyjsFKrbeSQ==", + "dev": true, + "requires": { + "ember-test-helpers": "^0.5.32" + } + }, + "ember-rfc176-data": { + "version": "0.3.18", + "resolved": "http://registry.npmjs.org/ember-rfc176-data/-/ember-rfc176-data-0.3.18.tgz", + "integrity": "sha512-JtuLoYGSjay1W3MQAxt3eINWXNYYQliK90tLwtb8aeCuQK8zKGCRbBodVIrkcTqshULMnRuTOS6t1P7oQk3g6Q==", + "dev": true + }, + "ember-spectrum-color-picker": { + "version": "0.4.2", + "resolved": "http://registry.npmjs.org/ember-spectrum-color-picker/-/ember-spectrum-color-picker-0.4.2.tgz", + "integrity": "sha512-oUmwWGDlQiJ+QMTTvCzcwbEdm9FklX/KyQKSDTrxPkbAovRAeWPMAX5cAZQjklHD+NMJJHC57+Pb4+zZmy+4fg==", + "dev": true, + "requires": { + "ember-cli-babel": "^5.1.5" + } + }, + "ember-test-helpers": { + "version": "0.5.34", + "resolved": "http://registry.npmjs.org/ember-test-helpers/-/ember-test-helpers-0.5.34.tgz", + "integrity": "sha512-lRCe6l3sXdg2ACRKICLorAWw1uf43eYRDYeJlSETfFfuu4qZnNF4iOGArH1bqj1K7ZAszGKprWZoW5g4Ie9rYQ==", + "dev": true, + "requires": { + "klassy": "^0.1.3" + } + }, + "ember-truth-helpers": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/ember-truth-helpers/-/ember-truth-helpers-1.2.0.tgz", + "integrity": "sha512-mY2Y2XM6C93OV4mY9psWmukGviDd7silXK/xFV8K6gjUizzoJ6EmLzEJSF+KXpIUyp+Xpmc6bJrji3suqNdrpg==", + "dev": true, + "requires": { + "ember-cli-babel": "^5.1.5" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "http://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true + }, + "engine.io": { + "version": "1.8.0", + "resolved": "http://registry.npmjs.org/engine.io/-/engine.io-1.8.0.tgz", + "integrity": "sha512-1oB0MQCJOd8K5G7kJFDoduFHQVqUrn7T5o/TUSjre9MRSgvETpN+FpRV+DYciiwS3n2ajcn5ECBMJtZGwnXOkg==", + "dev": true, + "requires": { + "accepts": "1.3.3", + "base64id": "0.1.0", + "cookie": "0.3.1", + "debug": "2.3.3", + "engine.io-parser": "1.3.1", + "ws": "1.1.1" + }, + "dependencies": { + "accepts": { + "version": "1.3.3", + "resolved": "http://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha512-AOPopplFOUlmUugwiZUCDpOwmqvSgdCyE8iJVLWI4NcB7qfMKQN34dn5xYtlUU03XGG5egRWW4NW5gIxpa5hEA==", + "dev": true, + "requires": { + "mime-types": "~2.1.11", + "negotiator": "0.6.1" + } + }, + "cookie": { + "version": "0.3.1", + "resolved": "http://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==", + "dev": true + }, + "debug": { + "version": "2.3.3", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha512-dCHp4G+F11zb+RtEu7BE2U8R32AYmM/4bljQfut8LipH3PdwsVBVGh083MXvtKkB7HSQUzSwiXz53c4mzJvYfw==", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha512-5NnE67nQSQDJHVahPJna1PQ/zCXMnQop3yUCxjKPNzCxuyPSKWTQ/5Gu5CZmjetwGLWRA+PzeF5thlbOdbQldA==", + "dev": true + }, + "negotiator": { + "version": "0.6.1", + "resolved": "http://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha512-qTxkr1RoLw5Pz+1+PTJ/66hWuyi2LEOeOuIDJDlx6JF8x75bmD5C7qXTg2UlX5W9rLfkqKP+r8q6Vy6NWdWrbw==", + "dev": true + } + } + }, + "engine.io-client": { + "version": "1.8.0", + "resolved": "http://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.0.tgz", + "integrity": "sha512-d5schfRFUTInjSL6q+JZRyKFBGl+mADITWycyRj37GSL363e1kTWpME3LgqJyBuLt1wJ2Q8dRkA4xtgzwJrmkQ==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "2.3.3", + "engine.io-parser": "1.3.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parsejson": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "1.1.1", + "xmlhttprequest-ssl": "1.5.3", + "yeast": "0.1.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "http://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==", + "dev": true + }, + "debug": { + "version": "2.3.3", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha512-dCHp4G+F11zb+RtEu7BE2U8R32AYmM/4bljQfut8LipH3PdwsVBVGh083MXvtKkB7HSQUzSwiXz53c4mzJvYfw==", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha512-5NnE67nQSQDJHVahPJna1PQ/zCXMnQop3yUCxjKPNzCxuyPSKWTQ/5Gu5CZmjetwGLWRA+PzeF5thlbOdbQldA==", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "1.3.1", + "resolved": "http://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.1.tgz", + "integrity": "sha512-apg+90JYifyXR0Ju+dweByTyC8AKj1pY18643GVAy0lIHh2Q38EIGks8p93acvpjLOgsqRNV+fyALTLV7Wqm1g==", + "dev": true, + "requires": { + "after": "0.8.1", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary": "0.1.6", + "wtf-8": "1.0.0" + }, + "dependencies": { + "has-binary": { + "version": "0.1.6", + "resolved": "http://registry.npmjs.org/has-binary/-/has-binary-0.1.6.tgz", + "integrity": "sha512-aBByfHrIiIt6PQ+jFXsLIFVNpHVyXDcCZ77VZ4kvxv6TvTwipSTDNvKnPN5xOi/cQTcxhLa4lBV2b49pZGQgXw==", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "http://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + } + } + }, + "ensure-posix-path": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/ensure-posix-path/-/ensure-posix-path-1.1.1.tgz", + "integrity": "sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw==", + "dev": true + }, + "entities": { + "version": "1.1.2", + "resolved": "http://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "http://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "requires": { + "prr": "~1.0.1" + } + }, + "es5-ext": { + "version": "0.10.62", + "resolved": "http://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "dev": true, + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "http://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + }, + "dependencies": { + "d": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + } + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "http://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + }, + "dependencies": { + "d": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + } + } + }, + "es6-weak-map": { + "version": "0.1.4", + "resolved": "http://registry.npmjs.org/es6-weak-map/-/es6-weak-map-0.1.4.tgz", + "integrity": "sha512-P+N5Cd2TXeb7G59euFiM7snORspgbInS29Nbf3KNO2JQp/DyhvMCDWd58nsVAXwYJ6W3Bx7qDdy6QQ3PCJ7jKQ==", + "dev": true, + "requires": { + "d": "~0.1.1", + "es5-ext": "~0.10.6", + "es6-iterator": "~0.1.3", + "es6-symbol": "~2.0.1" + }, + "dependencies": { + "es6-iterator": { + "version": "0.1.3", + "resolved": "http://registry.npmjs.org/es6-iterator/-/es6-iterator-0.1.3.tgz", + "integrity": "sha512-6TOmbFM6OPWkTe+bQ3ZuUkvqcWUjAnYjKUCLdbvRsAUz2Pr+fYIibwNXNkLNtIK9PPFbNMZZddaRNkyJhlGJhA==", + "dev": true, + "requires": { + "d": "~0.1.1", + "es5-ext": "~0.10.5", + "es6-symbol": "~2.0.1" + } + }, + "es6-symbol": { + "version": "2.0.1", + "resolved": "http://registry.npmjs.org/es6-symbol/-/es6-symbol-2.0.1.tgz", + "integrity": "sha512-wjobO4zO8726HVU7mI2OA/B6QszqwHJuKab7gKHVx+uRfVVYGcWJkCIFxV2Madqb9/RUSrhJ/r6hPfG7FsWtow==", + "dev": true, + "requires": { + "d": "~0.1.1", + "es5-ext": "~0.10.5" + } + } + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "http://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "esprima-fb": { + "version": "15001.1001.0-dev-harmony-fb", + "resolved": "http://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1001.0-dev-harmony-fb.tgz", + "integrity": "sha512-m7OsYzocA8OQ3+9CxmhIv7NPHtyDR2ixaLCO7kLZ+YH+xQ/BpaZmll9EXmc+kBxzWA8BRBXbNEuEQqQ6vfsgDw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "http://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "http://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "http://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + }, + "dependencies": { + "d": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + } + } + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "http://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "http://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "http://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "events-to-array": { + "version": "1.1.2", + "resolved": "http://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", + "integrity": "sha512-inRWzRY7nG+aXZxBzEqYKB3HPgwflZRopAjDCHv0whhRx+MTUr1ei0ICZUypdyE0HRm4L2d5VEcIqLD6yl+BFA==", + "dev": true + }, + "exec-sh": { + "version": "0.2.2", + "resolved": "http://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", + "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", + "dev": true, + "requires": { + "merge": "^1.2.0" + } + }, + "exists-sync": { + "version": "0.0.3", + "resolved": "http://registry.npmjs.org/exists-sync/-/exists-sync-0.0.3.tgz", + "integrity": "sha512-/qPB5E0cRuA/Cs5vHrmKYSfhIBCPJs9Vm3e9aIejMwwbe6idMeNbGu1g5stvr/bXT6HywHckLPEkmY7HK6FlwA==", + "dev": true + }, + "exit": { + "version": "0.1.2", + "resolved": "http://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "http://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "http://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==", + "dev": true, + "requires": { + "fill-range": "^2.1.0" + } + }, + "express": { + "version": "4.18.2", + "resolved": "http://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "finalhandler": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, + "on-finished": { + "version": "2.4.1", + "resolved": "http://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "http://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "http://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } + } + }, + "ext": { + "version": "1.7.0", + "resolved": "http://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "requires": { + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "http://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "http://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "optional": true + }, + "extglob": { + "version": "0.3.2", + "resolved": "http://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "http://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "optional": true + }, + "fast-ordered-set": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/fast-ordered-set/-/fast-ordered-set-1.0.3.tgz", + "integrity": "sha512-MxBW4URybFszOx1YlACEoK52P6lE3xiFcPaGCUZ7QQOZ6uJXKo++Se8wa31SjcZ+NC/fdAWX7UtKEfaGgHS2Vg==", + "dev": true, + "requires": { + "blank-object": "^1.0.1" + } + }, + "fast-sourcemap-concat": { + "version": "0.2.7", + "resolved": "http://registry.npmjs.org/fast-sourcemap-concat/-/fast-sourcemap-concat-0.2.7.tgz", + "integrity": "sha512-T+68HTWxHvTyYC7Fon18RDLkj4eLpYlzcQ+9bgj/pr8ZRXP8YxwoWOissCbHi6ZyAmALDFb+bLy05dsmUFF0dQ==", + "dev": true, + "requires": { + "chalk": "^0.5.1", + "debug": "^2.2.0", + "mkdirp": "^0.5.0", + "rsvp": "^3.0.14", + "source-map": "^0.4.2", + "source-map-url": "^0.3.0" + }, + "dependencies": { + "ansi-regex": { + "version": "0.2.1", + "resolved": "http://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==", + "dev": true + }, + "ansi-styles": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA==", + "dev": true + }, + "chalk": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha512-bIKA54hP8iZhyDT81TOsJiQvR1gW+ZYSXFaZUAvoD4wCHdbHY2actmpTE4x344ZlFqHbvoxKOaESULTZN2gstg==", + "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" + } + }, + "has-ansi": { + "version": "0.1.0", + "resolved": "http://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha512-1YsTg1fk2/6JToQhtZkArMkurq8UoWU1Qe0aR3VUHjgij4nOylSWLWAtBXoZ4/dXOmugfLGm1c+QhuD0JyedFA==", + "dev": true, + "requires": { + "ansi-regex": "^0.2.0" + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A==", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "strip-ansi": { + "version": "0.3.0", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha512-DerhZL7j6i6/nEnVG0qViKXI0OKouvvpsAiaj7c+LfqZZZxdwZtv8+UiA/w4VUJpT8UzX0pR1dcHOii1GbmruQ==", + "dev": true, + "requires": { + "ansi-regex": "^0.2.1" + } + }, + "supports-color": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha512-tdCZ28MnM7k7cJDJc7Eq80A9CsRFAAOZUy41npOZCs++qSjfIy7o5Rh46CBk+Dk5FbKJ33X3Tqg4YrV07N5RaA==", + "dev": true + } + } + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "http://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha512-Xhj93RXbMSq8urNCUq4p9l0P6hnySJ/7YNRhYNug0bLOuii7pKO7xQFb5mx9xZXWCar88pLPb805PvUkwrLZpQ==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fb-watchman": { + "version": "2.0.2", + "resolved": "http://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "http://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==", + "dev": true + }, + "fill-range": { + "version": "2.2.4", + "resolved": "http://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "findup": { + "version": "0.1.5", + "resolved": "http://registry.npmjs.org/findup/-/findup-0.1.5.tgz", + "integrity": "sha512-Udxo3C9A6alt2GZ2MNsgnIvX7De0V3VGxeP/x98NSVgSlizcDHdmJza61LI7zJy4OEtSiJyE72s0/+tBl5/ZxA==", + "dev": true, + "requires": { + "colors": "~0.6.0-1", + "commander": "~2.1.0" + }, + "dependencies": { + "commander": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.1.0.tgz", + "integrity": "sha512-J2wnb6TKniXNOtoHS8TSrG9IOQluPrsmyAJ8oCUJOBmv+uLBCyPYAZkD2jFvw2DCzIXNnISIM01NIvr35TkBMQ==", + "dev": true + } + } + }, + "findup-sync": { + "version": "0.2.1", + "resolved": "http://registry.npmjs.org/findup-sync/-/findup-sync-0.2.1.tgz", + "integrity": "sha512-uv8a0ezsjAT99zkSJsJtx1scyee6jS2iC4T50n6McAudpZD5rHsGsdvgO+kd73hSh3v/ZiW/8dDfLb2p9yxptw==", + "dev": true, + "requires": { + "glob": "~4.3.0" + }, + "dependencies": { + "glob": { + "version": "4.3.5", + "resolved": "http://registry.npmjs.org/glob/-/glob-4.3.5.tgz", + "integrity": "sha512-kOq1ncUyUvkZdl7BgKa3n6zAOiN05pzleOxESuc8bFoXKRhYsrZM6z79O5DKe9JGChHhSZloUsD/hZrUXByxgQ==", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^2.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "2.0.10", + "resolved": "http://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha512-jQo6o1qSVLEWaw3l+bwYA2X0uLuK2KjNh2wjgO7Q/9UJnXr1Q3yQKR8BI0/Bt/rPg75e6SMW4hW/6cBHVTZUjA==", + "dev": true, + "requires": { + "brace-expansion": "^1.0.0" + } + } + } + }, + "fireworm": { + "version": "0.7.2", + "resolved": "http://registry.npmjs.org/fireworm/-/fireworm-0.7.2.tgz", + "integrity": "sha512-GjebTzq+NKKhfmDxjKq3RXwQcN9xRmZWhnnuC9L+/x5wBQtR0aaQM50HsjrzJ2wc28v1vSdfOpELok0TKR4ddg==", + "dev": true, + "requires": { + "async": "~0.2.9", + "is-type": "0.0.1", + "lodash.debounce": "^3.1.1", + "lodash.flatten": "^3.0.2", + "minimatch": "^3.0.2" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "http://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==", + "dev": true + } + } + }, + "follow-redirects": { + "version": "1.15.3", + "resolved": "http://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "http://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "http://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "http://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha512-8HWGSLAPr+AG0hBpsqi5Ob8HrLStN/LWeqhpFl14d7FJgHK48TmgLoALPz69XSUR65YJzDfLUX/BM8+MLJLghQ==", + "dev": true, + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "http://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true + }, + "fs-extra": { + "version": "0.26.7", + "resolved": "http://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", + "integrity": "sha512-waKu+1KumRhYv8D8gMRCKJGAMI9pRnPuEb1mvgYD0f7wBscg+h6bW4FDTmEZhB9VKxvoTtxW+Y7bnIlB7zja6Q==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.11", + "resolved": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + } + } + }, + "fs-monitor-stack": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/fs-monitor-stack/-/fs-monitor-stack-1.1.1.tgz", + "integrity": "sha512-R3dtLVaSCZ7lu7B16T3uhu1CHHcC5wm5DJA9GO970vypWNkjswzJky+5F8T9Lp2V8WwdKUfRuZKOwjyNIEQ6ZQ==", + "dev": true + }, + "fs-readdir-recursive": { + "version": "0.1.2", + "resolved": "http://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-0.1.2.tgz", + "integrity": "sha512-//yfxmYAazrsyb/rgeYDNFXFTuPYTGYirp5QHFSH8h/LaNUoP5bQAa2ikstdK1PR/bFd1CIlQLpUq6/u6UVfSw==", + "dev": true + }, + "fs-tree-diff": { + "version": "0.5.9", + "resolved": "http://registry.npmjs.org/fs-tree-diff/-/fs-tree-diff-0.5.9.tgz", + "integrity": "sha512-872G8ax0kHh01m9n/2KDzgYwouKza0Ad9iFltBpNykvROvf2AGtoOzPJgGx125aolGPER3JuC7uZFrQ7bG1AZw==", + "dev": true, + "requires": { + "heimdalljs-logger": "^0.1.7", + "object-assign": "^4.1.0", + "path-posix": "^1.0.0", + "symlink-or-copy": "^1.1.8" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "function-bind": { + "version": "1.1.2", + "resolved": "http://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true + }, + "gauge": { + "version": "5.0.1", + "resolved": "http://registry.npmjs.org/gauge/-/gauge-5.0.1.tgz", + "integrity": "sha512-CmykPMJGuNan/3S4kZOpvvPYSNqSHANiWnh9XcMU2pSjtBfF0XzZ2p1bFAxTbnFxyBuPxQYHhzwaoOmUdqzvxQ==", + "dev": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^4.0.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "http://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "get-intrinsic": { + "version": "1.2.2", + "resolved": "http://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dev": true, + "requires": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "http://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "http://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "optional": true + } + } + }, + "git-repo-info": { + "version": "1.4.1", + "resolved": "http://registry.npmjs.org/git-repo-info/-/git-repo-info-1.4.1.tgz", + "integrity": "sha512-oqzBH6cNvE8Cq3p61ps4m0POZrVMKlARntc2BxLnuqTK+HeWpKfUMJQ7H1CvescHRINj+0a7TKA+Pp/bOq5F1Q==", + "dev": true + }, + "git-repo-version": { + "version": "0.3.0", + "resolved": "http://registry.npmjs.org/git-repo-version/-/git-repo-version-0.3.0.tgz", + "integrity": "sha512-/DcOWJk1VTFp5LemJBZ5+7/YgzKw56+XVAAnkIV7QoooUKziaaJNMHqA6zXTLQfeiw2f2Gxen3tC0H7EKcc62Q==", + "dev": true, + "requires": { + "git-repo-info": "^1.0.4" + } + }, + "git-tools": { + "version": "0.1.4", + "resolved": "http://registry.npmjs.org/git-tools/-/git-tools-0.1.4.tgz", + "integrity": "sha512-Fx8ewWo0LNNbDAfRUuXulkHPQZoOp3cEvvMOdEzFBnMmBZ0K5qFr/ceLukz+WVognnIZOm2QjyITecINoI+G2A==", + "dev": true, + "requires": { + "spawnback": "~1.0.0" + } + }, + "glob": { + "version": "5.0.15", + "resolved": "http://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "http://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "globals": { + "version": "6.4.1", + "resolved": "http://registry.npmjs.org/globals/-/globals-6.4.1.tgz", + "integrity": "sha512-Lh7H0bYRNBMc2CapY+TYsCzcSM4HWHGFoQORuEcePk3y3IhpaZmFSJDirhNYSwq8QeHvaCqV/tHI2bdUhYryuw==", + "dev": true + }, + "gopd": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "graceful-fs": { + "version": "2.0.3", + "resolved": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", + "integrity": "sha512-hcj/NTUWv+C3MbqrVb9F+aH6lvTwEHJdx2foBxlrVq5h6zE8Bfu4pv4CAAqbDcZrw/9Ak5lsRXlY9Ao8/F0Tuw==", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "http://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==", + "dev": true + }, + "handlebars": { + "version": "3.0.8", + "resolved": "http://registry.npmjs.org/handlebars/-/handlebars-3.0.8.tgz", + "integrity": "sha512-frzSzoxbJZSB719r+lM3UFKrnHIY6VPY/j47+GNOHVnBHxO+r+Y/iDjozAbj1SztmmMpr2CcZY6rLeN5mqX8zA==", + "dev": true, + "requires": { + "optimist": "^0.6.1", + "source-map": "^0.1.40", + "uglify-js": "^2.6" + } + }, + "har-schema": { + "version": "1.0.5", + "resolved": "http://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha512-f8xf2GOR6Rgwc9FPTLNzgwB+JQ2/zMauYXSWmX5YV5acex6VomT0ocSuwR7BfXo5MpHi+jL+saaux2fwsGJDKQ==", + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "http://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha512-5Gbp6RAftMYYV3UEI4c4Vv3+a4dQ7taVyvHt+/L6kRt+f4HX1GweAk5UDWN0SvdVnRBzGQ6OG89pGaD9uSFnVw==", + "dev": true, + "optional": true, + "requires": { + "ajv": "^4.9.1", + "har-schema": "^1.0.5" + }, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "http://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha512-I/bSHSNEcFFqXLf91nchoNB9D1Kie3QKcWdchYUaoIg1+1bdWDkdfdlvdIOJbi9U8xR0y+MWc5D+won9v95WlQ==", + "dev": true, + "optional": true, + "requires": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + } + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-binary": { + "version": "0.1.7", + "resolved": "http://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", + "integrity": "sha512-k1Umb4/jrBWZbtL+QKSji8qWeoZ7ZTkXdnDXt1wxwBKAFM0//u96wDj43mBIqCIas8rDQMYyrBEvcS8hdGd4Sg==", + "dev": true, + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "http://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + } + } + }, + "has-color": { + "version": "0.1.7", + "resolved": "http://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", + "integrity": "sha512-kaNz5OTAYYmt646Hkqw50/qyxP2vFnTVu5AQ1Zmk22Kk5+4Qx6BpO8+u7IKsML5fOsFk0ZT0AcCJNYwcvaLBvw==", + "dev": true + }, + "has-cors": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "http://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.2" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "http://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "hash-for-dep": { + "version": "1.5.1", + "resolved": "http://registry.npmjs.org/hash-for-dep/-/hash-for-dep-1.5.1.tgz", + "integrity": "sha512-/dQ/A2cl7FBPI2pO0CANkvuuVi/IFS5oTyJ0PsOb6jW6WbVW1js5qJXMJTNbWHXBIPdFTWFbabjB+mE0d+gelw==", + "dev": true, + "requires": { + "broccoli-kitchen-sink-helpers": "^0.3.1", + "heimdalljs": "^0.2.3", + "heimdalljs-logger": "^0.1.7", + "path-root": "^0.1.1", + "resolve": "^1.10.0", + "resolve-package-path": "^1.0.11" + } + }, + "hasown": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "http://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha512-X8xbmTc1cbPXcQV4WkLcRMALuyoxhfpFATmyuCxJPOAvrDS4DNnsTAOmKUxMTOWU6TzrTOkxPKwIx5ZOpJVSrg==", + "dev": true, + "optional": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "heimdalljs": { + "version": "0.2.6", + "resolved": "http://registry.npmjs.org/heimdalljs/-/heimdalljs-0.2.6.tgz", + "integrity": "sha512-o9bd30+5vLBvBtzCPwwGqpry2+n0Hi6H1+qwt6y+0kwRHGGF8TFIhJPmnuM0xO97zaKrDZMwO/V56fAnn8m/tA==", + "dev": true, + "requires": { + "rsvp": "~3.2.1" + }, + "dependencies": { + "rsvp": { + "version": "3.2.1", + "resolved": "http://registry.npmjs.org/rsvp/-/rsvp-3.2.1.tgz", + "integrity": "sha512-Rf4YVNYpKjZ6ASAmibcwTNciQ5Co5Ztq6iZPEykHpkoflnD/K5ryE/rHehFsTm4NJj8nKDhbi3eKBWGogmNnkg==", + "dev": true + } + } + }, + "heimdalljs-logger": { + "version": "0.1.10", + "resolved": "http://registry.npmjs.org/heimdalljs-logger/-/heimdalljs-logger-0.1.10.tgz", + "integrity": "sha512-pO++cJbhIufVI/fmB/u2Yty3KJD0TqNPecehFae0/eps0hkZ3b4Zc/PezUMOpYuHFQbA7FxHZxa305EhmjLj4g==", + "dev": true, + "requires": { + "debug": "^2.2.0", + "heimdalljs": "^0.2.6" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "http://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha512-V6Yw1rIcYV/4JsnggjBU0l4Kr+EXhpwqXRusENU1Xx6ro00IHPHYNynCuBTOZAPlr3AAmLvchH9I7N/VUdvOwQ==", + "dev": true, + "optional": true + }, + "home-or-tmp": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/home-or-tmp/-/home-or-tmp-1.0.0.tgz", + "integrity": "sha512-6LKQZpR6gk8uJ3mXbBkyOumsA24BUk9CH/79ivZ8Kk1urzlXNGZBoAMuieC/YzwCyGBVqq+uCNUpA1JS6glrxg==", + "dev": true, + "requires": { + "os-tmpdir": "^1.0.1", + "user-home": "^1.1.1" + } + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "http://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==", + "dev": true, + "requires": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + }, + "dependencies": { + "entities": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "http://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + } + } + }, + "http-errors": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "dependencies": { + "statuses": { + "version": "2.0.1", + "resolved": "http://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.5.8", + "resolved": "http://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "http://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-signature": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha512-iUn0NcRULlDGtqNLN1Jxmzayk8ogm7NToldASyZBpM2qggbphjXzNOiw3piN8tgz+e/DRs6X5gAzFwTI6BCRcg==", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "http://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "http://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "image-size": { + "version": "0.5.5", + "resolved": "http://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "optional": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "http://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "include-path-searcher": { + "version": "0.1.0", + "resolved": "http://registry.npmjs.org/include-path-searcher/-/include-path-searcher-0.1.0.tgz", + "integrity": "sha512-KlpXnsZOrBGo4PPKqPFi3Ft6dcRyh8fTaqgzqDRi8jKAsngJEWWOxeFIWC8EfZtXKaZqlsNf9XRwcQ49DVgl/g==", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "http://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==", + "dev": true + }, + "inflection": { + "version": "1.13.4", + "resolved": "http://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", + "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "http://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "http://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "inquirer": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/inquirer/-/inquirer-0.5.1.tgz", + "integrity": "sha512-A4EzstvlRxEr4T7Lm0kg+ZxVXn7ovDbtv9M1VAiMkSTsBd9pykxOBfdihVqok9WKK/SdIanMaQ6Y5XeRbT0sMQ==", + "dev": true, + "requires": { + "async": "~0.8.0", + "chalk": "~0.4.0", + "cli-color": "~0.3.2", + "lodash": "~2.4.1", + "mute-stream": "0.0.4", + "readline2": "~0.1.0", + "through": "~2.3.4" + }, + "dependencies": { + "ansi-styles": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha512-3iF4FIKdxaVYT3JqQuY3Wat/T2t7TRbbQ94Fu50ZUCbLy4TFbTzr90NOHQodQkNqmeEGCw8WbeP78WNi6SKYUA==", + "dev": true + }, + "async": { + "version": "0.8.0", + "resolved": "http://registry.npmjs.org/async/-/async-0.8.0.tgz", + "integrity": "sha512-M2LC+aqW7VetFcnFiYEbjUsmASW6GSsMNkRzhUzwHoQNfNIRClf5GLgozwuJ4tAMLAfjywrKyQ2wWiODJivQmg==", + "dev": true + }, + "chalk": { + "version": "0.4.0", + "resolved": "http://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha512-sQfYDlfv2DGVtjdoQqxS0cEZDroyG8h6TamA6rvxwlrU5BaSLDx9xhatBYl2pxZ7gmpNaPFVwBtdGdu5rQ+tYQ==", + "dev": true, + "requires": { + "ansi-styles": "~1.0.0", + "has-color": "~0.1.0", + "strip-ansi": "~0.1.0" + } + }, + "lodash": { + "version": "2.4.2", + "resolved": "http://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha512-Kak1hi6/hYHGVPmdyiZijoQyz5x2iGVzs6w9GYB/HiXEtylY7tIoYEROMjvM1d9nXJqPOrG2MNPMn01bJ+S0Rw==", + "dev": true + }, + "strip-ansi": { + "version": "0.1.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha512-behete+3uqxecWlDAm5lmskaSaISA+ThQ4oNNBDTBJt0x2ppR6IPqfZNuj6BLaLJ/Sji4TPZlcRyOis8wXQTLg==", + "dev": true + } + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "http://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "http://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "http://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-core-module": { + "version": "2.13.1", + "resolved": "http://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "requires": { + "hasown": "^2.0.0" + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg==", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "http://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA==", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "http://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "http://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-git-url": { + "version": "0.2.3", + "resolved": "http://registry.npmjs.org/is-git-url/-/is-git-url-0.2.3.tgz", + "integrity": "sha512-UEWwpSpBBqQB6lYMJUHHCxJMPBKV8fxcmdbA5GNDq7SApnMyyRVNF9QeBtCs3+56elwkix5QEGsN9O669XnEYw==", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "http://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-integer": { + "version": "1.0.7", + "resolved": "http://registry.npmjs.org/is-integer/-/is-integer-1.0.7.tgz", + "integrity": "sha512-RPQc/s9yBHSvpi+hs9dYiJ2cuFeU6x3TyyIp8O2H6SKEltIvJOzRj9ToyvcStDvPR/pS4rxgr1oBFajQjZ2Szg==", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "http://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==", + "dev": true + }, + "is-type": { + "version": "0.0.1", + "resolved": "http://registry.npmjs.org/is-type/-/is-type-0.0.1.tgz", + "integrity": "sha512-YwJh/zBVrcJ90aAnPBM0CbHvm7lG9ao7lIFeqTZ1UQj4iFLpM5CikdaU+dGGesrMJwxLqPGmjjrUrQ6Kn3Zh+w==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, + "optional": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "http://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true + }, + "isarray": { + "version": "2.0.5", + "resolved": "http://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "isbinaryfile": { + "version": "2.0.4", + "resolved": "http://registry.npmjs.org/isbinaryfile/-/isbinaryfile-2.0.4.tgz", + "integrity": "sha512-QxRrK19LX0N3/ELC+rZ47s87ZzQ1kzegIgGsHqBHcNVT1Yt+TMslZukhIe1kSmcusIOm9Ad+Sxaxt8hxp0c21A==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "requires": { + "isarray": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + } + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "http://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true, + "optional": true + }, + "istextorbinary": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/istextorbinary/-/istextorbinary-2.1.0.tgz", + "integrity": "sha512-kT1g2zxZ5Tdabtpp9VSdOzW9lb6LXImyWbzbQeTxoRtHhurC9Ej9Wckngr2+uepPL09ky/mJHmN9jeJPML5t6A==", + "dev": true, + "requires": { + "binaryextensions": "1 || 2", + "editions": "^1.1.1", + "textextensions": "1 || 2" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "http://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "http://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "http://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + } + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "http://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true, + "optional": true + }, + "jsesc": { + "version": "0.5.0", + "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true + }, + "jshint": { + "version": "2.13.6", + "resolved": "http://registry.npmjs.org/jshint/-/jshint-2.13.6.tgz", + "integrity": "sha512-IVdB4G0NTTeQZrBoM8C5JFVLjV2KtZ9APgybDA1MK73xb09qFs0jCXyQLnCOp1cSZZZbvhq/6mfXHUTaDkffuQ==", + "dev": true, + "requires": { + "cli": "~1.0.0", + "console-browserify": "1.1.x", + "exit": "0.1.x", + "htmlparser2": "3.8.x", + "lodash": "~4.17.21", + "minimatch": "~3.0.2", + "strip-json-comments": "1.0.x" + }, + "dependencies": { + "minimatch": { + "version": "3.0.8", + "resolved": "http://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "json-schema": { + "version": "0.4.0", + "resolved": "http://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.0.tgz", + "integrity": "sha512-zfA+5SuwYN2VWqN1/5HZaDzQKLJHaBVMZIIM+wuYjdptkaQsqzDdqjqf+lZZJUuJq1aanHiY8LhH8LmH+qBYJA==", + "dev": true, + "requires": { + "call-bind": "^1.0.5", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "http://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "optional": true + }, + "json3": { + "version": "3.3.2", + "resolved": "http://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha512-I5YLeauH3rIaE99EE++UeH2M2gSYo8/2TqDac7oZEH6D/DSQ4Woa628Qrfj1X9/OY5Mk5VvIDQaKCDchXaKrmA==", + "dev": true + }, + "json5": { + "version": "0.4.0", + "resolved": "http://registry.npmjs.org/json5/-/json5-0.4.0.tgz", + "integrity": "sha512-5EEuuI7oad0d6c2PcrTRLoLH2JNuI/aJxHsVT2hVFK6fKHu+MXONdhzzzNAlb3JXMeuN1o+kDU78fV1YH6VmKQ==", + "dev": true + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.11", + "resolved": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "optional": true + } + } + }, + "jsonify": { + "version": "0.0.1", + "resolved": "http://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true + }, + "jsprim": { + "version": "1.4.2", + "resolved": "http://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "optional": true + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "http://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "klassy": { + "version": "0.1.3", + "resolved": "http://registry.npmjs.org/klassy/-/klassy-0.1.3.tgz", + "integrity": "sha512-MoqucIwV6vCQCphmP+DtRb0SYJKCdZcN8L7McrfC3I4lK2JgLmjop7eP1z1BRr+Y46oY+R8Vt+U8m5zYrqUXHA==", + "dev": true + }, + "klaw": { + "version": "1.3.1", + "resolved": "http://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.9" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.11", + "resolved": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "optional": true + } + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "http://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "dev": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, + "leek": { + "version": "0.0.18", + "resolved": "http://registry.npmjs.org/leek/-/leek-0.0.18.tgz", + "integrity": "sha512-AYHvffCfRTnCUUe93GTvLEHeg2ajEYmSZ71XkvVr55CHG4nOgQ439ai6WQ6Lz4fRE7dCImWQjzuQ7BZ7xa9/mw==", + "dev": true, + "requires": { + "debug": "^2.1.0", + "lodash-node": "^2.4.1", + "request": "^2.27.0", + "rsvp": "^3.0.6" + }, + "dependencies": { + "debug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.1.1.tgz", + "integrity": "sha1-4MVIzGB63CK1N1QNw2OcQjb9+Qw=", + "dev": true, + "requires": { + "ms": "0.6.2" + }, + "dependencies": { + "ms": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", + "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=", + "dev": true + } + } + }, + "lodash-node": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash-node/-/lodash-node-2.4.1.tgz", + "integrity": "sha1-6oL3sQDHM9GkKvdoAeUGEF4qgOw=", + "dev": true + }, + "request": { + "version": "2.53.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.53.0.tgz", + "integrity": "sha1-GAo66St7Y5gC5PlUXdj83rcddgw=", + "dev": true, + "requires": { + "aws-sign2": "~0.5.0", + "bl": "~0.9.0", + "caseless": "~0.9.0", + "combined-stream": "~0.0.5", + "forever-agent": "~0.5.0", + "form-data": "~0.2.0", + "hawk": "~2.3.0", + "http-signature": "~0.10.0", + "isstream": "~0.1.1", + "json-stringify-safe": "~5.0.0", + "mime-types": "~2.0.1", + "node-uuid": "~1.4.0", + "oauth-sign": "~0.6.0", + "qs": "~2.3.1", + "stringstream": "~0.0.4", + "tough-cookie": ">=0.12.0", + "tunnel-agent": "~0.4.0" + }, + "dependencies": { + "aws-sign2": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", + "integrity": "sha1-xXED96F/wDfwLXwuZLYC6iI/fWM=", + "dev": true + }, + "bl": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.4.tgz", + "integrity": "sha1-RwLd9y++Ds2CeHwAwROuoZNa0Oc=", + "dev": true, + "requires": { + "readable-stream": "~1.0.26" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.33", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", + "integrity": "sha1-OjYN1mwbHX/UcFOJhg7aHQ9hEmw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz", + "integrity": "sha1-awcIWu+aPMrG7lO/nT3wwVIaVTg=", + "dev": true + }, + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + } + } + }, + "caseless": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.9.0.tgz", + "integrity": "sha1-t7Zc5r8UE4hlOc/VM/CzDv+pz4g=", + "dev": true + }, + "combined-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", + "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", + "dev": true, + "requires": { + "delayed-stream": "0.0.5" + }, + "dependencies": { + "delayed-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=", + "dev": true + } + } + }, + "forever-agent": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", + "integrity": "sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA=", + "dev": true + }, + "form-data": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz", + "integrity": "sha1-Jvi8JtpkQOKZy9z7aQNcT3em5GY=", + "dev": true, + "requires": { + "async": "~0.9.0", + "combined-stream": "~0.0.4", + "mime-types": "~2.0.3" + }, + "dependencies": { + "async": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.0.tgz", + "integrity": "sha1-rDYTsdqb7RtHUQu0ZRuJMeRxRsc=", + "dev": true + } + } + }, + "hawk": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-2.3.1.tgz", + "integrity": "sha1-HnMc45RH+h0PbXB/e87r7A/R7B8=", + "dev": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + }, + "dependencies": { + "boom": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.6.1.tgz", + "integrity": "sha1-Tcjvm2362cQ7u/vnH6TCFBnyJ1M=", + "dev": true, + "requires": { + "hoek": "2.x.x" + } + }, + "cryptiles": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.4.tgz", + "integrity": "sha1-CeoXdbnhx95+YKmdQqtvCM4aEoU=", + "dev": true, + "requires": { + "boom": "2.x.x" + } + }, + "hoek": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.11.1.tgz", + "integrity": "sha1-ODmoty+Gqt4zEhAK+vgGSK8VWzg=", + "dev": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.x.x" + } + } + } + }, + "http-signature": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", + "integrity": "sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY=", + "dev": true, + "requires": { + "asn1": "0.1.11", + "assert-plus": "^0.1.5", + "ctype": "0.5.3" + }, + "dependencies": { + "asn1": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", + "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=", + "dev": true + }, + "assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=", + "dev": true + }, + "ctype": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", + "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=", + "dev": true + } + } + }, + "isstream": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.1.tgz", + "integrity": "sha1-SDMsWZmJOZa6JTyBx71ueuCQXE8=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.0.tgz", + "integrity": "sha1-TB8ii1BQg366nSH1DC5uMgYkVm4=", + "dev": true + }, + "mime-types": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.9.tgz", + "integrity": "sha1-6ESa/yexJF3cZkG1JEOa6AxLeKY=", + "dev": true, + "requires": { + "mime-db": "~1.7.0" + }, + "dependencies": { + "mime-db": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.7.0.tgz", + "integrity": "sha1-Ns9mpsUupxgnveKH93wlT17xuNM=", + "dev": true + } + } + }, + "node-uuid": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.2.tgz", + "integrity": "sha1-kH2z0Rt7aiz0+QX7cZnxSuc3m6A=", + "dev": true + }, + "oauth-sign": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.6.0.tgz", + "integrity": "sha1-fb6uRPbKRU4fFoRR1jB0ZzWBPOM=", + "dev": true + }, + "qs": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz", + "integrity": "sha1-6eha2+ddoLvkyOBHaghikPhjtAQ=", + "dev": true + }, + "stringstream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.4.tgz", + "integrity": "sha1-Dw40I/lClgtWkqwySlfdCTvEGpI=", + "dev": true + }, + "tough-cookie": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-0.12.1.tgz", + "integrity": "sha1-giDH4hq9WxPZaAQlS9WoHr8sfWI=", + "dev": true, + "requires": { + "punycode": ">=0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "tunnel-agent": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.0.tgz", + "integrity": "sha1-sRhOMS/7z3CztMeOjCGd5+uxxVA=", + "dev": true + } + } + }, + "rsvp": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.0.17.tgz", + "integrity": "sha1-0PeUnysir/YHdLc/S11inK4FeDY=", + "dev": true + } + } + }, + "less": { + "version": "2.7.3", + "resolved": "http://registry.npmjs.org/less/-/less-2.7.3.tgz", + "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==", + "dev": true, + "requires": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.2.11", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "2.81.0", + "source-map": "^0.5.3" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.11", + "resolved": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "optional": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "optional": true + } + } + }, + "leven": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/leven/-/leven-1.0.2.tgz", + "integrity": "sha512-U3eIzC2mMAOMOuoJ25sA3eyraoBwndpQyYgBq5dyqrMTpvMg9l9X/ucFHxv622YcCg179WWqleoF7rSzfYrV+Q==", + "dev": true + }, + "linkify-it": { + "version": "1.2.4", + "resolved": "http://registry.npmjs.org/linkify-it/-/linkify-it-1.2.4.tgz", + "integrity": "sha512-eGHwtlABkp1NOJSiKUNqBf3SYAS5jPHtvRXPAgNaQwTqmkTahjtiLH9NtxdR5IOPhNvwNMN/diswSfZKzUkhGg==", + "dev": true, + "requires": { + "uc.micro": "^1.0.1" + } + }, + "livereload-js": { + "version": "2.4.0", + "resolved": "http://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", + "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", + "dev": true + }, + "lodash": { + "version": "4.17.21", + "resolved": "http://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash-es": { + "version": "3.10.1", + "resolved": "http://registry.npmjs.org/lodash-es/-/lodash-es-3.10.1.tgz", + "integrity": "sha512-rBJfRKjK2GgYmj6pS243GNGtYEp8dpg+FBkEz06YVuNyujP4T20Dfu9LyoDSq6PGkNgEcUAToppLuH7GmAUnNw==", + "dev": true + }, + "lodash-node": { + "version": "2.4.1", + "resolved": "http://registry.npmjs.org/lodash-node/-/lodash-node-2.4.1.tgz", + "integrity": "sha512-egEt8eNQp2kZWRmngahiqMoDCDCENv3uM188S7Ed5t4k3v6RrLELXC+FqLNMUnhCo7gvQX3G1V8opK/Lcslahg==", + "dev": true + }, + "lodash._arraycopy": { + "version": "3.0.0", + "resolved": "http://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", + "integrity": "sha512-RHShTDnPKP7aWxlvXKiDT6IX2jCs6YZLCtNhOru/OX2Q/tzX295vVBK5oX1ECtN+2r86S0Ogy8ykP1sgCZAN0A==", + "dev": true + }, + "lodash._arrayeach": { + "version": "3.0.0", + "resolved": "http://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", + "integrity": "sha512-Mn7HidOVcl3mkQtbPsuKR0Fj0N6Q6DQB77CtYncZcJc0bx5qv2q4Gl6a0LC1AN+GSxpnBDNnK3CKEm9XNA4zqQ==", + "dev": true + }, + "lodash._basecallback": { + "version": "3.3.1", + "resolved": "http://registry.npmjs.org/lodash._basecallback/-/lodash._basecallback-3.3.1.tgz", + "integrity": "sha512-LQffghuO63ufDY33KKO1ezGKbcFZK3ngYV7JpxaUomoM5acf0YeXU3Pm8csVE0girVs50TXzfNibl69Co3ggJA==", + "dev": true, + "requires": { + "lodash._baseisequal": "^3.0.0", + "lodash._bindcallback": "^3.0.0", + "lodash.isarray": "^3.0.0", + "lodash.pairs": "^3.0.0" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==", + "dev": true + }, + "lodash._baseflatten": { + "version": "3.1.4", + "resolved": "http://registry.npmjs.org/lodash._baseflatten/-/lodash._baseflatten-3.1.4.tgz", + "integrity": "sha512-fESngZd+X4k+GbTxdMutf8ohQa0s3sJEHIcwtu4/LsIQ2JTDzdRxDCMQjW+ezzwRitLmHnacVVmosCbxifefbw==", + "dev": true, + "requires": { + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash._basefor": { + "version": "3.0.3", + "resolved": "http://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", + "integrity": "sha512-6bc3b8grkpMgDcVJv9JYZAk/mHgcqMljzm7OsbmcE2FGUMmmLQTPHlh/dFqR8LA0GQ7z4K67JSotVKu5058v1A==", + "dev": true + }, + "lodash._baseindexof": { + "version": "3.1.0", + "resolved": "http://registry.npmjs.org/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz", + "integrity": "sha512-bSYo8Pc/f0qAkr8fPJydpJjtrHiSynYfYBjtANIgXv5xEf1WlTC63dIDlgu0s9dmTvzRu1+JJTxcIAHe+sH0FQ==", + "dev": true + }, + "lodash._baseisequal": { + "version": "3.0.7", + "resolved": "http://registry.npmjs.org/lodash._baseisequal/-/lodash._baseisequal-3.0.7.tgz", + "integrity": "sha512-U+3GsNEZj9ebI03ncLC2pLmYVjgtYZEwdkAPO7UGgtGvAz36JVFPAQUufpSaVL93Cz5arc6JGRKZRhaOhyVJYA==", + "dev": true, + "requires": { + "lodash.isarray": "^3.0.0", + "lodash.istypedarray": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "lodash._baseuniq": { + "version": "3.0.3", + "resolved": "http://registry.npmjs.org/lodash._baseuniq/-/lodash._baseuniq-3.0.3.tgz", + "integrity": "sha512-80ifiewpXTvE5gJ4+dnck+3ys4ix3+ch3N0/1ZvujIfbwIu0SnNIlJE4VsOS2bVjAcxm1JE8LLskpnQBgOR0bQ==", + "dev": true, + "requires": { + "lodash._baseindexof": "^3.0.0", + "lodash._cacheindexof": "^3.0.0", + "lodash._createcache": "^3.0.0" + } + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha512-2wlI0JRAGX8WEf4Gm1p/mv/SZ+jLijpj0jyaE/AXeuQphzCgD8ZQW4oSpoN8JAopujOFGU3KMuq7qfHBWlGpjQ==", + "dev": true + }, + "lodash._cacheindexof": { + "version": "3.0.2", + "resolved": "http://registry.npmjs.org/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz", + "integrity": "sha512-S8dUjWr7SUT/X6TBIQ/OYoCHo1Stu1ZRy6uMUSKqzFnZp5G5RyQizSm6kvxD2Ewyy6AVfMg4AToeZzKfF99T5w==", + "dev": true + }, + "lodash._createassigner": { + "version": "3.1.1", + "resolved": "http://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", + "integrity": "sha512-LziVL7IDnJjQeeV95Wvhw6G28Z8Q6da87LWKOPWmzBLv4u6FAT/x5v00pyGW0u38UoogNF2JnD3bGgZZDaNEBw==", + "dev": true, + "requires": { + "lodash._bindcallback": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash.restparam": "^3.0.0" + } + }, + "lodash._createcache": { + "version": "3.1.2", + "resolved": "http://registry.npmjs.org/lodash._createcache/-/lodash._createcache-3.1.2.tgz", + "integrity": "sha512-ev5SP+iFpZOugyab/DEUQxUeZP5qyciVTlgQ1f4Vlw7VUcCD8fVnyIqVUEIaoFH9zjAqdgi69KiofzvVmda/ZQ==", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0" + } + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "http://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "http://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "http://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", + "dev": true + }, + "lodash.assignin": { + "version": "4.2.0", + "resolved": "http://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha512-yX/rx6d/UTVh7sSVWVSIMjfnz95evAgDFdb1ZozC35I9mSFCkmzptOzevxjgbQUsc78NR44LVHWjsoMQXy9FDg==", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "http://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true + }, + "lodash.debounce": { + "version": "3.1.1", + "resolved": "http://registry.npmjs.org/lodash.debounce/-/lodash.debounce-3.1.1.tgz", + "integrity": "sha512-lcmJwMpdPAtChA4hfiwxTtgFeNAaow701wWUgVUqeD0XJF7vMXIN+bu/2FJSGxT0NUbZy9g9VFrlOFfPjl+0Ew==", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0" + } + }, + "lodash.find": { + "version": "4.6.0", + "resolved": "http://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz", + "integrity": "sha512-yaRZoAV3Xq28F1iafWN1+a0rflOej93l1DQUejs3SZ41h2O9UJBoS9aueGjPDgAl4B6tPC0NuuchLKaDQQ3Isg==", + "dev": true + }, + "lodash.flatten": { + "version": "3.0.2", + "resolved": "http://registry.npmjs.org/lodash.flatten/-/lodash.flatten-3.0.2.tgz", + "integrity": "sha512-jCXLoNcqQRbnT/KWZq2fIREHWeczrzpTR0vsycm96l/pu5hGeAntVBG0t7GuM/2wFqmnZs3d1eGptnAH2E8+xQ==", + "dev": true, + "requires": { + "lodash._baseflatten": "^3.0.0", + "lodash._isiterateecall": "^3.0.0" + } + }, + "lodash.foreach": { + "version": "4.5.0", + "resolved": "http://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==", + "dev": true + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "http://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "http://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", + "dev": true + }, + "lodash.isplainobject": { + "version": "3.2.0", + "resolved": "http://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-3.2.0.tgz", + "integrity": "sha512-P4wZnho5curNqeEq/x292Pb57e1v+woR7DJ84DURelKB46lby8aDEGVobSaYtzHdQBWQrJSdxcCwjlGOvvdIyg==", + "dev": true, + "requires": { + "lodash._basefor": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.keysin": "^3.0.0" + } + }, + "lodash.istypedarray": { + "version": "3.0.6", + "resolved": "http://registry.npmjs.org/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz", + "integrity": "sha512-lGWJ6N8AA3KSv+ZZxlTdn4f6A7kMfpJboeyvbFdE7IU9YAgweODqmOgdUHOA+c6lVWeVLysdaxciFXi+foVsWw==", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "http://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", + "dev": true, + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.keysin": { + "version": "3.0.8", + "resolved": "http://registry.npmjs.org/lodash.keysin/-/lodash.keysin-3.0.8.tgz", + "integrity": "sha512-YDB/5xkL3fBKFMDaC+cfGV00pbiJ6XoJIfRmBhv7aR6wWtbCW6IzkiWnTfkiHTF6ALD7ff83dAtB3OEaSoyQPg==", + "dev": true, + "requires": { + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.merge": { + "version": "3.3.2", + "resolved": "http://registry.npmjs.org/lodash.merge/-/lodash.merge-3.3.2.tgz", + "integrity": "sha512-ZgGZpRhWLjivGUbjtApZR4HyLv/UAyoYqESVYkK4aLBJVHRrbFpG+GNnE9JPijliME4LkKM0SFI/WyOiBiv1+w==", + "dev": true, + "requires": { + "lodash._arraycopy": "^3.0.0", + "lodash._arrayeach": "^3.0.0", + "lodash._createassigner": "^3.0.0", + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0", + "lodash.isplainobject": "^3.0.0", + "lodash.istypedarray": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.keysin": "^3.0.0", + "lodash.toplainobject": "^3.0.0" + } + }, + "lodash.omit": { + "version": "4.5.0", + "resolved": "http://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", + "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==", + "dev": true + }, + "lodash.pairs": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/lodash.pairs/-/lodash.pairs-3.0.1.tgz", + "integrity": "sha512-lgXvpU43ZNQrZ/pK2cR97YzKeAno3e3HhcyvLKsofljeHKrQcZhT1vW7fg4X61c92tM+mjD/DypoLZYuAKNIkQ==", + "dev": true, + "requires": { + "lodash.keys": "^3.0.0" + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "http://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==", + "dev": true + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "http://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "http://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lodash.toplainobject": { + "version": "3.0.0", + "resolved": "http://registry.npmjs.org/lodash.toplainobject/-/lodash.toplainobject-3.0.0.tgz", + "integrity": "sha512-wMI0Ju1bvSmnBS3EcRRH/3zDnZOPpDtMtNDzbbNMKuTrEpALsf+sPyMeogmv63Y11qZQO7H1xFzohIEGRMjPYA==", + "dev": true, + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash.keysin": "^3.0.0" + } + }, + "lodash.uniq": { + "version": "3.2.2", + "resolved": "http://registry.npmjs.org/lodash.uniq/-/lodash.uniq-3.2.2.tgz", + "integrity": "sha512-dzf9fjjemkxorQt036mKJYhokw8vDfaE1KRO+TB0PKN9esxYHSh/W/XMa1BY3xpyPKuwWycRE9RYbqHvS683gA==", + "dev": true, + "requires": { + "lodash._basecallback": "^3.0.0", + "lodash._baseuniq": "^3.0.0", + "lodash._getnative": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.uniqby": { + "version": "4.7.0", + "resolved": "http://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "http://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "http://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "lru-queue": { + "version": "0.1.0", + "resolved": "http://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", + "dev": true, + "requires": { + "es5-ext": "~0.10.2" + } + }, + "make-array": { + "version": "0.1.2", + "resolved": "http://registry.npmjs.org/make-array/-/make-array-0.1.2.tgz", + "integrity": "sha512-bcFmxgZ+OTaMYJp/w6eifElKTcfum7Gi5H7vQ8KzAf9X6swdxkVuilCaG3ZjXr/qJsQT4JJ2Rq9SDYScWEdu9Q==", + "dev": true + }, + "makeerror": { + "version": "1.0.12", + "resolved": "http://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, + "markdown-it": { + "version": "4.3.0", + "resolved": "http://registry.npmjs.org/markdown-it/-/markdown-it-4.3.0.tgz", + "integrity": "sha512-dDjVr+6fOqLL65b9TonRZ1k+eGLiqo/7Iped7Mf/8BJg+jRhneONxNMpitab5HZlffpeu1ujqAh1u8UCLy+bZw==", + "dev": true, + "requires": { + "argparse": "~1.0.2", + "entities": "~1.1.1", + "linkify-it": "~1.2.0", + "mdurl": "~1.0.0", + "uc.micro": "^1.0.0" + } + }, + "markdown-it-terminal": { + "version": "0.0.2", + "resolved": "http://registry.npmjs.org/markdown-it-terminal/-/markdown-it-terminal-0.0.2.tgz", + "integrity": "sha512-NomiNVIemjhmG6Wpeuw8rRVz+2rIq+dVgsWe2YC/THWCfGXsvvXoVxIuQ659mLU0Htz+1LddzYk27pPled0hdg==", + "dev": true, + "requires": { + "ansi-styles": "^2.0.1", + "cardinal": "^0.5.0", + "cli-table": "^0.3.1", + "lodash-node": "^3.4.0", + "markdown-it": "^4.0.0" + }, + "dependencies": { + "lodash-node": { + "version": "3.10.2", + "resolved": "http://registry.npmjs.org/lodash-node/-/lodash-node-3.10.2.tgz", + "integrity": "sha512-2voC/VK0CVYUYOpA91EsHiTuPbJUbuaLlykWHK3skyCba+Ps6e+LqjY06UEhan6y7jB2Oz1oaFFifJrg18vO1w==", + "dev": true + } + } + }, + "matcher-collection": { + "version": "1.1.2", + "resolved": "http://registry.npmjs.org/matcher-collection/-/matcher-collection-1.1.2.tgz", + "integrity": "sha512-YQ/teqaOIIfUHedRam08PB3NK7Mjct6BvzRnJmpGDm8uFXpNr1sbY4yuflI5JcEs6COpYA0FpRQhSDBf1tT95g==", + "dev": true, + "requires": { + "minimatch": "^3.0.2" + } + }, + "math-random": { + "version": "1.0.4", + "resolved": "http://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, + "mdurl": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true + }, + "memoizee": { + "version": "0.3.10", + "resolved": "http://registry.npmjs.org/memoizee/-/memoizee-0.3.10.tgz", + "integrity": "sha512-LLzVUuWwGBKK188spgOK/ukrp5zvd9JGsiLDH41pH9vt5jvhZfsu5pxDuAnYAMG8YEGce72KO07sSBy9KkvOfw==", + "dev": true, + "requires": { + "d": "~0.1.1", + "es5-ext": "~0.10.11", + "es6-weak-map": "~0.1.4", + "event-emitter": "~0.3.4", + "lru-queue": "0.1", + "next-tick": "~0.2.2", + "timers-ext": "0.1" + }, + "dependencies": { + "next-tick": { + "version": "0.2.2", + "resolved": "http://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz", + "integrity": "sha512-f7h4svPtl+QidoBv4taKXUjJ70G2asaZ8G28nS0OkqaalX8dwwrtWtyxEDPK62AC00ur/+/E0pUwBwY5EPn15Q==", + "dev": true + } + } + }, + "memory-streams": { + "version": "0.1.3", + "resolved": "http://registry.npmjs.org/memory-streams/-/memory-streams-0.1.3.tgz", + "integrity": "sha512-qVQ/CjkMyMInPaaRMrwWNDvf6boRZXaT/DbQeMYcCWuXPEBf1v8qChOc9OlEVQp2uOvRXa1Qu30fLmKhY6NipA==", + "dev": true, + "requires": { + "readable-stream": "~1.0.2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "http://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + } + } + }, + "merge": { + "version": "1.2.1", + "resolved": "http://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", + "dev": true + }, + "merge-defaults": { + "version": "0.2.2", + "resolved": "http://registry.npmjs.org/merge-defaults/-/merge-defaults-0.2.2.tgz", + "integrity": "sha512-rKkxPFgGDZfmen0IN8BKRsGEbFU3PdO0RhR1GjOk+BLJF7+LAIhs5bUG3s26FkbB5bfIn9il25KkntRGdqHQ3A==", + "dev": true, + "requires": { + "@sailshq/lodash": "^3.10.2" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "merge-trees": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/merge-trees/-/merge-trees-1.0.1.tgz", + "integrity": "sha512-O7TWwipLHhc9tErjq3WBvNP7I1g7Wgudl1ZkLqpT7F2MZy1yEdgnI9cpZZxBaqk+wJZu+2b9FE7D3ubUmGFHFA==", + "dev": true, + "requires": { + "can-symlink": "^1.0.0", + "fs-tree-diff": "^0.5.4", + "heimdalljs": "^0.2.1", + "heimdalljs-logger": "^0.1.7", + "rimraf": "^2.4.3", + "symlink-or-copy": "^1.0.0" + } + }, + "methods": { + "version": "1.1.2", + "resolved": "http://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "http://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "http://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "http://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "http://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "http://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "mktemp": { + "version": "0.4.0", + "resolved": "http://registry.npmjs.org/mktemp/-/mktemp-0.4.0.tgz", + "integrity": "sha512-IXnMcJ6ZyTuhRmJSjzvHSRhlVPiN9Jwc6e59V0bEJ0ba6OBeX2L0E+mRN1QseeOF4mM+F1Rit6Nh7o+rl2Yn/A==", + "dev": true + }, + "moment": { + "version": "2.30.0", + "resolved": "http://registry.npmjs.org/moment/-/moment-2.30.0.tgz", + "integrity": "sha512-8XSlYFhOSJvnEJOas6RpDCNU2PYeVC+oE33d3Z9tIsXpD8LIgBeqrHPjP8es4b3fcJpf07D1PJWGDUfdbqDLnQ==", + "dev": true + }, + "moment-timezone": { + "version": "0.3.1", + "resolved": "http://registry.npmjs.org/moment-timezone/-/moment-timezone-0.3.1.tgz", + "integrity": "sha512-glTWIu3fKgZIMS9KwaPYvyf7M6jazusAGvWEOqfL09nXDtYTO75BEXqseQhwNAcQvifQlQ9Q7tWpMnDu+TxT+w==", + "dev": true, + "requires": { + "moment": ">= 2.6.0" + } + }, + "morgan": { + "version": "1.10.0", + "resolved": "http://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dev": true, + "requires": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + } + }, + "mout": { + "version": "0.9.1", + "resolved": "http://registry.npmjs.org/mout/-/mout-0.9.1.tgz", + "integrity": "sha512-mZMABHAQPQ87JDQuxZIndS6XXDYZfeAfcTvHYyEFG4SEUiGNkInNZi/WhesQjCKUWih1bDDkqHw63wyCaczhsw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "mustache": { + "version": "2.3.2", + "resolved": "http://registry.npmjs.org/mustache/-/mustache-2.3.2.tgz", + "integrity": "sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ==", + "dev": true + }, + "mute-stream": { + "version": "0.0.4", + "resolved": "http://registry.npmjs.org/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-amvrY4m/7oZamehMoFi1tbwU/kXbVvRTGM2S7F+PZi3n51Jx+9AcSQ3EQsag3tR+hS2higfgOP/Kl8kri/X52A==", + "dev": true + }, + "natives": { + "version": "1.1.6", + "resolved": "http://registry.npmjs.org/natives/-/natives-1.1.6.tgz", + "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==", + "dev": true + }, + "negotiator": { + "version": "0.6.3", + "resolved": "http://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, + "next-tick": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "http://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node-modules-path": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/node-modules-path/-/node-modules-path-1.0.2.tgz", + "integrity": "sha512-6Gbjq+d7uhkO7epaKi5DNgUJn7H0gEyA4Jg0Mo1uQOi3Rk50G83LtmhhFyw0LxnAFhtlspkiiw52ISP13qzcBg==", + "dev": true + }, + "node-notifier": { + "version": "5.4.5", + "resolved": "http://registry.npmjs.org/node-notifier/-/node-notifier-5.4.5.tgz", + "integrity": "sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.2", + "resolved": "http://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + } + } + }, + "node-uuid": { + "version": "1.4.8", + "resolved": "http://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha512-TkCET/3rr9mUuRp+CpO7qfgT++aAxfDRaalQhwPFzI9BY/2rCDn6OfpZOVggi1AXfTPpfkTrg5f5WQx5G1uLxA==", + "dev": true + }, + "nopt": { + "version": "3.0.6", + "resolved": "http://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "http://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "npm": { + "version": "2.14.10", + "resolved": "http://registry.npmjs.org/npm/-/npm-2.14.10.tgz", + "integrity": "sha512-zrAqMRmpn+cMWj5Su+Cbo/Cw+E+ou3HNeizCnp7CHqMhLxG6udyOOdvLqouF9M3lknU4LWFEYtGhySxsCn1S4w==", + "dev": true, + "requires": { + "abbrev": "~1.0.7", + "ansi": "~0.3.0", + "ansi-regex": "*", + "ansicolors": "~0.3.2", + "ansistyles": "~0.1.3", + "archy": "~1.0.0", + "async-some": "~1.0.2", + "block-stream": "0.0.8", + "char-spinner": "~1.0.1", + "chmodr": "~1.0.2", + "chownr": "~1.0.1", + "cmd-shim": "~2.0.1", + "columnify": "~1.5.2", + "config-chain": "~1.1.9", + "dezalgo": "~1.0.3", + "editor": "~1.0.0", + "fs-vacuum": "~1.2.7", + "fs-write-stream-atomic": "~1.0.4", + "fstream": "~1.0.8", + "fstream-npm": "~1.0.7", + "github-url-from-git": "~1.4.0", + "github-url-from-username-repo": "~1.0.2", + "glob": "~5.0.15", + "graceful-fs": "~4.1.2", + "hosted-git-info": "~2.1.4", + "inflight": "~1.0.4", + "inherits": "~2.0.1", + "ini": "~1.3.4", + "init-package-json": "~1.9.1", + "lockfile": "~1.0.1", + "lru-cache": "~2.7.0", + "minimatch": "~3.0.0", + "mkdirp": "~0.5.1", + "node-gyp": "~3.0.3", + "nopt": "~3.0.4", + "normalize-git-url": "~3.0.1", + "normalize-package-data": "~2.3.5", + "npm-cache-filename": "~1.0.2", + "npm-install-checks": "~1.0.6", + "npm-package-arg": "~4.0.2", + "npm-registry-client": "~7.0.7", + "npm-user-validate": "~0.1.2", + "npmlog": "~2.0.0", + "once": "~1.3.2", + "opener": "~1.4.1", + "osenv": "~0.1.3", + "path-is-inside": "~1.0.0", + "read": "~1.0.7", + "read-installed": "~4.0.3", + "read-package-json": "~2.0.2", + "readable-stream": "~1.1.13", + "realize-package-specifier": "~3.0.1", + "request": "~2.65.0", + "retry": "~0.8.0", + "rimraf": "~2.4.3", + "semver": "~5.0.3", + "sha": "~2.0.1", + "slide": "~1.1.6", + "sorted-object": "~1.0.0", + "spdx": "~0.4.1", + "spdx-license-ids": "*", + "strip-ansi": "*", + "tar": "~2.2.1", + "text-table": "~0.2.0", + "uid-number": "0.0.6", + "umask": "~1.1.0", + "validate-npm-package-license": "~3.0.1", + "validate-npm-package-name": "~2.2.2", + "which": "~1.2.0", + "wrappy": "~1.0.1", + "write-file-atomic": "~1.1.3" + }, + "dependencies": { + "abbrev": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz", + "integrity": "sha1-W2A1su6dT7XPhZ8Iqb6BsghJGEM=", + "dev": true + }, + "ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.0.tgz", + "integrity": "sha1-dLLx8YfIVTx/lQFby3YAn7Q9OOA=", + "dev": true + }, + "ansi-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", + "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", + "dev": true + }, + "ansicolors": { + "version": "0.3.2", + "dev": true + }, + "ansistyles": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ansistyles/-/ansistyles-0.1.3.tgz", + "dev": true + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "async-some": { + "version": "1.0.2", + "integrity": "sha1-TYqBYg1ZWHkbW5j4AtMgd3bpVQk=", + "dev": true, + "requires": { + "dezalgo": "^1.0.2" + } + }, + "block-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.8.tgz", + "integrity": "sha1-Boj0baK7+c/wxPaCJaDLlcvopGs=", + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "char-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/char-spinner/-/char-spinner-1.0.1.tgz", + "integrity": "sha1-5upnvSR+EHESmDt6sEee02KAAIE=", + "dev": true + }, + "chmodr": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chmodr/-/chmodr-1.0.2.tgz", + "integrity": "sha1-BGYrky0PAuxm3qorDqQoEZaOPrk=", + "dev": true + }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "dev": true + }, + "cmd-shim": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-2.0.1.tgz", + "integrity": "sha1-RRKjc9I5FnmuxRrR1HM1Wem4XUo=", + "dev": true, + "requires": { + "graceful-fs": ">3.0.1 <4.0.0-0", + "mkdirp": "~0.5.0" + }, + "dependencies": { + "graceful-fs": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.8.tgz", + "integrity": "sha1-zoE+cl+oL35hR9UcmlymgnBVHCI=", + "dev": true + } + } + }, + "columnify": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.2.tgz", + "integrity": "sha1-aTeTDUfCKpv6IHMqf9YZ1H6rplo=", + "dev": true, + "requires": { + "strip-ansi": "^3.0.0", + "wcwidth": "^1.0.0" + }, + "dependencies": { + "wcwidth": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.0.tgz", + "integrity": "sha1-AtBZ/3qPx0Hg9rXaHmmytA2uym8=", + "dev": true, + "requires": { + "defaults": "^1.0.0" + }, + "dependencies": { + "defaults": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.2.tgz", + "integrity": "sha1-aQLiWqBHZJpQHhnvnpjz6DZcEJo=", + "dev": true, + "requires": { + "clone": "~0.1.5" + }, + "dependencies": { + "clone": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz", + "integrity": "sha1-YT+2hjmyaklKxTJT4Vsaa9iK2oU=", + "dev": true + } + } + } + } + } + } + }, + "config-chain": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.9.tgz", + "integrity": "sha1-Oax9TcqE+q2SYSTFTP8lpTqov24=", + "dev": true, + "requires": { + "ini": "1", + "proto-list": "~1.2.1" + }, + "dependencies": { + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "dev": true + } + } + }, + "dezalgo": { + "version": "1.0.3", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + }, + "dependencies": { + "asap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.3.tgz", + "integrity": "sha1-H8HRVk7hFiDfym1nAphQkT+fRnk=", + "dev": true + } + } + }, + "editor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/editor/-/editor-1.0.0.tgz", + "integrity": "sha1-YMf4e9YrzGqJT6jM1q+3gjok90I=", + "dev": true + }, + "fs-vacuum": { + "version": "1.2.7", + "integrity": "sha1-deUB+dKIm6L+n+Evk2ul2tUMo1o=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "path-is-inside": "^1.0.1", + "rimraf": "^2.2.8" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.4", + "integrity": "sha1-wepViJ8DbO696tfRBV7brZmP5ek=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2" + } + }, + "fstream": { + "version": "1.0.8", + "integrity": "sha1-fo16c6uzZH7zbkuKFcqAHboD0Dg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "fstream-npm": { + "version": "1.0.7", + "integrity": "sha1-ftDRrBPXaG3Z4b9s64vic79tL4Y=", + "dev": true, + "requires": { + "fstream-ignore": "^1.0.0", + "inherits": "2" + }, + "dependencies": { + "fstream-ignore": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.3.tgz", + "integrity": "sha1-THTZH6iLIrQvT4ahiigg3XnY/N0=", + "dev": true, + "requires": { + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" + } + } + } + }, + "github-url-from-git": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/github-url-from-git/-/github-url-from-git-1.4.0.tgz", + "integrity": "sha1-KF5rUggZABveEoZ0cEN55P8D4N4=", + "dev": true + }, + "github-url-from-username-repo": { + "version": "1.0.2", + "integrity": "sha1-fdeTMNKr5pwQws73lxTJchV5Hfo=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "path-is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", + "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.1.2", + "integrity": "sha1-zoE+cl+oL35hR9UcmlymgnBVHCI=", + "dev": true + }, + "hosted-git-info": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.1.4.tgz", + "integrity": "sha1-2elTsmmIvogJbEbpJklNlgTDAPg=", + "dev": true + }, + "inflight": { + "version": "1.0.4", + "integrity": "sha1-bLtFIevVHODsCpNr/XZX736bFyo=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "dev": true + }, + "init-package-json": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.9.1.tgz", + "integrity": "sha1-oo4FtbrrM2PNRz32jTDTqAUjoxw=", + "dev": true, + "requires": { + "glob": "^5.0.3", + "npm-package-arg": "^4.0.0", + "promzard": "^0.3.0", + "read": "~1.0.1", + "read-package-json": "1 || 2", + "semver": "2.x || 3.x || 4 || 5", + "validate-npm-package-license": "^3.0.1", + "validate-npm-package-name": "^2.0.1" + }, + "dependencies": { + "promzard": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", + "integrity": "sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=", + "dev": true, + "requires": { + "read": "1" + } + } + } + }, + "lockfile": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.1.tgz", + "integrity": "sha1-nTU+z+P1TRULtX+J1RdGk1o5xPU=", + "dev": true + }, + "lru-cache": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.0.tgz", + "integrity": "sha1-qqN2pM2XD5zr9ewZCVZuwDTwfuY=", + "dev": true + }, + "minimatch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "integrity": "sha1-UjYVelHk8ATBd/s8Un/33Xjw74M=", + "dev": true, + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.1.tgz", + "integrity": "sha1-2l+3iu9MRMnkrPUlBk+zII66sEU=", + "dev": true, + "requires": { + "balanced-match": "^0.2.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.1.tgz", + "integrity": "sha1-e8ZYtL7WHu5CStdPdfXD4sTfPMc=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + } + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "node-gyp": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.0.3.tgz", + "integrity": "sha1-mwBCGfT6nvv9eMX8Z0qhLlj7hpQ=", + "dev": true, + "requires": { + "fstream": "^1.0.0", + "glob": "3 || 4", + "graceful-fs": "^4.1.2", + "minimatch": "1", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1", + "osenv": "0", + "path-array": "^1.0.0", + "request": "2", + "rimraf": "2", + "semver": "2.x || 3.x || 4 || 5", + "tar": "^1.0.0", + "which": "1" + }, + "dependencies": { + "glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/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" + }, + "dependencies": { + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.1.tgz", + "integrity": "sha1-2l+3iu9MRMnkrPUlBk+zII66sEU=", + "dev": true, + "requires": { + "balanced-match": "^0.2.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.1.tgz", + "integrity": "sha1-e8ZYtL7WHu5CStdPdfXD4sTfPMc=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + } + } + } + } + } + } + }, + "minimatch": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-1.0.0.tgz", + "integrity": "sha1-4N0hILSeG3JM6NcUxSCCKpQ4V20=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + }, + "dependencies": { + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + } + } + }, + "npmlog": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz", + "integrity": "sha1-KOe+YZYJtT960d0wChDWTXFiaLY=", + "dev": true, + "requires": { + "ansi": "~0.3.0", + "are-we-there-yet": "~1.0.0", + "gauge": "~1.2.0" + }, + "dependencies": { + "are-we-there-yet": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.4.tgz", + "integrity": "sha1-Un/jife8upCAYQa5kkTqoH6Ib4U=", + "dev": true, + "requires": { + "delegates": "^0.1.0", + "readable-stream": "^1.1.13" + }, + "dependencies": { + "delegates": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-0.1.0.tgz", + "integrity": "sha1-tLV74RoWU1F6BLJ/CUm9wyff45A=", + "dev": true + } + } + }, + "gauge": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.2.tgz", + "integrity": "sha1-BbZzChmo/K08NAoULwlFIio/gVs=", + "dev": true, + "requires": { + "ansi": "^0.3.0", + "has-unicode": "^1.0.0", + "lodash.pad": "^3.0.0", + "lodash.padleft": "^3.0.0", + "lodash.padright": "^3.0.0" + }, + "dependencies": { + "has-unicode": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-1.0.1.tgz", + "integrity": "sha1-xG/O6gU+uOx4m/+7ol/KUt/c844=", + "dev": true + }, + "lodash.pad": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-3.1.1.tgz", + "integrity": "sha1-LgeOvDOzMdK6NL+HMq8Sn9XARiQ=", + "dev": true, + "requires": { + "lodash._basetostring": "^3.0.0", + "lodash._createpadding": "^3.0.0" + }, + "dependencies": { + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._createpadding": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash._createpadding/-/lodash._createpadding-3.6.1.tgz", + "integrity": "sha1-SQe0OFla3FTuiTVSemxCTALIGoc=", + "dev": true, + "requires": { + "lodash.repeat": "^3.0.0" + }, + "dependencies": { + "lodash.repeat": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-3.0.1.tgz", + "integrity": "sha1-9LmNx+9nJWzmHnh04YZe2yCODt8=", + "dev": true, + "requires": { + "lodash._basetostring": "^3.0.0" + } + } + } + } + } + }, + "lodash.padleft": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.padleft/-/lodash.padleft-3.1.1.tgz", + "integrity": "sha1-FQFR8eAkXtuhXVCvLXHx1c/0ZTA=", + "dev": true, + "requires": { + "lodash._basetostring": "^3.0.0", + "lodash._createpadding": "^3.0.0" + }, + "dependencies": { + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._createpadding": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash._createpadding/-/lodash._createpadding-3.6.1.tgz", + "integrity": "sha1-SQe0OFla3FTuiTVSemxCTALIGoc=", + "dev": true, + "requires": { + "lodash.repeat": "^3.0.0" + }, + "dependencies": { + "lodash.repeat": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-3.0.1.tgz", + "integrity": "sha1-9LmNx+9nJWzmHnh04YZe2yCODt8=", + "dev": true, + "requires": { + "lodash._basetostring": "^3.0.0" + } + } + } + } + } + }, + "lodash.padright": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.padright/-/lodash.padright-3.1.1.tgz", + "integrity": "sha1-efd3C6qjlzjAQK61Rl6NiPKqzsA=", + "dev": true, + "requires": { + "lodash._basetostring": "^3.0.0", + "lodash._createpadding": "^3.0.0" + }, + "dependencies": { + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._createpadding": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash._createpadding/-/lodash._createpadding-3.6.1.tgz", + "integrity": "sha1-SQe0OFla3FTuiTVSemxCTALIGoc=", + "dev": true, + "requires": { + "lodash.repeat": "^3.0.0" + }, + "dependencies": { + "lodash.repeat": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-3.0.1.tgz", + "integrity": "sha1-9LmNx+9nJWzmHnh04YZe2yCODt8=", + "dev": true, + "requires": { + "lodash._basetostring": "^3.0.0" + } + } + } + } + } + } + } + } + } + }, + "path-array": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-array/-/path-array-1.0.0.tgz", + "integrity": "sha1-bBQTDDMITwFQVTxlezg5erZ6qk4=", + "dev": true, + "requires": { + "array-index": "~0.1.0" + }, + "dependencies": { + "array-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/array-index/-/array-index-0.1.1.tgz", + "integrity": "sha1-TV6vBsw9klhHzXPRU1whe6MG0+E=", + "dev": true, + "requires": { + "debug": "*" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + }, + "dependencies": { + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + } + } + } + } + }, + "tar": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-1.0.3.tgz", + "integrity": "sha1-FbzaskT6St1E5CRKAXbtuKqaK0Q=", + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + } + } + }, + "nopt": { + "version": "3.0.4", + "integrity": "sha1-3WO8nHKm5Ohbhc3AyjFFmPrO3l4=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-git-url": { + "version": "3.0.1", + "integrity": "sha1-1A1BnQWhWHAnHlBTTbt7jM2bClw=", + "dev": true + }, + "normalize-package-data": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.5.tgz", + "integrity": "sha1-jZJPFClg4Xd+f/4XBUNjHMfLAt8=", + "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" + }, + "dependencies": { + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "^1.0.0" + }, + "dependencies": { + "builtin-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.0.tgz", + "integrity": "sha1-EFOVX9mUpXRuUl5Kxxe4HK8HSRw=", + "dev": true + } + } + } + } + }, + "npm-cache-filename": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz", + "integrity": "sha1-3tMGxbC/yHCp6fr4I7xfKD4FrhE=", + "dev": true + }, + "npm-install-checks": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-1.0.6.tgz", + "integrity": "sha1-jUwehSgG5OLWZgGreHvlhBVQ0Ms=", + "dev": true, + "requires": { + "npmlog": "0.1 || 1", + "semver": "^2.3.0 || 3.x || 4 || 5" + }, + "dependencies": { + "npmlog": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz", + "integrity": "sha1-KOe+YZYJtT960d0wChDWTXFiaLY=", + "dev": true, + "requires": { + "ansi": "~0.3.0", + "are-we-there-yet": "~1.0.0", + "gauge": "~1.2.0" + }, + "dependencies": { + "are-we-there-yet": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.4.tgz", + "integrity": "sha1-Un/jife8upCAYQa5kkTqoH6Ib4U=", + "dev": true, + "requires": { + "delegates": "^0.1.0", + "readable-stream": "^1.1.13" + }, + "dependencies": { + "delegates": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-0.1.0.tgz", + "integrity": "sha1-tLV74RoWU1F6BLJ/CUm9wyff45A=", + "dev": true + } + } + }, + "gauge": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.2.tgz", + "integrity": "sha1-BbZzChmo/K08NAoULwlFIio/gVs=", + "dev": true, + "requires": { + "ansi": "^0.3.0", + "has-unicode": "^1.0.0", + "lodash.pad": "^3.0.0", + "lodash.padleft": "^3.0.0", + "lodash.padright": "^3.0.0" + }, + "dependencies": { + "has-unicode": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-1.0.1.tgz", + "integrity": "sha1-xG/O6gU+uOx4m/+7ol/KUt/c844=", + "dev": true + }, + "lodash.pad": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-3.1.1.tgz", + "integrity": "sha1-LgeOvDOzMdK6NL+HMq8Sn9XARiQ=", + "dev": true, + "requires": { + "lodash._basetostring": "^3.0.0", + "lodash._createpadding": "^3.0.0" + }, + "dependencies": { + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._createpadding": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash._createpadding/-/lodash._createpadding-3.6.1.tgz", + "integrity": "sha1-SQe0OFla3FTuiTVSemxCTALIGoc=", + "dev": true, + "requires": { + "lodash.repeat": "^3.0.0" + }, + "dependencies": { + "lodash.repeat": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-3.0.1.tgz", + "integrity": "sha1-9LmNx+9nJWzmHnh04YZe2yCODt8=", + "dev": true, + "requires": { + "lodash._basetostring": "^3.0.0" + } + } + } + } + } + }, + "lodash.padleft": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.padleft/-/lodash.padleft-3.1.1.tgz", + "integrity": "sha1-FQFR8eAkXtuhXVCvLXHx1c/0ZTA=", + "dev": true, + "requires": { + "lodash._basetostring": "^3.0.0", + "lodash._createpadding": "^3.0.0" + }, + "dependencies": { + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._createpadding": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash._createpadding/-/lodash._createpadding-3.6.1.tgz", + "integrity": "sha1-SQe0OFla3FTuiTVSemxCTALIGoc=", + "dev": true, + "requires": { + "lodash.repeat": "^3.0.0" + }, + "dependencies": { + "lodash.repeat": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-3.0.1.tgz", + "integrity": "sha1-9LmNx+9nJWzmHnh04YZe2yCODt8=", + "dev": true, + "requires": { + "lodash._basetostring": "^3.0.0" + } + } + } + } + } + }, + "lodash.padright": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.padright/-/lodash.padright-3.1.1.tgz", + "integrity": "sha1-efd3C6qjlzjAQK61Rl6NiPKqzsA=", + "dev": true, + "requires": { + "lodash._basetostring": "^3.0.0", + "lodash._createpadding": "^3.0.0" + }, + "dependencies": { + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._createpadding": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash._createpadding/-/lodash._createpadding-3.6.1.tgz", + "integrity": "sha1-SQe0OFla3FTuiTVSemxCTALIGoc=", + "dev": true, + "requires": { + "lodash.repeat": "^3.0.0" + }, + "dependencies": { + "lodash.repeat": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-3.0.1.tgz", + "integrity": "sha1-9LmNx+9nJWzmHnh04YZe2yCODt8=", + "dev": true, + "requires": { + "lodash._basetostring": "^3.0.0" + } + } + } + } + } + } + } + } + } + } + } + }, + "npm-package-arg": { + "version": "4.0.2", + "integrity": "sha1-PygjX59kKOVL/spzYp4n1sgafoI=", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "semver": "4 || 5" + } + }, + "npm-registry-client": { + "version": "7.0.7", + "integrity": "sha1-iZ18j+/oe3KnDYyeB1+4dFOeDT4=", + "dev": true, + "requires": { + "chownr": "^1.0.1", + "concat-stream": "^1.4.6", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "normalize-package-data": "~1.0.1 || ^2.0.0", + "npm-package-arg": "^3.0.0 || ^4.0.0", + "npmlog": "^7.0.1", + "once": "^1.3.0", + "request": "^2.47.0", + "retry": "^0.8.0", + "rimraf": "2", + "semver": "2 >=2.2.1 || 3.x || 4 || 5", + "slide": "^1.1.3" + }, + "dependencies": { + "concat-stream": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.0.tgz", + "integrity": "sha1-U/fUPFHF5D+ByP3QMyHGMb5o1hE=", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "~2.0.0", + "typedarray": "~0.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.2.tgz", + "integrity": "sha1-vsgb6ujPRVFovC5bKzH1vPrtmxs=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "process-nextick-args": "~1.0.0", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz", + "integrity": "sha1-awcIWu+aPMrG7lO/nT3wwVIaVTg=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.3.tgz", + "integrity": "sha1-4nLu2CXV6fTqdNjXOx/jEcO+tjA=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.1.tgz", + "integrity": "sha1-NVaj0TxMaqeYPX4kJUeBlxmbeIE=", + "dev": true + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + } + } + }, + "npmlog": { + "version": "7.0.1", + "resolved": "http://registry.npmjs.org/npmlog/-/npmlog-7.0.1.tgz", + "integrity": "sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg==", + "dev": true, + "requires": { + "are-we-there-yet": "^4.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^5.0.0", + "set-blocking": "^2.0.0" + } + } + } + }, + "npm-user-validate": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/npm-user-validate/-/npm-user-validate-0.1.2.tgz", + "integrity": "sha1-1YXaC0fJ9BqebKaEtv2EukHr6H0=", + "dev": true + }, + "npmlog": { + "version": "2.0.0", + "integrity": "sha1-QHbCAKPdpREz5vPPBSEwEF94u98=", + "dev": true, + "requires": { + "ansi": "~0.3.0", + "are-we-there-yet": "~1.0.0", + "gauge": "~1.2.0" + }, + "dependencies": { + "are-we-there-yet": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.4.tgz", + "integrity": "sha1-Un/jife8upCAYQa5kkTqoH6Ib4U=", + "dev": true, + "requires": { + "delegates": "^0.1.0", + "readable-stream": "^1.1.13" + }, + "dependencies": { + "delegates": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-0.1.0.tgz", + "integrity": "sha1-tLV74RoWU1F6BLJ/CUm9wyff45A=", + "dev": true + } + } + }, + "gauge": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.2.tgz", + "integrity": "sha1-BbZzChmo/K08NAoULwlFIio/gVs=", + "dev": true, + "requires": { + "ansi": "^0.3.0", + "has-unicode": "^1.0.0", + "lodash.pad": "^3.0.0", + "lodash.padleft": "^3.0.0", + "lodash.padright": "^3.0.0" + }, + "dependencies": { + "has-unicode": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-1.0.1.tgz", + "integrity": "sha1-xG/O6gU+uOx4m/+7ol/KUt/c844=", + "dev": true + }, + "lodash.pad": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-3.1.1.tgz", + "integrity": "sha1-LgeOvDOzMdK6NL+HMq8Sn9XARiQ=", + "dev": true, + "requires": { + "lodash._basetostring": "^3.0.0", + "lodash._createpadding": "^3.0.0" + }, + "dependencies": { + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._createpadding": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash._createpadding/-/lodash._createpadding-3.6.1.tgz", + "integrity": "sha1-SQe0OFla3FTuiTVSemxCTALIGoc=", + "dev": true, + "requires": { + "lodash.repeat": "^3.0.0" + }, + "dependencies": { + "lodash.repeat": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-3.0.1.tgz", + "integrity": "sha1-9LmNx+9nJWzmHnh04YZe2yCODt8=", + "dev": true, + "requires": { + "lodash._basetostring": "^3.0.0" + } + } + } + } + } + }, + "lodash.padleft": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.padleft/-/lodash.padleft-3.1.1.tgz", + "integrity": "sha1-FQFR8eAkXtuhXVCvLXHx1c/0ZTA=", + "dev": true, + "requires": { + "lodash._basetostring": "^3.0.0", + "lodash._createpadding": "^3.0.0" + }, + "dependencies": { + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._createpadding": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash._createpadding/-/lodash._createpadding-3.6.1.tgz", + "integrity": "sha1-SQe0OFla3FTuiTVSemxCTALIGoc=", + "dev": true, + "requires": { + "lodash.repeat": "^3.0.0" + }, + "dependencies": { + "lodash.repeat": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-3.0.1.tgz", + "integrity": "sha1-9LmNx+9nJWzmHnh04YZe2yCODt8=", + "dev": true, + "requires": { + "lodash._basetostring": "^3.0.0" + } + } + } + } + } + }, + "lodash.padright": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.padright/-/lodash.padright-3.1.1.tgz", + "integrity": "sha1-efd3C6qjlzjAQK61Rl6NiPKqzsA=", + "dev": true, + "requires": { + "lodash._basetostring": "^3.0.0", + "lodash._createpadding": "^3.0.0" + }, + "dependencies": { + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._createpadding": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash._createpadding/-/lodash._createpadding-3.6.1.tgz", + "integrity": "sha1-SQe0OFla3FTuiTVSemxCTALIGoc=", + "dev": true, + "requires": { + "lodash.repeat": "^3.0.0" + }, + "dependencies": { + "lodash.repeat": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-3.0.1.tgz", + "integrity": "sha1-9LmNx+9nJWzmHnh04YZe2yCODt8=", + "dev": true, + "requires": { + "lodash._basetostring": "^3.0.0" + } + } + } + } + } + } + } + } + } + }, + "once": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.2.tgz", + "integrity": "sha1-2P7sqTsDnsHc3ud0HJK9rF4oCBs=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "opener": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.4.1.tgz", + "integrity": "sha1-iXWQrNGu0zEbcDtYvMtNQ/VvKJU=", + "dev": true + }, + "osenv": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.3.tgz", + "integrity": "sha1-g88FxtZFj8TVrGNi6jJdkvJ1Qhc=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + }, + "dependencies": { + "os-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.0.tgz", + "integrity": "sha1-43B4vGG1hpBjBTiXJX457BJhtwI=", + "dev": true + }, + "os-tmpdir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.1.tgz", + "integrity": "sha1-6bQjoe2vR5iCVi6S7XHXdDoHG24=", + "dev": true + } + } + }, + "path-is-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.1.tgz", + "dev": true + }, + "read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "dev": true, + "requires": { + "mute-stream": "~0.0.4" + }, + "dependencies": { + "mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "dev": true + } + } + }, + "read-installed": { + "version": "4.0.3", + "integrity": "sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc=", + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "graceful-fs": "^4.1.2", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "slide": "~1.1.3", + "util-extend": "^1.0.1" + }, + "dependencies": { + "debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "dev": true + }, + "readdir-scoped-modules": { + "version": "1.0.2", + "integrity": "sha1-n6+jfShr5dksuuve4DDcm19AZ0c=", + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "util-extend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util-extend/-/util-extend-1.0.1.tgz", + "integrity": "sha1-u3A7eUgCk93Nz7PGqf6iD0g0Fbw=", + "dev": true + } + } + }, + "read-package-json": { + "version": "2.0.2", + "integrity": "sha1-+6BV2jLK74Lo7/CPwMrHj8HQJ80=", + "dev": true, + "requires": { + "glob": "^5.0.3", + "graceful-fs": "^4.1.2", + "json-parse-helpfulerror": "^1.0.2", + "normalize-package-data": "^2.0.0" + }, + "dependencies": { + "json-parse-helpfulerror": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", + "integrity": "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=", + "dev": true, + "requires": { + "jju": "^1.1.0" + }, + "dependencies": { + "jju": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.2.1.tgz", + "integrity": "sha1-7fbsINXWaMgMLADOpj+KlCKktSg=", + "dev": true + } + } + } + } + }, + "readable-stream": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.13.tgz", + "integrity": "sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz", + "integrity": "sha1-awcIWu+aPMrG7lO/nT3wwVIaVTg=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "realize-package-specifier": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/realize-package-specifier/-/realize-package-specifier-3.0.1.tgz", + "integrity": "sha1-/eMukmRI44+ZM02Vt7CNUeOpjZ8=", + "dev": true, + "requires": { + "dezalgo": "^1.0.1", + "npm-package-arg": "^4.0.0" + } + }, + "request": { + "version": "2.65.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.65.0.tgz", + "integrity": "sha1-zBo7xyuWJUc0/DQpbaMi+Uht3ro=", + "dev": true, + "requires": { + "aws-sign2": "~0.6.0", + "bl": "~1.0.0", + "caseless": "~0.11.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~1.0.0-rc3", + "har-validator": "~2.0.2", + "hawk": "~3.1.0", + "http-signature": "~0.11.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "node-uuid": "~1.4.3", + "oauth-sign": "~0.8.0", + "qs": "~5.2.0", + "stringstream": "~0.0.4", + "tough-cookie": "~2.2.0", + "tunnel-agent": "~0.4.1" + }, + "dependencies": { + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "bl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.0.tgz", + "integrity": "sha1-ramoqJptesYIYvfex9sgeHPgw/U=", + "dev": true, + "requires": { + "readable-stream": "~2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.3.tgz", + "integrity": "sha1-SrFrKrpFI3S1QqP09ShjS5tFu1o=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "process-nextick-args": "~1.0.0", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz", + "integrity": "sha1-awcIWu+aPMrG7lO/nT3wwVIaVTg=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.3.tgz", + "integrity": "sha1-4nLu2CXV6fTqdNjXOx/jEcO+tjA=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + } + } + } + } + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + }, + "dependencies": { + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + } + } + }, + "extend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", + "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "1.0.0-rc3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", + "integrity": "sha1-01vGLn+8KTeuePlIqqDTjZBgdXc=", + "dev": true, + "requires": { + "async": "^1.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.3" + }, + "dependencies": { + "async": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.0.tgz", + "integrity": "sha1-J5ZkJyNXOFlWVjP8YnRES+4vjOM=", + "dev": true + } + } + }, + "har-validator": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.2.tgz", + "integrity": "sha1-Iz0PqIe5ik80WWn4EaLuxw2Xrtc=", + "dev": true, + "requires": { + "chalk": "^1.1.1", + "commander": "^2.8.1", + "is-my-json-valid": "^2.12.2", + "pinkie-promise": "^1.0.0" + }, + "dependencies": { + "chalk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", + "integrity": "sha1-UJr7ZwZudJn36zU1x3RFdyri0Bk=", + "dev": true, + "requires": { + "ansi-styles": "^2.1.0", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz", + "integrity": "sha1-mQ90cUaSe1Wakyv5KVkWPWDA0OI=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.3.tgz", + "integrity": "sha1-ni2LJbwlVcMzZyN1DgPwmcJzW7U=", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": ">= 1.0.0" + }, + "dependencies": { + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + } + } + }, + "is-my-json-valid": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.2.tgz", + "integrity": "sha1-DWWFkxjIRs46E0QC/T+8UEJyzMk=", + "dev": true, + "requires": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "jsonpointer": "2.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "^1.0.0" + }, + "dependencies": { + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + } + } + }, + "jsonpointer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz", + "integrity": "sha1-OvHdIP6FRjkQ1GmjheMwF9KgMNk=", + "dev": true + }, + "xtend": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.0.tgz", + "integrity": "sha1-i8Nv+Hrtvnzp6vC8o2sjVKdDhA8=", + "dev": true + } + } + }, + "pinkie-promise": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-1.0.0.tgz", + "integrity": "sha1-0dpn9UglY7t89X8oauKCLs+/NnA=", + "dev": true, + "requires": { + "pinkie": "^1.0.0" + }, + "dependencies": { + "pinkie": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-1.0.0.tgz", + "integrity": "sha1-Wkfyi6EBXQIBvae/DzWOR77Ix+Q=", + "dev": true + } + } + } + } + }, + "hawk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.0.tgz", + "integrity": "sha1-ihOuGZd+xgdgLz8Ln9Z28Yw4TkQ=", + "dev": true, + "requires": { + "boom": "^2.8.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + }, + "dependencies": { + "boom": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.0.tgz", + "integrity": "sha1-/0y2ptPVJGI59rl6aahBI2LQluQ=", + "dev": true, + "requires": { + "hoek": "2.x.x" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.x.x" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.x.x" + } + } + } + }, + "http-signature": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.11.0.tgz", + "integrity": "sha1-F5bPZ6ABrVzWhJ3KCZFIXwkIn+Y=", + "dev": true, + "requires": { + "asn1": "0.1.11", + "assert-plus": "^0.1.5", + "ctype": "0.5.3" + }, + "dependencies": { + "asn1": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", + "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=", + "dev": true + }, + "assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=", + "dev": true + }, + "ctype": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", + "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=", + "dev": true + } + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "mime-types": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.7.tgz", + "integrity": "sha1-/2A5cOPHMe9vf03zyaD0Y6E8J1U=", + "dev": true, + "requires": { + "mime-db": "~1.19.0" + }, + "dependencies": { + "mime-db": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.19.0.tgz", + "integrity": "sha1-SWoYGYp86CRFNOJbsQK3T7Qg/VY=", + "dev": true + } + } + }, + "node-uuid": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.3.tgz", + "integrity": "sha1-MZu3pW58tj8AtcDNeFHNS03fHfk=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.0.tgz", + "integrity": "sha1-k4/ch1dlulJxN9iuydF44k3rxVM=", + "dev": true + }, + "qs": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", + "integrity": "sha1-qfMRQq9GjLcrJbMBNrokVoNJFr4=", + "dev": true + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "tough-cookie": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.0.tgz", + "integrity": "sha1-1M5mEHXl/dt/IDQdP5kxpvu63eA=", + "dev": true + }, + "tunnel-agent": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.1.tgz", + "integrity": "sha1-u+7P9NZ5znU9uUYnYaiN/Ow8WrM=", + "dev": true + } + } + }, + "retry": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.8.0.tgz", + "integrity": "sha1-I2dijcDtskex6rZJ3FOshiisLV8=", + "dev": true + }, + "rimraf": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.3.tgz", + "integrity": "sha1-5bUclDekxYKtuVXp8oz42UXicq8=", + "dev": true, + "requires": { + "glob": "^5.0.14" + } + }, + "semver": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", + "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=", + "dev": true + }, + "sha": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/sha/-/sha-2.0.1.tgz", + "integrity": "sha1-YDCCL70smCOUn49y7WQR7lzyWq4=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.2.tgz", + "integrity": "sha1-vsgb6ujPRVFovC5bKzH1vPrtmxs=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "process-nextick-args": "~1.0.0", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.1.tgz", + "integrity": "sha1-awcIWu+aPMrG7lO/nT3wwVIaVTg=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.3.tgz", + "integrity": "sha1-4nLu2CXV6fTqdNjXOx/jEcO+tjA=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.1.tgz", + "integrity": "sha1-NVaj0TxMaqeYPX4kJUeBlxmbeIE=", + "dev": true + } + } + } + } + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true + }, + "sorted-object": { + "version": "1.0.0", + "dev": true + }, + "spdx": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/spdx/-/spdx-0.4.1.tgz", + "integrity": "sha1-60Oi2DSD5wc9JBhLXKDQDzPhhP8=", + "dev": true, + "requires": { + "spdx-license-ids": "^1.0.0" + } + }, + "spdx-license-ids": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.1.0.tgz", + "integrity": "sha1-KGlKzfOf4n3kUUP/+B8h9sZtRKw=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz", + "integrity": "sha1-dRC2ZVZ8qRTMtdfgcnY6yWi+NyQ=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "tar": { + "version": "2.2.1", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, + "text-table": { + "version": "0.2.0", + "dev": true + }, + "uid-number": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", + "dev": true + }, + "umask": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/umask/-/umask-1.1.0.tgz", + "integrity": "sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "~1.0.0", + "spdx-expression-parse": "~1.0.0" + }, + "dependencies": { + "spdx-correct": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.1.tgz", + "integrity": "sha1-rAdfXy9qBsC/3RyEfrPd492CIeo=", + "dev": true, + "requires": { + "spdx-license-ids": "^1.0.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.0.tgz", + "integrity": "sha1-T7t+c4yemPoLCRTf2WGsZin7ze8=", + "dev": true, + "requires": { + "spdx-exceptions": "^1.0.0", + "spdx-license-ids": "^1.0.0" + }, + "dependencies": { + "spdx-exceptions": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-1.0.2.tgz", + "integrity": "sha1-xYSih1odsch0MmaZCvbgyC4UOls=", + "dev": true + } + } + } + } + }, + "validate-npm-package-name": { + "version": "2.2.2", + "integrity": "sha1-9laVsi9zJEQgGaPH+jmm5/0pkIU=", + "dev": true, + "requires": { + "builtins": "0.0.7" + }, + "dependencies": { + "builtins": { + "version": "0.0.7", + "dev": true + } + } + }, + "which": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.0.tgz", + "integrity": "sha1-pcjfWrx5L2zpZSyNnKjzqRt35Z0=", + "dev": true, + "requires": { + "is-absolute": "^0.1.7" + }, + "dependencies": { + "is-absolute": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", + "integrity": "sha1-hHSREZ/MtftDYhfMc39/qtUPYD8=", + "dev": true, + "requires": { + "is-relative": "^0.1.0" + }, + "dependencies": { + "is-relative": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz", + "integrity": "sha1-kF/uiuhvRbPsYUvDwVyGnfCHboI=", + "dev": true + } + } + } + } + }, + "wrappy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", + "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", + "dev": true + }, + "write-file-atomic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.1.3.tgz", + "integrity": "sha1-YOrKJYoLVZs3rKgrIdZKKTtLkNA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "slide": "^1.1.5" + } + } + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "http://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + }, + "dependencies": { + "aproba": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.7", + "resolved": "http://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", + "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "http://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "http://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "http://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha512-VlF07iu3VV3+BTXj43Nmp6Irt/G7j/NgEctUS6IweH1RGhURjjCc2NWtzXFPXXWWfc7hgbXQdtiQu2LGp6MxUg==", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "http://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-component": { + "version": "0.0.3", + "resolved": "http://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha512-S0sN3agnVh2SZNEIGc0N1X4Z5K0JeFbGBrnuZpsxuUh5XLF0BnvWkMjRXo/zGKLd/eghvNIKcx1pQkmUjXIyrA==", + "dev": true + }, + "object-inspect": { + "version": "1.13.1", + "resolved": "http://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.omit": { + "version": "2.0.1", + "resolved": "http://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "http://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "http://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "http://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g==", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==", + "dev": true + } + } + }, + "options": { + "version": "0.0.6", + "resolved": "http://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha512-bOj3L1ypm++N+n7CEbbe473A414AB7z+amKYshRb//iuL3MpdDCLhPnw6aVTdKB9g5ZRVHIEp8eUln6L2NUStg==", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "dev": true, + "requires": { + "lcid": "^1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true + }, + "osenv": { + "version": "0.0.3", + "resolved": "http://registry.npmjs.org/osenv/-/osenv-0.0.3.tgz", + "integrity": "sha512-VBk1bfdaO4gh3OWO8LBuDY2alp0buL8YzQ6t13xyc8PQPrnUg5AgQvINQx3UkS4dom8UGCL597q4Y2+M4TPvmw==", + "dev": true + }, + "output-file-sync": { + "version": "1.1.2", + "resolved": "http://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", + "integrity": "sha512-uQLlclru4xpCi+tfs80l3QF24KL81X57ELNMy7W/dox+JTtxUf1bLyQ8968fFCmSqqbokjW0kn+WBIlO+rSkNg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.4", + "mkdirp": "^0.5.1", + "object-assign": "^4.1.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.11", + "resolved": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + } + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "http://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA==", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + } + }, + "parsejson": { + "version": "0.0.3", + "resolved": "http://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", + "integrity": "sha512-v38ZjVbinlZ2r1Rz06WUZEnGoSRcEGX+roMsiWjHeAe23s2qlQUyfmsPQZvh7d8l0E8AZzTIO/RkUr00LfkSiA==", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "http://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha512-B3Nrjw2aL7aI4TDujOzfA4NsEc4u1lVcIRE0xesutH8kjeWF70uk+W5cBlIQx04zUH9NTBvuN36Y9xLRPK6Jjw==", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "http://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha512-ijhdxJu6l5Ru12jF0JvzXVPvsC+VibqeaExlNoMhWN6VQ79PGjkmc7oA4W1lp00sFkNyj0fx6ivPLdV51/UMog==", + "dev": true, + "requires": { + "better-assert": "~1.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "http://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "path-exists": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz", + "integrity": "sha512-BD2vrQBPFI3VkVKzTrOmaG2WtPQoduNXu1A5tLYMOW8RN6G9CdhdSkmw+ljxUkJcj4pbXQGw0lzl7MFLnhba9Q==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "http://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-posix": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/path-posix/-/path-posix-1.0.0.tgz", + "integrity": "sha512-1gJ0WpNIiYcQydgg3Ed8KzvIqTsDpNwq+cjBCssvBtuTWjEqY1AW+i+OepiEMqDCzyro9B2sLAe4RBPajMYFiA==", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "http://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "http://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "http://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha512-YHk5ez1hmMR5LOkb9iJkLKqoBlL7WD5M8ljC75ZfzXriuBIVNuecaXuU7e+hOwyqf24Wxhh7Vxgt7Hnw9288Tg==", + "dev": true, + "optional": true + }, + "pleasant-progress": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/pleasant-progress/-/pleasant-progress-1.1.0.tgz", + "integrity": "sha512-fqT2Wl03YpTq/bS3a4o/UU917CxBLD5mKtutBeEZLzlyB8lpF0v1Lwu3VLWymd0k3TANgTMbM1ErPAnoBfQT7A==", + "dev": true + }, + "portfinder": { + "version": "0.4.0", + "resolved": "http://registry.npmjs.org/portfinder/-/portfinder-0.4.0.tgz", + "integrity": "sha512-SZ3hp61WVhwNSS0gf0Fdrx5Yb/wl35qisHuPVM1S0StV8t5XlVZmmJy7/417OELJA7t6ecEmeEzvOaBwq3kCiQ==", + "dev": true, + "requires": { + "async": "0.9.0", + "mkdirp": "0.5.x" + }, + "dependencies": { + "async": { + "version": "0.9.0", + "resolved": "http://registry.npmjs.org/async/-/async-0.9.0.tgz", + "integrity": "sha512-XQJ3MipmCHAIBBMFfu2jaSetneOrXbSyyqeU3Nod867oNOpS+i9FEms5PWgjMxSgBybRf2IVVLtr1YfrDO+okg==", + "dev": true + } + } + }, + "preserve": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==", + "dev": true + }, + "printf": { + "version": "0.2.5", + "resolved": "http://registry.npmjs.org/printf/-/printf-0.2.5.tgz", + "integrity": "sha512-XHV6WP6xUvy42gUxdNyPQKCC9j36VzpVQ8Ztoffq0D6+PugiNsZ0FqBladXXPFQWthDDCA9OvGIsjEigMtznOQ==", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "http://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "http://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "http://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "process-relative-require": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/process-relative-require/-/process-relative-require-1.0.0.tgz", + "integrity": "sha512-r8G5WJPozMJAiv8sDdVWKgJ4In/zBXqwJdMCGAXQt2Kd3HdbAuJVzWYM4JW150hWoaI9DjhtbjcsCCHIMxm8RA==", + "dev": true, + "requires": { + "node-modules-path": "^1.0.0" + } + }, + "promise": { + "version": "7.3.1", + "resolved": "http://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-map-series": { + "version": "0.2.3", + "resolved": "http://registry.npmjs.org/promise-map-series/-/promise-map-series-0.2.3.tgz", + "integrity": "sha512-wx9Chrutvqu1N/NHzTayZjE1BgIwt6SJykQoCOic4IZ9yUDjKyVYrpLa/4YCNsV61eRENfs29hrEquVuB13Zlw==", + "dev": true, + "requires": { + "rsvp": "^3.0.14" + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "http://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "http://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "dev": true + }, + "qs": { + "version": "6.11.0", + "resolved": "http://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "quick-temp": { + "version": "0.1.8", + "resolved": "http://registry.npmjs.org/quick-temp/-/quick-temp-0.1.8.tgz", + "integrity": "sha512-YsmIFfD9j2zaFwJkzI6eMG7y0lQP7YeWzgtFgNl38pGWZBSXJooZbOWwkcRot7Vt0Fg9L23pX0tqWU3VvLDsiA==", + "dev": true, + "requires": { + "mktemp": "~0.4.0", + "rimraf": "^2.5.4", + "underscore.string": "~3.3.4" + } + }, + "qunitjs": { + "version": "1.23.1", + "resolved": "http://registry.npmjs.org/qunitjs/-/qunitjs-1.23.1.tgz", + "integrity": "sha512-HxmbULxwG6wmQ9no6RJVk2/g2O4uycAN1K00VDD6nowUHyDd8NzG6ESm4WOUJ5Mrty44QQl6+NHAalYvi/pakw==", + "dev": true + }, + "randomatic": { + "version": "3.1.1", + "resolved": "http://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "http://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "http://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + } + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "http://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.5.1", + "resolved": "http://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "http://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + } + } + }, + "readable-stream": { + "version": "4.5.1", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-4.5.1.tgz", + "integrity": "sha512-uQjbf34vmf/asGnOHQEw07Q4llgMACQZTWWa4MmICS0IKJoHbLwKCy71H3eR99Dw5iYejc6W+pqZZEeqRtUFAw==", + "dev": true, + "requires": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + } + }, + "readline2": { + "version": "0.1.1", + "resolved": "http://registry.npmjs.org/readline2/-/readline2-0.1.1.tgz", + "integrity": "sha512-qs8GGG+hLGMaDOGjd+mDglDoYcHDkjIY7z5RU0/ApsGT0qypyrWskNeemUqD+UxIXiZoMYT5aLwGp4ehoyZhIg==", + "dev": true, + "requires": { + "mute-stream": "0.0.4", + "strip-ansi": "^2.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz", + "integrity": "sha512-q5i8bFLg2wDfsuR56c1NzlJFPzVD+9mxhDrhqOGigEFa87OZHlF+9dWeGWzVTP/0ECiA/JUGzfzRr2t3eYORRw==", + "dev": true + }, + "strip-ansi": { + "version": "2.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz", + "integrity": "sha512-2h8q2CP3EeOhDJ+jd932PRMpa3/pOJFGoF22J1U/DNbEK2gSW2DqeF46VjCXsSQXhC+k/l8/gaaRBQKL6hUPfQ==", + "dev": true, + "requires": { + "ansi-regex": "^1.0.0" + } + } + } + }, + "recast": { + "version": "0.10.33", + "resolved": "http://registry.npmjs.org/recast/-/recast-0.10.33.tgz", + "integrity": "sha512-RxAVgvgWGzfFYsdc3PB6TM4/cq8HMgBH8PC9r+SkO7j1MeHZvIMxLSVlUhin3sv9wbAy8CMAPXSGSGkWPovyKQ==", + "dev": true, + "requires": { + "ast-types": "0.8.12", + "esprima-fb": "~15001.1001.0-dev-harmony-fb", + "private": "~0.1.5", + "source-map": "~0.5.0" + }, + "dependencies": { + "ast-types": { + "version": "0.8.12", + "resolved": "http://registry.npmjs.org/ast-types/-/ast-types-0.8.12.tgz", + "integrity": "sha512-rWhsoD0aHKpx+aKIP0Sf92bai1HC5iZcB1n/HCnkIMR8Bhx0gYRQySo062Y65ND4oRgcuxpLcPrcco09I1shpg==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + } + } + }, + "redeyed": { + "version": "0.5.0", + "resolved": "http://registry.npmjs.org/redeyed/-/redeyed-0.5.0.tgz", + "integrity": "sha512-AhuOInui6+UEtwpYhp+CqxpP6MD7tnEFTR6yNxEcqbodg+dYDBjDdJJoLsH3k2Wp3mTZkuigP2Bf1bwAd7Fd7Q==", + "dev": true, + "requires": { + "esprima-fb": "~12001.1.0-dev-harmony-fb" + }, + "dependencies": { + "esprima-fb": { + "version": "12001.1.0-dev-harmony-fb", + "resolved": "http://registry.npmjs.org/esprima-fb/-/esprima-fb-12001.1.0-dev-harmony-fb.tgz", + "integrity": "sha512-kj/HWGgQXRPKf7qAd8Woo2AaxRdT8kpTK2x1+c3zeucEYiIsGktmMC1N3q8J99R0ECMG7Ey/kywsR3qXPHBaXA==", + "dev": true + } + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "http://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerator": { + "version": "0.8.40", + "resolved": "http://registry.npmjs.org/regenerator/-/regenerator-0.8.40.tgz", + "integrity": "sha512-NsE91xz22nl5JsAwE5kZNmaMaK6g4HipZaGhrQJeVo8DsTwYYONx0TYEm8+7kFIODeuLNQpRsomV1CChmEY5Yg==", + "dev": true, + "requires": { + "commoner": "~0.10.3", + "defs": "~1.1.0", + "esprima-fb": "~15001.1001.0-dev-harmony-fb", + "private": "~0.1.5", + "recast": "0.10.33", + "through": "~2.3.8" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "http://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "regexpu": { + "version": "1.3.0", + "resolved": "http://registry.npmjs.org/regexpu/-/regexpu-1.3.0.tgz", + "integrity": "sha512-OqpQCTCcVM6k9IbzxLjNN6TRj3NV7qF4L8zUqsNoeAmmIZp8wH1tdZnn0vNXE2tGNU4ho0xTZWk3FmahOtyMRA==", + "dev": true, + "requires": { + "esprima": "^2.6.0", + "recast": "^0.10.10", + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "http://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "dev": true + } + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha512-x+Y3yA24uF68m5GA+tBjbGYo64xXVJpbToBaWCoSNSc1hdk6dfctaRWrNFTVJZIIhL5GxW8zwjoixbnifnK59g==", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "http://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha512-jlQ9gYLfk2p3V5Ag5fYhA7fv7OHzd1KUH0PRP46xc3TgwjwgROIW572AfYg/X9kaNq/LJnu6oJcFRXlIrGoTRw==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "http://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "http://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true + }, + "repeating": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", + "integrity": "sha512-Nh30JLeMHdoI+AsQ5eblhZ7YlTsM9wiJQe/AHIunlK3KWzvXhXb36IJ7K1IOeRjIOtzMjdUHjwXUFxKJoPTSOg==", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.81.0", + "resolved": "http://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha512-IZnsR7voF0miGSu29EXPRgPTuEsI/+aibNSBbN1pplrfartF5wDYGADz3iD9vmBVf2r00rckWZf8BtS5kk7Niw==", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" + }, + "dependencies": { + "qs": { + "version": "6.4.1", + "resolved": "http://registry.npmjs.org/qs/-/qs-6.4.1.tgz", + "integrity": "sha512-LQy1Q1fcva/UsnP/6Iaa4lVeM49WiOitu2T4hZCyA/elLKu37L99qcBJk4VCCk+rdLvnMzfKyiN3SZTqdAZGSQ==", + "dev": true, + "optional": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "http://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true, + "optional": true + } + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "resolve": { + "version": "1.22.8", + "resolved": "http://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-package-path": { + "version": "1.2.7", + "resolved": "http://registry.npmjs.org/resolve-package-path/-/resolve-package-path-1.2.7.tgz", + "integrity": "sha512-fVEKHGeK85bGbVFuwO9o1aU0n3vqQGrezPc51JGu9UTXpFQfWq5qCeKxyaRUSvephs+06c5j5rPq/dzHGEo8+Q==", + "dev": true, + "requires": { + "path-root": "^0.1.1", + "resolve": "^1.10.0" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "http://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", + "dev": true, + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "http://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "http://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "rsvp": { + "version": "3.6.2", + "resolved": "http://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "http://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "http://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sane": { + "version": "1.7.0", + "resolved": "http://registry.npmjs.org/sane/-/sane-1.7.0.tgz", + "integrity": "sha512-wxna76E1fVwXoNSUfSDGB1KKY/+ZIydOdQoFnMloJZTrkuJI4Twkr+2qn864GkzzPwXATHRUwhF9OpQWzIN+Kw==", + "dev": true, + "requires": { + "anymatch": "^1.3.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^2.0.0", + "minimatch": "^3.0.2", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.10.0" + } + }, + "semver": { + "version": "4.3.6", + "resolved": "http://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha512-IrpJ+yoG4EOH8DFWuVg+8H1kW1Oaof0Wxe7cPcXW3x9BjkN/eVo54F15LyqemnDIUYskQWr9qvl/RihmSy6+xQ==", + "dev": true + }, + "send": { + "version": "0.18.0", + "resolved": "http://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "http://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "http://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "http://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "http://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "set-function-length": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "requires": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true + }, + "shellwords": { + "version": "0.1.1", + "resolved": "http://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "http://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "http://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, + "silent-error": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/silent-error/-/silent-error-1.1.1.tgz", + "integrity": "sha512-n4iEKyNcg4v6/jpb3c0/iyH2G1nzUNl7Gpqtn/mHIJK9S/q/7MCfoO4rwVOoO59qPFIc0hVHvMbiOJ0NdtxKKw==", + "dev": true, + "requires": { + "debug": "^2.2.0" + } + }, + "simple-fmt": { + "version": "0.1.0", + "resolved": "http://registry.npmjs.org/simple-fmt/-/simple-fmt-0.1.0.tgz", + "integrity": "sha512-9a3zTDDh9LXbTR37qBhACWIQ/mP/ry5xtmbE98BJM8GR02sanCkfMzp7AdCTqYhkBZggK/w7hJtc8Pb9nmo16A==", + "dev": true + }, + "simple-is": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/simple-is/-/simple-is-0.2.0.tgz", + "integrity": "sha512-GJXhv3r5vdj5tGWO+rcrWgjU2azLB+fb7Ehh3SmZpXE0o4KrrFLti0w4mdDCbR29X/z0Ls20ApjZitlpAXhAeg==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "dev": true + }, + "slide": { + "version": "1.1.6", + "resolved": "http://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==", + "dev": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "http://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha512-7bgVOAnPj3XjrKY577S+puCKGCRlUrcrEdsMeRXlg9Ghf5df/xNi6sONUa43WrHUd3TjJBF7O04jYoiY0FVa0A==", + "dev": true, + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "socket.io": { + "version": "1.6.0", + "resolved": "http://registry.npmjs.org/socket.io/-/socket.io-1.6.0.tgz", + "integrity": "sha512-ZVTZV9k8MBtfZytMNgrKfv76z2KC/QUriJdsYwwyWI4pJ55i/XwVVGzuU35MmbxP0s2yuhOiK5gfxZCqa3f81Q==", + "dev": true, + "requires": { + "debug": "2.3.3", + "engine.io": "1.8.0", + "has-binary": "0.1.7", + "object-assign": "4.1.0", + "socket.io-adapter": "0.5.0", + "socket.io-client": "1.6.0", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha512-dCHp4G+F11zb+RtEu7BE2U8R32AYmM/4bljQfut8LipH3PdwsVBVGh083MXvtKkB7HSQUzSwiXz53c4mzJvYfw==", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha512-5NnE67nQSQDJHVahPJna1PQ/zCXMnQop3yUCxjKPNzCxuyPSKWTQ/5Gu5CZmjetwGLWRA+PzeF5thlbOdbQldA==", + "dev": true + }, + "object-assign": { + "version": "4.1.0", + "resolved": "http://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha512-Lbc7GfN7XFaK30bzUN3cDYLOkT0dH05S0ax1QikylHUD9+Z9PRF3G1iYwX3kcz+6AlzTFGkUgMxz6l3aUwbwTA==", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "0.5.0", + "resolved": "http://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", + "integrity": "sha512-zmYvlFJay9skt4yk1MffE9p93HKvQtyy0BLZ5dRM73bOXFJXNZWq8qZVdY456sLaxdK6fHGiZ7glxzqvzwGzkw==", + "dev": true, + "requires": { + "debug": "2.3.3", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha512-dCHp4G+F11zb+RtEu7BE2U8R32AYmM/4bljQfut8LipH3PdwsVBVGh083MXvtKkB7HSQUzSwiXz53c4mzJvYfw==", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha512-5NnE67nQSQDJHVahPJna1PQ/zCXMnQop3yUCxjKPNzCxuyPSKWTQ/5Gu5CZmjetwGLWRA+PzeF5thlbOdbQldA==", + "dev": true + } + } + }, + "socket.io-client": { + "version": "1.6.0", + "resolved": "http://registry.npmjs.org/socket.io-client/-/socket.io-client-1.6.0.tgz", + "integrity": "sha512-XmSyLR7gJC4lGLj2HSROr1Zx3Q6gAKBxCjmDwUBzkmT19tZ36MI7YXN186tHtV1oD6JXlyQLS7VVg0cFYh9hKg==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "2.3.3", + "engine.io-client": "1.8.0", + "has-binary": "0.1.7", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseuri": "0.0.5", + "socket.io-parser": "2.3.1", + "to-array": "0.1.4" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "http://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==", + "dev": true + }, + "debug": { + "version": "2.3.3", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha512-dCHp4G+F11zb+RtEu7BE2U8R32AYmM/4bljQfut8LipH3PdwsVBVGh083MXvtKkB7HSQUzSwiXz53c4mzJvYfw==", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha512-5NnE67nQSQDJHVahPJna1PQ/zCXMnQop3yUCxjKPNzCxuyPSKWTQ/5Gu5CZmjetwGLWRA+PzeF5thlbOdbQldA==", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "2.3.1", + "resolved": "http://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", + "integrity": "sha512-j6l4g/+yWQjmy1yByzg1DPFL4vxQw+NwCJatIxni/AE1wfm17FBtIKSWU4Ay+onrJwDxmC4eK4QS/04ZsqYwZQ==", + "dev": true, + "requires": { + "component-emitter": "1.1.2", + "debug": "2.2.0", + "isarray": "0.0.1", + "json3": "3.3.2" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha512-X0rGvJcskG1c3TgSCPqHJ0XJgwlcvOC7elJ5Y0hYuKBZoVqWpAMfLOeIh2UI/DCQ5ruodIjvsugZtjUYUw2pUw==", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "http://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha512-lRLiIR9fSNpnP6TC4v8+4OU7oStC01esuNowdQ34L+Gk8e5Puoc88IqJ+XAY/B3Mn2ZKis8l8HX90oU8ivzUHg==", + "dev": true + } + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "source-map-support": { + "version": "0.2.10", + "resolved": "http://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", + "integrity": "sha512-gGKOSat73z0V8wBKo9AGxZZyekczBireh1hHktbt+kb9acsCB5OfVCF2DCWlztcQ3r5oNN7f2BL0B2xOcoJ/DQ==", + "dev": true, + "requires": { + "source-map": "0.1.32" + }, + "dependencies": { + "source-map": { + "version": "0.1.32", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", + "integrity": "sha512-htQyLrrRLkQ87Zfrir4/yN+vAUd6DNjVayEjTSHXu29AYQJw57I4/xEL/M6p6E/woPNJwvZt6rVlzc7gFEJccQ==", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "source-map-url": { + "version": "0.3.0", + "resolved": "http://registry.npmjs.org/source-map-url/-/source-map-url-0.3.0.tgz", + "integrity": "sha512-QU4fa0D6aSOmrT+7OHpUXw+jS84T0MLaQNtFs8xzLNe6Arj44Magd7WEbyVW5LNYoAPVV35aKs4azxIfVJrToQ==", + "dev": true + }, + "sourcemap-validator": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/sourcemap-validator/-/sourcemap-validator-1.1.1.tgz", + "integrity": "sha512-pq6y03Vs6HUaKo9bE0aLoksAcpeOo9HZd7I8pI6O480W/zxNZ9U32GfzgtPP0Pgc/K1JHna569nAbOk3X8/Qtw==", + "dev": true, + "requires": { + "jsesc": "~0.3.x", + "lodash.foreach": "^4.5.0", + "lodash.template": "^4.5.0", + "source-map": "~0.1.x" + }, + "dependencies": { + "jsesc": { + "version": "0.3.0", + "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.3.0.tgz", + "integrity": "sha512-UHQmAeTXV+iwEk0aHheJRqo6Or90eDxI6KIYpHSjKLXKuKlPt1CQ7tGBerFcFA8uKU5mYxiPMlckmFptd5XZzA==", + "dev": true + } + } + }, + "spawn-args": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/spawn-args/-/spawn-args-0.2.0.tgz", + "integrity": "sha512-73BoniQDcRWgnLAf/suKH6V5H54gd1KLzwYN9FB6J/evqTV33htH9xwV/4BHek+++jzxpVlZQKKZkqstPQPmQg==", + "dev": true + }, + "spawnback": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/spawnback/-/spawnback-1.0.1.tgz", + "integrity": "sha512-340ZqtqJzWAZtHwaCC2gx4mdQOnkUWAWNDp7y0bCEatdjmgQ4j7b0qQ7qO5WIJWx/luNrKcrYzpKbH3NTR030A==", + "dev": true + }, + "sprintf-js": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, + "sri-toolbox": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/sri-toolbox/-/sri-toolbox-0.2.0.tgz", + "integrity": "sha512-DQIMWCAr/M7phwo+d3bEfXwSBEwuaJL+SJx9cuqt1Ty7K96ZFoHpYnSbhrQZEr0+0/GtmpKECP8X/R4RyeTAfw==", + "dev": true + }, + "sshpk": { + "version": "1.18.0", + "resolved": "http://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dev": true, + "optional": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "optional": true + } + } + }, + "stable": { + "version": "0.1.8", + "resolved": "http://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "http://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "http://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "http://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "http://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "stringmap": { + "version": "0.2.2", + "resolved": "http://registry.npmjs.org/stringmap/-/stringmap-0.2.2.tgz", + "integrity": "sha512-mR1LEHDw6TsHa+LwJeeBc9ZqZqEOm7bHidgxMmDg8HB/rbA1HhDeT08gS67CCCG/xrgIfQx5tW42pd8vFpLUow==", + "dev": true + }, + "stringset": { + "version": "0.2.1", + "resolved": "http://registry.npmjs.org/stringset/-/stringset-0.2.1.tgz", + "integrity": "sha512-km3jeiRpmySChl1oLiBE2ESdG5k/4+6tjENVL6BB3mdmKBiUikI5ks4paad2WAKsxzpNiBqBBbXCC12QqlpLWA==", + "dev": true + }, + "stringstream": { + "version": "0.0.6", + "resolved": "http://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", + "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "http://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg==", + "dev": true + }, + "styled_string": { + "version": "0.0.1", + "resolved": "http://registry.npmjs.org/styled_string/-/styled_string-0.0.1.tgz", + "integrity": "sha512-DU2KZiB6VbPkO2tGSqQ9n96ZstUPjW7X4sGO6V2m1myIQluX0p1Ol8BrA/l6/EesqhMqXOIXs3cJNOy1UuU2BA==", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "symlink-or-copy": { + "version": "1.3.1", + "resolved": "http://registry.npmjs.org/symlink-or-copy/-/symlink-or-copy-1.3.1.tgz", + "integrity": "sha512-0K91MEXFpBUaywiwSSkmKjnGcasG/rVBXFLJz5DrgGabpYD6N+3yZrfD6uUIfpuTu65DZLHi7N8CizHc07BPZA==", + "dev": true + }, + "tap-parser": { + "version": "5.4.0", + "resolved": "http://registry.npmjs.org/tap-parser/-/tap-parser-5.4.0.tgz", + "integrity": "sha512-BIsIaGqv7uTQgTW1KLTMNPSEQf4zDDPgYOBRdgOfuB+JFOLRBfEu6cLa/KvMvmqggu1FKXDfitjLwsq4827RvA==", + "dev": true, + "requires": { + "events-to-array": "^1.0.1", + "js-yaml": "^3.2.7", + "readable-stream": "^2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "optional": 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.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "temp": { + "version": "0.8.3", + "resolved": "http://registry.npmjs.org/temp/-/temp-0.8.3.tgz", + "integrity": "sha512-jtnWJs6B1cZlHs9wPG7BrowKxZw/rf6+UpGAkr8AaYmiTyTO7zQlLoST8zx/8TcUPnZmeBoB+H8ARuHZaSijVw==", + "dev": true, + "requires": { + "os-tmpdir": "^1.0.0", + "rimraf": "~2.2.6" + }, + "dependencies": { + "rimraf": { + "version": "2.2.8", + "resolved": "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg==", + "dev": true + } + } + }, + "testem": { + "version": "1.18.5", + "resolved": "http://registry.npmjs.org/testem/-/testem-1.18.5.tgz", + "integrity": "sha512-0jMQquldcrSl1HwNAkePOr02g/3ZQVZYw7GVJNbOiGvR5esyXvRPX916CLWxcdZqB3yHM80NZiz5P5biogu2Vw==", + "dev": true, + "requires": { + "backbone": "^1.1.2", + "bluebird": "^3.4.6", + "charm": "^1.0.0", + "commander": "^2.6.0", + "consolidate": "^0.14.0", + "cross-spawn": "^5.1.0", + "express": "^4.10.7", + "fireworm": "^0.7.0", + "glob": "^7.0.4", + "http-proxy": "^1.13.1", + "js-yaml": "^3.2.5", + "lodash.assignin": "^4.1.0", + "lodash.clonedeep": "^4.4.1", + "lodash.find": "^4.5.1", + "lodash.uniqby": "^4.7.0", + "mkdirp": "^0.5.1", + "mustache": "^2.2.1", + "node-notifier": "^5.0.1", + "npmlog": "^4.0.0", + "printf": "^0.2.3", + "rimraf": "^2.4.4", + "socket.io": "1.6.0", + "spawn-args": "^0.2.0", + "styled_string": "0.0.1", + "tap-parser": "^5.1.0", + "xmldom": "^0.1.19" + }, + "dependencies": { + "bluebird": { + "version": "3.7.2", + "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "http://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "textextensions": { + "version": "2.6.0", + "resolved": "http://registry.npmjs.org/textextensions/-/textextensions-2.6.0.tgz", + "integrity": "sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "timers-ext": { + "version": "0.1.7", + "resolved": "http://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dev": true, + "requires": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "tiny-lr": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/tiny-lr/-/tiny-lr-0.2.0.tgz", + "integrity": "sha512-uZEjnTJ76t0xcsEnHxZ/hDP53clDwpFtsHLgNwAbgPtaP7Jjfwa1D+cabAMRQ6om9s7yRInQ/Le/Dd7qSxMxAg==", + "dev": true, + "requires": { + "body-parser": "~1.14.0", + "debug": "~2.2.0", + "faye-websocket": "~0.10.0", + "livereload-js": "^2.2.0", + "parseurl": "~1.3.0", + "qs": "~5.1.0" + }, + "dependencies": { + "body-parser": { + "version": "1.14.2", + "resolved": "http://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", + "integrity": "sha512-6D9uiWn7dbnDAhlDikccybuqKCmsoest0es3VSQO8Doz/fzx6Ls7kJNxKBYTjbzu4/RzNsf9zuACnS3UYjVH8Q==", + "dev": true, + "requires": { + "bytes": "2.2.0", + "content-type": "~1.0.1", + "debug": "~2.2.0", + "depd": "~1.1.0", + "http-errors": "~1.3.1", + "iconv-lite": "0.4.13", + "on-finished": "~2.3.0", + "qs": "5.2.0", + "raw-body": "~2.1.5", + "type-is": "~1.6.10" + }, + "dependencies": { + "qs": { + "version": "5.2.0", + "resolved": "http://registry.npmjs.org/qs/-/qs-5.2.0.tgz", + "integrity": "sha512-VH4FeG98gs6AkHivaW2O14vsOPBL9E80Sj7fITunoDijiYQ1lsVwJYmm1CSL+oLyO2N5HPdo23GXAG64uKOAZQ==", + "dev": true + } + } + }, + "bytes": { + "version": "2.2.0", + "resolved": "http://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", + "integrity": "sha512-zGRpnr2l5w/s8PxkrquUJoVeR06KvqPelrYqiSyQV7QEBqCYivpb6UzXYWC6JDBVtNFOT0rzJRFhkfJgxzmILA==", + "dev": true + }, + "debug": { + "version": "2.2.0", + "resolved": "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha512-X0rGvJcskG1c3TgSCPqHJ0XJgwlcvOC7elJ5Y0hYuKBZoVqWpAMfLOeIh2UI/DCQ5ruodIjvsugZtjUYUw2pUw==", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "http://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, + "http-errors": { + "version": "1.3.1", + "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "integrity": "sha512-gMygNskMurDCWfoCdyh1gOeDfSbkAHXqz94QoPj5IHIUjC/BG8/xv7FSEUr7waR5RcAya4j58bft9Wu/wHNeXA==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "statuses": "1" + } + }, + "iconv-lite": { + "version": "0.4.13", + "resolved": "http://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "integrity": "sha512-QwVuTNQv7tXC5mMWFX5N5wGjmybjNBBD8P3BReTkPmipoxTUFgWM2gXNvldHQr6T14DH0Dh6qBVg98iJt7u4mQ==", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha512-lRLiIR9fSNpnP6TC4v8+4OU7oStC01esuNowdQ34L+Gk8e5Puoc88IqJ+XAY/B3Mn2ZKis8l8HX90oU8ivzUHg==", + "dev": true + }, + "qs": { + "version": "5.1.0", + "resolved": "http://registry.npmjs.org/qs/-/qs-5.1.0.tgz", + "integrity": "sha512-SGDM48EwFLWnYYpNlOkEIRJb4wil5FKJxpR6NVfQjz6qJmX53ki7Xj1cLNEAkb70vUfJmdVLOwODyABgZyDMZw==", + "dev": true + }, + "raw-body": { + "version": "2.1.7", + "resolved": "http://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", + "integrity": "sha512-x4d27vsIG04gZ1imkuDXB9Rd/EkAx5kYzeMijIYw1PAor0Ld3nTlkQQwDjKu42GdRUFCX1AfGnTSQB4O57eWVg==", + "dev": true, + "requires": { + "bytes": "2.4.0", + "iconv-lite": "0.4.13", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "2.4.0", + "resolved": "http://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", + "integrity": "sha512-SvUX8+c/Ga454a4fprIdIUzUN9xfd1YTvYh7ub5ZPJ+ZJ/+K2Bp6IpWGmnw8r3caLTsmhvJAKZz3qjIo9+XuCQ==", + "dev": true + } + } + } + } + }, + "tmpl": { + "version": "1.0.5", + "resolved": "http://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "to-array": { + "version": "0.1.4", + "resolved": "http://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A==", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==", + "dev": true + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "http://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, + "optional": true, + "requires": { + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "http://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true, + "optional": true + } + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==", + "dev": true + }, + "try-resolve": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/try-resolve/-/try-resolve-1.0.1.tgz", + "integrity": "sha512-yHeaPjCBzVaXwWl5IMUapTaTC2rn/eBYg2fsG2L+CvJd+ttFbk0ylDnpTO3wVhosmE1tQEvcebbBeKLCwScQSQ==", + "dev": true + }, + "tryor": { + "version": "0.1.2", + "resolved": "http://registry.npmjs.org/tryor/-/tryor-0.1.2.tgz", + "integrity": "sha512-2+ilNA00DGvbUYYbRrm3ux+snbo7I6uPXMw8I4p/QMl7HUOWBBZFbk+Mpr8/IAPDQE+LQ8vOdlI6xEzjc+e/BQ==", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "http://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "http://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true, + "optional": true + }, + "type": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "http://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "uc.micro": { + "version": "1.0.6", + "resolved": "http://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "http://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==", + "dev": true, + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", + "dev": true, + "optional": true + }, + "ultron": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha512-QMpnpVtYaWEeY+MwKDN/UdKlE/LsFZXM5lO1u7GaZzNgmIbGixHEmVMIKT+vqYOALu3m5GYQy9kz4Xu4IVn7Ow==", + "dev": true + }, + "underscore": { + "version": "1.13.6", + "resolved": "http://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", + "dev": true + }, + "underscore.string": { + "version": "3.3.6", + "resolved": "http://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", + "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", + "dev": true, + "requires": { + "sprintf-js": "^1.1.1", + "util-deprecate": "^1.0.2" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "http://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true + }, + "user-home": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha512-aggiKfEEubv3UwRNqTzLInZpAOmKzwdHqEBmW/hBA/mt99eg+b4VrX6i+IRLxU8+WJYfa33rGwRseg4eElUgsQ==", + "dev": true + }, + "username-sync": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/username-sync/-/username-sync-1.0.3.tgz", + "integrity": "sha512-m/7/FSqjJNAzF2La448c/aEom0gJy7HY7Y509h6l0ePvEkFictAGptwWaj1msWJ38JbfEDOUoE8kqFee9EHKdA==", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true + }, + "uuid": { + "version": "2.0.3", + "resolved": "http://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha512-FULf7fayPdpASncVy4DLh3xydlXEJJpvIELjYjNeQWYUZ9pclcpvCZSr2gkmN2FrrGcI7G/cJsIEwk5/8vfXpg==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "http://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "http://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "optional": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "optional": true + } + } + }, + "walk-sync": { + "version": "0.3.4", + "resolved": "http://registry.npmjs.org/walk-sync/-/walk-sync-0.3.4.tgz", + "integrity": "sha512-ttGcuHA/OBnN2pcM6johpYlEms7XpO5/fyKIr48541xXedan4roO8cS1Q2S/zbbjGH/BarYDAMeS2Mi9HE5Tig==", + "dev": true, + "requires": { + "ensure-posix-path": "^1.0.0", + "matcher-collection": "^1.0.0" + } + }, + "walker": { + "version": "1.0.8", + "resolved": "http://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, + "watch": { + "version": "0.10.0", + "resolved": "http://registry.npmjs.org/watch/-/watch-0.10.0.tgz", + "integrity": "sha512-FAk18nzhYggg939xgRRLJjvqmAKZciO24wr8neoxNPl87w8J3m784wxL4zFBwME+0gNQ2Sv/vfsCrUxPxU2Dmg==", + "dev": true + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "http://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "http://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "http://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wide-align": { + "version": "1.1.5", + "resolved": "http://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "http://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "http://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", + "dev": true + }, + "workerpool": { + "version": "2.3.4", + "resolved": "http://registry.npmjs.org/workerpool/-/workerpool-2.3.4.tgz", + "integrity": "sha512-c2EWrgB9IKHi1jbf4LG9sxKgHYOY+Ej5li6siEGtFecCXWG7eQOqATPEJ0rg1KFETXROEkErc1t5XiNrLG666Q==", + "dev": true, + "requires": { + "object-assign": "4.1.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "http://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha512-SdrHoC/yVBPpV0Xq/mUZQIpW2sWXAShb/V4pomcJXh92RuaO+f3UTWItiR3Px+pLnV2PvC2/bfn5cwr5X6Vfxw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + }, + "dependencies": { + "graceful-fs": { + "version": "4.2.11", + "resolved": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + } + } + }, + "ws": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/ws/-/ws-1.1.1.tgz", + "integrity": "sha512-TRtCup+Fxoy1sW9funE4kPxA0KfaMc7g68DoKN+Uu9Ej+zr9We3DWVJ2XgiGtXlibqA7IWOV+Xe6xlUxPputfg==", + "dev": true, + "requires": { + "options": ">=0.0.5", + "ultron": "1.0.x" + } + }, + "wtf-8": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", + "integrity": "sha512-qfR6ovmRRMxNHgUNYI9LRdVofApe/eYrv4ggNOvvCP+pPdEo9Ym93QN4jUceGD6PignBbp2zAzgoE7GibAdq2A==", + "dev": true + }, + "xdg-basedir": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz", + "integrity": "sha512-NF1pPn594TaRSUO/HARoB4jK8I+rWgcpVlpQCK6/6o5PHyLUt2CSiDrpUZbQ6rROck+W2EwF8mBJcTs+W98J9w==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0" + } + }, + "xmldom": { + "version": "0.1.31", + "resolved": "http://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", + "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.3", + "resolved": "http://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", + "integrity": "sha512-kauAa/1btT613pYX92WXR6kx5trYeckB5YMd3pPvtkMo2Twdfhwl683M8NiSqWHHo97xAC6bnvK1DWFKxfmejg==", + "dev": true + }, + "y18n": { + "version": "3.2.2", + "resolved": "http://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "http://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + }, + "yam": { + "version": "0.0.18", + "resolved": "http://registry.npmjs.org/yam/-/yam-0.0.18.tgz", + "integrity": "sha512-DY8ZHJyC9v/gZSBz7TD6MZ8vgyareT2qMCe/6Bc1Q017WW3SWuOs7/sWzmAv73r3x1bu4MhWzY/omleVBeOCSw==", + "dev": true, + "requires": { + "findup": "^0.1.5", + "fs-extra": "^0.16.3", + "lodash.merge": "^3.0.2" + }, + "dependencies": { + "fs-extra": { + "version": "0.16.5", + "resolved": "http://registry.npmjs.org/fs-extra/-/fs-extra-0.16.5.tgz", + "integrity": "sha512-yb7ti8kVH+qboUQWYxUuOPj/qcMUA6lO68ErZoPQOTP+7qroCIN/1gZ1lLk/rs2p0gPFzrvPYujKGnHTu+HHxA==", + "dev": true, + "requires": { + "graceful-fs": "^3.0.5", + "jsonfile": "^2.0.0", + "rimraf": "^2.2.8" + } + }, + "graceful-fs": { + "version": "3.0.12", + "resolved": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz", + "integrity": "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==", + "dev": true, + "requires": { + "natives": "^1.1.3" + } + } + } + }, + "yargs": { + "version": "3.10.0", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", + "dev": true, + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "http://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==", + "dev": true + } + } +} diff --git a/uam-web/package.json b/uam-web/package.json new file mode 100644 index 0000000000000000000000000000000000000000..bfe98958934babdd051f524afd099dd105ed1f4a --- /dev/null +++ b/uam-web/package.json @@ -0,0 +1,53 @@ +{ + "name": "clouduam-web", + "version": "1.10.2", + "description": "Small description for clouduam-web goes here", + "private": true, + "directories": { + "doc": "doc", + "test": "tests" + }, + "scripts": { + "build": "ember build", + "start": "ember server", + "test": "ember test", + "prod": "ember build -prod" + }, + "repository": "", + "engines": { + "node": ">= 0.10.0" + }, + "author": "", + "license": "MIT", + "devDependencies": { + "broccoli-asset-rev": "^2.2.0", + "ember-cli": "^1.13.15", + "ember-cli-app-version": "^1.0.0", + "ember-cli-babel": "^5.1.5", + "ember-cli-dependency-checker": "^1.1.0", + "ember-cli-htmlbars": "^1.0.1", + "ember-cli-htmlbars-inline-precompile": "^0.3.1", + "ember-cli-ic-ajax": "0.2.4", + "ember-cli-idcos": "1.0.17", + "ember-cli-inject-live-reload": "^1.3.1", + "ember-cli-less": "1.5.3", + "ember-cli-qunit": "^1.0.4", + "ember-cli-release": "0.2.8", + "ember-cli-sri": "^1.2.0", + "ember-cli-uglify": "^1.2.0", + "ember-composable-helpers": "0.23.1", + "ember-data": "1.13.15", + "ember-disable-proxy-controllers": "^1.0.1", + "ember-export-application-global": "^1.0.4", + "ember-font-awesome": "2.1.0", + "ember-lodash": "0.0.6", + "ember-spectrum-color-picker": "0.4.2", + "ember-truth-helpers": "1.2.0", + "fs-extra": "^0.26.5" + }, + "ember-addon": { + "paths": [ + "lib/publish" + ] + } +} diff --git a/uam-web/public/crossdomain.xml b/uam-web/public/crossdomain.xml new file mode 100644 index 0000000000000000000000000000000000000000..0c16a7a07b37e5d5f7e0e56c829f720067458403 --- /dev/null +++ b/uam-web/public/crossdomain.xml @@ -0,0 +1,15 @@ +<?xml version="1.0"?> +<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"> +<cross-domain-policy> + <!-- Read this: www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html --> + + <!-- Most restrictive policy: --> + <site-control permitted-cross-domain-policies="none"/> + + <!-- Least restrictive policy: --> + <!-- + <site-control permitted-cross-domain-policies="all"/> + <allow-access-from domain="*" to-ports="*" secure="false"/> + <allow-http-request-headers-from domain="*" headers="*" secure="false"/> + --> +</cross-domain-policy> diff --git a/uam-web/public/favicon.ico b/uam-web/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a45cf65078c39ff9b5c69e7f2521ce418b21ba86 Binary files /dev/null and b/uam-web/public/favicon.ico differ diff --git a/uam-web/public/fonts/demo.css b/uam-web/public/fonts/demo.css new file mode 100644 index 0000000000000000000000000000000000000000..1fe4c4dd4e251d4d51cc08d2ae930a35e5d3cb04 --- /dev/null +++ b/uam-web/public/fonts/demo.css @@ -0,0 +1,89 @@ +*{margin: 0;padding: 0;list-style: none;} +/* +KISSY CSS Reset +理念:1. reset 的目的不是清除浏览器的默认样式,这仅是部分工作。清除和重置是紧密不可分的。 +2. reset 的目的不是让默认样式在所有浏览器下一致,而是减少默认样式有可能带来的问题。 +3. reset 期望提供一套普适通用的基础样式。但没有银弹,推荐根据具体需求,裁剪和修改后再使用。 +特色:1. 适应中文;2. 基于最新主流浏览器。 +维护:玉伯<lifesinger@gmail.com>, 正淳<ragecarrier@gmail.com> + */ + +/** 清除内外边距 **/ +body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, /* structural elements 结构元素 */ +dl, dt, dd, ul, ol, li, /* list elements 列表元素 */ +pre, /* text formatting elements 文本格式元素 */ +form, fieldset, legend, button, input, textarea, /* form elements 表单元素 */ +th, td /* table elements 表格元素 */ { + margin: 0; + padding: 0; +} + +/** 设置默认字体 **/ +body, +button, input, select, textarea /* for ie */ { + font: 12px/1.5 tahoma, arial, \5b8b\4f53, sans-serif; +} +h1, h2, h3, h4, h5, h6 { font-size: 100%; } +address, cite, dfn, em, var { font-style: normal; } /* 将斜体扶正 */ +code, kbd, pre, samp { font-family: courier new, courier, monospace; } /* 统一等宽字体 */ +small { font-size: 12px; } /* 小于 12px 的中文很难阅读,让 small 正常化 */ + +/** 重置列表元素 **/ +ul, ol { list-style: none; } + +/** 重置文本格式元素 **/ +a { text-decoration: none; } +a:hover { text-decoration: underline; } + + +/** 重置表单元素 **/ +legend { color: #000; } /* for ie6 */ +fieldset, img { border: 0; } /* img 搭车:让链接里的 img 无边框 */ +button, input, select, textarea { font-size: 100%; } /* 使得表单元素在 ie 下能继承字体大小 */ +/* 注:optgroup 无法扶正 */ + +/** 重置表格元素 **/ +table { border-collapse: collapse; border-spacing: 0; } + +/* 清除浮动 */ +.ks-clear:after, .clear:after { + content: '\20'; + display: block; + height: 0; + clear: both; +} +.ks-clear, .clear { + *zoom: 1; +} + +.main {padding: 30px 100px;} +.main h1{font-size:36px; color:#333; text-align:left;margin-bottom:30px; border-bottom: 1px solid #eee;} + +.helps{margin-top:40px;} +.helps pre{ + padding:20px; + margin:10px 0; + border:solid 1px #e7e1cd; + background-color: #fffdef; + overflow: auto; +} + +.icon_lists li{ + float:left; + width: 100px; + height:180px; + text-align: center; +} +.icon_lists .icon{ + font-size: 42px; + line-height: 100px; + margin: 10px 0; + color:#333; + -webkit-transition: font-size 0.25s ease-out 0s; + -moz-transition: font-size 0.25s ease-out 0s; + transition: font-size 0.25s ease-out 0s; + +} +.icon_lists .icon:hover{ + font-size: 100px; +} diff --git a/uam-web/public/fonts/demo.html b/uam-web/public/fonts/demo.html new file mode 100644 index 0000000000000000000000000000000000000000..89f89fb4388427519c203ef2b07cbbbbb4979a31 --- /dev/null +++ b/uam-web/public/fonts/demo.html @@ -0,0 +1,109 @@ + +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"/> + <title>IconFont</title> + <link rel="stylesheet" href="demo.css"> + <link rel="stylesheet" href="iconfont.css"> +</head> +<body> + <div class="main"> + <h1>IconFont 图标</h1> + <ul class="icon_lists clear"> + + <li> + <i class="icon iconfont">&#xe604;</i> + <div class="name">del</div> + <div class="code">&amp;#xe604;</div> + <div class="fontclass">.del</div> + </li> + + <li> + <i class="icon iconfont">&#xe607;</i> + <div class="name">edit</div> + <div class="code">&amp;#xe607;</div> + <div class="fontclass">.edit</div> + </li> + + <li> + <i class="icon iconfont">&#xe600;</i> + <div class="name">build</div> + <div class="code">&amp;#xe600;</div> + <div class="fontclass">.build</div> + </li> + + <li> + <i class="icon iconfont">&#xe601;</i> + <div class="name">usermanager</div> + <div class="code">&amp;#xe601;</div> + <div class="fontclass">.usermanager</div> + </li> + + <li> + <i class="icon iconfont">&#xe602;</i> + <div class="name">usergroup</div> + <div class="code">&amp;#xe602;</div> + <div class="fontclass">.usergroup</div> + </li> + + <li> + <i class="icon iconfont">&#xe603;</i> + <div class="name">rolemanager</div> + <div class="code">&amp;#xe603;</div> + <div class="fontclass">.rolemanager</div> + </li> + + <li> + <i class="icon iconfont">&#xe605;</i> + <div class="name">permissiondistribution</div> + <div class="code">&amp;#xe605;</div> + <div class="fontclass">.permissiondistribution</div> + </li> + + <li> + <i class="icon iconfont">&#xe606;</i> + <div class="name">permissionmanager</div> + <div class="code">&amp;#xe606;</div> + <div class="fontclass">.permissionmanager-copy</div> + </li> + + <li> + <i class="icon iconfont">&#xe608;</i> + <div class="name">key</div> + <div class="code">&amp;#xe608;</div> + <div class="fontclass">.key</div> + </li> + + </ul> + + + <div class="helps"> + 第一步:使用font-face声明字体 + <pre> +@font-face {font-family: 'iconfont'; + src: url('iconfont.eot'); /* IE9*/ + src: url('iconfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('iconfont.woff') format('woff'), /* chrome、firefox */ + url('iconfont.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/ + url('iconfont.svg#iconfont') format('svg'); /* iOS 4.1- */ +} +</pre> +第二步:定义使用iconfont的样式 + <pre> +.iconfont{ + font-family:"iconfont" !important; + font-size:16px;font-style:normal; + -webkit-font-smoothing: antialiased; + -webkit-text-stroke-width: 0.2px; + -moz-osx-font-smoothing: grayscale;} +</pre> +第三步:挑选相应图标并获取字体编码,应用于页面 +<pre> +&lt;i class="iconfont"&gt;&amp;#x33;&lt;/i&gt; +</pre> + </div> + + </div> +</body> +</html> diff --git a/uam-web/public/fonts/iconfont.css b/uam-web/public/fonts/iconfont.css new file mode 100644 index 0000000000000000000000000000000000000000..982ec5c721bbd55551b934118c11a01c9f3884ec --- /dev/null +++ b/uam-web/public/fonts/iconfont.css @@ -0,0 +1,26 @@ + +@font-face {font-family: "iconfont"; + src: url('iconfont.eot?t=1463375059'); /* IE9*/ + src: url('iconfont.eot?t=1463375059#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('iconfont.woff?t=1463375059') format('woff'), /* chrome, firefox */ + url('iconfont.ttf?t=1463375059') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ + url('iconfont.svg?t=1463375059#iconfont') format('svg'); /* iOS 4.1- */ +} + +.iconfont { + font-family:"iconfont" !important; + font-size:16px; + font-style:normal; + -webkit-font-smoothing: antialiased; + -webkit-text-stroke-width: 0.2px; + -moz-osx-font-smoothing: grayscale; +} +.icon-del:before { content: "\e604"; } +.icon-edit:before { content: "\e607"; } +.icon-build:before { content: "\e600"; } +.icon-usermanager:before { content: "\e601"; } +.icon-usergroup:before { content: "\e602"; } +.icon-rolemanager:before { content: "\e603"; } +.icon-permissiondistribution:before { content: "\e605"; } +.icon-permissionmanager-copy:before { content: "\e606"; } +.icon-key:before { content: "\e608"; } diff --git a/uam-web/public/fonts/iconfont.eot b/uam-web/public/fonts/iconfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..1acff903f0ba8e58ecb8789ef76b0051b0f83d0a Binary files /dev/null and b/uam-web/public/fonts/iconfont.eot differ diff --git a/uam-web/public/fonts/iconfont.svg b/uam-web/public/fonts/iconfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..981c14e290d59911a10c4e6cc36c28654eec8200 --- /dev/null +++ b/uam-web/public/fonts/iconfont.svg @@ -0,0 +1,70 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > +<svg xmlns="http://www.w3.org/2000/svg"> +<metadata> +Created by FontForge 20120731 at Mon May 16 13:04:19 2016 + By admin +</metadata> +<defs> +<font id="iconfont" horiz-adv-x="1024" > + <font-face + font-family="iconfont" + font-weight="500" + font-stretch="normal" + units-per-em="1024" + panose-1="2 0 6 3 0 0 0 0 0 0" + ascent="896" + descent="-128" + x-height="792" + bbox="7 -111 1057 851" + underline-thickness="50" + underline-position="-100" + unicode-range="U+0078-E608" + /> +<missing-glyph horiz-adv-x="374" +d="M34 0v682h272v-682h-272zM68 34h204v614h-204v-614z" /> + <glyph glyph-name=".notdef" horiz-adv-x="374" +d="M34 0v682h272v-682h-272zM68 34h204v614h-204v-614z" /> + <glyph glyph-name=".null" horiz-adv-x="0" + /> + <glyph glyph-name="nonmarkingreturn" horiz-adv-x="341" + /> + <glyph glyph-name="x" unicode="x" horiz-adv-x="1001" +d="M281 543q-27 -1 -53 -1h-83q-18 0 -36.5 -6t-32.5 -18.5t-23 -32t-9 -45.5v-76h912v41q0 16 -0.5 30t-0.5 18q0 13 -5 29t-17 29.5t-31.5 22.5t-49.5 9h-133v-97h-438v97zM955 310v-52q0 -23 0.5 -52t0.5 -58t-10.5 -47.5t-26 -30t-33 -16t-31.5 -4.5q-14 -1 -29.5 -0.5 +t-29.5 0.5h-32l-45 128h-439l-44 -128h-29h-34q-20 0 -45 1q-25 0 -41 9.5t-25.5 23t-13.5 29.5t-4 30v167h911zM163 247q-12 0 -21 -8.5t-9 -21.5t9 -21.5t21 -8.5q13 0 22 8.5t9 21.5t-9 21.5t-22 8.5zM316 123q-8 -26 -14 -48q-5 -19 -10.5 -37t-7.5 -25t-3 -15t1 -14.5 +t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q-5 19 -11 39h-368zM336 498v228q0 11 2.5 23t10 21.5t20.5 15.5t34 6h188q31 0 51.5 -14.5t20.5 -52.5v-227h-327z" /> + <glyph glyph-name="uniE600" unicode="&#xe600;" horiz-adv-x="1102" +d="M964 24v637h-295v147h-496v-784h-105v-57h989v57h-93zM907 604v-580h-237v580h237zM612 751v-727h-382v727h382zM309 563h206v-57h-206v57zM309 416h206v-57h-206v57zM703 416h181v-57h-181v57zM309 269h206v-56h-206v56zM703 269h181v-56h-181v56z" /> + <glyph glyph-name="uniE601" unicode="&#xe601;" +d="M334 522l1 -1q0 -1 0.5 -2.5t1.5 -2.5q24 -53 72.5 -84.5t108.5 -33.5h9q59 1 108 33t74 85q1 2 2 5l1 1q0 1 1 3t1 3q15 39 15 81q0 14 -1 20v3v3q0 2 -0.5 3.5t-0.5 2.5q-12 73 -68 121t-131 50h-8q-77 -2 -133 -50t-68 -121q0 -1 -0.5 -2.5t-0.5 -3.5v-1 +q0 -1 -0.5 -2.5t-0.5 -2.5q-1 -7 -1 -21q0 -41 16 -81v-2q1 -2 2 -3zM367 608q0 11 1 16q0 2 1 4v2v4q9 55 52 91t101 37v3l1 -3q57 -1 100 -37t52 -91q0 -1 0.5 -2.5t0.5 -2.5v-1q0 -2 1 -4v-16q0 -33 -11 -62q-2 -3 -2 -4l-1 -2l-1 -1v-2q-19 -40 -56 -64t-83 -24v-4l-1 4 +q-46 0 -83.5 24t-55.5 64l-2 3v2q-2 3 -2 4q-12 32 -12 62zM926 -5v111v6q-6 33 -28 62q-46 60 -122 103l-3 2q-3 1 -4 2q-29 16 -75 33q-70 23 -124 27q-22 2 -32 2h-21h-21q-10 0 -32 -2q-58 -5 -125 -27q-46 -17 -75 -33q-3 -1 -3 -2l-4 -2q-74 -42 -122 -104 +q-21 -27 -27 -61q-1 -5 -1 -7v-111q0 -13 2 -24q5 -17 15 -28q18 -20 49 -20h687q31 0 49 20q10 11 14 28q3 12 3 25zM874 87v-81q0 -12 -8.5 -21t-20.5 -9h-658q-12 0 -20.5 9t-8.5 21v81q0 31 19 55q43 54 112 91q28 15 89.5 35.5t116.5 20.5h43q55 0 116.5 -20.5 +t88.5 -35.5h1q69 -37 111 -91q19 -24 19 -55z" /> + <glyph glyph-name="uniE602" unicode="&#xe602;" horiz-adv-x="1047" +d="M475 574q45 0 76.5 31.5t31.5 76.5t-32 77.5t-76 32.5t-75 -32.5t-31 -78t30.5 -76.5t75.5 -31zM475 736q22 0 38 -16t16 -38t-16 -37t-38 -15q-23 0 -38 14.5t-15 37.5q0 22 15.5 38t37.5 16zM605 380v-8v-10v-5q21 37 53 61q-17 62 -68 101.5t-115.5 39.5t-115 -40 +t-66.5 -102q33 -27 53 -64v9v10v8q4 52 40.5 88t88.5 36q51 0 89 -36t41 -88zM741.5 165q-82.5 0 -140.5 -56.5t-58 -136.5v-34h399q-1 0 -1 34q0 80 -58.5 136.5t-141 56.5zM742 119q60 0 103.5 -40t47.5 -97h-302q4 57 47.5 97t103.5 40zM207 165q-83 0 -141.5 -56.5 +t-58.5 -136.5v-34h399v44q-4 77 -61.5 130t-137.5 53zM58 -18q4 57 46.5 97t102.5 40t104.5 -40t48.5 -97h-302zM209 183q47 0 80 33t33 80.5t-33 81.5t-80 34t-80 -34t-33 -81q-1 -48 32.5 -81t80.5 -33zM208.5 361q25.5 0 43.5 -19t18 -45t-18 -44.5t-43 -18.5t-43 18 +t-18 45q-1 26 17 45t43.5 19zM742.5 183q47.5 0 80.5 33t33 80.5t-33.5 81.5t-80 34t-80 -34t-33.5 -81q0 -48 33 -81t80.5 -33zM742.5 361q25.5 0 43.5 -19t18 -45t-18 -44.5t-43.5 -18.5t-43.5 18t-18 45q0 26 18 45t43.5 19z" /> + <glyph glyph-name="uniE603" unicode="&#xe603;" +d="M840 383l-4 -1q-45 -12 -94 -12q-8 0 -23 2q-5 0 -13 1.5t-9 1.5q-21 5 -23 6l-22 6q-1 0 -5 1l-8 4q-4 1 -9 3q-6 1 -12.5 3.5t-8.5 2.5q-46 15 -78 22.5t-67 7.5q-45 0 -92 -9v308q48 12 92 12q8 0 24 -1q4 -1 12 -2t9 -1q7 -3 23 -7l10 -3l11 -4q2 0 5.5 -1.5 +t6.5 -1.5l11 -4q5 -2 12 -4.5t9 -2.5q45 -14 77 -22q25 -5 51 -7h8h8q46 0 92 9l7 1v-308zM878 754q-18 -6 -40 -12q-26 -6 -44 -8q-72 -7 -109 3l-57 15l-55 18q-20 6 -57 15q-30 6 -54 6h-5q-15 0 -46 -3q-26 -4 -42 -7q-17 -4 -32 -9q-15 -6 -18 -6l-6 -3v-653h22h29h6 +v261q45 10 93 10q26 0 56 -6h1q17 -4 44.5 -12.5t47.5 -14.5l19 -5q20 -7 57 -15q30 -6 54 -6q28 0 51 3q26 3 42 6q17 4 32 9l7 2q5 2 7 3t4 1l6 3v410zM225 8h235v61h-235v-61zM140 -90h419v61h-419v-61z" /> + <glyph glyph-name="uniE604" unicode="&#xe604;" +d="M774 -13h-222v556h-60v-556h-228v559h-61v-620h631v614h-60v-553zM886 705h-334v106h-76v-106h-356v-76h804v76h-38z" /> + <glyph glyph-name="uniE605" unicode="&#xe605;" horiz-adv-x="1077" +d="M147 -16v435h81h55h344v54h-17v137q0 73 -56 125.5t-134 52.5q-79 0 -135 -52.5t-56 -125.5v-137h-136v-542h296l-69 54h-173v-1zM283 610q0 51 39.5 87t96 36t96.5 -36t40 -87v-137h-272v137zM679 475l-1 -128h-156v-48h204v82l161 -120l-160 -118l-1 86h-258v106 +l-242 -202l242 -203v106h163v48h-211v-51l-119 100l119 99v-51h258l1 -133l289 213z" /> + <glyph glyph-name="uniE606" unicode="&#xe606;" horiz-adv-x="1027" +d="M150 64v406h458v51h-17v128q0 68 -53.5 117t-129 49t-128.5 -49t-53 -117v-128h-129v-507h279l51 50h-278zM280 649q0 48 38 81.5t92 33.5t92.5 -33.5t38.5 -81.5v-128h-261v128zM919 174l2 16h89v47h-89l-2 16q-9 53 -42 98l-9 14l62 61l-34 33l-63 -61l-14 10 +q-1 0 -2.5 1.5t-4 3t-3.5 2.5q-28 16 -58 26q-1 0 -3 1t-4 1q-17 5 -26 6l-16 3v87h-48v-87l-17 -3q-55 -9 -100 -41l-14 -9l-63 61l-34 -34l63 -61l-10 -13q-32 -45 -41 -98l-3 -17h-88v-47h88l3 -16q9 -54 41 -99l10 -13l-9 -8l-54 -53l34 -33l37 35l26 26l14 -10 +q2 -1 6.5 -4t5.5 -4q10 -6 15 -8q37 -18 73 -24l16 -3v-87h48v87l17 3q46 7 88 32l2 1q7 4 10 7l14 9l62 -61l35 33l-63 62l10 13q33 45 43 99zM809 72q-25 -23 -58 -35q-34 -14 -73 -14q-58 0 -107 31q-15 10 -26 21q-62 56 -62 139q0 79 57 135t138 56q8 0 21 -2 +q22 -2 45 -10q2 0 4 -1t3 -1q29 -11 58 -35q64 -58 64 -141q0 -86 -64 -143zM699 261q-10 4 -21 4q-22 0 -37.5 -15t-15.5 -36.5t15.5 -36.5t37.5 -15q11 0 21 4q15 7 23.5 19.5t8.5 28t-8.5 28.5t-23.5 19z" /> + <glyph glyph-name="uniE607" unicode="&#xe607;" horiz-adv-x="1027" +d="M50 665h521v-66h-521v66zM51 348h354v-66h-354v66zM51 29v-66h224v66h-218h-6zM389 8l-12 -94l88 47l17 29l-76 45zM955 787l-37 24q-8 5 -17 3t-14 -11l-44 -70l76 -46l43 69q5 8 3 17t-10 14zM428 72l75 -47l398 632l-76 46z" /> + <glyph glyph-name="uniE608" unicode="&#xe608;" +d="M520 851q-94 0 -179.5 -37t-147.5 -99t-98.5 -147.5t-36.5 -179.5t36.5 -179.5t98.5 -147.5t147.5 -98.5t179 -36.5t179 36.5t147.5 98.5t98.5 147.5t37 179.5t-36 179.5t-98.5 147.5t-147.5 99t-179.5 37zM520 -22q-111 0 -205.5 55t-149.5 150t-55 206t55 205.5 +t149.5 149.5t205.5 55t205.5 -55t149.5 -149.5t55 -205.5q0 -112 -55 -206.5t-149.5 -149.5t-205.5 -55zM752 650l-237 -236q-45 36 -102 36q-68 0 -116.5 -48.5t-48.5 -116.5t48.5 -116.5t116.5 -48.5t116.5 48.5t48.5 116.5q0 55 -33 98l80 81l41 -41l30 30l-41 41l45 45 +l50 -50l30 30l-50 50l52 51zM413 163q-51 0 -87 35.5t-36 86.5t36 87t87 36q50 0 86 -36t36 -87t-35.5 -86.5t-86.5 -35.5z" /> + </font> +</defs></svg> diff --git a/uam-web/public/fonts/iconfont.ttf b/uam-web/public/fonts/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..33a0eab246733a3373b922303d8cf8b3631e01fd Binary files /dev/null and b/uam-web/public/fonts/iconfont.ttf differ diff --git a/uam-web/public/fonts/iconfont.woff b/uam-web/public/fonts/iconfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..784c4fc6cb95c4186e41d968082c47edd4981a66 Binary files /dev/null and b/uam-web/public/fonts/iconfont.woff differ diff --git a/uam-web/public/img/avatar.png b/uam-web/public/img/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..9194bc420cd68758a3709558767db48b058162e6 Binary files /dev/null and b/uam-web/public/img/avatar.png differ diff --git a/uam-web/public/img/key.png b/uam-web/public/img/key.png new file mode 100644 index 0000000000000000000000000000000000000000..ab96a86053ccbce4542243532aadf7ddeb73f77b Binary files /dev/null and b/uam-web/public/img/key.png differ diff --git a/uam-web/public/img/lock.png b/uam-web/public/img/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..b99c9dcdbf6d2aad7e55c633c1c9db098e86ff11 Binary files /dev/null and b/uam-web/public/img/lock.png differ diff --git a/uam-web/public/img/login-bg.png b/uam-web/public/img/login-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..b66e4201ede533bccc50809d2db006a7fb25d98b Binary files /dev/null and b/uam-web/public/img/login-bg.png differ diff --git a/uam-web/public/img/logo.png b/uam-web/public/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6656106dc527760c418f32bd2686a6a19d71a5af Binary files /dev/null and b/uam-web/public/img/logo.png differ diff --git a/uam-web/public/img/token.png b/uam-web/public/img/token.png new file mode 100644 index 0000000000000000000000000000000000000000..fd8168d85aec12298bcec28a697cdb5018e6f1dc Binary files /dev/null and b/uam-web/public/img/token.png differ diff --git a/uam-web/public/img/unlock.png b/uam-web/public/img/unlock.png new file mode 100644 index 0000000000000000000000000000000000000000..afaa3ee0face7925a115659cf0f68dc322fa12c5 Binary files /dev/null and b/uam-web/public/img/unlock.png differ diff --git a/uam-web/public/resource/cidefault.png b/uam-web/public/resource/cidefault.png new file mode 100644 index 0000000000000000000000000000000000000000..9ff29e09bb2099c9fcd36c8af3f52aa674b2dfdb Binary files /dev/null and b/uam-web/public/resource/cidefault.png differ diff --git a/uam-web/public/robots.txt b/uam-web/public/robots.txt new file mode 100644 index 0000000000000000000000000000000000000000..f5916452e5ff6c8b43d6d7c73d00153d34ac35de --- /dev/null +++ b/uam-web/public/robots.txt @@ -0,0 +1,3 @@ +# http://www.robotstxt.org +User-agent: * +Disallow: diff --git a/uam-web/public/vendor/gojs/go.js b/uam-web/public/vendor/gojs/go.js new file mode 100644 index 0000000000000000000000000000000000000000..22c2a095af71695b83ae9654476a3e74fa28437d --- /dev/null +++ b/uam-web/public/vendor/gojs/go.js @@ -0,0 +1,164 @@ +(function(window){var g,da={};if(!window.document||void 0===window.document.createElement("canvas").getContext){throw window.console&&window.console.log("The HTML Canvas element is not supported in this browser,or this browser is in Compatibility mode."),Error("The HTML Canvas element is not supported in this browser,or this browser is in Compatibility mode.")}if(!Object.defineProperty){throw Error("GoJS requires a newer version of JavaScript")}Function.prototype.bind||(Function.prototype.bind=function(a){function b(){return f.apply(a,e.concat(d.call(arguments)))}function c(){}var d=Array.prototype.slice,e=d.call(arguments,1),f=this;c.prototype=this.prototype;b.prototype=new c;return b});(function(){for(var a=0,b=["ms","moz","webkit","o"],c=0;c<b.length&&!window.requestAnimationFrame;++c){window.requestAnimationFrame=window[b[c]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[b[c]+"CancelAnimationFrame"]||window[b[c]+"CancelRequestAnimationFrame"]}window.requestAnimationFrame||(window.requestAnimationFrame=function(b){var c=(new Date).getTime(),f=Math.max(8,16-(c-a)),h=window.setTimeout(function(){b(c+f)},f);a=c+f;return h});window.cancelAnimationFrame||(window.cancelAnimationFrame=function(a){window.clearTimeout(a)})})();da.Debug=null;var u={Yc:1,Ec:2,Nc:4,Mc:8,Hm:void 0!==window.navigator&&0<window.navigator.userAgent.indexOf("534.30")&&0<window.navigator.userAgent.indexOf("Android"),bH:void 0!==window.navigator&&0<window.navigator.userAgent.indexOf("MSIE 10.0"),cH:void 0!==window.navigator&&0<window.navigator.userAgent.indexOf("Trident/7"),IJ:void 0!==window.navigator&&0<window.navigator.userAgent.indexOf("Edge/"),Im:void 0!==window.navigator&&void 0!==window.navigator.platform&&0<=window.navigator.platform.toUpperCase().indexOf("MAC"),ND:void 0!==window.navigator&&void 0!==window.navigator.platform&&null!==window.navigator.platform.match(/(iPhone|iPod|iPad)/i),hD:function(a,b,c){var d=-1;return function(){var e=this,f=arguments;-1!==d&&u.clearTimeout(d);d=u.setTimeout(function(){d=-1;c||a.apply(e,f)},b);c&&!d&&a.apply(e,f)}},setTimeout:function(a,b){return window.setTimeout(a,b)},clearTimeout:function(a){window.clearTimeout(a)},setInterval:function(a,b){return window.setInterval(a,b)},clearInterval:function(a){window.clearInterval(a)},createElement:function(a){return window.document.createElement(a)},k:function(a){throw Error(a)},J:function(a,b){if(a.Ea){var c="The object is frozen, so its properties cannot be set: "+a.toString();void 0!==b&&(c+=" to value: "+b);u.k(c)}},C:function(a,b,c,d){a instanceof b||(c=u.getTypeName(c),void 0!==d&&(c+="."+d),u.Ld(a,b,c))},j:function(a,b,c,d){typeof a!==b&&(c=u.getTypeName(c),void 0!==d&&(c+="."+d),u.Ld(a,b,c))},Be:function(a,b,c){"number"===typeof a&&isFinite(a)||(b=u.getTypeName(b),void 0!==c&&(b+="."+c),u.k(b+" must be a real number type, and not NaN or Infinity: "+a))},rb:function(a,b,c,d){a instanceof ea&&a.Ce===b||(c=u.getTypeName(c),void 0!==d&&(c+="."+d),u.Ld(a,"a constant of class "+u.tg(b),c))},gJ:function(a,b){"string"===typeof a?fa(a)||u.k('Color "'+a+'" is not a valid color string for '+b):a instanceof ga||u.k("Value for "+b+" must be a color string or a Brush, not "+a)},Ld:function(a,b,c,d){b=u.getTypeName(b);c=u.getTypeName(c);void 0!==d&&(c+="."+d);"string"===typeof a?u.k(c+" value is not an instance of "+b+': "'+a+'"'):u.k(c+" value is not an instance of "+b+": "+a)},xa:function(a,b,c,d){c=u.getTypeName(c);void 0!==d&&(c+="."+d);u.k(c+" is not in the range "+b+": "+a)},Xc:function(a){u.k(u.tg(a)+" constructor cannot take any arguments.")},Nb:function(a){u.k("Collection was modified during iteration: "+a.toString()+"\n Perhaps you should iterate over a copy of the collection,\n or you could collect items to be removed from the collection after the iteration.")},trace:function(a){window.console&&window.console.log(a)},Ta:function(a){return"object"===typeof a&&null!==a},isArray:function(a){return Array.isArray(a)||a instanceof NodeList||a instanceof HTMLCollection},eH:function(a){return Array.isArray(a)},Sy:function(a,b,c){u.isArray(a)||u.Ld(a,"Array or NodeList or HTMLCollection",b,c)},qb:function(a){return a.length},Pk:function(a){return Array.prototype.slice.call(a)},ib:function(a,b){Array.isArray(a);return a[b]},RC:function(a,b,c){Array.isArray(a)?a[b]=c:u.k("Cannot replace an object in an HTMLCollection or NodeList at "+b)},Ry:function(a,b){if(Array.isArray(a)){return a.indexOf(b)}for(var c=a.length,d=0;d<c;d++){if(a[d]===b){return d}}return -1},zi:function(a,b,c){Array.isArray(a)?b>=a.length?a.push(c):a.splice(b,0,c):u.k("Cannot insert an object into an HTMLCollection or NodeList: "+c+" at "+b)},Ai:function(a,b){Array.isArray(a)?b>=a.length?a.pop():a.splice(b,1):u.k("Cannot remove an object from an HTMLCollection or NodeList at "+b)},Yw:[],K:function(){var a=u.Yw.pop();return void 0===a?new w:a},Yb:function(a,b){var c=u.Yw.pop();if(void 0===c){return new w(a,b)}c.x=a;c.y=b;return c},v:function(a){u.Yw.push(a)},yA:[],vl:function(){var a=u.yA.pop(); + return void 0===a?new ia:a},Oj:function(a){u.yA.push(a)},Zw:[],Tf:function(){var a=u.Zw.pop();return void 0===a?new z:a},Vj:function(a,b,c,d){var e=u.Zw.pop();if(void 0===e){return new z(a,b,c,d)}e.x=a;e.y=b;e.width=c;e.height=d;return e},ic:function(a){u.Zw.push(a)},zA:[],lh:function(){var a=u.zA.pop();return void 0===a?new ja:a},Ze:function(a){u.zA.push(a)},$w:null,p:function(){var a=u.$w;return null!==a?(u.$w=null,a):new ka},q:function(a){a.reset();u.$w=a},xA:[],hb:function(){var a=u.xA.pop();return void 0===a?[]:a},sa:function(a){a.length=0;u.xA.push(a)},nh:Object.freeze([]),zl:1,gc:function(a){a.__gohashid=u.zl++},Js:function(a){var b=a.__gohashid;void 0===b&&(b=u.zl++,a.__gohashid=b);return b},Uc:function(a){return a.__gohashid},fa:function(a,b){b.jx=a;da[a]=b},Ha:function(a,b){function c(){}c.prototype=b.prototype;a.prototype=new c;a.prototype.constructor=a},Nh:function(a){a.BF=!0},defineProperty:function(a,b,c,d,e){u.j(a,"function","Util.defineProperty:classfunc");u.j(b,"object","Util.defineProperty:propobj");u.j(c,"function","Util.defineProperty:getter");u.j(d,"function","Util.defineProperty:setter");for(var f in b){b=b[f];c={get:c,set:d};if(void 0!==e){for(var h in e){c[h]=e[h]}}Object.defineProperty(a.prototype,f,c);e=Object.getOwnPropertyDescriptor(a.prototype,f);b&&e&&Object.defineProperty(a.prototype,b,e);break}},II:!1,u:function(a,b,c,d){u.j(a,"function","Util.defineReadOnlyProperty:classfunc");u.j(b,"object","Util.defineReadOnlyProperty:propobj");u.j(c,"function","Util.defineReadOnlyProperty:getter");for(var e in b){var f=b[e];b={get:c,set:function(a){u.k('The property "'+f+'" is read-only and cannot be set to '+a)}};if(void 0!==d){for(var h in d){b[h]=d[h]}}Object.defineProperty(a.prototype,e,b);d=Object.getOwnPropertyDescriptor(a.prototype,e);f&&d&&Object.defineProperty(a.prototype,f,d);break}},Yd:function(a,b){for(var c in b){b[c]=!0}a.prototype.UB=b},getTypeName:function(a){return void 0===a?"":"string"===typeof a?a:"function"===typeof a?u.tg(a):null===a?"*":""},tg:function(a){if("function"===typeof a){if(a.jx){return a.jx}if(a.name){return a.name}var b=a.toString(),c=b.indexOf("("),b=b.substring(9,c).trim();if(""!==b){return a.jx=b}}else{if("object"===typeof a&&a.constructor){return u.tg(a.constructor)}}return typeof a},s:function(a,b,c){u.j(a,"function","Util.defineEnumValue:classfunc");u.j(b,"string","Util.defineEnumValue:name");u.j(c,"number","Util.defineEnumValue:num");c=new ea(a,b,c);Object.freeze(c);a[b]=c;var d=a.Et;d instanceof la||(d=new la("string",ea),a.Et=d);d.add(b,c);return c},sb:function(a,b){if(!a||!b){return null}var c=void 0;try{"function"===typeof b?c=b(a):"function"===typeof a.getAttribute?(c=a.getAttribute(b),null===c&&(c=void 0)):c=a[b]}catch(d){}return c},Pa:function(a,b,c){if(a&&b){try{"function"===typeof b?b(a,c):"function"===typeof a.setAttribute?a.setAttribute(b,c):a[b]=c}catch(d){}}},pt:function(a,b){u.j(a,"object","Setting properties requires Objects as arguments");u.j(b,"object","Setting properties requires Objects as arguments");var c=a instanceof B,d=a instanceof D,e;for(e in b){""===e&&u.k("Setting properties requires non-empty property names");var f=a,h=e;if(c||d){var k=e.indexOf(".");if(0<k){var l=e.substring(0,k);if(c){f=a.ke(l)}else{if(f=a[l],void 0===f||null===f){f=a.tb[l]}}u.Ta(f)?h=e.substr(k+1):u.k("Unable to find object named: "+l+" in "+a.toString()+" when trying to set property: "+e)}}if("_"!==h[0]&&!u.kz(f,h)){if(d&&u.kz(a.tb,h)){f=a.tb}else{if(d&&ma(a,h)){a.My(h,b[h]);continue}else{u.k('Trying to set undefined property "'+h+'" on object: '+f.toString())}}}f[h]=b[e];"_"===h[0]&&(k=f.Fl,u.isArray(k)||(k=[],f.Fl=k),k.push(h))}},kz:function(a,b){if(a.hasOwnProperty(b)){return !0}for(var c=Object.getPrototypeOf(a);c&&c!==Function;){if(c.hasOwnProperty(b)){return !0}var d=c.UB;if(d&&d[b]){return !0}c=Object.getPrototypeOf(c)}return !1},VC:function(a,b){if(!u.Ta(b)||b instanceof Element||b instanceof CanvasRenderingContext2D||b instanceof oa||b instanceof pa){return""}var c="",d;for(d in b){if("string"!==typeof d){""===c&&(c=b+"\n"),c+=" "+d+" is not a string property\n"}else{if("_"!==d.charAt(0)&&!(2>=d.length)){var e=u.sb(b,d);null===e||"function"===typeof e||u.kz(b,d)||(""===c&&(c=b+"\n"),c+=' unknown property "'+d+'" has value: '+e+" at "+a+"\n")}}}return c},Lv:function(a,b){if(null!==b&&"number"!==typeof b&&"string"!==typeof b&&"boolean"!==typeof b&&"function"!==typeof b){if(void 0!==u.Uc(b)){if(!u.dv.contains(b)){if(u.dv.add(b),u.Lu.add(u.VC(a,b)),b instanceof E||b instanceof F||b instanceof la){for(var c=b.i;c.next();){u.Lv(a+"["+c.key+"]",c.value)}}else{for(c in b){var d=u.sb(b,c);if(void 0!==d&&null!==d&&u.Ta(d)&&d!==b.UB){if(b instanceof qa){if(d===b.ej){continue}}else{if(b instanceof B){if("data"===c||d===b.sh){continue}if("itemArray"===c||d===b.hi){continue}if(b instanceof G&&d===b.Bk){continue}}else{if(!(b instanceof D)){if(b instanceof sa){if("archetypeGroupData"===c||d===b.ex){continue}}else{if(b instanceof ta){if("archetypeLinkData"===c||d===b.hx){continue +}if("archetypeLabelNodeData"===c||d===b.gx){continue}}else{if(b instanceof va){if("archetypeNodeData"===c||d===b.ik){continue}}else{if(b instanceof J){if("nodeDataArray"===c||d===b.of){continue}if("linkDataArray"===c||d===b.Dh||d===b.Vl){continue}if(d===b.sc){continue}if(d===b.wh){continue}}else{if(b instanceof xa||b instanceof ya||b instanceof Aa){continue}}}}}}}}u.Lv(a+"."+c,d)}}}}}else{if(Array.isArray(b)){for(c=0;c<b.length;c++){u.Lv(a+"["+c+"]",b[c])}}else{u.Lu.add(u.VC(a,b))}}}},check:function(a){void 0===u.dv?u.dv=new F(Object):u.dv.clear();u.Lu=new Ca;u.Lv("",a);a=u.Lu.toString();u.Lu=null;return a},RH:function(a){for(var b=[],c=0;256>c;c++){b[c]=c}for(var d=0,e=0,c=0;256>c;c++){d=(d+b[c]+119)%256,e=b[c],b[c]=b[d],b[d]=e}for(var d=c=0,f="",h=0;h<a.length;h++){c=(c+1)%256,d=(d+b[c])%256,e=b[c],b[c]=b[d],b[d]=e,f+=String.fromCharCode(a.charCodeAt(h)^b[(b[c]+b[d])%256])}return f},QG:function(a){for(var b=[],c=0;256>c;c++){b["0123456789abcdef".charAt(c>>4)+"0123456789abcdef".charAt(c&15)]=String.fromCharCode(c)}a.length%2&&(a="0"+a);for(var d=[],e=0,c=0;c<a.length;c+=2){d[e++]=b[a.substr(c,2)]}a=d.join("");return""===a?"0":a},Fa:function(a){return u.RH(u.QG(a))},xl:null,adym:"7da71ca0ad381e90",YF:"@COLOR1",ZF:"@COLOR2"};u.xl=function(){var a=window.document.createElement("canvas"),b=a.getContext("2d");b[u.Fa("7ca11abfd022028846")]=u.Fa("398c3597c01238");for(var c=["5da73c80a3330d854f9e5e671d6633","32ab5ff3b26f42dc0ed90f22422913b54ae6247590da4bb21c324ba3a84e385776","54a702f3e53909c447824c6706603faf4cfb236cdfda5de14c134ba1a95a2d4c7cc6f93c1387","74bf19bce72555874c86"],d=1;5>d;d++){b[u.Fa("7ca11abfd7330390")](u.Fa(c[d-1]),10,15*d+0)}b[u.Fa("7ca11abfd022028846")]=u.Fa("39f046ebb36e4b");for(d=1;5>d;d++){b[u.Fa("7ca11abfd7330390")](u.Fa(c[d-1]),10,15*d+0)}if(4!==c.length||"5"!==c[0][0]||"7"!==c[3][0]){u.s=function(a,b){var c=new ea(a,b,2);Object.freeze(c);a[b]=c;var d=a.Et;d instanceof la||(d=new la("string",ea),a.Et=d);d.add(b,c);return c}}return a}();function ea(a,b,c){u.gc(this);this.HA=a;this.Vb=b;this.GF=c}ea.prototype.toString=function(){return u.tg(this.HA)+"."+this.Vb};u.u(ea,{Ce:"classType"},function(){return this.HA});u.u(ea,{name:"name"},function(){return this.Vb});u.u(ea,{value:"value"},function(){return this.GF});var Da;ea.findName=Da=function(a,b){if(null===b||""===b){return null}u.j(a,"function","findName:classfunc");u.j(b,"string","EnumValue.findName:name");var c=a.Et;return c instanceof la?c.ua(b):null};function Ca(){this.FA=[]}Ca.prototype.toString=function(){return this.FA.join("")};Ca.prototype.add=function(a){""!==a&&this.FA.push(a)};function pa(){}function Fa(a){void 0===a&&(a=42);this.seed=a;this.Rw=48271;this.Dt=2147483647;this.vA=this.Dt/this.Rw;this.hF=this.Dt%this.Rw;this.dF=1/this.Dt;this.random()}Fa.prototype.random=function(){var a=this.seed%this.vA*this.Rw-this.seed/this.vA*this.hF;this.seed=0<a?a:a+this.Dt;return this.seed*this.dF};function Ha(){}u.u(Ha,{i:"iterator"},function(){return this});Ha.prototype.reset=Ha.prototype.reset=function(){};Ha.prototype.next=Ha.prototype.hasNext=Ha.prototype.next=function(){return !1};Ha.prototype.first=Ha.prototype.first=function(){return null};Ha.prototype.any=function(){return !1};Ha.prototype.all=function(){return !0};Ha.prototype.each=function(){};u.u(Ha,{count:"count"},function(){return 0});Ha.prototype.Xf=function(){};Ha.prototype.toString=function(){return"EmptyIterator"};var Ia=new Ha;function Ja(a){this.key=-1;this.value=a}u.Yd(Ja,{key:!0,value:!0});u.u(Ja,{i:"iterator"},function(){return this});Ja.prototype.reset=Ja.prototype.reset=function(){this.key=-1};Ja.prototype.next=Ja.prototype.hasNext=Ja.prototype.next=function(){return -1===this.key?(this.key=0,!0):!1};Ja.prototype.first=Ja.prototype.first=function(){this.key=0;return this.value};Ja.prototype.any=function(a){this.key=-1;return a(this.value)};Ja.prototype.all=function(a){this.key=-1;return a(this.value)};Ja.prototype.each=function(a){this.key=-1;a(this.value)};u.u(Ja,{count:"count"},function(){return 1});Ja.prototype.Xf=function(){this.value=null};Ja.prototype.toString=function(){return"SingletonIterator("+this.value+")"};function Ka(a){this.zd=a;this.sj=null;this.reset()}u.Yd(Ka,{key:!0,value:!0});u.u(Ka,{i:"iterator"},function(){return this});u.defineProperty(Ka,{Om:"predicate"},function(){return this.sj},function(a){this.sj=a});Ka.prototype.reset=Ka.prototype.reset=function(){var a=this.zd;a.yd=null;this.Ya=a.T;this.wd=-1};Ka.prototype.next=Ka.prototype.hasNext=Ka.prototype.next=function(){var a=this.zd;if(a.T!==this.Ya){if(0>this.key){return !1}u.Nb(a)}var a=a.n,b=a.length,c=++this.wd,d=this.sj;if(null!==d){for(;c<b;){var e=a[c];if(d(e)){return this.key=this.wd=c,this.value=e,!0}c++}}else{if(c<b){return this.key=c,this.value=a[c],!0}this.Xf()}return !1};Ka.prototype.first=Ka.prototype.first=function(){var a=this.zd;this.Ya=a.T;this.wd=0;var a=a.n,b=a.length,c=this.sj;if(null!==c){for(var d=0;d<b;){var e=a[d];if(c(e)){return this.key=this.wd=d,this.value=e}d++}return null +}return 0<b?(e=a[0],this.key=0,this.value=e):null};Ka.prototype.any=function(a){var b=this.zd;b.yd=null;var c=b.T;this.wd=-1;for(var d=b.n,e=d.length,f=this.sj,h=0;h<e;h++){var k=d[h];if(null===f||f(k)){if(a(k)){return !0}b.T!==c&&u.Nb(b)}}return !1};Ka.prototype.all=function(a){var b=this.zd;b.yd=null;var c=b.T;this.wd=-1;for(var d=b.n,e=d.length,f=this.sj,h=0;h<e;h++){var k=d[h];if(null===f||f(k)){if(!a(k)){return !1}b.T!==c&&u.Nb(b)}}return !0};Ka.prototype.each=function(a){var b=this.zd;b.yd=null;var c=b.T;this.wd=-1;for(var d=b.n,e=d.length,f=this.sj,h=0;h<e;h++){var k=d[h];if(null===f||f(k)){a(k),b.T!==c&&u.Nb(b)}}};u.u(Ka,{count:"count"},function(){var a=this.sj;if(null!==a){for(var b=0,c=this.zd.n,d=c.length,e=0;e<d;e++){a(c[e])&&b++}return b}return this.zd.n.length});Ka.prototype.Xf=function(){this.key=-1;this.value=null;this.Ya=-1;this.sj=null;this.zd.yd=this};Ka.prototype.toString=function(){return"ListIterator@"+this.wd+"/"+this.zd.count};function La(a){this.zd=a;this.reset()}u.Yd(La,{key:!0,value:!0});u.u(La,{i:"iterator"},function(){return this});La.prototype.reset=La.prototype.reset=function(){var a=this.zd;a.Kn=null;this.Ya=a.T;this.wd=a.n.length};La.prototype.next=La.prototype.hasNext=La.prototype.next=function(){var a=this.zd;if(a.T!==this.Ya){if(0>this.key){return !1}u.Nb(a)}var b=--this.wd;if(0<=b){return this.key=b,this.value=a.n[b],!0}this.Xf();return !1};La.prototype.first=La.prototype.first=function(){var a=this.zd;this.Ya=a.T;var b=a.n;this.wd=a=b.length-1;return 0<=a?(b=b[a],this.key=a,this.value=b):null};La.prototype.any=function(a){var b=this.zd;b.Kn=null;var c=b.T,d=b.n,e=d.length;this.wd=e;for(e-=1;0<=e;e--){if(a(d[e])){return !0}b.T!==c&&u.Nb(b)}return !1};La.prototype.all=function(a){var b=this.zd;b.Kn=null;var c=b.T,d=b.n,e=d.length;this.wd=e;for(e-=1;0<=e;e--){if(!a(d[e])){return !1}b.T!==c&&u.Nb(b)}return !0};La.prototype.each=function(a){var b=this.zd;b.Kn=null;var c=b.T,d=b.n,e=d.length;this.wd=e;for(e-=1;0<=e;e--){a(d[e]),b.T!==c&&u.Nb(b)}};u.u(La,{count:"count"},function(){return this.zd.n.length});La.prototype.Xf=function(){this.key=-1;this.value=null;this.Ya=-1;this.zd.Kn=this};La.prototype.toString=function(){return"ListIteratorBackwards("+this.wd+"/"+this.zd.count+")"};function E(a){u.gc(this);this.Ea=!1;this.n=[];this.T=0;this.Kn=this.yd=null;void 0===a||null===a?this.pa=null:"string"===typeof a?"object"===a||"string"===a||"number"===a||"boolean"===a||"function"===a?this.pa=a:u.xa(a,"the string 'object', 'number', 'string', 'boolean', or 'function'","List constructor: type"):"function"===typeof a?this.pa=a===Object?"object":a===String?"string":a===Number?"number":a===Boolean?"boolean":a===Function?"function":a:u.xa(a,"null, a primitive type name, or a class type","List constructor: type")}u.fa("List",E);E.prototype.Qd=function(){var a=this.T;a++;999999999<a&&(a=0);this.T=a};E.prototype.freeze=E.prototype.freeze=function(){this.Ea=!0;return this};E.prototype.thaw=E.prototype.Ma=function(){this.Ea=!1;return this};E.prototype.toString=function(){return"List("+u.getTypeName(this.pa)+")#"+u.Uc(this)};E.prototype.add=E.prototype.push=E.prototype.add=function(a){null!==a&&(u.J(this,a),this.n.push(a),this.Qd())};E.prototype.addAll=E.prototype.Ud=function(a){if(null===a){return this}u.J(this);var b=this.n;if(u.isArray(a)){for(var c=u.qb(a),d=0;d<c;d++){var e=u.ib(a,d);b.push(e)}}else{for(a=a.i;a.next();){e=a.value,b.push(e)}}this.Qd();return this};E.prototype.clear=E.prototype.clear=function(){u.J(this);this.n.length=0;this.Qd()};E.prototype.contains=E.prototype.has=E.prototype.contains=function(a){return null===a?!1:-1!==this.n.indexOf(a)};E.prototype.indexOf=E.prototype.indexOf=function(a){return null===a?-1:this.n.indexOf(a)};E.prototype.elt=E.prototype.get=E.prototype.ja=function(a){var b=this.n;(0>a||a>=b.length)&&u.xa(a,"0 <= i < length",E,"elt:i");return b[a]};E.prototype.setElt=E.prototype.set=E.prototype.Dg=function(a,b){var c=this.n;(0>a||a>=c.length)&&u.xa(a,"0 <= i < length",E,"setElt:i");u.J(this,a);c[a]=b};E.prototype.first=E.prototype.first=function(){var a=this.n;return 0===a.length?null:a[0]};E.prototype.last=E.prototype.Jd=function(){var a=this.n,b=a.length;return 0<b?a[b-1]:null};E.prototype.pop=E.prototype.pop=function(){u.J(this);var a=this.n;return 0<a.length?a.pop():null};E.prototype.any=function(a){for(var b=this.n,c=this.T,d=b.length,e=0;e<d;e++){if(a(b[e])){return !0}this.T!==c&&u.Nb(this)}return !1};E.prototype.all=function(a){for(var b=this.n,c=this.T,d=b.length,e=0;e<d;e++){if(!a(b[e])){return !1}this.T!==c&&u.Nb(this)}return !0};E.prototype.each=function(a){for(var b=this.n,c=this.T,d=b.length,e=0;e<d;e++){a(b[e]),this.T!==c&&u.Nb(this)}};E.prototype.insertAt=E.prototype.Zd=function(a,b){0>a&&u.xa(a,">= 0",E,"insertAt:i");u.J(this,a);var c=this.n;a>=c.length?c.push(b):c.splice(a,0,b);this.Qd();return !0};E.prototype.remove=E.prototype["delete"]=E.prototype.remove=function(a){if(null===a){return !1}u.J(this,a);var b=this.n;a=b.indexOf(a);if(-1===a){return !1 +}a===b.length-1?b.pop():b.splice(a,1);this.Qd();return !0};E.prototype.removeAt=E.prototype.kd=function(a){var b=this.n;(0>a||a>=b.length)&&u.xa(a,"0 <= i < length",E,"removeAt:i");u.J(this,a);a===b.length-1?b.pop():b.splice(a,1);this.Qd()};E.prototype.removeRange=E.prototype.removeRange=function(a,b){var c=this.n;(0>a||a>=c.length)&&u.xa(a,"0 <= from < length",E,"elt:from");(0>b||b>=c.length)&&u.xa(b,"0 <= to < length",E,"elt:to");u.J(this,a);var d=c.slice((b||a)+1||c.length);c.length=0>a?c.length+a:a;c.push.apply(c,d);this.Qd()};E.prototype.copy=function(){for(var a=new E(this.pa),b=this.n,c=this.count,d=0;d<c;d++){a.add(b[d])}return a};E.prototype.toArray=E.prototype.Le=function(){for(var a=this.n,b=this.count,c=Array(b),d=0;d<b;d++){c[d]=a[d]}return c};E.prototype.toSet=function(){for(var a=new F(this.pa),b=this.n,c=this.count,d=0;d<c;d++){a.add(b[d])}return a};E.prototype.sort=E.prototype.sort=function(a){u.J(this);this.n.sort(a);this.Qd();return this};E.prototype.sortRange=E.prototype.jp=function(a,b,c){var d=this.n,e=d.length;void 0===b&&(b=0);void 0===c&&(c=e);u.J(this);var f=c-b;if(1>=f){return this}(0>b||b>=e-1)&&u.xa(b,"0 <= from < length",E,"sortRange:from");if(2===f){return c=d[b],e=d[b+1],0<a(c,e)&&(d[b]=e,d[b+1]=c,this.Qd()),this}if(0===b){if(c>=e){d.sort(a)}else{for(f=d.slice(0,c),f.sort(a),a=0;a<c;a++){d[a]=f[a]}}}else{if(c>=e){for(f=d.slice(b),f.sort(a),a=b;a<e;a++){d[a]=f[a-b]}}else{for(f=d.slice(b,c),f.sort(a),a=b;a<c;a++){d[a]=f[a-b]}}}this.Qd();return this};E.prototype.reverse=E.prototype.reverse=function(){u.J(this);this.n.reverse();this.Qd();return this};u.u(E,{count:"count"},function(){return this.n.length});u.u(E,{size:"size"},function(){return this.n.length});u.u(E,{length:"length"},function(){return this.n.length});u.u(E,{i:"iterator"},function(){if(0>=this.n.length){return Ia}var a=this.yd;return null!==a?(a.reset(),a):new Ka(this)});u.u(E,{Jm:"iteratorBackwards"},function(){if(0>=this.n.length){return Ia}var a=this.Kn;return null!==a?(a.reset(),a):new La(this)});function Ma(a){this.Gk=a;this.reset()}u.Yd(Ma,{key:!0,value:!0});u.u(Ma,{i:"iterator"},function(){return this});Ma.prototype.reset=Ma.prototype.reset=function(){var a=this.Gk;a.yd=null;this.Ya=a.T;this.Cb=null};Ma.prototype.next=Ma.prototype.hasNext=Ma.prototype.next=function(){var a=this.Gk;if(a.T!==this.Ya){if(null===this.key){return !1}u.Nb(a)}var b=this.Cb,b=null===b?a.cb:b.Sb;if(null!==b){return this.Cb=b,this.value=b.value,this.key=b.key,!0}this.Xf();return !1};Ma.prototype.first=Ma.prototype.first=function(){var a=this.Gk;this.Ya=a.T;a=a.cb;if(null!==a){this.Cb=a;var b=a.value;this.key=a.key;return this.value=b}return null};Ma.prototype.any=function(a){var b=this.Gk;b.yd=null;var c=b.T;this.Cb=null;for(var d=b.cb;null!==d;){if(a(d.value)){return !0}b.T!==c&&u.Nb(b);d=d.Sb}return !1};Ma.prototype.all=function(a){var b=this.Gk;b.yd=null;var c=b.T;this.Cb=null;for(var d=b.cb;null!==d;){if(!a(d.value)){return !1}b.T!==c&&u.Nb(b);d=d.Sb}return !0};Ma.prototype.each=function(a){var b=this.Gk;b.yd=null;var c=b.T;this.Cb=null;for(var d=b.cb;null!==d;){a(d.value),b.T!==c&&u.Nb(b),d=d.Sb}};u.u(Ma,{count:"count"},function(){return this.Gk.$c});Ma.prototype.Xf=function(){this.value=this.key=null;this.Ya=-1;this.Gk.yd=this};Ma.prototype.toString=function(){return null!==this.Cb?"SetIterator@"+this.Cb.value:"SetIterator"};function F(a){u.gc(this);this.Ea=!1;void 0===a||null===a?this.pa=null:"string"===typeof a?"object"===a||"string"===a||"number"===a?this.pa=a:u.xa(a,"the string 'object', 'number' or 'string'","Set constructor: type"):"function"===typeof a?this.pa=a===Object?"object":a===String?"string":a===Number?"number":a:u.xa(a,"null, a primitive type name, or a class type","Set constructor: type");this.ad={};this.$c=0;this.yd=null;this.T=0;this.Ch=this.cb=null}u.fa("Set",F);F.prototype.Qd=function(){var a=this.T;a++;999999999<a&&(a=0);this.T=a};F.prototype.freeze=F.prototype.freeze=function(){this.Ea=!0;return this};F.prototype.thaw=F.prototype.Ma=function(){this.Ea=!1;return this};F.prototype.toString=function(){return"Set("+u.getTypeName(this.pa)+")#"+u.Uc(this)};F.prototype.add=F.prototype.add=function(a){if(null===a){return !1}u.J(this,a);var b=a;u.Ta(a)&&(b=u.Js(a));return void 0===this.ad[b]?(this.$c++,a=new Pa(a,a),this.ad[b]=a,b=this.Ch,null===b?this.cb=a:(a.Wn=b,b.Sb=a),this.Ch=a,this.Qd(),!0):!1};F.prototype.addAll=F.prototype.Ud=function(a){if(null===a){return this}u.J(this);if(u.isArray(a)){for(var b=u.qb(a),c=0;c<b;c++){this.add(u.ib(a,c))}}else{for(a=a.i;a.next();){this.add(a.value)}}return this};F.prototype.contains=F.prototype.has=F.prototype.contains=function(a){if(null===a){return !1}var b=a;return u.Ta(a)&&(b=u.Uc(a),void 0===b)?!1:void 0!==this.ad[b]};F.prototype.containsAll=function(a){if(null===a){return !0}for(a=a.i;a.next();){if(!this.contains(a.value)){return !1}}return !0};F.prototype.containsAny=function(a){if(null===a){return !0}for(a=a.i;a.next();){if(this.contains(a.value)){return !0}}return !1 +};F.prototype.first=F.prototype.first=function(){var a=this.cb;return null===a?null:a.value};F.prototype.any=function(a){for(var b=this.T,c=this.cb;null!==c;){if(a(c.value)){return !0}this.T!==b&&u.Nb(this);c=c.Sb}return !1};F.prototype.all=function(a){for(var b=this.T,c=this.cb;null!==c;){if(!a(c.value)){return !1}this.T!==b&&u.Nb(this);c=c.Sb}return !0};F.prototype.each=function(a){for(var b=this.T,c=this.cb;null!==c;){a(c.value),this.T!==b&&u.Nb(this),c=c.Sb}};F.prototype.remove=F.prototype["delete"]=F.prototype.remove=function(a){if(null===a){return !1}u.J(this,a);var b=a;if(u.Ta(a)&&(b=u.Uc(a),void 0===b)){return !1}a=this.ad[b];if(void 0===a){return !1}var c=a.Sb,d=a.Wn;null!==c&&(c.Wn=d);null!==d&&(d.Sb=c);this.cb===a&&(this.cb=c);this.Ch===a&&(this.Ch=d);delete this.ad[b];this.$c--;this.Qd();return !0};F.prototype.removeAll=F.prototype.kE=function(a){if(null===a){return this}u.J(this);if(u.isArray(a)){for(var b=u.qb(a),c=0;c<b;c++){this.remove(u.ib(a,c))}}else{for(a=a.i;a.next();){this.remove(a.value)}}return this};F.prototype.retainAll=function(a){if(null===a||0===this.count){return this}u.J(this);var b=new F(this.pa);b.Ud(a);a=new E(this.pa);for(var c=this.i;c.next();){b.contains(c.value)||a.add(c.value)}for(b=a.i;b.next();){this.remove(b.value)}return this};F.prototype.clear=F.prototype.clear=function(){u.J(this);this.ad={};this.$c=0;this.Ch=this.cb=null;this.Qd()};F.prototype.copy=function(){var a=new F(this.pa),b=this.ad,c;for(c in b){a.add(b[c].value)}return a};F.prototype.toArray=F.prototype.Le=function(){var a=Array(this.$c),b=this.ad,c=0,d;for(d in b){a[c]=b[d].value,c++}return a};F.prototype.toList=function(){var a=new E(this.pa),b=this.ad,c;for(c in b){a.add(b[c].value)}return a};u.u(F,{count:"count"},function(){return this.$c});u.u(F,{size:"size"},function(){return this.$c});u.u(F,{i:"iterator"},function(){if(0>=this.$c){return Ia}var a=this.yd;return null!==a?(a.reset(),a):new Ma(this)});function Qa(a){this.Xa=a;this.reset()}u.Yd(Qa,{key:!0,value:!0});u.u(Qa,{i:"iterator"},function(){return this});Qa.prototype.reset=Qa.prototype.reset=function(){this.Ya=this.Xa.T;this.Cb=null};Qa.prototype.next=Qa.prototype.hasNext=Qa.prototype.next=function(){var a=this.Xa;if(a.T!==this.Ya){if(null===this.key){return !1}u.Nb(a)}var b=this.Cb,b=null===b?a.cb:b.Sb;if(null!==b){return this.Cb=b,this.value=this.key=a=b.key,!0}this.Xf();return !1};Qa.prototype.first=Qa.prototype.first=function(){var a=this.Xa;this.Ya=a.T;a=a.cb;return null!==a?(this.Cb=a,this.value=this.key=a=a.key):null};Qa.prototype.any=function(a){var b=this.Xa,c=b.T;this.Cb=null;for(var d=b.cb;null!==d;){if(a(d.key)){return !0}b.T!==c&&u.Nb(b);d=d.Sb}return !1};Qa.prototype.all=function(a){var b=this.Xa,c=b.T;this.Cb=null;for(var d=b.cb;null!==d;){if(!a(d.key)){return !1}b.T!==c&&u.Nb(b);d=d.Sb}return !0};Qa.prototype.each=function(a){var b=this.Xa,c=b.T;this.Cb=null;for(var d=b.cb;null!==d;){a(d.key),b.T!==c&&u.Nb(b),d=d.Sb}};u.u(Qa,{count:"count"},function(){return this.Xa.$c});Qa.prototype.Xf=function(){this.value=this.key=null;this.Ya=-1};Qa.prototype.toString=function(){return null!==this.Cb?"MapKeySetIterator@"+this.Cb.value:"MapKeySetIterator"};function Ra(a){u.gc(this);this.Ea=!0;this.Xa=a}u.Ha(Ra,F);Ra.prototype.freeze=function(){return this};Ra.prototype.Ma=function(){return this};Ra.prototype.toString=function(){return"MapKeySet("+this.Xa.toString()+")"};Ra.prototype.add=Ra.prototype.set=Ra.prototype.add=function(){u.k("This Set is read-only: "+this.toString());return !1};Ra.prototype.contains=Ra.prototype.has=Ra.prototype.contains=function(a){return this.Xa.contains(a)};Ra.prototype.remove=Ra.prototype["delete"]=Ra.prototype.remove=function(){u.k("This Set is read-only: "+this.toString());return !1};Ra.prototype.clear=Ra.prototype.clear=function(){u.k("This Set is read-only: "+this.toString())};Ra.prototype.first=Ra.prototype.first=function(){var a=this.Xa.cb;return null!==a?a.key:null};Ra.prototype.any=function(a){for(var b=this.Xa.cb;null!==b;){if(a(b.key)){return !0}b=b.Sb}return !1};Ra.prototype.all=function(a){for(var b=this.Xa.cb;null!==b;){if(!a(b.key)){return !1}b=b.Sb}return !0};Ra.prototype.each=function(a){for(var b=this.Xa.cb;null!==b;){a(b.key),b=b.Sb}};Ra.prototype.copy=function(){return new Ra(this.Xa)};Ra.prototype.toSet=function(){var a=new F(this.Xa.yq),b=this.Xa.ad,c;for(c in b){a.add(b[c].key)}return a};Ra.prototype.toArray=Ra.prototype.Le=function(){var a=this.Xa.ad,b=Array(this.Xa.$c),c=0,d;for(d in a){b[c]=a[d].key,c++}return b};Ra.prototype.toList=function(){var a=new E(this.pa),b=this.Xa.ad,c;for(c in b){a.add(b[c].key)}return a};u.u(Ra,{count:"count"},function(){return this.Xa.$c});u.u(Ra,{size:"size"},function(){return this.Xa.$c});u.u(Ra,{i:"iterator"},function(){return 0>=this.Xa.$c?Ia:new Qa(this.Xa)});function Sa(a){this.Xa=a;this.reset()}u.Yd(Sa,{key:!0,value:!0});u.u(Sa,{i:"iterator"},function(){return this});Sa.prototype.reset=Sa.prototype.reset=function(){var a=this.Xa;a.Ln=null;this.Ya=a.T; + this.Cb=null};Sa.prototype.next=Sa.prototype.hasNext=Sa.prototype.next=function(){var a=this.Xa;if(a.T!==this.Ya){if(null===this.key){return !1}u.Nb(a)}var b=this.Cb,b=null===b?a.cb:b.Sb;if(null!==b){return this.Cb=b,this.value=b.value,this.key=b.key,!0}this.Xf();return !1};Sa.prototype.first=Sa.prototype.first=function(){var a=this.Xa;this.Ya=a.T;a=a.cb;if(null!==a){this.Cb=a;var b=a.value;this.key=a.key;return this.value=b}return null};Sa.prototype.any=function(a){var b=this.Xa;b.Ln=null;var c=b.T;this.Cb=null;for(var d=b.cb;null!==d;){if(a(d.value)){return !0}b.T!==c&&u.Nb(b);d=d.Sb}return !1};Sa.prototype.all=function(a){var b=this.Xa;b.Ln=null;var c=b.T;this.Cb=null;for(var d=b.cb;null!==d;){if(!a(d.value)){return !1}b.T!==c&&u.Nb(b);d=d.Sb}return !0};Sa.prototype.each=function(a){var b=this.Xa;b.Ln=null;var c=b.T;this.Cb=null;for(var d=b.cb;null!==d;){a(d.value),b.T!==c&&u.Nb(b),d=d.Sb}};u.u(Sa,{count:"count"},function(){return this.Xa.$c});Sa.prototype.Xf=function(){this.value=this.key=null;this.Ya=-1;this.Xa.Ln=this};Sa.prototype.toString=function(){return null!==this.Cb?"MapValueSetIterator@"+this.Cb.value:"MapValueSetIterator"};function Pa(a,b){this.key=a;this.value=b;this.Wn=this.Sb=null}u.Yd(Pa,{key:!0,value:!0});Pa.prototype.toString=function(){return"{"+this.key+":"+this.value+"}"};function Ua(a){this.Xa=a;this.reset()}u.Yd(Ua,{key:!0,value:!0});u.u(Ua,{i:"iterator"},function(){return this});Ua.prototype.reset=Ua.prototype.reset=function(){var a=this.Xa;a.yd=null;this.Ya=a.T;this.Cb=null};Ua.prototype.next=Ua.prototype.hasNext=Ua.prototype.next=function(){var a=this.Xa;if(a.T!==this.Ya){if(null===this.key){return !1}u.Nb(a)}var b=this.Cb,b=null===b?a.cb:b.Sb;if(null!==b){return this.Cb=b,this.key=b.key,this.value=b.value,!0}this.Xf();return !1};Ua.prototype.first=Ua.prototype.first=function(){var a=this.Xa;this.Ya=a.T;a=a.cb;return null!==a?(this.Cb=a,this.key=a.key,this.value=a.value,a):null};Ua.prototype.any=function(a){var b=this.Xa;b.yd=null;var c=b.T;this.Cb=null;for(var d=b.cb;null!==d;){if(a(d)){return !0}b.T!==c&&u.Nb(b);d=d.Sb}return !1};Ua.prototype.all=function(a){var b=this.Xa;b.yd=null;var c=b.T;this.Cb=null;for(var d=b.cb;null!==d;){if(!a(d)){return !1}b.T!==c&&u.Nb(b);d=d.Sb}return !0};Ua.prototype.each=function(a){var b=this.Xa;b.yd=null;var c=b.T;this.Cb=null;for(var d=b.cb;null!==d;){a(d),b.T!==c&&u.Nb(b),d=d.Sb}};u.u(Ua,{count:"count"},function(){return this.Xa.$c});Ua.prototype.Xf=function(){this.value=this.key=null;this.Ya=-1;this.Xa.yd=this};Ua.prototype.toString=function(){return null!==this.Cb?"MapIterator@"+this.Cb:"MapIterator"};function la(a,b){u.gc(this);this.Ea=!1;void 0===a||null===a?this.yq=null:"string"===typeof a?"object"===a||"string"===a||"number"===a?this.yq=a:u.xa(a,"the string 'object', 'number' or 'string'","Map constructor: keytype"):"function"===typeof a?this.yq=a===Object?"object":a===String?"string":a===Number?"number":a:u.xa(a,"null, a primitive type name, or a class type","Map constructor: keytype");void 0===b||null===b?this.uv=null:"string"===typeof b?"object"===b||"string"===b||"boolean"===b||"number"===b||"function"===b?this.uv=b:u.xa(b,"the string 'object', 'number', 'string', 'boolean', or 'function'","Map constructor: valtype"):"function"===typeof b?this.uv=b===Object?"object":b===String?"string":b===Number?"number":b===Boolean?"boolean":b===Function?"function":b:u.xa(b,"null, a primitive type name, or a class type","Map constructor: valtype");this.ad={};this.$c=0;this.Ln=this.yd=null;this.T=0;this.Ch=this.cb=null}u.fa("Map",la);la.prototype.Qd=function(){var a=this.T;a++;999999999<a&&(a=0);this.T=a};la.prototype.freeze=la.prototype.freeze=function(){this.Ea=!0;return this};la.prototype.thaw=la.prototype.Ma=function(){this.Ea=!1;return this};la.prototype.toString=function(){return"Map("+u.getTypeName(this.yq)+","+u.getTypeName(this.uv)+")#"+u.Uc(this)};la.prototype.add=la.prototype.set=la.prototype.add=function(a,b){u.J(this,a);var c=a;u.Ta(a)&&(c=u.Js(a));var d=this.ad[c];if(void 0===d){return this.$c++,d=new Pa(a,b),this.ad[c]=d,c=this.Ch,null===c?this.cb=d:(d.Wn=c,c.Sb=d),this.Ch=d,this.Qd(),!0}d.value=b;return !1};la.prototype.addAll=la.prototype.Ud=function(a){if(null===a){return this}if(u.isArray(a)){for(var b=u.qb(a),c=0;c<b;c++){var d=u.ib(a,c);this.add(d.key,d.value)}}else{for(a=a.i;a.next();){this.add(a.key,a.value)}}return this};la.prototype.first=la.prototype.first=function(){return this.cb};la.prototype.any=function(a){for(var b=this.T,c=this.cb;null!==c;){if(a(c)){return !0}this.T!==b&&u.Nb(this);c=c.Sb}return !1};la.prototype.all=function(a){for(var b=this.T,c=this.cb;null!==c;){if(!a(c)){return !1}this.T!==b&&u.Nb(this);c=c.Sb}return !0};la.prototype.each=function(a){for(var b=this.T,c=this.cb;null!==c;){a(c),this.T!==b&&u.Nb(this),c=c.Sb}};la.prototype.contains=la.prototype.has=la.prototype.contains=function(a){var b=a;return u.Ta(a)&&(b=u.Uc(a),void 0===b)?!1:void 0!==this.ad[b]};la.prototype.getValue=la.prototype.get=la.prototype.ua=function(a){var b=a; + if(u.Ta(a)&&(b=u.Uc(a),void 0===b)){return null}a=this.ad[b];return void 0===a?null:a.value};la.prototype.remove=la.prototype["delete"]=la.prototype.remove=function(a){if(null===a){return !1}u.J(this,a);var b=a;if(u.Ta(a)&&(b=u.Uc(a),void 0===b)){return !1}a=this.ad[b];if(void 0===a){return !1}var c=a.Sb,d=a.Wn;null!==c&&(c.Wn=d);null!==d&&(d.Sb=c);this.cb===a&&(this.cb=c);this.Ch===a&&(this.Ch=d);delete this.ad[b];this.$c--;this.Qd();return !0};la.prototype.clear=la.prototype.clear=function(){u.J(this);this.ad={};this.$c=0;this.Ch=this.cb=null;this.Qd()};la.prototype.copy=function(){var a=new la(this.yq,this.uv),b=this.ad,c;for(c in b){var d=b[c];a.add(d.key,d.value)}return a};la.prototype.toArray=la.prototype.Le=function(){var a=this.ad,b=Array(this.$c),c=0,d;for(d in a){var e=a[d];b[c]=new Pa(e.key,e.value);c++}return b};la.prototype.toKeySet=la.prototype.Oi=function(){return new Ra(this)};u.u(la,{count:"count"},function(){return this.$c});u.u(la,{size:"size"},function(){return this.$c});u.u(la,{i:"iterator"},function(){if(0>=this.count){return Ia}var a=this.yd;return null!==a?(a.reset(),a):new Ua(this)});u.u(la,{RJ:"iteratorKeys"},function(){return 0>=this.count?Ia:new Qa(this)});u.u(la,{SD:"iteratorValues"},function(){if(0>=this.count){return Ia}var a=this.Ln;return null!==a?(a.reset(),a):new Sa(this)});function w(a,b){void 0===a?this.y=this.x=0:(this.x=a,this.y=b);this.Ea=!1}u.fa("Point",w);u.Nh(w);u.Yd(w,{x:!0,y:!0});w.prototype.assign=function(a){this.x=a.x;this.y=a.y};w.prototype.setTo=w.prototype.m=function(a,b){this.x=a;this.y=b;return this};w.prototype.set=w.prototype.set=function(a){this.J();this.x=a.x;this.y=a.y;return this};w.prototype.copy=function(){var a=new w;a.x=this.x;a.y=this.y;return a};g=w.prototype;g.La=function(){this.Ea=!0;Object.freeze(this);return this};g.Z=function(){return Object.isFrozen(this)?this:this.copy().freeze()};g.freeze=function(){this.Ea=!0;return this};g.Ma=function(){Object.isFrozen(this)&&u.k("cannot thaw constant: "+this);this.Ea=!1;return this};g.J=function(a){if(this.Ea){var b="The Point is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);u.k(b)}};w.parse=function(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=0;""===a[b];){b++}var d=a[b++];d&&(c=parseFloat(d));for(var e=0;""===a[b];){b++}(d=a[b++])&&(e=parseFloat(d));return new w(c,e)}return new w};w.stringify=function(a){return a instanceof w?a.x.toString()+" "+a.y.toString():a.toString()};w.prototype.toString=function(){return"Point("+this.x+","+this.y+")"};w.prototype.equals=w.prototype.L=function(a){return a instanceof w?this.x===a.x&&this.y===a.y:!1};w.prototype.equalTo=w.prototype.Tv=function(a,b){return this.x===a&&this.y===b};w.prototype.equalsApprox=w.prototype.pd=function(a){return K.D(this.x,a.x)&&K.D(this.y,a.y)};w.prototype.add=w.prototype.add=function(a){this.J();this.x+=a.x;this.y+=a.y;return this};w.prototype.subtract=w.prototype.wt=function(a){this.J();this.x-=a.x;this.y-=a.y;return this};w.prototype.offset=w.prototype.offset=function(a,b){this.J();this.x+=a;this.y+=b;return this};w.prototype.rotate=w.prototype.rotate=function(a){this.J();if(0===a){return this}var b=this.x,c=this.y;if(0===b&&0===c){return this}var d=0,e=0;360<=a?a-=360:0>a&&(a+=360);90===a?(d=0,e=1):180===a?(d=-1,e=0):270===a?(d=0,e=-1):(a=a*Math.PI/180,d=Math.cos(a),e=Math.sin(a));this.x=d*b-e*c;this.y=e*b+d*c;return this};w.prototype.scale=w.prototype.scale=function(a,b){this.x*=a;this.y*=b;return this};w.prototype.distanceSquaredPoint=w.prototype.Lj=function(a){var b=a.x-this.x;a=a.y-this.y;return b*b+a*a};w.prototype.distanceSquared=w.prototype.zo=function(a,b){var c=a-this.x,d=b-this.y;return c*c+d*d};w.prototype.normalize=w.prototype.normalize=function(){this.J();var a=this.x,b=this.y,c=Math.sqrt(a*a+b*b);0<c&&(this.x=a/c,this.y=b/c);return this};w.prototype.directionPoint=w.prototype.Gi=function(a){return Va(a.x-this.x,a.y-this.y)};w.prototype.direction=w.prototype.direction=function(a,b){return Va(a-this.x,b-this.y)};function Va(a,b){if(0===a){return 0<b?90:0>b?270:0}if(0===b){return 0<a?0:180}if(isNaN(a)||isNaN(b)){return 0}var c=180*Math.atan(Math.abs(b/a))/Math.PI;0>a?c=0>b?c+180:180-c:0>b&&(c=360-c);return c}w.prototype.projectOntoLineSegment=function(a,b,c,d){K.Lm(a,b,c,d,this.x,this.y,this);return this};w.prototype.projectOntoLineSegmentPoint=function(a,b){K.Lm(a.x,a.y,b.x,b.y,this.x,this.y,this);return this};w.prototype.snapToGrid=function(a,b,c,d){K.ys(this.x,this.y,a,b,c,d,this);return this};w.prototype.snapToGridPoint=function(a,b){K.ys(this.x,this.y,a.x,a.y,b.width,b.height,this);return this};w.prototype.setRectSpot=w.prototype.qt=function(a,b){this.J();this.x=a.x+b.x*a.width+b.offsetX;this.y=a.y+b.y*a.height+b.offsetY;return this};w.prototype.setSpot=w.prototype.st=function(a,b,c,d,e){this.J();this.x=a+e.x*c+e.offsetX;this.y=b+e.y*d+e.offsetY;return this};w.prototype.transform=function(a){a.bb(this);return this};function Wa(a,b){b.Qh(a);return a}var Xa;w.distanceLineSegmentSquared=Xa=function(a,b,c,d,e,f){var h=e-c,k=f-d,l=h*h+k*k; + c-=a;d-=b;var m=-c*h-d*k;if(0>=m||m>=l){return h=e-a,k=f-b,Math.min(c*c+d*d,h*h+k*k)}a=h*d-k*c;return a*a/l};var Ya;w.distanceSquared=Ya=function(a,b,c,d){a=c-a;b=d-b;return a*a+b*b};var Za;w.direction=Za=function(a,b,c,d){a=c-a;b=d-b;if(0===a){return 0<b?90:0>b?270:0}if(0===b){return 0<a?0:180}if(isNaN(a)||isNaN(b)){return 0}d=180*Math.atan(Math.abs(b/a))/Math.PI;0>a?d=0>b?d+180:180-d:0>b&&(d=360-d);return d};w.prototype.isReal=w.prototype.I=function(){return isFinite(this.x)&&isFinite(this.y)};function ia(a,b){void 0===a?this.height=this.width=0:(this.width=a,this.height=b);this.Ea=!1}u.fa("Size",ia);u.Nh(ia);u.Yd(ia,{width:!0,height:!0});ia.prototype.assign=function(a){this.width=a.width;this.height=a.height};ia.prototype.setTo=ia.prototype.m=function(a,b){this.width=a;this.height=b;return this};ia.prototype.set=ia.prototype.set=function(a){this.J();this.width=a.width;this.height=a.height;return this};ia.prototype.copy=function(){var a=new ia;a.width=this.width;a.height=this.height;return a};g=ia.prototype;g.La=function(){this.Ea=!0;Object.freeze(this);return this};g.Z=function(){return Object.isFrozen(this)?this:this.copy().freeze()};g.freeze=function(){this.Ea=!0;return this};g.Ma=function(){Object.isFrozen(this)&&u.k("cannot thaw constant: "+this);this.Ea=!1;return this};g.J=function(a){if(this.Ea){var b="The Size is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);u.k(b)}};ia.parse=function(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=0;""===a[b];){b++}var d=a[b++];d&&(c=parseFloat(d));for(var e=0;""===a[b];){b++}(d=a[b++])&&(e=parseFloat(d));return new ia(c,e)}return new ia};ia.stringify=function(a){return a instanceof ia?a.width.toString()+" "+a.height.toString():a.toString()};ia.prototype.toString=function(){return"Size("+this.width+","+this.height+")"};ia.prototype.equals=ia.prototype.L=function(a){return a instanceof ia?this.width===a.width&&this.height===a.height:!1};ia.prototype.equalTo=ia.prototype.Tv=function(a,b){return this.width===a&&this.height===b};ia.prototype.equalsApprox=ia.prototype.pd=function(a){return K.D(this.width,a.width)&&K.D(this.height,a.height)};ia.prototype.isReal=ia.prototype.I=function(){return isFinite(this.width)&&isFinite(this.height)};function z(a,b,c,d){void 0===a?this.height=this.width=this.y=this.x=0:a instanceof w?b instanceof w?(this.x=Math.min(a.x,b.x),this.y=Math.min(a.y,b.y),this.width=Math.abs(a.x-b.x),this.height=Math.abs(a.y-b.y)):b instanceof ia?(this.x=a.x,this.y=a.y,this.width=b.width,this.height=b.height):u.k("Incorrect arguments supplied to Rect constructor"):(this.x=a,this.y=b,this.width=c,this.height=d);this.Ea=!1}u.fa("Rect",z);u.Nh(z);u.Yd(z,{x:!0,y:!0,width:!0,height:!0});z.prototype.assign=function(a){this.x=a.x;this.y=a.y;this.width=a.width;this.height=a.height};function bb(a,b,c){a.width=b;a.height=c}z.prototype.setTo=z.prototype.m=function(a,b,c,d){this.x=a;this.y=b;this.width=c;this.height=d;return this};z.prototype.set=z.prototype.set=function(a){this.J();this.x=a.x;this.y=a.y;this.width=a.width;this.height=a.height;return this};z.prototype.setPoint=z.prototype.zf=function(a){this.J();this.x=a.x;this.y=a.y;return this};z.prototype.setSize=function(a){this.J();this.width=a.width;this.height=a.height;return this};z.prototype.copy=function(){var a=new z;a.x=this.x;a.y=this.y;a.width=this.width;a.height=this.height;return a};g=z.prototype;g.La=function(){this.Ea=!0;Object.freeze(this);return this};g.Z=function(){return Object.isFrozen(this)?this:this.copy().freeze()};g.freeze=function(){this.Ea=!0;return this};g.Ma=function(){Object.isFrozen(this)&&u.k("cannot thaw constant: "+this);this.Ea=!1;return this};g.J=function(a){if(this.Ea){var b="The Rect is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);u.k(b)}};z.parse=function(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=0;""===a[b];){b++}var d=a[b++];d&&(c=parseFloat(d));for(var e=0;""===a[b];){b++}(d=a[b++])&&(e=parseFloat(d));for(var f=0;""===a[b];){b++}(d=a[b++])&&(f=parseFloat(d));for(var h=0;""===a[b];){b++}(d=a[b++])&&(h=parseFloat(d));return new z(c,e,f,h)}return new z};z.stringify=function(a){return a instanceof z?a.x.toString()+" "+a.y.toString()+" "+a.width.toString()+" "+a.height.toString():a.toString()};z.prototype.toString=function(){return"Rect("+this.x+","+this.y+","+this.width+","+this.height+")"};z.prototype.equals=z.prototype.L=function(a){return a instanceof z?this.x===a.x&&this.y===a.y&&this.width===a.width&&this.height===a.height:!1};z.prototype.equalTo=z.prototype.Tv=function(a,b,c,d){return this.x===a&&this.y===b&&this.width===c&&this.height===d};z.prototype.equalsApprox=z.prototype.pd=function(a){return K.D(this.x,a.x)&&K.D(this.y,a.y)&&K.D(this.width,a.width)&&K.D(this.height,a.height)};z.prototype.containsPoint=z.prototype.Da=function(a){return this.x<=a.x&&this.x+this.width>=a.x&&this.y<=a.y&&this.y+this.height>=a.y};z.prototype.containsRect=z.prototype.Kj=function(a){return this.x<=a.x&&a.x+a.width<=this.x+this.width&&this.y<=a.y&&a.y+a.height<=this.y+this.height +};z.prototype.contains=z.prototype.contains=function(a,b,c,d){void 0===c&&(c=0);void 0===d&&(d=0);return this.x<=a&&a+c<=this.x+this.width&&this.y<=b&&b+d<=this.y+this.height};z.prototype.reset=function(){this.J();this.height=this.width=this.y=this.x=0};z.prototype.offset=z.prototype.offset=function(a,b){this.J();this.x+=a;this.y+=b;return this};z.prototype.inflate=z.prototype.Kf=function(a,b){return hb(this,b,a,b,a)};z.prototype.addMargin=z.prototype.zv=function(a){return hb(this,a.top,a.right,a.bottom,a.left)};z.prototype.subtractMargin=z.prototype.vI=function(a){return hb(this,-a.top,-a.right,-a.bottom,-a.left)};z.prototype.grow=function(a,b,c,d){return hb(this,a,b,c,d)};function hb(a,b,c,d,e){a.J();var f=a.width;c+e<=-f?(a.x+=f/2,a.width=0):(a.x-=e,a.width+=c+e);c=a.height;b+d<=-c?(a.y+=c/2,a.height=0):(a.y-=b,a.height+=b+d);return a}z.prototype.intersectRect=function(a){return ib(this,a.x,a.y,a.width,a.height)};z.prototype.intersect=function(a,b,c,d){return ib(this,a,b,c,d)};function ib(a,b,c,d,e){a.J();var f=Math.max(a.x,b),h=Math.max(a.y,c);b=Math.min(a.x+a.width,b+d);c=Math.min(a.y+a.height,c+e);a.x=f;a.y=h;a.width=Math.max(0,b-f);a.height=Math.max(0,c-h);return a}z.prototype.intersectsRect=z.prototype.ug=function(a){return this.HD(a.x,a.y,a.width,a.height)};z.prototype.intersects=z.prototype.HD=function(a,b,c,d){var e=this.width,f=this.x;if(Infinity!==e&&Infinity!==c&&(e+=f,c+=a,isNaN(c)||isNaN(e)||f>c||a>e)){return !1}a=this.height;c=this.y;return Infinity!==a&&Infinity!==d&&(a+=c,d+=b,isNaN(d)||isNaN(a)||c>d||b>a)?!1:!0};function jb(a,b){var c=a.width,d=b.width+10+10,e=a.x,f=b.x-10;if(e>d+f||f>c+e){return !1}c=a.height;d=b.height+10+10;e=a.y;f=b.y-10;return e>d+f||f>c+e?!1:!0}z.prototype.unionPoint=z.prototype.Pi=function(a){return kb(this,a.x,a.y,0,0)};z.prototype.unionRect=z.prototype.Uh=function(a){return kb(this,a.x,a.y,a.width,a.height)};z.prototype.union=z.prototype.YE=function(a,b,c,d){this.J();void 0===c&&(c=0);void 0===d&&(d=0);return kb(this,a,b,c,d)};function kb(a,b,c,d,e){var f=Math.min(a.x,b),h=Math.min(a.y,c);b=Math.max(a.x+a.width,b+d);c=Math.max(a.y+a.height,c+e);a.x=f;a.y=h;a.width=b-f;a.height=c-h;return a}z.prototype.setSpot=z.prototype.st=function(a,b,c){this.J();this.x=a-c.offsetX-c.x*this.width;this.y=b-c.offsetY-c.y*this.height;return this};var qb;z.contains=qb=function(a,b,c,d,e,f,h,k){void 0===h&&(h=0);void 0===k&&(k=0);return a<=e&&e+h<=a+c&&b<=f&&f+k<=b+d};z.intersects=function(a,b,c,d,e,f,h,k){c+=a;h+=e;if(a>h||e>c){return !1}a=d+b;k+=f;return b>k||f>a?!1:!0};u.defineProperty(z,{left:"left"},function(){return this.x},function(a){this.J(a);this.x=a});u.defineProperty(z,{top:"top"},function(){return this.y},function(a){this.J(a);this.y=a});u.defineProperty(z,{right:"right"},function(){return this.x+this.width},function(a){this.J(a);this.x+=a-(this.x+this.width)});u.defineProperty(z,{bottom:"bottom"},function(){return this.y+this.height},function(a){this.J(a);this.y+=a-(this.y+this.height)});u.defineProperty(z,{position:"position"},function(){return new w(this.x,this.y)},function(a){this.J(a);this.x=a.x;this.y=a.y});u.defineProperty(z,{size:"size"},function(){return new ia(this.width,this.height)},function(a){this.J(a);this.width=a.width;this.height=a.height});u.defineProperty(z,{Ok:"center"},function(){return new w(this.x+this.width/2,this.y+this.height/2)},function(a){this.J(a);this.x=a.x-this.width/2;this.y=a.y-this.height/2});u.defineProperty(z,{ma:"centerX"},function(){return this.x+this.width/2},function(a){this.J(a);this.x=a-this.width/2});u.defineProperty(z,{ya:"centerY"},function(){return this.y+this.height/2},function(a){this.J(a);this.y=a-this.height/2});z.prototype.isReal=z.prototype.I=function(){return isFinite(this.x)&&isFinite(this.y)&&isFinite(this.width)&&isFinite(this.height)};z.prototype.isEmpty=function(){return 0===this.width&&0===this.height};function rb(a,b,c,d){void 0===a?this.left=this.bottom=this.right=this.top=0:void 0===b?this.left=this.bottom=this.right=this.top=a:void 0===c?(d=b,this.top=a,this.right=b,this.bottom=a,this.left=d):void 0!==d?(this.top=a,this.right=b,this.bottom=c,this.left=d):u.k("Invalid arguments to Margin constructor");this.Ea=!1}u.fa("Margin",rb);u.Nh(rb);u.Yd(rb,{top:!0,right:!0,bottom:!0,left:!0});rb.prototype.assign=function(a){this.top=a.top;this.right=a.right;this.bottom=a.bottom;this.left=a.left};rb.prototype.setTo=rb.prototype.m=function(a,b,c,d){this.J();this.top=a;this.right=b;this.bottom=c;this.left=d;return this};rb.prototype.set=rb.prototype.set=function(a){this.J();this.top=a.top;this.right=a.right;this.bottom=a.bottom;this.left=a.left;return this};rb.prototype.copy=function(){var a=new rb;a.top=this.top;a.right=this.right;a.bottom=this.bottom;a.left=this.left;return a};g=rb.prototype;g.La=function(){this.Ea=!0;Object.freeze(this);return this};g.Z=function(){return Object.isFrozen(this)?this:this.copy().freeze()};g.freeze=function(){this.Ea=!0;return this};g.Ma=function(){Object.isFrozen(this)&&u.k("cannot thaw constant: "+this); + this.Ea=!1;return this};g.J=function(a){if(this.Ea){var b="The Margin is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);u.k(b)}};rb.parse=function(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=NaN;""===a[b];){b++}var d=a[b++];d&&(c=parseFloat(d));if(isNaN(c)){return new rb}for(var e=NaN;""===a[b];){b++}(d=a[b++])&&(e=parseFloat(d));if(isNaN(e)){return new rb(c)}for(var f=NaN;""===a[b];){b++}(d=a[b++])&&(f=parseFloat(d));if(isNaN(f)){return new rb(c,e)}for(var h=NaN;""===a[b];){b++}(d=a[b++])&&(h=parseFloat(d));return isNaN(h)?new rb(c,e):new rb(c,e,f,h)}return new rb};rb.stringify=function(a){return a instanceof rb?a.top.toString()+" "+a.right.toString()+" "+a.bottom.toString()+" "+a.left.toString():a.toString()};rb.prototype.toString=function(){return"Margin("+this.top+","+this.right+","+this.bottom+","+this.left+")"};rb.prototype.equals=rb.prototype.L=function(a){return a instanceof rb?this.top===a.top&&this.right===a.right&&this.bottom===a.bottom&&this.left===a.left:!1};rb.prototype.equalTo=rb.prototype.Tv=function(a,b,c,d){return this.top===a&&this.right===b&&this.bottom===c&&this.left===d};rb.prototype.equalsApprox=rb.prototype.pd=function(a){return K.D(this.top,a.top)&&K.D(this.right,a.right)&&K.D(this.bottom,a.bottom)&&K.D(this.left,a.left)};rb.prototype.isReal=rb.prototype.I=function(){return isFinite(this.top)&&isFinite(this.right)&&isFinite(this.bottom)&&isFinite(this.left)};function ja(){this.m11=1;this.m21=this.m12=0;this.m22=1;this.dy=this.dx=0}u.Nh(ja);u.Yd(ja,{m11:!0,m12:!0,m21:!0,m22:!0,dx:!0,dy:!0});ja.prototype.set=ja.prototype.set=function(a){this.m11=a.m11;this.m12=a.m12;this.m21=a.m21;this.m22=a.m22;this.dx=a.dx;this.dy=a.dy;return this};ja.prototype.copy=function(){var a=new ja;a.m11=this.m11;a.m12=this.m12;a.m21=this.m21;a.m22=this.m22;a.dx=this.dx;a.dy=this.dy;return a};ja.prototype.toString=function(){return"Transform("+this.m11+","+this.m12+","+this.m21+","+this.m22+","+this.dx+","+this.dy+")"};ja.prototype.equals=ja.prototype.L=function(a){return a instanceof ja?this.m11===a.m11&&this.m12===a.m12&&this.m21===a.m21&&this.m22===a.m22&&this.dx===a.dx&&this.dy===a.dy:!1};ja.prototype.isIdentity=ja.prototype.Ps=function(){return 1===this.m11&&0===this.m12&&0===this.m21&&1===this.m22&&0===this.dx&&0===this.dy};ja.prototype.reset=ja.prototype.reset=function(){this.m11=1;this.m21=this.m12=0;this.m22=1;this.dy=this.dx=0;return this};ja.prototype.multiply=ja.prototype.multiply=function(a){var b=this.m12*a.m11+this.m22*a.m12,c=this.m11*a.m21+this.m21*a.m22,d=this.m12*a.m21+this.m22*a.m22,e=this.m11*a.dx+this.m21*a.dy+this.dx,f=this.m12*a.dx+this.m22*a.dy+this.dy;this.m11=this.m11*a.m11+this.m21*a.m12;this.m12=b;this.m21=c;this.m22=d;this.dx=e;this.dy=f;return this};ja.prototype.multiplyInverted=ja.prototype.bE=function(a){var b=1/(a.m11*a.m22-a.m12*a.m21),c=a.m22*b,d=-a.m12*b,e=-a.m21*b,f=a.m11*b,h=b*(a.m21*a.dy-a.m22*a.dx),k=b*(a.m12*a.dx-a.m11*a.dy);a=this.m12*c+this.m22*d;b=this.m11*e+this.m21*f;e=this.m12*e+this.m22*f;f=this.m11*h+this.m21*k+this.dx;h=this.m12*h+this.m22*k+this.dy;this.m11=this.m11*c+this.m21*d;this.m12=a;this.m21=b;this.m22=e;this.dx=f;this.dy=h;return this};ja.prototype.invert=ja.prototype.pz=function(){var a=1/(this.m11*this.m22-this.m12*this.m21),b=-this.m12*a,c=-this.m21*a,d=this.m11*a,e=a*(this.m21*this.dy-this.m22*this.dx),f=a*(this.m12*this.dx-this.m11*this.dy);this.m11=this.m22*a;this.m12=b;this.m21=c;this.m22=d;this.dx=e;this.dy=f;return this};ja.prototype.rotate=ja.prototype.rotate=function(a,b,c){360<=a?a-=360:0>a&&(a+=360);if(0===a){return this}this.translate(b,c);var d=0,e=0;90===a?(d=0,e=1):180===a?(d=-1,e=0):270===a?(d=0,e=-1):(e=a*Math.PI/180,d=Math.cos(e),e=Math.sin(e));a=this.m12*d+this.m22*e;var f=this.m11*-e+this.m21*d,h=this.m12*-e+this.m22*d;this.m11=this.m11*d+this.m21*e;this.m12=a;this.m21=f;this.m22=h;this.translate(-b,-c);return this};ja.prototype.translate=ja.prototype.translate=function(a,b){this.dx+=this.m11*a+this.m21*b;this.dy+=this.m12*a+this.m22*b;return this};ja.prototype.scale=ja.prototype.scale=function(a,b){void 0===b&&(b=a);this.m11*=a;this.m12*=a;this.m21*=b;this.m22*=b;return this};ja.prototype.transformPoint=ja.prototype.bb=function(a){var b=a.x,c=a.y;a.x=b*this.m11+c*this.m21+this.dx;a.y=b*this.m12+c*this.m22+this.dy;return a};ja.prototype.invertedTransformPoint=ja.prototype.Qh=function(a){var b=1/(this.m11*this.m22-this.m12*this.m21),c=-this.m12*b,d=this.m11*b,e=b*(this.m12*this.dx-this.m11*this.dy),f=a.x,h=a.y;a.x=f*this.m22*b+h*-this.m21*b+b*(this.m21*this.dy-this.m22*this.dx);a.y=f*c+h*d+e;return a};ja.prototype.transformRect=ja.prototype.WE=function(a){var b=a.x,c=a.y,d=b+a.width,e=c+a.height,f=this.m11,h=this.m12,k=this.m21,l=this.m22,m=this.dx,n=this.dy,p=b*f+c*k+m,q=b*h+c*l+n,r=d*f+c*k+m,c=d*h+c*l+n,s=b*f+e*k+m,b=b*h+e*l+n,f=d*f+e*k+m,d=d*h+e*l+n,e=p,h=q,p=Math.min(p,r),e=Math.max(e,r),h=Math.min(h,c),q=Math.max(q,c),p=Math.min(p,s),e=Math.max(e,s),h=Math.min(h,b),q=Math.max(q,b),p=Math.min(p,f),e=Math.max(e,f),h=Math.min(h,d),q=Math.max(q,d); + a.x=p;a.y=h;a.width=e-p;a.height=q-h;return a};function L(a,b,c,d){void 0===a?this.offsetY=this.offsetX=this.y=this.x=0:(void 0===b&&(b=0),void 0===c&&(c=0),void 0===d&&(d=0),this.x=a,this.y=b,this.offsetX=c,this.offsetY=d);this.Ea=!1}u.fa("Spot",L);u.Nh(L);u.Yd(L,{x:!0,y:!0,offsetX:!0,offsetY:!0});L.prototype.assign=function(a){this.x=a.x;this.y=a.y;this.offsetX=a.offsetX;this.offsetY=a.offsetY};L.prototype.setTo=L.prototype.m=function(a,b,c,d){this.J();this.x=a;this.y=b;this.offsetX=c;this.offsetY=d;return this};L.prototype.set=L.prototype.set=function(a){this.J();this.x=a.x;this.y=a.y;this.offsetX=a.offsetX;this.offsetY=a.offsetY;return this};L.prototype.copy=function(){var a=new L;a.x=this.x;a.y=this.y;a.offsetX=this.offsetX;a.offsetY=this.offsetY;return a};g=L.prototype;g.La=function(){this.Ea=!0;Object.freeze(this);return this};g.Z=function(){return Object.isFrozen(this)?this:this.copy().freeze()};g.freeze=function(){this.Ea=!0;return this};g.Ma=function(){Object.isFrozen(this)&&u.k("cannot thaw constant: "+this);this.Ea=!1;return this};g.J=function(a){if(this.Ea){var b="The Spot is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);u.k(b)}};function sb(a,b){a.x=NaN;a.y=NaN;a.offsetX=b;return a}var tb;L.parse=tb=function(a){if("string"===typeof a){a=a.trim();if("None"===a){return vb}if("TopLeft"===a){return xb}if("Top"===a||"TopCenter"===a||"MiddleTop"===a){return Db}if("TopRight"===a){return Gb}if("Left"===a||"LeftCenter"===a||"MiddleLeft"===a){return Hb}if("Center"===a){return Ib}if("Right"===a||"RightCenter"===a||"MiddleRight"===a){return Jb}if("BottomLeft"===a){return Qb}if("Bottom"===a||"BottomCenter"===a||"MiddleBottom"===a){return Ub}if("BottomRight"===a){return Vb}if("TopSide"===a){return Wb}if("LeftSide"===a){return Xb}if("RightSide"===a){return Yb}if("BottomSide"===a){return Zb}if("TopBottomSides"===a){return $b}if("LeftRightSides"===a){return ac}if("TopLeftSides"===a){return bc}if("TopRightSides"===a){return cc}if("BottomLeftSides"===a){return hc}if("BottomRightSides"===a){return ic}if("NotTopSide"===a){return lc}if("NotLeftSide"===a){return mc}if("NotRightSide"===a){return rc}if("NotBottomSide"===a){return sc}if("AllSides"===a){return tc}if("Default"===a){return uc}a=a.split(" ");for(var b=0,c=0;""===a[b];){b++}var d=a[b++];void 0!==d&&0<d.length&&(c=parseFloat(d));for(var e=0;""===a[b];){b++}d=a[b++];void 0!==d&&0<d.length&&(e=parseFloat(d));for(var f=0;""===a[b];){b++}d=a[b++];void 0!==d&&0<d.length&&(f=parseFloat(d));for(var h=0;""===a[b];){b++}d=a[b++];void 0!==d&&0<d.length&&(h=parseFloat(d));return new L(c,e,f,h)}return new L};L.stringify=function(a){return a instanceof L?a.Vc()?a.x.toString()+" "+a.y.toString()+" "+a.offsetX.toString()+" "+a.offsetY.toString():a.toString():a.toString()};L.prototype.toString=function(){return this.Vc()?0===this.offsetX&&0===this.offsetY?"Spot("+this.x+","+this.y+")":"Spot("+this.x+","+this.y+","+this.offsetX+","+this.offsetY+")":this.L(vb)?"None":this.L(xb)?"TopLeft":this.L(Db)?"Top":this.L(Gb)?"TopRight":this.L(Hb)?"Left":this.L(Ib)?"Center":this.L(Jb)?"Right":this.L(Qb)?"BottomLeft":this.L(Ub)?"Bottom":this.L(Vb)?"BottomRight":this.L(Wb)?"TopSide":this.L(Xb)?"LeftSide":this.L(Yb)?"RightSide":this.L(Zb)?"BottomSide":this.L($b)?"TopBottomSides":this.L(ac)?"LeftRightSides":this.L(bc)?"TopLeftSides":this.L(cc)?"TopRightSides":this.L(hc)?"BottomLeftSides":this.L(ic)?"BottomRightSides":this.L(lc)?"NotTopSide":this.L(mc)?"NotLeftSide":this.L(rc)?"NotRightSide":this.L(sc)?"NotBottomSide":this.L(tc)?"AllSides":this.L(uc)?"Default":"None"};L.prototype.equals=L.prototype.L=function(a){return a instanceof L?(this.x===a.x||isNaN(this.x)&&isNaN(a.x))&&(this.y===a.y||isNaN(this.y)&&isNaN(a.y))&&this.offsetX===a.offsetX&&this.offsetY===a.offsetY:!1};L.prototype.opposite=function(){return new L(0.5-(this.x-0.5),0.5-(this.y-0.5),-this.offsetX,-this.offsetY)};L.prototype.includesSide=L.prototype.cw=function(a){if(!this.jl()||!a.jl()){return !1}a=a.offsetY;return(this.offsetY&a)===a};L.prototype.isSpot=L.prototype.Vc=function(){return !isNaN(this.x)&&!isNaN(this.y)};L.prototype.isNoSpot=L.prototype.oe=function(){return isNaN(this.x)||isNaN(this.y)};L.prototype.isSide=L.prototype.jl=function(){return this.oe()&&1===this.offsetX&&0!==this.offsetY};L.prototype.isDefault=L.prototype.Kc=function(){return isNaN(this.x)&&isNaN(this.y)&&-1===this.offsetX&&0===this.offsetY};var vb;L.None=vb=sb(new L(0,0,0,0),0).La();var uc;L.Default=uc=sb(new L(0,0,-1,0),-1).La();var xb;L.TopLeft=xb=(new L(0,0,0,0)).La();var Db;L.TopCenter=Db=(new L(0.5,0,0,0)).La();var Gb;L.TopRight=Gb=(new L(1,0,0,0)).La();var Hb;L.LeftCenter=Hb=(new L(0,0.5,0,0)).La();var Ib;L.Center=Ib=(new L(0.5,0.5,0,0)).La();var Jb;L.RightCenter=Jb=(new L(1,0.5,0,0)).La();var Qb;L.BottomLeft=Qb=(new L(0,1,0,0)).La();var Ub;L.BottomCenter=Ub=(new L(0.5,1,0,0)).La();var Vb;L.BottomRight=Vb=(new L(1,1,0,0)).La();var vc;L.MiddleTop=vc=Db;var wc;L.MiddleLeft=wc=Hb;var xc;L.MiddleRight=xc=Jb; + var Cc;L.MiddleBottom=Cc=Ub;L.Top=Db;var Dc;L.Left=Dc=Hb;var Ec;L.Right=Ec=Jb;L.Bottom=Ub;var Wb;L.TopSide=Wb=sb(new L(0,0,1,u.Yc),1).La();var Xb;L.LeftSide=Xb=sb(new L(0,0,1,u.Ec),1).La();var Yb;L.RightSide=Yb=sb(new L(0,0,1,u.Nc),1).La();var Zb;L.BottomSide=Zb=sb(new L(0,0,1,u.Mc),1).La();var $b;L.TopBottomSides=$b=sb(new L(0,0,1,u.Yc|u.Mc),1).La();var ac;L.LeftRightSides=ac=sb(new L(0,0,1,u.Ec|u.Nc),1).La();var bc;L.TopLeftSides=bc=sb(new L(0,0,1,u.Yc|u.Ec),1).La();var cc;L.TopRightSides=cc=sb(new L(0,0,1,u.Yc|u.Nc),1).La();var hc;L.BottomLeftSides=hc=sb(new L(0,0,1,u.Mc|u.Ec),1).La();var ic;L.BottomRightSides=ic=sb(new L(0,0,1,u.Mc|u.Nc),1).La();var lc;L.NotTopSide=lc=sb(new L(0,0,1,u.Ec|u.Nc|u.Mc),1).La();var mc;L.NotLeftSide=mc=sb(new L(0,0,1,u.Yc|u.Nc|u.Mc),1).La();var rc;L.NotRightSide=rc=sb(new L(0,0,1,u.Yc|u.Ec|u.Mc),1).La();var sc;L.NotBottomSide=sc=sb(new L(0,0,1,u.Yc|u.Ec|u.Nc),1).La();var tc;L.AllSides=tc=sb(new L(0,0,1,u.Yc|u.Ec|u.Nc|u.Mc),1).La();function Lc(){this.bf=[1,0,0,1,0,0]}Lc.prototype.copy=function(){var a=new Lc;a.bf[0]=this.bf[0];a.bf[1]=this.bf[1];a.bf[2]=this.bf[2];a.bf[3]=this.bf[3];a.bf[4]=this.bf[4];a.bf[5]=this.bf[5];return a};function Mc(a){this.type=a;this.r2=this.y2=this.x2=this.r1=this.y1=this.x1=0;this.YC=[]}Mc.prototype.addColorStop=function(a,b){this.YC.push({offset:a,color:b})};function Nc(a,b,c){this.fillStyle="#000000";this.font="10px sans-serif";this.globalAlpha=1;this.lineCap="butt";this.ow=0;this.lineJoin="miter";this.lineWidth=1;this.miterLimit=10;this.shadowBlur=0;this.shadowColor="rgba(0, 0, 0, 0)";this.shadowOffsetY=this.shadowOffsetX=0;this.strokeStyle="#000000";this.textAlign="start";this.document=b||document;this.oD=c;this.lw=null;this.path=[];this.Fi=new Lc;this.stack=[];this.tf=[];this.Rv=a;this.KH="http://www.w3.org/2000/svg";this.width=this.Rv.width;this.height=this.Rv.height;this.tl=Oc(this,"svg",{width:this.width+"px",height:this.height+"px",GK:"0 0 "+this.Rv.width+" "+this.Rv.height});this.tl.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns","http://www.w3.org/2000/svg");this.tl.setAttributeNS("http://www.w3.org/2000/xmlns/","xmlns:xlink","http://www.w3.org/1999/xlink");Uc(this,1,0,0,1,0,0);a=u.zl++;b=Oc(this,"clipPath",{id:"mainClip"+a});b.appendChild(Oc(this,"rect",{x:0,y:0,width:this.width,height:this.height}));this.tl.appendChild(b);this.tf[0].setAttributeNS(null,"clip-path","url(#mainClip"+a+")")}g=Nc.prototype;g.arc=function(a,b,c,d,e,f){Vc(this,a,b,c,d,e,f)};g.beginPath=function(){this.path=[]};g.bezierCurveTo=function(a,b,c,d,e,f){this.path.push(["C",a,b,c,d,e,f])};g.clearRect=function(){};g.clip=function(){Wc(this,"clipPath",this.path,new Lc)};g.closePath=function(){this.path.push(["z"])};g.createLinearGradient=function(a,b,c,d){var e=new Mc("linear");e.x1=a;e.y1=b;e.x2=c;e.y2=d;return e};g.createPattern=function(){};g.createRadialGradient=function(a,b,c,d,e,f){var h=new Mc("radial");h.x1=a;h.y1=b;h.r1=c;h.x2=d;h.y2=e;h.r2=f;return h};g.drawImage=function(a,b,c,d,e,f,h,k,l){var m="";a instanceof HTMLCanvasElement&&(m=a.toDataURL());a instanceof HTMLImageElement&&(m=a.src);m={x:0,y:0,width:a.naturalWidth,height:a.naturalHeight,href:m};m.preserveAspectRatio=K.Wa(d,k)&&K.Wa(e,l)?"xMidYMid slice":"none";var n="";k/=d;l/=e;if(0!==f||0!==h){n+=" translate("+f+", "+h+")"}if(1!==k||1!==l){n+=" scale("+k+", "+l+")"}if(0!==b||0!==c){n+=" translate("+-b+", "+-c+")"}if(0!==b||0!==c||d!==a.naturalWidth||e!==a.naturalHeight){a="CLIP"+u.zl++,f=Oc(this,"clipPath",{id:a}),f.appendChild(Oc(this,"rect",{x:b,y:c,width:d,height:e})),this.tl.appendChild(f),m["clip-path"]="url(#"+a+")"}Xc(this,"image",m,this.Fi,n);this.addElement("image",m)};g.fill=function(){Wc(this,"fill",this.path,this.Fi)};g.fillRect=function(a,b,c,d){Yc(this,"fill",[a,b,c,d],this.Fi)};g.fillText=function(a,b,c){a=[a,b,c];b=this.textAlign;"left"===b?b="start":"right"===b?b="end":"center"===b&&(b="middle");b={x:a[1],y:a[2],style:"font: "+this.font,"text-anchor":b};Xc(this,"fill",b,this.Fi);this.addElement("text",b,a[0])};g.lineTo=function(a,b){this.path.push(["L",a,b])};g.moveTo=function(a,b){this.path.push(["M",a,b])};g.quadraticCurveTo=function(a,b,c,d){this.path.push(["Q",a,b,c,d])};g.rect=function(a,b,c,d){this.path.push(["M",a,b],["L",a+c,b],["L",a+c,b+d],["L",a,b+d],["z"])};g.restore=function(){this.Fi=this.stack.pop();this.path=this.stack.pop();var a=this.stack.pop();this.fillStyle=a.fillStyle;this.font=a.font;this.globalAlpha=a.globalAlpha;this.lineCap=a.lineCap;this.ow=a.ow;this.lineJoin=a.lineJoin;this.lineWidth=a.lineWidth;this.miterLimit=a.miterLimit;this.shadowBlur=a.shadowBlur;this.shadowColor=a.shadowColor;this.shadowOffsetX=a.shadowOffsetX;this.shadowOffsetY=a.shadowOffsetY;this.strokeStyle=a.strokeStyle;this.textAlign=a.textAlign};g.save=function(){this.stack.push({fillStyle:this.fillStyle,font:this.font,globalAlpha:this.globalAlpha,lineCap:this.lineCap,ow:this.ow,lineJoin:this.lineJoin,lineWidth:this.lineWidth,miterLimit:this.miterLimit,shadowBlur:this.shadowBlur,shadowColor:this.shadowColor,shadowOffsetX:this.shadowOffsetX,shadowOffsetY:this.shadowOffsetY,strokeStyle:this.strokeStyle,textAlign:this.textAlign}); + for(var a=[],b=0;b<this.path.length;b++){a.push(this.path[b])}this.stack.push(a);this.stack.push(this.Fi.copy())};g.setTransform=function(a,b,c,d,e,f){1===a&&0===b&&0===c&&1===d&&0===e&&0===f||Uc(this,a,b,c,d,e,f)};g.scale=function(){};g.stroke=function(){Wc(this,"stroke",this.path,this.Fi)};g.strokeRect=function(a,b,c,d){Yc(this,"stroke",[a,b,c,d],this.Fi)};function Oc(a,b,c,d){a=a.document.createElementNS(a.KH,b);if(u.Ta(c)){for(var e in c){a.setAttributeNS("href"===e?"http://www.w3.org/1999/xlink":"",e,c[e])}}void 0!==d&&(a.textContent=d);return a}g.addElement=function(a,b,c){a=Oc(this,a,b,c);0<this.tf.length?this.tf[this.tf.length-1].appendChild(a):this.tl.appendChild(a);return this.lw=a};function Xc(a,b,c,d,e){1!==a.globalAlpha&&(c.opacity=a.globalAlpha);"fill"==b?(/^rgba\(/.test(a.fillStyle)?(a=/^\s*rgba\s*\(([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\)\s*$/i.exec(a.fillStyle),c.fill="rgb("+a[1]+","+a[2]+","+a[3]+")",c["fill-opacity"]=a[4]):c.fill=a.fillStyle instanceof Mc?Zc(a,a.fillStyle):a.fillStyle,c.stroke="none"):"stroke"==b&&(c.fill="none",/^rgba\(/.test(a.strokeStyle)?(b=/^\s*rgba\s*\(([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\)\s*$/i.exec(a.strokeStyle),c.stroke="rgb("+b[1]+","+b[2]+","+b[3]+")",c["stroke-opacity"]=b[4]):c.stroke=a.strokeStyle instanceof Mc?Zc(a,a.strokeStyle):a.strokeStyle,c["stroke-width"]=a.lineWidth,c["stroke-linecap"]=a.lineCap,c["stroke-linejoin"]=a.lineJoin,c["stroke-miterlimit"]=a.miterLimit);d=d.bf;d="matrix("+d[0]+", "+d[1]+", "+d[2]+", "+d[3]+", "+d[4]+", "+d[5]+")";void 0!==e&&(d+=e);c.transform=d}function Zc(a,b){var c="GRAD"+u.zl++,d;if("linear"===b.type){d={x1:b.x1,x2:b.x2,y1:b.y1,y2:b.y2,id:c,gradientUnits:"userSpaceOnUse"},d=Oc(a,"linearGradient",d)}else{if("radial"===b.type){d={x1:b.x1,x2:b.x2,y1:b.y1,y2:b.y2,r1:b.r1,r2:b.r2,id:c},d=Oc(a,"radialGradient",d)}else{throw Error("invalid gradient")}}for(var e=b.YC,f=e.length,h=[],k=0;k<f;k++){var l=e[k],m=l.color,l={offset:l.offset,"stop-color":m};/^rgba\(/.test(m)&&(m=/^\s*rgba\s*\(([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\)\s*$/i.exec(m),l["stop-color"]="rgb("+m[1]+","+m[2]+","+m[3]+")",l["stop-opacity"]=m[4]);h.push(l)}h.sort(function(a,b){return a.offset>b.offset?1:-1});for(k=0;k<f;k++){d.appendChild(Oc(a,"stop",h[k]))}a.tl.appendChild(d);return"url(#"+c+")"}function Yc(a,b,c,d){c={x:c[0],y:c[1],width:c[2],height:c[3]};Xc(a,b,c,d);a.addElement("rect",c)}function Wc(a,b,c,d){for(var e=[],f=0;f<c.length;f++){var h=u.Pk(c[f]),k=[h.shift()];if("A"==k[0]){k.push(h.shift()+","+h.shift(),h.shift(),h.shift()+","+h.shift(),h.shift()+","+h.shift())}else{for(;h.length;){k.push(h.shift()+","+h.shift())}}e.push(k.join(" "))}c={d:e.join(" ")};Xc(a,b,c,d);"clipPath"===b?(b="CLIP"+u.zl++,d=Oc(a,"clipPath",{id:b}),d.appendChild(Oc(a,"path",c)),a.tl.appendChild(d),0<a.tf.length&&a.tf[a.tf.length-1].setAttributeNS(null,"clip-path","url(#"+b+")")):a.addElement("path",c)}function Vc(a,b,c,d,e,f,h){var k=Math.abs(e-f);if(e!=f){var l=b+d*Math.cos(f);f=c+d*Math.sin(f);k>=2*Math.PI?(Vc(a,b,c,d,e,e+Math.PI,h),Vc(a,b,c,d,e+Math.PI,e+2*Math.PI,h),a.path.push(["M",l,f])):(b+=d*Math.cos(e),c+=d*Math.sin(e),k=180*k/Math.PI,e=h?0:1,h=180<=k==!!h?0:1,0!==a.path.length?a.path.push(["L",b,c]):a.path.push(["M",b,c]),a.path.push(["A",d,d,k,h,e,l,f]))}}function Uc(a,b,c,d,e,f,h){var k=new Lc;k.bf=[b,c,d,e,f,h];b={};Xc(a,"g",b,k);k=a.addElement("g",b);a.tf.push(k)}g.ab=function(){if(0!==this.shadowOffsetX||0!==this.shadowOffsetY||0!==this.shadowBlur){var a="SHADOW"+u.zl++,b=this.addElement("filter",{id:a,x:"-100%",y:"-100%",width:"300%",height:"300%"},null),c,d,e,f,h;c=Oc(this,"feGaussianBlur",{"in":"SourceAlpha",result:"blur",yK:this.shadowBlur/2});d=Oc(this,"feFlood",{"in":"blur",result:"flood","flood-color":this.shadowColor});e=Oc(this,"feComposite",{"in":"flood",in2:"blur",operator:"in",result:"comp"});f=Oc(this,"feOffset",{"in":"comp",result:"offsetBlur",dx:this.shadowOffsetX,dy:this.shadowOffsetY});h=Oc(this,"feMerge",{});h.appendChild(Oc(this,"feMergeNode",{"in":"offsetBlur"}));h.appendChild(Oc(this,"feMergeNode",{"in":"SourceGraphic"}));b.appendChild(c);b.appendChild(d);b.appendChild(e);b.appendChild(f);b.appendChild(h);0<this.tf.length&&this.tf[this.tf.length-1].setAttributeNS(null,"filter","url(#"+a+")")}};function oa(a,b){this.ownerDocument=void 0===b?document:b;var c=this.ownerDocument.createElement("canvas");c.tabIndex=0;this.Fd=c;c.getContext&&c.getContext("2d")||u.k("Browser does not support HTML Canvas Element");this.eG=c.getContext("2d");c.Y=a;Object.seal(this)}g=oa.prototype;g.getContext=function(){return this.eG};g.toDataURL=function(a,b){return this.Fd.toDataURL(a,b)};g.getBoundingClientRect=function(){return this.Fd.getBoundingClientRect()};g.focus=function(){return this.Fd.focus()};g.addEventListener=function(a,b,c){this.Fd.addEventListener(a,b,c)};g.removeEventListener=function(a,b,c){this.Fd.removeEventListener(a,b,c)};u.defineProperty(oa,{width:"width"},function(){return this.Fd.width + },function(a){this.Fd.width=a});u.defineProperty(oa,{height:"height"},function(){return this.Fd.height},function(a){this.Fd.height=a});u.defineProperty(oa,{style:"style"},function(){return this.Fd.style},function(a){this.Fd.style=a});var K={ta:4*((Math.sqrt(2)-1)/3),Wj:(new w(0,0)).La(),kF:(new z(0,0,0,0)).La(),pp:(new rb(0,0,0,0)).La(),iF:(new rb(2,2,2,2)).La(),jF:(new ia(Infinity,Infinity)).La(),fF:(new w(-Infinity,-Infinity)).La(),eF:(new w(Infinity,Infinity)).La(),qp:(new ia(0,0)).La(),Vw:(new ia(1,1)).La(),op:(new ia(6,6)).La(),Sw:(new ia(8,8)).La(),gF:(new w(NaN,NaN)).La(),Ww:new pa,Ri:new pa,wA:null,sqrt:function(a){if(0>=a){return 0}var b=K.wA;if(null===b){for(var b=[],c=0;2000>=c;c++){b[c]=Math.sqrt(c)}K.wA=b}return 1>a?(c=1/a,2000>=c?1/b[c|0]:Math.sqrt(a)):2000>=a?b[a|0]:Math.sqrt(a)},D:function(a,b){var c=a-b;return 0.5>c&&-0.5<c},Wa:function(a,b){var c=a-b;return 5e-8>c&&-5e-8<c},sd:function(a,b,c,d,e,f,h){0>=e&&(e=0.000001);var k=0,l=0,m=0,n=0;a<c?(l=a,k=c):(l=c,k=a);b<d?(n=b,m=d):(n=d,m=b);if(a===c){return n<=h&&h<=m&&a-e<=f&&f<=a+e}if(b===d){return l<=f&&f<=k&&b-e<=h&&h<=b+e}k+=e;l-=e;if(l<=f&&f<=k&&(m+=e,n-=e,n<=h&&h<=m)){if(k-l>m-n){if(a-c>e||c-a>e){if(f=(d-b)/(c-a)*(f-a)+b,f-e<=h&&h<=f+e){return !0}}else{return !0}}else{if(b-d>e||d-b>e){if(h=(c-a)/(d-b)*(h-b)+a,h-e<=f&&f<=h+e){return !0}}else{return !0}}}return !1},Jv:function(a,b,c,d,e,f,h,k,l,m,n,p){if(K.sd(a,b,h,k,p,c,d)&&K.sd(a,b,h,k,p,e,f)){return K.sd(a,b,h,k,p,m,n)}var q=(a+c)/2,r=(b+d)/2,s=(c+e)/2,t=(d+f)/2;e=(e+h)/2;f=(f+k)/2;d=(q+s)/2;c=(r+t)/2;var s=(s+e)/2,t=(t+f)/2,v=(d+s)/2,x=(c+t)/2;return K.Jv(a,b,q,r,d,c,v,x,l,m,n,p)||K.Jv(v,x,s,t,e,f,h,k,l,m,n,p)},VF:function(a,b,c,d,e,f,h,k,l){var m=(c+e)/2,n=(d+f)/2;l.x=(((a+c)/2+m)/2+(m+(e+h)/2)/2)/2;l.y=(((b+d)/2+n)/2+(n+(f+k)/2)/2)/2;return l},UF:function(a,b,c,d,e,f,h,k){var l=(c+e)/2,m=(d+f)/2;return Za(((a+c)/2+l)/2,((b+d)/2+m)/2,(l+(e+h)/2)/2,(m+(f+k)/2)/2)},qo:function(a,b,c,d,e,f,h,k,l,m){if(K.sd(a,b,h,k,l,c,d)&&K.sd(a,b,h,k,l,e,f)){kb(m,a,b,0,0),kb(m,h,k,0,0)}else{var n=(a+c)/2,p=(b+d)/2,q=(c+e)/2,r=(d+f)/2;e=(e+h)/2;f=(f+k)/2;d=(n+q)/2;c=(p+r)/2;var q=(q+e)/2,r=(r+f)/2,s=(d+q)/2,t=(c+r)/2;K.qo(a,b,n,p,d,c,s,t,l,m);K.qo(s,t,q,r,e,f,h,k,l,m)}return m},Ae:function(a,b,c,d,e,f,h,k,l,m){if(K.sd(a,b,h,k,l,c,d)&&K.sd(a,b,h,k,l,e,f)){0===m.length&&(m.push(a),m.push(b)),m.push(h),m.push(k)}else{var n=(a+c)/2,p=(b+d)/2,q=(c+e)/2,r=(d+f)/2;e=(e+h)/2;f=(f+k)/2;d=(n+q)/2;c=(p+r)/2;var q=(q+e)/2,r=(r+f)/2,s=(d+q)/2,t=(c+r)/2;K.Ae(a,b,n,p,d,c,s,t,l,m);K.Ae(s,t,q,r,e,f,h,k,l,m)}return m},Pz:function(a,b,c,d,e,f,h,k,l,m){if(K.sd(a,b,e,f,m,c,d)){return K.sd(a,b,e,f,m,k,l)}var n=(a+c)/2,p=(b+d)/2;c=(c+e)/2;d=(d+f)/2;var q=(n+c)/2,r=(p+d)/2;return K.Pz(a,b,n,p,q,r,h,k,l,m)||K.Pz(q,r,c,d,e,f,h,k,l,m)},qK:function(a,b,c,d,e,f,h){h.x=((a+c)/2+(c+e)/2)/2;h.y=((b+d)/2+(d+f)/2)/2;return h},Oz:function(a,b,c,d,e,f,h,k){if(K.sd(a,b,e,f,h,c,d)){kb(k,a,b,0,0),kb(k,e,f,0,0)}else{var l=(a+c)/2,m=(b+d)/2;c=(c+e)/2;d=(d+f)/2;var n=(l+c)/2,p=(m+d)/2;K.Oz(a,b,l,m,n,p,h,k);K.Oz(n,p,c,d,e,f,h,k)}return k},Zo:function(a,b,c,d,e,f,h,k){if(K.sd(a,b,e,f,h,c,d)){0===k.length&&(k.push(a),k.push(b)),k.push(e),k.push(f)}else{var l=(a+c)/2,m=(b+d)/2;c=(c+e)/2;d=(d+f)/2;var n=(l+c)/2,p=(m+d)/2;K.Zo(a,b,l,m,n,p,h,k);K.Zo(n,p,c,d,e,f,h,k)}return k},ls:function(a,b,c,d,e,f,h,k,l,m,n,p,q,r){0>=q&&(q=0.000001);if(K.sd(a,b,h,k,q,c,d)&&K.sd(a,b,h,k,q,e,f)){var s=(a-h)*(m-p)-(b-k)*(l-n);if(0===s){return !1}q=((a*k-b*h)*(l-n)-(a-h)*(l*p-m*n))/s;s=((a*k-b*h)*(m-p)-(b-k)*(l*p-m*n))/s;if((l>n?l-n:n-l)<(m>p?m-p:p-m)){if(h=l=0,b<k?(l=b,h=k):(l=k,h=b),s<l||s>h){return !1}}else{if(a<h?l=a:(l=h,h=a),q<l||q>h){return !1}}r.x=q;r.y=s;return !0}var s=(a+c)/2,t=(b+d)/2;c=(c+e)/2;d=(d+f)/2;e=(e+h)/2;f=(f+k)/2;var v=(s+c)/2,x=(t+d)/2;c=(c+e)/2;d=(d+f)/2;var A=(v+c)/2,y=(x+d)/2,C=(n-l)*(n-l)+(p-m)*(p-m),I=!1;K.ls(a,b,s,t,v,x,A,y,l,m,n,p,q,r)&&(b=(r.x-l)*(r.x-l)+(r.y-m)*(r.y-m),b<C&&(C=b,I=!0));a=r.x;s=r.y;K.ls(A,y,c,d,e,f,h,k,l,m,n,p,q,r)&&(b=(r.x-l)*(r.x-l)+(r.y-m)*(r.y-m),b<C?I=!0:(r.x=a,r.y=s));return I},ms:function(a,b,c,d,e,f,h,k,l,m,n,p,q){var r=0;0>=q&&(q=0.000001);if(K.sd(a,b,h,k,q,c,d)&&K.sd(a,b,h,k,q,e,f)){q=(a-h)*(m-p)-(b-k)*(l-n);if(0===q){return r}var s=((a*k-b*h)*(l-n)-(a-h)*(l*p-m*n))/q,t=((a*k-b*h)*(m-p)-(b-k)*(l*p-m*n))/q;if(s>=n){return r}if((l>n?l-n:n-l)<(m>p?m-p:p-m)){if(a=l=0,b<k?(l=b,a=k):(l=k,a=b),t<l||t>a){return r}}else{if(a<h?(l=a,a=h):l=h,s<l||s>a){return r}}0<q?r++:0>q&&r--}else{var s=(a+c)/2,t=(b+d)/2,v=(c+e)/2,x=(d+f)/2;e=(e+h)/2;f=(f+k)/2;d=(s+v)/2;c=(t+x)/2;var v=(v+e)/2,x=(x+f)/2,A=(d+v)/2,y=(c+x)/2,r=r+K.ms(a,b,s,t,d,c,A,y,l,m,n,p,q),r=r+K.ms(A,y,v,x,e,f,h,k,l,m,n,p,q)}return r},Lm:function(a,b,c,d,e,f,h){if(K.Wa(a,c)){var k=0;c=0;b<d?(k=b,c=d):(k=d,c=b);d=f;if(d<k){return h.x=a,h.y=k,!1}if(d>c){return h.x=a,h.y=c,!1}h.x=a;h.y=d;return !0}if(K.Wa(b,d)){a<c?k=a:(k=c,c=a);d=e;if(d<k){return h.x=k,h.y=b,!1}if(d>c){return h.x=c,h.y=b,!1}h.x=d;h.y=b;return !0}k=((a-e)*(a-c)+(b-f)*(b-d))/((c-a)*(c-a)+(d-b)*(d-b));if(-0.000005>k){return h.x=a,h.y=b,!1 + }if(1.000005<k){return h.x=c,h.y=d,!1}h.x=a+k*(c-a);h.y=b+k*(d-b);return !0},bh:function(a,b,c,d,e,f,h,k,l){if(K.D(a,c)&&K.D(b,d)){return l.x=a,l.y=b,!1}if(K.Wa(e,h)){if(K.Wa(a,c)){return K.Lm(a,b,c,d,e,f,l),!1}f=(d-b)/(c-a)*(e-a)+b;return K.Lm(a,b,c,d,e,f,l)}k=(k-f)/(h-e);if(K.Wa(a,c)){f=k*(a-e)+f;c=h=0;b<d?(h=b,c=d):(h=d,c=b);if(f<h){return l.x=a,l.y=h,!1}if(f>c){return l.x=a,l.y=c,!1}l.x=a;l.y=f;return !0}h=(d-b)/(c-a);if(K.Wa(k,h)){return K.Lm(a,b,c,d,e,f,l),!1}e=(h*a-k*e+f-b)/(h-k);if(K.Wa(h,0)){a<c?h=a:(h=c,c=a);if(e<h){return l.x=h,l.y=b,!1}if(e>c){return l.x=c,l.y=b,!1}l.x=e;l.y=b;return !0}f=h*(e-a)+b;return K.Lm(a,b,c,d,e,f,l)},TJ:function(a,b,c,d,e){return K.bh(c.x,c.y,d.x,d.y,a.x,a.y,b.x,b.y,e)},BJ:function(a,b,c,d,e,f,h,k,l,m){function n(c,d){var e=(c-a)*(c-a)+(d-b)*(d-b);e<p&&(p=e,l.x=c,l.y=d)}var p=Infinity;n(l.x,l.y);var q=0,r=0,s=0,t=0;e<h?(q=e,r=h):(q=h,r=e);f<k?(s=e,t=h):(s=h,t=e);q=(r-q)/2+m;m=(t-s)/2+m;e=(e+h)/2;f=(f+k)/2;if(0===q||0===m){return l}if(0.5>(c>a?c-a:a-c)){q=1-(c-e)*(c-e)/(q*q);if(0>q){return l}q=Math.sqrt(q);d=-m*q+f;n(c,m*q+f);n(c,d)}else{c=(d-b)/(c-a);d=1/(q*q)+c*c/(m*m);k=2*c*(b-c*a)/(m*m)-2*c*f/(m*m)-2*e/(q*q);q=k*k-4*d*(2*c*a*f/(m*m)-2*b*f/(m*m)+f*f/(m*m)+e*e/(q*q)-1+(b-c*a)*(b-c*a)/(m*m));if(0>q){return l}q=Math.sqrt(q);m=(-k+q)/(2*d);n(m,c*m-c*a+b);q=(-k-q)/(2*d);n(q,c*q-c*a+b)}return l},bl:function(a,b,c,d,e,f,h,k,l){var m=1e+21,n=a,p=b;if(K.bh(a,b,a,d,e,f,h,k,l)){var q=(l.x-e)*(l.x-e)+(l.y-f)*(l.y-f);q<m&&(m=q,n=l.x,p=l.y)}K.bh(c,b,c,d,e,f,h,k,l)&&(q=(l.x-e)*(l.x-e)+(l.y-f)*(l.y-f),q<m&&(m=q,n=l.x,p=l.y));K.bh(a,b,c,b,e,f,h,k,l)&&(q=(l.x-e)*(l.x-e)+(l.y-f)*(l.y-f),q<m&&(m=q,n=l.x,p=l.y));K.bh(a,d,c,d,e,f,h,k,l)&&(q=(l.x-e)*(l.x-e)+(l.y-f)*(l.y-f),q<m&&(m=q,n=l.x,p=l.y));l.x=n;l.y=p;return 1e+21>m},ew:function(a,b,c){var d=b.x,e=b.y,f=c.x,h=c.y,k=a.left,l=a.right,m=a.top,n=a.bottom;return d===f?(f=a=0,e<h?(a=e,f=h):(a=h,f=e),k<=d&&d<=l&&a<=n&&f>=m):e===h?(d<f?a=d:(a=f,f=d),m<=e&&e<=n&&a<=l&&f>=k):a.Da(b)||a.Da(c)||K.dw(k,m,l,m,d,e,f,h)||K.dw(l,m,l,n,d,e,f,h)||K.dw(l,n,k,n,d,e,f,h)||K.dw(k,n,k,m,d,e,f,h)?!0:!1},dw:function(a,b,c,d,e,f,h,k){return 0>=K.Nv(a,b,c,d,e,f)*K.Nv(a,b,c,d,h,k)&&0>=K.Nv(e,f,h,k,a,b)*K.Nv(e,f,h,k,c,d)},Nv:function(a,b,c,d,e,f){c-=a;d-=b;a=e-a;b=f-b;f=a*d-b*c;0===f&&(f=a*c+b*d,0<f&&(f=(a-c)*c+(b-d)*d,0>f&&(f=0)));return 0>f?-1:0<f?1:0},dt:function(a){0>a&&(a+=360);360<=a&&(a-=360);return a},gD:function(a,b,c,d,e,f){var h=Math.PI;f||(d*=h/180,e*=h/180);f=d<e?1:-1;var k=[],l=h/2,m=d;for(d=Math.min(2*h,Math.abs(e-d));0.00001<d;){e=m+f*Math.min(d,l),k.push(K.kG(c,m,e,a,b)),d-=Math.abs(e-m),m=e}return k},kG:function(a,b,c,d,e){var f=(c-b)/2,h=a*Math.cos(f),k=a*Math.sin(f),l=-k,m=h*h+l*l,n=m+h*h+l*k,m=4/3*(Math.sqrt(2*m*n)-n)/(h*k-l*h),k=h-m*l,h=l+m*h,l=-h,m=f+b,f=Math.cos(m),m=Math.sin(m);return[d+a*Math.cos(b),e+a*Math.sin(b),d+k*f-h*m,e+k*m+h*f,d+k*f-l*m,e+k*m+l*f,d+a*Math.cos(c),e+a*Math.sin(c)]},ys:function(a,b,c,d,e,f,h){c=Math.floor((a-c)/e)*e+c;d=Math.floor((b-d)/f)*f+d;var k=c;c+e-a<e/2&&(k=c+e);a=d;d+f-b<f/2&&(a=d+f);h.m(k,a);return h},yD:function(a,b){var c=Math.max(a,b),d=Math.min(a,b),e=1,f=1;do{e=c%d,c=f=d,d=e}while(0<e);return f},tG:function(a,b,c,d){var e=0>c,f=0>d,h=0,k=h=0;a<b?(h=1,k=0):(h=0,k=1);var l=0,m=0,n=0,l=0===h?a:b,m=0===h?c:d;if(0===h?e:f){m=-m}h=k;n=0===h?c:d;if(0===h?e:f){n=-n}return K.uG(l,0===h?a:b,m,n,0,0)},uG:function(a,b,c,d,e,f){e=0;if(0<d){if(0<c){f=a*a;e=b*b;a*=c;var h=b*d,k=-e+h,l=-e+Math.sqrt(a*a+h*h);b=k;for(var m=0;9999999999>m;++m){b=0.5*(k+l);if(b===k||b===l){break}var n=a/(b+f),p=h/(b+e),n=n*n+p*p-1;if(0<n){k=b}else{if(0>n){l=b}else{break}}}c=f*c/(b+f)-c;d=e*d/(b+e)-d;e=Math.sqrt(c*c+d*d)}else{e=Math.abs(d-b)}}else{d=a*a-b*b,e=a*c,e<d?(d=e/d,e=a*d,f=b*Math.sqrt(Math.abs(1-d*d)),c=e-c,e=Math.sqrt(c*c+f*f)):e=Math.abs(c-a)}return e}};function $c(a){1<arguments.length&&u.k("Geometry constructor can take at most one optional argument, the Geometry type.");u.gc(this);this.Ea=!1;void 0===a&&(a=ad);this.pa=a;this.Bb=this.pb=this.tc=this.nc=0;this.Zi=new E(bd);this.ku=this.Zi.T;this.Vt=(new z).freeze();this.Ua=!0;this.si=xb;this.ti=Vb;this.En=this.Fn=NaN;this.ci=cd}u.fa("Geometry",$c);u.Nh($c);$c.prototype.copy=function(){var a=new $c;a.pa=this.pa;a.nc=this.nc;a.tc=this.tc;a.pb=this.pb;a.Bb=this.Bb;for(var b=this.Zi.n,c=b.length,d=a.Zi,e=0;e<c;e++){var f=b[e].copy();d.add(f)}a.ku=this.ku;a.Vt.assign(this.Vt);a.Ua=this.Ua;a.si=this.si.Z();a.ti=this.ti.Z();a.Fn=this.Fn;a.En=this.En;a.ci=this.ci;return a};var dd;$c.Line=dd=u.s($c,"Line",0);var md;$c.Rectangle=md=u.s($c,"Rectangle",1);var nd;$c.Ellipse=nd=u.s($c,"Ellipse",2);var ad;$c.Path=ad=u.s($c,"Path",3);$c.prototype.La=function(){this.freeze();Object.freeze(this);return this};$c.prototype.freeze=function(){this.Ea=!0;var a=this.ub;a.freeze();for(var a=a.n,b=a.length,c=0;c<b;c++){a[c].freeze()}return this};$c.prototype.Ma=function(){Object.isFrozen(this)&&u.k("cannot thaw constant: "+this);this.Ea=!1;var a=this.ub;a.Ma();for(var a=a.n,b=a.length,c=0;c<b;c++){a[c].Ma() + }return this};$c.prototype.equalsApprox=$c.prototype.pd=function(a){if(!(a instanceof $c)){return !1}if(this.type!==a.type){return this.type===dd&&a.type===ad?od(this,a):a.type===dd&&this.type===ad?od(a,this):!1}if(this.type===ad){var b=this.ub.n;a=a.ub.n;var c=b.length;if(c!==a.length){return !1}for(var d=0;d<c;d++){if(!b[d].pd(a[d])){return !1}}return !0}return K.D(this.va,a.va)&&K.D(this.wa,a.wa)&&K.D(this.F,a.F)&&K.D(this.G,a.G)};function od(a,b){if(a.type!==dd||b.type!==ad){return !1}if(1===b.ub.count){var c=b.ub.ja(0);if(1===c.Ga.count&&K.D(a.va,c.va)&&K.D(a.wa,c.wa)&&(c=c.Ga.ja(0),c.type===pd&&K.D(a.F,c.F)&&K.D(a.G,c.G))){return !0}}return !1}var qd;$c.stringify=qd=function(a){return a.toString()};$c.prototype.toString=function(a){void 0===a&&(a=-1);switch(this.type){case dd:return 0>a?"M"+this.va.toString()+" "+this.wa.toString()+"L"+this.F.toString()+" "+this.G.toString():"M"+this.va.toFixed(a)+" "+this.wa.toFixed(a)+"L"+this.F.toFixed(a)+" "+this.G.toFixed(a);case md:var b=new z(this.va,this.wa,0,0);b.YE(this.F,this.G,0,0);return 0>a?"M"+b.x.toString()+" "+b.y.toString()+"H"+b.right.toString()+"V"+b.bottom.toString()+"H"+b.left.toString()+"z":"M"+b.x.toFixed(a)+" "+b.y.toFixed(a)+"H"+b.right.toFixed(a)+"V"+b.bottom.toFixed(a)+"H"+b.left.toFixed(a)+"z";case nd:b=new z(this.va,this.wa,0,0);b.YE(this.F,this.G,0,0);if(0>a){var c=b.left.toString()+" "+(b.y+b.height/2).toString(),d=b.right.toString()+" "+(b.y+b.height/2).toString();return"M"+c+"A"+(b.width/2).toString()+" "+(b.height/2).toString()+" 0 0 1 "+d+"A"+(b.width/2).toString()+" "+(b.height/2).toString()+" 0 0 1 "+c}c=b.left.toFixed(a)+" "+(b.y+b.height/2).toFixed(a);d=b.right.toFixed(a)+" "+(b.y+b.height/2).toFixed(a);return"M"+c+"A"+(b.width/2).toFixed(a)+" "+(b.height/2).toFixed(a)+" 0 0 1 "+d+"A"+(b.width/2).toFixed(a)+" "+(b.height/2).toFixed(a)+" 0 0 1 "+c;case ad:for(var b="",c=this.ub.n,d=c.length,e=0;e<d;e++){var f=c[e];0<e&&(b+=" x ");f.Os&&(b+="F ");b+=f.toString(a)}return b;default:return this.type.toString()}};var rd;$c.fillPath=rd=function(a){"string"!==typeof a&&u.Ld(a,"string",$c,"fillPath:str");a=a.split(/[Xx]/);for(var b=a.length,c="",d=0;d<b;d++){var e=a[d],c=null!==e.match(/[Ff]/)?0===d?c+e:c+("X"+(" "===e[0]?"":" ")+e):c+((0===d?"":"X ")+"F"+(" "===e[0]?"":" ")+e)}return c};var sd;$c.parse=sd=function(a,b){function c(){return m>=t-1?!0:null!==l[m+1].match(/[A-Za-z]/)}function d(){m++;return l[m]}function e(){var a=new w(parseFloat(d()),parseFloat(d()));n===n.toLowerCase()&&(a.x=s.x+a.x,a.y=s.y+a.y);return a}function f(){return s=e()}function h(){return r=e()}function k(){return"c"!==p.toLowerCase()&&"s"!==p.toLowerCase()?s:new w(2*s.x-r.x,2*s.y-r.y)}void 0===b&&(b=!1);"string"!==typeof a&&u.Ld(a,"string",$c,"parse:str");a=a.replace(/,/gm," ");a=a.replace(/([UuBbMmZzLlHhVvCcSsQqTtAaFf])([UuBbMmZzLlHhVvCcSsQqTtAaFf])/gm,"$1 $2");a=a.replace(/([UuBbMmZzLlHhVvCcSsQqTtAaFf])([UuBbMmZzLlHhVvCcSsQqTtAaFf])/gm,"$1 $2");a=a.replace(/([UuBbMmZzLlHhVvCcSsQqTtAaFf])([^\s])/gm,"$1 $2");a=a.replace(/([^\s])([UuBbMmZzLlHhVvCcSsQqTtAaFf])/gm,"$1 $2");a=a.replace(/([0-9])([+\-])/gm,"$1 $2");a=a.replace(/(\.[0-9]*)(\.)/gm,"$1 $2");a=a.replace(/([Aa](\s+[0-9]+){3})\s+([01])\s*([01])/gm,"$1 $3 $4 ");a=a.replace(/[\s\r\t\n]+/gm," ");a=a.replace(/^\s+|\s+$/g,"");for(var l=a.split(" "),m=-1,n="",p="",q=new w(0,0),r=new w(0,0),s=new w(0,0),t=l.length,v=u.p(),x=!1,A=!1,y=!0;!(m>=t-1);){if(p=n,n=d(),""!==n){switch(n.toUpperCase()){case"X":y=!0;A=x=!1;break;case"M":var C=f();null===v.Tb||!0===y?(M(v,C.x,C.y,x,!1,!A),y=!1):v.moveTo(C.x,C.y);for(q=s;!c();){C=f(),v.lineTo(C.x,C.y)}break;case"L":for(;!c();){C=f(),v.lineTo(C.x,C.y)}break;case"H":for(;!c();){s=C=new w((n===n.toLowerCase()?s.x:0)+parseFloat(d()),s.y),v.lineTo(s.x,s.y)}break;case"V":for(;!c();){s=C=new w(s.x,(n===n.toLowerCase()?s.y:0)+parseFloat(d())),v.lineTo(s.x,s.y)}break;case"C":for(;!c();){var I=e(),H=h(),C=f();O(v,I.x,I.y,H.x,H.y,C.x,C.y)}break;case"S":for(;!c();){I=k(),H=h(),C=f(),O(v,I.x,I.y,H.x,H.y,C.x,C.y)}break;case"Q":for(;!c();){H=h(),C=f(),td(v,H.x,H.y,C.x,C.y)}break;case"T":for(;!c();){r=H=k(),C=f(),td(v,H.x,H.y,C.x,C.y)}break;case"B":for(;!c();){var C=parseFloat(d()),I=parseFloat(d()),H=parseFloat(d()),R=parseFloat(d()),aa=parseFloat(d()),S=aa,N=!1;c()||(S=parseFloat(d()),c()||(N=0!==parseFloat(d())));n===n.toLowerCase()&&(H+=s.x,R+=s.y);v.arcTo(C,I,H,R,aa,S,N)}break;case"A":for(;!c();){I=Math.abs(parseFloat(d())),H=Math.abs(parseFloat(d())),R=parseFloat(d()),aa=!!parseFloat(d()),S=!!parseFloat(d()),C=f(),ud(v,I,H,R,aa,S,C.x,C.y)}break;case"Z":C=v.o.ub.n[v.o.ub.length-1];P(v);s=q;break;case"F":C="";for(I=1;l[m+I];){if(null!==l[m+I].match(/[Uu]/)){I++}else{if(null===l[m+I].match(/[A-Za-z]/)){I++}else{C=l[m+I];break}}}C.match(/[Mm]/)?x=!0:vd(v);break;case"U":C="";for(I=1;l[m+I];){if(null!==l[m+I].match(/[Ff]/)){I++}else{if(null===l[m+I].match(/[A-Za-z]/)){I++}else{C=l[m+I];break}}}C.match(/[Mm]/)?A=!0:v.ab(!1)}}}q=v.o;u.q(v);if(b){for(v=q.ub.i;v.next();){C=v.value,C.Os=!0}}return q + };function wd(a,b){for(var c=a.length,d=u.K(),e=0;e<c;e++){var f=a[e];d.x=f[0];d.y=f[1];b.bb(d);f[0]=d.x;f[1]=d.y;d.x=f[2];d.y=f[3];b.bb(d);f[2]=d.x;f[3]=d.y;d.x=f[4];d.y=f[5];b.bb(d);f[4]=d.x;f[5]=d.y;d.x=f[6];d.y=f[7];b.bb(d);f[6]=d.x;f[7]=d.y}u.v(d)}$c.prototype.wz=function(){if(this.Ua||this.ku!==this.ub.T){return !0}for(var a=this.ub.n,b=a.length,c=0;c<b;c++){if(a[c].wz()){return !0}}return !1};$c.prototype.oA=function(){this.Ua=!1;this.ku=this.ub.T;for(var a=this.ub.n,b=a.length,c=0;c<b;c++){a[c].oA()}};$c.prototype.mg=function(){var a=this.Vt;a.Ma();isNaN(this.Fn)||isNaN(this.En)?a.m(0,0,0,0):a.m(0,0,this.Fn,this.En);xd(this,a,!1);kb(a,0,0,0,0);a.freeze()};$c.prototype.computeBoundsWithoutOrigin=$c.prototype.bG=function(){var a=new z;xd(this,a,!0);return a};function xd(a,b,c){switch(a.type){case dd:case md:case nd:c?b.m(a.nc,a.tc,0,0):kb(b,a.nc,a.tc,0,0);kb(b,a.pb,a.Bb,0,0);break;case ad:var d=a.ub;a=d.n;for(var d=d.length,e=0;e<d;e++){var f=a[e];c&&0===e?b.m(f.va,f.wa,0,0):kb(b,f.va,f.wa,0,0);for(var h=f.Ga.n,k=h.length,l=f.va,m=f.wa,n=0;n<k;n++){var p=h[n];switch(p.type){case pd:case yd:l=p.F;m=p.G;kb(b,l,m,0,0);break;case zd:K.qo(l,m,p.Rb,p.jc,p.ff,p.gf,p.F,p.G,0.5,b);l=p.F;m=p.G;break;case Ad:K.Oz(l,m,p.Rb,p.jc,p.F,p.G,0.5,b);l=p.F;m=p.G;break;case Bd:case Gd:var q=p.type===Bd?Hd(p,f):Id(p,f,l,m),r=q.length;if(0===r){l=p.ma;m=p.ya;kb(b,l,m,0,0);break}for(var p=null,s=0;s<r;s++){p=q[s],K.qo(p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7],0.5,b)}null!==p&&(l=p[6],m=p[7]);break;default:u.k("Unknown Segment type: "+p.type)}}}break;default:u.k("Unknown Geometry type: "+a.type)}}$c.prototype.normalize=$c.prototype.normalize=function(){u.J(this);var a=this.bG();this.offset(-a.x,-a.y);return new w(-a.x,-a.y)};$c.prototype.offset=$c.prototype.offset=function(a,b){u.J(this);this.transform(1,0,0,1,a,b);return this};$c.prototype.scale=$c.prototype.scale=function(a,b){u.J(this);this.transform(a,0,0,b,0,0);return this};$c.prototype.rotate=$c.prototype.rotate=function(a,b,c){u.J(this);void 0===b&&(b=0);void 0===c&&(c=0);var d=u.lh();d.reset();d.rotate(a,b,c);this.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy);u.Ze(d);return this};$c.prototype.transform=$c.prototype.transform=function(a,b,c,d,e,f){var h=0,k=0;switch(this.type){case dd:case md:case nd:h=this.nc;k=this.tc;this.nc=h*a+k*c+e;this.tc=h*b+k*d+f;h=this.pb;k=this.Bb;this.pb=h*a+k*c+e;this.Bb=h*b+k*d+f;break;case ad:for(var l=this.ub.n,m=l.length,n=0;n<m;n++){var p=l[n],h=p.va,k=p.wa;p.va=h*a+k*c+e;p.wa=h*b+k*d+f;for(var p=p.Ga.n,q=p.length,r=0;r<q;r++){var s=p[r];switch(s.type){case pd:case yd:h=s.F;k=s.G;s.F=h*a+k*c+e;s.G=h*b+k*d+f;break;case zd:h=s.Rb;k=s.jc;s.Rb=h*a+k*c+e;s.jc=h*b+k*d+f;h=s.ff;k=s.gf;s.ff=h*a+k*c+e;s.gf=h*b+k*d+f;h=s.F;k=s.G;s.F=h*a+k*c+e;s.G=h*b+k*d+f;break;case Ad:h=s.Rb;k=s.jc;s.Rb=h*a+k*c+e;s.jc=h*b+k*d+f;h=s.F;k=s.G;s.F=h*a+k*c+e;s.G=h*b+k*d+f;break;case Bd:h=s.ma;k=s.ya;s.ma=h*a+k*c+e;s.ya=h*b+k*d+f;0!==b&&(h=180*Math.atan2(b,a)/Math.PI,0>h&&(h+=360),s.Ke+=h);0>a&&(s.Ke=180-s.Ke,s.Rf=-s.Rf);0>d&&(s.Ke=-s.Ke,s.Rf=-s.Rf);s.radiusX*=Math.sqrt(a*a+c*c);void 0!==s.radiusY&&(s.radiusY*=Math.sqrt(b*b+d*d));break;case Gd:h=s.F;k=s.G;s.F=h*a+k*c+e;s.G=h*b+k*d+f;0!==b&&(h=180*Math.atan2(b,a)/Math.PI,0>h&&(h+=360),s.Qi+=h);0>a&&(s.Qi=180-s.Qi,s.fl=!s.fl);0>d&&(s.Qi=-s.Qi,s.fl=!s.fl);s.radiusX*=Math.sqrt(a*a+c*c);s.radiusY*=Math.sqrt(b*b+d*d);break;default:u.k("Unknown Segment type: "+s.type)}}}}this.Ua=!0;return this};$c.prototype.Zr=function(a,b){var c=this.nc,d=this.tc,e=this.pb,f=this.Bb,h=Math.min(c,e),k=Math.min(d,f),c=Math.abs(e-c),d=Math.abs(f-d),f=u.K();f.x=h;f.y=k;b.bb(f);e=new bd(f.x,f.y);f.x=h+c;f.y=k;b.bb(f);e.Ga.add(new Jd(pd,f.x,f.y));f.x=h+c;f.y=k+d;b.bb(f);e.Ga.add(new Jd(pd,f.x,f.y));f.x=h;f.y=k+d;b.bb(f);e.Ga.add((new Jd(pd,f.x,f.y)).close());u.v(f);a.type=ad;a.ub.add(e);return a};$c.prototype.Da=function(a,b,c,d){var e=a.x,f=a.y,h=this.mb.x-20;a=a.y;for(var k=0,l=0,m=0,n=0,p=0,q=0,r=this.ub.n,s=r.length,t=0;t<s;t++){var v=r[t];if(v.Os){if(c&&v.Da(e,f,b)){return !0}for(var x=v.Ga,l=v.va,m=v.wa,A=l,y=m,C=x.n,I=0;I<=x.length;I++){var H,R;I!==x.length?(H=C[I],R=H.type,p=H.F,q=H.G):(R=pd,p=A,q=y);switch(R){case yd:n=Kd(e,f,h,a,l,m,A,y);if(isNaN(n)){return !0}k+=n;A=p;y=q;break;case pd:n=Kd(e,f,h,a,l,m,p,q);if(isNaN(n)){return !0}k+=n;break;case zd:n=K.ms(l,m,H.Rb,H.jc,H.ff,H.gf,p,q,h,a,e,f,0.5);k+=n;break;case Ad:n=K.ms(l,m,(l+2*H.Rb)/3,(m+2*H.jc)/3,(H.Rb+2*p)/3,(H.Rb+2*p)/3,p,q,h,a,e,f,0.5);k+=n;break;case Bd:case Gd:R=H.type===Bd?Hd(H,v):Id(H,v,l,m);var aa=R.length;if(0===aa){n=Kd(e,f,h,a,l,m,H.ma,H.ya);if(isNaN(n)){return !0}k+=n;break}for(var S=null,N=0;N<aa;N++){S=R[N];if(0===N){n=Kd(e,f,h,a,l,m,S[0],S[1]);if(isNaN(n)){return !0}k+=n}n=K.ms(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],h,a,e,f,0.5);k+=n}null!==S&&(p=S[6],q=S[7]);break;default:u.k("Unknown Segment type: "+H.type)}l=p;m=q}if(0!==k){return !0}k=0}else{if(v.Da(e,f,d?b:b+2)){return !0}}}return 0!==k};function Kd(a,b,c,d,e,f,h,k){if(K.sd(e,f,h,k,0.05,a,b)){return NaN}var l=(a-c)*(f-k); + if(0===l){return 0}var m=((a*d-b*c)*(e-h)-(a-c)*(e*k-f*h))/l;b=(a*d-b*c)*(f-k)/l;if(m>=a){return 0}if((e>h?e-h:h-e)<(f>k?f-k:k-f)){if(e=a=0,f<k?(a=f,e=k):(a=k,e=f),b<a||b>e){return 0}}else{if(e<h?(a=e,e=h):a=h,m<a||m>e){return 0}}return 0<l?1:-1}function Ld(a,b,c,d){a=a.ub.n;for(var e=a.length,f=0;f<e;f++){if(a[f].Da(b,c,d)){return !0}}return !1}$c.prototype.getPointAlongPath=function(a){(0>a||1<a)&&u.xa(a,"0 <= fraction <= 1",$c,"getPointAlongPath:fraction");var b=this.ub.first(),c=u.hb(),d=[];d.push(b.va);d.push(b.wa);for(var e=b.va,f=b.wa,h=e,k=f,l=b.Ga.n,m=l.length,n=0;n<m;n++){var p=l[n];switch(p.pa){case yd:c.push(d);d=[];d.push(p.F);d.push(p.G);e=p.F;f=p.G;h=e;k=f;break;case pd:d.push(p.F);d.push(p.G);e=p.F;f=p.G;break;case zd:K.Ae(e,f,p.dd,p.ze,p.fg,p.gg,p.pb,p.Bb,0.5,d);e=p.F;f=p.G;break;case Ad:K.Zo(e,f,p.dd,p.ze,p.pb,p.Bb,0.5,d);e=p.F;f=p.G;break;case Bd:var q=Hd(p,b),r=q.length;if(0===r){d.push(p.ma);d.push(p.ya);e=p.ma;f=p.ya;break}for(var s=0;s<r;s++){var t=q[s];K.Ae(e,f,t[2],t[3],t[4],t[5],t[6],t[7],0.5,d);e=t[6];f=t[7]}break;case Gd:q=Id(p,b,e,f);r=q.length;for(s=0;s<r;s++){t=q[s],K.Ae(e,f,t[2],t[3],t[4],t[5],t[6],t[7],0.5,d),e=t[6],f=t[7]}break;default:u.k("Segment not of valid type")}p.Bh&&(d.push(h),d.push(k))}c.push(d);q=0;h=c.length;for(k=d=b=0;k<h;k++){for(l=c[k],m=l.length,n=0;n<m;n+=2){e=l[n],f=l[n+1],0!==n&&(p=Math.sqrt(Ya(b,d,e,f)),q+=p),b=e,d=f}}a*=q;for(k=q=0;k<h;k++){for(l=c[k],m=l.length,n=0;n<m;n++){e=l[n];f=l[n+1];if(0!==n){p=Math.sqrt(Ya(b,d,e,f));if(q+p>a){return n=(a-q)/p,u.sa(c),new w(b+(e-b)*n,d+(f-d)*n)}q+=p}b=e;d=f}}u.sa(c);return null};u.defineProperty($c,{type:"type"},function(){return this.pa},function(a){this.pa!==a&&(u.J(this,a),this.pa=a,this.Ua=!0)});u.defineProperty($c,{va:"startX"},function(){return this.nc},function(a){this.nc!==a&&(u.J(this,a),this.nc=a,this.Ua=!0)});u.defineProperty($c,{wa:"startY"},function(){return this.tc},function(a){this.tc!==a&&(u.J(this,a),this.tc=a,this.Ua=!0)});u.defineProperty($c,{F:"endX"},function(){return this.pb},function(a){this.pb!==a&&(u.J(this,a),this.pb=a,this.Ua=!0)});u.defineProperty($c,{G:"endY"},function(){return this.Bb},function(a){this.Bb!==a&&(u.J(this,a),this.Bb=a,this.Ua=!0)});u.defineProperty($c,{ub:"figures"},function(){return this.Zi},function(a){this.Zi!==a&&(u.J(this,a),this.Zi=a,this.Ua=!0)});$c.prototype.add=$c.prototype.add=function(a){this.Zi.add(a);return this};u.defineProperty($c,{A:"spot1"},function(){return this.si},function(a){u.J(this,a);this.si=a.Z()});u.defineProperty($c,{B:"spot2"},function(){return this.ti},function(a){u.J(this,a);this.ti=a.Z()});u.defineProperty($c,{Dd:"defaultStretch"},function(){return this.ci},function(a){u.J(this,a);this.ci=a});u.u($c,{mb:"bounds"},function(){this.wz()&&(this.oA(),this.mg());return this.Vt});function bd(a,b,c,d){u.gc(this);this.Ea=!1;void 0===c&&(c=!0);this.Ml=c;void 0===d&&(d=!0);this.Gn=d;this.nc=void 0!==a?a:0;this.tc=void 0!==b?b:0;this.$n=new E(Jd);this.ev=this.$n.T;this.Ua=!0}u.fa("PathFigure",bd);u.Nh(bd);bd.prototype.copy=function(){var a=new bd;a.Ml=this.Ml;a.Gn=this.Gn;a.nc=this.nc;a.tc=this.tc;for(var b=this.$n.n,c=b.length,d=a.$n,e=0;e<c;e++){var f=b[e].copy();d.add(f)}a.ev=this.ev;a.Ua=this.Ua;return a};bd.prototype.equalsApprox=bd.prototype.pd=function(a){if(!(a instanceof bd&&K.D(this.va,a.va)&&K.D(this.wa,a.wa))){return !1}var b=this.Ga.n;a=a.Ga.n;var c=b.length;if(c!==a.length){return !1}for(var d=0;d<c;d++){if(!b[d].pd(a[d])){return !1}}return !0};g=bd.prototype;g.toString=function(a){void 0===a&&(a=-1);for(var b=0>a?"M"+this.va.toString()+" "+this.wa.toString():"M"+this.va.toFixed(a)+" "+this.wa.toFixed(a),c=this.Ga.n,d=c.length,e=0;e<d;e++){b+=" "+c[e].toString(a)}return b};g.freeze=function(){this.Ea=!0;var a=this.Ga;a.freeze();for(var b=a.n,a=a.length,c=0;c<a;c++){b[c].freeze()}return this};g.Ma=function(){this.Ea=!1;var a=this.Ga;a.Ma();for(var a=a.n,b=a.length,c=0;c<b;c++){a[c].Ma()}return this};g.wz=function(){if(this.Ua){return !0}var a=this.Ga;if(this.ev!==a.T){return !0}for(var a=a.n,b=a.length,c=0;c<b;c++){if(a[c].Ua){return !0}}return !1};g.oA=function(){this.Ua=!1;var a=this.Ga;this.ev=a.T;for(var a=a.n,b=a.length,c=0;c<b;c++){var d=a[c];d.Ua=!1;d.Wf=null}};u.defineProperty(bd,{Os:"isFilled"},function(){return this.Ml},function(a){u.J(this,a);this.Ml=a});u.defineProperty(bd,{il:"isShadowed"},function(){return this.Gn},function(a){u.J(this,a);this.Gn=a});u.defineProperty(bd,{va:"startX"},function(){return this.nc},function(a){u.J(this,a);this.nc=a;this.Ua=!0});u.defineProperty(bd,{wa:"startY"},function(){return this.tc},function(a){u.J(this,a);this.tc=a;this.Ua=!0});u.defineProperty(bd,{Ga:"segments"},function(){return this.$n},function(a){u.J(this,a);this.$n=a;this.Ua=!0});bd.prototype.add=bd.prototype.add=function(a){this.$n.add(a);return this};bd.prototype.Da=function(a,b,c){for(var d=this.va,e=this.wa,f=d,h=e,k=this.Ga.n,l=k.length,m=0;m<l;m++){var n=k[m];switch(n.type){case yd:f=n.F;h=n.G;d=n.F;e=n.G;break;case pd:if(K.sd(d,e,n.F,n.G,c,a,b)){return !0 + }d=n.F;e=n.G;break;case zd:if(K.Jv(d,e,n.Rb,n.jc,n.ff,n.gf,n.F,n.G,0.5,a,b,c)){return !0}d=n.F;e=n.G;break;case Ad:if(K.Pz(d,e,n.Rb,n.jc,n.F,n.G,0.5,a,b,c)){return !0}d=n.F;e=n.G;break;case Bd:case Gd:var p=n.type===Bd?Hd(n,this):Id(n,this,d,e),q=p.length;if(0===q){if(K.sd(d,e,n.ma,n.ya,c,a,b)){return !0}d=n.ma;e=n.ya;break}for(var r=null,s=0;s<q;s++){if(r=p[s],0===s&&K.sd(d,e,r[0],r[1],c,a,b)||K.Jv(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],0.5,a,b,c)){return !0}}null!==r&&(d=r[6],e=r[7]);break;default:u.k("Unknown Segment type: "+n.type)}if(n.fw&&(d!==f||e!==h)&&K.sd(d,e,f,h,c,a,b)){return !0}}return !1};function Jd(a,b,c,d,e,f,h,k){u.gc(this);this.Ea=!1;void 0===a&&(a=pd);this.pa=a;this.pb=void 0!==b?b:0;this.Bb=void 0!==c?c:0;a===Gd?(void 0!==f&&(a=f%360,0>a&&(a+=360),this.dd=a),void 0!==d&&(this.fg=Math.max(d,0)),void 0!==e&&(this.gg=Math.max(e,0)),this.Nn=!!h,this.dn=!!k):(void 0!==d&&(this.dd=d),void 0!==e&&(this.ze=e),void 0!==f&&(a===Bd&&(f=Math.max(f,0)),this.fg=f),void 0!==h&&"number"===typeof h&&(a===Bd&&(h=Math.max(h,0)),this.gg=h));this.Bh=!1;this.Ua=!0;this.Wf=null}u.fa("PathSegment",Jd);u.Nh(Jd);Jd.prototype.copy=function(){var a=new Jd;a.pa=this.pa;a.pb=this.pb;a.Bb=this.Bb;void 0!==this.dd&&(a.dd=this.dd);void 0!==this.ze&&(a.ze=this.ze);void 0!==this.fg&&(a.fg=this.fg);void 0!==this.gg&&(a.gg=this.gg);void 0!==this.Nn&&(a.Nn=this.Nn);void 0!==this.dn&&(a.dn=this.dn);a.Bh=this.Bh;a.Ua=this.Ua;return a};Jd.prototype.equalsApprox=Jd.prototype.pd=function(a){if(!(a instanceof Jd)||this.type!==a.type||this.fw!==a.fw){return !1}switch(this.type){case yd:case pd:return K.D(this.F,a.F)&&K.D(this.G,a.G);case zd:return K.D(this.F,a.F)&&K.D(this.G,a.G)&&K.D(this.Rb,a.Rb)&&K.D(this.jc,a.jc)&&K.D(this.ff,a.ff)&&K.D(this.gf,a.gf);case Ad:return K.D(this.F,a.F)&&K.D(this.G,a.G)&&K.D(this.Rb,a.Rb)&&K.D(this.jc,a.jc);case Bd:return K.D(this.Ke,a.Ke)&&K.D(this.Rf,a.Rf)&&K.D(this.ma,a.ma)&&K.D(this.ya,a.ya)&&K.D(this.radiusX,a.radiusX)&&K.D(this.radiusY,a.radiusY);case Gd:return this.fl===a.fl&&this.iw===a.iw&&K.D(this.Qi,a.Qi)&&K.D(this.F,a.F)&&K.D(this.G,a.G)&&K.D(this.radiusX,a.radiusX)&&K.D(this.radiusY,a.radiusY);default:return !1}};Jd.prototype.toString=function(a){void 0===a&&(a=-1);var b="";switch(this.type){case yd:b=0>a?"M"+this.F.toString()+" "+this.G.toString():"M"+this.F.toFixed(a)+" "+this.G.toFixed(a);break;case pd:b=0>a?"L"+this.F.toString()+" "+this.G.toString():"L"+this.F.toFixed(a)+" "+this.G.toFixed(a);break;case zd:b=0>a?"C"+this.Rb.toString()+" "+this.jc.toString()+" "+this.ff.toString()+" "+this.gf.toString()+" "+this.F.toString()+" "+this.G.toString():"C"+this.Rb.toFixed(a)+" "+this.jc.toFixed(a)+" "+this.ff.toFixed(a)+" "+this.gf.toFixed(a)+" "+this.F.toFixed(a)+" "+this.G.toFixed(a);break;case Ad:b=0>a?"Q"+this.Rb.toString()+" "+this.jc.toString()+" "+this.F.toString()+" "+this.G.toString():"Q"+this.Rb.toFixed(a)+" "+this.jc.toFixed(a)+" "+this.F.toFixed(a)+" "+this.G.toFixed(a);break;case Bd:b=0>a?"B"+this.Ke.toString()+" "+this.Rf.toString()+" "+this.ma.toString()+" "+this.ya.toString()+" "+this.radiusX:"B"+this.Ke.toFixed(a)+" "+this.Rf.toFixed(a)+" "+this.ma.toFixed(a)+" "+this.ya.toFixed(a)+" "+this.radiusX;break;case Gd:b=0>a?"A"+this.radiusX.toString()+" "+this.radiusY.toString()+" "+this.Qi.toString()+" "+(this.iw?1:0)+" "+(this.fl?1:0)+" "+this.F.toString()+" "+this.G.toString():"A"+this.radiusX.toFixed(a)+" "+this.radiusY.toFixed(a)+" "+this.Qi.toFixed(a)+" "+(this.iw?1:0)+" "+(this.fl?1:0)+" "+this.F.toFixed(a)+" "+this.G.toFixed(a);break;default:b=this.type.toString()}return b+(this.Bh?"z":"")};var yd;Jd.Move=yd=u.s(Jd,"Move",0);var pd;Jd.Line=pd=u.s(Jd,"Line",1);var zd;Jd.Bezier=zd=u.s(Jd,"Bezier",2);var Ad;Jd.QuadraticBezier=Ad=u.s(Jd,"QuadraticBezier",3);var Bd;Jd.Arc=Bd=u.s(Jd,"Arc",4);var Gd;Jd.SvgArc=Gd=u.s(Jd,"SvgArc",4);Jd.prototype.freeze=function(){this.Ea=!0;return this};Jd.prototype.Ma=function(){this.Ea=!1;return this};Jd.prototype.close=Jd.prototype.close=function(){this.Bh=!0;return this};function Hd(a,b){if(null!==a.Wf&&!1===b.Ua){return a.Wf}var c=a.radiusX,d=a.radiusY;void 0===d&&(d=c);if(0===c||0===d){return a.Wf=[],a.Wf}var e=a.dd,f=a.ze,h=K.gD(0,0,c<d?c:d,a.Ke,a.Ke+a.Rf,!1);if(c!==d){var k=u.lh();k.reset();c<d?k.scale(1,d/c):k.scale(c/d,1);wd(h,k);u.Ze(k)}c=h.length;for(d=0;d<c;d++){k=h[d],k[0]+=e,k[1]+=f,k[2]+=e,k[3]+=f,k[4]+=e,k[5]+=f,k[6]+=e,k[7]+=f}a.Wf=h;return a.Wf}function Id(a,b,c,d){function e(a,b,c,d){return(a*d<b*c?-1:1)*Math.acos(f(a,b,c,d))}function f(a,b,c,d){return(a*c+b*d)/(Math.sqrt(a*a+b*b)*Math.sqrt(c*c+d*d))}if(null!==a.Wf&&!1===b.Ua){return a.Wf}b=a.fg;var h=a.gg;if(0===b||0===h){return a.Wf=[],a.Wf}var k=Math.PI/180*a.dd,l=a.Nn,m=a.dn,n=a.pb,p=a.Bb,q=Math.cos(k),r=Math.sin(k),s=q*(c-n)/2+r*(d-p)/2,k=-r*(c-n)/2+q*(d-p)/2,t=s*s/(b*b)+k*k/(h*h);1<t&&(b*=Math.sqrt(t),h*=Math.sqrt(t));t=(l===m?-1:1)*Math.sqrt((b*b*h*h-b*b*k*k-h*h*s*s)/(b*b*k*k+h*h*s*s));isNaN(t)&&(t=0);l=t*b*k/h;t=t*-h*s/b;isNaN(l)&&(l=0);isNaN(t)&&(t=0);c=(c+n)/2+q*l-r*t; + d=(d+p)/2+r*l+q*t;p=e(1,0,(s-l)/b,(k-t)/h);q=(s-l)/b;n=(k-t)/h;s=(-s-l)/b;l=(-k-t)/h;k=e(q,n,s,l);s=f(q,n,s,l);-1>=s?k=Math.PI:1<=s&&(k=0);!m&&0<k&&(k-=2*Math.PI);m&&0>k&&(k+=2*Math.PI);m=b>h?1:b/h;s=b>h?h/b:1;b=K.gD(0,0,b>h?b:h,p,p+k,!0);h=u.lh();h.reset();h.translate(c,d);h.rotate(a.dd,0,0);h.scale(m,s);wd(b,h);u.Ze(h);a.Wf=b;return a.Wf}u.defineProperty(Jd,{fw:"isClosed"},function(){return this.Bh},function(a){this.Bh!==a&&(this.Bh=a,this.Ua=!0)});u.defineProperty(Jd,{type:"type"},function(){return this.pa},function(a){u.J(this,a);this.pa=a;this.Ua=!0});u.defineProperty(Jd,{F:"endX"},function(){return this.pb},function(a){u.J(this,a);this.pb=a;this.Ua=!0});u.defineProperty(Jd,{G:"endY"},function(){return this.Bb},function(a){u.J(this,a);this.Bb=a;this.Ua=!0});u.defineProperty(Jd,{Rb:"point1X"},function(){return this.dd},function(a){u.J(this,a);this.dd=a;this.Ua=!0});u.defineProperty(Jd,{jc:"point1Y"},function(){return this.ze},function(a){u.J(this,a);this.ze=a;this.Ua=!0});u.defineProperty(Jd,{ff:"point2X"},function(){return this.fg},function(a){u.J(this,a);this.fg=a;this.Ua=!0});u.defineProperty(Jd,{gf:"point2Y"},function(){return this.gg},function(a){u.J(this,a);this.gg=a;this.Ua=!0});u.defineProperty(Jd,{ma:"centerX"},function(){return this.dd},function(a){u.J(this,a);this.dd=a;this.Ua=!0});u.defineProperty(Jd,{ya:"centerY"},function(){return this.ze},function(a){u.J(this,a);this.ze=a;this.Ua=!0});u.defineProperty(Jd,{radiusX:"radiusX"},function(){return this.fg},function(a){0>a&&u.xa(a,">= zero",Jd,"radiusX");u.J(this,a);this.fg=a;this.Ua=!0});u.defineProperty(Jd,{radiusY:"radiusY"},function(){return this.gg},function(a){0>a&&u.xa(a,">= zero",Jd,"radiusY");u.J(this,a);this.gg=a;this.Ua=!0});u.defineProperty(Jd,{Ke:"startAngle"},function(){return this.pb},function(a){this.pb!==a&&(u.J(this,a),a%=360,0>a&&(a+=360),this.pb=a,this.Ua=!0)});u.defineProperty(Jd,{Rf:"sweepAngle"},function(){return this.Bb},function(a){u.J(this,a);360<a&&(a=360);-360>a&&(a=-360);this.Bb=a;this.Ua=!0});u.defineProperty(Jd,{fl:"isClockwiseArc"},function(){return this.dn},function(a){u.J(this,a);this.dn=a;this.Ua=!0});u.defineProperty(Jd,{iw:"isLargeArc"},function(){return this.Nn},function(a){u.J(this,a);this.Nn=a;this.Ua=!0});u.defineProperty(Jd,{Qi:"xAxisRotation"},function(){return this.dd},function(a){a%=360;0>a&&(a+=360);u.J(this,a);this.dd=a;this.Ua=!0});function Md(){this.Y=null;this.Jy=(new w(0,0)).freeze();this.Ex=(new w(0,0)).freeze();this.St=this.Ou=0;this.Bu="";this.sv=this.hu=!1;this.du=this.Ut=0;this.Si=this.ou=this.xu=!1;this.Xp=null;this.rv=0;this.hg=this.pv=null}u.fa("InputEvent",Md);Md.prototype.copy=function(){var a=new Md;a.Y=this.Y;a.Jy.assign(this.hf);a.Ex.assign(this.da);a.Ou=this.Ou;a.St=this.St;a.Bu=this.Bu;a.hu=this.hu;a.sv=this.sv;a.Ut=this.Ut;a.du=this.du;a.xu=this.xu;a.ou=this.ou;a.Si=this.Si;a.Xp=this.Xp;a.rv=this.rv;a.pv=this.pv;a.hg=this.hg;return a};Md.prototype.toString=function(){var a="^";0!==this.jd&&(a+="M:"+this.jd);0!==this.button&&(a+="B:"+this.button);""!==this.key&&(a+="K:"+this.key);0!==this.Ue&&(a+="C:"+this.Ue);0!==this.Uk&&(a+="D:"+this.Uk);this.Tc&&(a+="h");this.bubbles&&(a+="b");null!==this.da&&(a+="@"+this.da.toString());return a};u.defineProperty(Md,{g:"diagram"},function(){return this.Y},function(a){this.Y=a});u.defineProperty(Md,{hf:"viewPoint"},function(){return this.Jy},function(a){u.C(a,w,Md,"viewPoint");this.Jy.assign(a)});u.defineProperty(Md,{da:"documentPoint"},function(){return this.Ex},function(a){u.C(a,w,Md,"documentPoint");this.Ex.assign(a)});u.defineProperty(Md,{jd:"modifiers"},function(){return this.Ou},function(a){this.Ou=a});u.defineProperty(Md,{button:"button"},function(){return this.St},function(a){this.St=a});u.defineProperty(Md,{key:"key"},function(){return this.Bu},function(a){this.Bu=a});u.defineProperty(Md,{Wk:"down"},function(){return this.hu},function(a){this.hu=a});u.defineProperty(Md,{up:"up"},function(){return this.sv},function(a){this.sv=a});u.defineProperty(Md,{Ue:"clickCount"},function(){return this.Ut},function(a){this.Ut=a});u.defineProperty(Md,{Uk:"delta"},function(){return this.du},function(a){this.du=a});u.defineProperty(Md,{Qs:"isMultiTouch"},function(){return this.xu},function(a){this.xu=a});u.defineProperty(Md,{Tc:"handled"},function(){return this.ou},function(a){this.ou=a});u.defineProperty(Md,{bubbles:"bubbles"},function(){return this.Si},function(a){this.Si=a});u.defineProperty(Md,{event:"event"},function(){return this.Xp},function(a){this.Xp=a});u.u(Md,{kl:"isTouchEvent"},function(){var a=window.TouchEvent;return a&&this.event instanceof a?!0:(a=window.PointerEvent)&&this.event instanceof a&&"touch"===this.event.pointerType});u.defineProperty(Md,{timestamp:"timestamp"},function(){return this.rv},function(a){this.rv=a});u.defineProperty(Md,{Eg:"targetDiagram"},function(){return this.pv},function(a){this.pv=a});u.defineProperty(Md,{qe:"targetObject"},function(){return this.hg},function(a){this.hg=a});u.defineProperty(Md,{control:"control"},function(){return 0!==(this.jd&1) + },function(a){this.jd=a?this.jd|1:this.jd&-2});u.defineProperty(Md,{shift:"shift"},function(){return 0!==(this.jd&4)},function(a){this.jd=a?this.jd|4:this.jd&-5});u.defineProperty(Md,{alt:"alt"},function(){return 0!==(this.jd&2)},function(a){this.jd=a?this.jd|2:this.jd&-3});u.defineProperty(Md,{Zs:"meta"},function(){return 0!==(this.jd&8)},function(a){this.jd=a?this.jd|8:this.jd&-9});u.defineProperty(Md,{left:"left"},function(){return 0===this.button},function(a){this.button=a?0:2});u.defineProperty(Md,{aK:"middle"},function(){return 1===this.button},function(a){this.button=a?1:0});u.defineProperty(Md,{right:"right"},function(){return 2===this.button},function(a){this.button=a?2:0});function Nd(){this.Y=null;this.Vb="";this.Xu=this.kv=null;this.Tt=!1}u.fa("DiagramEvent",Nd);Nd.prototype.copy=function(){var a=new Nd;a.Y=this.Y;a.Vb=this.Vb;a.kv=this.kv;a.Xu=this.Xu;a.Tt=this.Tt;return a};Nd.prototype.toString=function(){var a="*"+this.name;this.cancel&&(a+="x");null!==this.iA&&(a+=":"+this.iA.toString());null!==this.Nz&&(a+="("+this.Nz.toString()+")");return a};u.defineProperty(Nd,{g:"diagram"},function(){return this.Y},function(a){this.Y=a});u.defineProperty(Nd,{name:"name"},function(){return this.Vb},function(a){this.Vb=a});u.defineProperty(Nd,{iA:"subject"},function(){return this.kv},function(a){this.kv=a});u.defineProperty(Nd,{Nz:"parameter"},function(){return this.Xu},function(a){this.Xu=a});u.defineProperty(Nd,{cancel:"cancel"},function(){return this.Tt},function(a){this.Tt=a});function Od(){this.Dp=$d;this.am=this.Nu="";this.Yq=this.Zq=this.cr=this.dr=this.br=this.Y=this.Pd=null}u.fa("ChangedEvent",Od);var ae;Od.Transaction=ae=u.s(Od,"Transaction",-1);var $d;Od.Property=$d=u.s(Od,"Property",0);var be;Od.Insert=be=u.s(Od,"Insert",1);var ce;Od.Remove=ce=u.s(Od,"Remove",2);Od.prototype.clear=Od.prototype.clear=function(){this.Yq=this.Zq=this.cr=this.dr=this.br=this.Y=this.Pd=null};Od.prototype.copy=function(){var a=new Od;a.Pd=this.Pd;a.Y=this.Y;a.Dp=this.Dp;a.Nu=this.Nu;a.am=this.am;a.br=this.br;var b=this.dr;a.dr=u.Ta(b)&&"function"===typeof b.Z?b.Z():b;b=this.cr;a.cr=u.Ta(b)&&"function"===typeof b.Z?b.Z():b;b=this.Zq;a.Zq=u.Ta(b)&&"function"===typeof b.Z?b.Z():b;b=this.Yq;a.Yq=u.Ta(b)&&"function"===typeof b.Z?b.Z():b;return a};Od.prototype.toString=function(){var a="",a=this.Cd===ae?a+"* ":this.Cd===$d?a+(null!==this.ha?"!m":"!d"):a+((null!==this.ha?"!m":"!d")+this.Cd);this.propertyName&&"string"===typeof this.propertyName&&(a+=" "+this.propertyName);this.Mf&&this.Mf!==this.propertyName&&(a+=" "+this.Mf);a+=": ";this.Cd===ae?null!==this.oldValue&&(a+=" "+this.oldValue):(null!==this.object&&(a+=de(this.object)),null!==this.oldValue&&(a+=" old: "+de(this.oldValue)),null!==this.Bg&&(a+=" "+this.Bg),null!==this.newValue&&(a+=" new: "+de(this.newValue)),null!==this.zg&&(a+=" "+this.zg));return a};Od.prototype.getValue=Od.prototype.ua=function(a){return a?this.oldValue:this.newValue};Od.prototype.getParam=function(a){return a?this.Bg:this.zg};Od.prototype.canUndo=Od.prototype.canUndo=function(){return null!==this.ha||null!==this.g?!0:!1};Od.prototype.undo=Od.prototype.undo=function(){this.canUndo()&&(null!==this.ha?this.ha.tm(this,!0):null!==this.g&&this.g.tm(this,!0))};Od.prototype.canRedo=Od.prototype.canRedo=function(){return null!==this.ha||null!==this.g?!0:!1};Od.prototype.redo=Od.prototype.redo=function(){this.canRedo()&&(null!==this.ha?this.ha.tm(this,!1):null!==this.g&&this.g.tm(this,!1))};u.defineProperty(Od,{ha:"model"},function(){return this.Pd},function(a){this.Pd=a});u.defineProperty(Od,{g:"diagram"},function(){return this.Y},function(a){this.Y=a});u.defineProperty(Od,{Cd:"change"},function(){return this.Dp},function(a){this.Dp=a});u.defineProperty(Od,{Mf:"modelChange"},function(){return this.Nu},function(a){this.Nu=a});u.defineProperty(Od,{propertyName:"propertyName"},function(){return this.am},function(a){this.am=a});u.u(Od,{iH:"isTransactionFinished"},function(){return this.Dp===ae&&("CommittedTransaction"===this.am||"FinishedUndo"===this.am||"FinishedRedo"===this.am)});u.defineProperty(Od,{object:"object"},function(){return this.br},function(a){this.br=a});u.defineProperty(Od,{oldValue:"oldValue"},function(){return this.dr},function(a){this.dr=a});u.defineProperty(Od,{Bg:"oldParam"},function(){return this.cr},function(a){this.cr=a});u.defineProperty(Od,{newValue:"newValue"},function(){return this.Zq},function(a){this.Zq=a});u.defineProperty(Od,{zg:"newParam"},function(){return this.Yq},function(a){this.Yq=a});function J(a){1<arguments.length&&u.k("Model constructor can only take one optional argument, the Array of node data.");u.gc(this);this.yx=this.Vb="";this.vk=!1;this.hy={};this.of=[];this.sc=new la(null,Object);this.Xl="key";this.Yt=this.Gu=null;this.px=this.qx=!1;this.$q="category";this.wh=new la(null,F);this.jj=null;this.ri=!1;this.Iy=null;this.ga=new ee;void 0!==a&&(this.dh=a)}u.fa("Model",J);J.prototype.clear=J.prototype.clear=function(){this.of=[];this.sc.clear();this.wh.clear(); + this.ga.clear()};g=J.prototype;g.Bt=function(){var a="";""!==this.name&&(a+=',\n "name": '+this.quote(this.name));""!==this.Sk&&(a+=',\n "dataFormat": '+this.quote(this.Sk));this.nb&&(a+=',\n "isReadOnly": '+this.nb);"key"!==this.Nm&&"string"===typeof this.Nm&&(a+=',\n "nodeKeyProperty": '+this.quote(this.Nm));this.Yy&&(a+=',\n "copiesArrays": true');this.Xy&&(a+=',\n "copiesArrayObjects": true');"category"!==this.Mm&&"string"===typeof this.Mm&&(a+=',\n "nodeCategoryProperty": '+this.quote(this.Mm));return a};g.qA=function(){var a="",b=this.$s,c=!1,d;for(d in b){if(!fe(d,b[d])){c=!0;break}}c&&(a=',\n "modelData": '+oe(this,b));return a+',\n "nodeDataArray": '+pe(this,this.dh,!0)};g.gt=function(a){a.name&&(this.name=a.name);a.dataFormat&&(this.Sk=a.dataFormat);a.isReadOnly&&(this.nb=a.isReadOnly);a.nodeKeyProperty&&(this.Nm=a.nodeKeyProperty);a.copiesArrays&&(this.Yy=a.copiesArrays);a.copiesArrayObjects&&(this.Xy=a.copiesArrayObjects);a.nodeCategoryProperty&&(this.Mm=a.nodeCategoryProperty)};g.Rz=function(a){var b=a.modelData;u.Ta(b)&&(this.it(b),this.$s=b);a=a.nodeDataArray;u.isArray(a)&&(this.it(a),this.dh=a)};g.toString=function(a){void 0===a&&(a=0);if(1<a){return this.lA()}var b=(""!==this.name?this.name:"")+" Model";if(0<a){b+="\n node data:";a=this.dh;for(var c=u.qb(a),d=0;d<c;d++){var e=u.ib(a,d),b=b+(" "+this.wb(e)+":"+de(e))}}return b};J.prototype.toJson=J.prototype.toJSON=J.prototype.lA=function(a){void 0===a&&(a=this.constructor===J?"go.Model":this.constructor===Q?"go.GraphLinksModel":this.constructor===qe?"go.TreeModel":u.tg(this));return'{ "class": '+this.quote(a)+this.Bt()+this.qA()+"}"};J.fromJson=J.fromJSON=function(a,b){void 0===b&&(b=null);null!==b&&u.C(b,J,J,"fromJson:model");var c=null;if("string"===typeof a){if(window.JSON&&window.JSON.parse){try{c=window.JSON.parse(a)}catch(d){}}else{u.trace("WARNING: no JSON.parse available")}}else{"object"===typeof a?c=a:u.k("Unable to construct a Model from: "+a)}if(null===b){var e;e=null;var f=c["class"];if("string"===typeof f){try{var h=null;0===f.indexOf("go.")?(f=f.substr(3),h=da[f]):(h=da[f],void 0===h&&(h=window[f]));"function"===typeof h&&(e=new h)}catch(k){}}null===e||e instanceof J?b=e:u.k("Unable to construct a Model of declared class: "+c["class"])}null===b&&(b=new Q);b.gt(c);b.Rz(c);return b};J.prototype.replaceJsonObjects=J.prototype.it=function(a){if(u.isArray(a)){for(var b=u.qb(a),c=0;c<b;c++){var d=u.ib(a,c);u.Ta(d)&&u.RC(a,c,this.it(d))}}else{if(u.Ta(a)){for(c in a){if(d=a[c],u.Ta(d)&&(d=this.it(d),a[c]=d,"points"===c&&Array.isArray(d))){for(var e=0===d.length%2,f=0;f<d.length;f++){if("number"!==typeof d[f]){e=!1;break}}if(e){e=new E(w);for(f=0;f<d.length/2;f++){e.add(new w(d[2*f],d[2*f+1]))}e.freeze();a[c]=e}}}if("object"===typeof a){c=a;d=a["class"];if("NaN"===d){c=NaN}else{if("Date"===d){c=new Date(a.value)}else{if("go.Point"===d){c=new w(re(a.x),re(a.y))}else{if("go.Size"===d){c=new ia(re(a.width),re(a.height))}else{if("go.Rect"===d){c=new z(re(a.x),re(a.y),re(a.width),re(a.height))}else{if("go.Margin"===d){c=new rb(re(a.top),re(a.right),re(a.bottom),re(a.left))}else{if("go.Spot"===d){c="string"===typeof a["enum"]?tb(a["enum"]):new L(re(a.x),re(a.y),re(a.offsetX),re(a.offsetY))}else{if("go.Brush"===d){if(c=new ga,c.type=Da(ga,a.type),"string"===typeof a.color&&(c.color=a.color),a.start instanceof L&&(c.start=a.start),a.end instanceof L&&(c.end=a.end),"number"===typeof a.startRadius&&(c.vt=re(a.startRadius)),"number"===typeof a.endRadius&&(c.vs=re(a.endRadius)),a=a.colorStops,u.Ta(a)){for(b in a){c.addColorStop(parseFloat(b),a[b])}}}else{"go.Geometry"===d&&(b=null,b="string"===typeof a.path?sd(a.path):new $c,b.type=Da($c,a.type),"number"===typeof a.startX&&(b.va=re(a.startX)),"number"===typeof a.startY&&(b.wa=re(a.startY)),"number"===typeof a.endX&&(b.F=re(a.endX)),"number"===typeof a.endY&&(b.G=re(a.endY)),a.spot1 instanceof L&&(b.A=a.spot1),a.spot2 instanceof L&&(b.B=a.spot2),c=b)}}}}}}}}a=c}}}return a};J.prototype.quote=function(a){for(var b="",c=a.length,d=0;d<c;d++){var e=a[d];if('"'===e||"\\"===e){b+="\\"+e}else{if("\b"===e){b+="\\b"}else{if("\f"===e){b+="\\f"}else{if("\n"===e){b+="\\n"}else{if("\r"===e){b+="\\r"}else{if("\t"===e){b+="\\t"}else{var f=a.charCodeAt(d),b=16>f?b+("\\u000"+a.charCodeAt(d).toString(16)):32>f?b+("\\u00"+a.charCodeAt(d).toString(16)):8232===f?b+"\\u2028":8233===f?b+"\\u2029":b+e}}}}}}}return'"'+b+'"'};J.prototype.writeJsonValue=J.prototype.Ct=function(a){return void 0===a?"undefined":null===a?"null":!0===a?"true":!1===a?"false":"string"===typeof a?this.quote(a):"number"===typeof a?Infinity===a?"9e9999":-Infinity===a?"-9e9999":isNaN(a)?'{"class":"NaN"}':a.toString():a instanceof Date?'{"class":"Date", "value":"'+a.toJSON()+'"}':a instanceof Number?this.Ct(a.valueOf()):u.isArray(a)?pe(this,a):u.Ta(a)?oe(this,a):"function"===typeof a?"null":a.toString()};function pe(a,b,c){void 0===c&&(c=!1);var d=u.qb(b);if(0>=d){return"[]"}var e=new Ca;e.add("[ ");c&&1<d&&e.add("\n");for(var f=0;f<d;f++){var h=u.ib(b,f); + void 0!==h&&(0<f&&(e.add(","),c&&e.add("\n")),e.add(a.Ct(h)))}c&&1<d&&e.add("\n");e.add(" ]");return e.toString()}function fe(a,b){return void 0===b||"__gohashid"===a||"_"===a[0]||"function"===typeof b?!0:!1}function se(a){return isNaN(a)?"NaN":Infinity===a?"9e9999":-Infinity===a?"-9e9999":a}function oe(a,b){var c=b;if(c instanceof w){var d=c;b={"class":"go.Point",x:se(d.x),y:se(d.y)}}else{if(c instanceof ia){var e=c;b={"class":"go.Size",width:se(e.width),height:se(e.height)}}else{if(c instanceof z){b={"class":"go.Rect",x:se(c.x),y:se(c.y),width:se(c.width),height:se(c.height)}}else{if(c instanceof rb){b={"class":"go.Margin",top:se(c.top),right:se(c.right),bottom:se(c.bottom),left:se(c.left)}}else{if(c instanceof L){e=c,b=e.Vc()?{"class":"go.Spot",x:se(e.x),y:se(e.y),offsetX:se(e.offsetX),offsetY:se(e.offsetY)}:{"class":"go.Spot","enum":e.toString()}}else{if(c instanceof ga){b={"class":"go.Brush",type:c.type.name};if(c.type===te){b.color=c.color}else{if(c.type===ue||c.type===ve){b.start=c.start,b.end=c.end,c.type===ve&&(0!==c.vt&&(b.startRadius=se(c.vt)),isNaN(c.vs)||(b.endRadius=se(c.vs)))}}if(null!==c.qs){for(var f={},h=c.qs.i;h.next();){f[h.key]=h.value}b.colorStops=f}}else{if(c instanceof $c){b={"class":"go.Geometry",type:c.type.name},0!==c.va&&(b.startX=se(c.va)),0!==c.wa&&(b.startY=se(c.wa)),0!==c.F&&(b.endX=se(c.F)),0!==c.G&&(b.endY=se(c.G)),c.A.L(xb)||(b.spot1=c.A),c.B.L(Vb)||(b.spot2=c.B),c.type===ad&&(b.path=qd(c))}else{if(c instanceof T||c instanceof D||c instanceof we||c instanceof J||c instanceof xe||c instanceof sa||c instanceof Je||c instanceof xa||c instanceof ee||c instanceof Ke){return u.trace("ERROR: trying to convert a GraphObject or Diagram or Model or Tool or Layout or UndoManager into JSON text: "+c.toString()),"{}"}}}}}}}}f="{";c=!0;for(d in b){if(e=u.sb(b,d),!fe(d,e)){if(c?c=!1:f+=", ",f+='"'+d+'":',"points"===d&&e instanceof E&&e.pa===w){h=e;e="[";for(h=h.i;h.next();){var k=h.value;1<e.length&&(e+=",");e+=a.Ct(k.x);e+=",";e+=a.Ct(k.y)}e+="]";f+=e}else{f+=a.Ct(e)}}}return f+"}"}function re(a){return"number"===typeof a?a:"NaN"===a?NaN:"9e9999"===a?Infinity:"-9e9999"===a?-Infinity:parseFloat(a)}u.defineProperty(J,{name:"name"},function(){return this.Vb},function(a){var b=this.Vb;b!==a&&(u.j(a,"string",J,"name"),this.Vb=a,this.h("name",b,a))});u.defineProperty(J,{Sk:"dataFormat"},function(){return this.yx},function(a){var b=this.yx;b!==a&&(u.j(a,"string",J,"dataFormat"),this.yx=a,this.h("dataFormat",b,a))});u.defineProperty(J,{nb:"isReadOnly"},function(){return this.vk},function(a){var b=this.vk;b!==a&&(u.j(a,"boolean",J,"isReadOnly"),this.vk=a,this.h("isReadOnly",b,a))});u.defineProperty(J,{$s:"modelData"},function(){return this.hy},function(a){var b=this.hy;b!==a&&(u.j(a,"object",J,"modelData"),this.hy=a,this.h("modelData",b,a),this.Ob(a))});J.prototype.addChangedListener=J.prototype.Ly=function(a){u.j(a,"function",J,"addChangedListener:listener");null===this.jj&&(this.jj=new E("function"));this.jj.add(a)};J.prototype.removeChangedListener=J.prototype.Uz=function(a){u.j(a,"function",J,"removeChangedListener:listener");null!==this.jj&&(this.jj.remove(a),0===this.jj.count&&(this.jj=null))};J.prototype.Kv=function(a){this.gb||this.ga.ED(a);if(null!==this.jj){var b=this.jj,c=b.length;if(1===c){b=b.ja(0),b(a)}else{if(0!==c){for(var d=b.Le(),e=0;e<c;e++){b=d[e],b(a)}}}}};J.prototype.raiseChangedEvent=J.prototype.Cc=function(a,b,c,d,e,f,h){Le(this,"",a,b,c,d,e,f,h)};J.prototype.raiseChanged=J.prototype.h=function(a,b,c,d,e){Le(this,"",$d,a,this,b,c,d,e)};J.prototype.raiseDataChanged=J.prototype.Qz=function(a,b,c,d,e,f){Le(this,"",$d,b,a,c,d,e,f)};function Le(a,b,c,d,e,f,h,k,l){void 0===k&&(k=null);void 0===l&&(l=null);var m=new Od;m.ha=a;m.Cd=c;m.Mf=b;m.propertyName=d;m.object=e;m.oldValue=f;m.Bg=k;m.newValue=h;m.zg=l;a.Kv(m)}u.defineProperty(J,{ga:"undoManager"},function(){return this.Iy},function(a){var b=this.Iy;b!==a&&(u.C(a,ee,J,"undoManager"),null!==b&&b.UH(this),this.Iy=a,null!==a&&a.NF(this))});u.defineProperty(J,{gb:"skipsUndoManager"},function(){return this.ri},function(a){u.j(a,"boolean",J,"skipsUndoManager");this.ri=a});J.prototype.tm=function(a,b){if(null!==a&&a.ha===this){if(a.Cd===$d){var c=a.object,d=a.propertyName,e=a.ua(b);u.Pa(c,d,e)}else{a.Cd===be?"nodeDataArray"===a.Mf?(c=a.newValue,u.Ta(c)&&(d=this.wb(c),void 0!==d&&(b?(u.Ai(this.of,a.zg),this.sc.remove(d)):(u.zi(this.of,a.zg,c),this.sc.add(d,c))))):""===a.Mf?(c=a.object,!u.isArray(c)&&a.propertyName&&(c=u.sb(a.object,a.propertyName)),u.isArray(c)&&(d=a.newValue,e=a.zg,b?u.Ai(c,e):u.zi(c,e,d))):u.k("unknown ChangedEvent.Insert object: "+a.toString()):a.Cd===ce?"nodeDataArray"===a.Mf?(c=a.oldValue,u.Ta(c)&&(d=this.wb(c),void 0!==d&&(b?(u.zi(this.of,a.Bg,c),this.sc.add(d,c)):(u.Ai(this.of,a.Bg),this.sc.remove(d))))):""===a.Mf?(c=a.object,!u.isArray(c)&&a.propertyName&&(c=u.sb(a.object,a.propertyName)),u.isArray(c)&&(d=a.oldValue,e=a.Bg,b?u.zi(c,e,d):u.Ai(c,e))):u.k("unknown ChangedEvent.Remove object: "+a.toString()):a.Cd!==ae&&u.k("unknown ChangedEvent: "+a.toString()) + }}};J.prototype.startTransaction=J.prototype.Xb=function(a){return this.ga.Xb(a)};J.prototype.commitTransaction=J.prototype.Xd=function(a){return this.ga.Xd(a)};J.prototype.rollbackTransaction=J.prototype.cp=function(){return this.ga.cp()};J.prototype.updateTargetBindings=J.prototype.Ob=function(a,b){void 0===b&&(b="");Le(this,"SourceChanged",ae,b,a,null,null)};u.defineProperty(J,{Nm:"nodeKeyProperty"},function(){return this.Xl},function(a){var b=this.Xl;b!==a&&(Me(a,J,"nodeKeyProperty"),0<this.sc.count&&u.k("Cannot set Model.nodeKeyProperty when there is existing node data"),this.Xl=a,this.h("nodeKeyProperty",b,a))});function Me(a,b,c){"string"!==typeof a&&"function"!==typeof a&&u.Ld(a,"string or function",b,c)}J.prototype.getKeyForNodeData=J.prototype.wb=function(a){if(null!==a){var b=this.Xl;if(""!==b&&(b=u.sb(a,b),void 0!==b)){if(Ne(b)){return b}u.k("Key value for node data "+a+" is not a number or a string: "+b)}}};J.prototype.setKeyForNodeData=J.prototype.cA=function(a,b){void 0!==b&&null!==b&&Ne(b)||u.Ld(b,"number or string",J,"setKeyForNodeData:key");if(null!==a){var c=this.Xl;if(""!==c){if(this.Ve(a)){var d=u.sb(a,c);d!==b&&null===this.sf(b)&&(u.Pa(a,c,b),this.sc.remove(d),this.sc.add(b,a),Le(this,"nodeKey",$d,c,a,d,b),"string"===typeof c&&this.Ob(a,c),this.ht(d,b))}else{u.Pa(a,c,b)}}}};u.defineProperty(J,{VJ:"makeUniqueKeyFunction"},function(){return this.Gu},function(a){var b=this.Gu;b!==a&&(null!==a&&u.j(a,"function",J,"makeUniqueKeyFunction"),this.Gu=a,this.h("makeUniqueKeyFunction",b,a))});function Ne(a){return"number"===typeof a||"string"===typeof a}J.prototype.containsNodeData=J.prototype.Ve=function(a){a=this.wb(a);return void 0===a?!1:this.sc.contains(a)};J.prototype.findNodeDataForKey=J.prototype.sf=function(a){null===a&&u.k("Model.findNodeDataForKey:key must not be null");return void 0!==a&&Ne(a)?this.sc.ua(a):null};u.defineProperty(J,{dh:"nodeDataArray"},function(){return this.of},function(a){var b=this.of;if(b!==a){u.Sy(a,J,"nodeDataArray");this.sc.clear();this.nA();for(var c=u.qb(a),d=0;d<c;d++){var e=u.ib(a,d);if(!u.Ta(e)){u.k("Model.nodeDataArray must only contain Objects, not: "+e);return}u.Js(e)}this.of=a;for(var f=new E(Object),d=0;d<c;d++){var e=u.ib(a,d),h=this.wb(e);void 0===h?f.add(e):null!==this.sc.ua(h)?f.add(e):this.sc.add(h,e)}for(d=f.i;d.next();){e=d.value,this.VD(e),f=this.wb(e),void 0!==f&&this.sc.add(f,e)}Le(this,"nodeDataArray",$d,"nodeDataArray",this,b,a);for(d=0;d<c;d++){e=u.ib(a,d),this.bp(e),this.ap(e)}this.XC();u.eH(a)||(this.nb=!0)}});J.prototype.makeNodeDataKeyUnique=J.prototype.VD=function(a){if(null!==a){var b=this.Xl;if(""!==b){var c=this.wb(a);if(void 0===c||this.sc.contains(c)){var d=this.Gu;if(null!==d&&(c=d(this,a),void 0!==c&&null!==c&&!this.sc.contains(c))){u.Pa(a,b,c);return}if("string"===typeof c){for(d=2;this.sc.contains(c+d);){d++}u.Pa(a,b,c+d)}else{if(void 0===c||"number"===typeof c){for(d=-this.sc.count-1;this.sc.contains(d);){d--}u.Pa(a,b,d)}else{u.k("Model.getKeyForNodeData returned something other than a string or a number: "+c)}}}}}};J.prototype.addNodeData=J.prototype.om=function(a){if(null!==a){u.Js(a);var b=this.wb(a);if(void 0===b||this.sc.ua(b)!==a){this.VD(a),b=this.wb(a),void 0===b?u.k("Model.makeNodeDataKeyUnique failed on "+a+". Data not added to Model."):(this.sc.add(b,a),b=u.qb(this.of),u.zi(this.of,b,a),Le(this,"nodeDataArray",be,"nodeDataArray",this,null,a,null,b),this.bp(a),this.ap(a))}}};J.prototype.addNodeDataCollection=function(a){if(u.isArray(a)){for(var b=u.qb(a),c=0;c<b;c++){this.om(u.ib(a,c))}}else{for(a=a.i;a.next();){this.om(a.value)}}};J.prototype.removeNodeData=J.prototype.Wz=function(a){if(null!==a){var b=this.wb(a);void 0!==b&&this.sc.contains(b)&&(this.sc.remove(b),b=u.Ry(this.of,a),0>b||(u.Ai(this.of,b),Le(this,"nodeDataArray",ce,"nodeDataArray",this,a,null,b,null),this.At(a)))}};J.prototype.removeNodeDataCollection=function(a){if(u.isArray(a)){for(var b=u.qb(a),c=0;c<b;c++){this.Wz(u.ib(a,c))}}else{for(a=a.i;a.next();){this.Wz(a.value)}}};g=J.prototype;g.ht=function(a,b){var c=Oe(this,a);c instanceof F&&this.wh.add(b,c)};g.nA=function(){};g.bp=function(){};g.ap=function(){};g.At=function(){};function Pe(a,b,c){if(void 0!==b){var d=a.wh.ua(b);null===d&&(d=new F(Object),a.wh.add(b,d));d.add(c)}}function Qe(a,b,c){if(void 0!==b){var d=a.wh.ua(b);d instanceof F&&(void 0===c||null===c?a.wh.remove(b):(d.remove(c),0===d.count&&a.wh.remove(b)))}}function Oe(a,b){if(void 0===b){return null}var c=a.wh.ua(b);return c instanceof F?c:null}J.prototype.clearUnresolvedReferences=J.prototype.XC=function(a){void 0===a?this.wh.clear():this.wh.remove(a)};u.defineProperty(J,{jJ:"copyNodeDataFunction"},function(){return this.Yt},function(a){var b=this.Yt;b!==a&&(null!==a&&u.j(a,"function",J,"copyNodeDataFunction"),this.Yt=a,this.h("copyNodeDataFunction",b,a))});u.defineProperty(J,{Yy:"copiesArrays"},function(){return this.qx},function(a){var b=this.qx;b!==a&&(null!==a&&u.j(a,"boolean",J,"copiesArrays"),this.qx=a,this.h("copiesArrays",b,a)) + });u.defineProperty(J,{Xy:"copiesArrayObjects"},function(){return this.px},function(a){var b=this.px;b!==a&&(null!==a&&u.j(a,"boolean",J,"copiesArrayObjects"),this.px=a,this.h("copiesArrayObjects",b,a))});J.prototype.copyNodeData=function(a){if(null===a){return null}var b=null,b=this.Yt,b=null!==b?b(a,this):Re(this,a,!0);u.Ta(b)&&u.gc(b);return b};function Re(a,b,c){if(a.Yy&&Array.isArray(b)){var d=[];for(c=0;c<b.length;c++){var e=Re(a,b[c],a.Xy);d.push(e)}u.gc(d);return d}if(c&&u.Ta(b)){c=(c=b.constructor)?new c:{};for(d in b){if("__gohashid"!==d){var e=u.sb(b,d),f;f=e;f instanceof T||f instanceof D||f instanceof we||f instanceof Se||f instanceof Te||f instanceof xe||f instanceof sa||f instanceof Je||f instanceof Md||f instanceof Nd?("_"!==d[0]&&u.trace('Warning: found GraphObject or Diagram reference when copying model data on property "'+d+'" of data object: '+b.toString()+" \nModel data should not have any references to a Diagram or any part of a diagram, such as: "+f.toString()),f=!0):f=f instanceof J||f instanceof ee||f instanceof Ke||f instanceof Od?!0:!1;f||(e=Re(a,e,!1));u.Pa(c,d,e)}}u.gc(c);return c}return b}var Ue=!1;J.prototype.setDataProperty=function(a,b,c){if(this.Ve(a)){if(b===this.Nm){this.cA(a,c)}else{if(b===this.Mm){this.Fw(a,c);return}}}else{!Ue&&a instanceof T&&(Ue=!0,u.trace('Model.setDataProperty is modifying a GraphObject, "'+a.toString()+'"'),u.trace(" Is that really your intent?"))}var d=u.sb(a,b);d!==c&&(u.Pa(a,b,c),this.Qz(a,b,d,c))};J.prototype.addArrayItem=function(a,b){this.YG(a,-1,b)};J.prototype.insertArrayItem=J.prototype.YG=function(a,b,c){a===this.of&&u.k("Model.insertArrayItem or Model.addArrayItem should not be called on the Model.nodeDataArray");0>b&&(b=u.qb(a));u.zi(a,b,c);Le(this,"",be,"",a,null,c,null,b)};J.prototype.removeArrayItem=function(a,b){void 0===b&&(b=-1);a===this.of&&u.k("Model.removeArrayItem should not be called on the Model.nodeDataArray");-1===b&&(b=u.qb(a)-1);var c=u.ib(a,b);u.Ai(a,b);Le(this,"",ce,"",a,c,null,b,null)};u.defineProperty(J,{Mm:"nodeCategoryProperty"},function(){return this.$q},function(a){var b=this.$q;b!==a&&(Me(a,J,"nodeCategoryProperty"),this.$q=a,this.h("nodeCategoryProperty",b,a))});J.prototype.getCategoryForNodeData=J.prototype.gz=function(a){if(null===a){return""}var b=this.$q;if(""===b){return""}b=u.sb(a,b);if(void 0===b){return""}if("string"===typeof b){return b}u.k("getCategoryForNodeData found a non-string category for "+a+": "+b);return""};J.prototype.setCategoryForNodeData=J.prototype.Fw=function(a,b){u.j(b,"string",J,"setCategoryForNodeData:cat");if(null!==a){var c=this.$q;if(""!==c){if(this.Ve(a)){var d=u.sb(a,c);void 0===d&&(d="");d!==b&&(u.Pa(a,c,b),Le(this,"nodeCategory",$d,c,a,d,b))}else{u.Pa(a,c,b)}}}};function Q(a,b){2<arguments.length&&u.k("GraphLinksModel constructor can only take two optional arguments, the Array of node data and the Array of link data.");J.call(this);this.Dh=[];this.Vl=new F(Object);this.ik=this.Xt=null;this.fj="from";this.ij="to";this.Fq=this.Eq="";this.Bq="category";this.Eh="";this.Qu="isGroup";this.pj="group";this.sx=!1;void 0!==a&&(this.dh=a);void 0!==b&&(this.Qj=b)}u.Ha(Q,J);u.fa("GraphLinksModel",Q);Q.prototype.clear=Q.prototype.clear=function(){J.prototype.clear.call(this);this.Dh=[];this.Vl.clear()};g=Q.prototype;g.toString=function(a){void 0===a&&(a=0);if(2<=a){return this.lA()}var b=(""!==this.name?this.name:"")+" GraphLinksModel";if(0<a){b+="\n node data:";a=this.dh;for(var c=u.qb(a),d=0,d=0;d<c;d++){var e=u.ib(a,d),b=b+(" "+this.wb(e)+":"+de(e))}b+="\n link data:";a=this.Qj;c=u.qb(a);for(d=0;d<c;d++){e=u.ib(a,d),b+=" "+this.$k(e)+"--\x3e"+this.cl(e)}}return b};g.Bt=function(){var a=J.prototype.Bt.call(this),b="";"category"!==this.Us&&"string"===typeof this.Us&&(b+=',\n "linkCategoryProperty": '+this.quote(this.Us));"from"!==this.Mo&&"string"===typeof this.Mo&&(b+=',\n "linkFromKeyProperty": '+this.quote(this.Mo));"to"!==this.Oo&&"string"===typeof this.Oo&&(b+=',\n "linkToKeyProperty": '+this.quote(this.Oo));""!==this.Vs&&"string"===typeof this.Vs&&(b+=',\n "linkFromPortIdProperty": '+this.quote(this.Vs));""!==this.Xs&&"string"===typeof this.Xs&&(b+=',\n "linkToPortIdProperty": '+this.quote(this.Xs));""!==this.Ws&&"string"===typeof this.Ws&&(b+=',\n "linkLabelKeysProperty": '+this.quote(this.Ws));"isGroup"!==this.ct&&"string"===typeof this.ct&&(b+=',\n "nodeIsGroupProperty": '+this.quote(this.ct));"group"!==this.Xo&&"string"===typeof this.Xo&&(b+=',\n "nodeGroupKeyProperty": '+this.quote(this.Xo));return a+b};g.qA=function(){var a=J.prototype.qA.call(this),b=',\n "linkDataArray": '+pe(this,this.Qj,!0);return a+b};g.gt=function(a){J.prototype.gt.call(this,a);a.linkFromKeyProperty&&(this.Mo=a.linkFromKeyProperty);a.linkToKeyProperty&&(this.Oo=a.linkToKeyProperty);a.linkFromPortIdProperty&&(this.Vs=a.linkFromPortIdProperty);a.linkToPortIdProperty&&(this.Xs=a.linkToPortIdProperty);a.linkCategoryProperty&&(this.Us=a.linkCategoryProperty);a.linkLabelKeysProperty&&(this.Ws=a.linkLabelKeysProperty); + a.nodeIsGroupProperty&&(this.ct=a.nodeIsGroupProperty);a.nodeGroupKeyProperty&&(this.Xo=a.nodeGroupKeyProperty)};g.Rz=function(a){J.prototype.Rz.call(this,a);a=a.linkDataArray;u.isArray(a)&&(this.it(a),this.Qj=a)};g.tm=function(a,b){var c=null;if(a.Cd===be){if("linkDataArray"===a.Mf?c=this.Dh:"linkLabelKeys"===a.Mf&&(c=this.Pj(a.object)),u.isArray(c)){b?u.Ai(c,a.zg):u.zi(c,a.zg,a.newValue);return}}else{if(a.Cd===ce&&("linkDataArray"===a.Mf?c=this.Dh:"linkLabelKeys"===a.Mf&&(c=this.Pj(a.object)),u.isArray(c))){b?u.zi(c,a.Bg,a.oldValue):u.Ai(c,a.Bg);return}}J.prototype.tm.call(this,a,b)};u.defineProperty(Q,{Qy:"archetypeNodeData"},function(){return this.ik},function(a){var b=this.ik;b!==a&&(null!==a&&u.C(a,Object,Q,"archetypeNodeData"),this.ik=a,this.h("archetypeNodeData",b,a))});Q.prototype.Km=function(a){if(void 0!==a){var b=this.ik;if(null!==b){var c=this.sf(a);null===c&&(c=this.copyNodeData(b),u.Pa(c,this.Xl,a),this.om(c))}return a}};u.defineProperty(Q,{Mo:"linkFromKeyProperty"},function(){return this.fj},function(a){var b=this.fj;b!==a&&(Me(a,Q,"linkFromKeyProperty"),this.fj=a,this.h("linkFromKeyProperty",b,a))});Q.prototype.getFromKeyForLinkData=Q.prototype.$k=function(a){if(null!==a){var b=this.fj;if(""!==b&&(b=u.sb(a,b),void 0!==b)){if(Ne(b)){return b}u.k("FromKey value for link data "+a+" is not a number or a string: "+b)}}};Q.prototype.setFromKeyForLinkData=Q.prototype.Gw=function(a,b){null===b&&(b=void 0);void 0===b||Ne(b)||u.Ld(b,"number or string",Q,"setFromKeyForLinkData:key");if(null!==a){var c=this.fj;if(""!==c){if(b=this.Km(b),this.Di(a)){var d=u.sb(a,c);d!==b&&(Qe(this,d,a),u.Pa(a,c,b),null===this.sf(b)&&Pe(this,b,a),Le(this,"linkFromKey",$d,c,a,d,b),"string"===typeof c&&this.Ob(a,c))}else{u.Pa(a,c,b)}}}};u.defineProperty(Q,{Oo:"linkToKeyProperty"},function(){return this.ij},function(a){var b=this.ij;b!==a&&(Me(a,Q,"linkToKeyProperty"),this.ij=a,this.h("linkToKeyProperty",b,a))});Q.prototype.getToKeyForLinkData=Q.prototype.cl=function(a){if(null!==a){var b=this.ij;if(""!==b&&(b=u.sb(a,b),void 0!==b)){if(Ne(b)){return b}u.k("ToKey value for link data "+a+" is not a number or a string: "+b)}}};Q.prototype.setToKeyForLinkData=Q.prototype.Iw=function(a,b){null===b&&(b=void 0);void 0===b||Ne(b)||u.Ld(b,"number or string",Q,"setToKeyForLinkData:key");if(null!==a){var c=this.ij;if(""!==c){if(b=this.Km(b),this.Di(a)){var d=u.sb(a,c);d!==b&&(Qe(this,d,a),u.Pa(a,c,b),null===this.sf(b)&&Pe(this,b,a),Le(this,"linkToKey",$d,c,a,d,b),"string"===typeof c&&this.Ob(a,c))}else{u.Pa(a,c,b)}}}};u.defineProperty(Q,{Vs:"linkFromPortIdProperty"},function(){return this.Eq},function(a){var b=this.Eq;b!==a&&(Me(a,Q,"linkFromPortIdProperty"),this.Eq=a,this.h("linkFromPortIdProperty",b,a))});Q.prototype.getFromPortIdForLinkData=Q.prototype.GG=function(a){if(null===a){return""}var b=this.Eq;if(""===b){return""}a=u.sb(a,b);return void 0===a?"":a};Q.prototype.setFromPortIdForLinkData=Q.prototype.bA=function(a,b){u.j(b,"string",Q,"setFromPortIdForLinkData:portname");if(null!==a){var c=this.Eq;if(""!==c){if(this.Di(a)){var d=u.sb(a,c);void 0===d&&(d="");d!==b&&(u.Pa(a,c,b),Le(this,"linkFromPortId",$d,c,a,d,b),"string"===typeof c&&this.Ob(a,c))}else{u.Pa(a,c,b)}}}};u.defineProperty(Q,{Xs:"linkToPortIdProperty"},function(){return this.Fq},function(a){var b=this.Fq;b!==a&&(Me(a,Q,"linkToPortIdProperty"),this.Fq=a,this.h("linkToPortIdProperty",b,a))});Q.prototype.getToPortIdForLinkData=Q.prototype.JG=function(a){if(null===a){return""}var b=this.Fq;if(""===b){return""}a=u.sb(a,b);return void 0===a?"":a};Q.prototype.setToPortIdForLinkData=Q.prototype.fA=function(a,b){u.j(b,"string",Q,"setToPortIdForLinkData:portname");if(null!==a){var c=this.Fq;if(""!==c){if(this.Di(a)){var d=u.sb(a,c);void 0===d&&(d="");d!==b&&(u.Pa(a,c,b),Le(this,"linkToPortId",$d,c,a,d,b),"string"===typeof c&&this.Ob(a,c))}else{u.Pa(a,c,b)}}}};u.defineProperty(Q,{Ws:"linkLabelKeysProperty"},function(){return this.Eh},function(a){var b=this.Eh;b!==a&&(Me(a,Q,"linkLabelKeysProperty"),this.Eh=a,this.h("linkLabelKeysProperty",b,a))});Q.prototype.getLabelKeysForLinkData=Q.prototype.Pj=function(a){if(null===a){return u.nh}var b=this.Eh;if(""===b){return u.nh}a=u.sb(a,b);return void 0===a?u.nh:a};Q.prototype.setLabelKeysForLinkData=Q.prototype.GE=function(a,b){u.Sy(b,Q,"setLabelKeysForLinkData:arr");if(null!==a){var c=this.Eh;if(""!==c){if(this.Di(a)){var d=u.sb(a,c);void 0===d&&(d=u.nh);if(d!==b){for(var e=u.qb(d),f=0;f<e;f++){var h=u.ib(d,f);Qe(this,h,a)}u.Pa(a,c,b);e=u.qb(b);for(f=0;f<e;f++){h=u.ib(b,f),null===this.sf(h)&&Pe(this,h,a)}Le(this,"linkLabelKeys",$d,c,a,d,b);"string"===typeof c&&this.Ob(a,c)}}else{u.Pa(a,c,b)}}}};Q.prototype.addLabelKeyForLinkData=Q.prototype.Ny=function(a,b){if(null!==b&&void 0!==b&&(Ne(b)||u.Ld(b,"number or string",Q,"addLabelKeyForLinkData:key"),null!==a)){var c=this.Eh;if(""!==c){var d=u.sb(a,c);void 0===d?(c=[],c.push(b),this.GE(a,c)):u.isArray(d)?0<=u.Ry(d,b)||(u.zi(d,Infinity,b),this.Di(a)&&(null===this.sf(b)&&Pe(this,b,a),Le(this,"linkLabelKeys",be,c,a,null,b))):u.k(c+" property is not an Array; cannot addLabelKeyForLinkData: "+a) + }}};Q.prototype.removeLabelKeyForLinkData=Q.prototype.nE=function(a,b){if(null!==b&&void 0!==b&&(Ne(b)||u.Ld(b,"number or string",Q,"removeLabelKeyForLinkData:key"),null!==a)){var c=this.Eh;if(""!==c){var d=u.sb(a,c);if(u.isArray(d)){var e=u.Ry(d,b);0>e||(u.Ai(d,e),this.Di(a)&&(Qe(this,b,a),Le(this,"linkLabelKeys",ce,c,a,b,null)))}else{void 0!==d&&u.k(c+" property is not an Array; cannot removeLabelKeyforLinkData: "+a)}}}};u.defineProperty(Q,{Qj:"linkDataArray"},function(){return this.Dh},function(a){var b=this.Dh;if(b!==a){u.Sy(a,Q,"linkDataArray");for(var c=u.qb(a),d=0;d<c;d++){var e=u.ib(a,d);if(!u.Ta(e)){u.k("GraphLinksModel.linkDataArray must only contain Objects, not: "+e);return}u.Js(e)}this.Dh=a;for(var f=new F(Object),d=0;d<c;d++){e=u.ib(a,d),f.add(e)}this.Vl=f;Le(this,"linkDataArray",$d,"linkDataArray",this,b,a);for(d=0;d<c;d++){e=u.ib(a,d),Ve(this,e)}}});Q.prototype.containsLinkData=Q.prototype.Di=function(a){return null===a?!1:this.Vl.contains(a)};Q.prototype.addLinkData=Q.prototype.yv=function(a){if(null!==a){if(void 0===u.Uc(a)){u.gc(a)}else{if(this.Di(a)){return}}this.Vl.add(a);var b=u.qb(this.Dh);u.zi(this.Dh,b,a);Le(this,"linkDataArray",be,"linkDataArray",this,null,a,null,b);Ve(this,a)}};Q.prototype.addLinkDataCollection=function(a){if(u.isArray(a)){for(var b=u.qb(a),c=0;c<b;c++){this.yv(u.ib(a,c))}}else{for(a=a.i;a.next();){this.yv(a.value)}}};Q.prototype.removeLinkData=Q.prototype.Vz=function(a){if(null!==a){this.Vl.remove(a);var b=this.Dh.indexOf(a);if(!(0>b)){u.Ai(this.Dh,b);Le(this,"linkDataArray",ce,"linkDataArray",this,a,null,b,null);b=this.$k(a);Qe(this,b,a);b=this.cl(a);Qe(this,b,a);var c=this.Pj(a);if(u.isArray(c)){for(var d=u.qb(c),e=0;e<d;e++){b=u.ib(c,e),Qe(this,b,a)}}}}};Q.prototype.removeLinkDataCollection=function(a){if(u.isArray(a)){for(var b=u.qb(a),c=0;c<b;c++){this.Vz(u.ib(a,c))}}else{for(a=a.i;a.next();){this.Vz(a.value)}}};function Ve(a,b){var c=a.$k(b),c=a.Km(c);null===a.sf(c)&&Pe(a,c,b);c=a.cl(b);c=a.Km(c);null===a.sf(c)&&Pe(a,c,b);var d=a.Pj(b);if(u.isArray(d)){for(var e=u.qb(d),f=0;f<e;f++){c=u.ib(d,f),null===a.sf(c)&&Pe(a,c,b)}}}u.defineProperty(Q,{iJ:"copyLinkDataFunction"},function(){return this.Xt},function(a){var b=this.Xt;b!==a&&(null!==a&&u.j(a,"function",Q,"copyLinkDataFunction"),this.Xt=a,this.h("copyLinkDataFunction",b,a))});Q.prototype.copyLinkData=Q.prototype.fD=function(a){if(null===a){return null}var b=null,b=this.Xt;if(null!==b){b=b(a,this)}else{var b=new a.constructor,c;for(c in a){if("__gohashid"!==c){var d=u.sb(a,c);u.Pa(b,c,d)}}}null!==b&&(u.gc(b),""!==this.fj&&u.Pa(b,this.fj,void 0),""!==this.ij&&u.Pa(b,this.ij,void 0),""!==this.Eh&&u.Pa(b,this.Eh,[]));return b};u.defineProperty(Q,{ct:"nodeIsGroupProperty"},function(){return this.Qu},function(a){var b=this.Qu;b!==a&&(Me(a,Q,"nodeIsGroupProperty"),this.Qu=a,this.h("nodeIsGroupProperty",b,a))});Q.prototype.isGroupForNodeData=Q.prototype.uz=function(a){if(null===a){return !1}var b=this.Qu;return""===b?!1:u.sb(a,b)?!0:!1};u.defineProperty(Q,{Xo:"nodeGroupKeyProperty"},function(){return this.pj},function(a){var b=this.pj;b!==a&&(Me(a,Q,"nodeGroupKeyProperty"),this.pj=a,this.h("nodeGroupKeyProperty",b,a))});u.defineProperty(Q,{xm:"copiesGroupKeyOfNodeData"},function(){return this.sx},function(a){this.sx!==a&&(u.j(a,"boolean",Q,"copiesGroupKeyOfNodeData"),this.sx=a)});Q.prototype.getGroupKeyForNodeData=Q.prototype.Fm=function(a){if(null!==a){var b=this.pj;if(""!==b&&(b=u.sb(a,b),void 0!==b)){if(Ne(b)){return b}u.k("GroupKey value for node data "+a+" is not a number or a string: "+b)}}};Q.prototype.setGroupKeyForNodeData=Q.prototype.Hw=function(a,b){null===b&&(b=void 0);void 0===b||Ne(b)||u.Ld(b,"number or string",Q,"setGroupKeyForNodeData:key");if(null!==a){var c=this.pj;if(""!==c){if(this.Ve(a)){var d=u.sb(a,c);d!==b&&(Qe(this,d,a),u.Pa(a,c,b),null===this.sf(b)&&Pe(this,b,a),Le(this,"nodeGroupKey",$d,c,a,d,b),"string"===typeof c&&this.Ob(a,c))}else{u.Pa(a,c,b)}}}};Q.prototype.copyNodeData=function(a){if(null===a){return null}a=J.prototype.copyNodeData.call(this,a);this.xm||""===this.pj||u.Pa(a,this.pj,void 0);return a};Q.prototype.setDataProperty=function(a,b,c){if(this.Ve(a)){if(b===this.Nm){this.cA(a,c)}else{if(b===this.Mm){this.Fw(a,c);return}if(b===this.Xo){this.Hw(a,c);return}b===this.ct&&u.k("GraphLinksModel.setDataProperty: property name must not be the nodeIsGroupProperty: "+b)}}else{if(this.Di(a)){if(b===this.Mo){this.Gw(a,c);return}if(b===this.Oo){this.Iw(a,c);return}if(b===this.Vs){this.bA(a,c);return}if(b===this.Xs){this.fA(a,c);return}if(b===this.Us){this.FE(a,c);return}if(b===this.Ws){this.GE(a,c);return}}else{!Ue&&a instanceof T&&(Ue=!0,u.trace('GraphLinksModel.setDataProperty is modifying a GraphObject, "'+a.toString()+'"'),u.trace(" Is that really your intent?"))}}var d=u.sb(a,b);d!==c&&(u.Pa(a,b,c),this.Qz(a,b,d,c))};g=Q.prototype;g.ht=function(a,b){J.prototype.ht.call(this,a,b);for(var c=this.sc.i;c.next();){this.Yz(c.value,a,b)}for(c=this.Vl.i;c.next();){var d=c.value,e=a,f=b;if(this.$k(d)===e){var h=this.fj; + u.Pa(d,h,f);Le(this,"linkFromKey",$d,h,d,e,f);"string"===typeof h&&this.Ob(d,h)}this.cl(d)===e&&(h=this.ij,u.Pa(d,h,f),Le(this,"linkToKey",$d,h,d,e,f),"string"===typeof h&&this.Ob(d,h));var k=this.Pj(d);if(u.isArray(k)){for(var l=u.qb(k),h=this.Eh,m=0;m<l;m++){u.ib(k,m)===e&&(u.RC(k,m,f),Le(this,"linkLabelKeys",be,h,d,e,f))}}}};g.Yz=function(a,b,c){if(this.Fm(a)===b){var d=this.pj;u.Pa(a,d,c);Le(this,"nodeGroupKey",$d,d,a,b,c);"string"===typeof d&&this.Ob(a,d)}};g.nA=function(){J.prototype.nA.call(this);for(var a=this.Qj,b=u.qb(a),c=0;c<b;c++){var d=u.ib(a,c);Ve(this,d)}};g.bp=function(a){J.prototype.bp.call(this,a);a=this.wb(a);var b=Oe(this,a);if(null!==b){for(var c=new E(Object),b=b.i;b.next();){var d=b.value;if(this.Ve(d)){if(this.Fm(d)===a){var e=this.pj;Le(this,"nodeGroupKey",$d,e,d,a,a);"string"===typeof e&&this.Ob(d,e);c.add(d)}}else{this.$k(d)===a&&(e=this.fj,Le(this,"linkFromKey",$d,e,d,a,a),"string"===typeof e&&this.Ob(d,e),c.add(d));this.cl(d)===a&&(e=this.ij,Le(this,"linkToKey",$d,e,d,a,a),"string"===typeof e&&this.Ob(d,e),c.add(d));var f=this.Pj(d);if(u.isArray(f)){for(var h=u.qb(f),e=this.Eh,k=0;k<h;k++){u.ib(f,k)===a&&(Le(this,"linkLabelKeys",be,e,d,a,a),c.add(d))}}}}for(c=c.i;c.next();){Qe(this,a,c.value)}}};g.ap=function(a){J.prototype.ap.call(this,a);var b=this.Fm(a);null===this.sf(b)&&Pe(this,b,a)};g.At=function(a){J.prototype.At.call(this,a);var b=this.Fm(a);Qe(this,b,a)};u.defineProperty(Q,{Us:"linkCategoryProperty"},function(){return this.Bq},function(a){var b=this.Bq;b!==a&&(Me(a,Q,"linkCategoryProperty"),this.Bq=a,this.h("linkCategoryProperty",b,a))});Q.prototype.getCategoryForLinkData=Q.prototype.Zv=function(a){if(null===a){return""}var b=this.Bq;if(""===b){return""}b=u.sb(a,b);if(void 0===b){return""}if("string"===typeof b){return b}u.k("getCategoryForLinkData found a non-string category for "+a+": "+b);return""};Q.prototype.setCategoryForLinkData=Q.prototype.FE=function(a,b){u.j(b,"string",Q,"setCategoryForLinkData:cat");if(null!==a){var c=this.Bq;if(""===c){return""}if(this.Di(a)){var d=u.sb(a,c);void 0===d&&(d="");d!==b&&(u.Pa(a,c,b),Le(this,"linkCategory",$d,c,a,d,b),"string"===typeof c&&this.Ob(a,c))}else{u.Pa(a,c,b)}}};function qe(a){1<arguments.length&&u.k("TreeModel constructor can only take one optional argument, the Array of node data.");J.call(this);this.qj="parent";this.tx=!1;this.gr="parentLinkCategory";void 0!==a&&(this.dh=a)}u.Ha(qe,J);u.fa("TreeModel",qe);qe.prototype.toString=function(a){void 0===a&&(a=0);if(2<=a){return this.lA()}var b=(""!==this.name?this.name:"")+" TreeModel";if(0<a){b+="\n node data:";a=this.dh;for(var c=u.qb(a),d=0;d<c;d++){var e=u.ib(a,d),b=b+(" "+this.wb(e)+":"+de(e))}}return b};qe.prototype.Bt=function(){var a=J.prototype.Bt.call(this),b="";"parent"!==this.Yo&&"string"===typeof this.Yo&&(b+=',\n "nodeParentKeyProperty": '+this.quote(this.Yo));return a+b};qe.prototype.gt=function(a){J.prototype.gt.call(this,a);a.nodeParentKeyProperty&&(this.Yo=a.nodeParentKeyProperty)};qe.prototype.Km=function(a){return a};u.defineProperty(qe,{Yo:"nodeParentKeyProperty"},function(){return this.qj},function(a){var b=this.qj;b!==a&&(Me(a,qe,"nodeParentKeyProperty"),this.qj=a,this.h("nodeParentKeyProperty",b,a))});u.defineProperty(qe,{ym:"copiesParentKeyOfNodeData"},function(){return this.tx},function(a){this.tx!==a&&(u.j(a,"boolean",qe,"copiesParentKeyOfNodeData"),this.tx=a)});qe.prototype.getParentKeyForNodeData=qe.prototype.Gm=function(a){if(null!==a){var b=this.qj;if(""!==b&&(b=u.sb(a,b),void 0!==b)){if(Ne(b)){return b}u.k("ParentKey value for node data "+a+" is not a number or a string: "+b)}}};qe.prototype.setParentKeyForNodeData=qe.prototype.kh=function(a,b){null===b&&(b=void 0);void 0===b||Ne(b)||u.Ld(b,"number or string",qe,"setParentKeyForNodeData:key");if(null!==a){var c=this.qj;if(""!==c){if(b=this.Km(b),this.Ve(a)){var d=u.sb(a,c);d!==b&&(Qe(this,d,a),u.Pa(a,c,b),null===this.sf(b)&&Pe(this,b,a),Le(this,"nodeParentKey",$d,c,a,d,b),"string"===typeof c&&this.Ob(a,c))}else{u.Pa(a,c,b)}}}};u.defineProperty(qe,{oK:"parentLinkCategoryProperty"},function(){return this.gr},function(a){var b=this.gr;b!==a&&(Me(a,qe,"parentLinkCategoryProperty"),this.gr=a,this.h("parentLinkCategoryProperty",b,a))});qe.prototype.getParentLinkCategoryForNodeData=qe.prototype.IG=function(a){if(null===a){return""}var b=this.gr;if(""===b){return""}b=u.sb(a,b);if(void 0===b){return""}if("string"===typeof b){return b}u.k("getParentLinkCategoryForNodeData found a non-string category for "+a+": "+b);return""};qe.prototype.setParentLinkCategoryForNodeData=qe.prototype.jI=function(a,b){u.j(b,"string",qe,"setParentLinkCategoryForNodeData:cat");if(null!==a){var c=this.gr;if(""===c){return""}if(this.Ve(a)){var d=u.sb(a,c);void 0===d&&(d="");d!==b&&(u.Pa(a,c,b),Le(this,"parentLinkCategory",$d,c,a,d,b),"string"===typeof c&&this.Ob(a,c))}else{u.Pa(a,c,b)}}};qe.prototype.copyNodeData=function(a){if(null===a){return null}a=J.prototype.copyNodeData.call(this,a);this.ym||""===this.qj||u.Pa(a,this.qj,void 0); + return a};qe.prototype.setDataProperty=function(a,b,c){if(this.Ve(a)){if(b===this.Nm){this.cA(a,c)}else{if(b===this.Mm){this.Fw(a,c);return}if(b===this.Yo){this.kh(a,c);return}}}else{!Ue&&a instanceof T&&(Ue=!0,u.trace('TreeModel.setDataProperty is modifying a GraphObject, "'+a.toString()+'"'),u.trace(" Is that really your intent?"))}var d=u.sb(a,b);d!==c&&(u.Pa(a,b,c),this.Qz(a,b,d,c))};g=qe.prototype;g.ht=function(a,b){J.prototype.ht.call(this,a,b);for(var c=this.sc.i;c.next();){this.Yz(c.value,a,b)}};g.Yz=function(a,b,c){if(this.Gm(a)===b){var d=this.qj;u.Pa(a,d,c);Le(this,"nodeParentKey",$d,d,a,b,c);"string"===typeof d&&this.Ob(a,d)}};g.bp=function(a){J.prototype.bp.call(this,a);a=this.wb(a);var b=Oe(this,a);if(null!==b){for(var c=new E(Object),b=b.i;b.next();){var d=b.value;if(this.Ve(d)&&this.Gm(d)===a){var e=this.qj;Le(this,"nodeParentKey",$d,e,d,a,a);"string"===typeof e&&this.Ob(d,e);c.add(d)}}for(c=c.i;c.next();){Qe(this,a,c.value)}}};g.ap=function(a){J.prototype.ap.call(this,a);var b=this.Gm(a),b=this.Km(b);null===this.sf(b)&&Pe(this,b,a)};g.At=function(a){J.prototype.At.call(this,a);var b=this.Gm(a);Qe(this,b,a)};function bf(a,b,c){u.gc(this);this.Ea=!1;void 0===a?a="":u.j(a,"string",bf,"constructor:targetprop");void 0===b?b=a:u.j(b,"string",bf,"constructor:sourceprop");void 0===c?c=null:null!==c&&u.j(c,"function",bf,"constructor:conv");this.mC=-1;this.hg=null;this.qv=a;this.ov=this.By=0;this.hC=null;this.Gy=!1;this.hv=b;this.ox=c;this.gy=cf;this.ix=null}u.fa("Binding",bf);var cf;bf.OneWay=cf=u.s(bf,"OneWay",1);var df;bf.TwoWay=df=u.s(bf,"TwoWay",2);bf.parseEnum=function(a,b){u.j(a,"function",bf,"parseEnum:ctor");u.rb(b,a,bf,"parseEnum:defval");return function(c){c=Da(a,c);return null===c?b:c}};var de;bf.toString=de=function(a){var b=a;u.Ta(a)&&(a.text?b=a.text:a.name?b=a.name:void 0!==a.key?b=a.key:void 0!==a.id?b=a.id:a.constructor===Object&&(a.Text?b=a.Text:a.Name?b=a.Name:void 0!==a.Key?b=a.Key:void 0!==a.Id?b=a.Id:void 0!==a.ID&&(b=a.ID)));return void 0===b?"undefined":null===b?"null":b.toString()};bf.prototype.toString=function(){return"Binding("+this.Nw+":"+this.LE+(-1!==this.ul?" "+this.ul:"")+" "+this.mode.name+")"};bf.prototype.freeze=function(){this.Ea=!0;return this};bf.prototype.Ma=function(){this.Ea=!1;return this};u.defineProperty(bf,{ul:null},function(){return this.mC},function(a){u.J(this);u.j(a,"number",bf,"targetId");this.mC=a});u.defineProperty(bf,{Nw:"targetProperty"},function(){return this.qv},function(a){u.J(this);u.j(a,"string",bf,"targetProperty");this.qv=a});u.defineProperty(bf,{Rm:"sourceName"},function(){return this.hC},function(a){u.J(this);null!==a&&u.j(a,"string",bf,"sourceName");this.hC=a;null!==a&&(this.Gy=!1)});u.defineProperty(bf,{yt:"toModel"},function(){return this.Gy},function(a){u.J(this);u.j(a,"boolean",bf,"toModel");this.Gy=a});u.defineProperty(bf,{LE:"sourceProperty"},function(){return this.hv},function(a){u.J(this);u.j(a,"string",bf,"sourceProperty");this.hv=a});u.defineProperty(bf,{fG:"converter"},function(){return this.ox},function(a){u.J(this);null!==a&&u.j(a,"function",bf,"converter");this.ox=a});u.defineProperty(bf,{TF:"backConverter"},function(){return this.ix},function(a){u.J(this);null!==a&&u.j(a,"function",bf,"backConverter");this.ix=a});u.defineProperty(bf,{mode:"mode"},function(){return this.gy},function(a){u.J(this);u.rb(a,bf,bf,"mode");this.gy=a});bf.prototype.makeTwoWay=function(a){void 0===a&&(a=null);null!==a&&u.j(a,"function",bf,"makeTwoWay");this.mode=df;this.TF=a;return this};bf.prototype.ofObject=bf.prototype.tw=function(a){void 0===a&&(a="");this.Rm=a;this.yt=!1;return this};bf.prototype.ofModel=function(){this.Rm=null;this.yt=!0;return this};bf.prototype.ofData=function(){this.Rm=null;this.yt=!1;return this};function ef(a,b,c){a=a.Rm;var d=null;return d=null===a||""===a?b:"."===a?c:".."===a?c.P:b.ke(a)}bf.prototype.updateTarget=bf.prototype.ZE=function(a,b,c){var d=this.hv;if(void 0===c||d===c){c=this.qv;var e=this.ox;if(null===e&&""===c){u.trace("Binding error: target property is the empty string: "+this.toString())}else{var f=b;""!==d&&(f=u.sb(b,d));if(void 0!==f){if(null===e){""!==c&&u.Pa(a,c,f)}else{try{if(""!==c){var h=e(f,a);u.Pa(a,c,h)}else{e(f,a)}}catch(k){}}}}}};bf.prototype.updateSource=bf.prototype.Ow=function(a,b,c,d){void 0===d&&(d=null);if(this.gy===df){var e=this.qv;if(void 0===c||e===c){c=this.hv;var f=this.ix;if(null!==f||""!==c){var h=a;""!==e&&(h=u.sb(a,e));if(void 0!==h){if(null===f){null!==d&&d.ha?d.ha.setDataProperty(b,c,h):u.Pa(b,c,h)}else{try{if(""!==c){var k=f(h,b);null!==d&&d.ha?d.ha.setDataProperty(b,c,k):u.Pa(b,c,k)}else{f(h,b)}}catch(l){}}}}}}};function Ke(){this.mF=(new E(Od)).freeze();this.Vb="";this.nB=!1}u.fa("Transaction",Ke);Ke.prototype.toString=function(a){var b="Transaction: "+this.name+" "+this.Wg.count.toString()+(this.Ns?"":", incomplete");if(void 0!==a&&0<a){a=this.Wg.count;for(var c=0;c<a;c++){var d=this.Wg.ja(c);null!==d&&(b+="\n "+d.toString())}}return b};Ke.prototype.clear=Ke.prototype.clear=function(){var a=this.Wg; + a.Ma();for(var b=a.count-1;0<=b;b--){var c=a.ja(b);null!==c&&c.clear()}a.clear();a.freeze()};Ke.prototype.canUndo=Ke.prototype.canUndo=function(){return this.Ns};Ke.prototype.undo=Ke.prototype.undo=function(){if(this.canUndo()){for(var a=this.Wg.count-1;0<=a;a--){var b=this.Wg.ja(a);null!==b&&b.undo()}}};Ke.prototype.canRedo=Ke.prototype.canRedo=function(){return this.Ns};Ke.prototype.redo=Ke.prototype.redo=function(){if(this.canRedo()){for(var a=this.Wg.count,b=0;b<a;b++){var c=this.Wg.ja(b);null!==c&&c.redo()}}};u.u(Ke,{Wg:"changes"},function(){return this.mF});u.defineProperty(Ke,{name:"name"},function(){return this.Vb},function(a){this.Vb=a});u.defineProperty(Ke,{Ns:"isComplete"},function(){return this.nB},function(a){this.nB=a});function ee(){this.iy=new F(J);this.Oe=!1;this.tF=(new E(Ke)).freeze();this.Kg=-1;this.CB=999;this.gi=!1;this.cu=null;this.Jk=0;this.GA=!1;this.Qg=(new E("string")).freeze();this.Sn=new E("number");this.Mx=!0;this.Zx=!1}u.fa("UndoManager",ee);ee.prototype.toString=function(a){for(var b="UndoManager "+this.Ji+"<"+this.history.count+"<="+this.WD,b=b+"[",c=this.cE.count,d=0;d<c;d++){0<d&&(b+=" "),b+=this.cE.ja(d)}b+="]";if(void 0!==a&&0<a){for(c=this.history.count,d=0;d<c;d++){b+="\n "+this.history.ja(d).toString(a-1)}}return b};ee.prototype.clear=ee.prototype.clear=function(){var a=this.history;a.Ma();for(var b=a.count-1;0<=b;b--){var c=a.ja(b);null!==c&&c.clear()}a.clear();this.Kg=-1;a.freeze();this.gi=!1;this.cu=null;this.Jk=0;this.Qg.Ma();this.Qg.clear();this.Qg.freeze();this.Sn.clear()};ee.prototype.addModel=ee.prototype.NF=function(a){this.iy.add(a)};ee.prototype.removeModel=ee.prototype.UH=function(a){this.iy.remove(a)};ee.prototype.startTransaction=ee.prototype.Xb=function(a){void 0===a&&(a="");null===a&&(a="");if(this.fb){return !1}!0===this.Mx&&(this.Mx=!1,this.Jk++,this.Rc("StartingFirstTransaction",a,this.Ei),0<this.Jk&&this.Jk--);this.isEnabled&&(this.Qg.Ma(),this.Qg.add(a),this.Qg.freeze(),null===this.Ei?this.Sn.add(0):this.Sn.add(this.Ei.Wg.count));this.Jk++;var b=1===this.Me;b&&this.Rc("StartedTransaction",a,this.Ei);return b};ee.prototype.commitTransaction=ee.prototype.Xd=function(a){void 0===a&&(a="");return ff(this,!0,a)};ee.prototype.rollbackTransaction=ee.prototype.cp=function(){return ff(this,!1,"")};function ff(a,b,c){if(a.fb){return !1}a.Ty&&1>a.Me&&u.trace("Ending transaction without having started a transaction: "+c);var d=1===a.Me;d&&b&&a.isEnabled&&a.Rc("CommittingTransaction",c,a.Ei);var e=0;if(0<a.Me&&(a.Jk--,a.isEnabled)){var f=a.Qg.count;0<f&&(""===c&&(c=a.Qg.ja(0)),a.Qg.Ma(),a.Qg.kd(f-1),a.Qg.freeze());f=a.Sn.count;0<f&&(e=a.Sn.ja(f-1),a.Sn.kd(f-1))}f=a.Ei;if(d){if(b){a.Zx=!1;if(a.isEnabled&&null!==f){b=f;b.Ns=!0;b.name=c;d=a.history;d.Ma();for(e=d.count-1;e>a.Ji;e--){f=d.ja(e),null!==f&&f.clear(),d.kd(e),a.Zx=!0}e=a.WD;0===e&&(e=1);0<e&&d.count>=e&&(f=d.ja(0),null!==f&&f.clear(),d.kd(0),a.Kg--);d.add(b);a.Kg++;d.freeze();f=b}a.Rc("CommittedTransaction",c,f)}else{a.gi=!0;try{a.isEnabled&&null!==f&&(f.Ns=!0,f.undo())}finally{a.Rc("RolledBackTransaction",c,f),a.gi=!1}null!==f&&f.clear()}a.cu=null;return !0}if(a.isEnabled&&!b&&null!==f){a=e;c=f.Wg;for(b=c.count-1;b>=a;b--){d=c.ja(b),null!==d&&d.undo(),c.Ma(),c.kd(b)}c.freeze()}return !1}ee.prototype.canUndo=ee.prototype.canUndo=function(){if(!this.isEnabled||0<this.Me||this.fb){return !1}var a=this.UE;return null!==a&&a.canUndo()?!0:!1};ee.prototype.undo=ee.prototype.undo=function(){if(this.canUndo()){var a=this.UE;try{this.Rc("StartingUndo","Undo",a),this.gi=!0,this.Kg--,a.undo()}catch(b){u.trace("undo error: "+b.toString())}finally{this.gi=!1,this.Rc("FinishedUndo","Undo",a)}}};ee.prototype.canRedo=ee.prototype.canRedo=function(){if(!this.isEnabled||0<this.Me||this.fb){return !1}var a=this.TE;return null!==a&&a.canRedo()?!0:!1};ee.prototype.redo=ee.prototype.redo=function(){if(this.canRedo()){var a=this.TE;try{this.Rc("StartingRedo","Redo",a),this.gi=!0,this.Kg++,a.redo()}catch(b){u.trace("redo error: "+b.toString())}finally{this.gi=!1,this.Rc("FinishedRedo","Redo",a)}}};ee.prototype.Rc=function(a,b,c){void 0===c&&(c=null);var d=new Od;d.Cd=ae;d.propertyName=a;d.object=c;d.oldValue=b;for(a=this.DH;a.next();){b=a.value,d.ha=b,b.Kv(d)}};ee.prototype.handleChanged=ee.prototype.ED=function(a){if(this.isEnabled&&!this.fb&&!this.skipsEvent(a)){var b=this.Ei;null===b&&(this.cu=b=new Ke);var c=a.copy(),b=b.Wg;b.Ma();b.add(c);b.freeze();this.Ty&&0>=this.Me&&!this.Mx&&(a=a.g,null!==a&&!1===a.nf||u.trace("Change not within a transaction: "+c.toString()))}};ee.prototype.skipsEvent=function(a){if(null===a||0>a.Cd.value){return !0}a=a.object;if(a instanceof T){if(a=a.layer,null!==a&&a.zc){return !0}}else{if(a instanceof we&&a.zc){return !0}}return !1};u.u(ee,{DH:"models"},function(){return this.iy.i});u.defineProperty(ee,{isEnabled:"isEnabled"},function(){return this.Oe},function(a){this.Oe=a});u.u(ee,{UE:"transactionToUndo"},function(){return 0<=this.Ji&&this.Ji<=this.history.count-1?this.history.ja(this.Ji):null + });u.u(ee,{TE:"transactionToRedo"},function(){return this.Ji<this.history.count-1?this.history.ja(this.Ji+1):null});u.u(ee,{fb:"isUndoingRedoing"},function(){return this.gi});u.u(ee,{history:"history"},function(){return this.tF});u.defineProperty(ee,{WD:"maxHistoryLength"},function(){return this.CB},function(a){this.CB=a});u.u(ee,{Ji:"historyIndex"},function(){return this.Kg});u.u(ee,{Ei:"currentTransaction"},function(){return this.cu});u.u(ee,{Me:"transactionLevel"},function(){return this.Jk});u.u(ee,{OD:"isInTransaction"},function(){return 0<this.Jk});u.defineProperty(ee,{Ty:"checksTransactionLevel"},function(){return this.GA},function(a){this.GA=a});u.u(ee,{cE:"nestedTransactionNames"},function(){return this.Qg});function sa(){0<arguments.length&&u.Xc(sa);u.gc(this);this.Y=null;this.JA=!0;this.LA=this.MA=this.XA=this.NA=!1;this.Ak=this.ex=null;this.EC=1.05;this.VA=1;this.$x=NaN;this.zB=null;this.FC=NaN}u.fa("CommandHandler",sa);var gf=null,hf="";sa.prototype.toString=function(){return"CommandHandler"};u.u(sa,{g:"diagram"},function(){return this.Y});sa.prototype.Dc=function(a){this.Y=a};sa.prototype.doKeyDown=function(){var a=this.g;if(null!==a){var b=a.N,c=u.Im?b.Zs:b.control,d=b.shift,e=b.alt,f=b.key;!c||"C"!==f&&"Insert"!==f?c&&"X"===f||d&&"Del"===f?this.canCutSelection()&&this.cutSelection():c&&"V"===f||d&&"Insert"===f?this.canPasteSelection()&&this.pasteSelection():c&&"Y"===f||e&&d&&"Backspace"===f?this.canRedo()&&this.redo():c&&"Z"===f||e&&"Backspace"===f?this.canUndo()&&this.undo():"Del"===f||"Backspace"===f?this.canDeleteSelection()&&this.deleteSelection():c&&"A"===f?this.canSelectAll()&&this.selectAll():"Esc"===f?this.canStopCommand()&&this.stopCommand():"Up"===f?a.Te&&(c?a.scroll("pixel","up"):a.scroll("line","up")):"Down"===f?a.Te&&(c?a.scroll("pixel","down"):a.scroll("line","down")):"Left"===f?a.Se&&(c?a.scroll("pixel","left"):a.scroll("line","left")):"Right"===f?a.Se&&(c?a.scroll("pixel","right"):a.scroll("line","right")):"PageUp"===f?d&&a.Se?a.scroll("page","left"):a.Te&&a.scroll("page","up"):"PageDown"===f?d&&a.Se?a.scroll("page","right"):a.Te&&a.scroll("page","down"):"Home"===f?(b=a.Ed,c&&a.Te?a.position=new w(a.position.x,b.y):!c&&a.Se&&(a.position=new w(b.x,a.position.y))):"End"===f?(b=a.Ed,d=a.ob,c&&a.Te?a.position=new w(d.x,b.bottom-d.height):!c&&a.Se&&(a.position=new w(b.right-d.width,d.y))):"Subtract"===f?this.canDecreaseZoom()&&this.decreaseZoom():"Add"===f?this.canIncreaseZoom()&&this.increaseZoom():c&&"0"===f?this.canResetZoom()&&this.resetZoom():d&&"Z"===f?this.canZoomToFit()&&this.zoomToFit():c&&!d&&"G"===f?this.canGroupSelection()&&this.groupSelection():c&&d&&"G"===f?this.canUngroupSelection()&&this.ungroupSelection():b.event&&113===b.event.which?this.canEditTextBlock()&&this.editTextBlock():b.event&&93===b.event.which?this.canShowContextMenu()&&this.showContextMenu():b.bubbles=!0:this.canCopySelection()&&this.copySelection()}};sa.prototype.doKeyUp=function(){var a=this.g;null!==a&&(a.N.bubbles=!0)};sa.prototype.stopCommand=function(){var a=this.g;if(null!==a){var b=a.Va;b instanceof jf&&a.qf&&a.Mv();null!==b&&b.doCancel()}};sa.prototype.canStopCommand=function(){return !0};sa.prototype.selectAll=function(){var a=this.g;if(null!==a){a.na();try{a.bc="wait";a.Ba("ChangingSelection");for(var b=a.Sj;b.next();){b.value.$a=!0}for(var c=a.Ag;c.next();){c.value.$a=!0}for(var d=a.links;d.next();){d.value.$a=!0}}finally{a.Ba("ChangedSelection"),a.bc=""}}};sa.prototype.canSelectAll=function(){var a=this.g;return null!==a&&a.qf};sa.prototype.deleteSelection=function(){var a=this.g;if(null!==a&&!a.Ba("SelectionDeleting",a.selection)){try{a.bc="wait";a.Xb("Delete");a.Ba("ChangingSelection");for(var b=new F(G),c=a.selection.i;c.next();){kf(b,c.value,!0,this.rG?Infinity:0,!0,function(a){return a.canDelete()})}a.Xz(b,!0);a.Ba("SelectionDeleted",b)}finally{a.Ba("ChangedSelection"),a.Xd("Delete"),a.bc=""}}};sa.prototype.canDeleteSelection=function(){var a=this.g;return null===a||a.nb||a.vf||!a.pm||0===a.selection.count?!1:!0};function kf(a,b,c,d,e,f){void 0===f&&(f=null);if(!(a.contains(b)||null!==f&&!f(b)||b instanceof lf)){if(a.add(b),b instanceof U){if(c&&b instanceof V){for(var h=b.Lc;h.next();){kf(a,h.value,c,d,e,f)}}if(e){for(h=b.pe;h.next();){var k=h.value;if(!a.contains(k)){var l=k.V,m=k.ba;null!==l&&a.contains(l)&&null!==m&&a.contains(m)?kf(a,k,c,d,e,f):null!==l&&null!==m||kf(a,k,c,d,e,f)}}}if(1<d){for(b=b.uD();b.next();){kf(a,b.value,c,d-1,e,f)}}}else{if(b instanceof W){for(h=b.wg;h.next();){kf(a,h.value,c,d,e,f)}}}}}sa.prototype.vo=function(a,b,c){var d=new la(G,G);for(a=a.i;a.next();){mf(this,a.value,b,d,c)}if(null!==b){c=b.ha;a=!1;null!==b.tb.Gd&&(a=b.tb.Gd.Hi);for(var e=new F(W),f=new la(W,W),h=d.i;h.next();){var k=h.value;if(k instanceof W){var l=k;a||null!==l.V&&null!==l.ba||e.add(l)}else{if(c instanceof qe&&k instanceof U&&null!==k.data){var l=c,m=k,k=h.key,n=k.Dm();null!==n&&(n=d.ua(n),null!==n?(l.kh(m.data,l.wb(n.data)),l=b.pg(m.data),k=k.Bs(),null!==k&&null!==l&&f.add(k,l)):l.kh(m.data,void 0)) + }}}0<e.count&&b.Xz(e,!1);if(0<f.count){for(b=f.i;b.next();){d.add(b.key,b.value)}}}for(b=d.i;b.next();){b.value.Ob()}return d};function mf(a,b,c,d,e){if(null===b||e&&!b.canCopy()){return null}if(d.contains(b)){return d.ua(b)}var f=null,h=b.data;if(null!==h&&null!==c){var k=c.ha;b instanceof W?k instanceof Q&&(h=k.fD(h),u.Ta(h)&&(k.yv(h),f=c.pg(h))):(h=k.copyNodeData(h),u.Ta(h)&&(k.om(h),f=c.Ph(h)))}else{nf(b),f=b.copy(),null!==c&&null!==f&&c.add(f)}if(!(f instanceof G)){return null}f.$a=!1;f.Yg=!1;d.add(b,f);if(b instanceof U){for(k=b.pe;k.next();){h=k.value;if(h.V===b){var l=d.ua(h);null!==l&&(l.V=f)}h.ba===b&&(l=d.ua(h),null!==l&&(l.ba=f))}if(b instanceof V&&f instanceof V){for(k=f,b=b.Lc;b.next();){h=mf(a,b.value,c,d,e),h instanceof W||null===h||(h.Sa=k)}}}else{if(b instanceof W){for(k=b.V,null!==k&&(k=d.ua(k),null!==k&&(f.V=k)),k=b.ba,null!==k&&(k=d.ua(k),null!==k&&(f.ba=k)),b=b.wg;b.next();){k=mf(a,b.value,c,d,e),null!==k&&(k.de=f)}}}return f}sa.prototype.copySelection=function(){var a=this.g;if(null!==a){for(var b=new F(G),a=a.selection.i;a.next();){kf(b,a.value,!0,this.iG?Infinity:0,this.gG,function(a){return a.canCopy()})}this.copyToClipboard(b)}};sa.prototype.canCopySelection=function(){var a=this.g;return null!==a&&a.Ij&&a.Oy&&0!==a.selection.count?!0:!1};sa.prototype.cutSelection=function(){this.copySelection();this.deleteSelection()};sa.prototype.canCutSelection=function(){var a=this.g;return null!==a&&!a.nb&&!a.vf&&a.Ij&&a.pm&&a.Oy&&0!==a.selection.count?!0:!1};sa.prototype.copyToClipboard=function(a){var b=this.g;if(null!==b){var c=null;if(null===a){gf=null,hf=""}else{var c=b.ha,d=!1,e=!1,f=null;try{if(c instanceof qe){var h=c,d=h.ym;h.ym=this.eD}c instanceof Q&&(h=c,e=h.xm,h.xm=this.dD);f=b.vo(a,null,!0)}finally{c instanceof qe&&(c.ym=d),c instanceof Q&&(c.xm=e),c=new E(G),c.Ud(f),gf=c,hf=b.ha.Sk}}b.Ba("ClipboardChanged",c)}};sa.prototype.pasteFromClipboard=function(){var a=new F(G),b=gf;if(null===b){return a}var c=this.g;if(null===c||hf!==c.ha.Sk){return a}var d=c.ha,e=!1,f=!1,h=null;try{if(d instanceof qe){var k=d,e=k.ym;k.ym=this.eD}d instanceof Q&&(k=d,f=k.xm,k.xm=this.dD);h=c.vo(b,c,!1)}finally{for(d instanceof qe&&(d.ym=e),d instanceof Q&&(d.xm=f),b=h.i;b.next();){c=b.value,d=b.key,c.location.I()||(d.location.I()?c.location=d.location:!c.position.I()&&d.position.I()&&(c.position=d.position)),a.add(c)}}return a};sa.prototype.pasteSelection=function(a){void 0===a&&(a=null);var b=this.g;if(null!==b){try{b.bc="wait";b.Xb("Paste");b.Ba("ChangingSelection");var c=this.pasteFromClipboard();0<c.count&&of(b);for(var d=c.i;d.next();){d.value.$a=!0}b.Ba("ChangedSelection");if(null!==a){var e=b.computePartsBounds(b.selection);if(e){var f=b.tb.Gd;null===f&&(f=new uf,f.Dc(b));var h=f.computeEffectiveCollection(b.selection);f.moveParts(h,new w(a.x-e.ma,a.y-e.ya),!1)}}b.Ba("ClipboardPasted",c)}finally{b.Xd("Paste"),b.bc=""}}};sa.prototype.canPasteSelection=function(){var a=this.g;return null===a||a.nb||a.vf||!a.no||!a.Oy||null===gf||hf!==a.ha.Sk?!1:!0};sa.prototype.undo=function(){var a=this.g;null!==a&&a.ga.undo()};sa.prototype.canUndo=function(){var a=this.g;return null===a||a.nb||a.vf?!1:a.NC&&a.ga.canUndo()};sa.prototype.redo=function(){var a=this.g;null!==a&&a.ga.redo()};sa.prototype.canRedo=function(){var a=this.g;return null===a||a.nb||a.vf?!1:a.NC&&a.ga.canRedo()};sa.prototype.decreaseZoom=function(a){void 0===a&&(a=1/this.Qw);u.Be(a,sa,"decreaseZoom:factor");var b=this.g;null!==b&&b.po===vf&&(a*=b.scale,a<b.$g||a>b.Zg||(b.scale=a))};sa.prototype.canDecreaseZoom=function(a){void 0===a&&(a=1/this.Qw);u.Be(a,sa,"canDecreaseZoom:factor");var b=this.g;if(null===b||b.po!==vf){return !1}a*=b.scale;return a<b.$g||a>b.Zg?!1:b.Hv};sa.prototype.increaseZoom=function(a){void 0===a&&(a=this.Qw);u.Be(a,sa,"increaseZoom:factor");var b=this.g;null!==b&&b.po===vf&&(a*=b.scale,a<b.$g||a>b.Zg||(b.scale=a))};sa.prototype.canIncreaseZoom=function(a){void 0===a&&(a=this.Qw);u.Be(a,sa,"canIncreaseZoom:factor");var b=this.g;if(null===b||b.po!==vf){return !1}a*=b.scale;return a<b.$g||a>b.Zg?!1:b.Hv};sa.prototype.resetZoom=function(a){void 0===a&&(a=this.Pv);u.Be(a,sa,"resetZoom:newscale");var b=this.g;null===b||a<b.$g||a>b.Zg||(b.scale=a)};sa.prototype.canResetZoom=function(a){void 0===a&&(a=this.Pv);u.Be(a,sa,"canResetZoom:newscale");var b=this.g;return null===b||a<b.$g||a>b.Zg?!1:b.Hv};sa.prototype.zoomToFit=function(){var a=this.g;if(null!==a){var b=a.scale,c=a.position;b!==this.FC||isNaN(this.$x)?(this.$x=b,this.zB=c.copy(),a.zoomToFit(),a.df(),this.FC=a.scale):(a.scale=this.$x,a.position=this.zB)}};sa.prototype.canZoomToFit=function(){var a=this.g;return null===a?!1:a.Hv};sa.prototype.collapseTree=function(a){void 0===a&&(a=null);var b=this.g;if(null===b){return !1}try{b.Xb("Collapse Tree");var c=new E(U);if(null!==a&&a.Wc){a.collapseTree(),c.add(a)}else{for(var d=b.selection.i;d.next();){var e=d.value;e instanceof U&&(a=e,a.Wc&&(a.collapseTree(),c.add(a)))}}b.Ba("TreeCollapsed",c)}finally{b.Xd("Collapse Tree")}}; + sa.prototype.canCollapseTree=function(a){void 0===a&&(a=null);var b=this.g;if(null===b||b.nb){return !1}if(null!==a){if(!a.Wc){return !1}if(0<a.Yv().count){return !0}}else{for(a=b.selection.i;a.next();){if(b=a.value,b instanceof U&&b.Wc&&0<b.Yv().count){return !0}}}return !1};sa.prototype.expandTree=function(a){void 0===a&&(a=null);var b=this.g;if(null===b){return !1}try{b.Xb("Expand Tree");var c=new E(U);if(null===a||a.Wc){for(var d=b.selection.i;d.next();){var e=d.value;e instanceof U&&(a=e,a.Wc||(a.expandTree(),c.add(a)))}}else{a.expandTree(),c.add(a)}b.Ba("TreeExpanded",c)}finally{b.Xd("Expand Tree")}};sa.prototype.canExpandTree=function(a){void 0===a&&(a=null);var b=this.g;if(null===b||b.nb){return !1}if(null!==a){if(a.Wc){return !1}if(0<a.Yv().count){return !0}}else{for(a=b.selection.i;a.next();){if(b=a.value,b instanceof U&&!b.Wc&&0<b.Yv().count){return !0}}}return !1};sa.prototype.groupSelection=function(){var a=this.g;if(null!==a){var b=a.ha;if(b instanceof Q){var c=this.OC;if(null!==c){var d=null;try{a.bc="wait";a.Xb("Group");a.Ba("ChangingSelection");for(var e=new E(G),f=a.selection.i;f.next();){var h=f.value;h.Hd()&&h.canGroup()&&e.add(h)}for(var k=new E(G),l=e.i;l.next();){for(var m=l.value,f=!1,n=e.i;n.next();){if(m.Rh(n.value)){f=!0;break}}f||k.add(m)}if(0<k.count){var p=k.first().Sa;if(null!==p){for(;null!==p;){for(var e=!1,q=k.i;q.next();){if(!q.value.Rh(p)){e=!0;break}}if(e){p=p.Sa}else{break}}}if(c instanceof V){nf(c),d=c.copy(),null!==d&&a.add(d)}else{if(b.uz(c)){var r=b.copyNodeData(c);u.Ta(r)&&(b.om(r),d=a.Xv(r))}}if(null!==d){null!==p&&this.isValidMember(p,d)&&(d.Sa=p);for(var s=k.i;s.next();){var t=s.value;this.isValidMember(d,t)&&(t.Sa=d)}a.select(d)}}a.Ba("ChangedSelection");a.Ba("SelectionGrouped",d)}finally{a.Xd("Group"),a.bc=""}}}}};sa.prototype.canGroupSelection=function(){var a=this.g;if(null===a||a.nb||a.vf||!a.no||!a.Cv||!(a.ha instanceof Q)||null===this.OC){return !1}for(a=a.selection.i;a.next();){var b=a.value;if(b.Hd()&&b.canGroup()){return !0}}return !1};function wf(a){var b=u.hb();for(a=a.i;a.next();){var c=a.value;c instanceof W||b.push(c)}a=new F(G);for(var c=b.length,d=0;d<c;d++){for(var e=b[d],f=!0,h=0;h<c;h++){if(e.Rh(b[h])){f=!1;break}}f&&a.add(e)}u.sa(b);return a}sa.prototype.isValidMember=function(a,b){if(null===b||a===b||b instanceof W){return !1}if(null!==a){if(a===b||a.Rh(b)){return !1}var c=a.Cz;if(null!==c&&!c(a,b)||null===a.data&&null!==b.data||null!==a.data&&null===b.data){return !1}}c=this.Cz;return null!==c?c(a,b):!0};sa.prototype.ungroupSelection=function(a){void 0===a&&(a=null);var b=this.g;if(null!==b){var c=b.ha;if(c instanceof Q){try{b.bc="wait";b.Xb("Ungroup");b.Ba("ChangingSelection");var d=new E(V);if(null!==a){d.add(a)}else{for(var e=b.selection.i;e.next();){var f=e.value;f instanceof V&&(a=f,a.canUngroup()&&d.add(a))}}if(0<d.count){b.Mv();for(var h=d.i;h.next();){var k=h.value;k.expandSubGraph();var l=k.Sa,m=null!==l&&null!==l.data?c.wb(l.data):void 0,n=new E(G);n.Ud(k.Lc);for(var p=n.i;p.next();){var q=p.value;q.$a=!0;if(!(q instanceof W)){var r=q.data;null!==r?c.Hw(r,m):q.Sa=l}}b.remove(k)}}b.Ba("ChangedSelection");b.Ba("SelectionUngrouped",d,n)}finally{b.Xd("Ungroup"),b.bc=""}}}};sa.prototype.canUngroupSelection=function(a){void 0===a&&(a=null);var b=this.g;if(null===b||b.nb||b.vf||!b.pm||!b.Gv||!(b.ha instanceof Q)){return !1}if(null!==a){if(a.canUngroup()){return !0}}else{for(a=b.selection.i;a.next();){if(b=a.value,b instanceof V&&b.canUngroup()){return !0}}}return !1};sa.prototype.addTopLevelParts=function(a,b){for(var c=!0,d=wf(a).i;d.next();){var e=d.value;null!==e.Sa&&(!b||this.isValidMember(null,e)?e.Sa=null:c=!1)}return c};sa.prototype.collapseSubGraph=function(a){void 0===a&&(a=null);var b=this.g;if(null===b){return !1}try{b.Xb("Collapse SubGraph");var c=new E(V);if(null!==a&&a.ce){a.collapseSubGraph(),c.add(a)}else{for(var d=b.selection.i;d.next();){var e=d.value;e instanceof V&&(a=e,a.ce&&(a.collapseSubGraph(),c.add(a)))}}b.Ba("SubGraphCollapsed",c)}finally{b.Xd("Collapse SubGraph")}};sa.prototype.canCollapseSubGraph=function(a){void 0===a&&(a=null);var b=this.g;if(null===b||b.nb){return !1}if(null!==a){return a.ce?!0:!1}for(a=b.selection.i;a.next();){if(b=a.value,b instanceof V&&b.ce){return !0}}return !1};sa.prototype.expandSubGraph=function(a){void 0===a&&(a=null);var b=this.g;if(null===b){return !1}try{b.Xb("Expand SubGraph");var c=new E(V);if(null===a||a.ce){for(var d=b.selection.i;d.next();){var e=d.value;e instanceof V&&(a=e,a.ce||(a.expandSubGraph(),c.add(a)))}}else{a.expandSubGraph(),c.add(a)}b.Ba("SubGraphExpanded",c)}finally{b.Xd("Expand SubGraph")}};sa.prototype.canExpandSubGraph=function(a){void 0===a&&(a=null);var b=this.g;if(null===b||b.nb){return !1}if(null!==a){return a.ce?!1:!0}for(a=b.selection.i;a.next();){if(b=a.value,b instanceof V&&!b.ce){return !0}}return !1};sa.prototype.editTextBlock=function(a){void 0===a&&(a=null);null!==a&&u.C(a,qa,sa,"editTextBlock");var b=this.g;if(null!==b){var c=b.tb.jA;if(null!==c){if(null===a){a=null; + for(var d=b.selection.i;d.next();){var e=d.value;if(e.canEdit()){a=e;break}}if(null===a){return}a=a.ws(function(a){return a instanceof qa&&a.cz})}null!==a&&(b.Va=null,c.te=a,b.Va=c)}}};sa.prototype.canEditTextBlock=function(a){void 0===a&&(a=null);null!==a&&u.C(a,qa,sa,"canEditTextBlock");var b=this.g;if(null===b||b.nb||b.vf||!b.Fv||null===b.tb.jA){return !1}if(null!==a){if(a=a.W,null!==a&&a.canEdit()){return !0}}else{for(b=b.selection.i;b.next();){if(a=b.value,a.canEdit()&&(a=a.ws(function(a){return a instanceof qa&&a.cz}),null!==a)){return !0}}}return !1};sa.prototype.showContextMenu=function(a){var b=this.g;if(null!==b){var c=b.tb.Wy;if(null!==c&&(void 0===a&&(a=0<b.selection.count?b.selection.first():b),a=c.findObjectWithContextMenu(a),null!==a)){var d=new Md,e=null;a instanceof T?e=a.eb(Ib):b.fH||(e=b.ob,e=new w(e.x+e.width/2,e.y+e.height/2));null!==e&&(d.hf=b.VE(e),d.da=e,b.N=d);b.Va=c;xf(c,!1,a)}}};sa.prototype.canShowContextMenu=function(a){var b=this.g;if(null===b){return !1}var c=b.tb.Wy;if(null===c){return !1}void 0===a&&(a=0<b.selection.count?b.selection.first():b);return null===c.findObjectWithContextMenu(a)?!1:!0};u.defineProperty(sa,{gG:"copiesConnectedLinks"},function(){return this.JA},function(a){u.j(a,"boolean",sa,"copiesConnectedLinks");this.JA=a});u.defineProperty(sa,{iG:"copiesTree"},function(){return this.NA},function(a){u.j(a,"boolean",sa,"copiesTree");this.NA=a});u.defineProperty(sa,{rG:"deletesTree"},function(){return this.XA},function(a){u.j(a,"boolean",sa,"deletesTree");this.XA=a});u.defineProperty(sa,{eD:"copiesParentKey"},function(){return this.MA},function(a){u.j(a,"boolean",sa,"copiesParentKey");this.MA=a});u.defineProperty(sa,{dD:"copiesGroupKey"},function(){return this.LA},function(a){u.j(a,"boolean",sa,"copiesGroupKey");this.LA=a});u.defineProperty(sa,{OC:"archetypeGroupData"},function(){return this.ex},function(a){null!==a&&u.C(a,Object,sa,"archetypeGroupData");var b=this.g;null!==b&&(b=b.ha,b instanceof Q&&(a instanceof V||b.uz(a)||u.k("CommandHandler.archetypeGroupData must be either a Group or a data object for which GraphLinksModel.isGroupForNodeData is true: "+a)));this.ex=a});u.defineProperty(sa,{Cz:"memberValidation"},function(){return this.Ak},function(a){null!==a&&u.j(a,"function",sa,"memberValidation");this.Ak=a});u.defineProperty(sa,{Pv:"defaultScale"},function(){return this.VA},function(a){u.Be(a,sa,"defaultScale");0<a||u.k("defaultScale must be larger than zero, not: "+a);this.VA=a});u.defineProperty(sa,{Qw:"zoomFactor"},function(){return this.EC},function(a){u.Be(a,sa,"zoomFactor");1<a||u.k("zoomFactor must be larger than 1.0, not: "+a);this.EC=a});function xe(){0<arguments.length&&u.Xc(xe);u.gc(this);this.Y=null;this.Vb="";this.Oe=!0;this.lB=!1;this.AC=null;this.wv=-1}u.fa("Tool",xe);xe.prototype.Dc=function(a){this.Y=a};xe.prototype.toString=function(){return""!==this.name?this.name+" Tool":u.tg(Object.getPrototypeOf(this))};xe.prototype.updateAdornments=function(){};xe.prototype.canStart=function(){return this.isEnabled};xe.prototype.doStart=function(){};xe.prototype.doActivate=function(){this.oa=!0};xe.prototype.doDeactivate=function(){this.oa=!1};xe.prototype.doStop=function(){};xe.prototype.doCancel=function(){this.stopTool()};xe.prototype.stopTool=function(){var a=this.g;null!==a&&a.Va===this&&(a.Va=null,a.bc="")};xe.prototype.doMouseDown=function(){!this.oa&&this.canStart()&&this.doActivate()};xe.prototype.doMouseMove=function(){};xe.prototype.doMouseUp=function(){this.stopTool()};xe.prototype.doMouseWheel=function(){};xe.prototype.canStartMultiTouch=function(){return !0};xe.prototype.standardPinchZoomStart=function(){var a=this.g;if(null!==a){var b=a.N.event,c=null,d=null;if(void 0!==b.targetTouches){if(2>b.targetTouches.length){return}c=b.targetTouches[0];d=b.targetTouches[1]}else{if(null!==a.Ef[0]){c=a.Ef[0],d=a.Ef[1]}else{return}}this.doCancel();if(a.An){a.Nx=!0;a.MB=a.scale;var e=a.Ab,f=a.zb,h=a.kb.getBoundingClientRect(),k=c.clientX-e/h.width*h.left,l=c.clientY-f/h.height*h.top,c=d,d=c.clientX-e/h.width*h.left-k,f=c.clientY-f/h.height*h.top-l,f=Math.sqrt(d*d+f*f);a.iC=f;b.preventDefault();b.cancelBubble=!0}else{yf(a)}}};xe.prototype.standardPinchZoomMove=function(){var a=this.g;if(null!==a){var b=a.N.event;this.doCancel();yf(a);var c=null,d=null;if(void 0!==b.targetTouches){if(2>b.targetTouches.length){return}c=b.targetTouches[0];d=b.targetTouches[1]}else{if(null!==a.Ef[0]){c=a.Ef[0],d=a.Ef[1]}else{return}}if(a.An&&a.Nx){var e=a.Ab,f=a.zb,h=a.kb.getBoundingClientRect(),k=c,c=k.clientX-e/h.width*h.left,l=k.clientY-f/h.height*h.top,k=d,d=k.clientX-e/h.width*h.left,f=k.clientY-f/h.height*h.top,h=d-c,e=f-l,h=Math.sqrt(h*h+e*e)/a.iC,c=new w((Math.min(d,c)+Math.max(d,c))/2,(Math.min(f,l)+Math.max(f,l))/2),l=a.MB*h,d=a.Eb;l!==a.scale&&d.canResetZoom(l)&&(f=a.yl,a.yl=c,d.resetZoom(l),a.yl=f);b.preventDefault();b.cancelBubble=!0}}};xe.prototype.doKeyDown=function(){var a=this.g;null!==a&&"Esc"===a.N.key&&this.doCancel()};xe.prototype.doKeyUp=function(){}; + xe.prototype.startTransaction=xe.prototype.Xb=function(a){void 0===a&&(a=this.name);this.Af=null;var b=this.g;return null===b?!1:b.Xb(a)};xe.prototype.stopTransaction=xe.prototype.Uj=function(){var a=this.g;return null===a?!1:null===this.Af?a.cp():a.Xd(this.Af)};xe.prototype.standardMouseSelect=function(){var a=this.g;if(null!==a&&a.qf){var b=a.N,c=a.As(b.da,!1);if(null!==c){if(u.Im?b.Zs:b.control){a.Ba("ChangingSelection");for(b=c;null!==b&&!b.canSelect();){b=b.Sa}null!==b&&(b.$a=!b.$a);a.Ba("ChangedSelection")}else{if(b.shift){if(!c.$a){a.Ba("ChangingSelection");for(b=c;null!==b&&!b.canSelect();){b=b.Sa}null!==b&&(b.$a=!0);a.Ba("ChangedSelection")}}else{if(!c.$a){for(b=c;null!==b&&!b.canSelect();){b=b.Sa}null!==b&&a.select(b)}}}}else{!b.left||(u.Im?b.Zs:b.control)||b.shift||a.Mv()}}};xe.prototype.standardMouseClick=function(a,b){void 0===a&&(a=null);void 0===b&&(b=function(a){return !a.layer.zc});var c=this.g;if(null!==c){var d=c.N,e=c.le(d.da,a,b);d.qe=e;zf(e,d,c)}};function zf(a,b,c){var d=0;b.left?d=1===b.Ue?1:2===b.Ue?2:1:b.right&&1===b.Ue&&(d=3);var e="";if(null!==a){switch(d){case 1:e="ObjectSingleClicked";break;case 2:e="ObjectDoubleClicked";break;case 3:e="ObjectContextClicked"}0!==d&&c.Ba(e,a)}else{switch(d){case 1:e="BackgroundSingleClicked";break;case 2:e="BackgroundDoubleClicked";break;case 3:e="BackgroundContextClicked"}0!==d&&c.Ba(e)}if(null!==a){for(b.Tc=!1;null!==a;){c=null;switch(d){case 1:c=a.click;break;case 2:c=a.us?a.us:a.click;break;case 3:c=a.Vy}if(null!==c&&(c(b,a),b.Tc)){break}a=a.P}}else{a=null;switch(d){case 1:a=c.click;break;case 2:a=c.us?c.us:c.click;break;case 3:a=c.Vy}null!==a&&a(b)}}xe.prototype.standardMouseOver=function(){var a=this.g;if(null!==a){var b=a.N;if(null!==b.g&&!0!==a.Mb.cd){var c=a.gb;a.gb=!0;var d=a.le(b.da,null,null);b.qe=d;var e=!1;if(d!==a.gn){var f=a.gn,h=f;a.gn=d;this.doCurrentObjectChanged(f,d);for(b.Tc=!1;null!==f;){var k=f.aE;if(null!==k){if(d===f){break}if(null!==d&&d.gl(f)){break}k(b,f,d);e=!0;if(b.Tc){break}}f=f.P}f=h;for(b.Tc=!1;null!==d;){k=d.$D;if(null!==k){if(f===d){break}if(null!==f&&f.gl(d)){break}k(b,d,f);e=!0;if(b.Tc){break}}d=d.P}d=a.gn}if(null!==d){f=d;for(k="";null!==f;){k=f.cursor;if(""!==k){break}f=f.P}a.bc=k;b.Tc=!1;for(f=d;null!==f;){k=f.Gz;if(null!==k&&(k(b,f),e=!0,b.Tc)){break}f=f.P}}else{a.bc="",k=a.Gz,null!==k&&(k(b),e=!0)}e&&a.ee();a.gb=c}}};xe.prototype.doCurrentObjectChanged=function(){};xe.prototype.standardMouseWheel=function(){var a=this.g;if(null!==a){var b=a.N,c=b.Uk;if(0!==c&&a.Ed.I()){var d=a.Eb,e=a.tb.at;if((e===Af&&!b.shift||e===Bf&&b.control)&&(0<c?d.canIncreaseZoom():d.canDecreaseZoom())){e=a.yl,a.yl=b.hf,0<c?d.increaseZoom():d.decreaseZoom(),a.yl=e,b.bubbles=!1}else{if(e===Af&&b.shift||e===Bf&&!b.control){d=a.position.copy();e=0<c?c:-c;if(!b.shift&&a.Te){var f=a.nt,e=e/40*f;0<c?a.scroll("pixel","up",e):a.scroll("pixel","down",e)}else{b.shift&&a.Se&&(f=a.mt,e=e/40*f,0<c?a.scroll("pixel","left",e):a.scroll("pixel","right",e))}a.position.L(d)||(b.bubbles=!1)}}}}};xe.prototype.standardWaitAfter=function(a){u.j(a,"number",xe,"standardWaitAfter:delay");this.cancelWaitAfter();var b=this;this.wv=u.setTimeout(function(){b.doWaitAfter()},a)};xe.prototype.cancelWaitAfter=function(){-1!==this.wv&&u.clearTimeout(this.wv);this.wv=-1};xe.prototype.doWaitAfter=function(){};xe.prototype.findToolHandleAt=function(a,b){var c=this.g;if(null===c){return null}c=c.le(a,function(a){for(;null!==a&&!(a.P instanceof lf);){a=a.P}return a});return null===c?null:c.P.Jc===b?c:null};xe.prototype.isBeyondDragSize=function(a,b){var c=this.g;if(null===c){return !1}void 0===a&&(a=c.uc.hf);void 0===b&&(b=c.N.hf);var d=c.tb.wG,e=d.width,d=d.height;c.uc.kl&&(e+=6,d+=6);return Math.abs(b.x-a.x)>e||Math.abs(b.y-a.y)>d};u.u(xe,{g:"diagram"},function(){return this.Y});u.defineProperty(xe,{name:"name"},function(){return this.Vb},function(a){u.j(a,"string",xe,"name");this.Vb=a});u.defineProperty(xe,{isEnabled:"isEnabled"},function(){return this.Oe},function(a){u.j(a,"boolean",xe,"isEnabled");this.Oe=a});u.defineProperty(xe,{oa:"isActive"},function(){return this.lB},function(a){u.j(a,"boolean",xe,"isActive");this.lB=a});u.defineProperty(xe,{Af:"transactionResult"},function(){return this.AC},function(a){null!==a&&u.j(a,"string",xe,"transactionResult");this.AC=a});function uf(){0<arguments.length&&u.Xc(uf);xe.call(this);this.name="Dragging";this.KA=this.pB=!0;this.kq=this.cB=!1;this.tB=!0;this.Ox=(new ia(NaN,NaN)).freeze();this.Px=xb;this.Qx=(new w(NaN,NaN)).freeze();this.bB=!1;this.$A=this.IA=this.aB=this.QA=this.qi=null;this.Tp=this.rB=!1;this.eo=new w(NaN,NaN);this.iv=new w;this.lv=!1;this.gv=this.oB=!0;this.rn=100;this.Yi=[];this.sF=(new F(G)).freeze()}u.Ha(uf,xe);u.fa("DraggingTool",uf);u.defineProperty(uf,{MD:"isCopyEnabled"},function(){return this.pB},function(a){u.j(a,"boolean",uf,"isCopyEnabled");this.pB=a});u.defineProperty(uf,{hG:"copiesEffectiveCollection"},function(){return this.KA},function(a){u.j(a,"boolean",uf,"copiesEffectiveCollection");this.KA=a + });u.defineProperty(uf,{xG:"dragsTree"},function(){return this.cB},function(a){u.j(a,"boolean",uf,"dragsTree");this.cB=a});u.defineProperty(uf,{hw:"isGridSnapEnabled"},function(){return this.kq},function(a){u.j(a,"boolean",uf,"isGridSnapEnabled");this.kq=a});u.defineProperty(uf,{ZG:"isComplexRoutingRealtime"},function(){return this.oB},function(a){u.j(a,"boolean",uf,"isComplexRoutingRealtime");this.oB=a});u.defineProperty(uf,{aH:"isGridSnapRealtime"},function(){return this.tB},function(a){u.j(a,"boolean",uf,"isGridSnapRealtime");this.tB=a});u.defineProperty(uf,{DD:"gridSnapCellSize"},function(){return this.Ox},function(a){u.C(a,ia,uf,"gridSnapCellSize");this.Ox.L(a)||(this.Ox=a=a.Z())});u.defineProperty(uf,{KG:"gridSnapCellSpot"},function(){return this.Px},function(a){u.C(a,L,uf,"gridSnapCellSpot");this.Px.L(a)||(this.Px=a=a.Z())});u.defineProperty(uf,{LG:"gridSnapOrigin"},function(){return this.Qx},function(a){u.C(a,w,uf,"gridSnapOrigin");this.Qx.L(a)||(this.Qx=a=a.Z())});u.defineProperty(uf,{Hi:"dragsLink"},function(){return this.bB},function(a){u.j(a,"boolean",uf,"dragsLink");this.bB=a});u.defineProperty(uf,{ts:"currentPart"},function(){return this.QA},function(a){null!==a&&u.C(a,G,uf,"currentPart");this.QA=a});u.defineProperty(uf,{oc:"copiedParts"},function(){return this.IA},function(a){this.IA=a});u.defineProperty(uf,{dc:"draggedParts"},function(){return this.aB},function(a){this.aB=a});u.u(uf,{yJ:"draggingParts"},function(){return null!==this.oc?this.oc.Oi():null!==this.dc?this.dc.Oi():this.sF});u.defineProperty(uf,{Sc:"draggedLink"},function(){return this.$A},function(a){null!==a&&u.C(a,W,uf,"draggedLink");this.$A=a});u.defineProperty(uf,{gw:"isDragOutStarted"},function(){return this.rB},function(a){this.rB=a});u.defineProperty(uf,{Tj:"startPoint"},function(){return this.iv},function(a){u.C(a,w,uf,"startPoint");this.iv.L(a)||(this.iv=a=a.Z())});u.defineProperty(uf,{jD:"delay"},function(){return this.rn},function(a){u.j(a,"number",uf,"delay");this.rn=a});uf.prototype.canStart=function(){if(!this.isEnabled){return !1}var a=this.g;if(null===a||!a.Nk&&!a.Ij&&!a.Bv||!a.qf){return !1}var b=a.N;return !b.left||a.Va!==this&&(!this.isBeyondDragSize()||b.kl&&b.timestamp-a.uc.timestamp<this.rn)?!1:null!==this.findDraggablePart()};uf.prototype.findDraggablePart=function(){var a=this.g;if(null===a){return null}a=a.As(a.uc.da,!1);if(null===a){return null}for(;null!==a&&!a.canSelect();){a=a.Sa}return null!==a&&(a.canMove()||a.canCopy())?a:null};uf.prototype.standardMouseSelect=function(){var a=this.g;if(null!==a&&a.qf){var b=a.As(a.uc.da,!1);if(null!==b){for(;null!==b&&!b.canSelect();){b=b.Sa}this.ts=b;this.ts.$a||(a.Ba("ChangingSelection"),b=a.N,(u.Im?b.Zs:b.control)||b.shift||of(a),this.ts.$a=!0,a.Ba("ChangedSelection"))}}};uf.prototype.doActivate=function(){var a=this.g;if(null!==a){this.standardMouseSelect();var b=this.ts;null!==b&&(b.canMove()||b.canCopy())&&(this.oa=!0,this.eo.set(a.position),Cf(this,a.selection),this.Yi.length=0,this.dc=this.computeEffectiveCollection(a.selection),a.ut=!0,Df(this,this.dc),this.Xb("Drag"),this.Tj=a.uc.da,a.He=!0,a.Bv&&(this.gw=!0,this.Tp=!1,Ef=this,Ff=this.g,this.doSimulatedDragOut()))}};function Cf(a,b){if(a.Hi){var c=a.g;null!==c&&c.qm&&(c.ha instanceof Q&&1===b.count&&b.first() instanceof W?(a.Sc=b.first(),a.Sc.canRelinkFrom()&&a.Sc.canRelinkTo()&&a.Sc.ns(),a.qi=c.tb.jE,null===a.qi&&(a.qi=new Gf,a.qi.Dc(c))):(a.Sc=null,a.qi=null))}}uf.prototype.computeEffectiveCollection=function(a){var b=null!==this.g&&this.g.Va===this,c=new la(G);if(null===a){return c}for(var d=a.i;d.next();){Hf(this,c,d.value,b)}if(null!==this.Sc&&this.Hi){return c}for(d=a.i;d.next();){a=d.value,a instanceof W&&(b=a.V,null===b||c.contains(b)?(b=a.ba,null===b||c.contains(b)||c.remove(a)):c.remove(a))}return c};function If(a){return void 0===a?new Jf(K.Wj):new Jf(a.copy())}function Hf(a,b,c,d){if(!b.contains(c)&&(!d||c.canMove()||c.canCopy())){if(c instanceof U){b.add(c,If(c.location));if(c instanceof V){for(var e=c.Lc;e.next();){Hf(a,b,e.value,d)}}for(e=c.pe;e.next();){var f=e.value;if(!b.contains(f)){var h=f.V,k=f.ba;null!==h&&b.contains(h)&&null!==k&&b.contains(k)&&Hf(a,b,f,d)}}if(a.xG){for(c=c.uD();c.next();){Hf(a,b,c.value,d)}}}else{if(c instanceof W){for(f=c,b.add(f,If()),e=f.wg;e.next();){Hf(a,b,e.value,d)}}else{c instanceof lf||b.add(c,If(c.location))}}}}uf.prototype.doDeactivate=function(){this.oa=!1;var a=this.g;null!==a&&Kf(a);Zf(this);$f(this,this.dc);this.dc=null;this.Tp=this.gw=!1;if(0<ag.count){for(var b=ag.length,c=0;c<b;c++){var d=ag.ja(c);bg(d);cg(d);Zf(d);null!==d.g&&Kf(d.g)}ag.clear()}bg(this);this.eo.m(NaN,NaN);Ef=Ff=null;cg(this);a.He=!1;a.bc="";a.ut=!1;this.Uj()};function Zf(a){var b=a.g;if(null!==b){var c=b.gb;b.gb=!0;dg(a,b.N,null);b.gb=c}a.Yi.length=0}function eg(){var a=Ef;cg(a);fg(a);var b=a.g;null!==b&&a.eo.I()&&(b.position=a.eo);null!==b&&Kf(b)}uf.prototype.doCancel=function(){cg(this);fg(this);var a=this.g;null!==a&&this.eo.I()&&(a.position=this.eo);this.stopTool()};function Df(a,b){if(null!==b){a.lv=!0; + for(var c=b.i;c.next();){var d=c.key;d instanceof W&&(d.kp=!0)}}}function $f(a,b){if(null!==b){for(var c=b.i;c.next();){var d=c.key;d instanceof W&&(d.kp=!1,d.el&&gg(d)&&d.Wb())}a.lv=!1}}uf.prototype.doKeyDown=function(){var a=this.g;null!==a&&(a=a.N,null!==a&&this.oa&&("Esc"===a.key?this.doCancel():this.doMouseMove()))};uf.prototype.doKeyUp=function(){var a=this.g;null!==a&&null!==a.N&&this.oa&&this.doMouseMove()};function hg(a,b){for(var c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,h=a.i;h.next();){var k=h.value;if(k.Hd()&&k.Ia()){var l=k.location,k=l.x,l=l.y;isNaN(k)||isNaN(l)||(k<c&&(c=k),l<d&&(d=l),k>e&&(e=k),l>f&&(f=l))}}Infinity===c?b.m(0,0,0,0):b.m(c,d,e-c,f-d)}function ig(a,b){if(null===a.oc){var c=a.g;if(!(null===c||b&&(c.nb||c.vf))&&null!==a.dc){var d=c.ga;d.isEnabled&&d.OD?null!==d.Ei&&0<d.Ei.Wg.count&&(c.ga.cp(),c.Xb("Drag")):fg(a);c.gb=!b;c.Ym=!b;a.Tj=c.uc.da;d=a.hG?a.dc.Oi():c.selection;d=c.vo(d,c,!0);for(c=d.i;c.next();){c.value.location=c.key.location}c=u.Tf();hg(d,c);u.ic(c);for(var c=new la(G),e=a.dc.i;e.next();){var f=e.key;f.Hd()&&f.canCopy()&&(f=d.ua(f),null!==f&&(f.rf(),c.add(f,If(f.location))))}for(d=d.i;d.next();){e=d.value,e instanceof W&&e.canCopy()&&c.add(e,If())}a.oc=c;Cf(a,c.Oi());null!==a.Sc&&(c=a.Sc,d=c.Qm,c.ml(a.Tj.x-(d.x+d.width/2),a.Tj.y-(d.y+d.height/2)))}}}function cg(a){var b=a.g;if(null!==b){if(null!==a.oc&&(b.Xz(a.oc.Oi(),!1),a.oc=null,null!==a.dc)){for(var c=a.dc.i;c.next();){c.key instanceof W&&(c.value.point=new w(0,0))}}b.gb=!1;b.Ym=!1;a.Tj=b.uc.da}}function bg(a){if(null!==a.Sc){if(a.Hi&&null!==a.qi){var b=a.qi;b.g.remove(b.re);b.g.remove(b.se)}a.Sc=null;a.qi=null}}function jg(a,b,c){var d=a.g;if(null!==d){var e=a.Tj,f=u.K();f.assign(d.N.da);a.moveParts(b,f.wt(e),c);u.v(f)}}uf.prototype.moveParts=function(a,b,c){if(null!==a&&(u.C(a,la,uf,"moveParts:parts"),0!==a.count)){var d=u.K(),e=u.K();e.assign(b);isNaN(e.x)&&(e.x=0);isNaN(e.y)&&(e.y=0);(b=this.lv)||Df(this,a);for(var f=new E(kg),h=new E(Pa),k=a.i;k.next();){var l=k.key;if(l.Hd()){var m=lg(this,l,a);if(null!==m){f.add(new kg(l,k.value,m))}else{if(!c||l.canMove()){m=k.value.point;d.assign(m);var n=u.K(),p=this.computeMove(l,d.add(e),a,n);l.location=p;k.value.IE=n.wt(m);u.v(n)}}}else{k.key instanceof W&&h.add(k.Cb)}}for(c=f.i;c.next();){f=c.value,m=f.info.point,d.assign(m),f.Bc.location=d.add(f.MG.IE)}c=u.K();m=u.K();for(h=h.i;h.next();){if(k=h.value,f=k.key,f instanceof W){if(f.kp){l=f.V,n=f.ba,null!==this.Sc&&this.Hi?(k=k.value.point,a.add(f,If(e)),l=e.x-k.x,k=e.y-k.y,f.ml(l,k)):(null!==l&&(c.assign(l.location),p=a.ua(l),null!==p&&c.wt(p.point)),null!==n&&(m.assign(n.location),p=a.ua(n),null!==p&&m.wt(p.point)),null!==l&&null!==n?c.pd(m)?(k=k.value.point,l=d,l.assign(c),l.wt(k),a.add(f,If(c)),f.ml(l.x,l.y)):(f.kp=!1,f.Wb()):(k=k.value.point,n=null!==l?c:null!==n?m:e,a.add(f,If(n)),l=n.x-k.x,k=n.y-k.y,f.ml(l,k)))}else{if(null===f.V||null===f.ba){k=k.value.point,a.add(f,If(e)),l=e.x-k.x,k=e.y-k.y,f.ml(l,k)}}}}u.v(d);u.v(e);u.v(c);u.v(m);b||$f(this,a)}};function lg(a,b,c){b=b.Sa;if(null!==b){a=lg(a,b,c);if(null!==a){return a}a=c.ua(b);if(null!==a){return a}}return null}function fg(a){if(null!==a.dc){for(var b=a.g,c=a.dc.i;c.next();){var d=c.key;d.Hd()&&(d.location=c.value.point)}for(c=a.dc.i;c.next();){if(d=c.key,d instanceof W&&d.kp){var e=c.value.point;a.dc.add(d,If());d.ml(-e.x,-e.y)}}b.df()}}uf.prototype.computeMove=function(a,b,c,d){void 0===d&&(d=new w);d.assign(b);if(null===a){return d}void 0===c&&(c=null);var e=b;if(this.hw&&(this.aH||null===c||this.g.N.up)&&(e=u.K(),c=e,c.assign(b),null!==a)){var f=this.g;if(null!==f){var h=f.Hs,k=this.DD,f=k.width,k=k.height,l=this.LG,m=l.x,l=l.y,n=this.KG;if(null!==h){var p=h.aw;isNaN(f)&&(f=p.width);isNaN(k)&&(k=p.height);h=h.CD;isNaN(m)&&(m=h.x);isNaN(l)&&(l=h.y)}h=u.Yb(0,0);h.st(0,0,f,k,n);K.ys(b.x,b.y,m+h.x,l+h.y,f,k,c);u.v(h)}}c=null!==a.nD?a.nD(a,b,e):e;k=a.CH;f=k.x;isNaN(f)&&(f=a.location.x);k=k.y;isNaN(k)&&(k=a.location.y);h=a.xH;m=h.x;isNaN(m)&&(m=a.location.x);h=h.y;isNaN(h)&&(h=a.location.y);d.m(Math.max(f,Math.min(c.x,m)),Math.max(k,Math.min(c.y,h)));e!==b&&u.v(e);return d};function mg(a,b){if(null===b){return !0}var c=b.W;return null===c||c instanceof lf||c.layer.zc||a.dc&&a.dc.contains(c)||a.oc&&a.oc.contains(c)?!0:!1}function ng(a,b,c,d){var e=a.g;if(null!==e){a.Hi&&(null!==a.Sc&&(a.Sc.V=null,a.Sc.ba=null),vg(a,!1));var f=!1;!1===a.gv&&(f=e.gb,e.gb=!0);var h=wg(e,b,null,function(b){return !mg(a,b)}),k=e.N;k.qe=h;var l=e.gb;e.gb=!0;var m=dg(a,k,h);if(a.oa||null!==Ef){if(null===h){var n=e.GH;null!==n&&(n(k),m=!0)}if(a.oa||null!==Ef){if(a.doDragOver(b,h),a.oa||null!==Ef){e.gb=l,m&&e.df(),!1===a.gv&&(e.gb=f),(e.Se||e.Te)&&(c||d)&&xg(e,k.hf)}}}}}function dg(a,b,c){var d=!1,e=a.Yi.length,f=0<e?a.Yi[0]:null;if(c===f){return !1}b.Tc=!1;for(var h=0;h<e;h++){var k=a.Yi[h],l=k.FH;if(null!==l&&(l(b,k,c),d=!0,b.Tc)){break}}a.Yi.length=0;if(!a.oa&&null===Ef||null===c){return d}for(b.Tc=!1;null!==c;){a.Yi.push(c),c=yg(c)}e=a.Yi.length;for(h=0;h<e&&(k=a.Yi[h],l=k.EH,null===l||(l(b,k,f),d=!0,!b.Tc)); + h++){}return d}function yg(a){var b=a.P;return null!==b?b:a instanceof G&&!(a instanceof V)&&(a=a.Sa,null!==a&&a.PG)?a:null}function zg(a,b,c){var d=a.qi;if(null===d){return null}var e=a.g.Cm(b,d.gE,function(a){return d.findValidLinkablePort(a,c)});a=u.K();for(var f=Infinity,h=null,e=e.i;e.next();){var k=e.value;if(null!==k.W){var l=k.eb(Ib,a),l=b.Lj(l);l<f&&(h=k,f=l)}}u.v(a);return h}function vg(a,b){var c=a.Sc;if(null!==c&&!(2>c.ka)){var d=a.g;if(null!==d&&!d.nb&&(d=a.qi,null!==d)){var e=null,f=null;null===c.V&&(e=zg(a,c.l(0),!1),null!==e&&(f=e.W));var h=null,k=null;null===c.ba&&(h=zg(a,c.l(c.ka-1),!0),null!==h&&(k=h.W));d.isValidLink(f,e,k,h)?b?(c.ln=c.l(0).copy(),c.pn=c.l(c.ka-1).copy(),c.kp=!1,c.V=f,null!==e&&(c.rg=e.Kd),c.ba=k,null!==h&&(c.mh=h.Kd)):Ag(d,f,e,k,h):Ag(d,null,null,null,null)}}}uf.prototype.doDragOver=function(){};function Bg(a,b){var c=a.g;if(null!==c){a.Hi&&vg(a,!0);Zf(a);var d=wg(c,b,null,function(b){return !mg(a,b)}),e=c.N;e.qe=d;if(null!==d){e.Tc=!1;for(var f=d;null!==f;){var h=f.Dz;if(null!==h&&(h(e,f),e.Tc)){break}f=yg(f)}}else{h=c.Dz,null!==h&&h(e)}if(a.oa||null!==Ef){if(a.doDropOnto(b,d),a.oa||null!==Ef){for(d=c.selection.i;d.next();){e=d.value,e instanceof U&&Cg(c,e.ca)}}}}}uf.prototype.doDropOnto=function(){};uf.prototype.doMouseMove=function(){if(this.oa){var a=this.g;if(null!==a&&null!==this.ts&&null!==this.dc){var b=!1,c=!1;this.mayCopy()?(b=!0,a.bc="copy",ig(this,!1),Df(this,this.oc),jg(this,this.oc,!1),$f(this,this.oc)):this.mayMove()?(c=!0,a.bc="default",cg(this),jg(this,this.dc,!0)):this.mayDragOut()?(a.bc="no-drop",ig(this,!1),jg(this,this.oc,!1)):cg(this);ng(this,a.N.da,c,b)}}};uf.prototype.doMouseUp=function(){if(this.oa){var a=this.g;if(null!==a){var b=!1,c=this.mayCopy();c&&null!==this.oc?(cg(this),ig(this,!0),Df(this,this.oc),jg(this,this.oc,!1),$f(this,this.oc),null!==this.oc&&a.DE(this.oc.Oi())):(b=!0,cg(this),this.mayMove()&&(jg(this,this.dc,!0),this.gv=!1,ng(this,a.N.da,!0,!1),this.gv=!0));this.Tp=!0;Bg(this,a.N.da);if(this.oa){this.oc=null;if(b&&null!==this.dc){for(b=this.dc.i;b.next();){var d=b.key;d instanceof U&&(d=d.Sa,null===d||null===d.placeholder||this.dc.contains(d)||d.aD&&d.S())}}a.pc();$f(this,this.dc);this.Af=c?"Copy":"Move";a.Ba(c?"SelectionCopied":"SelectionMoved",a.selection)}this.stopTool()}}};uf.prototype.mayCopy=function(){if(!this.MD){return !1}var a=this.g;if(null===a||a.nb||a.vf||!a.no||!a.Ij||(u.Im?!a.N.alt:!a.N.control)){return !1}for(a=a.selection.i;a.next();){var b=a.value;if(b.Hd()&&b.canCopy()){return !0}}return null!==this.Sc&&this.Hi&&this.Sc.canCopy()?!0:!1};uf.prototype.mayDragOut=function(){if(!this.MD){return !1}var a=this.g;if(null===a||!a.Bv||!a.Ij||a.Nk){return !1}for(a=a.selection.i;a.next();){var b=a.value;if(b.Hd()&&b.canCopy()){return !0}}return null!==this.Sc&&this.Hi&&this.Sc.canCopy()?!0:!1};uf.prototype.mayMove=function(){var a=this.g;if(null===a||a.nb||!a.Nk){return !1}for(a=a.selection.i;a.next();){var b=a.value;if(b.Hd()&&b.canMove()){return !0}}return null!==this.Sc&&this.Hi&&this.Sc.canMove()?!0:!1};var ag=new E(uf),Ef=null,Ff=null;uf.prototype.mayDragIn=function(){var a=this.g;if(null===a||!a.MC||a.nb||a.vf||!a.no){return !1}var b=Ef;return null===b||b.g.ha.Sk!==a.ha.Sk?!1:!0};uf.prototype.doSimulatedDragEnter=function(){if(this.mayDragIn()){var a=this.g;a.Mb.Ni();Dg(a);a=Ef;null!==a&&(a.g.bc="copy")}};uf.prototype.doSimulatedDragLeave=function(){var a=Ef;null!==a&&a.doSimulatedDragOut();this.doCancel()};uf.prototype.doSimulatedDragOver=function(){var a=this.g;if(null!==a){var b=Ef;null!==b&&null!==b.dc&&this.mayDragIn()&&(a.bc="copy",Eg(this,b.dc.Oi(),!1),jg(this,this.oc,!1),ng(this,a.N.da,!1,!0))}};uf.prototype.doSimulatedDrop=function(){var a=this.g;if(null!==a){var b=Ef;null!==b&&(b.Tp=!0,cg(this),this.mayDragIn()&&(this.Xb("Drop"),Eg(this,b.dc.Oi(),!0),jg(this,this.oc,!1),null!==this.oc&&a.DE(this.oc.Oi()),this.Af="ExternalCopy",Bg(this,a.N.da),a.pc(),this.oc=null,a.focus(),a.Ba("ExternalObjectsDropped",a.selection),this.Uj()))}};function Eg(a,b,c){if(null===a.oc){var d=a.g;if(null!==d&&!d.nb&&!d.vf){d.gb=!c;d.Ym=!c;a.Tj=d.N.da;d=d.vo(b,d,!0);c=u.Tf();hg(b,c);var e=c.x+c.width/2,f=c.y+c.height/2;u.ic(c);var h=a.iv;c=new la(G);var k=u.K();for(b=b.i;b.next();){var l=b.value;if(l.Hd()&&l.canCopy()){var m=l.location,l=d.ua(l);k.m(h.x-(e-m.x),h.y-(f-m.y));l.location=k;l.rf();c.add(l,If(k))}}u.v(k);for(d=d.i;d.next();){e=d.value,e instanceof W&&e.canCopy()&&c.add(e,If())}a.oc=c;Cf(a,c.Oi());null!==a.Sc&&(c=a.Sc,d=c.Qm,c.ml(a.Tj.x-(d.x+d.width/2),a.Tj.y-(d.y+d.height/2)))}}}uf.prototype.doSimulatedDragOut=function(){var a=this.g;null!==a&&(this.mayCopy()||this.mayMove()?a.bc="":a.bc="no-drop")};function Jf(a){this.point=a;this.IE=K.Wj}u.fa("DraggingInfo",Jf);function kg(a,b,c){this.Bc=a;this.info=b;this.MG=c}function Fg(){0<arguments.length&&u.Xc(Fg);xe.call(this);this.XB=100;this.xB=!1;var a=new W,b=new X;b.vg=!0;b.stroke="blue";a.add(b);b=new X;b.lp="Standard";b.fill="blue";b.stroke="blue";a.add(b);a.xf="Tool";this.tC=a; + a=new U;b=new X;b.Kd="";b.Fb="Rectangle";b.fill=null;b.stroke="magenta";b.jb=2;b.za=K.Vw;a.add(b);a.ql=!1;a.xf="Tool";this.rC=a;this.sC=b;a=new U;b=new X;b.Kd="";b.Fb="Rectangle";b.fill=null;b.stroke="magenta";b.jb=2;b.za=K.Vw;a.add(b);a.ql=!1;a.xf="Tool";this.uC=a;this.vC=b;this.TB=this.SB=this.OB=this.NB=this.PB=null;this.sB=!0;this.FF=new la(T,"boolean");this.YB=this.xk=this.nC=null}u.Ha(Fg,xe);u.fa("LinkingBaseTool",Fg);Fg.prototype.doStop=function(){var a=this.g;null!==a&&Kf(a);this.hh=this.gh=this.fh=this.eh=this.qc=null;this.Pw.clear();this.Sf=null};u.defineProperty(Fg,{gE:"portGravity"},function(){return this.XB},function(a){u.j(a,"number",Fg,"portGravity");0<=a&&(this.XB=a)});u.defineProperty(Fg,{Ko:"isUnconnectedLinkValid"},function(){return this.xB},function(a){u.j(a,"boolean",Fg,"isUnconnectedLinkValid");this.xB=a});u.defineProperty(Fg,{Fg:"temporaryLink"},function(){return this.tC},function(a){u.C(a,W,Fg,"temporaryLink");this.tC=a});u.defineProperty(Fg,{re:"temporaryFromNode"},function(){return this.rC},function(a){u.C(a,U,Fg,"temporaryFromNode");this.rC=a});u.defineProperty(Fg,{Sm:"temporaryFromPort"},function(){return this.sC},function(a){u.C(a,T,Fg,"temporaryFromPort");this.sC=a});u.defineProperty(Fg,{se:"temporaryToNode"},function(){return this.uC},function(a){u.C(a,U,Fg,"temporaryToNode");this.uC=a});u.defineProperty(Fg,{Tm:"temporaryToPort"},function(){return this.vC},function(a){u.C(a,T,Fg,"temporaryToPort");this.vC=a});u.defineProperty(Fg,{qc:"originalLink"},function(){return this.PB},function(a){null!==a&&u.C(a,W,Fg,"originalLink");this.PB=a});u.defineProperty(Fg,{eh:"originalFromNode"},function(){return this.NB},function(a){null!==a&&u.C(a,U,Fg,"originalFromNode");this.NB=a});u.defineProperty(Fg,{fh:"originalFromPort"},function(){return this.OB},function(a){null!==a&&u.C(a,T,Fg,"originalFromPort");this.OB=a});u.defineProperty(Fg,{gh:"originalToNode"},function(){return this.SB},function(a){null!==a&&u.C(a,U,Fg,"originalToNode");this.SB=a});u.defineProperty(Fg,{hh:"originalToPort"},function(){return this.TB},function(a){null!==a&&u.C(a,T,Fg,"originalToPort");this.TB=a});u.defineProperty(Fg,{ae:"isForwards"},function(){return this.sB},function(a){u.j(a,"boolean",Fg,"isForwards");this.sB=a});u.u(Fg,{Pw:"validPortsCache"},function(){return this.FF});u.defineProperty(Fg,{Sf:"targetPort"},function(){return this.nC},function(a){null!==a&&u.C(a,T,Fg,"targetPort");this.nC=a});Fg.prototype.copyPortProperties=function(a,b,c,d,e){if(null!==a&&null!==b&&null!==c&&null!==d){d.za=b.ca.size;e?(d.xb=b.xb,d.wl=b.wl):(d.vb=b.vb,d.Yk=b.Yk);c.af=Ib;var f=u.K();c.location=b.eb(Ib,f);u.v(f);d.angle=b.Zk();null!==this.yw&&this.yw(a,b,c,d,e)}};Fg.prototype.setNoTargetPortProperties=function(a,b,c){null!==b&&(b.za=K.Vw,b.vb=vb,b.xb=vb);null!==a&&(a.location=this.g.N.da);null!==this.yw&&this.yw(null,null,a,b,c)};Fg.prototype.doMouseDown=function(){this.oa&&this.doMouseMove()};Fg.prototype.doMouseMove=function(){if(this.oa){var a=this.g;if(null!==a){this.Sf=this.findTargetPort(this.ae);if(null!==this.Sf){var b=this.Sf.W;if(b instanceof U){this.ae?this.copyPortProperties(b,this.Sf,this.se,this.Tm,!0):this.copyPortProperties(b,this.Sf,this.re,this.Sm,!1);return}}this.ae?this.setNoTargetPortProperties(this.se,this.Tm,!0):this.setNoTargetPortProperties(this.re,this.Sm,!1);(a.Se||a.Te)&&xg(a,a.N.hf)}}};Fg.prototype.findValidLinkablePort=function(a,b){if(null===a){return null}var c=a.W;if(!(c instanceof U)){return null}for(;null!==a;){var d=b?a.OE:a.wD;if(!0===d&&(null!==a.Kd||a instanceof U)&&(b?this.isValidTo(c,a):this.isValidFrom(c,a))){return a}if(!1===d){break}a=a.P}return null};Fg.prototype.findTargetPort=function(a){var b=this.g,c=b.N.da,d=this.gE;0>=d&&(d=0.1);for(var e=this,f=b.Cm(c,d,function(b){return e.findValidLinkablePort(b,a)},null,!0),d=Infinity,b=null,f=f.i;f.next();){var h=f.value,k=h.W;if(k instanceof U){var l=h.eb(Ib,u.K()),m=c.x-l.x,n=c.y-l.y;u.v(l);l=m*m+n*n;l<d&&(m=this.Pw.ua(h),null!==m?m&&(b=h,d=l):a&&this.isValidLink(this.eh,this.fh,k,h)||!a&&this.isValidLink(k,h,this.gh,this.hh)?(this.Pw.add(h,!0),b=h,d=l):this.Pw.add(h,!1))}}return null!==b&&(c=b.W,c instanceof U&&(null===c.layer||c.layer.js))?b:null};Fg.prototype.isValidFrom=function(a,b){if(null===a||null===b){return this.Ko}if(this.g.Va===this&&(null!==a.layer&&!a.layer.js||!0!==b.wD)){return !1}var c=b.EG;if(Infinity>c){if(null!==this.qc&&a===this.eh&&b===this.fh){return !0}var d=b.Kd;null===d&&(d="");if(a.Wv(d).count>=c){return !1}}return !0};Fg.prototype.isValidTo=function(a,b){if(null===a||null===b){return this.Ko}if(this.g.Va===this&&(null!==a.layer&&!a.layer.js||!0!==b.OE)){return !1}var c=b.BI;if(Infinity>c){if(null!==this.qc&&a===this.gh&&b===this.hh){return !0}var d=b.Kd;null===d&&(d="");if(a.qg(d).count>=c){return !1}}return !0};Fg.prototype.isInSameNode=function(a,b){if(null===a||null===b){return !1}if(a===b){return !0}var c=a.W,d=b.W;return null!==c&&c===d};Fg.prototype.isLinked=function(a,b){if(null===a||null===b){return !1}var c=a.W; + if(!(c instanceof U)){return !1}var d=a.Kd;null===d&&(d="");var e=b.W;if(!(e instanceof U)){return !1}var f=b.Kd;null===f&&(f="");for(e=e.qg(f);e.next();){if(f=e.value,f.V===c&&f.rg===d){return !0}}return !1};Fg.prototype.isValidLink=function(a,b,c,d){if(!this.isValidFrom(a,b)||!this.isValidTo(c,d)||!(null===b||null===d||(b.DG&&d.AI||!this.isInSameNode(b,d))&&(b.CG&&d.zI||!this.isLinked(b,d)))||null!==this.qc&&(null!==a&&this.isLabelDependentOnLink(a,this.qc)||null!==c&&this.isLabelDependentOnLink(c,this.qc))||null!==a&&null!==c&&(null===a.data&&null!==c.data||null!==a.data&&null===c.data)||!this.isValidCycle(a,c,this.qc)){return !1}if(null!==a){var e=a.qw;if(null!==e&&!e(a,b,c,d,this.qc)){return !1}}if(null!==c&&(e=c.qw,null!==e&&!e(a,b,c,d,this.qc))){return !1}e=this.qw;return null!==e?e(a,b,c,d,this.qc):!0};Fg.prototype.isLabelDependentOnLink=function(a,b){if(null===a){return !1}var c=a.de;if(null===c){return !1}if(c===b){return !0}var d=new F(U);d.add(a);return Gg(this,c,b,d)};function Gg(a,b,c,d){if(b===c){return !0}var e=b.V;if(null!==e&&e.uf&&(d.add(e),Gg(a,e.de,c,d))){return !0}b=b.ba;return null!==b&&b.uf&&(d.add(b),Gg(a,b.de,c,d))?!0:!1}Fg.prototype.isValidCycle=function(a,b,c){void 0===c&&(c=null);if(null===a||null===b){return this.Ko}var d=this.g.GI;if(d!==Hg){if(d===Ig){if(null!==c&&!c.Ac){return !0}for(d=b.pe;d.next();){var e=d.value;if(e!==c&&e.Ac&&e.ba===b){return !1}}return !Jg(this,a,b,c,!0)}if(d===Kg){if(null!==c&&!c.Ac){return !0}for(d=a.pe;d.next();){if(e=d.value,e!==c&&e.Ac&&e.V===a){return !1}}return !Jg(this,a,b,c,!0)}if(d===Lg){return a===b?a=!0:(d=new F(U),d.add(b),a=Ug(this,d,a,b,c)),!a}if(d===Vg){return !Jg(this,a,b,c,!1)}if(d===Wg){return a===b?a=!0:(d=new F(U),d.add(b),a=Xg(this,d,a,b,c)),!a}}return !0};function Jg(a,b,c,d,e){if(b===c){return !0}if(null===b||null===c){return !1}for(var f=b.pe;f.next();){var h=f.value;if(h!==d&&(!e||h.Ac)&&h.ba===b&&(h=h.V,h!==b&&Jg(a,h,c,d,e))){return !0}}return !1}function Ug(a,b,c,d,e){if(c===d){return !0}if(null===c||null===d||b.contains(c)){return !1}b.add(c);for(var f=c.pe;f.next();){var h=f.value;if(h!==e&&h.ba===c&&(h=h.V,h!==c&&Ug(a,b,h,d,e))){return !0}}return !1}function Xg(a,b,c,d,e){if(c===d){return !0}if(null===c||null===d||b.contains(c)){return !1}b.add(c);for(var f=c.pe;f.next();){var h=f.value;if(h!==e){var k=h.V,h=h.ba,k=k===c?h:k;if(k!==c&&Xg(a,b,k,d,e)){return !0}}}return !1}u.defineProperty(Fg,{qw:"linkValidation"},function(){return this.xk},function(a){null!==a&&u.j(a,"function",Fg,"linkValidation");this.xk=a});u.defineProperty(Fg,{yw:"portTargeted"},function(){return this.YB},function(a){null!==a&&u.j(a,"function",Fg,"portTargeted");this.YB=a});function ta(){0<arguments.length&&u.Xc(ta);Fg.call(this);this.name="Linking";this.hx={};this.gx=null;this.la=Yg;this.zy=this.jC=null}u.Ha(ta,Fg);u.fa("LinkingTool",ta);var Yg;ta.Either=Yg=u.s(ta,"Either",0);var Zg;ta.ForwardsOnly=Zg=u.s(ta,"ForwardsOnly",0);var $g;ta.BackwardsOnly=$g=u.s(ta,"BackwardsOnly",0);u.defineProperty(ta,{PF:"archetypeLinkData"},function(){return this.hx},function(a){null!==a&&u.C(a,Object,ta,"archetypeLinkData");a instanceof T&&u.C(a,W,ta,"archetypeLinkData");this.hx=a});u.defineProperty(ta,{PC:"archetypeLabelNodeData"},function(){return this.gx},function(a){null!==a&&u.C(a,Object,ta,"archetypeLabelNodeData");a instanceof T&&u.C(a,U,ta,"archetypeLabelNodeData");this.gx=a});u.defineProperty(ta,{direction:"direction"},function(){return this.la},function(a){u.rb(a,ta,ta,"direction");this.la=a});u.defineProperty(ta,{ME:"startObject"},function(){return this.jC},function(a){null!==a&&u.C(a,T,ta,"startObject");this.jC=a});u.u(ta,{Mw:"startPort"},function(){return this.zy});ta.prototype.canStart=function(){if(!this.isEnabled){return !1}var a=this.g;if(null===a||a.nb||a.vf||!a.js){return !1}var b=a.ha;return(b instanceof Q||b instanceof qe)&&a.N.left&&(a.Va===this||this.isBeyondDragSize())?null!==this.findLinkablePort():!1};ta.prototype.findLinkablePort=function(){var a=this.g;if(null===a){return null}var b=this.ME;null===b&&(b=a.le(a.uc.da,null,null));if(null===b||!(b.W instanceof U)){return null}a=this.direction;if(a===Yg||a===Zg){var c=this.findValidLinkablePort(b,!1);if(null!==c){return this.ae=!0,c}}if(a===Yg||a===$g){if(c=this.findValidLinkablePort(b,!0),null!==c){return this.ae=!1,c}}return null};ta.prototype.doActivate=function(){var a=this.g;if(null!==a&&(null===this.Mw&&(this.zy=this.findLinkablePort()),null!==this.Mw)){this.Xb(this.name);a.He=!0;a.bc="pointer";if(this.ae){this.fh=this.Mw;var b=this.fh.W;b instanceof U&&(this.eh=b);this.copyPortProperties(this.eh,this.fh,this.re,this.Sm,!1)}else{this.hh=this.Mw,b=this.hh.W,b instanceof U&&(this.gh=b),this.copyPortProperties(this.gh,this.hh,this.se,this.Tm,!0)}a.add(this.re);a.add(this.se);null!==this.Fg&&(null!==this.re&&(this.Fg.V=this.re),null!==this.se&&(this.Fg.ba=this.se),this.Fg.Wb(),a.add(this.Fg));this.oa=!0}};ta.prototype.doDeactivate=function(){this.oa=!1;var a=this.g;null!==a&&(a.remove(this.Fg),a.remove(this.re),a.remove(this.se),a.He=!1,a.bc="",this.Uj()) + };ta.prototype.doStop=function(){Fg.prototype.doStop.call(this);this.ME=this.zy=null};ta.prototype.doMouseUp=function(){if(this.oa){var a=this.g;if(null===a){return}var b=this.Af=null,c=null,d=null,e=null,f=this.Sf=this.findTargetPort(this.ae);if(null!==f){var h=f.W;h instanceof U&&(this.ae?(null!==this.eh&&(b=this.eh,c=this.fh),d=h,e=f):(b=h,c=f,null!==this.gh&&(d=this.gh,e=this.hh)))}else{this.ae?null!==this.eh&&this.Ko&&(b=this.eh,c=this.fh):null!==this.gh&&this.Ko&&(d=this.gh,e=this.hh)}if(null!==b||null!==d){b=this.insertLink(b,c,d,e),null!==b?(null===f&&(this.ae?b.pn=a.N.da.copy():b.ln=a.N.da.copy()),a.qf&&a.select(b),this.Af=this.name,a.Ba("LinkDrawn",b)):a.ha.XC()}}this.stopTool()};ta.prototype.insertLink=function(a,b,c,d){var e=this.g;if(null===e){return null}var f=e.ha;if(f instanceof qe){var h=a;b=c;e.rd||(h=c,b=a);if(null!==h&&null!==b){return f.kh(b.data,f.wb(h.data)),b.Bs()}}else{if(f instanceof Q){if(h="",null!==a&&(null===b&&(b=a),h=b.Kd,null===h&&(h="")),b="",null!==c&&(null===d&&(d=c),b=d.Kd,null===b&&(b="")),d=this.PF,d instanceof W){if(nf(d),f=d.copy(),null!==f){return f.V=a,f.rg=h,f.ba=c,f.mh=b,e.add(f),a=this.PC,a instanceof U&&(nf(a),a=a.copy(),null!==a&&(a.de=f,e.add(a))),f}}else{if(null!==d&&(d=f.fD(d),u.Ta(d))){return null!==a&&f.Gw(d,f.wb(a.data)),f.bA(d,h),null!==c&&f.Iw(d,f.wb(c.data)),f.fA(d,b),f.yv(d),a=this.PC,null===a||a instanceof U||(a=f.copyNodeData(a),u.Ta(a)&&(f.om(a),a=f.wb(a),void 0!==a&&f.Ny(d,a))),f=e.pg(d)}}}}return null};function Gf(){0<arguments.length&&u.Xc(Gf);Fg.call(this);this.name="Relinking";var a=new X;a.Fb="Diamond";a.za=K.Sw;a.fill="lightblue";a.stroke="dodgerblue";a.cursor="pointer";a.Qf=0;this.gB=a;a=new X;a.Fb="Diamond";a.za=K.Sw;a.fill="lightblue";a.stroke="dodgerblue";a.cursor="pointer";a.Qf=-1;this.wC=a;this.Ub=null;this.QB=new z}u.Ha(Gf,Fg);u.fa("RelinkingTool",Gf);Gf.prototype.updateAdornments=function(a){if(null!==a&&a instanceof W){var b="RelinkFrom",c=null;if(a.$a&&!this.g.nb){var d=a.ot;null!==d&&a.canRelinkFrom()&&a.ca.I()&&a.Ia()&&d.ca.I()&&d.ll()&&(c=a.Ao(b),null===c&&(c=this.makeAdornment(d,!1),null!==c&&(c.Jc=b),a.Kk(b,c)))}null===c&&a.pl(b);b="RelinkTo";c=null;a.$a&&!this.g.nb&&(d=a.ot,null!==d&&a.canRelinkTo()&&a.ca.I()&&a.Ia()&&d.ca.I()&&d.ll()&&(c=a.Ao(b),null===c&&(c=this.makeAdornment(d,!0),null!==c&&(c.Jc=b),a.Kk(b,c))));null===c&&a.pl(b)}};Gf.prototype.makeAdornment=function(a,b){var c=new lf;c.type=ah;var d=b?this.yI:this.BG;null!==d&&c.add(d.copy());c.xc=a;return c};u.defineProperty(Gf,{BG:"fromHandleArchetype"},function(){return this.gB},function(a){null!==a&&u.C(a,T,Gf,"fromHandleArchetype");this.gB=a});u.defineProperty(Gf,{yI:"toHandleArchetype"},function(){return this.wC},function(a){null!==a&&u.C(a,T,Gf,"toHandleArchetype");this.wC=a});u.u(Gf,{handle:"handle"},function(){return this.Ub});Gf.prototype.canStart=function(){if(!this.isEnabled){return !1}var a=this.g;if(null===a||a.nb||a.vf||!a.qm){return !1}var b=a.ha;if(!(b instanceof Q||b instanceof qe)||!a.N.left){return !1}b=this.findToolHandleAt(a.uc.da,"RelinkFrom");null===b&&(b=this.findToolHandleAt(a.uc.da,"RelinkTo"));return null!==b};Gf.prototype.doActivate=function(){var a=this.g;if(null!==a){if(null===this.qc){var b=this.findToolHandleAt(a.uc.da,"RelinkFrom");null===b&&(b=this.findToolHandleAt(a.uc.da,"RelinkTo"));if(null===b){return}var c=b.W;if(!(c instanceof lf&&c.Mh instanceof W)){return}this.Ub=b;this.ae=null===c||"RelinkTo"===c.Jc;this.qc=c.Mh}this.Xb(this.name);a.He=!0;a.bc="pointer";this.fh=this.qc.qd;this.eh=this.qc.V;this.hh=this.qc.ge;this.gh=this.qc.ba;this.QB.set(this.qc.ca);null!==this.qc&&0<this.qc.ka&&(null===this.qc.V&&(null!==this.Sm&&(this.Sm.za=K.qp),null!==this.re&&(this.re.location=this.qc.l(0))),null===this.qc.ba&&(null!==this.Tm&&(this.Tm.za=K.qp),null!==this.se&&(this.se.location=this.qc.l(this.qc.ka-1))));this.copyPortProperties(this.eh,this.fh,this.re,this.Sm,!1);this.copyPortProperties(this.gh,this.hh,this.se,this.Tm,!0);a.add(this.re);a.add(this.se);null!==this.Fg&&(null!==this.re&&(this.Fg.V=this.re),null!==this.se&&(this.Fg.ba=this.se),this.copyLinkProperties(this.qc,this.Fg),this.Fg.Wb(),a.add(this.Fg));this.oa=!0}};Gf.prototype.copyLinkProperties=function(a,b){if(null!==a&&null!==b){b.gs=a.gs;b.Zy=a.Zy;var c=a.We;if(c===bh||c===ch){c=dh}b.We=c;b.Ov=a.Ov;b.Bw=a.Bw;b.ip=a.ip;b.vb=a.vb;b.Yk=a.Yk;b.Fs=a.Fs;b.Gs=a.Gs;b.xb=a.xb;b.wl=a.wl;b.xt=a.xt;b.zt=a.zt}};Gf.prototype.doDeactivate=function(){this.oa=!1;var a=this.g;null!==a&&(a.remove(this.Fg),a.remove(this.re),a.remove(this.se),a.He=!1,a.bc="",this.Uj())};Gf.prototype.doStop=function(){Fg.prototype.doStop.call(this);this.Ub=null};Gf.prototype.doMouseUp=function(){if(this.oa){var a=this.g;if(null===a){return}this.Af=null;var b=this.eh,c=this.fh,d=this.gh,e=this.hh,f=this.qc;this.Sf=this.findTargetPort(this.ae);if(null!==this.Sf){var h=this.Sf.W;h instanceof U&&(this.ae?(d=h,e=this.Sf):(b=h,c=this.Sf))}else{this.Ko?this.ae?e=d=null:c=b=null:f=null}null!==f&&(this.reconnectLink(f,this.ae?d:b,this.ae?e:c,this.ae),null===this.Sf&&(this.ae?f.pn=a.N.da.copy():f.ln=a.N.da.copy(),f.Wb()),a.qf&&(f.$a=!0),this.Af=this.name,a.Ba("LinkRelinked",f,this.ae?this.hh:this.fh)); + eh(this.qc,this.QB)}this.stopTool()};Gf.prototype.reconnectLink=function(a,b,c,d){if(null===this.g){return !1}c=null!==c&&null!==c.Kd?c.Kd:"";d?(a.ba=b,a.mh=c):(a.V=b,a.rg=c);return !0};function Ag(a,b,c,d,e){null!==b?(a.copyPortProperties(b,c,a.re,a.Sm,!1),a.g.add(a.re)):a.g.remove(a.re);null!==d?(a.copyPortProperties(d,e,a.se,a.Tm,!0),a.g.add(a.se)):a.g.remove(a.se)}function fh(){0<arguments.length&&u.Xc(fh);xe.call(this);this.name="LinkReshaping";var a=new X;a.Fb="Rectangle";a.za=K.op;a.fill="lightblue";a.stroke="dodgerblue";this.pk=a;a=new X;a.Fb="Diamond";a.za=K.op;a.fill="lightblue";a.stroke="dodgerblue";this.DB=a;this.ZB=3;this.bx=this.Ub=null;this.RB=new w;this.ny=null}u.Ha(fh,xe);u.fa("LinkReshapingTool",fh);var gh;fh.None=gh=u.s(fh,"None",0);var hh;fh.Horizontal=hh=u.s(fh,"Horizontal",1);var ih;fh.Vertical=ih=u.s(fh,"Vertical",2);var jh;fh.All=jh=u.s(fh,"All",3);fh.prototype.getReshapingBehavior=fh.prototype.BD=function(a){return a&&a.$B?a.$B:gh};fh.prototype.setReshapingBehavior=fh.prototype.rt=function(a,b){u.C(a,T,fh,"setReshapingBehavior:obj");u.rb(b,fh,fh,"setReshapingBehavior:behavior");a.$B=b};fh.prototype.updateAdornments=function(a){if(null!==a&&a instanceof W){if(a.$a&&!this.g.nb){var b=a.path;if(null!==b&&a.canReshape()&&a.ca.I()&&a.Ia()&&b.ca.I()&&b.ll()){var c=a.Ao(this.name);if(null===c||c.yF!==a.ka||c.HF!==a.jt){c=this.makeAdornment(b),null!==c&&(c.yF=a.ka,c.HF=a.jt,a.Kk(this.name,c))}if(null!==c){c.location=a.position;return}}}a.pl(this.name)}};fh.prototype.makeAdornment=function(a){var b=a.W,c=b.ka,d=b.ec,e=null;if(null!==b.points&&1<c){e=new lf;e.type=ah;var c=b.Cs,f=b.mw,h=d?1:0;if(b.jt&&b.We!==kh){for(var k=c+h;k<f-h;k++){var l=this.makeResegmentHandle(a,k);null!==l&&(l.Qf=k,l.Dw=0.5,e.add(l))}}for(k=c+1;k<f;k++){if(l=this.makeHandle(a,k),null!==l){l.Qf=k;if(k!==c){if(k===c+1&&d){var h=b.l(c),m=b.l(c+1);K.D(h.x,m.x)&&K.D(h.y,m.y)&&(m=b.l(c-1));K.D(h.x,m.x)?(this.rt(l,ih),l.cursor="n-resize"):K.D(h.y,m.y)&&(this.rt(l,hh),l.cursor="w-resize")}else{k===f-1&&d?(h=b.l(f-1),m=b.l(f),K.D(h.x,m.x)&&K.D(h.y,m.y)&&(h=b.l(f+1)),K.D(h.x,m.x)?(this.rt(l,ih),l.cursor="n-resize"):K.D(h.y,m.y)&&(this.rt(l,hh),l.cursor="w-resize")):k!==f&&(this.rt(l,jh),l.cursor="move")}}e.add(l)}}e.Jc=this.name;e.xc=a}return e};fh.prototype.makeHandle=function(){var a=this.Is;return null===a?null:a.copy()};u.defineProperty(fh,{Is:"handleArchetype"},function(){return this.pk},function(a){null!==a&&u.C(a,T,fh,"handleArchetype");this.pk=a});fh.prototype.makeResegmentHandle=function(){var a=this.BH;return null===a?null:a.copy()};u.defineProperty(fh,{BH:"midHandleArchetype"},function(){return this.DB},function(a){null!==a&&u.C(a,T,fh,"midHandleArchetype");this.DB=a});u.u(fh,{handle:"handle"},function(){return this.Ub});u.u(fh,{hs:"adornedLink"},function(){return this.bx});fh.prototype.canStart=function(){if(!this.isEnabled){return !1}var a=this.g;return null!==a&&!a.nb&&a.Dv&&a.N.left?null!==this.findToolHandleAt(a.uc.da,this.name):!1};fh.prototype.doActivate=function(){var a=this.g;if(null!==a&&(this.Ub=this.findToolHandleAt(a.uc.da,this.name),null!==this.Ub)){var b=this.Ub.W.Mh;if(b instanceof W){this.bx=b;a.He=!0;this.Xb(this.name);if(b.jt&&0.5===this.Ub.Dw){var c=b.points.copy(),d=this.Ub.eb(Ib);c.Zd(this.Ub.Qf+1,d);b.ec&&c.Zd(this.Ub.Qf+1,d);b.points=c;b.$d();this.Ub=this.findToolHandleAt(a.uc.da,this.name);if(null===this.Ub){this.doDeactivate();return}}this.RB=b.l(this.Ub.Qf);this.ny=b.points.copy();this.oa=!0}}};fh.prototype.doDeactivate=function(){this.Uj();this.bx=this.Ub=null;var a=this.g;null!==a&&(a.He=!1);this.oa=!1};fh.prototype.doCancel=function(){var a=this.hs;null!==a&&(a.points=this.ny);this.stopTool()};fh.prototype.doMouseMove=function(){var a=this.g;this.oa&&null!==a&&(a=this.computeReshape(a.N.da),this.reshape(a))};fh.prototype.doMouseUp=function(){var a=this.g;if(this.oa&&null!==a){var b=this.computeReshape(a.N.da);this.reshape(b);b=this.hs;if(null!==b&&b.jt){var c=this.handle.Qf,d=b.l(c-1),e=b.l(c),f=b.l(c+1);if(b.ec){if(c>b.Cs+1&&c<b.mw-1){var h=b.l(c-2);if(Math.abs(d.x-e.x)<this.ih&&Math.abs(d.y-e.y)<this.ih&&(lh(this,h,d,e,f,!0)||lh(this,h,d,e,f,!1))){var k=b.points.copy();lh(this,h,d,e,f,!0)?(k.Dg(c-2,new w(h.x,(f.y+h.y)/2)),k.Dg(c+1,new w(f.x,(f.y+h.y)/2))):(k.Dg(c-2,new w((f.x+h.x)/2,h.y)),k.Dg(c+1,new w((f.x+h.x)/2,f.y)));k.kd(c);k.kd(c-1);b.points=k;b.$d()}else{h=b.l(c+2),Math.abs(e.x-f.x)<this.ih&&Math.abs(e.y-f.y)<this.ih&&(lh(this,d,e,f,h,!0)||lh(this,d,e,f,h,!1))&&(k=b.points.copy(),lh(this,d,e,f,h,!0)?(k.Dg(c-1,new w(d.x,(d.y+h.y)/2)),k.Dg(c+2,new w(h.x,(d.y+h.y)/2))):(k.Dg(c-1,new w((d.x+h.x)/2,d.y)),k.Dg(c+2,new w((d.x+h.x)/2,h.y))),k.kd(c+1),k.kd(c),b.points=k,b.$d())}}}else{h=u.K(),K.Lm(d.x,d.y,f.x,f.y,e.x,e.y,h)&&h.Lj(e)<this.ih*this.ih&&(k=b.points.copy(),k.kd(c),b.points=k,b.$d()),u.v(h)}}a.pc();this.Af=this.name;a.Ba("LinkReshaped",this.hs)}this.stopTool()};function lh(a,b,c,d,e,f){return f?Math.abs(b.y-c.y)<a.ih&&Math.abs(c.y-d.y)<a.ih&&Math.abs(d.y-e.y)<a.ih:Math.abs(b.x-c.x)<a.ih&&Math.abs(c.x-d.x)<a.ih&&Math.abs(d.x-e.x)<a.ih + }u.defineProperty(fh,{ih:"resegmentingDistance"},function(){return this.ZB},function(a){u.j(a,"number",fh,"resegmentingDistance");this.ZB=a});fh.prototype.reshape=function(a){var b=this.hs;b.sl();var c=this.handle.Qf,d=this.BD(this.handle);if(b.ec){if(c===b.Cs+1){c=b.Cs+1,d===ih?(b.U(c,b.l(c-1).x,a.y),b.U(c+1,b.l(c+2).x,a.y)):d===hh&&(b.U(c,a.x,b.l(c-1).y),b.U(c+1,a.x,b.l(c+2).y))}else{if(c===b.mw-1){c=b.mw-1,d===ih?(b.U(c-1,b.l(c-2).x,a.y),b.U(c,b.l(c+1).x,a.y)):d===hh&&(b.U(c-1,a.x,b.l(c-2).y),b.U(c,a.x,b.l(c+1).y))}else{var d=c,e=b.l(d),f=b.l(d-1),h=b.l(d+1);K.D(f.x,e.x)&&K.D(e.y,h.y)?(K.D(f.x,b.l(d-2).x)&&!K.D(f.y,b.l(d-2).y)?(b.w(d,a.x,f.y),c++,d++):b.U(d-1,a.x,f.y),K.D(h.y,b.l(d+2).y)&&!K.D(h.x,b.l(d+2).x)?b.w(d+1,h.x,a.y):b.U(d+1,h.x,a.y)):K.D(f.y,e.y)&&K.D(e.x,h.x)?(K.D(f.y,b.l(d-2).y)&&!K.D(f.x,b.l(d-2).x)?(b.w(d,f.x,a.y),c++,d++):b.U(d-1,f.x,a.y),K.D(h.x,b.l(d+2).x)&&!K.D(h.y,b.l(d+2).y)?b.w(d+1,a.x,h.y):b.U(d+1,a.x,h.y)):K.D(f.x,e.x)&&K.D(e.x,h.x)?(K.D(f.x,b.l(d-2).x)&&!K.D(f.y,b.l(d-2).y)?(b.w(d,a.x,f.y),c++,d++):b.U(d-1,a.x,f.y),K.D(h.x,b.l(d+2).x)&&!K.D(h.y,b.l(d+2).y)?b.w(d+1,a.x,h.y):b.U(d+1,a.x,h.y)):K.D(f.y,e.y)&&K.D(e.y,h.y)&&(K.D(f.y,b.l(d-2).y)&&!K.D(f.x,b.l(d-2).x)?(b.w(d,f.x,a.y),c++,d++):b.U(d-1,f.x,a.y),K.D(h.y,b.l(d+2).y)&&!K.D(h.x,b.l(d+2).x)?b.w(d+1,h.x,a.y):b.U(d+1,h.x,a.y));b.U(c,a.x,a.y)}}}else{b.U(c,a.x,a.y),1===c&&b.computeSpot(!0).oe()&&(e=b.V,f=b.qd,null===e||e.Ia()||(e=e.findVisibleNode(),e!==b.V&&(f=e.Xk(""))),d=f.eb(Ib,u.K()),e=b.getLinkPointFromPoint(e,f,d,a,!0,u.K()),b.U(0,e.x,e.y),u.v(d),u.v(e)),c===b.ka-2&&b.computeSpot(!1).oe()&&(c=b.ba,e=b.ge,null===c||c.Ia()||(c=c.findVisibleNode(),c!==b.ba&&(e=c.Xk(""))),d=e.eb(Ib,u.K()),e=b.getLinkPointFromPoint(c,e,d,a,!1,u.K()),b.U(b.ka-1,e.x,e.y),u.v(d),u.v(e))}b.Ci()};fh.prototype.computeReshape=function(a){var b=this.hs,c=this.handle.Qf;switch(this.BD(this.handle)){case jh:return a;case ih:return b=b.l(c),new w(b.x,a.y);case hh:return b=b.l(c),new w(a.x,b.y);default:case gh:return b.l(c)}};u.u(fh,{kK:"originalPoint"},function(){return this.RB});u.u(fh,{lK:"originalPoints"},function(){return this.ny});function mh(){0<arguments.length&&u.Xc(mh);xe.call(this);this.name="Resizing";this.nj=(new ia(1,1)).freeze();this.lj=(new ia(9999,9999)).freeze();this.Ti=(new ia(NaN,NaN)).freeze();this.kq=!1;this.Gb=null;var a=new X;a.Hj=Ib;a.Fb="Rectangle";a.za=K.op;a.fill="lightblue";a.stroke="dodgerblue";a.jb=1;a.cursor="pointer";this.pk=a;this.Ub=null;this.Vu=new ia;this.my=new w;this.Lx=new ia(0,0);this.Kx=new ia(Infinity,Infinity);this.Jx=new ia(1,1);this.KB=!0}u.Ha(mh,xe);u.fa("ResizingTool",mh);mh.prototype.updateAdornments=function(a){if(!(null===a||a instanceof W)){if(a.$a&&!this.g.nb){var b=a.tE;if(null!==b&&a.canResize()&&a.ca.I()&&a.Ia()&&b.ca.I()&&b.ll()){var c=a.Ao(this.name);null===c&&(c=this.makeAdornment(b));if(null!==c){var d=b.Zk();c.angle=d;var e=b.eb(c.af,u.K()),f=b.Ii();c.location=e;u.v(e);e=c.placeholder;if(null!==e){var b=b.Ja,h=u.vl();h.m(b.width*f,b.height*f);e.za=h;u.Oj(h)}nh(this,c,d);a.Kk(this.name,c);return}}}a.pl(this.name)}};mh.prototype.makeAdornment=function(a){var b=null,b=a.W.sE;if(null===b){b=new lf;b.type=oh;b.af=Ib;var c=new ph;c.vg=!0;b.add(c);b.add(this.makeHandle(a,xb));b.add(this.makeHandle(a,Gb));b.add(this.makeHandle(a,Vb));b.add(this.makeHandle(a,Qb));b.add(this.makeHandle(a,vc));b.add(this.makeHandle(a,xc));b.add(this.makeHandle(a,Cc));b.add(this.makeHandle(a,wc))}else{if(nf(b),b=b.copy(),null===b){return null}}b.Jc=this.name;b.xc=a;return b};mh.prototype.makeHandle=function(a,b){var c=this.Is;if(null===c){return null}c=c.copy();c.alignment=b;return c};function nh(a,b,c){if(null!==b){if(!b.alignment.Kc()&&""!==b.cursor){a:{a=b.alignment;a.oe()&&(a=Ib);if(0>=a.x){c=0>=a.y?c+225:1<=a.y?c+135:c+180}else{if(1<=a.x){0>=a.y?c+=315:1<=a.y&&(c+=45)}else{if(0>=a.y){c+=270}else{if(1<=a.y){c+=90}else{break a}}}}0>c?c+=360:360<=c&&(c-=360);b.cursor=22.5>c?"e-resize":67.5>c?"se-resize":112.5>c?"s-resize":157.5>c?"sw-resize":202.5>c?"w-resize":247.5>c?"nw-resize":292.5>c?"n-resize":337.5>c?"ne-resize":"e-resize"}}else{if(b instanceof B){for(b=b.elements;b.next();){nh(a,b.value,c)}}}}}u.defineProperty(mh,{Is:"handleArchetype"},function(){return this.pk},function(a){null!==a&&u.C(a,T,mh,"handleArchetype");this.pk=a});u.u(mh,{handle:"handle"},function(){return this.Ub});u.defineProperty(mh,{xc:"adornedObject"},function(){return this.Gb},function(a){null!==a&&u.C(a,T,mh,"adornedObject");this.Gb=a});mh.prototype.canStart=function(){if(!this.isEnabled){return !1}var a=this.g;return null!==a&&!a.nb&&a.ks&&a.N.left?null!==this.findToolHandleAt(a.uc.da,this.name)?!0:!1:!1};mh.prototype.doActivate=function(){var a=this.g;null!==a&&(this.Ub=this.findToolHandleAt(a.uc.da,this.name),null!==this.Ub&&(this.Gb=this.Ub.W.xc,this.my.set(this.Gb.W.location),this.Vu.set(this.Gb.za),this.Jx=this.computeCellSize(),this.Lx=this.computeMinSize(),this.Kx=this.computeMaxSize(),a.He=!0,this.KB=a.Mb.isEnabled,a.Mb.isEnabled=!1,this.Xb(this.name),this.oa=!0)) + };mh.prototype.doDeactivate=function(){var a=this.g;null!==a&&(this.Uj(),this.Gb=this.Ub=null,this.oa=a.He=!1,a.Mb.isEnabled=this.KB)};mh.prototype.doCancel=function(){this.Gb.za=this.Vu;this.Gb.W.location=this.my;this.stopTool()};mh.prototype.doMouseMove=function(){var a=this.g;if(this.oa&&null!==a){var b=this.Lx,c=this.Kx,d=this.Jx,e=this.Gb.AD(a.N.da,u.K()),f=qh;this.Gb instanceof X&&(f=rh(this.Gb));b=this.computeResize(e,this.Ub.alignment,b,c,d,!(f===sh||f===th||a.N.shift));this.resize(b);a.df();u.v(e)}};mh.prototype.doMouseUp=function(){var a=this.g;if(this.oa&&null!==a){var b=this.Lx,c=this.Kx,d=this.Jx,e=this.Gb.AD(a.N.da,u.K()),f=qh;this.Gb instanceof X&&(f=rh(this.Gb));b=this.computeResize(e,this.Ub.alignment,b,c,d,!(f===sh||f===th||a.N.shift));this.resize(b);u.v(e);a.pc();this.Af=this.name;a.Ba("PartResized",this.Gb,this.Vu)}this.stopTool()};mh.prototype.resize=function(a){if(null!==this.g){var b=this.xc,c=b.W,d=b.Zk(),e=b.Ii(),f=Math.PI*d/180,h=Math.cos(f),f=Math.sin(f),k=0<d&&180>d?1:0,l=90<d&&270>d?1:0,d=180<d&&360>d?1:0,m=b.Ja.width,n=b.Ja.height;b.za=a.size;var p=c.position.copy();c.rf();m=b.Ja.width-m;n=b.Ja.height-n;if(0!==m||0!==n){0!==m&&(p.x+=e*((a.x+m*l)*h-(a.y+n*k)*f)),0!==n&&(p.y+=e*((a.x+m*d)*f+(a.y+n*l)*h)),c.move(p),c instanceof U&&c.$e()}}};mh.prototype.computeResize=function(a,b,c,d,e,f){b.oe()&&(b=Ib);var h=this.xc.Ja,k=h.x,l=h.y,m=h.x+h.width,n=h.y+h.height,p=1;if(!f){var p=h.width,q=h.height;0>=p&&(p=1);0>=q&&(q=1);p=q/p}q=u.K();K.ys(a.x,a.y,k,l,e.width,e.height,q);a=h.copy();0>=b.x?0>=b.y?(a.x=Math.max(q.x,m-d.width),a.x=Math.min(a.x,m-c.width),a.width=Math.max(m-a.x,c.width),a.y=Math.max(q.y,n-d.height),a.y=Math.min(a.y,n-c.height),a.height=Math.max(n-a.y,c.height),f||(b=a.height/a.width,p<b?(a.height=p*a.width,a.y=n-a.height):(a.width=a.height/p,a.x=m-a.width))):1<=b.y?(a.x=Math.max(q.x,m-d.width),a.x=Math.min(a.x,m-c.width),a.width=Math.max(m-a.x,c.width),a.height=Math.max(Math.min(q.y-l,d.height),c.height),f||(b=a.height/a.width,p<b?a.height=p*a.width:(a.width=a.height/p,a.x=m-a.width))):(a.x=Math.max(q.x,m-d.width),a.x=Math.min(a.x,m-c.width),a.width=m-a.x,f||(a.height=p*a.width,a.y=l+0.5*(n-l-a.height))):1<=b.x?0>=b.y?(a.width=Math.max(Math.min(q.x-k,d.width),c.width),a.y=Math.max(q.y,n-d.height),a.y=Math.min(a.y,n-c.height),a.height=Math.max(n-a.y,c.height),f||(b=a.height/a.width,p<b?(a.height=p*a.width,a.y=n-a.height):a.width=a.height/p)):1<=b.y?(a.width=Math.max(Math.min(q.x-k,d.width),c.width),a.height=Math.max(Math.min(q.y-l,d.height),c.height),f||(b=a.height/a.width,p<b?a.height=p*a.width:a.width=a.height/p)):(a.width=Math.max(Math.min(q.x-k,d.width),c.width),f||(a.height=p*a.width,a.y=l+0.5*(n-l-a.height))):0>=b.y?(a.y=Math.max(q.y,n-d.height),a.y=Math.min(a.y,n-c.height),a.height=n-a.y,f||(a.width=a.height/p,a.x=k+0.5*(m-k-a.width))):1<=b.y&&(a.height=Math.max(Math.min(q.y-l,d.height),c.height),f||(a.width=a.height/p,a.x=k+0.5*(m-k-a.width)));u.v(q);return a};mh.prototype.computeMinSize=function(){var a=this.xc.xg.copy(),b=this.xg;!isNaN(b.width)&&b.width>a.width&&(a.width=b.width);!isNaN(b.height)&&b.height>a.height&&(a.height=b.height);return a};mh.prototype.computeMaxSize=function(){var a=this.xc.cf.copy(),b=this.cf;!isNaN(b.width)&&b.width<a.width&&(a.width=b.width);!isNaN(b.height)&&b.height<a.height&&(a.height=b.height);return a};mh.prototype.computeCellSize=function(){var a=new ia(NaN,NaN),b=this.xc.W;if(null!==b){var c=b.XH;!isNaN(c.width)&&0<c.width&&(a.width=c.width);!isNaN(c.height)&&0<c.height&&(a.height=c.height)}c=this.so;isNaN(a.width)&&!isNaN(c.width)&&0<c.width&&(a.width=c.width);isNaN(a.height)&&!isNaN(c.height)&&0<c.height&&(a.height=c.height);b=this.g;(isNaN(a.width)||isNaN(a.height))&&b&&(c=b.tb.Gd,null!==c&&c.hw&&(c=c.DD,isNaN(a.width)&&!isNaN(c.width)&&0<c.width&&(a.width=c.width),isNaN(a.height)&&!isNaN(c.height)&&0<c.height&&(a.height=c.height)),b=b.Hs,null!==b&&b.visible&&this.hw&&(c=b.aw,isNaN(a.width)&&!isNaN(c.width)&&0<c.width&&(a.width=c.width),isNaN(a.height)&&!isNaN(c.height)&&0<c.height&&(a.height=c.height)));if(isNaN(a.width)||0===a.width||Infinity===a.width){a.width=1}if(isNaN(a.height)||0===a.height||Infinity===a.height){a.height=1}return a};u.defineProperty(mh,{xg:"minSize"},function(){return this.nj},function(a){u.C(a,ia,mh,"minSize");if(!this.nj.L(a)){var b=a.width;isNaN(b)&&(b=0);a=a.height;isNaN(a)&&(a=0);this.nj.m(b,a)}});u.defineProperty(mh,{cf:"maxSize"},function(){return this.lj},function(a){u.C(a,ia,mh,"maxSize");if(!this.lj.L(a)){var b=a.width;isNaN(b)&&(b=Infinity);a=a.height;isNaN(a)&&(a=Infinity);this.lj.m(b,a)}});u.defineProperty(mh,{so:"cellSize"},function(){return this.Ti},function(a){u.C(a,ia,mh,"cellSize");this.Ti.L(a)||this.Ti.assign(a)});u.defineProperty(mh,{hw:"isGridSnapEnabled"},function(){return this.kq},function(a){u.j(a,"boolean",mh,"isGridSnapEnabled");this.kq=a});u.u(mh,{iK:"originalDesiredSize"},function(){return this.Vu});u.u(mh,{jK:"originalLocation"},function(){return this.my});function uh(){0<arguments.length&&u.Xc(uh); + xe.call(this);this.name="Rotating";this.gC=45;this.fC=2;this.Gb=null;var a=new X;a.Fb="Ellipse";a.za=K.Sw;a.fill="lightblue";a.stroke="dodgerblue";a.jb=1;a.cursor="pointer";this.pk=a;this.Ub=null;this.Uu=0;this.aC=new w}u.Ha(uh,xe);u.fa("RotatingTool",uh);uh.prototype.updateAdornments=function(a){if(!(null===a||a instanceof W)){if(a.$a&&!this.g.nb){var b=a.wE;if(null!==b&&a.canRotate()&&a.ca.I()&&a.Ia()&&b.ca.I()&&b.ll()){var c=a.Ao(this.name);null===c&&(c=this.makeAdornment(b));if(null!==c){c.angle=b.Zk();var d=null,e=null;b===a||b===a.fc?(d=a.fc,e=a.af):(d=b,e=Ib);for(var f=d.Ja,e=u.Yb(f.width*e.x+e.offsetX,f.height*e.y+e.offsetY);null!==d&&d!==b;){d.transform.bb(e),d=d.P}var d=e.y,f=Math.max(e.x-b.Ja.width,0),h=u.K();c.location=b.eb(new L(1,0,50+f,d),h);u.v(h);u.v(e);a.Kk(this.name,c);return}}}a.pl(this.name)}};uh.prototype.makeAdornment=function(a){var b=null,b=a.W.$H;if(null===b){b=new lf;b.type=vh;b.af=Ib;var c=this.Is;null!==c&&b.add(c.copy())}else{if(nf(b),b=b.copy(),null===b){return null}}b.Jc=this.name;b.xc=a;return b};u.defineProperty(uh,{Is:"handleArchetype"},function(){return this.pk},function(a){null!==a&&u.C(a,T,uh,"handleArchetype");this.pk=a});u.u(uh,{handle:"handle"},function(){return this.Ub});u.defineProperty(uh,{xc:"adornedObject"},function(){return this.Gb},function(a){null!==a&&u.C(a,T,uh,"adornedObject");this.Gb=a});uh.prototype.canStart=function(){if(!this.isEnabled){return !1}var a=this.g;return null!==a&&!a.nb&&a.Ev&&a.N.left?null!==this.findToolHandleAt(a.uc.da,this.name)?!0:!1:!1};uh.prototype.doActivate=function(){var a=this.g;if(null!==a&&(this.Ub=this.findToolHandleAt(a.uc.da,this.name),null!==this.Ub)){this.Gb=this.Ub.W.xc;var b=this.Gb.W,c=b.fc;this.aC=this.Gb===b||this.Gb===c?c.eb(b.af):this.Gb.eb(Ib);this.Uu=this.Gb.angle;a.He=!0;a.bz=!0;this.Xb(this.name);this.oa=!0}};uh.prototype.doDeactivate=function(){var a=this.g;null!==a&&(this.Uj(),this.Gb=this.Ub=null,this.oa=a.He=!1)};uh.prototype.doCancel=function(){var a=this.g;null!==a&&(a.bz=!1);this.rotate(this.Uu);this.stopTool()};uh.prototype.doMouseMove=function(){var a=this.g;this.oa&&null!==a&&(a=this.computeRotate(a.N.da),this.rotate(a))};uh.prototype.doMouseUp=function(){var a=this.g;if(this.oa&&null!==a){a.bz=!1;var b=this.computeRotate(a.N.da);this.rotate(b);a.pc();this.Af=this.name;a.Ba("PartRotated",this.Gb,this.Uu)}this.stopTool()};uh.prototype.rotate=function(a){null!==this.Gb&&(this.Gb.angle=a)};uh.prototype.computeRotate=function(a){a=this.aC.Gi(a);var b=this.Gb.P;null!==b&&(a-=b.Zk(),360<=a?a-=360:0>a&&(a+=360));var b=Math.min(Math.abs(this.oI),180),c=Math.min(Math.abs(this.nI),b/2);!this.g.N.shift&&0<b&&0<c&&(a%b<c?a=Math.floor(a/b)*b:a%b>b-c&&(a=(Math.floor(a/b)+1)*b));360<=a?a-=360:0>a&&(a+=360);return a};u.defineProperty(uh,{oI:"snapAngleMultiple"},function(){return this.gC},function(a){u.j(a,"number",uh,"snapAngleMultiple");this.gC=a});u.defineProperty(uh,{nI:"snapAngleEpsilon"},function(){return this.fC},function(a){u.j(a,"number",uh,"snapAngleEpsilon");this.fC=a});u.u(uh,{hK:"originalAngle"},function(){return this.Uu});function wh(){0<arguments.length&&u.Xc(wh);xe.call(this);this.name="ClickSelecting"}u.Ha(wh,xe);u.fa("ClickSelectingTool",wh);wh.prototype.canStart=function(){return !this.isEnabled||null===this.g||this.isBeyondDragSize()?!1:!0};wh.prototype.doMouseUp=function(){this.oa&&(this.standardMouseSelect(),this.standardMouseClick());this.stopTool()};function xh(){0<arguments.length&&u.Xc(xh);xe.call(this);this.name="Action";this.Xm=null}u.Ha(xh,xe);u.fa("ActionTool",xh);xh.prototype.canStart=function(){if(!this.isEnabled){return !1}var a=this.g;if(null===a){return !1}var b=a.N,c=a.le(b.da,function(a){for(;null!==a.P&&!a.qz;){a=a.P}return a});if(null!==c){if(!c.qz){return !1}this.Xm=c;a.gn=a.le(b.da,null,null);return !0}return !1};xh.prototype.doMouseDown=function(){if(this.oa){var a=this.g.N,b=this.Xm;null!==b&&(a.qe=b,null!==b.HC&&b.HC(a,b))}else{this.canStart()&&this.doActivate()}};xh.prototype.doMouseMove=function(){if(this.oa){var a=this.g.N,b=this.Xm;null!==b&&(a.qe=b,null!==b.IC&&b.IC(a,b))}};xh.prototype.doMouseUp=function(){if(this.oa){var a=this.g,b=a.N,c=this.Xm;if(null===c){return}b.qe=c;null!==c.JC&&c.JC(b,c);this.isBeyondDragSize()||zf(c,b,a)}this.stopTool()};xh.prototype.doCancel=function(){var a=this.g;if(null!==a){var a=a.N,b=this.Xm;if(null===b){return}a.qe=b;null!==b.GC&&b.GC(a,b)}this.stopTool()};xh.prototype.doStop=function(){this.Xm=null};function va(){0<arguments.length&&u.Xc(va);xe.call(this);this.name="ClickCreating";this.ik=null;this.qB=!0;this.fB=new w(0,0)}u.Ha(va,xe);u.fa("ClickCreatingTool",va);va.prototype.canStart=function(){if(!this.isEnabled||null===this.Qy){return !1}var a=this.g;if(null===a||a.nb||a.vf||!a.no||!a.N.left||this.isBeyondDragSize()){return !1}if(this.$G){if(1===a.N.Ue&&(this.fB=a.N.hf.copy()),2!==a.N.Ue||this.isBeyondDragSize(this.fB)){return !1}}else{if(1!==a.N.Ue){return !1}}return a.Va!==this&&null!==a.As(a.N.da,!0)?!1:!0};va.prototype.doMouseUp=function(){var a=this.g; + this.oa&&null!==a&&this.insertPart(a.N.da);this.stopTool()};va.prototype.insertPart=function(a){var b=this.g;if(null===b){return null}var c=this.Qy;if(null===c){return null}this.Xb(this.name);var d=null;c instanceof G?c.Hd()&&(nf(c),d=c.copy(),null!==d&&b.add(d)):null!==c&&(c=b.ha.copyNodeData(c),u.Ta(c)&&(b.ha.om(c),d=b.Ph(c)));null!==d&&(d.location=a,b.qf&&b.select(d));b.pc();this.Af=this.name;b.Ba("PartCreated",d);this.Uj();return d};u.defineProperty(va,{Qy:"archetypeNodeData"},function(){return this.ik},function(a){null!==a&&u.C(a,Object,va,"archetypeNodeData");this.ik=a});u.defineProperty(va,{$G:"isDoubleClick"},function(){return this.qB},function(a){u.j(a,"boolean",va,"isDoubleClick");this.qB=a});function yh(a,b,c){this.text=a;this.ZC=b;this.visible=c}function Ih(){0<arguments.length&&u.Xc(Ih);xe.call(this);this.name="ContextMenu";this.hn=this.OA=null;this.HB=new w;this.zx=this.qn=null;Jh(this)}u.Ha(Ih,xe);u.fa("ContextMenuTool",Ih);u.iD=!1;u.os=null;u.ps=null;function Jh(a){a.qn=new lf;a.xC=function(){a.stopTool()};if(!1===u.iD){var b=u.createElement("div"),c=u.createElement("div");b.style.cssText="top: 0px;z-index:300;position: fixed;display: none;text-align: center;left: 25%;width: 50%;background-color: #F5F5F5;padding: 16px;border: 16px solid #444;border-radius: 10px;margin-top: 10px";c.style.cssText="z-index:299;position: fixed;display: none;top: 0;left: 0;width: 100%;height: 100%;background-color: black;-moz-opacity: 0.8;opacity:.80;filter: alpha(opacity=80);";var d=u.createElement("style");window.document.getElementsByTagName("head")[0].appendChild(d);d.sheet.insertRule(".defaultCXul { list-style: none; }",0);d.sheet.insertRule(".defaultCXli {font:700 1.5em Helvetica, Arial, sans-serif;position: relative;min-width: 60px; }",0);d.sheet.insertRule(".defaultCXa {color: #444;display: inline-block;padding: 4px;text-decoration: none;margin: 2px;border: 1px solid gray;border-radius: 10px; }",0);b.addEventListener("contextmenu",function(a){a.preventDefault();return !1},!1);b.addEventListener("selectstart",function(a){a.preventDefault();return !1},!1);c.addEventListener("contextmenu",function(a){a.preventDefault();return !1},!1);window.document.body&&(window.document.body.appendChild(b),window.document.body.appendChild(c));u.ps=b;u.os=c;u.iD=!0}}Ih.prototype.canStart=function(){if(!this.isEnabled){return !1}var a=this.g;return null===a||this.isBeyondDragSize()||!a.N.right?!1:null!==this.qn&&a.N.kl||null!==this.findObjectWithContextMenu()?!0:!1};Ih.prototype.doStart=function(){var a=this.g;null!==a&&this.HB.set(a.uc.da)};Ih.prototype.doStop=function(){this.hideDefaultContextMenu();this.hideContextMenu();this.hn=null};Ih.prototype.findObjectWithContextMenu=function(a){void 0===a&&(a=null);var b=this.g;if(null===b){return null}var c=b.N,d=null;a instanceof D||(d=a instanceof T?a:b.le(c.da,null,function(a){return !a.layer.zc}));if(null!==d){for(a=d;null!==a;){c=a.contextMenu;if(null!==c){return a}a=a.P}if(null!==this.qn&&b.N.kl){return d.W}}else{if(c=b.contextMenu,null!==c){return b}}return null};Ih.prototype.doActivate=function(){};Ih.prototype.doMouseUp=function(){var a=this.g;null!==a&&(this.oa?null!==this.If&&(a=a.le(a.N.da,null,null),null!==a&&a.gl(this.If)&&this.standardMouseClick(null,null),this.stopTool()):this.canStart()&&xf(this,!0))};function xf(a,b,c){void 0===c&&(c=null);a.oa=!0;b&&a.standardMouseSelect();a.standardMouseClick();a.hn=null;null===c&&(c=a.findObjectWithContextMenu());null!==c?(b=c.contextMenu,null!==b?(a.hn=c instanceof T?c:null,a.showContextMenu(b,a.hn)):a.showDefaultContextMenu()):a.showDefaultContextMenu()}Ih.prototype.doMouseMove=function(){this.oa&&this.standardMouseOver()};Ih.prototype.showContextMenu=function(a,b){u.C(a,lf,Ih,"showContextMenu:contextmenu");null!==b&&u.C(b,T,Ih,"showContextMenu:obj");var c=this.g;if(null!==c){a!==this.If&&this.hideContextMenu();a.xf="Tool";a.ql=!1;a.scale=1/c.scale;a.Jc=this.name;c.add(a);if(null!==b){var c=null,d=b.Co();null!==d&&(c=d.data);a.xc=b;a.data=c}else{a.data=c.ha}a.rf();this.positionContextMenu(a,b);this.If=a}};Ih.prototype.positionContextMenu=function(a){if(null===a.placeholder){var b=this.g;if(null!==b){var c=b.N.da.copy(),d=a.Ca,e=b.ob;b.N.kl&&(c.x-=d.width);c.x+d.width>e.right&&(c.x-=d.width+5);c.x<e.x&&(c.x=e.x);c.y+d.height>e.bottom&&(c.y-=d.height+5);c.y<e.y&&(c.y=e.y);a.position=c}}};Ih.prototype.hideContextMenu=function(){var a=this.g;null!==a&&null!==this.If&&(this.If.data=null,this.If.xc=null,a.remove(this.If),this.If=null,this.standardMouseOver())};Ih.prototype.initializeDefaultButtons=function(){if(null===this.g){return null}var a=new E(yh);a.add(new yh("Copy",function(a){a.Eb.copySelection()},function(a){return a.Eb.canCopySelection()}));a.add(new yh("Cut",function(a){a.Eb.cutSelection()},function(a){return a.Eb.canCutSelection()}));a.add(new yh("Delete",function(a){a.Eb.deleteSelection()},function(a){return a.Eb.canDeleteSelection()}));a.add(new yh("Paste",function(a){a.Eb.pasteSelection(a.N.da)},function(a){return a.Eb.canPasteSelection() + }));a.add(new yh("Select All",function(a){a.Eb.selectAll()},function(a){return a.Eb.canSelectAll()}));a.add(new yh("Undo",function(a){a.Eb.undo()},function(a){return a.Eb.canUndo()}));a.add(new yh("Redo",function(a){a.Eb.redo()},function(a){return a.Eb.canRedo()}));a.add(new yh("Zoom To Fit",function(a){a.Eb.zoomToFit()},function(a){return a.Eb.canZoomToFit()}));a.add(new yh("Reset Zoom",function(a){a.Eb.resetZoom()},function(a){return a.Eb.canResetZoom()}));a.add(new yh("Group Selection",function(a){a.Eb.groupSelection()},function(a){return a.Eb.canGroupSelection()}));a.add(new yh("Ungroup Selection",function(a){a.Eb.ungroupSelection()},function(a){return a.Eb.canUngroupSelection()}));a.add(new yh("Edit Text",function(a){a.Eb.editTextBlock()},function(a){return a.Eb.canEditTextBlock()}));return a};Ih.prototype.showDefaultContextMenu=function(){var a=this.g;if(null!==a){null===this.zx&&(this.zx=this.initializeDefaultButtons());this.qn!==this.If&&this.hideContextMenu();u.ps.innerHTML="";u.os.addEventListener("click",this.xC,!1);var b=this,c=u.createElement("ul");c.className="defaultCXul";u.ps.appendChild(c);c.innerHTML="";for(var d=this.zx.i;d.next();){var e=d.value,f=e.text,h=e.visible;if("function"===typeof e.ZC&&("function"!==typeof h||h(a))){h=u.createElement("li");h.className="defaultCXli";var k=u.createElement("a");k.className="defaultCXa";k.href="#";k.nF=e.ZC;k.addEventListener("click",function(c){this.nF(a);b.stopTool();c.preventDefault();return !1},!1);k.textContent=f;h.appendChild(k);c.appendChild(h)}}u.ps.style.display="block";u.os.style.display="block";this.If=this.qn}};Ih.prototype.hideDefaultContextMenu=function(){null!==this.If&&this.If===this.qn&&(u.ps.style.display="none",u.os.style.display="none",u.os.removeEventListener("click",this.xC,!1),this.If=null)};u.defineProperty(Ih,{If:"currentContextMenu"},function(){return this.OA},function(a){null!==a&&u.C(a,lf,Ih,"currentContextMenu");this.OA=a});u.defineProperty(Ih,{lJ:"currentObject"},function(){return this.hn},function(a){null!==a&&u.C(a,T,Ih,"currentObject");this.hn=a});u.u(Ih,{cK:"mouseDownPoint"},function(){return this.HB});function Kh(){0<arguments.length&&u.Xc(Kh);xe.call(this);this.name="DragSelecting";this.rn=175;this.vB=!1;var a=new G;a.xf="Tool";a.ql=!1;var b=new X;b.name="SHAPE";b.Fb="Rectangle";b.fill=null;b.stroke="magenta";a.add(b);this.Dl=a}u.Ha(Kh,xe);u.fa("DragSelectingTool",Kh);Kh.prototype.canStart=function(){if(!this.isEnabled){return !1}var a=this.g;if(null===a||!a.qf){return !1}var b=a.N;return !b.left||a.Va!==this&&(!this.isBeyondDragSize()||b.timestamp-a.uc.timestamp<this.jD||null!==a.As(b.da,!0))?!1:!0};Kh.prototype.doActivate=function(){var a=this.g;null!==a&&(this.oa=!0,a.He=!0,a.gb=!0,a.add(this.Vg),this.doMouseMove())};Kh.prototype.doDeactivate=function(){var a=this.g;null!==a&&(a.remove(this.Vg),a.gb=!1,this.oa=a.He=!1)};Kh.prototype.doMouseMove=function(){if(null!==this.g&&this.oa&&null!==this.Vg){var a=this.computeBoxBounds(),b=this.Vg.ke("SHAPE");null===b&&(b=this.Vg.Jf());b.za=a.size;this.Vg.position=a.position}};Kh.prototype.doMouseUp=function(){if(this.oa){var a=this.g;a.remove(this.Vg);try{a.bc="wait",this.selectInRect(this.computeBoxBounds())}finally{a.bc=""}}this.stopTool()};Kh.prototype.computeBoxBounds=function(){var a=this.g;return null===a?new z(0,0,0,0):new z(a.uc.da,a.N.da)};Kh.prototype.selectInRect=function(a){var b=this.g;if(null!==b){var c=b.N;b.Ba("ChangingSelection");a=b.Nj(a,null,function(a){return a instanceof G?a.canSelect():!1},this.hH);if(u.Im?c.Zs:c.control){if(c.shift){for(a=a.i;a.next();){c=a.value,c.$a&&(c.$a=!1)}}else{for(a=a.i;a.next();){c=a.value,c.$a=!c.$a}}}else{if(!c.shift){for(var c=new E(G),d=b.selection.i;d.next();){var e=d.value;a.contains(e)||c.add(e)}for(c=c.i;c.next();){c.value.$a=!1}}for(a=a.i;a.next();){c=a.value,c.$a||(c.$a=!0)}}b.Ba("ChangedSelection")}};u.defineProperty(Kh,{jD:"delay"},function(){return this.rn},function(a){u.j(a,"number",Kh,"delay");this.rn=a});u.defineProperty(Kh,{hH:"isPartialInclusion"},function(){return this.vB},function(a){u.j(a,"boolean",Kh,"isPartialInclusion");this.vB=a});u.defineProperty(Kh,{Vg:"box"},function(){return this.Dl},function(a){null!==a&&u.C(a,G,Kh,"box");this.Dl=a});function Lh(){0<arguments.length&&u.Xc(Lh);xe.call(this);this.name="Panning";this.oy=new w;this.Si=!1;var a=this;this.lC=function(){window.document.removeEventListener("scroll",a.lC,!1);a.stopTool()}}u.Ha(Lh,xe);u.fa("PanningTool",Lh);Lh.prototype.canStart=function(){if(!this.isEnabled){return !1}var a=this.g;return null===a||!a.Se&&!a.Te||!a.N.left||a.Va!==this&&!this.isBeyondDragSize()?!1:!0};Lh.prototype.doActivate=function(){var a=this.g;null!==a&&(this.Si?(a.N.bubbles=!0,window.document.addEventListener("scroll",this.lC,!1)):(a.bc="move",a.He=!0,this.oy=a.position.copy()),this.oa=!0)};Lh.prototype.doDeactivate=function(){var a=this.g;null!==a&&(a.bc="",this.oa=a.He=!1)};Lh.prototype.doCancel=function(){var a=this.g;null!==a&&(a.position=this.oy,a.He=!1);this.stopTool() + };Lh.prototype.doMouseMove=function(){this.move()};Lh.prototype.doMouseUp=function(){this.move();this.stopTool()};Lh.prototype.move=function(){var a=this.g;if(this.oa&&a){if(this.Si){a.N.bubbles=!0}else{var b=a.position,c=a.uc.da,d=a.N.da,e=b.x+c.x-d.x,c=b.y+c.y-d.y;a.Se||(e=b.x);a.Te||(c=b.y);a.position=new w(e,c)}}};u.defineProperty(Lh,{bubbles:"bubbles"},function(){return this.Si},function(a){u.j(a,"boolean",Lh,"bubbles");this.Si=a});u.u(Lh,{mK:"originalPosition"},function(){return this.oy});function Mh(){0<arguments.length&&u.Xc(Mh);xe.call(this);this.name="TextEditing";this.RA=this.Fy=this.pC=null;this.kC=Nh;this.Hk=null;this.Ya=Oh;this.Dk=null;this.EB=1;this.dC=!0;var a=u.createElement("textarea");a.AA=!0;this.WA=a;a.addEventListener("input",function(){var a=this.textEditingTool;if(null!==a&&void 0!==a&&null!==a.te){var c=a.pC;c.text=this.value;var d=this.xI;Ph(c,a.te.Cu,Infinity);this.style.width=20+c.Ca.width*d+"px";this.style.height=10+c.Ca.height*d+"px";this.rows=c.pH}},!1);a.addEventListener("keydown",function(a){var c=a.which,d=this.textEditingTool;if(null!==d&&void 0!==d&&null!==d.te){if(13===c){!1===d.te.jw&&a.preventDefault(),d.acceptText(Qh)}else{if(9===c){return d.acceptText(Rh),a.preventDefault(),!1}27===c&&(d.doCancel(),null!==d.g&&d.g.focus())}}},!1);a.addEventListener("focus",function(){var a=this.textEditingTool;null!==a&&void 0!==a&&(a.Ya===Sh?a.Ya=Th:a.Ya===Uh?a.Ya=Vh:a.Ya===Vh&&(a.Ya=Th),"function"===typeof this.select&&a.aA&&(this.select(),this.setSelectionRange(0,9999)))},!1);a.addEventListener("blur",function(){"function"===typeof this.focus&&this.focus();var a=this.textEditingTool;null!==a&&void 0!==a&&"function"===typeof this.select&&a.aA&&(this.select(),this.setSelectionRange(0,9999))},!1)}u.fa("TextEditingTool",Mh);u.Ha(Mh,xe);var Wh;Mh.LostFocus=Wh=u.s(Mh,"LostFocus",0);var Xh;Mh.MouseDown=Xh=u.s(Mh,"MouseDown",1);var Rh;Mh.Tab=Rh=u.s(Mh,"Tab",2);var Qh;Mh.Enter=Qh=u.s(Mh,"Enter",3);Mh.SingleClick=u.s(Mh,"SingleClick",0);var Nh;Mh.SingleClickSelected=Nh=u.s(Mh,"SingleClickSelected",1);var Oh=u.s(Mh,"StateNone",0),Sh=u.s(Mh,"StateActive",1),Th=u.s(Mh,"StateEditing",2),Vh=u.s(Mh,"StateEditing2",3),Yh=u.s(Mh,"StateValidating",4),Uh=u.s(Mh,"StateValidated",5);u.defineProperty(Mh,{te:"textBlock"},function(){return this.Fy},function(a){null!==a&&u.C(a,qa,Mh,"textBlock");this.Fy=a});u.defineProperty(Mh,{og:"currentTextEditor"},function(){return this.RA},function(a){this.RA=a});u.defineProperty(Mh,{oG:"defaultTextEditor"},function(){return this.WA},function(a){u.C(a,Element,Mh,"defaultTextEditor");this.WA=a});u.defineProperty(Mh,{rI:"starting"},function(){return this.kC},function(a){u.rb(a,Mh,Mh,"starting");this.kC=a});Mh.prototype.canStart=function(){if(!this.isEnabled){return !1}var a=this.g;if(null===a||a.nb||!a.N.left||this.isBeyondDragSize()){return !1}a=a.le(a.N.da,null,function(a){return a instanceof qa});if(null===a||!a.cz||!a.W.canEdit()){return !1}a=a.W;return null===a||this.rI===Nh&&!a.$a?!1:!0};Mh.prototype.doStart=function(){this.oa||null===this.te||this.doActivate()};Mh.prototype.doActivate=function(){if(!this.oa){var a=this.g;if(null!==a){var b=this.te;null===b&&(b=a.le(a.N.da,function(a){return a instanceof qa?a:null}));if(null!==b&&(this.te=b,null!==b.W)){this.oa=!0;this.Ya=Sh;var c=this.oG,d=!1;null!==b.NE&&(c=b.NE);null===c||c.AA||(d=!0);this.pC=this.te.copy();var e=new z(this.te.eb(xb),this.te.eb(Vb));a.eI(e);if(c.AA){var f=b.eb(Ib),h=a.position,k=a.scale,l=b.Ii()*k;l<this.ZD&&(l=this.ZD);var e=b.Ja.width*l,m=b.Ja.height*l,n=(f.x-h.x)*k,f=(f.y-h.y)*k;c.value=b.text;a.Vk.style.font=b.font;c.style.font="inherit";c.style.fontSize=100*l+"%";c.style.lineHeight="normal";c.style.width=e+6+"px";c.style.height=m+2+"px";c.style.left=(n-e/2|0)-1+"px";c.style.top=(f-m/2|0)-1+"px";c.style.textAlign=b.textAlign;c.style.margin="0";c.style.padding="1px";c.style.border="0";c.style.outline="none";c.style["white-space"]="pre-wrap";c.style.overflow="hidden"}a.Vk.appendChild(c);c.style.position="absolute";c.style.zIndex=100;c.className="start";c.textEditingTool=this;c.xI=l;if(d&&"function"===typeof c.onActivate){c.onActivate()}this.og=c;"function"===typeof c.focus&&c.focus();"function"===typeof c.select&&this.aA&&(c.select(),c.setSelectionRange(0,9999))}}}};Mh.prototype.doCancel=function(){null!==this.Dk&&(this.og.style.border=this.Dk,this.Dk=null);this.stopTool()};Mh.prototype.doMouseUp=function(){!this.oa&&this.canStart()&&this.doActivate()};Mh.prototype.doMouseDown=function(){this.oa&&this.acceptText(Xh)};Mh.prototype.acceptText=function(a){switch(a){case Xh:if(this.Ya===Uh||this.Ya===Vh){"function"===typeof this.og.focus&&this.og.focus()}else{if(this.Ya===Sh||this.Ya===Th){this.Ya=Yh,Zh(this)}}break;case Wh:case Qh:case Rh:if(Qh===a&&!0===this.Fy.jw){break}if(this.Ya===Sh||this.Ya===Th){this.Ya=Yh,Zh(this)}}};function Zh(a){if(null!==a.te&&null!==a.og){var b=a.te,c=a.te.text,d=a.og.value,e="",e="function"===typeof d?d():d;if(!a.isValidText(a.te,c,e)){a.Ya=Th;null!==b.dz&&b.dz(a,c,e); + null===a.Dk&&(a.Dk=a.og.style.border,a.og.style.border="3px solid red");"function"===typeof a.og.focus&&a.og.focus();return}a.Xb(a.name);a.Ya=Uh;c!==e&&(a.te.text=e);a.Af=a.name;b=a.g;null!==b&&b.Ba("TextEdited",a.te,c);a.Uj();a.stopTool();null!==b&&b.focus()}null!==a.Dk&&(a.og.style.border=a.Dk,a.Dk=null)}Mh.prototype.doDeactivate=function(){var a=this.g;if(null!==a){this.Ya=Oh;this.te=null;if(null!==this.og){var b=this.og;if("function"===typeof b.onDeactivate){b.onDeactivate()}null!==b&&a.Vk.removeChild(b)}this.oa=!1}};Mh.prototype.isValidText=function(a,b,c){u.C(a,qa,Mh,"isValidText:textblock");var d=this.kA;if(null!==d&&!d(a,b,c)){return !1}d=a.kA;return null===d||d(a,b,c)?!0:!1};u.defineProperty(Mh,{kA:"textValidation"},function(){return this.Hk},function(a){null!==a&&u.j(a,"function",Mh,"textValidation");this.Hk=a});u.defineProperty(Mh,{ZD:"minimumEditorScale"},function(){return this.EB},function(a){null!==a&&u.j(a,"number",Mh,"minimumEditorScale");this.EB=a});u.defineProperty(Mh,{aA:"selectsTextOnActivate"},function(){return this.dC},function(a){null!==a&&u.j(a,"boolean",Mh,"selectsTextOnActivate");this.dC=a});function jf(){xe.call(this);this.name="ToolManager";this.vF=new E(xe);this.wF=new E(xe);this.xF=new E(xe);this.jB=this.kB=1000;this.ZA=(new ia(2,2)).La();this.bu=this.xx=null;this.IB=Bf;this.hB=$h}u.Ha(jf,xe);u.fa("ToolManager",jf);var Bf;jf.WheelScroll=Bf=u.s(jf,"WheelScroll",0);var Af;jf.WheelZoom=Af=u.s(jf,"WheelZoom",1);jf.WheelNone=u.s(jf,"WheelNone",2);var $h;jf.GestureZoom=$h=u.s(jf,"GestureZoom",3);var ai;jf.GestureCancel=ai=u.s(jf,"GestureCancel",4);var bi;jf.GestureNone=bi=u.s(jf,"GestureNone",5);u.defineProperty(jf,{at:"mouseWheelBehavior"},function(){return this.IB},function(a){u.rb(a,jf,jf,"mouseWheelBehavior");this.IB=a});u.defineProperty(jf,{Eo:"gestureBehavior"},function(){return this.hB},function(a){u.rb(a,jf,jf,"gestureBehavior");this.hB=a});jf.prototype.initializeStandardTools=function(){this.IF=new xh;this.jE=new Gf;this.sH=new fh;this.vE=new mh;this.bI=new uh;this.UD=new ta;this.Gd=new uf;this.vG=new Kh;this.LH=new Lh;this.Wy=new Ih;this.jA=new Mh;this.WF=new va;this.XF=new wh};jf.prototype.doMouseDown=function(){var a=this.g;if(null!==a){var b=a.N;b.kl&&this.Eo===ai&&(b.bubbles=!1);if(b.Qs){if(this.Eo===bi){b.bubbles=!0;return}if(this.Eo===ai){return}if(a.Va.canStartMultiTouch()){a.Va.standardPinchZoomStart();return}}b=a.ga;b.Ty&&0!==b.Me&&u.trace("WARNING: In ToolManager.doMouseDown: UndoManager.transactionLevel is not zero");for(var b=this.ef.length,c=0;c<b;c++){var d=this.ef.ja(c);null===d.g&&d.Dc(this.g);if(d.canStart()){a.Va=d;a.Va===d&&(d.oa||d.doActivate(),d.doMouseDown());return}}1===a.N.button&&(this.at===Bf?this.at=Af:this.at===Af&&(this.at=Bf));this.doActivate();this.standardWaitAfter(this.FD)}};jf.prototype.doMouseMove=function(){var a=this.g;if(null!==a){var b=a.N;if(b.Qs){if(this.Eo===bi){b.bubbles=!0;return}if(this.Eo===ai){return}if(a.Va.canStartMultiTouch()){a.Va.standardPinchZoomMove();return}}if(this.oa){for(var b=this.Nf.length,c=0;c<b;c++){var d=this.Nf.ja(c);null===d.g&&d.Dc(this.g);if(d.canStart()){a.Va=d;a.Va===d&&(d.oa||d.doActivate(),d.doMouseMove());return}}}this.standardMouseOver();this.isBeyondDragSize()&&this.standardWaitAfter(this.oa?this.FD:this.RG)}};jf.prototype.doCurrentObjectChanged=function(a,b){var c=this.Rk;null===c||null!==b&&(b===c||b.gl(c))||this.hideToolTip()};jf.prototype.doWaitAfter=function(){var a=this.g;null!==a&&a.kb&&(this.doMouseHover(),this.oa||this.doToolTip())};jf.prototype.doMouseHover=function(){var a=this.g;if(null!==a){var b=a.N;null===b.qe&&(b.qe=a.le(b.da,null,null));var c=b.qe;if(null!==c){for(b.Tc=!1;null!==c;){a=this.oa?c.Ez:c.Fz;if(null!==a&&(a(b,c),b.Tc)){break}c=c.P}}else{a=this.oa?a.Ez:a.Fz,null!==a&&a(b)}}};jf.prototype.doToolTip=function(){var a=this.g;if(null!==a){var b=a.N;null===b.qe&&(b.qe=a.le(b.da,null,null));b=b.qe;if(null!==b){if(b!==this.Rk&&!b.gl(this.Rk)){for(;null!==b;){a=b.mA;if(null!==a){this.showToolTip(a,b);return}b=b.P}this.hideToolTip()}}else{a=a.mA,null!==a?this.showToolTip(a,null):this.hideToolTip()}}};jf.prototype.showToolTip=function(a,b){u.C(a,lf,jf,"showToolTip:tooltip");null!==b&&u.C(b,T,jf,"showToolTip:obj");var c=this.g;if(null!==c){a!==this.Rk&&this.hideToolTip();a.xf="Tool";a.ql=!1;a.scale=1/c.scale;c.add(a);if(null!==b&&b!==this.bu){var c=null,d=b.Co();null!==d&&(c=d.data);a.xc=b;a.data=c}else{null===b&&(a.data=c.ha)}if(null===b||b!==this.bu){a.rf(),this.positionToolTip(a,b)}this.xx=a;this.bu=b}};jf.prototype.positionToolTip=function(a){if(null===a.placeholder){var b=this.g;if(null!==b){var c=b.N.da.copy(),d=a.Ca,e=b.ob;b.N.kl&&(c.x-=d.width);c.x+d.width>e.right&&(c.x-=d.width+5);c.x<e.x&&(c.x=e.x);c.y=c.y+20+d.height>e.bottom?c.y-(d.height+5):c.y+20;c.y<e.y&&(c.y=e.y);a.position=c}}};jf.prototype.hideToolTip=function(){if(null!==this.Rk){var a=this.g;null!==a&&(this.Rk.data=null,this.Rk.xc=null,a.remove(this.Rk),this.bu=this.xx=null)}};u.u(jf,{Rk:"currentToolTip"},function(){return this.xx + });jf.prototype.doMouseUp=function(){this.cancelWaitAfter();if(this.oa){var a=this.g;if(null===a){return}for(var b=this.Of.length,c=0;c<b;c++){var d=this.Of.ja(c);null===d.g&&d.Dc(this.g);if(d.canStart()){a.Va=d;a.Va===d&&(d.oa||d.doActivate(),d.doMouseUp());return}}}this.doDeactivate()};jf.prototype.doMouseWheel=function(){this.standardMouseWheel()};jf.prototype.doKeyDown=function(){var a=this.g;null!==a&&a.Eb.doKeyDown()};jf.prototype.doKeyUp=function(){var a=this.g;null!==a&&a.Eb.doKeyUp()};jf.prototype.doCancel=function(){null!==Ef&&Ef.doCancel();xe.prototype.doCancel.call(this)};jf.prototype.findTool=function(a){u.j(a,"string",jf,"findTool:name");for(var b=this.ef.length,c=0;c<b;c++){var d=this.ef.ja(c);if(d.name===a){return d}}b=this.Nf.length;for(c=0;c<b;c++){if(d=this.Nf.ja(c),d.name===a){return d}}b=this.Of.length;for(c=0;c<b;c++){if(d=this.Of.ja(c),d.name===a){return d}}return null};jf.prototype.replaceTool=function(a,b){u.j(a,"string",jf,"replaceTool:name");null!==b&&(u.C(b,xe,jf,"replaceTool:newtool"),b.g&&b.g!==this.g&&u.k("Cannot share tools between Diagrams: "+b.toString()),b.Dc(this.g));for(var c=this.ef.length,d=0;d<c;d++){var e=this.ef.ja(d);if(e.name===a){return null!==b?this.ef.Dg(d,b):this.ef.kd(d),e}}c=this.Nf.length;for(d=0;d<c;d++){if(e=this.Nf.ja(d),e.name===a){return null!==b?this.Nf.Dg(d,b):this.Nf.kd(d),e}}c=this.Of.length;for(d=0;d<c;d++){if(e=this.Of.ja(d),e.name===a){return null!==b?this.Of.Dg(d,b):this.Of.kd(d),e}}return null};function ci(a,b,c,d){u.j(b,"string",jf,"replaceStandardTool:name");u.C(d,E,jf,"replaceStandardTool:list");null!==c&&(u.C(c,xe,jf,"replaceStandardTool:newtool"),c.g&&c.g!==a.g&&u.k("Cannot share tools between Diagrams: "+c.toString()),c.name=b,c.Dc(a.g));a.findTool(b)?a.replaceTool(b,c):null!==c&&d.add(c)}u.u(jf,{ef:"mouseDownTools"},function(){return this.vF});u.u(jf,{Nf:"mouseMoveTools"},function(){return this.wF});u.u(jf,{Of:"mouseUpTools"},function(){return this.xF});u.defineProperty(jf,{RG:"hoverDelay"},function(){return this.kB},function(a){u.j(a,"number",jf,"hoverDelay");this.kB=a});u.defineProperty(jf,{FD:"holdDelay"},function(){return this.jB},function(a){u.j(a,"number",jf,"holdDelay");this.jB=a});u.defineProperty(jf,{wG:"dragSize"},function(){return this.ZA},function(a){u.C(a,ia,jf,"dragSize");this.ZA=a.Z()});u.defineProperty(jf,{IF:"actionTool"},function(){return this.findTool("Action")},function(a){ci(this,"Action",a,this.ef)});u.defineProperty(jf,{jE:"relinkingTool"},function(){return this.findTool("Relinking")},function(a){ci(this,"Relinking",a,this.ef)});u.defineProperty(jf,{sH:"linkReshapingTool"},function(){return this.findTool("LinkReshaping")},function(a){ci(this,"LinkReshaping",a,this.ef)});u.defineProperty(jf,{vE:"resizingTool"},function(){return this.findTool("Resizing")},function(a){ci(this,"Resizing",a,this.ef)});u.defineProperty(jf,{bI:"rotatingTool"},function(){return this.findTool("Rotating")},function(a){ci(this,"Rotating",a,this.ef)});u.defineProperty(jf,{UD:"linkingTool"},function(){return this.findTool("Linking")},function(a){ci(this,"Linking",a,this.Nf)});u.defineProperty(jf,{Gd:"draggingTool"},function(){return this.findTool("Dragging")},function(a){ci(this,"Dragging",a,this.Nf)});u.defineProperty(jf,{vG:"dragSelectingTool"},function(){return this.findTool("DragSelecting")},function(a){ci(this,"DragSelecting",a,this.Nf)});u.defineProperty(jf,{LH:"panningTool"},function(){return this.findTool("Panning")},function(a){ci(this,"Panning",a,this.Nf)});u.defineProperty(jf,{Wy:"contextMenuTool"},function(){return this.findTool("ContextMenu")},function(a){ci(this,"ContextMenu",a,this.Of)});u.defineProperty(jf,{jA:"textEditingTool"},function(){return this.findTool("TextEditing")},function(a){ci(this,"TextEditing",a,this.Of)});u.defineProperty(jf,{WF:"clickCreatingTool"},function(){return this.findTool("ClickCreating")},function(a){ci(this,"ClickCreating",a,this.Of)});u.defineProperty(jf,{XF:"clickSelectingTool"},function(){return this.findTool("ClickSelecting")},function(a){ci(this,"ClickSelecting",a,this.Of)});function Te(){this.pF=di;this.Jl=this.Kl=this.Y=null;this.CA=this.cd=this.Hn=this.dj=!1;this.Oe=!0;this.au=this.$t=this.PA=null;this.vx=0;this.Gx=600;this.zF=new w(0,0);this.EA=this.DA=this.BC=!1;this.Un=new la(T,ei)}u.fa("AnimationManager",Te);Te.prototype.Dc=function(a){this.Y=a};function di(a,b,c,d){a/=d/2;return 1>a?c/2*a*a+b:-c/2*(--a*(a-2)-1)+b}Te.prototype.prepareAnimation=Te.prototype.nl=function(){this.Oe&&(this.dj&&this.Ni(),this.cd=!0,this.CA=!1)};function fi(a){a.Oe&&requestAnimationFrame(function(){!1===a.cd||a.dj||(a.Y.mm=1,gi(a.Y),a.cd=!1,a.Y.Ba("AnimationStarting"),hi(a))})}function ii(a,b,c,d,e){if(a.cd&&(!(b instanceof G)||b.JD)){var f=a.Un;if(f.contains(b)){b=f.ua(b);a=b.start;var h=b.end;void 0===a[c]&&(a[c]=ji(d));h[c]=ji(e)}else{a=new pa,h=new pa,a[c]=ji(d),h[c]=ji(e),f.add(b,new ei(a,h))}}}function ji(a){return a instanceof w?a.copy():a instanceof ia?a.copy():a}function hi(a){var b;void 0===b&&(b=new pa); + var c=a.Y;if(null!==c){if(0===a.Un.count){a.dj=!1,ki(c,!1),c.df()}else{a.dj=!0;var d=b.AJ||a.pF,e=b.fK||null,f=b.gK||null,h=b.duration||a.Gx;b=a.zF;for(var k=a.Un.i;k.next();){var l=k.value.start.position;l instanceof w&&(l.I()||l.assign(b))}a.PA=d;a.$t=e;a.au=f;a.vx=h;var m=a.oF=a.Un;li(a);mi(a,c,m,d,0,h,null!==a.Kl&&null!==a.Jl);Dg(a.Y);ni(a);requestAnimationFrame(function(b){var e=b||+new Date,f=e+h;(function s(b){if(!1!==a.dj){b=b||+new Date;var k=b>f?h:b-e;li(a);mi(a,c,m,d,k,h,null!==a.Kl&&null!==a.Jl);a.$t&&a.$t();Dg(c);ni(a);b>f?oi(a):requestAnimationFrame(s)}})(e)})}}}var pi={opacity:function(a,b,c,d,e,f){a.opacity=d(e,b,c-b,f)},position:function(a,b,c,d,e,f){e!==f?a.HE(d(e,b.x,c.x-b.x,f),d(e,b.y,c.y-b.y,f)):a.position=new w(d(e,b.x,c.x-b.x,f),d(e,b.y,c.y-b.y,f))},scale:function(a,b,c,d,e,f){a.scale=d(e,b,c-b,f)},visible:function(a,b,c,d,e,f){a.visible=e!==f?b:c}};function li(a){if(!a.Hn){var b=a.Y;a.BC=b.gb;a.DA=b.Kw;a.EA=b.ut;b.gb=!0;b.Kw=!0;b.ut=!0;a.Hn=!0}}function ni(a){var b=a.Y;b.gb=a.BC;b.Kw=a.DA;b.ut=a.EA;a.Hn=!1}function mi(a,b,c,d,e,f,h){for(c=c.i;c.next();){var k=c.key,l=c.value,m=l.start,l=l.end,n;for(n in l){if(void 0!==pi[n]){pi[n](k,m[n],l[n],d,e,f)}}}h&&(h=a.Kl,a=a.Jl,n=a.y-h.y,a=d(e,h.x,a.x-h.x,f),d=d(e,h.y,n,f),e=b.rz,b.rz=!0,b.position=new w(a,d),b.rz=e)}Te.prototype.stopAnimation=Te.prototype.Ni=function(){!0===this.cd&&(this.cd=!1,this.CA&&this.Y.ee());this.dj&&this.Oe&&(li(this),mi(this,this.Y,this.oF,this.PA,this.vx,this.vx,null!==this.Kl&&null!==this.Jl),ni(this),oi(this))};function oi(a){a.dj=!1;a.Kl=null;a.Jl=null;a.Un=new la(T,ei);li(a);for(var b=a.Y,c=a.Y.links;c.next();){var d=c.value;null!==d.Zn&&(d.points=d.Zn,d.Zn=null)}b.rw.clear();ki(b,!1);b.pc();b.df();qi(b);ni(a);a.au&&a.au();a.au=null;a.$t=null;b.Ba("AnimationFinished");b.ee()}function ri(a,b,c){var d=b.ca,e=c.ca,f=null;c instanceof V&&(f=c.placeholder);null!==f?(c=f.eb(xb),c.x+=f.padding.left,c.y+=f.padding.top,ii(a,b,"position",c,b.position)):ii(a,b,"position",new w(e.x+e.width/2-d.width/2,e.y+e.height/2-d.height/2),b.position);ii(a,b,"opacity",0.01,b.opacity)}function si(a,b,c){a.cd&&(null===a.Kl&&b.I()&&null===a.Jl&&(a.Kl=b.copy()),a.Jl=c.copy())}u.defineProperty(Te,{isEnabled:"isEnabled"},function(){return this.Oe},function(a){u.j(a,"boolean",Te,"isEnabled");this.Oe=a});u.defineProperty(Te,{duration:"duration"},function(){return this.Gx},function(a){u.j(a,"number",Te,"duration");1>a&&u.xa(a,">= 1",Te,"duration");this.Gx=a});u.u(Te,{Xg:"isAnimating"},function(){return this.dj});u.u(Te,{MJ:"isTicking"},function(){return this.Hn});function ei(a,b){this.start=a;this.end=b}function we(){0<arguments.length&&u.Xc(we);u.gc(this);this.Y=null;this.Db=new E(G);this.Vb="";this.Hc=1;this.Xx=!1;this.Fk=this.Ky=this.fk=this.ek=this.dk=this.ck=this.ak=this.bk=this.$j=this.hk=this.Zj=this.gk=this.Yj=this.Xj=!0;this.Sx=!1;this.Wu=[]}u.fa("Layer",we);we.prototype.Dc=function(a){this.Y=a};we.prototype.toString=function(a){void 0===a&&(a=0);var b='Layer "'+this.name+'"';if(0>=a){return b}for(var c=0,d=0,e=0,f=0,h=0,k=this.Db.i;k.next();){var l=k.value;l instanceof V?e++:l instanceof U?d++:l instanceof W?f++:l instanceof lf?h++:c++}k="";0<c&&(k+=c+" Parts ");0<d&&(k+=d+" Nodes ");0<e&&(k+=e+" Groups ");0<f&&(k+=f+" Links ");0<h&&(k+=h+" Adornments ");if(1<a){for(a=this.Db.i;a.next();){c=a.value,k+="\n "+c.toString(),d=c.data,null!==d&&u.Uc(d)&&(k+=" #"+u.Uc(d)),c instanceof U?k+=" "+de(d):c instanceof W&&(k+=" "+de(c.V)+" "+de(c.ba))}}return b+" "+this.Db.count+": "+k};we.prototype.findObjectAt=we.prototype.le=function(a,b,c){void 0===b&&(b=null);void 0===c&&(c=null);if(!1===this.Fk){return null}var d=!1;this.g.ob.Da(a)&&(d=!0);for(var e=u.K(),f=this.Db.n,h=f.length;h--;){var k=f[h];if((!0!==d||!1!==ti(k))&&k.Ia()&&(e.assign(a),Wa(e,k.Gf),k=k.le(e,b,c),null!==k&&(null!==b&&(k=b(k)),null!==k&&(null===c||c(k))))){return u.v(e),k}}u.v(e);return null};we.prototype.findObjectsAt=we.prototype.zs=function(a,b,c,d){void 0===b&&(b=null);void 0===c&&(c=null);d instanceof E||d instanceof F||(d=new F(T));if(!1===this.Fk){return d}var e=!1;this.g.ob.Da(a)&&(e=!0);for(var f=u.K(),h=this.Db.n,k=h.length;k--;){var l=h[k];!0===e&&!1===ti(l)||!l.Ia()||(f.assign(a),Wa(f,l.Gf),l.zs(f,b,c,d)&&(null!==b&&(l=b(l)),null===l||null!==c&&!c(l)||d.add(l)))}u.v(f);return d};we.prototype.findObjectsIn=we.prototype.Nj=function(a,b,c,d,e){void 0===b&&(b=null);void 0===c&&(c=null);void 0===d&&(d=!1);e instanceof E||e instanceof F||(e=new F(T));if(!1===this.Fk){return e}var f=!1;this.g.ob.Kj(a)&&(f=!0);for(var h=this.Db.n,k=h.length;k--;){var l=h[k];(!0!==f||!1!==ti(l))&&l.Ia()&&l.Nj(a,b,c,d,e)&&(null!==b&&(l=b(l)),null===l||null!==c&&!c(l)||e.add(l))}return e};we.prototype.ez=function(a,b,c,d,e,f,h){if(!1===this.Fk){return e}for(var k=this.Db.n,l=k.length;l--;){var m=k[l];(!0!==h||!1!==ti(m))&&f(m)&&m.Ia()&&m.Nj(a,b,c,d,e)&&(null!==b&&(m=b(m)),null===m||null!==c&&!c(m)||e.add(m))}return e};we.prototype.findObjectsNear=we.prototype.Cm=function(a,b,c,d,e,f){void 0===c&&(c=null); + void 0===d&&(d=null);void 0===e&&(e=!0);if(!1!==e&&!0!==e){if(e instanceof E||e instanceof F){f=e}e=!0}f instanceof E||f instanceof F||(f=new F(T));if(!1===this.Fk){return f}var h=!1;this.g.ob.Da(a)&&(h=!0);for(var k=u.K(),l=u.K(),m=this.Db.n,n=m.length;n--;){var p=m[n];!0===h&&!1===ti(p)||!p.Ia()||(k.assign(a),Wa(k,p.Gf),l.m(a.x+b,a.y),Wa(l,p.Gf),p.Cm(k,l,c,d,e,f)&&(null!==c&&(p=c(p)),null===p||null!==d&&!d(p)||f.add(p)))}u.v(k);u.v(l);return f};g=we.prototype;g.yf=function(a,b){if(this.visible){var c;c=void 0===b?a.ob:b;for(var d=this.Db.n,e=d.length,f=0;f<e;f++){var h=d[f];h.BB=f;if(!(h instanceof W&&!1===h.jg)){if(h instanceof lf){var k=h;if(null!==k.Mh){continue}}if(jb(h.ca,c)){for(h.yf(!0),ui(h),h=h.Av;h.next();){k=h.value,Ph(k,Infinity,Infinity),k.yc(),k.yf(!0)}}else{h.yf(!1),null!==h.Av&&0<h.Av.count&&ui(h)}}}}};g.Xe=function(a,b,c,d){if(this.visible&&0!==this.Hc&&(void 0===d&&(d=!0),d||!this.zc)){1!==this.Hc&&(a.globalAlpha=this.Hc);c=this.Wu;c.length=0;d=b.scale;for(var e=this.Db.n,f=e.length,h=0;h<f;h++){var k=e[h];if(ti(k)||vi(k)){if(k instanceof W){var l=k;l.ec&&c.push(l);if(!1===l.jg){continue}}l=k.ca;1<l.width*d||1<l.height*d?k.Xe(a,b):wi(k,a)}}a.globalAlpha=1}};function xi(a,b,c,d){if(a.visible&&0!==a.Hc){1!==a.Hc&&(b.globalAlpha=a.Hc);var e=a.Wu;e.length=0;var f=c.scale;a=a.Db.n;for(var h=a.length,k=d.length,l=0;l<h;l++){var m=a[l];if(ti(m)||vi(m)){if(m instanceof W){var n=m;n.ec&&e.push(n);if(!1===n.jg){continue}}var n=Ki(m,m.ca),p;a:{p=n;for(var q=d,r=k,s=2/f,t=4/f,v=0;v<r;v++){var x=q[v];if(0!==x.width&&0!==x.height&&p.HD(x.x-s,x.y-s,x.width+t,x.height+t)){p=!0;break a}}p=!1}p&&(1<n.width*f||1<n.height*f?m.Xe(b,c):wi(m,b))}}b.globalAlpha=1}}g.h=function(a,b,c,d,e){var f=this.g;null!==f&&f.Cc($d,a,this,b,c,d,e)};g.Ho=function(a,b,c){var d=this.Db;b.Du=this;if(a>=d.count){a=d.count}else{if(d.ja(a)===b){return -1}}d.Zd(a,b);b.Ks(c);d=this.g;null!==d&&(c?d.na():d.Ho(b));b instanceof V&&this.Lw(b);return a};g.Ge=function(a,b,c){if(!c&&b.layer!==this&&null!==b.layer){return b.layer.Ge(a,b,c)}var d=this.Db;if(0>a||a>=d.length){if(a=d.indexOf(b),0>a){return -1}}else{if(d.ja(a)!==b&&(a=d.indexOf(b),0>a)){return -1}}b.Ls(c);d.kd(a);d=this.g;null!==d&&(c?d.na():d.Ge(b));b.Du=null;return a};g.Lw=function(a){for(;null!==a;){if(a.layer===this){var b=a;if(0!==b.Lc.count){for(var c=-1,d=-1,e=this.Db.n,f=e.length,h=0;h<f;h++){var k=e[h];if(k===b&&(c=h,0<=d)){break}if(0>d&&k.Sa===b&&(d=h,0<=c)){break}}!(0>d)&&d<c&&(e=this.Db,e.kd(c),e.Zd(d,b))}}a=a.Sa}};g.clear=function(){for(var a=this.Db.Le(),b=a.length,c=0;c<b;c++){a[c].yf(!1),this.Ge(-1,a[c],!1)}};u.u(we,{Sj:"parts"},function(){return this.Db.i});u.u(we,{pK:"partsBackwards"},function(){return this.Db.Jm});u.u(we,{g:"diagram"},function(){return this.Y});u.defineProperty(we,{name:"name"},function(){return this.Vb},function(a){u.j(a,"string",we,"name");var b=this.Vb;if(b!==a){var c=this.g;if(null!==c){for(""===b&&u.k("Cannot rename default Layer to: "+a),c=c.nw;c.next();){c.value.name===a&&u.k("Layer.name is already present in this diagram: "+a)}}this.Vb=a;this.h("name",b,a);for(a=this.Db.i;a.next();){a.value.xf=this.Vb}}});u.defineProperty(we,{opacity:"opacity"},function(){return this.Hc},function(a){var b=this.Hc;b!==a&&(u.j(a,"number",we,"opacity"),(0>a||1<a)&&u.xa(a,"0 <= value <= 1",we,"opacity"),this.Hc=a,this.h("opacity",b,a),a=this.g,null!==a&&a.na())});u.defineProperty(we,{zc:"isTemporary"},function(){return this.Xx},function(a){var b=this.Xx;b!==a&&(u.j(a,"boolean",we,"isTemporary"),this.Xx=a,this.h("isTemporary",b,a))});u.defineProperty(we,{visible:"visible"},function(){return this.Ky},function(a){var b=this.Ky;if(b!==a){u.j(a,"boolean",we,"visible");this.Ky=a;this.h("visible",b,a);for(b=this.Db.i;b.next();){b.value.Ie(a)}a=this.g;null!==a&&a.na()}});u.defineProperty(we,{Cg:"pickable"},function(){return this.Fk},function(a){var b=this.Fk;b!==a&&(u.j(a,"boolean",we,"pickable"),this.Fk=a,this.h("pickable",b,a))});u.defineProperty(we,{KD:"isBoundsIncluded"},function(){return this.Sx},function(a){this.Sx!==a&&(this.Sx=a,null!==this.g&&this.g.pc())});u.defineProperty(we,{Ij:"allowCopy"},function(){return this.Xj},function(a){var b=this.Xj;b!==a&&(u.j(a,"boolean",we,"allowCopy"),this.Xj=a,this.h("allowCopy",b,a))});u.defineProperty(we,{pm:"allowDelete"},function(){return this.Yj},function(a){var b=this.Yj;b!==a&&(u.j(a,"boolean",we,"allowDelete"),this.Yj=a,this.h("allowDelete",b,a))});u.defineProperty(we,{Fv:"allowTextEdit"},function(){return this.gk},function(a){var b=this.gk;b!==a&&(u.j(a,"boolean",we,"allowTextEdit"),this.gk=a,this.h("allowTextEdit",b,a))});u.defineProperty(we,{Cv:"allowGroup"},function(){return this.Zj},function(a){var b=this.Zj;b!==a&&(u.j(a,"boolean",we,"allowGroup"),this.Zj=a,this.h("allowGroup",b,a))});u.defineProperty(we,{Gv:"allowUngroup"},function(){return this.hk},function(a){var b=this.hk;b!==a&&(u.j(a,"boolean",we,"allowUngroup"),this.hk=a,this.h("allowUngroup",b,a))});u.defineProperty(we,{js:"allowLink"},function(){return this.$j + },function(a){var b=this.$j;b!==a&&(u.j(a,"boolean",we,"allowLink"),this.$j=a,this.h("allowLink",b,a))});u.defineProperty(we,{qm:"allowRelink"},function(){return this.bk},function(a){var b=this.bk;b!==a&&(u.j(a,"boolean",we,"allowRelink"),this.bk=a,this.h("allowRelink",b,a))});u.defineProperty(we,{Nk:"allowMove"},function(){return this.ak},function(a){var b=this.ak;b!==a&&(u.j(a,"boolean",we,"allowMove"),this.ak=a,this.h("allowMove",b,a))});u.defineProperty(we,{Dv:"allowReshape"},function(){return this.ck},function(a){var b=this.ck;b!==a&&(u.j(a,"boolean",we,"allowReshape"),this.ck=a,this.h("allowReshape",b,a))});u.defineProperty(we,{ks:"allowResize"},function(){return this.dk},function(a){var b=this.dk;b!==a&&(u.j(a,"boolean",we,"allowResize"),this.dk=a,this.h("allowResize",b,a))});u.defineProperty(we,{Ev:"allowRotate"},function(){return this.ek},function(a){var b=this.ek;b!==a&&(u.j(a,"boolean",we,"allowRotate"),this.ek=a,this.h("allowRotate",b,a))});u.defineProperty(we,{qf:"allowSelect"},function(){return this.fk},function(a){var b=this.fk;b!==a&&(u.j(a,"boolean",we,"allowSelect"),this.fk=a,this.h("allowSelect",b,a))});function D(a){function b(){window.document.removeEventListener("DOMContentLoaded",b,!1);Li(c)}1<arguments.length&&u.k("Diagram constructor can only take one optional argument, the DIV HTML element or its id.");u.gc(this);Mi=[];this.Oc=!0;this.oh=new Te;this.oh.Dc(this);this.Bd=17;var c=this;null!==window.document.body?Li(this):window.document.addEventListener("DOMContentLoaded",b,!1);this.wB=!1;this.$b=new E(we);this.zb=this.Ab=0;this.Sg=this.Kb=this.Ig=this.kb=null;this.rE();this.fq=null;this.qE();this.Na=(new w(NaN,NaN)).freeze();this.ac=1;this.uu=(new w(NaN,NaN)).freeze();this.vu=NaN;this.Mu=0.0001;this.Ju=100;this.Td=new ja;this.xv=(new w(NaN,NaN)).freeze();this.lu=(new z(NaN,NaN,NaN,NaN)).freeze();this.wy=(new rb(0,0,0,0)).freeze();this.xy=Ni;this.sy=this.py=null;this.Bl=vf;this.fn=uc;this.tk=vf;this.Cn=uc;this.wu=this.tu=xb;this.Zf=new F(T);this.Nd=!0;this.hq=!1;this.Il=new la(W,z);this.sn=!0;this.lF=250;this.an=-1;this.Rt=(new rb(16,16,16,16)).freeze();this.eu=this.Ff=!1;this.wn=!0;this.nk=new Md;this.Ic=new Md;this.Pb=new Md;this.Ui=null;this.nv=-1;this.mv=!1;this.Cx=this.Dx=null;Oi(this);this.Tn=new F(U);this.Ik=new F(V);this.Pn=new F(W);this.Db=new F(G);this.zu=!0;this.mB=!1;this.tv=Hg;this.gj=10;this.wx=this.Ax=this.Hy=null;this.ux="";this.Rp="auto";this.$h=this.ui=this.ki=this.Pu=this.li=this.mi=this.ni=this.Zh=this.di=this.Xh=null;this.An=!0;this.jy=!1;this.WB={};this.jr=0;this.Ef=[null,null];this.kx=null;this.Au=this.Ym=this.Bx=this.yy=this.eC=this.ri=!1;this.yB=!0;this.Ux=this.xd=!1;this.Pd=null;var d=this;this.FB=function(a){if(a.ha===d.ha&&d.Oa){d.Oa=!1;try{var b=a.Cd;""===a.Mf&&b===$d&&Pi(d,a.object,a.propertyName)}finally{d.Oa=!0}}};this.GB=function(a){Qi(d,a)};this.DC=!0;this.Kg=-2;this.ai=new la(Object,G);this.lk=new la(Object,W);this.Ql=new la(Object,Array);this.Vn=new la("string",Array);this.VB=new E(Ri);this.vk=!1;this.Yj=this.Xj=this.Ht=this.Oe=!0;this.Jt=this.It=!1;this.Ot=this.Mt=this.fk=this.ek=this.dk=this.ck=this.ak=this.bk=this.$j=this.Lt=this.hk=this.Zj=this.gk=!0;this.Nl=this.uB=!1;this.Nt=this.Kt=this.ru=this.qu=!0;this.cv=this.bv=16;this.ty=this.av=!1;this.vy=this.uy=this.vj=this.uj=null;this.Qe=(new rb(5)).freeze();this.fv=(new F(G)).freeze();this.Ku=999999999;this.su=(new F(G)).freeze();this.uk=this.Ll=this.fi=!0;this.rk=this.qk=!1;this.Od=null;this.Pt=!0;this.nf=!1;this.uF=new F(W);this.nd=null;this.MB=1;this.Nx=!1;this.iC=0;this.CC=(new z(NaN,NaN,NaN,NaN)).freeze();this.fu=(new z(NaN,NaN,NaN,NaN)).freeze();this.Yl=new F(Si);Ti(this);this.Fu=this.nu=this.Ru=this.TA=this.SA=this.UA=this.hj=this.ok=this.oi=null;Ui(this);this.bd=null;this.mu=!1;this.gn=null;this.tb=new jf;this.tb.initializeStandardTools();this.Va=this.az=this.tb;this.Eb=new sa;this.ha=new Q;this.ri=!0;this.Qb=new Je;this.ri=!1;this.dB=this.Fx=null;this.pf=1;this.mm=null;this.sk=new Vi;void 0!==a&&Wi(this,a);this.Sl=1;this.Tl=0;this.AB=new w;this.zC=500;this.Qt=new w;this.Kr=null;this.Oc=this.Yx=!1}u.fa("Diagram",D);function Ui(a){a.oi=new la("string",G);var b=new U,c=new qa;c.bind(new bf("text","",de));b.add(c);a.UA=b;a.oi.add("",b);b=new U;c=new qa;c.stroke="brown";c.bind(new bf("text","",de));b.add(c);a.oi.add("Comment",b);b=new U;b.ql=!1;b.TC=!1;c=new X;c.Fb="Ellipse";c.fill="black";c.stroke=null;c.za=(new ia(3,3)).La();b.add(c);a.oi.add("LinkLabel",b);a.ok=new la("string",V);b=new V;b.$z="GROUPPANEL";b.type=Xi;c=new qa;c.font="bold 12pt sans-serif";c.bind(new bf("text","",de));b.add(c);c=new B(Yi);c.name="GROUPPANEL";var d=new X;d.Fb="Rectangle";d.fill="rgba(128,128,128,0.2)";d.stroke="black";c.add(d);d=new ph;d.padding=(new rb(5,5,5,5)).La();c.add(d);b.add(c);a.SA=b;a.ok.add("",b);a.hj=new la("string",W);b=new W;c=new X;c.vg=!0;b.add(c);c=new X;c.lp="Standard";c.fill="black";c.stroke=null;c.jb=0;b.add(c);a.TA=b;a.hj.add("",b);b=new W;c=new X;c.vg=!0;c.stroke="brown";b.add(c);a.hj.add("Comment",b); + b=new lf;b.type=Yi;c=new X;c.fill=null;c.stroke="dodgerblue";c.jb=3;b.add(c);c=new ph;c.margin=(new rb(1.5,1.5,1.5,1.5)).La();b.add(c);a.Ru=b;a.nu=b;b=new lf;b.type=ah;c=new X;c.vg=!0;c.fill=null;c.stroke="dodgerblue";c.jb=3;b.add(c);a.Fu=b}function Li(a){var b=u.createElement("p");b.style.width="100%";b.style.height="200px";b.style.boxSizing="content-box";var c=u.createElement("div");c.style.position="absolute";c.style.visibility="hidden";c.style.width="200px";c.style.height="150px";c.style.overflow="hidden";c.style.boxSizing="content-box";c.appendChild(b);window.document.body.appendChild(c);var d=b.offsetWidth;c.style.overflow="scroll";b=b.offsetWidth;d===b&&(b=c.clientWidth);window.document.body.removeChild(c);c=d-b;0!==c||u.ND||(c=11);a.Bd=c}D.prototype.toString=function(a){void 0===a&&(a=0);var b="";this.id&&(b=this.id);this.Vk&&this.Vk.id&&(b=this.Vk.id);b='Diagram "'+b+'"';if(0>=a){return b}for(var c=this.$b.i;c.next();){b+="\n "+c.value.toString(a-1)}return b};D.prototype.checkProperties=function(){return u.check(this)};D.fromDiv=function(a){var b=a;"string"===typeof a&&(b=window.document.getElementById(a));return b instanceof HTMLDivElement&&b.Y instanceof D?b.Y:null};u.defineProperty(D,{Vk:"div"},function(){return this.Kb},function(a){null!==a&&u.C(a,HTMLDivElement,D,"div");if(this.Kb!==a){Mi=[];var b=this.Kb;null!==b?(b.Y=void 0,b.innerHTML="",null!==this.kb&&(this.kb.removeEventListener("touchstart",this.SE,!1),this.kb.removeEventListener("touchmove",this.RE,!1),this.kb.removeEventListener("touchend",this.QE,!1),this.kb.Fd.Y=null),b=this.tb,null!==b&&(b.ef.each(function(a){a.cancelWaitAfter()}),b.Nf.each(function(a){a.cancelWaitAfter()}),b.Of.each(function(a){a.cancelWaitAfter()})),b.cancelWaitAfter(),this.Va.doCancel(),this.Ig=this.kb=null,window.removeEventListener("resize",this.aF,!1),window.removeEventListener("mousemove",this.So,!0),window.removeEventListener("mousedown",this.Ro,!0),window.removeEventListener("mouseup",this.Uo,!0),window.removeEventListener("mousewheel",this.ah,!0),window.removeEventListener("DOMMouseScroll",this.ah,!0),window.removeEventListener("mouseout",this.To,!0)):this.nf=!1;this.Kb=null;if(null!==a){if(b=a.Y){b.Vk=null}Wi(this,a);this.Tz()}}});function Zi(a){var b=a.kb;b.addEventListener("touchstart",a.SE,!1);b.addEventListener("touchmove",a.RE,!1);b.addEventListener("touchend",a.QE,!1);b.addEventListener("mousemove",a.So,!1);b.addEventListener("mousedown",a.Ro,!1);b.addEventListener("mouseup",a.Uo,!1);b.addEventListener("mousewheel",a.ah,!1);b.addEventListener("DOMMouseScroll",a.ah,!1);b.addEventListener("mouseout",a.To,!1);b.addEventListener("keydown",a.lH,!1);b.addEventListener("keyup",a.mH,!1);b.addEventListener("selectstart",function(a){a.preventDefault();return !1},!1);b.addEventListener("contextmenu",function(a){a.preventDefault();return !1},!1);b.addEventListener("gesturechange",function(b){a.tb.Eo===ai&&b.preventDefault()},!1);b.addEventListener("pointerdown",a.MH,!1);b.addEventListener("pointermove",a.OH,!1);b.addEventListener("pointerleave",a.NH,!1);window.addEventListener("resize",a.aF,!1)}function ki(a,b){a.mm=null;b&&a.iE()}D.prototype.computePixelRatio=function(){if(null!==this.mm){return this.mm}var a=this.Ig;return(window.devicePixelRatio||1)/(a.webkitBackingStorePixelRatio||a.mozBackingStorePixelRatio||a.msBackingStorePixelRatio||a.oBackingStorePixelRatio||a.backingStorePixelRatio||1)};D.prototype.doMouseMove=function(){this.Va.doMouseMove()};D.prototype.doMouseDown=function(){this.Va.doMouseDown()};D.prototype.doMouseUp=function(){this.Va.doMouseUp()};D.prototype.doMouseWheel=function(){this.Va.doMouseWheel()};D.prototype.doKeyDown=function(){this.Va.doKeyDown()};D.prototype.doKeyUp=function(){this.Va.doKeyUp()};function gi(a){if(null!==a.kb){var b=a.Kb;if(0!==b.clientWidth&&0!==b.clientHeight){var c=a.rk?a.Bd:0,d=a.qk?a.Bd:0,e=a.pf;a.pf=a.computePixelRatio();a.pf!==e&&(a.hq=!0,a.ee());if(b.clientWidth!==a.Ab+c||b.clientHeight!==a.zb+d){a.Ll=!0,a.Nd=!0,b=a.Qb,null!==b&&b.kw&&b.H(),a.xd||a.ee()}}}}D.prototype.focus=D.prototype.focus=function(){this.kb&&this.kb.focus()};function $i(a,b,c){void 0===b&&(b=a.Ig);void 0===c&&(c=!0);c&&(b.Ft="");b.Wm="";b.Vm=""}function Ti(a){var b=new we;b.name="Background";a.es(b);b=new we;b.name="";a.es(b);b=new we;b.name="Foreground";a.es(b);b=new we;b.name="Adornment";b.zc=!0;a.es(b);b=new we;b.name="Tool";b.zc=!0;b.KD=!0;a.es(b);b=new we;b.name="Grid";b.qf=!1;b.Cg=!1;b.zc=!0;a.MF(b,a.xs("Background"))}function aj(a){a.bd=new B(bj);a.bd.name="GRID";var b=new X;b.Fb="LineH";b.stroke="lightgray";b.jb=0.5;b.interval=1;a.bd.add(b);b=new X;b.Fb="LineH";b.stroke="gray";b.jb=0.5;b.interval=5;a.bd.add(b);b=new X;b.Fb="LineH";b.stroke="gray";b.jb=1;b.interval=10;a.bd.add(b);b=new X;b.Fb="LineV";b.stroke="lightgray";b.jb=0.5;b.interval=1;a.bd.add(b);b=new X;b.Fb="LineV";b.stroke="gray";b.jb=0.5;b.interval=5;a.bd.add(b);b=new X;b.Fb="LineV";b.stroke="gray";b.jb=1;b.interval=10;a.bd.add(b);b=new G;b.add(a.bd);b.xf="Grid";b.vz=!1; + b.JD=!1;b.Cg=!1;b.Az="GRID";a.add(b);a.Db.remove(b);a.bd.visible=!1}D.prototype.LB=function(){if(this.Y.isEnabled){var a=this.Y;if(a.ty&&null!==a.kb){a.av=!0;var b=a.Ed,c=a.ob,d=b.width,e=c.width,f=b.height,h=c.height,k=b.right,l=c.right,m=b.bottom,n=c.bottom,p=b.x,q=c.x,b=b.y,c=c.y,r=a.scale;if(e<d||h<f){var s=u.K();this.bC&&a.Se?(s.m(this.scrollLeft/r+p,a.position.y),a.position=s):this.cC&&a.Te&&(s.m(a.position.x,this.scrollTop/r+b),a.position=s);u.v(s);a.av=!1;a.Ll=!1}else{s=u.K(),this.bC&&a.Se&&(p<q&&(a.position=new w(this.scrollLeft+p,a.position.y)),k>l&&(a.position=new w(-(a.uj.scrollWidth-a.Ab)+this.scrollLeft-a.Ab/r+a.Ed.right,a.position.y))),this.cC&&a.Te&&(b<c&&(a.position=new w(a.position.x,this.scrollTop+b)),m>n&&(a.position=new w(a.position.x,-(a.vj.scrollHeight-a.zb)+this.scrollTop-a.zb/r+a.Ed.bottom))),u.v(s),cj(a),a.av=!1,a.Ll=!1,b=a.Ed,c=a.ob,k=b.right,l=c.right,m=b.bottom,n=c.bottom,p=b.x,q=c.x,b=b.y,c=c.y,e>=d&&p>=q&&k<=l&&(a.uy.style.width="1px"),h>=f&&b>=c&&m<=n&&(a.vy.style.height="1px")}}}else{dj(this.Y)}};D.prototype.Tu=function(){this.Y.isEnabled?this.Y.ty=!0:dj(this.Y)};D.prototype.computeBounds=D.prototype.mg=function(){0<this.Zf.count&&ej(this);return fj(this)};function fj(a){if(a.vD.I()){var b=a.vD.copy();b.zv(a.padding);return b}for(var c=!0,d=a.$b.n,e=d.length,f=0;f<e;f++){var h=d[f];if(h.visible&&(!h.zc||h.KD)){for(var h=h.Db.n,k=h.length,l=0;l<k;l++){var m=h[l];m.vz&&m.Ia()&&(m=m.ca,m.I()&&(c?(c=!1,b=m.copy()):b.Uh(m)))}}}c&&(b=new z(0,0,0,0));b.zv(a.padding);return b}D.prototype.computePartsBounds=function(a){var b=null;for(a=a.i;a.next();){var c=a.value;c instanceof W||(c.rf(),null===b?b=c.ca.copy():b.Uh(c.ca))}return null===b?new z(NaN,NaN,0,0):b};function gj(a,b){if((b||a.nf)&&!a.Oc&&null!==a.kb&&!a.Mb.Xg&&a.Ed.I()){a.Oc=!0;var c=a.Bl;b&&a.tk!==vf&&(c=a.tk);var d=c!==vf?hj(a,c):a.scale,c=a.ob.copy(),e=a.Ab/d,f=a.zb/d,h=null,k=a.Mb;k.cd&&(h=a.Na.copy());a.position.Ma();var l=a.fn;b&&!l.Vc()&&a.Cn.Vc()&&(l=a.Cn);ij(a,a.Na,a.Ed,e,f,l,b);a.position.freeze();null!==h&&si(k,h,a.Na);a.scale=d;a.Oc=!1;d=a.ob;d.pd(c)||a.et(c,d)}}function hj(a,b){var c=a.Eb.Pv;if(null===a.kb){return c}a.fi&&jj(a,a.mg());var d=a.Ed;if(!d.I()){return c}var e=d.width,d=d.height,f=a.Ab,h=a.zb,k=f/e,l=h/d;return b===kj?(e=Math.min(l,k),e>c&&(e=c),e<a.$g&&(e=a.$g),e>a.Zg&&(e=a.Zg),e):b===lj?(e=l>k?(h-a.Bd)/d:(f-a.Bd)/e,e>c&&(e=c),e<a.$g&&(e=a.$g),e>a.Zg&&(e=a.Zg),e):a.scale}D.prototype.zoomToFit=D.prototype.zoomToFit=function(){this.scale=hj(this,kj)};D.prototype.zoomToRect=function(a,b){void 0===b&&(b=kj);var c=a.width,d=a.height;if(!(0===c||0===d||isNaN(c)&&isNaN(d))){var e=1;if(b===kj||b===lj){if(isNaN(c)){e=this.ob.height*this.scale/d}else{if(isNaN(d)){e=this.ob.width*this.scale/c}else{var e=this.Ab,f=this.zb,e=b===lj?f/d>e/c?(f-(this.qk?this.Bd:0))/d:(e-(this.rk?this.Bd:0))/c:Math.min(f/d,e/c)}}}this.scale=e;this.position=new w(a.x,a.y)}};u.defineProperty(D,{rz:null},function(){return this.Oc},function(a){this.Oc=a});D.prototype.alignDocument=function(a,b){this.fi&&jj(this,this.mg());var c=this.Ed,d=this.ob;this.position=new w(c.x+(a.x*c.width+a.offsetX)-(b.x*d.width-b.offsetX),c.y+(a.y*c.height+a.offsetY)-(b.y*d.height-b.offsetY))};function ij(a,b,c,d,e,f,h){var k=b.x,l=b.y;if(h||a.zE===Ni){f.Vc()&&(d>c.width&&(k=c.x+(f.x*c.width+f.offsetX)-(f.x*d-f.offsetX)),e>c.height&&(l=c.y+(f.y*c.height+f.offsetY)-(f.y*e-f.offsetY))),f=a.yE,h=d-c.width,d<c.width+f.left+f.right?(k=Math.min(k+d/2,c.right+Math.max(h,f.right)-d/2),k=Math.max(k,c.left-Math.max(h,f.left)+d/2),k-=d/2):k>c.left?k=c.left:k<c.right-d&&(k=c.right-d),d=e-c.height,e<c.height+f.top+f.bottom?(l=Math.min(l+e/2,c.bottom+Math.max(d,f.bottom)-e/2),l=Math.max(l,c.top-Math.max(d,f.top)+e/2),l-=e/2):l>c.top?l=c.top:l<c.bottom-e&&(l=c.bottom-e)}b.x=isFinite(k)?k:-a.padding.left;b.y=isFinite(l)?l:-a.padding.top;null!==a.hE&&(a=a.hE(a,b),b.x=a.x,b.y=a.y)}D.prototype.findPartAt=D.prototype.As=function(a,b){var c=b?wg(this,a,function(a){return a.W},function(a){return a.canSelect()}):wg(this,a,function(a){return a.W});return c instanceof G?c:null};D.prototype.findObjectAt=D.prototype.le=function(a,b,c){void 0===b&&(b=null);void 0===c&&(c=null);ej(this);for(var d=this.$b.Jm;d.next();){var e=d.value;if(e.visible&&(e=e.le(a,b,c),null!==e)){return e}}return null};function wg(a,b,c,d){void 0===c&&(c=null);void 0===d&&(d=null);ej(a);for(a=a.$b.Jm;a.next();){var e=a.value;if(e.visible&&!e.zc&&(e=e.le(b,c,d),null!==e)){return e}}return null}D.prototype.findObjectsAt=D.prototype.zs=function(a,b,c,d){void 0===b&&(b=null);void 0===c&&(c=null);d instanceof E||d instanceof F||(d=new F(T));ej(this);for(var e=this.$b.Jm;e.next();){var f=e.value;f.visible&&f.zs(a,b,c,d)}return d};D.prototype.findObjectsIn=D.prototype.Nj=function(a,b,c,d,e){void 0===b&&(b=null);void 0===c&&(c=null);void 0===d&&(d=!1);e instanceof E||e instanceof F||(e=new F(T));ej(this);for(var f=this.$b.Jm;f.next();){var h=f.value;h.visible&&h.Nj(a,b,c,d,e)}return e};D.prototype.ez=function(a,b,c,d,e,f){var h=new F(T); + ej(this);for(var k=this.$b.Jm;k.next();){var l=k.value;l.visible&&l.ez(a,b,c,d,h,e,f)}return h};D.prototype.findObjectsNear=D.prototype.Cm=function(a,b,c,d,e,f){void 0===c&&(c=null);void 0===d&&(d=null);void 0===e&&(e=!0);if(!1!==e&&!0!==e){if(e instanceof E||e instanceof F){f=e}e=!0}f instanceof E||f instanceof F||(f=new F(T));ej(this);for(var h=this.$b.Jm;h.next();){var k=h.value;k.visible&&k.Cm(a,b,c,d,e,f)}return f};function yf(a){-1!==a.nv&&(u.clearTimeout(a.nv),a.nv=-1)}function mj(a,b){var c=b.copy();a.nv=u.setTimeout(function(){c.button=2;a.N=c;a.mv=!0;a.doMouseUp()},850)}D.prototype.acceptEvent=function(a){var b=this.Ic;this.Ic=this.Pb;this.Pb=b;nj(this,this,a,b,a instanceof MouseEvent);return b};function nj(a,b,c,d,e){d.g=b;e?oj(a,c,d):(d.hf=b.Pb.hf,d.da=b.Pb.da);a=0;c.ctrlKey&&(a+=1);c.altKey&&(a+=2);c.shiftKey&&(a+=4);c.metaKey&&(a+=8);d.jd=a;d.button=c.button;u.Im&&0===c.button&&c.ctrlKey&&(d.button=2);d.Wk=!1;d.up=!1;d.Ue=1;d.Uk=0;d.Tc=!1;d.bubbles=!1;d.event=c;d.timestamp=Date.now();d.Qs=!1;d.Eg=c.target.Y?c.target.Y:null;d.qe=null}function pj(a,b,c,d,e){d.g=a;oj(a,c,d);d.jd=0;d.button=0;d.Wk=!0;d.up=!1;d.Ue=1;d.Uk=0;d.Tc=!1;d.bubbles=!0;d.event=b;d.timestamp=Date.now();d.Qs=e;d.Eg=b.target.Y?b.target.Y:null;d.qe=null;a.nk=d.copy();Ef=null}function qj(a,b,c,d,e){var f=null;d.g=a;if(null!==c){var f=window.document.elementFromPoint(c.clientX,c.clientY),h;f&&f.Y?h=f.Y:(c=b.changedTouches[0],h=a);oj(a,c,d)}else{null!==a.Ic?(d.da=a.Ic.da,d.hf=a.Ic.hf,d.Eg=a.Ic.Eg):null!==a.nk&&(d.da=a.nk.da,d.hf=a.nk.hf,d.Eg=a.nk.Eg)}d.jd=0;d.button=0;d.Wk=!1;d.up=!1;d.Ue=1;d.Uk=0;d.Tc=!1;d.bubbles=!1;d.event=b;d.timestamp=Date.now();d.Qs=e;d.Eg=h;d.qe=null}function rj(a,b){if(a.bubbles){return !0}void 0!==b.stopPropagation&&b.stopPropagation();(void 0===b.touches||2>b.touches.length)&&b.preventDefault();b.cancelBubble=!0;return !1}D.prototype.lH=function(a){if(!this.Y.isEnabled){return !1}var b=this.Y.Pb;nj(this.Y,this.Y,a,b,!1);b.key=String.fromCharCode(a.which);b.Wk=!0;switch(a.which){case 8:b.key="Backspace";break;case 33:b.key="PageUp";break;case 34:b.key="PageDown";break;case 35:b.key="End";break;case 36:b.key="Home";break;case 37:b.key="Left";break;case 38:b.key="Up";break;case 39:b.key="Right";break;case 40:b.key="Down";break;case 45:b.key="Insert";break;case 46:b.key="Del";break;case 48:b.key="0";break;case 187:case 61:case 107:b.key="Add";break;case 189:case 173:case 109:b.key="Subtract";break;case 27:b.key="Esc"}this.Y.doKeyDown();return 187!==a.which&&189!==a.which&&48!==a.which&&107!==a.which&&109!==a.which&&61!==a.which&&173!==a.which||!0!==a.ctrlKey?rj(b,a):(a.cancelBubble=!0,a.preventDefault(),a.stopPropagation(),!1)};D.prototype.mH=function(a){if(!this.Y.isEnabled){return !1}var b=this.Y.Pb;nj(this.Y,this.Y,a,b,!1);b.key=String.fromCharCode(a.which);b.up=!0;switch(a.which){case 8:b.key="Backspace";break;case 33:b.key="PageUp";break;case 34:b.key="PageDown";break;case 35:b.key="End";break;case 36:b.key="Home";break;case 37:b.key="Left";break;case 38:b.key="Up";break;case 39:b.key="Right";break;case 40:b.key="Down";break;case 45:b.key="Insert";break;case 46:b.key="Del";break;case 93:a.preventDefault()}this.Y.doKeyUp();return rj(b,a)};D.prototype.bq=function(a){var b=this.kb;if(null===b){return new w(0,0)}var c=this.Ab,d=this.zb,b=b.getBoundingClientRect(),c=a.clientX-c/b.width*b.left;a=a.clientY-d/b.height*b.top;return null!==this.Td?(a=new w(c,a),Wa(a,this.Td),a):new w(c,a)};function oj(a,b,c){var d=a.kb,e=a.Ab,f=a.zb,h=0,k=0;null!==d&&(d=d.getBoundingClientRect(),h=b.clientX-e/d.width*d.left,k=b.clientY-f/d.height*d.top);c.hf.m(h,k);null!==a.Td?(b=u.Yb(h,k),a.Td.Qh(b),c.da.assign(b),u.v(b)):c.da.m(h,k)}D.prototype.invalidateDocumentBounds=D.prototype.pc=function(){this.fi||(this.fi=!0,this.ee(!0))};function qi(a){a.xd||ej(a);a.fi&&jj(a,a.mg());for(a=a.Yl.i;a.next();){qi(a.value)}}D.prototype.redraw=D.prototype.Tz=function(){this.Oc||this.xd||(this.na(),sj(this),cj(this),this.pc(),this.df())};D.prototype.isUpdateRequested=function(){return this.Ff};D.prototype.delayInitialization=D.prototype.pG=function(a){void 0===a&&(a=null);var b=this.Mb,c=b.isEnabled;b.Ni();b.isEnabled=!1;Dg(this);this.nf=!1;b.isEnabled=c;null!==a&&u.setTimeout(a,1)};D.prototype.requestUpdate=D.prototype.ee=function(a){void 0===a&&(a=!1);if(!0!==this.Ff&&!(this.Oc||!1===a&&this.xd)){this.Ff=!0;var b=this;requestAnimationFrame(function(){b.Ff&&b.df()})}};D.prototype.maybeUpdate=D.prototype.df=function(){if(!this.wn||this.Ff){this.wn&&(this.wn=!1),Dg(this)}};function tj(a,b){a.Oc||!a.Ll||dj(a)||(b&&ej(a),gj(a,!1))}function Dg(a){if(!a.xd&&(a.Ff=!1,null!==a.Kb)){a.xd=!0;var b=a.oh,c=a.VB;if(!b.Hn&&0!==c.length){for(var d=c.n,e=d.length,f=0;f<e;f++){var h=d[f];uj(h,!1);h.S()}c.clear()}d=c=!1;b.Xg&&(d=!0,c=a.gb,a.gb=!0);b.cd||gi(a);tj(a,!1);null!==a.bd&&(a.bd.visible&&!a.mu&&(vj(a),a.mu=!0),!a.bd.visible&&a.mu&&(a.mu=!1));ej(a);0!==a.Il.count&&(wj(a),ej(a));e=!1;if(!a.nf||a.Pt){a.nf?xj(a,!a.eu):(a.Xb("Initial Layout"),!1===b.isEnabled&&b.Ni(),xj(a,!1)),e=!0 + }a.eu=!1;ej(a);a.yy||b.Xg||qi(a);e&&(a.nf||(b=a.$b.n,a.yf(b,b.length,a),yj(a),vj(a)),a.Ba("LayoutCompleted"));tj(a,!0);ej(a);e&&!a.nf&&(a.nf=!0,a.Xd("Initial Layout"),a.gb||a.ga.clear(),u.setTimeout(function(){a.Sh=!1},1));a.Xe();d&&(a.gb=c);a.xd=!1}}function yj(a){if(a.tk!==vf){a.scale=hj(a,a.tk)}else{if(a.Bl!==vf){a.scale=hj(a,a.Bl)}else{var b=a.VG;isFinite(b)&&0<b&&(a.scale=b)}}a.fi&&jj(a,a.mg());b=a.UG;if(b.I()){a.position=b}else{b=u.K();b.qt(a.Ed,a.TG);var c=a.ob,c=u.Vj(0,0,c.width,c.height),d=u.K();d.qt(c,a.WG);a.position=new w(b.x-d.x,b.y-d.y);u.ic(c);u.v(d);u.v(b);gj(a,!0)}a.Ba("InitialLayoutCompleted")}function ej(a){if((a.xd||!a.Mb.Xg)&&0!==a.Zf.count){for(var b=0;23>b;b++){var c=a.Zf.i;if(null===c||0===a.Zf.count){break}a.Zf=new F(T);var d=a,e=a.Zf;for(c.reset();c.next();){var f=c.value;!f.Hd()||f instanceof V||!f.Ia()||(f.hl()?(Ph(f,Infinity,Infinity),f.yc()):e.add(f))}for(c.reset();c.next();){f=c.value,f instanceof V&&f.Ia()&&zj(d,f)}for(c.reset();c.next();){f=c.value,f instanceof W&&(d=f,d.Ia()&&(d.hl()?(Ph(d,Infinity,Infinity),d.yc(),d.Ys()):e.add(d)))}for(c.reset();c.next();){d=c.value,d instanceof lf&&d.Ia()&&(d.hl()?(Ph(d,Infinity,Infinity),d.yc()):e.add(d))}}}}function zj(a,b){for(var c=u.hb(),d=u.hb(),e=b.Lc;e.next();){var f=e.value;f.Ia()&&(f instanceof V?(Aj(f)||Bj(f)||Cj(f))&&zj(a,f):f instanceof W?f.V==b||f.ba==b?d.push(f):c.push(f):(Ph(f,Infinity,Infinity),f.yc()))}for(var e=c.length,h=0;h<e;h++){f=c[h],Ph(f,Infinity,Infinity),f.yc()}u.sa(c);Ph(b,Infinity,Infinity);b.yc();e=d.length;for(h=0;h<e;h++){f=d[h],Ph(f,Infinity,Infinity),f.yc()}u.sa(d)}D.prototype.yf=function(a,b,c,d){var e=this.oh;if(this.uk||e.Xg){for(e=0;e<b;e++){a[e].yf(c,d)}}};D.prototype.Xe=function(a,b){void 0===a&&(a=this.Ig);void 0===b&&(b=null);null===this.Kb&&u.k("No div specified");var c=this.kb;null===c&&u.k("No canvas specified");if(this.oh.cd){0===this.ga.Me&&this.ee(!0)}else{Dj(this);var d=a!==this.Ig,e=this.$b.n,f=e.length,h=this;this.yf(e,f,h);if(d){$i(this,a),cj(this)}else{if(!this.Nd&&null===b){return}}var f=this.Na,k=this.ac,l=Math.round(f.x*k)/k,m=Math.round(f.y*k)/k,n=this.Td;n.reset();1!==k&&n.scale(k);0===f.x&&0===f.y||n.translate(-l,-m);k=this.pf;u.Hm?(c.width=c.width,$i(this,a),a.scale(k,k)):(a.setTransform(1,0,0,1,0,0),a.scale(k,k),a.clearRect(0,0,this.Ab,this.zb));a.miterLimit=9;a.setTransform(1,0,0,1,0,0);a.scale(k,k);a.transform(n.m11,n.m12,n.m21,n.m22,n.dx,n.dy);c=null!==b?function(c){var d=a,e=b;if(c.visible&&0!==c.Hc){1!==c.Hc&&(d.globalAlpha=c.Hc);var f=c.Wu;f.length=0;var k=h.scale;c=c.Db.n;for(var l=c.length,m=0;m<l;m++){var n=c[m];if((ti(n)||vi(n))&&!e.contains(n)){if(n instanceof W){var y=n;y.ec&&f.push(y);if(!1===y.jg){continue}}y=n.ca;1<y.width*k||1<y.height*k?n.Xe(d,h):wi(n,d)}}d.globalAlpha=1}}:function(b){b.Xe(a,h)};Ej(this,a);f=e.length;for(l=0;l<f;l++){a.setTransform(1,0,0,1,0,0),a.scale(k,k),a.transform(n.m11,n.m12,n.m21,n.m22,n.dx,n.dy),c(e[l])}this.sk?this.sk.xl(this)&&this.ax():this.bq=function(){return new w(0,0)};d?($i(this),cj(this)):this.Nd=this.uk=!1}};function Fj(a,b,c,d,e){null===a.Kb&&u.k("No div specified");var f=a.kb;null===f&&u.k("No canvas specified");var h=a.Ig;if(a.Nd){Dj(a);var k=a.pf;u.Hm?(f.width=f.width,$i(a,h)):(h.setTransform(1,0,0,1,0,0),h.clearRect(0,0,a.Ab*k,a.zb*k));h.GD=!1;h.drawImage(a.Fx.Fd,0<d?0:Math.round(-d),0<e?0:Math.round(-e));e=a.Na;var f=a.ac,l=Math.round(e.x*f)/f,m=Math.round(e.y*f)/f;d=a.Td;d.reset();1!==f&&d.scale(f);0===e.x&&0===e.y||d.translate(-l,-m);h.save();h.beginPath();e=c.length;for(f=0;f<e;f++){l=c[f],0!==l.width&&0!==l.height&&h.rect(Math.floor(l.x),Math.floor(l.y),Math.ceil(l.width),Math.ceil(l.height))}h.clip();h.setTransform(1,0,0,1,0,0);h.scale(k,k);h.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy);c=a.$b.n;e=c.length;a.yf(c,e,a);Ej(a,h);for(f=0;f<e;f++){xi(c[f],h,a,b)}h.restore();$i(a);a.sk?a.sk.xl(a)&&a.ax():a.bq=function(){return new w(0,0)};a.uk=!1;a.Nd=!1;a.iE()}}function Gj(a,b,c,d,e,f,h,k,l,m){null===a.Kb&&u.k("No div specified");null===a.kb&&u.k("No canvas specified");void 0===h&&(h=null);void 0===k&&(k=null);void 0===l&&(l=!1);void 0===m&&(m=!1);Dj(a);$i(a);cj(a);a.Ux=!0;var n=new z(f.x,f.y,d.width/e,d.height/e),p=n.copy();p.zv(c);vj(a,p);ej(a);var p=a.$b.n,q=p.length;a.yf(p,q,a,n);var r=a.pf;b.setTransform(1,0,0,1,0,0);b.scale(r,r);b.clearRect(0,0,d.width,d.height);null!==k&&""!==k&&(b.fillStyle=k,b.fillRect(0,0,d.width,d.height));d=u.lh();d.reset();d.translate(c.left,c.top);d.scale(e);0===f.x&&0===f.y||d.translate(-f.x,-f.y);b.setTransform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy);u.Ze(d);Ej(a,b);if(null!==h){var s=new F(T);c=h.i;for(c.reset();c.next();){e=c.value,!1===m&&"Grid"===e.layer.name||null===e||s.add(e)}c=function(c){var d=l;if(c.visible&&0!==c.Hc&&(void 0===d&&(d=!0),d||!c.zc)){1!==c.Hc&&(b.globalAlpha=c.Hc);d=c.Wu;d.length=0;var e=a.scale;c=c.Db.n;for(var f=c.length,h=0;h<f;h++){var k=c[h];if((ti(k)||vi(k))&&s.contains(k)){if(k instanceof W){var m=k;m.ec&&d.push(m);if(!1===m.jg){continue}}m=k.ca;1<m.width*e||1<m.height*e?k.Xe(b,a):wi(k,b) + }}b.globalAlpha=1}}}else{if(!l&&m){var t=a.Hs.W,v=t.layer;c=function(c){c===v?t.Xe(b,a):c.Xe(b,a,n,l,m)}}else{c=function(c){c.Xe(b,a,n,l,m)}}}for(e=0;e<q;e++){c(p[e])}a.Ux=!1;a.sk?a.sk.xl(a)&&a.ax():a.bq=function(){return new w(0,0)};$i(a);cj(a);a.yf(p,q,a);vj(a)}D.prototype.getRenderingHint=D.prototype.$v=function(a){return this.Sg[a]};D.prototype.setRenderingHint=D.prototype.kI=function(a,b){this.Sg[a]=b;this.Tz()};D.prototype.resetRenderingHints=D.prototype.rE=function(){this.Sg=new pa;this.Sg.drawShadows=!0;this.Sg.textGreeking=!0;this.Sg.viewportOptimizations=u.ND?!1:!0;this.Sg.temporaryPixelRatio=!0;this.Sg.pictureRatioOptimization=!0};function Ej(a,b){var c=a.Sg;if(null!==c){if(void 0!==c.imageSmoothingEnabled){var d=!!c.imageSmoothingEnabled;b.GD=d;b.dK=d}c=c.defaultFont;void 0!==c&&null!==c&&(b.font=c,b.Ft=c)}}D.prototype.getInputOption=D.prototype.hz=function(a){return this.fq[a]};D.prototype.setInputOption=function(a,b){this.fq[a]=b};D.prototype.resetInputOptions=D.prototype.qE=function(){this.fq=new pa;this.fq.extraTouchArea=10;this.fq.extraTouchThreshold=10};D.prototype.setProperties=function(a){u.pt(this,a)};function wj(a){if(0===a.ga.Me){for(var b=a.Il.i;b.next();){var c=b.key,d=b.value;c.me();eh(c,d)}a.Il.clear()}}D.prototype.na=function(a){void 0===a&&(a=null);if(null===a){this.Nd=!0,this.ee()}else{var b=this.ob;null!==a&&a.I()&&b.ug(a)&&(this.Nd=!0,this.ee())}for(b=this.Yl.i;b.next();){b.value.na(a)}};D.prototype.oz=function(a,b){if(!0!==this.Nd){this.Nd=!0;var c=!0===this.$v("temporaryPixelRatio");if(!0===this.$v("viewportOptimizations")&&this.zE!==Hj&&this.yE.Tv(0,0,0,0)&&b.width===a.width&&b.height===a.height){var d=this.scale,e=u.Tf(),f=Math.max(a.x,b.x),h=Math.max(a.y,b.y),k=Math.min(a.x+a.width,b.x+b.width),l=Math.min(a.y+a.height,b.y+b.height);e.x=f;e.y=h;e.width=Math.max(0,k-f)*d;e.height=Math.max(0,l-h)*d;if(0<e.width&&0<e.height){if(!this.xd&&(this.Ff=!1,null!==this.Kb)){this.xd=!0;ej(this);0!==this.Il.count&&(wj(this),ej(this));this.Ed.I()||jj(this,this.mg());var m=this.kb;if(null!==m){var n=this.pf,h=this.Ab*n,k=this.zb*n,f=this.scale*n,d=Math.round(Math.round(b.x*f)-Math.round(a.x*f)),f=Math.round(Math.round(b.y*f)-Math.round(a.y*f)),l=this.Fx,p=this.dB;l.width!==h&&(l.width=h);l.height!==k&&(l.height=k);p.clearRect(0,0,h,k);var l=190*this.pf,q=70*this.pf,r=Math.max(d,0),s=Math.max(f,0),t=Math.floor(h-r),v=Math.floor(k-s);p.GD=!1;p.drawImage(m.Fd,r,s,t,v,0,0,t,v);this.sk.xl(this)&&p.clearRect(0,0,l,q);var m=u.hb(),p=u.hb(),v=Math.abs(d),t=Math.abs(f),x=0===r?0:h-v,r=u.Yb(x,0),v=u.Yb(v+x,k);p.push(new z(Math.min(r.x,v.x),Math.min(r.y,v.y),Math.abs(r.x-v.x),Math.abs(r.y-v.y)));var A=this.Td;A.reset();A.scale(n,n);1!==this.ac&&A.scale(this.ac);n=this.Na;(0!==n.x||0!==n.y)&&isFinite(n.x)&&isFinite(n.y)&&A.translate(-n.x,-n.y);Wa(r,A);Wa(v,A);m.push(new z(Math.min(r.x,v.x),Math.min(r.y,v.y),Math.abs(r.x-v.x),Math.abs(r.y-v.y)));x=0===s?0:k-t;r.m(0,x);v.m(h,t+x);p.push(new z(Math.min(r.x,v.x),Math.min(r.y,v.y),Math.abs(r.x-v.x),Math.abs(r.y-v.y)));Wa(r,A);Wa(v,A);m.push(new z(Math.min(r.x,v.x),Math.min(r.y,v.y),Math.abs(r.x-v.x),Math.abs(r.y-v.y)));this.sk.xl(this)&&(h=0<d?0:-d,k=0<f?0:-f,r.m(h,k),v.m(l+h,q+k),p.push(new z(Math.min(r.x,v.x),Math.min(r.y,v.y),Math.abs(r.x-v.x),Math.abs(r.y-v.y))),Wa(r,A),Wa(v,A),m.push(new z(Math.min(r.x,v.x),Math.min(r.y,v.y),Math.abs(r.x-v.x),Math.abs(r.y-v.y))));u.v(r);u.v(v);tj(this,!1);Fj(this,m,p,d,f);u.sa(m);u.sa(p);this.xd=!1}}}else{this.df()}u.ic(e);c&&(this.mm=1,this.df(),ki(this,!0))}else{c?(this.mm=1,this.df(),ki(this,!0)):this.df()}for(c=this.Yl.i;c.next();){c.value.oz()}}};function sj(a){!1===a.Ll&&(a.Ll=!0)}function cj(a){!1===a.uk&&(a.uk=!0)}function Dj(a){!1!==a.hq&&(a.hq=!1,Ij(a,a.Ab,a.zb))}function Ij(a,b,c){var d=a.kb,e=a.pf,f=b*e,e=c*e;if(d.width!==f||d.height!==e){d.width=f,d.height=e,d.style.width=b+"px",d.style.height=c+"px",a.Nd=!0,$i(a)}}function dj(a){var b=a.kb;if(null===b){return !0}var c=a.Kb,d=a.Ab,e=a.zb,f=a.CC.copy(),h=!1,k=a.rk?a.Bd:0,l=a.qk?a.Bd:0,m=c.clientWidth||d+k,c=c.clientHeight||e+l;if(m!==d+k||c!==e+l){a.rk=!1,a.qk=!1,l=k=0,a.Ab=m,a.zb=c,h=a.hq=!0}a.Ll=!1;if(a.Mb.Xg){return h?(a.Mb.Ni(),a.pG(),!1):!0}var n=a.ob,p=a.Ed,m=p.width,c=p.height,q=n.width,r=n.height,s=p.x,t=n.x,v=p.right,k=n.right+k,x=p.y,A=n.y,p=p.bottom,l=n.bottom+l,y=n="1px",C=a.scale;a.lz&&a.Se&&(n=1,s+1<t&&(n=Math.max((t-s)*C+a.Ab,n)),v>k+1&&(n=Math.max((v-k)*C+a.Ab,n)),q+1<m&&(n=Math.max((m-q)*C+a.Ab,n)),n+="px");a.mz&&a.Te&&(y=1,x+1<A&&(y=Math.max((A-x)*C+a.zb,y)),p>l+1&&(y=Math.max((p-l)*C+a.zb,y)),r+1<c&&(y=Math.max((c-r)*C+a.zb,y)),y+="px");var I="1px"!==n,H="1px"!==y;if((!I||!H)&&I||H){H&&(k-=a.Bd),I&&(l-=a.Bd),a.lz&&a.Se&&(n=1,s+1<t&&(n=Math.max((t-s)*C+a.Ab,n)),v>k+1&&(n=Math.max((v-k)*C+a.Ab,n)),q+1<m&&(n=Math.max((m-q)*C+a.Ab,n)),n+="px"),a.mz&&a.Te&&(y=1,x+1<A&&(y=Math.max((A-x)*C+a.zb,y)),p>l+1&&(y=Math.max((p-l)*C+a.zb,y)),r+1<c&&(y=Math.max((c-r)*C+a.zb,y)),y+="px"),I="1px"!==n,H="1px"!==y}if(a.av&&I===a.qk&&H===a.rk){return d===a.Ab&&e===a.zb||a.df(),!1 + }I!==a.qk&&(a.zb="1px"===n?a.zb+a.Bd:Math.max(a.zb-a.Bd,1),h=!0);a.qk=I;a.uy.style.width=n;H!==a.rk&&(a.Ab="1px"===y?a.Ab+a.Bd:Math.max(a.Ab-a.Bd,1),h=!0,a.wB&&(H?(b.style.left=a.Bd+"px",a.position=new w(a.Na.x+a.Bd/a.scale,a.Na.y)):(b.style.left="0px",a.position=new w(a.Na.x-a.Bd/a.scale,a.Na.y))));a.rk=H;a.vy.style.height=y;a.lz&&a.Se&&(q+1<m?a.uj.scrollLeft=(a.position.x-s)*C:s+1<t?a.uj.scrollLeft=a.uj.scrollWidth-a.uj.clientWidth:v>k+1&&(a.uj.scrollLeft=a.position.x*C));a.mz&&a.Te&&(r+1<c?a.vj.scrollTop=(a.position.y-x)*C:x+1<A?a.vj.scrollTop=a.vj.scrollHeight-a.vj.clientHeight:p>l+1&&(a.vj.scrollTop=a.position.y*C));h&&(a.hq=!0);m=a.Ab;c=a.zb;a.vj.style.height=c+"px";a.vj.style.width=m+(a.rk?a.Bd:0)+"px";a.uj.style.width=m+"px";a.uj.style.height=c+(a.qk?a.Bd:0)+"px";a.ty=!1;return d!==m||e!==c||a.Mb.cd?(n=a.ob,a.et(f,n,h),!1):!0}D.prototype.add=D.prototype.add=function(a){u.C(a,G,D,"add:part");var b=a.g;if(b!==this){null!==b&&u.k("Cannot add part "+a.toString()+" to "+this.toString()+". It is already a part of "+b.toString());this.Ym&&(a.wk="Tool");var c=a.xf,b=this.xs(c);null===b&&(b=this.xs(""));null===b&&u.k('Cannot add a Part when unable find a Layer named "'+c+'" and there is no default Layer');a.layer!==b&&(c=b.Ho(99999999,a,a.g===this),0<=c&&this.Cc(be,"parts",b,null,a,null,c),b.zc||this.pc(),a.H(Jj),c=a.Ss,null!==c&&c(a,null,b))}};D.prototype.Ho=function(a){if(a instanceof U){if(this.Tn.add(a),a instanceof V){var b=a.Sa;null===b?this.Ik.add(a):b.Rn.add(a);b=a.Qb;null!==b&&(b.g=this)}}else{a instanceof W?this.Pn.add(a):a instanceof lf||this.Db.add(a)}var c=this;Kj(a,function(a){Lj(c,a)});a.Ib&&a.S();b=a.data;null!==b&&(a instanceof lf||(a instanceof W?this.lk.add(b,a):this.ai.add(b,a)),Kj(a,function(a){Mj(c,a)}));!0!==Bj(a)&&!0!==Cj(a)||this.Zf.add(a);Nj(a,!0,this);Oj(a)?(a.ca.I()&&this.na(Ki(a,a.ca)),this.pc()):a.Ia()&&a.ca.I()&&this.na(Ki(a,a.ca));this.ee()};D.prototype.Ge=function(a){a.ns();if(a instanceof U){if(this.Tn.remove(a),a instanceof V){var b=a.Sa;null===b?this.Ik.remove(a):b.Rn.remove(a);b=a.Qb;null!==b&&(b.g=null)}}else{a instanceof W?this.Pn.remove(a):a instanceof lf||this.Db.remove(a)}var c=this;Kj(a,function(a){Pj(c,a)});b=a.data;null!==b&&(a instanceof lf||(a instanceof W?this.lk.remove(b):this.ai.remove(b)),Kj(a,function(a){Qj(c,a)}));this.Zf.remove(a);Oj(a)?(a.ca.I()&&this.na(Ki(a,a.ca)),this.pc()):a.Ia()&&a.ca.I()&&this.na(Ki(a,a.ca));this.ee()};D.prototype.remove=D.prototype.remove=function(a){u.C(a,G,D,"remove:part");a.$a=!1;a.Yg=!1;var b=a.layer;if(null!==b&&b.g===this){a.H(Rj);a.Bm();var c=b.Ge(-1,a,!1);0<=c&&this.Cc(ce,"parts",b,a,null,c,null);c=a.Ss;null!==c&&c(a,b,null)}};D.prototype.removeParts=D.prototype.Xz=function(a,b){if(u.isArray(a)){for(var c=u.qb(a),d=0;d<c;d++){var e=u.ib(a,d);b&&!e.canDelete()||this.remove(e)}}else{for(e=new F(G),e.Ud(a),c=e.i;c.next();){e=c.value,b&&!e.canDelete()||this.remove(e)}}};D.prototype.copyParts=D.prototype.vo=function(a,b,c){return this.Eb.vo(a,b,c)};D.prototype.moveParts=D.prototype.moveParts=function(a,b,c){u.C(b,w,D,"moveParts:offset");var d=this.tb;if(null!==d){d=d.Gd;null===d&&(d=new uf,d.Dc(this));var e=new la(G,Object);if(null!==a){a=a.i}else{for(a=this.Sj;a.next();){Hf(d,e,a.value,c)}for(a=this.Ag;a.next();){Hf(d,e,a.value,c)}a=this.links}for(;a.next();){Hf(d,e,a.value,c)}d.moveParts(e,b,c)}};function Sj(a,b,c){u.C(b,we,D,"addLayer:layer");null!==b.g&&b.g!==a&&u.k("Cannot share a Layer with another Diagram: "+b+" of "+b.g);null===c?null!==b.g&&u.k("Cannot add an existing Layer to this Diagram again: "+b):(u.C(c,we,D,"addLayer:existingLayer"),c.g!==a&&u.k("Existing Layer must be in this Diagram: "+c+" not in "+c.g),b===c&&u.k("Cannot move a Layer before or after itself: "+b));if(b.g!==a){b=b.name;a=a.$b;c=a.count;for(var d=0;d<c;d++){a.ja(d).name===b&&u.k("Cannot add Layer with the name '"+b+"'; a Layer with the same name is already present in this Diagram.")}}}D.prototype.addLayer=D.prototype.es=function(a){Sj(this,a,null);a.Dc(this);var b=this.$b,c=b.count-1;if(!a.zc){for(;0<=c&&b.ja(c).zc;){c--}}b.Zd(c+1,a);null!==this.Pd&&this.Cc(be,"layers",this,null,a,null,c+1);this.na();this.pc()};D.prototype.addLayerBefore=D.prototype.MF=function(a,b){Sj(this,a,b);a.Dc(this);var c=this.$b,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.Pd&&this.Cc(ce,"layers",this,a,null,d,null));for(var e=c.count,f=0;f<e;f++){if(c.ja(f)===b){c.Zd(f,a);break}}null!==this.Pd&&this.Cc(be,"layers",this,null,a,null,f);this.na();0>d&&this.pc()};D.prototype.addLayerAfter=function(a,b){Sj(this,a,b);a.Dc(this);var c=this.$b,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.Pd&&this.Cc(ce,"layers",this,a,null,d,null));for(var e=c.count,f=0;f<e;f++){if(c.ja(f)===b){c.Zd(f+1,a);break}}null!==this.Pd&&this.Cc(be,"layers",this,null,a,null,f+1);this.na();0>d&&this.pc()};D.prototype.removeLayer=function(a){u.C(a,we,D,"removeLayer:layer");a.g!==this&&u.k("Cannot remove a Layer from another Diagram: "+a+" of "+a.g);if(""!==a.name){var b=this.$b,c=b.indexOf(a);if(b.remove(a)){for(b=a.Db.copy().i; + b.next();){var d=b.value,e=d.xf;d.xf=e!==a.name?e:""}null!==this.Pd&&this.Cc(ce,"layers",this,a,null,c,null);this.na();this.pc()}}};D.prototype.findLayer=D.prototype.xs=function(a){for(var b=this.nw;b.next();){var c=b.value;if(c.name===a){return c}}return null};D.prototype.addChangedListener=D.prototype.Ly=function(a){u.j(a,"function",D,"addChangedListener:listener");null===this.Ui&&(this.Ui=new E("function"));this.Ui.add(a)};D.prototype.removeChangedListener=D.prototype.Uz=function(a){u.j(a,"function",D,"removeChangedListener:listener");null!==this.Ui&&(this.Ui.remove(a),0===this.Ui.count&&(this.Ui=null))};D.prototype.Kv=function(a){this.gb||this.ga.ED(a);a.Cd!==ae&&(this.Sh=!0);if(null!==this.Ui){var b=this.Ui,c=b.length;if(1===c){b=b.ja(0),b(a)}else{if(0!==c){for(var d=b.Le(),e=0;e<c;e++){b=d[e],b(a)}}}}};D.prototype.raiseChangedEvent=D.prototype.Cc=function(a,b,c,d,e,f,h){void 0===f&&(f=null);void 0===h&&(h=null);var k=new Od;k.g=this;k.Cd=a;k.propertyName=b;k.object=c;k.oldValue=d;k.Bg=f;k.newValue=e;k.zg=h;this.Kv(k)};D.prototype.raiseChanged=D.prototype.h=function(a,b,c,d,e){this.Cc($d,a,this,b,c,d,e)};u.u(D,{Mb:"animationManager"},function(){return this.oh});u.u(D,{ga:"undoManager"},function(){return this.Pd.ga});u.defineProperty(D,{gb:"skipsUndoManager"},function(){return this.ri},function(a){u.j(a,"boolean",D,"skipsUndoManager");this.ri=a;this.Pd.ri=a});u.defineProperty(D,{bz:"delaysLayout"},function(){return this.Bx},function(a){this.Bx=a});D.prototype.tm=function(a,b){if(null!==a&&a.g===this){var c=a.Cd;if(c===$d){var d=a.object,c=a.propertyName,e=a.ua(b);u.Pa(d,c,e);d instanceof T&&(d=d.W,null!==d&&d.$d());this.Sh=!0}else{if(c===be){e=a.object;c=a.zg;d=a.newValue;if(e instanceof B){if("number"===typeof c&&d instanceof T){var f=e;b?f.Ge(c):f.Zd(c,d);d=e.W;null!==d&&d.$d()}else{"number"===typeof c&&d instanceof Se&&(f=e,b?d.be?f.pE(c):f.lE(c):(c=d.be?f.hd(d.index):f.gd(d.index),c.ss(d)))}}else{e instanceof we?(f=!0===a.Bg,"number"===typeof c&&d instanceof G&&(b?(d.$d(),e.Ge(f?c:-1,d,f)):e.Ho(c,d,f))):e instanceof D?"number"===typeof c&&d instanceof we&&(e=d,b?this.$b.kd(c):(e.Dc(this),this.$b.Zd(c,e))):u.k("unknown ChangedEvent.Insert object: "+a.toString())}this.Sh=!0}else{c===ce?(e=a.object,c=a.Bg,d=a.oldValue,e instanceof B?"number"===typeof c&&d instanceof T?(f=e,b?f.Zd(c,d):f.Ge(c)):"number"===typeof c&&d instanceof Se&&(f=e,b?(c=d.be?f.hd(d.index):f.gd(d.index),c.ss(d)):d.be?f.pE(c):f.lE(c)):e instanceof we?(f=!0===a.zg,"number"===typeof c&&d instanceof G&&(b?e.Ho(c,d,f):(d.$d(),e.Ge(f?c:-1,d,f)))):e instanceof D?"number"===typeof c&&d instanceof we&&(e=d,b?(e.Dc(this),this.$b.Zd(c,e)):this.$b.kd(c)):u.k("unknown ChangedEvent.Remove object: "+a.toString()),this.Sh=!0):c!==ae&&u.k("unknown ChangedEvent: "+a.toString())}}}};D.prototype.startTransaction=D.prototype.Xb=function(a){return this.ga.Xb(a)};D.prototype.commitTransaction=D.prototype.Xd=function(a){return this.ga.Xd(a)};D.prototype.rollbackTransaction=D.prototype.cp=function(){return this.ga.cp()};D.prototype.updateAllTargetBindings=D.prototype.FI=function(a){void 0===a&&(a="");for(var b=this.Sj;b.next();){b.value.Ob(a)}for(b=this.Ag;b.next();){b.value.Ob(a)}for(b=this.links;b.next();){b.value.Ob(a)}};D.prototype.updateAllRelationshipsFromData=function(){for(var a=this.Sj;a.next();){a.value.updateRelationshipsFromData()}for(a=this.Ag;a.next();){a.value.updateRelationshipsFromData()}for(a=this.links;a.next();){a.value.updateRelationshipsFromData()}};function Yj(a,b,c){if(a.Oc||a.xd){a.ac=c}else{if(a.Oc=!0,null===a.kb){a.ac=c}else{var d=a.ob.copy(),e=a.Ab,f=a.zb;d.width=a.Ab/b;d.height=a.zb/b;var h=a.yl.x,k=a.yl.y,l=a.cD;isNaN(h)&&(l.jl()?l.cw(Xb)?h=0:l.cw(Yb)&&(h=e-1):h=l.Vc()?l.x*(e-1):e/2);isNaN(k)&&(l.jl()?l.cw(Wb)?k=0:l.cw(Zb)&&(k=f-1):k=l.Vc()?l.y*(f-1):f/2);null!==a.xE&&(c=a.xE(a,c));c<a.$g&&(c=a.$g);c>a.Zg&&(c=a.Zg);b=u.Yb(a.Na.x+h/b-h/c,a.Na.y+k/b-k/c);a.position=b;u.v(b);a.ac=c;a.et(d,a.ob);a.Oc=!1;gj(a,!1);a.na();sj(a)}}}D.prototype.et=function(a,b,c){void 0===c&&(c=!1);c||sj(this);cj(this);var d=this.Qb;null===d||!d.kw||c||a.width===b.width&&a.height===b.height||d.H();d=this.Va;!0===this.Nl&&d instanceof jf&&(this.N.da=this.XE(this.N.hf),d.doMouseMove());this.oz(a,b);vj(this);this.Ba("ViewportBoundsChanged",c?u.nh:null,a)};function vj(a,b){void 0===b&&(b=null);var c=a.bd;if(null!==c&&c.visible){for(var d=u.vl(),e=1,f=1,h=c.Aa.n,k=h.length,l=0;l<k;l++){var m=h[l],n=m.interval;2>n||(hk(m.Fb)?f=f*n/K.yD(f,n):e=e*n/K.yD(e,n))}h=c.aw;d.m(f*h.width,e*h.height);h=f=l=k=0;if(null!==b){k=b.width,l=b.height,f=b.x,h=b.y}else{e=u.Tf();f=a.ob;e.m(f.x,f.y,f.width,f.height);for(h=a.Yl.i;h.next();){f=h.value.ob,f.I()&&kb(e,f.x,f.y,f.width,f.height)}k=e.width;l=e.height;f=e.x;h=e.y;if(!e.I()){return}}c.width=k+2*d.width;c.height=l+2*d.height;e=u.K();K.ys(f,h,0,0,d.width,d.height,e);e.offset(-d.width,-d.height);u.Oj(d);c.W.location=e;u.v(e)}}D.prototype.clearSelection=D.prototype.Mv=function(){var a=0<this.selection.count;a&&this.Ba("ChangingSelection"); + of(this);a&&this.Ba("ChangedSelection")};function of(a){a=a.selection;if(0<a.count){for(var b=a.Le(),c=b.length,d=0;d<c;d++){b[d].$a=!1}a.Ma();a.clear();a.freeze()}}D.prototype.select=D.prototype.select=function(a){null!==a&&(u.C(a,G,D,"select:part"),a.layer.g===this&&(!a.$a||1<this.selection.count)&&(this.Ba("ChangingSelection"),of(this),a.$a=!0,this.Ba("ChangedSelection")))};D.prototype.selectCollection=D.prototype.DE=function(a){this.Ba("ChangingSelection");of(this);if(u.isArray(a)){for(var b=u.qb(a),c=0;c<b;c++){var d=u.ib(a,c);d instanceof G||u.k("Diagram.selectCollection given something that is not a Part: "+d);d.$a=!0}}else{for(a=a.i;a.next();){d=a.value,d instanceof G||u.k("Diagram.selectCollection given something that is not a Part: "+d),d.$a=!0}}this.Ba("ChangedSelection")};D.prototype.clearHighlighteds=D.prototype.WC=function(){var a=this.bw;if(0<a.count){for(var b=a.Le(),c=b.length,d=0;d<c;d++){b[d].Yg=!1}a.Ma();a.clear();a.freeze()}};D.prototype.highlight=function(a){null!==a&&a.layer.g===this&&(u.C(a,G,D,"highlight:part"),!a.Yg||1<this.bw.count)&&(this.WC(),a.Yg=!0)};D.prototype.highlightCollection=function(a){this.WC();if(u.isArray(a)){for(var b=u.qb(a),c=0;c<b;c++){var d=u.ib(a,c);d instanceof G||u.k("Diagram.highlightCollection given something that is not a Part: "+d);d.Yg=!0}}else{for(a=a.i;a.next();){d=a.value,d instanceof G||u.k("Diagram.highlightCollection given something that is not a Part: "+d),d.Yg=!0}}};D.prototype.scroll=D.prototype.scroll=function(a,b,c){void 0===c&&(c=1);var d="up"===b||"down"===b,e=0;"pixel"===a?e=c:"line"===a?e=c*(d?this.nt:this.mt):"page"===a?(a=d?this.ob.height:this.ob.width,a*=this.scale,0!==a&&(e=Math.max(a-(d?this.nt:this.mt),0),e*=c)):u.k("scrolling unit must be 'pixel', 'line', or 'page', not: "+a);e/=this.scale;c=this.position.copy();"up"===b?c.y=this.position.y-e:"down"===b?c.y=this.position.y+e:"left"===b?c.x=this.position.x-e:"right"===b?c.x=this.position.x+e:u.k("scrolling direction must be 'up', 'down', 'left', or 'right', not: "+b);this.position=c};D.prototype.scrollToRect=D.prototype.eI=function(a){var b=this.ob;b.Kj(a)||(a=a.Ok,a.x-=b.width/2,a.y-=b.height/2,this.position=a)};D.prototype.centerRect=function(a){var b=this.ob;a=a.Ok;a.x-=b.width/2;a.y-=b.height/2;this.position=a};D.prototype.transformDocToView=D.prototype.VE=function(a){var b=this.Td;b.reset();1!==this.ac&&b.scale(this.ac);var c=this.Na;(0!==c.x||0!==c.y)&&isFinite(c.x)&&isFinite(c.y)&&b.translate(-c.x,-c.y);return a.copy().transform(this.Td)};D.prototype.transformViewToDoc=D.prototype.XE=function(a){var b=this.Td;b.reset();1!==this.ac&&b.scale(this.ac);var c=this.Na;(0!==c.x||0!==c.y)&&isFinite(c.x)&&isFinite(c.y)&&b.translate(-c.x,-c.y);return Wa(a.copy(),this.Td)};var vf;D.None=vf=u.s(D,"None",0);var kj;D.Uniform=kj=u.s(D,"Uniform",1);var lj;D.UniformToFill=lj=u.s(D,"UniformToFill",2);var Hg;D.CycleAll=Hg=u.s(D,"CycleAll",10);var Lg;D.CycleNotDirected=Lg=u.s(D,"CycleNotDirected",11);var Vg;D.CycleNotDirectedFast=Vg=u.s(D,"CycleNotDirectedFast",12);var Wg;D.CycleNotUndirected=Wg=u.s(D,"CycleNotUndirected",13);var Ig;D.CycleDestinationTree=Ig=u.s(D,"CycleDestinationTree",14);var Kg;D.CycleSourceTree=Kg=u.s(D,"CycleSourceTree",15);var Ni;D.DocumentScroll=Ni=u.s(D,"DocumentScroll",1);var Hj;D.InfiniteScroll=Hj=u.s(D,"InfiniteScroll",2);u.defineProperty(D,{GI:"validCycle"},function(){return this.tv},function(a){var b=this.tv;b!==a&&(u.rb(a,D,D,"validCycle"),this.tv=a,this.h("validCycle",b,a))});u.defineProperty(D,{pw:"linkSpacing"},function(){return this.gj},function(a){var b=this.gj;b!==a&&(u.Be(a,D,"linkSpacing"),0>a&&u.xa(a,">= zero",D,"linkSpacing"),this.gj=a,this.h("linkSpacing",b,a))});u.u(D,{nw:"layers"},function(){return this.$b.i});u.defineProperty(D,{vf:"isModelReadOnly"},function(){var a=this.Pd;return null===a?!1:a.nb},function(a){var b=this.Pd;null!==b&&(b.nb=a)});u.defineProperty(D,{nb:"isReadOnly"},function(){return this.vk},function(a){var b=this.vk;b!==a&&(u.j(a,"boolean",D,"isReadOnly"),this.vk=a,this.h("isReadOnly",b,a))});u.defineProperty(D,{isEnabled:"isEnabled"},function(){return this.Oe},function(a){var b=this.Oe;b!==a&&(u.j(a,"boolean",D,"isEnabled"),this.Oe=a,this.h("isEnabled",b,a))});u.defineProperty(D,{Oy:"allowClipboard"},function(){return this.Ht},function(a){var b=this.Ht;b!==a&&(u.j(a,"boolean",D,"allowClipboard"),this.Ht=a,this.h("allowClipboard",b,a))});u.defineProperty(D,{Ij:"allowCopy"},function(){return this.Xj},function(a){var b=this.Xj;b!==a&&(u.j(a,"boolean",D,"allowCopy"),this.Xj=a,this.h("allowCopy",b,a))});u.defineProperty(D,{pm:"allowDelete"},function(){return this.Yj},function(a){var b=this.Yj;b!==a&&(u.j(a,"boolean",D,"allowDelete"),this.Yj=a,this.h("allowDelete",b,a))});u.defineProperty(D,{Bv:"allowDragOut"},function(){return this.It},function(a){var b=this.It;b!==a&&(u.j(a,"boolean",D,"allowDragOut"),this.It=a,this.h("allowDragOut",b,a))});u.defineProperty(D,{MC:"allowDrop"},function(){return this.Jt},function(a){var b=this.Jt;b!==a&&(u.j(a,"boolean",D,"allowDrop"),this.Jt=a,this.h("allowDrop",b,a)) + });u.defineProperty(D,{Fv:"allowTextEdit"},function(){return this.gk},function(a){var b=this.gk;b!==a&&(u.j(a,"boolean",D,"allowTextEdit"),this.gk=a,this.h("allowTextEdit",b,a))});u.defineProperty(D,{Cv:"allowGroup"},function(){return this.Zj},function(a){var b=this.Zj;b!==a&&(u.j(a,"boolean",D,"allowGroup"),this.Zj=a,this.h("allowGroup",b,a))});u.defineProperty(D,{Gv:"allowUngroup"},function(){return this.hk},function(a){var b=this.hk;b!==a&&(u.j(a,"boolean",D,"allowUngroup"),this.hk=a,this.h("allowUngroup",b,a))});u.defineProperty(D,{no:"allowInsert"},function(){return this.Lt},function(a){var b=this.Lt;b!==a&&(u.j(a,"boolean",D,"allowInsert"),this.Lt=a,this.h("allowInsert",b,a))});u.defineProperty(D,{js:"allowLink"},function(){return this.$j},function(a){var b=this.$j;b!==a&&(u.j(a,"boolean",D,"allowLink"),this.$j=a,this.h("allowLink",b,a))});u.defineProperty(D,{qm:"allowRelink"},function(){return this.bk},function(a){var b=this.bk;b!==a&&(u.j(a,"boolean",D,"allowRelink"),this.bk=a,this.h("allowRelink",b,a))});u.defineProperty(D,{Nk:"allowMove"},function(){return this.ak},function(a){var b=this.ak;b!==a&&(u.j(a,"boolean",D,"allowMove"),this.ak=a,this.h("allowMove",b,a))});u.defineProperty(D,{Dv:"allowReshape"},function(){return this.ck},function(a){var b=this.ck;b!==a&&(u.j(a,"boolean",D,"allowReshape"),this.ck=a,this.h("allowReshape",b,a))});u.defineProperty(D,{ks:"allowResize"},function(){return this.dk},function(a){var b=this.dk;b!==a&&(u.j(a,"boolean",D,"allowResize"),this.dk=a,this.h("allowResize",b,a))});u.defineProperty(D,{Ev:"allowRotate"},function(){return this.ek},function(a){var b=this.ek;b!==a&&(u.j(a,"boolean",D,"allowRotate"),this.ek=a,this.h("allowRotate",b,a))});u.defineProperty(D,{qf:"allowSelect"},function(){return this.fk},function(a){var b=this.fk;b!==a&&(u.j(a,"boolean",D,"allowSelect"),this.fk=a,this.h("allowSelect",b,a))});u.defineProperty(D,{NC:"allowUndo"},function(){return this.Mt},function(a){var b=this.Mt;b!==a&&(u.j(a,"boolean",D,"allowUndo"),this.Mt=a,this.h("allowUndo",b,a))});u.defineProperty(D,{Hv:"allowZoom"},function(){return this.Ot},function(a){var b=this.Ot;b!==a&&(u.j(a,"boolean",D,"allowZoom"),this.Ot=a,this.h("allowZoom",b,a))});u.defineProperty(D,{mz:"hasVerticalScrollbar"},function(){return this.ru},function(a){var b=this.ru;b!==a&&(u.j(a,"boolean",D,"hasVerticalScrollbar"),this.ru=a,sj(this),this.na(),this.h("hasVerticalScrollbar",b,a),gj(this,!1))});u.defineProperty(D,{lz:"hasHorizontalScrollbar"},function(){return this.qu},function(a){var b=this.qu;b!==a&&(u.j(a,"boolean",D,"hasHorizontalScrollbar"),this.qu=a,sj(this),this.na(),this.h("hasHorizontalScrollbar",b,a),gj(this,!1))});u.defineProperty(D,{Se:"allowHorizontalScroll"},function(){return this.Kt},function(a){var b=this.Kt;b!==a&&(u.j(a,"boolean",D,"allowHorizontalScroll"),this.Kt=a,this.h("allowHorizontalScroll",b,a),gj(this,!1))});u.defineProperty(D,{Te:"allowVerticalScroll"},function(){return this.Nt},function(a){var b=this.Nt;b!==a&&(u.j(a,"boolean",D,"allowVerticalScroll"),this.Nt=a,this.h("allowVerticalScroll",b,a),gj(this,!1))});u.defineProperty(D,{mt:"scrollHorizontalLineChange"},function(){return this.bv},function(a){var b=this.bv;b!==a&&(u.j(a,"number",D,"scrollHorizontalLineChange"),0>a&&u.xa(a,">= 0",D,"scrollHorizontalLineChange"),this.bv=a,this.h("scrollHorizontalLineChange",b,a))});u.defineProperty(D,{nt:"scrollVerticalLineChange"},function(){return this.cv},function(a){var b=this.cv;b!==a&&(u.j(a,"number",D,"scrollVerticalLineChange"),0>a&&u.xa(a,">= 0",D,"scrollVerticalLineChange"),this.cv=a,this.h("scrollVerticalLineChange",b,a))});u.defineProperty(D,{N:"lastInput"},function(){return this.Pb},function(a){this.Pb=a});u.defineProperty(D,{uc:"firstInput"},function(){return this.nk},function(a){this.nk=a});u.defineProperty(D,{bc:"currentCursor"},function(){return this.ux},function(a){""===a&&(a=this.Rp);this.ux!==a&&(u.j(a,"string",D,"currentCursor"),null!==this.kb&&(this.ux=a,this.kb.style.cursor=a,this.Kb.style.cursor=a))});u.defineProperty(D,{pJ:"defaultCursor"},function(){return this.Rp},function(a){""===a&&(a="auto");var b=this.Rp;b!==a&&(u.j(a,"string",D,"defaultCursor"),this.Rp=a,this.h("defaultCursor",b,a))});u.defineProperty(D,{DJ:"hasGestureZoom"},function(){return this.An},function(a){var b=this.An;b!==a&&(u.j(a,"boolean",D,"hasGestureZoom"),this.An=a,this.h("hasGestureZoom",b,a))});u.defineProperty(D,{click:"click"},function(){return this.Xh},function(a){var b=this.Xh;b!==a&&(null!==a&&u.j(a,"function",D,"click"),this.Xh=a,this.h("click",b,a))});u.defineProperty(D,{us:"doubleClick"},function(){return this.di},function(a){var b=this.di;b!==a&&(null!==a&&u.j(a,"function",D,"doubleClick"),this.di=a,this.h("doubleClick",b,a))});u.defineProperty(D,{Vy:"contextClick"},function(){return this.Zh},function(a){var b=this.Zh;b!==a&&(null!==a&&u.j(a,"function",D,"contextClick"),this.Zh=a,this.h("contextClick",b,a))});u.defineProperty(D,{Gz:"mouseOver"},function(){return this.ni},function(a){var b=this.ni; + b!==a&&(null!==a&&u.j(a,"function",D,"mouseOver"),this.ni=a,this.h("mouseOver",b,a))});u.defineProperty(D,{Fz:"mouseHover"},function(){return this.mi},function(a){var b=this.mi;b!==a&&(null!==a&&u.j(a,"function",D,"mouseHover"),this.mi=a,this.h("mouseHover",b,a))});u.defineProperty(D,{Ez:"mouseHold"},function(){return this.li},function(a){var b=this.li;b!==a&&(null!==a&&u.j(a,"function",D,"mouseHold"),this.li=a,this.h("mouseHold",b,a))});u.defineProperty(D,{GH:"mouseDragOver"},function(){return this.Pu},function(a){var b=this.Pu;b!==a&&(null!==a&&u.j(a,"function",D,"mouseDragOver"),this.Pu=a,this.h("mouseDragOver",b,a))});u.defineProperty(D,{Dz:"mouseDrop"},function(){return this.ki},function(a){var b=this.ki;b!==a&&(null!==a&&u.j(a,"function",D,"mouseDrop"),this.ki=a,this.h("mouseDrop",b,a))});u.defineProperty(D,{mA:"toolTip"},function(){return this.ui},function(a){var b=this.ui;b!==a&&(null!==a&&u.C(a,lf,D,"toolTip"),this.ui=a,this.h("toolTip",b,a))});u.defineProperty(D,{contextMenu:"contextMenu"},function(){return this.$h},function(a){var b=this.$h;b!==a&&(null!==a&&u.C(a,lf,D,"contextMenu"),this.$h=a,this.h("contextMenu",b,a))});u.defineProperty(D,{Eb:"commandHandler"},function(){return this.kx},function(a){var b=this.kx;b!==a&&(u.C(a,sa,D,"commandHandler"),null!==a.g&&u.k("Cannot share CommandHandlers between Diagrams: "+a.toString()),null!==b&&b.Dc(null),this.kx=a,a.Dc(this))});u.defineProperty(D,{tb:"toolManager"},function(){return this.Hy},function(a){var b=this.Hy;b!==a&&(u.C(a,jf,D,"toolManager"),null!==a.g&&u.k("Cannot share ToolManagers between Diagrams: "+a.toString()),null!==b&&b.Dc(null),this.Hy=a,a.Dc(this))});u.defineProperty(D,{az:"defaultTool"},function(){return this.Ax},function(a){var b=this.Ax;b!==a&&(u.C(a,xe,D,"defaultTool"),this.Ax=a,this.Va===b&&(this.Va=a))});u.defineProperty(D,{Va:"currentTool"},function(){return this.wx},function(a){var b=this.wx;if(null!==b){for(b.oa&&b.doDeactivate(),b.cancelWaitAfter(),b.doStop(),b=this.Yl.i;b.next();){b.value.na()}}null===a&&(a=this.az);null!==a&&(u.C(a,xe,D,"currentTool"),this.wx=a,a.Dc(this),a.doStart())});u.u(D,{selection:"selection"},function(){return this.fv});u.defineProperty(D,{yH:"maxSelectionCount"},function(){return this.Ku},function(a){var b=this.Ku;if(b!==a){if(u.j(a,"number",D,"maxSelectionCount"),0<=a&&!isNaN(a)){if(this.Ku=a,this.h("maxSelectionCount",b,a),!this.ga.fb&&(a=this.selection.count-a,0<a)){this.Ba("ChangingSelection");for(var b=this.selection.Le(),c=0;c<a;c++){b[c].$a=!1}this.Ba("ChangedSelection")}}else{u.xa(a,">= 0",D,"maxSelectionCount")}}});u.defineProperty(D,{JH:"nodeSelectionAdornmentTemplate"},function(){return this.Ru},function(a){var b=this.Ru;b!==a&&(u.C(a,lf,D,"nodeSelectionAdornmentTemplate"),this.Ru=a,this.h("nodeSelectionAdornmentTemplate",b,a))});u.defineProperty(D,{NG:"groupSelectionAdornmentTemplate"},function(){return this.nu},function(a){var b=this.nu;b!==a&&(u.C(a,lf,D,"groupSelectionAdornmentTemplate"),this.nu=a,this.h("groupSelectionAdornmentTemplate",b,a))});u.defineProperty(D,{tH:"linkSelectionAdornmentTemplate"},function(){return this.Fu},function(a){var b=this.Fu;b!==a&&(u.C(a,lf,D,"linkSelectionAdornmentTemplate"),this.Fu=a,this.h("linkSelectionAdornmentTemplate",b,a))});u.u(D,{bw:"highlighteds"},function(){return this.su});u.defineProperty(D,{Sh:"isModified"},function(){var a=this.ga;return a.isEnabled?null!==a.Ei?!0:this.Wx&&this.Kg!==a.Ji:this.Wx},function(a){if(this.Wx!==a){u.j(a,"boolean",D,"isModified");this.Wx=a;var b=this.ga;!a&&b.isEnabled&&(this.Kg=b.Ji);a||ik(this)}});function ik(a){var b=a.Sh;a.DC!==b&&(a.DC=b,a.Ba("Modified"))}u.defineProperty(D,{ha:"model"},function(){return this.Pd},function(a){var b=this.Pd;if(b!==a){u.C(a,J,D,"model");this.Va.doCancel();null!==b&&b.ga!==a.ga&&b.ga.OD&&u.k("Do not replace a Diagram.model while a transaction is in progress.");this.Mb.Ni();this.Mv();this.nf=!1;this.wn=!0;this.Kg=-2;this.Ff=!1;var c=this.xd;this.xd=!0;this.Mb.nl();null!==b&&(b.Uz(this.GB),b instanceof Q&&jk(this,b.Qj),jk(this,b.dh));this.Pd=a;a.Ly(this.FB);kk(this,a.dh);a instanceof Q&&lk(this,a.Qj);a.Uz(this.FB);a.Ly(this.GB);this.xd=c;this.Oc||this.na();null!==b&&(a.ga.isEnabled=b.ga.isEnabled)}});u.defineProperty(D,{Oa:null},function(){return this.yB},function(a){this.yB=a});u.u(D,{rw:null},function(){return this.uF});function Qi(a,b){if(b.ha===a.ha){var c=b.Cd,d=b.propertyName;if(c===ae&&"S"===d[0]){if("StartingFirstTransaction"===d){c=a.tb,c.ef.each(function(b){b.Dc(a)}),c.Nf.each(function(b){b.Dc(a)}),c.Of.each(function(b){b.Dc(a)}),a.xd||a.nf||(a.eu=!0,a.wn&&(a.Ff=!0),a.oh.nl())}else{if("StartingUndo"===d||"StartingRedo"===d){var e=a.Mb;e.Xg&&!a.gb&&e.Ni();a.Ba("ChangingSelection")}else{"StartedTransaction"===d&&(e=a.Mb,e.Xg&&!a.gb&&e.Ni(),a.Au&&e.nl())}}}else{if(a.Oa){a.Oa=!1;try{var f=b.Mf;if(""!==f){if(c===$d){if("linkFromKey"===f){var h=b.object,k=a.pg(h);if(null!==k){var l=b.newValue,m=a.Ye(l);k.V=m}}else{if("linkToKey"===f){h=b.object,k=a.pg(h),null!==k&&(l=b.newValue,m=a.Ye(l),k.ba=m) + }else{if("linkFromPortId"===f){if(h=b.object,k=a.pg(h),null!==k){var n=b.newValue;"string"===typeof n&&(k.rg=n)}}else{if("linkToPortId"===f){h=b.object,k=a.pg(h),null!==k&&(n=b.newValue,"string"===typeof n&&(k.mh=n))}else{if("nodeGroupKey"===f){var h=b.object,p=a.Ph(h);if(null!==p){var q=b.newValue;if(void 0!==q){var r=a.Ye(q);p.Sa=r instanceof V?r:null}else{p.Sa=null}}}else{if("linkLabelKeys"===f){if(h=b.object,k=a.pg(h),null!==k){var s=b.oldValue,t=b.newValue;if(u.isArray(s)){for(var v=u.qb(s),x=0;x<v;x++){var A=u.ib(s,x),m=a.Ye(A);null!==m&&(m.de=null)}}if(u.isArray(t)){for(v=u.qb(t),x=0;x<v;x++){A=u.ib(t,x),m=a.Ye(A),null!==m&&(m.de=k)}}}}else{if("nodeParentKey"===f){var y=b.object,C=a.Ye(b.newValue),I=a.Xv(y);if(null!==I){var H=I.Bs();null!==H?null===C?a.remove(H):a.rd?H.V=C:H.ba=C:mk(a,C,I)}}else{if("parentLinkCategory"===f){var y=b.object,I=a.Xv(y),R=b.newValue;null!==I&&"string"===typeof R&&(H=I.Bs(),null!==H&&(H.Jc=R))}else{if("nodeCategory"===f){var h=b.object,aa=a.Ph(h),R=b.newValue;null!==aa&&"string"===typeof R&&(aa.Jc=R)}else{if("linkCategory"===f){var h=b.object,S=a.pg(h),R=b.newValue;null!==S&&"string"===typeof R&&(S.Jc=R)}else{if("nodeDataArray"===f){var N=b.oldValue;jk(a,N);var Z=b.newValue;kk(a,Z)}else{"linkDataArray"===f&&(N=b.oldValue,jk(a,N),Z=b.newValue,lk(a,Z))}}}}}}}}}}}a.Sh=!0}else{c===be?(Z=b.newValue,"nodeDataArray"===f&&u.Ta(Z)?nk(a,Z):"linkDataArray"===f&&u.Ta(Z)?ok(a,Z):"linkLabelKeys"===f&&Ne(Z)&&(k=a.pg(b.object),m=a.Ye(Z),null!==k&&null!==m&&(m.de=k)),a.Sh=!0):c===ce?(N=b.oldValue,"nodeDataArray"===f&&u.Ta(N)?pk(a,N):"linkDataArray"===f&&u.Ta(N)?pk(a,N):"linkLabelKeys"===f&&Ne(N)&&(m=a.Ye(N),null!==m&&(m.de=null)),a.Sh=!0):c===ae&&("SourceChanged"===f?Pi(a,b.object,b.propertyName):"ModelDisplaced"===f&&a.ol())}}else{if(c===$d){var Ga=b.propertyName,h=b.object;if(h===a.ha){if("nodeKeyProperty"===Ga||"nodeCategoryProperty"===Ga||"linkFromKeyProperty"===Ga||"linkToKeyProperty"===Ga||"linkFromPortIdProperty"===Ga||"linkToPortIdProperty"===Ga||"linkLabelKeysProperty"===Ga||"nodeIsGroupProperty"===Ga||"nodeGroupKeyProperty"===Ga||"nodeParentKeyProperty"===Ga||"linkCategoryProperty"===Ga){a.ga.fb||a.ol()}}else{Pi(a,h,Ga)}a.Sh=!0}else{if(c===be||c===ce){qk(a,b),a.Sh=!0}else{if(c===ae){if("FinishedUndo"===d||"FinishedRedo"===d){a.ga.gi=!0,a.Ba("ChangedSelection"),ej(a),a.ga.gi=!1}a.eu=!0;a.df();e=a.oh;e.cd&&0===a.ga.Me&&fi(e);"CommittedTransaction"===d&&a.ga.Zx&&(a.Kg=Math.min(a.Kg,a.ga.Ji-1));ik(a);var ua=b.iH;ua&&a.rw.clear();!a.jy&&ua&&(a.jy=!0,u.setTimeout(function(){a.Va.standardMouseOver();a.jy=!1},10))}}}}}finally{a.Oa=!0}}}}}function Pi(a,b,c){if("string"===typeof c){var d=a.Ph(b);if(null!==d){d.Ob(c),a.ha instanceof qe&&(d=a.pg(b),null!==d&&d.Ob(c))}else{for(var d=null,e=a.Ql.i;e.next();){for(var f=e.value,h=0;h<f.length;h++){var k=f[h];null!==k.$f&&(k=k.$f.ua(b),null!==k&&(null===d&&(d=u.hb()),d.push(k)))}if(null!==d){break}}if(null!==d){for(e=0;e<d.length;e++){d[e].Ob(c)}u.sa(d)}}b===a.ha.$s&&a.FI(c)}}u.defineProperty(D,{Kw:"skipsModelSourceBindings"},function(){return this.eC},function(a){this.eC=a});u.defineProperty(D,{ut:null},function(){return this.yy},function(a){this.yy=a});function qk(a,b){var c=b.Cd===be,d=c?b.zg:b.Bg,e=c?b.newValue:b.oldValue,f=a.Ql.ua(b.object);if(Array.isArray(f)){for(var h=0;h<f.length;h++){var k=f[h];if(c){rk(k,e,d)}else{var l=d;if(!(0>l)){var m=l;sk(k)&&m++;k.Ge(m);tk(k,m,l)}}}}}function Mj(a,b){var c=b.hi;if(u.isArray(c)){var d=a.Ql.ua(c);if(null===d){d=[],d.push(b),a.Ql.add(c,d)}else{for(c=0;c<d.length;c++){if(d[c]===b){return}}d.push(b)}}}function Qj(a,b){var c=b.hi;if(u.isArray(c)){var d=a.Ql.ua(c);if(null!==d){for(var e=0;e<d.length;e++){if(d[e]===b){d.splice(e,1);0===d.length&&a.Ql.remove(c);break}}}}}function Lj(a,b){for(var c=b.Aa.n,d=c.length,e=0;e<d;e++){var f=c[e];f instanceof Ri&&uk(a,f)}}function uk(a,b){var c=b.element;if(null!==c){var c=c.src,d=a.Vn.ua(c);if(null===d){d=[],d.push(b),a.Vn.add(c,d)}else{for(c=0;c<d.length;c++){if(d[c]===b){return}}d.push(b)}}}function Pj(a,b){for(var c=b.Aa.n,d=c.length,e=0;e<d;e++){var f=c[e];f instanceof Ri&&vk(a,f)}}function vk(a,b){var c=b.element;if(null!==c){var c=c.src,d=a.Vn.ua(c);if(null!==d){for(var e=0;e<d.length;e++){if(d[e]===b){d.splice(e,1);0===d.length&&a.Vn.remove(c);break}}}}}D.prototype.clear=D.prototype.clear=function(){var a=null;null!==this.bd&&(a=this.bd.W);this.ha.clear();for(var b=this.$b.length,c=0;c<b;c++){this.$b.n[c].clear()}this.Zf.clear();this.Il.clear();this.Tn.clear();this.Ik.clear();this.Pn.clear();this.Db.clear();this.ai.clear();this.lk.clear();this.Ql.clear();this.fv.Ma();this.fv.clear();this.fv.freeze();this.su.Ma();this.su.clear();this.su.freeze();gf=this.gn=null;hf="";this.fu=(new z(NaN,NaN,NaN,NaN)).freeze();null!==a&&(this.add(a),this.Db.remove(a));this.na()};D.prototype.reset=D.prototype.reset=function(){this.Oc=!0;this.clear();this.$b=new E(we);this.rE();this.qE();this.Na=(new w(NaN,NaN)).freeze();this.ac=1;this.uu=(new w(NaN,NaN)).freeze();this.vu=NaN;this.Mu=0.0001; + this.Ju=100;this.xv=(new w(NaN,NaN)).freeze();this.lu=(new z(NaN,NaN,NaN,NaN)).freeze();this.Bl=vf;this.fn=uc;this.tk=vf;this.Cn=uc;this.wu=this.tu=xb;this.Rt=(new rb(16,16,16,16)).freeze();this.zu=!0;this.tv=Hg;this.Rp="auto";this.$h=this.ui=this.ki=this.Pu=this.li=this.mi=this.ni=this.Zh=this.di=this.Xh=null;this.vk=!1;this.Yj=this.Xj=this.Ht=this.Oe=!0;this.Jt=this.It=!1;this.Nt=this.Kt=this.ru=this.qu=this.Ot=this.Mt=this.fk=this.ek=this.dk=this.ck=this.ak=this.bk=this.$j=this.Lt=this.hk=this.Zj=this.gk=!0;this.cv=this.bv=16;this.Qe=(new rb(5)).freeze();this.Ku=999999999;this.Od=null;Ui(this);this.bd=null;this.ri=!0;Ti(this);this.Qb=new Je;this.ri=!1;this.ha=new Q;this.nf=!1;this.wn=!0;this.Oc=this.Ff=!1;this.na()};D.prototype.rebuildParts=D.prototype.ol=function(){for(var a=this.Kz.i;a.next();){var b=a.value,c=a.key;(!b.Hd()||b instanceof V)&&u.k('Invalid node template in Diagram.nodeTemplateMap: template for "'+c+'" must be a Node or a simple Part, not a Group or Link: '+b)}for(a=this.jz.i;a.next();){b=a.value,c=a.key,b instanceof V||u.k('Invalid group template in Diagram.groupTemplateMap: template for "'+c+'" must be a Group, not a normal Node or Link: '+b)}for(a=this.yz.i;a.next();){b=a.value,c=a.key,b instanceof W||u.k('Invalid link template in Diagram.linkTemplateMap: template for "'+c+'" must be a Link, not a normal Node or simple Part: '+b)}a=u.hb();for(b=this.selection.i;b.next();){(c=b.value.data)&&a.push(c)}for(var b=u.hb(),d=this.bw.i;d.next();){(c=d.value.data)&&b.push(c)}c=u.hb();for(d=this.Ag.i;d.next();){var e=d.value;null!==e.data&&(c.push(e.data),c.push(e.location))}for(d=this.links.i;d.next();){e=d.value,null!==e.data&&(c.push(e.data),c.push(e.location))}for(d=this.Sj.i;d.next();){e=d.value,null!==e.data&&(c.push(e.data),c.push(e.location))}d=this.ha;d instanceof Q&&jk(this,d.Qj);jk(this,d.dh);kk(this,d.dh);d instanceof Q&&lk(this,d.Qj);for(d=0;d<a.length;d++){e=this.Ph(a[d]),null!==e&&(e.$a=!0)}for(d=0;d<b.length;d++){e=this.Ph(b[d]),null!==e&&(e.Yg=!0)}for(d=0;d<c.length;d+=2){e=this.Ph(c[d]),null!==e&&(e.location=c[d+1])}u.sa(a);u.sa(b);u.sa(c)};function kk(a,b){if(null!==b){for(var c=a.ha,d=u.qb(b),e=0;e<d;e++){var f=u.ib(b,e);c.Ve(f)?nk(a,f,!1):c instanceof Q&&ok(a,f)}if(c instanceof Q||c instanceof qe){for(e=0;e<d;e++){f=u.ib(b,e),c.Ve(f)&&wk(a,f)}if(c instanceof Q){for(c=a.links;c.next();){xk(c.value)}}}yk(a,!1)}}function nk(a,b,c){if(void 0!==b&&null!==b&&!a.ga.fb&&!a.ai.contains(b)){void 0===c&&(c=!0);var d=a.gz(b),e=zk(a,b,d);null!==e&&(nf(e),e=e.copy(),null!==e&&(e.Wh=d,a.Ym&&(e.wk="Tool"),a.add(e),e.data=b,c&&wk(a,b)))}}D.prototype.gz=function(a){return this.ha.gz(a)};var Ak=!1,Bk=!1;function zk(a,b,c){var d=!1,e=a.ha;e instanceof Q&&(d=e.uz(b));d?(b=a.jz.ua(c),null===b&&(b=a.jz.ua(""),null===b&&(Bk||(Bk=!0,u.trace('No Group template found for category "'+c+'"'),u.trace(" Using default group template")),b=a.SA))):(b=a.Kz.ua(c),null===b&&(b=a.Kz.ua(""),null===b&&(Ak||(Ak=!0,u.trace('No Node template found for category "'+c+'"'),u.trace(" Using default node template")),b=a.UA)));return b}function wk(a,b){var c=a.ha;if(c instanceof Q||c instanceof qe){var d=c.wb(b);if(void 0!==d){var e=Oe(c,d),f=a.Ph(b);if(null!==e&&null!==f){for(e=e.i;e.next();){var h=e.value;if(c instanceof Q){var k=c;if(k.Ve(h)){if(f instanceof V&&k.Fm(h)===d){var l=f,h=a.Ph(h);null!==h&&(h.Sa=l)}}else{var m=a.pg(h);if(null!==m&&f instanceof U&&(l=f,k.$k(h)===d&&(m.V=l),k.cl(h)===d&&(m.ba=l),h=k.Pj(h),u.isArray(h))){for(k=0;k<u.qb(h);k++){if(u.ib(h,k)===d){l.de=m;break}}}}}else{c instanceof qe&&(m=c,m.Ve(h)&&f instanceof U&&(l=f,m.Gm(h)===d&&(h=a.Xv(h),mk(a,l,h))))}}Qe(c,d)}c instanceof Q?(c=c.Fm(b),void 0!==c&&(c=a.Ye(c),c instanceof V&&(f.Sa=c))):c instanceof qe&&(c=c.Gm(b),void 0!==c&&f instanceof U&&(l=f,f=a.Ye(c),mk(a,f,l)))}}}function mk(a,b,c){if(null!==b&&null!==c){var d=a.tb.UD,e=b,f=c;if(a.rd){for(b=f.pe;b.next();){if(b.value.ba===f){return}}}else{for(e=c,f=b,b=e.pe;b.next();){if(b.value.V===e){return}}}null!==d&&Jg(d,e,f,null,!0)||(d=a.Zv(c.data),b=Ck(a,d),null!==b&&(nf(b),b=b.copy(),null!==b&&(b.Wh=d,b.V=e,b.ba=f,a.add(b),b.data=c.data)))}}function lk(a,b){if(null!==b){for(var c=u.qb(b),d=0;d<c;d++){var e=u.ib(b,d);ok(a,e)}yk(a,!1)}}function ok(a,b){if(void 0!==b&&null!==b&&!a.ga.fb&&!a.lk.contains(b)){var c=a.Zv(b),d=Ck(a,c);if(null!==d&&(nf(d),d=d.copy(),null!==d)){d.Wh=c;var c=a.ha,e=c.GG(b);""!==e&&(d.rg=e);e=c.$k(b);void 0!==e&&(e=a.Ye(e),e instanceof U&&(d.V=e));e=c.JG(b);""!==e&&(d.mh=e);e=c.cl(b);void 0!==e&&(e=a.Ye(e),e instanceof U&&(d.ba=e));c=c.Pj(b);if(u.isArray(c)){for(var e=u.qb(c),f=0;f<e;f++){var h=u.ib(c,f),h=a.Ye(h);null!==h&&(h.de=d)}}a.add(d);d.data=b}}}D.prototype.Zv=function(a){var b=this.ha,c="";b instanceof Q?c=b.Zv(a):b instanceof qe&&(c=b.IG(a));return c};var Dk=!1;function Ck(a,b){var c=a.yz.ua(b);null===c&&(c=a.yz.ua(""),null===c&&(Dk||(Dk=!0,u.trace('No Link template found for category "'+b+'"'),u.trace(" Using default link template")),c=a.TA));return c}function jk(a,b){for(var c=u.qb(b),d=0; + d<c;d++){var e=u.ib(b,d);pk(a,e)}}function pk(a,b){if(void 0!==b&&null!==b){var c=a.Ph(b);if(null!==c){c.$a=!1;c.Yg=!1;var d=c.layer;if(null!==d&&d.g===a){var e=a.ha;if(e instanceof Q&&c instanceof U){var f=c,h=e.wb(f.data);if(void 0!==h){for(var k=f.pe;k.next();){Pe(e,h,k.value.data)}f.uf&&(k=f.de,null!==k&&Pe(e,h,k.data));if(f instanceof V){for(f=f.Lc;f.next();){k=f.value.data,e.Ve(k)&&Pe(e,h,k)}}}}else{if(e instanceof qe&&c instanceof U){f=c;k=a.pg(f.data);if(null!==k){k.$a=!1;k.Yg=!1;var l=k.layer;if(null!==l){var m=l.Ge(-1,k,!1);0<=m&&a.Cc(ce,"parts",l,k,null,m,null);m=k.Ss;null!==m&&m(k,l,null)}}k=a.rd;for(f=f.pe;f.next();){l=f.value,l=(k?l.ba:l.V).data,e.Ve(l)&&Pe(e,h,l)}}}e=d.Ge(-1,c,!1);0<=e&&a.Cc(ce,"parts",d,c,null,e,null);e=c.Ss;null!==e&&e(c,d,null)}}}}D.prototype.findPartForKey=D.prototype.AG=function(a){if(null===a||void 0===a){return null}a=this.ha.sf(a);return null===a?null:this.ai.ua(a)};D.prototype.findNodeForKey=D.prototype.Ye=function(a){if(null===a||void 0===a){return null}a=this.ha.sf(a);if(null===a){return null}a=this.ai.ua(a);return a instanceof U?a:null};D.prototype.findPartForData=D.prototype.Ph=function(a){if(null===a){return null}var b=this.ai.ua(a);return null!==b?b:b=this.lk.ua(a)};D.prototype.findNodeForData=D.prototype.Xv=function(a){if(null===a){return null}a=this.ai.ua(a);return a instanceof U?a:null};D.prototype.findLinkForData=D.prototype.pg=function(a){return null===a?null:this.lk.ua(a)};D.prototype.findNodesByExample=function(a){for(var b=new F,c=this.Tn.i;c.next();){var d=c.value,e=d.data;if(null!==e){for(var f=0;f<arguments.length;f++){var h=arguments[f];if(u.Ta(h)&&Ek(this,e,h)){b.add(d);break}}}}return b.i};D.prototype.findLinksByExample=function(a){for(var b=new F,c=this.Pn.i;c.next();){var d=c.value,e=d.data;if(null!==e){for(var f=0;f<arguments.length;f++){var h=arguments[f];if(u.Ta(h)&&Ek(this,e,h)){b.add(d);break}}}}return b.i};function Ek(a,b,c){for(var d in c){var e=b[d],f=c[d];if(u.isArray(f)){if(!u.isArray(e)||e.length>=f.length){return !1}for(var h=0;h<e.length;h++){var k=e[h],l=f[h];if(void 0!==l&&!Fk(a,k,l)){return !1}}}else{if(!Fk(a,e,f)){return !1}}}return !0}function Fk(a,b,c){if("function"===typeof c){if(!c(b)){return !1}}else{if(c instanceof RegExp){if(!b||!c.test(b.toString())){return !1}}else{if(u.Ta(b)&&u.Ta(c)){if(!Ek(a,b,c)){return !1}}else{if(b!==c){return !1}}}}return !0}u.defineProperty(D,{eK:"nodeTemplate"},function(){return this.oi.ua("")},function(a){var b=this.oi.ua("");b!==a&&(u.C(a,G,D,"nodeTemplate"),this.oi.add("",a),this.h("nodeTemplate",b,a),this.ga.fb||this.ol())});u.defineProperty(D,{Kz:"nodeTemplateMap"},function(){return this.oi},function(a){var b=this.oi;b!==a&&(u.C(a,la,D,"nodeTemplateMap"),this.oi=a,this.h("nodeTemplateMap",b,a),this.ga.fb||this.ol())});u.defineProperty(D,{CJ:"groupTemplate"},function(){return this.ok.ua("")},function(a){var b=this.ok.ua("");b!==a&&(u.C(a,V,D,"groupTemplate"),this.ok.add("",a),this.h("groupTemplate",b,a),this.ga.fb||this.ol())});u.defineProperty(D,{jz:"groupTemplateMap"},function(){return this.ok},function(a){var b=this.ok;b!==a&&(u.C(a,la,D,"groupTemplateMap"),this.ok=a,this.h("groupTemplateMap",b,a),this.ga.fb||this.ol())});u.defineProperty(D,{UJ:"linkTemplate"},function(){return this.hj.ua("")},function(a){var b=this.hj.ua("");b!==a&&(u.C(a,W,D,"linkTemplate"),this.hj.add("",a),this.h("linkTemplate",b,a),this.ga.fb||this.ol())});u.defineProperty(D,{yz:"linkTemplateMap"},function(){return this.hj},function(a){var b=this.hj;b!==a&&(u.C(a,la,D,"linkTemplateMap"),this.hj=a,this.h("linkTemplateMap",b,a),this.ga.fb||this.ol())});u.defineProperty(D,{fH:null},function(){return this.Nl},function(a){this.Nl=a});u.defineProperty(D,{He:"isMouseCaptured"},function(){return this.uB},function(a){var b=this.kb;null!==b&&(a?(this.N.bubbles=!1,b.removeEventListener("mousemove",this.So,!1),b.removeEventListener("mousedown",this.Ro,!1),b.removeEventListener("mouseup",this.Uo,!1),b.removeEventListener("mousewheel",this.ah,!1),b.removeEventListener("DOMMouseScroll",this.ah,!1),b.removeEventListener("mouseout",this.To,!1),window.addEventListener("mousemove",this.So,!0),window.addEventListener("mousedown",this.Ro,!0),window.addEventListener("mouseup",this.Uo,!0),window.addEventListener("mousewheel",this.ah,!0),window.addEventListener("DOMMouseScroll",this.ah,!0),window.addEventListener("mouseout",this.To,!0),window.addEventListener("selectstart",this.preventDefault,!1)):(window.removeEventListener("mousemove",this.So,!0),window.removeEventListener("mousedown",this.Ro,!0),window.removeEventListener("mouseup",this.Uo,!0),window.removeEventListener("mousewheel",this.ah,!0),window.removeEventListener("DOMMouseScroll",this.ah,!0),window.removeEventListener("mouseout",this.To,!0),window.removeEventListener("selectstart",this.preventDefault,!1),b.addEventListener("mousemove",this.So,!1),b.addEventListener("mousedown",this.Ro,!1),b.addEventListener("mouseup",this.Uo,!1),b.addEventListener("mousewheel",this.ah,!1),b.addEventListener("DOMMouseScroll",this.ah,!1),b.addEventListener("mouseout",this.To,!1)),this.uB=a) + });u.defineProperty(D,{position:"position"},function(){return this.Na},function(a){var b=this.Na;if(!b.L(a)){u.C(a,w,D,"position");var c=this.ob.copy();a=a.copy();if(!this.Oc&&null!==this.kb){this.Oc=!0;var d=this.scale;ij(this,a,this.Ed,this.Ab/d,this.zb/d,this.fn,!1);this.Oc=!1}this.Na=a.Z();a=this.Mb;a.cd&&si(a,b,this.Na);this.Oc||this.et(c,this.ob)}});u.defineProperty(D,{UG:"initialPosition"},function(){return this.uu},function(a){this.uu.L(a)||(u.C(a,w,D,"initialPosition"),this.uu=a.Z())});u.defineProperty(D,{VG:"initialScale"},function(){return this.vu},function(a){this.vu!==a&&(u.j(a,"number",D,"initialScale"),this.vu=a)});u.defineProperty(D,{Hs:"grid"},function(){null===this.bd&&aj(this);return this.bd},function(a){var b=this.bd;if(b!==a){null===b&&(aj(this),b=this.bd);u.C(a,B,D,"grid");a.type!==bj&&u.k("Diagram.grid must be a Panel of type Panel.Grid");var c=b.P;null!==c&&c.remove(b);this.bd=a;a.name="GRID";null!==c&&c.add(a);vj(this);this.na();this.h("grid",b,a)}});u.u(D,{ob:"viewportBounds"},function(){var a=this.CC;if(null===this.kb){return a}var b=this.Na,c=this.ac;a.m(b.x,b.y,Math.max(this.Ab,0)/c,Math.max(this.zb,0)/c);return a});u.defineProperty(D,{vD:"fixedBounds"},function(){return this.lu},function(a){var b=this.lu;b.L(a)||(u.C(a,z,D,"fixedBounds"),-Infinity!==a.width&&Infinity!==a.height&&-Infinity!==a.height||u.k("fixedBounds width/height must not be Infinity"),this.lu=a=a.Z(),this.pc(),this.h("fixedBounds",b,a))});u.defineProperty(D,{yE:"scrollMargin"},function(){return this.wy},function(a){"number"===typeof a?a=new rb(a):u.C(a,rb,D,"scrollMargin");var b=this.wy;b.L(a)||(this.wy=a=a.Z(),this.pc(),this.h("scrollMargin",b,a))});u.defineProperty(D,{zE:"scrollMode"},function(){return this.xy},function(a){var b=this.xy;b!==a&&(u.rb(a,D,D,"scrollMode"),this.xy=a,a===Ni&&gj(this,!1),this.h("scrollMode",b,a))});u.defineProperty(D,{hE:"positionComputation"},function(){return this.py},function(a){var b=this.py;b!==a&&(null!==a&&u.j(a,"function",D,"positionComputation"),this.py=a,gj(this,!1),this.h("positionComputation",b,a))});u.defineProperty(D,{xE:"scaleComputation"},function(){return this.sy},function(a){var b=this.sy;b!==a&&(null!==a&&u.j(a,"function",D,"scaleComputation"),this.sy=a,Yj(this,this.scale,this.scale),this.h("scaleComputation",b,a))});u.u(D,{Ed:"documentBounds"},function(){return this.fu});function jj(a,b){a.fi=!1;var c=a.fu;c.L(b)||(b=b.Z(),a.fu=b,gj(a,!1),a.Ba("DocumentBoundsChanged",null,c.copy()),sj(a))}u.defineProperty(D,{scale:"scale"},function(){return this.ac},function(a){var b=this.ac;u.Be(a,D,"scale");b!==a&&Yj(this,b,a)});u.defineProperty(D,{po:"autoScale"},function(){return this.Bl},function(a){var b=this.Bl;b!==a&&(u.rb(a,D,D,"autoScale"),this.Bl=a,this.h("autoScale",b,a),a!==vf&&gj(this,!1))});u.defineProperty(D,{FJ:"initialAutoScale"},function(){return this.tk},function(a){var b=this.tk;b!==a&&(u.rb(a,D,D,"initialAutoScale"),this.tk=a,this.h("initialAutoScale",b,a))});u.defineProperty(D,{WG:"initialViewportSpot"},function(){return this.wu},function(a){var b=this.wu;b!==a&&(u.C(a,L,D,"initialViewportSpot"),a.Vc()||u.k("initialViewportSpot must be a real Spot: "+a),this.wu=a,this.h("initialViewportSpot",b,a))});u.defineProperty(D,{TG:"initialDocumentSpot"},function(){return this.tu},function(a){var b=this.tu;b!==a&&(u.C(a,L,D,"initialDocumentSpot"),a.Vc()||u.k("initialViewportSpot must be a real Spot: "+a),this.tu=a,this.h("initialDocumentSpot",b,a))});u.defineProperty(D,{$g:"minScale"},function(){return this.Mu},function(a){u.Be(a,D,"minScale");var b=this.Mu;b!==a&&(0<a?(this.Mu=a,this.h("minScale",b,a),a>this.scale&&(this.scale=a)):u.xa(a,"> 0",D,"minScale"))});u.defineProperty(D,{Zg:"maxScale"},function(){return this.Ju},function(a){u.Be(a,D,"maxScale");var b=this.Ju;b!==a&&(0<a?(this.Ju=a,this.h("maxScale",b,a),a<this.scale&&(this.scale=a)):u.xa(a,"> 0",D,"maxScale"))});u.defineProperty(D,{yl:"zoomPoint"},function(){return this.xv},function(a){this.xv.L(a)||(u.C(a,w,D,"zoomPoint"),this.xv=a=a.Z())});u.defineProperty(D,{cD:"contentAlignment"},function(){return this.fn},function(a){var b=this.fn;b.L(a)||(u.C(a,L,D,"contentAlignment"),this.fn=a=a.Z(),this.h("contentAlignment",b,a),gj(this,!1))});u.defineProperty(D,{GJ:"initialContentAlignment"},function(){return this.Cn},function(a){var b=this.Cn;b.L(a)||(u.C(a,L,D,"initialContentAlignment"),this.Cn=a=a.Z(),this.h("initialContentAlignment",b,a))});u.defineProperty(D,{padding:"padding"},function(){return this.Qe},function(a){"number"===typeof a?a=new rb(a):u.C(a,rb,D,"padding");var b=this.Qe;b.L(a)||(this.Qe=a=a.Z(),this.pc(),this.h("padding",b,a))});u.u(D,{Ag:"nodes"},function(){return this.Tn.i});u.u(D,{links:"links"},function(){return this.Pn.i});u.u(D,{Sj:"parts"},function(){return this.Db.i});D.prototype.findTopLevelNodesAndLinks=function(){for(var a=new F(G),b=this.Tn.i;b.next();){var c=b.value;c.Jo&&a.add(c)}for(b=this.Pn.i;b.next();){c=b.value,c.Jo&&a.add(c)}return a.i};D.prototype.findTopLevelGroups=function(){return this.Ik.i + };u.defineProperty(D,{Qb:"layout"},function(){return this.Od},function(a){var b=this.Od;b!==a&&(u.C(a,Je,D,"layout"),null!==b&&(b.g=null,b.group=null),this.Od=a,a.g=this,a.group=null,this.Pt=!0,this.h("layout",b,a),this.ee())});D.prototype.layoutDiagram=function(a){ej(this);a&&yk(this,!0);xj(this,!1)};function yk(a,b){for(var c=a.Ik.i;c.next();){Gk(a,c.value,b)}null!==a.Qb&&(b?a.Qb.wf=!1:a.Qb.H())}function Gk(a,b,c){if(null!==b){for(var d=b.Rn.i;d.next();){Gk(a,d.value,c)}null!==b.Qb&&(c?b.Qb.wf=!1:b.Qb.H())}}function xj(a,b){if(!a.Bx){var c=a.Qb,d=a.Au;a.Au=!0;var e=a.Oa;a.Oa=!0;try{a.Xb("Layout");for(var f=a.Ik.i;f.next();){Hk(a,f.value,b)}c.wf||b&&!c.QD||(c.doLayout(a),ej(a),c.wf=!0)}finally{a.Xd("Layout"),a.Pt=!c.wf,a.Au=d,a.Oa=e}}}function Hk(a,b,c){if(null!==b){for(var d=b.Rn.i;d.next();){Hk(a,d.value,c)}d=b.Qb;null===d||d.wf||c&&!d.QD||(b.ky=!b.location.I(),d.doLayout(b),b.H(Ik),d.wf=!0,zj(a,b))}}u.defineProperty(D,{rd:"isTreePathToChildren"},function(){return this.zu},function(a){var b=this.zu;if(b!==a&&(u.j(a,"boolean",D,"isTreePathToChildren"),this.zu=a,this.h("isTreePathToChildren",b,a),!this.ga.fb)){for(a=this.Ag;a.next();){Jk(a.value)}}});D.prototype.findTreeRoots=function(){for(var a=new E(U),b=this.Ag;b.next();){var c=b.value;c.Jo&&null===c.Bs()&&a.add(c)}return a.i};u.defineProperty(D,{ne:null},function(){return this.mB},function(a){this.mB=a});function Oi(a){function b(a){var b=a.toLowerCase(),h=new E("function");c.add(a,h);c.add(b,h);d.add(a,a);d.add(b,a)}var c=new la("string",E),d=new la("string","string");b("AnimationStarting");b("AnimationFinished");b("BackgroundSingleClicked");b("BackgroundDoubleClicked");b("BackgroundContextClicked");b("ClipboardChanged");b("ClipboardPasted");b("DocumentBoundsChanged");b("ExternalObjectsDropped");b("InitialLayoutCompleted");b("LayoutCompleted");b("LinkDrawn");b("LinkRelinked");b("LinkReshaped");b("Modified");b("ObjectSingleClicked");b("ObjectDoubleClicked");b("ObjectContextClicked");b("PartCreated");b("PartResized");b("PartRotated");b("SelectionMoved");b("SelectionCopied");b("SelectionDeleting");b("SelectionDeleted");b("SelectionGrouped");b("SelectionUngrouped");b("ChangingSelection");b("ChangedSelection");b("SubGraphCollapsed");b("SubGraphExpanded");b("TextEdited");b("TreeCollapsed");b("TreeExpanded");b("ViewportBoundsChanged");a.Dx=c;a.Cx=d}function ma(a,b){var c=a.Cx.ua(b);return null!==c?c:a.Cx.ua(b.toLowerCase())}function Kk(a,b){var c=a.Dx.ua(b);if(null!==c){return c}c=a.Dx.ua(b.toLowerCase());if(null!==c){return c}u.k("Unknown DiagramEvent name: "+b);return null}D.prototype.addDiagramListener=D.prototype.My=function(a,b){u.j(a,"string",D,"addDiagramListener:name");u.j(b,"function",D,"addDiagramListener:listener");var c=Kk(this,a);null!==c&&c.add(b)};D.prototype.removeDiagramListener=D.prototype.mE=function(a,b){u.j(a,"string",D,"removeDiagramListener:name");u.j(b,"function",D,"addDiagramListener:listener");var c=Kk(this,a);null!==c&&c.remove(b)};D.prototype.raiseDiagramEvent=D.prototype.Ba=function(a,b,c){var d=Kk(this,a),e=new Nd;e.g=this;e.name=ma(this,a);void 0!==b&&(e.iA=b);void 0!==c&&(e.Nz=c);a=d.length;if(1===a){d=d.ja(0),d(e)}else{if(0!==a){for(b=d.Le(),c=0;c<a;c++){d=b[c],d(e)}}}return e.cancel};function Cg(a,b){var c=!1;a.ob.Kj(b)&&(c=!0);c=a.ez(b,function(a){return a.W},function(a){return a instanceof W},!0,function(a){return a instanceof W},c);if(0!==c.count){for(c=c.i;c.next();){var d=c.value;d.el&&d.Wb()}}}D.prototype.isUnoccupied=D.prototype.Lo=function(a,b){void 0===b&&(b=null);return Lk(this,!1,null,b).Lo(a.x,a.y,a.width,a.height)};function Lk(a,b,c,d){null===a.nd&&(a.nd=new Mk);if(a.nd.Ms||a.nd.group!==c||a.nd.gA!==d){if(null===c){b=a.fi?fj(a):a.Ed.copy();b.Kf(100,100);a.nd.initialize(b);b=u.Tf();for(var e=a.Ag;e.next();){var f=e.value,h=f.layer;null!==h&&h.visible&&!h.zc&&Nk(a,f,d,b)}}else{for(c.ca.I()||c.rf(),b=c.ca.copy(),b.Kf(20,20),a.nd.initialize(b),b=u.Tf(),e=c.Lc;e.next();){f=e.value,f instanceof U&&Nk(a,f,d,b)}}u.ic(b);a.nd.group=c;a.nd.gA=d;a.nd.Ms=!1}else{b&&Ok(a.nd)}return a.nd}function Nk(a,b,c,d){if(b!==c){if(b.Ia()&&b.canAvoid()){c=b.getAvoidableRect(d);d=a.nd.to;b=a.nd.ro;for(var e=c.x+c.width,f=c.y+c.height,h=c.x;h<e;h+=d){for(var k=c.y;k<f;k+=b){Pk(a.nd,h,k)}Pk(a.nd,h,f)}for(k=c.y;k<f;k+=b){Pk(a.nd,e,k)}Pk(a.nd,e,f)}else{if(b instanceof V){for(b=b.Lc;b.next();){e=b.value,e instanceof U&&Nk(a,e,c,d)}}}}}function Qk(a,b){null===a.nd||a.nd.Ms||null!==b&&!b.canAvoid()||(a.nd.Ms=!0)}D.prototype.simulatedMouseMove=D.prototype.Jw=function(a,b,c){if(null!==Ef){var d=Ef.g;c instanceof D||(c=null);var e=Ff;c!==e&&(null!==e&&e!==d&&null!==e.tb.Gd&&(Kf(e),Ef.gw=!1,e.tb.Gd.doSimulatedDragLeave()),Ff=c,null!==c&&c!==d&&null!==c.tb.Gd&&(eg(),e=c.tb.Gd,ag.contains(e)||ag.add(e),c.tb.Gd.doSimulatedDragEnter()));if(null===c||c===d||!c.MC||c.nb||!c.no){return !1}d=c.tb.Gd;null!==d&&(null!==a?b=c.bq(a):null===b&&(b=new w),c.Pb.da=b,c.Pb.Wk=!1,c.Pb.up=!1,d.doSimulatedDragOver());return !0}return !1};D.prototype.simulatedMouseUp=D.prototype.JE=function(a,b,c,d){if(null!==Ef){null===d&&(d=b); + b=Ff;var e=Ef.g;if(d!==b){if(null!==b&&b!==e&&null!==b.tb.Gd){return Kf(b),Ef.gw=!1,b.tb.Gd.doSimulatedDragLeave(),!1}Ff=d;null!==d&&null!==d.tb.Gd&&(eg(),b=d.tb.Gd,ag.contains(b)||ag.add(b),d.tb.Gd.doSimulatedDragEnter())}if(null===d){return Ef.doCancel(),!0}if(d!==this){return null!==a&&(c=d.bq(a)),d.Pb.da=c,d.Pb.Wk=!1,d.Pb.up=!0,a=d.tb.Gd,null!==a&&a.doSimulatedDrop(),a=Ef,null!==a&&(d=a.mayCopy(),a.Af=d?"Copy":"Move",a.stopTool()),!0}}return !1};u.defineProperty(D,{SC:"autoScrollRegion"},function(){return this.Rt},function(a){"number"===typeof a?a=new rb(a):u.C(a,rb,D,"autoScrollRegion");var b=this.Rt;b.L(a)||(this.Rt=a=a.Z(),this.pc(),this.h("autoScrollRegion",b,a))});function xg(a,b){a.Qt.assign(b);Rk(a,a.Qt).pd(a.position)?Kf(a):Sk(a)}function Sk(a){-1===a.an&&(a.an=u.setInterval(function(){if(-1!==a.an){Kf(a);var b=a.N.event;if(null!==b){var c=Rk(a,a.Qt);c.pd(a.position)||(a.position=c,a.N.da=a.XE(a.Qt),a.Jw(b,null,b.target.Y)||a.doMouseMove(),a.fi=!0,jj(a,a.mg()),a.Nd=!0,a.df(),Sk(a))}}},a.lF))}function Kf(a){-1!==a.an&&(u.clearInterval(a.an),a.an=-1)}function Rk(a,b){var c=a.position,d=a.SC;if(0>=d.top&&0>=d.left&&0>=d.right&&0>=d.bottom){return c}var e=a.ob,f=a.scale,e=u.Vj(0,0,e.width*f,e.height*f),h=u.Yb(0,0);if(b.x>=e.x&&b.x<e.x+d.left){var k=Math.max(a.mt,1),k=k|0;h.x-=k;b.x<e.x+d.left/2&&(h.x-=k);b.x<e.x+d.left/4&&(h.x-=4*k)}else{b.x<=e.x+e.width&&b.x>e.x+e.width-d.right&&(k=Math.max(a.mt,1),k|=0,h.x+=k,b.x>e.x+e.width-d.right/2&&(h.x+=k),b.x>e.x+e.width-d.right/4&&(h.x+=4*k))}b.y>=e.y&&b.y<e.y+d.top?(k=Math.max(a.nt,1),k|=0,h.y-=k,b.y<e.y+d.top/2&&(h.y-=k),b.y<e.y+d.top/4&&(h.y-=4*k)):b.y<=e.y+e.height&&b.y>e.y+e.height-d.bottom&&(k=Math.max(a.nt,1),k|=0,h.y+=k,b.y>e.y+e.height-d.bottom/2&&(h.y+=k),b.y>e.y+e.height-d.bottom/4&&(h.y+=4*k));h.pd(K.Wj)||(c=new w(c.x+h.x/f,c.y+h.y/f));u.ic(e);u.v(h);return c}D.prototype.makeSVG=D.prototype.makeSvg=function(a){void 0===a&&(a=new pa);a.context="svg";a=Tk(this,a);return null!==a?a.tl:null};D.prototype.makeImage=function(a){void 0===a&&(a=new pa);var b=(a.document||document).createElement("img");b.src=this.uH(a);return b};D.prototype.makeImageData=D.prototype.uH=function(a){void 0===a&&(a=new pa);var b=Tk(this,a);return null!==b?b.toDataURL(a.type,a.details):""};var Uk=!1;function Tk(a,b){a.Mb.Ni();a.df();if(null===a.kb){return null}"object"!==typeof b&&u.k("properties argument must be an Object.");var c=!1,d=b.size||null,e=b.scale||null;void 0!==b.scale&&isNaN(b.scale)&&(e="NaN");var f=b.maxSize;void 0===b.maxSize&&(c=!0,f="svg"===b.context?new ia(Infinity,Infinity):new ia(2000,2000));var h=b.position||null,k=b.parts||null,l=void 0===b.padding?1:b.padding,m=b.background||null,n=b.omitTemporary;void 0===n&&(n=!0);var p=b.document||document,q=b.elementFinished||null,r=b.showTemporary;void 0===r&&(r=!n);n=b.showGrid;void 0===n&&(n=r);null!==d&&isNaN(d.width)&&isNaN(d.height)&&(d=null);"number"===typeof l?l=new rb(l):l instanceof rb||(l=new rb(0));l.left=Math.max(l.left,0);l.right=Math.max(l.right,0);l.top=Math.max(l.top,0);l.bottom=Math.max(l.bottom,0);a.sn=!1;$i(a);var s=new oa(null,p),t=s.getContext("2d"),v=s;if(!(d||e||k||h)){return s.width=a.Ab+Math.ceil(l.left+l.right),s.height=a.zb+Math.ceil(l.top+l.bottom),"svg"===b.context&&(t=v=new Nc(s.Fd,p,q),t instanceof Nc&&(a.sn=!0)),Gj(a,t,l,new ia(s.width,s.height),a.ac,a.Na,k,m,r,n),a.sn=!0,v}var x=a.Eb.Pv,A=new w(0,0),y=a.Ed.copy();y.vI(a.padding);if(r){for(var C=!0,C=a.$b.n,I=C.length,H=0;H<I;H++){var R=C[H];if(R.visible&&R.zc){for(var aa=R.Db.n,R=aa.length,S=0;S<R;S++){var N=aa[S];N.vz&&N.Ia()&&(N=N.ca,N.I()&&y.Uh(N))}}}}A.x=y.x;A.y=y.y;if(null!==k){var Z,C=!0,aa=k.i;for(aa.reset();aa.next();){I=aa.value,I instanceof G&&(N=I,R=N.layer,null!==R&&!R.visible||null!==R&&!r&&R.zc||!N.Ia()||(N=N.ca,N.I()&&(C?(C=!1,Z=N.copy()):Z.Uh(N))))}C&&(Z=new z(0,0,0,0));y.width=Z.width;y.height=Z.height;A.x=Z.x;A.y=Z.y}null!==h&&h.I()&&(A=h,e||(e=x));C=aa=0;null!==l&&(aa=l.left+l.right,C=l.top+l.bottom);H=I=0;null!==d&&(I=d.width,H=d.height,isFinite(I)&&(I=Math.max(0,I-aa)),isFinite(H)&&(H=Math.max(0,H-C)));Z=h=0;null!==d&&null!==e?("NaN"===e&&(e=x),d.I()?(h=I,Z=H):isNaN(H)?(h=I,Z=y.height*e):(h=y.width*e,Z=H)):null!==d?d.I()?(e=Math.min(I/y.width,H/y.height),h=I,Z=H):isNaN(H)?(e=I/y.width,h=I,Z=y.height*e):(e=H/y.height,h=y.width*e,Z=H):null!==e?"NaN"===e&&f.I()?(e=Math.min((f.width-aa)/y.width,(f.height-C)/y.height),e>x?(e=x,h=y.width,Z=y.height):(h=f.width,Z=f.height)):(h=y.width*e,Z=y.height*e):(e=x,h=y.width,Z=y.height);null!==l?(h+=aa,Z+=C):l=new rb(0);null!==f&&(d=f.width,f=f.height,"svg"!==b.context&&c&&!Uk&&(h>d||Z>f)&&(u.trace("Diagram.makeImage(data): Diagram width or height is larger than the default max size. ("+Math.ceil(h)+"x"+Math.ceil(Z)+" vs 2000x2000) Consider increasing the max size."),Uk=!0),isNaN(d)&&(d=2000),isNaN(f)&&(f=2000),isFinite(d)&&(h=Math.min(h,d)),isFinite(f)&&(Z=Math.min(Z,f)));s.width=Math.ceil(h);s.height=Math.ceil(Z);"svg"===b.context&&(t=v=new Nc(s.Fd,p,q),t instanceof Nc&&(a.sn=!0)); + Gj(a,t,l,new ia(Math.ceil(h),Math.ceil(Z)),e,A,k,m,r,n);a.sn=!0;return v}D.inherit=function(a,b){u.j(a,"function",D,"inherit");u.j(b,"function",D,"inherit");b.BF&&u.k("Cannot inherit from "+u.tg(b));u.Ha(a,b)};function Vi(){this.EF="63ad05bbe23a1786468a4c741b6d2";this.EF===this._tk?this.xh=!0:Vk(this,!1)}function Vk(a,b){var c="f",d=window[u.Fa("76a715b2f73f148a")][u.Fa("72ba13b5")];if(u.Fa("77bb5bb2f32603de")===window[u.Fa("76a715b2f73f148a")][u.Fa("6aba19a7ec351488")]){try{a.xh=!window[u.Fa("4da118b7ec2108")]([u.Fa("5bb806bfea351a904a84515e1b6d38b6")])([u.Fa("49bc19a1e6")])([u.Fa("59bd04a1e6380fa5539b")])([u.Fa("7bb8069ae7")]===u.Fa(u.adym));if(!1===a.xh){return}a.xh=!window[u.Fa("4da118b7ec2108")]([u.Fa("5bb806bfea351a904a84515e1b6d38b6")])([u.Fa("49bc19a1e6")])([u.Fa("59bd04a1e6380fa5539b6c7a197c31bb4cfd3e")])([u.Fa("7bb8069ae7")]===u.Fa(u.adym));if(!1===a.xh){return}}catch(e){}}for(var f=d[u.Fa("76ad18b4f73e")],h=d[u.Fa("73a612b6fb191d")](u.Fa("35e7"))+2;h<f;h++){c+=d[h]}d=c[u.Fa("73a612b6fb191d")](u.Fa(u.adym));0>d&&u.Fa(u.adym)!==u.Fa("7da71ca0ad381e90")&&(d=c[u.Fa("73a612b6fb191d")](u.Fa("76a715b2ef3e149757")));a.xh=0;a.xh&&(c=window.document[u.Fa("79ba13b2f7333e8846865a7d00")]("div"),d=u.Fa("02cncncn"),"."===d[0]&&(d=d[u.Fa("69bd14a0f724128a44")](1)),c[u.Fa("79a417a0f0181a8946")]=d,window.document[u.Fa("78a712aa")]?(window.document[u.Fa("78a712aa")][u.Fa("7bb806b6ed32388c4a875b")](c),d=window[u.Fa("7dad0290ec3b0b91578e5b40007031bf")](c)[u.Fa("7dad0283f1390b81519f4645156528bf")](u.Fa("78a704b7e62456904c9b12701b6532a8")),window.document[u.Fa("78a712aa")][u.Fa("68ad1bbcf533388c4a875b")](c),d&&-1!==d.indexOf(u.Fa(u.YF))&&-1!==d.indexOf(u.Fa(u.ZF))&&(a.xh=!1)):(a.xh=null,b&&(a.xh=!1)))}Vi.prototype.xl=function(a){a.Ig.setTransform(a.pf,0,0,a.pf,0,0);null===this.xh&&Vk(this,!0);return 0<this.xh&&this!==this.CF?!0:!1};Vi.prototype.t=function(){this.CF=null};function Wi(a,b){void 0!==b&&null!==b||u.k("Diagram setup requires an argument DIV.");null!==a.Kb&&u.k("Diagram has already completed setup.");"string"===typeof b?a.Kb=window.document.getElementById(b):b instanceof HTMLDivElement?a.Kb=b:u.k("No DIV or DIV id supplied: "+b);null===a.Kb&&u.k("Invalid DIV id; could not get element with id: "+b);void 0!==a.Kb.Y&&u.k("Invalid div id; div already has a Diagram associated with it.");"static"===window.getComputedStyle(a.Kb,null).position&&(a.Kb.style.position="relative");a.Kb.style["-webkit-tap-highlight-color"]="rgba(255, 255, 255, 0)";a.Kb.style["-ms-touch-action"]="none";a.Kb.innerHTML="";a.Kb.Y=a;var c=new oa(a);c.Fd.innerHTML="This text is displayed if your browser does not support the Canvas HTML element.";void 0!==c.style&&(c.style.position="absolute",c.style.top="0px",c.style.left="0px","rtl"===window.getComputedStyle(a.Kb,null).getPropertyValue("direction")&&(a.wB=!0),c.style.zIndex="2",c.style.FK="none",c.style.webkitUserSelect="none",c.style.MozUserSelect="none");a.Ab=a.Kb.clientWidth||1;a.zb=a.Kb.clientHeight||1;a.kb=c;a.Ig=c.getContext("2d");var d=a.Ig;a.pf=a.computePixelRatio();Ij(a,a.Ab,a.zb);a.ax=d[u.Fa("7eba17a4ca3b1a8346")][u.Fa("78a118b7")](d,u.xl,4,4);a.Kb.insertBefore(c.Fd,a.Kb.firstChild);c=new oa(null);c.width=1;c.height=1;a.Fx=c;a.dB=c.getContext("2d");var c=u.createElement("div"),d=u.createElement("div"),e=u.createElement("div"),f=u.createElement("div");c.style.position="absolute";c.style.overflow="auto";c.style.width=a.Ab+"px";c.style.height=a.zb+"px";c.style.zIndex="1";d.style.position="absolute";d.style.overflow="auto";d.style.width=a.Ab+"px";d.style.height=a.zb+"px";d.style.zIndex="1";e.style.position="absolute";e.style.width="1px";e.style.height="1px";f.style.position="absolute";f.style.width="1px";f.style.height="1px";a.Kb.appendChild(c);a.Kb.appendChild(d);c.appendChild(e);d.appendChild(f);c.onscroll=a.LB;c.onmousedown=a.Tu;c.ontouchstart=a.Tu;c.Y=a;c.bC=!0;d.onscroll=a.LB;d.onmousedown=a.Tu;d.ontouchstart=a.Tu;d.Y=a;d.cC=!0;a.uj=c;a.vj=d;a.uy=e;a.vy=f;a.iE=u.hD(function(){a.mm=null;a.na()},300,!1);a.aF=u.hD(function(){gi(a)},250,!1);a.preventDefault=function(a){a.preventDefault();return !1};a.So=function(b){if(a.isEnabled){a.Nl=!0;var c=a.Ic;u.Hm&&c.kl?(b.preventDefault(),b.simulated=!0,a.Kr=b):(a.Ic=a.Pb,a.Pb=c,nj(a,a,b,c,!0),a.Jw(b,null,b.target.Y)||(a.doMouseMove(),a.Va.isBeyondDragSize()&&(yf(a),a.Sl=0)))}};a.Ro=function(b){if(a.isEnabled){a.Nl=!0;var c=a.Ic;if(u.Hm&&null!==a.Kr){a.Kr=b,b.preventDefault()}else{if(u.Hm&&400>b.timeStamp-a.Tl){b.preventDefault()}else{if(a.Ic=a.Pb,a.Pb=c,nj(a,a,b,c,!0),c.Wk=!0,c.Ue=b.detail,a.nk=c.copy(),!0===c.Xp.simulated){b.preventDefault(),b.simulated=!0}else{if(Ef=null,a.doMouseDown(),1===b.button){return b.preventDefault(),!1}}}}}};a.Uo=function(b){if(a.isEnabled){a.Nl=!0;var c=a.Ic;if(u.Hm){if(400>b.timeStamp-a.Tl){b.preventDefault();return}a.Tl=b.timeStamp}if(u.Hm&&null!==a.Kr){a.Kr=null,b.preventDefault()}else{a.Ic=a.Pb;a.Pb=c;nj(a,a,b,c,!0);c.up=!0;c.Ue=b.detail;if(u.bH||u.cH){b.timeStamp-a.Tl<a.zC&&!a.Va.isBeyondDragSize()?a.Sl++:a.Sl=1,a.Tl=b.timeStamp,c.Ue=a.Sl + }c.bubbles=b.bubbles;b.target.Y&&(c.Eg=b.target.Y);a.JE(b,null,new w,c.Eg)||(a.doMouseUp(),Kf(a),rj(c,b))}}};a.ah=function(b){if(a.isEnabled){var c=a.Ic;a.Ic=a.Pb;a.Pb=c;nj(a,a,b,c,!0);c.bubbles=!0;c.Uk=void 0!==b.wheelDelta?b.wheelDelta:-40*b.detail;a.doMouseWheel();rj(c,b)}};a.To=function(){if(a.isEnabled){a.Nl=!1;var b=a.Va;b.cancelWaitAfter();b instanceof jf&&b.hideToolTip()}};a.SE=function(b){if(a.isEnabled){a.mv=!1;a.Yx=!0;var c=a.Ic;a.Ic=a.Pb;a.Pb=c;pj(a,b,b.targetTouches[0],c,1<b.touches.length);a.doMouseDown();2>b.touches.length&&mj(a,c);rj(c,b)}};a.RE=function(b){if(a.isEnabled){var c=a.Ic;a.Ic=a.Pb;a.Pb=c;var d=null;0<b.changedTouches.length?d=b.changedTouches[0]:0<b.targetTouches.length&&(d=b.targetTouches[0]);qj(a,b,d,c,1<b.touches.length);(a.Va.isBeyondDragSize()||1<b.touches.length)&&yf(a);a.Jw(d?d:b,null,c.Eg)||(a.doMouseMove(),rj(c,b))}};a.QE=function(b){if(a.isEnabled){yf(a);if(a.mv){return b.preventDefault(),!1}var c=a.Ic;a.Ic=a.Pb;a.Pb=c;if(1<b.touches.length){a.An&&(a.Nx=!1)}else{var d=null,e=null;0<b.changedTouches.length?e=b.changedTouches[0]:0<b.targetTouches.length&&(e=b.targetTouches[0]);c.g=a;c.Ue=1;if(null!==e){var d=window.document.elementFromPoint(e.clientX,e.clientY),f,p;d&&d.Y?(p=e,f=d.Y):(p=b.changedTouches[0],f=a);oj(f,p,c);f=e.screenX;p=e.screenY;var q=a.AB;b.timeStamp-a.Tl<a.zC&&!(25<Math.abs(q.x-f)||25<Math.abs(q.y-p))?a.Sl++:a.Sl=1;c.Ue=a.Sl;a.Tl=b.timeStamp;a.AB.m(f,p)}c.jd=0;c.button=0;c.Wk=!1;c.up=!0;c.Uk=0;c.Tc=!1;c.bubbles=!1;c.event=b;c.timestamp=Date.now();c.Eg=null===d?b.target.Y:d.Y?d.Y:null;c.qe=null;a.JE(e?e:b,null,new w,c.Eg)||(a.doMouseUp(),rj(c,b),a.Yx=!1)}}};a.MH=function(b){if("touch"===b.pointerType){var c=a.WB;void 0===c[b.pointerId]&&(a.jr++,c[b.pointerId]=b);a.Ef[0]=null;a.Ef[1]=null;for(var d in c){if(null===a.Ef[0]){a.Ef[0]=c[d]}else{if(null===a.Ef[1]){a.Ef[1]=c[d];break}}}a.isEnabled&&(a.mv=!1,c=a.Ic,a.Ic=a.Pb,a.Pb=c,pj(a,b,b,c,1<a.jr),a.doMouseDown(),2>a.jr&&mj(a,c),rj(c,b))}};a.OH=function(b){if("touch"===b.pointerType&&!(2>a.jr)){var c=a.Ef;c[0].pointerId===b.pointerId&&(c[0]=b);c[1].pointerId===b.pointerId&&(c[1]=b);a.isEnabled&&(c=a.Ic,a.Ic=a.Pb,a.Pb=c,qj(a,b,b,c,!0),yf(a),a.Jw(b,null,c.Eg)||(a.doMouseMove(),rj(c,b)))}};a.NH=function(b){if("touch"===b.pointerType){var c=a.WB;void 0!==c[b.pointerId]&&(a.jr--,delete c[b.pointerId],c=a.Ef,null!==c[0]&&c[0].pointerId===b.pointerId&&(c[0]=null),null!==c[1]&&c[1].pointerId===b.pointerId&&(c[1]=null))}};$i(a);Zi(a)}function Wk(a){1<arguments.length&&u.k("Palette constructor can only take one optional argument, the DIV HTML element or its id.");D.call(this,a);this.Bv=!0;this.Nk=!1;this.nb=!0;this.cD=Db;this.Qb=new Xk}u.Ha(Wk,D);u.fa("Palette",Wk);function Si(a){1<arguments.length&&u.k("Overview constructor can only take one optional argument, the DIV HTML element or its id.");D.call(this,a);this.oh.isEnabled=!1;this.Oc=!0;this.rj=null;this.rF=this.iu=!0;this.kI("drawShadows",!1);var b=new G,c=new X;c.stroke="magenta";c.jb=2;c.fill="transparent";c.name="BOXSHAPE";b.ql=!0;b.$z="BOXSHAPE";b.Az="BOXSHAPE";b.uE="BOXSHAPE";b.cursor="move";b.add(c);this.Dl=b;c=new lf;c.type=oh;c.af=Ib;var d=new ph;d.vg=!0;c.add(d);d=new X;d.Hj=Ib;d.Fb="Rectangle";d.za=new ia(64,64);d.cursor="se-resize";d.alignment=Vb;c.add(d);b.sE=c;this.pm=this.Ij=!1;this.qf=this.ks=!0;this.SC=0;this.Dy=u.createElement("canvas");this.DF=this.Dy.getContext("2d");this.tb.Gd=new Yk;this.tb.vE=new Zk;var e=this;this.click=function(){var a=e.rj;if(null!==a){var b=a.ob,c=e.N.da;a.position=new w(c.x-b.width/2,c.y-b.height/2)}};this.eE=function(){$k(e)};this.dE=function(){null!==e.rj&&(e.pc(),e.na())};this.po=kj;this.Oc=!1}u.Ha(Si,D);u.fa("Overview",Si);function al(a){a.Oc||a.xd||!1!==a.Ff||(a.Ff=!0,requestAnimationFrame(function(){if(a.Ff&&!a.xd&&(a.Ff=!1,null!==a.Kb)){a.xd=!0;ej(a);a.Ed.I()||jj(a,a.mg());null===a.Kb&&u.k("No div specified");null===a.kb&&u.k("No canvas specified");if(a.Nd){var b=a.rj;if(null!==b&&!b.Mb.Xg&&!b.Mb.cd){var b=a.Ig,c=a.Dy;b.setTransform(1,0,0,1,0,0);b.clearRect(0,0,a.kb.width,a.kb.height);b.drawImage(c,0,0);c=a.Td;c.reset();1!==a.ac&&c.scale(a.scale);0===a.position.x&&0===a.position.y||c.translate(-a.Na.x,-a.Na.y);b.setTransform(c.m11,c.m12,c.m21,c.m22,c.dx,c.dy);for(var c=a.$b.n,d=c.length,e=0;e<d;e++){c[e].Xe(b,a)}a.uk=!1;a.Nd=!1}}a.xd=!1}}))}Si.prototype.computePixelRatio=function(){return 1};Si.prototype.Xe=function(){null===this.Kb&&u.k("No div specified");null===this.kb&&u.k("No canvas specified");if(this.Nd){var a=this.rj;if(null!==a&&!a.Mb.Xg&&!a.Mb.cd){if(!this.rF){var b=a.tb.Gd;if(null!==b&&b.oa){return}}Dj(this);b=a.Hs;(null!==b&&b.visible&&isNaN(b.width)||isNaN(b.height))&&vj(a);var c=this.kb,b=this.Ig,d=this.Dy,e=this.DF;d.width=c.width;d.height=c.height;b.Ft="";b.setTransform(1,0,0,1,0,0);b.clearRect(0,0,this.kb.width,this.kb.height);d=this.Td;d.reset();1!==this.ac&&d.scale(this.scale);0===this.position.x&&0===this.position.y||d.translate(-this.Na.x,-this.Na.y);b.setTransform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy); + for(var d=this.iu,f=this.ob,h=a.$b.n,k=h.length,a=0;a<k;a++){var l=h[a],m=b,n=f,p=d;if(l.visible&&0!==l.Hc&&(void 0===p&&(p=!0),p||!l.zc)){1!==l.Hc&&(m.globalAlpha=l.Hc);for(var p=this.scale,l=l.Db.n,q=l.length,r=0;r<q;r++){var s=l[r],t=s.ca;t.ug(n)&&(1<t.width*p||1<t.height*p?s.Xe(m,this):wi(s,m))}m.globalAlpha=1}}e.drawImage(c.Fd,0,0);c=this.$b.n;e=c.length;for(a=0;a<e;a++){c[a].Xe(b,this)}this.Nd=this.uk=!1}}};u.defineProperty(Si,{Mz:"observed"},function(){return this.rj},function(a){var b=this.rj;null!==a&&u.C(a,D,Si,"observed");a instanceof Si&&u.k("Overview.observed Diagram may not be an Overview itself: "+a);b!==a&&(null!==b&&(this.remove(this.Vg),b.mE("ViewportBoundsChanged",this.eE),b.mE("DocumentBoundsChanged",this.dE),b.Yl.remove(this)),this.rj=a,null!==a&&(a.My("ViewportBoundsChanged",this.eE),a.My("DocumentBoundsChanged",this.dE),a.Yl.add(this),this.add(this.Vg),$k(this)),this.pc(),this.h("observed",b,a))});u.defineProperty(Si,{Vg:"box"},function(){return this.Dl},function(a){var b=this.Dl;b!==a&&(this.Dl=a,this.remove(b),this.add(this.Dl),$k(this),this.h("box",b,a))});u.defineProperty(Si,{zJ:"drawsTemporaryLayers"},function(){return this.iu},function(a){this.iu!==a&&(this.iu=a,this.Tz())});function $k(a){var b=a.Vg;if(null!==b){var c=a.rj;if(null!==c){a.Nd=!0;var c=c.ob,d=b.ot,e=u.vl();e.m(c.width,c.height);d.za=e;u.Oj(e);a=2/a.scale;d instanceof X&&(d.jb=a);b.location=new w(c.x-a/2,c.y-a/2)}}}Si.prototype.mg=function(){var a=this.rj;return null===a?K.kF:a.Ed};Si.prototype.oz=function(){!0!==this.Nd&&(this.Nd=!0,al(this))};Si.prototype.et=function(a){this.Oc||(cj(this),this.na(),sj(this),this.pc(),$k(this),this.Ba("ViewportBoundsChanged",null,a))};function Yk(){uf.call(this);this.Ck=null}u.Ha(Yk,uf);Yk.prototype.canStart=function(){if(!this.isEnabled){return !1}var a=this.g;if(null===a||!a.Nk||!a.qf){return !1}var b=a.Mz;if(null===b){return !1}if(null===this.findDraggablePart()){var c=b.ob;this.Ck=new w(c.width/2,c.height/2);a=a.uc.da;b.position=new w(a.x-this.Ck.x,a.y-this.Ck.y)}return !0};Yk.prototype.doActivate=function(){this.Ck=null;uf.prototype.doActivate.call(this)};Yk.prototype.moveParts=function(){var a=this.g,b=a.Mz;if(null!==b){var c=a.Vg;if(null!==c){if(null===this.Ck){var d=a.uc.da,c=c.location;this.Ck=new w(d.x-c.x,d.y-c.y)}a=a.N.da;b.position=new w(a.x-this.Ck.x,a.y-this.Ck.y)}}};function Zk(){mh.call(this)}u.Ha(Zk,mh);Zk.prototype.resize=function(a){var b=this.g.Mz;if(null!==b){var c=b.ob.copy();b.position=a.position;(c.width!==a.width||c.height!==a.height)&&0<a.width&&0<a.height&&(b.scale=Math.min(c.width/a.width,c.height/a.height))}};function ga(a){1<arguments.length&&u.k("Brush constructor can take at most one optional argument, the Brush type.");u.gc(this);this.Ea=!1;void 0===a?(this.pa=te,this.en="black"):"string"===typeof a?(this.pa=te,this.en=a):(this.pa=a,this.en="black");var b=this.pa;b===ue?(this.co=Db,this.un=Ub):this.un=b===ve?this.co=Ib:this.co=vb;this.jv=0;this.ju=NaN;this.Hg=this.Yu=this.Gg=null;this.mx=this.nx=0}u.fa("Brush",ga);var te;ga.Solid=te=u.s(ga,"Solid",0);var ue;ga.Linear=ue=u.s(ga,"Linear",1);var ve;ga.Radial=ve=u.s(ga,"Radial",2);var bl;ga.Pattern=bl=u.s(ga,"Pattern",4);ga.prototype.copy=function(){var a=new ga;a.pa=this.pa;a.en=this.en;a.co=this.co.Z();a.un=this.un.Z();a.jv=this.jv;a.ju=this.ju;null!==this.Gg&&(a.Gg=this.Gg.copy());a.Yu=this.Yu;return a};ga.prototype.La=function(){this.freeze();Object.freeze(this);return this};ga.prototype.freeze=function(){this.Ea=!0;null!==this.Gg&&this.Gg.freeze();return this};ga.prototype.Ma=function(){Object.isFrozen(this)&&u.k("cannot thaw constant: "+this);this.Ea=!1;null!==this.Gg&&this.Gg.Ma();return this};ga.prototype.toString=function(){var a="Brush(";if(this.type===te){a+=this.color}else{if(a=this.type===ue?a+"Linear ":this.type===ve?a+"Radial ":this.type===bl?a+"Pattern ":a+"(unknown) ",a+=this.start+" "+this.end,null!==this.qs){for(var b=this.qs.i;b.next();){a+=" "+b.key+":"+b.value}}}return a+")"};ga.prototype.addColorStop=ga.prototype.addColorStop=function(a,b){u.J(this);("number"!==typeof a||!isFinite(a)||1<a||0>a)&&u.xa(a,"0 <= loc <= 1",ga,"addColorStop:loc");u.j(b,"string",ga,"addColorStop:color");null===this.Gg&&(this.Gg=new la("number","string"));this.Gg.add(a,b);this.pa===te&&(this.type=ue);this.Hg=null};u.defineProperty(ga,{type:"type"},function(){return this.pa},function(a){u.J(this,a);u.rb(a,ga,ga,"type");this.pa=a;this.start.oe()&&(a===ue?this.start=Db:a===ve&&(this.start=Ib));this.end.oe()&&(a===ue?this.end=Ub:a===ve&&(this.end=Ib));this.Hg=null});u.defineProperty(ga,{color:"color"},function(){return this.en},function(a){u.J(this,a);this.en=a;this.Hg=null});u.defineProperty(ga,{start:"start"},function(){return this.co},function(a){u.J(this,a);u.C(a,L,ga,"start");this.co=a.Z();this.Hg=null});u.defineProperty(ga,{end:"end"},function(){return this.un},function(a){u.J(this,a);u.C(a,L,ga,"end");this.un=a.Z();this.Hg=null});u.defineProperty(ga,{vt:"startRadius"},function(){return this.jv},function(a){u.J(this,a); + u.Be(a,ga,"startRadius");0>a&&u.xa(a,">= zero",ga,"startRadius");this.jv=a;this.Hg=null});u.defineProperty(ga,{vs:"endRadius"},function(){return this.ju},function(a){u.J(this,a);u.Be(a,ga,"endRadius");0>a&&u.xa(a,">= zero",ga,"endRadius");this.ju=a;this.Hg=null});u.defineProperty(ga,{qs:"colorStops"},function(){return this.Gg},function(a){u.J(this,a);this.Gg=a;this.Hg=null});u.defineProperty(ga,{pattern:"pattern"},function(){return this.Yu},function(a){u.J(this,a);this.Yu=a;this.Hg=null});ga.randomColor=function(a,b){void 0===a&&(a=128);void 0===b&&(b=Math.max(a,255));var c=Math.abs(b-a),d=Math.floor(a+Math.random()*c).toString(16),e=Math.floor(a+Math.random()*c).toString(16),c=Math.floor(a+Math.random()*c).toString(16);2>d.length&&(d="0"+d);2>e.length&&(e="0"+e);2>c.length&&(c="0"+c);return"#"+d+e+c};var cl=u.createElement("canvas").getContext("2d"),fa;ga.isValidColor=fa=function(a){if("black"===a){return !0}if(""===a){return !1}cl.fillStyle="#000000";var b=cl.fillStyle;cl.fillStyle=a;if(cl.fillStyle!==b){return !0}cl.fillStyle="#FFFFFF";b=cl.fillStyle;cl.fillStyle=a;return cl.fillStyle!==b};function T(){u.gc(this);this.ea=30723;this.Hc=1;this.Rg=null;this.Vb="";this.lc=this.Jb=null;this.Na=(new w(NaN,NaN)).freeze();this.lf=(new ia(NaN,NaN)).freeze();this.nj=K.qp;this.lj=K.jF;this.Td=new ja;this.$m=new ja;this.yk=new ja;this.ac=this.gu=1;this.Al=0;this.Jh=dl;this.Iq=K.pp;this.Pc=(new z(NaN,NaN,NaN,NaN)).freeze();this.Zb=(new z(NaN,NaN,NaN,NaN)).freeze();this.Gc=(new z(0,0,NaN,NaN)).freeze();this.Ur=this.Yp=this.R=this.kr=this.lr=null;this.Vr=this.Zp=Infinity;this.xp=this.ue=uc;this.yr=0;this.tj=1;this.Ep=0;this.Wi=1;this.Cr=-Infinity;this.Br=0;this.Dr=K.Wj;this.Er=dh;this.Lp="";this.Fc=this.Q=null;this.bn=-1;this.$l=this.Yh=this.Fl=this.bo=null}u.Nh(T);u.fa("GraphObject",T);T.prototype.cloneProtected=function(a){a.ea=this.ea|6144;a.Hc=this.Hc;a.Vb=this.Vb;a.Jb=this.Jb;a.lc=this.lc;a.Na.assign(this.Na);a.lf.assign(this.lf);a.nj=this.nj.Z();a.lj=this.lj.Z();a.yk=this.yk.copy();a.ac=this.ac;a.Al=this.Al;a.Jh=this.Jh;a.Iq=this.Iq.Z();a.Pc.assign(this.Pc);a.Zb.assign(this.Zb);a.Gc.assign(this.Gc);a.kr=this.kr;a.R=null!==this.R?this.R.copy():null;a.Yp=this.Yp;a.Zp=this.Zp;a.Ur=this.Ur;a.Vr=this.Vr;a.ue=this.ue.Z();a.xp=this.xp.Z();a.yr=this.yr;a.tj=this.tj;a.Ep=this.Ep;a.Wi=this.Wi;a.Cr=this.Cr;a.Br=this.Br;a.Dr=this.Dr.Z();a.Er=this.Er;a.Lp=this.Lp;a.Q=null!==this.Q?this.Q.copy():null;a.Fc=this.Fc;a.bn=this.bn;if(null!==this.Fl){a.Fl=u.Pk(this.Fl);for(var b=0;b<this.Fl.length;b++){var c=this.Fl[b];a[c]=this[c]}}null!==this.Yh&&(a.Yh=this.Yh.copy())};T.prototype.Oh=function(a){a.lr=null;a.$l=null;a.S()};T.prototype.clone=function(){var a=new this.constructor;this.cloneProtected(a);return a};T.prototype.copy=function(){return this.clone()};T.prototype.toString=function(){return u.tg(Object.getPrototypeOf(this))+"#"+u.Uc(this)};var qh;T.None=qh=u.s(T,"None",0);var dl;T.Default=dl=u.s(T,"Default",0);var el;T.Vertical=el=u.s(T,"Vertical",4);var fl;T.Horizontal=fl=u.s(T,"Horizontal",5);var cd;T.Fill=cd=u.s(T,"Fill",3);var sh;T.Uniform=sh=u.s(T,"Uniform",1);var th;T.UniformToFill=th=u.s(T,"UniformToFill",2);function gl(a){a.Q=new hl}T.prototype.Fe=function(){var a=new il;a.cj=vb;a.Ej=vb;a.aj=10;a.Cj=10;a.$i=jl;a.Bj=jl;a.bj=0;a.Dj=0;this.R=a};function kl(a,b,c,d,e,f,h){var k=0.001,l=f.length;a.moveTo(b,c);d-=b;k=e-c;0===d&&(d=0.001);e=k/d;for(var m=Math.sqrt(d*d+k*k),n=0,p=!0,q=0===h?!1:!0;0.1<=m;){if(q){k=f[n++%l];for(k-=h;0>k;){k+=f[n++%l],p=!p}q=!1}else{k=f[n++%l]}k>m&&(k=m);var r=Math.sqrt(k*k/(1+e*e));0>d&&(r=-r);b+=r;c+=e*r;p?a.lineTo(b,c):a.moveTo(b,c);m-=k;p=!p}}T.prototype.raiseChangedEvent=T.prototype.Cc=function(a,b,c,d,e,f,h){var k=this.W;null!==k&&(k.Pm(a,b,c,d,e,f,h),0!==(this.ea&1024)&&c===this&&a===$d&&ll(this,k,b))};function ll(a,b,c){var d=a.Co();if(null!==d){for(var e=a.Fc.i;e.next();){var f=e.value,h=null;if(null!==f.Rm){h=ef(f,d,a);if(null===h){continue}f.Ow(a,h,c,null)}else{if(f.yt){var k=b.g;null!==k&&f.Ow(a,k.ha.$s,c,k)}else{var l=d.data;if(null===l){continue}k=b.g;null!==k&&k.Kw||f.Ow(a,l,c,k)}}null!==h&&(k=d.Vv(f.ul),null!==k&&f.ZE(k,h,c))}}}T.prototype.Vv=function(a){return this.bn===a?this:null};T.prototype.raiseChanged=T.prototype.h=function(a,b,c){this.Cc($d,a,this,b,c)};function ml(a,b,c,d,e){var f=a.Pc,h=a.yk;h.reset();nl(a,h,b,c,d,e);a.yk=h;f.x=b;f.y=c;f.width=d;f.height=e;h.Ps()||h.WE(f)}function ol(a,b,c,d){if(!1===a.Cg){return !1}d.multiply(a.transform);return c?a.ug(b,d):a.wm(b,d)}T.prototype.tD=function(a,b,c){if(!1===this.Cg){return !1}var d=this.Ja;b=a.Lj(b);var e=!1;c&&(e=Xa(a.x,a.y,0,0,0,d.height)<b||Xa(a.x,a.y,0,d.height,d.width,d.height)<b||Xa(a.x,a.y,d.width,d.height,d.width,0)<b||Xa(a.x,a.y,d.width,0,0,0)<b);c||(e=Xa(a.x,a.y,0,0,0,d.height)<b&&Xa(a.x,a.y,0,d.height,d.width,d.height)<b&&Xa(a.x,a.y,d.width,d.height,d.width,0)<b&&Xa(a.x,a.y,d.width,0,0,0)<b);return e};T.prototype.Uf=function(){return !0};T.prototype.containsPoint=T.prototype.Da=function(a){var b=u.K();b.assign(a); + this.transform.bb(b);var c=this.ca;if(!c.I()){return !1}var d=this.g;if(null!==d&&d.Yx){var e=d.hz("extraTouchThreshold"),f=d.hz("extraTouchArea"),h=f/2,k=this.Ja,d=this.Ii()*d.scale,l=1/d;if(k.width*d<e&&k.height*d<e){return a=qb(c.x-h*l,c.y-h*l,c.width+f*l,c.height+f*l,b.x,b.y),u.v(b),a}}if(this instanceof lf||this instanceof X?qb(c.x-5,c.y-5,c.width+10,c.height+10,b.x,b.y):c.Da(b)){if(this.Yh&&!this.Yh.Da(b)){return !1}if(null!==this.lc&&c.Da(b)||null!==this.Jb&&this.Gc.Da(a)){return !0}u.v(b);return this.Jj(a)}u.v(b);return !1};T.prototype.Jj=function(a){var b=this.Ja;return qb(0,0,b.width,b.height,a.x,a.y)};T.prototype.containsRect=T.prototype.Kj=function(a){if(0===this.angle){return this.ca.Kj(a)}var b=this.Ja,b=u.Vj(0,0,b.width,b.height),c=this.transform,d=!1,e=u.Yb(a.x,a.y);b.Da(c.Qh(e))&&(e.m(a.x,a.bottom),b.Da(c.Qh(e))&&(e.m(a.right,a.bottom),b.Da(c.Qh(e))&&(e.m(a.right,a.y),b.Da(c.Qh(e))&&(d=!0))));u.v(e);u.ic(b);return d};T.prototype.containedInRect=T.prototype.wm=function(a,b){if(void 0===b){return a.Kj(this.ca)}var c=this.Ja,d=!1,e=u.Yb(0,0);a.Da(b.bb(e))&&(e.m(0,c.height),a.Da(b.bb(e))&&(e.m(c.width,c.height),a.Da(b.bb(e))&&(e.m(c.width,0),a.Da(b.bb(e))&&(d=!0))));return d};T.prototype.intersectsRect=T.prototype.ug=function(a,b){if(void 0===b&&(b=this.transform,0===this.angle)){return a.ug(this.ca)}var c=this.Ja,d=b,e=u.Yb(0,0),f=u.Yb(0,c.height),h=u.Yb(c.width,c.height),k=u.Yb(c.width,0),l=!1;if(a.Da(d.bb(e))||a.Da(d.bb(f))||a.Da(d.bb(h))||a.Da(d.bb(k))){l=!0}else{var c=u.Vj(0,0,c.width,c.height),m=u.Yb(a.x,a.y);c.Da(d.Qh(m))?l=!0:(m.m(a.x,a.bottom),c.Da(d.Qh(m))?l=!0:(m.m(a.right,a.bottom),c.Da(d.Qh(m))?l=!0:(m.m(a.right,a.y),c.Da(d.Qh(m))&&(l=!0))));u.v(m);u.ic(c);!l&&(K.ew(a,e,f)||K.ew(a,f,h)||K.ew(a,h,k)||K.ew(a,k,e))&&(l=!0)}u.v(e);u.v(f);u.v(h);u.v(k);return l};T.prototype.getDocumentPoint=T.prototype.eb=function(a,b){void 0===b&&(b=new w);a.oe()&&u.k("getDocumentPoint:s Spot must be real: "+a.toString());var c=this.Ja;b.m(a.x*c.width+a.offsetX,a.y*c.height+a.offsetY);this.Gf.bb(b);return b};T.prototype.getDocumentAngle=T.prototype.Zk=function(){var a;a=this.Gf;1===a.m11&&0===a.m12?a=0:(a=180*Math.atan2(a.m12,a.m11)/Math.PI,0>a&&(a+=360));return a};T.prototype.getDocumentScale=T.prototype.Ii=function(){if(0!==(this.ea&4096)===!1){return this.gu}var a=this.ac;return null!==this.P?a*this.P.Ii():a};T.prototype.getLocalPoint=T.prototype.AD=function(a,b){void 0===b&&(b=new w);b.assign(a);this.Gf.Qh(b);return b};T.prototype.getNearestIntersectionPoint=T.prototype.bl=function(a,b,c){return this.Fo(a.x,a.y,b.x,b.y,c)};g=T.prototype;g.Fo=function(a,b,c,d,e){var f=this.transform,h=1/(f.m11*f.m22-f.m12*f.m21),k=f.m22*h,l=-f.m12*h,m=-f.m21*h,n=f.m11*h,p=h*(f.m21*f.dy-f.m22*f.dx),q=h*(f.m12*f.dx-f.m11*f.dy);if(null!==this.rm){return f=this.ca,K.bl(f.left,f.top,f.right,f.bottom,a,b,c,d,e)}h=a*k+b*m+p;a=a*l+b*n+q;b=c*k+d*m+p;c=c*l+d*n+q;e.m(0,0);d=this.Ja;c=K.bl(0,0,d.width,d.height,h,a,b,c,e);e.transform(f);return c};function Ph(a,b,c,d,e){if(!1!==Aj(a)){var f=a.margin,h=f.right+f.left,f=f.top+f.bottom;b=Math.max(b-h,0);c=Math.max(c-f,0);e=e||0;d=Math.max((d||0)-h,0);e=Math.max(e-f,0);var h=a.angle,f=0,f=a.za,k=0;a.jb&&(k=a.jb);90===h||270===h?(b=isFinite(f.height)?f.height+k:b,c=isFinite(f.width)?f.width+k:c):(b=isFinite(f.width)?f.width+k:b,c=isFinite(f.height)?f.height+k:c);var f=d||0,k=e||0,l=a instanceof B;switch(pl(a,!0)){case qh:k=f=0;l&&(c=b=Infinity);break;case cd:isFinite(b)&&b>d&&(f=b);isFinite(c)&&c>e&&(k=c);break;case fl:isFinite(b)&&b>d&&(f=b);k=0;l&&(c=Infinity);break;case el:isFinite(c)&&c>e&&(k=c),f=0,l&&(b=Infinity)}var l=a.cf,m=a.xg;f>l.width&&m.width<l.width&&(f=l.width);k>l.height&&m.height<l.height&&(k=l.height);d=Math.max(f/a.scale,m.width);e=Math.max(k/a.scale,m.height);l.width<d&&(d=Math.min(m.width,d));l.height<e&&(e=Math.min(m.height,e));b=Math.min(l.width,b);c=Math.min(l.height,c);b=Math.max(d,b);c=Math.max(e,c);if(90===h||270===h){f=b,b=c,c=f,f=d,d=e,e=f}a.Pc.Ma();a.Qo(b,c,d,e);a.Pc.freeze();a.Pc.I()||u.k("Non-real measuredBounds has been set. Object "+a+", measuredBounds: "+a.Pc.toString());uj(a,!1)}}g.yc=function(a,b,c,d,e){this.Lg();var f=u.Tf();f.assign(this.Zb);this.Zb.Ma();if(!1===Bj(this)){var h=this.Zb;h.x=a;h.y=b;h.width=c;h.height=d}else{this.yi(a,b,c,d)}this.Zb.freeze();this.Yh=void 0===e?null:e;c=!1;void 0!==e?c=!0:null!==this.P&&(e=this.P.Gc,d=this.Ca,null!==this.rm&&(d=this.Zb),c=b+d.height,d=a+d.width,c=!(0<=a+0.05&&d<=e.width+0.05&&0<=b+0.05&&c<=e.height+0.05),this instanceof qa&&(a=this.Gc,this.Iu>a.height||this.ej.Pe>a.width))&&(c=!0);this.ea=c?this.ea|256:this.ea&-257;this.Zb.I()||u.k("Non-real actualBounds has been set. Object "+this+", actualBounds: "+this.Zb.toString());this.uw(f,this.Zb);u.ic(f)};g.yi=function(){};function ql(a,b,c,d,e){var f=a.ca;f.x=b;f.y=c;f.width=d;f.height=e;if(!a.za.I()){f=a.Pc;c=a.margin;b=c.right+c.left;var h=c.top+c.bottom;c=f.width+b;f=f.height+h;d+=b;e+=h;b=pl(a,!0);c===d&&f===e&&(b=qh);switch(b){case qh:if(c>d||f>e){uj(a,!0),Ph(a,c>d?d:c,f>e?e:f) + }break;case cd:uj(a,!0);Ph(a,d,e,0,0);break;case fl:uj(a,!0);Ph(a,d,f,0,0);break;case el:uj(a,!0),Ph(a,c,e,0,0)}}}g.uw=function(){rl(this,!1);var a=this.W;null!==a&&null!==a.g&&(a.dl(),this.Su(a),this.na(),a=this.W,null!==a&&(a.ot!==this&&a.tE!==this&&a.wE!==this||sl(a,!0)))};g.Su=function(a){null!==this.Kd&&sl(a,!0)};g.Xe=function(a,b){if(this.visible){var c=this.opacity,d=1;if(1!==c){if(0===c){return}d=a.globalAlpha;a.globalAlpha=d*c}if(a instanceof Nc){a:{if(this.visible){var e=null,f=a.lw;if(this instanceof B&&(this.type===tl||this.type===ul)){vl(this,a,b)}else{var h=this.Zb;if(0!==h.width&&0!==h.height&&!isNaN(h.x)&&!isNaN(h.y)){var k=this.transform,l=this.P;0!==(this.ea&4096)===!0&&wl(this);var m=0!==(this.ea&256),n=!1;this instanceof qa&&xl(this,a);if(m){n=l.Uf()?l.Ja:l.ca;if(this.Yh){var p=this.Yh,q=p.x,r=p.y,s=p.width,p=p.height}else{q=Math.max(h.x,n.x),r=Math.max(h.y,n.y),s=Math.min(h.right,n.right)-q,p=Math.min(h.bottom,n.bottom)-r}if(q>h.width+h.x||h.x>n.width+n.x||r>h.height+h.y||h.y>n.height+n.y){break a}n=!0;Uc(a,1,0,0,1,0,0);a.save();a.beginPath();a.rect(q,r,s,p);a.clip()}q=!1;if(this instanceof G&&(q=!0,!this.Ia())){break a}r=!1;s=b.Sg;this.W&&s.drawShadows&&(r=this.W.il);a.Fi.bf=[1,0,0,1,0,0];null!==this.lc&&(yl(this,a,this.lc,!0,!0),this.lc instanceof ga&&this.lc.type===ve?(a.beginPath(),a.rect(h.x,h.y,h.width,h.height),zl(a,this.lc)):a.fillRect(h.x,h.y,h.width,h.height));q&&this.il&&s.drawShadows&&(Uc(a,1,0,0,1,0,0),h=this.im,a.shadowOffsetX=h.x,a.shadowOffsetY=h.y,a.shadowColor=this.hm,a.shadowBlur=this.gm/b.scale,a.ab());this instanceof B?Uc(a,k.m11,k.m12,k.m21,k.m22,k.dx,k.dy):a.Fi.bf=[k.m11,k.m12,k.m21,k.m22,k.dx,k.dy];if(null!==this.Jb){var p=this.Ja,h=k=0,s=p.width,p=p.height,t=0;this instanceof X&&(p=this.Qa.mb,k=p.x,h=p.y,s=p.width,p=p.height,t=this.Ug);yl(this,a,this.Jb,!0,!1);this.Jb instanceof ga&&this.Jb.type===ve?(a.beginPath(),a.rect(k-t/2,h-t/2,s+t,p+t),zl(a,this.Jb)):a.fillRect(k-t/2,h-t/2,s+t,p+t)}s=h=k=0;r&&(null!==this.Jb||null!==this.lc||null!==l&&0!==(l.ea&512)||null!==l&&l.type===Yi&&l.Jf()!==this)?(Al(this,!0),k=a.shadowOffsetX,h=a.shadowOffsetY,s=a.shadowBlur,a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0):Al(this,!1);this.Mj(a,b);r&&0!==(this.ea&512)===!0&&(a.shadowOffsetX=k,a.shadowOffsetY=h,a.shadowBlur=s);q&&r&&(a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0);m&&(a.restore(),n&&a.tf.pop(),$i(b,a));this instanceof B&&(e=a.tf.pop());q&&r&&a.tf.pop();null!==a.oD&&(null===e&&(f===a.lw?(Uc(a,1,0,0,1,0,0),e=a.tf.pop()):e=a.lw),a.oD(this,e))}}}}}else{if(this instanceof B&&(this.type===tl||this.type===ul)){vl(this,a,b);1!==c&&(a.globalAlpha=d);return}q=this.Zb;if(0!==q.width&&0!==q.height&&!isNaN(q.x)&&!isNaN(q.y)){e=this.transform;f=this.P;0!==(this.ea&4096)===!0&&wl(this);l=0!==(this.ea&256);this instanceof qa&&xl(this,a);if(l){m=f.Uf()?f.Ja:f.ca;this.Yh?(h=this.Yh,n=h.x,r=h.y,k=h.width,h=h.height):(n=Math.max(q.x,m.x),r=Math.max(q.y,m.y),k=Math.min(q.right,m.right)-n,h=Math.min(q.bottom,m.bottom)-r);if(n>q.width+q.x||q.x>m.width+m.x||r>q.height+q.y||q.y>m.height+m.y){1!==c&&(a.globalAlpha=d);return}a.save();a.beginPath();a.rect(n,r,k,h);a.clip()}r=b.Sg;m=!1;if(this instanceof G){m=!0;if(!this.Ia()){1!==c&&(a.globalAlpha=d);return}this.il&&r.drawShadows&&(n=this.im,a.shadowOffsetX=n.x*b.scale*b.pf,a.shadowOffsetY=n.y*b.scale*b.pf,a.shadowColor=this.hm,a.shadowBlur=this.gm)}n=!1;this.W&&r.drawShadows&&(n=this.W.il);null!==this.lc&&(yl(this,a,this.lc,!0,!0),this.lc instanceof ga&&this.lc.type===ve?(a.beginPath(),a.rect(q.x,q.y,q.width,q.height),zl(a,this.lc)):a.fillRect(q.x,q.y,q.width,q.height));e.Ps()||a.transform(e.m11,e.m12,e.m21,e.m22,e.dx,e.dy);null!==this.Jb&&(h=this.Ja,r=q=0,k=h.width,h=h.height,s=0,this instanceof X&&(h=this.Qa.mb,q=h.x,r=h.y,k=h.width,h=h.height,s=this.Ug),yl(this,a,this.Jb,!0,!1),this.Jb instanceof ga&&this.Jb.type===ve?(a.beginPath(),a.rect(q-s/2,r-s/2,k+s,h+s),zl(a,this.Jb)):a.fillRect(q-s/2,r-s/2,k+s,h+s));k=r=q=0;n&&(null!==this.Jb||null!==this.lc||null!==f&&0!==(f.ea&512)||null!==f&&(f.type===Yi||f.type===oh)&&f.Jf()!==this)?(Al(this,!0),q=a.shadowOffsetX,r=a.shadowOffsetY,k=a.shadowBlur,a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0):Al(this,!1);this.Mj(a,b);n&&0!==(this.ea&512)===!0&&(a.shadowOffsetX=q,a.shadowOffsetY=r,a.shadowBlur=k);m&&n&&(a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0);l?(a.restore(),this instanceof B?$i(b,a,!0):$i(b,a,!1)):e.Ps()||(f=1/(e.m11*e.m22-e.m12*e.m21),a.transform(e.m22*f,-e.m12*f,-e.m21*f,e.m11*f,f*(e.m21*e.dy-e.m22*e.dx),f*(e.m12*e.dx-e.m11*e.dy)))}}1!==c&&(a.globalAlpha=d)}};function vl(a,b,c){var d=a.Zb;0===d.width||0===d.height||isNaN(d.x)||isNaN(d.y)||(null!==a.lc&&(yl(a,b,a.lc,!0,!0),a.lc instanceof ga&&a.lc.type===ve?(b.beginPath(),b.rect(d.x,d.y,d.width,d.height),zl(b,a.lc)):b.fillRect(d.x,d.y,d.width,d.height)),null!==a.Jb&&(yl(a,b,a.Jb,!0,!1),a.Jb instanceof ga&&a.Jb.type===ve?(b.beginPath(),b.rect(d.x,d.y,d.width,d.height),zl(b,a.Jb)):b.fillRect(d.x,d.y,d.width,d.height)),a.Mj(b,c)) + }g.Mj=function(){};function zl(a,b){if(b instanceof ga&&b.type===ve&&!(a instanceof Nc)){var c=b.nx,d=b.mx;d>c?(a.scale(c/d,1),a.translate((d-c)/2,0)):c>d&&(a.scale(1,d/c),a.translate(0,(c-d)/2));a.Gt?a.clip():a.fill();d>c?(a.translate(-(d-c)/2,0),a.scale(1/(c/d),1)):c>d&&(a.translate(0,-(c-d)/2),a.scale(1,1/(d/c)))}else{a.Gt?a.clip():a.fill()}}function Bl(a){a.Gt||a.stroke()}function yl(a,b,c,d,e){if(null!==c){var f=1,h=1;if("string"===typeof c){d?b.Vm!==c&&(b.fillStyle=c,b.Vm=c):b.Wm!==c&&(b.strokeStyle=c,b.Wm=c)}else{if(c.type===te){c=c.color,d?b.Vm!==c&&(b.fillStyle=c,b.Vm=c):b.Wm!==c&&(b.strokeStyle=c,b.Wm=c)}else{var k,h=a.Ja,f=h.width,h=h.height;if(e){var l=a.ca,f=l.width,h=l.height}var m=b instanceof CanvasRenderingContext2D;if(m&&(c.Hg&&c.type===bl||c.nx===f&&c.mx===h)){k=c.Hg}else{var n=l=0,p=0,q=0,r=0,s=0,s=r=0;e&&(l=a.ca,f=l.width,h=l.height,r=l.x,s=l.y);l=c.start.x*f+c.start.offsetX;n=c.start.y*h+c.start.offsetY;p=c.end.x*f+c.end.offsetX;q=c.end.y*h+c.end.offsetY;l+=r;p+=r;n+=s;q+=s;c.type===ue?k=b.createLinearGradient(l,n,p,q):c.type===ve?(s=isNaN(c.vs)?Math.max(f,h)/2:c.vs,isNaN(c.vt)?(r=0,s=Math.max(f,h)/2):r=c.vt,k=b.createRadialGradient(l,n,r,p,q,s)):c.type===bl?k=b.createPattern(c.pattern,"repeat"):u.Ld(c.type,"Brush type");if(c.type!==bl&&(a=c.qs,null!==a)){for(a=a.i;a.next();){k.addColorStop(a.key,a.value)}}m&&(c.Hg=k,c.nx=f,c.mx=h)}d?b.Vm!==k&&(b.fillStyle=k,b.Vm=k):b.Wm!==k&&(b.strokeStyle=k,b.Wm=k)}}}}T.prototype.isContainedBy=T.prototype.gl=function(a){if(a instanceof B){a:{if(this!==a&&null!==a){for(var b=this.P;null!==b;){if(b===a){a=!0;break a}b=b.P}}a=!1}}else{a=!1}return a};T.prototype.isVisibleObject=T.prototype.ll=function(){if(!this.visible){return !1}var a=this.P;return null!==a?a.ll():!0};function wl(a){if(0!==(a.ea&2048)===!0){var b=a.Td;b.reset();if(!a.Zb.I()||!a.Pc.I()){Cl(a,!1);return}b.translate(a.Zb.x,a.Zb.y);b.translate(-a.Ca.x,-a.Ca.y);var c=a.Ja;nl(a,b,c.x,c.y,c.width,c.height);Cl(a,!1);Dl(a,!0)}0!==(a.ea&4096)===!0&&(b=a.P,null===b?(a.$m.set(a.Td),a.gu=a.scale,Dl(a,!1)):null!==b.Gf&&(c=a.$m,c.reset(),b.Uf()?c.multiply(b.$m):null!==b.P&&c.multiply(b.P.$m),c.multiply(a.Td),a.gu=a.scale*b.gu,Dl(a,!1)))}function nl(a,b,c,d,e,f){1!==a.scale&&b.scale(a.scale);if(0!==a.angle){var h=Ib;a.af&&a.af.Vc()&&(h=a.af);var k=u.K();if(a instanceof G&&a.fc!==a){for(c=a.fc,d=c.Ja,k.st(d.x,d.y,d.width,d.height,h),c.yk.bb(k),k.offset(-c.Ca.x,-c.Ca.y),h=c.P;null!==h&&h!==a;){h.yk.bb(k),k.offset(-h.Ca.x,-h.Ca.y),h=h.P}}else{k.st(c,d,e,f,h)}b.rotate(a.angle,k.x,k.y);u.v(k)}}g=T.prototype;g.S=function(a){void 0===a&&(a=!1);if(!0!==Aj(this)){uj(this,!0);rl(this,!0);var b=this.P;null!==b?a||b.S():(a=this.g,null!==a&&(a.Zf.add(this),this instanceof U&&(a.ga.fb||this.$e(),null!==this.de&&El(this.de)),a.ee(!0)));if(this instanceof B){if(this.pa===Yi||this.pa===ah){a=this.Jf(),null!==a&&a.S(!0)}a=this.Aa.n;for(var b=a.length,c=0;c<b;c++){var d=a[c];!0!==Aj(d)&&(d.za.I()||(d instanceof ph||d instanceof B||d instanceof qa||pl(d,!1)!==qh)&&d.S(!0))}}}};g.Io=function(){!1===Aj(this)&&(uj(this,!0),rl(this,!0))};function El(a){if(!1===Bj(a)){if(null!==a.P){a.P.S()}else{var b=a.g;null!==b&&(b.Zf.add(a),a instanceof U&&a.$e(),b.ee())}rl(a,!0)}}g.Lg=function(){0!==(this.ea&2048)===!1&&(Cl(this,!0),Dl(this,!0))};g.nz=function(){Dl(this,!0)};g.na=function(){var a=this.W;null!==a&&a.na()};function pl(a,b){var c=a.stretch,d=a.P;if(null!==d&&d.pa===Fl){return Gl(a,d.hd(a.rc),d.gd(a.column),b)}if(null!==d&&d.pa===Yi&&d.Jf()===a){return Hl(a,cd,b)}if(c===dl){if(null!==d){if(d.pa===oh&&d.Jf()===a){return Hl(a,cd,b)}c=d.Dd;return c===dl?Hl(a,qh,b):Hl(a,c,b)}return Hl(a,qh,b)}return Hl(a,c,b)}function Gl(a,b,c,d){var e=a.stretch;if(e!==dl){return Hl(a,e,d)}var f=e=null;switch(b.stretch){case el:f=!0;break;case cd:f=!0}switch(c.stretch){case fl:e=!0;break;case cd:e=!0}b=a.P.Dd;null===e&&(e=b===fl||b===cd);null===f&&(f=b===el||b===cd);return !0===e&&!0===f?Hl(a,cd,d):!0===e?Hl(a,fl,d):!0===f?Hl(a,el,d):Hl(a,qh,d)}function Hl(a,b,c){if(c){return b}if(b===qh){return qh}c=a.za;if(c.I()){return qh}a=a.angle;if(!isNaN(c.width)){if(90!==a&&270!==a){if(b===fl){return qh}if(b===cd){return el}}else{if(b===el){return qh}if(b===cd){return fl}}}if(!isNaN(c.height)){if(90!==a&&270!==a){if(b===el){return qh}if(b===cd){return fl}}else{if(b===fl){return qh}if(b===cd){return el}}}return b}u.defineProperty(T,{Ew:"segmentOrientation"},function(){return this.Er},function(a){var b=this.Er;b!==a&&(this.Er=a,this.S(),this.h("segmentOrientation",b,a),a===dh&&(this.angle=0))});u.defineProperty(T,{Qf:"segmentIndex"},function(){return this.Cr},function(a){a=Math.round(a);var b=this.Cr;b!==a&&(this.Cr=a,this.S(),this.h("segmentIndex",b,a))});u.defineProperty(T,{Dw:"segmentFraction"},function(){return this.Br},function(a){isNaN(a)?a=0:0>a?a=0:1<a&&(a=1);var b=this.Br;b!==a&&(this.Br=a,this.S(),this.h("segmentFraction",b,a))});u.defineProperty(T,{CE:"segmentOffset"},function(){return this.Dr},function(a){var b=this.Dr;b.L(a)||(this.Dr=a=a.Z(),this.S(),this.h("segmentOffset",b,a)) + });u.defineProperty(T,{stretch:"stretch"},function(){return this.Jh},function(a){var b=this.Jh;b!==a&&(this.Jh=a,this.S(),this.h("stretch",b,a))});u.defineProperty(T,{name:"name"},function(){return this.Vb},function(a){var b=this.Vb;b!==a&&(this.Vb=a,null!==this.W&&(this.W.Bk=null),this.h("name",b,a))});u.defineProperty(T,{opacity:"opacity"},function(){return this.Hc},function(a){var b=this.Hc;b!==a&&(u.j(a,"number",T,"opacity"),(0>a||1<a)&&u.xa(a,"0 <= value <= 1",T,"opacity"),this.Hc=a,this.h("opacity",b,a),a=this.g,b=this.W,null!==a&&null!==b&&a.na(Ki(b,b.ca)))});u.defineProperty(T,{visible:"visible"},function(){return 0!==(this.ea&1)},function(a){var b=0!==(this.ea&1);b!==a&&(this.ea^=1,this.h("visible",b,a),b=this.P,null!==b?b.S():this instanceof G&&this.Ie(a),this.na(),Il(this))});u.defineProperty(T,{Cg:"pickable"},function(){return 0!==(this.ea&2)},function(a){var b=0!==(this.ea&2);b!==a&&(this.ea^=2,this.h("pickable",b,a))});u.defineProperty(T,{CG:"fromLinkableDuplicates"},function(){return 0!==(this.ea&4)},function(a){var b=0!==(this.ea&4);b!==a&&(this.ea^=4,this.h("fromLinkableDuplicates",b,a))});u.defineProperty(T,{DG:"fromLinkableSelfNode"},function(){return 0!==(this.ea&8)},function(a){var b=0!==(this.ea&8);b!==a&&(this.ea^=8,this.h("fromLinkableSelfNode",b,a))});u.defineProperty(T,{zI:"toLinkableDuplicates"},function(){return 0!==(this.ea&16)},function(a){var b=0!==(this.ea&16);b!==a&&(this.ea^=16,this.h("toLinkableDuplicates",b,a))});u.defineProperty(T,{AI:"toLinkableSelfNode"},function(){return 0!==(this.ea&32)},function(a){var b=0!==(this.ea&32);b!==a&&(this.ea^=32,this.h("toLinkableSelfNode",b,a))});u.defineProperty(T,{vg:"isPanelMain"},function(){return 0!==(this.ea&64)},function(a){var b=0!==(this.ea&64);b!==a&&(this.ea^=64,this.S(),this.h("isPanelMain",b,a))});u.defineProperty(T,{qz:"isActionable"},function(){return 0!==(this.ea&128)},function(a){var b=0!==(this.ea&128);b!==a&&(this.ea^=128,this.h("isActionable",b,a))});u.defineProperty(T,{rm:"areaBackground"},function(){return this.lc},function(a){var b=this.lc;b!==a&&(a instanceof ga&&a.freeze(),this.lc=a,this.na(),this.h("areaBackground",b,a))});u.defineProperty(T,{background:"background"},function(){return this.Jb},function(a){var b=this.Jb;b!==a&&(a instanceof ga&&a.freeze(),this.Jb=a,this.na(),this.h("background",b,a))});function Al(a,b){a.ea=b?a.ea|512:a.ea&-513}function Jl(a,b){a.ea=b?a.ea|1024:a.ea&-1025}function Cl(a,b){a.ea=b?a.ea|2048:a.ea&-2049}function Dl(a,b){a.ea=b?a.ea|4096:a.ea&-4097}function Aj(a){return 0!==(a.ea&8192)}function uj(a,b){a.ea=b?a.ea|8192:a.ea&-8193}function Bj(a){return 0!==(a.ea&16384)}function rl(a,b){a.ea=b?a.ea|16384:a.ea&-16385}u.u(T,{W:"part"},function(){if(this instanceof G){return this}if(this.$l){return this.$l}var a;for(a=this.P;a;){if(a instanceof G){return this.$l=a}a=a.P}return null});u.u(T,{P:"panel"},function(){return this.Rg});T.prototype.rl=function(a){this.Rg=a};u.u(T,{layer:"layer"},function(){var a=this.W;return null!==a?a.layer:null});u.u(T,{g:"diagram"},function(){var a=this.W;return null!==a?a.g:null},{configurable:!0});u.defineProperty(T,{position:"position"},function(){return this.Na},function(a){var b=this.Na;b.L(a)||(a=a.Z(),this.eA(a,b)&&this.h("position",b,a))});T.prototype.eA=function(a){this.Na=a;El(this);this.Lg();return !0};T.prototype.HE=function(a,b){this.Na.m(a,b);Kl(this,!0);this.Lg()};u.u(T,{ca:"actualBounds"},function(){return this.Zb});u.defineProperty(T,{scale:"scale"},function(){return this.ac},function(a){var b=this.ac;b!==a&&(0>=a&&u.k("GraphObject.scale must be greater than zero"),this.ac=a,this.Lg(),this.S(),this.h("scale",b,a))});u.defineProperty(T,{angle:"angle"},function(){return this.Al},function(a){var b=this.Al;b!==a&&(a%=360,0>a&&(a+=360),b!==a&&(this.Al=a,this.S(),this.Lg(),this.h("angle",b,a)))});u.defineProperty(T,{za:"desiredSize"},function(){return this.lf},function(a){var b=this.lf;b.L(a)||(this.lf=a=a.Z(),this.S(),this instanceof X&&this.me(),this.h("desiredSize",b,a),a=this.W,null!==a&&0!==(this.ea&1024)&&(ll(this,a,"width"),ll(this,a,"height")))});u.defineProperty(T,{width:"width"},function(){return this.lf.width},function(a){if(this.lf.width!==a){var b=this.lf;this.lf=a=(new ia(a,this.lf.height)).freeze();this.S();this instanceof X&&this.me();this.h("desiredSize",b,a);b=this.W;null!==b&&0!==(this.ea&1024)&&ll(this,b,"width")}});u.defineProperty(T,{height:"height"},function(){return this.lf.height},function(a){if(this.lf.height!==a){var b=this.lf;this.lf=a=(new ia(this.lf.width,a)).freeze();this.S();this instanceof X&&this.me();this.h("desiredSize",b,a);b=this.W;null!==b&&0!==(this.ea&1024)&&ll(this,b,"height")}});u.defineProperty(T,{xg:"minSize"},function(){return this.nj},function(a){var b=this.nj;b.L(a)||(a=a.copy(),isNaN(a.width)&&(a.width=0),isNaN(a.height)&&(a.height=0),a.freeze(),this.nj=a,this.S(),this.h("minSize",b,a))});u.defineProperty(T,{cf:"maxSize"},function(){return this.lj},function(a){var b=this.lj;b.L(a)||(a=a.copy(),isNaN(a.width)&&(a.width=Infinity),isNaN(a.height)&&(a.height=Infinity),a.freeze(),this.lj=a,this.S(),this.h("maxSize",b,a)) + });u.u(T,{Ca:"measuredBounds"},function(){return this.Pc});u.u(T,{Ja:"naturalBounds"},function(){return this.Gc},{configurable:!0});u.defineProperty(T,{margin:"margin"},function(){return this.Iq},function(a){"number"===typeof a&&(a=new rb(a));var b=this.Iq;b.L(a)||(this.Iq=a=a.Z(),this.S(),this.h("margin",b,a))});u.u(T,{transform:null},function(){0!==(this.ea&2048)===!0&&wl(this);return this.Td});u.u(T,{Gf:null},function(){0!==(this.ea&4096)===!0&&wl(this);return this.$m});u.defineProperty(T,{alignment:"alignment"},function(){return this.ue},function(a){var b=this.ue;b.L(a)||(a.oe()&&!a.Kc()&&u.k("alignment must be a real Spot or Spot.Default"),this.ue=a=a.Z(),El(this),this.h("alignment",b,a))});u.defineProperty(T,{column:"column"},function(){return this.Ep},function(a){a=Math.round(a);var b=this.Ep;b!==a&&(0>a&&u.xa(a,">= 0",T,"column"),this.Ep=a,this.S(),this.h("column",b,a))});u.defineProperty(T,{aG:"columnSpan"},function(){return this.Wi},function(a){a=Math.round(a);var b=this.Wi;b!==a&&(1>a&&u.xa(a,">= 1",T,"columnSpan"),this.Wi=a,this.S(),this.h("columnSpan",b,a))});u.defineProperty(T,{rc:"row"},function(){return this.yr},function(a){a=Math.round(a);var b=this.yr;b!==a&&(0>a&&u.xa(a,">= 0",T,"row"),this.yr=a,this.S(),this.h("row",b,a))});u.defineProperty(T,{rowSpan:"rowSpan"},function(){return this.tj},function(a){a=Math.round(a);var b=this.tj;b!==a&&(1>a&&u.xa(a,">= 1",T,"rowSpan"),this.tj=a,this.S(),this.h("rowSpan",b,a))});u.defineProperty(T,{Hj:"alignmentFocus"},function(){return this.xp},function(a){var b=this.xp;b.L(a)||(a.oe()&&!a.Kc()&&u.k("alignmentFocus must be a real Spot or Spot.Default"),this.xp=a=a.Z(),this.S(),this.h("alignmentFocus",b,a))});u.defineProperty(T,{Kd:"portId"},function(){return this.kr},function(a){var b=this.kr;if(b!==a){var c=this.W;null===c||c instanceof U||(u.k("portID being set on a Link: "+a),c=null);null!==b&&null!==c&&Ll(c,this);this.kr=a;if(null!==a&&c){c.zh=!0;null===c.Rd&&Ml(c);var d=this.Kd;null!==d&&c.Rd.add(d,this)}this.h("portId",b,a)}});function Nl(a){var b={value:null};Ol(a,b);return b.value}function Ol(a,b){var c=a.P;return null===c||!Ol(c,b)&&a.visible?(b.value=a,!1):!0}function Il(a){var b=a.W;b instanceof U&&(a=a.g,null===a||a.ga.fb||b.$e())}u.defineProperty(T,{xb:"toSpot"},function(){return null!==this.R?this.R.Ej:vb},function(a){null===this.R&&this.Fe();var b=this.R.Ej;b.L(a)||(a=a.Z(),this.R.Ej=a,this.h("toSpot",b,a),Il(this))});u.defineProperty(T,{wl:"toEndSegmentLength"},function(){return null!==this.R?this.R.Cj:10},function(a){null===this.R&&this.Fe();var b=this.R.Cj;b!==a&&(0>a&&u.xa(a,">= 0",T,"toEndSegmentLength"),this.R.Cj=a,this.h("toEndSegmentLength",b,a),Il(this))});u.defineProperty(T,{xt:"toEndSegmentDirection"},function(){return null!==this.R?this.R.Bj:jl},function(a){null===this.R&&this.Fe();var b=this.R.Bj;b!==a&&(this.R.Bj=a,this.h("toEndSegmentDirection",b,a),Il(this))});u.defineProperty(T,{zt:"toShortLength"},function(){return null!==this.R?this.R.Dj:0},function(a){null===this.R&&this.Fe();var b=this.R.Dj;b!==a&&(this.R.Dj=a,this.h("toShortLength",b,a),Il(this))});u.defineProperty(T,{OE:"toLinkable"},function(){return this.Ur},function(a){var b=this.Ur;b!==a&&(this.Ur=a,this.h("toLinkable",b,a))});u.defineProperty(T,{BI:"toMaxLinks"},function(){return this.Vr},function(a){var b=this.Vr;b!==a&&(0>a&&u.xa(a,">= 0",T,"toMaxLinks"),this.Vr=a,this.h("toMaxLinks",b,a))});u.defineProperty(T,{vb:"fromSpot"},function(){return null!==this.R?this.R.cj:vb},function(a){null===this.R&&this.Fe();var b=this.R.cj;b.L(a)||(a=a.Z(),this.R.cj=a,this.h("fromSpot",b,a),Il(this))});u.defineProperty(T,{Yk:"fromEndSegmentLength"},function(){return null!==this.R?this.R.aj:10},function(a){null===this.R&&this.Fe();var b=this.R.aj;b!==a&&(0>a&&u.xa(a,">= 0",T,"fromEndSegmentLength"),this.R.aj=a,this.h("fromEndSegmentLength",b,a),Il(this))});u.defineProperty(T,{Fs:"fromEndSegmentDirection"},function(){return null!==this.R?this.R.$i:jl},function(a){null===this.R&&this.Fe();var b=this.R.$i;b!==a&&(this.R.$i=a,this.h("fromEndSegmentDirection",b,a),Il(this))});u.defineProperty(T,{Gs:"fromShortLength"},function(){return null!==this.R?this.R.bj:0},function(a){null===this.R&&this.Fe();var b=this.R.bj;b!==a&&(this.R.bj=a,this.h("fromShortLength",b,a),Il(this))});u.defineProperty(T,{wD:"fromLinkable"},function(){return this.Yp},function(a){var b=this.Yp;b!==a&&(this.Yp=a,this.h("fromLinkable",b,a))});u.defineProperty(T,{EG:"fromMaxLinks"},function(){return this.Zp},function(a){var b=this.Zp;b!==a&&(0>a&&u.xa(a,">= 0",T,"fromMaxLinks"),this.Zp=a,this.h("fromMaxLinks",b,a))});u.defineProperty(T,{cursor:"cursor"},function(){return this.Lp},function(a){var b=this.Lp;b!==a&&(u.j(a,"string",T,"cursor"),this.Lp=a,this.h("cursor",b,a))});u.defineProperty(T,{click:"click"},function(){return null!==this.Q?this.Q.Xh:null},function(a){null===this.Q&&gl(this);var b=this.Q.Xh;b!==a&&(null!==a&&u.j(a,"function",T,"click"),this.Q.Xh=a,this.h("click",b,a))});u.defineProperty(T,{us:"doubleClick"},function(){return null!==this.Q?this.Q.di:null + },function(a){null===this.Q&&gl(this);var b=this.Q.di;b!==a&&(null!==a&&u.j(a,"function",T,"doubleClick"),this.Q.di=a,this.h("doubleClick",b,a))});u.defineProperty(T,{Vy:"contextClick"},function(){return null!==this.Q?this.Q.Zh:null},function(a){null===this.Q&&gl(this);var b=this.Q.Zh;b!==a&&(null!==a&&u.j(a,"function",T,"contextClick"),this.Q.Zh=a,this.h("contextClick",b,a))});u.defineProperty(T,{$D:"mouseEnter"},function(){return null!==this.Q?this.Q.Tq:null},function(a){null===this.Q&&gl(this);var b=this.Q.Tq;b!==a&&(null!==a&&u.j(a,"function",T,"mouseEnter"),this.Q.Tq=a,this.h("mouseEnter",b,a))});u.defineProperty(T,{aE:"mouseLeave"},function(){return null!==this.Q?this.Q.Uq:null},function(a){null===this.Q&&gl(this);var b=this.Q.Uq;b!==a&&(null!==a&&u.j(a,"function",T,"mouseLeave"),this.Q.Uq=a,this.h("mouseLeave",b,a))});u.defineProperty(T,{Gz:"mouseOver"},function(){return null!==this.Q?this.Q.ni:null},function(a){null===this.Q&&gl(this);var b=this.Q.ni;b!==a&&(null!==a&&u.j(a,"function",T,"mouseOver"),this.Q.ni=a,this.h("mouseOver",b,a))});u.defineProperty(T,{Fz:"mouseHover"},function(){return null!==this.Q?this.Q.mi:null},function(a){null===this.Q&&gl(this);var b=this.Q.mi;b!==a&&(null!==a&&u.j(a,"function",T,"mouseHover"),this.Q.mi=a,this.h("mouseHover",b,a))});u.defineProperty(T,{Ez:"mouseHold"},function(){return null!==this.Q?this.Q.li:null},function(a){null===this.Q&&gl(this);var b=this.Q.li;b!==a&&(null!==a&&u.j(a,"function",T,"mouseHold"),this.Q.li=a,this.h("mouseHold",b,a))});u.defineProperty(T,{EH:"mouseDragEnter"},function(){return null!==this.Q?this.Q.Rq:null},function(a){null===this.Q&&gl(this);var b=this.Q.Rq;b!==a&&(null!==a&&u.j(a,"function",T,"mouseDragEnter"),this.Q.Rq=a,this.h("mouseDragEnter",b,a))});u.defineProperty(T,{FH:"mouseDragLeave"},function(){return null!==this.Q?this.Q.Sq:null},function(a){null===this.Q&&gl(this);var b=this.Q.Sq;b!==a&&(null!==a&&u.j(a,"function",T,"mouseDragLeave"),this.Q.Sq=a,this.h("mouseDragLeave",b,a))});u.defineProperty(T,{Dz:"mouseDrop"},function(){return null!==this.Q?this.Q.ki:null},function(a){null===this.Q&&gl(this);var b=this.Q.ki;b!==a&&(null!==a&&u.j(a,"function",T,"mouseDrop"),this.Q.ki=a,this.h("mouseDrop",b,a))});u.defineProperty(T,{HC:"actionDown"},function(){return null!==this.Q?this.Q.sp:null},function(a){null===this.Q&&gl(this);var b=this.Q.sp;b!==a&&(null!==a&&u.j(a,"function",T,"actionDown"),this.Q.sp=a,this.h("actionDown",b,a))});u.defineProperty(T,{IC:"actionMove"},function(){return null!==this.Q?this.Q.tp:null},function(a){null===this.Q&&gl(this);var b=this.Q.tp;b!==a&&(null!==a&&u.j(a,"function",T,"actionMove"),this.Q.tp=a,this.h("actionMove",b,a))});u.defineProperty(T,{JC:"actionUp"},function(){return null!==this.Q?this.Q.vp:null},function(a){null===this.Q&&gl(this);var b=this.Q.vp;b!==a&&(null!==a&&u.j(a,"function",T,"actionUp"),this.Q.vp=a,this.h("actionUp",b,a))});u.defineProperty(T,{GC:"actionCancel"},function(){return null!==this.Q?this.Q.rp:null},function(a){null===this.Q&&gl(this);var b=this.Q.rp;b!==a&&(null!==a&&u.j(a,"function",T,"actionCancel"),this.Q.rp=a,this.h("actionCancel",b,a))});u.defineProperty(T,{mA:"toolTip"},function(){return null!==this.Q?this.Q.ui:null},function(a){null===this.Q&&gl(this);var b=this.Q.ui;b!==a&&(null!==a&&u.C(a,lf,T,"toolTip"),this.Q.ui=a,this.h("toolTip",b,a))});u.defineProperty(T,{contextMenu:"contextMenu"},function(){return null!==this.Q?this.Q.$h:null},function(a){null===this.Q&&gl(this);var b=this.Q.$h;b!==a&&(null!==a&&u.C(a,lf,T,"contextMenu"),this.Q.$h=a,this.h("contextMenu",b,a))});T.prototype.bind=T.prototype.bind=function(a){a.hg=this;var b=this.Co();null!==b&&Pl(b)&&u.k("Cannot add a Binding to a template that has already been copied: "+a);null===this.Fc&&(this.Fc=new E(bf));this.Fc.add(a)};T.prototype.findTemplateBinder=T.prototype.Co=function(){for(var a=this instanceof B?this:this.P;null!==a;){if(null!==a.Cl){return a}a=a.P}return null};T.fromSvg=T.fromSVG=function(a){return Ql(a)};T.prototype.setProperties=function(a){u.pt(this,a)};var Rl;T.make=Rl=function(a,b){var c=arguments,d=null,e=null;if("function"===typeof a){e=a}else{if("string"===typeof a){var f=Sl.ua(a);"function"===typeof f?(c=u.Pk(arguments),d=f(c)):e=da[a]}}null===d&&(void 0===e&&(d=window.$,void 0!==d&&void 0!==d.noop&&u.k("GraphObject.make failed to complete. Is it conflicting with another $ var? (such as jQuery)"),u.k("GraphObject.make failed to complete, it may be conflicting with another var.")),null!==e&&e.constructor||u.k("GraphObject.make requires a class function or class name, not: "+a),d=new e);f=1;if(d instanceof D&&1<c.length){var h=d,e=c[1];if("string"===typeof e||e instanceof HTMLDivElement){Wi(h,e),f++}}for(;f<c.length;f++){e=c[f],void 0===e?u.k("Undefined value at argument "+f+" for object being constructed by GraphObject.make: "+d):Tl(d,e)}return d};function Tl(a,b){if("string"===typeof b){if(a instanceof qa){a.text=b}else{if(a instanceof X){a.Fb=b}else{if(a instanceof Ri){a.source=b}else{if(a instanceof B){var c=Da(B,b); + null!==c?a.type=c:u.k("Unknown Panel type as an argument to GraphObject.make: "+b)}else{a instanceof ga?(c=Da(ga,b),null!==c?a.type=c:u.k("Unknown Brush type as an argument to GraphObject.make: "+b)):a instanceof $c?(c=Da($c,b),null!==c?a.type=c:u.k("Unknown Geometry type as an argument to GraphObject.make: "+b)):a instanceof Jd?(c=Da(Jd,b),null!==c?a.type=c:u.k("Unknown PathSegment type as an argument to GraphObject.make: "+b)):u.k("Unable to use a string as an argument to GraphObject.make: "+b)}}}}}else{if(b instanceof T){c=b,a instanceof B||u.k("A GraphObject can only be added to a Panel, not to: "+a),a.add(c)}else{if(b instanceof Se){var d=b,c=a,e;d.be&&c.hd?e=c.hd(d.index):!d.be&&c.gd?e=c.gd(d.index):u.k("A RowColumnDefinition can only be added to a Panel, not to: "+a);e.ss(d)}else{if(b instanceof ea){a instanceof W&&b.Ce===W?2===(b.value&2)?a.Bw=b:b===kh||b===ch||b===bh?a.We=b:b===Ul||b===Vl||b===Wl?a.gs=b:b!==Xl&&b!==dh&&u.k("Unknown Link enum value for a Link property: "+b):a instanceof B&&b.Ce===B?a.type=b:a instanceof qa&&b.Ce===qa?a.bF=b:a instanceof X&&(b===qh||b===sh||b===th||b===dl)?a.zD=b:a instanceof Ri&&(b===qh||b===sh||b===th)?a.SG=b:a instanceof T&&b.Ce===W?(c=a,0===b.name.indexOf("Orient")?c.Ew=b:u.k("Unknown Link enum value for GraphObject.segmentOrientation property: "+b)):a instanceof T&&b.Ce===T?a.stretch=b:a instanceof Se&&b.Ce===Se?a.tt=b:a instanceof D&&b.Ce===D?a.po=b:a instanceof ga&&b.Ce===ga?a.type=b:a instanceof $c&&b.Ce===$c?a.type=b:a instanceof Jd&&b.Ce===Jd?a.type=b:a instanceof bf&&b.Ce===bf?a.mode=b:a instanceof Od&&b.Ce===Od?a.Cd=b:a instanceof Y&&b.Ce===Y?0===b.name.indexOf("Alignment")?a.alignment=b:0===b.name.indexOf("Arrangement")?a.Hf=b:0===b.name.indexOf("Compaction")?a.compaction=b:0===b.name.indexOf("Path")?a.path=b:0===b.name.indexOf("Sorting")?a.sorting=b:0===b.name.indexOf("Style")?a.DI=b:u.k("Unknown enum value: "+b):a instanceof Yl&&b.Ce===Yl?0===b.name.indexOf("Aggressive")?a.OF=b:0===b.name.indexOf("Cycle")?a.lG=b:0===b.name.indexOf("Init")?a.XG=b:0===b.name.indexOf("Layer")?a.nH=b:u.k("Unknown enum value: "+b):a instanceof Xk&&b.Ce===Xk?b===Zl||b===$l||b===am||b===bm?a.sorting=b:b===cm||b===dm?a.Hf=b:b===em||b===fm?a.alignment=b:u.k("Unknown enum value: "+b):a instanceof gm&&b.Ce===gm?b===hm||b===im||b===jm||b===km||b===lm?a.sorting=b:b===mm||b===nm||b===om||b===pm?a.direction=b:b===xm||b===ym||b===zm||b===Am?a.Hf=b:b===Bm||b===Cm?a.sw=b:u.k("Unknown enum value: "+b):u.k("No property to set for this enum value: "+b)}else{if(b instanceof bf){a instanceof T?a.bind(b):a instanceof Se?a.bind(b):u.k("A Binding can only be applied to a GraphObject or RowColumnDefinition, not to: "+a)}else{if(b instanceof bd){a instanceof $c?a.ub.add(b):u.k("A PathFigure can only be added to a Geometry, not to: "+a)}else{if(b instanceof Jd){a instanceof bd?a.Ga.add(b):u.k("A PathSegment can only be added to a PathFigure, not to: "+a)}else{if(b instanceof Je){a instanceof D?a.Qb=b:a instanceof V?a.Qb=b:u.k("A Layout can only be assigned to a Diagram or a Group, not to: "+a)}else{if(Array.isArray(b)){for(c=0;c<b.length;c++){Tl(a,b[c])}}else{if("object"===typeof b&&null!==b){if(a instanceof ga){e=new pa;for(c in b){d=parseFloat(c),isNaN(d)?e[c]=b[c]:a.addColorStop(d,b[c])}u.pt(a,e)}else{if(a instanceof Se){void 0!==b.row?(e=b.row,(void 0===e||null===e||Infinity===e||isNaN(e)||0>e)&&u.k("Must specify non-negative integer row for RowColumnDefinition "+b),a.be=!0,a.index=e):void 0!==b.column&&(e=b.column,(void 0===e||null===e||Infinity===e||isNaN(e)||0>e)&&u.k("Must specify non-negative integer column for RowColumnDefinition "+b),a.be=!1,a.index=e);e=new pa;for(c in b){"row"!==c&&"column"!==c&&(e[c]=b[c])}u.pt(a,e)}else{u.pt(a,b)}}}else{u.k('Unknown initializer "'+b+'" for object being constructed by GraphObject.make: '+a)}}}}}}}}}}}var Sl=new la("string","function");T.getBuilders=function(){var a=new la("string","function"),b;for(b in Sl){if(b!==b.toLowerCase()){var c=Sl[b];"function"===typeof c&&a.add(b,c)}}a.freeze();return a};var Dm;T.defineBuilder=Dm=function(a,b){u.j(a,"string",T,"defineBuilder:name");u.j(b,"function",T,"defineBuilder:func");var c=a.toLowerCase();""!==a&&"none"!==c&&a!==c||u.k("Shape.defineFigureGenerator name must not be empty or None or all-lower-case: "+a);Sl.add(a,b)};var Em;T.takeBuilderArgument=Em=function(a,b,c){void 0===c&&(c=null);var d=a[1];if("function"===typeof c?c(d):"string"===typeof d){return a.splice(1,1),d}if(void 0===b){throw Error("no "+("function"===typeof c?"satisfactory":"string")+" argument for GraphObject builder "+a[0])}return b};Dm("Button",function(){var a=new ga(ue);a.addColorStop(0,"white");a.addColorStop(1,"lightgray");var b=new ga(ue);b.addColorStop(0,"white");b.addColorStop(1,"dodgerblue");a=Rl(B,Yi,{qz:!0},{_buttonFillNormal:a,_buttonStrokeNormal:"gray",_buttonFillOver:b,_buttonStrokeOver:"blue"},Rl(X,{name:"ButtonBorder",Fb:"Rectangle",A:new L(0,0,2.761423749153968,2.761423749153968),B:new L(1,1,-2.761423749153968,-2.761423749153968),fill:a,stroke:"gray"})); + a.$D=function(a,b){var e=b.ke("ButtonBorder");if(e instanceof X){var f=b._buttonFillOver;b._buttonFillNormal=e.fill;e.fill=f;f=b._buttonStrokeOver;b._buttonStrokeNormal=e.stroke;e.stroke=f}};a.aE=function(a,b){var e=b.ke("ButtonBorder");e instanceof X&&(e.fill=b._buttonFillNormal,e.stroke=b._buttonStrokeNormal)};return a});Dm("TreeExpanderButton",function(){var a=Rl("Button",{_treeExpandedFigure:"MinusLine",_treeCollapsedFigure:"PlusLine"},Rl(X,{name:"ButtonIcon",Fb:"MinusLine",za:K.op},(new bf("figure","isTreeExpanded",function(a,c){var d=c.P;return a?d._treeExpandedFigure:d._treeCollapsedFigure})).tw()),{visible:!1},(new bf("visible","isTreeLeaf",function(a){return !a})).tw());a.click=function(a,c){var d=c.W;d instanceof lf&&(d=d.Mh);if(d instanceof U){var e=d.g;if(null!==e){e=e.Eb;if(d.Wc){if(!e.canCollapseTree(d)){return}}else{if(!e.canExpandTree(d)){return}}a.Tc=!0;d.Wc?e.collapseTree(d):e.expandTree(d)}}};return a});Dm("SubGraphExpanderButton",function(){var a=Rl("Button",{_subGraphExpandedFigure:"MinusLine",_subGraphCollapsedFigure:"PlusLine"},Rl(X,{name:"ButtonIcon",Fb:"MinusLine",za:K.op},(new bf("figure","isSubGraphExpanded",function(a,c){var d=c.P;return a?d._subGraphExpandedFigure:d._subGraphCollapsedFigure})).tw()));a.click=function(a,c){var d=c.W;d instanceof lf&&(d=d.Mh);if(d instanceof V){var e=d.g;if(null!==e){e=e.Eb;if(d.ce){if(!e.canCollapseSubGraph(d)){return}}else{if(!e.canExpandSubGraph(d)){return}}a.Tc=!0;d.ce?e.collapseSubGraph(d):e.expandSubGraph(d)}}};return a});Dm("ContextMenuButton",function(){var a=Rl("Button");a.stretch=fl;var b=a.ke("ButtonBorder");b instanceof X&&(b.Fb="Rectangle",b.A=new L(0,0,2,3),b.B=new L(1,1,-2,-2));return a});Dm("PanelExpanderButton",function(a){var b=Em(a,"COLLAPSIBLE");a=Rl("Button",Rl(X,"TriangleUp",{za:new ia(6,4)},(new bf("figure","visible",function(a){return a?"TriangleUp":"TriangleDown"})).tw(b)));var c=a.ke("ButtonBorder");c instanceof X&&(c.stroke=null,c.fill="transparent");a.click=function(a,c){var f=c.g;if(null!==f){var h=c.W.ke(b);null!==h&&(f.Xb("Collapse/Expand Panel"),h.visible=!h.visible,f.Xd("Collapse/Expand Panel"))}};return a});function hl(){this.$h=this.ui=this.rp=this.vp=this.tp=this.sp=this.ki=this.Sq=this.Rq=this.li=this.mi=this.ni=this.Uq=this.Tq=this.Zh=this.di=this.Xh=null}hl.prototype.copy=function(){var a=new hl;a.Xh=this.Xh;a.di=this.di;a.Zh=this.Zh;a.Tq=this.Tq;a.Uq=this.Uq;a.ni=this.ni;a.mi=this.mi;a.li=this.li;a.Rq=this.Rq;a.Sq=this.Sq;a.ki=this.ki;a.sp=this.sp;a.tp=this.tp;a.vp=this.vp;a.rp=this.rp;a.ui=this.ui;a.$h=this.$h;return a};function B(a){T.call(this);void 0===a?0===arguments.length?this.pa=vh:u.k("invalid argument to Panel constructor: undefined"):(u.rb(a,B,B,"type"),this.pa=a);this.Aa=new E(T);this.Qe=K.pp;this.Mg=!1;this.pa===bj&&(this.Mg=!0);this.iq=!1;this.Op=uc;this.ci=dl;this.pa===Fl&&Fm(this);this.lo=sh;this.cq=(new ia(10,10)).freeze();this.dq=K.Wj;this.Cl=this.sh=null;this.wq=NaN;this.ag=this.hi=null;this.Jn="category";this.$f=null;this.wi=new z(NaN,NaN,NaN,NaN);this.lm=null;this.zh=!1;this.zr=null}u.Ha(B,T);u.Nh(B);u.fa("Panel",B);function Fm(a){a.Xi=K.pp;a.vh=1;a.bi=null;a.Hl=null;a.uh=1;a.th=null;a.Gl=null;a.Ad=[];a.td=[];a.em=Gm;a.El=Gm;a.vi=0;a.ii=0}B.prototype.cloneProtected=function(a){T.prototype.cloneProtected.call(this,a);a.pa=this.pa;a.Qe=this.Qe.Z();a.Mg=this.Mg;a.iq=this.iq;a.Op=this.Op.Z();a.ci=this.ci;if(a.pa===Fl){a.Xi=this.Xi.Z();a.vh=this.vh;a.bi=this.bi;a.Hl=this.Hl;a.uh=this.uh;a.th=this.th;a.Gl=this.Gl;var b=[];if(0<this.Ad.length){for(var c=this.Ad,d=c.length,e=0;e<d;e++){if(void 0!==c[e]){var f=c[e].copy();f.rl(a);b[e]=f}}}a.Ad=b;b=[];if(0<this.td.length){for(c=this.td,d=c.length,e=0;e<d;e++){void 0!==c[e]&&(f=c[e].copy(),f.rl(a),b[e]=f)}}a.td=b;a.em=this.em;a.El=this.El;a.vi=this.vi;a.ii=this.ii}a.lo=this.lo;a.cq.assign(this.cq);a.dq=this.dq.Z();a.sh=this.sh;a.Cl=this.Cl;a.wq=this.wq;a.hi=this.hi;a.ag=this.ag;a.Jn=this.Jn;a.wi.assign(this.wi);a.zh=this.zh;null!==this.zr&&(a.zr=this.zr)};B.prototype.Oh=function(a){T.prototype.Oh.call(this,a);a.Aa=this.Aa;for(var b=a.Aa.n,c=b.length,d=0;d<c;d++){b[d].Rg=a}a.lm=null};B.prototype.copy=function(){var a=T.prototype.copy.call(this);if(null!==a){for(var b=this.Aa.n,c=b.length,d=0;d<c;d++){var e=b[d].copy(),f=a;e.rl(f);e.$l=null;var h=f.Aa,k=h.count;h.Zd(k,e);h=f.W;if(null!==h){h.Bk=null;null!==e.Kd&&h instanceof U&&(h.zh=!0);var l=f.g;null!==l&&l.ga.fb||h.Cc(be,"elements",f,null,e,null,k)}}return a}return null};B.prototype.toString=function(){return"Panel("+this.type+")#"+u.Uc(this)};var vh;B.Position=vh=u.s(B,"Position",0);B.Horizontal=u.s(B,"Horizontal",1);var Xi;B.Vertical=Xi=u.s(B,"Vertical",2);var oh;B.Spot=oh=u.s(B,"Spot",3);var Yi;B.Auto=Yi=u.s(B,"Auto",4);var Fl;B.Table=Fl=u.s(B,"Table",5);B.Viewbox=u.s(B,"Viewbox",6);var tl;B.TableRow=tl=u.s(B,"TableRow",7);var ul;B.TableColumn=ul=u.s(B,"TableColumn",8);var ah;B.Link=ah=u.s(B,"Link",9);var bj;B.Grid=bj=u.s(B,"Grid",10);u.defineProperty(B,{type:"type"},function(){return this.pa},function(a){var b=this.pa; + b!==a&&(b!==tl&&b!==ul||u.k("Cannot change Panel.type when it is already a TableRow or a TableColumn: "+a),this.pa=a,this.pa===bj?this.Mg=!0:this.pa===Fl&&Fm(this),this.S(),this.h("type",b,a))});u.u(B,{elements:"elements"},function(){return this.Aa.i});u.u(B,{Ja:"naturalBounds"},function(){return this.Gc});u.defineProperty(B,{padding:"padding"},function(){return this.Qe},function(a){"number"===typeof a?(0>a&&u.xa(a,">= 0",B,"padding"),a=new rb(a)):(u.C(a,rb,B,"padding"),0>a.left&&u.xa(a.left,">= 0",B,"padding:value.left"),0>a.right&&u.xa(a.right,">= 0",B,"padding:value.right"),0>a.top&&u.xa(a.top,">= 0",B,"padding:value.top"),0>a.bottom&&u.xa(a.bottom,">= 0",B,"padding:value.bottom"));var b=this.Qe;b.L(a)||(this.Qe=a=a.Z(),this.S(),this.h("padding",b,a))});u.defineProperty(B,{Tk:"defaultAlignment"},function(){return this.Op},function(a){var b=this.Op;b.L(a)||(this.Op=a=a.Z(),this.S(),this.h("defaultAlignment",b,a))});u.defineProperty(B,{Dd:"defaultStretch"},function(){return this.ci},function(a){var b=this.ci;b!==a&&(u.rb(a,T,B,"defaultStretch"),this.ci=a,this.S(),this.h("defaultStretch",b,a))});u.defineProperty(B,{vJ:"defaultSeparatorPadding"},function(){return void 0===this.Xi?K.pp:this.Xi},function(a){if(void 0!==this.Xi){"number"===typeof a&&(a=new rb(a));var b=this.Xi;b.L(a)||(this.Xi=a=a.Z(),this.h("defaultSeparatorPadding",b,a))}});u.defineProperty(B,{tJ:"defaultRowSeparatorStroke"},function(){return void 0===this.bi?null:this.bi},function(a){var b=this.bi;b!==a&&(null===a||"string"===typeof a||a instanceof ga)&&(a instanceof ga&&a.freeze(),this.bi=a,this.h("defaultRowSeparatorStroke",b,a))});u.defineProperty(B,{uJ:"defaultRowSeparatorStrokeWidth"},function(){return void 0===this.vh?1:this.vh},function(a){if(void 0!==this.vh){var b=this.vh;b!==a&&isFinite(a)&&0<=a&&(this.vh=a,this.h("defaultRowSeparatorStrokeWidth",b,a))}});u.defineProperty(B,{sJ:"defaultRowSeparatorDashArray"},function(){return void 0===this.Hl?null:this.Hl},function(a){if(void 0!==this.Hl){var b=this.Hl;if(b!==a){null===a||Array.isArray(a)||u.Ld(a,"Array",B,"defaultRowSeparatorDashArray:value");if(null!==a){for(var c=a.length,d=0,e=0;e<c;e++){var f=a[e];"number"===typeof f&&0<=f&&isFinite(f)||u.k("defaultRowSeparatorDashArray:value "+f+" must be a positive number or zero.");d+=f}if(0===d){if(null===b){return}a=null}}this.Hl=a;this.na();this.h("defaultRowSeparatorDashArray",b,a)}}});u.defineProperty(B,{nJ:"defaultColumnSeparatorStroke"},function(){return void 0===this.th?null:this.th},function(a){if(void 0!==this.th){var b=this.th;b!==a&&(null===a||"string"===typeof a||a instanceof ga)&&(a instanceof ga&&a.freeze(),this.th=a,this.h("defaultColumnSeparatorStroke",b,a))}});u.defineProperty(B,{oJ:"defaultColumnSeparatorStrokeWidth"},function(){return void 0===this.uh?1:this.uh},function(a){if(void 0!==this.uh){var b=this.uh;b!==a&&isFinite(a)&&0<=a&&(this.uh=a,this.h("defaultColumnSeparatorStrokeWidth",b,a))}});u.defineProperty(B,{mJ:"defaultColumnSeparatorDashArray"},function(){return void 0===this.Gl?null:this.Gl},function(a){if(void 0!==this.Gl){var b=this.Gl;if(b!==a){null===a||Array.isArray(a)||u.Ld(a,"Array",B,"defaultColumnSeparatorDashArray:value");if(null!==a){for(var c=a.length,d=0,e=0;e<c;e++){var f=a[e];"number"===typeof f&&0<=f&&isFinite(f)||u.k("defaultColumnSeparatorDashArray:value "+f+" must be a positive number or zero.");d+=f}if(0===d){if(null===b){return}a=null}}this.Gl=a;this.na();this.h("defaultColumnSeparatorDashArray",b,a)}}});u.defineProperty(B,{HK:"viewboxStretch"},function(){return this.lo},function(a){var b=this.lo;b!==a&&(u.rb(a,T,B,"viewboxStretch"),this.lo=a,this.h("viewboxStretch",b,a))});u.defineProperty(B,{aw:"gridCellSize"},function(){return this.cq},function(a){var b=this.cq;b.L(a)||(u.C(a,ia,B,"gridCellSize"),a.I()&&0!==a.width&&0!==a.height||u.k("Invalid Panel.gridCellSize: "+a),this.cq=a.Z(),null!==this.g&&this===this.g.Hs&&vj(this.g),this.na(),this.h("gridCellSize",b,a))});u.defineProperty(B,{CD:"gridOrigin"},function(){return this.dq},function(a){var b=this.dq;b.L(a)||(u.C(a,w,B,"gridOrigin"),a.I()||u.k("Invalid Panel.gridOrigin: "+a),this.dq=a.Z(),null!==this.g&&vj(this.g),this.na(),this.h("gridOrigin",b,a))});g=B.prototype;g.Su=function(a){T.prototype.Su.call(this,a);for(var b=this.Aa.n,c=b.length,d=0;d<c;d++){b[d].Su(a)}};g.Mj=function(a,b){if(this.pa===bj){var c=this.Ii()*b.scale;0>=c&&(c=1);var d=this.aw,e=d.width,d=d.height,f=this.Ja,h=f.width,f=f.height,k=Math.ceil(h/e),l=Math.ceil(f/d),m=this.CD;a.save();a.beginPath();a.rect(0,0,h,f);a.clip();for(var n=[],p=this.Aa.n,q=p.length,r=0;r<q;r++){var s=p[r],t=[];n.push(t);if(s.visible){for(var s=hk(s.Fb),v=r+1;v<q;v++){var x=p[v];x.visible&&hk(x.Fb)===s&&(x=x.interval,2<=x&&t.push(x))}}}p=this.Aa.n;q=p.length;for(r=0;r<q;r++){var A=p[r];if(A.visible){var t=n[r],s=A.interval,v=!1,y=!0,C=A.hA;null!==C&&(v=!0,void 0!==a.setLineDash?(a.setLineDash(C),a.lineDashOffset=A.ed):void 0!==a.webkitLineDash?(a.webkitLineDash=C,a.webkitLineDashOffset=A.ed):void 0!==a.mozDash?(a.mozDash=C,a.mozDashOffset=A.ed):y=!1); + if("LineV"===A.Fb){a.lineWidth=A.jb;yl(this,a,A.stroke,!1,!1);a.beginPath();for(var I=x=Math.floor(-m.x/e);I<=x+k;I++){var H=I*e+m.x;if(0<=H&&H<h&&Hm(I,s,t)&&(v&&!y?kl(a,H,0,H,f,C,A.ed):(a.moveTo(H,0),a.lineTo(H,f)),2>e*s*c)){break}}a.stroke()}else{if("LineH"===A.Fb){a.lineWidth=A.jb;yl(this,a,A.stroke,!1,!1);a.beginPath();for(I=x=Math.floor(-m.y/d);I<=x+l&&!(H=I*d+m.y,0<=H&&H<=f&&Hm(I,s,t)&&(v&&!y?kl(a,0,H,h,H,C,A.ed):(a.moveTo(0,H),a.lineTo(h,H)),2>d*s*c));I++){}a.stroke()}else{if("BarV"===A.Fb){for(yl(this,a,A.fill,!0,!1),A=A.width,isNaN(A)&&(A=e),I=x=Math.floor(-m.x/e);I<=x+k&&!(H=I*e+m.x,0<=H&&H<h&&Hm(I,s,t)&&(a.fillRect(H,0,A,f),2>e*s*c));I++){}}else{if("BarH"===A.Fb){for(yl(this,a,A.fill,!0,!1),A=A.height,isNaN(A)&&(A=d),I=x=Math.floor(-m.y/d);I<=x+l&&!(H=I*d+m.y,0<=H&&H<=f&&Hm(I,s,t)&&(a.fillRect(0,H,h,A),2>d*s*c));I++){}}}}}v&&(void 0!==a.setLineDash?(a.setLineDash(u.nh),a.lineDashOffset=0):void 0!==a.webkitLineDash?(a.webkitLineDash=u.nh,a.webkitLineDashOffset=0):void 0!==a.mozDash&&(a.mozDash=null,a.mozDashOffset=0))}}a.restore();$i(b,a,!1)}else{this.pa===Fl&&(a.lineCap="butt",Im(this,a,!0,this.Ad,!0),Im(this,a,!1,this.td,!0),Jm(this,a,!0,this.Ad),Jm(this,a,!1,this.td),Im(this,a,!0,this.Ad,!1),Im(this,a,!1,this.td,!1));(c=this.LD)&&a.save();e=this.Jf();d=this.Aa.n;h=d.length;for(f=0;f<h;f++){k=d[f],c&&k===e&&(a.Gt=!0),k.Xe(a,b),c&&k===e&&(a.Gt=!1)}c&&(a.restore(),$i(b,a,!1))}};function Jm(a,b,c,d){for(var e=d.length,f=a.ca,h=c?a.hd(0):a.gd(0),k=0;k<e;k++){var l=d[k];if(void 0!==l&&l!==h&&0!==l.Ra){var m=l.gp;isNaN(m)&&(m=c?a.vh:a.uh);var n=l.fp;null===n&&(n=c?a.bi:a.th);if(0!==m&&null!==n){yl(a,b,n,!1,!1);var n=!1,p=!0,q=l.iI;null!==q&&(n=!0,void 0!==b.setLineDash?(b.setLineDash(q),b.lineDashOffset=a.ed):void 0!==b.webkitLineDash?(b.webkitLineDash=q,b.webkitLineDashOffset=a.ed):void 0!==b.mozDash?(b.mozDash=q,b.mozDashOffset=a.ed):p=!1);b.beginPath();var r=l.position+m;c?r>f.height&&(m-=r-f.height):r>f.width&&(m-=r-f.width);l=l.position+m/2;b.lineWidth=m;r=a.padding;c?(l+=r.top,m=r.left,r=f.width-r.right,n&&!p?kl(b,m,l,r,l,q,0):(b.moveTo(m,l),b.lineTo(r,l))):(l+=r.left,m=r.top,r=f.height-r.bottom,n&&!p?kl(b,l,m,l,r,q,0):(b.moveTo(l,m),b.lineTo(l,r)));b.stroke();n&&(void 0!==b.setLineDash?(b.setLineDash(u.nh),b.lineDashOffset=0):void 0!==b.webkitLineDash?(b.webkitLineDash=u.nh,b.webkitLineDashOffset=0):void 0!==b.mozDash&&(b.mozDash=null,b.mozDashOffset=0))}}}}function Im(a,b,c,d,e){for(var f=d.length,h=a.ca,k=0;k<f;k++){var l=d[k];if(void 0!==l&&null!==l.background&&l.$y!==e&&0!==l.Ra){var m=c?h.height:h.width;if(!(l.position>m)){var n=l.ng(),p=l.gp;isNaN(p)&&(p=c?a.vh:a.uh);var q=l.fp;null===q&&(q=c?a.bi:a.th);null===q&&(p=0);n-=p;p=l.position+p;n+=l.Ra;p+n>m&&(n=m-p);0>=n||(m=a.padding,yl(a,b,l.background,!0,!1),c?b.fillRect(m.left,p+m.top,h.width-(m.left+m.right),n):b.fillRect(p+m.left,m.top,n,h.height-(m.top+m.bottom)))}}}}function Hm(a,b,c){if(0!==a%b){return !1}b=c.length;for(var d=0;d<b;d++){if(0===a%c[d]){return !1}}return !0}function hk(a){return"LineV"===a||"BarV"===a}g.Fo=function(a,b,c,d,e){var f=this.Uf(),h=this.transform,k=1/(h.m11*h.m22-h.m12*h.m21),l=h.m22*k,m=-h.m12*k,n=-h.m21*k,p=h.m11*k,q=k*(h.m21*h.dy-h.m22*h.dx),r=k*(h.m12*h.dx-h.m11*h.dy);if(null!==this.rm){return h=this.ca,K.bl(h.left,h.top,h.right,h.bottom,a,b,c,d,e)}if(null!==this.background){f=a*l+b*n+q,k=a*m+b*p+r,a=c*l+d*n+q,c=c*m+d*p+r,e.m(0,0),d=this.Ja,c=K.bl(0,0,d.width,d.height,f,k,a,c,e),e.transform(h)}else{f||(l=1,n=m=0,p=1,r=q=0);k=a*l+b*n+q;a=a*m+b*p+r;l=c*l+d*n+q;d=c*m+d*p+r;e.m(l,d);m=(l-k)*(l-k)+(d-a)*(d-a);c=!1;p=this.Aa.n;r=p.length;n=u.K();for(q=0;q<r;q++){b=p[q],b.visible&&b.Fo(k,a,l,d,n)&&(c=!0,b=(k-n.x)*(k-n.x)+(a-n.y)*(a-n.y),b<m&&(m=b,e.set(n)))}u.v(n);f&&e.transform(h)}return c};g.S=function(a){T.prototype.S.call(this,a);this.pa===Yi&&(a=this.Jf(),null!==a&&a.S(!0));a=this.Aa.n;for(var b=a.length,c=0;c<b;c++){var d=a[c];!0!==Aj(d)&&(d.za.I()||(d instanceof ph||d instanceof B||d instanceof qa||pl(d,!1)!==qh)&&d.S(!0))}};g.Io=function(){if(!1===Aj(this)){uj(this,!0);rl(this,!0);for(var a=this.Aa.n,b=a.length,c=0;c<b;c++){a[c].Io()}}};g.Lg=function(){if(0!==(this.ea&2048)===!1){Cl(this,!0);Dl(this,!0);for(var a=this.Aa.n,b=a.length,c=0;c<b;c++){a[c].nz()}}};g.nz=function(){Dl(this,!0);for(var a=this.Aa.n,b=a.length,c=0;c<b;c++){a[c].nz()}};g.Qo=function(a,b,c,d){var e=this.wi;e.width=0;e.height=0;var f=this.za,h=this.xg;void 0===c&&(c=h.width,d=h.height);c=Math.max(c,h.width);d=Math.max(d,h.height);var k=this.cf;isNaN(f.width)||(a=Math.min(f.width,k.width));isNaN(f.height)||(b=Math.min(f.height,k.height));a=Math.max(c,a);b=Math.max(d,b);var l=this.padding;a=Math.max(a-l.left-l.right,0);b=Math.max(b-l.top-l.bottom,0);var m=this.Aa.n;if(0!==m.length){var n=this.pa.Vb;switch(n){case"Position":var p=a,q=b,r=c,s=d,t=m.length;e.x=0;e.y=0;e.width=0;for(var v=e.height=0;v<t;v++){var x=m[v];if(x.visible||x===this.fc){var A=x.margin,y=A.right+A.left,C=A.top+A.bottom;Ph(x,p,q,r,s);var I=x.Ca,H=Math.max(I.width+y,0),R=Math.max(I.height+C,0),aa=x.position.x,S=x.position.y; + isFinite(aa)||(aa=0);isFinite(S)||(S=0);if(x instanceof X){var N=x;if(N.sz){var Z=N.jb/2,aa=aa-Z,S=S-Z}}kb(e,aa,S,H,R)}}break;case"Vertical":for(var Ga=a,ua=c,Oa=m.length,na=u.hb(),Ba=0;Ba<Oa;Ba++){var ra=m[Ba];if(ra.visible||ra===this.fc){var dc=pl(ra,!1);if(dc!==qh&&dc!==el){na.push(ra)}else{var ed=ra.margin,Lf=ed.right+ed.left,ec=ed.top+ed.bottom;Ph(ra,Ga,Infinity,ua,0);var We=ra.Ca,Mf=Math.max(We.width+Lf,0),Ta=Math.max(We.height+ec,0);e.width=Math.max(e.width,Mf);e.height+=Ta}}}var db=na.length;if(0!==db){this.za.width?Ga=Math.min(this.za.width,this.cf.width):0!==e.width&&(Ga=Math.min(e.width,this.cf.width));for(Ba=0;Ba<db;Ba++){if(ra=na[Ba],ra.visible||ra===this.fc){ed=ra.margin,Lf=ed.right+ed.left,ec=ed.top+ed.bottom,Ph(ra,Ga,Infinity,ua,0),We=ra.Ca,Mf=Math.max(We.width+Lf,0),Ta=Math.max(We.height+ec,0),e.width=Math.max(e.width,Mf),e.height+=Ta}}u.sa(na)}break;case"Horizontal":for(var wa=b,za=d,lb=m.length,Eb=u.hb(),$a=0;$a<lb;$a++){var jc=m[$a];if(jc.visible||jc===this.fc){var ge=pl(jc,!1);if(ge!==qh&&ge!==fl){Eb.push(jc)}else{var nc=jc.margin,Pd=nc.right+nc.left,he=nc.top+nc.bottom;Ph(jc,Infinity,wa,0,za);var Xe=jc.Ca,pf=Math.max(Xe.width+Pd,0),Qd=Math.max(Xe.height+he,0);e.width+=pf;e.height=Math.max(e.height,Qd)}}}var Fb=Eb.length;if(0!==Fb){this.za.height?wa=Math.min(this.za.height,this.cf.height):0!==e.height&&(wa=Math.min(e.height,this.cf.height));for($a=0;$a<Fb;$a++){if(jc=Eb[$a],jc.visible||jc===this.fc){nc=jc.margin,Pd=nc.right+nc.left,he=nc.top+nc.bottom,Ph(jc,Infinity,wa,0,za),Xe=jc.Ca,pf=Math.max(Xe.width+Pd,0),Qd=Math.max(Xe.height+he,0),e.width+=pf,e.height=Math.max(e.height,Qd)}}u.sa(Eb)}break;case"Spot":a:{var Kb=a,Fc=b,Mg=c,Lb=d,yb=m.length,fc=this.Jf(),mb=fc.margin,ye=0,Rd=0,og=mb.right+mb.left,Nf=mb.top+mb.bottom;Ph(fc,Kb,Fc,Mg,Lb);var zb=fc.Ca,fd=zb.width,oc=zb.height,wb=Math.max(fd+og,0),Gc=Math.max(oc+Nf,0);e.x=-mb.left;e.y=-mb.top;e.width=wb;e.height=Gc;for(var Mb=0;Mb<yb;Mb++){var Na=m[Mb];if(Na!==fc&&(Na.visible||Na===this.fc)){mb=Na.margin;ye=mb.right+mb.left;Rd=mb.top+mb.bottom;Ph(Na,Kb,Fc,0,0);var zb=Na.Ca,wb=Math.max(zb.width+ye,0),Gc=Math.max(zb.height+Rd,0),eb=Na.alignment;eb.Kc()&&(eb=this.Tk);eb.Vc()||(eb=Ib);var Ab=Na.Hj;Ab.Kc()&&(Ab=Ib);kb(e,eb.x*fd+eb.offsetX-(Ab.x*zb.width-Ab.offsetX)-mb.left,eb.y*oc+eb.offsetY-(Ab.y*zb.height-Ab.offsetY)-mb.top,wb,Gc)}}var gc=fc.stretch;gc===dl&&(gc=pl(fc,!1));switch(gc){case qh:break a;case cd:if(!isFinite(Kb)&&!isFinite(Fc)){break a}break;case fl:if(!isFinite(Kb)){break a}break;case el:if(!isFinite(Fc)){break a}}zb=fc.Ca;fd=zb.width;oc=zb.height;wb=Math.max(fd+og,0);Gc=Math.max(oc+Nf,0);mb=fc.margin;e.x=-mb.left;e.y=-mb.top;e.width=wb;e.height=Gc;for(Mb=0;Mb<yb;Mb++){Na=m[Mb],Na===fc||!Na.visible&&Na!==this.fc||(mb=Na.margin,ye=mb.right+mb.left,Rd=mb.top+mb.bottom,zb=Na.Ca,wb=Math.max(zb.width+ye,0),Gc=Math.max(zb.height+Rd,0),eb=Na.alignment,eb.Kc()&&(eb=this.Tk),eb.Vc()||(eb=Ib),Ab=Na.Hj,Ab.Kc()&&(Ab=Ib),kb(e,eb.x*fd+eb.offsetX-(Ab.x*zb.width-Ab.offsetX)-mb.left,eb.y*oc+eb.offsetY-(Ab.y*zb.height-Ab.offsetY)-mb.top,wb,Gc))}}break;case"Auto":var Sd=a,Td=b,qf=c,ze=d,rf=m.length,Rb=this.Jf(),cb=Rb.margin,pc=cb.right+cb.left,Pc=cb.top+cb.bottom;Ph(Rb,Sd,Td,qf,ze);var gd=Rb.Ca,ab=Math.max(gd.width+pc,0),ub=Math.max(gd.height+Pc,0),kc=Km(Rb),hd=kc.x*ab+kc.offsetX,Ng=kc.y*ub+kc.offsetY,kc=Lm(Rb),Og=kc.x*ab+kc.offsetX,Pg=kc.y*ub+kc.offsetY,Of=Sd,Hc=Td;isFinite(Sd)&&(Of=Math.abs(hd-Og));isFinite(Td)&&(Hc=Math.abs(Ng-Pg));var Qc=u.vl();Qc.m(0,0);for(var Ic=0;Ic<rf;Ic++){var nb=m[Ic];if(nb!==Rb&&(nb.visible||nb===this.fc)){var cb=nb.margin,ie=cb.right+cb.left,ob=cb.top+cb.bottom;Ph(nb,Of,Hc,0,0);gd=nb.Ca;ab=Math.max(gd.width+ie,0);ub=Math.max(gd.height+ob,0);Qc.m(Math.max(ab,Qc.width),Math.max(ub,Qc.height))}}if(1===rf){e.width=ab,e.height=ub,u.Oj(Qc)}else{var yc=Km(Rb),Ae=Lm(Rb),Bb=0,Cb=0;Ae.x!==yc.x&&Ae.y!==yc.y&&(Bb=Qc.width/Math.abs(Ae.x-yc.x),Cb=Qc.height/Math.abs(Ae.y-yc.y));u.Oj(Qc);var id=0;if(Rb instanceof X){var Rc=Rb,id=Rc.jb*Rc.scale;rh(Rc)===sh&&(Bb=Cb=Math.max(Bb,Cb))}var Bb=Bb+(Math.abs(yc.offsetX)+Math.abs(Ae.offsetX)+id),Cb=Cb+(Math.abs(yc.offsetY)+Math.abs(Ae.offsetY)+id),Ud=Rb.stretch;Ud===dl&&(Ud=pl(Rb,!1));switch(Ud){case qh:ze=qf=0;break;case cd:isFinite(Sd)&&(Bb=Sd);isFinite(Td)&&(Cb=Td);break;case fl:isFinite(Sd)&&(Bb=Sd);ze=0;break;case el:qf=0,isFinite(Td)&&(Cb=Td)}Rb instanceof X&&!Rb.za.I()&&(Rc=Rb,Rc.Tg?Rc.jk=null:Rc.Qa=null);Rb.Io();Ph(Rb,Bb,Cb,qf,ze);e.width=Rb.Ca.width+pc;e.height=Rb.Ca.height+Pc}break;case"Table":for(var Vd=a,Ye=b,qm=c,yi=d,Ea=m.length,Be=u.hb(),Wd=u.hb(),ca=0;ca<Ea;ca++){var ha=m[ca],pg=ha instanceof B?ha:null;if(null===pg||pg.type!==tl&&pg.type!==ul||!ha.visible){Be.push(ha)}else{Wd.push(ha);for(var Qg=pg.Aa.n,zh=Qg.length,Sc=0;Sc<zh;Sc++){var Ah=Qg[Sc];pg.type===tl?Ah.rc=ha.rc:pg.type===ul&&(Ah.column=ha.column);Be.push(Ah)}}}Ea=Be.length;0===Ea&&(this.hd(0),this.gd(0));for(var Sb=[],ca=0;ca<Ea;ca++){ha=Be[ca],uj(ha,!0),rl(ha,!0),Sb[ha.rc]||(Sb[ha.rc]=[]),Sb[ha.rc][ha.column]||(Sb[ha.rc][ha.column]=[]),Sb[ha.rc][ha.column].push(ha) + }u.sa(Be);for(var Rg=u.hb(),Tc=u.hb(),je=u.hb(),Jc={count:0},jd={count:0},zc=Vd,kd=Ye,Pf=this.Ad,Ea=Pf.length,ca=0;ca<Ea;ca++){var ba=Pf[ca];void 0!==ba&&(ba.Ra=0)}Pf=this.td;Ea=Pf.length;for(ca=0;ca<Ea;ca++){ba=Pf[ca],void 0!==ba&&(ba.Ra=0)}for(var ke=Sb.length,Ce=0,ca=0;ca<ke;ca++){Sb[ca]&&(Ce=Math.max(Ce,Sb[ca].length))}for(var Tj=Math.min(this.vi,ke-1),Uj=Math.min(this.ii,Ce-1),Ac=0,ke=Sb.length,ca=Tj;ca<ke;ca++){if(Sb[ca]){var Ce=Sb[ca].length,fb=this.hd(ca);fb.Ra=0;for(Sc=Uj;Sc<Ce;Sc++){if(Sb[ca][Sc]){var gb=this.gd(Sc);void 0===Rg[Sc]&&(gb.Ra=0,Rg[Sc]=!0);for(var Vj=Sb[ca][Sc],Qf=Vj.length,qg=0;qg<Qf;qg++){if(ha=Vj[qg],ha.visible||ha===this.fc){var rg=1<ha.tj||1<ha.Wi;rg&&Tc.push(ha);var Nb=ha.margin,Rf=Nb.right+Nb.left,Sf=Nb.top+Nb.bottom,Xd=Gl(ha,fb,gb,!1),le=ha.za,rm=!isNaN(le.height),Bh=!isNaN(le.width)&&rm;rg||Xd===qh||Bh||(void 0===Jc[Sc]&&(Jc[Sc]=-1,Jc.count++),void 0===jd[ca]&&(jd[ca]=-1,jd.count++),je.push(ha));Ph(ha,Infinity,Infinity,0,0);var De=ha.Ca,Ze=Math.max(De.width+Rf,0),Cd=Math.max(De.height+Sf,0);1!==ha.tj||Xd!==qh&&Xd!==fl||(ba=this.hd(ca),Ac=Math.max(Cd-ba.Ra,0),Ac>kd&&(Ac=kd),ba.Ra+=Ac,kd=Math.max(kd-Ac,0));1!==ha.Wi||Xd!==qh&&Xd!==el||(ba=this.gd(Sc),Ac=Math.max(Ze-ba.Ra,0),Ac>zc&&(Ac=zc),ba.Ra+=Ac,zc=Math.max(zc-Ac,0));rg&&ha.Io()}}}}}}u.sa(Rg);for(var qc=0,Yd=0,Ea=this.rs,ca=0;ca<Ea;ca++){void 0!==this.td[ca]&&(qc+=this.gd(ca).yb)}Ea=this.lt;for(ca=0;ca<Ea;ca++){void 0!==this.Ad[ca]&&(Yd+=this.hd(ca).yb)}for(var zc=Math.max(Vd-qc,0),Wj=kd=Math.max(Ye-Yd,0),Xj=zc,Ea=je.length,ca=0;ca<Ea;ca++){var ha=je[ca],fb=this.hd(ha.rc),gb=this.gd(ha.column),zi=ha.Ca,Nb=ha.margin,Rf=Nb.right+Nb.left,Sf=Nb.top+Nb.bottom;Jc[ha.column]=0===gb.Ra?Math.max(zi.width+Rf,Jc[ha.column]):null;jd[ha.rc]=0===fb.Ra?Math.max(zi.height+Sf,jd[ha.rc]):null}var Sg=0,Bc=0;for(ca in jd){"count"!==ca&&(Sg+=jd[ca])}for(ca in Jc){"count"!==ca&&(Bc+=Jc[ca])}for(var pb=u.vl(),ca=0;ca<Ea;ca++){if(ha=je[ca],ha.visible||ha===this.fc){var fb=this.hd(ha.rc),gb=this.gd(ha.column),me=0;isFinite(gb.width)?me=gb.width:(me=isFinite(zc)&&null!==Jc[ha.column]?0===Bc?gb.Ra+zc:Jc[ha.column]/Bc*Xj:null!==Jc[ha.column]?zc:gb.Ra||zc,me=Math.max(0,me-gb.ng()));var Kc=0;isFinite(fb.height)?Kc=fb.height:(Kc=isFinite(kd)&&null!==jd[ha.rc]?0===Sg?fb.Ra+kd:jd[ha.rc]/Sg*Wj:null!==jd[ha.rc]?kd:fb.Ra||kd,Kc=Math.max(0,Kc-fb.ng()));pb.m(Math.max(gb.Li,Math.min(me,gb.Lf)),Math.max(fb.Li,Math.min(Kc,fb.Lf)));Xd=Gl(ha,fb,gb,!1);switch(Xd){case fl:pb.height=Infinity;break;case el:pb.width=Infinity}Nb=ha.margin;Rf=Nb.right+Nb.left;Sf=Nb.top+Nb.bottom;ha.Io();Ph(ha,pb.width,pb.height,gb.Li,fb.Li);De=ha.Ca;Ze=Math.max(De.width+Rf,0);Cd=Math.max(De.height+Sf,0);isFinite(zc)&&(Ze=Math.min(Ze,pb.width));isFinite(kd)&&(Cd=Math.min(Cd,pb.height));var Tg=0,Tg=fb.Ra;fb.Ra=Math.max(fb.Ra,Cd);Ac=fb.Ra-Tg;kd=Math.max(kd-Ac,0);Tg=gb.Ra;gb.Ra=Math.max(gb.Ra,Ze);Ac=gb.Ra-Tg;zc=Math.max(zc-Ac,0)}}u.sa(je);for(var Ee=u.vl(),Ea=Tc.length,ca=0;ca<Ea;ca++){if(ha=Tc[ca],ha.visible||ha===this.fc){fb=this.hd(ha.rc);gb=this.gd(ha.column);pb.m(Math.max(gb.Li,Math.min(Vd,gb.Lf)),Math.max(fb.Li,Math.min(Ye,fb.Lf)));Xd=Gl(ha,fb,gb,!1);switch(Xd){case cd:0!==gb.Ra&&(pb.width=Math.min(pb.width,gb.Ra));0!==fb.Ra&&(pb.height=Math.min(pb.height,fb.Ra));break;case fl:0!==gb.Ra&&(pb.width=Math.min(pb.width,gb.Ra));break;case el:0!==fb.Ra&&(pb.height=Math.min(pb.height,fb.Ra))}isFinite(gb.width)&&(pb.width=gb.width);isFinite(fb.height)&&(pb.height=fb.height);Ee.m(0,0);for(var Ob=1;Ob<ha.tj&&!(ha.rc+Ob>=this.lt);Ob++){ba=this.hd(ha.rc+Ob),Ee.height+=Math.max(ba.Li,isNaN(ba.Re)?ba.Lf:Math.min(ba.Re,ba.Lf))}for(Ob=1;Ob<ha.Wi&&!(ha.column+Ob>=this.rs);Ob++){ba=this.gd(ha.column+Ob),Ee.width+=Math.max(ba.Li,isNaN(ba.Re)?ba.Lf:Math.min(ba.Re,ba.Lf))}pb.width+=Ee.width;pb.height+=Ee.height;Nb=ha.margin;Rf=Nb.right+Nb.left;Sf=Nb.top+Nb.bottom;Ph(ha,pb.width,pb.height,qm,yi);for(var De=ha.Ca,Ze=Math.max(De.width+Rf,0),Cd=Math.max(De.height+Sf,0),Ch=0,Ob=0;Ob<ha.tj&&!(ha.rc+Ob>=this.lt);Ob++){ba=this.hd(ha.rc+Ob),Ch+=ba.total||0}if(Ch<Cd){for(var Dd=Cd-Ch;0<Dd;){var Ed=ba.yb||0;isNaN(ba.height)&&ba.Lf>Ed&&(ba.Ra=Math.min(ba.Lf,Ed+Dd),ba.yb!==Ed&&(Dd-=ba.yb-Ed));if(-1===ba.index-1){break}ba=this.hd(ba.index-1)}}for(var Tf=0,Ob=0;Ob<ha.Wi&&!(ha.column+Ob>=this.rs);Ob++){ba=this.gd(ha.column+Ob),Tf+=ba.total||0}if(Tf<Ze){for(Dd=Ze-Tf;0<Dd;){Ed=ba.yb||0;isNaN(ba.width)&&ba.Lf>Ed&&(ba.Ra=Math.min(ba.Lf,Ed+Dd),ba.yb!==Ed&&(Dd-=ba.yb-Ed));if(-1===ba.index-1){break}ba=this.gd(ba.index-1)}}}}u.sa(Tc);u.Oj(Ee);u.Oj(pb);for(var Uf=0,$e=0,Xd=pl(this,!0),Fd=this.za,Vf=this.cf,ne=Yd=qc=0,ld=0,Ea=this.rs,ca=0;ca<Ea;ca++){void 0!==this.td[ca]&&(ba=this.gd(ca),isFinite(ba.width)?(ne+=ba.width,ne+=ba.ng()):Mm(ba)===Nm?(ne+=ba.yb,ne+=ba.ng()):0!==ba.yb&&(qc+=ba.yb,qc+=ba.ng()))}var Uf=isFinite(Fd.width)?Math.min(Fd.width,Vf.width):Xd!==qh&&isFinite(Vd)?Vd:qc,Uf=Math.max(Uf,this.xg.width),Uf=Math.max(Uf-ne,0),Dh=Math.max(Uf/qc,1);isFinite(Dh)||(Dh=1);for(ca=0;ca<Ea;ca++){void 0!==this.td[ca]&&(ba=this.gd(ca),isFinite(ba.width)||Mm(ba)===Nm||(ba.Ra=ba.yb*Dh),ba.position=e.width,0!==ba.yb&&(e.width+=ba.yb,e.width+=ba.ng())) + }Ea=this.lt;for(ca=0;ca<Ea;ca++){void 0!==this.Ad[ca]&&(ba=this.hd(ca),isFinite(ba.height)?(ld+=ba.height,ld+=ba.ng()):Mm(ba)===Nm?(ld+=ba.yb,ld+=ba.ng()):0!==ba.yb&&(Yd+=ba.yb,Yd+=ba.ng()))}var $e=isFinite(Fd.height)?Math.min(Fd.height,Vf.height):Xd!==qh&&isFinite(Ye)?Ye:Yd,$e=Math.max($e,this.xg.height),$e=Math.max($e-ld,0),Wf=Math.max($e/Yd,1);isFinite(Wf)||(Wf=1);for(ca=0;ca<Ea;ca++){void 0!==this.Ad[ca]&&(ba=this.hd(ca),isFinite(ba.height)||Mm(ba)===Nm||(ba.Ra=ba.yb*Wf),ba.position=e.height,0!==ba.yb&&(e.height+=ba.yb,e.height+=ba.ng()))}Ea=Wd.length;for(ca=0;ca<Ea;ca++){var Tb=Wd[ca];Tb.type===tl?(me=e.width,ba=this.hd(Tb.rc),Kc=ba.Ra):(ba=this.gd(Tb.column),me=ba.Ra,Kc=e.height);Tb.Pc.m(0,0,me,Kc);uj(Tb,!1);Sb[Tb.rc]||(Sb[Tb.rc]=[]);Sb[Tb.rc][Tb.column]||(Sb[Tb.rc][Tb.column]=[]);Sb[Tb.rc][Tb.column].push(Tb)}u.sa(Wd);this.zr=Sb;break;case"Viewbox":var sg=a,tg=b,sf=c,Ai=d;1<m.length&&u.k("Viewbox Panel cannot contain more than one GraphObject.");var Fe=m[0];Fe.ac=1;Fe.Io();Ph(Fe,Infinity,Infinity,sf,Ai);var Bi=Fe.Ca,Zj=Fe.margin,Jp=Zj.right+Zj.left,Kp=Zj.top+Zj.bottom;if(isFinite(sg)||isFinite(tg)){var Rr=Fe.scale,ak=Bi.width,bk=Bi.height,Lp=Math.max(sg-Jp,0),Mp=Math.max(tg-Kp,0),Ci=1;this.lo===sh?0!==ak&&0!==bk&&(Ci=Math.min(Lp/ak,Mp/bk)):0!==ak&&0!==bk&&(Ci=Math.max(Lp/ak,Mp/bk));0===Ci&&(Ci=0.0001);Fe.ac*=Ci;Rr!==Fe.scale&&(uj(Fe,!0),Ph(Fe,Infinity,Infinity,sf,Ai))}Bi=Fe.Ca;e.width=isFinite(sg)?sg:Math.max(Bi.width+Jp,0);e.height=isFinite(tg)?tg:Math.max(Bi.height+Kp,0);break;case"Link":var Np=m.length,ug=this instanceof lf?this.Mh:this;if(ug instanceof W){if(0===Np){var ck=this.Gc;bb(ck,0,0);var Zd=this.Ca;Zd.m(0,0,0,0)}else{var dk=this instanceof lf?null:ug.path,af=ug.Qm,Ge=this.wi;Ge.assign(af);Ge.x=0;var Eh=Ge.y=0,Di=ug.points,Eh=void 0!==this.ka?this.ka:Di.count;this.Og.m(af.x,af.y);this.Vi.clear();null!==dk&&(Om(dk,af.width,af.height),Zd=dk.Ca,Ge.Uh(Zd),this.Vi.add(Zd));for(var Fh=u.lh(),Ei=u.K(),Xf=u.K(),sm=0;sm<Np;sm++){var Pb=m[sm];if(Pb!==dk){if(Pb.vg&&Pb instanceof X){Om(Pb,af.width,af.height),Zd=Pb.Ca,Ge.Uh(Zd),this.Vi.add(Zd)}else{if(2>Eh){Ph(Pb,Infinity,Infinity),Zd=Pb.Ca,Ge.Uh(Zd),this.Vi.add(Zd)}else{var Yf=Pb.Qf,Pp=Pb.Dw,tm=Pb.Hj;tm.oe()&&(tm=Ib);var Fi=Pb.Ew,Sr=Pb.CE,Gi=0,Hi=0,ek=0;if(Yf<-Eh||Yf>=Eh){var Qp=ug.YD,Ii=ug.XD;Fi!==dh&&(ek=ug.computeAngle(Pb,Fi,Ii),Pb.Al=ek);Gi=Qp.x-af.x;Hi=Qp.y-af.y}else{var tf,Gh;if(0<=Yf){tf=Di.ja(Yf),Gh=Yf<Eh-1?Di.ja(Yf+1):tf}else{var um=Eh+Yf;tf=Di.ja(um);Gh=0<um?Di.ja(um-1):tf}Ii=0<=Yf?tf.Gi(Gh):Gh.Gi(tf);Fi!==dh&&(ek=ug.computeAngle(Pb,Fi,Ii),Pb.Al=ek);Gi=tf.x+(Gh.x-tf.x)*Pp-af.x;Hi=tf.y+(Gh.y-tf.y)*Pp-af.y}Ph(Pb,Infinity,Infinity);var Zd=Pb.Ca,ck=Pb.Ja,Ji=0;Pb instanceof X&&(Ji=Pb.jb);var fk=ck.width+Ji,vm=ck.height+Ji;Fh.reset();Fh.translate(-Zd.x,-Zd.y);Fh.scale(Pb.scale,Pb.scale);Fh.rotate(Fi===dh?Pb.angle:Ii,fk/2,vm/2);var Hh=new z(0,0,fk,vm);Ei.qt(Hh,tm);Fh.bb(Ei);var Tr=-Ei.x+Ji/2,Ur=-Ei.y+Ji/2;Xf.assign(Sr);isNaN(Xf.x)&&(Xf.x=0<=Yf?fk/2+3:-(fk/2+3));isNaN(Xf.y)&&(Xf.y=-(vm/2+3));Xf.rotate(Ii);Gi+=Xf.x;Hi+=Xf.y;Hh.set(Zd);Hh.x=Gi+Tr;Hh.y=Hi+Ur;this.Vi.add(Hh);Ge.Uh(Hh)}}}}if(this.we){for(var Rp=this.wg;Rp.next();){Ph(Rp.value,Infinity,Infinity)}}this.wi=Ge;var wm=this.Og;wm.m(wm.x+Ge.x,wm.y+Ge.y);bb(e,Ge.width||0,Ge.height||0);u.Ze(Fh);u.v(Ei);u.v(Xf)}}break;case"Grid":break;case"TableRow":case"TableColumn":u.k(this.toString()+" is not an element of a Table Panel. TableRow and TableColumn Panels can only be elements of a Table Panel.");break;default:u.k("Unknown panel type: "+n)}}var He=e.width,Ie=e.height,gk=this.padding,Vr=gk.top+gk.bottom,He=He+(gk.left+gk.right),Ie=Ie+Vr;isFinite(f.width)&&(He=f.width);isFinite(f.height)&&(Ie=f.height);He=Math.min(k.width,He);Ie=Math.min(k.height,Ie);He=Math.max(h.width,He);Ie=Math.max(h.height,Ie);He=Math.max(c,He);Ie=Math.max(d,Ie);e.width=He;e.height=Ie;bb(this.Gc,He,Ie);ml(this,0,0,He,Ie)};B.prototype.findMainElement=B.prototype.Jf=function(){if(null===this.lm){var a=this.Aa.n,b=a.length;if(0===b){return null}for(var c=0;c<b;c++){var d=a[c];if(!0===d.vg){return this.lm=d}}this.lm=a[0]}return this.lm};B.prototype.yi=function(a,b,c,d){var e=this.wi,f=this.Aa.n,h=u.Vj(0,0,0,0);if(0===f.length){var k=this.ca;k.x=a;k.y=b;k.width=c;k.height=d}else{if(!this.za.I()){var l=pl(this,!0),m=this.Pc,n=m.width,p=m.height,q=this.margin,r=q.left+q.right,s=q.top+q.bottom;n===c&&p===d&&(l=qh);switch(l){case qh:if(n>c||p>d){this.S(),Ph(this,n>c?c:n,p>d?d:p)}break;case cd:this.S(!0);Ph(this,c+r,d+s,0,0);break;case fl:this.S(!0);Ph(this,c+r,p+s,0,0);break;case el:this.S(!0),Ph(this,n+r,d+s,0,0)}}k=this.ca;k.x=a;k.y=b;k.width=c;k.height=d;var t=this.pa.Vb;switch(t){case"Position":for(var v=f.length,x=e.x-this.padding.left,A=e.y-this.padding.top,y=0;y<v;y++){var C=f[y],I=C.Ca,H=C.margin,R=C.position.x,aa=C.position.y;h.x=isNaN(R)?-x:R-x;h.y=isNaN(aa)?-A:aa-A;if(C instanceof X){var S=C;if(S.sz){var N=S.jb/2;h.x-=N;h.y-=N}}h.x+=H.left;h.y+=H.top;h.width=I.width;h.height=I.height;C.visible&&C.yc(h.x,h.y,h.width,h.height)}break; + case"Vertical":for(var Z=f.length,Ga=this.padding.left,ua=this.padding.top,Oa=0;Oa<Z;Oa++){var na=Ga,Ba=f[Oa];if(Ba.visible){var ra=Ba.Ca,dc=Ba.margin,ed=dc.left+dc.right,Lf=Ga+this.padding.right,ec=ra.width,We=pl(Ba,!1);if(isNaN(Ba.za.width)&&We===cd||We===fl){ec=Math.max(e.width-ed-Lf,0)}var Mf=ec+ed+Lf,Ta=Ba.alignment;Ta.Kc()&&(Ta=this.Tk);Ta.Vc()||(Ta=Ib);Ba.yc(na+Ta.offsetX+dc.left+(e.width*Ta.x-Mf*Ta.x),ua+Ta.offsetY+dc.top,ec,ra.height);ua+=ra.height+dc.bottom+dc.top}}break;case"Horizontal":for(var db=f.length,wa=this.padding.top,za=this.padding.left,lb=0;lb<db;lb++){var Eb=wa,$a=f[lb];if($a.visible){var jc=$a.Ca,ge=$a.margin,nc=ge.top+ge.bottom,Pd=wa+this.padding.bottom,he=jc.height,Xe=pl($a,!1);if(isNaN($a.za.height)&&Xe===cd||Xe===el){he=Math.max(e.height-nc-Pd,0)}var pf=he+nc+Pd,Qd=$a.alignment;Qd.Kc()&&(Qd=this.Tk);Qd.Vc()||(Qd=Ib);$a.yc(za+Qd.offsetX+ge.left,Eb+Qd.offsetY+ge.top+(e.height*Qd.y-pf*Qd.y),jc.width,he);za+=jc.width+ge.left+ge.right}}break;case"Spot":var Fb=f.length,Kb=this.Jf(),Fc=Kb.Ca,Mg=Fc.width,Lb=Fc.height,yb=this.padding,fc=yb.left,mb=yb.top;h.x=fc-e.x;h.y=mb-e.y;Kb.yc(h.x,h.y,Mg,Lb);for(var ye=0;ye<Fb;ye++){var Rd=f[ye];if(Rd!==Kb){var og=Rd.Ca,Nf=og.width,zb=og.height,fd=Rd.alignment;fd.Kc()&&(fd=this.Tk);fd.Vc()||(fd=Ib);var oc=Rd.Hj;oc.Kc()&&(oc=Ib);h.x=fd.x*Mg+fd.offsetX-(oc.x*Nf-oc.offsetX);h.y=fd.y*Lb+fd.offsetY-(oc.y*zb-oc.offsetY);h.x-=e.x;h.y-=e.y;Rd.visible&&Rd.yc(fc+h.x,mb+h.y,Nf,zb)}}break;case"Auto":var wb=f.length,Gc=this.Jf(),Mb=Gc.Ca,Na=u.Tf();Na.m(0,0,1,1);var eb=Gc.margin,Ab=eb.left,gc=eb.top,Sd=this.padding,Td=Sd.left,qf=Sd.top;h.x=Ab;h.y=gc;h.width=Mb.width;h.height=Mb.height;Gc.yc(Td+h.x,qf+h.y,h.width,h.height);var ze=Km(Gc),rf=Lm(Gc),Rb=0+ze.y*Mb.height+ze.offsetY,cb=0+rf.x*Mb.width+rf.offsetX,pc=0+rf.y*Mb.height+rf.offsetY;Na.x=0+ze.x*Mb.width+ze.offsetX;Na.y=Rb;kb(Na,cb,pc,0,0);Na.x+=Ab+Td;Na.y+=gc+qf;for(var Pc=0;Pc<wb;Pc++){var gd=f[Pc];if(gd!==Gc){var ab=gd.Ca,eb=gd.margin,ub=Math.max(ab.width+eb.right+eb.left,0),kc=Math.max(ab.height+eb.top+eb.bottom,0),hd=gd.alignment;hd.Kc()&&(hd=this.Tk);hd.Vc()||(hd=Ib);h.x=Na.width*hd.x+hd.offsetX-ub*hd.x+eb.left+Na.x;h.y=Na.height*hd.y+hd.offsetY-kc*hd.y+eb.top+Na.y;h.width=Na.width;h.height=Na.height;gd.visible&&(qb(Na.x,Na.y,Na.width,Na.height,h.x,h.y,ab.width,ab.height)?gd.yc(h.x,h.y,ab.width,ab.height):gd.yc(h.x,h.y,ab.width,ab.height,new z(Na.x,Na.y,Na.width,Na.height)))}}u.ic(Na);break;case"Table":for(var Ng=f.length,Og=this.padding,Pg=Og.left,Of=Og.top,Hc=this.zr,Qc=0,Ic=0,nb=Hc.length,ie=0,ob=0;ob<nb;ob++){Hc[ob]&&(ie=Math.max(ie,Hc[ob].length))}for(var yc=Math.min(this.vi,nb-1);yc!==nb&&(void 0===this.Ad[yc]||0===this.Ad[yc].yb);){yc++}for(var yc=Math.min(yc,nb-1),Ae=-this.Ad[yc].Na,Bb=Math.min(this.ii,ie-1);Bb!==ie&&(void 0===this.td[Bb]||0===this.td[Bb].yb);){Bb++}for(var Bb=Math.min(Bb,ie-1),Cb=-this.td[Bb].Na,id=u.vl(),ob=0;ob<nb;ob++){if(Hc[ob]){for(var ie=Hc[ob].length,Rc=this.hd(ob),Ic=Rc.Na+Ae+Of+Rc.$C(),Ud=0;Ud<ie;Ud++){if(Hc[ob][Ud]){for(var Vd=this.gd(Ud),Qc=Vd.Na+Cb+Pg+Vd.$C(),Ye=Hc[ob][Ud],qm=Ye.length,yi=0;yi<qm;yi++){var Ea=Ye[yi],Be=Ea.Ca,Wd=Ea instanceof B?Ea:null;if(null===Wd||Wd.type!==tl&&Wd.type!==ul){id.m(0,0);for(var ca=1;ca<Ea.rowSpan&&!(ob+ca>=this.lt);ca++){var ha=this.hd(ob+ca);id.height+=ha.total}for(ca=1;ca<Ea.aG&&!(Ud+ca>=this.rs);ca++){var pg=this.gd(Ud+ca);id.width+=pg.total}var Qg=Vd.yb+id.width,zh=Rc.yb+id.height;h.x=Qc;h.y=Ic;h.width=Qg;h.height=zh;var Sc=Qc,Ah=Ic,Sb=Qg,Rg=zh;Qc+Qg>e.width&&(Sb=Math.max(e.width-Qc,0));Ic+zh>e.height&&(Rg=Math.max(e.height-Ic,0));var Tc=Ea.alignment,je=0,Jc=0,jd=0,zc=0;if(Tc.Kc()){Tc=this.Tk;Tc.Vc()||(Tc=Ib);var je=Tc.x,Jc=Tc.y,jd=Tc.offsetX,zc=Tc.offsetY,kd=Vd.alignment,Pf=Rc.alignment;kd.Vc()&&(je=kd.x,jd=kd.offsetX);Pf.Vc()&&(Jc=Pf.y,zc=Pf.offsetY)}else{je=Tc.x,Jc=Tc.y,jd=Tc.offsetX,zc=Tc.offsetY}if(isNaN(je)||isNaN(Jc)){Jc=je=0.5,zc=jd=0}var ba=Be.width,ke=Be.height,Ce=Ea.margin,Tj=Ce.left+Ce.right,Uj=Ce.top+Ce.bottom,Ac=Gl(Ea,Rc,Vd,!1);!isNaN(Ea.za.width)||Ac!==cd&&Ac!==fl||(ba=Math.max(Qg-Tj,0));!isNaN(Ea.za.height)||Ac!==cd&&Ac!==el||(ke=Math.max(zh-Uj,0));var fb=Ea.cf,gb=Ea.xg,ba=Math.min(fb.width,ba),ke=Math.min(fb.height,ke),ba=Math.max(gb.width,ba),ke=Math.max(gb.height,ke),Vj=ke+Uj;h.x+=h.width*je-(ba+Tj)*je+jd+Ce.left;h.y+=h.height*Jc-Vj*Jc+zc+Ce.top;Ea.visible&&(qb(Sc,Ah,Sb,Rg,h.x,h.y,Be.width,Be.height)?Ea.yc(h.x,h.y,ba,ke):Ea.yc(h.x,h.y,ba,ke,new z(Sc,Ah,Sb,Rg)))}else{Ea.Lg();Ea.Zb.Ma();var Qf=Ea.Zb;Qf.x=Wd.type===tl?Pg:Qc;Qf.y=Wd.type===ul?Of:Ic;Qf.width=Be.width;Qf.height=Be.height;Ea.Zb.freeze();rl(Ea,!1)}}}}}}u.Oj(id);for(ob=0;ob<Ng;ob++){Ea=f[ob],Wd=Ea instanceof B?Ea:null,null===Wd||Wd.type!==tl&&Wd.type!==ul||(Qf=Ea.Zb,Ea.Gc.Ma(),Ea.Gc.m(0,0,Qf.width,Qf.height),Ea.Gc.freeze())}break;case"Viewbox":var qg=f[0],rg=qg.Ca,Nb=qg.margin,Rf=Nb.top+Nb.bottom,Sf=Math.max(rg.width+(Nb.right+Nb.left),0),Xd=Math.max(rg.height+Rf,0),le=qg.alignment;le.Kc()&&(le=this.Tk);le.Vc()||(le=Ib);h.x=e.width*le.x-Sf*le.x+le.offsetX;h.y=e.height*le.y-Xd*le.y+le.offsetY; + h.width=rg.width;h.height=rg.height;qg.yc(h.x,h.y,h.width,h.height);break;case"Link":var rm=f.length,Bh=this instanceof lf?this.Mh:this;if(Bh instanceof W){var De=this instanceof lf?null:Bh.path,Ze=this.Vi.n,Cd=0;if(null!==De&&Cd<this.Vi.count){var qc=Ze[Cd];Cd++;De.yc(qc.x-this.wi.x,qc.y-this.wi.y,qc.width,qc.height)}for(var Yd=0;Yd<rm;Yd++){var Wj=f[Yd];Wj!==De&&Cd<this.Vi.count&&(qc=Ze[Cd],Cd++,Wj.yc(qc.x-this.wi.x,qc.y-this.wi.y,qc.width,qc.height))}var Xj=Bh.points,zi=Xj.count;if(2<=zi&&this.we){for(var Sg=this.wg;Sg.next();){var Bc=Sg.value,pb=zi,me=Xj,Kc=Bc.Qf,Tg=Bc.Dw,Ee=Bc.Hj;Ee.oe()&&(Ee=Ib);var Ob=Bc.Ew,Ch=Bc.CE,Dd=0,Ed=0,Tf=0;if(Kc<-pb||Kc>=pb){var Uf=this.YD,$e=this.XD;Ob!==dh&&(Tf=this.computeAngle(Bc,Ob,$e),Bc.angle=Tf);Dd=Uf.x;Ed=Uf.y}else{var Fd=void 0,Vf=void 0;if(0<=Kc){Fd=me.n[Kc],Vf=Kc<pb-1?me.n[Kc+1]:Fd}else{var ne=pb+Kc,Fd=me.n[ne],Vf=0<ne?me.n[ne-1]:Fd}$e=0<=Kc?Fd.Gi(Vf):Vf.Gi(Fd);Ob!==dh&&(Tf=this.computeAngle(Bc,Ob,$e),Bc.angle=Tf);Dd=Fd.x+(Vf.x-Fd.x)*Tg;Ed=Fd.y+(Vf.y-Fd.y)*Tg}var ld=u.lh();ld.reset();ld.scale(Bc.scale,Bc.scale);ld.rotate(Bc.angle,0,0);var Dh=Bc.Ja,Wf=u.Vj(0,0,Dh.width,Dh.height),Tb=u.K();Tb.qt(Wf,Ee);ld.bb(Tb);var sg=-Tb.x,tg=-Tb.y,sf=Ch.copy();isNaN(sf.x)&&(sf.x=0<=Kc?Tb.x+3:-(Tb.x+3));isNaN(sf.y)&&(sf.y=-(Tb.y+3));sf.rotate($e);Dd+=sf.x;Ed+=sf.y;ld.WE(Wf);var sg=sg+Wf.x,tg=tg+Wf.y,Ai=u.Yb(Dd+sg,Ed+tg);Bc.move(Ai);u.v(Ai);u.v(Tb);u.ic(Wf);u.Ze(ld)}}this instanceof lf?this.Ys():Bh.Ys()}break;case"Grid":break;case"TableRow":case"TableColumn":u.k(this.toString()+" is not an element of a Table Panel.TableRow and TableColumn panels can only be elements of a Table Panel.");break;default:u.k("Unknown panel type: "+t)}u.ic(h)}};B.prototype.Jj=function(a){var b=this.Ja;if(qb(0,0,b.width,b.height,a.x,a.y)){for(var b=this.Aa.n,c=b.length,d=u.Yb(0,0);c--;){var e=b[c];if(e.visible||e===this.fc){if(Wa(d.set(a),e.transform),e.Da(d)){return u.v(d),!0}}}u.v(d);return null===this.Jb&&null===this.lc?!1:!0}return !1};B.prototype.Vv=function(a){if(this.bn===a){return this}for(var b=this.Aa.n,c=b.length,d=0;d<c;d++){var e=b[d].Vv(a);if(null!==e){return e}}return null};function Pm(a,b,c){c(a,b);if(b instanceof B){b=b.Aa.n;for(var d=b.length,e=0;e<d;e++){Pm(a,b[e],c)}}}function Kj(a,b){Qm(a,a,b)}function Qm(a,b,c){c(b);b=b.Aa.n;for(var d=b.length,e=0;e<d;e++){var f=b[e];f instanceof B&&Qm(a,f,c)}}B.prototype.walkVisualTree=function(a){Rm(this,this,a)};function Rm(a,b,c){c(b);if(b instanceof B){b=b.Aa.n;for(var d=b.length,e=0;e<d;e++){Rm(a,b[e],c)}}}B.prototype.findInVisualTree=B.prototype.ws=function(a){return Sm(this,this,a)};function Sm(a,b,c){if(c(b)){return b}if(b instanceof B){b=b.Aa.n;for(var d=b.length,e=0;e<d;e++){var f=Sm(a,b[e],c);if(null!==f){return f}}}return null}B.prototype.findObject=B.prototype.ke=function(a){if(this.name===a){return this}for(var b=this.Aa.n,c=b.length,d=0;d<c;d++){var e=b[d];if(e.name===a){return e}if(e instanceof B){if(null===e.hi&&null===e.ag){if(e=e.ke(a),null!==e){return e}}else{if(sk(e)&&(e=e.Aa.first(),null!==e&&(e=e.ke(a),null!==e))){return e}}}}return null};function Tm(a){a=a.Aa.n;for(var b=a.length,c=0,d=0;d<b;d++){var e=a[d];if(e instanceof B){c=Math.max(c,Tm(e))}else{if(e instanceof X){a:{if(!e.Tg){switch(e.vn){case"None":case"Square":case"Ellipse":case"Circle":case"LineH":case"LineV":case"FramedRectangle":case"RoundedRectangle":case"Line1":case"Line2":case"Border":case"Cube1":case"Cube2":case"Junction":case"Cylinder1":case"Cylinder2":case"Cylinder3":case"Cylinder4":case"PlusLine":case"XLine":case"ThinCross":case"ThickCross":e=0;break a}}e=e.Ug/2*e.km*e.Ii()}c=Math.max(c,e)}}}return c}g=B.prototype;g.Uf=function(){return !(this.type===tl||this.type===ul)};g.le=function(a,b,c){if(!1===this.Cg){return null}void 0===b&&(b=null);void 0===c&&(c=null);if(Bj(this)){return null}var d=this.Ja,e=1/this.Ii(),f=this.Uf(),h=f?a:Wa(u.Yb(a.x,a.y),this.transform),k=this.g,l=10,m=5;null!==k&&(l=k.hz("extraTouchArea"),m=l/2);if(qb(-(m*e),-(m*e),d.width+l*e,d.height+l*e,h.x,h.y)){if(!this.Mg){var e=this.Aa.n,n=e.length,k=u.K(),m=(l=this.LD)?this.Jf():null;if(l&&(m.Uf()?Wa(k.set(a),m.transform):k.set(a),!m.Da(k))){return u.v(k),f||u.v(h),null}for(;n--;){var p=e[n];if(p.visible||p===this.fc){if(p.Uf()?Wa(k.set(a),p.transform):k.set(a),!l||p!==m){var q=null;p instanceof B?q=p.le(k,b,c):!0===p.Cg&&p.Da(k)&&(q=p);if(null!==q&&(null!==b&&(q=b(q)),null!==q&&(null===c||c(q)))){return u.v(k),f||u.v(h),q}}}}u.v(k)}if(null===this.background&&null===this.rm){return f||u.v(h),null}a=qb(0,0,d.width,d.height,h.x,h.y)?this:null;f||u.v(h);return a}f||u.v(h);return null};g.zs=function(a,b,c,d){if(!1===this.Cg){return !1}void 0===b&&(b=null);void 0===c&&(c=null);d instanceof E||d instanceof F||(d=new E(T));var e=this.Ja,f=this.Uf(),h=f?a:Wa(u.Yb(a.x,a.y),this.transform);if(qb(0,0,e.width,e.height,h.x,h.y)){if(!this.Mg){for(var e=this.Aa.n,k=e.length,l=u.K();k--;){var m=e[k];if(m.visible||m===this.fc){m.Uf()?Wa(l.set(a),m.transform):l.set(a);var n=m,m=m instanceof B?m:null;(null!==m?m.zs(l,b,c,d):n.Da(l))&&!1!==n.Cg&&(null!==b&&(n=b(n)),null===n||null!==c&&!c(n)||d.add(n)) + }}u.v(l)}f||u.v(h);return null!==this.background||null!==this.rm}f||u.v(h);return !1};g.Nj=function(a,b,c,d,e,f){if(!1===this.Cg){return !1}void 0===b&&(b=null);void 0===c&&(c=null);var h=f;void 0===f&&(h=u.lh(),h.reset());h.multiply(this.transform);if(this.wm(a,h)){return Um(this,b,c,e),void 0===f&&u.Ze(h),!0}if(this.ug(a,h)){if(!this.Mg){for(var k=this.Aa.n,l=k.length;l--;){var m=k[l];if(m.visible||m===this.fc){var n=m.ca,p=this.Ja;if(!(n.x>p.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=m;m=m instanceof B?m:null;p=u.lh();p.set(h);if(null!==m?m.Nj(a,b,c,d,e,p):ol(n,a,d,p)){null!==b&&(n=b(n)),null===n||null!==c&&!c(n)||e.add(n)}u.Ze(p)}}}}void 0===f&&u.Ze(h);return d}void 0===f&&u.Ze(h);return !1};function Um(a,b,c,d){for(var e=a.Aa.n,f=e.length;f--;){var h=e[f];if(h.visible){var k=h.ca,l=a.Ja;k.x>l.width||k.y>l.height||0>k.x+k.width||0>k.y+k.height||(h instanceof B&&Um(h,b,c,d),null!==b&&(h=b(h)),null===h||null!==c&&!c(h)||d.add(h))}}}g.Cm=function(a,b,c,d,e,f){if(!1===this.Cg){return !1}void 0===c&&(c=null);void 0===d&&(d=null);var h=this.Ja,k=this.Uf(),l=k?a:Wa(u.Yb(a.x,a.y),this.transform),m=k?b:Wa(u.Yb(b.x,b.y),this.transform),n=l.Lj(m),p=0<l.x&&l.x<h.width&&0<l.y&&l.y<h.height||Xa(l.x,l.y,0,0,0,h.height)<n||Xa(l.x,l.y,0,h.height,h.width,h.height)<n||Xa(l.x,l.y,h.width,h.height,h.width,0)<n||Xa(l.x,l.y,h.width,0,0,0)<n,h=0<l.x&&l.x<h.width&&0<l.y&&l.y<h.height&&Xa(l.x,l.y,0,0,0,h.height)<n&&Xa(l.x,l.y,0,h.height,h.width,h.height)<n&&Xa(l.x,l.y,h.width,h.height,h.width,0)<n&&Xa(l.x,l.y,h.width,0,0,0)<n;k||(u.v(l),u.v(m));if(p){if(!this.Mg){k=u.K();l=u.K();m=this.Aa.n;for(n=m.length;n--;){var q=m[n];if(q.visible||q===this.fc){var r=q.ca,s=this.Ja;r.x>s.width||r.y>s.height||0>r.x+r.width||0>r.y+r.height||(q.Uf()?(r=q.transform,Wa(k.set(a),r),Wa(l.set(b),r)):(k.set(a),l.set(b)),r=q,q=q instanceof B?q:null,null!==q?!q.Cm(k,l,c,d,e,f):!r.tD(k,l,e))||(null!==c&&(r=c(r)),null===r||null!==d&&!d(r)||f.add(r))}}u.v(k);u.v(l)}return e?p:h}return !1};function Km(a){var b=a.A;if(void 0===b||b===uc){b=null}null===b&&a instanceof X&&(a=a.Qa,null!==a&&(b=a.A));null===b&&(b=xb);return b}function Lm(a){var b=a.B;if(void 0===b||b===uc){b=null}null===b&&a instanceof X&&(a=a.Qa,null!==a&&(b=a.B));null===b&&(b=Vb);return b}B.prototype.add=B.prototype.add=function(a){u.C(a,T,B,"add:element");this.Zd(this.Aa.count,a)};B.prototype.elt=B.prototype.ja=function(a){return this.Aa.ja(a)};B.prototype.insertAt=B.prototype.Zd=function(a,b){b instanceof G&&u.k("Cannot add a Part to a Panel: "+b);if(this===b||this.gl(b)){this===b&&u.k("Cannot make a Panel contain itself: "+this.toString()),u.k("Cannot make a Panel indirectly contain itself: "+this.toString()+" already contains "+b.toString())}var c=b.P;null!==c&&c!==this&&u.k("Cannot add a GraphObject that already belongs to another Panel to this Panel: "+b.toString()+", already contained by "+c.toString()+", cannot be shared by this Panel: "+this.toString());this.pa!==bj||b instanceof X||u.k("Can only add Shapes to a Grid Panel, not: "+b);b.rl(this);b.$l=null;if(null!==this.RD){var d=b.data;null!==d&&"object"===typeof d&&(null===this.$f&&(this.$f=new la(Object,B)),this.$f.add(d,b))}var e=this.Aa,d=-1;if(c===this){for(var f=-1,h=this.Aa.n,k=h.length,l=0;l<k;l++){if(h[l]===b){f=l;break}}if(-1!==f){if(f===a||f+1>=e.count&&a>=e.count){return}e.kd(f);d=f}else{u.k("element "+b.toString()+" has panel "+c.toString()+" but is not contained by it.")}}if(0>a||a>e.count){a=e.count}e.Zd(a,b);this.S();b.S();null!==b.Kd?this.zh=!0:b instanceof B&&!0===b.zh&&(this.zh=!0);c=this.W;null!==c&&(c.Bk=null,c.kj=NaN,this.zh&&c instanceof U&&(c.zh=!0),c.zh&&(c.Rd=null),e=this.g,null!==e&&e.ga.fb||(-1!==d&&c.Cc(ce,"elements",this,b,null,d,null),c.Cc(be,"elements",this,null,b,null,a)))};B.prototype.remove=B.prototype.remove=function(a){u.C(a,T,B,"remove:element");for(var b=this.Aa.n,c=b.length,d=-1,e=0;e<c;e++){if(b[e]===a){d=e;break}}-1!==d&&this.Ge(d)};B.prototype.removeAt=B.prototype.kd=function(a){0<=a&&this.Ge(a)};B.prototype.Ge=function(a){var b=this.Aa,c=b.ja(a);c.$l=null;c.rl(null);if(null!==this.$f){var d=c.data;"object"===typeof d&&this.$f.remove(d)}b.kd(a);uj(this,!1);this.S();this.lm===c&&(this.lm=null);b=this.W;null!==b&&(b.Bk=null,b.kj=NaN,d=this.g,null!==d&&d.ga.fb||b.Cc(ce,"elements",this,c,null,a,null))};u.u(B,{lt:"rowCount"},function(){return void 0===this.Ad?0:this.Ad.length});B.prototype.getRowDefinition=B.prototype.hd=function(a){0>a&&u.xa(a,">= 0",B,"getRowDefinition:idx");a=Math.round(a);var b=this.Ad;if(void 0===b[a]){var c=new Se;c.rl(this);c.be=!0;c.index=a;b[a]=c}return b[a]};B.prototype.removeRowDefinition=B.prototype.pE=function(a){0>a&&u.xa(a,">= 0",B,"removeRowDefinition:idx");a=Math.round(a);var b=this.Ad;this.Cc(ce,"coldefs",this,b[a],null,a,null);b[a]&&delete b[a];this.S()};u.u(B,{rs:"columnCount"},function(){return void 0===this.td?0:this.td.length});B.prototype.getColumnDefinition=B.prototype.gd=function(a){0>a&&u.xa(a,">= 0",B,"getColumnDefinition:idx");a=Math.round(a); + var b=this.td;if(void 0===b[a]){var c=new Se;c.rl(this);c.be=!1;c.index=a;b[a]=c}return b[a]};B.prototype.removeColumnDefinition=B.prototype.lE=function(a){0>a&&u.xa(a,">= 0",B,"removeColumnDefinition:idx");a=Math.round(a);var b=this.td;this.Cc(ce,"coldefs",this,b[a],null,a,null);b[a]&&delete b[a];this.S()};u.defineProperty(B,{dI:"rowSizing"},function(){return void 0===this.em?Gm:this.em},function(a){if(void 0!==this.em){var b=this.em;b!==a&&(a!==Gm&&a!==Nm&&u.k("rowSizing must be RowColumnDefinition.ProportionalExtra or RowColumnDefinition.None"),this.em=a,this.S(),this.h("rowSizing",b,a))}});u.defineProperty(B,{$F:"columnSizing"},function(){return void 0===this.El?Gm:this.El},function(a){if(void 0!==this.El){var b=this.El;b!==a&&(a!==Gm&&a!==Nm&&u.k("columnSizing must be RowColumnDefinition.ProportionalExtra or RowColumnDefinition.None"),this.El=a,this.S(),this.h("columnSizing",b,a))}});u.defineProperty(B,{EK:"topIndex"},function(){return void 0===this.vi?0:this.vi},function(a){if(void 0!==this.vi){var b=this.vi;b!==a&&((!isFinite(a)||0>a)&&u.k("topIndex must be greater than zero and a real number. Was "+a),this.vi=a,this.S(),this.h("topIndex",b,a))}});u.defineProperty(B,{SJ:"leftIndex"},function(){return void 0===this.ii?0:this.ii},function(a){if(void 0!==this.ii){var b=this.ii;b!==a&&((!isFinite(a)||0>a)&&u.k("leftIndex must be greater than zero and a real number. Was "+a),this.ii=a,this.S(),this.h("leftIndex",b,a))}});B.prototype.findRowForLocalY=function(a){if(0>a){return -1}if(this.type!==Fl){return NaN}for(var b=0,c=this.Ad,d=c.length,e=this.vi;e<d;e++){var f=c[e];if(void 0!==f&&(b+=f.total,a<b)){return e}}return -1};B.prototype.findColumnForLocalX=function(a){if(0>a){return -1}if(this.type!==Fl){return NaN}for(var b=0,c=this.td,d=c.length,e=this.ii;e<d;e++){var f=c[e];if(void 0!==f&&(b+=f.total,a<b)){return e}}return -1};u.defineProperty(B,{data:"data"},function(){return this.sh},function(a){var b=this.sh;if(b!==a){var c=this instanceof G&&!(this instanceof lf);c&&u.j(a,"object",B,"data");nf(this);this.sh=a;var d=this.g;null!==d&&(c?this instanceof W?(null!==b&&d.lk.remove(b),null!==a&&d.lk.add(a,this)):(null!==b&&d.ai.remove(b),null!==a&&d.ai.add(a,this)):(c=this.P,null!==c&&null!==c.$f&&(null!==b&&c.$f.remove(b),null!==a&&c.$f.add(a,this))));this.h("data",b,a);null!==d&&d.ga.fb||null!==a&&this.Ob()}});u.defineProperty(B,{jH:"itemIndex"},function(){return this.wq},function(a){var b=this.wq;b!==a&&(this.wq=a,this.h("itemIndex",b,a))});function Pl(a){a=a.Cl;return null!==a&&a.Ea}function nf(a){var b=a.Cl;if(null===b){null!==a.data&&u.k("Template cannot have .data be non-null: "+a),a.Cl=b=new E(bf)}else{if(b.Ea){return}}var c=new E(T);Pm(a,a,function(a,d){var e=d.Fc;if(null!==e){for(Jl(d,!1),e=e.i;e.next();){var f=e.value;f.mode===df&&Jl(d,!0);if(null!==f.Rm){var h=ef(f,a,d);null!==h&&(c.add(h),null===h.bo&&(h.bo=new E(bf)),h.bo.add(f))}b.add(f)}}if(d instanceof B&&d.type===Fl){if(0<d.Ad.length){for(e=d.Ad,f=e.length,h=0;h<f;h++){var k=e[h];if(void 0!==k&&null!==k.Fc){for(var l=k.Fc.i;l.next();){var v=l.value;v.hg=k;v.By=2;v.ov=k.index;b.add(v)}}}}if(0<d.td.length){for(e=d.td,f=e.length,h=0;h<f;h++){if(k=e[h],void 0!==k&&null!==k.Fc){for(l=k.Fc.i;l.next();){v=l.value,v.hg=k,v.By=1,v.ov=k.index,b.add(v)}}}}}});for(var d=c.i;d.next();){var e=d.value;if(null!==e.bo){Jl(e,!0);for(var f=e.bo.i;f.next();){var h=f.value;null===e.Fc&&(e.Fc=new E(bf));e.Fc.add(h)}}e.bo=null}for(d=b.i;d.next();){if(e=d.value,f=e.hg,null!==f){e.hg=null;var k=e.Nw,l=k.indexOf(".");0<l&&f instanceof B&&(h=k.substring(0,l),k=k.substr(l+1),l=f.ke(h),null!==l?(f=l,e.Nw=k):u.trace('Warning: unable to find GraphObject named "'+h+'" for Binding: '+e.toString()));f instanceof Se?(e.ul=u.Uc(f.P),f.P.bn=e.ul):(e.ul=u.Uc(f),f.bn=e.ul)}}b.freeze();a instanceof G&&a.Hd()&&(Ph(a,Infinity,Infinity),a.yc())}B.prototype.updateTargetBindings=B.prototype.Ob=function(a){var b=this.Cl;if(null!==b){for(void 0===a&&(a=""),b=b.i;b.next();){var c=b.value,d=c.LE;if(""===a||""===d||d===a){if(d=c.Nw,null!==c.fG||""!==d){var d=this.data,e=c.Rm;if(null!==e){d=""===e?this:"."===e?this:".."===e?this:this.ke(e)}else{var f=this.g;null!==f&&c.yt&&(d=f.ha.$s)}if(null!==d){var f=this,h=c.ul;if(-1!==h){if(f=this.Vv(h),null===f){continue}}else{null!==c.hg&&(f=c.hg)}"."===e?d=f:".."===e&&(d=f.P);e=c.By;if(0!==e){if(!(f instanceof B)){continue}h=f;1===e?f=h.gd(c.ov):2===e&&(f=h.hd(c.ov))}void 0!==f&&c.ZE(f,d)}}}}}};u.defineProperty(B,{RD:"itemArray"},function(){return this.hi},function(a){var b=this.hi;if(b!==a){var c=this.g;null!==c&&null!==b&&Qj(c,this);this.hi=a;null!==c&&null!==a&&Mj(c,this);this.h("itemArray",b,a);null!==c&&c.ga.fb||this.Sz()}});function sk(a){return a.type===oh||a.type===Yi||a.type===ah||a.type===Fl&&0<a.Aa.length&&(a=a.Aa.ja(0),a.vg&&a instanceof B&&(a.type===tl||a.type===ul))?!0:!1}B.prototype.rebuildItemElements=B.prototype.Sz=function(){var a=0;for(sk(this)&&(a=1);this.Aa.length>a;){this.Ge(a)}a=this.RD;if(null!==a){for(var b=u.qb(a),c=0;c<b;c++){rk(this,u.ib(a,c),c) + }}};function rk(a,b,c){if(!(void 0===b||null===b||0>c)){var d=a.getCategoryForItemData(b,c),d=a.findTemplateForItemData(b,c,d);if(null!==d){nf(d);d=d.copy();"object"===typeof b&&(null===a.$f&&(a.$f=new la(Object,B)),a.$f.add(b,d));var e=c;sk(a)&&e++;a.Zd(e,d);tk(a,e,c);d.data=b}}}function tk(a,b,c){for(a=a.Aa;b<a.length;){var d=a.ja(b);if(d instanceof B){var e=b,f=c;d.type===tl?d.rc=e:d.type===ul&&(d.column=e);d.jH=f}b++;c++}}function vi(a){a=a.Aa.n;for(var b=a.length,c=0;c<b;c++){var d=a[c];if(d instanceof Vm||d instanceof B&&vi(d)){return !0}}return !1}u.defineProperty(B,{PJ:"itemTemplate"},function(){return null===this.ag?null:this.ag.ua("")},function(a){if(null===this.ag){if(null===a){return}this.ag=new la("string",B)}var b=this.ag.ua("");b!==a&&(u.C(a,B,B,"itemTemplate"),(a instanceof G||a.vg)&&u.k("itemTemplate must not be a Part or be Panel.isPanelMain: "+a),this.ag.add("",a),this.h("itemTemplate",b,a),a=this.g,null!==a&&a.ga.fb||this.Sz())});u.defineProperty(B,{kH:"itemTemplateMap"},function(){return this.ag},function(a){var b=this.ag;if(b!==a){u.C(a,la,B,"itemTemplateMap");for(var c=a.i;c.next();){var d=c.value;(d instanceof G||d.vg)&&u.k("Template in itemTemplateMap must not be a Part or be Panel.isPanelMain: "+d)}this.ag=a;this.h("itemTemplateMap",b,a);a=this.g;null!==a&&a.ga.fb||this.Sz()}});u.defineProperty(B,{OJ:"itemCategoryProperty"},function(){return this.Jn},function(a){var b=this.Jn;b!==a&&("string"!==typeof a&&"function"!==typeof a&&u.Ld(a,"string or function",B,"itemCategoryProperty"),this.Jn=a,this.h("itemCategoryProperty",b,a))});B.prototype.getCategoryForItemData=function(a){if(null===a){return""}var b=this.Jn,c="";if("function"===typeof b){c=b(a)}else{if("string"===typeof b&&"object"===typeof a){if(""===b){return""}c=u.sb(a,b)}else{return""}}if(void 0===c){return""}if("string"===typeof c){return c}u.k("Panel.getCategoryForItemData found a non-string category for "+a+": "+c);return""};var Wm=!1,Xm=null;B.prototype.findTemplateForItemData=function(a,b,c){a=this.kH;b=null;null!==a&&(b=a.ua(c));null===b&&(Wm||(Wm=!0,u.trace('No item template Panel found for category "'+c+'" on '+this),u.trace(" Using default item template."),c=new B,a=new qa,a.bind(new bf("text","",de)),c.add(a),Xm=c),b=Xm);return b};u.defineProperty(B,{HJ:"isAtomic"},function(){return this.Mg},function(a){var b=this.Mg;b!==a&&(u.j(a,"boolean",B,"isAtomic"),this.Mg=a,this.h("isAtomic",b,a))});u.defineProperty(B,{LD:"isClipping"},function(){return this.iq},function(a){var b=this.iq;b!==a&&(u.j(a,"boolean",B,"isClipping"),this.iq=a,this.h("isClipping",b,a))});function Se(){u.gc(this);this.Rg=null;this.yu=!0;this.wd=0;this.Re=NaN;this.oj=0;this.mj=Infinity;this.ue=uc;this.Na=this.yb=0;this.Fc=null;this.Lr=Ym;this.Jh=dl;this.Ir=this.wj=null;this.Jr=NaN;this.Jb=this.Fh=null;this.Kp=!1}u.fa("RowColumnDefinition",Se);Se.prototype.copy=function(){var a=new Se;a.yu=this.yu;a.wd=this.wd;a.Re=this.Re;a.oj=this.oj;a.mj=this.mj;a.ue=this.ue;a.yb=this.yb;a.Na=this.Na;a.Jh=this.Jh;a.Lr=this.Lr;a.wj=null===this.wj?null:this.wj.Z();a.Ir=this.Ir;a.Jr=this.Jr;a.Fh=null;null!==this.Fh&&(a.Fh=u.Pk(this.Fh));a.Jb=this.Jb;a.Kp=this.Kp;a.Fc=this.Fc;return a};Se.prototype.ss=function(a){u.C(a,Se,Se,"copyFrom:pd");a.be?this.height=a.height:this.width=a.width;this.Li=a.Li;this.Lf=a.Lf;this.alignment=a.alignment;this.stretch=a.stretch;this.tt=a.tt;this.wj=null===a.wj?null:a.wj.Z();this.fp=a.fp;this.gp=a.gp;this.Fh=null;a.Fh&&(this.Fh=u.Pk(a.Fh));this.background=a.background;this.$y=a.$y;this.Fc=a.Fc};Se.prototype.toString=function(){return"RowColumnDefinition "+(this.be?"(Row ":"(Column ")+this.index+") #"+u.Uc(this)};var Ym;Se.Default=Ym=u.s(Se,"Default",0);var Nm;Se.None=Nm=u.s(Se,"None",1);var Gm;Se.ProportionalExtra=Gm=u.s(Se,"ProportionalExtra",2);Se.prototype.rl=function(a){this.Rg=a};Se.prototype.computeEffectiveSpacingTop=Se.prototype.$C=function(){var a=0;if(0!==this.index){var b=this.Rg,c=this.fp;null===c&&null!==b&&(c=this.be?b.bi:b.th);null!==c&&(a=this.gp,isNaN(a)&&(a=null!==b?this.be?b.vh:b.uh:0))}b=this.EE;if(null===b){if(b=this.Rg,null!==b){b=b.Xi}else{return a}}return a+(this.be?b.top:b.left)};Se.prototype.computeEffectiveSpacing=Se.prototype.ng=function(){var a=0;if(0!==this.index){var b=this.Rg,c=this.fp;null===c&&null!==b&&(c=this.be?b.bi:b.th);null!==c&&(a=this.gp,isNaN(a)&&(a=null!==b?this.be?b.vh:b.uh:0))}b=this.EE;if(null===b){if(b=this.Rg,null!==b){b=b.Xi}else{return a}}return a+(this.be?b.top+b.bottom:b.left+b.right)};Se.prototype.Rc=function(a,b,c,d,e){var f=this.Rg;if(null!==f&&(f.Cc($d,a,this,b,c,d,e),null!==this.Fc&&(b=f.Co(),null!==b&&(b=b.data,null!==b)))){for(c=this.Fc.i;c.next();){c.value.Ow(this,b,a,null)}}};u.u(Se,{P:"panel"},function(){return this.Rg});u.defineProperty(Se,{be:"isRow"},function(){return this.yu},function(a){this.yu=a});u.defineProperty(Se,{index:"index"},function(){return this.wd},function(a){this.wd=a});u.defineProperty(Se,{height:"height"},function(){return this.Re},function(a){var b=this.Re;b!==a&&(0>a&&u.xa(a,">= 0",Se,"height"),this.Re=a,this.Ra=this.yb,null!==this.P&&this.P.S(),this.Rc("height",b,a)) + });u.defineProperty(Se,{width:"width"},function(){return this.Re},function(a){var b=this.Re;b!==a&&(0>a&&u.xa(a,">= 0",Se,"width"),this.Re=a,this.Ra=this.yb,null!==this.P&&this.P.S(),this.Rc("width",b,a))});u.defineProperty(Se,{Li:"minimum"},function(){return this.oj},function(a){var b=this.oj;b!==a&&((0>a||!isFinite(a))&&u.xa(a,">= 0",Se,"minimum"),this.oj=a,this.Ra=this.yb,null!==this.P&&this.P.S(),this.Rc("minimum",b,a))});u.defineProperty(Se,{Lf:"maximum"},function(){return this.mj},function(a){var b=this.mj;b!==a&&(0>a&&u.xa(a,">= 0",Se,"maximum"),this.mj=a,this.Ra=this.yb,null!==this.P&&this.P.S(),this.Rc("maximum",b,a))});u.defineProperty(Se,{alignment:"alignment"},function(){return this.ue},function(a){var b=this.ue;b.L(a)||(this.ue=a.Z(),null!==this.P&&this.P.S(),this.Rc("alignment",b,a))});u.defineProperty(Se,{stretch:"stretch"},function(){return this.Jh},function(a){var b=this.Jh;b!==a&&(this.Jh=a,null!==this.P&&this.P.S(),this.Rc("stretch",b,a))});u.defineProperty(Se,{EE:"separatorPadding"},function(){return this.wj},function(a){"number"===typeof a&&(a=new rb(a));var b=this.wj;null!==a&&null!==b&&b.L(a)||(null!==a&&(a=a.Z()),this.wj=a,null!==this.P&&this.P.S(),this.Rc("separatorPadding",b,a))});u.defineProperty(Se,{fp:"separatorStroke"},function(){return this.Ir},function(a){var b=this.Ir;b!==a&&(null===a||"string"===typeof a||a instanceof ga)&&(a instanceof ga&&a.freeze(),this.Ir=a,null!==this.P&&this.P.S(),this.Rc("separatorStroke",b,a))});u.defineProperty(Se,{gp:"separatorStrokeWidth"},function(){return this.Jr},function(a){var b=this.Jr;b!==a&&(this.Jr=a,null!==this.P&&this.P.S(),this.Rc("separatorStrokeWidth",b,a))});u.defineProperty(Se,{iI:"separatorDashArray"},function(){return this.Fh},function(a){var b=this.Fh;if(b!==a){null===a||Array.isArray(a)||u.Ld(a,"Array",Se,"separatorDashArray:value");if(null!==a){for(var c=a.length,d=0,e=0;e<c;e++){var f=a[e];"number"===typeof f&&0<=f&&isFinite(f)||u.k("separatorDashArray:value "+f+" must be a positive number or zero.");d+=f}if(0===d){if(null===b){return}a=null}}this.Fh=a;null!==this.P&&this.P.na();this.Rc("separatorDashArray",b,a)}});u.defineProperty(Se,{background:"background"},function(){return this.Jb},function(a){var b=this.Jb;b!==a&&(null===a||"string"===typeof a||a instanceof ga)&&(a instanceof ga&&a.freeze(),this.Jb=a,null!==this.P&&this.P.na(),this.Rc("background",b,a))});u.defineProperty(Se,{$y:"coversSeparators"},function(){return this.Kp},function(a){var b=this.Kp;b!==a&&(u.j(a,"boolean",Se,"coversSeparators"),this.Kp=a,null!==this.P&&this.P.na(),this.Rc("coversSeparators",b,a))});u.defineProperty(Se,{tt:"sizing"},function(){return this.Lr},function(a){var b=this.Lr;b!==a&&(this.Lr=a,null!==this.P&&this.P.S(),this.Rc("sizing",b,a))});function Mm(a){if(a.tt===Ym){var b=a.Rg;return a.be?b.dI:b.$F}return a.tt}u.defineProperty(Se,{Ra:"actual"},function(){return this.yb},function(a){this.yb=isNaN(this.Re)?Math.max(Math.min(this.mj,a),this.oj):Math.max(Math.min(this.mj,this.Re),this.oj)});u.defineProperty(Se,{total:"total"},function(){return this.yb+this.ng()},function(a){this.yb=isNaN(this.Re)?Math.max(Math.min(this.mj,a),this.oj):Math.max(Math.min(this.mj,this.Re),this.oj);this.yb=Math.max(0,this.yb-this.ng())});u.defineProperty(Se,{position:"position"},function(){return this.Na},function(a){this.Na=a});Se.prototype.bind=Se.prototype.bind=function(a){a.hg=this;var b=this.P;null!==b&&(b=b.Co(),null!==b&&Pl(b)&&u.k("Cannot add a Binding to a RowColumnDefinition that is already frozen: "+a));null===this.Fc&&(this.Fc=new E(bf));this.Fc.add(a)};function X(){T.call(this);this.Qa=null;this.vn="None";this.Tg=!1;this.aq=dl;this.jk=null;this.wc=this.ld="black";this.Ug=1;this.fo="butt";this.ho="miter";this.km=10;this.jm=null;this.ed=0;this.ti=this.si=uc;this.fr=this.er=NaN;this.jq=!1;this.pq=!0;this.ir=null;this.yn=this.io="None";this.gq=1}u.Ha(X,T);u.fa("Shape",X);X.prototype.cloneProtected=function(a){T.prototype.cloneProtected.call(this,a);a.Qa=this.Qa;a.vn=this.vn;a.Tg=this.Tg;a.aq=this.aq;a.jk=this.jk;a.ld=this.ld;a.wc=this.wc;a.Ug=this.Ug;a.fo=this.fo;a.ho=this.ho;a.km=this.km;a.jm=null;null!==this.jm&&(a.jm=u.Pk(this.jm));a.ed=this.ed;a.si=this.si.Z();a.ti=this.ti.Z();a.er=this.er;a.fr=this.fr;a.jq=this.jq;a.pq=this.pq;a.ir=this.ir;a.io=this.io;a.yn=this.yn;a.gq=this.gq};X.prototype.toString=function(){return"Shape("+("None"!==this.Fb?this.Fb:"None"!==this.lp?this.lp:this.fz)+")#"+u.Uc(this)};function Zm(a,b,c,d){var e=0.001,f=d.Ca,h=f.width,f=f.height,k=0,l=0,m=0,n=0,e=c.length;if(!(4>e)){for(var k=c[0],l=c[1],p=0,q=0,r=0,s=m=0,t=q=0,v=u.hb(),x=2;x<e;x+=2){m=c[x],n=c[x+1],p=m-k,q=n-l,0===p&&(p=0.001),r=q/p,s=Math.atan2(q,p),q=Math.sqrt(p*p+q*q),k=[],k[0]=p,k[1]=s,k[2]=r,k[3]=q,v.push(k),t+=q,k=m,l=n}k=c[0];l=c[1];c=0;for(var e=h,n=h/2,x=0===n?!1:!0,q=0,m=v[q],p=m[0],s=m[1],r=m[2],m=m[3],A=0;0.1<=t;){0===A&&(x?(e=h,c++,e-=n,t-=n,x=!1):(e=h,c++),0===e&&(e=1));if(e>t){u.sa(v);return}e>m?(A=e-m,e=m):A=0;var y=Math.sqrt(e*e/(1+r*r));0>p&&(y=-y); + k+=y;l+=r*y;a.translate(k,l);a.rotate(s);a.translate(-(h/2),-(f/2));0===A&&d.Mj(a,b);a.translate(h/2,f/2);a.rotate(-s);a.translate(-k,-l);t-=e;m-=e;if(0!==A){q++;if(q===v.length){u.sa(v);return}m=v[q];p=m[0];s=m[1];r=m[2];m=m[3];e=A}}u.sa(v)}}X.prototype.Mj=function(a,b){if(null!==this.wc||null!==this.ld){null!==this.ld&&yl(this,a,this.ld,!0,!1);null!==this.wc&&yl(this,a,this.wc,!1,!1);var c=this.Ug;if(0===c){var d=this.W;d instanceof lf&&d.type===ah&&d.xc instanceof X&&(c=d.xc.jb)}a.lineWidth=c;a.lineJoin=this.ho;a.lineCap=this.fo;a.miterLimit=this.km;var e=!1;this.W&&b.Sg.drawShadows&&(e=this.W.il);var f=!0;null!==this.wc&&null===this.ld&&(f=!1);var d=!1,h=!0,k=this.hA;null!==k&&(d=!0,void 0!==a.setLineDash?(a.setLineDash(k),a.lineDashOffset=this.ed):void 0!==a.webkitLineDash?(a.webkitLineDash=k,a.webkitLineDashOffset=this.ed):void 0!==a.mozDash?(a.mozDash=k,a.mozDashOffset=this.ed):h=!1);var l=this.Qa;if(null!==l){if(l.pa===dd){a.beginPath(),d&&!h?kl(a,l.nc,l.tc,l.pb,l.Bb,k,this.ed):(a.moveTo(l.nc,l.tc),a.lineTo(l.pb,l.Bb)),null!==this.ld&&zl(a,this.ld),0!==c&&null!==this.wc&&Bl(a)}else{if(l.pa===md){var m=l.nc,n=l.tc,p=l.pb,q=l.Bb,l=Math.min(m,p),r=Math.min(n,q),m=Math.abs(p-m),n=Math.abs(q-n);null!==this.ld&&(a.beginPath(),a.rect(l,r,m,n),zl(a,this.ld));if(null!==this.wc){var s=p=0,t=0;f&&e&&(p=a.shadowOffsetX,s=a.shadowOffsetY,t=a.shadowBlur,a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0);d&&!h?(h=u.hb(),h.push(l),h.push(r),h.push(l+m),h.push(r),h.push(l+m),h.push(r+n),h.push(l),h.push(r+n),h.push(l),h.push(r),a.beginPath(),$m(a,h,k,this.ed),Bl(a),u.sa(h)):0!==c&&(a.beginPath(),a.rect(l,r,m,n),Bl(a));f&&e&&(a.shadowOffsetX=p,a.shadowOffsetY=s,a.shadowBlur=t)}}else{if(l.pa===nd){m=l.nc,n=l.tc,p=l.pb,q=l.Bb,l=Math.abs(p-m)/2,r=Math.abs(q-n)/2,m=Math.min(m,p)+l,n=Math.min(n,q)+r,a.beginPath(),a.moveTo(m,n-r),a.bezierCurveTo(m+K.ta*l,n-r,m+l,n-K.ta*r,m+l,n),a.bezierCurveTo(m+l,n+K.ta*r,m+K.ta*l,n+r,m,n+r),a.bezierCurveTo(m-K.ta*l,n+r,m-l,n+K.ta*r,m-l,n),a.bezierCurveTo(m-l,n-K.ta*r,m-K.ta*l,n-r,m,n-r),a.closePath(),null!==this.ld&&zl(a,this.ld),d&&!h&&(h=u.hb(),K.Ae(m,n-r,m+K.ta*l,n-r,m+l,n-K.ta*r,m+l,n,0.5,h),K.Ae(m+l,n,m+l,n+K.ta*r,m+K.ta*l,n+r,m,n+r,0.5,h),K.Ae(m,n+r,m-K.ta*l,n+r,m-l,n+K.ta*r,m-l,n,0.5,h),K.Ae(m-l,n,m-l,n-K.ta*r,m-K.ta*l,n-r,m,n-r,0.5,h),a.beginPath(),$m(a,h,k,this.ed),u.sa(h)),0!==c&&null!==this.wc&&(t=s=p=0,f&&e&&(p=a.shadowOffsetX,s=a.shadowOffsetY,t=a.shadowBlur,a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0),Bl(a),f&&e&&(a.shadowOffsetX=p,a.shadowOffsetY=s,a.shadowBlur=t))}else{if(l.pa===ad){r=l.Zi;n=r.length;for(q=0;q<n;q++){m=r.n[q];a.beginPath();a.moveTo(m.va,m.wa);for(var p=m.Ga.n,s=p.length,v=null,t=0;t<s;t++){var x=p[t];switch(x.pa){case yd:a.moveTo(x.F,x.G);break;case pd:a.lineTo(x.F,x.G);break;case zd:a.bezierCurveTo(x.dd,x.ze,x.fg,x.gg,x.pb,x.Bb);break;case Ad:a.quadraticCurveTo(x.dd,x.ze,x.pb,x.Bb);break;case Bd:if(x.radiusX===x.radiusY){v=Math.PI/180,a.arc(x.dd,x.ze,x.radiusX,x.Ke*v,(x.Ke+x.Rf)*v,0>x.Rf)}else{var v=Hd(x,m),A=v.length;if(0===A){a.lineTo(x.ma,x.ya);break}for(var y=0;y<A;y++){var C=v[y];0===y&&a.lineTo(C[0],C[1]);a.bezierCurveTo(C[2],C[3],C[4],C[5],C[6],C[7])}}break;case Gd:y=A=0;if(null!==v&&v.type===Bd){v=Hd(v,m);C=v.length;if(0===C){a.lineTo(x.ma,x.ya);break}v=v[C-1]||null;null!==v&&(A=v[6],y=v[7])}else{A=null!==v?v.F:m.va,y=null!==v?v.G:m.wa}v=Id(x,m,A,y);A=v.length;if(0===A){a.lineTo(x.ma,x.ya);break}for(y=0;y<A;y++){C=v[y],a.bezierCurveTo(C[2],C[3],C[4],C[5],C[6],C[7])}break;default:u.k("Segment not of valid type")}x.Bh&&a.closePath();v=x}e?(t=s=p=0,m.Gn?(!0===m.Ml&&null!==this.ld?(zl(a,this.ld),f=!0):f=!1,0!==c&&null!==this.wc&&(f&&(p=a.shadowOffsetX,s=a.shadowOffsetY,t=a.shadowBlur,a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0),d&&!h||Bl(a),f&&(a.shadowOffsetX=p,a.shadowOffsetY=s,a.shadowBlur=t))):(f&&(p=a.shadowOffsetX,s=a.shadowOffsetY,t=a.shadowBlur,a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0),!0===m.Ml&&null!==this.ld&&zl(a,this.ld),0!==c&&null!==this.wc&&(d&&!h||Bl(a)),f&&(a.shadowOffsetX=p,a.shadowOffsetY=s,a.shadowBlur=t))):(!0===m.Ml&&null!==this.ld&&zl(a,this.ld),0===c||null===this.wc||d&&!h||Bl(a))}if(d&&!h){for(c=f,f=l.Zi,h=f.length,l=0;l<h;l++){r=f.n[l];a.beginPath();n=u.hb();n.push(r.va);n.push(r.wa);q=r.va;m=r.wa;p=q;s=m;t=r.Ga.n;x=t.length;for(v=0;v<x;v++){A=t[v];switch(A.pa){case yd:$m(a,n,k,this.ed);n.length=0;n.push(A.F);n.push(A.G);q=A.F;m=A.G;p=q;s=m;break;case pd:n.push(A.F);n.push(A.G);q=A.F;m=A.G;break;case zd:K.Ae(q,m,A.dd,A.ze,A.fg,A.gg,A.pb,A.Bb,0.5,n);q=A.F;m=A.G;break;case Ad:K.Zo(q,m,A.dd,A.ze,A.pb,A.Bb,0.5,n);q=A.F;m=A.G;break;case Bd:y=Hd(A,r);C=y.length;if(0===C){n.push(A.ma);n.push(A.ya);q=A.ma;m=A.ya;break}for(var I=0;I<C;I++){var H=y[I];K.Ae(q,m,H[2],H[3],H[4],H[5],H[6],H[7],0.5,n);q=H[6];m=H[7]}break;case Gd:y=Id(A,r,q,m);C=y.length;if(0===C){n.push(A.ma);n.push(A.ya);q=A.ma;m=A.ya;break}for(I=0;I<C;I++){H=y[I],K.Ae(q,m,H[2],H[3],H[4],H[5],H[6],H[7],0.5,n),q=H[6],m=H[7]}break;default:u.k("Segment not of valid type") + }A.Bh&&(n.push(p),n.push(s),$m(a,n,k,this.ed))}$m(a,n,k,this.ed);u.sa(n);null!==this.wc&&(q=n=r=0,c&&e&&(r=a.shadowOffsetX,n=a.shadowOffsetY,q=a.shadowBlur,a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0),Bl(a),c&&e&&(a.shadowOffsetX=r,a.shadowOffsetY=n,a.shadowBlur=q))}}}}}}d&&(void 0!==a.setLineDash?(a.setLineDash(u.nh),a.lineDashOffset=0):void 0!==a.webkitLineDash?(a.webkitLineDash=u.nh,a.webkitLineDashOffset=0):void 0!==a.mozDash&&(a.mozDash=null,a.mozDashOffset=0));if(null!==this.fE){d=this.fE;Ph(d,Infinity,Infinity);k=d.Ca;d.yc(0,0,k.width,k.height);a.save();k=this.fd.ub.first();a.beginPath();c=u.hb();c.push(k.va);c.push(k.wa);e=k.va;f=k.wa;h=e;l=f;r=k.Ga.n;n=r.length;for(q=0;q<n;q++){m=r[q];switch(m.pa){case yd:Zm(a,b,c,d);c.length=0;c.push(m.F);c.push(m.G);e=m.F;f=m.G;h=e;l=f;break;case pd:c.push(m.F);c.push(m.G);e=m.F;f=m.G;break;case zd:K.Ae(e,f,m.dd,m.ze,m.fg,m.gg,m.pb,m.Bb,0.5,c);e=m.F;f=m.G;break;case Ad:K.Zo(e,f,m.dd,m.ze,m.pb,m.Bb,0.5,c);e=m.F;f=m.G;break;case Bd:p=Hd(m,k);s=p.length;if(0===s){c.push(m.ma);c.push(m.ya);e=m.ma;f=m.ya;break}for(t=0;t<s;t++){x=p[t],K.Ae(e,f,x[2],x[3],x[4],x[5],x[6],x[7],0.5,c),e=x[6],f=x[7]}break;case Gd:p=Id(m,k,e,f);s=p.length;if(0===s){c.push(m.ma);c.push(m.ya);e=m.ma;f=m.ya;break}for(t=0;t<s;t++){x=p[t],K.Ae(e,f,x[2],x[3],x[4],x[5],x[6],x[7],0.5,c),e=x[6],f=x[7]}break;default:u.k("Segment not of valid type")}m.Bh&&(c.push(h),c.push(l),Zm(a,b,c,d))}Zm(a,b,c,d);u.sa(c);a.restore()}}}};function $m(a,b,c,d){var e=0.001,f=c.length,h=0,k=0,l=0,m=0,e=b.length;if(!(4>e)){if(h=b[0],k=b[1],4===e){kl(a,h,k,b[2],b[3],c,d)}else{a.moveTo(h,k);for(var n=0,p=0,q=0,r=p=l=0,s=u.hb(),t=2;t<e;t+=2){l=b[t],m=b[t+1],n=l-h,p=m-k,0===n&&(n=0.001),q=p/n,p=Math.sqrt(n*n+p*p),h=[],h[0]=n,h[1]=q,h[2]=p,s.push(h),r+=p,h=l,k=m}h=b[0];k=b[1];b=0;for(var m=!0,e=c[b%f],t=0!==d,p=0,l=s[p],n=l[0],q=l[1],l=l[2],v=0;0.1<=r;){0===v&&(e=c[b%f],b++,t&&(d%=e,e-=d,t=!1));e>r&&(e=r);e>l?(v=e-l,e=l):v=0;var x=Math.sqrt(e*e/(1+q*q));0>n&&(x=-x);h+=x;k+=q*x;m?a.lineTo(h,k):a.moveTo(h,k);r-=e;l-=e;if(0!==v){p++;if(p===s.length){u.sa(s);return}l=s[p];n=l[0];q=l[1];l=l[2];e=v}else{m=!m}}u.sa(s)}}}X.prototype.getDocumentPoint=X.prototype.eb=function(a,b){void 0===b&&(b=new w);a.oe()&&u.k("getDocumentPoint:s Spot must be real: "+a.toString());var c=this.Ja,d=this.jb;b.m(a.x*(c.width+d)-d/2+c.x+a.offsetX,a.y*(c.height+d)-d/2+c.y+a.offsetY);this.Gf.bb(b);return b};X.prototype.Jj=function(a,b){var c=this.Qa;if(null===c||null===this.fill&&null===this.stroke){return !1}var d=c.mb,e=this.jb/2;c.type!==dd||b||(e+=2);var f=u.Tf();f.assign(d);f.Kf(e+2,e+2);if(!f.Da(a)){return u.ic(f),!1}d=e+0.0001;if(c.type===dd){if(null===this.stroke){return !1}d=(c.F-c.va)*(a.x-c.va)+(c.G-c.wa)*(a.y-c.wa);if(0>(c.va-c.F)*(a.x-c.F)+(c.wa-c.G)*(a.y-c.G)||0>d){return !1}u.ic(f);return K.sd(c.va,c.wa,c.F,c.G,e,a.x,a.y)}if(c.type===md){var h=c.va,k=c.wa,l=c.F,m=c.G,c=Math.min(h,l),n=Math.min(k,m),h=Math.abs(l-h),k=Math.abs(m-k);f.x=c;f.y=n;f.width=h;f.height=k;if(null===this.fill){f.Kf(-d,-d);if(f.Da(a)){return u.ic(f),!1}f.Kf(d,d)}null!==this.stroke&&f.Kf(e,e);e=f.Da(a);u.ic(f);return e}if(c.type===nd){h=c.va;k=c.wa;l=c.F;m=c.G;c=Math.min(h,l);n=Math.min(k,m);h=Math.abs(l-h);k=Math.abs(m-k);h/=2;k/=2;c=a.x-(c+h);n=a.y-(n+k);if(null===this.fill){h-=d;k-=d;if(0>=h||0>=k||1>=c*c/(h*h)+n*n/(k*k)){return u.ic(f),!1}h+=d;k+=d}null!==this.stroke&&(h+=e,k+=e);u.ic(f);return 0>=h||0>=k?!1:1>=c*c/(h*h)+n*n/(k*k)}if(c.type===ad){return u.ic(f),null===this.fill?Ld(c,a.x,a.y,e):c.Da(a,e,1<this.jb,b)}u.k("Unknown Geometry type");return !1};X.prototype.Qo=function(a,b,c,d){var e=this.za,f=this.Ug;a=Math.max(a,0);b=Math.max(b,0);var h;if(this.Tg){h=this.Qa.mb}else{var k=this.Fb,l=K.Ww[k];if(void 0===l){var m=K.sg[k];"string"===typeof m&&(m=K.sg[m]);"function"===typeof m?(l=m(null,100,100),K.Ww[k]=l):u.k("Unsupported Figure:"+k)}h=l.mb}var k=h.width,l=h.height,m=h.width,n=h.height;switch(pl(this,!0)){case qh:d=c=0;break;case cd:m=Math.max(a-f,0);n=Math.max(b-f,0);break;case fl:m=Math.max(a-f,0);d=0;break;case el:c=0,n=Math.max(b-f,0)}isFinite(e.width)&&(m=e.width);isFinite(e.height)&&(n=e.height);e=this.cf;h=this.xg;c=Math.max(c,h.width)-f;d=Math.max(d,h.height)-f;m=Math.min(e.width,m);n=Math.min(e.height,n);m=isFinite(m)?Math.max(c,m):Math.max(k,c);n=isFinite(n)?Math.max(d,n):Math.max(l,d);c=rh(this);switch(c){case qh:break;case cd:k=m;l=n;break;case sh:c=Math.min(m/k,n/l);isFinite(c)||(c=1);k*=c;l*=c;break;default:u.k(c+" is not a valid geometryStretch.")}if(this.Tg){h=this.fd,e=k,d=l,c=h.copy(),h=h.mb,e/=h.width,d/=h.height,isFinite(e)||(e=1),isFinite(d)||(d=1),1===e&&1===d||c.scale(e,d),this.Qa=c}else{if(null===this.Qa||this.Qa.Fn!==a-f||this.Qa.En!==b-f){this.Qa=K.makeGeometry(this,k,l)}}h=this.Qa.mb;Infinity===a||Infinity===b?ml(this,h.x-f/2,h.y-f/2,0===a&&0===k?0:h.width+f,0===b&&0===l?0:h.height+f):ml(this,-(f/2),-(f/2),m+f,n+f)};function Om(a,b,c){if(!1!==Aj(a)){a.Pc.Ma();var d=a.Ug;if(0===d){var e=a.W;e instanceof lf&&e.type===ah&&e.xc instanceof X&&(d=e.xc.jb) + }d*=a.ac;ml(a,-(d/2),-(d/2),b+d,c+d);b=a.Pc;c=a.cf;d=a.xg;b.width=Math.min(c.width,b.width);b.height=Math.min(c.height,b.height);b.width=Math.max(d.width,b.width);b.height=Math.max(d.height,b.height);a.Pc.freeze();a.Pc.I()||u.k("Non-real measuredBounds has been set. Object "+a+", measuredBounds: "+a.Pc.toString());uj(a,!1)}}function rh(a){var b=a.zD;return a.Tg?b===dl?cd:b:b===dl?K.Ww[a.Fb].Dd:b}X.prototype.yi=function(a,b,c,d){ql(this,a,b,c,d)};X.prototype.getNearestIntersectionPoint=X.prototype.bl=function(a,b,c){return this.Fo(a.x,a.y,b.x,b.y,c)};X.prototype.Fo=function(a,b,c,d,e){var f=this.transform,h=1/(f.m11*f.m22-f.m12*f.m21),k=f.m22*h,l=-f.m12*h,m=-f.m21*h,n=f.m11*h,p=h*(f.m21*f.dy-f.m22*f.dx),q=h*(f.m12*f.dx-f.m11*f.dy),f=a*k+b*m+p,h=a*l+b*n+q,k=c*k+d*m+p,l=c*l+d*n+q,m=this.jb/2,p=this.Qa;null===p&&(Ph(this,Infinity,Infinity),p=this.Qa);q=p.mb;n=!1;if(p.type===dd){if(1.5>=this.jb){n=K.bh(p.nc,p.tc,p.pb,p.Bb,f,h,k,l,e)}else{var r=0,s=0;p.nc===p.pb?(r=m,s=0):(b=(p.Bb-p.tc)/(p.pb-p.nc),s=m/Math.sqrt(1+b*b),r=s*b);d=u.hb();b=new w;K.bh(p.nc+r,p.tc+s,p.pb+r,p.Bb+s,f,h,k,l,b)&&d.push(b);b=new w;K.bh(p.nc-r,p.tc-s,p.pb-r,p.Bb-s,f,h,k,l,b)&&d.push(b);b=new w;K.bh(p.nc+r,p.tc+s,p.nc-r,p.tc-s,f,h,k,l,b)&&d.push(b);b=new w;K.bh(p.pb+r,p.Bb+s,p.pb-r,p.Bb-s,f,h,k,l,b)&&d.push(b);b=d.length;if(0===b){return u.sa(d),!1}n=!0;s=Infinity;for(r=0;r<b;r++){var k=d[r],t=(k.x-f)*(k.x-f)+(k.y-h)*(k.y-h);t<s&&(s=t,e.x=k.x,e.y=k.y)}u.sa(d)}}else{if(p.type===md){b=q.x-m,n=K.bl(b,q.y-m,q.x+q.width+m,q.y+q.height+m,f,h,k,l,e)}else{if(p.type===nd){a:if(b=q.copy().Kf(m,m),0===b.width){n=K.bh(b.x,b.y,b.x,b.y+b.height,f,h,k,l,e)}else{if(0===b.height){n=K.bh(b.x,b.y,b.x+b.width,b.y,f,h,k,l,e)}else{a=b.width/2;var v=b.height/2;d=b.x+a;b=b.y+v;c=9999;f!==k&&(c=(h-l)/(f-k));if(9999>Math.abs(c)){n=h-b-c*(f-d);if(0>a*a*c*c+v*v-n*n){e.x=NaN;e.y=NaN;n=!1;break a}m=Math.sqrt(a*a*c*c+v*v-n*n);k=(-(a*a*c*n)+a*v*m)/(v*v+a*a*c*c)+d;a=(-(a*a*c*n)-a*v*m)/(v*v+a*a*c*c)+d;l=c*(k-d)+n+b;b=c*(a-d)+n+b;d=Math.abs((f-k)*(f-k))+Math.abs((h-l)*(h-l));h=Math.abs((f-a)*(f-a))+Math.abs((h-b)*(h-b));d<h?(e.x=k,e.y=l):(e.x=a,e.y=b)}else{k=v*v;l=f-d;k-=k/(a*a)*l*l;if(0>k){e.x=NaN;e.y=NaN;n=!1;break a}m=Math.sqrt(k);l=b+m;b-=m;d=Math.abs(l-h);h=Math.abs(b-h);d<h?(e.x=f,e.y=l):(e.x=f,e.y=b)}n=!0}}}else{if(p.type===ad){var x=0,A=0,y=t=0,q=u.K(),r=k-f,s=l-h,s=r*r+s*s;e.x=k;e.y=l;for(r=0;r<p.ub.count;r++){for(var C=p.ub.n[r],I=C.Ga,x=C.va,A=C.wa,H=x,R=A,aa=0;aa<I.count;aa++){var S=I.n[aa],N=S.type,t=S.F,y=S.G,Z=!1;switch(N){case yd:H=t;R=y;break;case pd:Z=an(x,A,t,y,f,h,k,l,q);break;case zd:var Z=S.Rb,N=S.jc,Ga=S.ff,ua=S.gf,Z=K.ls(x,A,Z,N,Ga,ua,t,y,f,h,k,l,0.5,q);break;case Ad:Z=(x+2*S.Rb)/3;N=(A+2*S.jc)/3;Ga=(2*S.Rb+t)/3;ua=(2*S.Rb+t)/3;Z=K.ls(x,A,Z,N,Ga,ua,t,y,f,h,k,l,0.5,q);break;case Bd:case Gd:N=S.type===Bd?Hd(S,C):Id(S,C,x,A);Ga=N.length;if(0===Ga){Z=an(x,A,S.ma,S.ya,f,h,k,l,q);break}for(y=0;y<Ga;y++){v=N[y],0===y&&an(x,A,v[0],v[1],f,h,k,l,q)&&(t=bn(f,h,q,s,e),t<s&&(s=t,n=!0)),K.ls(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7],f,h,k,l,0.5,q)&&(t=bn(f,h,q,s,e),t<s&&(s=t,n=!0))}t=v[6];y=v[7];break;default:u.k("Unknown Segment type: "+S.type)}x=t;A=y;Z&&(t=bn(f,h,q,s,e),t<s&&(s=t,n=!0));S.fw&&(t=H,y=R,an(x,A,t,y,f,h,k,l,q)&&(t=bn(f,h,q,s,e),t<s&&(s=t,n=!0)))}}f=c-a;h=d-b;b=Math.sqrt(f*f+h*h);0!==b&&(f/=b,h/=b);e.x-=f*m;e.y-=h*m;u.v(q)}else{u.k("Invalid Geometry type")}}}}if(!n){return !1}this.transform.bb(e);return !0};function bn(a,b,c,d,e){a=c.x-a;b=c.y-b;b=a*a+b*b;return b<d?(e.x=c.x,e.y=c.y,b):d}function an(a,b,c,d,e,f,h,k,l){var m=!1,n=(e-h)*(b-d)-(f-k)*(a-c);if(0===n){return !1}l.x=((e*k-f*h)*(a-c)-(e-h)*(a*d-b*c))/n;l.y=((e*k-f*h)*(b-d)-(f-k)*(a*d-b*c))/n;(a>c?a-c:c-a)<(b>d?b-d:d-b)?(e=b<d?b:d,a=b<d?d:b,(l.y>e||K.Wa(l.y,e))&&(l.y<a||K.Wa(l.y,a))&&(m=!0)):(e=a<c?a:c,a=a<c?c:a,(l.x>e||K.Wa(l.x,e))&&(l.x<a||K.Wa(l.x,a))&&(m=!0));return m}X.prototype.containedInRect=X.prototype.wm=function(a,b){if(void 0===b){return a.Kj(this.ca)}var c=this.Qa;null===c&&(Ph(this,Infinity,Infinity),c=this.Qa);var c=c.mb,d=this.jb/2,e=!1,f=u.K();f.m(c.x-d,c.y-d);a.Da(b.bb(f))&&(f.m(c.x-d,c.bottom+d),a.Da(b.bb(f))&&(f.m(c.right+d,c.bottom+d),a.Da(b.bb(f))&&(f.m(c.right+d,c.y-d),a.Da(b.bb(f))&&(e=!0))));u.v(f);return e};X.prototype.intersectsRect=X.prototype.ug=function(a,b){if(this.wm(a,b)||void 0===b&&(b=this.transform,a.Kj(this.ca))){return !0}var c=u.lh();c.set(b);c.pz();var d=a.left,e=a.right,f=a.top,h=a.bottom,k=u.K();k.m(d,f);c.bb(k);if(this.Jj(k,!0)){return u.v(k),!0}k.m(e,f);c.bb(k);if(this.Jj(k,!0)){return u.v(k),!0}k.m(d,h);c.bb(k);if(this.Jj(k,!0)){return u.v(k),!0}k.m(e,h);c.bb(k);if(this.Jj(k,!0)){return u.v(k),!0}var l=u.K(),m=u.K();c.set(b);c.bE(this.transform);c.pz();l.x=e;l.y=f;l.transform(c);k.x=d;k.y=f;k.transform(c);var n=!1;cn(this,k,l,m)?n=!0:(k.x=e,k.y=h,k.transform(c),cn(this,k,l,m)?n=!0:(l.x=d,l.y=h,l.transform(c),cn(this,k,l,m)?n=!0:(k.x=d,k.y=f,k.transform(c),cn(this,k,l,m)&&(n=!0))));u.v(k);u.Ze(c);u.v(l);u.v(m);return n};function cn(a,b,c,d){if(!a.bl(b,c,d)){return !1 + }a=b.x;b=b.y;var e=c.x;c=c.y;var f=d.x;d=d.y;if(a===e){var h=0;a=0;b<c?(h=b,a=c):(h=c,a=b);return d>=h&&d<=a}a<e?(h=a,a=e):h=e;return f>=h&&f<=a}X.prototype.tD=function(a,b,c){function d(a,b){for(var c=a.length,d=0;d<c;d+=2){if(b.zo(a[d],a[d+1])>e){return !0}}return !1}if(c&&null!==this.fill&&this.Jj(a,!0)){return !0}var e=a.Lj(b);b=e;1.5<this.jb&&(e=this.jb/2+Math.sqrt(e),e*=e);var f=this.Qa;null===f&&(Ph(this,Infinity,Infinity),f=this.Qa);if(!c){var h=f.mb,k=h.x,l=h.y,m=h.x+h.width,h=h.y+h.height;if(Ya(a.x,a.y,k,l)<=e&&Ya(a.x,a.y,m,l)<=e&&Ya(a.x,a.y,k,h)<=e&&Ya(a.x,a.y,m,h)<=e){return !0}}k=f.nc;l=f.tc;m=f.pb;h=f.Bb;if(f.type===dd){if(c=Xa(a.x,a.y,k,l,m,h),f=(k-m)*(a.x-m)+(l-h)*(a.y-h),c<=(0<=(m-k)*(a.x-k)+(h-l)*(a.y-l)&&0<=f?e:b)){return !0}}else{if(f.type===md){return b=!1,c&&(b=Xa(a.x,a.y,k,l,k,h)<=e||Xa(a.x,a.y,k,l,m,l)<=e||Xa(a.x,a.y,m,l,m,h)<=e||Xa(a.x,a.y,k,h,m,h)<=e),b}if(f.type===nd){b=a.x-(k+m)/2;var f=a.y-(l+h)/2,n=Math.abs(m-k)/2,p=Math.abs(h-l)/2;if(0===n||0===p){return c=Xa(a.x,a.y,k,l,m,h),c<=e?!0:!1}if(c){if(a=K.tG(n,p,b,f),a*a<=e){return !0}}else{return Ya(b,f,-n,0)>=e||Ya(b,f,0,-p)>=e||Ya(b,f,0,p)>=e||Ya(b,f,n,0)>=e?!1:!0}}else{if(f.type===ad){h=f.mb;k=h.x;l=h.y;m=h.x+h.width;h=h.y+h.height;if(a.x>m&&a.x<k&&a.y>h&&a.y<l&&Xa(a.x,a.y,k,l,k,h)>e&&Xa(a.x,a.y,k,l,m,l)>e&&Xa(a.x,a.y,m,h,k,h)>e&&Xa(a.x,a.y,m,h,m,l)>e){return !1}b=Math.sqrt(e);if(c){if(null===this.fill?Ld(f,a.x,a.y,b):f.Da(a,b,!0)){return !0}}else{c=f.ub;for(b=0;b<c.count;b++){k=c.n[b];n=k.va;p=k.wa;if(a.zo(n,p)>e){return !1}l=k.Ga.n;m=l.length;for(h=0;h<m;h++){var q=l[h];switch(q.type){case yd:case pd:n=q.F;p=q.G;if(a.zo(n,p)>e){return !1}break;case zd:f=u.hb();K.Ae(n,p,q.Rb,q.jc,q.ff,q.gf,q.F,q.G,0.8,f);n=d(f,a);u.sa(f);if(n){return !1}n=q.F;p=q.G;if(a.zo(n,p)>e){return !1}break;case Ad:f=u.hb();K.Zo(n,p,q.Rb,q.jc,q.F,q.G,0.8,f);n=d(f,a);u.sa(f);if(n){return !1}n=q.F;p=q.G;if(a.zo(n,p)>e){return !1}break;case Bd:case Gd:var r=q.type===Bd?Hd(q,k):Id(q,k,n,p),s=r.length;if(0===s){n=q.ma;p=q.ya;if(a.zo(n,p)>e){return !1}break}q=null;f=u.hb();for(b=0;b<s;b++){if(q=r[b],f.length=0,K.Ae(q[0],q[1],q[2],q[3],q[4],q[5],q[6],q[7],0.8,f),d(f,a)){return u.sa(f),!1}}u.sa(f);null!==q&&(n=q[6],p=q[7]);break;default:u.k("Unknown Segment type: "+q.type)}}}return !0}}}}return !1};u.defineProperty(X,{fd:"geometry"},function(){return this.jk?this.jk:this.Qa},function(a){var b=this.Qa;if(b!==a){this.jk=null!==a?this.Qa=a.freeze():this.Qa=null;var c=this.W;null!==c&&(c.kj=NaN);this.Tg=!0;this.S();this.h("geometry",b,a);a=this.W;null!==a&&0!==(this.ea&1024)&&ll(this,a,"geometryString")}});u.defineProperty(X,{FG:"geometryString"},function(){return null===this.fd?"":this.fd.toString()},function(a){var b=sd(a);a=b.normalize();this.fd=b;var b=u.K(),c=this.position;c.I()?b.m(c.x-a.x,c.y-a.y):b.m(-a.x,-a.y);this.position=b;u.v(b)});u.defineProperty(X,{sz:"isGeometryPositioned"},function(){return this.jq},function(a){var b=this.jq;b!==a&&(this.jq=a,this.S(),this.h("isGeometryPositioned",b,a))});X.prototype.me=function(){this.Tg?this.jk=null:this.Qa=null;this.S()};u.defineProperty(X,{fill:"fill"},function(){return this.ld},function(a){var b=this.ld;b!==a&&(a instanceof ga&&a.freeze(),this.ld=a,this.na(),this.h("fill",b,a))});u.defineProperty(X,{stroke:"stroke"},function(){return this.wc},function(a){var b=this.wc;b!==a&&(a instanceof ga&&a.freeze(),this.wc=a,this.na(),this.h("stroke",b,a))});u.defineProperty(X,{jb:"strokeWidth"},function(){return this.Ug},function(a){var b=this.Ug;if(b!==a){if(0<=a){this.Ug=a;this.S();var c=this.W;null!==c&&(c.kj=NaN);this.h("strokeWidth",b,a)}else{u.xa(a,"value >= 0",X,"strokeWidth:value")}}});u.defineProperty(X,{sI:"strokeCap"},function(){return this.fo},function(a){var b=this.fo;b!==a&&("string"!==typeof a||"butt"!==a&&"round"!==a&&"square"!==a?u.xa(a,'"butt", "round", or "square"',X,"strokeCap"):(this.fo=a,this.na(),this.h("strokeCap",b,a)))});u.defineProperty(X,{zK:"strokeJoin"},function(){return this.ho},function(a){var b=this.ho;b!==a&&("string"!==typeof a||"miter"!==a&&"bevel"!==a&&"round"!==a?u.xa(a,'"miter", "bevel", or "round"',X,"strokeJoin"):(this.ho=a,this.na(),this.h("strokeJoin",b,a)))});u.defineProperty(X,{AK:"strokeMiterLimit"},function(){return this.km},function(a){var b=this.km;if(b!==a){if(0<a){this.km=a;this.na();var c=this.W;null!==c&&(c.kj=NaN);this.h("strokeMiterLimit",b,a)}else{u.xa(a,"value > 0",X,"strokeWidth:value")}}});u.defineProperty(X,{hA:"strokeDashArray"},function(){return this.jm},function(a){var b=this.jm;if(b!==a){null===a||Array.isArray(a)||u.Ld(a,"Array",X,"strokeDashArray:value");if(null!==a){for(var c=a.length,d=0,e=0;e<c;e++){var f=a[e];"number"===typeof f&&0<=f&&isFinite(f)||u.k("strokeDashArray:value "+f+" must be a positive number or zero.");d+=f}if(0===d){if(null===b){return}a=null}}this.jm=a;this.na();this.h("strokeDashArray",b,a)}});u.defineProperty(X,{tI:"strokeDashOffset"},function(){return this.ed},function(a){var b=this.ed;b!==a&&0<=a&&(this.ed=a,this.na(),this.h("strokeDashOffset",b,a)) + });u.defineProperty(X,{Fb:"figure"},function(){return this.vn},function(a){var b=this.vn;if(b!==a){var c=K.sg[a];"function"===typeof c?c=a:(c=K.sg[a.toLowerCase()])||u.k("Unknown Shape.figure: "+a);b!==c&&(a=this.W,null!==a&&(a.kj=NaN),this.vn=c,this.Tg=!1,this.me(),this.h("figure",b,c))}});u.defineProperty(X,{lp:"toArrow"},function(){return this.io},function(a){var b=this.io;!0===a?a="Standard":!1===a&&(a="");if(b!==a){var c=K.UC(a);null===c?u.k("Unknown Shape.toArrow: "+a):b!==c&&(this.io=c,this.Tg=!1,this.me(),dn(this),this.h("toArrow",b,c))}});u.defineProperty(X,{fz:"fromArrow"},function(){return this.yn},function(a){var b=this.yn;!0===a?a="Standard":!1===a&&(a="");if(b!==a){var c=K.UC(a);null===c?u.k("Unknown Shape.fromArrow: "+a):b!==c&&(this.yn=c,this.Tg=!1,this.me(),dn(this),this.h("fromArrow",b,c))}});function dn(a){var b=a.g;null!==b&&b.ga.fb||(a.Ew=en,"None"!==a.io?(a.Qf=-1,a.Hj=xc):"None"!==a.yn&&(a.Qf=0,a.Hj=new L(1-xc.x,xc.y)))}u.defineProperty(X,{A:"spot1"},function(){return this.si},function(a){u.C(a,L,X,"spot1");var b=this.si;b.L(a)||(this.si=a=a.Z(),this.S(),this.h("spot1",b,a))});u.defineProperty(X,{B:"spot2"},function(){return this.ti},function(a){u.C(a,L,X,"spot2");var b=this.ti;b.L(a)||(this.ti=a=a.Z(),this.S(),this.h("spot2",b,a))});u.defineProperty(X,{vc:"parameter1"},function(){return this.er},function(a){var b=this.er;b!==a&&(this.er=a,this.me(),this.h("parameter1",b,a))});u.defineProperty(X,{ft:"parameter2"},function(){return this.fr},function(a){var b=this.fr;b!==a&&(this.fr=a,this.me(),this.h("parameter2",b,a))});u.u(X,{Ja:"naturalBounds"},function(){if(null!==this.Qa){return this.Gc.assign(this.Qa.mb),this.Gc}var a=this.za;return new z(0,0,a.width,a.height)});u.defineProperty(X,{KJ:"isRectangular"},function(){return this.pq},function(a){var b=this.pq;b!==a&&(this.pq=a,this.S(),this.h("isRectangular",b,a))});u.defineProperty(X,{fE:"pathObject"},function(){return this.ir},function(a){var b=this.ir;b!==a&&(this.ir=a,this.na(),this.h("pathObject",b,a))});u.defineProperty(X,{zD:"geometryStretch"},function(){return this.aq},function(a){var b=this.aq;b!==a&&(u.rb(a,T,X,"geometryStretch"),this.aq=a,this.h("geometryStretch",b,a))});u.defineProperty(X,{interval:"interval"},function(){return this.gq},function(a){var b=this.gq;a=Math.floor(a);b!==a&&0<=a&&(this.gq=a,null!==this.g&&vj(this.g),this.S(),this.h("interval",b,a))});X.getFigureGenerators=function(){var a=new la("string","function"),b;for(b in K.sg){if(b!==b.toLowerCase()){var c=K.sg[b];"function"===typeof c&&a.add(b,c)}}a.freeze();return a};X.defineFigureGenerator=function(a,b){u.j(a,"string",X,"defineFigureGenerator:name");"string"===typeof b?""!==b&&K.sg[b]||u.k("Shape.defineFigureGenerator synonym must not be empty or None or not a defined figure name: "+b):u.j(b,"function",X,"defineFigureGenerator:func");var c=a.toLowerCase();""!==a&&"none"!==c&&a!==c||u.k("Shape.defineFigureGenerator name must not be empty or None or all-lower-case: "+a);var d=K.sg;d[a]=b;d[c]=a};X.getArrowheadGeometries=function(){var a=new la("string",$c),b;for(b in K.Ri){if(b!==b.toLowerCase()){var c=K.Ri[b];c instanceof $c&&a.add(b,c)}}a.freeze();return a};X.defineArrowheadGeometry=function(a,b){u.j(a,"string",X,"defineArrowheadGeometry:name");var c=null;"string"===typeof b?(u.j(b,"string",X,"defineArrowheadGeometry:pathstr"),c=sd(b,!1)):(u.C(b,$c,X,"defineArrowheadGeometry:pathstr"),c=b);var d=a.toLowerCase();""!==a&&"none"!==d&&a!==d||u.k("Shape.defineArrowheadGeometry name must not be empty or None or all-lower-case: "+a);var e=K.Ri;e[a]=c;e[d]=a};function qa(){T.call(this);this.je="";this.wc="black";this.Jg="13px sans-serif";this.Sd="start";this.mq=!0;this.Ol=this.Pl=!1;this.Ek=fn;this.nm=gn;this.Iu=this.xe=0;this.xn=this.by=this.ey=null;this.ej=new hn;this.Vp=!1;this.mf=this.Hk=this.Tr=null;this.zj=this.yj=0;this.ji=Infinity;this.Cu=0}u.Ha(qa,T);u.fa("TextBlock",qa);var jn=new pa,kn=0,ln=new pa,mn=0,nn="...",on="",pn=u.createElement("canvas").getContext("2d");qa.getEllipsis=function(){return nn};qa.setEllipsis=function(a){nn=a;ln=new pa;mn=0};qa.prototype.cloneProtected=function(a){T.prototype.cloneProtected.call(this,a);a.je=this.je;a.wc=this.wc;a.Jg=this.Jg;a.Sd=this.Sd;a.mq=this.mq;a.Pl=this.Pl;a.Ol=this.Ol;a.nm=this.nm;a.Ek=this.Ek;a.xe=this.xe;a.Iu=this.Iu;a.ey=this.ey;a.by=this.by;a.xn=this.xn;a.ej.ss(this.ej);a.Vp=this.Vp;a.Tr=this.Tr;a.Hk=this.Hk;a.mf=this.mf;a.yj=this.yj;a.zj=this.zj;a.ji=this.ji;a.Cu=this.Cu};qa.prototype.toString=function(){return 22<this.je.length?'TextBlock("'+this.je.substring(0,20)+'"...)':'TextBlock("'+this.je+'")'};var qn;qa.None=qn=u.s(qa,"None",0);var rn;qa.WrapFit=rn=u.s(qa,"WrapFit",1);var gn;qa.WrapDesiredSize=gn=u.s(qa,"WrapDesiredSize",2);var fn;qa.OverflowClip=fn=u.s(qa,"OverflowClip",0);var sn;qa.OverflowEllipsis=sn=u.s(qa,"OverflowEllipsis",1);qa.prototype.S=function(){T.prototype.S.call(this);this.by=this.ey=null};u.defineProperty(qa,{font:"font"},function(){return this.Jg},function(a){var b=this.Jg;b!==a&&(this.Jg=a,this.xn=null,this.S(),this.h("font",b,a)) + });qa.isValidFont=function(a){var b=pn.font;if(a===b||"10px sans-serif"===a){return !0}pn.font="10px sans-serif";var c;pn.font=a;var d=pn.font;if("10px sans-serif"!==d){return pn.font=b,!0}pn.font="19px serif";c=pn.font;pn.font=a;d=pn.font;pn.font=b;return d!==c};u.defineProperty(qa,{text:"text"},function(){return this.je},function(a){var b=this.je;a=null!==a&&void 0!==a?a.toString():"";b!==a&&(this.je=a,this.S(),this.h("text",b,a))});u.defineProperty(qa,{textAlign:"textAlign"},function(){return this.Sd},function(a){var b=this.Sd;b!==a&&("start"===a||"end"===a||"left"===a||"right"===a||"center"===a?(this.Sd=a,this.na(),this.h("textAlign",b,a)):u.xa(a,'"start", "end", "left", "right", or "center"',qa,"textAlign"))});u.u(qa,{Ja:"naturalBounds"},function(){if(!this.Gc.I()){var a=tn(this,this.je,this.ej,999999).width,b=un(this,a,this.ej),c=this.za;isNaN(c.width)||(a=c.width);isNaN(c.height)||(b=c.height);bb(this.Gc,a,b)}return this.Gc});u.defineProperty(qa,{jw:"isMultiline"},function(){return this.mq},function(a){var b=this.mq;b!==a&&(this.mq=a,this.S(),this.h("isMultiline",b,a))});u.defineProperty(qa,{NJ:"isUnderline"},function(){return this.Pl},function(a){var b=this.Pl;b!==a&&(this.Pl=a,this.na(),this.h("isUnderline",b,a))});u.defineProperty(qa,{LJ:"isStrikethrough"},function(){return this.Ol},function(a){var b=this.Ol;b!==a&&(this.Ol=a,this.na(),this.h("isStrikethrough",b,a))});u.defineProperty(qa,{bF:"wrap"},function(){return this.nm},function(a){var b=this.nm;b!==a&&(this.nm=a,this.S(),this.h("wrap",b,a))});u.defineProperty(qa,{overflow:"overflow"},function(){return this.Ek},function(a){var b=this.Ek;b!==a&&(this.Ek=a,this.S(),this.h("overflow",b,a))});u.defineProperty(qa,{stroke:"stroke"},function(){return this.wc},function(a){var b=this.wc;b!==a&&(a instanceof ga&&a.freeze(),this.wc=a,this.na(),this.h("stroke",b,a))});u.u(qa,{pH:"lineCount"},function(){return this.xe});u.defineProperty(qa,{cz:"editable"},function(){return this.Vp},function(a){var b=this.Vp;b!==a&&(this.Vp=a,this.h("editable",b,a))});u.defineProperty(qa,{NE:"textEditor"},function(){return this.Tr},function(a){var b=this.Tr;b!==a&&(a instanceof HTMLElement||u.k("textEditor must be an HTMLElement"),this.Tr=a,this.h("textEditor",b,a))});u.defineProperty(qa,{dz:"errorFunction"},function(){return this.mf},function(a){var b=this.mf;b!==a&&(null!==a&&u.j(a,"function",qa,"errorFunction"),this.mf=a,this.h("errorFunction",b,a))});function xl(a,b){var c=a.Jg;null!==c&&b.Ft!==c&&(b.font=c,b.Ft=c)}qa.prototype.Mj=function(a,b){if(null!==this.wc&&0!==this.je.length&&null!==this.Jg){var c=this.Ja.width,d=vn(this);a.textAlign=this.Sd;yl(this,a,this.wc,!0,!1);(this.Pl||this.Ol)&&yl(this,a,this.wc,!1,!1);var e=this.ej,f=0,h=!1,k=u.Yb(0,0);this.Gf.bb(k);var l=u.Yb(0,d);this.Gf.bb(l);var m=k.Lj(l);u.v(k);u.v(l);k=b.scale;8>m*k*k&&(h=!0);b.Ig!==a&&(h=!1);!1===b.$v("textGreeking")&&(h=!1);for(var m=this.yj,k=this.zj,l=this.xe,n=0;n<l;n++){var p=e.jf[n],q=e.ve[n];p>c&&(p=c);var f=f+m,r=q,q=a,s=f,t=c,v=d,x=0;h?("start"===this.Sd||"left"===this.Sd?x=0:"end"===this.Sd||"right"===this.Sd?x=t-p:"center"===this.Sd?x=(t-p)/2:u.k("textAlign must be start, end, left, right, or center"),q.fillRect(0+x,s+0.25*v,p,1)):("start"===this.Sd||"left"===this.Sd?x=0:"end"===this.Sd||"right"===this.Sd?x=t:"center"===this.Sd?x=t/2:u.k("textAlign must be start, end, left, right, or center"),q.fillText(r,0+x,s+v-0.25*v),r=v/20|0,0===r&&(r=1),"end"===this.Sd||"right"===this.Sd?x-=p:"center"===this.Sd&&(x-=p/2),this.Pl&&(q.beginPath(),q.lineWidth=r,q.moveTo(0+x,s+v-0.2*v),q.lineTo(0+x+p,s+v-0.2*v),q.stroke()),this.Ol&&(q.beginPath(),q.lineWidth=r,s=s+v-v/2.2|0,0!==r%2&&(s+=0.5),q.moveTo(0+x,s),q.lineTo(0+x+p,s),q.stroke()));f+=d+k}}};qa.prototype.Qo=function(a,b,c,d){this.Cu=a;var e=this.ej;e.reset();var f=0,h=0;if(isNaN(this.za.width)){f=this.je.replace(/\r\n/g,"\n").replace(/\r/g,"\n");if(0===f.length){f=0}else{if(this.jw){for(var k=h=0,l=!1;!l;){var m=f.indexOf("\n",k);-1===m&&(m=f.length,l=!0);k=wn(f.substr(k,m-k).replace(/^\s+|\s+$/g,""),this.Jg);k>h&&(h=k);k=m+1}f=h}else{h=f.indexOf("\n",0),0<=h&&(f=f.substr(0,h)),f=k=wn(f,this.Jg)}}f=Math.min(f,a/this.scale);f=Math.max(8,f)}else{f=this.za.width}null!==this.P&&(f=Math.min(f,this.P.cf.width),f=Math.max(f,this.P.xg.width));h=un(this,f,e);m=h=isNaN(this.za.height)?Math.min(h,b/this.scale):this.za.height;if(0!==e.Pe&&1!==e.ve.length&&this.Ek===sn&&(b=this.Jg,l=this.Ek===sn?xn(b):0,k=this.yj+this.zj,k=Math.max(0,vn(this)+k),m=Math.min(this.wH-1,Math.max(Math.floor(m/k)-1,0)),!(m+1>=e.ve.length))){k=e.ve[m];for(a=Math.max(1,a-l);wn(k,b)>a&&1<k.length;){k=k.substr(0,k.length-1)}k+=nn;a=wn(k,b);e.ve[m]=k;e.ve=e.ve.slice(0,m+1);e.jf[m]=a;e.jf=e.jf.slice(0,m+1);e.xi=e.ve.length;e.Pe=Math.max(e.Pe,a);this.xe=e.xi}if(this.bF===rn||isNaN(this.za.width)){f=e.Pe,isNaN(this.za.width)&&(f=Math.max(8,f))}f=Math.max(c,f);h=Math.max(d,h);bb(this.Gc,f,h);ml(this,0,0,f,h)};qa.prototype.yi=function(a,b,c,d){ql(this,a,b,c,d)};function tn(a,b,c,d){b=b.replace(/^\s+|\s+$/g,""); + var e=0,f=0,h=0,k=a.Jg,f=a.yj+a.zj,l=Math.max(0,vn(a)+f),h=a.Ek===sn?xn(k):0;if(a.xe>=a.ji){return new ia(0,l)}if(a.nm===qn){c.xi=1;f=wn(b,k);if(0===h||f<=d){return c.Pe=f,c.jf.push(c.Pe),c.ve.push(b),new ia(f,l)}var m=yn(b);b=b.substr(m.length);for(var n=yn(b),f=wn(m+n,k);0<n.length&&f<=d;){m+=n,b=b.substr(n.length),n=yn(b),f=wn((m+n).replace(/^\s+|\s+$/g,""),k)}m+=n.replace(/^\s+|\s+$/g,"");for(d=Math.max(1,d-h);wn(m,k)>d&&1<m.length;){m=m.substr(0,m.length-1)}m+=nn;h=wn(m,k);c.jf.push(h);c.Pe=h;c.ve.push(m);return new ia(h,l)}var p=0;0===b.length&&(p=1,c.jf.push(0),c.ve.push(b));for(;0<b.length;){m=yn(b);for(b=b.substr(m.length);wn(m,k)>d;){n=1;f=wn(m.substr(0,n),k);for(h=0;f<=d;){n++,h=f,f=wn(m.substr(0,n),k)}1===n?(c.jf[a.xe+p]=f,e=Math.max(e,f)):(c.jf[a.xe+p]=h,e=Math.max(e,h));n--;1>n&&(n=1);c.ve[a.xe+p]=m.substr(0,n);p++;m=m.substr(n);if(a.xe+p>a.ji){break}}n=yn(b);for(f=wn(m+n,k);0<n.length&&f<=d;){m+=n,b=b.substr(n.length),n=yn(b),f=wn((m+n).replace(/^\s+|\s+$/g,""),k)}m=m.replace(/^\s+|\s+$/g,"");if(""!==m&&(0===n.length?(c.jf.push(f),e=Math.max(e,f)):(h=wn(m,k),c.jf.push(h),e=Math.max(e,h)),c.ve.push(m),p++,a.xe+p>a.ji)){break}}c.xi=Math.min(a.ji,p);c.Pe=Math.max(c.Pe,e);return new ia(c.Pe,l*c.xi)}function yn(a){for(var b=a.length,c=0;c<b&&" "!==a.charAt(c);){c++}for(;c<b&&" "===a.charAt(c);){c++}return c>=b?a:a.substr(0,c)}function wn(a,b){on!==b&&(on=pn.font=b);return pn.measureText(a).width}function vn(a){if(null!==a.xn){return a.xn}var b=a.Jg;on!==b&&(on=pn.font=b);var c=0;void 0!==jn[b]&&5000>kn?c=jn[b]:(c=1.3*pn.measureText("M").width,jn[b]=c,kn++);return a.xn=c}function xn(a){on!==a&&(on=pn.font=a);var b=0;void 0!==ln[a]&&5000>mn?b=ln[a]:(b=pn.measureText(nn).width,ln[a]=b,mn++);return b}function un(a,b,c){var d=a.je.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),e=a.yj+a.zj,e=Math.max(0,vn(a)+e);if(0===d.length){return c.Pe=0,a.xe=1,e}if(!a.jw){var f=d.indexOf("\n",0);0<=f&&(d=d.substr(0,f))}for(var f=0,h=a.xe=0,k=-1,l=!1;!l;){k=d.indexOf("\n",h),-1===k&&(k=d.length,l=!0),h<=k&&(h=d.substr(h,k-h),a.nm!==qn?(c.xi=0,h=tn(a,h,c,b),f+=h.height,a.xe+=c.xi):(tn(a,h,c,b),f+=e,a.xe++),a.xe===a.ji&&(l=!0)),h=k+1}return a.Iu=f}u.defineProperty(qa,{kA:"textValidation"},function(){return this.Hk},function(a){var b=this.Hk;b!==a&&(null!==a&&u.j(a,"function",qa,"textValidation"),this.Hk=a,this.h("textValidation",b,a))});u.defineProperty(qa,{wK:"spacingAbove"},function(){return this.yj},function(a){var b=this.yj;b!==a&&(this.yj=a,this.h("spacingAbove",b,a))});u.defineProperty(qa,{xK:"spacingBelow"},function(){return this.zj},function(a){var b=this.zj;b!==a&&(this.zj=a,this.h("spacingBelow",b,a))});u.defineProperty(qa,{wH:"maxLines"},function(){return this.ji},function(a){var b=this.ji;b!==a&&(a=Math.floor(a),0>=a&&u.xa(a,"> 0",qa,"maxLines"),this.ji=a,this.h("maxLines",b,a),this.S())});u.u(qa,{$J:"metrics"},function(){return this.ej});function hn(){this.Pe=this.xi=0;this.jf=[];this.ve=[]}hn.prototype.reset=function(){this.Pe=this.xi=0;this.jf=[];this.ve=[]};hn.prototype.ss=function(a){this.xi=a.xi;this.Pe=a.Pe;this.jf=u.Pk(a.jf);this.ve=u.Pk(a.ve)};u.u(hn,{eJ:"arrSize"},function(){return this.jf});u.u(hn,{fJ:"arrText"},function(){return this.ve});u.u(hn,{ZJ:"maxLineWidth"},function(){return this.Pe});function Ri(){T.call(this);this.Ne=null;this.Nr="";this.xj=(new z(NaN,NaN,NaN,NaN)).freeze();this.Bn=cd;this.Sr=this.Aj=this.mf=null;this.Tx=!1;this.ao=null;this.JB=0}u.Ha(Ri,T);u.fa("Picture",Ri);var zn=new pa,An=0,Mi=[];function Bn(){var a=Mi;if(0===a.length){for(var b=window.document.getElementsByTagName("canvas"),c=b.length,d=0;d<c;d++){var e=b[d];e.parentElement&&e.parentElement.Y&&a.push(e.parentElement.Y)}}return a}var Cn;Ri.clearCache=Cn=function(a){void 0===a&&(a="");u.j(a,"string",Ri,"clearCache:url");""!==a?zn[a]&&(delete zn[a],An--):(zn=new pa,An=0)};Ri.prototype.cloneProtected=function(a){T.prototype.cloneProtected.call(this,a);a.element=this.Ne;a.Nr=this.Nr;a.xj.assign(this.xj);a.Bn=this.Bn;a.mf=this.mf;a.Aj=this.Aj;a.ao=this.ao};Ri.prototype.toString=function(){return"Picture("+this.source+")#"+u.Uc(this)};u.defineProperty(Ri,{element:"element"},function(){return this.Ne},function(a){var b=this.Ne;b!==a&&(null===a||a instanceof HTMLImageElement||a instanceof HTMLVideoElement||a instanceof HTMLCanvasElement||u.k("Picture.element must be an instance of Image, Canvas, or Video, not: "+a),this.Tx=a instanceof HTMLCanvasElement,this.Ne=a,null!==a&&(!0===a.complete||void 0===a.complete?(a.pu instanceof Event&&null!==this.mf&&this.mf(this,a.pu),!0===a.Vx&&null!==this.Aj&&this.Aj(this,null),a.Vx=!0,this.za.I()||(uj(this,!1),this.S())):a.iB||(a.addEventListener("load",function(b){Dn(a,b)}),a.addEventListener("error",function(b){En(a,b)}),a.iB=!0)),this.h("element",b,a),this.na())});u.defineProperty(Ri,{source:"source"},function(){return this.Nr},function(a){var b=this.Nr;if(b!==a){u.j(a,"string",Ri,"source");this.Nr=a;var c=zn,d=this.g;if(void 0!==c[a]){var e=c[a].oo[0].source}else{30<An&&(Cn(),c=zn);e=u.createElement("img"); + e.addEventListener("load",function(a){Dn(e,a)});e.addEventListener("error",function(a){En(e,a)});e.iB=!0;e.src=a;var f=this.ao;null!==f&&(e.crossOrigin=f(this));c[a]=new Fn(e);An++}null!==d&&vk(d,this);this.element=e;null!==d&&uk(d,this);this.na();this.h("source",b,a)}});function Dn(a,b){a.Vx=!0;a.pu=!1;for(var c=null,d=Bn(),e=d.length,f=0;f<e;f++){var h=d[f],k=h.Vn.ua(a.src);if(null!==k){e=k.length;for(f=0;f<e;f++){c=k[f],c.za.I()||(h.VB.add(c),h.ee()),null!==c.Aj&&c.Aj(c,b)}h.na()}}}function En(a,b){a.pu=b;for(var c=null,d=Bn(),e=d.length,f=0;f<e;f++){if(c=d[f].Vn.ua(a.src),null!==c){for(var e=c.length,h=u.hb(),f=0;f<e;f++){h.push(c[f])}for(f=0;f<e;f++){c=h[f],null!==c.mf&&c.mf(c,b)}u.sa(h)}}}u.defineProperty(Ri,{vK:"sourceCrossOrigin"},function(){return this.ao},function(a){if(this.ao!==a&&(null!==a&&u.j(a,"function",Ri,"sourceCrossOrigin"),this.ao=a,null!==this.element)){var b=this.element.src;null===a&&"string"===typeof b?this.element.crossOrigin=null:null!==a&&(this.element.crossOrigin=a(this))}});u.defineProperty(Ri,{Mi:"sourceRect"},function(){return this.xj},function(a){var b=this.xj;b.L(a)||(u.C(a,z,Ri,"sourceRect"),this.xj=a=a.Z(),this.na(),this.h("sourceRect",b,a))});u.defineProperty(Ri,{SG:"imageStretch"},function(){return this.Bn},function(a){var b=this.Bn;b!==a&&(u.rb(a,T,Ri,"imageStretch"),this.Bn=a,this.na(),this.h("imageStretch",b,a))});u.defineProperty(Ri,{dz:"errorFunction"},function(){return this.mf},function(a){var b=this.mf;b!==a&&(null!==a&&u.j(a,"function",Ri,"errorFunction"),this.mf=a,this.h("errorFunction",b,a))});u.defineProperty(Ri,{DK:"successFunction"},function(){return this.Aj},function(a){var b=this.Aj;b!==a&&(null!==a&&u.j(a,"function",Ri,"successFunction"),this.Aj=a,this.h("successFunction",b,a))});Ri.prototype.Mj=function(a,b){var c=this.Ne;if(null!==c){var d=c.src;null!==d&&""!==d||u.k("Element has no source attribute: "+c);if(!(c.pu instanceof Event)&&!0===c.Vx){var d=this.Ja,e=0,f=0,h=this.Tx,k=h?+c.width:c.naturalWidth,h=h?+c.height:c.naturalHeight;void 0===k&&c.videoWidth&&(k=c.videoWidth);void 0===h&&c.videoHeight&&(h=c.videoHeight);k=k||d.width;h=h||d.height;if(0!==k&&0!==h){var l=k,m=h;this.Mi.I()&&(e=this.xj.x,f=this.xj.y,k=this.xj.width,h=this.xj.height);var n=k,p=h,q=this.Bn;switch(q){case qh:if(this.Mi.I()){break}e+=Math.max((n-d.width)/2,0);f+=Math.max((p-d.height)/2,0);k=Math.min(d.width,n);h=Math.min(d.height,p);break;case cd:n=d.width;p=d.height;break;case sh:case th:var r=0;q===sh?(r=Math.min(d.height/p,d.width/n),n*=r,p*=r):q===th&&(r=Math.max(d.height/p,d.width/n),n*=r,p*=r,e+=(n-d.width)/2,f+=(p-d.height)/2,k*=1/(n/d.width),h*=1/(p/d.height),n=d.width,p=d.height)}this.JB=k*h;var q=this.Ii()*b.scale,s=this.JB/(n*q*p*q),r=zn[this.source],q=null;if(void 0!==r&&16<s){2>r.oo.length&&(Gn(r,4,l,m),Gn(r,16,l,m));for(var l=r.oo,m=l.length,q=l[0],t=0;t<m;t++){if(l[t].$o*l[t].$o<s){q=l[t]}else{break}}}if(!b.sn){if(null===this.Sr){if(null===this.Ne){this.Sr=!1}else{l=u.createElement("canvas").getContext("2d");l.drawImage(this.Ne,0,0);try{l.getImageData(0,0,1,1),this.Sr=!1}catch(v){this.Sr=!0}}}if(this.Sr){return}}if(b.$v("pictureRatioOptimization")&&!b.Ux&&void 0!==r&&null!==q&&1!==q.$o){a.save();r=q.$o;try{a.drawImage(q.source,e/r,f/r,Math.min(q.source.width,k/r),Math.min(q.source.height,h/r),Math.max((d.width-n)/2,0),Math.max((d.height-p)/2,0),Math.min(d.width,n),Math.min(d.height,p))}catch(x){}a.restore()}else{try{a.drawImage(c,e,f,k,h,Math.max((d.width-n)/2,0),Math.max((d.height-p)/2,0),Math.min(d.width,n),Math.min(d.height,p))}catch(A){}}}}}};u.u(Ri,{Ja:"naturalBounds"},function(){return this.Gc});Ri.prototype.Qo=function(a,b,c,d){var e=this.za,f=pl(this,!0),h=this.Ne,k=this.Tx;if(k||!this.ay&&h&&h.complete){this.ay=!0}null===h&&(isFinite(a)||(a=0),isFinite(b)||(b=0));isFinite(e.width)||f===cd||f===fl?(isFinite(a)||(a=this.Mi.I()?this.Mi.width:k?+h.width:h.naturalWidth),c=0):null!==h&&!1!==this.ay&&(a=this.Mi.I()?this.Mi.width:k?+h.width:h.naturalWidth);isFinite(e.height)||f===cd||f===el?(isFinite(b)||(b=this.Mi.I()?this.Mi.height:k?+h.height:h.naturalHeight),d=0):null!==h&&!1!==this.ay&&(b=this.Mi.I()?this.Mi.height:k?+h.height:h.naturalHeight);isFinite(e.width)&&(a=e.width);isFinite(e.height)&&(b=e.height);e=this.cf;f=this.xg;c=Math.max(c,f.width);d=Math.max(d,f.height);a=Math.min(e.width,a);b=Math.min(e.height,b);a=Math.max(c,a);b=Math.max(d,b);null===h||h.complete||(isFinite(a)||(a=0),isFinite(b)||(b=0));bb(this.Gc,a,b);ml(this,0,0,a,b)};Ri.prototype.yi=function(a,b,c,d){ql(this,a,b,c,d)};function Fn(a){this.oo=[new Hn(a,1)]}function Gn(a,b,c,d){var e=new oa(null),f=e.getContext("2d"),h=1/b;e.width=c/b;e.height=d/b;b=new Hn(e.Fd,b);c=a.oo[a.oo.length-1];f.setTransform(h*c.$o,0,0,h*c.$o,0,0);f.drawImage(c.source,0,0);a.oo.push(b)}function Hn(a,b){this.source=a;this.$o=b}function ka(){this.o=new $c;this.Tb=null}g=ka.prototype;g.reset=function(){this.o=new $c;this.Tb=null};function M(a,b,c,d,e,f){null===a.o&&u.k("StreamGeometryContext has been closed");void 0!==e&&!0===e?(null===a.Tb&&u.k("Need to call beginFigure first"),d=new Jd(yd),d.F=b,d.G=c,a.Tb.Ga.add(d)):(a.Tb=new bd,a.Tb.va=b,a.Tb.wa=c,a.Tb.Os=d,a.o.ub.add(a.Tb)); + void 0!==f&&(a.Tb.Gn=f)}function P(a){null===a.o&&u.k("StreamGeometryContext has been closed");null===a.Tb&&u.k("Need to call beginFigure first");var b=a.Tb.Ga.length;0<b&&a.Tb.Ga.ja(b-1).close()}function vd(a){null===a.o&&u.k("StreamGeometryContext has been closed");null===a.Tb&&u.k("Need to call beginFigure first");0<a.Tb.Ga.length&&(a.Tb.Os=!0)}g.ab=function(a){null===this.o&&u.k("StreamGeometryContext has been closed");null===this.Tb&&u.k("Need to call beginFigure first");this.Tb.il=a};g.moveTo=function(a,b,c){void 0===c&&(c=!1);null===this.o&&u.k("StreamGeometryContext has been closed");null===this.Tb&&u.k("Need to call beginFigure first");var d=new Jd(yd);d.F=a;d.G=b;c&&d.close();this.Tb.Ga.add(d)};g.lineTo=function(a,b,c){void 0===c&&(c=!1);null===this.o&&u.k("StreamGeometryContext has been closed");null===this.Tb&&u.k("Need to call beginFigure first");var d=new Jd(pd);d.F=a;d.G=b;c&&d.close();this.Tb.Ga.add(d)};function O(a,b,c,d,e,f,h,k){void 0===k&&(k=!1);null===a.o&&u.k("StreamGeometryContext has been closed");null===a.Tb&&u.k("Need to call beginFigure first");var l=new Jd(zd);l.Rb=b;l.jc=c;l.ff=d;l.gf=e;l.F=f;l.G=h;k&&l.close();a.Tb.Ga.add(l)}function td(a,b,c,d,e){var f;void 0===f&&(f=!1);null===a.o&&u.k("StreamGeometryContext has been closed");null===a.Tb&&u.k("Need to call beginFigure first");var h=new Jd(Ad);h.Rb=b;h.jc=c;h.F=d;h.G=e;f&&h.close();a.Tb.Ga.add(h)}g.arcTo=function(a,b,c,d,e,f,h){void 0===f&&(f=0);void 0===h&&(h=!1);null===this.o&&u.k("StreamGeometryContext has been closed");null===this.Tb&&u.k("Need to call beginFigure first");var k=new Jd(Bd);k.Ke=a;k.Rf=b;k.ma=c;k.ya=d;k.radiusX=e;k.radiusY=0!==f?f:e;h&&k.close();this.Tb.Ga.add(k)};function ud(a,b,c,d,e,f,h,k){var l;void 0===l&&(l=!1);null===a.o&&u.k("StreamGeometryContext has been closed");null===a.Tb&&u.k("Need to call beginFigure first");b=new Jd(Gd,h,k,b,c,d,e,f);l&&b.close();a.Tb.Ga.add(b)}K.makeGeometry=function(a,b,c){var d=a.za,e=d.width,d=d.height;void 0!==b&&!isNaN(b)&&isFinite(b)&&(e=b);void 0!==c&&!isNaN(c)&&isFinite(c)&&(d=c);isFinite(e)||(e=100);isFinite(d)||(d=100);b=null;"None"!==a.lp?b=K.Ri[a.lp]:"None"!==a.fz?b=K.Ri[a.fz]:(c=K.sg[a.Fb],"string"===typeof c&&(c=K.sg[c]),void 0===c&&u.k("Unknown Shape.figure: "+a.Fb),b=c(a,e,d),b.Fn=e,b.En=d);null===b&&(c=K.sg.Rectangle,"function"===typeof c&&(b=c(a,e,d)));return b};K.Bi=function(a,b,c,d,e,f,h,k,l,m,n,p,q,r){var s=1-l;a=a*s+c*l;b=b*s+d*l;c=c*s+e*l;d=d*s+f*l;e=e*s+h*l;f=f*s+k*l;k=a*s+c*l;h=b*s+d*l;c=c*s+e*l;d=d*s+f*l;m.x=a;m.y=b;n.x=k;n.y=h;p.x=k*s+c*l;p.y=h*s+d*l;q.x=c;q.y=d;r.x=e;r.y=f};K.wo=function(a){a=K.Am(a);var b=u.hb();b[0]=a[0];for(var c=1,d=1;d<a.length;){b[c]=a[d],b[c+1]=a[d],b[c+2]=a[d+1],d+=2,c+=3}u.sa(a);return b};K.Am=function(a){var b=K.Qk(a),c=u.hb(),d=Math.floor(b.length/2),e=b.length-1;a=0===a%2?2:1;for(var f=0;f<e;f++){var h=b[f],k=b[f+1],l=b[(d+f-1)%e],m=b[(d+f+a)%e];c[2*f]=h;c[2*f+1]=K.al(h.x,h.y,l.x,l.y,k.x,k.y,m.x,m.y,new w)}c[c.length]=c[0];u.sa(b);return c};K.al=function(a,b,c,d,e,f,h,k,l){c=a-c;var m=e-h,n=h=0;0===c||0===m?0===c?(k=(f-k)/m,h=a,n=k*h+(f-k*e)):(d=(b-d)/c,h=e,n=d*h+(b-d*a)):(d=(b-d)/c,k=(f-k)/m,a=b-d*a,h=(f-k*e-a)/(d-k),n=d*h+a);l.m(h,n);return l};K.Qk=function(a){for(var b=u.hb(),c=1.5*Math.PI,d=0,e=0;e<a;e++){d=2*Math.PI/a*e+c,b[e]=new w(0.5+0.5*Math.cos(d),0.5+0.5*Math.sin(d))}b.push(b[0]);return b};K.tA=(new L(0.156,0.156)).La();K.uA=(new L(0.844,0.844)).La();K.sg={None:"Rectangle",Rectangle:function(a,b,c){a=new $c;a.type=md;a.va=0;a.wa=0;a.F=b;a.G=c;return a},Square:function(a,b,c){a=new $c;a.Dd=sh;a.type=md;a.va=0;a.wa=0;a.F=Math.min(b,c);a.G=Math.min(b,c);return a},Ellipse:function(a,b,c){a=new $c;a.type=nd;a.va=0;a.wa=0;a.F=b;a.G=c;a.A=K.tA;a.B=K.uA;return a},Circle:function(a,b,c){a=new $c;a.Dd=sh;a.type=nd;a.va=0;a.wa=0;a.F=Math.min(b,c);a.G=Math.min(b,c);a.A=K.tA;a.B=K.uA;return a},Connector:"Ellipse",TriangleRight:function(a,b,c){a=new $c;var d=new bd,e=new Jd;e.F=b;e.G=0.5*c;d.Ga.add(e);b=new Jd;b.F=0;b.G=c;d.Ga.add(b.close());a.ub.add(d);a.A=new L(0,0.25);a.B=new L(0.5,0.75);return a},TriangleDown:function(a,b,c){a=new $c;var d=new bd,e=new Jd;e.F=b;e.G=0;d.Ga.add(e);e=new Jd;e.F=0.5*b;e.G=c;d.Ga.add(e.close());a.ub.add(d);a.A=new L(0.25,0);a.B=new L(0.75,0.5);return a},TriangleLeft:function(a,b,c){a=new $c;var d=new bd;d.va=b;d.wa=c;var e=new Jd;e.F=0;e.G=0.5*c;d.Ga.add(e);c=new Jd;c.F=b;c.G=0;d.Ga.add(c.close());a.ub.add(d);a.A=new L(0.5,0.25);a.B=new L(1,0.75);return a},TriangleUp:function(a,b,c){a=new $c;var d=new bd;d.va=b;d.wa=c;var e=new Jd;e.F=0;e.G=c;d.Ga.add(e);c=new Jd;c.F=0.5*b;c.G=0;d.Ga.add(c.close());a.ub.add(d);a.A=new L(0.25,0.5);a.B=new L(0.75,1);return a},Line1:function(a,b,c){a=new $c;a.type=dd;a.va=0;a.wa=0;a.F=b;a.G=c;return a},Line2:function(a,b,c){a=new $c;a.type=dd;a.va=b;a.wa=0;a.F=0;a.G=c;return a},MinusLine:"LineH",LineH:function(a,b,c){a=new $c;a.type=dd;a.va=0;a.wa=c/2;a.F=b;a.G=c/2;return a},LineV:function(a,b,c){a=new $c;a.type=dd;a.va=b/2;a.wa=0;a.F=b/2;a.G=c;return a},BarH:"Rectangle",BarV:"Rectangle",Curve1:function(a,b,c){var d=K.ta; + a=u.p();M(a,0,0,!1);O(a,d*b,0,1*b,(1-d)*c,b,c);b=a.o;u.q(a);return b},Curve2:function(a,b,c){var d=K.ta;a=u.p();M(a,0,0,!1);O(a,0,d*c,(1-d)*b,c,b,c);b=a.o;u.q(a);return b},Curve3:function(a,b,c){var d=K.ta;a=u.p();M(a,1*b,0,!1);O(a,1*b,d*c,d*b,1*c,0,1*c);b=a.o;u.q(a);return b},Curve4:function(a,b,c){var d=K.ta;a=u.p();M(a,1*b,0,!1);O(a,(1-d)*b,0,0,(1-d)*c,0,1*c);b=a.o;u.q(a);return b},Alternative:"Triangle",Merge:"Triangle",Triangle:function(a,b,c){a=u.p();M(a,0.5*b,0*c,!0);a.lineTo(0*b,1*c);a.lineTo(1*b,1*c,!0);b=a.o;b.A=new L(0.25,0.5);b.B=new L(0.75,1);u.q(a);return b},Decision:"Diamond",Diamond:function(a,b,c){a=u.p();M(a,0.5*b,0,!0);a.lineTo(0,0.5*c);a.lineTo(0.5*b,1*c);a.lineTo(1*b,0.5*c,!0);b=a.o;b.A=new L(0.25,0.25);b.B=new L(0.75,0.75);u.q(a);return b},Pentagon:function(a,b,c){var d=K.Qk(5);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;5>e;e++){a.lineTo(d[e].x*b,d[e].y*c)}u.sa(d);P(a);b=a.o;b.A=new L(0.2,0.22);b.B=new L(0.8,0.9);u.q(a);return b},DataTransmission:"Hexagon",Hexagon:function(a,b,c){var d=K.Qk(6);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;6>e;e++){a.lineTo(d[e].x*b,d[e].y*c)}u.sa(d);P(a);b=a.o;b.A=new L(0.07,0.25);b.B=new L(0.93,0.75);u.q(a);return b},Heptagon:function(a,b,c){var d=K.Qk(7);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;7>e;e++){a.lineTo(d[e].x*b,d[e].y*c)}u.sa(d);P(a);b=a.o;b.A=new L(0.2,0.15);b.B=new L(0.8,0.85);u.q(a);return b},Octagon:function(a,b,c){var d=K.Qk(8);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;8>e;e++){a.lineTo(d[e].x*b,d[e].y*c)}u.sa(d);P(a);b=a.o;b.A=new L(0.15,0.15);b.B=new L(0.85,0.85);u.q(a);return b},Nonagon:function(a,b,c){var d=K.Qk(9);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;9>e;e++){a.lineTo(d[e].x*b,d[e].y*c)}u.sa(d);P(a);b=a.o;b.A=new L(0.17,0.13);b.B=new L(0.82,0.82);u.q(a);return b},Decagon:function(a,b,c){var d=K.Qk(10);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;10>e;e++){a.lineTo(d[e].x*b,d[e].y*c)}u.sa(d);P(a);b=a.o;b.A=new L(0.16,0.16);b.B=new L(0.84,0.84);u.q(a);return b},Dodecagon:function(a,b,c){var d=K.Qk(12);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;12>e;e++){a.lineTo(d[e].x*b,d[e].y*c)}u.sa(d);P(a);b=a.o;b.A=new L(0.16,0.16);b.B=new L(0.84,0.84);u.q(a);return b},FivePointedStar:function(a,b,c){var d=K.Am(5);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;10>e;e++){a.lineTo(d[e].x*b,d[e].y*c)}u.sa(d);P(a);b=a.o;b.A=new L(0.312,0.383);b.B=new L(0.693,0.765);u.q(a);return b},SixPointedStar:function(a,b,c){var d=K.Am(6);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;12>e;e++){a.lineTo(d[e].x*b,d[e].y*c)}u.sa(d);P(a);b=a.o;b.A=new L(0.17,0.251);b.B=new L(0.833,0.755);u.q(a);return b},SevenPointedStar:function(a,b,c){var d=K.Am(7);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;14>e;e++){a.lineTo(d[e].x*b,d[e].y*c)}u.sa(d);P(a);b=a.o;b.A=new L(0.363,0.361);b.B=new L(0.641,0.709);u.q(a);return b},EightPointedStar:function(a,b,c){var d=K.Am(8);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;16>e;e++){a.lineTo(d[e].x*b,d[e].y*c)}u.sa(d);P(a);b=a.o;b.A=new L(0.252,0.255);b.B=new L(0.75,0.75);u.q(a);return b},NinePointedStar:function(a,b,c){var d=K.Am(9);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;18>e;e++){a.lineTo(d[e].x*b,d[e].y*c)}u.sa(d);P(a);b=a.o;b.A=new L(0.355,0.361);b.B=new L(0.645,0.651);u.q(a);return b},TenPointedStar:function(a,b,c){var d=K.Am(10);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;20>e;e++){a.lineTo(d[e].x*b,d[e].y*c)}u.sa(d);P(a);b=a.o;b.A=new L(0.281,0.261);b.B=new L(0.723,0.748);u.q(a);return b},FivePointedBurst:function(a,b,c){var d=K.wo(5);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;e<d.length;e+=3){O(a,d[e].x*b,d[e].y*c,d[e+1].x*b,d[e+1].y*c,d[e+2].x*b,d[e+2].y*c)}u.sa(d);P(a);b=a.o;b.A=new L(0.312,0.383);b.B=new L(0.693,0.765);u.q(a);return b},SixPointedBurst:function(a,b,c){var d=K.wo(6);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;e<d.length;e+=3){O(a,d[e].x*b,d[e].y*c,d[e+1].x*b,d[e+1].y*c,d[e+2].x*b,d[e+2].y*c)}u.sa(d);P(a);b=a.o;b.A=new L(0.17,0.251);b.B=new L(0.833,0.755);u.q(a);return b},SevenPointedBurst:function(a,b,c){var d=K.wo(7);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;e<d.length;e+=3){O(a,d[e].x*b,d[e].y*c,d[e+1].x*b,d[e+1].y*c,d[e+2].x*b,d[e+2].y*c)}u.sa(d);P(a);b=a.o;b.A=new L(0.363,0.361);b.B=new L(0.641,0.709);u.q(a);return b},EightPointedBurst:function(a,b,c){var d=K.wo(8);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;e<d.length;e+=3){O(a,d[e].x*b,d[e].y*c,d[e+1].x*b,d[e+1].y*c,d[e+2].x*b,d[e+2].y*c)}u.sa(d);P(a);b=a.o;b.A=new L(0.252,0.255);b.B=new L(0.75,0.75);u.q(a);return b},NinePointedBurst:function(a,b,c){var d=K.wo(9);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;e<d.length;e+=3){O(a,d[e].x*b,d[e].y*c,d[e+1].x*b,d[e+1].y*c,d[e+2].x*b,d[e+2].y*c)}u.sa(d);P(a);b=a.o;b.A=new L(0.355,0.361);b.B=new L(0.645,0.651);u.q(a);return b},TenPointedBurst:function(a,b,c){var d=K.wo(10);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;e<d.length;e+=3){O(a,d[e].x*b,d[e].y*c,d[e+1].x*b,d[e+1].y*c,d[e+2].x*b,d[e+2].y*c)}u.sa(d);P(a);b=a.o;b.A=new L(0.281,0.261);b.B=new L(0.723,0.748);u.q(a); + return b},Cloud:function(a,b,c){a=u.p();M(a,0.08034461*b,0.1944299*c,!0);O(a,-0.09239631*b,0.07836421*c,0.1406031*b,-0.0542823*c,0.2008615*b,0.05349299*c);O(a,0.2450511*b,-0.00697547*c,0.3776197*b,-0.01112067*c,0.4338609*b,0.074219*c);O(a,0.4539471*b,0,0.6066018*b,-0.02526587*c,0.6558228*b,0.07004196*c);O(a,0.6914277*b,-0.01904177*c,0.8921095*b,-0.01220843*c,0.8921095*b,0.08370865*c);O(a,1.036446*b,0.04105738*c,1.020377*b,0.3022052*c,0.9147671*b,0.3194596*c);O(a,1.04448*b,0.360238*c,0.992256*b,0.5219009*c,0.9082935*b,0.562044*c);O(a,1.032337*b,0.5771781*c,1.018411*b,0.8120651*c,0.9212406*b,0.8217117*c);O(a,1.028411*b,0.9571472*c,0.8556702*b,1.052487*c,0.7592566*b,0.9156953*c);O(a,0.7431877*b,1.009325*c,0.5624123*b,1.021761*c,0.5101666*b,0.9310455*c);O(a,0.4820677*b,1.031761*c,0.3030112*b,1.002796*c,0.2609328*b,0.9344623*c);O(a,0.2329994*b,1.01518*c,0.03213784*b,1.01518*c,0.08034461*b,0.870098*c);O(a,-0.02812061*b,0.9032597*c,-0.01205169*b,0.6835638*c,0.06829292*b,0.6545475*c);O(a,-0.01812061*b,0.6089503*c,-0.00606892*b,0.4555777*c,0.06427569*b,0.4265613*c);O(a,-0.01606892*b,0.3892545*c,-0.01205169*b,0.1944299*c,0.08034461*b,0.1944299*c);P(a);b=a.o;b.A=new L(0.1,0.1);b.B=new L(0.9,0.9);u.q(a);return b},Gate:"Crescent",Crescent:function(a,b,c){a=u.p();M(a,0,0,!0);O(a,1*b,0,1*b,1*c,0,1*c);O(a,0.5*b,0.75*c,0.5*b,0.25*c,0,0);P(a);b=a.o;b.A=new L(0.511,0.19);b.B=new L(0.776,0.76);u.q(a);return b},FramedRectangle:function(a,b,c){var d=u.p(),e=a?a.vc:NaN;a=a?a.ft:NaN;isNaN(e)&&(e=0.1);isNaN(a)&&(a=0.1);M(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c,!0);M(d,e*b,a*c,!1,!0);d.lineTo(e*b,(1-a)*c);d.lineTo((1-e)*b,(1-a)*c);d.lineTo((1-e)*b,a*c,!0);b=d.o;b.A=new L(e,a);b.B=new L(1-e,1-a);u.q(d);return b},Delay:"HalfEllipse",HalfEllipse:function(a,b,c){var d=K.ta;a=u.p();M(a,0,0,!0);O(a,d*b,0,1*b,(0.5-d/2)*c,1*b,0.5*c);O(a,1*b,(0.5+d/2)*c,d*b,1*c,0,1*c);P(a);b=a.o;b.A=new L(0,0.2);b.B=new L(0.75,0.8);u.q(a);return b},Heart:function(a,b,c){a=u.p();M(a,0.5*b,1*c,!0);O(a,0.1*b,0.8*c,0,0.5*c,0*b,0.3*c);O(a,0*b,0,0.45*b,0,0.5*b,0.3*c);O(a,0.55*b,0,1*b,0,1*b,0.3*c);O(a,b,0.5*c,0.9*b,0.8*c,0.5*b,1*c);P(a);b=a.o;b.A=new L(0.15,0.29);b.B=new L(0.86,0.68);u.q(a);return b},Spade:function(a,b,c){a=u.p();M(a,0.5*b,0,!0);a.lineTo(0.51*b,0.01*c);O(a,0.6*b,0.2*c,b,0.25*c,b,0.5*c);O(a,b,0.8*c,0.6*b,0.8*c,0.55*b,0.7*c);O(a,0.5*b,0.75*c,0.55*b,0.95*c,0.75*b,c);a.lineTo(0.25*b,c);O(a,0.45*b,0.95*c,0.5*b,0.75*c,0.45*b,0.7*c);O(a,0.4*b,0.8*c,0,0.8*c,0,0.5*c);O(a,0,0.25*c,0.4*b,0.2*c,0.49*b,0.01*c);P(a);b=a.o;b.A=new L(0.19,0.26);b.B=new L(0.8,0.68);u.q(a);return b},Club:function(a,b,c){a=u.p();M(a,0.4*b,0.6*c,!0);O(a,0.5*b,0.75*c,0.45*b,0.95*c,0.15*b,1*c);a.lineTo(0.85*b,c);O(a,0.55*b,0.95*c,0.5*b,0.75*c,0.6*b,0.6*c);var d=0.2,e=0.3,f=0,h=4*(Math.SQRT2-1)/3*d;O(a,(0.5-d+e)*b,(0.5+h+f)*c,(0.5-h+e)*b,(0.5+d+f)*c,(0.5+e)*b,(0.5+d+f)*c);O(a,(0.5+h+e)*b,(0.5+d+f)*c,(0.5+d+e)*b,(0.5+h+f)*c,(0.5+d+e)*b,(0.5+f)*c);O(a,(0.5+d+e)*b,(0.5-h+f)*c,(0.5+h+e)*b,(0.5-d+f)*c,(0.5+e)*b,(0.5-d+f)*c);O(a,(0.5-h+e)*b,(0.5-d+f)*c,(0.5-d+e+0.05)*b,(0.5-h+f-0.02)*c,0.65*b,0.36771243*c);d=0.2;e=0;f=-0.3;h=4*(Math.SQRT2-1)/3*d;O(a,(0.5+h+e)*b,(0.5+d+f)*c,(0.5+d+e)*b,(0.5+h+f)*c,(0.5+d+e)*b,(0.5+f)*c);O(a,(0.5+d+e)*b,(0.5-h+f)*c,(0.5+h+e)*b,(0.5-d+f)*c,(0.5+e)*b,(0.5-d+f)*c);O(a,(0.5-h+e)*b,(0.5-d+f)*c,(0.5-d+e)*b,(0.5-h+f)*c,(0.5-d+e)*b,(0.5+f)*c);O(a,(0.5-d+e)*b,(0.5+h+f)*c,(0.5-h+e)*b,(0.5+d+f)*c,0.35*b,0.36771243*c);d=0.2;e=-0.3;f=0;h=4*(Math.SQRT2-1)/3*d;O(a,(0.5+d+e-0.05)*b,(0.5-h+f-0.02)*c,(0.5+h+e)*b,(0.5-d+f)*c,(0.5+e)*b,(0.5-d+f)*c);O(a,(0.5-h+e)*b,(0.5-d+f)*c,(0.5-d+e)*b,(0.5-h+f)*c,(0.5-d+e)*b,(0.5+f)*c);O(a,(0.5-d+e)*b,(0.5+h+f)*c,(0.5-h+e)*b,(0.5+d+f)*c,(0.5+e)*b,(0.5+d+f)*c);O(a,(0.5+h+e)*b,(0.5+d+f)*c,(0.5+d+e)*b,(0.5+h+f)*c,0.4*b,0.6*c);P(a);b=a.o;b.A=new L(0.06,0.39);b.B=new L(0.93,0.58);u.q(a);return b},Ring:function(a,b,c){a=u.p();var d=4*(Math.SQRT2-1)/3*0.5;M(a,b,0.5*c,!0);O(a,b,(0.5-d)*c,(0.5+d)*b,0,0.5*b,0);O(a,(0.5-d)*b,0,0,(0.5-d)*c,0,0.5*c);O(a,0,(0.5+d)*c,(0.5-d)*b,c,0.5*b,c);O(a,(0.5+d)*b,c,b,(0.5+d)*c,b,0.5*c);d=4*(Math.SQRT2-1)/3*0.4;M(a,0.5*b,0.1*c,!0,!0);O(a,(0.5+d)*b,0.1*c,0.9*b,(0.5-d)*c,0.9*b,0.5*c);O(a,0.9*b,(0.5+d)*c,(0.5+d)*b,0.9*c,0.5*b,0.9*c);O(a,(0.5-d)*b,0.9*c,0.1*b,(0.5+d)*c,0.1*b,0.5*c);O(a,0.1*b,(0.5-d)*c,(0.5-d)*b,0.1*c,0.5*b,0.1*c);b=a.o;b.A=new L(0.146,0.146);b.B=new L(0.853,0.853);b.Dd=sh;u.q(a);return b},YinYang:function(a,b,c){var d=0.5;a=u.p();d=0.5;M(a,0.5*b,0,!0);a.arcTo(270,180,0.5*b,0.5*b,0.5*b);O(a,1*b,d*c,0,d*c,d*b,0,!0);var d=0.1,e=0.25;M(a,(0.5+d)*b,e*c,!0,!0);a.arcTo(0,-360,0.5*b,c*e,d*b);P(a);M(a,0.5*b,0,!1);a.arcTo(270,-180,0.5*b,0.5*b,0.5*b);a.ab(!1);e=0.75;M(a,(0.5+d)*b,e*c,!0);a.arcTo(0,360,0.5*b,c*e,d*b);P(a);b=a.o;b.Dd=sh;u.q(a);return b},Peace:function(a,b,c){a=u.p();var d=4*(Math.SQRT2-1)/3*0.5;M(a,b,0.5*c,!0);O(a,b,(0.5-d)*c,(0.5+d)*b,0,0.5*b,0);O(a,(0.5-d)*b,0,0,(0.5-d)*c,0,0.5*c);O(a,0,(0.5+d)*c,(0.5-d)*b,c,0.5*b,c);O(a,(0.5+d)*b,c,b,(0.5+d)*c,b,0.5*c);d=4*(Math.SQRT2-1)/3*0.4;M(a,0.5*b,0.1*c,!0,!0); + O(a,(0.5+d)*b,0.1*c,0.9*b,(0.5-d)*c,0.9*b,0.5*c);O(a,0.9*b,(0.5+d)*c,(0.5+d)*b,0.9*c,0.5*b,0.9*c);O(a,(0.5-d)*b,0.9*c,0.1*b,(0.5+d)*c,0.1*b,0.5*c);O(a,0.1*b,(0.5-d)*c,(0.5-d)*b,0.1*c,0.5*b,0.1*c);var d=0.07,e=0,f=-0.707*0.11,h=4*(Math.SQRT2-1)/3*d;M(a,(0.5+d+e)*b,(0.5+f)*c,!0);O(a,(0.5+d+e)*b,(0.5-h+f)*c,(0.5+h+e)*b,(0.5-d+f)*c,(0.5+e)*b,(0.5-d+f)*c);O(a,(0.5-h+e)*b,(0.5-d+f)*c,(0.5-d+e)*b,(0.5-h+f)*c,(0.5-d+e)*b,(0.5+f)*c);O(a,(0.5-d+e)*b,(0.5+h+f)*c,(0.5-h+e)*b,(0.5+d+f)*c,(0.5+e)*b,(0.5+d+f)*c);O(a,(0.5+h+e)*b,(0.5+d+f)*c,(0.5+d+e)*b,(0.5+h+f)*c,(0.5+d+e)*b,(0.5+f)*c);d=0.07;e=-0.707*0.11;f=0.707*0.11;h=4*(Math.SQRT2-1)/3*d;M(a,(0.5+d+e)*b,(0.5+f)*c,!0);O(a,(0.5+d+e)*b,(0.5-h+f)*c,(0.5+h+e)*b,(0.5-d+f)*c,(0.5+e)*b,(0.5-d+f)*c);O(a,(0.5-h+e)*b,(0.5-d+f)*c,(0.5-d+e)*b,(0.5-h+f)*c,(0.5-d+e)*b,(0.5+f)*c);O(a,(0.5-d+e)*b,(0.5+h+f)*c,(0.5-h+e)*b,(0.5+d+f)*c,(0.5+e)*b,(0.5+d+f)*c);O(a,(0.5+h+e)*b,(0.5+d+f)*c,(0.5+d+e)*b,(0.5+h+f)*c,(0.5+d+e)*b,(0.5+f)*c);d=0.07;e=0.707*0.11;f=0.707*0.11;h=4*(Math.SQRT2-1)/3*d;M(a,(0.5+d+e)*b,(0.5+f)*c,!0);O(a,(0.5+d+e)*b,(0.5-h+f)*c,(0.5+h+e)*b,(0.5-d+f)*c,(0.5+e)*b,(0.5-d+f)*c);O(a,(0.5-h+e)*b,(0.5-d+f)*c,(0.5-d+e)*b,(0.5-h+f)*c,(0.5-d+e)*b,(0.5+f)*c);O(a,(0.5-d+e)*b,(0.5+h+f)*c,(0.5-h+e)*b,(0.5+d+f)*c,(0.5+e)*b,(0.5+d+f)*c);O(a,(0.5+h+e)*b,(0.5+d+f)*c,(0.5+d+e)*b,(0.5+h+f)*c,(0.5+d+e)*b,(0.5+f)*c);b=a.o;b.A=new L(0.146,0.146);b.B=new L(0.853,0.853);b.Dd=sh;u.q(a);return b},NotAllowed:function(a,b,c){var d=K.ta,e=0.5*d,f=0.5;a=u.p();M(a,0.5*b,(0.5-f)*c,!0);O(a,(0.5-e)*b,(0.5-f)*c,(0.5-f)*b,(0.5-e)*c,(0.5-f)*b,0.5*c);O(a,(0.5-f)*b,(0.5+e)*c,(0.5-e)*b,(0.5+f)*c,0.5*b,(0.5+f)*c);O(a,(0.5+e)*b,(0.5+f)*c,(0.5+f)*b,(0.5+e)*c,(0.5+f)*b,0.5*c);O(a,(0.5+f)*b,(0.5-e)*c,(0.5+e)*b,(0.5-f)*c,0.5*b,(0.5-f)*c);var f=0.4,e=0.4*d,d=u.K(),h=u.K(),k=u.K(),l=u.K();K.Bi(0.5,0.5-f,0.5+e,0.5-f,0.5+f,0.5-e,0.5+f,0.5,0.42,d,h,k,l,l);var m=u.K(),n=u.K(),p=u.K();K.Bi(0.5,0.5-f,0.5+e,0.5-f,0.5+f,0.5-e,0.5+f,0.5,0.58,l,l,p,m,n);var q=u.K(),r=u.K(),s=u.K();K.Bi(0.5,0.5+f,0.5-e,0.5+f,0.5-f,0.5+e,0.5-f,0.5,0.42,q,r,s,l,l);var t=u.K(),v=u.K(),x=u.K();K.Bi(0.5,0.5+f,0.5-e,0.5+f,0.5-f,0.5+e,0.5-f,0.5,0.58,l,l,x,t,v);M(a,x.x*b,x.y*c,!0,!0);O(a,t.x*b,t.y*c,v.x*b,v.y*c,(0.5-f)*b,0.5*c);O(a,(0.5-f)*b,(0.5-e)*c,(0.5-e)*b,(0.5-f)*c,0.5*b,(0.5-f)*c);O(a,d.x*b,d.y*c,h.x*b,h.y*c,k.x*b,k.y*c);a.lineTo(x.x*b,x.y*c);P(a);M(a,s.x*b,s.y*c,!0,!0);a.lineTo(p.x*b,p.y*c);O(a,m.x*b,m.y*c,n.x*b,n.y*c,(0.5+f)*b,0.5*c);O(a,(0.5+f)*b,(0.5+e)*c,(0.5+e)*b,(0.5+f)*c,0.5*b,(0.5+f)*c);O(a,q.x*b,q.y*c,r.x*b,r.y*c,s.x*b,s.y*c);P(a);u.v(d);u.v(h);u.v(k);u.v(l);u.v(m);u.v(n);u.v(p);u.v(q);u.v(r);u.v(s);u.v(t);u.v(v);u.v(x);b=a.o;u.q(a);b.Dd=sh;return b},Fragile:function(a,b,c){a=u.p();M(a,0,0,!0);a.lineTo(0.25*b,0);a.lineTo(0.2*b,0.15*c);a.lineTo(0.3*b,0.25*c);a.lineTo(0.29*b,0.33*c);a.lineTo(0.35*b,0.25*c);a.lineTo(0.3*b,0.15*c);a.lineTo(0.4*b,0);a.lineTo(1*b,0);O(a,1*b,0.25*c,0.75*b,0.5*c,0.55*b,0.5*c);a.lineTo(0.55*b,0.9*c);a.lineTo(0.7*b,0.9*c);a.lineTo(0.7*b,1*c);a.lineTo(0.3*b,1*c);a.lineTo(0.3*b,0.9*c);a.lineTo(0.45*b,0.9*c);a.lineTo(0.45*b,0.5*c);O(a,0.25*b,0.5*c,0,0.25*c,0,0);P(a);b=a.o;b.A=new L(0.25,0);b.B=new L(0.75,0.4);u.q(a);return b},HourGlass:function(a,b,c){a=u.p();M(a,0.65*b,0.5*c,!0);a.lineTo(1*b,1*c);a.lineTo(0,1*c);a.lineTo(0.35*b,0.5*c);a.lineTo(0,0);a.lineTo(1*b,0);P(a);b=a.o;u.q(a);return b},Lightning:function(a,b,c){a=u.p();M(a,0*b,0.55*c,!0);a.lineTo(0.75*b,0);a.lineTo(0.25*b,0.45*c);a.lineTo(0.9*b,0.48*c);a.lineTo(0.4*b,1*c);a.lineTo(0.65*b,0.55*c);P(a);b=a.o;u.q(a);return b},Parallelogram1:function(a,b,c){a=a?a.vc:NaN;isNaN(a)&&(a=0.1);var d=u.p();M(d,a*b,0,!0);d.lineTo(1*b,0);d.lineTo((1-a)*b,1*c);d.lineTo(0,1*c);P(d);b=d.o;b.A=new L(a,0);b.B=new L(1-a,1);u.q(d);return b},Input:"Output",Output:function(a,b,c){a=u.p();M(a,0,1*c,!0);a.lineTo(0.1*b,0);a.lineTo(1*b,0);a.lineTo(0.9*b,1*c);P(a);b=a.o;b.A=new L(0.1,0);b.B=new L(0.9,1);u.q(a);return b},Parallelogram2:function(a,b,c){a=a?a.vc:NaN;isNaN(a)&&(a=0.25);var d=u.p();M(d,a*b,0,!0);d.lineTo(1*b,0);d.lineTo((1-a)*b,1*c);d.lineTo(0,1*c);P(d);b=d.o;b.A=new L(a,0);b.B=new L(1-a,1);u.q(d);return b},ThickCross:function(a,b,c){a=a?a.vc:NaN;isNaN(a)&&(a=0.25);var d=u.p();M(d,(0.5-a/2)*b,0,!0);d.lineTo((0.5+a/2)*b,0);d.lineTo((0.5+a/2)*b,(0.5-a/2)*c);d.lineTo(1*b,(0.5-a/2)*c);d.lineTo(1*b,(0.5+a/2)*c);d.lineTo((0.5+a/2)*b,(0.5+a/2)*c);d.lineTo((0.5+a/2)*b,1*c);d.lineTo((0.5-a/2)*b,1*c);d.lineTo((0.5-a/2)*b,(0.5+a/2)*c);d.lineTo(0,(0.5+a/2)*c);d.lineTo(0,(0.5-a/2)*c);d.lineTo((0.5-a/2)*b,(0.5-a/2)*c);P(d);b=d.o;b.A=new L(0.5-a/2,0.5-a/2);b.B=new L(0.5+a/2,0.5+a/2);u.q(d);return b},ThickX:function(a,b,c){a=0.25/Math.SQRT2;var d=u.p();M(d,0.3*b,0,!0);d.lineTo(0.5*b,0.2*c);d.lineTo(0.7*b,0);d.lineTo(1*b,0.3*c);d.lineTo(0.8*b,0.5*c);d.lineTo(1*b,0.7*c);d.lineTo(0.7*b,1*c);d.lineTo(0.5*b,0.8*c);d.lineTo(0.3*b,1*c);d.lineTo(0,0.7*c);d.lineTo(0.2*b,0.5*c);d.lineTo(0,0.3*c);P(d);b=d.o;b.A=new L(0.5-a,0.5-a);b.B=new L(0.5+a,0.5+a);u.q(d);return b},ThinCross:function(a,b,c){var d=a?a.vc:NaN; + isNaN(d)&&(d=0.1);a=u.p();M(a,(0.5-d/2)*b,0,!0);a.lineTo((0.5+d/2)*b,0);a.lineTo((0.5+d/2)*b,(0.5-d/2)*c);a.lineTo(1*b,(0.5-d/2)*c);a.lineTo(1*b,(0.5+d/2)*c);a.lineTo((0.5+d/2)*b,(0.5+d/2)*c);a.lineTo((0.5+d/2)*b,1*c);a.lineTo((0.5-d/2)*b,1*c);a.lineTo((0.5-d/2)*b,(0.5+d/2)*c);a.lineTo(0,(0.5+d/2)*c);a.lineTo(0,(0.5-d/2)*c);a.lineTo((0.5-d/2)*b,(0.5-d/2)*c);P(a);b=a.o;u.q(a);return b},ThinX:function(a,b,c){a=u.p();M(a,0.1*b,0,!0);a.lineTo(0.5*b,0.4*c);a.lineTo(0.9*b,0);a.lineTo(1*b,0.1*c);a.lineTo(0.6*b,0.5*c);a.lineTo(1*b,0.9*c);a.lineTo(0.9*b,1*c);a.lineTo(0.5*b,0.6*c);a.lineTo(0.1*b,1*c);a.lineTo(0,0.9*c);a.lineTo(0.4*b,0.5*c);a.lineTo(0,0.1*c);P(a);return a.o},RightTriangle:function(a,b,c){a=u.p();M(a,0,0,!0);a.lineTo(1*b,1*c);a.lineTo(0,1*c);P(a);b=a.o;b.A=new L(0,0.5);b.B=new L(0.5,1);u.q(a);return b},RoundedIBeam:function(a,b,c){a=u.p();M(a,0,0,!0);a.lineTo(1*b,0);O(a,0.5*b,0.25*c,0.5*b,0.75*c,1*b,1*c);a.lineTo(0,1*c);O(a,0.5*b,0.75*c,0.5*b,0.25*c,0,0);P(a);b=a.o;u.q(a);return b},RoundedRectangle:function(a,b,c){var d=a?a.vc:NaN;isNaN(d)&&(d=5);d=Math.min(d,b/3);d=Math.min(d,c/3);a=d*K.ta;var e=u.p();M(e,d,0,!0);e.lineTo(b-d,0);O(e,b-a,0,b,a,b,d);e.lineTo(b,c-d);O(e,b,c-a,b-a,c,b-d,c);e.lineTo(d,c);O(e,a,c,0,c-a,0,c-d);e.lineTo(0,d);O(e,0,a,a,0,d,0);P(e);b=e.o;1<a?(b.A=new L(0,0,a,a),b.B=new L(1,1,-a,-a)):(b.A=xb,b.B=Vb);u.q(e);return b},Border:function(a,b,c){var d=a?a.vc:NaN;isNaN(d)&&(d=5);d=Math.min(d,b/3);d=Math.min(d,c/3);a=u.p();M(a,d,0,!0);a.lineTo(b-d,0);O(a,b-0,0,b,0,b,d);a.lineTo(b,c-d);O(a,b,c-0,b-0,c,b-d,c);a.lineTo(d,c);O(a,0,c,0,c-0,0,c-d);a.lineTo(0,d);O(a,0,0,0,0,d,0);P(a);b=a.o;b.A=xb;b.B=Vb;u.q(a);return b},SquareIBeam:function(a,b,c){var d=a?a.vc:NaN;isNaN(d)&&(d=0.2);a=u.p();M(a,0,0,!0);a.lineTo(1*b,0);a.lineTo(1*b,d*c);a.lineTo((0.5+d/2)*b,d*c);a.lineTo((0.5+d/2)*b,(1-d)*c);a.lineTo(1*b,(1-d)*c);a.lineTo(1*b,1*c);a.lineTo(0,1*c);a.lineTo(0,(1-d)*c);a.lineTo((0.5-d/2)*b,(1-d)*c);a.lineTo((0.5-d/2)*b,d*c);a.lineTo(0,d*c);P(a);b=a.o;u.q(a);return b},Trapezoid:function(a,b,c){a=a?a.vc:NaN;isNaN(a)&&(a=0.2);var d=u.p();M(d,a*b,0,!0);d.lineTo((1-a)*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c);P(d);b=d.o;b.A=new L(a,0);b.B=new L(1-a,1);u.q(d);return b},ManualLoop:"ManualOperation",ManualOperation:function(a,b,c){var d=a?a.vc:NaN;isNaN(d)&&(d=0);a=u.p();M(a,d,0,!0);a.lineTo(0,0);a.lineTo(1*b,0);a.lineTo(0.9*b,1*c);a.lineTo(0.1*b,1*c);P(a);b=a.o;b.A=new L(0.1,0);b.B=new L(0.9,1);u.q(a);return b},GenderMale:function(a,b,c){a=u.p();var d=K.ta,e=0.4*d,f=0.4,h=u.K(),k=u.K(),l=u.K(),m=u.K();M(a,(0.5-f)*b,0.5*c,!0);O(a,(0.5-f)*b,(0.5-e)*c,(0.5-e)*b,(0.5-f)*c,0.5*b,(0.5-f)*c);K.Bi(0.5,0.5-f,0.5+e,0.5-f,0.5+f,0.5-e,0.5+f,0.5,0.44,l,m,k,h,h);O(a,l.x*b,l.y*c,m.x*b,m.y*c,k.x*b,k.y*c);var n=u.Yb(k.x,k.y);K.Bi(0.5,0.5-f,0.5+e,0.5-f,0.5+f,0.5-e,0.5+f,0.5,0.56,h,h,k,l,m);var p=u.Yb(k.x,k.y);a.lineTo((0.1*n.x+0.855)*b,0.1*n.y*c);a.lineTo(0.85*b,0.1*n.y*c);a.lineTo(0.85*b,0);a.lineTo(1*b,0);a.lineTo(1*b,0.15*c);a.lineTo((0.1*p.x+0.9)*b,0.15*c);a.lineTo((0.1*p.x+0.9)*b,(0.1*p.y+0.05*0.9)*c);a.lineTo(p.x*b,p.y*c);O(a,l.x*b,l.y*c,m.x*b,m.y*c,(0.5+f)*b,0.5*c);O(a,(0.5+f)*b,(0.5+e)*c,(0.5+e)*b,(0.5+f)*c,0.5*b,(0.5+f)*c);O(a,(0.5-e)*b,(0.5+f)*c,(0.5-f)*b,(0.5+e)*c,(0.5-f)*b,0.5*c);f=0.35;e=0.35*d;M(a,0.5*b,(0.5-f)*c,!0,!0);O(a,(0.5-e)*b,(0.5-f)*c,(0.5-f)*b,(0.5-e)*c,(0.5-f)*b,0.5*c);O(a,(0.5-f)*b,(0.5+e)*c,(0.5-e)*b,(0.5+f)*c,0.5*b,(0.5+f)*c);O(a,(0.5+e)*b,(0.5+f)*c,(0.5+f)*b,(0.5+e)*c,(0.5+f)*b,0.5*c);O(a,(0.5+f)*b,(0.5-e)*c,(0.5+e)*b,(0.5-f)*c,0.5*b,(0.5-f)*c);M(a,(0.5-f)*b,0.5*c,!0);u.v(h);u.v(k);u.v(l);u.v(m);u.v(n);u.v(p);b=a.o;b.A=new L(0.202,0.257);b.B=new L(0.692,0.839);b.Dd=sh;u.q(a);return b},GenderFemale:function(a,b,c){a=u.p();var d=0.375,e=0,f=-0.125,h=4*(Math.SQRT2-1)/3*d;M(a,(0.525+e)*b,(0.5+d+f)*c,!0);O(a,(0.5+h+e)*b,(0.5+d+f)*c,(0.5+d+e)*b,(0.5+h+f)*c,(0.5+d+e)*b,(0.5+f)*c);O(a,(0.5+d+e)*b,(0.5-h+f)*c,(0.5+h+e)*b,(0.5-d+f)*c,(0.5+e)*b,(0.5-d+f)*c);O(a,(0.5-h+e)*b,(0.5-d+f)*c,(0.5-d+e)*b,(0.5-h+f)*c,(0.5-d+e)*b,(0.5+f)*c);O(a,(0.5-d+e)*b,(0.5+h+f)*c,(0.5-h+e)*b,(0.5+d+f)*c,(0.475+e)*b,(0.5+d+f)*c);a.lineTo(0.475*b,0.85*c);a.lineTo(0.425*b,0.85*c);a.lineTo(0.425*b,0.9*c);a.lineTo(0.475*b,0.9*c);a.lineTo(0.475*b,1*c);a.lineTo(0.525*b,1*c);a.lineTo(0.525*b,0.9*c);a.lineTo(0.575*b,0.9*c);a.lineTo(0.575*b,0.85*c);a.lineTo(0.525*b,0.85*c);P(a);d=0.325;e=0;f=-0.125;h=4*(Math.SQRT2-1)/3*d;M(a,(0.5+d+e)*b,(0.5+f)*c,!0,!0);O(a,(0.5+d+e)*b,(0.5+h+f)*c,(0.5+h+e)*b,(0.5+d+f)*c,(0.5+e)*b,(0.5+d+f)*c);O(a,(0.5-h+e)*b,(0.5+d+f)*c,(0.5-d+e)*b,(0.5+h+f)*c,(0.5-d+e)*b,(0.5+f)*c);O(a,(0.5-d+e)*b,(0.5-h+f)*c,(0.5-h+e)*b,(0.5-d+f)*c,(0.5+e)*b,(0.5-d+f)*c);O(a,(0.5+h+e)*b,(0.5-d+f)*c,(0.5+d+e)*b,(0.5-h+f)*c,(0.5+d+e)*b,(0.5+f)*c);M(a,(0.525+e)*b,(0.5+d+f)*c,!0);b=a.o;b.A=new L(0.232,0.136);b.B=new L(0.782,0.611);b.Dd=sh;u.q(a);return b},PlusLine:function(a,b,c){a=u.p();M(a,0,0.5*c,!1);a.lineTo(1*b,0.5*c);a.moveTo(0.5*b,0);a.lineTo(0.5*b,1*c);b=a.o;u.q(a);return b},XLine:function(a,b,c){a=u.p();M(a,0,1*c,!1);a.lineTo(1*b,0); + a.moveTo(0,0);a.lineTo(1*b,1*c);b=a.o;u.q(a);return b},AsteriskLine:function(a,b,c){a=u.p();var d=0.2/Math.SQRT2;M(a,d*b,(1-d)*c,!1);a.lineTo((1-d)*b,d*c);a.moveTo(d*b,d*c);a.lineTo((1-d)*b,(1-d)*c);a.moveTo(0*b,0.5*c);a.lineTo(1*b,0.5*c);a.moveTo(0.5*b,0*c);a.lineTo(0.5*b,1*c);b=a.o;u.q(a);return b},CircleLine:function(a,b,c){var d=0.5*K.ta;a=u.p();M(a,1*b,0.5*c,!1);O(a,1*b,(0.5+d)*c,(0.5+d)*b,1*c,0.5*b,1*c);O(a,(0.5-d)*b,1*c,0,(0.5+d)*c,0,0.5*c);O(a,0,(0.5-d)*c,(0.5-d)*b,0,0.5*b,0);O(a,(0.5+d)*b,0,1*b,(0.5-d)*c,1*b,0.5*c);b=a.o;b.A=new L(0.146,0.146);b.B=new L(0.853,0.853);b.Dd=sh;u.q(a);return b},Pie:function(a,b,c){a=u.p();var d=4*(Math.SQRT2-1)/3*0.5;M(a,(0.5*Math.SQRT2/2+0.5)*b,(0.5-0.5*Math.SQRT2/2)*c,!0);O(a,0.7*b,0*c,0.5*b,0*c,0.5*b,0*c);O(a,(0.5-d+0)*b,0*c,0*b,(0.5-d+0)*c,0*b,0.5*c);O(a,0*b,(0.5+d+0)*c,(0.5-d+0)*b,1*c,0.5*b,1*c);O(a,(0.5+d+0)*b,1*c,1*b,(0.5+d+0)*c,1*b,0.5*c);a.lineTo(0.5*b,0.5*c);P(a);b=a.o;u.q(a);return b},PiePiece:function(a,b,c){var d=K.ta/Math.SQRT2*0.5,e=Math.SQRT2/2,f=1-Math.SQRT2/2;a=u.p();M(a,b,c,!0);O(a,b,(1-d)*c,(e+d)*b,(f+d)*c,e*b,f*c);a.lineTo(0,c);P(a);b=a.o;u.q(a);return b},StopSign:function(a,b,c){a=1/(Math.SQRT2+2);var d=u.p();M(d,a*b,0,!0);d.lineTo((1-a)*b,0);d.lineTo(1*b,a*c);d.lineTo(1*b,(1-a)*c);d.lineTo((1-a)*b,1*c);d.lineTo(a*b,1*c);d.lineTo(0,(1-a)*c);d.lineTo(0,a*c);P(d);b=d.o;b.A=new L(a/2,a/2);b.B=new L(1-a/2,1-a/2);u.q(d);return b},LogicImplies:function(a,b,c){var d=a?a.vc:NaN;isNaN(d)&&(d=0.2);a=u.p();M(a,(1-d)*b,0*c,!1);a.lineTo(1*b,0.5*c);a.lineTo((1-d)*b,c);a.moveTo(0,0.5*c);a.lineTo(b,0.5*c);b=a.o;b.A=xb;b.B=new L(0.8,0.5);u.q(a);return b},LogicIff:function(a,b,c){var d=a?a.vc:NaN;isNaN(d)&&(d=0.2);a=u.p();M(a,(1-d)*b,0*c,!1);a.lineTo(1*b,0.5*c);a.lineTo((1-d)*b,c);a.moveTo(0,0.5*c);a.lineTo(b,0.5*c);a.moveTo(d*b,0);a.lineTo(0,0.5*c);a.lineTo(d*b,c);b=a.o;b.A=new L(0.2,0);b.B=new L(0.8,0.5);u.q(a);return b},LogicNot:function(a,b,c){a=u.p();M(a,0,0,!1);a.lineTo(1*b,0);a.lineTo(1*b,1*c);b=a.o;u.q(a);return b},LogicAnd:function(a,b,c){a=u.p();M(a,0,1*c,!1);a.lineTo(0.5*b,0);a.lineTo(1*b,1*c);b=a.o;b.A=new L(0.25,0.5);b.B=new L(0.75,1);u.q(a);return b},LogicOr:function(a,b,c){a=u.p();M(a,0,0,!1);a.lineTo(0.5*b,1*c);a.lineTo(1*b,0);b=a.o;b.A=new L(0.219,0);b.B=new L(0.78,0.409);u.q(a);return b},LogicXor:function(a,b,c){a=u.p();M(a,0.5*b,0,!1);a.lineTo(0.5*b,1*c);a.moveTo(0,0.5*c);a.lineTo(1*b,0.5*c);var d=0.5*K.ta;O(a,1*b,(0.5+d)*c,(0.5+d)*b,1*c,0.5*b,1*c);O(a,(0.5-d)*b,1*c,0,(0.5+d)*c,0,0.5*c);O(a,0,(0.5-d)*c,(0.5-d)*b,0,0.5*b,0);O(a,(0.5+d)*b,0,1*b,(0.5-d)*c,1*b,0.5*c);b=a.o;b.Dd=sh;u.q(a);return b},LogicTruth:function(a,b,c){a=u.p();M(a,0,0,!1);a.lineTo(1*b,0);a.moveTo(0.5*b,0);a.lineTo(0.5*b,1*c);b=a.o;u.q(a);return b},LogicFalsity:function(a,b,c){a=u.p();M(a,0,1*c,!1);a.lineTo(1*b,1*c);a.moveTo(0.5*b,1*c);a.lineTo(0.5*b,0);b=a.o;u.q(a);return b},LogicThereExists:function(a,b,c){a=u.p();M(a,0,0,!1);a.lineTo(1*b,0);a.lineTo(1*b,0.5*c);a.lineTo(0,0.5*c);a.moveTo(1*b,0.5*c);a.lineTo(1*b,1*c);a.lineTo(0,1*c);b=a.o;u.q(a);return b},LogicForAll:function(a,b,c){a=u.p();M(a,0,0,!1);a.lineTo(0.5*b,1*c);a.lineTo(1*b,0);a.moveTo(0.25*b,0.5*c);a.lineTo(0.75*b,0.5*c);b=a.o;b.A=new L(0.25,0);b.B=new L(0.75,0.5);u.q(a);return b},LogicIsDefinedAs:function(a,b,c){a=u.p();M(a,0,0,!1);a.lineTo(b,0);a.moveTo(0,0.5*c);a.lineTo(b,0.5*c);a.moveTo(0,c);a.lineTo(b,c);b=a.o;b.A=new L(0.01,0.01);b.B=new L(0.99,0.49);u.q(a);return b},LogicIntersect:function(a,b,c){var d=0.5*K.ta;a=u.p();M(a,0,1*c,!1);a.lineTo(0,0.5*c);O(a,0,(0.5-d)*c,(0.5-d)*b,0,0.5*b,0);O(a,(0.5+d)*b,0,1*b,(0.5-d)*c,1*b,0.5*c);a.lineTo(1*b,1*c);b=a.o;b.A=new L(0,0.5);b.B=Vb;u.q(a);return b},LogicUnion:function(a,b,c){var d=0.5*K.ta;a=u.p();M(a,1*b,0,!1);a.lineTo(1*b,0.5*c);O(a,1*b,(0.5+d)*c,(0.5+d)*b,1*c,0.5*b,1*c);O(a,(0.5-d)*b,1*c,0,(0.5+d)*c,0,0.5*c);a.lineTo(0,0);b=a.o;b.A=xb;b.B=new L(1,0.5);u.q(a);return b},Arrow:function(a,b,c){var d=a?a.vc:NaN,e=a?a.ft:NaN;isNaN(d)&&(d=0.3);isNaN(e)&&(e=0.3);a=u.p();M(a,0,(0.5-e/2)*c,!0);a.lineTo((1-d)*b,(0.5-e/2)*c);a.lineTo((1-d)*b,0);a.lineTo(1*b,0.5*c);a.lineTo((1-d)*b,1*c);a.lineTo((1-d)*b,(0.5+e/2)*c);a.lineTo(0,(0.5+e/2)*c);P(a);b=a.o;b.A=new L(0,0.5-e/2);d=K.al(0,0.5+e/2,1,0.5+e/2,1-d,1,1,0.5,u.K());b.B=new L(d.x,d.y);u.v(d);u.q(a);return b},ISOProcess:"Chevron",Chevron:function(a,b,c){a=u.p();M(a,0,0,!0);a.lineTo(0.5*b,0);a.lineTo(1*b,0.5*c);a.lineTo(0.5*b,1*c);a.lineTo(0,1*c);a.lineTo(0.5*b,0.5*c);P(a);b=a.o;u.q(a);return b},DoubleArrow:function(a,b,c){a=u.p();M(a,0,0,!0);a.lineTo(0.3*b,0.214*c);a.lineTo(0.3*b,0);a.lineTo(1*b,0.5*c);a.lineTo(0.3*b,1*c);a.lineTo(0.3*b,0.786*c);a.lineTo(0,1*c);P(a);M(a,0.3*b,0.214*c,!1);a.lineTo(0.3*b,0.786*c);a.ab(!1);b=a.o;u.q(a);return b},DoubleEndArrow:function(a,b,c){a=u.p();M(a,1*b,0.5*c,!0);a.lineTo(0.7*b,1*c);a.lineTo(0.7*b,0.7*c);a.lineTo(0.3*b,0.7*c);a.lineTo(0.3*b,1*c);a.lineTo(0,0.5*c);a.lineTo(0.3*b,0);a.lineTo(0.3*b,0.3*c);a.lineTo(0.7*b,0.3*c);a.lineTo(0.7*b,0);P(a);b=a.o;c=K.al(0,0.5,0.3,0,0,0.3,0.3,0.3,u.K());b.A=new L(c.x,c.y); + c=K.al(0.7,1,1,0.5,0.7,0.7,1,0.7,c);b.B=new L(c.x,c.y);u.v(c);u.q(a);return b},IBeamArrow:function(a,b,c){a=u.p();M(a,1*b,0.5*c,!0);a.lineTo(0.7*b,1*c);a.lineTo(0.7*b,0.7*c);a.lineTo(0.2*b,0.7*c);a.lineTo(0.2*b,1*c);a.lineTo(0,1*c);a.lineTo(0,0);a.lineTo(0.2*b,0);a.lineTo(0.2*b,0.3*c);a.lineTo(0.7*b,0.3*c);a.lineTo(0.7*b,0);P(a);b=a.o;b.A=new L(0,0.3);c=K.al(0.7,1,1,0.5,0.7,0.7,1,0.7,u.K());b.B=new L(c.x,c.y);u.v(c);u.q(a);return b},Pointer:function(a,b,c){a=u.p();M(a,1*b,0.5*c,!0);a.lineTo(0,1*c);a.lineTo(0.2*b,0.5*c);a.lineTo(0,0);P(a);b=a.o;b.A=new L(0.2,0.35);c=K.al(0.2,0.65,1,0.65,0,1,1,0.5,u.K());b.B=new L(c.x,c.y);u.v(c);u.q(a);return b},RoundedPointer:function(a,b,c){a=u.p();M(a,1*b,0.5*c,!0);a.lineTo(0,1*c);O(a,0.5*b,0.75*c,0.5*b,0.25*c,0,0);P(a);b=a.o;b.A=new L(0.4,0.35);c=K.al(0.2,0.65,1,0.65,0,1,1,0.5,u.K());b.B=new L(c.x,c.y);u.v(c);u.q(a);return b},SplitEndArrow:function(a,b,c){a=u.p();M(a,1*b,0.5*c,!0);a.lineTo(0.7*b,1*c);a.lineTo(0.7*b,0.7*c);a.lineTo(0,0.7*c);a.lineTo(0.2*b,0.5*c);a.lineTo(0,0.3*c);a.lineTo(0.7*b,0.3*c);a.lineTo(0.7*b,0);P(a);b=a.o;b.A=new L(0.2,0.3);c=K.al(0.7,1,1,0.5,0.7,0.7,1,0.7,u.K());b.B=new L(c.x,c.y);u.v(c);u.q(a);return b},MessageToUser:"SquareArrow",SquareArrow:function(a,b,c){a=u.p();M(a,1*b,0.5*c,!0);a.lineTo(0.7*b,1*c);a.lineTo(0,1*c);a.lineTo(0,0);a.lineTo(0.7*b,0);P(a);b=a.o;b.A=xb;b.B=new L(0.7,1);u.q(a);return b},Cone1:function(a,b,c){var d=K.ta;a=0.5*d;var e=0.1*d,d=u.p();M(d,0,0.9*c,!0);d.lineTo(0.5*b,0);d.lineTo(1*b,0.9*c);O(d,1*b,(0.9+e)*c,(0.5+a)*b,1*c,0.5*b,1*c);O(d,(0.5-a)*b,1*c,0,(0.9+e)*c,0,0.9*c);P(d);b=d.o;b.A=new L(0.25,0.5);b.B=new L(0.75,0.97);u.q(d);return b},Cone2:function(a,b,c){a=u.p();M(a,0,0.9*c,!0);O(a,(1-0.85/0.9)*b,1*c,0.85/0.9*b,1*c,1*b,0.9*c);a.lineTo(0.5*b,0);a.lineTo(0,0.9*c);P(a);M(a,0,0.9*c,!1);O(a,(1-0.85/0.9)*b,0.8*c,0.85/0.9*b,0.8*c,1*b,0.9*c);a.ab(!1);b=a.o;b.A=new L(0.25,0.5);b.B=new L(0.75,0.82);u.q(a);return b},Cube1:function(a,b,c){a=u.p();M(a,0.5*b,1*c,!0);a.lineTo(1*b,0.85*c);a.lineTo(1*b,0.15*c);a.lineTo(0.5*b,0*c);a.lineTo(0*b,0.15*c);a.lineTo(0*b,0.85*c);P(a);M(a,0.5*b,1*c,!1);a.lineTo(0.5*b,0.3*c);a.lineTo(0,0.15*c);a.moveTo(0.5*b,0.3*c);a.lineTo(1*b,0.15*c);a.ab(!1);b=a.o;b.A=new L(0,0.3);b.B=new L(0.5,0.85);u.q(a);return b},Cube2:function(a,b,c){a=u.p();M(a,0,0.3*c,!0);a.lineTo(0*b,1*c);a.lineTo(0.7*b,c);a.lineTo(1*b,0.7*c);a.lineTo(1*b,0*c);a.lineTo(0.3*b,0*c);P(a);M(a,0,0.3*c,!1);a.lineTo(0.7*b,0.3*c);a.lineTo(1*b,0*c);a.moveTo(0.7*b,0.3*c);a.lineTo(0.7*b,1*c);a.ab(!1);b=a.o;b.A=new L(0,0.3);b.B=new L(0.7,1);u.q(a);return b},MagneticData:"Cylinder1",Cylinder1:function(a,b,c){var d=K.ta;a=0.5*d;var e=0.1*d,d=u.p();M(d,0,0.1*c,!0);O(d,0,(0.1-e)*c,(0.5-a)*b,0,0.5*b,0);O(d,(0.5+a)*b,0,1*b,(0.1-e)*c,1*b,0.1*c);d.lineTo(b,0.9*c);O(d,1*b,(0.9+e)*c,(0.5+a)*b,1*c,0.5*b,1*c);O(d,(0.5-a)*b,1*c,0,(0.9+e)*c,0,0.9*c);d.lineTo(0,0.1*c);M(d,0,0.1*c,!1);O(d,0,(0.1+e)*c,(0.5-a)*b,0.2*c,0.5*b,0.2*c);O(d,(0.5+a)*b,0.2*c,1*b,(0.1+e)*c,1*b,0.1*c);d.ab(!1);b=d.o;b.A=new L(0,0.2);b.B=new L(1,0.9);u.q(d);return b},Cylinder2:function(a,b,c){var d=K.ta;a=0.5*d;var e=0.1*d,d=u.p();M(d,0,0.9*c,!0);d.lineTo(0,0.1*c);O(d,0,(0.1-e)*c,(0.5-a)*b,0,0.5*b,0);O(d,(0.5+a)*b,0,1*b,(0.1-e)*c,1*b,0.1*c);d.lineTo(1*b,0.9*c);O(d,1*b,(0.9+e)*c,(0.5+a)*b,1*c,0.5*b,1*c);O(d,(0.5-a)*b,1*c,0,(0.9+e)*c,0,0.9*c);M(d,0,0.9*c,!1);O(d,0,(0.9-e)*c,(0.5-a)*b,0.8*c,0.5*b,0.8*c);O(d,(0.5+a)*b,0.8*c,1*b,(0.9-e)*c,1*b,0.9*c);d.ab(!1);b=d.o;b.A=new L(0,0.1);b.B=new L(1,0.8);u.q(d);return b},Cylinder3:function(a,b,c){var d=K.ta;a=0.1*d;var e=0.5*d,d=u.p();M(d,0.1*b,0,!0);d.lineTo(0.9*b,0);O(d,(0.9+a)*b,0,1*b,(0.5-e)*c,1*b,0.5*c);O(d,1*b,(0.5+e)*c,(0.9+a)*b,1*c,0.9*b,1*c);d.lineTo(0.1*b,1*c);O(d,(0.1-a)*b,1*c,0,(0.5+e)*c,0,0.5*c);O(d,0,(0.5-e)*c,(0.1-a)*b,0,0.1*b,0);M(d,0.1*b,0,!1);O(d,(0.1+a)*b,0,0.2*b,(0.5-e)*c,0.2*b,0.5*c);O(d,0.2*b,(0.5+e)*c,(0.1+a)*b,1*c,0.1*b,1*c);d.ab(!1);b=d.o;b.A=new L(0.2,0);b.B=new L(0.9,1);u.q(d);return b},DirectData:"Cylinder4",Cylinder4:function(a,b,c){var d=K.ta;a=0.1*d;var e=0.5*d,d=u.p();M(d,0.9*b,0,!0);O(d,(0.9+a)*b,0,1*b,(0.5-e)*c,1*b,0.5*c);O(d,1*b,(0.5+e)*c,(0.9+a)*b,1*c,0.9*b,1*c);d.lineTo(0.1*b,1*c);O(d,(0.1-a)*b,1*c,0,(0.5+e)*c,0,0.5*c);O(d,0,(0.5-e)*c,(0.1-a)*b,0,0.1*b,0);d.lineTo(0.9*b,0);M(d,0.9*b,0,!1);O(d,(0.9-a)*b,0,0.8*b,(0.5-e)*c,0.8*b,0.5*c);O(d,0.8*b,(0.5+e)*c,(0.9-a)*b,1*c,0.9*b,1*c);d.ab(!1);b=d.o;b.A=new L(0.1,0);b.B=new L(0.8,1);u.q(d);return b},Prism1:function(a,b,c){a=u.p();M(a,0.25*b,0.25*c,!0);a.lineTo(0.75*b,0);a.lineTo(b,0.5*c);a.lineTo(0.5*b,c);a.lineTo(0,c);P(a);M(a,0.25*b,0.25*c,!1);a.lineTo(0.5*b,c);a.ab(!1);b=a.o;b.A=new L(0.408,0.172);b.B=new L(0.833,0.662);u.q(a);return b},Prism2:function(a,b,c){a=u.p();M(a,0,0.25*c,!0);a.lineTo(0.75*b,0);a.lineTo(1*b,0.25*c);a.lineTo(0.75*b,0.75*c);a.lineTo(0,1*c);P(a);M(a,0,c,!1);a.lineTo(0.25*b,0.5*c);a.lineTo(b,0.25*c);a.moveTo(0,0.25*c);a.lineTo(0.25*b,0.5*c);a.ab(!1);b=a.o;b.A=new L(0.25,0.5);b.B=new L(0.75,0.75);u.q(a);return b},Pyramid1:function(a,b,c){a=u.p();M(a,0.5*b,0,!0); + a.lineTo(b,0.75*c);a.lineTo(0.5*b,1*c);a.lineTo(0,0.75*c);P(a);M(a,0.5*b,0,!1);a.lineTo(0.5*b,1*c);a.ab(!1);b=a.o;b.A=new L(0.25,0.367);b.B=new L(0.75,0.875);u.q(a);return b},Pyramid2:function(a,b,c){a=u.p();M(a,0.5*b,0,!0);a.lineTo(b,0.85*c);a.lineTo(0.5*b,1*c);a.lineTo(0,0.85*c);P(a);M(a,0.5*b,0,!1);a.lineTo(0.5*b,0.7*c);a.lineTo(0,0.85*c);a.moveTo(0.5*b,0.7*c);a.lineTo(1*b,0.85*c);a.ab(!1);b=a.o;b.A=new L(0.25,0.367);b.B=new L(0.75,0.875);u.q(a);return b},Actor:function(a,b,c){var d=K.ta,e=0.2*d,f=0.1*d,h=0.5,k=0.1;a=u.p();M(a,h*b,(k+0.1)*c,!0);O(a,(h-e)*b,(k+0.1)*c,(h-0.2)*b,(k+f)*c,(h-0.2)*b,k*c);O(a,(h-0.2)*b,(k-f)*c,(h-e)*b,(k-0.1)*c,h*b,(k-0.1)*c);O(a,(h+e)*b,(k-0.1)*c,(h+0.2)*b,(k-f)*c,(h+0.2)*b,k*c);O(a,(h+0.2)*b,(k+f)*c,(h+e)*b,(k+0.1)*c,h*b,(k+0.1)*c);e=0.05;f=d*e;M(a,0.5*b,0.2*c,!0);a.lineTo(0.95*b,0.2*c);h=0.95;k=0.25;O(a,(h+f)*b,(k-e)*c,(h+e)*b,(k-f)*c,(h+e)*b,k*c);a.lineTo(1*b,0.6*c);a.lineTo(0.85*b,0.6*c);a.lineTo(0.85*b,0.35*c);e=0.025;f=d*e;h=0.825;k=0.35;O(a,(h+e)*b,(k-f)*c,(h+f)*b,(k-e)*c,h*b,(k-e)*c);O(a,(h-f)*b,(k-e)*c,(h-e)*b,(k-f)*c,(h-e)*b,k*c);a.lineTo(0.8*b,1*c);a.lineTo(0.55*b,1*c);a.lineTo(0.55*b,0.7*c);e=0.05;f=d*e;h=0.5;k=0.7;O(a,(h+e)*b,(k-f)*c,(h+f)*b,(k-e)*c,h*b,(k-e)*c);O(a,(h-f)*b,(k-e)*c,(h-e)*b,(k-f)*c,(h-e)*b,k*c);a.lineTo(0.45*b,1*c);a.lineTo(0.2*b,1*c);a.lineTo(0.2*b,0.35*c);e=0.025;f=d*e;h=0.175;k=0.35;O(a,(h+e)*b,(k-f)*c,(h+f)*b,(k-e)*c,h*b,(k-e)*c);O(a,(h-f)*b,(k-e)*c,(h-e)*b,(k-f)*c,(h-e)*b,k*c);a.lineTo(0.15*b,0.6*c);a.lineTo(0*b,0.6*c);a.lineTo(0*b,0.25*c);e=0.05;f=d*e;h=0.05;k=0.25;O(a,(h-e)*b,(k-f)*c,(h-f)*b,(k-e)*c,h*b,(k-e)*c);a.lineTo(0.5*b,0.2*c);b=a.o;b.A=new L(0.2,0.2);b.B=new L(0.8,0.65);u.q(a);return b},Card:function(a,b,c){a=u.p();M(a,1*b,0*c,!0);a.lineTo(1*b,1*c);a.lineTo(0*b,1*c);a.lineTo(0*b,0.2*c);a.lineTo(0.2*b,0*c);P(a);b=a.o;b.A=new L(0,0.2);b.B=Vb;u.q(a);return b},Collate:function(a,b,c){a=u.p();M(a,0.5*b,0.5*c,!0);a.lineTo(0,0);a.lineTo(1*b,0);a.lineTo(0.5*b,0.5*c);M(a,0.5*b,0.5*c,!0);a.lineTo(1*b,1*c);a.lineTo(0,1*c);a.lineTo(0.5*b,0.5*c);b=a.o;b.A=new L(0.25,0);b.B=new L(0.75,0.25);u.q(a);return b},CreateRequest:function(a,b,c){a=a?a.vc:NaN;isNaN(a)&&(a=0.1);var d=u.p();M(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c);P(d);M(d,0,a*c,!1);d.lineTo(1*b,a*c);d.moveTo(0,(1-a)*c);d.lineTo(1*b,(1-a)*c);d.ab(!1);b=d.o;b.A=new L(0,a);b.B=new L(1,1-a);u.q(d);return b},Database:function(a,b,c){a=u.p();var d=K.ta,e=0.5*d,d=0.1*d;M(a,1*b,0.1*c,!0);a.lineTo(1*b,0.9*c);O(a,1*b,(0.9+d)*c,(0.5+e)*b,1*c,0.5*b,1*c);O(a,(0.5-e)*b,1*c,0,(0.9+d)*c,0,0.9*c);a.lineTo(0,0.1*c);O(a,0,(0.1-d)*c,(0.5-e)*b,0,0.5*b,0);O(a,(0.5+e)*b,0,1*b,(0.1-d)*c,1*b,0.1*c);M(a,1*b,0.1*c,!1);O(a,1*b,(0.1+d)*c,(0.5+e)*b,0.2*c,0.5*b,0.2*c);O(a,(0.5-e)*b,0.2*c,0,(0.1+d)*c,0,0.1*c);a.moveTo(1*b,0.2*c);O(a,1*b,(0.2+d)*c,(0.5+e)*b,0.3*c,0.5*b,0.3*c);O(a,(0.5-e)*b,0.3*c,0,(0.2+d)*c,0,0.2*c);a.moveTo(1*b,0.3*c);O(a,1*b,(0.3+d)*c,(0.5+e)*b,0.4*c,0.5*b,0.4*c);O(a,(0.5-e)*b,0.4*c,0,(0.3+d)*c,0,0.3*c);a.ab(!1);b=a.o;b.A=new L(0,0.4);b.B=new L(1,0.9);u.q(a);return b},StoredData:"DataStorage",DataStorage:function(a,b,c){a=u.p();M(a,0,0,!0);a.lineTo(0.75*b,0);O(a,1*b,0,1*b,1*c,0.75*b,1*c);a.lineTo(0,1*c);O(a,0.25*b,0.9*c,0.25*b,0.1*c,0,0);P(a);b=a.o;b.A=new L(0.226,0);b.B=new L(0.81,1);u.q(a);return b},DiskStorage:function(a,b,c){a=u.p();var d=K.ta,e=0.5*d,d=0.1*d;M(a,1*b,0.1*c,!0);a.lineTo(1*b,0.9*c);O(a,1*b,(0.9+d)*c,(0.5+e)*b,1*c,0.5*b,1*c);O(a,(0.5-e)*b,1*c,0,(0.9+d)*c,0,0.9*c);a.lineTo(0,0.1*c);O(a,0,(0.1-d)*c,(0.5-e)*b,0,0.5*b,0);O(a,(0.5+e)*b,0,1*b,(0.1-d)*c,1*b,0.1*c);M(a,1*b,0.1*c,!1);O(a,1*b,(0.1+d)*c,(0.5+e)*b,0.2*c,0.5*b,0.2*c);O(a,(0.5-e)*b,0.2*c,0,(0.1+d)*c,0,0.1*c);a.moveTo(1*b,0.2*c);O(a,1*b,(0.2+d)*c,(0.5+e)*b,0.3*c,0.5*b,0.3*c);O(a,(0.5-e)*b,0.3*c,0,(0.2+d)*c,0,0.2*c);a.ab(!1);b=a.o;b.A=new L(0,0.3);b.B=new L(1,0.9);u.q(a);return b},Display:function(a,b,c){a=u.p();M(a,0.25*b,0,!0);a.lineTo(0.75*b,0);O(a,1*b,0,1*b,1*c,0.75*b,1*c);a.lineTo(0.25*b,1*c);a.lineTo(0,0.5*c);P(a);b=a.o;b.A=new L(0.25,0);b.B=new L(0.75,1);u.q(a);return b},DividedEvent:function(a,b,c){a=a?a.vc:NaN;isNaN(a)?a=0.2:0.15>a&&(a=0.15);var d=u.p(),e=0.2*K.ta;M(d,0,0.2*c,!0);O(d,0,(0.2-e)*c,(0.2-e)*b,0,0.2*b,0);d.lineTo(0.8*b,0);O(d,(0.8+e)*b,0,1*b,(0.2-e)*c,1*b,0.2*c);d.lineTo(1*b,0.8*c);O(d,1*b,(0.8+e)*c,(0.8+e)*b,1*c,0.8*b,1*c);d.lineTo(0.2*b,1*c);O(d,(0.2-e)*b,1*c,0,(0.8+e)*c,0,0.8*c);d.lineTo(0,0.2*c);M(d,0,a*c,!1);d.lineTo(1*b,a*c);d.ab(!1);b=d.o;b.A=new L(0,a);b.B=new L(1,1-a);u.q(d);return b},DividedProcess:function(a,b,c){a=a?a.vc:NaN;if(isNaN(a)||0.1>a){a=0.1}var d=u.p();M(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c);P(d);M(d,0,a*c,!1);d.lineTo(1*b,a*c);d.ab(!1);b=d.o;b.A=new L(0,a);b.B=Vb;u.q(d);return b},Document:function(a,b,c){c/=0.8;a=u.p();M(a,0,0.7*c,!0);a.lineTo(0,0);a.lineTo(1*b,0);a.lineTo(1*b,0.7*c);O(a,0.5*b,0.4*c,0.5*b,1*c,0,0.7*c);P(a);b=a.o;b.A=xb;b.B=new L(1,0.6);u.q(a);return b},ExternalOrganization:function(a,b,c){a=a?a.vc:NaN;if(isNaN(a)||0.2>a){a=0.2}var d=u.p(); + M(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c);P(d);M(d,a*b,0,!1);d.lineTo(0,a*c);d.moveTo(1*b,a*c);d.lineTo((1-a)*b,0);d.moveTo(0,(1-a)*c);d.lineTo(a*b,1*c);d.moveTo((1-a)*b,1*c);d.lineTo(1*b,(1-a)*c);d.ab(!1);b=d.o;b.A=new L(a/2,a/2);b.B=new L(1-a/2,1-a/2);u.q(d);return b},ExternalProcess:function(a,b,c){a=u.p();M(a,0.5*b,0,!0);a.lineTo(1*b,0.5*c);a.lineTo(0.5*b,1*c);a.lineTo(0,0.5*c);P(a);M(a,0.1*b,0.4*c,!1);a.lineTo(0.1*b,0.6*c);a.moveTo(0.9*b,0.6*c);a.lineTo(0.9*b,0.4*c);a.moveTo(0.6*b,0.1*c);a.lineTo(0.4*b,0.1*c);a.moveTo(0.4*b,0.9*c);a.lineTo(0.6*b,0.9*c);a.ab(!1);b=a.o;b.A=new L(0.25,0.25);b.B=new L(0.75,0.75);u.q(a);return b},File:function(a,b,c){a=u.p();M(a,0,0,!0);a.lineTo(0.75*b,0);a.lineTo(1*b,0.25*c);a.lineTo(1*b,1*c);a.lineTo(0,1*c);P(a);M(a,0.75*b,0,!1);a.lineTo(0.75*b,0.25*c);a.lineTo(1*b,0.25*c);a.ab(!1);b=a.o;b.A=new L(0,0.25);b.B=Vb;u.q(a);return b},Interrupt:function(a,b,c){a=u.p();M(a,1*b,0.5*c,!0);a.lineTo(0,1*c);a.lineTo(0,0);a.lineTo(1*b,0.5*c);M(a,1*b,0.5*c,!1);a.lineTo(1*b,1*c);M(a,1*b,0.5*c,!1);a.lineTo(1*b,0);b=a.o;b.A=new L(0,0.25);b.B=new L(0.5,0.75);u.q(a);return b},InternalStorage:function(a,b,c){var d=a?a.vc:NaN;a=a?a.ft:NaN;isNaN(d)&&(d=0.1);isNaN(a)&&(a=0.1);var e=u.p();M(e,0,0,!0);e.lineTo(1*b,0);e.lineTo(1*b,1*c);e.lineTo(0,1*c);P(e);M(e,d*b,0,!1);e.lineTo(d*b,1*c);e.moveTo(0,a*c);e.lineTo(1*b,a*c);e.ab(!1);b=e.o;b.A=new L(d,a);b.B=Vb;u.q(e);return b},Junction:function(a,b,c){a=u.p();var d=1/Math.SQRT2,e=(1-1/Math.SQRT2)/2,f=0.5*K.ta;M(a,1*b,0.5*c,!0);O(a,1*b,(0.5+f)*c,(0.5+f)*b,1*c,0.5*b,1*c);O(a,(0.5-f)*b,1*c,0,(0.5+f)*c,0,0.5*c);O(a,0,(0.5-f)*c,(0.5-f)*b,0,0.5*b,0);O(a,(0.5+f)*b,0,1*b,(0.5-f)*c,1*b,0.5*c);M(a,(e+d)*b,(e+d)*c,!1);a.lineTo(e*b,e*c);a.moveTo(e*b,(e+d)*c);a.lineTo((e+d)*b,e*c);a.ab(!1);b=a.o;b.Dd=sh;u.q(a);return b},LinedDocument:function(a,b,c){c/=0.8;a=u.p();M(a,0,0.7*c,!0);a.lineTo(0,0);a.lineTo(1*b,0);a.lineTo(1*b,0.7*c);O(a,0.5*b,0.4*c,0.5*b,1*c,0,0.7*c);P(a);M(a,0.1*b,0,!1);a.lineTo(0.1*b,0.75*c);a.ab(!1);b=a.o;b.A=new L(0.1,0);b.B=new L(1,0.6);u.q(a);return b},LoopLimit:function(a,b,c){a=u.p();M(a,0,1*c,!0);a.lineTo(0,0.25*c);a.lineTo(0.25*b,0);a.lineTo(0.75*b,0);a.lineTo(1*b,0.25*c);a.lineTo(1*b,1*c);P(a);b=a.o;b.A=new L(0,0.25);b.B=Vb;u.q(a);return b},SequentialData:"MagneticTape",MagneticTape:function(a,b,c){a=u.p();var d=0.5*K.ta;M(a,0.5*b,1*c,!0);O(a,(0.5-d)*b,1*c,0,(0.5+d)*c,0,0.5*c);O(a,0,(0.5-d)*c,(0.5-d)*b,0,0.5*b,0);O(a,(0.5+d)*b,0,1*b,(0.5-d)*c,1*b,0.5*c);O(a,1*b,(0.5+d)*c,(0.5+d)*b,0.9*c,0.6*b,0.9*c);a.lineTo(1*b,0.9*c);a.lineTo(1*b,1*c);a.lineTo(0.5*b,1*c);b=a.o;b.A=new L(0.15,0.15);b.B=new L(0.85,0.8);u.q(a);return b},ManualInput:function(a,b,c){a=u.p();M(a,1*b,0,!0);a.lineTo(1*b,1*c);a.lineTo(0,1*c);a.lineTo(0,0.25*c);P(a);b=a.o;b.A=new L(0,0.25);b.B=Vb;u.q(a);return b},MessageFromUser:function(a,b,c){a=a?a.vc:NaN;isNaN(a)&&(a=0.7);var d=u.p();M(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(a*b,0.5*c);d.lineTo(1*b,1*c);d.lineTo(0,1*c);P(d);b=d.o;b.A=xb;b.B=new L(a,1);u.q(d);return b},MicroformProcessing:function(a,b,c){a=a?a.vc:NaN;isNaN(a)&&(a=0.25);var d=u.p();M(d,0,0,!0);d.lineTo(0.5*b,a*c);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0.5*b,(1-a)*c);d.lineTo(0,1*c);P(d);b=d.o;b.A=new L(0,a);b.B=new L(1,1-a);u.q(d);return b},MicroformRecording:function(a,b,c){a=u.p();M(a,0,0,!0);a.lineTo(0.75*b,0.25*c);a.lineTo(1*b,0.15*c);a.lineTo(1*b,0.85*c);a.lineTo(0.75*b,0.75*c);a.lineTo(0,1*c);P(a);b=a.o;b.A=new L(0,0.25);b.B=new L(1,0.75);u.q(a);return b},MultiDocument:function(a,b,c){c/=0.8;a=u.p();M(a,b,0,!0);a.lineTo(b,0.5*c);O(a,0.96*b,0.47*c,0.93*b,0.45*c,0.9*b,0.44*c);a.lineTo(0.9*b,0.6*c);O(a,0.86*b,0.57*c,0.83*b,0.55*c,0.8*b,0.54*c);a.lineTo(0.8*b,0.7*c);O(a,0.4*b,0.4*c,0.4*b,1*c,0,0.7*c);a.lineTo(0,0.2*c);a.lineTo(0.1*b,0.2*c);a.lineTo(0.1*b,0.1*c);a.lineTo(0.2*b,0.1*c);a.lineTo(0.2*b,0);P(a);M(a,0.1*b,0.2*c,!1);a.lineTo(0.8*b,0.2*c);a.lineTo(0.8*b,0.54*c);a.moveTo(0.2*b,0.1*c);a.lineTo(0.9*b,0.1*c);a.lineTo(0.9*b,0.44*c);a.ab(!1);b=a.o;b.A=new L(0,0.25);b.B=new L(0.8,0.77);u.q(a);return b},MultiProcess:function(a,b,c){a=u.p();M(a,0.1*b,0.1*c,!0);a.lineTo(0.2*b,0.1*c);a.lineTo(0.2*b,0);a.lineTo(1*b,0);a.lineTo(1*b,0.8*c);a.lineTo(0.9*b,0.8*c);a.lineTo(0.9*b,0.9*c);a.lineTo(0.8*b,0.9*c);a.lineTo(0.8*b,1*c);a.lineTo(0,1*c);a.lineTo(0,0.2*c);a.lineTo(0.1*b,0.2*c);P(a);M(a,0.2*b,0.1*c,!1);a.lineTo(0.9*b,0.1*c);a.lineTo(0.9*b,0.8*c);a.moveTo(0.1*b,0.2*c);a.lineTo(0.8*b,0.2*c);a.lineTo(0.8*b,0.9*c);a.ab(!1);b=a.o;b.A=new L(0,0.2);b.B=new L(0.8,1);u.q(a);return b},OfflineStorage:function(a,b,c){a=a?a.vc:NaN;isNaN(a)&&(a=0.1);var d=1-a,e=u.p();M(e,0,0,!0);e.lineTo(1*b,0);e.lineTo(0.5*b,1*c);P(e);M(e,0.5*a*b,a*c,!1);e.lineTo((1-0.5*a)*b,a*c);e.ab(!1);b=e.o;b.A=new L(d/4+0.5*a,a);b.B=new L(3*d/4+0.5*a,a+0.5*d);u.q(e);return b},OffPageConnector:function(a,b,c){a=u.p();M(a,0,0,!0);a.lineTo(0.75*b,0);a.lineTo(1*b,0.5*c);a.lineTo(0.75*b,1*c);a.lineTo(0,1*c);P(a);b=a.o;b.A=xb;b.B=new L(0.75,1);u.q(a);return b},Or:function(a,b,c){a=u.p();var d=0.5*K.ta; + M(a,1*b,0.5*c,!0);O(a,1*b,(0.5+d)*c,(0.5+d)*b,1*c,0.5*b,1*c);O(a,(0.5-d)*b,1*c,0,(0.5+d)*c,0,0.5*c);O(a,0,(0.5-d)*c,(0.5-d)*b,0,0.5*b,0);O(a,(0.5+d)*b,0,1*b,(0.5-d)*c,1*b,0.5*c);M(a,1*b,0.5*c,!1);a.lineTo(0,0.5*c);a.moveTo(0.5*b,1*c);a.lineTo(0.5*b,0);a.ab(!1);b=a.o;b.Dd=sh;u.q(a);return b},PaperTape:function(a,b,c){c/=0.8;a=u.p();M(a,0,0.7*c,!0);a.lineTo(0,0.3*c);O(a,0.5*b,0.6*c,0.5*b,0,1*b,0.3*c);a.lineTo(1*b,0.7*c);O(a,0.5*b,0.4*c,0.5*b,1*c,0,0.7*c);P(a);b=a.o;b.A=new L(0,0.49);b.B=new L(1,0.75);u.q(a);return b},PrimitiveFromCall:function(a,b,c){var d=a?a.vc:NaN;a=a?a.ft:NaN;isNaN(d)&&(d=0.1);isNaN(a)&&(a=0.3);var e=u.p();M(e,0,0,!0);e.lineTo(1*b,0);e.lineTo((1-a)*b,0.5*c);e.lineTo(1*b,1*c);e.lineTo(0,1*c);P(e);b=e.o;b.A=new L(d,0);b.B=new L(1-a,1);u.q(e);return b},PrimitiveToCall:function(a,b,c){var d=a?a.vc:NaN;a=a?a.ft:NaN;isNaN(d)&&(d=0.1);isNaN(a)&&(a=0.3);var e=u.p();M(e,0,0,!0);e.lineTo((1-a)*b,0);e.lineTo(1*b,0.5*c);e.lineTo((1-a)*b,1*c);e.lineTo(0,1*c);P(e);b=e.o;b.A=new L(d,0);b.B=new L(1-a,1);u.q(e);return b},Subroutine:"Procedure",Procedure:function(a,b,c){a=a?a.vc:NaN;isNaN(a)&&(a=0.1);var d=u.p();M(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c);P(d);M(d,(1-a)*b,0,!1);d.lineTo((1-a)*b,1*c);d.moveTo(a*b,0);d.lineTo(a*b,1*c);d.ab(!1);b=d.o;b.A=new L(a,0);b.B=new L(1-a,1);u.q(d);return b},Process:function(a,b,c){a=a?a.vc:NaN;isNaN(a)&&(a=0.1);var d=u.p();M(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c);P(d);M(d,a*b,0,!1);d.lineTo(a*b,1*c);d.ab(!1);b=d.o;b.A=new L(a,0);b.B=Vb;u.q(d);return b},Sort:function(a,b,c){a=u.p();M(a,0.5*b,0,!0);a.lineTo(1*b,0.5*c);a.lineTo(0.5*b,1*c);a.lineTo(0,0.5*c);P(a);M(a,0,0.5*c,!1);a.lineTo(1*b,0.5*c);a.ab(!1);b=a.o;b.A=new L(0.25,0.25);b.B=new L(0.75,0.5);u.q(a);return b},Start:function(a,b,c){a=u.p();M(a,0.25*b,0,!0);M(a,0.25*b,0,!0);a.arcTo(270,180,0.75*b,0.5*c,0.25*b,0.5*c);a.arcTo(90,180,0.25*b,0.5*c,0.25*b,0.5*c);M(a,0.25*b,0,!1);a.lineTo(0.25*b,1*c);a.moveTo(0.75*b,0);a.lineTo(0.75*b,1*c);a.ab(!1);b=a.o;b.A=new L(0.25,0);b.B=new L(0.75,1);u.q(a);return b},Terminator:function(a,b,c){a=u.p();M(a,0.25*b,0,!0);a.arcTo(270,180,0.75*b,0.5*c,0.25*b,0.5*c);a.arcTo(90,180,0.25*b,0.5*c,0.25*b,0.5*c);b=a.o;b.A=new L(0.23,0);b.B=new L(0.77,1);u.q(a);return b},TransmittalTape:function(a,b,c){a=a?a.vc:NaN;isNaN(a)&&(a=0.1);var d=u.p();M(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0.75*b,(1-a)*c);d.lineTo(0,(1-a)*c);P(d);b=d.o;b.A=xb;b.B=new L(1,1-a);u.q(d);return b},AndGate:function(a,b,c){a=u.p();var d=0.5*K.ta;M(a,0,0,!0);a.lineTo(0.5*b,0);O(a,(0.5+d)*b,0,1*b,(0.5-d)*c,1*b,0.5*c);O(a,1*b,(0.5+d)*c,(0.5+d)*b,1*c,0.5*b,1*c);a.lineTo(0,1*c);P(a);b=a.o;b.A=xb;b.B=new L(0.55,1);u.q(a);return b},Buffer:function(a,b,c){a=u.p();M(a,0,0,!0);a.lineTo(1*b,0.5*c);a.lineTo(0,1*c);P(a);b=a.o;b.A=new L(0,0.25);b.B=new L(0.5,0.75);u.q(a);return b},Clock:function(a,b,c){a=u.p();var d=0.5*K.ta;M(a,1*b,0.5*c,!0);O(a,1*b,(0.5+d)*c,(0.5+d)*b,1*c,0.5*b,1*c);O(a,(0.5-d)*b,1*c,0,(0.5+d)*c,0,0.5*c);O(a,0,(0.5-d)*c,(0.5-d)*b,0,0.5*b,0);O(a,(0.5+d)*b,0,1*b,(0.5-d)*c,1*b,0.5*c);M(a,1*b,0.5*c,!1);a.lineTo(1*b,0.5*c);M(a,0.8*b,0.75*c,!1);a.lineTo(0.8*b,0.25*c);a.lineTo(0.6*b,0.25*c);a.lineTo(0.6*b,0.75*c);a.lineTo(0.4*b,0.75*c);a.lineTo(0.4*b,0.25*c);a.lineTo(0.2*b,0.25*c);a.lineTo(0.2*b,0.75*c);a.ab(!1);b=a.o;b.Dd=sh;u.q(a);return b},Ground:function(a,b,c){a=u.p();M(a,0.5*b,0,!1);a.lineTo(0.5*b,0.4*c);a.moveTo(0.2*b,0.6*c);a.lineTo(0.8*b,0.6*c);a.moveTo(0.3*b,0.8*c);a.lineTo(0.7*b,0.8*c);a.moveTo(0.4*b,1*c);a.lineTo(0.6*b,1*c);b=a.o;u.q(a);return b},Inverter:function(a,b,c){a=u.p();var d=0.1*K.ta;M(a,0.8*b,0.5*c,!0);a.lineTo(0,1*c);a.lineTo(0,0);a.lineTo(0.8*b,0.5*c);M(a,1*b,0.5*c,!0);O(a,1*b,(0.5+d)*c,(0.9+d)*b,0.6*c,0.9*b,0.6*c);O(a,(0.9-d)*b,0.6*c,0.8*b,(0.5+d)*c,0.8*b,0.5*c);O(a,0.8*b,(0.5-d)*c,(0.9-d)*b,0.4*c,0.9*b,0.4*c);O(a,(0.9+d)*b,0.4*c,1*b,(0.5-d)*c,1*b,0.5*c);b=a.o;b.A=new L(0,0.25);b.B=new L(0.4,0.75);u.q(a);return b},NandGate:function(a,b,c){a=u.p();var d=K.ta,e=0.5*d,f=0.4*d,d=0.1*d;M(a,0.8*b,0.5*c,!0);O(a,0.8*b,(0.5+f)*c,(0.4+e)*b,1*c,0.4*b,1*c);a.lineTo(0,1*c);a.lineTo(0,0);a.lineTo(0.4*b,0);O(a,(0.4+e)*b,0,0.8*b,(0.5-f)*c,0.8*b,0.5*c);M(a,1*b,0.5*c,!0);O(a,1*b,(0.5+d)*c,(0.9+d)*b,0.6*c,0.9*b,0.6*c);O(a,(0.9-d)*b,0.6*c,0.8*b,(0.5+d)*c,0.8*b,0.5*c);O(a,0.8*b,(0.5-d)*c,(0.9-d)*b,0.4*c,0.9*b,0.4*c);O(a,(0.9+d)*b,0.4*c,1*b,(0.5-d)*c,1*b,0.5*c);b=a.o;b.A=new L(0,0.05);b.B=new L(0.55,0.95);u.q(a);return b},NorGate:function(a,b,c){a=u.p();var d=K.ta,e=0.5,f=d*e,h=0,k=0.5;M(a,0.8*b,0.5*c,!0);O(a,0.7*b,(k+f)*c,(h+f)*b,(k+e)*c,0,1*c);O(a,0.25*b,0.75*c,0.25*b,0.25*c,0,0);O(a,(h+f)*b,(k-e)*c,0.7*b,(k-f)*c,0.8*b,0.5*c);e=0.1;f=0.1*d;h=0.9;k=0.5;M(a,(h-e)*b,k*c,!0);O(a,(h-e)*b,(k-f)*c,(h-f)*b,(k-e)*c,h*b,(k-e)*c);O(a,(h+f)*b,(k-e)*c,(h+e)*b,(k-f)*c,(h+e)*b,k*c);O(a,(h+e)*b,(k+f)*c,(h+f)*b,(k+e)*c,h*b,(k+e)*c);O(a,(h-f)*b,(k+e)*c,(h-e)*b,(k+f)*c,(h-e)*b,k*c);b=a.o;b.A=new L(0.2,0.25);b.B=new L(0.6,0.75);u.q(a);return b},OrGate:function(a,b,c){a=u.p();var d=0.5*K.ta; + M(a,0,0,!0);O(a,(0+d+d)*b,0*c,0.8*b,(0.5-d)*c,1*b,0.5*c);O(a,0.8*b,(0.5+d)*c,(0+d+d)*b,1*c,0,1*c);O(a,0.25*b,0.75*c,0.25*b,0.25*c,0,0);P(a);b=a.o;b.A=new L(0.2,0.25);b.B=new L(0.75,0.75);u.q(a);return b},XnorGate:function(a,b,c){a=u.p();var d=K.ta,e=0.5,f=d*e,h=0.2,k=0.5;M(a,0.1*b,0,!1);O(a,0.35*b,0.25*c,0.35*b,0.75*c,0.1*b,1*c);M(a,0.8*b,0.5*c,!0);O(a,0.7*b,(k+f)*c,(h+f)*b,(k+e)*c,0.2*b,1*c);O(a,0.45*b,0.75*c,0.45*b,0.25*c,0.2*b,0);O(a,(h+f)*b,(k-e)*c,0.7*b,(k-f)*c,0.8*b,0.5*c);e=0.1;f=0.1*d;h=0.9;k=0.5;M(a,(h-e)*b,k*c,!0);O(a,(h-e)*b,(k-f)*c,(h-f)*b,(k-e)*c,h*b,(k-e)*c);O(a,(h+f)*b,(k-e)*c,(h+e)*b,(k-f)*c,(h+e)*b,k*c);O(a,(h+e)*b,(k+f)*c,(h+f)*b,(k+e)*c,h*b,(k+e)*c);O(a,(h-f)*b,(k+e)*c,(h-e)*b,(k+f)*c,(h-e)*b,k*c);b=a.o;b.A=new L(0.4,0.25);b.B=new L(0.65,0.75);u.q(a);return b},XorGate:function(a,b,c){a=u.p();var d=0.5*K.ta;M(a,0.1*b,0,!1);O(a,0.35*b,0.25*c,0.35*b,0.75*c,0.1*b,1*c);M(a,0.2*b,0,!0);O(a,(0.2+d)*b,0*c,0.9*b,(0.5-d)*c,1*b,0.5*c);O(a,0.9*b,(0.5+d)*c,(0.2+d)*b,1*c,0.2*b,1*c);O(a,0.45*b,0.75*c,0.45*b,0.25*c,0.2*b,0);P(a);b=a.o;b.A=new L(0.4,0.25);b.B=new L(0.8,0.75);u.q(a);return b},Capacitor:function(a,b,c){a=u.p();M(a,0,0,!1);a.lineTo(0,1*c);a.moveTo(1*b,0);a.lineTo(1*b,1*c);b=a.o;u.q(a);return b},Resistor:function(a,b,c){a=u.p();M(a,0,0.5*c,!1);a.lineTo(0.1*b,0);a.lineTo(0.2*b,1*c);a.lineTo(0.3*b,0);a.lineTo(0.4*b,1*c);a.lineTo(0.5*b,0);a.lineTo(0.6*b,1*c);a.lineTo(0.7*b,0.5*c);b=a.o;u.q(a);return b},Inductor:function(a,b,c){a=u.p();var d=0.1*K.ta,e=0.1;M(a,(e-0.5*d)*b,c,!1);O(a,(e-d)*b,c,(e-0.1)*b,0,(e+0.1)*b,0);e=0.3;O(a,(e+0.1)*b,0,(e+d)*b,c,e*b,c);O(a,(e-d)*b,c,(e-0.1)*b,0,(e+0.1)*b,0);e=0.5;O(a,(e+0.1)*b,0,(e+d)*b,c,e*b,c);O(a,(e-d)*b,c,(e-0.1)*b,0,(e+0.1)*b,0);e=0.7;O(a,(e+0.1)*b,0,(e+d)*b,c,e*b,c);O(a,(e-d)*b,c,(e-0.1)*b,0,(e+0.1)*b,0);e=0.9;O(a,(e+0.1)*b,0,(e+d)*b,c,(e+0.5*d)*b,c);b=a.o;u.q(a);return b},ACvoltageSource:function(a,b,c){a=u.p();var d=0.5*K.ta;M(a,0*b,0.5*c,!1);O(a,0*b,(0.5-d)*c,(0.5-d)*b,0*c,0.5*b,0*c);O(a,(0.5+d)*b,0*c,1*b,(0.5-d)*c,1*b,0.5*c);O(a,1*b,(0.5+d)*c,(0.5+d)*b,1*c,0.5*b,1*c);O(a,(0.5-d)*b,1*c,0*b,(0.5+d)*c,0*b,0.5*c);a.moveTo(0.1*b,0.5*c);O(a,0.5*b,0*c,0.5*b,1*c,0.9*b,0.5*c);b=a.o;b.Dd=sh;u.q(a);return b},DCvoltageSource:function(a,b,c){a=u.p();M(a,0,0.75*c,!1);a.lineTo(0,0.25*c);a.moveTo(1*b,0);a.lineTo(1*b,1*c);b=a.o;u.q(a);return b},Diode:function(a,b,c){a=u.p();M(a,1*b,0,!1);a.lineTo(1*b,0.5*c);a.lineTo(0,1*c);a.lineTo(0,0);a.lineTo(1*b,0.5*c);a.lineTo(1*b,1*c);b=a.o;b.A=new L(0,0.25);b.B=new L(0.5,0.75);u.q(a);return b},Wifi:function(a,b,c){var d=b,e=c;b*=0.38;c*=0.6;a=u.p();var f=K.ta,h=0.8*f,k=0.8,l=0,m=0.5,d=(d-b)/2,e=(e-c)/2;M(a,l*b+d,(m+k)*c+e,!0);O(a,(l-h)*b+d,(m+k)*c+e,(l-k)*b+d,(m+h)*c+e,(l-k)*b+d,m*c+e);O(a,(l-k)*b+d,(m-h)*c+e,(l-h)*b+d,(m-k)*c+e,l*b+d,(m-k)*c+e);O(a,l*b+d,(m-k)*c+e,(l-k+0.5*h)*b+d,(m-h)*c+e,(l-k+0.5*h)*b+d,m*c+e);O(a,(l-k+0.5*h)*b+d,(m+h)*c+e,l*b+d,(m+k)*c+e,l*b+d,(m+k)*c+e);P(a);h=0.4*f;k=0.4;l=0.2;m=0.5;M(a,l*b+d,(m+k)*c+e,!0);O(a,(l-h)*b+d,(m+k)*c+e,(l-k)*b+d,(m+h)*c+e,(l-k)*b+d,m*c+e);O(a,(l-k)*b+d,(m-h)*c+e,(l-h)*b+d,(m-k)*c+e,l*b+d,(m-k)*c+e);O(a,l*b+d,(m-k)*c+e,(l-k+0.5*h)*b+d,(m-h)*c+e,(l-k+0.5*h)*b+d,m*c+e);O(a,(l-k+0.5*h)*b+d,(m+h)*c+e,l*b+d,(m+k)*c+e,l*b+d,(m+k)*c+e);P(a);h=0.2*f;k=0.2;m=l=0.5;M(a,(l-k)*b+d,m*c+e,!0);O(a,(l-k)*b+d,(m-h)*c+e,(l-h)*b+d,(m-k)*c+e,l*b+d,(m-k)*c+e);O(a,(l+h)*b+d,(m-k)*c+e,(l+k)*b+d,(m-h)*c+e,(l+k)*b+d,m*c+e);O(a,(l+k)*b+d,(m+h)*c+e,(l+h)*b+d,(m+k)*c+e,l*b+d,(m+k)*c+e);O(a,(l-h)*b+d,(m+k)*c+e,(l-k)*b+d,(m+h)*c+e,(l-k)*b+d,m*c+e);h=0.4*f;k=0.4;l=0.8;m=0.5;M(a,l*b+d,(m-k)*c+e,!0);O(a,(l+h)*b+d,(m-k)*c+e,(l+k)*b+d,(m-h)*c+e,(l+k)*b+d,m*c+e);O(a,(l+k)*b+d,(m+h)*c+e,(l+h)*b+d,(m+k)*c+e,l*b+d,(m+k)*c+e);O(a,l*b+d,(m+k)*c+e,(l+k-0.5*h)*b+d,(m+h)*c+e,(l+k-0.5*h)*b+d,m*c+e);O(a,(l+k-0.5*h)*b+d,(m-h)*c+e,l*b+d,(m-k)*c+e,l*b+d,(m-k)*c+e);P(a);h=0.8*f;k=0.8;l=1;m=0.5;M(a,l*b+d,(m-k)*c+e,!0);O(a,(l+h)*b+d,(m-k)*c+e,(l+k)*b+d,(m-h)*c+e,(l+k)*b+d,m*c+e);O(a,(l+k)*b+d,(m+h)*c+e,(l+h)*b+d,(m+k)*c+e,l*b+d,(m+k)*c+e);O(a,l*b+d,(m+k)*c+e,(l+k-0.5*h)*b+d,(m+h)*c+e,(l+k-0.5*h)*b+d,m*c+e);O(a,(l+k-0.5*h)*b+d,(m-h)*c+e,l*b+d,(m-k)*c+e,l*b+d,(m-k)*c+e);P(a);b=a.o;u.q(a);return b},Email:function(a,b,c){a=u.p();M(a,0,0,!0);a.lineTo(1*b,0);a.lineTo(1*b,1*c);a.lineTo(0,1*c);a.lineTo(0,0);P(a);M(a,0,0,!1);a.lineTo(0.5*b,0.6*c);a.lineTo(1*b,0);a.moveTo(0,1*c);a.lineTo(0.45*b,0.54*c);a.moveTo(1*b,1*c);a.lineTo(0.55*b,0.54*c);a.ab(!1);b=a.o;u.q(a);return b},Ethernet:function(a,b,c){a=u.p();M(a,0.35*b,0,!0);a.lineTo(0.65*b,0);a.lineTo(0.65*b,0.4*c);a.lineTo(0.35*b,0.4*c);a.lineTo(0.35*b,0);P(a);M(a,0.1*b,1*c,!0,!0);a.lineTo(0.4*b,1*c);a.lineTo(0.4*b,0.6*c);a.lineTo(0.1*b,0.6*c);a.lineTo(0.1*b,1*c);P(a);M(a,0.6*b,1*c,!0,!0);a.lineTo(0.9*b,1*c);a.lineTo(0.9*b,0.6*c);a.lineTo(0.6*b,0.6*c);a.lineTo(0.6*b,1*c);P(a);M(a,0,0.5*c,!1);a.lineTo(1*b,0.5*c);a.moveTo(0.5*b,0.5*c);a.lineTo(0.5*b,0.4*c);a.moveTo(0.75*b,0.5*c);a.lineTo(0.75*b,0.6*c);a.moveTo(0.25*b,0.5*c);a.lineTo(0.25*b,0.6*c);a.ab(!1);b=a.o;u.q(a);return b},Power:function(a,b,c){a=u.p(); + var d=K.ta,e=0.4*d,f=0.4,h=u.K(),k=u.K(),l=u.K(),m=u.K();K.Bi(0.5,0.5-f,0.5+e,0.5-f,0.5+f,0.5-e,0.5+f,0.5,0.5,h,h,k,l,m);var n=u.Yb(k.x,k.y);M(a,k.x*b,k.y*c,!0);O(a,l.x*b,l.y*c,m.x*b,m.y*c,(0.5+f)*b,0.5*c);O(a,(0.5+f)*b,(0.5+e)*c,(0.5+e)*b,(0.5+f)*c,0.5*b,(0.5+f)*c);O(a,(0.5-e)*b,(0.5+f)*c,(0.5-f)*b,(0.5+e)*c,(0.5-f)*b,0.5*c);K.Bi(0.5-f,0.5,0.5-f,0.5-e,0.5-e,0.5-f,0.5,0.5-f,0.5,l,m,k,h,h);O(a,l.x*b,l.y*c,m.x*b,m.y*c,k.x*b,k.y*c);e=0.3*d;f=0.3;K.Bi(0.5-f,0.5,0.5-f,0.5-e,0.5-e,0.5-f,0.5,0.5-f,0.5,l,m,k,h,h);a.lineTo(k.x*b,k.y*c);O(a,m.x*b,m.y*c,l.x*b,l.y*c,(0.5-f)*b,0.5*c);O(a,(0.5-f)*b,(0.5+e)*c,(0.5-e)*b,(0.5+f)*c,0.5*b,(0.5+f)*c);O(a,(0.5+e)*b,(0.5+f)*c,(0.5+f)*b,(0.5+e)*c,(0.5+f)*b,0.5*c);K.Bi(0.5,0.5-f,0.5+e,0.5-f,0.5+f,0.5-e,0.5+f,0.5,0.5,h,h,k,l,m);O(a,m.x*b,m.y*c,l.x*b,l.y*c,k.x*b,k.y*c);P(a);M(a,0.45*b,0,!0);a.lineTo(0.45*b,0.5*c);a.lineTo(0.55*b,0.5*c);a.lineTo(0.55*b,0);P(a);u.v(h);u.v(k);u.v(l);u.v(m);u.v(n);b=a.o;b.A=new L(0.25,0.55);b.B=new L(0.75,0.8);u.q(a);return b},Fallout:function(a,b,c){a=u.p();var d=0.5*K.ta;M(a,0*b,0.5*c,!0);O(a,0*b,(0.5-d)*c,(0.5-d)*b,0*c,0.5*b,0*c);O(a,(0.5+d)*b,0*c,1*b,(0.5-d)*c,1*b,0.5*c);O(a,1*b,(0.5+d)*c,(0.5+d)*b,1*c,0.5*b,1*c);O(a,(0.5-d)*b,1*c,0*b,(0.5+d)*c,0*b,0.5*c);var e=d=0;M(a,(0.3+d)*b,(0.8+e)*c,!0,!0);a.lineTo((0.5+d)*b,(0.5+e)*c);a.lineTo((0.1+d)*b,(0.5+e)*c);a.lineTo((0.3+d)*b,(0.8+e)*c);d=0.4;e=0;P(a);M(a,(0.3+d)*b,(0.8+e)*c,!0,!0);a.lineTo((0.5+d)*b,(0.5+e)*c);a.lineTo((0.1+d)*b,(0.5+e)*c);a.lineTo((0.3+d)*b,(0.8+e)*c);d=0.2;e=-0.3;P(a);M(a,(0.3+d)*b,(0.8+e)*c,!0,!0);a.lineTo((0.5+d)*b,(0.5+e)*c);a.lineTo((0.1+d)*b,(0.5+e)*c);a.lineTo((0.3+d)*b,(0.8+e)*c);P(a);b=a.o;b.Dd=sh;u.q(a);return b},IrritationHazard:function(a,b,c){a=u.p();M(a,0.2*b,0*c,!0);a.lineTo(0.5*b,0.3*c);a.lineTo(0.8*b,0*c);a.lineTo(1*b,0.2*c);a.lineTo(0.7*b,0.5*c);a.lineTo(1*b,0.8*c);a.lineTo(0.8*b,1*c);a.lineTo(0.5*b,0.7*c);a.lineTo(0.2*b,1*c);a.lineTo(0*b,0.8*c);a.lineTo(0.3*b,0.5*c);a.lineTo(0*b,0.2*c);P(a);b=a.o;b.A=new L(0.3,0.3);b.B=new L(0.7,0.7);u.q(a);return b},ElectricalHazard:function(a,b,c){a=u.p();M(a,0.37*b,0*c,!0);a.lineTo(0.5*b,0.11*c);a.lineTo(0.77*b,0.04*c);a.lineTo(0.33*b,0.49*c);a.lineTo(1*b,0.37*c);a.lineTo(0.63*b,0.86*c);a.lineTo(0.77*b,0.91*c);a.lineTo(0.34*b,1*c);a.lineTo(0.34*b,0.78*c);a.lineTo(0.44*b,0.8*c);a.lineTo(0.65*b,0.56*c);a.lineTo(0*b,0.68*c);P(a);b=a.o;u.q(a);return b},FireHazard:function(a,b,c){a=u.p();M(a,0.1*b,1*c,!0);O(a,-0.25*b,0.63*c,0.45*b,0.44*c,0.29*b,0*c);O(a,0.48*b,0.17*c,0.54*b,0.35*c,0.51*b,0.42*c);O(a,0.59*b,0.29*c,0.58*b,0.28*c,0.59*b,0.18*c);O(a,0.8*b,0.34*c,0.88*b,0.43*c,0.75*b,0.6*c);O(a,0.87*b,0.48*c,0.88*b,0.43*c,0.88*b,0.31*c);O(a,1.17*b,0.76*c,0.82*b,0.8*c,0.9*b,1*c);P(a);b=a.o;b.A=new L(0.05,0.645);b.B=new L(0.884,0.908);u.q(a);return b},BpmnActivityLoop:function(a,b,c){a=u.p();var d=4*(Math.SQRT2-1)/3*0.5;M(a,0.65*b,1*c,!1);O(a,(1-d+0)*b,1*c,1*b,(0.5+d+0)*c,1*b,0.5*c);O(a,1*b,(0.5-d+0)*c,(0.5+d+0)*b,0*c,0.5*b,0*c);O(a,(0.5-d+0)*b,0*c,0*b,(0.5-d+0)*c,0*b,0.5*c);O(a,0*b,(0.5+d+0)*c,(0.5-d+0)*b,1*c,0.35*b,0.98*c);a.moveTo(0.25*b,0.8*c);a.lineTo(0.35*b,1*c);a.lineTo(0.1*b,1*c);b=a.o;u.q(a);return b},BpmnActivityParallel:function(a,b,c){a=u.p();M(a,0,0,!1);a.lineTo(0,1*c);a.moveTo(0.5*b,0);a.lineTo(0.5*b,1*c);a.moveTo(1*b,0);a.lineTo(1*b,1*c);b=a.o;u.q(a);return b},BpmnActivitySequential:function(a,b,c){a=u.p();M(a,0,0,!1);a.lineTo(1*b,0);a.moveTo(0,0.5*c);a.lineTo(1*b,0.5*c);a.moveTo(0,1*c);a.lineTo(1*b,1*c);b=a.o;u.q(a);return b},BpmnActivityAdHoc:function(a,b,c){a=u.p();M(a,0,0,!1);M(a,1*b,1*c,!1);M(a,0,0.5*c,!1);O(a,0.2*b,0.35*c,0.3*b,0.35*c,0.5*b,0.5*c);O(a,0.7*b,0.65*c,0.8*b,0.65*c,1*b,0.5*c);b=a.o;u.q(a);return b},BpmnActivityCompensation:function(a,b,c){a=u.p();M(a,0,0.5*c,!0);a.lineTo(0.5*b,0);a.lineTo(0.5*b,0.5*c);a.lineTo(1*b,1*c);a.lineTo(1*b,0);a.lineTo(0.5*b,0.5*c);a.lineTo(0.5*b,1*c);P(a);b=a.o;u.q(a);return b},BpmnTaskMessage:function(a,b,c){a=u.p();M(a,0,0.2*c,!0);a.lineTo(1*b,0.2*c);a.lineTo(1*b,0.8*c);a.lineTo(0,0.8*c);a.lineTo(0,0.8*c);P(a);M(a,0,0.2*c,!1);a.lineTo(0.5*b,0.5*c);a.lineTo(1*b,0.2*c);a.ab(!1);b=a.o;u.q(a);return b},BpmnTaskScript:function(a,b,c){a=u.p();M(a,0.7*b,1*c,!0);a.lineTo(0.3*b,1*c);O(a,0.6*b,0.5*c,0,0.5*c,0.3*b,0);a.lineTo(0.7*b,0);O(a,0.4*b,0.5*c,1*b,0.5*c,0.7*b,1*c);P(a);M(a,0.45*b,0.73*c,!1);a.lineTo(0.7*b,0.73*c);a.moveTo(0.38*b,0.5*c);a.lineTo(0.63*b,0.5*c);a.moveTo(0.31*b,0.27*c);a.lineTo(0.56*b,0.27*c);a.ab(!1);b=a.o;u.q(a);return b},BpmnTaskUser:function(a,b,c){a=u.p();M(a,0,0,!1);M(a,0.335*b,(1-0.555)*c,!0);a.lineTo(0.335*b,0.595*c);a.lineTo(0.665*b,0.595*c);a.lineTo(0.665*b,(1-0.555)*c);O(a,0.88*b,0.46*c,0.98*b,0.54*c,1*b,0.68*c);a.lineTo(1*b,1*c);a.lineTo(0,1*c);a.lineTo(0,0.68*c);O(a,0.02*b,0.54*c,0.12*b,0.46*c,0.335*b,(1-0.555)*c);a.lineTo(0.365*b,0.405*c);var d=0.5-0.285,e=Math.PI/4,f=4*(1-Math.cos(e))/(3*Math.sin(e)),e=f*d,f=f*d;O(a,(0.5-(e+d)/2)*b,(d+(d+f)/2)*c,(0.5-d)*b,(d+f)*c,(0.5-d)*b,d*c);O(a,(0.5-d)*b,(d-f)*c,(0.5-e)*b,(d-d)*c,0.5*b,(d-d)*c);O(a,(0.5+e)*b,(d-d)*c,(0.5+d)*b,(d-f)*c,(0.5+d)*b,d*c); + O(a,(0.5+d)*b,(d+f)*c,(0.5+(e+d)/2)*b,(d+(d+f)/2)*c,0.635*b,0.405*c);a.lineTo(0.635*b,0.405*c);a.lineTo(0.665*b,(1-0.555)*c);a.lineTo(0.665*b,0.595*c);a.lineTo(0.335*b,0.595*c);M(a,0.2*b,1*c,!1);a.lineTo(0.2*b,0.8*c);M(a,0.8*b,1*c,!1);a.lineTo(0.8*b,0.8*c);b=a.o;u.q(a);return b},BpmnEventConditional:function(a,b,c){a=u.p();M(a,0.1*b,0,!0);a.lineTo(0.9*b,0);a.lineTo(0.9*b,1*c);a.lineTo(0.1*b,1*c);P(a);M(a,0.2*b,0.2*c,!1);a.lineTo(0.8*b,0.2*c);a.moveTo(0.2*b,0.4*c);a.lineTo(0.8*b,0.4*c);a.moveTo(0.2*b,0.6*c);a.lineTo(0.8*b,0.6*c);a.moveTo(0.2*b,0.8*c);a.lineTo(0.8*b,0.8*c);a.ab(!1);b=a.o;u.q(a);return b},BpmnEventError:function(a,b,c){a=u.p();M(a,0,1*c,!0);a.lineTo(0.33*b,0);a.lineTo(0.66*b,0.5*c);a.lineTo(1*b,0);a.lineTo(0.66*b,1*c);a.lineTo(0.33*b,0.5*c);P(a);b=a.o;u.q(a);return b},BpmnEventEscalation:function(a,b,c){a=u.p();M(a,0,0,!1);M(a,1*b,1*c,!1);M(a,0.1*b,1*c,!0);a.lineTo(0.5*b,0);a.lineTo(0.9*b,1*c);a.lineTo(0.5*b,0.5*c);P(a);b=a.o;u.q(a);return b},BpmnEventTimer:function(a,b,c){a=u.p();var d=0.5*K.ta;M(a,1*b,0.5*c,!0);O(a,1*b,(0.5+d)*c,(0.5+d)*b,1*c,0.5*b,1*c);O(a,(0.5-d)*b,1*c,0,(0.5+d)*c,0,0.5*c);O(a,0,(0.5-d)*c,(0.5-d)*b,0,0.5*b,0);O(a,(0.5+d)*b,0,1*b,(0.5-d)*c,1*b,0.5*c);M(a,0.5*b,0,!1);a.lineTo(0.5*b,0.15*c);a.moveTo(0.5*b,1*c);a.lineTo(0.5*b,0.85*c);a.moveTo(0,0.5*c);a.lineTo(0.15*b,0.5*c);a.moveTo(1*b,0.5*c);a.lineTo(0.85*b,0.5*c);a.moveTo(0.5*b,0.5*c);a.lineTo(0.58*b,0.1*c);a.moveTo(0.5*b,0.5*c);a.lineTo(0.78*b,0.54*c);a.ab(!1);b=a.o;b.Dd=sh;u.q(a);return b}};for(var In in K.sg){K.sg[In.toLowerCase()]=In}K.Iv={"":"",Standard:"F1 m 0,0 l 8,4 -8,4 2,-4 z",Backward:"F1 m 8,0 l -2,4 2,4 -8,-4 z",Triangle:"F1 m 0,0 l 8,4.62 -8,4.62 z",BackwardTriangle:"F1 m 8,4 l 0,4 -8,-4 8,-4 0,4 z",Boomerang:"F1 m 0,0 l 8,4 -8,4 4,-4 -4,-4 z",BackwardBoomerang:"F1 m 8,0 l -8,4 8,4 -4,-4 4,-4 z",SidewaysV:"m 0,0 l 8,4 -8,4 0,-1 6,-3 -6,-3 0,-1 z",BackwardV:"m 8,0 l -8,4 8,4 0,-1 -6,-3 6,-3 0,-1 z",OpenTriangle:"m 0,0 l 8,4 -8,4",BackwardOpenTriangle:"m 8,0 l -8,4 8,4",OpenTriangleLine:"m 0,0 l 8,4 -8,4 m 8.5,0 l 0,-8",BackwardOpenTriangleLine:"m 8,0 l -8,4 8,4 m -8.5,0 l 0,-8",OpenTriangleTop:"m 0,0 l 8,4 m 0,4",BackwardOpenTriangleTop:"m 8,0 l -8,4 m 0,4",OpenTriangleBottom:"m 0,8 l 8,-4",BackwardOpenTriangleBottom:"m 0,4 l 8,4",HalfTriangleTop:"F1 m 0,0 l 0,4 8,0 z m 0,8",BackwardHalfTriangleTop:"F1 m 8,0 l 0,4 -8,0 z m 0,8",HalfTriangleBottom:"F1 m 0,4 l 0,4 8,-4 z",BackwardHalfTriangleBottom:"F1 m 8,4 l 0,4 -8,-4 z",ForwardSemiCircle:"m 4,0 b 270 180 0 4 4",BackwardSemiCircle:"m 4,8 b 90 180 0 -4 4",Feather:"m 0,0 l 3,4 -3,4",BackwardFeather:"m 3,0 l -3,4 3,4",DoubleFeathers:"m 0,0 l 3,4 -3,4 m 3,-8 l 3,4 -3,4",BackwardDoubleFeathers:"m 3,0 l -3,4 3,4 m 3,-8 l -3,4 3,4",TripleFeathers:"m 0,0 l 3,4 -3,4 m 3,-8 l 3,4 -3,4 m 3,-8 l 3,4 -3,4",BackwardTripleFeathers:"m 3,0 l -3,4 3,4 m 3,-8 l -3,4 3,4 m 3,-8 l -3,4 3,4",ForwardSlash:"m 0,8 l 5,-8",BackSlash:"m 0,0 l 5,8",DoubleForwardSlash:"m 0,8 l 4,-8 m -2,8 l 4,-8",DoubleBackSlash:"m 0,0 l 4,8 m -2,-8 l 4,8",TripleForwardSlash:"m 0,8 l 4,-8 m -2,8 l 4,-8 m -2,8 l 4,-8",TripleBackSlash:"m 0,0 l 4,8 m -2,-8 l 4,8 m -2,-8 l 4,8",Fork:"m 0,4 l 8,0 m -8,0 l 8,-4 m -8,4 l 8,4",BackwardFork:"m 8,4 l -8,0 m 8,0 l -8,-4 m 8,4 l -8,4",LineFork:"m 0,0 l 0,8 m 0,-4 l 8,0 m -8,0 l 8,-4 m -8,4 l 8,4",BackwardLineFork:"m 8,4 l -8,0 m 8,0 l -8,-4 m 8,4 l -8,4 m 8,-8 l 0,8",CircleFork:"F1 m 6,4 b 0 360 -3 0 3 z m 0,0 l 6,0 m -6,0 l 6,-4 m -6,4 l 6,4",BackwardCircleFork:"F1 m 0,4 l 6,0 m -6,-4 l 6,4 m -6,4 l 6,-4 m 6,0 b 0 360 -3 0 3",CircleLineFork:"F1 m 6,4 b 0 360 -3 0 3 z m 1,-4 l 0,8 m 0,-4 l 6,0 m -6,0 l 6,-4 m -6,4 l 6,4",BackwardCircleLineFork:"F1 m 0,4 l 6,0 m -6,-4 l 6,4 m -6,4 l 6,-4 m 0,-4 l 0,8 m 7,-4 b 0 360 -3 0 3",Circle:"F1 m 8,4 b 0 360 -4 0 4 z",Block:"F1 m 0,0 l 0,8 8,0 0,-8 z",StretchedDiamond:"F1 m 0,3 l 5,-3 5,3 -5,3 -5,-3 z",Diamond:"F1 m 0,4 l 4,-4 4,4 -4,4 -4,-4 z",Chevron:"F1 m 0,0 l 5,0 3,4 -3,4 -5,0 3,-4 -3,-4 z",StretchedChevron:"F1 m 0,0 l 8,0 3,4 -3,4 -8,0 3,-4 -3,-4 z",NormalArrow:"F1 m 0,2 l 4,0 0,-2 4,4 -4,4 0,-2 -4,0 z",X:"m 0,0 l 8,8 m 0,-8 l -8,8",TailedNormalArrow:"F1 m 0,0 l 2,0 1,2 3,0 0,-2 2,4 -2,4 0,-2 -3,0 -1,2 -2,0 1,-4 -1,-4 z",DoubleTriangle:"F1 m 0,0 l 4,4 -4,4 0,-8 z m 4,0 l 4,4 -4,4 0,-8 z",BigEndArrow:"F1 m 0,0 l 5,2 0,-2 3,4 -3,4 0,-2 -5,2 0,-8 z",ConcaveTailArrow:"F1 m 0,2 h 4 v -2 l 4,4 -4,4 v -2 h -4 l 2,-2 -2,-2 z",RoundedTriangle:"F1 m 0,1 a 1,1 0 0 1 1,-1 l 7,3 a 0.5,1 0 0 1 0,2 l -7,3 a 1,1 0 0 1 -1,-1 l 0,-6 z",SimpleArrow:"F1 m 1,2 l -1,-2 2,0 1,2 -1,2 -2,0 1,-2 5,0 0,-2 2,2 -2,2 0,-2 z",AccelerationArrow:"F1 m 0,0 l 0,8 0.2,0 0,-8 -0.2,0 z m 2,0 l 0,8 1,0 0,-8 -1,0 z m 3,0 l 2,0 2,4 -2,4 -2,0 0,-8 z",BoxArrow:"F1 m 0,0 l 4,0 0,2 2,0 0,-2 2,4 -2,4 0,-2 -2,0 0,2 -4,0 0,-8 z",TriangleLine:"F1 m 8,4 l -8,-4 0,8 8,-4 z m 0.5,4 l 0,-8",CircleEndedArrow:"F1 m 10,4 l -2,-3 0,2 -2,0 0,2 2,0 0,2 2,-3 z m -4,0 b 0 360 -3 0 3 z",DynamicWidthArrow:"F1 m 0,3 l 2,0 2,-1 2,-2 2,4 -2,4 -2,-2 -2,-1 -2,0 0,-2 z",EquilibriumArrow:"m 0,3 l 8,0 -3,-3 m 3,5 l -8,0 3,3",FastForward:"F1 m 0,0 l 3.5,4 0,-4 3.5,4 0,-4 1,0 0,8 -1,0 0,-4 -3.5,4 0,-4 -3.5,4 0,-8 z",Kite:"F1 m 0,4 l 2,-4 6,4 -6,4 -2,-4 z",HalfArrowTop:"F1 m 0,0 l 4,4 4,0 -8,-4 z m 0,8",HalfArrowBottom:"F1 m 0,8 l 4,-4 4,0 -8,4 z",OpposingDirectionDoubleArrow:"F1 m 0,4 l 2,-4 0,2 4,0 0,-2 2,4 -2,4 0,-2 -4,0 0,2 -2,-4 z",PartialDoubleTriangle:"F1 m 0,0 4,3 0,-3 4,4 -4,4 0,-3 -4,3 0,-8 z",LineCircle:"F1 m 0,0 l 0,8 m 7 -4 b 0 360 -3 0 3 z",DoubleLineCircle:"F1 m 0,0 l 0,8 m 2,-8 l 0,8 m 7 -4 b 0 360 -3 0 3 z",TripleLineCircle:"F1 m 0,0 l 0,8 m 2,-8 l 0,8 m 2,-8 l 0,8 m 7 -4 b 0 360 -3 0 3 z",CircleLine:"F1 m 6 4 b 0 360 -3 0 3 z m 1,-4 l 0,8",DiamondCircle:"F1 m 8,4 l -4,4 -4,-4 4,-4 4,4 m 8,0 b 0 360 -4 0 4 z",PlusCircle:"F1 m 8,4 b 0 360 -4 0 4 l -8 0 z m -4 -4 l 0 8",OpenRightTriangleTop:"m 8,0 l 0,4 -8,0 m 0,4",OpenRightTriangleBottom:"m 8,8 l 0,-4 -8,0",Line:"m 0,0 l 0,8",DoubleLine:"m 0,0 l 0,8 m 2,0 l 0,-8",TripleLine:"m 0,0 l 0,8 m 2,0 l 0,-8 m 2,0 l 0,8",PentagonArrow:"F1 m 8,4 l -4,-4 -4,0 0,8 4,0 4,-4 z"}; + K.lI=function(){if(null!==K.Iv){for(var a in K.Iv){var b=sd(K.Iv[a],!1);K.Ri[a]=b;a.toLowerCase()!==a&&(K.Ri[a.toLowerCase()]=a)}K.Iv=null}};K.UC=function(a){K.lI();var b=K.Ri[a];if(void 0===b){b=a.toLowerCase();if("none"===b){return"None"}b=K.Ri[b]}return"string"===typeof b?b:b instanceof $c?a:null};function G(a){0===arguments.length?B.call(this):B.call(this,a);this.O=311807;this.wk=this.Wh="";this.wr=this.tr=this.Fr=this.zq=null;this.Hr="";this.Vh=this.Gr=this.fm=null;this.vr="";this.Xn=null;this.ur=(new ia(NaN,NaN)).freeze();this.xr="";this.Yn=null;this.je="";this.Du=this.Ip=this.kk=null;this.Og=(new w(NaN,NaN)).freeze();this.Gq="";this.zk=null;this.Hq=xb;this.Qq=K.fF;this.Jq=K.eF;this.Sp=null;this.Aq=Jn;this.im=(new w(6,6)).freeze();this.hm="gray";this.gm=4;this.BB=-1;this.qF=new z;this.Bk=null;this.kj=NaN}u.Ha(G,B);u.fa("Part",G);G.prototype.cloneProtected=function(a){B.prototype.cloneProtected.call(this,a);a.O=this.O&-4097|49152;a.Wh=this.Wh;a.wk=this.wk;a.zq=this.zq;a.Fr=this.Fr;a.tr=this.tr;a.wr=this.wr;a.Hr=this.Hr;a.Gr=this.Gr;a.Vh=null;a.vr=this.vr;a.ur.assign(this.ur);a.xr=this.xr;a.je=this.je;a.Ip=this.Ip;a.Og.assign(this.Og);a.Gq=this.Gq;a.Hq=this.Hq.Z();a.Qq=this.Qq.Z();a.Jq=this.Jq.Z();a.Sp=this.Sp;a.Aq=this.Aq;a.im.assign(this.im);a.hm=this.hm;a.gm=this.gm};G.prototype.Oh=function(a){B.prototype.Oh.call(this,a);a.dl();a.fm=null;a.Xn=null;a.Yn=null;a.zk=null;a.Bk=null};G.prototype.toString=function(){var a=u.tg(Object.getPrototypeOf(this))+"#"+u.Uc(this);null!==this.data&&(a+="("+de(this.data)+")");return a};G.LayoutNone=0;var Jj;G.LayoutAdded=Jj=1;var Rj;G.LayoutRemoved=Rj=2;G.LayoutShown=4;G.LayoutHidden=8;G.LayoutNodeSized=16;var Ik;G.LayoutGroupLayout=Ik=32;G.LayoutNodeReplaced=64;var Jn;G.LayoutStandard=Jn=Jj|Rj|28|Ik|64;G.LayoutAll=16777215;G.prototype.Pm=function(a,b,c,d,e,f,h){var k=this.g;null!==k&&(a===be&&"elements"===b?e instanceof B?Kj(e,function(a){Mj(k,a);Lj(k,a)}):e instanceof Ri&&uk(k,e):a===ce&&"elements"===b&&(e instanceof B?Kj(e,function(a){Qj(k,a);Pj(k,a)}):e instanceof Ri&&vk(k,e)),k.Cc(a,b,c,d,e,f,h))};G.prototype.updateTargetBindings=G.prototype.Ob=function(a){B.prototype.Ob.call(this,a);if(null!==this.data){a=this.Aa.n;for(var b=a.length,c=0;c<b;c++){var d=a[c];d instanceof B&&Kj(d,function(a){null!==a.data&&a.Ob()})}}};G.prototype.updateRelationshipsFromData=function(){var a=this.data;if(null!==a){var b=this.g;if(null!==b){var c=b.ha;if(c instanceof Q){var d=c.Fm(a),b=b.AG(d),e=this.Sa;b!==e&&(b=null!==e?c.wb(e.data):void 0,e=c.Xo,"function"===typeof e?e(a,b):a[e]=b,c.Hw(a,d))}}}};u.u(G,{Av:"adornments"},function(){return null===this.Vh?Ia:this.Vh.SD});G.prototype.findAdornment=G.prototype.Ao=function(a){var b=this.Vh;return null===b?null:b.ua(a)};G.prototype.addAdornment=G.prototype.Kk=function(a,b){if(null!==b){var c=null,d=this.Vh;null!==d&&(c=d.ua(a));if(c!==b){if(null!==c){var e=c.g;null!==e&&e.remove(c)}null===d&&(this.Vh=d=new la("string",lf));b.Wh!==a&&(b.Jc=a);d.add(a,b);c=this.g;null!==c&&(c.add(b),b.data=this.data)}}};G.prototype.removeAdornment=G.prototype.pl=function(a){var b=this.Vh;if(null!==b){var c=b.ua(a);if(null!==c){var d=c.g;null!==d&&d.remove(c)}b.remove(a);0===b.count&&(this.Vh=null)}};G.prototype.clearAdornments=G.prototype.ns=function(){var a=this.Vh;if(null!==a){for(var b=u.hb(),a=a.i;a.next();){b.push(a.key)}for(var a=b.length,c=0;c<a;c++){this.pl(b[c])}u.sa(b)}};G.prototype.updateAdornments=function(){var a=this.g;if(null!==a){a:{if(this.$a&&this.fI){var b=this.ot;if(!(null!==b&&this.ca.I()&&this.Ia()&&b.ll()&&b.ca.I())){break a}var c=this.Ao("Selection");if(null===c){c=this.gI;null===c&&(c=this instanceof W?a.tH:this instanceof V?a.NG:a.JH);if(!(c instanceof lf)){break a}nf(c);c=c.copy();null!==c&&(c.Jc="Selection",c.xc=b)}if(null!==c){var d=c.placeholder;if(null!==d){var e=b.Ii(),f=0;b instanceof X&&(f=b.jb);var h=u.vl();h.m((b.Ja.width+f)*e,(b.Ja.height+f)*e);d.za=h;u.Oj(h)}c.angle=b.Zk();c.type!==ah&&(d=u.K(),c.location=b.eb(xb,d),u.v(d));this.Kk("Selection",c);break a}}this.pl("Selection")}Kn(this,a);for(a=this.Av;a.next();){b=a.value,b.Ob(),b.S()}}};function Kn(a,b){b.tb.ef.each(function(b){b.isEnabled&&b.updateAdornments(a)})}u.u(G,{layer:"layer"},function(){return this.Du});u.u(G,{g:"diagram"},function(){var a=this.Du;return null!==a?a.g:null});u.defineProperty(G,{xf:"layerName"},function(){return this.wk},function(a){var b=this.wk;if(b!==a){u.j(a,"string",G,"layerName");var c=this.g;if(null===c||null!==c.xs(a)&&!c.Ym){if(this.wk=a,null!==c&&c.pc(),this.h("layerName",b,a),b=this.layer,null!==b&&b.name!==a&&(c=b.g,null!==c&&(a=c.xs(a),null!==a&&a!==b))){var d=b.Ge(-1,this,!0);0<=d&&c.Cc(ce,"parts",b,this,null,d,!0);d=a.Ho(99999999,this,!0);0<=d&&c.Cc(be,"parts",a,null,this,!0,d);d=this.Ss;if(null!==d){var e=c.Oa;c.Oa=!0;d(this,b,a);c.Oa=e}}}}});u.defineProperty(G,{Ss:"layerChanged"},function(){return this.zq},function(a){var b=this.zq;b!==a&&(null!==a&&u.j(a,"function",G,"layerChanged"),this.zq=a,this.h("layerChanged",b,a))});G.prototype.invalidateAdornments=G.prototype.$d=function(){var a=this.g; + null!==a&&(cj(a),0!==(this.O&16384)!==!0&&(this.O|=16384,a.ee()))};function ui(a){0!==(a.O&16384)!==!1&&(a.updateAdornments(),a.O&=-16385,a=a.g,null!==a&&(a.Nd=!0))}u.defineProperty(G,{location:"location"},function(){return this.Og},function(a){var b=this.Og;if(!(b.L(a)||this instanceof W)){a=a.Z();var c=this.g;this.Og=a;if(!1===Bj(this)){var d=this.Na,e=a.x-b.x,f=a.y-b.y,h=d.copy();d.m(h.x+e,h.y+f);Kl(this,!1);d.L(h)||null===c||this.h("position",h,d);null===c||this instanceof lf||this instanceof W||(c=this.g.oh,c.cd&&d.I()&&ii(c,this,"position",h.copy(),d.copy()))}this.h("location",b,a)}});function Kl(a,b){if(!1===Cj(a)){var c=a.g;null!==c&&(c.Zf.add(a),a instanceof U&&!c.ga.fb&&a.$e(),b||c.ee());Ln(a,!0)}}function Mn(a){if(!1!==Cj(a)){var b=a.position,c=a.location;c.I()&&b.I()||(Nn(a,b,c),a.Lg());var b=a.Na,c=a.Zb,d=c.copy();c.Ma();c.x=b.x;c.y=b.y;c.freeze();a.uw(d,c);Ln(a,!1)}}u.u(G,{fc:"locationObject"},function(){if(null===this.zk){var a=this.Az;""!==a?(a=this.ke(a),this.zk=null!==a?a:this):this.zk=this instanceof lf?this.type!==ah&&null!==this.placeholder?this.placeholder:this:this}return this.zk.visible?this.zk:this});u.defineProperty(G,{CH:"minLocation"},function(){return this.Qq},function(a){var b=this.Qq;b.L(a)||(this.Qq=a=a.Z(),this.h("minLocation",b,a))});u.defineProperty(G,{xH:"maxLocation"},function(){return this.Jq},function(a){var b=this.Jq;b.L(a)||(this.Jq=a=a.Z(),this.h("maxLocation",b,a))});u.defineProperty(G,{Az:"locationObjectName"},function(){return this.Gq},function(a){var b=this.Gq;b!==a&&(this.Gq=a,this.zk=null,El(this),this.h("locationObjectName",b,a))});u.defineProperty(G,{af:"locationSpot"},function(){return this.Hq},function(a){var b=this.Hq;b.L(a)||(this.Hq=a=a.Z(),El(this),this.h("locationSpot",b,a))});G.prototype.move=G.prototype.move=function(a){this.position=a};G.prototype.moveTo=G.prototype.moveTo=function(a,b){var c=u.Yb(a,b);this.move(c);u.v(c)};G.prototype.isVisible=G.prototype.Ia=function(){if(!this.visible){return !1}var a=this.layer;if(null!==a&&!a.visible){return !1}a=this.Sa;if(!(null===a||a.ce&&a.Ia())){return !1}if(this instanceof U){a=this.Dm();if(null!==a&&!a.Wc){return !1}a=this.de;if(null!==a){return a.Ia()}}else{if(this instanceof W){var b=!0,c=this.g;null!==c&&(b=c.rd);c=this.V;if(null!==c){if(this.Ac&&b&&!c.Wc){return !1}if(c===a){return !0}c=c.findVisibleNode();if(null===c||c===a){return !1}}c=this.ba;if(null!==c){if(this.Ac&&!b&&!c.Wc){return !1}if(c===a){return !0}b=c.findVisibleNode();if(null===b||b===a){return !1}}}}return !0};G.prototype.Ie=function(a){var b=this.g;a?(this.H(4),this.$d(),null!==b&&b.Zf.add(this)):(this.H(8),this.ns());this.dl();null!==b&&(b.pc(),b.na())};G.prototype.findObject=G.prototype.ke=function(a){if(this.name===a){return this}var b=this.Bk;null===b&&(this.Bk=b=new pa);if(void 0!==b[a]){return b[a]}for(var c=this.Aa.n,d=c.length,e=0;e<d;e++){var f=c[e];if(f.name===a){return b[a]=f}if(f instanceof B){if(null===f.hi&&null===f.ag){if(f=f.ke(a),null!==f){return b[a]=f}}else{if(sk(f)&&(f=f.Aa.first(),null!==f&&f.name===a)){return b[a]=f}}}}return b[a]=null};function On(a,b,c,d){void 0===d&&(d=new w);c.oe()&&(c=Ib);var e=b.Ja;d.m(e.width*c.x+c.offsetX,e.height*c.y+c.offsetY);if(null===b||b===a){return d}b.transform.bb(d);for(b=b.P;null!==b&&b!==a;){b.transform.bb(d),b=b.P}a.yk.bb(d);d.offset(-a.Pc.x,-a.Pc.y);return d}G.prototype.ensureBounds=G.prototype.rf=function(){Ph(this,Infinity,Infinity);this.yc()};function Ki(a,b){var c;c=a.qF;var d;isNaN(a.kj)&&(a.kj=Tm(a));d=a.kj;var e=2*d;if(!a.il){return c.m(b.x-1-d,b.y-1-d,b.width+2+e,b.height+2+e),c}d=b.x;var e=b.y,f=b.width,h=b.height,k=a.shadowBlur,l=a.mI,f=f+k,h=h+k;d-=k/2;e-=k/2;0<l.x?f+=l.x:(d+=l.x,f-=l.x);0<l.y?h+=l.y:(e+=l.y,h-=l.y);c.m(d-1,e-1,f+2,h+2);return c}g=G.prototype;g.yc=function(){this.Lg();if(!1===Bj(this)){Mn(this)}else{var a=u.Tf();a.assign(this.Zb);wl(this);this.Zb.Ma();var b=ti(this);this.yi(0,0,this.Pc.width,this.Pc.height);var c=this.position;Nn(this,c,this.location);var d=this.Zb;d.x=c.x;d.y=c.y;d.freeze();this.Lg();this.uw(a,d);a.L(d)?this.yf(b):!this.Hd()||K.D(a.width,d.width)&&K.D(a.height,d.height)||0<=this.BB&&this.H(16);u.ic(a);Ln(this,!1)}};g.uw=function(a,b){rl(this,!1);var c=this.g;if(null!==c){this.dl();var d=!1,e=a.I();if(!1===c.fi){var f=c.Ed,h=c.padding,k=f.x+h.left,l=f.y+h.top,m=f.width-2*h.right,f=f.height-2*h.bottom;e&&a.x>k&&a.y>l&&a.right<m&&a.bottom<f&&b.x>k&&b.y>l&&b.right<m&&b.bottom<f&&(d=!0)}0!==(this.O&65536)!==!0&&a.L(b)||Nj(this,d,c);c.na()}};g.eA=function(a,b){if(!a.I()||this instanceof W){return !1}var c=this.g;if(null!==c&&!(this instanceof lf)){var d=this.g.oh;d.cd&&ii(d,this,"position",b.copy(),a.copy())}if(null!==c&&!0===c.ga.fb){return !0}c=this.Og;d=c.copy();c.m(c.x+(a.x-b.x),c.y+(a.y-b.y));this.Na=a;!1===Cj(this)&&!1===Bj(this)&&(Kl(this,!1),this.Lg(),Mn(this));c.L(d)||this.h("location",d,c);return !0};g.HE=function(a,b){var c=this.Og;!1===Cj(this)&&!1===Bj(this)?(this.Og.m(c.x+a-this.Na.x,c.y+b-this.Na.y),this.Na.m(a,b),Kl(this,!0),this.Lg()):(c.m(NaN,NaN),this.Na.m(a,b)) + };function Nn(a,b,c){var d=NaN,e=NaN,f=u.K(),h=a.af,k=a.fc;h.oe()&&u.k("determineOffset: Part's locationSpot must be real: "+h.toString());var l=k.Ja,d=0;k.jb&&(d=k.Ug);f.st(0,0,l.width+d,l.height+d,h);if(k!==a){for(k.jb&&f.offset(-d/2,-d/2),k.transform.bb(f),h=k.P;null!==h&&h!==a;){h.transform.bb(f),h=h.P}}a.yk.bb(f);f.offset(-a.Pc.x,-a.Pc.y);h=a.g;c.I()?(k=b.x,l=b.y,d=c.x-f.x,e=c.y-f.y,b.m(d,e),c=!1,null!==h&&(d=h.oh,d.dj?c=!0:!d.cd||a instanceof lf||ii(d,a,"position",new w(k,l),b),c||b.x===k&&b.y===l||(d=h.gb,h.gb=!0,a.h("position",new w(k,l),b),h.gb=d))):b.I()&&(d=b.x,e=b.y,b=c.copy(),c.m(d+f.x,e+f.y),c.L(b)||null===h||(d=h.gb,h.gb=!0,a.h("location",b,c),h.gb=d));u.v(f)}function Nj(a,b,c){sl(a,!1);a instanceof U&&Qk(c,a);a.layer.zc||b||c.pc();b=a.Zb;var d=c.ob;d.I()?(ti(a)?jb(b,d)||a.yf(!1):b.ug(d)&&a.yf(!0),a.updateAdornments()):c.uk=!0}g.hl=function(){return !0};function wi(a,b){var c=a.Zb;if(0!==c.width&&0!==c.height&&!isNaN(c.x)&&!isNaN(c.y)&&a.Ia()){var d=a.transform,e=a.P,f=a.$m;f.reset();null!==e&&(e.Uf()?f.multiply(e.Gf):null!==e.P&&f.multiply(e.P.Gf));f.multiply(a.Td);null!==a.lc&&(yl(a,b,a.lc,!0,!0),b.fillRect(c.x,c.y,c.width,c.height));null===a.lc&&null===a.Jb&&(yl(a,b,"rgba(0,0,0,0.4)",!0,!1),b.fillRect(c.x,c.y,c.width,c.height));null!==a.Jb&&(d.Ps()||b.transform(d.m11,d.m12,d.m21,d.m22,d.dx,d.dy),e=a.Ja,c=e.width,e=e.height,yl(a,b,a.Jb,!0,!1),b.fillRect(0,0,c+0,e+0),d.Ps()||(c=1/(d.m11*d.m22-d.m12*d.m21),b.transform(d.m22*c,-d.m12*c,-d.m21*c,d.m11*c,c*(d.m21*d.dy-d.m22*d.dx),c*(d.m12*d.dx-d.m11*d.dy))))}}g.Hd=function(){return !0};u.defineProperty(G,{Jc:"category"},function(){return this.Wh},function(a){var b=this.Wh;if(b!==a){u.j(a,"string",G,"category");var c=this.g,d=this.data,e=null;if(null!==c&&null!==d&&!(this instanceof lf)){var f=c.ha.ga;f.isEnabled&&!f.fb&&(e=this.clone(),e.Aa.Ud(this.Aa))}this.Wh=a;this.h("category",b,a);null===c||null===d||this instanceof lf?(e=this.Mh,null!==e&&(a=e.Vh,null!==a&&a.remove(b),e.Kk(this.Jc,this))):(f=c.ha,f.ga.fb||(this instanceof W?(f instanceof Q?f.FE(d,a):f instanceof qe&&f.jI(d,a),c=Ck(c,a),null!==c&&(nf(c),c=c.copy(),null!==c&&Pn(this,c,b,a))):(null!==f&&f.Fw(d,a),c=zk(c,d,a),null!==c&&(nf(c),c=c.copy(),null===c||c instanceof W||(c.location=this.location,Pn(this,c,b,a)))),null!==e&&(b=this.clone(),b.Aa.Ud(this.Aa),this.h("self",e,b))))}});u.defineProperty(G,{self:"self"},function(){return this},function(a){Pn(this,a,this.Jc,a.Jc)});var Qn=!1;function Pn(a,b,c,d){b.constructor===a.constructor||Qn||(Qn=!0,u.trace('Should not change the class of the Part when changing category from "'+c+'" to "'+d+'"'),u.trace(" Old class: "+u.tg(a)+", new class: "+u.tg(b)+", part: "+a.toString()));a.ns();var e=a.data;c=a.xf;var f=a.$a,h=a.Yg,k=!0,l=!0,m=!1;if(a instanceof U){var n=a,k=n.Ki,l=n.Wc,m=n.mp}b.Oh(a);b.cloneProtected(a);a.Wh=d;a.S();a.na();b=a.g;d=!0;null!==b&&(d=b.gb,b.gb=!0);a.sh=e;null!==e&&a.Ob();null!==b&&(b.gb=d);e=a.xf;e!==c&&(a.wk=c,a.xf=e);a instanceof U&&(n=a,n.Ki=k,n.Wc=l,n.mp=m,n.Hd()&&n.H(64));a.$a=f;a.Yg=h}G.prototype.canCopy=function(){if(!this.jG){return !1}var a=this.layer;if(null===a){return !0}if(!a.Ij){return !1}a=a.g;return null===a?!0:a.Ij?!0:!1};G.prototype.canDelete=function(){if(!this.qG){return !1}var a=this.layer;if(null===a){return !0}if(!a.pm){return !1}a=a.g;return null===a?!0:a.pm?!0:!1};G.prototype.canEdit=function(){if(!this.wI){return !1}var a=this.layer;if(null===a){return !0}if(!a.Fv){return !1}a=a.g;return null===a?!0:a.Fv?!0:!1};G.prototype.canGroup=function(){if(!this.OG){return !1}var a=this.layer;if(null===a){return !0}if(!a.Cv){return !1}a=a.g;return null===a?!0:a.Cv?!0:!1};G.prototype.canMove=function(){if(!this.HH){return !1}var a=this.layer;if(null===a){return !0}if(!a.Nk){return !1}a=a.g;return null===a?!0:a.Nk?!0:!1};G.prototype.canReshape=function(){if(!this.VH){return !1}var a=this.layer;if(null===a){return !0}if(!a.Dv){return !1}a=a.g;return null===a?!0:a.Dv?!0:!1};G.prototype.canResize=function(){if(!this.WH){return !1}var a=this.layer;if(null===a){return !0}if(!a.ks){return !1}a=a.g;return null===a?!0:a.ks?!0:!1};G.prototype.canRotate=function(){if(!this.ZH){return !1}var a=this.layer;if(null===a){return !0}if(!a.Ev){return !1}a=a.g;return null===a?!0:a.Ev?!0:!1};G.prototype.canSelect=function(){if(!this.ql){return !1}var a=this.layer;if(null===a){return !0}if(!a.qf){return !1}a=a.g;return null===a?!0:a.qf?!0:!1};u.defineProperty(G,{jG:"copyable"},function(){return 0!==(this.O&1)},function(a){var b=0!==(this.O&1);b!==a&&(this.O^=1,this.h("copyable",b,a))});u.defineProperty(G,{qG:"deletable"},function(){return 0!==(this.O&2)},function(a){var b=0!==(this.O&2);b!==a&&(this.O^=2,this.h("deletable",b,a))});u.defineProperty(G,{wI:"textEditable"},function(){return 0!==(this.O&4)},function(a){var b=0!==(this.O&4);b!==a&&(this.O^=4,this.h("textEditable",b,a),this.$d())});u.defineProperty(G,{OG:"groupable"},function(){return 0!==(this.O&8)},function(a){var b=0!==(this.O&8);b!==a&&(this.O^=8,this.h("groupable",b,a)) + });u.defineProperty(G,{HH:"movable"},function(){return 0!==(this.O&16)},function(a){var b=0!==(this.O&16);b!==a&&(this.O^=16,this.h("movable",b,a))});u.defineProperty(G,{fI:"selectionAdorned"},function(){return 0!==(this.O&32)},function(a){var b=0!==(this.O&32);b!==a&&(this.O^=32,this.h("selectionAdorned",b,a),this.$d())});u.defineProperty(G,{vz:"isInDocumentBounds"},function(){return 0!==(this.O&64)},function(a){var b=0!==(this.O&64);if(b!==a){this.O^=64;var c=this.g;null!==c&&c.pc();this.h("isInDocumentBounds",b,a)}});u.defineProperty(G,{PD:"isLayoutPositioned"},function(){return 0!==(this.O&128)},function(a){var b=0!==(this.O&128);b!==a&&(this.O^=128,this.h("isLayoutPositioned",b,a),this.H(a?4:8))});u.defineProperty(G,{ql:"selectable"},function(){return 0!==(this.O&256)},function(a){var b=0!==(this.O&256);b!==a&&(this.O^=256,this.h("selectable",b,a),this.$d())});u.defineProperty(G,{VH:"reshapable"},function(){return 0!==(this.O&512)},function(a){var b=0!==(this.O&512);b!==a&&(this.O^=512,this.h("reshapable",b,a),this.$d())});u.defineProperty(G,{WH:"resizable"},function(){return 0!==(this.O&1024)},function(a){var b=0!==(this.O&1024);b!==a&&(this.O^=1024,this.h("resizable",b,a),this.$d())});u.defineProperty(G,{ZH:"rotatable"},function(){return 0!==(this.O&2048)},function(a){var b=0!==(this.O&2048);b!==a&&(this.O^=2048,this.h("rotatable",b,a),this.$d())});u.defineProperty(G,{$a:"isSelected"},function(){return 0!==(this.O&4096)},function(a){var b=0!==(this.O&4096);if(b!==a){var c=this.g;if(!a||this.canSelect()&&!(null!==c&&c.selection.count>=c.yH)){this.O^=4096;var d=!1;if(null!==c){d=c.gb;c.gb=!0;var e=c.selection;e.Ma();a?e.add(this):e.remove(this);e.freeze()}this.h("isSelected",b,a);this.$d();a=this.hI;null!==a&&a(this);null!==c&&(c.ee(),c.gb=d)}}});u.defineProperty(G,{Yg:"isHighlighted"},function(){return 0!==(this.O&524288)},function(a){var b=0!==(this.O&524288);if(b!==a){this.O^=524288;var c=this.g;null!==c&&(c=c.bw,c.Ma(),a?c.add(this):c.remove(this),c.freeze());this.h("isHighlighted",b,a);this.na()}});u.defineProperty(G,{il:"isShadowed"},function(){return 0!==(this.O&8192)},function(a){var b=0!==(this.O&8192);b!==a&&(this.O^=8192,this.h("isShadowed",b,a),this.na())});function Cj(a){return 0!==(a.O&32768)}function Ln(a,b){a.O=b?a.O|32768:a.O&-32769}function sl(a,b){a.O=b?a.O|65536:a.O&-65537}function ti(a){return 0!==(a.O&131072)}G.prototype.yf=function(a){this.O=a?this.O|131072:this.O&-131073};function Rn(a,b){a.O=b?a.O|1048576:a.O&-1048577}u.defineProperty(G,{JD:"isAnimated"},function(){return 0!==(this.O&262144)},function(a){var b=0!==(this.O&262144);b!==a&&(this.O^=262144,this.h("isAnimated",b,a))});u.defineProperty(G,{$z:"selectionObjectName"},function(){return this.Hr},function(a){var b=this.Hr;b!==a&&(this.Hr=a,this.fm=null,this.h("selectionObjectName",b,a))});u.defineProperty(G,{gI:"selectionAdornmentTemplate"},function(){return this.Fr},function(a){var b=this.Fr;b!==a&&(this instanceof W&&(a.type=ah),this.Fr=a,this.h("selectionAdornmentTemplate",b,a))});u.u(G,{ot:"selectionObject"},function(){if(null===this.fm){var a=this.$z;null!==a&&""!==a?(a=this.ke(a),this.fm=null!==a?a:this):this instanceof W?(a=this.path,this.fm=null!==a?a:this):this.fm=this}return this.fm});u.defineProperty(G,{hI:"selectionChanged"},function(){return this.Gr},function(a){var b=this.Gr;b!==a&&(null!==a&&u.j(a,"function",G,"selectionChanged"),this.Gr=a,this.h("selectionChanged",b,a))});u.defineProperty(G,{sE:"resizeAdornmentTemplate"},function(){return this.tr},function(a){var b=this.tr;b!==a&&(this.tr=a,this.h("resizeAdornmentTemplate",b,a))});u.defineProperty(G,{uE:"resizeObjectName"},function(){return this.vr},function(a){var b=this.vr;b!==a&&(this.vr=a,this.Xn=null,this.h("resizeObjectName",b,a))});u.u(G,{tE:"resizeObject"},function(){if(null===this.Xn){var a=this.uE;null!==a&&""!==a?(a=this.ke(a),this.Xn=null!==a?a:this):this.Xn=this}return this.Xn});u.defineProperty(G,{XH:"resizeCellSize"},function(){return this.ur},function(a){var b=this.ur;b.L(a)||(this.ur=a=a.Z(),this.h("resizeCellSize",b,a))});u.defineProperty(G,{$H:"rotateAdornmentTemplate"},function(){return this.wr},function(a){var b=this.wr;b!==a&&(this.wr=a,this.h("rotateAdornmentTemplate",b,a))});u.defineProperty(G,{aI:"rotateObjectName"},function(){return this.xr},function(a){var b=this.xr;b!==a&&(this.xr=a,this.Yn=null,this.h("rotateObjectName",b,a))});u.u(G,{wE:"rotateObject"},function(){if(null===this.Yn){var a=this.aI;null!==a&&""!==a?(a=this.ke(a),this.Yn=null!==a?a:this):this.Yn=this}return this.Yn});u.defineProperty(G,{text:"text"},function(){return this.je},function(a){var b=this.je;b!==a&&(this.je=a,this.h("text",b,a))});u.defineProperty(G,{Sa:"containingGroup"},function(){return this.kk},function(a){if(this.Hd()){var b=this.kk;if(b!==a){null===a||this!==a&&!a.Rh(this)||(this===a&&u.k("Cannot make a Group a member of itself: "+this.toString()),u.k("Cannot make a Group indirectly contain itself: "+this.toString()+" already contains "+a.toString())); + this.H(Rj);var c=this.g;null!==b?Sn(b,this):this instanceof V&&null!==c&&c.Ik.remove(this);this.kk=a;null!==a?Tn(a,this):this instanceof V&&null!==c&&c.Ik.add(this);this.H(Jj);if(null!==c){var d=this.data,e=c.ha;null!==d&&e instanceof Q&&e.Hw(d,e.wb(null!==a?a.data:null))}d=this.bD;null!==d&&(e=!0,null!==c&&(e=c.Oa,c.Oa=!0),d(this,b,a),null!==c&&(c.Oa=e));if(this instanceof V){for(c=new F(G),kf(c,this,!0,0,!0),c=c.i;c.next();){if(d=c.value,d instanceof U){for(d=d.pe;d.next();){xk(d.value)}}}}if(this instanceof U){for(d=this.pe;d.next();){xk(d.value)}}this.h("containingGroup",b,a);null!==a&&a.Lw()}}else{u.k("cannot set the Part.containingGroup of a Link or Adornment")}});g=G.prototype;g.dl=function(){var a=this.Sa;null!==a&&(a.S(),null!==a.Ib&&a.Ib.S(),a.$e())};g.na=function(){var a=this.g;null!==a&&!Bj(this)&&!Cj(this)&&this.Ia()&&this.Zb.I()&&a.na(Ki(this,this.Zb))};g.Ks=function(a){var b=this.kk;null===b||a||Tn(b,this)};g.Ls=function(a){var b=this.kk;null===b||a||Sn(b,this)};g.Bm=function(){var a=this.data;if(null!==a){var b=this.g;null!==b&&(b=b.ha,null!==b&&b.Wz(a))}};u.defineProperty(G,{bD:"containingGroupChanged"},function(){return this.Ip},function(a){var b=this.Ip;b!==a&&(null!==a&&u.j(a,"function",G,"containingGroupChanged"),this.Ip=a,this.h("containingGroupChanged",b,a))});G.prototype.findSubGraphLevel=function(){return Un(this,this)};function Un(a,b){var c=b.Sa;return null!==c?1+Un(a,c):b instanceof U&&(c=b.de,null!==c)?Un(a,c):0}G.prototype.findTopLevelPart=function(){return Vn(this,this)};function Vn(a,b){var c=b.Sa;return null!==c?Vn(a,c):b instanceof U&&(c=b.de,null!==c)?Vn(a,c):b}u.u(G,{Jo:"isTopLevel"},function(){return null!==this.Sa||this instanceof U&&this.uf?!1:!0});G.prototype.isMemberOf=G.prototype.Rh=function(a){return a instanceof V?Wn(this,this,a):!1};function Wn(a,b,c){if(b===c||null===c){return !1}var d=b.Sa;return null===d||d!==c&&!Wn(a,d,c)?b instanceof U&&(b=b.de,null!==b)?Wn(a,b,c):!1:!0}G.prototype.findCommonContainingGroup=G.prototype.zG=function(a){if(null===a){return null}if(this===a){return this.Sa}for(var b=this;null!==b;){b instanceof V&&Rn(b,!0),b=b.Sa}for(var c=null,b=a;null!==b;){if(0!==(b.O&1048576)){c=b;break}b=b.Sa}for(b=this;null!==b;){b instanceof V&&Rn(b,!1),b=b.Sa}return c};u.defineProperty(G,{oH:"layoutConditions"},function(){return this.Aq},function(a){var b=this.Aq;b!==a&&(this.Aq=a,this.h("layoutConditions",b,a))});G.prototype.canLayout=function(){if(!this.PD||!this.Ia()){return !1}var a=this.layer;return null!==a&&a.zc||this instanceof U&&this.uf?!1:!0};G.prototype.invalidateLayout=G.prototype.H=function(a){void 0===a&&(a=16777215);var b;this.PD&&0!==(a&this.oH)?(b=this.layer,null!==b&&b.zc||this instanceof U&&this.uf?b=!1:(b=this.g,b=null!==b&&b.ga.fb?!1:!0)):b=!1;if(b){if(b=this.kk,null!==b){var c=b.Qb;null!==c?c.H():b.H(a)}else{a=this.g,null!==a&&(c=a.Qb,null!==c&&c.H())}}};function Oj(a){if(!a.Ia()){return !1}a=a.layer;return null!==a&&a.zc?!1:!0}u.defineProperty(G,{nD:"dragComputation"},function(){return this.Sp},function(a){var b=this.Sp;b!==a&&(null!==a&&u.j(a,"function",G,"dragComputation"),this.Sp=a,this.h("dragComputation",b,a))});u.defineProperty(G,{mI:"shadowOffset"},function(){return this.im},function(a){var b=this.im;b.L(a)||(this.im=a=a.Z(),this.na(),this.h("shadowOffset",b,a))});u.defineProperty(G,{shadowColor:"shadowColor"},function(){return this.hm},function(a){var b=this.hm;b!==a&&(this.hm=a,this.na(),this.h("shadowColor",b,a))});u.defineProperty(G,{shadowBlur:"shadowBlur"},function(){return this.gm},function(a){var b=this.gm;b!==a&&(this.gm=a,this.na(),this.h("shadowBlur",b,a))});function lf(a){0===arguments.length?G.call(this,vh):G.call(this,a);this.xf="Adornment";this.Gb=null;this.O&=-257;this.Og=new w(NaN,NaN);this.Vi=new E(z);this.Ib=null}u.Ha(lf,G);u.fa("Adornment",lf);lf.prototype.toString=function(){var a=this.Mh;return"Adornment("+this.Jc+")"+(null!==a?a.toString():"")};lf.prototype.updateRelationshipsFromData=function(){};lf.prototype.Ys=function(){var a=this.xc.W,b=this.xc;if(a instanceof W&&b instanceof X){var c=a.path,b=c.Qa;a.Ys();for(var b=c.Qa,a=this.Aa.n,c=a.length,d=0;d<c;d++){var e=a[d];e.vg&&e instanceof X&&(e.Qa=b)}}};u.u(lf,{placeholder:"placeholder"},function(){return this.Ib});u.defineProperty(lf,{xc:"adornedObject"},function(){return this.Gb},function(a){var b=this.Mh,c=null;null!==a&&(c=a.W);null===b||null!==a&&b===c||b.pl(this.Jc);this.Gb=a;null!==c&&c.Kk(this.Jc,this)});u.u(lf,{Mh:"adornedPart"},function(){var a=this.Gb;return null!==a?a.W:null});lf.prototype.hl=function(){var a=this.Gb;if(null===a){return !0}a=a.W;return null===a||!Bj(a)};lf.prototype.Hd=function(){return !1};u.u(lf,{Sa:"containingGroup"},function(){return null});lf.prototype.Pm=function(a,b,c,d,e,f,h){if(a===be&&"elements"===b){if(e instanceof ph){var k=e;null===this.Ib?this.Ib=k:this.Ib!==k&&u.k("Cannot insert a second Placeholder into the visual tree of an Adornment.")}else{e instanceof B&&(k=e.ws(function(a){return a instanceof ph}),k instanceof ph&&(null===this.Ib?this.Ib=k:this.Ib!==k&&u.k("Cannot insert a second Placeholder into the visual tree of an Adornment."))) + }}else{a===ce&&"elements"===b&&null!==this.Ib&&(d===this.Ib?this.Ib=null:d instanceof B&&this.Ib.gl(d)&&(this.Ib=null))}G.prototype.Pm.call(this,a,b,c,d,e,f,h)};lf.prototype.updateAdornments=function(){};lf.prototype.Bm=function(){};function U(a){0===arguments.length?G.call(this,vh):G.call(this,a);this.hc=new E(W);this.Mn=this.xk=this.Dq=this.Cq=null;this.sq=!0;this.bs=!1;this.Xr=null;this.Bp=this.tq=!0;this.Cp=K.iF;this.Rd=this.ph=null;this.mr=Xn;this.Fj=!1}u.Ha(U,G);u.fa("Node",U);U.prototype.cloneProtected=function(a){G.prototype.cloneProtected.call(this,a);a.Cq=this.Cq;a.Dq=this.Dq;a.xk=this.xk;a.sq=this.sq;a.bs=this.bs;a.Xr=this.Xr;a.tq=this.tq;a.Bp=this.Bp;a.Cp=this.Cp.Z();a.mr=this.mr};U.prototype.Oh=function(a){G.prototype.Oh.call(this,a);a.$e();a.ph=this.ph;a.Rd=null};var Yn;U.DirectionDefault=Yn=u.s(U,"DirectionDefault",0);U.DirectionAbsolute=u.s(U,"DirectionAbsolute",1);var Zn;U.DirectionRotatedNode=Zn=u.s(U,"DirectionRotatedNode",2);var jl;U.DirectionRotatedNodeOrthogonal=jl=u.s(U,"DirectionRotatedNodeOrthogonal",3);U.SpreadingNone=u.s(U,"SpreadingNone",10);var Xn;U.SpreadingEvenly=Xn=u.s(U,"SpreadingEvenly",11);var $n;U.SpreadingPacked=$n=u.s(U,"SpreadingPacked",12);function ao(a,b){null!==b&&(null===a.ph&&(a.ph=new F(bo)),a.ph.add(b))}U.prototype.Pm=function(a,b,c,d,e,f,h){a===be&&"elements"===b?this.Rd=null:a===ce&&"elements"===b&&(null===this.g?this.Rd=null:d instanceof T&&Pm(this,d,function(a,b){Ll(a,b,!0)}));G.prototype.Pm.call(this,a,b,c,d,e,f,h)};U.prototype.invalidateConnectedLinks=U.prototype.$e=function(a){void 0===a&&(a=null);for(var b=this.pe;b.next();){var c=b.value;null!==a&&a.contains(c)||(co(this,c.qd),co(this,c.ge),c.Wb())}};function co(a,b){if(null!==b){b.lr=null;var c=a.Sa;null===c||c.ce||co(c,c.Xk(""))}}U.prototype.hl=function(){return !0};u.defineProperty(U,{PH:"portSpreading"},function(){return this.mr},function(a){var b=this.mr;b!==a&&(this.mr=a,this.h("portSpreading",b,a),a=this.g,null!==a&&a.ga.fb||this.$e())});u.defineProperty(U,{TC:"avoidable"},function(){return this.Bp},function(a){var b=this.Bp;if(b!==a){this.Bp=a;var c=this.g;null!==c&&Qk(c,this);this.h("avoidable",b,a)}});u.defineProperty(U,{SF:"avoidableMargin"},function(){return this.Cp},function(a){"number"===typeof a?a=new rb(a):u.C(a,rb,U,"avoidableMargin");var b=this.Cp;if(!b.L(a)){this.Cp=a=a.Z();var c=this.g;null!==c&&Qk(c,this);this.h("avoidableMargin",b,a)}});U.prototype.canAvoid=function(){return this.TC&&!this.uf};U.prototype.getAvoidableRect=function(a){a.set(this.ca);a.zv(this.SF);return a};U.prototype.findVisibleNode=function(){for(var a=this;null!==a&&!a.Ia();){a=a.Sa}return a};U.prototype.Ie=function(a){G.prototype.Ie.call(this,a);for(var b=this.pe;b.next();){b.value.Ie(a)}};u.u(U,{pe:"linksConnected"},function(){return this.hc.i});U.prototype.findLinksConnected=U.prototype.rD=function(a){void 0===a&&(a=null);if(null===a){return this.hc.i}var b=new Ka(this.hc),c=this;b.Om=function(b){return b.V===c&&b.rg===a||b.ba===c&&b.mh===a};return b};U.prototype.findLinksOutOf=U.prototype.Wv=function(a){void 0===a&&(a=null);var b=new Ka(this.hc),c=this;b.Om=function(b){return b.V!==c?!1:null===a?!0:b.rg===a};return b};U.prototype.findLinksInto=U.prototype.qg=function(a){void 0===a&&(a=null);var b=new Ka(this.hc),c=this;b.Om=function(b){return b.ba!==c?!1:null===a?!0:b.mh===a};return b};U.prototype.findNodesConnected=U.prototype.sD=function(a){void 0===a&&(a=null);for(var b=null,c=null,d=this.hc.i;d.next();){var e=d.value;if(e.V===this){if(null===a||e.rg===a){e=e.ba,null!==b?b.add(e):null!==c&&c!==e?(b=new F(U),b.add(c),b.add(e)):c=e}}else{e.ba!==this||null!==a&&e.mh!==a||(e=e.V,null!==b?b.add(e):null!==c&&c!==e?(b=new F(U),b.add(c),b.add(e)):c=e)}}return null!==b?b.i:null!==c?new Ja(c):Ia};U.prototype.findNodesOutOf=function(a){void 0===a&&(a=null);for(var b=null,c=null,d=this.hc.i;d.next();){var e=d.value;e.V!==this||null!==a&&e.rg!==a||(e=e.ba,null!==b?b.add(e):null!==c&&c!==e?(b=new F(U),b.add(c),b.add(e)):c=e)}return null!==b?b.i:null!==c?new Ja(c):Ia};U.prototype.findNodesInto=function(a){void 0===a&&(a=null);for(var b=null,c=null,d=this.hc.i;d.next();){var e=d.value;e.ba!==this||null!==a&&e.mh!==a||(e=e.V,null!==b?b.add(e):null!==c&&c!==e?(b=new F(U),b.add(c),b.add(e)):c=e)}return null!==b?b.i:null!==c?new Ja(c):Ia};U.prototype.findLinksBetween=function(a,b,c){void 0===b&&(b=null);void 0===c&&(c=null);var d=new Ka(this.hc),e=this;d.Om=function(d){return(d.V!==e||d.ba!==a||null!==b&&d.rg!==b||null!==c&&d.mh!==c)&&(d.V!==a||d.ba!==e||null!==c&&d.rg!==c||null!==b&&d.mh!==b)?!1:!0};return d};U.prototype.findLinksTo=function(a,b,c){void 0===b&&(b=null);void 0===c&&(c=null);var d=new Ka(this.hc),e=this;d.Om=function(d){return d.V!==e||d.ba!==a||null!==b&&d.rg!==b||null!==c&&d.mh===c?!1:!0};return d};u.defineProperty(U,{qH:"linkConnected"},function(){return this.Cq},function(a){var b=this.Cq;b!==a&&(null!==a&&u.j(a,"function",U,"linkConnected"),this.Cq=a,this.h("linkConnected",b,a))});u.defineProperty(U,{rH:"linkDisconnected"},function(){return this.Dq + },function(a){var b=this.Dq;b!==a&&(null!==a&&u.j(a,"function",U,"linkDisconnected"),this.Dq=a,this.h("linkDisconnected",b,a))});u.defineProperty(U,{qw:"linkValidation"},function(){return this.xk},function(a){var b=this.xk;b!==a&&(null!==a&&u.j(a,"function",U,"linkValidation"),this.xk=a,this.h("linkValidation",b,a))});function eo(a,b,c){co(a,c);if(!a.hc.contains(b)){a.hc.add(b);var d=a.qH;if(null!==d){var e=!0,f=a.g;null!==f&&(e=f.Oa,f.Oa=!0);d(a,b,c);null!==f&&(f.Oa=e)}b.Ac&&(c=b.V,b=b.ba,null!==c&&null!==b&&c!==b&&(d=!0,f=a.g,null!==f&&(d=f.rd),a=d?b:c,e=d?c:b,a.Fj||(a.Fj=e),!e.Ki||null!==f&&f.ga.fb||(d?c===e&&(e.Ki=!1):b===e&&(e.Ki=!1))))}}function fo(a,b,c){co(a,c);if(a.hc.remove(b)){var d=a.rH,e=a.g;if(null!==d){var f=!0;null!==e&&(f=e.Oa,e.Oa=!0);d(a,b,c);null!==e&&(e.Oa=f)}b.Ac&&(c=!0,null!==e&&(c=e.rd),a=c?b.ba:b.V,b=c?b.V:b.ba,null!==a&&(a.Fj=!1),null===b||b.Ki||(0===b.hc.count?(b.Fj=null,null!==e&&e.ga.fb||(b.Ki=!0)):Jk(b)))}}function Jk(a){a.Fj=!1;if(0!==a.hc.count){var b=!0,c=a.g;if(null===c||!c.ga.fb){null!==c&&(b=c.rd);for(c=a.hc.i;c.next();){var d=c.value;if(d.Ac){if(b){if(d.V===a){a.Ki=!1;return}}else{if(d.ba===a){a.Ki=!1;return}}}}a.Ki=!0}}}U.prototype.updateRelationshipsFromData=function(){G.prototype.updateRelationshipsFromData.call(this);var a=this.data;if(null!==a){var b=this.g;if(null!==b){var c=b.ha;if(c instanceof qe){var d=c.Gm(a),b=b.Ye(d),e=this.Dm();b!==e&&(b=null!==e?c.wb(e.data):void 0,e=c.Yo,"function"===typeof e?e(a,b):a[e]=b,c.kh(a,d))}}}};U.prototype.Ks=function(a){G.prototype.Ks.call(this,a);a||Jk(this);var b=this.Mn;null===b||a||ho(b,this)};U.prototype.Ls=function(a){G.prototype.Ls.call(this,a);var b=this.Mn;null===b||a||null===b.we||(b.we.remove(this),b.S())};U.prototype.Bm=function(){if(0<this.hc.count){var a=this.g;if(null===a){return}for(var b=this.hc.copy().i;b.next();){a.remove(b.value)}}this.de=null;G.prototype.Bm.call(this)};u.u(U,{uf:"isLinkLabel"},function(){return null!==this.Mn});u.defineProperty(U,{de:"labeledLink"},function(){return this.Mn},function(a){var b=this.Mn;if(b!==a){var c=this.g,d=this.data;if(null!==b&&(null!==b.we&&(b.we.remove(this),b.S()),null!==c&&null!==d&&!c.ga.fb)){var e=b.data,f=c.ha;if(null!==e&&f instanceof Q){var h=f.wb(d);void 0!==h&&f.nE(e,h)}}this.Mn=a;null!==a&&(ho(a,this),null===c||null===d||c.ga.fb||(e=a.data,f=c.ha,null!==e&&f instanceof Q&&(h=f.wb(d),void 0!==h&&f.Ny(e,h))));El(this);this.h("labeledLink",b,a)}});U.prototype.findPort=U.prototype.Xk=function(a){if(null===this.Rd){if(""===a&&!1===this.zh){return this}Ml(this)}var b=this.Rd.ua(a);return null!==b||""!==a&&(b=this.Rd.ua(""),null!==b)?b:this};u.u(U,{port:"port"},function(){return this.Xk("")});u.u(U,{ports:"ports"},function(){null===this.Rd&&Ml(this);return this.Rd.SD});function Ml(a){null===a.Rd?a.Rd=new la("string",T):a.Rd.clear();Pm(a,a,function(a,c){var d=c.Kd;null!==d&&a.Rd.add(d,c)});0===a.Rd.count&&a.Rd.add("",a)}function Ll(a,b,c){var d=b.Kd;if(null!==d&&(null!==a.Rd&&a.Rd.remove(d),b=a.g,null!==b&&c)){c=null;for(d=a.rD(d);d.next();){a=d.value,null===c&&(c=u.hb()),c.push(a)}if(null!==c){for(d=0;d<c.length;d++){a=c[d],b.remove(a)}u.sa(c)}}}U.prototype.isInTreeOf=function(a){if(null===a||a===this){return !1}var b=!0,c=this.g;null!==c&&(b=c.rd);c=this;if(b){for(;c!==a;){for(var b=null,d=c.hc.i;d.next();){var e=d.value;if(e.Ac&&(b=e.V,b!==c&&b!==this)){break}}if(b===this||null===b||b===c){return !1}c=b}}else{for(;c!==a;){b=null;for(d=c.hc.i;d.next()&&(e=d.value,!e.Ac||(b=e.ba,b===c||b===this));){}if(b===this||null===b||b===c){return !1}c=b}}return !0};U.prototype.findTreeRoot=function(){var a=!0,b=this.g;null!==b&&(a=b.rd);b=this;if(a){for(;;){for(var a=null,c=b.hc.i;c.next();){var d=c.value;if(d.Ac&&(a=d.V,a!==b&&a!==this)){break}}if(a===this){return this}if(null===a||a===b){return b}b=a}}else{for(;;){a=null;for(c=b.hc.i;c.next()&&(d=c.value,!d.Ac||(a=d.ba,a===b||a===this));){}if(a===this){return this}if(null===a||a===b){return b}b=a}}};U.prototype.findCommonTreeParent=function(a){if(null===a){return null}if(this===a){return this}for(var b=this;null!==b;){Rn(b,!0),b=b.Dm()}for(var c=null,b=a;null!==b;){if(0!==(b.O&1048576)){c=b;break}b=b.Dm()}for(b=this;null!==b;){Rn(b,!1),b=b.Dm()}return c};U.prototype.findTreeParentLink=U.prototype.Bs=function(){var a=!0,b=this.g;null!==b&&(a=b.rd);b=this.hc.i;if(a){for(;b.next();){if(a=b.value,a.Ac&&a.V!==this){return a}}}else{for(;b.next();){if(a=b.value,a.Ac&&a.ba!==this){return a}}}return null};U.prototype.findTreeParentNode=U.prototype.Dm=function(){var a=this.Fj;if(null===a){return null}if(a instanceof U){return a}var b=!0,a=this.g;null!==a&&(b=a.rd);a=this.hc.i;if(b){for(;a.next();){if(b=a.value,b.Ac&&(b=b.V,b!==this)){return this.Fj=b}}}else{for(;a.next();){if(b=a.value,b.Ac&&(b=b.ba,b!==this)){return this.Fj=b}}}return this.Fj=null};U.prototype.findTreeLevel=function(){return io(this,this)};function io(a,b){var c=b.Dm();return null===c?0:1+io(a,c)}U.prototype.findTreeChildrenLinks=U.prototype.Yv=function(){var a=!0,b=this.g; + null!==b&&(a=b.rd);if(a){var a=new Ka(this.hc),c=this;a.Om=function(a){return a.Ac&&a.V===c?!0:!1}}else{a=new Ka(this.hc),c=this,a.Om=function(a){return a.Ac&&a.ba===c?!0:!1}}return a};U.prototype.findTreeChildrenNodes=U.prototype.uD=function(){var a=!0,b=this.g;null!==b&&(a=b.rd);var c=b=null,d=this.hc.i;if(a){for(;d.next();){a=d.value,a.Ac&&a.V===this&&(a=a.ba,null!==b?b.add(a):null!==c&&c!==a?(b=new E(U),b.add(c),b.add(a)):c=a)}}else{for(;d.next();){a=d.value,a.Ac&&a.ba===this&&(a=a.V,null!==b?b.add(a):null!==c&&c!==a?(b=new E(U),b.add(c),b.add(a)):c=a)}}return null!==b?b.i:null!==c?new Ja(c):Ia};U.prototype.findTreeParts=function(a){void 0===a&&(a=Infinity);u.j(a,"number",U,"collapseTree:level");var b=new F(G);kf(b,this,!1,a,!0);return b};U.prototype.collapseTree=U.prototype.collapseTree=function(a){void 0===a&&(a=1);u.Be(a,U,"collapseTree:level");1>a&&(a=1);var b=this.g;if(null!==b&&!b.ne){var c=b.Mb;0!==b.ga.Me&&c.nl();b.ne=!0;var c=b.rd,d=new F(U);d.add(this);jo(this,d,c,a,this.Wc);b.ne=!1}};function jo(a,b,c,d,e){if(1<d){for(e=c?a.Wv():a.qg();e.next();){var f=e.value;f.Ac&&(f=f.iz(a),null===f||f===a||b.contains(f)||(b.add(f),jo(f,b,c,d-1,f.Wc)))}}else{ko(a,b,c,e)}}function ko(a,b,c,d){for(var e=c?a.Wv():a.qg();e.next();){var f=e.value;f.Ac&&(f=f.iz(a),null===f||f===a||b.contains(f)||(b.add(f),d&&(f.dl(),f.Ie(!1)),f.Wc&&(f.mp=f.Wc,ko(f,b,c,f.mp))))}a.Wc=!1}U.prototype.expandTree=U.prototype.expandTree=function(a){void 0===a&&(a=2);u.Be(a,U,"expandTree:level");2>a&&(a=2);var b=this.g;if(null!==b&&!b.ne){var c=b.Mb;0!==b.ga.Me&&c.nl();b.ne=!0;var d=b.rd,e=new F(U);e.add(this);lo(this,e,d,a,this.Wc,c,this);b.ne=!1}};function lo(a,b,c,d,e,f,h){for(var k=c?a.Wv():a.qg();k.next();){var l=k.value;l.Ac&&(e||l.jg||l.Wb(),l=l.iz(a),null!==l&&l!==a&&!b.contains(l)&&(b.add(l),e||(l.Ie(!0),l.dl(),ri(f,l,h)),2<d||l.mp))&&(l.mp=!1,lo(l,b,c,d-1,l.Wc,f,h))}a.Wc=!0}u.defineProperty(U,{Wc:"isTreeExpanded"},function(){return this.sq},function(a){var b=this.sq;if(b!==a){this.sq=a;var c=this.g;this.h("isTreeExpanded",b,a);b=this.CI;if(null!==b){var d=!0;null!==c&&(d=c.Oa,c.Oa=!0);b(this);null!==c&&(c.Oa=d)}a?null===c||c.ne||(0!==c.ga.Me&&c.Mb.nl(),c.ne=!0,a=c.rd,b=new F(U),b.add(this),lo(this,b,a,2,!1,c.Mb,this),c.ne=!1):null===c||c.ne||(0!==c.ga.Me&&c.Mb.nl(),c.ne=!0,a=c.rd,b=new F(U),b.add(this),ko(this,b,a,!0),c.ne=!1)}});u.defineProperty(U,{mp:"wasTreeExpanded"},function(){return this.bs},function(a){var b=this.bs;b!==a&&(this.bs=a,this.h("wasTreeExpanded",b,a))});u.defineProperty(U,{CI:"treeExpandedChanged"},function(){return this.Xr},function(a){var b=this.Xr;b!==a&&(null!==a&&u.j(a,"function",U,"treeExpandedChanged"),this.Xr=a,this.h("treeExpandedChanged",b,a))});u.defineProperty(U,{Ki:"isTreeLeaf"},function(){return this.tq},function(a){var b=this.tq;b!==a&&(this.tq=a,this.h("isTreeLeaf",b,a))});function W(){G.call(this,ah);this.Yf=null;this.yh="";this.ig=this.$p=null;this.Kh="";this.Wr=null;this.sr=this.rr=this.qr=!1;this.uq=!0;this.wp=dh;this.Jp=0;this.Mp=dh;this.Np=NaN;this.bm=Xl;this.Mr=0.5;this.we=null;this.Qc=(new E(w)).freeze();this.Zn=this.ye=null;this.jg=!1;this.qy=null;this.Ay=!1;this.cn=this.ei=this.Qa=null;this.kf=0;this.pn=this.ln=null;this.Vi=new E(z);this.Ey=new w;this.qC=this.oC=null;this.lx=!1;this.R=null}u.Ha(W,G);u.fa("Link",W);W.prototype.cloneProtected=function(a){G.prototype.cloneProtected.call(this,a);a.yh=this.yh;a.$p=this.$p;a.Kh=this.Kh;a.Wr=this.Wr;a.qr=this.qr;a.rr=this.rr;a.sr=this.sr;a.uq=this.uq;a.wp=this.wp;a.Jp=this.Jp;a.Mp=this.Mp;a.Np=this.Np;a.bm=this.bm;a.Mr=this.Mr;a.R=null!==this.R?this.R.copy():null};W.prototype.Oh=function(a){G.prototype.Oh.call(this,a);this.yh=a.yh;this.Kh=a.Kh;a.ye=null;a.Wb();a.cn=this.cn;a.kf=this.kf};var Xl;W.Normal=Xl=u.s(W,"Normal",1);W.Orthogonal=u.s(W,"Orthogonal",2);W.AvoidsNodes=u.s(W,"AvoidsNodes",6);var mo;W.AvoidsNodesStraight=mo=u.s(W,"AvoidsNodesStraight",7);var dh;W.None=dh=u.s(W,"None",0);var kh;W.Bezier=kh=u.s(W,"Bezier",9);var ch;W.JumpGap=ch=u.s(W,"JumpGap",10);var bh;W.JumpOver=bh=u.s(W,"JumpOver",11);var Ul;W.End=Ul=u.s(W,"End",17);var Vl;W.Scale=Vl=u.s(W,"Scale",18);var Wl;W.Stretch=Wl=u.s(W,"Stretch",19);var en;W.OrientAlong=en=u.s(W,"OrientAlong",21);var no;W.OrientPlus90=no=u.s(W,"OrientPlus90",22);var oo;W.OrientMinus90=oo=u.s(W,"OrientMinus90",23);var po;W.OrientOpposite=po=u.s(W,"OrientOpposite",24);var qo;W.OrientUpright=qo=u.s(W,"OrientUpright",25);var ro;W.OrientPlus90Upright=ro=u.s(W,"OrientPlus90Upright",26);var so;W.OrientMinus90Upright=so=u.s(W,"OrientMinus90Upright",27);var to;W.OrientUpright45=to=u.s(W,"OrientUpright45",28);W.prototype.Fe=function(){this.R=new il};W.prototype.hl=function(){var a=this.V;if(null!==a){var b=a.findVisibleNode();null!==b&&(a=b);if(Bj(a)||Cj(a)){return !1}}a=this.ba;return null!==a&&(b=a.findVisibleNode(),null!==b&&(a=b),Bj(a)||Cj(a))?!1:!0};W.prototype.eA=function(){return !1};W.prototype.Hd=function(){return !1};W.prototype.computeAngle=function(a,b,c){a=0;switch(b){default:case dh:a=0;break; + case en:a=c;break;case no:a=c+90;break;case oo:a=c-90;break;case po:a=c+180;break;case qo:a=K.dt(c);90<a&&270>a&&(a-=180);break;case ro:a=K.dt(c+90);90<a&&270>a&&(a-=180);break;case so:a=K.dt(c-90);90<a&&270>a&&(a-=180);break;case to:a=K.dt(c);if(45<a&&135>a||225<a&&315>a){return 0}90<a&&270>a&&(a-=180)}return K.dt(a)};u.defineProperty(W,{V:"fromNode"},function(){return this.Yf},function(a){var b=this.Yf;if(b!==a){var c=this.qd;null!==b&&(this.ig!==b&&fo(b,this,c),uo(this),this.H(Rj));this.Yf=a;this.ei=null;this.Wb();var d=this.g;if(null!==d){var e=this.data,f=d.ha;if(null!==e){if(f instanceof Q){var h=null!==a?a.data:null;f.Gw(e,f.wb(h))}else{f instanceof qe&&(h=null!==a?a.data:null,d.rd?f.kh(e,f.wb(h)):(null!==b&&f.kh(b.data,void 0),f.kh(h,f.wb(null!==this.ig?this.ig.data:null))))}}}e=this.qd;f=this.xD;null!==f&&(h=!0,null!==d&&(h=d.Oa,d.Oa=!0),f(this,c,e),null!==d&&(d.Oa=h));null!==a&&(this.ig!==a&&eo(a,this,e),vo(this),this.H(Jj));this.h("fromNode",b,a);xk(this)}});u.defineProperty(W,{rg:"fromPortId"},function(){return this.yh},function(a){var b=this.yh;if(b!==a){var c=this.qd;null!==c&&co(this.V,c);uo(this);this.yh=a;var d=this.qd;null!==d&&co(this.V,d);var e=this.g;if(null!==e){var f=this.data,h=e.ha;null!==f&&h instanceof Q&&h.bA(f,a)}c!==d&&(this.ei=null,this.Wb(),f=this.xD,null!==f&&(h=!0,null!==e&&(h=e.Oa,e.Oa=!0),f(this,c,d),null!==e&&(e.Oa=h)));vo(this);this.h("fromPortId",b,a)}});u.u(W,{qd:"fromPort"},function(){var a=this.Yf;return null===a?null:a.Xk(this.yh)});u.defineProperty(W,{xD:"fromPortChanged"},function(){return this.$p},function(a){var b=this.$p;b!==a&&(null!==a&&u.j(a,"function",W,"fromPortChanged"),this.$p=a,this.h("fromPortChanged",b,a))});u.defineProperty(W,{ba:"toNode"},function(){return this.ig},function(a){var b=this.ig;if(b!==a){var c=this.ge;null!==b&&(this.Yf!==b&&fo(b,this,c),uo(this),this.H(Rj));this.ig=a;this.ei=null;this.Wb();var d=this.g;if(null!==d){var e=this.data,f=d.ha;if(null!==e){if(f instanceof Q){var h=null!==a?a.data:null;f.Iw(e,f.wb(h))}else{f instanceof qe&&(h=null!==a?a.data:null,d.rd?(null!==b&&f.kh(b.data,void 0),f.kh(h,f.wb(null!==this.Yf?this.Yf.data:null))):f.kh(e,f.wb(h)))}}}e=this.ge;f=this.PE;null!==f&&(h=!0,null!==d&&(h=d.Oa,d.Oa=!0),f(this,c,e),null!==d&&(d.Oa=h));null!==a&&(this.Yf!==a&&eo(a,this,e),vo(this),this.H(Jj));this.h("toNode",b,a);xk(this)}});u.defineProperty(W,{mh:"toPortId"},function(){return this.Kh},function(a){var b=this.Kh;if(b!==a){var c=this.ge;null!==c&&co(this.ba,c);uo(this);this.Kh=a;var d=this.ge;null!==d&&co(this.ba,d);var e=this.g;if(null!==e){var f=this.data,h=e.ha;null!==f&&h instanceof Q&&h.fA(f,a)}c!==d&&(this.ei=null,this.Wb(),f=this.PE,null!==f&&(h=!0,null!==e&&(h=e.Oa,e.Oa=!0),f(this,c,d),null!==e&&(e.Oa=h)));vo(this);this.h("toPortId",b,a)}});u.u(W,{ge:"toPort"},function(){var a=this.ig;return null===a?null:a.Xk(this.Kh)});u.defineProperty(W,{PE:"toPortChanged"},function(){return this.Wr},function(a){var b=this.Wr;b!==a&&(null!==a&&u.j(a,"function",W,"toPortChanged"),this.Wr=a,this.h("toPortChanged",b,a))});u.defineProperty(W,{vb:"fromSpot"},function(){return null!==this.R?this.R.cj:uc},function(a){null===this.R&&this.Fe();var b=this.R.cj;b.L(a)||(a=a.Z(),this.R.cj=a,this.h("fromSpot",b,a),this.Wb())});u.defineProperty(W,{Yk:"fromEndSegmentLength"},function(){return null!==this.R?this.R.aj:NaN},function(a){null===this.R&&this.Fe();var b=this.R.aj;b!==a&&(0>a&&u.xa(a,">= 0",W,"fromEndSegmentLength"),this.R.aj=a,this.h("fromEndSegmentLength",b,a),this.Wb())});u.defineProperty(W,{Fs:"fromEndSegmentDirection"},function(){return null!==this.R?this.R.$i:Yn},function(a){null===this.R&&this.Fe();var b=this.R.$i;b!==a&&(this.R.$i=a,this.h("fromEndSegmentDirection",b,a),this.Wb())});u.defineProperty(W,{Gs:"fromShortLength"},function(){return null!==this.R?this.R.bj:NaN},function(a){null===this.R&&this.Fe();var b=this.R.bj;b!==a&&(this.R.bj=a,this.h("fromShortLength",b,a),this.Wb())});u.defineProperty(W,{xb:"toSpot"},function(){return null!==this.R?this.R.Ej:uc},function(a){null===this.R&&this.Fe();var b=this.R.Ej;b.L(a)||(a=a.Z(),this.R.Ej=a,this.h("toSpot",b,a),this.Wb())});u.defineProperty(W,{wl:"toEndSegmentLength"},function(){return null!==this.R?this.R.Cj:NaN},function(a){null===this.R&&this.Fe();var b=this.R.Cj;b!==a&&(0>a&&u.xa(a,">= 0",W,"toEndSegmentLength"),this.R.Cj=a,this.h("toEndSegmentLength",b,a),this.Wb())});u.defineProperty(W,{xt:"toEndSegmentDirection"},function(){return null!==this.R?this.R.Bj:Yn},function(a){null===this.R&&this.Fe();var b=this.R.Bj;b!==a&&(this.R.Bj=a,this.h("toEndSegmentDirection",b,a),this.Wb())});u.defineProperty(W,{zt:"toShortLength"},function(){return null!==this.R?this.R.Dj:NaN},function(a){null===this.R&&this.Fe();var b=this.R.Dj;b!==a&&(this.R.Dj=a,this.h("toShortLength",b,a),this.Wb())});function xk(a){var b=a.V,c=a.ba;null!==b?null!==c?wo(a,b.zG(c)):wo(a,null):wo(a,null)}function wo(a,b){var c=a.kk;if(c!==b){null!==c&&Sn(c,a);a.kk=b;null!==b&&Tn(b,a);var d=a.bD;if(null!==d){var e=!0,f=a.g; + null!==f&&(e=f.Oa,f.Oa=!0);d(a,c,b);null!==f&&(f.Oa=e)}!a.jg||a.oC!==c&&a.qC!==c||a.Wb()}}W.prototype.dl=function(){var a=this.Sa;null!==a&&this.V!==a&&this.ba!==a&&G.prototype.dl.call(this)};W.prototype.getOtherNode=W.prototype.iz=function(a){var b=this.V;return a===b?this.ba:b};W.prototype.getOtherPort=function(a){var b=this.qd;return a===b?this.ge:b};u.u(W,{JJ:"isLabeledLink"},function(){return null===this.we?!1:0<this.we.count});u.u(W,{wg:"labelNodes"},function(){return null===this.we?Ia:this.we.i});function ho(a,b){null===a.we&&(a.we=new F(U));a.we.add(b);a.S()}W.prototype.Ks=function(a){G.prototype.Ks.call(this,a);xo(this)&&eh(this,this.ca);if(!a){a=this.Yf;var b=this.ig;null!==a&&(eo(a,this,this.qd),vo(this));null!==b&&(eo(b,this,this.ge),vo(this))}};W.prototype.Ls=function(a){G.prototype.Ls.call(this,a);xo(this)&&eh(this,this.ca);if(!a){a=this.Yf;var b=this.ig;null!==a&&(fo(a,this,this.qd),uo(this));null!==b&&(fo(b,this,this.ge),uo(this))}};W.prototype.Bm=function(){this.jg=!0;if(null!==this.we){var a=this.g;if(null===a){return}for(var b=this.we.copy().i;b.next();){a.remove(b.value)}}b=this.data;null!==b&&(a=this.g,null!==a&&(a=a.ha,a instanceof Q?a.Vz(b):a instanceof qe&&a.kh(b,void 0)))};W.prototype.updateRelationshipsFromData=function(){var a=this.data;if(null!==a){var b=this.g;if(null!==b){var c=b.ha;if(c instanceof Q){var d=c.$k(a),e=b.Ye(d),f=this.V;e!==f&&(e=null!==f?c.wb(f.data):void 0,f=c.Mo,"function"===typeof f?f(a,e):a[f]=e,c.Gw(a,d));d=c.cl(a);e=b.Ye(d);f=this.ba;e!==f&&(e=null!==f?c.wb(f.data):void 0,f=c.Oo,"function"===typeof f?f(a,e):a[f]=e,c.Iw(a,d));var h=c.Pj(a);if(0<h.length||0<this.wg.count){if(1===h.length&&1===this.wg.count&&(b=h[0],d=this.wg.first(),c.wb(d.data)===b)){return}var d=(new F).Ud(h),k=new F;this.wg.each(function(a){null!==a.data&&(a=c.wb(a.data),void 0!==a&&k.add(a))});b=k.copy();b.kE(d);d=d.copy();d.kE(k);if(0<b.count||0<d.count){h.length=0,k.each(function(a){h.push(a)}),b.each(function(b){c.nE(a,b)}),d.each(function(b){c.Ny(a,b)})}}}}}};W.prototype.move=W.prototype.move=function(a){var b=this.position,c=b.x;isNaN(c)&&(c=0);b=b.y;isNaN(b)&&(b=0);c=a.x-c;b=a.y-b;G.prototype.move.call(this,a);this.ml(c,b);for(a=this.wg;a.next();){var d=a.value,e=d.position;d.moveTo(e.x+c,e.y+b)}};u.defineProperty(W,{SH:"relinkableFrom"},function(){return this.qr},function(a){var b=this.qr;b!==a&&(this.qr=a,this.h("relinkableFrom",b,a),this.$d())});u.defineProperty(W,{TH:"relinkableTo"},function(){return this.rr},function(a){var b=this.rr;b!==a&&(this.rr=a,this.h("relinkableTo",b,a),this.$d())});W.prototype.canRelinkFrom=function(){if(!this.SH){return !1}var a=this.layer;if(null===a){return !0}if(!a.qm){return !1}a=a.g;return null===a||a.qm?!0:!1};W.prototype.canRelinkTo=function(){if(!this.TH){return !1}var a=this.layer;if(null===a){return !0}if(!a.qm){return !1}a=a.g;return null===a||a.qm?!0:!1};u.defineProperty(W,{jt:"resegmentable"},function(){return this.sr},function(a){var b=this.sr;b!==a&&(this.sr=a,this.h("resegmentable",b,a),this.$d())});u.defineProperty(W,{Ac:"isTreeLink"},function(){return this.uq},function(a){var b=this.uq;b!==a&&(this.uq=a,this.h("isTreeLink",b,a),null!==this.V&&Jk(this.V),null!==this.ba&&Jk(this.ba))});u.u(W,{path:"path"},function(){var a=this.Jf();return a instanceof X?a:null});u.u(W,{Qm:"routeBounds"},function(){this.updateRoute();var a=new z;var b=Infinity,c=Infinity,d=this.ka;if(0===d){a.m(NaN,NaN,0,0)}else{if(1===d){d=this.l(0),b=Math.min(d.x,b),c=Math.min(d.y,c),a.m(d.x,d.y,0,0)}else{if(2===d){var e=this.l(0),f=this.l(1),b=Math.min(e.x,f.x),c=Math.min(e.y,f.y);a.m(e.x,e.y,0,0);a.Pi(f)}else{if(this.computeCurve()===kh&&3<=d&&!this.ec){if(e=this.l(0),b=e.x,c=e.y,a.m(b,c,0,0),3===d){d=this.l(1),b=Math.min(d.x,b),c=Math.min(d.y,c),f=this.l(2),b=Math.min(f.x,b),c=Math.min(f.y,c),K.qo(e.x,e.y,d.x,d.y,d.x,d.y,f.x,f.y,0.5,a)}else{for(var h=3;h<d;h+=3){var k=this.l(h-2);h+3>=d&&(h=d-1);var l=this.l(h-1),f=this.l(h);K.qo(e.x,e.y,k.x,k.y,l.x,l.y,f.x,f.y,0.5,a);b=Math.min(f.x,b);c=Math.min(f.y,c);e=f}}}else{for(e=this.l(0),f=this.l(1),b=Math.min(e.x,f.x),c=Math.min(e.y,f.y),a.m(e.x,e.y,0,0),a.Pi(f),h=2;h<d;h++){e=this.l(h),b=Math.min(e.x,b),c=Math.min(e.y,c),a.Pi(e)}}}}this.Ey.m(b-a.x,c-a.y)}return this.qy=a});u.u(W,{YD:"midPoint"},function(){this.updateRoute();return this.computeMidPoint(new w)});W.prototype.computeMidPoint=function(a){var b=this.ka;if(0===b){return a.assign(K.gF),a}if(1===b){return a.assign(this.l(0)),a}if(2===b){var c=this.l(0),d=this.l(1);a.m((c.x+d.x)/2,(c.y+d.y)/2);return a}if(this.computeCurve()===kh&&3<=b&&!this.ec){if(3===b){return this.l(1)}var b=(b-1)/3|0,e=3*(b/2|0);1===b%2?(c=this.l(e),d=this.l(e+1),b=this.l(e+2),e=this.l(e+3),K.VF(c.x,c.y,d.x,d.y,b.x,b.y,e.x,e.y,a)):a.assign(this.l(e));return a}for(var e=0,f=u.hb(),h=0;h<b-1;h++){c=0,c=this.l(h),d=this.l(h+1),K.Wa(c.x,d.x)?(c=d.y-c.y,0>c&&(c=-c)):K.Wa(c.y,d.y)?(c=d.x-c.x,0>c&&(c=-c)):c=Math.sqrt(c.Lj(d)),f.push(c),e+=c}for(d=h=c=0;c<e/2&&h<b;){d=f[h];if(c+d>e/2){break}c+=d;h++}u.sa(f); + b=this.l(h);f=this.l(h+1);b.x===f.x?b.y>f.y?a.m(b.x,b.y-(e/2-c)):a.m(b.x,b.y+(e/2-c)):b.y===f.y?b.x>f.x?a.m(b.x-(e/2-c),b.y):a.m(b.x+(e/2-c),b.y):(e=(e/2-c)/d,a.m(b.x+e*(f.x-b.x),b.y+e*(f.y-b.y)));return a};u.u(W,{XD:"midAngle"},function(){this.updateRoute();return this.computeMidAngle()});W.prototype.computeMidAngle=function(){var a=this.ka;if(2>a){return NaN}if(this.computeCurve()===kh&&4<=a&&!this.ec){var b=(a-1)/3|0,c=3*(b/2|0);if(1===b%2){var c=Math.floor(c),a=this.l(c),b=this.l(c+1),d=this.l(c+2),c=this.l(c+3);return K.UF(a.x,a.y,b.x,b.y,d.x,d.y,c.x,c.y)}if(0<c&&c+1<a){return a=this.l(c-1),b=this.l(c+1),a.Gi(b)}}d=a/2|0;if(0===a%2){return a=this.l(d-1),b=this.l(d),a.Gi(b)}var a=this.l(d-1),b=this.l(d),d=this.l(d+1),c=a.Lj(b),e=b.Lj(d);return c>e?a.Gi(b):b.Gi(d)};u.defineProperty(W,{points:"points"},function(){return this.Qc},function(a){var b=this.Qc;if(b!==a){var c=null;if(Array.isArray(a)){var d=0===a.length%2;if(d){for(var e=0;e<a.length;e++){if("number"!==typeof a[e]||isNaN(a[e])){d=!1;break}}}if(d){for(c=new E(w),d=0;d<a.length/2;d++){e=(new w(a[2*d],a[2*d+1])).freeze(),c.add(e)}}else{for(var f=!0,d=0;d<a.length;d++){if(e=a[d],!u.Ta(e)||"number"!==typeof e.x||isNaN(e.x)||"number"!==typeof e.y||isNaN(e.y)){f=!1;break}}if(f){for(c=new E(w),d=0;d<a.length;d++){e=a[d],c.add((new w(e.x,e.y)).freeze())}}else{u.k("Link.points array must contain only an even number of numbers or objects with x and y properties, not: "+a)}}}else{if(a instanceof E){for(c=a.copy(),a=c.i;a.next();){a.value.freeze()}}else{u.k("Link.points value is not an instance of List or Array: "+a)}}c.freeze();this.Qc=c;this.me();yo(this);a=this.g;null!==a&&(a.ga.fb||a.rw.add(this),a.Mb.cd&&(this.Zn=c));this.h("points",b,c)}});u.u(W,{ka:"pointsCount"},function(){return this.Qc.count});W.prototype.getPoint=W.prototype.l=function(a){return this.Qc.n[a]};W.prototype.setPoint=W.prototype.zf=function(a,b){null===this.ye&&u.k("Call Link.startRoute before modifying the points of the route.");this.Qc.Dg(a,b)};W.prototype.setPointAt=W.prototype.U=function(a,b,c){null===this.ye&&u.k("Call Link.startRoute before modifying the points of the route.");this.Qc.Dg(a,new w(b,c))};W.prototype.insertPoint=function(a,b){null===this.ye&&u.k("Call Link.startRoute before modifying the points of the route.");this.Qc.Zd(a,b)};W.prototype.insertPointAt=W.prototype.w=function(a,b,c){null===this.ye&&u.k("Call Link.startRoute before modifying the points of the route.");this.Qc.Zd(a,new w(b,c))};W.prototype.addPoint=W.prototype.Lh=function(a){null===this.ye&&u.k("Call Link.startRoute before modifying the points of the route.");this.Qc.add(a)};W.prototype.addPointAt=W.prototype.Lk=function(a,b){null===this.ye&&u.k("Call Link.startRoute before modifying the points of the route.");this.Qc.add(new w(a,b))};W.prototype.removePoint=W.prototype.oE=function(a){null===this.ye&&u.k("Call Link.startRoute before modifying the points of the route.");this.Qc.kd(a)};W.prototype.clearPoints=W.prototype.uo=function(){null===this.ye&&u.k("Call Link.startRoute before modifying the points of the route.");this.Qc.clear()};W.prototype.movePoints=W.prototype.ml=function(a,b){for(var c=new E(w),d=this.Qc.i;d.next();){var e=d.value;c.add((new w(e.x+a,e.y+b)).freeze())}c.freeze();d=this.Qc;this.Qc=c;this.me();yo(this);e=this.g;null!==e&&e.Mb.cd&&(this.Zn=c);this.h("points",d,c)};W.prototype.startRoute=W.prototype.sl=function(){null===this.ye&&(this.ye=this.Qc,this.Qc=this.Qc.copy())};W.prototype.commitRoute=W.prototype.Ci=function(){if(null!==this.ye){for(var a=this.ye,b=this.Qc,c=Infinity,d=Infinity,e=a.n,f=e.length,h=0;h<f;h++){var k=e[h],c=Math.min(k.x,c),d=Math.min(k.y,d)}for(var l=Infinity,m=Infinity,n=b.n,p=n.length,h=0;h<p;h++){k=n[h],l=Math.min(k.x,l),m=Math.min(k.y,m),k.freeze()}b.freeze();if(p===f){for(h=0;h<p;h++){if(f=e[h],k=n[h],f.x-c!==k.x-l||f.y-d!==k.y-m){this.me();break}}}else{this.me()}this.ye=null;c=this.g;null!==c&&c.Mb.cd&&(this.Zn=b);yo(this);this.h("points",a,b)}};W.prototype.rollbackRoute=W.prototype.YH=function(){null!==this.ye&&(this.Qc=this.ye,this.ye=null)};function yo(a){0===a.Qc.count?a.jg=!1:(a.jg=!0,a.ln=a.l(0).copy(),a.pn=a.l(a.ka-1).copy(),zo(a,!1))}W.prototype.invalidateRoute=W.prototype.Wb=function(){if(!(this.Ay||this.g&&(this.g.rw.contains(this)||this.g.ga.fb))){var a=this.path;null!==a&&(this.jg=!1,this.me(),a.S())}};u.defineProperty(W,{kp:null},function(){return this.Ay},function(a){this.Ay=a});W.prototype.updateRoute=function(){if(!this.jg&&!this.lx){var a=!0;try{this.lx=!0,this.sl(),a=this.computePoints()}finally{this.lx=!1,a?this.Ci():this.YH()}}};W.prototype.computePoints=function(){var a=this.g;if(null===a){return !1}var b=this.V,c=null;null===b?(a.cm||(a.Zu=new X,a.Zu.za=K.qp,a.Zu.jb=0,a.cm=new U,a.cm.add(a.Zu),a.cm.rf()),this.ln&&(a.cm.position=a.cm.location=this.ln,a.cm.rf(),b=a.cm,c=a.Zu)):c=this.qd;if(null!==c){var d=Nl(c);d!==b&&b.Ia()?c=d:(d=b.findVisibleNode(),null!==d&&d!==b?(b=d,c=d.Xk("")):b=d)}this.oC=b;if(null===b||null===c||!b.location.I()){return !1 + }var d=this.ba,e=null;null===d?(a.dm||(a.$u=new X,a.$u.za=K.qp,a.$u.jb=0,a.dm=new U,a.dm.add(a.$u),a.dm.rf()),this.pn&&(a.dm.position=a.dm.location=this.pn,a.dm.rf(),d=a.dm,e=a.$u)):e=this.ge;null!==e&&(a=Nl(e),a!==d&&d.Ia()?e=a:(a=d.findVisibleNode(),null!==a&&a!==d?(d=a,e=a.Xk("")):d=a));this.qC=d;if(null===d||null===e||!d.location.I()){return !1}var a=this.ka,f=Ao(this,c),h=Bo(this,e),k=c===e&&null!==c,l=this.ec,m=this.We===kh;this.ei=k&&!l?m=!0:!1;var n=this.gs===dh||k;if(l||f!==vb||h!==vb||k){m=this.el;n&&(l&&m||k)&&this.uo();var p=k?this.computeCurviness():0,q=this.getLinkPoint(b,c,f,!0,l,d,e),r=0,s=0,t=0;if(l||f!==vb||k){var v=this.computeEndSegmentLength(b,c,f,!0),t=this.getLinkDirection(b,c,q,f,!0,l,d,e);k&&(t-=l?90:30,0>p&&(t-=180));0>t?t+=360:360<=t&&(t-=360);k&&(v+=Math.abs(p));0===t?r=v:90===t?s=v:180===t?r=-v:270===t?s=-v:(r=v*Math.cos(t*Math.PI/180),s=v*Math.sin(t*Math.PI/180));if(f.oe()&&k){var x=c.eb(Ib,u.K()),A=u.Yb(x.x+1000*r,x.y+1000*s);this.getLinkPointFromPoint(b,c,x,A,!0,q);u.v(x);u.v(A)}}var v=this.getLinkPoint(d,e,h,!1,l,b,c),y=0,C=0,I=0;if(l||h!==vb||k){x=this.computeEndSegmentLength(d,e,h,!1),I=this.getLinkDirection(d,e,v,h,!1,l,b,c),k&&(I+=l?0:30,0>p&&(I+=180)),0>I?I+=360:360<=I&&(I-=360),k&&(x+=Math.abs(p)),0===I?y=x:90===I?C=x:180===I?y=-x:270===I?C=-x:(y=x*Math.cos(I*Math.PI/180),C=x*Math.sin(I*Math.PI/180)),h.oe()&&k&&(x=e.eb(Ib,u.K()),A=u.Yb(x.x+1000*y,x.y+1000*C),this.getLinkPointFromPoint(d,e,x,A,!1,v),u.v(x),u.v(A))}e=q;if(l||f!==vb||k){e=new w(q.x+r,q.y+s)}c=v;if(l||h!==vb||k){c=new w(v.x+y,v.y+C)}!n&&!l&&f===vb&&3<a&&this.adjustPoints(0,q,a-2,c)?this.zf(a-1,v):!n&&!l&&h===vb&&3<a&&this.adjustPoints(1,e,a-1,v)?this.zf(0,q):!n&&!l&&4<a&&this.adjustPoints(1,e,a-2,c)?(this.zf(0,q),this.zf(a-1,v)):!n&&l&&6<=a&&!m&&this.adjustPoints(1,e,a-2,c)?(this.zf(0,q),this.zf(a-1,v)):(this.uo(),this.Lh(q),(l||f!==vb||k)&&this.Lh(e),l&&this.addOrthoPoints(e,t,c,I,b,d),(l||h!==vb||k)&&this.Lh(c),this.Lh(v))}else{f=!1,!n&&3<=a&&(n=this.getLinkPoint(b,c,vb,!0,!1,d,e),h=this.getLinkPoint(d,e,vb,!1,!1,b,c),f=this.adjustPoints(0,n,a-1,h))&&(n=this.getLinkPoint(b,c,vb,!0,!1,d,e),h=this.getLinkPoint(d,e,vb,!1,!1,b,c),this.adjustPoints(0,n,a-1,h)),f||(this.uo(),m?(a=this.getLinkPoint(b,c,vb,!0,!1,d,e),n=this.getLinkPoint(d,e,vb,!1,!1,b,c),f=n.x-a.x,h=n.y-a.y,k=this.computeCurviness(),m=l=0,q=a.x+f/3,t=a.y+h/3,r=q,s=t,K.D(h,0)?s=0<f?s-k:s+k:(l=-f/h,m=Math.sqrt(k*k/(l*l+1)),0>k&&(m=-m),r=(0>h?-1:1)*m+q,s=l*(r-q)+t),q=a.x+2*f/3,t=a.y+2*h/3,v=q,y=t,K.D(h,0)?y=0<f?y-k:y+k:(v=(0>h?-1:1)*m+q,y=l*(v-q)+t),this.uo(),this.Lh(a),this.Lk(r,s),this.Lk(v,y),this.Lh(n),this.zf(0,this.getLinkPoint(b,c,vb,!0,!1,d,e)),this.zf(3,this.getLinkPoint(d,e,vb,!1,!1,b,c))):(a=d,d=this.getLinkPoint(b,c,vb,!0,!1,a,e),e=this.getLinkPoint(a,e,vb,!1,!1,b,c),this.hasCurviness()?(h=e.x-d.x,b=e.y-d.y,c=this.computeCurviness(),a=d.x+h/2,n=d.y+b/2,f=a,k=n,K.D(b,0)?k=0<h?k-c:k+c:(h=-h/b,f=Math.sqrt(c*c/(h*h+1)),0>c&&(f=-f),f=(0>b?-1:1)*f+a,k=h*(f-a)+n),this.Lh(d),this.Lk(f,k)):this.Lh(d),this.Lh(e)))}return !0};function Co(a,b){Math.abs(b.x-a.x)>Math.abs(b.y-a.y)?(b.x=b.x>=a.x?a.x+9000000000:a.x-9000000000,b.y=a.y):(b.y=b.y>=a.y?a.y+9000000000:a.y-9000000000,b.x=a.x);return b}W.prototype.getLinkPointFromPoint=function(a,b,c,d,e,f){void 0===f&&(f=new w);if(null===a||null===b){return f.assign(c),f}a.Ia()||(e=a.findVisibleNode(),null!==e&&e!==a&&(b=e.port));var h=e=0,k=0,l=0;a=null;e=b.P;null===e||e.Uf()||(e=e.P);if(null===e){e=d.x,h=d.y,k=c.x,l=c.y}else{a=e.Gf;e=1/(a.m11*a.m22-a.m12*a.m21);var k=a.m22*e,l=-a.m12*e,m=-a.m21*e,n=a.m11*e,p=e*(a.m21*a.dy-a.m22*a.dx),q=e*(a.m12*a.dx-a.m11*a.dy);e=d.x*k+d.y*m+p;h=d.x*l+d.y*n+q;k=c.x*k+c.y*m+p;l=c.x*l+c.y*n+q}b.Fo(e,h,k,l,f);null!==a&&f.transform(a);return f};function Do(a,b){var c=b.lr;null===c&&(c=new Eo,c.port=b,c.Bc=b.W,b.lr=c);return Fo(c,a)}W.prototype.getLinkPoint=function(a,b,c,d,e,f,h,k){void 0===k&&(k=new w);if(c.Vc()){return b.eb(c,k),k}if(c.jl()&&(c=Do(this,b),null!==c)){k.assign(c.No);if(e&&this.Bw===mo){var l=Do(this,h);if(c.zm<l.zm){c=u.K();var l=u.K(),m=new z(b.eb(xb,c),b.eb(Vb,l)),n=this.computeSpot(!d);a=this.getLinkPoint(f,h,n,!d,e,a,b,l);a.x>=m.x&&a.x<=m.x+m.width?k.x=a.x:a.y>=m.y&&a.y<=m.y+m.height&&(k.y=a.y);u.v(c);u.v(l)}}return k}f=b.eb(Ib,u.K());l=c=null;this.ka>(e?6:2)?(l=d?this.l(1):this.l(this.ka-2),e&&(l=Co(f,l.copy()))):(c=u.K(),l=h.eb(Ib,c),e&&(l=Co(f,l)));this.getLinkPointFromPoint(a,b,f,l,d,k);u.v(f);null!==c&&u.v(c);return k};W.prototype.getLinkDirection=function(a,b,c,d,e,f,h,k){a:if(d.Vc()){c=d.x>d.y?d.x>1-d.y?0:d.x<1-d.y?270:315:d.x<d.y?d.x>1-d.y?90:d.x<1-d.y?180:135:0.5>d.x?225:0.5<d.x?45:0}else{if(d.jl()){var l=Do(this,b);if(null!==l){switch(l.fe){case u.Yc:c=270;break a;case u.Ec:c=180;break a;default:case u.Nc:c=0;break a;case u.Mc:c=90;break a}}}var l=b.eb(Ib,u.K()),m=null,n=null;this.ka>(f?6:2)?(n=e?this.l(1):this.l(this.ka-2),n=f?Co(l,n.copy()):c):(m=u.K(),n=k.eb(Ib,m));c=0;c=Math.abs(n.x-l.x)>Math.abs(n.y-l.y)?n.x>=l.x?0:180:n.y>=l.y?90:270;u.v(l); + null!==m&&u.v(m)}d.oe()&&h.Rh(a)&&(c+=180,360<=c&&(c-=360));a=Yn;a=e?this.Fs:this.xt;a===Yn&&(a=e?b.Fs:b.xt);switch(a){case Zn:b=b.Zk();c+=b;360<=c&&(c-=360);break;case Yn:case jl:b=b.Zk();if(0===b){break}45<=b&&135>b?c+=90:135<=b&&225>b?c+=180:225<=b&&315>b&&(c+=270);360<=c&&(c-=360)}return c};W.prototype.computeEndSegmentLength=function(a,b,c,d){if(null!==b&&c.jl()&&(a=Do(this,b),null!==a)){return a.Sv}a=NaN;a=d?this.Yk:this.wl;null!==b&&isNaN(a)&&(a=d?b.Yk:b.wl);isNaN(a)&&(a=10);return a};W.prototype.computeSpot=function(a){return a?Ao(this,this.qd):Bo(this,this.ge)};function Ao(a,b){if(null===b){return Ib}var c=a.vb;c.Kc()&&(void 0===b&&(b=a.qd),null!==b&&(c=b.vb));return c===uc?vb:c}function Bo(a,b){if(null===b){return Ib}var c=a.xb;c.Kc()&&(void 0===b&&(b=a.ge),null!==b&&(c=b.xb));return c===uc?vb:c}W.prototype.computeOtherPoint=function(a,b){var c=b.eb(Ib),d;d=b.lr;d=null!==d?Fo(d,this):null;null!==d&&(c=d.No);return c};W.prototype.computeShortLength=function(a){return a?Go(this):Ho(this)};function Go(a){var b=a.Gs;isNaN(b)&&(a=a.qd,null!==a&&(b=a.Gs));return isNaN(b)?0:b}function Ho(a){var b=a.zt;isNaN(b)&&(a=a.ge,null!==a&&(b=a.zt));return isNaN(b)?0:b}W.prototype.Nj=function(a,b,c,d,e,f){if(!1===this.Cg){return !1}void 0===b&&(b=null);void 0===c&&(c=null);var h=f;void 0===f&&(h=u.lh(),h.reset());h.multiply(this.transform);if(this.wm(a,h)){return Um(this,b,c,e),void 0===f&&u.Ze(h),!0}if(this.ug(a,h)){var k=!1;if(!this.Mg){for(var l=this.Aa.n,m=l.length;m--;){var n=l[m];if(n.visible||n===this.fc){var p=n.ca,q=this.Ja;if(!(p.x>q.width||p.y>q.height||0>p.x+p.width||0>p.y+p.height)){p=u.lh();p.set(h);if(n instanceof B){k=n.Nj(a,b,c,d,e,p)}else{if(this.path===n){var k=n,r=a,s=d,q=p;if(!1===k.Cg){k=!1}else{if(q.multiply(k.transform),s){b:{var t=r,v=q;if(k.wm(t,v)){k=!0}else{if(void 0===v&&(v=k.transform,t.Kj(k.ca))){k=!0;break b}var q=t.left,r=t.right,s=t.top,t=t.bottom,x=u.K(),A=u.K(),y=u.K(),C=u.lh();C.set(v);C.bE(k.transform);C.pz();A.x=r;A.y=s;A.transform(C);x.x=q;x.y=s;x.transform(C);v=!1;cn(k,x,A,y)?v=!0:(x.x=r,x.y=t,x.transform(C),cn(k,x,A,y)?v=!0:(A.x=q,A.y=t,A.transform(C),cn(k,x,A,y)?v=!0:(x.x=q,x.y=s,x.transform(C),cn(k,x,A,y)&&(v=!0))));u.Ze(C);u.v(x);u.v(A);u.v(y);k=v}}}else{k=k.wm(r,q)}}}else{k=ol(n,a,d,p)}}k&&(null!==b&&(n=b(n)),n&&(null===c||c(n))&&e.add(n));u.Ze(p)}}}}void 0===f&&u.Ze(h);return k||null!==this.background||null!==this.rm}void 0===f&&u.Ze(h);return !1};u.u(W,{ec:"isOrthogonal"},function(){return 2===(this.bm.value&2)});u.u(W,{el:"isAvoiding"},function(){return 4===(this.bm.value&4)});W.prototype.computeCurve=function(){if(null===this.ei){var a=this.qd,b=this.ec;this.ei=null!==a&&a===this.ge&&!b}return this.ei?kh:this.We};W.prototype.computeCorner=function(){if(this.We===kh){return 0}var a=this.Zy;if(isNaN(a)||0>a){a=10}return a};W.prototype.computeCurviness=function(){var a=this.Ov;if(isNaN(a)){var b=this.kf;if(0!==b){var a=10,c=this.g;null!==c&&(a=c.pw);c=Math.abs(b);a=a/2+((c-1)/2|0)*a;0===c%2&&(a=-a);0>b&&(a=-a)}else{a=10}}return a};W.prototype.computeThickness=function(){var a=this.path;return null!==a?Math.max(a.jb,1):1};W.prototype.hasCurviness=function(){return !isNaN(this.Ov)||0!==this.kf&&!this.ec};W.prototype.adjustPoints=function(a,b,c,d){var e=this.gs;if(this.ec){if(e===Vl){return !1}e===Wl&&(e=Ul)}switch(e){case Vl:var f=this.l(a),h=this.l(c);if(!f.pd(b)||!h.pd(d)){var e=f.x,f=f.y,k=h.x-e,l=h.y-f,m=Math.sqrt(k*k+l*l);if(!K.D(m,0)){var n=0;K.D(k,0)?n=0>l?-Math.PI/2:Math.PI/2:(n=Math.atan(l/Math.abs(k)),0>k&&(n=Math.PI-n));var h=b.x,p=b.y,l=d.x-h,q=d.y-p,r=Math.sqrt(l*l+q*q),k=0;K.D(l,0)?k=0>q?-Math.PI/2:Math.PI/2:(k=Math.atan(q/Math.abs(l)),0>l&&(k=Math.PI-k));m=r/m;n=k-n;this.zf(a,b);for(a+=1;a<c;a++){b=this.l(a),k=b.x-e,l=b.y-f,b=Math.sqrt(k*k+l*l),K.D(b,0)||(q=0,K.D(k,0)?q=0>l?-Math.PI/2:Math.PI/2:(q=Math.atan(l/Math.abs(k)),0>k&&(q=Math.PI-q)),k=q+n,b*=m,this.U(a,h+b*Math.cos(k),p+b*Math.sin(k)))}this.zf(c,d)}}return !0;case Wl:f=this.l(a);p=this.l(c);if(!f.pd(b)||!p.pd(d)){var e=f.x,f=f.y,h=p.x,p=p.y,m=(h-e)*(h-e)+(p-f)*(p-f),k=b.x,n=b.y,l=d.x,q=d.y,r=0,s=1,r=0!==l-k?(q-n)/(l-k):9000000000;0!==r&&(s=Math.sqrt(1+1/(r*r)));this.zf(a,b);for(a+=1;a<c;a++){b=this.l(a);var t=b.x,v=b.y,x=0.5;0!==m&&(x=((e-t)*(e-h)+(f-v)*(f-p))/m);var A=e+x*(h-e),y=f+x*(p-f);b=Math.sqrt((t-A)*(t-A)+(v-y)*(v-y));v<r*(t-A)+y&&(b=-b);0<r&&(b=-b);t=k+x*(l-k);x=n+x*(q-n);0!==r?(b=t+b/s,this.U(a,b,x-(b-t)/r)):this.U(a,t,x+b)}this.zf(c,d)}return !0;case Ul:return this.ec&&(e=this.l(a),f=this.l(a+1),h=this.l(a+2),K.D(e.y,f.y)?K.D(f.x,h.x)?this.U(a+1,f.x,b.y):K.D(f.y,h.y)&&this.U(a+1,b.x,f.y):K.D(e.x,f.x)&&(K.D(f.y,h.y)?this.U(a+1,b.x,f.y):K.D(f.x,h.x)&&this.U(a+1,f.x,b.y)),e=this.l(c),f=this.l(c-1),h=this.l(c-2),K.D(e.y,f.y)?K.D(f.x,h.x)?this.U(c-1,f.x,d.y):K.D(f.y,h.y)&&this.U(c-1,d.x,f.y):K.D(e.x,f.x)&&(K.D(f.y,h.y)?this.U(c-1,d.x,f.y):K.D(f.x,h.x)&&this.U(c-1,f.x,d.y))),this.zf(a,b),this.zf(c,d),!0;default:return !1}};W.prototype.addOrthoPoints=function(a,b,c,d,e,f){b=-45<=b&&45>b?0:45<=b&&135>b?90:135<=b&&225>b?180:270; + d=-45<=d&&45>d?0:45<=d&&135>d?90:135<=d&&225>d?180:270;var h=e.ca.copy(),k=f.ca.copy();if(h.I()&&k.I()){h.Kf(8,8);k.Kf(8,8);h.Pi(a);k.Pi(c);var l,m;if(0===b){if(c.x>a.x||270===d&&c.y<a.y&&k.right>a.x||90===d&&c.y>a.y&&k.right>a.x){l=new w(c.x,a.y),m=new w(c.x,(a.y+c.y)/2),180===d?(l.x=this.computeMidOrthoPosition(a.x,c.x,!1),m.x=l.x,m.y=c.y):270===d&&c.y<a.y||90===d&&c.y>a.y?(l.x=a.x<k.left?this.computeMidOrthoPosition(a.x,k.left,!1):a.x<k.right&&(270===d&&a.y<k.top||90===d&&a.y>k.bottom)?this.computeMidOrthoPosition(a.x,c.x,!1):k.right,m.x=l.x,m.y=c.y):0===d&&a.x<k.left&&a.y>k.top&&a.y<k.bottom&&(l.x=a.x,l.y=a.y<c.y?Math.min(c.y,k.top):Math.max(c.y,k.bottom),m.y=l.y)}else{l=new w(a.x,c.y);m=new w((a.x+c.x)/2,c.y);if(180===d||90===d&&c.y<h.top||270===d&&c.y>h.bottom){180===d&&(k.Da(a)||h.Da(c))?l.y=this.computeMidOrthoPosition(a.y,c.y,!0):c.y<a.y&&(180===d||90===d)?l.y=this.computeMidOrthoPosition(h.top,Math.max(c.y,k.bottom),!0):c.y>a.y&&(180===d||270===d)&&(l.y=this.computeMidOrthoPosition(h.bottom,Math.min(c.y,k.top),!0)),m.x=c.x,m.y=l.y}if(l.y>h.top&&l.y<h.bottom){if(c.x>=h.left&&c.x<=a.x||a.x<=k.right&&a.x>=c.x){if(90===d||270===d){l=new w(Math.max((a.x+c.x)/2,a.x),a.y),m=new w(l.x,c.y)}}else{l.y=270===d||(0===d||180===d)&&c.y<a.y?Math.min(c.y,0===d?h.top:Math.min(h.top,k.top)):Math.max(c.y,0===d?h.bottom:Math.max(h.bottom,k.bottom)),m.x=c.x,m.y=l.y}}}}else{if(180===b){if(c.x<a.x||270===d&&c.y<a.y&&k.left<a.x||90===d&&c.y>a.y&&k.left<a.x){l=new w(c.x,a.y),m=new w(c.x,(a.y+c.y)/2),0===d?(l.x=this.computeMidOrthoPosition(a.x,c.x,!1),m.x=l.x,m.y=c.y):270===d&&c.y<a.y||90===d&&c.y>a.y?(l.x=a.x>k.right?this.computeMidOrthoPosition(a.x,k.right,!1):a.x>k.left&&(270===d&&a.y<k.top||90===d&&a.y>k.bottom)?this.computeMidOrthoPosition(a.x,c.x,!1):k.left,m.x=l.x,m.y=c.y):180===d&&a.x>k.right&&a.y>k.top&&a.y<k.bottom&&(l.x=a.x,l.y=a.y<c.y?Math.min(c.y,k.top):Math.max(c.y,k.bottom),m.y=l.y)}else{l=new w(a.x,c.y);m=new w((a.x+c.x)/2,c.y);if(0===d||90===d&&c.y<h.top||270===d&&c.y>h.bottom){0===d&&(k.Da(a)||h.Da(c))?l.y=this.computeMidOrthoPosition(a.y,c.y,!0):c.y<a.y&&(0===d||90===d)?l.y=this.computeMidOrthoPosition(h.top,Math.max(c.y,k.bottom),!0):c.y>a.y&&(0===d||270===d)&&(l.y=this.computeMidOrthoPosition(h.bottom,Math.min(c.y,k.top),!0)),m.x=c.x,m.y=l.y}if(l.y>h.top&&l.y<h.bottom){if(c.x<=h.right&&c.x>=a.x||a.x>=k.left&&a.x<=c.x){if(90===d||270===d){l=new w(Math.min((a.x+c.x)/2,a.x),a.y),m=new w(l.x,c.y)}}else{l.y=270===d||(0===d||180===d)&&c.y<a.y?Math.min(c.y,180===d?h.top:Math.min(h.top,k.top)):Math.max(c.y,180===d?h.bottom:Math.max(h.bottom,k.bottom)),m.x=c.x,m.y=l.y}}}}else{if(90===b){if(c.y>a.y||180===d&&c.x<a.x&&k.bottom>a.y||0===d&&c.x>a.x&&k.bottom>a.y){l=new w(a.x,c.y),m=new w((a.x+c.x)/2,c.y),270===d?(l.y=this.computeMidOrthoPosition(a.y,c.y,!0),m.x=c.x,m.y=l.y):180===d&&c.x<a.x||0===d&&c.x>a.x?(l.y=a.y<k.top?this.computeMidOrthoPosition(a.y,k.top,!0):a.y<k.bottom&&(180===d&&a.x<k.left||0===d&&a.x>k.right)?this.computeMidOrthoPosition(a.y,c.y,!0):k.bottom,m.x=c.x,m.y=l.y):90===d&&a.y<k.top&&a.x>k.left&&a.x<k.right&&(l.x=a.x<c.x?Math.min(c.x,k.left):Math.max(c.x,k.right),l.y=a.y,m.x=l.x)}else{l=new w(c.x,a.y);m=new w(c.x,(a.y+c.y)/2);if(270===d||0===d&&c.x<h.left||180===d&&c.x>h.right){270===d&&(k.Da(a)||h.Da(c))?l.x=this.computeMidOrthoPosition(a.x,c.x,!1):c.x<a.x&&(270===d||0===d)?l.x=this.computeMidOrthoPosition(h.left,Math.max(c.x,k.right),!1):c.x>a.x&&(270===d||180===d)&&(l.x=this.computeMidOrthoPosition(h.right,Math.min(c.x,k.left),!1)),m.x=l.x,m.y=c.y}if(l.x>h.left&&l.x<h.right){if(c.y>=h.top&&c.y<=a.y||a.y<=k.bottom&&a.y>=c.y){if(0===d||180===d){l=new w(a.x,Math.max((a.y+c.y)/2,a.y)),m=new w(c.x,l.y)}}else{l.x=180===d||(90===d||270===d)&&c.x<a.x?Math.min(c.x,90===d?h.left:Math.min(h.left,k.left)):Math.max(c.x,90===d?h.right:Math.max(h.right,k.right)),m.x=l.x,m.y=c.y}}}}else{if(c.y<a.y||180===d&&c.x<a.x&&k.top<a.y||0===d&&c.x>a.x&&k.top<a.y){l=new w(a.x,c.y),m=new w((a.x+c.x)/2,c.y),90===d?(l.y=this.computeMidOrthoPosition(a.y,c.y,!0),m.x=c.x,m.y=l.y):180===d&&c.x<a.x||0===d&&c.x>=a.x?(l.y=a.y>k.bottom?this.computeMidOrthoPosition(a.y,k.bottom,!0):a.y>k.top&&(180===d&&a.x<k.left||0===d&&a.x>k.right)?this.computeMidOrthoPosition(a.y,c.y,!0):k.top,m.x=c.x,m.y=l.y):270===d&&a.y>k.bottom&&a.x>k.left&&a.x<k.right&&(l.x=a.x<c.x?Math.min(c.x,k.left):Math.max(c.x,k.right),l.y=a.y,m.x=l.x)}else{l=new w(c.x,a.y);m=new w(c.x,(a.y+c.y)/2);if(90===d||0===d&&c.x<h.left||180===d&&c.x>h.right){90===d&&(k.Da(a)||h.Da(c))?l.x=this.computeMidOrthoPosition(a.x,c.x,!1):c.x<a.x&&(90===d||0===d)?l.x=this.computeMidOrthoPosition(h.left,Math.max(c.x,k.right),!1):c.x>a.x&&(90===d||180===d)&&(l.x=this.computeMidOrthoPosition(h.right,Math.min(c.x,k.left),!1)),m.x=l.x,m.y=c.y}if(l.x>h.left&&l.x<h.right){if(c.y<=h.bottom&&c.y>=a.y||a.y>=k.top&&a.y<=c.y){if(0===d||180===d){l=new w(a.x,Math.min((a.y+c.y)/2,a.y)),m=new w(c.x,l.y)}}else{l.x=180===d||(90===d||270===d)&&c.x<a.x?Math.min(c.x,270===d?h.left:Math.min(h.left,k.left)):Math.max(c.x,270===d?h.right:Math.max(h.right,k.right)),m.x=l.x,m.y=c.y + }}}}}}var n=l,p=m;if(this.el){var q=this.g,r;(r=null===q)||(q.Mb.Xg?r=!1:(r=q.Va,r=r instanceof uf?!r.lv||r.ZG:!0),r=!r);if(r||h.Da(c)&&!f.Rh(e)||k.Da(a)&&!e.Rh(f)||e===f||this.layer.zc){a=!1}else{if(e=Lk(q,!0,this.Sa,null),e.Lo(Math.min(a.x,n.x),Math.min(a.y,n.y),Math.abs(a.x-n.x),Math.abs(a.y-n.y))&&e.Lo(Math.min(n.x,p.x),Math.min(n.y,p.y),Math.abs(n.x-p.x),Math.abs(n.y-p.y))&&e.Lo(Math.min(p.x,c.x),Math.min(p.y,c.y),Math.abs(p.x-c.x),Math.abs(p.y-c.y))){a=!1}else{if(h=h.copy().Uh(k),h.Kf(2*e.to,2*e.ro),Io(e,a,b,c,d,h),k=Jo(e,c.x,c.y),e.abort||999999!==k||(Ok(e),k=e.KE,h.Kf(e.to*k,e.ro*k),Io(e,a,b,c,d,h),k=Jo(e,c.x,c.y)),e.abort||999999!==k||(Ok(e),k=e.TD,h.Kf(e.to*k,e.ro*k),Io(e,a,b,c,d,h),k=Jo(e,c.x,c.y)),!e.abort&&999999===k&&e.$E&&(Ok(e),Io(e,a,b,c,d,e.mb),k=Jo(e,c.x,c.y)),!e.abort&&999999>k&&0!==Jo(e,c.x,c.y)){Ko(this,e,c.x,c.y,d,!0);d=this.l(2);if(4>this.ka){0===b||180===b?(d.x=a.x,d.y=c.y):(d.x=c.x,d.y=a.y),this.U(2,d.x,d.y),this.w(3,d.x,d.y)}else{if(c=this.l(3),0===b||180===b){K.D(d.x,c.x)?(b=0===b?Math.max(d.x,a.x):Math.min(d.x,a.x),this.U(2,b,a.y),this.U(3,b,c.y)):K.D(d.y,c.y)?(Math.abs(a.y-d.y)<=e.ro/2&&(this.U(2,d.x,a.y),this.U(3,c.x,a.y)),this.w(2,d.x,a.y)):this.U(2,a.x,d.y)}else{if(90===b||270===b){K.D(d.y,c.y)?(b=90===b?Math.max(d.y,a.y):Math.min(d.y,a.y),this.U(2,a.x,b),this.U(3,c.x,b)):K.D(d.x,c.x)?(Math.abs(a.x-d.x)<=e.to/2&&(this.U(2,a.x,d.y),this.U(3,a.x,c.y)),this.w(2,a.x,d.y)):this.U(2,d.x,a.y)}}}a=!0}else{a=!1}}}}else{a=!1}a||(this.Lh(l),this.Lh(m))}};W.prototype.computeMidOrthoPosition=function(a,b){if(this.hasCurviness()){var c=this.computeCurviness();return(a+b)/2+c}return(a+b)/2};function gg(a){if(!a.el){return !1}var b=a.points.n,c=b.length;if(4>c){return !1}a=Lk(a.g,!0,a.Sa,null);for(var d=1;d<c-2;d++){var e=b[d],f=b[d+1];if(!a.Lo(Math.min(e.x,f.x),Math.min(e.y,f.y),Math.abs(e.x-f.x),Math.abs(e.y-f.y))){return !0}}return !1}function Ko(a,b,c,d,e,f){var h=b.to,k=b.ro,l=Jo(b,c,d),m=c,n=d;for(0===e?m+=h:90===e?n+=k:180===e?m-=h:n-=k;1<l&&Jo(b,m,n)===l-1;){c=m,d=n,0===e?m+=h:90===e?n+=k:180===e?m-=h:n-=k,l-=1}if(f){if(1<l){if(180===e||0===e){c=Math.floor(c/h)*h+h/2}else{if(90===e||270===e){d=Math.floor(d/k)*k+k/2}}}}else{c=Math.floor(c/h)*h+h/2,d=Math.floor(d/k)*k+k/2}1<l&&(f=e,m=c,n=d,0===e?(f=90,n+=k):90===e?(f=180,m-=h):180===e?(f=270,n-=k):270===e&&(f=0,m+=h),Jo(b,m,n)===l-1?Ko(a,b,m,n,f,!1):(m=c,n=d,0===e?(f=270,n-=k):90===e?(f=0,m+=h):180===e?(f=90,n+=k):270===e&&(f=180,m-=h),Jo(b,m,n)===l-1&&Ko(a,b,m,n,f,!1)));a.Lk(c,d)}W.prototype.findClosestSegment=function(a){var b=a.x;a=a.y;for(var c=this.l(0),d=this.l(1),e=Xa(b,a,c.x,c.y,d.x,d.y),f=0,h=1;h<this.ka-1;h++){var c=this.l(h+1),k=Xa(b,a,d.x,d.y,c.x,c.y),d=c;k<e&&(f=h,e=k)}return f};W.prototype.invalidateGeometry=W.prototype.me=function(){this.Qa=null;this.S()};u.u(W,{fd:"geometry"},function(){null===this.Qa&&(this.updateRoute(),this.Qa=this.makeGeometry());return this.Qa});W.prototype.Ys=function(){if(null===this.Qa&&!1!==this.jg){this.Qa=this.makeGeometry();var a=this.path;if(null!==a){a.Qa=this.Qa;for(var b=this.Aa.n,c=b.length,d=0;d<c;d++){var e=b[d];e!==a&&e.vg&&e instanceof X&&(e.Qa=this.Qa)}}}};W.prototype.makeGeometry=function(){var a=this.ka;if(2>a){var b=new $c(ad),c=new bd(0,0);b.ub.add(c);return b}var d=!1,b=this.g;null!==b&&0!==b.ga.Me&&xo(this)&&(d=!0);var c=b=0,e=this.l(0).copy(),f=e.copy(),b=this.Qc.n,h=this.computeCurve();if(h===kh&&3<=a&&!K.Wa(this.ip,0)){if(3===a){var k=this.l(1),b=Math.min(e.x,k.x),c=Math.min(e.y,k.y),k=this.l(2),b=Math.min(b,k.x),c=Math.min(c,k.y)}else{if(this.ec){for(k=0;k<a;k++){c=b[k],f.x=Math.min(c.x,f.x),f.y=Math.min(c.y,f.y)}}else{for(k=3;k<a;k+=3){k+3>=a&&(k=a-1),b=this.l(k),f.x=Math.min(b.x,f.x),f.y=Math.min(b.y,f.y)}}b=f.x;c=f.y}}else{for(k=0;k<a;k++){c=b[k],f.x=Math.min(c.x,f.x),f.y=Math.min(c.y,f.y)}b=f.x;c=f.y}b-=this.Ey.x;c-=this.Ey.y;e.x-=b;e.y-=c;if(2===a){var l=this.l(1).copy();l.x-=b;l.y-=c;0!==Go(this)&&Lo(this,e,!0,f);0!==Ho(this)&&Lo(this,l,!1,f);b=new $c(dd);b.va=e.x;b.wa=e.y;b.F=l.x;b.G=l.y}else{l=u.p();0!==Go(this)&&Lo(this,e,!0,f);M(l,e.x,e.y,!1,!1);if(h===kh&&3<=a&&!K.Wa(this.ip,0)){if(3===a){k=this.l(1),a=k.x-b,d=k.y-c,k=this.l(2).copy(),k.x-=b,k.y-=c,0!==Ho(this)&&Lo(this,k,!1,f),O(l,a,d,a,d,k.x,k.y)}else{if(this.ec){for(var f=new w(b,c),e=this.l(1).copy(),h=new w(b,c),a=new w(b,c),d=this.l(0),m=null,n=this.ip/3,k=1;k<this.ka-1;k++){var m=this.l(k),p=d,q=m,r=this.l(Mo(this,m,k,!1));if(!K.Wa(p.x,q.x)||!K.Wa(q.x,r.x)){if(!K.Wa(p.y,q.y)||!K.Wa(q.y,r.y)){var s=n,t=h,v=a;isNaN(s)&&(s=this.ip/3);var x=p.x,p=p.y,A=q.x,q=q.y,y=r.x,r=r.y,C=s*No(x,p,A,q),s=s*No(A,q,y,r);K.Wa(p,q)&&K.Wa(A,y)&&(A>x?r>q?(t.x=A-C,t.y=q-C,v.x=A+s,v.y=q+s):(t.x=A-C,t.y=q+C,v.x=A+s,v.y=q-s):r>q?(t.x=A+C,t.y=q-C,v.x=A-s,v.y=q+s):(t.x=A+C,t.y=q+C,v.x=A-s,v.y=q-s));K.Wa(x,A)&&K.Wa(q,r)&&(q>p?(y>A?(t.x=A-C,t.y=q-C,v.x=A+s):(t.x=A+C,t.y=q-C,v.x=A-s),v.y=q+s):(y>A?(t.x=A-C,t.y=q+C,v.x=A+s):(t.x=A+C,t.y=q+C,v.x=A-s),v.y=q-s));if(K.Wa(x,A)&&K.Wa(A,y)||K.Wa(p,q)&&K.Wa(q,r)){x=0.5*(x+y),p=0.5*(p+r),t.x=x,t.y=p,v.x=x,v.y=p + }1===k?(e.x=0.5*(d.x+m.x),e.y=0.5*(d.y+m.y)):2===k&&K.Wa(d.x,this.l(0).x)&&K.Wa(d.y,this.l(0).y)&&(e.x=0.5*(d.x+m.x),e.y=0.5*(d.y+m.y));O(l,e.x-b,e.y-c,h.x-b,h.y-c,m.x-b,m.y-c);f.set(h);e.set(a);d=m}}}k=d.x;d=d.y;f=this.l(this.ka-1);k=0.5*(k+f.x);d=0.5*(d+f.y);O(l,a.x-b,a.y-c,k-b,d-c,f.x-b,f.y-c)}else{for(k=3;k<a;k+=3){d=this.l(k-2),k+3>=a&&(k=a-1),f=this.l(k-1),e=this.l(k),k===a-1&&0!==Ho(this)&&(e=e.copy(),Lo(this,e,!1,K.Wj)),O(l,d.x-b,d.y-c,f.x-b,f.y-c,e.x-b,e.y-c)}}}}else{f=u.K();f.assign(this.l(0));for(k=1;k<a;){k=Mo(this,f,k,1<k);t=this.l(k);if(k>=a-1){f!==t&&(0!==Ho(this)&&(t=t.copy(),Lo(this,t,!1,K.Wj)),Oo(this,l,-b,-c,f,t,d));break}k=Mo(this,t,k+1,k<a-3);e=l;h=-b;m=-c;n=f;v=this.l(k);x=f;p=d;K.D(n.y,t.y)&&K.D(t.x,v.x)?(s=this.computeCorner(),s=Math.min(s,Math.abs(t.x-n.x)/2),s=A=Math.min(s,Math.abs(v.y-t.y)/2),K.D(s,0)?(Oo(this,e,h,m,n,t,p),x.assign(t)):(q=t.x,y=t.y,r=q,C=y,q=t.x>n.x?t.x-s:t.x+s,C=v.y>t.y?t.y+A:t.y-A,Oo(this,e,h,m,n,new w(q,y),p),td(e,t.x+h,t.y+m,r+h,C+m),x.m(r,C))):K.D(n.x,t.x)&&K.D(t.y,v.y)?(s=this.computeCorner(),A=Math.min(s,Math.abs(t.y-n.y)/2),A=s=Math.min(A,Math.abs(v.x-t.x)/2),K.D(s,0)?(Oo(this,e,h,m,n,t,p),x.assign(t)):(q=t.x,C=y=t.y,y=t.y>n.y?t.y-A:t.y+A,r=v.x>t.x?t.x+s:t.x-s,Oo(this,e,h,m,n,new w(q,y),p),td(e,t.x+h,t.y+m,r+h,C+m),x.m(r,C))):(Oo(this,e,h,m,n,t,p),x.assign(t))}u.v(f)}b=l.o;u.q(l)}return b};function No(a,b,c,d){a=c-a;if(isNaN(a)||Infinity===a||-Infinity===a){return NaN}0>a&&(a=-a);b=d-b;if(isNaN(b)||Infinity===b||-Infinity===b){return NaN}0>b&&(b=-b);return K.Wa(a,0)?b:K.Wa(b,0)?a:Math.sqrt(a*a+b*b)}function Lo(a,b,c,d){var e=a.ka;if(!(2>e)){if(c){var f=a.l(1);c=f.x-d.x;d=f.y-d.y;f=No(b.x,b.y,c,d);0!==f&&(e=2===e?0.5*f:f,a=Go(a),a>e&&(a=e),c=a*(c-b.x)/f,a=a*(d-b.y)/f,b.x+=c,b.y+=a)}else{f=a.l(e-2),c=f.x-d.x,d=f.y-d.y,f=No(b.x,b.y,c,d),0!==f&&(e=2===e?0.5*f:f,a=Ho(a),a>e&&(a=e),c=a*(b.x-c)/f,a=a*(b.y-d)/f,b.x-=c,b.y-=a)}}}function Mo(a,b,c,d){for(var e=a.ka,f=b;K.Wa(b.x,f.x)&&K.Wa(b.y,f.y);){if(c>=e){return e-1}f=a.l(c++)}if(!K.Wa(b.x,f.x)&&!K.Wa(b.y,f.y)){return c-1}for(var h=f;K.Wa(b.x,f.x)&&K.Wa(f.x,h.x)&&(!d||(b.y>=f.y?f.y>=h.y:f.y<=h.y))||K.Wa(b.y,f.y)&&K.Wa(f.y,h.y)&&(!d||(b.x>=f.x?f.x>=h.x:f.x<=h.x));){if(c>=e){return e-1}h=a.l(c++)}return c-2}function Oo(a,b,c,d,e,f,h){if(!h&&xo(a)){h=[];var k=0;a.Ia()&&(k=Po(a,e,f,h));var l=e.x,l=e.y;if(0<k){if(K.D(e.y,f.y)){if(e.x<f.x){for(var m=0;m<k;){var n=Math.max(e.x,Math.min(h[m++]-5,f.x-10));b.lineTo(n+c,f.y+d);for(var l=n+c,p=Math.min(n+10,f.x);m<k;){var q=h[m];if(q<p+10){m++,p=Math.min(q+5,f.x)}else{break}}q=(n+p)/2+c;q=f.y-10+d;n=p+c;p=f.y+d;a.We===ch?M(b,n,p,!1,!1):O(b,l,q,n,q,n,p)}}else{for(m=k-1;0<=m;){n=Math.min(e.x,Math.max(h[m--]+5,f.x+10));b.lineTo(n+c,f.y+d);l=n+c;for(p=Math.max(n-10,f.x);0<=m;){if(q=h[m],q>p-10){m--,p=Math.max(q-5,f.x)}else{break}}q=f.y-10+d;n=p+c;p=f.y+d;a.We===ch?M(b,n,p,!1,!1):O(b,l,q,n,q,n,p)}}}else{if(K.D(e.x,f.x)){if(e.y<f.y){for(m=0;m<k;){n=Math.max(e.y,Math.min(h[m++]-5,f.y-10));b.lineTo(f.x+c,n+d);l=n+d;for(p=Math.min(n+10,f.y);m<k;){if(q=h[m],q<p+10){m++,p=Math.min(q+5,f.y)}else{break}}q=f.x-10+c;n=f.x+c;p+=d;a.We===ch?M(b,n,p,!1,!1):O(b,q,l,q,p,n,p)}}else{for(m=k-1;0<=m;){n=Math.min(e.y,Math.max(h[m--]+5,f.y+10));b.lineTo(f.x+c,n+d);l=n+d;for(p=Math.max(n-10,f.y);0<=m;){if(q=h[m],q>p-10){m--,p=Math.max(q-5,f.y)}else{break}}q=f.x-10+c;n=f.x+c;p+=d;a.We===ch?M(b,n,p,!1,!1):O(b,q,l,q,p,n,p)}}}}}}b.lineTo(f.x+c,f.y+d)}function Po(a,b,c,d){var e=a.g;if(null===e||b.L(c)){return 0}for(e=e.nw;e.next();){var f=e.value;if(null!==f&&f.visible){for(var f=f.Db.n,h=f.length,k=0;k<h;k++){var l=f[k];if(l instanceof W){if(l===a){return 0<d.length&&d.sort(function(a,b){return a-b}),d.length}if(l.Ia()&&xo(l)){var m=l.Qm;m.I()&&a.Qm.ug(m)&&!a.usesSamePort(l)&&(m=l.path,null!==m&&m.ll()&&Qo(b,c,d,l))}}}}}0<d.length&&d.sort(function(a,b){return a-b});return d.length}function Qo(a,b,c,d){for(var e=K.D(a.y,b.y),f=d.ka,h=d.l(0),k=u.K(),l=1;l<f;l++){var m=d.l(l);if(l<f-1){var n=d.l(l+1);if(h.y===m.y&&m.y===n.y){if(m.x>h.x&&n.x>m.x||m.x<h.x&&n.x<m.x){m=n,l++}}else{h.x===m.x&&m.x===n.x&&(m.y>h.y&&n.y>m.y||m.y<h.y&&n.y<m.y)&&(m=n,l++)}}a:{var n=k,p=a.x,q=a.y,r=b.x,s=b.y,t=h.x,h=h.y,v=m.x,x=m.y;if(!K.D(p,r)){if(K.D(q,s)&&K.D(t,v)&&Math.min(p,r)<t&&Math.max(p,r)>t&&Math.min(h,x)<q&&Math.max(h,x)>q&&!K.D(h,x)){n.x=t;n.y=q;n=!0;break a}}else{if(!K.D(q,s)&&K.D(h,x)&&Math.min(q,s)<h&&Math.max(q,s)>h&&Math.min(t,v)<p&&Math.max(t,v)>p&&!K.D(t,v)){n.x=p;n.y=h;n=!0;break a}}n.x=0;n.y=0;n=!1}n&&(e?c.push(k.x):c.push(k.y));h=m}u.v(k)}u.u(W,{Cs:"firstPickIndex"},function(){return 2>=this.ka?0:this.ec||Ao(this)!==vb?1:0});u.u(W,{mw:"lastPickIndex"},function(){var a=this.ka;return 0===a?0:2>=a?a-1:this.ec||Bo(this)!==vb?a-2:a-1});function xo(a){a=a.We;return a===bh||a===ch}function zo(a,b){if(b||xo(a)){var c=a.g;null===c||c.Il.contains(a)||null===a.qy||c.Il.add(a,a.qy)}}function eh(a,b){var c=a.layer;if(null!==c&&c.visible&&!c.zc){var d=c.g;if(null!==d){for(var e=!1,d=d.nw;d.next();){var f=d.value;if(f.visible){if(f===c){for(var e=!0,h=!1,f=f.Db.n,k=f.length,l=0; + l<k;l++){var m=f[l];m instanceof W&&(m===a?h=!0:h&&Ro(a,m,b))}}else{if(e){for(f=f.Db.n,k=f.length,l=0;l<k;l++){m=f[l],m instanceof W&&Ro(a,m,b)}}}}}}}}function Ro(a,b,c){if(null!==b&&null!==b.Qa&&xo(b)){var d=b.Qm;d.I()&&(a.Qm.ug(d)||c.ug(d))&&(a.usesSamePort(b)||b.me())}}W.prototype.usesSamePort=function(a){var b=this.ka,c=a.ka;if(0<b&&0<c){var d=this.l(0),e=a.l(0);if(d.pd(e)){return !0}b=this.l(b-1);a=a.l(c-1);if(b.pd(a)||d.pd(a)||b.pd(e)){return !0}}else{if(this.V===a.V||this.ba===a.ba||this.V==a.ba||this.ba==a.V){return !0}}return !1};W.prototype.Ie=function(a){G.prototype.Ie.call(this,a);if(null!==this.we){for(var b=this.we.i;b.next();){b.value.Ie(a)}}};u.defineProperty(W,{gs:"adjusting"},function(){return this.wp},function(a){var b=this.wp;b!==a&&(this.wp=a,this.h("adjusting",b,a))});u.defineProperty(W,{Zy:"corner"},function(){return this.Jp},function(a){var b=this.Jp;b!==a&&(this.Jp=a,this.me(),this.h("corner",b,a))});u.defineProperty(W,{We:"curve"},function(){return this.Mp},function(a){var b=this.Mp;b!==a&&(this.Mp=a,this.Wb(),zo(this,b===ch||b===bh||a===ch||a===bh),this.h("curve",b,a))});u.defineProperty(W,{Ov:"curviness"},function(){return this.Np},function(a){var b=this.Np;b!==a&&(this.Np=a,this.Wb(),this.h("curviness",b,a))});u.defineProperty(W,{Bw:"routing"},function(){return this.bm},function(a){var b=this.bm;b!==a&&(this.bm=a,this.ei=null,this.Wb(),zo(this,2===(b.value&2)||2===(a.value&2)),this.h("routing",b,a))});u.defineProperty(W,{ip:"smoothness"},function(){return this.Mr},function(a){var b=this.Mr;b!==a&&(this.Mr=a,this.me(),this.h("smoothness",b,a))});function vo(a){var b=a.Yf;if(null!==b){var c=a.ig;if(null!==c){var d=a.yh,e=a.Kh;a:{if(null!==c&&null!==b.ph){for(a=b.ph.i;a.next();){var f=a.value;if(f.Wo===b&&f.bt===c&&f.ww===d&&f.xw===e||f.Wo===c&&f.bt===b&&f.ww===e&&f.xw===d){a=f;break a}}}a=null}for(var h=null,k=null,l=b.hc.n,m=l.length,f=0;f<m;f++){var n=l[f];if(n.Yf===b&&n.yh===d&&n.ig===c&&n.Kh===e||n.Yf===c&&n.yh===e&&n.ig===b&&n.Kh===d){null===k?k=n:(null===h&&(h=new E(W),h.add(k)),h.add(n))}}if(null!==h){for(null===a&&(a=new bo,a.Wo=b,a.ww=d,a.bt=c,a.xw=e,ao(b,a),ao(c,a)),a.links=h,b=h.n,f=0;f<b.length;f++){if(n=b[f],0===n.kf){c=1;for(d=0;d<b.length;d++){Math.abs(b[d].kf)===c&&(c++,d=-1)}n.cn=a;n.kf=n.V===a.Wo?c:-c;c=n.g;(null===c||c.nf)&&n.Wb()}}}}}}function uo(a){var b=a.cn;if(null!==b){var c=a.kf;a.cn=null;a.kf=0;b.links.remove(a);if(2>b.links.count){1===b.links.count&&(c=b.links.n[0],c.cn=null,c.kf=0,c.Wb()),c=b.Wo,null!==b&&null!==c.ph&&c.ph.remove(b),c=b.bt,null!==b&&null!==c.ph&&c.ph.remove(b)}else{for(c=Math.abs(c),a=0===c%2,b=b.links.i;b.next();){var d=b.value,e=Math.abs(d.kf),f=0===e%2;e>c&&a===f&&(d.kf=0<d.kf?d.kf-2:d.kf+2,d.Wb())}}}}function bo(){u.gc(this);this.links=this.xw=this.bt=this.ww=this.Wo=null}u.Yd(bo,{Wo:!0,ww:!0,bt:!0,xw:!0,links:!0,spacing:!0});function Mk(){u.gc(this);this.gA=this.group=null;this.Ms=!0;this.abort=!1;this.dg=this.cg=1;this.Lq=this.Kq=-1;this.ie=this.he=8;this.mc=null;this.$E=!1;this.KE=22;this.TD=111}u.Yd(Mk,{group:!0,gA:!0,Ms:!0,abort:!0,$E:!0,KE:!0,TD:!0});Mk.prototype.initialize=function(a){if(!(0>=a.width||0>=a.height)){var b=a.y,c=a.x+a.width,d=a.y+a.height;this.cg=Math.floor((a.x-this.he)/this.he)*this.he;this.dg=Math.floor((b-this.ie)/this.ie)*this.ie;this.Kq=Math.ceil((c+2*this.he)/this.he)*this.he;this.Lq=Math.ceil((d+2*this.ie)/this.ie)*this.ie;a=1+(Math.ceil((this.Kq-this.cg)/this.he)|0);b=1+(Math.ceil((this.Lq-this.dg)/this.ie)|0);if(null===this.mc||this.jo<a-1||this.ko<b-1){c=[];for(d=0;d<=a;d++){for(var e=[],f=0;f<=b;f++){e[f]=0}c[d]=e}this.mc=c;this.jo=a-1;this.ko=b-1}if(null!==this.mc){for(a=0;a<=this.jo;a++){for(b=0;b<=this.ko;b++){this.mc[a][b]=999999}}}}};u.u(Mk,{mb:null},function(){return new z(this.cg,this.dg,this.Kq-this.cg,this.Lq-this.dg)});u.defineProperty(Mk,{to:null},function(){return this.he},function(a){0<a&&a!==this.he&&(this.he=a,this.initialize(this.mb))});u.defineProperty(Mk,{ro:null},function(){return this.ie},function(a){0<a&&a!==this.ie&&(this.ie=a,this.initialize(this.mb))});function So(a,b,c){return a.cg<=b&&b<=a.Kq&&a.dg<=c&&c<=a.Lq}function Jo(a,b,c){if(!So(a,b,c)){return 0}b-=a.cg;b/=a.he;c-=a.dg;c/=a.ie;return a.mc[b|0][c|0]}function Pk(a,b,c){So(a,b,c)&&(b-=a.cg,b/=a.he,c-=a.dg,c/=a.ie,a.mc[b|0][c|0]=0)}function Ok(a){if(null!==a.mc){for(var b=0;b<=a.jo;b++){for(var c=0;c<=a.ko;c++){1<=a.mc[b][c]&&(a.mc[b][c]|=999999)}}}}Mk.prototype.Lo=function(a,b,c,d){if(a>this.Kq||a+c<this.cg||b>this.Lq||b+d<this.dg){return !0}a=(a-this.cg)/this.he|0;b=(b-this.dg)/this.ie|0;c=Math.max(0,c)/this.he+1|0;var e=Math.max(0,d)/this.ie+1|0;0>a&&(c+=a,a=0);0>b&&(e+=b,b=0);if(0>c||0>e){return !0}d=Math.min(a+c-1,this.jo)|0;for(c=Math.min(b+e-1,this.ko)|0;a<=d;a++){for(e=b;e<=c;e++){if(0===this.mc[a][e]){return !1}}}return !0};function To(a,b,c,d,e,f,h,k,l){if(!(b<f||b>h||c<k||c>l)){var m,n;m=b|0;n=c|0;var p=a.mc[m][n];if(1<=p&&999999>p){for(e?n+=d:m+=d,p+=1;f<=m&&m<=h&&k<=n&&n<=l&&!(p>=a.mc[m][n]);){a.mc[m][n]=p,p+=1,e?n+=d:m+=d + }}m=e?n:m;if(e){if(0<d){for(c+=d;c<m;c+=d){To(a,b,c,1,!e,f,h,k,l),To(a,b,c,-1,!e,f,h,k,l)}}else{for(c+=d;c>m;c+=d){To(a,b,c,1,!e,f,h,k,l),To(a,b,c,-1,!e,f,h,k,l)}}}else{if(0<d){for(b+=d;b<m;b+=d){To(a,b,c,1,!e,f,h,k,l),To(a,b,c,-1,!e,f,h,k,l)}}else{for(b+=d;b>m;b+=d){To(a,b,c,1,!e,f,h,k,l),To(a,b,c,-1,!e,f,h,k,l)}}}}}function Uo(a,b,c,d,e,f,h,k,l,m,n){for(var p=b|0,q=c|0,r=a.mc[p][q];0===r&&p>k&&p<l&&q>m&&q<n;){if(h?q+=f:p+=f,r=a.mc[p][q],1>=Math.abs(p-d)&&1>=Math.abs(q-e)){return a.abort=!0,0}}p=b|0;q=c|0;r=a.mc[p][q];b=1;for(a.mc[p][q]=b;0===r&&p>k&&p<l&&q>m&&q<n;){h?q+=f:p+=f,r=a.mc[p][q],a.mc[p][q]=b,b+=1}return h?q:p}function Io(a,b,c,d,e,f){if(null!==a.mc){a.abort=!1;var h=b.x,k=b.y;if(So(a,h,k)){var h=h-a.cg,h=h/a.he,k=k-a.dg,k=k/a.ie,l=d.x,m=d.y;if(So(a,l,m)){if(l-=a.cg,l/=a.he,m-=a.dg,m/=a.ie,1>=Math.abs(h-l)&&1>=Math.abs(k-m)){a.abort=!0}else{var n=f.x;b=f.y;d=f.x+f.width;var p=f.y+f.height,n=n-a.cg,n=n/a.he;b-=a.dg;b/=a.ie;d-=a.cg;d/=a.he;p-=a.dg;p/=a.ie;f=Math.max(0,Math.min(a.jo,n|0));d=Math.min(a.jo,Math.max(0,d|0));b=Math.max(0,Math.min(a.ko,b|0));var p=Math.min(a.ko,Math.max(0,p|0)),h=h|0,k=k|0,l=l|0,m=m|0,n=h,q=k,r=0===c||90===c?1:-1;(c=90===c||270===c)?q=Uo(a,h,k,l,m,r,c,f,d,b,p):n=Uo(a,h,k,l,m,r,c,f,d,b,p);if(!a.abort){a:{c=0===e||90===e?1:-1;e=90===e||270===e;for(var r=l|0,s=m|0,t=a.mc[r][s];0===t&&r>f&&r<d&&s>b&&s<p;){if(e?s+=c:r+=c,t=a.mc[r][s],1>=Math.abs(r-h)&&1>=Math.abs(s-k)){a.abort=!0;break a}}r=l|0;s=m|0;t=a.mc[r][s];for(a.mc[r][s]=999999;0===t&&r>f&&r<d&&s>b&&s<p;){e?s+=c:r+=c,t=a.mc[r][s],a.mc[r][s]=999999}}a.abort||(To(a,n,q,1,!1,f,d,b,p),To(a,n,q,-1,!1,f,d,b,p),To(a,n,q,1,!0,f,d,b,p),To(a,n,q,-1,!0,f,d,b,p))}}}}}}function Eo(){u.gc(this);this.port=this.Bc=null;this.yg=[];this.Vo=!1}u.Yd(Eo,{Bc:!0,port:!0,yg:!0,Vo:!0});Eo.prototype.toString=function(){for(var a=this.yg,b=this.Bc.toString()+" "+a.length.toString()+":",c=0;c<a.length;c++){var d=a[c];null!==d&&(b+="\n "+d.toString())}return b};function Vo(a,b,c,d){b=b.offsetY;switch(b){case u.Mc:return 90;case u.Ec:return 180;case u.Yc:return 270;case u.Nc:return 0}switch(b){case u.Mc|u.Yc:return 180<c?270:90;case u.Ec|u.Nc:return 90<c&&270>=c?180:0}a=180*Math.atan2(a.height,a.width)/Math.PI;switch(b){case u.Ec|u.Yc:return c>a&&c<=180+a?180:270;case u.Yc|u.Nc:return c>180-a&&c<=360-a?270:0;case u.Nc|u.Mc:return c>a&&c<=180+a?90:0;case u.Mc|u.Ec:return c>180-a&&c<=360-a?180:90;case u.Ec|u.Yc|u.Nc:return 90<c&&c<=180+a?180:c>180+a&&c<=360-a?270:0;case u.Yc|u.Nc|u.Mc:return 180<c&&c<=360-a?270:c>a&&180>=c?90:0;case u.Nc|u.Mc|u.Ec:return c>a&&c<=180-a?90:c>180-a&&270>=c?180:0;case u.Mc|u.Ec|u.Yc:return c>180-a&&c<=180+a?180:c>180+a?270:90}d&&b!==(u.Ec|u.Yc|u.Nc|u.Mc)&&(c-=15,0>c&&(c+=360));return c>a&&c<180-a?90:c>=180-a&&c<=180+a?180:c>180+a&&c<360-a?270:0}function Fo(a,b){var c=a.yg;if(0===c.length){a:if(!a.Vo){c=a.Vo;a.Vo=!0;var d,e=null,f=a.Bc,f=f instanceof V?f:null;if(null===f||f.ce){d=a.Bc.rD(a.port.Kd)}else{if(!f.ca.I()){a.Vo=c;break a}e=f;d=e.qD()}var h=a.yg.length=0,k=a.port.eb(xb,u.K()),l=a.port.eb(Vb,u.K()),f=u.Vj(k.x,k.y,0,0);f.Pi(l);u.v(k);u.v(l);k=u.Yb(f.x+f.width/2,f.y+f.height/2);for(d=d.i;d.next();){if(l=d.value,l.Ia()){var m=vb,n=l.qd===a.port||l.V.Rh(e),m=n?Ao(l,a.port):Bo(l,a.port);if(m.jl()&&(n=n?l.ge:l.qd,null!==n)){var p=n.W;if(null!==p){var n=l.computeOtherPoint(p,n),p=k.Gi(n),m=Vo(f,m,p,l.ec),q=0;0===m?(q=u.Nc,180<p&&(p-=360)):q=90===m?u.Mc:180===m?u.Ec:u.Yc;m=a.yg[h];void 0===m?(m=new Wo(l,p,q),a.yg[h]=m):(m.link=l,m.angle=p,m.fe=q);m.vw.set(n);h++}}}}u.v(k);a.yg.sort(Eo.prototype.IH);e=a.yg.length;k=-1;for(h=d=0;h<e;h++){m=a.yg[h],void 0!==m&&(m.fe!==k&&(k=m.fe,d=0),m.Go=d,d++)}k=-1;d=0;for(h=e-1;0<=h;h--){m=a.yg[h],void 0!==m&&(m.fe!==k&&(k=m.fe,d=m.Go+1),m.zm=d)}h=a.yg;n=a.port;e=a.Bc.PH;k=u.K();d=u.K();l=u.K();m=u.K();n.eb(xb,k);n.eb(Gb,d);n.eb(Vb,l);n.eb(Qb,m);var r=q=p=n=0;if(e===$n){for(var s=0;s<h.length;s++){var t=h[s];if(null!==t){var v=t.link.computeThickness();switch(t.fe){case u.Mc:q+=v;break;case u.Ec:r+=v;break;case u.Yc:n+=v;break;default:case u.Nc:p+=v}}}}for(var x=0,A=0,y=1,s=0;s<h.length;s++){if(t=h[s],null!==t){var C,I;if(x!=t.fe){x=t.fe;switch(x){case u.Mc:C=l;I=m;break;case u.Ec:C=m;I=k;break;case u.Yc:C=k;I=d;break;default:case u.Nc:C=d,I=l}var H=I.x-C.x;I=I.y-C.y;switch(x){case u.Mc:q>Math.abs(H)?(y=Math.abs(H)/q,q=Math.abs(H)):y=1;break;case u.Ec:r>Math.abs(I)?(y=Math.abs(I)/r,r=Math.abs(I)):y=1;break;case u.Yc:n>Math.abs(H)?(y=Math.abs(H)/n,n=Math.abs(H)):y=1;break;default:case u.Nc:p>Math.abs(I)?(y=Math.abs(I)/p,p=Math.abs(I)):y=1}A=0}var R=t.No;if(e===$n){v=t.link.computeThickness();v*=y;R.set(C);switch(x){case u.Mc:R.x=C.x+H/2+q/2-A-v/2;break;case u.Ec:R.y=C.y+I/2+r/2-A-v/2;break;case u.Yc:R.x=C.x+H/2-n/2+A+v/2;break;default:case u.Nc:R.y=C.y+I/2-p/2+A+v/2}A+=v}else{v=0.5,e===Xn&&(v=(t.Go+1)/(t.zm+1)),R.x=C.x+H*v,R.y=C.y+I*v}}}u.v(k);u.v(d);u.v(l);u.v(m);C=a.yg;for(H=0;H<C.length;H++){I=C[H],null!==I&&(I.Sv=a.computeEndSegmentLength(I))}a.Vo=c;u.ic(f)}c=a.yg}for(f=0;f<c.length; + f++){if(C=c[f],null!==C&&C.link===b){return C}}return null}Eo.prototype.IH=function(a,b){return a===b?0:null===a?-1:null===b?1:a.fe<b.fe?-1:a.fe>b.fe?1:a.angle<b.angle?-1:a.angle>b.angle?1:0};Eo.prototype.computeEndSegmentLength=function(a){var b=a.link,c=b.computeEndSegmentLength(this.Bc,this.port,vb,b.qd===this.port),d=a.Go;if(0>d){return c}var e=a.zm;if(1>=e||!b.ec){return c}var b=a.vw,f=a.No;if(a.fe===u.Ec||a.fe===u.Mc){d=e-1-d}return((a=a.fe===u.Ec||a.fe===u.Nc)?b.y<f.y:b.x<f.x)?c+8*d:(a?b.y===f.y:b.x===f.x)?c:c+8*(e-1-d)};function Wo(a,b,c){this.link=a;this.angle=b;this.fe=c;this.vw=new w;this.zm=this.Go=0;this.No=new w;this.Sv=0}u.Yd(Wo,{link:!0,angle:!0,fe:!0,vw:!0,Go:!0,zm:!0,No:!0,Sv:!0});Wo.prototype.toString=function(){return this.link.toString()+" "+this.angle.toString()+" "+this.fe.toString()+":"+this.Go.toString()+"/"+this.zm.toString()+" "+this.No.toString()+" "+this.Sv.toString()+" "+this.vw.toString()};function il(){this.Ej=this.cj=uc;this.Cj=this.aj=NaN;this.Bj=this.$i=Yn;this.Dj=this.bj=NaN}il.prototype.copy=function(){var a=new il;a.cj=this.cj.Z();a.Ej=this.Ej.Z();a.aj=this.aj;a.Cj=this.Cj;a.$i=this.$i;a.Bj=this.Bj;a.bj=this.bj;a.Dj=this.Dj;return a};function V(a){0===arguments.length?U.call(this,vh):U.call(this,a);this.Nq=new F(G);this.Rn=new F(V);this.Ak=this.Oq=this.Mq=null;this.$r=!1;this.rq=!0;this.as=!1;this.Ib=this.Qr=null;this.Fp=!1;this.Gp=!0;this.eq=this.Hp=!1;this.Od=new Je;this.Od.group=this;this.ky=!1}u.Ha(V,U);u.fa("Group",V);V.prototype.cloneProtected=function(a){U.prototype.cloneProtected.call(this,a);a.Mq=this.Mq;a.Oq=this.Oq;a.Ak=this.Ak;a.$r=this.$r;a.rq=this.rq;a.as=this.as;a.Qr=this.Qr;var b=a.ws(function(a){return a instanceof ph});a.Ib=b instanceof ph?b:null;a.Fp=this.Fp;a.Gp=this.Gp;a.Hp=this.Hp;a.eq=this.eq;null!==this.Od?(a.Od=this.Od.copy(),a.Od.group=a):(null!==a.Od&&(a.Od.group=null),a.Od=null)};V.prototype.Oh=function(a){U.prototype.Oh.call(this,a);var b=a.Bo();for(a=a.Lc;a.next();){var c=a.value;c.S();c.H(8);c.ns();if(c instanceof U){c.$e(b)}else{if(c instanceof W){for(c=c.wg;c.next();){c.value.$e(b)}}}}};V.prototype.Pm=function(a,b,c,d,e,f,h){if(a===be&&"elements"===b){if(e instanceof ph){var k=e;null===this.Ib?this.Ib=k:this.Ib!==k&&u.k("Cannot insert a second Placeholder into the visual tree of a Group.")}else{e instanceof B&&(k=e.ws(function(a){return a instanceof ph}),k instanceof ph&&(null===this.Ib?this.Ib=k:this.Ib!==k&&u.k("Cannot insert a second Placeholder into the visual tree of a Group.")))}}else{a===ce&&"elements"===b&&null!==this.Ib&&(d===this.Ib?this.Ib=null:d instanceof B&&this.Ib.gl(d)&&(this.Ib=null))}U.prototype.Pm.call(this,a,b,c,d,e,f,h)};V.prototype.yi=function(a,b,c,d){this.zk=this.Ib;B.prototype.yi.call(this,a,b,c,d)};V.prototype.hl=function(){if(!U.prototype.hl.call(this)){return !1}for(var a=this.Lc;a.next();){var b=a.value;if(b instanceof U){if(b.Ia()&&Bj(b)){return !1}}else{if(b instanceof W&&b.Ia()&&Bj(b)&&b.V!==this&&b.ba!==this){return !1}}}return !0};u.u(V,{placeholder:"placeholder"},function(){return this.Ib});u.defineProperty(V,{aD:"computesBoundsAfterDrag"},function(){return this.Fp},function(a){var b=this.Fp;b!==a&&(u.j(a,"boolean",V,"computesBoundsAfterDrag"),this.Fp=a,this.h("computesBoundsAfterDrag",b,a))});u.defineProperty(V,{cG:"computesBoundsIncludingLinks"},function(){return this.Gp},function(a){u.j(a,"boolean",V,"computesBoundsIncludingLinks");var b=this.Gp;b!==a&&(this.Gp=a,this.h("computesBoundsIncludingLinks",b,a))});u.defineProperty(V,{dG:"computesBoundsIncludingLocation"},function(){return this.Hp},function(a){u.j(a,"boolean",V,"computesBoundsIncludingLocation");var b=this.Hp;b!==a&&(this.Hp=a,this.h("computesBoundsIncludingLocation",b,a))});u.defineProperty(V,{PG:"handlesDragDropForMembers"},function(){return this.eq},function(a){u.j(a,"boolean",V,"handlesDragDropForMembers");var b=this.eq;b!==a&&(this.eq=a,this.h("handlesDragDropForMembers",b,a))});u.u(V,{Lc:"memberParts"},function(){return this.Nq.i});function Tn(a,b){if(a.Nq.add(b)){b instanceof V&&a.Rn.add(b);var c=a.zH;if(null!==c){var d=!0,e=a.g;null!==e&&(d=e.Oa,e.Oa=!0);c(a,b);null!==e&&(e.Oa=d)}a.Ia()&&a.ce||b.Ie(!1)}c=a.Ib;null===c&&(c=a);c.S()}function Sn(a,b){if(a.Nq.remove(b)){b instanceof V&&a.Rn.remove(b);var c=a.AH;if(null!==c){var d=!0,e=a.g;null!==e&&(d=e.Oa,e.Oa=!0);c(a,b);null!==e&&(e.Oa=d)}a.Ia()&&a.ce||b.Ie(!0)}c=a.Ib;null===c&&(c=a);c.S()}V.prototype.Bm=function(){if(0<this.Nq.count){var a=this.g;if(null===a){return}for(var b=this.Nq.copy().i;b.next();){a.remove(b.value)}}U.prototype.Bm.call(this)};V.prototype.Lw=function(){var a=this.layer;null!==a&&a.Lw(this)};u.defineProperty(V,{Qb:"layout"},function(){return this.Od},function(a){var b=this.Od;b!==a&&(null!==a&&u.C(a,Je,V,"layout"),null!==b&&(b.g=null,b.group=null),this.Od=a,null!==a&&(a.g=this.g,a.group=this),this.h("layout",b,a))});u.defineProperty(V,{zH:"memberAdded"},function(){return this.Mq},function(a){var b=this.Mq;b!==a&&(null!==a&&u.j(a,"function",V,"memberAdded"),this.Mq=a,this.h("memberAdded",b,a)) + });u.defineProperty(V,{AH:"memberRemoved"},function(){return this.Oq},function(a){var b=this.Oq;b!==a&&(null!==a&&u.j(a,"function",V,"memberRemoved"),this.Oq=a,this.h("memberRemoved",b,a))});u.defineProperty(V,{Cz:"memberValidation"},function(){return this.Ak},function(a){var b=this.Ak;b!==a&&(null!==a&&u.j(a,"function",V,"memberValidation"),this.Ak=a,this.h("memberValidation",b,a))});V.prototype.canAddMembers=function(a){var b=this.g;if(null===b){return !1}b=b.Eb;for(a=wf(a).i;a.next();){if(!b.isValidMember(this,a.value)){return !1}}return !0};V.prototype.addMembers=function(a,b){var c=this.g;if(null===c){return !1}for(var c=c.Eb,d=!0,e=wf(a).i;e.next();){var f=e.value;!b||c.isValidMember(this,f)?f.Sa=this:d=!1}return d};u.defineProperty(V,{EI:"ungroupable"},function(){return this.$r},function(a){var b=this.$r;b!==a&&(u.j(a,"boolean",V,"ungroupable"),this.$r=a,this.h("ungroupable",b,a))});V.prototype.canUngroup=function(){if(!this.EI){return !1}var a=this.layer;if(null!==a&&!a.Gv){return !1}a=a.g;return null===a||a.Gv?!0:!1};V.prototype.invalidateConnectedLinks=V.prototype.$e=function(a){void 0===a&&(a=null);U.prototype.$e.call(this,a);for(var b=this.qD();b.next();){var c=b.value;if(null===a||!a.contains(c)){var d=c.V;null!==d&&d.Rh(this)&&!d.Ia()?c.Wb():(d=c.ba,null!==d&&d.Rh(this)&&!d.Ia()&&c.Wb())}}};V.prototype.findExternalLinksConnected=V.prototype.qD=function(){var a=this.Bo();a.add(this);for(var b=new F(W),c=a.i;c.next();){var d=c.value;if(d instanceof U){for(d=d.pe;d.next();){var e=d.value;a.contains(e)||b.add(e)}}}return b.i};V.prototype.findExternalNodesConnected=function(){var a=this.Bo();a.add(this);for(var b=new F(U),c=a.i;c.next();){var d=c.value;if(d instanceof U){for(d=d.pe;d.next();){var e=d.value,f=e.V;a.contains(f)&&f!==this||b.add(f);e=e.ba;a.contains(e)&&e!==this||b.add(e)}}}return b.i};V.prototype.findSubGraphParts=V.prototype.Bo=function(){var a=new F(G);kf(a,this,!0,0,!0);a.remove(this);return a};V.prototype.Ie=function(a){U.prototype.Ie.call(this,a);for(var b=this.Lc;b.next();){b.value.Ie(a)}};V.prototype.collapseSubGraph=V.prototype.collapseSubGraph=function(){var a=this.g;if(null!==a&&!a.ne){a.ne=!0;var b=this.Bo();Xo(this,b);a.ne=!1}};function Xo(a,b){for(var c=a.Lc;c.next();){var d=c.value;d.Ie(!1);if(d instanceof V){var e=d;e.ce&&(e.pA=e.ce,Xo(e,b))}if(d instanceof U){d.$e(b)}else{if(d instanceof W){for(d=d.wg;d.next();){d.value.$e(b)}}}}a.ce=!1}V.prototype.expandSubGraph=V.prototype.expandSubGraph=function(){var a=this.g;if(null!==a&&!a.ne){var b=a.Mb;0!==a.ga.Me&&b.nl();a.ne=!0;var c=this.Bo();Yo(this,c,b,this);a.ne=!1}};function Yo(a,b,c,d){for(var e=a.Lc;e.next();){var f=e.value;f.Ie(!0);if(f instanceof V){var h=f;h.pA&&(h.pA=!1,Yo(h,b,c,d))}if(f instanceof U){f.$e(b),ri(c,f,d)}else{if(f instanceof W){for(f=f.wg;f.next();){f.value.$e(b)}}}}a.ce=!0}u.defineProperty(V,{ce:"isSubGraphExpanded"},function(){return this.rq},function(a){var b=this.rq;if(b!==a){u.j(a,"boolean",V,"isSubGraphExpanded");this.rq=a;var c=this.g;this.h("isSubGraphExpanded",b,a);b=this.uI;if(null!==b){var d=!0;null!==c&&(d=c.Oa,c.Oa=!0);b(this);null!==c&&(c.Oa=d)}null!==c&&c.ga.fb?null!==this.Ib&&this.Ib.S():a?this.expandSubGraph():this.collapseSubGraph()}});u.defineProperty(V,{pA:"wasSubGraphExpanded"},function(){return this.as},function(a){var b=this.as;b!==a&&(u.j(a,"boolean",V,"wasSubGraphExpanded"),this.as=a,this.h("wasSubGraphExpanded",b,a))});u.defineProperty(V,{uI:"subGraphExpandedChanged"},function(){return this.Qr},function(a){var b=this.Qr;b!==a&&(null!==a&&u.j(a,"function",V,"subGraphExpandedChanged"),this.Qr=a,this.h("subGraphExpandedChanged",b,a))});V.prototype.move=V.prototype.move=function(a){var b=this.position,c=b.x;isNaN(c)&&(c=0);b=b.y;isNaN(b)&&(b=0);var c=a.x-c,b=a.y-b,d=u.Yb(c,b);U.prototype.move.call(this,a);for(a=this.Bo().i;a.next();){var e=a.value;if(!(e instanceof W||e instanceof U&&e.uf)){var f=e.position,h=e.location;f.I()?(d.x=f.x+c,d.y=f.y+b,e.position=d):h.I()&&(d.x=h.x+c,d.y=h.y+b,e.location=d)}}for(a.reset();a.next();){e=a.value,e instanceof W&&(f=e.position,d.x=f.x+c,d.y=f.y+b,e.move(d))}u.v(d)};function ph(){T.call(this);this.Qe=K.pp;this.Ar=new z(NaN,NaN,NaN,NaN)}u.Ha(ph,T);u.fa("Placeholder",ph);ph.prototype.cloneProtected=function(a){T.prototype.cloneProtected.call(this,a);a.Qe=this.Qe.Z();a.Ar=this.Ar.copy()};ph.prototype.Jj=function(a){if(null===this.background&&null===this.rm){return !1}var b=this.Ja;return qb(0,0,b.width,b.height,a.x,a.y)};ph.prototype.Qo=function(){var a=this.W;null!==a&&(a instanceof V||a instanceof lf)||u.k("Placeholder is not inside a Group or Adornment.");if(a instanceof V){var b=this.computeBorder(this.Ar),c=this.Gc;bb(c,b.width||0,b.height||0);ml(this,0,0,c.width,c.height);for(var c=a.Lc,d=!1;c.next();){if(c.value.Ia()){d=!0;break}}!d||isNaN(b.x)||isNaN(b.y)||(c=new w,c.qt(b,a.af),a.location=new w(c.x,c.y))}else{var b=this.za,c=this.Gc,d=this.padding,e=d.left+d.right,f=d.top+d.bottom;if(b.I()){bb(c,b.width+e||0,b.height+f||0),ml(this,-d.left,-d.top,c.width,c.height) + }else{var h=a.xc,k=h.eb(xb,u.K()),b=u.Vj(k.x,k.y,0,0);b.Pi(h.eb(Vb,k));b.Pi(h.eb(Gb,k));b.Pi(h.eb(Qb,k));a.Og.m(b.x,b.y);bb(c,b.width+e||0,b.height+f||0);ml(this,-d.left,-d.top,c.width,c.height);u.v(k);u.ic(b)}}};ph.prototype.yi=function(a,b,c,d){var e=this.ca;e.x=a;e.y=b;e.width=c;e.height=d};ph.prototype.computeBorder=function(a){var b=this.W;if(b instanceof V){var c=b;if(c.aD&&this.Ar.I()){var d=c.g;if(null!==d&&(d=d.Va,d instanceof uf&&!d.Tp&&null!==d.dc&&!d.dc.contains(c))){return a.assign(this.Ar),a}}}var c=u.Tf(),d=this.computeMemberBounds(c),e=this.padding;a.m(d.x-e.left,d.y-e.top,d.width+e.left+e.right,d.height+e.top+e.bottom);u.ic(c);b instanceof V&&(c=b,c.dG&&c.location.I()&&a.Pi(c.location));return a};ph.prototype.computeMemberBounds=function(a){if(!(this.W instanceof V)){return a.m(0,0,0,0),a}for(var b=this.W,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,h=b.Lc;h.next();){var k=h.value;if(k.Ia()){if(k instanceof W){var l=k;if(!b.cG){continue}if(Aj(l)){continue}if(l.V===b||l.ba===b){continue}}k=k.ca;k.left<c&&(c=k.left);k.top<d&&(d=k.top);k.right>e&&(e=k.right);k.bottom>f&&(f=k.bottom)}}isFinite(c)&&isFinite(d)?a.m(c,d,e-c,f-d):(b=b.location,c=this.padding,a.m(b.x+c.left,b.y+c.top,0,0));return a};u.defineProperty(ph,{padding:"padding"},function(){return this.Qe},function(a){"number"===typeof a?((isNaN(a)||0>a)&&u.xa(a,">= 0",ph,"padding"),a=new rb(a)):(u.C(a,rb,ph,"padding"),(isNaN(a.left)||0>a.left)&&u.xa(a.left,">= 0",ph,"padding:value.left"),(isNaN(a.right)||0>a.right)&&u.xa(a.right,">= 0",ph,"padding:value.right"),(isNaN(a.top)||0>a.top)&&u.xa(a.top,">= 0",ph,"padding:value.top"),(isNaN(a.bottom)||0>a.bottom)&&u.xa(a.bottom,">= 0",ph,"padding:value.bottom"));var b=this.Qe;b.L(a)||(this.Qe=a=a.Z(),this.h("padding",b,a))});function Je(){0<arguments.length&&u.Xc(Je);u.gc(this);this.Rx=this.Y=null;this.lq=this.nq=!0;this.vq=!1;this.yp=(new w(0,0)).freeze();this.oq=this.qq=!0;this.YA="";this.In=!1;this.ly=null}u.fa("Layout",Je);Je.prototype.cloneProtected=function(a){a.nq=this.nq;a.lq=this.lq;a.vq=this.vq;a.yp.assign(this.yp);a.qq=this.qq;a.oq=this.oq;a.YA=this.YA;this.lq||(a.In=!0)};Je.prototype.copy=function(){var a=new this.constructor;this.cloneProtected(a);return a};Je.prototype.toString=function(){var a=u.tg(Object.getPrototypeOf(this)),a=a+"(";null!==this.group&&(a+=" in "+this.group);null!==this.g&&(a+=" for "+this.g);return a+")"};u.defineProperty(Je,{g:"diagram"},function(){return this.Y},function(a){null!==a&&u.C(a,D,Je,"diagram");this.Y=a});u.defineProperty(Je,{group:"group"},function(){return this.Rx},function(a){this.Rx!==a&&(null!==a&&u.C(a,V,Je,"group"),this.Rx=a,null!==a&&(this.Y=a.g))});u.defineProperty(Je,{gH:"isOngoing"},function(){return this.nq},function(a){this.nq!==a&&(u.j(a,"boolean",Je,"isOngoing"),this.nq=a)});u.defineProperty(Je,{dH:"isInitial"},function(){return this.lq},function(a){u.j(a,"boolean",Je,"isInitial");this.lq=a;a||(this.In=!0)});u.defineProperty(Je,{kw:"isViewportSized"},function(){return this.vq},function(a){this.vq!==a&&(u.j(a,"boolean",Je,"isViewportSized"),(this.vq=a)&&this.H())});u.defineProperty(Je,{Rs:"isRouting"},function(){return this.qq},function(a){this.qq!==a&&(u.j(a,"boolean",Je,"isRouting"),this.qq=a)});u.defineProperty(Je,{QD:"isRealtime"},function(){return this.oq},function(a){this.oq!==a&&(u.j(a,"boolean",Je,"isRealtime"),this.oq=a)});u.defineProperty(Je,{wf:"isValidLayout"},function(){return this.In},function(a){this.In!==a&&(u.j(a,"boolean",Je,"isValidLayout"),this.In=a,a||(a=this.g,null!==a&&(a.Pt=!0)))});Je.prototype.invalidateLayout=Je.prototype.H=function(){if(this.In){var a=this.g;if(null!==a&&!a.ga.fb){var b=a.Mb;!b.Hn&&(b.Xg&&b.Ni(),this.gH&&a.nf||this.dH&&!a.nf)&&(this.wf=!1,a.ee())}}};u.defineProperty(Je,{network:"network"},function(){return this.ly},function(a){var b=this.ly;b!==a&&(null!==a&&u.C(a,xa,Je,"network"),null!==b&&(b.Qb=null),this.ly=a,null!==a&&(a.Qb=this))});Je.prototype.createNetwork=function(){return new xa};Je.prototype.makeNetwork=function(a){var b=this.createNetwork();b.Qb=this;a instanceof D?(b.Gj(a.Ag,!0),b.Gj(a.links,!0)):a instanceof V?b.Gj(a.Lc):b.Gj(a.i);return b};Je.prototype.updateParts=function(){var a=this.g;if(null===a&&null!==this.network){for(var b=this.network.vertexes.i;b.next();){var c=b.value.Bc;if(null!==c&&(a=c.g,null!==a)){break}}}this.wf=!0;try{null!==a&&a.Xb("Layout"),this.commitLayout()}finally{null!==a&&a.Xd("Layout")}};Je.prototype.commitLayout=function(){for(var a=this.network.vertexes.i;a.next();){a.value.commit()}if(this.Rs){for(a=this.network.edges.i;a.next();){a.value.commit()}}};Je.prototype.doLayout=function(a){null===a&&u.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts");var b=new F(G);a instanceof D?(Zo(this,b,a.Ag,!0,this.Hz,!0,!1,!0),Zo(this,b,a.Sj,!0,this.Hz,!0,!1,!0)):a instanceof V?Zo(this,b,a.Lc,!1,this.Hz,!0,!1,!0):b.Ud(a.i);var c=b.count;if(0<c){a=this.g;null!==a&&a.Xb("Layout");for(var c=Math.ceil(Math.sqrt(c)),d=this.Vd.x,e=d,f=this.Vd.y,h=0,k=0,b=b.i; + b.next();){var l=b.value;l.rf();var m=l.Ca,n=m.width,m=m.height;l.moveTo(e,f);l.ky=!1;e+=Math.max(n,50)+20;k=Math.max(k,Math.max(m,50));h>=c-1?(h=0,e=d,f+=k+20,k=0):h++}null!==a&&a.Xd("Layout")}this.wf=!0};Je.prototype.Hz=function(a){return !a.location.I()||a instanceof V&&a.ky?!0:!1};function Zo(a,b,c,d,e,f,h,k){for(c=c.i;c.next();){var l=c.value;d&&!l.Jo||null!==e&&!e(l)||!l.canLayout()||(f&&l instanceof U?l.uf||(l instanceof V?null===l.Qb?Zo(a,b,l.Lc,!1,e,f,h,k):b.add(l):b.add(l)):h&&l instanceof W?b.add(l):!k||!l.Hd()||l instanceof U||b.add(l))}}Je.prototype.collectParts=function(a){var b=new F(G);a instanceof D?(Zo(this,b,a.Ag,!0,null,!0,!0,!0),Zo(this,b,a.links,!0,null,!0,!0,!0),Zo(this,b,a.Sj,!0,null,!0,!0,!0)):a instanceof V?Zo(this,b,a.Lc,!1,null,!0,!0,!0):Zo(this,b,a.i,!1,null,!0,!0,!0);return b};u.defineProperty(Je,{Vd:"arrangementOrigin"},function(){return this.yp},function(a){u.C(a,w,Je,"arrangementOrigin");this.yp.L(a)||(this.yp.assign(a),this.H())});Je.prototype.initialOrigin=function(a){var b=this.group;if(null!==b){var c=b.position.copy();(isNaN(c.x)||isNaN(c.y))&&c.set(a);b=b.placeholder;null!==b&&(c=b.eb(xb),(isNaN(c.x)||isNaN(c.y))&&c.set(a),c.x+=b.padding.left,c.y+=b.padding.top);return c}return a};function xa(){u.gc(this);this.Od=null;this.clear()}u.fa("LayoutNetwork",xa);xa.prototype.clear=function(){if(this.vertexes){for(var a=this.vertexes.i;a.next();){var b=a.value;b.clear();b.network=null}}if(this.edges){for(a=this.edges.i;a.next();){b=a.value,b.clear(),b.network=null}}this.vertexes=new F(ya);this.edges=new F(Aa);this.Lz=new la(U,ya);this.zz=new la(W,Aa)};xa.prototype.toString=function(a){void 0===a&&(a=0);var b="LayoutNetwork"+(null!==this.Qb?"("+this.Qb.toString()+")":"");if(0>=a){return b}b+=" vertexes: "+this.vertexes.count+" edges: "+this.edges.count;if(1<a){for(var c=this.vertexes.i;c.next();){b+="\n "+c.value.toString(a-1)}for(c=this.edges.i;c.next();){b+="\n "+c.value.toString(a-1)}}return b};u.defineProperty(xa,{Qb:"layout"},function(){return this.Od},function(a){this.Od=a});xa.prototype.createVertex=function(){return new ya};xa.prototype.createEdge=function(){return new Aa};xa.prototype.addParts=xa.prototype.Gj=function(a,b,c){if(null!==a){void 0===b&&(b=!1);u.j(b,"boolean",xa,"addParts:toplevelonly");void 0===c&&(c=null);null===c&&(c=function(a){if(a instanceof U){return !a.uf}if(a instanceof W){var b=a.V;if(null===b||b.uf){return !1}a=a.ba;return null===a||a.uf?!1:!0}return !1});for(a=a.i;a.next();){var d=a.value;if(d instanceof U&&(!b||d.Jo)&&d.canLayout()&&c(d)){if(d instanceof V&&null===d.Qb){this.Gj(d.Lc,!1)}else{if(null===this.Em(d)){var e=this.createVertex();e.Bc=d;this.Mk(e)}}}}for(a.reset();a.next();){if(d=a.value,d instanceof W&&(!b||d.Jo)&&d.canLayout()&&c(d)&&null===this.Uv(d)){var f=d.V,e=d.ba;null!==f&&null!==e&&f!==e&&(f=this.findGroupVertex(f),e=this.findGroupVertex(e),null!==f&&null!==e&&this.Po(f,e,d))}}}};xa.prototype.findGroupVertex=function(a){if(null===a){return null}var b=a.findVisibleNode();if(null===b){return null}a=this.Em(b);if(null!==a){return a}for(b=b.Sa;null!==b;){a=this.Em(b);if(null!==a){return a}b=b.Sa}return null};xa.prototype.addVertex=xa.prototype.Mk=function(a){if(null!==a){this.vertexes.add(a);var b=a.Bc;null!==b&&this.Lz.add(b,a);a.network=this}};xa.prototype.addNode=xa.prototype.fs=function(a){if(null===a){return null}var b=this.Em(a);null===b&&(b=this.createVertex(),b.Bc=a,this.Mk(b));return b};xa.prototype.deleteVertex=xa.prototype.mD=function(a){if(null!==a&&$o(this,a)){for(var b=a.Je,c=b.count-1;0<=c;c--){var d=b.ja(c);this.xo(d)}b=a.Ee;for(c=b.count-1;0<=c;c--){d=b.ja(c),this.xo(d)}}};function $o(a,b){if(null===b){return !1}var c=a.vertexes.remove(b);c&&(a.Lz.remove(b.Bc),b.network=null);return c}xa.prototype.deleteNode=function(a){null!==a&&(a=this.Em(a),null!==a&&this.mD(a))};xa.prototype.findVertex=xa.prototype.Em=function(a){return null===a?null:this.Lz.ua(a)};xa.prototype.addEdge=xa.prototype.mo=function(a){if(null!==a){this.edges.add(a);var b=a.link;null!==b&&null===this.Uv(b)&&this.zz.add(b,a);b=a.toVertex;null!==b&&b.LC(a);b=a.fromVertex;null!==b&&b.KC(a);a.network=this}};xa.prototype.addLink=function(a){if(null===a){return null}var b=a.V,c=a.ba,d=this.Uv(a);null===d?(d=this.createEdge(),d.link=a,null!==b&&(d.fromVertex=this.fs(b)),null!==c&&(d.toVertex=this.fs(c)),this.mo(d)):(d.fromVertex=null!==b?this.fs(b):null,d.toVertex=null!==c?this.fs(c):null);return d};xa.prototype.deleteEdge=xa.prototype.xo=function(a){if(null!==a){var b=a.toVertex;null!==b&&b.lD(a);b=a.fromVertex;null!==b&&b.kD(a);ap(this,a)}};function ap(a,b){null!==b&&a.edges.remove(b)&&(a.zz.remove(b.link),b.network=null)}xa.prototype.deleteLink=function(a){null!==a&&(a=this.Uv(a),null!==a&&this.xo(a))};xa.prototype.findEdge=xa.prototype.Uv=function(a){return null===a?null:this.zz.ua(a)};xa.prototype.linkVertexes=xa.prototype.Po=function(a,b,c){if(null===a||null===b){return null}if(a.network===this&&b.network===this){var d=this.createEdge();d.link=c; + d.fromVertex=a;d.toVertex=b;this.mo(d);return d}return null};xa.prototype.reverseEdge=xa.prototype.Aw=function(a){if(null!==a){var b=a.fromVertex,c=a.toVertex;null!==b&&null!==c&&(b.kD(a),c.lD(a),a.Aw(),b.LC(a),c.KC(a))}};xa.prototype.deleteSelfEdges=xa.prototype.Qv=function(){for(var a=u.hb(),b=this.edges.i;b.next();){var c=b.value;c.fromVertex===c.toVertex&&a.push(c)}b=a.length;for(c=0;c<b;c++){this.xo(a[c])}u.sa(a)};xa.prototype.deleteArtificialVertexes=function(){for(var a=u.hb(),b=this.vertexes.i;b.next();){var c=b.value;null===c.Bc&&a.push(c)}c=a.length;for(b=0;b<c;b++){this.mD(a[b])}c=u.hb();for(b=this.edges.i;b.next();){var d=b.value;null===d.link&&c.push(d)}d=c.length;for(b=0;b<d;b++){this.xo(c[b])}u.sa(a);u.sa(c)};function bp(a){for(var b=u.hb(),c=a.edges.i;c.next();){var d=c.value;null!==d.fromVertex&&null!==d.toVertex||b.push(d)}c=b.length;for(d=0;d<c;d++){a.xo(b[d])}u.sa(b)}xa.prototype.splitIntoSubNetworks=xa.prototype.qI=function(){this.deleteArtificialVertexes();bp(this);this.Qv();for(var a=new E(xa),b=!0;b;){for(var b=!1,c=this.vertexes.i;c.next();){var d=c.value;if(0<d.Je.count||0<d.Ee.count){b=this.Qb.createNetwork();a.add(b);cp(this,b,d);b=!0;break}}}a.sort(function(a,b){return null===a||null===b||a===b?0:b.vertexes.count-a.vertexes.count});return a};function cp(a,b,c){if(null!==c&&c.network!==b){$o(a,c);b.Mk(c);for(var d=c.kc;d.next();){var e=d.value;e.network!==b&&(ap(a,e),b.mo(e),cp(a,b,e.fromVertex))}for(d=c.cc;d.next();){c=d.value,c.network!==b&&(ap(a,c),b.mo(c),cp(a,b,c.toVertex))}}}xa.prototype.findAllParts=function(){for(var a=new F(G),b=this.vertexes.i;b.next();){a.add(b.value.Bc)}for(b=this.edges.i;b.next();){a.add(b.value.link)}return a};function ya(){u.gc(this);this.network=null;this.aa=(new z(0,0,10,10)).freeze();this.M=(new w(5,5)).freeze();this.clear()}u.fa("LayoutVertex",ya);ya.prototype.clear=function(){this.md=this.sh=null;this.Je=new E(Aa);this.Ee=new E(Aa)};ya.prototype.toString=function(a){void 0===a&&(a=0);var b="LayoutVertex#"+u.Uc(this);if(0<a&&(b+=null!==this.Bc?"("+this.Bc.toString()+")":"",1<a)){a="";for(var c=!0,d=this.Je.i;d.next();){var e=d.value;c?c=!1:a+=",";a+=e.toString(0)}e="";c=!0;for(d=this.Ee.i;d.next();){var f=d.value;c?c=!1:e+=",";e+=f.toString(0)}b+=" sources: "+a+" destinations: "+e}return b};u.defineProperty(ya,{data:"data"},function(){return this.sh},function(a){this.sh=a;if(null!==a){var b=a.bounds;a=b.x;var c=b.y,d=b.width,b=b.height;this.M.m(d/2,b/2);this.aa.m(a,c,d,b)}});u.defineProperty(ya,{Bc:"node"},function(){return this.md},function(a){if(this.md!==a){this.md=a;a.rf();var b=a.ca,c=b.x,d=b.y,e=b.width,b=b.height;isNaN(c)&&(c=0);isNaN(d)&&(d=0);this.aa.m(c,d,e,b);if(!(a instanceof V)&&(a=a.fc.eb(Ib),a.I())){this.M.m(a.x-c,a.y-d);return}this.M.m(e/2,b/2)}});u.defineProperty(ya,{mb:"bounds"},function(){return this.aa},function(a){this.aa.L(a)||this.aa.assign(a)});u.defineProperty(ya,{focus:"focus"},function(){return this.M},function(a){this.M.L(a)||this.M.assign(a)});u.defineProperty(ya,{ma:"centerX"},function(){return this.aa.x+this.M.x},function(a){var b=this.aa;b.x+this.M.x!==a&&(b.Ma(),b.x=a-this.M.x,b.freeze())});u.defineProperty(ya,{ya:"centerY"},function(){return this.aa.y+this.M.y},function(a){var b=this.aa;b.y+this.M.y!==a&&(b.Ma(),b.y=a-this.M.y,b.freeze())});u.defineProperty(ya,{Ds:"focusX"},function(){return this.M.x},function(a){var b=this.M;b.x!==a&&(b.Ma(),b.x=a,b.freeze())});u.defineProperty(ya,{Es:"focusY"},function(){return this.M.y},function(a){var b=this.M;b.y!==a&&(b.Ma(),b.y=a,b.freeze())});u.defineProperty(ya,{x:"x"},function(){return this.aa.x},function(a){var b=this.aa;b.x!==a&&(b.Ma(),b.x=a,b.freeze())});u.defineProperty(ya,{y:"y"},function(){return this.aa.y},function(a){var b=this.aa;b.y!==a&&(b.Ma(),b.y=a,b.freeze())});u.defineProperty(ya,{width:"width"},function(){return this.aa.width},function(a){var b=this.aa;b.width!==a&&(b.Ma(),b.width=a,b.freeze())});u.defineProperty(ya,{height:"height"},function(){return this.aa.height},function(a){var b=this.aa;b.height!==a&&(b.Ma(),b.height=a,b.freeze())});ya.prototype.commit=function(){var a=this.sh;if(null!==a){var b=this.mb,c=a.bounds;u.Ta(c)?(c.x=b.x,c.y=b.y,c.width=b.width,c.height=b.height):a.bounds=b.copy()}else{if(a=this.Bc,null!==a){b=this.mb;if(!(a instanceof V)){var c=a.ca,d=a.fc.eb(Ib);if(c.I()&&d.I()){a.moveTo(b.x+this.Ds-(d.x-c.x),b.y+this.Es-(d.y-c.y));return}}a.moveTo(b.x,b.y)}}};ya.prototype.addSourceEdge=ya.prototype.LC=function(a){null!==a&&(this.Je.contains(a)||this.Je.add(a))};ya.prototype.deleteSourceEdge=ya.prototype.lD=function(a){null!==a&&this.Je.remove(a)};ya.prototype.addDestinationEdge=ya.prototype.KC=function(a){null!==a&&(this.Ee.contains(a)||this.Ee.add(a))};ya.prototype.deleteDestinationEdge=ya.prototype.kD=function(a){null!==a&&this.Ee.remove(a)};u.u(ya,{pI:"sourceVertexes"},function(){for(var a=new F(ya),b=this.kc;b.next();){a.add(b.value.fromVertex)}return a.i});u.u(ya,{sG:"destinationVertexes"},function(){for(var a=new F(ya),b=this.cc; + b.next();){a.add(b.value.toVertex)}return a.i});u.u(ya,{vertexes:"vertexes"},function(){for(var a=new F(ya),b=this.kc;b.next();){a.add(b.value.fromVertex)}for(b=this.cc;b.next();){a.add(b.value.toVertex)}return a.i});u.u(ya,{kc:"sourceEdges"},function(){return this.Je.i});u.u(ya,{cc:"destinationEdges"},function(){return this.Ee.i});u.u(ya,{edges:"edges"},function(){for(var a=new E(Aa),b=this.kc;b.next();){a.add(b.value)}for(b=this.cc;b.next();){a.add(b.value)}return a.i});u.u(ya,{yG:"edgesCount"},function(){return this.Je.count+this.Ee.count});var dp;ya.standardComparer=dp=function(a,b){var c=a.md,d=b.md;return c?d?(c=c.text,d=d.text,c<d?-1:c>d?1:0):1:null!==d?-1:0};ya.smartComparer=function(a,b){if(null!==a){if(null!==b){var c=a.md,d=b.md;if(null!==c){if(null!==d){for(var c=c.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/),d=d.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/),e=0;e<c.length;e++){if(""!==d[e]&&void 0!==d[e]){var f=parseFloat(c[e]),h=parseFloat(d[e]);if(isNaN(f)){if(!isNaN(h)){return 1}if(0!==c[e].localeCompare(d[e])){return c[e].localeCompare(d[e])}}else{if(isNaN(h)){return -1}if(0!==f-h){return f-h}}}else{if(""!==c[e]){return 1}}}return""!==d[e]&&void 0!==d[e]?-1:0}return 1}return null!==d?-1:0}return 1}return null!==b?-1:0};function Aa(){u.gc(this);this.network=null;this.clear()}u.fa("LayoutEdge",Aa);Aa.prototype.clear=function(){this.toVertex=this.fromVertex=this.link=this.data=null};Aa.prototype.toString=function(a){void 0===a&&(a=0);var b="LayoutEdge#"+u.Uc(this);0<a&&(b+=null!==this.link?"("+this.link.toString()+")":"",1<a&&(b+=" "+(this.fromVertex?this.fromVertex.toString():"null")+" --\x3e "+(this.toVertex?this.toVertex.toString():"null")));return b};Aa.prototype.Aw=function(){var a=this.fromVertex;this.fromVertex=this.toVertex;this.toVertex=a};Aa.prototype.commit=function(){};Aa.prototype.getOtherVertex=Aa.prototype.HG=function(a){return this.toVertex===a?this.fromVertex:this.fromVertex===a?this.toVertex:null};function Xk(){0<arguments.length&&u.Xc(Xk);Je.call(this);this.kw=!0;this.cs=this.ds=NaN;this.Ti=(new ia(NaN,NaN)).freeze();this.Ih=(new ia(10,10)).freeze();this.ue=em;this.Zc=cm;this.Hh=Zl;this.rh=ep}u.Ha(Xk,Je);u.fa("GridLayout",Xk);Xk.prototype.cloneProtected=function(a){Je.prototype.cloneProtected.call(this,a);a.ds=this.ds;a.cs=this.cs;a.Ti.assign(this.Ti);a.Ih.assign(this.Ih);a.ue=this.ue;a.Zc=this.Zc;a.Hh=this.Hh;a.rh=this.rh};Xk.prototype.doLayout=function(a){null===a&&u.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts");this.Vd=this.initialOrigin(this.Vd);var b=this.g,c=new F(G);a instanceof D?(b=a,Zo(this,c,a.Ag,!0,null,!0,!0,!0),Zo(this,c,a.links,!0,null,!0,!0,!0),Zo(this,c,a.Sj,!0,null,!0,!0,!0)):a instanceof V?(b=a.g,Zo(this,c,a.Lc,!1,null,!0,!0,!0)):c.Ud(a.i);for(a=c.copy().i;a.next();){var d=a.value;if(d instanceof W){var e=d;if(null!==e.V||null!==e.ba){c.remove(e);continue}}d.rf();if(d instanceof V){for(d=d.Lc;d.next();){c.remove(d.value)}}}e=c.Le();if(0!==e.length){switch(this.sorting){case bm:e.reverse();break;case Zl:e.sort(this.comparer);break;case $l:e.sort(this.comparer),e.reverse()}var f=this.HI;isNaN(f)&&(f=0);var h=this.cF,h=isNaN(h)&&null!==b?Math.max(b.ob.width-b.padding.left-b.padding.right,0):Math.max(this.cF,0);0>=f&&0>=h&&(f=1);c=this.spacing.width;isFinite(c)||(c=0);a=this.spacing.height;isFinite(a)||(a=0);null!==b&&b.Xb("Layout");d=[];switch(this.alignment){case fm:var k=c,l=a,m=Math.max(this.so.width,1);if(!isFinite(m)){for(var n=m=0;n<e.length;n++){var p=e[n],q=p.Ca,m=Math.max(m,q.width)}}var m=Math.max(m+k,1),r=Math.max(this.so.height,1);if(!isFinite(r)){for(n=r=0;n<e.length;n++){p=e[n],q=p.Ca,r=Math.max(r,q.height)}}for(var r=Math.max(r+l,1),s=this.Hf,t=this.Vd.x,v=t,x=this.Vd.y,A=0,y=0,n=0;n<e.length;n++){var p=e[n],q=p.Ca,C=Math.ceil((q.width+k)/m)*m,I=Math.ceil((q.height+l)/r)*r,H=0;switch(s){case dm:H=Math.abs(v-q.width);break;default:H=v+q.width}if(0<f&&A>f-1||0<h&&0<A&&H>h){d.push(new z(0,x,h+k,y)),A=0,v=t,x+=y,y=0}y=Math.max(y,I);I=0;switch(s){case dm:I=-q.width;break;default:I=0}p.moveTo(v+I,x);switch(s){case dm:v-=C;break;default:v+=C}A++}d.push(new z(0,x,h+k,y));break;case em:k=f;l=c;m=a;n=Math.max(this.so.width,1);p=x=C=0;q=u.K();for(f=0;f<e.length;f++){r=e[f],s=r.Ca,t=On(r,r.fc,r.af,q),C=Math.max(C,t.x),x=Math.max(x,s.width-t.x),p=Math.max(p,t.y)}v=this.Hf;switch(v){case dm:C+=l;break;default:x+=l}var n=isFinite(n)?Math.max(n+l,1):Math.max(C+x,1),R=x=this.Vd.x,A=this.Vd.y,y=0;h>=C&&(h-=C);for(var C=I=0,H=Math.max(this.so.height,1),aa=p=0,S=!0,N=u.K(),f=0;f<e.length;f++){r=e[f];s=r.Ca;t=On(r,r.fc,r.af,q);if(0<y){switch(v){case dm:R=(R-x-(s.width-t.x))/n;R=K.Wa(Math.round(R),R)?Math.round(R):Math.floor(R);R=R*n+x;break;default:R=(R-x+t.x)/n,R=K.Wa(Math.round(R),R)?Math.round(R):Math.ceil(R),R=R*n+x}}else{switch(v){case dm:I=R+t.x+s.width;break;default:I=R-t.x}}var Z=0;switch(v){case dm:Z=-(R+t.x)+I;break;default:Z=R+s.width-t.x-I + }if(0<k&&y>k-1||0<h&&0<y&&Z>h){d.push(new z(0,S?A-p:A,h+l,aa+p+m));for(R=0;R<y&&f!==y;R++){var Z=e[f-y+R],Ga=On(Z,Z.fc,Z.af,N);Z.moveTo(Z.position.x,Z.position.y+p-Ga.y)}aa+=m;A=S?A+aa:A+(aa+p);y=aa=p=0;R=x;S=!1}R===x&&(C=v===dm?Math.max(C,s.width-t.x):Math.min(C,-t.x));p=Math.max(p,t.y);aa=Math.max(aa,s.height-t.y);isFinite(H)&&(aa=Math.max(aa,Math.max(s.height,H)-t.y));S?r.moveTo(R-t.x,A-t.y):r.moveTo(R-t.x,A);switch(v){case dm:R-=t.x+l;break;default:R+=s.width-t.x+l}y++}d.push(new z(0,A,h+l,(S?aa:aa+p)+m));for(R=0;R<y&&f!==y;R++){Z=e[f-y+R],Ga=On(Z,Z.fc,Z.af,q),Z.moveTo(Z.position.x,Z.position.y+p-Ga.y)}u.v(q);u.v(N);if(v===dm){for(f=0;f<d.length;f++){e=d[f],e.width+=C,e.x-=C}}else{for(f=0;f<d.length;f++){e=d[f],e.x>C&&(e.width+=e.x-C,e.x=C)}}}for(k=f=h=e=0;k<d.length;k++){l=d[k],e=Math.min(e,l.x),h=Math.min(h,l.y),f=Math.max(f,l.x+l.width)}this.Hf===dm?this.commitLayers(d,new w(e+c/2-(f+e),h-a/2)):this.commitLayers(d,new w(e-c/2,h-a/2));null!==b&&b.Xd("Layout");this.wf=!0}};Xk.prototype.commitLayers=function(){};u.defineProperty(Xk,{cF:"wrappingWidth"},function(){return this.ds},function(a){this.ds!==a&&(u.j(a,"number",Xk,"wrappingWidth"),0<a||isNaN(a))&&(this.ds=a,this.kw=isNaN(a),this.H())});u.defineProperty(Xk,{HI:"wrappingColumn"},function(){return this.cs},function(a){this.cs!==a&&(u.j(a,"number",Xk,"wrappingColumn"),0<a||isNaN(a))&&(this.cs=a,this.H())});u.defineProperty(Xk,{so:"cellSize"},function(){return this.Ti},function(a){u.C(a,ia,Xk,"cellSize");this.Ti.L(a)||(this.Ti.assign(a),this.H())});u.defineProperty(Xk,{spacing:"spacing"},function(){return this.Ih},function(a){u.C(a,ia,Xk,"spacing");this.Ih.L(a)||(this.Ih.assign(a),this.H())});u.defineProperty(Xk,{alignment:"alignment"},function(){return this.ue},function(a){this.ue!==a&&(u.rb(a,Xk,Xk,"alignment"),a===em||a===fm)&&(this.ue=a,this.H())});u.defineProperty(Xk,{Hf:"arrangement"},function(){return this.Zc},function(a){this.Zc!==a&&(u.rb(a,Xk,Xk,"arrangement"),a===cm||a===dm)&&(this.Zc=a,this.H())});u.defineProperty(Xk,{sorting:"sorting"},function(){return this.Hh},function(a){this.Hh!==a&&(u.rb(a,Xk,Xk,"sorting"),a===am||a===bm||a===Zl||a===$l)&&(this.Hh=a,this.H())});u.defineProperty(Xk,{comparer:"comparer"},function(){return this.rh},function(a){this.rh!==a&&(u.j(a,"function",Xk,"comparer"),this.rh=a,this.H())});var ep;Xk.standardComparer=ep=function(a,b){var c=a.text,d=b.text;return c<d?-1:c>d?1:0};Xk.smartComparer=function(a,b){if(null!==a){if(null!==b){for(var c=a.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/),d=b.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/),e=0;e<c.length;e++){if(""!==d[e]&&void 0!==d[e]){var f=parseFloat(c[e]),h=parseFloat(d[e]);if(isNaN(f)){if(!isNaN(h)){return 1}if(0!==c[e].localeCompare(d[e])){return c[e].localeCompare(d[e])}}else{if(isNaN(h)){return -1}if(0!==f-h){return f-h}}}else{if(""!==c[e]){return 1}}}return""!==d[e]&&void 0!==d[e]?-1:0}return 1}return null!==b?-1:0};var fm;Xk.Position=fm=u.s(Xk,"Position",0);var em;Xk.Location=em=u.s(Xk,"Location",1);var cm;Xk.LeftToRight=cm=u.s(Xk,"LeftToRight",2);var dm;Xk.RightToLeft=dm=u.s(Xk,"RightToLeft",3);var am;Xk.Forward=am=u.s(Xk,"Forward",4);var bm;Xk.Reverse=bm=u.s(Xk,"Reverse",5);var Zl;Xk.Ascending=Zl=u.s(Xk,"Ascending",6);var $l;Xk.Descending=$l=u.s(Xk,"Descending",7);function gm(){0<arguments.length&&u.Xc(gm);Je.call(this);this.Ix=this.tn=this.vd=0;this.Up=360;this.Hx=zm;this.mk=0;this.eB=zm;this.Wt=this.lg=this.yC=0;this.vv=new fp;this.Zt=this.Zl=0;this.AF=600;this.nr=NaN;this.Ap=1;this.Pr=0;this.Rr=360;this.Zc=zm;this.la=om;this.Hh=lm;this.rh=dp;this.Ih=6;this.ar=Cm}u.Ha(gm,Je);u.fa("CircularLayout",gm);gm.prototype.cloneProtected=function(a){Je.prototype.cloneProtected.call(this,a);a.nr=this.nr;a.Ap=this.Ap;a.Pr=this.Pr;a.Rr=this.Rr;a.Zc=this.Zc;a.la=this.la;a.Hh=this.Hh;a.rh=this.rh;a.Ih=this.Ih;a.ar=this.ar};gm.prototype.createNetwork=function(){return new gp};gm.prototype.doLayout=function(a){null===a&&u.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts");null===this.network&&(this.network=this.makeNetwork(a));a=this.network.vertexes;if(1>=a.count){1===a.count&&(a=a.first(),a.ma=0,a.ya=0)}else{var b=new E(hp);b.Ud(a.i);a=new E(hp);var c=new E(hp),d;d=this.sort(b);var e=this.Hx,f=this.eB,h=this.vd,k=this.tn,l=this.Ix,m=this.Up,b=this.mk,n=this.yC,p=this.lg,q=this.Wt,e=this.Hf,f=this.sw,h=this.QH;if(!isFinite(h)||0>=h){h=NaN}k=this.RF;if(!isFinite(k)||0>=k){k=1}l=this.Ke;isFinite(l)||(l=0);m=this.Rf;if(!isFinite(m)||360<m||1>m){m=360}b=this.spacing;isFinite(b)||(b=NaN);e===Am&&f===Bm?e=zm:e===Am&&f!==Bm&&(f=Bm,e=this.Hf);if((this.direction===mm||this.direction===nm)&&this.sorting!==lm){for(var r=0;!(r>=d.length);r+=2){a.add(d.ja(r));if(r+1>=d.length){break}c.add(d.ja(r+1))}this.direction===mm?(this.Hf===Am&&a.reverse(),d=new E(hp),d.Ud(a),d.Ud(c)):(this.Hf===Am&&c.reverse(),d=new E(hp),d.Ud(c),d.Ud(a))}for(var s=d.length,t=n=0,r=0;r<d.length; + r++){var p=l+m*t*(this.direction===om?1:-1)/s,v=d.ja(r).diameter;isNaN(v)&&(v=ip(d.ja(r),p));360>m&&(0===r||r===d.length-1)&&(v/=2);n+=v;t++}if(isNaN(h)||e===Am){isNaN(b)&&(b=6);if(e!==zm&&e!==Am){v=-Infinity;for(r=0;r<s;r++){var q=d.ja(r),x=d.ja(r===s-1?0:r+1);isNaN(q.diameter)&&ip(q,0);isNaN(x.diameter)&&ip(x,0);v=Math.max(v,(q.diameter+x.diameter)/2)}q=v+b;e===xm?(p=2*Math.PI/s,h=(v+b)/p):h=jp(this,q*(360<=m?s:s-1),k,l*Math.PI/180,m*Math.PI/180)}else{h=jp(this,n+(360<=m?s:s-1)*(e!==Am?b:1.6*b),k,l*Math.PI/180,m*Math.PI/180)}p=h*k}else{if(p=h*k,t=kp(this,h,p,l*Math.PI/180,m*Math.PI/180),isNaN(b)){if(e===zm||e===Am){b=(t-n)/(360<=m?s:s-1)}}else{if(e===zm||e===Am){r=(t-n)/(360<=m?s:s-1),r<b?(h=jp(this,n+b*(360<=m?s:s-1),k,l*Math.PI/180,m*Math.PI/180),p=h*k):b=r}else{v=-Infinity;for(r=0;r<s;r++){q=d.ja(r),x=d.ja(r===s-1?0:r+1),isNaN(q.diameter)&&ip(q,0),isNaN(x.diameter)&&ip(x,0),v=Math.max(v,(q.diameter+x.diameter)/2)}q=v+b;r=jp(this,q*(360<=m?s:s-1),k,l*Math.PI/180,m*Math.PI/180);r>h?(h=r,p=h*k):q=t/(360<=m?s:s-1)}}}this.Hx=e;this.eB=f;this.vd=h;this.tn=k;this.Ix=l;this.Up=m;this.mk=b;this.yC=n;this.lg=p;this.Wt=q;b=d;d=this.Hx;e=this.vd;f=this.Ix;k=this.Up;l=this.mk;m=this.lg;n=this.Wt;if(this.direction!==mm&&this.direction!==nm||d!==Am){if(this.direction===mm||this.direction===nm){h=0;switch(d){case ym:h=180*lp(this,e,m,f,n)/Math.PI;break;case zm:n=b=0;h=a.first();null!==h&&(b=ip(h,Math.PI/2));h=c.first();null!==h&&(n=ip(h,Math.PI/2));h=180*lp(this,e,m,f,l+(b+n)/2)/Math.PI;break;case xm:h=k/b.length}if(this.direction===mm){switch(d){case ym:mp(this,a,f,pm);break;case zm:np(this,a,f,pm);break;case xm:op(this,a,k/2,f,pm)}switch(d){case ym:mp(this,c,f+h,om);break;case zm:np(this,c,f+h,om);break;case xm:op(this,c,k/2,f+h,om)}}else{switch(d){case ym:mp(this,c,f,pm);break;case zm:np(this,c,f,pm);break;case xm:op(this,c,k/2,f,pm)}switch(d){case ym:mp(this,a,f+h,om);break;case zm:np(this,a,f+h,om);break;case xm:op(this,a,k/2,f+h,om)}}}else{switch(d){case ym:mp(this,b,f,this.direction);break;case zm:np(this,b,f,this.direction);break;case xm:op(this,b,k,f,this.direction);break;case Am:pp(this,b,k,f,this.direction)}}}else{pp(this,b,k,f-k/2,om)}}this.updateParts();this.network=null;this.wf=!0};function op(a,b,c,d,e){var f=a.Up,h=a.vd;a=a.lg;d=d*Math.PI/180;c=c*Math.PI/180;for(var k=b.length,l=0;l<k;l++){var m=d+(e===om?l*c/(360<=f?k:k-1):-(l*c)/k),n=b.ja(l),p=h*Math.tan(m)/a,p=Math.sqrt((h*h+a*a*p*p)/(1+p*p));n.ma=p*Math.cos(m);n.ya=p*Math.sin(m);n.actualAngle=180*m/Math.PI}}function np(a,b,c,d){var e=a.vd,f=a.lg,h=a.mk;c=c*Math.PI/180;for(var k=b.length,l=0;l<k;l++){var m=b.ja(l),n=b.ja(l===k-1?0:l+1),p=f*Math.sin(c);m.ma=e*Math.cos(c);m.ya=p;m.actualAngle=180*c/Math.PI;isNaN(m.diameter)&&ip(m,0);isNaN(n.diameter)&&ip(n,0);m=lp(a,e,f,d===om?c:-c,(m.diameter+n.diameter)/2+h);c+=d===om?m:-m}}function mp(a,b,c,d){var e=a.vd,f=a.lg,h=a.Wt;c=c*Math.PI/180;for(var k=b.length,l=0;l<k;l++){var m=b.ja(l);m.ma=e*Math.cos(c);m.ya=f*Math.sin(c);m.actualAngle=180*c/Math.PI;m=lp(a,e,f,d===om?c:-c,h);c+=d===om?m:-m}}function pp(a,b,c,d,e){var f=a.Zt,f=a.Up;a.Zl=0;a.vv=new fp;if(360>c){for(f=d+(e===om?f:-f);0>f;){f+=360}f%=360;180<f&&(f-=360);f*=Math.PI/180;a.Zt=f;qp(a,b,c,d,e)}else{rp(a,b,c,d,e)}a.vv.commit(b)}function rp(a,b,c,d,e){var f=a.vd,h=a.mk,k=a.tn,l=f*Math.cos(d*Math.PI/180),m=a.lg*Math.sin(d*Math.PI/180),n=b.Le();if(3===n.length){n[0].ma=f,n[0].ya=0,n[1].ma=n[0].ma-n[0].width/2-n[1].width/2-h,n[1].y=n[0].y,n[2].ma=(n[0].ma+n[1].ma)/2,n[2].y=n[0].y-n[2].height-h}else{if(4===n.length){n[0].ma=f,n[0].ya=0,n[2].ma=-n[0].ma,n[2].ya=n[0].ya,n[1].ma=0,n[1].y=Math.min(n[0].y,n[2].y)-n[1].height-h,n[3].ma=0,n[3].y=Math.max(n[0].y+n[0].height+h,n[2].y+n[2].height+h)}else{for(var f=u.K(),p=0;p<n.length;p++){n[p].ma=l;n[p].ya=m;if(p>=n.length-1){break}sp(a,l,m,n,p,e,f)||tp(a,l,m,n,p,e,f);l=f.x;m=f.y}u.v(f);a.Zl++;if(!(23<a.Zl)){var l=n[0].ma,m=n[0].ya,f=n[n.length-1].ma,p=n[n.length-1].ya,q=Math.abs(l-f)-((n[0].width+n[n.length-1].width)/2+h),r=Math.abs(m-p)-((n[0].height+n[n.length-1].height)/2+h),h=0;1>Math.abs(r)?Math.abs(l-f)<(n[0].width+n[n.length-1].width)/2&&(h=0):h=0<r?r:1>Math.abs(q)?0:q;q=!1;q=Math.abs(f)>Math.abs(p)?0<f!==m>p:0<p!==l<f;if(q=e===om?q:!q){h=-Math.abs(h),h=Math.min(h,-n[n.length-1].width),h=Math.min(h,-n[n.length-1].height)}a.vv.compare(h,n);1<Math.abs(h)&&(a.vd=8>a.Zl?a.vd-h/(2*Math.PI):5>n.length&&10<h?a.vd/2:a.vd-(0<h?1.7:-2.3),a.lg=a.vd*k,rp(a,b,c,d,e))}}}}function qp(a,b,c,d,e){for(var f=a.vd,h=a.lg,k=a.tn,l=f*Math.cos(d*Math.PI/180),m=h*Math.sin(d*Math.PI/180),n=u.K(),p=b.Le(),q=0;q<p.length;q++){p[q].ma=l;p[q].ya=m;if(q>=p.length-1){break}sp(a,l,m,p,q,e,n)||tp(a,l,m,p,q,e,n);l=n.x;m=n.y}u.v(n);a.Zl++;if(!(23<a.Zl)){l=Math.atan2(m,l);l=e===om?a.Zt-l:l-a.Zt;l=Math.abs(l)<Math.abs(l-2*Math.PI)?l:l-2*Math.PI;f=l*(f+h)/2;h=a.vv;if(Math.abs(f)<Math.abs(h.Do)){for(h.Do=f,h.Um=[],h.np=[],l=0;l<p.length;l++){h.Um[l]=p[l].mb.x,h.np[l]=p[l].mb.y}}1<Math.abs(f)&&(a.vd=8>a.Zl?a.vd-f/(2*Math.PI):a.vd-(0<f?1.7:-2.3),a.lg=a.vd*k,qp(a,b,c,d,e)) + }}function sp(a,b,c,d,e,f,h){var k=a.vd,l=a.lg,m=0,n=0;a=(d[e].width+d[e+1].width)/2+a.mk;var p=!1;if(0<=c!==(f===om)){if(m=b+a,m>k){m=b-a;if(m<-k){return h.x=m,h.y=n,!1}p=!0}}else{if(m=b-a,m<-k){m=b+a;if(m>k){return h.x=m,h.y=n,!1}p=!0}}n=Math.sqrt(1-Math.min(1,m*m/(k*k)))*l;0>c!==p&&(n=-n);if(Math.abs(c-n)>(d[e].height+d[e+1].height)/2){return h.x=m,h.y=n,!1}h.x=m;h.y=n;return !0}function tp(a,b,c,d,e,f,h){var k=a.vd,l=a.lg,m=0,n=0;a=(d[e].height+d[e+1].height)/2+a.mk;d=!1;if(0<=b!==(f===om)){if(n=c-a,n<-l){n=c+a;if(n>l){h.x=m;h.y=n;return}d=!0}}else{if(n=c+a,n>l){n=c-a;if(n<-l){h.x=m;h.y=n;return}d=!0}}m=Math.sqrt(1-Math.min(1,n*n/(l*l)))*k;0>b!==d&&(m=-m);h.x=m;h.y=n}gm.prototype.commitLayout=function(){this.commitNodes();this.Rs&&this.commitLinks()};gm.prototype.commitNodes=function(){for(var a=this.JF,b=this.network.vertexes.i;b.next();){var c=b.value;c.x+=a.x;c.y+=a.y;c.commit()}};gm.prototype.commitLinks=function(){for(var a=this.network.edges.i;a.next();){a.value.commit()}};function kp(a,b,c,d,e){var f=a.AF;if(0.001>Math.abs(a.tn-1)){return void 0!==d&&void 0!==e?e*b:2*Math.PI*b}a=b>c?Math.sqrt(b*b-c*c)/b:Math.sqrt(c*c-b*b)/c;for(var h=0,k=0,k=void 0!==d&&void 0!==e?e/(f+1):Math.PI/(2*(f+1)),l=0,m=0;m<=f;m++){l=void 0!==d&&void 0!==e?d+m*e/f:m*Math.PI/(2*f),l=Math.sin(l),h+=Math.sqrt(1-a*a*l*l)*k}return void 0!==d&&void 0!==e?(b>c?b:c)*h:4*(b>c?b:c)*h}function jp(a,b,c,d,e){var f=0,f=void 0!==d&&void 0!==e?kp(a,1,c,d,e):kp(a,1,c);return b/f}function lp(a,b,c,d,e){if(0.001>Math.abs(a.tn-1)){return e/b}var f=b>c?Math.sqrt(b*b-c*c)/b:Math.sqrt(c*c-b*b)/c,h=0;a=2*Math.PI/(700*a.network.vertexes.count);b>c&&(d+=Math.PI/2);for(var k=0;;k++){var l=Math.sin(d+k*a),h=h+(b>c?b:c)*Math.sqrt(1-f*f*l*l)*a;if(h>=e){return k*a}}}gm.prototype.sort=function(a){switch(this.sorting){case jm:break;case km:a.reverse();break;case hm:a.sort(this.comparer);break;case im:a.sort(this.comparer);a.reverse();break;case lm:for(var b=[],c=0;c<a.length;c++){b.push(0)}for(var d=new E(hp),c=0;c<a.length;c++){var e=-1,f=-1;if(0===c){for(var h=0;h<a.length;h++){var k=a.ja(h).yG;k>e&&(e=k,f=h)}}else{for(h=0;h<a.length;h++){k=b[h],k>e&&(e=k,f=h)}}d.add(a.ja(f));b[f]=-1;f=a.ja(f);e=0;for(h=f.kc;h.next();){e=a.indexOf(h.value.fromVertex),0>e||0<=b[e]&&b[e]++}for(f=f.cc;f.next();){e=a.indexOf(f.value.toVertex),0>e||0<=b[e]&&b[e]++}}a=[];for(b=0;b<d.length;b++){h=d.ja(b);a[b]=[];for(var l=0,c=h.cc;c.next();){l=d.indexOf(c.value.toVertex),l!==b&&0>a[b].indexOf(l)&&a[b].push(l)}for(c=h.kc;c.next();){l=d.indexOf(c.value.fromVertex),l!==b&&0>a[b].indexOf(l)&&a[b].push(l)}}h=[];for(b=0;b<a.length;b++){h[b]=0}for(var c=[],k=[],m=[],e=[],f=new E(hp),n=0,b=0;b<a.length;b++){var p=a[b].length;if(1===p){e.push(b)}else{if(0===p){f.add(d.ja(b))}else{if(0===n){c.push(b)}else{for(var q=Infinity,r=Infinity,s=-1,t=[],p=0;p<c.length;p++){0>a[c[p]].indexOf(c[p===c.length-1?0:p+1])&&t.push(p===c.length-1?0:p+1)}if(0===t.length){for(p=0;p<c.length;p++){t.push(p)}}for(p=0;p<t.length;p++){var v=t[p],x,l=a[b];x=k;for(var A=m,y=h,C=v,I=c,H=0,R=0;R<x.length;R++){var aa=y[x[R]],S=y[A[R]],N=0,Z=0;aa<S?(N=aa,Z=S):(N=S,Z=aa);if(N<C&&C<=Z){for(aa=0;aa<l.length;aa++){S=l[aa],0>I.indexOf(S)||N<y[S]&&y[S]<Z||N===y[S]||Z===y[S]||H++}}else{for(aa=0;aa<l.length;aa++){S=l[aa],0>I.indexOf(S)||N<y[S]&&y[S]<Z&&N!==y[S]&&Z!==y[S]&&H++}}}x=H;for(y=A=0;y<a[b].length;y++){l=c.indexOf(a[b][y]),0<=l&&(l=Math.abs(v-(l>=v?l+1:l)),A+=l<c.length+1-l?l:c.length+1-l)}for(y=0;y<k.length;y++){l=h[k[y]],C=h[m[y]],l>=v&&l++,C>=v&&C++,l>C&&(I=C,C=l,l=I),C-l<(c.length+2)/2===(l<v&&v<=C)&&A++}if(x<q||x===q&&A<r){q=x,r=A,s=v}}c.splice(s,0,b);for(p=0;p<c.length;p++){h[c[p]]=p}for(p=0;p<a[b].length;p++){q=a[b][p],0<=c.indexOf(q)&&(k.push(b),m.push(q))}}n++}}}k=!1;for(m=c.length;;){k=!0;for(h=0;h<e.length;h++){if(b=e[h],n=a[b][0],l=c.indexOf(n),0<=l){for(r=p=0;r<a[n].length;r++){q=a[n][r],q=c.indexOf(q),0>q||q===l||(s=q>l?q-l:l-q,p+=q<l!==s>m-s?1:-1)}c.splice(0>p?l:l+1,0,b);e.splice(h,1);h--}else{k=!1}}if(k){break}else{c.push(e[0]),e.splice(0,1)}}for(b=0;b<c.length;b++){l=c[b],f.add(d.ja(l))}return f;default:u.k("Invalid sorting type.")}return a};u.defineProperty(gm,{QH:"radius"},function(){return this.nr},function(a){this.nr!==a&&(u.j(a,"number",gm,"radius"),0<a||isNaN(a))&&(this.nr=a,this.H())});u.defineProperty(gm,{RF:"aspectRatio"},function(){return this.Ap},function(a){this.Ap!==a&&(u.j(a,"number",gm,"aspectRatio"),0<a&&(this.Ap=a,this.H()))});u.defineProperty(gm,{Ke:"startAngle"},function(){return this.Pr},function(a){this.Pr!==a&&(u.j(a,"number",gm,"startAngle"),this.Pr=a,this.H())});u.defineProperty(gm,{Rf:"sweepAngle"},function(){return this.Rr},function(a){this.Rr!==a&&(u.j(a,"number",gm,"sweepAngle"),this.Rr=0<a&&360>=a?a:360,this.H())});u.defineProperty(gm,{Hf:"arrangement"},function(){return this.Zc},function(a){this.Zc!==a&&(u.rb(a,gm,gm,"arrangement"),a===Am||a===zm||a===ym||a===xm)&&(this.Zc=a,this.H())});u.defineProperty(gm,{direction:"direction"},function(){return this.la},function(a){this.la!==a&&(u.rb(a,gm,gm,"direction"),a===om||a===pm||a===mm||a===nm)&&(this.la=a,this.H()) + });u.defineProperty(gm,{sorting:"sorting"},function(){return this.Hh},function(a){this.Hh!==a&&(u.rb(a,gm,gm,"sorting"),a===jm||a===km||a===hm||im||a===lm)&&(this.Hh=a,this.H())});u.defineProperty(gm,{comparer:"comparer"},function(){return this.rh},function(a){this.rh!==a&&(u.j(a,"function",gm,"comparer"),this.rh=a,this.H())});u.defineProperty(gm,{spacing:"spacing"},function(){return this.Ih},function(a){this.Ih!==a&&(u.j(a,"number",gm,"spacing"),this.Ih=a,this.H())});u.defineProperty(gm,{sw:"nodeDiameterFormula"},function(){return this.ar},function(a){this.ar!==a&&(u.rb(a,gm,gm,"nodeDiameterFormula"),a===Cm||a===Bm)&&(this.ar=a,this.H())});u.u(gm,{KF:"actualXRadius"},function(){return this.vd});u.u(gm,{LF:"actualYRadius"},function(){return this.lg});u.u(gm,{JI:"actualSpacing"},function(){return this.mk});u.u(gm,{JF:"actualCenter"},function(){return isNaN(this.Vd.x)||isNaN(this.Vd.y)?new w(0,0):new w(this.Vd.x+this.KF,this.Vd.y+this.LF)});var zm;gm.ConstantSpacing=zm=u.s(gm,"ConstantSpacing",0);var ym;gm.ConstantDistance=ym=u.s(gm,"ConstantDistance",1);var xm;gm.ConstantAngle=xm=u.s(gm,"ConstantAngle",2);var Am;gm.Packed=Am=u.s(gm,"Packed",3);var om;gm.Clockwise=om=u.s(gm,"Clockwise",4);var pm;gm.Counterclockwise=pm=u.s(gm,"Counterclockwise",5);var mm;gm.BidirectionalLeft=mm=u.s(gm,"BidirectionalLeft",6);var nm;gm.BidirectionalRight=nm=u.s(gm,"BidirectionalRight",7);var jm;gm.Forwards=jm=u.s(gm,"Forwards",8);var km;gm.Reverse=km=u.s(gm,"Reverse",9);var hm;gm.Ascending=hm=u.s(gm,"Ascending",10);var im;gm.Descending=im=u.s(gm,"Descending",11);var lm;gm.Optimized=lm=u.s(gm,"Optimized",12);var Cm;gm.Pythagorean=Cm=u.s(gm,"Pythagorean",13);var Bm;gm.Circular=Bm=u.s(gm,"Circular",14);function fp(){this.Do=-Infinity;this.np=this.Um=null}fp.prototype.compare=function(a,b){if(0<a&&0>this.Do||Math.abs(a)<Math.abs(this.Do)&&!(0>a&&0<this.Do)){this.Do=a;this.Um=[];this.np=[];for(var c=0;c<b.length;c++){this.Um[c]=b[c].mb.x,this.np[c]=b[c].mb.y}}};fp.prototype.commit=function(a){if(null!==this.Um&&null!==this.np){for(var b=0;b<this.Um.length;b++){var c=a.ja(b);c.x=this.Um[b];c.y=this.np[b]}}};function gp(){xa.call(this)}u.Ha(gp,xa);u.fa("CircularNetwork",gp);gp.prototype.createVertex=function(){return new hp};gp.prototype.createEdge=function(){return new up};function hp(){ya.call(this);this.actualAngle=this.diameter=NaN}u.Ha(hp,ya);u.fa("CircularVertex",hp);function ip(a,b){var c=a.network;if(null===c){return NaN}c=c.Qb;if(null===c){return NaN}if(c.Hf===Am){if(c.sw===Bm){a.diameter=Math.max(a.width,a.height)}else{var c=Math.abs(Math.sin(b)),d=Math.abs(Math.cos(b));if(0===c){return a.width}if(0===d){return a.height}a.diameter=Math.min(a.height/c,a.width/d)}}else{a.diameter=c.sw===Bm?Math.max(a.width,a.height):Math.sqrt(a.width*a.width+a.height*a.height)}return a.diameter}function up(){Aa.call(this)}u.Ha(up,Aa);u.fa("CircularEdge",up);function vp(){0<arguments.length&&u.Xc(vp);Je.call(this);this.kg=null;this.xq=0;this.Vf=(new ia(100,100)).freeze();this.zp=!1;this.Gh=!0;this.qh=!1;this.Qn=100;this.Wp=1;this.Ah=1000;this.or=Math;this.on=0.05;this.nn=50;this.kn=150;this.mn=0;this.Qp=10;this.Pp=5}u.Ha(vp,Je);u.fa("ForceDirectedLayout",vp);vp.prototype.cloneProtected=function(a){Je.prototype.cloneProtected.call(this,a);a.Vf.assign(this.Vf);a.zp=this.zp;a.Gh=this.Gh;a.qh=this.qh;a.Qn=this.Qn;a.Wp=this.Wp;a.Ah=this.Ah;a.or=this.or;a.on=this.on;a.nn=this.nn;a.kn=this.kn;a.mn=this.mn;a.Qp=this.Qp;a.Pp=this.Pp};vp.prototype.createNetwork=function(){return new wp};vp.prototype.doLayout=function(a){null===a&&u.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts");null===this.network&&(this.network=this.makeNetwork(a));a=this.Bz;if(0<this.network.vertexes.count){this.network.Qv();for(var b=this.network.vertexes.i;b.next();){var c=b.value;c.charge=this.electricalCharge(c);c.mass=this.gravitationalMass(c)}for(b=this.network.edges.i;b.next();){c=b.value,c.stiffness=this.springStiffness(c),c.length=this.springLength(c)}this.Py();this.xq=0;if(this.needsClusterLayout()){b=this.network;for(c=b.qI().i;c.next();){this.network=c.value;for(var d=this.network.vertexes.i;d.next();){var e=d.value;e.Pf=e.vertexes.count;e.Rj=1;e.vm=null;e.jh=null}xp(this,0,a)}this.network=b;c.reset();for(var d=this.QC,f=c.count,h=!0,k=e=0,l=u.hb(),m=0;m<f+b.vertexes.count+2;m++){l[m]=null}f=0;c.reset();for(var n=u.Tf();c.next();){if(m=c.value,this.mg(m,n),h){h=!1,e=n.x+n.width/2,k=n.y+n.height/2,l[0]=new w(n.x+n.width+d.width,n.y),l[1]=new w(n.x,n.y+n.height+d.height),f=2}else{var p=yp(l,f,e,k,n.width,n.height,d),q=l[p],r=new w(q.x+n.width+d.width,q.y),s=new w(q.x,q.y+n.height+d.height);p+1<f&&l.splice(p+1,0,null);l[p]=r;l[p+1]=s;f++;p=q.x-n.x;q=q.y-n.y;for(m=m.vertexes.i;m.next();){r=m.value,r.ma+=p,r.ya+=q}}}u.ic(n);for(m=b.vertexes.i;m.next();){h=m.value,n=h.mb,2>f?(e=n.x+n.width/2,k=n.y+n.height/2,l[0]=new w(n.x+n.width+d.width,n.y),l[1]=new w(n.x,n.y+n.height+d.height),f=2):(p=yp(l,f,e,k,n.width,n.height,d),q=l[p],r=new w(q.x+n.width+d.width,q.y),s=new w(q.x,q.y+n.height+d.height),p+1<f&&l.splice(p+1,0,null),l[p]=r,l[p+1]=s,f++,h.ma=q.x+h.width/2,h.ya=q.y+h.height/2) + }u.sa(l);for(c.reset();c.next();){d=c.value;for(e=d.vertexes.i;e.next();){b.Mk(e.value)}for(d=d.edges.i;d.next();){b.mo(d.value)}}}zp(this,a);this.updateParts()}this.Qn=a;this.network=null;this.wf=!0};vp.prototype.needsClusterLayout=function(){if(3>this.network.vertexes.count){return !1}for(var a=0,b=0,c=this.network.vertexes.first().mb,d=this.network.vertexes.i;d.next();){if(d.value.mb.ug(c)&&(a++,2<a)){return !0}if(10<b){break}b++}return !1};vp.prototype.mg=function(a,b){for(var c=!0,d=a.vertexes.i;d.next();){var e=d.value;c?(c=!1,b.set(e.mb)):b.Uh(e.mb)}return b};function xp(a,b,c){if(Ap(a,b)){var d=a.Ah;a.Ah*=1+1/(b+1);var e=Bp(a,b),f=Math.max(0,Math.max(Math.min(a.network.vertexes.count,c*(b+1)/11),10));a.Bz+=f;xp(a,b+1,c);zp(a,f);Cp(a,e);b=a.kg;null===b?b=new E(Dp):b.clear();b.Ud(e.vertexes);b.sort(function(a,b){return null===a||null===b||a===b?0:b.Pf-a.Pf});for(e=b.i;e.next();){Ep(a,e.value)}a.Ah=d}}function Ap(a,b){if(10<b||3>a.network.vertexes.count){return !1}null===a.kg?a.kg=new E(Dp):a.kg.clear();a.kg.Ud(a.network.vertexes);var c=a.kg;c.sort(function(a,b){return null===a||null===b||a===b?0:b.Pf-a.Pf});for(var d=c.count-1;0<=d&&1>=c.ja(d).Pf;){d--}return 1<c.count-d}function Bp(a,b){for(var c=a.network,d=new wp,e=a.kg.i;e.next();){var f=e.value;if(1<f.Pf){d.Mk(f);var h=new Fp;h.Uw=f.Pf;h.Xw=f.width;h.Tw=f.height;h.rA=f.M.x;h.sA=f.M.y;null===f.jh&&(f.jh=new E(Fp));f.jh.add(h);f.Zz=f.jh.count-1}else{break}}for(var k=c.edges.i;k.next();){if(e=k.value,e.fromVertex.network===d&&e.toVertex.network===d){d.mo(e)}else{if(e.fromVertex.network===d){var l=e.fromVertex.vm;null===l&&(l=new E(Dp),e.fromVertex.vm=l);l.add(e.toVertex);e.fromVertex.Pf--;e.fromVertex.Rj+=e.toVertex.Rj}else{e.toVertex.network===d&&(l=e.toVertex.vm,null===l&&(l=new E(Dp),e.toVertex.vm=l),l.add(e.fromVertex),e.toVertex.Pf--,e.toVertex.Rj+=e.fromVertex.Rj)}}}for(e=d.edges.i;e.next();){f=e.value,f.length*=Math.max(1,K.sqrt((f.fromVertex.Rj+f.toVertex.Rj)/(4*b+1)))}for(e=d.vertexes.i;e.next();){if(f=e.value,l=f.vm,null!==l&&0<l.count&&(h=f.jh.ja(f.jh.count-1),h=h.Uw-f.Pf,!(0>=h))){for(var m=0,n=0,p=l.count-h;p<l.count;p++){for(var q=l.ja(p),r=null,k=q.edges.i;k.next();){var s=k.value;if(s.HG(q)===f){r=s;break}}null!==r&&(n+=r.length,m+=q.width*q.height)}l=f.ma;k=f.ya;p=f.width;q=f.height;r=f.M;s=p*q;1>s&&(s=1);m=K.sqrt((m+s+n*n*4/(h*h))/s);h=(m-1)*p/2;m=(m-1)*q/2;f.mb=new z(l-r.x-h,k-r.y-m,p+2*h,q+2*m);f.focus=new w(r.x+h,r.y+m)}}a.network=d;return c}function Cp(a,b){for(var c=a.network.vertexes.i;c.next();){var d=c.value;d.network=b;if(null!==d.jh){var e=d.jh.ja(d.Zz);d.Pf=e.Uw;var f=e.rA,h=e.sA;d.mb=new z(d.ma-f,d.ya-h,e.Xw,e.Tw);d.focus=new w(f,h);d.Zz--}}for(c=a.network.edges.i;c.next();){c.value.network=b}a.network=b}function Ep(a,b){var c=b.vm;if(null!==c&&0!==c.count){var d=b.ma,e=b.ya,f=b.width,h=b.height;null!==b.jh&&0<b.jh.count&&(h=b.jh.ja(0),f=h.Xw,h=h.Tw);for(var f=K.sqrt(f*f+h*h)/2,k=!1,l=h=0,m=0,n=b.vertexes.i;n.next();){var p=n.value;1>=p.Pf?l++:(k=!0,m++,h+=Math.atan2(b.ya-p.ya,b.ma-p.ma))}if(0!==l){for(0<m&&(h/=m),n=m=0,m=k?2*Math.PI/(l+1):2*Math.PI/l,0===l%2&&(n=m/2),1<c.count&&c.sort(function(a,b){return null===a||null===b||a===b?0:b.width*b.height-a.width*a.height}),k=0===l%2?0:1,c=c.i;c.next();){if(l=c.value,!(1<l.Pf||a.isFixed(l))){for(var p=null,q=l.edges.i;q.next();){p=q.value;break}var q=l.width,r=l.height,q=K.sqrt(q*q+r*r)/2,p=f+p.length+q,q=h+(m*(k/2>>1)+n)*(0===k%2?1:-1);l.ma=d+p*Math.cos(q);l.ya=e+p*Math.sin(q);k++}}}}}function yp(a,b,c,d,e,f,h){var k=90000000000000000000,l=-1,m=0;a:for(;m<b;m++){var n=a[m],p=n.x-c,q=n.y-d,p=p*p+q*q;if(p<k){for(q=m-1;0<=q;q--){if(a[q].y>n.y&&a[q].x-n.x<e+h.width){continue a}}for(q=m+1;q<b;q++){if(a[q].x>n.x&&a[q].y-n.y<f+h.height){continue a}}l=m;k=p}}return l}vp.prototype.Py=function(){if(this.comments){for(var a=this.network.vertexes.i;a.next();){this.addComments(a.value)}}};vp.prototype.addComments=function(a){var b=a.Bc;if(null!==b){for(b=b.sD();b.next();){var c=b.value;if("Comment"===c.Jc&&c.Ia()){var d=this.network.Em(c);null===d&&(d=this.network.fs(c));d.charge=this.mG;for(var c=null,e=d.cc;e.next();){var f=e.value;if(f.toVertex===a){c=f;break}}if(null===c){for(e=d.kc;e.next();){if(f=e.value,f.fromVertex===a){c=f;break}}}null===c&&(c=this.network.Po(a,d,null));c.length=this.nG}}}};function Gp(a,b){var c=a.aa,d=c.x,e=c.y,f=c.width,c=c.height,h=b.aa,k=h.x,l=h.y,m=h.width,h=h.height;return d+f<k?e>l+h?(d=d+f-k,e=e-l-h,K.sqrt(d*d+e*e)):e+c<l?(d=d+f-k,e=e+c-l,K.sqrt(d*d+e*e)):k-(d+f):d>k+m?e>l+h?(d=d-k-m,e=e-l-h,K.sqrt(d*d+e*e)):e+c<l?(d=d-k-m,e=e+c-l,K.sqrt(d*d+e*e)):d-(k+m):e>l+h?e-(l+h):e+c<l?l-(e+c):0.1}function zp(a,b){a.kg=null;for(var c=a.xq+b;a.xq<c&&(a.xq++,Hp(a));){}a.kg=null}function Hp(a){null===a.kg&&(a.kg=new E(Dp),a.kg.Ud(a.network.vertexes));var b=a.kg.n;if(0>=b.length){return !1}var c=b[0];c.forceX=0;c.forceY=0;for(var d=c.ma,e=d,f=c.ya,h=f,c=1;c<b.length;c++){var k=b[c];k.forceX=0;k.forceY=0;var l=k.ma,k=k.ya,d=Math.min(d,l),e=Math.max(e,l),f=Math.min(f,k),h=Math.max(h,k) + }(f=e-d>h-f)?b.sort(function(a,b){return null===a||null===b||a===b?0:a.ma-b.ma}):b.sort(function(a,b){return null===a||null===b||a===b?0:a.ya-b.ya});for(var h=a.Ah,m=0,n=0,p=0,c=0;c<b.length;c++){var k=b[c],l=k.aa,q=k.M,d=l.x+q.x,l=l.y+q.y,n=k.charge*a.electricalFieldX(d,l),p=k.charge*a.electricalFieldY(d,l),n=n+k.mass*a.gravitationalFieldX(d,l),p=p+k.mass*a.gravitationalFieldY(d,l);k.forceX+=n;k.forceY+=p;for(q=c+1;q<b.length;q++){if(e=b[q],e!==k){var r=e.aa,n=e.M,p=r.x+n.x,r=r.y+n.y;if(d-p>h||p-d>h){if(f){break}}else{if(l-r>h||r-l>h){if(!f){break}}else{var s=Gp(k,e);1>s?(n=a.zw,null===n&&(a.zw=n=new Fa(0)),m=n.random(),s=n.random(),d>p?(n=Math.abs(e.aa.right-k.aa.x),n=(1+n)*m):d<p?(n=Math.abs(e.aa.x-k.aa.right),n=-(1+n)*m):(n=Math.max(e.width,k.width),n=(1+n)*m-n/2),l>r?(p=Math.abs(e.aa.bottom-k.aa.y),p=(1+p)*s):d<p?(p=Math.abs(e.aa.y-k.aa.bottom),p=-(1+p)*s):(p=Math.max(e.height,k.height),p=(1+p)*s-p/2)):(m=-(k.charge*e.charge)/(s*s),n=(p-d)/s*m,p=(r-l)/s*m);k.forceX+=n;k.forceY+=p;e.forceX-=n;e.forceY-=p}}}}}for(c=a.network.edges.i;c.next();){f=c.value,k=f.fromVertex,e=f.toVertex,l=k.aa,q=k.M,d=l.x+q.x,l=l.y+q.y,r=e.aa,n=e.M,p=r.x+n.x,r=r.y+n.y,s=Gp(k,e),1>s?(n=a.zw,null===n&&(a.zw=n=new Fa(0)),m=n.random(),s=n.random(),n=(d>p?1:-1)*(1+(e.width>k.width)?e.width:k.width)*m,p=(l>r?1:-1)*(1+(e.height>k.height)?e.height:k.height)*s):(m=f.stiffness*(s-f.length),n=(p-d)/s*m,p=(r-l)/s*m),k.forceX+=n,k.forceY+=p,e.forceX-=n,e.forceY-=p}c=0;d=Math.max(a.Ah/20,50);for(e=0;e<b.length;e++){k=b[e],a.isFixed(k)?a.moveFixedVertex(k):(f=k.forceX,h=k.forceY,f<-d?f=-d:f>d&&(f=d),h<-d?h=-d:h>d&&(h=d),k.ma+=f,k.ya+=h,c=Math.max(c,f*f+h*h))}return c>a.pD*a.pD}vp.prototype.moveFixedVertex=function(){};vp.prototype.commitLayout=function(){this.dA();this.commitNodes();this.Rs&&this.commitLinks()};vp.prototype.dA=function(){if(this.hp){for(var a=this.network.edges.i;a.next();){var b=a.value.link;null!==b&&(b.vb=uc,b.xb=uc)}}};vp.prototype.commitNodes=function(){var a=0,b=0;if(this.QF){var c=u.Tf();this.mg(this.network,c);b=this.Vd;a=b.x-c.x;b=b.y-c.y;u.ic(c)}for(var c=u.Tf(),d=this.network.vertexes.i;d.next();){var e=d.value;if(0!==a||0!==b){c.assign(e.mb),c.x+=a,c.y+=b,e.mb=c}e.commit()}u.ic(c)};vp.prototype.commitLinks=function(){for(var a=this.network.edges.i;a.next();){a.value.commit()}};vp.prototype.springStiffness=function(a){a=a.stiffness;return isNaN(a)?this.on:a};vp.prototype.springLength=function(a){a=a.length;return isNaN(a)?this.nn:a};vp.prototype.electricalCharge=function(a){a=a.charge;return isNaN(a)?this.kn:a};vp.prototype.electricalFieldX=function(){return 0};vp.prototype.electricalFieldY=function(){return 0};vp.prototype.gravitationalMass=function(a){a=a.mass;return isNaN(a)?this.mn:a};vp.prototype.gravitationalFieldX=function(){return 0};vp.prototype.gravitationalFieldY=function(){return 0};vp.prototype.isFixed=function(a){return a.isFixed};u.u(vp,{kJ:"currentIteration"},function(){return this.xq});u.defineProperty(vp,{QC:"arrangementSpacing"},function(){return this.Vf},function(a){u.C(a,ia,vp,"arrangementSpacing");this.Vf.L(a)||(this.Vf.assign(a),this.H())});u.defineProperty(vp,{QF:"arrangesToOrigin"},function(){return this.zp},function(a){this.zp!==a&&(u.j(a,"boolean",vp,"arrangesToOrigin"),this.zp=a,this.H())});u.defineProperty(vp,{hp:"setsPortSpots"},function(){return this.Gh},function(a){this.Gh!==a&&(u.j(a,"boolean",vp,"setsPortSpots"),this.Gh=a,this.H())});u.defineProperty(vp,{comments:"comments"},function(){return this.qh},function(a){this.qh!==a&&(u.j(a,"boolean",vp,"comments"),this.qh=a,this.H())});u.defineProperty(vp,{Bz:"maxIterations"},function(){return this.Qn},function(a){this.Qn!==a&&(u.j(a,"number",vp,"maxIterations"),0<=a&&(this.Qn=a,this.H()))});u.defineProperty(vp,{pD:"epsilonDistance"},function(){return this.Wp},function(a){this.Wp!==a&&(u.j(a,"number",vp,"epsilonDistance"),0<a&&(this.Wp=a,this.H()))});u.defineProperty(vp,{EJ:"infinityDistance"},function(){return this.Ah},function(a){this.Ah!==a&&(u.j(a,"number",vp,"infinityDistance"),1<a&&(this.Ah=a,this.H()))});u.defineProperty(vp,{zw:"randomNumberGenerator"},function(){return this.or},function(a){this.or!==a&&(null!==a&&"function"!==typeof a.random&&u.k('ForceDirectedLayout.randomNumberGenerator must have a "random()" function on it: '+a),this.or=a)});u.defineProperty(vp,{xJ:"defaultSpringStiffness"},function(){return this.on},function(a){this.on!==a&&(u.j(a,"number",vp,"defaultSpringStiffness"),this.on=a,this.H())});u.defineProperty(vp,{wJ:"defaultSpringLength"},function(){return this.nn},function(a){this.nn!==a&&(u.j(a,"number",vp,"defaultSpringLength"),this.nn=a,this.H())});u.defineProperty(vp,{qJ:"defaultElectricalCharge"},function(){return this.kn},function(a){this.kn!==a&&(u.j(a,"number",vp,"defaultElectricalCharge"),this.kn=a,this.H())});u.defineProperty(vp,{rJ:"defaultGravitationalMass"},function(){return this.mn},function(a){this.mn!==a&&(u.j(a,"number",vp,"defaultGravitationalMass"),this.mn=a,this.H())});u.defineProperty(vp,{nG:"defaultCommentSpringLength"},function(){return this.Qp + },function(a){this.Qp!==a&&(u.j(a,"number",vp,"defaultCommentSpringLength"),this.Qp=a,this.H())});u.defineProperty(vp,{mG:"defaultCommentElectricalCharge"},function(){return this.Pp},function(a){this.Pp!==a&&(u.j(a,"number",vp,"defaultCommentElectricalCharge"),this.Pp=a,this.H())});function Fp(){this.sA=this.rA=this.Tw=this.Xw=this.Uw=0}function wp(){xa.call(this)}u.Ha(wp,xa);u.fa("ForceDirectedNetwork",wp);wp.prototype.createVertex=function(){return new Dp};wp.prototype.createEdge=function(){return new Ip};function Dp(){ya.call(this);this.isFixed=!1;this.mass=this.charge=NaN;this.Rj=this.Pf=this.forceY=this.forceX=0;this.jh=this.vm=null;this.Zz=0}u.Ha(Dp,ya);u.fa("ForceDirectedVertex",Dp);function Ip(){Aa.call(this);this.length=this.stiffness=NaN}u.Ha(Ip,Aa);u.fa("ForceDirectedEdge",Ip);function Yl(){0<arguments.length&&u.Xc(Yl);Je.call(this);this.ud=this.Ul=25;this.la=0;this.jn=Op;this.On=Sp;this.Dn=Tp;this.Rl=4;this.Zm=Up;this.pi=Vp;this.Gh=!0;this.gj=4;this.Hb=this.Hu=this.lb=-1;this.Df=this.Pq=0;this.Lb=this.Cf=this.bg=this.Ng=this.Md=null;this.Wq=0;this.Vq=this.Wl=null;this.eg=0;this.Xq=null;this.Pg=[];this.Pg.length=100}u.Ha(Yl,Je);u.fa("LayeredDigraphLayout",Yl);Yl.prototype.cloneProtected=function(a){Je.prototype.cloneProtected.call(this,a);a.Ul=this.Ul;a.ud=this.ud;a.la=this.la;a.jn=this.jn;a.On=this.On;a.Dn=this.Dn;a.Rl=this.Rl;a.Zm=this.Zm;a.pi=this.pi;a.Gh=this.Gh;a.gj=this.gj};Yl.prototype.createNetwork=function(){return new Wp};Yl.prototype.doLayout=function(a){null===a&&u.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts");null===this.network&&(this.network=this.makeNetwork(a));this.Vd=this.initialOrigin(this.Vd);this.Hu=-1;this.Df=this.Pq=0;this.Xq=this.Vq=this.Wl=null;for(a=0;a<this.Pg.length;a++){this.Pg[a]=null}if(0<this.network.vertexes.count){this.network.Qv();for(a=this.network.edges.i;a.next();){a.value.rev=!1}switch(this.jn){default:case Xp:var b=0,c=this.network.vertexes.count-1;a=[];a.length=c+1;for(var d=this.network.vertexes.i;d.next();){d.value.valid=!0}for(;null!==Yp(this.network);){for(d=Zp(this.network);null!==d;){a[c]=d,c--,d.valid=!1,d=Zp(this.network)}for(d=$p(this.network);null!==d;){a[b]=d,b++,d.valid=!1,d=$p(this.network)}for(var d=null,e=0,f=this.network.vertexes.i;f.next();){var h=f.value;if(h.valid){for(var k=0,l=h.cc;l.next();){l.value.toVertex.valid&&k++}for(var l=0,m=h.kc;m.next();){m.value.fromVertex.valid&&l++}if(null===d||e<k-l){d=h,e=k-l}}}null!==d&&(a[b]=d,b++,d.valid=!1)}for(b=0;b<this.network.vertexes.count;b++){a[b].index=b}for(a=this.network.edges.i;a.next();){b=a.value,b.fromVertex.index>b.toVertex.index&&(this.network.Aw(b),b.rev=!0)}break;case Op:for(b=this.network.vertexes.i;b.next();){a=b.value,a.yo=-1,a.finish=-1}for(a=this.network.edges.i;a.next();){a.value.forest=!1}this.Wq=0;for(b.reset();b.next();){c=b.value,0===c.kc.count&&aq(this,c)}for(b.reset();b.next();){c=b.value,-1===c.yo&&aq(this,c)}for(a.reset();a.next();){b=a.value,b.forest||(c=b.fromVertex,d=c.finish,e=b.toVertex,f=e.finish,e.yo<c.yo&&d<f&&(this.network.Aw(b),b.rev=!0))}}for(a=this.network.vertexes.i;a.next();){a.value.layer=-1}this.lb=-1;this.assignLayers();for(a.reset();a.next();){this.lb=Math.max(this.lb,a.value.layer)}a=[];for(c=this.network.edges.i;c.next();){b=c.value,b.valid=!1,a.push(b)}for(c=0;c<a.length;c++){if(b=a[c],!b.valid&&(null!==b.fromVertex.md&&null!==b.toVertex.md||b.fromVertex.layer!==b.toVertex.layer)){l=h=k=f=0;e=b.fromVertex;d=b.toVertex;if(null!==b.link){k=b.link;if(null===k){continue}var n=e.md,f=d.md;if(null===n||null===f){continue}var p=k.V,h=k.ba,q=k.qd,l=k.ge;b.rev&&(k=p,m=q,p=h,q=l,h=k,l=m);var r=e.M,k=b.toVertex.M,s=b.rev?d.aa:e.aa,m=u.K();s.I()?(On(p,q,Ib,m),m.I()||m.assign(r)):m.assign(r);n!==p&&s.I()&&p.Ia()&&(n=e.aa,n.I()&&(m.x+=s.x-n.x,m.y+=s.y-n.y));p=b.rev?e.aa:d.aa;n=u.K();p.I()?(On(h,l,Ib,n),n.I()||n.assign(k)):n.assign(k);f!==h&&p.I()&&h.Ia()&&(f=d.aa,f.I()&&(n.x+=p.x-f.x,n.y+=p.y-f.y));90===this.la||270===this.la?(f=Math.round((m.x-r.x)/this.ud),h=m.x,k=Math.round((n.x-k.x)/this.ud),l=n.x):(f=Math.round((m.y-r.y)/this.ud),h=m.y,k=Math.round((n.y-k.y)/this.ud),l=n.y);u.v(m);u.v(n);b.portFromColOffset=f;b.portFromPos=h;b.portToColOffset=k;b.portToPos=l}else{b.portFromColOffset=0,b.portFromPos=0,b.portToColOffset=0,b.portToPos=0}m=e.layer;r=d.layer;n=b;p=0;s=n.link;if(null!==s){var t=s.qd,v=s.ge;if(null!==t&&null!==v){var x=s.V,q=s.ba;if(null!==x&&null!==q){var A=t.vb,y=v.xb;this.hp||(s.vb.Kc()||(A=s.vb),s.xb.Kc()||(y=s.xb));if(A.Kc()||A===vb){A=bq(this,!0)}if(y.Kc()||y===vb){y=bq(this,!1)}var C=s.ec,I=s.getLinkPoint(x,t,A,!0,C,q,v,u.K()),A=s.getLinkDirection(x,t,I,A,!0,C,q,v);u.v(I);A===cq(this,n,!0)?p+=1:this.hp&&null!==x&&1===x.ports.count&&n.rev&&(p+=1);I=s.getLinkPoint(q,v,y,!1,C,x,t,u.K());s=s.getLinkDirection(q,v,I,y,!1,C,x,t);u.v(I);s===cq(this,n,!1)?p+=2:this.hp&&null!==q&&1===q.ports.count&&n.rev&&(p+=2)}}}n=1===p||3===p?!0:!1;if(p=2===p||3===p?!0:!1){q=this.network.createVertex(),q.md=null,q.sm=1,q.layer=m,q.near=e,this.network.Mk(q),e=this.network.Po(e,q,b.link),e.valid=!1,e.rev=b.rev,e.portFromColOffset=f,e.portToColOffset=0,e.portFromPos=h,e.portToPos=0,e=q + }s=1;n&&s--;if(m-r>s&&0<m){b.valid=!1;q=this.network.createVertex();q.md=null;q.sm=2;q.layer=m-1;this.network.Mk(q);e=this.network.Po(e,q,b.link);e.valid=!0;e.rev=b.rev;e.portFromColOffset=p?0:f;e.portToColOffset=0;e.portFromPos=p?0:h;e.portToPos=0;e=q;for(m--;m-r>s&&0<m;){q=this.network.createVertex(),q.md=null,q.sm=3,q.layer=m-1,this.network.Mk(q),e=this.network.Po(e,q,b.link),e.valid=!0,e.rev=b.rev,e.portFromColOffset=0,e.portToColOffset=0,e.portFromPos=0,e.portToPos=0,e=q,m--}e=this.network.Po(q,d,b.link);e.valid=!n;n&&(q.near=d);e.rev=b.rev;e.portFromColOffset=0;e.portToColOffset=k;e.portFromPos=0;e.portToPos=l}else{b.valid=!0}}}b=this.Md=[];for(c=0;c<=this.lb;c++){b[c]=0}for(a=this.network.vertexes.i;a.next();){c=a.value,c.index=-1}this.initializeIndices();this.Hu=-1;for(c=this.Df=this.Pq=0;c<=this.lb;c++){b[c]>b[this.Df]&&(this.Hu=b[c]-1,this.Df=c),b[c]<b[this.Pq]&&(this.Pq=c)}this.Xq=[];for(c=0;c<b.length;c++){this.Xq[c]=[]}for(a.reset();a.next();){b=a.value,c=this.Xq[b.layer],c[b.index]=b}this.Hb=-1;for(a=0;a<=this.lb;a++){b=dq(this,a);c=0;d=this.Md[a];for(e=0;e<d;e++){f=b[e],c+=this.nodeMinColumnSpace(f,!0),f.column=c,c+=1,c+=this.nodeMinColumnSpace(f,!1)}this.Hb=Math.max(this.Hb,c-1);eq(this,a,b)}this.reduceCrossings();this.straightenAndPack();this.updateParts()}this.network=null;this.wf=!0};Yl.prototype.linkMinLength=function(a){var b=a.toVertex,c=0;for(a=a.fromVertex.cc;a.next();){a.value.toVertex===b&&c++}return 1<c?2:1};function fq(a){var b=a.fromVertex.md;a=a.toVertex.md;return null===b&&null===a?8:null===b||null===a?4:1}Yl.prototype.nodeMinLayerSpace=function(a,b){return null===a.md?0:90===this.la||270===this.la?b?a.M.y+10:a.aa.height-a.M.y+10:b?a.M.x+10:a.aa.width-a.M.x+10};Yl.prototype.nodeMinColumnSpace=function(a,b){if(null===a.md){return 0}var c=b?a.Jz:a.Iz;if(null!==c){return c}c=this.la;return 90===c||270===c?b?a.Jz=a.M.x/this.ud+1|0:a.Iz=(a.aa.width-a.M.x)/this.ud+1|0:b?a.Jz=a.M.y/this.ud+1|0:a.Iz=(a.aa.height-a.M.y)/this.ud+1|0};function gq(a){null===a.Wl&&(a.Wl=[]);for(var b=0,c=a.network.vertexes.i;c.next();){var d=c.value;a.Wl[b]=d.layer;b++;a.Wl[b]=d.column;b++;a.Wl[b]=d.index;b++}return a.Wl}function hq(a,b){for(var c=0,d=a.network.vertexes.i;d.next();){var e=d.value;e.layer=b[c];c++;e.column=b[c];c++;e.index=b[c];c++}}function iq(a,b,c){var d=dq(a,b),e=a.Md[b];if(null===a.Vq||a.Vq.length<e*e){a.Vq=[]}for(var f=a.Vq,h=0;h<e;h++){var k=0,l=d[h],m=l.near,n=0;if(null!==m&&m.layer===l.layer){if(n=m.index,n>h){for(var p=h+1;p<n;p++){l=d[p],l.near===m&&l.sm===m.sm||k++}}else{for(p=h-1;p>n;p--){l=d[p],l.near===m&&l.sm===m.sm||k++}}}var m=0,q,r=q=p=l=0,s,t=0,v=0;s=0;var x;if(0<=c){for(n=d[h].Je,m=0;m<n.count;m++){if(q=n.n[m],q.valid&&q.fromVertex.layer!==b){for(l=q.fromVertex.index,p=q.portToPos,q=q.portFromPos,r=m+1;r<n.count;r++){s=n.n[r],s.valid&&s.fromVertex.layer!==b&&(t=s.fromVertex.index,v=s.portToPos,s=s.portFromPos,p<v&&(l>t||l===t&&q>s)&&k++,v<p&&(t>l||t===l&&s>q)&&k++)}}}}if(0>=c){for(n=d[h].Ee,m=0;m<n.count;m++){if(q=n.n[m],q.valid&&q.toVertex.layer!==b){for(l=q.toVertex.index,p=q.portToPos,q=q.portFromPos,r=m+1;r<n.count;r++){s=n.n[r],s.valid&&s.toVertex.layer!==b&&(t=s.toVertex.index,v=s.portToPos,s=s.portFromPos,q<s&&(l>t||l===t&&p>v)&&k++,s<q&&(t>l||t===l&&v>p)&&k++)}}}}f[h*e+h]=k;for(n=h+1;n<e;n++){var A=0,y=0;if(0<=c){for(k=d[h].Je,x=d[n].Je,m=0;m<k.count;m++){if(q=k.n[m],q.valid&&q.fromVertex.layer!==b){for(l=q.fromVertex.index,q=q.portFromPos,r=0;r<x.count;r++){s=x.n[r],s.valid&&s.fromVertex.layer!==b&&(t=s.fromVertex.index,s=s.portFromPos,(l<t||l===t&&q<s)&&y++,(t<l||t===l&&s<q)&&A++)}}}}if(0>=c){for(k=d[h].Ee,x=d[n].Ee,m=0;m<k.count;m++){if(q=k.n[m],q.valid&&q.toVertex.layer!==b){for(l=q.toVertex.index,p=q.portToPos,r=0;r<x.count;r++){s=x.n[r],s.valid&&s.toVertex.layer!==b&&(t=s.toVertex.index,v=s.portToPos,(l<t||l===t&&p<v)&&y++,(t<l||t===l&&v<p)&&A++)}}}}f[h*e+n]=A;f[n*e+h]=y}}eq(a,b,d);return f}Yl.prototype.countCrossings=function(){for(var a=0,b=0;b<=this.lb;b++){for(var c=iq(this,b,1),d=this.Md[b],e=0;e<d;e++){for(var f=e;f<d;f++){a+=c[e*d+f]}}}return a};function jq(a){for(var b=0,c=0;c<=a.lb;c++){for(var d=a,e=c,f=dq(d,e),h=d.Md[e],k=0,l=0;l<h;l++){var m=null,m=f[l].Ee,n,p=0,q=0;if(null!==m){for(var r=0;r<m.count;r++){n=m.n[r],n.valid&&n.toVertex.layer!==e&&(p=n.fromVertex.column+n.portFromColOffset,q=n.toVertex.column+n.portToColOffset,k+=(Math.abs(p-q)+1)*fq(n))}}}eq(d,e,f);b+=k}return b}Yl.prototype.normalize=function(){var a=Infinity;this.Hb=-1;for(var b=this.network.vertexes.i;b.next();){var c=b.value,a=Math.min(a,c.column-this.nodeMinColumnSpace(c,!0));this.Hb=Math.max(this.Hb,c.column+this.nodeMinColumnSpace(c,!1))}for(b.reset();b.next();){b.value.column-=a}this.Hb-=a};function kq(a,b,c){for(var d=dq(a,b),e=a.Md[b],f=[],h=0;h<e;h++){var k=d[h],l=null;0>=c&&(l=k.Je);var m=null;0<=c&&(m=k.Ee);var n=0,p=0,q=k.near;null!==q&&q.layer===k.layer&&(n+=q.column-1,p++);if(null!==l){for(q=0;q<l.count;q++){var k=l.n[q],r=k.fromVertex;k.valid&&!k.rev&&r.layer!==b&&(n+=r.column+k.portFromColOffset,p++) + }}if(null!==m){for(l=0;l<m.count;l++){k=m.n[l],q=k.toVertex,k.valid&&!k.rev&&q.layer!==b&&(n+=q.column+k.portToColOffset,p++)}}f[h]=0===p?-1:n/p}eq(a,b,d);return f}function lq(a,b,c){for(var d=dq(a,b),e=a.Md[b],f=[],h=0;h<e;h++){var k=d[h],l=null;0>=c&&(l=k.Je);var m=null;0<=c&&(m=k.Ee);var n=0,p=[],q=k.near;null!==q&&q.layer===k.layer&&(p[n]=q.column-1,n++);if(null!==l){for(q=0;q<l.count;q++){var k=l.n[q],r=k.fromVertex;k.valid&&!k.rev&&r.layer!==b&&(p[n]=r.column+k.portFromColOffset,n++)}}if(null!==m){for(l=0;l<m.count;l++){k=m.n[l],q=k.toVertex,k.valid&&!k.rev&&q.layer!==b&&(p[n]=q.column+k.portToColOffset,n++)}}0===n?f[h]=-1:(p.sort(function(a,b){return a-b}),m=n>>1,f[h]=n&1?p[m]:p[m-1]+p[m]>>1)}eq(a,b,d);return f}function mq(a,b,c,d,e,f){if(b.component===d){b.component=c;var h=0,k=0;if(e){for(var l=b.cc;l.next();){var k=l.value,m=k.toVertex,h=b.layer-m.layer,k=a.linkMinLength(k);h===k&&mq(a,m,c,d,e,f)}}if(f){for(l=b.kc;l.next();){k=l.value,m=k.fromVertex,h=m.layer-b.layer,k=a.linkMinLength(k),h===k&&mq(a,m,c,d,e,f)}}}}function nq(a,b,c,d,e,f){if(b.component===d){b.component=c;if(e){for(var h=b.cc;h.next();){nq(a,h.value.toVertex,c,d,e,f)}}if(f){for(b=b.kc;b.next();){nq(a,b.value.fromVertex,c,d,e,f)}}}}function Yp(a){for(a=a.vertexes.i;a.next();){var b=a.value;if(b.valid){return b}}return null}function Zp(a){for(a=a.vertexes.i;a.next();){var b=a.value;if(b.valid){for(var c=!0,d=b.cc;d.next();){if(d.value.toVertex.valid){c=!1;break}}if(c){return b}}}return null}function $p(a){for(a=a.vertexes.i;a.next();){var b=a.value;if(b.valid){for(var c=!0,d=b.kc;d.next();){if(d.value.fromVertex.valid){c=!1;break}}if(c){return b}}}return null}function aq(a,b){b.yo=a.Wq;a.Wq++;for(var c=b.cc;c.next();){var d=c.value,e=d.toVertex;-1===e.yo&&(d.forest=!0,aq(a,e))}b.finish=a.Wq;a.Wq++}Yl.prototype.assignLayers=function(){switch(this.On){case oq:pq(this);break;case qq:for(var a=0,b=this.network.vertexes.i;b.next();){a=rq(this,b.value),this.lb=Math.max(a,this.lb)}for(b.reset();b.next();){a=b.value,a.layer=this.lb-a.layer}break;default:case Sp:pq(this);for(b=this.network.vertexes.i;b.next();){b.value.valid=!1}for(b.reset();b.next();){a=b.value,0===a.kc.count&&sq(this,a)}a=Infinity;for(b.reset();b.next();){a=Math.min(a,b.value.layer)}this.lb=-1;for(b.reset();b.next();){var c=b.value;c.layer-=a;this.lb=Math.max(this.lb,c.layer)}}};function pq(a){for(var b=a.network.vertexes.i;b.next();){var c=tq(a,b.value);a.lb=Math.max(c,a.lb)}}function tq(a,b){var c=0;if(-1===b.layer){for(var d=b.cc;d.next();){var e=d.value,f=e.toVertex,e=a.linkMinLength(e),c=Math.max(c,tq(a,f)+e)}b.layer=c}else{c=b.layer}return c}function rq(a,b){var c=0;if(-1===b.layer){for(var d=b.kc;d.next();){var e=d.value,f=e.fromVertex,e=a.linkMinLength(e),c=Math.max(c,rq(a,f)+e)}b.layer=c}else{c=b.layer}return c}function sq(a,b){if(!b.valid){b.valid=!0;for(var c=b.cc;c.next();){sq(a,c.value.toVertex)}for(c=a.network.vertexes.i;c.next();){c.value.component=-1}for(var d=b.Je.n,e=d.length,f=0;f<e;f++){var h=d[f],k=a.linkMinLength(h);h.fromVertex.layer-h.toVertex.layer>k&&mq(a,h.fromVertex,0,-1,!0,!1)}for(mq(a,b,1,-1,!0,!0);0!==b.component;){for(var k=0,d=Infinity,l=0,m=null,n=a.network.vertexes.i;n.next();){var p=n.value;if(1===p.component){for(var q=0,r=!1,s=p.Je.n,e=s.length,f=0;f<e;f++){var h=s[f],t=h.fromVertex,q=q+1;1!==t.component&&(k+=1,t=t.layer-p.layer,h=a.linkMinLength(h),d=Math.min(d,t-h))}h=p.Ee.n;e=h.length;for(f=0;f<e;f++){s=h[f].toVertex,q-=1,1!==s.component?k-=1:r=!0}(null===m||q<l)&&!r&&(m=p,l=q)}}if(0<k){for(c.reset();c.next();){e=c.value,1===e.component&&(e.layer+=d)}b.component=0}else{m.component=0}}for(c=a.network.vertexes.i;c.next();){c.value.component=-1}for(mq(a,b,1,-1,!0,!1);0!==b.component;){f=0;e=Infinity;d=0;k=null;for(l=a.network.vertexes.i;l.next();){if(m=l.value,1===m.component){n=0;p=!1;h=m.Je.n;q=h.length;for(r=0;r<q;r++){s=h[r].fromVertex,n+=1,1!==s.component?f+=1:p=!0}h=m.Ee.n;q=h.length;for(r=0;r<q;r++){s=h[r],t=s.toVertex,n-=1,1!==t.component&&(f-=1,t=m.layer-t.layer,s=a.linkMinLength(s),e=Math.min(e,t-s))}(null===k||n>d)&&!p&&(k=m,d=n)}}if(0>f){for(c.reset();c.next();){f=c.value,1===f.component&&(f.layer-=e)}b.component=0}else{k.component=0}}}}function cq(a,b,c){return 90===a.la?c&&!b.rev||!c&&b.rev?270:90:180===a.la?c&&!b.rev||!c&&b.rev?0:180:270===a.la?c&&!b.rev||!c&&b.rev?90:270:c&&!b.rev||!c&&b.rev?180:0}Yl.prototype.initializeIndices=function(){switch(this.Dn){default:case uq:for(var a=this.network.vertexes.i;a.next();){var b=a.value,c=b.layer;b.index=this.Md[c];this.Md[c]++}break;case Tp:a=this.network.vertexes.i;for(b=this.lb;0<=b;b--){for(a.reset();a.next();){c=a.value,c.layer===b&&-1===c.index&&vq(this,c)}}break;case wq:for(a=this.network.vertexes.i,b=0;b<=this.lb;b++){for(a.reset();a.next();){c=a.value,c.layer===b&&-1===c.index&&xq(this,c)}}}};function vq(a,b){var c=b.layer;b.index=a.Md[c];a.Md[c]++;for(var c=b.Ee.Le(),d=!0;d;){for(var d=!1,e=0;e<c.length-1;e++){var f=c[e],h=c[e+1];f.portFromColOffset>h.portFromColOffset&&(d=!0,c[e]=h,c[e+1]=f) + }}for(e=0;e<c.length;e++){d=c[e],d.valid&&(d=d.toVertex,-1===d.index&&vq(a,d))}}function xq(a,b){var c=b.layer;b.index=a.Md[c];a.Md[c]++;for(var c=b.Je.Le(),d=!0,e=0;d;){for(d=!1,e=0;e<c.length-1;e++){var f=c[e],h=c[e+1];f.portToColOffset>h.portToColOffset&&(d=!0,c[e]=h,c[e+1]=f)}}for(e=0;e<c.length;e++){d=c[e],d.valid&&(d=d.fromVertex,-1===d.index&&xq(a,d))}}Yl.prototype.reduceCrossings=function(){for(var a=this.countCrossings(),b=gq(this),c=0,d=0,e=0,c=0;c<this.Rl;c++){for(d=0;d<=this.lb;d++){yq(this,d,1),zq(this,d,1)}e=this.countCrossings();e<a&&(a=e,b=gq(this));for(d=this.lb;0<=d;d--){yq(this,d,-1),zq(this,d,-1)}e=this.countCrossings();e<a&&(a=e,b=gq(this))}hq(this,b);for(c=0;c<this.Rl;c++){for(d=0;d<=this.lb;d++){yq(this,d,0),zq(this,d,0)}e=this.countCrossings();e<a&&(a=e,b=gq(this));for(d=this.lb;0<=d;d--){yq(this,d,0),zq(this,d,0)}e=this.countCrossings();e<a&&(a=e,b=gq(this))}hq(this,b);var f=!1,h=c=0,k=0,d=0;switch(this.Zm){case Aq:break;case Bq:for(k=a+1;(d=this.countCrossings())<k;){for(k=d,c=this.lb;0<=c;c--){for(h=0;h<=c;h++){for(f=!0;f;){for(f=!1,d=c;d>=h;d--){f=zq(this,d,-1)||f}}e=this.countCrossings();e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;){for(f=!1,d=c;d>=h;d--){f=zq(this,d,1)||f}}e=this.countCrossings();e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;){for(f=!1,d=h;d<=c;d++){f=zq(this,d,1)||f}}e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;){for(f=!1,d=h;d<=c;d++){f=zq(this,d,-1)||f}}e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;){for(f=!1,d=c;d>=h;d--){f=zq(this,d,0)||f}}e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;){for(f=!1,d=h;d<=c;d++){f=zq(this,d,0)||f}}e>=a?hq(this,b):(a=e,b=gq(this))}}}break;default:case Up:for(c=this.lb,h=0,k=a+1;(d=this.countCrossings())<k;){k=d;for(f=!0;f;){for(f=!1,d=c;d>=h;d--){f=zq(this,d,-1)||f}}e=this.countCrossings();e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;){for(f=!1,d=c;d>=h;d--){f=zq(this,d,1)||f}}e=this.countCrossings();e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;){for(f=!1,d=h;d<=c;d++){f=zq(this,d,1)||f}}e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;){for(f=!1,d=h;d<=c;d++){f=zq(this,d,-1)||f}}e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;){for(f=!1,d=c;d>=h;d--){f=zq(this,d,0)||f}}e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;){for(f=!1,d=h;d<=c;d++){f=zq(this,d,0)||f}}e>=a?hq(this,b):(a=e,b=gq(this))}}hq(this,b)};function yq(a,b,c){var d=0,e=dq(a,b),f=a.Md[b],h=lq(a,b,c);c=kq(a,b,c);for(d=0;d<f;d++){-1===c[d]&&(c[d]=e[d].column),-1===h[d]&&(h[d]=e[d].column)}for(var k=!0,l;k;){for(k=!1,d=0;d<f-1;d++){if(h[d+1]<h[d]||h[d+1]===h[d]&&c[d+1]<c[d]){k=!0,l=h[d],h[d]=h[d+1],h[d+1]=l,l=c[d],c[d]=c[d+1],c[d+1]=l,l=e[d],e[d]=e[d+1],e[d+1]=l}}}for(d=h=0;d<f;d++){l=e[d],l.index=d,h+=a.nodeMinColumnSpace(l,!0),l.column=h,h+=1,h+=a.nodeMinColumnSpace(l,!1)}eq(a,b,e)}function zq(a,b,c){var d=dq(a,b),e=a.Md[b];c=iq(a,b,c);var f=0,h;h=[];for(f=0;f<e;f++){h[f]=-1}var k;k=[];for(f=0;f<e;f++){k[f]=-1}for(var l=!1,m=!0;m;){for(m=!1,f=0;f<e-1;f++){var n=c[d[f].index*e+d[f+1].index],p=c[d[f+1].index*e+d[f].index],q=0,r=0,s=d[f].column,t=d[f+1].column,v=a.nodeMinColumnSpace(d[f],!0),x=a.nodeMinColumnSpace(d[f],!1),A=a.nodeMinColumnSpace(d[f+1],!0),y=a.nodeMinColumnSpace(d[f+1],!1),v=s-v+A,x=t-x+y,A=A=0,C=d[f].kc.i;for(C.reset();C.next();){if(y=C.value,y.valid&&y.fromVertex.layer===b){y=y.fromVertex;for(A=0;d[A]!==y;){A++}A<f&&(q+=2*(f-A),r+=2*(f+1-A));A===f+1&&(q+=1);A>f+1&&(q+=4*(A-f),r+=4*(A-(f+1)))}}C=d[f].cc.i;for(C.reset();C.next();){if(y=C.value,y.valid&&y.toVertex.layer===b){y=y.toVertex;for(A=0;d[A]!==y;){A++}A===f+1&&(r+=1)}}C=d[f+1].kc.i;for(C.reset();C.next();){if(y=C.value,y.valid&&y.fromVertex.layer===b){y=y.fromVertex;for(A=0;d[A]!==y;){A++}A<f&&(q+=2*(f+1-A),r+=2*(f-A));A===f&&(r+=1);A>f+1&&(q+=4*(A-(f+1)),r+=4*(A-f))}}C=d[f+1].cc.i;for(C.reset();C.next();){if(y=C.value,y.valid&&y.toVertex.layer===b){y=y.toVertex;for(A=0;d[A]!==y;){A++}A===f&&(q+=1)}}var A=y=0,C=h[d[f].index],I=k[d[f].index],H=h[d[f+1].index],R=k[d[f+1].index];-1!==C&&(y+=Math.abs(C-s),A+=Math.abs(C-x));-1!==I&&(y+=Math.abs(I-s),A+=Math.abs(I-x));-1!==H&&(y+=Math.abs(H-t),A+=Math.abs(H-v));-1!==R&&(y+=Math.abs(R-t),A+=Math.abs(R-v));if(r<q-0.5||r===q&&p<n-0.5||r===q&&p===n&&A<y-0.5){m=l=!0,d[f].column=x,d[f+1].column=v,n=d[f],d[f]=d[f+1],d[f+1]=n}}}for(f=0;f<e;f++){d[f].index=f}eq(a,b,d);return l}Yl.prototype.straightenAndPack=function(){var a=0,b=!1,c=0!==(this.pi&Cq),a=this.pi===Vp;1000<this.network.edges.count&&!a&&(c=!1);if(c){b=[];for(a=a=0;a<=this.lb;a++){b[a]=0}for(var d=0,e=this.network.vertexes.i;e.next();){var f=e.value,a=f.layer,d=f.column,f=this.nodeMinColumnSpace(f,!1);b[a]=Math.max(b[a],d+f)}for(e.reset();e.next();){f=e.value,a=f.layer,d=f.column,f.column=(8*(this.Hb-b[a])>>1)+8*d}this.Hb*=8}if(0!==(this.pi&Dq)){for(b=!0;b;){b=!1;for(a=this.Df+1;a<=this.lb;a++){b=Eq(this,a,1)||b}for(a=this.Df-1;0<=a;a--){b=Eq(this,a,-1)||b}b=Eq(this,this.Df,0)||b}}if(0!==(this.pi&Fq)){for(a=this.Df+1;a<=this.lb;a++){Gq(this,a,1)}for(a=this.Df-1;0<=a;a--){Gq(this,a,-1)}Gq(this,this.Df,0)}c&&(Hq(this,-1),Hq(this,1)); + if(0!==(this.pi&Dq)){for(b=!0;b;){b=!1;b=Eq(this,this.Df,0)||b;for(a=this.Df+1;a<=this.lb;a++){b=Eq(this,a,0)||b}for(a=this.Df-1;0<=a;a--){b=Eq(this,a,0)||b}}}};function Eq(a,b,c){for(var d=!1;Iq(a,b,c);){d=!0}return d}function Iq(a,b,c){var d=0,e=dq(a,b),f=a.Md[b],h=kq(a,b,-1);if(0<c){for(d=0;d<f;d++){h[d]=-1}}var k=kq(a,b,1);if(0>c){for(d=0;d<f;d++){k[d]=-1}}for(var l=!1,m=!0;m;){for(m=!1,d=0;d<f;d++){var n=e[d].column,p=a.nodeMinColumnSpace(e[d],!0),q=a.nodeMinColumnSpace(e[d],!1),r=0,r=0>d-1||n-e[d-1].column-1>p+a.nodeMinColumnSpace(e[d-1],!1)?n-1:n,p=0,p=d+1>=f||e[d+1].column-n-1>q+a.nodeMinColumnSpace(e[d+1],!0)?n+1:n,s=q=0,t=0,v=0,x=0,A=0;if(0>=c){for(var y=e[d].kc.i;y.next();){var C=y.value;C.valid&&C.fromVertex.layer!==b&&(v=fq(C),x=C.portFromColOffset,A=C.portToColOffset,C=C.fromVertex.column,q+=(Math.abs(n+A-(C+x))+1)*v,s+=(Math.abs(r+A-(C+x))+1)*v,t+=(Math.abs(p+A-(C+x))+1)*v)}}if(0<=c){for(y=e[d].cc.i;y.next();){C=y.value,C.valid&&C.toVertex.layer!==b&&(v=fq(C),x=C.portFromColOffset,A=C.portToColOffset,C=C.toVertex.column,q+=(Math.abs(n+x-(C+A))+1)*v,s+=(Math.abs(r+x-(C+A))+1)*v,t+=(Math.abs(p+x-(C+A))+1)*v)}}A=x=v=0;y=h[e[d].index];C=k[e[d].index];-1!==y&&(v+=Math.abs(y-n),x+=Math.abs(y-r),A+=Math.abs(y-p));-1!==C&&(v+=Math.abs(C-n),x+=Math.abs(C-r),A+=Math.abs(C-p));if(s<q||s===q&&x<v){m=l=!0,e[d].column=r}if(t<q||t===q&&A<v){m=l=!0,e[d].column=p}}}eq(a,b,e);a.normalize();return l}function Gq(a,b,c){var d=0,e=dq(a,b),f=a.Md[b],h=lq(a,b,c);c=[];for(d=0;d<f;d++){c[d]=h[d]}for(h=!0;h;){for(h=!1,d=0;d<f;d++){var k=e[d].column,l=a.nodeMinColumnSpace(e[d],!0),m=a.nodeMinColumnSpace(e[d],!1),n=0,p=0,q=0,q=p=0;-1===c[d]?0===d&&d===f-1?n=k:0===d?(p=e[d+1].column,n=p-k===m+a.nodeMinColumnSpace(e[d+1],!0)?k-1:k):d===f-1?(q=e[d-1].column,n=k-q===l+a.nodeMinColumnSpace(e[d-1],!1)?k+1:k):(q=e[d-1].column,q=q+a.nodeMinColumnSpace(e[d-1],!1)+l+1,p=e[d+1].column,p=p-a.nodeMinColumnSpace(e[d+1],!0)-m-1,n=(q+p)/2|0):0===d&&d===f-1?n=c[d]:0===d?(p=e[d+1].column,p=p-a.nodeMinColumnSpace(e[d+1],!0)-m-1,n=Math.min(c[d],p)):d===f-1?(q=e[d-1].column,q=q+a.nodeMinColumnSpace(e[d-1],!1)+l+1,n=Math.max(c[d],q)):(q=e[d-1].column,q=q+a.nodeMinColumnSpace(e[d-1],!1)+l+1,p=e[d+1].column,p=p-a.nodeMinColumnSpace(e[d+1],!0)-m-1,q<c[d]&&c[d]<p?n=c[d]:q>=c[d]?n=q:p<=c[d]&&(n=p));n!==k&&(h=!0,e[d].column=n)}}eq(a,b,e);a.normalize()}function Jq(a,b){for(var c=!0,d=a.network.vertexes.i;d.next();){var e=d.value,f=a.nodeMinColumnSpace(e,!0),h=a.nodeMinColumnSpace(e,!1);if(e.column-f<=b&&e.column+h>=b){c=!1;break}}e=!1;if(c){for(d.reset();d.next();){c=d.value,c.column>b&&(c.column-=1,e=!0)}}return e}function Kq(a,b){for(var c=b,c=b+1,d=0,e=[],f=[],d=0;d<=a.lb;d++){e[d]=!1,f[d]=!1}for(var h=a.network.vertexes.i;h.next();){var d=h.value,k=d.column-a.nodeMinColumnSpace(d,!0),l=d.column+a.nodeMinColumnSpace(d,!1);k<=b&&l>=b&&(e[d.layer]=!0);k<=c&&l>=c&&(f[d.layer]=!0)}k=!0;c=!1;for(d=0;d<=a.lb;d++){k=k&&!(e[d]&&f[d])}if(k){for(h.reset();h.next();){e=h.value,e.column>b&&(e.column-=1,c=!0)}}return c}function Hq(a,b){for(var c=0;c<=a.Hb;c++){for(;Jq(a,c);){}}a.normalize();for(c=0;c<a.Hb;c++){for(;Kq(a,c);){}}a.normalize();var c=0,d,e=0,f=0,h=0;if(0<b){for(c=0;c<=a.Hb;c++){for(d=gq(a),e=jq(a),f=e+1;e<f;){f=e,Lq(a,c,1),h=jq(a),h>e?hq(a,d):h<e&&(e=h,d=gq(a))}}}if(0>b){for(c=a.Hb;0<=c;c--){for(d=gq(a),e=jq(a),f=e+1;e<f;){f=e,Lq(a,c,-1),h=jq(a),h>e?hq(a,d):h<e&&(e=h,d=gq(a))}}}a.normalize()}function Lq(a,b,c){a.eg=0;for(var d=a.network.vertexes.i;d.next();){d.value.component=-1}if(0<c){for(d.reset();d.next();){var e=d.value;e.column-a.nodeMinColumnSpace(e,!0)<=b&&(e.component=a.eg)}}if(0>c){for(d.reset();d.next();){e=d.value,e.column+a.nodeMinColumnSpace(e,!1)>=b&&(e.component=a.eg)}}a.eg++;for(d.reset();d.next();){b=d.value,-1===b.component&&(nq(a,b,a.eg,-1,!0,!0),a.eg++)}var f=0;b=[];for(f=0;f<a.eg*a.eg;f++){b[f]=!1}e=[];for(f=0;f<(a.lb+1)*(a.Hb+1);f++){e[f]=-1}for(d.reset();d.next();){for(var f=d.value,h=f.layer,k=Math.max(0,f.column-a.nodeMinColumnSpace(f,!0)),l=Math.min(a.Hb,f.column+a.nodeMinColumnSpace(f,!1));k<=l;k++){e[h*(a.Hb+1)+k]=f.component}}for(f=0;f<=a.lb;f++){if(0<c){for(k=0;k<a.Hb;k++){-1!==e[f*(a.Hb+1)+k]&&-1!==e[f*(a.Hb+1)+k+1]&&e[f*(a.Hb+1)+k]!==e[f*(a.Hb+1)+k+1]&&(b[e[f*(a.Hb+1)+k]*a.eg+e[f*(a.Hb+1)+k+1]]=!0)}}if(0>c){for(k=a.Hb;0<k;k--){-1!==e[f*(a.Hb+1)+k]&&-1!==e[f*(a.Hb+1)+k-1]&&e[f*(a.Hb+1)+k]!==e[f*(a.Hb+1)+k-1]&&(b[e[f*(a.Hb+1)+k]*a.eg+e[f*(a.Hb+1)+k-1]]=!0)}}}e=[];for(f=0;f<a.eg;f++){e[f]=!0}h=new E("number");h.add(0);for(l=0;0!==h.count;){if(l=h.n[h.count-1],h.kd(h.count-1),e[l]){for(e[l]=!1,f=0;f<a.eg;f++){b[l*a.eg+f]&&h.Zd(0,f)}}}if(0<c){for(d.reset();d.next();){a=d.value,e[a.component]&&(a.column-=1)}}if(0>c){for(d.reset();d.next();){c=d.value,e[c.component]&&(c.column+=1)}}}Yl.prototype.commitLayout=function(){if(this.hp){for(var a=bq(this,!0),b=bq(this,!1),c=this.network.edges.i;c.next();){var d=c.value.link;null!==d&&(d.vb=a,d.xb=b)}}this.commitNodes();this.Uy();this.Rs&&this.commitLinks()};function bq(a,b){return 270===a.la?b?vc:Cc:90===a.la?b?Cc:vc:180===a.la?b?wc:xc:b?xc:wc + }Yl.prototype.commitNodes=function(){this.Ng=[];this.bg=[];this.Cf=[];this.Lb=[];for(var a=0;a<=this.lb;a++){this.Ng[a]=0,this.bg[a]=0,this.Cf[a]=0,this.Lb[a]=0}for(a=this.network.vertexes.i;a.next();){var b=a.value,c=b.layer;this.Ng[c]=Math.max(this.Ng[c],this.nodeMinLayerSpace(b,!0));this.bg[c]=Math.max(this.bg[c],this.nodeMinLayerSpace(b,!1))}for(var b=0,d=this.Ul,c=0;c<=this.lb;c++){var e=d;0>=this.Ng[c]+this.bg[c]&&(e=0);0<c&&(b+=e/2);90===this.la||0===this.la?(b+=this.bg[c],this.Cf[c]=b,b+=this.Ng[c]):(b+=this.Ng[c],this.Cf[c]=b,b+=this.bg[c]);c<this.lb&&(b+=e/2);this.Lb[c]=b}d=b;b=this.Vd;for(c=0;c<=this.lb;c++){270===this.la?this.Cf[c]=b.y+this.Cf[c]:90===this.la?(this.Cf[c]=b.y+d-this.Cf[c],this.Lb[c]=d-this.Lb[c]):180===this.la?this.Cf[c]=b.x+this.Cf[c]:(this.Cf[c]=b.x+d-this.Cf[c],this.Lb[c]=d-this.Lb[c])}for(a.reset();a.next();){var c=a.value,d=c.layer,e=c.column|0,f=0,h=0;270===this.la||90===this.la?(f=b.x+this.ud*e,h=this.Cf[d]):(f=this.Cf[d],h=b.y+this.ud*e);c.ma=f;c.ya=h;c.commit()}};Yl.prototype.Uy=function(){for(var a=0,b=this.Ul,c=0;c<=this.lb;c++){a+=this.Ng[c],a+=this.bg[c]}for(var a=a+this.lb*b,b=[],c=this.ud*this.Hb,d=this.vH;0<=d;d--){270===this.la?0===d?b.push(new z(0,0,c,Math.abs(this.Lb[0]))):b.push(new z(0,this.Lb[d-1],c,Math.abs(this.Lb[d-1]-this.Lb[d]))):90===this.la?0===d?b.push(new z(0,this.Lb[0],c,Math.abs(this.Lb[0]-a))):b.push(new z(0,this.Lb[d],c,Math.abs(this.Lb[d-1]-this.Lb[d]))):180===this.la?0===d?b.push(new z(0,0,Math.abs(this.Lb[0]),c)):b.push(new z(this.Lb[d-1],0,Math.abs(this.Lb[d-1]-this.Lb[d]),c)):0===d?b.push(new z(this.Lb[0],0,Math.abs(this.Lb[0]-a),c)):b.push(new z(this.Lb[d],0,Math.abs(this.Lb[d-1]-this.Lb[d]),c))}this.commitLayers(b,K.Wj)};Yl.prototype.commitLayers=function(){};Yl.prototype.commitLinks=function(){for(var a=this.network.edges.i,b;a.next();){b=a.value.link,null!==b&&(b.sl(),b.uo(),b.Ci())}for(a.reset();a.next();){b=a.value.link,null!==b&&b.updateRoute()}for(a.reset();a.next();){var c=a.value;b=c.link;if(null!==b){b.sl();var d=b,e=d.V,f=d.ba,h=d.qd,k=d.ge;if(c.valid){if(b.We===kh&&4===b.ka){if(c.rev){var l=e,e=f,f=l,m=h,h=k,k=m}if(c.fromVertex.column===c.toVertex.column){var n=b.getLinkPoint(e,h,b.computeSpot(!0),!0,!1,f,k),p=b.getLinkPoint(f,k,b.computeSpot(!1),!1,!1,e,h);n.I()||n.set(e.ca.Ok);p.I()||p.set(f.ca.Ok);b.uo();b.Lk(n.x,n.y);b.Lk((2*n.x+p.x)/3,(2*n.y+p.y)/3);b.Lk((n.x+2*p.x)/3,(n.y+2*p.y)/3);b.Lk(p.x,p.y)}else{var q=!1,r=!1;null!==h&&b.computeSpot(!0)===vb&&(q=!0);null!==k&&b.computeSpot(!1)===vb&&(r=!0);if(q||r){var s=b.l(0).x,t=b.l(0).y,v=b.l(1).x,x=b.l(1).y,A=b.l(2).x,y=b.l(2).y,C=b.l(3).x,I=b.l(3).y;if(q){90===this.la||270===this.la?(v=s,x=(t+I)/2):(v=(s+C)/2,x=t);b.U(1,v,x);var H=b.getLinkPoint(e,h,b.computeSpot(!0),!0,!1,f,k);H.I()||H.set(e.ca.Ok);b.U(0,H.x,H.y)}r&&(90===this.la||270===this.la?(A=C,y=(t+I)/2):(A=(s+C)/2,y=I),b.U(2,A,y),H=b.getLinkPoint(f,k,b.computeSpot(!1),!1,!1,e,h),H.I()||H.set(f.ca.Ok),b.U(3,H.x,H.y))}}}b.Ci()}else{if(c.fromVertex.layer===c.toVertex.layer){b.Ci()}else{var R=!1,aa=!1,S=0,N=b.Cs+1;if(b.ec){aa=!0,S=b.ka,4<S&&b.points.removeRange(2,S-3)}else{if(b.We===kh){R=!0,S=b.ka,4<S&&b.points.removeRange(2,S-3),N=2}else{var S=b.ka,Z=b.computeSpot(!0)===vb,Ga=b.computeSpot(!1)===vb;2<S&&Z&&Ga?b.points.removeRange(1,S-2):3<S&&Z&&!Ga?b.points.removeRange(1,S-3):3<S&&!Z&&Ga?b.points.removeRange(2,S-2):4<S&&!Z&&!Ga&&b.points.removeRange(2,S-3)}}var ua=c.fromVertex,Oa=c.toVertex,na,Ba;if(c.rev){for(var ra=0;null!==Oa&&ua!==Oa;){Ba=na=null;for(var dc=Oa.kc.i;dc.next();){var ed=dc.value;if(ed.link===c.link&&(na=ed.fromVertex,Ba=ed.toVertex,null===na.md)){break}}na!==ua&&(Ta=b.l(N-1).x,db=b.l(N-1).y,wa=na.ma,za=na.ya,aa?180===this.la||0===this.la?2===N?(b.w(N++,Ta,db),b.w(N++,Ta,za)):(jc=null!==Ba?Ba.ya:db,jc!==za&&(lb=this.Lb[na.layer-1],b.w(N++,lb,db),b.w(N++,lb,za))):2===N?(b.w(N++,Ta,db),b.w(N++,wa,db)):(ge=null!==Ba?Ba.ma:Ta,ge!==wa&&(lb=this.Lb[na.layer-1],b.w(N++,Ta,lb),b.w(N++,wa,lb))):2===N?R?(Eb=Math.max(10,this.Ng[Oa.layer]),$a=Math.max(10,this.bg[Oa.layer]),180===this.la?(ra=Oa.aa.x,b.w(N++,ra-Eb,za),b.w(N++,ra,za),b.w(N++,ra+$a,za)):90===this.la?(ra=Oa.aa.y+Oa.aa.height,b.w(N++,wa,ra+$a),b.w(N++,wa,ra),b.w(N++,wa,ra-Eb)):270===this.la?(ra=Oa.aa.y,b.w(N++,wa,ra-Eb),b.w(N++,wa,ra),b.w(N++,wa,ra+$a)):(ra=Oa.aa.x+Oa.aa.width,b.w(N++,ra+$a,za),b.w(N++,ra,za),b.w(N++,ra-Eb,za))):(b.w(N++,Ta,db),180===this.la||0===this.la?b.w(N++,Ta,za):b.w(N++,wa,db),b.w(N++,wa,za)):(Eb=Math.max(10,this.Ng[na.layer]),$a=Math.max(10,this.bg[na.layer]),180===this.la?(R&&b.w(N++,wa-Eb,za),b.w(N++,wa,za),R&&b.w(N++,wa+$a,za)):90===this.la?(R&&b.w(N++,wa,za+$a),b.w(N++,wa,za),R&&b.w(N++,wa,za-Eb)):270===this.la?(R&&b.w(N++,wa,za-Eb),b.w(N++,wa,za),R&&b.w(N++,wa,za+$a)):(R&&b.w(N++,wa+$a,za),b.w(N++,wa,za),R&&b.w(N++,wa-Eb,za))));Oa=na}if(null===k||b.computeSpot(!1)!==vb){if(Ta=b.l(N-1).x,db=b.l(N-1).y,wa=b.l(N).x,za=b.l(N).y,aa){var Lf=this.bg[ua.layer],ec=0;180===this.la||0===this.la?(ec=db,ec>=ua.aa.y&&ec<=ua.aa.bottom&&(ra=ua.ma+Lf,ec=ec<ua.aa.y+ua.aa.height/2?ua.aa.y-this.ud/2:ua.aa.bottom+this.ud/2,b.w(N++,ra,db),b.w(N++,ra,ec)),b.w(N++,wa,ec)):(ec=Ta,ec>=ua.aa.x&&ec<=ua.aa.right&&(ra=ua.ya+Lf,ec=ec<ua.aa.x+ua.aa.width/2?ua.aa.x-this.ud/2:ua.aa.right+this.ud/2,b.w(N++,Ta,ra),b.w(N++,ec,ra)),b.w(N++,ec,za)); + b.w(N++,wa,za)}else{R?(Eb=Math.max(10,this.Ng[ua.layer]),$a=Math.max(10,this.bg[ua.layer]),180===this.la?(ra=ua.aa.x+ua.aa.width,b.U(N-2,ra,db),b.U(N-1,ra+$a,db)):90===this.la?(ra=ua.aa.y,b.U(N-2,Ta,ra),b.U(N-1,Ta,ra-Eb)):270===this.la?(ra=ua.aa.y+ua.aa.height,b.U(N-2,Ta,ra),b.U(N-1,Ta,ra+$a)):(ra=ua.aa.x,b.U(N-2,ra,db),b.U(N-1,ra-Eb,db))):(180===this.la||0===this.la?b.w(N++,wa,db):b.w(N++,Ta,za),b.w(N++,wa,za))}}}else{for(;null!==ua&&ua!==Oa;){Ba=na=null;for(var We=ua.cc.i;We.next();){var Mf=We.value;if(Mf.link===c.link&&(na=Mf.toVertex,Ba=Mf.fromVertex,null!==Ba.md&&(Ba=null),null===na.md)){break}}var Ta=0,db=0,wa=0,za=0,lb=0,Eb=0,$a=0;if(na!==Oa){if(Ta=b.l(N-1).x,db=b.l(N-1).y,wa=na.ma,za=na.ya,aa){if(180===this.la||0===this.la){var jc=null!==Ba?Ba.ya:db;jc!==za&&(lb=this.Lb[na.layer],2===N&&(lb=0===this.la?Math.max(lb,Ta):Math.min(lb,Ta)),b.w(N++,lb,db),b.w(N++,lb,za))}else{var ge=null!==Ba?Ba.ma:Ta;ge!==wa&&(lb=this.Lb[na.layer],2===N&&(lb=90===this.la?Math.max(lb,db):Math.min(lb,db)),b.w(N++,Ta,lb),b.w(N++,wa,lb))}}else{Eb=Math.max(10,this.Ng[na.layer]),$a=Math.max(10,this.bg[na.layer]),180===this.la?(b.w(N++,wa+$a,za),R&&b.w(N++,wa,za),b.w(N++,wa-Eb,za)):90===this.la?(b.w(N++,wa,za-Eb),R&&b.w(N++,wa,za),b.w(N++,wa,za+$a)):270===this.la?(b.w(N++,wa,za+$a),R&&b.w(N++,wa,za),b.w(N++,wa,za-Eb)):(b.w(N++,wa-Eb,za),R&&b.w(N++,wa,za),b.w(N++,wa+$a,za))}}ua=na}aa&&(Ta=b.l(N-1).x,db=b.l(N-1).y,wa=b.l(N).x,za=b.l(N).y,180===this.la||0===this.la?db!==za&&(lb=0===this.la?Math.min(Math.max((wa+Ta)/2,this.Lb[Oa.layer]),wa):Math.max(Math.min((wa+Ta)/2,this.Lb[Oa.layer]),wa),b.w(N++,lb,db),b.w(N++,lb,za)):Ta!==wa&&(lb=90===this.la?Math.min(Math.max((za+db)/2,this.Lb[Oa.layer]),za):Math.max(Math.min((za+db)/2,this.Lb[Oa.layer]),za),b.w(N++,Ta,lb),b.w(N++,wa,lb)))}if(null!==d&&R){if(null!==h){if(b.computeSpot(!0)===vb){var nc=b.l(0),Pd=b.l(2);nc.L(Pd)||b.U(1,(nc.x+Pd.x)/2,(nc.y+Pd.y)/2)}H=b.getLinkPoint(e,h,vb,!0,!1,f,k);H.I()||H.set(e.ca.Ok);b.U(0,H.x,H.y)}null!==k&&(b.computeSpot(!1)===vb&&(nc=b.l(b.ka-1),Pd=b.l(b.ka-3),nc.L(Pd)||b.U(b.ka-2,(nc.x+Pd.x)/2,(nc.y+Pd.y)/2)),H=b.getLinkPoint(f,k,vb,!1,!1,e,h),H.I()||H.set(f.ca.Ok),b.U(b.ka-1,H.x,H.y))}b.Ci();c.commit()}}}}for(var he=new E(W),Xe=this.network.edges.i;Xe.next();){var pf=Xe.value.link;null!==pf&&pf.ec&&!he.contains(pf)&&he.add(pf)}if(0<he.count){if(90===this.la||270===this.la){for(var Qd=0,Fb=new E(Mq),Kb,Fc,Mg=he.i;Mg.next();){var Lb=Mg.value;if(null!==Lb&&Lb.ec){for(var yb=2;yb<Lb.ka-3;yb++){if(Kb=Lb.l(yb),Fc=Lb.l(yb+1),this.D(Kb.y,Fc.y)&&!this.D(Kb.x,Fc.x)){var fc=new Mq;fc.layer=Math.floor(Kb.y/2);var mb=Lb.l(0),ye=Lb.l(Lb.ka-1);fc.first=mb.x*mb.x+mb.y;fc.Jd=ye.x*ye.x+ye.y;fc.De=Math.min(Kb.x,Fc.x);fc.Wd=Math.max(Kb.x,Fc.x);fc.index=yb;fc.link=Lb;if(yb+2<Lb.ka){var Rd=Lb.l(yb-1),og=Lb.l(yb+2),Nf=0;Rd.y<Kb.y?Nf=og.y<Kb.y?3:Kb.x<Fc.x?2:1:Rd.y>Kb.y&&(Nf=og.y>Kb.y?0:Fc.x<Kb.x?2:1);fc.Th=Nf}Fb.add(fc)}}}}if(1<Fb.count){Fb.sort(this.BE);for(var zb=0;zb<Fb.count;){for(var fd=Fb.n[zb].layer,oc=zb+1;oc<Fb.count&&Fb.n[oc].layer===fd;){oc++}if(1<oc-zb){for(var wb=zb;wb<oc;){for(var Gc=Fb.n[wb].Wd,Mb=zb+1;Mb<oc&&Fb.n[Mb].De<Gc;){Gc=Math.max(Gc,Fb.n[Mb].Wd),Mb++}var Na=Mb-wb;if(1<Na){Fb.jp(this.Cw,wb,wb+Na);for(var eb=1,Ab=Fb.n[wb].Jd,yb=wb;yb<Mb;yb++){var gc=Fb.n[yb];gc.Jd!==Ab&&(eb++,Ab=gc.Jd)}Fb.jp(this.AE,wb,wb+Na);for(var Sd=1,Ab=Fb.n[wb].first,yb=wb;yb<Mb;yb++){gc=Fb.n[yb],gc.first!==Ab&&(Sd++,Ab=gc.first)}var Td=!0,qf=Sd;eb<Sd?(Td=!1,qf=eb,Ab=Fb.n[wb].Jd,Fb.jp(this.Cw,wb,wb+Na)):Ab=Fb.n[wb].first;for(var ze=0,yb=wb;yb<Mb;yb++){gc=Fb.n[yb];(Td?gc.first:gc.Jd)!==Ab&&(ze++,Ab=Td?gc.first:gc.Jd);Lb=gc.link;Kb=Lb.l(gc.index);Fc=Lb.l(gc.index+1);var rf=this.pw*(ze-(qf-1)/2);Qd++;Lb.sl();Lb.U(gc.index,Kb.x,Kb.y+rf);Lb.U(gc.index+1,Fc.x,Fc.y+rf);Lb.Ci()}}wb=Mb}}zb=oc}}}else{for(var Rb=0,cb=new E(Mq),pc,Pc,gd=he.i;gd.next();){var ab=gd.value;if(null!==ab&&ab.ec){for(var ub=2;ub<ab.ka-3;ub++){if(pc=ab.l(ub),Pc=ab.l(ub+1),this.D(pc.x,Pc.x)&&!this.D(pc.y,Pc.y)){var kc=new Mq;kc.layer=Math.floor(pc.x/2);var hd=ab.l(0),Ng=ab.l(ab.ka-1);kc.first=hd.x+hd.y*hd.y;kc.Jd=Ng.x+Ng.y*Ng.y;kc.De=Math.min(pc.y,Pc.y);kc.Wd=Math.max(pc.y,Pc.y);kc.index=ub;kc.link=ab;if(ub+2<ab.ka){var Og=ab.l(ub-1),Pg=ab.l(ub+2),Of=0;Og.x<pc.x?Of=Pg.x<pc.x?3:pc.y<Pc.y?2:1:Og.x>pc.x&&(Of=Pg.x>pc.x?0:Pc.y<pc.y?2:1);kc.Th=Of}cb.add(kc)}}}}if(1<cb.count){cb.sort(this.BE);for(var Hc=0;Hc<cb.count;){for(var Qc=cb.n[Hc].layer,Ic=Hc+1;Ic<cb.count&&cb.n[Ic].layer===Qc;){Ic++}if(1<Ic-Hc){for(var nb=Hc;nb<Ic;){for(var ie=cb.n[nb].Wd,ob=Hc+1;ob<Ic&&cb.n[ob].De<ie;){ie=Math.max(ie,cb.n[ob].Wd),ob++}var yc=ob-nb;if(1<yc){cb.jp(this.Cw,nb,nb+yc);for(var Ae=1,Bb=cb.n[nb].Jd,ub=nb;ub<ob;ub++){var Cb=cb.n[ub];Cb.Jd!==Bb&&(Ae++,Bb=Cb.Jd)}cb.jp(this.AE,nb,nb+yc);for(var id=1,Bb=cb.n[nb].first,ub=nb;ub<ob;ub++){Cb=cb.n[ub],Cb.first!==Bb&&(id++,Bb=Cb.first)}var Rc=!0,Ud=id;Ae<id?(Rc=!1,Ud=Ae,Bb=cb.n[nb].Jd,cb.jp(this.Cw,nb,nb+yc)):Bb=cb.n[nb].first;for(var Vd=0,ub=nb;ub<ob;ub++){Cb=cb.n[ub];(Rc?Cb.first:Cb.Jd)!==Bb&&(Vd++,Bb=Rc?Cb.first:Cb.Jd); + ab=Cb.link;pc=ab.l(Cb.index);Pc=ab.l(Cb.index+1);var Ye=this.pw*(Vd-(Ud-1)/2);Rb++;ab.sl();ab.U(Cb.index,pc.x+Ye,pc.y);ab.U(Cb.index+1,Pc.x+Ye,Pc.y);ab.Ci()}}nb=ob}}Hc=Ic}}}}};Yl.prototype.BE=function(a,b){return a instanceof Mq&&b instanceof Mq&&a!==b?a.layer<b.layer?-1:a.layer>b.layer?1:a.De<b.De?-1:a.De>b.De?1:a.Wd<b.Wd?-1:a.Wd>b.Wd?1:0:0};Yl.prototype.AE=function(a,b){return a instanceof Mq&&b instanceof Mq&&a!==b?a.first<b.first?-1:a.first>b.first||a.Th<b.Th?1:a.Th>b.Th||a.De<b.De?-1:a.De>b.De?1:a.Wd<b.Wd?-1:a.Wd>b.Wd?1:0:0};Yl.prototype.Cw=function(a,b){return a instanceof Mq&&b instanceof Mq&&a!==b?a.Jd<b.Jd?-1:a.Jd>b.Jd||a.Th<b.Th?1:a.Th>b.Th||a.De<b.De?-1:a.De>b.De?1:a.Wd<b.Wd?-1:a.Wd>b.Wd?1:0:0};Yl.prototype.D=function(a,b){var c=a-b;return -1<c&&1>c};function dq(a,b){var c,d=a.Md[b];if(d>=a.Pg.length){c=[];for(var e=0;e<a.Pg.length;e++){c[e]=a.Pg[e]}a.Pg=c}void 0===a.Pg[d]||null===a.Pg[d]?c=[]:(c=a.Pg[d],a.Pg[d]=null);d=a.Xq[b];for(e=0;e<d.length;e++){var f=d[e];c[f.index]=f}return c}function eq(a,b,c){a.Pg[a.Md[b]]=c}u.defineProperty(Yl,{layerSpacing:"layerSpacing"},function(){return this.Ul},function(a){this.Ul!==a&&(u.j(a,"number",Yl,"layerSpacing"),0<=a&&(this.Ul=a,this.H()))});u.defineProperty(Yl,{hJ:"columnSpacing"},function(){return this.ud},function(a){this.ud!==a&&(u.j(a,"number",Yl,"columnSpacing"),0<=a&&(this.ud=a,this.H()))});u.defineProperty(Yl,{direction:"direction"},function(){return this.la},function(a){this.la!==a&&(u.j(a,"number",Yl,"direction"),this.la=a,this.H())});u.defineProperty(Yl,{lG:"cycleRemoveOption"},function(){return this.jn},function(a){this.jn!==a&&(u.rb(a,Yl,Yl,"cycleRemoveOption"),a===Xp||a===Op)&&(this.jn=a,this.H())});u.defineProperty(Yl,{nH:"layeringOption"},function(){return this.On},function(a){this.On!==a&&(u.rb(a,Yl,Yl,"layeringOption"),a===Sp||a===oq||a===qq)&&(this.On=a,this.H())});u.defineProperty(Yl,{XG:"initializeOption"},function(){return this.Dn},function(a){this.Dn!==a&&(u.rb(a,Yl,Yl,"initializeOption"),a===Tp||a===wq||a===uq)&&(this.Dn=a,this.H())});u.defineProperty(Yl,{QJ:"iterations"},function(){return this.Rl},function(a){this.Rl!==a&&(u.Be(a,Wp,"iterations"),0<=a&&(this.Rl=a,this.H()))});u.defineProperty(Yl,{OF:"aggressiveOption"},function(){return this.Zm},function(a){this.Zm!==a&&(u.rb(a,Yl,Yl,"aggressiveOption"),a===Aq||a===Up||a===Bq)&&(this.Zm=a,this.H())});u.defineProperty(Yl,{nK:"packOption"},function(){return this.pi},function(a){this.pi!==a&&(u.j(a,"number",Yl,"packOption"),0<=a&&8>a&&(this.pi=a,this.H()))});u.defineProperty(Yl,{hp:"setsPortSpots"},function(){return this.Gh},function(a){this.Gh!==a&&(u.j(a,"boolean",Yl,"setsPortSpots"),this.Gh=a,this.H())});u.defineProperty(Yl,{pw:"linkSpacing"},function(){return this.gj},function(a){this.gj!==a&&(u.j(a,"number",Yl,"linkSpacing"),0<=a&&(this.gj=a,this.H()))});u.u(Yl,{vH:"maxLayer"},function(){return this.lb});u.u(Yl,{XJ:"maxIndex"},function(){return this.Hu});u.u(Yl,{WJ:"maxColumn"},function(){return this.Hb});u.u(Yl,{bK:"minIndexLayer"},function(){return this.Pq});u.u(Yl,{YJ:"maxIndexLayer"},function(){return this.Df});var Op;Yl.CycleDepthFirst=Op=u.s(Yl,"CycleDepthFirst",0);var Xp;Yl.CycleGreedy=Xp=u.s(Yl,"CycleGreedy",1);var Sp;Yl.LayerOptimalLinkLength=Sp=u.s(Yl,"LayerOptimalLinkLength",0);var oq;Yl.LayerLongestPathSink=oq=u.s(Yl,"LayerLongestPathSink",1);var qq;Yl.LayerLongestPathSource=qq=u.s(Yl,"LayerLongestPathSource",2);var Tp;Yl.InitDepthFirstOut=Tp=u.s(Yl,"InitDepthFirstOut",0);var wq;Yl.InitDepthFirstIn=wq=u.s(Yl,"InitDepthFirstIn",1);var uq;Yl.InitNaive=uq=u.s(Yl,"InitNaive",2);var Aq;Yl.AggressiveNone=Aq=u.s(Yl,"AggressiveNone",0);var Up;Yl.AggressiveLess=Up=u.s(Yl,"AggressiveLess",1);var Bq;Yl.AggressiveMore=Bq=u.s(Yl,"AggressiveMore",2);Yl.PackNone=0;var Cq;Yl.PackExpand=Cq=1;var Dq;Yl.PackStraighten=Dq=2;var Fq;Yl.PackMedian=Fq=4;var Vp;Yl.PackAll=Vp=7;function Mq(){this.index=this.Wd=this.De=this.Jd=this.first=this.layer=0;this.link=null;this.Th=0}u.Yd(Mq,{layer:!0,first:!0,Jd:!0,De:!0,Wd:!0,index:!0,link:!0,Th:!0});function Wp(){xa.call(this)}u.Ha(Wp,xa);u.fa("LayeredDigraphNetwork",Wp);Wp.prototype.createVertex=function(){return new Nq};Wp.prototype.createEdge=function(){return new Oq};function Nq(){ya.call(this);this.index=this.column=this.layer=-1;this.component=NaN;this.near=null;this.valid=!1;this.finish=this.yo=NaN;this.sm=0;this.Iz=this.Jz=null}u.Ha(Nq,ya);u.fa("LayeredDigraphVertex",Nq);function Oq(){Aa.call(this);this.forest=this.rev=this.valid=!1;this.portToPos=this.portFromPos=NaN;this.portToColOffset=this.portFromColOffset=0}u.Ha(Oq,Aa);u.fa("LayeredDigraphEdge",Oq);function Y(){0<arguments.length&&u.Xc(Y);Je.call(this);this.od=new F(Object);this.hr=Pq;this.Bf=Qq;this.Yr=Rq;this.Eu=Sq;this.BA=null;this.qh=!0;this.Zc=Tq;this.Vf=(new ia(10,10)).freeze();this.ra=new Uq;this.qa=new Uq;this.Cy=[]}u.Ha(Y,Je);u.fa("TreeLayout",Y);Y.prototype.cloneProtected=function(a){Je.prototype.cloneProtected.call(this,a);a.hr=this.hr;a.Yr=this.Yr;a.Eu=this.Eu;a.qh=this.qh;a.Zc=this.Zc; + a.Vf.assign(this.Vf);a.ra.copyInheritedPropertiesFrom(this.ra);a.qa.copyInheritedPropertiesFrom(this.qa)};Y.prototype.createNetwork=function(){return new Vq};Y.prototype.makeNetwork=function(a){function b(a){if(a instanceof U){return !a.uf&&"Comment"!==a.Jc}if(a instanceof W){var b=a.V;if(null===b||b.uf||"Comment"===b.Jc){return !1}a=a.ba;return null===a||a.uf||"Comment"===a.Jc?!1:!0}return !1}var c=this.createNetwork();c.Qb=this;a instanceof D?(c.Gj(a.Ag,!0,b),c.Gj(a.links,!0,b)):a instanceof V?c.Gj(a.Lc,!1,b):c.Gj(a.i,!1,b);return c};Y.prototype.doLayout=function(a){null===a&&u.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts");null===this.network&&(this.network=this.makeNetwork(a));this.Hf!==Wq&&(this.Vd=this.initialOrigin(this.Vd));var b=this.g;null===b&&a instanceof D&&(b=a);this.Bf=this.path===Pq&&null!==b?b.rd?Qq:Xq:this.path===Pq?Qq:this.path;if(0<this.network.vertexes.count){this.network.Qv();for(a=this.network.vertexes.i;a.next();){b=a.value,b.initialized=!1,b.level=0,b.parent=null,b.children=[]}if(0<this.od.count){a=new F(Uq);for(b=this.od.i;b.next();){var c=b.value;c instanceof U?(c=this.network.Em(c),null!==c&&a.add(c)):c instanceof Uq&&a.add(c)}this.od=a}0===this.od.count&&this.findRoots();for(a=this.od.copy().i;a.next();){b=a.value,b.initialized||(b.initialized=!0,Yq(this,b))}for(a=this.od.i;a.next();){b=a.value,b instanceof Uq&&Zq(this,b)}for(a=this.od.i;a.next();){b=a.value,b instanceof Uq&&$q(this,b)}for(a=this.od.i;a.next();){b=a.value,b instanceof Uq&&ar(this,b)}this.Py();if(this.xz===br){c=[];for(a=this.network.vertexes.i;a.next();){var d=a.value,b=d.parent;null==b&&(b=d);var b=0===b.angle||180===b.angle,e=c[d.level];void 0===e&&(e=0);c[d.level]=Math.max(e,b?d.width:d.height)}for(d=0;d<c.length;d++){void 0===c[d]&&(c[d]=0)}this.BA=c;for(a=this.network.vertexes.i;a.next();){d=a.value,b=d.parent,null===b&&(b=d),0===b.angle||180===b.angle?(180===b.angle&&(d.Ds+=c[d.level]-d.width),d.width=c[d.level]):(270===b.angle&&(d.Es+=c[d.level]-d.height),d.height=c[d.level])}}else{if(this.xz===cr){for(a=this.network.vertexes.i;a.next();){c=a.value;b=0===c.angle||180===c.angle;e=-1;for(d=0;d<c.children.length;d++){var f=c.children[d],e=Math.max(e,b?f.width:f.height)}if(0<=e){for(d=0;d<c.children.length;d++){f=c.children[d],b?(180===c.angle&&(f.Ds+=e-f.width),f.width=e):(270===c.angle&&(f.Es+=e-f.height),f.height=e)}}}}}for(a=this.od.i;a.next();){b=a.value,b instanceof Uq&&this.layoutTree(b)}this.arrangeTrees();this.updateParts()}this.network=null;this.od=new F(Object);this.wf=!0};Y.prototype.findRoots=function(){for(var a=this.network.vertexes.i;a.next();){var b=a.value;switch(this.Bf){case Qq:0===b.kc.count&&this.od.add(b);break;case Xq:0===b.cc.count&&this.od.add(b);break;default:u.k("Unhandled path value "+this.Bf.toString())}}if(0===this.od.count){for(var a=999999,b=null,c=this.network.vertexes.i;c.next();){var d=c.value;switch(this.Bf){case Qq:d.kc.count<a&&(a=d.kc.count,b=d);break;case Xq:d.cc.count<a&&(a=d.cc.count,b=d);break;default:u.k("Unhandled path value "+this.Bf.toString())}}null!==b&&this.od.add(b)}};function Yq(a,b){if(null!==b){switch(a.Bf){case Qq:if(0<b.cc.count){for(var c=new E(Uq),d=b.sG;d.next();){var e=d.value;dr(a,b,e)&&c.add(e)}0<c.count&&(b.children=c.Le())}break;case Xq:if(0<b.kc.count){c=new E(Uq);for(d=b.pI;d.next();){e=d.value,dr(a,b,e)&&c.add(e)}0<c.count&&(b.children=c.Le())}break;default:u.k("Unhandled path value"+a.Bf.toString())}c=b.children;d=c.length;for(e=0;e<d;e++){var f=c[e];f.initialized=!0;f.level=b.level+1;f.parent=b;a.od.remove(f)}for(e=0;e<d;e++){f=c[e],Yq(a,f)}}}function dr(a,b,c){if(c.initialized){var d;if(null===b){d=!1}else{for(d=b.parent;null!==d&&d!==c;){d=d.parent}d=d===c}if(d||c.level>b.level){return !1}a.removeChild(c.parent,c)}return !0}Y.prototype.removeChild=function(a,b){if(null!==a&&null!==b){for(var c=a.children,d=0,e=0;e<c.length;e++){c[e]===b&&d++}if(0<d){for(var d=Array(c.length-d),f=0,e=0;e<c.length;e++){c[e]!==b&&(d[f++]=c[e])}a.children=d}}};function Zq(a,b){if(null!==b){a.initializeTreeVertexValues(b);b.alignment===er&&a.sortTreeVertexChildren(b);for(var c=0,d=b.um,e=0,f=b.children,h=f.length,k=0;k<h;k++){var l=f[k];Zq(a,l);c+=l.descendantCount+1;d=Math.max(d,l.maxChildrenCount);e=Math.max(e,l.maxGenerationCount)}b.descendantCount=c;b.maxChildrenCount=d;b.maxGenerationCount=0<d?e+1:0}}function fr(a,b){switch(a.Yr){default:case Rq:return null!==b.parent?b.parent:a.ra;case gr:return null===b.parent?a.ra:null===b.parent.parent?a.qa:b.parent;case hr:if(null!==b.parent){return null!==b.parent.parent?b.parent.parent:a.qa}case ir:var c=!0;if(0===b.um){c=!1}else{for(var d=b.children,e=d.length,f=0;f<e;f++){if(0<d[f].um){c=!1;break}}}return c&&null!==b.parent?a.qa:null!==b.parent?b.parent:a.ra}}Y.prototype.initializeTreeVertexValues=function(a){var b=fr(this,a);a.copyInheritedPropertiesFrom(b);if(null!==a.parent&&a.parent.alignment===er){for(var b=a.angle,c=a.parent.children,d=0;d<c.length&&a!==c[d]; + ){d++}0===d%2?d!==c.length-1&&(b=90===b?180:180===b?270:270===b?180:270):b=90===b?0:180===b?90:270===b?0:90;a.angle=b}a.initialized=!0};function $q(a,b){if(null!==b){a.assignTreeVertexValues(b);for(var c=b.children,d=c.length,e=0;e<d;e++){$q(a,c[e])}}}Y.prototype.assignTreeVertexValues=function(){};function ar(a,b){if(null!==b){b.alignment!==er&&a.sortTreeVertexChildren(b);for(var c=b.children,d=c.length,e=0;e<d;e++){ar(a,c[e])}}}Y.prototype.sortTreeVertexChildren=function(a){switch(a.sorting){case jr:break;case kr:a.children.reverse();break;case lr:a.children.sort(a.comparer);break;case mr:a.children.sort(a.comparer);a.children.reverse();break;default:u.k("Unhandled sorting value "+a.sorting.toString())}};Y.prototype.Py=function(){if(this.comments){for(var a=this.network.vertexes.i;a.next();){this.addComments(a.value)}}};Y.prototype.addComments=function(a){var b=a.angle,c=a.parent,d=0,e=nr,e=!1;null!==c&&(d=c.angle,e=c.alignment,e=or(e));var b=90===b||270===b,d=90===d||270===d,c=0===a.um,f=0,h=0,k=0,l=a.commentSpacing;if(null!==a.Bc){for(var m=a.Bc.sD();m.next();){var n=m.value;"Comment"===n.Jc&&n.canLayout()&&(null===a.comments&&(a.comments=[]),a.comments.push(n),n.rf(),n=n.Ca,b&&!c||!e&&!d&&c||e&&d&&c?(f=Math.max(f,n.width),h+=n.height+Math.abs(k)):(f+=n.width+Math.abs(k),h=Math.max(h,n.height)),k=l)}}null!==a.comments&&(b&&!c||!e&&!d&&c||e&&d&&c?(f+=Math.abs(a.commentMargin),h=Math.max(0,h-a.height)):(h+=Math.abs(a.commentMargin),f=Math.max(0,f-a.width)),e=u.Vj(0,0,a.aa.width+f,a.aa.height+h),a.mb=e,u.ic(e))};function or(a){return a===pr||a===er||a===qr||a===rr}function sr(a){return a===pr||a===er}function tr(a){var b=a.parent;if(null!==b){var c=b.alignment;if(or(c)){if(sr(c)){b=b.children;for(c=0;c<b.length&&a!==b[c];){c++}return 0===c%2}if(c===qr){return !0}}}return !1}Y.prototype.layoutComments=function(a){if(null!==a.comments){var b=a.Bc.Ca,c=a.parent,d=a.angle,e=0,f=nr,f=!1;null!==c&&(e=c.angle,f=c.alignment,f=or(f));for(var c=90===d||270===d,d=90===e||270===e,h=0===a.um,k=tr(a),l=0,m=a.comments,n=m.length,p=u.K(),q=0;q<n;q++){var r=m[q],s=r.Ca;if(c&&!h||!f&&!d&&h||f&&d&&h){if(135<e&&!f||d&&k){if(0<=a.commentMargin){for(p.m(a.aa.x-a.commentMargin-s.width,a.aa.y+l),r.move(p),r=r.qg();r.next();){var t=r.value;t.vb=wc;t.xb=xc}}else{for(p.m(a.aa.x+2*a.M.x-a.commentMargin,a.aa.y+l),r.move(p),r=r.qg();r.next();){t=r.value,t.vb=xc,t.xb=wc}}}else{if(0<=a.commentMargin){for(p.m(a.aa.x+2*a.M.x+a.commentMargin,a.aa.y+l),r.move(p),r=r.qg();r.next();){t=r.value,t.vb=xc,t.xb=wc}}else{for(p.m(a.aa.x+a.commentMargin-s.width,a.aa.y+l),r.move(p),r=r.qg();r.next();){t=r.value,t.vb=wc,t.xb=xc}}}l=0<=a.commentSpacing?l+(s.height+a.commentSpacing):l+(a.commentSpacing-s.height)}else{if(135<e&&!f||!d&&k){if(0<=a.commentMargin){for(p.m(a.aa.x+l,a.aa.y-a.commentMargin-s.height),r.move(p),r=r.qg();r.next();){t=r.value,t.vb=vc,t.xb=Cc}}else{for(p.m(a.aa.x+l,a.aa.y+2*a.M.y-a.commentMargin),r.move(p),r=r.qg();r.next();){t=r.value,t.vb=Cc,t.xb=vc}}}else{if(0<=a.commentMargin){for(p.m(a.aa.x+l,a.aa.y+2*a.M.y+a.commentMargin),r.move(p),r=r.qg();r.next();){t=r.value,t.vb=Cc,t.xb=vc}}else{for(p.m(a.aa.x+l,a.aa.y+a.commentMargin-s.height),r.move(p),r=r.qg();r.next();){t=r.value,t.vb=vc,t.xb=Cc}}}l=0<=a.commentSpacing?l+(s.width+a.commentSpacing):l+(a.commentSpacing-s.width)}}u.v(p);b=l-a.commentSpacing-(c?b.height:b.width);if(this.Bf===Qq){for(e=a.cc;e.next();){a=e.value.link,null===a||a.el||(a.Yk=0<b?b:NaN)}}else{for(e=a.kc;e.next();){a=e.value.link,null===a||a.el||(a.wl=0<b?b:NaN)}}}};Y.prototype.layoutTree=function(a){if(null!==a){for(var b=a.children,c=b.length,d=0;d<c;d++){this.layoutTree(b[d])}switch(a.compaction){case ur:vr(this,a);break;case wr:if(a.alignment===er){vr(this,a)}else{if(0===a.um){var d=a.parent,b=!1,c=0,e=nr;null!==d&&(c=d.angle,e=d.alignment,b=or(e));d=tr(a);a.ia.m(0,0);a.Za.m(a.width,a.height);null===a.parent||null===a.comments||(180!==c&&270!==c||b)&&!d?a.Ka.m(0,0):180===c&&!b||(90===c||270===c)&&d?a.Ka.m(a.width-2*a.M.x,0):a.Ka.m(0,a.height-2*a.M.y);a.Ts=null;a.kt=null}else{for(var f=xr(a),b=90===f||270===f,h=0,k=a.children,l=k.length,m=0;m<l;m++){var n=k[m],h=Math.max(h,b?n.Za.width:n.Za.height)}var p=a.alignment,d=p===yr,q=p===zr,r=or(p),s=Math.max(0,a.breadthLimit),c=Ar(a),t=a.nodeSpacing,v=Br(a),x=a.rowSpacing,A=0;if(d||q||a.dp||a.ep&&1===a.maxGenerationCount){A=Math.max(0,a.rowIndent)}var d=a.width,e=a.height,y=0,C=0,I=0,H=null,R=null,aa=0,S=0,N=0,Z=0,Ga=0,ua=0,Oa=0,na=0,n=0;r&&!sr(p)&&135<f&&k.reverse();if(sr(p)){if(1<l){for(m=0;m<l;m++){0===m%2&&m!==l-1?na=Math.max(na,b?k[m].Za.width:k[m].Za.height):0!==m%2&&(n=Math.max(n,b?k[m].Za.width:k[m].Za.height))}}else{1===l&&(na=b?k[0].Za.width:k[0].Za.height)}}if(r){switch(p){case pr:S=135>f?Cr(a,k,na,y,C):Dr(a,k,na,y,C);na=S.x;y=S.width;C=S.height;break;case qr:for(m=0;m<l;m++){var n=k[m],Ba=n.Za,H=0===ua?0:x;b?(n.ia.m(h-Ba.width,Z+H),y=Math.max(y,Ba.width),C=Math.max(C,Z+H+Ba.height),Z+=H+Ba.height):(n.ia.m(N+H,h-Ba.height),y=Math.max(y,N+H+Ba.width),C=Math.max(C,Ba.height),N+=H+Ba.width); + ua++}break;case rr:for(m=0;m<l;m++){n=k[m],Ba=n.Za,H=0===ua?0:x,b?(n.ia.m(t/2+a.M.x,Z+H),y=Math.max(y,Ba.width),C=Math.max(C,Z+H+Ba.height),Z+=H+Ba.height):(n.ia.m(N+H,t/2+a.M.y),y=Math.max(y,N+H+Ba.width),C=Math.max(C,Ba.height),N+=H+Ba.width),ua++}}H=Er(this,2);R=Er(this,2);b?(H[0].m(0,0),H[1].m(0,C),R[0].m(y,0)):(H[0].m(0,0),H[1].m(y,0),R[0].m(0,C));R[1].m(y,C)}else{for(m=0;m<l;m++){n=k[m];Ba=n.Za;if(b){0<s&&0<ua&&N+t+Ba.width>s&&(N<h&&Fr(a,p,h-N,0,Oa,m-1),Ga++,ua=0,Oa=m,I=C,N=0,Z=135<f?-C-x:C+x);Gr(this,n,0,Z);var ra=0;if(0===ua){if(H=n.Ts,R=n.kt,aa=Ba.width,S=Ba.height,null===H||null===R||f!==xr(n)){H=Er(this,2),R=Er(this,2),H[0].m(0,0),H[1].m(0,S),R[0].m(aa,0),R[1].m(aa,S)}}else{var dc=u.hb(),S=Hr(this,a,n,H,R,aa,S,dc),ra=S.x,H=dc[0],R=dc[1],aa=S.width,S=S.height;u.sa(dc);N<Ba.width&&0>ra&&(Ir(a,-ra,0,Oa,m-1),Jr(H,-ra,0),Jr(R,-ra,0),ra=0)}n.ia.m(ra,Z);y=Math.max(y,aa);C=Math.max(C,I+(0===Ga?0:x)+Ba.height);N=aa}else{0<s&&0<ua&&Z+t+Ba.height>s&&(Z<h&&Fr(a,p,0,h-Z,Oa,m-1),Ga++,ua=0,Oa=m,I=y,Z=0,N=135<f?-y-x:y+x);Gr(this,n,N,0);ra=0;if(0===ua){if(H=n.Ts,R=n.kt,aa=Ba.width,S=Ba.height,null===H||null===R||f!==xr(n)){H=Er(this,2),R=Er(this,2),H[0].m(0,0),H[1].m(aa,0),R[0].m(0,S),R[1].m(aa,S)}}else{dc=u.hb(),S=Hr(this,a,n,H,R,aa,S,dc),ra=S.x,H=dc[0],R=dc[1],aa=S.width,S=S.height,u.sa(dc),Z<Ba.height&&0>ra&&(Ir(a,0,-ra,Oa,m-1),Jr(H,0,-ra),Jr(R,0,-ra),ra=0)}n.ia.m(N,ra);C=Math.max(C,S);y=Math.max(y,I+(0===Ga?0:x)+Ba.width);Z=S}ua++}}0<Ga&&(b?(C+=Math.max(0,c),N<y&&Fr(a,p,y-N,0,Oa,l-1),0<A&&(q||Ir(a,A,0,0,l-1),y+=A)):(y+=Math.max(0,c),Z<C&&Fr(a,p,0,C-Z,Oa,l-1),0<A&&(q||Ir(a,0,A,0,l-1),C+=A)));q=h=0;switch(p){case Kr:b?h+=y/2-a.M.x-v/2:q+=C/2-a.M.y-v/2;break;case nr:0<Ga?b?h+=y/2-a.M.x-v/2:q+=C/2-a.M.y-v/2:b?(m=k[0].ia.x+k[0].Ka.x,na=k[l-1].ia.x+k[l-1].Ka.x+2*k[l-1].M.x,h+=m+(na-m)/2-a.M.x-v/2):(m=k[0].ia.y+k[0].Ka.y,na=k[l-1].ia.y+k[l-1].Ka.y+2*k[l-1].M.y,q+=m+(na-m)/2-a.M.y-v/2);break;case yr:b?(h-=v,y+=v):(q-=v,C+=v);break;case zr:b?(h+=y-a.width+v,y+=v):(q+=C-a.height+v,C+=v);break;case pr:b?h=1<l?h+(na+t/2-a.M.x):h+(k[0].M.x-a.M.x+k[0].Ka.x):q=1<l?q+(na+t/2-a.M.y):q+(k[0].M.y-a.M.y+k[0].Ka.y);break;case qr:b?h+=y+t/2-a.M.x:q+=C+t/2-a.M.y;break;case rr:break;default:u.k("Unhandled alignment value "+p.toString())}for(m=0;m<l;m++){n=k[m],b?n.ia.m(n.ia.x+n.Ka.x-h,n.ia.y+(135<f?(r?-C:-n.Za.height)+n.Ka.y-c:e+c+n.Ka.y)):n.ia.m(n.ia.x+(135<f?(r?-y:-n.Za.width)+n.Ka.x-c:d+c+n.Ka.x),n.ia.y+n.Ka.y-q)}l=k=0;r?b?(y=Lr(a,y,h),0>h&&(h=0),135<f&&(q+=C+c),C+=e+c,p===rr&&(k+=t/2+a.M.x),l+=e+c):(135<f&&(h+=y+c),y+=d+c,C=Mr(a,C,q),0>q&&(q=0),p===rr&&(l+=t/2+a.M.y),k+=d+c):b?(null===a.comments?d>y&&(p=Nr(p,d-y,0),k=p.x,l=p.y,y=d,h=0):y=Lr(a,y,h),0>h&&(k-=h,h=0),135<f&&(q+=C+c),C=Math.max(Math.max(C,e),C+e+c),l+=e+c):(135<f&&(h+=y+c),y=Math.max(Math.max(y,d),y+d+c),null===a.comments?e>C&&(p=Nr(p,0,e-C),k=p.x,l=p.y,C=e,q=0):C=Mr(a,C,q),0>q&&(l-=q,q=0),k+=d+c);if(0<Ga){f=Er(this,4),p=Er(this,4),b?(f[2].m(0,e+c),f[3].m(f[2].x,C),p[2].m(y,f[2].y),p[3].m(p[2].x,f[3].y)):(f[2].m(d+c,0),f[3].m(y,f[2].y),p[2].m(f[2].x,C),p[3].m(f[3].x,p[2].y))}else{f=Er(this,H.length+2);p=Er(this,R.length+2);for(m=0;m<H.length;m++){r=H[m],f[m+2].m(r.x+k,r.y+l)}for(m=0;m<R.length;m++){r=R[m],p[m+2].m(r.x+k,r.y+l)}}b?(f[0].m(h,0),f[1].m(f[0].x,e),f[2].y<f[1].y&&(f[2].x>f[0].x?f[2].assign(f[1]):f[1].assign(f[2])),f[3].y<f[2].y&&(f[3].x>f[0].x?f[3].assign(f[2]):f[2].assign(f[3])),p[0].m(h+d,0),p[1].m(p[0].x,e),p[2].y<p[1].y&&(p[2].x<p[0].x?p[2].assign(p[1]):p[1].assign(p[2])),p[3].y<p[2].y&&(p[3].x<p[0].x?p[3].assign(p[2]):p[2].assign(p[3])),f[2].y-=c/2,p[2].y-=c/2):(f[0].m(0,q),f[1].m(d,f[0].y),f[2].x<f[1].x&&(f[2].y>f[0].y?f[2].assign(f[1]):f[1].assign(f[2])),f[3].x<f[2].x&&(f[3].y>f[0].y?f[3].assign(f[2]):f[2].assign(f[3])),p[0].m(0,q+e),p[1].m(d,p[0].y),p[2].x<p[1].x&&(p[2].y<p[0].y?p[2].assign(p[1]):p[1].assign(p[2])),p[3].x<p[2].x&&(p[3].y<p[0].y?p[3].assign(p[2]):p[2].assign(p[3])),f[2].x-=c/2,p[2].x-=c/2);Or(this,H);Or(this,R);a.Ts=f;a.kt=p;a.Ka.m(h,q);a.Za.m(y,C)}}break;default:u.k("Unhandled compaction value "+a.compaction.toString())}}};function vr(a,b){if(0===b.um){var c=!1,d=0,e=nr;null!==b.parent&&(d=b.parent.angle,e=b.parent.alignment,c=or(e));e=tr(b);b.ia.m(0,0);b.Za.m(b.width,b.height);null===b.parent||null===b.comments||(180!==d&&270!==d||c)&&!e?b.Ka.m(0,0):180===d&&!c||(90===d||270===d)&&e?b.Ka.m(b.width-2*b.M.x,0):b.Ka.m(0,b.height-2*b.M.y)}else{for(var c=xr(b),d=90===c||270===c,f=0,e=b.children,h=e.length,k=0;k<h;k++){var l=e[k],f=Math.max(f,d?l.Za.width:l.Za.height)}var m=b.alignment,n=m===yr,p=m===zr,q=or(m),r=Math.max(0,b.breadthLimit),s=Ar(b),t=b.nodeSpacing,v=Br(b),x=n||p?0:v/2,A=b.rowSpacing,y=0;if(n||p||b.dp||b.ep&&1===b.maxGenerationCount){y=Math.max(0,b.rowIndent)}var n=b.width,C=b.height,I=0,H=0,R=0,aa=0,S=0,N=0,Z=0,Ga=0,ua=0,Oa=0;q&&!sr(m)&&135<c&&e.reverse();if(sr(m)){if(1<h){for(k=0;k<h;k++){var l=e[k],na=l.Za;0===k%2&&k!==h-1?ua=Math.max(ua,(d?na.width:na.height)+Pr(l)-t):0!==k%2&&(Oa=Math.max(Oa,(d?na.width:na.height)+Pr(l)-t)) + }}else{1===h&&(ua=d?e[0].Za.width:e[0].Za.height)}}if(q){switch(m){case pr:case er:H=135>c?Cr(b,e,ua,I,H):Dr(b,e,ua,I,H);ua=H.x;I=H.width;H=H.height;break;case qr:for(k=0;k<h;k++){l=e[k],na=l.Za,r=0===Z?0:A,d?(l.ia.m(f-na.width,S+r),I=Math.max(I,na.width),H=Math.max(H,S+r+na.height),S+=r+na.height):(l.ia.m(aa+r,f-na.height),I=Math.max(I,aa+r+na.width),H=Math.max(H,na.height),aa+=r+na.width),Z++}break;case rr:for(f=0;f<h;f++){l=e[f],na=l.Za,r=0===Z?0:A,d?(l.ia.m(t/2+b.M.x,S+r),I=Math.max(I,na.width),H=Math.max(H,S+r+na.height),S+=r+na.height):(l.ia.m(aa+r,t/2+b.M.y),I=Math.max(I,aa+r+na.width),H=Math.max(H,na.height),aa+=r+na.width),Z++}}}else{for(k=0;k<h;k++){l=e[k],na=l.Za,d?(0<r&&0<Z&&aa+t+na.width>r&&(aa<f&&Fr(b,m,f-aa,0,Ga,k-1),N++,Z=0,Ga=k,R=H,aa=0,S=135<c?-H-A:H+A),Oa=0===Z?x:t,Gr(a,l,0,S),l.ia.m(aa+Oa,S),I=Math.max(I,aa+Oa+na.width),H=Math.max(H,R+(0===N?0:A)+na.height),aa+=Oa+na.width):(0<r&&0<Z&&S+t+na.height>r&&(S<f&&Fr(b,m,0,f-S,Ga,k-1),N++,Z=0,Ga=k,R=I,S=0,aa=135<c?-I-A:I+A),Oa=0===Z?x:t,Gr(a,l,aa,0),l.ia.m(aa,S+Oa),H=Math.max(H,S+Oa+na.height),I=Math.max(I,R+(0===N?0:A)+na.width),S+=Oa+na.height),Z++}}0<N&&(d?(H+=Math.max(0,s),aa<I&&Fr(b,m,I-aa,0,Ga,h-1),0<y&&(p||Ir(b,y,0,0,h-1),I+=y)):(I+=Math.max(0,s),S<H&&Fr(b,m,0,H-S,Ga,h-1),0<y&&(p||Ir(b,0,y,0,h-1),H+=y)));y=p=0;switch(m){case Kr:d?p+=I/2-b.M.x-v/2:y+=H/2-b.M.y-v/2;break;case nr:0<N?d?p+=I/2-b.M.x-v/2:y+=H/2-b.M.y-v/2:d?(m=e[0].ia.x+e[0].Ka.x,t=e[h-1].ia.x+e[h-1].Ka.x+2*e[h-1].M.x,p+=m+(t-m)/2-b.M.x-v/2):(m=e[0].ia.y+e[0].Ka.y,t=e[h-1].ia.y+e[h-1].Ka.y+2*e[h-1].M.y,y+=m+(t-m)/2-b.M.y-v/2);break;case yr:d?(p-=v,I+=v):(y-=v,H+=v);break;case zr:d?(p+=I-b.width+v,I+=v):(y+=H-b.height+v,H+=v);break;case pr:case er:d?p=1<h?p+(ua+t/2-b.M.x):p+(e[0].M.x-b.M.x+e[0].Ka.x):y=1<h?y+(ua+t/2-b.M.y):y+(e[0].M.y-b.M.y+e[0].Ka.y);break;case qr:d?p+=I+t/2-b.M.x:y+=H+t/2-b.M.y;break;case rr:break;default:u.k("Unhandled alignment value "+m.toString())}for(k=0;k<h;k++){l=e[k],d?l.ia.m(l.ia.x+l.Ka.x-p,l.ia.y+(135<c?(q?-H:-l.Za.height)+l.Ka.y-s:C+s+l.Ka.y)):l.ia.m(l.ia.x+(135<c?(q?-I:-l.Za.width)+l.Ka.x-s:n+s+l.Ka.x),l.ia.y+l.Ka.y-y)}d?(I=Lr(b,I,p),0>p&&(p=0),135<c&&(y+=H+s),H+=C+s):(135<c&&(p+=I+s),I+=n+s,H=Mr(b,H,y),0>y&&(y=0));b.Ka.m(p,y);b.Za.m(I,H)}}function Cr(a,b,c,d,e){var f=b.length;if(0===f){return new z(c,0,d,e)}if(1===f){var h=b[0];d=h.Za.width;e=h.Za.height;return new z(c,0,d,e)}for(var k=a.nodeSpacing,l=a.rowSpacing,m=90===xr(a),n=0,p=0,q=0,r=0;r<f;r++){if(!(0!==r%2||1<f&&r===f-1)){var h=b[r],s=h.Za,t=0===n?0:l;if(m){var v=Pr(h)-k;h.ia.m(c-(s.width+v),q+t);d=Math.max(d,s.width+v);e=Math.max(e,q+t+s.height);q+=t+s.height}else{v=Pr(h)-k,h.ia.m(p+t,c-(s.height+v)),e=Math.max(e,s.height+v),d=Math.max(d,p+t+s.width),p+=t+s.width}n++}}var n=0,x=p,A=q;m?(p=c+k,q=0):(p=0,q=c+k);for(r=0;r<f;r++){0!==r%2&&(h=b[r],s=h.Za,t=0===n?0:l,m?(v=Pr(h)-k,h.ia.m(p+v,q+t),d=Math.max(d,p+s.width+v),e=Math.max(e,q+t+s.height),q+=t+s.height):(v=Pr(h)-k,h.ia.m(p+t,q+v),d=Math.max(d,p+t+s.width),e=Math.max(e,q+s.height+v),p+=t+s.width),n++)}1<f&&1===f%2&&(h=b[f-1],s=h.Za,b=Qr(h,m?Math.max(Math.abs(A),Math.abs(q)):Math.max(Math.abs(x),Math.abs(p))),m?(h.ia.m(c+k/2-h.M.x-h.Ka.x,e+b),m=c+k/2-h.M.x-h.Ka.x,d=Math.max(d,m+s.width),0>m&&(d-=m),e=Math.max(e,Math.max(A,q)+b+s.height),0>h.ia.x&&(c=Wr(a,h.ia.x,!1,c,k))):(h.ia.m(d+b,c+k/2-h.M.y-h.Ka.y),d=Math.max(d,Math.max(x,p)+b+s.width),m=c+k/2-h.M.y-h.Ka.y,e=Math.max(e,m+s.height),0>m&&(e-=m),0>h.ia.y&&(c=Wr(a,h.ia.y,!0,c,k))));return new z(c,0,d,e)}function Dr(a,b,c,d,e){var f=b.length;if(0===f){return new z(c,0,d,e)}if(1===f){var h=b[0];d=h.Za.width;e=h.Za.height;return new z(c,0,d,e)}for(var k=a.nodeSpacing,l=a.rowSpacing,m=270===xr(a),n=0,p=0,q=0,r=0;r<f;r++){if(!(0!==r%2||1<f&&r===f-1)){var h=b[r],s=h.Za,t=0===n?0:l;if(m){var v=Pr(h)-k,q=q-(t+s.height);h.ia.m(c-(s.width+v),q);d=Math.max(d,s.width+v);e=Math.max(e,Math.abs(q))}else{v=Pr(h)-k,p-=t+s.width,h.ia.m(p,c-(s.height+v)),e=Math.max(e,s.height+v),d=Math.max(d,Math.abs(p))}n++}}var n=0,x=p,A=q;m?(p=c+k,q=0):(p=0,q=c+k);for(r=0;r<f;r++){0!==r%2&&(h=b[r],s=h.Za,t=0===n?0:l,m?(v=Pr(h)-k,q-=t+s.height,h.ia.m(p+v,q),d=Math.max(d,p+s.width+v),e=Math.max(e,Math.abs(q))):(v=Pr(h)-k,p-=t+s.width,h.ia.m(p,q+v),e=Math.max(e,q+s.height+v),d=Math.max(d,Math.abs(p))),n++)}1<f&&1===f%2&&(h=b[f-1],s=h.Za,l=Qr(h,m?Math.max(Math.abs(A),Math.abs(q)):Math.max(Math.abs(x),Math.abs(p))),m?(h.ia.m(c+k/2-h.M.x-h.Ka.x,-e-s.height-l),p=c+k/2-h.M.x-h.Ka.x,d=Math.max(d,p+s.width),0>p&&(d-=p),e=Math.max(e,Math.abs(Math.min(A,q))+l+s.height),0>h.ia.x&&(c=Wr(a,h.ia.x,!1,c,k))):(h.ia.m(-d-s.width-l,c+k/2-h.M.y-h.Ka.y),d=Math.max(d,Math.abs(Math.min(x,p))+l+s.width),p=c+k/2-h.M.y-h.Ka.y,e=Math.max(e,p+s.height),0>p&&(e-=p),0>h.ia.y&&(c=Wr(a,h.ia.y,!0,c,k))));for(r=0;r<f;r++){h=b[r],m?h.ia.m(h.ia.x,h.ia.y+e):h.ia.m(h.ia.x+d,h.ia.y)}return new z(c,0,d,e)}function Pr(a){return null===a.parent?0:a.parent.nodeSpacing}function Qr(a){return null===a.parent?0:a.parent.rowSpacing}function Wr(a,b,c,d,e){a=a.children; + for(var f=a.length,h=0;h<f;h++){c?a[h].ia.m(a[h].ia.x,a[h].ia.y-b):a[h].ia.m(a[h].ia.x-b,a[h].ia.y)}b=a[f-1];return Math.max(d,c?b.Ka.y+b.M.y-e/2:b.Ka.x+b.M.x-e/2)}function Lr(a,b,c){switch(a.alignment){case nr:case Kr:var d=b;c+a.width>d&&(d=c+a.width);0>c&&(d-=c);return d;case yr:return a.width>b?a.width:b;case zr:return 2*a.M.x>b?a.width:b+a.width-2*a.M.x;case pr:case er:return d=Math.min(0,c),c=Math.max(b,c+a.width),Math.max(a.width,c-d);case qr:return a.width-a.M.x+a.nodeSpacing/2+b;case rr:return Math.max(a.width,a.M.x+a.nodeSpacing/2+b);default:return b}}function Mr(a,b,c){switch(a.alignment){case nr:case Kr:var d=b;c+a.height>d&&(d=c+a.height);0>c&&(d-=c);return d;case yr:return a.height>b?a.height:b;case zr:return 2*a.M.y>b?a.height:b+a.height-2*a.M.y;case pr:case er:return d=Math.min(0,c),c=Math.max(b,c+a.height),Math.max(a.height,c-d);case qr:return a.height-a.M.y+a.nodeSpacing/2+b;case rr:return Math.max(a.height,a.M.y+a.nodeSpacing/2+b);default:return b}}function Nr(a,b,c){switch(a){case Kr:b/=2;c/=2;break;case nr:b/=2;c/=2;break;case yr:c=b=0;break;case zr:break;default:u.k("Unhandled alignment value "+a.toString())}return new w(b,c)}function Fr(a,b,c,d,e,f){b=Nr(b,c,d);Ir(a,b.x,b.y,e,f)}function Ir(a,b,c,d,e){if(0!==b||0!==c){for(a=a.children;d<=e;d++){var f=a[d].ia;f.x+=b;f.y+=c}}}function Gr(a,b,c,d){var e=b.parent;switch(a.Bf){case Qq:for(a=b.kc;a.next();){b=a.value,b.fromVertex===e&&b.pr.m(c,d)}break;case Xq:for(a=b.cc;a.next();){b=a.value,b.toVertex===e&&b.pr.m(c,d)}break;default:u.k("Unhandled path value "+a.Bf.toString())}}function Jr(a,b,c){for(var d=0;d<a.length;d++){var e=a[d];e.x+=b;e.y+=c}}function Hr(a,b,c,d,e,f,h,k){var l=xr(b),m=90===l||270===l,n=b.nodeSpacing;b=d;var p=e;d=f;e=h;var q=c.Ts,r=c.kt;h=c.Za;var s=m?Math.max(e,h.height):Math.max(d,h.width);if(null===q||l!==xr(c)){q=Er(a,2),r=Er(a,2),m?(q[0].m(0,0),q[1].m(0,h.height),r[0].m(h.width,0),r[1].m(r[0].x,q[1].y)):(q[0].m(0,0),q[1].m(h.width,0),r[0].m(0,h.height),r[1].m(q[1].x,r[0].y))}if(m){c=d;d=9999999;if(!(null===p||2>p.length||null===q||2>q.length)){for(m=l=0;l<p.length&&m<q.length;){e=p[l];var t=q[m];f=t.x;var v=t.y;f+=c;var x=e;l+1<p.length&&(x=p[l+1]);var A=t,t=A.x,A=A.y;m+1<q.length&&(A=q[m+1],t=A.x,A=A.y,t+=c);var y=d;e.y===v?y=f-e.x:e.y>v&&e.y<A?y=f+(e.y-v)/(A-v)*(t-f)-e.x:v>e.y&&v<x.y&&(y=f-(e.x+(v-e.y)/(x.y-e.y)*(x.x-e.x)));y<d&&(d=y);x.y<=e.y?l++:A<=v?m++:(x.y<=A&&l++,A<=x.y&&m++)}}c-=d;c+=n;l=q;m=c;if(null===b||2>b.length||null===l||2>l.length){d=null}else{n=Er(a,b.length+l.length);for(d=f=e=0;f<l.length&&l[f].y<b[0].y;){v=l[f++],n[d++].m(v.x+m,v.y)}for(;e<b.length;){v=b[e++],n[d++].m(v.x,v.y)}for(e=b[b.length-1].y;f<l.length&&l[f].y<=e;){f++}for(;f<l.length&&l[f].y>e;){v=l[f++],n[d++].m(v.x+m,v.y)}l=Er(a,d);for(e=0;e<d;e++){l[e].assign(n[e])}Or(a,n);d=l}f=r;v=c;if(null===p||2>p.length||null===f||2>f.length){e=null}else{n=Er(a,p.length+f.length);for(m=x=l=0;l<p.length&&p[l].y<f[0].y;){e=p[l++],n[m++].m(e.x,e.y)}for(;x<f.length;){e=f[x++],n[m++].m(e.x+v,e.y)}for(f=f[f.length-1].y;l<p.length&&p[l].y<=f;){l++}for(;l<p.length&&p[l].y>f;){e=p[l++],n[m++].m(e.x,e.y)}e=Er(a,m);for(l=0;l<m;l++){e[l].assign(n[l])}Or(a,n)}f=Math.max(0,c)+h.width;h=s}else{c=e;d=9999999;if(!(null===p||2>p.length||null===q||2>q.length)){for(m=l=0;l<p.length&&m<q.length;){e=p[l],t=q[m],f=t.x,v=t.y,v+=c,x=e,l+1<p.length&&(x=p[l+1]),A=t,t=A.x,A=A.y,m+1<q.length&&(A=q[m+1],t=A.x,A=A.y,A+=c),y=d,e.x===f?y=v-e.y:e.x>f&&e.x<t?y=v+(e.x-f)/(t-f)*(A-v)-e.y:f>e.x&&f<x.x&&(y=v-(e.y+(f-e.x)/(x.x-e.x)*(x.y-e.y))),y<d&&(d=y),x.x<=e.x?l++:t<=f?m++:(x.x<=t&&l++,t<=x.x&&m++)}}c-=d;c+=n;l=q;m=c;if(null===b||2>b.length||null===l||2>l.length){d=null}else{n=Er(a,b.length+l.length);for(d=f=e=0;f<l.length&&l[f].x<b[0].x;){v=l[f++],n[d++].m(v.x,v.y+m)}for(;e<b.length;){v=b[e++],n[d++].m(v.x,v.y)}for(e=b[b.length-1].x;f<l.length&&l[f].x<=e;){f++}for(;f<l.length&&l[f].x>e;){v=l[f++],n[d++].m(v.x,v.y+m)}l=Er(a,d);for(e=0;e<d;e++){l[e].assign(n[e])}Or(a,n);d=l}f=r;v=c;if(null===p||2>p.length||null===f||2>f.length){e=null}else{n=Er(a,p.length+f.length);for(m=x=l=0;l<p.length&&p[l].x<f[0].x;){e=p[l++],n[m++].m(e.x,e.y)}for(;x<f.length;){e=f[x++],n[m++].m(e.x,e.y+v)}for(f=f[f.length-1].x;l<p.length&&p[l].x<=f;){l++}for(;l<p.length&&p[l].x>f;){e=p[l++],n[m++].m(e.x,e.y)}e=Er(a,m);for(l=0;l<m;l++){e[l].assign(n[l])}Or(a,n)}f=s;h=Math.max(0,c)+h.height}Or(a,b);Or(a,q);Or(a,p);Or(a,r);k[0]=d;k[1]=e;return new z(c,0,f,h)}function Er(a,b){var c=a.Cy[b];if(void 0!==c&&(c=c.pop(),void 0!==c)){return c}for(var c=[],d=0;d<b;d++){c[d]=new w}return c}function Or(a,b){var c=b.length,d=a.Cy[c];void 0===d&&(d=[],a.Cy[c]=d);d.push(b)}Y.prototype.arrangeTrees=function(){if(this.Zc===Wq){for(var a=this.od.i;a.next();){var b=a.value;if(b instanceof Uq){var c=b.Bc;if(null!==c){var d=c.position,c=d.x,d=d.y;isFinite(c)||(c=0);isFinite(d)||(d=0);Xr(this,b,c,d)}}}}else{for(a=this.Vd,b=a.x,c=a.y,a=this.od.i;a.next();){if(d=a.value,d instanceof Uq){switch(Xr(this,d,b+d.Ka.x,c+d.Ka.y),this.Zc){case Tq:c+=d.Za.height+this.Vf.height; + break;case Yr:b+=d.Za.width+this.Vf.width;break;default:u.k("Unhandled arrangement value "+this.Zc.toString())}}}}};function Xr(a,b,c,d){if(null!==b){b.x=c;b.y=d;b=b.children;for(var e=b.length,f=0;f<e;f++){var h=b[f];Xr(a,h,c+h.ia.x,d+h.ia.y)}}}Y.prototype.commitLayout=function(){this.dA();this.commitNodes();this.Uy();this.Rs&&this.commitLinks()};Y.prototype.commitNodes=function(){for(var a=this.network.vertexes.i;a.next();){a.value.commit()}for(a.reset();a.next();){this.layoutComments(a.value)}};Y.prototype.Uy=function(){if(this.xz===br){for(var a=this.BA,b=[],c=null,d=this.network.vertexes.i;d.next();){var e=d.value;null===c?c=e.mb.copy():c.Uh(e.mb);var f=b[e.level],f=void 0===f?Ar(e):Math.max(f,Ar(e));b[e.level]=f}for(d=0;d<b.length;d++){void 0===b[d]&&(b[d]=0)}90===this.angle||270===this.angle?(c.Kf(this.nodeSpacing/2,this.layerSpacing),e=new w(-this.nodeSpacing/2,-this.layerSpacing/2)):(c.Kf(this.layerSpacing,this.nodeSpacing/2),e=new w(-this.layerSpacing/2,-this.nodeSpacing/2));var f=[],c=90===this.angle||270===this.angle?c.width:c.height,h=0;if(180===this.angle||270===this.angle){for(d=0;d<a.length;d++){h+=a[d]+b[d]}}for(d=0;d<a.length;d++){var k=a[d]+b[d];270===this.angle?(h-=k,f.push(new z(0,h,c,k))):90===this.angle?(f.push(new z(0,h,c,k)),h+=k):180===this.angle?(h-=k,f.push(new z(h,0,k,c))):(f.push(new z(h,0,k,c)),h+=k)}this.commitLayers(f,e)}};Y.prototype.commitLayers=function(){};Y.prototype.commitLinks=function(){for(var a=this.network.edges.i;a.next();){a.value.commit()}};Y.prototype.dA=function(){for(var a=this.od.i;a.next();){var b=a.value;b instanceof Uq&&Zr(this,b)}};function Zr(a,b){if(null!==b){a.setPortSpots(b);for(var c=b.children,d=c.length,e=0;e<d;e++){Zr(a,c[e])}}}Y.prototype.setPortSpots=function(a){var b=a.alignment;if(or(b)){var c=this.Bf===Qq,d=xr(a),e;switch(d){case 0:e=xc;break;case 90:e=Cc;break;case 180:e=wc;break;default:e=vc}var f=a.children,h=f.length;switch(b){case pr:case er:for(b=0;b<h;b++){var k=f[b],k=(c?k.kc:k.cc).first();if(null!==k&&(k=k.link,null!==k)){var l=90===d||270===d?wc:vc;if(1===h||b===h-1&&1===h%2){switch(d){case 0:l=wc;break;case 90:l=vc;break;case 180:l=xc;break;default:l=Cc}}else{0===b%2&&(l=90===d||270===d?xc:Cc)}c?(a.setsPortSpot&&(k.vb=e),a.setsChildPortSpot&&(k.xb=l)):(a.setsPortSpot&&(k.vb=l),a.setsChildPortSpot&&(k.xb=e))}}break;case qr:l=90===d||270===d?xc:Cc;for(d=c?a.cc:a.kc;d.next();){k=d.value.link,null!==k&&(c?(a.setsPortSpot&&(k.vb=e),a.setsChildPortSpot&&(k.xb=l)):(a.setsPortSpot&&(k.vb=l),a.setsChildPortSpot&&(k.xb=e)))}break;case rr:for(l=90===d||270===d?wc:vc,d=c?a.cc:a.kc;d.next();){k=d.value.link,null!==k&&(c?(a.setsPortSpot&&(k.vb=e),a.setsChildPortSpot&&(k.xb=l)):(a.setsPortSpot&&(k.vb=l),a.setsChildPortSpot&&(k.xb=e)))}}}else{if(c=xr(a),this.Bf===Qq){for(e=a.cc;e.next();){if(d=e.value.link,null!==d){if(a.setsPortSpot){if(a.portSpot.Kc()){switch(c){case 0:d.vb=xc;break;case 90:d.vb=Cc;break;case 180:d.vb=wc;break;default:d.vb=vc}}else{d.vb=a.portSpot}}if(a.setsChildPortSpot){if(a.childPortSpot.Kc()){switch(c){case 0:d.xb=wc;break;case 90:d.xb=vc;break;case 180:d.xb=xc;break;default:d.xb=Cc}}else{d.xb=a.childPortSpot}}}}}else{for(e=a.kc;e.next();){if(d=e.value.link,null!==d){if(a.setsPortSpot){if(a.portSpot.Kc()){switch(c){case 0:d.xb=xc;break;case 90:d.xb=Cc;break;case 180:d.xb=wc;break;default:d.xb=vc}}else{d.xb=a.portSpot}}if(a.setsChildPortSpot){if(a.childPortSpot.Kc()){switch(c){case 0:d.vb=wc;break;case 90:d.vb=vc;break;case 180:d.vb=xc;break;default:d.vb=Cc}}else{d.vb=a.childPortSpot}}}}}}};function xr(a){a=a.angle;return 45>=a?0:135>=a?90:225>=a?180:315>=a?270:0}function Ar(a){var b=xr(a),b=90===b||270===b,c=a.layerSpacing;if(0<a.layerSpacingParentOverlap){var d=Math.min(1,a.layerSpacingParentOverlap),c=c-(b?a.height*d:a.width*d)}c<(b?-a.height:-a.width)&&(c=b?-a.height:-a.width);return c}function Br(a){var b=xr(a),b=90===b||270===b,c=a.nodeIndent;if(0<a.nodeIndentPastParent){var d=Math.min(1,a.nodeIndentPastParent),c=c+(b?a.width*d:a.height*d)}return c=Math.max(0,c)}u.defineProperty(Y,{uK:"roots"},function(){return this.od},function(a){this.od!==a&&(u.C(a,F,Y,"roots"),this.od=a,this.H())});u.defineProperty(Y,{path:"path"},function(){return this.hr},function(a){this.hr!==a&&(u.rb(a,Y,Y,"path"),this.hr=a,this.H())});u.defineProperty(Y,{DI:"treeStyle"},function(){return this.Yr},function(a){this.Zc!==a&&(u.rb(a,Y,Y,"treeStyle"),a===Rq||a===hr||a===ir||a===gr)&&(this.Yr=a,this.H())});u.defineProperty(Y,{xz:"layerStyle"},function(){return this.Eu},function(a){this.Zc!==a&&(u.rb(a,Y,Y,"layerStyle"),a===Sq||a===cr||a===br)&&(this.Eu=a,this.H())});u.defineProperty(Y,{comments:"comments"},function(){return this.qh},function(a){this.qh!==a&&(u.j(a,"boolean",Y,"comments"),this.qh=a,this.H())});u.defineProperty(Y,{Hf:"arrangement"},function(){return this.Zc},function(a){this.Zc!==a&&(u.rb(a,Y,Y,"arrangement"),a===Tq||a===Yr||a===Wq)&&(this.Zc=a,this.H())});u.defineProperty(Y,{QC:"arrangementSpacing"},function(){return this.Vf},function(a){u.C(a,ia,Y,"arrangementSpacing"); + this.Vf.L(a)||(this.Vf.assign(a),this.H())});u.defineProperty(Y,{tK:"rootDefaults"},function(){return this.ra},function(a){this.ra!==a&&(u.C(a,Uq,Y,"rootDefaults"),this.ra=a,this.H())});u.defineProperty(Y,{TI:"alternateDefaults"},function(){return this.qa},function(a){this.qa!==a&&(u.C(a,Uq,Y,"alternateDefaults"),this.qa=a,this.H())});u.defineProperty(Y,{sorting:"sorting"},function(){return this.ra.sorting},function(a){this.ra.sorting!==a&&(u.rb(a,Y,Y,"sorting"),a===jr||a===kr||a===lr||mr)&&(this.ra.sorting=a,this.H())});u.defineProperty(Y,{comparer:"comparer"},function(){return this.ra.comparer},function(a){this.ra.comparer!==a&&(u.j(a,"function",Y,"comparer"),this.ra.comparer=a,this.H())});u.defineProperty(Y,{angle:"angle"},function(){return this.ra.angle},function(a){this.ra.angle!==a&&(u.j(a,"number",Y,"angle"),0===a||90===a||180===a||270===a)&&(this.ra.angle=a,this.H())});u.defineProperty(Y,{alignment:"alignment"},function(){return this.ra.alignment},function(a){this.ra.alignment!==a&&(u.rb(a,Y,Y,"alignment"),this.ra.alignment=a,this.H())});u.defineProperty(Y,{nodeIndent:"nodeIndent"},function(){return this.ra.nodeIndent},function(a){this.ra.nodeIndent!==a&&(u.j(a,"number",Y,"nodeIndent"),0<=a&&(this.ra.nodeIndent=a,this.H()))});u.defineProperty(Y,{nodeIndentPastParent:"nodeIndentPastParent"},function(){return this.ra.nodeIndentPastParent},function(a){this.ra.nodeIndentPastParent!==a&&(u.j(a,"number",Y,"nodeIndentPastParent"),0<=a&&1>=a&&(this.ra.nodeIndentPastParent=a,this.H()))});u.defineProperty(Y,{nodeSpacing:"nodeSpacing"},function(){return this.ra.nodeSpacing},function(a){this.ra.nodeSpacing!==a&&(u.j(a,"number",Y,"nodeSpacing"),this.ra.nodeSpacing=a,this.H())});u.defineProperty(Y,{layerSpacing:"layerSpacing"},function(){return this.ra.layerSpacing},function(a){this.ra.layerSpacing!==a&&(u.j(a,"number",Y,"layerSpacing"),this.ra.layerSpacing=a,this.H())});u.defineProperty(Y,{layerSpacingParentOverlap:"layerSpacingParentOverlap"},function(){return this.ra.layerSpacingParentOverlap},function(a){this.ra.layerSpacingParentOverlap!==a&&(u.j(a,"number",Y,"layerSpacingParentOverlap"),0<=a&&1>=a&&(this.ra.layerSpacingParentOverlap=a,this.H()))});u.defineProperty(Y,{compaction:"compaction"},function(){return this.ra.compaction},function(a){this.ra.compaction!==a&&(u.rb(a,Y,Y,"compaction"),a===ur||a===wr)&&(this.ra.compaction=a,this.H())});u.defineProperty(Y,{breadthLimit:"breadthLimit"},function(){return this.ra.breadthLimit},function(a){this.ra.breadthLimit!==a&&(u.j(a,"number",Y,"breadthLimit"),0<=a&&(this.ra.breadthLimit=a,this.H()))});u.defineProperty(Y,{rowSpacing:"rowSpacing"},function(){return this.ra.rowSpacing},function(a){this.ra.rowSpacing!==a&&(u.j(a,"number",Y,"rowSpacing"),this.ra.rowSpacing=a,this.H())});u.defineProperty(Y,{rowIndent:"rowIndent"},function(){return this.ra.rowIndent},function(a){this.ra.rowIndent!==a&&(u.j(a,"number",Y,"rowIndent"),0<=a&&(this.ra.rowIndent=a,this.H()))});u.defineProperty(Y,{commentSpacing:"commentSpacing"},function(){return this.ra.commentSpacing},function(a){this.ra.commentSpacing!==a&&(u.j(a,"number",Y,"commentSpacing"),this.ra.commentSpacing=a,this.H())});u.defineProperty(Y,{commentMargin:"commentMargin"},function(){return this.ra.commentMargin},function(a){this.ra.commentMargin!==a&&(u.j(a,"number",Y,"commentMargin"),this.ra.commentMargin=a,this.H())});u.defineProperty(Y,{setsPortSpot:"setsPortSpot"},function(){return this.ra.setsPortSpot},function(a){this.ra.setsPortSpot!==a&&(u.j(a,"boolean",Y,"setsPortSpot"),this.ra.setsPortSpot=a,this.H())});u.defineProperty(Y,{portSpot:"portSpot"},function(){return this.ra.portSpot},function(a){u.C(a,L,Y,"portSpot");this.ra.portSpot.L(a)||(this.ra.portSpot=a,this.H())});u.defineProperty(Y,{setsChildPortSpot:"setsChildPortSpot"},function(){return this.ra.setsChildPortSpot},function(a){this.ra.setsChildPortSpot!==a&&(u.j(a,"boolean",Y,"setsChildPortSpot"),this.ra.setsChildPortSpot=a,this.H())});u.defineProperty(Y,{childPortSpot:"childPortSpot"},function(){return this.ra.childPortSpot},function(a){u.C(a,L,Y,"childPortSpot");this.ra.childPortSpot.L(a)||(this.ra.childPortSpot=a,this.H())});u.defineProperty(Y,{dJ:"alternateSorting"},function(){return this.qa.sorting},function(a){this.qa.sorting!==a&&(u.rb(a,Y,Y,"alternateSorting"),a===jr||a===kr||a===lr||mr)&&(this.qa.sorting=a,this.H())});u.defineProperty(Y,{SI:"alternateComparer"},function(){return this.qa.comparer},function(a){this.qa.comparer!==a&&(u.j(a,"function",Y,"alternateComparer"),this.qa.comparer=a,this.H())});u.defineProperty(Y,{LI:"alternateAngle"},function(){return this.qa.angle},function(a){this.qa.angle!==a&&(u.j(a,"number",Y,"alternateAngle"),0===a||90===a||180===a||270===a)&&(this.qa.angle=a,this.H())});u.defineProperty(Y,{KI:"alternateAlignment"},function(){return this.qa.alignment},function(a){this.qa.alignment!==a&&(u.rb(a,Y,Y,"alternateAlignment"),this.qa.alignment=a,this.H())});u.defineProperty(Y,{WI:"alternateNodeIndent"},function(){return this.qa.nodeIndent + },function(a){this.qa.nodeIndent!==a&&(u.j(a,"number",Y,"alternateNodeIndent"),0<=a&&(this.qa.nodeIndent=a,this.H()))});u.defineProperty(Y,{XI:"alternateNodeIndentPastParent"},function(){return this.qa.nodeIndentPastParent},function(a){this.qa.nodeIndentPastParent!==a&&(u.j(a,"number",Y,"alternateNodeIndentPastParent"),0<=a&&1>=a&&(this.qa.nodeIndentPastParent=a,this.H()))});u.defineProperty(Y,{YI:"alternateNodeSpacing"},function(){return this.qa.nodeSpacing},function(a){this.qa.nodeSpacing!==a&&(u.j(a,"number",Y,"alternateNodeSpacing"),this.qa.nodeSpacing=a,this.H())});u.defineProperty(Y,{UI:"alternateLayerSpacing"},function(){return this.qa.layerSpacing},function(a){this.qa.layerSpacing!==a&&(u.j(a,"number",Y,"alternateLayerSpacing"),this.qa.layerSpacing=a,this.H())});u.defineProperty(Y,{VI:"alternateLayerSpacingParentOverlap"},function(){return this.qa.layerSpacingParentOverlap},function(a){this.qa.layerSpacingParentOverlap!==a&&(u.j(a,"number",Y,"alternateLayerSpacingParentOverlap"),0<=a&&1>=a&&(this.qa.layerSpacingParentOverlap=a,this.H()))});u.defineProperty(Y,{RI:"alternateCompaction"},function(){return this.qa.compaction},function(a){this.qa.compaction!==a&&(u.rb(a,Y,Y,"alternateCompaction"),a===ur||a===wr)&&(this.qa.compaction=a,this.H())});u.defineProperty(Y,{MI:"alternateBreadthLimit"},function(){return this.qa.breadthLimit},function(a){this.qa.breadthLimit!==a&&(u.j(a,"number",Y,"alternateBreadthLimit"),0<=a&&(this.qa.breadthLimit=a,this.H()))});u.defineProperty(Y,{aJ:"alternateRowSpacing"},function(){return this.qa.rowSpacing},function(a){this.qa.rowSpacing!==a&&(u.j(a,"number",Y,"alternateRowSpacing"),this.qa.rowSpacing=a,this.H())});u.defineProperty(Y,{$I:"alternateRowIndent"},function(){return this.qa.rowIndent},function(a){this.qa.rowIndent!==a&&(u.j(a,"number",Y,"alternateRowIndent"),0<=a&&(this.qa.rowIndent=a,this.H()))});u.defineProperty(Y,{QI:"alternateCommentSpacing"},function(){return this.qa.commentSpacing},function(a){this.qa.commentSpacing!==a&&(u.j(a,"number",Y,"alternateCommentSpacing"),this.qa.commentSpacing=a,this.H())});u.defineProperty(Y,{OI:"alternateCommentMargin"},function(){return this.qa.commentMargin},function(a){this.qa.commentMargin!==a&&(u.j(a,"number",Y,"alternateCommentMargin"),this.qa.commentMargin=a,this.H())});u.defineProperty(Y,{cJ:"alternateSetsPortSpot"},function(){return this.qa.setsPortSpot},function(a){this.qa.setsPortSpot!==a&&(u.j(a,"boolean",Y,"alternateSetsPortSpot"),this.qa.setsPortSpot=a,this.H())});u.defineProperty(Y,{ZI:"alternatePortSpot"},function(){return this.qa.portSpot},function(a){u.C(a,L,Y,"alternatePortSpot");this.qa.portSpot.L(a)||(this.qa.portSpot=a,this.H())});u.defineProperty(Y,{bJ:"alternateSetsChildPortSpot"},function(){return this.qa.setsChildPortSpot},function(a){this.qa.setsChildPortSpot!==a&&(u.j(a,"boolean",Y,"alternateSetsChildPortSpot"),this.qa.setsChildPortSpot=a,this.H())});u.defineProperty(Y,{NI:"alternateChildPortSpot"},function(){return this.qa.childPortSpot},function(a){u.C(a,L,Y,"alternateChildPortSpot");this.qa.childPortSpot.L(a)||(this.qa.childPortSpot=a,this.H())});var Pq;Y.PathDefault=Pq=u.s(Y,"PathDefault",-1);var Qq;Y.PathDestination=Qq=u.s(Y,"PathDestination",0);var Xq;Y.PathSource=Xq=u.s(Y,"PathSource",1);var jr;Y.SortingForwards=jr=u.s(Y,"SortingForwards",10);var kr;Y.SortingReverse=kr=u.s(Y,"SortingReverse",11);var lr;Y.SortingAscending=lr=u.s(Y,"SortingAscending",12);var mr;Y.SortingDescending=mr=u.s(Y,"SortingDescending",13);var Kr;Y.AlignmentCenterSubtrees=Kr=u.s(Y,"AlignmentCenterSubtrees",20);var nr;Y.AlignmentCenterChildren=nr=u.s(Y,"AlignmentCenterChildren",21);var yr;Y.AlignmentStart=yr=u.s(Y,"AlignmentStart",22);var zr;Y.AlignmentEnd=zr=u.s(Y,"AlignmentEnd",23);var pr;Y.AlignmentBus=pr=u.s(Y,"AlignmentBus",24);var er;Y.AlignmentBusBranching=er=u.s(Y,"AlignmentBusBranching",25);var qr;Y.AlignmentTopLeftBus=qr=u.s(Y,"AlignmentTopLeftBus",26);var rr;Y.AlignmentBottomRightBus=rr=u.s(Y,"AlignmentBottomRightBus",27);var ur;Y.CompactionNone=ur=u.s(Y,"CompactionNone",30);var wr;Y.CompactionBlock=wr=u.s(Y,"CompactionBlock",31);var Rq;Y.StyleLayered=Rq=u.s(Y,"StyleLayered",40);var ir;Y.StyleLastParents=ir=u.s(Y,"StyleLastParents",41);var hr;Y.StyleAlternating=hr=u.s(Y,"StyleAlternating",42);var gr;Y.StyleRootOnly=gr=u.s(Y,"StyleRootOnly",43);var Tq;Y.ArrangementVertical=Tq=u.s(Y,"ArrangementVertical",50);var Yr;Y.ArrangementHorizontal=Yr=u.s(Y,"ArrangementHorizontal",51);var Wq;Y.ArrangementFixedRoots=Wq=u.s(Y,"ArrangementFixedRoots",52);var Sq;Y.LayerIndividual=Sq=u.s(Y,"LayerIndividual",60);var cr;Y.LayerSiblings=cr=u.s(Y,"LayerSiblings",61);var br;Y.LayerUniform=br=u.s(Y,"LayerUniform",62);function Vq(){xa.call(this)}u.Ha(Vq,xa);u.fa("TreeNetwork",Vq);Vq.prototype.createVertex=function(){return new Uq};Vq.prototype.createEdge=function(){return new $r};function Uq(){ya.call(this);this.initialized=!1;this.parent=null;this.children=[];this.maxGenerationCount=this.maxChildrenCount=this.descendantCount=this.level=0; + this.comments=null;this.ia=new w(0,0);this.Za=new ia(0,0);this.Ka=new w(0,0);this.ep=this.dp=this.cI=!1;this.kt=this.Ts=null;this.sorting=jr;this.comparer=dp;this.angle=0;this.alignment=nr;this.nodeIndentPastParent=this.nodeIndent=0;this.nodeSpacing=20;this.layerSpacing=50;this.layerSpacingParentOverlap=0;this.compaction=wr;this.breadthLimit=0;this.rowSpacing=25;this.commentSpacing=this.rowIndent=10;this.commentMargin=20;this.setsPortSpot=!0;this.portSpot=uc;this.setsChildPortSpot=!0;this.childPortSpot=uc}u.Ha(Uq,ya);u.fa("TreeVertex",Uq);Uq.prototype.copyInheritedPropertiesFrom=function(a){null!==a&&(this.sorting=a.sorting,this.comparer=a.comparer,this.angle=a.angle,this.alignment=a.alignment,this.nodeIndent=a.nodeIndent,this.nodeIndentPastParent=a.nodeIndentPastParent,this.nodeSpacing=a.nodeSpacing,this.layerSpacing=a.layerSpacing,this.layerSpacingParentOverlap=a.layerSpacingParentOverlap,this.compaction=a.compaction,this.breadthLimit=a.breadthLimit,this.rowSpacing=a.rowSpacing,this.rowIndent=a.rowIndent,this.commentSpacing=a.commentSpacing,this.commentMargin=a.commentMargin,this.setsPortSpot=a.setsPortSpot,this.portSpot=a.portSpot,this.setsChildPortSpot=a.setsChildPortSpot,this.childPortSpot=a.childPortSpot)};u.u(Uq,{um:"childrenCount"},function(){return this.children.length});u.defineProperty(Uq,{sK:"relativePosition"},function(){return this.ia},function(a){this.ia.set(a)});u.defineProperty(Uq,{CK:"subtreeSize"},function(){return this.Za},function(a){this.Za.set(a)});u.defineProperty(Uq,{BK:"subtreeOffset"},function(){return this.Ka},function(a){this.Ka.set(a)});function $r(){Aa.call(this);this.pr=new w(0,0)}u.Ha($r,Aa);u.fa("TreeEdge",$r);$r.prototype.commit=function(){var a=this.link;if(null!==a&&!a.el){var b=this.network.Qb,c=null,d=null;switch(b.Bf){case Qq:c=this.fromVertex;d=this.toVertex;break;case Xq:c=this.toVertex;d=this.fromVertex;break;default:u.k("Unhandled path value "+b.Bf.toString())}if(null!==c&&null!==d){if(b=this.pr,0!==b.x||0!==b.y||c.cI){var d=c.mb,e=xr(c),f=Ar(c),h=c.rowSpacing;a.updateRoute();var k=a.We===kh,l=a.ec,m=0,n,p;a.sl();if(l||k){for(m=2;4<a.ka;){a.oE(2)}n=a.l(1);p=a.l(2)}else{for(m=1;3<a.ka;){a.oE(1)}n=a.l(0);p=a.l(a.ka-1)}var q=a.l(a.ka-1),r=0;0===e?(c.alignment===zr?(r=d.bottom+b.y,0===b.y&&n.y>q.y+c.rowIndent&&(r=Math.min(r,Math.max(n.y,r-Br(c))))):c.alignment===yr?(r=d.top+b.y,0===b.y&&n.y<q.y-c.rowIndent&&(r=Math.max(r,Math.min(n.y,r+Br(c))))):r=c.dp||c.ep&&1===c.maxGenerationCount?d.top-c.Ka.y+b.y:d.y+d.height/2+b.y,k?(a.w(m,n.x,r),m++,a.w(m,d.right+f,r),m++,a.w(m,d.right+f+(b.x-h)/3,r),m++,a.w(m,d.right+f+2*(b.x-h)/3,r),m++,a.w(m,d.right+f+(b.x-h),r),m++,a.w(m,p.x,r)):(l&&(a.w(m,d.right+f/2,n.y),m++),a.w(m,d.right+f/2,r),m++,a.w(m,d.right+f+b.x-(l?h/2:h),r),m++,l&&a.w(m,a.l(m-1).x,p.y))):90===e?(c.alignment===zr?(r=d.right+b.x,0===b.x&&n.x>q.x+c.rowIndent&&(r=Math.min(r,Math.max(n.x,r-Br(c))))):c.alignment===yr?(r=d.left+b.x,0===b.x&&n.x<q.x-c.rowIndent&&(r=Math.max(r,Math.min(n.x,r+Br(c))))):r=c.dp||c.ep&&1===c.maxGenerationCount?d.left-c.Ka.x+b.x:d.x+d.width/2+b.x,k?(a.w(m,r,n.y),m++,a.w(m,r,d.bottom+f),m++,a.w(m,r,d.bottom+f+(b.y-h)/3),m++,a.w(m,r,d.bottom+f+2*(b.y-h)/3),m++,a.w(m,r,d.bottom+f+(b.y-h)),m++,a.w(m,r,p.y)):(l&&(a.w(m,n.x,d.bottom+f/2),m++),a.w(m,r,d.bottom+f/2),m++,a.w(m,r,d.bottom+f+b.y-(l?h/2:h)),m++,l&&a.w(m,p.x,a.l(m-1).y))):180===e?(c.alignment===zr?(r=d.bottom+b.y,0===b.y&&n.y>q.y+c.rowIndent&&(r=Math.min(r,Math.max(n.y,r-Br(c))))):c.alignment===yr?(r=d.top+b.y,0===b.y&&n.y<q.y-c.rowIndent&&(r=Math.max(r,Math.min(n.y,r+Br(c))))):r=c.dp||c.ep&&1===c.maxGenerationCount?d.top-c.Ka.y+b.y:d.y+d.height/2+b.y,k?(a.w(m,n.x,r),m++,a.w(m,d.left-f,r),m++,a.w(m,d.left-f+(b.x+h)/3,r),m++,a.w(m,d.left-f+2*(b.x+h)/3,r),m++,a.w(m,d.left-f+(b.x+h),r),m++,a.w(m,p.x,r)):(l&&(a.w(m,d.left-f/2,n.y),m++),a.w(m,d.left-f/2,r),m++,a.w(m,d.left-f+b.x+(l?h/2:h),r),m++,l&&a.w(m,a.l(m-1).x,p.y))):270===e?(c.alignment===zr?(r=d.right+b.x,0===b.x&&n.x>q.x+c.rowIndent&&(r=Math.min(r,Math.max(n.x,r-Br(c))))):c.alignment===yr?(r=d.left+b.x,0===b.x&&n.x<q.x-c.rowIndent&&(r=Math.max(r,Math.min(n.x,r+Br(c))))):r=c.dp||c.ep&&1===c.maxGenerationCount?d.left-c.Ka.x+b.x:d.x+d.width/2+b.x,k?(a.w(m,r,n.y),m++,a.w(m,r,d.top-f),m++,a.w(m,r,d.top-f+(b.y+h)/3),m++,a.w(m,r,d.top-f+2*(b.y+h)/3),m++,a.w(m,r,d.top-f+(b.y+h)),m++,a.w(m,r,p.y)):(l&&(a.w(m,n.x,d.top-f/2),m++),a.w(m,r,d.top-f/2),m++,a.w(m,r,d.top-f+b.y+(l?h/2:h)),m++,l&&a.w(m,p.x,a.l(m-1).y))):u.k("Invalid angle "+e);a.Ci()}else{e=c,f=d,a=this.link,c=xr(e),c!==xr(f)&&(b=Ar(e),d=e.mb,e=f.mb,0===c&&e.left-d.right<b+1||90===c&&e.top-d.bottom<b+1||180===c&&d.left-e.right<b+1||270===c&&d.top-e.bottom<b+1||(a.updateRoute(),e=a.We===kh,f=a.ec,h=or(this.fromVertex.alignment),a.sl(),0===c?(c=d.right+b/2,e?4===a.ka&&(b=a.l(3).y,a.U(1,c-20,a.l(1).y),a.w(2,c-20,b),a.w(3,c,b),a.w(4,c+20,b),a.U(5,a.l(5).x,b)):f?h?a.U(3,a.l(2).x,a.l(4).y):6===a.ka&&(a.U(2,c,a.l(2).y),a.U(3,c,a.l(3).y)):4===a.ka?a.w(2,c,a.l(2).y):3===a.ka?a.U(1,c,a.l(2).y):2===a.ka&&a.w(1,c,a.l(1).y)):90===c?(b=d.bottom+b/2,e?4===a.ka&&(c=a.l(3).x,a.U(1,a.l(1).x,b-20),a.w(2,c,b-20),a.w(3,c,b),a.w(4,c,b+20),a.U(5,c,a.l(5).y)):f?h?a.U(3,a.l(2).x,a.l(4).y):6===a.ka&&(a.U(2,a.l(2).x,b),a.U(3,a.l(3).x,b)):4===a.ka?a.w(2,a.l(2).x,b):3===a.ka?a.U(1,a.l(2).x,b):2===a.ka&&a.w(1,a.l(1).x,b)):180===c?(c=d.left-b/2,e?4===a.ka&&(b=a.l(3).y,a.U(1,c+20,a.l(1).y),a.w(2,c+20,b),a.w(3,c,b),a.w(4,c-20,b),a.U(5,a.l(5).x,b)):f?h?a.U(3,a.l(2).x,a.l(4).y):6===a.ka&&(a.U(2,c,a.l(2).y),a.U(3,c,a.l(3).y)):4===a.ka?a.w(2,c,a.l(2).y):3===a.ka?a.U(1,c,a.l(2).y):2===a.ka&&a.w(1,c,a.l(1).y)):270===c&&(b=d.top-b/2,e?4===a.ka&&(c=a.l(3).x,a.U(1,a.l(1).x,b+20),a.w(2,c,b+20),a.w(3,c,b),a.w(4,c,b-20),a.U(5,c,a.l(5).y)):f?h?a.U(3,a.l(2).x,a.l(4).y):6===a.ka&&(a.U(2,a.l(2).x,b),a.U(3,a.l(3).x,b)):4===a.ka?a.w(2,a.l(2).x,b):3===a.ka?a.U(1,a.l(2).x,b):2===a.ka&&a.w(1,a.l(1).x,b)),a.Ci())) + }}}};u.defineProperty($r,{rK:"relativePoint"},function(){return this.pr},function(a){this.pr.set(a)});function as(){this.zn=[]}function Ql(a){var b=new as,c=null;"string"===typeof a?c=(new DOMParser).parseFromString(a,"text/xml"):a instanceof Document&&(c=a.implementation.createDocument("http://www.w3.org/2000/svg","svg",null),c.appendChild(c.importNode(a.documentElement,!0)));if(null===c){return null}a=c.getElementsByTagName("svg");if(0===a.length){return null}var d=a[0],e=c.getElementsByTagName("linearGradient"),f=c.getElementsByTagName("radialGradient");for(a=0;a<e.length;a++){for(var h=e[a],k=Rl(ga,ue,{start:Dc,end:Ec}),l=h.childNodes,m=0;m<l.length;m++){if("stop"===l[m].tagName){var n=bs(b,l[m],"stop-color");if(null!==n&&""!==n){var p=bs(b,l[m],"offset");if(null===p||""===p){p="0"}var q=parseFloat(p);isNaN(q)&&(q=0);k.addColorStop((-1!==p.indexOf("%")?0.01:1)*q,n)}}}h=h.getAttribute("id");"string"===typeof h&&(b["_brush"+h]=k)}for(a=0;a<f.length;a++){h=f[a];k=Rl(ga,ve,{start:Ib,end:Ib});l=h.childNodes;for(m=0;m<l.length;m++){if("stop"===l[m].tagName&&(n=bs(b,l[m],"stop-color"),null!==n&&""!==n)){p=bs(b,l[m],"offset");if(null===p||""===p){p="0"}q=parseFloat(p);isNaN(q)&&(q=0);k.addColorStop((-1!==p.indexOf("%")?0.01:1)*q,n)}}h=h.getAttribute("id");"string"===typeof h&&(b["_brush"+h]=k)}for(e=!0;e;){for(e=!1,f=c.getElementsByTagName("use"),a=0;a<f.length;a++){k=f[a],0===k.childNodes.length&&(h=k.href,void 0!==h&&(h=c.getElementById(h.baseVal.substring(1)),null!==h&&(h=h.cloneNode(!0),h.removeAttribute("id"),l=parseFloat(k.getAttribute("x")),isNaN(l)&&(l=0),m=parseFloat(k.getAttribute("y")),isNaN(m)&&(m=0),n=k.getAttribute("transform"),null===n&&(n=""),k.setAttribute("transform",n+" translate("+l+","+m+")"),k.appendChild(h),"use"===h.tagName&&(e=!0))))}}cs(b,d,null);c=new B;if(0===b.zn.length){return c}if(1===b.zn.length){return b.zn[0]}for(a=0;a<b.zn.length;a++){c.add(b.zn[a])}return c}function ds(a,b){var c=a.getAttribute(b);"string"!==typeof c&&a.style&&(c=a.style[b]);return"string"!==typeof c?null:c}function bs(a,b,c){var d=b.getAttribute(c);"string"!==typeof d&&b.style&&(d=b.style[c]);return"string"!==typeof d||""===d||"inherit"===d?(b=b.parentNode,"g"===b.tagName||"use"===b.tagName?bs(a,b,c):null):d}function cs(a,b,c){var d=b.tagName;if(("g"===d||"svg"===d||"use"===d||"symbol"===d)&&"none"!==bs(a,b,"display")){for(var d=b.childNodes,e=0;e<d.length;e++){var f=d[e],h=null;if(void 0!==f.getAttribute){var k=f.getAttribute("transform");switch(f.tagName){case"g":null===k?cs(a,f,null):(h=new B,cs(a,f,h));break;case"use":null===k?cs(a,f,null):(h=new B,cs(a,f,h));break;case"symbol":if("use"!==b.tagName){break}h=new B;cs(a,f,h);var l=h,m=a,n=f;bs(m,n,"preserveAspectRatio");bs(m,n,"viewBox");l.scale=1;break;case"path":l=f;h=new X;l=l.getAttribute("d");"string"===typeof l&&(h.FG=rd(l));break;case"line":var p=f,h=new X,l=parseFloat(p.getAttribute("x1"));isNaN(l)&&(l=0);m=parseFloat(p.getAttribute("y1"));isNaN(m)&&(m=0);n=parseFloat(p.getAttribute("x2"));isNaN(n)&&(n=0);p=parseFloat(p.getAttribute("y2"));isNaN(p)&&(p=0);var q=new $c(dd);h.position=new w(Math.min(l,n),Math.min(m,p));0<(n-l)/(p-m)?(q.va=0,q.wa=0,q.F=Math.abs(n-l),q.G=Math.abs(p-m)):(q.va=0,q.wa=Math.abs(p-m),q.F=Math.abs(n-l),q.G=0);h.fd=q;break;case"circle":n=f;h=new X;l=parseFloat(n.getAttribute("r"));isNaN(l)||0>l?h=null:(m=parseFloat(n.getAttribute("cx")),isNaN(m)&&(m=0),n=parseFloat(n.getAttribute("cy")),isNaN(n)&&(n=0),p=new $c(nd),p.va=0,p.wa=0,p.F=2*l,p.G=2*l,h.position=new w(m-l,n-l),h.fd=p);break;case"ellipse":p=f;h=new X;l=parseFloat(p.getAttribute("rx"));isNaN(l)||0>l?h=null:(m=parseFloat(p.getAttribute("ry")),isNaN(m)||0>m?h=null:(n=parseFloat(p.getAttribute("cx")),isNaN(n)&&(n=0),p=parseFloat(p.getAttribute("cy")),isNaN(p)&&(p=0),q=new $c(nd),q.va=0,q.wa=0,q.F=2*l,q.G=2*m,h.position=new w(n-l,p-m),h.fd=q));break;case"rect":q=f;h=new X;l=parseFloat(q.getAttribute("width"));if(isNaN(l)||0>l){h=null}else{if(m=parseFloat(q.getAttribute("height")),isNaN(m)||0>m){h=null}else{n=parseFloat(q.getAttribute("x"));isNaN(n)&&(n=0);p=parseFloat(q.getAttribute("y"));isNaN(p)&&(p=0);var r=q.getAttribute("rx"),s=q.getAttribute("ry"),q=parseFloat(r);if(isNaN(q)||0>q){q=0}var t=parseFloat(s);if(isNaN(t)||0>t){t=0}null!==r&&""!==r||null===s||""===s?null===r||""===r||null!==s&&""!==s||(t=q):q=t;q=Math.min(q,l/2);t=Math.min(t,m/2);s=void 0;0===q&&0===t?(s=new $c(md),s.va=0,s.wa=0,s.F=l,s.G=m):(s=K.ta/2,r=u.p(),M(r,q,0,!0),r.lineTo(l-q,0),O(r,l-q*s,0,l,t*s,l,t),r.lineTo(l,m-t),O(r,l,m-t*s,l-q*s,m,l-q,m),r.lineTo(q,m),O(r,q*s,m,0,m-t*s,0,m-t),r.lineTo(0,t),O(r,0,t*s,q*s,0,q,0),P(r),s=r.o,u.q(r));h.position=new w(n,p);h.fd=s}}break;case"polygon":h=es(f);break;case"polyline":h=es(f)}if(null!==h){if(h instanceof X){m=h;l=bs(a,f,"fill");null!==l&&-1!==l.indexOf("url")?(l=l.substring(l.indexOf("#")+1,l.length-1),l=a["_brush"+l],m.fill=l instanceof ga?l:"black"):m.fill=null===l?"black":"none"===l?null:l;l=bs(a,f,"stroke");null!==l&&-1!==l.indexOf("url")?(l=l.substring(l.indexOf("#")+1,l.length-1),l=a["_brush"+l],m.stroke=l instanceof ga?l:"black"):m.stroke="none"===l?null:l; + l=parseFloat(bs(a,f,"stroke-width"));isNaN(l)||(m.jb=l);l=bs(a,f,"stroke-linecap");null!==l&&(m.sI=l);l=bs(a,f,"stroke-dasharray");if(null!==l&&""!==l){n=l.split(",");p=[];for(l=0;l<n.length;l++){q=parseFloat(n[l]),!isNaN(q)&&0<q&&p.push(q)}m.hA=p}f=bs(a,f,"stroke-dashoffset");null!==f&&""!==f&&(f=parseFloat(f),isNaN(f)||(m.tI=f));m.sz=!0}if(null!==k){k=k.split(")");f=!0;for(l=0;l<k.length;l++){/\(.*[^0-9\.,\s-]/.test(k[l])&&(f=!1),/\(.*[0-9]-[0-9]/.test(k[l])&&(f=!1)}if(f){for(l=k.length-1;0<=l;l--){if(m=k[l],""!==m){switch(n=m.indexOf("("),f=m.substring(0,n).replace(/\s*/,""),n=m.substring(n+1).split(/\s*[\s,]\s*/),f){case"rotate":fs(a,h,n);break;case"translate":f=h;m=parseFloat(n[0]);isNaN(m)&&(m=0);n=parseFloat(n[1]);isNaN(n)&&(n=0);if(0!==m||0!==n){p=f.position.copy(),isNaN(p.x)&&(p.x=0),isNaN(p.y)&&(p.y=0),f.position=new w(m+p.x,n+p.y)}break;case"scale":gs(a,h,n);break;case"skewX":hs(a,h,n);break;case"skewY":is(a,h,n);break;case"matrix":js(a,h,n)}}}}}if(h instanceof B){k=h;l=f=0;m=k.position.copy();isNaN(m.x)&&(m.x=0);isNaN(m.y)&&(m.y=0);for(n=k.elements.i;n.next();){p=n.value.position.copy(),isNaN(p.x)&&(p.x=0),isNaN(p.y)&&(p.y=0),p.x<f&&(f=p.x),p.y<l&&(l=p.y)}m.x+=f;m.y+=l;k.position=m}null===c?a.zn.push(h):c.add(h)}}}if(null!==h){a=ds(b,"visibility");if("hidden"===a||"collapse"===a){h.visible=!1}b=ds(b,"opacity");null!==b&&""!==b&&(b=parseFloat(b),isNaN(b)||(h.opacity=b))}}}function js(a,b,c){var d=parseFloat(c[0]),e=parseFloat(c[1]),f=parseFloat(c[2]),h=parseFloat(c[3]),k=parseFloat(c[4]),l=parseFloat(c[5]);if(!isNaN(d+e+f+h+k+l)){var m=b.position.copy();isNaN(m.x)&&(m.x=0);isNaN(m.y)&&(m.y=0);if(b instanceof X){c=b.fd.copy();if(c.type===md){c=a.Zr(c)}else{if(c.type===nd){c=ks(c)}else{if(c.type===dd){c.type=ad;a=new bd(c.va,c.wa);var n=new Jd(pd,c.F,c.G);a.Ga.add(n);c.ub.add(a)}}}c.offset(m.x,m.y);c.transform(d,e,f,h,k-m.x,l-m.y);a=c.normalize();b.fd=c;m.x-=a.x;m.y-=a.y;b.position=m}else{if(b instanceof B){for(b=b.elements.i;b.next();){e=b.value,d=e.position.copy(),d.x+=m.x,d.y+=m.y,e.position=d}for(b.reset();b.next();){js(a,b.value,c)}for(b.reset();b.next();){a=b.value,d=a.position.copy(),d.x-=m.x,d.y-=m.y,a.position=d}}}}}function fs(a,b,c){var d=parseFloat(c[0]);isNaN(d)&&(d=0);var e=parseFloat(c[1]);isNaN(e)&&(e=0);var f=parseFloat(c[2]);isNaN(f)&&(f=0);if(0!==d){var h=d*Math.PI/180,k=b.position.copy();isNaN(k.x)&&(k.x=0);isNaN(k.y)&&(k.y=0);if(b instanceof X){c=b.fd.copy();c.type===nd?c=ks(c):c.type===md&&(c=a.Zr(c));if(c.type===ad){c.rotate(d,e-k.x,f-k.y),f=c.normalize(),b.fd=c,k.x-=f.x,k.y-=f.y,b.position=k}else{var d=c.va-e+k.x,l=c.wa-f+k.y,m=c.F-e+k.x,n=c.G-f+k.y;a=d*Math.cos(h)-l*Math.sin(h)+e-k.x;d=l*Math.cos(h)+d*Math.sin(h)+f-k.y;e=m*Math.cos(h)-n*Math.sin(h)+e-k.x;f=n*Math.cos(h)+m*Math.sin(h)+f-k.y;m=Math.min(a,e);n=Math.min(d,f);c.va=a-m;c.wa=d-n;c.F=e-m;c.G=f-n;k.x+=m;k.y+=n;b.position=k;b.fd=c}b.fill instanceof ga&&(k=b.fill.copy(),c=Math.atan((0.5-k.start.y)/(0.5-k.start.x)),isNaN(c)||(c+=h,k.start=new L((1-Math.cos(c))/2,(1-Math.sin(c))/2),k.end=new L((1+Math.cos(c))/2,(1+Math.sin(c))/2)),b.fill=k);b.stroke instanceof ga&&(k=b.stroke.copy(),c=Math.atan((0.5-k.start.y)/(0.5-k.start.x)),isNaN(c)||(c+=h,k.start=new L((1-Math.cos(c))/2,(1-Math.sin(c))/2),k.end=new L((1+Math.cos(c))/2,(1+Math.sin(c))/2)),b.stroke=k)}else{if(b instanceof B){for(b=b.elements.i;b.next();){f=b.value,h=f.position.copy(),h.x+=k.x,h.y+=k.y,f.position=h}for(b.reset();b.next();){fs(a,b.value,c)}for(b.reset();b.next();){c=b.value,h=c.position.copy(),h.x-=k.x,h.y-=k.y,c.position=h}}}}}function gs(a,b,c){var d=parseFloat(c[0]);isNaN(d)&&(d=1);var e=parseFloat(c[1]);isNaN(e)&&(e=d);if(1!==d||1!==e){var f=b.position.copy();isNaN(f.x)&&(f.x=0);isNaN(f.y)&&(f.y=0);if(b instanceof X){a=b.fd.copy(),f.x*=d,f.y*=e,b.position=f,a.scale(d,e),b.fd=a}else{if(b instanceof B){for(b=b.elements.i;b.next();){e=b.value,d=e.position.copy(),d.x+=f.x,d.y+=f.y,e.position=d}for(b.reset();b.next();){gs(a,b.value,c)}for(b.reset();b.next();){a=b.value,d=a.position.copy(),d.x-=f.x,d.y-=f.y,a.position=d}}}}}function hs(a,b,c){var d=parseFloat(c[0]);if(!isNaN(d)){var d=d*Math.PI/180,e=b.position.copy();isNaN(e.x)&&(e.x=0);isNaN(e.y)&&(e.y=0);if(b instanceof X){c=b.fd.copy();if(c.type===md){c=a.Zr(c)}else{if(c.type===nd){c=ks(c)}else{if(c.type===dd){c.type=ad;a=new bd(c.va,c.wa);var f=new Jd(pd,c.F,c.G);a.Ga.add(f);c.ub.add(a)}}}c.offset(e.x,e.y);c.transform(1,0,Math.tan(d),1,-e.x,-e.y);a=c.normalize();b.fd=c;e.x-=a.x;e.y-=a.y;b.position=e}else{if(b instanceof B){for(b=b.elements.i;b.next();){d=b.value.position.copy(),d.x+=e.x,d.y+=e.y,b.value.position=d}for(b.reset();b.next();){hs(a,b.value,c)}for(b.reset();b.next();){a=b.value,d=a.position.copy(),d.x-=e.x,d.y-=e.y,a.position=d}}}}}function is(a,b,c){var d=parseFloat(c[0]);if(!isNaN(d)){var d=d*Math.PI/180,e=b.position.copy();isNaN(e.x)&&(e.x=0);isNaN(e.y)&&(e.y=0);if(b instanceof X){c=b.fd.copy();if(c.type===md){c=a.Zr(c)}else{if(c.type===nd){c=ks(c)}else{if(c.type===dd){c.type=ad;a=new bd(c.va,c.wa); + var f=new Jd(pd,c.F,c.G);a.Ga.add(f);c.ub.add(a)}}}c.offset(e.x,e.y);c.transform(1,Math.tan(d),0,1,-e.x,-e.y);a=c.normalize();b.fd=c;e.x-=a.x;e.y-=a.y;b.position=e}else{if(b instanceof B){for(b=b.elements.i;b.next();){f=b.value,d=f.position.copy(),d.x+=e.x,d.y+=e.y,f.position=d}for(b.reset();b.next();){is(a,b.value,c)}for(b.reset();b.next();){a=b.value,d=a.position.copy(),d.x-=e.x,d.y-=e.y,a.position=d}}}}}function es(a){var b=!1;if("polygon"===a.tagName){b=!0}else{if("polyline"!==a.tagName){return null}}var c=new X,d=a.getAttribute("points");a=new $c;var e=new E(bd),f=d.split(/\s*[\s,]\s*/);if(4>f.length){return null}for(var d=null,h=new E(Jd),k=1;k<f.length;k+=2){var l=parseFloat(f[k-1]),m=parseFloat(f[k]);if("number"!==typeof l||isNaN(l)||"number"!==typeof m||isNaN(m)){return null}1===k?d=new bd(l,m):h.add(new Jd(pd,l,m))}b&&(b=new Jd(pd,d.va,d.wa),b.close(),h.add(b));d.Ga=h;e.add(d);a.ub=e;b=a.normalize();c.position=new w(-b.x,-b.y);c.fd=a;return c}function ks(a){var b=a.va,c=a.wa,d=a.F,e=a.G,f=Math.abs(d-b)/2,h=Math.abs(e-c)/2,b=Math.min(b,d)+f,c=Math.min(c,e)+h,e=new bd(b,c-h),d=new Jd(zd);d.Rb=b+K.ta*f;d.jc=c-h;d.ff=b+f;d.gf=c-K.ta*h;d.F=b+f;d.G=c;e.Ga.add(d);d=new Jd(zd);d.Rb=b+f;d.jc=c+K.ta*h;d.ff=b+K.ta*f;d.gf=c+h;d.F=b;d.G=c+h;e.Ga.add(d);d=new Jd(zd);d.Rb=b-K.ta*f;d.jc=c+h;d.ff=b-f;d.gf=c+K.ta*h;d.F=b-f;d.G=c;e.Ga.add(d);d=new Jd(zd);d.Rb=b-f;d.jc=c-K.ta*h;d.ff=b-K.ta*f;d.gf=c-h;d.F=b;d.G=c-h;e.Ga.add(d);a.type=ad;a.ub.add(e);return a}as.prototype.Zr=function(a){var b=a.va,c=a.wa,d=a.F,e=a.G,f=Math.min(b,d),h=Math.min(c,e),b=Math.abs(d-b),c=Math.abs(e-c),e=new bd(f,h);e.Ga.add(new Jd(pd,f+b,h));e.Ga.add(new Jd(pd,f+b,h+c));e.Ga.add((new Jd(pd,f,h+c)).close());a.type=ad;a.ub.add(e);return a};function Vm(){T.call(this);this.Ne=null}u.Ha(Vm,T);Vm.prototype.cloneProtected=function(a){T.prototype.cloneProtected.call(this,a);a.element=this.Ne.cloneNode(!0)};Vm.prototype.toString=function(){return"HTMLHost("+this.Ne.toString()+")#"+u.Uc(this)};Vm.prototype.Mj=function(a,b){var c=this.Ne;if(null!==c){var d=this.eb(Ib);d.x-=this.ca.width/2;d.y-=this.ca.height/2;d.x-=this.ca.x;d.y-=this.ca.y;var d=b.VE(d),e=b.Vk;null===e||e.contains(c)||e.appendChild(c);e=this.transform;c.style.transform="matrix("+e.m11+","+e.m12+","+e.m21+","+e.m22+","+e.dx+","+e.dy+")";c.style.transformOrigin="0 0";e=d.y;c.style.left=d.x+"px";c.style.top=e+"px"}};Vm.prototype.Qo=function(a,b,c,d){var e=this.za;isFinite(e.width)&&(a=e.width);isFinite(e.height)&&(b=e.height);var e=this.cf,f=this.xg;c=Math.max(c,f.width);d=Math.max(d,f.height);a=Math.min(e.width,a);b=Math.min(e.height,b);a=Math.max(c,a);b=Math.max(d,b);c=this.Ne;null!==c&&(b=c.getBoundingClientRect(),a=b.width,b=b.height);bb(this.Gc,a,b);ml(this,0,0,a,b)};Vm.prototype.yi=function(a,b,c,d){ql(this,a,b,c,d)};u.u(Vm,{Ja:"naturalBounds"},function(){return this.Gc});u.defineProperty(Vm,{element:"element"},function(){return this.Ne},function(a){var b=this.Ne;b!==a&&(a instanceof HTMLElement||u.k("HTMLHost.element must be an instance of HTMLElement."),this.Ne=a,a.className="HTMLHost",this.h("element",b,a),this.na())});da.version="1.5.23";window&&(window.module&&"object"===typeof window.module&&"object"===typeof window.module.exports?window.module.exports=da:window.define&&"function"===typeof window.define&&window.define.amd?(window.go=da,window.define(da)):window.go=da);"undefined"!==typeof module&&"object"===typeof module.exports&&(module.exports=da)})(window); diff --git a/uam-web/public/vendor/ieshim/normalizeconsole.js b/uam-web/public/vendor/ieshim/normalizeconsole.js new file mode 100644 index 0000000000000000000000000000000000000000..767e8ecbc9f105cc69ff9c2272ae03addb33e6d7 --- /dev/null +++ b/uam-web/public/vendor/ieshim/normalizeconsole.js @@ -0,0 +1,102 @@ +/** + * Created by zhangrong on 16/3/24. + */ + +(function (console) { + /********************************************************************************************* + * Make sure console exists because IE blows up if it's not open and you attempt to access it + * Create some dummy functions if we need to, so we don't have to if/else everything + *********************************************************************************************/ + console || (console = window.console = { + // all this "a, b, c, d, e" garbage is to make the IDEs happy, since they can't do variable argument lists + /** + * @param a + * @param [b] + * @param [c] + * @param [d] + * @param [e] + */ + log: function (a, b, c, d, e) { + }, + /** + * @param a + * @param [b] + * @param [c] + * @param [d] + * @param [e] + */ + info: function (a, b, c, d, e) { + }, + /** + * @param a + * @param [b] + * @param [c] + * @param [d] + * @param [e] + */ + warn: function (a, b, c, d, e) { + }, + /** + * @param a + * @param [b] + * @param [c] + * @param [d] + * @param [e] + */ + error: function (a, b, c, d, e) { + } + }); + + // le sigh, IE, oh IE, how we fight... fix Function.prototype.bind as needed + if (!Function.prototype.bind) { + //credits: taken from bind_even_never in this discussion: https://prototype.lighthouseapp.com/projects/8886/tickets/215-optimize-bind-bindaseventlistener#ticket-215-9 + Function.prototype.bind = function (context) { + var fn = this, args = Array.prototype.slice.call(arguments, 1); + return function () { + return fn.apply(context, Array.prototype.concat.apply(args, arguments)); + }; + }; + } + + // IE 9 won't allow us to call console.log.apply (WTF IE!) It also reports typeof(console.log) as 'object' (UNH!) + // but together, those two errors can be useful in allowing us to fix stuff so it works right + if (typeof(console.log) === 'object') { + // Array.forEach doesn't work in IE 8 so don't try that :( + console.log = Function.prototype.call.bind(console.log, console); + console.info = Function.prototype.call.bind(console.info, console); + console.warn = Function.prototype.call.bind(console.warn, console); + console.error = Function.prototype.call.bind(console.error, console); + } + + /** + * Support group and groupEnd functions + */ + ('groupCollapsed' in console) || + (console.groupCollapsed = function (msg) { + console.info("\n------------\n" + msg + "\n------------"); + }); + ('group' in console) || + (console.group = function (msg) { + console.info("\n------------\n" + msg + "\n------------"); + }); + ('groupEnd' in console) || + (console.groupEnd = function () { + //console.log("\n\n"); + }); + + /** + * Support time and timeEnd functions + */ + ('time' in console) || + (function () { + var trackedTimes = {}; + console.time = function (msg) { + trackedTimes[msg] = new Date().getTime(); + }; + console.timeEnd = function (msg) { + var end = new Date().getTime(), time = (msg in trackedTimes) ? end - trackedTimes[msg] : 0; + console.info(msg + ': ' + time + 'ms') + } + }()); + +})(window.console); diff --git a/uam-web/public/vendor/state-machine.js b/uam-web/public/vendor/state-machine.js new file mode 100644 index 0000000000000000000000000000000000000000..c210cb3728db3f08ca647ab5cfe3d3a6ab5c8dde --- /dev/null +++ b/uam-web/public/vendor/state-machine.js @@ -0,0 +1,259 @@ +/* + + Javascript State Machine Library - https://github.com/jakesgordon/javascript-state-machine + + Copyright (c) 2012, 2013, 2014, 2015, Jake Gordon and contributors + Released under the MIT license - https://github.com/jakesgordon/javascript-state-machine/blob/master/LICENSE + + */ + +(function () { + + var StateMachine = { + + //--------------------------------------------------------------------------- + + VERSION: "2.3.5", + + //--------------------------------------------------------------------------- + + Result: { + SUCCEEDED: 1, // the event transitioned successfully from one state to another + NOTRANSITION: 2, // the event was successfull but no state transition was necessary + CANCELLED: 3, // the event was cancelled by the caller in a beforeEvent callback + PENDING: 4 // the event is asynchronous and the caller is in control of when the transition occurs + }, + + Error: { + INVALID_TRANSITION: 100, // caller tried to fire an event that was innapropriate in the current state + PENDING_TRANSITION: 200, // caller tried to fire an event while an async transition was still pending + INVALID_CALLBACK: 300 // caller provided callback function threw an exception + }, + + WILDCARD: '*', + ASYNC: 'async', + + //--------------------------------------------------------------------------- + + create: function (cfg, target) { + + var initial = (typeof cfg.initial == 'string') ? {state: cfg.initial} : cfg.initial; // allow for a simple string, or an object with { state: 'foo', event: 'setup', defer: true|false } + var terminal = cfg.terminal || cfg['final']; + var fsm = target || cfg.target || {}; + var events = cfg.events || []; + var callbacks = cfg.callbacks || {}; + var map = {}; // track state transitions allowed for an event { event: { from: [ to ] } } + var transitions = {}; // track events allowed from a state { state: [ event ] } + + var add = function (e) { + var from = (e.from instanceof Array) ? e.from : (e.from ? [e.from] : [StateMachine.WILDCARD]); // allow 'wildcard' transition if 'from' is not specified + map[e.name] = map[e.name] || {}; + for (var n = 0; n < from.length; n++) { + transitions[from[n]] = transitions[from[n]] || []; + transitions[from[n]].push(e.name); + + map[e.name][from[n]] = e.to || from[n]; // allow no-op transition if 'to' is not specified + } + }; + + if (initial) { + initial.event = initial.event || 'startup'; + add({name: initial.event, from: 'none', to: initial.state}); + } + + for (var n = 0; n < events.length; n++) + add(events[n]); + + for (var name in map) { + if (map.hasOwnProperty(name)) + fsm[name] = StateMachine.buildEvent(name, map[name]); + } + + for (var name in callbacks) { + if (callbacks.hasOwnProperty(name)) + fsm[name] = callbacks[name] + } + + fsm.current = 'none'; + fsm.is = function (state) { + return (state instanceof Array) ? (state.indexOf(this.current) >= 0) : (this.current === state); + }; + fsm.can = function (event) { + return !this.transition && (map[event].hasOwnProperty(this.current) || map[event].hasOwnProperty(StateMachine.WILDCARD)); + } + fsm.cannot = function (event) { + return !this.can(event); + }; + fsm.transitions = function () { + return transitions[this.current]; + }; + fsm.isFinished = function () { + return this.is(terminal); + }; + fsm.error = cfg.error || function (name, from, to, args, error, msg, e) { + throw e || msg; + }; // default behavior when something unexpected happens is to throw an exception, but caller can override this behavior if desired (see github issue #3 and #17) + + if (initial && !initial.defer) + fsm[initial.event](); + + return fsm; + + }, + + //=========================================================================== + + doCallback: function (fsm, func, name, from, to, args) { + if (func) { + try { + return func.apply(fsm, [name, from, to].concat(args)); + } + catch (e) { + return fsm.error(name, from, to, args, StateMachine.Error.INVALID_CALLBACK, "an exception occurred in a caller-provided callback function", e); + } + } + }, + + beforeAnyEvent: function (fsm, name, from, to, args) { + return StateMachine.doCallback(fsm, fsm['onbeforeevent'], name, from, to, args); + }, + afterAnyEvent: function (fsm, name, from, to, args) { + return StateMachine.doCallback(fsm, fsm['onafterevent'] || fsm['onevent'], name, from, to, args); + }, + leaveAnyState: function (fsm, name, from, to, args) { + return StateMachine.doCallback(fsm, fsm['onleavestate'], name, from, to, args); + }, + enterAnyState: function (fsm, name, from, to, args) { + return StateMachine.doCallback(fsm, fsm['onenterstate'] || fsm['onstate'], name, from, to, args); + }, + changeState: function (fsm, name, from, to, args) { + return StateMachine.doCallback(fsm, fsm['onchangestate'], name, from, to, args); + }, + + beforeThisEvent: function (fsm, name, from, to, args) { + return StateMachine.doCallback(fsm, fsm['onbefore' + name], name, from, to, args); + }, + afterThisEvent: function (fsm, name, from, to, args) { + return StateMachine.doCallback(fsm, fsm['onafter' + name] || fsm['on' + name], name, from, to, args); + }, + leaveThisState: function (fsm, name, from, to, args) { + return StateMachine.doCallback(fsm, fsm['onleave' + from], name, from, to, args); + }, + enterThisState: function (fsm, name, from, to, args) { + return StateMachine.doCallback(fsm, fsm['onenter' + to] || fsm['on' + to], name, from, to, args); + }, + + beforeEvent: function (fsm, name, from, to, args) { + if ((false === StateMachine.beforeThisEvent(fsm, name, from, to, args)) || + (false === StateMachine.beforeAnyEvent(fsm, name, from, to, args))) + return false; + }, + + afterEvent: function (fsm, name, from, to, args) { + StateMachine.afterThisEvent(fsm, name, from, to, args); + StateMachine.afterAnyEvent(fsm, name, from, to, args); + }, + + leaveState: function (fsm, name, from, to, args) { + var specific = StateMachine.leaveThisState(fsm, name, from, to, args), + general = StateMachine.leaveAnyState(fsm, name, from, to, args); + if ((false === specific) || (false === general)) + return false; + else if ((StateMachine.ASYNC === specific) || (StateMachine.ASYNC === general)) + return StateMachine.ASYNC; + }, + + enterState: function (fsm, name, from, to, args) { + StateMachine.enterThisState(fsm, name, from, to, args); + StateMachine.enterAnyState(fsm, name, from, to, args); + }, + + //=========================================================================== + + buildEvent: function (name, map) { + return function () { + + var from = this.current; + var to = map[from] || map[StateMachine.WILDCARD] || from; + var args = Array.prototype.slice.call(arguments); // turn arguments into pure array + + if (this.transition) + return this.error(name, from, to, args, StateMachine.Error.PENDING_TRANSITION, "event " + name + " inappropriate because previous transition did not complete"); + + if (this.cannot(name)) + return this.error(name, from, to, args, StateMachine.Error.INVALID_TRANSITION, "event " + name + " inappropriate in current state " + this.current); + + if (false === StateMachine.beforeEvent(this, name, from, to, args)) + return StateMachine.Result.CANCELLED; + + if (from === to) { + StateMachine.afterEvent(this, name, from, to, args); + return StateMachine.Result.NOTRANSITION; + } + + // prepare a transition method for use EITHER lower down, or by caller if they want an async transition (indicated by an ASYNC return value from leaveState) + var fsm = this; + this.transition = function () { + fsm.transition = null; // this method should only ever be called once + fsm.current = to; + StateMachine.enterState(fsm, name, from, to, args); + StateMachine.changeState(fsm, name, from, to, args); + StateMachine.afterEvent(fsm, name, from, to, args); + return StateMachine.Result.SUCCEEDED; + }; + this.transition.cancel = function () { // provide a way for caller to cancel async transition if desired (issue #22) + fsm.transition = null; + StateMachine.afterEvent(fsm, name, from, to, args); + } + + var leave = StateMachine.leaveState(this, name, from, to, args); + if (false === leave) { + this.transition = null; + return StateMachine.Result.CANCELLED; + } + else if (StateMachine.ASYNC === leave) { + return StateMachine.Result.PENDING; + } + else { + if (this.transition) // need to check in case user manually called transition() but forgot to return StateMachine.ASYNC + return this.transition(); + } + + }; + } + + }; // StateMachine + + //=========================================================================== + + //====== + // NODE + //====== + if (typeof exports !== 'undefined') { + if (typeof module !== 'undefined' && module.exports) { + exports = module.exports = StateMachine; + } + exports.StateMachine = StateMachine; + } + //============ + // AMD/REQUIRE + //============ + else if (typeof define === 'function' && define.amd) { + define(function (require) { + return StateMachine; + }); + } + //======== + // BROWSER + //======== + else if (typeof window !== 'undefined') { + window.StateMachine = StateMachine; + } + //=========== + // WEB WORKER + //=========== + else if (typeof self !== 'undefined') { + self.StateMachine = StateMachine; + } + +}()); diff --git a/uam-web/tests/.jshintrc b/uam-web/tests/.jshintrc new file mode 100644 index 0000000000000000000000000000000000000000..6ec0b7c154b09337291c5d736e99d5928d560549 --- /dev/null +++ b/uam-web/tests/.jshintrc @@ -0,0 +1,52 @@ +{ + "predef": [ + "document", + "window", + "location", + "setTimeout", + "$", + "-Promise", + "define", + "console", + "visit", + "exists", + "fillIn", + "click", + "keyEvent", + "triggerEvent", + "find", + "findWithAssert", + "wait", + "DS", + "andThen", + "currentURL", + "currentPath", + "currentRouteName" + ], + "node": false, + "browser": false, + "boss": true, + "curly": true, + "debug": false, + "devel": false, + "eqeqeq": true, + "evil": true, + "forin": false, + "immed": false, + "laxbreak": false, + "newcap": true, + "noarg": true, + "noempty": false, + "nonew": false, + "nomen": false, + "onevar": false, + "plusplus": false, + "regexp": false, + "undef": true, + "sub": true, + "strict": false, + "white": false, + "eqnull": true, + "esnext": true, + "unused": true +} diff --git a/uam-web/tests/helpers/destroy-app.js b/uam-web/tests/helpers/destroy-app.js new file mode 100644 index 0000000000000000000000000000000000000000..c3d4d1abb5d467ddf5f9a0b8f814c8d99d20db6d --- /dev/null +++ b/uam-web/tests/helpers/destroy-app.js @@ -0,0 +1,5 @@ +import Ember from 'ember'; + +export default function destroyApp(application) { + Ember.run(application, 'destroy'); +} diff --git a/uam-web/tests/helpers/module-for-acceptance.js b/uam-web/tests/helpers/module-for-acceptance.js new file mode 100644 index 0000000000000000000000000000000000000000..ed23003db408fd9b0c69f914e9e552e0657bc7f8 --- /dev/null +++ b/uam-web/tests/helpers/module-for-acceptance.js @@ -0,0 +1,23 @@ +import { module } from 'qunit'; +import startApp from '../helpers/start-app'; +import destroyApp from '../helpers/destroy-app'; + +export default function(name, options = {}) { + module(name, { + beforeEach() { + this.application = startApp(); + + if (options.beforeEach) { + options.beforeEach.apply(this, arguments); + } + }, + + afterEach() { + destroyApp(this.application); + + if (options.afterEach) { + options.afterEach.apply(this, arguments); + } + } + }); +} diff --git a/uam-web/tests/helpers/resolver.js b/uam-web/tests/helpers/resolver.js new file mode 100644 index 0000000000000000000000000000000000000000..ebfb4e4d4552ed0c90ac9b925860a38acbaffa8a --- /dev/null +++ b/uam-web/tests/helpers/resolver.js @@ -0,0 +1,11 @@ +import Resolver from 'ember/resolver'; +import config from '../../config/environment'; + +const resolver = Resolver.create(); + +resolver.namespace = { + modulePrefix: config.modulePrefix, + podModulePrefix: config.podModulePrefix +}; + +export default resolver; diff --git a/uam-web/tests/helpers/start-app.js b/uam-web/tests/helpers/start-app.js new file mode 100644 index 0000000000000000000000000000000000000000..e098f1d5be605e462c63145c2c50572aac6c4303 --- /dev/null +++ b/uam-web/tests/helpers/start-app.js @@ -0,0 +1,18 @@ +import Ember from 'ember'; +import Application from '../../app'; +import config from '../../config/environment'; + +export default function startApp(attrs) { + let application; + + let attributes = Ember.merge({}, config.APP); + attributes = Ember.merge(attributes, attrs); // use defaults, but you can override; + + Ember.run(() => { + application = Application.create(attributes); + application.setupForTesting(); + application.injectTestHelpers(); + }); + + return application; +} diff --git a/uam-web/tests/index.html b/uam-web/tests/index.html new file mode 100644 index 0000000000000000000000000000000000000000..4f9095cfd1f8b83db0557dba9bcbf9faee39a7b7 --- /dev/null +++ b/uam-web/tests/index.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>HfCmdbsWeb Tests</title> + <meta name="description" content=""> + <meta name="viewport" content="width=device-width, initial-scale=1"> + + {{content-for 'head'}} + {{content-for 'test-head'}} + + <link rel="stylesheet" href="assets/vendor.css"> + <link rel="stylesheet" href="assets/hf-cmdbs-web.css"> + <link rel="stylesheet" href="assets/test-support.css"> + + {{content-for 'head-footer'}} + {{content-for 'test-head-footer'}} + </head> + <body> + {{content-for 'body'}} + {{content-for 'test-body'}} + + <script src="assets/vendor.js"></script> + <script src="assets/test-support.js"></script> + <script src="assets/hf-cmdbs-web.js"></script> + <script src="testem.js" integrity=""></script> + <script src="assets/tests.js"></script> + <script src="assets/test-loader.js"></script> + + {{content-for 'body-footer'}} + {{content-for 'test-body-footer'}} + </body> +</html> diff --git a/uam-web/tests/integration/.gitkeep b/uam-web/tests/integration/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/uam-web/tests/integration/components/cms/cm/data/input/ci-edit/component-test.js b/uam-web/tests/integration/components/cms/cm/data/input/ci-edit/component-test.js new file mode 100644 index 0000000000000000000000000000000000000000..0e9ed7bf72e41bde2db49e1208562405e25e23d2 --- /dev/null +++ b/uam-web/tests/integration/components/cms/cm/data/input/ci-edit/component-test.js @@ -0,0 +1,25 @@ +import { moduleForComponent, test } from 'ember-qunit'; +import hbs from 'htmlbars-inline-precompile'; + +moduleForComponent('cms/cm/data/input/ci-edit', 'Integration | Component | cms/cm/data/input/ci edit', { + integration: true +}); + +test('it renders', function(assert) { + + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.on('myAction', function(val) { ... });" + EOL + EOL + + + this.render(hbs`{{cms/cm/data/input/ci-edit}}`); + + assert.equal(this.$().text().trim(), ''); + + // Template block usage:" + EOL + + this.render(hbs` + {{#cms/cm/data/input/ci-edit}} + template block text + {{/cms/cm/data/input/ci-edit}} + `); + + assert.equal(this.$().text().trim(), 'template block text'); +}); diff --git a/uam-web/tests/integration/components/cms/cm/data/search/ci-history-details/component-test.js b/uam-web/tests/integration/components/cms/cm/data/search/ci-history-details/component-test.js new file mode 100644 index 0000000000000000000000000000000000000000..0a74417d5abf3f348cc887110a8f43b381e3a43d --- /dev/null +++ b/uam-web/tests/integration/components/cms/cm/data/search/ci-history-details/component-test.js @@ -0,0 +1,25 @@ +import { moduleForComponent, test } from 'ember-qunit'; +import hbs from 'htmlbars-inline-precompile'; + +moduleForComponent('cms/cm/data/search/ci-history-details', 'Integration | Component | cms/cm/data/search/ci history details', { + integration: true +}); + +test('it renders', function(assert) { + + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.on('myAction', function(val) { ... });" + EOL + EOL + + + this.render(hbs`{{cms/cm/data/search/ci-history-details}}`); + + assert.equal(this.$().text().trim(), ''); + + // Template block usage:" + EOL + + this.render(hbs` + {{#cms/cm/data/search/ci-history-details}} + template block text + {{/cms/cm/data/search/ci-history-details}} + `); + + assert.equal(this.$().text().trim(), 'template block text'); +}); diff --git a/uam-web/tests/integration/components/cms/cm/data/search/ci-history/component-test.js b/uam-web/tests/integration/components/cms/cm/data/search/ci-history/component-test.js new file mode 100644 index 0000000000000000000000000000000000000000..1d129b8a4823821bbcf5db4a3399688d031e3899 --- /dev/null +++ b/uam-web/tests/integration/components/cms/cm/data/search/ci-history/component-test.js @@ -0,0 +1,25 @@ +import { moduleForComponent, test } from 'ember-qunit'; +import hbs from 'htmlbars-inline-precompile'; + +moduleForComponent('cms/cm/data/search/ci-history', 'Integration | Component | cms/cm/data/search/ci history', { + integration: true +}); + +test('it renders', function(assert) { + + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.on('myAction', function(val) { ... });" + EOL + EOL + + + this.render(hbs`{{cms/cm/data/search/ci-history}}`); + + assert.equal(this.$().text().trim(), ''); + + // Template block usage:" + EOL + + this.render(hbs` + {{#cms/cm/data/search/ci-history}} + template block text + {{/cms/cm/data/search/ci-history}} + `); + + assert.equal(this.$().text().trim(), 'template block text'); +}); diff --git a/uam-web/tests/integration/components/cms/cm/data/search/ci-rel-table/component-test.js b/uam-web/tests/integration/components/cms/cm/data/search/ci-rel-table/component-test.js new file mode 100644 index 0000000000000000000000000000000000000000..e22ca4586802be92b96079852b89be97c69a2dab --- /dev/null +++ b/uam-web/tests/integration/components/cms/cm/data/search/ci-rel-table/component-test.js @@ -0,0 +1,25 @@ +import { moduleForComponent, test } from 'ember-qunit'; +import hbs from 'htmlbars-inline-precompile'; + +moduleForComponent('cms/cm/data/search/ci-rel-table', 'Integration | Component | cms/cm/data/search/ci rel table', { + integration: true +}); + +test('it renders', function(assert) { + + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.on('myAction', function(val) { ... });" + EOL + EOL + + + this.render(hbs`{{cms/cm/data/search/ci-rel-table}}`); + + assert.equal(this.$().text().trim(), ''); + + // Template block usage:" + EOL + + this.render(hbs` + {{#cms/cm/data/search/ci-rel-table}} + template block text + {{/cms/cm/data/search/ci-rel-table}} + `); + + assert.equal(this.$().text().trim(), 'template block text'); +}); diff --git a/uam-web/tests/integration/components/cms/cm/data/search/ci-rel/component-test.js b/uam-web/tests/integration/components/cms/cm/data/search/ci-rel/component-test.js new file mode 100644 index 0000000000000000000000000000000000000000..de48d5a69c693b5186128194f741f83789e80d1f --- /dev/null +++ b/uam-web/tests/integration/components/cms/cm/data/search/ci-rel/component-test.js @@ -0,0 +1,25 @@ +import { moduleForComponent, test } from 'ember-qunit'; +import hbs from 'htmlbars-inline-precompile'; + +moduleForComponent('cms/cm/data/search/ci-rel', 'Integration | Component | cms/cm/data/search/ci rel', { + integration: true +}); + +test('it renders', function(assert) { + + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.on('myAction', function(val) { ... });" + EOL + EOL + + + this.render(hbs`{{cms/cm/data/search/ci-rel}}`); + + assert.equal(this.$().text().trim(), ''); + + // Template block usage:" + EOL + + this.render(hbs` + {{#cms/cm/data/search/ci-rel}} + template block text + {{/cms/cm/data/search/ci-rel}} + `); + + assert.equal(this.$().text().trim(), 'template block text'); +}); diff --git a/uam-web/tests/integration/components/cms/cm/data/search/download-delete/component-test.js b/uam-web/tests/integration/components/cms/cm/data/search/download-delete/component-test.js new file mode 100644 index 0000000000000000000000000000000000000000..c71696fc131e2766bc295b436669955c5cb68539 --- /dev/null +++ b/uam-web/tests/integration/components/cms/cm/data/search/download-delete/component-test.js @@ -0,0 +1,25 @@ +import { moduleForComponent, test } from 'ember-qunit'; +import hbs from 'htmlbars-inline-precompile'; + +moduleForComponent('cms/cm/data/search/download-delete', 'Integration | Component | cms/cm/data/search/download delete', { + integration: true +}); + +test('it renders', function(assert) { + + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.on('myAction', function(val) { ... });" + EOL + EOL + + + this.render(hbs`{{cms/cm/data/search/download-delete}}`); + + assert.equal(this.$().text().trim(), ''); + + // Template block usage:" + EOL + + this.render(hbs` + {{#cms/cm/data/search/download-delete}} + template block text + {{/cms/cm/data/search/download-delete}} + `); + + assert.equal(this.$().text().trim(), 'template block text'); +}); diff --git a/uam-web/tests/integration/components/cms/cm/data/search/download-file/component-test.js b/uam-web/tests/integration/components/cms/cm/data/search/download-file/component-test.js new file mode 100644 index 0000000000000000000000000000000000000000..9982c44419281979d33328f2470b2996f0a79663 --- /dev/null +++ b/uam-web/tests/integration/components/cms/cm/data/search/download-file/component-test.js @@ -0,0 +1,25 @@ +import { moduleForComponent, test } from 'ember-qunit'; +import hbs from 'htmlbars-inline-precompile'; + +moduleForComponent('cms/cm/data/search/download-file', 'Integration | Component | cms/cm/data/search/download file', { + integration: true +}); + +test('it renders', function(assert) { + + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.on('myAction', function(val) { ... });" + EOL + EOL + + + this.render(hbs`{{cms/cm/data/search/download-file}}`); + + assert.equal(this.$().text().trim(), ''); + + // Template block usage:" + EOL + + this.render(hbs` + {{#cms/cm/data/search/download-file}} + template block text + {{/cms/cm/data/search/download-file}} + `); + + assert.equal(this.$().text().trim(), 'template block text'); +}); diff --git a/uam-web/tests/integration/components/cms/cm/modeling/file-upload/component-test.js b/uam-web/tests/integration/components/cms/cm/modeling/file-upload/component-test.js new file mode 100644 index 0000000000000000000000000000000000000000..90a6f111fe13cfcb813a02ae2dcb7911ca87bf4d --- /dev/null +++ b/uam-web/tests/integration/components/cms/cm/modeling/file-upload/component-test.js @@ -0,0 +1,25 @@ +import { moduleForComponent, test } from 'ember-qunit'; +import hbs from 'htmlbars-inline-precompile'; + +moduleForComponent('cms/cm/modeling/file-upload', 'Integration | Component | cms/cm/modeling/file upload', { + integration: true +}); + +test('it renders', function(assert) { + + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.on('myAction', function(val) { ... });" + EOL + EOL + + + this.render(hbs`{{cms/cm/modeling/file-upload}}`); + + assert.equal(this.$().text().trim(), ''); + + // Template block usage:" + EOL + + this.render(hbs` + {{#cms/cm/modeling/file-upload}} + template block text + {{/cms/cm/modeling/file-upload}} + `); + + assert.equal(this.$().text().trim(), 'template block text'); +}); diff --git a/uam-web/tests/integration/components/io-dynamic-form/component-test.js b/uam-web/tests/integration/components/io-dynamic-form/component-test.js new file mode 100644 index 0000000000000000000000000000000000000000..0fe86ee02f2e42c20e3d184edcd9704bd7b6f671 --- /dev/null +++ b/uam-web/tests/integration/components/io-dynamic-form/component-test.js @@ -0,0 +1,25 @@ +import { moduleForComponent, test } from 'ember-qunit'; +import hbs from 'htmlbars-inline-precompile'; + +moduleForComponent('io-dynamic-form', 'Integration | Component | io dynamic form', { + integration: true +}); + +test('it renders', function(assert) { + + // Set any properties with this.set('myProperty', 'value'); + // Handle any actions with this.on('myAction', function(val) { ... });" + EOL + EOL + + + this.render(hbs`{{io-dynamic-form}}`); + + assert.equal(this.$().text().trim(), ''); + + // Template block usage:" + EOL + + this.render(hbs` + {{#io-dynamic-form}} + template block text + {{/io-dynamic-form}} + `); + + assert.equal(this.$().text().trim(), 'template block text'); +}); diff --git a/uam-web/tests/test-helper.js b/uam-web/tests/test-helper.js new file mode 100644 index 0000000000000000000000000000000000000000..e6cfb70fe806b564111203f2f0a97b41bc43a608 --- /dev/null +++ b/uam-web/tests/test-helper.js @@ -0,0 +1,6 @@ +import resolver from './helpers/resolver'; +import { + setResolver +} from 'ember-qunit'; + +setResolver(resolver); diff --git a/uam-web/tests/unit/.gitkeep b/uam-web/tests/unit/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/uam-web/tests/unit/cms/cm/data/input/ci/edit/controller-test.js b/uam-web/tests/unit/cms/cm/data/input/ci/edit/controller-test.js new file mode 100644 index 0000000000000000000000000000000000000000..bcaebea3eb17ad9ed0ece25ce427b9c395df8cc4 --- /dev/null +++ b/uam-web/tests/unit/cms/cm/data/input/ci/edit/controller-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:cms/cm/data/input/ci/edit', 'Unit | Controller | cms/cm/data/input/ci/edit', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/uam-web/tests/unit/cms/cm/data/input/ci/edit/route-test.js b/uam-web/tests/unit/cms/cm/data/input/ci/edit/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..063e25af31edf42c382f849c89c3abccc9250cd8 --- /dev/null +++ b/uam-web/tests/unit/cms/cm/data/input/ci/edit/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:cms/cm/data/input/ci/edit', 'Unit | Route | cms/cm/data/input/ci/edit', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/cms/cm/data/input/ci/index/controller-test.js b/uam-web/tests/unit/cms/cm/data/input/ci/index/controller-test.js new file mode 100644 index 0000000000000000000000000000000000000000..5dd809277ec6a319d13dd83ed41042dc0d3d6eaa --- /dev/null +++ b/uam-web/tests/unit/cms/cm/data/input/ci/index/controller-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:cms/cm/data/input/ci/index', 'Unit | Controller | cms/cm/data/input/ci/index', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/uam-web/tests/unit/cms/cm/data/input/ci/index/route-test.js b/uam-web/tests/unit/cms/cm/data/input/ci/index/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..46dbcd7b27dc21cb61f01adcd9a42183ebb66d25 --- /dev/null +++ b/uam-web/tests/unit/cms/cm/data/input/ci/index/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:cms/cm/data/input/ci/index', 'Unit | Route | cms/cm/data/input/ci/index', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/cms/cm/data/input/ci/route-test.js b/uam-web/tests/unit/cms/cm/data/input/ci/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..a8e134719983715b04fb2e7d3b0db8728a1336de --- /dev/null +++ b/uam-web/tests/unit/cms/cm/data/input/ci/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:cms/cm/data/input/ci', 'Unit | Route | cms/cm/data/input/ci', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/cms/cm/data/input/ci/upload/controller-test.js b/uam-web/tests/unit/cms/cm/data/input/ci/upload/controller-test.js new file mode 100644 index 0000000000000000000000000000000000000000..7ead2b6c3c239eb5ffe8c842d65dfdcb57a9e6bd --- /dev/null +++ b/uam-web/tests/unit/cms/cm/data/input/ci/upload/controller-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:cms/cm/data/input/ci/upload', 'Unit | Controller | cms/cm/data/input/ci/upload', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/uam-web/tests/unit/cms/cm/data/input/ci/upload/route-test.js b/uam-web/tests/unit/cms/cm/data/input/ci/upload/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..34c5b70141a18bee7d4ffdc4deb64ced44515b2a --- /dev/null +++ b/uam-web/tests/unit/cms/cm/data/input/ci/upload/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:cms/cm/data/input/ci/upload', 'Unit | Route | cms/cm/data/input/ci/upload', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/cms/cm/data/input/controller-test.js b/uam-web/tests/unit/cms/cm/data/input/controller-test.js new file mode 100644 index 0000000000000000000000000000000000000000..21e2da850f97fc894313b016af7714aa049c2869 --- /dev/null +++ b/uam-web/tests/unit/cms/cm/data/input/controller-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:cms/cm/data/input', 'Unit | Controller | cms/cm/data/input', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/uam-web/tests/unit/cms/cm/data/input/rel/controller-test.js b/uam-web/tests/unit/cms/cm/data/input/rel/controller-test.js new file mode 100644 index 0000000000000000000000000000000000000000..6d381cdb04d0e7e5bfb33993f34c288f84767076 --- /dev/null +++ b/uam-web/tests/unit/cms/cm/data/input/rel/controller-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:cms/cm/data/input/rel', 'Unit | Controller | cms/cm/data/input/rel', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/uam-web/tests/unit/cms/cm/data/input/rel/edit/controller-test.js b/uam-web/tests/unit/cms/cm/data/input/rel/edit/controller-test.js new file mode 100644 index 0000000000000000000000000000000000000000..a504fc41b3282f23717969371f48866aea0bb818 --- /dev/null +++ b/uam-web/tests/unit/cms/cm/data/input/rel/edit/controller-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:cms/cm/data/input/rel/edit', 'Unit | Controller | cms/cm/data/input/rel/edit', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/uam-web/tests/unit/cms/cm/data/input/rel/edit/route-test.js b/uam-web/tests/unit/cms/cm/data/input/rel/edit/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..ab963a5ef2bc6406e52542f7f46044b75ac1d3f2 --- /dev/null +++ b/uam-web/tests/unit/cms/cm/data/input/rel/edit/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:cms/cm/data/input/rel/edit', 'Unit | Route | cms/cm/data/input/rel/edit', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/cms/cm/data/input/rel/route-test.js b/uam-web/tests/unit/cms/cm/data/input/rel/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..95de7f675a59ebdc758745ec3930a9bb88a96afa --- /dev/null +++ b/uam-web/tests/unit/cms/cm/data/input/rel/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:cms/cm/data/input/rel', 'Unit | Route | cms/cm/data/input/rel', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/cms/cm/data/input/route-test.js b/uam-web/tests/unit/cms/cm/data/input/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..be28e795409e43ee9b7034158daa9f6e391efe70 --- /dev/null +++ b/uam-web/tests/unit/cms/cm/data/input/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:cms/cm/data/input', 'Unit | Route | cms/cm/data/input', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/cms/cm/data/route-test.js b/uam-web/tests/unit/cms/cm/data/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..d9dad8922f14a2d6ad794bc274b79a7ddc32f8a0 --- /dev/null +++ b/uam-web/tests/unit/cms/cm/data/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:cms/cm/data', 'Unit | Route | cms/cm/data', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/cms/cm/data/search/category/ci/route-test.js b/uam-web/tests/unit/cms/cm/data/search/category/ci/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..15bb8752f11b82688349673c796ccd988d198af8 --- /dev/null +++ b/uam-web/tests/unit/cms/cm/data/search/category/ci/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:cms/cm/data/search/category/ci', 'Unit | Route | cms/cm/data/search/category/ci', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/cms/cm/data/search/category/rel/route-test.js b/uam-web/tests/unit/cms/cm/data/search/category/rel/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..8922a90af367c0133e282376ea28eb053255becf --- /dev/null +++ b/uam-web/tests/unit/cms/cm/data/search/category/rel/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:cms/cm/data/search/category/rel', 'Unit | Route | cms/cm/data/search/category/rel', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/cms/cm/data/search/category/route-test.js b/uam-web/tests/unit/cms/cm/data/search/category/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..15cc09f5fa13edecab766f83df957fe438a6d018 --- /dev/null +++ b/uam-web/tests/unit/cms/cm/data/search/category/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:cms/cm/data/search/category', 'Unit | Route | cms/cm/data/search/category', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/cms/cm/data/search/ci/route-test.js b/uam-web/tests/unit/cms/cm/data/search/ci/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..67eb50ff4d3b372ec8bd71d3f4d7b0283f00307e --- /dev/null +++ b/uam-web/tests/unit/cms/cm/data/search/ci/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:cms/cm/data/search/ci', 'Unit | Route | cms/cm/data/search/ci', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/cms/cm/data/search/route-test.js b/uam-web/tests/unit/cms/cm/data/search/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..47cd93bb1c8e875d88bd943718bdf4a98a26183e --- /dev/null +++ b/uam-web/tests/unit/cms/cm/data/search/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:cms/cm/data/search', 'Unit | Route | cms/cm/data/search', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/cms/cm/modeling/ci/route-test.js b/uam-web/tests/unit/cms/cm/modeling/ci/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..d81ed076af8d552a400d98496709495f705049fb --- /dev/null +++ b/uam-web/tests/unit/cms/cm/modeling/ci/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:cms/cm/modeling/ci', 'Unit | Route | cms/cm/modeling/ci', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/cms/cm/modeling/rel/route-test.js b/uam-web/tests/unit/cms/cm/modeling/rel/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..df866d3d2c4319181d74acbdd2bf25c8866493f2 --- /dev/null +++ b/uam-web/tests/unit/cms/cm/modeling/rel/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:cms/cm/modeling/rel', 'Unit | Route | cms/cm/modeling/rel', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/cms/cm/modeling/route-test.js b/uam-web/tests/unit/cms/cm/modeling/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..5b18fd66ffcf3ab058e1d6eebc15393698e32e33 --- /dev/null +++ b/uam-web/tests/unit/cms/cm/modeling/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:cms/cm/modeling', 'Unit | Route | cms/cm/modeling', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/cms/cm/png/folder/info/controller-test.js b/uam-web/tests/unit/cms/cm/png/folder/info/controller-test.js new file mode 100644 index 0000000000000000000000000000000000000000..2662d3c26ec6e92d5437ab265309c4fddfff0d5f --- /dev/null +++ b/uam-web/tests/unit/cms/cm/png/folder/info/controller-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:cms/cm/png/folder/info', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + var controller = this.subject(); + assert.ok(controller); +}); diff --git a/uam-web/tests/unit/cms/cm/png/folder/info/route-test.js b/uam-web/tests/unit/cms/cm/png/folder/info/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..b7f8ef9bac565d2f68ed9050fbdb42c08f6f2612 --- /dev/null +++ b/uam-web/tests/unit/cms/cm/png/folder/info/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:cms/cm/png/folder/info', 'Unit | Route | cms/cm/png/folder/info', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + var route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/cms/cm/png/folder/route-test.js b/uam-web/tests/unit/cms/cm/png/folder/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..50f0d7d2340136f57650059856b5c88bb1e02b58 --- /dev/null +++ b/uam-web/tests/unit/cms/cm/png/folder/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:cms/cm/png/folder', 'Unit | Route | cms/cm/png/folder', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + var route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/cms/cm/png/info/controller-test.js b/uam-web/tests/unit/cms/cm/png/info/controller-test.js new file mode 100644 index 0000000000000000000000000000000000000000..b8a5f233925c6d57a7d7c01d456168dc5c43284d --- /dev/null +++ b/uam-web/tests/unit/cms/cm/png/info/controller-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:cms/cm/png/info', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + var controller = this.subject(); + assert.ok(controller); +}); diff --git a/uam-web/tests/unit/cms/cm/png/info/route-test.js b/uam-web/tests/unit/cms/cm/png/info/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..142a234068cc6d0c11d610c5f7024abb26ff3659 --- /dev/null +++ b/uam-web/tests/unit/cms/cm/png/info/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:cms/cm/png/info', 'Unit | Route | cms/cm/png/info', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/cms/cm/png/route-test.js b/uam-web/tests/unit/cms/cm/png/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..e35343517e993d3cc1dd3216d8c372d944c6b07b --- /dev/null +++ b/uam-web/tests/unit/cms/cm/png/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:cms/cm/png', 'Unit | Route | cms/cm/png', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + var route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/cms/cm/route-test.js b/uam-web/tests/unit/cms/cm/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..7517e0e54ca086dc310b5db56a5ea40772142db9 --- /dev/null +++ b/uam-web/tests/unit/cms/cm/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:cms/cm', 'Unit | Route | cms/cm', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/cms/route-test.js b/uam-web/tests/unit/cms/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..715963a4400799470858b3f027f6fcdd4550231c --- /dev/null +++ b/uam-web/tests/unit/cms/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:cms', 'Unit | Route | cms', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/cms/setting/table-config/controller-test.js b/uam-web/tests/unit/cms/setting/table-config/controller-test.js new file mode 100644 index 0000000000000000000000000000000000000000..094ee994d627308f32f75cc46bef7208a9333eb3 --- /dev/null +++ b/uam-web/tests/unit/cms/setting/table-config/controller-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:cms/setting/table-config', 'Unit | Controller | cms/setting/table config', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/uam-web/tests/unit/cms/setting/table-config/edit/controller-test.js b/uam-web/tests/unit/cms/setting/table-config/edit/controller-test.js new file mode 100644 index 0000000000000000000000000000000000000000..dec45f4dd199c91793e11ce44b8c0863632b633e --- /dev/null +++ b/uam-web/tests/unit/cms/setting/table-config/edit/controller-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:cms/setting/table-config/edit', 'Unit | Controller | cms/setting/table config/edit', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/uam-web/tests/unit/cms/setting/table-config/edit/route-test.js b/uam-web/tests/unit/cms/setting/table-config/edit/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..640ba1d520d61874dd0f97956a7e7ebeb9b77ce7 --- /dev/null +++ b/uam-web/tests/unit/cms/setting/table-config/edit/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:cms/setting/table-config/edit', 'Unit | Route | cms/setting/table config/edit', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/cms/setting/table-config/info/controller-test.js b/uam-web/tests/unit/cms/setting/table-config/info/controller-test.js new file mode 100644 index 0000000000000000000000000000000000000000..d7cba4438ef492de214481ee4b6314e7c2b34951 --- /dev/null +++ b/uam-web/tests/unit/cms/setting/table-config/info/controller-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:cms/setting/table-config/info', 'Unit | Controller | cms/setting/table config/info', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/uam-web/tests/unit/cms/setting/table-config/info/route-test.js b/uam-web/tests/unit/cms/setting/table-config/info/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..f0c38fd374329325826e9fd501b7f73e02beadcf --- /dev/null +++ b/uam-web/tests/unit/cms/setting/table-config/info/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:cms/setting/table-config/info', 'Unit | Route | cms/setting/table config/info', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/cms/setting/table-config/route-test.js b/uam-web/tests/unit/cms/setting/table-config/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..462c5613238e228e4cdab485a2e89c39b1e12263 --- /dev/null +++ b/uam-web/tests/unit/cms/setting/table-config/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:cms/setting/table-config', 'Unit | Route | cms/setting/table config', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/dashboard/portal-management/permission/index/controller-test.js b/uam-web/tests/unit/dashboard/portal-management/permission/index/controller-test.js new file mode 100644 index 0000000000000000000000000000000000000000..2261f9a66a7dc9fcf0ed6520c83f86e4c8b671c8 --- /dev/null +++ b/uam-web/tests/unit/dashboard/portal-management/permission/index/controller-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:/dashboard/portal-management/permission/index', 'Unit | Controller | /dashboard/portal management/permission/index', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/uam-web/tests/unit/dashboard/portal-management/permission/index/route-test.js b/uam-web/tests/unit/dashboard/portal-management/permission/index/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..17b0172eaf1655c8702ba364675cc663a55ce3b7 --- /dev/null +++ b/uam-web/tests/unit/dashboard/portal-management/permission/index/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:/dashboard/portal-management/permission/index', 'Unit | Route | /dashboard/portal management/permission/index', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/dashboard/portal-management/permission/reverse/controller-test.js b/uam-web/tests/unit/dashboard/portal-management/permission/reverse/controller-test.js new file mode 100644 index 0000000000000000000000000000000000000000..398f5cc9e7204f2368cfa6e9c5bfb59732ed55db --- /dev/null +++ b/uam-web/tests/unit/dashboard/portal-management/permission/reverse/controller-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:/dashboard/portal-management/permission/reverse', 'Unit | Controller | /dashboard/portal management/permission/reverse', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/uam-web/tests/unit/dashboard/portal-management/permission/reverse/route-test.js b/uam-web/tests/unit/dashboard/portal-management/permission/reverse/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..be4ae0ac45eac3df49f18a53e65482b0604cdb9f --- /dev/null +++ b/uam-web/tests/unit/dashboard/portal-management/permission/reverse/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:/dashboard/portal-management/permission/reverse', 'Unit | Route | /dashboard/portal management/permission/reverse', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/dashboard/portal-management/resource/operate/route-test.js b/uam-web/tests/unit/dashboard/portal-management/resource/operate/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..84b19355cbd45673909b14960b93ad45502192e5 --- /dev/null +++ b/uam-web/tests/unit/dashboard/portal-management/resource/operate/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:dashboard/portal-management/resource/operate', 'Unit | Route | dashboard/portal management/resource/operate', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/dashboard/portal-management/resource/route-test.js b/uam-web/tests/unit/dashboard/portal-management/resource/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..9a2680314ebe4682346b3bad2a76e3700b01fc27 --- /dev/null +++ b/uam-web/tests/unit/dashboard/portal-management/resource/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:dashboard/portal-management/resource', 'Unit | Route | dashboard/portal management/resource', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/dashboard/portal-management/resource/view/controller-test.js b/uam-web/tests/unit/dashboard/portal-management/resource/view/controller-test.js new file mode 100644 index 0000000000000000000000000000000000000000..eafb389be710d3225e96ce9df7cc0ad29d8c32b5 --- /dev/null +++ b/uam-web/tests/unit/dashboard/portal-management/resource/view/controller-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:dashboard/portal-management/resource/view', 'Unit | Controller | dashboard/portal management/resource/view', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/uam-web/tests/unit/dashboard/portal-management/resource/view/route-test.js b/uam-web/tests/unit/dashboard/portal-management/resource/view/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..e3862e2041c3f4fd8d23df0266b90b4d68702020 --- /dev/null +++ b/uam-web/tests/unit/dashboard/portal-management/resource/view/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:dashboard/portal-management/resource/view', 'Unit | Route | dashboard/portal management/resource/view', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/dashboard/portal-management/role/view/controller-test.js b/uam-web/tests/unit/dashboard/portal-management/role/view/controller-test.js new file mode 100644 index 0000000000000000000000000000000000000000..3a4534227248b659c68f29d9736894015a1c0e66 --- /dev/null +++ b/uam-web/tests/unit/dashboard/portal-management/role/view/controller-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:dashboard/portal-management/role/view', 'Unit | Controller | dashboard/portal management/role/view', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/uam-web/tests/unit/dashboard/portal-management/role/view/route-test.js b/uam-web/tests/unit/dashboard/portal-management/role/view/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..0e10d0a962f41daf41f610fa4a1259082b2d1c10 --- /dev/null +++ b/uam-web/tests/unit/dashboard/portal-management/role/view/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:dashboard/portal-management/role/view', 'Unit | Route | dashboard/portal management/role/view', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/dashboard/portal-management/user-group/view/controller-test.js b/uam-web/tests/unit/dashboard/portal-management/user-group/view/controller-test.js new file mode 100644 index 0000000000000000000000000000000000000000..19fb4a907453635b1eea91803e3d02915fff5b34 --- /dev/null +++ b/uam-web/tests/unit/dashboard/portal-management/user-group/view/controller-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:dashboard/portal-management/user-group/view', 'Unit | Controller | dashboard/portal management/user group/view', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/uam-web/tests/unit/dashboard/portal-management/user-group/view/route-test.js b/uam-web/tests/unit/dashboard/portal-management/user-group/view/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..b97cef99f679bf9b39856651700b93640a9cbe5e --- /dev/null +++ b/uam-web/tests/unit/dashboard/portal-management/user-group/view/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:dashboard/portal-management/user-group/view', 'Unit | Route | dashboard/portal management/user group/view', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/dashboard/portal-management/user/import-priview/controller-test.js b/uam-web/tests/unit/dashboard/portal-management/user/import-priview/controller-test.js new file mode 100644 index 0000000000000000000000000000000000000000..52eeed08ab09243359af01281ab9dba95f9f72ed --- /dev/null +++ b/uam-web/tests/unit/dashboard/portal-management/user/import-priview/controller-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:dashboard/portal-management/user/import-priview', 'Unit | Controller | dashboard/portal management/user/import priview', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/uam-web/tests/unit/dashboard/portal-management/user/import-priview/route-test.js b/uam-web/tests/unit/dashboard/portal-management/user/import-priview/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..53f6bc986c96b158a96d7307c20b5c01672e110f --- /dev/null +++ b/uam-web/tests/unit/dashboard/portal-management/user/import-priview/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:dashboard/portal-management/user/import-priview', 'Unit | Route | dashboard/portal management/user/import priview', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/dashboard/portal-management/user/import/controller-test.js b/uam-web/tests/unit/dashboard/portal-management/user/import/controller-test.js new file mode 100644 index 0000000000000000000000000000000000000000..e8ca696d3f79814564dc431a85fe35122cc626fd --- /dev/null +++ b/uam-web/tests/unit/dashboard/portal-management/user/import/controller-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:dashboard/portal-management/user/import', 'Unit | Controller | dashboard/portal management/user/import', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/uam-web/tests/unit/dashboard/portal-management/user/import/route-test.js b/uam-web/tests/unit/dashboard/portal-management/user/import/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..ae7b05e98e91da771bf2584462b7b66526fe3d5e --- /dev/null +++ b/uam-web/tests/unit/dashboard/portal-management/user/import/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:dashboard/portal-management/user/import', 'Unit | Route | dashboard/portal management/user/import', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/dashboard/portal-management/user/preview/controller-test.js b/uam-web/tests/unit/dashboard/portal-management/user/preview/controller-test.js new file mode 100644 index 0000000000000000000000000000000000000000..7f9448999c074f332c47fec209a4827b69915df0 --- /dev/null +++ b/uam-web/tests/unit/dashboard/portal-management/user/preview/controller-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:dashboard/portal-management/user/preview', 'Unit | Controller | dashboard/portal management/user/preview', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/uam-web/tests/unit/dashboard/portal-management/user/preview/route-test.js b/uam-web/tests/unit/dashboard/portal-management/user/preview/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..ff2587c42a567266f885adcfb29eb74d2d25c3e3 --- /dev/null +++ b/uam-web/tests/unit/dashboard/portal-management/user/preview/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:dashboard/portal-management/user/preview', 'Unit | Route | dashboard/portal management/user/preview', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/dashboard/portal-management/user/view/controller-test.js b/uam-web/tests/unit/dashboard/portal-management/user/view/controller-test.js new file mode 100644 index 0000000000000000000000000000000000000000..278ca40b91a92305dd585abf57be35b12de19639 --- /dev/null +++ b/uam-web/tests/unit/dashboard/portal-management/user/view/controller-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:/dashboard/portal-management/user/view', 'Unit | Controller | /dashboard/portal management/user/view', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let controller = this.subject(); + assert.ok(controller); +}); diff --git a/uam-web/tests/unit/dashboard/portal-management/user/view/route-test.js b/uam-web/tests/unit/dashboard/portal-management/user/view/route-test.js new file mode 100644 index 0000000000000000000000000000000000000000..a3625758dcc894d1124055f3c2ac0809ea4f65fc --- /dev/null +++ b/uam-web/tests/unit/dashboard/portal-management/user/view/route-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:/dashboard/portal-management/user/view', 'Unit | Route | /dashboard/portal management/user/view', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + let route = this.subject(); + assert.ok(route); +}); diff --git a/uam-web/tests/unit/helpers/boolean-data-type-test.js b/uam-web/tests/unit/helpers/boolean-data-type-test.js new file mode 100644 index 0000000000000000000000000000000000000000..725da7c561bc2eaafa9be3e8efe4ecd88cccdb6b --- /dev/null +++ b/uam-web/tests/unit/helpers/boolean-data-type-test.js @@ -0,0 +1,10 @@ +import { booleanDataType } from '../../../helpers/boolean-data-type'; +import { module, test } from 'qunit'; + +module('Unit | Helper | boolean data type'); + +// Replace this with your real tests. +test('it works', function(assert) { + let result = booleanDataType(42); + assert.ok(result); +}); diff --git a/uam-web/tests/unit/helpers/ci-attr-data-type-test.js b/uam-web/tests/unit/helpers/ci-attr-data-type-test.js new file mode 100644 index 0000000000000000000000000000000000000000..e1fb64870afdc51a6ea8c92ab671bbec94ca35f3 --- /dev/null +++ b/uam-web/tests/unit/helpers/ci-attr-data-type-test.js @@ -0,0 +1,10 @@ +import { ciAttrDataType } from '../../../helpers/ci-attr-data-type'; +import { module, test } from 'qunit'; + +module('Unit | Helper | ci attr data type'); + +// Replace this with your real tests. +test('it works', function(assert) { + let result = ciAttrDataType(42); + assert.ok(result); +}); diff --git a/uam-web/tests/unit/helpers/io-date-format-test.js b/uam-web/tests/unit/helpers/io-date-format-test.js new file mode 100644 index 0000000000000000000000000000000000000000..56ea178dcbb634f84187ad72e5ffc4d6d3ed9273 --- /dev/null +++ b/uam-web/tests/unit/helpers/io-date-format-test.js @@ -0,0 +1,10 @@ +import { ioDateFormat } from '../../../helpers/io-date-format'; +import { module, test } from 'qunit'; + +module('Unit | Helper | io date format'); + +// Replace this with your real tests. +test('it works', function(assert) { + let result = ioDateFormat(42); + assert.ok(result); +}); diff --git a/uam-web/tests/unit/helpers/io-moment-test.js b/uam-web/tests/unit/helpers/io-moment-test.js new file mode 100644 index 0000000000000000000000000000000000000000..8ca446093ade76419b1217935d8b13ac59645a12 --- /dev/null +++ b/uam-web/tests/unit/helpers/io-moment-test.js @@ -0,0 +1,10 @@ +import { ioMoment } from '../../../helpers/io-moment'; +import { module, test } from 'qunit'; + +module('Unit | Helper | io moment'); + +// Replace this with your real tests. +test('it works', function(assert) { + let result = ioMoment(42); + assert.ok(result); +}); diff --git a/uam-web/tests/unit/services/api/ci-input/service-test.js b/uam-web/tests/unit/services/api/ci-input/service-test.js new file mode 100644 index 0000000000000000000000000000000000000000..dc5c6ed2a5df73e7db93d4a9164a4c56c6ab3bd8 --- /dev/null +++ b/uam-web/tests/unit/services/api/ci-input/service-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('service:services/api/ci-input', 'Unit | Service | services/api/ci input', { + // Specify the other units that are required for this test. + // needs: ['service:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let service = this.subject(); + assert.ok(service); +}); diff --git a/uam-web/tests/unit/services/ci-search/service-test.js b/uam-web/tests/unit/services/ci-search/service-test.js new file mode 100644 index 0000000000000000000000000000000000000000..19856078f48f4e75a3787e5918c42500b3377ff0 --- /dev/null +++ b/uam-web/tests/unit/services/ci-search/service-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('service:services/ci-search', 'Unit | Service | services/ci search', { + // Specify the other units that are required for this test. + // needs: ['service:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + let service = this.subject(); + assert.ok(service); +}); diff --git a/uam-web/vendor/.gitkeep b/uam-web/vendor/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391